diff --git a/Makefile b/Makefile new file mode 100644 index 0000000000..50f8e166b2 --- /dev/null +++ b/Makefile @@ -0,0 +1 @@ +include src/Makefile diff --git a/README.md b/README.md new file mode 100644 index 0000000000..caae27d2ae --- /dev/null +++ b/README.md @@ -0,0 +1,47 @@ +## *oclHashcat* ## + +**oclHashcat** is the world's fastest and most advanced GPGPU-based password recovery utility, supporting five unique modes of attack for over 170 highly-optimized hashing algorithms. oclHashcat currently supports AMD (OpenCL) and Nvidia (CUDA) graphics processors on GNU/Linux and Windows 7/8/10, and has facilities to help enable distributed password cracking. + +### License ### + +**oclHashcat** is licensed under the MIT license. Refer to [docs/license.txt](docs/license.txt) for more information. + +### Installation ### + +Download the [latest release](https://hashcat.net/oclhashcat/) and unpack it in the desired location. Please remember to use `7z x` when unpacking the archive from the command line to ensure full file paths remain intact. + +### Usage/Help ### + +Please refer to the [Hashcat Wiki](https://hashcat.net/wiki/) and the output of `--help` for usage information and general help. A list of frequently asked questions may also be found [here](https://hashcat.net/wiki/doku.php?id=frequently_asked_questions). The [Hashcat Forums](https://hashcat.net/forum/) also contain a plethora of information. + +### Building ### + +Refer to [docs/BUILD.md](docs/BUILD.md) for instructions on how to build **oclHashcat** from source. + +### Contributing ### + +Contributions are welcome and encouraged, provided your code is of sufficient quality. Before submitting a pull request, please ensure your code adheres to the following requirements: + +1. Licensed under MIT license, or dedicated to public domain (BSD, GPL, etc. code is incompatible) +2. Adheres to either C89, C90, or C99 standards +2. Compiles cleanly with no warnings when compiled with `-W -Wall -std=c99` +3. Uses [Allman-style](https://en.wikipedia.org/wiki/Indent_style#Allman_style) code blocks & indentation +4. Uses 2-character tabs and 2-character indentations +5. Uses lower-case function and variable names +6. Avoids the use of `!` and uses positive conditionals wherever possible (e.g., `if (foo == 0)` instead of `if (!foo)`, and `if (foo)` instead of `if (foo !=0)`) + +You can use GNU Indent to help assist you with the style requirements: + +``` +indent -st -bad -bap -sc -bl -bli0 -ncdw -nce -cli0 -cbi0 -pcs -cs -npsl -bs -nbc -bls -blf -lp -i2 -ts2 -nut -l1024 -nbbo -fca -lc1024 -fc1 +``` + +Your pull request should fully describe the functionality you are adding/removing or the problem you are solving. Regardless of whether your patch modifies one line or one thousand lines, you must describe what has prompted and/or motivated the change. + +Solve only one problem in each pull request. If you're fixing a bug and adding a new feature, you need to make two separate pull requests. If you're fixing three bugs, you need to make three separate pull requests. If you're adding four new features, you need to make four separate pull requests. So on, and so forth. + +If your patch fixes a bug, please be sure there is an [issue](https://github.com/hashcat/oclHashcat/issues) open for the bug before submitting a pull request. If your patch aims to improve performance or optimizes an algorithm, be sure to quantify your optimizations and document the trade-offs, and back up your claims with benchmarks and metrics. + +In order to maintain the quality and integrity of the **oclHashcat** source tree, all pull requests must be reviewed and signed off by at least two [board members](https://github.com/orgs/hashcat/people) before being merged. The [project lead](https://github.com/jsteube) has the ultimate authority in deciding whether to accept or reject a pull request. Do not be discouraged if your pull request is rejected! + +### Happy Cracking! diff --git a/amd/amp_a0_v1.cl b/amd/amp_a0_v1.cl new file mode 100644 index 0000000000..91044084b9 --- /dev/null +++ b/amd/amp_a0_v1.cl @@ -0,0 +1,52 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define VECT_SIZE1 + +#include "include/constants.h" +#include "include/kernel_vendor.h" +#include "types_amd.c" + +static u32 swap_workaround (const u32 v) +{ + return (as_uint (as_uchar4 (v).s3210)); +} + +#include "include/rp_gpu.h" +#include "rp_amd.c" + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) amp (__global pw_t *pws, __global pw_t *pws_amp, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, const u32 combs_mode, const u32 gid_max) +{ + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + const u32 pw_len = pws[gid].pw_len; + + u32x w0[4]; + u32x w1[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + const u32 out_len = apply_rules (rules_buf[0].cmds, w0, w1, pw_len); + + pws_amp[gid].i[0] = w0[0]; + pws_amp[gid].i[1] = w0[1]; + pws_amp[gid].i[2] = w0[2]; + pws_amp[gid].i[3] = w0[3]; + pws_amp[gid].i[4] = w1[0]; + pws_amp[gid].i[5] = w1[1]; + pws_amp[gid].i[6] = w1[2]; + pws_amp[gid].i[7] = w1[3]; + + pws_amp[gid].pw_len = out_len; +} diff --git a/amd/amp_a0_v2.cl b/amd/amp_a0_v2.cl new file mode 100644 index 0000000000..0343f816f1 --- /dev/null +++ b/amd/amp_a0_v2.cl @@ -0,0 +1,52 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define VECT_SIZE2 + +#include "include/constants.h" +#include "include/kernel_vendor.h" +#include "types_amd.c" + +static u32x swap_workaround (const u32x v) +{ + return (v << 24) + ((v & 0x0000FF00) << 8) + ((v & 0x00FF0000) >> 8) + (v >> 24); +} + +#include "include/rp_gpu.h" +#include "rp_amd.c" + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) amp (__global pw_t *pws, __global pw_t *pws_amp, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, const u32 combs_mode, const u32 gid_max) +{ + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + const u32 pw_len = pws[gid].pw_len; + + u32x w0[4]; + u32x w1[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + const u32 out_len = apply_rules (rules_buf[0].cmds, w0, w1, pw_len); + + pws_amp[gid].i[0] = w0[0]; + pws_amp[gid].i[1] = w0[1]; + pws_amp[gid].i[2] = w0[2]; + pws_amp[gid].i[3] = w0[3]; + pws_amp[gid].i[4] = w1[0]; + pws_amp[gid].i[5] = w1[1]; + pws_amp[gid].i[6] = w1[2]; + pws_amp[gid].i[7] = w1[3]; + + pws_amp[gid].pw_len = out_len; +} diff --git a/amd/amp_a0_v4.cl b/amd/amp_a0_v4.cl new file mode 100644 index 0000000000..d470f34d2d --- /dev/null +++ b/amd/amp_a0_v4.cl @@ -0,0 +1,52 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define VECT_SIZE4 + +#include "include/constants.h" +#include "include/kernel_vendor.h" +#include "types_amd.c" + +static u32x swap_workaround (const u32x v) +{ + return (v << 24) + ((v & 0x0000FF00) << 8) + ((v & 0x00FF0000) >> 8) + (v >> 24); +} + +#include "include/rp_gpu.h" +#include "rp_amd.c" + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) amp (__global pw_t *pws, __global pw_t *pws_amp, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, const u32 combs_mode, const u32 gid_max) +{ + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + const u32 pw_len = pws[gid].pw_len; + + u32x w0[4]; + u32x w1[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + const u32 out_len = apply_rules (rules_buf[0].cmds, w0, w1, pw_len); + + pws_amp[gid].i[0] = w0[0]; + pws_amp[gid].i[1] = w0[1]; + pws_amp[gid].i[2] = w0[2]; + pws_amp[gid].i[3] = w0[3]; + pws_amp[gid].i[4] = w1[0]; + pws_amp[gid].i[5] = w1[1]; + pws_amp[gid].i[6] = w1[2]; + pws_amp[gid].i[7] = w1[3]; + + pws_amp[gid].pw_len = out_len; +} diff --git a/amd/amp_a1_v1.cl b/amd/amp_a1_v1.cl new file mode 100644 index 0000000000..722cb754ce --- /dev/null +++ b/amd/amp_a1_v1.cl @@ -0,0 +1,587 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define VECT_SIZE1 + +#include "include/constants.h" +#include "include/kernel_vendor.h" +#include "types_amd.c" + +static void switch_buffer_by_offset (u32 w0[4], u32 w1[4], u32 w2[4], u32 w3[4], const u32 offset) +{ + const int offset_mod_4 = offset & 3; + + const int offset_minus_4 = 4 - offset; + + switch (offset / 4) + { + case 0: + w3[2] = amd_bytealign ( 0, w3[1], offset_minus_4); + w3[1] = amd_bytealign (w3[1], w3[0], offset_minus_4); + w3[0] = amd_bytealign (w3[0], w2[3], offset_minus_4); + w2[3] = amd_bytealign (w2[3], w2[2], offset_minus_4); + w2[2] = amd_bytealign (w2[2], w2[1], offset_minus_4); + w2[1] = amd_bytealign (w2[1], w2[0], offset_minus_4); + w2[0] = amd_bytealign (w2[0], w1[3], offset_minus_4); + w1[3] = amd_bytealign (w1[3], w1[2], offset_minus_4); + w1[2] = amd_bytealign (w1[2], w1[1], offset_minus_4); + w1[1] = amd_bytealign (w1[1], w1[0], offset_minus_4); + w1[0] = amd_bytealign (w1[0], w0[3], offset_minus_4); + w0[3] = amd_bytealign (w0[3], w0[2], offset_minus_4); + w0[2] = amd_bytealign (w0[2], w0[1], offset_minus_4); + w0[1] = amd_bytealign (w0[1], w0[0], offset_minus_4); + w0[0] = amd_bytealign (w0[0], 0, offset_minus_4); + + if (offset_mod_4 == 0) + { + w0[0] = w0[1]; + w0[1] = w0[2]; + w0[2] = w0[3]; + w0[3] = w1[0]; + w1[0] = w1[1]; + w1[1] = w1[2]; + w1[2] = w1[3]; + w1[3] = w2[0]; + w2[0] = w2[1]; + w2[1] = w2[2]; + w2[2] = w2[3]; + w2[3] = w3[0]; + w3[0] = w3[1]; + w3[1] = w3[2]; + w3[2] = 0; + } + + break; + + case 1: + w3[2] = amd_bytealign ( 0, w3[0], offset_minus_4); + w3[1] = amd_bytealign (w3[0], w2[3], offset_minus_4); + w3[0] = amd_bytealign (w2[3], w2[2], offset_minus_4); + w2[3] = amd_bytealign (w2[2], w2[1], offset_minus_4); + w2[2] = amd_bytealign (w2[1], w2[0], offset_minus_4); + w2[1] = amd_bytealign (w2[0], w1[3], offset_minus_4); + w2[0] = amd_bytealign (w1[3], w1[2], offset_minus_4); + w1[3] = amd_bytealign (w1[2], w1[1], offset_minus_4); + w1[2] = amd_bytealign (w1[1], w1[0], offset_minus_4); + w1[1] = amd_bytealign (w1[0], w0[3], offset_minus_4); + w1[0] = amd_bytealign (w0[3], w0[2], offset_minus_4); + w0[3] = amd_bytealign (w0[2], w0[1], offset_minus_4); + w0[2] = amd_bytealign (w0[1], w0[0], offset_minus_4); + w0[1] = amd_bytealign (w0[0], 0, offset_minus_4); + w0[0] = 0; + + if (offset_mod_4 == 0) + { + w0[1] = w0[2]; + w0[2] = w0[3]; + w0[3] = w1[0]; + w1[0] = w1[1]; + w1[1] = w1[2]; + w1[2] = w1[3]; + w1[3] = w2[0]; + w2[0] = w2[1]; + w2[1] = w2[2]; + w2[2] = w2[3]; + w2[3] = w3[0]; + w3[0] = w3[1]; + w3[1] = w3[2]; + w3[2] = 0; + } + + break; + + case 2: + w3[2] = amd_bytealign ( 0, w2[3], offset_minus_4); + w3[1] = amd_bytealign (w2[3], w2[2], offset_minus_4); + w3[0] = amd_bytealign (w2[2], w2[1], offset_minus_4); + w2[3] = amd_bytealign (w2[1], w2[0], offset_minus_4); + w2[2] = amd_bytealign (w2[0], w1[3], offset_minus_4); + w2[1] = amd_bytealign (w1[3], w1[2], offset_minus_4); + w2[0] = amd_bytealign (w1[2], w1[1], offset_minus_4); + w1[3] = amd_bytealign (w1[1], w1[0], offset_minus_4); + w1[2] = amd_bytealign (w1[0], w0[3], offset_minus_4); + w1[1] = amd_bytealign (w0[3], w0[2], offset_minus_4); + w1[0] = amd_bytealign (w0[2], w0[1], offset_minus_4); + w0[3] = amd_bytealign (w0[1], w0[0], offset_minus_4); + w0[2] = amd_bytealign (w0[0], 0, offset_minus_4); + w0[1] = 0; + w0[0] = 0; + + if (offset_mod_4 == 0) + { + w0[2] = w0[3]; + w0[3] = w1[0]; + w1[0] = w1[1]; + w1[1] = w1[2]; + w1[2] = w1[3]; + w1[3] = w2[0]; + w2[0] = w2[1]; + w2[1] = w2[2]; + w2[2] = w2[3]; + w2[3] = w3[0]; + w3[0] = w3[1]; + w3[1] = w3[2]; + w3[2] = 0; + } + + break; + + case 3: + w3[2] = amd_bytealign ( 0, w2[2], offset_minus_4); + w3[1] = amd_bytealign (w2[2], w2[1], offset_minus_4); + w3[0] = amd_bytealign (w2[1], w2[0], offset_minus_4); + w2[3] = amd_bytealign (w2[0], w1[3], offset_minus_4); + w2[2] = amd_bytealign (w1[3], w1[2], offset_minus_4); + w2[1] = amd_bytealign (w1[2], w1[1], offset_minus_4); + w2[0] = amd_bytealign (w1[1], w1[0], offset_minus_4); + w1[3] = amd_bytealign (w1[0], w0[3], offset_minus_4); + w1[2] = amd_bytealign (w0[3], w0[2], offset_minus_4); + w1[1] = amd_bytealign (w0[2], w0[1], offset_minus_4); + w1[0] = amd_bytealign (w0[1], w0[0], offset_minus_4); + w0[3] = amd_bytealign (w0[0], 0, offset_minus_4); + w0[2] = 0; + w0[1] = 0; + w0[0] = 0; + + if (offset_mod_4 == 0) + { + w0[3] = w1[0]; + w1[0] = w1[1]; + w1[1] = w1[2]; + w1[2] = w1[3]; + w1[3] = w2[0]; + w2[0] = w2[1]; + w2[1] = w2[2]; + w2[2] = w2[3]; + w2[3] = w3[0]; + w3[0] = w3[1]; + w3[1] = w3[2]; + w3[2] = 0; + } + + break; + + case 4: + w3[2] = amd_bytealign ( 0, w2[1], offset_minus_4); + w3[1] = amd_bytealign (w2[1], w2[0], offset_minus_4); + w3[0] = amd_bytealign (w2[0], w1[3], offset_minus_4); + w2[3] = amd_bytealign (w1[3], w1[2], offset_minus_4); + w2[2] = amd_bytealign (w1[2], w1[1], offset_minus_4); + w2[1] = amd_bytealign (w1[1], w1[0], offset_minus_4); + w2[0] = amd_bytealign (w1[0], w0[3], offset_minus_4); + w1[3] = amd_bytealign (w0[3], w0[2], offset_minus_4); + w1[2] = amd_bytealign (w0[2], w0[1], offset_minus_4); + w1[1] = amd_bytealign (w0[1], w0[0], offset_minus_4); + w1[0] = amd_bytealign (w0[0], 0, offset_minus_4); + w0[3] = 0; + w0[2] = 0; + w0[1] = 0; + w0[0] = 0; + + if (offset_mod_4 == 0) + { + w1[0] = w1[1]; + w1[1] = w1[2]; + w1[2] = w1[3]; + w1[3] = w2[0]; + w2[0] = w2[1]; + w2[1] = w2[2]; + w2[2] = w2[3]; + w2[3] = w3[0]; + w3[0] = w3[1]; + w3[1] = w3[2]; + w3[2] = 0; + } + + break; + + case 5: + w3[2] = amd_bytealign ( 0, w2[0], offset_minus_4); + w3[1] = amd_bytealign (w2[0], w1[3], offset_minus_4); + w3[0] = amd_bytealign (w1[3], w1[2], offset_minus_4); + w2[3] = amd_bytealign (w1[2], w1[1], offset_minus_4); + w2[2] = amd_bytealign (w1[1], w1[0], offset_minus_4); + w2[1] = amd_bytealign (w1[0], w0[3], offset_minus_4); + w2[0] = amd_bytealign (w0[3], w0[2], offset_minus_4); + w1[3] = amd_bytealign (w0[2], w0[1], offset_minus_4); + w1[2] = amd_bytealign (w0[1], w0[0], offset_minus_4); + w1[1] = amd_bytealign (w0[0], 0, offset_minus_4); + w1[0] = 0; + w0[3] = 0; + w0[2] = 0; + w0[1] = 0; + w0[0] = 0; + + if (offset_mod_4 == 0) + { + w1[1] = w1[2]; + w1[2] = w1[3]; + w1[3] = w2[0]; + w2[0] = w2[1]; + w2[1] = w2[2]; + w2[2] = w2[3]; + w2[3] = w3[0]; + w3[0] = w3[1]; + w3[1] = w3[2]; + w3[2] = 0; + } + + break; + + case 6: + w3[2] = amd_bytealign ( 0, w1[3], offset_minus_4); + w3[1] = amd_bytealign (w1[3], w1[2], offset_minus_4); + w3[0] = amd_bytealign (w1[2], w1[1], offset_minus_4); + w2[3] = amd_bytealign (w1[1], w1[0], offset_minus_4); + w2[2] = amd_bytealign (w1[0], w0[3], offset_minus_4); + w2[1] = amd_bytealign (w0[3], w0[2], offset_minus_4); + w2[0] = amd_bytealign (w0[2], w0[1], offset_minus_4); + w1[3] = amd_bytealign (w0[1], w0[0], offset_minus_4); + w1[2] = amd_bytealign (w0[0], 0, offset_minus_4); + w1[1] = 0; + w1[0] = 0; + w0[3] = 0; + w0[2] = 0; + w0[1] = 0; + w0[0] = 0; + + if (offset_mod_4 == 0) + { + w1[2] = w1[3]; + w1[3] = w2[0]; + w2[0] = w2[1]; + w2[1] = w2[2]; + w2[2] = w2[3]; + w2[3] = w3[0]; + w3[0] = w3[1]; + w3[1] = w3[2]; + w3[2] = 0; + } + + break; + + case 7: + w3[2] = amd_bytealign ( 0, w1[2], offset_minus_4); + w3[1] = amd_bytealign (w1[2], w1[1], offset_minus_4); + w3[0] = amd_bytealign (w1[1], w1[0], offset_minus_4); + w2[3] = amd_bytealign (w1[0], w0[3], offset_minus_4); + w2[2] = amd_bytealign (w0[3], w0[2], offset_minus_4); + w2[1] = amd_bytealign (w0[2], w0[1], offset_minus_4); + w2[0] = amd_bytealign (w0[1], w0[0], offset_minus_4); + w1[3] = amd_bytealign (w0[0], 0, offset_minus_4); + w1[2] = 0; + w1[1] = 0; + w1[0] = 0; + w0[3] = 0; + w0[2] = 0; + w0[1] = 0; + w0[0] = 0; + + if (offset_mod_4 == 0) + { + w1[3] = w2[0]; + w2[0] = w2[1]; + w2[1] = w2[2]; + w2[2] = w2[3]; + w2[3] = w3[0]; + w3[0] = w3[1]; + w3[1] = w3[2]; + w3[2] = 0; + } + + break; + + case 8: + w3[2] = amd_bytealign ( 0, w1[1], offset_minus_4); + w3[1] = amd_bytealign (w1[1], w1[0], offset_minus_4); + w3[0] = amd_bytealign (w1[0], w0[3], offset_minus_4); + w2[3] = amd_bytealign (w0[3], w0[2], offset_minus_4); + w2[2] = amd_bytealign (w0[2], w0[1], offset_minus_4); + w2[1] = amd_bytealign (w0[1], w0[0], offset_minus_4); + w2[0] = amd_bytealign (w0[0], 0, offset_minus_4); + w1[3] = 0; + w1[2] = 0; + w1[1] = 0; + w1[0] = 0; + w0[3] = 0; + w0[2] = 0; + w0[1] = 0; + w0[0] = 0; + + if (offset_mod_4 == 0) + { + w2[0] = w2[1]; + w2[1] = w2[2]; + w2[2] = w2[3]; + w2[3] = w3[0]; + w3[0] = w3[1]; + w3[1] = w3[2]; + w3[2] = 0; + } + + break; + + case 9: + w3[2] = amd_bytealign ( 0, w1[0], offset_minus_4); + w3[1] = amd_bytealign (w1[0], w0[3], offset_minus_4); + w3[0] = amd_bytealign (w0[3], w0[2], offset_minus_4); + w2[3] = amd_bytealign (w0[2], w0[1], offset_minus_4); + w2[2] = amd_bytealign (w0[1], w0[0], offset_minus_4); + w2[1] = amd_bytealign (w0[0], 0, offset_minus_4); + w2[0] = 0; + w1[3] = 0; + w1[2] = 0; + w1[1] = 0; + w1[0] = 0; + w0[3] = 0; + w0[2] = 0; + w0[1] = 0; + w0[0] = 0; + + if (offset_mod_4 == 0) + { + w2[1] = w2[2]; + w2[2] = w2[3]; + w2[3] = w3[0]; + w3[0] = w3[1]; + w3[1] = w3[2]; + w3[2] = 0; + } + + break; + + case 10: + w3[2] = amd_bytealign ( 0, w0[3], offset_minus_4); + w3[1] = amd_bytealign (w0[3], w0[2], offset_minus_4); + w3[0] = amd_bytealign (w0[2], w0[1], offset_minus_4); + w2[3] = amd_bytealign (w0[1], w0[0], offset_minus_4); + w2[2] = amd_bytealign (w0[0], 0, offset_minus_4); + w2[1] = 0; + w2[0] = 0; + w1[3] = 0; + w1[2] = 0; + w1[1] = 0; + w1[0] = 0; + w0[3] = 0; + w0[2] = 0; + w0[1] = 0; + w0[0] = 0; + + if (offset_mod_4 == 0) + { + w2[2] = w2[3]; + w2[3] = w3[0]; + w3[0] = w3[1]; + w3[1] = w3[2]; + w3[2] = 0; + } + + break; + + case 11: + w3[2] = amd_bytealign ( 0, w0[2], offset_minus_4); + w3[1] = amd_bytealign (w0[2], w0[1], offset_minus_4); + w3[0] = amd_bytealign (w0[1], w0[0], offset_minus_4); + w2[3] = amd_bytealign (w0[0], 0, offset_minus_4); + w2[2] = 0; + w2[1] = 0; + w2[0] = 0; + w1[3] = 0; + w1[2] = 0; + w1[1] = 0; + w1[0] = 0; + w0[3] = 0; + w0[2] = 0; + w0[1] = 0; + w0[0] = 0; + + if (offset_mod_4 == 0) + { + w2[3] = w3[0]; + w3[0] = w3[1]; + w3[1] = w3[2]; + w3[2] = 0; + } + + break; + + case 12: + w3[2] = amd_bytealign ( 0, w0[1], offset_minus_4); + w3[1] = amd_bytealign (w0[1], w0[0], offset_minus_4); + w3[0] = amd_bytealign (w0[0], 0, offset_minus_4); + w2[3] = 0; + w2[2] = 0; + w2[1] = 0; + w2[0] = 0; + w1[3] = 0; + w1[2] = 0; + w1[1] = 0; + w1[0] = 0; + w0[3] = 0; + w0[2] = 0; + w0[1] = 0; + w0[0] = 0; + + if (offset_mod_4 == 0) + { + w3[0] = w3[1]; + w3[1] = w3[2]; + w3[2] = 0; + } + + break; + + case 13: + w3[2] = amd_bytealign ( 0, w0[0], offset_minus_4); + w3[1] = amd_bytealign (w0[0], 0, offset_minus_4); + w3[0] = 0; + w2[3] = 0; + w2[2] = 0; + w2[1] = 0; + w2[0] = 0; + w1[3] = 0; + w1[2] = 0; + w1[1] = 0; + w1[0] = 0; + w0[3] = 0; + w0[2] = 0; + w0[1] = 0; + w0[0] = 0; + + if (offset_mod_4 == 0) + { + w3[1] = w3[2]; + w3[2] = 0; + } + + break; + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) amp (__global pw_t *pws, __global pw_t *pws_amp, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, const u32 combs_mode, const u32 gid_max) +{ + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + const u32 pw_l_len = pws[gid].pw_len; + + u32 wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32 wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32 wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32 wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_r_len = combs_buf[0].pw_len; + + u32 wordr0[4]; + + wordr0[0] = combs_buf[0].i[0]; + wordr0[1] = combs_buf[0].i[1]; + wordr0[2] = combs_buf[0].i[2]; + wordr0[3] = combs_buf[0].i[3]; + + u32 wordr1[4]; + + wordr1[0] = combs_buf[0].i[4]; + wordr1[1] = combs_buf[0].i[5]; + wordr1[2] = combs_buf[0].i[6]; + wordr1[3] = combs_buf[0].i[7]; + + u32 wordr2[4]; + + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + + u32 wordr3[4]; + + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, pw_r_len); + } + + u32 w0[4]; + + w0[0] = wordl0[0] | wordr0[0]; + w0[1] = wordl0[1] | wordr0[1]; + w0[2] = wordl0[2] | wordr0[2]; + w0[3] = wordl0[3] | wordr0[3]; + + u32 w1[4]; + + w1[0] = wordl1[0] | wordr1[0]; + w1[1] = wordl1[1] | wordr1[1]; + w1[2] = wordl1[2] | wordr1[2]; + w1[3] = wordl1[3] | wordr1[3]; + + u32 w2[4]; + + w2[0] = wordl2[0] | wordr2[0]; + w2[1] = wordl2[1] | wordr2[1]; + w2[2] = wordl2[2] | wordr2[2]; + w2[3] = wordl2[3] | wordr2[3]; + + u32 w3[4]; + + w3[0] = wordl3[0] | wordr3[0]; + w3[1] = wordl3[1] | wordr3[1]; + w3[2] = wordl3[2] | wordr3[2]; + w3[3] = wordl3[3] | wordr3[3]; + + const u32 pw_len = pw_l_len + pw_r_len; + + pws_amp[gid].i[ 0] = w0[0]; + pws_amp[gid].i[ 1] = w0[1]; + pws_amp[gid].i[ 2] = w0[2]; + pws_amp[gid].i[ 3] = w0[3]; + pws_amp[gid].i[ 4] = w1[0]; + pws_amp[gid].i[ 5] = w1[1]; + pws_amp[gid].i[ 6] = w1[2]; + pws_amp[gid].i[ 7] = w1[3]; + pws_amp[gid].i[ 8] = w2[0]; + pws_amp[gid].i[ 9] = w2[1]; + pws_amp[gid].i[10] = w2[2]; + pws_amp[gid].i[11] = w2[3]; + pws_amp[gid].i[12] = w3[0]; + pws_amp[gid].i[13] = w3[1]; + pws_amp[gid].i[14] = w3[2]; + pws_amp[gid].i[15] = w3[3]; + + pws_amp[gid].pw_len = pw_len; +} diff --git a/amd/amp_a1_v2.cl b/amd/amp_a1_v2.cl new file mode 100644 index 0000000000..0beca7dccc --- /dev/null +++ b/amd/amp_a1_v2.cl @@ -0,0 +1,587 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define VECT_SIZE2 + +#include "include/constants.h" +#include "include/kernel_vendor.h" +#include "types_amd.c" + +static void switch_buffer_by_offset (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], const u32 offset) +{ + const int offset_mod_4 = offset & 3; + + const int offset_minus_4 = 4 - offset; + + switch (offset / 4) + { + case 0: + w3[2] = amd_bytealign ( 0, w3[1], offset_minus_4); + w3[1] = amd_bytealign (w3[1], w3[0], offset_minus_4); + w3[0] = amd_bytealign (w3[0], w2[3], offset_minus_4); + w2[3] = amd_bytealign (w2[3], w2[2], offset_minus_4); + w2[2] = amd_bytealign (w2[2], w2[1], offset_minus_4); + w2[1] = amd_bytealign (w2[1], w2[0], offset_minus_4); + w2[0] = amd_bytealign (w2[0], w1[3], offset_minus_4); + w1[3] = amd_bytealign (w1[3], w1[2], offset_minus_4); + w1[2] = amd_bytealign (w1[2], w1[1], offset_minus_4); + w1[1] = amd_bytealign (w1[1], w1[0], offset_minus_4); + w1[0] = amd_bytealign (w1[0], w0[3], offset_minus_4); + w0[3] = amd_bytealign (w0[3], w0[2], offset_minus_4); + w0[2] = amd_bytealign (w0[2], w0[1], offset_minus_4); + w0[1] = amd_bytealign (w0[1], w0[0], offset_minus_4); + w0[0] = amd_bytealign (w0[0], 0, offset_minus_4); + + if (offset_mod_4 == 0) + { + w0[0] = w0[1]; + w0[1] = w0[2]; + w0[2] = w0[3]; + w0[3] = w1[0]; + w1[0] = w1[1]; + w1[1] = w1[2]; + w1[2] = w1[3]; + w1[3] = w2[0]; + w2[0] = w2[1]; + w2[1] = w2[2]; + w2[2] = w2[3]; + w2[3] = w3[0]; + w3[0] = w3[1]; + w3[1] = w3[2]; + w3[2] = 0; + } + + break; + + case 1: + w3[2] = amd_bytealign ( 0, w3[0], offset_minus_4); + w3[1] = amd_bytealign (w3[0], w2[3], offset_minus_4); + w3[0] = amd_bytealign (w2[3], w2[2], offset_minus_4); + w2[3] = amd_bytealign (w2[2], w2[1], offset_minus_4); + w2[2] = amd_bytealign (w2[1], w2[0], offset_minus_4); + w2[1] = amd_bytealign (w2[0], w1[3], offset_minus_4); + w2[0] = amd_bytealign (w1[3], w1[2], offset_minus_4); + w1[3] = amd_bytealign (w1[2], w1[1], offset_minus_4); + w1[2] = amd_bytealign (w1[1], w1[0], offset_minus_4); + w1[1] = amd_bytealign (w1[0], w0[3], offset_minus_4); + w1[0] = amd_bytealign (w0[3], w0[2], offset_minus_4); + w0[3] = amd_bytealign (w0[2], w0[1], offset_minus_4); + w0[2] = amd_bytealign (w0[1], w0[0], offset_minus_4); + w0[1] = amd_bytealign (w0[0], 0, offset_minus_4); + w0[0] = 0; + + if (offset_mod_4 == 0) + { + w0[1] = w0[2]; + w0[2] = w0[3]; + w0[3] = w1[0]; + w1[0] = w1[1]; + w1[1] = w1[2]; + w1[2] = w1[3]; + w1[3] = w2[0]; + w2[0] = w2[1]; + w2[1] = w2[2]; + w2[2] = w2[3]; + w2[3] = w3[0]; + w3[0] = w3[1]; + w3[1] = w3[2]; + w3[2] = 0; + } + + break; + + case 2: + w3[2] = amd_bytealign ( 0, w2[3], offset_minus_4); + w3[1] = amd_bytealign (w2[3], w2[2], offset_minus_4); + w3[0] = amd_bytealign (w2[2], w2[1], offset_minus_4); + w2[3] = amd_bytealign (w2[1], w2[0], offset_minus_4); + w2[2] = amd_bytealign (w2[0], w1[3], offset_minus_4); + w2[1] = amd_bytealign (w1[3], w1[2], offset_minus_4); + w2[0] = amd_bytealign (w1[2], w1[1], offset_minus_4); + w1[3] = amd_bytealign (w1[1], w1[0], offset_minus_4); + w1[2] = amd_bytealign (w1[0], w0[3], offset_minus_4); + w1[1] = amd_bytealign (w0[3], w0[2], offset_minus_4); + w1[0] = amd_bytealign (w0[2], w0[1], offset_minus_4); + w0[3] = amd_bytealign (w0[1], w0[0], offset_minus_4); + w0[2] = amd_bytealign (w0[0], 0, offset_minus_4); + w0[1] = 0; + w0[0] = 0; + + if (offset_mod_4 == 0) + { + w0[2] = w0[3]; + w0[3] = w1[0]; + w1[0] = w1[1]; + w1[1] = w1[2]; + w1[2] = w1[3]; + w1[3] = w2[0]; + w2[0] = w2[1]; + w2[1] = w2[2]; + w2[2] = w2[3]; + w2[3] = w3[0]; + w3[0] = w3[1]; + w3[1] = w3[2]; + w3[2] = 0; + } + + break; + + case 3: + w3[2] = amd_bytealign ( 0, w2[2], offset_minus_4); + w3[1] = amd_bytealign (w2[2], w2[1], offset_minus_4); + w3[0] = amd_bytealign (w2[1], w2[0], offset_minus_4); + w2[3] = amd_bytealign (w2[0], w1[3], offset_minus_4); + w2[2] = amd_bytealign (w1[3], w1[2], offset_minus_4); + w2[1] = amd_bytealign (w1[2], w1[1], offset_minus_4); + w2[0] = amd_bytealign (w1[1], w1[0], offset_minus_4); + w1[3] = amd_bytealign (w1[0], w0[3], offset_minus_4); + w1[2] = amd_bytealign (w0[3], w0[2], offset_minus_4); + w1[1] = amd_bytealign (w0[2], w0[1], offset_minus_4); + w1[0] = amd_bytealign (w0[1], w0[0], offset_minus_4); + w0[3] = amd_bytealign (w0[0], 0, offset_minus_4); + w0[2] = 0; + w0[1] = 0; + w0[0] = 0; + + if (offset_mod_4 == 0) + { + w0[3] = w1[0]; + w1[0] = w1[1]; + w1[1] = w1[2]; + w1[2] = w1[3]; + w1[3] = w2[0]; + w2[0] = w2[1]; + w2[1] = w2[2]; + w2[2] = w2[3]; + w2[3] = w3[0]; + w3[0] = w3[1]; + w3[1] = w3[2]; + w3[2] = 0; + } + + break; + + case 4: + w3[2] = amd_bytealign ( 0, w2[1], offset_minus_4); + w3[1] = amd_bytealign (w2[1], w2[0], offset_minus_4); + w3[0] = amd_bytealign (w2[0], w1[3], offset_minus_4); + w2[3] = amd_bytealign (w1[3], w1[2], offset_minus_4); + w2[2] = amd_bytealign (w1[2], w1[1], offset_minus_4); + w2[1] = amd_bytealign (w1[1], w1[0], offset_minus_4); + w2[0] = amd_bytealign (w1[0], w0[3], offset_minus_4); + w1[3] = amd_bytealign (w0[3], w0[2], offset_minus_4); + w1[2] = amd_bytealign (w0[2], w0[1], offset_minus_4); + w1[1] = amd_bytealign (w0[1], w0[0], offset_minus_4); + w1[0] = amd_bytealign (w0[0], 0, offset_minus_4); + w0[3] = 0; + w0[2] = 0; + w0[1] = 0; + w0[0] = 0; + + if (offset_mod_4 == 0) + { + w1[0] = w1[1]; + w1[1] = w1[2]; + w1[2] = w1[3]; + w1[3] = w2[0]; + w2[0] = w2[1]; + w2[1] = w2[2]; + w2[2] = w2[3]; + w2[3] = w3[0]; + w3[0] = w3[1]; + w3[1] = w3[2]; + w3[2] = 0; + } + + break; + + case 5: + w3[2] = amd_bytealign ( 0, w2[0], offset_minus_4); + w3[1] = amd_bytealign (w2[0], w1[3], offset_minus_4); + w3[0] = amd_bytealign (w1[3], w1[2], offset_minus_4); + w2[3] = amd_bytealign (w1[2], w1[1], offset_minus_4); + w2[2] = amd_bytealign (w1[1], w1[0], offset_minus_4); + w2[1] = amd_bytealign (w1[0], w0[3], offset_minus_4); + w2[0] = amd_bytealign (w0[3], w0[2], offset_minus_4); + w1[3] = amd_bytealign (w0[2], w0[1], offset_minus_4); + w1[2] = amd_bytealign (w0[1], w0[0], offset_minus_4); + w1[1] = amd_bytealign (w0[0], 0, offset_minus_4); + w1[0] = 0; + w0[3] = 0; + w0[2] = 0; + w0[1] = 0; + w0[0] = 0; + + if (offset_mod_4 == 0) + { + w1[1] = w1[2]; + w1[2] = w1[3]; + w1[3] = w2[0]; + w2[0] = w2[1]; + w2[1] = w2[2]; + w2[2] = w2[3]; + w2[3] = w3[0]; + w3[0] = w3[1]; + w3[1] = w3[2]; + w3[2] = 0; + } + + break; + + case 6: + w3[2] = amd_bytealign ( 0, w1[3], offset_minus_4); + w3[1] = amd_bytealign (w1[3], w1[2], offset_minus_4); + w3[0] = amd_bytealign (w1[2], w1[1], offset_minus_4); + w2[3] = amd_bytealign (w1[1], w1[0], offset_minus_4); + w2[2] = amd_bytealign (w1[0], w0[3], offset_minus_4); + w2[1] = amd_bytealign (w0[3], w0[2], offset_minus_4); + w2[0] = amd_bytealign (w0[2], w0[1], offset_minus_4); + w1[3] = amd_bytealign (w0[1], w0[0], offset_minus_4); + w1[2] = amd_bytealign (w0[0], 0, offset_minus_4); + w1[1] = 0; + w1[0] = 0; + w0[3] = 0; + w0[2] = 0; + w0[1] = 0; + w0[0] = 0; + + if (offset_mod_4 == 0) + { + w1[2] = w1[3]; + w1[3] = w2[0]; + w2[0] = w2[1]; + w2[1] = w2[2]; + w2[2] = w2[3]; + w2[3] = w3[0]; + w3[0] = w3[1]; + w3[1] = w3[2]; + w3[2] = 0; + } + + break; + + case 7: + w3[2] = amd_bytealign ( 0, w1[2], offset_minus_4); + w3[1] = amd_bytealign (w1[2], w1[1], offset_minus_4); + w3[0] = amd_bytealign (w1[1], w1[0], offset_minus_4); + w2[3] = amd_bytealign (w1[0], w0[3], offset_minus_4); + w2[2] = amd_bytealign (w0[3], w0[2], offset_minus_4); + w2[1] = amd_bytealign (w0[2], w0[1], offset_minus_4); + w2[0] = amd_bytealign (w0[1], w0[0], offset_minus_4); + w1[3] = amd_bytealign (w0[0], 0, offset_minus_4); + w1[2] = 0; + w1[1] = 0; + w1[0] = 0; + w0[3] = 0; + w0[2] = 0; + w0[1] = 0; + w0[0] = 0; + + if (offset_mod_4 == 0) + { + w1[3] = w2[0]; + w2[0] = w2[1]; + w2[1] = w2[2]; + w2[2] = w2[3]; + w2[3] = w3[0]; + w3[0] = w3[1]; + w3[1] = w3[2]; + w3[2] = 0; + } + + break; + + case 8: + w3[2] = amd_bytealign ( 0, w1[1], offset_minus_4); + w3[1] = amd_bytealign (w1[1], w1[0], offset_minus_4); + w3[0] = amd_bytealign (w1[0], w0[3], offset_minus_4); + w2[3] = amd_bytealign (w0[3], w0[2], offset_minus_4); + w2[2] = amd_bytealign (w0[2], w0[1], offset_minus_4); + w2[1] = amd_bytealign (w0[1], w0[0], offset_minus_4); + w2[0] = amd_bytealign (w0[0], 0, offset_minus_4); + w1[3] = 0; + w1[2] = 0; + w1[1] = 0; + w1[0] = 0; + w0[3] = 0; + w0[2] = 0; + w0[1] = 0; + w0[0] = 0; + + if (offset_mod_4 == 0) + { + w2[0] = w2[1]; + w2[1] = w2[2]; + w2[2] = w2[3]; + w2[3] = w3[0]; + w3[0] = w3[1]; + w3[1] = w3[2]; + w3[2] = 0; + } + + break; + + case 9: + w3[2] = amd_bytealign ( 0, w1[0], offset_minus_4); + w3[1] = amd_bytealign (w1[0], w0[3], offset_minus_4); + w3[0] = amd_bytealign (w0[3], w0[2], offset_minus_4); + w2[3] = amd_bytealign (w0[2], w0[1], offset_minus_4); + w2[2] = amd_bytealign (w0[1], w0[0], offset_minus_4); + w2[1] = amd_bytealign (w0[0], 0, offset_minus_4); + w2[0] = 0; + w1[3] = 0; + w1[2] = 0; + w1[1] = 0; + w1[0] = 0; + w0[3] = 0; + w0[2] = 0; + w0[1] = 0; + w0[0] = 0; + + if (offset_mod_4 == 0) + { + w2[1] = w2[2]; + w2[2] = w2[3]; + w2[3] = w3[0]; + w3[0] = w3[1]; + w3[1] = w3[2]; + w3[2] = 0; + } + + break; + + case 10: + w3[2] = amd_bytealign ( 0, w0[3], offset_minus_4); + w3[1] = amd_bytealign (w0[3], w0[2], offset_minus_4); + w3[0] = amd_bytealign (w0[2], w0[1], offset_minus_4); + w2[3] = amd_bytealign (w0[1], w0[0], offset_minus_4); + w2[2] = amd_bytealign (w0[0], 0, offset_minus_4); + w2[1] = 0; + w2[0] = 0; + w1[3] = 0; + w1[2] = 0; + w1[1] = 0; + w1[0] = 0; + w0[3] = 0; + w0[2] = 0; + w0[1] = 0; + w0[0] = 0; + + if (offset_mod_4 == 0) + { + w2[2] = w2[3]; + w2[3] = w3[0]; + w3[0] = w3[1]; + w3[1] = w3[2]; + w3[2] = 0; + } + + break; + + case 11: + w3[2] = amd_bytealign ( 0, w0[2], offset_minus_4); + w3[1] = amd_bytealign (w0[2], w0[1], offset_minus_4); + w3[0] = amd_bytealign (w0[1], w0[0], offset_minus_4); + w2[3] = amd_bytealign (w0[0], 0, offset_minus_4); + w2[2] = 0; + w2[1] = 0; + w2[0] = 0; + w1[3] = 0; + w1[2] = 0; + w1[1] = 0; + w1[0] = 0; + w0[3] = 0; + w0[2] = 0; + w0[1] = 0; + w0[0] = 0; + + if (offset_mod_4 == 0) + { + w2[3] = w3[0]; + w3[0] = w3[1]; + w3[1] = w3[2]; + w3[2] = 0; + } + + break; + + case 12: + w3[2] = amd_bytealign ( 0, w0[1], offset_minus_4); + w3[1] = amd_bytealign (w0[1], w0[0], offset_minus_4); + w3[0] = amd_bytealign (w0[0], 0, offset_minus_4); + w2[3] = 0; + w2[2] = 0; + w2[1] = 0; + w2[0] = 0; + w1[3] = 0; + w1[2] = 0; + w1[1] = 0; + w1[0] = 0; + w0[3] = 0; + w0[2] = 0; + w0[1] = 0; + w0[0] = 0; + + if (offset_mod_4 == 0) + { + w3[0] = w3[1]; + w3[1] = w3[2]; + w3[2] = 0; + } + + break; + + case 13: + w3[2] = amd_bytealign ( 0, w0[0], offset_minus_4); + w3[1] = amd_bytealign (w0[0], 0, offset_minus_4); + w3[0] = 0; + w2[3] = 0; + w2[2] = 0; + w2[1] = 0; + w2[0] = 0; + w1[3] = 0; + w1[2] = 0; + w1[1] = 0; + w1[0] = 0; + w0[3] = 0; + w0[2] = 0; + w0[1] = 0; + w0[0] = 0; + + if (offset_mod_4 == 0) + { + w3[1] = w3[2]; + w3[2] = 0; + } + + break; + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) amp (__global pw_t *pws, __global pw_t *pws_amp, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, const u32 combs_mode, const u32 gid_max) +{ + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + const u32 pw_l_len = pws[gid].pw_len; + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_r_len = combs_buf[0].pw_len; + + u32x wordr0[4]; + + wordr0[0] = combs_buf[0].i[0]; + wordr0[1] = combs_buf[0].i[1]; + wordr0[2] = combs_buf[0].i[2]; + wordr0[3] = combs_buf[0].i[3]; + + u32x wordr1[4]; + + wordr1[0] = combs_buf[0].i[4]; + wordr1[1] = combs_buf[0].i[5]; + wordr1[2] = combs_buf[0].i[6]; + wordr1[3] = combs_buf[0].i[7]; + + u32x wordr2[4]; + + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + + u32x wordr3[4]; + + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, pw_r_len); + } + + u32x w0[4]; + + w0[0] = wordl0[0] | wordr0[0]; + w0[1] = wordl0[1] | wordr0[1]; + w0[2] = wordl0[2] | wordr0[2]; + w0[3] = wordl0[3] | wordr0[3]; + + u32x w1[4]; + + w1[0] = wordl1[0] | wordr1[0]; + w1[1] = wordl1[1] | wordr1[1]; + w1[2] = wordl1[2] | wordr1[2]; + w1[3] = wordl1[3] | wordr1[3]; + + u32x w2[4]; + + w2[0] = wordl2[0] | wordr2[0]; + w2[1] = wordl2[1] | wordr2[1]; + w2[2] = wordl2[2] | wordr2[2]; + w2[3] = wordl2[3] | wordr2[3]; + + u32x w3[4]; + + w3[0] = wordl3[0] | wordr3[0]; + w3[1] = wordl3[1] | wordr3[1]; + w3[2] = wordl3[2] | wordr3[2]; + w3[3] = wordl3[3] | wordr3[3]; + + const u32 pw_len = pw_l_len + pw_r_len; + + pws_amp[gid].i[ 0] = w0[0]; + pws_amp[gid].i[ 1] = w0[1]; + pws_amp[gid].i[ 2] = w0[2]; + pws_amp[gid].i[ 3] = w0[3]; + pws_amp[gid].i[ 4] = w1[0]; + pws_amp[gid].i[ 5] = w1[1]; + pws_amp[gid].i[ 6] = w1[2]; + pws_amp[gid].i[ 7] = w1[3]; + pws_amp[gid].i[ 8] = w2[0]; + pws_amp[gid].i[ 9] = w2[1]; + pws_amp[gid].i[10] = w2[2]; + pws_amp[gid].i[11] = w2[3]; + pws_amp[gid].i[12] = w3[0]; + pws_amp[gid].i[13] = w3[1]; + pws_amp[gid].i[14] = w3[2]; + pws_amp[gid].i[15] = w3[3]; + + pws_amp[gid].pw_len = pw_len; +} diff --git a/amd/amp_a1_v4.cl b/amd/amp_a1_v4.cl new file mode 100644 index 0000000000..801d11fd96 --- /dev/null +++ b/amd/amp_a1_v4.cl @@ -0,0 +1,587 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define VECT_SIZE4 + +#include "include/constants.h" +#include "include/kernel_vendor.h" +#include "types_amd.c" + +static void switch_buffer_by_offset (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], const u32 offset) +{ + const int offset_mod_4 = offset & 3; + + const int offset_minus_4 = 4 - offset; + + switch (offset / 4) + { + case 0: + w3[2] = amd_bytealign ( 0, w3[1], offset_minus_4); + w3[1] = amd_bytealign (w3[1], w3[0], offset_minus_4); + w3[0] = amd_bytealign (w3[0], w2[3], offset_minus_4); + w2[3] = amd_bytealign (w2[3], w2[2], offset_minus_4); + w2[2] = amd_bytealign (w2[2], w2[1], offset_minus_4); + w2[1] = amd_bytealign (w2[1], w2[0], offset_minus_4); + w2[0] = amd_bytealign (w2[0], w1[3], offset_minus_4); + w1[3] = amd_bytealign (w1[3], w1[2], offset_minus_4); + w1[2] = amd_bytealign (w1[2], w1[1], offset_minus_4); + w1[1] = amd_bytealign (w1[1], w1[0], offset_minus_4); + w1[0] = amd_bytealign (w1[0], w0[3], offset_minus_4); + w0[3] = amd_bytealign (w0[3], w0[2], offset_minus_4); + w0[2] = amd_bytealign (w0[2], w0[1], offset_minus_4); + w0[1] = amd_bytealign (w0[1], w0[0], offset_minus_4); + w0[0] = amd_bytealign (w0[0], 0, offset_minus_4); + + if (offset_mod_4 == 0) + { + w0[0] = w0[1]; + w0[1] = w0[2]; + w0[2] = w0[3]; + w0[3] = w1[0]; + w1[0] = w1[1]; + w1[1] = w1[2]; + w1[2] = w1[3]; + w1[3] = w2[0]; + w2[0] = w2[1]; + w2[1] = w2[2]; + w2[2] = w2[3]; + w2[3] = w3[0]; + w3[0] = w3[1]; + w3[1] = w3[2]; + w3[2] = 0; + } + + break; + + case 1: + w3[2] = amd_bytealign ( 0, w3[0], offset_minus_4); + w3[1] = amd_bytealign (w3[0], w2[3], offset_minus_4); + w3[0] = amd_bytealign (w2[3], w2[2], offset_minus_4); + w2[3] = amd_bytealign (w2[2], w2[1], offset_minus_4); + w2[2] = amd_bytealign (w2[1], w2[0], offset_minus_4); + w2[1] = amd_bytealign (w2[0], w1[3], offset_minus_4); + w2[0] = amd_bytealign (w1[3], w1[2], offset_minus_4); + w1[3] = amd_bytealign (w1[2], w1[1], offset_minus_4); + w1[2] = amd_bytealign (w1[1], w1[0], offset_minus_4); + w1[1] = amd_bytealign (w1[0], w0[3], offset_minus_4); + w1[0] = amd_bytealign (w0[3], w0[2], offset_minus_4); + w0[3] = amd_bytealign (w0[2], w0[1], offset_minus_4); + w0[2] = amd_bytealign (w0[1], w0[0], offset_minus_4); + w0[1] = amd_bytealign (w0[0], 0, offset_minus_4); + w0[0] = 0; + + if (offset_mod_4 == 0) + { + w0[1] = w0[2]; + w0[2] = w0[3]; + w0[3] = w1[0]; + w1[0] = w1[1]; + w1[1] = w1[2]; + w1[2] = w1[3]; + w1[3] = w2[0]; + w2[0] = w2[1]; + w2[1] = w2[2]; + w2[2] = w2[3]; + w2[3] = w3[0]; + w3[0] = w3[1]; + w3[1] = w3[2]; + w3[2] = 0; + } + + break; + + case 2: + w3[2] = amd_bytealign ( 0, w2[3], offset_minus_4); + w3[1] = amd_bytealign (w2[3], w2[2], offset_minus_4); + w3[0] = amd_bytealign (w2[2], w2[1], offset_minus_4); + w2[3] = amd_bytealign (w2[1], w2[0], offset_minus_4); + w2[2] = amd_bytealign (w2[0], w1[3], offset_minus_4); + w2[1] = amd_bytealign (w1[3], w1[2], offset_minus_4); + w2[0] = amd_bytealign (w1[2], w1[1], offset_minus_4); + w1[3] = amd_bytealign (w1[1], w1[0], offset_minus_4); + w1[2] = amd_bytealign (w1[0], w0[3], offset_minus_4); + w1[1] = amd_bytealign (w0[3], w0[2], offset_minus_4); + w1[0] = amd_bytealign (w0[2], w0[1], offset_minus_4); + w0[3] = amd_bytealign (w0[1], w0[0], offset_minus_4); + w0[2] = amd_bytealign (w0[0], 0, offset_minus_4); + w0[1] = 0; + w0[0] = 0; + + if (offset_mod_4 == 0) + { + w0[2] = w0[3]; + w0[3] = w1[0]; + w1[0] = w1[1]; + w1[1] = w1[2]; + w1[2] = w1[3]; + w1[3] = w2[0]; + w2[0] = w2[1]; + w2[1] = w2[2]; + w2[2] = w2[3]; + w2[3] = w3[0]; + w3[0] = w3[1]; + w3[1] = w3[2]; + w3[2] = 0; + } + + break; + + case 3: + w3[2] = amd_bytealign ( 0, w2[2], offset_minus_4); + w3[1] = amd_bytealign (w2[2], w2[1], offset_minus_4); + w3[0] = amd_bytealign (w2[1], w2[0], offset_minus_4); + w2[3] = amd_bytealign (w2[0], w1[3], offset_minus_4); + w2[2] = amd_bytealign (w1[3], w1[2], offset_minus_4); + w2[1] = amd_bytealign (w1[2], w1[1], offset_minus_4); + w2[0] = amd_bytealign (w1[1], w1[0], offset_minus_4); + w1[3] = amd_bytealign (w1[0], w0[3], offset_minus_4); + w1[2] = amd_bytealign (w0[3], w0[2], offset_minus_4); + w1[1] = amd_bytealign (w0[2], w0[1], offset_minus_4); + w1[0] = amd_bytealign (w0[1], w0[0], offset_minus_4); + w0[3] = amd_bytealign (w0[0], 0, offset_minus_4); + w0[2] = 0; + w0[1] = 0; + w0[0] = 0; + + if (offset_mod_4 == 0) + { + w0[3] = w1[0]; + w1[0] = w1[1]; + w1[1] = w1[2]; + w1[2] = w1[3]; + w1[3] = w2[0]; + w2[0] = w2[1]; + w2[1] = w2[2]; + w2[2] = w2[3]; + w2[3] = w3[0]; + w3[0] = w3[1]; + w3[1] = w3[2]; + w3[2] = 0; + } + + break; + + case 4: + w3[2] = amd_bytealign ( 0, w2[1], offset_minus_4); + w3[1] = amd_bytealign (w2[1], w2[0], offset_minus_4); + w3[0] = amd_bytealign (w2[0], w1[3], offset_minus_4); + w2[3] = amd_bytealign (w1[3], w1[2], offset_minus_4); + w2[2] = amd_bytealign (w1[2], w1[1], offset_minus_4); + w2[1] = amd_bytealign (w1[1], w1[0], offset_minus_4); + w2[0] = amd_bytealign (w1[0], w0[3], offset_minus_4); + w1[3] = amd_bytealign (w0[3], w0[2], offset_minus_4); + w1[2] = amd_bytealign (w0[2], w0[1], offset_minus_4); + w1[1] = amd_bytealign (w0[1], w0[0], offset_minus_4); + w1[0] = amd_bytealign (w0[0], 0, offset_minus_4); + w0[3] = 0; + w0[2] = 0; + w0[1] = 0; + w0[0] = 0; + + if (offset_mod_4 == 0) + { + w1[0] = w1[1]; + w1[1] = w1[2]; + w1[2] = w1[3]; + w1[3] = w2[0]; + w2[0] = w2[1]; + w2[1] = w2[2]; + w2[2] = w2[3]; + w2[3] = w3[0]; + w3[0] = w3[1]; + w3[1] = w3[2]; + w3[2] = 0; + } + + break; + + case 5: + w3[2] = amd_bytealign ( 0, w2[0], offset_minus_4); + w3[1] = amd_bytealign (w2[0], w1[3], offset_minus_4); + w3[0] = amd_bytealign (w1[3], w1[2], offset_minus_4); + w2[3] = amd_bytealign (w1[2], w1[1], offset_minus_4); + w2[2] = amd_bytealign (w1[1], w1[0], offset_minus_4); + w2[1] = amd_bytealign (w1[0], w0[3], offset_minus_4); + w2[0] = amd_bytealign (w0[3], w0[2], offset_minus_4); + w1[3] = amd_bytealign (w0[2], w0[1], offset_minus_4); + w1[2] = amd_bytealign (w0[1], w0[0], offset_minus_4); + w1[1] = amd_bytealign (w0[0], 0, offset_minus_4); + w1[0] = 0; + w0[3] = 0; + w0[2] = 0; + w0[1] = 0; + w0[0] = 0; + + if (offset_mod_4 == 0) + { + w1[1] = w1[2]; + w1[2] = w1[3]; + w1[3] = w2[0]; + w2[0] = w2[1]; + w2[1] = w2[2]; + w2[2] = w2[3]; + w2[3] = w3[0]; + w3[0] = w3[1]; + w3[1] = w3[2]; + w3[2] = 0; + } + + break; + + case 6: + w3[2] = amd_bytealign ( 0, w1[3], offset_minus_4); + w3[1] = amd_bytealign (w1[3], w1[2], offset_minus_4); + w3[0] = amd_bytealign (w1[2], w1[1], offset_minus_4); + w2[3] = amd_bytealign (w1[1], w1[0], offset_minus_4); + w2[2] = amd_bytealign (w1[0], w0[3], offset_minus_4); + w2[1] = amd_bytealign (w0[3], w0[2], offset_minus_4); + w2[0] = amd_bytealign (w0[2], w0[1], offset_minus_4); + w1[3] = amd_bytealign (w0[1], w0[0], offset_minus_4); + w1[2] = amd_bytealign (w0[0], 0, offset_minus_4); + w1[1] = 0; + w1[0] = 0; + w0[3] = 0; + w0[2] = 0; + w0[1] = 0; + w0[0] = 0; + + if (offset_mod_4 == 0) + { + w1[2] = w1[3]; + w1[3] = w2[0]; + w2[0] = w2[1]; + w2[1] = w2[2]; + w2[2] = w2[3]; + w2[3] = w3[0]; + w3[0] = w3[1]; + w3[1] = w3[2]; + w3[2] = 0; + } + + break; + + case 7: + w3[2] = amd_bytealign ( 0, w1[2], offset_minus_4); + w3[1] = amd_bytealign (w1[2], w1[1], offset_minus_4); + w3[0] = amd_bytealign (w1[1], w1[0], offset_minus_4); + w2[3] = amd_bytealign (w1[0], w0[3], offset_minus_4); + w2[2] = amd_bytealign (w0[3], w0[2], offset_minus_4); + w2[1] = amd_bytealign (w0[2], w0[1], offset_minus_4); + w2[0] = amd_bytealign (w0[1], w0[0], offset_minus_4); + w1[3] = amd_bytealign (w0[0], 0, offset_minus_4); + w1[2] = 0; + w1[1] = 0; + w1[0] = 0; + w0[3] = 0; + w0[2] = 0; + w0[1] = 0; + w0[0] = 0; + + if (offset_mod_4 == 0) + { + w1[3] = w2[0]; + w2[0] = w2[1]; + w2[1] = w2[2]; + w2[2] = w2[3]; + w2[3] = w3[0]; + w3[0] = w3[1]; + w3[1] = w3[2]; + w3[2] = 0; + } + + break; + + case 8: + w3[2] = amd_bytealign ( 0, w1[1], offset_minus_4); + w3[1] = amd_bytealign (w1[1], w1[0], offset_minus_4); + w3[0] = amd_bytealign (w1[0], w0[3], offset_minus_4); + w2[3] = amd_bytealign (w0[3], w0[2], offset_minus_4); + w2[2] = amd_bytealign (w0[2], w0[1], offset_minus_4); + w2[1] = amd_bytealign (w0[1], w0[0], offset_minus_4); + w2[0] = amd_bytealign (w0[0], 0, offset_minus_4); + w1[3] = 0; + w1[2] = 0; + w1[1] = 0; + w1[0] = 0; + w0[3] = 0; + w0[2] = 0; + w0[1] = 0; + w0[0] = 0; + + if (offset_mod_4 == 0) + { + w2[0] = w2[1]; + w2[1] = w2[2]; + w2[2] = w2[3]; + w2[3] = w3[0]; + w3[0] = w3[1]; + w3[1] = w3[2]; + w3[2] = 0; + } + + break; + + case 9: + w3[2] = amd_bytealign ( 0, w1[0], offset_minus_4); + w3[1] = amd_bytealign (w1[0], w0[3], offset_minus_4); + w3[0] = amd_bytealign (w0[3], w0[2], offset_minus_4); + w2[3] = amd_bytealign (w0[2], w0[1], offset_minus_4); + w2[2] = amd_bytealign (w0[1], w0[0], offset_minus_4); + w2[1] = amd_bytealign (w0[0], 0, offset_minus_4); + w2[0] = 0; + w1[3] = 0; + w1[2] = 0; + w1[1] = 0; + w1[0] = 0; + w0[3] = 0; + w0[2] = 0; + w0[1] = 0; + w0[0] = 0; + + if (offset_mod_4 == 0) + { + w2[1] = w2[2]; + w2[2] = w2[3]; + w2[3] = w3[0]; + w3[0] = w3[1]; + w3[1] = w3[2]; + w3[2] = 0; + } + + break; + + case 10: + w3[2] = amd_bytealign ( 0, w0[3], offset_minus_4); + w3[1] = amd_bytealign (w0[3], w0[2], offset_minus_4); + w3[0] = amd_bytealign (w0[2], w0[1], offset_minus_4); + w2[3] = amd_bytealign (w0[1], w0[0], offset_minus_4); + w2[2] = amd_bytealign (w0[0], 0, offset_minus_4); + w2[1] = 0; + w2[0] = 0; + w1[3] = 0; + w1[2] = 0; + w1[1] = 0; + w1[0] = 0; + w0[3] = 0; + w0[2] = 0; + w0[1] = 0; + w0[0] = 0; + + if (offset_mod_4 == 0) + { + w2[2] = w2[3]; + w2[3] = w3[0]; + w3[0] = w3[1]; + w3[1] = w3[2]; + w3[2] = 0; + } + + break; + + case 11: + w3[2] = amd_bytealign ( 0, w0[2], offset_minus_4); + w3[1] = amd_bytealign (w0[2], w0[1], offset_minus_4); + w3[0] = amd_bytealign (w0[1], w0[0], offset_minus_4); + w2[3] = amd_bytealign (w0[0], 0, offset_minus_4); + w2[2] = 0; + w2[1] = 0; + w2[0] = 0; + w1[3] = 0; + w1[2] = 0; + w1[1] = 0; + w1[0] = 0; + w0[3] = 0; + w0[2] = 0; + w0[1] = 0; + w0[0] = 0; + + if (offset_mod_4 == 0) + { + w2[3] = w3[0]; + w3[0] = w3[1]; + w3[1] = w3[2]; + w3[2] = 0; + } + + break; + + case 12: + w3[2] = amd_bytealign ( 0, w0[1], offset_minus_4); + w3[1] = amd_bytealign (w0[1], w0[0], offset_minus_4); + w3[0] = amd_bytealign (w0[0], 0, offset_minus_4); + w2[3] = 0; + w2[2] = 0; + w2[1] = 0; + w2[0] = 0; + w1[3] = 0; + w1[2] = 0; + w1[1] = 0; + w1[0] = 0; + w0[3] = 0; + w0[2] = 0; + w0[1] = 0; + w0[0] = 0; + + if (offset_mod_4 == 0) + { + w3[0] = w3[1]; + w3[1] = w3[2]; + w3[2] = 0; + } + + break; + + case 13: + w3[2] = amd_bytealign ( 0, w0[0], offset_minus_4); + w3[1] = amd_bytealign (w0[0], 0, offset_minus_4); + w3[0] = 0; + w2[3] = 0; + w2[2] = 0; + w2[1] = 0; + w2[0] = 0; + w1[3] = 0; + w1[2] = 0; + w1[1] = 0; + w1[0] = 0; + w0[3] = 0; + w0[2] = 0; + w0[1] = 0; + w0[0] = 0; + + if (offset_mod_4 == 0) + { + w3[1] = w3[2]; + w3[2] = 0; + } + + break; + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) amp (__global pw_t *pws, __global pw_t *pws_amp, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, const u32 combs_mode, const u32 gid_max) +{ + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + const u32 pw_l_len = pws[gid].pw_len; + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_r_len = combs_buf[0].pw_len; + + u32x wordr0[4]; + + wordr0[0] = combs_buf[0].i[0]; + wordr0[1] = combs_buf[0].i[1]; + wordr0[2] = combs_buf[0].i[2]; + wordr0[3] = combs_buf[0].i[3]; + + u32x wordr1[4]; + + wordr1[0] = combs_buf[0].i[4]; + wordr1[1] = combs_buf[0].i[5]; + wordr1[2] = combs_buf[0].i[6]; + wordr1[3] = combs_buf[0].i[7]; + + u32x wordr2[4]; + + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + + u32x wordr3[4]; + + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, pw_r_len); + } + + u32x w0[4]; + + w0[0] = wordl0[0] | wordr0[0]; + w0[1] = wordl0[1] | wordr0[1]; + w0[2] = wordl0[2] | wordr0[2]; + w0[3] = wordl0[3] | wordr0[3]; + + u32x w1[4]; + + w1[0] = wordl1[0] | wordr1[0]; + w1[1] = wordl1[1] | wordr1[1]; + w1[2] = wordl1[2] | wordr1[2]; + w1[3] = wordl1[3] | wordr1[3]; + + u32x w2[4]; + + w2[0] = wordl2[0] | wordr2[0]; + w2[1] = wordl2[1] | wordr2[1]; + w2[2] = wordl2[2] | wordr2[2]; + w2[3] = wordl2[3] | wordr2[3]; + + u32x w3[4]; + + w3[0] = wordl3[0] | wordr3[0]; + w3[1] = wordl3[1] | wordr3[1]; + w3[2] = wordl3[2] | wordr3[2]; + w3[3] = wordl3[3] | wordr3[3]; + + const u32 pw_len = pw_l_len + pw_r_len; + + pws_amp[gid].i[ 0] = w0[0]; + pws_amp[gid].i[ 1] = w0[1]; + pws_amp[gid].i[ 2] = w0[2]; + pws_amp[gid].i[ 3] = w0[3]; + pws_amp[gid].i[ 4] = w1[0]; + pws_amp[gid].i[ 5] = w1[1]; + pws_amp[gid].i[ 6] = w1[2]; + pws_amp[gid].i[ 7] = w1[3]; + pws_amp[gid].i[ 8] = w2[0]; + pws_amp[gid].i[ 9] = w2[1]; + pws_amp[gid].i[10] = w2[2]; + pws_amp[gid].i[11] = w2[3]; + pws_amp[gid].i[12] = w3[0]; + pws_amp[gid].i[13] = w3[1]; + pws_amp[gid].i[14] = w3[2]; + pws_amp[gid].i[15] = w3[3]; + + pws_amp[gid].pw_len = pw_len; +} diff --git a/amd/amp_a3_v1.cl b/amd/amp_a3_v1.cl new file mode 100644 index 0000000000..f1b4ad5ecb --- /dev/null +++ b/amd/amp_a3_v1.cl @@ -0,0 +1,62 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define VECT_SIZE1 + +#include "include/constants.h" +#include "include/kernel_vendor.h" +#include "types_amd.c" + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) amp (__global pw_t *pws, __global pw_t *pws_amp, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, const u32 combs_mode, const u32 gid_max) +{ + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + const u32 pw_len = pws[gid].pw_len; + + u32x w0[4]; + u32x w1[4]; + u32x w2[4]; + u32x w3[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + w2[0] = pws[gid].i[ 8]; + w2[1] = pws[gid].i[ 9]; + w2[2] = pws[gid].i[10]; + w2[3] = pws[gid].i[11]; + w3[0] = pws[gid].i[12]; + w3[1] = pws[gid].i[13]; + w3[2] = pws[gid].i[14]; + w3[3] = pws[gid].i[15]; + + const u32 w0r = bfs_buf[0].i; + + pws_amp[gid].i[ 0] = w0[0] | w0r; + pws_amp[gid].i[ 1] = w0[1]; + pws_amp[gid].i[ 2] = w0[2]; + pws_amp[gid].i[ 3] = w0[3]; + pws_amp[gid].i[ 4] = w1[0]; + pws_amp[gid].i[ 5] = w1[1]; + pws_amp[gid].i[ 6] = w1[2]; + pws_amp[gid].i[ 7] = w1[3]; + pws_amp[gid].i[ 8] = w2[0]; + pws_amp[gid].i[ 9] = w2[1]; + pws_amp[gid].i[10] = w2[2]; + pws_amp[gid].i[11] = w2[3]; + pws_amp[gid].i[12] = w3[0]; + pws_amp[gid].i[13] = w3[1]; + pws_amp[gid].i[14] = w3[2]; + pws_amp[gid].i[15] = w3[3]; + + pws_amp[gid].pw_len = pw_len; +} diff --git a/amd/amp_a3_v2.cl b/amd/amp_a3_v2.cl new file mode 100644 index 0000000000..0e11f871de --- /dev/null +++ b/amd/amp_a3_v2.cl @@ -0,0 +1,62 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define VECT_SIZE2 + +#include "include/constants.h" +#include "include/kernel_vendor.h" +#include "types_amd.c" + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) amp (__global pw_t *pws, __global pw_t *pws_amp, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, const u32 combs_mode, const u32 gid_max) +{ + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + const u32 pw_len = pws[gid].pw_len; + + u32x w0[4]; + u32x w1[4]; + u32x w2[4]; + u32x w3[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + w2[0] = pws[gid].i[ 8]; + w2[1] = pws[gid].i[ 9]; + w2[2] = pws[gid].i[10]; + w2[3] = pws[gid].i[11]; + w3[0] = pws[gid].i[12]; + w3[1] = pws[gid].i[13]; + w3[2] = pws[gid].i[14]; + w3[3] = pws[gid].i[15]; + + const u32 w0r = bfs_buf[0].i; + + pws_amp[gid].i[ 0] = w0[0] | w0r; + pws_amp[gid].i[ 1] = w0[1]; + pws_amp[gid].i[ 2] = w0[2]; + pws_amp[gid].i[ 3] = w0[3]; + pws_amp[gid].i[ 4] = w1[0]; + pws_amp[gid].i[ 5] = w1[1]; + pws_amp[gid].i[ 6] = w1[2]; + pws_amp[gid].i[ 7] = w1[3]; + pws_amp[gid].i[ 8] = w2[0]; + pws_amp[gid].i[ 9] = w2[1]; + pws_amp[gid].i[10] = w2[2]; + pws_amp[gid].i[11] = w2[3]; + pws_amp[gid].i[12] = w3[0]; + pws_amp[gid].i[13] = w3[1]; + pws_amp[gid].i[14] = w3[2]; + pws_amp[gid].i[15] = w3[3]; + + pws_amp[gid].pw_len = pw_len; +} diff --git a/amd/amp_a3_v4.cl b/amd/amp_a3_v4.cl new file mode 100644 index 0000000000..187d950c7d --- /dev/null +++ b/amd/amp_a3_v4.cl @@ -0,0 +1,62 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define VECT_SIZE4 + +#include "include/constants.h" +#include "include/kernel_vendor.h" +#include "types_amd.c" + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) amp (__global pw_t *pws, __global pw_t *pws_amp, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, const u32 combs_mode, const u32 gid_max) +{ + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + const u32 pw_len = pws[gid].pw_len; + + u32x w0[4]; + u32x w1[4]; + u32x w2[4]; + u32x w3[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + w2[0] = pws[gid].i[ 8]; + w2[1] = pws[gid].i[ 9]; + w2[2] = pws[gid].i[10]; + w2[3] = pws[gid].i[11]; + w3[0] = pws[gid].i[12]; + w3[1] = pws[gid].i[13]; + w3[2] = pws[gid].i[14]; + w3[3] = pws[gid].i[15]; + + const u32 w0r = bfs_buf[0].i; + + pws_amp[gid].i[ 0] = w0[0] | w0r; + pws_amp[gid].i[ 1] = w0[1]; + pws_amp[gid].i[ 2] = w0[2]; + pws_amp[gid].i[ 3] = w0[3]; + pws_amp[gid].i[ 4] = w1[0]; + pws_amp[gid].i[ 5] = w1[1]; + pws_amp[gid].i[ 6] = w1[2]; + pws_amp[gid].i[ 7] = w1[3]; + pws_amp[gid].i[ 8] = w2[0]; + pws_amp[gid].i[ 9] = w2[1]; + pws_amp[gid].i[10] = w2[2]; + pws_amp[gid].i[11] = w2[3]; + pws_amp[gid].i[12] = w3[0]; + pws_amp[gid].i[13] = w3[1]; + pws_amp[gid].i[14] = w3[2]; + pws_amp[gid].i[15] = w3[3]; + + pws_amp[gid].pw_len = pw_len; +} diff --git a/amd/check_multi_vect1_comp4.c b/amd/check_multi_vect1_comp4.c new file mode 100644 index 0000000000..b1eadac267 --- /dev/null +++ b/amd/check_multi_vect1_comp4.c @@ -0,0 +1,34 @@ +u32 digest_tp[4]; + +digest_tp[0] = r0; +digest_tp[1] = r1; +digest_tp[2] = r2; +digest_tp[3] = r3; + +if (check (digest_tp, + bitmaps_buf_s1_a, + bitmaps_buf_s1_b, + bitmaps_buf_s1_c, + bitmaps_buf_s1_d, + bitmaps_buf_s2_a, + bitmaps_buf_s2_b, + bitmaps_buf_s2_c, + bitmaps_buf_s2_d, + bitmap_mask, + bitmap_shift1, + bitmap_shift2)) +{ + int hash_pos = find_hash (digest_tp, digests_cnt, &digests_buf[digests_offset]); + + if (hash_pos != -1) + { + const u32 final_hash_pos = digests_offset + hash_pos; + + if (atomic_add (&hashes_shown[final_hash_pos], 1) == 0) + { + mark_hash_s0 (plains_buf, hashes_shown, final_hash_pos, gid, il_pos); + + d_return_buf[lid] = 1; + } + } +} diff --git a/amd/check_multi_vect1_comp4_warp.c b/amd/check_multi_vect1_comp4_warp.c new file mode 100644 index 0000000000..b512a7100b --- /dev/null +++ b/amd/check_multi_vect1_comp4_warp.c @@ -0,0 +1,34 @@ +u32 digest_tp[4]; + +digest_tp[0] = r0; +digest_tp[1] = r1; +digest_tp[2] = r2; +digest_tp[3] = r3; + +if (check (digest_tp, + bitmaps_buf_s1_a, + bitmaps_buf_s1_b, + bitmaps_buf_s1_c, + bitmaps_buf_s1_d, + bitmaps_buf_s2_a, + bitmaps_buf_s2_b, + bitmaps_buf_s2_c, + bitmaps_buf_s2_d, + bitmap_mask, + bitmap_shift1, + bitmap_shift2)) +{ + int hash_pos = find_hash (digest_tp, digests_cnt, &digests_buf[digests_offset]); + + if (hash_pos != -1) + { + const u32 final_hash_pos = digests_offset + hash_pos; + + if ((atomic_add (&hashes_shown[final_hash_pos], 1) == 0) && (check_vector_accessible (il_pos, bf_loops, bfs_cnt, 0) == 1)) + { + mark_hash_s0_warp (plains_buf, hashes_shown, final_hash_pos, gid, il_pos); + + d_return_buf[lid] = 1; + } + } +} diff --git a/amd/check_multi_vect1_comp4_warp_bs.c b/amd/check_multi_vect1_comp4_warp_bs.c new file mode 100644 index 0000000000..735bee1638 --- /dev/null +++ b/amd/check_multi_vect1_comp4_warp_bs.c @@ -0,0 +1,34 @@ +u32 digest_tp[4]; + +digest_tp[0] = r0; +digest_tp[1] = r1; +digest_tp[2] = r2; +digest_tp[3] = r3; + +if (check (digest_tp, + bitmaps_buf_s1_a, + bitmaps_buf_s1_b, + bitmaps_buf_s1_c, + bitmaps_buf_s1_d, + bitmaps_buf_s2_a, + bitmaps_buf_s2_b, + bitmaps_buf_s2_c, + bitmaps_buf_s2_d, + bitmap_mask, + bitmap_shift1, + bitmap_shift2)) +{ + int hash_pos = find_hash (digest_tp, digests_cnt, &digests_buf[digests_offset]); + + if (hash_pos != -1) + { + const u32 final_hash_pos = digests_offset + hash_pos; + + if ((atomic_add (&hashes_shown[final_hash_pos], 1) == 0) && (check_vector_accessible (il_pos + slice, bf_loops, bfs_cnt, 0) == 1)) + { + mark_hash_s0_warp (plains_buf, hashes_shown, final_hash_pos, gid, il_pos + slice); + + d_return_buf[lid] = 1; + } + } +} diff --git a/amd/check_multi_vect2_comp4.c b/amd/check_multi_vect2_comp4.c new file mode 100644 index 0000000000..7264c9e79a --- /dev/null +++ b/amd/check_multi_vect2_comp4.c @@ -0,0 +1,67 @@ +u32 digest_tp[4]; + +digest_tp[0] = r0.s0; +digest_tp[1] = r1.s0; +digest_tp[2] = r2.s0; +digest_tp[3] = r3.s0; + +if (check (digest_tp, + bitmaps_buf_s1_a, + bitmaps_buf_s1_b, + bitmaps_buf_s1_c, + bitmaps_buf_s1_d, + bitmaps_buf_s2_a, + bitmaps_buf_s2_b, + bitmaps_buf_s2_c, + bitmaps_buf_s2_d, + bitmap_mask, + bitmap_shift1, + bitmap_shift2)) +{ + int hash_pos = find_hash (digest_tp, digests_cnt, &digests_buf[digests_offset]); + + if (hash_pos != -1) + { + const u32 final_hash_pos = digests_offset + hash_pos; + + if (atomic_add (&hashes_shown[final_hash_pos], 1) == 0) + { + mark_hash_s0 (plains_buf, hashes_shown, final_hash_pos, gid, il_pos); + + d_return_buf[lid] = 1; + } + } +} + +digest_tp[0] = r0.s1; +digest_tp[1] = r1.s1; +digest_tp[2] = r2.s1; +digest_tp[3] = r3.s1; + +if (check (digest_tp, + bitmaps_buf_s1_a, + bitmaps_buf_s1_b, + bitmaps_buf_s1_c, + bitmaps_buf_s1_d, + bitmaps_buf_s2_a, + bitmaps_buf_s2_b, + bitmaps_buf_s2_c, + bitmaps_buf_s2_d, + bitmap_mask, + bitmap_shift1, + bitmap_shift2)) +{ + int hash_pos = find_hash (digest_tp, digests_cnt, &digests_buf[digests_offset]); + + if (hash_pos != -1) + { + const u32 final_hash_pos = digests_offset + hash_pos; + + if (atomic_add (&hashes_shown[final_hash_pos], 1) == 0) + { + mark_hash_s1 (plains_buf, hashes_shown, final_hash_pos, gid, il_pos); + + d_return_buf[lid] = 1; + } + } +} diff --git a/amd/check_multi_vect2_comp4_warp.c b/amd/check_multi_vect2_comp4_warp.c new file mode 100644 index 0000000000..b028667330 --- /dev/null +++ b/amd/check_multi_vect2_comp4_warp.c @@ -0,0 +1,67 @@ +u32 digest_tp[4]; + +digest_tp[0] = r0.s0; +digest_tp[1] = r1.s0; +digest_tp[2] = r2.s0; +digest_tp[3] = r3.s0; + +if (check (digest_tp, + bitmaps_buf_s1_a, + bitmaps_buf_s1_b, + bitmaps_buf_s1_c, + bitmaps_buf_s1_d, + bitmaps_buf_s2_a, + bitmaps_buf_s2_b, + bitmaps_buf_s2_c, + bitmaps_buf_s2_d, + bitmap_mask, + bitmap_shift1, + bitmap_shift2)) +{ + int hash_pos = find_hash (digest_tp, digests_cnt, &digests_buf[digests_offset]); + + if (hash_pos != -1) + { + const u32 final_hash_pos = digests_offset + hash_pos; + + if ((atomic_add (&hashes_shown[final_hash_pos], 1) == 0) && (check_vector_accessible (il_pos, bf_loops, bfs_cnt, 0) == 1)) + { + mark_hash_s0_warp (plains_buf, hashes_shown, final_hash_pos, gid, il_pos); + + d_return_buf[lid] = 1; + } + } +} + +digest_tp[0] = r0.s1; +digest_tp[1] = r1.s1; +digest_tp[2] = r2.s1; +digest_tp[3] = r3.s1; + +if (check (digest_tp, + bitmaps_buf_s1_a, + bitmaps_buf_s1_b, + bitmaps_buf_s1_c, + bitmaps_buf_s1_d, + bitmaps_buf_s2_a, + bitmaps_buf_s2_b, + bitmaps_buf_s2_c, + bitmaps_buf_s2_d, + bitmap_mask, + bitmap_shift1, + bitmap_shift2)) +{ + int hash_pos = find_hash (digest_tp, digests_cnt, &digests_buf[digests_offset]); + + if (hash_pos != -1) + { + const u32 final_hash_pos = digests_offset + hash_pos; + + if ((atomic_add (&hashes_shown[final_hash_pos], 1) == 0) && (check_vector_accessible (il_pos, bf_loops, bfs_cnt, 1) == 1)) + { + mark_hash_s1_warp (plains_buf, hashes_shown, final_hash_pos, gid, il_pos); + + d_return_buf[lid] = 1; + } + } +} diff --git a/amd/check_multi_vect4_comp4.c b/amd/check_multi_vect4_comp4.c new file mode 100644 index 0000000000..ec104c6c01 --- /dev/null +++ b/amd/check_multi_vect4_comp4.c @@ -0,0 +1,133 @@ +u32 digest_tp[4]; + +digest_tp[0] = r0.s0; +digest_tp[1] = r1.s0; +digest_tp[2] = r2.s0; +digest_tp[3] = r3.s0; + +if (check (digest_tp, + bitmaps_buf_s1_a, + bitmaps_buf_s1_b, + bitmaps_buf_s1_c, + bitmaps_buf_s1_d, + bitmaps_buf_s2_a, + bitmaps_buf_s2_b, + bitmaps_buf_s2_c, + bitmaps_buf_s2_d, + bitmap_mask, + bitmap_shift1, + bitmap_shift2)) +{ + int hash_pos = find_hash (digest_tp, digests_cnt, &digests_buf[digests_offset]); + + if (hash_pos != -1) + { + const u32 final_hash_pos = digests_offset + hash_pos; + + if (atomic_add (&hashes_shown[final_hash_pos], 1) == 0) + { + mark_hash_s0 (plains_buf, hashes_shown, final_hash_pos, gid, il_pos); + + d_return_buf[lid] = 1; + } + } +} + +digest_tp[0] = r0.s1; +digest_tp[1] = r1.s1; +digest_tp[2] = r2.s1; +digest_tp[3] = r3.s1; + +if (check (digest_tp, + bitmaps_buf_s1_a, + bitmaps_buf_s1_b, + bitmaps_buf_s1_c, + bitmaps_buf_s1_d, + bitmaps_buf_s2_a, + bitmaps_buf_s2_b, + bitmaps_buf_s2_c, + bitmaps_buf_s2_d, + bitmap_mask, + bitmap_shift1, + bitmap_shift2)) +{ + int hash_pos = find_hash (digest_tp, digests_cnt, &digests_buf[digests_offset]); + + if (hash_pos != -1) + { + const u32 final_hash_pos = digests_offset + hash_pos; + + if (atomic_add (&hashes_shown[final_hash_pos], 1) == 0) + { + mark_hash_s1 (plains_buf, hashes_shown, final_hash_pos, gid, il_pos); + + d_return_buf[lid] = 1; + } + } +} + +digest_tp[0] = r0.s2; +digest_tp[1] = r1.s2; +digest_tp[2] = r2.s2; +digest_tp[3] = r3.s2; + +if (check (digest_tp, + bitmaps_buf_s1_a, + bitmaps_buf_s1_b, + bitmaps_buf_s1_c, + bitmaps_buf_s1_d, + bitmaps_buf_s2_a, + bitmaps_buf_s2_b, + bitmaps_buf_s2_c, + bitmaps_buf_s2_d, + bitmap_mask, + bitmap_shift1, + bitmap_shift2)) +{ + int hash_pos = find_hash (digest_tp, digests_cnt, &digests_buf[digests_offset]); + + if (hash_pos != -1) + { + const u32 final_hash_pos = digests_offset + hash_pos; + + if (atomic_add (&hashes_shown[final_hash_pos], 1) == 0) + { + mark_hash_s2 (plains_buf, hashes_shown, final_hash_pos, gid, il_pos); + + d_return_buf[lid] = 1; + } + } +} + +digest_tp[0] = r0.s3; +digest_tp[1] = r1.s3; +digest_tp[2] = r2.s3; +digest_tp[3] = r3.s3; + +if (check (digest_tp, + bitmaps_buf_s1_a, + bitmaps_buf_s1_b, + bitmaps_buf_s1_c, + bitmaps_buf_s1_d, + bitmaps_buf_s2_a, + bitmaps_buf_s2_b, + bitmaps_buf_s2_c, + bitmaps_buf_s2_d, + bitmap_mask, + bitmap_shift1, + bitmap_shift2)) +{ + int hash_pos = find_hash (digest_tp, digests_cnt, &digests_buf[digests_offset]); + + if (hash_pos != -1) + { + const u32 final_hash_pos = digests_offset + hash_pos; + + if (atomic_add (&hashes_shown[final_hash_pos], 1) == 0) + { + mark_hash_s3 (plains_buf, hashes_shown, final_hash_pos, gid, il_pos); + + d_return_buf[lid] = 1; + } + } +} diff --git a/amd/check_multi_vect4_comp4_warp.c b/amd/check_multi_vect4_comp4_warp.c new file mode 100644 index 0000000000..00e732f586 --- /dev/null +++ b/amd/check_multi_vect4_comp4_warp.c @@ -0,0 +1,133 @@ +u32 digest_tp[4]; + +digest_tp[0] = r0.s0; +digest_tp[1] = r1.s0; +digest_tp[2] = r2.s0; +digest_tp[3] = r3.s0; + +if (check (digest_tp, + bitmaps_buf_s1_a, + bitmaps_buf_s1_b, + bitmaps_buf_s1_c, + bitmaps_buf_s1_d, + bitmaps_buf_s2_a, + bitmaps_buf_s2_b, + bitmaps_buf_s2_c, + bitmaps_buf_s2_d, + bitmap_mask, + bitmap_shift1, + bitmap_shift2)) +{ + int hash_pos = find_hash (digest_tp, digests_cnt, &digests_buf[digests_offset]); + + if (hash_pos != -1) + { + const u32 final_hash_pos = digests_offset + hash_pos; + + if ((atomic_add (&hashes_shown[final_hash_pos], 1) == 0) && (check_vector_accessible (il_pos, bf_loops, bfs_cnt, 0) == 1)) + { + mark_hash_s0_warp (plains_buf, hashes_shown, final_hash_pos, gid, il_pos); + + d_return_buf[lid] = 1; + } + } +} + +digest_tp[0] = r0.s1; +digest_tp[1] = r1.s1; +digest_tp[2] = r2.s1; +digest_tp[3] = r3.s1; + +if (check (digest_tp, + bitmaps_buf_s1_a, + bitmaps_buf_s1_b, + bitmaps_buf_s1_c, + bitmaps_buf_s1_d, + bitmaps_buf_s2_a, + bitmaps_buf_s2_b, + bitmaps_buf_s2_c, + bitmaps_buf_s2_d, + bitmap_mask, + bitmap_shift1, + bitmap_shift2)) +{ + int hash_pos = find_hash (digest_tp, digests_cnt, &digests_buf[digests_offset]); + + if (hash_pos != -1) + { + const u32 final_hash_pos = digests_offset + hash_pos; + + if ((atomic_add (&hashes_shown[final_hash_pos], 1) == 0) && (check_vector_accessible (il_pos, bf_loops, bfs_cnt, 1) == 1)) + { + mark_hash_s1_warp (plains_buf, hashes_shown, final_hash_pos, gid, il_pos); + + d_return_buf[lid] = 1; + } + } +} + +digest_tp[0] = r0.s2; +digest_tp[1] = r1.s2; +digest_tp[2] = r2.s2; +digest_tp[3] = r3.s2; + +if (check (digest_tp, + bitmaps_buf_s1_a, + bitmaps_buf_s1_b, + bitmaps_buf_s1_c, + bitmaps_buf_s1_d, + bitmaps_buf_s2_a, + bitmaps_buf_s2_b, + bitmaps_buf_s2_c, + bitmaps_buf_s2_d, + bitmap_mask, + bitmap_shift1, + bitmap_shift2)) +{ + int hash_pos = find_hash (digest_tp, digests_cnt, &digests_buf[digests_offset]); + + if (hash_pos != -1) + { + const u32 final_hash_pos = digests_offset + hash_pos; + + if ((atomic_add (&hashes_shown[final_hash_pos], 1) == 0) && (check_vector_accessible (il_pos, bf_loops, bfs_cnt, 2) == 1)) + { + mark_hash_s2_warp (plains_buf, hashes_shown, final_hash_pos, gid, il_pos); + + d_return_buf[lid] = 1; + } + } +} + +digest_tp[0] = r0.s3; +digest_tp[1] = r1.s3; +digest_tp[2] = r2.s3; +digest_tp[3] = r3.s3; + +if (check (digest_tp, + bitmaps_buf_s1_a, + bitmaps_buf_s1_b, + bitmaps_buf_s1_c, + bitmaps_buf_s1_d, + bitmaps_buf_s2_a, + bitmaps_buf_s2_b, + bitmaps_buf_s2_c, + bitmaps_buf_s2_d, + bitmap_mask, + bitmap_shift1, + bitmap_shift2)) +{ + int hash_pos = find_hash (digest_tp, digests_cnt, &digests_buf[digests_offset]); + + if (hash_pos != -1) + { + const u32 final_hash_pos = digests_offset + hash_pos; + + if ((atomic_add (&hashes_shown[final_hash_pos], 1) == 0) && (check_vector_accessible (il_pos, bf_loops, bfs_cnt, 3) == 1)) + { + mark_hash_s3_warp (plains_buf, hashes_shown, final_hash_pos, gid, il_pos); + + d_return_buf[lid] = 1; + } + } +} diff --git a/amd/check_single_vect1_comp4.c b/amd/check_single_vect1_comp4.c new file mode 100644 index 0000000000..bc7c51faa1 --- /dev/null +++ b/amd/check_single_vect1_comp4.c @@ -0,0 +1,14 @@ +if ((r0 == search[0]) + && (r1 == search[1]) + && (r2 == search[2]) + && (r3 == search[3])) +{ + const u32 final_hash_pos = digests_offset + 0; + + if (atomic_add (&hashes_shown[final_hash_pos], 1) == 0) + { + mark_hash_s0 (plains_buf, hashes_shown, final_hash_pos, gid, il_pos); + + d_return_buf[lid] = 1; + } +} diff --git a/amd/check_single_vect1_comp4_warp.c b/amd/check_single_vect1_comp4_warp.c new file mode 100644 index 0000000000..9672b3cd57 --- /dev/null +++ b/amd/check_single_vect1_comp4_warp.c @@ -0,0 +1,14 @@ +if ((r0 == search[0]) + && (r1 == search[1]) + && (r2 == search[2]) + && (r3 == search[3])) +{ + const u32 final_hash_pos = digests_offset + 0; + + if ((atomic_add (&hashes_shown[final_hash_pos], 1) == 0) && (check_vector_accessible (il_pos, bf_loops, bfs_cnt, 0) == 1)) + { + mark_hash_s0_warp (plains_buf, hashes_shown, final_hash_pos, gid, il_pos); + + d_return_buf[lid] = 1; + } +} diff --git a/amd/check_single_vect1_comp4_warp_bs.c b/amd/check_single_vect1_comp4_warp_bs.c new file mode 100644 index 0000000000..3d5729f617 --- /dev/null +++ b/amd/check_single_vect1_comp4_warp_bs.c @@ -0,0 +1,3 @@ +mark_hash_s0_warp (plains_buf, hashes_shown, 0, gid, il_pos + slice); + +d_return_buf[lid] = 1; diff --git a/amd/check_single_vect2_comp4.c b/amd/check_single_vect2_comp4.c new file mode 100644 index 0000000000..3ae8c7d136 --- /dev/null +++ b/amd/check_single_vect2_comp4.c @@ -0,0 +1,29 @@ +if ((r0.s0 == search[0]) + && (r1.s0 == search[1]) + && (r2.s0 == search[2]) + && (r3.s0 == search[3])) +{ + const u32 final_hash_pos = digests_offset + 0; + + if (atomic_add (&hashes_shown[final_hash_pos], 1) == 0) + { + mark_hash_s0 (plains_buf, hashes_shown, final_hash_pos, gid, il_pos); + + d_return_buf[lid] = 1; + } +} + +if ((r0.s1 == search[0]) + && (r1.s1 == search[1]) + && (r2.s1 == search[2]) + && (r3.s1 == search[3])) +{ + const u32 final_hash_pos = digests_offset + 0; + + if (atomic_add (&hashes_shown[final_hash_pos], 1) == 0) + { + mark_hash_s1 (plains_buf, hashes_shown, final_hash_pos, gid, il_pos); + + d_return_buf[lid] = 1; + } +} diff --git a/amd/check_single_vect2_comp4_warp.c b/amd/check_single_vect2_comp4_warp.c new file mode 100644 index 0000000000..67c306e316 --- /dev/null +++ b/amd/check_single_vect2_comp4_warp.c @@ -0,0 +1,29 @@ +if ((r0.s0 == search[0]) + && (r1.s0 == search[1]) + && (r2.s0 == search[2]) + && (r3.s0 == search[3])) +{ + const u32 final_hash_pos = digests_offset + 0; + + if ((atomic_add (&hashes_shown[final_hash_pos], 1) == 0) && (check_vector_accessible (il_pos, bf_loops, bfs_cnt, 0) == 1)) + { + mark_hash_s0_warp (plains_buf, hashes_shown, final_hash_pos, gid, il_pos); + + d_return_buf[lid] = 1; + } +} + +if ((r0.s1 == search[0]) + && (r1.s1 == search[1]) + && (r2.s1 == search[2]) + && (r3.s1 == search[3])) +{ + const u32 final_hash_pos = digests_offset + 0; + + if ((atomic_add (&hashes_shown[final_hash_pos], 1) == 0) && (check_vector_accessible (il_pos, bf_loops, bfs_cnt, 1) == 1)) + { + mark_hash_s1_warp (plains_buf, hashes_shown, final_hash_pos, gid, il_pos); + + d_return_buf[lid] = 1; + } +} diff --git a/amd/check_single_vect4_comp4.c b/amd/check_single_vect4_comp4.c new file mode 100644 index 0000000000..029a9a92b8 --- /dev/null +++ b/amd/check_single_vect4_comp4.c @@ -0,0 +1,59 @@ +if ((r0.s0 == search[0]) + && (r1.s0 == search[1]) + && (r2.s0 == search[2]) + && (r3.s0 == search[3])) +{ + const u32 final_hash_pos = digests_offset + 0; + + if (atomic_add (&hashes_shown[final_hash_pos], 1) == 0) + { + mark_hash_s0 (plains_buf, hashes_shown, final_hash_pos, gid, il_pos); + + d_return_buf[lid] = 1; + } +} + +if ((r0.s1 == search[0]) + && (r1.s1 == search[1]) + && (r2.s1 == search[2]) + && (r3.s1 == search[3])) +{ + const u32 final_hash_pos = digests_offset + 0; + + if (atomic_add (&hashes_shown[final_hash_pos], 1) == 0) + { + mark_hash_s1 (plains_buf, hashes_shown, final_hash_pos, gid, il_pos); + + d_return_buf[lid] = 1; + } +} + +if ((r0.s2 == search[0]) + && (r1.s2 == search[1]) + && (r2.s2 == search[2]) + && (r3.s2 == search[3])) +{ + const u32 final_hash_pos = digests_offset + 0; + + if (atomic_add (&hashes_shown[final_hash_pos], 1) == 0) + { + mark_hash_s2 (plains_buf, hashes_shown, final_hash_pos, gid, il_pos); + + d_return_buf[lid] = 1; + } +} + +if ((r0.s3 == search[0]) + && (r1.s3 == search[1]) + && (r2.s3 == search[2]) + && (r3.s3 == search[3])) +{ + const u32 final_hash_pos = digests_offset + 0; + + if (atomic_add (&hashes_shown[final_hash_pos], 1) == 0) + { + mark_hash_s3 (plains_buf, hashes_shown, final_hash_pos, gid, il_pos); + + d_return_buf[lid] = 1; + } +} diff --git a/amd/check_single_vect4_comp4_warp.c b/amd/check_single_vect4_comp4_warp.c new file mode 100644 index 0000000000..0e437822f9 --- /dev/null +++ b/amd/check_single_vect4_comp4_warp.c @@ -0,0 +1,59 @@ +if ((r0.s0 == search[0]) + && (r1.s0 == search[1]) + && (r2.s0 == search[2]) + && (r3.s0 == search[3])) +{ + const u32 final_hash_pos = digests_offset + 0; + + if ((atomic_add (&hashes_shown[final_hash_pos], 1) == 0) && (check_vector_accessible (il_pos, bf_loops, bfs_cnt, 0) == 1)) + { + mark_hash_s0_warp (plains_buf, hashes_shown, final_hash_pos, gid, il_pos); + + d_return_buf[lid] = 1; + } +} + +if ((r0.s1 == search[0]) + && (r1.s1 == search[1]) + && (r2.s1 == search[2]) + && (r3.s1 == search[3])) +{ + const u32 final_hash_pos = digests_offset + 0; + + if ((atomic_add (&hashes_shown[final_hash_pos], 1) == 0) && (check_vector_accessible (il_pos, bf_loops, bfs_cnt, 1) == 1)) + { + mark_hash_s1_warp (plains_buf, hashes_shown, final_hash_pos, gid, il_pos); + + d_return_buf[lid] = 1; + } +} + +if ((r0.s2 == search[0]) + && (r1.s2 == search[1]) + && (r2.s2 == search[2]) + && (r3.s2 == search[3])) +{ + const u32 final_hash_pos = digests_offset + 0; + + if ((atomic_add (&hashes_shown[final_hash_pos], 1) == 0) && (check_vector_accessible (il_pos, bf_loops, bfs_cnt, 2) == 1)) + { + mark_hash_s2_warp (plains_buf, hashes_shown, final_hash_pos, gid, il_pos); + + d_return_buf[lid] = 1; + } +} + +if ((r0.s3 == search[0]) + && (r1.s3 == search[1]) + && (r2.s3 == search[2]) + && (r3.s3 == search[3])) +{ + const u32 final_hash_pos = digests_offset + 0; + + if ((atomic_add (&hashes_shown[final_hash_pos], 1) == 0) && (check_vector_accessible (il_pos, bf_loops, bfs_cnt, 3) == 1)) + { + mark_hash_s3_warp (plains_buf, hashes_shown, final_hash_pos, gid, il_pos); + + d_return_buf[lid] = 1; + } +} diff --git a/amd/common_amd.c b/amd/common_amd.c new file mode 100644 index 0000000000..3ac5c85404 --- /dev/null +++ b/amd/common_amd.c @@ -0,0 +1,15303 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +static int device_memcmp (const u32 d1[4], __global u32 *d2) +{ + if (d1[3] > d2[DGST_R3]) return ( 1); + if (d1[3] < d2[DGST_R3]) return (-1); + if (d1[2] > d2[DGST_R2]) return ( 1); + if (d1[2] < d2[DGST_R2]) return (-1); + if (d1[1] > d2[DGST_R1]) return ( 1); + if (d1[1] < d2[DGST_R1]) return (-1); + if (d1[0] > d2[DGST_R0]) return ( 1); + if (d1[0] < d2[DGST_R0]) return (-1); + + return (0); +} + +static int find_hash (const u32 digest[4], const u32 digests_cnt, __global digest_t *digests_buf) +{ + for (u32 l = 0, r = digests_cnt; r; r >>= 1) + { + const u32 m = r >> 1; + + const u32 c = l + m; + + const int cmp = device_memcmp (digest, digests_buf[c].digest_buf); + + if (cmp > 0) + { + l += m + 1; + + r--; + } + + if (cmp == 0) return (c); + } + + return (-1); +} + +static u32 check_bitmap (__global u32 *bitmap, const u32 bitmap_mask, const u32 bitmap_shift, const u32 digest) +{ + return (bitmap[(digest >> bitmap_shift) & bitmap_mask] & (1 << (digest & 0x1f))); +} + +static u32 check (const u32 digest[2], __global u32 *bitmap_s1_a, __global u32 *bitmap_s1_b, __global u32 *bitmap_s1_c, __global u32 *bitmap_s1_d, __global u32 *bitmap_s2_a, __global u32 *bitmap_s2_b, __global u32 *bitmap_s2_c, __global u32 *bitmap_s2_d, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2) +{ + if (check_bitmap (bitmap_s1_a, bitmap_mask, bitmap_shift1, digest[0]) == 0) return (0); + if (check_bitmap (bitmap_s1_b, bitmap_mask, bitmap_shift1, digest[1]) == 0) return (0); + if (check_bitmap (bitmap_s1_c, bitmap_mask, bitmap_shift1, digest[2]) == 0) return (0); + if (check_bitmap (bitmap_s1_d, bitmap_mask, bitmap_shift1, digest[3]) == 0) return (0); + + if (check_bitmap (bitmap_s2_a, bitmap_mask, bitmap_shift2, digest[0]) == 0) return (0); + if (check_bitmap (bitmap_s2_b, bitmap_mask, bitmap_shift2, digest[1]) == 0) return (0); + if (check_bitmap (bitmap_s2_c, bitmap_mask, bitmap_shift2, digest[2]) == 0) return (0); + if (check_bitmap (bitmap_s2_d, bitmap_mask, bitmap_shift2, digest[3]) == 0) return (0); + + return (1); +} + +#ifdef VECT_SIZE1 +static void mark_hash_s0 (__global plain_t *plains_buf, __global u32 *hashes_shown, const int hash_pos, const u32 gid, const u32 il_pos) +{ + hashes_shown[hash_pos] = 1; + + plains_buf[hash_pos].gidvid = (gid * 1) + 0; + plains_buf[hash_pos].il_pos = il_pos; +} + +static void mark_hash_s0_warp (__global plain_t *plains_buf, __global u32 *hashes_shown, const int hash_pos, const u32 gid, const u32 il_pos) +{ + hashes_shown[hash_pos] = 1; + + plains_buf[hash_pos].gidvid = gid; + plains_buf[hash_pos].il_pos = (il_pos * 1) + 0; +} +#endif + +#ifdef VECT_SIZE2 +static void mark_hash_s0 (__global plain_t *plains_buf, __global u32 *hashes_shown, const int hash_pos, const u32 gid, const u32 il_pos) +{ + hashes_shown[hash_pos] = 1; + + plains_buf[hash_pos].gidvid = (gid * 2) + 0; + plains_buf[hash_pos].il_pos = il_pos; +} + +static void mark_hash_s1 (__global plain_t *plains_buf, __global u32 *hashes_shown, const int hash_pos, const u32 gid, const u32 il_pos) +{ + hashes_shown[hash_pos] = 1; + + plains_buf[hash_pos].gidvid = (gid * 2) + 1; + plains_buf[hash_pos].il_pos = il_pos; +} + +static void mark_hash_s0_warp (__global plain_t *plains_buf, __global u32 *hashes_shown, const int hash_pos, const u32 gid, const u32 il_pos) +{ + hashes_shown[hash_pos] = 1; + + plains_buf[hash_pos].gidvid = gid; + plains_buf[hash_pos].il_pos = (il_pos * 2) + 0; +} + +static void mark_hash_s1_warp (__global plain_t *plains_buf, __global u32 *hashes_shown, const int hash_pos, const u32 gid, const u32 il_pos) +{ + hashes_shown[hash_pos] = 1; + + plains_buf[hash_pos].gidvid = gid; + plains_buf[hash_pos].il_pos = (il_pos * 2) + 1; +} +#endif + +#ifdef VECT_SIZE4 +static void mark_hash_s0 (__global plain_t *plains_buf, __global u32 *hashes_shown, const int hash_pos, const u32 gid, const u32 il_pos) +{ + hashes_shown[hash_pos] = 1; + + plains_buf[hash_pos].gidvid = (gid * 4) + 0; + plains_buf[hash_pos].il_pos = il_pos; +} + +static void mark_hash_s1 (__global plain_t *plains_buf, __global u32 *hashes_shown, const int hash_pos, const u32 gid, const u32 il_pos) +{ + hashes_shown[hash_pos] = 1; + + plains_buf[hash_pos].gidvid = (gid * 4) + 1; + plains_buf[hash_pos].il_pos = il_pos; +} + +static void mark_hash_s2 (__global plain_t *plains_buf, __global u32 *hashes_shown, const int hash_pos, const u32 gid, const u32 il_pos) +{ + hashes_shown[hash_pos] = 1; + + plains_buf[hash_pos].gidvid = (gid * 4) + 2; + plains_buf[hash_pos].il_pos = il_pos; +} + +static void mark_hash_s3 (__global plain_t *plains_buf, __global u32 *hashes_shown, const int hash_pos, const u32 gid, const u32 il_pos) +{ + hashes_shown[hash_pos] = 1; + + plains_buf[hash_pos].gidvid = (gid * 4) + 3; + plains_buf[hash_pos].il_pos = il_pos; +} + +static void mark_hash_s0_warp (__global plain_t *plains_buf, __global u32 *hashes_shown, const int hash_pos, const u32 gid, const u32 il_pos) +{ + hashes_shown[hash_pos] = 1; + + plains_buf[hash_pos].gidvid = gid; + plains_buf[hash_pos].il_pos = (il_pos * 4) + 0; +} + +static void mark_hash_s1_warp (__global plain_t *plains_buf, __global u32 *hashes_shown, const int hash_pos, const u32 gid, const u32 il_pos) +{ + hashes_shown[hash_pos] = 1; + + plains_buf[hash_pos].gidvid = gid; + plains_buf[hash_pos].il_pos = (il_pos * 4) + 1; +} + +static void mark_hash_s2_warp (__global plain_t *plains_buf, __global u32 *hashes_shown, const int hash_pos, const u32 gid, const u32 il_pos) +{ + hashes_shown[hash_pos] = 1; + + plains_buf[hash_pos].gidvid = gid; + plains_buf[hash_pos].il_pos = (il_pos * 4) + 2; +} + +static void mark_hash_s3_warp (__global plain_t *plains_buf, __global u32 *hashes_shown, const int hash_pos, const u32 gid, const u32 il_pos) +{ + hashes_shown[hash_pos] = 1; + + plains_buf[hash_pos].gidvid = gid; + plains_buf[hash_pos].il_pos = (il_pos * 4) + 3; +} +#endif + +/** + * scalar + */ + +static u32 swap_workaround (const u32 v) +{ + return (as_uint (as_uchar4 (v).s3210)); +} + +static u64 swap_workaround (const u64 v) +{ + return (as_ulong (as_uchar8 (v).s76543210)); +} + +static void truncate_block (u32 w[4], const u32 len) +{ + switch (len) + { + case 0: w[0] &= 0; + w[1] &= 0; + w[2] &= 0; + w[3] &= 0; + break; + case 1: w[0] &= 0x000000FF; + w[1] &= 0; + w[2] &= 0; + w[3] &= 0; + break; + case 2: w[0] &= 0x0000FFFF; + w[1] &= 0; + w[2] &= 0; + w[3] &= 0; + break; + case 3: w[0] &= 0x00FFFFFF; + w[1] &= 0; + w[2] &= 0; + w[3] &= 0; + break; + case 4: w[1] &= 0; + w[2] &= 0; + w[3] &= 0; + break; + case 5: w[1] &= 0x000000FF; + w[2] &= 0; + w[3] &= 0; + break; + case 6: w[1] &= 0x0000FFFF; + w[2] &= 0; + w[3] &= 0; + break; + case 7: w[1] &= 0x00FFFFFF; + w[2] &= 0; + w[3] &= 0; + break; + case 8: w[2] &= 0; + w[3] &= 0; + break; + case 9: w[2] &= 0x000000FF; + w[3] &= 0; + break; + case 10: w[2] &= 0x0000FFFF; + w[3] &= 0; + break; + case 11: w[2] &= 0x00FFFFFF; + w[3] &= 0; + break; + case 12: w[3] &= 0; + break; + case 13: w[3] &= 0x000000FF; + break; + case 14: w[3] &= 0x0000FFFF; + break; + case 15: w[3] &= 0x00FFFFFF; + break; + } +} + +static void make_unicode (const u32 in[4], u32 out1[4], u32 out2[4]) +{ + out2[3] = ((in[3] >> 8) & 0x00FF0000) | ((in[3] >> 16) & 0x000000FF); + out2[2] = ((in[3] << 8) & 0x00FF0000) | ((in[3] >> 0) & 0x000000FF); + out2[1] = ((in[2] >> 8) & 0x00FF0000) | ((in[2] >> 16) & 0x000000FF); + out2[0] = ((in[2] << 8) & 0x00FF0000) | ((in[2] >> 0) & 0x000000FF); + out1[3] = ((in[1] >> 8) & 0x00FF0000) | ((in[1] >> 16) & 0x000000FF); + out1[2] = ((in[1] << 8) & 0x00FF0000) | ((in[1] >> 0) & 0x000000FF); + out1[1] = ((in[0] >> 8) & 0x00FF0000) | ((in[0] >> 16) & 0x000000FF); + out1[0] = ((in[0] << 8) & 0x00FF0000) | ((in[0] >> 0) & 0x000000FF); +} + +static void undo_unicode (const u32 in1[4], const u32 in2[4], u32 out[4]) +{ + out[0] = ((in1[0] & 0x000000ff) >> 0) | ((in1[0] & 0x00ff0000) >> 8) + | ((in1[1] & 0x000000ff) << 16) | ((in1[1] & 0x00ff0000) << 8); + out[1] = ((in1[2] & 0x000000ff) >> 0) | ((in1[2] & 0x00ff0000) >> 8) + | ((in1[3] & 0x000000ff) << 16) | ((in1[3] & 0x00ff0000) << 8); + out[2] = ((in2[0] & 0x000000ff) >> 0) | ((in2[0] & 0x00ff0000) >> 8) + | ((in2[1] & 0x000000ff) << 16) | ((in2[1] & 0x00ff0000) << 8); + out[3] = ((in2[2] & 0x000000ff) >> 0) | ((in2[2] & 0x00ff0000) >> 8) + | ((in2[3] & 0x000000ff) << 16) | ((in2[3] & 0x00ff0000) << 8); +} + +static void append_0x01_1 (u32 w0[4], const u32 offset) +{ + switch (offset) + { + case 0: + w0[0] = 0x01; + break; + + case 1: + w0[0] = w0[0] | 0x0100; + break; + + case 2: + w0[0] = w0[0] | 0x010000; + break; + + case 3: + w0[0] = w0[0] | 0x01000000; + break; + + case 4: + w0[1] = 0x01; + break; + + case 5: + w0[1] = w0[1] | 0x0100; + break; + + case 6: + w0[1] = w0[1] | 0x010000; + break; + + case 7: + w0[1] = w0[1] | 0x01000000; + break; + + case 8: + w0[2] = 0x01; + break; + + case 9: + w0[2] = w0[2] | 0x0100; + break; + + case 10: + w0[2] = w0[2] | 0x010000; + break; + + case 11: + w0[2] = w0[2] | 0x01000000; + break; + + case 12: + w0[3] = 0x01; + break; + + case 13: + w0[3] = w0[3] | 0x0100; + break; + + case 14: + w0[3] = w0[3] | 0x010000; + break; + + case 15: + w0[3] = w0[3] | 0x01000000; + break; + } +} + +static void append_0x01_2 (u32 w0[4], u32 w1[4], const u32 offset) +{ + switch (offset) + { + case 0: + w0[0] = 0x01; + break; + + case 1: + w0[0] = w0[0] | 0x0100; + break; + + case 2: + w0[0] = w0[0] | 0x010000; + break; + + case 3: + w0[0] = w0[0] | 0x01000000; + break; + + case 4: + w0[1] = 0x01; + break; + + case 5: + w0[1] = w0[1] | 0x0100; + break; + + case 6: + w0[1] = w0[1] | 0x010000; + break; + + case 7: + w0[1] = w0[1] | 0x01000000; + break; + + case 8: + w0[2] = 0x01; + break; + + case 9: + w0[2] = w0[2] | 0x0100; + break; + + case 10: + w0[2] = w0[2] | 0x010000; + break; + + case 11: + w0[2] = w0[2] | 0x01000000; + break; + + case 12: + w0[3] = 0x01; + break; + + case 13: + w0[3] = w0[3] | 0x0100; + break; + + case 14: + w0[3] = w0[3] | 0x010000; + break; + + case 15: + w0[3] = w0[3] | 0x01000000; + break; + + case 16: + w1[0] = 0x01; + break; + + case 17: + w1[0] = w1[0] | 0x0100; + break; + + case 18: + w1[0] = w1[0] | 0x010000; + break; + + case 19: + w1[0] = w1[0] | 0x01000000; + break; + + case 20: + w1[1] = 0x01; + break; + + case 21: + w1[1] = w1[1] | 0x0100; + break; + + case 22: + w1[1] = w1[1] | 0x010000; + break; + + case 23: + w1[1] = w1[1] | 0x01000000; + break; + + case 24: + w1[2] = 0x01; + break; + + case 25: + w1[2] = w1[2] | 0x0100; + break; + + case 26: + w1[2] = w1[2] | 0x010000; + break; + + case 27: + w1[2] = w1[2] | 0x01000000; + break; + + case 28: + w1[3] = 0x01; + break; + + case 29: + w1[3] = w1[3] | 0x0100; + break; + + case 30: + w1[3] = w1[3] | 0x010000; + break; + + case 31: + w1[3] = w1[3] | 0x01000000; + break; + } +} + +static void append_0x01_3 (u32 w0[4], u32 w1[4], u32 w2[4], const u32 offset) +{ + switch (offset) + { + case 0: + w0[0] = 0x01; + break; + + case 1: + w0[0] = w0[0] | 0x0100; + break; + + case 2: + w0[0] = w0[0] | 0x010000; + break; + + case 3: + w0[0] = w0[0] | 0x01000000; + break; + + case 4: + w0[1] = 0x01; + break; + + case 5: + w0[1] = w0[1] | 0x0100; + break; + + case 6: + w0[1] = w0[1] | 0x010000; + break; + + case 7: + w0[1] = w0[1] | 0x01000000; + break; + + case 8: + w0[2] = 0x01; + break; + + case 9: + w0[2] = w0[2] | 0x0100; + break; + + case 10: + w0[2] = w0[2] | 0x010000; + break; + + case 11: + w0[2] = w0[2] | 0x01000000; + break; + + case 12: + w0[3] = 0x01; + break; + + case 13: + w0[3] = w0[3] | 0x0100; + break; + + case 14: + w0[3] = w0[3] | 0x010000; + break; + + case 15: + w0[3] = w0[3] | 0x01000000; + break; + + case 16: + w1[0] = 0x01; + break; + + case 17: + w1[0] = w1[0] | 0x0100; + break; + + case 18: + w1[0] = w1[0] | 0x010000; + break; + + case 19: + w1[0] = w1[0] | 0x01000000; + break; + + case 20: + w1[1] = 0x01; + break; + + case 21: + w1[1] = w1[1] | 0x0100; + break; + + case 22: + w1[1] = w1[1] | 0x010000; + break; + + case 23: + w1[1] = w1[1] | 0x01000000; + break; + + case 24: + w1[2] = 0x01; + break; + + case 25: + w1[2] = w1[2] | 0x0100; + break; + + case 26: + w1[2] = w1[2] | 0x010000; + break; + + case 27: + w1[2] = w1[2] | 0x01000000; + break; + + case 28: + w1[3] = 0x01; + break; + + case 29: + w1[3] = w1[3] | 0x0100; + break; + + case 30: + w1[3] = w1[3] | 0x010000; + break; + + case 31: + w1[3] = w1[3] | 0x01000000; + break; + + case 32: + w2[0] = 0x01; + break; + + case 33: + w2[0] = w2[0] | 0x0100; + break; + + case 34: + w2[0] = w2[0] | 0x010000; + break; + + case 35: + w2[0] = w2[0] | 0x01000000; + break; + + case 36: + w2[1] = 0x01; + break; + + case 37: + w2[1] = w2[1] | 0x0100; + break; + + case 38: + w2[1] = w2[1] | 0x010000; + break; + + case 39: + w2[1] = w2[1] | 0x01000000; + break; + + case 40: + w2[2] = 0x01; + break; + + case 41: + w2[2] = w2[2] | 0x0100; + break; + + case 42: + w2[2] = w2[2] | 0x010000; + break; + + case 43: + w2[2] = w2[2] | 0x01000000; + break; + + case 44: + w2[3] = 0x01; + break; + + case 45: + w2[3] = w2[3] | 0x0100; + break; + + case 46: + w2[3] = w2[3] | 0x010000; + break; + + case 47: + w2[3] = w2[3] | 0x01000000; + break; + } +} + +static void append_0x01_4 (u32 w0[4], u32 w1[4], u32 w2[4], u32 w3[4], const u32 offset) +{ + switch (offset) + { + case 0: + w0[0] = 0x01; + break; + + case 1: + w0[0] = w0[0] | 0x0100; + break; + + case 2: + w0[0] = w0[0] | 0x010000; + break; + + case 3: + w0[0] = w0[0] | 0x01000000; + break; + + case 4: + w0[1] = 0x01; + break; + + case 5: + w0[1] = w0[1] | 0x0100; + break; + + case 6: + w0[1] = w0[1] | 0x010000; + break; + + case 7: + w0[1] = w0[1] | 0x01000000; + break; + + case 8: + w0[2] = 0x01; + break; + + case 9: + w0[2] = w0[2] | 0x0100; + break; + + case 10: + w0[2] = w0[2] | 0x010000; + break; + + case 11: + w0[2] = w0[2] | 0x01000000; + break; + + case 12: + w0[3] = 0x01; + break; + + case 13: + w0[3] = w0[3] | 0x0100; + break; + + case 14: + w0[3] = w0[3] | 0x010000; + break; + + case 15: + w0[3] = w0[3] | 0x01000000; + break; + + case 16: + w1[0] = 0x01; + break; + + case 17: + w1[0] = w1[0] | 0x0100; + break; + + case 18: + w1[0] = w1[0] | 0x010000; + break; + + case 19: + w1[0] = w1[0] | 0x01000000; + break; + + case 20: + w1[1] = 0x01; + break; + + case 21: + w1[1] = w1[1] | 0x0100; + break; + + case 22: + w1[1] = w1[1] | 0x010000; + break; + + case 23: + w1[1] = w1[1] | 0x01000000; + break; + + case 24: + w1[2] = 0x01; + break; + + case 25: + w1[2] = w1[2] | 0x0100; + break; + + case 26: + w1[2] = w1[2] | 0x010000; + break; + + case 27: + w1[2] = w1[2] | 0x01000000; + break; + + case 28: + w1[3] = 0x01; + break; + + case 29: + w1[3] = w1[3] | 0x0100; + break; + + case 30: + w1[3] = w1[3] | 0x010000; + break; + + case 31: + w1[3] = w1[3] | 0x01000000; + break; + + case 32: + w2[0] = 0x01; + break; + + case 33: + w2[0] = w2[0] | 0x0100; + break; + + case 34: + w2[0] = w2[0] | 0x010000; + break; + + case 35: + w2[0] = w2[0] | 0x01000000; + break; + + case 36: + w2[1] = 0x01; + break; + + case 37: + w2[1] = w2[1] | 0x0100; + break; + + case 38: + w2[1] = w2[1] | 0x010000; + break; + + case 39: + w2[1] = w2[1] | 0x01000000; + break; + + case 40: + w2[2] = 0x01; + break; + + case 41: + w2[2] = w2[2] | 0x0100; + break; + + case 42: + w2[2] = w2[2] | 0x010000; + break; + + case 43: + w2[2] = w2[2] | 0x01000000; + break; + + case 44: + w2[3] = 0x01; + break; + + case 45: + w2[3] = w2[3] | 0x0100; + break; + + case 46: + w2[3] = w2[3] | 0x010000; + break; + + case 47: + w2[3] = w2[3] | 0x01000000; + break; + + case 48: + w3[0] = 0x01; + break; + + case 49: + w3[0] = w3[0] | 0x0100; + break; + + case 50: + w3[0] = w3[0] | 0x010000; + break; + + case 51: + w3[0] = w3[0] | 0x01000000; + break; + + case 52: + w3[1] = 0x01; + break; + + case 53: + w3[1] = w3[1] | 0x0100; + break; + + case 54: + w3[1] = w3[1] | 0x010000; + break; + + case 55: + w3[1] = w3[1] | 0x01000000; + break; + + case 56: + w3[2] = 0x01; + break; + + case 57: + w3[2] = w3[2] | 0x0100; + break; + + case 58: + w3[2] = w3[2] | 0x010000; + break; + + case 59: + w3[2] = w3[2] | 0x01000000; + break; + + case 60: + w3[3] = 0x01; + break; + + case 61: + w3[3] = w3[3] | 0x0100; + break; + + case 62: + w3[3] = w3[3] | 0x010000; + break; + + case 63: + w3[3] = w3[3] | 0x01000000; + break; + } +} + +static void append_0x01_8 (u32 w0[4], u32 w1[4], u32 w2[4], u32 w3[4], u32 w4[4], u32 w5[4], u32 w6[4], u32 w7[4], const u32 offset) +{ + switch (offset) + { + case 0: + w0[0] = 0x01; + break; + + case 1: + w0[0] = w0[0] | 0x0100; + break; + + case 2: + w0[0] = w0[0] | 0x010000; + break; + + case 3: + w0[0] = w0[0] | 0x01000000; + break; + + case 4: + w0[1] = 0x01; + break; + + case 5: + w0[1] = w0[1] | 0x0100; + break; + + case 6: + w0[1] = w0[1] | 0x010000; + break; + + case 7: + w0[1] = w0[1] | 0x01000000; + break; + + case 8: + w0[2] = 0x01; + break; + + case 9: + w0[2] = w0[2] | 0x0100; + break; + + case 10: + w0[2] = w0[2] | 0x010000; + break; + + case 11: + w0[2] = w0[2] | 0x01000000; + break; + + case 12: + w0[3] = 0x01; + break; + + case 13: + w0[3] = w0[3] | 0x0100; + break; + + case 14: + w0[3] = w0[3] | 0x010000; + break; + + case 15: + w0[3] = w0[3] | 0x01000000; + break; + + case 16: + w1[0] = 0x01; + break; + + case 17: + w1[0] = w1[0] | 0x0100; + break; + + case 18: + w1[0] = w1[0] | 0x010000; + break; + + case 19: + w1[0] = w1[0] | 0x01000000; + break; + + case 20: + w1[1] = 0x01; + break; + + case 21: + w1[1] = w1[1] | 0x0100; + break; + + case 22: + w1[1] = w1[1] | 0x010000; + break; + + case 23: + w1[1] = w1[1] | 0x01000000; + break; + + case 24: + w1[2] = 0x01; + break; + + case 25: + w1[2] = w1[2] | 0x0100; + break; + + case 26: + w1[2] = w1[2] | 0x010000; + break; + + case 27: + w1[2] = w1[2] | 0x01000000; + break; + + case 28: + w1[3] = 0x01; + break; + + case 29: + w1[3] = w1[3] | 0x0100; + break; + + case 30: + w1[3] = w1[3] | 0x010000; + break; + + case 31: + w1[3] = w1[3] | 0x01000000; + break; + + case 32: + w2[0] = 0x01; + break; + + case 33: + w2[0] = w2[0] | 0x0100; + break; + + case 34: + w2[0] = w2[0] | 0x010000; + break; + + case 35: + w2[0] = w2[0] | 0x01000000; + break; + + case 36: + w2[1] = 0x01; + break; + + case 37: + w2[1] = w2[1] | 0x0100; + break; + + case 38: + w2[1] = w2[1] | 0x010000; + break; + + case 39: + w2[1] = w2[1] | 0x01000000; + break; + + case 40: + w2[2] = 0x01; + break; + + case 41: + w2[2] = w2[2] | 0x0100; + break; + + case 42: + w2[2] = w2[2] | 0x010000; + break; + + case 43: + w2[2] = w2[2] | 0x01000000; + break; + + case 44: + w2[3] = 0x01; + break; + + case 45: + w2[3] = w2[3] | 0x0100; + break; + + case 46: + w2[3] = w2[3] | 0x010000; + break; + + case 47: + w2[3] = w2[3] | 0x01000000; + break; + + case 48: + w3[0] = 0x01; + break; + + case 49: + w3[0] = w3[0] | 0x0100; + break; + + case 50: + w3[0] = w3[0] | 0x010000; + break; + + case 51: + w3[0] = w3[0] | 0x01000000; + break; + + case 52: + w3[1] = 0x01; + break; + + case 53: + w3[1] = w3[1] | 0x0100; + break; + + case 54: + w3[1] = w3[1] | 0x010000; + break; + + case 55: + w3[1] = w3[1] | 0x01000000; + break; + + case 56: + w3[2] = 0x01; + break; + + case 57: + w3[2] = w3[2] | 0x0100; + break; + + case 58: + w3[2] = w3[2] | 0x010000; + break; + + case 59: + w3[2] = w3[2] | 0x01000000; + break; + + case 60: + w3[3] = 0x01; + break; + + case 61: + w3[3] = w3[3] | 0x0100; + break; + + case 62: + w3[3] = w3[3] | 0x010000; + break; + + case 63: + w3[3] = w3[3] | 0x01000000; + break; + + case 64: + w4[0] = 0x01; + break; + + case 65: + w4[0] = w4[0] | 0x0100; + break; + + case 66: + w4[0] = w4[0] | 0x010000; + break; + + case 67: + w4[0] = w4[0] | 0x01000000; + break; + + case 68: + w4[1] = 0x01; + break; + + case 69: + w4[1] = w4[1] | 0x0100; + break; + + case 70: + w4[1] = w4[1] | 0x010000; + break; + + case 71: + w4[1] = w4[1] | 0x01000000; + break; + + case 72: + w4[2] = 0x01; + break; + + case 73: + w4[2] = w4[2] | 0x0100; + break; + + case 74: + w4[2] = w4[2] | 0x010000; + break; + + case 75: + w4[2] = w4[2] | 0x01000000; + break; + + case 76: + w4[3] = 0x01; + break; + + case 77: + w4[3] = w4[3] | 0x0100; + break; + + case 78: + w4[3] = w4[3] | 0x010000; + break; + + case 79: + w4[3] = w4[3] | 0x01000000; + break; + + case 80: + w5[0] = 0x01; + break; + + case 81: + w5[0] = w5[0] | 0x0100; + break; + + case 82: + w5[0] = w5[0] | 0x010000; + break; + + case 83: + w5[0] = w5[0] | 0x01000000; + break; + + case 84: + w5[1] = 0x01; + break; + + case 85: + w5[1] = w5[1] | 0x0100; + break; + + case 86: + w5[1] = w5[1] | 0x010000; + break; + + case 87: + w5[1] = w5[1] | 0x01000000; + break; + + case 88: + w5[2] = 0x01; + break; + + case 89: + w5[2] = w5[2] | 0x0100; + break; + + case 90: + w5[2] = w5[2] | 0x010000; + break; + + case 91: + w5[2] = w5[2] | 0x01000000; + break; + + case 92: + w5[3] = 0x01; + break; + + case 93: + w5[3] = w5[3] | 0x0100; + break; + + case 94: + w5[3] = w5[3] | 0x010000; + break; + + case 95: + w5[3] = w5[3] | 0x01000000; + break; + + case 96: + w6[0] = 0x01; + break; + + case 97: + w6[0] = w6[0] | 0x0100; + break; + + case 98: + w6[0] = w6[0] | 0x010000; + break; + + case 99: + w6[0] = w6[0] | 0x01000000; + break; + + case 100: + w6[1] = 0x01; + break; + + case 101: + w6[1] = w6[1] | 0x0100; + break; + + case 102: + w6[1] = w6[1] | 0x010000; + break; + + case 103: + w6[1] = w6[1] | 0x01000000; + break; + + case 104: + w6[2] = 0x01; + break; + + case 105: + w6[2] = w6[2] | 0x0100; + break; + + case 106: + w6[2] = w6[2] | 0x010000; + break; + + case 107: + w6[2] = w6[2] | 0x01000000; + break; + + case 108: + w6[3] = 0x01; + break; + + case 109: + w6[3] = w6[3] | 0x0100; + break; + + case 110: + w6[3] = w6[3] | 0x010000; + break; + + case 111: + w6[3] = w6[3] | 0x01000000; + break; + + case 112: + w7[0] = 0x01; + break; + + case 113: + w7[0] = w7[0] | 0x0100; + break; + + case 114: + w7[0] = w7[0] | 0x010000; + break; + + case 115: + w7[0] = w7[0] | 0x01000000; + break; + + case 116: + w7[1] = 0x01; + break; + + case 117: + w7[1] = w7[1] | 0x0100; + break; + + case 118: + w7[1] = w7[1] | 0x010000; + break; + + case 119: + w7[1] = w7[1] | 0x01000000; + break; + + case 120: + w7[2] = 0x01; + break; + + case 121: + w7[2] = w7[2] | 0x0100; + break; + + case 122: + w7[2] = w7[2] | 0x010000; + break; + + case 123: + w7[2] = w7[2] | 0x01000000; + break; + + case 124: + w7[3] = 0x01; + break; + + case 125: + w7[3] = w7[3] | 0x0100; + break; + + case 126: + w7[3] = w7[3] | 0x010000; + break; + + case 127: + w7[3] = w7[3] | 0x01000000; + break; + } +} + +static void append_0x02_1 (u32 w0[4], const u32 offset) +{ + switch (offset) + { + case 0: + w0[0] = 0x02; + break; + + case 1: + w0[0] = w0[0] | 0x0200; + break; + + case 2: + w0[0] = w0[0] | 0x020000; + break; + + case 3: + w0[0] = w0[0] | 0x02000000; + break; + + case 4: + w0[1] = 0x02; + break; + + case 5: + w0[1] = w0[1] | 0x0200; + break; + + case 6: + w0[1] = w0[1] | 0x020000; + break; + + case 7: + w0[1] = w0[1] | 0x02000000; + break; + + case 8: + w0[2] = 0x02; + break; + + case 9: + w0[2] = w0[2] | 0x0200; + break; + + case 10: + w0[2] = w0[2] | 0x020000; + break; + + case 11: + w0[2] = w0[2] | 0x02000000; + break; + + case 12: + w0[3] = 0x02; + break; + + case 13: + w0[3] = w0[3] | 0x0200; + break; + + case 14: + w0[3] = w0[3] | 0x020000; + break; + + case 15: + w0[3] = w0[3] | 0x02000000; + break; + } +} + +static void append_0x02_2 (u32 w0[4], u32 w1[4], const u32 offset) +{ + switch (offset) + { + case 0: + w0[0] = 0x02; + break; + + case 1: + w0[0] = w0[0] | 0x0200; + break; + + case 2: + w0[0] = w0[0] | 0x020000; + break; + + case 3: + w0[0] = w0[0] | 0x02000000; + break; + + case 4: + w0[1] = 0x02; + break; + + case 5: + w0[1] = w0[1] | 0x0200; + break; + + case 6: + w0[1] = w0[1] | 0x020000; + break; + + case 7: + w0[1] = w0[1] | 0x02000000; + break; + + case 8: + w0[2] = 0x02; + break; + + case 9: + w0[2] = w0[2] | 0x0200; + break; + + case 10: + w0[2] = w0[2] | 0x020000; + break; + + case 11: + w0[2] = w0[2] | 0x02000000; + break; + + case 12: + w0[3] = 0x02; + break; + + case 13: + w0[3] = w0[3] | 0x0200; + break; + + case 14: + w0[3] = w0[3] | 0x020000; + break; + + case 15: + w0[3] = w0[3] | 0x02000000; + break; + + case 16: + w1[0] = 0x02; + break; + + case 17: + w1[0] = w1[0] | 0x0200; + break; + + case 18: + w1[0] = w1[0] | 0x020000; + break; + + case 19: + w1[0] = w1[0] | 0x02000000; + break; + + case 20: + w1[1] = 0x02; + break; + + case 21: + w1[1] = w1[1] | 0x0200; + break; + + case 22: + w1[1] = w1[1] | 0x020000; + break; + + case 23: + w1[1] = w1[1] | 0x02000000; + break; + + case 24: + w1[2] = 0x02; + break; + + case 25: + w1[2] = w1[2] | 0x0200; + break; + + case 26: + w1[2] = w1[2] | 0x020000; + break; + + case 27: + w1[2] = w1[2] | 0x02000000; + break; + + case 28: + w1[3] = 0x02; + break; + + case 29: + w1[3] = w1[3] | 0x0200; + break; + + case 30: + w1[3] = w1[3] | 0x020000; + break; + + case 31: + w1[3] = w1[3] | 0x02000000; + break; + } +} + +static void append_0x02_3 (u32 w0[4], u32 w1[4], u32 w2[4], const u32 offset) +{ + switch (offset) + { + case 0: + w0[0] = 0x02; + break; + + case 1: + w0[0] = w0[0] | 0x0200; + break; + + case 2: + w0[0] = w0[0] | 0x020000; + break; + + case 3: + w0[0] = w0[0] | 0x02000000; + break; + + case 4: + w0[1] = 0x02; + break; + + case 5: + w0[1] = w0[1] | 0x0200; + break; + + case 6: + w0[1] = w0[1] | 0x020000; + break; + + case 7: + w0[1] = w0[1] | 0x02000000; + break; + + case 8: + w0[2] = 0x02; + break; + + case 9: + w0[2] = w0[2] | 0x0200; + break; + + case 10: + w0[2] = w0[2] | 0x020000; + break; + + case 11: + w0[2] = w0[2] | 0x02000000; + break; + + case 12: + w0[3] = 0x02; + break; + + case 13: + w0[3] = w0[3] | 0x0200; + break; + + case 14: + w0[3] = w0[3] | 0x020000; + break; + + case 15: + w0[3] = w0[3] | 0x02000000; + break; + + case 16: + w1[0] = 0x02; + break; + + case 17: + w1[0] = w1[0] | 0x0200; + break; + + case 18: + w1[0] = w1[0] | 0x020000; + break; + + case 19: + w1[0] = w1[0] | 0x02000000; + break; + + case 20: + w1[1] = 0x02; + break; + + case 21: + w1[1] = w1[1] | 0x0200; + break; + + case 22: + w1[1] = w1[1] | 0x020000; + break; + + case 23: + w1[1] = w1[1] | 0x02000000; + break; + + case 24: + w1[2] = 0x02; + break; + + case 25: + w1[2] = w1[2] | 0x0200; + break; + + case 26: + w1[2] = w1[2] | 0x020000; + break; + + case 27: + w1[2] = w1[2] | 0x02000000; + break; + + case 28: + w1[3] = 0x02; + break; + + case 29: + w1[3] = w1[3] | 0x0200; + break; + + case 30: + w1[3] = w1[3] | 0x020000; + break; + + case 31: + w1[3] = w1[3] | 0x02000000; + break; + + case 32: + w2[0] = 0x02; + break; + + case 33: + w2[0] = w2[0] | 0x0200; + break; + + case 34: + w2[0] = w2[0] | 0x020000; + break; + + case 35: + w2[0] = w2[0] | 0x02000000; + break; + + case 36: + w2[1] = 0x02; + break; + + case 37: + w2[1] = w2[1] | 0x0200; + break; + + case 38: + w2[1] = w2[1] | 0x020000; + break; + + case 39: + w2[1] = w2[1] | 0x02000000; + break; + + case 40: + w2[2] = 0x02; + break; + + case 41: + w2[2] = w2[2] | 0x0200; + break; + + case 42: + w2[2] = w2[2] | 0x020000; + break; + + case 43: + w2[2] = w2[2] | 0x02000000; + break; + + case 44: + w2[3] = 0x02; + break; + + case 45: + w2[3] = w2[3] | 0x0200; + break; + + case 46: + w2[3] = w2[3] | 0x020000; + break; + + case 47: + w2[3] = w2[3] | 0x02000000; + break; + } +} + +static void append_0x02_4 (u32 w0[4], u32 w1[4], u32 w2[4], u32 w3[4], const u32 offset) +{ + switch (offset) + { + case 0: + w0[0] = 0x02; + break; + + case 1: + w0[0] = w0[0] | 0x0200; + break; + + case 2: + w0[0] = w0[0] | 0x020000; + break; + + case 3: + w0[0] = w0[0] | 0x02000000; + break; + + case 4: + w0[1] = 0x02; + break; + + case 5: + w0[1] = w0[1] | 0x0200; + break; + + case 6: + w0[1] = w0[1] | 0x020000; + break; + + case 7: + w0[1] = w0[1] | 0x02000000; + break; + + case 8: + w0[2] = 0x02; + break; + + case 9: + w0[2] = w0[2] | 0x0200; + break; + + case 10: + w0[2] = w0[2] | 0x020000; + break; + + case 11: + w0[2] = w0[2] | 0x02000000; + break; + + case 12: + w0[3] = 0x02; + break; + + case 13: + w0[3] = w0[3] | 0x0200; + break; + + case 14: + w0[3] = w0[3] | 0x020000; + break; + + case 15: + w0[3] = w0[3] | 0x02000000; + break; + + case 16: + w1[0] = 0x02; + break; + + case 17: + w1[0] = w1[0] | 0x0200; + break; + + case 18: + w1[0] = w1[0] | 0x020000; + break; + + case 19: + w1[0] = w1[0] | 0x02000000; + break; + + case 20: + w1[1] = 0x02; + break; + + case 21: + w1[1] = w1[1] | 0x0200; + break; + + case 22: + w1[1] = w1[1] | 0x020000; + break; + + case 23: + w1[1] = w1[1] | 0x02000000; + break; + + case 24: + w1[2] = 0x02; + break; + + case 25: + w1[2] = w1[2] | 0x0200; + break; + + case 26: + w1[2] = w1[2] | 0x020000; + break; + + case 27: + w1[2] = w1[2] | 0x02000000; + break; + + case 28: + w1[3] = 0x02; + break; + + case 29: + w1[3] = w1[3] | 0x0200; + break; + + case 30: + w1[3] = w1[3] | 0x020000; + break; + + case 31: + w1[3] = w1[3] | 0x02000000; + break; + + case 32: + w2[0] = 0x02; + break; + + case 33: + w2[0] = w2[0] | 0x0200; + break; + + case 34: + w2[0] = w2[0] | 0x020000; + break; + + case 35: + w2[0] = w2[0] | 0x02000000; + break; + + case 36: + w2[1] = 0x02; + break; + + case 37: + w2[1] = w2[1] | 0x0200; + break; + + case 38: + w2[1] = w2[1] | 0x020000; + break; + + case 39: + w2[1] = w2[1] | 0x02000000; + break; + + case 40: + w2[2] = 0x02; + break; + + case 41: + w2[2] = w2[2] | 0x0200; + break; + + case 42: + w2[2] = w2[2] | 0x020000; + break; + + case 43: + w2[2] = w2[2] | 0x02000000; + break; + + case 44: + w2[3] = 0x02; + break; + + case 45: + w2[3] = w2[3] | 0x0200; + break; + + case 46: + w2[3] = w2[3] | 0x020000; + break; + + case 47: + w2[3] = w2[3] | 0x02000000; + break; + + case 48: + w3[0] = 0x02; + break; + + case 49: + w3[0] = w3[0] | 0x0200; + break; + + case 50: + w3[0] = w3[0] | 0x020000; + break; + + case 51: + w3[0] = w3[0] | 0x02000000; + break; + + case 52: + w3[1] = 0x02; + break; + + case 53: + w3[1] = w3[1] | 0x0200; + break; + + case 54: + w3[1] = w3[1] | 0x020000; + break; + + case 55: + w3[1] = w3[1] | 0x02000000; + break; + + case 56: + w3[2] = 0x02; + break; + + case 57: + w3[2] = w3[2] | 0x0200; + break; + + case 58: + w3[2] = w3[2] | 0x020000; + break; + + case 59: + w3[2] = w3[2] | 0x02000000; + break; + + case 60: + w3[3] = 0x02; + break; + + case 61: + w3[3] = w3[3] | 0x0200; + break; + + case 62: + w3[3] = w3[3] | 0x020000; + break; + + case 63: + w3[3] = w3[3] | 0x02000000; + break; + } +} + +static void append_0x02_8 (u32 w0[4], u32 w1[4], u32 w2[4], u32 w3[4], u32 w4[4], u32 w5[4], u32 w6[4], u32 w7[4], const u32 offset) +{ + switch (offset) + { + case 0: + w0[0] = 0x02; + break; + + case 1: + w0[0] = w0[0] | 0x0200; + break; + + case 2: + w0[0] = w0[0] | 0x020000; + break; + + case 3: + w0[0] = w0[0] | 0x02000000; + break; + + case 4: + w0[1] = 0x02; + break; + + case 5: + w0[1] = w0[1] | 0x0200; + break; + + case 6: + w0[1] = w0[1] | 0x020000; + break; + + case 7: + w0[1] = w0[1] | 0x02000000; + break; + + case 8: + w0[2] = 0x02; + break; + + case 9: + w0[2] = w0[2] | 0x0200; + break; + + case 10: + w0[2] = w0[2] | 0x020000; + break; + + case 11: + w0[2] = w0[2] | 0x02000000; + break; + + case 12: + w0[3] = 0x02; + break; + + case 13: + w0[3] = w0[3] | 0x0200; + break; + + case 14: + w0[3] = w0[3] | 0x020000; + break; + + case 15: + w0[3] = w0[3] | 0x02000000; + break; + + case 16: + w1[0] = 0x02; + break; + + case 17: + w1[0] = w1[0] | 0x0200; + break; + + case 18: + w1[0] = w1[0] | 0x020000; + break; + + case 19: + w1[0] = w1[0] | 0x02000000; + break; + + case 20: + w1[1] = 0x02; + break; + + case 21: + w1[1] = w1[1] | 0x0200; + break; + + case 22: + w1[1] = w1[1] | 0x020000; + break; + + case 23: + w1[1] = w1[1] | 0x02000000; + break; + + case 24: + w1[2] = 0x02; + break; + + case 25: + w1[2] = w1[2] | 0x0200; + break; + + case 26: + w1[2] = w1[2] | 0x020000; + break; + + case 27: + w1[2] = w1[2] | 0x02000000; + break; + + case 28: + w1[3] = 0x02; + break; + + case 29: + w1[3] = w1[3] | 0x0200; + break; + + case 30: + w1[3] = w1[3] | 0x020000; + break; + + case 31: + w1[3] = w1[3] | 0x02000000; + break; + + case 32: + w2[0] = 0x02; + break; + + case 33: + w2[0] = w2[0] | 0x0200; + break; + + case 34: + w2[0] = w2[0] | 0x020000; + break; + + case 35: + w2[0] = w2[0] | 0x02000000; + break; + + case 36: + w2[1] = 0x02; + break; + + case 37: + w2[1] = w2[1] | 0x0200; + break; + + case 38: + w2[1] = w2[1] | 0x020000; + break; + + case 39: + w2[1] = w2[1] | 0x02000000; + break; + + case 40: + w2[2] = 0x02; + break; + + case 41: + w2[2] = w2[2] | 0x0200; + break; + + case 42: + w2[2] = w2[2] | 0x020000; + break; + + case 43: + w2[2] = w2[2] | 0x02000000; + break; + + case 44: + w2[3] = 0x02; + break; + + case 45: + w2[3] = w2[3] | 0x0200; + break; + + case 46: + w2[3] = w2[3] | 0x020000; + break; + + case 47: + w2[3] = w2[3] | 0x02000000; + break; + + case 48: + w3[0] = 0x02; + break; + + case 49: + w3[0] = w3[0] | 0x0200; + break; + + case 50: + w3[0] = w3[0] | 0x020000; + break; + + case 51: + w3[0] = w3[0] | 0x02000000; + break; + + case 52: + w3[1] = 0x02; + break; + + case 53: + w3[1] = w3[1] | 0x0200; + break; + + case 54: + w3[1] = w3[1] | 0x020000; + break; + + case 55: + w3[1] = w3[1] | 0x02000000; + break; + + case 56: + w3[2] = 0x02; + break; + + case 57: + w3[2] = w3[2] | 0x0200; + break; + + case 58: + w3[2] = w3[2] | 0x020000; + break; + + case 59: + w3[2] = w3[2] | 0x02000000; + break; + + case 60: + w3[3] = 0x02; + break; + + case 61: + w3[3] = w3[3] | 0x0200; + break; + + case 62: + w3[3] = w3[3] | 0x020000; + break; + + case 63: + w3[3] = w3[3] | 0x02000000; + break; + + case 64: + w4[0] = 0x02; + break; + + case 65: + w4[0] = w4[0] | 0x0200; + break; + + case 66: + w4[0] = w4[0] | 0x020000; + break; + + case 67: + w4[0] = w4[0] | 0x02000000; + break; + + case 68: + w4[1] = 0x02; + break; + + case 69: + w4[1] = w4[1] | 0x0200; + break; + + case 70: + w4[1] = w4[1] | 0x020000; + break; + + case 71: + w4[1] = w4[1] | 0x02000000; + break; + + case 72: + w4[2] = 0x02; + break; + + case 73: + w4[2] = w4[2] | 0x0200; + break; + + case 74: + w4[2] = w4[2] | 0x020000; + break; + + case 75: + w4[2] = w4[2] | 0x02000000; + break; + + case 76: + w4[3] = 0x02; + break; + + case 77: + w4[3] = w4[3] | 0x0200; + break; + + case 78: + w4[3] = w4[3] | 0x020000; + break; + + case 79: + w4[3] = w4[3] | 0x02000000; + break; + + case 80: + w5[0] = 0x02; + break; + + case 81: + w5[0] = w5[0] | 0x0200; + break; + + case 82: + w5[0] = w5[0] | 0x020000; + break; + + case 83: + w5[0] = w5[0] | 0x02000000; + break; + + case 84: + w5[1] = 0x02; + break; + + case 85: + w5[1] = w5[1] | 0x0200; + break; + + case 86: + w5[1] = w5[1] | 0x020000; + break; + + case 87: + w5[1] = w5[1] | 0x02000000; + break; + + case 88: + w5[2] = 0x02; + break; + + case 89: + w5[2] = w5[2] | 0x0200; + break; + + case 90: + w5[2] = w5[2] | 0x020000; + break; + + case 91: + w5[2] = w5[2] | 0x02000000; + break; + + case 92: + w5[3] = 0x02; + break; + + case 93: + w5[3] = w5[3] | 0x0200; + break; + + case 94: + w5[3] = w5[3] | 0x020000; + break; + + case 95: + w5[3] = w5[3] | 0x02000000; + break; + + case 96: + w6[0] = 0x02; + break; + + case 97: + w6[0] = w6[0] | 0x0200; + break; + + case 98: + w6[0] = w6[0] | 0x020000; + break; + + case 99: + w6[0] = w6[0] | 0x02000000; + break; + + case 100: + w6[1] = 0x02; + break; + + case 101: + w6[1] = w6[1] | 0x0200; + break; + + case 102: + w6[1] = w6[1] | 0x020000; + break; + + case 103: + w6[1] = w6[1] | 0x02000000; + break; + + case 104: + w6[2] = 0x02; + break; + + case 105: + w6[2] = w6[2] | 0x0200; + break; + + case 106: + w6[2] = w6[2] | 0x020000; + break; + + case 107: + w6[2] = w6[2] | 0x02000000; + break; + + case 108: + w6[3] = 0x02; + break; + + case 109: + w6[3] = w6[3] | 0x0200; + break; + + case 110: + w6[3] = w6[3] | 0x020000; + break; + + case 111: + w6[3] = w6[3] | 0x02000000; + break; + + case 112: + w7[0] = 0x02; + break; + + case 113: + w7[0] = w7[0] | 0x0200; + break; + + case 114: + w7[0] = w7[0] | 0x020000; + break; + + case 115: + w7[0] = w7[0] | 0x02000000; + break; + + case 116: + w7[1] = 0x02; + break; + + case 117: + w7[1] = w7[1] | 0x0200; + break; + + case 118: + w7[1] = w7[1] | 0x020000; + break; + + case 119: + w7[1] = w7[1] | 0x02000000; + break; + + case 120: + w7[2] = 0x02; + break; + + case 121: + w7[2] = w7[2] | 0x0200; + break; + + case 122: + w7[2] = w7[2] | 0x020000; + break; + + case 123: + w7[2] = w7[2] | 0x02000000; + break; + + case 124: + w7[3] = 0x02; + break; + + case 125: + w7[3] = w7[3] | 0x0200; + break; + + case 126: + w7[3] = w7[3] | 0x020000; + break; + + case 127: + w7[3] = w7[3] | 0x02000000; + break; + } +} + +static void append_0x80_1 (u32 w0[4], const u32 offset) +{ + switch (offset) + { + case 0: + w0[0] = 0x80; + break; + + case 1: + w0[0] = w0[0] | 0x8000; + break; + + case 2: + w0[0] = w0[0] | 0x800000; + break; + + case 3: + w0[0] = w0[0] | 0x80000000; + break; + + case 4: + w0[1] = 0x80; + break; + + case 5: + w0[1] = w0[1] | 0x8000; + break; + + case 6: + w0[1] = w0[1] | 0x800000; + break; + + case 7: + w0[1] = w0[1] | 0x80000000; + break; + + case 8: + w0[2] = 0x80; + break; + + case 9: + w0[2] = w0[2] | 0x8000; + break; + + case 10: + w0[2] = w0[2] | 0x800000; + break; + + case 11: + w0[2] = w0[2] | 0x80000000; + break; + + case 12: + w0[3] = 0x80; + break; + + case 13: + w0[3] = w0[3] | 0x8000; + break; + + case 14: + w0[3] = w0[3] | 0x800000; + break; + + case 15: + w0[3] = w0[3] | 0x80000000; + break; + } +} + +static void append_0x80_2 (u32 w0[4], u32 w1[4], const u32 offset) +{ + switch (offset) + { + case 0: + w0[0] = 0x80; + break; + + case 1: + w0[0] = w0[0] | 0x8000; + break; + + case 2: + w0[0] = w0[0] | 0x800000; + break; + + case 3: + w0[0] = w0[0] | 0x80000000; + break; + + case 4: + w0[1] = 0x80; + break; + + case 5: + w0[1] = w0[1] | 0x8000; + break; + + case 6: + w0[1] = w0[1] | 0x800000; + break; + + case 7: + w0[1] = w0[1] | 0x80000000; + break; + + case 8: + w0[2] = 0x80; + break; + + case 9: + w0[2] = w0[2] | 0x8000; + break; + + case 10: + w0[2] = w0[2] | 0x800000; + break; + + case 11: + w0[2] = w0[2] | 0x80000000; + break; + + case 12: + w0[3] = 0x80; + break; + + case 13: + w0[3] = w0[3] | 0x8000; + break; + + case 14: + w0[3] = w0[3] | 0x800000; + break; + + case 15: + w0[3] = w0[3] | 0x80000000; + break; + + case 16: + w1[0] = 0x80; + break; + + case 17: + w1[0] = w1[0] | 0x8000; + break; + + case 18: + w1[0] = w1[0] | 0x800000; + break; + + case 19: + w1[0] = w1[0] | 0x80000000; + break; + + case 20: + w1[1] = 0x80; + break; + + case 21: + w1[1] = w1[1] | 0x8000; + break; + + case 22: + w1[1] = w1[1] | 0x800000; + break; + + case 23: + w1[1] = w1[1] | 0x80000000; + break; + + case 24: + w1[2] = 0x80; + break; + + case 25: + w1[2] = w1[2] | 0x8000; + break; + + case 26: + w1[2] = w1[2] | 0x800000; + break; + + case 27: + w1[2] = w1[2] | 0x80000000; + break; + + case 28: + w1[3] = 0x80; + break; + + case 29: + w1[3] = w1[3] | 0x8000; + break; + + case 30: + w1[3] = w1[3] | 0x800000; + break; + + case 31: + w1[3] = w1[3] | 0x80000000; + break; + } +} + +static void append_0x80_2_be (u32 w0[4], u32 w1[4], const u32 offset) +{ + switch (offset) + { + case 0: + w0[0] |= 0x80000000; + break; + + case 1: + w0[0] |= 0x800000; + break; + + case 2: + w0[0] |= 0x8000; + break; + + case 3: + w0[0] |= 0x80; + break; + + case 4: + w0[1] |= 0x80000000; + break; + + case 5: + w0[1] |= 0x800000; + break; + + case 6: + w0[1] |= 0x8000; + break; + + case 7: + w0[1] |= 0x80; + break; + + case 8: + w0[2] |= 0x80000000; + break; + + case 9: + w0[2] |= 0x800000; + break; + + case 10: + w0[2] |= 0x8000; + break; + + case 11: + w0[2] |= 0x80; + break; + + case 12: + w0[3] |= 0x80000000; + break; + + case 13: + w0[3] |= 0x800000; + break; + + case 14: + w0[3] |= 0x8000; + break; + + case 15: + w0[3] |= 0x80; + break; + + case 16: + w1[0] |= 0x80000000; + break; + + case 17: + w1[0] |= 0x800000; + break; + + case 18: + w1[0] |= 0x8000; + break; + + case 19: + w1[0] |= 0x80; + break; + + case 20: + w1[1] |= 0x80000000; + break; + + case 21: + w1[1] |= 0x800000; + break; + + case 22: + w1[1] |= 0x8000; + break; + + case 23: + w1[1] |= 0x80; + break; + + case 24: + w1[2] |= 0x80000000; + break; + + case 25: + w1[2] |= 0x800000; + break; + + case 26: + w1[2] |= 0x8000; + break; + + case 27: + w1[2] |= 0x80; + break; + + case 28: + w1[3] |= 0x80000000; + break; + + case 29: + w1[3] |= 0x800000; + break; + + case 30: + w1[3] |= 0x8000; + break; + + case 31: + w1[3] |= 0x80; + break; + } +} + +static void append_0x80_3 (u32 w0[4], u32 w1[4], u32 w2[4], const u32 offset) +{ + switch (offset) + { + case 0: + w0[0] = 0x80; + break; + + case 1: + w0[0] = w0[0] | 0x8000; + break; + + case 2: + w0[0] = w0[0] | 0x800000; + break; + + case 3: + w0[0] = w0[0] | 0x80000000; + break; + + case 4: + w0[1] = 0x80; + break; + + case 5: + w0[1] = w0[1] | 0x8000; + break; + + case 6: + w0[1] = w0[1] | 0x800000; + break; + + case 7: + w0[1] = w0[1] | 0x80000000; + break; + + case 8: + w0[2] = 0x80; + break; + + case 9: + w0[2] = w0[2] | 0x8000; + break; + + case 10: + w0[2] = w0[2] | 0x800000; + break; + + case 11: + w0[2] = w0[2] | 0x80000000; + break; + + case 12: + w0[3] = 0x80; + break; + + case 13: + w0[3] = w0[3] | 0x8000; + break; + + case 14: + w0[3] = w0[3] | 0x800000; + break; + + case 15: + w0[3] = w0[3] | 0x80000000; + break; + + case 16: + w1[0] = 0x80; + break; + + case 17: + w1[0] = w1[0] | 0x8000; + break; + + case 18: + w1[0] = w1[0] | 0x800000; + break; + + case 19: + w1[0] = w1[0] | 0x80000000; + break; + + case 20: + w1[1] = 0x80; + break; + + case 21: + w1[1] = w1[1] | 0x8000; + break; + + case 22: + w1[1] = w1[1] | 0x800000; + break; + + case 23: + w1[1] = w1[1] | 0x80000000; + break; + + case 24: + w1[2] = 0x80; + break; + + case 25: + w1[2] = w1[2] | 0x8000; + break; + + case 26: + w1[2] = w1[2] | 0x800000; + break; + + case 27: + w1[2] = w1[2] | 0x80000000; + break; + + case 28: + w1[3] = 0x80; + break; + + case 29: + w1[3] = w1[3] | 0x8000; + break; + + case 30: + w1[3] = w1[3] | 0x800000; + break; + + case 31: + w1[3] = w1[3] | 0x80000000; + break; + + case 32: + w2[0] = 0x80; + break; + + case 33: + w2[0] = w2[0] | 0x8000; + break; + + case 34: + w2[0] = w2[0] | 0x800000; + break; + + case 35: + w2[0] = w2[0] | 0x80000000; + break; + + case 36: + w2[1] = 0x80; + break; + + case 37: + w2[1] = w2[1] | 0x8000; + break; + + case 38: + w2[1] = w2[1] | 0x800000; + break; + + case 39: + w2[1] = w2[1] | 0x80000000; + break; + + case 40: + w2[2] = 0x80; + break; + + case 41: + w2[2] = w2[2] | 0x8000; + break; + + case 42: + w2[2] = w2[2] | 0x800000; + break; + + case 43: + w2[2] = w2[2] | 0x80000000; + break; + + case 44: + w2[3] = 0x80; + break; + + case 45: + w2[3] = w2[3] | 0x8000; + break; + + case 46: + w2[3] = w2[3] | 0x800000; + break; + + case 47: + w2[3] = w2[3] | 0x80000000; + break; + } +} + +static void append_0x80_4 (u32 w0[4], u32 w1[4], u32 w2[4], u32 w3[4], const u32 offset) +{ + switch (offset) + { + case 0: + w0[0] = 0x80; + break; + + case 1: + w0[0] = w0[0] | 0x8000; + break; + + case 2: + w0[0] = w0[0] | 0x800000; + break; + + case 3: + w0[0] = w0[0] | 0x80000000; + break; + + case 4: + w0[1] = 0x80; + break; + + case 5: + w0[1] = w0[1] | 0x8000; + break; + + case 6: + w0[1] = w0[1] | 0x800000; + break; + + case 7: + w0[1] = w0[1] | 0x80000000; + break; + + case 8: + w0[2] = 0x80; + break; + + case 9: + w0[2] = w0[2] | 0x8000; + break; + + case 10: + w0[2] = w0[2] | 0x800000; + break; + + case 11: + w0[2] = w0[2] | 0x80000000; + break; + + case 12: + w0[3] = 0x80; + break; + + case 13: + w0[3] = w0[3] | 0x8000; + break; + + case 14: + w0[3] = w0[3] | 0x800000; + break; + + case 15: + w0[3] = w0[3] | 0x80000000; + break; + + case 16: + w1[0] = 0x80; + break; + + case 17: + w1[0] = w1[0] | 0x8000; + break; + + case 18: + w1[0] = w1[0] | 0x800000; + break; + + case 19: + w1[0] = w1[0] | 0x80000000; + break; + + case 20: + w1[1] = 0x80; + break; + + case 21: + w1[1] = w1[1] | 0x8000; + break; + + case 22: + w1[1] = w1[1] | 0x800000; + break; + + case 23: + w1[1] = w1[1] | 0x80000000; + break; + + case 24: + w1[2] = 0x80; + break; + + case 25: + w1[2] = w1[2] | 0x8000; + break; + + case 26: + w1[2] = w1[2] | 0x800000; + break; + + case 27: + w1[2] = w1[2] | 0x80000000; + break; + + case 28: + w1[3] = 0x80; + break; + + case 29: + w1[3] = w1[3] | 0x8000; + break; + + case 30: + w1[3] = w1[3] | 0x800000; + break; + + case 31: + w1[3] = w1[3] | 0x80000000; + break; + + case 32: + w2[0] = 0x80; + break; + + case 33: + w2[0] = w2[0] | 0x8000; + break; + + case 34: + w2[0] = w2[0] | 0x800000; + break; + + case 35: + w2[0] = w2[0] | 0x80000000; + break; + + case 36: + w2[1] = 0x80; + break; + + case 37: + w2[1] = w2[1] | 0x8000; + break; + + case 38: + w2[1] = w2[1] | 0x800000; + break; + + case 39: + w2[1] = w2[1] | 0x80000000; + break; + + case 40: + w2[2] = 0x80; + break; + + case 41: + w2[2] = w2[2] | 0x8000; + break; + + case 42: + w2[2] = w2[2] | 0x800000; + break; + + case 43: + w2[2] = w2[2] | 0x80000000; + break; + + case 44: + w2[3] = 0x80; + break; + + case 45: + w2[3] = w2[3] | 0x8000; + break; + + case 46: + w2[3] = w2[3] | 0x800000; + break; + + case 47: + w2[3] = w2[3] | 0x80000000; + break; + + case 48: + w3[0] = 0x80; + break; + + case 49: + w3[0] = w3[0] | 0x8000; + break; + + case 50: + w3[0] = w3[0] | 0x800000; + break; + + case 51: + w3[0] = w3[0] | 0x80000000; + break; + + case 52: + w3[1] = 0x80; + break; + + case 53: + w3[1] = w3[1] | 0x8000; + break; + + case 54: + w3[1] = w3[1] | 0x800000; + break; + + case 55: + w3[1] = w3[1] | 0x80000000; + break; + + case 56: + w3[2] = 0x80; + break; + + case 57: + w3[2] = w3[2] | 0x8000; + break; + + case 58: + w3[2] = w3[2] | 0x800000; + break; + + case 59: + w3[2] = w3[2] | 0x80000000; + break; + + case 60: + w3[3] = 0x80; + break; + + case 61: + w3[3] = w3[3] | 0x8000; + break; + + case 62: + w3[3] = w3[3] | 0x800000; + break; + + case 63: + w3[3] = w3[3] | 0x80000000; + break; + } +} + +static void append_0x80_8 (u32 w0[4], u32 w1[4], u32 w2[4], u32 w3[4], u32 w4[4], u32 w5[4], u32 w6[4], u32 w7[4], const u32 offset) +{ + switch (offset) + { + case 0: + w0[0] = 0x80; + break; + + case 1: + w0[0] = w0[0] | 0x8000; + break; + + case 2: + w0[0] = w0[0] | 0x800000; + break; + + case 3: + w0[0] = w0[0] | 0x80000000; + break; + + case 4: + w0[1] = 0x80; + break; + + case 5: + w0[1] = w0[1] | 0x8000; + break; + + case 6: + w0[1] = w0[1] | 0x800000; + break; + + case 7: + w0[1] = w0[1] | 0x80000000; + break; + + case 8: + w0[2] = 0x80; + break; + + case 9: + w0[2] = w0[2] | 0x8000; + break; + + case 10: + w0[2] = w0[2] | 0x800000; + break; + + case 11: + w0[2] = w0[2] | 0x80000000; + break; + + case 12: + w0[3] = 0x80; + break; + + case 13: + w0[3] = w0[3] | 0x8000; + break; + + case 14: + w0[3] = w0[3] | 0x800000; + break; + + case 15: + w0[3] = w0[3] | 0x80000000; + break; + + case 16: + w1[0] = 0x80; + break; + + case 17: + w1[0] = w1[0] | 0x8000; + break; + + case 18: + w1[0] = w1[0] | 0x800000; + break; + + case 19: + w1[0] = w1[0] | 0x80000000; + break; + + case 20: + w1[1] = 0x80; + break; + + case 21: + w1[1] = w1[1] | 0x8000; + break; + + case 22: + w1[1] = w1[1] | 0x800000; + break; + + case 23: + w1[1] = w1[1] | 0x80000000; + break; + + case 24: + w1[2] = 0x80; + break; + + case 25: + w1[2] = w1[2] | 0x8000; + break; + + case 26: + w1[2] = w1[2] | 0x800000; + break; + + case 27: + w1[2] = w1[2] | 0x80000000; + break; + + case 28: + w1[3] = 0x80; + break; + + case 29: + w1[3] = w1[3] | 0x8000; + break; + + case 30: + w1[3] = w1[3] | 0x800000; + break; + + case 31: + w1[3] = w1[3] | 0x80000000; + break; + + case 32: + w2[0] = 0x80; + break; + + case 33: + w2[0] = w2[0] | 0x8000; + break; + + case 34: + w2[0] = w2[0] | 0x800000; + break; + + case 35: + w2[0] = w2[0] | 0x80000000; + break; + + case 36: + w2[1] = 0x80; + break; + + case 37: + w2[1] = w2[1] | 0x8000; + break; + + case 38: + w2[1] = w2[1] | 0x800000; + break; + + case 39: + w2[1] = w2[1] | 0x80000000; + break; + + case 40: + w2[2] = 0x80; + break; + + case 41: + w2[2] = w2[2] | 0x8000; + break; + + case 42: + w2[2] = w2[2] | 0x800000; + break; + + case 43: + w2[2] = w2[2] | 0x80000000; + break; + + case 44: + w2[3] = 0x80; + break; + + case 45: + w2[3] = w2[3] | 0x8000; + break; + + case 46: + w2[3] = w2[3] | 0x800000; + break; + + case 47: + w2[3] = w2[3] | 0x80000000; + break; + + case 48: + w3[0] = 0x80; + break; + + case 49: + w3[0] = w3[0] | 0x8000; + break; + + case 50: + w3[0] = w3[0] | 0x800000; + break; + + case 51: + w3[0] = w3[0] | 0x80000000; + break; + + case 52: + w3[1] = 0x80; + break; + + case 53: + w3[1] = w3[1] | 0x8000; + break; + + case 54: + w3[1] = w3[1] | 0x800000; + break; + + case 55: + w3[1] = w3[1] | 0x80000000; + break; + + case 56: + w3[2] = 0x80; + break; + + case 57: + w3[2] = w3[2] | 0x8000; + break; + + case 58: + w3[2] = w3[2] | 0x800000; + break; + + case 59: + w3[2] = w3[2] | 0x80000000; + break; + + case 60: + w3[3] = 0x80; + break; + + case 61: + w3[3] = w3[3] | 0x8000; + break; + + case 62: + w3[3] = w3[3] | 0x800000; + break; + + case 63: + w3[3] = w3[3] | 0x80000000; + break; + + case 64: + w4[0] = 0x80; + break; + + case 65: + w4[0] = w4[0] | 0x8000; + break; + + case 66: + w4[0] = w4[0] | 0x800000; + break; + + case 67: + w4[0] = w4[0] | 0x80000000; + break; + + case 68: + w4[1] = 0x80; + break; + + case 69: + w4[1] = w4[1] | 0x8000; + break; + + case 70: + w4[1] = w4[1] | 0x800000; + break; + + case 71: + w4[1] = w4[1] | 0x80000000; + break; + + case 72: + w4[2] = 0x80; + break; + + case 73: + w4[2] = w4[2] | 0x8000; + break; + + case 74: + w4[2] = w4[2] | 0x800000; + break; + + case 75: + w4[2] = w4[2] | 0x80000000; + break; + + case 76: + w4[3] = 0x80; + break; + + case 77: + w4[3] = w4[3] | 0x8000; + break; + + case 78: + w4[3] = w4[3] | 0x800000; + break; + + case 79: + w4[3] = w4[3] | 0x80000000; + break; + + case 80: + w5[0] = 0x80; + break; + + case 81: + w5[0] = w5[0] | 0x8000; + break; + + case 82: + w5[0] = w5[0] | 0x800000; + break; + + case 83: + w5[0] = w5[0] | 0x80000000; + break; + + case 84: + w5[1] = 0x80; + break; + + case 85: + w5[1] = w5[1] | 0x8000; + break; + + case 86: + w5[1] = w5[1] | 0x800000; + break; + + case 87: + w5[1] = w5[1] | 0x80000000; + break; + + case 88: + w5[2] = 0x80; + break; + + case 89: + w5[2] = w5[2] | 0x8000; + break; + + case 90: + w5[2] = w5[2] | 0x800000; + break; + + case 91: + w5[2] = w5[2] | 0x80000000; + break; + + case 92: + w5[3] = 0x80; + break; + + case 93: + w5[3] = w5[3] | 0x8000; + break; + + case 94: + w5[3] = w5[3] | 0x800000; + break; + + case 95: + w5[3] = w5[3] | 0x80000000; + break; + + case 96: + w6[0] = 0x80; + break; + + case 97: + w6[0] = w6[0] | 0x8000; + break; + + case 98: + w6[0] = w6[0] | 0x800000; + break; + + case 99: + w6[0] = w6[0] | 0x80000000; + break; + + case 100: + w6[1] = 0x80; + break; + + case 101: + w6[1] = w6[1] | 0x8000; + break; + + case 102: + w6[1] = w6[1] | 0x800000; + break; + + case 103: + w6[1] = w6[1] | 0x80000000; + break; + + case 104: + w6[2] = 0x80; + break; + + case 105: + w6[2] = w6[2] | 0x8000; + break; + + case 106: + w6[2] = w6[2] | 0x800000; + break; + + case 107: + w6[2] = w6[2] | 0x80000000; + break; + + case 108: + w6[3] = 0x80; + break; + + case 109: + w6[3] = w6[3] | 0x8000; + break; + + case 110: + w6[3] = w6[3] | 0x800000; + break; + + case 111: + w6[3] = w6[3] | 0x80000000; + break; + + case 112: + w7[0] = 0x80; + break; + + case 113: + w7[0] = w7[0] | 0x8000; + break; + + case 114: + w7[0] = w7[0] | 0x800000; + break; + + case 115: + w7[0] = w7[0] | 0x80000000; + break; + + case 116: + w7[1] = 0x80; + break; + + case 117: + w7[1] = w7[1] | 0x8000; + break; + + case 118: + w7[1] = w7[1] | 0x800000; + break; + + case 119: + w7[1] = w7[1] | 0x80000000; + break; + + case 120: + w7[2] = 0x80; + break; + + case 121: + w7[2] = w7[2] | 0x8000; + break; + + case 122: + w7[2] = w7[2] | 0x800000; + break; + + case 123: + w7[2] = w7[2] | 0x80000000; + break; + + case 124: + w7[3] = 0x80; + break; + + case 125: + w7[3] = w7[3] | 0x8000; + break; + + case 126: + w7[3] = w7[3] | 0x800000; + break; + + case 127: + w7[3] = w7[3] | 0x80000000; + break; + } +} + +static void append_0x80_4 (u32 w[16], const u32 offset) +{ + switch (offset) + { + case 0: + w[ 0] = 0x80; + break; + + case 1: + w[ 0] = w[ 0] | 0x8000; + break; + + case 2: + w[ 0] = w[ 0] | 0x800000; + break; + + case 3: + w[ 0] = w[ 0] | 0x80000000; + break; + + case 4: + w[ 1] = 0x80; + break; + + case 5: + w[ 1] = w[ 1] | 0x8000; + break; + + case 6: + w[ 1] = w[ 1] | 0x800000; + break; + + case 7: + w[ 1] = w[ 1] | 0x80000000; + break; + + case 8: + w[ 2] = 0x80; + break; + + case 9: + w[ 2] = w[ 2] | 0x8000; + break; + + case 10: + w[ 2] = w[ 2] | 0x800000; + break; + + case 11: + w[ 2] = w[ 2] | 0x80000000; + break; + + case 12: + w[ 3] = 0x80; + break; + + case 13: + w[ 3] = w[ 3] | 0x8000; + break; + + case 14: + w[ 3] = w[ 3] | 0x800000; + break; + + case 15: + w[ 3] = w[ 3] | 0x80000000; + break; + + case 16: + w[ 4] = 0x80; + break; + + case 17: + w[ 4] = w[ 4] | 0x8000; + break; + + case 18: + w[ 4] = w[ 4] | 0x800000; + break; + + case 19: + w[ 4] = w[ 4] | 0x80000000; + break; + + case 20: + w[ 5] = 0x80; + break; + + case 21: + w[ 5] = w[ 5] | 0x8000; + break; + + case 22: + w[ 5] = w[ 5] | 0x800000; + break; + + case 23: + w[ 5] = w[ 5] | 0x80000000; + break; + + case 24: + w[ 6] = 0x80; + break; + + case 25: + w[ 6] = w[ 6] | 0x8000; + break; + + case 26: + w[ 6] = w[ 6] | 0x800000; + break; + + case 27: + w[ 6] = w[ 6] | 0x80000000; + break; + + case 28: + w[ 7] = 0x80; + break; + + case 29: + w[ 7] = w[ 7] | 0x8000; + break; + + case 30: + w[ 7] = w[ 7] | 0x800000; + break; + + case 31: + w[ 7] = w[ 7] | 0x80000000; + break; + + case 32: + w[ 8] = 0x80; + break; + + case 33: + w[ 8] = w[ 8] | 0x8000; + break; + + case 34: + w[ 8] = w[ 8] | 0x800000; + break; + + case 35: + w[ 8] = w[ 8] | 0x80000000; + break; + + case 36: + w[ 9] = 0x80; + break; + + case 37: + w[ 9] = w[ 9] | 0x8000; + break; + + case 38: + w[ 9] = w[ 9] | 0x800000; + break; + + case 39: + w[ 9] = w[ 9] | 0x80000000; + break; + + case 40: + w[10] = 0x80; + break; + + case 41: + w[10] = w[10] | 0x8000; + break; + + case 42: + w[10] = w[10] | 0x800000; + break; + + case 43: + w[10] = w[10] | 0x80000000; + break; + + case 44: + w[11] = 0x80; + break; + + case 45: + w[11] = w[11] | 0x8000; + break; + + case 46: + w[11] = w[11] | 0x800000; + break; + + case 47: + w[11] = w[11] | 0x80000000; + break; + + case 48: + w[12] = 0x80; + break; + + case 49: + w[12] = w[12] | 0x8000; + break; + + case 50: + w[12] = w[12] | 0x800000; + break; + + case 51: + w[12] = w[12] | 0x80000000; + break; + + case 52: + w[13] = 0x80; + break; + + case 53: + w[13] = w[13] | 0x8000; + break; + + case 54: + w[13] = w[13] | 0x800000; + break; + + case 55: + w[13] = w[13] | 0x80000000; + break; + + case 56: + w[14] = 0x80; + break; + + case 57: + w[14] = w[14] | 0x8000; + break; + + case 58: + w[14] = w[14] | 0x800000; + break; + + case 59: + w[14] = w[14] | 0x80000000; + break; + + case 60: + w[15] = 0x80; + break; + + case 61: + w[15] = w[15] | 0x8000; + break; + + case 62: + w[15] = w[15] | 0x800000; + break; + + case 63: + w[15] = w[15] | 0x80000000; + break; + } +} + +static void append_0x80_8 (u32 w[32], const u32 offset) +{ + switch (offset) + { + case 0: + w[ 0] = 0x80; + break; + + case 1: + w[ 0] = w[ 0] | 0x8000; + break; + + case 2: + w[ 0] = w[ 0] | 0x800000; + break; + + case 3: + w[ 0] = w[ 0] | 0x80000000; + break; + + case 4: + w[ 1] = 0x80; + break; + + case 5: + w[ 1] = w[ 1] | 0x8000; + break; + + case 6: + w[ 1] = w[ 1] | 0x800000; + break; + + case 7: + w[ 1] = w[ 1] | 0x80000000; + break; + + case 8: + w[ 2] = 0x80; + break; + + case 9: + w[ 2] = w[ 2] | 0x8000; + break; + + case 10: + w[ 2] = w[ 2] | 0x800000; + break; + + case 11: + w[ 2] = w[ 2] | 0x80000000; + break; + + case 12: + w[ 3] = 0x80; + break; + + case 13: + w[ 3] = w[ 3] | 0x8000; + break; + + case 14: + w[ 3] = w[ 3] | 0x800000; + break; + + case 15: + w[ 3] = w[ 3] | 0x80000000; + break; + + case 16: + w[ 4] = 0x80; + break; + + case 17: + w[ 4] = w[ 4] | 0x8000; + break; + + case 18: + w[ 4] = w[ 4] | 0x800000; + break; + + case 19: + w[ 4] = w[ 4] | 0x80000000; + break; + + case 20: + w[ 5] = 0x80; + break; + + case 21: + w[ 5] = w[ 5] | 0x8000; + break; + + case 22: + w[ 5] = w[ 5] | 0x800000; + break; + + case 23: + w[ 5] = w[ 5] | 0x80000000; + break; + + case 24: + w[ 6] = 0x80; + break; + + case 25: + w[ 6] = w[ 6] | 0x8000; + break; + + case 26: + w[ 6] = w[ 6] | 0x800000; + break; + + case 27: + w[ 6] = w[ 6] | 0x80000000; + break; + + case 28: + w[ 7] = 0x80; + break; + + case 29: + w[ 7] = w[ 7] | 0x8000; + break; + + case 30: + w[ 7] = w[ 7] | 0x800000; + break; + + case 31: + w[ 7] = w[ 7] | 0x80000000; + break; + + case 32: + w[ 8] = 0x80; + break; + + case 33: + w[ 8] = w[ 8] | 0x8000; + break; + + case 34: + w[ 8] = w[ 8] | 0x800000; + break; + + case 35: + w[ 8] = w[ 8] | 0x80000000; + break; + + case 36: + w[ 9] = 0x80; + break; + + case 37: + w[ 9] = w[ 9] | 0x8000; + break; + + case 38: + w[ 9] = w[ 9] | 0x800000; + break; + + case 39: + w[ 9] = w[ 9] | 0x80000000; + break; + + case 40: + w[10] = 0x80; + break; + + case 41: + w[10] = w[10] | 0x8000; + break; + + case 42: + w[10] = w[10] | 0x800000; + break; + + case 43: + w[10] = w[10] | 0x80000000; + break; + + case 44: + w[11] = 0x80; + break; + + case 45: + w[11] = w[11] | 0x8000; + break; + + case 46: + w[11] = w[11] | 0x800000; + break; + + case 47: + w[11] = w[11] | 0x80000000; + break; + + case 48: + w[12] = 0x80; + break; + + case 49: + w[12] = w[12] | 0x8000; + break; + + case 50: + w[12] = w[12] | 0x800000; + break; + + case 51: + w[12] = w[12] | 0x80000000; + break; + + case 52: + w[13] = 0x80; + break; + + case 53: + w[13] = w[13] | 0x8000; + break; + + case 54: + w[13] = w[13] | 0x800000; + break; + + case 55: + w[13] = w[13] | 0x80000000; + break; + + case 56: + w[14] = 0x80; + break; + + case 57: + w[14] = w[14] | 0x8000; + break; + + case 58: + w[14] = w[14] | 0x800000; + break; + + case 59: + w[14] = w[14] | 0x80000000; + break; + + case 60: + w[15] = 0x80; + break; + + case 61: + w[15] = w[15] | 0x8000; + break; + + case 62: + w[15] = w[15] | 0x800000; + break; + + case 63: + w[15] = w[15] | 0x80000000; + break; + + case 64: + w[16] = 0x80; + break; + + case 65: + w[16] = w[16] | 0x8000; + break; + + case 66: + w[16] = w[16] | 0x800000; + break; + + case 67: + w[16] = w[16] | 0x80000000; + break; + + case 68: + w[17] = 0x80; + break; + + case 69: + w[17] = w[17] | 0x8000; + break; + + case 70: + w[17] = w[17] | 0x800000; + break; + + case 71: + w[17] = w[17] | 0x80000000; + break; + + case 72: + w[18] = 0x80; + break; + + case 73: + w[18] = w[18] | 0x8000; + break; + + case 74: + w[18] = w[18] | 0x800000; + break; + + case 75: + w[18] = w[18] | 0x80000000; + break; + + case 76: + w[19] = 0x80; + break; + + case 77: + w[19] = w[19] | 0x8000; + break; + + case 78: + w[19] = w[19] | 0x800000; + break; + + case 79: + w[19] = w[19] | 0x80000000; + break; + + case 80: + w[20] = 0x80; + break; + + case 81: + w[20] = w[20] | 0x8000; + break; + + case 82: + w[20] = w[20] | 0x800000; + break; + + case 83: + w[20] = w[20] | 0x80000000; + break; + + case 84: + w[21] = 0x80; + break; + + case 85: + w[21] = w[21] | 0x8000; + break; + + case 86: + w[21] = w[21] | 0x800000; + break; + + case 87: + w[21] = w[21] | 0x80000000; + break; + + case 88: + w[22] = 0x80; + break; + + case 89: + w[22] = w[22] | 0x8000; + break; + + case 90: + w[22] = w[22] | 0x800000; + break; + + case 91: + w[22] = w[22] | 0x80000000; + break; + + case 92: + w[23] = 0x80; + break; + + case 93: + w[23] = w[23] | 0x8000; + break; + + case 94: + w[23] = w[23] | 0x800000; + break; + + case 95: + w[23] = w[23] | 0x80000000; + break; + + case 96: + w[24] = 0x80; + break; + + case 97: + w[24] = w[24] | 0x8000; + break; + + case 98: + w[24] = w[24] | 0x800000; + break; + + case 99: + w[24] = w[24] | 0x80000000; + break; + + case 100: + w[25] = 0x80; + break; + + case 101: + w[25] = w[25] | 0x8000; + break; + + case 102: + w[25] = w[25] | 0x800000; + break; + + case 103: + w[25] = w[25] | 0x80000000; + break; + + case 104: + w[26] = 0x80; + break; + + case 105: + w[26] = w[26] | 0x8000; + break; + + case 106: + w[26] = w[26] | 0x800000; + break; + + case 107: + w[26] = w[26] | 0x80000000; + break; + + case 108: + w[27] = 0x80; + break; + + case 109: + w[27] = w[27] | 0x8000; + break; + + case 110: + w[27] = w[27] | 0x800000; + break; + + case 111: + w[27] = w[27] | 0x80000000; + break; + + case 112: + w[28] = 0x80; + break; + + case 113: + w[28] = w[28] | 0x8000; + break; + + case 114: + w[28] = w[28] | 0x800000; + break; + + case 115: + w[28] = w[28] | 0x80000000; + break; + + case 116: + w[29] = 0x80; + break; + + case 117: + w[29] = w[29] | 0x8000; + break; + + case 118: + w[29] = w[29] | 0x800000; + break; + + case 119: + w[29] = w[29] | 0x80000000; + break; + + case 120: + w[30] = 0x80; + break; + + case 121: + w[30] = w[30] | 0x8000; + break; + + case 122: + w[30] = w[30] | 0x800000; + break; + + case 123: + w[30] = w[30] | 0x80000000; + break; + + case 124: + w[31] = 0x80; + break; + + case 125: + w[31] = w[31] | 0x8000; + break; + + case 126: + w[31] = w[31] | 0x800000; + break; + + case 127: + w[31] = w[31] | 0x80000000; + break; + } +} + +static void device_memcat2L (const u32 offset, u32 dst0[2], u32 src_l0[2], u32 src_r0[2]) +{ + switch (offset) + { + case 1: + dst0[0] = src_l0[0] | src_r0[0] << 8; + dst0[1] = src_r0[0] >> 24 | src_r0[1] << 8; + break; + + case 2: + dst0[0] = src_l0[0] | src_r0[0] << 16; + dst0[1] = src_r0[0] >> 16 | src_r0[1] << 16; + break; + + case 3: + dst0[0] = src_l0[0] | src_r0[0] << 24; + dst0[1] = src_r0[0] >> 8 | src_r0[1] << 24; + break; + + case 4: + dst0[1] = src_r0[0]; + break; + + case 5: + dst0[1] = src_l0[1] | src_r0[0] << 8; + break; + + case 6: + dst0[1] = src_l0[1] | src_r0[0] << 16; + break; + + case 7: + dst0[1] = src_l0[1] | src_r0[0] << 24; + break; + } +} + +static void device_memcat4L (const u32 offset, u32 dst0[4], u32 src_l0[4], u32 src_r0[4]) +{ + switch (offset) + { + case 1: + dst0[0] = src_l0[0] | src_r0[0] << 8; + dst0[1] = src_r0[0] >> 24 | src_r0[1] << 8; + dst0[2] = src_r0[1] >> 24 | src_r0[2] << 8; + dst0[3] = src_r0[2] >> 24 | src_r0[3] << 8; + break; + + case 2: + dst0[0] = src_l0[0] | src_r0[0] << 16; + dst0[1] = src_r0[0] >> 16 | src_r0[1] << 16; + dst0[2] = src_r0[1] >> 16 | src_r0[2] << 16; + dst0[3] = src_r0[2] >> 16 | src_r0[3] << 16; + break; + + case 3: + dst0[0] = src_l0[0] | src_r0[0] << 24; + dst0[1] = src_r0[0] >> 8 | src_r0[1] << 24; + dst0[2] = src_r0[1] >> 8 | src_r0[2] << 24; + dst0[3] = src_r0[2] >> 8 | src_r0[3] << 24; + break; + + case 4: + dst0[1] = src_r0[0]; + dst0[2] = src_r0[1]; + dst0[3] = src_r0[2]; + break; + + case 5: + dst0[1] = src_l0[1] | src_r0[0] << 8; + dst0[2] = src_r0[0] >> 24 | src_r0[1] << 8; + dst0[3] = src_r0[1] >> 24 | src_r0[2] << 8; + break; + + case 6: + dst0[1] = src_l0[1] | src_r0[0] << 16; + dst0[2] = src_r0[0] >> 16 | src_r0[1] << 16; + dst0[3] = src_r0[1] >> 16 | src_r0[2] << 16; + break; + + case 7: + dst0[1] = src_l0[1] | src_r0[0] << 24; + dst0[2] = src_r0[0] >> 8 | src_r0[1] << 24; + dst0[3] = src_r0[1] >> 8 | src_r0[2] << 24; + break; + + case 8: + dst0[2] = src_r0[0]; + dst0[3] = src_r0[1]; + break; + + case 9: + dst0[2] = src_l0[2] | src_r0[0] << 8; + dst0[3] = src_r0[0] >> 24 | src_r0[1] << 8; + break; + + case 10: + dst0[2] = src_l0[2] | src_r0[0] << 16; + dst0[3] = src_r0[0] >> 16 | src_r0[1] << 16; + break; + + case 11: + dst0[2] = src_l0[2] | src_r0[0] << 24; + dst0[3] = src_r0[0] >> 8 | src_r0[1] << 24; + break; + + case 12: + dst0[3] = src_r0[0]; + break; + + case 13: + dst0[3] = src_l0[3] | src_r0[0] << 8; + break; + + case 14: + dst0[3] = src_l0[3] | src_r0[0] << 16; + break; + + case 15: + dst0[3] = src_l0[3] | src_r0[0] << 24; + break; + } +} + +static void device_memcat8L (const u32 offset, u32 dst0[4], u32 dst1[4], u32 src_l0[4], u32 src_l1[4], u32 src_r0[4]) +{ + switch (offset) + { + case 1: + dst0[0] = src_l0[0] | src_r0[0] << 8; + dst0[1] = src_r0[0] >> 24 | src_r0[1] << 8; + dst0[2] = src_r0[1] >> 24 | src_r0[2] << 8; + dst0[3] = src_r0[2] >> 24 | src_r0[3] << 8; + dst1[0] = src_r0[3] >> 24; + break; + + case 2: + dst0[0] = src_l0[0] | src_r0[0] << 16; + dst0[1] = src_r0[0] >> 16 | src_r0[1] << 16; + dst0[2] = src_r0[1] >> 16 | src_r0[2] << 16; + dst0[3] = src_r0[2] >> 16 | src_r0[3] << 16; + dst1[0] = src_r0[3] >> 16; + break; + + case 3: + dst0[0] = src_l0[0] | src_r0[0] << 24; + dst0[1] = src_r0[0] >> 8 | src_r0[1] << 24; + dst0[2] = src_r0[1] >> 8 | src_r0[2] << 24; + dst0[3] = src_r0[2] >> 8 | src_r0[3] << 24; + dst1[0] = src_r0[3] >> 8; + break; + + case 4: + dst0[1] = src_r0[0]; + dst0[2] = src_r0[1]; + dst0[3] = src_r0[2]; + dst1[0] = src_r0[3]; + break; + + case 5: + dst0[1] = src_l0[1] | src_r0[0] << 8; + dst0[2] = src_r0[0] >> 24 | src_r0[1] << 8; + dst0[3] = src_r0[1] >> 24 | src_r0[2] << 8; + dst1[0] = src_r0[2] >> 24 | src_r0[3] << 8; + dst1[1] = src_r0[3] >> 24; + break; + + case 6: + dst0[1] = src_l0[1] | src_r0[0] << 16; + dst0[2] = src_r0[0] >> 16 | src_r0[1] << 16; + dst0[3] = src_r0[1] >> 16 | src_r0[2] << 16; + dst1[0] = src_r0[2] >> 16 | src_r0[3] << 16; + dst1[1] = src_r0[3] >> 16; + break; + + case 7: + dst0[1] = src_l0[1] | src_r0[0] << 24; + dst0[2] = src_r0[0] >> 8 | src_r0[1] << 24; + dst0[3] = src_r0[1] >> 8 | src_r0[2] << 24; + dst1[0] = src_r0[2] >> 8 | src_r0[3] << 24; + dst1[1] = src_r0[3] >> 8; + break; + + case 8: + dst0[2] = src_r0[0]; + dst0[3] = src_r0[1]; + dst1[0] = src_r0[2]; + dst1[1] = src_r0[3]; + break; + + case 9: + dst0[2] = src_l0[2] | src_r0[0] << 8; + dst0[3] = src_r0[0] >> 24 | src_r0[1] << 8; + dst1[0] = src_r0[1] >> 24 | src_r0[2] << 8; + dst1[1] = src_r0[2] >> 24 | src_r0[3] << 8; + dst1[2] = src_r0[3] >> 24; + break; + + case 10: + dst0[2] = src_l0[2] | src_r0[0] << 16; + dst0[3] = src_r0[0] >> 16 | src_r0[1] << 16; + dst1[0] = src_r0[1] >> 16 | src_r0[2] << 16; + dst1[1] = src_r0[2] >> 16 | src_r0[3] << 16; + dst1[2] = src_r0[3] >> 16; + break; + + case 11: + dst0[2] = src_l0[2] | src_r0[0] << 24; + dst0[3] = src_r0[0] >> 8 | src_r0[1] << 24; + dst1[0] = src_r0[1] >> 8 | src_r0[2] << 24; + dst1[1] = src_r0[2] >> 8 | src_r0[3] << 24; + dst1[2] = src_r0[3] >> 8; + break; + + case 12: + dst0[3] = src_r0[0]; + dst1[0] = src_r0[1]; + dst1[1] = src_r0[2]; + dst1[2] = src_r0[3]; + break; + + case 13: + dst0[3] = src_l0[3] | src_r0[0] << 8; + dst1[0] = src_r0[0] >> 24 | src_r0[1] << 8; + dst1[1] = src_r0[1] >> 24 | src_r0[2] << 8; + dst1[2] = src_r0[2] >> 24 | src_r0[3] << 8; + dst1[3] = src_r0[3] >> 24; + break; + + case 14: + dst0[3] = src_l0[3] | src_r0[0] << 16; + dst1[0] = src_r0[0] >> 16 | src_r0[1] << 16; + dst1[1] = src_r0[1] >> 16 | src_r0[2] << 16; + dst1[2] = src_r0[2] >> 16 | src_r0[3] << 16; + dst1[3] = src_r0[3] >> 16; + break; + + case 15: + dst0[3] = src_l0[3] | src_r0[0] << 24; + dst1[0] = src_r0[0] >> 8 | src_r0[1] << 24; + dst1[1] = src_r0[1] >> 8 | src_r0[2] << 24; + dst1[2] = src_r0[2] >> 8 | src_r0[3] << 24; + dst1[3] = src_r0[3] >> 8; + break; + + case 16: + dst1[0] = src_r0[0]; + dst1[1] = src_r0[1]; + dst1[2] = src_r0[2]; + dst1[3] = src_r0[3]; + break; + + case 17: + dst1[0] = src_l1[0] | src_r0[0] << 8; + dst1[1] = src_r0[0] >> 24 | src_r0[1] << 8; + dst1[2] = src_r0[1] >> 24 | src_r0[2] << 8; + dst1[3] = src_r0[2] >> 24 | src_r0[3] << 8; + break; + + case 18: + dst1[0] = src_l1[0] | src_r0[0] << 16; + dst1[1] = src_r0[0] >> 16 | src_r0[1] << 16; + dst1[2] = src_r0[1] >> 16 | src_r0[2] << 16; + dst1[3] = src_r0[2] >> 16 | src_r0[3] << 16; + break; + + case 19: + dst1[0] = src_l1[0] | src_r0[0] << 24; + dst1[1] = src_r0[0] >> 8 | src_r0[1] << 24; + dst1[2] = src_r0[1] >> 8 | src_r0[2] << 24; + dst1[3] = src_r0[2] >> 8 | src_r0[3] << 24; + break; + + case 20: + dst1[1] = src_r0[0]; + dst1[2] = src_r0[1]; + dst1[3] = src_r0[2]; + break; + + case 21: + dst1[1] = src_l1[1] | src_r0[0] << 8; + dst1[2] = src_r0[0] >> 24 | src_r0[1] << 8; + dst1[3] = src_r0[1] >> 24 | src_r0[2] << 8; + break; + + case 22: + dst1[1] = src_l1[1] | src_r0[0] << 16; + dst1[2] = src_r0[0] >> 16 | src_r0[1] << 16; + dst1[3] = src_r0[1] >> 16 | src_r0[2] << 16; + break; + + case 23: + dst1[1] = src_l1[1] | src_r0[0] << 24; + dst1[2] = src_r0[0] >> 8 | src_r0[1] << 24; + dst1[3] = src_r0[1] >> 8 | src_r0[2] << 24; + break; + + case 24: + dst1[2] = src_r0[0]; + dst1[3] = src_r0[1]; + break; + + case 25: + dst1[2] = src_l1[2] | src_r0[0] << 8; + dst1[3] = src_r0[0] >> 24 | src_r0[1] << 8; + break; + + case 26: + dst1[2] = src_l1[2] | src_r0[0] << 16; + dst1[3] = src_r0[0] >> 16 | src_r0[1] << 16; + break; + + case 27: + dst1[2] = src_l1[2] | src_r0[0] << 24; + dst1[3] = src_r0[0] >> 8 | src_r0[1] << 24; + break; + + case 28: + dst1[3] = src_r0[0]; + break; + + case 29: + dst1[3] = src_l1[3] | src_r0[0] << 8; + break; + + case 30: + dst1[3] = src_l1[3] | src_r0[0] << 16; + break; + + case 31: + dst1[3] = src_l1[3] | src_r0[0] << 24; + break; + } +} + +static void device_memcat12L (const u32 offset, u32 dst0[4], u32 dst1[4], u32 dst2[4], u32 src_l0[4], u32 src_l1[4], u32 src_l2[4], u32 src_r0[4]) +{ + switch (offset) + { + case 1: + dst0[0] = src_l0[0] | src_r0[0] << 8; + dst0[1] = src_r0[0] >> 24 | src_r0[1] << 8; + dst0[2] = src_r0[1] >> 24 | src_r0[2] << 8; + dst0[3] = src_r0[2] >> 24 | src_r0[3] << 8; + dst1[0] = src_r0[3] >> 24; + break; + + case 2: + dst0[0] = src_l0[0] | src_r0[0] << 16; + dst0[1] = src_r0[0] >> 16 | src_r0[1] << 16; + dst0[2] = src_r0[1] >> 16 | src_r0[2] << 16; + dst0[3] = src_r0[2] >> 16 | src_r0[3] << 16; + dst1[0] = src_r0[3] >> 16; + break; + + case 3: + dst0[0] = src_l0[0] | src_r0[0] << 24; + dst0[1] = src_r0[0] >> 8 | src_r0[1] << 24; + dst0[2] = src_r0[1] >> 8 | src_r0[2] << 24; + dst0[3] = src_r0[2] >> 8 | src_r0[3] << 24; + dst1[0] = src_r0[3] >> 8; + break; + + case 4: + dst0[1] = src_r0[0]; + dst0[2] = src_r0[1]; + dst0[3] = src_r0[2]; + dst1[0] = src_r0[3]; + break; + + case 5: + dst0[1] = src_l0[1] | src_r0[0] << 8; + dst0[2] = src_r0[0] >> 24 | src_r0[1] << 8; + dst0[3] = src_r0[1] >> 24 | src_r0[2] << 8; + dst1[0] = src_r0[2] >> 24 | src_r0[3] << 8; + dst1[1] = src_r0[3] >> 24; + break; + + case 6: + dst0[1] = src_l0[1] | src_r0[0] << 16; + dst0[2] = src_r0[0] >> 16 | src_r0[1] << 16; + dst0[3] = src_r0[1] >> 16 | src_r0[2] << 16; + dst1[0] = src_r0[2] >> 16 | src_r0[3] << 16; + dst1[1] = src_r0[3] >> 16; + break; + + case 7: + dst0[1] = src_l0[1] | src_r0[0] << 24; + dst0[2] = src_r0[0] >> 8 | src_r0[1] << 24; + dst0[3] = src_r0[1] >> 8 | src_r0[2] << 24; + dst1[0] = src_r0[2] >> 8 | src_r0[3] << 24; + dst1[1] = src_r0[3] >> 8; + break; + + case 8: + dst0[2] = src_r0[0]; + dst0[3] = src_r0[1]; + dst1[0] = src_r0[2]; + dst1[1] = src_r0[3]; + break; + + case 9: + dst0[2] = src_l0[2] | src_r0[0] << 8; + dst0[3] = src_r0[0] >> 24 | src_r0[1] << 8; + dst1[0] = src_r0[1] >> 24 | src_r0[2] << 8; + dst1[1] = src_r0[2] >> 24 | src_r0[3] << 8; + dst1[2] = src_r0[3] >> 24; + break; + + case 10: + dst0[2] = src_l0[2] | src_r0[0] << 16; + dst0[3] = src_r0[0] >> 16 | src_r0[1] << 16; + dst1[0] = src_r0[1] >> 16 | src_r0[2] << 16; + dst1[1] = src_r0[2] >> 16 | src_r0[3] << 16; + dst1[2] = src_r0[3] >> 16; + break; + + case 11: + dst0[2] = src_l0[2] | src_r0[0] << 24; + dst0[3] = src_r0[0] >> 8 | src_r0[1] << 24; + dst1[0] = src_r0[1] >> 8 | src_r0[2] << 24; + dst1[1] = src_r0[2] >> 8 | src_r0[3] << 24; + dst1[2] = src_r0[3] >> 8; + break; + + case 12: + dst0[3] = src_r0[0]; + dst1[0] = src_r0[1]; + dst1[1] = src_r0[2]; + dst1[2] = src_r0[3]; + break; + + case 13: + dst0[3] = src_l0[3] | src_r0[0] << 8; + dst1[0] = src_r0[0] >> 24 | src_r0[1] << 8; + dst1[1] = src_r0[1] >> 24 | src_r0[2] << 8; + dst1[2] = src_r0[2] >> 24 | src_r0[3] << 8; + dst1[3] = src_r0[3] >> 24; + break; + + case 14: + dst0[3] = src_l0[3] | src_r0[0] << 16; + dst1[0] = src_r0[0] >> 16 | src_r0[1] << 16; + dst1[1] = src_r0[1] >> 16 | src_r0[2] << 16; + dst1[2] = src_r0[2] >> 16 | src_r0[3] << 16; + dst1[3] = src_r0[3] >> 16; + break; + + case 15: + dst0[3] = src_l0[3] | src_r0[0] << 24; + dst1[0] = src_r0[0] >> 8 | src_r0[1] << 24; + dst1[1] = src_r0[1] >> 8 | src_r0[2] << 24; + dst1[2] = src_r0[2] >> 8 | src_r0[3] << 24; + dst1[3] = src_r0[3] >> 8; + break; + + case 16: + dst1[0] = src_r0[0]; + dst1[1] = src_r0[1]; + dst1[2] = src_r0[2]; + dst1[3] = src_r0[3]; + break; + + case 17: + dst1[0] = src_l1[0] | src_r0[0] << 8; + dst1[1] = src_r0[0] >> 24 | src_r0[1] << 8; + dst1[2] = src_r0[1] >> 24 | src_r0[2] << 8; + dst1[3] = src_r0[2] >> 24 | src_r0[3] << 8; + dst2[0] = src_r0[3] >> 24; + break; + + case 18: + dst1[0] = src_l1[0] | src_r0[0] << 16; + dst1[1] = src_r0[0] >> 16 | src_r0[1] << 16; + dst1[2] = src_r0[1] >> 16 | src_r0[2] << 16; + dst1[3] = src_r0[2] >> 16 | src_r0[3] << 16; + dst2[0] = src_r0[3] >> 16; + break; + + case 19: + dst1[0] = src_l1[0] | src_r0[0] << 24; + dst1[1] = src_r0[0] >> 8 | src_r0[1] << 24; + dst1[2] = src_r0[1] >> 8 | src_r0[2] << 24; + dst1[3] = src_r0[2] >> 8 | src_r0[3] << 24; + dst2[0] = src_r0[3] >> 8; + break; + + case 20: + dst1[1] = src_r0[0]; + dst1[2] = src_r0[1]; + dst1[3] = src_r0[2]; + dst2[0] = src_r0[3]; + break; + + case 21: + dst1[1] = src_l1[1] | src_r0[0] << 8; + dst1[2] = src_r0[0] >> 24 | src_r0[1] << 8; + dst1[3] = src_r0[1] >> 24 | src_r0[2] << 8; + dst2[0] = src_r0[2] >> 24 | src_r0[3] << 8; + dst2[1] = src_r0[3] >> 24; + break; + + case 22: + dst1[1] = src_l1[1] | src_r0[0] << 16; + dst1[2] = src_r0[0] >> 16 | src_r0[1] << 16; + dst1[3] = src_r0[1] >> 16 | src_r0[2] << 16; + dst2[0] = src_r0[2] >> 16 | src_r0[3] << 16; + dst2[1] = src_r0[3] >> 16; + break; + + case 23: + dst1[1] = src_l1[1] | src_r0[0] << 24; + dst1[2] = src_r0[0] >> 8 | src_r0[1] << 24; + dst1[3] = src_r0[1] >> 8 | src_r0[2] << 24; + dst2[0] = src_r0[2] >> 8 | src_r0[3] << 24; + dst2[1] = src_r0[3] >> 8; + break; + + case 24: + dst1[2] = src_r0[0]; + dst1[3] = src_r0[1]; + dst2[0] = src_r0[2]; + dst2[1] = src_r0[3]; + break; + + case 25: + dst1[2] = src_l1[2] | src_r0[0] << 8; + dst1[3] = src_r0[0] >> 24 | src_r0[1] << 8; + dst2[0] = src_r0[1] >> 24 | src_r0[2] << 8; + dst2[1] = src_r0[2] >> 24 | src_r0[3] << 8; + dst2[2] = src_r0[3] >> 24; + break; + + case 26: + dst1[2] = src_l1[2] | src_r0[0] << 16; + dst1[3] = src_r0[0] >> 16 | src_r0[1] << 16; + dst2[0] = src_r0[1] >> 16 | src_r0[2] << 16; + dst2[1] = src_r0[2] >> 16 | src_r0[3] << 16; + dst2[2] = src_r0[3] >> 16; + break; + + case 27: + dst1[2] = src_l1[2] | src_r0[0] << 24; + dst1[3] = src_r0[0] >> 8 | src_r0[1] << 24; + dst2[0] = src_r0[1] >> 8 | src_r0[2] << 24; + dst2[1] = src_r0[2] >> 8 | src_r0[3] << 24; + dst2[2] = src_r0[3] >> 8; + break; + + case 28: + dst1[3] = src_r0[0]; + dst2[0] = src_r0[1]; + dst2[1] = src_r0[2]; + dst2[2] = src_r0[3]; + break; + + case 29: + dst1[3] = src_l1[3] | src_r0[0] << 8; + dst2[0] = src_r0[0] >> 24 | src_r0[1] << 8; + dst2[1] = src_r0[1] >> 24 | src_r0[2] << 8; + dst2[2] = src_r0[2] >> 24 | src_r0[3] << 8; + dst2[3] = src_r0[3] >> 24; + break; + + case 30: + dst1[3] = src_l1[3] | src_r0[0] << 16; + dst2[0] = src_r0[0] >> 16 | src_r0[1] << 16; + dst2[1] = src_r0[1] >> 16 | src_r0[2] << 16; + dst2[2] = src_r0[2] >> 16 | src_r0[3] << 16; + dst2[3] = src_r0[3] >> 16; + break; + + case 31: + dst1[3] = src_l1[3] | src_r0[0] << 24; + dst2[0] = src_r0[0] >> 8 | src_r0[1] << 24; + dst2[1] = src_r0[1] >> 8 | src_r0[2] << 24; + dst2[2] = src_r0[2] >> 8 | src_r0[3] << 24; + dst2[3] = src_r0[3] >> 8; + break; + + case 32: + dst2[0] = src_r0[0]; + dst2[1] = src_r0[1]; + dst2[2] = src_r0[2]; + dst2[3] = src_r0[3]; + break; + + case 33: + dst2[0] = src_l2[0] | src_r0[0] << 8; + dst2[1] = src_r0[0] >> 24 | src_r0[1] << 8; + dst2[2] = src_r0[1] >> 24 | src_r0[2] << 8; + dst2[3] = src_r0[2] >> 24 | src_r0[3] << 8; + break; + + case 34: + dst2[0] = src_l2[0] | src_r0[0] << 16; + dst2[1] = src_r0[0] >> 16 | src_r0[1] << 16; + dst2[2] = src_r0[1] >> 16 | src_r0[2] << 16; + dst2[3] = src_r0[2] >> 16 | src_r0[3] << 16; + break; + + case 35: + dst2[0] = src_l2[0] | src_r0[0] << 24; + dst2[1] = src_r0[0] >> 8 | src_r0[1] << 24; + dst2[2] = src_r0[1] >> 8 | src_r0[2] << 24; + dst2[3] = src_r0[2] >> 8 | src_r0[3] << 24; + break; + + case 36: + dst2[1] = src_r0[0]; + dst2[2] = src_r0[1]; + dst2[3] = src_r0[2]; + break; + + case 37: + dst2[1] = src_l2[1] | src_r0[0] << 8; + dst2[2] = src_r0[0] >> 24 | src_r0[1] << 8; + dst2[3] = src_r0[1] >> 24 | src_r0[2] << 8; + break; + + case 38: + dst2[1] = src_l2[1] | src_r0[0] << 16; + dst2[2] = src_r0[0] >> 16 | src_r0[1] << 16; + dst2[3] = src_r0[1] >> 16 | src_r0[2] << 16; + break; + + case 39: + dst2[1] = src_l2[1] | src_r0[0] << 24; + dst2[2] = src_r0[0] >> 8 | src_r0[1] << 24; + dst2[3] = src_r0[1] >> 8 | src_r0[2] << 24; + break; + + case 40: + dst2[2] = src_r0[0]; + dst2[3] = src_r0[1]; + break; + + case 41: + dst2[2] = src_l2[2] | src_r0[0] << 8; + dst2[3] = src_r0[0] >> 24 | src_r0[1] << 8; + break; + + case 42: + dst2[2] = src_l2[2] | src_r0[0] << 16; + dst2[3] = src_r0[0] >> 16 | src_r0[1] << 16; + break; + + case 43: + dst2[2] = src_l2[2] | src_r0[0] << 24; + dst2[3] = src_r0[0] >> 8 | src_r0[1] << 24; + break; + + case 44: + dst2[3] = src_r0[0]; + break; + + case 45: + dst2[3] = src_l2[3] | src_r0[0] << 8; + break; + + case 46: + dst2[3] = src_l2[3] | src_r0[0] << 16; + break; + + case 47: + dst2[3] = src_l2[3] | src_r0[0] << 24; + break; + } +} + +static void device_memcat12L (const u32 offset, u32 dst0[4], u32 dst1[4], u32 dst2[4], u32 src_l0[4], u32 src_l1[4], u32 src_l2[4], u32 src_r0[4], u32 src_r1[4]) +{ + switch (offset) + { + case 0: + dst0[0] = src_r0[0]; + dst0[1] = src_r0[1]; + dst0[2] = src_r0[2]; + dst0[3] = src_r0[3]; + dst1[0] = src_r1[0]; + dst1[1] = src_r1[1]; + dst1[2] = src_r1[2]; + dst1[3] = src_r1[3]; + break; + + case 1: + dst0[0] = src_l0[0] | src_r0[0] << 8; + dst0[1] = src_r0[0] >> 24 | src_r0[1] << 8; + dst0[2] = src_r0[1] >> 24 | src_r0[2] << 8; + dst0[3] = src_r0[2] >> 24 | src_r0[3] << 8; + dst1[0] = src_r0[3] >> 24 | src_r1[0] << 8; + dst1[1] = src_r1[0] >> 24 | src_r1[1] << 8; + dst1[2] = src_r1[1] >> 24 | src_r1[2] << 8; + dst1[3] = src_r1[2] >> 24 | src_r1[3] << 8; + dst2[0] = src_r1[3] >> 24; + break; + + case 2: + dst0[0] = src_l0[0] | src_r0[0] << 16; + dst0[1] = src_r0[0] >> 16 | src_r0[1] << 16; + dst0[2] = src_r0[1] >> 16 | src_r0[2] << 16; + dst0[3] = src_r0[2] >> 16 | src_r0[3] << 16; + dst1[0] = src_r0[3] >> 16 | src_r1[0] << 16; + dst1[1] = src_r1[0] >> 16 | src_r1[1] << 16; + dst1[2] = src_r1[1] >> 16 | src_r1[2] << 16; + dst1[3] = src_r1[2] >> 16 | src_r1[3] << 16; + dst2[0] = src_r1[3] >> 16; + break; + + case 3: + dst0[0] = src_l0[0] | src_r0[0] << 24; + dst0[1] = src_r0[0] >> 8 | src_r0[1] << 24; + dst0[2] = src_r0[1] >> 8 | src_r0[2] << 24; + dst0[3] = src_r0[2] >> 8 | src_r0[3] << 24; + dst1[0] = src_r0[3] >> 8 | src_r1[0] << 24; + dst1[1] = src_r1[0] >> 8 | src_r1[1] << 24; + dst1[2] = src_r1[1] >> 8 | src_r1[2] << 24; + dst1[3] = src_r1[2] >> 8 | src_r1[3] << 24; + dst2[0] = src_r1[3] >> 8; + break; + + case 4: + dst0[1] = src_r0[0]; + dst0[2] = src_r0[1]; + dst0[3] = src_r0[2]; + dst1[0] = src_r0[3]; + dst1[1] = src_r1[0]; + dst1[2] = src_r1[1]; + dst1[3] = src_r1[2]; + dst2[0] = src_r1[3]; + break; + + case 5: + dst0[1] = src_l0[1] | src_r0[0] << 8; + dst0[2] = src_r0[0] >> 24 | src_r0[1] << 8; + dst0[3] = src_r0[1] >> 24 | src_r0[2] << 8; + dst1[0] = src_r0[2] >> 24 | src_r0[3] << 8; + dst1[1] = src_r0[3] >> 24 | src_r1[0] << 8; + dst1[2] = src_r1[0] >> 24 | src_r1[1] << 8; + dst1[3] = src_r1[1] >> 24 | src_r1[2] << 8; + dst2[0] = src_r1[2] >> 24 | src_r1[3] << 8; + dst2[1] = src_r1[3] >> 24; + break; + + case 6: + dst0[1] = src_l0[1] | src_r0[0] << 16; + dst0[2] = src_r0[0] >> 16 | src_r0[1] << 16; + dst0[3] = src_r0[1] >> 16 | src_r0[2] << 16; + dst1[0] = src_r0[2] >> 16 | src_r0[3] << 16; + dst1[1] = src_r0[3] >> 16 | src_r1[0] << 16; + dst1[2] = src_r1[0] >> 16 | src_r1[1] << 16; + dst1[3] = src_r1[1] >> 16 | src_r1[2] << 16; + dst2[0] = src_r1[2] >> 16 | src_r1[3] << 16; + dst2[1] = src_r1[3] >> 16; + break; + + case 7: + dst0[1] = src_l0[1] | src_r0[0] << 24; + dst0[2] = src_r0[0] >> 8 | src_r0[1] << 24; + dst0[3] = src_r0[1] >> 8 | src_r0[2] << 24; + dst1[0] = src_r0[2] >> 8 | src_r0[3] << 24; + dst1[1] = src_r0[3] >> 8 | src_r1[0] << 24; + dst1[2] = src_r1[0] >> 8 | src_r1[1] << 24; + dst1[3] = src_r1[1] >> 8 | src_r1[2] << 24; + dst2[0] = src_r1[2] >> 8 | src_r1[3] << 24; + dst2[1] = src_r1[3] >> 8; + break; + + case 8: + dst0[2] = src_r0[0]; + dst0[3] = src_r0[1]; + dst1[0] = src_r0[2]; + dst1[1] = src_r0[3]; + dst1[2] = src_r1[0]; + dst1[3] = src_r1[1]; + dst2[0] = src_r1[2]; + dst2[1] = src_r1[3]; + break; + + case 9: + dst0[2] = src_l0[2] | src_r0[0] << 8; + dst0[3] = src_r0[0] >> 24 | src_r0[1] << 8; + dst1[0] = src_r0[1] >> 24 | src_r0[2] << 8; + dst1[1] = src_r0[2] >> 24 | src_r0[3] << 8; + dst1[2] = src_r0[3] >> 24 | src_r1[0] << 8; + dst1[3] = src_r1[0] >> 24 | src_r1[1] << 8; + dst2[0] = src_r1[1] >> 24 | src_r1[2] << 8; + dst2[1] = src_r1[2] >> 24 | src_r1[3] << 8; + dst2[2] = src_r1[3] >> 24; + break; + + case 10: + dst0[2] = src_l0[2] | src_r0[0] << 16; + dst0[3] = src_r0[0] >> 16 | src_r0[1] << 16; + dst1[0] = src_r0[1] >> 16 | src_r0[2] << 16; + dst1[1] = src_r0[2] >> 16 | src_r0[3] << 16; + dst1[2] = src_r0[3] >> 16 | src_r1[0] << 16; + dst1[3] = src_r1[0] >> 16 | src_r1[1] << 16; + dst2[0] = src_r1[1] >> 16 | src_r1[2] << 16; + dst2[1] = src_r1[2] >> 16 | src_r1[3] << 16; + dst2[2] = src_r1[3] >> 16; + break; + + case 11: + dst0[2] = src_l0[2] | src_r0[0] << 24; + dst0[3] = src_r0[0] >> 8 | src_r0[1] << 24; + dst1[0] = src_r0[1] >> 8 | src_r0[2] << 24; + dst1[1] = src_r0[2] >> 8 | src_r0[3] << 24; + dst1[2] = src_r0[3] >> 8 | src_r1[0] << 24; + dst1[3] = src_r1[0] >> 8 | src_r1[1] << 24; + dst2[0] = src_r1[1] >> 8 | src_r1[2] << 24; + dst2[1] = src_r1[2] >> 8 | src_r1[3] << 24; + dst2[2] = src_r1[3] >> 8; + break; + + case 12: + dst0[3] = src_r0[0]; + dst1[0] = src_r0[1]; + dst1[1] = src_r0[2]; + dst1[2] = src_r0[3]; + dst1[3] = src_r1[0]; + dst2[0] = src_r1[1]; + dst2[1] = src_r1[2]; + dst2[2] = src_r1[3]; + break; + + case 13: + dst0[3] = src_l0[3] | src_r0[0] << 8; + dst1[0] = src_r0[0] >> 24 | src_r0[1] << 8; + dst1[1] = src_r0[1] >> 24 | src_r0[2] << 8; + dst1[2] = src_r0[2] >> 24 | src_r0[3] << 8; + dst1[3] = src_r0[3] >> 24 | src_r1[0] << 8; + dst2[0] = src_r1[0] >> 24 | src_r1[1] << 8; + dst2[1] = src_r1[1] >> 24 | src_r1[2] << 8; + dst2[2] = src_r1[2] >> 24 | src_r1[3] << 8; + dst2[3] = src_r1[3] >> 24; + break; + + case 14: + dst0[3] = src_l0[3] | src_r0[0] << 16; + dst1[0] = src_r0[0] >> 16 | src_r0[1] << 16; + dst1[1] = src_r0[1] >> 16 | src_r0[2] << 16; + dst1[2] = src_r0[2] >> 16 | src_r0[3] << 16; + dst1[3] = src_r0[3] >> 16 | src_r1[0] << 16; + dst2[0] = src_r1[0] >> 16 | src_r1[1] << 16; + dst2[1] = src_r1[1] >> 16 | src_r1[2] << 16; + dst2[2] = src_r1[2] >> 16 | src_r1[3] << 16; + dst2[3] = src_r1[3] >> 16; + break; + + case 15: + dst0[3] = src_l0[3] | src_r0[0] << 24; + dst1[0] = src_r0[0] >> 8 | src_r0[1] << 24; + dst1[1] = src_r0[1] >> 8 | src_r0[2] << 24; + dst1[2] = src_r0[2] >> 8 | src_r0[3] << 24; + dst1[3] = src_r0[3] >> 8 | src_r1[0] << 24; + dst2[0] = src_r1[0] >> 8 | src_r1[1] << 24; + dst2[1] = src_r1[1] >> 8 | src_r1[2] << 24; + dst2[2] = src_r1[2] >> 8 | src_r1[3] << 24; + dst2[3] = src_r1[3] >> 8; + break; + + case 16: + dst1[0] = src_r0[0]; + dst1[1] = src_r0[1]; + dst1[2] = src_r0[2]; + dst1[3] = src_r0[3]; + dst2[0] = src_r1[0]; + dst2[1] = src_r1[1]; + dst2[2] = src_r1[2]; + dst2[3] = src_r1[3]; + break; + + case 17: + dst1[0] = src_l1[0] | src_r0[0] << 8; + dst1[1] = src_r0[0] >> 24 | src_r0[1] << 8; + dst1[2] = src_r0[1] >> 24 | src_r0[2] << 8; + dst1[3] = src_r0[2] >> 24 | src_r0[3] << 8; + dst2[0] = src_r0[3] >> 24 | src_r1[0] << 8; + dst2[1] = src_r1[0] >> 24 | src_r1[1] << 8; + dst2[2] = src_r1[1] >> 24 | src_r1[2] << 8; + dst2[3] = src_r1[2] >> 24 | src_r1[3] << 8; + break; + + case 18: + dst1[0] = src_l1[0] | src_r0[0] << 16; + dst1[1] = src_r0[0] >> 16 | src_r0[1] << 16; + dst1[2] = src_r0[1] >> 16 | src_r0[2] << 16; + dst1[3] = src_r0[2] >> 16 | src_r0[3] << 16; + dst2[0] = src_r0[3] >> 16 | src_r1[0] << 16; + dst2[1] = src_r1[0] >> 16 | src_r1[1] << 16; + dst2[2] = src_r1[1] >> 16 | src_r1[2] << 16; + dst2[3] = src_r1[2] >> 16 | src_r1[3] << 16; + break; + + case 19: + dst1[0] = src_l1[0] | src_r0[0] << 24; + dst1[1] = src_r0[0] >> 8 | src_r0[1] << 24; + dst1[2] = src_r0[1] >> 8 | src_r0[2] << 24; + dst1[3] = src_r0[2] >> 8 | src_r0[3] << 24; + dst2[0] = src_r0[3] >> 8 | src_r1[0] << 24; + dst2[1] = src_r1[0] >> 8 | src_r1[1] << 24; + dst2[2] = src_r1[1] >> 8 | src_r1[2] << 24; + dst2[3] = src_r1[2] >> 8 | src_r1[3] << 24; + break; + + case 20: + dst1[1] = src_r1[0]; + dst1[2] = src_r0[1]; + dst1[3] = src_r0[2]; + dst2[0] = src_r0[3]; + dst2[1] = src_r1[0]; + dst2[2] = src_r1[1]; + dst2[3] = src_r1[2]; + break; + + case 21: + dst1[1] = src_l1[1] | src_r0[0] << 8; + dst1[2] = src_r0[0] >> 24 | src_r0[1] << 8; + dst1[3] = src_r0[1] >> 24 | src_r0[2] << 8; + dst2[0] = src_r0[2] >> 24 | src_r0[3] << 8; + dst2[1] = src_r0[3] >> 24 | src_r1[0] << 8; + dst2[2] = src_r1[0] >> 24 | src_r1[1] << 8; + dst2[3] = src_r1[1] >> 24 | src_r1[2] << 8; + break; + + case 22: + dst1[1] = src_l1[1] | src_r0[0] << 16; + dst1[2] = src_r0[0] >> 16 | src_r0[1] << 16; + dst1[3] = src_r0[1] >> 16 | src_r0[2] << 16; + dst2[0] = src_r0[2] >> 16 | src_r0[3] << 16; + dst2[1] = src_r0[3] >> 16 | src_r1[0] << 16; + dst2[2] = src_r1[0] >> 16 | src_r1[1] << 16; + dst2[3] = src_r1[1] >> 16 | src_r1[2] << 16; + break; + + case 23: + dst1[1] = src_l1[1] | src_r0[0] << 24; + dst1[2] = src_r0[0] >> 8 | src_r0[1] << 24; + dst1[3] = src_r0[1] >> 8 | src_r0[2] << 24; + dst2[0] = src_r0[2] >> 8 | src_r0[3] << 24; + dst2[1] = src_r0[3] >> 8 | src_r1[0] << 24; + dst2[2] = src_r1[0] >> 8 | src_r1[1] << 24; + dst2[3] = src_r1[1] >> 8 | src_r1[2] << 24; + break; + + case 24: + dst1[2] = src_r1[0]; + dst1[3] = src_r0[1]; + dst2[0] = src_r0[2]; + dst2[1] = src_r0[3]; + dst2[2] = src_r1[0]; + dst2[3] = src_r1[1]; + break; + + case 25: + dst1[2] = src_l1[2] | src_r0[0] << 8; + dst1[3] = src_r0[0] >> 24 | src_r0[1] << 8; + dst2[0] = src_r0[1] >> 24 | src_r0[2] << 8; + dst2[1] = src_r0[2] >> 24 | src_r0[3] << 8; + dst2[2] = src_r0[3] >> 24 | src_r1[0] << 8; + dst2[3] = src_r1[0] >> 24 | src_r1[1] << 8; + break; + + case 26: + dst1[2] = src_l1[2] | src_r0[0] << 16; + dst1[3] = src_r0[0] >> 16 | src_r0[1] << 16; + dst2[0] = src_r0[1] >> 16 | src_r0[2] << 16; + dst2[1] = src_r0[2] >> 16 | src_r0[3] << 16; + dst2[2] = src_r0[3] >> 16 | src_r1[0] << 16; + dst2[3] = src_r1[0] >> 16 | src_r1[1] << 16; + break; + + case 27: + dst1[2] = src_l1[2] | src_r0[0] << 24; + dst1[3] = src_r0[0] >> 8 | src_r0[1] << 24; + dst2[0] = src_r0[1] >> 8 | src_r0[2] << 24; + dst2[1] = src_r0[2] >> 8 | src_r0[3] << 24; + dst2[2] = src_r0[3] >> 8 | src_r1[0] << 24; + dst2[3] = src_r1[0] >> 8 | src_r1[1] << 24; + break; + + case 28: + dst1[3] = src_r1[0]; + dst2[0] = src_r0[1]; + dst2[1] = src_r0[2]; + dst2[2] = src_r0[3]; + dst2[3] = src_r1[0]; + break; + + case 29: + dst1[3] = src_l1[3] | src_r0[0] << 8; + dst2[0] = src_r0[0] >> 24 | src_r0[1] << 8; + dst2[1] = src_r0[1] >> 24 | src_r0[2] << 8; + dst2[2] = src_r0[2] >> 24 | src_r0[3] << 8; + dst2[3] = src_r0[3] >> 24 | src_r1[0] << 8; + break; + + case 30: + dst1[3] = src_l1[3] | src_r0[0] << 16; + dst2[0] = src_r0[0] >> 16 | src_r0[1] << 16; + dst2[1] = src_r0[1] >> 16 | src_r0[2] << 16; + dst2[2] = src_r0[2] >> 16 | src_r0[3] << 16; + dst2[3] = src_r0[3] >> 16 | src_r1[0] << 16; + break; + + case 31: + dst1[3] = src_l1[3] | src_r0[0] << 24; + dst2[0] = src_r0[0] >> 8 | src_r0[1] << 24; + dst2[1] = src_r0[1] >> 8 | src_r0[2] << 24; + dst2[2] = src_r0[2] >> 8 | src_r0[3] << 24; + dst2[3] = src_r0[3] >> 8 | src_r1[0] << 24; + break; + + case 32: + dst2[0] = src_r0[0]; + dst2[1] = src_r0[1]; + dst2[2] = src_r0[2]; + dst2[3] = src_r0[3]; + break; + + case 33: + dst2[0] = src_l2[0] | src_r0[0] << 8; + dst2[1] = src_r0[0] >> 24 | src_r0[1] << 8; + dst2[2] = src_r0[1] >> 24 | src_r0[2] << 8; + dst2[3] = src_r0[2] >> 24 | src_r0[3] << 8; + break; + + case 34: + dst2[0] = src_l2[0] | src_r0[0] << 16; + dst2[1] = src_r0[0] >> 16 | src_r0[1] << 16; + dst2[2] = src_r0[1] >> 16 | src_r0[2] << 16; + dst2[3] = src_r0[2] >> 16 | src_r0[3] << 16; + break; + + case 35: + dst2[0] = src_l2[0] | src_r0[0] << 24; + dst2[1] = src_r0[0] >> 8 | src_r0[1] << 24; + dst2[2] = src_r0[1] >> 8 | src_r0[2] << 24; + dst2[3] = src_r0[2] >> 8 | src_r0[3] << 24; + break; + + case 36: + dst2[1] = src_r0[0]; + dst2[2] = src_r0[1]; + dst2[3] = src_r0[2]; + break; + + case 37: + dst2[1] = src_l2[1] | src_r0[0] << 8; + dst2[2] = src_r0[0] >> 24 | src_r0[1] << 8; + dst2[3] = src_r0[1] >> 24 | src_r0[2] << 8; + break; + + case 38: + dst2[1] = src_l2[1] | src_r0[0] << 16; + dst2[2] = src_r0[0] >> 16 | src_r0[1] << 16; + dst2[3] = src_r0[1] >> 16 | src_r0[2] << 16; + break; + + case 39: + dst2[1] = src_l2[1] | src_r0[0] << 24; + dst2[2] = src_r0[0] >> 8 | src_r0[1] << 24; + dst2[3] = src_r0[1] >> 8 | src_r0[2] << 24; + break; + + case 40: + dst2[2] = src_r0[0]; + dst2[3] = src_r0[1]; + break; + + case 41: + dst2[2] = src_l2[2] | src_r0[0] << 8; + dst2[3] = src_r0[0] >> 24 | src_r0[1] << 8; + break; + + case 42: + dst2[2] = src_l2[2] | src_r0[0] << 16; + dst2[3] = src_r0[0] >> 16 | src_r0[1] << 16; + break; + + case 43: + dst2[2] = src_l2[2] | src_r0[0] << 24; + dst2[3] = src_r0[0] >> 8 | src_r0[1] << 24; + break; + + case 44: + dst2[3] = src_r0[0]; + break; + + case 45: + dst2[3] = src_l2[3] | src_r0[0] << 8; + break; + + case 46: + dst2[3] = src_l2[3] | src_r0[0] << 16; + break; + + case 47: + dst2[3] = src_l2[3] | src_r0[0] << 24; + break; + } +} + +static void memcat16_9 (u32 w0[4], u32 w1[4], u32 w2[4], u32 w3[4], const u32 append0[4], const u32 append1[4], const u32 append2[4], const u32 offset) +{ + switch (offset) + { + case 0: + w0[0] = append0[0]; + w0[1] = append0[1]; + w0[2] = append0[2]; + w0[3] = append0[3]; + w1[0] = append1[0]; + w1[1] = append1[1]; + w1[2] = append1[2]; + w1[3] = append1[3]; + w2[0] = append2[0]; + break; + + case 1: + w0[0] = w0[0] | append0[0] << 8; + w0[1] = append0[0] >> 24 | append0[1] << 8; + w0[2] = append0[1] >> 24 | append0[2] << 8; + w0[3] = append0[2] >> 24 | append0[3] << 8; + w1[0] = append0[3] >> 24 | append1[0] << 8; + w1[1] = append1[0] >> 24 | append1[1] << 8; + w1[2] = append1[1] >> 24 | append1[2] << 8; + w1[3] = append1[2] >> 24 | append1[3] << 8; + w2[0] = append1[3] >> 24 | append2[0] << 8; + w2[1] = append2[0] >> 24; + break; + + case 2: + w0[0] = w0[0] | append0[0] << 16; + w0[1] = append0[0] >> 16 | append0[1] << 16; + w0[2] = append0[1] >> 16 | append0[2] << 16; + w0[3] = append0[2] >> 16 | append0[3] << 16; + w1[0] = append0[3] >> 16 | append1[0] << 16; + w1[1] = append1[0] >> 16 | append1[1] << 16; + w1[2] = append1[1] >> 16 | append1[2] << 16; + w1[3] = append1[2] >> 16 | append1[3] << 16; + w2[0] = append1[3] >> 16 | append2[0] << 16; + w2[1] = append2[0] >> 16; + break; + + case 3: + w0[0] = w0[0] | append0[0] << 24; + w0[1] = append0[0] >> 8 | append0[1] << 24; + w0[2] = append0[1] >> 8 | append0[2] << 24; + w0[3] = append0[2] >> 8 | append0[3] << 24; + w1[0] = append0[3] >> 8 | append1[0] << 24; + w1[1] = append1[0] >> 8 | append1[1] << 24; + w1[2] = append1[1] >> 8 | append1[2] << 24; + w1[3] = append1[2] >> 8 | append1[3] << 24; + w2[0] = append1[3] >> 8 | append2[0] << 24; + w2[1] = append2[0] >> 8; + break; + + case 4: + w0[1] = append0[0]; + w0[2] = append0[1]; + w0[3] = append0[2]; + w1[0] = append0[3]; + w1[1] = append1[0]; + w1[2] = append1[1]; + w1[3] = append1[2]; + w2[0] = append1[3]; + w2[1] = append2[0]; + break; + + case 5: + w0[1] = w0[1] | append0[0] << 8; + w0[2] = append0[0] >> 24 | append0[1] << 8; + w0[3] = append0[1] >> 24 | append0[2] << 8; + w1[0] = append0[2] >> 24 | append0[3] << 8; + w1[1] = append0[3] >> 24 | append1[0] << 8; + w1[2] = append1[0] >> 24 | append1[1] << 8; + w1[3] = append1[1] >> 24 | append1[2] << 8; + w2[0] = append1[2] >> 24 | append1[3] << 8; + w2[1] = append1[3] >> 24 | append2[0] << 8; + w2[2] = append2[0] >> 24; + break; + + case 6: + w0[1] = w0[1] | append0[0] << 16; + w0[2] = append0[0] >> 16 | append0[1] << 16; + w0[3] = append0[1] >> 16 | append0[2] << 16; + w1[0] = append0[2] >> 16 | append0[3] << 16; + w1[1] = append0[3] >> 16 | append1[0] << 16; + w1[2] = append1[0] >> 16 | append1[1] << 16; + w1[3] = append1[1] >> 16 | append1[2] << 16; + w2[0] = append1[2] >> 16 | append1[3] << 16; + w2[1] = append1[3] >> 16 | append2[0] << 16; + w2[2] = append2[0] >> 16; + break; + + case 7: + w0[1] = w0[1] | append0[0] << 24; + w0[2] = append0[0] >> 8 | append0[1] << 24; + w0[3] = append0[1] >> 8 | append0[2] << 24; + w1[0] = append0[2] >> 8 | append0[3] << 24; + w1[1] = append0[3] >> 8 | append1[0] << 24; + w1[2] = append1[0] >> 8 | append1[1] << 24; + w1[3] = append1[1] >> 8 | append1[2] << 24; + w2[0] = append1[2] >> 8 | append1[3] << 24; + w2[1] = append1[3] >> 8 | append2[0] << 24; + w2[2] = append2[0] >> 8; + break; + + case 8: + w0[2] = append0[0]; + w0[3] = append0[1]; + w1[0] = append0[2]; + w1[1] = append0[3]; + w1[2] = append1[0]; + w1[3] = append1[1]; + w2[0] = append1[2]; + w2[1] = append1[3]; + w2[2] = append2[0]; + break; + + case 9: + w0[2] = w0[2] | append0[0] << 8; + w0[3] = append0[0] >> 24 | append0[1] << 8; + w1[0] = append0[1] >> 24 | append0[2] << 8; + w1[1] = append0[2] >> 24 | append0[3] << 8; + w1[2] = append0[3] >> 24 | append1[0] << 8; + w1[3] = append1[0] >> 24 | append1[1] << 8; + w2[0] = append1[1] >> 24 | append1[2] << 8; + w2[1] = append1[2] >> 24 | append1[3] << 8; + w2[2] = append1[3] >> 24 | append2[0] << 8; + w2[3] = append2[0] >> 24; + break; + + case 10: + w0[2] = w0[2] | append0[0] << 16; + w0[3] = append0[0] >> 16 | append0[1] << 16; + w1[0] = append0[1] >> 16 | append0[2] << 16; + w1[1] = append0[2] >> 16 | append0[3] << 16; + w1[2] = append0[3] >> 16 | append1[0] << 16; + w1[3] = append1[0] >> 16 | append1[1] << 16; + w2[0] = append1[1] >> 16 | append1[2] << 16; + w2[1] = append1[2] >> 16 | append1[3] << 16; + w2[2] = append1[3] >> 16 | append2[0] << 16; + w2[3] = append2[0] >> 16; + break; + + case 11: + w0[2] = w0[2] | append0[0] << 24; + w0[3] = append0[0] >> 8 | append0[1] << 24; + w1[0] = append0[1] >> 8 | append0[2] << 24; + w1[1] = append0[2] >> 8 | append0[3] << 24; + w1[2] = append0[3] >> 8 | append1[0] << 24; + w1[3] = append1[0] >> 8 | append1[1] << 24; + w2[0] = append1[1] >> 8 | append1[2] << 24; + w2[1] = append1[2] >> 8 | append1[3] << 24; + w2[2] = append1[3] >> 8 | append2[0] << 24; + w2[3] = append2[0] >> 8; + break; + + case 12: + w0[3] = append0[0]; + w1[0] = append0[1]; + w1[1] = append0[2]; + w1[2] = append0[3]; + w1[3] = append1[0]; + w2[0] = append1[1]; + w2[1] = append1[2]; + w2[2] = append1[3]; + w2[3] = append2[0]; + break; + + case 13: + w0[3] = w0[3] | append0[0] << 8; + w1[0] = append0[0] >> 24 | append0[1] << 8; + w1[1] = append0[1] >> 24 | append0[2] << 8; + w1[2] = append0[2] >> 24 | append0[3] << 8; + w1[3] = append0[3] >> 24 | append1[0] << 8; + w2[0] = append1[0] >> 24 | append1[1] << 8; + w2[1] = append1[1] >> 24 | append1[2] << 8; + w2[2] = append1[2] >> 24 | append1[3] << 8; + w2[3] = append1[3] >> 24 | append2[0] << 8; + w3[0] = append2[0] >> 24; + break; + + case 14: + w0[3] = w0[3] | append0[0] << 16; + w1[0] = append0[0] >> 16 | append0[1] << 16; + w1[1] = append0[1] >> 16 | append0[2] << 16; + w1[2] = append0[2] >> 16 | append0[3] << 16; + w1[3] = append0[3] >> 16 | append1[0] << 16; + w2[0] = append1[0] >> 16 | append1[1] << 16; + w2[1] = append1[1] >> 16 | append1[2] << 16; + w2[2] = append1[2] >> 16 | append1[3] << 16; + w2[3] = append1[3] >> 16 | append2[0] << 16; + w3[0] = append2[0] >> 16; + break; + + case 15: + w0[3] = w0[3] | append0[0] << 24; + w1[0] = append0[0] >> 8 | append0[1] << 24; + w1[1] = append0[1] >> 8 | append0[2] << 24; + w1[2] = append0[2] >> 8 | append0[3] << 24; + w1[3] = append0[3] >> 8 | append1[0] << 24; + w2[0] = append1[0] >> 8 | append1[1] << 24; + w2[1] = append1[1] >> 8 | append1[2] << 24; + w2[2] = append1[2] >> 8 | append1[3] << 24; + w2[3] = append1[3] >> 8 | append2[0] << 24; + w3[0] = append2[0] >> 8; + break; + } +} + +static void memcat32_8 (u32 w0[4], u32 w1[4], u32 w2[4], u32 w3[4], const u32 append0[4], const u32 append1[4], const u32 offset) +{ + switch (offset) + { + case 0: + w0[0] = append0[0]; + w0[1] = append0[1]; + w0[2] = append0[2]; + w0[3] = append0[3]; + w1[0] = append1[0]; + w1[1] = append1[1]; + w1[2] = append1[2]; + w1[3] = append1[3]; + break; + + case 1: + w0[0] = w0[0] | append0[0] << 8; + w0[1] = append0[0] >> 24 | append0[1] << 8; + w0[2] = append0[1] >> 24 | append0[2] << 8; + w0[3] = append0[2] >> 24 | append0[3] << 8; + w1[0] = append0[3] >> 24 | append1[0] << 8; + w1[1] = append1[0] >> 24 | append1[1] << 8; + w1[2] = append1[1] >> 24 | append1[2] << 8; + w1[3] = append1[2] >> 24 | append1[3] << 8; + w2[0] = append1[3] >> 24; + break; + + case 2: + w0[0] = w0[0] | append0[0] << 16; + w0[1] = append0[0] >> 16 | append0[1] << 16; + w0[2] = append0[1] >> 16 | append0[2] << 16; + w0[3] = append0[2] >> 16 | append0[3] << 16; + w1[0] = append0[3] >> 16 | append1[0] << 16; + w1[1] = append1[0] >> 16 | append1[1] << 16; + w1[2] = append1[1] >> 16 | append1[2] << 16; + w1[3] = append1[2] >> 16 | append1[3] << 16; + w2[0] = append1[3] >> 16; + break; + + case 3: + w0[0] = w0[0] | append0[0] << 24; + w0[1] = append0[0] >> 8 | append0[1] << 24; + w0[2] = append0[1] >> 8 | append0[2] << 24; + w0[3] = append0[2] >> 8 | append0[3] << 24; + w1[0] = append0[3] >> 8 | append1[0] << 24; + w1[1] = append1[0] >> 8 | append1[1] << 24; + w1[2] = append1[1] >> 8 | append1[2] << 24; + w1[3] = append1[2] >> 8 | append1[3] << 24; + w2[0] = append1[3] >> 8; + break; + + case 4: + w0[1] = append0[0]; + w0[2] = append0[1]; + w0[3] = append0[2]; + w1[0] = append0[3]; + w1[1] = append1[0]; + w1[2] = append1[1]; + w1[3] = append1[2]; + w2[0] = append1[3]; + break; + + case 5: + w0[1] = w0[1] | append0[0] << 8; + w0[2] = append0[0] >> 24 | append0[1] << 8; + w0[3] = append0[1] >> 24 | append0[2] << 8; + w1[0] = append0[2] >> 24 | append0[3] << 8; + w1[1] = append0[3] >> 24 | append1[0] << 8; + w1[2] = append1[0] >> 24 | append1[1] << 8; + w1[3] = append1[1] >> 24 | append1[2] << 8; + w2[0] = append1[2] >> 24 | append1[3] << 8; + w2[1] = append1[3] >> 24; + break; + + case 6: + w0[1] = w0[1] | append0[0] << 16; + w0[2] = append0[0] >> 16 | append0[1] << 16; + w0[3] = append0[1] >> 16 | append0[2] << 16; + w1[0] = append0[2] >> 16 | append0[3] << 16; + w1[1] = append0[3] >> 16 | append1[0] << 16; + w1[2] = append1[0] >> 16 | append1[1] << 16; + w1[3] = append1[1] >> 16 | append1[2] << 16; + w2[0] = append1[2] >> 16 | append1[3] << 16; + w2[1] = append1[3] >> 16; + break; + + case 7: + w0[1] = w0[1] | append0[0] << 24; + w0[2] = append0[0] >> 8 | append0[1] << 24; + w0[3] = append0[1] >> 8 | append0[2] << 24; + w1[0] = append0[2] >> 8 | append0[3] << 24; + w1[1] = append0[3] >> 8 | append1[0] << 24; + w1[2] = append1[0] >> 8 | append1[1] << 24; + w1[3] = append1[1] >> 8 | append1[2] << 24; + w2[0] = append1[2] >> 8 | append1[3] << 24; + w2[1] = append1[3] >> 8; + break; + + case 8: + w0[2] = append0[0]; + w0[3] = append0[1]; + w1[0] = append0[2]; + w1[1] = append0[3]; + w1[2] = append1[0]; + w1[3] = append1[1]; + w2[0] = append1[2]; + w2[1] = append1[3]; + break; + + case 9: + w0[2] = w0[2] | append0[0] << 8; + w0[3] = append0[0] >> 24 | append0[1] << 8; + w1[0] = append0[1] >> 24 | append0[2] << 8; + w1[1] = append0[2] >> 24 | append0[3] << 8; + w1[2] = append0[3] >> 24 | append1[0] << 8; + w1[3] = append1[0] >> 24 | append1[1] << 8; + w2[0] = append1[1] >> 24 | append1[2] << 8; + w2[1] = append1[2] >> 24 | append1[3] << 8; + w2[2] = append1[3] >> 24; + break; + + case 10: + w0[2] = w0[2] | append0[0] << 16; + w0[3] = append0[0] >> 16 | append0[1] << 16; + w1[0] = append0[1] >> 16 | append0[2] << 16; + w1[1] = append0[2] >> 16 | append0[3] << 16; + w1[2] = append0[3] >> 16 | append1[0] << 16; + w1[3] = append1[0] >> 16 | append1[1] << 16; + w2[0] = append1[1] >> 16 | append1[2] << 16; + w2[1] = append1[2] >> 16 | append1[3] << 16; + w2[2] = append1[3] >> 16; + break; + + case 11: + w0[2] = w0[2] | append0[0] << 24; + w0[3] = append0[0] >> 8 | append0[1] << 24; + w1[0] = append0[1] >> 8 | append0[2] << 24; + w1[1] = append0[2] >> 8 | append0[3] << 24; + w1[2] = append0[3] >> 8 | append1[0] << 24; + w1[3] = append1[0] >> 8 | append1[1] << 24; + w2[0] = append1[1] >> 8 | append1[2] << 24; + w2[1] = append1[2] >> 8 | append1[3] << 24; + w2[2] = append1[3] >> 8; + break; + + case 12: + w0[3] = append0[0]; + w1[0] = append0[1]; + w1[1] = append0[2]; + w1[2] = append0[3]; + w1[3] = append1[0]; + w2[0] = append1[1]; + w2[1] = append1[2]; + w2[2] = append1[3]; + break; + + case 13: + w0[3] = w0[3] | append0[0] << 8; + w1[0] = append0[0] >> 24 | append0[1] << 8; + w1[1] = append0[1] >> 24 | append0[2] << 8; + w1[2] = append0[2] >> 24 | append0[3] << 8; + w1[3] = append0[3] >> 24 | append1[0] << 8; + w2[0] = append1[0] >> 24 | append1[1] << 8; + w2[1] = append1[1] >> 24 | append1[2] << 8; + w2[2] = append1[2] >> 24 | append1[3] << 8; + w2[3] = append1[3] >> 24; + break; + + case 14: + w0[3] = w0[3] | append0[0] << 16; + w1[0] = append0[0] >> 16 | append0[1] << 16; + w1[1] = append0[1] >> 16 | append0[2] << 16; + w1[2] = append0[2] >> 16 | append0[3] << 16; + w1[3] = append0[3] >> 16 | append1[0] << 16; + w2[0] = append1[0] >> 16 | append1[1] << 16; + w2[1] = append1[1] >> 16 | append1[2] << 16; + w2[2] = append1[2] >> 16 | append1[3] << 16; + w2[3] = append1[3] >> 16; + break; + + case 15: + w0[3] = w0[3] | append0[0] << 24; + w1[0] = append0[0] >> 8 | append0[1] << 24; + w1[1] = append0[1] >> 8 | append0[2] << 24; + w1[2] = append0[2] >> 8 | append0[3] << 24; + w1[3] = append0[3] >> 8 | append1[0] << 24; + w2[0] = append1[0] >> 8 | append1[1] << 24; + w2[1] = append1[1] >> 8 | append1[2] << 24; + w2[2] = append1[2] >> 8 | append1[3] << 24; + w2[3] = append1[3] >> 8; + break; + + case 16: + w1[0] = append0[0]; + w1[1] = append0[1]; + w1[2] = append0[2]; + w1[3] = append0[3]; + w2[0] = append1[0]; + w2[1] = append1[1]; + w2[2] = append1[2]; + w2[3] = append1[3]; + break; + + case 17: + w1[0] = w1[0] | append0[0] << 8; + w1[1] = append0[0] >> 24 | append0[1] << 8; + w1[2] = append0[1] >> 24 | append0[2] << 8; + w1[3] = append0[2] >> 24 | append0[3] << 8; + w2[0] = append0[3] >> 24 | append1[0] << 8; + w2[1] = append1[0] >> 24 | append1[1] << 8; + w2[2] = append1[1] >> 24 | append1[2] << 8; + w2[3] = append1[2] >> 24 | append1[3] << 8; + w3[0] = append1[3] >> 24; + break; + + case 18: + w1[0] = w1[0] | append0[0] << 16; + w1[1] = append0[0] >> 16 | append0[1] << 16; + w1[2] = append0[1] >> 16 | append0[2] << 16; + w1[3] = append0[2] >> 16 | append0[3] << 16; + w2[0] = append0[3] >> 16 | append1[0] << 16; + w2[1] = append1[0] >> 16 | append1[1] << 16; + w2[2] = append1[1] >> 16 | append1[2] << 16; + w2[3] = append1[2] >> 16 | append1[3] << 16; + w3[0] = append1[3] >> 16; + break; + + case 19: + w1[0] = w1[0] | append0[0] << 24; + w1[1] = append0[0] >> 8 | append0[1] << 24; + w1[2] = append0[1] >> 8 | append0[2] << 24; + w1[3] = append0[2] >> 8 | append0[3] << 24; + w2[0] = append0[3] >> 8 | append1[0] << 24; + w2[1] = append1[0] >> 8 | append1[1] << 24; + w2[2] = append1[1] >> 8 | append1[2] << 24; + w2[3] = append1[2] >> 8 | append1[3] << 24; + w3[0] = append1[3] >> 8; + break; + + case 20: + w1[1] = append0[0]; + w1[2] = append0[1]; + w1[3] = append0[2]; + w2[0] = append0[3]; + w2[1] = append1[0]; + w2[2] = append1[1]; + w2[3] = append1[2]; + w3[0] = append1[3]; + break; + + case 21: + w1[1] = w1[1] | append0[0] << 8; + w1[2] = append0[0] >> 24 | append0[1] << 8; + w1[3] = append0[1] >> 24 | append0[2] << 8; + w2[0] = append0[2] >> 24 | append0[3] << 8; + w2[1] = append0[3] >> 24 | append1[0] << 8; + w2[2] = append1[0] >> 24 | append1[1] << 8; + w2[3] = append1[1] >> 24 | append1[2] << 8; + w3[0] = append1[2] >> 24 | append1[3] << 8; + w3[1] = append1[3] >> 24; + break; + + case 22: + w1[1] = w1[1] | append0[0] << 16; + w1[2] = append0[0] >> 16 | append0[1] << 16; + w1[3] = append0[1] >> 16 | append0[2] << 16; + w2[0] = append0[2] >> 16 | append0[3] << 16; + w2[1] = append0[3] >> 16 | append1[0] << 16; + w2[2] = append1[0] >> 16 | append1[1] << 16; + w2[3] = append1[1] >> 16 | append1[2] << 16; + w3[0] = append1[2] >> 16 | append1[3] << 16; + w3[1] = append1[3] >> 16; + break; + + case 23: + w1[1] = w1[1] | append0[0] << 24; + w1[2] = append0[0] >> 8 | append0[1] << 24; + w1[3] = append0[1] >> 8 | append0[2] << 24; + w2[0] = append0[2] >> 8 | append0[3] << 24; + w2[1] = append0[3] >> 8 | append1[0] << 24; + w2[2] = append1[0] >> 8 | append1[1] << 24; + w2[3] = append1[1] >> 8 | append1[2] << 24; + w3[0] = append1[2] >> 8 | append1[3] << 24; + w3[1] = append1[3] >> 8; + break; + + case 24: + w1[2] = append0[0]; + w1[3] = append0[1]; + w2[0] = append0[2]; + w2[1] = append0[3]; + w2[2] = append1[0]; + w2[3] = append1[1]; + w3[0] = append1[2]; + w3[1] = append1[3]; + break; + + case 25: + w1[2] = w1[2] | append0[0] << 8; + w1[3] = append0[0] >> 24 | append0[1] << 8; + w2[0] = append0[1] >> 24 | append0[2] << 8; + w2[1] = append0[2] >> 24 | append0[3] << 8; + w2[2] = append0[3] >> 24 | append1[0] << 8; + w2[3] = append1[0] >> 24 | append1[1] << 8; + w3[0] = append1[1] >> 24 | append1[2] << 8; + w3[1] = append1[2] >> 24 | append1[3] << 8; + break; + + case 26: + w1[2] = w1[2] | append0[0] << 16; + w1[3] = append0[0] >> 16 | append0[1] << 16; + w2[0] = append0[1] >> 16 | append0[2] << 16; + w2[1] = append0[2] >> 16 | append0[3] << 16; + w2[2] = append0[3] >> 16 | append1[0] << 16; + w2[3] = append1[0] >> 16 | append1[1] << 16; + w3[0] = append1[1] >> 16 | append1[2] << 16; + w3[1] = append1[2] >> 16 | append1[3] << 16; + break; + + case 27: + w1[2] = w1[2] | append0[0] << 24; + w1[3] = append0[0] >> 8 | append0[1] << 24; + w2[0] = append0[1] >> 8 | append0[2] << 24; + w2[1] = append0[2] >> 8 | append0[3] << 24; + w2[2] = append0[3] >> 8 | append1[0] << 24; + w2[3] = append1[0] >> 8 | append1[1] << 24; + w3[0] = append1[1] >> 8 | append1[2] << 24; + w3[1] = append1[2] >> 8 | append1[3] << 24; + break; + + case 28: + w1[3] = append0[0]; + w2[0] = append0[1]; + w2[1] = append0[2]; + w2[2] = append0[3]; + w2[3] = append1[0]; + w3[0] = append1[1]; + w3[1] = append1[2]; + break; + + case 29: + w1[3] = w1[3] | append0[0] << 8; + w2[0] = append0[0] >> 24 | append0[1] << 8; + w2[1] = append0[1] >> 24 | append0[2] << 8; + w2[2] = append0[2] >> 24 | append0[3] << 8; + w2[3] = append0[3] >> 24 | append1[0] << 8; + w3[0] = append1[0] >> 24 | append1[1] << 8; + w3[1] = append1[1] >> 24 | append1[2] << 8; + break; + + case 30: + w1[3] = w1[3] | append0[0] << 16; + w2[0] = append0[0] >> 16 | append0[1] << 16; + w2[1] = append0[1] >> 16 | append0[2] << 16; + w2[2] = append0[2] >> 16 | append0[3] << 16; + w2[3] = append0[3] >> 16 | append1[0] << 16; + w3[0] = append1[0] >> 16 | append1[1] << 16; + w3[1] = append1[1] >> 16 | append1[2] << 16; + break; + + case 31: + w1[3] = w1[3] | append0[0] << 24; + w2[0] = append0[0] >> 8 | append0[1] << 24; + w2[1] = append0[1] >> 8 | append0[2] << 24; + w2[2] = append0[2] >> 8 | append0[3] << 24; + w2[3] = append0[3] >> 8 | append1[0] << 24; + w3[0] = append1[0] >> 8 | append1[1] << 24; + w3[1] = append1[1] >> 8 | append1[2] << 24; + break; + + case 32: + w2[0] = append0[0]; + w2[1] = append0[1]; + w2[2] = append0[2]; + w2[3] = append0[3]; + w3[0] = append1[0]; + w3[1] = append1[1]; + break; + } +} + +static void memcat32_9 (u32 w0[4], u32 w1[4], u32 w2[4], u32 w3[4], const u32 append0[4], const u32 append1[4], const u32 append2[4], const u32 offset) +{ + switch (offset) + { + case 0: + w0[0] = append0[0]; + w0[1] = append0[1]; + w0[2] = append0[2]; + w0[3] = append0[3]; + w1[0] = append1[0]; + w1[1] = append1[1]; + w1[2] = append1[2]; + w1[3] = append1[3]; + w2[0] = append2[0]; + break; + + case 1: + w0[0] = w0[0] | append0[0] << 8; + w0[1] = append0[0] >> 24 | append0[1] << 8; + w0[2] = append0[1] >> 24 | append0[2] << 8; + w0[3] = append0[2] >> 24 | append0[3] << 8; + w1[0] = append0[3] >> 24 | append1[0] << 8; + w1[1] = append1[0] >> 24 | append1[1] << 8; + w1[2] = append1[1] >> 24 | append1[2] << 8; + w1[3] = append1[2] >> 24 | append1[3] << 8; + w2[0] = append1[3] >> 24 | append2[0] << 8; + w2[1] = append2[0] >> 24; + break; + + case 2: + w0[0] = w0[0] | append0[0] << 16; + w0[1] = append0[0] >> 16 | append0[1] << 16; + w0[2] = append0[1] >> 16 | append0[2] << 16; + w0[3] = append0[2] >> 16 | append0[3] << 16; + w1[0] = append0[3] >> 16 | append1[0] << 16; + w1[1] = append1[0] >> 16 | append1[1] << 16; + w1[2] = append1[1] >> 16 | append1[2] << 16; + w1[3] = append1[2] >> 16 | append1[3] << 16; + w2[0] = append1[3] >> 16 | append2[0] << 16; + w2[1] = append2[0] >> 16; + break; + + case 3: + w0[0] = w0[0] | append0[0] << 24; + w0[1] = append0[0] >> 8 | append0[1] << 24; + w0[2] = append0[1] >> 8 | append0[2] << 24; + w0[3] = append0[2] >> 8 | append0[3] << 24; + w1[0] = append0[3] >> 8 | append1[0] << 24; + w1[1] = append1[0] >> 8 | append1[1] << 24; + w1[2] = append1[1] >> 8 | append1[2] << 24; + w1[3] = append1[2] >> 8 | append1[3] << 24; + w2[0] = append1[3] >> 8 | append2[0] << 24; + w2[1] = append2[0] >> 8; + break; + + case 4: + w0[1] = append0[0]; + w0[2] = append0[1]; + w0[3] = append0[2]; + w1[0] = append0[3]; + w1[1] = append1[0]; + w1[2] = append1[1]; + w1[3] = append1[2]; + w2[0] = append1[3]; + w2[1] = append2[0]; + break; + + case 5: + w0[1] = w0[1] | append0[0] << 8; + w0[2] = append0[0] >> 24 | append0[1] << 8; + w0[3] = append0[1] >> 24 | append0[2] << 8; + w1[0] = append0[2] >> 24 | append0[3] << 8; + w1[1] = append0[3] >> 24 | append1[0] << 8; + w1[2] = append1[0] >> 24 | append1[1] << 8; + w1[3] = append1[1] >> 24 | append1[2] << 8; + w2[0] = append1[2] >> 24 | append1[3] << 8; + w2[1] = append1[3] >> 24 | append2[0] << 8; + w2[2] = append2[0] >> 24; + break; + + case 6: + w0[1] = w0[1] | append0[0] << 16; + w0[2] = append0[0] >> 16 | append0[1] << 16; + w0[3] = append0[1] >> 16 | append0[2] << 16; + w1[0] = append0[2] >> 16 | append0[3] << 16; + w1[1] = append0[3] >> 16 | append1[0] << 16; + w1[2] = append1[0] >> 16 | append1[1] << 16; + w1[3] = append1[1] >> 16 | append1[2] << 16; + w2[0] = append1[2] >> 16 | append1[3] << 16; + w2[1] = append1[3] >> 16 | append2[0] << 16; + w2[2] = append2[0] >> 16; + break; + + case 7: + w0[1] = w0[1] | append0[0] << 24; + w0[2] = append0[0] >> 8 | append0[1] << 24; + w0[3] = append0[1] >> 8 | append0[2] << 24; + w1[0] = append0[2] >> 8 | append0[3] << 24; + w1[1] = append0[3] >> 8 | append1[0] << 24; + w1[2] = append1[0] >> 8 | append1[1] << 24; + w1[3] = append1[1] >> 8 | append1[2] << 24; + w2[0] = append1[2] >> 8 | append1[3] << 24; + w2[1] = append1[3] >> 8 | append2[0] << 24; + w2[2] = append2[0] >> 8; + break; + + case 8: + w0[2] = append0[0]; + w0[3] = append0[1]; + w1[0] = append0[2]; + w1[1] = append0[3]; + w1[2] = append1[0]; + w1[3] = append1[1]; + w2[0] = append1[2]; + w2[1] = append1[3]; + w2[2] = append2[0]; + break; + + case 9: + w0[2] = w0[2] | append0[0] << 8; + w0[3] = append0[0] >> 24 | append0[1] << 8; + w1[0] = append0[1] >> 24 | append0[2] << 8; + w1[1] = append0[2] >> 24 | append0[3] << 8; + w1[2] = append0[3] >> 24 | append1[0] << 8; + w1[3] = append1[0] >> 24 | append1[1] << 8; + w2[0] = append1[1] >> 24 | append1[2] << 8; + w2[1] = append1[2] >> 24 | append1[3] << 8; + w2[2] = append1[3] >> 24 | append2[0] << 8; + w2[3] = append2[0] >> 24; + break; + + case 10: + w0[2] = w0[2] | append0[0] << 16; + w0[3] = append0[0] >> 16 | append0[1] << 16; + w1[0] = append0[1] >> 16 | append0[2] << 16; + w1[1] = append0[2] >> 16 | append0[3] << 16; + w1[2] = append0[3] >> 16 | append1[0] << 16; + w1[3] = append1[0] >> 16 | append1[1] << 16; + w2[0] = append1[1] >> 16 | append1[2] << 16; + w2[1] = append1[2] >> 16 | append1[3] << 16; + w2[2] = append1[3] >> 16 | append2[0] << 16; + w2[3] = append2[0] >> 16; + break; + + case 11: + w0[2] = w0[2] | append0[0] << 24; + w0[3] = append0[0] >> 8 | append0[1] << 24; + w1[0] = append0[1] >> 8 | append0[2] << 24; + w1[1] = append0[2] >> 8 | append0[3] << 24; + w1[2] = append0[3] >> 8 | append1[0] << 24; + w1[3] = append1[0] >> 8 | append1[1] << 24; + w2[0] = append1[1] >> 8 | append1[2] << 24; + w2[1] = append1[2] >> 8 | append1[3] << 24; + w2[2] = append1[3] >> 8 | append2[0] << 24; + w2[3] = append2[0] >> 8; + break; + + case 12: + w0[3] = append0[0]; + w1[0] = append0[1]; + w1[1] = append0[2]; + w1[2] = append0[3]; + w1[3] = append1[0]; + w2[0] = append1[1]; + w2[1] = append1[2]; + w2[2] = append1[3]; + w2[3] = append2[0]; + break; + + case 13: + w0[3] = w0[3] | append0[0] << 8; + w1[0] = append0[0] >> 24 | append0[1] << 8; + w1[1] = append0[1] >> 24 | append0[2] << 8; + w1[2] = append0[2] >> 24 | append0[3] << 8; + w1[3] = append0[3] >> 24 | append1[0] << 8; + w2[0] = append1[0] >> 24 | append1[1] << 8; + w2[1] = append1[1] >> 24 | append1[2] << 8; + w2[2] = append1[2] >> 24 | append1[3] << 8; + w2[3] = append1[3] >> 24 | append2[0] << 8; + w3[0] = append2[0] >> 24; + break; + + case 14: + w0[3] = w0[3] | append0[0] << 16; + w1[0] = append0[0] >> 16 | append0[1] << 16; + w1[1] = append0[1] >> 16 | append0[2] << 16; + w1[2] = append0[2] >> 16 | append0[3] << 16; + w1[3] = append0[3] >> 16 | append1[0] << 16; + w2[0] = append1[0] >> 16 | append1[1] << 16; + w2[1] = append1[1] >> 16 | append1[2] << 16; + w2[2] = append1[2] >> 16 | append1[3] << 16; + w2[3] = append1[3] >> 16 | append2[0] << 16; + w3[0] = append2[0] >> 16; + break; + + case 15: + w0[3] = w0[3] | append0[0] << 24; + w1[0] = append0[0] >> 8 | append0[1] << 24; + w1[1] = append0[1] >> 8 | append0[2] << 24; + w1[2] = append0[2] >> 8 | append0[3] << 24; + w1[3] = append0[3] >> 8 | append1[0] << 24; + w2[0] = append1[0] >> 8 | append1[1] << 24; + w2[1] = append1[1] >> 8 | append1[2] << 24; + w2[2] = append1[2] >> 8 | append1[3] << 24; + w2[3] = append1[3] >> 8 | append2[0] << 24; + w3[0] = append2[0] >> 8; + break; + + case 16: + w1[0] = append0[0]; + w1[1] = append0[1]; + w1[2] = append0[2]; + w1[3] = append0[3]; + w2[0] = append1[0]; + w2[1] = append1[1]; + w2[2] = append1[2]; + w2[3] = append1[3]; + w3[0] = append2[0]; + break; + + case 17: + w1[0] = w1[0] | append0[0] << 8; + w1[1] = append0[0] >> 24 | append0[1] << 8; + w1[2] = append0[1] >> 24 | append0[2] << 8; + w1[3] = append0[2] >> 24 | append0[3] << 8; + w2[0] = append0[3] >> 24 | append1[0] << 8; + w2[1] = append1[0] >> 24 | append1[1] << 8; + w2[2] = append1[1] >> 24 | append1[2] << 8; + w2[3] = append1[2] >> 24 | append1[3] << 8; + w3[0] = append1[3] >> 24 | append2[0] << 8; + w3[1] = append2[0] >> 24; + break; + + case 18: + w1[0] = w1[0] | append0[0] << 16; + w1[1] = append0[0] >> 16 | append0[1] << 16; + w1[2] = append0[1] >> 16 | append0[2] << 16; + w1[3] = append0[2] >> 16 | append0[3] << 16; + w2[0] = append0[3] >> 16 | append1[0] << 16; + w2[1] = append1[0] >> 16 | append1[1] << 16; + w2[2] = append1[1] >> 16 | append1[2] << 16; + w2[3] = append1[2] >> 16 | append1[3] << 16; + w3[0] = append1[3] >> 16 | append2[0] << 16; + w3[1] = append2[0] >> 16; + break; + + case 19: + w1[0] = w1[0] | append0[0] << 24; + w1[1] = append0[0] >> 8 | append0[1] << 24; + w1[2] = append0[1] >> 8 | append0[2] << 24; + w1[3] = append0[2] >> 8 | append0[3] << 24; + w2[0] = append0[3] >> 8 | append1[0] << 24; + w2[1] = append1[0] >> 8 | append1[1] << 24; + w2[2] = append1[1] >> 8 | append1[2] << 24; + w2[3] = append1[2] >> 8 | append1[3] << 24; + w3[0] = append1[3] >> 8 | append2[0] << 24; + w3[1] = append2[0] >> 8; + break; + + case 20: + w1[1] = append0[0]; + w1[2] = append0[1]; + w1[3] = append0[2]; + w2[0] = append0[3]; + w2[1] = append1[0]; + w2[2] = append1[1]; + w2[3] = append1[2]; + w3[0] = append1[3]; + w3[1] = append2[0]; + break; + + case 21: + w1[1] = w1[1] | append0[0] << 8; + w1[2] = append0[0] >> 24 | append0[1] << 8; + w1[3] = append0[1] >> 24 | append0[2] << 8; + w2[0] = append0[2] >> 24 | append0[3] << 8; + w2[1] = append0[3] >> 24 | append1[0] << 8; + w2[2] = append1[0] >> 24 | append1[1] << 8; + w2[3] = append1[1] >> 24 | append1[2] << 8; + w3[0] = append1[2] >> 24 | append1[3] << 8; + w3[1] = append1[3] >> 24 | append2[0] << 8; + break; + + case 22: + w1[1] = w1[1] | append0[0] << 16; + w1[2] = append0[0] >> 16 | append0[1] << 16; + w1[3] = append0[1] >> 16 | append0[2] << 16; + w2[0] = append0[2] >> 16 | append0[3] << 16; + w2[1] = append0[3] >> 16 | append1[0] << 16; + w2[2] = append1[0] >> 16 | append1[1] << 16; + w2[3] = append1[1] >> 16 | append1[2] << 16; + w3[0] = append1[2] >> 16 | append1[3] << 16; + w3[1] = append1[3] >> 16 | append2[0] << 16; + break; + + case 23: + w1[1] = w1[1] | append0[0] << 24; + w1[2] = append0[0] >> 8 | append0[1] << 24; + w1[3] = append0[1] >> 8 | append0[2] << 24; + w2[0] = append0[2] >> 8 | append0[3] << 24; + w2[1] = append0[3] >> 8 | append1[0] << 24; + w2[2] = append1[0] >> 8 | append1[1] << 24; + w2[3] = append1[1] >> 8 | append1[2] << 24; + w3[0] = append1[2] >> 8 | append1[3] << 24; + w3[1] = append1[3] >> 8 | append2[0] << 24; + break; + + case 24: + w1[2] = append0[0]; + w1[3] = append0[1]; + w2[0] = append0[2]; + w2[1] = append0[3]; + w2[2] = append1[0]; + w2[3] = append1[1]; + w3[0] = append1[2]; + w3[1] = append1[3]; + break; + + case 25: + w1[2] = w1[2] | append0[0] << 8; + w1[3] = append0[0] >> 24 | append0[1] << 8; + w2[0] = append0[1] >> 24 | append0[2] << 8; + w2[1] = append0[2] >> 24 | append0[3] << 8; + w2[2] = append0[3] >> 24 | append1[0] << 8; + w2[3] = append1[0] >> 24 | append1[1] << 8; + w3[0] = append1[1] >> 24 | append1[2] << 8; + w3[1] = append1[2] >> 24 | append1[3] << 8; + break; + + case 26: + w1[2] = w1[2] | append0[0] << 16; + w1[3] = append0[0] >> 16 | append0[1] << 16; + w2[0] = append0[1] >> 16 | append0[2] << 16; + w2[1] = append0[2] >> 16 | append0[3] << 16; + w2[2] = append0[3] >> 16 | append1[0] << 16; + w2[3] = append1[0] >> 16 | append1[1] << 16; + w3[0] = append1[1] >> 16 | append1[2] << 16; + w3[1] = append1[2] >> 16 | append1[3] << 16; + break; + + case 27: + w1[2] = w1[2] | append0[0] << 24; + w1[3] = append0[0] >> 8 | append0[1] << 24; + w2[0] = append0[1] >> 8 | append0[2] << 24; + w2[1] = append0[2] >> 8 | append0[3] << 24; + w2[2] = append0[3] >> 8 | append1[0] << 24; + w2[3] = append1[0] >> 8 | append1[1] << 24; + w3[0] = append1[1] >> 8 | append1[2] << 24; + w3[1] = append1[2] >> 8 | append1[3] << 24; + break; + + case 28: + w1[3] = append0[0]; + w2[0] = append0[1]; + w2[1] = append0[2]; + w2[2] = append0[3]; + w2[3] = append1[0]; + w3[0] = append1[1]; + w3[1] = append1[2]; + break; + + case 29: + w1[3] = w1[3] | append0[0] << 8; + w2[0] = append0[0] >> 24 | append0[1] << 8; + w2[1] = append0[1] >> 24 | append0[2] << 8; + w2[2] = append0[2] >> 24 | append0[3] << 8; + w2[3] = append0[3] >> 24 | append1[0] << 8; + w3[0] = append1[0] >> 24 | append1[1] << 8; + w3[1] = append1[1] >> 24 | append1[2] << 8; + break; + + case 30: + w1[3] = w1[3] | append0[0] << 16; + w2[0] = append0[0] >> 16 | append0[1] << 16; + w2[1] = append0[1] >> 16 | append0[2] << 16; + w2[2] = append0[2] >> 16 | append0[3] << 16; + w2[3] = append0[3] >> 16 | append1[0] << 16; + w3[0] = append1[0] >> 16 | append1[1] << 16; + w3[1] = append1[1] >> 16 | append1[2] << 16; + break; + + case 31: + w1[3] = w1[3] | append0[0] << 24; + w2[0] = append0[0] >> 8 | append0[1] << 24; + w2[1] = append0[1] >> 8 | append0[2] << 24; + w2[2] = append0[2] >> 8 | append0[3] << 24; + w2[3] = append0[3] >> 8 | append1[0] << 24; + w3[0] = append1[0] >> 8 | append1[1] << 24; + w3[1] = append1[1] >> 8 | append1[2] << 24; + break; + + case 32: + w2[0] = append0[0]; + w2[1] = append0[1]; + w2[2] = append0[2]; + w2[3] = append0[3]; + w3[0] = append1[0]; + w3[1] = append1[1]; + break; + } +} + +static void switch_buffer_by_offset (u32 w0[4], u32 w1[4], u32 w2[4], u32 w3[4], const u32 offset) +{ + const int offset_mod_4 = offset & 3; + + const int offset_minus_4 = 4 - offset; + + switch (offset / 4) + { + case 0: + w3[2] = amd_bytealign ( 0, w3[1], offset_minus_4); + w3[1] = amd_bytealign (w3[1], w3[0], offset_minus_4); + w3[0] = amd_bytealign (w3[0], w2[3], offset_minus_4); + w2[3] = amd_bytealign (w2[3], w2[2], offset_minus_4); + w2[2] = amd_bytealign (w2[2], w2[1], offset_minus_4); + w2[1] = amd_bytealign (w2[1], w2[0], offset_minus_4); + w2[0] = amd_bytealign (w2[0], w1[3], offset_minus_4); + w1[3] = amd_bytealign (w1[3], w1[2], offset_minus_4); + w1[2] = amd_bytealign (w1[2], w1[1], offset_minus_4); + w1[1] = amd_bytealign (w1[1], w1[0], offset_minus_4); + w1[0] = amd_bytealign (w1[0], w0[3], offset_minus_4); + w0[3] = amd_bytealign (w0[3], w0[2], offset_minus_4); + w0[2] = amd_bytealign (w0[2], w0[1], offset_minus_4); + w0[1] = amd_bytealign (w0[1], w0[0], offset_minus_4); + w0[0] = amd_bytealign (w0[0], 0, offset_minus_4); + + if (offset_mod_4 == 0) + { + w0[0] = w0[1]; + w0[1] = w0[2]; + w0[2] = w0[3]; + w0[3] = w1[0]; + w1[0] = w1[1]; + w1[1] = w1[2]; + w1[2] = w1[3]; + w1[3] = w2[0]; + w2[0] = w2[1]; + w2[1] = w2[2]; + w2[2] = w2[3]; + w2[3] = w3[0]; + w3[0] = w3[1]; + w3[1] = w3[2]; + w3[2] = 0; + } + + break; + + case 1: + w3[2] = amd_bytealign ( 0, w3[0], offset_minus_4); + w3[1] = amd_bytealign (w3[0], w2[3], offset_minus_4); + w3[0] = amd_bytealign (w2[3], w2[2], offset_minus_4); + w2[3] = amd_bytealign (w2[2], w2[1], offset_minus_4); + w2[2] = amd_bytealign (w2[1], w2[0], offset_minus_4); + w2[1] = amd_bytealign (w2[0], w1[3], offset_minus_4); + w2[0] = amd_bytealign (w1[3], w1[2], offset_minus_4); + w1[3] = amd_bytealign (w1[2], w1[1], offset_minus_4); + w1[2] = amd_bytealign (w1[1], w1[0], offset_minus_4); + w1[1] = amd_bytealign (w1[0], w0[3], offset_minus_4); + w1[0] = amd_bytealign (w0[3], w0[2], offset_minus_4); + w0[3] = amd_bytealign (w0[2], w0[1], offset_minus_4); + w0[2] = amd_bytealign (w0[1], w0[0], offset_minus_4); + w0[1] = amd_bytealign (w0[0], 0, offset_minus_4); + w0[0] = 0; + + if (offset_mod_4 == 0) + { + w0[1] = w0[2]; + w0[2] = w0[3]; + w0[3] = w1[0]; + w1[0] = w1[1]; + w1[1] = w1[2]; + w1[2] = w1[3]; + w1[3] = w2[0]; + w2[0] = w2[1]; + w2[1] = w2[2]; + w2[2] = w2[3]; + w2[3] = w3[0]; + w3[0] = w3[1]; + w3[1] = w3[2]; + w3[2] = 0; + } + + break; + + case 2: + w3[2] = amd_bytealign ( 0, w2[3], offset_minus_4); + w3[1] = amd_bytealign (w2[3], w2[2], offset_minus_4); + w3[0] = amd_bytealign (w2[2], w2[1], offset_minus_4); + w2[3] = amd_bytealign (w2[1], w2[0], offset_minus_4); + w2[2] = amd_bytealign (w2[0], w1[3], offset_minus_4); + w2[1] = amd_bytealign (w1[3], w1[2], offset_minus_4); + w2[0] = amd_bytealign (w1[2], w1[1], offset_minus_4); + w1[3] = amd_bytealign (w1[1], w1[0], offset_minus_4); + w1[2] = amd_bytealign (w1[0], w0[3], offset_minus_4); + w1[1] = amd_bytealign (w0[3], w0[2], offset_minus_4); + w1[0] = amd_bytealign (w0[2], w0[1], offset_minus_4); + w0[3] = amd_bytealign (w0[1], w0[0], offset_minus_4); + w0[2] = amd_bytealign (w0[0], 0, offset_minus_4); + w0[1] = 0; + w0[0] = 0; + + if (offset_mod_4 == 0) + { + w0[2] = w0[3]; + w0[3] = w1[0]; + w1[0] = w1[1]; + w1[1] = w1[2]; + w1[2] = w1[3]; + w1[3] = w2[0]; + w2[0] = w2[1]; + w2[1] = w2[2]; + w2[2] = w2[3]; + w2[3] = w3[0]; + w3[0] = w3[1]; + w3[1] = w3[2]; + w3[2] = 0; + } + + break; + + case 3: + w3[2] = amd_bytealign ( 0, w2[2], offset_minus_4); + w3[1] = amd_bytealign (w2[2], w2[1], offset_minus_4); + w3[0] = amd_bytealign (w2[1], w2[0], offset_minus_4); + w2[3] = amd_bytealign (w2[0], w1[3], offset_minus_4); + w2[2] = amd_bytealign (w1[3], w1[2], offset_minus_4); + w2[1] = amd_bytealign (w1[2], w1[1], offset_minus_4); + w2[0] = amd_bytealign (w1[1], w1[0], offset_minus_4); + w1[3] = amd_bytealign (w1[0], w0[3], offset_minus_4); + w1[2] = amd_bytealign (w0[3], w0[2], offset_minus_4); + w1[1] = amd_bytealign (w0[2], w0[1], offset_minus_4); + w1[0] = amd_bytealign (w0[1], w0[0], offset_minus_4); + w0[3] = amd_bytealign (w0[0], 0, offset_minus_4); + w0[2] = 0; + w0[1] = 0; + w0[0] = 0; + + if (offset_mod_4 == 0) + { + w0[3] = w1[0]; + w1[0] = w1[1]; + w1[1] = w1[2]; + w1[2] = w1[3]; + w1[3] = w2[0]; + w2[0] = w2[1]; + w2[1] = w2[2]; + w2[2] = w2[3]; + w2[3] = w3[0]; + w3[0] = w3[1]; + w3[1] = w3[2]; + w3[2] = 0; + } + + break; + + case 4: + w3[2] = amd_bytealign ( 0, w2[1], offset_minus_4); + w3[1] = amd_bytealign (w2[1], w2[0], offset_minus_4); + w3[0] = amd_bytealign (w2[0], w1[3], offset_minus_4); + w2[3] = amd_bytealign (w1[3], w1[2], offset_minus_4); + w2[2] = amd_bytealign (w1[2], w1[1], offset_minus_4); + w2[1] = amd_bytealign (w1[1], w1[0], offset_minus_4); + w2[0] = amd_bytealign (w1[0], w0[3], offset_minus_4); + w1[3] = amd_bytealign (w0[3], w0[2], offset_minus_4); + w1[2] = amd_bytealign (w0[2], w0[1], offset_minus_4); + w1[1] = amd_bytealign (w0[1], w0[0], offset_minus_4); + w1[0] = amd_bytealign (w0[0], 0, offset_minus_4); + w0[3] = 0; + w0[2] = 0; + w0[1] = 0; + w0[0] = 0; + + if (offset_mod_4 == 0) + { + w1[0] = w1[1]; + w1[1] = w1[2]; + w1[2] = w1[3]; + w1[3] = w2[0]; + w2[0] = w2[1]; + w2[1] = w2[2]; + w2[2] = w2[3]; + w2[3] = w3[0]; + w3[0] = w3[1]; + w3[1] = w3[2]; + w3[2] = 0; + } + + break; + + case 5: + w3[2] = amd_bytealign ( 0, w2[0], offset_minus_4); + w3[1] = amd_bytealign (w2[0], w1[3], offset_minus_4); + w3[0] = amd_bytealign (w1[3], w1[2], offset_minus_4); + w2[3] = amd_bytealign (w1[2], w1[1], offset_minus_4); + w2[2] = amd_bytealign (w1[1], w1[0], offset_minus_4); + w2[1] = amd_bytealign (w1[0], w0[3], offset_minus_4); + w2[0] = amd_bytealign (w0[3], w0[2], offset_minus_4); + w1[3] = amd_bytealign (w0[2], w0[1], offset_minus_4); + w1[2] = amd_bytealign (w0[1], w0[0], offset_minus_4); + w1[1] = amd_bytealign (w0[0], 0, offset_minus_4); + w1[0] = 0; + w0[3] = 0; + w0[2] = 0; + w0[1] = 0; + w0[0] = 0; + + if (offset_mod_4 == 0) + { + w1[1] = w1[2]; + w1[2] = w1[3]; + w1[3] = w2[0]; + w2[0] = w2[1]; + w2[1] = w2[2]; + w2[2] = w2[3]; + w2[3] = w3[0]; + w3[0] = w3[1]; + w3[1] = w3[2]; + w3[2] = 0; + } + + break; + + case 6: + w3[2] = amd_bytealign ( 0, w1[3], offset_minus_4); + w3[1] = amd_bytealign (w1[3], w1[2], offset_minus_4); + w3[0] = amd_bytealign (w1[2], w1[1], offset_minus_4); + w2[3] = amd_bytealign (w1[1], w1[0], offset_minus_4); + w2[2] = amd_bytealign (w1[0], w0[3], offset_minus_4); + w2[1] = amd_bytealign (w0[3], w0[2], offset_minus_4); + w2[0] = amd_bytealign (w0[2], w0[1], offset_minus_4); + w1[3] = amd_bytealign (w0[1], w0[0], offset_minus_4); + w1[2] = amd_bytealign (w0[0], 0, offset_minus_4); + w1[1] = 0; + w1[0] = 0; + w0[3] = 0; + w0[2] = 0; + w0[1] = 0; + w0[0] = 0; + + if (offset_mod_4 == 0) + { + w1[2] = w1[3]; + w1[3] = w2[0]; + w2[0] = w2[1]; + w2[1] = w2[2]; + w2[2] = w2[3]; + w2[3] = w3[0]; + w3[0] = w3[1]; + w3[1] = w3[2]; + w3[2] = 0; + } + + break; + + case 7: + w3[2] = amd_bytealign ( 0, w1[2], offset_minus_4); + w3[1] = amd_bytealign (w1[2], w1[1], offset_minus_4); + w3[0] = amd_bytealign (w1[1], w1[0], offset_minus_4); + w2[3] = amd_bytealign (w1[0], w0[3], offset_minus_4); + w2[2] = amd_bytealign (w0[3], w0[2], offset_minus_4); + w2[1] = amd_bytealign (w0[2], w0[1], offset_minus_4); + w2[0] = amd_bytealign (w0[1], w0[0], offset_minus_4); + w1[3] = amd_bytealign (w0[0], 0, offset_minus_4); + w1[2] = 0; + w1[1] = 0; + w1[0] = 0; + w0[3] = 0; + w0[2] = 0; + w0[1] = 0; + w0[0] = 0; + + if (offset_mod_4 == 0) + { + w1[3] = w2[0]; + w2[0] = w2[1]; + w2[1] = w2[2]; + w2[2] = w2[3]; + w2[3] = w3[0]; + w3[0] = w3[1]; + w3[1] = w3[2]; + w3[2] = 0; + } + + break; + + case 8: + w3[2] = amd_bytealign ( 0, w1[1], offset_minus_4); + w3[1] = amd_bytealign (w1[1], w1[0], offset_minus_4); + w3[0] = amd_bytealign (w1[0], w0[3], offset_minus_4); + w2[3] = amd_bytealign (w0[3], w0[2], offset_minus_4); + w2[2] = amd_bytealign (w0[2], w0[1], offset_minus_4); + w2[1] = amd_bytealign (w0[1], w0[0], offset_minus_4); + w2[0] = amd_bytealign (w0[0], 0, offset_minus_4); + w1[3] = 0; + w1[2] = 0; + w1[1] = 0; + w1[0] = 0; + w0[3] = 0; + w0[2] = 0; + w0[1] = 0; + w0[0] = 0; + + if (offset_mod_4 == 0) + { + w2[0] = w2[1]; + w2[1] = w2[2]; + w2[2] = w2[3]; + w2[3] = w3[0]; + w3[0] = w3[1]; + w3[1] = w3[2]; + w3[2] = 0; + } + + break; + + case 9: + w3[2] = amd_bytealign ( 0, w1[0], offset_minus_4); + w3[1] = amd_bytealign (w1[0], w0[3], offset_minus_4); + w3[0] = amd_bytealign (w0[3], w0[2], offset_minus_4); + w2[3] = amd_bytealign (w0[2], w0[1], offset_minus_4); + w2[2] = amd_bytealign (w0[1], w0[0], offset_minus_4); + w2[1] = amd_bytealign (w0[0], 0, offset_minus_4); + w2[0] = 0; + w1[3] = 0; + w1[2] = 0; + w1[1] = 0; + w1[0] = 0; + w0[3] = 0; + w0[2] = 0; + w0[1] = 0; + w0[0] = 0; + + if (offset_mod_4 == 0) + { + w2[1] = w2[2]; + w2[2] = w2[3]; + w2[3] = w3[0]; + w3[0] = w3[1]; + w3[1] = w3[2]; + w3[2] = 0; + } + + break; + + case 10: + w3[2] = amd_bytealign ( 0, w0[3], offset_minus_4); + w3[1] = amd_bytealign (w0[3], w0[2], offset_minus_4); + w3[0] = amd_bytealign (w0[2], w0[1], offset_minus_4); + w2[3] = amd_bytealign (w0[1], w0[0], offset_minus_4); + w2[2] = amd_bytealign (w0[0], 0, offset_minus_4); + w2[1] = 0; + w2[0] = 0; + w1[3] = 0; + w1[2] = 0; + w1[1] = 0; + w1[0] = 0; + w0[3] = 0; + w0[2] = 0; + w0[1] = 0; + w0[0] = 0; + + if (offset_mod_4 == 0) + { + w2[2] = w2[3]; + w2[3] = w3[0]; + w3[0] = w3[1]; + w3[1] = w3[2]; + w3[2] = 0; + } + + break; + + case 11: + w3[2] = amd_bytealign ( 0, w0[2], offset_minus_4); + w3[1] = amd_bytealign (w0[2], w0[1], offset_minus_4); + w3[0] = amd_bytealign (w0[1], w0[0], offset_minus_4); + w2[3] = amd_bytealign (w0[0], 0, offset_minus_4); + w2[2] = 0; + w2[1] = 0; + w2[0] = 0; + w1[3] = 0; + w1[2] = 0; + w1[1] = 0; + w1[0] = 0; + w0[3] = 0; + w0[2] = 0; + w0[1] = 0; + w0[0] = 0; + + if (offset_mod_4 == 0) + { + w2[3] = w3[0]; + w3[0] = w3[1]; + w3[1] = w3[2]; + w3[2] = 0; + } + + break; + + case 12: + w3[2] = amd_bytealign ( 0, w0[1], offset_minus_4); + w3[1] = amd_bytealign (w0[1], w0[0], offset_minus_4); + w3[0] = amd_bytealign (w0[0], 0, offset_minus_4); + w2[3] = 0; + w2[2] = 0; + w2[1] = 0; + w2[0] = 0; + w1[3] = 0; + w1[2] = 0; + w1[1] = 0; + w1[0] = 0; + w0[3] = 0; + w0[2] = 0; + w0[1] = 0; + w0[0] = 0; + + if (offset_mod_4 == 0) + { + w3[0] = w3[1]; + w3[1] = w3[2]; + w3[2] = 0; + } + + break; + + case 13: + w3[2] = amd_bytealign ( 0, w0[0], offset_minus_4); + w3[1] = amd_bytealign (w0[0], 0, offset_minus_4); + w3[0] = 0; + w2[3] = 0; + w2[2] = 0; + w2[1] = 0; + w2[0] = 0; + w1[3] = 0; + w1[2] = 0; + w1[1] = 0; + w1[0] = 0; + w0[3] = 0; + w0[2] = 0; + w0[1] = 0; + w0[0] = 0; + + if (offset_mod_4 == 0) + { + w3[1] = w3[2]; + w3[2] = 0; + } + + break; + } +} + +static void switch_buffer_by_offset_be (u32 w0[4], u32 w1[4], u32 w2[4], u32 w3[4], const u32 offset) +{ + switch (offset / 4) + { + case 0: + w3[2] = amd_bytealign (w3[1], 0, offset); + w3[1] = amd_bytealign (w3[0], w3[1], offset); + w3[0] = amd_bytealign (w2[3], w3[0], offset); + w2[3] = amd_bytealign (w2[2], w2[3], offset); + w2[2] = amd_bytealign (w2[1], w2[2], offset); + w2[1] = amd_bytealign (w2[0], w2[1], offset); + w2[0] = amd_bytealign (w1[3], w2[0], offset); + w1[3] = amd_bytealign (w1[2], w1[3], offset); + w1[2] = amd_bytealign (w1[1], w1[2], offset); + w1[1] = amd_bytealign (w1[0], w1[1], offset); + w1[0] = amd_bytealign (w0[3], w1[0], offset); + w0[3] = amd_bytealign (w0[2], w0[3], offset); + w0[2] = amd_bytealign (w0[1], w0[2], offset); + w0[1] = amd_bytealign (w0[0], w0[1], offset); + w0[0] = amd_bytealign ( 0, w0[0], offset); + break; + + case 1: + w3[2] = amd_bytealign (w3[0], 0, offset); + w3[1] = amd_bytealign (w2[3], w3[0], offset); + w3[0] = amd_bytealign (w2[2], w2[3], offset); + w2[3] = amd_bytealign (w2[1], w2[2], offset); + w2[2] = amd_bytealign (w2[0], w2[1], offset); + w2[1] = amd_bytealign (w1[3], w2[0], offset); + w2[0] = amd_bytealign (w1[2], w1[3], offset); + w1[3] = amd_bytealign (w1[1], w1[2], offset); + w1[2] = amd_bytealign (w1[0], w1[1], offset); + w1[1] = amd_bytealign (w0[3], w1[0], offset); + w1[0] = amd_bytealign (w0[2], w0[3], offset); + w0[3] = amd_bytealign (w0[1], w0[2], offset); + w0[2] = amd_bytealign (w0[0], w0[1], offset); + w0[1] = amd_bytealign ( 0, w0[0], offset); + w0[0] = 0; + break; + + case 2: + w3[2] = amd_bytealign (w2[3], 0, offset); + w3[1] = amd_bytealign (w2[2], w2[3], offset); + w3[0] = amd_bytealign (w2[1], w2[2], offset); + w2[3] = amd_bytealign (w2[0], w2[1], offset); + w2[2] = amd_bytealign (w1[3], w2[0], offset); + w2[1] = amd_bytealign (w1[2], w1[3], offset); + w2[0] = amd_bytealign (w1[1], w1[2], offset); + w1[3] = amd_bytealign (w1[0], w1[1], offset); + w1[2] = amd_bytealign (w0[3], w1[0], offset); + w1[1] = amd_bytealign (w0[2], w0[3], offset); + w1[0] = amd_bytealign (w0[1], w0[2], offset); + w0[3] = amd_bytealign (w0[0], w0[1], offset); + w0[2] = amd_bytealign ( 0, w0[0], offset); + w0[1] = 0; + w0[0] = 0; + break; + + case 3: + w3[2] = amd_bytealign (w2[2], 0, offset); + w3[1] = amd_bytealign (w2[1], w2[2], offset); + w3[0] = amd_bytealign (w2[0], w2[1], offset); + w2[3] = amd_bytealign (w1[3], w2[0], offset); + w2[2] = amd_bytealign (w1[2], w1[3], offset); + w2[1] = amd_bytealign (w1[1], w1[2], offset); + w2[0] = amd_bytealign (w1[0], w1[1], offset); + w1[3] = amd_bytealign (w0[3], w1[0], offset); + w1[2] = amd_bytealign (w0[2], w0[3], offset); + w1[1] = amd_bytealign (w0[1], w0[2], offset); + w1[0] = amd_bytealign (w0[0], w0[1], offset); + w0[3] = amd_bytealign ( 0, w0[0], offset); + w0[2] = 0; + w0[1] = 0; + w0[0] = 0; + break; + + case 4: + w3[2] = amd_bytealign (w2[1], 0, offset); + w3[1] = amd_bytealign (w2[0], w2[1], offset); + w3[0] = amd_bytealign (w1[3], w2[0], offset); + w2[3] = amd_bytealign (w1[2], w1[3], offset); + w2[2] = amd_bytealign (w1[1], w1[2], offset); + w2[1] = amd_bytealign (w1[0], w1[1], offset); + w2[0] = amd_bytealign (w0[3], w1[0], offset); + w1[3] = amd_bytealign (w0[2], w0[3], offset); + w1[2] = amd_bytealign (w0[1], w0[2], offset); + w1[1] = amd_bytealign (w0[0], w0[1], offset); + w1[0] = amd_bytealign ( 0, w0[0], offset); + w0[3] = 0; + w0[2] = 0; + w0[1] = 0; + w0[0] = 0; + break; + + case 5: + w3[2] = amd_bytealign (w2[0], 0, offset); + w3[1] = amd_bytealign (w1[3], w2[0], offset); + w3[0] = amd_bytealign (w1[2], w1[3], offset); + w2[3] = amd_bytealign (w1[1], w1[2], offset); + w2[2] = amd_bytealign (w1[0], w1[1], offset); + w2[1] = amd_bytealign (w0[3], w1[0], offset); + w2[0] = amd_bytealign (w0[2], w0[3], offset); + w1[3] = amd_bytealign (w0[1], w0[2], offset); + w1[2] = amd_bytealign (w0[0], w0[1], offset); + w1[1] = amd_bytealign ( 0, w0[0], offset); + w1[0] = 0; + w0[3] = 0; + w0[2] = 0; + w0[1] = 0; + w0[0] = 0; + break; + + case 6: + w3[2] = amd_bytealign (w1[3], 0, offset); + w3[1] = amd_bytealign (w1[2], w1[3], offset); + w3[0] = amd_bytealign (w1[1], w1[2], offset); + w2[3] = amd_bytealign (w1[0], w1[1], offset); + w2[2] = amd_bytealign (w0[3], w1[0], offset); + w2[1] = amd_bytealign (w0[2], w0[3], offset); + w2[0] = amd_bytealign (w0[1], w0[2], offset); + w1[3] = amd_bytealign (w0[0], w0[1], offset); + w1[2] = amd_bytealign ( 0, w0[0], offset); + w1[1] = 0; + w1[0] = 0; + w0[3] = 0; + w0[2] = 0; + w0[1] = 0; + w0[0] = 0; + break; + + case 7: + w3[2] = amd_bytealign (w1[2], 0, offset); + w3[1] = amd_bytealign (w1[1], w1[2], offset); + w3[0] = amd_bytealign (w1[0], w1[1], offset); + w2[3] = amd_bytealign (w0[3], w1[0], offset); + w2[2] = amd_bytealign (w0[2], w0[3], offset); + w2[1] = amd_bytealign (w0[1], w0[2], offset); + w2[0] = amd_bytealign (w0[0], w0[1], offset); + w1[3] = amd_bytealign ( 0, w0[0], offset); + w1[2] = 0; + w1[1] = 0; + w1[0] = 0; + w0[3] = 0; + w0[2] = 0; + w0[1] = 0; + w0[0] = 0; + break; + + case 8: + w3[2] = amd_bytealign (w1[1], 0, offset); + w3[1] = amd_bytealign (w1[0], w1[1], offset); + w3[0] = amd_bytealign (w0[3], w1[0], offset); + w2[3] = amd_bytealign (w0[2], w0[3], offset); + w2[2] = amd_bytealign (w0[1], w0[2], offset); + w2[1] = amd_bytealign (w0[0], w0[1], offset); + w2[0] = amd_bytealign ( 0, w0[0], offset); + w1[3] = 0; + w1[2] = 0; + w1[1] = 0; + w1[0] = 0; + w0[3] = 0; + w0[2] = 0; + w0[1] = 0; + w0[0] = 0; + break; + + case 9: + w3[2] = amd_bytealign (w1[0], 0, offset); + w3[1] = amd_bytealign (w0[3], w1[0], offset); + w3[0] = amd_bytealign (w0[2], w0[3], offset); + w2[3] = amd_bytealign (w0[1], w0[2], offset); + w2[2] = amd_bytealign (w0[0], w0[1], offset); + w2[1] = amd_bytealign ( 0, w0[0], offset); + w2[0] = 0; + w1[3] = 0; + w1[2] = 0; + w1[1] = 0; + w1[0] = 0; + w0[3] = 0; + w0[2] = 0; + w0[1] = 0; + w0[0] = 0; + break; + + case 10: + w3[2] = amd_bytealign (w0[3], 0, offset); + w3[1] = amd_bytealign (w0[2], w0[3], offset); + w3[0] = amd_bytealign (w0[1], w0[2], offset); + w2[3] = amd_bytealign (w0[0], w0[1], offset); + w2[2] = amd_bytealign ( 0, w0[0], offset); + w2[1] = 0; + w2[0] = 0; + w1[3] = 0; + w1[2] = 0; + w1[1] = 0; + w1[0] = 0; + w0[3] = 0; + w0[2] = 0; + w0[1] = 0; + w0[0] = 0; + break; + + case 11: + w3[2] = amd_bytealign (w0[2], 0, offset); + w3[1] = amd_bytealign (w0[1], w0[2], offset); + w3[0] = amd_bytealign (w0[0], w0[1], offset); + w2[3] = amd_bytealign ( 0, w0[0], offset); + w2[2] = 0; + w2[1] = 0; + w2[0] = 0; + w1[3] = 0; + w1[2] = 0; + w1[1] = 0; + w1[0] = 0; + w0[3] = 0; + w0[2] = 0; + w0[1] = 0; + w0[0] = 0; + break; + + case 12: + w3[2] = amd_bytealign (w0[1], 0, offset); + w3[1] = amd_bytealign (w0[0], w0[1], offset); + w3[0] = amd_bytealign ( 0, w0[0], offset); + w2[3] = 0; + w2[2] = 0; + w2[1] = 0; + w2[0] = 0; + w1[3] = 0; + w1[2] = 0; + w1[1] = 0; + w1[0] = 0; + w0[3] = 0; + w0[2] = 0; + w0[1] = 0; + w0[0] = 0; + break; + + case 13: + w3[2] = amd_bytealign (w0[0], 0, offset); + w3[1] = amd_bytealign ( 0, w0[0], offset); + w3[0] = 0; + w2[3] = 0; + w2[2] = 0; + w2[1] = 0; + w2[0] = 0; + w1[3] = 0; + w1[2] = 0; + w1[1] = 0; + w1[0] = 0; + w0[3] = 0; + w0[2] = 0; + w0[1] = 0; + w0[0] = 0; + break; + } +} + +/** + * vector + */ + +#ifndef VECT_SIZE1 +static u32x swap_workaround (const u32x v) +{ + return rotl32 ((v & 0x00FF00FF), 24u) + | rotl32 ((v & 0xFF00FF00), 8u); +} + +static u64x swap_workaround (const u64x v) +{ + return (((v & 0xff00000000000000) >> 56) + | ((v & 0x00ff000000000000) >> 40) + | ((v & 0x0000ff0000000000) >> 24) + | ((v & 0x000000ff00000000) >> 8) + | ((v & 0x00000000ff000000) << 8) + | ((v & 0x0000000000ff0000) << 24) + | ((v & 0x000000000000ff00) << 40) + | ((v & 0x00000000000000ff) << 56)); +} + +static void truncate_block (u32x w[4], const u32 len) +{ + switch (len) + { + case 0: w[0] &= 0; + w[1] &= 0; + w[2] &= 0; + w[3] &= 0; + break; + case 1: w[0] &= 0x000000FF; + w[1] &= 0; + w[2] &= 0; + w[3] &= 0; + break; + case 2: w[0] &= 0x0000FFFF; + w[1] &= 0; + w[2] &= 0; + w[3] &= 0; + break; + case 3: w[0] &= 0x00FFFFFF; + w[1] &= 0; + w[2] &= 0; + w[3] &= 0; + break; + case 4: w[1] &= 0; + w[2] &= 0; + w[3] &= 0; + break; + case 5: w[1] &= 0x000000FF; + w[2] &= 0; + w[3] &= 0; + break; + case 6: w[1] &= 0x0000FFFF; + w[2] &= 0; + w[3] &= 0; + break; + case 7: w[1] &= 0x00FFFFFF; + w[2] &= 0; + w[3] &= 0; + break; + case 8: w[2] &= 0; + w[3] &= 0; + break; + case 9: w[2] &= 0x000000FF; + w[3] &= 0; + break; + case 10: w[2] &= 0x0000FFFF; + w[3] &= 0; + break; + case 11: w[2] &= 0x00FFFFFF; + w[3] &= 0; + break; + case 12: w[3] &= 0; + break; + case 13: w[3] &= 0x000000FF; + break; + case 14: w[3] &= 0x0000FFFF; + break; + case 15: w[3] &= 0x00FFFFFF; + break; + } +} + +static void make_unicode (const u32x in[4], u32x out1[4], u32x out2[4]) +{ + out2[3] = ((in[3] >> 8) & 0x00FF0000) | ((in[3] >> 16) & 0x000000FF); + out2[2] = ((in[3] << 8) & 0x00FF0000) | ((in[3] >> 0) & 0x000000FF); + out2[1] = ((in[2] >> 8) & 0x00FF0000) | ((in[2] >> 16) & 0x000000FF); + out2[0] = ((in[2] << 8) & 0x00FF0000) | ((in[2] >> 0) & 0x000000FF); + out1[3] = ((in[1] >> 8) & 0x00FF0000) | ((in[1] >> 16) & 0x000000FF); + out1[2] = ((in[1] << 8) & 0x00FF0000) | ((in[1] >> 0) & 0x000000FF); + out1[1] = ((in[0] >> 8) & 0x00FF0000) | ((in[0] >> 16) & 0x000000FF); + out1[0] = ((in[0] << 8) & 0x00FF0000) | ((in[0] >> 0) & 0x000000FF); +} + +static void append_0x01_1 (u32x w0[4], const u32 offset) +{ + switch (offset) + { + case 0: + w0[0] = 0x01; + break; + + case 1: + w0[0] = w0[0] | 0x0100; + break; + + case 2: + w0[0] = w0[0] | 0x010000; + break; + + case 3: + w0[0] = w0[0] | 0x01000000; + break; + + case 4: + w0[1] = 0x01; + break; + + case 5: + w0[1] = w0[1] | 0x0100; + break; + + case 6: + w0[1] = w0[1] | 0x010000; + break; + + case 7: + w0[1] = w0[1] | 0x01000000; + break; + + case 8: + w0[2] = 0x01; + break; + + case 9: + w0[2] = w0[2] | 0x0100; + break; + + case 10: + w0[2] = w0[2] | 0x010000; + break; + + case 11: + w0[2] = w0[2] | 0x01000000; + break; + + case 12: + w0[3] = 0x01; + break; + + case 13: + w0[3] = w0[3] | 0x0100; + break; + + case 14: + w0[3] = w0[3] | 0x010000; + break; + + case 15: + w0[3] = w0[3] | 0x01000000; + break; + } +} + +static void append_0x01_2 (u32x w0[4], u32x w1[4], const u32 offset) +{ + switch (offset) + { + case 0: + w0[0] = 0x01; + break; + + case 1: + w0[0] = w0[0] | 0x0100; + break; + + case 2: + w0[0] = w0[0] | 0x010000; + break; + + case 3: + w0[0] = w0[0] | 0x01000000; + break; + + case 4: + w0[1] = 0x01; + break; + + case 5: + w0[1] = w0[1] | 0x0100; + break; + + case 6: + w0[1] = w0[1] | 0x010000; + break; + + case 7: + w0[1] = w0[1] | 0x01000000; + break; + + case 8: + w0[2] = 0x01; + break; + + case 9: + w0[2] = w0[2] | 0x0100; + break; + + case 10: + w0[2] = w0[2] | 0x010000; + break; + + case 11: + w0[2] = w0[2] | 0x01000000; + break; + + case 12: + w0[3] = 0x01; + break; + + case 13: + w0[3] = w0[3] | 0x0100; + break; + + case 14: + w0[3] = w0[3] | 0x010000; + break; + + case 15: + w0[3] = w0[3] | 0x01000000; + break; + + case 16: + w1[0] = 0x01; + break; + + case 17: + w1[0] = w1[0] | 0x0100; + break; + + case 18: + w1[0] = w1[0] | 0x010000; + break; + + case 19: + w1[0] = w1[0] | 0x01000000; + break; + + case 20: + w1[1] = 0x01; + break; + + case 21: + w1[1] = w1[1] | 0x0100; + break; + + case 22: + w1[1] = w1[1] | 0x010000; + break; + + case 23: + w1[1] = w1[1] | 0x01000000; + break; + + case 24: + w1[2] = 0x01; + break; + + case 25: + w1[2] = w1[2] | 0x0100; + break; + + case 26: + w1[2] = w1[2] | 0x010000; + break; + + case 27: + w1[2] = w1[2] | 0x01000000; + break; + + case 28: + w1[3] = 0x01; + break; + + case 29: + w1[3] = w1[3] | 0x0100; + break; + + case 30: + w1[3] = w1[3] | 0x010000; + break; + + case 31: + w1[3] = w1[3] | 0x01000000; + break; + } +} + +static void append_0x01_3 (u32x w0[4], u32x w1[4], u32x w2[4], const u32 offset) +{ + switch (offset) + { + case 0: + w0[0] = 0x01; + break; + + case 1: + w0[0] = w0[0] | 0x0100; + break; + + case 2: + w0[0] = w0[0] | 0x010000; + break; + + case 3: + w0[0] = w0[0] | 0x01000000; + break; + + case 4: + w0[1] = 0x01; + break; + + case 5: + w0[1] = w0[1] | 0x0100; + break; + + case 6: + w0[1] = w0[1] | 0x010000; + break; + + case 7: + w0[1] = w0[1] | 0x01000000; + break; + + case 8: + w0[2] = 0x01; + break; + + case 9: + w0[2] = w0[2] | 0x0100; + break; + + case 10: + w0[2] = w0[2] | 0x010000; + break; + + case 11: + w0[2] = w0[2] | 0x01000000; + break; + + case 12: + w0[3] = 0x01; + break; + + case 13: + w0[3] = w0[3] | 0x0100; + break; + + case 14: + w0[3] = w0[3] | 0x010000; + break; + + case 15: + w0[3] = w0[3] | 0x01000000; + break; + + case 16: + w1[0] = 0x01; + break; + + case 17: + w1[0] = w1[0] | 0x0100; + break; + + case 18: + w1[0] = w1[0] | 0x010000; + break; + + case 19: + w1[0] = w1[0] | 0x01000000; + break; + + case 20: + w1[1] = 0x01; + break; + + case 21: + w1[1] = w1[1] | 0x0100; + break; + + case 22: + w1[1] = w1[1] | 0x010000; + break; + + case 23: + w1[1] = w1[1] | 0x01000000; + break; + + case 24: + w1[2] = 0x01; + break; + + case 25: + w1[2] = w1[2] | 0x0100; + break; + + case 26: + w1[2] = w1[2] | 0x010000; + break; + + case 27: + w1[2] = w1[2] | 0x01000000; + break; + + case 28: + w1[3] = 0x01; + break; + + case 29: + w1[3] = w1[3] | 0x0100; + break; + + case 30: + w1[3] = w1[3] | 0x010000; + break; + + case 31: + w1[3] = w1[3] | 0x01000000; + break; + + case 32: + w2[0] = 0x01; + break; + + case 33: + w2[0] = w2[0] | 0x0100; + break; + + case 34: + w2[0] = w2[0] | 0x010000; + break; + + case 35: + w2[0] = w2[0] | 0x01000000; + break; + + case 36: + w2[1] = 0x01; + break; + + case 37: + w2[1] = w2[1] | 0x0100; + break; + + case 38: + w2[1] = w2[1] | 0x010000; + break; + + case 39: + w2[1] = w2[1] | 0x01000000; + break; + + case 40: + w2[2] = 0x01; + break; + + case 41: + w2[2] = w2[2] | 0x0100; + break; + + case 42: + w2[2] = w2[2] | 0x010000; + break; + + case 43: + w2[2] = w2[2] | 0x01000000; + break; + + case 44: + w2[3] = 0x01; + break; + + case 45: + w2[3] = w2[3] | 0x0100; + break; + + case 46: + w2[3] = w2[3] | 0x010000; + break; + + case 47: + w2[3] = w2[3] | 0x01000000; + break; + } +} + +static void append_0x01_4 (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], const u32 offset) +{ + switch (offset) + { + case 0: + w0[0] = 0x01; + break; + + case 1: + w0[0] = w0[0] | 0x0100; + break; + + case 2: + w0[0] = w0[0] | 0x010000; + break; + + case 3: + w0[0] = w0[0] | 0x01000000; + break; + + case 4: + w0[1] = 0x01; + break; + + case 5: + w0[1] = w0[1] | 0x0100; + break; + + case 6: + w0[1] = w0[1] | 0x010000; + break; + + case 7: + w0[1] = w0[1] | 0x01000000; + break; + + case 8: + w0[2] = 0x01; + break; + + case 9: + w0[2] = w0[2] | 0x0100; + break; + + case 10: + w0[2] = w0[2] | 0x010000; + break; + + case 11: + w0[2] = w0[2] | 0x01000000; + break; + + case 12: + w0[3] = 0x01; + break; + + case 13: + w0[3] = w0[3] | 0x0100; + break; + + case 14: + w0[3] = w0[3] | 0x010000; + break; + + case 15: + w0[3] = w0[3] | 0x01000000; + break; + + case 16: + w1[0] = 0x01; + break; + + case 17: + w1[0] = w1[0] | 0x0100; + break; + + case 18: + w1[0] = w1[0] | 0x010000; + break; + + case 19: + w1[0] = w1[0] | 0x01000000; + break; + + case 20: + w1[1] = 0x01; + break; + + case 21: + w1[1] = w1[1] | 0x0100; + break; + + case 22: + w1[1] = w1[1] | 0x010000; + break; + + case 23: + w1[1] = w1[1] | 0x01000000; + break; + + case 24: + w1[2] = 0x01; + break; + + case 25: + w1[2] = w1[2] | 0x0100; + break; + + case 26: + w1[2] = w1[2] | 0x010000; + break; + + case 27: + w1[2] = w1[2] | 0x01000000; + break; + + case 28: + w1[3] = 0x01; + break; + + case 29: + w1[3] = w1[3] | 0x0100; + break; + + case 30: + w1[3] = w1[3] | 0x010000; + break; + + case 31: + w1[3] = w1[3] | 0x01000000; + break; + + case 32: + w2[0] = 0x01; + break; + + case 33: + w2[0] = w2[0] | 0x0100; + break; + + case 34: + w2[0] = w2[0] | 0x010000; + break; + + case 35: + w2[0] = w2[0] | 0x01000000; + break; + + case 36: + w2[1] = 0x01; + break; + + case 37: + w2[1] = w2[1] | 0x0100; + break; + + case 38: + w2[1] = w2[1] | 0x010000; + break; + + case 39: + w2[1] = w2[1] | 0x01000000; + break; + + case 40: + w2[2] = 0x01; + break; + + case 41: + w2[2] = w2[2] | 0x0100; + break; + + case 42: + w2[2] = w2[2] | 0x010000; + break; + + case 43: + w2[2] = w2[2] | 0x01000000; + break; + + case 44: + w2[3] = 0x01; + break; + + case 45: + w2[3] = w2[3] | 0x0100; + break; + + case 46: + w2[3] = w2[3] | 0x010000; + break; + + case 47: + w2[3] = w2[3] | 0x01000000; + break; + + case 48: + w3[0] = 0x01; + break; + + case 49: + w3[0] = w3[0] | 0x0100; + break; + + case 50: + w3[0] = w3[0] | 0x010000; + break; + + case 51: + w3[0] = w3[0] | 0x01000000; + break; + + case 52: + w3[1] = 0x01; + break; + + case 53: + w3[1] = w3[1] | 0x0100; + break; + + case 54: + w3[1] = w3[1] | 0x010000; + break; + + case 55: + w3[1] = w3[1] | 0x01000000; + break; + + case 56: + w3[2] = 0x01; + break; + + case 57: + w3[2] = w3[2] | 0x0100; + break; + + case 58: + w3[2] = w3[2] | 0x010000; + break; + + case 59: + w3[2] = w3[2] | 0x01000000; + break; + + case 60: + w3[3] = 0x01; + break; + + case 61: + w3[3] = w3[3] | 0x0100; + break; + + case 62: + w3[3] = w3[3] | 0x010000; + break; + + case 63: + w3[3] = w3[3] | 0x01000000; + break; + } +} + +static void append_0x01_8 (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], u32x w4[4], u32x w5[4], u32x w6[4], u32x w7[4], const u32 offset) +{ + switch (offset) + { + case 0: + w0[0] = 0x01; + break; + + case 1: + w0[0] = w0[0] | 0x0100; + break; + + case 2: + w0[0] = w0[0] | 0x010000; + break; + + case 3: + w0[0] = w0[0] | 0x01000000; + break; + + case 4: + w0[1] = 0x01; + break; + + case 5: + w0[1] = w0[1] | 0x0100; + break; + + case 6: + w0[1] = w0[1] | 0x010000; + break; + + case 7: + w0[1] = w0[1] | 0x01000000; + break; + + case 8: + w0[2] = 0x01; + break; + + case 9: + w0[2] = w0[2] | 0x0100; + break; + + case 10: + w0[2] = w0[2] | 0x010000; + break; + + case 11: + w0[2] = w0[2] | 0x01000000; + break; + + case 12: + w0[3] = 0x01; + break; + + case 13: + w0[3] = w0[3] | 0x0100; + break; + + case 14: + w0[3] = w0[3] | 0x010000; + break; + + case 15: + w0[3] = w0[3] | 0x01000000; + break; + + case 16: + w1[0] = 0x01; + break; + + case 17: + w1[0] = w1[0] | 0x0100; + break; + + case 18: + w1[0] = w1[0] | 0x010000; + break; + + case 19: + w1[0] = w1[0] | 0x01000000; + break; + + case 20: + w1[1] = 0x01; + break; + + case 21: + w1[1] = w1[1] | 0x0100; + break; + + case 22: + w1[1] = w1[1] | 0x010000; + break; + + case 23: + w1[1] = w1[1] | 0x01000000; + break; + + case 24: + w1[2] = 0x01; + break; + + case 25: + w1[2] = w1[2] | 0x0100; + break; + + case 26: + w1[2] = w1[2] | 0x010000; + break; + + case 27: + w1[2] = w1[2] | 0x01000000; + break; + + case 28: + w1[3] = 0x01; + break; + + case 29: + w1[3] = w1[3] | 0x0100; + break; + + case 30: + w1[3] = w1[3] | 0x010000; + break; + + case 31: + w1[3] = w1[3] | 0x01000000; + break; + + case 32: + w2[0] = 0x01; + break; + + case 33: + w2[0] = w2[0] | 0x0100; + break; + + case 34: + w2[0] = w2[0] | 0x010000; + break; + + case 35: + w2[0] = w2[0] | 0x01000000; + break; + + case 36: + w2[1] = 0x01; + break; + + case 37: + w2[1] = w2[1] | 0x0100; + break; + + case 38: + w2[1] = w2[1] | 0x010000; + break; + + case 39: + w2[1] = w2[1] | 0x01000000; + break; + + case 40: + w2[2] = 0x01; + break; + + case 41: + w2[2] = w2[2] | 0x0100; + break; + + case 42: + w2[2] = w2[2] | 0x010000; + break; + + case 43: + w2[2] = w2[2] | 0x01000000; + break; + + case 44: + w2[3] = 0x01; + break; + + case 45: + w2[3] = w2[3] | 0x0100; + break; + + case 46: + w2[3] = w2[3] | 0x010000; + break; + + case 47: + w2[3] = w2[3] | 0x01000000; + break; + + case 48: + w3[0] = 0x01; + break; + + case 49: + w3[0] = w3[0] | 0x0100; + break; + + case 50: + w3[0] = w3[0] | 0x010000; + break; + + case 51: + w3[0] = w3[0] | 0x01000000; + break; + + case 52: + w3[1] = 0x01; + break; + + case 53: + w3[1] = w3[1] | 0x0100; + break; + + case 54: + w3[1] = w3[1] | 0x010000; + break; + + case 55: + w3[1] = w3[1] | 0x01000000; + break; + + case 56: + w3[2] = 0x01; + break; + + case 57: + w3[2] = w3[2] | 0x0100; + break; + + case 58: + w3[2] = w3[2] | 0x010000; + break; + + case 59: + w3[2] = w3[2] | 0x01000000; + break; + + case 60: + w3[3] = 0x01; + break; + + case 61: + w3[3] = w3[3] | 0x0100; + break; + + case 62: + w3[3] = w3[3] | 0x010000; + break; + + case 63: + w3[3] = w3[3] | 0x01000000; + break; + + case 64: + w4[0] = 0x01; + break; + + case 65: + w4[0] = w4[0] | 0x0100; + break; + + case 66: + w4[0] = w4[0] | 0x010000; + break; + + case 67: + w4[0] = w4[0] | 0x01000000; + break; + + case 68: + w4[1] = 0x01; + break; + + case 69: + w4[1] = w4[1] | 0x0100; + break; + + case 70: + w4[1] = w4[1] | 0x010000; + break; + + case 71: + w4[1] = w4[1] | 0x01000000; + break; + + case 72: + w4[2] = 0x01; + break; + + case 73: + w4[2] = w4[2] | 0x0100; + break; + + case 74: + w4[2] = w4[2] | 0x010000; + break; + + case 75: + w4[2] = w4[2] | 0x01000000; + break; + + case 76: + w4[3] = 0x01; + break; + + case 77: + w4[3] = w4[3] | 0x0100; + break; + + case 78: + w4[3] = w4[3] | 0x010000; + break; + + case 79: + w4[3] = w4[3] | 0x01000000; + break; + + case 80: + w5[0] = 0x01; + break; + + case 81: + w5[0] = w5[0] | 0x0100; + break; + + case 82: + w5[0] = w5[0] | 0x010000; + break; + + case 83: + w5[0] = w5[0] | 0x01000000; + break; + + case 84: + w5[1] = 0x01; + break; + + case 85: + w5[1] = w5[1] | 0x0100; + break; + + case 86: + w5[1] = w5[1] | 0x010000; + break; + + case 87: + w5[1] = w5[1] | 0x01000000; + break; + + case 88: + w5[2] = 0x01; + break; + + case 89: + w5[2] = w5[2] | 0x0100; + break; + + case 90: + w5[2] = w5[2] | 0x010000; + break; + + case 91: + w5[2] = w5[2] | 0x01000000; + break; + + case 92: + w5[3] = 0x01; + break; + + case 93: + w5[3] = w5[3] | 0x0100; + break; + + case 94: + w5[3] = w5[3] | 0x010000; + break; + + case 95: + w5[3] = w5[3] | 0x01000000; + break; + + case 96: + w6[0] = 0x01; + break; + + case 97: + w6[0] = w6[0] | 0x0100; + break; + + case 98: + w6[0] = w6[0] | 0x010000; + break; + + case 99: + w6[0] = w6[0] | 0x01000000; + break; + + case 100: + w6[1] = 0x01; + break; + + case 101: + w6[1] = w6[1] | 0x0100; + break; + + case 102: + w6[1] = w6[1] | 0x010000; + break; + + case 103: + w6[1] = w6[1] | 0x01000000; + break; + + case 104: + w6[2] = 0x01; + break; + + case 105: + w6[2] = w6[2] | 0x0100; + break; + + case 106: + w6[2] = w6[2] | 0x010000; + break; + + case 107: + w6[2] = w6[2] | 0x01000000; + break; + + case 108: + w6[3] = 0x01; + break; + + case 109: + w6[3] = w6[3] | 0x0100; + break; + + case 110: + w6[3] = w6[3] | 0x010000; + break; + + case 111: + w6[3] = w6[3] | 0x01000000; + break; + + case 112: + w7[0] = 0x01; + break; + + case 113: + w7[0] = w7[0] | 0x0100; + break; + + case 114: + w7[0] = w7[0] | 0x010000; + break; + + case 115: + w7[0] = w7[0] | 0x01000000; + break; + + case 116: + w7[1] = 0x01; + break; + + case 117: + w7[1] = w7[1] | 0x0100; + break; + + case 118: + w7[1] = w7[1] | 0x010000; + break; + + case 119: + w7[1] = w7[1] | 0x01000000; + break; + + case 120: + w7[2] = 0x01; + break; + + case 121: + w7[2] = w7[2] | 0x0100; + break; + + case 122: + w7[2] = w7[2] | 0x010000; + break; + + case 123: + w7[2] = w7[2] | 0x01000000; + break; + + case 124: + w7[3] = 0x01; + break; + + case 125: + w7[3] = w7[3] | 0x0100; + break; + + case 126: + w7[3] = w7[3] | 0x010000; + break; + + case 127: + w7[3] = w7[3] | 0x01000000; + break; + } +} + +static void append_0x02_1 (u32x w0[4], const u32 offset) +{ + switch (offset) + { + case 0: + w0[0] = 0x02; + break; + + case 1: + w0[0] = w0[0] | 0x0200; + break; + + case 2: + w0[0] = w0[0] | 0x020000; + break; + + case 3: + w0[0] = w0[0] | 0x02000000; + break; + + case 4: + w0[1] = 0x02; + break; + + case 5: + w0[1] = w0[1] | 0x0200; + break; + + case 6: + w0[1] = w0[1] | 0x020000; + break; + + case 7: + w0[1] = w0[1] | 0x02000000; + break; + + case 8: + w0[2] = 0x02; + break; + + case 9: + w0[2] = w0[2] | 0x0200; + break; + + case 10: + w0[2] = w0[2] | 0x020000; + break; + + case 11: + w0[2] = w0[2] | 0x02000000; + break; + + case 12: + w0[3] = 0x02; + break; + + case 13: + w0[3] = w0[3] | 0x0200; + break; + + case 14: + w0[3] = w0[3] | 0x020000; + break; + + case 15: + w0[3] = w0[3] | 0x02000000; + break; + } +} + +static void append_0x02_2 (u32x w0[4], u32x w1[4], const u32 offset) +{ + switch (offset) + { + case 0: + w0[0] = 0x02; + break; + + case 1: + w0[0] = w0[0] | 0x0200; + break; + + case 2: + w0[0] = w0[0] | 0x020000; + break; + + case 3: + w0[0] = w0[0] | 0x02000000; + break; + + case 4: + w0[1] = 0x02; + break; + + case 5: + w0[1] = w0[1] | 0x0200; + break; + + case 6: + w0[1] = w0[1] | 0x020000; + break; + + case 7: + w0[1] = w0[1] | 0x02000000; + break; + + case 8: + w0[2] = 0x02; + break; + + case 9: + w0[2] = w0[2] | 0x0200; + break; + + case 10: + w0[2] = w0[2] | 0x020000; + break; + + case 11: + w0[2] = w0[2] | 0x02000000; + break; + + case 12: + w0[3] = 0x02; + break; + + case 13: + w0[3] = w0[3] | 0x0200; + break; + + case 14: + w0[3] = w0[3] | 0x020000; + break; + + case 15: + w0[3] = w0[3] | 0x02000000; + break; + + case 16: + w1[0] = 0x02; + break; + + case 17: + w1[0] = w1[0] | 0x0200; + break; + + case 18: + w1[0] = w1[0] | 0x020000; + break; + + case 19: + w1[0] = w1[0] | 0x02000000; + break; + + case 20: + w1[1] = 0x02; + break; + + case 21: + w1[1] = w1[1] | 0x0200; + break; + + case 22: + w1[1] = w1[1] | 0x020000; + break; + + case 23: + w1[1] = w1[1] | 0x02000000; + break; + + case 24: + w1[2] = 0x02; + break; + + case 25: + w1[2] = w1[2] | 0x0200; + break; + + case 26: + w1[2] = w1[2] | 0x020000; + break; + + case 27: + w1[2] = w1[2] | 0x02000000; + break; + + case 28: + w1[3] = 0x02; + break; + + case 29: + w1[3] = w1[3] | 0x0200; + break; + + case 30: + w1[3] = w1[3] | 0x020000; + break; + + case 31: + w1[3] = w1[3] | 0x02000000; + break; + } +} + +static void append_0x02_3 (u32x w0[4], u32x w1[4], u32x w2[4], const u32 offset) +{ + switch (offset) + { + case 0: + w0[0] = 0x02; + break; + + case 1: + w0[0] = w0[0] | 0x0200; + break; + + case 2: + w0[0] = w0[0] | 0x020000; + break; + + case 3: + w0[0] = w0[0] | 0x02000000; + break; + + case 4: + w0[1] = 0x02; + break; + + case 5: + w0[1] = w0[1] | 0x0200; + break; + + case 6: + w0[1] = w0[1] | 0x020000; + break; + + case 7: + w0[1] = w0[1] | 0x02000000; + break; + + case 8: + w0[2] = 0x02; + break; + + case 9: + w0[2] = w0[2] | 0x0200; + break; + + case 10: + w0[2] = w0[2] | 0x020000; + break; + + case 11: + w0[2] = w0[2] | 0x02000000; + break; + + case 12: + w0[3] = 0x02; + break; + + case 13: + w0[3] = w0[3] | 0x0200; + break; + + case 14: + w0[3] = w0[3] | 0x020000; + break; + + case 15: + w0[3] = w0[3] | 0x02000000; + break; + + case 16: + w1[0] = 0x02; + break; + + case 17: + w1[0] = w1[0] | 0x0200; + break; + + case 18: + w1[0] = w1[0] | 0x020000; + break; + + case 19: + w1[0] = w1[0] | 0x02000000; + break; + + case 20: + w1[1] = 0x02; + break; + + case 21: + w1[1] = w1[1] | 0x0200; + break; + + case 22: + w1[1] = w1[1] | 0x020000; + break; + + case 23: + w1[1] = w1[1] | 0x02000000; + break; + + case 24: + w1[2] = 0x02; + break; + + case 25: + w1[2] = w1[2] | 0x0200; + break; + + case 26: + w1[2] = w1[2] | 0x020000; + break; + + case 27: + w1[2] = w1[2] | 0x02000000; + break; + + case 28: + w1[3] = 0x02; + break; + + case 29: + w1[3] = w1[3] | 0x0200; + break; + + case 30: + w1[3] = w1[3] | 0x020000; + break; + + case 31: + w1[3] = w1[3] | 0x02000000; + break; + + case 32: + w2[0] = 0x02; + break; + + case 33: + w2[0] = w2[0] | 0x0200; + break; + + case 34: + w2[0] = w2[0] | 0x020000; + break; + + case 35: + w2[0] = w2[0] | 0x02000000; + break; + + case 36: + w2[1] = 0x02; + break; + + case 37: + w2[1] = w2[1] | 0x0200; + break; + + case 38: + w2[1] = w2[1] | 0x020000; + break; + + case 39: + w2[1] = w2[1] | 0x02000000; + break; + + case 40: + w2[2] = 0x02; + break; + + case 41: + w2[2] = w2[2] | 0x0200; + break; + + case 42: + w2[2] = w2[2] | 0x020000; + break; + + case 43: + w2[2] = w2[2] | 0x02000000; + break; + + case 44: + w2[3] = 0x02; + break; + + case 45: + w2[3] = w2[3] | 0x0200; + break; + + case 46: + w2[3] = w2[3] | 0x020000; + break; + + case 47: + w2[3] = w2[3] | 0x02000000; + break; + } +} + +static void append_0x02_4 (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], const u32 offset) +{ + switch (offset) + { + case 0: + w0[0] = 0x02; + break; + + case 1: + w0[0] = w0[0] | 0x0200; + break; + + case 2: + w0[0] = w0[0] | 0x020000; + break; + + case 3: + w0[0] = w0[0] | 0x02000000; + break; + + case 4: + w0[1] = 0x02; + break; + + case 5: + w0[1] = w0[1] | 0x0200; + break; + + case 6: + w0[1] = w0[1] | 0x020000; + break; + + case 7: + w0[1] = w0[1] | 0x02000000; + break; + + case 8: + w0[2] = 0x02; + break; + + case 9: + w0[2] = w0[2] | 0x0200; + break; + + case 10: + w0[2] = w0[2] | 0x020000; + break; + + case 11: + w0[2] = w0[2] | 0x02000000; + break; + + case 12: + w0[3] = 0x02; + break; + + case 13: + w0[3] = w0[3] | 0x0200; + break; + + case 14: + w0[3] = w0[3] | 0x020000; + break; + + case 15: + w0[3] = w0[3] | 0x02000000; + break; + + case 16: + w1[0] = 0x02; + break; + + case 17: + w1[0] = w1[0] | 0x0200; + break; + + case 18: + w1[0] = w1[0] | 0x020000; + break; + + case 19: + w1[0] = w1[0] | 0x02000000; + break; + + case 20: + w1[1] = 0x02; + break; + + case 21: + w1[1] = w1[1] | 0x0200; + break; + + case 22: + w1[1] = w1[1] | 0x020000; + break; + + case 23: + w1[1] = w1[1] | 0x02000000; + break; + + case 24: + w1[2] = 0x02; + break; + + case 25: + w1[2] = w1[2] | 0x0200; + break; + + case 26: + w1[2] = w1[2] | 0x020000; + break; + + case 27: + w1[2] = w1[2] | 0x02000000; + break; + + case 28: + w1[3] = 0x02; + break; + + case 29: + w1[3] = w1[3] | 0x0200; + break; + + case 30: + w1[3] = w1[3] | 0x020000; + break; + + case 31: + w1[3] = w1[3] | 0x02000000; + break; + + case 32: + w2[0] = 0x02; + break; + + case 33: + w2[0] = w2[0] | 0x0200; + break; + + case 34: + w2[0] = w2[0] | 0x020000; + break; + + case 35: + w2[0] = w2[0] | 0x02000000; + break; + + case 36: + w2[1] = 0x02; + break; + + case 37: + w2[1] = w2[1] | 0x0200; + break; + + case 38: + w2[1] = w2[1] | 0x020000; + break; + + case 39: + w2[1] = w2[1] | 0x02000000; + break; + + case 40: + w2[2] = 0x02; + break; + + case 41: + w2[2] = w2[2] | 0x0200; + break; + + case 42: + w2[2] = w2[2] | 0x020000; + break; + + case 43: + w2[2] = w2[2] | 0x02000000; + break; + + case 44: + w2[3] = 0x02; + break; + + case 45: + w2[3] = w2[3] | 0x0200; + break; + + case 46: + w2[3] = w2[3] | 0x020000; + break; + + case 47: + w2[3] = w2[3] | 0x02000000; + break; + + case 48: + w3[0] = 0x02; + break; + + case 49: + w3[0] = w3[0] | 0x0200; + break; + + case 50: + w3[0] = w3[0] | 0x020000; + break; + + case 51: + w3[0] = w3[0] | 0x02000000; + break; + + case 52: + w3[1] = 0x02; + break; + + case 53: + w3[1] = w3[1] | 0x0200; + break; + + case 54: + w3[1] = w3[1] | 0x020000; + break; + + case 55: + w3[1] = w3[1] | 0x02000000; + break; + + case 56: + w3[2] = 0x02; + break; + + case 57: + w3[2] = w3[2] | 0x0200; + break; + + case 58: + w3[2] = w3[2] | 0x020000; + break; + + case 59: + w3[2] = w3[2] | 0x02000000; + break; + + case 60: + w3[3] = 0x02; + break; + + case 61: + w3[3] = w3[3] | 0x0200; + break; + + case 62: + w3[3] = w3[3] | 0x020000; + break; + + case 63: + w3[3] = w3[3] | 0x02000000; + break; + } +} + +static void append_0x02_8 (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], u32x w4[4], u32x w5[4], u32x w6[4], u32x w7[4], const u32 offset) +{ + switch (offset) + { + case 0: + w0[0] = 0x02; + break; + + case 1: + w0[0] = w0[0] | 0x0200; + break; + + case 2: + w0[0] = w0[0] | 0x020000; + break; + + case 3: + w0[0] = w0[0] | 0x02000000; + break; + + case 4: + w0[1] = 0x02; + break; + + case 5: + w0[1] = w0[1] | 0x0200; + break; + + case 6: + w0[1] = w0[1] | 0x020000; + break; + + case 7: + w0[1] = w0[1] | 0x02000000; + break; + + case 8: + w0[2] = 0x02; + break; + + case 9: + w0[2] = w0[2] | 0x0200; + break; + + case 10: + w0[2] = w0[2] | 0x020000; + break; + + case 11: + w0[2] = w0[2] | 0x02000000; + break; + + case 12: + w0[3] = 0x02; + break; + + case 13: + w0[3] = w0[3] | 0x0200; + break; + + case 14: + w0[3] = w0[3] | 0x020000; + break; + + case 15: + w0[3] = w0[3] | 0x02000000; + break; + + case 16: + w1[0] = 0x02; + break; + + case 17: + w1[0] = w1[0] | 0x0200; + break; + + case 18: + w1[0] = w1[0] | 0x020000; + break; + + case 19: + w1[0] = w1[0] | 0x02000000; + break; + + case 20: + w1[1] = 0x02; + break; + + case 21: + w1[1] = w1[1] | 0x0200; + break; + + case 22: + w1[1] = w1[1] | 0x020000; + break; + + case 23: + w1[1] = w1[1] | 0x02000000; + break; + + case 24: + w1[2] = 0x02; + break; + + case 25: + w1[2] = w1[2] | 0x0200; + break; + + case 26: + w1[2] = w1[2] | 0x020000; + break; + + case 27: + w1[2] = w1[2] | 0x02000000; + break; + + case 28: + w1[3] = 0x02; + break; + + case 29: + w1[3] = w1[3] | 0x0200; + break; + + case 30: + w1[3] = w1[3] | 0x020000; + break; + + case 31: + w1[3] = w1[3] | 0x02000000; + break; + + case 32: + w2[0] = 0x02; + break; + + case 33: + w2[0] = w2[0] | 0x0200; + break; + + case 34: + w2[0] = w2[0] | 0x020000; + break; + + case 35: + w2[0] = w2[0] | 0x02000000; + break; + + case 36: + w2[1] = 0x02; + break; + + case 37: + w2[1] = w2[1] | 0x0200; + break; + + case 38: + w2[1] = w2[1] | 0x020000; + break; + + case 39: + w2[1] = w2[1] | 0x02000000; + break; + + case 40: + w2[2] = 0x02; + break; + + case 41: + w2[2] = w2[2] | 0x0200; + break; + + case 42: + w2[2] = w2[2] | 0x020000; + break; + + case 43: + w2[2] = w2[2] | 0x02000000; + break; + + case 44: + w2[3] = 0x02; + break; + + case 45: + w2[3] = w2[3] | 0x0200; + break; + + case 46: + w2[3] = w2[3] | 0x020000; + break; + + case 47: + w2[3] = w2[3] | 0x02000000; + break; + + case 48: + w3[0] = 0x02; + break; + + case 49: + w3[0] = w3[0] | 0x0200; + break; + + case 50: + w3[0] = w3[0] | 0x020000; + break; + + case 51: + w3[0] = w3[0] | 0x02000000; + break; + + case 52: + w3[1] = 0x02; + break; + + case 53: + w3[1] = w3[1] | 0x0200; + break; + + case 54: + w3[1] = w3[1] | 0x020000; + break; + + case 55: + w3[1] = w3[1] | 0x02000000; + break; + + case 56: + w3[2] = 0x02; + break; + + case 57: + w3[2] = w3[2] | 0x0200; + break; + + case 58: + w3[2] = w3[2] | 0x020000; + break; + + case 59: + w3[2] = w3[2] | 0x02000000; + break; + + case 60: + w3[3] = 0x02; + break; + + case 61: + w3[3] = w3[3] | 0x0200; + break; + + case 62: + w3[3] = w3[3] | 0x020000; + break; + + case 63: + w3[3] = w3[3] | 0x02000000; + break; + + case 64: + w4[0] = 0x02; + break; + + case 65: + w4[0] = w4[0] | 0x0200; + break; + + case 66: + w4[0] = w4[0] | 0x020000; + break; + + case 67: + w4[0] = w4[0] | 0x02000000; + break; + + case 68: + w4[1] = 0x02; + break; + + case 69: + w4[1] = w4[1] | 0x0200; + break; + + case 70: + w4[1] = w4[1] | 0x020000; + break; + + case 71: + w4[1] = w4[1] | 0x02000000; + break; + + case 72: + w4[2] = 0x02; + break; + + case 73: + w4[2] = w4[2] | 0x0200; + break; + + case 74: + w4[2] = w4[2] | 0x020000; + break; + + case 75: + w4[2] = w4[2] | 0x02000000; + break; + + case 76: + w4[3] = 0x02; + break; + + case 77: + w4[3] = w4[3] | 0x0200; + break; + + case 78: + w4[3] = w4[3] | 0x020000; + break; + + case 79: + w4[3] = w4[3] | 0x02000000; + break; + + case 80: + w5[0] = 0x02; + break; + + case 81: + w5[0] = w5[0] | 0x0200; + break; + + case 82: + w5[0] = w5[0] | 0x020000; + break; + + case 83: + w5[0] = w5[0] | 0x02000000; + break; + + case 84: + w5[1] = 0x02; + break; + + case 85: + w5[1] = w5[1] | 0x0200; + break; + + case 86: + w5[1] = w5[1] | 0x020000; + break; + + case 87: + w5[1] = w5[1] | 0x02000000; + break; + + case 88: + w5[2] = 0x02; + break; + + case 89: + w5[2] = w5[2] | 0x0200; + break; + + case 90: + w5[2] = w5[2] | 0x020000; + break; + + case 91: + w5[2] = w5[2] | 0x02000000; + break; + + case 92: + w5[3] = 0x02; + break; + + case 93: + w5[3] = w5[3] | 0x0200; + break; + + case 94: + w5[3] = w5[3] | 0x020000; + break; + + case 95: + w5[3] = w5[3] | 0x02000000; + break; + + case 96: + w6[0] = 0x02; + break; + + case 97: + w6[0] = w6[0] | 0x0200; + break; + + case 98: + w6[0] = w6[0] | 0x020000; + break; + + case 99: + w6[0] = w6[0] | 0x02000000; + break; + + case 100: + w6[1] = 0x02; + break; + + case 101: + w6[1] = w6[1] | 0x0200; + break; + + case 102: + w6[1] = w6[1] | 0x020000; + break; + + case 103: + w6[1] = w6[1] | 0x02000000; + break; + + case 104: + w6[2] = 0x02; + break; + + case 105: + w6[2] = w6[2] | 0x0200; + break; + + case 106: + w6[2] = w6[2] | 0x020000; + break; + + case 107: + w6[2] = w6[2] | 0x02000000; + break; + + case 108: + w6[3] = 0x02; + break; + + case 109: + w6[3] = w6[3] | 0x0200; + break; + + case 110: + w6[3] = w6[3] | 0x020000; + break; + + case 111: + w6[3] = w6[3] | 0x02000000; + break; + + case 112: + w7[0] = 0x02; + break; + + case 113: + w7[0] = w7[0] | 0x0200; + break; + + case 114: + w7[0] = w7[0] | 0x020000; + break; + + case 115: + w7[0] = w7[0] | 0x02000000; + break; + + case 116: + w7[1] = 0x02; + break; + + case 117: + w7[1] = w7[1] | 0x0200; + break; + + case 118: + w7[1] = w7[1] | 0x020000; + break; + + case 119: + w7[1] = w7[1] | 0x02000000; + break; + + case 120: + w7[2] = 0x02; + break; + + case 121: + w7[2] = w7[2] | 0x0200; + break; + + case 122: + w7[2] = w7[2] | 0x020000; + break; + + case 123: + w7[2] = w7[2] | 0x02000000; + break; + + case 124: + w7[3] = 0x02; + break; + + case 125: + w7[3] = w7[3] | 0x0200; + break; + + case 126: + w7[3] = w7[3] | 0x020000; + break; + + case 127: + w7[3] = w7[3] | 0x02000000; + break; + } +} + +static void append_0x80_1 (u32x w0[4], const u32 offset) +{ + switch (offset) + { + case 0: + w0[0] = 0x80; + break; + + case 1: + w0[0] = w0[0] | 0x8000; + break; + + case 2: + w0[0] = w0[0] | 0x800000; + break; + + case 3: + w0[0] = w0[0] | 0x80000000; + break; + + case 4: + w0[1] = 0x80; + break; + + case 5: + w0[1] = w0[1] | 0x8000; + break; + + case 6: + w0[1] = w0[1] | 0x800000; + break; + + case 7: + w0[1] = w0[1] | 0x80000000; + break; + + case 8: + w0[2] = 0x80; + break; + + case 9: + w0[2] = w0[2] | 0x8000; + break; + + case 10: + w0[2] = w0[2] | 0x800000; + break; + + case 11: + w0[2] = w0[2] | 0x80000000; + break; + + case 12: + w0[3] = 0x80; + break; + + case 13: + w0[3] = w0[3] | 0x8000; + break; + + case 14: + w0[3] = w0[3] | 0x800000; + break; + + case 15: + w0[3] = w0[3] | 0x80000000; + break; + } +} + +static void append_0x80_2 (u32x w0[4], u32x w1[4], const u32 offset) +{ + switch (offset) + { + case 0: + w0[0] = 0x80; + break; + + case 1: + w0[0] = w0[0] | 0x8000; + break; + + case 2: + w0[0] = w0[0] | 0x800000; + break; + + case 3: + w0[0] = w0[0] | 0x80000000; + break; + + case 4: + w0[1] = 0x80; + break; + + case 5: + w0[1] = w0[1] | 0x8000; + break; + + case 6: + w0[1] = w0[1] | 0x800000; + break; + + case 7: + w0[1] = w0[1] | 0x80000000; + break; + + case 8: + w0[2] = 0x80; + break; + + case 9: + w0[2] = w0[2] | 0x8000; + break; + + case 10: + w0[2] = w0[2] | 0x800000; + break; + + case 11: + w0[2] = w0[2] | 0x80000000; + break; + + case 12: + w0[3] = 0x80; + break; + + case 13: + w0[3] = w0[3] | 0x8000; + break; + + case 14: + w0[3] = w0[3] | 0x800000; + break; + + case 15: + w0[3] = w0[3] | 0x80000000; + break; + + case 16: + w1[0] = 0x80; + break; + + case 17: + w1[0] = w1[0] | 0x8000; + break; + + case 18: + w1[0] = w1[0] | 0x800000; + break; + + case 19: + w1[0] = w1[0] | 0x80000000; + break; + + case 20: + w1[1] = 0x80; + break; + + case 21: + w1[1] = w1[1] | 0x8000; + break; + + case 22: + w1[1] = w1[1] | 0x800000; + break; + + case 23: + w1[1] = w1[1] | 0x80000000; + break; + + case 24: + w1[2] = 0x80; + break; + + case 25: + w1[2] = w1[2] | 0x8000; + break; + + case 26: + w1[2] = w1[2] | 0x800000; + break; + + case 27: + w1[2] = w1[2] | 0x80000000; + break; + + case 28: + w1[3] = 0x80; + break; + + case 29: + w1[3] = w1[3] | 0x8000; + break; + + case 30: + w1[3] = w1[3] | 0x800000; + break; + + case 31: + w1[3] = w1[3] | 0x80000000; + break; + } +} + +static void append_0x80_2_be (u32x w0[4], u32x w1[4], const u32 offset) +{ + switch (offset) + { + case 0: + w0[0] |= 0x80000000; + break; + + case 1: + w0[0] |= 0x800000; + break; + + case 2: + w0[0] |= 0x8000; + break; + + case 3: + w0[0] |= 0x80; + break; + + case 4: + w0[1] |= 0x80000000; + break; + + case 5: + w0[1] |= 0x800000; + break; + + case 6: + w0[1] |= 0x8000; + break; + + case 7: + w0[1] |= 0x80; + break; + + case 8: + w0[2] |= 0x80000000; + break; + + case 9: + w0[2] |= 0x800000; + break; + + case 10: + w0[2] |= 0x8000; + break; + + case 11: + w0[2] |= 0x80; + break; + + case 12: + w0[3] |= 0x80000000; + break; + + case 13: + w0[3] |= 0x800000; + break; + + case 14: + w0[3] |= 0x8000; + break; + + case 15: + w0[3] |= 0x80; + break; + + case 16: + w1[0] |= 0x80000000; + break; + + case 17: + w1[0] |= 0x800000; + break; + + case 18: + w1[0] |= 0x8000; + break; + + case 19: + w1[0] |= 0x80; + break; + + case 20: + w1[1] |= 0x80000000; + break; + + case 21: + w1[1] |= 0x800000; + break; + + case 22: + w1[1] |= 0x8000; + break; + + case 23: + w1[1] |= 0x80; + break; + + case 24: + w1[2] |= 0x80000000; + break; + + case 25: + w1[2] |= 0x800000; + break; + + case 26: + w1[2] |= 0x8000; + break; + + case 27: + w1[2] |= 0x80; + break; + + case 28: + w1[3] |= 0x80000000; + break; + + case 29: + w1[3] |= 0x800000; + break; + + case 30: + w1[3] |= 0x8000; + break; + + case 31: + w1[3] |= 0x80; + break; + } +} + +static void append_0x80_3 (u32x w0[4], u32x w1[4], u32x w2[4], const u32 offset) +{ + switch (offset) + { + case 0: + w0[0] = 0x80; + break; + + case 1: + w0[0] = w0[0] | 0x8000; + break; + + case 2: + w0[0] = w0[0] | 0x800000; + break; + + case 3: + w0[0] = w0[0] | 0x80000000; + break; + + case 4: + w0[1] = 0x80; + break; + + case 5: + w0[1] = w0[1] | 0x8000; + break; + + case 6: + w0[1] = w0[1] | 0x800000; + break; + + case 7: + w0[1] = w0[1] | 0x80000000; + break; + + case 8: + w0[2] = 0x80; + break; + + case 9: + w0[2] = w0[2] | 0x8000; + break; + + case 10: + w0[2] = w0[2] | 0x800000; + break; + + case 11: + w0[2] = w0[2] | 0x80000000; + break; + + case 12: + w0[3] = 0x80; + break; + + case 13: + w0[3] = w0[3] | 0x8000; + break; + + case 14: + w0[3] = w0[3] | 0x800000; + break; + + case 15: + w0[3] = w0[3] | 0x80000000; + break; + + case 16: + w1[0] = 0x80; + break; + + case 17: + w1[0] = w1[0] | 0x8000; + break; + + case 18: + w1[0] = w1[0] | 0x800000; + break; + + case 19: + w1[0] = w1[0] | 0x80000000; + break; + + case 20: + w1[1] = 0x80; + break; + + case 21: + w1[1] = w1[1] | 0x8000; + break; + + case 22: + w1[1] = w1[1] | 0x800000; + break; + + case 23: + w1[1] = w1[1] | 0x80000000; + break; + + case 24: + w1[2] = 0x80; + break; + + case 25: + w1[2] = w1[2] | 0x8000; + break; + + case 26: + w1[2] = w1[2] | 0x800000; + break; + + case 27: + w1[2] = w1[2] | 0x80000000; + break; + + case 28: + w1[3] = 0x80; + break; + + case 29: + w1[3] = w1[3] | 0x8000; + break; + + case 30: + w1[3] = w1[3] | 0x800000; + break; + + case 31: + w1[3] = w1[3] | 0x80000000; + break; + + case 32: + w2[0] = 0x80; + break; + + case 33: + w2[0] = w2[0] | 0x8000; + break; + + case 34: + w2[0] = w2[0] | 0x800000; + break; + + case 35: + w2[0] = w2[0] | 0x80000000; + break; + + case 36: + w2[1] = 0x80; + break; + + case 37: + w2[1] = w2[1] | 0x8000; + break; + + case 38: + w2[1] = w2[1] | 0x800000; + break; + + case 39: + w2[1] = w2[1] | 0x80000000; + break; + + case 40: + w2[2] = 0x80; + break; + + case 41: + w2[2] = w2[2] | 0x8000; + break; + + case 42: + w2[2] = w2[2] | 0x800000; + break; + + case 43: + w2[2] = w2[2] | 0x80000000; + break; + + case 44: + w2[3] = 0x80; + break; + + case 45: + w2[3] = w2[3] | 0x8000; + break; + + case 46: + w2[3] = w2[3] | 0x800000; + break; + + case 47: + w2[3] = w2[3] | 0x80000000; + break; + } +} + +static void append_0x80_4 (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], const u32 offset) +{ + switch (offset) + { + case 0: + w0[0] = 0x80; + break; + + case 1: + w0[0] = w0[0] | 0x8000; + break; + + case 2: + w0[0] = w0[0] | 0x800000; + break; + + case 3: + w0[0] = w0[0] | 0x80000000; + break; + + case 4: + w0[1] = 0x80; + break; + + case 5: + w0[1] = w0[1] | 0x8000; + break; + + case 6: + w0[1] = w0[1] | 0x800000; + break; + + case 7: + w0[1] = w0[1] | 0x80000000; + break; + + case 8: + w0[2] = 0x80; + break; + + case 9: + w0[2] = w0[2] | 0x8000; + break; + + case 10: + w0[2] = w0[2] | 0x800000; + break; + + case 11: + w0[2] = w0[2] | 0x80000000; + break; + + case 12: + w0[3] = 0x80; + break; + + case 13: + w0[3] = w0[3] | 0x8000; + break; + + case 14: + w0[3] = w0[3] | 0x800000; + break; + + case 15: + w0[3] = w0[3] | 0x80000000; + break; + + case 16: + w1[0] = 0x80; + break; + + case 17: + w1[0] = w1[0] | 0x8000; + break; + + case 18: + w1[0] = w1[0] | 0x800000; + break; + + case 19: + w1[0] = w1[0] | 0x80000000; + break; + + case 20: + w1[1] = 0x80; + break; + + case 21: + w1[1] = w1[1] | 0x8000; + break; + + case 22: + w1[1] = w1[1] | 0x800000; + break; + + case 23: + w1[1] = w1[1] | 0x80000000; + break; + + case 24: + w1[2] = 0x80; + break; + + case 25: + w1[2] = w1[2] | 0x8000; + break; + + case 26: + w1[2] = w1[2] | 0x800000; + break; + + case 27: + w1[2] = w1[2] | 0x80000000; + break; + + case 28: + w1[3] = 0x80; + break; + + case 29: + w1[3] = w1[3] | 0x8000; + break; + + case 30: + w1[3] = w1[3] | 0x800000; + break; + + case 31: + w1[3] = w1[3] | 0x80000000; + break; + + case 32: + w2[0] = 0x80; + break; + + case 33: + w2[0] = w2[0] | 0x8000; + break; + + case 34: + w2[0] = w2[0] | 0x800000; + break; + + case 35: + w2[0] = w2[0] | 0x80000000; + break; + + case 36: + w2[1] = 0x80; + break; + + case 37: + w2[1] = w2[1] | 0x8000; + break; + + case 38: + w2[1] = w2[1] | 0x800000; + break; + + case 39: + w2[1] = w2[1] | 0x80000000; + break; + + case 40: + w2[2] = 0x80; + break; + + case 41: + w2[2] = w2[2] | 0x8000; + break; + + case 42: + w2[2] = w2[2] | 0x800000; + break; + + case 43: + w2[2] = w2[2] | 0x80000000; + break; + + case 44: + w2[3] = 0x80; + break; + + case 45: + w2[3] = w2[3] | 0x8000; + break; + + case 46: + w2[3] = w2[3] | 0x800000; + break; + + case 47: + w2[3] = w2[3] | 0x80000000; + break; + + case 48: + w3[0] = 0x80; + break; + + case 49: + w3[0] = w3[0] | 0x8000; + break; + + case 50: + w3[0] = w3[0] | 0x800000; + break; + + case 51: + w3[0] = w3[0] | 0x80000000; + break; + + case 52: + w3[1] = 0x80; + break; + + case 53: + w3[1] = w3[1] | 0x8000; + break; + + case 54: + w3[1] = w3[1] | 0x800000; + break; + + case 55: + w3[1] = w3[1] | 0x80000000; + break; + + case 56: + w3[2] = 0x80; + break; + + case 57: + w3[2] = w3[2] | 0x8000; + break; + + case 58: + w3[2] = w3[2] | 0x800000; + break; + + case 59: + w3[2] = w3[2] | 0x80000000; + break; + + case 60: + w3[3] = 0x80; + break; + + case 61: + w3[3] = w3[3] | 0x8000; + break; + + case 62: + w3[3] = w3[3] | 0x800000; + break; + + case 63: + w3[3] = w3[3] | 0x80000000; + break; + } +} + +static void append_0x80_8 (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], u32x w4[4], u32x w5[4], u32x w6[4], u32x w7[4], const u32 offset) +{ + switch (offset) + { + case 0: + w0[0] = 0x80; + break; + + case 1: + w0[0] = w0[0] | 0x8000; + break; + + case 2: + w0[0] = w0[0] | 0x800000; + break; + + case 3: + w0[0] = w0[0] | 0x80000000; + break; + + case 4: + w0[1] = 0x80; + break; + + case 5: + w0[1] = w0[1] | 0x8000; + break; + + case 6: + w0[1] = w0[1] | 0x800000; + break; + + case 7: + w0[1] = w0[1] | 0x80000000; + break; + + case 8: + w0[2] = 0x80; + break; + + case 9: + w0[2] = w0[2] | 0x8000; + break; + + case 10: + w0[2] = w0[2] | 0x800000; + break; + + case 11: + w0[2] = w0[2] | 0x80000000; + break; + + case 12: + w0[3] = 0x80; + break; + + case 13: + w0[3] = w0[3] | 0x8000; + break; + + case 14: + w0[3] = w0[3] | 0x800000; + break; + + case 15: + w0[3] = w0[3] | 0x80000000; + break; + + case 16: + w1[0] = 0x80; + break; + + case 17: + w1[0] = w1[0] | 0x8000; + break; + + case 18: + w1[0] = w1[0] | 0x800000; + break; + + case 19: + w1[0] = w1[0] | 0x80000000; + break; + + case 20: + w1[1] = 0x80; + break; + + case 21: + w1[1] = w1[1] | 0x8000; + break; + + case 22: + w1[1] = w1[1] | 0x800000; + break; + + case 23: + w1[1] = w1[1] | 0x80000000; + break; + + case 24: + w1[2] = 0x80; + break; + + case 25: + w1[2] = w1[2] | 0x8000; + break; + + case 26: + w1[2] = w1[2] | 0x800000; + break; + + case 27: + w1[2] = w1[2] | 0x80000000; + break; + + case 28: + w1[3] = 0x80; + break; + + case 29: + w1[3] = w1[3] | 0x8000; + break; + + case 30: + w1[3] = w1[3] | 0x800000; + break; + + case 31: + w1[3] = w1[3] | 0x80000000; + break; + + case 32: + w2[0] = 0x80; + break; + + case 33: + w2[0] = w2[0] | 0x8000; + break; + + case 34: + w2[0] = w2[0] | 0x800000; + break; + + case 35: + w2[0] = w2[0] | 0x80000000; + break; + + case 36: + w2[1] = 0x80; + break; + + case 37: + w2[1] = w2[1] | 0x8000; + break; + + case 38: + w2[1] = w2[1] | 0x800000; + break; + + case 39: + w2[1] = w2[1] | 0x80000000; + break; + + case 40: + w2[2] = 0x80; + break; + + case 41: + w2[2] = w2[2] | 0x8000; + break; + + case 42: + w2[2] = w2[2] | 0x800000; + break; + + case 43: + w2[2] = w2[2] | 0x80000000; + break; + + case 44: + w2[3] = 0x80; + break; + + case 45: + w2[3] = w2[3] | 0x8000; + break; + + case 46: + w2[3] = w2[3] | 0x800000; + break; + + case 47: + w2[3] = w2[3] | 0x80000000; + break; + + case 48: + w3[0] = 0x80; + break; + + case 49: + w3[0] = w3[0] | 0x8000; + break; + + case 50: + w3[0] = w3[0] | 0x800000; + break; + + case 51: + w3[0] = w3[0] | 0x80000000; + break; + + case 52: + w3[1] = 0x80; + break; + + case 53: + w3[1] = w3[1] | 0x8000; + break; + + case 54: + w3[1] = w3[1] | 0x800000; + break; + + case 55: + w3[1] = w3[1] | 0x80000000; + break; + + case 56: + w3[2] = 0x80; + break; + + case 57: + w3[2] = w3[2] | 0x8000; + break; + + case 58: + w3[2] = w3[2] | 0x800000; + break; + + case 59: + w3[2] = w3[2] | 0x80000000; + break; + + case 60: + w3[3] = 0x80; + break; + + case 61: + w3[3] = w3[3] | 0x8000; + break; + + case 62: + w3[3] = w3[3] | 0x800000; + break; + + case 63: + w3[3] = w3[3] | 0x80000000; + break; + + case 64: + w4[0] = 0x80; + break; + + case 65: + w4[0] = w4[0] | 0x8000; + break; + + case 66: + w4[0] = w4[0] | 0x800000; + break; + + case 67: + w4[0] = w4[0] | 0x80000000; + break; + + case 68: + w4[1] = 0x80; + break; + + case 69: + w4[1] = w4[1] | 0x8000; + break; + + case 70: + w4[1] = w4[1] | 0x800000; + break; + + case 71: + w4[1] = w4[1] | 0x80000000; + break; + + case 72: + w4[2] = 0x80; + break; + + case 73: + w4[2] = w4[2] | 0x8000; + break; + + case 74: + w4[2] = w4[2] | 0x800000; + break; + + case 75: + w4[2] = w4[2] | 0x80000000; + break; + + case 76: + w4[3] = 0x80; + break; + + case 77: + w4[3] = w4[3] | 0x8000; + break; + + case 78: + w4[3] = w4[3] | 0x800000; + break; + + case 79: + w4[3] = w4[3] | 0x80000000; + break; + + case 80: + w5[0] = 0x80; + break; + + case 81: + w5[0] = w5[0] | 0x8000; + break; + + case 82: + w5[0] = w5[0] | 0x800000; + break; + + case 83: + w5[0] = w5[0] | 0x80000000; + break; + + case 84: + w5[1] = 0x80; + break; + + case 85: + w5[1] = w5[1] | 0x8000; + break; + + case 86: + w5[1] = w5[1] | 0x800000; + break; + + case 87: + w5[1] = w5[1] | 0x80000000; + break; + + case 88: + w5[2] = 0x80; + break; + + case 89: + w5[2] = w5[2] | 0x8000; + break; + + case 90: + w5[2] = w5[2] | 0x800000; + break; + + case 91: + w5[2] = w5[2] | 0x80000000; + break; + + case 92: + w5[3] = 0x80; + break; + + case 93: + w5[3] = w5[3] | 0x8000; + break; + + case 94: + w5[3] = w5[3] | 0x800000; + break; + + case 95: + w5[3] = w5[3] | 0x80000000; + break; + + case 96: + w6[0] = 0x80; + break; + + case 97: + w6[0] = w6[0] | 0x8000; + break; + + case 98: + w6[0] = w6[0] | 0x800000; + break; + + case 99: + w6[0] = w6[0] | 0x80000000; + break; + + case 100: + w6[1] = 0x80; + break; + + case 101: + w6[1] = w6[1] | 0x8000; + break; + + case 102: + w6[1] = w6[1] | 0x800000; + break; + + case 103: + w6[1] = w6[1] | 0x80000000; + break; + + case 104: + w6[2] = 0x80; + break; + + case 105: + w6[2] = w6[2] | 0x8000; + break; + + case 106: + w6[2] = w6[2] | 0x800000; + break; + + case 107: + w6[2] = w6[2] | 0x80000000; + break; + + case 108: + w6[3] = 0x80; + break; + + case 109: + w6[3] = w6[3] | 0x8000; + break; + + case 110: + w6[3] = w6[3] | 0x800000; + break; + + case 111: + w6[3] = w6[3] | 0x80000000; + break; + + case 112: + w7[0] = 0x80; + break; + + case 113: + w7[0] = w7[0] | 0x8000; + break; + + case 114: + w7[0] = w7[0] | 0x800000; + break; + + case 115: + w7[0] = w7[0] | 0x80000000; + break; + + case 116: + w7[1] = 0x80; + break; + + case 117: + w7[1] = w7[1] | 0x8000; + break; + + case 118: + w7[1] = w7[1] | 0x800000; + break; + + case 119: + w7[1] = w7[1] | 0x80000000; + break; + + case 120: + w7[2] = 0x80; + break; + + case 121: + w7[2] = w7[2] | 0x8000; + break; + + case 122: + w7[2] = w7[2] | 0x800000; + break; + + case 123: + w7[2] = w7[2] | 0x80000000; + break; + + case 124: + w7[3] = 0x80; + break; + + case 125: + w7[3] = w7[3] | 0x8000; + break; + + case 126: + w7[3] = w7[3] | 0x800000; + break; + + case 127: + w7[3] = w7[3] | 0x80000000; + break; + } +} + +static void append_0x80_4 (u32x w[16], const u32 offset) +{ + switch (offset) + { + case 0: + w[ 0] = 0x80; + break; + + case 1: + w[ 0] = w[ 0] | 0x8000; + break; + + case 2: + w[ 0] = w[ 0] | 0x800000; + break; + + case 3: + w[ 0] = w[ 0] | 0x80000000; + break; + + case 4: + w[ 1] = 0x80; + break; + + case 5: + w[ 1] = w[ 1] | 0x8000; + break; + + case 6: + w[ 1] = w[ 1] | 0x800000; + break; + + case 7: + w[ 1] = w[ 1] | 0x80000000; + break; + + case 8: + w[ 2] = 0x80; + break; + + case 9: + w[ 2] = w[ 2] | 0x8000; + break; + + case 10: + w[ 2] = w[ 2] | 0x800000; + break; + + case 11: + w[ 2] = w[ 2] | 0x80000000; + break; + + case 12: + w[ 3] = 0x80; + break; + + case 13: + w[ 3] = w[ 3] | 0x8000; + break; + + case 14: + w[ 3] = w[ 3] | 0x800000; + break; + + case 15: + w[ 3] = w[ 3] | 0x80000000; + break; + + case 16: + w[ 4] = 0x80; + break; + + case 17: + w[ 4] = w[ 4] | 0x8000; + break; + + case 18: + w[ 4] = w[ 4] | 0x800000; + break; + + case 19: + w[ 4] = w[ 4] | 0x80000000; + break; + + case 20: + w[ 5] = 0x80; + break; + + case 21: + w[ 5] = w[ 5] | 0x8000; + break; + + case 22: + w[ 5] = w[ 5] | 0x800000; + break; + + case 23: + w[ 5] = w[ 5] | 0x80000000; + break; + + case 24: + w[ 6] = 0x80; + break; + + case 25: + w[ 6] = w[ 6] | 0x8000; + break; + + case 26: + w[ 6] = w[ 6] | 0x800000; + break; + + case 27: + w[ 6] = w[ 6] | 0x80000000; + break; + + case 28: + w[ 7] = 0x80; + break; + + case 29: + w[ 7] = w[ 7] | 0x8000; + break; + + case 30: + w[ 7] = w[ 7] | 0x800000; + break; + + case 31: + w[ 7] = w[ 7] | 0x80000000; + break; + + case 32: + w[ 8] = 0x80; + break; + + case 33: + w[ 8] = w[ 8] | 0x8000; + break; + + case 34: + w[ 8] = w[ 8] | 0x800000; + break; + + case 35: + w[ 8] = w[ 8] | 0x80000000; + break; + + case 36: + w[ 9] = 0x80; + break; + + case 37: + w[ 9] = w[ 9] | 0x8000; + break; + + case 38: + w[ 9] = w[ 9] | 0x800000; + break; + + case 39: + w[ 9] = w[ 9] | 0x80000000; + break; + + case 40: + w[10] = 0x80; + break; + + case 41: + w[10] = w[10] | 0x8000; + break; + + case 42: + w[10] = w[10] | 0x800000; + break; + + case 43: + w[10] = w[10] | 0x80000000; + break; + + case 44: + w[11] = 0x80; + break; + + case 45: + w[11] = w[11] | 0x8000; + break; + + case 46: + w[11] = w[11] | 0x800000; + break; + + case 47: + w[11] = w[11] | 0x80000000; + break; + + case 48: + w[12] = 0x80; + break; + + case 49: + w[12] = w[12] | 0x8000; + break; + + case 50: + w[12] = w[12] | 0x800000; + break; + + case 51: + w[12] = w[12] | 0x80000000; + break; + + case 52: + w[13] = 0x80; + break; + + case 53: + w[13] = w[13] | 0x8000; + break; + + case 54: + w[13] = w[13] | 0x800000; + break; + + case 55: + w[13] = w[13] | 0x80000000; + break; + + case 56: + w[14] = 0x80; + break; + + case 57: + w[14] = w[14] | 0x8000; + break; + + case 58: + w[14] = w[14] | 0x800000; + break; + + case 59: + w[14] = w[14] | 0x80000000; + break; + + case 60: + w[15] = 0x80; + break; + + case 61: + w[15] = w[15] | 0x8000; + break; + + case 62: + w[15] = w[15] | 0x800000; + break; + + case 63: + w[15] = w[15] | 0x80000000; + break; + } +} + +static void device_memcat2L (const u32 offset, u32x dst0[2], u32x src_l0[2], u32 src_r0[2]) +{ + switch (offset) + { + case 1: + dst0[0] = src_l0[0] | src_r0[0] << 8; + dst0[1] = src_r0[0] >> 24 | src_r0[1] << 8; + break; + + case 2: + dst0[0] = src_l0[0] | src_r0[0] << 16; + dst0[1] = src_r0[0] >> 16 | src_r0[1] << 16; + break; + + case 3: + dst0[0] = src_l0[0] | src_r0[0] << 24; + dst0[1] = src_r0[0] >> 8 | src_r0[1] << 24; + break; + + case 4: + dst0[1] = src_r0[0]; + break; + + case 5: + dst0[1] = src_l0[1] | src_r0[0] << 8; + break; + + case 6: + dst0[1] = src_l0[1] | src_r0[0] << 16; + break; + + case 7: + dst0[1] = src_l0[1] | src_r0[0] << 24; + break; + } +} + +static void device_memcat2L (const u32 offset, u32x dst0[2], u32x src_l0[2], u32x src_r0[2]) +{ + switch (offset) + { + case 1: + dst0[0] = src_l0[0] | src_r0[0] << 8; + dst0[1] = src_r0[0] >> 24 | src_r0[1] << 8; + break; + + case 2: + dst0[0] = src_l0[0] | src_r0[0] << 16; + dst0[1] = src_r0[0] >> 16 | src_r0[1] << 16; + break; + + case 3: + dst0[0] = src_l0[0] | src_r0[0] << 24; + dst0[1] = src_r0[0] >> 8 | src_r0[1] << 24; + break; + + case 4: + dst0[1] = src_r0[0]; + break; + + case 5: + dst0[1] = src_l0[1] | src_r0[0] << 8; + break; + + case 6: + dst0[1] = src_l0[1] | src_r0[0] << 16; + break; + + case 7: + dst0[1] = src_l0[1] | src_r0[0] << 24; + break; + } +} + +static void device_memcat4L (const u32 offset, u32x dst0[4], u32x src_l0[4], u32 src_r0[4]) +{ + switch (offset) + { + case 1: + dst0[0] = src_l0[0] | src_r0[0] << 8; + dst0[1] = src_r0[0] >> 24 | src_r0[1] << 8; + dst0[2] = src_r0[1] >> 24 | src_r0[2] << 8; + dst0[3] = src_r0[2] >> 24 | src_r0[3] << 8; + break; + + case 2: + dst0[0] = src_l0[0] | src_r0[0] << 16; + dst0[1] = src_r0[0] >> 16 | src_r0[1] << 16; + dst0[2] = src_r0[1] >> 16 | src_r0[2] << 16; + dst0[3] = src_r0[2] >> 16 | src_r0[3] << 16; + break; + + case 3: + dst0[0] = src_l0[0] | src_r0[0] << 24; + dst0[1] = src_r0[0] >> 8 | src_r0[1] << 24; + dst0[2] = src_r0[1] >> 8 | src_r0[2] << 24; + dst0[3] = src_r0[2] >> 8 | src_r0[3] << 24; + break; + + case 4: + dst0[1] = src_r0[0]; + dst0[2] = src_r0[1]; + dst0[3] = src_r0[2]; + break; + + case 5: + dst0[1] = src_l0[1] | src_r0[0] << 8; + dst0[2] = src_r0[0] >> 24 | src_r0[1] << 8; + dst0[3] = src_r0[1] >> 24 | src_r0[2] << 8; + break; + + case 6: + dst0[1] = src_l0[1] | src_r0[0] << 16; + dst0[2] = src_r0[0] >> 16 | src_r0[1] << 16; + dst0[3] = src_r0[1] >> 16 | src_r0[2] << 16; + break; + + case 7: + dst0[1] = src_l0[1] | src_r0[0] << 24; + dst0[2] = src_r0[0] >> 8 | src_r0[1] << 24; + dst0[3] = src_r0[1] >> 8 | src_r0[2] << 24; + break; + + case 8: + dst0[2] = src_r0[0]; + dst0[3] = src_r0[1]; + break; + + case 9: + dst0[2] = src_l0[2] | src_r0[0] << 8; + dst0[3] = src_r0[0] >> 24 | src_r0[1] << 8; + break; + + case 10: + dst0[2] = src_l0[2] | src_r0[0] << 16; + dst0[3] = src_r0[0] >> 16 | src_r0[1] << 16; + break; + + case 11: + dst0[2] = src_l0[2] | src_r0[0] << 24; + dst0[3] = src_r0[0] >> 8 | src_r0[1] << 24; + break; + + case 12: + dst0[3] = src_r0[0]; + break; + + case 13: + dst0[3] = src_l0[3] | src_r0[0] << 8; + break; + + case 14: + dst0[3] = src_l0[3] | src_r0[0] << 16; + break; + + case 15: + dst0[3] = src_l0[3] | src_r0[0] << 24; + break; + } +} + +static void device_memcat4L (const u32 offset, u32x dst0[4], u32x src_l0[4], u32x src_r0[4]) +{ + switch (offset) + { + case 1: + dst0[0] = src_l0[0] | src_r0[0] << 8; + dst0[1] = src_r0[0] >> 24 | src_r0[1] << 8; + dst0[2] = src_r0[1] >> 24 | src_r0[2] << 8; + dst0[3] = src_r0[2] >> 24 | src_r0[3] << 8; + break; + + case 2: + dst0[0] = src_l0[0] | src_r0[0] << 16; + dst0[1] = src_r0[0] >> 16 | src_r0[1] << 16; + dst0[2] = src_r0[1] >> 16 | src_r0[2] << 16; + dst0[3] = src_r0[2] >> 16 | src_r0[3] << 16; + break; + + case 3: + dst0[0] = src_l0[0] | src_r0[0] << 24; + dst0[1] = src_r0[0] >> 8 | src_r0[1] << 24; + dst0[2] = src_r0[1] >> 8 | src_r0[2] << 24; + dst0[3] = src_r0[2] >> 8 | src_r0[3] << 24; + break; + + case 4: + dst0[1] = src_r0[0]; + dst0[2] = src_r0[1]; + dst0[3] = src_r0[2]; + break; + + case 5: + dst0[1] = src_l0[1] | src_r0[0] << 8; + dst0[2] = src_r0[0] >> 24 | src_r0[1] << 8; + dst0[3] = src_r0[1] >> 24 | src_r0[2] << 8; + break; + + case 6: + dst0[1] = src_l0[1] | src_r0[0] << 16; + dst0[2] = src_r0[0] >> 16 | src_r0[1] << 16; + dst0[3] = src_r0[1] >> 16 | src_r0[2] << 16; + break; + + case 7: + dst0[1] = src_l0[1] | src_r0[0] << 24; + dst0[2] = src_r0[0] >> 8 | src_r0[1] << 24; + dst0[3] = src_r0[1] >> 8 | src_r0[2] << 24; + break; + + case 8: + dst0[2] = src_r0[0]; + dst0[3] = src_r0[1]; + break; + + case 9: + dst0[2] = src_l0[2] | src_r0[0] << 8; + dst0[3] = src_r0[0] >> 24 | src_r0[1] << 8; + break; + + case 10: + dst0[2] = src_l0[2] | src_r0[0] << 16; + dst0[3] = src_r0[0] >> 16 | src_r0[1] << 16; + break; + + case 11: + dst0[2] = src_l0[2] | src_r0[0] << 24; + dst0[3] = src_r0[0] >> 8 | src_r0[1] << 24; + break; + + case 12: + dst0[3] = src_r0[0]; + break; + + case 13: + dst0[3] = src_l0[3] | src_r0[0] << 8; + break; + + case 14: + dst0[3] = src_l0[3] | src_r0[0] << 16; + break; + + case 15: + dst0[3] = src_l0[3] | src_r0[0] << 24; + break; + } +} + +static void device_memcat8L (const u32 offset, u32x dst0[4], u32x dst1[4], u32x src_l0[4], u32x src_l1[4], u32 src_r0[4]) +{ + switch (offset) + { + case 1: + dst0[0] = src_l0[0] | src_r0[0] << 8; + dst0[1] = src_r0[0] >> 24 | src_r0[1] << 8; + dst0[2] = src_r0[1] >> 24 | src_r0[2] << 8; + dst0[3] = src_r0[2] >> 24 | src_r0[3] << 8; + dst1[0] = src_r0[3] >> 24; + break; + + case 2: + dst0[0] = src_l0[0] | src_r0[0] << 16; + dst0[1] = src_r0[0] >> 16 | src_r0[1] << 16; + dst0[2] = src_r0[1] >> 16 | src_r0[2] << 16; + dst0[3] = src_r0[2] >> 16 | src_r0[3] << 16; + dst1[0] = src_r0[3] >> 16; + break; + + case 3: + dst0[0] = src_l0[0] | src_r0[0] << 24; + dst0[1] = src_r0[0] >> 8 | src_r0[1] << 24; + dst0[2] = src_r0[1] >> 8 | src_r0[2] << 24; + dst0[3] = src_r0[2] >> 8 | src_r0[3] << 24; + dst1[0] = src_r0[3] >> 8; + break; + + case 4: + dst0[1] = src_r0[0]; + dst0[2] = src_r0[1]; + dst0[3] = src_r0[2]; + dst1[0] = src_r0[3]; + break; + + case 5: + dst0[1] = src_l0[1] | src_r0[0] << 8; + dst0[2] = src_r0[0] >> 24 | src_r0[1] << 8; + dst0[3] = src_r0[1] >> 24 | src_r0[2] << 8; + dst1[0] = src_r0[2] >> 24 | src_r0[3] << 8; + dst1[1] = src_r0[3] >> 24; + break; + + case 6: + dst0[1] = src_l0[1] | src_r0[0] << 16; + dst0[2] = src_r0[0] >> 16 | src_r0[1] << 16; + dst0[3] = src_r0[1] >> 16 | src_r0[2] << 16; + dst1[0] = src_r0[2] >> 16 | src_r0[3] << 16; + dst1[1] = src_r0[3] >> 16; + break; + + case 7: + dst0[1] = src_l0[1] | src_r0[0] << 24; + dst0[2] = src_r0[0] >> 8 | src_r0[1] << 24; + dst0[3] = src_r0[1] >> 8 | src_r0[2] << 24; + dst1[0] = src_r0[2] >> 8 | src_r0[3] << 24; + dst1[1] = src_r0[3] >> 8; + break; + + case 8: + dst0[2] = src_r0[0]; + dst0[3] = src_r0[1]; + dst1[0] = src_r0[2]; + dst1[1] = src_r0[3]; + break; + + case 9: + dst0[2] = src_l0[2] | src_r0[0] << 8; + dst0[3] = src_r0[0] >> 24 | src_r0[1] << 8; + dst1[0] = src_r0[1] >> 24 | src_r0[2] << 8; + dst1[1] = src_r0[2] >> 24 | src_r0[3] << 8; + dst1[2] = src_r0[3] >> 24; + break; + + case 10: + dst0[2] = src_l0[2] | src_r0[0] << 16; + dst0[3] = src_r0[0] >> 16 | src_r0[1] << 16; + dst1[0] = src_r0[1] >> 16 | src_r0[2] << 16; + dst1[1] = src_r0[2] >> 16 | src_r0[3] << 16; + dst1[2] = src_r0[3] >> 16; + break; + + case 11: + dst0[2] = src_l0[2] | src_r0[0] << 24; + dst0[3] = src_r0[0] >> 8 | src_r0[1] << 24; + dst1[0] = src_r0[1] >> 8 | src_r0[2] << 24; + dst1[1] = src_r0[2] >> 8 | src_r0[3] << 24; + dst1[2] = src_r0[3] >> 8; + break; + + case 12: + dst0[3] = src_r0[0]; + dst1[0] = src_r0[1]; + dst1[1] = src_r0[2]; + dst1[2] = src_r0[3]; + break; + + case 13: + dst0[3] = src_l0[3] | src_r0[0] << 8; + dst1[0] = src_r0[0] >> 24 | src_r0[1] << 8; + dst1[1] = src_r0[1] >> 24 | src_r0[2] << 8; + dst1[2] = src_r0[2] >> 24 | src_r0[3] << 8; + dst1[3] = src_r0[3] >> 24; + break; + + case 14: + dst0[3] = src_l0[3] | src_r0[0] << 16; + dst1[0] = src_r0[0] >> 16 | src_r0[1] << 16; + dst1[1] = src_r0[1] >> 16 | src_r0[2] << 16; + dst1[2] = src_r0[2] >> 16 | src_r0[3] << 16; + dst1[3] = src_r0[3] >> 16; + break; + + case 15: + dst0[3] = src_l0[3] | src_r0[0] << 24; + dst1[0] = src_r0[0] >> 8 | src_r0[1] << 24; + dst1[1] = src_r0[1] >> 8 | src_r0[2] << 24; + dst1[2] = src_r0[2] >> 8 | src_r0[3] << 24; + dst1[3] = src_r0[3] >> 8; + break; + + case 16: + dst1[0] = src_r0[0]; + dst1[1] = src_r0[1]; + dst1[2] = src_r0[2]; + dst1[3] = src_r0[3]; + break; + + case 17: + dst1[0] = src_l1[0] | src_r0[0] << 8; + dst1[1] = src_r0[0] >> 24 | src_r0[1] << 8; + dst1[2] = src_r0[1] >> 24 | src_r0[2] << 8; + dst1[3] = src_r0[2] >> 24 | src_r0[3] << 8; + break; + + case 18: + dst1[0] = src_l1[0] | src_r0[0] << 16; + dst1[1] = src_r0[0] >> 16 | src_r0[1] << 16; + dst1[2] = src_r0[1] >> 16 | src_r0[2] << 16; + dst1[3] = src_r0[2] >> 16 | src_r0[3] << 16; + break; + + case 19: + dst1[0] = src_l1[0] | src_r0[0] << 24; + dst1[1] = src_r0[0] >> 8 | src_r0[1] << 24; + dst1[2] = src_r0[1] >> 8 | src_r0[2] << 24; + dst1[3] = src_r0[2] >> 8 | src_r0[3] << 24; + break; + + case 20: + dst1[1] = src_r0[0]; + dst1[2] = src_r0[1]; + dst1[3] = src_r0[2]; + break; + + case 21: + dst1[1] = src_l1[1] | src_r0[0] << 8; + dst1[2] = src_r0[0] >> 24 | src_r0[1] << 8; + dst1[3] = src_r0[1] >> 24 | src_r0[2] << 8; + break; + + case 22: + dst1[1] = src_l1[1] | src_r0[0] << 16; + dst1[2] = src_r0[0] >> 16 | src_r0[1] << 16; + dst1[3] = src_r0[1] >> 16 | src_r0[2] << 16; + break; + + case 23: + dst1[1] = src_l1[1] | src_r0[0] << 24; + dst1[2] = src_r0[0] >> 8 | src_r0[1] << 24; + dst1[3] = src_r0[1] >> 8 | src_r0[2] << 24; + break; + + case 24: + dst1[2] = src_r0[0]; + dst1[3] = src_r0[1]; + break; + + case 25: + dst1[2] = src_l1[2] | src_r0[0] << 8; + dst1[3] = src_r0[0] >> 24 | src_r0[1] << 8; + break; + + case 26: + dst1[2] = src_l1[2] | src_r0[0] << 16; + dst1[3] = src_r0[0] >> 16 | src_r0[1] << 16; + break; + + case 27: + dst1[2] = src_l1[2] | src_r0[0] << 24; + dst1[3] = src_r0[0] >> 8 | src_r0[1] << 24; + break; + + case 28: + dst1[3] = src_r0[0]; + break; + + case 29: + dst1[3] = src_l1[3] | src_r0[0] << 8; + break; + + case 30: + dst1[3] = src_l1[3] | src_r0[0] << 16; + break; + + case 31: + dst1[3] = src_l1[3] | src_r0[0] << 24; + break; + } +} + +static void device_memcat8L (const u32 offset, u32x dst0[4], u32x dst1[4], u32x src_l0[4], u32x src_l1[4], u32x src_r0[4]) +{ + switch (offset) + { + case 1: + dst0[0] = src_l0[0] | src_r0[0] << 8; + dst0[1] = src_r0[0] >> 24 | src_r0[1] << 8; + dst0[2] = src_r0[1] >> 24 | src_r0[2] << 8; + dst0[3] = src_r0[2] >> 24 | src_r0[3] << 8; + dst1[0] = src_r0[3] >> 24; + break; + + case 2: + dst0[0] = src_l0[0] | src_r0[0] << 16; + dst0[1] = src_r0[0] >> 16 | src_r0[1] << 16; + dst0[2] = src_r0[1] >> 16 | src_r0[2] << 16; + dst0[3] = src_r0[2] >> 16 | src_r0[3] << 16; + dst1[0] = src_r0[3] >> 16; + break; + + case 3: + dst0[0] = src_l0[0] | src_r0[0] << 24; + dst0[1] = src_r0[0] >> 8 | src_r0[1] << 24; + dst0[2] = src_r0[1] >> 8 | src_r0[2] << 24; + dst0[3] = src_r0[2] >> 8 | src_r0[3] << 24; + dst1[0] = src_r0[3] >> 8; + break; + + case 4: + dst0[1] = src_r0[0]; + dst0[2] = src_r0[1]; + dst0[3] = src_r0[2]; + dst1[0] = src_r0[3]; + break; + + case 5: + dst0[1] = src_l0[1] | src_r0[0] << 8; + dst0[2] = src_r0[0] >> 24 | src_r0[1] << 8; + dst0[3] = src_r0[1] >> 24 | src_r0[2] << 8; + dst1[0] = src_r0[2] >> 24 | src_r0[3] << 8; + dst1[1] = src_r0[3] >> 24; + break; + + case 6: + dst0[1] = src_l0[1] | src_r0[0] << 16; + dst0[2] = src_r0[0] >> 16 | src_r0[1] << 16; + dst0[3] = src_r0[1] >> 16 | src_r0[2] << 16; + dst1[0] = src_r0[2] >> 16 | src_r0[3] << 16; + dst1[1] = src_r0[3] >> 16; + break; + + case 7: + dst0[1] = src_l0[1] | src_r0[0] << 24; + dst0[2] = src_r0[0] >> 8 | src_r0[1] << 24; + dst0[3] = src_r0[1] >> 8 | src_r0[2] << 24; + dst1[0] = src_r0[2] >> 8 | src_r0[3] << 24; + dst1[1] = src_r0[3] >> 8; + break; + + case 8: + dst0[2] = src_r0[0]; + dst0[3] = src_r0[1]; + dst1[0] = src_r0[2]; + dst1[1] = src_r0[3]; + break; + + case 9: + dst0[2] = src_l0[2] | src_r0[0] << 8; + dst0[3] = src_r0[0] >> 24 | src_r0[1] << 8; + dst1[0] = src_r0[1] >> 24 | src_r0[2] << 8; + dst1[1] = src_r0[2] >> 24 | src_r0[3] << 8; + dst1[2] = src_r0[3] >> 24; + break; + + case 10: + dst0[2] = src_l0[2] | src_r0[0] << 16; + dst0[3] = src_r0[0] >> 16 | src_r0[1] << 16; + dst1[0] = src_r0[1] >> 16 | src_r0[2] << 16; + dst1[1] = src_r0[2] >> 16 | src_r0[3] << 16; + dst1[2] = src_r0[3] >> 16; + break; + + case 11: + dst0[2] = src_l0[2] | src_r0[0] << 24; + dst0[3] = src_r0[0] >> 8 | src_r0[1] << 24; + dst1[0] = src_r0[1] >> 8 | src_r0[2] << 24; + dst1[1] = src_r0[2] >> 8 | src_r0[3] << 24; + dst1[2] = src_r0[3] >> 8; + break; + + case 12: + dst0[3] = src_r0[0]; + dst1[0] = src_r0[1]; + dst1[1] = src_r0[2]; + dst1[2] = src_r0[3]; + break; + + case 13: + dst0[3] = src_l0[3] | src_r0[0] << 8; + dst1[0] = src_r0[0] >> 24 | src_r0[1] << 8; + dst1[1] = src_r0[1] >> 24 | src_r0[2] << 8; + dst1[2] = src_r0[2] >> 24 | src_r0[3] << 8; + dst1[3] = src_r0[3] >> 24; + break; + + case 14: + dst0[3] = src_l0[3] | src_r0[0] << 16; + dst1[0] = src_r0[0] >> 16 | src_r0[1] << 16; + dst1[1] = src_r0[1] >> 16 | src_r0[2] << 16; + dst1[2] = src_r0[2] >> 16 | src_r0[3] << 16; + dst1[3] = src_r0[3] >> 16; + break; + + case 15: + dst0[3] = src_l0[3] | src_r0[0] << 24; + dst1[0] = src_r0[0] >> 8 | src_r0[1] << 24; + dst1[1] = src_r0[1] >> 8 | src_r0[2] << 24; + dst1[2] = src_r0[2] >> 8 | src_r0[3] << 24; + dst1[3] = src_r0[3] >> 8; + break; + + case 16: + dst1[0] = src_r0[0]; + dst1[1] = src_r0[1]; + dst1[2] = src_r0[2]; + dst1[3] = src_r0[3]; + break; + + case 17: + dst1[0] = src_l1[0] | src_r0[0] << 8; + dst1[1] = src_r0[0] >> 24 | src_r0[1] << 8; + dst1[2] = src_r0[1] >> 24 | src_r0[2] << 8; + dst1[3] = src_r0[2] >> 24 | src_r0[3] << 8; + break; + + case 18: + dst1[0] = src_l1[0] | src_r0[0] << 16; + dst1[1] = src_r0[0] >> 16 | src_r0[1] << 16; + dst1[2] = src_r0[1] >> 16 | src_r0[2] << 16; + dst1[3] = src_r0[2] >> 16 | src_r0[3] << 16; + break; + + case 19: + dst1[0] = src_l1[0] | src_r0[0] << 24; + dst1[1] = src_r0[0] >> 8 | src_r0[1] << 24; + dst1[2] = src_r0[1] >> 8 | src_r0[2] << 24; + dst1[3] = src_r0[2] >> 8 | src_r0[3] << 24; + break; + + case 20: + dst1[1] = src_r0[0]; + dst1[2] = src_r0[1]; + dst1[3] = src_r0[2]; + break; + + case 21: + dst1[1] = src_l1[1] | src_r0[0] << 8; + dst1[2] = src_r0[0] >> 24 | src_r0[1] << 8; + dst1[3] = src_r0[1] >> 24 | src_r0[2] << 8; + break; + + case 22: + dst1[1] = src_l1[1] | src_r0[0] << 16; + dst1[2] = src_r0[0] >> 16 | src_r0[1] << 16; + dst1[3] = src_r0[1] >> 16 | src_r0[2] << 16; + break; + + case 23: + dst1[1] = src_l1[1] | src_r0[0] << 24; + dst1[2] = src_r0[0] >> 8 | src_r0[1] << 24; + dst1[3] = src_r0[1] >> 8 | src_r0[2] << 24; + break; + + case 24: + dst1[2] = src_r0[0]; + dst1[3] = src_r0[1]; + break; + + case 25: + dst1[2] = src_l1[2] | src_r0[0] << 8; + dst1[3] = src_r0[0] >> 24 | src_r0[1] << 8; + break; + + case 26: + dst1[2] = src_l1[2] | src_r0[0] << 16; + dst1[3] = src_r0[0] >> 16 | src_r0[1] << 16; + break; + + case 27: + dst1[2] = src_l1[2] | src_r0[0] << 24; + dst1[3] = src_r0[0] >> 8 | src_r0[1] << 24; + break; + + case 28: + dst1[3] = src_r0[0]; + break; + + case 29: + dst1[3] = src_l1[3] | src_r0[0] << 8; + break; + + case 30: + dst1[3] = src_l1[3] | src_r0[0] << 16; + break; + + case 31: + dst1[3] = src_l1[3] | src_r0[0] << 24; + break; + } +} + +static void device_memcat12L (const u32 offset, u32x dst0[4], u32x dst1[4], u32x dst2[4], u32x src_l0[4], u32x src_l1[4], u32x src_l2[4], u32 src_r0[4]) +{ + switch (offset) + { + case 1: + dst0[0] = src_l0[0] | src_r0[0] << 8; + dst0[1] = src_r0[0] >> 24 | src_r0[1] << 8; + dst0[2] = src_r0[1] >> 24 | src_r0[2] << 8; + dst0[3] = src_r0[2] >> 24 | src_r0[3] << 8; + dst1[0] = src_r0[3] >> 24; + break; + + case 2: + dst0[0] = src_l0[0] | src_r0[0] << 16; + dst0[1] = src_r0[0] >> 16 | src_r0[1] << 16; + dst0[2] = src_r0[1] >> 16 | src_r0[2] << 16; + dst0[3] = src_r0[2] >> 16 | src_r0[3] << 16; + dst1[0] = src_r0[3] >> 16; + break; + + case 3: + dst0[0] = src_l0[0] | src_r0[0] << 24; + dst0[1] = src_r0[0] >> 8 | src_r0[1] << 24; + dst0[2] = src_r0[1] >> 8 | src_r0[2] << 24; + dst0[3] = src_r0[2] >> 8 | src_r0[3] << 24; + dst1[0] = src_r0[3] >> 8; + break; + + case 4: + dst0[1] = src_r0[0]; + dst0[2] = src_r0[1]; + dst0[3] = src_r0[2]; + dst1[0] = src_r0[3]; + break; + + case 5: + dst0[1] = src_l0[1] | src_r0[0] << 8; + dst0[2] = src_r0[0] >> 24 | src_r0[1] << 8; + dst0[3] = src_r0[1] >> 24 | src_r0[2] << 8; + dst1[0] = src_r0[2] >> 24 | src_r0[3] << 8; + dst1[1] = src_r0[3] >> 24; + break; + + case 6: + dst0[1] = src_l0[1] | src_r0[0] << 16; + dst0[2] = src_r0[0] >> 16 | src_r0[1] << 16; + dst0[3] = src_r0[1] >> 16 | src_r0[2] << 16; + dst1[0] = src_r0[2] >> 16 | src_r0[3] << 16; + dst1[1] = src_r0[3] >> 16; + break; + + case 7: + dst0[1] = src_l0[1] | src_r0[0] << 24; + dst0[2] = src_r0[0] >> 8 | src_r0[1] << 24; + dst0[3] = src_r0[1] >> 8 | src_r0[2] << 24; + dst1[0] = src_r0[2] >> 8 | src_r0[3] << 24; + dst1[1] = src_r0[3] >> 8; + break; + + case 8: + dst0[2] = src_r0[0]; + dst0[3] = src_r0[1]; + dst1[0] = src_r0[2]; + dst1[1] = src_r0[3]; + break; + + case 9: + dst0[2] = src_l0[2] | src_r0[0] << 8; + dst0[3] = src_r0[0] >> 24 | src_r0[1] << 8; + dst1[0] = src_r0[1] >> 24 | src_r0[2] << 8; + dst1[1] = src_r0[2] >> 24 | src_r0[3] << 8; + dst1[2] = src_r0[3] >> 24; + break; + + case 10: + dst0[2] = src_l0[2] | src_r0[0] << 16; + dst0[3] = src_r0[0] >> 16 | src_r0[1] << 16; + dst1[0] = src_r0[1] >> 16 | src_r0[2] << 16; + dst1[1] = src_r0[2] >> 16 | src_r0[3] << 16; + dst1[2] = src_r0[3] >> 16; + break; + + case 11: + dst0[2] = src_l0[2] | src_r0[0] << 24; + dst0[3] = src_r0[0] >> 8 | src_r0[1] << 24; + dst1[0] = src_r0[1] >> 8 | src_r0[2] << 24; + dst1[1] = src_r0[2] >> 8 | src_r0[3] << 24; + dst1[2] = src_r0[3] >> 8; + break; + + case 12: + dst0[3] = src_r0[0]; + dst1[0] = src_r0[1]; + dst1[1] = src_r0[2]; + dst1[2] = src_r0[3]; + break; + + case 13: + dst0[3] = src_l0[3] | src_r0[0] << 8; + dst1[0] = src_r0[0] >> 24 | src_r0[1] << 8; + dst1[1] = src_r0[1] >> 24 | src_r0[2] << 8; + dst1[2] = src_r0[2] >> 24 | src_r0[3] << 8; + dst1[3] = src_r0[3] >> 24; + break; + + case 14: + dst0[3] = src_l0[3] | src_r0[0] << 16; + dst1[0] = src_r0[0] >> 16 | src_r0[1] << 16; + dst1[1] = src_r0[1] >> 16 | src_r0[2] << 16; + dst1[2] = src_r0[2] >> 16 | src_r0[3] << 16; + dst1[3] = src_r0[3] >> 16; + break; + + case 15: + dst0[3] = src_l0[3] | src_r0[0] << 24; + dst1[0] = src_r0[0] >> 8 | src_r0[1] << 24; + dst1[1] = src_r0[1] >> 8 | src_r0[2] << 24; + dst1[2] = src_r0[2] >> 8 | src_r0[3] << 24; + dst1[3] = src_r0[3] >> 8; + break; + + case 16: + dst1[0] = src_r0[0]; + dst1[1] = src_r0[1]; + dst1[2] = src_r0[2]; + dst1[3] = src_r0[3]; + break; + + case 17: + dst1[0] = src_l1[0] | src_r0[0] << 8; + dst1[1] = src_r0[0] >> 24 | src_r0[1] << 8; + dst1[2] = src_r0[1] >> 24 | src_r0[2] << 8; + dst1[3] = src_r0[2] >> 24 | src_r0[3] << 8; + dst2[0] = src_r0[3] >> 24; + break; + + case 18: + dst1[0] = src_l1[0] | src_r0[0] << 16; + dst1[1] = src_r0[0] >> 16 | src_r0[1] << 16; + dst1[2] = src_r0[1] >> 16 | src_r0[2] << 16; + dst1[3] = src_r0[2] >> 16 | src_r0[3] << 16; + dst2[0] = src_r0[3] >> 16; + break; + + case 19: + dst1[0] = src_l1[0] | src_r0[0] << 24; + dst1[1] = src_r0[0] >> 8 | src_r0[1] << 24; + dst1[2] = src_r0[1] >> 8 | src_r0[2] << 24; + dst1[3] = src_r0[2] >> 8 | src_r0[3] << 24; + dst2[0] = src_r0[3] >> 8; + break; + + case 20: + dst1[1] = src_r0[0]; + dst1[2] = src_r0[1]; + dst1[3] = src_r0[2]; + dst2[0] = src_r0[3]; + break; + + case 21: + dst1[1] = src_l1[1] | src_r0[0] << 8; + dst1[2] = src_r0[0] >> 24 | src_r0[1] << 8; + dst1[3] = src_r0[1] >> 24 | src_r0[2] << 8; + dst2[0] = src_r0[2] >> 24 | src_r0[3] << 8; + dst2[1] = src_r0[3] >> 24; + break; + + case 22: + dst1[1] = src_l1[1] | src_r0[0] << 16; + dst1[2] = src_r0[0] >> 16 | src_r0[1] << 16; + dst1[3] = src_r0[1] >> 16 | src_r0[2] << 16; + dst2[0] = src_r0[2] >> 16 | src_r0[3] << 16; + dst2[1] = src_r0[3] >> 16; + break; + + case 23: + dst1[1] = src_l1[1] | src_r0[0] << 24; + dst1[2] = src_r0[0] >> 8 | src_r0[1] << 24; + dst1[3] = src_r0[1] >> 8 | src_r0[2] << 24; + dst2[0] = src_r0[2] >> 8 | src_r0[3] << 24; + dst2[1] = src_r0[3] >> 8; + break; + + case 24: + dst1[2] = src_r0[0]; + dst1[3] = src_r0[1]; + dst2[0] = src_r0[2]; + dst2[1] = src_r0[3]; + break; + + case 25: + dst1[2] = src_l1[2] | src_r0[0] << 8; + dst1[3] = src_r0[0] >> 24 | src_r0[1] << 8; + dst2[0] = src_r0[1] >> 24 | src_r0[2] << 8; + dst2[1] = src_r0[2] >> 24 | src_r0[3] << 8; + dst2[2] = src_r0[3] >> 24; + break; + + case 26: + dst1[2] = src_l1[2] | src_r0[0] << 16; + dst1[3] = src_r0[0] >> 16 | src_r0[1] << 16; + dst2[0] = src_r0[1] >> 16 | src_r0[2] << 16; + dst2[1] = src_r0[2] >> 16 | src_r0[3] << 16; + dst2[2] = src_r0[3] >> 16; + break; + + case 27: + dst1[2] = src_l1[2] | src_r0[0] << 24; + dst1[3] = src_r0[0] >> 8 | src_r0[1] << 24; + dst2[0] = src_r0[1] >> 8 | src_r0[2] << 24; + dst2[1] = src_r0[2] >> 8 | src_r0[3] << 24; + dst2[2] = src_r0[3] >> 8; + break; + + case 28: + dst1[3] = src_r0[0]; + dst2[0] = src_r0[1]; + dst2[1] = src_r0[2]; + dst2[2] = src_r0[3]; + break; + + case 29: + dst1[3] = src_l1[3] | src_r0[0] << 8; + dst2[0] = src_r0[0] >> 24 | src_r0[1] << 8; + dst2[1] = src_r0[1] >> 24 | src_r0[2] << 8; + dst2[2] = src_r0[2] >> 24 | src_r0[3] << 8; + dst2[3] = src_r0[3] >> 24; + break; + + case 30: + dst1[3] = src_l1[3] | src_r0[0] << 16; + dst2[0] = src_r0[0] >> 16 | src_r0[1] << 16; + dst2[1] = src_r0[1] >> 16 | src_r0[2] << 16; + dst2[2] = src_r0[2] >> 16 | src_r0[3] << 16; + dst2[3] = src_r0[3] >> 16; + break; + + case 31: + dst1[3] = src_l1[3] | src_r0[0] << 24; + dst2[0] = src_r0[0] >> 8 | src_r0[1] << 24; + dst2[1] = src_r0[1] >> 8 | src_r0[2] << 24; + dst2[2] = src_r0[2] >> 8 | src_r0[3] << 24; + dst2[3] = src_r0[3] >> 8; + break; + + case 32: + dst2[0] = src_r0[0]; + dst2[1] = src_r0[1]; + dst2[2] = src_r0[2]; + dst2[3] = src_r0[3]; + break; + + case 33: + dst2[0] = src_l2[0] | src_r0[0] << 8; + dst2[1] = src_r0[0] >> 24 | src_r0[1] << 8; + dst2[2] = src_r0[1] >> 24 | src_r0[2] << 8; + dst2[3] = src_r0[2] >> 24 | src_r0[3] << 8; + break; + + case 34: + dst2[0] = src_l2[0] | src_r0[0] << 16; + dst2[1] = src_r0[0] >> 16 | src_r0[1] << 16; + dst2[2] = src_r0[1] >> 16 | src_r0[2] << 16; + dst2[3] = src_r0[2] >> 16 | src_r0[3] << 16; + break; + + case 35: + dst2[0] = src_l2[0] | src_r0[0] << 24; + dst2[1] = src_r0[0] >> 8 | src_r0[1] << 24; + dst2[2] = src_r0[1] >> 8 | src_r0[2] << 24; + dst2[3] = src_r0[2] >> 8 | src_r0[3] << 24; + break; + + case 36: + dst2[1] = src_r0[0]; + dst2[2] = src_r0[1]; + dst2[3] = src_r0[2]; + break; + + case 37: + dst2[1] = src_l2[1] | src_r0[0] << 8; + dst2[2] = src_r0[0] >> 24 | src_r0[1] << 8; + dst2[3] = src_r0[1] >> 24 | src_r0[2] << 8; + break; + + case 38: + dst2[1] = src_l2[1] | src_r0[0] << 16; + dst2[2] = src_r0[0] >> 16 | src_r0[1] << 16; + dst2[3] = src_r0[1] >> 16 | src_r0[2] << 16; + break; + + case 39: + dst2[1] = src_l2[1] | src_r0[0] << 24; + dst2[2] = src_r0[0] >> 8 | src_r0[1] << 24; + dst2[3] = src_r0[1] >> 8 | src_r0[2] << 24; + break; + + case 40: + dst2[2] = src_r0[0]; + dst2[3] = src_r0[1]; + break; + + case 41: + dst2[2] = src_l2[2] | src_r0[0] << 8; + dst2[3] = src_r0[0] >> 24 | src_r0[1] << 8; + break; + + case 42: + dst2[2] = src_l2[2] | src_r0[0] << 16; + dst2[3] = src_r0[0] >> 16 | src_r0[1] << 16; + break; + + case 43: + dst2[2] = src_l2[2] | src_r0[0] << 24; + dst2[3] = src_r0[0] >> 8 | src_r0[1] << 24; + break; + + case 44: + dst2[3] = src_r0[0]; + break; + + case 45: + dst2[3] = src_l2[3] | src_r0[0] << 8; + break; + + case 46: + dst2[3] = src_l2[3] | src_r0[0] << 16; + break; + + case 47: + dst2[3] = src_l2[3] | src_r0[0] << 24; + break; + } +} + +static void device_memcat12L (const u32 offset, u32x dst0[4], u32x dst1[4], u32x dst2[4], u32x src_l0[4], u32x src_l1[4], u32x src_l2[4], u32x src_r0[4]) +{ + switch (offset) + { + case 1: + dst0[0] = src_l0[0] | src_r0[0] << 8; + dst0[1] = src_r0[0] >> 24 | src_r0[1] << 8; + dst0[2] = src_r0[1] >> 24 | src_r0[2] << 8; + dst0[3] = src_r0[2] >> 24 | src_r0[3] << 8; + dst1[0] = src_r0[3] >> 24; + break; + + case 2: + dst0[0] = src_l0[0] | src_r0[0] << 16; + dst0[1] = src_r0[0] >> 16 | src_r0[1] << 16; + dst0[2] = src_r0[1] >> 16 | src_r0[2] << 16; + dst0[3] = src_r0[2] >> 16 | src_r0[3] << 16; + dst1[0] = src_r0[3] >> 16; + break; + + case 3: + dst0[0] = src_l0[0] | src_r0[0] << 24; + dst0[1] = src_r0[0] >> 8 | src_r0[1] << 24; + dst0[2] = src_r0[1] >> 8 | src_r0[2] << 24; + dst0[3] = src_r0[2] >> 8 | src_r0[3] << 24; + dst1[0] = src_r0[3] >> 8; + break; + + case 4: + dst0[1] = src_r0[0]; + dst0[2] = src_r0[1]; + dst0[3] = src_r0[2]; + dst1[0] = src_r0[3]; + break; + + case 5: + dst0[1] = src_l0[1] | src_r0[0] << 8; + dst0[2] = src_r0[0] >> 24 | src_r0[1] << 8; + dst0[3] = src_r0[1] >> 24 | src_r0[2] << 8; + dst1[0] = src_r0[2] >> 24 | src_r0[3] << 8; + dst1[1] = src_r0[3] >> 24; + break; + + case 6: + dst0[1] = src_l0[1] | src_r0[0] << 16; + dst0[2] = src_r0[0] >> 16 | src_r0[1] << 16; + dst0[3] = src_r0[1] >> 16 | src_r0[2] << 16; + dst1[0] = src_r0[2] >> 16 | src_r0[3] << 16; + dst1[1] = src_r0[3] >> 16; + break; + + case 7: + dst0[1] = src_l0[1] | src_r0[0] << 24; + dst0[2] = src_r0[0] >> 8 | src_r0[1] << 24; + dst0[3] = src_r0[1] >> 8 | src_r0[2] << 24; + dst1[0] = src_r0[2] >> 8 | src_r0[3] << 24; + dst1[1] = src_r0[3] >> 8; + break; + + case 8: + dst0[2] = src_r0[0]; + dst0[3] = src_r0[1]; + dst1[0] = src_r0[2]; + dst1[1] = src_r0[3]; + break; + + case 9: + dst0[2] = src_l0[2] | src_r0[0] << 8; + dst0[3] = src_r0[0] >> 24 | src_r0[1] << 8; + dst1[0] = src_r0[1] >> 24 | src_r0[2] << 8; + dst1[1] = src_r0[2] >> 24 | src_r0[3] << 8; + dst1[2] = src_r0[3] >> 24; + break; + + case 10: + dst0[2] = src_l0[2] | src_r0[0] << 16; + dst0[3] = src_r0[0] >> 16 | src_r0[1] << 16; + dst1[0] = src_r0[1] >> 16 | src_r0[2] << 16; + dst1[1] = src_r0[2] >> 16 | src_r0[3] << 16; + dst1[2] = src_r0[3] >> 16; + break; + + case 11: + dst0[2] = src_l0[2] | src_r0[0] << 24; + dst0[3] = src_r0[0] >> 8 | src_r0[1] << 24; + dst1[0] = src_r0[1] >> 8 | src_r0[2] << 24; + dst1[1] = src_r0[2] >> 8 | src_r0[3] << 24; + dst1[2] = src_r0[3] >> 8; + break; + + case 12: + dst0[3] = src_r0[0]; + dst1[0] = src_r0[1]; + dst1[1] = src_r0[2]; + dst1[2] = src_r0[3]; + break; + + case 13: + dst0[3] = src_l0[3] | src_r0[0] << 8; + dst1[0] = src_r0[0] >> 24 | src_r0[1] << 8; + dst1[1] = src_r0[1] >> 24 | src_r0[2] << 8; + dst1[2] = src_r0[2] >> 24 | src_r0[3] << 8; + dst1[3] = src_r0[3] >> 24; + break; + + case 14: + dst0[3] = src_l0[3] | src_r0[0] << 16; + dst1[0] = src_r0[0] >> 16 | src_r0[1] << 16; + dst1[1] = src_r0[1] >> 16 | src_r0[2] << 16; + dst1[2] = src_r0[2] >> 16 | src_r0[3] << 16; + dst1[3] = src_r0[3] >> 16; + break; + + case 15: + dst0[3] = src_l0[3] | src_r0[0] << 24; + dst1[0] = src_r0[0] >> 8 | src_r0[1] << 24; + dst1[1] = src_r0[1] >> 8 | src_r0[2] << 24; + dst1[2] = src_r0[2] >> 8 | src_r0[3] << 24; + dst1[3] = src_r0[3] >> 8; + break; + + case 16: + dst1[0] = src_r0[0]; + dst1[1] = src_r0[1]; + dst1[2] = src_r0[2]; + dst1[3] = src_r0[3]; + break; + + case 17: + dst1[0] = src_l1[0] | src_r0[0] << 8; + dst1[1] = src_r0[0] >> 24 | src_r0[1] << 8; + dst1[2] = src_r0[1] >> 24 | src_r0[2] << 8; + dst1[3] = src_r0[2] >> 24 | src_r0[3] << 8; + dst2[0] = src_r0[3] >> 24; + break; + + case 18: + dst1[0] = src_l1[0] | src_r0[0] << 16; + dst1[1] = src_r0[0] >> 16 | src_r0[1] << 16; + dst1[2] = src_r0[1] >> 16 | src_r0[2] << 16; + dst1[3] = src_r0[2] >> 16 | src_r0[3] << 16; + dst2[0] = src_r0[3] >> 16; + break; + + case 19: + dst1[0] = src_l1[0] | src_r0[0] << 24; + dst1[1] = src_r0[0] >> 8 | src_r0[1] << 24; + dst1[2] = src_r0[1] >> 8 | src_r0[2] << 24; + dst1[3] = src_r0[2] >> 8 | src_r0[3] << 24; + dst2[0] = src_r0[3] >> 8; + break; + + case 20: + dst1[1] = src_r0[0]; + dst1[2] = src_r0[1]; + dst1[3] = src_r0[2]; + dst2[0] = src_r0[3]; + break; + + case 21: + dst1[1] = src_l1[1] | src_r0[0] << 8; + dst1[2] = src_r0[0] >> 24 | src_r0[1] << 8; + dst1[3] = src_r0[1] >> 24 | src_r0[2] << 8; + dst2[0] = src_r0[2] >> 24 | src_r0[3] << 8; + dst2[1] = src_r0[3] >> 24; + break; + + case 22: + dst1[1] = src_l1[1] | src_r0[0] << 16; + dst1[2] = src_r0[0] >> 16 | src_r0[1] << 16; + dst1[3] = src_r0[1] >> 16 | src_r0[2] << 16; + dst2[0] = src_r0[2] >> 16 | src_r0[3] << 16; + dst2[1] = src_r0[3] >> 16; + break; + + case 23: + dst1[1] = src_l1[1] | src_r0[0] << 24; + dst1[2] = src_r0[0] >> 8 | src_r0[1] << 24; + dst1[3] = src_r0[1] >> 8 | src_r0[2] << 24; + dst2[0] = src_r0[2] >> 8 | src_r0[3] << 24; + dst2[1] = src_r0[3] >> 8; + break; + + case 24: + dst1[2] = src_r0[0]; + dst1[3] = src_r0[1]; + dst2[0] = src_r0[2]; + dst2[1] = src_r0[3]; + break; + + case 25: + dst1[2] = src_l1[2] | src_r0[0] << 8; + dst1[3] = src_r0[0] >> 24 | src_r0[1] << 8; + dst2[0] = src_r0[1] >> 24 | src_r0[2] << 8; + dst2[1] = src_r0[2] >> 24 | src_r0[3] << 8; + dst2[2] = src_r0[3] >> 24; + break; + + case 26: + dst1[2] = src_l1[2] | src_r0[0] << 16; + dst1[3] = src_r0[0] >> 16 | src_r0[1] << 16; + dst2[0] = src_r0[1] >> 16 | src_r0[2] << 16; + dst2[1] = src_r0[2] >> 16 | src_r0[3] << 16; + dst2[2] = src_r0[3] >> 16; + break; + + case 27: + dst1[2] = src_l1[2] | src_r0[0] << 24; + dst1[3] = src_r0[0] >> 8 | src_r0[1] << 24; + dst2[0] = src_r0[1] >> 8 | src_r0[2] << 24; + dst2[1] = src_r0[2] >> 8 | src_r0[3] << 24; + dst2[2] = src_r0[3] >> 8; + break; + + case 28: + dst1[3] = src_r0[0]; + dst2[0] = src_r0[1]; + dst2[1] = src_r0[2]; + dst2[2] = src_r0[3]; + break; + + case 29: + dst1[3] = src_l1[3] | src_r0[0] << 8; + dst2[0] = src_r0[0] >> 24 | src_r0[1] << 8; + dst2[1] = src_r0[1] >> 24 | src_r0[2] << 8; + dst2[2] = src_r0[2] >> 24 | src_r0[3] << 8; + dst2[3] = src_r0[3] >> 24; + break; + + case 30: + dst1[3] = src_l1[3] | src_r0[0] << 16; + dst2[0] = src_r0[0] >> 16 | src_r0[1] << 16; + dst2[1] = src_r0[1] >> 16 | src_r0[2] << 16; + dst2[2] = src_r0[2] >> 16 | src_r0[3] << 16; + dst2[3] = src_r0[3] >> 16; + break; + + case 31: + dst1[3] = src_l1[3] | src_r0[0] << 24; + dst2[0] = src_r0[0] >> 8 | src_r0[1] << 24; + dst2[1] = src_r0[1] >> 8 | src_r0[2] << 24; + dst2[2] = src_r0[2] >> 8 | src_r0[3] << 24; + dst2[3] = src_r0[3] >> 8; + break; + + case 32: + dst2[0] = src_r0[0]; + dst2[1] = src_r0[1]; + dst2[2] = src_r0[2]; + dst2[3] = src_r0[3]; + break; + + case 33: + dst2[0] = src_l2[0] | src_r0[0] << 8; + dst2[1] = src_r0[0] >> 24 | src_r0[1] << 8; + dst2[2] = src_r0[1] >> 24 | src_r0[2] << 8; + dst2[3] = src_r0[2] >> 24 | src_r0[3] << 8; + break; + + case 34: + dst2[0] = src_l2[0] | src_r0[0] << 16; + dst2[1] = src_r0[0] >> 16 | src_r0[1] << 16; + dst2[2] = src_r0[1] >> 16 | src_r0[2] << 16; + dst2[3] = src_r0[2] >> 16 | src_r0[3] << 16; + break; + + case 35: + dst2[0] = src_l2[0] | src_r0[0] << 24; + dst2[1] = src_r0[0] >> 8 | src_r0[1] << 24; + dst2[2] = src_r0[1] >> 8 | src_r0[2] << 24; + dst2[3] = src_r0[2] >> 8 | src_r0[3] << 24; + break; + + case 36: + dst2[1] = src_r0[0]; + dst2[2] = src_r0[1]; + dst2[3] = src_r0[2]; + break; + + case 37: + dst2[1] = src_l2[1] | src_r0[0] << 8; + dst2[2] = src_r0[0] >> 24 | src_r0[1] << 8; + dst2[3] = src_r0[1] >> 24 | src_r0[2] << 8; + break; + + case 38: + dst2[1] = src_l2[1] | src_r0[0] << 16; + dst2[2] = src_r0[0] >> 16 | src_r0[1] << 16; + dst2[3] = src_r0[1] >> 16 | src_r0[2] << 16; + break; + + case 39: + dst2[1] = src_l2[1] | src_r0[0] << 24; + dst2[2] = src_r0[0] >> 8 | src_r0[1] << 24; + dst2[3] = src_r0[1] >> 8 | src_r0[2] << 24; + break; + + case 40: + dst2[2] = src_r0[0]; + dst2[3] = src_r0[1]; + break; + + case 41: + dst2[2] = src_l2[2] | src_r0[0] << 8; + dst2[3] = src_r0[0] >> 24 | src_r0[1] << 8; + break; + + case 42: + dst2[2] = src_l2[2] | src_r0[0] << 16; + dst2[3] = src_r0[0] >> 16 | src_r0[1] << 16; + break; + + case 43: + dst2[2] = src_l2[2] | src_r0[0] << 24; + dst2[3] = src_r0[0] >> 8 | src_r0[1] << 24; + break; + + case 44: + dst2[3] = src_r0[0]; + break; + + case 45: + dst2[3] = src_l2[3] | src_r0[0] << 8; + break; + + case 46: + dst2[3] = src_l2[3] | src_r0[0] << 16; + break; + + case 47: + dst2[3] = src_l2[3] | src_r0[0] << 24; + break; + } +} + +static void device_memcat12L (const u32 offset, u32x dst0[4], u32x dst1[4], u32x dst2[4], u32x src_l0[4], u32x src_l1[4], u32x src_l2[4], u32x src_r0[4], u32x src_r1[4]) +{ + switch (offset) + { + case 0: + dst0[0] = src_r0[0]; + dst0[1] = src_r0[1]; + dst0[2] = src_r0[2]; + dst0[3] = src_r0[3]; + dst1[0] = src_r1[0]; + dst1[1] = src_r1[1]; + dst1[2] = src_r1[2]; + dst1[3] = src_r1[3]; + break; + + case 1: + dst0[0] = src_l0[0] | src_r0[0] << 8; + dst0[1] = src_r0[0] >> 24 | src_r0[1] << 8; + dst0[2] = src_r0[1] >> 24 | src_r0[2] << 8; + dst0[3] = src_r0[2] >> 24 | src_r0[3] << 8; + dst1[0] = src_r0[3] >> 24 | src_r1[0] << 8; + dst1[1] = src_r1[0] >> 24 | src_r1[1] << 8; + dst1[2] = src_r1[1] >> 24 | src_r1[2] << 8; + dst1[3] = src_r1[2] >> 24 | src_r1[3] << 8; + dst2[0] = src_r1[3] >> 24; + break; + + case 2: + dst0[0] = src_l0[0] | src_r0[0] << 16; + dst0[1] = src_r0[0] >> 16 | src_r0[1] << 16; + dst0[2] = src_r0[1] >> 16 | src_r0[2] << 16; + dst0[3] = src_r0[2] >> 16 | src_r0[3] << 16; + dst1[0] = src_r0[3] >> 16 | src_r1[0] << 16; + dst1[1] = src_r1[0] >> 16 | src_r1[1] << 16; + dst1[2] = src_r1[1] >> 16 | src_r1[2] << 16; + dst1[3] = src_r1[2] >> 16 | src_r1[3] << 16; + dst2[0] = src_r1[3] >> 16; + break; + + case 3: + dst0[0] = src_l0[0] | src_r0[0] << 24; + dst0[1] = src_r0[0] >> 8 | src_r0[1] << 24; + dst0[2] = src_r0[1] >> 8 | src_r0[2] << 24; + dst0[3] = src_r0[2] >> 8 | src_r0[3] << 24; + dst1[0] = src_r0[3] >> 8 | src_r1[0] << 24; + dst1[1] = src_r1[0] >> 8 | src_r1[1] << 24; + dst1[2] = src_r1[1] >> 8 | src_r1[2] << 24; + dst1[3] = src_r1[2] >> 8 | src_r1[3] << 24; + dst2[0] = src_r1[3] >> 8; + break; + + case 4: + dst0[1] = src_r0[0]; + dst0[2] = src_r0[1]; + dst0[3] = src_r0[2]; + dst1[0] = src_r0[3]; + dst1[1] = src_r1[0]; + dst1[2] = src_r1[1]; + dst1[3] = src_r1[2]; + dst2[0] = src_r1[3]; + break; + + case 5: + dst0[1] = src_l0[1] | src_r0[0] << 8; + dst0[2] = src_r0[0] >> 24 | src_r0[1] << 8; + dst0[3] = src_r0[1] >> 24 | src_r0[2] << 8; + dst1[0] = src_r0[2] >> 24 | src_r0[3] << 8; + dst1[1] = src_r0[3] >> 24 | src_r1[0] << 8; + dst1[2] = src_r1[0] >> 24 | src_r1[1] << 8; + dst1[3] = src_r1[1] >> 24 | src_r1[2] << 8; + dst2[0] = src_r1[2] >> 24 | src_r1[3] << 8; + dst2[1] = src_r1[3] >> 24; + break; + + case 6: + dst0[1] = src_l0[1] | src_r0[0] << 16; + dst0[2] = src_r0[0] >> 16 | src_r0[1] << 16; + dst0[3] = src_r0[1] >> 16 | src_r0[2] << 16; + dst1[0] = src_r0[2] >> 16 | src_r0[3] << 16; + dst1[1] = src_r0[3] >> 16 | src_r1[0] << 16; + dst1[2] = src_r1[0] >> 16 | src_r1[1] << 16; + dst1[3] = src_r1[1] >> 16 | src_r1[2] << 16; + dst2[0] = src_r1[2] >> 16 | src_r1[3] << 16; + dst2[1] = src_r1[3] >> 16; + break; + + case 7: + dst0[1] = src_l0[1] | src_r0[0] << 24; + dst0[2] = src_r0[0] >> 8 | src_r0[1] << 24; + dst0[3] = src_r0[1] >> 8 | src_r0[2] << 24; + dst1[0] = src_r0[2] >> 8 | src_r0[3] << 24; + dst1[1] = src_r0[3] >> 8 | src_r1[0] << 24; + dst1[2] = src_r1[0] >> 8 | src_r1[1] << 24; + dst1[3] = src_r1[1] >> 8 | src_r1[2] << 24; + dst2[0] = src_r1[2] >> 8 | src_r1[3] << 24; + dst2[1] = src_r1[3] >> 8; + break; + + case 8: + dst0[2] = src_r0[0]; + dst0[3] = src_r0[1]; + dst1[0] = src_r0[2]; + dst1[1] = src_r0[3]; + dst1[2] = src_r1[0]; + dst1[3] = src_r1[1]; + dst2[0] = src_r1[2]; + dst2[1] = src_r1[3]; + break; + + case 9: + dst0[2] = src_l0[2] | src_r0[0] << 8; + dst0[3] = src_r0[0] >> 24 | src_r0[1] << 8; + dst1[0] = src_r0[1] >> 24 | src_r0[2] << 8; + dst1[1] = src_r0[2] >> 24 | src_r0[3] << 8; + dst1[2] = src_r0[3] >> 24 | src_r1[0] << 8; + dst1[3] = src_r1[0] >> 24 | src_r1[1] << 8; + dst2[0] = src_r1[1] >> 24 | src_r1[2] << 8; + dst2[1] = src_r1[2] >> 24 | src_r1[3] << 8; + dst2[2] = src_r1[3] >> 24; + break; + + case 10: + dst0[2] = src_l0[2] | src_r0[0] << 16; + dst0[3] = src_r0[0] >> 16 | src_r0[1] << 16; + dst1[0] = src_r0[1] >> 16 | src_r0[2] << 16; + dst1[1] = src_r0[2] >> 16 | src_r0[3] << 16; + dst1[2] = src_r0[3] >> 16 | src_r1[0] << 16; + dst1[3] = src_r1[0] >> 16 | src_r1[1] << 16; + dst2[0] = src_r1[1] >> 16 | src_r1[2] << 16; + dst2[1] = src_r1[2] >> 16 | src_r1[3] << 16; + dst2[2] = src_r1[3] >> 16; + break; + + case 11: + dst0[2] = src_l0[2] | src_r0[0] << 24; + dst0[3] = src_r0[0] >> 8 | src_r0[1] << 24; + dst1[0] = src_r0[1] >> 8 | src_r0[2] << 24; + dst1[1] = src_r0[2] >> 8 | src_r0[3] << 24; + dst1[2] = src_r0[3] >> 8 | src_r1[0] << 24; + dst1[3] = src_r1[0] >> 8 | src_r1[1] << 24; + dst2[0] = src_r1[1] >> 8 | src_r1[2] << 24; + dst2[1] = src_r1[2] >> 8 | src_r1[3] << 24; + dst2[2] = src_r1[3] >> 8; + break; + + case 12: + dst0[3] = src_r0[0]; + dst1[0] = src_r0[1]; + dst1[1] = src_r0[2]; + dst1[2] = src_r0[3]; + dst1[3] = src_r1[0]; + dst2[0] = src_r1[1]; + dst2[1] = src_r1[2]; + dst2[2] = src_r1[3]; + break; + + case 13: + dst0[3] = src_l0[3] | src_r0[0] << 8; + dst1[0] = src_r0[0] >> 24 | src_r0[1] << 8; + dst1[1] = src_r0[1] >> 24 | src_r0[2] << 8; + dst1[2] = src_r0[2] >> 24 | src_r0[3] << 8; + dst1[3] = src_r0[3] >> 24 | src_r1[0] << 8; + dst2[0] = src_r1[0] >> 24 | src_r1[1] << 8; + dst2[1] = src_r1[1] >> 24 | src_r1[2] << 8; + dst2[2] = src_r1[2] >> 24 | src_r1[3] << 8; + dst2[3] = src_r1[3] >> 24; + break; + + case 14: + dst0[3] = src_l0[3] | src_r0[0] << 16; + dst1[0] = src_r0[0] >> 16 | src_r0[1] << 16; + dst1[1] = src_r0[1] >> 16 | src_r0[2] << 16; + dst1[2] = src_r0[2] >> 16 | src_r0[3] << 16; + dst1[3] = src_r0[3] >> 16 | src_r1[0] << 16; + dst2[0] = src_r1[0] >> 16 | src_r1[1] << 16; + dst2[1] = src_r1[1] >> 16 | src_r1[2] << 16; + dst2[2] = src_r1[2] >> 16 | src_r1[3] << 16; + dst2[3] = src_r1[3] >> 16; + break; + + case 15: + dst0[3] = src_l0[3] | src_r0[0] << 24; + dst1[0] = src_r0[0] >> 8 | src_r0[1] << 24; + dst1[1] = src_r0[1] >> 8 | src_r0[2] << 24; + dst1[2] = src_r0[2] >> 8 | src_r0[3] << 24; + dst1[3] = src_r0[3] >> 8 | src_r1[0] << 24; + dst2[0] = src_r1[0] >> 8 | src_r1[1] << 24; + dst2[1] = src_r1[1] >> 8 | src_r1[2] << 24; + dst2[2] = src_r1[2] >> 8 | src_r1[3] << 24; + dst2[3] = src_r1[3] >> 8; + break; + + case 16: + dst1[0] = src_r0[0]; + dst1[1] = src_r0[1]; + dst1[2] = src_r0[2]; + dst1[3] = src_r0[3]; + dst2[0] = src_r1[0]; + dst2[1] = src_r1[1]; + dst2[2] = src_r1[2]; + dst2[3] = src_r1[3]; + break; + + case 17: + dst1[0] = src_l1[0] | src_r0[0] << 8; + dst1[1] = src_r0[0] >> 24 | src_r0[1] << 8; + dst1[2] = src_r0[1] >> 24 | src_r0[2] << 8; + dst1[3] = src_r0[2] >> 24 | src_r0[3] << 8; + dst2[0] = src_r0[3] >> 24 | src_r1[0] << 8; + dst2[1] = src_r1[0] >> 24 | src_r1[1] << 8; + dst2[2] = src_r1[1] >> 24 | src_r1[2] << 8; + dst2[3] = src_r1[2] >> 24 | src_r1[3] << 8; + break; + + case 18: + dst1[0] = src_l1[0] | src_r0[0] << 16; + dst1[1] = src_r0[0] >> 16 | src_r0[1] << 16; + dst1[2] = src_r0[1] >> 16 | src_r0[2] << 16; + dst1[3] = src_r0[2] >> 16 | src_r0[3] << 16; + dst2[0] = src_r0[3] >> 16 | src_r1[0] << 16; + dst2[1] = src_r1[0] >> 16 | src_r1[1] << 16; + dst2[2] = src_r1[1] >> 16 | src_r1[2] << 16; + dst2[3] = src_r1[2] >> 16 | src_r1[3] << 16; + break; + + case 19: + dst1[0] = src_l1[0] | src_r0[0] << 24; + dst1[1] = src_r0[0] >> 8 | src_r0[1] << 24; + dst1[2] = src_r0[1] >> 8 | src_r0[2] << 24; + dst1[3] = src_r0[2] >> 8 | src_r0[3] << 24; + dst2[0] = src_r0[3] >> 8 | src_r1[0] << 24; + dst2[1] = src_r1[0] >> 8 | src_r1[1] << 24; + dst2[2] = src_r1[1] >> 8 | src_r1[2] << 24; + dst2[3] = src_r1[2] >> 8 | src_r1[3] << 24; + break; + + case 20: + dst1[1] = src_r1[0]; + dst1[2] = src_r0[1]; + dst1[3] = src_r0[2]; + dst2[0] = src_r0[3]; + dst2[1] = src_r1[0]; + dst2[2] = src_r1[1]; + dst2[3] = src_r1[2]; + break; + + case 21: + dst1[1] = src_l1[1] | src_r0[0] << 8; + dst1[2] = src_r0[0] >> 24 | src_r0[1] << 8; + dst1[3] = src_r0[1] >> 24 | src_r0[2] << 8; + dst2[0] = src_r0[2] >> 24 | src_r0[3] << 8; + dst2[1] = src_r0[3] >> 24 | src_r1[0] << 8; + dst2[2] = src_r1[0] >> 24 | src_r1[1] << 8; + dst2[3] = src_r1[1] >> 24 | src_r1[2] << 8; + break; + + case 22: + dst1[1] = src_l1[1] | src_r0[0] << 16; + dst1[2] = src_r0[0] >> 16 | src_r0[1] << 16; + dst1[3] = src_r0[1] >> 16 | src_r0[2] << 16; + dst2[0] = src_r0[2] >> 16 | src_r0[3] << 16; + dst2[1] = src_r0[3] >> 16 | src_r1[0] << 16; + dst2[2] = src_r1[0] >> 16 | src_r1[1] << 16; + dst2[3] = src_r1[1] >> 16 | src_r1[2] << 16; + break; + + case 23: + dst1[1] = src_l1[1] | src_r0[0] << 24; + dst1[2] = src_r0[0] >> 8 | src_r0[1] << 24; + dst1[3] = src_r0[1] >> 8 | src_r0[2] << 24; + dst2[0] = src_r0[2] >> 8 | src_r0[3] << 24; + dst2[1] = src_r0[3] >> 8 | src_r1[0] << 24; + dst2[2] = src_r1[0] >> 8 | src_r1[1] << 24; + dst2[3] = src_r1[1] >> 8 | src_r1[2] << 24; + break; + + case 24: + dst1[2] = src_r1[0]; + dst1[3] = src_r0[1]; + dst2[0] = src_r0[2]; + dst2[1] = src_r0[3]; + dst2[2] = src_r1[0]; + dst2[3] = src_r1[1]; + break; + + case 25: + dst1[2] = src_l1[2] | src_r0[0] << 8; + dst1[3] = src_r0[0] >> 24 | src_r0[1] << 8; + dst2[0] = src_r0[1] >> 24 | src_r0[2] << 8; + dst2[1] = src_r0[2] >> 24 | src_r0[3] << 8; + dst2[2] = src_r0[3] >> 24 | src_r1[0] << 8; + dst2[3] = src_r1[0] >> 24 | src_r1[1] << 8; + break; + + case 26: + dst1[2] = src_l1[2] | src_r0[0] << 16; + dst1[3] = src_r0[0] >> 16 | src_r0[1] << 16; + dst2[0] = src_r0[1] >> 16 | src_r0[2] << 16; + dst2[1] = src_r0[2] >> 16 | src_r0[3] << 16; + dst2[2] = src_r0[3] >> 16 | src_r1[0] << 16; + dst2[3] = src_r1[0] >> 16 | src_r1[1] << 16; + break; + + case 27: + dst1[2] = src_l1[2] | src_r0[0] << 24; + dst1[3] = src_r0[0] >> 8 | src_r0[1] << 24; + dst2[0] = src_r0[1] >> 8 | src_r0[2] << 24; + dst2[1] = src_r0[2] >> 8 | src_r0[3] << 24; + dst2[2] = src_r0[3] >> 8 | src_r1[0] << 24; + dst2[3] = src_r1[0] >> 8 | src_r1[1] << 24; + break; + + case 28: + dst1[3] = src_r1[0]; + dst2[0] = src_r0[1]; + dst2[1] = src_r0[2]; + dst2[2] = src_r0[3]; + dst2[3] = src_r1[0]; + break; + + case 29: + dst1[3] = src_l1[3] | src_r0[0] << 8; + dst2[0] = src_r0[0] >> 24 | src_r0[1] << 8; + dst2[1] = src_r0[1] >> 24 | src_r0[2] << 8; + dst2[2] = src_r0[2] >> 24 | src_r0[3] << 8; + dst2[3] = src_r0[3] >> 24 | src_r1[0] << 8; + break; + + case 30: + dst1[3] = src_l1[3] | src_r0[0] << 16; + dst2[0] = src_r0[0] >> 16 | src_r0[1] << 16; + dst2[1] = src_r0[1] >> 16 | src_r0[2] << 16; + dst2[2] = src_r0[2] >> 16 | src_r0[3] << 16; + dst2[3] = src_r0[3] >> 16 | src_r1[0] << 16; + break; + + case 31: + dst1[3] = src_l1[3] | src_r0[0] << 24; + dst2[0] = src_r0[0] >> 8 | src_r0[1] << 24; + dst2[1] = src_r0[1] >> 8 | src_r0[2] << 24; + dst2[2] = src_r0[2] >> 8 | src_r0[3] << 24; + dst2[3] = src_r0[3] >> 8 | src_r1[0] << 24; + break; + + case 32: + dst2[0] = src_r0[0]; + dst2[1] = src_r0[1]; + dst2[2] = src_r0[2]; + dst2[3] = src_r0[3]; + break; + + case 33: + dst2[0] = src_l2[0] | src_r0[0] << 8; + dst2[1] = src_r0[0] >> 24 | src_r0[1] << 8; + dst2[2] = src_r0[1] >> 24 | src_r0[2] << 8; + dst2[3] = src_r0[2] >> 24 | src_r0[3] << 8; + break; + + case 34: + dst2[0] = src_l2[0] | src_r0[0] << 16; + dst2[1] = src_r0[0] >> 16 | src_r0[1] << 16; + dst2[2] = src_r0[1] >> 16 | src_r0[2] << 16; + dst2[3] = src_r0[2] >> 16 | src_r0[3] << 16; + break; + + case 35: + dst2[0] = src_l2[0] | src_r0[0] << 24; + dst2[1] = src_r0[0] >> 8 | src_r0[1] << 24; + dst2[2] = src_r0[1] >> 8 | src_r0[2] << 24; + dst2[3] = src_r0[2] >> 8 | src_r0[3] << 24; + break; + + case 36: + dst2[1] = src_r0[0]; + dst2[2] = src_r0[1]; + dst2[3] = src_r0[2]; + break; + + case 37: + dst2[1] = src_l2[1] | src_r0[0] << 8; + dst2[2] = src_r0[0] >> 24 | src_r0[1] << 8; + dst2[3] = src_r0[1] >> 24 | src_r0[2] << 8; + break; + + case 38: + dst2[1] = src_l2[1] | src_r0[0] << 16; + dst2[2] = src_r0[0] >> 16 | src_r0[1] << 16; + dst2[3] = src_r0[1] >> 16 | src_r0[2] << 16; + break; + + case 39: + dst2[1] = src_l2[1] | src_r0[0] << 24; + dst2[2] = src_r0[0] >> 8 | src_r0[1] << 24; + dst2[3] = src_r0[1] >> 8 | src_r0[2] << 24; + break; + + case 40: + dst2[2] = src_r0[0]; + dst2[3] = src_r0[1]; + break; + + case 41: + dst2[2] = src_l2[2] | src_r0[0] << 8; + dst2[3] = src_r0[0] >> 24 | src_r0[1] << 8; + break; + + case 42: + dst2[2] = src_l2[2] | src_r0[0] << 16; + dst2[3] = src_r0[0] >> 16 | src_r0[1] << 16; + break; + + case 43: + dst2[2] = src_l2[2] | src_r0[0] << 24; + dst2[3] = src_r0[0] >> 8 | src_r0[1] << 24; + break; + + case 44: + dst2[3] = src_r0[0]; + break; + + case 45: + dst2[3] = src_l2[3] | src_r0[0] << 8; + break; + + case 46: + dst2[3] = src_l2[3] | src_r0[0] << 16; + break; + + case 47: + dst2[3] = src_l2[3] | src_r0[0] << 24; + break; + } +} + +static void memcat16_9 (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], const u32 append0[4], const u32 append1[4], const u32 append2[4], const u32 offset) +{ + switch (offset) + { + case 0: + w0[0] = append0[0]; + w0[1] = append0[1]; + w0[2] = append0[2]; + w0[3] = append0[3]; + w1[0] = append1[0]; + w1[1] = append1[1]; + w1[2] = append1[2]; + w1[3] = append1[3]; + w2[0] = append2[0]; + break; + + case 1: + w0[0] = w0[0] | append0[0] << 8; + w0[1] = append0[0] >> 24 | append0[1] << 8; + w0[2] = append0[1] >> 24 | append0[2] << 8; + w0[3] = append0[2] >> 24 | append0[3] << 8; + w1[0] = append0[3] >> 24 | append1[0] << 8; + w1[1] = append1[0] >> 24 | append1[1] << 8; + w1[2] = append1[1] >> 24 | append1[2] << 8; + w1[3] = append1[2] >> 24 | append1[3] << 8; + w2[0] = append1[3] >> 24 | append2[0] << 8; + w2[1] = append2[0] >> 24; + break; + + case 2: + w0[0] = w0[0] | append0[0] << 16; + w0[1] = append0[0] >> 16 | append0[1] << 16; + w0[2] = append0[1] >> 16 | append0[2] << 16; + w0[3] = append0[2] >> 16 | append0[3] << 16; + w1[0] = append0[3] >> 16 | append1[0] << 16; + w1[1] = append1[0] >> 16 | append1[1] << 16; + w1[2] = append1[1] >> 16 | append1[2] << 16; + w1[3] = append1[2] >> 16 | append1[3] << 16; + w2[0] = append1[3] >> 16 | append2[0] << 16; + w2[1] = append2[0] >> 16; + break; + + case 3: + w0[0] = w0[0] | append0[0] << 24; + w0[1] = append0[0] >> 8 | append0[1] << 24; + w0[2] = append0[1] >> 8 | append0[2] << 24; + w0[3] = append0[2] >> 8 | append0[3] << 24; + w1[0] = append0[3] >> 8 | append1[0] << 24; + w1[1] = append1[0] >> 8 | append1[1] << 24; + w1[2] = append1[1] >> 8 | append1[2] << 24; + w1[3] = append1[2] >> 8 | append1[3] << 24; + w2[0] = append1[3] >> 8 | append2[0] << 24; + w2[1] = append2[0] >> 8; + break; + + case 4: + w0[1] = append0[0]; + w0[2] = append0[1]; + w0[3] = append0[2]; + w1[0] = append0[3]; + w1[1] = append1[0]; + w1[2] = append1[1]; + w1[3] = append1[2]; + w2[0] = append1[3]; + w2[1] = append2[0]; + break; + + case 5: + w0[1] = w0[1] | append0[0] << 8; + w0[2] = append0[0] >> 24 | append0[1] << 8; + w0[3] = append0[1] >> 24 | append0[2] << 8; + w1[0] = append0[2] >> 24 | append0[3] << 8; + w1[1] = append0[3] >> 24 | append1[0] << 8; + w1[2] = append1[0] >> 24 | append1[1] << 8; + w1[3] = append1[1] >> 24 | append1[2] << 8; + w2[0] = append1[2] >> 24 | append1[3] << 8; + w2[1] = append1[3] >> 24 | append2[0] << 8; + w2[2] = append2[0] >> 24; + break; + + case 6: + w0[1] = w0[1] | append0[0] << 16; + w0[2] = append0[0] >> 16 | append0[1] << 16; + w0[3] = append0[1] >> 16 | append0[2] << 16; + w1[0] = append0[2] >> 16 | append0[3] << 16; + w1[1] = append0[3] >> 16 | append1[0] << 16; + w1[2] = append1[0] >> 16 | append1[1] << 16; + w1[3] = append1[1] >> 16 | append1[2] << 16; + w2[0] = append1[2] >> 16 | append1[3] << 16; + w2[1] = append1[3] >> 16 | append2[0] << 16; + w2[2] = append2[0] >> 16; + break; + + case 7: + w0[1] = w0[1] | append0[0] << 24; + w0[2] = append0[0] >> 8 | append0[1] << 24; + w0[3] = append0[1] >> 8 | append0[2] << 24; + w1[0] = append0[2] >> 8 | append0[3] << 24; + w1[1] = append0[3] >> 8 | append1[0] << 24; + w1[2] = append1[0] >> 8 | append1[1] << 24; + w1[3] = append1[1] >> 8 | append1[2] << 24; + w2[0] = append1[2] >> 8 | append1[3] << 24; + w2[1] = append1[3] >> 8 | append2[0] << 24; + w2[2] = append2[0] >> 8; + break; + + case 8: + w0[2] = append0[0]; + w0[3] = append0[1]; + w1[0] = append0[2]; + w1[1] = append0[3]; + w1[2] = append1[0]; + w1[3] = append1[1]; + w2[0] = append1[2]; + w2[1] = append1[3]; + w2[2] = append2[0]; + break; + + case 9: + w0[2] = w0[2] | append0[0] << 8; + w0[3] = append0[0] >> 24 | append0[1] << 8; + w1[0] = append0[1] >> 24 | append0[2] << 8; + w1[1] = append0[2] >> 24 | append0[3] << 8; + w1[2] = append0[3] >> 24 | append1[0] << 8; + w1[3] = append1[0] >> 24 | append1[1] << 8; + w2[0] = append1[1] >> 24 | append1[2] << 8; + w2[1] = append1[2] >> 24 | append1[3] << 8; + w2[2] = append1[3] >> 24 | append2[0] << 8; + w2[3] = append2[0] >> 24; + break; + + case 10: + w0[2] = w0[2] | append0[0] << 16; + w0[3] = append0[0] >> 16 | append0[1] << 16; + w1[0] = append0[1] >> 16 | append0[2] << 16; + w1[1] = append0[2] >> 16 | append0[3] << 16; + w1[2] = append0[3] >> 16 | append1[0] << 16; + w1[3] = append1[0] >> 16 | append1[1] << 16; + w2[0] = append1[1] >> 16 | append1[2] << 16; + w2[1] = append1[2] >> 16 | append1[3] << 16; + w2[2] = append1[3] >> 16 | append2[0] << 16; + w2[3] = append2[0] >> 16; + break; + + case 11: + w0[2] = w0[2] | append0[0] << 24; + w0[3] = append0[0] >> 8 | append0[1] << 24; + w1[0] = append0[1] >> 8 | append0[2] << 24; + w1[1] = append0[2] >> 8 | append0[3] << 24; + w1[2] = append0[3] >> 8 | append1[0] << 24; + w1[3] = append1[0] >> 8 | append1[1] << 24; + w2[0] = append1[1] >> 8 | append1[2] << 24; + w2[1] = append1[2] >> 8 | append1[3] << 24; + w2[2] = append1[3] >> 8 | append2[0] << 24; + w2[3] = append2[0] >> 8; + break; + + case 12: + w0[3] = append0[0]; + w1[0] = append0[1]; + w1[1] = append0[2]; + w1[2] = append0[3]; + w1[3] = append1[0]; + w2[0] = append1[1]; + w2[1] = append1[2]; + w2[2] = append1[3]; + w2[3] = append2[0]; + break; + + case 13: + w0[3] = w0[3] | append0[0] << 8; + w1[0] = append0[0] >> 24 | append0[1] << 8; + w1[1] = append0[1] >> 24 | append0[2] << 8; + w1[2] = append0[2] >> 24 | append0[3] << 8; + w1[3] = append0[3] >> 24 | append1[0] << 8; + w2[0] = append1[0] >> 24 | append1[1] << 8; + w2[1] = append1[1] >> 24 | append1[2] << 8; + w2[2] = append1[2] >> 24 | append1[3] << 8; + w2[3] = append1[3] >> 24 | append2[0] << 8; + w3[0] = append2[0] >> 24; + break; + + case 14: + w0[3] = w0[3] | append0[0] << 16; + w1[0] = append0[0] >> 16 | append0[1] << 16; + w1[1] = append0[1] >> 16 | append0[2] << 16; + w1[2] = append0[2] >> 16 | append0[3] << 16; + w1[3] = append0[3] >> 16 | append1[0] << 16; + w2[0] = append1[0] >> 16 | append1[1] << 16; + w2[1] = append1[1] >> 16 | append1[2] << 16; + w2[2] = append1[2] >> 16 | append1[3] << 16; + w2[3] = append1[3] >> 16 | append2[0] << 16; + w3[0] = append2[0] >> 16; + break; + + case 15: + w0[3] = w0[3] | append0[0] << 24; + w1[0] = append0[0] >> 8 | append0[1] << 24; + w1[1] = append0[1] >> 8 | append0[2] << 24; + w1[2] = append0[2] >> 8 | append0[3] << 24; + w1[3] = append0[3] >> 8 | append1[0] << 24; + w2[0] = append1[0] >> 8 | append1[1] << 24; + w2[1] = append1[1] >> 8 | append1[2] << 24; + w2[2] = append1[2] >> 8 | append1[3] << 24; + w2[3] = append1[3] >> 8 | append2[0] << 24; + w3[0] = append2[0] >> 8; + break; + } +} + +static void memcat16_9 (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], const u32x append0[4], const u32x append1[4], const u32x append2[4], const u32 offset) +{ + switch (offset) + { + case 0: + w0[0] = append0[0]; + w0[1] = append0[1]; + w0[2] = append0[2]; + w0[3] = append0[3]; + w1[0] = append1[0]; + w1[1] = append1[1]; + w1[2] = append1[2]; + w1[3] = append1[3]; + w2[0] = append2[0]; + break; + + case 1: + w0[0] = w0[0] | append0[0] << 8; + w0[1] = append0[0] >> 24 | append0[1] << 8; + w0[2] = append0[1] >> 24 | append0[2] << 8; + w0[3] = append0[2] >> 24 | append0[3] << 8; + w1[0] = append0[3] >> 24 | append1[0] << 8; + w1[1] = append1[0] >> 24 | append1[1] << 8; + w1[2] = append1[1] >> 24 | append1[2] << 8; + w1[3] = append1[2] >> 24 | append1[3] << 8; + w2[0] = append1[3] >> 24 | append2[0] << 8; + w2[1] = append2[0] >> 24; + break; + + case 2: + w0[0] = w0[0] | append0[0] << 16; + w0[1] = append0[0] >> 16 | append0[1] << 16; + w0[2] = append0[1] >> 16 | append0[2] << 16; + w0[3] = append0[2] >> 16 | append0[3] << 16; + w1[0] = append0[3] >> 16 | append1[0] << 16; + w1[1] = append1[0] >> 16 | append1[1] << 16; + w1[2] = append1[1] >> 16 | append1[2] << 16; + w1[3] = append1[2] >> 16 | append1[3] << 16; + w2[0] = append1[3] >> 16 | append2[0] << 16; + w2[1] = append2[0] >> 16; + break; + + case 3: + w0[0] = w0[0] | append0[0] << 24; + w0[1] = append0[0] >> 8 | append0[1] << 24; + w0[2] = append0[1] >> 8 | append0[2] << 24; + w0[3] = append0[2] >> 8 | append0[3] << 24; + w1[0] = append0[3] >> 8 | append1[0] << 24; + w1[1] = append1[0] >> 8 | append1[1] << 24; + w1[2] = append1[1] >> 8 | append1[2] << 24; + w1[3] = append1[2] >> 8 | append1[3] << 24; + w2[0] = append1[3] >> 8 | append2[0] << 24; + w2[1] = append2[0] >> 8; + break; + + case 4: + w0[1] = append0[0]; + w0[2] = append0[1]; + w0[3] = append0[2]; + w1[0] = append0[3]; + w1[1] = append1[0]; + w1[2] = append1[1]; + w1[3] = append1[2]; + w2[0] = append1[3]; + w2[1] = append2[0]; + break; + + case 5: + w0[1] = w0[1] | append0[0] << 8; + w0[2] = append0[0] >> 24 | append0[1] << 8; + w0[3] = append0[1] >> 24 | append0[2] << 8; + w1[0] = append0[2] >> 24 | append0[3] << 8; + w1[1] = append0[3] >> 24 | append1[0] << 8; + w1[2] = append1[0] >> 24 | append1[1] << 8; + w1[3] = append1[1] >> 24 | append1[2] << 8; + w2[0] = append1[2] >> 24 | append1[3] << 8; + w2[1] = append1[3] >> 24 | append2[0] << 8; + w2[2] = append2[0] >> 24; + break; + + case 6: + w0[1] = w0[1] | append0[0] << 16; + w0[2] = append0[0] >> 16 | append0[1] << 16; + w0[3] = append0[1] >> 16 | append0[2] << 16; + w1[0] = append0[2] >> 16 | append0[3] << 16; + w1[1] = append0[3] >> 16 | append1[0] << 16; + w1[2] = append1[0] >> 16 | append1[1] << 16; + w1[3] = append1[1] >> 16 | append1[2] << 16; + w2[0] = append1[2] >> 16 | append1[3] << 16; + w2[1] = append1[3] >> 16 | append2[0] << 16; + w2[2] = append2[0] >> 16; + break; + + case 7: + w0[1] = w0[1] | append0[0] << 24; + w0[2] = append0[0] >> 8 | append0[1] << 24; + w0[3] = append0[1] >> 8 | append0[2] << 24; + w1[0] = append0[2] >> 8 | append0[3] << 24; + w1[1] = append0[3] >> 8 | append1[0] << 24; + w1[2] = append1[0] >> 8 | append1[1] << 24; + w1[3] = append1[1] >> 8 | append1[2] << 24; + w2[0] = append1[2] >> 8 | append1[3] << 24; + w2[1] = append1[3] >> 8 | append2[0] << 24; + w2[2] = append2[0] >> 8; + break; + + case 8: + w0[2] = append0[0]; + w0[3] = append0[1]; + w1[0] = append0[2]; + w1[1] = append0[3]; + w1[2] = append1[0]; + w1[3] = append1[1]; + w2[0] = append1[2]; + w2[1] = append1[3]; + w2[2] = append2[0]; + break; + + case 9: + w0[2] = w0[2] | append0[0] << 8; + w0[3] = append0[0] >> 24 | append0[1] << 8; + w1[0] = append0[1] >> 24 | append0[2] << 8; + w1[1] = append0[2] >> 24 | append0[3] << 8; + w1[2] = append0[3] >> 24 | append1[0] << 8; + w1[3] = append1[0] >> 24 | append1[1] << 8; + w2[0] = append1[1] >> 24 | append1[2] << 8; + w2[1] = append1[2] >> 24 | append1[3] << 8; + w2[2] = append1[3] >> 24 | append2[0] << 8; + w2[3] = append2[0] >> 24; + break; + + case 10: + w0[2] = w0[2] | append0[0] << 16; + w0[3] = append0[0] >> 16 | append0[1] << 16; + w1[0] = append0[1] >> 16 | append0[2] << 16; + w1[1] = append0[2] >> 16 | append0[3] << 16; + w1[2] = append0[3] >> 16 | append1[0] << 16; + w1[3] = append1[0] >> 16 | append1[1] << 16; + w2[0] = append1[1] >> 16 | append1[2] << 16; + w2[1] = append1[2] >> 16 | append1[3] << 16; + w2[2] = append1[3] >> 16 | append2[0] << 16; + w2[3] = append2[0] >> 16; + break; + + case 11: + w0[2] = w0[2] | append0[0] << 24; + w0[3] = append0[0] >> 8 | append0[1] << 24; + w1[0] = append0[1] >> 8 | append0[2] << 24; + w1[1] = append0[2] >> 8 | append0[3] << 24; + w1[2] = append0[3] >> 8 | append1[0] << 24; + w1[3] = append1[0] >> 8 | append1[1] << 24; + w2[0] = append1[1] >> 8 | append1[2] << 24; + w2[1] = append1[2] >> 8 | append1[3] << 24; + w2[2] = append1[3] >> 8 | append2[0] << 24; + w2[3] = append2[0] >> 8; + break; + + case 12: + w0[3] = append0[0]; + w1[0] = append0[1]; + w1[1] = append0[2]; + w1[2] = append0[3]; + w1[3] = append1[0]; + w2[0] = append1[1]; + w2[1] = append1[2]; + w2[2] = append1[3]; + w2[3] = append2[0]; + break; + + case 13: + w0[3] = w0[3] | append0[0] << 8; + w1[0] = append0[0] >> 24 | append0[1] << 8; + w1[1] = append0[1] >> 24 | append0[2] << 8; + w1[2] = append0[2] >> 24 | append0[3] << 8; + w1[3] = append0[3] >> 24 | append1[0] << 8; + w2[0] = append1[0] >> 24 | append1[1] << 8; + w2[1] = append1[1] >> 24 | append1[2] << 8; + w2[2] = append1[2] >> 24 | append1[3] << 8; + w2[3] = append1[3] >> 24 | append2[0] << 8; + w3[0] = append2[0] >> 24; + break; + + case 14: + w0[3] = w0[3] | append0[0] << 16; + w1[0] = append0[0] >> 16 | append0[1] << 16; + w1[1] = append0[1] >> 16 | append0[2] << 16; + w1[2] = append0[2] >> 16 | append0[3] << 16; + w1[3] = append0[3] >> 16 | append1[0] << 16; + w2[0] = append1[0] >> 16 | append1[1] << 16; + w2[1] = append1[1] >> 16 | append1[2] << 16; + w2[2] = append1[2] >> 16 | append1[3] << 16; + w2[3] = append1[3] >> 16 | append2[0] << 16; + w3[0] = append2[0] >> 16; + break; + + case 15: + w0[3] = w0[3] | append0[0] << 24; + w1[0] = append0[0] >> 8 | append0[1] << 24; + w1[1] = append0[1] >> 8 | append0[2] << 24; + w1[2] = append0[2] >> 8 | append0[3] << 24; + w1[3] = append0[3] >> 8 | append1[0] << 24; + w2[0] = append1[0] >> 8 | append1[1] << 24; + w2[1] = append1[1] >> 8 | append1[2] << 24; + w2[2] = append1[2] >> 8 | append1[3] << 24; + w2[3] = append1[3] >> 8 | append2[0] << 24; + w3[0] = append2[0] >> 8; + break; + } +} + +static void memcat32_8 (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], const u32 append0[4], const u32 append1[4], const u32 offset) +{ + switch (offset) + { + case 0: + w0[0] = append0[0]; + w0[1] = append0[1]; + w0[2] = append0[2]; + w0[3] = append0[3]; + w1[0] = append1[0]; + w1[1] = append1[1]; + w1[2] = append1[2]; + w1[3] = append1[3]; + break; + + case 1: + w0[0] = w0[0] | append0[0] << 8; + w0[1] = append0[0] >> 24 | append0[1] << 8; + w0[2] = append0[1] >> 24 | append0[2] << 8; + w0[3] = append0[2] >> 24 | append0[3] << 8; + w1[0] = append0[3] >> 24 | append1[0] << 8; + w1[1] = append1[0] >> 24 | append1[1] << 8; + w1[2] = append1[1] >> 24 | append1[2] << 8; + w1[3] = append1[2] >> 24 | append1[3] << 8; + w2[0] = append1[3] >> 24; + break; + + case 2: + w0[0] = w0[0] | append0[0] << 16; + w0[1] = append0[0] >> 16 | append0[1] << 16; + w0[2] = append0[1] >> 16 | append0[2] << 16; + w0[3] = append0[2] >> 16 | append0[3] << 16; + w1[0] = append0[3] >> 16 | append1[0] << 16; + w1[1] = append1[0] >> 16 | append1[1] << 16; + w1[2] = append1[1] >> 16 | append1[2] << 16; + w1[3] = append1[2] >> 16 | append1[3] << 16; + w2[0] = append1[3] >> 16; + break; + + case 3: + w0[0] = w0[0] | append0[0] << 24; + w0[1] = append0[0] >> 8 | append0[1] << 24; + w0[2] = append0[1] >> 8 | append0[2] << 24; + w0[3] = append0[2] >> 8 | append0[3] << 24; + w1[0] = append0[3] >> 8 | append1[0] << 24; + w1[1] = append1[0] >> 8 | append1[1] << 24; + w1[2] = append1[1] >> 8 | append1[2] << 24; + w1[3] = append1[2] >> 8 | append1[3] << 24; + w2[0] = append1[3] >> 8; + break; + + case 4: + w0[1] = append0[0]; + w0[2] = append0[1]; + w0[3] = append0[2]; + w1[0] = append0[3]; + w1[1] = append1[0]; + w1[2] = append1[1]; + w1[3] = append1[2]; + w2[0] = append1[3]; + break; + + case 5: + w0[1] = w0[1] | append0[0] << 8; + w0[2] = append0[0] >> 24 | append0[1] << 8; + w0[3] = append0[1] >> 24 | append0[2] << 8; + w1[0] = append0[2] >> 24 | append0[3] << 8; + w1[1] = append0[3] >> 24 | append1[0] << 8; + w1[2] = append1[0] >> 24 | append1[1] << 8; + w1[3] = append1[1] >> 24 | append1[2] << 8; + w2[0] = append1[2] >> 24 | append1[3] << 8; + w2[1] = append1[3] >> 24; + break; + + case 6: + w0[1] = w0[1] | append0[0] << 16; + w0[2] = append0[0] >> 16 | append0[1] << 16; + w0[3] = append0[1] >> 16 | append0[2] << 16; + w1[0] = append0[2] >> 16 | append0[3] << 16; + w1[1] = append0[3] >> 16 | append1[0] << 16; + w1[2] = append1[0] >> 16 | append1[1] << 16; + w1[3] = append1[1] >> 16 | append1[2] << 16; + w2[0] = append1[2] >> 16 | append1[3] << 16; + w2[1] = append1[3] >> 16; + break; + + case 7: + w0[1] = w0[1] | append0[0] << 24; + w0[2] = append0[0] >> 8 | append0[1] << 24; + w0[3] = append0[1] >> 8 | append0[2] << 24; + w1[0] = append0[2] >> 8 | append0[3] << 24; + w1[1] = append0[3] >> 8 | append1[0] << 24; + w1[2] = append1[0] >> 8 | append1[1] << 24; + w1[3] = append1[1] >> 8 | append1[2] << 24; + w2[0] = append1[2] >> 8 | append1[3] << 24; + w2[1] = append1[3] >> 8; + break; + + case 8: + w0[2] = append0[0]; + w0[3] = append0[1]; + w1[0] = append0[2]; + w1[1] = append0[3]; + w1[2] = append1[0]; + w1[3] = append1[1]; + w2[0] = append1[2]; + w2[1] = append1[3]; + break; + + case 9: + w0[2] = w0[2] | append0[0] << 8; + w0[3] = append0[0] >> 24 | append0[1] << 8; + w1[0] = append0[1] >> 24 | append0[2] << 8; + w1[1] = append0[2] >> 24 | append0[3] << 8; + w1[2] = append0[3] >> 24 | append1[0] << 8; + w1[3] = append1[0] >> 24 | append1[1] << 8; + w2[0] = append1[1] >> 24 | append1[2] << 8; + w2[1] = append1[2] >> 24 | append1[3] << 8; + w2[2] = append1[3] >> 24; + break; + + case 10: + w0[2] = w0[2] | append0[0] << 16; + w0[3] = append0[0] >> 16 | append0[1] << 16; + w1[0] = append0[1] >> 16 | append0[2] << 16; + w1[1] = append0[2] >> 16 | append0[3] << 16; + w1[2] = append0[3] >> 16 | append1[0] << 16; + w1[3] = append1[0] >> 16 | append1[1] << 16; + w2[0] = append1[1] >> 16 | append1[2] << 16; + w2[1] = append1[2] >> 16 | append1[3] << 16; + w2[2] = append1[3] >> 16; + break; + + case 11: + w0[2] = w0[2] | append0[0] << 24; + w0[3] = append0[0] >> 8 | append0[1] << 24; + w1[0] = append0[1] >> 8 | append0[2] << 24; + w1[1] = append0[2] >> 8 | append0[3] << 24; + w1[2] = append0[3] >> 8 | append1[0] << 24; + w1[3] = append1[0] >> 8 | append1[1] << 24; + w2[0] = append1[1] >> 8 | append1[2] << 24; + w2[1] = append1[2] >> 8 | append1[3] << 24; + w2[2] = append1[3] >> 8; + break; + + case 12: + w0[3] = append0[0]; + w1[0] = append0[1]; + w1[1] = append0[2]; + w1[2] = append0[3]; + w1[3] = append1[0]; + w2[0] = append1[1]; + w2[1] = append1[2]; + w2[2] = append1[3]; + break; + + case 13: + w0[3] = w0[3] | append0[0] << 8; + w1[0] = append0[0] >> 24 | append0[1] << 8; + w1[1] = append0[1] >> 24 | append0[2] << 8; + w1[2] = append0[2] >> 24 | append0[3] << 8; + w1[3] = append0[3] >> 24 | append1[0] << 8; + w2[0] = append1[0] >> 24 | append1[1] << 8; + w2[1] = append1[1] >> 24 | append1[2] << 8; + w2[2] = append1[2] >> 24 | append1[3] << 8; + w2[3] = append1[3] >> 24; + break; + + case 14: + w0[3] = w0[3] | append0[0] << 16; + w1[0] = append0[0] >> 16 | append0[1] << 16; + w1[1] = append0[1] >> 16 | append0[2] << 16; + w1[2] = append0[2] >> 16 | append0[3] << 16; + w1[3] = append0[3] >> 16 | append1[0] << 16; + w2[0] = append1[0] >> 16 | append1[1] << 16; + w2[1] = append1[1] >> 16 | append1[2] << 16; + w2[2] = append1[2] >> 16 | append1[3] << 16; + w2[3] = append1[3] >> 16; + break; + + case 15: + w0[3] = w0[3] | append0[0] << 24; + w1[0] = append0[0] >> 8 | append0[1] << 24; + w1[1] = append0[1] >> 8 | append0[2] << 24; + w1[2] = append0[2] >> 8 | append0[3] << 24; + w1[3] = append0[3] >> 8 | append1[0] << 24; + w2[0] = append1[0] >> 8 | append1[1] << 24; + w2[1] = append1[1] >> 8 | append1[2] << 24; + w2[2] = append1[2] >> 8 | append1[3] << 24; + w2[3] = append1[3] >> 8; + break; + + case 16: + w1[0] = append0[0]; + w1[1] = append0[1]; + w1[2] = append0[2]; + w1[3] = append0[3]; + w2[0] = append1[0]; + w2[1] = append1[1]; + w2[2] = append1[2]; + w2[3] = append1[3]; + break; + + case 17: + w1[0] = w1[0] | append0[0] << 8; + w1[1] = append0[0] >> 24 | append0[1] << 8; + w1[2] = append0[1] >> 24 | append0[2] << 8; + w1[3] = append0[2] >> 24 | append0[3] << 8; + w2[0] = append0[3] >> 24 | append1[0] << 8; + w2[1] = append1[0] >> 24 | append1[1] << 8; + w2[2] = append1[1] >> 24 | append1[2] << 8; + w2[3] = append1[2] >> 24 | append1[3] << 8; + w3[0] = append1[3] >> 24; + break; + + case 18: + w1[0] = w1[0] | append0[0] << 16; + w1[1] = append0[0] >> 16 | append0[1] << 16; + w1[2] = append0[1] >> 16 | append0[2] << 16; + w1[3] = append0[2] >> 16 | append0[3] << 16; + w2[0] = append0[3] >> 16 | append1[0] << 16; + w2[1] = append1[0] >> 16 | append1[1] << 16; + w2[2] = append1[1] >> 16 | append1[2] << 16; + w2[3] = append1[2] >> 16 | append1[3] << 16; + w3[0] = append1[3] >> 16; + break; + + case 19: + w1[0] = w1[0] | append0[0] << 24; + w1[1] = append0[0] >> 8 | append0[1] << 24; + w1[2] = append0[1] >> 8 | append0[2] << 24; + w1[3] = append0[2] >> 8 | append0[3] << 24; + w2[0] = append0[3] >> 8 | append1[0] << 24; + w2[1] = append1[0] >> 8 | append1[1] << 24; + w2[2] = append1[1] >> 8 | append1[2] << 24; + w2[3] = append1[2] >> 8 | append1[3] << 24; + w3[0] = append1[3] >> 8; + break; + + case 20: + w1[1] = append0[0]; + w1[2] = append0[1]; + w1[3] = append0[2]; + w2[0] = append0[3]; + w2[1] = append1[0]; + w2[2] = append1[1]; + w2[3] = append1[2]; + w3[0] = append1[3]; + break; + + case 21: + w1[1] = w1[1] | append0[0] << 8; + w1[2] = append0[0] >> 24 | append0[1] << 8; + w1[3] = append0[1] >> 24 | append0[2] << 8; + w2[0] = append0[2] >> 24 | append0[3] << 8; + w2[1] = append0[3] >> 24 | append1[0] << 8; + w2[2] = append1[0] >> 24 | append1[1] << 8; + w2[3] = append1[1] >> 24 | append1[2] << 8; + w3[0] = append1[2] >> 24 | append1[3] << 8; + w3[1] = append1[3] >> 24; + break; + + case 22: + w1[1] = w1[1] | append0[0] << 16; + w1[2] = append0[0] >> 16 | append0[1] << 16; + w1[3] = append0[1] >> 16 | append0[2] << 16; + w2[0] = append0[2] >> 16 | append0[3] << 16; + w2[1] = append0[3] >> 16 | append1[0] << 16; + w2[2] = append1[0] >> 16 | append1[1] << 16; + w2[3] = append1[1] >> 16 | append1[2] << 16; + w3[0] = append1[2] >> 16 | append1[3] << 16; + w3[1] = append1[3] >> 16; + break; + + case 23: + w1[1] = w1[1] | append0[0] << 24; + w1[2] = append0[0] >> 8 | append0[1] << 24; + w1[3] = append0[1] >> 8 | append0[2] << 24; + w2[0] = append0[2] >> 8 | append0[3] << 24; + w2[1] = append0[3] >> 8 | append1[0] << 24; + w2[2] = append1[0] >> 8 | append1[1] << 24; + w2[3] = append1[1] >> 8 | append1[2] << 24; + w3[0] = append1[2] >> 8 | append1[3] << 24; + w3[1] = append1[3] >> 8; + break; + + case 24: + w1[2] = append0[0]; + w1[3] = append0[1]; + w2[0] = append0[2]; + w2[1] = append0[3]; + w2[2] = append1[0]; + w2[3] = append1[1]; + w3[0] = append1[2]; + w3[1] = append1[3]; + break; + + case 25: + w1[2] = w1[2] | append0[0] << 8; + w1[3] = append0[0] >> 24 | append0[1] << 8; + w2[0] = append0[1] >> 24 | append0[2] << 8; + w2[1] = append0[2] >> 24 | append0[3] << 8; + w2[2] = append0[3] >> 24 | append1[0] << 8; + w2[3] = append1[0] >> 24 | append1[1] << 8; + w3[0] = append1[1] >> 24 | append1[2] << 8; + w3[1] = append1[2] >> 24 | append1[3] << 8; + break; + + case 26: + w1[2] = w1[2] | append0[0] << 16; + w1[3] = append0[0] >> 16 | append0[1] << 16; + w2[0] = append0[1] >> 16 | append0[2] << 16; + w2[1] = append0[2] >> 16 | append0[3] << 16; + w2[2] = append0[3] >> 16 | append1[0] << 16; + w2[3] = append1[0] >> 16 | append1[1] << 16; + w3[0] = append1[1] >> 16 | append1[2] << 16; + w3[1] = append1[2] >> 16 | append1[3] << 16; + break; + + case 27: + w1[2] = w1[2] | append0[0] << 24; + w1[3] = append0[0] >> 8 | append0[1] << 24; + w2[0] = append0[1] >> 8 | append0[2] << 24; + w2[1] = append0[2] >> 8 | append0[3] << 24; + w2[2] = append0[3] >> 8 | append1[0] << 24; + w2[3] = append1[0] >> 8 | append1[1] << 24; + w3[0] = append1[1] >> 8 | append1[2] << 24; + w3[1] = append1[2] >> 8 | append1[3] << 24; + break; + + case 28: + w1[3] = append0[0]; + w2[0] = append0[1]; + w2[1] = append0[2]; + w2[2] = append0[3]; + w2[3] = append1[0]; + w3[0] = append1[1]; + w3[1] = append1[2]; + break; + + case 29: + w1[3] = w1[3] | append0[0] << 8; + w2[0] = append0[0] >> 24 | append0[1] << 8; + w2[1] = append0[1] >> 24 | append0[2] << 8; + w2[2] = append0[2] >> 24 | append0[3] << 8; + w2[3] = append0[3] >> 24 | append1[0] << 8; + w3[0] = append1[0] >> 24 | append1[1] << 8; + w3[1] = append1[1] >> 24 | append1[2] << 8; + break; + + case 30: + w1[3] = w1[3] | append0[0] << 16; + w2[0] = append0[0] >> 16 | append0[1] << 16; + w2[1] = append0[1] >> 16 | append0[2] << 16; + w2[2] = append0[2] >> 16 | append0[3] << 16; + w2[3] = append0[3] >> 16 | append1[0] << 16; + w3[0] = append1[0] >> 16 | append1[1] << 16; + w3[1] = append1[1] >> 16 | append1[2] << 16; + break; + + case 31: + w1[3] = w1[3] | append0[0] << 24; + w2[0] = append0[0] >> 8 | append0[1] << 24; + w2[1] = append0[1] >> 8 | append0[2] << 24; + w2[2] = append0[2] >> 8 | append0[3] << 24; + w2[3] = append0[3] >> 8 | append1[0] << 24; + w3[0] = append1[0] >> 8 | append1[1] << 24; + w3[1] = append1[1] >> 8 | append1[2] << 24; + break; + + case 32: + w2[0] = append0[0]; + w2[1] = append0[1]; + w2[2] = append0[2]; + w2[3] = append0[3]; + w3[0] = append1[0]; + w3[1] = append1[1]; + break; + } +} + +static void memcat32_9 (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], const u32 append0[4], const u32 append1[4], const u32 append2[4], const u32 offset) +{ + switch (offset) + { + case 0: + w0[0] = append0[0]; + w0[1] = append0[1]; + w0[2] = append0[2]; + w0[3] = append0[3]; + w1[0] = append1[0]; + w1[1] = append1[1]; + w1[2] = append1[2]; + w1[3] = append1[3]; + w2[0] = append2[0]; + break; + + case 1: + w0[0] = w0[0] | append0[0] << 8; + w0[1] = append0[0] >> 24 | append0[1] << 8; + w0[2] = append0[1] >> 24 | append0[2] << 8; + w0[3] = append0[2] >> 24 | append0[3] << 8; + w1[0] = append0[3] >> 24 | append1[0] << 8; + w1[1] = append1[0] >> 24 | append1[1] << 8; + w1[2] = append1[1] >> 24 | append1[2] << 8; + w1[3] = append1[2] >> 24 | append1[3] << 8; + w2[0] = append1[3] >> 24 | append2[0] << 8; + w2[1] = append2[0] >> 24; + break; + + case 2: + w0[0] = w0[0] | append0[0] << 16; + w0[1] = append0[0] >> 16 | append0[1] << 16; + w0[2] = append0[1] >> 16 | append0[2] << 16; + w0[3] = append0[2] >> 16 | append0[3] << 16; + w1[0] = append0[3] >> 16 | append1[0] << 16; + w1[1] = append1[0] >> 16 | append1[1] << 16; + w1[2] = append1[1] >> 16 | append1[2] << 16; + w1[3] = append1[2] >> 16 | append1[3] << 16; + w2[0] = append1[3] >> 16 | append2[0] << 16; + w2[1] = append2[0] >> 16; + break; + + case 3: + w0[0] = w0[0] | append0[0] << 24; + w0[1] = append0[0] >> 8 | append0[1] << 24; + w0[2] = append0[1] >> 8 | append0[2] << 24; + w0[3] = append0[2] >> 8 | append0[3] << 24; + w1[0] = append0[3] >> 8 | append1[0] << 24; + w1[1] = append1[0] >> 8 | append1[1] << 24; + w1[2] = append1[1] >> 8 | append1[2] << 24; + w1[3] = append1[2] >> 8 | append1[3] << 24; + w2[0] = append1[3] >> 8 | append2[0] << 24; + w2[1] = append2[0] >> 8; + break; + + case 4: + w0[1] = append0[0]; + w0[2] = append0[1]; + w0[3] = append0[2]; + w1[0] = append0[3]; + w1[1] = append1[0]; + w1[2] = append1[1]; + w1[3] = append1[2]; + w2[0] = append1[3]; + w2[1] = append2[0]; + break; + + case 5: + w0[1] = w0[1] | append0[0] << 8; + w0[2] = append0[0] >> 24 | append0[1] << 8; + w0[3] = append0[1] >> 24 | append0[2] << 8; + w1[0] = append0[2] >> 24 | append0[3] << 8; + w1[1] = append0[3] >> 24 | append1[0] << 8; + w1[2] = append1[0] >> 24 | append1[1] << 8; + w1[3] = append1[1] >> 24 | append1[2] << 8; + w2[0] = append1[2] >> 24 | append1[3] << 8; + w2[1] = append1[3] >> 24 | append2[0] << 8; + w2[2] = append2[0] >> 24; + break; + + case 6: + w0[1] = w0[1] | append0[0] << 16; + w0[2] = append0[0] >> 16 | append0[1] << 16; + w0[3] = append0[1] >> 16 | append0[2] << 16; + w1[0] = append0[2] >> 16 | append0[3] << 16; + w1[1] = append0[3] >> 16 | append1[0] << 16; + w1[2] = append1[0] >> 16 | append1[1] << 16; + w1[3] = append1[1] >> 16 | append1[2] << 16; + w2[0] = append1[2] >> 16 | append1[3] << 16; + w2[1] = append1[3] >> 16 | append2[0] << 16; + w2[2] = append2[0] >> 16; + break; + + case 7: + w0[1] = w0[1] | append0[0] << 24; + w0[2] = append0[0] >> 8 | append0[1] << 24; + w0[3] = append0[1] >> 8 | append0[2] << 24; + w1[0] = append0[2] >> 8 | append0[3] << 24; + w1[1] = append0[3] >> 8 | append1[0] << 24; + w1[2] = append1[0] >> 8 | append1[1] << 24; + w1[3] = append1[1] >> 8 | append1[2] << 24; + w2[0] = append1[2] >> 8 | append1[3] << 24; + w2[1] = append1[3] >> 8 | append2[0] << 24; + w2[2] = append2[0] >> 8; + break; + + case 8: + w0[2] = append0[0]; + w0[3] = append0[1]; + w1[0] = append0[2]; + w1[1] = append0[3]; + w1[2] = append1[0]; + w1[3] = append1[1]; + w2[0] = append1[2]; + w2[1] = append1[3]; + w2[2] = append2[0]; + break; + + case 9: + w0[2] = w0[2] | append0[0] << 8; + w0[3] = append0[0] >> 24 | append0[1] << 8; + w1[0] = append0[1] >> 24 | append0[2] << 8; + w1[1] = append0[2] >> 24 | append0[3] << 8; + w1[2] = append0[3] >> 24 | append1[0] << 8; + w1[3] = append1[0] >> 24 | append1[1] << 8; + w2[0] = append1[1] >> 24 | append1[2] << 8; + w2[1] = append1[2] >> 24 | append1[3] << 8; + w2[2] = append1[3] >> 24 | append2[0] << 8; + w2[3] = append2[0] >> 24; + break; + + case 10: + w0[2] = w0[2] | append0[0] << 16; + w0[3] = append0[0] >> 16 | append0[1] << 16; + w1[0] = append0[1] >> 16 | append0[2] << 16; + w1[1] = append0[2] >> 16 | append0[3] << 16; + w1[2] = append0[3] >> 16 | append1[0] << 16; + w1[3] = append1[0] >> 16 | append1[1] << 16; + w2[0] = append1[1] >> 16 | append1[2] << 16; + w2[1] = append1[2] >> 16 | append1[3] << 16; + w2[2] = append1[3] >> 16 | append2[0] << 16; + w2[3] = append2[0] >> 16; + break; + + case 11: + w0[2] = w0[2] | append0[0] << 24; + w0[3] = append0[0] >> 8 | append0[1] << 24; + w1[0] = append0[1] >> 8 | append0[2] << 24; + w1[1] = append0[2] >> 8 | append0[3] << 24; + w1[2] = append0[3] >> 8 | append1[0] << 24; + w1[3] = append1[0] >> 8 | append1[1] << 24; + w2[0] = append1[1] >> 8 | append1[2] << 24; + w2[1] = append1[2] >> 8 | append1[3] << 24; + w2[2] = append1[3] >> 8 | append2[0] << 24; + w2[3] = append2[0] >> 8; + break; + + case 12: + w0[3] = append0[0]; + w1[0] = append0[1]; + w1[1] = append0[2]; + w1[2] = append0[3]; + w1[3] = append1[0]; + w2[0] = append1[1]; + w2[1] = append1[2]; + w2[2] = append1[3]; + w2[3] = append2[0]; + break; + + case 13: + w0[3] = w0[3] | append0[0] << 8; + w1[0] = append0[0] >> 24 | append0[1] << 8; + w1[1] = append0[1] >> 24 | append0[2] << 8; + w1[2] = append0[2] >> 24 | append0[3] << 8; + w1[3] = append0[3] >> 24 | append1[0] << 8; + w2[0] = append1[0] >> 24 | append1[1] << 8; + w2[1] = append1[1] >> 24 | append1[2] << 8; + w2[2] = append1[2] >> 24 | append1[3] << 8; + w2[3] = append1[3] >> 24 | append2[0] << 8; + w3[0] = append2[0] >> 24; + break; + + case 14: + w0[3] = w0[3] | append0[0] << 16; + w1[0] = append0[0] >> 16 | append0[1] << 16; + w1[1] = append0[1] >> 16 | append0[2] << 16; + w1[2] = append0[2] >> 16 | append0[3] << 16; + w1[3] = append0[3] >> 16 | append1[0] << 16; + w2[0] = append1[0] >> 16 | append1[1] << 16; + w2[1] = append1[1] >> 16 | append1[2] << 16; + w2[2] = append1[2] >> 16 | append1[3] << 16; + w2[3] = append1[3] >> 16 | append2[0] << 16; + w3[0] = append2[0] >> 16; + break; + + case 15: + w0[3] = w0[3] | append0[0] << 24; + w1[0] = append0[0] >> 8 | append0[1] << 24; + w1[1] = append0[1] >> 8 | append0[2] << 24; + w1[2] = append0[2] >> 8 | append0[3] << 24; + w1[3] = append0[3] >> 8 | append1[0] << 24; + w2[0] = append1[0] >> 8 | append1[1] << 24; + w2[1] = append1[1] >> 8 | append1[2] << 24; + w2[2] = append1[2] >> 8 | append1[3] << 24; + w2[3] = append1[3] >> 8 | append2[0] << 24; + w3[0] = append2[0] >> 8; + break; + + case 16: + w1[0] = append0[0]; + w1[1] = append0[1]; + w1[2] = append0[2]; + w1[3] = append0[3]; + w2[0] = append1[0]; + w2[1] = append1[1]; + w2[2] = append1[2]; + w2[3] = append1[3]; + w3[0] = append2[0]; + break; + + case 17: + w1[0] = w1[0] | append0[0] << 8; + w1[1] = append0[0] >> 24 | append0[1] << 8; + w1[2] = append0[1] >> 24 | append0[2] << 8; + w1[3] = append0[2] >> 24 | append0[3] << 8; + w2[0] = append0[3] >> 24 | append1[0] << 8; + w2[1] = append1[0] >> 24 | append1[1] << 8; + w2[2] = append1[1] >> 24 | append1[2] << 8; + w2[3] = append1[2] >> 24 | append1[3] << 8; + w3[0] = append1[3] >> 24 | append2[0] << 8; + w3[1] = append2[0] >> 24; + break; + + case 18: + w1[0] = w1[0] | append0[0] << 16; + w1[1] = append0[0] >> 16 | append0[1] << 16; + w1[2] = append0[1] >> 16 | append0[2] << 16; + w1[3] = append0[2] >> 16 | append0[3] << 16; + w2[0] = append0[3] >> 16 | append1[0] << 16; + w2[1] = append1[0] >> 16 | append1[1] << 16; + w2[2] = append1[1] >> 16 | append1[2] << 16; + w2[3] = append1[2] >> 16 | append1[3] << 16; + w3[0] = append1[3] >> 16 | append2[0] << 16; + w3[1] = append2[0] >> 16; + break; + + case 19: + w1[0] = w1[0] | append0[0] << 24; + w1[1] = append0[0] >> 8 | append0[1] << 24; + w1[2] = append0[1] >> 8 | append0[2] << 24; + w1[3] = append0[2] >> 8 | append0[3] << 24; + w2[0] = append0[3] >> 8 | append1[0] << 24; + w2[1] = append1[0] >> 8 | append1[1] << 24; + w2[2] = append1[1] >> 8 | append1[2] << 24; + w2[3] = append1[2] >> 8 | append1[3] << 24; + w3[0] = append1[3] >> 8 | append2[0] << 24; + w3[1] = append2[0] >> 8; + break; + + case 20: + w1[1] = append0[0]; + w1[2] = append0[1]; + w1[3] = append0[2]; + w2[0] = append0[3]; + w2[1] = append1[0]; + w2[2] = append1[1]; + w2[3] = append1[2]; + w3[0] = append1[3]; + w3[1] = append2[0]; + break; + + case 21: + w1[1] = w1[1] | append0[0] << 8; + w1[2] = append0[0] >> 24 | append0[1] << 8; + w1[3] = append0[1] >> 24 | append0[2] << 8; + w2[0] = append0[2] >> 24 | append0[3] << 8; + w2[1] = append0[3] >> 24 | append1[0] << 8; + w2[2] = append1[0] >> 24 | append1[1] << 8; + w2[3] = append1[1] >> 24 | append1[2] << 8; + w3[0] = append1[2] >> 24 | append1[3] << 8; + w3[1] = append1[3] >> 24 | append2[0] << 8; + break; + + case 22: + w1[1] = w1[1] | append0[0] << 16; + w1[2] = append0[0] >> 16 | append0[1] << 16; + w1[3] = append0[1] >> 16 | append0[2] << 16; + w2[0] = append0[2] >> 16 | append0[3] << 16; + w2[1] = append0[3] >> 16 | append1[0] << 16; + w2[2] = append1[0] >> 16 | append1[1] << 16; + w2[3] = append1[1] >> 16 | append1[2] << 16; + w3[0] = append1[2] >> 16 | append1[3] << 16; + w3[1] = append1[3] >> 16 | append2[0] << 16; + break; + + case 23: + w1[1] = w1[1] | append0[0] << 24; + w1[2] = append0[0] >> 8 | append0[1] << 24; + w1[3] = append0[1] >> 8 | append0[2] << 24; + w2[0] = append0[2] >> 8 | append0[3] << 24; + w2[1] = append0[3] >> 8 | append1[0] << 24; + w2[2] = append1[0] >> 8 | append1[1] << 24; + w2[3] = append1[1] >> 8 | append1[2] << 24; + w3[0] = append1[2] >> 8 | append1[3] << 24; + w3[1] = append1[3] >> 8 | append2[0] << 24; + break; + + case 24: + w1[2] = append0[0]; + w1[3] = append0[1]; + w2[0] = append0[2]; + w2[1] = append0[3]; + w2[2] = append1[0]; + w2[3] = append1[1]; + w3[0] = append1[2]; + w3[1] = append1[3]; + break; + + case 25: + w1[2] = w1[2] | append0[0] << 8; + w1[3] = append0[0] >> 24 | append0[1] << 8; + w2[0] = append0[1] >> 24 | append0[2] << 8; + w2[1] = append0[2] >> 24 | append0[3] << 8; + w2[2] = append0[3] >> 24 | append1[0] << 8; + w2[3] = append1[0] >> 24 | append1[1] << 8; + w3[0] = append1[1] >> 24 | append1[2] << 8; + w3[1] = append1[2] >> 24 | append1[3] << 8; + break; + + case 26: + w1[2] = w1[2] | append0[0] << 16; + w1[3] = append0[0] >> 16 | append0[1] << 16; + w2[0] = append0[1] >> 16 | append0[2] << 16; + w2[1] = append0[2] >> 16 | append0[3] << 16; + w2[2] = append0[3] >> 16 | append1[0] << 16; + w2[3] = append1[0] >> 16 | append1[1] << 16; + w3[0] = append1[1] >> 16 | append1[2] << 16; + w3[1] = append1[2] >> 16 | append1[3] << 16; + break; + + case 27: + w1[2] = w1[2] | append0[0] << 24; + w1[3] = append0[0] >> 8 | append0[1] << 24; + w2[0] = append0[1] >> 8 | append0[2] << 24; + w2[1] = append0[2] >> 8 | append0[3] << 24; + w2[2] = append0[3] >> 8 | append1[0] << 24; + w2[3] = append1[0] >> 8 | append1[1] << 24; + w3[0] = append1[1] >> 8 | append1[2] << 24; + w3[1] = append1[2] >> 8 | append1[3] << 24; + break; + + case 28: + w1[3] = append0[0]; + w2[0] = append0[1]; + w2[1] = append0[2]; + w2[2] = append0[3]; + w2[3] = append1[0]; + w3[0] = append1[1]; + w3[1] = append1[2]; + break; + + case 29: + w1[3] = w1[3] | append0[0] << 8; + w2[0] = append0[0] >> 24 | append0[1] << 8; + w2[1] = append0[1] >> 24 | append0[2] << 8; + w2[2] = append0[2] >> 24 | append0[3] << 8; + w2[3] = append0[3] >> 24 | append1[0] << 8; + w3[0] = append1[0] >> 24 | append1[1] << 8; + w3[1] = append1[1] >> 24 | append1[2] << 8; + break; + + case 30: + w1[3] = w1[3] | append0[0] << 16; + w2[0] = append0[0] >> 16 | append0[1] << 16; + w2[1] = append0[1] >> 16 | append0[2] << 16; + w2[2] = append0[2] >> 16 | append0[3] << 16; + w2[3] = append0[3] >> 16 | append1[0] << 16; + w3[0] = append1[0] >> 16 | append1[1] << 16; + w3[1] = append1[1] >> 16 | append1[2] << 16; + break; + + case 31: + w1[3] = w1[3] | append0[0] << 24; + w2[0] = append0[0] >> 8 | append0[1] << 24; + w2[1] = append0[1] >> 8 | append0[2] << 24; + w2[2] = append0[2] >> 8 | append0[3] << 24; + w2[3] = append0[3] >> 8 | append1[0] << 24; + w3[0] = append1[0] >> 8 | append1[1] << 24; + w3[1] = append1[1] >> 8 | append1[2] << 24; + break; + + case 32: + w2[0] = append0[0]; + w2[1] = append0[1]; + w2[2] = append0[2]; + w2[3] = append0[3]; + w3[0] = append1[0]; + w3[1] = append1[1]; + break; + } +} + +static void switch_buffer_by_offset (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], const u32 offset) +{ + const int offset_mod_4 = offset & 3; + + const int offset_minus_4 = 4 - offset; + + switch (offset / 4) + { + case 0: + w3[2] = amd_bytealign ( 0, w3[1], offset_minus_4); + w3[1] = amd_bytealign (w3[1], w3[0], offset_minus_4); + w3[0] = amd_bytealign (w3[0], w2[3], offset_minus_4); + w2[3] = amd_bytealign (w2[3], w2[2], offset_minus_4); + w2[2] = amd_bytealign (w2[2], w2[1], offset_minus_4); + w2[1] = amd_bytealign (w2[1], w2[0], offset_minus_4); + w2[0] = amd_bytealign (w2[0], w1[3], offset_minus_4); + w1[3] = amd_bytealign (w1[3], w1[2], offset_minus_4); + w1[2] = amd_bytealign (w1[2], w1[1], offset_minus_4); + w1[1] = amd_bytealign (w1[1], w1[0], offset_minus_4); + w1[0] = amd_bytealign (w1[0], w0[3], offset_minus_4); + w0[3] = amd_bytealign (w0[3], w0[2], offset_minus_4); + w0[2] = amd_bytealign (w0[2], w0[1], offset_minus_4); + w0[1] = amd_bytealign (w0[1], w0[0], offset_minus_4); + w0[0] = amd_bytealign (w0[0], 0, offset_minus_4); + + if (offset_mod_4 == 0) + { + w0[0] = w0[1]; + w0[1] = w0[2]; + w0[2] = w0[3]; + w0[3] = w1[0]; + w1[0] = w1[1]; + w1[1] = w1[2]; + w1[2] = w1[3]; + w1[3] = w2[0]; + w2[0] = w2[1]; + w2[1] = w2[2]; + w2[2] = w2[3]; + w2[3] = w3[0]; + w3[0] = w3[1]; + w3[1] = w3[2]; + w3[2] = 0; + } + + break; + + case 1: + w3[2] = amd_bytealign ( 0, w3[0], offset_minus_4); + w3[1] = amd_bytealign (w3[0], w2[3], offset_minus_4); + w3[0] = amd_bytealign (w2[3], w2[2], offset_minus_4); + w2[3] = amd_bytealign (w2[2], w2[1], offset_minus_4); + w2[2] = amd_bytealign (w2[1], w2[0], offset_minus_4); + w2[1] = amd_bytealign (w2[0], w1[3], offset_minus_4); + w2[0] = amd_bytealign (w1[3], w1[2], offset_minus_4); + w1[3] = amd_bytealign (w1[2], w1[1], offset_minus_4); + w1[2] = amd_bytealign (w1[1], w1[0], offset_minus_4); + w1[1] = amd_bytealign (w1[0], w0[3], offset_minus_4); + w1[0] = amd_bytealign (w0[3], w0[2], offset_minus_4); + w0[3] = amd_bytealign (w0[2], w0[1], offset_minus_4); + w0[2] = amd_bytealign (w0[1], w0[0], offset_minus_4); + w0[1] = amd_bytealign (w0[0], 0, offset_minus_4); + w0[0] = 0; + + if (offset_mod_4 == 0) + { + w0[1] = w0[2]; + w0[2] = w0[3]; + w0[3] = w1[0]; + w1[0] = w1[1]; + w1[1] = w1[2]; + w1[2] = w1[3]; + w1[3] = w2[0]; + w2[0] = w2[1]; + w2[1] = w2[2]; + w2[2] = w2[3]; + w2[3] = w3[0]; + w3[0] = w3[1]; + w3[1] = w3[2]; + w3[2] = 0; + } + + break; + + case 2: + w3[2] = amd_bytealign ( 0, w2[3], offset_minus_4); + w3[1] = amd_bytealign (w2[3], w2[2], offset_minus_4); + w3[0] = amd_bytealign (w2[2], w2[1], offset_minus_4); + w2[3] = amd_bytealign (w2[1], w2[0], offset_minus_4); + w2[2] = amd_bytealign (w2[0], w1[3], offset_minus_4); + w2[1] = amd_bytealign (w1[3], w1[2], offset_minus_4); + w2[0] = amd_bytealign (w1[2], w1[1], offset_minus_4); + w1[3] = amd_bytealign (w1[1], w1[0], offset_minus_4); + w1[2] = amd_bytealign (w1[0], w0[3], offset_minus_4); + w1[1] = amd_bytealign (w0[3], w0[2], offset_minus_4); + w1[0] = amd_bytealign (w0[2], w0[1], offset_minus_4); + w0[3] = amd_bytealign (w0[1], w0[0], offset_minus_4); + w0[2] = amd_bytealign (w0[0], 0, offset_minus_4); + w0[1] = 0; + w0[0] = 0; + + if (offset_mod_4 == 0) + { + w0[2] = w0[3]; + w0[3] = w1[0]; + w1[0] = w1[1]; + w1[1] = w1[2]; + w1[2] = w1[3]; + w1[3] = w2[0]; + w2[0] = w2[1]; + w2[1] = w2[2]; + w2[2] = w2[3]; + w2[3] = w3[0]; + w3[0] = w3[1]; + w3[1] = w3[2]; + w3[2] = 0; + } + + break; + + case 3: + w3[2] = amd_bytealign ( 0, w2[2], offset_minus_4); + w3[1] = amd_bytealign (w2[2], w2[1], offset_minus_4); + w3[0] = amd_bytealign (w2[1], w2[0], offset_minus_4); + w2[3] = amd_bytealign (w2[0], w1[3], offset_minus_4); + w2[2] = amd_bytealign (w1[3], w1[2], offset_minus_4); + w2[1] = amd_bytealign (w1[2], w1[1], offset_minus_4); + w2[0] = amd_bytealign (w1[1], w1[0], offset_minus_4); + w1[3] = amd_bytealign (w1[0], w0[3], offset_minus_4); + w1[2] = amd_bytealign (w0[3], w0[2], offset_minus_4); + w1[1] = amd_bytealign (w0[2], w0[1], offset_minus_4); + w1[0] = amd_bytealign (w0[1], w0[0], offset_minus_4); + w0[3] = amd_bytealign (w0[0], 0, offset_minus_4); + w0[2] = 0; + w0[1] = 0; + w0[0] = 0; + + if (offset_mod_4 == 0) + { + w0[3] = w1[0]; + w1[0] = w1[1]; + w1[1] = w1[2]; + w1[2] = w1[3]; + w1[3] = w2[0]; + w2[0] = w2[1]; + w2[1] = w2[2]; + w2[2] = w2[3]; + w2[3] = w3[0]; + w3[0] = w3[1]; + w3[1] = w3[2]; + w3[2] = 0; + } + + break; + + case 4: + w3[2] = amd_bytealign ( 0, w2[1], offset_minus_4); + w3[1] = amd_bytealign (w2[1], w2[0], offset_minus_4); + w3[0] = amd_bytealign (w2[0], w1[3], offset_minus_4); + w2[3] = amd_bytealign (w1[3], w1[2], offset_minus_4); + w2[2] = amd_bytealign (w1[2], w1[1], offset_minus_4); + w2[1] = amd_bytealign (w1[1], w1[0], offset_minus_4); + w2[0] = amd_bytealign (w1[0], w0[3], offset_minus_4); + w1[3] = amd_bytealign (w0[3], w0[2], offset_minus_4); + w1[2] = amd_bytealign (w0[2], w0[1], offset_minus_4); + w1[1] = amd_bytealign (w0[1], w0[0], offset_minus_4); + w1[0] = amd_bytealign (w0[0], 0, offset_minus_4); + w0[3] = 0; + w0[2] = 0; + w0[1] = 0; + w0[0] = 0; + + if (offset_mod_4 == 0) + { + w1[0] = w1[1]; + w1[1] = w1[2]; + w1[2] = w1[3]; + w1[3] = w2[0]; + w2[0] = w2[1]; + w2[1] = w2[2]; + w2[2] = w2[3]; + w2[3] = w3[0]; + w3[0] = w3[1]; + w3[1] = w3[2]; + w3[2] = 0; + } + + break; + + case 5: + w3[2] = amd_bytealign ( 0, w2[0], offset_minus_4); + w3[1] = amd_bytealign (w2[0], w1[3], offset_minus_4); + w3[0] = amd_bytealign (w1[3], w1[2], offset_minus_4); + w2[3] = amd_bytealign (w1[2], w1[1], offset_minus_4); + w2[2] = amd_bytealign (w1[1], w1[0], offset_minus_4); + w2[1] = amd_bytealign (w1[0], w0[3], offset_minus_4); + w2[0] = amd_bytealign (w0[3], w0[2], offset_minus_4); + w1[3] = amd_bytealign (w0[2], w0[1], offset_minus_4); + w1[2] = amd_bytealign (w0[1], w0[0], offset_minus_4); + w1[1] = amd_bytealign (w0[0], 0, offset_minus_4); + w1[0] = 0; + w0[3] = 0; + w0[2] = 0; + w0[1] = 0; + w0[0] = 0; + + if (offset_mod_4 == 0) + { + w1[1] = w1[2]; + w1[2] = w1[3]; + w1[3] = w2[0]; + w2[0] = w2[1]; + w2[1] = w2[2]; + w2[2] = w2[3]; + w2[3] = w3[0]; + w3[0] = w3[1]; + w3[1] = w3[2]; + w3[2] = 0; + } + + break; + + case 6: + w3[2] = amd_bytealign ( 0, w1[3], offset_minus_4); + w3[1] = amd_bytealign (w1[3], w1[2], offset_minus_4); + w3[0] = amd_bytealign (w1[2], w1[1], offset_minus_4); + w2[3] = amd_bytealign (w1[1], w1[0], offset_minus_4); + w2[2] = amd_bytealign (w1[0], w0[3], offset_minus_4); + w2[1] = amd_bytealign (w0[3], w0[2], offset_minus_4); + w2[0] = amd_bytealign (w0[2], w0[1], offset_minus_4); + w1[3] = amd_bytealign (w0[1], w0[0], offset_minus_4); + w1[2] = amd_bytealign (w0[0], 0, offset_minus_4); + w1[1] = 0; + w1[0] = 0; + w0[3] = 0; + w0[2] = 0; + w0[1] = 0; + w0[0] = 0; + + if (offset_mod_4 == 0) + { + w1[2] = w1[3]; + w1[3] = w2[0]; + w2[0] = w2[1]; + w2[1] = w2[2]; + w2[2] = w2[3]; + w2[3] = w3[0]; + w3[0] = w3[1]; + w3[1] = w3[2]; + w3[2] = 0; + } + + break; + + case 7: + w3[2] = amd_bytealign ( 0, w1[2], offset_minus_4); + w3[1] = amd_bytealign (w1[2], w1[1], offset_minus_4); + w3[0] = amd_bytealign (w1[1], w1[0], offset_minus_4); + w2[3] = amd_bytealign (w1[0], w0[3], offset_minus_4); + w2[2] = amd_bytealign (w0[3], w0[2], offset_minus_4); + w2[1] = amd_bytealign (w0[2], w0[1], offset_minus_4); + w2[0] = amd_bytealign (w0[1], w0[0], offset_minus_4); + w1[3] = amd_bytealign (w0[0], 0, offset_minus_4); + w1[2] = 0; + w1[1] = 0; + w1[0] = 0; + w0[3] = 0; + w0[2] = 0; + w0[1] = 0; + w0[0] = 0; + + if (offset_mod_4 == 0) + { + w1[3] = w2[0]; + w2[0] = w2[1]; + w2[1] = w2[2]; + w2[2] = w2[3]; + w2[3] = w3[0]; + w3[0] = w3[1]; + w3[1] = w3[2]; + w3[2] = 0; + } + + break; + + case 8: + w3[2] = amd_bytealign ( 0, w1[1], offset_minus_4); + w3[1] = amd_bytealign (w1[1], w1[0], offset_minus_4); + w3[0] = amd_bytealign (w1[0], w0[3], offset_minus_4); + w2[3] = amd_bytealign (w0[3], w0[2], offset_minus_4); + w2[2] = amd_bytealign (w0[2], w0[1], offset_minus_4); + w2[1] = amd_bytealign (w0[1], w0[0], offset_minus_4); + w2[0] = amd_bytealign (w0[0], 0, offset_minus_4); + w1[3] = 0; + w1[2] = 0; + w1[1] = 0; + w1[0] = 0; + w0[3] = 0; + w0[2] = 0; + w0[1] = 0; + w0[0] = 0; + + if (offset_mod_4 == 0) + { + w2[0] = w2[1]; + w2[1] = w2[2]; + w2[2] = w2[3]; + w2[3] = w3[0]; + w3[0] = w3[1]; + w3[1] = w3[2]; + w3[2] = 0; + } + + break; + + case 9: + w3[2] = amd_bytealign ( 0, w1[0], offset_minus_4); + w3[1] = amd_bytealign (w1[0], w0[3], offset_minus_4); + w3[0] = amd_bytealign (w0[3], w0[2], offset_minus_4); + w2[3] = amd_bytealign (w0[2], w0[1], offset_minus_4); + w2[2] = amd_bytealign (w0[1], w0[0], offset_minus_4); + w2[1] = amd_bytealign (w0[0], 0, offset_minus_4); + w2[0] = 0; + w1[3] = 0; + w1[2] = 0; + w1[1] = 0; + w1[0] = 0; + w0[3] = 0; + w0[2] = 0; + w0[1] = 0; + w0[0] = 0; + + if (offset_mod_4 == 0) + { + w2[1] = w2[2]; + w2[2] = w2[3]; + w2[3] = w3[0]; + w3[0] = w3[1]; + w3[1] = w3[2]; + w3[2] = 0; + } + + break; + + case 10: + w3[2] = amd_bytealign ( 0, w0[3], offset_minus_4); + w3[1] = amd_bytealign (w0[3], w0[2], offset_minus_4); + w3[0] = amd_bytealign (w0[2], w0[1], offset_minus_4); + w2[3] = amd_bytealign (w0[1], w0[0], offset_minus_4); + w2[2] = amd_bytealign (w0[0], 0, offset_minus_4); + w2[1] = 0; + w2[0] = 0; + w1[3] = 0; + w1[2] = 0; + w1[1] = 0; + w1[0] = 0; + w0[3] = 0; + w0[2] = 0; + w0[1] = 0; + w0[0] = 0; + + if (offset_mod_4 == 0) + { + w2[2] = w2[3]; + w2[3] = w3[0]; + w3[0] = w3[1]; + w3[1] = w3[2]; + w3[2] = 0; + } + + break; + + case 11: + w3[2] = amd_bytealign ( 0, w0[2], offset_minus_4); + w3[1] = amd_bytealign (w0[2], w0[1], offset_minus_4); + w3[0] = amd_bytealign (w0[1], w0[0], offset_minus_4); + w2[3] = amd_bytealign (w0[0], 0, offset_minus_4); + w2[2] = 0; + w2[1] = 0; + w2[0] = 0; + w1[3] = 0; + w1[2] = 0; + w1[1] = 0; + w1[0] = 0; + w0[3] = 0; + w0[2] = 0; + w0[1] = 0; + w0[0] = 0; + + if (offset_mod_4 == 0) + { + w2[3] = w3[0]; + w3[0] = w3[1]; + w3[1] = w3[2]; + w3[2] = 0; + } + + break; + + case 12: + w3[2] = amd_bytealign ( 0, w0[1], offset_minus_4); + w3[1] = amd_bytealign (w0[1], w0[0], offset_minus_4); + w3[0] = amd_bytealign (w0[0], 0, offset_minus_4); + w2[3] = 0; + w2[2] = 0; + w2[1] = 0; + w2[0] = 0; + w1[3] = 0; + w1[2] = 0; + w1[1] = 0; + w1[0] = 0; + w0[3] = 0; + w0[2] = 0; + w0[1] = 0; + w0[0] = 0; + + if (offset_mod_4 == 0) + { + w3[0] = w3[1]; + w3[1] = w3[2]; + w3[2] = 0; + } + + break; + + case 13: + w3[2] = amd_bytealign ( 0, w0[0], offset_minus_4); + w3[1] = amd_bytealign (w0[0], 0, offset_minus_4); + w3[0] = 0; + w2[3] = 0; + w2[2] = 0; + w2[1] = 0; + w2[0] = 0; + w1[3] = 0; + w1[2] = 0; + w1[1] = 0; + w1[0] = 0; + w0[3] = 0; + w0[2] = 0; + w0[1] = 0; + w0[0] = 0; + + if (offset_mod_4 == 0) + { + w3[1] = w3[2]; + w3[2] = 0; + } + + break; + } +} + +static void switch_buffer_by_offset_be (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], const u32 offset) +{ + switch (offset / 4) + { + case 0: + w3[2] = amd_bytealign (w3[1], 0, offset); + w3[1] = amd_bytealign (w3[0], w3[1], offset); + w3[0] = amd_bytealign (w2[3], w3[0], offset); + w2[3] = amd_bytealign (w2[2], w2[3], offset); + w2[2] = amd_bytealign (w2[1], w2[2], offset); + w2[1] = amd_bytealign (w2[0], w2[1], offset); + w2[0] = amd_bytealign (w1[3], w2[0], offset); + w1[3] = amd_bytealign (w1[2], w1[3], offset); + w1[2] = amd_bytealign (w1[1], w1[2], offset); + w1[1] = amd_bytealign (w1[0], w1[1], offset); + w1[0] = amd_bytealign (w0[3], w1[0], offset); + w0[3] = amd_bytealign (w0[2], w0[3], offset); + w0[2] = amd_bytealign (w0[1], w0[2], offset); + w0[1] = amd_bytealign (w0[0], w0[1], offset); + w0[0] = amd_bytealign ( 0, w0[0], offset); + break; + + case 1: + w3[2] = amd_bytealign (w3[0], 0, offset); + w3[1] = amd_bytealign (w2[3], w3[0], offset); + w3[0] = amd_bytealign (w2[2], w2[3], offset); + w2[3] = amd_bytealign (w2[1], w2[2], offset); + w2[2] = amd_bytealign (w2[0], w2[1], offset); + w2[1] = amd_bytealign (w1[3], w2[0], offset); + w2[0] = amd_bytealign (w1[2], w1[3], offset); + w1[3] = amd_bytealign (w1[1], w1[2], offset); + w1[2] = amd_bytealign (w1[0], w1[1], offset); + w1[1] = amd_bytealign (w0[3], w1[0], offset); + w1[0] = amd_bytealign (w0[2], w0[3], offset); + w0[3] = amd_bytealign (w0[1], w0[2], offset); + w0[2] = amd_bytealign (w0[0], w0[1], offset); + w0[1] = amd_bytealign ( 0, w0[0], offset); + w0[0] = 0; + break; + + case 2: + w3[2] = amd_bytealign (w2[3], 0, offset); + w3[1] = amd_bytealign (w2[2], w2[3], offset); + w3[0] = amd_bytealign (w2[1], w2[2], offset); + w2[3] = amd_bytealign (w2[0], w2[1], offset); + w2[2] = amd_bytealign (w1[3], w2[0], offset); + w2[1] = amd_bytealign (w1[2], w1[3], offset); + w2[0] = amd_bytealign (w1[1], w1[2], offset); + w1[3] = amd_bytealign (w1[0], w1[1], offset); + w1[2] = amd_bytealign (w0[3], w1[0], offset); + w1[1] = amd_bytealign (w0[2], w0[3], offset); + w1[0] = amd_bytealign (w0[1], w0[2], offset); + w0[3] = amd_bytealign (w0[0], w0[1], offset); + w0[2] = amd_bytealign ( 0, w0[0], offset); + w0[1] = 0; + w0[0] = 0; + break; + + case 3: + w3[2] = amd_bytealign (w2[2], 0, offset); + w3[1] = amd_bytealign (w2[1], w2[2], offset); + w3[0] = amd_bytealign (w2[0], w2[1], offset); + w2[3] = amd_bytealign (w1[3], w2[0], offset); + w2[2] = amd_bytealign (w1[2], w1[3], offset); + w2[1] = amd_bytealign (w1[1], w1[2], offset); + w2[0] = amd_bytealign (w1[0], w1[1], offset); + w1[3] = amd_bytealign (w0[3], w1[0], offset); + w1[2] = amd_bytealign (w0[2], w0[3], offset); + w1[1] = amd_bytealign (w0[1], w0[2], offset); + w1[0] = amd_bytealign (w0[0], w0[1], offset); + w0[3] = amd_bytealign ( 0, w0[0], offset); + w0[2] = 0; + w0[1] = 0; + w0[0] = 0; + break; + + case 4: + w3[2] = amd_bytealign (w2[1], 0, offset); + w3[1] = amd_bytealign (w2[0], w2[1], offset); + w3[0] = amd_bytealign (w1[3], w2[0], offset); + w2[3] = amd_bytealign (w1[2], w1[3], offset); + w2[2] = amd_bytealign (w1[1], w1[2], offset); + w2[1] = amd_bytealign (w1[0], w1[1], offset); + w2[0] = amd_bytealign (w0[3], w1[0], offset); + w1[3] = amd_bytealign (w0[2], w0[3], offset); + w1[2] = amd_bytealign (w0[1], w0[2], offset); + w1[1] = amd_bytealign (w0[0], w0[1], offset); + w1[0] = amd_bytealign ( 0, w0[0], offset); + w0[3] = 0; + w0[2] = 0; + w0[1] = 0; + w0[0] = 0; + break; + + case 5: + w3[2] = amd_bytealign (w2[0], 0, offset); + w3[1] = amd_bytealign (w1[3], w2[0], offset); + w3[0] = amd_bytealign (w1[2], w1[3], offset); + w2[3] = amd_bytealign (w1[1], w1[2], offset); + w2[2] = amd_bytealign (w1[0], w1[1], offset); + w2[1] = amd_bytealign (w0[3], w1[0], offset); + w2[0] = amd_bytealign (w0[2], w0[3], offset); + w1[3] = amd_bytealign (w0[1], w0[2], offset); + w1[2] = amd_bytealign (w0[0], w0[1], offset); + w1[1] = amd_bytealign ( 0, w0[0], offset); + w1[0] = 0; + w0[3] = 0; + w0[2] = 0; + w0[1] = 0; + w0[0] = 0; + break; + + case 6: + w3[2] = amd_bytealign (w1[3], 0, offset); + w3[1] = amd_bytealign (w1[2], w1[3], offset); + w3[0] = amd_bytealign (w1[1], w1[2], offset); + w2[3] = amd_bytealign (w1[0], w1[1], offset); + w2[2] = amd_bytealign (w0[3], w1[0], offset); + w2[1] = amd_bytealign (w0[2], w0[3], offset); + w2[0] = amd_bytealign (w0[1], w0[2], offset); + w1[3] = amd_bytealign (w0[0], w0[1], offset); + w1[2] = amd_bytealign ( 0, w0[0], offset); + w1[1] = 0; + w1[0] = 0; + w0[3] = 0; + w0[2] = 0; + w0[1] = 0; + w0[0] = 0; + break; + + case 7: + w3[2] = amd_bytealign (w1[2], 0, offset); + w3[1] = amd_bytealign (w1[1], w1[2], offset); + w3[0] = amd_bytealign (w1[0], w1[1], offset); + w2[3] = amd_bytealign (w0[3], w1[0], offset); + w2[2] = amd_bytealign (w0[2], w0[3], offset); + w2[1] = amd_bytealign (w0[1], w0[2], offset); + w2[0] = amd_bytealign (w0[0], w0[1], offset); + w1[3] = amd_bytealign ( 0, w0[0], offset); + w1[2] = 0; + w1[1] = 0; + w1[0] = 0; + w0[3] = 0; + w0[2] = 0; + w0[1] = 0; + w0[0] = 0; + break; + + case 8: + w3[2] = amd_bytealign (w1[1], 0, offset); + w3[1] = amd_bytealign (w1[0], w1[1], offset); + w3[0] = amd_bytealign (w0[3], w1[0], offset); + w2[3] = amd_bytealign (w0[2], w0[3], offset); + w2[2] = amd_bytealign (w0[1], w0[2], offset); + w2[1] = amd_bytealign (w0[0], w0[1], offset); + w2[0] = amd_bytealign ( 0, w0[0], offset); + w1[3] = 0; + w1[2] = 0; + w1[1] = 0; + w1[0] = 0; + w0[3] = 0; + w0[2] = 0; + w0[1] = 0; + w0[0] = 0; + break; + + case 9: + w3[2] = amd_bytealign (w1[0], 0, offset); + w3[1] = amd_bytealign (w0[3], w1[0], offset); + w3[0] = amd_bytealign (w0[2], w0[3], offset); + w2[3] = amd_bytealign (w0[1], w0[2], offset); + w2[2] = amd_bytealign (w0[0], w0[1], offset); + w2[1] = amd_bytealign ( 0, w0[0], offset); + w2[0] = 0; + w1[3] = 0; + w1[2] = 0; + w1[1] = 0; + w1[0] = 0; + w0[3] = 0; + w0[2] = 0; + w0[1] = 0; + w0[0] = 0; + break; + + case 10: + w3[2] = amd_bytealign (w0[3], 0, offset); + w3[1] = amd_bytealign (w0[2], w0[3], offset); + w3[0] = amd_bytealign (w0[1], w0[2], offset); + w2[3] = amd_bytealign (w0[0], w0[1], offset); + w2[2] = amd_bytealign ( 0, w0[0], offset); + w2[1] = 0; + w2[0] = 0; + w1[3] = 0; + w1[2] = 0; + w1[1] = 0; + w1[0] = 0; + w0[3] = 0; + w0[2] = 0; + w0[1] = 0; + w0[0] = 0; + break; + + case 11: + w3[2] = amd_bytealign (w0[2], 0, offset); + w3[1] = amd_bytealign (w0[1], w0[2], offset); + w3[0] = amd_bytealign (w0[0], w0[1], offset); + w2[3] = amd_bytealign ( 0, w0[0], offset); + w2[2] = 0; + w2[1] = 0; + w2[0] = 0; + w1[3] = 0; + w1[2] = 0; + w1[1] = 0; + w1[0] = 0; + w0[3] = 0; + w0[2] = 0; + w0[1] = 0; + w0[0] = 0; + break; + + case 12: + w3[2] = amd_bytealign (w0[1], 0, offset); + w3[1] = amd_bytealign (w0[0], w0[1], offset); + w3[0] = amd_bytealign ( 0, w0[0], offset); + w2[3] = 0; + w2[2] = 0; + w2[1] = 0; + w2[0] = 0; + w1[3] = 0; + w1[2] = 0; + w1[1] = 0; + w1[0] = 0; + w0[3] = 0; + w0[2] = 0; + w0[1] = 0; + w0[0] = 0; + break; + + case 13: + w3[2] = amd_bytealign (w0[0], 0, offset); + w3[1] = amd_bytealign ( 0, w0[0], offset); + w3[0] = 0; + w2[3] = 0; + w2[2] = 0; + w2[1] = 0; + w2[0] = 0; + w1[3] = 0; + w1[2] = 0; + w1[1] = 0; + w1[0] = 0; + w0[3] = 0; + w0[2] = 0; + w0[1] = 0; + w0[0] = 0; + break; + } +} +#endif + +static u32 check_vector_accessible (const u32 il_pos, const u32 bf_loops, const u32 bfs_cnt, const u32 element) +{ + #ifdef VECT_SIZE1 + + // nothing to do here + + #else + + if ((il_pos + 1) == bf_loops) + { + #ifdef VECT_SIZE2 + u32 bfs_over = bfs_cnt % 2; + + if (bfs_over == 0) bfs_over = 2; + #endif + + #ifdef VECT_SIZE4 + u32 bfs_over = bfs_cnt % 4; + + if (bfs_over == 0) bfs_over = 4; + #endif + + if (element >= bfs_over) return 0; + } + + #endif + + return 1; +} diff --git a/amd/gpu_aes256_amd.c b/amd/gpu_aes256_amd.c new file mode 100644 index 0000000000..7aca801546 --- /dev/null +++ b/amd/gpu_aes256_amd.c @@ -0,0 +1,1048 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +__constant u32 te0[256] = +{ + 0xc66363a5, 0xf87c7c84, 0xee777799, 0xf67b7b8d, + 0xfff2f20d, 0xd66b6bbd, 0xde6f6fb1, 0x91c5c554, + 0x60303050, 0x02010103, 0xce6767a9, 0x562b2b7d, + 0xe7fefe19, 0xb5d7d762, 0x4dababe6, 0xec76769a, + 0x8fcaca45, 0x1f82829d, 0x89c9c940, 0xfa7d7d87, + 0xeffafa15, 0xb25959eb, 0x8e4747c9, 0xfbf0f00b, + 0x41adadec, 0xb3d4d467, 0x5fa2a2fd, 0x45afafea, + 0x239c9cbf, 0x53a4a4f7, 0xe4727296, 0x9bc0c05b, + 0x75b7b7c2, 0xe1fdfd1c, 0x3d9393ae, 0x4c26266a, + 0x6c36365a, 0x7e3f3f41, 0xf5f7f702, 0x83cccc4f, + 0x6834345c, 0x51a5a5f4, 0xd1e5e534, 0xf9f1f108, + 0xe2717193, 0xabd8d873, 0x62313153, 0x2a15153f, + 0x0804040c, 0x95c7c752, 0x46232365, 0x9dc3c35e, + 0x30181828, 0x379696a1, 0x0a05050f, 0x2f9a9ab5, + 0x0e070709, 0x24121236, 0x1b80809b, 0xdfe2e23d, + 0xcdebeb26, 0x4e272769, 0x7fb2b2cd, 0xea75759f, + 0x1209091b, 0x1d83839e, 0x582c2c74, 0x341a1a2e, + 0x361b1b2d, 0xdc6e6eb2, 0xb45a5aee, 0x5ba0a0fb, + 0xa45252f6, 0x763b3b4d, 0xb7d6d661, 0x7db3b3ce, + 0x5229297b, 0xdde3e33e, 0x5e2f2f71, 0x13848497, + 0xa65353f5, 0xb9d1d168, 0x00000000, 0xc1eded2c, + 0x40202060, 0xe3fcfc1f, 0x79b1b1c8, 0xb65b5bed, + 0xd46a6abe, 0x8dcbcb46, 0x67bebed9, 0x7239394b, + 0x944a4ade, 0x984c4cd4, 0xb05858e8, 0x85cfcf4a, + 0xbbd0d06b, 0xc5efef2a, 0x4faaaae5, 0xedfbfb16, + 0x864343c5, 0x9a4d4dd7, 0x66333355, 0x11858594, + 0x8a4545cf, 0xe9f9f910, 0x04020206, 0xfe7f7f81, + 0xa05050f0, 0x783c3c44, 0x259f9fba, 0x4ba8a8e3, + 0xa25151f3, 0x5da3a3fe, 0x804040c0, 0x058f8f8a, + 0x3f9292ad, 0x219d9dbc, 0x70383848, 0xf1f5f504, + 0x63bcbcdf, 0x77b6b6c1, 0xafdada75, 0x42212163, + 0x20101030, 0xe5ffff1a, 0xfdf3f30e, 0xbfd2d26d, + 0x81cdcd4c, 0x180c0c14, 0x26131335, 0xc3ecec2f, + 0xbe5f5fe1, 0x359797a2, 0x884444cc, 0x2e171739, + 0x93c4c457, 0x55a7a7f2, 0xfc7e7e82, 0x7a3d3d47, + 0xc86464ac, 0xba5d5de7, 0x3219192b, 0xe6737395, + 0xc06060a0, 0x19818198, 0x9e4f4fd1, 0xa3dcdc7f, + 0x44222266, 0x542a2a7e, 0x3b9090ab, 0x0b888883, + 0x8c4646ca, 0xc7eeee29, 0x6bb8b8d3, 0x2814143c, + 0xa7dede79, 0xbc5e5ee2, 0x160b0b1d, 0xaddbdb76, + 0xdbe0e03b, 0x64323256, 0x743a3a4e, 0x140a0a1e, + 0x924949db, 0x0c06060a, 0x4824246c, 0xb85c5ce4, + 0x9fc2c25d, 0xbdd3d36e, 0x43acacef, 0xc46262a6, + 0x399191a8, 0x319595a4, 0xd3e4e437, 0xf279798b, + 0xd5e7e732, 0x8bc8c843, 0x6e373759, 0xda6d6db7, + 0x018d8d8c, 0xb1d5d564, 0x9c4e4ed2, 0x49a9a9e0, + 0xd86c6cb4, 0xac5656fa, 0xf3f4f407, 0xcfeaea25, + 0xca6565af, 0xf47a7a8e, 0x47aeaee9, 0x10080818, + 0x6fbabad5, 0xf0787888, 0x4a25256f, 0x5c2e2e72, + 0x381c1c24, 0x57a6a6f1, 0x73b4b4c7, 0x97c6c651, + 0xcbe8e823, 0xa1dddd7c, 0xe874749c, 0x3e1f1f21, + 0x964b4bdd, 0x61bdbddc, 0x0d8b8b86, 0x0f8a8a85, + 0xe0707090, 0x7c3e3e42, 0x71b5b5c4, 0xcc6666aa, + 0x904848d8, 0x06030305, 0xf7f6f601, 0x1c0e0e12, + 0xc26161a3, 0x6a35355f, 0xae5757f9, 0x69b9b9d0, + 0x17868691, 0x99c1c158, 0x3a1d1d27, 0x279e9eb9, + 0xd9e1e138, 0xebf8f813, 0x2b9898b3, 0x22111133, + 0xd26969bb, 0xa9d9d970, 0x078e8e89, 0x339494a7, + 0x2d9b9bb6, 0x3c1e1e22, 0x15878792, 0xc9e9e920, + 0x87cece49, 0xaa5555ff, 0x50282878, 0xa5dfdf7a, + 0x038c8c8f, 0x59a1a1f8, 0x09898980, 0x1a0d0d17, + 0x65bfbfda, 0xd7e6e631, 0x844242c6, 0xd06868b8, + 0x824141c3, 0x299999b0, 0x5a2d2d77, 0x1e0f0f11, + 0x7bb0b0cb, 0xa85454fc, 0x6dbbbbd6, 0x2c16163a, +}; + +__constant u32 te1[256] = +{ + 0xa5c66363, 0x84f87c7c, 0x99ee7777, 0x8df67b7b, + 0x0dfff2f2, 0xbdd66b6b, 0xb1de6f6f, 0x5491c5c5, + 0x50603030, 0x03020101, 0xa9ce6767, 0x7d562b2b, + 0x19e7fefe, 0x62b5d7d7, 0xe64dabab, 0x9aec7676, + 0x458fcaca, 0x9d1f8282, 0x4089c9c9, 0x87fa7d7d, + 0x15effafa, 0xebb25959, 0xc98e4747, 0x0bfbf0f0, + 0xec41adad, 0x67b3d4d4, 0xfd5fa2a2, 0xea45afaf, + 0xbf239c9c, 0xf753a4a4, 0x96e47272, 0x5b9bc0c0, + 0xc275b7b7, 0x1ce1fdfd, 0xae3d9393, 0x6a4c2626, + 0x5a6c3636, 0x417e3f3f, 0x02f5f7f7, 0x4f83cccc, + 0x5c683434, 0xf451a5a5, 0x34d1e5e5, 0x08f9f1f1, + 0x93e27171, 0x73abd8d8, 0x53623131, 0x3f2a1515, + 0x0c080404, 0x5295c7c7, 0x65462323, 0x5e9dc3c3, + 0x28301818, 0xa1379696, 0x0f0a0505, 0xb52f9a9a, + 0x090e0707, 0x36241212, 0x9b1b8080, 0x3ddfe2e2, + 0x26cdebeb, 0x694e2727, 0xcd7fb2b2, 0x9fea7575, + 0x1b120909, 0x9e1d8383, 0x74582c2c, 0x2e341a1a, + 0x2d361b1b, 0xb2dc6e6e, 0xeeb45a5a, 0xfb5ba0a0, + 0xf6a45252, 0x4d763b3b, 0x61b7d6d6, 0xce7db3b3, + 0x7b522929, 0x3edde3e3, 0x715e2f2f, 0x97138484, + 0xf5a65353, 0x68b9d1d1, 0x00000000, 0x2cc1eded, + 0x60402020, 0x1fe3fcfc, 0xc879b1b1, 0xedb65b5b, + 0xbed46a6a, 0x468dcbcb, 0xd967bebe, 0x4b723939, + 0xde944a4a, 0xd4984c4c, 0xe8b05858, 0x4a85cfcf, + 0x6bbbd0d0, 0x2ac5efef, 0xe54faaaa, 0x16edfbfb, + 0xc5864343, 0xd79a4d4d, 0x55663333, 0x94118585, + 0xcf8a4545, 0x10e9f9f9, 0x06040202, 0x81fe7f7f, + 0xf0a05050, 0x44783c3c, 0xba259f9f, 0xe34ba8a8, + 0xf3a25151, 0xfe5da3a3, 0xc0804040, 0x8a058f8f, + 0xad3f9292, 0xbc219d9d, 0x48703838, 0x04f1f5f5, + 0xdf63bcbc, 0xc177b6b6, 0x75afdada, 0x63422121, + 0x30201010, 0x1ae5ffff, 0x0efdf3f3, 0x6dbfd2d2, + 0x4c81cdcd, 0x14180c0c, 0x35261313, 0x2fc3ecec, + 0xe1be5f5f, 0xa2359797, 0xcc884444, 0x392e1717, + 0x5793c4c4, 0xf255a7a7, 0x82fc7e7e, 0x477a3d3d, + 0xacc86464, 0xe7ba5d5d, 0x2b321919, 0x95e67373, + 0xa0c06060, 0x98198181, 0xd19e4f4f, 0x7fa3dcdc, + 0x66442222, 0x7e542a2a, 0xab3b9090, 0x830b8888, + 0xca8c4646, 0x29c7eeee, 0xd36bb8b8, 0x3c281414, + 0x79a7dede, 0xe2bc5e5e, 0x1d160b0b, 0x76addbdb, + 0x3bdbe0e0, 0x56643232, 0x4e743a3a, 0x1e140a0a, + 0xdb924949, 0x0a0c0606, 0x6c482424, 0xe4b85c5c, + 0x5d9fc2c2, 0x6ebdd3d3, 0xef43acac, 0xa6c46262, + 0xa8399191, 0xa4319595, 0x37d3e4e4, 0x8bf27979, + 0x32d5e7e7, 0x438bc8c8, 0x596e3737, 0xb7da6d6d, + 0x8c018d8d, 0x64b1d5d5, 0xd29c4e4e, 0xe049a9a9, + 0xb4d86c6c, 0xfaac5656, 0x07f3f4f4, 0x25cfeaea, + 0xafca6565, 0x8ef47a7a, 0xe947aeae, 0x18100808, + 0xd56fbaba, 0x88f07878, 0x6f4a2525, 0x725c2e2e, + 0x24381c1c, 0xf157a6a6, 0xc773b4b4, 0x5197c6c6, + 0x23cbe8e8, 0x7ca1dddd, 0x9ce87474, 0x213e1f1f, + 0xdd964b4b, 0xdc61bdbd, 0x860d8b8b, 0x850f8a8a, + 0x90e07070, 0x427c3e3e, 0xc471b5b5, 0xaacc6666, + 0xd8904848, 0x05060303, 0x01f7f6f6, 0x121c0e0e, + 0xa3c26161, 0x5f6a3535, 0xf9ae5757, 0xd069b9b9, + 0x91178686, 0x5899c1c1, 0x273a1d1d, 0xb9279e9e, + 0x38d9e1e1, 0x13ebf8f8, 0xb32b9898, 0x33221111, + 0xbbd26969, 0x70a9d9d9, 0x89078e8e, 0xa7339494, + 0xb62d9b9b, 0x223c1e1e, 0x92158787, 0x20c9e9e9, + 0x4987cece, 0xffaa5555, 0x78502828, 0x7aa5dfdf, + 0x8f038c8c, 0xf859a1a1, 0x80098989, 0x171a0d0d, + 0xda65bfbf, 0x31d7e6e6, 0xc6844242, 0xb8d06868, + 0xc3824141, 0xb0299999, 0x775a2d2d, 0x111e0f0f, + 0xcb7bb0b0, 0xfca85454, 0xd66dbbbb, 0x3a2c1616, +}; + +__constant u32 te2[256] = +{ + 0x63a5c663, 0x7c84f87c, 0x7799ee77, 0x7b8df67b, + 0xf20dfff2, 0x6bbdd66b, 0x6fb1de6f, 0xc55491c5, + 0x30506030, 0x01030201, 0x67a9ce67, 0x2b7d562b, + 0xfe19e7fe, 0xd762b5d7, 0xabe64dab, 0x769aec76, + 0xca458fca, 0x829d1f82, 0xc94089c9, 0x7d87fa7d, + 0xfa15effa, 0x59ebb259, 0x47c98e47, 0xf00bfbf0, + 0xadec41ad, 0xd467b3d4, 0xa2fd5fa2, 0xafea45af, + 0x9cbf239c, 0xa4f753a4, 0x7296e472, 0xc05b9bc0, + 0xb7c275b7, 0xfd1ce1fd, 0x93ae3d93, 0x266a4c26, + 0x365a6c36, 0x3f417e3f, 0xf702f5f7, 0xcc4f83cc, + 0x345c6834, 0xa5f451a5, 0xe534d1e5, 0xf108f9f1, + 0x7193e271, 0xd873abd8, 0x31536231, 0x153f2a15, + 0x040c0804, 0xc75295c7, 0x23654623, 0xc35e9dc3, + 0x18283018, 0x96a13796, 0x050f0a05, 0x9ab52f9a, + 0x07090e07, 0x12362412, 0x809b1b80, 0xe23ddfe2, + 0xeb26cdeb, 0x27694e27, 0xb2cd7fb2, 0x759fea75, + 0x091b1209, 0x839e1d83, 0x2c74582c, 0x1a2e341a, + 0x1b2d361b, 0x6eb2dc6e, 0x5aeeb45a, 0xa0fb5ba0, + 0x52f6a452, 0x3b4d763b, 0xd661b7d6, 0xb3ce7db3, + 0x297b5229, 0xe33edde3, 0x2f715e2f, 0x84971384, + 0x53f5a653, 0xd168b9d1, 0x00000000, 0xed2cc1ed, + 0x20604020, 0xfc1fe3fc, 0xb1c879b1, 0x5bedb65b, + 0x6abed46a, 0xcb468dcb, 0xbed967be, 0x394b7239, + 0x4ade944a, 0x4cd4984c, 0x58e8b058, 0xcf4a85cf, + 0xd06bbbd0, 0xef2ac5ef, 0xaae54faa, 0xfb16edfb, + 0x43c58643, 0x4dd79a4d, 0x33556633, 0x85941185, + 0x45cf8a45, 0xf910e9f9, 0x02060402, 0x7f81fe7f, + 0x50f0a050, 0x3c44783c, 0x9fba259f, 0xa8e34ba8, + 0x51f3a251, 0xa3fe5da3, 0x40c08040, 0x8f8a058f, + 0x92ad3f92, 0x9dbc219d, 0x38487038, 0xf504f1f5, + 0xbcdf63bc, 0xb6c177b6, 0xda75afda, 0x21634221, + 0x10302010, 0xff1ae5ff, 0xf30efdf3, 0xd26dbfd2, + 0xcd4c81cd, 0x0c14180c, 0x13352613, 0xec2fc3ec, + 0x5fe1be5f, 0x97a23597, 0x44cc8844, 0x17392e17, + 0xc45793c4, 0xa7f255a7, 0x7e82fc7e, 0x3d477a3d, + 0x64acc864, 0x5de7ba5d, 0x192b3219, 0x7395e673, + 0x60a0c060, 0x81981981, 0x4fd19e4f, 0xdc7fa3dc, + 0x22664422, 0x2a7e542a, 0x90ab3b90, 0x88830b88, + 0x46ca8c46, 0xee29c7ee, 0xb8d36bb8, 0x143c2814, + 0xde79a7de, 0x5ee2bc5e, 0x0b1d160b, 0xdb76addb, + 0xe03bdbe0, 0x32566432, 0x3a4e743a, 0x0a1e140a, + 0x49db9249, 0x060a0c06, 0x246c4824, 0x5ce4b85c, + 0xc25d9fc2, 0xd36ebdd3, 0xacef43ac, 0x62a6c462, + 0x91a83991, 0x95a43195, 0xe437d3e4, 0x798bf279, + 0xe732d5e7, 0xc8438bc8, 0x37596e37, 0x6db7da6d, + 0x8d8c018d, 0xd564b1d5, 0x4ed29c4e, 0xa9e049a9, + 0x6cb4d86c, 0x56faac56, 0xf407f3f4, 0xea25cfea, + 0x65afca65, 0x7a8ef47a, 0xaee947ae, 0x08181008, + 0xbad56fba, 0x7888f078, 0x256f4a25, 0x2e725c2e, + 0x1c24381c, 0xa6f157a6, 0xb4c773b4, 0xc65197c6, + 0xe823cbe8, 0xdd7ca1dd, 0x749ce874, 0x1f213e1f, + 0x4bdd964b, 0xbddc61bd, 0x8b860d8b, 0x8a850f8a, + 0x7090e070, 0x3e427c3e, 0xb5c471b5, 0x66aacc66, + 0x48d89048, 0x03050603, 0xf601f7f6, 0x0e121c0e, + 0x61a3c261, 0x355f6a35, 0x57f9ae57, 0xb9d069b9, + 0x86911786, 0xc15899c1, 0x1d273a1d, 0x9eb9279e, + 0xe138d9e1, 0xf813ebf8, 0x98b32b98, 0x11332211, + 0x69bbd269, 0xd970a9d9, 0x8e89078e, 0x94a73394, + 0x9bb62d9b, 0x1e223c1e, 0x87921587, 0xe920c9e9, + 0xce4987ce, 0x55ffaa55, 0x28785028, 0xdf7aa5df, + 0x8c8f038c, 0xa1f859a1, 0x89800989, 0x0d171a0d, + 0xbfda65bf, 0xe631d7e6, 0x42c68442, 0x68b8d068, + 0x41c38241, 0x99b02999, 0x2d775a2d, 0x0f111e0f, + 0xb0cb7bb0, 0x54fca854, 0xbbd66dbb, 0x163a2c16, +}; + +__constant u32 te3[256] = +{ + 0x6363a5c6, 0x7c7c84f8, 0x777799ee, 0x7b7b8df6, + 0xf2f20dff, 0x6b6bbdd6, 0x6f6fb1de, 0xc5c55491, + 0x30305060, 0x01010302, 0x6767a9ce, 0x2b2b7d56, + 0xfefe19e7, 0xd7d762b5, 0xababe64d, 0x76769aec, + 0xcaca458f, 0x82829d1f, 0xc9c94089, 0x7d7d87fa, + 0xfafa15ef, 0x5959ebb2, 0x4747c98e, 0xf0f00bfb, + 0xadadec41, 0xd4d467b3, 0xa2a2fd5f, 0xafafea45, + 0x9c9cbf23, 0xa4a4f753, 0x727296e4, 0xc0c05b9b, + 0xb7b7c275, 0xfdfd1ce1, 0x9393ae3d, 0x26266a4c, + 0x36365a6c, 0x3f3f417e, 0xf7f702f5, 0xcccc4f83, + 0x34345c68, 0xa5a5f451, 0xe5e534d1, 0xf1f108f9, + 0x717193e2, 0xd8d873ab, 0x31315362, 0x15153f2a, + 0x04040c08, 0xc7c75295, 0x23236546, 0xc3c35e9d, + 0x18182830, 0x9696a137, 0x05050f0a, 0x9a9ab52f, + 0x0707090e, 0x12123624, 0x80809b1b, 0xe2e23ddf, + 0xebeb26cd, 0x2727694e, 0xb2b2cd7f, 0x75759fea, + 0x09091b12, 0x83839e1d, 0x2c2c7458, 0x1a1a2e34, + 0x1b1b2d36, 0x6e6eb2dc, 0x5a5aeeb4, 0xa0a0fb5b, + 0x5252f6a4, 0x3b3b4d76, 0xd6d661b7, 0xb3b3ce7d, + 0x29297b52, 0xe3e33edd, 0x2f2f715e, 0x84849713, + 0x5353f5a6, 0xd1d168b9, 0x00000000, 0xeded2cc1, + 0x20206040, 0xfcfc1fe3, 0xb1b1c879, 0x5b5bedb6, + 0x6a6abed4, 0xcbcb468d, 0xbebed967, 0x39394b72, + 0x4a4ade94, 0x4c4cd498, 0x5858e8b0, 0xcfcf4a85, + 0xd0d06bbb, 0xefef2ac5, 0xaaaae54f, 0xfbfb16ed, + 0x4343c586, 0x4d4dd79a, 0x33335566, 0x85859411, + 0x4545cf8a, 0xf9f910e9, 0x02020604, 0x7f7f81fe, + 0x5050f0a0, 0x3c3c4478, 0x9f9fba25, 0xa8a8e34b, + 0x5151f3a2, 0xa3a3fe5d, 0x4040c080, 0x8f8f8a05, + 0x9292ad3f, 0x9d9dbc21, 0x38384870, 0xf5f504f1, + 0xbcbcdf63, 0xb6b6c177, 0xdada75af, 0x21216342, + 0x10103020, 0xffff1ae5, 0xf3f30efd, 0xd2d26dbf, + 0xcdcd4c81, 0x0c0c1418, 0x13133526, 0xecec2fc3, + 0x5f5fe1be, 0x9797a235, 0x4444cc88, 0x1717392e, + 0xc4c45793, 0xa7a7f255, 0x7e7e82fc, 0x3d3d477a, + 0x6464acc8, 0x5d5de7ba, 0x19192b32, 0x737395e6, + 0x6060a0c0, 0x81819819, 0x4f4fd19e, 0xdcdc7fa3, + 0x22226644, 0x2a2a7e54, 0x9090ab3b, 0x8888830b, + 0x4646ca8c, 0xeeee29c7, 0xb8b8d36b, 0x14143c28, + 0xdede79a7, 0x5e5ee2bc, 0x0b0b1d16, 0xdbdb76ad, + 0xe0e03bdb, 0x32325664, 0x3a3a4e74, 0x0a0a1e14, + 0x4949db92, 0x06060a0c, 0x24246c48, 0x5c5ce4b8, + 0xc2c25d9f, 0xd3d36ebd, 0xacacef43, 0x6262a6c4, + 0x9191a839, 0x9595a431, 0xe4e437d3, 0x79798bf2, + 0xe7e732d5, 0xc8c8438b, 0x3737596e, 0x6d6db7da, + 0x8d8d8c01, 0xd5d564b1, 0x4e4ed29c, 0xa9a9e049, + 0x6c6cb4d8, 0x5656faac, 0xf4f407f3, 0xeaea25cf, + 0x6565afca, 0x7a7a8ef4, 0xaeaee947, 0x08081810, + 0xbabad56f, 0x787888f0, 0x25256f4a, 0x2e2e725c, + 0x1c1c2438, 0xa6a6f157, 0xb4b4c773, 0xc6c65197, + 0xe8e823cb, 0xdddd7ca1, 0x74749ce8, 0x1f1f213e, + 0x4b4bdd96, 0xbdbddc61, 0x8b8b860d, 0x8a8a850f, + 0x707090e0, 0x3e3e427c, 0xb5b5c471, 0x6666aacc, + 0x4848d890, 0x03030506, 0xf6f601f7, 0x0e0e121c, + 0x6161a3c2, 0x35355f6a, 0x5757f9ae, 0xb9b9d069, + 0x86869117, 0xc1c15899, 0x1d1d273a, 0x9e9eb927, + 0xe1e138d9, 0xf8f813eb, 0x9898b32b, 0x11113322, + 0x6969bbd2, 0xd9d970a9, 0x8e8e8907, 0x9494a733, + 0x9b9bb62d, 0x1e1e223c, 0x87879215, 0xe9e920c9, + 0xcece4987, 0x5555ffaa, 0x28287850, 0xdfdf7aa5, + 0x8c8c8f03, 0xa1a1f859, 0x89898009, 0x0d0d171a, + 0xbfbfda65, 0xe6e631d7, 0x4242c684, 0x6868b8d0, + 0x4141c382, 0x9999b029, 0x2d2d775a, 0x0f0f111e, + 0xb0b0cb7b, 0x5454fca8, 0xbbbbd66d, 0x16163a2c, +}; + +__constant u32 te4[256] = +{ + 0x63636363, 0x7c7c7c7c, 0x77777777, 0x7b7b7b7b, + 0xf2f2f2f2, 0x6b6b6b6b, 0x6f6f6f6f, 0xc5c5c5c5, + 0x30303030, 0x01010101, 0x67676767, 0x2b2b2b2b, + 0xfefefefe, 0xd7d7d7d7, 0xabababab, 0x76767676, + 0xcacacaca, 0x82828282, 0xc9c9c9c9, 0x7d7d7d7d, + 0xfafafafa, 0x59595959, 0x47474747, 0xf0f0f0f0, + 0xadadadad, 0xd4d4d4d4, 0xa2a2a2a2, 0xafafafaf, + 0x9c9c9c9c, 0xa4a4a4a4, 0x72727272, 0xc0c0c0c0, + 0xb7b7b7b7, 0xfdfdfdfd, 0x93939393, 0x26262626, + 0x36363636, 0x3f3f3f3f, 0xf7f7f7f7, 0xcccccccc, + 0x34343434, 0xa5a5a5a5, 0xe5e5e5e5, 0xf1f1f1f1, + 0x71717171, 0xd8d8d8d8, 0x31313131, 0x15151515, + 0x04040404, 0xc7c7c7c7, 0x23232323, 0xc3c3c3c3, + 0x18181818, 0x96969696, 0x05050505, 0x9a9a9a9a, + 0x07070707, 0x12121212, 0x80808080, 0xe2e2e2e2, + 0xebebebeb, 0x27272727, 0xb2b2b2b2, 0x75757575, + 0x09090909, 0x83838383, 0x2c2c2c2c, 0x1a1a1a1a, + 0x1b1b1b1b, 0x6e6e6e6e, 0x5a5a5a5a, 0xa0a0a0a0, + 0x52525252, 0x3b3b3b3b, 0xd6d6d6d6, 0xb3b3b3b3, + 0x29292929, 0xe3e3e3e3, 0x2f2f2f2f, 0x84848484, + 0x53535353, 0xd1d1d1d1, 0x00000000, 0xedededed, + 0x20202020, 0xfcfcfcfc, 0xb1b1b1b1, 0x5b5b5b5b, + 0x6a6a6a6a, 0xcbcbcbcb, 0xbebebebe, 0x39393939, + 0x4a4a4a4a, 0x4c4c4c4c, 0x58585858, 0xcfcfcfcf, + 0xd0d0d0d0, 0xefefefef, 0xaaaaaaaa, 0xfbfbfbfb, + 0x43434343, 0x4d4d4d4d, 0x33333333, 0x85858585, + 0x45454545, 0xf9f9f9f9, 0x02020202, 0x7f7f7f7f, + 0x50505050, 0x3c3c3c3c, 0x9f9f9f9f, 0xa8a8a8a8, + 0x51515151, 0xa3a3a3a3, 0x40404040, 0x8f8f8f8f, + 0x92929292, 0x9d9d9d9d, 0x38383838, 0xf5f5f5f5, + 0xbcbcbcbc, 0xb6b6b6b6, 0xdadadada, 0x21212121, + 0x10101010, 0xffffffff, 0xf3f3f3f3, 0xd2d2d2d2, + 0xcdcdcdcd, 0x0c0c0c0c, 0x13131313, 0xecececec, + 0x5f5f5f5f, 0x97979797, 0x44444444, 0x17171717, + 0xc4c4c4c4, 0xa7a7a7a7, 0x7e7e7e7e, 0x3d3d3d3d, + 0x64646464, 0x5d5d5d5d, 0x19191919, 0x73737373, + 0x60606060, 0x81818181, 0x4f4f4f4f, 0xdcdcdcdc, + 0x22222222, 0x2a2a2a2a, 0x90909090, 0x88888888, + 0x46464646, 0xeeeeeeee, 0xb8b8b8b8, 0x14141414, + 0xdededede, 0x5e5e5e5e, 0x0b0b0b0b, 0xdbdbdbdb, + 0xe0e0e0e0, 0x32323232, 0x3a3a3a3a, 0x0a0a0a0a, + 0x49494949, 0x06060606, 0x24242424, 0x5c5c5c5c, + 0xc2c2c2c2, 0xd3d3d3d3, 0xacacacac, 0x62626262, + 0x91919191, 0x95959595, 0xe4e4e4e4, 0x79797979, + 0xe7e7e7e7, 0xc8c8c8c8, 0x37373737, 0x6d6d6d6d, + 0x8d8d8d8d, 0xd5d5d5d5, 0x4e4e4e4e, 0xa9a9a9a9, + 0x6c6c6c6c, 0x56565656, 0xf4f4f4f4, 0xeaeaeaea, + 0x65656565, 0x7a7a7a7a, 0xaeaeaeae, 0x08080808, + 0xbabababa, 0x78787878, 0x25252525, 0x2e2e2e2e, + 0x1c1c1c1c, 0xa6a6a6a6, 0xb4b4b4b4, 0xc6c6c6c6, + 0xe8e8e8e8, 0xdddddddd, 0x74747474, 0x1f1f1f1f, + 0x4b4b4b4b, 0xbdbdbdbd, 0x8b8b8b8b, 0x8a8a8a8a, + 0x70707070, 0x3e3e3e3e, 0xb5b5b5b5, 0x66666666, + 0x48484848, 0x03030303, 0xf6f6f6f6, 0x0e0e0e0e, + 0x61616161, 0x35353535, 0x57575757, 0xb9b9b9b9, + 0x86868686, 0xc1c1c1c1, 0x1d1d1d1d, 0x9e9e9e9e, + 0xe1e1e1e1, 0xf8f8f8f8, 0x98989898, 0x11111111, + 0x69696969, 0xd9d9d9d9, 0x8e8e8e8e, 0x94949494, + 0x9b9b9b9b, 0x1e1e1e1e, 0x87878787, 0xe9e9e9e9, + 0xcececece, 0x55555555, 0x28282828, 0xdfdfdfdf, + 0x8c8c8c8c, 0xa1a1a1a1, 0x89898989, 0x0d0d0d0d, + 0xbfbfbfbf, 0xe6e6e6e6, 0x42424242, 0x68686868, + 0x41414141, 0x99999999, 0x2d2d2d2d, 0x0f0f0f0f, + 0xb0b0b0b0, 0x54545454, 0xbbbbbbbb, 0x16161616, +}; + +__constant u32 td0[256] = +{ + 0x51f4a750, 0x7e416553, 0x1a17a4c3, 0x3a275e96, + 0x3bab6bcb, 0x1f9d45f1, 0xacfa58ab, 0x4be30393, + 0x2030fa55, 0xad766df6, 0x88cc7691, 0xf5024c25, + 0x4fe5d7fc, 0xc52acbd7, 0x26354480, 0xb562a38f, + 0xdeb15a49, 0x25ba1b67, 0x45ea0e98, 0x5dfec0e1, + 0xc32f7502, 0x814cf012, 0x8d4697a3, 0x6bd3f9c6, + 0x038f5fe7, 0x15929c95, 0xbf6d7aeb, 0x955259da, + 0xd4be832d, 0x587421d3, 0x49e06929, 0x8ec9c844, + 0x75c2896a, 0xf48e7978, 0x99583e6b, 0x27b971dd, + 0xbee14fb6, 0xf088ad17, 0xc920ac66, 0x7dce3ab4, + 0x63df4a18, 0xe51a3182, 0x97513360, 0x62537f45, + 0xb16477e0, 0xbb6bae84, 0xfe81a01c, 0xf9082b94, + 0x70486858, 0x8f45fd19, 0x94de6c87, 0x527bf8b7, + 0xab73d323, 0x724b02e2, 0xe31f8f57, 0x6655ab2a, + 0xb2eb2807, 0x2fb5c203, 0x86c57b9a, 0xd33708a5, + 0x302887f2, 0x23bfa5b2, 0x02036aba, 0xed16825c, + 0x8acf1c2b, 0xa779b492, 0xf307f2f0, 0x4e69e2a1, + 0x65daf4cd, 0x0605bed5, 0xd134621f, 0xc4a6fe8a, + 0x342e539d, 0xa2f355a0, 0x058ae132, 0xa4f6eb75, + 0x0b83ec39, 0x4060efaa, 0x5e719f06, 0xbd6e1051, + 0x3e218af9, 0x96dd063d, 0xdd3e05ae, 0x4de6bd46, + 0x91548db5, 0x71c45d05, 0x0406d46f, 0x605015ff, + 0x1998fb24, 0xd6bde997, 0x894043cc, 0x67d99e77, + 0xb0e842bd, 0x07898b88, 0xe7195b38, 0x79c8eedb, + 0xa17c0a47, 0x7c420fe9, 0xf8841ec9, 0x00000000, + 0x09808683, 0x322bed48, 0x1e1170ac, 0x6c5a724e, + 0xfd0efffb, 0x0f853856, 0x3daed51e, 0x362d3927, + 0x0a0fd964, 0x685ca621, 0x9b5b54d1, 0x24362e3a, + 0x0c0a67b1, 0x9357e70f, 0xb4ee96d2, 0x1b9b919e, + 0x80c0c54f, 0x61dc20a2, 0x5a774b69, 0x1c121a16, + 0xe293ba0a, 0xc0a02ae5, 0x3c22e043, 0x121b171d, + 0x0e090d0b, 0xf28bc7ad, 0x2db6a8b9, 0x141ea9c8, + 0x57f11985, 0xaf75074c, 0xee99ddbb, 0xa37f60fd, + 0xf701269f, 0x5c72f5bc, 0x44663bc5, 0x5bfb7e34, + 0x8b432976, 0xcb23c6dc, 0xb6edfc68, 0xb8e4f163, + 0xd731dcca, 0x42638510, 0x13972240, 0x84c61120, + 0x854a247d, 0xd2bb3df8, 0xaef93211, 0xc729a16d, + 0x1d9e2f4b, 0xdcb230f3, 0x0d8652ec, 0x77c1e3d0, + 0x2bb3166c, 0xa970b999, 0x119448fa, 0x47e96422, + 0xa8fc8cc4, 0xa0f03f1a, 0x567d2cd8, 0x223390ef, + 0x87494ec7, 0xd938d1c1, 0x8ccaa2fe, 0x98d40b36, + 0xa6f581cf, 0xa57ade28, 0xdab78e26, 0x3fadbfa4, + 0x2c3a9de4, 0x5078920d, 0x6a5fcc9b, 0x547e4662, + 0xf68d13c2, 0x90d8b8e8, 0x2e39f75e, 0x82c3aff5, + 0x9f5d80be, 0x69d0937c, 0x6fd52da9, 0xcf2512b3, + 0xc8ac993b, 0x10187da7, 0xe89c636e, 0xdb3bbb7b, + 0xcd267809, 0x6e5918f4, 0xec9ab701, 0x834f9aa8, + 0xe6956e65, 0xaaffe67e, 0x21bccf08, 0xef15e8e6, + 0xbae79bd9, 0x4a6f36ce, 0xea9f09d4, 0x29b07cd6, + 0x31a4b2af, 0x2a3f2331, 0xc6a59430, 0x35a266c0, + 0x744ebc37, 0xfc82caa6, 0xe090d0b0, 0x33a7d815, + 0xf104984a, 0x41ecdaf7, 0x7fcd500e, 0x1791f62f, + 0x764dd68d, 0x43efb04d, 0xccaa4d54, 0xe49604df, + 0x9ed1b5e3, 0x4c6a881b, 0xc12c1fb8, 0x4665517f, + 0x9d5eea04, 0x018c355d, 0xfa877473, 0xfb0b412e, + 0xb3671d5a, 0x92dbd252, 0xe9105633, 0x6dd64713, + 0x9ad7618c, 0x37a10c7a, 0x59f8148e, 0xeb133c89, + 0xcea927ee, 0xb761c935, 0xe11ce5ed, 0x7a47b13c, + 0x9cd2df59, 0x55f2733f, 0x1814ce79, 0x73c737bf, + 0x53f7cdea, 0x5ffdaa5b, 0xdf3d6f14, 0x7844db86, + 0xcaaff381, 0xb968c43e, 0x3824342c, 0xc2a3405f, + 0x161dc372, 0xbce2250c, 0x283c498b, 0xff0d9541, + 0x39a80171, 0x080cb3de, 0xd8b4e49c, 0x6456c190, + 0x7bcb8461, 0xd532b670, 0x486c5c74, 0xd0b85742, +}; + +__constant u32 td1[256] = +{ + 0x5051f4a7, 0x537e4165, 0xc31a17a4, 0x963a275e, + 0xcb3bab6b, 0xf11f9d45, 0xabacfa58, 0x934be303, + 0x552030fa, 0xf6ad766d, 0x9188cc76, 0x25f5024c, + 0xfc4fe5d7, 0xd7c52acb, 0x80263544, 0x8fb562a3, + 0x49deb15a, 0x6725ba1b, 0x9845ea0e, 0xe15dfec0, + 0x02c32f75, 0x12814cf0, 0xa38d4697, 0xc66bd3f9, + 0xe7038f5f, 0x9515929c, 0xebbf6d7a, 0xda955259, + 0x2dd4be83, 0xd3587421, 0x2949e069, 0x448ec9c8, + 0x6a75c289, 0x78f48e79, 0x6b99583e, 0xdd27b971, + 0xb6bee14f, 0x17f088ad, 0x66c920ac, 0xb47dce3a, + 0x1863df4a, 0x82e51a31, 0x60975133, 0x4562537f, + 0xe0b16477, 0x84bb6bae, 0x1cfe81a0, 0x94f9082b, + 0x58704868, 0x198f45fd, 0x8794de6c, 0xb7527bf8, + 0x23ab73d3, 0xe2724b02, 0x57e31f8f, 0x2a6655ab, + 0x07b2eb28, 0x032fb5c2, 0x9a86c57b, 0xa5d33708, + 0xf2302887, 0xb223bfa5, 0xba02036a, 0x5ced1682, + 0x2b8acf1c, 0x92a779b4, 0xf0f307f2, 0xa14e69e2, + 0xcd65daf4, 0xd50605be, 0x1fd13462, 0x8ac4a6fe, + 0x9d342e53, 0xa0a2f355, 0x32058ae1, 0x75a4f6eb, + 0x390b83ec, 0xaa4060ef, 0x065e719f, 0x51bd6e10, + 0xf93e218a, 0x3d96dd06, 0xaedd3e05, 0x464de6bd, + 0xb591548d, 0x0571c45d, 0x6f0406d4, 0xff605015, + 0x241998fb, 0x97d6bde9, 0xcc894043, 0x7767d99e, + 0xbdb0e842, 0x8807898b, 0x38e7195b, 0xdb79c8ee, + 0x47a17c0a, 0xe97c420f, 0xc9f8841e, 0x00000000, + 0x83098086, 0x48322bed, 0xac1e1170, 0x4e6c5a72, + 0xfbfd0eff, 0x560f8538, 0x1e3daed5, 0x27362d39, + 0x640a0fd9, 0x21685ca6, 0xd19b5b54, 0x3a24362e, + 0xb10c0a67, 0x0f9357e7, 0xd2b4ee96, 0x9e1b9b91, + 0x4f80c0c5, 0xa261dc20, 0x695a774b, 0x161c121a, + 0x0ae293ba, 0xe5c0a02a, 0x433c22e0, 0x1d121b17, + 0x0b0e090d, 0xadf28bc7, 0xb92db6a8, 0xc8141ea9, + 0x8557f119, 0x4caf7507, 0xbbee99dd, 0xfda37f60, + 0x9ff70126, 0xbc5c72f5, 0xc544663b, 0x345bfb7e, + 0x768b4329, 0xdccb23c6, 0x68b6edfc, 0x63b8e4f1, + 0xcad731dc, 0x10426385, 0x40139722, 0x2084c611, + 0x7d854a24, 0xf8d2bb3d, 0x11aef932, 0x6dc729a1, + 0x4b1d9e2f, 0xf3dcb230, 0xec0d8652, 0xd077c1e3, + 0x6c2bb316, 0x99a970b9, 0xfa119448, 0x2247e964, + 0xc4a8fc8c, 0x1aa0f03f, 0xd8567d2c, 0xef223390, + 0xc787494e, 0xc1d938d1, 0xfe8ccaa2, 0x3698d40b, + 0xcfa6f581, 0x28a57ade, 0x26dab78e, 0xa43fadbf, + 0xe42c3a9d, 0x0d507892, 0x9b6a5fcc, 0x62547e46, + 0xc2f68d13, 0xe890d8b8, 0x5e2e39f7, 0xf582c3af, + 0xbe9f5d80, 0x7c69d093, 0xa96fd52d, 0xb3cf2512, + 0x3bc8ac99, 0xa710187d, 0x6ee89c63, 0x7bdb3bbb, + 0x09cd2678, 0xf46e5918, 0x01ec9ab7, 0xa8834f9a, + 0x65e6956e, 0x7eaaffe6, 0x0821bccf, 0xe6ef15e8, + 0xd9bae79b, 0xce4a6f36, 0xd4ea9f09, 0xd629b07c, + 0xaf31a4b2, 0x312a3f23, 0x30c6a594, 0xc035a266, + 0x37744ebc, 0xa6fc82ca, 0xb0e090d0, 0x1533a7d8, + 0x4af10498, 0xf741ecda, 0x0e7fcd50, 0x2f1791f6, + 0x8d764dd6, 0x4d43efb0, 0x54ccaa4d, 0xdfe49604, + 0xe39ed1b5, 0x1b4c6a88, 0xb8c12c1f, 0x7f466551, + 0x049d5eea, 0x5d018c35, 0x73fa8774, 0x2efb0b41, + 0x5ab3671d, 0x5292dbd2, 0x33e91056, 0x136dd647, + 0x8c9ad761, 0x7a37a10c, 0x8e59f814, 0x89eb133c, + 0xeecea927, 0x35b761c9, 0xede11ce5, 0x3c7a47b1, + 0x599cd2df, 0x3f55f273, 0x791814ce, 0xbf73c737, + 0xea53f7cd, 0x5b5ffdaa, 0x14df3d6f, 0x867844db, + 0x81caaff3, 0x3eb968c4, 0x2c382434, 0x5fc2a340, + 0x72161dc3, 0x0cbce225, 0x8b283c49, 0x41ff0d95, + 0x7139a801, 0xde080cb3, 0x9cd8b4e4, 0x906456c1, + 0x617bcb84, 0x70d532b6, 0x74486c5c, 0x42d0b857, +}; + +__constant u32 td2[256] = +{ + 0xa75051f4, 0x65537e41, 0xa4c31a17, 0x5e963a27, + 0x6bcb3bab, 0x45f11f9d, 0x58abacfa, 0x03934be3, + 0xfa552030, 0x6df6ad76, 0x769188cc, 0x4c25f502, + 0xd7fc4fe5, 0xcbd7c52a, 0x44802635, 0xa38fb562, + 0x5a49deb1, 0x1b6725ba, 0x0e9845ea, 0xc0e15dfe, + 0x7502c32f, 0xf012814c, 0x97a38d46, 0xf9c66bd3, + 0x5fe7038f, 0x9c951592, 0x7aebbf6d, 0x59da9552, + 0x832dd4be, 0x21d35874, 0x692949e0, 0xc8448ec9, + 0x896a75c2, 0x7978f48e, 0x3e6b9958, 0x71dd27b9, + 0x4fb6bee1, 0xad17f088, 0xac66c920, 0x3ab47dce, + 0x4a1863df, 0x3182e51a, 0x33609751, 0x7f456253, + 0x77e0b164, 0xae84bb6b, 0xa01cfe81, 0x2b94f908, + 0x68587048, 0xfd198f45, 0x6c8794de, 0xf8b7527b, + 0xd323ab73, 0x02e2724b, 0x8f57e31f, 0xab2a6655, + 0x2807b2eb, 0xc2032fb5, 0x7b9a86c5, 0x08a5d337, + 0x87f23028, 0xa5b223bf, 0x6aba0203, 0x825ced16, + 0x1c2b8acf, 0xb492a779, 0xf2f0f307, 0xe2a14e69, + 0xf4cd65da, 0xbed50605, 0x621fd134, 0xfe8ac4a6, + 0x539d342e, 0x55a0a2f3, 0xe132058a, 0xeb75a4f6, + 0xec390b83, 0xefaa4060, 0x9f065e71, 0x1051bd6e, + 0x8af93e21, 0x063d96dd, 0x05aedd3e, 0xbd464de6, + 0x8db59154, 0x5d0571c4, 0xd46f0406, 0x15ff6050, + 0xfb241998, 0xe997d6bd, 0x43cc8940, 0x9e7767d9, + 0x42bdb0e8, 0x8b880789, 0x5b38e719, 0xeedb79c8, + 0x0a47a17c, 0x0fe97c42, 0x1ec9f884, 0x00000000, + 0x86830980, 0xed48322b, 0x70ac1e11, 0x724e6c5a, + 0xfffbfd0e, 0x38560f85, 0xd51e3dae, 0x3927362d, + 0xd9640a0f, 0xa621685c, 0x54d19b5b, 0x2e3a2436, + 0x67b10c0a, 0xe70f9357, 0x96d2b4ee, 0x919e1b9b, + 0xc54f80c0, 0x20a261dc, 0x4b695a77, 0x1a161c12, + 0xba0ae293, 0x2ae5c0a0, 0xe0433c22, 0x171d121b, + 0x0d0b0e09, 0xc7adf28b, 0xa8b92db6, 0xa9c8141e, + 0x198557f1, 0x074caf75, 0xddbbee99, 0x60fda37f, + 0x269ff701, 0xf5bc5c72, 0x3bc54466, 0x7e345bfb, + 0x29768b43, 0xc6dccb23, 0xfc68b6ed, 0xf163b8e4, + 0xdccad731, 0x85104263, 0x22401397, 0x112084c6, + 0x247d854a, 0x3df8d2bb, 0x3211aef9, 0xa16dc729, + 0x2f4b1d9e, 0x30f3dcb2, 0x52ec0d86, 0xe3d077c1, + 0x166c2bb3, 0xb999a970, 0x48fa1194, 0x642247e9, + 0x8cc4a8fc, 0x3f1aa0f0, 0x2cd8567d, 0x90ef2233, + 0x4ec78749, 0xd1c1d938, 0xa2fe8cca, 0x0b3698d4, + 0x81cfa6f5, 0xde28a57a, 0x8e26dab7, 0xbfa43fad, + 0x9de42c3a, 0x920d5078, 0xcc9b6a5f, 0x4662547e, + 0x13c2f68d, 0xb8e890d8, 0xf75e2e39, 0xaff582c3, + 0x80be9f5d, 0x937c69d0, 0x2da96fd5, 0x12b3cf25, + 0x993bc8ac, 0x7da71018, 0x636ee89c, 0xbb7bdb3b, + 0x7809cd26, 0x18f46e59, 0xb701ec9a, 0x9aa8834f, + 0x6e65e695, 0xe67eaaff, 0xcf0821bc, 0xe8e6ef15, + 0x9bd9bae7, 0x36ce4a6f, 0x09d4ea9f, 0x7cd629b0, + 0xb2af31a4, 0x23312a3f, 0x9430c6a5, 0x66c035a2, + 0xbc37744e, 0xcaa6fc82, 0xd0b0e090, 0xd81533a7, + 0x984af104, 0xdaf741ec, 0x500e7fcd, 0xf62f1791, + 0xd68d764d, 0xb04d43ef, 0x4d54ccaa, 0x04dfe496, + 0xb5e39ed1, 0x881b4c6a, 0x1fb8c12c, 0x517f4665, + 0xea049d5e, 0x355d018c, 0x7473fa87, 0x412efb0b, + 0x1d5ab367, 0xd25292db, 0x5633e910, 0x47136dd6, + 0x618c9ad7, 0x0c7a37a1, 0x148e59f8, 0x3c89eb13, + 0x27eecea9, 0xc935b761, 0xe5ede11c, 0xb13c7a47, + 0xdf599cd2, 0x733f55f2, 0xce791814, 0x37bf73c7, + 0xcdea53f7, 0xaa5b5ffd, 0x6f14df3d, 0xdb867844, + 0xf381caaf, 0xc43eb968, 0x342c3824, 0x405fc2a3, + 0xc372161d, 0x250cbce2, 0x498b283c, 0x9541ff0d, + 0x017139a8, 0xb3de080c, 0xe49cd8b4, 0xc1906456, + 0x84617bcb, 0xb670d532, 0x5c74486c, 0x5742d0b8, +}; + +__constant u32 td3[256] = +{ + 0xf4a75051, 0x4165537e, 0x17a4c31a, 0x275e963a, + 0xab6bcb3b, 0x9d45f11f, 0xfa58abac, 0xe303934b, + 0x30fa5520, 0x766df6ad, 0xcc769188, 0x024c25f5, + 0xe5d7fc4f, 0x2acbd7c5, 0x35448026, 0x62a38fb5, + 0xb15a49de, 0xba1b6725, 0xea0e9845, 0xfec0e15d, + 0x2f7502c3, 0x4cf01281, 0x4697a38d, 0xd3f9c66b, + 0x8f5fe703, 0x929c9515, 0x6d7aebbf, 0x5259da95, + 0xbe832dd4, 0x7421d358, 0xe0692949, 0xc9c8448e, + 0xc2896a75, 0x8e7978f4, 0x583e6b99, 0xb971dd27, + 0xe14fb6be, 0x88ad17f0, 0x20ac66c9, 0xce3ab47d, + 0xdf4a1863, 0x1a3182e5, 0x51336097, 0x537f4562, + 0x6477e0b1, 0x6bae84bb, 0x81a01cfe, 0x082b94f9, + 0x48685870, 0x45fd198f, 0xde6c8794, 0x7bf8b752, + 0x73d323ab, 0x4b02e272, 0x1f8f57e3, 0x55ab2a66, + 0xeb2807b2, 0xb5c2032f, 0xc57b9a86, 0x3708a5d3, + 0x2887f230, 0xbfa5b223, 0x036aba02, 0x16825ced, + 0xcf1c2b8a, 0x79b492a7, 0x07f2f0f3, 0x69e2a14e, + 0xdaf4cd65, 0x05bed506, 0x34621fd1, 0xa6fe8ac4, + 0x2e539d34, 0xf355a0a2, 0x8ae13205, 0xf6eb75a4, + 0x83ec390b, 0x60efaa40, 0x719f065e, 0x6e1051bd, + 0x218af93e, 0xdd063d96, 0x3e05aedd, 0xe6bd464d, + 0x548db591, 0xc45d0571, 0x06d46f04, 0x5015ff60, + 0x98fb2419, 0xbde997d6, 0x4043cc89, 0xd99e7767, + 0xe842bdb0, 0x898b8807, 0x195b38e7, 0xc8eedb79, + 0x7c0a47a1, 0x420fe97c, 0x841ec9f8, 0x00000000, + 0x80868309, 0x2bed4832, 0x1170ac1e, 0x5a724e6c, + 0x0efffbfd, 0x8538560f, 0xaed51e3d, 0x2d392736, + 0x0fd9640a, 0x5ca62168, 0x5b54d19b, 0x362e3a24, + 0x0a67b10c, 0x57e70f93, 0xee96d2b4, 0x9b919e1b, + 0xc0c54f80, 0xdc20a261, 0x774b695a, 0x121a161c, + 0x93ba0ae2, 0xa02ae5c0, 0x22e0433c, 0x1b171d12, + 0x090d0b0e, 0x8bc7adf2, 0xb6a8b92d, 0x1ea9c814, + 0xf1198557, 0x75074caf, 0x99ddbbee, 0x7f60fda3, + 0x01269ff7, 0x72f5bc5c, 0x663bc544, 0xfb7e345b, + 0x4329768b, 0x23c6dccb, 0xedfc68b6, 0xe4f163b8, + 0x31dccad7, 0x63851042, 0x97224013, 0xc6112084, + 0x4a247d85, 0xbb3df8d2, 0xf93211ae, 0x29a16dc7, + 0x9e2f4b1d, 0xb230f3dc, 0x8652ec0d, 0xc1e3d077, + 0xb3166c2b, 0x70b999a9, 0x9448fa11, 0xe9642247, + 0xfc8cc4a8, 0xf03f1aa0, 0x7d2cd856, 0x3390ef22, + 0x494ec787, 0x38d1c1d9, 0xcaa2fe8c, 0xd40b3698, + 0xf581cfa6, 0x7ade28a5, 0xb78e26da, 0xadbfa43f, + 0x3a9de42c, 0x78920d50, 0x5fcc9b6a, 0x7e466254, + 0x8d13c2f6, 0xd8b8e890, 0x39f75e2e, 0xc3aff582, + 0x5d80be9f, 0xd0937c69, 0xd52da96f, 0x2512b3cf, + 0xac993bc8, 0x187da710, 0x9c636ee8, 0x3bbb7bdb, + 0x267809cd, 0x5918f46e, 0x9ab701ec, 0x4f9aa883, + 0x956e65e6, 0xffe67eaa, 0xbccf0821, 0x15e8e6ef, + 0xe79bd9ba, 0x6f36ce4a, 0x9f09d4ea, 0xb07cd629, + 0xa4b2af31, 0x3f23312a, 0xa59430c6, 0xa266c035, + 0x4ebc3774, 0x82caa6fc, 0x90d0b0e0, 0xa7d81533, + 0x04984af1, 0xecdaf741, 0xcd500e7f, 0x91f62f17, + 0x4dd68d76, 0xefb04d43, 0xaa4d54cc, 0x9604dfe4, + 0xd1b5e39e, 0x6a881b4c, 0x2c1fb8c1, 0x65517f46, + 0x5eea049d, 0x8c355d01, 0x877473fa, 0x0b412efb, + 0x671d5ab3, 0xdbd25292, 0x105633e9, 0xd647136d, + 0xd7618c9a, 0xa10c7a37, 0xf8148e59, 0x133c89eb, + 0xa927eece, 0x61c935b7, 0x1ce5ede1, 0x47b13c7a, + 0xd2df599c, 0xf2733f55, 0x14ce7918, 0xc737bf73, + 0xf7cdea53, 0xfdaa5b5f, 0x3d6f14df, 0x44db8678, + 0xaff381ca, 0x68c43eb9, 0x24342c38, 0xa3405fc2, + 0x1dc37216, 0xe2250cbc, 0x3c498b28, 0x0d9541ff, + 0xa8017139, 0x0cb3de08, 0xb4e49cd8, 0x56c19064, + 0xcb84617b, 0x32b670d5, 0x6c5c7448, 0xb85742d0, +}; + +__constant u32 td4[256] = +{ + 0x52525252, 0x09090909, 0x6a6a6a6a, 0xd5d5d5d5, + 0x30303030, 0x36363636, 0xa5a5a5a5, 0x38383838, + 0xbfbfbfbf, 0x40404040, 0xa3a3a3a3, 0x9e9e9e9e, + 0x81818181, 0xf3f3f3f3, 0xd7d7d7d7, 0xfbfbfbfb, + 0x7c7c7c7c, 0xe3e3e3e3, 0x39393939, 0x82828282, + 0x9b9b9b9b, 0x2f2f2f2f, 0xffffffff, 0x87878787, + 0x34343434, 0x8e8e8e8e, 0x43434343, 0x44444444, + 0xc4c4c4c4, 0xdededede, 0xe9e9e9e9, 0xcbcbcbcb, + 0x54545454, 0x7b7b7b7b, 0x94949494, 0x32323232, + 0xa6a6a6a6, 0xc2c2c2c2, 0x23232323, 0x3d3d3d3d, + 0xeeeeeeee, 0x4c4c4c4c, 0x95959595, 0x0b0b0b0b, + 0x42424242, 0xfafafafa, 0xc3c3c3c3, 0x4e4e4e4e, + 0x08080808, 0x2e2e2e2e, 0xa1a1a1a1, 0x66666666, + 0x28282828, 0xd9d9d9d9, 0x24242424, 0xb2b2b2b2, + 0x76767676, 0x5b5b5b5b, 0xa2a2a2a2, 0x49494949, + 0x6d6d6d6d, 0x8b8b8b8b, 0xd1d1d1d1, 0x25252525, + 0x72727272, 0xf8f8f8f8, 0xf6f6f6f6, 0x64646464, + 0x86868686, 0x68686868, 0x98989898, 0x16161616, + 0xd4d4d4d4, 0xa4a4a4a4, 0x5c5c5c5c, 0xcccccccc, + 0x5d5d5d5d, 0x65656565, 0xb6b6b6b6, 0x92929292, + 0x6c6c6c6c, 0x70707070, 0x48484848, 0x50505050, + 0xfdfdfdfd, 0xedededed, 0xb9b9b9b9, 0xdadadada, + 0x5e5e5e5e, 0x15151515, 0x46464646, 0x57575757, + 0xa7a7a7a7, 0x8d8d8d8d, 0x9d9d9d9d, 0x84848484, + 0x90909090, 0xd8d8d8d8, 0xabababab, 0x00000000, + 0x8c8c8c8c, 0xbcbcbcbc, 0xd3d3d3d3, 0x0a0a0a0a, + 0xf7f7f7f7, 0xe4e4e4e4, 0x58585858, 0x05050505, + 0xb8b8b8b8, 0xb3b3b3b3, 0x45454545, 0x06060606, + 0xd0d0d0d0, 0x2c2c2c2c, 0x1e1e1e1e, 0x8f8f8f8f, + 0xcacacaca, 0x3f3f3f3f, 0x0f0f0f0f, 0x02020202, + 0xc1c1c1c1, 0xafafafaf, 0xbdbdbdbd, 0x03030303, + 0x01010101, 0x13131313, 0x8a8a8a8a, 0x6b6b6b6b, + 0x3a3a3a3a, 0x91919191, 0x11111111, 0x41414141, + 0x4f4f4f4f, 0x67676767, 0xdcdcdcdc, 0xeaeaeaea, + 0x97979797, 0xf2f2f2f2, 0xcfcfcfcf, 0xcececece, + 0xf0f0f0f0, 0xb4b4b4b4, 0xe6e6e6e6, 0x73737373, + 0x96969696, 0xacacacac, 0x74747474, 0x22222222, + 0xe7e7e7e7, 0xadadadad, 0x35353535, 0x85858585, + 0xe2e2e2e2, 0xf9f9f9f9, 0x37373737, 0xe8e8e8e8, + 0x1c1c1c1c, 0x75757575, 0xdfdfdfdf, 0x6e6e6e6e, + 0x47474747, 0xf1f1f1f1, 0x1a1a1a1a, 0x71717171, + 0x1d1d1d1d, 0x29292929, 0xc5c5c5c5, 0x89898989, + 0x6f6f6f6f, 0xb7b7b7b7, 0x62626262, 0x0e0e0e0e, + 0xaaaaaaaa, 0x18181818, 0xbebebebe, 0x1b1b1b1b, + 0xfcfcfcfc, 0x56565656, 0x3e3e3e3e, 0x4b4b4b4b, + 0xc6c6c6c6, 0xd2d2d2d2, 0x79797979, 0x20202020, + 0x9a9a9a9a, 0xdbdbdbdb, 0xc0c0c0c0, 0xfefefefe, + 0x78787878, 0xcdcdcdcd, 0x5a5a5a5a, 0xf4f4f4f4, + 0x1f1f1f1f, 0xdddddddd, 0xa8a8a8a8, 0x33333333, + 0x88888888, 0x07070707, 0xc7c7c7c7, 0x31313131, + 0xb1b1b1b1, 0x12121212, 0x10101010, 0x59595959, + 0x27272727, 0x80808080, 0xecececec, 0x5f5f5f5f, + 0x60606060, 0x51515151, 0x7f7f7f7f, 0xa9a9a9a9, + 0x19191919, 0xb5b5b5b5, 0x4a4a4a4a, 0x0d0d0d0d, + 0x2d2d2d2d, 0xe5e5e5e5, 0x7a7a7a7a, 0x9f9f9f9f, + 0x93939393, 0xc9c9c9c9, 0x9c9c9c9c, 0xefefefef, + 0xa0a0a0a0, 0xe0e0e0e0, 0x3b3b3b3b, 0x4d4d4d4d, + 0xaeaeaeae, 0x2a2a2a2a, 0xf5f5f5f5, 0xb0b0b0b0, + 0xc8c8c8c8, 0xebebebeb, 0xbbbbbbbb, 0x3c3c3c3c, + 0x83838383, 0x53535353, 0x99999999, 0x61616161, + 0x17171717, 0x2b2b2b2b, 0x04040404, 0x7e7e7e7e, + 0xbabababa, 0x77777777, 0xd6d6d6d6, 0x26262626, + 0xe1e1e1e1, 0x69696969, 0x14141414, 0x63636363, + 0x55555555, 0x21212121, 0x0c0c0c0c, 0x7d7d7d7d, +}; + +__constant u32 rcon[] = +{ + 0x01000000, 0x02000000, 0x04000000, 0x08000000, + 0x10000000, 0x20000000, 0x40000000, 0x80000000, + 0x1b000000, 0x36000000, +}; + +static void aes256_ExpandKey (u32 *ks, const u32 *ukey) +{ + ks[0] = ukey[0]; + ks[1] = ukey[1]; + ks[2] = ukey[2]; + ks[3] = ukey[3]; + ks[4] = ukey[4]; + ks[5] = ukey[5]; + ks[6] = ukey[6]; + ks[7] = ukey[7]; + + int i; + int j; + + i = 0; + j = 0; + + while (1) + { + u32 temp = ks[j + 7]; + + ks[j + 8] = ks[j + 0] + ^ (te2[(temp >> 16) & 0xff] & 0xff000000) + ^ (te3[(temp >> 8) & 0xff] & 0x00ff0000) + ^ (te0[(temp >> 0) & 0xff] & 0x0000ff00) + ^ (te1[(temp >> 24) & 0xff] & 0x000000ff) + ^ rcon[i]; + + ks[j + 9] = ks[j + 1] ^ ks[j + 8]; + ks[j + 10] = ks[j + 2] ^ ks[j + 9]; + ks[j + 11] = ks[j + 3] ^ ks[j + 10]; + + if (++i == 7) break; + + temp = ks[j + 11]; + + ks[j + 12] = ks[j + 4] + ^ (te2[(temp >> 24) & 0xff] & 0xff000000) + ^ (te3[(temp >> 16) & 0xff] & 0x00ff0000) + ^ (te0[(temp >> 8) & 0xff] & 0x0000ff00) + ^ (te1[(temp >> 0) & 0xff] & 0x000000ff); + + ks[j + 13] = ks[j + 5] ^ ks[j + 12]; + ks[j + 14] = ks[j + 6] ^ ks[j + 13]; + ks[j + 15] = ks[j + 7] ^ ks[j + 14]; + + j += 8; + } +} + +static void aes256_InvertKey (u32 *ks) +{ + for (u32 i = 0, j = 56; i < j; i += 4, j -= 4) + { + u32 temp; + + temp = ks[i + 0]; ks[i + 0] = ks[j + 0]; ks[j + 0] = temp; + temp = ks[i + 1]; ks[i + 1] = ks[j + 1]; ks[j + 1] = temp; + temp = ks[i + 2]; ks[i + 2] = ks[j + 2]; ks[j + 2] = temp; + temp = ks[i + 3]; ks[i + 3] = ks[j + 3]; ks[j + 3] = temp; + } + + for (u32 i = 1, j = 4; i < 14; i += 1, j += 4) + { + ks[j + 0] = + td0[te1[(ks[j + 0] >> 24) & 0xff] & 0xff] ^ + td1[te1[(ks[j + 0] >> 16) & 0xff] & 0xff] ^ + td2[te1[(ks[j + 0] >> 8) & 0xff] & 0xff] ^ + td3[te1[(ks[j + 0] >> 0) & 0xff] & 0xff]; + + ks[j + 1] = + td0[te1[(ks[j + 1] >> 24) & 0xff] & 0xff] ^ + td1[te1[(ks[j + 1] >> 16) & 0xff] & 0xff] ^ + td2[te1[(ks[j + 1] >> 8) & 0xff] & 0xff] ^ + td3[te1[(ks[j + 1] >> 0) & 0xff] & 0xff]; + + ks[j + 2] = + td0[te1[(ks[j + 2] >> 24) & 0xff] & 0xff] ^ + td1[te1[(ks[j + 2] >> 16) & 0xff] & 0xff] ^ + td2[te1[(ks[j + 2] >> 8) & 0xff] & 0xff] ^ + td3[te1[(ks[j + 2] >> 0) & 0xff] & 0xff]; + + ks[j + 3] = + td0[te1[(ks[j + 3] >> 24) & 0xff] & 0xff] ^ + td1[te1[(ks[j + 3] >> 16) & 0xff] & 0xff] ^ + td2[te1[(ks[j + 3] >> 8) & 0xff] & 0xff] ^ + td3[te1[(ks[j + 3] >> 0) & 0xff] & 0xff]; + } +} + +static void aes256_set_encrypt_key (u32 *ks, const u32 *ukey) +{ + u32 ukey_s[8]; + + ukey_s[0] = swap_workaround (ukey[0]); + ukey_s[1] = swap_workaround (ukey[1]); + ukey_s[2] = swap_workaround (ukey[2]); + ukey_s[3] = swap_workaround (ukey[3]); + ukey_s[4] = swap_workaround (ukey[4]); + ukey_s[5] = swap_workaround (ukey[5]); + ukey_s[6] = swap_workaround (ukey[6]); + ukey_s[7] = swap_workaround (ukey[7]); + + aes256_ExpandKey (ks, ukey_s); +} + +static void aes256_set_decrypt_key (u32 *ks, const u32 *ukey) +{ + u32 ukey_s[8]; + + ukey_s[0] = swap_workaround (ukey[0]); + ukey_s[1] = swap_workaround (ukey[1]); + ukey_s[2] = swap_workaround (ukey[2]); + ukey_s[3] = swap_workaround (ukey[3]); + ukey_s[4] = swap_workaround (ukey[4]); + ukey_s[5] = swap_workaround (ukey[5]); + ukey_s[6] = swap_workaround (ukey[6]); + ukey_s[7] = swap_workaround (ukey[7]); + + aes256_ExpandKey (ks, ukey_s); + + aes256_InvertKey (ks); +} + +static void aes256_decrypt (const u32 *ks, const u32 *in, u32 *out) +{ + u32 in_s[4]; + + in_s[0] = swap_workaround (in[0]); + in_s[1] = swap_workaround (in[1]); + in_s[2] = swap_workaround (in[2]); + in_s[3] = swap_workaround (in[3]); + + u32 s0 = in_s[0] ^ ks[0]; + u32 s1 = in_s[1] ^ ks[1]; + u32 s2 = in_s[2] ^ ks[2]; + u32 s3 = in_s[3] ^ ks[3]; + + u32 t0; + u32 t1; + u32 t2; + u32 t3; + + t0 = td0[s0 >> 24] ^ td1[(s3 >> 16) & 0xff] ^ td2[(s2 >> 8) & 0xff] ^ td3[s1 & 0xff] ^ ks[ 4]; + t1 = td0[s1 >> 24] ^ td1[(s0 >> 16) & 0xff] ^ td2[(s3 >> 8) & 0xff] ^ td3[s2 & 0xff] ^ ks[ 5]; + t2 = td0[s2 >> 24] ^ td1[(s1 >> 16) & 0xff] ^ td2[(s0 >> 8) & 0xff] ^ td3[s3 & 0xff] ^ ks[ 6]; + t3 = td0[s3 >> 24] ^ td1[(s2 >> 16) & 0xff] ^ td2[(s1 >> 8) & 0xff] ^ td3[s0 & 0xff] ^ ks[ 7]; + s0 = td0[t0 >> 24] ^ td1[(t3 >> 16) & 0xff] ^ td2[(t2 >> 8) & 0xff] ^ td3[t1 & 0xff] ^ ks[ 8]; + s1 = td0[t1 >> 24] ^ td1[(t0 >> 16) & 0xff] ^ td2[(t3 >> 8) & 0xff] ^ td3[t2 & 0xff] ^ ks[ 9]; + s2 = td0[t2 >> 24] ^ td1[(t1 >> 16) & 0xff] ^ td2[(t0 >> 8) & 0xff] ^ td3[t3 & 0xff] ^ ks[10]; + s3 = td0[t3 >> 24] ^ td1[(t2 >> 16) & 0xff] ^ td2[(t1 >> 8) & 0xff] ^ td3[t0 & 0xff] ^ ks[11]; + t0 = td0[s0 >> 24] ^ td1[(s3 >> 16) & 0xff] ^ td2[(s2 >> 8) & 0xff] ^ td3[s1 & 0xff] ^ ks[12]; + t1 = td0[s1 >> 24] ^ td1[(s0 >> 16) & 0xff] ^ td2[(s3 >> 8) & 0xff] ^ td3[s2 & 0xff] ^ ks[13]; + t2 = td0[s2 >> 24] ^ td1[(s1 >> 16) & 0xff] ^ td2[(s0 >> 8) & 0xff] ^ td3[s3 & 0xff] ^ ks[14]; + t3 = td0[s3 >> 24] ^ td1[(s2 >> 16) & 0xff] ^ td2[(s1 >> 8) & 0xff] ^ td3[s0 & 0xff] ^ ks[15]; + s0 = td0[t0 >> 24] ^ td1[(t3 >> 16) & 0xff] ^ td2[(t2 >> 8) & 0xff] ^ td3[t1 & 0xff] ^ ks[16]; + s1 = td0[t1 >> 24] ^ td1[(t0 >> 16) & 0xff] ^ td2[(t3 >> 8) & 0xff] ^ td3[t2 & 0xff] ^ ks[17]; + s2 = td0[t2 >> 24] ^ td1[(t1 >> 16) & 0xff] ^ td2[(t0 >> 8) & 0xff] ^ td3[t3 & 0xff] ^ ks[18]; + s3 = td0[t3 >> 24] ^ td1[(t2 >> 16) & 0xff] ^ td2[(t1 >> 8) & 0xff] ^ td3[t0 & 0xff] ^ ks[19]; + t0 = td0[s0 >> 24] ^ td1[(s3 >> 16) & 0xff] ^ td2[(s2 >> 8) & 0xff] ^ td3[s1 & 0xff] ^ ks[20]; + t1 = td0[s1 >> 24] ^ td1[(s0 >> 16) & 0xff] ^ td2[(s3 >> 8) & 0xff] ^ td3[s2 & 0xff] ^ ks[21]; + t2 = td0[s2 >> 24] ^ td1[(s1 >> 16) & 0xff] ^ td2[(s0 >> 8) & 0xff] ^ td3[s3 & 0xff] ^ ks[22]; + t3 = td0[s3 >> 24] ^ td1[(s2 >> 16) & 0xff] ^ td2[(s1 >> 8) & 0xff] ^ td3[s0 & 0xff] ^ ks[23]; + s0 = td0[t0 >> 24] ^ td1[(t3 >> 16) & 0xff] ^ td2[(t2 >> 8) & 0xff] ^ td3[t1 & 0xff] ^ ks[24]; + s1 = td0[t1 >> 24] ^ td1[(t0 >> 16) & 0xff] ^ td2[(t3 >> 8) & 0xff] ^ td3[t2 & 0xff] ^ ks[25]; + s2 = td0[t2 >> 24] ^ td1[(t1 >> 16) & 0xff] ^ td2[(t0 >> 8) & 0xff] ^ td3[t3 & 0xff] ^ ks[26]; + s3 = td0[t3 >> 24] ^ td1[(t2 >> 16) & 0xff] ^ td2[(t1 >> 8) & 0xff] ^ td3[t0 & 0xff] ^ ks[27]; + t0 = td0[s0 >> 24] ^ td1[(s3 >> 16) & 0xff] ^ td2[(s2 >> 8) & 0xff] ^ td3[s1 & 0xff] ^ ks[28]; + t1 = td0[s1 >> 24] ^ td1[(s0 >> 16) & 0xff] ^ td2[(s3 >> 8) & 0xff] ^ td3[s2 & 0xff] ^ ks[29]; + t2 = td0[s2 >> 24] ^ td1[(s1 >> 16) & 0xff] ^ td2[(s0 >> 8) & 0xff] ^ td3[s3 & 0xff] ^ ks[30]; + t3 = td0[s3 >> 24] ^ td1[(s2 >> 16) & 0xff] ^ td2[(s1 >> 8) & 0xff] ^ td3[s0 & 0xff] ^ ks[31]; + s0 = td0[t0 >> 24] ^ td1[(t3 >> 16) & 0xff] ^ td2[(t2 >> 8) & 0xff] ^ td3[t1 & 0xff] ^ ks[32]; + s1 = td0[t1 >> 24] ^ td1[(t0 >> 16) & 0xff] ^ td2[(t3 >> 8) & 0xff] ^ td3[t2 & 0xff] ^ ks[33]; + s2 = td0[t2 >> 24] ^ td1[(t1 >> 16) & 0xff] ^ td2[(t0 >> 8) & 0xff] ^ td3[t3 & 0xff] ^ ks[34]; + s3 = td0[t3 >> 24] ^ td1[(t2 >> 16) & 0xff] ^ td2[(t1 >> 8) & 0xff] ^ td3[t0 & 0xff] ^ ks[35]; + t0 = td0[s0 >> 24] ^ td1[(s3 >> 16) & 0xff] ^ td2[(s2 >> 8) & 0xff] ^ td3[s1 & 0xff] ^ ks[36]; + t1 = td0[s1 >> 24] ^ td1[(s0 >> 16) & 0xff] ^ td2[(s3 >> 8) & 0xff] ^ td3[s2 & 0xff] ^ ks[37]; + t2 = td0[s2 >> 24] ^ td1[(s1 >> 16) & 0xff] ^ td2[(s0 >> 8) & 0xff] ^ td3[s3 & 0xff] ^ ks[38]; + t3 = td0[s3 >> 24] ^ td1[(s2 >> 16) & 0xff] ^ td2[(s1 >> 8) & 0xff] ^ td3[s0 & 0xff] ^ ks[39]; + s0 = td0[t0 >> 24] ^ td1[(t3 >> 16) & 0xff] ^ td2[(t2 >> 8) & 0xff] ^ td3[t1 & 0xff] ^ ks[40]; + s1 = td0[t1 >> 24] ^ td1[(t0 >> 16) & 0xff] ^ td2[(t3 >> 8) & 0xff] ^ td3[t2 & 0xff] ^ ks[41]; + s2 = td0[t2 >> 24] ^ td1[(t1 >> 16) & 0xff] ^ td2[(t0 >> 8) & 0xff] ^ td3[t3 & 0xff] ^ ks[42]; + s3 = td0[t3 >> 24] ^ td1[(t2 >> 16) & 0xff] ^ td2[(t1 >> 8) & 0xff] ^ td3[t0 & 0xff] ^ ks[43]; + t0 = td0[s0 >> 24] ^ td1[(s3 >> 16) & 0xff] ^ td2[(s2 >> 8) & 0xff] ^ td3[s1 & 0xff] ^ ks[44]; + t1 = td0[s1 >> 24] ^ td1[(s0 >> 16) & 0xff] ^ td2[(s3 >> 8) & 0xff] ^ td3[s2 & 0xff] ^ ks[45]; + t2 = td0[s2 >> 24] ^ td1[(s1 >> 16) & 0xff] ^ td2[(s0 >> 8) & 0xff] ^ td3[s3 & 0xff] ^ ks[46]; + t3 = td0[s3 >> 24] ^ td1[(s2 >> 16) & 0xff] ^ td2[(s1 >> 8) & 0xff] ^ td3[s0 & 0xff] ^ ks[47]; + s0 = td0[t0 >> 24] ^ td1[(t3 >> 16) & 0xff] ^ td2[(t2 >> 8) & 0xff] ^ td3[t1 & 0xff] ^ ks[48]; + s1 = td0[t1 >> 24] ^ td1[(t0 >> 16) & 0xff] ^ td2[(t3 >> 8) & 0xff] ^ td3[t2 & 0xff] ^ ks[49]; + s2 = td0[t2 >> 24] ^ td1[(t1 >> 16) & 0xff] ^ td2[(t0 >> 8) & 0xff] ^ td3[t3 & 0xff] ^ ks[50]; + s3 = td0[t3 >> 24] ^ td1[(t2 >> 16) & 0xff] ^ td2[(t1 >> 8) & 0xff] ^ td3[t0 & 0xff] ^ ks[51]; + t0 = td0[s0 >> 24] ^ td1[(s3 >> 16) & 0xff] ^ td2[(s2 >> 8) & 0xff] ^ td3[s1 & 0xff] ^ ks[52]; + t1 = td0[s1 >> 24] ^ td1[(s0 >> 16) & 0xff] ^ td2[(s3 >> 8) & 0xff] ^ td3[s2 & 0xff] ^ ks[53]; + t2 = td0[s2 >> 24] ^ td1[(s1 >> 16) & 0xff] ^ td2[(s0 >> 8) & 0xff] ^ td3[s3 & 0xff] ^ ks[54]; + t3 = td0[s3 >> 24] ^ td1[(s2 >> 16) & 0xff] ^ td2[(s1 >> 8) & 0xff] ^ td3[s0 & 0xff] ^ ks[55]; + + out[0] = (td4[(t0 >> 24) & 0xff] & 0xff000000) + ^ (td4[(t3 >> 16) & 0xff] & 0x00ff0000) + ^ (td4[(t2 >> 8) & 0xff] & 0x0000ff00) + ^ (td4[(t1 >> 0) & 0xff] & 0x000000ff) + ^ ks[56]; + + out[1] = (td4[(t1 >> 24) & 0xff] & 0xff000000) + ^ (td4[(t0 >> 16) & 0xff] & 0x00ff0000) + ^ (td4[(t3 >> 8) & 0xff] & 0x0000ff00) + ^ (td4[(t2 >> 0) & 0xff] & 0x000000ff) + ^ ks[57]; + + out[2] = (td4[(t2 >> 24) & 0xff] & 0xff000000) + ^ (td4[(t1 >> 16) & 0xff] & 0x00ff0000) + ^ (td4[(t0 >> 8) & 0xff] & 0x0000ff00) + ^ (td4[(t3 >> 0) & 0xff] & 0x000000ff) + ^ ks[58]; + + out[3] = (td4[(t3 >> 24) & 0xff] & 0xff000000) + ^ (td4[(t2 >> 16) & 0xff] & 0x00ff0000) + ^ (td4[(t1 >> 8) & 0xff] & 0x0000ff00) + ^ (td4[(t0 >> 0) & 0xff] & 0x000000ff) + ^ ks[59]; + + out[0] = swap_workaround (out[0]); + out[1] = swap_workaround (out[1]); + out[2] = swap_workaround (out[2]); + out[3] = swap_workaround (out[3]); +} + +static void aes256_encrypt (const u32 *ks, const u32 *in, u32 *out) +{ + u32 in_s[4]; + + in_s[0] = swap_workaround (in[0]); + in_s[1] = swap_workaround (in[1]); + in_s[2] = swap_workaround (in[2]); + in_s[3] = swap_workaround (in[3]); + + u32 s0 = in_s[0] ^ ks[0]; + u32 s1 = in_s[1] ^ ks[1]; + u32 s2 = in_s[2] ^ ks[2]; + u32 s3 = in_s[3] ^ ks[3]; + + u32 t0; + u32 t1; + u32 t2; + u32 t3; + + t0 = te0[s0 >> 24] ^ te1[(s1 >> 16) & 0xff] ^ te2[(s2 >> 8) & 0xff] ^ te3[s3 & 0xff] ^ ks[ 4]; + t1 = te0[s1 >> 24] ^ te1[(s2 >> 16) & 0xff] ^ te2[(s3 >> 8) & 0xff] ^ te3[s0 & 0xff] ^ ks[ 5]; + t2 = te0[s2 >> 24] ^ te1[(s3 >> 16) & 0xff] ^ te2[(s0 >> 8) & 0xff] ^ te3[s1 & 0xff] ^ ks[ 6]; + t3 = te0[s3 >> 24] ^ te1[(s0 >> 16) & 0xff] ^ te2[(s1 >> 8) & 0xff] ^ te3[s2 & 0xff] ^ ks[ 7]; + s0 = te0[t0 >> 24] ^ te1[(t1 >> 16) & 0xff] ^ te2[(t2 >> 8) & 0xff] ^ te3[t3 & 0xff] ^ ks[ 8]; + s1 = te0[t1 >> 24] ^ te1[(t2 >> 16) & 0xff] ^ te2[(t3 >> 8) & 0xff] ^ te3[t0 & 0xff] ^ ks[ 9]; + s2 = te0[t2 >> 24] ^ te1[(t3 >> 16) & 0xff] ^ te2[(t0 >> 8) & 0xff] ^ te3[t1 & 0xff] ^ ks[10]; + s3 = te0[t3 >> 24] ^ te1[(t0 >> 16) & 0xff] ^ te2[(t1 >> 8) & 0xff] ^ te3[t2 & 0xff] ^ ks[11]; + t0 = te0[s0 >> 24] ^ te1[(s1 >> 16) & 0xff] ^ te2[(s2 >> 8) & 0xff] ^ te3[s3 & 0xff] ^ ks[12]; + t1 = te0[s1 >> 24] ^ te1[(s2 >> 16) & 0xff] ^ te2[(s3 >> 8) & 0xff] ^ te3[s0 & 0xff] ^ ks[13]; + t2 = te0[s2 >> 24] ^ te1[(s3 >> 16) & 0xff] ^ te2[(s0 >> 8) & 0xff] ^ te3[s1 & 0xff] ^ ks[14]; + t3 = te0[s3 >> 24] ^ te1[(s0 >> 16) & 0xff] ^ te2[(s1 >> 8) & 0xff] ^ te3[s2 & 0xff] ^ ks[15]; + s0 = te0[t0 >> 24] ^ te1[(t1 >> 16) & 0xff] ^ te2[(t2 >> 8) & 0xff] ^ te3[t3 & 0xff] ^ ks[16]; + s1 = te0[t1 >> 24] ^ te1[(t2 >> 16) & 0xff] ^ te2[(t3 >> 8) & 0xff] ^ te3[t0 & 0xff] ^ ks[17]; + s2 = te0[t2 >> 24] ^ te1[(t3 >> 16) & 0xff] ^ te2[(t0 >> 8) & 0xff] ^ te3[t1 & 0xff] ^ ks[18]; + s3 = te0[t3 >> 24] ^ te1[(t0 >> 16) & 0xff] ^ te2[(t1 >> 8) & 0xff] ^ te3[t2 & 0xff] ^ ks[19]; + t0 = te0[s0 >> 24] ^ te1[(s1 >> 16) & 0xff] ^ te2[(s2 >> 8) & 0xff] ^ te3[s3 & 0xff] ^ ks[20]; + t1 = te0[s1 >> 24] ^ te1[(s2 >> 16) & 0xff] ^ te2[(s3 >> 8) & 0xff] ^ te3[s0 & 0xff] ^ ks[21]; + t2 = te0[s2 >> 24] ^ te1[(s3 >> 16) & 0xff] ^ te2[(s0 >> 8) & 0xff] ^ te3[s1 & 0xff] ^ ks[22]; + t3 = te0[s3 >> 24] ^ te1[(s0 >> 16) & 0xff] ^ te2[(s1 >> 8) & 0xff] ^ te3[s2 & 0xff] ^ ks[23]; + s0 = te0[t0 >> 24] ^ te1[(t1 >> 16) & 0xff] ^ te2[(t2 >> 8) & 0xff] ^ te3[t3 & 0xff] ^ ks[24]; + s1 = te0[t1 >> 24] ^ te1[(t2 >> 16) & 0xff] ^ te2[(t3 >> 8) & 0xff] ^ te3[t0 & 0xff] ^ ks[25]; + s2 = te0[t2 >> 24] ^ te1[(t3 >> 16) & 0xff] ^ te2[(t0 >> 8) & 0xff] ^ te3[t1 & 0xff] ^ ks[26]; + s3 = te0[t3 >> 24] ^ te1[(t0 >> 16) & 0xff] ^ te2[(t1 >> 8) & 0xff] ^ te3[t2 & 0xff] ^ ks[27]; + t0 = te0[s0 >> 24] ^ te1[(s1 >> 16) & 0xff] ^ te2[(s2 >> 8) & 0xff] ^ te3[s3 & 0xff] ^ ks[28]; + t1 = te0[s1 >> 24] ^ te1[(s2 >> 16) & 0xff] ^ te2[(s3 >> 8) & 0xff] ^ te3[s0 & 0xff] ^ ks[29]; + t2 = te0[s2 >> 24] ^ te1[(s3 >> 16) & 0xff] ^ te2[(s0 >> 8) & 0xff] ^ te3[s1 & 0xff] ^ ks[30]; + t3 = te0[s3 >> 24] ^ te1[(s0 >> 16) & 0xff] ^ te2[(s1 >> 8) & 0xff] ^ te3[s2 & 0xff] ^ ks[31]; + s0 = te0[t0 >> 24] ^ te1[(t1 >> 16) & 0xff] ^ te2[(t2 >> 8) & 0xff] ^ te3[t3 & 0xff] ^ ks[32]; + s1 = te0[t1 >> 24] ^ te1[(t2 >> 16) & 0xff] ^ te2[(t3 >> 8) & 0xff] ^ te3[t0 & 0xff] ^ ks[33]; + s2 = te0[t2 >> 24] ^ te1[(t3 >> 16) & 0xff] ^ te2[(t0 >> 8) & 0xff] ^ te3[t1 & 0xff] ^ ks[34]; + s3 = te0[t3 >> 24] ^ te1[(t0 >> 16) & 0xff] ^ te2[(t1 >> 8) & 0xff] ^ te3[t2 & 0xff] ^ ks[35]; + t0 = te0[s0 >> 24] ^ te1[(s1 >> 16) & 0xff] ^ te2[(s2 >> 8) & 0xff] ^ te3[s3 & 0xff] ^ ks[36]; + t1 = te0[s1 >> 24] ^ te1[(s2 >> 16) & 0xff] ^ te2[(s3 >> 8) & 0xff] ^ te3[s0 & 0xff] ^ ks[37]; + t2 = te0[s2 >> 24] ^ te1[(s3 >> 16) & 0xff] ^ te2[(s0 >> 8) & 0xff] ^ te3[s1 & 0xff] ^ ks[38]; + t3 = te0[s3 >> 24] ^ te1[(s0 >> 16) & 0xff] ^ te2[(s1 >> 8) & 0xff] ^ te3[s2 & 0xff] ^ ks[39]; + s0 = te0[t0 >> 24] ^ te1[(t1 >> 16) & 0xff] ^ te2[(t2 >> 8) & 0xff] ^ te3[t3 & 0xff] ^ ks[40]; + s1 = te0[t1 >> 24] ^ te1[(t2 >> 16) & 0xff] ^ te2[(t3 >> 8) & 0xff] ^ te3[t0 & 0xff] ^ ks[41]; + s2 = te0[t2 >> 24] ^ te1[(t3 >> 16) & 0xff] ^ te2[(t0 >> 8) & 0xff] ^ te3[t1 & 0xff] ^ ks[42]; + s3 = te0[t3 >> 24] ^ te1[(t0 >> 16) & 0xff] ^ te2[(t1 >> 8) & 0xff] ^ te3[t2 & 0xff] ^ ks[43]; + t0 = te0[s0 >> 24] ^ te1[(s1 >> 16) & 0xff] ^ te2[(s2 >> 8) & 0xff] ^ te3[s3 & 0xff] ^ ks[44]; + t1 = te0[s1 >> 24] ^ te1[(s2 >> 16) & 0xff] ^ te2[(s3 >> 8) & 0xff] ^ te3[s0 & 0xff] ^ ks[45]; + t2 = te0[s2 >> 24] ^ te1[(s3 >> 16) & 0xff] ^ te2[(s0 >> 8) & 0xff] ^ te3[s1 & 0xff] ^ ks[46]; + t3 = te0[s3 >> 24] ^ te1[(s0 >> 16) & 0xff] ^ te2[(s1 >> 8) & 0xff] ^ te3[s2 & 0xff] ^ ks[47]; + s0 = te0[t0 >> 24] ^ te1[(t1 >> 16) & 0xff] ^ te2[(t2 >> 8) & 0xff] ^ te3[t3 & 0xff] ^ ks[48]; + s1 = te0[t1 >> 24] ^ te1[(t2 >> 16) & 0xff] ^ te2[(t3 >> 8) & 0xff] ^ te3[t0 & 0xff] ^ ks[49]; + s2 = te0[t2 >> 24] ^ te1[(t3 >> 16) & 0xff] ^ te2[(t0 >> 8) & 0xff] ^ te3[t1 & 0xff] ^ ks[50]; + s3 = te0[t3 >> 24] ^ te1[(t0 >> 16) & 0xff] ^ te2[(t1 >> 8) & 0xff] ^ te3[t2 & 0xff] ^ ks[51]; + t0 = te0[s0 >> 24] ^ te1[(s1 >> 16) & 0xff] ^ te2[(s2 >> 8) & 0xff] ^ te3[s3 & 0xff] ^ ks[52]; + t1 = te0[s1 >> 24] ^ te1[(s2 >> 16) & 0xff] ^ te2[(s3 >> 8) & 0xff] ^ te3[s0 & 0xff] ^ ks[53]; + t2 = te0[s2 >> 24] ^ te1[(s3 >> 16) & 0xff] ^ te2[(s0 >> 8) & 0xff] ^ te3[s1 & 0xff] ^ ks[54]; + t3 = te0[s3 >> 24] ^ te1[(s0 >> 16) & 0xff] ^ te2[(s1 >> 8) & 0xff] ^ te3[s2 & 0xff] ^ ks[55]; + + out[0] = (te4[(t0 >> 24) & 0xff] & 0xff000000) + ^ (te4[(t1 >> 16) & 0xff] & 0x00ff0000) + ^ (te4[(t2 >> 8) & 0xff] & 0x0000ff00) + ^ (te4[(t3 >> 0) & 0xff] & 0x000000ff) + ^ ks[56]; + + out[1] = (te4[(t1 >> 24) & 0xff] & 0xff000000) + ^ (te4[(t2 >> 16) & 0xff] & 0x00ff0000) + ^ (te4[(t3 >> 8) & 0xff] & 0x0000ff00) + ^ (te4[(t0 >> 0) & 0xff] & 0x000000ff) + ^ ks[57]; + + out[2] = (te4[(t2 >> 24) & 0xff] & 0xff000000) + ^ (te4[(t3 >> 16) & 0xff] & 0x00ff0000) + ^ (te4[(t0 >> 8) & 0xff] & 0x0000ff00) + ^ (te4[(t1 >> 0) & 0xff] & 0x000000ff) + ^ ks[58]; + + out[3] = (te4[(t3 >> 24) & 0xff] & 0xff000000) + ^ (te4[(t0 >> 16) & 0xff] & 0x00ff0000) + ^ (te4[(t1 >> 8) & 0xff] & 0x0000ff00) + ^ (te4[(t2 >> 0) & 0xff] & 0x000000ff) + ^ ks[59]; + + out[0] = swap_workaround (out[0]); + out[1] = swap_workaround (out[1]); + out[2] = swap_workaround (out[2]); + out[3] = swap_workaround (out[3]); +} + +static void aes256_decrypt_xts (const u32 *ukey1, const u32 *ukey2, const u32 *in, u32 *out) +{ + u32 T[4] = { 0 }; + u32 Z[4] = { 0 }; + + out[0] = in[0]; + out[1] = in[1]; + out[2] = in[2]; + out[3] = in[3]; + + u32 ks[60]; + + aes256_set_encrypt_key (ks, ukey2); + aes256_encrypt (ks, Z, T); + + out[0] ^= T[0]; + out[1] ^= T[1]; + out[2] ^= T[2]; + out[3] ^= T[3]; + + aes256_set_decrypt_key (ks, ukey1); + aes256_decrypt (ks, out, out); + + out[0] ^= T[0]; + out[1] ^= T[1]; + out[2] ^= T[2]; + out[3] ^= T[3]; +} diff --git a/amd/gpu_serpent256_amd.c b/amd/gpu_serpent256_amd.c new file mode 100644 index 0000000000..8288980f90 --- /dev/null +++ b/amd/gpu_serpent256_amd.c @@ -0,0 +1,583 @@ +/* This is an independent implementation of the encryption algorithm: */ +/* */ +/* Serpent by Ross Anderson, Eli Biham and Lars Knudsen */ +/* */ +/* which is a candidate algorithm in the Advanced Encryption Standard */ +/* programme of the US National Institute of Standards and Technology. */ +/* */ +/* Copyright in this implementation is held by Dr B R Gladman but I */ +/* hereby give permission for its free direct or derivative use subject */ +/* to acknowledgment of its origin and compliance with any conditions */ +/* that the originators of the algorithm place on its exploitation. */ +/* */ +/* Dr Brian Gladman (gladman@seven77.demon.co.uk) 14th January 1999 */ +/* */ +/* -------------------------------------------------------------------- */ +/* */ +/* Cleaned and optimized for GPU use with oclHashcat by Jens Steube */ + +/* 15 terms */ + +#define sb0(a,b,c,d,e,f,g,h) \ + t1 = a ^ d; \ + t2 = a & d; \ + t3 = c ^ t1; \ + t6 = b & t1; \ + t4 = b ^ t3; \ + t10 = ~t3; \ + h = t2 ^ t4; \ + t7 = a ^ t6; \ + t14 = ~t7; \ + t8 = c | t7; \ + t11 = t3 ^ t7; \ + g = t4 ^ t8; \ + t12 = h & t11; \ + f = t10 ^ t12; \ + e = t12 ^ t14 + +/* 15 terms */ + +#define ib0(a,b,c,d,e,f,g,h) \ + t1 = ~a; \ + t2 = a ^ b; \ + t3 = t1 | t2; \ + t4 = d ^ t3; \ + t7 = d & t2; \ + t5 = c ^ t4; \ + t8 = t1 ^ t7; \ + g = t2 ^ t5; \ + t11 = a & t4; \ + t9 = g & t8; \ + t14 = t5 ^ t8; \ + f = t4 ^ t9; \ + t12 = t5 | f; \ + h = t11 ^ t12; \ + e = h ^ t14 + +/* 14 terms! */ + +#define sb1(a,b,c,d,e,f,g,h) \ + t1 = ~a; \ + t2 = b ^ t1; \ + t3 = a | t2; \ + t4 = d | t2; \ + t5 = c ^ t3; \ + g = d ^ t5; \ + t7 = b ^ t4; \ + t8 = t2 ^ g; \ + t9 = t5 & t7; \ + h = t8 ^ t9; \ + t11 = t5 ^ t7; \ + f = h ^ t11; \ + t13 = t8 & t11; \ + e = t5 ^ t13 + +/* 17 terms */ + +#define ib1(a,b,c,d,e,f,g,h) \ + t1 = a ^ d; \ + t2 = a & b; \ + t3 = b ^ c; \ + t4 = a ^ t3; \ + t5 = b | d; \ + t7 = c | t1; \ + h = t4 ^ t5; \ + t8 = b ^ t7; \ + t11 = ~t2; \ + t9 = t4 & t8; \ + f = t1 ^ t9; \ + t13 = t9 ^ t11; \ + t12 = h & f; \ + g = t12 ^ t13; \ + t15 = a & d; \ + t16 = c ^ t13; \ + e = t15 ^ t16 + +/* 16 terms */ + +#define sb2(a,b,c,d,e,f,g,h) \ + t1 = ~a; \ + t2 = b ^ d; \ + t3 = c & t1; \ + t13 = d | t1; \ + e = t2 ^ t3; \ + t5 = c ^ t1; \ + t6 = c ^ e; \ + t7 = b & t6; \ + t10 = e | t5; \ + h = t5 ^ t7; \ + t9 = d | t7; \ + t11 = t9 & t10; \ + t14 = t2 ^ h; \ + g = a ^ t11; \ + t15 = g ^ t13; \ + f = t14 ^ t15 + +/* 16 terms */ + +#define ib2(a,b,c,d,e,f,g,h) \ + t1 = b ^ d; \ + t2 = ~t1; \ + t3 = a ^ c; \ + t4 = c ^ t1; \ + t7 = a | t2; \ + t5 = b & t4; \ + t8 = d ^ t7; \ + t11 = ~t4; \ + e = t3 ^ t5; \ + t9 = t3 | t8; \ + t14 = d & t11; \ + h = t1 ^ t9; \ + t12 = e | h; \ + f = t11 ^ t12; \ + t15 = t3 ^ t12; \ + g = t14 ^ t15 + +/* 17 terms */ + +#define sb3(a,b,c,d,e,f,g,h) \ + t1 = a ^ c; \ + t2 = d ^ t1; \ + t3 = a & t2; \ + t4 = d ^ t3; \ + t5 = b & t4; \ + g = t2 ^ t5; \ + t7 = a | g; \ + t8 = b | d; \ + t11 = a | d; \ + t9 = t4 & t7; \ + f = t8 ^ t9; \ + t12 = b ^ t11; \ + t13 = g ^ t9; \ + t15 = t3 ^ t8; \ + h = t12 ^ t13; \ + t16 = c & t15; \ + e = t12 ^ t16 + +/* 16 term solution that performs less well than 17 term one + in my environment (PPro/PII) + +#define sb3(a,b,c,d,e,f,g,h) \ + t1 = a ^ b; \ + t2 = a & c; \ + t3 = a | d; \ + t4 = c ^ d; \ + t5 = t1 & t3; \ + t6 = t2 | t5; \ + g = t4 ^ t6; \ + t8 = b ^ t3; \ + t9 = t6 ^ t8; \ + t10 = t4 & t9; \ + e = t1 ^ t10; \ + t12 = g & e; \ + f = t9 ^ t12; \ + t14 = b | d; \ + t15 = t4 ^ t12; \ + h = t14 ^ t15 +*/ + +/* 17 terms */ + +#define ib3(a,b,c,d,e,f,g,h) \ + t1 = b ^ c; \ + t2 = b | c; \ + t3 = a ^ c; \ + t7 = a ^ d; \ + t4 = t2 ^ t3; \ + t5 = d | t4; \ + t9 = t2 ^ t7; \ + e = t1 ^ t5; \ + t8 = t1 | t5; \ + t11 = a & t4; \ + g = t8 ^ t9; \ + t12 = e | t9; \ + f = t11 ^ t12; \ + t14 = a & g; \ + t15 = t2 ^ t14; \ + t16 = e & t15; \ + h = t4 ^ t16 + +/* 15 terms */ + +#define sb4(a,b,c,d,e,f,g,h) \ + t1 = a ^ d; \ + t2 = d & t1; \ + t3 = c ^ t2; \ + t4 = b | t3; \ + h = t1 ^ t4; \ + t6 = ~b; \ + t7 = t1 | t6; \ + e = t3 ^ t7; \ + t9 = a & e; \ + t10 = t1 ^ t6; \ + t11 = t4 & t10; \ + g = t9 ^ t11; \ + t13 = a ^ t3; \ + t14 = t10 & g; \ + f = t13 ^ t14 + +/* 17 terms */ + +#define ib4(a,b,c,d,e,f,g,h) \ + t1 = c ^ d; \ + t2 = c | d; \ + t3 = b ^ t2; \ + t4 = a & t3; \ + f = t1 ^ t4; \ + t6 = a ^ d; \ + t7 = b | d; \ + t8 = t6 & t7; \ + h = t3 ^ t8; \ + t10 = ~a; \ + t11 = c ^ h; \ + t12 = t10 | t11;\ + e = t3 ^ t12; \ + t14 = c | t4; \ + t15 = t7 ^ t14; \ + t16 = h | t10; \ + g = t15 ^ t16 + +/* 16 terms */ + +#define sb5(a,b,c,d,e,f,g,h) \ + t1 = ~a; \ + t2 = a ^ b; \ + t3 = a ^ d; \ + t4 = c ^ t1; \ + t5 = t2 | t3; \ + e = t4 ^ t5; \ + t7 = d & e; \ + t8 = t2 ^ e; \ + t10 = t1 | e; \ + f = t7 ^ t8; \ + t11 = t2 | t7; \ + t12 = t3 ^ t10; \ + t14 = b ^ t7; \ + g = t11 ^ t12; \ + t15 = f & t12; \ + h = t14 ^ t15 + +/* 16 terms */ + +#define ib5(a,b,c,d,e,f,g,h) \ + t1 = ~c; \ + t2 = b & t1; \ + t3 = d ^ t2; \ + t4 = a & t3; \ + t5 = b ^ t1; \ + h = t4 ^ t5; \ + t7 = b | h; \ + t8 = a & t7; \ + f = t3 ^ t8; \ + t10 = a | d; \ + t11 = t1 ^ t7; \ + e = t10 ^ t11; \ + t13 = a ^ c; \ + t14 = b & t10; \ + t15 = t4 | t13; \ + g = t14 ^ t15 + +/* 15 terms */ + +#define sb6(a,b,c,d,e,f,g,h) \ + t1 = ~a; \ + t2 = a ^ d; \ + t3 = b ^ t2; \ + t4 = t1 | t2; \ + t5 = c ^ t4; \ + f = b ^ t5; \ + t13 = ~t5; \ + t7 = t2 | f; \ + t8 = d ^ t7; \ + t9 = t5 & t8; \ + g = t3 ^ t9; \ + t11 = t5 ^ t8; \ + e = g ^ t11; \ + t14 = t3 & t11; \ + h = t13 ^ t14 + +/* 15 terms */ + +#define ib6(a,b,c,d,e,f,g,h) \ + t1 = ~a; \ + t2 = a ^ b; \ + t3 = c ^ t2; \ + t4 = c | t1; \ + t5 = d ^ t4; \ + t13 = d & t1; \ + f = t3 ^ t5; \ + t7 = t3 & t5; \ + t8 = t2 ^ t7; \ + t9 = b | t8; \ + h = t5 ^ t9; \ + t11 = b | h; \ + e = t8 ^ t11; \ + t14 = t3 ^ t11; \ + g = t13 ^ t14 + +/* 17 terms */ + +#define sb7(a,b,c,d,e,f,g,h) \ + t1 = ~c; \ + t2 = b ^ c; \ + t3 = b | t1; \ + t4 = d ^ t3; \ + t5 = a & t4; \ + t7 = a ^ d; \ + h = t2 ^ t5; \ + t8 = b ^ t5; \ + t9 = t2 | t8; \ + t11 = d & t3; \ + f = t7 ^ t9; \ + t12 = t5 ^ f; \ + t15 = t1 | t4; \ + t13 = h & t12; \ + g = t11 ^ t13; \ + t16 = t12 ^ g; \ + e = t15 ^ t16 + +/* 17 terms */ + +#define ib7(a,b,c,d,e,f,g,h) \ + t1 = a & b; \ + t2 = a | b; \ + t3 = c | t1; \ + t4 = d & t2; \ + h = t3 ^ t4; \ + t6 = ~d; \ + t7 = b ^ t4; \ + t8 = h ^ t6; \ + t11 = c ^ t7; \ + t9 = t7 | t8; \ + f = a ^ t9; \ + t12 = d | f; \ + e = t11 ^ t12; \ + t14 = a & h; \ + t15 = t3 ^ f; \ + t16 = e ^ t14; \ + g = t15 ^ t16 + +#define k_xor(r,a,b,c,d) \ + a ^= ks[4 * r + 8]; \ + b ^= ks[4 * r + 9]; \ + c ^= ks[4 * r + 10]; \ + d ^= ks[4 * r + 11] + +#define k_set(r,a,b,c,d) \ + a = ks[4 * r + 8]; \ + b = ks[4 * r + 9]; \ + c = ks[4 * r + 10]; \ + d = ks[4 * r + 11] + +#define k_get(r,a,b,c,d) \ + ks[4 * r + 8] = a; \ + ks[4 * r + 9] = b; \ + ks[4 * r + 10] = c; \ + ks[4 * r + 11] = d + +/* the linear transformation and its inverse */ + +#define rot(a,b,c,d) \ + a = rotl32(a, 13); \ + c = rotl32(c, 3); \ + d ^= c ^ (a << 3); \ + b ^= a ^ c; \ + d = rotl32(d, 7); \ + b = rotl32(b, 1); \ + a ^= b ^ d; \ + c ^= d ^ (b << 7); \ + a = rotl32(a, 5); \ + c = rotl32(c, 22) + +#define irot(a,b,c,d) \ + c = rotr32(c, 22); \ + a = rotr32(a, 5); \ + c ^= d ^ (b << 7); \ + a ^= b ^ d; \ + d = rotr32(d, 7); \ + b = rotr32(b, 1); \ + d ^= c ^ (a << 3); \ + b ^= a ^ c; \ + c = rotr32(c, 3); \ + a = rotr32(a, 13) + +static void serpent256_set_key (u32 *ks, const u32 *ukey) +{ + #pragma unroll + for (int i = 0; i < 8; i++) + { + ks[i] = ukey[i]; + } + + #pragma unroll + for (int i = 0; i < 132; i++) + { + ks[i + 8] = rotl32 (ks[i + 7] ^ ks[i + 5] ^ ks[i + 3] ^ ks[i + 0] ^ 0x9e3779b9 ^ i, 11); + } + + u32 a,b,c,d,e,f,g,h; + u32 t1,t2,t3,t4,t5,t6,t7,t8,t9,t10,t11,t12,t13,t14,t15,t16; + + k_set( 0,a,b,c,d); sb3(a,b,c,d,e,f,g,h); k_get( 0,e,f,g,h); + k_set( 1,a,b,c,d); sb2(a,b,c,d,e,f,g,h); k_get( 1,e,f,g,h); + k_set( 2,a,b,c,d); sb1(a,b,c,d,e,f,g,h); k_get( 2,e,f,g,h); + k_set( 3,a,b,c,d); sb0(a,b,c,d,e,f,g,h); k_get( 3,e,f,g,h); + k_set( 4,a,b,c,d); sb7(a,b,c,d,e,f,g,h); k_get( 4,e,f,g,h); + k_set( 5,a,b,c,d); sb6(a,b,c,d,e,f,g,h); k_get( 5,e,f,g,h); + k_set( 6,a,b,c,d); sb5(a,b,c,d,e,f,g,h); k_get( 6,e,f,g,h); + k_set( 7,a,b,c,d); sb4(a,b,c,d,e,f,g,h); k_get( 7,e,f,g,h); + k_set( 8,a,b,c,d); sb3(a,b,c,d,e,f,g,h); k_get( 8,e,f,g,h); + k_set( 9,a,b,c,d); sb2(a,b,c,d,e,f,g,h); k_get( 9,e,f,g,h); + k_set(10,a,b,c,d); sb1(a,b,c,d,e,f,g,h); k_get(10,e,f,g,h); + k_set(11,a,b,c,d); sb0(a,b,c,d,e,f,g,h); k_get(11,e,f,g,h); + k_set(12,a,b,c,d); sb7(a,b,c,d,e,f,g,h); k_get(12,e,f,g,h); + k_set(13,a,b,c,d); sb6(a,b,c,d,e,f,g,h); k_get(13,e,f,g,h); + k_set(14,a,b,c,d); sb5(a,b,c,d,e,f,g,h); k_get(14,e,f,g,h); + k_set(15,a,b,c,d); sb4(a,b,c,d,e,f,g,h); k_get(15,e,f,g,h); + k_set(16,a,b,c,d); sb3(a,b,c,d,e,f,g,h); k_get(16,e,f,g,h); + k_set(17,a,b,c,d); sb2(a,b,c,d,e,f,g,h); k_get(17,e,f,g,h); + k_set(18,a,b,c,d); sb1(a,b,c,d,e,f,g,h); k_get(18,e,f,g,h); + k_set(19,a,b,c,d); sb0(a,b,c,d,e,f,g,h); k_get(19,e,f,g,h); + k_set(20,a,b,c,d); sb7(a,b,c,d,e,f,g,h); k_get(20,e,f,g,h); + k_set(21,a,b,c,d); sb6(a,b,c,d,e,f,g,h); k_get(21,e,f,g,h); + k_set(22,a,b,c,d); sb5(a,b,c,d,e,f,g,h); k_get(22,e,f,g,h); + k_set(23,a,b,c,d); sb4(a,b,c,d,e,f,g,h); k_get(23,e,f,g,h); + k_set(24,a,b,c,d); sb3(a,b,c,d,e,f,g,h); k_get(24,e,f,g,h); + k_set(25,a,b,c,d); sb2(a,b,c,d,e,f,g,h); k_get(25,e,f,g,h); + k_set(26,a,b,c,d); sb1(a,b,c,d,e,f,g,h); k_get(26,e,f,g,h); + k_set(27,a,b,c,d); sb0(a,b,c,d,e,f,g,h); k_get(27,e,f,g,h); + k_set(28,a,b,c,d); sb7(a,b,c,d,e,f,g,h); k_get(28,e,f,g,h); + k_set(29,a,b,c,d); sb6(a,b,c,d,e,f,g,h); k_get(29,e,f,g,h); + k_set(30,a,b,c,d); sb5(a,b,c,d,e,f,g,h); k_get(30,e,f,g,h); + k_set(31,a,b,c,d); sb4(a,b,c,d,e,f,g,h); k_get(31,e,f,g,h); + k_set(32,a,b,c,d); sb3(a,b,c,d,e,f,g,h); k_get(32,e,f,g,h); +} + +static void serpent256_encrypt (const u32 *ks, const u32 *in, u32 *out) +{ + u32 a,b,c,d,e,f,g,h; + u32 t1,t2,t3,t4,t5,t6,t7,t8,t9,t10,t11,t12,t13,t14,t15,t16; + + a = in[0]; + b = in[1]; + c = in[2]; + d = in[3]; + + k_xor( 0,a,b,c,d); sb0(a,b,c,d,e,f,g,h); rot(e,f,g,h); + k_xor( 1,e,f,g,h); sb1(e,f,g,h,a,b,c,d); rot(a,b,c,d); + k_xor( 2,a,b,c,d); sb2(a,b,c,d,e,f,g,h); rot(e,f,g,h); + k_xor( 3,e,f,g,h); sb3(e,f,g,h,a,b,c,d); rot(a,b,c,d); + k_xor( 4,a,b,c,d); sb4(a,b,c,d,e,f,g,h); rot(e,f,g,h); + k_xor( 5,e,f,g,h); sb5(e,f,g,h,a,b,c,d); rot(a,b,c,d); + k_xor( 6,a,b,c,d); sb6(a,b,c,d,e,f,g,h); rot(e,f,g,h); + k_xor( 7,e,f,g,h); sb7(e,f,g,h,a,b,c,d); rot(a,b,c,d); + k_xor( 8,a,b,c,d); sb0(a,b,c,d,e,f,g,h); rot(e,f,g,h); + k_xor( 9,e,f,g,h); sb1(e,f,g,h,a,b,c,d); rot(a,b,c,d); + k_xor(10,a,b,c,d); sb2(a,b,c,d,e,f,g,h); rot(e,f,g,h); + k_xor(11,e,f,g,h); sb3(e,f,g,h,a,b,c,d); rot(a,b,c,d); + k_xor(12,a,b,c,d); sb4(a,b,c,d,e,f,g,h); rot(e,f,g,h); + k_xor(13,e,f,g,h); sb5(e,f,g,h,a,b,c,d); rot(a,b,c,d); + k_xor(14,a,b,c,d); sb6(a,b,c,d,e,f,g,h); rot(e,f,g,h); + k_xor(15,e,f,g,h); sb7(e,f,g,h,a,b,c,d); rot(a,b,c,d); + k_xor(16,a,b,c,d); sb0(a,b,c,d,e,f,g,h); rot(e,f,g,h); + k_xor(17,e,f,g,h); sb1(e,f,g,h,a,b,c,d); rot(a,b,c,d); + k_xor(18,a,b,c,d); sb2(a,b,c,d,e,f,g,h); rot(e,f,g,h); + k_xor(19,e,f,g,h); sb3(e,f,g,h,a,b,c,d); rot(a,b,c,d); + k_xor(20,a,b,c,d); sb4(a,b,c,d,e,f,g,h); rot(e,f,g,h); + k_xor(21,e,f,g,h); sb5(e,f,g,h,a,b,c,d); rot(a,b,c,d); + k_xor(22,a,b,c,d); sb6(a,b,c,d,e,f,g,h); rot(e,f,g,h); + k_xor(23,e,f,g,h); sb7(e,f,g,h,a,b,c,d); rot(a,b,c,d); + k_xor(24,a,b,c,d); sb0(a,b,c,d,e,f,g,h); rot(e,f,g,h); + k_xor(25,e,f,g,h); sb1(e,f,g,h,a,b,c,d); rot(a,b,c,d); + k_xor(26,a,b,c,d); sb2(a,b,c,d,e,f,g,h); rot(e,f,g,h); + k_xor(27,e,f,g,h); sb3(e,f,g,h,a,b,c,d); rot(a,b,c,d); + k_xor(28,a,b,c,d); sb4(a,b,c,d,e,f,g,h); rot(e,f,g,h); + k_xor(29,e,f,g,h); sb5(e,f,g,h,a,b,c,d); rot(a,b,c,d); + k_xor(30,a,b,c,d); sb6(a,b,c,d,e,f,g,h); rot(e,f,g,h); + k_xor(31,e,f,g,h); sb7(e,f,g,h,a,b,c,d); + k_xor(32,a,b,c,d); + + out[0] = a; + out[1] = b; + out[2] = c; + out[3] = d; +} + +static void serpent256_decrypt (const u32 *ks, const u32 *in, u32 *out) +{ + u32 a,b,c,d,e,f,g,h; + u32 t1,t2,t3,t4,t5,t6,t7,t8,t9,t10,t11,t12,t13,t14,t15,t16; + + a = in[0]; + b = in[1]; + c = in[2]; + d = in[3]; + + k_xor(32,a,b,c,d); + ib7(a,b,c,d,e,f,g,h); k_xor(31,e,f,g,h); + irot(e,f,g,h); ib6(e,f,g,h,a,b,c,d); k_xor(30,a,b,c,d); + irot(a,b,c,d); ib5(a,b,c,d,e,f,g,h); k_xor(29,e,f,g,h); + irot(e,f,g,h); ib4(e,f,g,h,a,b,c,d); k_xor(28,a,b,c,d); + irot(a,b,c,d); ib3(a,b,c,d,e,f,g,h); k_xor(27,e,f,g,h); + irot(e,f,g,h); ib2(e,f,g,h,a,b,c,d); k_xor(26,a,b,c,d); + irot(a,b,c,d); ib1(a,b,c,d,e,f,g,h); k_xor(25,e,f,g,h); + irot(e,f,g,h); ib0(e,f,g,h,a,b,c,d); k_xor(24,a,b,c,d); + irot(a,b,c,d); ib7(a,b,c,d,e,f,g,h); k_xor(23,e,f,g,h); + irot(e,f,g,h); ib6(e,f,g,h,a,b,c,d); k_xor(22,a,b,c,d); + irot(a,b,c,d); ib5(a,b,c,d,e,f,g,h); k_xor(21,e,f,g,h); + irot(e,f,g,h); ib4(e,f,g,h,a,b,c,d); k_xor(20,a,b,c,d); + irot(a,b,c,d); ib3(a,b,c,d,e,f,g,h); k_xor(19,e,f,g,h); + irot(e,f,g,h); ib2(e,f,g,h,a,b,c,d); k_xor(18,a,b,c,d); + irot(a,b,c,d); ib1(a,b,c,d,e,f,g,h); k_xor(17,e,f,g,h); + irot(e,f,g,h); ib0(e,f,g,h,a,b,c,d); k_xor(16,a,b,c,d); + irot(a,b,c,d); ib7(a,b,c,d,e,f,g,h); k_xor(15,e,f,g,h); + irot(e,f,g,h); ib6(e,f,g,h,a,b,c,d); k_xor(14,a,b,c,d); + irot(a,b,c,d); ib5(a,b,c,d,e,f,g,h); k_xor(13,e,f,g,h); + irot(e,f,g,h); ib4(e,f,g,h,a,b,c,d); k_xor(12,a,b,c,d); + irot(a,b,c,d); ib3(a,b,c,d,e,f,g,h); k_xor(11,e,f,g,h); + irot(e,f,g,h); ib2(e,f,g,h,a,b,c,d); k_xor(10,a,b,c,d); + irot(a,b,c,d); ib1(a,b,c,d,e,f,g,h); k_xor( 9,e,f,g,h); + irot(e,f,g,h); ib0(e,f,g,h,a,b,c,d); k_xor( 8,a,b,c,d); + irot(a,b,c,d); ib7(a,b,c,d,e,f,g,h); k_xor( 7,e,f,g,h); + irot(e,f,g,h); ib6(e,f,g,h,a,b,c,d); k_xor( 6,a,b,c,d); + irot(a,b,c,d); ib5(a,b,c,d,e,f,g,h); k_xor( 5,e,f,g,h); + irot(e,f,g,h); ib4(e,f,g,h,a,b,c,d); k_xor( 4,a,b,c,d); + irot(a,b,c,d); ib3(a,b,c,d,e,f,g,h); k_xor( 3,e,f,g,h); + irot(e,f,g,h); ib2(e,f,g,h,a,b,c,d); k_xor( 2,a,b,c,d); + irot(a,b,c,d); ib1(a,b,c,d,e,f,g,h); k_xor( 1,e,f,g,h); + irot(e,f,g,h); ib0(e,f,g,h,a,b,c,d); k_xor( 0,a,b,c,d); + + out[0] = a; + out[1] = b; + out[2] = c; + out[3] = d; +} + +static void serpent256_decrypt_xts (const u32 *ukey1, const u32 *ukey2, const u32 *in, u32 *out) +{ + u32 T[4] = { 0 }; + u32 Z[4] = { 0 }; + + out[0] = in[0]; + out[1] = in[1]; + out[2] = in[2]; + out[3] = in[3]; + + u32 ks[140]; + + serpent256_set_key (ks, ukey2); + serpent256_encrypt (ks, Z, T); + + out[0] ^= T[0]; + out[1] ^= T[1]; + out[2] ^= T[2]; + out[3] ^= T[3]; + + serpent256_set_key (ks, ukey1); + serpent256_decrypt (ks, out, out); + + out[0] ^= T[0]; + out[1] ^= T[1]; + out[2] ^= T[2]; + out[3] ^= T[3]; +} diff --git a/amd/gpu_twofish256_amd.c b/amd/gpu_twofish256_amd.c new file mode 100644 index 0000000000..ef8a943ccd --- /dev/null +++ b/amd/gpu_twofish256_amd.c @@ -0,0 +1,466 @@ +/* This is an independent implementation of the encryption algorithm: */ +/* */ +/* Twofish by Bruce Schneier and colleagues */ +/* */ +/* which is a candidate algorithm in the Advanced Encryption Standard */ +/* programme of the US National Institute of Standards and Technology. */ +/* */ +/* Copyright in this implementation is held by Dr B R Gladman but I */ +/* hereby give permission for its free direct or derivative use subject */ +/* to acknowledgment of its origin and compliance with any conditions */ +/* that the originators of t he algorithm place on its exploitation. */ +/* */ +/* My thanks to Doug Whiting and Niels Ferguson for comments that led */ +/* to improvements in this implementation. */ +/* */ +/* Dr Brian Gladman (gladman@seven77.demon.co.uk) 14th January 1999 */ +/* */ +/* -------------------------------------------------------------------- */ +/* */ +/* Cleaned and optimized for GPU use with oclHashcat by Jens Steube */ + +#define extract_byte(x,n) (((x) >> (8 * (n))) & 0xff) + +__constant u32 q_tab[2][256] = +{ + { + 0xA9, 0x67, 0xB3, 0xE8, 0x04, 0xFD, 0xA3, 0x76, 0x9A, 0x92, 0x80, 0x78, + 0xE4, 0xDD, 0xD1, 0x38, 0x0D, 0xC6, 0x35, 0x98, 0x18, 0xF7, 0xEC, 0x6C, + 0x43, 0x75, 0x37, 0x26, 0xFA, 0x13, 0x94, 0x48, 0xF2, 0xD0, 0x8B, 0x30, + 0x84, 0x54, 0xDF, 0x23, 0x19, 0x5B, 0x3D, 0x59, 0xF3, 0xAE, 0xA2, 0x82, + 0x63, 0x01, 0x83, 0x2E, 0xD9, 0x51, 0x9B, 0x7C, 0xA6, 0xEB, 0xA5, 0xBE, + 0x16, 0x0C, 0xE3, 0x61, 0xC0, 0x8C, 0x3A, 0xF5, 0x73, 0x2C, 0x25, 0x0B, + 0xBB, 0x4E, 0x89, 0x6B, 0x53, 0x6A, 0xB4, 0xF1, 0xE1, 0xE6, 0xBD, 0x45, + 0xE2, 0xF4, 0xB6, 0x66, 0xCC, 0x95, 0x03, 0x56, 0xD4, 0x1C, 0x1E, 0xD7, + 0xFB, 0xC3, 0x8E, 0xB5, 0xE9, 0xCF, 0xBF, 0xBA, 0xEA, 0x77, 0x39, 0xAF, + 0x33, 0xC9, 0x62, 0x71, 0x81, 0x79, 0x09, 0xAD, 0x24, 0xCD, 0xF9, 0xD8, + 0xE5, 0xC5, 0xB9, 0x4D, 0x44, 0x08, 0x86, 0xE7, 0xA1, 0x1D, 0xAA, 0xED, + 0x06, 0x70, 0xB2, 0xD2, 0x41, 0x7B, 0xA0, 0x11, 0x31, 0xC2, 0x27, 0x90, + 0x20, 0xF6, 0x60, 0xFF, 0x96, 0x5C, 0xB1, 0xAB, 0x9E, 0x9C, 0x52, 0x1B, + 0x5F, 0x93, 0x0A, 0xEF, 0x91, 0x85, 0x49, 0xEE, 0x2D, 0x4F, 0x8F, 0x3B, + 0x47, 0x87, 0x6D, 0x46, 0xD6, 0x3E, 0x69, 0x64, 0x2A, 0xCE, 0xCB, 0x2F, + 0xFC, 0x97, 0x05, 0x7A, 0xAC, 0x7F, 0xD5, 0x1A, 0x4B, 0x0E, 0xA7, 0x5A, + 0x28, 0x14, 0x3F, 0x29, 0x88, 0x3C, 0x4C, 0x02, 0xB8, 0xDA, 0xB0, 0x17, + 0x55, 0x1F, 0x8A, 0x7D, 0x57, 0xC7, 0x8D, 0x74, 0xB7, 0xC4, 0x9F, 0x72, + 0x7E, 0x15, 0x22, 0x12, 0x58, 0x07, 0x99, 0x34, 0x6E, 0x50, 0xDE, 0x68, + 0x65, 0xBC, 0xDB, 0xF8, 0xC8, 0xA8, 0x2B, 0x40, 0xDC, 0xFE, 0x32, 0xA4, + 0xCA, 0x10, 0x21, 0xF0, 0xD3, 0x5D, 0x0F, 0x00, 0x6F, 0x9D, 0x36, 0x42, + 0x4A, 0x5E, 0xC1, 0xE0 + }, + { + 0x75, 0xF3, 0xC6, 0xF4, 0xDB, 0x7B, 0xFB, 0xC8, 0x4A, 0xD3, 0xE6, 0x6B, + 0x45, 0x7D, 0xE8, 0x4B, 0xD6, 0x32, 0xD8, 0xFD, 0x37, 0x71, 0xF1, 0xE1, + 0x30, 0x0F, 0xF8, 0x1B, 0x87, 0xFA, 0x06, 0x3F, 0x5E, 0xBA, 0xAE, 0x5B, + 0x8A, 0x00, 0xBC, 0x9D, 0x6D, 0xC1, 0xB1, 0x0E, 0x80, 0x5D, 0xD2, 0xD5, + 0xA0, 0x84, 0x07, 0x14, 0xB5, 0x90, 0x2C, 0xA3, 0xB2, 0x73, 0x4C, 0x54, + 0x92, 0x74, 0x36, 0x51, 0x38, 0xB0, 0xBD, 0x5A, 0xFC, 0x60, 0x62, 0x96, + 0x6C, 0x42, 0xF7, 0x10, 0x7C, 0x28, 0x27, 0x8C, 0x13, 0x95, 0x9C, 0xC7, + 0x24, 0x46, 0x3B, 0x70, 0xCA, 0xE3, 0x85, 0xCB, 0x11, 0xD0, 0x93, 0xB8, + 0xA6, 0x83, 0x20, 0xFF, 0x9F, 0x77, 0xC3, 0xCC, 0x03, 0x6F, 0x08, 0xBF, + 0x40, 0xE7, 0x2B, 0xE2, 0x79, 0x0C, 0xAA, 0x82, 0x41, 0x3A, 0xEA, 0xB9, + 0xE4, 0x9A, 0xA4, 0x97, 0x7E, 0xDA, 0x7A, 0x17, 0x66, 0x94, 0xA1, 0x1D, + 0x3D, 0xF0, 0xDE, 0xB3, 0x0B, 0x72, 0xA7, 0x1C, 0xEF, 0xD1, 0x53, 0x3E, + 0x8F, 0x33, 0x26, 0x5F, 0xEC, 0x76, 0x2A, 0x49, 0x81, 0x88, 0xEE, 0x21, + 0xC4, 0x1A, 0xEB, 0xD9, 0xC5, 0x39, 0x99, 0xCD, 0xAD, 0x31, 0x8B, 0x01, + 0x18, 0x23, 0xDD, 0x1F, 0x4E, 0x2D, 0xF9, 0x48, 0x4F, 0xF2, 0x65, 0x8E, + 0x78, 0x5C, 0x58, 0x19, 0x8D, 0xE5, 0x98, 0x57, 0x67, 0x7F, 0x05, 0x64, + 0xAF, 0x63, 0xB6, 0xFE, 0xF5, 0xB7, 0x3C, 0xA5, 0xCE, 0xE9, 0x68, 0x44, + 0xE0, 0x4D, 0x43, 0x69, 0x29, 0x2E, 0xAC, 0x15, 0x59, 0xA8, 0x0A, 0x9E, + 0x6E, 0x47, 0xDF, 0x34, 0x35, 0x6A, 0xCF, 0xDC, 0x22, 0xC9, 0xC0, 0x9B, + 0x89, 0xD4, 0xED, 0xAB, 0x12, 0xA2, 0x0D, 0x52, 0xBB, 0x02, 0x2F, 0xA9, + 0xD7, 0x61, 0x1E, 0xB4, 0x50, 0x04, 0xF6, 0xC2, 0x16, 0x25, 0x86, 0x56, + 0x55, 0x09, 0xBE, 0x91 + } +}; + +#define q(n,x) q_tab[n][x] + +__constant u32 m_tab[4][256] = +{ + { 0xBCBC3275, 0xECEC21F3, 0x202043C6, 0xB3B3C9F4, 0xDADA03DB, 0x02028B7B, + 0xE2E22BFB, 0x9E9EFAC8, 0xC9C9EC4A, 0xD4D409D3, 0x18186BE6, 0x1E1E9F6B, + 0x98980E45, 0xB2B2387D, 0xA6A6D2E8, 0x2626B74B, 0x3C3C57D6, 0x93938A32, + 0x8282EED8, 0x525298FD, 0x7B7BD437, 0xBBBB3771, 0x5B5B97F1, 0x474783E1, + 0x24243C30, 0x5151E20F, 0xBABAC6F8, 0x4A4AF31B, 0xBFBF4887, 0x0D0D70FA, + 0xB0B0B306, 0x7575DE3F, 0xD2D2FD5E, 0x7D7D20BA, 0x666631AE, 0x3A3AA35B, + 0x59591C8A, 0x00000000, 0xCDCD93BC, 0x1A1AE09D, 0xAEAE2C6D, 0x7F7FABC1, + 0x2B2BC7B1, 0xBEBEB90E, 0xE0E0A080, 0x8A8A105D, 0x3B3B52D2, 0x6464BAD5, + 0xD8D888A0, 0xE7E7A584, 0x5F5FE807, 0x1B1B1114, 0x2C2CC2B5, 0xFCFCB490, + 0x3131272C, 0x808065A3, 0x73732AB2, 0x0C0C8173, 0x79795F4C, 0x6B6B4154, + 0x4B4B0292, 0x53536974, 0x94948F36, 0x83831F51, 0x2A2A3638, 0xC4C49CB0, + 0x2222C8BD, 0xD5D5F85A, 0xBDBDC3FC, 0x48487860, 0xFFFFCE62, 0x4C4C0796, + 0x4141776C, 0xC7C7E642, 0xEBEB24F7, 0x1C1C1410, 0x5D5D637C, 0x36362228, + 0x6767C027, 0xE9E9AF8C, 0x4444F913, 0x1414EA95, 0xF5F5BB9C, 0xCFCF18C7, + 0x3F3F2D24, 0xC0C0E346, 0x7272DB3B, 0x54546C70, 0x29294CCA, 0xF0F035E3, + 0x0808FE85, 0xC6C617CB, 0xF3F34F11, 0x8C8CE4D0, 0xA4A45993, 0xCACA96B8, + 0x68683BA6, 0xB8B84D83, 0x38382820, 0xE5E52EFF, 0xADAD569F, 0x0B0B8477, + 0xC8C81DC3, 0x9999FFCC, 0x5858ED03, 0x19199A6F, 0x0E0E0A08, 0x95957EBF, + 0x70705040, 0xF7F730E7, 0x6E6ECF2B, 0x1F1F6EE2, 0xB5B53D79, 0x09090F0C, + 0x616134AA, 0x57571682, 0x9F9F0B41, 0x9D9D803A, 0x111164EA, 0x2525CDB9, + 0xAFAFDDE4, 0x4545089A, 0xDFDF8DA4, 0xA3A35C97, 0xEAEAD57E, 0x353558DA, + 0xEDEDD07A, 0x4343FC17, 0xF8F8CB66, 0xFBFBB194, 0x3737D3A1, 0xFAFA401D, + 0xC2C2683D, 0xB4B4CCF0, 0x32325DDE, 0x9C9C71B3, 0x5656E70B, 0xE3E3DA72, + 0x878760A7, 0x15151B1C, 0xF9F93AEF, 0x6363BFD1, 0x3434A953, 0x9A9A853E, + 0xB1B1428F, 0x7C7CD133, 0x88889B26, 0x3D3DA65F, 0xA1A1D7EC, 0xE4E4DF76, + 0x8181942A, 0x91910149, 0x0F0FFB81, 0xEEEEAA88, 0x161661EE, 0xD7D77321, + 0x9797F5C4, 0xA5A5A81A, 0xFEFE3FEB, 0x6D6DB5D9, 0x7878AEC5, 0xC5C56D39, + 0x1D1DE599, 0x7676A4CD, 0x3E3EDCAD, 0xCBCB6731, 0xB6B6478B, 0xEFEF5B01, + 0x12121E18, 0x6060C523, 0x6A6AB0DD, 0x4D4DF61F, 0xCECEE94E, 0xDEDE7C2D, + 0x55559DF9, 0x7E7E5A48, 0x2121B24F, 0x03037AF2, 0xA0A02665, 0x5E5E198E, + 0x5A5A6678, 0x65654B5C, 0x62624E58, 0xFDFD4519, 0x0606F48D, 0x404086E5, + 0xF2F2BE98, 0x3333AC57, 0x17179067, 0x05058E7F, 0xE8E85E05, 0x4F4F7D64, + 0x89896AAF, 0x10109563, 0x74742FB6, 0x0A0A75FE, 0x5C5C92F5, 0x9B9B74B7, + 0x2D2D333C, 0x3030D6A5, 0x2E2E49CE, 0x494989E9, 0x46467268, 0x77775544, + 0xA8A8D8E0, 0x9696044D, 0x2828BD43, 0xA9A92969, 0xD9D97929, 0x8686912E, + 0xD1D187AC, 0xF4F44A15, 0x8D8D1559, 0xD6D682A8, 0xB9B9BC0A, 0x42420D9E, + 0xF6F6C16E, 0x2F2FB847, 0xDDDD06DF, 0x23233934, 0xCCCC6235, 0xF1F1C46A, + 0xC1C112CF, 0x8585EBDC, 0x8F8F9E22, 0x7171A1C9, 0x9090F0C0, 0xAAAA539B, + 0x0101F189, 0x8B8BE1D4, 0x4E4E8CED, 0x8E8E6FAB, 0xABABA212, 0x6F6F3EA2, + 0xE6E6540D, 0xDBDBF252, 0x92927BBB, 0xB7B7B602, 0x6969CA2F, 0x3939D9A9, + 0xD3D30CD7, 0xA7A72361, 0xA2A2AD1E, 0xC3C399B4, 0x6C6C4450, 0x07070504, + 0x04047FF6, 0x272746C2, 0xACACA716, 0xD0D07625, 0x50501386, 0xDCDCF756, + 0x84841A55, 0xE1E15109, 0x7A7A25BE, 0x1313EF91 }, + + { 0xA9D93939, 0x67901717, 0xB3719C9C, 0xE8D2A6A6, 0x04050707, 0xFD985252, + 0xA3658080, 0x76DFE4E4, 0x9A084545, 0x92024B4B, 0x80A0E0E0, 0x78665A5A, + 0xE4DDAFAF, 0xDDB06A6A, 0xD1BF6363, 0x38362A2A, 0x0D54E6E6, 0xC6432020, + 0x3562CCCC, 0x98BEF2F2, 0x181E1212, 0xF724EBEB, 0xECD7A1A1, 0x6C774141, + 0x43BD2828, 0x7532BCBC, 0x37D47B7B, 0x269B8888, 0xFA700D0D, 0x13F94444, + 0x94B1FBFB, 0x485A7E7E, 0xF27A0303, 0xD0E48C8C, 0x8B47B6B6, 0x303C2424, + 0x84A5E7E7, 0x54416B6B, 0xDF06DDDD, 0x23C56060, 0x1945FDFD, 0x5BA33A3A, + 0x3D68C2C2, 0x59158D8D, 0xF321ECEC, 0xAE316666, 0xA23E6F6F, 0x82165757, + 0x63951010, 0x015BEFEF, 0x834DB8B8, 0x2E918686, 0xD9B56D6D, 0x511F8383, + 0x9B53AAAA, 0x7C635D5D, 0xA63B6868, 0xEB3FFEFE, 0xA5D63030, 0xBE257A7A, + 0x16A7ACAC, 0x0C0F0909, 0xE335F0F0, 0x6123A7A7, 0xC0F09090, 0x8CAFE9E9, + 0x3A809D9D, 0xF5925C5C, 0x73810C0C, 0x2C273131, 0x2576D0D0, 0x0BE75656, + 0xBB7B9292, 0x4EE9CECE, 0x89F10101, 0x6B9F1E1E, 0x53A93434, 0x6AC4F1F1, + 0xB499C3C3, 0xF1975B5B, 0xE1834747, 0xE66B1818, 0xBDC82222, 0x450E9898, + 0xE26E1F1F, 0xF4C9B3B3, 0xB62F7474, 0x66CBF8F8, 0xCCFF9999, 0x95EA1414, + 0x03ED5858, 0x56F7DCDC, 0xD4E18B8B, 0x1C1B1515, 0x1EADA2A2, 0xD70CD3D3, + 0xFB2BE2E2, 0xC31DC8C8, 0x8E195E5E, 0xB5C22C2C, 0xE9894949, 0xCF12C1C1, + 0xBF7E9595, 0xBA207D7D, 0xEA641111, 0x77840B0B, 0x396DC5C5, 0xAF6A8989, + 0x33D17C7C, 0xC9A17171, 0x62CEFFFF, 0x7137BBBB, 0x81FB0F0F, 0x793DB5B5, + 0x0951E1E1, 0xADDC3E3E, 0x242D3F3F, 0xCDA47676, 0xF99D5555, 0xD8EE8282, + 0xE5864040, 0xC5AE7878, 0xB9CD2525, 0x4D049696, 0x44557777, 0x080A0E0E, + 0x86135050, 0xE730F7F7, 0xA1D33737, 0x1D40FAFA, 0xAA346161, 0xED8C4E4E, + 0x06B3B0B0, 0x706C5454, 0xB22A7373, 0xD2523B3B, 0x410B9F9F, 0x7B8B0202, + 0xA088D8D8, 0x114FF3F3, 0x3167CBCB, 0xC2462727, 0x27C06767, 0x90B4FCFC, + 0x20283838, 0xF67F0404, 0x60784848, 0xFF2EE5E5, 0x96074C4C, 0x5C4B6565, + 0xB1C72B2B, 0xAB6F8E8E, 0x9E0D4242, 0x9CBBF5F5, 0x52F2DBDB, 0x1BF34A4A, + 0x5FA63D3D, 0x9359A4A4, 0x0ABCB9B9, 0xEF3AF9F9, 0x91EF1313, 0x85FE0808, + 0x49019191, 0xEE611616, 0x2D7CDEDE, 0x4FB22121, 0x8F42B1B1, 0x3BDB7272, + 0x47B82F2F, 0x8748BFBF, 0x6D2CAEAE, 0x46E3C0C0, 0xD6573C3C, 0x3E859A9A, + 0x6929A9A9, 0x647D4F4F, 0x2A948181, 0xCE492E2E, 0xCB17C6C6, 0x2FCA6969, + 0xFCC3BDBD, 0x975CA3A3, 0x055EE8E8, 0x7AD0EDED, 0xAC87D1D1, 0x7F8E0505, + 0xD5BA6464, 0x1AA8A5A5, 0x4BB72626, 0x0EB9BEBE, 0xA7608787, 0x5AF8D5D5, + 0x28223636, 0x14111B1B, 0x3FDE7575, 0x2979D9D9, 0x88AAEEEE, 0x3C332D2D, + 0x4C5F7979, 0x02B6B7B7, 0xB896CACA, 0xDA583535, 0xB09CC4C4, 0x17FC4343, + 0x551A8484, 0x1FF64D4D, 0x8A1C5959, 0x7D38B2B2, 0x57AC3333, 0xC718CFCF, + 0x8DF40606, 0x74695353, 0xB7749B9B, 0xC4F59797, 0x9F56ADAD, 0x72DAE3E3, + 0x7ED5EAEA, 0x154AF4F4, 0x229E8F8F, 0x12A2ABAB, 0x584E6262, 0x07E85F5F, + 0x99E51D1D, 0x34392323, 0x6EC1F6F6, 0x50446C6C, 0xDE5D3232, 0x68724646, + 0x6526A0A0, 0xBC93CDCD, 0xDB03DADA, 0xF8C6BABA, 0xC8FA9E9E, 0xA882D6D6, + 0x2BCF6E6E, 0x40507070, 0xDCEB8585, 0xFE750A0A, 0x328A9393, 0xA48DDFDF, + 0xCA4C2929, 0x10141C1C, 0x2173D7D7, 0xF0CCB4B4, 0xD309D4D4, 0x5D108A8A, + 0x0FE25151, 0x00000000, 0x6F9A1919, 0x9DE01A1A, 0x368F9494, 0x42E6C7C7, + 0x4AECC9C9, 0x5EFDD2D2, 0xC1AB7F7F, 0xE0D8A8A8 }, + + { 0xBC75BC32, 0xECF3EC21, 0x20C62043, 0xB3F4B3C9, 0xDADBDA03, 0x027B028B, + 0xE2FBE22B, 0x9EC89EFA, 0xC94AC9EC, 0xD4D3D409, 0x18E6186B, 0x1E6B1E9F, + 0x9845980E, 0xB27DB238, 0xA6E8A6D2, 0x264B26B7, 0x3CD63C57, 0x9332938A, + 0x82D882EE, 0x52FD5298, 0x7B377BD4, 0xBB71BB37, 0x5BF15B97, 0x47E14783, + 0x2430243C, 0x510F51E2, 0xBAF8BAC6, 0x4A1B4AF3, 0xBF87BF48, 0x0DFA0D70, + 0xB006B0B3, 0x753F75DE, 0xD25ED2FD, 0x7DBA7D20, 0x66AE6631, 0x3A5B3AA3, + 0x598A591C, 0x00000000, 0xCDBCCD93, 0x1A9D1AE0, 0xAE6DAE2C, 0x7FC17FAB, + 0x2BB12BC7, 0xBE0EBEB9, 0xE080E0A0, 0x8A5D8A10, 0x3BD23B52, 0x64D564BA, + 0xD8A0D888, 0xE784E7A5, 0x5F075FE8, 0x1B141B11, 0x2CB52CC2, 0xFC90FCB4, + 0x312C3127, 0x80A38065, 0x73B2732A, 0x0C730C81, 0x794C795F, 0x6B546B41, + 0x4B924B02, 0x53745369, 0x9436948F, 0x8351831F, 0x2A382A36, 0xC4B0C49C, + 0x22BD22C8, 0xD55AD5F8, 0xBDFCBDC3, 0x48604878, 0xFF62FFCE, 0x4C964C07, + 0x416C4177, 0xC742C7E6, 0xEBF7EB24, 0x1C101C14, 0x5D7C5D63, 0x36283622, + 0x672767C0, 0xE98CE9AF, 0x441344F9, 0x149514EA, 0xF59CF5BB, 0xCFC7CF18, + 0x3F243F2D, 0xC046C0E3, 0x723B72DB, 0x5470546C, 0x29CA294C, 0xF0E3F035, + 0x088508FE, 0xC6CBC617, 0xF311F34F, 0x8CD08CE4, 0xA493A459, 0xCAB8CA96, + 0x68A6683B, 0xB883B84D, 0x38203828, 0xE5FFE52E, 0xAD9FAD56, 0x0B770B84, + 0xC8C3C81D, 0x99CC99FF, 0x580358ED, 0x196F199A, 0x0E080E0A, 0x95BF957E, + 0x70407050, 0xF7E7F730, 0x6E2B6ECF, 0x1FE21F6E, 0xB579B53D, 0x090C090F, + 0x61AA6134, 0x57825716, 0x9F419F0B, 0x9D3A9D80, 0x11EA1164, 0x25B925CD, + 0xAFE4AFDD, 0x459A4508, 0xDFA4DF8D, 0xA397A35C, 0xEA7EEAD5, 0x35DA3558, + 0xED7AEDD0, 0x431743FC, 0xF866F8CB, 0xFB94FBB1, 0x37A137D3, 0xFA1DFA40, + 0xC23DC268, 0xB4F0B4CC, 0x32DE325D, 0x9CB39C71, 0x560B56E7, 0xE372E3DA, + 0x87A78760, 0x151C151B, 0xF9EFF93A, 0x63D163BF, 0x345334A9, 0x9A3E9A85, + 0xB18FB142, 0x7C337CD1, 0x8826889B, 0x3D5F3DA6, 0xA1ECA1D7, 0xE476E4DF, + 0x812A8194, 0x91499101, 0x0F810FFB, 0xEE88EEAA, 0x16EE1661, 0xD721D773, + 0x97C497F5, 0xA51AA5A8, 0xFEEBFE3F, 0x6DD96DB5, 0x78C578AE, 0xC539C56D, + 0x1D991DE5, 0x76CD76A4, 0x3EAD3EDC, 0xCB31CB67, 0xB68BB647, 0xEF01EF5B, + 0x1218121E, 0x602360C5, 0x6ADD6AB0, 0x4D1F4DF6, 0xCE4ECEE9, 0xDE2DDE7C, + 0x55F9559D, 0x7E487E5A, 0x214F21B2, 0x03F2037A, 0xA065A026, 0x5E8E5E19, + 0x5A785A66, 0x655C654B, 0x6258624E, 0xFD19FD45, 0x068D06F4, 0x40E54086, + 0xF298F2BE, 0x335733AC, 0x17671790, 0x057F058E, 0xE805E85E, 0x4F644F7D, + 0x89AF896A, 0x10631095, 0x74B6742F, 0x0AFE0A75, 0x5CF55C92, 0x9BB79B74, + 0x2D3C2D33, 0x30A530D6, 0x2ECE2E49, 0x49E94989, 0x46684672, 0x77447755, + 0xA8E0A8D8, 0x964D9604, 0x284328BD, 0xA969A929, 0xD929D979, 0x862E8691, + 0xD1ACD187, 0xF415F44A, 0x8D598D15, 0xD6A8D682, 0xB90AB9BC, 0x429E420D, + 0xF66EF6C1, 0x2F472FB8, 0xDDDFDD06, 0x23342339, 0xCC35CC62, 0xF16AF1C4, + 0xC1CFC112, 0x85DC85EB, 0x8F228F9E, 0x71C971A1, 0x90C090F0, 0xAA9BAA53, + 0x018901F1, 0x8BD48BE1, 0x4EED4E8C, 0x8EAB8E6F, 0xAB12ABA2, 0x6FA26F3E, + 0xE60DE654, 0xDB52DBF2, 0x92BB927B, 0xB702B7B6, 0x692F69CA, 0x39A939D9, + 0xD3D7D30C, 0xA761A723, 0xA21EA2AD, 0xC3B4C399, 0x6C506C44, 0x07040705, + 0x04F6047F, 0x27C22746, 0xAC16ACA7, 0xD025D076, 0x50865013, 0xDC56DCF7, + 0x8455841A, 0xE109E151, 0x7ABE7A25, 0x139113EF }, + + { 0xD939A9D9, 0x90176790, 0x719CB371, 0xD2A6E8D2, 0x05070405, 0x9852FD98, + 0x6580A365, 0xDFE476DF, 0x08459A08, 0x024B9202, 0xA0E080A0, 0x665A7866, + 0xDDAFE4DD, 0xB06ADDB0, 0xBF63D1BF, 0x362A3836, 0x54E60D54, 0x4320C643, + 0x62CC3562, 0xBEF298BE, 0x1E12181E, 0x24EBF724, 0xD7A1ECD7, 0x77416C77, + 0xBD2843BD, 0x32BC7532, 0xD47B37D4, 0x9B88269B, 0x700DFA70, 0xF94413F9, + 0xB1FB94B1, 0x5A7E485A, 0x7A03F27A, 0xE48CD0E4, 0x47B68B47, 0x3C24303C, + 0xA5E784A5, 0x416B5441, 0x06DDDF06, 0xC56023C5, 0x45FD1945, 0xA33A5BA3, + 0x68C23D68, 0x158D5915, 0x21ECF321, 0x3166AE31, 0x3E6FA23E, 0x16578216, + 0x95106395, 0x5BEF015B, 0x4DB8834D, 0x91862E91, 0xB56DD9B5, 0x1F83511F, + 0x53AA9B53, 0x635D7C63, 0x3B68A63B, 0x3FFEEB3F, 0xD630A5D6, 0x257ABE25, + 0xA7AC16A7, 0x0F090C0F, 0x35F0E335, 0x23A76123, 0xF090C0F0, 0xAFE98CAF, + 0x809D3A80, 0x925CF592, 0x810C7381, 0x27312C27, 0x76D02576, 0xE7560BE7, + 0x7B92BB7B, 0xE9CE4EE9, 0xF10189F1, 0x9F1E6B9F, 0xA93453A9, 0xC4F16AC4, + 0x99C3B499, 0x975BF197, 0x8347E183, 0x6B18E66B, 0xC822BDC8, 0x0E98450E, + 0x6E1FE26E, 0xC9B3F4C9, 0x2F74B62F, 0xCBF866CB, 0xFF99CCFF, 0xEA1495EA, + 0xED5803ED, 0xF7DC56F7, 0xE18BD4E1, 0x1B151C1B, 0xADA21EAD, 0x0CD3D70C, + 0x2BE2FB2B, 0x1DC8C31D, 0x195E8E19, 0xC22CB5C2, 0x8949E989, 0x12C1CF12, + 0x7E95BF7E, 0x207DBA20, 0x6411EA64, 0x840B7784, 0x6DC5396D, 0x6A89AF6A, + 0xD17C33D1, 0xA171C9A1, 0xCEFF62CE, 0x37BB7137, 0xFB0F81FB, 0x3DB5793D, + 0x51E10951, 0xDC3EADDC, 0x2D3F242D, 0xA476CDA4, 0x9D55F99D, 0xEE82D8EE, + 0x8640E586, 0xAE78C5AE, 0xCD25B9CD, 0x04964D04, 0x55774455, 0x0A0E080A, + 0x13508613, 0x30F7E730, 0xD337A1D3, 0x40FA1D40, 0x3461AA34, 0x8C4EED8C, + 0xB3B006B3, 0x6C54706C, 0x2A73B22A, 0x523BD252, 0x0B9F410B, 0x8B027B8B, + 0x88D8A088, 0x4FF3114F, 0x67CB3167, 0x4627C246, 0xC06727C0, 0xB4FC90B4, + 0x28382028, 0x7F04F67F, 0x78486078, 0x2EE5FF2E, 0x074C9607, 0x4B655C4B, + 0xC72BB1C7, 0x6F8EAB6F, 0x0D429E0D, 0xBBF59CBB, 0xF2DB52F2, 0xF34A1BF3, + 0xA63D5FA6, 0x59A49359, 0xBCB90ABC, 0x3AF9EF3A, 0xEF1391EF, 0xFE0885FE, + 0x01914901, 0x6116EE61, 0x7CDE2D7C, 0xB2214FB2, 0x42B18F42, 0xDB723BDB, + 0xB82F47B8, 0x48BF8748, 0x2CAE6D2C, 0xE3C046E3, 0x573CD657, 0x859A3E85, + 0x29A96929, 0x7D4F647D, 0x94812A94, 0x492ECE49, 0x17C6CB17, 0xCA692FCA, + 0xC3BDFCC3, 0x5CA3975C, 0x5EE8055E, 0xD0ED7AD0, 0x87D1AC87, 0x8E057F8E, + 0xBA64D5BA, 0xA8A51AA8, 0xB7264BB7, 0xB9BE0EB9, 0x6087A760, 0xF8D55AF8, + 0x22362822, 0x111B1411, 0xDE753FDE, 0x79D92979, 0xAAEE88AA, 0x332D3C33, + 0x5F794C5F, 0xB6B702B6, 0x96CAB896, 0x5835DA58, 0x9CC4B09C, 0xFC4317FC, + 0x1A84551A, 0xF64D1FF6, 0x1C598A1C, 0x38B27D38, 0xAC3357AC, 0x18CFC718, + 0xF4068DF4, 0x69537469, 0x749BB774, 0xF597C4F5, 0x56AD9F56, 0xDAE372DA, + 0xD5EA7ED5, 0x4AF4154A, 0x9E8F229E, 0xA2AB12A2, 0x4E62584E, 0xE85F07E8, + 0xE51D99E5, 0x39233439, 0xC1F66EC1, 0x446C5044, 0x5D32DE5D, 0x72466872, + 0x26A06526, 0x93CDBC93, 0x03DADB03, 0xC6BAF8C6, 0xFA9EC8FA, 0x82D6A882, + 0xCF6E2BCF, 0x50704050, 0xEB85DCEB, 0x750AFE75, 0x8A93328A, 0x8DDFA48D, + 0x4C29CA4C, 0x141C1014, 0x73D72173, 0xCCB4F0CC, 0x09D4D309, 0x108A5D10, + 0xE2510FE2, 0x00000000, 0x9A196F9A, 0xE01A9DE0, 0x8F94368F, 0xE6C742E6, + 0xECC94AEC, 0xFDD25EFD, 0xAB7FC1AB, 0xD8A8E0D8 } +}; + +#define mds(n,x) m_tab[n][x] + +static u32 h_fun (u32 *sk, u32 *lk, const u32 x, const u32 *key) +{ + u32 b0, b1, b2, b3; + + b0 = extract_byte (x, 0); + b1 = extract_byte (x, 1); + b2 = extract_byte (x, 2); + b3 = extract_byte (x, 3); + + b0 = q (1, b0) ^ extract_byte (key[3], 0); + b1 = q (0, b1) ^ extract_byte (key[3], 1); + b2 = q (0, b2) ^ extract_byte (key[3], 2); + b3 = q (1, b3) ^ extract_byte (key[3], 3); + + b0 = q (1, b0) ^ extract_byte (key[2], 0); + b1 = q (1, b1) ^ extract_byte (key[2], 1); + b2 = q (0, b2) ^ extract_byte (key[2], 2); + b3 = q (0, b3) ^ extract_byte (key[2], 3); + + b0 = q (0, (q (0, b0) ^ extract_byte (key[1], 0))) ^ extract_byte (key[0], 0); + b1 = q (0, (q (1, b1) ^ extract_byte (key[1], 1))) ^ extract_byte (key[0], 1); + b2 = q (1, (q (0, b2) ^ extract_byte (key[1], 2))) ^ extract_byte (key[0], 2); + b3 = q (1, (q (1, b3) ^ extract_byte (key[1], 3))) ^ extract_byte (key[0], 3); + + return mds (0, b0) ^ mds (1, b1) ^ mds (2, b2) ^ mds (3, b3); +} + +#define q40(x,k) q (0, q (0, q (1, q (1, x) ^ extract_byte (k[3], 0)) ^ extract_byte (k[2], 0)) ^ extract_byte (k[1], 0)) ^ extract_byte (k[0], 0) +#define q41(x,k) q (0, q (1, q (1, q (0, x) ^ extract_byte (k[3], 1)) ^ extract_byte (k[2], 1)) ^ extract_byte (k[1], 1)) ^ extract_byte (k[0], 1) +#define q42(x,k) q (1, q (0, q (0, q (0, x) ^ extract_byte (k[3], 2)) ^ extract_byte (k[2], 2)) ^ extract_byte (k[1], 2)) ^ extract_byte (k[0], 2) +#define q43(x,k) q (1, q (1, q (0, q (1, x) ^ extract_byte (k[3], 3)) ^ extract_byte (k[2], 3)) ^ extract_byte (k[1], 3)) ^ extract_byte (k[0], 3) + +#define g1_fun(x) \ + (mds (0, q40 (extract_byte (x, 3), sk)) ^ \ + mds (1, q41 (extract_byte (x, 0), sk)) ^ \ + mds (2, q42 (extract_byte (x, 1), sk)) ^ \ + mds (3, q43 (extract_byte (x, 2), sk))) + +#define g0_fun(x) \ + (mds (0, q40 (extract_byte (x, 0), sk)) ^ \ + mds (1, q41 (extract_byte (x, 1), sk)) ^ \ + mds (2, q42 (extract_byte (x, 2), sk)) ^ \ + mds (3, q43 (extract_byte (x, 3), sk))) + +static u32 mds_rem (u32 p0, u32 p1) +{ + #define G_MOD 0x14d + + for (int i = 0; i < 8; i++) + { + u32 t = p1 >> 24; + + p1 = (p1 << 8) | (p0 >> 24); + + p0 <<= 8; + + u32 u = (t << 1); + + if (t & 0x80) u ^= G_MOD; + + p1 ^= t ^ (u << 16); + + u ^= (t >> 1); + + if (t & 0x01) u ^= G_MOD >> 1; + + p1 ^= (u << 24) | (u << 8); + } + + return p1; +} + +static void twofish256_set_key (u32 *sk, u32 *lk, const u32 *ukey) +{ + u32 me_key[4]; + + me_key[0] = ukey[0]; + me_key[1] = ukey[2]; + me_key[2] = ukey[4]; + me_key[3] = ukey[6]; + + u32 mo_key[4]; + + mo_key[0] = ukey[1]; + mo_key[1] = ukey[3]; + mo_key[2] = ukey[5]; + mo_key[3] = ukey[7]; + + sk[3] = mds_rem (me_key[0], mo_key[0]); + sk[2] = mds_rem (me_key[1], mo_key[1]); + sk[1] = mds_rem (me_key[2], mo_key[2]); + sk[0] = mds_rem (me_key[3], mo_key[3]); + + for (int i = 0; i < 40; i += 2) + { + u32 a = 0x01010101 * i; + u32 b = 0x01010101 + a; + + a = h_fun (sk, lk, a, me_key); + b = h_fun (sk, lk, b, mo_key); + + b = rotl32 (b, 8); + + lk[i + 0] = a + b; + lk[i + 1] = rotl32 (a + 2 * b, 9); + } +} + +#define f_rnd(i) \ +{ \ + u32 t0 = g0_fun (data[0]); \ + u32 t1 = g1_fun (data[1]); \ + data[2] = rotr32 (data[2] ^ (t0 + t1 + lk[4 * (i) + 8]), 1); \ + data[3] = rotl32 (data[3], 1) ^ (t0 + 2 * t1 + lk[4 * (i) + 9]); \ + u32 t2 = g0_fun (data[2]); \ + u32 t3 = g1_fun (data[3]); \ + data[0] = rotr32 (data[0] ^ (t2 + t3 + lk[4 * (i) + 10]), 1); \ + data[1] = rotl32 (data[1], 1) ^ (t2 + 2 * t3 + lk[4 * (i) + 11]); \ +} + +static void twofish256_encrypt (const u32 *sk, const u32 *lk, const u32 *in, u32 *out) +{ + u32 data[4]; + + data[0] = in[0] ^ lk[0]; + data[1] = in[1] ^ lk[1]; + data[2] = in[2] ^ lk[2]; + data[3] = in[3] ^ lk[3]; + + f_rnd (0); + f_rnd (1); + f_rnd (2); + f_rnd (3); + f_rnd (4); + f_rnd (5); + f_rnd (6); + f_rnd (7); + + out[0] = data[2] ^ lk[4]; + out[1] = data[3] ^ lk[5]; + out[2] = data[0] ^ lk[6]; + out[3] = data[1] ^ lk[7]; +} + +#define i_rnd(i) \ +{ \ + u32 t0 = g0_fun (data[0]); \ + u32 t1 = g1_fun (data[1]); \ + data[2] = rotl32 (data[2], 1) ^ (t0 + t1 + lk[4 * (i) + 10]); \ + data[3] = rotr32 (data[3] ^ (t0 + 2 * t1 + lk[4 * (i) + 11]), 1); \ + u32 t2 = g0_fun (data[2]); \ + u32 t3 = g1_fun (data[3]); \ + data[0] = rotl32 (data[0], 1) ^ (t2 + t3 + lk[4 * (i) + 8]); \ + data[1] = rotr32 (data[1] ^ (t2 + 2 * t3 + lk[4 * (i) + 9]), 1); \ +} + +static void twofish256_decrypt (const u32 *sk, const u32 *lk, const u32 *in, u32 *out) +{ + u32 data[4]; + + data[0] = in[0] ^ lk[4]; + data[1] = in[1] ^ lk[5]; + data[2] = in[2] ^ lk[6]; + data[3] = in[3] ^ lk[7]; + + i_rnd (7); + i_rnd (6); + i_rnd (5); + i_rnd (4); + i_rnd (3); + i_rnd (2); + i_rnd (1); + i_rnd (0); + + out[0] = data[2] ^ lk[0]; + out[1] = data[3] ^ lk[1]; + out[2] = data[0] ^ lk[2]; + out[3] = data[1] ^ lk[3]; +} + +static void twofish256_decrypt_xts (const u32 *ukey1, const u32 *ukey2, const u32 *in, u32 *out) +{ + u32 T[4] = { 0 }; + u32 Z[4] = { 0 }; + + out[0] = in[0]; + out[1] = in[1]; + out[2] = in[2]; + out[3] = in[3]; + + u32 sk[4]; u32 lk[40]; + + twofish256_set_key (sk, lk, ukey2); + twofish256_encrypt (sk, lk, Z, T); + + out[0] ^= T[0]; + out[1] ^= T[1]; + out[2] ^= T[2]; + out[3] ^= T[3]; + + twofish256_set_key (sk, lk, ukey1); + twofish256_decrypt (sk, lk, out, out); + + out[0] ^= T[0]; + out[1] ^= T[1]; + out[2] ^= T[2]; + out[3] ^= T[3]; +} diff --git a/amd/m00000_a0.cl b/amd/m00000_a0.cl new file mode 100644 index 0000000000..e6b29a3760 --- /dev/null +++ b/amd/m00000_a0.cl @@ -0,0 +1,394 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _MD5_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW4 +#define VECT_SIZE4 +#endif + +#ifdef VLIW5 +#define VECT_SIZE4 +#endif + +#define DGST_R0 0 +#define DGST_R1 3 +#define DGST_R2 2 +#define DGST_R3 1 + +#include "include/kernel_functions.c" +#include "types_amd.c" +#include "common_amd.c" +#include "include/rp_gpu.h" +#include "rp_amd.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m00000_m04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + u32x pw_buf1[4]; + + pw_buf1[0] = pws[gid].i[ 4]; + pw_buf1[1] = pws[gid].i[ 5]; + pw_buf1[2] = pws[gid].i[ 6]; + pw_buf1[3] = pws[gid].i[ 7]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + + w0[0] = pw_buf0[0]; + w0[1] = pw_buf0[1]; + w0[2] = pw_buf0[2]; + w0[3] = pw_buf0[3]; + + u32x w1[4]; + + w1[0] = pw_buf1[0]; + w1[1] = pw_buf1[1]; + w1[2] = pw_buf1[2]; + w1[3] = pw_buf1[3]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 out_len = apply_rules (rules_buf[il_pos].cmds, w0, w1, pw_len); + + append_0x80_2 (w0, w1, out_len); + + w3[2] = out_len * 8; + + u32x tmp2; + + u32x a = MD5M_A; + u32x b = MD5M_B; + u32x c = MD5M_C; + u32x d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H1, a, b, c, d, w1[1], MD5C20, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w2[0], MD5C21, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w2[3], MD5C22, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w3[2], MD5C23, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w0[1], MD5C24, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w1[0], MD5C25, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w1[3], MD5C26, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w2[2], MD5C27, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w3[1], MD5C28, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w0[0], MD5C29, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w0[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w1[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w2[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w3[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w3[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w0[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1[0], MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w2[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2[1], MD5C3f, MD5S33); + + + const u32x r0 = a; + const u32x r1 = d; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_M + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m00000_m08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m00000_m16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m00000_s04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + u32x pw_buf1[4]; + + pw_buf1[0] = pws[gid].i[ 4]; + pw_buf1[1] = pws[gid].i[ 5]; + pw_buf1[2] = pws[gid].i[ 6]; + pw_buf1[3] = pws[gid].i[ 7]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + + w0[0] = pw_buf0[0]; + w0[1] = pw_buf0[1]; + w0[2] = pw_buf0[2]; + w0[3] = pw_buf0[3]; + + u32x w1[4]; + + w1[0] = pw_buf1[0]; + w1[1] = pw_buf1[1]; + w1[2] = pw_buf1[2]; + w1[3] = pw_buf1[3]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 out_len = apply_rules (rules_buf[il_pos].cmds, w0, w1, pw_len); + + append_0x80_2 (w0, w1, out_len); + + w3[2] = out_len * 8; + + u32x tmp2; + + u32x a = MD5M_A; + u32x b = MD5M_B; + u32x c = MD5M_C; + u32x d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H1, a, b, c, d, w1[1], MD5C20, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w2[0], MD5C21, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w2[3], MD5C22, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w3[2], MD5C23, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w0[1], MD5C24, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w1[0], MD5C25, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w1[3], MD5C26, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w2[2], MD5C27, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w3[1], MD5C28, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w0[0], MD5C29, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w0[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w1[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w2[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w3[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w3[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w0[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1[0], MD5C3c, MD5S30); + + bool q_cond = allx (search[0] != a); + + if (q_cond) continue; + + MD5_STEP (MD5_I , d, a, b, c, w2[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2[1], MD5C3f, MD5S33); + + + const u32x r0 = a; + const u32x r1 = d; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_S + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m00000_s08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m00000_s16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/amd/m00000_a1.cl b/amd/m00000_a1.cl new file mode 100644 index 0000000000..5332887854 --- /dev/null +++ b/amd/m00000_a1.cl @@ -0,0 +1,496 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _MD5_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW4 +#define VECT_SIZE4 +#endif + +#ifdef VLIW5 +#define VECT_SIZE4 +#endif + +#define DGST_R0 0 +#define DGST_R1 3 +#define DGST_R2 2 +#define DGST_R3 1 + +#include "include/kernel_functions.c" +#include "types_amd.c" +#include "common_amd.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m00000_m04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + append_0x80_2 (wordl0, wordl1, pw_l_len); + + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, combs_buf[0].pw_len); + } + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = combs_buf[il_pos].pw_len; + + const u32 pw_len = pw_l_len + pw_r_len; + + u32 wordr0[4]; + + wordr0[0] = combs_buf[il_pos].i[0]; + wordr0[1] = combs_buf[il_pos].i[1]; + wordr0[2] = combs_buf[il_pos].i[2]; + wordr0[3] = combs_buf[il_pos].i[3]; + + u32 wordr1[4]; + + wordr1[0] = combs_buf[il_pos].i[4]; + wordr1[1] = combs_buf[il_pos].i[5]; + wordr1[2] = combs_buf[il_pos].i[6]; + wordr1[3] = combs_buf[il_pos].i[7]; + + u32 wordr2[4]; + + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + + u32 wordr3[4]; + + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + u32x w0[4]; + + w0[0] = wordl0[0] | wordr0[0]; + w0[1] = wordl0[1] | wordr0[1]; + w0[2] = wordl0[2] | wordr0[2]; + w0[3] = wordl0[3] | wordr0[3]; + + u32x w1[4]; + + w1[0] = wordl1[0] | wordr1[0]; + w1[1] = wordl1[1] | wordr1[1]; + w1[2] = wordl1[2] | wordr1[2]; + w1[3] = wordl1[3] | wordr1[3]; + + u32x w2[4]; + + w2[0] = wordl2[0] | wordr2[0]; + w2[1] = wordl2[1] | wordr2[1]; + w2[2] = wordl2[2] | wordr2[2]; + w2[3] = wordl2[3] | wordr2[3]; + + u32x w3[4]; + + w3[0] = wordl3[0] | wordr3[0]; + w3[1] = wordl3[1] | wordr3[1]; + w3[2] = pw_len * 8; + w3[3] = 0; + + u32x tmp2; + + u32x a = MD5M_A; + u32x b = MD5M_B; + u32x c = MD5M_C; + u32x d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H1, a, b, c, d, w1[1], MD5C20, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w2[0], MD5C21, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w2[3], MD5C22, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w3[2], MD5C23, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w0[1], MD5C24, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w1[0], MD5C25, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w1[3], MD5C26, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w2[2], MD5C27, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w3[1], MD5C28, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w0[0], MD5C29, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w0[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w1[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w2[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w3[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w3[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w0[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1[0], MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w2[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2[1], MD5C3f, MD5S33); + + + const u32x r0 = a; + const u32x r1 = d; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_M + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m00000_m08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m00000_m16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m00000_s04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + append_0x80_2 (wordl0, wordl1, pw_l_len); + + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, combs_buf[0].pw_len); + } + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = combs_buf[il_pos].pw_len; + + const u32 pw_len = pw_l_len + pw_r_len; + + u32 wordr0[4]; + + wordr0[0] = combs_buf[il_pos].i[0]; + wordr0[1] = combs_buf[il_pos].i[1]; + wordr0[2] = combs_buf[il_pos].i[2]; + wordr0[3] = combs_buf[il_pos].i[3]; + + u32 wordr1[4]; + + wordr1[0] = combs_buf[il_pos].i[4]; + wordr1[1] = combs_buf[il_pos].i[5]; + wordr1[2] = combs_buf[il_pos].i[6]; + wordr1[3] = combs_buf[il_pos].i[7]; + + u32 wordr2[4]; + + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + + u32 wordr3[4]; + + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + u32x w0[4]; + + w0[0] = wordl0[0] | wordr0[0]; + w0[1] = wordl0[1] | wordr0[1]; + w0[2] = wordl0[2] | wordr0[2]; + w0[3] = wordl0[3] | wordr0[3]; + + u32x w1[4]; + + w1[0] = wordl1[0] | wordr1[0]; + w1[1] = wordl1[1] | wordr1[1]; + w1[2] = wordl1[2] | wordr1[2]; + w1[3] = wordl1[3] | wordr1[3]; + + u32x w2[4]; + + w2[0] = wordl2[0] | wordr2[0]; + w2[1] = wordl2[1] | wordr2[1]; + w2[2] = wordl2[2] | wordr2[2]; + w2[3] = wordl2[3] | wordr2[3]; + + u32x w3[4]; + + w3[0] = wordl3[0] | wordr3[0]; + w3[1] = wordl3[1] | wordr3[1]; + w3[2] = pw_len * 8; + w3[3] = 0; + + u32x tmp2; + + u32x a = MD5M_A; + u32x b = MD5M_B; + u32x c = MD5M_C; + u32x d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H1, a, b, c, d, w1[1], MD5C20, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w2[0], MD5C21, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w2[3], MD5C22, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w3[2], MD5C23, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w0[1], MD5C24, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w1[0], MD5C25, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w1[3], MD5C26, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w2[2], MD5C27, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w3[1], MD5C28, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w0[0], MD5C29, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w0[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w1[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w2[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w3[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w3[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w0[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1[0], MD5C3c, MD5S30); + + bool q_cond = allx (search[0] != a); + + if (q_cond) continue; + + MD5_STEP (MD5_I , d, a, b, c, w2[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2[1], MD5C3f, MD5S33); + + + const u32x r0 = a; + const u32x r1 = d; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_S + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m00000_s08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m00000_s16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/amd/m00000_a3.cl b/amd/m00000_a3.cl new file mode 100644 index 0000000000..20c32ce81c --- /dev/null +++ b/amd/m00000_a3.cl @@ -0,0 +1,709 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _MD5_ +#define _SCALAR_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW4 +#define VECT_SIZE4 +#endif + +#ifdef VLIW5 +#define VECT_SIZE4 +#endif + +#define DGST_R0 0 +#define DGST_R1 3 +#define DGST_R2 2 +#define DGST_R3 1 + +#include "include/kernel_functions.c" +#include "types_amd.c" +#include "common_amd.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4_warp.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4_warp.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4_warp.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4_warp.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4_warp.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4_warp.c" +#endif + +#define MD5_STEP_REV(f,a,b,c,d,x,t,s) \ +{ \ + a -= b; \ + a = rotr32 (a, s); \ + a -= f (b, c, d); \ + a -= x; \ + a -= t; \ +} + +#define MD5_STEP_REV1(f,a,b,c,d,x,t,s) \ +{ \ + a -= b; \ + a = rotr32 (a, s); \ + a -= x; \ + a -= t; \ +} + +static void m00000m (u32 w[16], const u32 pw_len, __global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global u32x * words_buf_r, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset) +{ + /** + * modifier + */ + + const u32 gid = get_global_id (0); + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 F_w0c00 = 0 + MD5C00; + const u32 F_w1c01 = w[ 1] + MD5C01; + const u32 F_w2c02 = w[ 2] + MD5C02; + const u32 F_w3c03 = w[ 3] + MD5C03; + const u32 F_w4c04 = w[ 4] + MD5C04; + const u32 F_w5c05 = w[ 5] + MD5C05; + const u32 F_w6c06 = w[ 6] + MD5C06; + const u32 F_w7c07 = w[ 7] + MD5C07; + const u32 F_w8c08 = w[ 8] + MD5C08; + const u32 F_w9c09 = w[ 9] + MD5C09; + const u32 F_wac0a = w[10] + MD5C0a; + const u32 F_wbc0b = w[11] + MD5C0b; + const u32 F_wcc0c = w[12] + MD5C0c; + const u32 F_wdc0d = w[13] + MD5C0d; + const u32 F_wec0e = w[14] + MD5C0e; + const u32 F_wfc0f = w[15] + MD5C0f; + + const u32 G_w1c10 = w[ 1] + MD5C10; + const u32 G_w6c11 = w[ 6] + MD5C11; + const u32 G_wbc12 = w[11] + MD5C12; + const u32 G_w0c13 = 0 + MD5C13; + const u32 G_w5c14 = w[ 5] + MD5C14; + const u32 G_wac15 = w[10] + MD5C15; + const u32 G_wfc16 = w[15] + MD5C16; + const u32 G_w4c17 = w[ 4] + MD5C17; + const u32 G_w9c18 = w[ 9] + MD5C18; + const u32 G_wec19 = w[14] + MD5C19; + const u32 G_w3c1a = w[ 3] + MD5C1a; + const u32 G_w8c1b = w[ 8] + MD5C1b; + const u32 G_wdc1c = w[13] + MD5C1c; + const u32 G_w2c1d = w[ 2] + MD5C1d; + const u32 G_w7c1e = w[ 7] + MD5C1e; + const u32 G_wcc1f = w[12] + MD5C1f; + + const u32 H_w5c20 = w[ 5] + MD5C20; + const u32 H_w8c21 = w[ 8] + MD5C21; + const u32 H_wbc22 = w[11] + MD5C22; + const u32 H_wec23 = w[14] + MD5C23; + const u32 H_w1c24 = w[ 1] + MD5C24; + const u32 H_w4c25 = w[ 4] + MD5C25; + const u32 H_w7c26 = w[ 7] + MD5C26; + const u32 H_wac27 = w[10] + MD5C27; + const u32 H_wdc28 = w[13] + MD5C28; + const u32 H_w0c29 = 0 + MD5C29; + const u32 H_w3c2a = w[ 3] + MD5C2a; + const u32 H_w6c2b = w[ 6] + MD5C2b; + const u32 H_w9c2c = w[ 9] + MD5C2c; + const u32 H_wcc2d = w[12] + MD5C2d; + const u32 H_wfc2e = w[15] + MD5C2e; + const u32 H_w2c2f = w[ 2] + MD5C2f; + + const u32 I_w0c30 = 0 + MD5C30; + const u32 I_w7c31 = w[ 7] + MD5C31; + const u32 I_wec32 = w[14] + MD5C32; + const u32 I_w5c33 = w[ 5] + MD5C33; + const u32 I_wcc34 = w[12] + MD5C34; + const u32 I_w3c35 = w[ 3] + MD5C35; + const u32 I_wac36 = w[10] + MD5C36; + const u32 I_w1c37 = w[ 1] + MD5C37; + const u32 I_w8c38 = w[ 8] + MD5C38; + const u32 I_wfc39 = w[15] + MD5C39; + const u32 I_w6c3a = w[ 6] + MD5C3a; + const u32 I_wdc3b = w[13] + MD5C3b; + const u32 I_w4c3c = w[ 4] + MD5C3c; + const u32 I_wbc3d = w[11] + MD5C3d; + const u32 I_w2c3e = w[ 2] + MD5C3e; + const u32 I_w9c3f = w[ 9] + MD5C3f; + + /** + * loop + */ + + const u32 bf_loops = ceil ((float) bfs_cnt / VECT_DIV); + + u32x w0l = w[0]; + + for (u32 il_pos = 0; il_pos < bf_loops; il_pos++) + { + const u32x w0r = words_buf_r[il_pos]; + + const u32x w0 = w0l | w0r; + + u32x tmp2; + + u32x a = MD5M_A; + u32x b = MD5M_B; + u32x c = MD5M_C; + u32x d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0, F_w0c00, MD5S00); + MD5_STEP0(MD5_Fo, d, a, b, c, F_w1c01, MD5S01); + MD5_STEP0(MD5_Fo, c, d, a, b, F_w2c02, MD5S02); + MD5_STEP0(MD5_Fo, b, c, d, a, F_w3c03, MD5S03); + MD5_STEP0(MD5_Fo, a, b, c, d, F_w4c04, MD5S00); + MD5_STEP0(MD5_Fo, d, a, b, c, F_w5c05, MD5S01); + MD5_STEP0(MD5_Fo, c, d, a, b, F_w6c06, MD5S02); + MD5_STEP0(MD5_Fo, b, c, d, a, F_w7c07, MD5S03); + MD5_STEP0(MD5_Fo, a, b, c, d, F_w8c08, MD5S00); + MD5_STEP0(MD5_Fo, d, a, b, c, F_w9c09, MD5S01); + MD5_STEP0(MD5_Fo, c, d, a, b, F_wac0a, MD5S02); + MD5_STEP0(MD5_Fo, b, c, d, a, F_wbc0b, MD5S03); + MD5_STEP0(MD5_Fo, a, b, c, d, F_wcc0c, MD5S00); + MD5_STEP0(MD5_Fo, d, a, b, c, F_wdc0d, MD5S01); + MD5_STEP0(MD5_Fo, c, d, a, b, F_wec0e, MD5S02); + MD5_STEP0(MD5_Fo, b, c, d, a, F_wfc0f, MD5S03); + + MD5_STEP0(MD5_Go, a, b, c, d, G_w1c10, MD5S10); + MD5_STEP0(MD5_Go, d, a, b, c, G_w6c11, MD5S11); + MD5_STEP0(MD5_Go, c, d, a, b, G_wbc12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0, G_w0c13, MD5S13); + MD5_STEP0(MD5_Go, a, b, c, d, G_w5c14, MD5S10); + MD5_STEP0(MD5_Go, d, a, b, c, G_wac15, MD5S11); + MD5_STEP0(MD5_Go, c, d, a, b, G_wfc16, MD5S12); + MD5_STEP0(MD5_Go, b, c, d, a, G_w4c17, MD5S13); + MD5_STEP0(MD5_Go, a, b, c, d, G_w9c18, MD5S10); + MD5_STEP0(MD5_Go, d, a, b, c, G_wec19, MD5S11); + MD5_STEP0(MD5_Go, c, d, a, b, G_w3c1a, MD5S12); + MD5_STEP0(MD5_Go, b, c, d, a, G_w8c1b, MD5S13); + MD5_STEP0(MD5_Go, a, b, c, d, G_wdc1c, MD5S10); + MD5_STEP0(MD5_Go, d, a, b, c, G_w2c1d, MD5S11); + MD5_STEP0(MD5_Go, c, d, a, b, G_w7c1e, MD5S12); + MD5_STEP0(MD5_Go, b, c, d, a, G_wcc1f, MD5S13); + + MD5_STEP0(MD5_H1, a, b, c, d, H_w5c20, MD5S20); + MD5_STEP0(MD5_H2, d, a, b, c, H_w8c21, MD5S21); + MD5_STEP0(MD5_H1, c, d, a, b, H_wbc22, MD5S22); + MD5_STEP0(MD5_H2, b, c, d, a, H_wec23, MD5S23); + MD5_STEP0(MD5_H1, a, b, c, d, H_w1c24, MD5S20); + MD5_STEP0(MD5_H2, d, a, b, c, H_w4c25, MD5S21); + MD5_STEP0(MD5_H1, c, d, a, b, H_w7c26, MD5S22); + MD5_STEP0(MD5_H2, b, c, d, a, H_wac27, MD5S23); + MD5_STEP0(MD5_H1, a, b, c, d, H_wdc28, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w0, H_w0c29, MD5S21); + MD5_STEP0(MD5_H1, c, d, a, b, H_w3c2a, MD5S22); + MD5_STEP0(MD5_H2, b, c, d, a, H_w6c2b, MD5S23); + MD5_STEP0(MD5_H1, a, b, c, d, H_w9c2c, MD5S20); + MD5_STEP0(MD5_H2, d, a, b, c, H_wcc2d, MD5S21); + MD5_STEP0(MD5_H1, c, d, a, b, H_wfc2e, MD5S22); + MD5_STEP0(MD5_H2, b, c, d, a, H_w2c2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0, I_w0c30, MD5S30); + MD5_STEP0(MD5_I , d, a, b, c, I_w7c31, MD5S31); + MD5_STEP0(MD5_I , c, d, a, b, I_wec32, MD5S32); + MD5_STEP0(MD5_I , b, c, d, a, I_w5c33, MD5S33); + MD5_STEP0(MD5_I , a, b, c, d, I_wcc34, MD5S30); + MD5_STEP0(MD5_I , d, a, b, c, I_w3c35, MD5S31); + MD5_STEP0(MD5_I , c, d, a, b, I_wac36, MD5S32); + MD5_STEP0(MD5_I , b, c, d, a, I_w1c37, MD5S33); + MD5_STEP0(MD5_I , a, b, c, d, I_w8c38, MD5S30); + MD5_STEP0(MD5_I , d, a, b, c, I_wfc39, MD5S31); + MD5_STEP0(MD5_I , c, d, a, b, I_w6c3a, MD5S32); + MD5_STEP0(MD5_I , b, c, d, a, I_wdc3b, MD5S33); + MD5_STEP0(MD5_I , a, b, c, d, I_w4c3c, MD5S30); + MD5_STEP0(MD5_I , d, a, b, c, I_wbc3d, MD5S31); + MD5_STEP0(MD5_I , c, d, a, b, I_w2c3e, MD5S32); + MD5_STEP0(MD5_I , b, c, d, a, I_w9c3f, MD5S33); + + + const u32x r0 = a; + const u32x r1 = d; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_M + } +} + +static void m00000s (u32 w[16], const u32 pw_len, __global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global u32x * words_buf_r, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset) +{ + /** + * modifier + */ + + const u32 gid = get_global_id (0); + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 F_w0c00 = 0 + MD5C00; + const u32 F_w1c01 = w[ 1] + MD5C01; + const u32 F_w2c02 = w[ 2] + MD5C02; + const u32 F_w3c03 = w[ 3] + MD5C03; + const u32 F_w4c04 = w[ 4] + MD5C04; + const u32 F_w5c05 = w[ 5] + MD5C05; + const u32 F_w6c06 = w[ 6] + MD5C06; + const u32 F_w7c07 = w[ 7] + MD5C07; + const u32 F_w8c08 = w[ 8] + MD5C08; + const u32 F_w9c09 = w[ 9] + MD5C09; + const u32 F_wac0a = w[10] + MD5C0a; + const u32 F_wbc0b = w[11] + MD5C0b; + const u32 F_wcc0c = w[12] + MD5C0c; + const u32 F_wdc0d = w[13] + MD5C0d; + const u32 F_wec0e = w[14] + MD5C0e; + const u32 F_wfc0f = w[15] + MD5C0f; + + const u32 G_w1c10 = w[ 1] + MD5C10; + const u32 G_w6c11 = w[ 6] + MD5C11; + const u32 G_wbc12 = w[11] + MD5C12; + const u32 G_w0c13 = 0 + MD5C13; + const u32 G_w5c14 = w[ 5] + MD5C14; + const u32 G_wac15 = w[10] + MD5C15; + const u32 G_wfc16 = w[15] + MD5C16; + const u32 G_w4c17 = w[ 4] + MD5C17; + const u32 G_w9c18 = w[ 9] + MD5C18; + const u32 G_wec19 = w[14] + MD5C19; + const u32 G_w3c1a = w[ 3] + MD5C1a; + const u32 G_w8c1b = w[ 8] + MD5C1b; + const u32 G_wdc1c = w[13] + MD5C1c; + const u32 G_w2c1d = w[ 2] + MD5C1d; + const u32 G_w7c1e = w[ 7] + MD5C1e; + const u32 G_wcc1f = w[12] + MD5C1f; + + const u32 H_w5c20 = w[ 5] + MD5C20; + const u32 H_w8c21 = w[ 8] + MD5C21; + const u32 H_wbc22 = w[11] + MD5C22; + const u32 H_wec23 = w[14] + MD5C23; + const u32 H_w1c24 = w[ 1] + MD5C24; + const u32 H_w4c25 = w[ 4] + MD5C25; + const u32 H_w7c26 = w[ 7] + MD5C26; + const u32 H_wac27 = w[10] + MD5C27; + const u32 H_wdc28 = w[13] + MD5C28; + const u32 H_w0c29 = 0 + MD5C29; + const u32 H_w3c2a = w[ 3] + MD5C2a; + const u32 H_w6c2b = w[ 6] + MD5C2b; + const u32 H_w9c2c = w[ 9] + MD5C2c; + const u32 H_wcc2d = w[12] + MD5C2d; + const u32 H_wfc2e = w[15] + MD5C2e; + const u32 H_w2c2f = w[ 2] + MD5C2f; + + const u32 I_w0c30 = 0 + MD5C30; + const u32 I_w7c31 = w[ 7] + MD5C31; + const u32 I_wec32 = w[14] + MD5C32; + const u32 I_w5c33 = w[ 5] + MD5C33; + const u32 I_wcc34 = w[12] + MD5C34; + const u32 I_w3c35 = w[ 3] + MD5C35; + const u32 I_wac36 = w[10] + MD5C36; + const u32 I_w1c37 = w[ 1] + MD5C37; + const u32 I_w8c38 = w[ 8] + MD5C38; + const u32 I_wfc39 = w[15] + MD5C39; + const u32 I_w6c3a = w[ 6] + MD5C3a; + const u32 I_wdc3b = w[13] + MD5C3b; + const u32 I_w4c3c = w[ 4] + MD5C3c; + const u32 I_wbc3d = w[11] + MD5C3d; + const u32 I_w2c3e = w[ 2] + MD5C3e; + const u32 I_w9c3f = w[ 9] + MD5C3f; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * reverse + */ + + u32 a_rev = digests_buf[digests_offset].digest_buf[0]; + u32 b_rev = digests_buf[digests_offset].digest_buf[1]; + u32 c_rev = digests_buf[digests_offset].digest_buf[2]; + u32 d_rev = digests_buf[digests_offset].digest_buf[3]; + + MD5_STEP_REV (MD5_I, b_rev, c_rev, d_rev, a_rev, w[ 9], MD5C3f, MD5S33); + MD5_STEP_REV (MD5_I, c_rev, d_rev, a_rev, b_rev, w[ 2], MD5C3e, MD5S32); + MD5_STEP_REV (MD5_I, d_rev, a_rev, b_rev, c_rev, w[11], MD5C3d, MD5S31); + MD5_STEP_REV (MD5_I, a_rev, b_rev, c_rev, d_rev, w[ 4], MD5C3c, MD5S30); + MD5_STEP_REV (MD5_I, b_rev, c_rev, d_rev, a_rev, w[13], MD5C3b, MD5S33); + MD5_STEP_REV (MD5_I, c_rev, d_rev, a_rev, b_rev, w[ 6], MD5C3a, MD5S32); + MD5_STEP_REV (MD5_I, d_rev, a_rev, b_rev, c_rev, w[15], MD5C39, MD5S31); + MD5_STEP_REV (MD5_I, a_rev, b_rev, c_rev, d_rev, w[ 8], MD5C38, MD5S30); + MD5_STEP_REV (MD5_I, b_rev, c_rev, d_rev, a_rev, w[ 1], MD5C37, MD5S33); + MD5_STEP_REV (MD5_I, c_rev, d_rev, a_rev, b_rev, w[10], MD5C36, MD5S32); + MD5_STEP_REV (MD5_I, d_rev, a_rev, b_rev, c_rev, w[ 3], MD5C35, MD5S31); + MD5_STEP_REV (MD5_I, a_rev, b_rev, c_rev, d_rev, w[12], MD5C34, MD5S30); + MD5_STEP_REV (MD5_I, b_rev, c_rev, d_rev, a_rev, w[ 5], MD5C33, MD5S33); + MD5_STEP_REV (MD5_I, c_rev, d_rev, a_rev, b_rev, w[14], MD5C32, MD5S32); + MD5_STEP_REV (MD5_I, d_rev, a_rev, b_rev, c_rev, w[ 7], MD5C31, MD5S31); + MD5_STEP_REV (MD5_I, a_rev, b_rev, c_rev, d_rev, 0, MD5C30, MD5S30); + + const u32x pre_cd = c_rev ^ d_rev; + + MD5_STEP_REV1(MD5_H, b_rev, c_rev, d_rev, a_rev, w[ 2], MD5C2f, MD5S23); + MD5_STEP_REV1(MD5_H, c_rev, d_rev, a_rev, b_rev, w[15], MD5C2e, MD5S22); + + /** + * loop + */ + + const u32 bf_loops = ceil ((float) bfs_cnt / VECT_DIV); + + u32x w0l = w[0]; + + for (u32 il_pos = 0; il_pos < bf_loops; il_pos++) + { + const u32x w0r = words_buf_r[il_pos]; + + const u32x w0 = w0l | w0r; + + const u32x pre_d = d_rev; + const u32x pre_a = a_rev - w0; + const u32x pre_b = b_rev - (pre_a ^ pre_cd); + const u32x pre_c = c_rev - (pre_a ^ pre_b ^ pre_d); + + u32x tmp2; + + u32x a = MD5M_A; + u32x b = MD5M_B; + u32x c = MD5M_C; + u32x d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0, F_w0c00, MD5S00); + MD5_STEP0(MD5_Fo, d, a, b, c, F_w1c01, MD5S01); + MD5_STEP0(MD5_Fo, c, d, a, b, F_w2c02, MD5S02); + MD5_STEP0(MD5_Fo, b, c, d, a, F_w3c03, MD5S03); + MD5_STEP0(MD5_Fo, a, b, c, d, F_w4c04, MD5S00); + MD5_STEP0(MD5_Fo, d, a, b, c, F_w5c05, MD5S01); + MD5_STEP0(MD5_Fo, c, d, a, b, F_w6c06, MD5S02); + MD5_STEP0(MD5_Fo, b, c, d, a, F_w7c07, MD5S03); + MD5_STEP0(MD5_Fo, a, b, c, d, F_w8c08, MD5S00); + MD5_STEP0(MD5_Fo, d, a, b, c, F_w9c09, MD5S01); + MD5_STEP0(MD5_Fo, c, d, a, b, F_wac0a, MD5S02); + MD5_STEP0(MD5_Fo, b, c, d, a, F_wbc0b, MD5S03); + MD5_STEP0(MD5_Fo, a, b, c, d, F_wcc0c, MD5S00); + MD5_STEP0(MD5_Fo, d, a, b, c, F_wdc0d, MD5S01); + MD5_STEP0(MD5_Fo, c, d, a, b, F_wec0e, MD5S02); + MD5_STEP0(MD5_Fo, b, c, d, a, F_wfc0f, MD5S03); + + MD5_STEP0(MD5_Go, a, b, c, d, G_w1c10, MD5S10); + MD5_STEP0(MD5_Go, d, a, b, c, G_w6c11, MD5S11); + MD5_STEP0(MD5_Go, c, d, a, b, G_wbc12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0, G_w0c13, MD5S13); + MD5_STEP0(MD5_Go, a, b, c, d, G_w5c14, MD5S10); + MD5_STEP0(MD5_Go, d, a, b, c, G_wac15, MD5S11); + MD5_STEP0(MD5_Go, c, d, a, b, G_wfc16, MD5S12); + MD5_STEP0(MD5_Go, b, c, d, a, G_w4c17, MD5S13); + MD5_STEP0(MD5_Go, a, b, c, d, G_w9c18, MD5S10); + MD5_STEP0(MD5_Go, d, a, b, c, G_wec19, MD5S11); + MD5_STEP0(MD5_Go, c, d, a, b, G_w3c1a, MD5S12); + MD5_STEP0(MD5_Go, b, c, d, a, G_w8c1b, MD5S13); + MD5_STEP0(MD5_Go, a, b, c, d, G_wdc1c, MD5S10); + MD5_STEP0(MD5_Go, d, a, b, c, G_w2c1d, MD5S11); + MD5_STEP0(MD5_Go, c, d, a, b, G_w7c1e, MD5S12); + MD5_STEP0(MD5_Go, b, c, d, a, G_wcc1f, MD5S13); + + MD5_STEP0(MD5_H1, a, b, c, d, H_w5c20, MD5S20); + MD5_STEP0(MD5_H2, d, a, b, c, H_w8c21, MD5S21); + MD5_STEP0(MD5_H1, c, d, a, b, H_wbc22, MD5S22); + MD5_STEP0(MD5_H2, b, c, d, a, H_wec23, MD5S23); + MD5_STEP0(MD5_H1, a, b, c, d, H_w1c24, MD5S20); + MD5_STEP0(MD5_H2, d, a, b, c, H_w4c25, MD5S21); + MD5_STEP0(MD5_H1, c, d, a, b, H_w7c26, MD5S22); + MD5_STEP0(MD5_H2, b, c, d, a, H_wac27, MD5S23); + MD5_STEP0(MD5_H1, a, b, c, d, H_wdc28, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w0, H_w0c29, MD5S21); + MD5_STEP0(MD5_H1, c, d, a, b, H_w3c2a, MD5S22); + + bool q_cond = allx (pre_c != c); + + if (q_cond) continue; + + MD5_STEP0(MD5_H2, b, c, d, a, H_w6c2b, MD5S23); + MD5_STEP0(MD5_H1, a, b, c, d, H_w9c2c, MD5S20); + MD5_STEP0(MD5_H2, d, a, b, c, H_wcc2d, MD5S21); + + bool q_cond2 = allx (pre_d != d); + + if (q_cond2) continue; + + MD5_STEP0(MD5_H1, c, d, a, b, H_wfc2e, MD5S22); + MD5_STEP0(MD5_H2, b, c, d, a, H_w2c2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0, I_w0c30, MD5S30); + MD5_STEP0(MD5_I , d, a, b, c, I_w7c31, MD5S31); + MD5_STEP0(MD5_I , c, d, a, b, I_wec32, MD5S32); + MD5_STEP0(MD5_I , b, c, d, a, I_w5c33, MD5S33); + MD5_STEP0(MD5_I , a, b, c, d, I_wcc34, MD5S30); + MD5_STEP0(MD5_I , d, a, b, c, I_w3c35, MD5S31); + MD5_STEP0(MD5_I , c, d, a, b, I_wac36, MD5S32); + MD5_STEP0(MD5_I , b, c, d, a, I_w1c37, MD5S33); + MD5_STEP0(MD5_I , a, b, c, d, I_w8c38, MD5S30); + MD5_STEP0(MD5_I , d, a, b, c, I_wfc39, MD5S31); + MD5_STEP0(MD5_I , c, d, a, b, I_w6c3a, MD5S32); + MD5_STEP0(MD5_I , b, c, d, a, I_wdc3b, MD5S33); + MD5_STEP0(MD5_I , a, b, c, d, I_w4c3c, MD5S30); + MD5_STEP0(MD5_I , d, a, b, c, I_wbc3d, MD5S31); + MD5_STEP0(MD5_I , c, d, a, b, I_w2c3e, MD5S32); + MD5_STEP0(MD5_I , b, c, d, a, I_w9c3f, MD5S33); + + + const u32x r0 = a; + const u32x r1 = d; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_S + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m00000_m04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global u32x * words_buf_r, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32 w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = 0; + w[ 5] = 0; + w[ 6] = 0; + w[ 7] = 0; + w[ 8] = 0; + w[ 9] = 0; + w[10] = 0; + w[11] = 0; + w[12] = 0; + w[13] = 0; + w[14] = pws[gid].i[14]; + w[15] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m00000m (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m00000_m08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global u32x * words_buf_r, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32 w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = pws[gid].i[ 4]; + w[ 5] = pws[gid].i[ 5]; + w[ 6] = pws[gid].i[ 6]; + w[ 7] = pws[gid].i[ 7]; + w[ 8] = 0; + w[ 9] = 0; + w[10] = 0; + w[11] = 0; + w[12] = 0; + w[13] = 0; + w[14] = pws[gid].i[14]; + w[15] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m00000m (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m00000_m16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global u32x * words_buf_r, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32 w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = pws[gid].i[ 4]; + w[ 5] = pws[gid].i[ 5]; + w[ 6] = pws[gid].i[ 6]; + w[ 7] = pws[gid].i[ 7]; + w[ 8] = pws[gid].i[ 8]; + w[ 9] = pws[gid].i[ 9]; + w[10] = pws[gid].i[10]; + w[11] = pws[gid].i[11]; + w[12] = pws[gid].i[12]; + w[13] = pws[gid].i[13]; + w[14] = pws[gid].i[14]; + w[15] = pws[gid].i[15]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m00000m (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m00000_s04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global u32x * words_buf_r, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32 w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = 0; + w[ 5] = 0; + w[ 6] = 0; + w[ 7] = 0; + w[ 8] = 0; + w[ 9] = 0; + w[10] = 0; + w[11] = 0; + w[12] = 0; + w[13] = 0; + w[14] = pws[gid].i[14]; + w[15] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m00000s (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m00000_s08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global u32x * words_buf_r, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32 w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = pws[gid].i[ 4]; + w[ 5] = pws[gid].i[ 5]; + w[ 6] = pws[gid].i[ 6]; + w[ 7] = pws[gid].i[ 7]; + w[ 8] = 0; + w[ 9] = 0; + w[10] = 0; + w[11] = 0; + w[12] = 0; + w[13] = 0; + w[14] = pws[gid].i[14]; + w[15] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m00000s (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m00000_s16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global u32x * words_buf_r, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32 w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = pws[gid].i[ 4]; + w[ 5] = pws[gid].i[ 5]; + w[ 6] = pws[gid].i[ 6]; + w[ 7] = pws[gid].i[ 7]; + w[ 8] = pws[gid].i[ 8]; + w[ 9] = pws[gid].i[ 9]; + w[10] = pws[gid].i[10]; + w[11] = pws[gid].i[11]; + w[12] = pws[gid].i[12]; + w[13] = pws[gid].i[13]; + w[14] = pws[gid].i[14]; + w[15] = pws[gid].i[15]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m00000s (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} diff --git a/amd/m00010_a0.cl b/amd/m00010_a0.cl new file mode 100644 index 0000000000..9d2fc7c56b --- /dev/null +++ b/amd/m00010_a0.cl @@ -0,0 +1,550 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _MD5_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW4 +#define VECT_SIZE4 +#endif + +#ifdef VLIW5 +#define VECT_SIZE4 +#endif + +#define DGST_R0 0 +#define DGST_R1 3 +#define DGST_R2 2 +#define DGST_R3 1 + +#include "include/kernel_functions.c" +#include "types_amd.c" +#include "common_amd.c" +#include "include/rp_gpu.h" +#include "rp_amd.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m00010_m04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + u32x pw_buf1[4]; + + pw_buf1[0] = pws[gid].i[ 4]; + pw_buf1[1] = pws[gid].i[ 5]; + pw_buf1[2] = pws[gid].i[ 6]; + pw_buf1[3] = pws[gid].i[ 7]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[7]; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + + w0[0] = pw_buf0[0]; + w0[1] = pw_buf0[1]; + w0[2] = pw_buf0[2]; + w0[3] = pw_buf0[3]; + + u32x w1[4]; + + w1[0] = pw_buf1[0]; + w1[1] = pw_buf1[1]; + w1[2] = pw_buf1[2]; + w1[3] = pw_buf1[3]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 out_len = apply_rules (rules_buf[il_pos].cmds, w0, w1, pw_len); + + /** + * append salt + */ + + u32 s0[4]; + + s0[0] = salt_buf0[0]; + s0[1] = salt_buf0[1]; + s0[2] = salt_buf0[2]; + s0[3] = salt_buf0[3]; + + u32 s1[4]; + + s1[0] = salt_buf1[0]; + s1[1] = salt_buf1[1]; + s1[2] = salt_buf1[2]; + s1[3] = salt_buf1[3]; + + u32 s2[4]; + + s2[0] = 0; + s2[1] = 0; + s2[2] = 0; + s2[3] = 0; + + u32 s3[4]; + + s3[0] = 0; + s3[1] = 0; + s3[2] = 0; + s3[3] = 0; + + switch_buffer_by_offset (s0, s1, s2, s3, out_len); + + const u32 pw_salt_len = out_len + salt_len; + + w0[0] |= s0[0]; + w0[1] |= s0[1]; + w0[2] |= s0[2]; + w0[3] |= s0[3]; + + w1[0] |= s1[0]; + w1[1] |= s1[1]; + w1[2] |= s1[2]; + w1[3] |= s1[3]; + + w2[0] |= s2[0]; + w2[1] |= s2[1]; + w2[2] |= s2[2]; + w2[3] |= s2[3]; + + w3[0] |= s3[0]; + w3[1] |= s3[1]; + w3[2] = pw_salt_len * 8; + w3[3] = 0; + + append_0x80_4 (w0, w1, w2, w3, pw_salt_len); + + /** + * md5 + */ + + u32x tmp2; + + u32x a = MD5M_A; + u32x b = MD5M_B; + u32x c = MD5M_C; + u32x d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H1, a, b, c, d, w1[1], MD5C20, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w2[0], MD5C21, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w2[3], MD5C22, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w3[2], MD5C23, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w0[1], MD5C24, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w1[0], MD5C25, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w1[3], MD5C26, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w2[2], MD5C27, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w3[1], MD5C28, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w0[0], MD5C29, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w0[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w1[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w2[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w3[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w3[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w0[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1[0], MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w2[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2[1], MD5C3f, MD5S33); + + + const u32x r0 = a; + const u32x r1 = d; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_M + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m00010_m08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m00010_m16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m00010_s04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + u32x pw_buf1[4]; + + pw_buf1[0] = pws[gid].i[ 4]; + pw_buf1[1] = pws[gid].i[ 5]; + pw_buf1[2] = pws[gid].i[ 6]; + pw_buf1[3] = pws[gid].i[ 7]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[7]; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + + w0[0] = pw_buf0[0]; + w0[1] = pw_buf0[1]; + w0[2] = pw_buf0[2]; + w0[3] = pw_buf0[3]; + + u32x w1[4]; + + w1[0] = pw_buf1[0]; + w1[1] = pw_buf1[1]; + w1[2] = pw_buf1[2]; + w1[3] = pw_buf1[3]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 out_len = apply_rules (rules_buf[il_pos].cmds, w0, w1, pw_len); + + /** + * append salt + */ + + u32 s0[4]; + + s0[0] = salt_buf0[0]; + s0[1] = salt_buf0[1]; + s0[2] = salt_buf0[2]; + s0[3] = salt_buf0[3]; + + u32 s1[4]; + + s1[0] = salt_buf1[0]; + s1[1] = salt_buf1[1]; + s1[2] = salt_buf1[2]; + s1[3] = salt_buf1[3]; + + u32 s2[4]; + + s2[0] = 0; + s2[1] = 0; + s2[2] = 0; + s2[3] = 0; + + u32 s3[4]; + + s3[0] = 0; + s3[1] = 0; + s3[2] = 0; + s3[3] = 0; + + switch_buffer_by_offset (s0, s1, s2, s3, out_len); + + const u32 pw_salt_len = out_len + salt_len; + + w0[0] |= s0[0]; + w0[1] |= s0[1]; + w0[2] |= s0[2]; + w0[3] |= s0[3]; + + w1[0] |= s1[0]; + w1[1] |= s1[1]; + w1[2] |= s1[2]; + w1[3] |= s1[3]; + + w2[0] |= s2[0]; + w2[1] |= s2[1]; + w2[2] |= s2[2]; + w2[3] |= s2[3]; + + w3[0] |= s3[0]; + w3[1] |= s3[1]; + w3[2] = pw_salt_len * 8; + w3[3] = 0; + + append_0x80_4 (w0, w1, w2, w3, pw_salt_len); + + /** + * md5 + */ + + u32x tmp2; + + u32x a = MD5M_A; + u32x b = MD5M_B; + u32x c = MD5M_C; + u32x d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H1, a, b, c, d, w1[1], MD5C20, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w2[0], MD5C21, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w2[3], MD5C22, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w3[2], MD5C23, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w0[1], MD5C24, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w1[0], MD5C25, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w1[3], MD5C26, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w2[2], MD5C27, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w3[1], MD5C28, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w0[0], MD5C29, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w0[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w1[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w2[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w3[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w3[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w0[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1[0], MD5C3c, MD5S30); + + bool q_cond = allx (search[0] != a); + + if (q_cond) continue; + + MD5_STEP (MD5_I , d, a, b, c, w2[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2[1], MD5C3f, MD5S33); + + + const u32x r0 = a; + const u32x r1 = d; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_S + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m00010_s08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m00010_s16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/amd/m00010_a1.cl b/amd/m00010_a1.cl new file mode 100644 index 0000000000..ea4bde9817 --- /dev/null +++ b/amd/m00010_a1.cl @@ -0,0 +1,616 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _MD5_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW4 +#define VECT_SIZE4 +#endif + +#ifdef VLIW5 +#define VECT_SIZE4 +#endif + +#define DGST_R0 0 +#define DGST_R1 3 +#define DGST_R2 2 +#define DGST_R3 1 + +#include "include/kernel_functions.c" +#include "types_amd.c" +#include "common_amd.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m00010_m04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, combs_buf[0].pw_len); + } + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[7]; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = combs_buf[il_pos].pw_len; + + const u32 pw_len = pw_l_len + pw_r_len; + + u32 wordr0[4]; + + wordr0[0] = combs_buf[il_pos].i[0]; + wordr0[1] = combs_buf[il_pos].i[1]; + wordr0[2] = combs_buf[il_pos].i[2]; + wordr0[3] = combs_buf[il_pos].i[3]; + + u32 wordr1[4]; + + wordr1[0] = combs_buf[il_pos].i[4]; + wordr1[1] = combs_buf[il_pos].i[5]; + wordr1[2] = combs_buf[il_pos].i[6]; + wordr1[3] = combs_buf[il_pos].i[7]; + + u32 wordr2[4]; + + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + + u32 wordr3[4]; + + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + /** + * append salt + */ + + u32 s0[4]; + + s0[0] = salt_buf0[0]; + s0[1] = salt_buf0[1]; + s0[2] = salt_buf0[2]; + s0[3] = salt_buf0[3]; + + u32 s1[4]; + + s1[0] = salt_buf1[0]; + s1[1] = salt_buf1[1]; + s1[2] = salt_buf1[2]; + s1[3] = salt_buf1[3]; + + u32 s2[4]; + + s2[0] = 0; + s2[1] = 0; + s2[2] = 0; + s2[3] = 0; + + u32 s3[4]; + + s3[0] = 0; + s3[1] = 0; + s3[2] = 0; + s3[3] = 0; + + switch_buffer_by_offset (s0, s1, s2, s3, pw_len); + + const u32 pw_salt_len = pw_len + salt_len; + + u32x w0[4]; + + w0[0] = wordl0[0] | wordr0[0] | s0[0]; + w0[1] = wordl0[1] | wordr0[1] | s0[1]; + w0[2] = wordl0[2] | wordr0[2] | s0[2]; + w0[3] = wordl0[3] | wordr0[3] | s0[3]; + + u32x w1[4]; + + w1[0] = wordl1[0] | wordr1[0] | s1[0]; + w1[1] = wordl1[1] | wordr1[1] | s1[1]; + w1[2] = wordl1[2] | wordr1[2] | s1[2]; + w1[3] = wordl1[3] | wordr1[3] | s1[3]; + + u32x w2[4]; + + w2[0] = wordl2[0] | wordr2[0] | s2[0]; + w2[1] = wordl2[1] | wordr2[1] | s2[1]; + w2[2] = wordl2[2] | wordr2[2] | s2[2]; + w2[3] = wordl2[3] | wordr2[3] | s2[3]; + + u32x w3[4]; + + w3[0] = wordl3[0] | wordr3[0] | s3[0]; + w3[1] = wordl3[1] | wordr3[1] | s3[1]; + w3[2] = pw_salt_len * 8; + w3[3] = 0; + + append_0x80_4 (w0, w1, w2, w3, pw_salt_len); + + /** + * md5 + */ + + u32x tmp2; + + u32x a = MD5M_A; + u32x b = MD5M_B; + u32x c = MD5M_C; + u32x d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H1, a, b, c, d, w1[1], MD5C20, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w2[0], MD5C21, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w2[3], MD5C22, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w3[2], MD5C23, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w0[1], MD5C24, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w1[0], MD5C25, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w1[3], MD5C26, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w2[2], MD5C27, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w3[1], MD5C28, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w0[0], MD5C29, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w0[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w1[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w2[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w3[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w3[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w0[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1[0], MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w2[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2[1], MD5C3f, MD5S33); + + + const u32x r0 = a; + const u32x r1 = d; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_M + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m00010_m08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m00010_m16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m00010_s04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, combs_buf[0].pw_len); + } + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[7]; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = combs_buf[il_pos].pw_len; + + const u32 pw_len = pw_l_len + pw_r_len; + + u32 wordr0[4]; + + wordr0[0] = combs_buf[il_pos].i[0]; + wordr0[1] = combs_buf[il_pos].i[1]; + wordr0[2] = combs_buf[il_pos].i[2]; + wordr0[3] = combs_buf[il_pos].i[3]; + + u32 wordr1[4]; + + wordr1[0] = combs_buf[il_pos].i[4]; + wordr1[1] = combs_buf[il_pos].i[5]; + wordr1[2] = combs_buf[il_pos].i[6]; + wordr1[3] = combs_buf[il_pos].i[7]; + + u32 wordr2[4]; + + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + + u32 wordr3[4]; + + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + /** + * append salt + */ + + u32 s0[4]; + + s0[0] = salt_buf0[0]; + s0[1] = salt_buf0[1]; + s0[2] = salt_buf0[2]; + s0[3] = salt_buf0[3]; + + u32 s1[4]; + + s1[0] = salt_buf1[0]; + s1[1] = salt_buf1[1]; + s1[2] = salt_buf1[2]; + s1[3] = salt_buf1[3]; + + u32 s2[4]; + + s2[0] = 0; + s2[1] = 0; + s2[2] = 0; + s2[3] = 0; + + u32 s3[4]; + + s3[0] = 0; + s3[1] = 0; + s3[2] = 0; + s3[3] = 0; + + switch_buffer_by_offset (s0, s1, s2, s3, pw_len); + + const u32 pw_salt_len = pw_len + salt_len; + + u32x w0[4]; + + w0[0] = wordl0[0] | wordr0[0] | s0[0]; + w0[1] = wordl0[1] | wordr0[1] | s0[1]; + w0[2] = wordl0[2] | wordr0[2] | s0[2]; + w0[3] = wordl0[3] | wordr0[3] | s0[3]; + + u32x w1[4]; + + w1[0] = wordl1[0] | wordr1[0] | s1[0]; + w1[1] = wordl1[1] | wordr1[1] | s1[1]; + w1[2] = wordl1[2] | wordr1[2] | s1[2]; + w1[3] = wordl1[3] | wordr1[3] | s1[3]; + + u32x w2[4]; + + w2[0] = wordl2[0] | wordr2[0] | s2[0]; + w2[1] = wordl2[1] | wordr2[1] | s2[1]; + w2[2] = wordl2[2] | wordr2[2] | s2[2]; + w2[3] = wordl2[3] | wordr2[3] | s2[3]; + + u32x w3[4]; + + w3[0] = wordl3[0] | wordr3[0] | s3[0]; + w3[1] = wordl3[1] | wordr3[1] | s3[1]; + w3[2] = pw_salt_len * 8; + w3[3] = 0; + + append_0x80_4 (w0, w1, w2, w3, pw_salt_len); + + /** + * md5 + */ + + u32x tmp2; + + u32x a = MD5M_A; + u32x b = MD5M_B; + u32x c = MD5M_C; + u32x d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H1, a, b, c, d, w1[1], MD5C20, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w2[0], MD5C21, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w2[3], MD5C22, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w3[2], MD5C23, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w0[1], MD5C24, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w1[0], MD5C25, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w1[3], MD5C26, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w2[2], MD5C27, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w3[1], MD5C28, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w0[0], MD5C29, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w0[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w1[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w2[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w3[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w3[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w0[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1[0], MD5C3c, MD5S30); + + bool q_cond = allx (search[0] != a); + + if (q_cond) continue; + + MD5_STEP (MD5_I , d, a, b, c, w2[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2[1], MD5C3f, MD5S33); + + + const u32x r0 = a; + const u32x r1 = d; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_S + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m00010_s08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m00010_s16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/amd/m00010_a3.cl b/amd/m00010_a3.cl new file mode 100644 index 0000000000..3c8cae92f8 --- /dev/null +++ b/amd/m00010_a3.cl @@ -0,0 +1,766 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _MD5_ +#define _SCALAR_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW4 +#define VECT_SIZE4 +#endif + +#ifdef VLIW5 +#define VECT_SIZE4 +#endif + +#define DGST_R0 0 +#define DGST_R1 3 +#define DGST_R2 2 +#define DGST_R3 1 + +#include "include/kernel_functions.c" +#include "types_amd.c" +#include "common_amd.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4_warp.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4_warp.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4_warp.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4_warp.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4_warp.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4_warp.c" +#endif + +#define MD5_STEP_REV(f,a,b,c,d,x,t,s) \ +{ \ + a -= b; \ + a = rotr32 (a, s); \ + a -= f (b, c, d); \ + a -= x; \ + a -= t; \ +} + +#define MD5_STEP_REV1(f,a,b,c,d,x,t,s) \ +{ \ + a -= b; \ + a = rotr32 (a, s); \ + a -= x; \ + a -= t; \ +} + +static void m00010m (u32 w[16], const u32 pw_len, __global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global u32x * words_buf_r, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset) +{ + /** + * modifier + */ + + const u32 gid = get_global_id (0); + const u32 lid = get_local_id (0); + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[ 1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[ 2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[ 3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[ 4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[ 5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[ 6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[ 7]; + + u32 salt_buf2[4]; + + salt_buf2[0] = salt_bufs[salt_pos].salt_buf[ 8]; + salt_buf2[1] = 0; + salt_buf2[2] = 0; + salt_buf2[3] = 0; + + u32 salt_buf3[4]; + + salt_buf3[0] = 0; + salt_buf3[1] = 0; + salt_buf3[2] = 0; + salt_buf3[3] = 0; + + switch_buffer_by_offset (salt_buf0, salt_buf1, salt_buf2, salt_buf3, pw_len); + + w[ 0] |= salt_buf0[0]; + w[ 1] |= salt_buf0[1]; + w[ 2] |= salt_buf0[2]; + w[ 3] |= salt_buf0[3]; + w[ 4] |= salt_buf1[0]; + w[ 5] |= salt_buf1[1]; + w[ 6] |= salt_buf1[2]; + w[ 7] |= salt_buf1[3]; + w[ 8] |= salt_buf2[0]; + w[ 9] |= salt_buf2[1]; + w[10] |= salt_buf2[2]; + w[11] |= salt_buf2[3]; + w[12] |= salt_buf3[0]; + w[13] |= salt_buf3[1]; + w[14] |= salt_buf3[2]; + w[15] |= salt_buf3[3]; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + const u32 pw_salt_len = pw_len + salt_len; + + w[14] = pw_salt_len * 8; + + /** + * base + */ + + const u32 F_w0c00 = 0 + MD5C00; + const u32 F_w1c01 = w[ 1] + MD5C01; + const u32 F_w2c02 = w[ 2] + MD5C02; + const u32 F_w3c03 = w[ 3] + MD5C03; + const u32 F_w4c04 = w[ 4] + MD5C04; + const u32 F_w5c05 = w[ 5] + MD5C05; + const u32 F_w6c06 = w[ 6] + MD5C06; + const u32 F_w7c07 = w[ 7] + MD5C07; + const u32 F_w8c08 = w[ 8] + MD5C08; + const u32 F_w9c09 = w[ 9] + MD5C09; + const u32 F_wac0a = w[10] + MD5C0a; + const u32 F_wbc0b = w[11] + MD5C0b; + const u32 F_wcc0c = w[12] + MD5C0c; + const u32 F_wdc0d = w[13] + MD5C0d; + const u32 F_wec0e = w[14] + MD5C0e; + const u32 F_wfc0f = w[15] + MD5C0f; + + const u32 G_w1c10 = w[ 1] + MD5C10; + const u32 G_w6c11 = w[ 6] + MD5C11; + const u32 G_wbc12 = w[11] + MD5C12; + const u32 G_w0c13 = 0 + MD5C13; + const u32 G_w5c14 = w[ 5] + MD5C14; + const u32 G_wac15 = w[10] + MD5C15; + const u32 G_wfc16 = w[15] + MD5C16; + const u32 G_w4c17 = w[ 4] + MD5C17; + const u32 G_w9c18 = w[ 9] + MD5C18; + const u32 G_wec19 = w[14] + MD5C19; + const u32 G_w3c1a = w[ 3] + MD5C1a; + const u32 G_w8c1b = w[ 8] + MD5C1b; + const u32 G_wdc1c = w[13] + MD5C1c; + const u32 G_w2c1d = w[ 2] + MD5C1d; + const u32 G_w7c1e = w[ 7] + MD5C1e; + const u32 G_wcc1f = w[12] + MD5C1f; + + const u32 H_w5c20 = w[ 5] + MD5C20; + const u32 H_w8c21 = w[ 8] + MD5C21; + const u32 H_wbc22 = w[11] + MD5C22; + const u32 H_wec23 = w[14] + MD5C23; + const u32 H_w1c24 = w[ 1] + MD5C24; + const u32 H_w4c25 = w[ 4] + MD5C25; + const u32 H_w7c26 = w[ 7] + MD5C26; + const u32 H_wac27 = w[10] + MD5C27; + const u32 H_wdc28 = w[13] + MD5C28; + const u32 H_w0c29 = 0 + MD5C29; + const u32 H_w3c2a = w[ 3] + MD5C2a; + const u32 H_w6c2b = w[ 6] + MD5C2b; + const u32 H_w9c2c = w[ 9] + MD5C2c; + const u32 H_wcc2d = w[12] + MD5C2d; + const u32 H_wfc2e = w[15] + MD5C2e; + const u32 H_w2c2f = w[ 2] + MD5C2f; + + const u32 I_w0c30 = 0 + MD5C30; + const u32 I_w7c31 = w[ 7] + MD5C31; + const u32 I_wec32 = w[14] + MD5C32; + const u32 I_w5c33 = w[ 5] + MD5C33; + const u32 I_wcc34 = w[12] + MD5C34; + const u32 I_w3c35 = w[ 3] + MD5C35; + const u32 I_wac36 = w[10] + MD5C36; + const u32 I_w1c37 = w[ 1] + MD5C37; + const u32 I_w8c38 = w[ 8] + MD5C38; + const u32 I_wfc39 = w[15] + MD5C39; + const u32 I_w6c3a = w[ 6] + MD5C3a; + const u32 I_wdc3b = w[13] + MD5C3b; + const u32 I_w4c3c = w[ 4] + MD5C3c; + const u32 I_wbc3d = w[11] + MD5C3d; + const u32 I_w2c3e = w[ 2] + MD5C3e; + const u32 I_w9c3f = w[ 9] + MD5C3f; + + /** + * loop + */ + + const u32 bf_loops = ceil ((float) bfs_cnt / VECT_DIV); + + u32x w0l = w[0]; + + for (u32 il_pos = 0; il_pos < bf_loops; il_pos++) + { + const u32x w0r = words_buf_r[il_pos]; + + const u32x w0 = w0l | w0r; + + u32x tmp2; + + u32x a = MD5M_A; + u32x b = MD5M_B; + u32x c = MD5M_C; + u32x d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0, F_w0c00, MD5S00); + MD5_STEP0(MD5_Fo, d, a, b, c, F_w1c01, MD5S01); + MD5_STEP0(MD5_Fo, c, d, a, b, F_w2c02, MD5S02); + MD5_STEP0(MD5_Fo, b, c, d, a, F_w3c03, MD5S03); + MD5_STEP0(MD5_Fo, a, b, c, d, F_w4c04, MD5S00); + MD5_STEP0(MD5_Fo, d, a, b, c, F_w5c05, MD5S01); + MD5_STEP0(MD5_Fo, c, d, a, b, F_w6c06, MD5S02); + MD5_STEP0(MD5_Fo, b, c, d, a, F_w7c07, MD5S03); + MD5_STEP0(MD5_Fo, a, b, c, d, F_w8c08, MD5S00); + MD5_STEP0(MD5_Fo, d, a, b, c, F_w9c09, MD5S01); + MD5_STEP0(MD5_Fo, c, d, a, b, F_wac0a, MD5S02); + MD5_STEP0(MD5_Fo, b, c, d, a, F_wbc0b, MD5S03); + MD5_STEP0(MD5_Fo, a, b, c, d, F_wcc0c, MD5S00); + MD5_STEP0(MD5_Fo, d, a, b, c, F_wdc0d, MD5S01); + MD5_STEP0(MD5_Fo, c, d, a, b, F_wec0e, MD5S02); + MD5_STEP0(MD5_Fo, b, c, d, a, F_wfc0f, MD5S03); + + MD5_STEP0(MD5_Go, a, b, c, d, G_w1c10, MD5S10); + MD5_STEP0(MD5_Go, d, a, b, c, G_w6c11, MD5S11); + MD5_STEP0(MD5_Go, c, d, a, b, G_wbc12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0, G_w0c13, MD5S13); + MD5_STEP0(MD5_Go, a, b, c, d, G_w5c14, MD5S10); + MD5_STEP0(MD5_Go, d, a, b, c, G_wac15, MD5S11); + MD5_STEP0(MD5_Go, c, d, a, b, G_wfc16, MD5S12); + MD5_STEP0(MD5_Go, b, c, d, a, G_w4c17, MD5S13); + MD5_STEP0(MD5_Go, a, b, c, d, G_w9c18, MD5S10); + MD5_STEP0(MD5_Go, d, a, b, c, G_wec19, MD5S11); + MD5_STEP0(MD5_Go, c, d, a, b, G_w3c1a, MD5S12); + MD5_STEP0(MD5_Go, b, c, d, a, G_w8c1b, MD5S13); + MD5_STEP0(MD5_Go, a, b, c, d, G_wdc1c, MD5S10); + MD5_STEP0(MD5_Go, d, a, b, c, G_w2c1d, MD5S11); + MD5_STEP0(MD5_Go, c, d, a, b, G_w7c1e, MD5S12); + MD5_STEP0(MD5_Go, b, c, d, a, G_wcc1f, MD5S13); + + MD5_STEP0(MD5_H1, a, b, c, d, H_w5c20, MD5S20); + MD5_STEP0(MD5_H2, d, a, b, c, H_w8c21, MD5S21); + MD5_STEP0(MD5_H1, c, d, a, b, H_wbc22, MD5S22); + MD5_STEP0(MD5_H2, b, c, d, a, H_wec23, MD5S23); + MD5_STEP0(MD5_H1, a, b, c, d, H_w1c24, MD5S20); + MD5_STEP0(MD5_H2, d, a, b, c, H_w4c25, MD5S21); + MD5_STEP0(MD5_H1, c, d, a, b, H_w7c26, MD5S22); + MD5_STEP0(MD5_H2, b, c, d, a, H_wac27, MD5S23); + MD5_STEP0(MD5_H1, a, b, c, d, H_wdc28, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w0, H_w0c29, MD5S21); + MD5_STEP0(MD5_H1, c, d, a, b, H_w3c2a, MD5S22); + MD5_STEP0(MD5_H2, b, c, d, a, H_w6c2b, MD5S23); + MD5_STEP0(MD5_H1, a, b, c, d, H_w9c2c, MD5S20); + MD5_STEP0(MD5_H2, d, a, b, c, H_wcc2d, MD5S21); + MD5_STEP0(MD5_H1, c, d, a, b, H_wfc2e, MD5S22); + MD5_STEP0(MD5_H2, b, c, d, a, H_w2c2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0, I_w0c30, MD5S30); + MD5_STEP0(MD5_I , d, a, b, c, I_w7c31, MD5S31); + MD5_STEP0(MD5_I , c, d, a, b, I_wec32, MD5S32); + MD5_STEP0(MD5_I , b, c, d, a, I_w5c33, MD5S33); + MD5_STEP0(MD5_I , a, b, c, d, I_wcc34, MD5S30); + MD5_STEP0(MD5_I , d, a, b, c, I_w3c35, MD5S31); + MD5_STEP0(MD5_I , c, d, a, b, I_wac36, MD5S32); + MD5_STEP0(MD5_I , b, c, d, a, I_w1c37, MD5S33); + MD5_STEP0(MD5_I , a, b, c, d, I_w8c38, MD5S30); + MD5_STEP0(MD5_I , d, a, b, c, I_wfc39, MD5S31); + MD5_STEP0(MD5_I , c, d, a, b, I_w6c3a, MD5S32); + MD5_STEP0(MD5_I , b, c, d, a, I_wdc3b, MD5S33); + MD5_STEP0(MD5_I , a, b, c, d, I_w4c3c, MD5S30); + MD5_STEP0(MD5_I , d, a, b, c, I_wbc3d, MD5S31); + MD5_STEP0(MD5_I , c, d, a, b, I_w2c3e, MD5S32); + MD5_STEP0(MD5_I , b, c, d, a, I_w9c3f, MD5S33); + + + const u32x r0 = a; + const u32x r1 = d; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_M + } +} + +static void m00010s (u32 w[16], const u32 pw_len, __global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global u32x * words_buf_r, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset) +{ + /** + * modifier + */ + + const u32 gid = get_global_id (0); + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 F_w0c00 = 0 + MD5C00; + const u32 F_w1c01 = w[ 1] + MD5C01; + const u32 F_w2c02 = w[ 2] + MD5C02; + const u32 F_w3c03 = w[ 3] + MD5C03; + const u32 F_w4c04 = w[ 4] + MD5C04; + const u32 F_w5c05 = w[ 5] + MD5C05; + const u32 F_w6c06 = w[ 6] + MD5C06; + const u32 F_w7c07 = w[ 7] + MD5C07; + const u32 F_w8c08 = w[ 8] + MD5C08; + const u32 F_w9c09 = w[ 9] + MD5C09; + const u32 F_wac0a = w[10] + MD5C0a; + const u32 F_wbc0b = w[11] + MD5C0b; + const u32 F_wcc0c = w[12] + MD5C0c; + const u32 F_wdc0d = w[13] + MD5C0d; + const u32 F_wec0e = w[14] + MD5C0e; + const u32 F_wfc0f = w[15] + MD5C0f; + + const u32 G_w1c10 = w[ 1] + MD5C10; + const u32 G_w6c11 = w[ 6] + MD5C11; + const u32 G_wbc12 = w[11] + MD5C12; + const u32 G_w0c13 = 0 + MD5C13; + const u32 G_w5c14 = w[ 5] + MD5C14; + const u32 G_wac15 = w[10] + MD5C15; + const u32 G_wfc16 = w[15] + MD5C16; + const u32 G_w4c17 = w[ 4] + MD5C17; + const u32 G_w9c18 = w[ 9] + MD5C18; + const u32 G_wec19 = w[14] + MD5C19; + const u32 G_w3c1a = w[ 3] + MD5C1a; + const u32 G_w8c1b = w[ 8] + MD5C1b; + const u32 G_wdc1c = w[13] + MD5C1c; + const u32 G_w2c1d = w[ 2] + MD5C1d; + const u32 G_w7c1e = w[ 7] + MD5C1e; + const u32 G_wcc1f = w[12] + MD5C1f; + + const u32 H_w5c20 = w[ 5] + MD5C20; + const u32 H_w8c21 = w[ 8] + MD5C21; + const u32 H_wbc22 = w[11] + MD5C22; + const u32 H_wec23 = w[14] + MD5C23; + const u32 H_w1c24 = w[ 1] + MD5C24; + const u32 H_w4c25 = w[ 4] + MD5C25; + const u32 H_w7c26 = w[ 7] + MD5C26; + const u32 H_wac27 = w[10] + MD5C27; + const u32 H_wdc28 = w[13] + MD5C28; + const u32 H_w0c29 = 0 + MD5C29; + const u32 H_w3c2a = w[ 3] + MD5C2a; + const u32 H_w6c2b = w[ 6] + MD5C2b; + const u32 H_w9c2c = w[ 9] + MD5C2c; + const u32 H_wcc2d = w[12] + MD5C2d; + const u32 H_wfc2e = w[15] + MD5C2e; + const u32 H_w2c2f = w[ 2] + MD5C2f; + + const u32 I_w0c30 = 0 + MD5C30; + const u32 I_w7c31 = w[ 7] + MD5C31; + const u32 I_wec32 = w[14] + MD5C32; + const u32 I_w5c33 = w[ 5] + MD5C33; + const u32 I_wcc34 = w[12] + MD5C34; + const u32 I_w3c35 = w[ 3] + MD5C35; + const u32 I_wac36 = w[10] + MD5C36; + const u32 I_w1c37 = w[ 1] + MD5C37; + const u32 I_w8c38 = w[ 8] + MD5C38; + const u32 I_wfc39 = w[15] + MD5C39; + const u32 I_w6c3a = w[ 6] + MD5C3a; + const u32 I_wdc3b = w[13] + MD5C3b; + const u32 I_w4c3c = w[ 4] + MD5C3c; + const u32 I_wbc3d = w[11] + MD5C3d; + const u32 I_w2c3e = w[ 2] + MD5C3e; + const u32 I_w9c3f = w[ 9] + MD5C3f; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * reverse + */ + + u32 a_rev = digests_buf[digests_offset].digest_buf[0]; + u32 b_rev = digests_buf[digests_offset].digest_buf[1]; + u32 c_rev = digests_buf[digests_offset].digest_buf[2]; + u32 d_rev = digests_buf[digests_offset].digest_buf[3]; + + MD5_STEP_REV (MD5_I, b_rev, c_rev, d_rev, a_rev, w[ 9], MD5C3f, MD5S33); + MD5_STEP_REV (MD5_I, c_rev, d_rev, a_rev, b_rev, w[ 2], MD5C3e, MD5S32); + MD5_STEP_REV (MD5_I, d_rev, a_rev, b_rev, c_rev, w[11], MD5C3d, MD5S31); + MD5_STEP_REV (MD5_I, a_rev, b_rev, c_rev, d_rev, w[ 4], MD5C3c, MD5S30); + MD5_STEP_REV (MD5_I, b_rev, c_rev, d_rev, a_rev, w[13], MD5C3b, MD5S33); + MD5_STEP_REV (MD5_I, c_rev, d_rev, a_rev, b_rev, w[ 6], MD5C3a, MD5S32); + MD5_STEP_REV (MD5_I, d_rev, a_rev, b_rev, c_rev, w[15], MD5C39, MD5S31); + MD5_STEP_REV (MD5_I, a_rev, b_rev, c_rev, d_rev, w[ 8], MD5C38, MD5S30); + MD5_STEP_REV (MD5_I, b_rev, c_rev, d_rev, a_rev, w[ 1], MD5C37, MD5S33); + MD5_STEP_REV (MD5_I, c_rev, d_rev, a_rev, b_rev, w[10], MD5C36, MD5S32); + MD5_STEP_REV (MD5_I, d_rev, a_rev, b_rev, c_rev, w[ 3], MD5C35, MD5S31); + MD5_STEP_REV (MD5_I, a_rev, b_rev, c_rev, d_rev, w[12], MD5C34, MD5S30); + MD5_STEP_REV (MD5_I, b_rev, c_rev, d_rev, a_rev, w[ 5], MD5C33, MD5S33); + MD5_STEP_REV (MD5_I, c_rev, d_rev, a_rev, b_rev, w[14], MD5C32, MD5S32); + MD5_STEP_REV (MD5_I, d_rev, a_rev, b_rev, c_rev, w[ 7], MD5C31, MD5S31); + MD5_STEP_REV (MD5_I, a_rev, b_rev, c_rev, d_rev, 0, MD5C30, MD5S30); + + const u32x pre_cd = c_rev ^ d_rev; + + MD5_STEP_REV1(MD5_H, b_rev, c_rev, d_rev, a_rev, w[ 2], MD5C2f, MD5S23); + MD5_STEP_REV1(MD5_H, c_rev, d_rev, a_rev, b_rev, w[15], MD5C2e, MD5S22); + + /** + * loop + */ + + const u32 bf_loops = ceil ((float) bfs_cnt / VECT_DIV); + + u32x w0l = w[0]; + + for (u32 il_pos = 0; il_pos < bf_loops; il_pos++) + { + const u32x w0r = words_buf_r[il_pos]; + + const u32x w0 = w0l | w0r; + + const u32x pre_d = d_rev; + const u32x pre_a = a_rev - w0; + const u32x pre_b = b_rev - (pre_a ^ pre_cd); + const u32x pre_c = c_rev - (pre_a ^ pre_b ^ pre_d); + + u32x tmp2; + + u32x a = MD5M_A; + u32x b = MD5M_B; + u32x c = MD5M_C; + u32x d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0, F_w0c00, MD5S00); + MD5_STEP0(MD5_Fo, d, a, b, c, F_w1c01, MD5S01); + MD5_STEP0(MD5_Fo, c, d, a, b, F_w2c02, MD5S02); + MD5_STEP0(MD5_Fo, b, c, d, a, F_w3c03, MD5S03); + MD5_STEP0(MD5_Fo, a, b, c, d, F_w4c04, MD5S00); + MD5_STEP0(MD5_Fo, d, a, b, c, F_w5c05, MD5S01); + MD5_STEP0(MD5_Fo, c, d, a, b, F_w6c06, MD5S02); + MD5_STEP0(MD5_Fo, b, c, d, a, F_w7c07, MD5S03); + MD5_STEP0(MD5_Fo, a, b, c, d, F_w8c08, MD5S00); + MD5_STEP0(MD5_Fo, d, a, b, c, F_w9c09, MD5S01); + MD5_STEP0(MD5_Fo, c, d, a, b, F_wac0a, MD5S02); + MD5_STEP0(MD5_Fo, b, c, d, a, F_wbc0b, MD5S03); + MD5_STEP0(MD5_Fo, a, b, c, d, F_wcc0c, MD5S00); + MD5_STEP0(MD5_Fo, d, a, b, c, F_wdc0d, MD5S01); + MD5_STEP0(MD5_Fo, c, d, a, b, F_wec0e, MD5S02); + MD5_STEP0(MD5_Fo, b, c, d, a, F_wfc0f, MD5S03); + + MD5_STEP0(MD5_Go, a, b, c, d, G_w1c10, MD5S10); + MD5_STEP0(MD5_Go, d, a, b, c, G_w6c11, MD5S11); + MD5_STEP0(MD5_Go, c, d, a, b, G_wbc12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0, G_w0c13, MD5S13); + MD5_STEP0(MD5_Go, a, b, c, d, G_w5c14, MD5S10); + MD5_STEP0(MD5_Go, d, a, b, c, G_wac15, MD5S11); + MD5_STEP0(MD5_Go, c, d, a, b, G_wfc16, MD5S12); + MD5_STEP0(MD5_Go, b, c, d, a, G_w4c17, MD5S13); + MD5_STEP0(MD5_Go, a, b, c, d, G_w9c18, MD5S10); + MD5_STEP0(MD5_Go, d, a, b, c, G_wec19, MD5S11); + MD5_STEP0(MD5_Go, c, d, a, b, G_w3c1a, MD5S12); + MD5_STEP0(MD5_Go, b, c, d, a, G_w8c1b, MD5S13); + MD5_STEP0(MD5_Go, a, b, c, d, G_wdc1c, MD5S10); + MD5_STEP0(MD5_Go, d, a, b, c, G_w2c1d, MD5S11); + MD5_STEP0(MD5_Go, c, d, a, b, G_w7c1e, MD5S12); + MD5_STEP0(MD5_Go, b, c, d, a, G_wcc1f, MD5S13); + + MD5_STEP0(MD5_H1, a, b, c, d, H_w5c20, MD5S20); + MD5_STEP0(MD5_H2, d, a, b, c, H_w8c21, MD5S21); + MD5_STEP0(MD5_H1, c, d, a, b, H_wbc22, MD5S22); + MD5_STEP0(MD5_H2, b, c, d, a, H_wec23, MD5S23); + MD5_STEP0(MD5_H1, a, b, c, d, H_w1c24, MD5S20); + MD5_STEP0(MD5_H2, d, a, b, c, H_w4c25, MD5S21); + MD5_STEP0(MD5_H1, c, d, a, b, H_w7c26, MD5S22); + MD5_STEP0(MD5_H2, b, c, d, a, H_wac27, MD5S23); + MD5_STEP0(MD5_H1, a, b, c, d, H_wdc28, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w0, H_w0c29, MD5S21); + MD5_STEP0(MD5_H1, c, d, a, b, H_w3c2a, MD5S22); + + bool q_cond = allx (pre_c != c); + + if (q_cond) continue; + + MD5_STEP0(MD5_H2, b, c, d, a, H_w6c2b, MD5S23); + MD5_STEP0(MD5_H1, a, b, c, d, H_w9c2c, MD5S20); + MD5_STEP0(MD5_H2, d, a, b, c, H_wcc2d, MD5S21); + + bool q_cond2 = allx (pre_d != d); + + if (q_cond2) continue; + + MD5_STEP0(MD5_H1, c, d, a, b, H_wfc2e, MD5S22); + MD5_STEP0(MD5_H2, b, c, d, a, H_w2c2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0, I_w0c30, MD5S30); + MD5_STEP0(MD5_I , d, a, b, c, I_w7c31, MD5S31); + MD5_STEP0(MD5_I , c, d, a, b, I_wec32, MD5S32); + MD5_STEP0(MD5_I , b, c, d, a, I_w5c33, MD5S33); + MD5_STEP0(MD5_I , a, b, c, d, I_wcc34, MD5S30); + MD5_STEP0(MD5_I , d, a, b, c, I_w3c35, MD5S31); + MD5_STEP0(MD5_I , c, d, a, b, I_wac36, MD5S32); + MD5_STEP0(MD5_I , b, c, d, a, I_w1c37, MD5S33); + MD5_STEP0(MD5_I , a, b, c, d, I_w8c38, MD5S30); + MD5_STEP0(MD5_I , d, a, b, c, I_wfc39, MD5S31); + MD5_STEP0(MD5_I , c, d, a, b, I_w6c3a, MD5S32); + MD5_STEP0(MD5_I , b, c, d, a, I_wdc3b, MD5S33); + MD5_STEP0(MD5_I , a, b, c, d, I_w4c3c, MD5S30); + MD5_STEP0(MD5_I , d, a, b, c, I_wbc3d, MD5S31); + MD5_STEP0(MD5_I , c, d, a, b, I_w2c3e, MD5S32); + MD5_STEP0(MD5_I , b, c, d, a, I_w9c3f, MD5S33); + + + const u32x r0 = a; + const u32x r1 = d; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_S + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m00010_m04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global u32x * words_buf_r, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32 w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = 0; + w[ 5] = 0; + w[ 6] = 0; + w[ 7] = 0; + w[ 8] = 0; + w[ 9] = 0; + w[10] = 0; + w[11] = 0; + w[12] = 0; + w[13] = 0; + w[14] = pws[gid].i[14]; + w[15] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m00010m (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m00010_m08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global u32x * words_buf_r, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32 w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = pws[gid].i[ 4]; + w[ 5] = pws[gid].i[ 5]; + w[ 6] = pws[gid].i[ 6]; + w[ 7] = pws[gid].i[ 7]; + w[ 8] = 0; + w[ 9] = 0; + w[10] = 0; + w[11] = 0; + w[12] = 0; + w[13] = 0; + w[14] = pws[gid].i[14]; + w[15] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m00010m (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m00010_m16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global u32x * words_buf_r, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32 w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = pws[gid].i[ 4]; + w[ 5] = pws[gid].i[ 5]; + w[ 6] = pws[gid].i[ 6]; + w[ 7] = pws[gid].i[ 7]; + w[ 8] = pws[gid].i[ 8]; + w[ 9] = pws[gid].i[ 9]; + w[10] = pws[gid].i[10]; + w[11] = pws[gid].i[11]; + w[12] = pws[gid].i[12]; + w[13] = pws[gid].i[13]; + w[14] = pws[gid].i[14]; + w[15] = pws[gid].i[15]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m00010m (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m00010_s04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global u32x * words_buf_r, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32 w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = 0; + w[ 5] = 0; + w[ 6] = 0; + w[ 7] = 0; + w[ 8] = 0; + w[ 9] = 0; + w[10] = 0; + w[11] = 0; + w[12] = 0; + w[13] = 0; + w[14] = pws[gid].i[14]; + w[15] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m00010s (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m00010_s08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global u32x * words_buf_r, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32 w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = pws[gid].i[ 4]; + w[ 5] = pws[gid].i[ 5]; + w[ 6] = pws[gid].i[ 6]; + w[ 7] = pws[gid].i[ 7]; + w[ 8] = 0; + w[ 9] = 0; + w[10] = 0; + w[11] = 0; + w[12] = 0; + w[13] = 0; + w[14] = pws[gid].i[14]; + w[15] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m00010s (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m00010_s16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global u32x * words_buf_r, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32 w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = pws[gid].i[ 4]; + w[ 5] = pws[gid].i[ 5]; + w[ 6] = pws[gid].i[ 6]; + w[ 7] = pws[gid].i[ 7]; + w[ 8] = pws[gid].i[ 8]; + w[ 9] = pws[gid].i[ 9]; + w[10] = pws[gid].i[10]; + w[11] = pws[gid].i[11]; + w[12] = pws[gid].i[12]; + w[13] = pws[gid].i[13]; + w[14] = pws[gid].i[14]; + w[15] = pws[gid].i[15]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m00010s (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} diff --git a/amd/m00020_a0.cl b/amd/m00020_a0.cl new file mode 100644 index 0000000000..c0816a0081 --- /dev/null +++ b/amd/m00020_a0.cl @@ -0,0 +1,508 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _MD5_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW4 +#define VECT_SIZE4 +#endif + +#ifdef VLIW5 +#define VECT_SIZE4 +#endif + +#define DGST_R0 0 +#define DGST_R1 3 +#define DGST_R2 2 +#define DGST_R3 1 + +#include "include/kernel_functions.c" +#include "types_amd.c" +#include "common_amd.c" +#include "include/rp_gpu.h" +#include "rp_amd.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m00020_m04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + u32x pw_buf1[4]; + + pw_buf1[0] = pws[gid].i[ 4]; + pw_buf1[1] = pws[gid].i[ 5]; + pw_buf1[2] = pws[gid].i[ 6]; + pw_buf1[3] = pws[gid].i[ 7]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[7]; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + u32x w1[4]; + u32x w2[4]; + u32x w3[4]; + + w0[0] = pw_buf0[0]; + w0[1] = pw_buf0[1]; + w0[2] = pw_buf0[2]; + w0[3] = pw_buf0[3]; + w1[0] = pw_buf1[0]; + w1[1] = pw_buf1[1]; + w1[2] = pw_buf1[2]; + w1[3] = pw_buf1[3]; + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 out_len = apply_rules (rules_buf[il_pos].cmds, w0, w1, pw_len); + + /** + * prepend salt + */ + + const u32 out_salt_len = out_len + salt_len; + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + w0_t[0] = w0[0]; + w0_t[1] = w0[1]; + w0_t[2] = w0[2]; + w0_t[3] = w0[3]; + w1_t[0] = w1[0]; + w1_t[1] = w1[1]; + w1_t[2] = w1[2]; + w1_t[3] = w1[3]; + w2_t[0] = w2[0]; + w2_t[1] = w2[1]; + w2_t[2] = w2[2]; + w2_t[3] = w2[3]; + w3_t[0] = w3[0]; + w3_t[1] = w3[1]; + w3_t[2] = w3[2]; + w3_t[3] = w3[3]; + + switch_buffer_by_offset (w0_t, w1_t, w2_t, w3_t, salt_len); + + w0_t[0] |= salt_buf0[0]; + w0_t[1] |= salt_buf0[1]; + w0_t[2] |= salt_buf0[2]; + w0_t[3] |= salt_buf0[3]; + w1_t[0] |= salt_buf1[0]; + w1_t[1] |= salt_buf1[1]; + w1_t[2] |= salt_buf1[2]; + w1_t[3] |= salt_buf1[3]; + + append_0x80_4 (w0_t, w1_t, w2_t, w3_t, out_salt_len); + + w3_t[2] = out_salt_len * 8; + + /** + * md5 + */ + + u32x tmp2; + + u32x a = MD5M_A; + u32x b = MD5M_B; + u32x c = MD5M_C; + u32x d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0_t[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0_t[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0_t[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1_t[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1_t[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1_t[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2_t[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2_t[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2_t[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3_t[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3_t[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3_t[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0_t[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1_t[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2_t[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1_t[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1_t[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2_t[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3_t[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0_t[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2_t[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3_t[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0_t[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1_t[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3_t[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H1, a, b, c, d, w1_t[1], MD5C20, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w2_t[0], MD5C21, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w2_t[3], MD5C22, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w3_t[2], MD5C23, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w0_t[1], MD5C24, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w1_t[0], MD5C25, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w1_t[3], MD5C26, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w2_t[2], MD5C27, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w3_t[1], MD5C28, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w0_t[0], MD5C29, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w0_t[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w1_t[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w2_t[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w3_t[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w3_t[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w0_t[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1_t[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3_t[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3_t[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0_t[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0_t[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2_t[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1_t[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3_t[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1_t[0], MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w2_t[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0_t[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2_t[1], MD5C3f, MD5S33); + + + const u32x r0 = a; + const u32x r1 = d; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_M + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m00020_m08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m00020_m16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m00020_s04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + u32x pw_buf1[4]; + + pw_buf1[0] = pws[gid].i[ 4]; + pw_buf1[1] = pws[gid].i[ 5]; + pw_buf1[2] = pws[gid].i[ 6]; + pw_buf1[3] = pws[gid].i[ 7]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[7]; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + u32x w1[4]; + u32x w2[4]; + u32x w3[4]; + + w0[0] = pw_buf0[0]; + w0[1] = pw_buf0[1]; + w0[2] = pw_buf0[2]; + w0[3] = pw_buf0[3]; + w1[0] = pw_buf1[0]; + w1[1] = pw_buf1[1]; + w1[2] = pw_buf1[2]; + w1[3] = pw_buf1[3]; + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 out_len = apply_rules (rules_buf[il_pos].cmds, w0, w1, pw_len); + + /** + * prepend salt + */ + + const u32 out_salt_len = out_len + salt_len; + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + w0_t[0] = w0[0]; + w0_t[1] = w0[1]; + w0_t[2] = w0[2]; + w0_t[3] = w0[3]; + w1_t[0] = w1[0]; + w1_t[1] = w1[1]; + w1_t[2] = w1[2]; + w1_t[3] = w1[3]; + w2_t[0] = w2[0]; + w2_t[1] = w2[1]; + w2_t[2] = w2[2]; + w2_t[3] = w2[3]; + w3_t[0] = w3[0]; + w3_t[1] = w3[1]; + w3_t[2] = w3[2]; + w3_t[3] = w3[3]; + + switch_buffer_by_offset (w0_t, w1_t, w2_t, w3_t, salt_len); + + w0_t[0] |= salt_buf0[0]; + w0_t[1] |= salt_buf0[1]; + w0_t[2] |= salt_buf0[2]; + w0_t[3] |= salt_buf0[3]; + w1_t[0] |= salt_buf1[0]; + w1_t[1] |= salt_buf1[1]; + w1_t[2] |= salt_buf1[2]; + w1_t[3] |= salt_buf1[3]; + + append_0x80_4 (w0_t, w1_t, w2_t, w3_t, out_salt_len); + + w3_t[2] = out_salt_len * 8; + + /** + * md5 + */ + + u32x tmp2; + + u32x a = MD5M_A; + u32x b = MD5M_B; + u32x c = MD5M_C; + u32x d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0_t[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0_t[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0_t[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1_t[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1_t[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1_t[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2_t[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2_t[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2_t[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3_t[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3_t[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3_t[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0_t[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1_t[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2_t[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1_t[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1_t[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2_t[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3_t[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0_t[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2_t[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3_t[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0_t[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1_t[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3_t[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H1, a, b, c, d, w1_t[1], MD5C20, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w2_t[0], MD5C21, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w2_t[3], MD5C22, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w3_t[2], MD5C23, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w0_t[1], MD5C24, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w1_t[0], MD5C25, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w1_t[3], MD5C26, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w2_t[2], MD5C27, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w3_t[1], MD5C28, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w0_t[0], MD5C29, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w0_t[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w1_t[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w2_t[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w3_t[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w3_t[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w0_t[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1_t[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3_t[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3_t[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0_t[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0_t[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2_t[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1_t[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3_t[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1_t[0], MD5C3c, MD5S30); + + bool q_cond = allx (search[0] != a); + + if (q_cond) continue; + + MD5_STEP (MD5_I , d, a, b, c, w2_t[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0_t[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2_t[1], MD5C3f, MD5S33); + + + const u32x r0 = a; + const u32x r1 = d; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_S + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m00020_s08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m00020_s16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/amd/m00020_a1.cl b/amd/m00020_a1.cl new file mode 100644 index 0000000000..6f433c846b --- /dev/null +++ b/amd/m00020_a1.cl @@ -0,0 +1,604 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _MD5_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW4 +#define VECT_SIZE4 +#endif + +#ifdef VLIW5 +#define VECT_SIZE4 +#endif + +#define DGST_R0 0 +#define DGST_R1 3 +#define DGST_R2 2 +#define DGST_R3 1 + +#include "include/kernel_functions.c" +#include "types_amd.c" +#include "common_amd.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m00020_m04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, combs_buf[0].pw_len); + } + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[7]; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = combs_buf[il_pos].pw_len; + + const u32 pw_len = pw_l_len + pw_r_len; + + u32 wordr0[4]; + u32 wordr1[4]; + u32 wordr2[4]; + u32 wordr3[4]; + + wordr0[0] = combs_buf[il_pos].i[0]; + wordr0[1] = combs_buf[il_pos].i[1]; + wordr0[2] = combs_buf[il_pos].i[2]; + wordr0[3] = combs_buf[il_pos].i[3]; + wordr1[0] = combs_buf[il_pos].i[4]; + wordr1[1] = combs_buf[il_pos].i[5]; + wordr1[2] = combs_buf[il_pos].i[6]; + wordr1[3] = combs_buf[il_pos].i[7]; + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + u32x w0[4]; + u32x w1[4]; + u32x w2[4]; + u32x w3[4]; + + w0[0] = wordl0[0] | wordr0[0]; + w0[1] = wordl0[1] | wordr0[1]; + w0[2] = wordl0[2] | wordr0[2]; + w0[3] = wordl0[3] | wordr0[3]; + w1[0] = wordl1[0] | wordr1[0]; + w1[1] = wordl1[1] | wordr1[1]; + w1[2] = wordl1[2] | wordr1[2]; + w1[3] = wordl1[3] | wordr1[3]; + w2[0] = wordl2[0] | wordr2[0]; + w2[1] = wordl2[1] | wordr2[1]; + w2[2] = wordl2[2] | wordr2[2]; + w2[3] = wordl2[3] | wordr2[3]; + w3[0] = wordl3[0] | wordr3[0]; + w3[1] = wordl3[1] | wordr3[1]; + w3[2] = wordl3[2] | wordr3[2]; + w3[3] = wordl3[3] | wordr3[3]; + + /** + * prepend salt + */ + + const u32 pw_salt_len = pw_len + salt_len; + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + w0_t[0] = w0[0]; + w0_t[1] = w0[1]; + w0_t[2] = w0[2]; + w0_t[3] = w0[3]; + w1_t[0] = w1[0]; + w1_t[1] = w1[1]; + w1_t[2] = w1[2]; + w1_t[3] = w1[3]; + w2_t[0] = w2[0]; + w2_t[1] = w2[1]; + w2_t[2] = w2[2]; + w2_t[3] = w2[3]; + w3_t[0] = w3[0]; + w3_t[1] = w3[1]; + w3_t[2] = w3[2]; + w3_t[3] = w3[3]; + + switch_buffer_by_offset (w0_t, w1_t, w2_t, w3_t, salt_len); + + w0_t[0] |= salt_buf0[0]; + w0_t[1] |= salt_buf0[1]; + w0_t[2] |= salt_buf0[2]; + w0_t[3] |= salt_buf0[3]; + w1_t[0] |= salt_buf1[0]; + w1_t[1] |= salt_buf1[1]; + w1_t[2] |= salt_buf1[2]; + w1_t[3] |= salt_buf1[3]; + + append_0x80_4 (w0_t, w1_t, w2_t, w3_t, pw_salt_len); + + w3_t[2] = pw_salt_len * 8; + + /** + * md5 + */ + + u32x tmp2; + + u32x a = MD5M_A; + u32x b = MD5M_B; + u32x c = MD5M_C; + u32x d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0_t[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0_t[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0_t[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1_t[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1_t[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1_t[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2_t[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2_t[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2_t[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3_t[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3_t[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3_t[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0_t[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1_t[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2_t[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1_t[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1_t[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2_t[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3_t[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0_t[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2_t[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3_t[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0_t[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1_t[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3_t[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H1, a, b, c, d, w1_t[1], MD5C20, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w2_t[0], MD5C21, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w2_t[3], MD5C22, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w3_t[2], MD5C23, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w0_t[1], MD5C24, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w1_t[0], MD5C25, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w1_t[3], MD5C26, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w2_t[2], MD5C27, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w3_t[1], MD5C28, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w0_t[0], MD5C29, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w0_t[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w1_t[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w2_t[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w3_t[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w3_t[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w0_t[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1_t[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3_t[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3_t[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0_t[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0_t[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2_t[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1_t[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3_t[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1_t[0], MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w2_t[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0_t[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2_t[1], MD5C3f, MD5S33); + + + const u32x r0 = a; + const u32x r1 = d; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_M + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m00020_m08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m00020_m16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m00020_s04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, combs_buf[0].pw_len); + } + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[7]; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = combs_buf[il_pos].pw_len; + + const u32 pw_len = pw_l_len + pw_r_len; + + u32 wordr0[4]; + u32 wordr1[4]; + u32 wordr2[4]; + u32 wordr3[4]; + + wordr0[0] = combs_buf[il_pos].i[0]; + wordr0[1] = combs_buf[il_pos].i[1]; + wordr0[2] = combs_buf[il_pos].i[2]; + wordr0[3] = combs_buf[il_pos].i[3]; + wordr1[0] = combs_buf[il_pos].i[4]; + wordr1[1] = combs_buf[il_pos].i[5]; + wordr1[2] = combs_buf[il_pos].i[6]; + wordr1[3] = combs_buf[il_pos].i[7]; + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + u32x w0[4]; + u32x w1[4]; + u32x w2[4]; + u32x w3[4]; + + w0[0] = wordl0[0] | wordr0[0]; + w0[1] = wordl0[1] | wordr0[1]; + w0[2] = wordl0[2] | wordr0[2]; + w0[3] = wordl0[3] | wordr0[3]; + w1[0] = wordl1[0] | wordr1[0]; + w1[1] = wordl1[1] | wordr1[1]; + w1[2] = wordl1[2] | wordr1[2]; + w1[3] = wordl1[3] | wordr1[3]; + w2[0] = wordl2[0] | wordr2[0]; + w2[1] = wordl2[1] | wordr2[1]; + w2[2] = wordl2[2] | wordr2[2]; + w2[3] = wordl2[3] | wordr2[3]; + w3[0] = wordl3[0] | wordr3[0]; + w3[1] = wordl3[1] | wordr3[1]; + w3[2] = wordl3[2] | wordr3[2]; + w3[3] = wordl3[3] | wordr3[3]; + + /** + * prepend salt + */ + + const u32 pw_salt_len = pw_len + salt_len; + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + w0_t[0] = w0[0]; + w0_t[1] = w0[1]; + w0_t[2] = w0[2]; + w0_t[3] = w0[3]; + w1_t[0] = w1[0]; + w1_t[1] = w1[1]; + w1_t[2] = w1[2]; + w1_t[3] = w1[3]; + w2_t[0] = w2[0]; + w2_t[1] = w2[1]; + w2_t[2] = w2[2]; + w2_t[3] = w2[3]; + w3_t[0] = w3[0]; + w3_t[1] = w3[1]; + w3_t[2] = w3[2]; + w3_t[3] = w3[3]; + + switch_buffer_by_offset (w0_t, w1_t, w2_t, w3_t, salt_len); + + w3_t[2] = pw_salt_len * 8; + + w0_t[0] |= salt_buf0[0]; + w0_t[1] |= salt_buf0[1]; + w0_t[2] |= salt_buf0[2]; + w0_t[3] |= salt_buf0[3]; + w1_t[0] |= salt_buf1[0]; + w1_t[1] |= salt_buf1[1]; + w1_t[2] |= salt_buf1[2]; + w1_t[3] |= salt_buf1[3]; + + append_0x80_4 (w0_t, w1_t, w2_t, w3_t, pw_salt_len); + + w3_t[2] = pw_salt_len * 8; + + /** + * md5 + */ + + u32x tmp2; + + u32x a = MD5M_A; + u32x b = MD5M_B; + u32x c = MD5M_C; + u32x d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0_t[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0_t[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0_t[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1_t[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1_t[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1_t[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2_t[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2_t[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2_t[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3_t[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3_t[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3_t[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0_t[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1_t[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2_t[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1_t[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1_t[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2_t[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3_t[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0_t[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2_t[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3_t[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0_t[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1_t[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3_t[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H1, a, b, c, d, w1_t[1], MD5C20, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w2_t[0], MD5C21, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w2_t[3], MD5C22, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w3_t[2], MD5C23, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w0_t[1], MD5C24, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w1_t[0], MD5C25, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w1_t[3], MD5C26, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w2_t[2], MD5C27, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w3_t[1], MD5C28, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w0_t[0], MD5C29, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w0_t[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w1_t[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w2_t[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w3_t[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w3_t[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w0_t[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1_t[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3_t[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3_t[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0_t[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0_t[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2_t[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1_t[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3_t[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1_t[0], MD5C3c, MD5S30); + + bool q_cond = allx (search[0] != a); + + if (q_cond) continue; + + MD5_STEP (MD5_I , d, a, b, c, w2_t[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0_t[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2_t[1], MD5C3f, MD5S33); + + + const u32x r0 = a; + const u32x r1 = d; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_S + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m00020_s08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m00020_s16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/amd/m00020_a3.cl b/amd/m00020_a3.cl new file mode 100644 index 0000000000..8d1e4b7a5c --- /dev/null +++ b/amd/m00020_a3.cl @@ -0,0 +1,730 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _MD5_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW4 +#define VECT_SIZE4 +#endif + +#ifdef VLIW5 +#define VECT_SIZE4 +#endif + +#define DGST_R0 0 +#define DGST_R1 3 +#define DGST_R2 2 +#define DGST_R3 1 + +#include "include/kernel_functions.c" +#include "types_amd.c" +#include "common_amd.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +static void m00020m (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], const u32 pw_len, __global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset) +{ + /** + * modifier + */ + + const u32 gid = get_global_id (0); + const u32 lid = get_local_id (0); + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[ 1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[ 2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[ 3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[ 4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[ 5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[ 6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[ 7]; + + u32 salt_buf2[4]; + + salt_buf2[0] = 0; + salt_buf2[1] = 0; + salt_buf2[2] = 0; + salt_buf2[3] = 0; + + u32 salt_buf3[4]; + + salt_buf3[0] = 0; + salt_buf3[1] = 0; + salt_buf3[2] = 0; + salt_buf3[3] = 0; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + const u32 pw_salt_len = pw_len + salt_len; + + /** + * loop + */ + + u32x w0l = w0[0]; + + for (u32 il_pos = 0; il_pos < bfs_cnt; il_pos++) + { + const u32 w0r = bfs_buf[il_pos].i; + + w0[0] = w0l | w0r; + + /** + * prepend salt + */ + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + w0_t[0] = w0[0]; + w0_t[1] = w0[1]; + w0_t[2] = w0[2]; + w0_t[3] = w0[3]; + w1_t[0] = w1[0]; + w1_t[1] = w1[1]; + w1_t[2] = w1[2]; + w1_t[3] = w1[3]; + w2_t[0] = w2[0]; + w2_t[1] = w2[1]; + w2_t[2] = w2[2]; + w2_t[3] = w2[3]; + w3_t[0] = w3[0]; + w3_t[1] = w3[1]; + w3_t[2] = w3[2]; + w3_t[3] = w3[3]; + + switch_buffer_by_offset (w0_t, w1_t, w2_t, w3_t, salt_len); + + w3_t[2] = pw_salt_len * 8; + + w0_t[0] |= salt_buf0[0]; + w0_t[1] |= salt_buf0[1]; + w0_t[2] |= salt_buf0[2]; + w0_t[3] |= salt_buf0[3]; + w1_t[0] |= salt_buf1[0]; + w1_t[1] |= salt_buf1[1]; + w1_t[2] |= salt_buf1[2]; + w1_t[3] |= salt_buf1[3]; + w2_t[0] |= salt_buf2[0]; + w2_t[1] |= salt_buf2[1]; + w2_t[2] |= salt_buf2[2]; + w2_t[3] |= salt_buf2[3]; + w3_t[0] |= salt_buf3[0]; + w3_t[1] |= salt_buf3[1]; + w3_t[2] |= salt_buf3[2]; + w3_t[3] |= salt_buf3[3]; + + /** + * md5 + */ + + u32x tmp2; + + u32x a = MD5M_A; + u32x b = MD5M_B; + u32x c = MD5M_C; + u32x d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0_t[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0_t[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0_t[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1_t[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1_t[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1_t[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2_t[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2_t[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2_t[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3_t[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3_t[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3_t[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0_t[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1_t[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2_t[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1_t[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1_t[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2_t[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3_t[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0_t[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2_t[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3_t[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0_t[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1_t[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3_t[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H1, a, b, c, d, w1_t[1], MD5C20, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w2_t[0], MD5C21, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w2_t[3], MD5C22, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w3_t[2], MD5C23, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w0_t[1], MD5C24, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w1_t[0], MD5C25, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w1_t[3], MD5C26, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w2_t[2], MD5C27, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w3_t[1], MD5C28, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w0_t[0], MD5C29, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w0_t[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w1_t[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w2_t[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w3_t[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w3_t[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w0_t[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1_t[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3_t[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3_t[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0_t[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0_t[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2_t[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1_t[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3_t[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1_t[0], MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w2_t[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0_t[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2_t[1], MD5C3f, MD5S33); + + + const u32x r0 = a; + const u32x r1 = d; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_M + } +} + +static void m00020s (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], const u32 pw_len, __global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset) +{ + /** + * modifier + */ + + const u32 gid = get_global_id (0); + const u32 lid = get_local_id (0); + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[ 1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[ 2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[ 3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[ 4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[ 5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[ 6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[ 7]; + + u32 salt_buf2[4]; + + salt_buf2[0] = 0; + salt_buf2[1] = 0; + salt_buf2[2] = 0; + salt_buf2[3] = 0; + + u32 salt_buf3[4]; + + salt_buf3[0] = 0; + salt_buf3[1] = 0; + salt_buf3[2] = 0; + salt_buf3[3] = 0; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + const u32 pw_salt_len = pw_len + salt_len; + + /** + * loop + */ + + u32x w0l = w0[0]; + + for (u32 il_pos = 0; il_pos < bfs_cnt; il_pos++) + { + const u32 w0r = bfs_buf[il_pos].i; + + w0[0] = w0l | w0r; + + /** + * prepend salt + */ + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + w0_t[0] = w0[0]; + w0_t[1] = w0[1]; + w0_t[2] = w0[2]; + w0_t[3] = w0[3]; + w1_t[0] = w1[0]; + w1_t[1] = w1[1]; + w1_t[2] = w1[2]; + w1_t[3] = w1[3]; + w2_t[0] = w2[0]; + w2_t[1] = w2[1]; + w2_t[2] = w2[2]; + w2_t[3] = w2[3]; + w3_t[0] = w3[0]; + w3_t[1] = w3[1]; + w3_t[2] = w3[2]; + w3_t[3] = w3[3]; + + switch_buffer_by_offset (w0_t, w1_t, w2_t, w3_t, salt_len); + + w3_t[2] = pw_salt_len * 8; + + w0_t[0] |= salt_buf0[0]; + w0_t[1] |= salt_buf0[1]; + w0_t[2] |= salt_buf0[2]; + w0_t[3] |= salt_buf0[3]; + w1_t[0] |= salt_buf1[0]; + w1_t[1] |= salt_buf1[1]; + w1_t[2] |= salt_buf1[2]; + w1_t[3] |= salt_buf1[3]; + w2_t[0] |= salt_buf2[0]; + w2_t[1] |= salt_buf2[1]; + w2_t[2] |= salt_buf2[2]; + w2_t[3] |= salt_buf2[3]; + w3_t[0] |= salt_buf3[0]; + w3_t[1] |= salt_buf3[1]; + w3_t[2] |= salt_buf3[2]; + w3_t[3] |= salt_buf3[3]; + + /** + * md5 + */ + + u32x tmp2; + + u32x a = MD5M_A; + u32x b = MD5M_B; + u32x c = MD5M_C; + u32x d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0_t[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0_t[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0_t[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1_t[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1_t[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1_t[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2_t[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2_t[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2_t[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3_t[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3_t[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3_t[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0_t[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1_t[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2_t[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1_t[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1_t[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2_t[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3_t[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0_t[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2_t[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3_t[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0_t[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1_t[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3_t[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H1, a, b, c, d, w1_t[1], MD5C20, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w2_t[0], MD5C21, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w2_t[3], MD5C22, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w3_t[2], MD5C23, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w0_t[1], MD5C24, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w1_t[0], MD5C25, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w1_t[3], MD5C26, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w2_t[2], MD5C27, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w3_t[1], MD5C28, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w0_t[0], MD5C29, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w0_t[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w1_t[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w2_t[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w3_t[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w3_t[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w0_t[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1_t[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3_t[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3_t[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0_t[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0_t[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2_t[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1_t[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3_t[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1_t[0], MD5C3c, MD5S30); + + bool q_cond = allx (search[0] != a); + + if (q_cond) continue; + + MD5_STEP (MD5_I , d, a, b, c, w2_t[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0_t[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2_t[1], MD5C3f, MD5S33); + + + const u32x r0 = a; + const u32x r1 = d; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_S + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m00020_m04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m00020m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m00020_m08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m00020m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m00020_m16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = pws[gid].i[ 8]; + w2[1] = pws[gid].i[ 9]; + w2[2] = pws[gid].i[10]; + w2[3] = pws[gid].i[11]; + + u32x w3[4]; + + w3[0] = pws[gid].i[12]; + w3[1] = pws[gid].i[13]; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m00020m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m00020_s04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m00020s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m00020_s08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m00020s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m00020_s16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = pws[gid].i[ 8]; + w2[1] = pws[gid].i[ 9]; + w2[2] = pws[gid].i[10]; + w2[3] = pws[gid].i[11]; + + u32x w3[4]; + + w3[0] = pws[gid].i[12]; + w3[1] = pws[gid].i[13]; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m00020s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} diff --git a/amd/m00030_a0.cl b/amd/m00030_a0.cl new file mode 100644 index 0000000000..6a593beb35 --- /dev/null +++ b/amd/m00030_a0.cl @@ -0,0 +1,562 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _MD5_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW4 +#define VECT_SIZE4 +#endif + +#ifdef VLIW5 +#define VECT_SIZE4 +#endif + +#define DGST_R0 0 +#define DGST_R1 3 +#define DGST_R2 2 +#define DGST_R3 1 + +#include "include/kernel_functions.c" +#include "types_amd.c" +#include "common_amd.c" +#include "include/rp_gpu.h" +#include "rp_amd.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +// no unicode yet + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m00030_m04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + u32x pw_buf1[4]; + + pw_buf1[0] = pws[gid].i[ 4]; + pw_buf1[1] = pws[gid].i[ 5]; + pw_buf1[2] = pws[gid].i[ 6]; + pw_buf1[3] = pws[gid].i[ 7]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[7]; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + + w0[0] = pw_buf0[0]; + w0[1] = pw_buf0[1]; + w0[2] = pw_buf0[2]; + w0[3] = pw_buf0[3]; + + u32x w1[4]; + + w1[0] = pw_buf1[0]; + w1[1] = pw_buf1[1]; + w1[2] = pw_buf1[2]; + w1[3] = pw_buf1[3]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 out_len = apply_rules (rules_buf[il_pos].cmds, w0, w1, pw_len); + + /** + * append salt + */ + + u32 s0[4]; + + s0[0] = salt_buf0[0]; + s0[1] = salt_buf0[1]; + s0[2] = salt_buf0[2]; + s0[3] = salt_buf0[3]; + + u32 s1[4]; + + s1[0] = salt_buf1[0]; + s1[1] = salt_buf1[1]; + s1[2] = salt_buf1[2]; + s1[3] = salt_buf1[3]; + + u32 s2[4]; + + s2[0] = 0; + s2[1] = 0; + s2[2] = 0; + s2[3] = 0; + + u32 s3[4]; + + s3[0] = 0; + s3[1] = 0; + s3[2] = 0; + s3[3] = 0; + + switch_buffer_by_offset (s0, s1, s2, s3, (out_len * 2)); + + const u32 out_salt_len = (out_len * 2) + salt_len; + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + make_unicode (w0, w0_t, w1_t); + make_unicode (w1, w2_t, w3_t); + + w0_t[0] |= s0[0]; + w0_t[1] |= s0[1]; + w0_t[2] |= s0[2]; + w0_t[3] |= s0[3]; + w1_t[0] |= s1[0]; + w1_t[1] |= s1[1]; + w1_t[2] |= s1[2]; + w1_t[3] |= s1[3]; + w2_t[0] |= s2[0]; + w2_t[1] |= s2[1]; + w2_t[2] |= s2[2]; + w2_t[3] |= s2[3]; + w3_t[0] |= s3[0]; + w3_t[1] |= s3[1]; + w3_t[2] |= s3[2]; + w3_t[3] |= s3[3]; + + append_0x80_4 (w0_t, w1_t, w2_t, w3_t, out_salt_len); + + w3_t[2] = out_salt_len * 8; + + /** + * md5 + */ + + u32x a = MD5M_A; + u32x b = MD5M_B; + u32x c = MD5M_C; + u32x d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0_t[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0_t[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0_t[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1_t[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1_t[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1_t[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2_t[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2_t[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2_t[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3_t[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3_t[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3_t[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0_t[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1_t[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2_t[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1_t[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1_t[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2_t[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3_t[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0_t[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2_t[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3_t[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0_t[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1_t[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3_t[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H , a, b, c, d, w1_t[1], MD5C20, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w2_t[0], MD5C21, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w2_t[3], MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w3_t[2], MD5C23, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w0_t[1], MD5C24, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w1_t[0], MD5C25, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w1_t[3], MD5C26, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w2_t[2], MD5C27, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w3_t[1], MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w0_t[0], MD5C29, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w0_t[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w1_t[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w2_t[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w3_t[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w3_t[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w0_t[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1_t[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3_t[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3_t[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0_t[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0_t[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2_t[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1_t[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3_t[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1_t[0], MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w2_t[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0_t[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2_t[1], MD5C3f, MD5S33); + + + const u32x r0 = a; + const u32x r1 = d; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_M + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m00030_m08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m00030_m16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m00030_s04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + u32x pw_buf1[4]; + + pw_buf1[0] = pws[gid].i[ 4]; + pw_buf1[1] = pws[gid].i[ 5]; + pw_buf1[2] = pws[gid].i[ 6]; + pw_buf1[3] = pws[gid].i[ 7]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[7]; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + + w0[0] = pw_buf0[0]; + w0[1] = pw_buf0[1]; + w0[2] = pw_buf0[2]; + w0[3] = pw_buf0[3]; + + u32x w1[4]; + + w1[0] = pw_buf1[0]; + w1[1] = pw_buf1[1]; + w1[2] = pw_buf1[2]; + w1[3] = pw_buf1[3]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 out_len = apply_rules (rules_buf[il_pos].cmds, w0, w1, pw_len); + + /** + * append salt + */ + + u32 s0[4]; + + s0[0] = salt_buf0[0]; + s0[1] = salt_buf0[1]; + s0[2] = salt_buf0[2]; + s0[3] = salt_buf0[3]; + + u32 s1[4]; + + s1[0] = salt_buf1[0]; + s1[1] = salt_buf1[1]; + s1[2] = salt_buf1[2]; + s1[3] = salt_buf1[3]; + + u32 s2[4]; + + s2[0] = 0; + s2[1] = 0; + s2[2] = 0; + s2[3] = 0; + + u32 s3[4]; + + s3[0] = 0; + s3[1] = 0; + s3[2] = 0; + s3[3] = 0; + + switch_buffer_by_offset (s0, s1, s2, s3, (out_len * 2)); + + const u32 out_salt_len = (out_len * 2) + salt_len; + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + make_unicode (w0, w0_t, w1_t); + make_unicode (w1, w2_t, w3_t); + + w0_t[0] |= s0[0]; + w0_t[1] |= s0[1]; + w0_t[2] |= s0[2]; + w0_t[3] |= s0[3]; + w1_t[0] |= s1[0]; + w1_t[1] |= s1[1]; + w1_t[2] |= s1[2]; + w1_t[3] |= s1[3]; + w2_t[0] |= s2[0]; + w2_t[1] |= s2[1]; + w2_t[2] |= s2[2]; + w2_t[3] |= s2[3]; + w3_t[0] |= s3[0]; + w3_t[1] |= s3[1]; + w3_t[2] |= s3[2]; + w3_t[3] |= s3[3]; + + append_0x80_4 (w0_t, w1_t, w2_t, w3_t, out_salt_len); + + w3_t[2] = out_salt_len * 8; + + /** + * md5 + */ + + u32x a = MD5M_A; + u32x b = MD5M_B; + u32x c = MD5M_C; + u32x d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0_t[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0_t[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0_t[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1_t[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1_t[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1_t[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2_t[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2_t[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2_t[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3_t[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3_t[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3_t[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0_t[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1_t[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2_t[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1_t[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1_t[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2_t[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3_t[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0_t[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2_t[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3_t[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0_t[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1_t[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3_t[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H , a, b, c, d, w1_t[1], MD5C20, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w2_t[0], MD5C21, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w2_t[3], MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w3_t[2], MD5C23, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w0_t[1], MD5C24, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w1_t[0], MD5C25, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w1_t[3], MD5C26, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w2_t[2], MD5C27, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w3_t[1], MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w0_t[0], MD5C29, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w0_t[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w1_t[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w2_t[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w3_t[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w3_t[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w0_t[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1_t[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3_t[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3_t[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0_t[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0_t[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2_t[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1_t[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3_t[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1_t[0], MD5C3c, MD5S30); + + bool q_cond = allx (search[0] != a); + + if (q_cond) continue; + + MD5_STEP (MD5_I , d, a, b, c, w2_t[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0_t[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2_t[1], MD5C3f, MD5S33); + + + const u32x r0 = a; + const u32x r1 = d; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_S + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m00030_s08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m00030_s16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/amd/m00030_a1.cl b/amd/m00030_a1.cl new file mode 100644 index 0000000000..4abf699b37 --- /dev/null +++ b/amd/m00030_a1.cl @@ -0,0 +1,656 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _MD5_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW4 +#define VECT_SIZE4 +#endif + +#ifdef VLIW5 +#define VECT_SIZE4 +#endif + +#define DGST_R0 0 +#define DGST_R1 3 +#define DGST_R2 2 +#define DGST_R3 1 + +#include "include/kernel_functions.c" +#include "types_amd.c" +#include "common_amd.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +// no unicode yet + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m00030_m04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, combs_buf[0].pw_len); + } + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[7]; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = combs_buf[il_pos].pw_len; + + const u32 pw_len = pw_l_len + pw_r_len; + + u32 wordr0[4]; + + wordr0[0] = combs_buf[il_pos].i[0]; + wordr0[1] = combs_buf[il_pos].i[1]; + wordr0[2] = combs_buf[il_pos].i[2]; + wordr0[3] = combs_buf[il_pos].i[3]; + + u32 wordr1[4]; + + wordr1[0] = combs_buf[il_pos].i[4]; + wordr1[1] = combs_buf[il_pos].i[5]; + wordr1[2] = combs_buf[il_pos].i[6]; + wordr1[3] = combs_buf[il_pos].i[7]; + + u32 wordr2[4]; + + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + + u32 wordr3[4]; + + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + /** + * append salt + */ + + u32 s0[4]; + + s0[0] = salt_buf0[0]; + s0[1] = salt_buf0[1]; + s0[2] = salt_buf0[2]; + s0[3] = salt_buf0[3]; + + u32 s1[4]; + + s1[0] = salt_buf1[0]; + s1[1] = salt_buf1[1]; + s1[2] = salt_buf1[2]; + s1[3] = salt_buf1[3]; + + u32 s2[4]; + + s2[0] = 0; + s2[1] = 0; + s2[2] = 0; + s2[3] = 0; + + u32 s3[4]; + + s3[0] = 0; + s3[1] = 0; + s3[2] = 0; + s3[3] = 0; + + switch_buffer_by_offset (s0, s1, s2, s3, (pw_len * 2)); + + const u32 pw_salt_len = (pw_len * 2) + salt_len; + + u32x w0[4]; + u32x w1[4]; + u32x w2[4]; + u32x w3[4]; + + w0[0] = wordl0[0] | wordr0[0]; + w0[1] = wordl0[1] | wordr0[1]; + w0[2] = wordl0[2] | wordr0[2]; + w0[3] = wordl0[3] | wordr0[3]; + w1[0] = wordl1[0] | wordr1[0]; + w1[1] = wordl1[1] | wordr1[1]; + w1[2] = wordl1[2] | wordr1[2]; + w1[3] = wordl1[3] | wordr1[3]; + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + make_unicode (w0, w0_t, w1_t); + make_unicode (w1, w2_t, w3_t); + + w0_t[0] |= s0[0]; + w0_t[1] |= s0[1]; + w0_t[2] |= s0[2]; + w0_t[3] |= s0[3]; + w1_t[0] |= s1[0]; + w1_t[1] |= s1[1]; + w1_t[2] |= s1[2]; + w1_t[3] |= s1[3]; + w2_t[0] |= s2[0]; + w2_t[1] |= s2[1]; + w2_t[2] |= s2[2]; + w2_t[3] |= s2[3]; + w3_t[0] |= s3[0]; + w3_t[1] |= s3[1]; + w3_t[2] |= s3[2]; + w3_t[3] |= s3[3]; + + append_0x80_4 (w0_t, w1_t, w2_t, w3_t, pw_salt_len); + + w3_t[2] = pw_salt_len * 8; + + /** + * md5 + */ + + u32x a = MD5M_A; + u32x b = MD5M_B; + u32x c = MD5M_C; + u32x d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0_t[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0_t[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0_t[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1_t[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1_t[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1_t[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2_t[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2_t[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2_t[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3_t[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3_t[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3_t[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0_t[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1_t[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2_t[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1_t[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1_t[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2_t[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3_t[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0_t[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2_t[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3_t[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0_t[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1_t[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3_t[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H , a, b, c, d, w1_t[1], MD5C20, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w2_t[0], MD5C21, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w2_t[3], MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w3_t[2], MD5C23, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w0_t[1], MD5C24, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w1_t[0], MD5C25, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w1_t[3], MD5C26, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w2_t[2], MD5C27, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w3_t[1], MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w0_t[0], MD5C29, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w0_t[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w1_t[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w2_t[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w3_t[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w3_t[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w0_t[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1_t[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3_t[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3_t[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0_t[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0_t[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2_t[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1_t[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3_t[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1_t[0], MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w2_t[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0_t[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2_t[1], MD5C3f, MD5S33); + + + const u32x r0 = a; + const u32x r1 = d; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_M + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m00030_m08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m00030_m16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m00030_s04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, combs_buf[0].pw_len); + } + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[7]; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = combs_buf[il_pos].pw_len; + + const u32 pw_len = pw_l_len + pw_r_len; + + u32 wordr0[4]; + + wordr0[0] = combs_buf[il_pos].i[0]; + wordr0[1] = combs_buf[il_pos].i[1]; + wordr0[2] = combs_buf[il_pos].i[2]; + wordr0[3] = combs_buf[il_pos].i[3]; + + u32 wordr1[4]; + + wordr1[0] = combs_buf[il_pos].i[4]; + wordr1[1] = combs_buf[il_pos].i[5]; + wordr1[2] = combs_buf[il_pos].i[6]; + wordr1[3] = combs_buf[il_pos].i[7]; + + u32 wordr2[4]; + + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + + u32 wordr3[4]; + + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + /** + * append salt + */ + + u32 s0[4]; + + s0[0] = salt_buf0[0]; + s0[1] = salt_buf0[1]; + s0[2] = salt_buf0[2]; + s0[3] = salt_buf0[3]; + + u32 s1[4]; + + s1[0] = salt_buf1[0]; + s1[1] = salt_buf1[1]; + s1[2] = salt_buf1[2]; + s1[3] = salt_buf1[3]; + + u32 s2[4]; + + s2[0] = 0; + s2[1] = 0; + s2[2] = 0; + s2[3] = 0; + + u32 s3[4]; + + s3[0] = 0; + s3[1] = 0; + s3[2] = 0; + s3[3] = 0; + + switch_buffer_by_offset (s0, s1, s2, s3, (pw_len * 2)); + + const u32 pw_salt_len = (pw_len * 2) + salt_len; + + u32x w0[4]; + u32x w1[4]; + u32x w2[4]; + u32x w3[4]; + + w0[0] = wordl0[0] | wordr0[0]; + w0[1] = wordl0[1] | wordr0[1]; + w0[2] = wordl0[2] | wordr0[2]; + w0[3] = wordl0[3] | wordr0[3]; + w1[0] = wordl1[0] | wordr1[0]; + w1[1] = wordl1[1] | wordr1[1]; + w1[2] = wordl1[2] | wordr1[2]; + w1[3] = wordl1[3] | wordr1[3]; + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + make_unicode (w0, w0_t, w1_t); + make_unicode (w1, w2_t, w3_t); + + w0_t[0] |= s0[0]; + w0_t[1] |= s0[1]; + w0_t[2] |= s0[2]; + w0_t[3] |= s0[3]; + w1_t[0] |= s1[0]; + w1_t[1] |= s1[1]; + w1_t[2] |= s1[2]; + w1_t[3] |= s1[3]; + w2_t[0] |= s2[0]; + w2_t[1] |= s2[1]; + w2_t[2] |= s2[2]; + w2_t[3] |= s2[3]; + w3_t[0] |= s3[0]; + w3_t[1] |= s3[1]; + w3_t[2] |= s3[2]; + w3_t[3] |= s3[3]; + + append_0x80_4 (w0_t, w1_t, w2_t, w3_t, pw_salt_len); + + w3_t[2] = pw_salt_len * 8; + + /** + * md5 + */ + + u32x a = MD5M_A; + u32x b = MD5M_B; + u32x c = MD5M_C; + u32x d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0_t[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0_t[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0_t[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1_t[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1_t[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1_t[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2_t[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2_t[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2_t[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3_t[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3_t[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3_t[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0_t[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1_t[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2_t[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1_t[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1_t[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2_t[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3_t[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0_t[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2_t[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3_t[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0_t[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1_t[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3_t[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H , a, b, c, d, w1_t[1], MD5C20, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w2_t[0], MD5C21, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w2_t[3], MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w3_t[2], MD5C23, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w0_t[1], MD5C24, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w1_t[0], MD5C25, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w1_t[3], MD5C26, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w2_t[2], MD5C27, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w3_t[1], MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w0_t[0], MD5C29, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w0_t[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w1_t[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w2_t[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w3_t[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w3_t[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w0_t[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1_t[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3_t[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3_t[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0_t[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0_t[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2_t[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1_t[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3_t[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1_t[0], MD5C3c, MD5S30); + + bool q_cond = allx (search[0] != a); + + if (q_cond) continue; + + MD5_STEP (MD5_I , d, a, b, c, w2_t[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0_t[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2_t[1], MD5C3f, MD5S33); + + + const u32x r0 = a; + const u32x r1 = d; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_S + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m00030_s08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m00030_s16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/amd/m00030_a3.cl b/amd/m00030_a3.cl new file mode 100644 index 0000000000..b253d0e276 --- /dev/null +++ b/amd/m00030_a3.cl @@ -0,0 +1,766 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _MD5_ +#define _SCALAR_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW4 +#define VECT_SIZE4 +#endif + +#ifdef VLIW5 +#define VECT_SIZE4 +#endif + +#define DGST_R0 0 +#define DGST_R1 3 +#define DGST_R2 2 +#define DGST_R3 1 + +#include "include/kernel_functions.c" +#include "types_amd.c" +#include "common_amd.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4_warp.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4_warp.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4_warp.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4_warp.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4_warp.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4_warp.c" +#endif + +#define MD5_STEP_REV(f,a,b,c,d,x,t,s) \ +{ \ + a -= b; \ + a = rotr32 (a, s); \ + a -= f (b, c, d); \ + a -= x; \ + a -= t; \ +} + +#define MD5_STEP_REV1(f,a,b,c,d,x,t,s) \ +{ \ + a -= b; \ + a = rotr32 (a, s); \ + a -= x; \ + a -= t; \ +} + +static void m00030m (u32 w[16], const u32 pw_len, __global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global u32x * words_buf_r, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset) +{ + /** + * modifier + */ + + const u32 gid = get_global_id (0); + const u32 lid = get_local_id (0); + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[ 1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[ 2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[ 3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[ 4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[ 5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[ 6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[ 7]; + + u32 salt_buf2[4]; + + salt_buf2[0] = salt_bufs[salt_pos].salt_buf[ 8]; + salt_buf2[1] = 0; + salt_buf2[2] = 0; + salt_buf2[3] = 0; + + u32 salt_buf3[4]; + + salt_buf3[0] = 0; + salt_buf3[1] = 0; + salt_buf3[2] = 0; + salt_buf3[3] = 0; + + switch_buffer_by_offset (salt_buf0, salt_buf1, salt_buf2, salt_buf3, pw_len); + + w[ 0] |= salt_buf0[0]; + w[ 1] |= salt_buf0[1]; + w[ 2] |= salt_buf0[2]; + w[ 3] |= salt_buf0[3]; + w[ 4] |= salt_buf1[0]; + w[ 5] |= salt_buf1[1]; + w[ 6] |= salt_buf1[2]; + w[ 7] |= salt_buf1[3]; + w[ 8] |= salt_buf2[0]; + w[ 9] |= salt_buf2[1]; + w[10] |= salt_buf2[2]; + w[11] |= salt_buf2[3]; + w[12] |= salt_buf3[0]; + w[13] |= salt_buf3[1]; + w[14] |= salt_buf3[2]; + w[15] |= salt_buf3[3]; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + const u32 pw_salt_len = pw_len + salt_len; + + w[14] = pw_salt_len * 8; + + /** + * base + */ + + const u32 F_w0c00 = 0 + MD5C00; + const u32 F_w1c01 = w[ 1] + MD5C01; + const u32 F_w2c02 = w[ 2] + MD5C02; + const u32 F_w3c03 = w[ 3] + MD5C03; + const u32 F_w4c04 = w[ 4] + MD5C04; + const u32 F_w5c05 = w[ 5] + MD5C05; + const u32 F_w6c06 = w[ 6] + MD5C06; + const u32 F_w7c07 = w[ 7] + MD5C07; + const u32 F_w8c08 = w[ 8] + MD5C08; + const u32 F_w9c09 = w[ 9] + MD5C09; + const u32 F_wac0a = w[10] + MD5C0a; + const u32 F_wbc0b = w[11] + MD5C0b; + const u32 F_wcc0c = w[12] + MD5C0c; + const u32 F_wdc0d = w[13] + MD5C0d; + const u32 F_wec0e = w[14] + MD5C0e; + const u32 F_wfc0f = w[15] + MD5C0f; + + const u32 G_w1c10 = w[ 1] + MD5C10; + const u32 G_w6c11 = w[ 6] + MD5C11; + const u32 G_wbc12 = w[11] + MD5C12; + const u32 G_w0c13 = 0 + MD5C13; + const u32 G_w5c14 = w[ 5] + MD5C14; + const u32 G_wac15 = w[10] + MD5C15; + const u32 G_wfc16 = w[15] + MD5C16; + const u32 G_w4c17 = w[ 4] + MD5C17; + const u32 G_w9c18 = w[ 9] + MD5C18; + const u32 G_wec19 = w[14] + MD5C19; + const u32 G_w3c1a = w[ 3] + MD5C1a; + const u32 G_w8c1b = w[ 8] + MD5C1b; + const u32 G_wdc1c = w[13] + MD5C1c; + const u32 G_w2c1d = w[ 2] + MD5C1d; + const u32 G_w7c1e = w[ 7] + MD5C1e; + const u32 G_wcc1f = w[12] + MD5C1f; + + const u32 H_w5c20 = w[ 5] + MD5C20; + const u32 H_w8c21 = w[ 8] + MD5C21; + const u32 H_wbc22 = w[11] + MD5C22; + const u32 H_wec23 = w[14] + MD5C23; + const u32 H_w1c24 = w[ 1] + MD5C24; + const u32 H_w4c25 = w[ 4] + MD5C25; + const u32 H_w7c26 = w[ 7] + MD5C26; + const u32 H_wac27 = w[10] + MD5C27; + const u32 H_wdc28 = w[13] + MD5C28; + const u32 H_w0c29 = 0 + MD5C29; + const u32 H_w3c2a = w[ 3] + MD5C2a; + const u32 H_w6c2b = w[ 6] + MD5C2b; + const u32 H_w9c2c = w[ 9] + MD5C2c; + const u32 H_wcc2d = w[12] + MD5C2d; + const u32 H_wfc2e = w[15] + MD5C2e; + const u32 H_w2c2f = w[ 2] + MD5C2f; + + const u32 I_w0c30 = 0 + MD5C30; + const u32 I_w7c31 = w[ 7] + MD5C31; + const u32 I_wec32 = w[14] + MD5C32; + const u32 I_w5c33 = w[ 5] + MD5C33; + const u32 I_wcc34 = w[12] + MD5C34; + const u32 I_w3c35 = w[ 3] + MD5C35; + const u32 I_wac36 = w[10] + MD5C36; + const u32 I_w1c37 = w[ 1] + MD5C37; + const u32 I_w8c38 = w[ 8] + MD5C38; + const u32 I_wfc39 = w[15] + MD5C39; + const u32 I_w6c3a = w[ 6] + MD5C3a; + const u32 I_wdc3b = w[13] + MD5C3b; + const u32 I_w4c3c = w[ 4] + MD5C3c; + const u32 I_wbc3d = w[11] + MD5C3d; + const u32 I_w2c3e = w[ 2] + MD5C3e; + const u32 I_w9c3f = w[ 9] + MD5C3f; + + /** + * loop + */ + + const u32 bf_loops = ceil ((float) bfs_cnt / VECT_DIV); + + u32x w0l = w[0]; + + for (u32 il_pos = 0; il_pos < bf_loops; il_pos++) + { + const u32x w0r = words_buf_r[il_pos]; + + const u32x w0 = w0l | w0r; + + u32x tmp2; + + u32x a = MD5M_A; + u32x b = MD5M_B; + u32x c = MD5M_C; + u32x d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0, F_w0c00, MD5S00); + MD5_STEP0(MD5_Fo, d, a, b, c, F_w1c01, MD5S01); + MD5_STEP0(MD5_Fo, c, d, a, b, F_w2c02, MD5S02); + MD5_STEP0(MD5_Fo, b, c, d, a, F_w3c03, MD5S03); + MD5_STEP0(MD5_Fo, a, b, c, d, F_w4c04, MD5S00); + MD5_STEP0(MD5_Fo, d, a, b, c, F_w5c05, MD5S01); + MD5_STEP0(MD5_Fo, c, d, a, b, F_w6c06, MD5S02); + MD5_STEP0(MD5_Fo, b, c, d, a, F_w7c07, MD5S03); + MD5_STEP0(MD5_Fo, a, b, c, d, F_w8c08, MD5S00); + MD5_STEP0(MD5_Fo, d, a, b, c, F_w9c09, MD5S01); + MD5_STEP0(MD5_Fo, c, d, a, b, F_wac0a, MD5S02); + MD5_STEP0(MD5_Fo, b, c, d, a, F_wbc0b, MD5S03); + MD5_STEP0(MD5_Fo, a, b, c, d, F_wcc0c, MD5S00); + MD5_STEP0(MD5_Fo, d, a, b, c, F_wdc0d, MD5S01); + MD5_STEP0(MD5_Fo, c, d, a, b, F_wec0e, MD5S02); + MD5_STEP0(MD5_Fo, b, c, d, a, F_wfc0f, MD5S03); + + MD5_STEP0(MD5_Go, a, b, c, d, G_w1c10, MD5S10); + MD5_STEP0(MD5_Go, d, a, b, c, G_w6c11, MD5S11); + MD5_STEP0(MD5_Go, c, d, a, b, G_wbc12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0, G_w0c13, MD5S13); + MD5_STEP0(MD5_Go, a, b, c, d, G_w5c14, MD5S10); + MD5_STEP0(MD5_Go, d, a, b, c, G_wac15, MD5S11); + MD5_STEP0(MD5_Go, c, d, a, b, G_wfc16, MD5S12); + MD5_STEP0(MD5_Go, b, c, d, a, G_w4c17, MD5S13); + MD5_STEP0(MD5_Go, a, b, c, d, G_w9c18, MD5S10); + MD5_STEP0(MD5_Go, d, a, b, c, G_wec19, MD5S11); + MD5_STEP0(MD5_Go, c, d, a, b, G_w3c1a, MD5S12); + MD5_STEP0(MD5_Go, b, c, d, a, G_w8c1b, MD5S13); + MD5_STEP0(MD5_Go, a, b, c, d, G_wdc1c, MD5S10); + MD5_STEP0(MD5_Go, d, a, b, c, G_w2c1d, MD5S11); + MD5_STEP0(MD5_Go, c, d, a, b, G_w7c1e, MD5S12); + MD5_STEP0(MD5_Go, b, c, d, a, G_wcc1f, MD5S13); + + MD5_STEP0(MD5_H1, a, b, c, d, H_w5c20, MD5S20); + MD5_STEP0(MD5_H2, d, a, b, c, H_w8c21, MD5S21); + MD5_STEP0(MD5_H1, c, d, a, b, H_wbc22, MD5S22); + MD5_STEP0(MD5_H2, b, c, d, a, H_wec23, MD5S23); + MD5_STEP0(MD5_H1, a, b, c, d, H_w1c24, MD5S20); + MD5_STEP0(MD5_H2, d, a, b, c, H_w4c25, MD5S21); + MD5_STEP0(MD5_H1, c, d, a, b, H_w7c26, MD5S22); + MD5_STEP0(MD5_H2, b, c, d, a, H_wac27, MD5S23); + MD5_STEP0(MD5_H1, a, b, c, d, H_wdc28, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w0, H_w0c29, MD5S21); + MD5_STEP0(MD5_H1, c, d, a, b, H_w3c2a, MD5S22); + MD5_STEP0(MD5_H2, b, c, d, a, H_w6c2b, MD5S23); + MD5_STEP0(MD5_H1, a, b, c, d, H_w9c2c, MD5S20); + MD5_STEP0(MD5_H2, d, a, b, c, H_wcc2d, MD5S21); + MD5_STEP0(MD5_H1, c, d, a, b, H_wfc2e, MD5S22); + MD5_STEP0(MD5_H2, b, c, d, a, H_w2c2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0, I_w0c30, MD5S30); + MD5_STEP0(MD5_I , d, a, b, c, I_w7c31, MD5S31); + MD5_STEP0(MD5_I , c, d, a, b, I_wec32, MD5S32); + MD5_STEP0(MD5_I , b, c, d, a, I_w5c33, MD5S33); + MD5_STEP0(MD5_I , a, b, c, d, I_wcc34, MD5S30); + MD5_STEP0(MD5_I , d, a, b, c, I_w3c35, MD5S31); + MD5_STEP0(MD5_I , c, d, a, b, I_wac36, MD5S32); + MD5_STEP0(MD5_I , b, c, d, a, I_w1c37, MD5S33); + MD5_STEP0(MD5_I , a, b, c, d, I_w8c38, MD5S30); + MD5_STEP0(MD5_I , d, a, b, c, I_wfc39, MD5S31); + MD5_STEP0(MD5_I , c, d, a, b, I_w6c3a, MD5S32); + MD5_STEP0(MD5_I , b, c, d, a, I_wdc3b, MD5S33); + MD5_STEP0(MD5_I , a, b, c, d, I_w4c3c, MD5S30); + MD5_STEP0(MD5_I , d, a, b, c, I_wbc3d, MD5S31); + MD5_STEP0(MD5_I , c, d, a, b, I_w2c3e, MD5S32); + MD5_STEP0(MD5_I , b, c, d, a, I_w9c3f, MD5S33); + + + const u32x r0 = a; + const u32x r1 = d; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_M + } +} + +static void m00030s (u32 w[16], const u32 pw_len, __global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global u32x * words_buf_r, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset) +{ + /** + * modifier + */ + + const u32 gid = get_global_id (0); + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 F_w0c00 = 0 + MD5C00; + const u32 F_w1c01 = w[ 1] + MD5C01; + const u32 F_w2c02 = w[ 2] + MD5C02; + const u32 F_w3c03 = w[ 3] + MD5C03; + const u32 F_w4c04 = w[ 4] + MD5C04; + const u32 F_w5c05 = w[ 5] + MD5C05; + const u32 F_w6c06 = w[ 6] + MD5C06; + const u32 F_w7c07 = w[ 7] + MD5C07; + const u32 F_w8c08 = w[ 8] + MD5C08; + const u32 F_w9c09 = w[ 9] + MD5C09; + const u32 F_wac0a = w[10] + MD5C0a; + const u32 F_wbc0b = w[11] + MD5C0b; + const u32 F_wcc0c = w[12] + MD5C0c; + const u32 F_wdc0d = w[13] + MD5C0d; + const u32 F_wec0e = w[14] + MD5C0e; + const u32 F_wfc0f = w[15] + MD5C0f; + + const u32 G_w1c10 = w[ 1] + MD5C10; + const u32 G_w6c11 = w[ 6] + MD5C11; + const u32 G_wbc12 = w[11] + MD5C12; + const u32 G_w0c13 = 0 + MD5C13; + const u32 G_w5c14 = w[ 5] + MD5C14; + const u32 G_wac15 = w[10] + MD5C15; + const u32 G_wfc16 = w[15] + MD5C16; + const u32 G_w4c17 = w[ 4] + MD5C17; + const u32 G_w9c18 = w[ 9] + MD5C18; + const u32 G_wec19 = w[14] + MD5C19; + const u32 G_w3c1a = w[ 3] + MD5C1a; + const u32 G_w8c1b = w[ 8] + MD5C1b; + const u32 G_wdc1c = w[13] + MD5C1c; + const u32 G_w2c1d = w[ 2] + MD5C1d; + const u32 G_w7c1e = w[ 7] + MD5C1e; + const u32 G_wcc1f = w[12] + MD5C1f; + + const u32 H_w5c20 = w[ 5] + MD5C20; + const u32 H_w8c21 = w[ 8] + MD5C21; + const u32 H_wbc22 = w[11] + MD5C22; + const u32 H_wec23 = w[14] + MD5C23; + const u32 H_w1c24 = w[ 1] + MD5C24; + const u32 H_w4c25 = w[ 4] + MD5C25; + const u32 H_w7c26 = w[ 7] + MD5C26; + const u32 H_wac27 = w[10] + MD5C27; + const u32 H_wdc28 = w[13] + MD5C28; + const u32 H_w0c29 = 0 + MD5C29; + const u32 H_w3c2a = w[ 3] + MD5C2a; + const u32 H_w6c2b = w[ 6] + MD5C2b; + const u32 H_w9c2c = w[ 9] + MD5C2c; + const u32 H_wcc2d = w[12] + MD5C2d; + const u32 H_wfc2e = w[15] + MD5C2e; + const u32 H_w2c2f = w[ 2] + MD5C2f; + + const u32 I_w0c30 = 0 + MD5C30; + const u32 I_w7c31 = w[ 7] + MD5C31; + const u32 I_wec32 = w[14] + MD5C32; + const u32 I_w5c33 = w[ 5] + MD5C33; + const u32 I_wcc34 = w[12] + MD5C34; + const u32 I_w3c35 = w[ 3] + MD5C35; + const u32 I_wac36 = w[10] + MD5C36; + const u32 I_w1c37 = w[ 1] + MD5C37; + const u32 I_w8c38 = w[ 8] + MD5C38; + const u32 I_wfc39 = w[15] + MD5C39; + const u32 I_w6c3a = w[ 6] + MD5C3a; + const u32 I_wdc3b = w[13] + MD5C3b; + const u32 I_w4c3c = w[ 4] + MD5C3c; + const u32 I_wbc3d = w[11] + MD5C3d; + const u32 I_w2c3e = w[ 2] + MD5C3e; + const u32 I_w9c3f = w[ 9] + MD5C3f; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * reverse + */ + + u32 a_rev = digests_buf[digests_offset].digest_buf[0]; + u32 b_rev = digests_buf[digests_offset].digest_buf[1]; + u32 c_rev = digests_buf[digests_offset].digest_buf[2]; + u32 d_rev = digests_buf[digests_offset].digest_buf[3]; + + MD5_STEP_REV (MD5_I, b_rev, c_rev, d_rev, a_rev, w[ 9], MD5C3f, MD5S33); + MD5_STEP_REV (MD5_I, c_rev, d_rev, a_rev, b_rev, w[ 2], MD5C3e, MD5S32); + MD5_STEP_REV (MD5_I, d_rev, a_rev, b_rev, c_rev, w[11], MD5C3d, MD5S31); + MD5_STEP_REV (MD5_I, a_rev, b_rev, c_rev, d_rev, w[ 4], MD5C3c, MD5S30); + MD5_STEP_REV (MD5_I, b_rev, c_rev, d_rev, a_rev, w[13], MD5C3b, MD5S33); + MD5_STEP_REV (MD5_I, c_rev, d_rev, a_rev, b_rev, w[ 6], MD5C3a, MD5S32); + MD5_STEP_REV (MD5_I, d_rev, a_rev, b_rev, c_rev, w[15], MD5C39, MD5S31); + MD5_STEP_REV (MD5_I, a_rev, b_rev, c_rev, d_rev, w[ 8], MD5C38, MD5S30); + MD5_STEP_REV (MD5_I, b_rev, c_rev, d_rev, a_rev, w[ 1], MD5C37, MD5S33); + MD5_STEP_REV (MD5_I, c_rev, d_rev, a_rev, b_rev, w[10], MD5C36, MD5S32); + MD5_STEP_REV (MD5_I, d_rev, a_rev, b_rev, c_rev, w[ 3], MD5C35, MD5S31); + MD5_STEP_REV (MD5_I, a_rev, b_rev, c_rev, d_rev, w[12], MD5C34, MD5S30); + MD5_STEP_REV (MD5_I, b_rev, c_rev, d_rev, a_rev, w[ 5], MD5C33, MD5S33); + MD5_STEP_REV (MD5_I, c_rev, d_rev, a_rev, b_rev, w[14], MD5C32, MD5S32); + MD5_STEP_REV (MD5_I, d_rev, a_rev, b_rev, c_rev, w[ 7], MD5C31, MD5S31); + MD5_STEP_REV (MD5_I, a_rev, b_rev, c_rev, d_rev, 0, MD5C30, MD5S30); + + const u32x pre_cd = c_rev ^ d_rev; + + MD5_STEP_REV1(MD5_H, b_rev, c_rev, d_rev, a_rev, w[ 2], MD5C2f, MD5S23); + MD5_STEP_REV1(MD5_H, c_rev, d_rev, a_rev, b_rev, w[15], MD5C2e, MD5S22); + + /** + * loop + */ + + const u32 bf_loops = ceil ((float) bfs_cnt / VECT_DIV); + + u32x w0l = w[0]; + + for (u32 il_pos = 0; il_pos < bf_loops; il_pos++) + { + const u32x w0r = words_buf_r[il_pos]; + + const u32x w0 = w0l | w0r; + + const u32x pre_d = d_rev; + const u32x pre_a = a_rev - w0; + const u32x pre_b = b_rev - (pre_a ^ pre_cd); + const u32x pre_c = c_rev - (pre_a ^ pre_b ^ pre_d); + + u32x tmp2; + + u32x a = MD5M_A; + u32x b = MD5M_B; + u32x c = MD5M_C; + u32x d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0, F_w0c00, MD5S00); + MD5_STEP0(MD5_Fo, d, a, b, c, F_w1c01, MD5S01); + MD5_STEP0(MD5_Fo, c, d, a, b, F_w2c02, MD5S02); + MD5_STEP0(MD5_Fo, b, c, d, a, F_w3c03, MD5S03); + MD5_STEP0(MD5_Fo, a, b, c, d, F_w4c04, MD5S00); + MD5_STEP0(MD5_Fo, d, a, b, c, F_w5c05, MD5S01); + MD5_STEP0(MD5_Fo, c, d, a, b, F_w6c06, MD5S02); + MD5_STEP0(MD5_Fo, b, c, d, a, F_w7c07, MD5S03); + MD5_STEP0(MD5_Fo, a, b, c, d, F_w8c08, MD5S00); + MD5_STEP0(MD5_Fo, d, a, b, c, F_w9c09, MD5S01); + MD5_STEP0(MD5_Fo, c, d, a, b, F_wac0a, MD5S02); + MD5_STEP0(MD5_Fo, b, c, d, a, F_wbc0b, MD5S03); + MD5_STEP0(MD5_Fo, a, b, c, d, F_wcc0c, MD5S00); + MD5_STEP0(MD5_Fo, d, a, b, c, F_wdc0d, MD5S01); + MD5_STEP0(MD5_Fo, c, d, a, b, F_wec0e, MD5S02); + MD5_STEP0(MD5_Fo, b, c, d, a, F_wfc0f, MD5S03); + + MD5_STEP0(MD5_Go, a, b, c, d, G_w1c10, MD5S10); + MD5_STEP0(MD5_Go, d, a, b, c, G_w6c11, MD5S11); + MD5_STEP0(MD5_Go, c, d, a, b, G_wbc12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0, G_w0c13, MD5S13); + MD5_STEP0(MD5_Go, a, b, c, d, G_w5c14, MD5S10); + MD5_STEP0(MD5_Go, d, a, b, c, G_wac15, MD5S11); + MD5_STEP0(MD5_Go, c, d, a, b, G_wfc16, MD5S12); + MD5_STEP0(MD5_Go, b, c, d, a, G_w4c17, MD5S13); + MD5_STEP0(MD5_Go, a, b, c, d, G_w9c18, MD5S10); + MD5_STEP0(MD5_Go, d, a, b, c, G_wec19, MD5S11); + MD5_STEP0(MD5_Go, c, d, a, b, G_w3c1a, MD5S12); + MD5_STEP0(MD5_Go, b, c, d, a, G_w8c1b, MD5S13); + MD5_STEP0(MD5_Go, a, b, c, d, G_wdc1c, MD5S10); + MD5_STEP0(MD5_Go, d, a, b, c, G_w2c1d, MD5S11); + MD5_STEP0(MD5_Go, c, d, a, b, G_w7c1e, MD5S12); + MD5_STEP0(MD5_Go, b, c, d, a, G_wcc1f, MD5S13); + + MD5_STEP0(MD5_H1, a, b, c, d, H_w5c20, MD5S20); + MD5_STEP0(MD5_H2, d, a, b, c, H_w8c21, MD5S21); + MD5_STEP0(MD5_H1, c, d, a, b, H_wbc22, MD5S22); + MD5_STEP0(MD5_H2, b, c, d, a, H_wec23, MD5S23); + MD5_STEP0(MD5_H1, a, b, c, d, H_w1c24, MD5S20); + MD5_STEP0(MD5_H2, d, a, b, c, H_w4c25, MD5S21); + MD5_STEP0(MD5_H1, c, d, a, b, H_w7c26, MD5S22); + MD5_STEP0(MD5_H2, b, c, d, a, H_wac27, MD5S23); + MD5_STEP0(MD5_H1, a, b, c, d, H_wdc28, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w0, H_w0c29, MD5S21); + MD5_STEP0(MD5_H1, c, d, a, b, H_w3c2a, MD5S22); + + bool q_cond = allx (pre_c != c); + + if (q_cond) continue; + + MD5_STEP0(MD5_H2, b, c, d, a, H_w6c2b, MD5S23); + MD5_STEP0(MD5_H1, a, b, c, d, H_w9c2c, MD5S20); + MD5_STEP0(MD5_H2, d, a, b, c, H_wcc2d, MD5S21); + + bool q_cond2 = allx (pre_d != d); + + if (q_cond2) continue; + + MD5_STEP0(MD5_H1, c, d, a, b, H_wfc2e, MD5S22); + MD5_STEP0(MD5_H2, b, c, d, a, H_w2c2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0, I_w0c30, MD5S30); + MD5_STEP0(MD5_I , d, a, b, c, I_w7c31, MD5S31); + MD5_STEP0(MD5_I , c, d, a, b, I_wec32, MD5S32); + MD5_STEP0(MD5_I , b, c, d, a, I_w5c33, MD5S33); + MD5_STEP0(MD5_I , a, b, c, d, I_wcc34, MD5S30); + MD5_STEP0(MD5_I , d, a, b, c, I_w3c35, MD5S31); + MD5_STEP0(MD5_I , c, d, a, b, I_wac36, MD5S32); + MD5_STEP0(MD5_I , b, c, d, a, I_w1c37, MD5S33); + MD5_STEP0(MD5_I , a, b, c, d, I_w8c38, MD5S30); + MD5_STEP0(MD5_I , d, a, b, c, I_wfc39, MD5S31); + MD5_STEP0(MD5_I , c, d, a, b, I_w6c3a, MD5S32); + MD5_STEP0(MD5_I , b, c, d, a, I_wdc3b, MD5S33); + MD5_STEP0(MD5_I , a, b, c, d, I_w4c3c, MD5S30); + MD5_STEP0(MD5_I , d, a, b, c, I_wbc3d, MD5S31); + MD5_STEP0(MD5_I , c, d, a, b, I_w2c3e, MD5S32); + MD5_STEP0(MD5_I , b, c, d, a, I_w9c3f, MD5S33); + + + const u32x r0 = a; + const u32x r1 = d; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_S + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m00030_m04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global u32x * words_buf_r, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32 w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = 0; + w[ 5] = 0; + w[ 6] = 0; + w[ 7] = 0; + w[ 8] = 0; + w[ 9] = 0; + w[10] = 0; + w[11] = 0; + w[12] = 0; + w[13] = 0; + w[14] = pws[gid].i[14]; + w[15] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m00030m (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m00030_m08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global u32x * words_buf_r, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32 w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = pws[gid].i[ 4]; + w[ 5] = pws[gid].i[ 5]; + w[ 6] = pws[gid].i[ 6]; + w[ 7] = pws[gid].i[ 7]; + w[ 8] = 0; + w[ 9] = 0; + w[10] = 0; + w[11] = 0; + w[12] = 0; + w[13] = 0; + w[14] = pws[gid].i[14]; + w[15] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m00030m (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m00030_m16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global u32x * words_buf_r, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32 w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = pws[gid].i[ 4]; + w[ 5] = pws[gid].i[ 5]; + w[ 6] = pws[gid].i[ 6]; + w[ 7] = pws[gid].i[ 7]; + w[ 8] = pws[gid].i[ 8]; + w[ 9] = pws[gid].i[ 9]; + w[10] = pws[gid].i[10]; + w[11] = pws[gid].i[11]; + w[12] = pws[gid].i[12]; + w[13] = pws[gid].i[13]; + w[14] = pws[gid].i[14]; + w[15] = pws[gid].i[15]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m00030m (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m00030_s04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global u32x * words_buf_r, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32 w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = 0; + w[ 5] = 0; + w[ 6] = 0; + w[ 7] = 0; + w[ 8] = 0; + w[ 9] = 0; + w[10] = 0; + w[11] = 0; + w[12] = 0; + w[13] = 0; + w[14] = pws[gid].i[14]; + w[15] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m00030s (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m00030_s08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global u32x * words_buf_r, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32 w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = pws[gid].i[ 4]; + w[ 5] = pws[gid].i[ 5]; + w[ 6] = pws[gid].i[ 6]; + w[ 7] = pws[gid].i[ 7]; + w[ 8] = 0; + w[ 9] = 0; + w[10] = 0; + w[11] = 0; + w[12] = 0; + w[13] = 0; + w[14] = pws[gid].i[14]; + w[15] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m00030s (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m00030_s16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global u32x * words_buf_r, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32 w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = pws[gid].i[ 4]; + w[ 5] = pws[gid].i[ 5]; + w[ 6] = pws[gid].i[ 6]; + w[ 7] = pws[gid].i[ 7]; + w[ 8] = pws[gid].i[ 8]; + w[ 9] = pws[gid].i[ 9]; + w[10] = pws[gid].i[10]; + w[11] = pws[gid].i[11]; + w[12] = pws[gid].i[12]; + w[13] = pws[gid].i[13]; + w[14] = pws[gid].i[14]; + w[15] = pws[gid].i[15]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m00030s (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} diff --git a/amd/m00040_a0.cl b/amd/m00040_a0.cl new file mode 100644 index 0000000000..3fff8d626a --- /dev/null +++ b/amd/m00040_a0.cl @@ -0,0 +1,488 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _MD5_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW4 +#define VECT_SIZE4 +#endif + +#ifdef VLIW5 +#define VECT_SIZE4 +#endif + +#define DGST_R0 0 +#define DGST_R1 3 +#define DGST_R2 2 +#define DGST_R3 1 + +#include "include/kernel_functions.c" +#include "types_amd.c" +#include "common_amd.c" +#include "include/rp_gpu.h" +#include "rp_amd.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m00040_m04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + u32x pw_buf1[4]; + + pw_buf1[0] = pws[gid].i[ 4]; + pw_buf1[1] = pws[gid].i[ 5]; + pw_buf1[2] = pws[gid].i[ 6]; + pw_buf1[3] = pws[gid].i[ 7]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[7]; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + + w0[0] = pw_buf0[0]; + w0[1] = pw_buf0[1]; + w0[2] = pw_buf0[2]; + w0[3] = pw_buf0[3]; + + u32x w1[4]; + + w1[0] = pw_buf1[0]; + w1[1] = pw_buf1[1]; + w1[2] = pw_buf1[2]; + w1[3] = pw_buf1[3]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 out_len = apply_rules (rules_buf[il_pos].cmds, w0, w1, pw_len); + + /** + * prepend salt + */ + + const u32 out_salt_len = (out_len * 2) + salt_len; + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + make_unicode (w0, w0_t, w1_t); + make_unicode (w1, w2_t, w3_t); + + switch_buffer_by_offset (w0_t, w1_t, w2_t, w3_t, salt_len); + + w0_t[0] |= salt_buf0[0]; + w0_t[1] |= salt_buf0[1]; + w0_t[2] |= salt_buf0[2]; + w0_t[3] |= salt_buf0[3]; + w1_t[0] |= salt_buf1[0]; + w1_t[1] |= salt_buf1[1]; + w1_t[2] |= salt_buf1[2]; + w1_t[3] |= salt_buf1[3]; + + append_0x80_4 (w0_t, w1_t, w2_t, w3_t, out_salt_len); + + w3_t[2] = out_salt_len * 8; + + /** + * md5 + */ + + u32x a = MD5M_A; + u32x b = MD5M_B; + u32x c = MD5M_C; + u32x d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0_t[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0_t[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0_t[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1_t[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1_t[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1_t[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2_t[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2_t[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2_t[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3_t[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3_t[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3_t[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0_t[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1_t[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2_t[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1_t[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1_t[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2_t[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3_t[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0_t[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2_t[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3_t[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0_t[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1_t[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3_t[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H , a, b, c, d, w1_t[1], MD5C20, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w2_t[0], MD5C21, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w2_t[3], MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w3_t[2], MD5C23, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w0_t[1], MD5C24, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w1_t[0], MD5C25, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w1_t[3], MD5C26, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w2_t[2], MD5C27, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w3_t[1], MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w0_t[0], MD5C29, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w0_t[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w1_t[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w2_t[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w3_t[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w3_t[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w0_t[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1_t[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3_t[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3_t[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0_t[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0_t[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2_t[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1_t[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3_t[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1_t[0], MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w2_t[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0_t[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2_t[1], MD5C3f, MD5S33); + + + const u32x r0 = a; + const u32x r1 = d; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_M + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m00040_m08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m00040_m16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m00040_s04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + u32x pw_buf1[4]; + + pw_buf1[0] = pws[gid].i[ 4]; + pw_buf1[1] = pws[gid].i[ 5]; + pw_buf1[2] = pws[gid].i[ 6]; + pw_buf1[3] = pws[gid].i[ 7]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[7]; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + + w0[0] = pw_buf0[0]; + w0[1] = pw_buf0[1]; + w0[2] = pw_buf0[2]; + w0[3] = pw_buf0[3]; + + u32x w1[4]; + + w1[0] = pw_buf1[0]; + w1[1] = pw_buf1[1]; + w1[2] = pw_buf1[2]; + w1[3] = pw_buf1[3]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 out_len = apply_rules (rules_buf[il_pos].cmds, w0, w1, pw_len); + + /** + * prepend salt + */ + + const u32 out_salt_len = (out_len * 2) + salt_len; + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + make_unicode (w0, w0_t, w1_t); + make_unicode (w1, w2_t, w3_t); + + switch_buffer_by_offset (w0_t, w1_t, w2_t, w3_t, salt_len); + + w0_t[0] |= salt_buf0[0]; + w0_t[1] |= salt_buf0[1]; + w0_t[2] |= salt_buf0[2]; + w0_t[3] |= salt_buf0[3]; + w1_t[0] |= salt_buf1[0]; + w1_t[1] |= salt_buf1[1]; + w1_t[2] |= salt_buf1[2]; + w1_t[3] |= salt_buf1[3]; + + append_0x80_4 (w0_t, w1_t, w2_t, w3_t, out_salt_len); + + w3_t[2] = out_salt_len * 8; + + /** + * md5 + */ + + u32x a = MD5M_A; + u32x b = MD5M_B; + u32x c = MD5M_C; + u32x d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0_t[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0_t[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0_t[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1_t[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1_t[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1_t[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2_t[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2_t[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2_t[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3_t[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3_t[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3_t[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0_t[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1_t[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2_t[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1_t[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1_t[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2_t[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3_t[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0_t[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2_t[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3_t[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0_t[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1_t[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3_t[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H , a, b, c, d, w1_t[1], MD5C20, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w2_t[0], MD5C21, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w2_t[3], MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w3_t[2], MD5C23, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w0_t[1], MD5C24, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w1_t[0], MD5C25, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w1_t[3], MD5C26, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w2_t[2], MD5C27, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w3_t[1], MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w0_t[0], MD5C29, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w0_t[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w1_t[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w2_t[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w3_t[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w3_t[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w0_t[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1_t[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3_t[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3_t[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0_t[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0_t[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2_t[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1_t[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3_t[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1_t[0], MD5C3c, MD5S30); + + bool q_cond = allx (search[0] != a); + + if (q_cond) continue; + + MD5_STEP (MD5_I , d, a, b, c, w2_t[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0_t[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2_t[1], MD5C3f, MD5S33); + + + const u32x r0 = a; + const u32x r1 = d; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_S + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m00040_s08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m00040_s16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/amd/m00040_a1.cl b/amd/m00040_a1.cl new file mode 100644 index 0000000000..3679517b34 --- /dev/null +++ b/amd/m00040_a1.cl @@ -0,0 +1,584 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _MD5_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW4 +#define VECT_SIZE4 +#endif + +#ifdef VLIW5 +#define VECT_SIZE4 +#endif + +#define DGST_R0 0 +#define DGST_R1 3 +#define DGST_R2 2 +#define DGST_R3 1 + +#include "include/kernel_functions.c" +#include "types_amd.c" +#include "common_amd.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +// no unicode yet + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m00040_m04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, combs_buf[0].pw_len); + } + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[7]; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = combs_buf[il_pos].pw_len; + + const u32 pw_len = pw_l_len + pw_r_len; + + u32 wordr0[4]; + + wordr0[0] = combs_buf[il_pos].i[0]; + wordr0[1] = combs_buf[il_pos].i[1]; + wordr0[2] = combs_buf[il_pos].i[2]; + wordr0[3] = combs_buf[il_pos].i[3]; + + u32 wordr1[4]; + + wordr1[0] = combs_buf[il_pos].i[4]; + wordr1[1] = combs_buf[il_pos].i[5]; + wordr1[2] = combs_buf[il_pos].i[6]; + wordr1[3] = combs_buf[il_pos].i[7]; + + u32 wordr2[4]; + + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + + u32 wordr3[4]; + + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + /** + * prepend salt + */ + + const u32 pw_salt_len = (pw_len * 2) + salt_len; + + u32x w0[4]; + u32x w1[4]; + u32x w2[4]; + u32x w3[4]; + + w0[0] = wordl0[0] | wordr0[0]; + w0[1] = wordl0[1] | wordr0[1]; + w0[2] = wordl0[2] | wordr0[2]; + w0[3] = wordl0[3] | wordr0[3]; + w1[0] = wordl1[0] | wordr1[0]; + w1[1] = wordl1[1] | wordr1[1]; + w1[2] = wordl1[2] | wordr1[2]; + w1[3] = wordl1[3] | wordr1[3]; + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + make_unicode (w0, w0_t, w1_t); + make_unicode (w1, w2_t, w3_t); + + switch_buffer_by_offset (w0_t, w1_t, w2_t, w3_t, salt_len); + + w0_t[0] |= salt_buf0[0]; + w0_t[1] |= salt_buf0[1]; + w0_t[2] |= salt_buf0[2]; + w0_t[3] |= salt_buf0[3]; + w1_t[0] |= salt_buf1[0]; + w1_t[1] |= salt_buf1[1]; + w1_t[2] |= salt_buf1[2]; + w1_t[3] |= salt_buf1[3]; + + append_0x80_4 (w0_t, w1_t, w2_t, w3_t, pw_salt_len); + + w3_t[2] = pw_salt_len * 8; + + /** + * md5 + */ + + u32x a = MD5M_A; + u32x b = MD5M_B; + u32x c = MD5M_C; + u32x d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0_t[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0_t[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0_t[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1_t[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1_t[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1_t[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2_t[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2_t[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2_t[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3_t[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3_t[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3_t[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0_t[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1_t[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2_t[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1_t[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1_t[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2_t[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3_t[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0_t[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2_t[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3_t[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0_t[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1_t[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3_t[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H , a, b, c, d, w1_t[1], MD5C20, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w2_t[0], MD5C21, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w2_t[3], MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w3_t[2], MD5C23, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w0_t[1], MD5C24, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w1_t[0], MD5C25, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w1_t[3], MD5C26, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w2_t[2], MD5C27, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w3_t[1], MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w0_t[0], MD5C29, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w0_t[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w1_t[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w2_t[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w3_t[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w3_t[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w0_t[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1_t[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3_t[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3_t[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0_t[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0_t[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2_t[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1_t[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3_t[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1_t[0], MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w2_t[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0_t[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2_t[1], MD5C3f, MD5S33); + + + const u32x r0 = a; + const u32x r1 = d; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_M + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m00040_m08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m00040_m16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m00040_s04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, combs_buf[0].pw_len); + } + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[7]; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = combs_buf[il_pos].pw_len; + + const u32 pw_len = pw_l_len + pw_r_len; + + u32 wordr0[4]; + + wordr0[0] = combs_buf[il_pos].i[0]; + wordr0[1] = combs_buf[il_pos].i[1]; + wordr0[2] = combs_buf[il_pos].i[2]; + wordr0[3] = combs_buf[il_pos].i[3]; + + u32 wordr1[4]; + + wordr1[0] = combs_buf[il_pos].i[4]; + wordr1[1] = combs_buf[il_pos].i[5]; + wordr1[2] = combs_buf[il_pos].i[6]; + wordr1[3] = combs_buf[il_pos].i[7]; + + u32 wordr2[4]; + + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + + u32 wordr3[4]; + + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + /** + * prepend salt + */ + + const u32 pw_salt_len = (pw_len * 2) + salt_len; + + u32x w0[4]; + u32x w1[4]; + u32x w2[4]; + u32x w3[4]; + + w0[0] = wordl0[0] | wordr0[0]; + w0[1] = wordl0[1] | wordr0[1]; + w0[2] = wordl0[2] | wordr0[2]; + w0[3] = wordl0[3] | wordr0[3]; + w1[0] = wordl1[0] | wordr1[0]; + w1[1] = wordl1[1] | wordr1[1]; + w1[2] = wordl1[2] | wordr1[2]; + w1[3] = wordl1[3] | wordr1[3]; + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + make_unicode (w0, w0_t, w1_t); + make_unicode (w1, w2_t, w3_t); + + switch_buffer_by_offset (w0_t, w1_t, w2_t, w3_t, salt_len); + + w0_t[0] |= salt_buf0[0]; + w0_t[1] |= salt_buf0[1]; + w0_t[2] |= salt_buf0[2]; + w0_t[3] |= salt_buf0[3]; + w1_t[0] |= salt_buf1[0]; + w1_t[1] |= salt_buf1[1]; + w1_t[2] |= salt_buf1[2]; + w1_t[3] |= salt_buf1[3]; + + append_0x80_4 (w0_t, w1_t, w2_t, w3_t, pw_salt_len); + + w3_t[2] = pw_salt_len * 8; + + /** + * md5 + */ + + u32x a = MD5M_A; + u32x b = MD5M_B; + u32x c = MD5M_C; + u32x d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0_t[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0_t[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0_t[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1_t[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1_t[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1_t[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2_t[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2_t[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2_t[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3_t[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3_t[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3_t[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0_t[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1_t[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2_t[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1_t[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1_t[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2_t[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3_t[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0_t[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2_t[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3_t[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0_t[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1_t[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3_t[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H , a, b, c, d, w1_t[1], MD5C20, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w2_t[0], MD5C21, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w2_t[3], MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w3_t[2], MD5C23, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w0_t[1], MD5C24, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w1_t[0], MD5C25, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w1_t[3], MD5C26, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w2_t[2], MD5C27, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w3_t[1], MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w0_t[0], MD5C29, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w0_t[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w1_t[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w2_t[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w3_t[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w3_t[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w0_t[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1_t[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3_t[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3_t[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0_t[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0_t[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2_t[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1_t[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3_t[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1_t[0], MD5C3c, MD5S30); + + bool q_cond = allx (search[0] != a); + + if (q_cond) continue; + + MD5_STEP (MD5_I , d, a, b, c, w2_t[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0_t[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2_t[1], MD5C3f, MD5S33); + + + const u32x r0 = a; + const u32x r1 = d; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_S + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m00040_s08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m00040_s16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/amd/m00040_a3.cl b/amd/m00040_a3.cl new file mode 100644 index 0000000000..54d6cdebe8 --- /dev/null +++ b/amd/m00040_a3.cl @@ -0,0 +1,726 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _MD5_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW4 +#define VECT_SIZE4 +#endif + +#ifdef VLIW5 +#define VECT_SIZE4 +#endif + +#define DGST_R0 0 +#define DGST_R1 3 +#define DGST_R2 2 +#define DGST_R3 1 + +#include "include/kernel_functions.c" +#include "types_amd.c" +#include "common_amd.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +static void m00040m (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], const u32 pw_len, __global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset) +{ + /** + * modifier + */ + + const u32 gid = get_global_id (0); + const u32 lid = get_local_id (0); + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[ 1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[ 2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[ 3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[ 4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[ 5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[ 6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[ 7]; + + u32 salt_buf2[4]; + + salt_buf2[0] = 0; + salt_buf2[1] = 0; + salt_buf2[2] = 0; + salt_buf2[3] = 0; + + u32 salt_buf3[4]; + + salt_buf3[0] = 0; + salt_buf3[1] = 0; + salt_buf3[2] = 0; + salt_buf3[3] = 0; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + const u32 pw_salt_len = pw_len + salt_len; + + /** + * loop + */ + + u32x w0l = w0[0]; + + for (u32 il_pos = 0; il_pos < bfs_cnt; il_pos++) + { + const u32 w0r = bfs_buf[il_pos].i; + + w0[0] = w0l | w0r; + + /** + * prepend salt + */ + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + w0_t[0] = w0[0]; + w0_t[1] = w0[1]; + w0_t[2] = w0[2]; + w0_t[3] = w0[3]; + w1_t[0] = w1[0]; + w1_t[1] = w1[1]; + w1_t[2] = w1[2]; + w1_t[3] = w1[3]; + w2_t[0] = w2[0]; + w2_t[1] = w2[1]; + w2_t[2] = w2[2]; + w2_t[3] = w2[3]; + w3_t[0] = w3[0]; + w3_t[1] = w3[1]; + w3_t[2] = w3[2]; + w3_t[3] = w3[3]; + + switch_buffer_by_offset (w0_t, w1_t, w2_t, w3_t, salt_len); + + w3_t[2] = pw_salt_len * 8; + + w0_t[0] |= salt_buf0[0]; + w0_t[1] |= salt_buf0[1]; + w0_t[2] |= salt_buf0[2]; + w0_t[3] |= salt_buf0[3]; + w1_t[0] |= salt_buf1[0]; + w1_t[1] |= salt_buf1[1]; + w1_t[2] |= salt_buf1[2]; + w1_t[3] |= salt_buf1[3]; + w2_t[0] |= salt_buf2[0]; + w2_t[1] |= salt_buf2[1]; + w2_t[2] |= salt_buf2[2]; + w2_t[3] |= salt_buf2[3]; + w3_t[0] |= salt_buf3[0]; + w3_t[1] |= salt_buf3[1]; + w3_t[2] |= salt_buf3[2]; + w3_t[3] |= salt_buf3[3]; + + /** + * md5 + */ + + u32x a = MD5M_A; + u32x b = MD5M_B; + u32x c = MD5M_C; + u32x d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0_t[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0_t[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0_t[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1_t[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1_t[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1_t[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2_t[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2_t[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2_t[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3_t[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3_t[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3_t[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0_t[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1_t[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2_t[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1_t[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1_t[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2_t[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3_t[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0_t[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2_t[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3_t[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0_t[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1_t[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3_t[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H , a, b, c, d, w1_t[1], MD5C20, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w2_t[0], MD5C21, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w2_t[3], MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w3_t[2], MD5C23, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w0_t[1], MD5C24, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w1_t[0], MD5C25, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w1_t[3], MD5C26, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w2_t[2], MD5C27, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w3_t[1], MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w0_t[0], MD5C29, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w0_t[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w1_t[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w2_t[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w3_t[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w3_t[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w0_t[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1_t[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3_t[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3_t[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0_t[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0_t[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2_t[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1_t[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3_t[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1_t[0], MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w2_t[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0_t[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2_t[1], MD5C3f, MD5S33); + + + const u32x r0 = a; + const u32x r1 = d; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_M + } +} + +static void m00040s (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], const u32 pw_len, __global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset) +{ + /** + * modifier + */ + + const u32 gid = get_global_id (0); + const u32 lid = get_local_id (0); + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[ 1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[ 2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[ 3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[ 4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[ 5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[ 6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[ 7]; + + u32 salt_buf2[4]; + + salt_buf2[0] = 0; + salt_buf2[1] = 0; + salt_buf2[2] = 0; + salt_buf2[3] = 0; + + u32 salt_buf3[4]; + + salt_buf3[0] = 0; + salt_buf3[1] = 0; + salt_buf3[2] = 0; + salt_buf3[3] = 0; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + const u32 pw_salt_len = pw_len + salt_len; + + /** + * loop + */ + + u32x w0l = w0[0]; + + for (u32 il_pos = 0; il_pos < bfs_cnt; il_pos++) + { + const u32 w0r = bfs_buf[il_pos].i; + + w0[0] = w0l | w0r; + + /** + * prepend salt + */ + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + w0_t[0] = w0[0]; + w0_t[1] = w0[1]; + w0_t[2] = w0[2]; + w0_t[3] = w0[3]; + w1_t[0] = w1[0]; + w1_t[1] = w1[1]; + w1_t[2] = w1[2]; + w1_t[3] = w1[3]; + w2_t[0] = w2[0]; + w2_t[1] = w2[1]; + w2_t[2] = w2[2]; + w2_t[3] = w2[3]; + w3_t[0] = w3[0]; + w3_t[1] = w3[1]; + w3_t[2] = w3[2]; + w3_t[3] = w3[3]; + + switch_buffer_by_offset (w0_t, w1_t, w2_t, w3_t, salt_len); + + w3_t[2] = pw_salt_len * 8; + + w0_t[0] |= salt_buf0[0]; + w0_t[1] |= salt_buf0[1]; + w0_t[2] |= salt_buf0[2]; + w0_t[3] |= salt_buf0[3]; + w1_t[0] |= salt_buf1[0]; + w1_t[1] |= salt_buf1[1]; + w1_t[2] |= salt_buf1[2]; + w1_t[3] |= salt_buf1[3]; + w2_t[0] |= salt_buf2[0]; + w2_t[1] |= salt_buf2[1]; + w2_t[2] |= salt_buf2[2]; + w2_t[3] |= salt_buf2[3]; + w3_t[0] |= salt_buf3[0]; + w3_t[1] |= salt_buf3[1]; + w3_t[2] |= salt_buf3[2]; + w3_t[3] |= salt_buf3[3]; + + /** + * md5 + */ + + u32x a = MD5M_A; + u32x b = MD5M_B; + u32x c = MD5M_C; + u32x d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0_t[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0_t[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0_t[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1_t[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1_t[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1_t[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2_t[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2_t[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2_t[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3_t[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3_t[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3_t[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0_t[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1_t[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2_t[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1_t[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1_t[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2_t[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3_t[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0_t[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2_t[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3_t[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0_t[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1_t[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3_t[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H , a, b, c, d, w1_t[1], MD5C20, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w2_t[0], MD5C21, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w2_t[3], MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w3_t[2], MD5C23, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w0_t[1], MD5C24, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w1_t[0], MD5C25, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w1_t[3], MD5C26, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w2_t[2], MD5C27, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w3_t[1], MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w0_t[0], MD5C29, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w0_t[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w1_t[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w2_t[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w3_t[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w3_t[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w0_t[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1_t[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3_t[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3_t[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0_t[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0_t[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2_t[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1_t[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3_t[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1_t[0], MD5C3c, MD5S30); + + bool q_cond = allx (search[0] != a); + + if (q_cond) continue; + + MD5_STEP (MD5_I , d, a, b, c, w2_t[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0_t[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2_t[1], MD5C3f, MD5S33); + + + const u32x r0 = a; + const u32x r1 = d; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_S + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m00040_m04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m00040m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m00040_m08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m00040m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m00040_m16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = pws[gid].i[ 8]; + w2[1] = pws[gid].i[ 9]; + w2[2] = pws[gid].i[10]; + w2[3] = pws[gid].i[11]; + + u32x w3[4]; + + w3[0] = pws[gid].i[12]; + w3[1] = pws[gid].i[13]; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m00040m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m00040_s04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m00040s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m00040_s08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m00040s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m00040_s16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = pws[gid].i[ 8]; + w2[1] = pws[gid].i[ 9]; + w2[2] = pws[gid].i[10]; + w2[3] = pws[gid].i[11]; + + u32x w3[4]; + + w3[0] = pws[gid].i[12]; + w3[1] = pws[gid].i[13]; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m00040s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} diff --git a/amd/m00050_a0.cl b/amd/m00050_a0.cl new file mode 100644 index 0000000000..404723430b --- /dev/null +++ b/amd/m00050_a0.cl @@ -0,0 +1,593 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _MD5_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW4 +#define VECT_SIZE4 +#endif + +#ifdef VLIW5 +#define VECT_SIZE4 +#endif + +#define DGST_R0 0 +#define DGST_R1 3 +#define DGST_R2 2 +#define DGST_R3 1 + +#include "include/kernel_functions.c" +#include "types_amd.c" +#include "common_amd.c" +#include "include/rp_gpu.h" +#include "rp_amd.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +static void md5_transform (const u32x w0[4], const u32x w1[4], const u32x w2[4], const u32x w3[4], u32x digest[4]) +{ + u32x a = digest[0]; + u32x b = digest[1]; + u32x c = digest[2]; + u32x d = digest[3]; + + u32x w0_t = w0[0]; + u32x w1_t = w0[1]; + u32x w2_t = w0[2]; + u32x w3_t = w0[3]; + u32x w4_t = w1[0]; + u32x w5_t = w1[1]; + u32x w6_t = w1[2]; + u32x w7_t = w1[3]; + u32x w8_t = w2[0]; + u32x w9_t = w2[1]; + u32x wa_t = w2[2]; + u32x wb_t = w2[3]; + u32x wc_t = w3[0]; + u32x wd_t = w3[1]; + u32x we_t = w3[2]; + u32x wf_t = w3[3]; + + u32x tmp2; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t, MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t, MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t, MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t, MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w4_t, MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w5_t, MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w6_t, MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w7_t, MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w8_t, MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w9_t, MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, wa_t, MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, wb_t, MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, wc_t, MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, wd_t, MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, we_t, MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, wf_t, MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w1_t, MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w6_t, MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, wb_t, MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t, MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w5_t, MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, wa_t, MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, wf_t, MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w4_t, MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w9_t, MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, we_t, MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t, MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w8_t, MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, wd_t, MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t, MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w7_t, MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, wc_t, MD5C1f, MD5S13); + + MD5_STEP (MD5_H1, a, b, c, d, w5_t, MD5C20, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w8_t, MD5C21, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, wb_t, MD5C22, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, we_t, MD5C23, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w1_t, MD5C24, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w4_t, MD5C25, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w7_t, MD5C26, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, wa_t, MD5C27, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, wd_t, MD5C28, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w0_t, MD5C29, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w3_t, MD5C2a, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w6_t, MD5C2b, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w9_t, MD5C2c, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, wc_t, MD5C2d, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, wf_t, MD5C2e, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w2_t, MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t, MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w7_t, MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, we_t, MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w5_t, MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, wc_t, MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t, MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, wa_t, MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t, MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w8_t, MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, wf_t, MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w6_t, MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, wd_t, MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w4_t, MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, wb_t, MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t, MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w9_t, MD5C3f, MD5S33); + + digest[0] += a; + digest[1] += b; + digest[2] += c; + digest[3] += d; +} + +static void hmac_md5_pad (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], u32x ipad[4], u32x opad[4]) +{ + w0[0] = w0[0] ^ 0x36363636; + w0[1] = w0[1] ^ 0x36363636; + w0[2] = w0[2] ^ 0x36363636; + w0[3] = w0[3] ^ 0x36363636; + w1[0] = w1[0] ^ 0x36363636; + w1[1] = w1[1] ^ 0x36363636; + w1[2] = w1[2] ^ 0x36363636; + w1[3] = w1[3] ^ 0x36363636; + w2[0] = w2[0] ^ 0x36363636; + w2[1] = w2[1] ^ 0x36363636; + w2[2] = w2[2] ^ 0x36363636; + w2[3] = w2[3] ^ 0x36363636; + w3[0] = w3[0] ^ 0x36363636; + w3[1] = w3[1] ^ 0x36363636; + w3[2] = w3[2] ^ 0x36363636; + w3[3] = w3[3] ^ 0x36363636; + + ipad[0] = MD5M_A; + ipad[1] = MD5M_B; + ipad[2] = MD5M_C; + ipad[3] = MD5M_D; + + md5_transform (w0, w1, w2, w3, ipad); + + w0[0] = w0[0] ^ 0x6a6a6a6a; + w0[1] = w0[1] ^ 0x6a6a6a6a; + w0[2] = w0[2] ^ 0x6a6a6a6a; + w0[3] = w0[3] ^ 0x6a6a6a6a; + w1[0] = w1[0] ^ 0x6a6a6a6a; + w1[1] = w1[1] ^ 0x6a6a6a6a; + w1[2] = w1[2] ^ 0x6a6a6a6a; + w1[3] = w1[3] ^ 0x6a6a6a6a; + w2[0] = w2[0] ^ 0x6a6a6a6a; + w2[1] = w2[1] ^ 0x6a6a6a6a; + w2[2] = w2[2] ^ 0x6a6a6a6a; + w2[3] = w2[3] ^ 0x6a6a6a6a; + w3[0] = w3[0] ^ 0x6a6a6a6a; + w3[1] = w3[1] ^ 0x6a6a6a6a; + w3[2] = w3[2] ^ 0x6a6a6a6a; + w3[3] = w3[3] ^ 0x6a6a6a6a; + + opad[0] = MD5M_A; + opad[1] = MD5M_B; + opad[2] = MD5M_C; + opad[3] = MD5M_D; + + md5_transform (w0, w1, w2, w3, opad); +} + +static void hmac_md5_run (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], u32x ipad[4], u32x opad[4], u32x digest[4]) +{ + digest[0] = ipad[0]; + digest[1] = ipad[1]; + digest[2] = ipad[2]; + digest[3] = ipad[3]; + + md5_transform (w0, w1, w2, w3, digest); + + w0[0] = digest[0]; + w0[1] = digest[1]; + w0[2] = digest[2]; + w0[3] = digest[3]; + w1[0] = 0x80; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + w3[0] = 0; + w3[1] = 0; + w3[2] = (64 + 16) * 8; + w3[3] = 0; + + digest[0] = opad[0]; + digest[1] = opad[1]; + digest[2] = opad[2]; + digest[3] = opad[3]; + + md5_transform (w0, w1, w2, w3, digest); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m00050_m04 (__global pw_t *pws, __global gpu_rule_t * rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + u32x pw_buf1[4]; + + pw_buf1[0] = pws[gid].i[ 4]; + pw_buf1[1] = pws[gid].i[ 5]; + pw_buf1[2] = pws[gid].i[ 6]; + pw_buf1[3] = pws[gid].i[ 7]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[ 1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[ 2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[ 3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[ 4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[ 5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[ 6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[ 7]; + + u32 salt_buf2[4]; + + salt_buf2[0] = salt_bufs[salt_pos].salt_buf[ 8]; + salt_buf2[1] = salt_bufs[salt_pos].salt_buf[ 9]; + salt_buf2[2] = salt_bufs[salt_pos].salt_buf[10]; + salt_buf2[3] = salt_bufs[salt_pos].salt_buf[11]; + + u32 salt_buf3[4]; + + salt_buf3[0] = salt_bufs[salt_pos].salt_buf[12]; + salt_buf3[1] = salt_bufs[salt_pos].salt_buf[13]; + salt_buf3[2] = salt_bufs[salt_pos].salt_buf[14]; + salt_buf3[3] = salt_bufs[salt_pos].salt_buf[15]; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + + w0[0] = pw_buf0[0]; + w0[1] = pw_buf0[1]; + w0[2] = pw_buf0[2]; + w0[3] = pw_buf0[3]; + + u32x w1[4]; + + w1[0] = pw_buf1[0]; + w1[1] = pw_buf1[1]; + w1[2] = pw_buf1[2]; + w1[3] = pw_buf1[3]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 out_len = apply_rules (rules_buf[il_pos].cmds, w0, w1, pw_len); + + /** + * pads + */ + + u32x w0_t[4]; + + w0_t[0] = w0[0]; + w0_t[1] = w0[1]; + w0_t[2] = w0[2]; + w0_t[3] = w0[3]; + + u32x w1_t[4]; + + w1_t[0] = w1[0]; + w1_t[1] = w1[1]; + w1_t[2] = w1[2]; + w1_t[3] = w1[3]; + + u32x w2_t[4]; + + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + + u32x w3_t[4]; + + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = 0; + + u32x ipad[4]; + u32x opad[4]; + + hmac_md5_pad (w0_t, w1_t, w2_t, w3_t, ipad, opad); + + w0_t[0] = salt_buf0[0]; + w0_t[1] = salt_buf0[1]; + w0_t[2] = salt_buf0[2]; + w0_t[3] = salt_buf0[3]; + w1_t[0] = salt_buf1[0]; + w1_t[1] = salt_buf1[1]; + w1_t[2] = salt_buf1[2]; + w1_t[3] = salt_buf1[3]; + w2_t[0] = salt_buf2[0]; + w2_t[1] = salt_buf2[1]; + w2_t[2] = salt_buf2[2]; + w2_t[3] = salt_buf2[3]; + w3_t[0] = salt_buf3[0]; + w3_t[1] = salt_buf3[1]; + w3_t[2] = (64 + salt_len) * 8; + w3_t[3] = 0; + + u32x digest[4]; + + hmac_md5_run (w0_t, w1_t, w2_t, w3_t, ipad, opad, digest); + + const u32x r0 = digest[0]; + const u32x r1 = digest[3]; + const u32x r2 = digest[2]; + const u32x r3 = digest[1]; + + #include VECT_COMPARE_M + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m00050_m08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m00050_m16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m00050_s04 (__global pw_t *pws, __global gpu_rule_t * rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + u32x pw_buf1[4]; + + pw_buf1[0] = pws[gid].i[ 4]; + pw_buf1[1] = pws[gid].i[ 5]; + pw_buf1[2] = pws[gid].i[ 6]; + pw_buf1[3] = pws[gid].i[ 7]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[ 1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[ 2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[ 3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[ 4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[ 5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[ 6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[ 7]; + + u32 salt_buf2[4]; + + salt_buf2[0] = salt_bufs[salt_pos].salt_buf[ 8]; + salt_buf2[1] = salt_bufs[salt_pos].salt_buf[ 9]; + salt_buf2[2] = salt_bufs[salt_pos].salt_buf[10]; + salt_buf2[3] = salt_bufs[salt_pos].salt_buf[11]; + + u32 salt_buf3[4]; + + salt_buf3[0] = salt_bufs[salt_pos].salt_buf[12]; + salt_buf3[1] = salt_bufs[salt_pos].salt_buf[13]; + salt_buf3[2] = salt_bufs[salt_pos].salt_buf[14]; + salt_buf3[3] = salt_bufs[salt_pos].salt_buf[15]; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + + w0[0] = pw_buf0[0]; + w0[1] = pw_buf0[1]; + w0[2] = pw_buf0[2]; + w0[3] = pw_buf0[3]; + + u32x w1[4]; + + w1[0] = pw_buf1[0]; + w1[1] = pw_buf1[1]; + w1[2] = pw_buf1[2]; + w1[3] = pw_buf1[3]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 out_len = apply_rules (rules_buf[il_pos].cmds, w0, w1, pw_len); + + /** + * pads + */ + + u32x w0_t[4]; + + w0_t[0] = w0[0]; + w0_t[1] = w0[1]; + w0_t[2] = w0[2]; + w0_t[3] = w0[3]; + + u32x w1_t[4]; + + w1_t[0] = w1[0]; + w1_t[1] = w1[1]; + w1_t[2] = w1[2]; + w1_t[3] = w1[3]; + + u32x w2_t[4]; + + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + + u32x w3_t[4]; + + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = 0; + + u32x ipad[4]; + u32x opad[4]; + + hmac_md5_pad (w0_t, w1_t, w2_t, w3_t, ipad, opad); + + w0_t[0] = salt_buf0[0]; + w0_t[1] = salt_buf0[1]; + w0_t[2] = salt_buf0[2]; + w0_t[3] = salt_buf0[3]; + w1_t[0] = salt_buf1[0]; + w1_t[1] = salt_buf1[1]; + w1_t[2] = salt_buf1[2]; + w1_t[3] = salt_buf1[3]; + w2_t[0] = salt_buf2[0]; + w2_t[1] = salt_buf2[1]; + w2_t[2] = salt_buf2[2]; + w2_t[3] = salt_buf2[3]; + w3_t[0] = salt_buf3[0]; + w3_t[1] = salt_buf3[1]; + w3_t[2] = (64 + salt_len) * 8; + w3_t[3] = 0; + + u32x digest[4]; + + hmac_md5_run (w0_t, w1_t, w2_t, w3_t, ipad, opad, digest); + + const u32x r0 = digest[0]; + const u32x r1 = digest[3]; + const u32x r2 = digest[2]; + const u32x r3 = digest[1]; + + #include VECT_COMPARE_S + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m00050_s08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m00050_s16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/amd/m00050_a1.cl b/amd/m00050_a1.cl new file mode 100644 index 0000000000..66506ae98f --- /dev/null +++ b/amd/m00050_a1.cl @@ -0,0 +1,699 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _MD5_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW4 +#define VECT_SIZE4 +#endif + +#ifdef VLIW5 +#define VECT_SIZE4 +#endif + +#define DGST_R0 0 +#define DGST_R1 3 +#define DGST_R2 2 +#define DGST_R3 1 + +#include "include/kernel_functions.c" +#include "types_amd.c" +#include "common_amd.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +static void md5_transform (const u32x w0[4], const u32x w1[4], const u32x w2[4], const u32x w3[4], u32x digest[4]) +{ + u32x a = digest[0]; + u32x b = digest[1]; + u32x c = digest[2]; + u32x d = digest[3]; + + u32x w0_t = w0[0]; + u32x w1_t = w0[1]; + u32x w2_t = w0[2]; + u32x w3_t = w0[3]; + u32x w4_t = w1[0]; + u32x w5_t = w1[1]; + u32x w6_t = w1[2]; + u32x w7_t = w1[3]; + u32x w8_t = w2[0]; + u32x w9_t = w2[1]; + u32x wa_t = w2[2]; + u32x wb_t = w2[3]; + u32x wc_t = w3[0]; + u32x wd_t = w3[1]; + u32x we_t = w3[2]; + u32x wf_t = w3[3]; + + u32x tmp2; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t, MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t, MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t, MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t, MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w4_t, MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w5_t, MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w6_t, MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w7_t, MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w8_t, MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w9_t, MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, wa_t, MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, wb_t, MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, wc_t, MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, wd_t, MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, we_t, MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, wf_t, MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w1_t, MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w6_t, MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, wb_t, MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t, MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w5_t, MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, wa_t, MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, wf_t, MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w4_t, MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w9_t, MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, we_t, MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t, MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w8_t, MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, wd_t, MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t, MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w7_t, MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, wc_t, MD5C1f, MD5S13); + + MD5_STEP (MD5_H1, a, b, c, d, w5_t, MD5C20, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w8_t, MD5C21, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, wb_t, MD5C22, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, we_t, MD5C23, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w1_t, MD5C24, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w4_t, MD5C25, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w7_t, MD5C26, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, wa_t, MD5C27, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, wd_t, MD5C28, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w0_t, MD5C29, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w3_t, MD5C2a, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w6_t, MD5C2b, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w9_t, MD5C2c, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, wc_t, MD5C2d, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, wf_t, MD5C2e, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w2_t, MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t, MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w7_t, MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, we_t, MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w5_t, MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, wc_t, MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t, MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, wa_t, MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t, MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w8_t, MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, wf_t, MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w6_t, MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, wd_t, MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w4_t, MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, wb_t, MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t, MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w9_t, MD5C3f, MD5S33); + + digest[0] += a; + digest[1] += b; + digest[2] += c; + digest[3] += d; +} + +static void hmac_md5_pad (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], u32x ipad[4], u32x opad[4]) +{ + w0[0] = w0[0] ^ 0x36363636; + w0[1] = w0[1] ^ 0x36363636; + w0[2] = w0[2] ^ 0x36363636; + w0[3] = w0[3] ^ 0x36363636; + w1[0] = w1[0] ^ 0x36363636; + w1[1] = w1[1] ^ 0x36363636; + w1[2] = w1[2] ^ 0x36363636; + w1[3] = w1[3] ^ 0x36363636; + w2[0] = w2[0] ^ 0x36363636; + w2[1] = w2[1] ^ 0x36363636; + w2[2] = w2[2] ^ 0x36363636; + w2[3] = w2[3] ^ 0x36363636; + w3[0] = w3[0] ^ 0x36363636; + w3[1] = w3[1] ^ 0x36363636; + w3[2] = w3[2] ^ 0x36363636; + w3[3] = w3[3] ^ 0x36363636; + + ipad[0] = MD5M_A; + ipad[1] = MD5M_B; + ipad[2] = MD5M_C; + ipad[3] = MD5M_D; + + md5_transform (w0, w1, w2, w3, ipad); + + w0[0] = w0[0] ^ 0x6a6a6a6a; + w0[1] = w0[1] ^ 0x6a6a6a6a; + w0[2] = w0[2] ^ 0x6a6a6a6a; + w0[3] = w0[3] ^ 0x6a6a6a6a; + w1[0] = w1[0] ^ 0x6a6a6a6a; + w1[1] = w1[1] ^ 0x6a6a6a6a; + w1[2] = w1[2] ^ 0x6a6a6a6a; + w1[3] = w1[3] ^ 0x6a6a6a6a; + w2[0] = w2[0] ^ 0x6a6a6a6a; + w2[1] = w2[1] ^ 0x6a6a6a6a; + w2[2] = w2[2] ^ 0x6a6a6a6a; + w2[3] = w2[3] ^ 0x6a6a6a6a; + w3[0] = w3[0] ^ 0x6a6a6a6a; + w3[1] = w3[1] ^ 0x6a6a6a6a; + w3[2] = w3[2] ^ 0x6a6a6a6a; + w3[3] = w3[3] ^ 0x6a6a6a6a; + + opad[0] = MD5M_A; + opad[1] = MD5M_B; + opad[2] = MD5M_C; + opad[3] = MD5M_D; + + md5_transform (w0, w1, w2, w3, opad); +} + +static void hmac_md5_run (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], u32x ipad[4], u32x opad[4], u32x digest[4]) +{ + digest[0] = ipad[0]; + digest[1] = ipad[1]; + digest[2] = ipad[2]; + digest[3] = ipad[3]; + + md5_transform (w0, w1, w2, w3, digest); + + w0[0] = digest[0]; + w0[1] = digest[1]; + w0[2] = digest[2]; + w0[3] = digest[3]; + w1[0] = 0x80; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + w3[0] = 0; + w3[1] = 0; + w3[2] = (64 + 16) * 8; + w3[3] = 0; + + digest[0] = opad[0]; + digest[1] = opad[1]; + digest[2] = opad[2]; + digest[3] = opad[3]; + + md5_transform (w0, w1, w2, w3, digest); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m00050_m04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, combs_buf[0].pw_len); + } + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[ 1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[ 2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[ 3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[ 4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[ 5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[ 6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[ 7]; + + u32 salt_buf2[4]; + + salt_buf2[0] = salt_bufs[salt_pos].salt_buf[ 8]; + salt_buf2[1] = salt_bufs[salt_pos].salt_buf[ 9]; + salt_buf2[2] = salt_bufs[salt_pos].salt_buf[10]; + salt_buf2[3] = salt_bufs[salt_pos].salt_buf[11]; + + u32 salt_buf3[4]; + + salt_buf3[0] = salt_bufs[salt_pos].salt_buf[12]; + salt_buf3[1] = salt_bufs[salt_pos].salt_buf[13]; + salt_buf3[2] = salt_bufs[salt_pos].salt_buf[14]; + salt_buf3[3] = salt_bufs[salt_pos].salt_buf[15]; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = combs_buf[il_pos].pw_len; + + const u32 pw_len = pw_l_len + pw_r_len; + + u32 wordr0[4]; + + wordr0[0] = combs_buf[il_pos].i[0]; + wordr0[1] = combs_buf[il_pos].i[1]; + wordr0[2] = combs_buf[il_pos].i[2]; + wordr0[3] = combs_buf[il_pos].i[3]; + + u32 wordr1[4]; + + wordr1[0] = combs_buf[il_pos].i[4]; + wordr1[1] = combs_buf[il_pos].i[5]; + wordr1[2] = combs_buf[il_pos].i[6]; + wordr1[3] = combs_buf[il_pos].i[7]; + + u32 wordr2[4]; + + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + + u32 wordr3[4]; + + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + u32x w0[4]; + + w0[0] = wordl0[0] | wordr0[0]; + w0[1] = wordl0[1] | wordr0[1]; + w0[2] = wordl0[2] | wordr0[2]; + w0[3] = wordl0[3] | wordr0[3]; + + u32x w1[4]; + + w1[0] = wordl1[0] | wordr1[0]; + w1[1] = wordl1[1] | wordr1[1]; + w1[2] = wordl1[2] | wordr1[2]; + w1[3] = wordl1[3] | wordr1[3]; + + u32x w2[4]; + + w2[0] = wordl2[0] | wordr2[0]; + w2[1] = wordl2[1] | wordr2[1]; + w2[2] = wordl2[2] | wordr2[2]; + w2[3] = wordl2[3] | wordr2[3]; + + u32x w3[4]; + + w3[0] = wordl3[0] | wordr3[0]; + w3[1] = wordl3[1] | wordr3[1]; + w3[2] = wordl3[2] | wordr3[2]; + w3[3] = wordl3[3] | wordr3[3]; + + /** + * pads + */ + + u32x w0_t[4]; + + w0_t[0] = w0[0]; + w0_t[1] = w0[1]; + w0_t[2] = w0[2]; + w0_t[3] = w0[3]; + + u32x w1_t[4]; + + w1_t[0] = w1[0]; + w1_t[1] = w1[1]; + w1_t[2] = w1[2]; + w1_t[3] = w1[3]; + + u32x w2_t[4]; + + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + + u32x w3_t[4]; + + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = 0; + + u32x ipad[4]; + u32x opad[4]; + + hmac_md5_pad (w0_t, w1_t, w2_t, w3_t, ipad, opad); + + w0_t[0] = salt_buf0[0]; + w0_t[1] = salt_buf0[1]; + w0_t[2] = salt_buf0[2]; + w0_t[3] = salt_buf0[3]; + w1_t[0] = salt_buf1[0]; + w1_t[1] = salt_buf1[1]; + w1_t[2] = salt_buf1[2]; + w1_t[3] = salt_buf1[3]; + w2_t[0] = salt_buf2[0]; + w2_t[1] = salt_buf2[1]; + w2_t[2] = salt_buf2[2]; + w2_t[3] = salt_buf2[3]; + w3_t[0] = salt_buf3[0]; + w3_t[1] = salt_buf3[1]; + w3_t[2] = (64 + salt_len) * 8; + w3_t[3] = 0; + + u32x digest[4]; + + hmac_md5_run (w0_t, w1_t, w2_t, w3_t, ipad, opad, digest); + + const u32x r0 = digest[0]; + const u32x r1 = digest[3]; + const u32x r2 = digest[2]; + const u32x r3 = digest[1]; + + #include VECT_COMPARE_M + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m00050_m08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m00050_m16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m00050_s04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, combs_buf[0].pw_len); + } + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[ 1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[ 2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[ 3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[ 4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[ 5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[ 6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[ 7]; + + u32 salt_buf2[4]; + + salt_buf2[0] = salt_bufs[salt_pos].salt_buf[ 8]; + salt_buf2[1] = salt_bufs[salt_pos].salt_buf[ 9]; + salt_buf2[2] = salt_bufs[salt_pos].salt_buf[10]; + salt_buf2[3] = salt_bufs[salt_pos].salt_buf[11]; + + u32 salt_buf3[4]; + + salt_buf3[0] = salt_bufs[salt_pos].salt_buf[12]; + salt_buf3[1] = salt_bufs[salt_pos].salt_buf[13]; + salt_buf3[2] = salt_bufs[salt_pos].salt_buf[14]; + salt_buf3[3] = salt_bufs[salt_pos].salt_buf[15]; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = combs_buf[il_pos].pw_len; + + const u32 pw_len = pw_l_len + pw_r_len; + + u32 wordr0[4]; + + wordr0[0] = combs_buf[il_pos].i[0]; + wordr0[1] = combs_buf[il_pos].i[1]; + wordr0[2] = combs_buf[il_pos].i[2]; + wordr0[3] = combs_buf[il_pos].i[3]; + + u32 wordr1[4]; + + wordr1[0] = combs_buf[il_pos].i[4]; + wordr1[1] = combs_buf[il_pos].i[5]; + wordr1[2] = combs_buf[il_pos].i[6]; + wordr1[3] = combs_buf[il_pos].i[7]; + + u32 wordr2[4]; + + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + + u32 wordr3[4]; + + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + u32x w0[4]; + + w0[0] = wordl0[0] | wordr0[0]; + w0[1] = wordl0[1] | wordr0[1]; + w0[2] = wordl0[2] | wordr0[2]; + w0[3] = wordl0[3] | wordr0[3]; + + u32x w1[4]; + + w1[0] = wordl1[0] | wordr1[0]; + w1[1] = wordl1[1] | wordr1[1]; + w1[2] = wordl1[2] | wordr1[2]; + w1[3] = wordl1[3] | wordr1[3]; + + u32x w2[4]; + + w2[0] = wordl2[0] | wordr2[0]; + w2[1] = wordl2[1] | wordr2[1]; + w2[2] = wordl2[2] | wordr2[2]; + w2[3] = wordl2[3] | wordr2[3]; + + u32x w3[4]; + + w3[0] = wordl3[0] | wordr3[0]; + w3[1] = wordl3[1] | wordr3[1]; + w3[2] = wordl3[2] | wordr3[2]; + w3[3] = wordl3[3] | wordr3[3]; + + /** + * pads + */ + + u32x w0_t[4]; + + w0_t[0] = w0[0]; + w0_t[1] = w0[1]; + w0_t[2] = w0[2]; + w0_t[3] = w0[3]; + + u32x w1_t[4]; + + w1_t[0] = w1[0]; + w1_t[1] = w1[1]; + w1_t[2] = w1[2]; + w1_t[3] = w1[3]; + + u32x w2_t[4]; + + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + + u32x w3_t[4]; + + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = 0; + + u32x ipad[4]; + u32x opad[4]; + + hmac_md5_pad (w0_t, w1_t, w2_t, w3_t, ipad, opad); + + w0_t[0] = salt_buf0[0]; + w0_t[1] = salt_buf0[1]; + w0_t[2] = salt_buf0[2]; + w0_t[3] = salt_buf0[3]; + w1_t[0] = salt_buf1[0]; + w1_t[1] = salt_buf1[1]; + w1_t[2] = salt_buf1[2]; + w1_t[3] = salt_buf1[3]; + w2_t[0] = salt_buf2[0]; + w2_t[1] = salt_buf2[1]; + w2_t[2] = salt_buf2[2]; + w2_t[3] = salt_buf2[3]; + w3_t[0] = salt_buf3[0]; + w3_t[1] = salt_buf3[1]; + w3_t[2] = (64 + salt_len) * 8; + w3_t[3] = 0; + + u32x digest[4]; + + hmac_md5_run (w0_t, w1_t, w2_t, w3_t, ipad, opad, digest); + + const u32x r0 = digest[0]; + const u32x r1 = digest[3]; + const u32x r2 = digest[2]; + const u32x r3 = digest[1]; + + #include VECT_COMPARE_S + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m00050_s08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m00050_s16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/amd/m00050_a3.cl b/amd/m00050_a3.cl new file mode 100644 index 0000000000..9701b6a626 --- /dev/null +++ b/amd/m00050_a3.cl @@ -0,0 +1,763 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _MD5_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW4 +#define VECT_SIZE4 +#endif + +#ifdef VLIW5 +#define VECT_SIZE4 +#endif + +#define DGST_R0 0 +#define DGST_R1 3 +#define DGST_R2 2 +#define DGST_R3 1 + +#include "include/kernel_functions.c" +#include "types_amd.c" +#include "common_amd.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +static void md5_transform (const u32x w0[4], const u32x w1[4], const u32x w2[4], const u32x w3[4], u32x digest[4]) +{ + u32x a = digest[0]; + u32x b = digest[1]; + u32x c = digest[2]; + u32x d = digest[3]; + + u32x w0_t = w0[0]; + u32x w1_t = w0[1]; + u32x w2_t = w0[2]; + u32x w3_t = w0[3]; + u32x w4_t = w1[0]; + u32x w5_t = w1[1]; + u32x w6_t = w1[2]; + u32x w7_t = w1[3]; + u32x w8_t = w2[0]; + u32x w9_t = w2[1]; + u32x wa_t = w2[2]; + u32x wb_t = w2[3]; + u32x wc_t = w3[0]; + u32x wd_t = w3[1]; + u32x we_t = w3[2]; + u32x wf_t = w3[3]; + + u32x tmp2; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t, MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t, MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t, MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t, MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w4_t, MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w5_t, MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w6_t, MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w7_t, MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w8_t, MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w9_t, MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, wa_t, MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, wb_t, MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, wc_t, MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, wd_t, MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, we_t, MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, wf_t, MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w1_t, MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w6_t, MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, wb_t, MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t, MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w5_t, MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, wa_t, MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, wf_t, MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w4_t, MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w9_t, MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, we_t, MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t, MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w8_t, MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, wd_t, MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t, MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w7_t, MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, wc_t, MD5C1f, MD5S13); + + MD5_STEP (MD5_H1, a, b, c, d, w5_t, MD5C20, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w8_t, MD5C21, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, wb_t, MD5C22, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, we_t, MD5C23, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w1_t, MD5C24, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w4_t, MD5C25, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w7_t, MD5C26, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, wa_t, MD5C27, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, wd_t, MD5C28, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w0_t, MD5C29, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w3_t, MD5C2a, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w6_t, MD5C2b, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w9_t, MD5C2c, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, wc_t, MD5C2d, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, wf_t, MD5C2e, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w2_t, MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t, MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w7_t, MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, we_t, MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w5_t, MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, wc_t, MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t, MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, wa_t, MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t, MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w8_t, MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, wf_t, MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w6_t, MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, wd_t, MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w4_t, MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, wb_t, MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t, MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w9_t, MD5C3f, MD5S33); + + digest[0] += a; + digest[1] += b; + digest[2] += c; + digest[3] += d; +} + +static void hmac_md5_pad (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], u32x ipad[4], u32x opad[4]) +{ + w0[0] = w0[0] ^ 0x36363636; + w0[1] = w0[1] ^ 0x36363636; + w0[2] = w0[2] ^ 0x36363636; + w0[3] = w0[3] ^ 0x36363636; + w1[0] = w1[0] ^ 0x36363636; + w1[1] = w1[1] ^ 0x36363636; + w1[2] = w1[2] ^ 0x36363636; + w1[3] = w1[3] ^ 0x36363636; + w2[0] = w2[0] ^ 0x36363636; + w2[1] = w2[1] ^ 0x36363636; + w2[2] = w2[2] ^ 0x36363636; + w2[3] = w2[3] ^ 0x36363636; + w3[0] = w3[0] ^ 0x36363636; + w3[1] = w3[1] ^ 0x36363636; + w3[2] = w3[2] ^ 0x36363636; + w3[3] = w3[3] ^ 0x36363636; + + ipad[0] = MD5M_A; + ipad[1] = MD5M_B; + ipad[2] = MD5M_C; + ipad[3] = MD5M_D; + + md5_transform (w0, w1, w2, w3, ipad); + + w0[0] = w0[0] ^ 0x6a6a6a6a; + w0[1] = w0[1] ^ 0x6a6a6a6a; + w0[2] = w0[2] ^ 0x6a6a6a6a; + w0[3] = w0[3] ^ 0x6a6a6a6a; + w1[0] = w1[0] ^ 0x6a6a6a6a; + w1[1] = w1[1] ^ 0x6a6a6a6a; + w1[2] = w1[2] ^ 0x6a6a6a6a; + w1[3] = w1[3] ^ 0x6a6a6a6a; + w2[0] = w2[0] ^ 0x6a6a6a6a; + w2[1] = w2[1] ^ 0x6a6a6a6a; + w2[2] = w2[2] ^ 0x6a6a6a6a; + w2[3] = w2[3] ^ 0x6a6a6a6a; + w3[0] = w3[0] ^ 0x6a6a6a6a; + w3[1] = w3[1] ^ 0x6a6a6a6a; + w3[2] = w3[2] ^ 0x6a6a6a6a; + w3[3] = w3[3] ^ 0x6a6a6a6a; + + opad[0] = MD5M_A; + opad[1] = MD5M_B; + opad[2] = MD5M_C; + opad[3] = MD5M_D; + + md5_transform (w0, w1, w2, w3, opad); +} + +static void hmac_md5_run (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], u32x ipad[4], u32x opad[4], u32x digest[4]) +{ + digest[0] = ipad[0]; + digest[1] = ipad[1]; + digest[2] = ipad[2]; + digest[3] = ipad[3]; + + md5_transform (w0, w1, w2, w3, digest); + + w0[0] = digest[0]; + w0[1] = digest[1]; + w0[2] = digest[2]; + w0[3] = digest[3]; + w1[0] = 0x80; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + w3[0] = 0; + w3[1] = 0; + w3[2] = (64 + 16) * 8; + w3[3] = 0; + + digest[0] = opad[0]; + digest[1] = opad[1]; + digest[2] = opad[2]; + digest[3] = opad[3]; + + md5_transform (w0, w1, w2, w3, digest); +} + +static void m00050m (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], const u32 pw_len, __global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset) +{ + /** + * modifier + */ + + const u32 gid = get_global_id (0); + const u32 lid = get_local_id (0); + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[ 1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[ 2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[ 3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[ 4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[ 5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[ 6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[ 7]; + + u32 salt_buf2[4]; + + salt_buf2[0] = salt_bufs[salt_pos].salt_buf[ 8]; + salt_buf2[1] = salt_bufs[salt_pos].salt_buf[ 9]; + salt_buf2[2] = salt_bufs[salt_pos].salt_buf[10]; + salt_buf2[3] = salt_bufs[salt_pos].salt_buf[11]; + + u32 salt_buf3[4]; + + salt_buf3[0] = salt_bufs[salt_pos].salt_buf[12]; + salt_buf3[1] = salt_bufs[salt_pos].salt_buf[13]; + salt_buf3[2] = salt_bufs[salt_pos].salt_buf[14]; + salt_buf3[3] = salt_bufs[salt_pos].salt_buf[15]; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + /** + * loop + */ + + u32x w0l = w0[0]; + + for (u32 il_pos = 0; il_pos < bfs_cnt; il_pos++) + { + const u32 w0r = bfs_buf[il_pos].i; + + w0[0] = w0l | w0r; + + /** + * pads + */ + + u32x w0_t[4]; + + w0_t[0] = w0[0]; + w0_t[1] = w0[1]; + w0_t[2] = w0[2]; + w0_t[3] = w0[3]; + + u32x w1_t[4]; + + w1_t[0] = w1[0]; + w1_t[1] = w1[1]; + w1_t[2] = w1[2]; + w1_t[3] = w1[3]; + + u32x w2_t[4]; + + w2_t[0] = w2[0]; + w2_t[1] = w2[1]; + w2_t[2] = w2[2]; + w2_t[3] = w2[3]; + + u32x w3_t[4]; + + w3_t[0] = w3[0]; + w3_t[1] = w3[1]; + w3_t[2] = 0; + w3_t[3] = 0; + + u32x ipad[4]; + u32x opad[4]; + + hmac_md5_pad (w0_t, w1_t, w2_t, w3_t, ipad, opad); + + w0_t[0] = salt_buf0[0]; + w0_t[1] = salt_buf0[1]; + w0_t[2] = salt_buf0[2]; + w0_t[3] = salt_buf0[3]; + w1_t[0] = salt_buf1[0]; + w1_t[1] = salt_buf1[1]; + w1_t[2] = salt_buf1[2]; + w1_t[3] = salt_buf1[3]; + w2_t[0] = salt_buf2[0]; + w2_t[1] = salt_buf2[1]; + w2_t[2] = salt_buf2[2]; + w2_t[3] = salt_buf2[3]; + w3_t[0] = salt_buf3[0]; + w3_t[1] = salt_buf3[1]; + w3_t[2] = (64 + salt_len) * 8; + w3_t[3] = 0; + + u32x digest[4]; + + hmac_md5_run (w0_t, w1_t, w2_t, w3_t, ipad, opad, digest); + + const u32x r0 = digest[0]; + const u32x r1 = digest[3]; + const u32x r2 = digest[2]; + const u32x r3 = digest[1]; + + #include VECT_COMPARE_M + } +} + +static void m00050s (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], const u32 pw_len, __global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset) +{ + /** + * modifier + */ + + const u32 gid = get_global_id (0); + const u32 lid = get_local_id (0); + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[ 1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[ 2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[ 3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[ 4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[ 5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[ 6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[ 7]; + + u32 salt_buf2[4]; + + salt_buf2[0] = salt_bufs[salt_pos].salt_buf[ 8]; + salt_buf2[1] = salt_bufs[salt_pos].salt_buf[ 9]; + salt_buf2[2] = salt_bufs[salt_pos].salt_buf[10]; + salt_buf2[3] = salt_bufs[salt_pos].salt_buf[11]; + + u32 salt_buf3[4]; + + salt_buf3[0] = salt_bufs[salt_pos].salt_buf[12]; + salt_buf3[1] = salt_bufs[salt_pos].salt_buf[13]; + salt_buf3[2] = salt_bufs[salt_pos].salt_buf[14]; + salt_buf3[3] = salt_bufs[salt_pos].salt_buf[15]; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * loop + */ + + u32x w0l = w0[0]; + + for (u32 il_pos = 0; il_pos < bfs_cnt; il_pos++) + { + const u32 w0r = bfs_buf[il_pos].i; + + w0[0] = w0l | w0r; + + /** + * pads + */ + + u32x w0_t[4]; + + w0_t[0] = w0[0]; + w0_t[1] = w0[1]; + w0_t[2] = w0[2]; + w0_t[3] = w0[3]; + + u32x w1_t[4]; + + w1_t[0] = w1[0]; + w1_t[1] = w1[1]; + w1_t[2] = w1[2]; + w1_t[3] = w1[3]; + + u32x w2_t[4]; + + w2_t[0] = w2[0]; + w2_t[1] = w2[1]; + w2_t[2] = w2[2]; + w2_t[3] = w2[3]; + + u32x w3_t[4]; + + w3_t[0] = w3[0]; + w3_t[1] = w3[1]; + w3_t[2] = 0; + w3_t[3] = 0; + + u32x ipad[4]; + u32x opad[4]; + + hmac_md5_pad (w0_t, w1_t, w2_t, w3_t, ipad, opad); + + w0_t[0] = salt_buf0[0]; + w0_t[1] = salt_buf0[1]; + w0_t[2] = salt_buf0[2]; + w0_t[3] = salt_buf0[3]; + w1_t[0] = salt_buf1[0]; + w1_t[1] = salt_buf1[1]; + w1_t[2] = salt_buf1[2]; + w1_t[3] = salt_buf1[3]; + w2_t[0] = salt_buf2[0]; + w2_t[1] = salt_buf2[1]; + w2_t[2] = salt_buf2[2]; + w2_t[3] = salt_buf2[3]; + w3_t[0] = salt_buf3[0]; + w3_t[1] = salt_buf3[1]; + w3_t[2] = (64 + salt_len) * 8; + w3_t[3] = 0; + + u32x digest[4]; + + hmac_md5_run (w0_t, w1_t, w2_t, w3_t, ipad, opad, digest); + + const u32x r0 = digest[0]; + const u32x r1 = digest[3]; + const u32x r2 = digest[2]; + const u32x r3 = digest[1]; + + #include VECT_COMPARE_S + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m00050_m04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m00050m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m00050_m08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m00050m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m00050_m16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = pws[gid].i[ 8]; + w2[1] = pws[gid].i[ 9]; + w2[2] = pws[gid].i[10]; + w2[3] = pws[gid].i[11]; + + u32x w3[4]; + + w3[0] = pws[gid].i[12]; + w3[1] = pws[gid].i[13]; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m00050m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m00050_s04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m00050s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m00050_s08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m00050s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m00050_s16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = pws[gid].i[ 8]; + w2[1] = pws[gid].i[ 9]; + w2[2] = pws[gid].i[10]; + w2[3] = pws[gid].i[11]; + + u32x w3[4]; + + w3[0] = pws[gid].i[12]; + w3[1] = pws[gid].i[13]; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m00050s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} diff --git a/amd/m00060_a0.cl b/amd/m00060_a0.cl new file mode 100644 index 0000000000..aa9a34a678 --- /dev/null +++ b/amd/m00060_a0.cl @@ -0,0 +1,565 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _MD5_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW4 +#define VECT_SIZE4 +#endif + +#ifdef VLIW5 +#define VECT_SIZE4 +#endif + +#define DGST_R0 0 +#define DGST_R1 3 +#define DGST_R2 2 +#define DGST_R3 1 + +#include "include/kernel_functions.c" +#include "types_amd.c" +#include "common_amd.c" +#include "include/rp_gpu.h" +#include "rp_amd.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +static void md5_transform (const u32x w0[4], const u32x w1[4], const u32x w2[4], const u32x w3[4], u32x digest[4]) +{ + u32x a = digest[0]; + u32x b = digest[1]; + u32x c = digest[2]; + u32x d = digest[3]; + + u32x w0_t = w0[0]; + u32x w1_t = w0[1]; + u32x w2_t = w0[2]; + u32x w3_t = w0[3]; + u32x w4_t = w1[0]; + u32x w5_t = w1[1]; + u32x w6_t = w1[2]; + u32x w7_t = w1[3]; + u32x w8_t = w2[0]; + u32x w9_t = w2[1]; + u32x wa_t = w2[2]; + u32x wb_t = w2[3]; + u32x wc_t = w3[0]; + u32x wd_t = w3[1]; + u32x we_t = w3[2]; + u32x wf_t = w3[3]; + + u32x tmp2; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t, MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t, MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t, MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t, MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w4_t, MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w5_t, MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w6_t, MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w7_t, MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w8_t, MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w9_t, MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, wa_t, MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, wb_t, MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, wc_t, MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, wd_t, MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, we_t, MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, wf_t, MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w1_t, MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w6_t, MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, wb_t, MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t, MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w5_t, MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, wa_t, MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, wf_t, MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w4_t, MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w9_t, MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, we_t, MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t, MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w8_t, MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, wd_t, MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t, MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w7_t, MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, wc_t, MD5C1f, MD5S13); + + MD5_STEP (MD5_H1, a, b, c, d, w5_t, MD5C20, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w8_t, MD5C21, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, wb_t, MD5C22, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, we_t, MD5C23, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w1_t, MD5C24, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w4_t, MD5C25, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w7_t, MD5C26, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, wa_t, MD5C27, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, wd_t, MD5C28, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w0_t, MD5C29, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w3_t, MD5C2a, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w6_t, MD5C2b, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w9_t, MD5C2c, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, wc_t, MD5C2d, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, wf_t, MD5C2e, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w2_t, MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t, MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w7_t, MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, we_t, MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w5_t, MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, wc_t, MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t, MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, wa_t, MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t, MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w8_t, MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, wf_t, MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w6_t, MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, wd_t, MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w4_t, MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, wb_t, MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t, MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w9_t, MD5C3f, MD5S33); + + digest[0] += a; + digest[1] += b; + digest[2] += c; + digest[3] += d; +} + +static void hmac_md5_pad (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], u32x ipad[4], u32x opad[4]) +{ + w0[0] = w0[0] ^ 0x36363636; + w0[1] = w0[1] ^ 0x36363636; + w0[2] = w0[2] ^ 0x36363636; + w0[3] = w0[3] ^ 0x36363636; + w1[0] = w1[0] ^ 0x36363636; + w1[1] = w1[1] ^ 0x36363636; + w1[2] = w1[2] ^ 0x36363636; + w1[3] = w1[3] ^ 0x36363636; + w2[0] = w2[0] ^ 0x36363636; + w2[1] = w2[1] ^ 0x36363636; + w2[2] = w2[2] ^ 0x36363636; + w2[3] = w2[3] ^ 0x36363636; + w3[0] = w3[0] ^ 0x36363636; + w3[1] = w3[1] ^ 0x36363636; + w3[2] = w3[2] ^ 0x36363636; + w3[3] = w3[3] ^ 0x36363636; + + ipad[0] = MD5M_A; + ipad[1] = MD5M_B; + ipad[2] = MD5M_C; + ipad[3] = MD5M_D; + + md5_transform (w0, w1, w2, w3, ipad); + + w0[0] = w0[0] ^ 0x6a6a6a6a; + w0[1] = w0[1] ^ 0x6a6a6a6a; + w0[2] = w0[2] ^ 0x6a6a6a6a; + w0[3] = w0[3] ^ 0x6a6a6a6a; + w1[0] = w1[0] ^ 0x6a6a6a6a; + w1[1] = w1[1] ^ 0x6a6a6a6a; + w1[2] = w1[2] ^ 0x6a6a6a6a; + w1[3] = w1[3] ^ 0x6a6a6a6a; + w2[0] = w2[0] ^ 0x6a6a6a6a; + w2[1] = w2[1] ^ 0x6a6a6a6a; + w2[2] = w2[2] ^ 0x6a6a6a6a; + w2[3] = w2[3] ^ 0x6a6a6a6a; + w3[0] = w3[0] ^ 0x6a6a6a6a; + w3[1] = w3[1] ^ 0x6a6a6a6a; + w3[2] = w3[2] ^ 0x6a6a6a6a; + w3[3] = w3[3] ^ 0x6a6a6a6a; + + opad[0] = MD5M_A; + opad[1] = MD5M_B; + opad[2] = MD5M_C; + opad[3] = MD5M_D; + + md5_transform (w0, w1, w2, w3, opad); +} + +static void hmac_md5_run (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], u32x ipad[4], u32x opad[4], u32x digest[4]) +{ + digest[0] = ipad[0]; + digest[1] = ipad[1]; + digest[2] = ipad[2]; + digest[3] = ipad[3]; + + md5_transform (w0, w1, w2, w3, digest); + + w0[0] = digest[0]; + w0[1] = digest[1]; + w0[2] = digest[2]; + w0[3] = digest[3]; + w1[0] = 0x80; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + w3[0] = 0; + w3[1] = 0; + w3[2] = (64 + 16) * 8; + w3[3] = 0; + + digest[0] = opad[0]; + digest[1] = opad[1]; + digest[2] = opad[2]; + digest[3] = opad[3]; + + md5_transform (w0, w1, w2, w3, digest); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m00060_m04 (__global pw_t *pws, __global gpu_rule_t * rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + u32x pw_buf1[4]; + + pw_buf1[0] = pws[gid].i[ 4]; + pw_buf1[1] = pws[gid].i[ 5]; + pw_buf1[2] = pws[gid].i[ 6]; + pw_buf1[3] = pws[gid].i[ 7]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[ 1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[ 2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[ 3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[ 4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[ 5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[ 6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[ 7]; + + /** + * pads + */ + + u32x w0_t[4]; + + w0_t[0] = salt_buf0[0]; + w0_t[1] = salt_buf0[1]; + w0_t[2] = salt_buf0[2]; + w0_t[3] = salt_buf0[3]; + + u32x w1_t[4]; + + w1_t[0] = salt_buf1[0]; + w1_t[1] = salt_buf1[1]; + w1_t[2] = salt_buf1[2]; + w1_t[3] = salt_buf1[3]; + + u32x w2_t[4]; + + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + + u32x w3_t[4]; + + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = 0; + + u32x ipad[4]; + u32x opad[4]; + + hmac_md5_pad (w0_t, w1_t, w2_t, w3_t, ipad, opad); + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + + w0[0] = pw_buf0[0]; + w0[1] = pw_buf0[1]; + w0[2] = pw_buf0[2]; + w0[3] = pw_buf0[3]; + + u32x w1[4]; + + w1[0] = pw_buf1[0]; + w1[1] = pw_buf1[1]; + w1[2] = pw_buf1[2]; + w1[3] = pw_buf1[3]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 out_len = apply_rules (rules_buf[il_pos].cmds, w0, w1, pw_len); + + append_0x80_2 (w0, w1, out_len); + + w0_t[0] = w0[0]; + w0_t[1] = w0[1]; + w0_t[2] = w0[2]; + w0_t[3] = w0[3]; + w1_t[0] = w1[0]; + w1_t[1] = w1[1]; + w1_t[2] = w1[2]; + w1_t[3] = w1[3]; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = (64 + out_len) * 8; + w3_t[3] = 0; + + u32x digest[4]; + + hmac_md5_run (w0_t, w1_t, w2_t, w3_t, ipad, opad, digest); + + const u32x r0 = digest[0]; + const u32x r1 = digest[3]; + const u32x r2 = digest[2]; + const u32x r3 = digest[1]; + + #include VECT_COMPARE_M + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m00060_m08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m00060_m16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m00060_s04 (__global pw_t *pws, __global gpu_rule_t * rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + u32x pw_buf1[4]; + + pw_buf1[0] = pws[gid].i[ 4]; + pw_buf1[1] = pws[gid].i[ 5]; + pw_buf1[2] = pws[gid].i[ 6]; + pw_buf1[3] = pws[gid].i[ 7]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[ 1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[ 2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[ 3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[ 4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[ 5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[ 6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[ 7]; + + /** + * pads + */ + + u32x w0_t[4]; + + w0_t[0] = salt_buf0[0]; + w0_t[1] = salt_buf0[1]; + w0_t[2] = salt_buf0[2]; + w0_t[3] = salt_buf0[3]; + + u32x w1_t[4]; + + w1_t[0] = salt_buf1[0]; + w1_t[1] = salt_buf1[1]; + w1_t[2] = salt_buf1[2]; + w1_t[3] = salt_buf1[3]; + + u32x w2_t[4]; + + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + + u32x w3_t[4]; + + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = 0; + + u32x ipad[4]; + u32x opad[4]; + + hmac_md5_pad (w0_t, w1_t, w2_t, w3_t, ipad, opad); + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + + w0[0] = pw_buf0[0]; + w0[1] = pw_buf0[1]; + w0[2] = pw_buf0[2]; + w0[3] = pw_buf0[3]; + + u32x w1[4]; + + w1[0] = pw_buf1[0]; + w1[1] = pw_buf1[1]; + w1[2] = pw_buf1[2]; + w1[3] = pw_buf1[3]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 out_len = apply_rules (rules_buf[il_pos].cmds, w0, w1, pw_len); + + append_0x80_2 (w0, w1, out_len); + + w0_t[0] = w0[0]; + w0_t[1] = w0[1]; + w0_t[2] = w0[2]; + w0_t[3] = w0[3]; + w1_t[0] = w1[0]; + w1_t[1] = w1[1]; + w1_t[2] = w1[2]; + w1_t[3] = w1[3]; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = (64 + out_len) * 8; + w3_t[3] = 0; + + u32x digest[4]; + + hmac_md5_run (w0_t, w1_t, w2_t, w3_t, ipad, opad, digest); + + const u32x r0 = digest[0]; + const u32x r1 = digest[3]; + const u32x r2 = digest[2]; + const u32x r3 = digest[1]; + + #include VECT_COMPARE_S + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m00060_s08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m00060_s16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/amd/m00060_a1.cl b/amd/m00060_a1.cl new file mode 100644 index 0000000000..5a1548e724 --- /dev/null +++ b/amd/m00060_a1.cl @@ -0,0 +1,671 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _MD5_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW4 +#define VECT_SIZE4 +#endif + +#ifdef VLIW5 +#define VECT_SIZE4 +#endif + +#define DGST_R0 0 +#define DGST_R1 3 +#define DGST_R2 2 +#define DGST_R3 1 + +#include "include/kernel_functions.c" +#include "types_amd.c" +#include "common_amd.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +static void md5_transform (const u32x w0[4], const u32x w1[4], const u32x w2[4], const u32x w3[4], u32x digest[4]) +{ + u32x a = digest[0]; + u32x b = digest[1]; + u32x c = digest[2]; + u32x d = digest[3]; + + u32x w0_t = w0[0]; + u32x w1_t = w0[1]; + u32x w2_t = w0[2]; + u32x w3_t = w0[3]; + u32x w4_t = w1[0]; + u32x w5_t = w1[1]; + u32x w6_t = w1[2]; + u32x w7_t = w1[3]; + u32x w8_t = w2[0]; + u32x w9_t = w2[1]; + u32x wa_t = w2[2]; + u32x wb_t = w2[3]; + u32x wc_t = w3[0]; + u32x wd_t = w3[1]; + u32x we_t = w3[2]; + u32x wf_t = w3[3]; + + u32x tmp2; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t, MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t, MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t, MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t, MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w4_t, MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w5_t, MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w6_t, MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w7_t, MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w8_t, MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w9_t, MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, wa_t, MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, wb_t, MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, wc_t, MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, wd_t, MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, we_t, MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, wf_t, MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w1_t, MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w6_t, MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, wb_t, MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t, MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w5_t, MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, wa_t, MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, wf_t, MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w4_t, MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w9_t, MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, we_t, MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t, MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w8_t, MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, wd_t, MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t, MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w7_t, MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, wc_t, MD5C1f, MD5S13); + + MD5_STEP (MD5_H1, a, b, c, d, w5_t, MD5C20, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w8_t, MD5C21, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, wb_t, MD5C22, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, we_t, MD5C23, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w1_t, MD5C24, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w4_t, MD5C25, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w7_t, MD5C26, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, wa_t, MD5C27, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, wd_t, MD5C28, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w0_t, MD5C29, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w3_t, MD5C2a, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w6_t, MD5C2b, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w9_t, MD5C2c, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, wc_t, MD5C2d, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, wf_t, MD5C2e, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w2_t, MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t, MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w7_t, MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, we_t, MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w5_t, MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, wc_t, MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t, MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, wa_t, MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t, MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w8_t, MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, wf_t, MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w6_t, MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, wd_t, MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w4_t, MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, wb_t, MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t, MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w9_t, MD5C3f, MD5S33); + + digest[0] += a; + digest[1] += b; + digest[2] += c; + digest[3] += d; +} + +static void hmac_md5_pad (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], u32x ipad[4], u32x opad[4]) +{ + w0[0] = w0[0] ^ 0x36363636; + w0[1] = w0[1] ^ 0x36363636; + w0[2] = w0[2] ^ 0x36363636; + w0[3] = w0[3] ^ 0x36363636; + w1[0] = w1[0] ^ 0x36363636; + w1[1] = w1[1] ^ 0x36363636; + w1[2] = w1[2] ^ 0x36363636; + w1[3] = w1[3] ^ 0x36363636; + w2[0] = w2[0] ^ 0x36363636; + w2[1] = w2[1] ^ 0x36363636; + w2[2] = w2[2] ^ 0x36363636; + w2[3] = w2[3] ^ 0x36363636; + w3[0] = w3[0] ^ 0x36363636; + w3[1] = w3[1] ^ 0x36363636; + w3[2] = w3[2] ^ 0x36363636; + w3[3] = w3[3] ^ 0x36363636; + + ipad[0] = MD5M_A; + ipad[1] = MD5M_B; + ipad[2] = MD5M_C; + ipad[3] = MD5M_D; + + md5_transform (w0, w1, w2, w3, ipad); + + w0[0] = w0[0] ^ 0x6a6a6a6a; + w0[1] = w0[1] ^ 0x6a6a6a6a; + w0[2] = w0[2] ^ 0x6a6a6a6a; + w0[3] = w0[3] ^ 0x6a6a6a6a; + w1[0] = w1[0] ^ 0x6a6a6a6a; + w1[1] = w1[1] ^ 0x6a6a6a6a; + w1[2] = w1[2] ^ 0x6a6a6a6a; + w1[3] = w1[3] ^ 0x6a6a6a6a; + w2[0] = w2[0] ^ 0x6a6a6a6a; + w2[1] = w2[1] ^ 0x6a6a6a6a; + w2[2] = w2[2] ^ 0x6a6a6a6a; + w2[3] = w2[3] ^ 0x6a6a6a6a; + w3[0] = w3[0] ^ 0x6a6a6a6a; + w3[1] = w3[1] ^ 0x6a6a6a6a; + w3[2] = w3[2] ^ 0x6a6a6a6a; + w3[3] = w3[3] ^ 0x6a6a6a6a; + + opad[0] = MD5M_A; + opad[1] = MD5M_B; + opad[2] = MD5M_C; + opad[3] = MD5M_D; + + md5_transform (w0, w1, w2, w3, opad); +} + +static void hmac_md5_run (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], u32x ipad[4], u32x opad[4], u32x digest[4]) +{ + digest[0] = ipad[0]; + digest[1] = ipad[1]; + digest[2] = ipad[2]; + digest[3] = ipad[3]; + + md5_transform (w0, w1, w2, w3, digest); + + w0[0] = digest[0]; + w0[1] = digest[1]; + w0[2] = digest[2]; + w0[3] = digest[3]; + w1[0] = 0x80; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + w3[0] = 0; + w3[1] = 0; + w3[2] = (64 + 16) * 8; + w3[3] = 0; + + digest[0] = opad[0]; + digest[1] = opad[1]; + digest[2] = opad[2]; + digest[3] = opad[3]; + + md5_transform (w0, w1, w2, w3, digest); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m00060_m04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, combs_buf[0].pw_len); + } + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[ 1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[ 2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[ 3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[ 4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[ 5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[ 6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[ 7]; + + /** + * pads + */ + + u32x w0_t[4]; + + w0_t[0] = salt_buf0[0]; + w0_t[1] = salt_buf0[1]; + w0_t[2] = salt_buf0[2]; + w0_t[3] = salt_buf0[3]; + + u32x w1_t[4]; + + w1_t[0] = salt_buf1[0]; + w1_t[1] = salt_buf1[1]; + w1_t[2] = salt_buf1[2]; + w1_t[3] = salt_buf1[3]; + + u32x w2_t[4]; + + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + + u32x w3_t[4]; + + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = 0; + + u32x ipad[4]; + u32x opad[4]; + + hmac_md5_pad (w0_t, w1_t, w2_t, w3_t, ipad, opad); + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = combs_buf[il_pos].pw_len; + + const u32 pw_len = pw_l_len + pw_r_len; + + u32 wordr0[4]; + + wordr0[0] = combs_buf[il_pos].i[0]; + wordr0[1] = combs_buf[il_pos].i[1]; + wordr0[2] = combs_buf[il_pos].i[2]; + wordr0[3] = combs_buf[il_pos].i[3]; + + u32 wordr1[4]; + + wordr1[0] = combs_buf[il_pos].i[4]; + wordr1[1] = combs_buf[il_pos].i[5]; + wordr1[2] = combs_buf[il_pos].i[6]; + wordr1[3] = combs_buf[il_pos].i[7]; + + u32 wordr2[4]; + + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + + u32 wordr3[4]; + + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + u32x w0[4]; + + w0[0] = wordl0[0] | wordr0[0]; + w0[1] = wordl0[1] | wordr0[1]; + w0[2] = wordl0[2] | wordr0[2]; + w0[3] = wordl0[3] | wordr0[3]; + + u32x w1[4]; + + w1[0] = wordl1[0] | wordr1[0]; + w1[1] = wordl1[1] | wordr1[1]; + w1[2] = wordl1[2] | wordr1[2]; + w1[3] = wordl1[3] | wordr1[3]; + + u32x w2[4]; + + w2[0] = wordl2[0] | wordr2[0]; + w2[1] = wordl2[1] | wordr2[1]; + w2[2] = wordl2[2] | wordr2[2]; + w2[3] = wordl2[3] | wordr2[3]; + + u32x w3[4]; + + w3[0] = wordl3[0] | wordr3[0]; + w3[1] = wordl3[1] | wordr3[1]; + w3[2] = 0; + w3[3] = 0; + + append_0x80_4 (w0, w1, w2, w3, pw_len); + + w0_t[0] = w0[0]; + w0_t[1] = w0[1]; + w0_t[2] = w0[2]; + w0_t[3] = w0[3]; + w1_t[0] = w1[0]; + w1_t[1] = w1[1]; + w1_t[2] = w1[2]; + w1_t[3] = w1[3]; + w2_t[0] = w2[0]; + w2_t[1] = w2[1]; + w2_t[2] = w2[2]; + w2_t[3] = w2[3]; + w3_t[0] = w3[0]; + w3_t[1] = w3[1]; + w3_t[2] = (64 + pw_len) * 8; + w3_t[3] = 0; + + u32x digest[4]; + + hmac_md5_run (w0_t, w1_t, w2_t, w3_t, ipad, opad, digest); + + const u32x r0 = digest[0]; + const u32x r1 = digest[3]; + const u32x r2 = digest[2]; + const u32x r3 = digest[1]; + + #include VECT_COMPARE_M + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m00060_m08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m00060_m16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m00060_s04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, combs_buf[0].pw_len); + } + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[ 1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[ 2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[ 3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[ 4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[ 5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[ 6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[ 7]; + + /** + * pads + */ + + u32x w0_t[4]; + + w0_t[0] = salt_buf0[0]; + w0_t[1] = salt_buf0[1]; + w0_t[2] = salt_buf0[2]; + w0_t[3] = salt_buf0[3]; + + u32x w1_t[4]; + + w1_t[0] = salt_buf1[0]; + w1_t[1] = salt_buf1[1]; + w1_t[2] = salt_buf1[2]; + w1_t[3] = salt_buf1[3]; + + u32x w2_t[4]; + + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + + u32x w3_t[4]; + + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = 0; + + u32x ipad[4]; + u32x opad[4]; + + hmac_md5_pad (w0_t, w1_t, w2_t, w3_t, ipad, opad); + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = combs_buf[il_pos].pw_len; + + const u32 pw_len = pw_l_len + pw_r_len; + + u32 wordr0[4]; + + wordr0[0] = combs_buf[il_pos].i[0]; + wordr0[1] = combs_buf[il_pos].i[1]; + wordr0[2] = combs_buf[il_pos].i[2]; + wordr0[3] = combs_buf[il_pos].i[3]; + + u32 wordr1[4]; + + wordr1[0] = combs_buf[il_pos].i[4]; + wordr1[1] = combs_buf[il_pos].i[5]; + wordr1[2] = combs_buf[il_pos].i[6]; + wordr1[3] = combs_buf[il_pos].i[7]; + + u32 wordr2[4]; + + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + + u32 wordr3[4]; + + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + u32x w0[4]; + + w0[0] = wordl0[0] | wordr0[0]; + w0[1] = wordl0[1] | wordr0[1]; + w0[2] = wordl0[2] | wordr0[2]; + w0[3] = wordl0[3] | wordr0[3]; + + u32x w1[4]; + + w1[0] = wordl1[0] | wordr1[0]; + w1[1] = wordl1[1] | wordr1[1]; + w1[2] = wordl1[2] | wordr1[2]; + w1[3] = wordl1[3] | wordr1[3]; + + u32x w2[4]; + + w2[0] = wordl2[0] | wordr2[0]; + w2[1] = wordl2[1] | wordr2[1]; + w2[2] = wordl2[2] | wordr2[2]; + w2[3] = wordl2[3] | wordr2[3]; + + u32x w3[4]; + + w3[0] = wordl3[0] | wordr3[0]; + w3[1] = wordl3[1] | wordr3[1]; + w3[2] = 0; + w3[3] = 0; + + append_0x80_4 (w0, w1, w2, w3, pw_len); + + w0_t[0] = w0[0]; + w0_t[1] = w0[1]; + w0_t[2] = w0[2]; + w0_t[3] = w0[3]; + w1_t[0] = w1[0]; + w1_t[1] = w1[1]; + w1_t[2] = w1[2]; + w1_t[3] = w1[3]; + w2_t[0] = w2[0]; + w2_t[1] = w2[1]; + w2_t[2] = w2[2]; + w2_t[3] = w2[3]; + w3_t[0] = w3[0]; + w3_t[1] = w3[1]; + w3_t[2] = (64 + pw_len) * 8; + w3_t[3] = 0; + + u32x digest[4]; + + hmac_md5_run (w0_t, w1_t, w2_t, w3_t, ipad, opad, digest); + + const u32x r0 = digest[0]; + const u32x r1 = digest[3]; + const u32x r2 = digest[2]; + const u32x r3 = digest[1]; + + #include VECT_COMPARE_S + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m00060_s08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m00060_s16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/amd/m00060_a3.cl b/amd/m00060_a3.cl new file mode 100644 index 0000000000..0d832d8624 --- /dev/null +++ b/amd/m00060_a3.cl @@ -0,0 +1,735 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _MD5_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW4 +#define VECT_SIZE4 +#endif + +#ifdef VLIW5 +#define VECT_SIZE4 +#endif + +#define DGST_R0 0 +#define DGST_R1 3 +#define DGST_R2 2 +#define DGST_R3 1 + +#include "include/kernel_functions.c" +#include "types_amd.c" +#include "common_amd.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +static void md5_transform (const u32x w0[4], const u32x w1[4], const u32x w2[4], const u32x w3[4], u32x digest[4]) +{ + u32x a = digest[0]; + u32x b = digest[1]; + u32x c = digest[2]; + u32x d = digest[3]; + + u32x w0_t = w0[0]; + u32x w1_t = w0[1]; + u32x w2_t = w0[2]; + u32x w3_t = w0[3]; + u32x w4_t = w1[0]; + u32x w5_t = w1[1]; + u32x w6_t = w1[2]; + u32x w7_t = w1[3]; + u32x w8_t = w2[0]; + u32x w9_t = w2[1]; + u32x wa_t = w2[2]; + u32x wb_t = w2[3]; + u32x wc_t = w3[0]; + u32x wd_t = w3[1]; + u32x we_t = w3[2]; + u32x wf_t = w3[3]; + + u32x tmp2; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t, MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t, MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t, MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t, MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w4_t, MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w5_t, MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w6_t, MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w7_t, MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w8_t, MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w9_t, MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, wa_t, MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, wb_t, MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, wc_t, MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, wd_t, MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, we_t, MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, wf_t, MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w1_t, MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w6_t, MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, wb_t, MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t, MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w5_t, MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, wa_t, MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, wf_t, MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w4_t, MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w9_t, MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, we_t, MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t, MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w8_t, MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, wd_t, MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t, MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w7_t, MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, wc_t, MD5C1f, MD5S13); + + MD5_STEP (MD5_H1, a, b, c, d, w5_t, MD5C20, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w8_t, MD5C21, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, wb_t, MD5C22, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, we_t, MD5C23, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w1_t, MD5C24, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w4_t, MD5C25, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w7_t, MD5C26, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, wa_t, MD5C27, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, wd_t, MD5C28, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w0_t, MD5C29, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w3_t, MD5C2a, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w6_t, MD5C2b, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w9_t, MD5C2c, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, wc_t, MD5C2d, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, wf_t, MD5C2e, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w2_t, MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t, MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w7_t, MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, we_t, MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w5_t, MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, wc_t, MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t, MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, wa_t, MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t, MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w8_t, MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, wf_t, MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w6_t, MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, wd_t, MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w4_t, MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, wb_t, MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t, MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w9_t, MD5C3f, MD5S33); + + digest[0] += a; + digest[1] += b; + digest[2] += c; + digest[3] += d; +} + +static void hmac_md5_pad (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], u32x ipad[4], u32x opad[4]) +{ + w0[0] = w0[0] ^ 0x36363636; + w0[1] = w0[1] ^ 0x36363636; + w0[2] = w0[2] ^ 0x36363636; + w0[3] = w0[3] ^ 0x36363636; + w1[0] = w1[0] ^ 0x36363636; + w1[1] = w1[1] ^ 0x36363636; + w1[2] = w1[2] ^ 0x36363636; + w1[3] = w1[3] ^ 0x36363636; + w2[0] = w2[0] ^ 0x36363636; + w2[1] = w2[1] ^ 0x36363636; + w2[2] = w2[2] ^ 0x36363636; + w2[3] = w2[3] ^ 0x36363636; + w3[0] = w3[0] ^ 0x36363636; + w3[1] = w3[1] ^ 0x36363636; + w3[2] = w3[2] ^ 0x36363636; + w3[3] = w3[3] ^ 0x36363636; + + ipad[0] = MD5M_A; + ipad[1] = MD5M_B; + ipad[2] = MD5M_C; + ipad[3] = MD5M_D; + + md5_transform (w0, w1, w2, w3, ipad); + + w0[0] = w0[0] ^ 0x6a6a6a6a; + w0[1] = w0[1] ^ 0x6a6a6a6a; + w0[2] = w0[2] ^ 0x6a6a6a6a; + w0[3] = w0[3] ^ 0x6a6a6a6a; + w1[0] = w1[0] ^ 0x6a6a6a6a; + w1[1] = w1[1] ^ 0x6a6a6a6a; + w1[2] = w1[2] ^ 0x6a6a6a6a; + w1[3] = w1[3] ^ 0x6a6a6a6a; + w2[0] = w2[0] ^ 0x6a6a6a6a; + w2[1] = w2[1] ^ 0x6a6a6a6a; + w2[2] = w2[2] ^ 0x6a6a6a6a; + w2[3] = w2[3] ^ 0x6a6a6a6a; + w3[0] = w3[0] ^ 0x6a6a6a6a; + w3[1] = w3[1] ^ 0x6a6a6a6a; + w3[2] = w3[2] ^ 0x6a6a6a6a; + w3[3] = w3[3] ^ 0x6a6a6a6a; + + opad[0] = MD5M_A; + opad[1] = MD5M_B; + opad[2] = MD5M_C; + opad[3] = MD5M_D; + + md5_transform (w0, w1, w2, w3, opad); +} + +static void hmac_md5_run (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], u32x ipad[4], u32x opad[4], u32x digest[4]) +{ + digest[0] = ipad[0]; + digest[1] = ipad[1]; + digest[2] = ipad[2]; + digest[3] = ipad[3]; + + md5_transform (w0, w1, w2, w3, digest); + + w0[0] = digest[0]; + w0[1] = digest[1]; + w0[2] = digest[2]; + w0[3] = digest[3]; + w1[0] = 0x80; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + w3[0] = 0; + w3[1] = 0; + w3[2] = (64 + 16) * 8; + w3[3] = 0; + + digest[0] = opad[0]; + digest[1] = opad[1]; + digest[2] = opad[2]; + digest[3] = opad[3]; + + md5_transform (w0, w1, w2, w3, digest); +} + +static void m00060m (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], const u32 pw_len, __global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esal_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset) +{ + /** + * modifier + */ + + const u32 gid = get_global_id (0); + const u32 lid = get_local_id (0); + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[ 1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[ 2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[ 3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[ 4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[ 5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[ 6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[ 7]; + + /** + * pads + */ + + u32x w0_t[4]; + + w0_t[0] = salt_buf0[0]; + w0_t[1] = salt_buf0[1]; + w0_t[2] = salt_buf0[2]; + w0_t[3] = salt_buf0[3]; + + u32x w1_t[4]; + + w1_t[0] = salt_buf1[0]; + w1_t[1] = salt_buf1[1]; + w1_t[2] = salt_buf1[2]; + w1_t[3] = salt_buf1[3]; + + u32x w2_t[4]; + + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + + u32x w3_t[4]; + + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = 0; + + u32x ipad[4]; + u32x opad[4]; + + hmac_md5_pad (w0_t, w1_t, w2_t, w3_t, ipad, opad); + + /** + * loop + */ + + u32x w0l = w0[0]; + + for (u32 il_pos = 0; il_pos < bfs_cnt; il_pos++) + { + const u32 w0r = bfs_buf[il_pos].i; + + w0[0] = w0l | w0r; + + append_0x80_4 (w0, w1, w2, w3, pw_len); + + w0_t[0] = w0[0]; + w0_t[1] = w0[1]; + w0_t[2] = w0[2]; + w0_t[3] = w0[3]; + w1_t[0] = w1[0]; + w1_t[1] = w1[1]; + w1_t[2] = w1[2]; + w1_t[3] = w1[3]; + w2_t[0] = w2[0]; + w2_t[1] = w2[1]; + w2_t[2] = w2[2]; + w2_t[3] = w2[3]; + w3_t[0] = w3[0]; + w3_t[1] = w3[1]; + w3_t[2] = (64 + pw_len) * 8; + w3_t[3] = 0; + + u32x digest[4]; + + hmac_md5_run (w0_t, w1_t, w2_t, w3_t, ipad, opad, digest); + + const u32x r0 = digest[0]; + const u32x r1 = digest[3]; + const u32x r2 = digest[2]; + const u32x r3 = digest[1]; + + #include VECT_COMPARE_M + } +} + +static void m00060s (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], const u32 pw_len, __global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset) +{ + /** + * modifier + */ + + const u32 gid = get_global_id (0); + const u32 lid = get_local_id (0); + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[ 1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[ 2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[ 3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[ 4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[ 5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[ 6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[ 7]; + + /** + * pads + */ + + u32x w0_t[4]; + + w0_t[0] = salt_buf0[0]; + w0_t[1] = salt_buf0[1]; + w0_t[2] = salt_buf0[2]; + w0_t[3] = salt_buf0[3]; + + u32x w1_t[4]; + + w1_t[0] = salt_buf1[0]; + w1_t[1] = salt_buf1[1]; + w1_t[2] = salt_buf1[2]; + w1_t[3] = salt_buf1[3]; + + u32x w2_t[4]; + + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + + u32x w3_t[4]; + + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = 0; + + u32x ipad[4]; + u32x opad[4]; + + hmac_md5_pad (w0_t, w1_t, w2_t, w3_t, ipad, opad); + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * loop + */ + + u32x w0l = w0[0]; + + for (u32 il_pos = 0; il_pos < bfs_cnt; il_pos++) + { + const u32 w0r = bfs_buf[il_pos].i; + + w0[0] = w0l | w0r; + + append_0x80_4 (w0, w1, w2, w3, pw_len); + + w0_t[0] = w0[0]; + w0_t[1] = w0[1]; + w0_t[2] = w0[2]; + w0_t[3] = w0[3]; + w1_t[0] = w1[0]; + w1_t[1] = w1[1]; + w1_t[2] = w1[2]; + w1_t[3] = w1[3]; + w2_t[0] = w2[0]; + w2_t[1] = w2[1]; + w2_t[2] = w2[2]; + w2_t[3] = w2[3]; + w3_t[0] = w3[0]; + w3_t[1] = w3[1]; + w3_t[2] = (64 + pw_len) * 8; + w3_t[3] = 0; + + u32x digest[4]; + + hmac_md5_run (w0_t, w1_t, w2_t, w3_t, ipad, opad, digest); + + const u32x r0 = digest[0]; + const u32x r1 = digest[3]; + const u32x r2 = digest[2]; + const u32x r3 = digest[1]; + + #include VECT_COMPARE_S + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m00060_m04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m00060m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m00060_m08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m00060m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m00060_m16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = pws[gid].i[ 8]; + w2[1] = pws[gid].i[ 9]; + w2[2] = pws[gid].i[10]; + w2[3] = pws[gid].i[11]; + + u32x w3[4]; + + w3[0] = pws[gid].i[12]; + w3[1] = pws[gid].i[13]; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m00060m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m00060_s04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m00060s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m00060_s08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m00060s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m00060_s16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = pws[gid].i[ 8]; + w2[1] = pws[gid].i[ 9]; + w2[2] = pws[gid].i[10]; + w2[3] = pws[gid].i[11]; + + u32x w3[4]; + + w3[0] = pws[gid].i[12]; + w3[1] = pws[gid].i[13]; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m00060s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} diff --git a/amd/m00100_a0.cl b/amd/m00100_a0.cl new file mode 100644 index 0000000000..1bdbecfb0b --- /dev/null +++ b/amd/m00100_a0.cl @@ -0,0 +1,490 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _SHA1_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW4 +#define VECT_SIZE4 +#endif + +#ifdef VLIW5 +#define VECT_SIZE4 +#endif + +#define DGST_R0 3 +#define DGST_R1 4 +#define DGST_R2 2 +#define DGST_R3 1 + +#include "include/kernel_functions.c" +#include "types_amd.c" +#include "common_amd.c" +#include "include/rp_gpu.h" +#include "rp_amd.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m00100_m04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + u32x pw_buf1[4]; + + pw_buf1[0] = pws[gid].i[ 4]; + pw_buf1[1] = pws[gid].i[ 5]; + pw_buf1[2] = pws[gid].i[ 6]; + pw_buf1[3] = pws[gid].i[ 7]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + + w0[0] = pw_buf0[0]; + w0[1] = pw_buf0[1]; + w0[2] = pw_buf0[2]; + w0[3] = pw_buf0[3]; + + u32x w1[4]; + + w1[0] = pw_buf1[0]; + w1[1] = pw_buf1[1]; + w1[2] = pw_buf1[2]; + w1[3] = pw_buf1[3]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 out_len = apply_rules (rules_buf[il_pos].cmds, w0, w1, pw_len); + + append_0x80_2 (w0, w1, out_len); + + /** + * sha1 + */ + + u32x w0_t = swap_workaround (w0[0]); + u32x w1_t = swap_workaround (w0[1]); + u32x w2_t = swap_workaround (w0[2]); + u32x w3_t = swap_workaround (w0[3]); + u32x w4_t = swap_workaround (w1[0]); + u32x w5_t = swap_workaround (w1[1]); + u32x w6_t = swap_workaround (w1[2]); + u32x w7_t = swap_workaround (w1[3]); + u32x w8_t = swap_workaround (w2[0]); + u32x w9_t = swap_workaround (w2[1]); + u32x wa_t = swap_workaround (w2[2]); + u32x wb_t = swap_workaround (w2[3]); + u32x wc_t = swap_workaround (w3[0]); + u32x wd_t = swap_workaround (w3[1]); + u32x we_t = 0; + u32x wf_t = out_len * 8; + + u32x a = SHA1M_A; + u32x b = SHA1M_B; + u32x c = SHA1M_C; + u32x d = SHA1M_D; + u32x e = SHA1M_E; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w0_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w1_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w2_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w3_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w4_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w5_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w6_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w7_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w8_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w9_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wa_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, wb_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, wc_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, wd_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, we_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F0o, e, a, b, c, d, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F0o, d, e, a, b, c, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F0o, c, d, e, a, b, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F0o, b, c, d, e, a, w3_t); + + #undef K + #define K SHA1C01 + + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w7_t); + + #undef K + #define K SHA1C02 + + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wb_t); + + #undef K + #define K SHA1C03 + + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wf_t); + + + const u32x r0 = d; + const u32x r1 = e; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_M + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m00100_m08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m00100_m16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m00100_s04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + u32x pw_buf1[4]; + + pw_buf1[0] = pws[gid].i[ 4]; + pw_buf1[1] = pws[gid].i[ 5]; + pw_buf1[2] = pws[gid].i[ 6]; + pw_buf1[3] = pws[gid].i[ 7]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * reverse + */ + + const u32 e_rev = rotl32 (search[1], 2u); + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + + w0[0] = pw_buf0[0]; + w0[1] = pw_buf0[1]; + w0[2] = pw_buf0[2]; + w0[3] = pw_buf0[3]; + + u32x w1[4]; + + w1[0] = pw_buf1[0]; + w1[1] = pw_buf1[1]; + w1[2] = pw_buf1[2]; + w1[3] = pw_buf1[3]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 out_len = apply_rules (rules_buf[il_pos].cmds, w0, w1, pw_len); + + append_0x80_2 (w0, w1, out_len); + + /** + * sha1 + */ + + u32x w0_t = swap_workaround (w0[0]); + u32x w1_t = swap_workaround (w0[1]); + u32x w2_t = swap_workaround (w0[2]); + u32x w3_t = swap_workaround (w0[3]); + u32x w4_t = swap_workaround (w1[0]); + u32x w5_t = swap_workaround (w1[1]); + u32x w6_t = swap_workaround (w1[2]); + u32x w7_t = swap_workaround (w1[3]); + u32x w8_t = swap_workaround (w2[0]); + u32x w9_t = swap_workaround (w2[1]); + u32x wa_t = swap_workaround (w2[2]); + u32x wb_t = swap_workaround (w2[3]); + u32x wc_t = swap_workaround (w3[0]); + u32x wd_t = swap_workaround (w3[1]); + u32x we_t = 0; + u32x wf_t = out_len * 8; + + u32x a = SHA1M_A; + u32x b = SHA1M_B; + u32x c = SHA1M_C; + u32x d = SHA1M_D; + u32x e = SHA1M_E; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w0_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w1_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w2_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w3_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w4_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w5_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w6_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w7_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w8_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w9_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wa_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, wb_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, wc_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, wd_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, we_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F0o, e, a, b, c, d, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F0o, d, e, a, b, c, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F0o, c, d, e, a, b, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F0o, b, c, d, e, a, w3_t); + + #undef K + #define K SHA1C01 + + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w7_t); + + #undef K + #define K SHA1C02 + + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wb_t); + + #undef K + #define K SHA1C03 + + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wb_t); + + if (allx (e != e_rev)) continue; + + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wf_t); + + + const u32x r0 = d; + const u32x r1 = e; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_S + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m00100_s08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m00100_s16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/amd/m00100_a1.cl b/amd/m00100_a1.cl new file mode 100644 index 0000000000..c2c8b60d6d --- /dev/null +++ b/amd/m00100_a1.cl @@ -0,0 +1,600 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _SHA1_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW4 +#define VECT_SIZE4 +#endif + +#ifdef VLIW5 +#define VECT_SIZE4 +#endif + +#define DGST_R0 3 +#define DGST_R1 4 +#define DGST_R2 2 +#define DGST_R3 1 + +#include "include/kernel_functions.c" +#include "types_amd.c" +#include "common_amd.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m00100_m04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + append_0x80_2 (wordl0, wordl1, pw_l_len); + + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, combs_buf[0].pw_len); + } + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = combs_buf[il_pos].pw_len; + + const u32 pw_len = pw_l_len + pw_r_len; + + u32 wordr0[4]; + + wordr0[0] = combs_buf[il_pos].i[0]; + wordr0[1] = combs_buf[il_pos].i[1]; + wordr0[2] = combs_buf[il_pos].i[2]; + wordr0[3] = combs_buf[il_pos].i[3]; + + u32 wordr1[4]; + + wordr1[0] = combs_buf[il_pos].i[4]; + wordr1[1] = combs_buf[il_pos].i[5]; + wordr1[2] = combs_buf[il_pos].i[6]; + wordr1[3] = combs_buf[il_pos].i[7]; + + u32 wordr2[4]; + + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + + u32 wordr3[4]; + + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + append_0x80_2 (wordr0, wordr1, pw_r_len); + + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + u32x w0[4]; + + w0[0] = wordl0[0] | wordr0[0]; + w0[1] = wordl0[1] | wordr0[1]; + w0[2] = wordl0[2] | wordr0[2]; + w0[3] = wordl0[3] | wordr0[3]; + + u32x w1[4]; + + w1[0] = wordl1[0] | wordr1[0]; + w1[1] = wordl1[1] | wordr1[1]; + w1[2] = wordl1[2] | wordr1[2]; + w1[3] = wordl1[3] | wordr1[3]; + + u32x w2[4]; + + w2[0] = wordl2[0] | wordr2[0]; + w2[1] = wordl2[1] | wordr2[1]; + w2[2] = wordl2[2] | wordr2[2]; + w2[3] = wordl2[3] | wordr2[3]; + + u32x w3[4]; + + w3[0] = wordl3[0] | wordr3[0]; + w3[1] = wordl3[1] | wordr3[1]; + w3[2] = 0; + w3[3] = 0; + + /** + * sha1 + */ + + u32x w0_t = swap_workaround (w0[0]); + u32x w1_t = swap_workaround (w0[1]); + u32x w2_t = swap_workaround (w0[2]); + u32x w3_t = swap_workaround (w0[3]); + u32x w4_t = swap_workaround (w1[0]); + u32x w5_t = swap_workaround (w1[1]); + u32x w6_t = swap_workaround (w1[2]); + u32x w7_t = swap_workaround (w1[3]); + u32x w8_t = swap_workaround (w2[0]); + u32x w9_t = swap_workaround (w2[1]); + u32x wa_t = swap_workaround (w2[2]); + u32x wb_t = swap_workaround (w2[3]); + u32x wc_t = swap_workaround (w3[0]); + u32x wd_t = swap_workaround (w3[1]); + u32x we_t = 0; + u32x wf_t = pw_len * 8; + + u32x a = SHA1M_A; + u32x b = SHA1M_B; + u32x c = SHA1M_C; + u32x d = SHA1M_D; + u32x e = SHA1M_E; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w0_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w1_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w2_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w3_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w4_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w5_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w6_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w7_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w8_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w9_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wa_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, wb_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, wc_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, wd_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, we_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F0o, e, a, b, c, d, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F0o, d, e, a, b, c, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F0o, c, d, e, a, b, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F0o, b, c, d, e, a, w3_t); + + #undef K + #define K SHA1C01 + + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w7_t); + + #undef K + #define K SHA1C02 + + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wb_t); + + #undef K + #define K SHA1C03 + + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wf_t); + + + const u32x r0 = d; + const u32x r1 = e; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_M + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m00100_m08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m00100_m16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m00100_s04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + append_0x80_2 (wordl0, wordl1, pw_l_len); + + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, combs_buf[0].pw_len); + } + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * reverse + */ + + const u32 e_rev = rotl32 (search[1], 2u); + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = combs_buf[il_pos].pw_len; + + const u32 pw_len = pw_l_len + pw_r_len; + + u32 wordr0[4]; + + wordr0[0] = combs_buf[il_pos].i[0]; + wordr0[1] = combs_buf[il_pos].i[1]; + wordr0[2] = combs_buf[il_pos].i[2]; + wordr0[3] = combs_buf[il_pos].i[3]; + + u32 wordr1[4]; + + wordr1[0] = combs_buf[il_pos].i[4]; + wordr1[1] = combs_buf[il_pos].i[5]; + wordr1[2] = combs_buf[il_pos].i[6]; + wordr1[3] = combs_buf[il_pos].i[7]; + + u32 wordr2[4]; + + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + + u32 wordr3[4]; + + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + append_0x80_2 (wordr0, wordr1, pw_r_len); + + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + u32x w0[4]; + + w0[0] = wordl0[0] | wordr0[0]; + w0[1] = wordl0[1] | wordr0[1]; + w0[2] = wordl0[2] | wordr0[2]; + w0[3] = wordl0[3] | wordr0[3]; + + u32x w1[4]; + + w1[0] = wordl1[0] | wordr1[0]; + w1[1] = wordl1[1] | wordr1[1]; + w1[2] = wordl1[2] | wordr1[2]; + w1[3] = wordl1[3] | wordr1[3]; + + u32x w2[4]; + + w2[0] = wordl2[0] | wordr2[0]; + w2[1] = wordl2[1] | wordr2[1]; + w2[2] = wordl2[2] | wordr2[2]; + w2[3] = wordl2[3] | wordr2[3]; + + u32x w3[4]; + + w3[0] = wordl3[0] | wordr3[0]; + w3[1] = wordl3[1] | wordr3[1]; + w3[2] = 0; + w3[3] = 0; + + /** + * sha1 + */ + + u32x w0_t = swap_workaround (w0[0]); + u32x w1_t = swap_workaround (w0[1]); + u32x w2_t = swap_workaround (w0[2]); + u32x w3_t = swap_workaround (w0[3]); + u32x w4_t = swap_workaround (w1[0]); + u32x w5_t = swap_workaround (w1[1]); + u32x w6_t = swap_workaround (w1[2]); + u32x w7_t = swap_workaround (w1[3]); + u32x w8_t = swap_workaround (w2[0]); + u32x w9_t = swap_workaround (w2[1]); + u32x wa_t = swap_workaround (w2[2]); + u32x wb_t = swap_workaround (w2[3]); + u32x wc_t = swap_workaround (w3[0]); + u32x wd_t = swap_workaround (w3[1]); + u32x we_t = 0; + u32x wf_t = pw_len * 8; + + u32x a = SHA1M_A; + u32x b = SHA1M_B; + u32x c = SHA1M_C; + u32x d = SHA1M_D; + u32x e = SHA1M_E; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w0_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w1_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w2_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w3_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w4_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w5_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w6_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w7_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w8_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w9_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wa_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, wb_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, wc_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, wd_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, we_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F0o, e, a, b, c, d, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F0o, d, e, a, b, c, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F0o, c, d, e, a, b, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F0o, b, c, d, e, a, w3_t); + + #undef K + #define K SHA1C01 + + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w7_t); + + #undef K + #define K SHA1C02 + + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wb_t); + + #undef K + #define K SHA1C03 + + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wb_t); + + if (allx (e != e_rev)) continue; + + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wf_t); + + + const u32x r0 = d; + const u32x r1 = e; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_S + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m00100_s08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m00100_s16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/amd/m00100_a3.cl b/amd/m00100_a3.cl new file mode 100644 index 0000000000..53e8e61c86 --- /dev/null +++ b/amd/m00100_a3.cl @@ -0,0 +1,803 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _SHA1_ +#define _SCALAR_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW4 +#define VECT_SIZE4 +#endif + +#ifdef VLIW5 +#define VECT_SIZE4 +#endif + +#define DGST_R0 3 +#define DGST_R1 4 +#define DGST_R2 2 +#define DGST_R3 1 + +#include "include/kernel_functions.c" +#include "types_amd.c" +#include "common_amd.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4_warp.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4_warp.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4_warp.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4_warp.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4_warp.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4_warp.c" +#endif + +static void m00100m (u32 w[16], const u32 pw_len, __global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global u32x * words_buf_r, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset) +{ + /** + * modifier + */ + + const u32 gid = get_global_id (0); + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 c_16s = rotl32 ((w[13] ^ w[ 8] ^ w[ 2] ), 1u); + const u32 c_17s = rotl32 ((w[14] ^ w[ 9] ^ w[ 3] ^ w[ 1]), 1u); + const u32 c_18s = rotl32 ((w[15] ^ w[10] ^ w[ 4] ^ w[ 2]), 1u); + const u32 c_19s = rotl32 ((c_16s ^ w[11] ^ w[ 5] ^ w[ 3]), 1u); + const u32 c_20s = rotl32 ((c_17s ^ w[12] ^ w[ 6] ^ w[ 4]), 1u); + const u32 c_21s = rotl32 ((c_18s ^ w[13] ^ w[ 7] ^ w[ 5]), 1u); + const u32 c_22s = rotl32 ((c_19s ^ w[14] ^ w[ 8] ^ w[ 6]), 1u); + const u32 c_23s = rotl32 ((c_20s ^ w[15] ^ w[ 9] ^ w[ 7]), 1u); + const u32 c_24s = rotl32 ((c_21s ^ c_16s ^ w[10] ^ w[ 8]), 1u); + const u32 c_25s = rotl32 ((c_22s ^ c_17s ^ w[11] ^ w[ 9]), 1u); + const u32 c_26s = rotl32 ((c_23s ^ c_18s ^ w[12] ^ w[10]), 1u); + const u32 c_27s = rotl32 ((c_24s ^ c_19s ^ w[13] ^ w[11]), 1u); + const u32 c_28s = rotl32 ((c_25s ^ c_20s ^ w[14] ^ w[12]), 1u); + const u32 c_29s = rotl32 ((c_26s ^ c_21s ^ w[15] ^ w[13]), 1u); + const u32 c_30s = rotl32 ((c_27s ^ c_22s ^ c_16s ^ w[14]), 1u); + const u32 c_31s = rotl32 ((c_28s ^ c_23s ^ c_17s ^ w[15]), 1u); + const u32 c_32s = rotl32 ((c_29s ^ c_24s ^ c_18s ^ c_16s), 1u); + const u32 c_33s = rotl32 ((c_30s ^ c_25s ^ c_19s ^ c_17s), 1u); + const u32 c_34s = rotl32 ((c_31s ^ c_26s ^ c_20s ^ c_18s), 1u); + const u32 c_35s = rotl32 ((c_32s ^ c_27s ^ c_21s ^ c_19s), 1u); + const u32 c_36s = rotl32 ((c_33s ^ c_28s ^ c_22s ^ c_20s), 1u); + const u32 c_37s = rotl32 ((c_34s ^ c_29s ^ c_23s ^ c_21s), 1u); + const u32 c_38s = rotl32 ((c_35s ^ c_30s ^ c_24s ^ c_22s), 1u); + const u32 c_39s = rotl32 ((c_36s ^ c_31s ^ c_25s ^ c_23s), 1u); + const u32 c_40s = rotl32 ((c_37s ^ c_32s ^ c_26s ^ c_24s), 1u); + const u32 c_41s = rotl32 ((c_38s ^ c_33s ^ c_27s ^ c_25s), 1u); + const u32 c_42s = rotl32 ((c_39s ^ c_34s ^ c_28s ^ c_26s), 1u); + const u32 c_43s = rotl32 ((c_40s ^ c_35s ^ c_29s ^ c_27s), 1u); + const u32 c_44s = rotl32 ((c_41s ^ c_36s ^ c_30s ^ c_28s), 1u); + const u32 c_45s = rotl32 ((c_42s ^ c_37s ^ c_31s ^ c_29s), 1u); + const u32 c_46s = rotl32 ((c_43s ^ c_38s ^ c_32s ^ c_30s), 1u); + const u32 c_47s = rotl32 ((c_44s ^ c_39s ^ c_33s ^ c_31s), 1u); + const u32 c_48s = rotl32 ((c_45s ^ c_40s ^ c_34s ^ c_32s), 1u); + const u32 c_49s = rotl32 ((c_46s ^ c_41s ^ c_35s ^ c_33s), 1u); + const u32 c_50s = rotl32 ((c_47s ^ c_42s ^ c_36s ^ c_34s), 1u); + const u32 c_51s = rotl32 ((c_48s ^ c_43s ^ c_37s ^ c_35s), 1u); + const u32 c_52s = rotl32 ((c_49s ^ c_44s ^ c_38s ^ c_36s), 1u); + const u32 c_53s = rotl32 ((c_50s ^ c_45s ^ c_39s ^ c_37s), 1u); + const u32 c_54s = rotl32 ((c_51s ^ c_46s ^ c_40s ^ c_38s), 1u); + const u32 c_55s = rotl32 ((c_52s ^ c_47s ^ c_41s ^ c_39s), 1u); + const u32 c_56s = rotl32 ((c_53s ^ c_48s ^ c_42s ^ c_40s), 1u); + const u32 c_57s = rotl32 ((c_54s ^ c_49s ^ c_43s ^ c_41s), 1u); + const u32 c_58s = rotl32 ((c_55s ^ c_50s ^ c_44s ^ c_42s), 1u); + const u32 c_59s = rotl32 ((c_56s ^ c_51s ^ c_45s ^ c_43s), 1u); + const u32 c_60s = rotl32 ((c_57s ^ c_52s ^ c_46s ^ c_44s), 1u); + const u32 c_61s = rotl32 ((c_58s ^ c_53s ^ c_47s ^ c_45s), 1u); + const u32 c_62s = rotl32 ((c_59s ^ c_54s ^ c_48s ^ c_46s), 1u); + const u32 c_63s = rotl32 ((c_60s ^ c_55s ^ c_49s ^ c_47s), 1u); + const u32 c_64s = rotl32 ((c_61s ^ c_56s ^ c_50s ^ c_48s), 1u); + const u32 c_65s = rotl32 ((c_62s ^ c_57s ^ c_51s ^ c_49s), 1u); + const u32 c_66s = rotl32 ((c_63s ^ c_58s ^ c_52s ^ c_50s), 1u); + const u32 c_67s = rotl32 ((c_64s ^ c_59s ^ c_53s ^ c_51s), 1u); + const u32 c_68s = rotl32 ((c_65s ^ c_60s ^ c_54s ^ c_52s), 1u); + const u32 c_69s = rotl32 ((c_66s ^ c_61s ^ c_55s ^ c_53s), 1u); + const u32 c_70s = rotl32 ((c_67s ^ c_62s ^ c_56s ^ c_54s), 1u); + const u32 c_71s = rotl32 ((c_68s ^ c_63s ^ c_57s ^ c_55s), 1u); + const u32 c_72s = rotl32 ((c_69s ^ c_64s ^ c_58s ^ c_56s), 1u); + const u32 c_73s = rotl32 ((c_70s ^ c_65s ^ c_59s ^ c_57s), 1u); + const u32 c_74s = rotl32 ((c_71s ^ c_66s ^ c_60s ^ c_58s), 1u); + const u32 c_75s = rotl32 ((c_72s ^ c_67s ^ c_61s ^ c_59s), 1u); + + const u32 c_17sK = c_17s + SHA1C00; + const u32 c_18sK = c_18s + SHA1C00; + const u32 c_20sK = c_20s + SHA1C01; + const u32 c_21sK = c_21s + SHA1C01; + const u32 c_23sK = c_23s + SHA1C01; + const u32 c_26sK = c_26s + SHA1C01; + const u32 c_27sK = c_27s + SHA1C01; + const u32 c_29sK = c_29s + SHA1C01; + const u32 c_33sK = c_33s + SHA1C01; + const u32 c_39sK = c_39s + SHA1C01; + const u32 c_41sK = c_41s + SHA1C02; + const u32 c_45sK = c_45s + SHA1C02; + const u32 c_53sK = c_53s + SHA1C02; + const u32 c_65sK = c_65s + SHA1C03; + const u32 c_69sK = c_69s + SHA1C03; + + /** + * loop + */ + + const u32 bf_loops = ceil ((float) bfs_cnt / VECT_DIV); + + u32x w0l = w[0]; + + for (u32 il_pos = 0; il_pos < bf_loops; il_pos++) + { + const u32x w0r = words_buf_r[il_pos]; + + const u32x w0 = w0l | w0r; + + const u32x w0s01 = rotl32 (w0, 1u); + const u32x w0s02 = rotl32 (w0, 2u); + const u32x w0s03 = rotl32 (w0, 3u); + const u32x w0s04 = rotl32 (w0, 4u); + const u32x w0s05 = rotl32 (w0, 5u); + const u32x w0s06 = rotl32 (w0, 6u); + const u32x w0s07 = rotl32 (w0, 7u); + const u32x w0s08 = rotl32 (w0, 8u); + const u32x w0s09 = rotl32 (w0, 9u); + const u32x w0s10 = rotl32 (w0, 10u); + const u32x w0s11 = rotl32 (w0, 11u); + const u32x w0s12 = rotl32 (w0, 12u); + const u32x w0s13 = rotl32 (w0, 13u); + const u32x w0s14 = rotl32 (w0, 14u); + const u32x w0s15 = rotl32 (w0, 15u); + const u32x w0s16 = rotl32 (w0, 16u); + const u32x w0s17 = rotl32 (w0, 17u); + const u32x w0s18 = rotl32 (w0, 18u); + const u32x w0s19 = rotl32 (w0, 19u); + const u32x w0s20 = rotl32 (w0, 20u); + + const u32x w0s04___w0s06 = w0s04 ^ w0s06; + const u32x w0s04___w0s08 = w0s04 ^ w0s08; + const u32x w0s08___w0s12 = w0s08 ^ w0s12; + const u32x w0s04___w0s06___w0s07 = w0s04___w0s06 ^ w0s07; + + u32x a = SHA1M_A; + u32x b = SHA1M_B; + u32x c = SHA1M_C; + u32x d = SHA1M_D; + u32x e = SHA1M_E; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w0); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w[ 1]); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w[ 2]); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w[ 3]); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w[ 4]); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w[ 5]); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w[ 6]); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w[ 7]); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w[ 8]); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w[ 9]); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w[10]); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w[11]); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w[12]); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w[13]); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w[14]); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w[15]); + + SHA1_STEP (SHA1_F0o, e, a, b, c, d, (c_16s ^ w0s01)); + SHA1_STEPX(SHA1_F0o, d, e, a, b, c, (c_17sK)); + SHA1_STEPX(SHA1_F0o, c, d, e, a, b, (c_18sK)); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, (c_19s ^ w0s02)); + + #undef K + #define K SHA1C01 + + SHA1_STEPX(SHA1_F1 , a, b, c, d, e, (c_20sK)); + SHA1_STEPX(SHA1_F1 , e, a, b, c, d, (c_21sK)); + SHA1_STEP (SHA1_F1 , d, e, a, b, c, (c_22s ^ w0s03)); + SHA1_STEPX(SHA1_F1 , c, d, e, a, b, (c_23sK)); + SHA1_STEP (SHA1_F1 , b, c, d, e, a, (c_24s ^ w0s02)); + SHA1_STEP (SHA1_F1 , a, b, c, d, e, (c_25s ^ w0s04)); + SHA1_STEPX(SHA1_F1 , e, a, b, c, d, (c_26sK)); + SHA1_STEPX(SHA1_F1 , d, e, a, b, c, (c_27sK)); + SHA1_STEP (SHA1_F1 , c, d, e, a, b, (c_28s ^ w0s05)); + SHA1_STEPX(SHA1_F1 , b, c, d, e, a, (c_29sK)); + SHA1_STEP (SHA1_F1 , a, b, c, d, e, (c_30s ^ w0s02 ^ w0s04)); + SHA1_STEP (SHA1_F1 , e, a, b, c, d, (c_31s ^ w0s06)); + SHA1_STEP (SHA1_F1 , d, e, a, b, c, (c_32s ^ w0s02 ^ w0s03)); + SHA1_STEPX(SHA1_F1 , c, d, e, a, b, (c_33sK)); + SHA1_STEP (SHA1_F1 , b, c, d, e, a, (c_34s ^ w0s07)); + SHA1_STEP (SHA1_F1 , a, b, c, d, e, (c_35s ^ w0s04)); + SHA1_STEP (SHA1_F1 , e, a, b, c, d, (c_36s ^ w0s04___w0s06)); + SHA1_STEP (SHA1_F1 , d, e, a, b, c, (c_37s ^ w0s08)); + SHA1_STEP (SHA1_F1 , c, d, e, a, b, (c_38s ^ w0s04)); + SHA1_STEPX(SHA1_F1 , b, c, d, e, a, (c_39sK)); + + #undef K + #define K SHA1C02 + + SHA1_STEP (SHA1_F2o, a, b, c, d, e, (c_40s ^ w0s04 ^ w0s09)); + SHA1_STEPX(SHA1_F2o, e, a, b, c, d, (c_41sK)); + SHA1_STEP (SHA1_F2o, d, e, a, b, c, (c_42s ^ w0s06 ^ w0s08)); + SHA1_STEP (SHA1_F2o, c, d, e, a, b, (c_43s ^ w0s10)); + SHA1_STEP (SHA1_F2o, b, c, d, e, a, (c_44s ^ w0s03 ^ w0s06 ^ w0s07)); + SHA1_STEPX(SHA1_F2o, a, b, c, d, e, (c_45sK)); + SHA1_STEP (SHA1_F2o, e, a, b, c, d, (c_46s ^ w0s04 ^ w0s11)); + SHA1_STEP (SHA1_F2o, d, e, a, b, c, (c_47s ^ w0s04___w0s08)); + SHA1_STEP (SHA1_F2o, c, d, e, a, b, (c_48s ^ w0s03 ^ w0s04___w0s08 ^ w0s05 ^ w0s10)); + SHA1_STEP (SHA1_F2o, b, c, d, e, a, (c_49s ^ w0s12)); + SHA1_STEP (SHA1_F2o, a, b, c, d, e, (c_50s ^ w0s08)); + SHA1_STEP (SHA1_F2o, e, a, b, c, d, (c_51s ^ w0s04___w0s06)); + SHA1_STEP (SHA1_F2o, d, e, a, b, c, (c_52s ^ w0s04___w0s08 ^ w0s13)); + SHA1_STEPX(SHA1_F2o, c, d, e, a, b, (c_53sK)); + SHA1_STEP (SHA1_F2o, b, c, d, e, a, (c_54s ^ w0s07 ^ w0s10 ^ w0s12)); + SHA1_STEP (SHA1_F2o, a, b, c, d, e, (c_55s ^ w0s14)); + SHA1_STEP (SHA1_F2o, e, a, b, c, d, (c_56s ^ w0s04___w0s06___w0s07 ^ w0s10 ^ w0s11)); + SHA1_STEP (SHA1_F2o, d, e, a, b, c, (c_57s ^ w0s08)); + SHA1_STEP (SHA1_F2o, c, d, e, a, b, (c_58s ^ w0s04___w0s08 ^ w0s15)); + SHA1_STEP (SHA1_F2o, b, c, d, e, a, (c_59s ^ w0s08___w0s12)); + + #undef K + #define K SHA1C03 + + SHA1_STEP (SHA1_F1 , a, b, c, d, e, (c_60s ^ w0s04 ^ w0s08___w0s12 ^ w0s07 ^ w0s14)); + SHA1_STEP (SHA1_F1 , e, a, b, c, d, (c_61s ^ w0s16)); + SHA1_STEP (SHA1_F1 , d, e, a, b, c, (c_62s ^ w0s04___w0s06 ^ w0s08___w0s12)); + SHA1_STEP (SHA1_F1 , c, d, e, a, b, (c_63s ^ w0s08)); + SHA1_STEP (SHA1_F1 , b, c, d, e, a, (c_64s ^ w0s04___w0s06___w0s07 ^ w0s08___w0s12 ^ w0s17)); + SHA1_STEPX(SHA1_F1 , a, b, c, d, e, (c_65sK)); + SHA1_STEP (SHA1_F1 , e, a, b, c, d, (c_66s ^ w0s14 ^ w0s16)); + SHA1_STEP (SHA1_F1 , d, e, a, b, c, (c_67s ^ w0s08 ^ w0s18)); + SHA1_STEP (SHA1_F1 , c, d, e, a, b, (c_68s ^ w0s11 ^ w0s14 ^ w0s15)); + SHA1_STEPX(SHA1_F1 , b, c, d, e, a, (c_69sK)); + SHA1_STEP (SHA1_F1 , a, b, c, d, e, (c_70s ^ w0s12 ^ w0s19)); + SHA1_STEP (SHA1_F1 , e, a, b, c, d, (c_71s ^ w0s12 ^ w0s16)); + SHA1_STEP (SHA1_F1 , d, e, a, b, c, (c_72s ^ w0s05 ^ w0s11 ^ w0s12 ^ w0s13 ^ w0s16 ^ w0s18)); + SHA1_STEP (SHA1_F1 , c, d, e, a, b, (c_73s ^ w0s20)); + SHA1_STEP (SHA1_F1 , b, c, d, e, a, (c_74s ^ w0s08 ^ w0s16)); + SHA1_STEP (SHA1_F1 , a, b, c, d, e, (c_75s ^ w0s06 ^ w0s12 ^ w0s14)); + + const u32 c_76s = rotl32 ((c_73s ^ c_68s ^ c_62s ^ c_60s), 1u); + const u32 c_77s = rotl32 ((c_74s ^ c_69s ^ c_63s ^ c_61s), 1u); + const u32 c_78s = rotl32 ((c_75s ^ c_70s ^ c_64s ^ c_62s), 1u); + const u32 c_79s = rotl32 ((c_76s ^ c_71s ^ c_65s ^ c_63s), 1u); + + const u32x w0s21 = rotl32 (w0, 21u); + const u32x w0s22 = rotl32 (w0, 22U); + + SHA1_STEP (SHA1_F1 , e, a, b, c, d, (c_76s ^ w0s07 ^ w0s08___w0s12 ^ w0s16 ^ w0s21)); + SHA1_STEP (SHA1_F1 , d, e, a, b, c, (c_77s)); + SHA1_STEP (SHA1_F1 , c, d, e, a, b, (c_78s ^ w0s07 ^ w0s08 ^ w0s15 ^ w0s18 ^ w0s20)); + SHA1_STEP (SHA1_F1 , b, c, d, e, a, (c_79s ^ w0s08 ^ w0s22)); + + + const u32x r0 = d; + const u32x r1 = e; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_M + } +} + +static void m00100s (u32 w[16], const u32 pw_len, __global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global u32x * words_buf_r, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset) +{ + /** + * modifier + */ + + const u32 gid = get_global_id (0); + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 c_16s = rotl32 ((w[13] ^ w[ 8] ^ w[ 2] ), 1u); + const u32 c_17s = rotl32 ((w[14] ^ w[ 9] ^ w[ 3] ^ w[ 1]), 1u); + const u32 c_18s = rotl32 ((w[15] ^ w[10] ^ w[ 4] ^ w[ 2]), 1u); + const u32 c_19s = rotl32 ((c_16s ^ w[11] ^ w[ 5] ^ w[ 3]), 1u); + const u32 c_20s = rotl32 ((c_17s ^ w[12] ^ w[ 6] ^ w[ 4]), 1u); + const u32 c_21s = rotl32 ((c_18s ^ w[13] ^ w[ 7] ^ w[ 5]), 1u); + const u32 c_22s = rotl32 ((c_19s ^ w[14] ^ w[ 8] ^ w[ 6]), 1u); + const u32 c_23s = rotl32 ((c_20s ^ w[15] ^ w[ 9] ^ w[ 7]), 1u); + const u32 c_24s = rotl32 ((c_21s ^ c_16s ^ w[10] ^ w[ 8]), 1u); + const u32 c_25s = rotl32 ((c_22s ^ c_17s ^ w[11] ^ w[ 9]), 1u); + const u32 c_26s = rotl32 ((c_23s ^ c_18s ^ w[12] ^ w[10]), 1u); + const u32 c_27s = rotl32 ((c_24s ^ c_19s ^ w[13] ^ w[11]), 1u); + const u32 c_28s = rotl32 ((c_25s ^ c_20s ^ w[14] ^ w[12]), 1u); + const u32 c_29s = rotl32 ((c_26s ^ c_21s ^ w[15] ^ w[13]), 1u); + const u32 c_30s = rotl32 ((c_27s ^ c_22s ^ c_16s ^ w[14]), 1u); + const u32 c_31s = rotl32 ((c_28s ^ c_23s ^ c_17s ^ w[15]), 1u); + const u32 c_32s = rotl32 ((c_29s ^ c_24s ^ c_18s ^ c_16s), 1u); + const u32 c_33s = rotl32 ((c_30s ^ c_25s ^ c_19s ^ c_17s), 1u); + const u32 c_34s = rotl32 ((c_31s ^ c_26s ^ c_20s ^ c_18s), 1u); + const u32 c_35s = rotl32 ((c_32s ^ c_27s ^ c_21s ^ c_19s), 1u); + const u32 c_36s = rotl32 ((c_33s ^ c_28s ^ c_22s ^ c_20s), 1u); + const u32 c_37s = rotl32 ((c_34s ^ c_29s ^ c_23s ^ c_21s), 1u); + const u32 c_38s = rotl32 ((c_35s ^ c_30s ^ c_24s ^ c_22s), 1u); + const u32 c_39s = rotl32 ((c_36s ^ c_31s ^ c_25s ^ c_23s), 1u); + const u32 c_40s = rotl32 ((c_37s ^ c_32s ^ c_26s ^ c_24s), 1u); + const u32 c_41s = rotl32 ((c_38s ^ c_33s ^ c_27s ^ c_25s), 1u); + const u32 c_42s = rotl32 ((c_39s ^ c_34s ^ c_28s ^ c_26s), 1u); + const u32 c_43s = rotl32 ((c_40s ^ c_35s ^ c_29s ^ c_27s), 1u); + const u32 c_44s = rotl32 ((c_41s ^ c_36s ^ c_30s ^ c_28s), 1u); + const u32 c_45s = rotl32 ((c_42s ^ c_37s ^ c_31s ^ c_29s), 1u); + const u32 c_46s = rotl32 ((c_43s ^ c_38s ^ c_32s ^ c_30s), 1u); + const u32 c_47s = rotl32 ((c_44s ^ c_39s ^ c_33s ^ c_31s), 1u); + const u32 c_48s = rotl32 ((c_45s ^ c_40s ^ c_34s ^ c_32s), 1u); + const u32 c_49s = rotl32 ((c_46s ^ c_41s ^ c_35s ^ c_33s), 1u); + const u32 c_50s = rotl32 ((c_47s ^ c_42s ^ c_36s ^ c_34s), 1u); + const u32 c_51s = rotl32 ((c_48s ^ c_43s ^ c_37s ^ c_35s), 1u); + const u32 c_52s = rotl32 ((c_49s ^ c_44s ^ c_38s ^ c_36s), 1u); + const u32 c_53s = rotl32 ((c_50s ^ c_45s ^ c_39s ^ c_37s), 1u); + const u32 c_54s = rotl32 ((c_51s ^ c_46s ^ c_40s ^ c_38s), 1u); + const u32 c_55s = rotl32 ((c_52s ^ c_47s ^ c_41s ^ c_39s), 1u); + const u32 c_56s = rotl32 ((c_53s ^ c_48s ^ c_42s ^ c_40s), 1u); + const u32 c_57s = rotl32 ((c_54s ^ c_49s ^ c_43s ^ c_41s), 1u); + const u32 c_58s = rotl32 ((c_55s ^ c_50s ^ c_44s ^ c_42s), 1u); + const u32 c_59s = rotl32 ((c_56s ^ c_51s ^ c_45s ^ c_43s), 1u); + const u32 c_60s = rotl32 ((c_57s ^ c_52s ^ c_46s ^ c_44s), 1u); + const u32 c_61s = rotl32 ((c_58s ^ c_53s ^ c_47s ^ c_45s), 1u); + const u32 c_62s = rotl32 ((c_59s ^ c_54s ^ c_48s ^ c_46s), 1u); + const u32 c_63s = rotl32 ((c_60s ^ c_55s ^ c_49s ^ c_47s), 1u); + const u32 c_64s = rotl32 ((c_61s ^ c_56s ^ c_50s ^ c_48s), 1u); + const u32 c_65s = rotl32 ((c_62s ^ c_57s ^ c_51s ^ c_49s), 1u); + const u32 c_66s = rotl32 ((c_63s ^ c_58s ^ c_52s ^ c_50s), 1u); + const u32 c_67s = rotl32 ((c_64s ^ c_59s ^ c_53s ^ c_51s), 1u); + const u32 c_68s = rotl32 ((c_65s ^ c_60s ^ c_54s ^ c_52s), 1u); + const u32 c_69s = rotl32 ((c_66s ^ c_61s ^ c_55s ^ c_53s), 1u); + const u32 c_70s = rotl32 ((c_67s ^ c_62s ^ c_56s ^ c_54s), 1u); + const u32 c_71s = rotl32 ((c_68s ^ c_63s ^ c_57s ^ c_55s), 1u); + const u32 c_72s = rotl32 ((c_69s ^ c_64s ^ c_58s ^ c_56s), 1u); + const u32 c_73s = rotl32 ((c_70s ^ c_65s ^ c_59s ^ c_57s), 1u); + const u32 c_74s = rotl32 ((c_71s ^ c_66s ^ c_60s ^ c_58s), 1u); + const u32 c_75s = rotl32 ((c_72s ^ c_67s ^ c_61s ^ c_59s), 1u); + + const u32 c_17sK = c_17s + SHA1C00; + const u32 c_18sK = c_18s + SHA1C00; + const u32 c_20sK = c_20s + SHA1C01; + const u32 c_21sK = c_21s + SHA1C01; + const u32 c_23sK = c_23s + SHA1C01; + const u32 c_26sK = c_26s + SHA1C01; + const u32 c_27sK = c_27s + SHA1C01; + const u32 c_29sK = c_29s + SHA1C01; + const u32 c_33sK = c_33s + SHA1C01; + const u32 c_39sK = c_39s + SHA1C01; + const u32 c_41sK = c_41s + SHA1C02; + const u32 c_45sK = c_45s + SHA1C02; + const u32 c_53sK = c_53s + SHA1C02; + const u32 c_65sK = c_65s + SHA1C03; + const u32 c_69sK = c_69s + SHA1C03; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * reverse + */ + + const u32 e_rev = rotl32 (search[1], 2u) - SHA1C03; + + /** + * loop + */ + + const u32 bf_loops = ceil ((float) bfs_cnt / VECT_DIV); + + u32x w0l = w[0]; + + for (u32 il_pos = 0; il_pos < bf_loops; il_pos++) + { + const u32x w0r = words_buf_r[il_pos]; + + const u32x w0 = w0l | w0r; + + const u32x w0s01 = rotl32 (w0, 1u); + const u32x w0s02 = rotl32 (w0, 2u); + const u32x w0s03 = rotl32 (w0, 3u); + const u32x w0s04 = rotl32 (w0, 4u); + const u32x w0s05 = rotl32 (w0, 5u); + const u32x w0s06 = rotl32 (w0, 6u); + const u32x w0s07 = rotl32 (w0, 7u); + const u32x w0s08 = rotl32 (w0, 8u); + const u32x w0s09 = rotl32 (w0, 9u); + const u32x w0s10 = rotl32 (w0, 10u); + const u32x w0s11 = rotl32 (w0, 11u); + const u32x w0s12 = rotl32 (w0, 12u); + const u32x w0s13 = rotl32 (w0, 13u); + const u32x w0s14 = rotl32 (w0, 14u); + const u32x w0s15 = rotl32 (w0, 15u); + const u32x w0s16 = rotl32 (w0, 16u); + const u32x w0s17 = rotl32 (w0, 17u); + const u32x w0s18 = rotl32 (w0, 18u); + const u32x w0s19 = rotl32 (w0, 19u); + const u32x w0s20 = rotl32 (w0, 20u); + + const u32x w0s04___w0s06 = w0s04 ^ w0s06; + const u32x w0s04___w0s08 = w0s04 ^ w0s08; + const u32x w0s08___w0s12 = w0s08 ^ w0s12; + const u32x w0s04___w0s06___w0s07 = w0s04___w0s06 ^ w0s07; + + u32x a = SHA1M_A; + u32x b = SHA1M_B; + u32x c = SHA1M_C; + u32x d = SHA1M_D; + u32x e = SHA1M_E; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w0); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w[ 1]); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w[ 2]); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w[ 3]); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w[ 4]); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w[ 5]); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w[ 6]); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w[ 7]); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w[ 8]); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w[ 9]); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w[10]); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w[11]); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w[12]); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w[13]); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w[14]); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w[15]); + + SHA1_STEP (SHA1_F0o, e, a, b, c, d, (c_16s ^ w0s01)); + SHA1_STEPX(SHA1_F0o, d, e, a, b, c, (c_17sK)); + SHA1_STEPX(SHA1_F0o, c, d, e, a, b, (c_18sK)); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, (c_19s ^ w0s02)); + + #undef K + #define K SHA1C01 + + SHA1_STEPX(SHA1_F1 , a, b, c, d, e, (c_20sK)); + SHA1_STEPX(SHA1_F1 , e, a, b, c, d, (c_21sK)); + SHA1_STEP (SHA1_F1 , d, e, a, b, c, (c_22s ^ w0s03)); + SHA1_STEPX(SHA1_F1 , c, d, e, a, b, (c_23sK)); + SHA1_STEP (SHA1_F1 , b, c, d, e, a, (c_24s ^ w0s02)); + SHA1_STEP (SHA1_F1 , a, b, c, d, e, (c_25s ^ w0s04)); + SHA1_STEPX(SHA1_F1 , e, a, b, c, d, (c_26sK)); + SHA1_STEPX(SHA1_F1 , d, e, a, b, c, (c_27sK)); + SHA1_STEP (SHA1_F1 , c, d, e, a, b, (c_28s ^ w0s05)); + SHA1_STEPX(SHA1_F1 , b, c, d, e, a, (c_29sK)); + SHA1_STEP (SHA1_F1 , a, b, c, d, e, (c_30s ^ w0s02 ^ w0s04)); + SHA1_STEP (SHA1_F1 , e, a, b, c, d, (c_31s ^ w0s06)); + SHA1_STEP (SHA1_F1 , d, e, a, b, c, (c_32s ^ w0s02 ^ w0s03)); + SHA1_STEPX(SHA1_F1 , c, d, e, a, b, (c_33sK)); + SHA1_STEP (SHA1_F1 , b, c, d, e, a, (c_34s ^ w0s07)); + SHA1_STEP (SHA1_F1 , a, b, c, d, e, (c_35s ^ w0s04)); + SHA1_STEP (SHA1_F1 , e, a, b, c, d, (c_36s ^ w0s04___w0s06)); + SHA1_STEP (SHA1_F1 , d, e, a, b, c, (c_37s ^ w0s08)); + SHA1_STEP (SHA1_F1 , c, d, e, a, b, (c_38s ^ w0s04)); + SHA1_STEPX(SHA1_F1 , b, c, d, e, a, (c_39sK)); + + #undef K + #define K SHA1C02 + + SHA1_STEP (SHA1_F2o, a, b, c, d, e, (c_40s ^ w0s04 ^ w0s09)); + SHA1_STEPX(SHA1_F2o, e, a, b, c, d, (c_41sK)); + SHA1_STEP (SHA1_F2o, d, e, a, b, c, (c_42s ^ w0s06 ^ w0s08)); + SHA1_STEP (SHA1_F2o, c, d, e, a, b, (c_43s ^ w0s10)); + SHA1_STEP (SHA1_F2o, b, c, d, e, a, (c_44s ^ w0s03 ^ w0s06 ^ w0s07)); + SHA1_STEPX(SHA1_F2o, a, b, c, d, e, (c_45sK)); + SHA1_STEP (SHA1_F2o, e, a, b, c, d, (c_46s ^ w0s04 ^ w0s11)); + SHA1_STEP (SHA1_F2o, d, e, a, b, c, (c_47s ^ w0s04___w0s08)); + SHA1_STEP (SHA1_F2o, c, d, e, a, b, (c_48s ^ w0s03 ^ w0s04___w0s08 ^ w0s05 ^ w0s10)); + SHA1_STEP (SHA1_F2o, b, c, d, e, a, (c_49s ^ w0s12)); + SHA1_STEP (SHA1_F2o, a, b, c, d, e, (c_50s ^ w0s08)); + SHA1_STEP (SHA1_F2o, e, a, b, c, d, (c_51s ^ w0s04___w0s06)); + SHA1_STEP (SHA1_F2o, d, e, a, b, c, (c_52s ^ w0s04___w0s08 ^ w0s13)); + SHA1_STEPX(SHA1_F2o, c, d, e, a, b, (c_53sK)); + SHA1_STEP (SHA1_F2o, b, c, d, e, a, (c_54s ^ w0s07 ^ w0s10 ^ w0s12)); + SHA1_STEP (SHA1_F2o, a, b, c, d, e, (c_55s ^ w0s14)); + SHA1_STEP (SHA1_F2o, e, a, b, c, d, (c_56s ^ w0s04___w0s06___w0s07 ^ w0s10 ^ w0s11)); + SHA1_STEP (SHA1_F2o, d, e, a, b, c, (c_57s ^ w0s08)); + SHA1_STEP (SHA1_F2o, c, d, e, a, b, (c_58s ^ w0s04___w0s08 ^ w0s15)); + SHA1_STEP (SHA1_F2o, b, c, d, e, a, (c_59s ^ w0s08___w0s12)); + + #undef K + #define K SHA1C03 + + SHA1_STEP (SHA1_F1 , a, b, c, d, e, (c_60s ^ w0s04 ^ w0s08___w0s12 ^ w0s07 ^ w0s14)); + SHA1_STEP (SHA1_F1 , e, a, b, c, d, (c_61s ^ w0s16)); + SHA1_STEP (SHA1_F1 , d, e, a, b, c, (c_62s ^ w0s04___w0s06 ^ w0s08___w0s12)); + SHA1_STEP (SHA1_F1 , c, d, e, a, b, (c_63s ^ w0s08)); + SHA1_STEP (SHA1_F1 , b, c, d, e, a, (c_64s ^ w0s04___w0s06___w0s07 ^ w0s08___w0s12 ^ w0s17)); + SHA1_STEPX(SHA1_F1 , a, b, c, d, e, (c_65sK)); + SHA1_STEP (SHA1_F1 , e, a, b, c, d, (c_66s ^ w0s14 ^ w0s16)); + SHA1_STEP (SHA1_F1 , d, e, a, b, c, (c_67s ^ w0s08 ^ w0s18)); + SHA1_STEP (SHA1_F1 , c, d, e, a, b, (c_68s ^ w0s11 ^ w0s14 ^ w0s15)); + SHA1_STEPX(SHA1_F1 , b, c, d, e, a, (c_69sK)); + SHA1_STEP (SHA1_F1 , a, b, c, d, e, (c_70s ^ w0s12 ^ w0s19)); + SHA1_STEP (SHA1_F1 , e, a, b, c, d, (c_71s ^ w0s12 ^ w0s16)); + SHA1_STEP (SHA1_F1 , d, e, a, b, c, (c_72s ^ w0s05 ^ w0s11 ^ w0s12 ^ w0s13 ^ w0s16 ^ w0s18)); + SHA1_STEP (SHA1_F1 , c, d, e, a, b, (c_73s ^ w0s20)); + SHA1_STEP (SHA1_F1 , b, c, d, e, a, (c_74s ^ w0s08 ^ w0s16)); + + SHA1_STEP_PE (SHA1_F1, a, b, c, d, e, (c_75s ^ w0s06 ^ w0s12 ^ w0s14)); + + bool q_cond = allx (e_rev != e); + + if (q_cond) continue; + + SHA1_STEP_PB (SHA1_F1, a, b, c, d, e, 0); + + const u32 c_76s = rotl32 ((c_73s ^ c_68s ^ c_62s ^ c_60s), 1u); + const u32 c_77s = rotl32 ((c_74s ^ c_69s ^ c_63s ^ c_61s), 1u); + const u32 c_78s = rotl32 ((c_75s ^ c_70s ^ c_64s ^ c_62s), 1u); + const u32 c_79s = rotl32 ((c_76s ^ c_71s ^ c_65s ^ c_63s), 1u); + + const u32x w0s21 = rotl32 (w0, 21u); + const u32x w0s22 = rotl32 (w0, 22U); + + SHA1_STEP (SHA1_F1 , e, a, b, c, d, (c_76s ^ w0s07 ^ w0s08___w0s12 ^ w0s16 ^ w0s21)); + SHA1_STEP (SHA1_F1 , d, e, a, b, c, (c_77s)); + SHA1_STEP (SHA1_F1 , c, d, e, a, b, (c_78s ^ w0s07 ^ w0s08 ^ w0s15 ^ w0s18 ^ w0s20)); + SHA1_STEP (SHA1_F1 , b, c, d, e, a, (c_79s ^ w0s08 ^ w0s22)); + + + const u32x r0 = d; + const u32x r1 = e; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_S + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m00100_m04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global u32x * words_buf_r, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32 w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = 0; + w[ 5] = 0; + w[ 6] = 0; + w[ 7] = 0; + w[ 8] = 0; + w[ 9] = 0; + w[10] = 0; + w[11] = 0; + w[12] = 0; + w[13] = 0; + w[14] = 0; + w[15] = pws[gid].i[15]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m00100m (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m00100_m08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global u32x * words_buf_r, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32 w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = pws[gid].i[ 4]; + w[ 5] = pws[gid].i[ 5]; + w[ 6] = pws[gid].i[ 6]; + w[ 7] = pws[gid].i[ 7]; + w[ 8] = 0; + w[ 9] = 0; + w[10] = 0; + w[11] = 0; + w[12] = 0; + w[13] = 0; + w[14] = 0; + w[15] = pws[gid].i[15]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m00100m (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m00100_m16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global u32x * words_buf_r, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32 w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = pws[gid].i[ 4]; + w[ 5] = pws[gid].i[ 5]; + w[ 6] = pws[gid].i[ 6]; + w[ 7] = pws[gid].i[ 7]; + w[ 8] = pws[gid].i[ 8]; + w[ 9] = pws[gid].i[ 9]; + w[10] = pws[gid].i[10]; + w[11] = pws[gid].i[11]; + w[12] = pws[gid].i[12]; + w[13] = pws[gid].i[13]; + w[14] = pws[gid].i[14]; + w[15] = pws[gid].i[15]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m00100m (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m00100_s04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global u32x * words_buf_r, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32 w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = 0; + w[ 5] = 0; + w[ 6] = 0; + w[ 7] = 0; + w[ 8] = 0; + w[ 9] = 0; + w[10] = 0; + w[11] = 0; + w[12] = 0; + w[13] = 0; + w[14] = 0; + w[15] = pws[gid].i[15]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m00100s (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m00100_s08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global u32x * words_buf_r, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32 w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = pws[gid].i[ 4]; + w[ 5] = pws[gid].i[ 5]; + w[ 6] = pws[gid].i[ 6]; + w[ 7] = pws[gid].i[ 7]; + w[ 8] = 0; + w[ 9] = 0; + w[10] = 0; + w[11] = 0; + w[12] = 0; + w[13] = 0; + w[14] = 0; + w[15] = pws[gid].i[15]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m00100s (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m00100_s16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global u32x * words_buf_r, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32 w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = pws[gid].i[ 4]; + w[ 5] = pws[gid].i[ 5]; + w[ 6] = pws[gid].i[ 6]; + w[ 7] = pws[gid].i[ 7]; + w[ 8] = pws[gid].i[ 8]; + w[ 9] = pws[gid].i[ 9]; + w[10] = pws[gid].i[10]; + w[11] = pws[gid].i[11]; + w[12] = pws[gid].i[12]; + w[13] = pws[gid].i[13]; + w[14] = pws[gid].i[14]; + w[15] = pws[gid].i[15]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m00100s (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} diff --git a/amd/m00110_a0.cl b/amd/m00110_a0.cl new file mode 100644 index 0000000000..b5f4801000 --- /dev/null +++ b/amd/m00110_a0.cl @@ -0,0 +1,642 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _SHA1_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW4 +#define VECT_SIZE4 +#endif + +#ifdef VLIW5 +#define VECT_SIZE4 +#endif + +#define DGST_R0 3 +#define DGST_R1 4 +#define DGST_R2 2 +#define DGST_R3 1 + +#include "include/kernel_functions.c" +#include "types_amd.c" +#include "common_amd.c" +#include "include/rp_gpu.h" +#include "rp_amd.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m00110_m04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + u32x pw_buf1[4]; + + pw_buf1[0] = pws[gid].i[ 4]; + pw_buf1[1] = pws[gid].i[ 5]; + pw_buf1[2] = pws[gid].i[ 6]; + pw_buf1[3] = pws[gid].i[ 7]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[7]; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + + w0[0] = pw_buf0[0]; + w0[1] = pw_buf0[1]; + w0[2] = pw_buf0[2]; + w0[3] = pw_buf0[3]; + + u32x w1[4]; + + w1[0] = pw_buf1[0]; + w1[1] = pw_buf1[1]; + w1[2] = pw_buf1[2]; + w1[3] = pw_buf1[3]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 out_len = apply_rules (rules_buf[il_pos].cmds, w0, w1, pw_len); + + /** + * append salt + */ + + u32 s0[4]; + + s0[0] = salt_buf0[0]; + s0[1] = salt_buf0[1]; + s0[2] = salt_buf0[2]; + s0[3] = salt_buf0[3]; + + u32 s1[4]; + + s1[0] = salt_buf1[0]; + s1[1] = salt_buf1[1]; + s1[2] = salt_buf1[2]; + s1[3] = salt_buf1[3]; + + u32 s2[4]; + + s2[0] = 0; + s2[1] = 0; + s2[2] = 0; + s2[3] = 0; + + u32 s3[4]; + + s3[0] = 0; + s3[1] = 0; + s3[2] = 0; + s3[3] = 0; + + switch_buffer_by_offset (s0, s1, s2, s3, out_len); + + const u32 pw_salt_len = out_len + salt_len; + + w0[0] |= s0[0]; + w0[1] |= s0[1]; + w0[2] |= s0[2]; + w0[3] |= s0[3]; + + w1[0] |= s1[0]; + w1[1] |= s1[1]; + w1[2] |= s1[2]; + w1[3] |= s1[3]; + + w2[0] |= s2[0]; + w2[1] |= s2[1]; + w2[2] |= s2[2]; + w2[3] |= s2[3]; + + w3[0] |= s3[0]; + w3[1] |= s3[1]; + w3[2] |= s3[2]; + w3[3] |= s3[3]; + + append_0x80_4 (w0, w1, w2, w3, pw_salt_len); + + /** + * sha1 + */ + + u32x w0_t = swap_workaround (w0[0]); + u32x w1_t = swap_workaround (w0[1]); + u32x w2_t = swap_workaround (w0[2]); + u32x w3_t = swap_workaround (w0[3]); + u32x w4_t = swap_workaround (w1[0]); + u32x w5_t = swap_workaround (w1[1]); + u32x w6_t = swap_workaround (w1[2]); + u32x w7_t = swap_workaround (w1[3]); + u32x w8_t = swap_workaround (w2[0]); + u32x w9_t = swap_workaround (w2[1]); + u32x wa_t = swap_workaround (w2[2]); + u32x wb_t = swap_workaround (w2[3]); + u32x wc_t = swap_workaround (w3[0]); + u32x wd_t = swap_workaround (w3[1]); + u32x we_t = 0; + u32x wf_t = pw_salt_len * 8; + + u32x a = SHA1M_A; + u32x b = SHA1M_B; + u32x c = SHA1M_C; + u32x d = SHA1M_D; + u32x e = SHA1M_E; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w0_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w1_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w2_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w3_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w4_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w5_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w6_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w7_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w8_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w9_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wa_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, wb_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, wc_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, wd_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, we_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F0o, e, a, b, c, d, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F0o, d, e, a, b, c, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F0o, c, d, e, a, b, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F0o, b, c, d, e, a, w3_t); + + #undef K + #define K SHA1C01 + + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w7_t); + + #undef K + #define K SHA1C02 + + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wb_t); + + #undef K + #define K SHA1C03 + + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wf_t); + + + const u32x r0 = d; + const u32x r1 = e; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_M + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m00110_m08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m00110_m16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m00110_s04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + u32x pw_buf1[4]; + + pw_buf1[0] = pws[gid].i[ 4]; + pw_buf1[1] = pws[gid].i[ 5]; + pw_buf1[2] = pws[gid].i[ 6]; + pw_buf1[3] = pws[gid].i[ 7]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[7]; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * reverse + */ + + const u32 e_rev = rotl32 (search[1], 2u); + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + + w0[0] = pw_buf0[0]; + w0[1] = pw_buf0[1]; + w0[2] = pw_buf0[2]; + w0[3] = pw_buf0[3]; + + u32x w1[4]; + + w1[0] = pw_buf1[0]; + w1[1] = pw_buf1[1]; + w1[2] = pw_buf1[2]; + w1[3] = pw_buf1[3]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 out_len = apply_rules (rules_buf[il_pos].cmds, w0, w1, pw_len); + + /** + * append salt + */ + + u32 s0[4]; + + s0[0] = salt_buf0[0]; + s0[1] = salt_buf0[1]; + s0[2] = salt_buf0[2]; + s0[3] = salt_buf0[3]; + + u32 s1[4]; + + s1[0] = salt_buf1[0]; + s1[1] = salt_buf1[1]; + s1[2] = salt_buf1[2]; + s1[3] = salt_buf1[3]; + + u32 s2[4]; + + s2[0] = 0; + s2[1] = 0; + s2[2] = 0; + s2[3] = 0; + + u32 s3[4]; + + s3[0] = 0; + s3[1] = 0; + s3[2] = 0; + s3[3] = 0; + + switch_buffer_by_offset (s0, s1, s2, s3, out_len); + + const u32 pw_salt_len = out_len + salt_len; + + w0[0] |= s0[0]; + w0[1] |= s0[1]; + w0[2] |= s0[2]; + w0[3] |= s0[3]; + + w1[0] |= s1[0]; + w1[1] |= s1[1]; + w1[2] |= s1[2]; + w1[3] |= s1[3]; + + w2[0] |= s2[0]; + w2[1] |= s2[1]; + w2[2] |= s2[2]; + w2[3] |= s2[3]; + + w3[0] |= s3[0]; + w3[1] |= s3[1]; + w3[2] |= s3[2]; + w3[3] |= s3[3]; + + append_0x80_4 (w0, w1, w2, w3, pw_salt_len); + + /** + * sha1 + */ + + u32x w0_t = swap_workaround (w0[0]); + u32x w1_t = swap_workaround (w0[1]); + u32x w2_t = swap_workaround (w0[2]); + u32x w3_t = swap_workaround (w0[3]); + u32x w4_t = swap_workaround (w1[0]); + u32x w5_t = swap_workaround (w1[1]); + u32x w6_t = swap_workaround (w1[2]); + u32x w7_t = swap_workaround (w1[3]); + u32x w8_t = swap_workaround (w2[0]); + u32x w9_t = swap_workaround (w2[1]); + u32x wa_t = swap_workaround (w2[2]); + u32x wb_t = swap_workaround (w2[3]); + u32x wc_t = swap_workaround (w3[0]); + u32x wd_t = swap_workaround (w3[1]); + u32x we_t = 0; + u32x wf_t = pw_salt_len * 8; + + u32x a = SHA1M_A; + u32x b = SHA1M_B; + u32x c = SHA1M_C; + u32x d = SHA1M_D; + u32x e = SHA1M_E; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w0_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w1_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w2_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w3_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w4_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w5_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w6_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w7_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w8_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w9_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wa_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, wb_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, wc_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, wd_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, we_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F0o, e, a, b, c, d, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F0o, d, e, a, b, c, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F0o, c, d, e, a, b, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F0o, b, c, d, e, a, w3_t); + + #undef K + #define K SHA1C01 + + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w7_t); + + #undef K + #define K SHA1C02 + + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wb_t); + + #undef K + #define K SHA1C03 + + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wb_t); + + if (allx (e != e_rev)) continue; + + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wf_t); + + + const u32x r0 = d; + const u32x r1 = e; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_S + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m00110_s08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m00110_s16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/amd/m00110_a1.cl b/amd/m00110_a1.cl new file mode 100644 index 0000000000..43351a2e47 --- /dev/null +++ b/amd/m00110_a1.cl @@ -0,0 +1,708 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _SHA1_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW4 +#define VECT_SIZE4 +#endif + +#ifdef VLIW5 +#define VECT_SIZE4 +#endif + +#define DGST_R0 3 +#define DGST_R1 4 +#define DGST_R2 2 +#define DGST_R3 1 + +#include "include/kernel_functions.c" +#include "types_amd.c" +#include "common_amd.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m00110_m04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, combs_buf[0].pw_len); + } + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[7]; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = combs_buf[il_pos].pw_len; + + const u32 pw_len = pw_l_len + pw_r_len; + + u32 wordr0[4]; + + wordr0[0] = combs_buf[il_pos].i[0]; + wordr0[1] = combs_buf[il_pos].i[1]; + wordr0[2] = combs_buf[il_pos].i[2]; + wordr0[3] = combs_buf[il_pos].i[3]; + + u32 wordr1[4]; + + wordr1[0] = combs_buf[il_pos].i[4]; + wordr1[1] = combs_buf[il_pos].i[5]; + wordr1[2] = combs_buf[il_pos].i[6]; + wordr1[3] = combs_buf[il_pos].i[7]; + + u32 wordr2[4]; + + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + + u32 wordr3[4]; + + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + /** + * append salt + */ + + u32 s0[4]; + + s0[0] = salt_buf0[0]; + s0[1] = salt_buf0[1]; + s0[2] = salt_buf0[2]; + s0[3] = salt_buf0[3]; + + u32 s1[4]; + + s1[0] = salt_buf1[0]; + s1[1] = salt_buf1[1]; + s1[2] = salt_buf1[2]; + s1[3] = salt_buf1[3]; + + u32 s2[4]; + + s2[0] = 0; + s2[1] = 0; + s2[2] = 0; + s2[3] = 0; + + u32 s3[4]; + + s3[0] = 0; + s3[1] = 0; + s3[2] = 0; + s3[3] = 0; + + switch_buffer_by_offset (s0, s1, s2, s3, pw_len); + + const u32 pw_salt_len = pw_len + salt_len; + + u32x w0[4]; + + w0[0] = wordl0[0] | wordr0[0] | s0[0]; + w0[1] = wordl0[1] | wordr0[1] | s0[1]; + w0[2] = wordl0[2] | wordr0[2] | s0[2]; + w0[3] = wordl0[3] | wordr0[3] | s0[3]; + + u32x w1[4]; + + w1[0] = wordl1[0] | wordr1[0] | s1[0]; + w1[1] = wordl1[1] | wordr1[1] | s1[1]; + w1[2] = wordl1[2] | wordr1[2] | s1[2]; + w1[3] = wordl1[3] | wordr1[3] | s1[3]; + + u32x w2[4]; + + w2[0] = wordl2[0] | wordr2[0] | s2[0]; + w2[1] = wordl2[1] | wordr2[1] | s2[1]; + w2[2] = wordl2[2] | wordr2[2] | s2[2]; + w2[3] = wordl2[3] | wordr2[3] | s2[3]; + + u32x w3[4]; + + w3[0] = wordl3[0] | wordr3[0] | s3[0]; + w3[1] = wordl3[1] | wordr3[1] | s3[1]; + w3[2] = 0; + w3[3] = 0; + + append_0x80_4 (w0, w1, w2, w3, pw_salt_len); + + /** + * sha1 + */ + + u32x w0_t = swap_workaround (w0[0]); + u32x w1_t = swap_workaround (w0[1]); + u32x w2_t = swap_workaround (w0[2]); + u32x w3_t = swap_workaround (w0[3]); + u32x w4_t = swap_workaround (w1[0]); + u32x w5_t = swap_workaround (w1[1]); + u32x w6_t = swap_workaround (w1[2]); + u32x w7_t = swap_workaround (w1[3]); + u32x w8_t = swap_workaround (w2[0]); + u32x w9_t = swap_workaround (w2[1]); + u32x wa_t = swap_workaround (w2[2]); + u32x wb_t = swap_workaround (w2[3]); + u32x wc_t = swap_workaround (w3[0]); + u32x wd_t = swap_workaround (w3[1]); + u32x we_t = 0; + u32x wf_t = pw_salt_len * 8; + + u32x a = SHA1M_A; + u32x b = SHA1M_B; + u32x c = SHA1M_C; + u32x d = SHA1M_D; + u32x e = SHA1M_E; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w0_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w1_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w2_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w3_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w4_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w5_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w6_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w7_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w8_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w9_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wa_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, wb_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, wc_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, wd_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, we_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F0o, e, a, b, c, d, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F0o, d, e, a, b, c, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F0o, c, d, e, a, b, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F0o, b, c, d, e, a, w3_t); + + #undef K + #define K SHA1C01 + + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w7_t); + + #undef K + #define K SHA1C02 + + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wb_t); + + #undef K + #define K SHA1C03 + + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wf_t); + + + const u32x r0 = d; + const u32x r1 = e; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_M + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m00110_m08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m00110_m16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m00110_s04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, combs_buf[0].pw_len); + } + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[7]; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * reverse + */ + + const u32 e_rev = rotl32 (search[1], 2u); + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = combs_buf[il_pos].pw_len; + + const u32 pw_len = pw_l_len + pw_r_len; + + u32 wordr0[4]; + + wordr0[0] = combs_buf[il_pos].i[0]; + wordr0[1] = combs_buf[il_pos].i[1]; + wordr0[2] = combs_buf[il_pos].i[2]; + wordr0[3] = combs_buf[il_pos].i[3]; + + u32 wordr1[4]; + + wordr1[0] = combs_buf[il_pos].i[4]; + wordr1[1] = combs_buf[il_pos].i[5]; + wordr1[2] = combs_buf[il_pos].i[6]; + wordr1[3] = combs_buf[il_pos].i[7]; + + u32 wordr2[4]; + + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + + u32 wordr3[4]; + + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + /** + * append salt + */ + + u32 s0[4]; + + s0[0] = salt_buf0[0]; + s0[1] = salt_buf0[1]; + s0[2] = salt_buf0[2]; + s0[3] = salt_buf0[3]; + + u32 s1[4]; + + s1[0] = salt_buf1[0]; + s1[1] = salt_buf1[1]; + s1[2] = salt_buf1[2]; + s1[3] = salt_buf1[3]; + + u32 s2[4]; + + s2[0] = 0; + s2[1] = 0; + s2[2] = 0; + s2[3] = 0; + + u32 s3[4]; + + s3[0] = 0; + s3[1] = 0; + s3[2] = 0; + s3[3] = 0; + + switch_buffer_by_offset (s0, s1, s2, s3, pw_len); + + const u32 pw_salt_len = pw_len + salt_len; + + u32x w0[4]; + + w0[0] = wordl0[0] | wordr0[0] | s0[0]; + w0[1] = wordl0[1] | wordr0[1] | s0[1]; + w0[2] = wordl0[2] | wordr0[2] | s0[2]; + w0[3] = wordl0[3] | wordr0[3] | s0[3]; + + u32x w1[4]; + + w1[0] = wordl1[0] | wordr1[0] | s1[0]; + w1[1] = wordl1[1] | wordr1[1] | s1[1]; + w1[2] = wordl1[2] | wordr1[2] | s1[2]; + w1[3] = wordl1[3] | wordr1[3] | s1[3]; + + u32x w2[4]; + + w2[0] = wordl2[0] | wordr2[0] | s2[0]; + w2[1] = wordl2[1] | wordr2[1] | s2[1]; + w2[2] = wordl2[2] | wordr2[2] | s2[2]; + w2[3] = wordl2[3] | wordr2[3] | s2[3]; + + u32x w3[4]; + + w3[0] = wordl3[0] | wordr3[0] | s3[0]; + w3[1] = wordl3[1] | wordr3[1] | s3[1]; + w3[2] = 0; + w3[3] = 0; + + append_0x80_4 (w0, w1, w2, w3, pw_salt_len); + + /** + * sha1 + */ + + u32x w0_t = swap_workaround (w0[0]); + u32x w1_t = swap_workaround (w0[1]); + u32x w2_t = swap_workaround (w0[2]); + u32x w3_t = swap_workaround (w0[3]); + u32x w4_t = swap_workaround (w1[0]); + u32x w5_t = swap_workaround (w1[1]); + u32x w6_t = swap_workaround (w1[2]); + u32x w7_t = swap_workaround (w1[3]); + u32x w8_t = swap_workaround (w2[0]); + u32x w9_t = swap_workaround (w2[1]); + u32x wa_t = swap_workaround (w2[2]); + u32x wb_t = swap_workaround (w2[3]); + u32x wc_t = swap_workaround (w3[0]); + u32x wd_t = swap_workaround (w3[1]); + u32x we_t = 0; + u32x wf_t = pw_salt_len * 8; + + u32x a = SHA1M_A; + u32x b = SHA1M_B; + u32x c = SHA1M_C; + u32x d = SHA1M_D; + u32x e = SHA1M_E; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w0_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w1_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w2_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w3_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w4_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w5_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w6_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w7_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w8_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w9_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wa_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, wb_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, wc_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, wd_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, we_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F0o, e, a, b, c, d, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F0o, d, e, a, b, c, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F0o, c, d, e, a, b, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F0o, b, c, d, e, a, w3_t); + + #undef K + #define K SHA1C01 + + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w7_t); + + #undef K + #define K SHA1C02 + + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wb_t); + + #undef K + #define K SHA1C03 + + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wb_t); + + if (allx (e != e_rev)) continue; + + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wf_t); + + + const u32x r0 = d; + const u32x r1 = e; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_S + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m00110_s08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m00110_s16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/amd/m00110_a3.cl b/amd/m00110_a3.cl new file mode 100644 index 0000000000..d99c7fb90c --- /dev/null +++ b/amd/m00110_a3.cl @@ -0,0 +1,857 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _SHA1_ +#define _SCALAR_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW4 +#define VECT_SIZE4 +#endif + +#ifdef VLIW5 +#define VECT_SIZE4 +#endif + +#define DGST_R0 3 +#define DGST_R1 4 +#define DGST_R2 2 +#define DGST_R3 1 + +#include "include/kernel_functions.c" +#include "types_amd.c" +#include "common_amd.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4_warp.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4_warp.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4_warp.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4_warp.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4_warp.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4_warp.c" +#endif + +static void m00110m (u32 w[16], const u32 pw_len, __global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global u32x * words_buf_r, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset) +{ + /** + * modifier + */ + + const u32 gid = get_global_id (0); + const u32 lid = get_local_id (0); + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[ 1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[ 2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[ 3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[ 4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[ 5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[ 6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[ 7]; + + u32 salt_buf2[4]; + + salt_buf2[0] = salt_bufs[salt_pos].salt_buf[ 8]; + salt_buf2[1] = 0; + salt_buf2[2] = 0; + salt_buf2[3] = 0; + + u32 salt_buf3[4]; + + salt_buf3[0] = 0; + salt_buf3[1] = 0; + salt_buf3[2] = 0; + salt_buf3[3] = 0; + + switch_buffer_by_offset (salt_buf0, salt_buf1, salt_buf2, salt_buf3, pw_len); + + w[ 0] |= swap_workaround (salt_buf0[0]); + w[ 1] |= swap_workaround (salt_buf0[1]); + w[ 2] |= swap_workaround (salt_buf0[2]); + w[ 3] |= swap_workaround (salt_buf0[3]); + w[ 4] |= swap_workaround (salt_buf1[0]); + w[ 5] |= swap_workaround (salt_buf1[1]); + w[ 6] |= swap_workaround (salt_buf1[2]); + w[ 7] |= swap_workaround (salt_buf1[3]); + w[ 8] |= swap_workaround (salt_buf2[0]); + w[ 9] |= swap_workaround (salt_buf2[1]); + w[10] |= swap_workaround (salt_buf2[2]); + w[11] |= swap_workaround (salt_buf2[3]); + w[12] |= swap_workaround (salt_buf3[0]); + w[13] |= swap_workaround (salt_buf3[1]); + w[14] |= swap_workaround (salt_buf3[2]); + w[15] |= swap_workaround (salt_buf3[3]); + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + const u32 pw_salt_len = pw_len + salt_len; + + w[15] = pw_salt_len * 8; + + /** + * base + */ + + const u32 c_16s = rotl32 ((w[13] ^ w[ 8] ^ w[ 2] ), 1u); + const u32 c_17s = rotl32 ((w[14] ^ w[ 9] ^ w[ 3] ^ w[ 1]), 1u); + const u32 c_18s = rotl32 ((w[15] ^ w[10] ^ w[ 4] ^ w[ 2]), 1u); + const u32 c_19s = rotl32 ((c_16s ^ w[11] ^ w[ 5] ^ w[ 3]), 1u); + const u32 c_20s = rotl32 ((c_17s ^ w[12] ^ w[ 6] ^ w[ 4]), 1u); + const u32 c_21s = rotl32 ((c_18s ^ w[13] ^ w[ 7] ^ w[ 5]), 1u); + const u32 c_22s = rotl32 ((c_19s ^ w[14] ^ w[ 8] ^ w[ 6]), 1u); + const u32 c_23s = rotl32 ((c_20s ^ w[15] ^ w[ 9] ^ w[ 7]), 1u); + const u32 c_24s = rotl32 ((c_21s ^ c_16s ^ w[10] ^ w[ 8]), 1u); + const u32 c_25s = rotl32 ((c_22s ^ c_17s ^ w[11] ^ w[ 9]), 1u); + const u32 c_26s = rotl32 ((c_23s ^ c_18s ^ w[12] ^ w[10]), 1u); + const u32 c_27s = rotl32 ((c_24s ^ c_19s ^ w[13] ^ w[11]), 1u); + const u32 c_28s = rotl32 ((c_25s ^ c_20s ^ w[14] ^ w[12]), 1u); + const u32 c_29s = rotl32 ((c_26s ^ c_21s ^ w[15] ^ w[13]), 1u); + const u32 c_30s = rotl32 ((c_27s ^ c_22s ^ c_16s ^ w[14]), 1u); + const u32 c_31s = rotl32 ((c_28s ^ c_23s ^ c_17s ^ w[15]), 1u); + const u32 c_32s = rotl32 ((c_29s ^ c_24s ^ c_18s ^ c_16s), 1u); + const u32 c_33s = rotl32 ((c_30s ^ c_25s ^ c_19s ^ c_17s), 1u); + const u32 c_34s = rotl32 ((c_31s ^ c_26s ^ c_20s ^ c_18s), 1u); + const u32 c_35s = rotl32 ((c_32s ^ c_27s ^ c_21s ^ c_19s), 1u); + const u32 c_36s = rotl32 ((c_33s ^ c_28s ^ c_22s ^ c_20s), 1u); + const u32 c_37s = rotl32 ((c_34s ^ c_29s ^ c_23s ^ c_21s), 1u); + const u32 c_38s = rotl32 ((c_35s ^ c_30s ^ c_24s ^ c_22s), 1u); + const u32 c_39s = rotl32 ((c_36s ^ c_31s ^ c_25s ^ c_23s), 1u); + const u32 c_40s = rotl32 ((c_37s ^ c_32s ^ c_26s ^ c_24s), 1u); + const u32 c_41s = rotl32 ((c_38s ^ c_33s ^ c_27s ^ c_25s), 1u); + const u32 c_42s = rotl32 ((c_39s ^ c_34s ^ c_28s ^ c_26s), 1u); + const u32 c_43s = rotl32 ((c_40s ^ c_35s ^ c_29s ^ c_27s), 1u); + const u32 c_44s = rotl32 ((c_41s ^ c_36s ^ c_30s ^ c_28s), 1u); + const u32 c_45s = rotl32 ((c_42s ^ c_37s ^ c_31s ^ c_29s), 1u); + const u32 c_46s = rotl32 ((c_43s ^ c_38s ^ c_32s ^ c_30s), 1u); + const u32 c_47s = rotl32 ((c_44s ^ c_39s ^ c_33s ^ c_31s), 1u); + const u32 c_48s = rotl32 ((c_45s ^ c_40s ^ c_34s ^ c_32s), 1u); + const u32 c_49s = rotl32 ((c_46s ^ c_41s ^ c_35s ^ c_33s), 1u); + const u32 c_50s = rotl32 ((c_47s ^ c_42s ^ c_36s ^ c_34s), 1u); + const u32 c_51s = rotl32 ((c_48s ^ c_43s ^ c_37s ^ c_35s), 1u); + const u32 c_52s = rotl32 ((c_49s ^ c_44s ^ c_38s ^ c_36s), 1u); + const u32 c_53s = rotl32 ((c_50s ^ c_45s ^ c_39s ^ c_37s), 1u); + const u32 c_54s = rotl32 ((c_51s ^ c_46s ^ c_40s ^ c_38s), 1u); + const u32 c_55s = rotl32 ((c_52s ^ c_47s ^ c_41s ^ c_39s), 1u); + const u32 c_56s = rotl32 ((c_53s ^ c_48s ^ c_42s ^ c_40s), 1u); + const u32 c_57s = rotl32 ((c_54s ^ c_49s ^ c_43s ^ c_41s), 1u); + const u32 c_58s = rotl32 ((c_55s ^ c_50s ^ c_44s ^ c_42s), 1u); + const u32 c_59s = rotl32 ((c_56s ^ c_51s ^ c_45s ^ c_43s), 1u); + const u32 c_60s = rotl32 ((c_57s ^ c_52s ^ c_46s ^ c_44s), 1u); + const u32 c_61s = rotl32 ((c_58s ^ c_53s ^ c_47s ^ c_45s), 1u); + const u32 c_62s = rotl32 ((c_59s ^ c_54s ^ c_48s ^ c_46s), 1u); + const u32 c_63s = rotl32 ((c_60s ^ c_55s ^ c_49s ^ c_47s), 1u); + const u32 c_64s = rotl32 ((c_61s ^ c_56s ^ c_50s ^ c_48s), 1u); + const u32 c_65s = rotl32 ((c_62s ^ c_57s ^ c_51s ^ c_49s), 1u); + const u32 c_66s = rotl32 ((c_63s ^ c_58s ^ c_52s ^ c_50s), 1u); + const u32 c_67s = rotl32 ((c_64s ^ c_59s ^ c_53s ^ c_51s), 1u); + const u32 c_68s = rotl32 ((c_65s ^ c_60s ^ c_54s ^ c_52s), 1u); + const u32 c_69s = rotl32 ((c_66s ^ c_61s ^ c_55s ^ c_53s), 1u); + const u32 c_70s = rotl32 ((c_67s ^ c_62s ^ c_56s ^ c_54s), 1u); + const u32 c_71s = rotl32 ((c_68s ^ c_63s ^ c_57s ^ c_55s), 1u); + const u32 c_72s = rotl32 ((c_69s ^ c_64s ^ c_58s ^ c_56s), 1u); + const u32 c_73s = rotl32 ((c_70s ^ c_65s ^ c_59s ^ c_57s), 1u); + const u32 c_74s = rotl32 ((c_71s ^ c_66s ^ c_60s ^ c_58s), 1u); + const u32 c_75s = rotl32 ((c_72s ^ c_67s ^ c_61s ^ c_59s), 1u); + const u32 c_76s = rotl32 ((c_73s ^ c_68s ^ c_62s ^ c_60s), 1u); + const u32 c_77s = rotl32 ((c_74s ^ c_69s ^ c_63s ^ c_61s), 1u); + const u32 c_78s = rotl32 ((c_75s ^ c_70s ^ c_64s ^ c_62s), 1u); + const u32 c_79s = rotl32 ((c_76s ^ c_71s ^ c_65s ^ c_63s), 1u); + + const u32 c_17sK = c_17s + SHA1C00; + const u32 c_18sK = c_18s + SHA1C00; + const u32 c_20sK = c_20s + SHA1C01; + const u32 c_21sK = c_21s + SHA1C01; + const u32 c_23sK = c_23s + SHA1C01; + const u32 c_26sK = c_26s + SHA1C01; + const u32 c_27sK = c_27s + SHA1C01; + const u32 c_29sK = c_29s + SHA1C01; + const u32 c_33sK = c_33s + SHA1C01; + const u32 c_39sK = c_39s + SHA1C01; + const u32 c_41sK = c_41s + SHA1C02; + const u32 c_45sK = c_45s + SHA1C02; + const u32 c_53sK = c_53s + SHA1C02; + const u32 c_65sK = c_65s + SHA1C03; + const u32 c_69sK = c_69s + SHA1C03; + + /** + * loop + */ + + const u32 bf_loops = ceil ((float) bfs_cnt / VECT_DIV); + + u32x w0l = w[0]; + + for (u32 il_pos = 0; il_pos < bf_loops; il_pos++) + { + const u32x w0r = words_buf_r[il_pos]; + + const u32x w0 = w0l | w0r; + + const u32x w0s01 = rotl32 (w0, 1u); + const u32x w0s02 = rotl32 (w0, 2u); + const u32x w0s03 = rotl32 (w0, 3u); + const u32x w0s04 = rotl32 (w0, 4u); + const u32x w0s05 = rotl32 (w0, 5u); + const u32x w0s06 = rotl32 (w0, 6u); + const u32x w0s07 = rotl32 (w0, 7u); + const u32x w0s08 = rotl32 (w0, 8u); + const u32x w0s09 = rotl32 (w0, 9u); + const u32x w0s10 = rotl32 (w0, 10u); + const u32x w0s11 = rotl32 (w0, 11u); + const u32x w0s12 = rotl32 (w0, 12u); + const u32x w0s13 = rotl32 (w0, 13u); + const u32x w0s14 = rotl32 (w0, 14u); + const u32x w0s15 = rotl32 (w0, 15u); + const u32x w0s16 = rotl32 (w0, 16u); + const u32x w0s17 = rotl32 (w0, 17u); + const u32x w0s18 = rotl32 (w0, 18u); + const u32x w0s19 = rotl32 (w0, 19u); + const u32x w0s20 = rotl32 (w0, 20u); + const u32x w0s21 = rotl32 (w0, 21u); + const u32x w0s22 = rotl32 (w0, 22U); + + const u32x w0s04___w0s06 = w0s04 ^ w0s06; + const u32x w0s04___w0s08 = w0s04 ^ w0s08; + const u32x w0s08___w0s12 = w0s08 ^ w0s12; + const u32x w0s04___w0s06___w0s07 = w0s04___w0s06 ^ w0s07; + + u32x a = SHA1M_A; + u32x b = SHA1M_B; + u32x c = SHA1M_C; + u32x d = SHA1M_D; + u32x e = SHA1M_E; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w0); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w[ 1]); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w[ 2]); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w[ 3]); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w[ 4]); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w[ 5]); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w[ 6]); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w[ 7]); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w[ 8]); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w[ 9]); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w[10]); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w[11]); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w[12]); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w[13]); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w[14]); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w[15]); + + SHA1_STEP (SHA1_F0o, e, a, b, c, d, (c_16s ^ w0s01)); + SHA1_STEPX(SHA1_F0o, d, e, a, b, c, (c_17sK)); + SHA1_STEPX(SHA1_F0o, c, d, e, a, b, (c_18sK)); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, (c_19s ^ w0s02)); + + #undef K + #define K SHA1C01 + + SHA1_STEPX(SHA1_F1 , a, b, c, d, e, (c_20sK)); + SHA1_STEPX(SHA1_F1 , e, a, b, c, d, (c_21sK)); + SHA1_STEP (SHA1_F1 , d, e, a, b, c, (c_22s ^ w0s03)); + SHA1_STEPX(SHA1_F1 , c, d, e, a, b, (c_23sK)); + SHA1_STEP (SHA1_F1 , b, c, d, e, a, (c_24s ^ w0s02)); + SHA1_STEP (SHA1_F1 , a, b, c, d, e, (c_25s ^ w0s04)); + SHA1_STEPX(SHA1_F1 , e, a, b, c, d, (c_26sK)); + SHA1_STEPX(SHA1_F1 , d, e, a, b, c, (c_27sK)); + SHA1_STEP (SHA1_F1 , c, d, e, a, b, (c_28s ^ w0s05)); + SHA1_STEPX(SHA1_F1 , b, c, d, e, a, (c_29sK)); + SHA1_STEP (SHA1_F1 , a, b, c, d, e, (c_30s ^ w0s02 ^ w0s04)); + SHA1_STEP (SHA1_F1 , e, a, b, c, d, (c_31s ^ w0s06)); + SHA1_STEP (SHA1_F1 , d, e, a, b, c, (c_32s ^ w0s02 ^ w0s03)); + SHA1_STEPX(SHA1_F1 , c, d, e, a, b, (c_33sK)); + SHA1_STEP (SHA1_F1 , b, c, d, e, a, (c_34s ^ w0s07)); + SHA1_STEP (SHA1_F1 , a, b, c, d, e, (c_35s ^ w0s04)); + SHA1_STEP (SHA1_F1 , e, a, b, c, d, (c_36s ^ w0s04___w0s06)); + SHA1_STEP (SHA1_F1 , d, e, a, b, c, (c_37s ^ w0s08)); + SHA1_STEP (SHA1_F1 , c, d, e, a, b, (c_38s ^ w0s04)); + SHA1_STEPX(SHA1_F1 , b, c, d, e, a, (c_39sK)); + + #undef K + #define K SHA1C02 + + SHA1_STEP (SHA1_F2o, a, b, c, d, e, (c_40s ^ w0s04 ^ w0s09)); + SHA1_STEPX(SHA1_F2o, e, a, b, c, d, (c_41sK)); + SHA1_STEP (SHA1_F2o, d, e, a, b, c, (c_42s ^ w0s06 ^ w0s08)); + SHA1_STEP (SHA1_F2o, c, d, e, a, b, (c_43s ^ w0s10)); + SHA1_STEP (SHA1_F2o, b, c, d, e, a, (c_44s ^ w0s03 ^ w0s06 ^ w0s07)); + SHA1_STEPX(SHA1_F2o, a, b, c, d, e, (c_45sK)); + SHA1_STEP (SHA1_F2o, e, a, b, c, d, (c_46s ^ w0s04 ^ w0s11)); + SHA1_STEP (SHA1_F2o, d, e, a, b, c, (c_47s ^ w0s04___w0s08)); + SHA1_STEP (SHA1_F2o, c, d, e, a, b, (c_48s ^ w0s03 ^ w0s04___w0s08 ^ w0s05 ^ w0s10)); + SHA1_STEP (SHA1_F2o, b, c, d, e, a, (c_49s ^ w0s12)); + SHA1_STEP (SHA1_F2o, a, b, c, d, e, (c_50s ^ w0s08)); + SHA1_STEP (SHA1_F2o, e, a, b, c, d, (c_51s ^ w0s04___w0s06)); + SHA1_STEP (SHA1_F2o, d, e, a, b, c, (c_52s ^ w0s04___w0s08 ^ w0s13)); + SHA1_STEPX(SHA1_F2o, c, d, e, a, b, (c_53sK)); + SHA1_STEP (SHA1_F2o, b, c, d, e, a, (c_54s ^ w0s07 ^ w0s10 ^ w0s12)); + SHA1_STEP (SHA1_F2o, a, b, c, d, e, (c_55s ^ w0s14)); + SHA1_STEP (SHA1_F2o, e, a, b, c, d, (c_56s ^ w0s04___w0s06___w0s07 ^ w0s10 ^ w0s11)); + SHA1_STEP (SHA1_F2o, d, e, a, b, c, (c_57s ^ w0s08)); + SHA1_STEP (SHA1_F2o, c, d, e, a, b, (c_58s ^ w0s04___w0s08 ^ w0s15)); + SHA1_STEP (SHA1_F2o, b, c, d, e, a, (c_59s ^ w0s08___w0s12)); + + #undef K + #define K SHA1C03 + + SHA1_STEP (SHA1_F1 , a, b, c, d, e, (c_60s ^ w0s04 ^ w0s08___w0s12 ^ w0s07 ^ w0s14)); + SHA1_STEP (SHA1_F1 , e, a, b, c, d, (c_61s ^ w0s16)); + SHA1_STEP (SHA1_F1 , d, e, a, b, c, (c_62s ^ w0s04___w0s06 ^ w0s08___w0s12)); + SHA1_STEP (SHA1_F1 , c, d, e, a, b, (c_63s ^ w0s08)); + SHA1_STEP (SHA1_F1 , b, c, d, e, a, (c_64s ^ w0s04___w0s06___w0s07 ^ w0s08___w0s12 ^ w0s17)); + SHA1_STEPX(SHA1_F1 , a, b, c, d, e, (c_65sK)); + SHA1_STEP (SHA1_F1 , e, a, b, c, d, (c_66s ^ w0s14 ^ w0s16)); + SHA1_STEP (SHA1_F1 , d, e, a, b, c, (c_67s ^ w0s08 ^ w0s18)); + SHA1_STEP (SHA1_F1 , c, d, e, a, b, (c_68s ^ w0s11 ^ w0s14 ^ w0s15)); + SHA1_STEPX(SHA1_F1 , b, c, d, e, a, (c_69sK)); + SHA1_STEP (SHA1_F1 , a, b, c, d, e, (c_70s ^ w0s12 ^ w0s19)); + SHA1_STEP (SHA1_F1 , e, a, b, c, d, (c_71s ^ w0s12 ^ w0s16)); + SHA1_STEP (SHA1_F1 , d, e, a, b, c, (c_72s ^ w0s05 ^ w0s11 ^ w0s12 ^ w0s13 ^ w0s16 ^ w0s18)); + SHA1_STEP (SHA1_F1 , c, d, e, a, b, (c_73s ^ w0s20)); + SHA1_STEP (SHA1_F1 , b, c, d, e, a, (c_74s ^ w0s08 ^ w0s16)); + SHA1_STEP (SHA1_F1 , a, b, c, d, e, (c_75s ^ w0s06 ^ w0s12 ^ w0s14)); + SHA1_STEP (SHA1_F1 , e, a, b, c, d, (c_76s ^ w0s07 ^ w0s08___w0s12 ^ w0s16 ^ w0s21)); + SHA1_STEP (SHA1_F1 , d, e, a, b, c, (c_77s)); + SHA1_STEP (SHA1_F1 , c, d, e, a, b, (c_78s ^ w0s07 ^ w0s08 ^ w0s15 ^ w0s18 ^ w0s20)); + SHA1_STEP (SHA1_F1 , b, c, d, e, a, (c_79s ^ w0s08 ^ w0s22)); + + + const u32x r0 = d; + const u32x r1 = e; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_M + } +} + +static void m00110s (u32 w[16], const u32 pw_len, __global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global u32x * words_buf_r, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset) +{ + /** + * modifier + */ + + const u32 gid = get_global_id (0); + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 c_16s = rotl32 ((w[13] ^ w[ 8] ^ w[ 2] ), 1u); + const u32 c_17s = rotl32 ((w[14] ^ w[ 9] ^ w[ 3] ^ w[ 1]), 1u); + const u32 c_18s = rotl32 ((w[15] ^ w[10] ^ w[ 4] ^ w[ 2]), 1u); + const u32 c_19s = rotl32 ((c_16s ^ w[11] ^ w[ 5] ^ w[ 3]), 1u); + const u32 c_20s = rotl32 ((c_17s ^ w[12] ^ w[ 6] ^ w[ 4]), 1u); + const u32 c_21s = rotl32 ((c_18s ^ w[13] ^ w[ 7] ^ w[ 5]), 1u); + const u32 c_22s = rotl32 ((c_19s ^ w[14] ^ w[ 8] ^ w[ 6]), 1u); + const u32 c_23s = rotl32 ((c_20s ^ w[15] ^ w[ 9] ^ w[ 7]), 1u); + const u32 c_24s = rotl32 ((c_21s ^ c_16s ^ w[10] ^ w[ 8]), 1u); + const u32 c_25s = rotl32 ((c_22s ^ c_17s ^ w[11] ^ w[ 9]), 1u); + const u32 c_26s = rotl32 ((c_23s ^ c_18s ^ w[12] ^ w[10]), 1u); + const u32 c_27s = rotl32 ((c_24s ^ c_19s ^ w[13] ^ w[11]), 1u); + const u32 c_28s = rotl32 ((c_25s ^ c_20s ^ w[14] ^ w[12]), 1u); + const u32 c_29s = rotl32 ((c_26s ^ c_21s ^ w[15] ^ w[13]), 1u); + const u32 c_30s = rotl32 ((c_27s ^ c_22s ^ c_16s ^ w[14]), 1u); + const u32 c_31s = rotl32 ((c_28s ^ c_23s ^ c_17s ^ w[15]), 1u); + const u32 c_32s = rotl32 ((c_29s ^ c_24s ^ c_18s ^ c_16s), 1u); + const u32 c_33s = rotl32 ((c_30s ^ c_25s ^ c_19s ^ c_17s), 1u); + const u32 c_34s = rotl32 ((c_31s ^ c_26s ^ c_20s ^ c_18s), 1u); + const u32 c_35s = rotl32 ((c_32s ^ c_27s ^ c_21s ^ c_19s), 1u); + const u32 c_36s = rotl32 ((c_33s ^ c_28s ^ c_22s ^ c_20s), 1u); + const u32 c_37s = rotl32 ((c_34s ^ c_29s ^ c_23s ^ c_21s), 1u); + const u32 c_38s = rotl32 ((c_35s ^ c_30s ^ c_24s ^ c_22s), 1u); + const u32 c_39s = rotl32 ((c_36s ^ c_31s ^ c_25s ^ c_23s), 1u); + const u32 c_40s = rotl32 ((c_37s ^ c_32s ^ c_26s ^ c_24s), 1u); + const u32 c_41s = rotl32 ((c_38s ^ c_33s ^ c_27s ^ c_25s), 1u); + const u32 c_42s = rotl32 ((c_39s ^ c_34s ^ c_28s ^ c_26s), 1u); + const u32 c_43s = rotl32 ((c_40s ^ c_35s ^ c_29s ^ c_27s), 1u); + const u32 c_44s = rotl32 ((c_41s ^ c_36s ^ c_30s ^ c_28s), 1u); + const u32 c_45s = rotl32 ((c_42s ^ c_37s ^ c_31s ^ c_29s), 1u); + const u32 c_46s = rotl32 ((c_43s ^ c_38s ^ c_32s ^ c_30s), 1u); + const u32 c_47s = rotl32 ((c_44s ^ c_39s ^ c_33s ^ c_31s), 1u); + const u32 c_48s = rotl32 ((c_45s ^ c_40s ^ c_34s ^ c_32s), 1u); + const u32 c_49s = rotl32 ((c_46s ^ c_41s ^ c_35s ^ c_33s), 1u); + const u32 c_50s = rotl32 ((c_47s ^ c_42s ^ c_36s ^ c_34s), 1u); + const u32 c_51s = rotl32 ((c_48s ^ c_43s ^ c_37s ^ c_35s), 1u); + const u32 c_52s = rotl32 ((c_49s ^ c_44s ^ c_38s ^ c_36s), 1u); + const u32 c_53s = rotl32 ((c_50s ^ c_45s ^ c_39s ^ c_37s), 1u); + const u32 c_54s = rotl32 ((c_51s ^ c_46s ^ c_40s ^ c_38s), 1u); + const u32 c_55s = rotl32 ((c_52s ^ c_47s ^ c_41s ^ c_39s), 1u); + const u32 c_56s = rotl32 ((c_53s ^ c_48s ^ c_42s ^ c_40s), 1u); + const u32 c_57s = rotl32 ((c_54s ^ c_49s ^ c_43s ^ c_41s), 1u); + const u32 c_58s = rotl32 ((c_55s ^ c_50s ^ c_44s ^ c_42s), 1u); + const u32 c_59s = rotl32 ((c_56s ^ c_51s ^ c_45s ^ c_43s), 1u); + const u32 c_60s = rotl32 ((c_57s ^ c_52s ^ c_46s ^ c_44s), 1u); + const u32 c_61s = rotl32 ((c_58s ^ c_53s ^ c_47s ^ c_45s), 1u); + const u32 c_62s = rotl32 ((c_59s ^ c_54s ^ c_48s ^ c_46s), 1u); + const u32 c_63s = rotl32 ((c_60s ^ c_55s ^ c_49s ^ c_47s), 1u); + const u32 c_64s = rotl32 ((c_61s ^ c_56s ^ c_50s ^ c_48s), 1u); + const u32 c_65s = rotl32 ((c_62s ^ c_57s ^ c_51s ^ c_49s), 1u); + const u32 c_66s = rotl32 ((c_63s ^ c_58s ^ c_52s ^ c_50s), 1u); + const u32 c_67s = rotl32 ((c_64s ^ c_59s ^ c_53s ^ c_51s), 1u); + const u32 c_68s = rotl32 ((c_65s ^ c_60s ^ c_54s ^ c_52s), 1u); + const u32 c_69s = rotl32 ((c_66s ^ c_61s ^ c_55s ^ c_53s), 1u); + const u32 c_70s = rotl32 ((c_67s ^ c_62s ^ c_56s ^ c_54s), 1u); + const u32 c_71s = rotl32 ((c_68s ^ c_63s ^ c_57s ^ c_55s), 1u); + const u32 c_72s = rotl32 ((c_69s ^ c_64s ^ c_58s ^ c_56s), 1u); + const u32 c_73s = rotl32 ((c_70s ^ c_65s ^ c_59s ^ c_57s), 1u); + const u32 c_74s = rotl32 ((c_71s ^ c_66s ^ c_60s ^ c_58s), 1u); + const u32 c_75s = rotl32 ((c_72s ^ c_67s ^ c_61s ^ c_59s), 1u); + + const u32 c_17sK = c_17s + SHA1C00; + const u32 c_18sK = c_18s + SHA1C00; + const u32 c_20sK = c_20s + SHA1C01; + const u32 c_21sK = c_21s + SHA1C01; + const u32 c_23sK = c_23s + SHA1C01; + const u32 c_26sK = c_26s + SHA1C01; + const u32 c_27sK = c_27s + SHA1C01; + const u32 c_29sK = c_29s + SHA1C01; + const u32 c_33sK = c_33s + SHA1C01; + const u32 c_39sK = c_39s + SHA1C01; + const u32 c_41sK = c_41s + SHA1C02; + const u32 c_45sK = c_45s + SHA1C02; + const u32 c_53sK = c_53s + SHA1C02; + const u32 c_65sK = c_65s + SHA1C03; + const u32 c_69sK = c_69s + SHA1C03; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * reverse + */ + + const u32 e_rev = rotl32 (search[1], 2u) - SHA1C03; + + /** + * loop + */ + + const u32 bf_loops = ceil ((float) bfs_cnt / VECT_DIV); + + u32x w0l = w[0]; + + for (u32 il_pos = 0; il_pos < bf_loops; il_pos++) + { + const u32x w0r = words_buf_r[il_pos]; + + const u32x w0 = w0l | w0r; + + const u32x w0s01 = rotl32 (w0, 1u); + const u32x w0s02 = rotl32 (w0, 2u); + const u32x w0s03 = rotl32 (w0, 3u); + const u32x w0s04 = rotl32 (w0, 4u); + const u32x w0s05 = rotl32 (w0, 5u); + const u32x w0s06 = rotl32 (w0, 6u); + const u32x w0s07 = rotl32 (w0, 7u); + const u32x w0s08 = rotl32 (w0, 8u); + const u32x w0s09 = rotl32 (w0, 9u); + const u32x w0s10 = rotl32 (w0, 10u); + const u32x w0s11 = rotl32 (w0, 11u); + const u32x w0s12 = rotl32 (w0, 12u); + const u32x w0s13 = rotl32 (w0, 13u); + const u32x w0s14 = rotl32 (w0, 14u); + const u32x w0s15 = rotl32 (w0, 15u); + const u32x w0s16 = rotl32 (w0, 16u); + const u32x w0s17 = rotl32 (w0, 17u); + const u32x w0s18 = rotl32 (w0, 18u); + const u32x w0s19 = rotl32 (w0, 19u); + const u32x w0s20 = rotl32 (w0, 20u); + + const u32x w0s04___w0s06 = w0s04 ^ w0s06; + const u32x w0s04___w0s08 = w0s04 ^ w0s08; + const u32x w0s08___w0s12 = w0s08 ^ w0s12; + const u32x w0s04___w0s06___w0s07 = w0s04___w0s06 ^ w0s07; + + u32x a = SHA1M_A; + u32x b = SHA1M_B; + u32x c = SHA1M_C; + u32x d = SHA1M_D; + u32x e = SHA1M_E; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w0); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w[ 1]); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w[ 2]); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w[ 3]); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w[ 4]); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w[ 5]); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w[ 6]); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w[ 7]); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w[ 8]); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w[ 9]); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w[10]); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w[11]); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w[12]); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w[13]); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w[14]); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w[15]); + + SHA1_STEP (SHA1_F0o, e, a, b, c, d, (c_16s ^ w0s01)); + SHA1_STEPX(SHA1_F0o, d, e, a, b, c, (c_17sK)); + SHA1_STEPX(SHA1_F0o, c, d, e, a, b, (c_18sK)); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, (c_19s ^ w0s02)); + + #undef K + #define K SHA1C01 + + SHA1_STEPX(SHA1_F1 , a, b, c, d, e, (c_20sK)); + SHA1_STEPX(SHA1_F1 , e, a, b, c, d, (c_21sK)); + SHA1_STEP (SHA1_F1 , d, e, a, b, c, (c_22s ^ w0s03)); + SHA1_STEPX(SHA1_F1 , c, d, e, a, b, (c_23sK)); + SHA1_STEP (SHA1_F1 , b, c, d, e, a, (c_24s ^ w0s02)); + SHA1_STEP (SHA1_F1 , a, b, c, d, e, (c_25s ^ w0s04)); + SHA1_STEPX(SHA1_F1 , e, a, b, c, d, (c_26sK)); + SHA1_STEPX(SHA1_F1 , d, e, a, b, c, (c_27sK)); + SHA1_STEP (SHA1_F1 , c, d, e, a, b, (c_28s ^ w0s05)); + SHA1_STEPX(SHA1_F1 , b, c, d, e, a, (c_29sK)); + SHA1_STEP (SHA1_F1 , a, b, c, d, e, (c_30s ^ w0s02 ^ w0s04)); + SHA1_STEP (SHA1_F1 , e, a, b, c, d, (c_31s ^ w0s06)); + SHA1_STEP (SHA1_F1 , d, e, a, b, c, (c_32s ^ w0s02 ^ w0s03)); + SHA1_STEPX(SHA1_F1 , c, d, e, a, b, (c_33sK)); + SHA1_STEP (SHA1_F1 , b, c, d, e, a, (c_34s ^ w0s07)); + SHA1_STEP (SHA1_F1 , a, b, c, d, e, (c_35s ^ w0s04)); + SHA1_STEP (SHA1_F1 , e, a, b, c, d, (c_36s ^ w0s04___w0s06)); + SHA1_STEP (SHA1_F1 , d, e, a, b, c, (c_37s ^ w0s08)); + SHA1_STEP (SHA1_F1 , c, d, e, a, b, (c_38s ^ w0s04)); + SHA1_STEPX(SHA1_F1 , b, c, d, e, a, (c_39sK)); + + #undef K + #define K SHA1C02 + + SHA1_STEP (SHA1_F2o, a, b, c, d, e, (c_40s ^ w0s04 ^ w0s09)); + SHA1_STEPX(SHA1_F2o, e, a, b, c, d, (c_41sK)); + SHA1_STEP (SHA1_F2o, d, e, a, b, c, (c_42s ^ w0s06 ^ w0s08)); + SHA1_STEP (SHA1_F2o, c, d, e, a, b, (c_43s ^ w0s10)); + SHA1_STEP (SHA1_F2o, b, c, d, e, a, (c_44s ^ w0s03 ^ w0s06 ^ w0s07)); + SHA1_STEPX(SHA1_F2o, a, b, c, d, e, (c_45sK)); + SHA1_STEP (SHA1_F2o, e, a, b, c, d, (c_46s ^ w0s04 ^ w0s11)); + SHA1_STEP (SHA1_F2o, d, e, a, b, c, (c_47s ^ w0s04___w0s08)); + SHA1_STEP (SHA1_F2o, c, d, e, a, b, (c_48s ^ w0s03 ^ w0s04___w0s08 ^ w0s05 ^ w0s10)); + SHA1_STEP (SHA1_F2o, b, c, d, e, a, (c_49s ^ w0s12)); + SHA1_STEP (SHA1_F2o, a, b, c, d, e, (c_50s ^ w0s08)); + SHA1_STEP (SHA1_F2o, e, a, b, c, d, (c_51s ^ w0s04___w0s06)); + SHA1_STEP (SHA1_F2o, d, e, a, b, c, (c_52s ^ w0s04___w0s08 ^ w0s13)); + SHA1_STEPX(SHA1_F2o, c, d, e, a, b, (c_53sK)); + SHA1_STEP (SHA1_F2o, b, c, d, e, a, (c_54s ^ w0s07 ^ w0s10 ^ w0s12)); + SHA1_STEP (SHA1_F2o, a, b, c, d, e, (c_55s ^ w0s14)); + SHA1_STEP (SHA1_F2o, e, a, b, c, d, (c_56s ^ w0s04___w0s06___w0s07 ^ w0s10 ^ w0s11)); + SHA1_STEP (SHA1_F2o, d, e, a, b, c, (c_57s ^ w0s08)); + SHA1_STEP (SHA1_F2o, c, d, e, a, b, (c_58s ^ w0s04___w0s08 ^ w0s15)); + SHA1_STEP (SHA1_F2o, b, c, d, e, a, (c_59s ^ w0s08___w0s12)); + + #undef K + #define K SHA1C03 + + SHA1_STEP (SHA1_F1 , a, b, c, d, e, (c_60s ^ w0s04 ^ w0s08___w0s12 ^ w0s07 ^ w0s14)); + SHA1_STEP (SHA1_F1 , e, a, b, c, d, (c_61s ^ w0s16)); + SHA1_STEP (SHA1_F1 , d, e, a, b, c, (c_62s ^ w0s04___w0s06 ^ w0s08___w0s12)); + SHA1_STEP (SHA1_F1 , c, d, e, a, b, (c_63s ^ w0s08)); + SHA1_STEP (SHA1_F1 , b, c, d, e, a, (c_64s ^ w0s04___w0s06___w0s07 ^ w0s08___w0s12 ^ w0s17)); + SHA1_STEPX(SHA1_F1 , a, b, c, d, e, (c_65sK)); + SHA1_STEP (SHA1_F1 , e, a, b, c, d, (c_66s ^ w0s14 ^ w0s16)); + SHA1_STEP (SHA1_F1 , d, e, a, b, c, (c_67s ^ w0s08 ^ w0s18)); + SHA1_STEP (SHA1_F1 , c, d, e, a, b, (c_68s ^ w0s11 ^ w0s14 ^ w0s15)); + SHA1_STEPX(SHA1_F1 , b, c, d, e, a, (c_69sK)); + SHA1_STEP (SHA1_F1 , a, b, c, d, e, (c_70s ^ w0s12 ^ w0s19)); + SHA1_STEP (SHA1_F1 , e, a, b, c, d, (c_71s ^ w0s12 ^ w0s16)); + SHA1_STEP (SHA1_F1 , d, e, a, b, c, (c_72s ^ w0s05 ^ w0s11 ^ w0s12 ^ w0s13 ^ w0s16 ^ w0s18)); + SHA1_STEP (SHA1_F1 , c, d, e, a, b, (c_73s ^ w0s20)); + SHA1_STEP (SHA1_F1 , b, c, d, e, a, (c_74s ^ w0s08 ^ w0s16)); + + SHA1_STEP_PE (SHA1_F1, a, b, c, d, e, (c_75s ^ w0s06 ^ w0s12 ^ w0s14)); + + bool q_cond = allx (e_rev != e); + + if (q_cond) continue; + + SHA1_STEP_PB (SHA1_F1, a, b, c, d, e, 0); + + const u32 c_76s = rotl32 ((c_73s ^ c_68s ^ c_62s ^ c_60s), 1u); + const u32 c_77s = rotl32 ((c_74s ^ c_69s ^ c_63s ^ c_61s), 1u); + const u32 c_78s = rotl32 ((c_75s ^ c_70s ^ c_64s ^ c_62s), 1u); + const u32 c_79s = rotl32 ((c_76s ^ c_71s ^ c_65s ^ c_63s), 1u); + + const u32x w0s21 = rotl32 (w0, 21u); + const u32x w0s22 = rotl32 (w0, 22U); + + SHA1_STEP (SHA1_F1 , e, a, b, c, d, (c_76s ^ w0s07 ^ w0s08___w0s12 ^ w0s16 ^ w0s21)); + SHA1_STEP (SHA1_F1 , d, e, a, b, c, (c_77s)); + SHA1_STEP (SHA1_F1 , c, d, e, a, b, (c_78s ^ w0s07 ^ w0s08 ^ w0s15 ^ w0s18 ^ w0s20)); + SHA1_STEP (SHA1_F1 , b, c, d, e, a, (c_79s ^ w0s08 ^ w0s22)); + + + const u32x r0 = d; + const u32x r1 = e; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_S + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m00110_m04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global u32x * words_buf_r, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32 w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = 0; + w[ 5] = 0; + w[ 6] = 0; + w[ 7] = 0; + w[ 8] = 0; + w[ 9] = 0; + w[10] = 0; + w[11] = 0; + w[12] = 0; + w[13] = 0; + w[14] = 0; + w[15] = pws[gid].i[15]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m00110m (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m00110_m08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global u32x * words_buf_r, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32 w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = pws[gid].i[ 4]; + w[ 5] = pws[gid].i[ 5]; + w[ 6] = pws[gid].i[ 6]; + w[ 7] = pws[gid].i[ 7]; + w[ 8] = 0; + w[ 9] = 0; + w[10] = 0; + w[11] = 0; + w[12] = 0; + w[13] = 0; + w[14] = 0; + w[15] = pws[gid].i[15]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m00110m (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m00110_m16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global u32x * words_buf_r, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32 w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = pws[gid].i[ 4]; + w[ 5] = pws[gid].i[ 5]; + w[ 6] = pws[gid].i[ 6]; + w[ 7] = pws[gid].i[ 7]; + w[ 8] = pws[gid].i[ 8]; + w[ 9] = pws[gid].i[ 9]; + w[10] = pws[gid].i[10]; + w[11] = pws[gid].i[11]; + w[12] = pws[gid].i[12]; + w[13] = pws[gid].i[13]; + w[14] = pws[gid].i[14]; + w[15] = pws[gid].i[15]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m00110m (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m00110_s04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global u32x * words_buf_r, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32 w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = 0; + w[ 5] = 0; + w[ 6] = 0; + w[ 7] = 0; + w[ 8] = 0; + w[ 9] = 0; + w[10] = 0; + w[11] = 0; + w[12] = 0; + w[13] = 0; + w[14] = 0; + w[15] = pws[gid].i[15]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m00110s (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m00110_s08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global u32x * words_buf_r, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32 w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = pws[gid].i[ 4]; + w[ 5] = pws[gid].i[ 5]; + w[ 6] = pws[gid].i[ 6]; + w[ 7] = pws[gid].i[ 7]; + w[ 8] = 0; + w[ 9] = 0; + w[10] = 0; + w[11] = 0; + w[12] = 0; + w[13] = 0; + w[14] = 0; + w[15] = pws[gid].i[15]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m00110s (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m00110_s16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global u32x * words_buf_r, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32 w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = pws[gid].i[ 4]; + w[ 5] = pws[gid].i[ 5]; + w[ 6] = pws[gid].i[ 6]; + w[ 7] = pws[gid].i[ 7]; + w[ 8] = pws[gid].i[ 8]; + w[ 9] = pws[gid].i[ 9]; + w[10] = pws[gid].i[10]; + w[11] = pws[gid].i[11]; + w[12] = pws[gid].i[12]; + w[13] = pws[gid].i[13]; + w[14] = pws[gid].i[14]; + w[15] = pws[gid].i[15]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m00110s (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} diff --git a/amd/m00120_a0.cl b/amd/m00120_a0.cl new file mode 100644 index 0000000000..29e6c8cb15 --- /dev/null +++ b/amd/m00120_a0.cl @@ -0,0 +1,600 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _SHA1_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW4 +#define VECT_SIZE4 +#endif + +#ifdef VLIW5 +#define VECT_SIZE4 +#endif + +#define DGST_R0 3 +#define DGST_R1 4 +#define DGST_R2 2 +#define DGST_R3 1 + +#include "include/kernel_functions.c" +#include "types_amd.c" +#include "common_amd.c" +#include "include/rp_gpu.h" +#include "rp_amd.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m00120_m04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + u32x pw_buf1[4]; + + pw_buf1[0] = pws[gid].i[ 4]; + pw_buf1[1] = pws[gid].i[ 5]; + pw_buf1[2] = pws[gid].i[ 6]; + pw_buf1[3] = pws[gid].i[ 7]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[7]; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + u32x w1[4]; + u32x w2[4]; + u32x w3[4]; + + w0[0] = pw_buf0[0]; + w0[1] = pw_buf0[1]; + w0[2] = pw_buf0[2]; + w0[3] = pw_buf0[3]; + w1[0] = pw_buf1[0]; + w1[1] = pw_buf1[1]; + w1[2] = pw_buf1[2]; + w1[3] = pw_buf1[3]; + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 out_len = apply_rules (rules_buf[il_pos].cmds, w0, w1, pw_len); + + /** + * prepend salt + */ + + const u32 out_salt_len = out_len + salt_len; + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + w0_t[0] = w0[0]; + w0_t[1] = w0[1]; + w0_t[2] = w0[2]; + w0_t[3] = w0[3]; + w1_t[0] = w1[0]; + w1_t[1] = w1[1]; + w1_t[2] = w1[2]; + w1_t[3] = w1[3]; + w2_t[0] = w2[0]; + w2_t[1] = w2[1]; + w2_t[2] = w2[2]; + w2_t[3] = w2[3]; + w3_t[0] = w3[0]; + w3_t[1] = w3[1]; + w3_t[2] = w3[2]; + w3_t[3] = w3[3]; + + switch_buffer_by_offset (w0_t, w1_t, w2_t, w3_t, salt_len); + + w0_t[0] |= salt_buf0[0]; + w0_t[1] |= salt_buf0[1]; + w0_t[2] |= salt_buf0[2]; + w0_t[3] |= salt_buf0[3]; + w1_t[0] |= salt_buf1[0]; + w1_t[1] |= salt_buf1[1]; + w1_t[2] |= salt_buf1[2]; + w1_t[3] |= salt_buf1[3]; + + append_0x80_4 (w0_t, w1_t, w2_t, w3_t, out_salt_len); + + w3_t[3] = out_salt_len * 8; + + /** + * sha1 + */ + + w0_t[0] = swap_workaround (w0_t[0]); + w0_t[1] = swap_workaround (w0_t[1]); + w0_t[2] = swap_workaround (w0_t[2]); + w0_t[3] = swap_workaround (w0_t[3]); + w1_t[0] = swap_workaround (w1_t[0]); + w1_t[1] = swap_workaround (w1_t[1]); + w1_t[2] = swap_workaround (w1_t[2]); + w1_t[3] = swap_workaround (w1_t[3]); + w2_t[0] = swap_workaround (w2_t[0]); + w2_t[1] = swap_workaround (w2_t[1]); + w2_t[2] = swap_workaround (w2_t[2]); + w2_t[3] = swap_workaround (w2_t[3]); + w3_t[0] = swap_workaround (w3_t[0]); + w3_t[1] = swap_workaround (w3_t[1]); + //w3_t[2] = swap_workaround (w3_t[2]); + //w3_t[3] = swap_workaround (w3_t[3]); + + u32x a = SHA1M_A; + u32x b = SHA1M_B; + u32x c = SHA1M_C; + u32x d = SHA1M_D; + u32x e = SHA1M_E; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w0_t[0]); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w0_t[1]); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w0_t[2]); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w0_t[3]); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w1_t[0]); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w1_t[1]); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w1_t[2]); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w1_t[3]); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w2_t[0]); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w2_t[1]); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w2_t[2]); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w2_t[3]); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w3_t[0]); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w3_t[1]); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w3_t[2]); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w3_t[3]); + w0_t[0] = rotl32 ((w3_t[1] ^ w2_t[0] ^ w0_t[2] ^ w0_t[0]), 1u); SHA1_STEP (SHA1_F0o, e, a, b, c, d, w0_t[0]); + w0_t[1] = rotl32 ((w3_t[2] ^ w2_t[1] ^ w0_t[3] ^ w0_t[1]), 1u); SHA1_STEP (SHA1_F0o, d, e, a, b, c, w0_t[1]); + w0_t[2] = rotl32 ((w3_t[3] ^ w2_t[2] ^ w1_t[0] ^ w0_t[2]), 1u); SHA1_STEP (SHA1_F0o, c, d, e, a, b, w0_t[2]); + w0_t[3] = rotl32 ((w0_t[0] ^ w2_t[3] ^ w1_t[1] ^ w0_t[3]), 1u); SHA1_STEP (SHA1_F0o, b, c, d, e, a, w0_t[3]); + + #undef K + #define K SHA1C01 + + w1_t[0] = rotl32 ((w0_t[1] ^ w3_t[0] ^ w1_t[2] ^ w1_t[0]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w1_t[0]); + w1_t[1] = rotl32 ((w0_t[2] ^ w3_t[1] ^ w1_t[3] ^ w1_t[1]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w1_t[1]); + w1_t[2] = rotl32 ((w0_t[3] ^ w3_t[2] ^ w2_t[0] ^ w1_t[2]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w1_t[2]); + w1_t[3] = rotl32 ((w1_t[0] ^ w3_t[3] ^ w2_t[1] ^ w1_t[3]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1_t[3]); + w2_t[0] = rotl32 ((w1_t[1] ^ w0_t[0] ^ w2_t[2] ^ w2_t[0]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w2_t[0]); + w2_t[1] = rotl32 ((w1_t[2] ^ w0_t[1] ^ w2_t[3] ^ w2_t[1]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w2_t[1]); + w2_t[2] = rotl32 ((w1_t[3] ^ w0_t[2] ^ w3_t[0] ^ w2_t[2]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w2_t[2]); + w2_t[3] = rotl32 ((w2_t[0] ^ w0_t[3] ^ w3_t[1] ^ w2_t[3]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w2_t[3]); + w3_t[0] = rotl32 ((w2_t[1] ^ w1_t[0] ^ w3_t[2] ^ w3_t[0]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w3_t[0]); + w3_t[1] = rotl32 ((w2_t[2] ^ w1_t[1] ^ w3_t[3] ^ w3_t[1]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w3_t[1]); + w3_t[2] = rotl32 ((w2_t[3] ^ w1_t[2] ^ w0_t[0] ^ w3_t[2]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w3_t[2]); + w3_t[3] = rotl32 ((w3_t[0] ^ w1_t[3] ^ w0_t[1] ^ w3_t[3]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w3_t[3]); + w0_t[0] = rotl32 ((w3_t[1] ^ w2_t[0] ^ w0_t[2] ^ w0_t[0]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w0_t[0]); + w0_t[1] = rotl32 ((w3_t[2] ^ w2_t[1] ^ w0_t[3] ^ w0_t[1]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w0_t[1]); + w0_t[2] = rotl32 ((w3_t[3] ^ w2_t[2] ^ w1_t[0] ^ w0_t[2]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w0_t[2]); + w0_t[3] = rotl32 ((w0_t[0] ^ w2_t[3] ^ w1_t[1] ^ w0_t[3]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w0_t[3]); + w1_t[0] = rotl32 ((w0_t[1] ^ w3_t[0] ^ w1_t[2] ^ w1_t[0]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w1_t[0]); + w1_t[1] = rotl32 ((w0_t[2] ^ w3_t[1] ^ w1_t[3] ^ w1_t[1]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w1_t[1]); + w1_t[2] = rotl32 ((w0_t[3] ^ w3_t[2] ^ w2_t[0] ^ w1_t[2]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1_t[2]); + w1_t[3] = rotl32 ((w1_t[0] ^ w3_t[3] ^ w2_t[1] ^ w1_t[3]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w1_t[3]); + + #undef K + #define K SHA1C02 + + w2_t[0] = rotl32 ((w1_t[1] ^ w0_t[0] ^ w2_t[2] ^ w2_t[0]), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w2_t[0]); + w2_t[1] = rotl32 ((w1_t[2] ^ w0_t[1] ^ w2_t[3] ^ w2_t[1]), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w2_t[1]); + w2_t[2] = rotl32 ((w1_t[3] ^ w0_t[2] ^ w3_t[0] ^ w2_t[2]), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w2_t[2]); + w2_t[3] = rotl32 ((w2_t[0] ^ w0_t[3] ^ w3_t[1] ^ w2_t[3]), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w2_t[3]); + w3_t[0] = rotl32 ((w2_t[1] ^ w1_t[0] ^ w3_t[2] ^ w3_t[0]), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w3_t[0]); + w3_t[1] = rotl32 ((w2_t[2] ^ w1_t[1] ^ w3_t[3] ^ w3_t[1]), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w3_t[1]); + w3_t[2] = rotl32 ((w2_t[3] ^ w1_t[2] ^ w0_t[0] ^ w3_t[2]), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w3_t[2]); + w3_t[3] = rotl32 ((w3_t[0] ^ w1_t[3] ^ w0_t[1] ^ w3_t[3]), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w3_t[3]); + w0_t[0] = rotl32 ((w3_t[1] ^ w2_t[0] ^ w0_t[2] ^ w0_t[0]), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w0_t[0]); + w0_t[1] = rotl32 ((w3_t[2] ^ w2_t[1] ^ w0_t[3] ^ w0_t[1]), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w0_t[1]); + w0_t[2] = rotl32 ((w3_t[3] ^ w2_t[2] ^ w1_t[0] ^ w0_t[2]), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w0_t[2]); + w0_t[3] = rotl32 ((w0_t[0] ^ w2_t[3] ^ w1_t[1] ^ w0_t[3]), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w0_t[3]); + w1_t[0] = rotl32 ((w0_t[1] ^ w3_t[0] ^ w1_t[2] ^ w1_t[0]), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w1_t[0]); + w1_t[1] = rotl32 ((w0_t[2] ^ w3_t[1] ^ w1_t[3] ^ w1_t[1]), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w1_t[1]); + w1_t[2] = rotl32 ((w0_t[3] ^ w3_t[2] ^ w2_t[0] ^ w1_t[2]), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w1_t[2]); + w1_t[3] = rotl32 ((w1_t[0] ^ w3_t[3] ^ w2_t[1] ^ w1_t[3]), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w1_t[3]); + w2_t[0] = rotl32 ((w1_t[1] ^ w0_t[0] ^ w2_t[2] ^ w2_t[0]), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w2_t[0]); + w2_t[1] = rotl32 ((w1_t[2] ^ w0_t[1] ^ w2_t[3] ^ w2_t[1]), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w2_t[1]); + w2_t[2] = rotl32 ((w1_t[3] ^ w0_t[2] ^ w3_t[0] ^ w2_t[2]), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w2_t[2]); + w2_t[3] = rotl32 ((w2_t[0] ^ w0_t[3] ^ w3_t[1] ^ w2_t[3]), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w2_t[3]); + + #undef K + #define K SHA1C03 + + w3_t[0] = rotl32 ((w2_t[1] ^ w1_t[0] ^ w3_t[2] ^ w3_t[0]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w3_t[0]); + w3_t[1] = rotl32 ((w2_t[2] ^ w1_t[1] ^ w3_t[3] ^ w3_t[1]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w3_t[1]); + w3_t[2] = rotl32 ((w2_t[3] ^ w1_t[2] ^ w0_t[0] ^ w3_t[2]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w3_t[2]); + w3_t[3] = rotl32 ((w3_t[0] ^ w1_t[3] ^ w0_t[1] ^ w3_t[3]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w3_t[3]); + w0_t[0] = rotl32 ((w3_t[1] ^ w2_t[0] ^ w0_t[2] ^ w0_t[0]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w0_t[0]); + w0_t[1] = rotl32 ((w3_t[2] ^ w2_t[1] ^ w0_t[3] ^ w0_t[1]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w0_t[1]); + w0_t[2] = rotl32 ((w3_t[3] ^ w2_t[2] ^ w1_t[0] ^ w0_t[2]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w0_t[2]); + w0_t[3] = rotl32 ((w0_t[0] ^ w2_t[3] ^ w1_t[1] ^ w0_t[3]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w0_t[3]); + w1_t[0] = rotl32 ((w0_t[1] ^ w3_t[0] ^ w1_t[2] ^ w1_t[0]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1_t[0]); + w1_t[1] = rotl32 ((w0_t[2] ^ w3_t[1] ^ w1_t[3] ^ w1_t[1]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w1_t[1]); + w1_t[2] = rotl32 ((w0_t[3] ^ w3_t[2] ^ w2_t[0] ^ w1_t[2]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w1_t[2]); + w1_t[3] = rotl32 ((w1_t[0] ^ w3_t[3] ^ w2_t[1] ^ w1_t[3]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w1_t[3]); + w2_t[0] = rotl32 ((w1_t[1] ^ w0_t[0] ^ w2_t[2] ^ w2_t[0]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w2_t[0]); + w2_t[1] = rotl32 ((w1_t[2] ^ w0_t[1] ^ w2_t[3] ^ w2_t[1]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w2_t[1]); + w2_t[2] = rotl32 ((w1_t[3] ^ w0_t[2] ^ w3_t[0] ^ w2_t[2]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w2_t[2]); + w2_t[3] = rotl32 ((w2_t[0] ^ w0_t[3] ^ w3_t[1] ^ w2_t[3]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w2_t[3]); + w3_t[0] = rotl32 ((w2_t[1] ^ w1_t[0] ^ w3_t[2] ^ w3_t[0]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w3_t[0]); + w3_t[1] = rotl32 ((w2_t[2] ^ w1_t[1] ^ w3_t[3] ^ w3_t[1]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w3_t[1]); + w3_t[2] = rotl32 ((w2_t[3] ^ w1_t[2] ^ w0_t[0] ^ w3_t[2]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w3_t[2]); + w3_t[3] = rotl32 ((w3_t[0] ^ w1_t[3] ^ w0_t[1] ^ w3_t[3]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w3_t[3]); + + + const u32x r0 = d; + const u32x r1 = e; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_M + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m00120_m08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m00120_m16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m00120_s04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + u32x pw_buf1[4]; + + pw_buf1[0] = pws[gid].i[ 4]; + pw_buf1[1] = pws[gid].i[ 5]; + pw_buf1[2] = pws[gid].i[ 6]; + pw_buf1[3] = pws[gid].i[ 7]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[7]; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * reverse + */ + + const u32 e_rev = rotl32 (search[1], 2u); + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + u32x w1[4]; + u32x w2[4]; + u32x w3[4]; + + w0[0] = pw_buf0[0]; + w0[1] = pw_buf0[1]; + w0[2] = pw_buf0[2]; + w0[3] = pw_buf0[3]; + w1[0] = pw_buf1[0]; + w1[1] = pw_buf1[1]; + w1[2] = pw_buf1[2]; + w1[3] = pw_buf1[3]; + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 out_len = apply_rules (rules_buf[il_pos].cmds, w0, w1, pw_len); + + /** + * prepend salt + */ + + const u32 out_salt_len = out_len + salt_len; + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + w0_t[0] = w0[0]; + w0_t[1] = w0[1]; + w0_t[2] = w0[2]; + w0_t[3] = w0[3]; + w1_t[0] = w1[0]; + w1_t[1] = w1[1]; + w1_t[2] = w1[2]; + w1_t[3] = w1[3]; + w2_t[0] = w2[0]; + w2_t[1] = w2[1]; + w2_t[2] = w2[2]; + w2_t[3] = w2[3]; + w3_t[0] = w3[0]; + w3_t[1] = w3[1]; + w3_t[2] = w3[2]; + w3_t[3] = w3[3]; + + switch_buffer_by_offset (w0_t, w1_t, w2_t, w3_t, salt_len); + + w0_t[0] |= salt_buf0[0]; + w0_t[1] |= salt_buf0[1]; + w0_t[2] |= salt_buf0[2]; + w0_t[3] |= salt_buf0[3]; + w1_t[0] |= salt_buf1[0]; + w1_t[1] |= salt_buf1[1]; + w1_t[2] |= salt_buf1[2]; + w1_t[3] |= salt_buf1[3]; + + append_0x80_4 (w0_t, w1_t, w2_t, w3_t, out_salt_len); + + w3_t[3] = out_salt_len * 8; + + /** + * sha1 + */ + + w0_t[0] = swap_workaround (w0_t[0]); + w0_t[1] = swap_workaround (w0_t[1]); + w0_t[2] = swap_workaround (w0_t[2]); + w0_t[3] = swap_workaround (w0_t[3]); + w1_t[0] = swap_workaround (w1_t[0]); + w1_t[1] = swap_workaround (w1_t[1]); + w1_t[2] = swap_workaround (w1_t[2]); + w1_t[3] = swap_workaround (w1_t[3]); + w2_t[0] = swap_workaround (w2_t[0]); + w2_t[1] = swap_workaround (w2_t[1]); + w2_t[2] = swap_workaround (w2_t[2]); + w2_t[3] = swap_workaround (w2_t[3]); + w3_t[0] = swap_workaround (w3_t[0]); + w3_t[1] = swap_workaround (w3_t[1]); + //w3_t[2] = swap_workaround (w3_t[2]); + //w3_t[3] = swap_workaround (w3_t[3]); + + u32x a = SHA1M_A; + u32x b = SHA1M_B; + u32x c = SHA1M_C; + u32x d = SHA1M_D; + u32x e = SHA1M_E; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w0_t[0]); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w0_t[1]); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w0_t[2]); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w0_t[3]); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w1_t[0]); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w1_t[1]); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w1_t[2]); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w1_t[3]); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w2_t[0]); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w2_t[1]); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w2_t[2]); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w2_t[3]); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w3_t[0]); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w3_t[1]); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w3_t[2]); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w3_t[3]); + w0_t[0] = rotl32 ((w3_t[1] ^ w2_t[0] ^ w0_t[2] ^ w0_t[0]), 1u); SHA1_STEP (SHA1_F0o, e, a, b, c, d, w0_t[0]); + w0_t[1] = rotl32 ((w3_t[2] ^ w2_t[1] ^ w0_t[3] ^ w0_t[1]), 1u); SHA1_STEP (SHA1_F0o, d, e, a, b, c, w0_t[1]); + w0_t[2] = rotl32 ((w3_t[3] ^ w2_t[2] ^ w1_t[0] ^ w0_t[2]), 1u); SHA1_STEP (SHA1_F0o, c, d, e, a, b, w0_t[2]); + w0_t[3] = rotl32 ((w0_t[0] ^ w2_t[3] ^ w1_t[1] ^ w0_t[3]), 1u); SHA1_STEP (SHA1_F0o, b, c, d, e, a, w0_t[3]); + + #undef K + #define K SHA1C01 + + w1_t[0] = rotl32 ((w0_t[1] ^ w3_t[0] ^ w1_t[2] ^ w1_t[0]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w1_t[0]); + w1_t[1] = rotl32 ((w0_t[2] ^ w3_t[1] ^ w1_t[3] ^ w1_t[1]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w1_t[1]); + w1_t[2] = rotl32 ((w0_t[3] ^ w3_t[2] ^ w2_t[0] ^ w1_t[2]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w1_t[2]); + w1_t[3] = rotl32 ((w1_t[0] ^ w3_t[3] ^ w2_t[1] ^ w1_t[3]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1_t[3]); + w2_t[0] = rotl32 ((w1_t[1] ^ w0_t[0] ^ w2_t[2] ^ w2_t[0]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w2_t[0]); + w2_t[1] = rotl32 ((w1_t[2] ^ w0_t[1] ^ w2_t[3] ^ w2_t[1]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w2_t[1]); + w2_t[2] = rotl32 ((w1_t[3] ^ w0_t[2] ^ w3_t[0] ^ w2_t[2]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w2_t[2]); + w2_t[3] = rotl32 ((w2_t[0] ^ w0_t[3] ^ w3_t[1] ^ w2_t[3]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w2_t[3]); + w3_t[0] = rotl32 ((w2_t[1] ^ w1_t[0] ^ w3_t[2] ^ w3_t[0]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w3_t[0]); + w3_t[1] = rotl32 ((w2_t[2] ^ w1_t[1] ^ w3_t[3] ^ w3_t[1]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w3_t[1]); + w3_t[2] = rotl32 ((w2_t[3] ^ w1_t[2] ^ w0_t[0] ^ w3_t[2]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w3_t[2]); + w3_t[3] = rotl32 ((w3_t[0] ^ w1_t[3] ^ w0_t[1] ^ w3_t[3]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w3_t[3]); + w0_t[0] = rotl32 ((w3_t[1] ^ w2_t[0] ^ w0_t[2] ^ w0_t[0]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w0_t[0]); + w0_t[1] = rotl32 ((w3_t[2] ^ w2_t[1] ^ w0_t[3] ^ w0_t[1]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w0_t[1]); + w0_t[2] = rotl32 ((w3_t[3] ^ w2_t[2] ^ w1_t[0] ^ w0_t[2]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w0_t[2]); + w0_t[3] = rotl32 ((w0_t[0] ^ w2_t[3] ^ w1_t[1] ^ w0_t[3]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w0_t[3]); + w1_t[0] = rotl32 ((w0_t[1] ^ w3_t[0] ^ w1_t[2] ^ w1_t[0]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w1_t[0]); + w1_t[1] = rotl32 ((w0_t[2] ^ w3_t[1] ^ w1_t[3] ^ w1_t[1]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w1_t[1]); + w1_t[2] = rotl32 ((w0_t[3] ^ w3_t[2] ^ w2_t[0] ^ w1_t[2]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1_t[2]); + w1_t[3] = rotl32 ((w1_t[0] ^ w3_t[3] ^ w2_t[1] ^ w1_t[3]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w1_t[3]); + + #undef K + #define K SHA1C02 + + w2_t[0] = rotl32 ((w1_t[1] ^ w0_t[0] ^ w2_t[2] ^ w2_t[0]), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w2_t[0]); + w2_t[1] = rotl32 ((w1_t[2] ^ w0_t[1] ^ w2_t[3] ^ w2_t[1]), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w2_t[1]); + w2_t[2] = rotl32 ((w1_t[3] ^ w0_t[2] ^ w3_t[0] ^ w2_t[2]), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w2_t[2]); + w2_t[3] = rotl32 ((w2_t[0] ^ w0_t[3] ^ w3_t[1] ^ w2_t[3]), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w2_t[3]); + w3_t[0] = rotl32 ((w2_t[1] ^ w1_t[0] ^ w3_t[2] ^ w3_t[0]), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w3_t[0]); + w3_t[1] = rotl32 ((w2_t[2] ^ w1_t[1] ^ w3_t[3] ^ w3_t[1]), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w3_t[1]); + w3_t[2] = rotl32 ((w2_t[3] ^ w1_t[2] ^ w0_t[0] ^ w3_t[2]), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w3_t[2]); + w3_t[3] = rotl32 ((w3_t[0] ^ w1_t[3] ^ w0_t[1] ^ w3_t[3]), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w3_t[3]); + w0_t[0] = rotl32 ((w3_t[1] ^ w2_t[0] ^ w0_t[2] ^ w0_t[0]), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w0_t[0]); + w0_t[1] = rotl32 ((w3_t[2] ^ w2_t[1] ^ w0_t[3] ^ w0_t[1]), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w0_t[1]); + w0_t[2] = rotl32 ((w3_t[3] ^ w2_t[2] ^ w1_t[0] ^ w0_t[2]), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w0_t[2]); + w0_t[3] = rotl32 ((w0_t[0] ^ w2_t[3] ^ w1_t[1] ^ w0_t[3]), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w0_t[3]); + w1_t[0] = rotl32 ((w0_t[1] ^ w3_t[0] ^ w1_t[2] ^ w1_t[0]), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w1_t[0]); + w1_t[1] = rotl32 ((w0_t[2] ^ w3_t[1] ^ w1_t[3] ^ w1_t[1]), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w1_t[1]); + w1_t[2] = rotl32 ((w0_t[3] ^ w3_t[2] ^ w2_t[0] ^ w1_t[2]), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w1_t[2]); + w1_t[3] = rotl32 ((w1_t[0] ^ w3_t[3] ^ w2_t[1] ^ w1_t[3]), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w1_t[3]); + w2_t[0] = rotl32 ((w1_t[1] ^ w0_t[0] ^ w2_t[2] ^ w2_t[0]), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w2_t[0]); + w2_t[1] = rotl32 ((w1_t[2] ^ w0_t[1] ^ w2_t[3] ^ w2_t[1]), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w2_t[1]); + w2_t[2] = rotl32 ((w1_t[3] ^ w0_t[2] ^ w3_t[0] ^ w2_t[2]), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w2_t[2]); + w2_t[3] = rotl32 ((w2_t[0] ^ w0_t[3] ^ w3_t[1] ^ w2_t[3]), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w2_t[3]); + + #undef K + #define K SHA1C03 + + w3_t[0] = rotl32 ((w2_t[1] ^ w1_t[0] ^ w3_t[2] ^ w3_t[0]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w3_t[0]); + w3_t[1] = rotl32 ((w2_t[2] ^ w1_t[1] ^ w3_t[3] ^ w3_t[1]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w3_t[1]); + w3_t[2] = rotl32 ((w2_t[3] ^ w1_t[2] ^ w0_t[0] ^ w3_t[2]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w3_t[2]); + w3_t[3] = rotl32 ((w3_t[0] ^ w1_t[3] ^ w0_t[1] ^ w3_t[3]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w3_t[3]); + w0_t[0] = rotl32 ((w3_t[1] ^ w2_t[0] ^ w0_t[2] ^ w0_t[0]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w0_t[0]); + w0_t[1] = rotl32 ((w3_t[2] ^ w2_t[1] ^ w0_t[3] ^ w0_t[1]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w0_t[1]); + w0_t[2] = rotl32 ((w3_t[3] ^ w2_t[2] ^ w1_t[0] ^ w0_t[2]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w0_t[2]); + w0_t[3] = rotl32 ((w0_t[0] ^ w2_t[3] ^ w1_t[1] ^ w0_t[3]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w0_t[3]); + w1_t[0] = rotl32 ((w0_t[1] ^ w3_t[0] ^ w1_t[2] ^ w1_t[0]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1_t[0]); + w1_t[1] = rotl32 ((w0_t[2] ^ w3_t[1] ^ w1_t[3] ^ w1_t[1]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w1_t[1]); + w1_t[2] = rotl32 ((w0_t[3] ^ w3_t[2] ^ w2_t[0] ^ w1_t[2]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w1_t[2]); + w1_t[3] = rotl32 ((w1_t[0] ^ w3_t[3] ^ w2_t[1] ^ w1_t[3]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w1_t[3]); + w2_t[0] = rotl32 ((w1_t[1] ^ w0_t[0] ^ w2_t[2] ^ w2_t[0]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w2_t[0]); + w2_t[1] = rotl32 ((w1_t[2] ^ w0_t[1] ^ w2_t[3] ^ w2_t[1]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w2_t[1]); + w2_t[2] = rotl32 ((w1_t[3] ^ w0_t[2] ^ w3_t[0] ^ w2_t[2]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w2_t[2]); + w2_t[3] = rotl32 ((w2_t[0] ^ w0_t[3] ^ w3_t[1] ^ w2_t[3]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w2_t[3]); + w3_t[0] = rotl32 ((w2_t[1] ^ w1_t[0] ^ w3_t[2] ^ w3_t[0]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w3_t[0]); + + if (allx (e != e_rev)) continue; + + w3_t[1] = rotl32 ((w2_t[2] ^ w1_t[1] ^ w3_t[3] ^ w3_t[1]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w3_t[1]); + w3_t[2] = rotl32 ((w2_t[3] ^ w1_t[2] ^ w0_t[0] ^ w3_t[2]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w3_t[2]); + w3_t[3] = rotl32 ((w3_t[0] ^ w1_t[3] ^ w0_t[1] ^ w3_t[3]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w3_t[3]); + + + const u32x r0 = d; + const u32x r1 = e; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_S + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m00120_s08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m00120_s16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/amd/m00120_a1.cl b/amd/m00120_a1.cl new file mode 100644 index 0000000000..7080a53579 --- /dev/null +++ b/amd/m00120_a1.cl @@ -0,0 +1,694 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _SHA1_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW4 +#define VECT_SIZE4 +#endif + +#ifdef VLIW5 +#define VECT_SIZE4 +#endif + +#define DGST_R0 3 +#define DGST_R1 4 +#define DGST_R2 2 +#define DGST_R3 1 + +#include "include/kernel_functions.c" +#include "types_amd.c" +#include "common_amd.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m00120_m04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, combs_buf[0].pw_len); + } + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[7]; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = combs_buf[il_pos].pw_len; + + const u32 pw_len = pw_l_len + pw_r_len; + + u32 wordr0[4]; + u32 wordr1[4]; + u32 wordr2[4]; + u32 wordr3[4]; + + wordr0[0] = combs_buf[il_pos].i[0]; + wordr0[1] = combs_buf[il_pos].i[1]; + wordr0[2] = combs_buf[il_pos].i[2]; + wordr0[3] = combs_buf[il_pos].i[3]; + wordr1[0] = combs_buf[il_pos].i[4]; + wordr1[1] = combs_buf[il_pos].i[5]; + wordr1[2] = combs_buf[il_pos].i[6]; + wordr1[3] = combs_buf[il_pos].i[7]; + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + u32x w0[4]; + u32x w1[4]; + u32x w2[4]; + u32x w3[4]; + + w0[0] = wordl0[0] | wordr0[0]; + w0[1] = wordl0[1] | wordr0[1]; + w0[2] = wordl0[2] | wordr0[2]; + w0[3] = wordl0[3] | wordr0[3]; + w1[0] = wordl1[0] | wordr1[0]; + w1[1] = wordl1[1] | wordr1[1]; + w1[2] = wordl1[2] | wordr1[2]; + w1[3] = wordl1[3] | wordr1[3]; + w2[0] = wordl2[0] | wordr2[0]; + w2[1] = wordl2[1] | wordr2[1]; + w2[2] = wordl2[2] | wordr2[2]; + w2[3] = wordl2[3] | wordr2[3]; + w3[0] = wordl3[0] | wordr3[0]; + w3[1] = wordl3[1] | wordr3[1]; + w3[2] = wordl3[2] | wordr3[2]; + w3[3] = wordl3[3] | wordr3[3]; + + /** + * prepend salt + */ + + const u32 pw_salt_len = pw_len + salt_len; + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + w0_t[0] = w0[0]; + w0_t[1] = w0[1]; + w0_t[2] = w0[2]; + w0_t[3] = w0[3]; + w1_t[0] = w1[0]; + w1_t[1] = w1[1]; + w1_t[2] = w1[2]; + w1_t[3] = w1[3]; + w2_t[0] = w2[0]; + w2_t[1] = w2[1]; + w2_t[2] = w2[2]; + w2_t[3] = w2[3]; + w3_t[0] = w3[0]; + w3_t[1] = w3[1]; + w3_t[2] = w3[2]; + w3_t[3] = w3[3]; + + switch_buffer_by_offset (w0_t, w1_t, w2_t, w3_t, salt_len); + + w0_t[0] |= salt_buf0[0]; + w0_t[1] |= salt_buf0[1]; + w0_t[2] |= salt_buf0[2]; + w0_t[3] |= salt_buf0[3]; + w1_t[0] |= salt_buf1[0]; + w1_t[1] |= salt_buf1[1]; + w1_t[2] |= salt_buf1[2]; + w1_t[3] |= salt_buf1[3]; + + append_0x80_4 (w0_t, w1_t, w2_t, w3_t, pw_salt_len); + + w3_t[3] = pw_salt_len * 8; + + /** + * sha1 + */ + + w0_t[0] = swap_workaround (w0_t[0]); + w0_t[1] = swap_workaround (w0_t[1]); + w0_t[2] = swap_workaround (w0_t[2]); + w0_t[3] = swap_workaround (w0_t[3]); + w1_t[0] = swap_workaround (w1_t[0]); + w1_t[1] = swap_workaround (w1_t[1]); + w1_t[2] = swap_workaround (w1_t[2]); + w1_t[3] = swap_workaround (w1_t[3]); + w2_t[0] = swap_workaround (w2_t[0]); + w2_t[1] = swap_workaround (w2_t[1]); + w2_t[2] = swap_workaround (w2_t[2]); + w2_t[3] = swap_workaround (w2_t[3]); + w3_t[0] = swap_workaround (w3_t[0]); + w3_t[1] = swap_workaround (w3_t[1]); + //w3_t[2] = swap_workaround (w3_t[2]); + //w3_t[3] = swap_workaround (w3_t[3]); + + u32x a = SHA1M_A; + u32x b = SHA1M_B; + u32x c = SHA1M_C; + u32x d = SHA1M_D; + u32x e = SHA1M_E; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w0_t[0]); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w0_t[1]); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w0_t[2]); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w0_t[3]); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w1_t[0]); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w1_t[1]); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w1_t[2]); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w1_t[3]); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w2_t[0]); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w2_t[1]); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w2_t[2]); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w2_t[3]); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w3_t[0]); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w3_t[1]); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w3_t[2]); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w3_t[3]); + w0_t[0] = rotl32 ((w3_t[1] ^ w2_t[0] ^ w0_t[2] ^ w0_t[0]), 1u); SHA1_STEP (SHA1_F0o, e, a, b, c, d, w0_t[0]); + w0_t[1] = rotl32 ((w3_t[2] ^ w2_t[1] ^ w0_t[3] ^ w0_t[1]), 1u); SHA1_STEP (SHA1_F0o, d, e, a, b, c, w0_t[1]); + w0_t[2] = rotl32 ((w3_t[3] ^ w2_t[2] ^ w1_t[0] ^ w0_t[2]), 1u); SHA1_STEP (SHA1_F0o, c, d, e, a, b, w0_t[2]); + w0_t[3] = rotl32 ((w0_t[0] ^ w2_t[3] ^ w1_t[1] ^ w0_t[3]), 1u); SHA1_STEP (SHA1_F0o, b, c, d, e, a, w0_t[3]); + + #undef K + #define K SHA1C01 + + w1_t[0] = rotl32 ((w0_t[1] ^ w3_t[0] ^ w1_t[2] ^ w1_t[0]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w1_t[0]); + w1_t[1] = rotl32 ((w0_t[2] ^ w3_t[1] ^ w1_t[3] ^ w1_t[1]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w1_t[1]); + w1_t[2] = rotl32 ((w0_t[3] ^ w3_t[2] ^ w2_t[0] ^ w1_t[2]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w1_t[2]); + w1_t[3] = rotl32 ((w1_t[0] ^ w3_t[3] ^ w2_t[1] ^ w1_t[3]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1_t[3]); + w2_t[0] = rotl32 ((w1_t[1] ^ w0_t[0] ^ w2_t[2] ^ w2_t[0]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w2_t[0]); + w2_t[1] = rotl32 ((w1_t[2] ^ w0_t[1] ^ w2_t[3] ^ w2_t[1]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w2_t[1]); + w2_t[2] = rotl32 ((w1_t[3] ^ w0_t[2] ^ w3_t[0] ^ w2_t[2]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w2_t[2]); + w2_t[3] = rotl32 ((w2_t[0] ^ w0_t[3] ^ w3_t[1] ^ w2_t[3]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w2_t[3]); + w3_t[0] = rotl32 ((w2_t[1] ^ w1_t[0] ^ w3_t[2] ^ w3_t[0]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w3_t[0]); + w3_t[1] = rotl32 ((w2_t[2] ^ w1_t[1] ^ w3_t[3] ^ w3_t[1]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w3_t[1]); + w3_t[2] = rotl32 ((w2_t[3] ^ w1_t[2] ^ w0_t[0] ^ w3_t[2]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w3_t[2]); + w3_t[3] = rotl32 ((w3_t[0] ^ w1_t[3] ^ w0_t[1] ^ w3_t[3]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w3_t[3]); + w0_t[0] = rotl32 ((w3_t[1] ^ w2_t[0] ^ w0_t[2] ^ w0_t[0]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w0_t[0]); + w0_t[1] = rotl32 ((w3_t[2] ^ w2_t[1] ^ w0_t[3] ^ w0_t[1]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w0_t[1]); + w0_t[2] = rotl32 ((w3_t[3] ^ w2_t[2] ^ w1_t[0] ^ w0_t[2]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w0_t[2]); + w0_t[3] = rotl32 ((w0_t[0] ^ w2_t[3] ^ w1_t[1] ^ w0_t[3]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w0_t[3]); + w1_t[0] = rotl32 ((w0_t[1] ^ w3_t[0] ^ w1_t[2] ^ w1_t[0]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w1_t[0]); + w1_t[1] = rotl32 ((w0_t[2] ^ w3_t[1] ^ w1_t[3] ^ w1_t[1]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w1_t[1]); + w1_t[2] = rotl32 ((w0_t[3] ^ w3_t[2] ^ w2_t[0] ^ w1_t[2]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1_t[2]); + w1_t[3] = rotl32 ((w1_t[0] ^ w3_t[3] ^ w2_t[1] ^ w1_t[3]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w1_t[3]); + + #undef K + #define K SHA1C02 + + w2_t[0] = rotl32 ((w1_t[1] ^ w0_t[0] ^ w2_t[2] ^ w2_t[0]), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w2_t[0]); + w2_t[1] = rotl32 ((w1_t[2] ^ w0_t[1] ^ w2_t[3] ^ w2_t[1]), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w2_t[1]); + w2_t[2] = rotl32 ((w1_t[3] ^ w0_t[2] ^ w3_t[0] ^ w2_t[2]), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w2_t[2]); + w2_t[3] = rotl32 ((w2_t[0] ^ w0_t[3] ^ w3_t[1] ^ w2_t[3]), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w2_t[3]); + w3_t[0] = rotl32 ((w2_t[1] ^ w1_t[0] ^ w3_t[2] ^ w3_t[0]), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w3_t[0]); + w3_t[1] = rotl32 ((w2_t[2] ^ w1_t[1] ^ w3_t[3] ^ w3_t[1]), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w3_t[1]); + w3_t[2] = rotl32 ((w2_t[3] ^ w1_t[2] ^ w0_t[0] ^ w3_t[2]), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w3_t[2]); + w3_t[3] = rotl32 ((w3_t[0] ^ w1_t[3] ^ w0_t[1] ^ w3_t[3]), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w3_t[3]); + w0_t[0] = rotl32 ((w3_t[1] ^ w2_t[0] ^ w0_t[2] ^ w0_t[0]), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w0_t[0]); + w0_t[1] = rotl32 ((w3_t[2] ^ w2_t[1] ^ w0_t[3] ^ w0_t[1]), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w0_t[1]); + w0_t[2] = rotl32 ((w3_t[3] ^ w2_t[2] ^ w1_t[0] ^ w0_t[2]), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w0_t[2]); + w0_t[3] = rotl32 ((w0_t[0] ^ w2_t[3] ^ w1_t[1] ^ w0_t[3]), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w0_t[3]); + w1_t[0] = rotl32 ((w0_t[1] ^ w3_t[0] ^ w1_t[2] ^ w1_t[0]), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w1_t[0]); + w1_t[1] = rotl32 ((w0_t[2] ^ w3_t[1] ^ w1_t[3] ^ w1_t[1]), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w1_t[1]); + w1_t[2] = rotl32 ((w0_t[3] ^ w3_t[2] ^ w2_t[0] ^ w1_t[2]), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w1_t[2]); + w1_t[3] = rotl32 ((w1_t[0] ^ w3_t[3] ^ w2_t[1] ^ w1_t[3]), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w1_t[3]); + w2_t[0] = rotl32 ((w1_t[1] ^ w0_t[0] ^ w2_t[2] ^ w2_t[0]), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w2_t[0]); + w2_t[1] = rotl32 ((w1_t[2] ^ w0_t[1] ^ w2_t[3] ^ w2_t[1]), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w2_t[1]); + w2_t[2] = rotl32 ((w1_t[3] ^ w0_t[2] ^ w3_t[0] ^ w2_t[2]), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w2_t[2]); + w2_t[3] = rotl32 ((w2_t[0] ^ w0_t[3] ^ w3_t[1] ^ w2_t[3]), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w2_t[3]); + + #undef K + #define K SHA1C03 + + w3_t[0] = rotl32 ((w2_t[1] ^ w1_t[0] ^ w3_t[2] ^ w3_t[0]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w3_t[0]); + w3_t[1] = rotl32 ((w2_t[2] ^ w1_t[1] ^ w3_t[3] ^ w3_t[1]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w3_t[1]); + w3_t[2] = rotl32 ((w2_t[3] ^ w1_t[2] ^ w0_t[0] ^ w3_t[2]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w3_t[2]); + w3_t[3] = rotl32 ((w3_t[0] ^ w1_t[3] ^ w0_t[1] ^ w3_t[3]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w3_t[3]); + w0_t[0] = rotl32 ((w3_t[1] ^ w2_t[0] ^ w0_t[2] ^ w0_t[0]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w0_t[0]); + w0_t[1] = rotl32 ((w3_t[2] ^ w2_t[1] ^ w0_t[3] ^ w0_t[1]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w0_t[1]); + w0_t[2] = rotl32 ((w3_t[3] ^ w2_t[2] ^ w1_t[0] ^ w0_t[2]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w0_t[2]); + w0_t[3] = rotl32 ((w0_t[0] ^ w2_t[3] ^ w1_t[1] ^ w0_t[3]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w0_t[3]); + w1_t[0] = rotl32 ((w0_t[1] ^ w3_t[0] ^ w1_t[2] ^ w1_t[0]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1_t[0]); + w1_t[1] = rotl32 ((w0_t[2] ^ w3_t[1] ^ w1_t[3] ^ w1_t[1]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w1_t[1]); + w1_t[2] = rotl32 ((w0_t[3] ^ w3_t[2] ^ w2_t[0] ^ w1_t[2]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w1_t[2]); + w1_t[3] = rotl32 ((w1_t[0] ^ w3_t[3] ^ w2_t[1] ^ w1_t[3]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w1_t[3]); + w2_t[0] = rotl32 ((w1_t[1] ^ w0_t[0] ^ w2_t[2] ^ w2_t[0]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w2_t[0]); + w2_t[1] = rotl32 ((w1_t[2] ^ w0_t[1] ^ w2_t[3] ^ w2_t[1]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w2_t[1]); + w2_t[2] = rotl32 ((w1_t[3] ^ w0_t[2] ^ w3_t[0] ^ w2_t[2]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w2_t[2]); + w2_t[3] = rotl32 ((w2_t[0] ^ w0_t[3] ^ w3_t[1] ^ w2_t[3]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w2_t[3]); + w3_t[0] = rotl32 ((w2_t[1] ^ w1_t[0] ^ w3_t[2] ^ w3_t[0]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w3_t[0]); + w3_t[1] = rotl32 ((w2_t[2] ^ w1_t[1] ^ w3_t[3] ^ w3_t[1]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w3_t[1]); + w3_t[2] = rotl32 ((w2_t[3] ^ w1_t[2] ^ w0_t[0] ^ w3_t[2]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w3_t[2]); + w3_t[3] = rotl32 ((w3_t[0] ^ w1_t[3] ^ w0_t[1] ^ w3_t[3]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w3_t[3]); + + + const u32x r0 = d; + const u32x r1 = e; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_M + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m00120_m08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m00120_m16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m00120_s04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, combs_buf[0].pw_len); + } + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[7]; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * reverse + */ + + const u32 e_rev = rotl32 (search[1], 2u); + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = combs_buf[il_pos].pw_len; + + const u32 pw_len = pw_l_len + pw_r_len; + + u32 wordr0[4]; + u32 wordr1[4]; + u32 wordr2[4]; + u32 wordr3[4]; + + wordr0[0] = combs_buf[il_pos].i[0]; + wordr0[1] = combs_buf[il_pos].i[1]; + wordr0[2] = combs_buf[il_pos].i[2]; + wordr0[3] = combs_buf[il_pos].i[3]; + wordr1[0] = combs_buf[il_pos].i[4]; + wordr1[1] = combs_buf[il_pos].i[5]; + wordr1[2] = combs_buf[il_pos].i[6]; + wordr1[3] = combs_buf[il_pos].i[7]; + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + u32x w0[4]; + u32x w1[4]; + u32x w2[4]; + u32x w3[4]; + + w0[0] = wordl0[0] | wordr0[0]; + w0[1] = wordl0[1] | wordr0[1]; + w0[2] = wordl0[2] | wordr0[2]; + w0[3] = wordl0[3] | wordr0[3]; + w1[0] = wordl1[0] | wordr1[0]; + w1[1] = wordl1[1] | wordr1[1]; + w1[2] = wordl1[2] | wordr1[2]; + w1[3] = wordl1[3] | wordr1[3]; + w2[0] = wordl2[0] | wordr2[0]; + w2[1] = wordl2[1] | wordr2[1]; + w2[2] = wordl2[2] | wordr2[2]; + w2[3] = wordl2[3] | wordr2[3]; + w3[0] = wordl3[0] | wordr3[0]; + w3[1] = wordl3[1] | wordr3[1]; + w3[2] = wordl3[2] | wordr3[2]; + w3[3] = wordl3[3] | wordr3[3]; + + /** + * prepend salt + */ + + const u32 pw_salt_len = pw_len + salt_len; + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + w0_t[0] = w0[0]; + w0_t[1] = w0[1]; + w0_t[2] = w0[2]; + w0_t[3] = w0[3]; + w1_t[0] = w1[0]; + w1_t[1] = w1[1]; + w1_t[2] = w1[2]; + w1_t[3] = w1[3]; + w2_t[0] = w2[0]; + w2_t[1] = w2[1]; + w2_t[2] = w2[2]; + w2_t[3] = w2[3]; + w3_t[0] = w3[0]; + w3_t[1] = w3[1]; + w3_t[2] = w3[2]; + w3_t[3] = w3[3]; + + switch_buffer_by_offset (w0_t, w1_t, w2_t, w3_t, salt_len); + + w0_t[0] |= salt_buf0[0]; + w0_t[1] |= salt_buf0[1]; + w0_t[2] |= salt_buf0[2]; + w0_t[3] |= salt_buf0[3]; + w1_t[0] |= salt_buf1[0]; + w1_t[1] |= salt_buf1[1]; + w1_t[2] |= salt_buf1[2]; + w1_t[3] |= salt_buf1[3]; + + append_0x80_4 (w0_t, w1_t, w2_t, w3_t, pw_salt_len); + + w3_t[3] = pw_salt_len * 8; + + /** + * sha1 + */ + + w0_t[0] = swap_workaround (w0_t[0]); + w0_t[1] = swap_workaround (w0_t[1]); + w0_t[2] = swap_workaround (w0_t[2]); + w0_t[3] = swap_workaround (w0_t[3]); + w1_t[0] = swap_workaround (w1_t[0]); + w1_t[1] = swap_workaround (w1_t[1]); + w1_t[2] = swap_workaround (w1_t[2]); + w1_t[3] = swap_workaround (w1_t[3]); + w2_t[0] = swap_workaround (w2_t[0]); + w2_t[1] = swap_workaround (w2_t[1]); + w2_t[2] = swap_workaround (w2_t[2]); + w2_t[3] = swap_workaround (w2_t[3]); + w3_t[0] = swap_workaround (w3_t[0]); + w3_t[1] = swap_workaround (w3_t[1]); + //w3_t[2] = swap_workaround (w3_t[2]); + //w3_t[3] = swap_workaround (w3_t[3]); + + u32x a = SHA1M_A; + u32x b = SHA1M_B; + u32x c = SHA1M_C; + u32x d = SHA1M_D; + u32x e = SHA1M_E; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w0_t[0]); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w0_t[1]); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w0_t[2]); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w0_t[3]); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w1_t[0]); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w1_t[1]); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w1_t[2]); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w1_t[3]); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w2_t[0]); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w2_t[1]); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w2_t[2]); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w2_t[3]); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w3_t[0]); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w3_t[1]); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w3_t[2]); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w3_t[3]); + w0_t[0] = rotl32 ((w3_t[1] ^ w2_t[0] ^ w0_t[2] ^ w0_t[0]), 1u); SHA1_STEP (SHA1_F0o, e, a, b, c, d, w0_t[0]); + w0_t[1] = rotl32 ((w3_t[2] ^ w2_t[1] ^ w0_t[3] ^ w0_t[1]), 1u); SHA1_STEP (SHA1_F0o, d, e, a, b, c, w0_t[1]); + w0_t[2] = rotl32 ((w3_t[3] ^ w2_t[2] ^ w1_t[0] ^ w0_t[2]), 1u); SHA1_STEP (SHA1_F0o, c, d, e, a, b, w0_t[2]); + w0_t[3] = rotl32 ((w0_t[0] ^ w2_t[3] ^ w1_t[1] ^ w0_t[3]), 1u); SHA1_STEP (SHA1_F0o, b, c, d, e, a, w0_t[3]); + + #undef K + #define K SHA1C01 + + w1_t[0] = rotl32 ((w0_t[1] ^ w3_t[0] ^ w1_t[2] ^ w1_t[0]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w1_t[0]); + w1_t[1] = rotl32 ((w0_t[2] ^ w3_t[1] ^ w1_t[3] ^ w1_t[1]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w1_t[1]); + w1_t[2] = rotl32 ((w0_t[3] ^ w3_t[2] ^ w2_t[0] ^ w1_t[2]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w1_t[2]); + w1_t[3] = rotl32 ((w1_t[0] ^ w3_t[3] ^ w2_t[1] ^ w1_t[3]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1_t[3]); + w2_t[0] = rotl32 ((w1_t[1] ^ w0_t[0] ^ w2_t[2] ^ w2_t[0]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w2_t[0]); + w2_t[1] = rotl32 ((w1_t[2] ^ w0_t[1] ^ w2_t[3] ^ w2_t[1]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w2_t[1]); + w2_t[2] = rotl32 ((w1_t[3] ^ w0_t[2] ^ w3_t[0] ^ w2_t[2]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w2_t[2]); + w2_t[3] = rotl32 ((w2_t[0] ^ w0_t[3] ^ w3_t[1] ^ w2_t[3]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w2_t[3]); + w3_t[0] = rotl32 ((w2_t[1] ^ w1_t[0] ^ w3_t[2] ^ w3_t[0]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w3_t[0]); + w3_t[1] = rotl32 ((w2_t[2] ^ w1_t[1] ^ w3_t[3] ^ w3_t[1]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w3_t[1]); + w3_t[2] = rotl32 ((w2_t[3] ^ w1_t[2] ^ w0_t[0] ^ w3_t[2]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w3_t[2]); + w3_t[3] = rotl32 ((w3_t[0] ^ w1_t[3] ^ w0_t[1] ^ w3_t[3]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w3_t[3]); + w0_t[0] = rotl32 ((w3_t[1] ^ w2_t[0] ^ w0_t[2] ^ w0_t[0]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w0_t[0]); + w0_t[1] = rotl32 ((w3_t[2] ^ w2_t[1] ^ w0_t[3] ^ w0_t[1]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w0_t[1]); + w0_t[2] = rotl32 ((w3_t[3] ^ w2_t[2] ^ w1_t[0] ^ w0_t[2]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w0_t[2]); + w0_t[3] = rotl32 ((w0_t[0] ^ w2_t[3] ^ w1_t[1] ^ w0_t[3]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w0_t[3]); + w1_t[0] = rotl32 ((w0_t[1] ^ w3_t[0] ^ w1_t[2] ^ w1_t[0]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w1_t[0]); + w1_t[1] = rotl32 ((w0_t[2] ^ w3_t[1] ^ w1_t[3] ^ w1_t[1]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w1_t[1]); + w1_t[2] = rotl32 ((w0_t[3] ^ w3_t[2] ^ w2_t[0] ^ w1_t[2]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1_t[2]); + w1_t[3] = rotl32 ((w1_t[0] ^ w3_t[3] ^ w2_t[1] ^ w1_t[3]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w1_t[3]); + + #undef K + #define K SHA1C02 + + w2_t[0] = rotl32 ((w1_t[1] ^ w0_t[0] ^ w2_t[2] ^ w2_t[0]), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w2_t[0]); + w2_t[1] = rotl32 ((w1_t[2] ^ w0_t[1] ^ w2_t[3] ^ w2_t[1]), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w2_t[1]); + w2_t[2] = rotl32 ((w1_t[3] ^ w0_t[2] ^ w3_t[0] ^ w2_t[2]), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w2_t[2]); + w2_t[3] = rotl32 ((w2_t[0] ^ w0_t[3] ^ w3_t[1] ^ w2_t[3]), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w2_t[3]); + w3_t[0] = rotl32 ((w2_t[1] ^ w1_t[0] ^ w3_t[2] ^ w3_t[0]), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w3_t[0]); + w3_t[1] = rotl32 ((w2_t[2] ^ w1_t[1] ^ w3_t[3] ^ w3_t[1]), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w3_t[1]); + w3_t[2] = rotl32 ((w2_t[3] ^ w1_t[2] ^ w0_t[0] ^ w3_t[2]), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w3_t[2]); + w3_t[3] = rotl32 ((w3_t[0] ^ w1_t[3] ^ w0_t[1] ^ w3_t[3]), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w3_t[3]); + w0_t[0] = rotl32 ((w3_t[1] ^ w2_t[0] ^ w0_t[2] ^ w0_t[0]), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w0_t[0]); + w0_t[1] = rotl32 ((w3_t[2] ^ w2_t[1] ^ w0_t[3] ^ w0_t[1]), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w0_t[1]); + w0_t[2] = rotl32 ((w3_t[3] ^ w2_t[2] ^ w1_t[0] ^ w0_t[2]), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w0_t[2]); + w0_t[3] = rotl32 ((w0_t[0] ^ w2_t[3] ^ w1_t[1] ^ w0_t[3]), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w0_t[3]); + w1_t[0] = rotl32 ((w0_t[1] ^ w3_t[0] ^ w1_t[2] ^ w1_t[0]), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w1_t[0]); + w1_t[1] = rotl32 ((w0_t[2] ^ w3_t[1] ^ w1_t[3] ^ w1_t[1]), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w1_t[1]); + w1_t[2] = rotl32 ((w0_t[3] ^ w3_t[2] ^ w2_t[0] ^ w1_t[2]), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w1_t[2]); + w1_t[3] = rotl32 ((w1_t[0] ^ w3_t[3] ^ w2_t[1] ^ w1_t[3]), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w1_t[3]); + w2_t[0] = rotl32 ((w1_t[1] ^ w0_t[0] ^ w2_t[2] ^ w2_t[0]), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w2_t[0]); + w2_t[1] = rotl32 ((w1_t[2] ^ w0_t[1] ^ w2_t[3] ^ w2_t[1]), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w2_t[1]); + w2_t[2] = rotl32 ((w1_t[3] ^ w0_t[2] ^ w3_t[0] ^ w2_t[2]), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w2_t[2]); + w2_t[3] = rotl32 ((w2_t[0] ^ w0_t[3] ^ w3_t[1] ^ w2_t[3]), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w2_t[3]); + + #undef K + #define K SHA1C03 + + w3_t[0] = rotl32 ((w2_t[1] ^ w1_t[0] ^ w3_t[2] ^ w3_t[0]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w3_t[0]); + w3_t[1] = rotl32 ((w2_t[2] ^ w1_t[1] ^ w3_t[3] ^ w3_t[1]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w3_t[1]); + w3_t[2] = rotl32 ((w2_t[3] ^ w1_t[2] ^ w0_t[0] ^ w3_t[2]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w3_t[2]); + w3_t[3] = rotl32 ((w3_t[0] ^ w1_t[3] ^ w0_t[1] ^ w3_t[3]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w3_t[3]); + w0_t[0] = rotl32 ((w3_t[1] ^ w2_t[0] ^ w0_t[2] ^ w0_t[0]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w0_t[0]); + w0_t[1] = rotl32 ((w3_t[2] ^ w2_t[1] ^ w0_t[3] ^ w0_t[1]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w0_t[1]); + w0_t[2] = rotl32 ((w3_t[3] ^ w2_t[2] ^ w1_t[0] ^ w0_t[2]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w0_t[2]); + w0_t[3] = rotl32 ((w0_t[0] ^ w2_t[3] ^ w1_t[1] ^ w0_t[3]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w0_t[3]); + w1_t[0] = rotl32 ((w0_t[1] ^ w3_t[0] ^ w1_t[2] ^ w1_t[0]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1_t[0]); + w1_t[1] = rotl32 ((w0_t[2] ^ w3_t[1] ^ w1_t[3] ^ w1_t[1]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w1_t[1]); + w1_t[2] = rotl32 ((w0_t[3] ^ w3_t[2] ^ w2_t[0] ^ w1_t[2]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w1_t[2]); + w1_t[3] = rotl32 ((w1_t[0] ^ w3_t[3] ^ w2_t[1] ^ w1_t[3]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w1_t[3]); + w2_t[0] = rotl32 ((w1_t[1] ^ w0_t[0] ^ w2_t[2] ^ w2_t[0]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w2_t[0]); + w2_t[1] = rotl32 ((w1_t[2] ^ w0_t[1] ^ w2_t[3] ^ w2_t[1]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w2_t[1]); + w2_t[2] = rotl32 ((w1_t[3] ^ w0_t[2] ^ w3_t[0] ^ w2_t[2]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w2_t[2]); + w2_t[3] = rotl32 ((w2_t[0] ^ w0_t[3] ^ w3_t[1] ^ w2_t[3]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w2_t[3]); + w3_t[0] = rotl32 ((w2_t[1] ^ w1_t[0] ^ w3_t[2] ^ w3_t[0]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w3_t[0]); + + if (allx (e != e_rev)) continue; + + w3_t[1] = rotl32 ((w2_t[2] ^ w1_t[1] ^ w3_t[3] ^ w3_t[1]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w3_t[1]); + w3_t[2] = rotl32 ((w2_t[3] ^ w1_t[2] ^ w0_t[0] ^ w3_t[2]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w3_t[2]); + w3_t[3] = rotl32 ((w3_t[0] ^ w1_t[3] ^ w0_t[1] ^ w3_t[3]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w3_t[3]); + + + const u32x r0 = d; + const u32x r1 = e; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_S + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m00120_s08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m00120_s16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/amd/m00120_a3.cl b/amd/m00120_a3.cl new file mode 100644 index 0000000000..444f062e8a --- /dev/null +++ b/amd/m00120_a3.cl @@ -0,0 +1,998 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _SHA1_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW4 +#define VECT_SIZE4 +#endif + +#ifdef VLIW5 +#define VECT_SIZE4 +#endif + +#define DGST_R0 3 +#define DGST_R1 4 +#define DGST_R2 2 +#define DGST_R3 1 + +#include "include/kernel_functions.c" +#include "types_amd.c" +#include "common_amd.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +static void overwrite_at (u32x sw[16], const u32x w0, const u32 salt_len) +{ + switch (salt_len) + { + case 0: sw[0] = w0; + break; + case 1: sw[0] = (sw[0] & 0xff000000) | (w0 >> 8); + sw[1] = (sw[1] & 0x00ffffff) | (w0 << 24); + break; + case 2: sw[0] = (sw[0] & 0xffff0000) | (w0 >> 16); + sw[1] = (sw[1] & 0x0000ffff) | (w0 << 16); + break; + case 3: sw[0] = (sw[0] & 0xffffff00) | (w0 >> 24); + sw[1] = (sw[1] & 0x000000ff) | (w0 << 8); + break; + case 4: sw[1] = w0; + break; + case 5: sw[1] = (sw[1] & 0xff000000) | (w0 >> 8); + sw[2] = (sw[2] & 0x00ffffff) | (w0 << 24); + break; + case 6: sw[1] = (sw[1] & 0xffff0000) | (w0 >> 16); + sw[2] = (sw[2] & 0x0000ffff) | (w0 << 16); + break; + case 7: sw[1] = (sw[1] & 0xffffff00) | (w0 >> 24); + sw[2] = (sw[2] & 0x000000ff) | (w0 << 8); + break; + case 8: sw[2] = w0; + break; + case 9: sw[2] = (sw[2] & 0xff000000) | (w0 >> 8); + sw[3] = (sw[3] & 0x00ffffff) | (w0 << 24); + break; + case 10: sw[2] = (sw[2] & 0xffff0000) | (w0 >> 16); + sw[3] = (sw[3] & 0x0000ffff) | (w0 << 16); + break; + case 11: sw[2] = (sw[2] & 0xffffff00) | (w0 >> 24); + sw[3] = (sw[3] & 0x000000ff) | (w0 << 8); + break; + case 12: sw[3] = w0; + break; + case 13: sw[3] = (sw[3] & 0xff000000) | (w0 >> 8); + sw[4] = (sw[4] & 0x00ffffff) | (w0 << 24); + break; + case 14: sw[3] = (sw[3] & 0xffff0000) | (w0 >> 16); + sw[4] = (sw[4] & 0x0000ffff) | (w0 << 16); + break; + case 15: sw[3] = (sw[3] & 0xffffff00) | (w0 >> 24); + sw[4] = (sw[4] & 0x000000ff) | (w0 << 8); + break; + case 16: sw[4] = w0; + break; + case 17: sw[4] = (sw[4] & 0xff000000) | (w0 >> 8); + sw[5] = (sw[5] & 0x00ffffff) | (w0 << 24); + break; + case 18: sw[4] = (sw[4] & 0xffff0000) | (w0 >> 16); + sw[5] = (sw[5] & 0x0000ffff) | (w0 << 16); + break; + case 19: sw[4] = (sw[4] & 0xffffff00) | (w0 >> 24); + sw[5] = (sw[5] & 0x000000ff) | (w0 << 8); + break; + case 20: sw[5] = w0; + break; + case 21: sw[5] = (sw[5] & 0xff000000) | (w0 >> 8); + sw[6] = (sw[6] & 0x00ffffff) | (w0 << 24); + break; + case 22: sw[5] = (sw[5] & 0xffff0000) | (w0 >> 16); + sw[6] = (sw[6] & 0x0000ffff) | (w0 << 16); + break; + case 23: sw[5] = (sw[5] & 0xffffff00) | (w0 >> 24); + sw[6] = (sw[6] & 0x000000ff) | (w0 << 8); + break; + case 24: sw[6] = w0; + break; + case 25: sw[6] = (sw[6] & 0xff000000) | (w0 >> 8); + sw[7] = (sw[7] & 0x00ffffff) | (w0 << 24); + break; + case 26: sw[6] = (sw[6] & 0xffff0000) | (w0 >> 16); + sw[7] = (sw[7] & 0x0000ffff) | (w0 << 16); + break; + case 27: sw[6] = (sw[6] & 0xffffff00) | (w0 >> 24); + sw[7] = (sw[7] & 0x000000ff) | (w0 << 8); + break; + case 28: sw[7] = w0; + break; + case 29: sw[7] = (sw[7] & 0xff000000) | (w0 >> 8); + sw[8] = (sw[8] & 0x00ffffff) | (w0 << 24); + break; + case 30: sw[7] = (sw[7] & 0xffff0000) | (w0 >> 16); + sw[8] = (sw[8] & 0x0000ffff) | (w0 << 16); + break; + case 31: sw[7] = (sw[7] & 0xffffff00) | (w0 >> 24); + sw[8] = (sw[8] & 0x000000ff) | (w0 << 8); + break; + } +} + +static void m00120m (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], const u32 pw_len, __global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset) +{ + /** + * modifier + */ + + const u32 gid = get_global_id (0); + const u32 lid = get_local_id (0); + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[ 1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[ 2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[ 3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[ 4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[ 5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[ 6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[ 7]; + + u32 salt_buf2[4]; + + salt_buf2[0] = 0; + salt_buf2[1] = 0; + salt_buf2[2] = 0; + salt_buf2[3] = 0; + + u32 salt_buf3[4]; + + salt_buf3[0] = 0; + salt_buf3[1] = 0; + salt_buf3[2] = 0; + salt_buf3[3] = 0; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + const u32 pw_salt_len = pw_len + salt_len; + + /** + * prepend salt + */ + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + w0_t[0] = swap_workaround (w0[0]); + w0_t[1] = swap_workaround (w0[1]); + w0_t[2] = swap_workaround (w0[2]); + w0_t[3] = swap_workaround (w0[3]); + w1_t[0] = swap_workaround (w1[0]); + w1_t[1] = swap_workaround (w1[1]); + w1_t[2] = swap_workaround (w1[2]); + w1_t[3] = swap_workaround (w1[3]); + w2_t[0] = swap_workaround (w2[0]); + w2_t[1] = swap_workaround (w2[1]); + w2_t[2] = swap_workaround (w2[2]); + w2_t[3] = swap_workaround (w2[3]); + w3_t[0] = swap_workaround (w3[0]); + w3_t[1] = swap_workaround (w3[1]); + w3_t[2] = swap_workaround (w3[2]); + w3_t[3] = swap_workaround (w3[3]); + + switch_buffer_by_offset (w0_t, w1_t, w2_t, w3_t, salt_len); + + w0_t[0] |= salt_buf0[0]; + w0_t[1] |= salt_buf0[1]; + w0_t[2] |= salt_buf0[2]; + w0_t[3] |= salt_buf0[3]; + w1_t[0] |= salt_buf1[0]; + w1_t[1] |= salt_buf1[1]; + w1_t[2] |= salt_buf1[2]; + w1_t[3] |= salt_buf1[3]; + w2_t[0] |= salt_buf2[0]; + w2_t[1] |= salt_buf2[1]; + w2_t[2] |= salt_buf2[2]; + w2_t[3] |= salt_buf2[3]; + w3_t[0] |= salt_buf3[0]; + w3_t[1] |= salt_buf3[1]; + w3_t[2] |= salt_buf3[2]; + w3_t[3] |= salt_buf3[3]; + + w0_t[0] = swap_workaround (w0_t[0]); + w0_t[1] = swap_workaround (w0_t[1]); + w0_t[2] = swap_workaround (w0_t[2]); + w0_t[3] = swap_workaround (w0_t[3]); + w1_t[0] = swap_workaround (w1_t[0]); + w1_t[1] = swap_workaround (w1_t[1]); + w1_t[2] = swap_workaround (w1_t[2]); + w1_t[3] = swap_workaround (w1_t[3]); + w2_t[0] = swap_workaround (w2_t[0]); + w2_t[1] = swap_workaround (w2_t[1]); + w2_t[2] = swap_workaround (w2_t[2]); + w2_t[3] = swap_workaround (w2_t[3]); + w3_t[0] = swap_workaround (w3_t[0]); + w3_t[1] = swap_workaround (w3_t[1]); + w3_t[2] = swap_workaround (w3_t[2]); + w3_t[3] = swap_workaround (w3_t[3]); + + /** + * loop + */ + + u32x w0l = w0[0]; + + for (u32 il_pos = 0; il_pos < bfs_cnt; il_pos++) + { + const u32 w0r = bfs_buf[il_pos].i; + + const u32x w0n = w0l | w0r; + + u32x wx[16]; + + wx[ 0] = w0_t[0]; + wx[ 1] = w0_t[1]; + wx[ 2] = w0_t[2]; + wx[ 3] = w0_t[3]; + wx[ 4] = w1_t[0]; + wx[ 5] = w1_t[1]; + wx[ 6] = w1_t[2]; + wx[ 7] = w1_t[3]; + wx[ 8] = w2_t[0]; + wx[ 9] = w2_t[1]; + wx[10] = w2_t[2]; + wx[11] = w2_t[3]; + wx[12] = w3_t[0]; + wx[13] = w3_t[1]; + wx[14] = w3_t[2]; + wx[15] = w3_t[3]; + + overwrite_at (wx, w0n, salt_len); + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + w0_t[0] = wx[ 0]; + w0_t[1] = wx[ 1]; + w0_t[2] = wx[ 2]; + w0_t[3] = wx[ 3]; + w1_t[0] = wx[ 4]; + w1_t[1] = wx[ 5]; + w1_t[2] = wx[ 6]; + w1_t[3] = wx[ 7]; + w2_t[0] = wx[ 8]; + w2_t[1] = wx[ 9]; + w2_t[2] = wx[10]; + w2_t[3] = wx[11]; + w3_t[0] = wx[12]; + w3_t[1] = wx[13]; + w3_t[2] = 0; + w3_t[3] = pw_salt_len * 8; + + /** + * sha1 + */ + + u32x a = SHA1M_A; + u32x b = SHA1M_B; + u32x c = SHA1M_C; + u32x d = SHA1M_D; + u32x e = SHA1M_E; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w0_t[0]); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w0_t[1]); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w0_t[2]); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w0_t[3]); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w1_t[0]); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w1_t[1]); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w1_t[2]); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w1_t[3]); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w2_t[0]); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w2_t[1]); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w2_t[2]); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w2_t[3]); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w3_t[0]); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w3_t[1]); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w3_t[2]); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w3_t[3]); + w0_t[0] = rotl32 ((w3_t[1] ^ w2_t[0] ^ w0_t[2] ^ w0_t[0]), 1u); SHA1_STEP (SHA1_F0o, e, a, b, c, d, w0_t[0]); + w0_t[1] = rotl32 ((w3_t[2] ^ w2_t[1] ^ w0_t[3] ^ w0_t[1]), 1u); SHA1_STEP (SHA1_F0o, d, e, a, b, c, w0_t[1]); + w0_t[2] = rotl32 ((w3_t[3] ^ w2_t[2] ^ w1_t[0] ^ w0_t[2]), 1u); SHA1_STEP (SHA1_F0o, c, d, e, a, b, w0_t[2]); + w0_t[3] = rotl32 ((w0_t[0] ^ w2_t[3] ^ w1_t[1] ^ w0_t[3]), 1u); SHA1_STEP (SHA1_F0o, b, c, d, e, a, w0_t[3]); + + #undef K + #define K SHA1C01 + + w1_t[0] = rotl32 ((w0_t[1] ^ w3_t[0] ^ w1_t[2] ^ w1_t[0]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w1_t[0]); + w1_t[1] = rotl32 ((w0_t[2] ^ w3_t[1] ^ w1_t[3] ^ w1_t[1]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w1_t[1]); + w1_t[2] = rotl32 ((w0_t[3] ^ w3_t[2] ^ w2_t[0] ^ w1_t[2]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w1_t[2]); + w1_t[3] = rotl32 ((w1_t[0] ^ w3_t[3] ^ w2_t[1] ^ w1_t[3]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1_t[3]); + w2_t[0] = rotl32 ((w1_t[1] ^ w0_t[0] ^ w2_t[2] ^ w2_t[0]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w2_t[0]); + w2_t[1] = rotl32 ((w1_t[2] ^ w0_t[1] ^ w2_t[3] ^ w2_t[1]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w2_t[1]); + w2_t[2] = rotl32 ((w1_t[3] ^ w0_t[2] ^ w3_t[0] ^ w2_t[2]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w2_t[2]); + w2_t[3] = rotl32 ((w2_t[0] ^ w0_t[3] ^ w3_t[1] ^ w2_t[3]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w2_t[3]); + w3_t[0] = rotl32 ((w2_t[1] ^ w1_t[0] ^ w3_t[2] ^ w3_t[0]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w3_t[0]); + w3_t[1] = rotl32 ((w2_t[2] ^ w1_t[1] ^ w3_t[3] ^ w3_t[1]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w3_t[1]); + w3_t[2] = rotl32 ((w2_t[3] ^ w1_t[2] ^ w0_t[0] ^ w3_t[2]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w3_t[2]); + w3_t[3] = rotl32 ((w3_t[0] ^ w1_t[3] ^ w0_t[1] ^ w3_t[3]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w3_t[3]); + w0_t[0] = rotl32 ((w3_t[1] ^ w2_t[0] ^ w0_t[2] ^ w0_t[0]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w0_t[0]); + w0_t[1] = rotl32 ((w3_t[2] ^ w2_t[1] ^ w0_t[3] ^ w0_t[1]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w0_t[1]); + w0_t[2] = rotl32 ((w3_t[3] ^ w2_t[2] ^ w1_t[0] ^ w0_t[2]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w0_t[2]); + w0_t[3] = rotl32 ((w0_t[0] ^ w2_t[3] ^ w1_t[1] ^ w0_t[3]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w0_t[3]); + w1_t[0] = rotl32 ((w0_t[1] ^ w3_t[0] ^ w1_t[2] ^ w1_t[0]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w1_t[0]); + w1_t[1] = rotl32 ((w0_t[2] ^ w3_t[1] ^ w1_t[3] ^ w1_t[1]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w1_t[1]); + w1_t[2] = rotl32 ((w0_t[3] ^ w3_t[2] ^ w2_t[0] ^ w1_t[2]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1_t[2]); + w1_t[3] = rotl32 ((w1_t[0] ^ w3_t[3] ^ w2_t[1] ^ w1_t[3]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w1_t[3]); + + #undef K + #define K SHA1C02 + + w2_t[0] = rotl32 ((w1_t[1] ^ w0_t[0] ^ w2_t[2] ^ w2_t[0]), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w2_t[0]); + w2_t[1] = rotl32 ((w1_t[2] ^ w0_t[1] ^ w2_t[3] ^ w2_t[1]), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w2_t[1]); + w2_t[2] = rotl32 ((w1_t[3] ^ w0_t[2] ^ w3_t[0] ^ w2_t[2]), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w2_t[2]); + w2_t[3] = rotl32 ((w2_t[0] ^ w0_t[3] ^ w3_t[1] ^ w2_t[3]), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w2_t[3]); + w3_t[0] = rotl32 ((w2_t[1] ^ w1_t[0] ^ w3_t[2] ^ w3_t[0]), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w3_t[0]); + w3_t[1] = rotl32 ((w2_t[2] ^ w1_t[1] ^ w3_t[3] ^ w3_t[1]), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w3_t[1]); + w3_t[2] = rotl32 ((w2_t[3] ^ w1_t[2] ^ w0_t[0] ^ w3_t[2]), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w3_t[2]); + w3_t[3] = rotl32 ((w3_t[0] ^ w1_t[3] ^ w0_t[1] ^ w3_t[3]), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w3_t[3]); + w0_t[0] = rotl32 ((w3_t[1] ^ w2_t[0] ^ w0_t[2] ^ w0_t[0]), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w0_t[0]); + w0_t[1] = rotl32 ((w3_t[2] ^ w2_t[1] ^ w0_t[3] ^ w0_t[1]), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w0_t[1]); + w0_t[2] = rotl32 ((w3_t[3] ^ w2_t[2] ^ w1_t[0] ^ w0_t[2]), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w0_t[2]); + w0_t[3] = rotl32 ((w0_t[0] ^ w2_t[3] ^ w1_t[1] ^ w0_t[3]), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w0_t[3]); + w1_t[0] = rotl32 ((w0_t[1] ^ w3_t[0] ^ w1_t[2] ^ w1_t[0]), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w1_t[0]); + w1_t[1] = rotl32 ((w0_t[2] ^ w3_t[1] ^ w1_t[3] ^ w1_t[1]), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w1_t[1]); + w1_t[2] = rotl32 ((w0_t[3] ^ w3_t[2] ^ w2_t[0] ^ w1_t[2]), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w1_t[2]); + w1_t[3] = rotl32 ((w1_t[0] ^ w3_t[3] ^ w2_t[1] ^ w1_t[3]), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w1_t[3]); + w2_t[0] = rotl32 ((w1_t[1] ^ w0_t[0] ^ w2_t[2] ^ w2_t[0]), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w2_t[0]); + w2_t[1] = rotl32 ((w1_t[2] ^ w0_t[1] ^ w2_t[3] ^ w2_t[1]), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w2_t[1]); + w2_t[2] = rotl32 ((w1_t[3] ^ w0_t[2] ^ w3_t[0] ^ w2_t[2]), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w2_t[2]); + w2_t[3] = rotl32 ((w2_t[0] ^ w0_t[3] ^ w3_t[1] ^ w2_t[3]), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w2_t[3]); + + #undef K + #define K SHA1C03 + + w3_t[0] = rotl32 ((w2_t[1] ^ w1_t[0] ^ w3_t[2] ^ w3_t[0]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w3_t[0]); + w3_t[1] = rotl32 ((w2_t[2] ^ w1_t[1] ^ w3_t[3] ^ w3_t[1]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w3_t[1]); + w3_t[2] = rotl32 ((w2_t[3] ^ w1_t[2] ^ w0_t[0] ^ w3_t[2]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w3_t[2]); + w3_t[3] = rotl32 ((w3_t[0] ^ w1_t[3] ^ w0_t[1] ^ w3_t[3]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w3_t[3]); + w0_t[0] = rotl32 ((w3_t[1] ^ w2_t[0] ^ w0_t[2] ^ w0_t[0]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w0_t[0]); + w0_t[1] = rotl32 ((w3_t[2] ^ w2_t[1] ^ w0_t[3] ^ w0_t[1]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w0_t[1]); + w0_t[2] = rotl32 ((w3_t[3] ^ w2_t[2] ^ w1_t[0] ^ w0_t[2]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w0_t[2]); + w0_t[3] = rotl32 ((w0_t[0] ^ w2_t[3] ^ w1_t[1] ^ w0_t[3]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w0_t[3]); + w1_t[0] = rotl32 ((w0_t[1] ^ w3_t[0] ^ w1_t[2] ^ w1_t[0]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1_t[0]); + w1_t[1] = rotl32 ((w0_t[2] ^ w3_t[1] ^ w1_t[3] ^ w1_t[1]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w1_t[1]); + w1_t[2] = rotl32 ((w0_t[3] ^ w3_t[2] ^ w2_t[0] ^ w1_t[2]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w1_t[2]); + w1_t[3] = rotl32 ((w1_t[0] ^ w3_t[3] ^ w2_t[1] ^ w1_t[3]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w1_t[3]); + w2_t[0] = rotl32 ((w1_t[1] ^ w0_t[0] ^ w2_t[2] ^ w2_t[0]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w2_t[0]); + w2_t[1] = rotl32 ((w1_t[2] ^ w0_t[1] ^ w2_t[3] ^ w2_t[1]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w2_t[1]); + w2_t[2] = rotl32 ((w1_t[3] ^ w0_t[2] ^ w3_t[0] ^ w2_t[2]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w2_t[2]); + w2_t[3] = rotl32 ((w2_t[0] ^ w0_t[3] ^ w3_t[1] ^ w2_t[3]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w2_t[3]); + w3_t[0] = rotl32 ((w2_t[1] ^ w1_t[0] ^ w3_t[2] ^ w3_t[0]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w3_t[0]); + w3_t[1] = rotl32 ((w2_t[2] ^ w1_t[1] ^ w3_t[3] ^ w3_t[1]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w3_t[1]); + w3_t[2] = rotl32 ((w2_t[3] ^ w1_t[2] ^ w0_t[0] ^ w3_t[2]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w3_t[2]); + w3_t[3] = rotl32 ((w3_t[0] ^ w1_t[3] ^ w0_t[1] ^ w3_t[3]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w3_t[3]); + + const u32x r0 = d; + const u32x r1 = e; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_M + } +} + +static void m00120s (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], const u32 pw_len, __global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset) +{ + /** + * modifier + */ + + const u32 gid = get_global_id (0); + const u32 lid = get_local_id (0); + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * reverse + */ + + const u32 e_rev = rotl32 (search[1], 2u); + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[ 1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[ 2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[ 3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[ 4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[ 5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[ 6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[ 7]; + + u32 salt_buf2[4]; + + salt_buf2[0] = 0; + salt_buf2[1] = 0; + salt_buf2[2] = 0; + salt_buf2[3] = 0; + + u32 salt_buf3[4]; + + salt_buf3[0] = 0; + salt_buf3[1] = 0; + salt_buf3[2] = 0; + salt_buf3[3] = 0; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + const u32 pw_salt_len = pw_len + salt_len; + + /** + * prepend salt + */ + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + w0_t[0] = swap_workaround (w0[0]); + w0_t[1] = swap_workaround (w0[1]); + w0_t[2] = swap_workaround (w0[2]); + w0_t[3] = swap_workaround (w0[3]); + w1_t[0] = swap_workaround (w1[0]); + w1_t[1] = swap_workaround (w1[1]); + w1_t[2] = swap_workaround (w1[2]); + w1_t[3] = swap_workaround (w1[3]); + w2_t[0] = swap_workaround (w2[0]); + w2_t[1] = swap_workaround (w2[1]); + w2_t[2] = swap_workaround (w2[2]); + w2_t[3] = swap_workaround (w2[3]); + w3_t[0] = swap_workaround (w3[0]); + w3_t[1] = swap_workaround (w3[1]); + w3_t[2] = swap_workaround (w3[2]); + w3_t[3] = swap_workaround (w3[3]); + + switch_buffer_by_offset (w0_t, w1_t, w2_t, w3_t, salt_len); + + w0_t[0] |= salt_buf0[0]; + w0_t[1] |= salt_buf0[1]; + w0_t[2] |= salt_buf0[2]; + w0_t[3] |= salt_buf0[3]; + w1_t[0] |= salt_buf1[0]; + w1_t[1] |= salt_buf1[1]; + w1_t[2] |= salt_buf1[2]; + w1_t[3] |= salt_buf1[3]; + w2_t[0] |= salt_buf2[0]; + w2_t[1] |= salt_buf2[1]; + w2_t[2] |= salt_buf2[2]; + w2_t[3] |= salt_buf2[3]; + w3_t[0] |= salt_buf3[0]; + w3_t[1] |= salt_buf3[1]; + w3_t[2] |= salt_buf3[2]; + w3_t[3] |= salt_buf3[3]; + + w0_t[0] = swap_workaround (w0_t[0]); + w0_t[1] = swap_workaround (w0_t[1]); + w0_t[2] = swap_workaround (w0_t[2]); + w0_t[3] = swap_workaround (w0_t[3]); + w1_t[0] = swap_workaround (w1_t[0]); + w1_t[1] = swap_workaround (w1_t[1]); + w1_t[2] = swap_workaround (w1_t[2]); + w1_t[3] = swap_workaround (w1_t[3]); + w2_t[0] = swap_workaround (w2_t[0]); + w2_t[1] = swap_workaround (w2_t[1]); + w2_t[2] = swap_workaround (w2_t[2]); + w2_t[3] = swap_workaround (w2_t[3]); + w3_t[0] = swap_workaround (w3_t[0]); + w3_t[1] = swap_workaround (w3_t[1]); + w3_t[2] = swap_workaround (w3_t[2]); + w3_t[3] = swap_workaround (w3_t[3]); + + /** + * loop + */ + + u32x w0l = w0[0]; + + for (u32 il_pos = 0; il_pos < bfs_cnt; il_pos++) + { + const u32 w0r = bfs_buf[il_pos].i; + + const u32x w0n = w0l | w0r; + + u32x wx[16]; + + wx[ 0] = w0_t[0]; + wx[ 1] = w0_t[1]; + wx[ 2] = w0_t[2]; + wx[ 3] = w0_t[3]; + wx[ 4] = w1_t[0]; + wx[ 5] = w1_t[1]; + wx[ 6] = w1_t[2]; + wx[ 7] = w1_t[3]; + wx[ 8] = w2_t[0]; + wx[ 9] = w2_t[1]; + wx[10] = w2_t[2]; + wx[11] = w2_t[3]; + wx[12] = w3_t[0]; + wx[13] = w3_t[1]; + wx[14] = w3_t[2]; + wx[15] = w3_t[3]; + + overwrite_at (wx, w0n, salt_len); + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + w0_t[0] = wx[ 0]; + w0_t[1] = wx[ 1]; + w0_t[2] = wx[ 2]; + w0_t[3] = wx[ 3]; + w1_t[0] = wx[ 4]; + w1_t[1] = wx[ 5]; + w1_t[2] = wx[ 6]; + w1_t[3] = wx[ 7]; + w2_t[0] = wx[ 8]; + w2_t[1] = wx[ 9]; + w2_t[2] = wx[10]; + w2_t[3] = wx[11]; + w3_t[0] = wx[12]; + w3_t[1] = wx[13]; + w3_t[2] = 0; + w3_t[3] = pw_salt_len * 8; + + /** + * sha1 + */ + + u32x a = SHA1M_A; + u32x b = SHA1M_B; + u32x c = SHA1M_C; + u32x d = SHA1M_D; + u32x e = SHA1M_E; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w0_t[0]); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w0_t[1]); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w0_t[2]); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w0_t[3]); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w1_t[0]); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w1_t[1]); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w1_t[2]); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w1_t[3]); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w2_t[0]); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w2_t[1]); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w2_t[2]); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w2_t[3]); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w3_t[0]); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w3_t[1]); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w3_t[2]); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w3_t[3]); + w0_t[0] = rotl32 ((w3_t[1] ^ w2_t[0] ^ w0_t[2] ^ w0_t[0]), 1u); SHA1_STEP (SHA1_F0o, e, a, b, c, d, w0_t[0]); + w0_t[1] = rotl32 ((w3_t[2] ^ w2_t[1] ^ w0_t[3] ^ w0_t[1]), 1u); SHA1_STEP (SHA1_F0o, d, e, a, b, c, w0_t[1]); + w0_t[2] = rotl32 ((w3_t[3] ^ w2_t[2] ^ w1_t[0] ^ w0_t[2]), 1u); SHA1_STEP (SHA1_F0o, c, d, e, a, b, w0_t[2]); + w0_t[3] = rotl32 ((w0_t[0] ^ w2_t[3] ^ w1_t[1] ^ w0_t[3]), 1u); SHA1_STEP (SHA1_F0o, b, c, d, e, a, w0_t[3]); + + #undef K + #define K SHA1C01 + + w1_t[0] = rotl32 ((w0_t[1] ^ w3_t[0] ^ w1_t[2] ^ w1_t[0]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w1_t[0]); + w1_t[1] = rotl32 ((w0_t[2] ^ w3_t[1] ^ w1_t[3] ^ w1_t[1]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w1_t[1]); + w1_t[2] = rotl32 ((w0_t[3] ^ w3_t[2] ^ w2_t[0] ^ w1_t[2]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w1_t[2]); + w1_t[3] = rotl32 ((w1_t[0] ^ w3_t[3] ^ w2_t[1] ^ w1_t[3]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1_t[3]); + w2_t[0] = rotl32 ((w1_t[1] ^ w0_t[0] ^ w2_t[2] ^ w2_t[0]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w2_t[0]); + w2_t[1] = rotl32 ((w1_t[2] ^ w0_t[1] ^ w2_t[3] ^ w2_t[1]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w2_t[1]); + w2_t[2] = rotl32 ((w1_t[3] ^ w0_t[2] ^ w3_t[0] ^ w2_t[2]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w2_t[2]); + w2_t[3] = rotl32 ((w2_t[0] ^ w0_t[3] ^ w3_t[1] ^ w2_t[3]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w2_t[3]); + w3_t[0] = rotl32 ((w2_t[1] ^ w1_t[0] ^ w3_t[2] ^ w3_t[0]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w3_t[0]); + w3_t[1] = rotl32 ((w2_t[2] ^ w1_t[1] ^ w3_t[3] ^ w3_t[1]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w3_t[1]); + w3_t[2] = rotl32 ((w2_t[3] ^ w1_t[2] ^ w0_t[0] ^ w3_t[2]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w3_t[2]); + w3_t[3] = rotl32 ((w3_t[0] ^ w1_t[3] ^ w0_t[1] ^ w3_t[3]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w3_t[3]); + w0_t[0] = rotl32 ((w3_t[1] ^ w2_t[0] ^ w0_t[2] ^ w0_t[0]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w0_t[0]); + w0_t[1] = rotl32 ((w3_t[2] ^ w2_t[1] ^ w0_t[3] ^ w0_t[1]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w0_t[1]); + w0_t[2] = rotl32 ((w3_t[3] ^ w2_t[2] ^ w1_t[0] ^ w0_t[2]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w0_t[2]); + w0_t[3] = rotl32 ((w0_t[0] ^ w2_t[3] ^ w1_t[1] ^ w0_t[3]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w0_t[3]); + w1_t[0] = rotl32 ((w0_t[1] ^ w3_t[0] ^ w1_t[2] ^ w1_t[0]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w1_t[0]); + w1_t[1] = rotl32 ((w0_t[2] ^ w3_t[1] ^ w1_t[3] ^ w1_t[1]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w1_t[1]); + w1_t[2] = rotl32 ((w0_t[3] ^ w3_t[2] ^ w2_t[0] ^ w1_t[2]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1_t[2]); + w1_t[3] = rotl32 ((w1_t[0] ^ w3_t[3] ^ w2_t[1] ^ w1_t[3]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w1_t[3]); + + #undef K + #define K SHA1C02 + + w2_t[0] = rotl32 ((w1_t[1] ^ w0_t[0] ^ w2_t[2] ^ w2_t[0]), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w2_t[0]); + w2_t[1] = rotl32 ((w1_t[2] ^ w0_t[1] ^ w2_t[3] ^ w2_t[1]), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w2_t[1]); + w2_t[2] = rotl32 ((w1_t[3] ^ w0_t[2] ^ w3_t[0] ^ w2_t[2]), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w2_t[2]); + w2_t[3] = rotl32 ((w2_t[0] ^ w0_t[3] ^ w3_t[1] ^ w2_t[3]), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w2_t[3]); + w3_t[0] = rotl32 ((w2_t[1] ^ w1_t[0] ^ w3_t[2] ^ w3_t[0]), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w3_t[0]); + w3_t[1] = rotl32 ((w2_t[2] ^ w1_t[1] ^ w3_t[3] ^ w3_t[1]), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w3_t[1]); + w3_t[2] = rotl32 ((w2_t[3] ^ w1_t[2] ^ w0_t[0] ^ w3_t[2]), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w3_t[2]); + w3_t[3] = rotl32 ((w3_t[0] ^ w1_t[3] ^ w0_t[1] ^ w3_t[3]), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w3_t[3]); + w0_t[0] = rotl32 ((w3_t[1] ^ w2_t[0] ^ w0_t[2] ^ w0_t[0]), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w0_t[0]); + w0_t[1] = rotl32 ((w3_t[2] ^ w2_t[1] ^ w0_t[3] ^ w0_t[1]), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w0_t[1]); + w0_t[2] = rotl32 ((w3_t[3] ^ w2_t[2] ^ w1_t[0] ^ w0_t[2]), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w0_t[2]); + w0_t[3] = rotl32 ((w0_t[0] ^ w2_t[3] ^ w1_t[1] ^ w0_t[3]), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w0_t[3]); + w1_t[0] = rotl32 ((w0_t[1] ^ w3_t[0] ^ w1_t[2] ^ w1_t[0]), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w1_t[0]); + w1_t[1] = rotl32 ((w0_t[2] ^ w3_t[1] ^ w1_t[3] ^ w1_t[1]), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w1_t[1]); + w1_t[2] = rotl32 ((w0_t[3] ^ w3_t[2] ^ w2_t[0] ^ w1_t[2]), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w1_t[2]); + w1_t[3] = rotl32 ((w1_t[0] ^ w3_t[3] ^ w2_t[1] ^ w1_t[3]), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w1_t[3]); + w2_t[0] = rotl32 ((w1_t[1] ^ w0_t[0] ^ w2_t[2] ^ w2_t[0]), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w2_t[0]); + w2_t[1] = rotl32 ((w1_t[2] ^ w0_t[1] ^ w2_t[3] ^ w2_t[1]), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w2_t[1]); + w2_t[2] = rotl32 ((w1_t[3] ^ w0_t[2] ^ w3_t[0] ^ w2_t[2]), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w2_t[2]); + w2_t[3] = rotl32 ((w2_t[0] ^ w0_t[3] ^ w3_t[1] ^ w2_t[3]), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w2_t[3]); + + #undef K + #define K SHA1C03 + + w3_t[0] = rotl32 ((w2_t[1] ^ w1_t[0] ^ w3_t[2] ^ w3_t[0]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w3_t[0]); + w3_t[1] = rotl32 ((w2_t[2] ^ w1_t[1] ^ w3_t[3] ^ w3_t[1]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w3_t[1]); + w3_t[2] = rotl32 ((w2_t[3] ^ w1_t[2] ^ w0_t[0] ^ w3_t[2]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w3_t[2]); + w3_t[3] = rotl32 ((w3_t[0] ^ w1_t[3] ^ w0_t[1] ^ w3_t[3]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w3_t[3]); + w0_t[0] = rotl32 ((w3_t[1] ^ w2_t[0] ^ w0_t[2] ^ w0_t[0]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w0_t[0]); + w0_t[1] = rotl32 ((w3_t[2] ^ w2_t[1] ^ w0_t[3] ^ w0_t[1]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w0_t[1]); + w0_t[2] = rotl32 ((w3_t[3] ^ w2_t[2] ^ w1_t[0] ^ w0_t[2]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w0_t[2]); + w0_t[3] = rotl32 ((w0_t[0] ^ w2_t[3] ^ w1_t[1] ^ w0_t[3]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w0_t[3]); + w1_t[0] = rotl32 ((w0_t[1] ^ w3_t[0] ^ w1_t[2] ^ w1_t[0]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1_t[0]); + w1_t[1] = rotl32 ((w0_t[2] ^ w3_t[1] ^ w1_t[3] ^ w1_t[1]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w1_t[1]); + w1_t[2] = rotl32 ((w0_t[3] ^ w3_t[2] ^ w2_t[0] ^ w1_t[2]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w1_t[2]); + w1_t[3] = rotl32 ((w1_t[0] ^ w3_t[3] ^ w2_t[1] ^ w1_t[3]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w1_t[3]); + w2_t[0] = rotl32 ((w1_t[1] ^ w0_t[0] ^ w2_t[2] ^ w2_t[0]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w2_t[0]); + w2_t[1] = rotl32 ((w1_t[2] ^ w0_t[1] ^ w2_t[3] ^ w2_t[1]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w2_t[1]); + w2_t[2] = rotl32 ((w1_t[3] ^ w0_t[2] ^ w3_t[0] ^ w2_t[2]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w2_t[2]); + w2_t[3] = rotl32 ((w2_t[0] ^ w0_t[3] ^ w3_t[1] ^ w2_t[3]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w2_t[3]); + w3_t[0] = rotl32 ((w2_t[1] ^ w1_t[0] ^ w3_t[2] ^ w3_t[0]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w3_t[0]); + + if (allx (e != e_rev)) continue; + + w3_t[1] = rotl32 ((w2_t[2] ^ w1_t[1] ^ w3_t[3] ^ w3_t[1]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w3_t[1]); + w3_t[2] = rotl32 ((w2_t[3] ^ w1_t[2] ^ w0_t[0] ^ w3_t[2]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w3_t[2]); + w3_t[3] = rotl32 ((w3_t[0] ^ w1_t[3] ^ w0_t[1] ^ w3_t[3]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w3_t[3]); + + + const u32x r0 = d; + const u32x r1 = e; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_S + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m00120_m04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m00120m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m00120_m08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m00120m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m00120_m16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = pws[gid].i[ 8]; + w2[1] = pws[gid].i[ 9]; + w2[2] = pws[gid].i[10]; + w2[3] = pws[gid].i[11]; + + u32x w3[4]; + + w3[0] = pws[gid].i[12]; + w3[1] = pws[gid].i[13]; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m00120m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m00120_s04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m00120s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m00120_s08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m00120s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m00120_s16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = pws[gid].i[ 8]; + w2[1] = pws[gid].i[ 9]; + w2[2] = pws[gid].i[10]; + w2[3] = pws[gid].i[11]; + + u32x w3[4]; + + w3[0] = pws[gid].i[12]; + w3[1] = pws[gid].i[13]; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m00120s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} diff --git a/amd/m00130_a0.cl b/amd/m00130_a0.cl new file mode 100644 index 0000000000..f4e4c4b045 --- /dev/null +++ b/amd/m00130_a0.cl @@ -0,0 +1,658 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _SHA1_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW4 +#define VECT_SIZE4 +#endif + +#ifdef VLIW5 +#define VECT_SIZE4 +#endif + +#define DGST_R0 3 +#define DGST_R1 4 +#define DGST_R2 2 +#define DGST_R3 1 + +#include "include/kernel_functions.c" +#include "types_amd.c" +#include "common_amd.c" +#include "include/rp_gpu.h" +#include "rp_amd.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +// no unicode yet + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m00130_m04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + u32x pw_buf1[4]; + + pw_buf1[0] = pws[gid].i[ 4]; + pw_buf1[1] = pws[gid].i[ 5]; + pw_buf1[2] = pws[gid].i[ 6]; + pw_buf1[3] = pws[gid].i[ 7]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[7]; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + + w0[0] = pw_buf0[0]; + w0[1] = pw_buf0[1]; + w0[2] = pw_buf0[2]; + w0[3] = pw_buf0[3]; + + u32x w1[4]; + + w1[0] = pw_buf1[0]; + w1[1] = pw_buf1[1]; + w1[2] = pw_buf1[2]; + w1[3] = pw_buf1[3]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 out_len = apply_rules (rules_buf[il_pos].cmds, w0, w1, pw_len); + + /** + * append salt + */ + + u32 s0[4]; + + s0[0] = salt_buf0[0]; + s0[1] = salt_buf0[1]; + s0[2] = salt_buf0[2]; + s0[3] = salt_buf0[3]; + + u32 s1[4]; + + s1[0] = salt_buf1[0]; + s1[1] = salt_buf1[1]; + s1[2] = salt_buf1[2]; + s1[3] = salt_buf1[3]; + + u32 s2[4]; + + s2[0] = 0; + s2[1] = 0; + s2[2] = 0; + s2[3] = 0; + + u32 s3[4]; + + s3[0] = 0; + s3[1] = 0; + s3[2] = 0; + s3[3] = 0; + + switch_buffer_by_offset (s0, s1, s2, s3, (out_len * 2)); + + const u32 out_salt_len = (out_len * 2) + salt_len; + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + make_unicode (w0, w0_t, w1_t); + make_unicode (w1, w2_t, w3_t); + + w0_t[0] |= s0[0]; + w0_t[1] |= s0[1]; + w0_t[2] |= s0[2]; + w0_t[3] |= s0[3]; + w1_t[0] |= s1[0]; + w1_t[1] |= s1[1]; + w1_t[2] |= s1[2]; + w1_t[3] |= s1[3]; + w2_t[0] |= s2[0]; + w2_t[1] |= s2[1]; + w2_t[2] |= s2[2]; + w2_t[3] |= s2[3]; + w3_t[0] |= s3[0]; + w3_t[1] |= s3[1]; + w3_t[2] |= s3[2]; + w3_t[3] |= s3[3]; + + append_0x80_4 (w0_t, w1_t, w2_t, w3_t, out_salt_len); + + w3_t[3] = out_salt_len * 8; + + /** + * sha1 + */ + + w0_t[0] = swap_workaround (w0_t[0]); + w0_t[1] = swap_workaround (w0_t[1]); + w0_t[2] = swap_workaround (w0_t[2]); + w0_t[3] = swap_workaround (w0_t[3]); + w1_t[0] = swap_workaround (w1_t[0]); + w1_t[1] = swap_workaround (w1_t[1]); + w1_t[2] = swap_workaround (w1_t[2]); + w1_t[3] = swap_workaround (w1_t[3]); + w2_t[0] = swap_workaround (w2_t[0]); + w2_t[1] = swap_workaround (w2_t[1]); + w2_t[2] = swap_workaround (w2_t[2]); + w2_t[3] = swap_workaround (w2_t[3]); + w3_t[0] = swap_workaround (w3_t[0]); + w3_t[1] = swap_workaround (w3_t[1]); + //w3_t[2] = swap_workaround (w3_t[2]); + //w3_t[3] = swap_workaround (w3_t[3]); + + u32x a = SHA1M_A; + u32x b = SHA1M_B; + u32x c = SHA1M_C; + u32x d = SHA1M_D; + u32x e = SHA1M_E; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w0_t[0]); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w0_t[1]); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w0_t[2]); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w0_t[3]); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w1_t[0]); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w1_t[1]); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w1_t[2]); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w1_t[3]); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w2_t[0]); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w2_t[1]); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w2_t[2]); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w2_t[3]); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w3_t[0]); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w3_t[1]); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w3_t[2]); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w3_t[3]); + w0_t[0] = rotl32 ((w3_t[1] ^ w2_t[0] ^ w0_t[2] ^ w0_t[0]), 1u); SHA1_STEP (SHA1_F0o, e, a, b, c, d, w0_t[0]); + w0_t[1] = rotl32 ((w3_t[2] ^ w2_t[1] ^ w0_t[3] ^ w0_t[1]), 1u); SHA1_STEP (SHA1_F0o, d, e, a, b, c, w0_t[1]); + w0_t[2] = rotl32 ((w3_t[3] ^ w2_t[2] ^ w1_t[0] ^ w0_t[2]), 1u); SHA1_STEP (SHA1_F0o, c, d, e, a, b, w0_t[2]); + w0_t[3] = rotl32 ((w0_t[0] ^ w2_t[3] ^ w1_t[1] ^ w0_t[3]), 1u); SHA1_STEP (SHA1_F0o, b, c, d, e, a, w0_t[3]); + + #undef K + #define K SHA1C01 + + w1_t[0] = rotl32 ((w0_t[1] ^ w3_t[0] ^ w1_t[2] ^ w1_t[0]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w1_t[0]); + w1_t[1] = rotl32 ((w0_t[2] ^ w3_t[1] ^ w1_t[3] ^ w1_t[1]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w1_t[1]); + w1_t[2] = rotl32 ((w0_t[3] ^ w3_t[2] ^ w2_t[0] ^ w1_t[2]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w1_t[2]); + w1_t[3] = rotl32 ((w1_t[0] ^ w3_t[3] ^ w2_t[1] ^ w1_t[3]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1_t[3]); + w2_t[0] = rotl32 ((w1_t[1] ^ w0_t[0] ^ w2_t[2] ^ w2_t[0]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w2_t[0]); + w2_t[1] = rotl32 ((w1_t[2] ^ w0_t[1] ^ w2_t[3] ^ w2_t[1]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w2_t[1]); + w2_t[2] = rotl32 ((w1_t[3] ^ w0_t[2] ^ w3_t[0] ^ w2_t[2]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w2_t[2]); + w2_t[3] = rotl32 ((w2_t[0] ^ w0_t[3] ^ w3_t[1] ^ w2_t[3]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w2_t[3]); + w3_t[0] = rotl32 ((w2_t[1] ^ w1_t[0] ^ w3_t[2] ^ w3_t[0]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w3_t[0]); + w3_t[1] = rotl32 ((w2_t[2] ^ w1_t[1] ^ w3_t[3] ^ w3_t[1]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w3_t[1]); + w3_t[2] = rotl32 ((w2_t[3] ^ w1_t[2] ^ w0_t[0] ^ w3_t[2]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w3_t[2]); + w3_t[3] = rotl32 ((w3_t[0] ^ w1_t[3] ^ w0_t[1] ^ w3_t[3]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w3_t[3]); + w0_t[0] = rotl32 ((w3_t[1] ^ w2_t[0] ^ w0_t[2] ^ w0_t[0]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w0_t[0]); + w0_t[1] = rotl32 ((w3_t[2] ^ w2_t[1] ^ w0_t[3] ^ w0_t[1]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w0_t[1]); + w0_t[2] = rotl32 ((w3_t[3] ^ w2_t[2] ^ w1_t[0] ^ w0_t[2]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w0_t[2]); + w0_t[3] = rotl32 ((w0_t[0] ^ w2_t[3] ^ w1_t[1] ^ w0_t[3]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w0_t[3]); + w1_t[0] = rotl32 ((w0_t[1] ^ w3_t[0] ^ w1_t[2] ^ w1_t[0]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w1_t[0]); + w1_t[1] = rotl32 ((w0_t[2] ^ w3_t[1] ^ w1_t[3] ^ w1_t[1]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w1_t[1]); + w1_t[2] = rotl32 ((w0_t[3] ^ w3_t[2] ^ w2_t[0] ^ w1_t[2]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1_t[2]); + w1_t[3] = rotl32 ((w1_t[0] ^ w3_t[3] ^ w2_t[1] ^ w1_t[3]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w1_t[3]); + + #undef K + #define K SHA1C02 + + w2_t[0] = rotl32 ((w1_t[1] ^ w0_t[0] ^ w2_t[2] ^ w2_t[0]), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w2_t[0]); + w2_t[1] = rotl32 ((w1_t[2] ^ w0_t[1] ^ w2_t[3] ^ w2_t[1]), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w2_t[1]); + w2_t[2] = rotl32 ((w1_t[3] ^ w0_t[2] ^ w3_t[0] ^ w2_t[2]), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w2_t[2]); + w2_t[3] = rotl32 ((w2_t[0] ^ w0_t[3] ^ w3_t[1] ^ w2_t[3]), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w2_t[3]); + w3_t[0] = rotl32 ((w2_t[1] ^ w1_t[0] ^ w3_t[2] ^ w3_t[0]), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w3_t[0]); + w3_t[1] = rotl32 ((w2_t[2] ^ w1_t[1] ^ w3_t[3] ^ w3_t[1]), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w3_t[1]); + w3_t[2] = rotl32 ((w2_t[3] ^ w1_t[2] ^ w0_t[0] ^ w3_t[2]), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w3_t[2]); + w3_t[3] = rotl32 ((w3_t[0] ^ w1_t[3] ^ w0_t[1] ^ w3_t[3]), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w3_t[3]); + w0_t[0] = rotl32 ((w3_t[1] ^ w2_t[0] ^ w0_t[2] ^ w0_t[0]), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w0_t[0]); + w0_t[1] = rotl32 ((w3_t[2] ^ w2_t[1] ^ w0_t[3] ^ w0_t[1]), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w0_t[1]); + w0_t[2] = rotl32 ((w3_t[3] ^ w2_t[2] ^ w1_t[0] ^ w0_t[2]), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w0_t[2]); + w0_t[3] = rotl32 ((w0_t[0] ^ w2_t[3] ^ w1_t[1] ^ w0_t[3]), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w0_t[3]); + w1_t[0] = rotl32 ((w0_t[1] ^ w3_t[0] ^ w1_t[2] ^ w1_t[0]), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w1_t[0]); + w1_t[1] = rotl32 ((w0_t[2] ^ w3_t[1] ^ w1_t[3] ^ w1_t[1]), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w1_t[1]); + w1_t[2] = rotl32 ((w0_t[3] ^ w3_t[2] ^ w2_t[0] ^ w1_t[2]), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w1_t[2]); + w1_t[3] = rotl32 ((w1_t[0] ^ w3_t[3] ^ w2_t[1] ^ w1_t[3]), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w1_t[3]); + w2_t[0] = rotl32 ((w1_t[1] ^ w0_t[0] ^ w2_t[2] ^ w2_t[0]), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w2_t[0]); + w2_t[1] = rotl32 ((w1_t[2] ^ w0_t[1] ^ w2_t[3] ^ w2_t[1]), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w2_t[1]); + w2_t[2] = rotl32 ((w1_t[3] ^ w0_t[2] ^ w3_t[0] ^ w2_t[2]), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w2_t[2]); + w2_t[3] = rotl32 ((w2_t[0] ^ w0_t[3] ^ w3_t[1] ^ w2_t[3]), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w2_t[3]); + + #undef K + #define K SHA1C03 + + w3_t[0] = rotl32 ((w2_t[1] ^ w1_t[0] ^ w3_t[2] ^ w3_t[0]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w3_t[0]); + w3_t[1] = rotl32 ((w2_t[2] ^ w1_t[1] ^ w3_t[3] ^ w3_t[1]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w3_t[1]); + w3_t[2] = rotl32 ((w2_t[3] ^ w1_t[2] ^ w0_t[0] ^ w3_t[2]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w3_t[2]); + w3_t[3] = rotl32 ((w3_t[0] ^ w1_t[3] ^ w0_t[1] ^ w3_t[3]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w3_t[3]); + w0_t[0] = rotl32 ((w3_t[1] ^ w2_t[0] ^ w0_t[2] ^ w0_t[0]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w0_t[0]); + w0_t[1] = rotl32 ((w3_t[2] ^ w2_t[1] ^ w0_t[3] ^ w0_t[1]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w0_t[1]); + w0_t[2] = rotl32 ((w3_t[3] ^ w2_t[2] ^ w1_t[0] ^ w0_t[2]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w0_t[2]); + w0_t[3] = rotl32 ((w0_t[0] ^ w2_t[3] ^ w1_t[1] ^ w0_t[3]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w0_t[3]); + w1_t[0] = rotl32 ((w0_t[1] ^ w3_t[0] ^ w1_t[2] ^ w1_t[0]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1_t[0]); + w1_t[1] = rotl32 ((w0_t[2] ^ w3_t[1] ^ w1_t[3] ^ w1_t[1]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w1_t[1]); + w1_t[2] = rotl32 ((w0_t[3] ^ w3_t[2] ^ w2_t[0] ^ w1_t[2]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w1_t[2]); + w1_t[3] = rotl32 ((w1_t[0] ^ w3_t[3] ^ w2_t[1] ^ w1_t[3]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w1_t[3]); + w2_t[0] = rotl32 ((w1_t[1] ^ w0_t[0] ^ w2_t[2] ^ w2_t[0]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w2_t[0]); + w2_t[1] = rotl32 ((w1_t[2] ^ w0_t[1] ^ w2_t[3] ^ w2_t[1]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w2_t[1]); + w2_t[2] = rotl32 ((w1_t[3] ^ w0_t[2] ^ w3_t[0] ^ w2_t[2]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w2_t[2]); + w2_t[3] = rotl32 ((w2_t[0] ^ w0_t[3] ^ w3_t[1] ^ w2_t[3]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w2_t[3]); + w3_t[0] = rotl32 ((w2_t[1] ^ w1_t[0] ^ w3_t[2] ^ w3_t[0]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w3_t[0]); + w3_t[1] = rotl32 ((w2_t[2] ^ w1_t[1] ^ w3_t[3] ^ w3_t[1]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w3_t[1]); + w3_t[2] = rotl32 ((w2_t[3] ^ w1_t[2] ^ w0_t[0] ^ w3_t[2]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w3_t[2]); + w3_t[3] = rotl32 ((w3_t[0] ^ w1_t[3] ^ w0_t[1] ^ w3_t[3]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w3_t[3]); + + + const u32x r0 = d; + const u32x r1 = e; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_M + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m00130_m08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m00130_m16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m00130_s04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + u32x pw_buf1[4]; + + pw_buf1[0] = pws[gid].i[ 4]; + pw_buf1[1] = pws[gid].i[ 5]; + pw_buf1[2] = pws[gid].i[ 6]; + pw_buf1[3] = pws[gid].i[ 7]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[7]; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * reverse + */ + + const u32 e_rev = rotl32 (search[1], 2u); + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + + w0[0] = pw_buf0[0]; + w0[1] = pw_buf0[1]; + w0[2] = pw_buf0[2]; + w0[3] = pw_buf0[3]; + + u32x w1[4]; + + w1[0] = pw_buf1[0]; + w1[1] = pw_buf1[1]; + w1[2] = pw_buf1[2]; + w1[3] = pw_buf1[3]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 out_len = apply_rules (rules_buf[il_pos].cmds, w0, w1, pw_len); + + /** + * append salt + */ + + u32 s0[4]; + + s0[0] = salt_buf0[0]; + s0[1] = salt_buf0[1]; + s0[2] = salt_buf0[2]; + s0[3] = salt_buf0[3]; + + u32 s1[4]; + + s1[0] = salt_buf1[0]; + s1[1] = salt_buf1[1]; + s1[2] = salt_buf1[2]; + s1[3] = salt_buf1[3]; + + u32 s2[4]; + + s2[0] = 0; + s2[1] = 0; + s2[2] = 0; + s2[3] = 0; + + u32 s3[4]; + + s3[0] = 0; + s3[1] = 0; + s3[2] = 0; + s3[3] = 0; + + switch_buffer_by_offset (s0, s1, s2, s3, (out_len * 2)); + + const u32 out_salt_len = (out_len * 2) + salt_len; + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + make_unicode (w0, w0_t, w1_t); + make_unicode (w1, w2_t, w3_t); + + w0_t[0] |= s0[0]; + w0_t[1] |= s0[1]; + w0_t[2] |= s0[2]; + w0_t[3] |= s0[3]; + w1_t[0] |= s1[0]; + w1_t[1] |= s1[1]; + w1_t[2] |= s1[2]; + w1_t[3] |= s1[3]; + w2_t[0] |= s2[0]; + w2_t[1] |= s2[1]; + w2_t[2] |= s2[2]; + w2_t[3] |= s2[3]; + w3_t[0] |= s3[0]; + w3_t[1] |= s3[1]; + w3_t[2] |= s3[2]; + w3_t[3] |= s3[3]; + + append_0x80_4 (w0_t, w1_t, w2_t, w3_t, out_salt_len); + + w3_t[3] = out_salt_len * 8; + + /** + * sha1 + */ + + w0_t[0] = swap_workaround (w0_t[0]); + w0_t[1] = swap_workaround (w0_t[1]); + w0_t[2] = swap_workaround (w0_t[2]); + w0_t[3] = swap_workaround (w0_t[3]); + w1_t[0] = swap_workaround (w1_t[0]); + w1_t[1] = swap_workaround (w1_t[1]); + w1_t[2] = swap_workaround (w1_t[2]); + w1_t[3] = swap_workaround (w1_t[3]); + w2_t[0] = swap_workaround (w2_t[0]); + w2_t[1] = swap_workaround (w2_t[1]); + w2_t[2] = swap_workaround (w2_t[2]); + w2_t[3] = swap_workaround (w2_t[3]); + w3_t[0] = swap_workaround (w3_t[0]); + w3_t[1] = swap_workaround (w3_t[1]); + //w3_t[2] = swap_workaround (w3_t[2]); + //w3_t[3] = swap_workaround (w3_t[3]); + + u32x a = SHA1M_A; + u32x b = SHA1M_B; + u32x c = SHA1M_C; + u32x d = SHA1M_D; + u32x e = SHA1M_E; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w0_t[0]); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w0_t[1]); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w0_t[2]); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w0_t[3]); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w1_t[0]); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w1_t[1]); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w1_t[2]); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w1_t[3]); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w2_t[0]); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w2_t[1]); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w2_t[2]); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w2_t[3]); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w3_t[0]); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w3_t[1]); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w3_t[2]); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w3_t[3]); + w0_t[0] = rotl32 ((w3_t[1] ^ w2_t[0] ^ w0_t[2] ^ w0_t[0]), 1u); SHA1_STEP (SHA1_F0o, e, a, b, c, d, w0_t[0]); + w0_t[1] = rotl32 ((w3_t[2] ^ w2_t[1] ^ w0_t[3] ^ w0_t[1]), 1u); SHA1_STEP (SHA1_F0o, d, e, a, b, c, w0_t[1]); + w0_t[2] = rotl32 ((w3_t[3] ^ w2_t[2] ^ w1_t[0] ^ w0_t[2]), 1u); SHA1_STEP (SHA1_F0o, c, d, e, a, b, w0_t[2]); + w0_t[3] = rotl32 ((w0_t[0] ^ w2_t[3] ^ w1_t[1] ^ w0_t[3]), 1u); SHA1_STEP (SHA1_F0o, b, c, d, e, a, w0_t[3]); + + #undef K + #define K SHA1C01 + + w1_t[0] = rotl32 ((w0_t[1] ^ w3_t[0] ^ w1_t[2] ^ w1_t[0]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w1_t[0]); + w1_t[1] = rotl32 ((w0_t[2] ^ w3_t[1] ^ w1_t[3] ^ w1_t[1]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w1_t[1]); + w1_t[2] = rotl32 ((w0_t[3] ^ w3_t[2] ^ w2_t[0] ^ w1_t[2]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w1_t[2]); + w1_t[3] = rotl32 ((w1_t[0] ^ w3_t[3] ^ w2_t[1] ^ w1_t[3]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1_t[3]); + w2_t[0] = rotl32 ((w1_t[1] ^ w0_t[0] ^ w2_t[2] ^ w2_t[0]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w2_t[0]); + w2_t[1] = rotl32 ((w1_t[2] ^ w0_t[1] ^ w2_t[3] ^ w2_t[1]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w2_t[1]); + w2_t[2] = rotl32 ((w1_t[3] ^ w0_t[2] ^ w3_t[0] ^ w2_t[2]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w2_t[2]); + w2_t[3] = rotl32 ((w2_t[0] ^ w0_t[3] ^ w3_t[1] ^ w2_t[3]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w2_t[3]); + w3_t[0] = rotl32 ((w2_t[1] ^ w1_t[0] ^ w3_t[2] ^ w3_t[0]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w3_t[0]); + w3_t[1] = rotl32 ((w2_t[2] ^ w1_t[1] ^ w3_t[3] ^ w3_t[1]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w3_t[1]); + w3_t[2] = rotl32 ((w2_t[3] ^ w1_t[2] ^ w0_t[0] ^ w3_t[2]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w3_t[2]); + w3_t[3] = rotl32 ((w3_t[0] ^ w1_t[3] ^ w0_t[1] ^ w3_t[3]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w3_t[3]); + w0_t[0] = rotl32 ((w3_t[1] ^ w2_t[0] ^ w0_t[2] ^ w0_t[0]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w0_t[0]); + w0_t[1] = rotl32 ((w3_t[2] ^ w2_t[1] ^ w0_t[3] ^ w0_t[1]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w0_t[1]); + w0_t[2] = rotl32 ((w3_t[3] ^ w2_t[2] ^ w1_t[0] ^ w0_t[2]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w0_t[2]); + w0_t[3] = rotl32 ((w0_t[0] ^ w2_t[3] ^ w1_t[1] ^ w0_t[3]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w0_t[3]); + w1_t[0] = rotl32 ((w0_t[1] ^ w3_t[0] ^ w1_t[2] ^ w1_t[0]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w1_t[0]); + w1_t[1] = rotl32 ((w0_t[2] ^ w3_t[1] ^ w1_t[3] ^ w1_t[1]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w1_t[1]); + w1_t[2] = rotl32 ((w0_t[3] ^ w3_t[2] ^ w2_t[0] ^ w1_t[2]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1_t[2]); + w1_t[3] = rotl32 ((w1_t[0] ^ w3_t[3] ^ w2_t[1] ^ w1_t[3]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w1_t[3]); + + #undef K + #define K SHA1C02 + + w2_t[0] = rotl32 ((w1_t[1] ^ w0_t[0] ^ w2_t[2] ^ w2_t[0]), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w2_t[0]); + w2_t[1] = rotl32 ((w1_t[2] ^ w0_t[1] ^ w2_t[3] ^ w2_t[1]), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w2_t[1]); + w2_t[2] = rotl32 ((w1_t[3] ^ w0_t[2] ^ w3_t[0] ^ w2_t[2]), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w2_t[2]); + w2_t[3] = rotl32 ((w2_t[0] ^ w0_t[3] ^ w3_t[1] ^ w2_t[3]), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w2_t[3]); + w3_t[0] = rotl32 ((w2_t[1] ^ w1_t[0] ^ w3_t[2] ^ w3_t[0]), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w3_t[0]); + w3_t[1] = rotl32 ((w2_t[2] ^ w1_t[1] ^ w3_t[3] ^ w3_t[1]), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w3_t[1]); + w3_t[2] = rotl32 ((w2_t[3] ^ w1_t[2] ^ w0_t[0] ^ w3_t[2]), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w3_t[2]); + w3_t[3] = rotl32 ((w3_t[0] ^ w1_t[3] ^ w0_t[1] ^ w3_t[3]), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w3_t[3]); + w0_t[0] = rotl32 ((w3_t[1] ^ w2_t[0] ^ w0_t[2] ^ w0_t[0]), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w0_t[0]); + w0_t[1] = rotl32 ((w3_t[2] ^ w2_t[1] ^ w0_t[3] ^ w0_t[1]), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w0_t[1]); + w0_t[2] = rotl32 ((w3_t[3] ^ w2_t[2] ^ w1_t[0] ^ w0_t[2]), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w0_t[2]); + w0_t[3] = rotl32 ((w0_t[0] ^ w2_t[3] ^ w1_t[1] ^ w0_t[3]), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w0_t[3]); + w1_t[0] = rotl32 ((w0_t[1] ^ w3_t[0] ^ w1_t[2] ^ w1_t[0]), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w1_t[0]); + w1_t[1] = rotl32 ((w0_t[2] ^ w3_t[1] ^ w1_t[3] ^ w1_t[1]), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w1_t[1]); + w1_t[2] = rotl32 ((w0_t[3] ^ w3_t[2] ^ w2_t[0] ^ w1_t[2]), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w1_t[2]); + w1_t[3] = rotl32 ((w1_t[0] ^ w3_t[3] ^ w2_t[1] ^ w1_t[3]), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w1_t[3]); + w2_t[0] = rotl32 ((w1_t[1] ^ w0_t[0] ^ w2_t[2] ^ w2_t[0]), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w2_t[0]); + w2_t[1] = rotl32 ((w1_t[2] ^ w0_t[1] ^ w2_t[3] ^ w2_t[1]), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w2_t[1]); + w2_t[2] = rotl32 ((w1_t[3] ^ w0_t[2] ^ w3_t[0] ^ w2_t[2]), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w2_t[2]); + w2_t[3] = rotl32 ((w2_t[0] ^ w0_t[3] ^ w3_t[1] ^ w2_t[3]), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w2_t[3]); + + #undef K + #define K SHA1C03 + + w3_t[0] = rotl32 ((w2_t[1] ^ w1_t[0] ^ w3_t[2] ^ w3_t[0]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w3_t[0]); + w3_t[1] = rotl32 ((w2_t[2] ^ w1_t[1] ^ w3_t[3] ^ w3_t[1]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w3_t[1]); + w3_t[2] = rotl32 ((w2_t[3] ^ w1_t[2] ^ w0_t[0] ^ w3_t[2]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w3_t[2]); + w3_t[3] = rotl32 ((w3_t[0] ^ w1_t[3] ^ w0_t[1] ^ w3_t[3]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w3_t[3]); + w0_t[0] = rotl32 ((w3_t[1] ^ w2_t[0] ^ w0_t[2] ^ w0_t[0]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w0_t[0]); + w0_t[1] = rotl32 ((w3_t[2] ^ w2_t[1] ^ w0_t[3] ^ w0_t[1]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w0_t[1]); + w0_t[2] = rotl32 ((w3_t[3] ^ w2_t[2] ^ w1_t[0] ^ w0_t[2]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w0_t[2]); + w0_t[3] = rotl32 ((w0_t[0] ^ w2_t[3] ^ w1_t[1] ^ w0_t[3]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w0_t[3]); + w1_t[0] = rotl32 ((w0_t[1] ^ w3_t[0] ^ w1_t[2] ^ w1_t[0]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1_t[0]); + w1_t[1] = rotl32 ((w0_t[2] ^ w3_t[1] ^ w1_t[3] ^ w1_t[1]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w1_t[1]); + w1_t[2] = rotl32 ((w0_t[3] ^ w3_t[2] ^ w2_t[0] ^ w1_t[2]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w1_t[2]); + w1_t[3] = rotl32 ((w1_t[0] ^ w3_t[3] ^ w2_t[1] ^ w1_t[3]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w1_t[3]); + w2_t[0] = rotl32 ((w1_t[1] ^ w0_t[0] ^ w2_t[2] ^ w2_t[0]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w2_t[0]); + w2_t[1] = rotl32 ((w1_t[2] ^ w0_t[1] ^ w2_t[3] ^ w2_t[1]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w2_t[1]); + w2_t[2] = rotl32 ((w1_t[3] ^ w0_t[2] ^ w3_t[0] ^ w2_t[2]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w2_t[2]); + w2_t[3] = rotl32 ((w2_t[0] ^ w0_t[3] ^ w3_t[1] ^ w2_t[3]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w2_t[3]); + w3_t[0] = rotl32 ((w2_t[1] ^ w1_t[0] ^ w3_t[2] ^ w3_t[0]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w3_t[0]); + + if (allx (e != e_rev)) continue; + + w3_t[1] = rotl32 ((w2_t[2] ^ w1_t[1] ^ w3_t[3] ^ w3_t[1]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w3_t[1]); + w3_t[2] = rotl32 ((w2_t[3] ^ w1_t[2] ^ w0_t[0] ^ w3_t[2]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w3_t[2]); + w3_t[3] = rotl32 ((w3_t[0] ^ w1_t[3] ^ w0_t[1] ^ w3_t[3]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w3_t[3]); + + + const u32x r0 = d; + const u32x r1 = e; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_S + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m00130_s08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m00130_s16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/amd/m00130_a1.cl b/amd/m00130_a1.cl new file mode 100644 index 0000000000..6d998d2585 --- /dev/null +++ b/amd/m00130_a1.cl @@ -0,0 +1,752 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _SHA1_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW4 +#define VECT_SIZE4 +#endif + +#ifdef VLIW5 +#define VECT_SIZE4 +#endif + +#define DGST_R0 3 +#define DGST_R1 4 +#define DGST_R2 2 +#define DGST_R3 1 + +#include "include/kernel_functions.c" +#include "types_amd.c" +#include "common_amd.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +// no unicode yet + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m00130_m04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, combs_buf[0].pw_len); + } + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[7]; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = combs_buf[il_pos].pw_len; + + const u32 pw_len = pw_l_len + pw_r_len; + + u32 wordr0[4]; + + wordr0[0] = combs_buf[il_pos].i[0]; + wordr0[1] = combs_buf[il_pos].i[1]; + wordr0[2] = combs_buf[il_pos].i[2]; + wordr0[3] = combs_buf[il_pos].i[3]; + + u32 wordr1[4]; + + wordr1[0] = combs_buf[il_pos].i[4]; + wordr1[1] = combs_buf[il_pos].i[5]; + wordr1[2] = combs_buf[il_pos].i[6]; + wordr1[3] = combs_buf[il_pos].i[7]; + + u32 wordr2[4]; + + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + + u32 wordr3[4]; + + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + /** + * append salt + */ + + u32 s0[4]; + + s0[0] = salt_buf0[0]; + s0[1] = salt_buf0[1]; + s0[2] = salt_buf0[2]; + s0[3] = salt_buf0[3]; + + u32 s1[4]; + + s1[0] = salt_buf1[0]; + s1[1] = salt_buf1[1]; + s1[2] = salt_buf1[2]; + s1[3] = salt_buf1[3]; + + u32 s2[4]; + + s2[0] = 0; + s2[1] = 0; + s2[2] = 0; + s2[3] = 0; + + u32 s3[4]; + + s3[0] = 0; + s3[1] = 0; + s3[2] = 0; + s3[3] = 0; + + switch_buffer_by_offset (s0, s1, s2, s3, (pw_len * 2)); + + const u32 pw_salt_len = (pw_len * 2) + salt_len; + + u32x w0[4]; + u32x w1[4]; + u32x w2[4]; + u32x w3[4]; + + w0[0] = wordl0[0] | wordr0[0]; + w0[1] = wordl0[1] | wordr0[1]; + w0[2] = wordl0[2] | wordr0[2]; + w0[3] = wordl0[3] | wordr0[3]; + w1[0] = wordl1[0] | wordr1[0]; + w1[1] = wordl1[1] | wordr1[1]; + w1[2] = wordl1[2] | wordr1[2]; + w1[3] = wordl1[3] | wordr1[3]; + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + make_unicode (w0, w0_t, w1_t); + make_unicode (w1, w2_t, w3_t); + + w0_t[0] |= s0[0]; + w0_t[1] |= s0[1]; + w0_t[2] |= s0[2]; + w0_t[3] |= s0[3]; + w1_t[0] |= s1[0]; + w1_t[1] |= s1[1]; + w1_t[2] |= s1[2]; + w1_t[3] |= s1[3]; + w2_t[0] |= s2[0]; + w2_t[1] |= s2[1]; + w2_t[2] |= s2[2]; + w2_t[3] |= s2[3]; + w3_t[0] |= s3[0]; + w3_t[1] |= s3[1]; + w3_t[2] |= s3[2]; + w3_t[3] |= s3[3]; + + append_0x80_4 (w0_t, w1_t, w2_t, w3_t, pw_salt_len); + + w3_t[3] = pw_salt_len * 8; + + /** + * sha1 + */ + + w0_t[0] = swap_workaround (w0_t[0]); + w0_t[1] = swap_workaround (w0_t[1]); + w0_t[2] = swap_workaround (w0_t[2]); + w0_t[3] = swap_workaround (w0_t[3]); + w1_t[0] = swap_workaround (w1_t[0]); + w1_t[1] = swap_workaround (w1_t[1]); + w1_t[2] = swap_workaround (w1_t[2]); + w1_t[3] = swap_workaround (w1_t[3]); + w2_t[0] = swap_workaround (w2_t[0]); + w2_t[1] = swap_workaround (w2_t[1]); + w2_t[2] = swap_workaround (w2_t[2]); + w2_t[3] = swap_workaround (w2_t[3]); + w3_t[0] = swap_workaround (w3_t[0]); + w3_t[1] = swap_workaround (w3_t[1]); + //w3_t[2] = swap_workaround (w3_t[2]); + //w3_t[3] = swap_workaround (w3_t[3]); + + u32x a = SHA1M_A; + u32x b = SHA1M_B; + u32x c = SHA1M_C; + u32x d = SHA1M_D; + u32x e = SHA1M_E; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w0_t[0]); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w0_t[1]); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w0_t[2]); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w0_t[3]); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w1_t[0]); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w1_t[1]); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w1_t[2]); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w1_t[3]); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w2_t[0]); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w2_t[1]); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w2_t[2]); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w2_t[3]); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w3_t[0]); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w3_t[1]); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w3_t[2]); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w3_t[3]); + w0_t[0] = rotl32 ((w3_t[1] ^ w2_t[0] ^ w0_t[2] ^ w0_t[0]), 1u); SHA1_STEP (SHA1_F0o, e, a, b, c, d, w0_t[0]); + w0_t[1] = rotl32 ((w3_t[2] ^ w2_t[1] ^ w0_t[3] ^ w0_t[1]), 1u); SHA1_STEP (SHA1_F0o, d, e, a, b, c, w0_t[1]); + w0_t[2] = rotl32 ((w3_t[3] ^ w2_t[2] ^ w1_t[0] ^ w0_t[2]), 1u); SHA1_STEP (SHA1_F0o, c, d, e, a, b, w0_t[2]); + w0_t[3] = rotl32 ((w0_t[0] ^ w2_t[3] ^ w1_t[1] ^ w0_t[3]), 1u); SHA1_STEP (SHA1_F0o, b, c, d, e, a, w0_t[3]); + + #undef K + #define K SHA1C01 + + w1_t[0] = rotl32 ((w0_t[1] ^ w3_t[0] ^ w1_t[2] ^ w1_t[0]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w1_t[0]); + w1_t[1] = rotl32 ((w0_t[2] ^ w3_t[1] ^ w1_t[3] ^ w1_t[1]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w1_t[1]); + w1_t[2] = rotl32 ((w0_t[3] ^ w3_t[2] ^ w2_t[0] ^ w1_t[2]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w1_t[2]); + w1_t[3] = rotl32 ((w1_t[0] ^ w3_t[3] ^ w2_t[1] ^ w1_t[3]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1_t[3]); + w2_t[0] = rotl32 ((w1_t[1] ^ w0_t[0] ^ w2_t[2] ^ w2_t[0]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w2_t[0]); + w2_t[1] = rotl32 ((w1_t[2] ^ w0_t[1] ^ w2_t[3] ^ w2_t[1]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w2_t[1]); + w2_t[2] = rotl32 ((w1_t[3] ^ w0_t[2] ^ w3_t[0] ^ w2_t[2]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w2_t[2]); + w2_t[3] = rotl32 ((w2_t[0] ^ w0_t[3] ^ w3_t[1] ^ w2_t[3]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w2_t[3]); + w3_t[0] = rotl32 ((w2_t[1] ^ w1_t[0] ^ w3_t[2] ^ w3_t[0]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w3_t[0]); + w3_t[1] = rotl32 ((w2_t[2] ^ w1_t[1] ^ w3_t[3] ^ w3_t[1]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w3_t[1]); + w3_t[2] = rotl32 ((w2_t[3] ^ w1_t[2] ^ w0_t[0] ^ w3_t[2]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w3_t[2]); + w3_t[3] = rotl32 ((w3_t[0] ^ w1_t[3] ^ w0_t[1] ^ w3_t[3]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w3_t[3]); + w0_t[0] = rotl32 ((w3_t[1] ^ w2_t[0] ^ w0_t[2] ^ w0_t[0]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w0_t[0]); + w0_t[1] = rotl32 ((w3_t[2] ^ w2_t[1] ^ w0_t[3] ^ w0_t[1]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w0_t[1]); + w0_t[2] = rotl32 ((w3_t[3] ^ w2_t[2] ^ w1_t[0] ^ w0_t[2]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w0_t[2]); + w0_t[3] = rotl32 ((w0_t[0] ^ w2_t[3] ^ w1_t[1] ^ w0_t[3]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w0_t[3]); + w1_t[0] = rotl32 ((w0_t[1] ^ w3_t[0] ^ w1_t[2] ^ w1_t[0]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w1_t[0]); + w1_t[1] = rotl32 ((w0_t[2] ^ w3_t[1] ^ w1_t[3] ^ w1_t[1]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w1_t[1]); + w1_t[2] = rotl32 ((w0_t[3] ^ w3_t[2] ^ w2_t[0] ^ w1_t[2]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1_t[2]); + w1_t[3] = rotl32 ((w1_t[0] ^ w3_t[3] ^ w2_t[1] ^ w1_t[3]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w1_t[3]); + + #undef K + #define K SHA1C02 + + w2_t[0] = rotl32 ((w1_t[1] ^ w0_t[0] ^ w2_t[2] ^ w2_t[0]), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w2_t[0]); + w2_t[1] = rotl32 ((w1_t[2] ^ w0_t[1] ^ w2_t[3] ^ w2_t[1]), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w2_t[1]); + w2_t[2] = rotl32 ((w1_t[3] ^ w0_t[2] ^ w3_t[0] ^ w2_t[2]), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w2_t[2]); + w2_t[3] = rotl32 ((w2_t[0] ^ w0_t[3] ^ w3_t[1] ^ w2_t[3]), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w2_t[3]); + w3_t[0] = rotl32 ((w2_t[1] ^ w1_t[0] ^ w3_t[2] ^ w3_t[0]), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w3_t[0]); + w3_t[1] = rotl32 ((w2_t[2] ^ w1_t[1] ^ w3_t[3] ^ w3_t[1]), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w3_t[1]); + w3_t[2] = rotl32 ((w2_t[3] ^ w1_t[2] ^ w0_t[0] ^ w3_t[2]), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w3_t[2]); + w3_t[3] = rotl32 ((w3_t[0] ^ w1_t[3] ^ w0_t[1] ^ w3_t[3]), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w3_t[3]); + w0_t[0] = rotl32 ((w3_t[1] ^ w2_t[0] ^ w0_t[2] ^ w0_t[0]), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w0_t[0]); + w0_t[1] = rotl32 ((w3_t[2] ^ w2_t[1] ^ w0_t[3] ^ w0_t[1]), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w0_t[1]); + w0_t[2] = rotl32 ((w3_t[3] ^ w2_t[2] ^ w1_t[0] ^ w0_t[2]), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w0_t[2]); + w0_t[3] = rotl32 ((w0_t[0] ^ w2_t[3] ^ w1_t[1] ^ w0_t[3]), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w0_t[3]); + w1_t[0] = rotl32 ((w0_t[1] ^ w3_t[0] ^ w1_t[2] ^ w1_t[0]), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w1_t[0]); + w1_t[1] = rotl32 ((w0_t[2] ^ w3_t[1] ^ w1_t[3] ^ w1_t[1]), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w1_t[1]); + w1_t[2] = rotl32 ((w0_t[3] ^ w3_t[2] ^ w2_t[0] ^ w1_t[2]), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w1_t[2]); + w1_t[3] = rotl32 ((w1_t[0] ^ w3_t[3] ^ w2_t[1] ^ w1_t[3]), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w1_t[3]); + w2_t[0] = rotl32 ((w1_t[1] ^ w0_t[0] ^ w2_t[2] ^ w2_t[0]), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w2_t[0]); + w2_t[1] = rotl32 ((w1_t[2] ^ w0_t[1] ^ w2_t[3] ^ w2_t[1]), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w2_t[1]); + w2_t[2] = rotl32 ((w1_t[3] ^ w0_t[2] ^ w3_t[0] ^ w2_t[2]), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w2_t[2]); + w2_t[3] = rotl32 ((w2_t[0] ^ w0_t[3] ^ w3_t[1] ^ w2_t[3]), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w2_t[3]); + + #undef K + #define K SHA1C03 + + w3_t[0] = rotl32 ((w2_t[1] ^ w1_t[0] ^ w3_t[2] ^ w3_t[0]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w3_t[0]); + w3_t[1] = rotl32 ((w2_t[2] ^ w1_t[1] ^ w3_t[3] ^ w3_t[1]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w3_t[1]); + w3_t[2] = rotl32 ((w2_t[3] ^ w1_t[2] ^ w0_t[0] ^ w3_t[2]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w3_t[2]); + w3_t[3] = rotl32 ((w3_t[0] ^ w1_t[3] ^ w0_t[1] ^ w3_t[3]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w3_t[3]); + w0_t[0] = rotl32 ((w3_t[1] ^ w2_t[0] ^ w0_t[2] ^ w0_t[0]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w0_t[0]); + w0_t[1] = rotl32 ((w3_t[2] ^ w2_t[1] ^ w0_t[3] ^ w0_t[1]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w0_t[1]); + w0_t[2] = rotl32 ((w3_t[3] ^ w2_t[2] ^ w1_t[0] ^ w0_t[2]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w0_t[2]); + w0_t[3] = rotl32 ((w0_t[0] ^ w2_t[3] ^ w1_t[1] ^ w0_t[3]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w0_t[3]); + w1_t[0] = rotl32 ((w0_t[1] ^ w3_t[0] ^ w1_t[2] ^ w1_t[0]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1_t[0]); + w1_t[1] = rotl32 ((w0_t[2] ^ w3_t[1] ^ w1_t[3] ^ w1_t[1]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w1_t[1]); + w1_t[2] = rotl32 ((w0_t[3] ^ w3_t[2] ^ w2_t[0] ^ w1_t[2]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w1_t[2]); + w1_t[3] = rotl32 ((w1_t[0] ^ w3_t[3] ^ w2_t[1] ^ w1_t[3]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w1_t[3]); + w2_t[0] = rotl32 ((w1_t[1] ^ w0_t[0] ^ w2_t[2] ^ w2_t[0]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w2_t[0]); + w2_t[1] = rotl32 ((w1_t[2] ^ w0_t[1] ^ w2_t[3] ^ w2_t[1]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w2_t[1]); + w2_t[2] = rotl32 ((w1_t[3] ^ w0_t[2] ^ w3_t[0] ^ w2_t[2]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w2_t[2]); + w2_t[3] = rotl32 ((w2_t[0] ^ w0_t[3] ^ w3_t[1] ^ w2_t[3]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w2_t[3]); + w3_t[0] = rotl32 ((w2_t[1] ^ w1_t[0] ^ w3_t[2] ^ w3_t[0]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w3_t[0]); + w3_t[1] = rotl32 ((w2_t[2] ^ w1_t[1] ^ w3_t[3] ^ w3_t[1]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w3_t[1]); + w3_t[2] = rotl32 ((w2_t[3] ^ w1_t[2] ^ w0_t[0] ^ w3_t[2]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w3_t[2]); + w3_t[3] = rotl32 ((w3_t[0] ^ w1_t[3] ^ w0_t[1] ^ w3_t[3]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w3_t[3]); + + + const u32x r0 = d; + const u32x r1 = e; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_M + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m00130_m08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m00130_m16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m00130_s04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, combs_buf[0].pw_len); + } + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[7]; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * reverse + */ + + const u32 e_rev = rotl32 (search[1], 2u); + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = combs_buf[il_pos].pw_len; + + const u32 pw_len = pw_l_len + pw_r_len; + + u32 wordr0[4]; + + wordr0[0] = combs_buf[il_pos].i[0]; + wordr0[1] = combs_buf[il_pos].i[1]; + wordr0[2] = combs_buf[il_pos].i[2]; + wordr0[3] = combs_buf[il_pos].i[3]; + + u32 wordr1[4]; + + wordr1[0] = combs_buf[il_pos].i[4]; + wordr1[1] = combs_buf[il_pos].i[5]; + wordr1[2] = combs_buf[il_pos].i[6]; + wordr1[3] = combs_buf[il_pos].i[7]; + + u32 wordr2[4]; + + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + + u32 wordr3[4]; + + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + /** + * append salt + */ + + u32 s0[4]; + + s0[0] = salt_buf0[0]; + s0[1] = salt_buf0[1]; + s0[2] = salt_buf0[2]; + s0[3] = salt_buf0[3]; + + u32 s1[4]; + + s1[0] = salt_buf1[0]; + s1[1] = salt_buf1[1]; + s1[2] = salt_buf1[2]; + s1[3] = salt_buf1[3]; + + u32 s2[4]; + + s2[0] = 0; + s2[1] = 0; + s2[2] = 0; + s2[3] = 0; + + u32 s3[4]; + + s3[0] = 0; + s3[1] = 0; + s3[2] = 0; + s3[3] = 0; + + switch_buffer_by_offset (s0, s1, s2, s3, (pw_len * 2)); + + const u32 pw_salt_len = (pw_len * 2) + salt_len; + + u32x w0[4]; + u32x w1[4]; + u32x w2[4]; + u32x w3[4]; + + w0[0] = wordl0[0] | wordr0[0]; + w0[1] = wordl0[1] | wordr0[1]; + w0[2] = wordl0[2] | wordr0[2]; + w0[3] = wordl0[3] | wordr0[3]; + w1[0] = wordl1[0] | wordr1[0]; + w1[1] = wordl1[1] | wordr1[1]; + w1[2] = wordl1[2] | wordr1[2]; + w1[3] = wordl1[3] | wordr1[3]; + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + make_unicode (w0, w0_t, w1_t); + make_unicode (w1, w2_t, w3_t); + + w0_t[0] |= s0[0]; + w0_t[1] |= s0[1]; + w0_t[2] |= s0[2]; + w0_t[3] |= s0[3]; + w1_t[0] |= s1[0]; + w1_t[1] |= s1[1]; + w1_t[2] |= s1[2]; + w1_t[3] |= s1[3]; + w2_t[0] |= s2[0]; + w2_t[1] |= s2[1]; + w2_t[2] |= s2[2]; + w2_t[3] |= s2[3]; + w3_t[0] |= s3[0]; + w3_t[1] |= s3[1]; + w3_t[2] |= s3[2]; + w3_t[3] |= s3[3]; + + append_0x80_4 (w0_t, w1_t, w2_t, w3_t, pw_salt_len); + + w3_t[3] = pw_salt_len * 8; + + /** + * sha1 + */ + + w0_t[0] = swap_workaround (w0_t[0]); + w0_t[1] = swap_workaround (w0_t[1]); + w0_t[2] = swap_workaround (w0_t[2]); + w0_t[3] = swap_workaround (w0_t[3]); + w1_t[0] = swap_workaround (w1_t[0]); + w1_t[1] = swap_workaround (w1_t[1]); + w1_t[2] = swap_workaround (w1_t[2]); + w1_t[3] = swap_workaround (w1_t[3]); + w2_t[0] = swap_workaround (w2_t[0]); + w2_t[1] = swap_workaround (w2_t[1]); + w2_t[2] = swap_workaround (w2_t[2]); + w2_t[3] = swap_workaround (w2_t[3]); + w3_t[0] = swap_workaround (w3_t[0]); + w3_t[1] = swap_workaround (w3_t[1]); + //w3_t[2] = swap_workaround (w3_t[2]); + //w3_t[3] = swap_workaround (w3_t[3]); + + u32x a = SHA1M_A; + u32x b = SHA1M_B; + u32x c = SHA1M_C; + u32x d = SHA1M_D; + u32x e = SHA1M_E; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w0_t[0]); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w0_t[1]); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w0_t[2]); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w0_t[3]); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w1_t[0]); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w1_t[1]); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w1_t[2]); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w1_t[3]); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w2_t[0]); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w2_t[1]); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w2_t[2]); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w2_t[3]); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w3_t[0]); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w3_t[1]); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w3_t[2]); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w3_t[3]); + w0_t[0] = rotl32 ((w3_t[1] ^ w2_t[0] ^ w0_t[2] ^ w0_t[0]), 1u); SHA1_STEP (SHA1_F0o, e, a, b, c, d, w0_t[0]); + w0_t[1] = rotl32 ((w3_t[2] ^ w2_t[1] ^ w0_t[3] ^ w0_t[1]), 1u); SHA1_STEP (SHA1_F0o, d, e, a, b, c, w0_t[1]); + w0_t[2] = rotl32 ((w3_t[3] ^ w2_t[2] ^ w1_t[0] ^ w0_t[2]), 1u); SHA1_STEP (SHA1_F0o, c, d, e, a, b, w0_t[2]); + w0_t[3] = rotl32 ((w0_t[0] ^ w2_t[3] ^ w1_t[1] ^ w0_t[3]), 1u); SHA1_STEP (SHA1_F0o, b, c, d, e, a, w0_t[3]); + + #undef K + #define K SHA1C01 + + w1_t[0] = rotl32 ((w0_t[1] ^ w3_t[0] ^ w1_t[2] ^ w1_t[0]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w1_t[0]); + w1_t[1] = rotl32 ((w0_t[2] ^ w3_t[1] ^ w1_t[3] ^ w1_t[1]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w1_t[1]); + w1_t[2] = rotl32 ((w0_t[3] ^ w3_t[2] ^ w2_t[0] ^ w1_t[2]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w1_t[2]); + w1_t[3] = rotl32 ((w1_t[0] ^ w3_t[3] ^ w2_t[1] ^ w1_t[3]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1_t[3]); + w2_t[0] = rotl32 ((w1_t[1] ^ w0_t[0] ^ w2_t[2] ^ w2_t[0]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w2_t[0]); + w2_t[1] = rotl32 ((w1_t[2] ^ w0_t[1] ^ w2_t[3] ^ w2_t[1]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w2_t[1]); + w2_t[2] = rotl32 ((w1_t[3] ^ w0_t[2] ^ w3_t[0] ^ w2_t[2]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w2_t[2]); + w2_t[3] = rotl32 ((w2_t[0] ^ w0_t[3] ^ w3_t[1] ^ w2_t[3]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w2_t[3]); + w3_t[0] = rotl32 ((w2_t[1] ^ w1_t[0] ^ w3_t[2] ^ w3_t[0]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w3_t[0]); + w3_t[1] = rotl32 ((w2_t[2] ^ w1_t[1] ^ w3_t[3] ^ w3_t[1]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w3_t[1]); + w3_t[2] = rotl32 ((w2_t[3] ^ w1_t[2] ^ w0_t[0] ^ w3_t[2]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w3_t[2]); + w3_t[3] = rotl32 ((w3_t[0] ^ w1_t[3] ^ w0_t[1] ^ w3_t[3]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w3_t[3]); + w0_t[0] = rotl32 ((w3_t[1] ^ w2_t[0] ^ w0_t[2] ^ w0_t[0]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w0_t[0]); + w0_t[1] = rotl32 ((w3_t[2] ^ w2_t[1] ^ w0_t[3] ^ w0_t[1]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w0_t[1]); + w0_t[2] = rotl32 ((w3_t[3] ^ w2_t[2] ^ w1_t[0] ^ w0_t[2]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w0_t[2]); + w0_t[3] = rotl32 ((w0_t[0] ^ w2_t[3] ^ w1_t[1] ^ w0_t[3]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w0_t[3]); + w1_t[0] = rotl32 ((w0_t[1] ^ w3_t[0] ^ w1_t[2] ^ w1_t[0]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w1_t[0]); + w1_t[1] = rotl32 ((w0_t[2] ^ w3_t[1] ^ w1_t[3] ^ w1_t[1]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w1_t[1]); + w1_t[2] = rotl32 ((w0_t[3] ^ w3_t[2] ^ w2_t[0] ^ w1_t[2]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1_t[2]); + w1_t[3] = rotl32 ((w1_t[0] ^ w3_t[3] ^ w2_t[1] ^ w1_t[3]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w1_t[3]); + + #undef K + #define K SHA1C02 + + w2_t[0] = rotl32 ((w1_t[1] ^ w0_t[0] ^ w2_t[2] ^ w2_t[0]), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w2_t[0]); + w2_t[1] = rotl32 ((w1_t[2] ^ w0_t[1] ^ w2_t[3] ^ w2_t[1]), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w2_t[1]); + w2_t[2] = rotl32 ((w1_t[3] ^ w0_t[2] ^ w3_t[0] ^ w2_t[2]), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w2_t[2]); + w2_t[3] = rotl32 ((w2_t[0] ^ w0_t[3] ^ w3_t[1] ^ w2_t[3]), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w2_t[3]); + w3_t[0] = rotl32 ((w2_t[1] ^ w1_t[0] ^ w3_t[2] ^ w3_t[0]), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w3_t[0]); + w3_t[1] = rotl32 ((w2_t[2] ^ w1_t[1] ^ w3_t[3] ^ w3_t[1]), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w3_t[1]); + w3_t[2] = rotl32 ((w2_t[3] ^ w1_t[2] ^ w0_t[0] ^ w3_t[2]), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w3_t[2]); + w3_t[3] = rotl32 ((w3_t[0] ^ w1_t[3] ^ w0_t[1] ^ w3_t[3]), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w3_t[3]); + w0_t[0] = rotl32 ((w3_t[1] ^ w2_t[0] ^ w0_t[2] ^ w0_t[0]), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w0_t[0]); + w0_t[1] = rotl32 ((w3_t[2] ^ w2_t[1] ^ w0_t[3] ^ w0_t[1]), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w0_t[1]); + w0_t[2] = rotl32 ((w3_t[3] ^ w2_t[2] ^ w1_t[0] ^ w0_t[2]), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w0_t[2]); + w0_t[3] = rotl32 ((w0_t[0] ^ w2_t[3] ^ w1_t[1] ^ w0_t[3]), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w0_t[3]); + w1_t[0] = rotl32 ((w0_t[1] ^ w3_t[0] ^ w1_t[2] ^ w1_t[0]), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w1_t[0]); + w1_t[1] = rotl32 ((w0_t[2] ^ w3_t[1] ^ w1_t[3] ^ w1_t[1]), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w1_t[1]); + w1_t[2] = rotl32 ((w0_t[3] ^ w3_t[2] ^ w2_t[0] ^ w1_t[2]), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w1_t[2]); + w1_t[3] = rotl32 ((w1_t[0] ^ w3_t[3] ^ w2_t[1] ^ w1_t[3]), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w1_t[3]); + w2_t[0] = rotl32 ((w1_t[1] ^ w0_t[0] ^ w2_t[2] ^ w2_t[0]), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w2_t[0]); + w2_t[1] = rotl32 ((w1_t[2] ^ w0_t[1] ^ w2_t[3] ^ w2_t[1]), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w2_t[1]); + w2_t[2] = rotl32 ((w1_t[3] ^ w0_t[2] ^ w3_t[0] ^ w2_t[2]), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w2_t[2]); + w2_t[3] = rotl32 ((w2_t[0] ^ w0_t[3] ^ w3_t[1] ^ w2_t[3]), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w2_t[3]); + + #undef K + #define K SHA1C03 + + w3_t[0] = rotl32 ((w2_t[1] ^ w1_t[0] ^ w3_t[2] ^ w3_t[0]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w3_t[0]); + w3_t[1] = rotl32 ((w2_t[2] ^ w1_t[1] ^ w3_t[3] ^ w3_t[1]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w3_t[1]); + w3_t[2] = rotl32 ((w2_t[3] ^ w1_t[2] ^ w0_t[0] ^ w3_t[2]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w3_t[2]); + w3_t[3] = rotl32 ((w3_t[0] ^ w1_t[3] ^ w0_t[1] ^ w3_t[3]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w3_t[3]); + w0_t[0] = rotl32 ((w3_t[1] ^ w2_t[0] ^ w0_t[2] ^ w0_t[0]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w0_t[0]); + w0_t[1] = rotl32 ((w3_t[2] ^ w2_t[1] ^ w0_t[3] ^ w0_t[1]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w0_t[1]); + w0_t[2] = rotl32 ((w3_t[3] ^ w2_t[2] ^ w1_t[0] ^ w0_t[2]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w0_t[2]); + w0_t[3] = rotl32 ((w0_t[0] ^ w2_t[3] ^ w1_t[1] ^ w0_t[3]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w0_t[3]); + w1_t[0] = rotl32 ((w0_t[1] ^ w3_t[0] ^ w1_t[2] ^ w1_t[0]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1_t[0]); + w1_t[1] = rotl32 ((w0_t[2] ^ w3_t[1] ^ w1_t[3] ^ w1_t[1]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w1_t[1]); + w1_t[2] = rotl32 ((w0_t[3] ^ w3_t[2] ^ w2_t[0] ^ w1_t[2]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w1_t[2]); + w1_t[3] = rotl32 ((w1_t[0] ^ w3_t[3] ^ w2_t[1] ^ w1_t[3]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w1_t[3]); + w2_t[0] = rotl32 ((w1_t[1] ^ w0_t[0] ^ w2_t[2] ^ w2_t[0]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w2_t[0]); + w2_t[1] = rotl32 ((w1_t[2] ^ w0_t[1] ^ w2_t[3] ^ w2_t[1]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w2_t[1]); + w2_t[2] = rotl32 ((w1_t[3] ^ w0_t[2] ^ w3_t[0] ^ w2_t[2]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w2_t[2]); + w2_t[3] = rotl32 ((w2_t[0] ^ w0_t[3] ^ w3_t[1] ^ w2_t[3]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w2_t[3]); + w3_t[0] = rotl32 ((w2_t[1] ^ w1_t[0] ^ w3_t[2] ^ w3_t[0]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w3_t[0]); + + if (allx (e != e_rev)) continue; + + w3_t[1] = rotl32 ((w2_t[2] ^ w1_t[1] ^ w3_t[3] ^ w3_t[1]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w3_t[1]); + w3_t[2] = rotl32 ((w2_t[3] ^ w1_t[2] ^ w0_t[0] ^ w3_t[2]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w3_t[2]); + w3_t[3] = rotl32 ((w3_t[0] ^ w1_t[3] ^ w0_t[1] ^ w3_t[3]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w3_t[3]); + + + const u32x r0 = d; + const u32x r1 = e; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_S + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m00130_s08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m00130_s16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/amd/m00130_a3.cl b/amd/m00130_a3.cl new file mode 100644 index 0000000000..d63424cfe8 --- /dev/null +++ b/amd/m00130_a3.cl @@ -0,0 +1,857 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _SHA1_ +#define _SCALAR_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW4 +#define VECT_SIZE4 +#endif + +#ifdef VLIW5 +#define VECT_SIZE4 +#endif + +#define DGST_R0 3 +#define DGST_R1 4 +#define DGST_R2 2 +#define DGST_R3 1 + +#include "include/kernel_functions.c" +#include "types_amd.c" +#include "common_amd.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4_warp.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4_warp.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4_warp.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4_warp.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4_warp.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4_warp.c" +#endif + +static void m00130m (u32 w[16], const u32 pw_len, __global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global u32x * words_buf_r, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset) +{ + /** + * modifier + */ + + const u32 gid = get_global_id (0); + const u32 lid = get_local_id (0); + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[ 1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[ 2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[ 3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[ 4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[ 5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[ 6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[ 7]; + + u32 salt_buf2[4]; + + salt_buf2[0] = salt_bufs[salt_pos].salt_buf[ 8]; + salt_buf2[1] = 0; + salt_buf2[2] = 0; + salt_buf2[3] = 0; + + u32 salt_buf3[4]; + + salt_buf3[0] = 0; + salt_buf3[1] = 0; + salt_buf3[2] = 0; + salt_buf3[3] = 0; + + switch_buffer_by_offset (salt_buf0, salt_buf1, salt_buf2, salt_buf3, pw_len); + + w[ 0] |= swap_workaround (salt_buf0[0]); + w[ 1] |= swap_workaround (salt_buf0[1]); + w[ 2] |= swap_workaround (salt_buf0[2]); + w[ 3] |= swap_workaround (salt_buf0[3]); + w[ 4] |= swap_workaround (salt_buf1[0]); + w[ 5] |= swap_workaround (salt_buf1[1]); + w[ 6] |= swap_workaround (salt_buf1[2]); + w[ 7] |= swap_workaround (salt_buf1[3]); + w[ 8] |= swap_workaround (salt_buf2[0]); + w[ 9] |= swap_workaround (salt_buf2[1]); + w[10] |= swap_workaround (salt_buf2[2]); + w[11] |= swap_workaround (salt_buf2[3]); + w[12] |= swap_workaround (salt_buf3[0]); + w[13] |= swap_workaround (salt_buf3[1]); + w[14] |= swap_workaround (salt_buf3[2]); + w[15] |= swap_workaround (salt_buf3[3]); + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + const u32 pw_salt_len = pw_len + salt_len; + + w[15] = pw_salt_len * 8; + + /** + * base + */ + + const u32 c_16s = rotl32 ((w[13] ^ w[ 8] ^ w[ 2] ), 1u); + const u32 c_17s = rotl32 ((w[14] ^ w[ 9] ^ w[ 3] ^ w[ 1]), 1u); + const u32 c_18s = rotl32 ((w[15] ^ w[10] ^ w[ 4] ^ w[ 2]), 1u); + const u32 c_19s = rotl32 ((c_16s ^ w[11] ^ w[ 5] ^ w[ 3]), 1u); + const u32 c_20s = rotl32 ((c_17s ^ w[12] ^ w[ 6] ^ w[ 4]), 1u); + const u32 c_21s = rotl32 ((c_18s ^ w[13] ^ w[ 7] ^ w[ 5]), 1u); + const u32 c_22s = rotl32 ((c_19s ^ w[14] ^ w[ 8] ^ w[ 6]), 1u); + const u32 c_23s = rotl32 ((c_20s ^ w[15] ^ w[ 9] ^ w[ 7]), 1u); + const u32 c_24s = rotl32 ((c_21s ^ c_16s ^ w[10] ^ w[ 8]), 1u); + const u32 c_25s = rotl32 ((c_22s ^ c_17s ^ w[11] ^ w[ 9]), 1u); + const u32 c_26s = rotl32 ((c_23s ^ c_18s ^ w[12] ^ w[10]), 1u); + const u32 c_27s = rotl32 ((c_24s ^ c_19s ^ w[13] ^ w[11]), 1u); + const u32 c_28s = rotl32 ((c_25s ^ c_20s ^ w[14] ^ w[12]), 1u); + const u32 c_29s = rotl32 ((c_26s ^ c_21s ^ w[15] ^ w[13]), 1u); + const u32 c_30s = rotl32 ((c_27s ^ c_22s ^ c_16s ^ w[14]), 1u); + const u32 c_31s = rotl32 ((c_28s ^ c_23s ^ c_17s ^ w[15]), 1u); + const u32 c_32s = rotl32 ((c_29s ^ c_24s ^ c_18s ^ c_16s), 1u); + const u32 c_33s = rotl32 ((c_30s ^ c_25s ^ c_19s ^ c_17s), 1u); + const u32 c_34s = rotl32 ((c_31s ^ c_26s ^ c_20s ^ c_18s), 1u); + const u32 c_35s = rotl32 ((c_32s ^ c_27s ^ c_21s ^ c_19s), 1u); + const u32 c_36s = rotl32 ((c_33s ^ c_28s ^ c_22s ^ c_20s), 1u); + const u32 c_37s = rotl32 ((c_34s ^ c_29s ^ c_23s ^ c_21s), 1u); + const u32 c_38s = rotl32 ((c_35s ^ c_30s ^ c_24s ^ c_22s), 1u); + const u32 c_39s = rotl32 ((c_36s ^ c_31s ^ c_25s ^ c_23s), 1u); + const u32 c_40s = rotl32 ((c_37s ^ c_32s ^ c_26s ^ c_24s), 1u); + const u32 c_41s = rotl32 ((c_38s ^ c_33s ^ c_27s ^ c_25s), 1u); + const u32 c_42s = rotl32 ((c_39s ^ c_34s ^ c_28s ^ c_26s), 1u); + const u32 c_43s = rotl32 ((c_40s ^ c_35s ^ c_29s ^ c_27s), 1u); + const u32 c_44s = rotl32 ((c_41s ^ c_36s ^ c_30s ^ c_28s), 1u); + const u32 c_45s = rotl32 ((c_42s ^ c_37s ^ c_31s ^ c_29s), 1u); + const u32 c_46s = rotl32 ((c_43s ^ c_38s ^ c_32s ^ c_30s), 1u); + const u32 c_47s = rotl32 ((c_44s ^ c_39s ^ c_33s ^ c_31s), 1u); + const u32 c_48s = rotl32 ((c_45s ^ c_40s ^ c_34s ^ c_32s), 1u); + const u32 c_49s = rotl32 ((c_46s ^ c_41s ^ c_35s ^ c_33s), 1u); + const u32 c_50s = rotl32 ((c_47s ^ c_42s ^ c_36s ^ c_34s), 1u); + const u32 c_51s = rotl32 ((c_48s ^ c_43s ^ c_37s ^ c_35s), 1u); + const u32 c_52s = rotl32 ((c_49s ^ c_44s ^ c_38s ^ c_36s), 1u); + const u32 c_53s = rotl32 ((c_50s ^ c_45s ^ c_39s ^ c_37s), 1u); + const u32 c_54s = rotl32 ((c_51s ^ c_46s ^ c_40s ^ c_38s), 1u); + const u32 c_55s = rotl32 ((c_52s ^ c_47s ^ c_41s ^ c_39s), 1u); + const u32 c_56s = rotl32 ((c_53s ^ c_48s ^ c_42s ^ c_40s), 1u); + const u32 c_57s = rotl32 ((c_54s ^ c_49s ^ c_43s ^ c_41s), 1u); + const u32 c_58s = rotl32 ((c_55s ^ c_50s ^ c_44s ^ c_42s), 1u); + const u32 c_59s = rotl32 ((c_56s ^ c_51s ^ c_45s ^ c_43s), 1u); + const u32 c_60s = rotl32 ((c_57s ^ c_52s ^ c_46s ^ c_44s), 1u); + const u32 c_61s = rotl32 ((c_58s ^ c_53s ^ c_47s ^ c_45s), 1u); + const u32 c_62s = rotl32 ((c_59s ^ c_54s ^ c_48s ^ c_46s), 1u); + const u32 c_63s = rotl32 ((c_60s ^ c_55s ^ c_49s ^ c_47s), 1u); + const u32 c_64s = rotl32 ((c_61s ^ c_56s ^ c_50s ^ c_48s), 1u); + const u32 c_65s = rotl32 ((c_62s ^ c_57s ^ c_51s ^ c_49s), 1u); + const u32 c_66s = rotl32 ((c_63s ^ c_58s ^ c_52s ^ c_50s), 1u); + const u32 c_67s = rotl32 ((c_64s ^ c_59s ^ c_53s ^ c_51s), 1u); + const u32 c_68s = rotl32 ((c_65s ^ c_60s ^ c_54s ^ c_52s), 1u); + const u32 c_69s = rotl32 ((c_66s ^ c_61s ^ c_55s ^ c_53s), 1u); + const u32 c_70s = rotl32 ((c_67s ^ c_62s ^ c_56s ^ c_54s), 1u); + const u32 c_71s = rotl32 ((c_68s ^ c_63s ^ c_57s ^ c_55s), 1u); + const u32 c_72s = rotl32 ((c_69s ^ c_64s ^ c_58s ^ c_56s), 1u); + const u32 c_73s = rotl32 ((c_70s ^ c_65s ^ c_59s ^ c_57s), 1u); + const u32 c_74s = rotl32 ((c_71s ^ c_66s ^ c_60s ^ c_58s), 1u); + const u32 c_75s = rotl32 ((c_72s ^ c_67s ^ c_61s ^ c_59s), 1u); + const u32 c_76s = rotl32 ((c_73s ^ c_68s ^ c_62s ^ c_60s), 1u); + const u32 c_77s = rotl32 ((c_74s ^ c_69s ^ c_63s ^ c_61s), 1u); + const u32 c_78s = rotl32 ((c_75s ^ c_70s ^ c_64s ^ c_62s), 1u); + const u32 c_79s = rotl32 ((c_76s ^ c_71s ^ c_65s ^ c_63s), 1u); + + const u32 c_17sK = c_17s + SHA1C00; + const u32 c_18sK = c_18s + SHA1C00; + const u32 c_20sK = c_20s + SHA1C01; + const u32 c_21sK = c_21s + SHA1C01; + const u32 c_23sK = c_23s + SHA1C01; + const u32 c_26sK = c_26s + SHA1C01; + const u32 c_27sK = c_27s + SHA1C01; + const u32 c_29sK = c_29s + SHA1C01; + const u32 c_33sK = c_33s + SHA1C01; + const u32 c_39sK = c_39s + SHA1C01; + const u32 c_41sK = c_41s + SHA1C02; + const u32 c_45sK = c_45s + SHA1C02; + const u32 c_53sK = c_53s + SHA1C02; + const u32 c_65sK = c_65s + SHA1C03; + const u32 c_69sK = c_69s + SHA1C03; + + /** + * loop + */ + + const u32 bf_loops = ceil ((float) bfs_cnt / VECT_DIV); + + u32x w0l = w[0]; + + for (u32 il_pos = 0; il_pos < bf_loops; il_pos++) + { + const u32x w0r = words_buf_r[il_pos]; + + const u32x w0 = w0l | w0r; + + const u32x w0s01 = rotl32 (w0, 1u); + const u32x w0s02 = rotl32 (w0, 2u); + const u32x w0s03 = rotl32 (w0, 3u); + const u32x w0s04 = rotl32 (w0, 4u); + const u32x w0s05 = rotl32 (w0, 5u); + const u32x w0s06 = rotl32 (w0, 6u); + const u32x w0s07 = rotl32 (w0, 7u); + const u32x w0s08 = rotl32 (w0, 8u); + const u32x w0s09 = rotl32 (w0, 9u); + const u32x w0s10 = rotl32 (w0, 10u); + const u32x w0s11 = rotl32 (w0, 11u); + const u32x w0s12 = rotl32 (w0, 12u); + const u32x w0s13 = rotl32 (w0, 13u); + const u32x w0s14 = rotl32 (w0, 14u); + const u32x w0s15 = rotl32 (w0, 15u); + const u32x w0s16 = rotl32 (w0, 16u); + const u32x w0s17 = rotl32 (w0, 17u); + const u32x w0s18 = rotl32 (w0, 18u); + const u32x w0s19 = rotl32 (w0, 19u); + const u32x w0s20 = rotl32 (w0, 20u); + const u32x w0s21 = rotl32 (w0, 21u); + const u32x w0s22 = rotl32 (w0, 22U); + + const u32x w0s04___w0s06 = w0s04 ^ w0s06; + const u32x w0s04___w0s08 = w0s04 ^ w0s08; + const u32x w0s08___w0s12 = w0s08 ^ w0s12; + const u32x w0s04___w0s06___w0s07 = w0s04___w0s06 ^ w0s07; + + u32x a = SHA1M_A; + u32x b = SHA1M_B; + u32x c = SHA1M_C; + u32x d = SHA1M_D; + u32x e = SHA1M_E; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w0); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w[ 1]); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w[ 2]); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w[ 3]); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w[ 4]); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w[ 5]); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w[ 6]); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w[ 7]); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w[ 8]); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w[ 9]); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w[10]); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w[11]); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w[12]); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w[13]); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w[14]); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w[15]); + + SHA1_STEP (SHA1_F0o, e, a, b, c, d, (c_16s ^ w0s01)); + SHA1_STEPX(SHA1_F0o, d, e, a, b, c, (c_17sK)); + SHA1_STEPX(SHA1_F0o, c, d, e, a, b, (c_18sK)); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, (c_19s ^ w0s02)); + + #undef K + #define K SHA1C01 + + SHA1_STEPX(SHA1_F1 , a, b, c, d, e, (c_20sK)); + SHA1_STEPX(SHA1_F1 , e, a, b, c, d, (c_21sK)); + SHA1_STEP (SHA1_F1 , d, e, a, b, c, (c_22s ^ w0s03)); + SHA1_STEPX(SHA1_F1 , c, d, e, a, b, (c_23sK)); + SHA1_STEP (SHA1_F1 , b, c, d, e, a, (c_24s ^ w0s02)); + SHA1_STEP (SHA1_F1 , a, b, c, d, e, (c_25s ^ w0s04)); + SHA1_STEPX(SHA1_F1 , e, a, b, c, d, (c_26sK)); + SHA1_STEPX(SHA1_F1 , d, e, a, b, c, (c_27sK)); + SHA1_STEP (SHA1_F1 , c, d, e, a, b, (c_28s ^ w0s05)); + SHA1_STEPX(SHA1_F1 , b, c, d, e, a, (c_29sK)); + SHA1_STEP (SHA1_F1 , a, b, c, d, e, (c_30s ^ w0s02 ^ w0s04)); + SHA1_STEP (SHA1_F1 , e, a, b, c, d, (c_31s ^ w0s06)); + SHA1_STEP (SHA1_F1 , d, e, a, b, c, (c_32s ^ w0s02 ^ w0s03)); + SHA1_STEPX(SHA1_F1 , c, d, e, a, b, (c_33sK)); + SHA1_STEP (SHA1_F1 , b, c, d, e, a, (c_34s ^ w0s07)); + SHA1_STEP (SHA1_F1 , a, b, c, d, e, (c_35s ^ w0s04)); + SHA1_STEP (SHA1_F1 , e, a, b, c, d, (c_36s ^ w0s04___w0s06)); + SHA1_STEP (SHA1_F1 , d, e, a, b, c, (c_37s ^ w0s08)); + SHA1_STEP (SHA1_F1 , c, d, e, a, b, (c_38s ^ w0s04)); + SHA1_STEPX(SHA1_F1 , b, c, d, e, a, (c_39sK)); + + #undef K + #define K SHA1C02 + + SHA1_STEP (SHA1_F2o, a, b, c, d, e, (c_40s ^ w0s04 ^ w0s09)); + SHA1_STEPX(SHA1_F2o, e, a, b, c, d, (c_41sK)); + SHA1_STEP (SHA1_F2o, d, e, a, b, c, (c_42s ^ w0s06 ^ w0s08)); + SHA1_STEP (SHA1_F2o, c, d, e, a, b, (c_43s ^ w0s10)); + SHA1_STEP (SHA1_F2o, b, c, d, e, a, (c_44s ^ w0s03 ^ w0s06 ^ w0s07)); + SHA1_STEPX(SHA1_F2o, a, b, c, d, e, (c_45sK)); + SHA1_STEP (SHA1_F2o, e, a, b, c, d, (c_46s ^ w0s04 ^ w0s11)); + SHA1_STEP (SHA1_F2o, d, e, a, b, c, (c_47s ^ w0s04___w0s08)); + SHA1_STEP (SHA1_F2o, c, d, e, a, b, (c_48s ^ w0s03 ^ w0s04___w0s08 ^ w0s05 ^ w0s10)); + SHA1_STEP (SHA1_F2o, b, c, d, e, a, (c_49s ^ w0s12)); + SHA1_STEP (SHA1_F2o, a, b, c, d, e, (c_50s ^ w0s08)); + SHA1_STEP (SHA1_F2o, e, a, b, c, d, (c_51s ^ w0s04___w0s06)); + SHA1_STEP (SHA1_F2o, d, e, a, b, c, (c_52s ^ w0s04___w0s08 ^ w0s13)); + SHA1_STEPX(SHA1_F2o, c, d, e, a, b, (c_53sK)); + SHA1_STEP (SHA1_F2o, b, c, d, e, a, (c_54s ^ w0s07 ^ w0s10 ^ w0s12)); + SHA1_STEP (SHA1_F2o, a, b, c, d, e, (c_55s ^ w0s14)); + SHA1_STEP (SHA1_F2o, e, a, b, c, d, (c_56s ^ w0s04___w0s06___w0s07 ^ w0s10 ^ w0s11)); + SHA1_STEP (SHA1_F2o, d, e, a, b, c, (c_57s ^ w0s08)); + SHA1_STEP (SHA1_F2o, c, d, e, a, b, (c_58s ^ w0s04___w0s08 ^ w0s15)); + SHA1_STEP (SHA1_F2o, b, c, d, e, a, (c_59s ^ w0s08___w0s12)); + + #undef K + #define K SHA1C03 + + SHA1_STEP (SHA1_F1 , a, b, c, d, e, (c_60s ^ w0s04 ^ w0s08___w0s12 ^ w0s07 ^ w0s14)); + SHA1_STEP (SHA1_F1 , e, a, b, c, d, (c_61s ^ w0s16)); + SHA1_STEP (SHA1_F1 , d, e, a, b, c, (c_62s ^ w0s04___w0s06 ^ w0s08___w0s12)); + SHA1_STEP (SHA1_F1 , c, d, e, a, b, (c_63s ^ w0s08)); + SHA1_STEP (SHA1_F1 , b, c, d, e, a, (c_64s ^ w0s04___w0s06___w0s07 ^ w0s08___w0s12 ^ w0s17)); + SHA1_STEPX(SHA1_F1 , a, b, c, d, e, (c_65sK)); + SHA1_STEP (SHA1_F1 , e, a, b, c, d, (c_66s ^ w0s14 ^ w0s16)); + SHA1_STEP (SHA1_F1 , d, e, a, b, c, (c_67s ^ w0s08 ^ w0s18)); + SHA1_STEP (SHA1_F1 , c, d, e, a, b, (c_68s ^ w0s11 ^ w0s14 ^ w0s15)); + SHA1_STEPX(SHA1_F1 , b, c, d, e, a, (c_69sK)); + SHA1_STEP (SHA1_F1 , a, b, c, d, e, (c_70s ^ w0s12 ^ w0s19)); + SHA1_STEP (SHA1_F1 , e, a, b, c, d, (c_71s ^ w0s12 ^ w0s16)); + SHA1_STEP (SHA1_F1 , d, e, a, b, c, (c_72s ^ w0s05 ^ w0s11 ^ w0s12 ^ w0s13 ^ w0s16 ^ w0s18)); + SHA1_STEP (SHA1_F1 , c, d, e, a, b, (c_73s ^ w0s20)); + SHA1_STEP (SHA1_F1 , b, c, d, e, a, (c_74s ^ w0s08 ^ w0s16)); + SHA1_STEP (SHA1_F1 , a, b, c, d, e, (c_75s ^ w0s06 ^ w0s12 ^ w0s14)); + SHA1_STEP (SHA1_F1 , e, a, b, c, d, (c_76s ^ w0s07 ^ w0s08___w0s12 ^ w0s16 ^ w0s21)); + SHA1_STEP (SHA1_F1 , d, e, a, b, c, (c_77s)); + SHA1_STEP (SHA1_F1 , c, d, e, a, b, (c_78s ^ w0s07 ^ w0s08 ^ w0s15 ^ w0s18 ^ w0s20)); + SHA1_STEP (SHA1_F1 , b, c, d, e, a, (c_79s ^ w0s08 ^ w0s22)); + + + const u32x r0 = d; + const u32x r1 = e; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_M + } +} + +static void m00130s (u32 w[16], const u32 pw_len, __global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global u32x * words_buf_r, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset) +{ + /** + * modifier + */ + + const u32 gid = get_global_id (0); + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 c_16s = rotl32 ((w[13] ^ w[ 8] ^ w[ 2] ), 1u); + const u32 c_17s = rotl32 ((w[14] ^ w[ 9] ^ w[ 3] ^ w[ 1]), 1u); + const u32 c_18s = rotl32 ((w[15] ^ w[10] ^ w[ 4] ^ w[ 2]), 1u); + const u32 c_19s = rotl32 ((c_16s ^ w[11] ^ w[ 5] ^ w[ 3]), 1u); + const u32 c_20s = rotl32 ((c_17s ^ w[12] ^ w[ 6] ^ w[ 4]), 1u); + const u32 c_21s = rotl32 ((c_18s ^ w[13] ^ w[ 7] ^ w[ 5]), 1u); + const u32 c_22s = rotl32 ((c_19s ^ w[14] ^ w[ 8] ^ w[ 6]), 1u); + const u32 c_23s = rotl32 ((c_20s ^ w[15] ^ w[ 9] ^ w[ 7]), 1u); + const u32 c_24s = rotl32 ((c_21s ^ c_16s ^ w[10] ^ w[ 8]), 1u); + const u32 c_25s = rotl32 ((c_22s ^ c_17s ^ w[11] ^ w[ 9]), 1u); + const u32 c_26s = rotl32 ((c_23s ^ c_18s ^ w[12] ^ w[10]), 1u); + const u32 c_27s = rotl32 ((c_24s ^ c_19s ^ w[13] ^ w[11]), 1u); + const u32 c_28s = rotl32 ((c_25s ^ c_20s ^ w[14] ^ w[12]), 1u); + const u32 c_29s = rotl32 ((c_26s ^ c_21s ^ w[15] ^ w[13]), 1u); + const u32 c_30s = rotl32 ((c_27s ^ c_22s ^ c_16s ^ w[14]), 1u); + const u32 c_31s = rotl32 ((c_28s ^ c_23s ^ c_17s ^ w[15]), 1u); + const u32 c_32s = rotl32 ((c_29s ^ c_24s ^ c_18s ^ c_16s), 1u); + const u32 c_33s = rotl32 ((c_30s ^ c_25s ^ c_19s ^ c_17s), 1u); + const u32 c_34s = rotl32 ((c_31s ^ c_26s ^ c_20s ^ c_18s), 1u); + const u32 c_35s = rotl32 ((c_32s ^ c_27s ^ c_21s ^ c_19s), 1u); + const u32 c_36s = rotl32 ((c_33s ^ c_28s ^ c_22s ^ c_20s), 1u); + const u32 c_37s = rotl32 ((c_34s ^ c_29s ^ c_23s ^ c_21s), 1u); + const u32 c_38s = rotl32 ((c_35s ^ c_30s ^ c_24s ^ c_22s), 1u); + const u32 c_39s = rotl32 ((c_36s ^ c_31s ^ c_25s ^ c_23s), 1u); + const u32 c_40s = rotl32 ((c_37s ^ c_32s ^ c_26s ^ c_24s), 1u); + const u32 c_41s = rotl32 ((c_38s ^ c_33s ^ c_27s ^ c_25s), 1u); + const u32 c_42s = rotl32 ((c_39s ^ c_34s ^ c_28s ^ c_26s), 1u); + const u32 c_43s = rotl32 ((c_40s ^ c_35s ^ c_29s ^ c_27s), 1u); + const u32 c_44s = rotl32 ((c_41s ^ c_36s ^ c_30s ^ c_28s), 1u); + const u32 c_45s = rotl32 ((c_42s ^ c_37s ^ c_31s ^ c_29s), 1u); + const u32 c_46s = rotl32 ((c_43s ^ c_38s ^ c_32s ^ c_30s), 1u); + const u32 c_47s = rotl32 ((c_44s ^ c_39s ^ c_33s ^ c_31s), 1u); + const u32 c_48s = rotl32 ((c_45s ^ c_40s ^ c_34s ^ c_32s), 1u); + const u32 c_49s = rotl32 ((c_46s ^ c_41s ^ c_35s ^ c_33s), 1u); + const u32 c_50s = rotl32 ((c_47s ^ c_42s ^ c_36s ^ c_34s), 1u); + const u32 c_51s = rotl32 ((c_48s ^ c_43s ^ c_37s ^ c_35s), 1u); + const u32 c_52s = rotl32 ((c_49s ^ c_44s ^ c_38s ^ c_36s), 1u); + const u32 c_53s = rotl32 ((c_50s ^ c_45s ^ c_39s ^ c_37s), 1u); + const u32 c_54s = rotl32 ((c_51s ^ c_46s ^ c_40s ^ c_38s), 1u); + const u32 c_55s = rotl32 ((c_52s ^ c_47s ^ c_41s ^ c_39s), 1u); + const u32 c_56s = rotl32 ((c_53s ^ c_48s ^ c_42s ^ c_40s), 1u); + const u32 c_57s = rotl32 ((c_54s ^ c_49s ^ c_43s ^ c_41s), 1u); + const u32 c_58s = rotl32 ((c_55s ^ c_50s ^ c_44s ^ c_42s), 1u); + const u32 c_59s = rotl32 ((c_56s ^ c_51s ^ c_45s ^ c_43s), 1u); + const u32 c_60s = rotl32 ((c_57s ^ c_52s ^ c_46s ^ c_44s), 1u); + const u32 c_61s = rotl32 ((c_58s ^ c_53s ^ c_47s ^ c_45s), 1u); + const u32 c_62s = rotl32 ((c_59s ^ c_54s ^ c_48s ^ c_46s), 1u); + const u32 c_63s = rotl32 ((c_60s ^ c_55s ^ c_49s ^ c_47s), 1u); + const u32 c_64s = rotl32 ((c_61s ^ c_56s ^ c_50s ^ c_48s), 1u); + const u32 c_65s = rotl32 ((c_62s ^ c_57s ^ c_51s ^ c_49s), 1u); + const u32 c_66s = rotl32 ((c_63s ^ c_58s ^ c_52s ^ c_50s), 1u); + const u32 c_67s = rotl32 ((c_64s ^ c_59s ^ c_53s ^ c_51s), 1u); + const u32 c_68s = rotl32 ((c_65s ^ c_60s ^ c_54s ^ c_52s), 1u); + const u32 c_69s = rotl32 ((c_66s ^ c_61s ^ c_55s ^ c_53s), 1u); + const u32 c_70s = rotl32 ((c_67s ^ c_62s ^ c_56s ^ c_54s), 1u); + const u32 c_71s = rotl32 ((c_68s ^ c_63s ^ c_57s ^ c_55s), 1u); + const u32 c_72s = rotl32 ((c_69s ^ c_64s ^ c_58s ^ c_56s), 1u); + const u32 c_73s = rotl32 ((c_70s ^ c_65s ^ c_59s ^ c_57s), 1u); + const u32 c_74s = rotl32 ((c_71s ^ c_66s ^ c_60s ^ c_58s), 1u); + const u32 c_75s = rotl32 ((c_72s ^ c_67s ^ c_61s ^ c_59s), 1u); + + const u32 c_17sK = c_17s + SHA1C00; + const u32 c_18sK = c_18s + SHA1C00; + const u32 c_20sK = c_20s + SHA1C01; + const u32 c_21sK = c_21s + SHA1C01; + const u32 c_23sK = c_23s + SHA1C01; + const u32 c_26sK = c_26s + SHA1C01; + const u32 c_27sK = c_27s + SHA1C01; + const u32 c_29sK = c_29s + SHA1C01; + const u32 c_33sK = c_33s + SHA1C01; + const u32 c_39sK = c_39s + SHA1C01; + const u32 c_41sK = c_41s + SHA1C02; + const u32 c_45sK = c_45s + SHA1C02; + const u32 c_53sK = c_53s + SHA1C02; + const u32 c_65sK = c_65s + SHA1C03; + const u32 c_69sK = c_69s + SHA1C03; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * reverse + */ + + const u32 e_rev = rotl32 (search[1], 2u) - SHA1C03; + + /** + * loop + */ + + const u32 bf_loops = ceil ((float) bfs_cnt / VECT_DIV); + + u32x w0l = w[0]; + + for (u32 il_pos = 0; il_pos < bf_loops; il_pos++) + { + const u32x w0r = words_buf_r[il_pos]; + + const u32x w0 = w0l | w0r; + + const u32x w0s01 = rotl32 (w0, 1u); + const u32x w0s02 = rotl32 (w0, 2u); + const u32x w0s03 = rotl32 (w0, 3u); + const u32x w0s04 = rotl32 (w0, 4u); + const u32x w0s05 = rotl32 (w0, 5u); + const u32x w0s06 = rotl32 (w0, 6u); + const u32x w0s07 = rotl32 (w0, 7u); + const u32x w0s08 = rotl32 (w0, 8u); + const u32x w0s09 = rotl32 (w0, 9u); + const u32x w0s10 = rotl32 (w0, 10u); + const u32x w0s11 = rotl32 (w0, 11u); + const u32x w0s12 = rotl32 (w0, 12u); + const u32x w0s13 = rotl32 (w0, 13u); + const u32x w0s14 = rotl32 (w0, 14u); + const u32x w0s15 = rotl32 (w0, 15u); + const u32x w0s16 = rotl32 (w0, 16u); + const u32x w0s17 = rotl32 (w0, 17u); + const u32x w0s18 = rotl32 (w0, 18u); + const u32x w0s19 = rotl32 (w0, 19u); + const u32x w0s20 = rotl32 (w0, 20u); + + const u32x w0s04___w0s06 = w0s04 ^ w0s06; + const u32x w0s04___w0s08 = w0s04 ^ w0s08; + const u32x w0s08___w0s12 = w0s08 ^ w0s12; + const u32x w0s04___w0s06___w0s07 = w0s04___w0s06 ^ w0s07; + + u32x a = SHA1M_A; + u32x b = SHA1M_B; + u32x c = SHA1M_C; + u32x d = SHA1M_D; + u32x e = SHA1M_E; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w0); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w[ 1]); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w[ 2]); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w[ 3]); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w[ 4]); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w[ 5]); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w[ 6]); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w[ 7]); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w[ 8]); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w[ 9]); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w[10]); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w[11]); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w[12]); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w[13]); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w[14]); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w[15]); + + SHA1_STEP (SHA1_F0o, e, a, b, c, d, (c_16s ^ w0s01)); + SHA1_STEPX(SHA1_F0o, d, e, a, b, c, (c_17sK)); + SHA1_STEPX(SHA1_F0o, c, d, e, a, b, (c_18sK)); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, (c_19s ^ w0s02)); + + #undef K + #define K SHA1C01 + + SHA1_STEPX(SHA1_F1 , a, b, c, d, e, (c_20sK)); + SHA1_STEPX(SHA1_F1 , e, a, b, c, d, (c_21sK)); + SHA1_STEP (SHA1_F1 , d, e, a, b, c, (c_22s ^ w0s03)); + SHA1_STEPX(SHA1_F1 , c, d, e, a, b, (c_23sK)); + SHA1_STEP (SHA1_F1 , b, c, d, e, a, (c_24s ^ w0s02)); + SHA1_STEP (SHA1_F1 , a, b, c, d, e, (c_25s ^ w0s04)); + SHA1_STEPX(SHA1_F1 , e, a, b, c, d, (c_26sK)); + SHA1_STEPX(SHA1_F1 , d, e, a, b, c, (c_27sK)); + SHA1_STEP (SHA1_F1 , c, d, e, a, b, (c_28s ^ w0s05)); + SHA1_STEPX(SHA1_F1 , b, c, d, e, a, (c_29sK)); + SHA1_STEP (SHA1_F1 , a, b, c, d, e, (c_30s ^ w0s02 ^ w0s04)); + SHA1_STEP (SHA1_F1 , e, a, b, c, d, (c_31s ^ w0s06)); + SHA1_STEP (SHA1_F1 , d, e, a, b, c, (c_32s ^ w0s02 ^ w0s03)); + SHA1_STEPX(SHA1_F1 , c, d, e, a, b, (c_33sK)); + SHA1_STEP (SHA1_F1 , b, c, d, e, a, (c_34s ^ w0s07)); + SHA1_STEP (SHA1_F1 , a, b, c, d, e, (c_35s ^ w0s04)); + SHA1_STEP (SHA1_F1 , e, a, b, c, d, (c_36s ^ w0s04___w0s06)); + SHA1_STEP (SHA1_F1 , d, e, a, b, c, (c_37s ^ w0s08)); + SHA1_STEP (SHA1_F1 , c, d, e, a, b, (c_38s ^ w0s04)); + SHA1_STEPX(SHA1_F1 , b, c, d, e, a, (c_39sK)); + + #undef K + #define K SHA1C02 + + SHA1_STEP (SHA1_F2o, a, b, c, d, e, (c_40s ^ w0s04 ^ w0s09)); + SHA1_STEPX(SHA1_F2o, e, a, b, c, d, (c_41sK)); + SHA1_STEP (SHA1_F2o, d, e, a, b, c, (c_42s ^ w0s06 ^ w0s08)); + SHA1_STEP (SHA1_F2o, c, d, e, a, b, (c_43s ^ w0s10)); + SHA1_STEP (SHA1_F2o, b, c, d, e, a, (c_44s ^ w0s03 ^ w0s06 ^ w0s07)); + SHA1_STEPX(SHA1_F2o, a, b, c, d, e, (c_45sK)); + SHA1_STEP (SHA1_F2o, e, a, b, c, d, (c_46s ^ w0s04 ^ w0s11)); + SHA1_STEP (SHA1_F2o, d, e, a, b, c, (c_47s ^ w0s04___w0s08)); + SHA1_STEP (SHA1_F2o, c, d, e, a, b, (c_48s ^ w0s03 ^ w0s04___w0s08 ^ w0s05 ^ w0s10)); + SHA1_STEP (SHA1_F2o, b, c, d, e, a, (c_49s ^ w0s12)); + SHA1_STEP (SHA1_F2o, a, b, c, d, e, (c_50s ^ w0s08)); + SHA1_STEP (SHA1_F2o, e, a, b, c, d, (c_51s ^ w0s04___w0s06)); + SHA1_STEP (SHA1_F2o, d, e, a, b, c, (c_52s ^ w0s04___w0s08 ^ w0s13)); + SHA1_STEPX(SHA1_F2o, c, d, e, a, b, (c_53sK)); + SHA1_STEP (SHA1_F2o, b, c, d, e, a, (c_54s ^ w0s07 ^ w0s10 ^ w0s12)); + SHA1_STEP (SHA1_F2o, a, b, c, d, e, (c_55s ^ w0s14)); + SHA1_STEP (SHA1_F2o, e, a, b, c, d, (c_56s ^ w0s04___w0s06___w0s07 ^ w0s10 ^ w0s11)); + SHA1_STEP (SHA1_F2o, d, e, a, b, c, (c_57s ^ w0s08)); + SHA1_STEP (SHA1_F2o, c, d, e, a, b, (c_58s ^ w0s04___w0s08 ^ w0s15)); + SHA1_STEP (SHA1_F2o, b, c, d, e, a, (c_59s ^ w0s08___w0s12)); + + #undef K + #define K SHA1C03 + + SHA1_STEP (SHA1_F1 , a, b, c, d, e, (c_60s ^ w0s04 ^ w0s08___w0s12 ^ w0s07 ^ w0s14)); + SHA1_STEP (SHA1_F1 , e, a, b, c, d, (c_61s ^ w0s16)); + SHA1_STEP (SHA1_F1 , d, e, a, b, c, (c_62s ^ w0s04___w0s06 ^ w0s08___w0s12)); + SHA1_STEP (SHA1_F1 , c, d, e, a, b, (c_63s ^ w0s08)); + SHA1_STEP (SHA1_F1 , b, c, d, e, a, (c_64s ^ w0s04___w0s06___w0s07 ^ w0s08___w0s12 ^ w0s17)); + SHA1_STEPX(SHA1_F1 , a, b, c, d, e, (c_65sK)); + SHA1_STEP (SHA1_F1 , e, a, b, c, d, (c_66s ^ w0s14 ^ w0s16)); + SHA1_STEP (SHA1_F1 , d, e, a, b, c, (c_67s ^ w0s08 ^ w0s18)); + SHA1_STEP (SHA1_F1 , c, d, e, a, b, (c_68s ^ w0s11 ^ w0s14 ^ w0s15)); + SHA1_STEPX(SHA1_F1 , b, c, d, e, a, (c_69sK)); + SHA1_STEP (SHA1_F1 , a, b, c, d, e, (c_70s ^ w0s12 ^ w0s19)); + SHA1_STEP (SHA1_F1 , e, a, b, c, d, (c_71s ^ w0s12 ^ w0s16)); + SHA1_STEP (SHA1_F1 , d, e, a, b, c, (c_72s ^ w0s05 ^ w0s11 ^ w0s12 ^ w0s13 ^ w0s16 ^ w0s18)); + SHA1_STEP (SHA1_F1 , c, d, e, a, b, (c_73s ^ w0s20)); + SHA1_STEP (SHA1_F1 , b, c, d, e, a, (c_74s ^ w0s08 ^ w0s16)); + + SHA1_STEP_PE (SHA1_F1, a, b, c, d, e, (c_75s ^ w0s06 ^ w0s12 ^ w0s14)); + + bool q_cond = allx (e_rev != e); + + if (q_cond) continue; + + SHA1_STEP_PB (SHA1_F1, a, b, c, d, e, 0); + + const u32 c_76s = rotl32 ((c_73s ^ c_68s ^ c_62s ^ c_60s), 1u); + const u32 c_77s = rotl32 ((c_74s ^ c_69s ^ c_63s ^ c_61s), 1u); + const u32 c_78s = rotl32 ((c_75s ^ c_70s ^ c_64s ^ c_62s), 1u); + const u32 c_79s = rotl32 ((c_76s ^ c_71s ^ c_65s ^ c_63s), 1u); + + const u32x w0s21 = rotl32 (w0, 21u); + const u32x w0s22 = rotl32 (w0, 22U); + + SHA1_STEP (SHA1_F1 , e, a, b, c, d, (c_76s ^ w0s07 ^ w0s08___w0s12 ^ w0s16 ^ w0s21)); + SHA1_STEP (SHA1_F1 , d, e, a, b, c, (c_77s)); + SHA1_STEP (SHA1_F1 , c, d, e, a, b, (c_78s ^ w0s07 ^ w0s08 ^ w0s15 ^ w0s18 ^ w0s20)); + SHA1_STEP (SHA1_F1 , b, c, d, e, a, (c_79s ^ w0s08 ^ w0s22)); + + + const u32x r0 = d; + const u32x r1 = e; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_S + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m00130_m04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global u32x * words_buf_r, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32 w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = 0; + w[ 5] = 0; + w[ 6] = 0; + w[ 7] = 0; + w[ 8] = 0; + w[ 9] = 0; + w[10] = 0; + w[11] = 0; + w[12] = 0; + w[13] = 0; + w[14] = 0; + w[15] = pws[gid].i[15]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m00130m (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m00130_m08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global u32x * words_buf_r, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32 w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = pws[gid].i[ 4]; + w[ 5] = pws[gid].i[ 5]; + w[ 6] = pws[gid].i[ 6]; + w[ 7] = pws[gid].i[ 7]; + w[ 8] = 0; + w[ 9] = 0; + w[10] = 0; + w[11] = 0; + w[12] = 0; + w[13] = 0; + w[14] = 0; + w[15] = pws[gid].i[15]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m00130m (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m00130_m16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global u32x * words_buf_r, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32 w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = pws[gid].i[ 4]; + w[ 5] = pws[gid].i[ 5]; + w[ 6] = pws[gid].i[ 6]; + w[ 7] = pws[gid].i[ 7]; + w[ 8] = pws[gid].i[ 8]; + w[ 9] = pws[gid].i[ 9]; + w[10] = pws[gid].i[10]; + w[11] = pws[gid].i[11]; + w[12] = pws[gid].i[12]; + w[13] = pws[gid].i[13]; + w[14] = pws[gid].i[14]; + w[15] = pws[gid].i[15]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m00130m (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m00130_s04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global u32x * words_buf_r, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32 w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = 0; + w[ 5] = 0; + w[ 6] = 0; + w[ 7] = 0; + w[ 8] = 0; + w[ 9] = 0; + w[10] = 0; + w[11] = 0; + w[12] = 0; + w[13] = 0; + w[14] = 0; + w[15] = pws[gid].i[15]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m00130s (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m00130_s08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global u32x * words_buf_r, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32 w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = pws[gid].i[ 4]; + w[ 5] = pws[gid].i[ 5]; + w[ 6] = pws[gid].i[ 6]; + w[ 7] = pws[gid].i[ 7]; + w[ 8] = 0; + w[ 9] = 0; + w[10] = 0; + w[11] = 0; + w[12] = 0; + w[13] = 0; + w[14] = 0; + w[15] = pws[gid].i[15]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m00130s (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m00130_s16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global u32x * words_buf_r, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32 w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = pws[gid].i[ 4]; + w[ 5] = pws[gid].i[ 5]; + w[ 6] = pws[gid].i[ 6]; + w[ 7] = pws[gid].i[ 7]; + w[ 8] = pws[gid].i[ 8]; + w[ 9] = pws[gid].i[ 9]; + w[10] = pws[gid].i[10]; + w[11] = pws[gid].i[11]; + w[12] = pws[gid].i[12]; + w[13] = pws[gid].i[13]; + w[14] = pws[gid].i[14]; + w[15] = pws[gid].i[15]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m00130s (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} diff --git a/amd/m00140_a0.cl b/amd/m00140_a0.cl new file mode 100644 index 0000000000..fe1a38d399 --- /dev/null +++ b/amd/m00140_a0.cl @@ -0,0 +1,586 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _SHA1_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW4 +#define VECT_SIZE4 +#endif + +#ifdef VLIW5 +#define VECT_SIZE4 +#endif + +#define DGST_R0 3 +#define DGST_R1 4 +#define DGST_R2 2 +#define DGST_R3 1 + +#include "include/kernel_functions.c" +#include "types_amd.c" +#include "common_amd.c" +#include "include/rp_gpu.h" +#include "rp_amd.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +// no unicode yet + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m00140_m04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + u32x pw_buf1[4]; + + pw_buf1[0] = pws[gid].i[ 4]; + pw_buf1[1] = pws[gid].i[ 5]; + pw_buf1[2] = pws[gid].i[ 6]; + pw_buf1[3] = pws[gid].i[ 7]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[7]; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + + w0[0] = pw_buf0[0]; + w0[1] = pw_buf0[1]; + w0[2] = pw_buf0[2]; + w0[3] = pw_buf0[3]; + + u32x w1[4]; + + w1[0] = pw_buf1[0]; + w1[1] = pw_buf1[1]; + w1[2] = pw_buf1[2]; + w1[3] = pw_buf1[3]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 out_len = apply_rules (rules_buf[il_pos].cmds, w0, w1, pw_len); + + /** + * prepend salt + */ + + const u32 out_salt_len = (out_len * 2) + salt_len; + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + make_unicode (w0, w0_t, w1_t); + make_unicode (w1, w2_t, w3_t); + + switch_buffer_by_offset (w0_t, w1_t, w2_t, w3_t, salt_len); + + w0_t[0] |= salt_buf0[0]; + w0_t[1] |= salt_buf0[1]; + w0_t[2] |= salt_buf0[2]; + w0_t[3] |= salt_buf0[3]; + w1_t[0] |= salt_buf1[0]; + w1_t[1] |= salt_buf1[1]; + w1_t[2] |= salt_buf1[2]; + w1_t[3] |= salt_buf1[3]; + + append_0x80_4 (w0_t, w1_t, w2_t, w3_t, out_salt_len); + + w3_t[3] = out_salt_len * 8; + + /** + * sha1 + */ + + w0_t[0] = swap_workaround (w0_t[0]); + w0_t[1] = swap_workaround (w0_t[1]); + w0_t[2] = swap_workaround (w0_t[2]); + w0_t[3] = swap_workaround (w0_t[3]); + w1_t[0] = swap_workaround (w1_t[0]); + w1_t[1] = swap_workaround (w1_t[1]); + w1_t[2] = swap_workaround (w1_t[2]); + w1_t[3] = swap_workaround (w1_t[3]); + w2_t[0] = swap_workaround (w2_t[0]); + w2_t[1] = swap_workaround (w2_t[1]); + w2_t[2] = swap_workaround (w2_t[2]); + w2_t[3] = swap_workaround (w2_t[3]); + w3_t[0] = swap_workaround (w3_t[0]); + w3_t[1] = swap_workaround (w3_t[1]); + //w3_t[2] = swap_workaround (w3_t[2]); + //w3_t[3] = swap_workaround (w3_t[3]); + + u32x a = SHA1M_A; + u32x b = SHA1M_B; + u32x c = SHA1M_C; + u32x d = SHA1M_D; + u32x e = SHA1M_E; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w0_t[0]); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w0_t[1]); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w0_t[2]); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w0_t[3]); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w1_t[0]); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w1_t[1]); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w1_t[2]); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w1_t[3]); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w2_t[0]); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w2_t[1]); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w2_t[2]); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w2_t[3]); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w3_t[0]); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w3_t[1]); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w3_t[2]); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w3_t[3]); + w0_t[0] = rotl32 ((w3_t[1] ^ w2_t[0] ^ w0_t[2] ^ w0_t[0]), 1u); SHA1_STEP (SHA1_F0o, e, a, b, c, d, w0_t[0]); + w0_t[1] = rotl32 ((w3_t[2] ^ w2_t[1] ^ w0_t[3] ^ w0_t[1]), 1u); SHA1_STEP (SHA1_F0o, d, e, a, b, c, w0_t[1]); + w0_t[2] = rotl32 ((w3_t[3] ^ w2_t[2] ^ w1_t[0] ^ w0_t[2]), 1u); SHA1_STEP (SHA1_F0o, c, d, e, a, b, w0_t[2]); + w0_t[3] = rotl32 ((w0_t[0] ^ w2_t[3] ^ w1_t[1] ^ w0_t[3]), 1u); SHA1_STEP (SHA1_F0o, b, c, d, e, a, w0_t[3]); + + #undef K + #define K SHA1C01 + + w1_t[0] = rotl32 ((w0_t[1] ^ w3_t[0] ^ w1_t[2] ^ w1_t[0]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w1_t[0]); + w1_t[1] = rotl32 ((w0_t[2] ^ w3_t[1] ^ w1_t[3] ^ w1_t[1]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w1_t[1]); + w1_t[2] = rotl32 ((w0_t[3] ^ w3_t[2] ^ w2_t[0] ^ w1_t[2]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w1_t[2]); + w1_t[3] = rotl32 ((w1_t[0] ^ w3_t[3] ^ w2_t[1] ^ w1_t[3]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1_t[3]); + w2_t[0] = rotl32 ((w1_t[1] ^ w0_t[0] ^ w2_t[2] ^ w2_t[0]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w2_t[0]); + w2_t[1] = rotl32 ((w1_t[2] ^ w0_t[1] ^ w2_t[3] ^ w2_t[1]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w2_t[1]); + w2_t[2] = rotl32 ((w1_t[3] ^ w0_t[2] ^ w3_t[0] ^ w2_t[2]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w2_t[2]); + w2_t[3] = rotl32 ((w2_t[0] ^ w0_t[3] ^ w3_t[1] ^ w2_t[3]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w2_t[3]); + w3_t[0] = rotl32 ((w2_t[1] ^ w1_t[0] ^ w3_t[2] ^ w3_t[0]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w3_t[0]); + w3_t[1] = rotl32 ((w2_t[2] ^ w1_t[1] ^ w3_t[3] ^ w3_t[1]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w3_t[1]); + w3_t[2] = rotl32 ((w2_t[3] ^ w1_t[2] ^ w0_t[0] ^ w3_t[2]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w3_t[2]); + w3_t[3] = rotl32 ((w3_t[0] ^ w1_t[3] ^ w0_t[1] ^ w3_t[3]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w3_t[3]); + w0_t[0] = rotl32 ((w3_t[1] ^ w2_t[0] ^ w0_t[2] ^ w0_t[0]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w0_t[0]); + w0_t[1] = rotl32 ((w3_t[2] ^ w2_t[1] ^ w0_t[3] ^ w0_t[1]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w0_t[1]); + w0_t[2] = rotl32 ((w3_t[3] ^ w2_t[2] ^ w1_t[0] ^ w0_t[2]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w0_t[2]); + w0_t[3] = rotl32 ((w0_t[0] ^ w2_t[3] ^ w1_t[1] ^ w0_t[3]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w0_t[3]); + w1_t[0] = rotl32 ((w0_t[1] ^ w3_t[0] ^ w1_t[2] ^ w1_t[0]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w1_t[0]); + w1_t[1] = rotl32 ((w0_t[2] ^ w3_t[1] ^ w1_t[3] ^ w1_t[1]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w1_t[1]); + w1_t[2] = rotl32 ((w0_t[3] ^ w3_t[2] ^ w2_t[0] ^ w1_t[2]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1_t[2]); + w1_t[3] = rotl32 ((w1_t[0] ^ w3_t[3] ^ w2_t[1] ^ w1_t[3]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w1_t[3]); + + #undef K + #define K SHA1C02 + + w2_t[0] = rotl32 ((w1_t[1] ^ w0_t[0] ^ w2_t[2] ^ w2_t[0]), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w2_t[0]); + w2_t[1] = rotl32 ((w1_t[2] ^ w0_t[1] ^ w2_t[3] ^ w2_t[1]), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w2_t[1]); + w2_t[2] = rotl32 ((w1_t[3] ^ w0_t[2] ^ w3_t[0] ^ w2_t[2]), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w2_t[2]); + w2_t[3] = rotl32 ((w2_t[0] ^ w0_t[3] ^ w3_t[1] ^ w2_t[3]), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w2_t[3]); + w3_t[0] = rotl32 ((w2_t[1] ^ w1_t[0] ^ w3_t[2] ^ w3_t[0]), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w3_t[0]); + w3_t[1] = rotl32 ((w2_t[2] ^ w1_t[1] ^ w3_t[3] ^ w3_t[1]), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w3_t[1]); + w3_t[2] = rotl32 ((w2_t[3] ^ w1_t[2] ^ w0_t[0] ^ w3_t[2]), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w3_t[2]); + w3_t[3] = rotl32 ((w3_t[0] ^ w1_t[3] ^ w0_t[1] ^ w3_t[3]), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w3_t[3]); + w0_t[0] = rotl32 ((w3_t[1] ^ w2_t[0] ^ w0_t[2] ^ w0_t[0]), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w0_t[0]); + w0_t[1] = rotl32 ((w3_t[2] ^ w2_t[1] ^ w0_t[3] ^ w0_t[1]), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w0_t[1]); + w0_t[2] = rotl32 ((w3_t[3] ^ w2_t[2] ^ w1_t[0] ^ w0_t[2]), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w0_t[2]); + w0_t[3] = rotl32 ((w0_t[0] ^ w2_t[3] ^ w1_t[1] ^ w0_t[3]), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w0_t[3]); + w1_t[0] = rotl32 ((w0_t[1] ^ w3_t[0] ^ w1_t[2] ^ w1_t[0]), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w1_t[0]); + w1_t[1] = rotl32 ((w0_t[2] ^ w3_t[1] ^ w1_t[3] ^ w1_t[1]), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w1_t[1]); + w1_t[2] = rotl32 ((w0_t[3] ^ w3_t[2] ^ w2_t[0] ^ w1_t[2]), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w1_t[2]); + w1_t[3] = rotl32 ((w1_t[0] ^ w3_t[3] ^ w2_t[1] ^ w1_t[3]), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w1_t[3]); + w2_t[0] = rotl32 ((w1_t[1] ^ w0_t[0] ^ w2_t[2] ^ w2_t[0]), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w2_t[0]); + w2_t[1] = rotl32 ((w1_t[2] ^ w0_t[1] ^ w2_t[3] ^ w2_t[1]), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w2_t[1]); + w2_t[2] = rotl32 ((w1_t[3] ^ w0_t[2] ^ w3_t[0] ^ w2_t[2]), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w2_t[2]); + w2_t[3] = rotl32 ((w2_t[0] ^ w0_t[3] ^ w3_t[1] ^ w2_t[3]), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w2_t[3]); + + #undef K + #define K SHA1C03 + + w3_t[0] = rotl32 ((w2_t[1] ^ w1_t[0] ^ w3_t[2] ^ w3_t[0]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w3_t[0]); + w3_t[1] = rotl32 ((w2_t[2] ^ w1_t[1] ^ w3_t[3] ^ w3_t[1]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w3_t[1]); + w3_t[2] = rotl32 ((w2_t[3] ^ w1_t[2] ^ w0_t[0] ^ w3_t[2]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w3_t[2]); + w3_t[3] = rotl32 ((w3_t[0] ^ w1_t[3] ^ w0_t[1] ^ w3_t[3]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w3_t[3]); + w0_t[0] = rotl32 ((w3_t[1] ^ w2_t[0] ^ w0_t[2] ^ w0_t[0]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w0_t[0]); + w0_t[1] = rotl32 ((w3_t[2] ^ w2_t[1] ^ w0_t[3] ^ w0_t[1]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w0_t[1]); + w0_t[2] = rotl32 ((w3_t[3] ^ w2_t[2] ^ w1_t[0] ^ w0_t[2]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w0_t[2]); + w0_t[3] = rotl32 ((w0_t[0] ^ w2_t[3] ^ w1_t[1] ^ w0_t[3]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w0_t[3]); + w1_t[0] = rotl32 ((w0_t[1] ^ w3_t[0] ^ w1_t[2] ^ w1_t[0]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1_t[0]); + w1_t[1] = rotl32 ((w0_t[2] ^ w3_t[1] ^ w1_t[3] ^ w1_t[1]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w1_t[1]); + w1_t[2] = rotl32 ((w0_t[3] ^ w3_t[2] ^ w2_t[0] ^ w1_t[2]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w1_t[2]); + w1_t[3] = rotl32 ((w1_t[0] ^ w3_t[3] ^ w2_t[1] ^ w1_t[3]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w1_t[3]); + w2_t[0] = rotl32 ((w1_t[1] ^ w0_t[0] ^ w2_t[2] ^ w2_t[0]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w2_t[0]); + w2_t[1] = rotl32 ((w1_t[2] ^ w0_t[1] ^ w2_t[3] ^ w2_t[1]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w2_t[1]); + w2_t[2] = rotl32 ((w1_t[3] ^ w0_t[2] ^ w3_t[0] ^ w2_t[2]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w2_t[2]); + w2_t[3] = rotl32 ((w2_t[0] ^ w0_t[3] ^ w3_t[1] ^ w2_t[3]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w2_t[3]); + w3_t[0] = rotl32 ((w2_t[1] ^ w1_t[0] ^ w3_t[2] ^ w3_t[0]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w3_t[0]); + w3_t[1] = rotl32 ((w2_t[2] ^ w1_t[1] ^ w3_t[3] ^ w3_t[1]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w3_t[1]); + w3_t[2] = rotl32 ((w2_t[3] ^ w1_t[2] ^ w0_t[0] ^ w3_t[2]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w3_t[2]); + w3_t[3] = rotl32 ((w3_t[0] ^ w1_t[3] ^ w0_t[1] ^ w3_t[3]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w3_t[3]); + + + const u32x r0 = d; + const u32x r1 = e; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_M + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m00140_m08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m00140_m16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m00140_s04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + u32x pw_buf1[4]; + + pw_buf1[0] = pws[gid].i[ 4]; + pw_buf1[1] = pws[gid].i[ 5]; + pw_buf1[2] = pws[gid].i[ 6]; + pw_buf1[3] = pws[gid].i[ 7]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[7]; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * reverse + */ + + const u32 e_rev = rotl32 (search[1], 2u); + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + + w0[0] = pw_buf0[0]; + w0[1] = pw_buf0[1]; + w0[2] = pw_buf0[2]; + w0[3] = pw_buf0[3]; + + u32x w1[4]; + + w1[0] = pw_buf1[0]; + w1[1] = pw_buf1[1]; + w1[2] = pw_buf1[2]; + w1[3] = pw_buf1[3]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 out_len = apply_rules (rules_buf[il_pos].cmds, w0, w1, pw_len); + + /** + * prepend salt + */ + + const u32 out_salt_len = (out_len * 2) + salt_len; + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + make_unicode (w0, w0_t, w1_t); + make_unicode (w1, w2_t, w3_t); + + switch_buffer_by_offset (w0_t, w1_t, w2_t, w3_t, salt_len); + + w0_t[0] |= salt_buf0[0]; + w0_t[1] |= salt_buf0[1]; + w0_t[2] |= salt_buf0[2]; + w0_t[3] |= salt_buf0[3]; + w1_t[0] |= salt_buf1[0]; + w1_t[1] |= salt_buf1[1]; + w1_t[2] |= salt_buf1[2]; + w1_t[3] |= salt_buf1[3]; + + append_0x80_4 (w0_t, w1_t, w2_t, w3_t, out_salt_len); + + w3_t[3] = out_salt_len * 8; + + /** + * sha1 + */ + + w0_t[0] = swap_workaround (w0_t[0]); + w0_t[1] = swap_workaround (w0_t[1]); + w0_t[2] = swap_workaround (w0_t[2]); + w0_t[3] = swap_workaround (w0_t[3]); + w1_t[0] = swap_workaround (w1_t[0]); + w1_t[1] = swap_workaround (w1_t[1]); + w1_t[2] = swap_workaround (w1_t[2]); + w1_t[3] = swap_workaround (w1_t[3]); + w2_t[0] = swap_workaround (w2_t[0]); + w2_t[1] = swap_workaround (w2_t[1]); + w2_t[2] = swap_workaround (w2_t[2]); + w2_t[3] = swap_workaround (w2_t[3]); + w3_t[0] = swap_workaround (w3_t[0]); + w3_t[1] = swap_workaround (w3_t[1]); + //w3_t[2] = swap_workaround (w3_t[2]); + //w3_t[3] = swap_workaround (w3_t[3]); + + u32x a = SHA1M_A; + u32x b = SHA1M_B; + u32x c = SHA1M_C; + u32x d = SHA1M_D; + u32x e = SHA1M_E; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w0_t[0]); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w0_t[1]); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w0_t[2]); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w0_t[3]); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w1_t[0]); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w1_t[1]); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w1_t[2]); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w1_t[3]); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w2_t[0]); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w2_t[1]); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w2_t[2]); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w2_t[3]); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w3_t[0]); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w3_t[1]); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w3_t[2]); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w3_t[3]); + w0_t[0] = rotl32 ((w3_t[1] ^ w2_t[0] ^ w0_t[2] ^ w0_t[0]), 1u); SHA1_STEP (SHA1_F0o, e, a, b, c, d, w0_t[0]); + w0_t[1] = rotl32 ((w3_t[2] ^ w2_t[1] ^ w0_t[3] ^ w0_t[1]), 1u); SHA1_STEP (SHA1_F0o, d, e, a, b, c, w0_t[1]); + w0_t[2] = rotl32 ((w3_t[3] ^ w2_t[2] ^ w1_t[0] ^ w0_t[2]), 1u); SHA1_STEP (SHA1_F0o, c, d, e, a, b, w0_t[2]); + w0_t[3] = rotl32 ((w0_t[0] ^ w2_t[3] ^ w1_t[1] ^ w0_t[3]), 1u); SHA1_STEP (SHA1_F0o, b, c, d, e, a, w0_t[3]); + + #undef K + #define K SHA1C01 + + w1_t[0] = rotl32 ((w0_t[1] ^ w3_t[0] ^ w1_t[2] ^ w1_t[0]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w1_t[0]); + w1_t[1] = rotl32 ((w0_t[2] ^ w3_t[1] ^ w1_t[3] ^ w1_t[1]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w1_t[1]); + w1_t[2] = rotl32 ((w0_t[3] ^ w3_t[2] ^ w2_t[0] ^ w1_t[2]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w1_t[2]); + w1_t[3] = rotl32 ((w1_t[0] ^ w3_t[3] ^ w2_t[1] ^ w1_t[3]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1_t[3]); + w2_t[0] = rotl32 ((w1_t[1] ^ w0_t[0] ^ w2_t[2] ^ w2_t[0]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w2_t[0]); + w2_t[1] = rotl32 ((w1_t[2] ^ w0_t[1] ^ w2_t[3] ^ w2_t[1]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w2_t[1]); + w2_t[2] = rotl32 ((w1_t[3] ^ w0_t[2] ^ w3_t[0] ^ w2_t[2]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w2_t[2]); + w2_t[3] = rotl32 ((w2_t[0] ^ w0_t[3] ^ w3_t[1] ^ w2_t[3]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w2_t[3]); + w3_t[0] = rotl32 ((w2_t[1] ^ w1_t[0] ^ w3_t[2] ^ w3_t[0]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w3_t[0]); + w3_t[1] = rotl32 ((w2_t[2] ^ w1_t[1] ^ w3_t[3] ^ w3_t[1]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w3_t[1]); + w3_t[2] = rotl32 ((w2_t[3] ^ w1_t[2] ^ w0_t[0] ^ w3_t[2]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w3_t[2]); + w3_t[3] = rotl32 ((w3_t[0] ^ w1_t[3] ^ w0_t[1] ^ w3_t[3]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w3_t[3]); + w0_t[0] = rotl32 ((w3_t[1] ^ w2_t[0] ^ w0_t[2] ^ w0_t[0]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w0_t[0]); + w0_t[1] = rotl32 ((w3_t[2] ^ w2_t[1] ^ w0_t[3] ^ w0_t[1]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w0_t[1]); + w0_t[2] = rotl32 ((w3_t[3] ^ w2_t[2] ^ w1_t[0] ^ w0_t[2]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w0_t[2]); + w0_t[3] = rotl32 ((w0_t[0] ^ w2_t[3] ^ w1_t[1] ^ w0_t[3]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w0_t[3]); + w1_t[0] = rotl32 ((w0_t[1] ^ w3_t[0] ^ w1_t[2] ^ w1_t[0]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w1_t[0]); + w1_t[1] = rotl32 ((w0_t[2] ^ w3_t[1] ^ w1_t[3] ^ w1_t[1]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w1_t[1]); + w1_t[2] = rotl32 ((w0_t[3] ^ w3_t[2] ^ w2_t[0] ^ w1_t[2]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1_t[2]); + w1_t[3] = rotl32 ((w1_t[0] ^ w3_t[3] ^ w2_t[1] ^ w1_t[3]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w1_t[3]); + + #undef K + #define K SHA1C02 + + w2_t[0] = rotl32 ((w1_t[1] ^ w0_t[0] ^ w2_t[2] ^ w2_t[0]), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w2_t[0]); + w2_t[1] = rotl32 ((w1_t[2] ^ w0_t[1] ^ w2_t[3] ^ w2_t[1]), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w2_t[1]); + w2_t[2] = rotl32 ((w1_t[3] ^ w0_t[2] ^ w3_t[0] ^ w2_t[2]), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w2_t[2]); + w2_t[3] = rotl32 ((w2_t[0] ^ w0_t[3] ^ w3_t[1] ^ w2_t[3]), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w2_t[3]); + w3_t[0] = rotl32 ((w2_t[1] ^ w1_t[0] ^ w3_t[2] ^ w3_t[0]), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w3_t[0]); + w3_t[1] = rotl32 ((w2_t[2] ^ w1_t[1] ^ w3_t[3] ^ w3_t[1]), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w3_t[1]); + w3_t[2] = rotl32 ((w2_t[3] ^ w1_t[2] ^ w0_t[0] ^ w3_t[2]), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w3_t[2]); + w3_t[3] = rotl32 ((w3_t[0] ^ w1_t[3] ^ w0_t[1] ^ w3_t[3]), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w3_t[3]); + w0_t[0] = rotl32 ((w3_t[1] ^ w2_t[0] ^ w0_t[2] ^ w0_t[0]), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w0_t[0]); + w0_t[1] = rotl32 ((w3_t[2] ^ w2_t[1] ^ w0_t[3] ^ w0_t[1]), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w0_t[1]); + w0_t[2] = rotl32 ((w3_t[3] ^ w2_t[2] ^ w1_t[0] ^ w0_t[2]), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w0_t[2]); + w0_t[3] = rotl32 ((w0_t[0] ^ w2_t[3] ^ w1_t[1] ^ w0_t[3]), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w0_t[3]); + w1_t[0] = rotl32 ((w0_t[1] ^ w3_t[0] ^ w1_t[2] ^ w1_t[0]), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w1_t[0]); + w1_t[1] = rotl32 ((w0_t[2] ^ w3_t[1] ^ w1_t[3] ^ w1_t[1]), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w1_t[1]); + w1_t[2] = rotl32 ((w0_t[3] ^ w3_t[2] ^ w2_t[0] ^ w1_t[2]), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w1_t[2]); + w1_t[3] = rotl32 ((w1_t[0] ^ w3_t[3] ^ w2_t[1] ^ w1_t[3]), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w1_t[3]); + w2_t[0] = rotl32 ((w1_t[1] ^ w0_t[0] ^ w2_t[2] ^ w2_t[0]), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w2_t[0]); + w2_t[1] = rotl32 ((w1_t[2] ^ w0_t[1] ^ w2_t[3] ^ w2_t[1]), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w2_t[1]); + w2_t[2] = rotl32 ((w1_t[3] ^ w0_t[2] ^ w3_t[0] ^ w2_t[2]), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w2_t[2]); + w2_t[3] = rotl32 ((w2_t[0] ^ w0_t[3] ^ w3_t[1] ^ w2_t[3]), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w2_t[3]); + + #undef K + #define K SHA1C03 + + w3_t[0] = rotl32 ((w2_t[1] ^ w1_t[0] ^ w3_t[2] ^ w3_t[0]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w3_t[0]); + w3_t[1] = rotl32 ((w2_t[2] ^ w1_t[1] ^ w3_t[3] ^ w3_t[1]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w3_t[1]); + w3_t[2] = rotl32 ((w2_t[3] ^ w1_t[2] ^ w0_t[0] ^ w3_t[2]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w3_t[2]); + w3_t[3] = rotl32 ((w3_t[0] ^ w1_t[3] ^ w0_t[1] ^ w3_t[3]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w3_t[3]); + w0_t[0] = rotl32 ((w3_t[1] ^ w2_t[0] ^ w0_t[2] ^ w0_t[0]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w0_t[0]); + w0_t[1] = rotl32 ((w3_t[2] ^ w2_t[1] ^ w0_t[3] ^ w0_t[1]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w0_t[1]); + w0_t[2] = rotl32 ((w3_t[3] ^ w2_t[2] ^ w1_t[0] ^ w0_t[2]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w0_t[2]); + w0_t[3] = rotl32 ((w0_t[0] ^ w2_t[3] ^ w1_t[1] ^ w0_t[3]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w0_t[3]); + w1_t[0] = rotl32 ((w0_t[1] ^ w3_t[0] ^ w1_t[2] ^ w1_t[0]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1_t[0]); + w1_t[1] = rotl32 ((w0_t[2] ^ w3_t[1] ^ w1_t[3] ^ w1_t[1]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w1_t[1]); + w1_t[2] = rotl32 ((w0_t[3] ^ w3_t[2] ^ w2_t[0] ^ w1_t[2]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w1_t[2]); + w1_t[3] = rotl32 ((w1_t[0] ^ w3_t[3] ^ w2_t[1] ^ w1_t[3]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w1_t[3]); + w2_t[0] = rotl32 ((w1_t[1] ^ w0_t[0] ^ w2_t[2] ^ w2_t[0]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w2_t[0]); + w2_t[1] = rotl32 ((w1_t[2] ^ w0_t[1] ^ w2_t[3] ^ w2_t[1]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w2_t[1]); + w2_t[2] = rotl32 ((w1_t[3] ^ w0_t[2] ^ w3_t[0] ^ w2_t[2]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w2_t[2]); + w2_t[3] = rotl32 ((w2_t[0] ^ w0_t[3] ^ w3_t[1] ^ w2_t[3]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w2_t[3]); + w3_t[0] = rotl32 ((w2_t[1] ^ w1_t[0] ^ w3_t[2] ^ w3_t[0]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w3_t[0]); + + if (allx (e != e_rev)) continue; + + w3_t[1] = rotl32 ((w2_t[2] ^ w1_t[1] ^ w3_t[3] ^ w3_t[1]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w3_t[1]); + w3_t[2] = rotl32 ((w2_t[3] ^ w1_t[2] ^ w0_t[0] ^ w3_t[2]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w3_t[2]); + w3_t[3] = rotl32 ((w3_t[0] ^ w1_t[3] ^ w0_t[1] ^ w3_t[3]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w3_t[3]); + + + const u32x r0 = d; + const u32x r1 = e; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_S + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m00140_s08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m00140_s16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/amd/m00140_a1.cl b/amd/m00140_a1.cl new file mode 100644 index 0000000000..68518fac01 --- /dev/null +++ b/amd/m00140_a1.cl @@ -0,0 +1,680 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _SHA1_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW4 +#define VECT_SIZE4 +#endif + +#ifdef VLIW5 +#define VECT_SIZE4 +#endif + +#define DGST_R0 3 +#define DGST_R1 4 +#define DGST_R2 2 +#define DGST_R3 1 + +#include "include/kernel_functions.c" +#include "types_amd.c" +#include "common_amd.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +// no unicode yet + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m00140_m04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, combs_buf[0].pw_len); + } + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[7]; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = combs_buf[il_pos].pw_len; + + const u32 pw_len = pw_l_len + pw_r_len; + + u32 wordr0[4]; + + wordr0[0] = combs_buf[il_pos].i[0]; + wordr0[1] = combs_buf[il_pos].i[1]; + wordr0[2] = combs_buf[il_pos].i[2]; + wordr0[3] = combs_buf[il_pos].i[3]; + + u32 wordr1[4]; + + wordr1[0] = combs_buf[il_pos].i[4]; + wordr1[1] = combs_buf[il_pos].i[5]; + wordr1[2] = combs_buf[il_pos].i[6]; + wordr1[3] = combs_buf[il_pos].i[7]; + + u32 wordr2[4]; + + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + + u32 wordr3[4]; + + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + /** + * prepend salt + */ + + const u32 pw_salt_len = (pw_len * 2) + salt_len; + + u32x w0[4]; + u32x w1[4]; + u32x w2[4]; + u32x w3[4]; + + w0[0] = wordl0[0] | wordr0[0]; + w0[1] = wordl0[1] | wordr0[1]; + w0[2] = wordl0[2] | wordr0[2]; + w0[3] = wordl0[3] | wordr0[3]; + w1[0] = wordl1[0] | wordr1[0]; + w1[1] = wordl1[1] | wordr1[1]; + w1[2] = wordl1[2] | wordr1[2]; + w1[3] = wordl1[3] | wordr1[3]; + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + make_unicode (w0, w0_t, w1_t); + make_unicode (w1, w2_t, w3_t); + + switch_buffer_by_offset (w0_t, w1_t, w2_t, w3_t, salt_len); + + w0_t[0] |= salt_buf0[0]; + w0_t[1] |= salt_buf0[1]; + w0_t[2] |= salt_buf0[2]; + w0_t[3] |= salt_buf0[3]; + w1_t[0] |= salt_buf1[0]; + w1_t[1] |= salt_buf1[1]; + w1_t[2] |= salt_buf1[2]; + w1_t[3] |= salt_buf1[3]; + + append_0x80_4 (w0_t, w1_t, w2_t, w3_t, pw_salt_len); + + w3_t[3] = pw_salt_len * 8; + + /** + * sha1 + */ + + w0_t[0] = swap_workaround (w0_t[0]); + w0_t[1] = swap_workaround (w0_t[1]); + w0_t[2] = swap_workaround (w0_t[2]); + w0_t[3] = swap_workaround (w0_t[3]); + w1_t[0] = swap_workaround (w1_t[0]); + w1_t[1] = swap_workaround (w1_t[1]); + w1_t[2] = swap_workaround (w1_t[2]); + w1_t[3] = swap_workaround (w1_t[3]); + w2_t[0] = swap_workaround (w2_t[0]); + w2_t[1] = swap_workaround (w2_t[1]); + w2_t[2] = swap_workaround (w2_t[2]); + w2_t[3] = swap_workaround (w2_t[3]); + w3_t[0] = swap_workaround (w3_t[0]); + w3_t[1] = swap_workaround (w3_t[1]); + //w3_t[2] = swap_workaround (w3_t[2]); + //w3_t[3] = swap_workaround (w3_t[3]); + + u32x a = SHA1M_A; + u32x b = SHA1M_B; + u32x c = SHA1M_C; + u32x d = SHA1M_D; + u32x e = SHA1M_E; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w0_t[0]); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w0_t[1]); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w0_t[2]); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w0_t[3]); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w1_t[0]); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w1_t[1]); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w1_t[2]); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w1_t[3]); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w2_t[0]); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w2_t[1]); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w2_t[2]); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w2_t[3]); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w3_t[0]); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w3_t[1]); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w3_t[2]); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w3_t[3]); + w0_t[0] = rotl32 ((w3_t[1] ^ w2_t[0] ^ w0_t[2] ^ w0_t[0]), 1u); SHA1_STEP (SHA1_F0o, e, a, b, c, d, w0_t[0]); + w0_t[1] = rotl32 ((w3_t[2] ^ w2_t[1] ^ w0_t[3] ^ w0_t[1]), 1u); SHA1_STEP (SHA1_F0o, d, e, a, b, c, w0_t[1]); + w0_t[2] = rotl32 ((w3_t[3] ^ w2_t[2] ^ w1_t[0] ^ w0_t[2]), 1u); SHA1_STEP (SHA1_F0o, c, d, e, a, b, w0_t[2]); + w0_t[3] = rotl32 ((w0_t[0] ^ w2_t[3] ^ w1_t[1] ^ w0_t[3]), 1u); SHA1_STEP (SHA1_F0o, b, c, d, e, a, w0_t[3]); + + #undef K + #define K SHA1C01 + + w1_t[0] = rotl32 ((w0_t[1] ^ w3_t[0] ^ w1_t[2] ^ w1_t[0]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w1_t[0]); + w1_t[1] = rotl32 ((w0_t[2] ^ w3_t[1] ^ w1_t[3] ^ w1_t[1]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w1_t[1]); + w1_t[2] = rotl32 ((w0_t[3] ^ w3_t[2] ^ w2_t[0] ^ w1_t[2]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w1_t[2]); + w1_t[3] = rotl32 ((w1_t[0] ^ w3_t[3] ^ w2_t[1] ^ w1_t[3]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1_t[3]); + w2_t[0] = rotl32 ((w1_t[1] ^ w0_t[0] ^ w2_t[2] ^ w2_t[0]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w2_t[0]); + w2_t[1] = rotl32 ((w1_t[2] ^ w0_t[1] ^ w2_t[3] ^ w2_t[1]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w2_t[1]); + w2_t[2] = rotl32 ((w1_t[3] ^ w0_t[2] ^ w3_t[0] ^ w2_t[2]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w2_t[2]); + w2_t[3] = rotl32 ((w2_t[0] ^ w0_t[3] ^ w3_t[1] ^ w2_t[3]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w2_t[3]); + w3_t[0] = rotl32 ((w2_t[1] ^ w1_t[0] ^ w3_t[2] ^ w3_t[0]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w3_t[0]); + w3_t[1] = rotl32 ((w2_t[2] ^ w1_t[1] ^ w3_t[3] ^ w3_t[1]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w3_t[1]); + w3_t[2] = rotl32 ((w2_t[3] ^ w1_t[2] ^ w0_t[0] ^ w3_t[2]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w3_t[2]); + w3_t[3] = rotl32 ((w3_t[0] ^ w1_t[3] ^ w0_t[1] ^ w3_t[3]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w3_t[3]); + w0_t[0] = rotl32 ((w3_t[1] ^ w2_t[0] ^ w0_t[2] ^ w0_t[0]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w0_t[0]); + w0_t[1] = rotl32 ((w3_t[2] ^ w2_t[1] ^ w0_t[3] ^ w0_t[1]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w0_t[1]); + w0_t[2] = rotl32 ((w3_t[3] ^ w2_t[2] ^ w1_t[0] ^ w0_t[2]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w0_t[2]); + w0_t[3] = rotl32 ((w0_t[0] ^ w2_t[3] ^ w1_t[1] ^ w0_t[3]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w0_t[3]); + w1_t[0] = rotl32 ((w0_t[1] ^ w3_t[0] ^ w1_t[2] ^ w1_t[0]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w1_t[0]); + w1_t[1] = rotl32 ((w0_t[2] ^ w3_t[1] ^ w1_t[3] ^ w1_t[1]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w1_t[1]); + w1_t[2] = rotl32 ((w0_t[3] ^ w3_t[2] ^ w2_t[0] ^ w1_t[2]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1_t[2]); + w1_t[3] = rotl32 ((w1_t[0] ^ w3_t[3] ^ w2_t[1] ^ w1_t[3]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w1_t[3]); + + #undef K + #define K SHA1C02 + + w2_t[0] = rotl32 ((w1_t[1] ^ w0_t[0] ^ w2_t[2] ^ w2_t[0]), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w2_t[0]); + w2_t[1] = rotl32 ((w1_t[2] ^ w0_t[1] ^ w2_t[3] ^ w2_t[1]), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w2_t[1]); + w2_t[2] = rotl32 ((w1_t[3] ^ w0_t[2] ^ w3_t[0] ^ w2_t[2]), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w2_t[2]); + w2_t[3] = rotl32 ((w2_t[0] ^ w0_t[3] ^ w3_t[1] ^ w2_t[3]), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w2_t[3]); + w3_t[0] = rotl32 ((w2_t[1] ^ w1_t[0] ^ w3_t[2] ^ w3_t[0]), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w3_t[0]); + w3_t[1] = rotl32 ((w2_t[2] ^ w1_t[1] ^ w3_t[3] ^ w3_t[1]), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w3_t[1]); + w3_t[2] = rotl32 ((w2_t[3] ^ w1_t[2] ^ w0_t[0] ^ w3_t[2]), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w3_t[2]); + w3_t[3] = rotl32 ((w3_t[0] ^ w1_t[3] ^ w0_t[1] ^ w3_t[3]), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w3_t[3]); + w0_t[0] = rotl32 ((w3_t[1] ^ w2_t[0] ^ w0_t[2] ^ w0_t[0]), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w0_t[0]); + w0_t[1] = rotl32 ((w3_t[2] ^ w2_t[1] ^ w0_t[3] ^ w0_t[1]), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w0_t[1]); + w0_t[2] = rotl32 ((w3_t[3] ^ w2_t[2] ^ w1_t[0] ^ w0_t[2]), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w0_t[2]); + w0_t[3] = rotl32 ((w0_t[0] ^ w2_t[3] ^ w1_t[1] ^ w0_t[3]), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w0_t[3]); + w1_t[0] = rotl32 ((w0_t[1] ^ w3_t[0] ^ w1_t[2] ^ w1_t[0]), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w1_t[0]); + w1_t[1] = rotl32 ((w0_t[2] ^ w3_t[1] ^ w1_t[3] ^ w1_t[1]), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w1_t[1]); + w1_t[2] = rotl32 ((w0_t[3] ^ w3_t[2] ^ w2_t[0] ^ w1_t[2]), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w1_t[2]); + w1_t[3] = rotl32 ((w1_t[0] ^ w3_t[3] ^ w2_t[1] ^ w1_t[3]), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w1_t[3]); + w2_t[0] = rotl32 ((w1_t[1] ^ w0_t[0] ^ w2_t[2] ^ w2_t[0]), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w2_t[0]); + w2_t[1] = rotl32 ((w1_t[2] ^ w0_t[1] ^ w2_t[3] ^ w2_t[1]), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w2_t[1]); + w2_t[2] = rotl32 ((w1_t[3] ^ w0_t[2] ^ w3_t[0] ^ w2_t[2]), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w2_t[2]); + w2_t[3] = rotl32 ((w2_t[0] ^ w0_t[3] ^ w3_t[1] ^ w2_t[3]), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w2_t[3]); + + #undef K + #define K SHA1C03 + + w3_t[0] = rotl32 ((w2_t[1] ^ w1_t[0] ^ w3_t[2] ^ w3_t[0]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w3_t[0]); + w3_t[1] = rotl32 ((w2_t[2] ^ w1_t[1] ^ w3_t[3] ^ w3_t[1]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w3_t[1]); + w3_t[2] = rotl32 ((w2_t[3] ^ w1_t[2] ^ w0_t[0] ^ w3_t[2]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w3_t[2]); + w3_t[3] = rotl32 ((w3_t[0] ^ w1_t[3] ^ w0_t[1] ^ w3_t[3]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w3_t[3]); + w0_t[0] = rotl32 ((w3_t[1] ^ w2_t[0] ^ w0_t[2] ^ w0_t[0]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w0_t[0]); + w0_t[1] = rotl32 ((w3_t[2] ^ w2_t[1] ^ w0_t[3] ^ w0_t[1]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w0_t[1]); + w0_t[2] = rotl32 ((w3_t[3] ^ w2_t[2] ^ w1_t[0] ^ w0_t[2]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w0_t[2]); + w0_t[3] = rotl32 ((w0_t[0] ^ w2_t[3] ^ w1_t[1] ^ w0_t[3]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w0_t[3]); + w1_t[0] = rotl32 ((w0_t[1] ^ w3_t[0] ^ w1_t[2] ^ w1_t[0]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1_t[0]); + w1_t[1] = rotl32 ((w0_t[2] ^ w3_t[1] ^ w1_t[3] ^ w1_t[1]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w1_t[1]); + w1_t[2] = rotl32 ((w0_t[3] ^ w3_t[2] ^ w2_t[0] ^ w1_t[2]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w1_t[2]); + w1_t[3] = rotl32 ((w1_t[0] ^ w3_t[3] ^ w2_t[1] ^ w1_t[3]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w1_t[3]); + w2_t[0] = rotl32 ((w1_t[1] ^ w0_t[0] ^ w2_t[2] ^ w2_t[0]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w2_t[0]); + w2_t[1] = rotl32 ((w1_t[2] ^ w0_t[1] ^ w2_t[3] ^ w2_t[1]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w2_t[1]); + w2_t[2] = rotl32 ((w1_t[3] ^ w0_t[2] ^ w3_t[0] ^ w2_t[2]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w2_t[2]); + w2_t[3] = rotl32 ((w2_t[0] ^ w0_t[3] ^ w3_t[1] ^ w2_t[3]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w2_t[3]); + w3_t[0] = rotl32 ((w2_t[1] ^ w1_t[0] ^ w3_t[2] ^ w3_t[0]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w3_t[0]); + w3_t[1] = rotl32 ((w2_t[2] ^ w1_t[1] ^ w3_t[3] ^ w3_t[1]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w3_t[1]); + w3_t[2] = rotl32 ((w2_t[3] ^ w1_t[2] ^ w0_t[0] ^ w3_t[2]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w3_t[2]); + w3_t[3] = rotl32 ((w3_t[0] ^ w1_t[3] ^ w0_t[1] ^ w3_t[3]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w3_t[3]); + + + const u32x r0 = d; + const u32x r1 = e; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_M + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m00140_m08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m00140_m16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m00140_s04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, combs_buf[0].pw_len); + } + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[7]; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * reverse + */ + + const u32 e_rev = rotl32 (search[1], 2u); + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = combs_buf[il_pos].pw_len; + + const u32 pw_len = pw_l_len + pw_r_len; + + u32 wordr0[4]; + + wordr0[0] = combs_buf[il_pos].i[0]; + wordr0[1] = combs_buf[il_pos].i[1]; + wordr0[2] = combs_buf[il_pos].i[2]; + wordr0[3] = combs_buf[il_pos].i[3]; + + u32 wordr1[4]; + + wordr1[0] = combs_buf[il_pos].i[4]; + wordr1[1] = combs_buf[il_pos].i[5]; + wordr1[2] = combs_buf[il_pos].i[6]; + wordr1[3] = combs_buf[il_pos].i[7]; + + u32 wordr2[4]; + + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + + u32 wordr3[4]; + + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + /** + * prepend salt + */ + + const u32 pw_salt_len = (pw_len * 2) + salt_len; + + u32x w0[4]; + u32x w1[4]; + u32x w2[4]; + u32x w3[4]; + + w0[0] = wordl0[0] | wordr0[0]; + w0[1] = wordl0[1] | wordr0[1]; + w0[2] = wordl0[2] | wordr0[2]; + w0[3] = wordl0[3] | wordr0[3]; + w1[0] = wordl1[0] | wordr1[0]; + w1[1] = wordl1[1] | wordr1[1]; + w1[2] = wordl1[2] | wordr1[2]; + w1[3] = wordl1[3] | wordr1[3]; + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + make_unicode (w0, w0_t, w1_t); + make_unicode (w1, w2_t, w3_t); + + switch_buffer_by_offset (w0_t, w1_t, w2_t, w3_t, salt_len); + + w0_t[0] |= salt_buf0[0]; + w0_t[1] |= salt_buf0[1]; + w0_t[2] |= salt_buf0[2]; + w0_t[3] |= salt_buf0[3]; + w1_t[0] |= salt_buf1[0]; + w1_t[1] |= salt_buf1[1]; + w1_t[2] |= salt_buf1[2]; + w1_t[3] |= salt_buf1[3]; + + append_0x80_4 (w0_t, w1_t, w2_t, w3_t, pw_salt_len); + + w3_t[3] = pw_salt_len * 8; + + /** + * sha1 + */ + + w0_t[0] = swap_workaround (w0_t[0]); + w0_t[1] = swap_workaround (w0_t[1]); + w0_t[2] = swap_workaround (w0_t[2]); + w0_t[3] = swap_workaround (w0_t[3]); + w1_t[0] = swap_workaround (w1_t[0]); + w1_t[1] = swap_workaround (w1_t[1]); + w1_t[2] = swap_workaround (w1_t[2]); + w1_t[3] = swap_workaround (w1_t[3]); + w2_t[0] = swap_workaround (w2_t[0]); + w2_t[1] = swap_workaround (w2_t[1]); + w2_t[2] = swap_workaround (w2_t[2]); + w2_t[3] = swap_workaround (w2_t[3]); + w3_t[0] = swap_workaround (w3_t[0]); + w3_t[1] = swap_workaround (w3_t[1]); + //w3_t[2] = swap_workaround (w3_t[2]); + //w3_t[3] = swap_workaround (w3_t[3]); + + u32x a = SHA1M_A; + u32x b = SHA1M_B; + u32x c = SHA1M_C; + u32x d = SHA1M_D; + u32x e = SHA1M_E; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w0_t[0]); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w0_t[1]); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w0_t[2]); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w0_t[3]); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w1_t[0]); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w1_t[1]); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w1_t[2]); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w1_t[3]); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w2_t[0]); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w2_t[1]); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w2_t[2]); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w2_t[3]); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w3_t[0]); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w3_t[1]); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w3_t[2]); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w3_t[3]); + w0_t[0] = rotl32 ((w3_t[1] ^ w2_t[0] ^ w0_t[2] ^ w0_t[0]), 1u); SHA1_STEP (SHA1_F0o, e, a, b, c, d, w0_t[0]); + w0_t[1] = rotl32 ((w3_t[2] ^ w2_t[1] ^ w0_t[3] ^ w0_t[1]), 1u); SHA1_STEP (SHA1_F0o, d, e, a, b, c, w0_t[1]); + w0_t[2] = rotl32 ((w3_t[3] ^ w2_t[2] ^ w1_t[0] ^ w0_t[2]), 1u); SHA1_STEP (SHA1_F0o, c, d, e, a, b, w0_t[2]); + w0_t[3] = rotl32 ((w0_t[0] ^ w2_t[3] ^ w1_t[1] ^ w0_t[3]), 1u); SHA1_STEP (SHA1_F0o, b, c, d, e, a, w0_t[3]); + + #undef K + #define K SHA1C01 + + w1_t[0] = rotl32 ((w0_t[1] ^ w3_t[0] ^ w1_t[2] ^ w1_t[0]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w1_t[0]); + w1_t[1] = rotl32 ((w0_t[2] ^ w3_t[1] ^ w1_t[3] ^ w1_t[1]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w1_t[1]); + w1_t[2] = rotl32 ((w0_t[3] ^ w3_t[2] ^ w2_t[0] ^ w1_t[2]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w1_t[2]); + w1_t[3] = rotl32 ((w1_t[0] ^ w3_t[3] ^ w2_t[1] ^ w1_t[3]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1_t[3]); + w2_t[0] = rotl32 ((w1_t[1] ^ w0_t[0] ^ w2_t[2] ^ w2_t[0]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w2_t[0]); + w2_t[1] = rotl32 ((w1_t[2] ^ w0_t[1] ^ w2_t[3] ^ w2_t[1]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w2_t[1]); + w2_t[2] = rotl32 ((w1_t[3] ^ w0_t[2] ^ w3_t[0] ^ w2_t[2]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w2_t[2]); + w2_t[3] = rotl32 ((w2_t[0] ^ w0_t[3] ^ w3_t[1] ^ w2_t[3]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w2_t[3]); + w3_t[0] = rotl32 ((w2_t[1] ^ w1_t[0] ^ w3_t[2] ^ w3_t[0]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w3_t[0]); + w3_t[1] = rotl32 ((w2_t[2] ^ w1_t[1] ^ w3_t[3] ^ w3_t[1]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w3_t[1]); + w3_t[2] = rotl32 ((w2_t[3] ^ w1_t[2] ^ w0_t[0] ^ w3_t[2]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w3_t[2]); + w3_t[3] = rotl32 ((w3_t[0] ^ w1_t[3] ^ w0_t[1] ^ w3_t[3]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w3_t[3]); + w0_t[0] = rotl32 ((w3_t[1] ^ w2_t[0] ^ w0_t[2] ^ w0_t[0]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w0_t[0]); + w0_t[1] = rotl32 ((w3_t[2] ^ w2_t[1] ^ w0_t[3] ^ w0_t[1]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w0_t[1]); + w0_t[2] = rotl32 ((w3_t[3] ^ w2_t[2] ^ w1_t[0] ^ w0_t[2]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w0_t[2]); + w0_t[3] = rotl32 ((w0_t[0] ^ w2_t[3] ^ w1_t[1] ^ w0_t[3]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w0_t[3]); + w1_t[0] = rotl32 ((w0_t[1] ^ w3_t[0] ^ w1_t[2] ^ w1_t[0]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w1_t[0]); + w1_t[1] = rotl32 ((w0_t[2] ^ w3_t[1] ^ w1_t[3] ^ w1_t[1]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w1_t[1]); + w1_t[2] = rotl32 ((w0_t[3] ^ w3_t[2] ^ w2_t[0] ^ w1_t[2]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1_t[2]); + w1_t[3] = rotl32 ((w1_t[0] ^ w3_t[3] ^ w2_t[1] ^ w1_t[3]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w1_t[3]); + + #undef K + #define K SHA1C02 + + w2_t[0] = rotl32 ((w1_t[1] ^ w0_t[0] ^ w2_t[2] ^ w2_t[0]), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w2_t[0]); + w2_t[1] = rotl32 ((w1_t[2] ^ w0_t[1] ^ w2_t[3] ^ w2_t[1]), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w2_t[1]); + w2_t[2] = rotl32 ((w1_t[3] ^ w0_t[2] ^ w3_t[0] ^ w2_t[2]), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w2_t[2]); + w2_t[3] = rotl32 ((w2_t[0] ^ w0_t[3] ^ w3_t[1] ^ w2_t[3]), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w2_t[3]); + w3_t[0] = rotl32 ((w2_t[1] ^ w1_t[0] ^ w3_t[2] ^ w3_t[0]), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w3_t[0]); + w3_t[1] = rotl32 ((w2_t[2] ^ w1_t[1] ^ w3_t[3] ^ w3_t[1]), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w3_t[1]); + w3_t[2] = rotl32 ((w2_t[3] ^ w1_t[2] ^ w0_t[0] ^ w3_t[2]), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w3_t[2]); + w3_t[3] = rotl32 ((w3_t[0] ^ w1_t[3] ^ w0_t[1] ^ w3_t[3]), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w3_t[3]); + w0_t[0] = rotl32 ((w3_t[1] ^ w2_t[0] ^ w0_t[2] ^ w0_t[0]), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w0_t[0]); + w0_t[1] = rotl32 ((w3_t[2] ^ w2_t[1] ^ w0_t[3] ^ w0_t[1]), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w0_t[1]); + w0_t[2] = rotl32 ((w3_t[3] ^ w2_t[2] ^ w1_t[0] ^ w0_t[2]), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w0_t[2]); + w0_t[3] = rotl32 ((w0_t[0] ^ w2_t[3] ^ w1_t[1] ^ w0_t[3]), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w0_t[3]); + w1_t[0] = rotl32 ((w0_t[1] ^ w3_t[0] ^ w1_t[2] ^ w1_t[0]), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w1_t[0]); + w1_t[1] = rotl32 ((w0_t[2] ^ w3_t[1] ^ w1_t[3] ^ w1_t[1]), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w1_t[1]); + w1_t[2] = rotl32 ((w0_t[3] ^ w3_t[2] ^ w2_t[0] ^ w1_t[2]), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w1_t[2]); + w1_t[3] = rotl32 ((w1_t[0] ^ w3_t[3] ^ w2_t[1] ^ w1_t[3]), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w1_t[3]); + w2_t[0] = rotl32 ((w1_t[1] ^ w0_t[0] ^ w2_t[2] ^ w2_t[0]), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w2_t[0]); + w2_t[1] = rotl32 ((w1_t[2] ^ w0_t[1] ^ w2_t[3] ^ w2_t[1]), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w2_t[1]); + w2_t[2] = rotl32 ((w1_t[3] ^ w0_t[2] ^ w3_t[0] ^ w2_t[2]), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w2_t[2]); + w2_t[3] = rotl32 ((w2_t[0] ^ w0_t[3] ^ w3_t[1] ^ w2_t[3]), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w2_t[3]); + + #undef K + #define K SHA1C03 + + w3_t[0] = rotl32 ((w2_t[1] ^ w1_t[0] ^ w3_t[2] ^ w3_t[0]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w3_t[0]); + w3_t[1] = rotl32 ((w2_t[2] ^ w1_t[1] ^ w3_t[3] ^ w3_t[1]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w3_t[1]); + w3_t[2] = rotl32 ((w2_t[3] ^ w1_t[2] ^ w0_t[0] ^ w3_t[2]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w3_t[2]); + w3_t[3] = rotl32 ((w3_t[0] ^ w1_t[3] ^ w0_t[1] ^ w3_t[3]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w3_t[3]); + w0_t[0] = rotl32 ((w3_t[1] ^ w2_t[0] ^ w0_t[2] ^ w0_t[0]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w0_t[0]); + w0_t[1] = rotl32 ((w3_t[2] ^ w2_t[1] ^ w0_t[3] ^ w0_t[1]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w0_t[1]); + w0_t[2] = rotl32 ((w3_t[3] ^ w2_t[2] ^ w1_t[0] ^ w0_t[2]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w0_t[2]); + w0_t[3] = rotl32 ((w0_t[0] ^ w2_t[3] ^ w1_t[1] ^ w0_t[3]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w0_t[3]); + w1_t[0] = rotl32 ((w0_t[1] ^ w3_t[0] ^ w1_t[2] ^ w1_t[0]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1_t[0]); + w1_t[1] = rotl32 ((w0_t[2] ^ w3_t[1] ^ w1_t[3] ^ w1_t[1]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w1_t[1]); + w1_t[2] = rotl32 ((w0_t[3] ^ w3_t[2] ^ w2_t[0] ^ w1_t[2]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w1_t[2]); + w1_t[3] = rotl32 ((w1_t[0] ^ w3_t[3] ^ w2_t[1] ^ w1_t[3]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w1_t[3]); + w2_t[0] = rotl32 ((w1_t[1] ^ w0_t[0] ^ w2_t[2] ^ w2_t[0]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w2_t[0]); + w2_t[1] = rotl32 ((w1_t[2] ^ w0_t[1] ^ w2_t[3] ^ w2_t[1]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w2_t[1]); + w2_t[2] = rotl32 ((w1_t[3] ^ w0_t[2] ^ w3_t[0] ^ w2_t[2]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w2_t[2]); + w2_t[3] = rotl32 ((w2_t[0] ^ w0_t[3] ^ w3_t[1] ^ w2_t[3]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w2_t[3]); + w3_t[0] = rotl32 ((w2_t[1] ^ w1_t[0] ^ w3_t[2] ^ w3_t[0]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w3_t[0]); + + if (allx (e != e_rev)) continue; + + w3_t[1] = rotl32 ((w2_t[2] ^ w1_t[1] ^ w3_t[3] ^ w3_t[1]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w3_t[1]); + w3_t[2] = rotl32 ((w2_t[3] ^ w1_t[2] ^ w0_t[0] ^ w3_t[2]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w3_t[2]); + w3_t[3] = rotl32 ((w3_t[0] ^ w1_t[3] ^ w0_t[1] ^ w3_t[3]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w3_t[3]); + + + const u32x r0 = d; + const u32x r1 = e; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_S + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m00140_s08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m00140_s16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/amd/m00140_a3.cl b/amd/m00140_a3.cl new file mode 100644 index 0000000000..bd3248784c --- /dev/null +++ b/amd/m00140_a3.cl @@ -0,0 +1,998 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _SHA1_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW4 +#define VECT_SIZE4 +#endif + +#ifdef VLIW5 +#define VECT_SIZE4 +#endif + +#define DGST_R0 3 +#define DGST_R1 4 +#define DGST_R2 2 +#define DGST_R3 1 + +#include "include/kernel_functions.c" +#include "types_amd.c" +#include "common_amd.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +static void overwrite_at (u32x sw[16], const u32x w0, const u32 salt_len) +{ + switch (salt_len) + { + case 0: sw[0] = w0; + break; + case 1: sw[0] = (sw[0] & 0xff000000) | (w0 >> 8); + sw[1] = (sw[1] & 0x00ffffff) | (w0 << 24); + break; + case 2: sw[0] = (sw[0] & 0xffff0000) | (w0 >> 16); + sw[1] = (sw[1] & 0x0000ffff) | (w0 << 16); + break; + case 3: sw[0] = (sw[0] & 0xffffff00) | (w0 >> 24); + sw[1] = (sw[1] & 0x000000ff) | (w0 << 8); + break; + case 4: sw[1] = w0; + break; + case 5: sw[1] = (sw[1] & 0xff000000) | (w0 >> 8); + sw[2] = (sw[2] & 0x00ffffff) | (w0 << 24); + break; + case 6: sw[1] = (sw[1] & 0xffff0000) | (w0 >> 16); + sw[2] = (sw[2] & 0x0000ffff) | (w0 << 16); + break; + case 7: sw[1] = (sw[1] & 0xffffff00) | (w0 >> 24); + sw[2] = (sw[2] & 0x000000ff) | (w0 << 8); + break; + case 8: sw[2] = w0; + break; + case 9: sw[2] = (sw[2] & 0xff000000) | (w0 >> 8); + sw[3] = (sw[3] & 0x00ffffff) | (w0 << 24); + break; + case 10: sw[2] = (sw[2] & 0xffff0000) | (w0 >> 16); + sw[3] = (sw[3] & 0x0000ffff) | (w0 << 16); + break; + case 11: sw[2] = (sw[2] & 0xffffff00) | (w0 >> 24); + sw[3] = (sw[3] & 0x000000ff) | (w0 << 8); + break; + case 12: sw[3] = w0; + break; + case 13: sw[3] = (sw[3] & 0xff000000) | (w0 >> 8); + sw[4] = (sw[4] & 0x00ffffff) | (w0 << 24); + break; + case 14: sw[3] = (sw[3] & 0xffff0000) | (w0 >> 16); + sw[4] = (sw[4] & 0x0000ffff) | (w0 << 16); + break; + case 15: sw[3] = (sw[3] & 0xffffff00) | (w0 >> 24); + sw[4] = (sw[4] & 0x000000ff) | (w0 << 8); + break; + case 16: sw[4] = w0; + break; + case 17: sw[4] = (sw[4] & 0xff000000) | (w0 >> 8); + sw[5] = (sw[5] & 0x00ffffff) | (w0 << 24); + break; + case 18: sw[4] = (sw[4] & 0xffff0000) | (w0 >> 16); + sw[5] = (sw[5] & 0x0000ffff) | (w0 << 16); + break; + case 19: sw[4] = (sw[4] & 0xffffff00) | (w0 >> 24); + sw[5] = (sw[5] & 0x000000ff) | (w0 << 8); + break; + case 20: sw[5] = w0; + break; + case 21: sw[5] = (sw[5] & 0xff000000) | (w0 >> 8); + sw[6] = (sw[6] & 0x00ffffff) | (w0 << 24); + break; + case 22: sw[5] = (sw[5] & 0xffff0000) | (w0 >> 16); + sw[6] = (sw[6] & 0x0000ffff) | (w0 << 16); + break; + case 23: sw[5] = (sw[5] & 0xffffff00) | (w0 >> 24); + sw[6] = (sw[6] & 0x000000ff) | (w0 << 8); + break; + case 24: sw[6] = w0; + break; + case 25: sw[6] = (sw[6] & 0xff000000) | (w0 >> 8); + sw[7] = (sw[7] & 0x00ffffff) | (w0 << 24); + break; + case 26: sw[6] = (sw[6] & 0xffff0000) | (w0 >> 16); + sw[7] = (sw[7] & 0x0000ffff) | (w0 << 16); + break; + case 27: sw[6] = (sw[6] & 0xffffff00) | (w0 >> 24); + sw[7] = (sw[7] & 0x000000ff) | (w0 << 8); + break; + case 28: sw[7] = w0; + break; + case 29: sw[7] = (sw[7] & 0xff000000) | (w0 >> 8); + sw[8] = (sw[8] & 0x00ffffff) | (w0 << 24); + break; + case 30: sw[7] = (sw[7] & 0xffff0000) | (w0 >> 16); + sw[8] = (sw[8] & 0x0000ffff) | (w0 << 16); + break; + case 31: sw[7] = (sw[7] & 0xffffff00) | (w0 >> 24); + sw[8] = (sw[8] & 0x000000ff) | (w0 << 8); + break; + } +} + +static void m00140m (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], const u32 pw_len, __global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset) +{ + /** + * modifier + */ + + const u32 gid = get_global_id (0); + const u32 lid = get_local_id (0); + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[ 1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[ 2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[ 3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[ 4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[ 5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[ 6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[ 7]; + + u32 salt_buf2[4]; + + salt_buf2[0] = 0; + salt_buf2[1] = 0; + salt_buf2[2] = 0; + salt_buf2[3] = 0; + + u32 salt_buf3[4]; + + salt_buf3[0] = 0; + salt_buf3[1] = 0; + salt_buf3[2] = 0; + salt_buf3[3] = 0; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + const u32 pw_salt_len = pw_len + salt_len; + + /** + * prepend salt + */ + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + w0_t[0] = swap_workaround (w0[0]); + w0_t[1] = swap_workaround (w0[1]); + w0_t[2] = swap_workaround (w0[2]); + w0_t[3] = swap_workaround (w0[3]); + w1_t[0] = swap_workaround (w1[0]); + w1_t[1] = swap_workaround (w1[1]); + w1_t[2] = swap_workaround (w1[2]); + w1_t[3] = swap_workaround (w1[3]); + w2_t[0] = swap_workaround (w2[0]); + w2_t[1] = swap_workaround (w2[1]); + w2_t[2] = swap_workaround (w2[2]); + w2_t[3] = swap_workaround (w2[3]); + w3_t[0] = swap_workaround (w3[0]); + w3_t[1] = swap_workaround (w3[1]); + w3_t[2] = swap_workaround (w3[2]); + w3_t[3] = swap_workaround (w3[3]); + + switch_buffer_by_offset (w0_t, w1_t, w2_t, w3_t, salt_len); + + w0_t[0] |= salt_buf0[0]; + w0_t[1] |= salt_buf0[1]; + w0_t[2] |= salt_buf0[2]; + w0_t[3] |= salt_buf0[3]; + w1_t[0] |= salt_buf1[0]; + w1_t[1] |= salt_buf1[1]; + w1_t[2] |= salt_buf1[2]; + w1_t[3] |= salt_buf1[3]; + w2_t[0] |= salt_buf2[0]; + w2_t[1] |= salt_buf2[1]; + w2_t[2] |= salt_buf2[2]; + w2_t[3] |= salt_buf2[3]; + w3_t[0] |= salt_buf3[0]; + w3_t[1] |= salt_buf3[1]; + w3_t[2] |= salt_buf3[2]; + w3_t[3] |= salt_buf3[3]; + + w0_t[0] = swap_workaround (w0_t[0]); + w0_t[1] = swap_workaround (w0_t[1]); + w0_t[2] = swap_workaround (w0_t[2]); + w0_t[3] = swap_workaround (w0_t[3]); + w1_t[0] = swap_workaround (w1_t[0]); + w1_t[1] = swap_workaround (w1_t[1]); + w1_t[2] = swap_workaround (w1_t[2]); + w1_t[3] = swap_workaround (w1_t[3]); + w2_t[0] = swap_workaround (w2_t[0]); + w2_t[1] = swap_workaround (w2_t[1]); + w2_t[2] = swap_workaround (w2_t[2]); + w2_t[3] = swap_workaround (w2_t[3]); + w3_t[0] = swap_workaround (w3_t[0]); + w3_t[1] = swap_workaround (w3_t[1]); + w3_t[2] = swap_workaround (w3_t[2]); + w3_t[3] = swap_workaround (w3_t[3]); + + /** + * loop + */ + + u32x w0l = w0[0]; + + for (u32 il_pos = 0; il_pos < bfs_cnt; il_pos++) + { + const u32 w0r = bfs_buf[il_pos].i; + + const u32x w0n = w0l | w0r; + + u32x wx[16]; + + wx[ 0] = w0_t[0]; + wx[ 1] = w0_t[1]; + wx[ 2] = w0_t[2]; + wx[ 3] = w0_t[3]; + wx[ 4] = w1_t[0]; + wx[ 5] = w1_t[1]; + wx[ 6] = w1_t[2]; + wx[ 7] = w1_t[3]; + wx[ 8] = w2_t[0]; + wx[ 9] = w2_t[1]; + wx[10] = w2_t[2]; + wx[11] = w2_t[3]; + wx[12] = w3_t[0]; + wx[13] = w3_t[1]; + wx[14] = w3_t[2]; + wx[15] = w3_t[3]; + + overwrite_at (wx, w0n, salt_len); + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + w0_t[0] = wx[ 0]; + w0_t[1] = wx[ 1]; + w0_t[2] = wx[ 2]; + w0_t[3] = wx[ 3]; + w1_t[0] = wx[ 4]; + w1_t[1] = wx[ 5]; + w1_t[2] = wx[ 6]; + w1_t[3] = wx[ 7]; + w2_t[0] = wx[ 8]; + w2_t[1] = wx[ 9]; + w2_t[2] = wx[10]; + w2_t[3] = wx[11]; + w3_t[0] = wx[12]; + w3_t[1] = wx[13]; + w3_t[2] = 0; + w3_t[3] = pw_salt_len * 8; + + /** + * sha1 + */ + + u32x a = SHA1M_A; + u32x b = SHA1M_B; + u32x c = SHA1M_C; + u32x d = SHA1M_D; + u32x e = SHA1M_E; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w0_t[0]); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w0_t[1]); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w0_t[2]); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w0_t[3]); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w1_t[0]); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w1_t[1]); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w1_t[2]); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w1_t[3]); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w2_t[0]); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w2_t[1]); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w2_t[2]); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w2_t[3]); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w3_t[0]); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w3_t[1]); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w3_t[2]); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w3_t[3]); + w0_t[0] = rotl32 ((w3_t[1] ^ w2_t[0] ^ w0_t[2] ^ w0_t[0]), 1u); SHA1_STEP (SHA1_F0o, e, a, b, c, d, w0_t[0]); + w0_t[1] = rotl32 ((w3_t[2] ^ w2_t[1] ^ w0_t[3] ^ w0_t[1]), 1u); SHA1_STEP (SHA1_F0o, d, e, a, b, c, w0_t[1]); + w0_t[2] = rotl32 ((w3_t[3] ^ w2_t[2] ^ w1_t[0] ^ w0_t[2]), 1u); SHA1_STEP (SHA1_F0o, c, d, e, a, b, w0_t[2]); + w0_t[3] = rotl32 ((w0_t[0] ^ w2_t[3] ^ w1_t[1] ^ w0_t[3]), 1u); SHA1_STEP (SHA1_F0o, b, c, d, e, a, w0_t[3]); + + #undef K + #define K SHA1C01 + + w1_t[0] = rotl32 ((w0_t[1] ^ w3_t[0] ^ w1_t[2] ^ w1_t[0]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w1_t[0]); + w1_t[1] = rotl32 ((w0_t[2] ^ w3_t[1] ^ w1_t[3] ^ w1_t[1]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w1_t[1]); + w1_t[2] = rotl32 ((w0_t[3] ^ w3_t[2] ^ w2_t[0] ^ w1_t[2]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w1_t[2]); + w1_t[3] = rotl32 ((w1_t[0] ^ w3_t[3] ^ w2_t[1] ^ w1_t[3]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1_t[3]); + w2_t[0] = rotl32 ((w1_t[1] ^ w0_t[0] ^ w2_t[2] ^ w2_t[0]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w2_t[0]); + w2_t[1] = rotl32 ((w1_t[2] ^ w0_t[1] ^ w2_t[3] ^ w2_t[1]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w2_t[1]); + w2_t[2] = rotl32 ((w1_t[3] ^ w0_t[2] ^ w3_t[0] ^ w2_t[2]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w2_t[2]); + w2_t[3] = rotl32 ((w2_t[0] ^ w0_t[3] ^ w3_t[1] ^ w2_t[3]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w2_t[3]); + w3_t[0] = rotl32 ((w2_t[1] ^ w1_t[0] ^ w3_t[2] ^ w3_t[0]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w3_t[0]); + w3_t[1] = rotl32 ((w2_t[2] ^ w1_t[1] ^ w3_t[3] ^ w3_t[1]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w3_t[1]); + w3_t[2] = rotl32 ((w2_t[3] ^ w1_t[2] ^ w0_t[0] ^ w3_t[2]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w3_t[2]); + w3_t[3] = rotl32 ((w3_t[0] ^ w1_t[3] ^ w0_t[1] ^ w3_t[3]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w3_t[3]); + w0_t[0] = rotl32 ((w3_t[1] ^ w2_t[0] ^ w0_t[2] ^ w0_t[0]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w0_t[0]); + w0_t[1] = rotl32 ((w3_t[2] ^ w2_t[1] ^ w0_t[3] ^ w0_t[1]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w0_t[1]); + w0_t[2] = rotl32 ((w3_t[3] ^ w2_t[2] ^ w1_t[0] ^ w0_t[2]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w0_t[2]); + w0_t[3] = rotl32 ((w0_t[0] ^ w2_t[3] ^ w1_t[1] ^ w0_t[3]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w0_t[3]); + w1_t[0] = rotl32 ((w0_t[1] ^ w3_t[0] ^ w1_t[2] ^ w1_t[0]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w1_t[0]); + w1_t[1] = rotl32 ((w0_t[2] ^ w3_t[1] ^ w1_t[3] ^ w1_t[1]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w1_t[1]); + w1_t[2] = rotl32 ((w0_t[3] ^ w3_t[2] ^ w2_t[0] ^ w1_t[2]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1_t[2]); + w1_t[3] = rotl32 ((w1_t[0] ^ w3_t[3] ^ w2_t[1] ^ w1_t[3]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w1_t[3]); + + #undef K + #define K SHA1C02 + + w2_t[0] = rotl32 ((w1_t[1] ^ w0_t[0] ^ w2_t[2] ^ w2_t[0]), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w2_t[0]); + w2_t[1] = rotl32 ((w1_t[2] ^ w0_t[1] ^ w2_t[3] ^ w2_t[1]), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w2_t[1]); + w2_t[2] = rotl32 ((w1_t[3] ^ w0_t[2] ^ w3_t[0] ^ w2_t[2]), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w2_t[2]); + w2_t[3] = rotl32 ((w2_t[0] ^ w0_t[3] ^ w3_t[1] ^ w2_t[3]), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w2_t[3]); + w3_t[0] = rotl32 ((w2_t[1] ^ w1_t[0] ^ w3_t[2] ^ w3_t[0]), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w3_t[0]); + w3_t[1] = rotl32 ((w2_t[2] ^ w1_t[1] ^ w3_t[3] ^ w3_t[1]), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w3_t[1]); + w3_t[2] = rotl32 ((w2_t[3] ^ w1_t[2] ^ w0_t[0] ^ w3_t[2]), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w3_t[2]); + w3_t[3] = rotl32 ((w3_t[0] ^ w1_t[3] ^ w0_t[1] ^ w3_t[3]), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w3_t[3]); + w0_t[0] = rotl32 ((w3_t[1] ^ w2_t[0] ^ w0_t[2] ^ w0_t[0]), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w0_t[0]); + w0_t[1] = rotl32 ((w3_t[2] ^ w2_t[1] ^ w0_t[3] ^ w0_t[1]), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w0_t[1]); + w0_t[2] = rotl32 ((w3_t[3] ^ w2_t[2] ^ w1_t[0] ^ w0_t[2]), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w0_t[2]); + w0_t[3] = rotl32 ((w0_t[0] ^ w2_t[3] ^ w1_t[1] ^ w0_t[3]), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w0_t[3]); + w1_t[0] = rotl32 ((w0_t[1] ^ w3_t[0] ^ w1_t[2] ^ w1_t[0]), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w1_t[0]); + w1_t[1] = rotl32 ((w0_t[2] ^ w3_t[1] ^ w1_t[3] ^ w1_t[1]), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w1_t[1]); + w1_t[2] = rotl32 ((w0_t[3] ^ w3_t[2] ^ w2_t[0] ^ w1_t[2]), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w1_t[2]); + w1_t[3] = rotl32 ((w1_t[0] ^ w3_t[3] ^ w2_t[1] ^ w1_t[3]), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w1_t[3]); + w2_t[0] = rotl32 ((w1_t[1] ^ w0_t[0] ^ w2_t[2] ^ w2_t[0]), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w2_t[0]); + w2_t[1] = rotl32 ((w1_t[2] ^ w0_t[1] ^ w2_t[3] ^ w2_t[1]), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w2_t[1]); + w2_t[2] = rotl32 ((w1_t[3] ^ w0_t[2] ^ w3_t[0] ^ w2_t[2]), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w2_t[2]); + w2_t[3] = rotl32 ((w2_t[0] ^ w0_t[3] ^ w3_t[1] ^ w2_t[3]), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w2_t[3]); + + #undef K + #define K SHA1C03 + + w3_t[0] = rotl32 ((w2_t[1] ^ w1_t[0] ^ w3_t[2] ^ w3_t[0]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w3_t[0]); + w3_t[1] = rotl32 ((w2_t[2] ^ w1_t[1] ^ w3_t[3] ^ w3_t[1]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w3_t[1]); + w3_t[2] = rotl32 ((w2_t[3] ^ w1_t[2] ^ w0_t[0] ^ w3_t[2]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w3_t[2]); + w3_t[3] = rotl32 ((w3_t[0] ^ w1_t[3] ^ w0_t[1] ^ w3_t[3]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w3_t[3]); + w0_t[0] = rotl32 ((w3_t[1] ^ w2_t[0] ^ w0_t[2] ^ w0_t[0]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w0_t[0]); + w0_t[1] = rotl32 ((w3_t[2] ^ w2_t[1] ^ w0_t[3] ^ w0_t[1]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w0_t[1]); + w0_t[2] = rotl32 ((w3_t[3] ^ w2_t[2] ^ w1_t[0] ^ w0_t[2]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w0_t[2]); + w0_t[3] = rotl32 ((w0_t[0] ^ w2_t[3] ^ w1_t[1] ^ w0_t[3]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w0_t[3]); + w1_t[0] = rotl32 ((w0_t[1] ^ w3_t[0] ^ w1_t[2] ^ w1_t[0]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1_t[0]); + w1_t[1] = rotl32 ((w0_t[2] ^ w3_t[1] ^ w1_t[3] ^ w1_t[1]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w1_t[1]); + w1_t[2] = rotl32 ((w0_t[3] ^ w3_t[2] ^ w2_t[0] ^ w1_t[2]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w1_t[2]); + w1_t[3] = rotl32 ((w1_t[0] ^ w3_t[3] ^ w2_t[1] ^ w1_t[3]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w1_t[3]); + w2_t[0] = rotl32 ((w1_t[1] ^ w0_t[0] ^ w2_t[2] ^ w2_t[0]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w2_t[0]); + w2_t[1] = rotl32 ((w1_t[2] ^ w0_t[1] ^ w2_t[3] ^ w2_t[1]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w2_t[1]); + w2_t[2] = rotl32 ((w1_t[3] ^ w0_t[2] ^ w3_t[0] ^ w2_t[2]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w2_t[2]); + w2_t[3] = rotl32 ((w2_t[0] ^ w0_t[3] ^ w3_t[1] ^ w2_t[3]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w2_t[3]); + w3_t[0] = rotl32 ((w2_t[1] ^ w1_t[0] ^ w3_t[2] ^ w3_t[0]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w3_t[0]); + w3_t[1] = rotl32 ((w2_t[2] ^ w1_t[1] ^ w3_t[3] ^ w3_t[1]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w3_t[1]); + w3_t[2] = rotl32 ((w2_t[3] ^ w1_t[2] ^ w0_t[0] ^ w3_t[2]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w3_t[2]); + w3_t[3] = rotl32 ((w3_t[0] ^ w1_t[3] ^ w0_t[1] ^ w3_t[3]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w3_t[3]); + + const u32x r0 = d; + const u32x r1 = e; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_M + } +} + +static void m00140s (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], const u32 pw_len, __global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset) +{ + /** + * modifier + */ + + const u32 gid = get_global_id (0); + const u32 lid = get_local_id (0); + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * reverse + */ + + const u32 e_rev = rotl32 (search[1], 2u); + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[ 1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[ 2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[ 3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[ 4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[ 5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[ 6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[ 7]; + + u32 salt_buf2[4]; + + salt_buf2[0] = 0; + salt_buf2[1] = 0; + salt_buf2[2] = 0; + salt_buf2[3] = 0; + + u32 salt_buf3[4]; + + salt_buf3[0] = 0; + salt_buf3[1] = 0; + salt_buf3[2] = 0; + salt_buf3[3] = 0; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + const u32 pw_salt_len = pw_len + salt_len; + + /** + * prepend salt + */ + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + w0_t[0] = swap_workaround (w0[0]); + w0_t[1] = swap_workaround (w0[1]); + w0_t[2] = swap_workaround (w0[2]); + w0_t[3] = swap_workaround (w0[3]); + w1_t[0] = swap_workaround (w1[0]); + w1_t[1] = swap_workaround (w1[1]); + w1_t[2] = swap_workaround (w1[2]); + w1_t[3] = swap_workaround (w1[3]); + w2_t[0] = swap_workaround (w2[0]); + w2_t[1] = swap_workaround (w2[1]); + w2_t[2] = swap_workaround (w2[2]); + w2_t[3] = swap_workaround (w2[3]); + w3_t[0] = swap_workaround (w3[0]); + w3_t[1] = swap_workaround (w3[1]); + w3_t[2] = swap_workaround (w3[2]); + w3_t[3] = swap_workaround (w3[3]); + + switch_buffer_by_offset (w0_t, w1_t, w2_t, w3_t, salt_len); + + w0_t[0] |= salt_buf0[0]; + w0_t[1] |= salt_buf0[1]; + w0_t[2] |= salt_buf0[2]; + w0_t[3] |= salt_buf0[3]; + w1_t[0] |= salt_buf1[0]; + w1_t[1] |= salt_buf1[1]; + w1_t[2] |= salt_buf1[2]; + w1_t[3] |= salt_buf1[3]; + w2_t[0] |= salt_buf2[0]; + w2_t[1] |= salt_buf2[1]; + w2_t[2] |= salt_buf2[2]; + w2_t[3] |= salt_buf2[3]; + w3_t[0] |= salt_buf3[0]; + w3_t[1] |= salt_buf3[1]; + w3_t[2] |= salt_buf3[2]; + w3_t[3] |= salt_buf3[3]; + + w0_t[0] = swap_workaround (w0_t[0]); + w0_t[1] = swap_workaround (w0_t[1]); + w0_t[2] = swap_workaround (w0_t[2]); + w0_t[3] = swap_workaround (w0_t[3]); + w1_t[0] = swap_workaround (w1_t[0]); + w1_t[1] = swap_workaround (w1_t[1]); + w1_t[2] = swap_workaround (w1_t[2]); + w1_t[3] = swap_workaround (w1_t[3]); + w2_t[0] = swap_workaround (w2_t[0]); + w2_t[1] = swap_workaround (w2_t[1]); + w2_t[2] = swap_workaround (w2_t[2]); + w2_t[3] = swap_workaround (w2_t[3]); + w3_t[0] = swap_workaround (w3_t[0]); + w3_t[1] = swap_workaround (w3_t[1]); + w3_t[2] = swap_workaround (w3_t[2]); + w3_t[3] = swap_workaround (w3_t[3]); + + /** + * loop + */ + + u32x w0l = w0[0]; + + for (u32 il_pos = 0; il_pos < bfs_cnt; il_pos++) + { + const u32 w0r = bfs_buf[il_pos].i; + + const u32x w0n = w0l | w0r; + + u32x wx[16]; + + wx[ 0] = w0_t[0]; + wx[ 1] = w0_t[1]; + wx[ 2] = w0_t[2]; + wx[ 3] = w0_t[3]; + wx[ 4] = w1_t[0]; + wx[ 5] = w1_t[1]; + wx[ 6] = w1_t[2]; + wx[ 7] = w1_t[3]; + wx[ 8] = w2_t[0]; + wx[ 9] = w2_t[1]; + wx[10] = w2_t[2]; + wx[11] = w2_t[3]; + wx[12] = w3_t[0]; + wx[13] = w3_t[1]; + wx[14] = w3_t[2]; + wx[15] = w3_t[3]; + + overwrite_at (wx, w0n, salt_len); + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + w0_t[0] = wx[ 0]; + w0_t[1] = wx[ 1]; + w0_t[2] = wx[ 2]; + w0_t[3] = wx[ 3]; + w1_t[0] = wx[ 4]; + w1_t[1] = wx[ 5]; + w1_t[2] = wx[ 6]; + w1_t[3] = wx[ 7]; + w2_t[0] = wx[ 8]; + w2_t[1] = wx[ 9]; + w2_t[2] = wx[10]; + w2_t[3] = wx[11]; + w3_t[0] = wx[12]; + w3_t[1] = wx[13]; + w3_t[2] = 0; + w3_t[3] = pw_salt_len * 8; + + /** + * sha1 + */ + + u32x a = SHA1M_A; + u32x b = SHA1M_B; + u32x c = SHA1M_C; + u32x d = SHA1M_D; + u32x e = SHA1M_E; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w0_t[0]); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w0_t[1]); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w0_t[2]); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w0_t[3]); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w1_t[0]); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w1_t[1]); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w1_t[2]); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w1_t[3]); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w2_t[0]); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w2_t[1]); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w2_t[2]); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w2_t[3]); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w3_t[0]); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w3_t[1]); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w3_t[2]); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w3_t[3]); + w0_t[0] = rotl32 ((w3_t[1] ^ w2_t[0] ^ w0_t[2] ^ w0_t[0]), 1u); SHA1_STEP (SHA1_F0o, e, a, b, c, d, w0_t[0]); + w0_t[1] = rotl32 ((w3_t[2] ^ w2_t[1] ^ w0_t[3] ^ w0_t[1]), 1u); SHA1_STEP (SHA1_F0o, d, e, a, b, c, w0_t[1]); + w0_t[2] = rotl32 ((w3_t[3] ^ w2_t[2] ^ w1_t[0] ^ w0_t[2]), 1u); SHA1_STEP (SHA1_F0o, c, d, e, a, b, w0_t[2]); + w0_t[3] = rotl32 ((w0_t[0] ^ w2_t[3] ^ w1_t[1] ^ w0_t[3]), 1u); SHA1_STEP (SHA1_F0o, b, c, d, e, a, w0_t[3]); + + #undef K + #define K SHA1C01 + + w1_t[0] = rotl32 ((w0_t[1] ^ w3_t[0] ^ w1_t[2] ^ w1_t[0]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w1_t[0]); + w1_t[1] = rotl32 ((w0_t[2] ^ w3_t[1] ^ w1_t[3] ^ w1_t[1]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w1_t[1]); + w1_t[2] = rotl32 ((w0_t[3] ^ w3_t[2] ^ w2_t[0] ^ w1_t[2]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w1_t[2]); + w1_t[3] = rotl32 ((w1_t[0] ^ w3_t[3] ^ w2_t[1] ^ w1_t[3]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1_t[3]); + w2_t[0] = rotl32 ((w1_t[1] ^ w0_t[0] ^ w2_t[2] ^ w2_t[0]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w2_t[0]); + w2_t[1] = rotl32 ((w1_t[2] ^ w0_t[1] ^ w2_t[3] ^ w2_t[1]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w2_t[1]); + w2_t[2] = rotl32 ((w1_t[3] ^ w0_t[2] ^ w3_t[0] ^ w2_t[2]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w2_t[2]); + w2_t[3] = rotl32 ((w2_t[0] ^ w0_t[3] ^ w3_t[1] ^ w2_t[3]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w2_t[3]); + w3_t[0] = rotl32 ((w2_t[1] ^ w1_t[0] ^ w3_t[2] ^ w3_t[0]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w3_t[0]); + w3_t[1] = rotl32 ((w2_t[2] ^ w1_t[1] ^ w3_t[3] ^ w3_t[1]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w3_t[1]); + w3_t[2] = rotl32 ((w2_t[3] ^ w1_t[2] ^ w0_t[0] ^ w3_t[2]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w3_t[2]); + w3_t[3] = rotl32 ((w3_t[0] ^ w1_t[3] ^ w0_t[1] ^ w3_t[3]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w3_t[3]); + w0_t[0] = rotl32 ((w3_t[1] ^ w2_t[0] ^ w0_t[2] ^ w0_t[0]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w0_t[0]); + w0_t[1] = rotl32 ((w3_t[2] ^ w2_t[1] ^ w0_t[3] ^ w0_t[1]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w0_t[1]); + w0_t[2] = rotl32 ((w3_t[3] ^ w2_t[2] ^ w1_t[0] ^ w0_t[2]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w0_t[2]); + w0_t[3] = rotl32 ((w0_t[0] ^ w2_t[3] ^ w1_t[1] ^ w0_t[3]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w0_t[3]); + w1_t[0] = rotl32 ((w0_t[1] ^ w3_t[0] ^ w1_t[2] ^ w1_t[0]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w1_t[0]); + w1_t[1] = rotl32 ((w0_t[2] ^ w3_t[1] ^ w1_t[3] ^ w1_t[1]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w1_t[1]); + w1_t[2] = rotl32 ((w0_t[3] ^ w3_t[2] ^ w2_t[0] ^ w1_t[2]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1_t[2]); + w1_t[3] = rotl32 ((w1_t[0] ^ w3_t[3] ^ w2_t[1] ^ w1_t[3]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w1_t[3]); + + #undef K + #define K SHA1C02 + + w2_t[0] = rotl32 ((w1_t[1] ^ w0_t[0] ^ w2_t[2] ^ w2_t[0]), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w2_t[0]); + w2_t[1] = rotl32 ((w1_t[2] ^ w0_t[1] ^ w2_t[3] ^ w2_t[1]), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w2_t[1]); + w2_t[2] = rotl32 ((w1_t[3] ^ w0_t[2] ^ w3_t[0] ^ w2_t[2]), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w2_t[2]); + w2_t[3] = rotl32 ((w2_t[0] ^ w0_t[3] ^ w3_t[1] ^ w2_t[3]), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w2_t[3]); + w3_t[0] = rotl32 ((w2_t[1] ^ w1_t[0] ^ w3_t[2] ^ w3_t[0]), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w3_t[0]); + w3_t[1] = rotl32 ((w2_t[2] ^ w1_t[1] ^ w3_t[3] ^ w3_t[1]), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w3_t[1]); + w3_t[2] = rotl32 ((w2_t[3] ^ w1_t[2] ^ w0_t[0] ^ w3_t[2]), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w3_t[2]); + w3_t[3] = rotl32 ((w3_t[0] ^ w1_t[3] ^ w0_t[1] ^ w3_t[3]), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w3_t[3]); + w0_t[0] = rotl32 ((w3_t[1] ^ w2_t[0] ^ w0_t[2] ^ w0_t[0]), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w0_t[0]); + w0_t[1] = rotl32 ((w3_t[2] ^ w2_t[1] ^ w0_t[3] ^ w0_t[1]), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w0_t[1]); + w0_t[2] = rotl32 ((w3_t[3] ^ w2_t[2] ^ w1_t[0] ^ w0_t[2]), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w0_t[2]); + w0_t[3] = rotl32 ((w0_t[0] ^ w2_t[3] ^ w1_t[1] ^ w0_t[3]), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w0_t[3]); + w1_t[0] = rotl32 ((w0_t[1] ^ w3_t[0] ^ w1_t[2] ^ w1_t[0]), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w1_t[0]); + w1_t[1] = rotl32 ((w0_t[2] ^ w3_t[1] ^ w1_t[3] ^ w1_t[1]), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w1_t[1]); + w1_t[2] = rotl32 ((w0_t[3] ^ w3_t[2] ^ w2_t[0] ^ w1_t[2]), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w1_t[2]); + w1_t[3] = rotl32 ((w1_t[0] ^ w3_t[3] ^ w2_t[1] ^ w1_t[3]), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w1_t[3]); + w2_t[0] = rotl32 ((w1_t[1] ^ w0_t[0] ^ w2_t[2] ^ w2_t[0]), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w2_t[0]); + w2_t[1] = rotl32 ((w1_t[2] ^ w0_t[1] ^ w2_t[3] ^ w2_t[1]), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w2_t[1]); + w2_t[2] = rotl32 ((w1_t[3] ^ w0_t[2] ^ w3_t[0] ^ w2_t[2]), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w2_t[2]); + w2_t[3] = rotl32 ((w2_t[0] ^ w0_t[3] ^ w3_t[1] ^ w2_t[3]), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w2_t[3]); + + #undef K + #define K SHA1C03 + + w3_t[0] = rotl32 ((w2_t[1] ^ w1_t[0] ^ w3_t[2] ^ w3_t[0]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w3_t[0]); + w3_t[1] = rotl32 ((w2_t[2] ^ w1_t[1] ^ w3_t[3] ^ w3_t[1]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w3_t[1]); + w3_t[2] = rotl32 ((w2_t[3] ^ w1_t[2] ^ w0_t[0] ^ w3_t[2]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w3_t[2]); + w3_t[3] = rotl32 ((w3_t[0] ^ w1_t[3] ^ w0_t[1] ^ w3_t[3]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w3_t[3]); + w0_t[0] = rotl32 ((w3_t[1] ^ w2_t[0] ^ w0_t[2] ^ w0_t[0]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w0_t[0]); + w0_t[1] = rotl32 ((w3_t[2] ^ w2_t[1] ^ w0_t[3] ^ w0_t[1]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w0_t[1]); + w0_t[2] = rotl32 ((w3_t[3] ^ w2_t[2] ^ w1_t[0] ^ w0_t[2]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w0_t[2]); + w0_t[3] = rotl32 ((w0_t[0] ^ w2_t[3] ^ w1_t[1] ^ w0_t[3]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w0_t[3]); + w1_t[0] = rotl32 ((w0_t[1] ^ w3_t[0] ^ w1_t[2] ^ w1_t[0]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1_t[0]); + w1_t[1] = rotl32 ((w0_t[2] ^ w3_t[1] ^ w1_t[3] ^ w1_t[1]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w1_t[1]); + w1_t[2] = rotl32 ((w0_t[3] ^ w3_t[2] ^ w2_t[0] ^ w1_t[2]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w1_t[2]); + w1_t[3] = rotl32 ((w1_t[0] ^ w3_t[3] ^ w2_t[1] ^ w1_t[3]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w1_t[3]); + w2_t[0] = rotl32 ((w1_t[1] ^ w0_t[0] ^ w2_t[2] ^ w2_t[0]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w2_t[0]); + w2_t[1] = rotl32 ((w1_t[2] ^ w0_t[1] ^ w2_t[3] ^ w2_t[1]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w2_t[1]); + w2_t[2] = rotl32 ((w1_t[3] ^ w0_t[2] ^ w3_t[0] ^ w2_t[2]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w2_t[2]); + w2_t[3] = rotl32 ((w2_t[0] ^ w0_t[3] ^ w3_t[1] ^ w2_t[3]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w2_t[3]); + w3_t[0] = rotl32 ((w2_t[1] ^ w1_t[0] ^ w3_t[2] ^ w3_t[0]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w3_t[0]); + + if (allx (e != e_rev)) continue; + + w3_t[1] = rotl32 ((w2_t[2] ^ w1_t[1] ^ w3_t[3] ^ w3_t[1]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w3_t[1]); + w3_t[2] = rotl32 ((w2_t[3] ^ w1_t[2] ^ w0_t[0] ^ w3_t[2]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w3_t[2]); + w3_t[3] = rotl32 ((w3_t[0] ^ w1_t[3] ^ w0_t[1] ^ w3_t[3]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w3_t[3]); + + + const u32x r0 = d; + const u32x r1 = e; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_S + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m00140_m04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m00140m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m00140_m08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m00140m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m00140_m16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = pws[gid].i[ 8]; + w2[1] = pws[gid].i[ 9]; + w2[2] = pws[gid].i[10]; + w2[3] = pws[gid].i[11]; + + u32x w3[4]; + + w3[0] = pws[gid].i[12]; + w3[1] = pws[gid].i[13]; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m00140m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m00140_s04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m00140s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m00140_s08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m00140s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m00140_s16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = pws[gid].i[ 8]; + w2[1] = pws[gid].i[ 9]; + w2[2] = pws[gid].i[10]; + w2[3] = pws[gid].i[11]; + + u32x w3[4]; + + w3[0] = pws[gid].i[12]; + w3[1] = pws[gid].i[13]; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m00140s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} diff --git a/amd/m00150_a0.cl b/amd/m00150_a0.cl new file mode 100644 index 0000000000..adf5cc7d33 --- /dev/null +++ b/amd/m00150_a0.cl @@ -0,0 +1,602 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _SHA1_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW4 +#define VECT_SIZE2 +#endif + +#ifdef VLIW5 +#define VECT_SIZE2 +#endif + +#define DGST_R0 3 +#define DGST_R1 4 +#define DGST_R2 2 +#define DGST_R3 1 + +#include "include/kernel_functions.c" +#include "types_amd.c" +#include "common_amd.c" +#include "include/rp_gpu.h" +#include "rp_amd.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +static void sha1_transform (const u32x w0[4], const u32x w1[4], const u32x w2[4], const u32x w3[4], u32x digest[5]) +{ + u32x A = digest[0]; + u32x B = digest[1]; + u32x C = digest[2]; + u32x D = digest[3]; + u32x E = digest[4]; + + u32x w0_t = w0[0]; + u32x w1_t = w0[1]; + u32x w2_t = w0[2]; + u32x w3_t = w0[3]; + u32x w4_t = w1[0]; + u32x w5_t = w1[1]; + u32x w6_t = w1[2]; + u32x w7_t = w1[3]; + u32x w8_t = w2[0]; + u32x w9_t = w2[1]; + u32x wa_t = w2[2]; + u32x wb_t = w2[3]; + u32x wc_t = w3[0]; + u32x wd_t = w3[1]; + u32x we_t = w3[2]; + u32x wf_t = w3[3]; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, A, B, C, D, E, w0_t); + SHA1_STEP (SHA1_F0o, E, A, B, C, D, w1_t); + SHA1_STEP (SHA1_F0o, D, E, A, B, C, w2_t); + SHA1_STEP (SHA1_F0o, C, D, E, A, B, w3_t); + SHA1_STEP (SHA1_F0o, B, C, D, E, A, w4_t); + SHA1_STEP (SHA1_F0o, A, B, C, D, E, w5_t); + SHA1_STEP (SHA1_F0o, E, A, B, C, D, w6_t); + SHA1_STEP (SHA1_F0o, D, E, A, B, C, w7_t); + SHA1_STEP (SHA1_F0o, C, D, E, A, B, w8_t); + SHA1_STEP (SHA1_F0o, B, C, D, E, A, w9_t); + SHA1_STEP (SHA1_F0o, A, B, C, D, E, wa_t); + SHA1_STEP (SHA1_F0o, E, A, B, C, D, wb_t); + SHA1_STEP (SHA1_F0o, D, E, A, B, C, wc_t); + SHA1_STEP (SHA1_F0o, C, D, E, A, B, wd_t); + SHA1_STEP (SHA1_F0o, B, C, D, E, A, we_t); + SHA1_STEP (SHA1_F0o, A, B, C, D, E, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F0o, E, A, B, C, D, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F0o, D, E, A, B, C, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F0o, C, D, E, A, B, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F0o, B, C, D, E, A, w3_t); + + #undef K + #define K SHA1C01 + + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w7_t); + + #undef K + #define K SHA1C02 + + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, wb_t); + + #undef K + #define K SHA1C03 + + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, wf_t); + + digest[0] += A; + digest[1] += B; + digest[2] += C; + digest[3] += D; + digest[4] += E; +} + +static void hmac_sha1_pad (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], u32x ipad[5], u32x opad[5]) +{ + w0[0] = w0[0] ^ 0x36363636; + w0[1] = w0[1] ^ 0x36363636; + w0[2] = w0[2] ^ 0x36363636; + w0[3] = w0[3] ^ 0x36363636; + w1[0] = w1[0] ^ 0x36363636; + w1[1] = w1[1] ^ 0x36363636; + w1[2] = w1[2] ^ 0x36363636; + w1[3] = w1[3] ^ 0x36363636; + w2[0] = w2[0] ^ 0x36363636; + w2[1] = w2[1] ^ 0x36363636; + w2[2] = w2[2] ^ 0x36363636; + w2[3] = w2[3] ^ 0x36363636; + w3[0] = w3[0] ^ 0x36363636; + w3[1] = w3[1] ^ 0x36363636; + w3[2] = w3[2] ^ 0x36363636; + w3[3] = w3[3] ^ 0x36363636; + + ipad[0] = SHA1M_A; + ipad[1] = SHA1M_B; + ipad[2] = SHA1M_C; + ipad[3] = SHA1M_D; + ipad[4] = SHA1M_E; + + sha1_transform (w0, w1, w2, w3, ipad); + + w0[0] = w0[0] ^ 0x6a6a6a6a; + w0[1] = w0[1] ^ 0x6a6a6a6a; + w0[2] = w0[2] ^ 0x6a6a6a6a; + w0[3] = w0[3] ^ 0x6a6a6a6a; + w1[0] = w1[0] ^ 0x6a6a6a6a; + w1[1] = w1[1] ^ 0x6a6a6a6a; + w1[2] = w1[2] ^ 0x6a6a6a6a; + w1[3] = w1[3] ^ 0x6a6a6a6a; + w2[0] = w2[0] ^ 0x6a6a6a6a; + w2[1] = w2[1] ^ 0x6a6a6a6a; + w2[2] = w2[2] ^ 0x6a6a6a6a; + w2[3] = w2[3] ^ 0x6a6a6a6a; + w3[0] = w3[0] ^ 0x6a6a6a6a; + w3[1] = w3[1] ^ 0x6a6a6a6a; + w3[2] = w3[2] ^ 0x6a6a6a6a; + w3[3] = w3[3] ^ 0x6a6a6a6a; + + opad[0] = SHA1M_A; + opad[1] = SHA1M_B; + opad[2] = SHA1M_C; + opad[3] = SHA1M_D; + opad[4] = SHA1M_E; + + sha1_transform (w0, w1, w2, w3, opad); +} + +static void hmac_sha1_run (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], u32x ipad[5], u32x opad[5], u32x digest[5]) +{ + digest[0] = ipad[0]; + digest[1] = ipad[1]; + digest[2] = ipad[2]; + digest[3] = ipad[3]; + digest[4] = ipad[4]; + + sha1_transform (w0, w1, w2, w3, digest); + + w0[0] = digest[0]; + w0[1] = digest[1]; + w0[2] = digest[2]; + w0[3] = digest[3]; + w1[0] = digest[4]; + w1[1] = 0x80000000; + w1[2] = 0; + w1[3] = 0; + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = (64 + 20) * 8; + + digest[0] = opad[0]; + digest[1] = opad[1]; + digest[2] = opad[2]; + digest[3] = opad[3]; + digest[4] = opad[4]; + + sha1_transform (w0, w1, w2, w3, digest); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m00150_m04 (__global pw_t *pws, __global gpu_rule_t * rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + u32x pw_buf1[4]; + + pw_buf1[0] = pws[gid].i[ 4]; + pw_buf1[1] = pws[gid].i[ 5]; + pw_buf1[2] = pws[gid].i[ 6]; + pw_buf1[3] = pws[gid].i[ 7]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[ 1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[ 2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[ 3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[ 4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[ 5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[ 6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[ 7]; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + + w0[0] = pw_buf0[0]; + w0[1] = pw_buf0[1]; + w0[2] = pw_buf0[2]; + w0[3] = pw_buf0[3]; + + u32x w1[4]; + + w1[0] = pw_buf1[0]; + w1[1] = pw_buf1[1]; + w1[2] = pw_buf1[2]; + w1[3] = pw_buf1[3]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 out_len = apply_rules (rules_buf[il_pos].cmds, w0, w1, pw_len); + + /** + * pads + */ + + u32x w0_t[4]; + + w0_t[0] = swap_workaround (w0[0]); + w0_t[1] = swap_workaround (w0[1]); + w0_t[2] = swap_workaround (w0[2]); + w0_t[3] = swap_workaround (w0[3]); + + u32x w1_t[4]; + + w1_t[0] = swap_workaround (w1[0]); + w1_t[1] = swap_workaround (w1[1]); + w1_t[2] = swap_workaround (w1[2]); + w1_t[3] = swap_workaround (w1[3]); + + u32x w2_t[4]; + + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + + u32x w3_t[4]; + + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = 0; + + u32x ipad[5]; + u32x opad[5]; + + hmac_sha1_pad (w0_t, w1_t, w2_t, w3_t, ipad, opad); + + w0_t[0] = swap_workaround (salt_buf0[0]); + w0_t[1] = swap_workaround (salt_buf0[1]); + w0_t[2] = swap_workaround (salt_buf0[2]); + w0_t[3] = swap_workaround (salt_buf0[3]); + w1_t[0] = swap_workaround (salt_buf1[0]); + w1_t[1] = swap_workaround (salt_buf1[1]); + w1_t[2] = swap_workaround (salt_buf1[2]); + w1_t[3] = swap_workaround (salt_buf1[3]); + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = (64 + salt_len) * 8; + + u32x digest[5]; + + hmac_sha1_run (w0_t, w1_t, w2_t, w3_t, ipad, opad, digest); + + const u32x r0 = digest[3]; + const u32x r1 = digest[4]; + const u32x r2 = digest[2]; + const u32x r3 = digest[1]; + + #include VECT_COMPARE_M + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m00150_m08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m00150_m16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m00150_s04 (__global pw_t *pws, __global gpu_rule_t * rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + u32x pw_buf1[4]; + + pw_buf1[0] = pws[gid].i[ 4]; + pw_buf1[1] = pws[gid].i[ 5]; + pw_buf1[2] = pws[gid].i[ 6]; + pw_buf1[3] = pws[gid].i[ 7]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[ 1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[ 2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[ 3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[ 4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[ 5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[ 6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[ 7]; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + + w0[0] = pw_buf0[0]; + w0[1] = pw_buf0[1]; + w0[2] = pw_buf0[2]; + w0[3] = pw_buf0[3]; + + u32x w1[4]; + + w1[0] = pw_buf1[0]; + w1[1] = pw_buf1[1]; + w1[2] = pw_buf1[2]; + w1[3] = pw_buf1[3]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 out_len = apply_rules (rules_buf[il_pos].cmds, w0, w1, pw_len); + + /** + * pads + */ + + u32x w0_t[4]; + + w0_t[0] = swap_workaround (w0[0]); + w0_t[1] = swap_workaround (w0[1]); + w0_t[2] = swap_workaround (w0[2]); + w0_t[3] = swap_workaround (w0[3]); + + u32x w1_t[4]; + + w1_t[0] = swap_workaround (w1[0]); + w1_t[1] = swap_workaround (w1[1]); + w1_t[2] = swap_workaround (w1[2]); + w1_t[3] = swap_workaround (w1[3]); + + u32x w2_t[4]; + + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + + u32x w3_t[4]; + + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = 0; + + u32x ipad[5]; + u32x opad[5]; + + hmac_sha1_pad (w0_t, w1_t, w2_t, w3_t, ipad, opad); + + w0_t[0] = swap_workaround (salt_buf0[0]); + w0_t[1] = swap_workaround (salt_buf0[1]); + w0_t[2] = swap_workaround (salt_buf0[2]); + w0_t[3] = swap_workaround (salt_buf0[3]); + w1_t[0] = swap_workaround (salt_buf1[0]); + w1_t[1] = swap_workaround (salt_buf1[1]); + w1_t[2] = swap_workaround (salt_buf1[2]); + w1_t[3] = swap_workaround (salt_buf1[3]); + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = (64 + salt_len) * 8; + + u32x digest[5]; + + hmac_sha1_run (w0_t, w1_t, w2_t, w3_t, ipad, opad, digest); + + const u32x r0 = digest[3]; + const u32x r1 = digest[4]; + const u32x r2 = digest[2]; + const u32x r3 = digest[1]; + + #include VECT_COMPARE_S + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m00150_s08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m00150_s16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/amd/m00150_a1.cl b/amd/m00150_a1.cl new file mode 100644 index 0000000000..a5dfc94ce8 --- /dev/null +++ b/amd/m00150_a1.cl @@ -0,0 +1,708 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _SHA1_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW4 +#define VECT_SIZE2 +#endif + +#ifdef VLIW5 +#define VECT_SIZE2 +#endif + +#define DGST_R0 3 +#define DGST_R1 4 +#define DGST_R2 2 +#define DGST_R3 1 + +#include "include/kernel_functions.c" +#include "types_amd.c" +#include "common_amd.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +static void sha1_transform (const u32x w0[4], const u32x w1[4], const u32x w2[4], const u32x w3[4], u32x digest[5]) +{ + u32x A = digest[0]; + u32x B = digest[1]; + u32x C = digest[2]; + u32x D = digest[3]; + u32x E = digest[4]; + + u32x w0_t = w0[0]; + u32x w1_t = w0[1]; + u32x w2_t = w0[2]; + u32x w3_t = w0[3]; + u32x w4_t = w1[0]; + u32x w5_t = w1[1]; + u32x w6_t = w1[2]; + u32x w7_t = w1[3]; + u32x w8_t = w2[0]; + u32x w9_t = w2[1]; + u32x wa_t = w2[2]; + u32x wb_t = w2[3]; + u32x wc_t = w3[0]; + u32x wd_t = w3[1]; + u32x we_t = w3[2]; + u32x wf_t = w3[3]; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, A, B, C, D, E, w0_t); + SHA1_STEP (SHA1_F0o, E, A, B, C, D, w1_t); + SHA1_STEP (SHA1_F0o, D, E, A, B, C, w2_t); + SHA1_STEP (SHA1_F0o, C, D, E, A, B, w3_t); + SHA1_STEP (SHA1_F0o, B, C, D, E, A, w4_t); + SHA1_STEP (SHA1_F0o, A, B, C, D, E, w5_t); + SHA1_STEP (SHA1_F0o, E, A, B, C, D, w6_t); + SHA1_STEP (SHA1_F0o, D, E, A, B, C, w7_t); + SHA1_STEP (SHA1_F0o, C, D, E, A, B, w8_t); + SHA1_STEP (SHA1_F0o, B, C, D, E, A, w9_t); + SHA1_STEP (SHA1_F0o, A, B, C, D, E, wa_t); + SHA1_STEP (SHA1_F0o, E, A, B, C, D, wb_t); + SHA1_STEP (SHA1_F0o, D, E, A, B, C, wc_t); + SHA1_STEP (SHA1_F0o, C, D, E, A, B, wd_t); + SHA1_STEP (SHA1_F0o, B, C, D, E, A, we_t); + SHA1_STEP (SHA1_F0o, A, B, C, D, E, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F0o, E, A, B, C, D, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F0o, D, E, A, B, C, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F0o, C, D, E, A, B, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F0o, B, C, D, E, A, w3_t); + + #undef K + #define K SHA1C01 + + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w7_t); + + #undef K + #define K SHA1C02 + + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, wb_t); + + #undef K + #define K SHA1C03 + + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, wf_t); + + digest[0] += A; + digest[1] += B; + digest[2] += C; + digest[3] += D; + digest[4] += E; +} + +static void hmac_sha1_pad (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], u32x ipad[5], u32x opad[5]) +{ + w0[0] = w0[0] ^ 0x36363636; + w0[1] = w0[1] ^ 0x36363636; + w0[2] = w0[2] ^ 0x36363636; + w0[3] = w0[3] ^ 0x36363636; + w1[0] = w1[0] ^ 0x36363636; + w1[1] = w1[1] ^ 0x36363636; + w1[2] = w1[2] ^ 0x36363636; + w1[3] = w1[3] ^ 0x36363636; + w2[0] = w2[0] ^ 0x36363636; + w2[1] = w2[1] ^ 0x36363636; + w2[2] = w2[2] ^ 0x36363636; + w2[3] = w2[3] ^ 0x36363636; + w3[0] = w3[0] ^ 0x36363636; + w3[1] = w3[1] ^ 0x36363636; + w3[2] = w3[2] ^ 0x36363636; + w3[3] = w3[3] ^ 0x36363636; + + ipad[0] = SHA1M_A; + ipad[1] = SHA1M_B; + ipad[2] = SHA1M_C; + ipad[3] = SHA1M_D; + ipad[4] = SHA1M_E; + + sha1_transform (w0, w1, w2, w3, ipad); + + w0[0] = w0[0] ^ 0x6a6a6a6a; + w0[1] = w0[1] ^ 0x6a6a6a6a; + w0[2] = w0[2] ^ 0x6a6a6a6a; + w0[3] = w0[3] ^ 0x6a6a6a6a; + w1[0] = w1[0] ^ 0x6a6a6a6a; + w1[1] = w1[1] ^ 0x6a6a6a6a; + w1[2] = w1[2] ^ 0x6a6a6a6a; + w1[3] = w1[3] ^ 0x6a6a6a6a; + w2[0] = w2[0] ^ 0x6a6a6a6a; + w2[1] = w2[1] ^ 0x6a6a6a6a; + w2[2] = w2[2] ^ 0x6a6a6a6a; + w2[3] = w2[3] ^ 0x6a6a6a6a; + w3[0] = w3[0] ^ 0x6a6a6a6a; + w3[1] = w3[1] ^ 0x6a6a6a6a; + w3[2] = w3[2] ^ 0x6a6a6a6a; + w3[3] = w3[3] ^ 0x6a6a6a6a; + + opad[0] = SHA1M_A; + opad[1] = SHA1M_B; + opad[2] = SHA1M_C; + opad[3] = SHA1M_D; + opad[4] = SHA1M_E; + + sha1_transform (w0, w1, w2, w3, opad); +} + +static void hmac_sha1_run (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], u32x ipad[5], u32x opad[5], u32x digest[5]) +{ + digest[0] = ipad[0]; + digest[1] = ipad[1]; + digest[2] = ipad[2]; + digest[3] = ipad[3]; + digest[4] = ipad[4]; + + sha1_transform (w0, w1, w2, w3, digest); + + w0[0] = digest[0]; + w0[1] = digest[1]; + w0[2] = digest[2]; + w0[3] = digest[3]; + w1[0] = digest[4]; + w1[1] = 0x80000000; + w1[2] = 0; + w1[3] = 0; + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = (64 + 20) * 8; + + digest[0] = opad[0]; + digest[1] = opad[1]; + digest[2] = opad[2]; + digest[3] = opad[3]; + digest[4] = opad[4]; + + sha1_transform (w0, w1, w2, w3, digest); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m00150_m04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, combs_buf[0].pw_len); + } + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[ 1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[ 2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[ 3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[ 4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[ 5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[ 6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[ 7]; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = combs_buf[il_pos].pw_len; + + const u32 pw_len = pw_l_len + pw_r_len; + + u32 wordr0[4]; + + wordr0[0] = combs_buf[il_pos].i[0]; + wordr0[1] = combs_buf[il_pos].i[1]; + wordr0[2] = combs_buf[il_pos].i[2]; + wordr0[3] = combs_buf[il_pos].i[3]; + + u32 wordr1[4]; + + wordr1[0] = combs_buf[il_pos].i[4]; + wordr1[1] = combs_buf[il_pos].i[5]; + wordr1[2] = combs_buf[il_pos].i[6]; + wordr1[3] = combs_buf[il_pos].i[7]; + + u32 wordr2[4]; + + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + + u32 wordr3[4]; + + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + u32x w0[4]; + + w0[0] = wordl0[0] | wordr0[0]; + w0[1] = wordl0[1] | wordr0[1]; + w0[2] = wordl0[2] | wordr0[2]; + w0[3] = wordl0[3] | wordr0[3]; + + u32x w1[4]; + + w1[0] = wordl1[0] | wordr1[0]; + w1[1] = wordl1[1] | wordr1[1]; + w1[2] = wordl1[2] | wordr1[2]; + w1[3] = wordl1[3] | wordr1[3]; + + u32x w2[4]; + + w2[0] = wordl2[0] | wordr2[0]; + w2[1] = wordl2[1] | wordr2[1]; + w2[2] = wordl2[2] | wordr2[2]; + w2[3] = wordl2[3] | wordr2[3]; + + u32x w3[4]; + + w3[0] = wordl3[0] | wordr3[0]; + w3[1] = wordl3[1] | wordr3[1]; + w3[2] = wordl3[2] | wordr3[2]; + w3[3] = wordl3[3] | wordr3[3]; + + /** + * pads + */ + + u32x w0_t[4]; + + w0_t[0] = swap_workaround (w0[0]); + w0_t[1] = swap_workaround (w0[1]); + w0_t[2] = swap_workaround (w0[2]); + w0_t[3] = swap_workaround (w0[3]); + + u32x w1_t[4]; + + w1_t[0] = swap_workaround (w1[0]); + w1_t[1] = swap_workaround (w1[1]); + w1_t[2] = swap_workaround (w1[2]); + w1_t[3] = swap_workaround (w1[3]); + + u32x w2_t[4]; + + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + + u32x w3_t[4]; + + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = 0; + + u32x ipad[5]; + u32x opad[5]; + + hmac_sha1_pad (w0_t, w1_t, w2_t, w3_t, ipad, opad); + + w0_t[0] = swap_workaround (salt_buf0[0]); + w0_t[1] = swap_workaround (salt_buf0[1]); + w0_t[2] = swap_workaround (salt_buf0[2]); + w0_t[3] = swap_workaround (salt_buf0[3]); + w1_t[0] = swap_workaround (salt_buf1[0]); + w1_t[1] = swap_workaround (salt_buf1[1]); + w1_t[2] = swap_workaround (salt_buf1[2]); + w1_t[3] = swap_workaround (salt_buf1[3]); + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = (64 + salt_len) * 8; + + u32x digest[5]; + + hmac_sha1_run (w0_t, w1_t, w2_t, w3_t, ipad, opad, digest); + + const u32x r0 = digest[3]; + const u32x r1 = digest[4]; + const u32x r2 = digest[2]; + const u32x r3 = digest[1]; + + #include VECT_COMPARE_M + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m00150_m08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m00150_m16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m00150_s04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, combs_buf[0].pw_len); + } + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[ 1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[ 2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[ 3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[ 4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[ 5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[ 6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[ 7]; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = combs_buf[il_pos].pw_len; + + const u32 pw_len = pw_l_len + pw_r_len; + + u32 wordr0[4]; + + wordr0[0] = combs_buf[il_pos].i[0]; + wordr0[1] = combs_buf[il_pos].i[1]; + wordr0[2] = combs_buf[il_pos].i[2]; + wordr0[3] = combs_buf[il_pos].i[3]; + + u32 wordr1[4]; + + wordr1[0] = combs_buf[il_pos].i[4]; + wordr1[1] = combs_buf[il_pos].i[5]; + wordr1[2] = combs_buf[il_pos].i[6]; + wordr1[3] = combs_buf[il_pos].i[7]; + + u32 wordr2[4]; + + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + + u32 wordr3[4]; + + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + u32x w0[4]; + + w0[0] = wordl0[0] | wordr0[0]; + w0[1] = wordl0[1] | wordr0[1]; + w0[2] = wordl0[2] | wordr0[2]; + w0[3] = wordl0[3] | wordr0[3]; + + u32x w1[4]; + + w1[0] = wordl1[0] | wordr1[0]; + w1[1] = wordl1[1] | wordr1[1]; + w1[2] = wordl1[2] | wordr1[2]; + w1[3] = wordl1[3] | wordr1[3]; + + u32x w2[4]; + + w2[0] = wordl2[0] | wordr2[0]; + w2[1] = wordl2[1] | wordr2[1]; + w2[2] = wordl2[2] | wordr2[2]; + w2[3] = wordl2[3] | wordr2[3]; + + u32x w3[4]; + + w3[0] = wordl3[0] | wordr3[0]; + w3[1] = wordl3[1] | wordr3[1]; + w3[2] = wordl3[2] | wordr3[2]; + w3[3] = wordl3[3] | wordr3[3]; + + /** + * pads + */ + + u32x w0_t[4]; + + w0_t[0] = swap_workaround (w0[0]); + w0_t[1] = swap_workaround (w0[1]); + w0_t[2] = swap_workaround (w0[2]); + w0_t[3] = swap_workaround (w0[3]); + + u32x w1_t[4]; + + w1_t[0] = swap_workaround (w1[0]); + w1_t[1] = swap_workaround (w1[1]); + w1_t[2] = swap_workaround (w1[2]); + w1_t[3] = swap_workaround (w1[3]); + + u32x w2_t[4]; + + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + + u32x w3_t[4]; + + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = 0; + + u32x ipad[5]; + u32x opad[5]; + + hmac_sha1_pad (w0_t, w1_t, w2_t, w3_t, ipad, opad); + + w0_t[0] = swap_workaround (salt_buf0[0]); + w0_t[1] = swap_workaround (salt_buf0[1]); + w0_t[2] = swap_workaround (salt_buf0[2]); + w0_t[3] = swap_workaround (salt_buf0[3]); + w1_t[0] = swap_workaround (salt_buf1[0]); + w1_t[1] = swap_workaround (salt_buf1[1]); + w1_t[2] = swap_workaround (salt_buf1[2]); + w1_t[3] = swap_workaround (salt_buf1[3]); + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = (64 + salt_len) * 8; + + u32x digest[5]; + + hmac_sha1_run (w0_t, w1_t, w2_t, w3_t, ipad, opad, digest); + + const u32x r0 = digest[3]; + const u32x r1 = digest[4]; + const u32x r2 = digest[2]; + const u32x r3 = digest[1]; + + #include VECT_COMPARE_S + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m00150_s08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m00150_s16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/amd/m00150_a3.cl b/amd/m00150_a3.cl new file mode 100644 index 0000000000..ef3d594f36 --- /dev/null +++ b/amd/m00150_a3.cl @@ -0,0 +1,772 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _SHA1_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW4 +#define VECT_SIZE2 +#endif + +#ifdef VLIW5 +#define VECT_SIZE2 +#endif + +#define DGST_R0 3 +#define DGST_R1 4 +#define DGST_R2 2 +#define DGST_R3 1 + +#include "include/kernel_functions.c" +#include "types_amd.c" +#include "common_amd.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +static void sha1_transform (const u32x w0[4], const u32x w1[4], const u32x w2[4], const u32x w3[4], u32x digest[5]) +{ + u32x A = digest[0]; + u32x B = digest[1]; + u32x C = digest[2]; + u32x D = digest[3]; + u32x E = digest[4]; + + u32x w0_t = w0[0]; + u32x w1_t = w0[1]; + u32x w2_t = w0[2]; + u32x w3_t = w0[3]; + u32x w4_t = w1[0]; + u32x w5_t = w1[1]; + u32x w6_t = w1[2]; + u32x w7_t = w1[3]; + u32x w8_t = w2[0]; + u32x w9_t = w2[1]; + u32x wa_t = w2[2]; + u32x wb_t = w2[3]; + u32x wc_t = w3[0]; + u32x wd_t = w3[1]; + u32x we_t = w3[2]; + u32x wf_t = w3[3]; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, A, B, C, D, E, w0_t); + SHA1_STEP (SHA1_F0o, E, A, B, C, D, w1_t); + SHA1_STEP (SHA1_F0o, D, E, A, B, C, w2_t); + SHA1_STEP (SHA1_F0o, C, D, E, A, B, w3_t); + SHA1_STEP (SHA1_F0o, B, C, D, E, A, w4_t); + SHA1_STEP (SHA1_F0o, A, B, C, D, E, w5_t); + SHA1_STEP (SHA1_F0o, E, A, B, C, D, w6_t); + SHA1_STEP (SHA1_F0o, D, E, A, B, C, w7_t); + SHA1_STEP (SHA1_F0o, C, D, E, A, B, w8_t); + SHA1_STEP (SHA1_F0o, B, C, D, E, A, w9_t); + SHA1_STEP (SHA1_F0o, A, B, C, D, E, wa_t); + SHA1_STEP (SHA1_F0o, E, A, B, C, D, wb_t); + SHA1_STEP (SHA1_F0o, D, E, A, B, C, wc_t); + SHA1_STEP (SHA1_F0o, C, D, E, A, B, wd_t); + SHA1_STEP (SHA1_F0o, B, C, D, E, A, we_t); + SHA1_STEP (SHA1_F0o, A, B, C, D, E, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F0o, E, A, B, C, D, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F0o, D, E, A, B, C, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F0o, C, D, E, A, B, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F0o, B, C, D, E, A, w3_t); + + #undef K + #define K SHA1C01 + + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w7_t); + + #undef K + #define K SHA1C02 + + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, wb_t); + + #undef K + #define K SHA1C03 + + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, wf_t); + + digest[0] += A; + digest[1] += B; + digest[2] += C; + digest[3] += D; + digest[4] += E; +} + +static void hmac_sha1_pad (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], u32x ipad[5], u32x opad[5]) +{ + w0[0] = w0[0] ^ 0x36363636; + w0[1] = w0[1] ^ 0x36363636; + w0[2] = w0[2] ^ 0x36363636; + w0[3] = w0[3] ^ 0x36363636; + w1[0] = w1[0] ^ 0x36363636; + w1[1] = w1[1] ^ 0x36363636; + w1[2] = w1[2] ^ 0x36363636; + w1[3] = w1[3] ^ 0x36363636; + w2[0] = w2[0] ^ 0x36363636; + w2[1] = w2[1] ^ 0x36363636; + w2[2] = w2[2] ^ 0x36363636; + w2[3] = w2[3] ^ 0x36363636; + w3[0] = w3[0] ^ 0x36363636; + w3[1] = w3[1] ^ 0x36363636; + w3[2] = w3[2] ^ 0x36363636; + w3[3] = w3[3] ^ 0x36363636; + + ipad[0] = SHA1M_A; + ipad[1] = SHA1M_B; + ipad[2] = SHA1M_C; + ipad[3] = SHA1M_D; + ipad[4] = SHA1M_E; + + sha1_transform (w0, w1, w2, w3, ipad); + + w0[0] = w0[0] ^ 0x6a6a6a6a; + w0[1] = w0[1] ^ 0x6a6a6a6a; + w0[2] = w0[2] ^ 0x6a6a6a6a; + w0[3] = w0[3] ^ 0x6a6a6a6a; + w1[0] = w1[0] ^ 0x6a6a6a6a; + w1[1] = w1[1] ^ 0x6a6a6a6a; + w1[2] = w1[2] ^ 0x6a6a6a6a; + w1[3] = w1[3] ^ 0x6a6a6a6a; + w2[0] = w2[0] ^ 0x6a6a6a6a; + w2[1] = w2[1] ^ 0x6a6a6a6a; + w2[2] = w2[2] ^ 0x6a6a6a6a; + w2[3] = w2[3] ^ 0x6a6a6a6a; + w3[0] = w3[0] ^ 0x6a6a6a6a; + w3[1] = w3[1] ^ 0x6a6a6a6a; + w3[2] = w3[2] ^ 0x6a6a6a6a; + w3[3] = w3[3] ^ 0x6a6a6a6a; + + opad[0] = SHA1M_A; + opad[1] = SHA1M_B; + opad[2] = SHA1M_C; + opad[3] = SHA1M_D; + opad[4] = SHA1M_E; + + sha1_transform (w0, w1, w2, w3, opad); +} + +static void hmac_sha1_run (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], u32x ipad[5], u32x opad[5], u32x digest[5]) +{ + digest[0] = ipad[0]; + digest[1] = ipad[1]; + digest[2] = ipad[2]; + digest[3] = ipad[3]; + digest[4] = ipad[4]; + + sha1_transform (w0, w1, w2, w3, digest); + + w0[0] = digest[0]; + w0[1] = digest[1]; + w0[2] = digest[2]; + w0[3] = digest[3]; + w1[0] = digest[4]; + w1[1] = 0x80000000; + w1[2] = 0; + w1[3] = 0; + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = (64 + 20) * 8; + + digest[0] = opad[0]; + digest[1] = opad[1]; + digest[2] = opad[2]; + digest[3] = opad[3]; + digest[4] = opad[4]; + + sha1_transform (w0, w1, w2, w3, digest); +} + +static void m00150m (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], const u32 pw_len, __global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset) +{ + /** + * modifier + */ + + const u32 gid = get_global_id (0); + const u32 lid = get_local_id (0); + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[ 1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[ 2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[ 3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[ 4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[ 5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[ 6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[ 7]; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + /** + * loop + */ + + u32x w0l = w0[0]; + + for (u32 il_pos = 0; il_pos < bfs_cnt; il_pos++) + { + const u32 w0r = bfs_buf[il_pos].i; + + w0[0] = w0l | w0r; + + /** + * pads + */ + + u32x w0_t[4]; + + w0_t[0] = w0[0]; + w0_t[1] = w0[1]; + w0_t[2] = w0[2]; + w0_t[3] = w0[3]; + + u32x w1_t[4]; + + w1_t[0] = w1[0]; + w1_t[1] = w1[1]; + w1_t[2] = w1[2]; + w1_t[3] = w1[3]; + + u32x w2_t[4]; + + w2_t[0] = w2[0]; + w2_t[1] = w2[1]; + w2_t[2] = w2[2]; + w2_t[3] = w2[3]; + + u32x w3_t[4]; + + w3_t[0] = w3[0]; + w3_t[1] = w3[1]; + w3_t[2] = 0; + w3_t[3] = 0; + + u32x ipad[5]; + u32x opad[5]; + + hmac_sha1_pad (w0_t, w1_t, w2_t, w3_t, ipad, opad); + + w0_t[0] = swap_workaround (salt_buf0[0]); + w0_t[1] = swap_workaround (salt_buf0[1]); + w0_t[2] = swap_workaround (salt_buf0[2]); + w0_t[3] = swap_workaround (salt_buf0[3]); + w1_t[0] = swap_workaround (salt_buf1[0]); + w1_t[1] = swap_workaround (salt_buf1[1]); + w1_t[2] = swap_workaround (salt_buf1[2]); + w1_t[3] = swap_workaround (salt_buf1[3]); + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = (64 + salt_len) * 8; + + u32x digest[5]; + + hmac_sha1_run (w0_t, w1_t, w2_t, w3_t, ipad, opad, digest); + + const u32x r0 = digest[3]; + const u32x r1 = digest[4]; + const u32x r2 = digest[2]; + const u32x r3 = digest[1]; + + #include VECT_COMPARE_M + } +} + +static void m00150s (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], const u32 pw_len, __global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset) +{ + /** + * modifier + */ + + const u32 gid = get_global_id (0); + const u32 lid = get_local_id (0); + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[ 1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[ 2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[ 3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[ 4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[ 5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[ 6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[ 7]; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * loop + */ + + u32x w0l = w0[0]; + + for (u32 il_pos = 0; il_pos < bfs_cnt; il_pos++) + { + const u32 w0r = bfs_buf[il_pos].i; + + w0[0] = w0l | w0r; + + /** + * pads + */ + + u32x w0_t[4]; + + w0_t[0] = w0[0]; + w0_t[1] = w0[1]; + w0_t[2] = w0[2]; + w0_t[3] = w0[3]; + + u32x w1_t[4]; + + w1_t[0] = w1[0]; + w1_t[1] = w1[1]; + w1_t[2] = w1[2]; + w1_t[3] = w1[3]; + + u32x w2_t[4]; + + w2_t[0] = w2[0]; + w2_t[1] = w2[1]; + w2_t[2] = w2[2]; + w2_t[3] = w2[3]; + + u32x w3_t[4]; + + w3_t[0] = w3[0]; + w3_t[1] = w3[1]; + w3_t[2] = 0; + w3_t[3] = 0; + + u32x ipad[5]; + u32x opad[5]; + + hmac_sha1_pad (w0_t, w1_t, w2_t, w3_t, ipad, opad); + + w0_t[0] = swap_workaround (salt_buf0[0]); + w0_t[1] = swap_workaround (salt_buf0[1]); + w0_t[2] = swap_workaround (salt_buf0[2]); + w0_t[3] = swap_workaround (salt_buf0[3]); + w1_t[0] = swap_workaround (salt_buf1[0]); + w1_t[1] = swap_workaround (salt_buf1[1]); + w1_t[2] = swap_workaround (salt_buf1[2]); + w1_t[3] = swap_workaround (salt_buf1[3]); + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = (64 + salt_len) * 8; + + u32x digest[5]; + + hmac_sha1_run (w0_t, w1_t, w2_t, w3_t, ipad, opad, digest); + + const u32x r0 = digest[3]; + const u32x r1 = digest[4]; + const u32x r2 = digest[2]; + const u32x r3 = digest[1]; + + #include VECT_COMPARE_S + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m00150_m04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m00150m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m00150_m08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m00150m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m00150_m16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = pws[gid].i[ 8]; + w2[1] = pws[gid].i[ 9]; + w2[2] = pws[gid].i[10]; + w2[3] = pws[gid].i[11]; + + u32x w3[4]; + + w3[0] = pws[gid].i[12]; + w3[1] = pws[gid].i[13]; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m00150m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m00150_s04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m00150s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m00150_s08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m00150s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m00150_s16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = pws[gid].i[ 8]; + w2[1] = pws[gid].i[ 9]; + w2[2] = pws[gid].i[10]; + w2[3] = pws[gid].i[11]; + + u32x w3[4]; + + w3[0] = pws[gid].i[12]; + w3[1] = pws[gid].i[13]; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m00150s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} diff --git a/amd/m00160_a0.cl b/amd/m00160_a0.cl new file mode 100644 index 0000000000..bdb8887f76 --- /dev/null +++ b/amd/m00160_a0.cl @@ -0,0 +1,602 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _SHA1_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW4 +#define VECT_SIZE2 +#endif + +#ifdef VLIW5 +#define VECT_SIZE2 +#endif + +#define DGST_R0 3 +#define DGST_R1 4 +#define DGST_R2 2 +#define DGST_R3 1 + +#include "include/kernel_functions.c" +#include "types_amd.c" +#include "common_amd.c" +#include "include/rp_gpu.h" +#include "rp_amd.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +static void sha1_transform (const u32x w0[4], const u32x w1[4], const u32x w2[4], const u32x w3[4], u32x digest[5]) +{ + u32x A = digest[0]; + u32x B = digest[1]; + u32x C = digest[2]; + u32x D = digest[3]; + u32x E = digest[4]; + + u32x w0_t = w0[0]; + u32x w1_t = w0[1]; + u32x w2_t = w0[2]; + u32x w3_t = w0[3]; + u32x w4_t = w1[0]; + u32x w5_t = w1[1]; + u32x w6_t = w1[2]; + u32x w7_t = w1[3]; + u32x w8_t = w2[0]; + u32x w9_t = w2[1]; + u32x wa_t = w2[2]; + u32x wb_t = w2[3]; + u32x wc_t = w3[0]; + u32x wd_t = w3[1]; + u32x we_t = w3[2]; + u32x wf_t = w3[3]; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, A, B, C, D, E, w0_t); + SHA1_STEP (SHA1_F0o, E, A, B, C, D, w1_t); + SHA1_STEP (SHA1_F0o, D, E, A, B, C, w2_t); + SHA1_STEP (SHA1_F0o, C, D, E, A, B, w3_t); + SHA1_STEP (SHA1_F0o, B, C, D, E, A, w4_t); + SHA1_STEP (SHA1_F0o, A, B, C, D, E, w5_t); + SHA1_STEP (SHA1_F0o, E, A, B, C, D, w6_t); + SHA1_STEP (SHA1_F0o, D, E, A, B, C, w7_t); + SHA1_STEP (SHA1_F0o, C, D, E, A, B, w8_t); + SHA1_STEP (SHA1_F0o, B, C, D, E, A, w9_t); + SHA1_STEP (SHA1_F0o, A, B, C, D, E, wa_t); + SHA1_STEP (SHA1_F0o, E, A, B, C, D, wb_t); + SHA1_STEP (SHA1_F0o, D, E, A, B, C, wc_t); + SHA1_STEP (SHA1_F0o, C, D, E, A, B, wd_t); + SHA1_STEP (SHA1_F0o, B, C, D, E, A, we_t); + SHA1_STEP (SHA1_F0o, A, B, C, D, E, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F0o, E, A, B, C, D, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F0o, D, E, A, B, C, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F0o, C, D, E, A, B, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F0o, B, C, D, E, A, w3_t); + + #undef K + #define K SHA1C01 + + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w7_t); + + #undef K + #define K SHA1C02 + + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, wb_t); + + #undef K + #define K SHA1C03 + + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, wf_t); + + digest[0] += A; + digest[1] += B; + digest[2] += C; + digest[3] += D; + digest[4] += E; +} + +static void hmac_sha1_pad (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], u32x ipad[5], u32x opad[5]) +{ + w0[0] = w0[0] ^ 0x36363636; + w0[1] = w0[1] ^ 0x36363636; + w0[2] = w0[2] ^ 0x36363636; + w0[3] = w0[3] ^ 0x36363636; + w1[0] = w1[0] ^ 0x36363636; + w1[1] = w1[1] ^ 0x36363636; + w1[2] = w1[2] ^ 0x36363636; + w1[3] = w1[3] ^ 0x36363636; + w2[0] = w2[0] ^ 0x36363636; + w2[1] = w2[1] ^ 0x36363636; + w2[2] = w2[2] ^ 0x36363636; + w2[3] = w2[3] ^ 0x36363636; + w3[0] = w3[0] ^ 0x36363636; + w3[1] = w3[1] ^ 0x36363636; + w3[2] = w3[2] ^ 0x36363636; + w3[3] = w3[3] ^ 0x36363636; + + ipad[0] = SHA1M_A; + ipad[1] = SHA1M_B; + ipad[2] = SHA1M_C; + ipad[3] = SHA1M_D; + ipad[4] = SHA1M_E; + + sha1_transform (w0, w1, w2, w3, ipad); + + w0[0] = w0[0] ^ 0x6a6a6a6a; + w0[1] = w0[1] ^ 0x6a6a6a6a; + w0[2] = w0[2] ^ 0x6a6a6a6a; + w0[3] = w0[3] ^ 0x6a6a6a6a; + w1[0] = w1[0] ^ 0x6a6a6a6a; + w1[1] = w1[1] ^ 0x6a6a6a6a; + w1[2] = w1[2] ^ 0x6a6a6a6a; + w1[3] = w1[3] ^ 0x6a6a6a6a; + w2[0] = w2[0] ^ 0x6a6a6a6a; + w2[1] = w2[1] ^ 0x6a6a6a6a; + w2[2] = w2[2] ^ 0x6a6a6a6a; + w2[3] = w2[3] ^ 0x6a6a6a6a; + w3[0] = w3[0] ^ 0x6a6a6a6a; + w3[1] = w3[1] ^ 0x6a6a6a6a; + w3[2] = w3[2] ^ 0x6a6a6a6a; + w3[3] = w3[3] ^ 0x6a6a6a6a; + + opad[0] = SHA1M_A; + opad[1] = SHA1M_B; + opad[2] = SHA1M_C; + opad[3] = SHA1M_D; + opad[4] = SHA1M_E; + + sha1_transform (w0, w1, w2, w3, opad); +} + +static void hmac_sha1_run (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], u32x ipad[5], u32x opad[5], u32x digest[5]) +{ + digest[0] = ipad[0]; + digest[1] = ipad[1]; + digest[2] = ipad[2]; + digest[3] = ipad[3]; + digest[4] = ipad[4]; + + sha1_transform (w0, w1, w2, w3, digest); + + w0[0] = digest[0]; + w0[1] = digest[1]; + w0[2] = digest[2]; + w0[3] = digest[3]; + w1[0] = digest[4]; + w1[1] = 0x80000000; + w1[2] = 0; + w1[3] = 0; + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = (64 + 20) * 8; + + digest[0] = opad[0]; + digest[1] = opad[1]; + digest[2] = opad[2]; + digest[3] = opad[3]; + digest[4] = opad[4]; + + sha1_transform (w0, w1, w2, w3, digest); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m00160_m04 (__global pw_t *pws, __global gpu_rule_t * rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + u32x pw_buf1[4]; + + pw_buf1[0] = pws[gid].i[ 4]; + pw_buf1[1] = pws[gid].i[ 5]; + pw_buf1[2] = pws[gid].i[ 6]; + pw_buf1[3] = pws[gid].i[ 7]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[ 1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[ 2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[ 3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[ 4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[ 5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[ 6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[ 7]; + + /** + * pads + */ + + u32x w0_t[4]; + + w0_t[0] = swap_workaround (salt_buf0[0]); + w0_t[1] = swap_workaround (salt_buf0[1]); + w0_t[2] = swap_workaround (salt_buf0[2]); + w0_t[3] = swap_workaround (salt_buf0[3]); + + u32x w1_t[4]; + + w1_t[0] = swap_workaround (salt_buf1[0]); + w1_t[1] = swap_workaround (salt_buf1[1]); + w1_t[2] = swap_workaround (salt_buf1[2]); + w1_t[3] = swap_workaround (salt_buf1[3]); + + u32x w2_t[4]; + + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + + u32x w3_t[4]; + + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = 0; + + u32x ipad[5]; + u32x opad[5]; + + hmac_sha1_pad (w0_t, w1_t, w2_t, w3_t, ipad, opad); + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + + w0[0] = pw_buf0[0]; + w0[1] = pw_buf0[1]; + w0[2] = pw_buf0[2]; + w0[3] = pw_buf0[3]; + + u32x w1[4]; + + w1[0] = pw_buf1[0]; + w1[1] = pw_buf1[1]; + w1[2] = pw_buf1[2]; + w1[3] = pw_buf1[3]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 out_len = apply_rules (rules_buf[il_pos].cmds, w0, w1, pw_len); + + append_0x80_2 (w0, w1, out_len); + + w0_t[0] = swap_workaround (w0[0]); + w0_t[1] = swap_workaround (w0[1]); + w0_t[2] = swap_workaround (w0[2]); + w0_t[3] = swap_workaround (w0[3]); + w1_t[0] = swap_workaround (w1[0]); + w1_t[1] = swap_workaround (w1[1]); + w1_t[2] = swap_workaround (w1[2]); + w1_t[3] = swap_workaround (w1[3]); + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = (64 + out_len) * 8; + + u32x digest[5]; + + hmac_sha1_run (w0_t, w1_t, w2_t, w3_t, ipad, opad, digest); + + const u32x r0 = digest[3]; + const u32x r1 = digest[4]; + const u32x r2 = digest[2]; + const u32x r3 = digest[1]; + + #include VECT_COMPARE_M + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m00160_m08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m00160_m16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m00160_s04 (__global pw_t *pws, __global gpu_rule_t * rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + u32x pw_buf1[4]; + + pw_buf1[0] = pws[gid].i[ 4]; + pw_buf1[1] = pws[gid].i[ 5]; + pw_buf1[2] = pws[gid].i[ 6]; + pw_buf1[3] = pws[gid].i[ 7]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[ 1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[ 2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[ 3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[ 4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[ 5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[ 6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[ 7]; + + /** + * pads + */ + + u32x w0_t[4]; + + w0_t[0] = swap_workaround (salt_buf0[0]); + w0_t[1] = swap_workaround (salt_buf0[1]); + w0_t[2] = swap_workaround (salt_buf0[2]); + w0_t[3] = swap_workaround (salt_buf0[3]); + + u32x w1_t[4]; + + w1_t[0] = swap_workaround (salt_buf1[0]); + w1_t[1] = swap_workaround (salt_buf1[1]); + w1_t[2] = swap_workaround (salt_buf1[2]); + w1_t[3] = swap_workaround (salt_buf1[3]); + + u32x w2_t[4]; + + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + + u32x w3_t[4]; + + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = 0; + + u32x ipad[5]; + u32x opad[5]; + + hmac_sha1_pad (w0_t, w1_t, w2_t, w3_t, ipad, opad); + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + + w0[0] = pw_buf0[0]; + w0[1] = pw_buf0[1]; + w0[2] = pw_buf0[2]; + w0[3] = pw_buf0[3]; + + u32x w1[4]; + + w1[0] = pw_buf1[0]; + w1[1] = pw_buf1[1]; + w1[2] = pw_buf1[2]; + w1[3] = pw_buf1[3]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 out_len = apply_rules (rules_buf[il_pos].cmds, w0, w1, pw_len); + + append_0x80_2 (w0, w1, out_len); + + w0_t[0] = swap_workaround (w0[0]); + w0_t[1] = swap_workaround (w0[1]); + w0_t[2] = swap_workaround (w0[2]); + w0_t[3] = swap_workaround (w0[3]); + w1_t[0] = swap_workaround (w1[0]); + w1_t[1] = swap_workaround (w1[1]); + w1_t[2] = swap_workaround (w1[2]); + w1_t[3] = swap_workaround (w1[3]); + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = (64 + out_len) * 8; + + u32x digest[5]; + + hmac_sha1_run (w0_t, w1_t, w2_t, w3_t, ipad, opad, digest); + + const u32x r0 = digest[3]; + const u32x r1 = digest[4]; + const u32x r2 = digest[2]; + const u32x r3 = digest[1]; + + #include VECT_COMPARE_S + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m00160_s08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m00160_s16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/amd/m00160_a1.cl b/amd/m00160_a1.cl new file mode 100644 index 0000000000..dc27cdf4f0 --- /dev/null +++ b/amd/m00160_a1.cl @@ -0,0 +1,708 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _SHA1_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW4 +#define VECT_SIZE2 +#endif + +#ifdef VLIW5 +#define VECT_SIZE2 +#endif + +#define DGST_R0 3 +#define DGST_R1 4 +#define DGST_R2 2 +#define DGST_R3 1 + +#include "include/kernel_functions.c" +#include "types_amd.c" +#include "common_amd.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +static void sha1_transform (const u32x w0[4], const u32x w1[4], const u32x w2[4], const u32x w3[4], u32x digest[5]) +{ + u32x A = digest[0]; + u32x B = digest[1]; + u32x C = digest[2]; + u32x D = digest[3]; + u32x E = digest[4]; + + u32x w0_t = w0[0]; + u32x w1_t = w0[1]; + u32x w2_t = w0[2]; + u32x w3_t = w0[3]; + u32x w4_t = w1[0]; + u32x w5_t = w1[1]; + u32x w6_t = w1[2]; + u32x w7_t = w1[3]; + u32x w8_t = w2[0]; + u32x w9_t = w2[1]; + u32x wa_t = w2[2]; + u32x wb_t = w2[3]; + u32x wc_t = w3[0]; + u32x wd_t = w3[1]; + u32x we_t = w3[2]; + u32x wf_t = w3[3]; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, A, B, C, D, E, w0_t); + SHA1_STEP (SHA1_F0o, E, A, B, C, D, w1_t); + SHA1_STEP (SHA1_F0o, D, E, A, B, C, w2_t); + SHA1_STEP (SHA1_F0o, C, D, E, A, B, w3_t); + SHA1_STEP (SHA1_F0o, B, C, D, E, A, w4_t); + SHA1_STEP (SHA1_F0o, A, B, C, D, E, w5_t); + SHA1_STEP (SHA1_F0o, E, A, B, C, D, w6_t); + SHA1_STEP (SHA1_F0o, D, E, A, B, C, w7_t); + SHA1_STEP (SHA1_F0o, C, D, E, A, B, w8_t); + SHA1_STEP (SHA1_F0o, B, C, D, E, A, w9_t); + SHA1_STEP (SHA1_F0o, A, B, C, D, E, wa_t); + SHA1_STEP (SHA1_F0o, E, A, B, C, D, wb_t); + SHA1_STEP (SHA1_F0o, D, E, A, B, C, wc_t); + SHA1_STEP (SHA1_F0o, C, D, E, A, B, wd_t); + SHA1_STEP (SHA1_F0o, B, C, D, E, A, we_t); + SHA1_STEP (SHA1_F0o, A, B, C, D, E, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F0o, E, A, B, C, D, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F0o, D, E, A, B, C, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F0o, C, D, E, A, B, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F0o, B, C, D, E, A, w3_t); + + #undef K + #define K SHA1C01 + + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w7_t); + + #undef K + #define K SHA1C02 + + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, wb_t); + + #undef K + #define K SHA1C03 + + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, wf_t); + + digest[0] += A; + digest[1] += B; + digest[2] += C; + digest[3] += D; + digest[4] += E; +} + +static void hmac_sha1_pad (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], u32x ipad[5], u32x opad[5]) +{ + w0[0] = w0[0] ^ 0x36363636; + w0[1] = w0[1] ^ 0x36363636; + w0[2] = w0[2] ^ 0x36363636; + w0[3] = w0[3] ^ 0x36363636; + w1[0] = w1[0] ^ 0x36363636; + w1[1] = w1[1] ^ 0x36363636; + w1[2] = w1[2] ^ 0x36363636; + w1[3] = w1[3] ^ 0x36363636; + w2[0] = w2[0] ^ 0x36363636; + w2[1] = w2[1] ^ 0x36363636; + w2[2] = w2[2] ^ 0x36363636; + w2[3] = w2[3] ^ 0x36363636; + w3[0] = w3[0] ^ 0x36363636; + w3[1] = w3[1] ^ 0x36363636; + w3[2] = w3[2] ^ 0x36363636; + w3[3] = w3[3] ^ 0x36363636; + + ipad[0] = SHA1M_A; + ipad[1] = SHA1M_B; + ipad[2] = SHA1M_C; + ipad[3] = SHA1M_D; + ipad[4] = SHA1M_E; + + sha1_transform (w0, w1, w2, w3, ipad); + + w0[0] = w0[0] ^ 0x6a6a6a6a; + w0[1] = w0[1] ^ 0x6a6a6a6a; + w0[2] = w0[2] ^ 0x6a6a6a6a; + w0[3] = w0[3] ^ 0x6a6a6a6a; + w1[0] = w1[0] ^ 0x6a6a6a6a; + w1[1] = w1[1] ^ 0x6a6a6a6a; + w1[2] = w1[2] ^ 0x6a6a6a6a; + w1[3] = w1[3] ^ 0x6a6a6a6a; + w2[0] = w2[0] ^ 0x6a6a6a6a; + w2[1] = w2[1] ^ 0x6a6a6a6a; + w2[2] = w2[2] ^ 0x6a6a6a6a; + w2[3] = w2[3] ^ 0x6a6a6a6a; + w3[0] = w3[0] ^ 0x6a6a6a6a; + w3[1] = w3[1] ^ 0x6a6a6a6a; + w3[2] = w3[2] ^ 0x6a6a6a6a; + w3[3] = w3[3] ^ 0x6a6a6a6a; + + opad[0] = SHA1M_A; + opad[1] = SHA1M_B; + opad[2] = SHA1M_C; + opad[3] = SHA1M_D; + opad[4] = SHA1M_E; + + sha1_transform (w0, w1, w2, w3, opad); +} + +static void hmac_sha1_run (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], u32x ipad[5], u32x opad[5], u32x digest[5]) +{ + digest[0] = ipad[0]; + digest[1] = ipad[1]; + digest[2] = ipad[2]; + digest[3] = ipad[3]; + digest[4] = ipad[4]; + + sha1_transform (w0, w1, w2, w3, digest); + + w0[0] = digest[0]; + w0[1] = digest[1]; + w0[2] = digest[2]; + w0[3] = digest[3]; + w1[0] = digest[4]; + w1[1] = 0x80000000; + w1[2] = 0; + w1[3] = 0; + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = (64 + 20) * 8; + + digest[0] = opad[0]; + digest[1] = opad[1]; + digest[2] = opad[2]; + digest[3] = opad[3]; + digest[4] = opad[4]; + + sha1_transform (w0, w1, w2, w3, digest); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m00160_m04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, combs_buf[0].pw_len); + } + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[ 1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[ 2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[ 3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[ 4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[ 5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[ 6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[ 7]; + + /** + * pads + */ + + u32x w0_t[4]; + + w0_t[0] = swap_workaround (salt_buf0[0]); + w0_t[1] = swap_workaround (salt_buf0[1]); + w0_t[2] = swap_workaround (salt_buf0[2]); + w0_t[3] = swap_workaround (salt_buf0[3]); + + u32x w1_t[4]; + + w1_t[0] = swap_workaround (salt_buf1[0]); + w1_t[1] = swap_workaround (salt_buf1[1]); + w1_t[2] = swap_workaround (salt_buf1[2]); + w1_t[3] = swap_workaround (salt_buf1[3]); + + u32x w2_t[4]; + + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + + u32x w3_t[4]; + + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = 0; + + u32x ipad[5]; + u32x opad[5]; + + hmac_sha1_pad (w0_t, w1_t, w2_t, w3_t, ipad, opad); + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = combs_buf[il_pos].pw_len; + + const u32 pw_len = pw_l_len + pw_r_len; + + u32 wordr0[4]; + + wordr0[0] = combs_buf[il_pos].i[0]; + wordr0[1] = combs_buf[il_pos].i[1]; + wordr0[2] = combs_buf[il_pos].i[2]; + wordr0[3] = combs_buf[il_pos].i[3]; + + u32 wordr1[4]; + + wordr1[0] = combs_buf[il_pos].i[4]; + wordr1[1] = combs_buf[il_pos].i[5]; + wordr1[2] = combs_buf[il_pos].i[6]; + wordr1[3] = combs_buf[il_pos].i[7]; + + u32 wordr2[4]; + + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + + u32 wordr3[4]; + + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + u32x w0[4]; + + w0[0] = wordl0[0] | wordr0[0]; + w0[1] = wordl0[1] | wordr0[1]; + w0[2] = wordl0[2] | wordr0[2]; + w0[3] = wordl0[3] | wordr0[3]; + + u32x w1[4]; + + w1[0] = wordl1[0] | wordr1[0]; + w1[1] = wordl1[1] | wordr1[1]; + w1[2] = wordl1[2] | wordr1[2]; + w1[3] = wordl1[3] | wordr1[3]; + + u32x w2[4]; + + w2[0] = wordl2[0] | wordr2[0]; + w2[1] = wordl2[1] | wordr2[1]; + w2[2] = wordl2[2] | wordr2[2]; + w2[3] = wordl2[3] | wordr2[3]; + + u32x w3[4]; + + w3[0] = wordl3[0] | wordr3[0]; + w3[1] = wordl3[1] | wordr3[1]; + w3[2] = 0; + w3[3] = 0; + + append_0x80_4 (w0, w1, w2, w3, pw_len); + + w0_t[0] = swap_workaround (w0[0]); + w0_t[1] = swap_workaround (w0[1]); + w0_t[2] = swap_workaround (w0[2]); + w0_t[3] = swap_workaround (w0[3]); + w1_t[0] = swap_workaround (w1[0]); + w1_t[1] = swap_workaround (w1[1]); + w1_t[2] = swap_workaround (w1[2]); + w1_t[3] = swap_workaround (w1[3]); + w2_t[0] = swap_workaround (w2[0]); + w2_t[1] = swap_workaround (w2[1]); + w2_t[2] = swap_workaround (w2[2]); + w2_t[3] = swap_workaround (w2[3]); + w3_t[0] = swap_workaround (w3[0]); + w3_t[1] = swap_workaround (w3[1]); + w3_t[2] = 0; + w3_t[3] = (64 + pw_len) * 8; + + u32x digest[5]; + + hmac_sha1_run (w0_t, w1_t, w2_t, w3_t, ipad, opad, digest); + + const u32x r0 = digest[3]; + const u32x r1 = digest[4]; + const u32x r2 = digest[2]; + const u32x r3 = digest[1]; + + #include VECT_COMPARE_M + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m00160_m08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m00160_m16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m00160_s04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, combs_buf[0].pw_len); + } + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[ 1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[ 2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[ 3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[ 4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[ 5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[ 6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[ 7]; + + /** + * pads + */ + + u32x w0_t[4]; + + w0_t[0] = swap_workaround (salt_buf0[0]); + w0_t[1] = swap_workaround (salt_buf0[1]); + w0_t[2] = swap_workaround (salt_buf0[2]); + w0_t[3] = swap_workaround (salt_buf0[3]); + + u32x w1_t[4]; + + w1_t[0] = swap_workaround (salt_buf1[0]); + w1_t[1] = swap_workaround (salt_buf1[1]); + w1_t[2] = swap_workaround (salt_buf1[2]); + w1_t[3] = swap_workaround (salt_buf1[3]); + + u32x w2_t[4]; + + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + + u32x w3_t[4]; + + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = 0; + + u32x ipad[5]; + u32x opad[5]; + + hmac_sha1_pad (w0_t, w1_t, w2_t, w3_t, ipad, opad); + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = combs_buf[il_pos].pw_len; + + const u32 pw_len = pw_l_len + pw_r_len; + + u32 wordr0[4]; + + wordr0[0] = combs_buf[il_pos].i[0]; + wordr0[1] = combs_buf[il_pos].i[1]; + wordr0[2] = combs_buf[il_pos].i[2]; + wordr0[3] = combs_buf[il_pos].i[3]; + + u32 wordr1[4]; + + wordr1[0] = combs_buf[il_pos].i[4]; + wordr1[1] = combs_buf[il_pos].i[5]; + wordr1[2] = combs_buf[il_pos].i[6]; + wordr1[3] = combs_buf[il_pos].i[7]; + + u32 wordr2[4]; + + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + + u32 wordr3[4]; + + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + u32x w0[4]; + + w0[0] = wordl0[0] | wordr0[0]; + w0[1] = wordl0[1] | wordr0[1]; + w0[2] = wordl0[2] | wordr0[2]; + w0[3] = wordl0[3] | wordr0[3]; + + u32x w1[4]; + + w1[0] = wordl1[0] | wordr1[0]; + w1[1] = wordl1[1] | wordr1[1]; + w1[2] = wordl1[2] | wordr1[2]; + w1[3] = wordl1[3] | wordr1[3]; + + u32x w2[4]; + + w2[0] = wordl2[0] | wordr2[0]; + w2[1] = wordl2[1] | wordr2[1]; + w2[2] = wordl2[2] | wordr2[2]; + w2[3] = wordl2[3] | wordr2[3]; + + u32x w3[4]; + + w3[0] = wordl3[0] | wordr3[0]; + w3[1] = wordl3[1] | wordr3[1]; + w3[2] = 0; + w3[3] = 0; + + append_0x80_4 (w0, w1, w2, w3, pw_len); + + w0_t[0] = swap_workaround (w0[0]); + w0_t[1] = swap_workaround (w0[1]); + w0_t[2] = swap_workaround (w0[2]); + w0_t[3] = swap_workaround (w0[3]); + w1_t[0] = swap_workaround (w1[0]); + w1_t[1] = swap_workaround (w1[1]); + w1_t[2] = swap_workaround (w1[2]); + w1_t[3] = swap_workaround (w1[3]); + w2_t[0] = swap_workaround (w2[0]); + w2_t[1] = swap_workaround (w2[1]); + w2_t[2] = swap_workaround (w2[2]); + w2_t[3] = swap_workaround (w2[3]); + w3_t[0] = swap_workaround (w3[0]); + w3_t[1] = swap_workaround (w3[1]); + w3_t[2] = 0; + w3_t[3] = (64 + pw_len) * 8; + + u32x digest[5]; + + hmac_sha1_run (w0_t, w1_t, w2_t, w3_t, ipad, opad, digest); + + const u32x r0 = digest[3]; + const u32x r1 = digest[4]; + const u32x r2 = digest[2]; + const u32x r3 = digest[1]; + + #include VECT_COMPARE_S + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m00160_s08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m00160_s16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/amd/m00160_a3.cl b/amd/m00160_a3.cl new file mode 100644 index 0000000000..3dfd322281 --- /dev/null +++ b/amd/m00160_a3.cl @@ -0,0 +1,768 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _SHA1_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW4 +#define VECT_SIZE2 +#endif + +#ifdef VLIW5 +#define VECT_SIZE2 +#endif + +#define DGST_R0 3 +#define DGST_R1 4 +#define DGST_R2 2 +#define DGST_R3 1 + +#include "include/kernel_functions.c" +#include "types_amd.c" +#include "common_amd.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +static void sha1_transform (const u32x w0[4], const u32x w1[4], const u32x w2[4], const u32x w3[4], u32x digest[5]) +{ + u32x A = digest[0]; + u32x B = digest[1]; + u32x C = digest[2]; + u32x D = digest[3]; + u32x E = digest[4]; + + u32x w0_t = w0[0]; + u32x w1_t = w0[1]; + u32x w2_t = w0[2]; + u32x w3_t = w0[3]; + u32x w4_t = w1[0]; + u32x w5_t = w1[1]; + u32x w6_t = w1[2]; + u32x w7_t = w1[3]; + u32x w8_t = w2[0]; + u32x w9_t = w2[1]; + u32x wa_t = w2[2]; + u32x wb_t = w2[3]; + u32x wc_t = w3[0]; + u32x wd_t = w3[1]; + u32x we_t = w3[2]; + u32x wf_t = w3[3]; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, A, B, C, D, E, w0_t); + SHA1_STEP (SHA1_F0o, E, A, B, C, D, w1_t); + SHA1_STEP (SHA1_F0o, D, E, A, B, C, w2_t); + SHA1_STEP (SHA1_F0o, C, D, E, A, B, w3_t); + SHA1_STEP (SHA1_F0o, B, C, D, E, A, w4_t); + SHA1_STEP (SHA1_F0o, A, B, C, D, E, w5_t); + SHA1_STEP (SHA1_F0o, E, A, B, C, D, w6_t); + SHA1_STEP (SHA1_F0o, D, E, A, B, C, w7_t); + SHA1_STEP (SHA1_F0o, C, D, E, A, B, w8_t); + SHA1_STEP (SHA1_F0o, B, C, D, E, A, w9_t); + SHA1_STEP (SHA1_F0o, A, B, C, D, E, wa_t); + SHA1_STEP (SHA1_F0o, E, A, B, C, D, wb_t); + SHA1_STEP (SHA1_F0o, D, E, A, B, C, wc_t); + SHA1_STEP (SHA1_F0o, C, D, E, A, B, wd_t); + SHA1_STEP (SHA1_F0o, B, C, D, E, A, we_t); + SHA1_STEP (SHA1_F0o, A, B, C, D, E, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F0o, E, A, B, C, D, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F0o, D, E, A, B, C, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F0o, C, D, E, A, B, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F0o, B, C, D, E, A, w3_t); + + #undef K + #define K SHA1C01 + + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w7_t); + + #undef K + #define K SHA1C02 + + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, wb_t); + + #undef K + #define K SHA1C03 + + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, wf_t); + + digest[0] += A; + digest[1] += B; + digest[2] += C; + digest[3] += D; + digest[4] += E; +} + +static void hmac_sha1_pad (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], u32x ipad[5], u32x opad[5]) +{ + w0[0] = w0[0] ^ 0x36363636; + w0[1] = w0[1] ^ 0x36363636; + w0[2] = w0[2] ^ 0x36363636; + w0[3] = w0[3] ^ 0x36363636; + w1[0] = w1[0] ^ 0x36363636; + w1[1] = w1[1] ^ 0x36363636; + w1[2] = w1[2] ^ 0x36363636; + w1[3] = w1[3] ^ 0x36363636; + w2[0] = w2[0] ^ 0x36363636; + w2[1] = w2[1] ^ 0x36363636; + w2[2] = w2[2] ^ 0x36363636; + w2[3] = w2[3] ^ 0x36363636; + w3[0] = w3[0] ^ 0x36363636; + w3[1] = w3[1] ^ 0x36363636; + w3[2] = w3[2] ^ 0x36363636; + w3[3] = w3[3] ^ 0x36363636; + + ipad[0] = SHA1M_A; + ipad[1] = SHA1M_B; + ipad[2] = SHA1M_C; + ipad[3] = SHA1M_D; + ipad[4] = SHA1M_E; + + sha1_transform (w0, w1, w2, w3, ipad); + + w0[0] = w0[0] ^ 0x6a6a6a6a; + w0[1] = w0[1] ^ 0x6a6a6a6a; + w0[2] = w0[2] ^ 0x6a6a6a6a; + w0[3] = w0[3] ^ 0x6a6a6a6a; + w1[0] = w1[0] ^ 0x6a6a6a6a; + w1[1] = w1[1] ^ 0x6a6a6a6a; + w1[2] = w1[2] ^ 0x6a6a6a6a; + w1[3] = w1[3] ^ 0x6a6a6a6a; + w2[0] = w2[0] ^ 0x6a6a6a6a; + w2[1] = w2[1] ^ 0x6a6a6a6a; + w2[2] = w2[2] ^ 0x6a6a6a6a; + w2[3] = w2[3] ^ 0x6a6a6a6a; + w3[0] = w3[0] ^ 0x6a6a6a6a; + w3[1] = w3[1] ^ 0x6a6a6a6a; + w3[2] = w3[2] ^ 0x6a6a6a6a; + w3[3] = w3[3] ^ 0x6a6a6a6a; + + opad[0] = SHA1M_A; + opad[1] = SHA1M_B; + opad[2] = SHA1M_C; + opad[3] = SHA1M_D; + opad[4] = SHA1M_E; + + sha1_transform (w0, w1, w2, w3, opad); +} + +static void hmac_sha1_run (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], u32x ipad[5], u32x opad[5], u32x digest[5]) +{ + digest[0] = ipad[0]; + digest[1] = ipad[1]; + digest[2] = ipad[2]; + digest[3] = ipad[3]; + digest[4] = ipad[4]; + + sha1_transform (w0, w1, w2, w3, digest); + + w0[0] = digest[0]; + w0[1] = digest[1]; + w0[2] = digest[2]; + w0[3] = digest[3]; + w1[0] = digest[4]; + w1[1] = 0x80000000; + w1[2] = 0; + w1[3] = 0; + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = (64 + 20) * 8; + + digest[0] = opad[0]; + digest[1] = opad[1]; + digest[2] = opad[2]; + digest[3] = opad[3]; + digest[4] = opad[4]; + + sha1_transform (w0, w1, w2, w3, digest); +} + +static void m00160m (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], const u32 pw_len, __global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esal_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset) +{ + /** + * modifier + */ + + const u32 gid = get_global_id (0); + const u32 lid = get_local_id (0); + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[ 1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[ 2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[ 3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[ 4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[ 5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[ 6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[ 7]; + + /** + * pads + */ + + u32x w0_t[4]; + + w0_t[0] = swap_workaround (salt_buf0[0]); + w0_t[1] = swap_workaround (salt_buf0[1]); + w0_t[2] = swap_workaround (salt_buf0[2]); + w0_t[3] = swap_workaround (salt_buf0[3]); + + u32x w1_t[4]; + + w1_t[0] = swap_workaround (salt_buf1[0]); + w1_t[1] = swap_workaround (salt_buf1[1]); + w1_t[2] = swap_workaround (salt_buf1[2]); + w1_t[3] = swap_workaround (salt_buf1[3]); + + u32x w2_t[4]; + + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + + u32x w3_t[4]; + + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = 0; + + u32x ipad[5]; + u32x opad[5]; + + hmac_sha1_pad (w0_t, w1_t, w2_t, w3_t, ipad, opad); + + /** + * loop + */ + + u32x w0l = w0[0]; + + for (u32 il_pos = 0; il_pos < bfs_cnt; il_pos++) + { + const u32 w0r = bfs_buf[il_pos].i; + + w0[0] = w0l | w0r; + + w0_t[0] = w0[0]; + w0_t[1] = w0[1]; + w0_t[2] = w0[2]; + w0_t[3] = w0[3]; + w1_t[0] = w1[0]; + w1_t[1] = w1[1]; + w1_t[2] = w1[2]; + w1_t[3] = w1[3]; + w2_t[0] = w2[0]; + w2_t[1] = w2[1]; + w2_t[2] = w2[2]; + w2_t[3] = w2[3]; + w3_t[0] = w3[0]; + w3_t[1] = w3[1]; + w3_t[2] = 0; + w3_t[3] = (64 + pw_len) * 8; + + u32x digest[5]; + + hmac_sha1_run (w0_t, w1_t, w2_t, w3_t, ipad, opad, digest); + + const u32x r0 = digest[3]; + const u32x r1 = digest[4]; + const u32x r2 = digest[2]; + const u32x r3 = digest[1]; + + #include VECT_COMPARE_M + } +} + +static void m00160s (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], const u32 pw_len, __global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset) +{ + /** + * modifier + */ + + const u32 gid = get_global_id (0); + const u32 lid = get_local_id (0); + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[ 1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[ 2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[ 3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[ 4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[ 5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[ 6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[ 7]; + + /** + * pads + */ + + u32x w0_t[4]; + + w0_t[0] = swap_workaround (salt_buf0[0]); + w0_t[1] = swap_workaround (salt_buf0[1]); + w0_t[2] = swap_workaround (salt_buf0[2]); + w0_t[3] = swap_workaround (salt_buf0[3]); + + u32x w1_t[4]; + + w1_t[0] = swap_workaround (salt_buf1[0]); + w1_t[1] = swap_workaround (salt_buf1[1]); + w1_t[2] = swap_workaround (salt_buf1[2]); + w1_t[3] = swap_workaround (salt_buf1[3]); + + u32x w2_t[4]; + + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + + u32x w3_t[4]; + + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = 0; + + u32x ipad[5]; + u32x opad[5]; + + hmac_sha1_pad (w0_t, w1_t, w2_t, w3_t, ipad, opad); + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * loop + */ + + u32x w0l = w0[0]; + + for (u32 il_pos = 0; il_pos < bfs_cnt; il_pos++) + { + const u32 w0r = bfs_buf[il_pos].i; + + w0[0] = w0l | w0r; + + w0_t[0] = w0[0]; + w0_t[1] = w0[1]; + w0_t[2] = w0[2]; + w0_t[3] = w0[3]; + w1_t[0] = w1[0]; + w1_t[1] = w1[1]; + w1_t[2] = w1[2]; + w1_t[3] = w1[3]; + w2_t[0] = w2[0]; + w2_t[1] = w2[1]; + w2_t[2] = w2[2]; + w2_t[3] = w2[3]; + w3_t[0] = w3[0]; + w3_t[1] = w3[1]; + w3_t[2] = 0; + w3_t[3] = (64 + pw_len) * 8; + + u32x digest[5]; + + hmac_sha1_run (w0_t, w1_t, w2_t, w3_t, ipad, opad, digest); + + const u32x r0 = digest[3]; + const u32x r1 = digest[4]; + const u32x r2 = digest[2]; + const u32x r3 = digest[1]; + + #include VECT_COMPARE_S + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m00160_m04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m00160m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m00160_m08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m00160m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m00160_m16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = pws[gid].i[ 8]; + w2[1] = pws[gid].i[ 9]; + w2[2] = pws[gid].i[10]; + w2[3] = pws[gid].i[11]; + + u32x w3[4]; + + w3[0] = pws[gid].i[12]; + w3[1] = pws[gid].i[13]; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m00160m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m00160_s04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m00160s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m00160_s08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m00160s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m00160_s16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = pws[gid].i[ 8]; + w2[1] = pws[gid].i[ 9]; + w2[2] = pws[gid].i[10]; + w2[3] = pws[gid].i[11]; + + u32x w3[4]; + + w3[0] = pws[gid].i[12]; + w3[1] = pws[gid].i[13]; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m00160s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} diff --git a/amd/m00190_a0.cl b/amd/m00190_a0.cl new file mode 100644 index 0000000000..aeb98d613f --- /dev/null +++ b/amd/m00190_a0.cl @@ -0,0 +1,515 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _SHA1_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW4 +#define VECT_SIZE4 +#endif + +#ifdef VLIW5 +#define VECT_SIZE4 +#endif + +#define DGST_R0 0 +#define DGST_R1 4 +#define DGST_R2 3 +#define DGST_R3 2 + +#include "include/kernel_functions.c" +#include "types_amd.c" +#include "common_amd.c" +#include "include/rp_gpu.h" +#include "rp_amd.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m00190_m04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + u32x pw_buf1[4]; + + pw_buf1[0] = pws[gid].i[ 4]; + pw_buf1[1] = pws[gid].i[ 5]; + pw_buf1[2] = pws[gid].i[ 6]; + pw_buf1[3] = pws[gid].i[ 7]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + + w0[0] = pw_buf0[0]; + w0[1] = pw_buf0[1]; + w0[2] = pw_buf0[2]; + w0[3] = pw_buf0[3]; + + u32x w1[4]; + + w1[0] = pw_buf1[0]; + w1[1] = pw_buf1[1]; + w1[2] = pw_buf1[2]; + w1[3] = pw_buf1[3]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 out_len = apply_rules (rules_buf[il_pos].cmds, w0, w1, pw_len); + + append_0x80_2 (w0, w1, out_len); + + /** + * sha1 + */ + + u32x w0_t = swap_workaround (w0[0]); + u32x w1_t = swap_workaround (w0[1]); + u32x w2_t = swap_workaround (w0[2]); + u32x w3_t = swap_workaround (w0[3]); + u32x w4_t = swap_workaround (w1[0]); + u32x w5_t = swap_workaround (w1[1]); + u32x w6_t = swap_workaround (w1[2]); + u32x w7_t = swap_workaround (w1[3]); + u32x w8_t = swap_workaround (w2[0]); + u32x w9_t = swap_workaround (w2[1]); + u32x wa_t = swap_workaround (w2[2]); + u32x wb_t = swap_workaround (w2[3]); + u32x wc_t = swap_workaround (w3[0]); + u32x wd_t = swap_workaround (w3[1]); + u32x we_t = 0; + u32x wf_t = out_len * 8; + + u32x a = SHA1M_A; + u32x b = SHA1M_B; + u32x c = SHA1M_C; + u32x d = SHA1M_D; + u32x e = SHA1M_E; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w0_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w1_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w2_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w3_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w4_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w5_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w6_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w7_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w8_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w9_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wa_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, wb_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, wc_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, wd_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, we_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F0o, e, a, b, c, d, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F0o, d, e, a, b, c, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F0o, c, d, e, a, b, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F0o, b, c, d, e, a, w3_t); + + #undef K + #define K SHA1C01 + + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w7_t); + + #undef K + #define K SHA1C02 + + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wb_t); + + #undef K + #define K SHA1C03 + + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wf_t); + + a += SHA1M_A; + e += SHA1M_E; + d += SHA1M_D; + c += SHA1M_C; + + { + const u32x r0 = a; + const u32x r1 = e; + const u32x r2 = d; + const u32x r3 = c; + + #include VECT_COMPARE_M + } + + a &= 0x00000fff; + + { + const u32x r0 = a; + const u32x r1 = e; + const u32x r2 = d; + const u32x r3 = c; + + #include VECT_COMPARE_M + } + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m00190_m08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m00190_m16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m00190_s04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + u32x pw_buf1[4]; + + pw_buf1[0] = pws[gid].i[ 4]; + pw_buf1[1] = pws[gid].i[ 5]; + pw_buf1[2] = pws[gid].i[ 6]; + pw_buf1[3] = pws[gid].i[ 7]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + + w0[0] = pw_buf0[0]; + w0[1] = pw_buf0[1]; + w0[2] = pw_buf0[2]; + w0[3] = pw_buf0[3]; + + u32x w1[4]; + + w1[0] = pw_buf1[0]; + w1[1] = pw_buf1[1]; + w1[2] = pw_buf1[2]; + w1[3] = pw_buf1[3]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 out_len = apply_rules (rules_buf[il_pos].cmds, w0, w1, pw_len); + + append_0x80_2 (w0, w1, out_len); + + /** + * sha1 + */ + + u32x w0_t = swap_workaround (w0[0]); + u32x w1_t = swap_workaround (w0[1]); + u32x w2_t = swap_workaround (w0[2]); + u32x w3_t = swap_workaround (w0[3]); + u32x w4_t = swap_workaround (w1[0]); + u32x w5_t = swap_workaround (w1[1]); + u32x w6_t = swap_workaround (w1[2]); + u32x w7_t = swap_workaround (w1[3]); + u32x w8_t = swap_workaround (w2[0]); + u32x w9_t = swap_workaround (w2[1]); + u32x wa_t = swap_workaround (w2[2]); + u32x wb_t = swap_workaround (w2[3]); + u32x wc_t = swap_workaround (w3[0]); + u32x wd_t = swap_workaround (w3[1]); + u32x we_t = 0; + u32x wf_t = out_len * 8; + + u32x a = SHA1M_A; + u32x b = SHA1M_B; + u32x c = SHA1M_C; + u32x d = SHA1M_D; + u32x e = SHA1M_E; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w0_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w1_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w2_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w3_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w4_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w5_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w6_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w7_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w8_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w9_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wa_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, wb_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, wc_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, wd_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, we_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F0o, e, a, b, c, d, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F0o, d, e, a, b, c, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F0o, c, d, e, a, b, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F0o, b, c, d, e, a, w3_t); + + #undef K + #define K SHA1C01 + + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w7_t); + + #undef K + #define K SHA1C02 + + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wb_t); + + #undef K + #define K SHA1C03 + + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wf_t); + + a += SHA1M_A; + e += SHA1M_E; + d += SHA1M_D; + c += SHA1M_C; + + { + const u32x r0 = a; + const u32x r1 = e; + const u32x r2 = d; + const u32x r3 = c; + + #include VECT_COMPARE_S + } + + a &= 0x00000fff; + + { + const u32x r0 = a; + const u32x r1 = e; + const u32x r2 = d; + const u32x r3 = c; + + #include VECT_COMPARE_S + } + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m00190_s08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m00190_s16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/amd/m00190_a1.cl b/amd/m00190_a1.cl new file mode 100644 index 0000000000..68bae1bad0 --- /dev/null +++ b/amd/m00190_a1.cl @@ -0,0 +1,625 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _SHA1_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW4 +#define VECT_SIZE4 +#endif + +#ifdef VLIW5 +#define VECT_SIZE4 +#endif + +#define DGST_R0 0 +#define DGST_R1 4 +#define DGST_R2 3 +#define DGST_R3 2 + +#include "include/kernel_functions.c" +#include "types_amd.c" +#include "common_amd.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m00190_m04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + append_0x80_2 (wordl0, wordl1, pw_l_len); + + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, combs_buf[0].pw_len); + } + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = combs_buf[il_pos].pw_len; + + const u32 pw_len = pw_l_len + pw_r_len; + + u32 wordr0[4]; + + wordr0[0] = combs_buf[il_pos].i[0]; + wordr0[1] = combs_buf[il_pos].i[1]; + wordr0[2] = combs_buf[il_pos].i[2]; + wordr0[3] = combs_buf[il_pos].i[3]; + + u32 wordr1[4]; + + wordr1[0] = combs_buf[il_pos].i[4]; + wordr1[1] = combs_buf[il_pos].i[5]; + wordr1[2] = combs_buf[il_pos].i[6]; + wordr1[3] = combs_buf[il_pos].i[7]; + + u32 wordr2[4]; + + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + + u32 wordr3[4]; + + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + append_0x80_2 (wordr0, wordr1, pw_r_len); + + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + u32x w0[4]; + + w0[0] = wordl0[0] | wordr0[0]; + w0[1] = wordl0[1] | wordr0[1]; + w0[2] = wordl0[2] | wordr0[2]; + w0[3] = wordl0[3] | wordr0[3]; + + u32x w1[4]; + + w1[0] = wordl1[0] | wordr1[0]; + w1[1] = wordl1[1] | wordr1[1]; + w1[2] = wordl1[2] | wordr1[2]; + w1[3] = wordl1[3] | wordr1[3]; + + u32x w2[4]; + + w2[0] = wordl2[0] | wordr2[0]; + w2[1] = wordl2[1] | wordr2[1]; + w2[2] = wordl2[2] | wordr2[2]; + w2[3] = wordl2[3] | wordr2[3]; + + u32x w3[4]; + + w3[0] = wordl3[0] | wordr3[0]; + w3[1] = wordl3[1] | wordr3[1]; + w3[2] = 0; + w3[3] = 0; + + /** + * sha1 + */ + + u32x w0_t = swap_workaround (w0[0]); + u32x w1_t = swap_workaround (w0[1]); + u32x w2_t = swap_workaround (w0[2]); + u32x w3_t = swap_workaround (w0[3]); + u32x w4_t = swap_workaround (w1[0]); + u32x w5_t = swap_workaround (w1[1]); + u32x w6_t = swap_workaround (w1[2]); + u32x w7_t = swap_workaround (w1[3]); + u32x w8_t = swap_workaround (w2[0]); + u32x w9_t = swap_workaround (w2[1]); + u32x wa_t = swap_workaround (w2[2]); + u32x wb_t = swap_workaround (w2[3]); + u32x wc_t = swap_workaround (w3[0]); + u32x wd_t = swap_workaround (w3[1]); + u32x we_t = 0; + u32x wf_t = pw_len * 8; + + u32x a = SHA1M_A; + u32x b = SHA1M_B; + u32x c = SHA1M_C; + u32x d = SHA1M_D; + u32x e = SHA1M_E; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w0_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w1_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w2_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w3_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w4_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w5_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w6_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w7_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w8_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w9_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wa_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, wb_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, wc_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, wd_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, we_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F0o, e, a, b, c, d, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F0o, d, e, a, b, c, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F0o, c, d, e, a, b, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F0o, b, c, d, e, a, w3_t); + + #undef K + #define K SHA1C01 + + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w7_t); + + #undef K + #define K SHA1C02 + + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wb_t); + + #undef K + #define K SHA1C03 + + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wf_t); + + a += SHA1M_A; + e += SHA1M_E; + d += SHA1M_D; + c += SHA1M_C; + + { + const u32x r0 = a; + const u32x r1 = e; + const u32x r2 = d; + const u32x r3 = c; + + #include VECT_COMPARE_M + } + + a &= 0x00000fff; + + { + const u32x r0 = a; + const u32x r1 = e; + const u32x r2 = d; + const u32x r3 = c; + + #include VECT_COMPARE_M + } + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m00190_m08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m00190_m16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m00190_s04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + append_0x80_2 (wordl0, wordl1, pw_l_len); + + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, combs_buf[0].pw_len); + } + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = combs_buf[il_pos].pw_len; + + const u32 pw_len = pw_l_len + pw_r_len; + + u32 wordr0[4]; + + wordr0[0] = combs_buf[il_pos].i[0]; + wordr0[1] = combs_buf[il_pos].i[1]; + wordr0[2] = combs_buf[il_pos].i[2]; + wordr0[3] = combs_buf[il_pos].i[3]; + + u32 wordr1[4]; + + wordr1[0] = combs_buf[il_pos].i[4]; + wordr1[1] = combs_buf[il_pos].i[5]; + wordr1[2] = combs_buf[il_pos].i[6]; + wordr1[3] = combs_buf[il_pos].i[7]; + + u32 wordr2[4]; + + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + + u32 wordr3[4]; + + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + append_0x80_2 (wordr0, wordr1, pw_r_len); + + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + u32x w0[4]; + + w0[0] = wordl0[0] | wordr0[0]; + w0[1] = wordl0[1] | wordr0[1]; + w0[2] = wordl0[2] | wordr0[2]; + w0[3] = wordl0[3] | wordr0[3]; + + u32x w1[4]; + + w1[0] = wordl1[0] | wordr1[0]; + w1[1] = wordl1[1] | wordr1[1]; + w1[2] = wordl1[2] | wordr1[2]; + w1[3] = wordl1[3] | wordr1[3]; + + u32x w2[4]; + + w2[0] = wordl2[0] | wordr2[0]; + w2[1] = wordl2[1] | wordr2[1]; + w2[2] = wordl2[2] | wordr2[2]; + w2[3] = wordl2[3] | wordr2[3]; + + u32x w3[4]; + + w3[0] = wordl3[0] | wordr3[0]; + w3[1] = wordl3[1] | wordr3[1]; + w3[2] = 0; + w3[3] = 0; + + /** + * sha1 + */ + + u32x w0_t = swap_workaround (w0[0]); + u32x w1_t = swap_workaround (w0[1]); + u32x w2_t = swap_workaround (w0[2]); + u32x w3_t = swap_workaround (w0[3]); + u32x w4_t = swap_workaround (w1[0]); + u32x w5_t = swap_workaround (w1[1]); + u32x w6_t = swap_workaround (w1[2]); + u32x w7_t = swap_workaround (w1[3]); + u32x w8_t = swap_workaround (w2[0]); + u32x w9_t = swap_workaround (w2[1]); + u32x wa_t = swap_workaround (w2[2]); + u32x wb_t = swap_workaround (w2[3]); + u32x wc_t = swap_workaround (w3[0]); + u32x wd_t = swap_workaround (w3[1]); + u32x we_t = 0; + u32x wf_t = pw_len * 8; + + u32x a = SHA1M_A; + u32x b = SHA1M_B; + u32x c = SHA1M_C; + u32x d = SHA1M_D; + u32x e = SHA1M_E; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w0_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w1_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w2_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w3_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w4_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w5_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w6_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w7_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w8_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w9_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wa_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, wb_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, wc_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, wd_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, we_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F0o, e, a, b, c, d, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F0o, d, e, a, b, c, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F0o, c, d, e, a, b, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F0o, b, c, d, e, a, w3_t); + + #undef K + #define K SHA1C01 + + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w7_t); + + #undef K + #define K SHA1C02 + + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wb_t); + + #undef K + #define K SHA1C03 + + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wf_t); + + a += SHA1M_A; + e += SHA1M_E; + d += SHA1M_D; + c += SHA1M_C; + + { + const u32x r0 = a; + const u32x r1 = e; + const u32x r2 = d; + const u32x r3 = c; + + #include VECT_COMPARE_S + } + + a &= 0x00000fff; + + { + const u32x r0 = a; + const u32x r1 = e; + const u32x r2 = d; + const u32x r3 = c; + + #include VECT_COMPARE_S + } + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m00190_s08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m00190_s16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/amd/m00190_a3.cl b/amd/m00190_a3.cl new file mode 100644 index 0000000000..f76d23dcf5 --- /dev/null +++ b/amd/m00190_a3.cl @@ -0,0 +1,825 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _SHA1_ +#define _SCALAR_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW4 +#define VECT_SIZE4 +#endif + +#ifdef VLIW5 +#define VECT_SIZE4 +#endif + +#define DGST_R0 0 +#define DGST_R1 4 +#define DGST_R2 3 +#define DGST_R3 2 + +#include "include/kernel_functions.c" +#include "types_amd.c" +#include "common_amd.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4_warp.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4_warp.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4_warp.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4_warp.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4_warp.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4_warp.c" +#endif + +static void m00190m (u32 w[16], const u32 pw_len, __global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global u32x * words_buf_r, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset) +{ + /** + * modifier + */ + + const u32 gid = get_global_id (0); + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 c_16s = rotl32 ((w[13] ^ w[ 8] ^ w[ 2] ), 1u); + const u32 c_17s = rotl32 ((w[14] ^ w[ 9] ^ w[ 3] ^ w[ 1]), 1u); + const u32 c_18s = rotl32 ((w[15] ^ w[10] ^ w[ 4] ^ w[ 2]), 1u); + const u32 c_19s = rotl32 ((c_16s ^ w[11] ^ w[ 5] ^ w[ 3]), 1u); + const u32 c_20s = rotl32 ((c_17s ^ w[12] ^ w[ 6] ^ w[ 4]), 1u); + const u32 c_21s = rotl32 ((c_18s ^ w[13] ^ w[ 7] ^ w[ 5]), 1u); + const u32 c_22s = rotl32 ((c_19s ^ w[14] ^ w[ 8] ^ w[ 6]), 1u); + const u32 c_23s = rotl32 ((c_20s ^ w[15] ^ w[ 9] ^ w[ 7]), 1u); + const u32 c_24s = rotl32 ((c_21s ^ c_16s ^ w[10] ^ w[ 8]), 1u); + const u32 c_25s = rotl32 ((c_22s ^ c_17s ^ w[11] ^ w[ 9]), 1u); + const u32 c_26s = rotl32 ((c_23s ^ c_18s ^ w[12] ^ w[10]), 1u); + const u32 c_27s = rotl32 ((c_24s ^ c_19s ^ w[13] ^ w[11]), 1u); + const u32 c_28s = rotl32 ((c_25s ^ c_20s ^ w[14] ^ w[12]), 1u); + const u32 c_29s = rotl32 ((c_26s ^ c_21s ^ w[15] ^ w[13]), 1u); + const u32 c_30s = rotl32 ((c_27s ^ c_22s ^ c_16s ^ w[14]), 1u); + const u32 c_31s = rotl32 ((c_28s ^ c_23s ^ c_17s ^ w[15]), 1u); + const u32 c_32s = rotl32 ((c_29s ^ c_24s ^ c_18s ^ c_16s), 1u); + const u32 c_33s = rotl32 ((c_30s ^ c_25s ^ c_19s ^ c_17s), 1u); + const u32 c_34s = rotl32 ((c_31s ^ c_26s ^ c_20s ^ c_18s), 1u); + const u32 c_35s = rotl32 ((c_32s ^ c_27s ^ c_21s ^ c_19s), 1u); + const u32 c_36s = rotl32 ((c_33s ^ c_28s ^ c_22s ^ c_20s), 1u); + const u32 c_37s = rotl32 ((c_34s ^ c_29s ^ c_23s ^ c_21s), 1u); + const u32 c_38s = rotl32 ((c_35s ^ c_30s ^ c_24s ^ c_22s), 1u); + const u32 c_39s = rotl32 ((c_36s ^ c_31s ^ c_25s ^ c_23s), 1u); + const u32 c_40s = rotl32 ((c_37s ^ c_32s ^ c_26s ^ c_24s), 1u); + const u32 c_41s = rotl32 ((c_38s ^ c_33s ^ c_27s ^ c_25s), 1u); + const u32 c_42s = rotl32 ((c_39s ^ c_34s ^ c_28s ^ c_26s), 1u); + const u32 c_43s = rotl32 ((c_40s ^ c_35s ^ c_29s ^ c_27s), 1u); + const u32 c_44s = rotl32 ((c_41s ^ c_36s ^ c_30s ^ c_28s), 1u); + const u32 c_45s = rotl32 ((c_42s ^ c_37s ^ c_31s ^ c_29s), 1u); + const u32 c_46s = rotl32 ((c_43s ^ c_38s ^ c_32s ^ c_30s), 1u); + const u32 c_47s = rotl32 ((c_44s ^ c_39s ^ c_33s ^ c_31s), 1u); + const u32 c_48s = rotl32 ((c_45s ^ c_40s ^ c_34s ^ c_32s), 1u); + const u32 c_49s = rotl32 ((c_46s ^ c_41s ^ c_35s ^ c_33s), 1u); + const u32 c_50s = rotl32 ((c_47s ^ c_42s ^ c_36s ^ c_34s), 1u); + const u32 c_51s = rotl32 ((c_48s ^ c_43s ^ c_37s ^ c_35s), 1u); + const u32 c_52s = rotl32 ((c_49s ^ c_44s ^ c_38s ^ c_36s), 1u); + const u32 c_53s = rotl32 ((c_50s ^ c_45s ^ c_39s ^ c_37s), 1u); + const u32 c_54s = rotl32 ((c_51s ^ c_46s ^ c_40s ^ c_38s), 1u); + const u32 c_55s = rotl32 ((c_52s ^ c_47s ^ c_41s ^ c_39s), 1u); + const u32 c_56s = rotl32 ((c_53s ^ c_48s ^ c_42s ^ c_40s), 1u); + const u32 c_57s = rotl32 ((c_54s ^ c_49s ^ c_43s ^ c_41s), 1u); + const u32 c_58s = rotl32 ((c_55s ^ c_50s ^ c_44s ^ c_42s), 1u); + const u32 c_59s = rotl32 ((c_56s ^ c_51s ^ c_45s ^ c_43s), 1u); + const u32 c_60s = rotl32 ((c_57s ^ c_52s ^ c_46s ^ c_44s), 1u); + const u32 c_61s = rotl32 ((c_58s ^ c_53s ^ c_47s ^ c_45s), 1u); + const u32 c_62s = rotl32 ((c_59s ^ c_54s ^ c_48s ^ c_46s), 1u); + const u32 c_63s = rotl32 ((c_60s ^ c_55s ^ c_49s ^ c_47s), 1u); + const u32 c_64s = rotl32 ((c_61s ^ c_56s ^ c_50s ^ c_48s), 1u); + const u32 c_65s = rotl32 ((c_62s ^ c_57s ^ c_51s ^ c_49s), 1u); + const u32 c_66s = rotl32 ((c_63s ^ c_58s ^ c_52s ^ c_50s), 1u); + const u32 c_67s = rotl32 ((c_64s ^ c_59s ^ c_53s ^ c_51s), 1u); + const u32 c_68s = rotl32 ((c_65s ^ c_60s ^ c_54s ^ c_52s), 1u); + const u32 c_69s = rotl32 ((c_66s ^ c_61s ^ c_55s ^ c_53s), 1u); + const u32 c_70s = rotl32 ((c_67s ^ c_62s ^ c_56s ^ c_54s), 1u); + const u32 c_71s = rotl32 ((c_68s ^ c_63s ^ c_57s ^ c_55s), 1u); + const u32 c_72s = rotl32 ((c_69s ^ c_64s ^ c_58s ^ c_56s), 1u); + const u32 c_73s = rotl32 ((c_70s ^ c_65s ^ c_59s ^ c_57s), 1u); + const u32 c_74s = rotl32 ((c_71s ^ c_66s ^ c_60s ^ c_58s), 1u); + const u32 c_75s = rotl32 ((c_72s ^ c_67s ^ c_61s ^ c_59s), 1u); + + const u32 c_17sK = c_17s + SHA1C00; + const u32 c_18sK = c_18s + SHA1C00; + const u32 c_20sK = c_20s + SHA1C01; + const u32 c_21sK = c_21s + SHA1C01; + const u32 c_23sK = c_23s + SHA1C01; + const u32 c_26sK = c_26s + SHA1C01; + const u32 c_27sK = c_27s + SHA1C01; + const u32 c_29sK = c_29s + SHA1C01; + const u32 c_33sK = c_33s + SHA1C01; + const u32 c_39sK = c_39s + SHA1C01; + const u32 c_41sK = c_41s + SHA1C02; + const u32 c_45sK = c_45s + SHA1C02; + const u32 c_53sK = c_53s + SHA1C02; + const u32 c_65sK = c_65s + SHA1C03; + const u32 c_69sK = c_69s + SHA1C03; + + /** + * loop + */ + + const u32 bf_loops = ceil ((float) bfs_cnt / VECT_DIV); + + u32x w0l = w[0]; + + for (u32 il_pos = 0; il_pos < bf_loops; il_pos++) + { + const u32x w0r = words_buf_r[il_pos]; + + const u32x w0 = w0l | w0r; + + const u32x w0s01 = rotl32 (w0, 1u); + const u32x w0s02 = rotl32 (w0, 2u); + const u32x w0s03 = rotl32 (w0, 3u); + const u32x w0s04 = rotl32 (w0, 4u); + const u32x w0s05 = rotl32 (w0, 5u); + const u32x w0s06 = rotl32 (w0, 6u); + const u32x w0s07 = rotl32 (w0, 7u); + const u32x w0s08 = rotl32 (w0, 8u); + const u32x w0s09 = rotl32 (w0, 9u); + const u32x w0s10 = rotl32 (w0, 10u); + const u32x w0s11 = rotl32 (w0, 11u); + const u32x w0s12 = rotl32 (w0, 12u); + const u32x w0s13 = rotl32 (w0, 13u); + const u32x w0s14 = rotl32 (w0, 14u); + const u32x w0s15 = rotl32 (w0, 15u); + const u32x w0s16 = rotl32 (w0, 16u); + const u32x w0s17 = rotl32 (w0, 17u); + const u32x w0s18 = rotl32 (w0, 18u); + const u32x w0s19 = rotl32 (w0, 19u); + const u32x w0s20 = rotl32 (w0, 20u); + + const u32x w0s04___w0s06 = w0s04 ^ w0s06; + const u32x w0s04___w0s08 = w0s04 ^ w0s08; + const u32x w0s08___w0s12 = w0s08 ^ w0s12; + const u32x w0s04___w0s06___w0s07 = w0s04___w0s06 ^ w0s07; + + u32x a = SHA1M_A; + u32x b = SHA1M_B; + u32x c = SHA1M_C; + u32x d = SHA1M_D; + u32x e = SHA1M_E; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w0); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w[ 1]); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w[ 2]); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w[ 3]); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w[ 4]); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w[ 5]); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w[ 6]); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w[ 7]); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w[ 8]); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w[ 9]); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w[10]); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w[11]); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w[12]); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w[13]); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w[14]); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w[15]); + + SHA1_STEP (SHA1_F0o, e, a, b, c, d, (c_16s ^ w0s01)); + SHA1_STEPX(SHA1_F0o, d, e, a, b, c, (c_17sK)); + SHA1_STEPX(SHA1_F0o, c, d, e, a, b, (c_18sK)); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, (c_19s ^ w0s02)); + + #undef K + #define K SHA1C01 + + SHA1_STEPX(SHA1_F1 , a, b, c, d, e, (c_20sK)); + SHA1_STEPX(SHA1_F1 , e, a, b, c, d, (c_21sK)); + SHA1_STEP (SHA1_F1 , d, e, a, b, c, (c_22s ^ w0s03)); + SHA1_STEPX(SHA1_F1 , c, d, e, a, b, (c_23sK)); + SHA1_STEP (SHA1_F1 , b, c, d, e, a, (c_24s ^ w0s02)); + SHA1_STEP (SHA1_F1 , a, b, c, d, e, (c_25s ^ w0s04)); + SHA1_STEPX(SHA1_F1 , e, a, b, c, d, (c_26sK)); + SHA1_STEPX(SHA1_F1 , d, e, a, b, c, (c_27sK)); + SHA1_STEP (SHA1_F1 , c, d, e, a, b, (c_28s ^ w0s05)); + SHA1_STEPX(SHA1_F1 , b, c, d, e, a, (c_29sK)); + SHA1_STEP (SHA1_F1 , a, b, c, d, e, (c_30s ^ w0s02 ^ w0s04)); + SHA1_STEP (SHA1_F1 , e, a, b, c, d, (c_31s ^ w0s06)); + SHA1_STEP (SHA1_F1 , d, e, a, b, c, (c_32s ^ w0s02 ^ w0s03)); + SHA1_STEPX(SHA1_F1 , c, d, e, a, b, (c_33sK)); + SHA1_STEP (SHA1_F1 , b, c, d, e, a, (c_34s ^ w0s07)); + SHA1_STEP (SHA1_F1 , a, b, c, d, e, (c_35s ^ w0s04)); + SHA1_STEP (SHA1_F1 , e, a, b, c, d, (c_36s ^ w0s04___w0s06)); + SHA1_STEP (SHA1_F1 , d, e, a, b, c, (c_37s ^ w0s08)); + SHA1_STEP (SHA1_F1 , c, d, e, a, b, (c_38s ^ w0s04)); + SHA1_STEPX(SHA1_F1 , b, c, d, e, a, (c_39sK)); + + #undef K + #define K SHA1C02 + + SHA1_STEP (SHA1_F2o, a, b, c, d, e, (c_40s ^ w0s04 ^ w0s09)); + SHA1_STEPX(SHA1_F2o, e, a, b, c, d, (c_41sK)); + SHA1_STEP (SHA1_F2o, d, e, a, b, c, (c_42s ^ w0s06 ^ w0s08)); + SHA1_STEP (SHA1_F2o, c, d, e, a, b, (c_43s ^ w0s10)); + SHA1_STEP (SHA1_F2o, b, c, d, e, a, (c_44s ^ w0s03 ^ w0s06 ^ w0s07)); + SHA1_STEPX(SHA1_F2o, a, b, c, d, e, (c_45sK)); + SHA1_STEP (SHA1_F2o, e, a, b, c, d, (c_46s ^ w0s04 ^ w0s11)); + SHA1_STEP (SHA1_F2o, d, e, a, b, c, (c_47s ^ w0s04___w0s08)); + SHA1_STEP (SHA1_F2o, c, d, e, a, b, (c_48s ^ w0s03 ^ w0s04___w0s08 ^ w0s05 ^ w0s10)); + SHA1_STEP (SHA1_F2o, b, c, d, e, a, (c_49s ^ w0s12)); + SHA1_STEP (SHA1_F2o, a, b, c, d, e, (c_50s ^ w0s08)); + SHA1_STEP (SHA1_F2o, e, a, b, c, d, (c_51s ^ w0s04___w0s06)); + SHA1_STEP (SHA1_F2o, d, e, a, b, c, (c_52s ^ w0s04___w0s08 ^ w0s13)); + SHA1_STEPX(SHA1_F2o, c, d, e, a, b, (c_53sK)); + SHA1_STEP (SHA1_F2o, b, c, d, e, a, (c_54s ^ w0s07 ^ w0s10 ^ w0s12)); + SHA1_STEP (SHA1_F2o, a, b, c, d, e, (c_55s ^ w0s14)); + SHA1_STEP (SHA1_F2o, e, a, b, c, d, (c_56s ^ w0s04___w0s06___w0s07 ^ w0s10 ^ w0s11)); + SHA1_STEP (SHA1_F2o, d, e, a, b, c, (c_57s ^ w0s08)); + SHA1_STEP (SHA1_F2o, c, d, e, a, b, (c_58s ^ w0s04___w0s08 ^ w0s15)); + SHA1_STEP (SHA1_F2o, b, c, d, e, a, (c_59s ^ w0s08___w0s12)); + + #undef K + #define K SHA1C03 + + SHA1_STEP (SHA1_F1 , a, b, c, d, e, (c_60s ^ w0s04 ^ w0s08___w0s12 ^ w0s07 ^ w0s14)); + SHA1_STEP (SHA1_F1 , e, a, b, c, d, (c_61s ^ w0s16)); + SHA1_STEP (SHA1_F1 , d, e, a, b, c, (c_62s ^ w0s04___w0s06 ^ w0s08___w0s12)); + SHA1_STEP (SHA1_F1 , c, d, e, a, b, (c_63s ^ w0s08)); + SHA1_STEP (SHA1_F1 , b, c, d, e, a, (c_64s ^ w0s04___w0s06___w0s07 ^ w0s08___w0s12 ^ w0s17)); + SHA1_STEPX(SHA1_F1 , a, b, c, d, e, (c_65sK)); + SHA1_STEP (SHA1_F1 , e, a, b, c, d, (c_66s ^ w0s14 ^ w0s16)); + SHA1_STEP (SHA1_F1 , d, e, a, b, c, (c_67s ^ w0s08 ^ w0s18)); + SHA1_STEP (SHA1_F1 , c, d, e, a, b, (c_68s ^ w0s11 ^ w0s14 ^ w0s15)); + SHA1_STEPX(SHA1_F1 , b, c, d, e, a, (c_69sK)); + SHA1_STEP (SHA1_F1 , a, b, c, d, e, (c_70s ^ w0s12 ^ w0s19)); + SHA1_STEP (SHA1_F1 , e, a, b, c, d, (c_71s ^ w0s12 ^ w0s16)); + SHA1_STEP (SHA1_F1 , d, e, a, b, c, (c_72s ^ w0s05 ^ w0s11 ^ w0s12 ^ w0s13 ^ w0s16 ^ w0s18)); + SHA1_STEP (SHA1_F1 , c, d, e, a, b, (c_73s ^ w0s20)); + SHA1_STEP (SHA1_F1 , b, c, d, e, a, (c_74s ^ w0s08 ^ w0s16)); + SHA1_STEP (SHA1_F1 , a, b, c, d, e, (c_75s ^ w0s06 ^ w0s12 ^ w0s14)); + + const u32 c_76s = rotl32 ((c_73s ^ c_68s ^ c_62s ^ c_60s), 1u); + const u32 c_77s = rotl32 ((c_74s ^ c_69s ^ c_63s ^ c_61s), 1u); + const u32 c_78s = rotl32 ((c_75s ^ c_70s ^ c_64s ^ c_62s), 1u); + const u32 c_79s = rotl32 ((c_76s ^ c_71s ^ c_65s ^ c_63s), 1u); + + const u32x w0s21 = rotl32 (w0, 21u); + const u32x w0s22 = rotl32 (w0, 22U); + + SHA1_STEP (SHA1_F1 , e, a, b, c, d, (c_76s ^ w0s07 ^ w0s08___w0s12 ^ w0s16 ^ w0s21)); + SHA1_STEP (SHA1_F1 , d, e, a, b, c, (c_77s)); + SHA1_STEP (SHA1_F1 , c, d, e, a, b, (c_78s ^ w0s07 ^ w0s08 ^ w0s15 ^ w0s18 ^ w0s20)); + SHA1_STEP (SHA1_F1 , b, c, d, e, a, (c_79s ^ w0s08 ^ w0s22)); + + a += SHA1M_A; + e += SHA1M_E; + d += SHA1M_D; + c += SHA1M_C; + + { + const u32x r0 = a; + const u32x r1 = e; + const u32x r2 = d; + const u32x r3 = c; + + #include VECT_COMPARE_M + } + + a &= 0x00000fff; + + { + const u32x r0 = a; + const u32x r1 = e; + const u32x r2 = d; + const u32x r3 = c; + + #include VECT_COMPARE_M + } + } +} + +static void m00190s (u32 w[16], const u32 pw_len, __global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global u32x * words_buf_r, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset) +{ + /** + * modifier + */ + + const u32 gid = get_global_id (0); + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 c_16s = rotl32 ((w[13] ^ w[ 8] ^ w[ 2] ), 1u); + const u32 c_17s = rotl32 ((w[14] ^ w[ 9] ^ w[ 3] ^ w[ 1]), 1u); + const u32 c_18s = rotl32 ((w[15] ^ w[10] ^ w[ 4] ^ w[ 2]), 1u); + const u32 c_19s = rotl32 ((c_16s ^ w[11] ^ w[ 5] ^ w[ 3]), 1u); + const u32 c_20s = rotl32 ((c_17s ^ w[12] ^ w[ 6] ^ w[ 4]), 1u); + const u32 c_21s = rotl32 ((c_18s ^ w[13] ^ w[ 7] ^ w[ 5]), 1u); + const u32 c_22s = rotl32 ((c_19s ^ w[14] ^ w[ 8] ^ w[ 6]), 1u); + const u32 c_23s = rotl32 ((c_20s ^ w[15] ^ w[ 9] ^ w[ 7]), 1u); + const u32 c_24s = rotl32 ((c_21s ^ c_16s ^ w[10] ^ w[ 8]), 1u); + const u32 c_25s = rotl32 ((c_22s ^ c_17s ^ w[11] ^ w[ 9]), 1u); + const u32 c_26s = rotl32 ((c_23s ^ c_18s ^ w[12] ^ w[10]), 1u); + const u32 c_27s = rotl32 ((c_24s ^ c_19s ^ w[13] ^ w[11]), 1u); + const u32 c_28s = rotl32 ((c_25s ^ c_20s ^ w[14] ^ w[12]), 1u); + const u32 c_29s = rotl32 ((c_26s ^ c_21s ^ w[15] ^ w[13]), 1u); + const u32 c_30s = rotl32 ((c_27s ^ c_22s ^ c_16s ^ w[14]), 1u); + const u32 c_31s = rotl32 ((c_28s ^ c_23s ^ c_17s ^ w[15]), 1u); + const u32 c_32s = rotl32 ((c_29s ^ c_24s ^ c_18s ^ c_16s), 1u); + const u32 c_33s = rotl32 ((c_30s ^ c_25s ^ c_19s ^ c_17s), 1u); + const u32 c_34s = rotl32 ((c_31s ^ c_26s ^ c_20s ^ c_18s), 1u); + const u32 c_35s = rotl32 ((c_32s ^ c_27s ^ c_21s ^ c_19s), 1u); + const u32 c_36s = rotl32 ((c_33s ^ c_28s ^ c_22s ^ c_20s), 1u); + const u32 c_37s = rotl32 ((c_34s ^ c_29s ^ c_23s ^ c_21s), 1u); + const u32 c_38s = rotl32 ((c_35s ^ c_30s ^ c_24s ^ c_22s), 1u); + const u32 c_39s = rotl32 ((c_36s ^ c_31s ^ c_25s ^ c_23s), 1u); + const u32 c_40s = rotl32 ((c_37s ^ c_32s ^ c_26s ^ c_24s), 1u); + const u32 c_41s = rotl32 ((c_38s ^ c_33s ^ c_27s ^ c_25s), 1u); + const u32 c_42s = rotl32 ((c_39s ^ c_34s ^ c_28s ^ c_26s), 1u); + const u32 c_43s = rotl32 ((c_40s ^ c_35s ^ c_29s ^ c_27s), 1u); + const u32 c_44s = rotl32 ((c_41s ^ c_36s ^ c_30s ^ c_28s), 1u); + const u32 c_45s = rotl32 ((c_42s ^ c_37s ^ c_31s ^ c_29s), 1u); + const u32 c_46s = rotl32 ((c_43s ^ c_38s ^ c_32s ^ c_30s), 1u); + const u32 c_47s = rotl32 ((c_44s ^ c_39s ^ c_33s ^ c_31s), 1u); + const u32 c_48s = rotl32 ((c_45s ^ c_40s ^ c_34s ^ c_32s), 1u); + const u32 c_49s = rotl32 ((c_46s ^ c_41s ^ c_35s ^ c_33s), 1u); + const u32 c_50s = rotl32 ((c_47s ^ c_42s ^ c_36s ^ c_34s), 1u); + const u32 c_51s = rotl32 ((c_48s ^ c_43s ^ c_37s ^ c_35s), 1u); + const u32 c_52s = rotl32 ((c_49s ^ c_44s ^ c_38s ^ c_36s), 1u); + const u32 c_53s = rotl32 ((c_50s ^ c_45s ^ c_39s ^ c_37s), 1u); + const u32 c_54s = rotl32 ((c_51s ^ c_46s ^ c_40s ^ c_38s), 1u); + const u32 c_55s = rotl32 ((c_52s ^ c_47s ^ c_41s ^ c_39s), 1u); + const u32 c_56s = rotl32 ((c_53s ^ c_48s ^ c_42s ^ c_40s), 1u); + const u32 c_57s = rotl32 ((c_54s ^ c_49s ^ c_43s ^ c_41s), 1u); + const u32 c_58s = rotl32 ((c_55s ^ c_50s ^ c_44s ^ c_42s), 1u); + const u32 c_59s = rotl32 ((c_56s ^ c_51s ^ c_45s ^ c_43s), 1u); + const u32 c_60s = rotl32 ((c_57s ^ c_52s ^ c_46s ^ c_44s), 1u); + const u32 c_61s = rotl32 ((c_58s ^ c_53s ^ c_47s ^ c_45s), 1u); + const u32 c_62s = rotl32 ((c_59s ^ c_54s ^ c_48s ^ c_46s), 1u); + const u32 c_63s = rotl32 ((c_60s ^ c_55s ^ c_49s ^ c_47s), 1u); + const u32 c_64s = rotl32 ((c_61s ^ c_56s ^ c_50s ^ c_48s), 1u); + const u32 c_65s = rotl32 ((c_62s ^ c_57s ^ c_51s ^ c_49s), 1u); + const u32 c_66s = rotl32 ((c_63s ^ c_58s ^ c_52s ^ c_50s), 1u); + const u32 c_67s = rotl32 ((c_64s ^ c_59s ^ c_53s ^ c_51s), 1u); + const u32 c_68s = rotl32 ((c_65s ^ c_60s ^ c_54s ^ c_52s), 1u); + const u32 c_69s = rotl32 ((c_66s ^ c_61s ^ c_55s ^ c_53s), 1u); + const u32 c_70s = rotl32 ((c_67s ^ c_62s ^ c_56s ^ c_54s), 1u); + const u32 c_71s = rotl32 ((c_68s ^ c_63s ^ c_57s ^ c_55s), 1u); + const u32 c_72s = rotl32 ((c_69s ^ c_64s ^ c_58s ^ c_56s), 1u); + const u32 c_73s = rotl32 ((c_70s ^ c_65s ^ c_59s ^ c_57s), 1u); + const u32 c_74s = rotl32 ((c_71s ^ c_66s ^ c_60s ^ c_58s), 1u); + const u32 c_75s = rotl32 ((c_72s ^ c_67s ^ c_61s ^ c_59s), 1u); + + const u32 c_17sK = c_17s + SHA1C00; + const u32 c_18sK = c_18s + SHA1C00; + const u32 c_20sK = c_20s + SHA1C01; + const u32 c_21sK = c_21s + SHA1C01; + const u32 c_23sK = c_23s + SHA1C01; + const u32 c_26sK = c_26s + SHA1C01; + const u32 c_27sK = c_27s + SHA1C01; + const u32 c_29sK = c_29s + SHA1C01; + const u32 c_33sK = c_33s + SHA1C01; + const u32 c_39sK = c_39s + SHA1C01; + const u32 c_41sK = c_41s + SHA1C02; + const u32 c_45sK = c_45s + SHA1C02; + const u32 c_53sK = c_53s + SHA1C02; + const u32 c_65sK = c_65s + SHA1C03; + const u32 c_69sK = c_69s + SHA1C03; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * loop + */ + + const u32 bf_loops = ceil ((float) bfs_cnt / VECT_DIV); + + u32x w0l = w[0]; + + for (u32 il_pos = 0; il_pos < bf_loops; il_pos++) + { + const u32x w0r = words_buf_r[il_pos]; + + const u32x w0 = w0l | w0r; + + const u32x w0s01 = rotl32 (w0, 1u); + const u32x w0s02 = rotl32 (w0, 2u); + const u32x w0s03 = rotl32 (w0, 3u); + const u32x w0s04 = rotl32 (w0, 4u); + const u32x w0s05 = rotl32 (w0, 5u); + const u32x w0s06 = rotl32 (w0, 6u); + const u32x w0s07 = rotl32 (w0, 7u); + const u32x w0s08 = rotl32 (w0, 8u); + const u32x w0s09 = rotl32 (w0, 9u); + const u32x w0s10 = rotl32 (w0, 10u); + const u32x w0s11 = rotl32 (w0, 11u); + const u32x w0s12 = rotl32 (w0, 12u); + const u32x w0s13 = rotl32 (w0, 13u); + const u32x w0s14 = rotl32 (w0, 14u); + const u32x w0s15 = rotl32 (w0, 15u); + const u32x w0s16 = rotl32 (w0, 16u); + const u32x w0s17 = rotl32 (w0, 17u); + const u32x w0s18 = rotl32 (w0, 18u); + const u32x w0s19 = rotl32 (w0, 19u); + const u32x w0s20 = rotl32 (w0, 20u); + + const u32x w0s04___w0s06 = w0s04 ^ w0s06; + const u32x w0s04___w0s08 = w0s04 ^ w0s08; + const u32x w0s08___w0s12 = w0s08 ^ w0s12; + const u32x w0s04___w0s06___w0s07 = w0s04___w0s06 ^ w0s07; + + u32x a = SHA1M_A; + u32x b = SHA1M_B; + u32x c = SHA1M_C; + u32x d = SHA1M_D; + u32x e = SHA1M_E; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w0); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w[ 1]); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w[ 2]); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w[ 3]); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w[ 4]); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w[ 5]); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w[ 6]); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w[ 7]); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w[ 8]); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w[ 9]); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w[10]); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w[11]); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w[12]); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w[13]); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w[14]); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w[15]); + + SHA1_STEP (SHA1_F0o, e, a, b, c, d, (c_16s ^ w0s01)); + SHA1_STEPX(SHA1_F0o, d, e, a, b, c, (c_17sK)); + SHA1_STEPX(SHA1_F0o, c, d, e, a, b, (c_18sK)); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, (c_19s ^ w0s02)); + + #undef K + #define K SHA1C01 + + SHA1_STEPX(SHA1_F1 , a, b, c, d, e, (c_20sK)); + SHA1_STEPX(SHA1_F1 , e, a, b, c, d, (c_21sK)); + SHA1_STEP (SHA1_F1 , d, e, a, b, c, (c_22s ^ w0s03)); + SHA1_STEPX(SHA1_F1 , c, d, e, a, b, (c_23sK)); + SHA1_STEP (SHA1_F1 , b, c, d, e, a, (c_24s ^ w0s02)); + SHA1_STEP (SHA1_F1 , a, b, c, d, e, (c_25s ^ w0s04)); + SHA1_STEPX(SHA1_F1 , e, a, b, c, d, (c_26sK)); + SHA1_STEPX(SHA1_F1 , d, e, a, b, c, (c_27sK)); + SHA1_STEP (SHA1_F1 , c, d, e, a, b, (c_28s ^ w0s05)); + SHA1_STEPX(SHA1_F1 , b, c, d, e, a, (c_29sK)); + SHA1_STEP (SHA1_F1 , a, b, c, d, e, (c_30s ^ w0s02 ^ w0s04)); + SHA1_STEP (SHA1_F1 , e, a, b, c, d, (c_31s ^ w0s06)); + SHA1_STEP (SHA1_F1 , d, e, a, b, c, (c_32s ^ w0s02 ^ w0s03)); + SHA1_STEPX(SHA1_F1 , c, d, e, a, b, (c_33sK)); + SHA1_STEP (SHA1_F1 , b, c, d, e, a, (c_34s ^ w0s07)); + SHA1_STEP (SHA1_F1 , a, b, c, d, e, (c_35s ^ w0s04)); + SHA1_STEP (SHA1_F1 , e, a, b, c, d, (c_36s ^ w0s04___w0s06)); + SHA1_STEP (SHA1_F1 , d, e, a, b, c, (c_37s ^ w0s08)); + SHA1_STEP (SHA1_F1 , c, d, e, a, b, (c_38s ^ w0s04)); + SHA1_STEPX(SHA1_F1 , b, c, d, e, a, (c_39sK)); + + #undef K + #define K SHA1C02 + + SHA1_STEP (SHA1_F2o, a, b, c, d, e, (c_40s ^ w0s04 ^ w0s09)); + SHA1_STEPX(SHA1_F2o, e, a, b, c, d, (c_41sK)); + SHA1_STEP (SHA1_F2o, d, e, a, b, c, (c_42s ^ w0s06 ^ w0s08)); + SHA1_STEP (SHA1_F2o, c, d, e, a, b, (c_43s ^ w0s10)); + SHA1_STEP (SHA1_F2o, b, c, d, e, a, (c_44s ^ w0s03 ^ w0s06 ^ w0s07)); + SHA1_STEPX(SHA1_F2o, a, b, c, d, e, (c_45sK)); + SHA1_STEP (SHA1_F2o, e, a, b, c, d, (c_46s ^ w0s04 ^ w0s11)); + SHA1_STEP (SHA1_F2o, d, e, a, b, c, (c_47s ^ w0s04___w0s08)); + SHA1_STEP (SHA1_F2o, c, d, e, a, b, (c_48s ^ w0s03 ^ w0s04___w0s08 ^ w0s05 ^ w0s10)); + SHA1_STEP (SHA1_F2o, b, c, d, e, a, (c_49s ^ w0s12)); + SHA1_STEP (SHA1_F2o, a, b, c, d, e, (c_50s ^ w0s08)); + SHA1_STEP (SHA1_F2o, e, a, b, c, d, (c_51s ^ w0s04___w0s06)); + SHA1_STEP (SHA1_F2o, d, e, a, b, c, (c_52s ^ w0s04___w0s08 ^ w0s13)); + SHA1_STEPX(SHA1_F2o, c, d, e, a, b, (c_53sK)); + SHA1_STEP (SHA1_F2o, b, c, d, e, a, (c_54s ^ w0s07 ^ w0s10 ^ w0s12)); + SHA1_STEP (SHA1_F2o, a, b, c, d, e, (c_55s ^ w0s14)); + SHA1_STEP (SHA1_F2o, e, a, b, c, d, (c_56s ^ w0s04___w0s06___w0s07 ^ w0s10 ^ w0s11)); + SHA1_STEP (SHA1_F2o, d, e, a, b, c, (c_57s ^ w0s08)); + SHA1_STEP (SHA1_F2o, c, d, e, a, b, (c_58s ^ w0s04___w0s08 ^ w0s15)); + SHA1_STEP (SHA1_F2o, b, c, d, e, a, (c_59s ^ w0s08___w0s12)); + + #undef K + #define K SHA1C03 + + SHA1_STEP (SHA1_F1 , a, b, c, d, e, (c_60s ^ w0s04 ^ w0s08___w0s12 ^ w0s07 ^ w0s14)); + SHA1_STEP (SHA1_F1 , e, a, b, c, d, (c_61s ^ w0s16)); + SHA1_STEP (SHA1_F1 , d, e, a, b, c, (c_62s ^ w0s04___w0s06 ^ w0s08___w0s12)); + SHA1_STEP (SHA1_F1 , c, d, e, a, b, (c_63s ^ w0s08)); + SHA1_STEP (SHA1_F1 , b, c, d, e, a, (c_64s ^ w0s04___w0s06___w0s07 ^ w0s08___w0s12 ^ w0s17)); + SHA1_STEPX(SHA1_F1 , a, b, c, d, e, (c_65sK)); + SHA1_STEP (SHA1_F1 , e, a, b, c, d, (c_66s ^ w0s14 ^ w0s16)); + SHA1_STEP (SHA1_F1 , d, e, a, b, c, (c_67s ^ w0s08 ^ w0s18)); + SHA1_STEP (SHA1_F1 , c, d, e, a, b, (c_68s ^ w0s11 ^ w0s14 ^ w0s15)); + SHA1_STEPX(SHA1_F1 , b, c, d, e, a, (c_69sK)); + SHA1_STEP (SHA1_F1 , a, b, c, d, e, (c_70s ^ w0s12 ^ w0s19)); + SHA1_STEP (SHA1_F1 , e, a, b, c, d, (c_71s ^ w0s12 ^ w0s16)); + SHA1_STEP (SHA1_F1 , d, e, a, b, c, (c_72s ^ w0s05 ^ w0s11 ^ w0s12 ^ w0s13 ^ w0s16 ^ w0s18)); + SHA1_STEP (SHA1_F1 , c, d, e, a, b, (c_73s ^ w0s20)); + SHA1_STEP (SHA1_F1 , b, c, d, e, a, (c_74s ^ w0s08 ^ w0s16)); + + SHA1_STEP (SHA1_F1, a, b, c, d, e, (c_75s ^ w0s06 ^ w0s12 ^ w0s14)); + + const u32 c_76s = rotl32 ((c_73s ^ c_68s ^ c_62s ^ c_60s), 1u); + const u32 c_77s = rotl32 ((c_74s ^ c_69s ^ c_63s ^ c_61s), 1u); + const u32 c_78s = rotl32 ((c_75s ^ c_70s ^ c_64s ^ c_62s), 1u); + const u32 c_79s = rotl32 ((c_76s ^ c_71s ^ c_65s ^ c_63s), 1u); + + const u32x w0s21 = rotl32 (w0, 21u); + const u32x w0s22 = rotl32 (w0, 22U); + + SHA1_STEP (SHA1_F1 , e, a, b, c, d, (c_76s ^ w0s07 ^ w0s08___w0s12 ^ w0s16 ^ w0s21)); + SHA1_STEP (SHA1_F1 , d, e, a, b, c, (c_77s)); + SHA1_STEP (SHA1_F1 , c, d, e, a, b, (c_78s ^ w0s07 ^ w0s08 ^ w0s15 ^ w0s18 ^ w0s20)); + SHA1_STEP (SHA1_F1 , b, c, d, e, a, (c_79s ^ w0s08 ^ w0s22)); + + a += SHA1M_A; + e += SHA1M_E; + d += SHA1M_D; + c += SHA1M_C; + + { + const u32x r0 = a; + const u32x r1 = e; + const u32x r2 = d; + const u32x r3 = c; + + #include VECT_COMPARE_S + } + + a &= 0x00000fff; + + { + const u32x r0 = a; + const u32x r1 = e; + const u32x r2 = d; + const u32x r3 = c; + + #include VECT_COMPARE_S + } + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m00190_m04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global u32x * words_buf_r, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32 w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = 0; + w[ 5] = 0; + w[ 6] = 0; + w[ 7] = 0; + w[ 8] = 0; + w[ 9] = 0; + w[10] = 0; + w[11] = 0; + w[12] = 0; + w[13] = 0; + w[14] = 0; + w[15] = pws[gid].i[15]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m00190m (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m00190_m08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global u32x * words_buf_r, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32 w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = pws[gid].i[ 4]; + w[ 5] = pws[gid].i[ 5]; + w[ 6] = pws[gid].i[ 6]; + w[ 7] = pws[gid].i[ 7]; + w[ 8] = 0; + w[ 9] = 0; + w[10] = 0; + w[11] = 0; + w[12] = 0; + w[13] = 0; + w[14] = 0; + w[15] = pws[gid].i[15]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m00190m (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m00190_m16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global u32x * words_buf_r, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32 w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = pws[gid].i[ 4]; + w[ 5] = pws[gid].i[ 5]; + w[ 6] = pws[gid].i[ 6]; + w[ 7] = pws[gid].i[ 7]; + w[ 8] = pws[gid].i[ 8]; + w[ 9] = pws[gid].i[ 9]; + w[10] = pws[gid].i[10]; + w[11] = pws[gid].i[11]; + w[12] = pws[gid].i[12]; + w[13] = pws[gid].i[13]; + w[14] = pws[gid].i[14]; + w[15] = pws[gid].i[15]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m00190m (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m00190_s04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global u32x * words_buf_r, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32 w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = 0; + w[ 5] = 0; + w[ 6] = 0; + w[ 7] = 0; + w[ 8] = 0; + w[ 9] = 0; + w[10] = 0; + w[11] = 0; + w[12] = 0; + w[13] = 0; + w[14] = 0; + w[15] = pws[gid].i[15]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m00190s (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m00190_s08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global u32x * words_buf_r, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32 w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = pws[gid].i[ 4]; + w[ 5] = pws[gid].i[ 5]; + w[ 6] = pws[gid].i[ 6]; + w[ 7] = pws[gid].i[ 7]; + w[ 8] = 0; + w[ 9] = 0; + w[10] = 0; + w[11] = 0; + w[12] = 0; + w[13] = 0; + w[14] = 0; + w[15] = pws[gid].i[15]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m00190s (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m00190_s16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global u32x * words_buf_r, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32 w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = pws[gid].i[ 4]; + w[ 5] = pws[gid].i[ 5]; + w[ 6] = pws[gid].i[ 6]; + w[ 7] = pws[gid].i[ 7]; + w[ 8] = pws[gid].i[ 8]; + w[ 9] = pws[gid].i[ 9]; + w[10] = pws[gid].i[10]; + w[11] = pws[gid].i[11]; + w[12] = pws[gid].i[12]; + w[13] = pws[gid].i[13]; + w[14] = pws[gid].i[14]; + w[15] = pws[gid].i[15]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m00190s (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} diff --git a/amd/m00200_a0.cl b/amd/m00200_a0.cl new file mode 100644 index 0000000000..d6fe4b56c5 --- /dev/null +++ b/amd/m00200_a0.cl @@ -0,0 +1,363 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _MYSQL323_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW4 +#define VECT_SIZE4 +#endif + +#ifdef VLIW5 +#define VECT_SIZE4 +#endif + +#define DGST_R0 0 +#define DGST_R1 1 +#define DGST_R2 2 +#define DGST_R3 3 + +#include "include/kernel_functions.c" +#include "types_amd.c" +#include "common_amd.c" +#include "include/rp_gpu.h" +#include "rp_amd.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m00200_m04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + u32x pw_buf1[4]; + + pw_buf1[0] = pws[gid].i[ 4]; + pw_buf1[1] = pws[gid].i[ 5]; + pw_buf1[2] = pws[gid].i[ 6]; + pw_buf1[3] = pws[gid].i[ 7]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + + w0[0] = pw_buf0[0]; + w0[1] = pw_buf0[1]; + w0[2] = pw_buf0[2]; + w0[3] = pw_buf0[3]; + + u32x w1[4]; + + w1[0] = pw_buf1[0]; + w1[1] = pw_buf1[1]; + w1[2] = pw_buf1[2]; + w1[3] = pw_buf1[3]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 out_len = apply_rules (rules_buf[il_pos].cmds, w0, w1, pw_len); + + u32x w_t[16]; + + w_t[ 0] = w0[0]; + w_t[ 1] = w0[1]; + w_t[ 2] = w0[2]; + w_t[ 3] = w0[3]; + w_t[ 4] = w1[0]; + w_t[ 5] = w1[1]; + w_t[ 6] = w1[2]; + w_t[ 7] = w1[3]; + w_t[ 8] = 0; + w_t[ 9] = 0; + w_t[10] = 0; + w_t[11] = 0; + w_t[12] = 0; + w_t[13] = 0; + w_t[14] = 0; + w_t[15] = 0; + + u32x a = MYSQL323_A; + u32x b = MYSQL323_B; + + u32x add = 7; + + #define ROUND(v) \ + { \ + a ^= (((a & 0x3f) + add) * (v)) + (a << 8); \ + b += (b << 8) ^ a; \ + add += v; \ + } + + int i; + int j; + + for (i = 0, j = 0; i <= (int) out_len - 4; i += 4, j += 1) + { + const u32x wj = w_t[j]; + + ROUND ((wj >> 0) & 0xff); + ROUND ((wj >> 8) & 0xff); + ROUND ((wj >> 16) & 0xff); + ROUND ((wj >> 24) & 0xff); + } + + const u32x wj = w_t[j]; + + const u32 left = out_len - i; + + if (left == 3) + { + ROUND ((wj >> 0) & 0xff); + ROUND ((wj >> 8) & 0xff); + ROUND ((wj >> 16) & 0xff); + } + else if (left == 2) + { + ROUND ((wj >> 0) & 0xff); + ROUND ((wj >> 8) & 0xff); + } + else if (left == 1) + { + ROUND ((wj >> 0) & 0xff); + } + + a &= 0x7fffffff; + b &= 0x7fffffff; + + const u32x r0 = a; + const u32x r1 = b; + const u32x r2 = 0; + const u32x r3 = 0; + + #include VECT_COMPARE_M + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m00200_m08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m00200_m16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m00200_s04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + u32x pw_buf1[4]; + + pw_buf1[0] = pws[gid].i[ 4]; + pw_buf1[1] = pws[gid].i[ 5]; + pw_buf1[2] = pws[gid].i[ 6]; + pw_buf1[3] = pws[gid].i[ 7]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + + w0[0] = pw_buf0[0]; + w0[1] = pw_buf0[1]; + w0[2] = pw_buf0[2]; + w0[3] = pw_buf0[3]; + + u32x w1[4]; + + w1[0] = pw_buf1[0]; + w1[1] = pw_buf1[1]; + w1[2] = pw_buf1[2]; + w1[3] = pw_buf1[3]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 out_len = apply_rules (rules_buf[il_pos].cmds, w0, w1, pw_len); + + u32x w_t[16]; + + w_t[ 0] = w0[0]; + w_t[ 1] = w0[1]; + w_t[ 2] = w0[2]; + w_t[ 3] = w0[3]; + w_t[ 4] = w1[0]; + w_t[ 5] = w1[1]; + w_t[ 6] = w1[2]; + w_t[ 7] = w1[3]; + w_t[ 8] = 0; + w_t[ 9] = 0; + w_t[10] = 0; + w_t[11] = 0; + w_t[12] = 0; + w_t[13] = 0; + w_t[14] = 0; + w_t[15] = 0; + + u32x a = MYSQL323_A; + u32x b = MYSQL323_B; + + u32x add = 7; + + #define ROUND(v) \ + { \ + a ^= (((a & 0x3f) + add) * (v)) + (a << 8); \ + b += (b << 8) ^ a; \ + add += v; \ + } + + int i; + int j; + + for (i = 0, j = 0; i <= (int) out_len - 4; i += 4, j += 1) + { + const u32x wj = w_t[j]; + + ROUND ((wj >> 0) & 0xff); + ROUND ((wj >> 8) & 0xff); + ROUND ((wj >> 16) & 0xff); + ROUND ((wj >> 24) & 0xff); + } + + const u32x wj = w_t[j]; + + const u32 left = out_len - i; + + if (left == 3) + { + ROUND ((wj >> 0) & 0xff); + ROUND ((wj >> 8) & 0xff); + ROUND ((wj >> 16) & 0xff); + } + else if (left == 2) + { + ROUND ((wj >> 0) & 0xff); + ROUND ((wj >> 8) & 0xff); + } + else if (left == 1) + { + ROUND ((wj >> 0) & 0xff); + } + + a &= 0x7fffffff; + b &= 0x7fffffff; + + const u32x r0 = a; + const u32x r1 = b; + const u32x r2 = 0; + const u32x r3 = 0; + + #include VECT_COMPARE_S + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m00200_s08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m00200_s16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/amd/m00200_a1.cl b/amd/m00200_a1.cl new file mode 100644 index 0000000000..2a088d572b --- /dev/null +++ b/amd/m00200_a1.cl @@ -0,0 +1,413 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _MYSQL323_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW4 +#define VECT_SIZE4 +#endif + +#ifdef VLIW5 +#define VECT_SIZE4 +#endif + +#define DGST_R0 0 +#define DGST_R1 1 +#define DGST_R2 2 +#define DGST_R3 3 + +#include "include/kernel_functions.c" +#include "types_amd.c" +#include "common_amd.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m00200_m04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, combs_buf[0].pw_len); + } + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = combs_buf[il_pos].pw_len; + + const u32 pw_len = pw_l_len + pw_r_len; + + u32 wordr0[4]; + + wordr0[0] = combs_buf[il_pos].i[0]; + wordr0[1] = combs_buf[il_pos].i[1]; + wordr0[2] = combs_buf[il_pos].i[2]; + wordr0[3] = combs_buf[il_pos].i[3]; + + u32 wordr1[4]; + + wordr1[0] = combs_buf[il_pos].i[4]; + wordr1[1] = combs_buf[il_pos].i[5]; + wordr1[2] = combs_buf[il_pos].i[6]; + wordr1[3] = combs_buf[il_pos].i[7]; + + u32 wordr2[4]; + + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + + u32 wordr3[4]; + + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + u32x w_t[16]; + + w_t[ 0] = wordl0[0] | wordr0[0]; + w_t[ 1] = wordl0[1] | wordr0[1]; + w_t[ 2] = wordl0[2] | wordr0[2]; + w_t[ 3] = wordl0[3] | wordr0[3]; + w_t[ 4] = wordl1[0] | wordr1[0]; + w_t[ 5] = wordl1[1] | wordr1[1]; + w_t[ 6] = wordl1[2] | wordr1[2]; + w_t[ 7] = wordl1[3] | wordr1[3]; + w_t[ 8] = wordl2[0] | wordr2[0]; + w_t[ 9] = wordl2[1] | wordr2[1]; + w_t[10] = wordl2[2] | wordr2[2]; + w_t[11] = wordl2[3] | wordr2[3]; + w_t[12] = wordl3[0] | wordr3[0]; + w_t[13] = wordl3[1] | wordr3[1]; + w_t[14] = wordl3[2] | wordr3[2]; + w_t[15] = 0; + + u32x a = MYSQL323_A; + u32x b = MYSQL323_B; + + u32x add = 7; + + #define ROUND(v) \ + { \ + a ^= (((a & 0x3f) + add) * (v)) + (a << 8); \ + b += (b << 8) ^ a; \ + add += v; \ + } + + int i; + int j; + + for (i = 0, j = 0; i <= (int) pw_len - 4; i += 4, j += 1) + { + const u32x wj = w_t[j]; + + ROUND ((wj >> 0) & 0xff); + ROUND ((wj >> 8) & 0xff); + ROUND ((wj >> 16) & 0xff); + ROUND ((wj >> 24) & 0xff); + } + + const u32x wj = w_t[j]; + + const u32 left = pw_len - i; + + if (left == 3) + { + ROUND ((wj >> 0) & 0xff); + ROUND ((wj >> 8) & 0xff); + ROUND ((wj >> 16) & 0xff); + } + else if (left == 2) + { + ROUND ((wj >> 0) & 0xff); + ROUND ((wj >> 8) & 0xff); + } + else if (left == 1) + { + ROUND ((wj >> 0) & 0xff); + } + + a &= 0x7fffffff; + b &= 0x7fffffff; + + const u32x r0 = a; + const u32x r1 = b; + const u32x r2 = 0; + const u32x r3 = 0; + + #include VECT_COMPARE_M + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m00200_m08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m00200_m16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m00200_s04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, combs_buf[0].pw_len); + } + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = combs_buf[il_pos].pw_len; + + const u32 pw_len = pw_l_len + pw_r_len; + + u32 wordr0[4]; + + wordr0[0] = combs_buf[il_pos].i[0]; + wordr0[1] = combs_buf[il_pos].i[1]; + wordr0[2] = combs_buf[il_pos].i[2]; + wordr0[3] = combs_buf[il_pos].i[3]; + + u32 wordr1[4]; + + wordr1[0] = combs_buf[il_pos].i[4]; + wordr1[1] = combs_buf[il_pos].i[5]; + wordr1[2] = combs_buf[il_pos].i[6]; + wordr1[3] = combs_buf[il_pos].i[7]; + + u32 wordr2[4]; + + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + + u32 wordr3[4]; + + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + u32x w_t[16]; + + w_t[ 0] = wordl0[0] | wordr0[0]; + w_t[ 1] = wordl0[1] | wordr0[1]; + w_t[ 2] = wordl0[2] | wordr0[2]; + w_t[ 3] = wordl0[3] | wordr0[3]; + w_t[ 4] = wordl1[0] | wordr1[0]; + w_t[ 5] = wordl1[1] | wordr1[1]; + w_t[ 6] = wordl1[2] | wordr1[2]; + w_t[ 7] = wordl1[3] | wordr1[3]; + w_t[ 8] = wordl2[0] | wordr2[0]; + w_t[ 9] = wordl2[1] | wordr2[1]; + w_t[10] = wordl2[2] | wordr2[2]; + w_t[11] = wordl2[3] | wordr2[3]; + w_t[12] = wordl3[0] | wordr3[0]; + w_t[13] = wordl3[1] | wordr3[1]; + w_t[14] = wordl3[2] | wordr3[2]; + w_t[15] = 0; + + u32x a = MYSQL323_A; + u32x b = MYSQL323_B; + + u32x add = 7; + + #define ROUND(v) \ + { \ + a ^= (((a & 0x3f) + add) * (v)) + (a << 8); \ + b += (b << 8) ^ a; \ + add += v; \ + } + + int i; + int j; + + for (i = 0, j = 0; i <= (int) pw_len - 4; i += 4, j += 1) + { + const u32x wj = w_t[j]; + + ROUND ((wj >> 0) & 0xff); + ROUND ((wj >> 8) & 0xff); + ROUND ((wj >> 16) & 0xff); + ROUND ((wj >> 24) & 0xff); + } + + const u32x wj = w_t[j]; + + const u32 left = pw_len - i; + + if (left == 3) + { + ROUND ((wj >> 0) & 0xff); + ROUND ((wj >> 8) & 0xff); + ROUND ((wj >> 16) & 0xff); + } + else if (left == 2) + { + ROUND ((wj >> 0) & 0xff); + ROUND ((wj >> 8) & 0xff); + } + else if (left == 1) + { + ROUND ((wj >> 0) & 0xff); + } + + a &= 0x7fffffff; + b &= 0x7fffffff; + + const u32x r0 = a; + const u32x r1 = b; + const u32x r2 = 0; + const u32x r3 = 0; + + #include VECT_COMPARE_S + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m00200_s08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m00200_s16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/amd/m00200_a3.cl b/amd/m00200_a3.cl new file mode 100644 index 0000000000..0f3ac89ce8 --- /dev/null +++ b/amd/m00200_a3.cl @@ -0,0 +1,492 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _MYSQL323_ +#define _SCALAR_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW4 +#define VECT_SIZE4 +#endif + +#ifdef VLIW5 +#define VECT_SIZE4 +#endif + +#define DGST_R0 0 +#define DGST_R1 1 +#define DGST_R2 2 +#define DGST_R3 3 + +#include "include/kernel_functions.c" +#include "types_amd.c" +#include "common_amd.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4_warp.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4_warp.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4_warp.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4_warp.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4_warp.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4_warp.c" +#endif + +static void m00200m (u32 w[16], const u32 pw_len, __global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global u32x * words_buf_r, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset) +{ + /** + * modifier + */ + + const u32 gid = get_global_id (0); + const u32 lid = get_local_id (0); + + /** + * loop + */ + + const u32 bf_loops = ceil ((float) bfs_cnt / VECT_DIV); + + u32x w0l = w[0]; + + for (u32 il_pos = 0; il_pos < bf_loops; il_pos++) + { + const u32x w0r = words_buf_r[il_pos]; + + const u32x w0 = w0l | w0r; + + u32x a = MYSQL323_A; + u32x b = MYSQL323_B; + + u32x add = 7; + + #define ROUND(v) \ + { \ + a ^= (((a & 0x3f) + add) * (v)) + (a << 8); \ + b += (b << 8) ^ a; \ + add += v; \ + } + + if (pw_len >= 4) + { + ROUND ((w0 >> 0) & 0xff); + ROUND ((w0 >> 8) & 0xff); + ROUND ((w0 >> 16) & 0xff); + ROUND ((w0 >> 24) & 0xff); + } + else if (pw_len == 3) + { + ROUND ((w0 >> 0) & 0xff); + ROUND ((w0 >> 8) & 0xff); + ROUND ((w0 >> 16) & 0xff); + } + else if (pw_len == 2) + { + ROUND ((w0 >> 0) & 0xff); + ROUND ((w0 >> 8) & 0xff); + } + else if (pw_len == 1) + { + ROUND ((w0 >> 0) & 0xff); + } + + int i; + int j; + + for (i = 4, j = 1; i <= (int) pw_len - 4; i += 4, j += 1) + { + const u32 wj = w[j]; + + ROUND ((wj >> 0) & 0xff); + ROUND ((wj >> 8) & 0xff); + ROUND ((wj >> 16) & 0xff); + ROUND ((wj >> 24) & 0xff); + } + + const u32 wj = w[j]; + + const u32 left = pw_len - i; + + if (left == 3) + { + ROUND ((wj >> 0) & 0xff); + ROUND ((wj >> 8) & 0xff); + ROUND ((wj >> 16) & 0xff); + } + else if (left == 2) + { + ROUND ((wj >> 0) & 0xff); + ROUND ((wj >> 8) & 0xff); + } + else if (left == 1) + { + ROUND ((wj >> 0) & 0xff); + } + + a &= 0x7fffffff; + b &= 0x7fffffff; + + const u32x r0 = a; + const u32x r1 = b; + const u32x r2 = 0; + const u32x r3 = 0; + + #include VECT_COMPARE_M + } +} + +static void m00200s (u32 w[16], const u32 pw_len, __global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global u32x * words_buf_r, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset) +{ + /** + * modifier + */ + + const u32 gid = get_global_id (0); + const u32 lid = get_local_id (0); + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * loop + */ + + const u32 bf_loops = ceil ((float) bfs_cnt / VECT_DIV); + + u32x w0l = w[0]; + + for (u32 il_pos = 0; il_pos < bf_loops; il_pos++) + { + const u32x w0r = words_buf_r[il_pos]; + + const u32x w0 = w0l | w0r; + + u32x a = MYSQL323_A; + u32x b = MYSQL323_B; + + u32x add = 7; + + #define ROUND(v) \ + { \ + a ^= (((a & 0x3f) + add) * (v)) + (a << 8); \ + b += (b << 8) ^ a; \ + add += v; \ + } + + if (pw_len >= 4) + { + ROUND ((w0 >> 0) & 0xff); + ROUND ((w0 >> 8) & 0xff); + ROUND ((w0 >> 16) & 0xff); + ROUND ((w0 >> 24) & 0xff); + } + else if (pw_len == 3) + { + ROUND ((w0 >> 0) & 0xff); + ROUND ((w0 >> 8) & 0xff); + ROUND ((w0 >> 16) & 0xff); + } + else if (pw_len == 2) + { + ROUND ((w0 >> 0) & 0xff); + ROUND ((w0 >> 8) & 0xff); + } + else if (pw_len == 1) + { + ROUND ((w0 >> 0) & 0xff); + } + + int i; + int j; + + for (i = 4, j = 1; i <= (int) pw_len - 4; i += 4, j += 1) + { + const u32 wj = w[j]; + + ROUND ((wj >> 0) & 0xff); + ROUND ((wj >> 8) & 0xff); + ROUND ((wj >> 16) & 0xff); + ROUND ((wj >> 24) & 0xff); + } + + const u32 wj = w[j]; + + const u32 left = pw_len - i; + + if (left == 3) + { + ROUND ((wj >> 0) & 0xff); + ROUND ((wj >> 8) & 0xff); + ROUND ((wj >> 16) & 0xff); + } + else if (left == 2) + { + ROUND ((wj >> 0) & 0xff); + ROUND ((wj >> 8) & 0xff); + } + else if (left == 1) + { + ROUND ((wj >> 0) & 0xff); + } + + a &= 0x7fffffff; + b &= 0x7fffffff; + + const u32x r0 = a; + const u32x r1 = b; + const u32x r2 = 0; + const u32x r3 = 0; + + #include VECT_COMPARE_S + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m00200_m04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global u32x * words_buf_r, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32 w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = 0; + w[ 5] = 0; + w[ 6] = 0; + w[ 7] = 0; + w[ 8] = 0; + w[ 9] = 0; + w[10] = 0; + w[11] = 0; + w[12] = 0; + w[13] = 0; + w[14] = 0; + w[15] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m00200m (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m00200_m08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global u32x * words_buf_r, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32 w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = pws[gid].i[ 4]; + w[ 5] = pws[gid].i[ 5]; + w[ 6] = pws[gid].i[ 6]; + w[ 7] = pws[gid].i[ 7]; + w[ 8] = 0; + w[ 9] = 0; + w[10] = 0; + w[11] = 0; + w[12] = 0; + w[13] = 0; + w[14] = 0; + w[15] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m00200m (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m00200_m16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global u32x * words_buf_r, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32 w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = pws[gid].i[ 4]; + w[ 5] = pws[gid].i[ 5]; + w[ 6] = pws[gid].i[ 6]; + w[ 7] = pws[gid].i[ 7]; + w[ 8] = pws[gid].i[ 8]; + w[ 9] = pws[gid].i[ 9]; + w[10] = pws[gid].i[10]; + w[11] = pws[gid].i[11]; + w[12] = pws[gid].i[12]; + w[13] = pws[gid].i[13]; + w[14] = pws[gid].i[14]; + w[15] = pws[gid].i[15]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m00200m (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m00200_s04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global u32x * words_buf_r, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32 w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = 0; + w[ 5] = 0; + w[ 6] = 0; + w[ 7] = 0; + w[ 8] = 0; + w[ 9] = 0; + w[10] = 0; + w[11] = 0; + w[12] = 0; + w[13] = 0; + w[14] = 0; + w[15] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m00200s (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m00200_s08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global u32x * words_buf_r, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32 w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = pws[gid].i[ 4]; + w[ 5] = pws[gid].i[ 5]; + w[ 6] = pws[gid].i[ 6]; + w[ 7] = pws[gid].i[ 7]; + w[ 8] = 0; + w[ 9] = 0; + w[10] = 0; + w[11] = 0; + w[12] = 0; + w[13] = 0; + w[14] = 0; + w[15] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m00200s (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m00200_s16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global u32x * words_buf_r, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32 w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = pws[gid].i[ 4]; + w[ 5] = pws[gid].i[ 5]; + w[ 6] = pws[gid].i[ 6]; + w[ 7] = pws[gid].i[ 7]; + w[ 8] = pws[gid].i[ 8]; + w[ 9] = pws[gid].i[ 9]; + w[10] = pws[gid].i[10]; + w[11] = pws[gid].i[11]; + w[12] = pws[gid].i[12]; + w[13] = pws[gid].i[13]; + w[14] = pws[gid].i[14]; + w[15] = pws[gid].i[15]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m00200s (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} diff --git a/amd/m00300_a0.cl b/amd/m00300_a0.cl new file mode 100644 index 0000000000..2a5c8836a2 --- /dev/null +++ b/amd/m00300_a0.cl @@ -0,0 +1,740 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _SHA1_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW4 +#define VECT_SIZE2 +#endif + +#ifdef VLIW5 +#define VECT_SIZE2 +#endif + +#define DGST_R0 3 +#define DGST_R1 4 +#define DGST_R2 2 +#define DGST_R3 1 + +#include "include/kernel_functions.c" +#include "types_amd.c" +#include "common_amd.c" +#include "include/rp_gpu.h" +#include "rp_amd.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m00300_m04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + u32x pw_buf1[4]; + + pw_buf1[0] = pws[gid].i[ 4]; + pw_buf1[1] = pws[gid].i[ 5]; + pw_buf1[2] = pws[gid].i[ 6]; + pw_buf1[3] = pws[gid].i[ 7]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + + w0[0] = pw_buf0[0]; + w0[1] = pw_buf0[1]; + w0[2] = pw_buf0[2]; + w0[3] = pw_buf0[3]; + + u32x w1[4]; + + w1[0] = pw_buf1[0]; + w1[1] = pw_buf1[1]; + w1[2] = pw_buf1[2]; + w1[3] = pw_buf1[3]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 out_len = apply_rules (rules_buf[il_pos].cmds, w0, w1, pw_len); + + append_0x80_2 (w0, w1, out_len); + + /** + * sha1 + */ + + u32x w0_t = swap_workaround (w0[0]); + u32x w1_t = swap_workaround (w0[1]); + u32x w2_t = swap_workaround (w0[2]); + u32x w3_t = swap_workaround (w0[3]); + u32x w4_t = swap_workaround (w1[0]); + u32x w5_t = swap_workaround (w1[1]); + u32x w6_t = swap_workaround (w1[2]); + u32x w7_t = swap_workaround (w1[3]); + u32x w8_t = swap_workaround (w2[0]); + u32x w9_t = swap_workaround (w2[1]); + u32x wa_t = swap_workaround (w2[2]); + u32x wb_t = swap_workaround (w2[3]); + u32x wc_t = swap_workaround (w3[0]); + u32x wd_t = swap_workaround (w3[1]); + u32x we_t = 0; + u32x wf_t = out_len * 8; + + u32x a = SHA1M_A; + u32x b = SHA1M_B; + u32x c = SHA1M_C; + u32x d = SHA1M_D; + u32x e = SHA1M_E; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w0_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w1_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w2_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w3_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w4_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w5_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w6_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w7_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w8_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w9_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wa_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, wb_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, wc_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, wd_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, we_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F0o, e, a, b, c, d, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F0o, d, e, a, b, c, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F0o, c, d, e, a, b, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F0o, b, c, d, e, a, w3_t); + + #undef K + #define K SHA1C01 + + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w7_t); + + #undef K + #define K SHA1C02 + + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wb_t); + + #undef K + #define K SHA1C03 + + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wf_t); + + a += SHA1M_A; + b += SHA1M_B; + c += SHA1M_C; + d += SHA1M_D; + e += SHA1M_E; + + w0_t = a; + w1_t = b; + w2_t = c; + w3_t = d; + w4_t = e; + w5_t = 0x80000000; + w6_t = 0; + w7_t = 0; + w8_t = 0; + w9_t = 0; + wa_t = 0; + wb_t = 0; + wc_t = 0; + wd_t = 0; + we_t = 0; + wf_t = 20 * 8; + + a = SHA1M_A; + b = SHA1M_B; + c = SHA1M_C; + d = SHA1M_D; + e = SHA1M_E; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w0_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w1_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w2_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w3_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w4_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w5_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w6_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w7_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w8_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w9_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wa_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, wb_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, wc_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, wd_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, we_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F0o, e, a, b, c, d, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F0o, d, e, a, b, c, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F0o, c, d, e, a, b, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F0o, b, c, d, e, a, w3_t); + + #undef K + #define K SHA1C01 + + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w7_t); + + #undef K + #define K SHA1C02 + + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wb_t); + + #undef K + #define K SHA1C03 + + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wf_t); + + + const u32x r0 = d; + const u32x r1 = e; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_M + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m00300_m08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m00300_m16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m00300_s04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + u32x pw_buf1[4]; + + pw_buf1[0] = pws[gid].i[ 4]; + pw_buf1[1] = pws[gid].i[ 5]; + pw_buf1[2] = pws[gid].i[ 6]; + pw_buf1[3] = pws[gid].i[ 7]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * reverse + */ + + const u32 e_rev = rotl32 (search[1], 2u); + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + + w0[0] = pw_buf0[0]; + w0[1] = pw_buf0[1]; + w0[2] = pw_buf0[2]; + w0[3] = pw_buf0[3]; + + u32x w1[4]; + + w1[0] = pw_buf1[0]; + w1[1] = pw_buf1[1]; + w1[2] = pw_buf1[2]; + w1[3] = pw_buf1[3]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 out_len = apply_rules (rules_buf[il_pos].cmds, w0, w1, pw_len); + + append_0x80_2 (w0, w1, out_len); + + /** + * sha1 + */ + + u32x w0_t = swap_workaround (w0[0]); + u32x w1_t = swap_workaround (w0[1]); + u32x w2_t = swap_workaround (w0[2]); + u32x w3_t = swap_workaround (w0[3]); + u32x w4_t = swap_workaround (w1[0]); + u32x w5_t = swap_workaround (w1[1]); + u32x w6_t = swap_workaround (w1[2]); + u32x w7_t = swap_workaround (w1[3]); + u32x w8_t = swap_workaround (w2[0]); + u32x w9_t = swap_workaround (w2[1]); + u32x wa_t = swap_workaround (w2[2]); + u32x wb_t = swap_workaround (w2[3]); + u32x wc_t = swap_workaround (w3[0]); + u32x wd_t = swap_workaround (w3[1]); + u32x we_t = 0; + u32x wf_t = out_len * 8; + + u32x a = SHA1M_A; + u32x b = SHA1M_B; + u32x c = SHA1M_C; + u32x d = SHA1M_D; + u32x e = SHA1M_E; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w0_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w1_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w2_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w3_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w4_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w5_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w6_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w7_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w8_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w9_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wa_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, wb_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, wc_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, wd_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, we_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F0o, e, a, b, c, d, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F0o, d, e, a, b, c, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F0o, c, d, e, a, b, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F0o, b, c, d, e, a, w3_t); + + #undef K + #define K SHA1C01 + + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w7_t); + + #undef K + #define K SHA1C02 + + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wb_t); + + #undef K + #define K SHA1C03 + + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wf_t); + + a += SHA1M_A; + b += SHA1M_B; + c += SHA1M_C; + d += SHA1M_D; + e += SHA1M_E; + + w0_t = a; + w1_t = b; + w2_t = c; + w3_t = d; + w4_t = e; + w5_t = 0x80000000; + w6_t = 0; + w7_t = 0; + w8_t = 0; + w9_t = 0; + wa_t = 0; + wb_t = 0; + wc_t = 0; + wd_t = 0; + we_t = 0; + wf_t = 20 * 8; + + a = SHA1M_A; + b = SHA1M_B; + c = SHA1M_C; + d = SHA1M_D; + e = SHA1M_E; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w0_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w1_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w2_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w3_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w4_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w5_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w6_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w7_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w8_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w9_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wa_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, wb_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, wc_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, wd_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, we_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F0o, e, a, b, c, d, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F0o, d, e, a, b, c, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F0o, c, d, e, a, b, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F0o, b, c, d, e, a, w3_t); + + #undef K + #define K SHA1C01 + + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w7_t); + + #undef K + #define K SHA1C02 + + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wb_t); + + #undef K + #define K SHA1C03 + + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wb_t); + + if (allx (e != e_rev)) continue; + + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wf_t); + + + const u32x r0 = d; + const u32x r1 = e; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_S + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m00300_s08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m00300_s16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/amd/m00300_a1.cl b/amd/m00300_a1.cl new file mode 100644 index 0000000000..872b33af46 --- /dev/null +++ b/amd/m00300_a1.cl @@ -0,0 +1,850 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _SHA1_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW4 +#define VECT_SIZE2 +#endif + +#ifdef VLIW5 +#define VECT_SIZE2 +#endif + +#define DGST_R0 3 +#define DGST_R1 4 +#define DGST_R2 2 +#define DGST_R3 1 + +#include "include/kernel_functions.c" +#include "types_amd.c" +#include "common_amd.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m00300_m04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + append_0x80_2 (wordl0, wordl1, pw_l_len); + + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, combs_buf[0].pw_len); + } + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = combs_buf[il_pos].pw_len; + + const u32 pw_len = pw_l_len + pw_r_len; + + u32 wordr0[4]; + + wordr0[0] = combs_buf[il_pos].i[0]; + wordr0[1] = combs_buf[il_pos].i[1]; + wordr0[2] = combs_buf[il_pos].i[2]; + wordr0[3] = combs_buf[il_pos].i[3]; + + u32 wordr1[4]; + + wordr1[0] = combs_buf[il_pos].i[4]; + wordr1[1] = combs_buf[il_pos].i[5]; + wordr1[2] = combs_buf[il_pos].i[6]; + wordr1[3] = combs_buf[il_pos].i[7]; + + u32 wordr2[4]; + + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + + u32 wordr3[4]; + + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + append_0x80_2 (wordr0, wordr1, pw_r_len); + + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + u32x w0[4]; + + w0[0] = wordl0[0] | wordr0[0]; + w0[1] = wordl0[1] | wordr0[1]; + w0[2] = wordl0[2] | wordr0[2]; + w0[3] = wordl0[3] | wordr0[3]; + + u32x w1[4]; + + w1[0] = wordl1[0] | wordr1[0]; + w1[1] = wordl1[1] | wordr1[1]; + w1[2] = wordl1[2] | wordr1[2]; + w1[3] = wordl1[3] | wordr1[3]; + + u32x w2[4]; + + w2[0] = wordl2[0] | wordr2[0]; + w2[1] = wordl2[1] | wordr2[1]; + w2[2] = wordl2[2] | wordr2[2]; + w2[3] = wordl2[3] | wordr2[3]; + + u32x w3[4]; + + w3[0] = wordl3[0] | wordr3[0]; + w3[1] = wordl3[1] | wordr3[1]; + w3[2] = 0; + w3[3] = 0; + + /** + * sha1 + */ + + u32x w0_t = swap_workaround (w0[0]); + u32x w1_t = swap_workaround (w0[1]); + u32x w2_t = swap_workaround (w0[2]); + u32x w3_t = swap_workaround (w0[3]); + u32x w4_t = swap_workaround (w1[0]); + u32x w5_t = swap_workaround (w1[1]); + u32x w6_t = swap_workaround (w1[2]); + u32x w7_t = swap_workaround (w1[3]); + u32x w8_t = swap_workaround (w2[0]); + u32x w9_t = swap_workaround (w2[1]); + u32x wa_t = swap_workaround (w2[2]); + u32x wb_t = swap_workaround (w2[3]); + u32x wc_t = swap_workaround (w3[0]); + u32x wd_t = swap_workaround (w3[1]); + u32x we_t = 0; + u32x wf_t = pw_len * 8; + + u32x a = SHA1M_A; + u32x b = SHA1M_B; + u32x c = SHA1M_C; + u32x d = SHA1M_D; + u32x e = SHA1M_E; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w0_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w1_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w2_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w3_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w4_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w5_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w6_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w7_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w8_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w9_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wa_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, wb_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, wc_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, wd_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, we_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F0o, e, a, b, c, d, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F0o, d, e, a, b, c, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F0o, c, d, e, a, b, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F0o, b, c, d, e, a, w3_t); + + #undef K + #define K SHA1C01 + + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w7_t); + + #undef K + #define K SHA1C02 + + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wb_t); + + #undef K + #define K SHA1C03 + + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wf_t); + + a += SHA1M_A; + b += SHA1M_B; + c += SHA1M_C; + d += SHA1M_D; + e += SHA1M_E; + + w0_t = a; + w1_t = b; + w2_t = c; + w3_t = d; + w4_t = e; + w5_t = 0x80000000; + w6_t = 0; + w7_t = 0; + w8_t = 0; + w9_t = 0; + wa_t = 0; + wb_t = 0; + wc_t = 0; + wd_t = 0; + we_t = 0; + wf_t = 20 * 8; + + a = SHA1M_A; + b = SHA1M_B; + c = SHA1M_C; + d = SHA1M_D; + e = SHA1M_E; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w0_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w1_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w2_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w3_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w4_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w5_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w6_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w7_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w8_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w9_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wa_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, wb_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, wc_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, wd_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, we_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F0o, e, a, b, c, d, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F0o, d, e, a, b, c, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F0o, c, d, e, a, b, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F0o, b, c, d, e, a, w3_t); + + #undef K + #define K SHA1C01 + + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w7_t); + + #undef K + #define K SHA1C02 + + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wb_t); + + #undef K + #define K SHA1C03 + + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wf_t); + + + const u32x r0 = d; + const u32x r1 = e; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_M + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m00300_m08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m00300_m16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m00300_s04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + append_0x80_2 (wordl0, wordl1, pw_l_len); + + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, combs_buf[0].pw_len); + } + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * reverse + */ + + const u32 e_rev = rotl32 (search[1], 2u); + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = combs_buf[il_pos].pw_len; + + const u32 pw_len = pw_l_len + pw_r_len; + + u32 wordr0[4]; + + wordr0[0] = combs_buf[il_pos].i[0]; + wordr0[1] = combs_buf[il_pos].i[1]; + wordr0[2] = combs_buf[il_pos].i[2]; + wordr0[3] = combs_buf[il_pos].i[3]; + + u32 wordr1[4]; + + wordr1[0] = combs_buf[il_pos].i[4]; + wordr1[1] = combs_buf[il_pos].i[5]; + wordr1[2] = combs_buf[il_pos].i[6]; + wordr1[3] = combs_buf[il_pos].i[7]; + + u32 wordr2[4]; + + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + + u32 wordr3[4]; + + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + append_0x80_2 (wordr0, wordr1, pw_r_len); + + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + u32x w0[4]; + + w0[0] = wordl0[0] | wordr0[0]; + w0[1] = wordl0[1] | wordr0[1]; + w0[2] = wordl0[2] | wordr0[2]; + w0[3] = wordl0[3] | wordr0[3]; + + u32x w1[4]; + + w1[0] = wordl1[0] | wordr1[0]; + w1[1] = wordl1[1] | wordr1[1]; + w1[2] = wordl1[2] | wordr1[2]; + w1[3] = wordl1[3] | wordr1[3]; + + u32x w2[4]; + + w2[0] = wordl2[0] | wordr2[0]; + w2[1] = wordl2[1] | wordr2[1]; + w2[2] = wordl2[2] | wordr2[2]; + w2[3] = wordl2[3] | wordr2[3]; + + u32x w3[4]; + + w3[0] = wordl3[0] | wordr3[0]; + w3[1] = wordl3[1] | wordr3[1]; + w3[2] = 0; + w3[3] = 0; + + /** + * sha1 + */ + + u32x w0_t = swap_workaround (w0[0]); + u32x w1_t = swap_workaround (w0[1]); + u32x w2_t = swap_workaround (w0[2]); + u32x w3_t = swap_workaround (w0[3]); + u32x w4_t = swap_workaround (w1[0]); + u32x w5_t = swap_workaround (w1[1]); + u32x w6_t = swap_workaround (w1[2]); + u32x w7_t = swap_workaround (w1[3]); + u32x w8_t = swap_workaround (w2[0]); + u32x w9_t = swap_workaround (w2[1]); + u32x wa_t = swap_workaround (w2[2]); + u32x wb_t = swap_workaround (w2[3]); + u32x wc_t = swap_workaround (w3[0]); + u32x wd_t = swap_workaround (w3[1]); + u32x we_t = 0; + u32x wf_t = pw_len * 8; + + u32x a = SHA1M_A; + u32x b = SHA1M_B; + u32x c = SHA1M_C; + u32x d = SHA1M_D; + u32x e = SHA1M_E; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w0_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w1_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w2_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w3_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w4_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w5_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w6_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w7_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w8_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w9_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wa_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, wb_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, wc_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, wd_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, we_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F0o, e, a, b, c, d, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F0o, d, e, a, b, c, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F0o, c, d, e, a, b, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F0o, b, c, d, e, a, w3_t); + + #undef K + #define K SHA1C01 + + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w7_t); + + #undef K + #define K SHA1C02 + + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wb_t); + + #undef K + #define K SHA1C03 + + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wf_t); + + a += SHA1M_A; + b += SHA1M_B; + c += SHA1M_C; + d += SHA1M_D; + e += SHA1M_E; + + w0_t = a; + w1_t = b; + w2_t = c; + w3_t = d; + w4_t = e; + w5_t = 0x80000000; + w6_t = 0; + w7_t = 0; + w8_t = 0; + w9_t = 0; + wa_t = 0; + wb_t = 0; + wc_t = 0; + wd_t = 0; + we_t = 0; + wf_t = 20 * 8; + + a = SHA1M_A; + b = SHA1M_B; + c = SHA1M_C; + d = SHA1M_D; + e = SHA1M_E; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w0_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w1_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w2_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w3_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w4_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w5_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w6_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w7_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w8_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w9_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wa_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, wb_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, wc_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, wd_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, we_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F0o, e, a, b, c, d, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F0o, d, e, a, b, c, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F0o, c, d, e, a, b, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F0o, b, c, d, e, a, w3_t); + + #undef K + #define K SHA1C01 + + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w7_t); + + #undef K + #define K SHA1C02 + + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wb_t); + + #undef K + #define K SHA1C03 + + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wb_t); + + if (allx (e != e_rev)) continue; + + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wf_t); + + + const u32x r0 = d; + const u32x r1 = e; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_S + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m00300_s08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m00300_s16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/amd/m00300_a3.cl b/amd/m00300_a3.cl new file mode 100644 index 0000000000..b07105fa15 --- /dev/null +++ b/amd/m00300_a3.cl @@ -0,0 +1,1080 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _SHA1_ +#define _SCALAR_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW4 +#define VECT_SIZE2 +#endif + +#ifdef VLIW5 +#define VECT_SIZE2 +#endif + +#define DGST_R0 3 +#define DGST_R1 4 +#define DGST_R2 2 +#define DGST_R3 1 + +#include "include/kernel_functions.c" +#include "types_amd.c" +#include "common_amd.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4_warp.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4_warp.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4_warp.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4_warp.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4_warp.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4_warp.c" +#endif + +static void m00300m (u32 w[16], const u32 pw_len, __global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global u32x * words_buf_r, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset) +{ + /** + * modifier + */ + + const u32 gid = get_global_id (0); + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 c_16s = rotl32 ((w[13] ^ w[ 8] ^ w[ 2] ), 1u); + const u32 c_17s = rotl32 ((w[14] ^ w[ 9] ^ w[ 3] ^ w[ 1]), 1u); + const u32 c_18s = rotl32 ((w[15] ^ w[10] ^ w[ 4] ^ w[ 2]), 1u); + const u32 c_19s = rotl32 ((c_16s ^ w[11] ^ w[ 5] ^ w[ 3]), 1u); + const u32 c_20s = rotl32 ((c_17s ^ w[12] ^ w[ 6] ^ w[ 4]), 1u); + const u32 c_21s = rotl32 ((c_18s ^ w[13] ^ w[ 7] ^ w[ 5]), 1u); + const u32 c_22s = rotl32 ((c_19s ^ w[14] ^ w[ 8] ^ w[ 6]), 1u); + const u32 c_23s = rotl32 ((c_20s ^ w[15] ^ w[ 9] ^ w[ 7]), 1u); + const u32 c_24s = rotl32 ((c_21s ^ c_16s ^ w[10] ^ w[ 8]), 1u); + const u32 c_25s = rotl32 ((c_22s ^ c_17s ^ w[11] ^ w[ 9]), 1u); + const u32 c_26s = rotl32 ((c_23s ^ c_18s ^ w[12] ^ w[10]), 1u); + const u32 c_27s = rotl32 ((c_24s ^ c_19s ^ w[13] ^ w[11]), 1u); + const u32 c_28s = rotl32 ((c_25s ^ c_20s ^ w[14] ^ w[12]), 1u); + const u32 c_29s = rotl32 ((c_26s ^ c_21s ^ w[15] ^ w[13]), 1u); + const u32 c_30s = rotl32 ((c_27s ^ c_22s ^ c_16s ^ w[14]), 1u); + const u32 c_31s = rotl32 ((c_28s ^ c_23s ^ c_17s ^ w[15]), 1u); + const u32 c_32s = rotl32 ((c_29s ^ c_24s ^ c_18s ^ c_16s), 1u); + const u32 c_33s = rotl32 ((c_30s ^ c_25s ^ c_19s ^ c_17s), 1u); + const u32 c_34s = rotl32 ((c_31s ^ c_26s ^ c_20s ^ c_18s), 1u); + const u32 c_35s = rotl32 ((c_32s ^ c_27s ^ c_21s ^ c_19s), 1u); + const u32 c_36s = rotl32 ((c_33s ^ c_28s ^ c_22s ^ c_20s), 1u); + const u32 c_37s = rotl32 ((c_34s ^ c_29s ^ c_23s ^ c_21s), 1u); + const u32 c_38s = rotl32 ((c_35s ^ c_30s ^ c_24s ^ c_22s), 1u); + const u32 c_39s = rotl32 ((c_36s ^ c_31s ^ c_25s ^ c_23s), 1u); + const u32 c_40s = rotl32 ((c_37s ^ c_32s ^ c_26s ^ c_24s), 1u); + const u32 c_41s = rotl32 ((c_38s ^ c_33s ^ c_27s ^ c_25s), 1u); + const u32 c_42s = rotl32 ((c_39s ^ c_34s ^ c_28s ^ c_26s), 1u); + const u32 c_43s = rotl32 ((c_40s ^ c_35s ^ c_29s ^ c_27s), 1u); + const u32 c_44s = rotl32 ((c_41s ^ c_36s ^ c_30s ^ c_28s), 1u); + const u32 c_45s = rotl32 ((c_42s ^ c_37s ^ c_31s ^ c_29s), 1u); + const u32 c_46s = rotl32 ((c_43s ^ c_38s ^ c_32s ^ c_30s), 1u); + const u32 c_47s = rotl32 ((c_44s ^ c_39s ^ c_33s ^ c_31s), 1u); + const u32 c_48s = rotl32 ((c_45s ^ c_40s ^ c_34s ^ c_32s), 1u); + const u32 c_49s = rotl32 ((c_46s ^ c_41s ^ c_35s ^ c_33s), 1u); + const u32 c_50s = rotl32 ((c_47s ^ c_42s ^ c_36s ^ c_34s), 1u); + const u32 c_51s = rotl32 ((c_48s ^ c_43s ^ c_37s ^ c_35s), 1u); + const u32 c_52s = rotl32 ((c_49s ^ c_44s ^ c_38s ^ c_36s), 1u); + const u32 c_53s = rotl32 ((c_50s ^ c_45s ^ c_39s ^ c_37s), 1u); + const u32 c_54s = rotl32 ((c_51s ^ c_46s ^ c_40s ^ c_38s), 1u); + const u32 c_55s = rotl32 ((c_52s ^ c_47s ^ c_41s ^ c_39s), 1u); + const u32 c_56s = rotl32 ((c_53s ^ c_48s ^ c_42s ^ c_40s), 1u); + const u32 c_57s = rotl32 ((c_54s ^ c_49s ^ c_43s ^ c_41s), 1u); + const u32 c_58s = rotl32 ((c_55s ^ c_50s ^ c_44s ^ c_42s), 1u); + const u32 c_59s = rotl32 ((c_56s ^ c_51s ^ c_45s ^ c_43s), 1u); + const u32 c_60s = rotl32 ((c_57s ^ c_52s ^ c_46s ^ c_44s), 1u); + const u32 c_61s = rotl32 ((c_58s ^ c_53s ^ c_47s ^ c_45s), 1u); + const u32 c_62s = rotl32 ((c_59s ^ c_54s ^ c_48s ^ c_46s), 1u); + const u32 c_63s = rotl32 ((c_60s ^ c_55s ^ c_49s ^ c_47s), 1u); + const u32 c_64s = rotl32 ((c_61s ^ c_56s ^ c_50s ^ c_48s), 1u); + const u32 c_65s = rotl32 ((c_62s ^ c_57s ^ c_51s ^ c_49s), 1u); + const u32 c_66s = rotl32 ((c_63s ^ c_58s ^ c_52s ^ c_50s), 1u); + const u32 c_67s = rotl32 ((c_64s ^ c_59s ^ c_53s ^ c_51s), 1u); + const u32 c_68s = rotl32 ((c_65s ^ c_60s ^ c_54s ^ c_52s), 1u); + const u32 c_69s = rotl32 ((c_66s ^ c_61s ^ c_55s ^ c_53s), 1u); + const u32 c_70s = rotl32 ((c_67s ^ c_62s ^ c_56s ^ c_54s), 1u); + const u32 c_71s = rotl32 ((c_68s ^ c_63s ^ c_57s ^ c_55s), 1u); + const u32 c_72s = rotl32 ((c_69s ^ c_64s ^ c_58s ^ c_56s), 1u); + const u32 c_73s = rotl32 ((c_70s ^ c_65s ^ c_59s ^ c_57s), 1u); + const u32 c_74s = rotl32 ((c_71s ^ c_66s ^ c_60s ^ c_58s), 1u); + const u32 c_75s = rotl32 ((c_72s ^ c_67s ^ c_61s ^ c_59s), 1u); + const u32 c_76s = rotl32 ((c_73s ^ c_68s ^ c_62s ^ c_60s), 1u); + const u32 c_77s = rotl32 ((c_74s ^ c_69s ^ c_63s ^ c_61s), 1u); + const u32 c_78s = rotl32 ((c_75s ^ c_70s ^ c_64s ^ c_62s), 1u); + const u32 c_79s = rotl32 ((c_76s ^ c_71s ^ c_65s ^ c_63s), 1u); + + const u32 c_17sK = c_17s + SHA1C00; + const u32 c_18sK = c_18s + SHA1C00; + const u32 c_20sK = c_20s + SHA1C01; + const u32 c_21sK = c_21s + SHA1C01; + const u32 c_23sK = c_23s + SHA1C01; + const u32 c_26sK = c_26s + SHA1C01; + const u32 c_27sK = c_27s + SHA1C01; + const u32 c_29sK = c_29s + SHA1C01; + const u32 c_33sK = c_33s + SHA1C01; + const u32 c_39sK = c_39s + SHA1C01; + const u32 c_41sK = c_41s + SHA1C02; + const u32 c_45sK = c_45s + SHA1C02; + const u32 c_53sK = c_53s + SHA1C02; + const u32 c_65sK = c_65s + SHA1C03; + const u32 c_69sK = c_69s + SHA1C03; + + const u32 w1 = w[ 1] + SHA1C00; + const u32 w2 = w[ 2] + SHA1C00; + const u32 w3 = w[ 3] + SHA1C00; + const u32 w4 = w[ 4] + SHA1C00; + const u32 w5 = w[ 5] + SHA1C00; + const u32 w6 = w[ 6] + SHA1C00; + const u32 w7 = w[ 7] + SHA1C00; + const u32 w8 = w[ 8] + SHA1C00; + const u32 w9 = w[ 9] + SHA1C00; + const u32 wa = w[10] + SHA1C00; + const u32 wb = w[11] + SHA1C00; + const u32 wc = w[12] + SHA1C00; + const u32 wd = w[13] + SHA1C00; + const u32 we = w[14] + SHA1C00; + const u32 wf = w[15] + SHA1C00; + + /** + * loop + */ + + const u32 bf_loops = ceil ((float) bfs_cnt / VECT_DIV); + + u32x w0l = w[0]; + + for (u32 il_pos = 0; il_pos < bf_loops; il_pos++) + { + const u32x w0r = words_buf_r[il_pos]; + + const u32x w0 = w0l | w0r; + + const u32x w0s01 = rotl32 (w0, 1u); + const u32x w0s02 = rotl32 (w0, 2u); + const u32x w0s03 = rotl32 (w0, 3u); + const u32x w0s04 = rotl32 (w0, 4u); + const u32x w0s05 = rotl32 (w0, 5u); + const u32x w0s06 = rotl32 (w0, 6u); + const u32x w0s07 = rotl32 (w0, 7u); + const u32x w0s08 = rotl32 (w0, 8u); + const u32x w0s09 = rotl32 (w0, 9u); + const u32x w0s10 = rotl32 (w0, 10u); + const u32x w0s11 = rotl32 (w0, 11u); + const u32x w0s12 = rotl32 (w0, 12u); + const u32x w0s13 = rotl32 (w0, 13u); + const u32x w0s14 = rotl32 (w0, 14u); + const u32x w0s15 = rotl32 (w0, 15u); + const u32x w0s16 = rotl32 (w0, 16u); + const u32x w0s17 = rotl32 (w0, 17u); + const u32x w0s18 = rotl32 (w0, 18u); + const u32x w0s19 = rotl32 (w0, 19u); + const u32x w0s20 = rotl32 (w0, 20u); + const u32x w0s21 = rotl32 (w0, 21u); + const u32x w0s22 = rotl32 (w0, 22U); + + const u32x w0s04___w0s06 = w0s04 ^ w0s06; + const u32x w0s04___w0s08 = w0s04 ^ w0s08; + const u32x w0s08___w0s12 = w0s08 ^ w0s12; + const u32x w0s04___w0s06___w0s07 = w0s04___w0s06 ^ w0s07; + + u32x a = SHA1M_A; + u32x b = SHA1M_B; + u32x c = SHA1M_C; + u32x d = SHA1M_D; + u32x e = SHA1M_E; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w0); + SHA1_STEPX(SHA1_F0o, e, a, b, c, d, w1); + SHA1_STEPX(SHA1_F0o, d, e, a, b, c, w2); + SHA1_STEPX(SHA1_F0o, c, d, e, a, b, w3); + SHA1_STEPX(SHA1_F0o, b, c, d, e, a, w4); + SHA1_STEPX(SHA1_F0o, a, b, c, d, e, w5); + SHA1_STEPX(SHA1_F0o, e, a, b, c, d, w6); + SHA1_STEPX(SHA1_F0o, d, e, a, b, c, w7); + SHA1_STEPX(SHA1_F0o, c, d, e, a, b, w8); + SHA1_STEPX(SHA1_F0o, b, c, d, e, a, w9); + SHA1_STEPX(SHA1_F0o, a, b, c, d, e, wa); + SHA1_STEPX(SHA1_F0o, e, a, b, c, d, wb); + SHA1_STEPX(SHA1_F0o, d, e, a, b, c, wc); + SHA1_STEPX(SHA1_F0o, c, d, e, a, b, wd); + SHA1_STEPX(SHA1_F0o, b, c, d, e, a, we); + SHA1_STEPX(SHA1_F0o, a, b, c, d, e, wf); + + SHA1_STEP (SHA1_F0o, e, a, b, c, d, (c_16s ^ w0s01)); + SHA1_STEPX(SHA1_F0o, d, e, a, b, c, (c_17sK)); + SHA1_STEPX(SHA1_F0o, c, d, e, a, b, (c_18sK)); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, (c_19s ^ w0s02)); + + #undef K + #define K SHA1C01 + + SHA1_STEPX(SHA1_F1 , a, b, c, d, e, (c_20sK)); + SHA1_STEPX(SHA1_F1 , e, a, b, c, d, (c_21sK)); + SHA1_STEP (SHA1_F1 , d, e, a, b, c, (c_22s ^ w0s03)); + SHA1_STEPX(SHA1_F1 , c, d, e, a, b, (c_23sK)); + SHA1_STEP (SHA1_F1 , b, c, d, e, a, (c_24s ^ w0s02)); + SHA1_STEP (SHA1_F1 , a, b, c, d, e, (c_25s ^ w0s04)); + SHA1_STEPX(SHA1_F1 , e, a, b, c, d, (c_26sK)); + SHA1_STEPX(SHA1_F1 , d, e, a, b, c, (c_27sK)); + SHA1_STEP (SHA1_F1 , c, d, e, a, b, (c_28s ^ w0s05)); + SHA1_STEPX(SHA1_F1 , b, c, d, e, a, (c_29sK)); + SHA1_STEP (SHA1_F1 , a, b, c, d, e, (c_30s ^ w0s02 ^ w0s04)); + SHA1_STEP (SHA1_F1 , e, a, b, c, d, (c_31s ^ w0s06)); + SHA1_STEP (SHA1_F1 , d, e, a, b, c, (c_32s ^ w0s02 ^ w0s03)); + SHA1_STEPX(SHA1_F1 , c, d, e, a, b, (c_33sK)); + SHA1_STEP (SHA1_F1 , b, c, d, e, a, (c_34s ^ w0s07)); + SHA1_STEP (SHA1_F1 , a, b, c, d, e, (c_35s ^ w0s04)); + SHA1_STEP (SHA1_F1 , e, a, b, c, d, (c_36s ^ w0s04___w0s06)); + SHA1_STEP (SHA1_F1 , d, e, a, b, c, (c_37s ^ w0s08)); + SHA1_STEP (SHA1_F1 , c, d, e, a, b, (c_38s ^ w0s04)); + SHA1_STEPX(SHA1_F1 , b, c, d, e, a, (c_39sK)); + + #undef K + #define K SHA1C02 + + SHA1_STEP (SHA1_F2o, a, b, c, d, e, (c_40s ^ w0s04 ^ w0s09)); + SHA1_STEPX(SHA1_F2o, e, a, b, c, d, (c_41sK)); + SHA1_STEP (SHA1_F2o, d, e, a, b, c, (c_42s ^ w0s06 ^ w0s08)); + SHA1_STEP (SHA1_F2o, c, d, e, a, b, (c_43s ^ w0s10)); + SHA1_STEP (SHA1_F2o, b, c, d, e, a, (c_44s ^ w0s03 ^ w0s06 ^ w0s07)); + SHA1_STEPX(SHA1_F2o, a, b, c, d, e, (c_45sK)); + SHA1_STEP (SHA1_F2o, e, a, b, c, d, (c_46s ^ w0s04 ^ w0s11)); + SHA1_STEP (SHA1_F2o, d, e, a, b, c, (c_47s ^ w0s04___w0s08)); + SHA1_STEP (SHA1_F2o, c, d, e, a, b, (c_48s ^ w0s03 ^ w0s04___w0s08 ^ w0s05 ^ w0s10)); + SHA1_STEP (SHA1_F2o, b, c, d, e, a, (c_49s ^ w0s12)); + SHA1_STEP (SHA1_F2o, a, b, c, d, e, (c_50s ^ w0s08)); + SHA1_STEP (SHA1_F2o, e, a, b, c, d, (c_51s ^ w0s04___w0s06)); + SHA1_STEP (SHA1_F2o, d, e, a, b, c, (c_52s ^ w0s04___w0s08 ^ w0s13)); + SHA1_STEPX(SHA1_F2o, c, d, e, a, b, (c_53sK)); + SHA1_STEP (SHA1_F2o, b, c, d, e, a, (c_54s ^ w0s07 ^ w0s10 ^ w0s12)); + SHA1_STEP (SHA1_F2o, a, b, c, d, e, (c_55s ^ w0s14)); + SHA1_STEP (SHA1_F2o, e, a, b, c, d, (c_56s ^ w0s04___w0s06___w0s07 ^ w0s10 ^ w0s11)); + SHA1_STEP (SHA1_F2o, d, e, a, b, c, (c_57s ^ w0s08)); + SHA1_STEP (SHA1_F2o, c, d, e, a, b, (c_58s ^ w0s04___w0s08 ^ w0s15)); + SHA1_STEP (SHA1_F2o, b, c, d, e, a, (c_59s ^ w0s08___w0s12)); + + #undef K + #define K SHA1C03 + + SHA1_STEP (SHA1_F1 , a, b, c, d, e, (c_60s ^ w0s04 ^ w0s08___w0s12 ^ w0s07 ^ w0s14)); + SHA1_STEP (SHA1_F1 , e, a, b, c, d, (c_61s ^ w0s16)); + SHA1_STEP (SHA1_F1 , d, e, a, b, c, (c_62s ^ w0s04___w0s06 ^ w0s08___w0s12)); + SHA1_STEP (SHA1_F1 , c, d, e, a, b, (c_63s ^ w0s08)); + SHA1_STEP (SHA1_F1 , b, c, d, e, a, (c_64s ^ w0s04___w0s06___w0s07 ^ w0s08___w0s12 ^ w0s17)); + SHA1_STEPX(SHA1_F1 , a, b, c, d, e, (c_65sK)); + SHA1_STEP (SHA1_F1 , e, a, b, c, d, (c_66s ^ w0s14 ^ w0s16)); + SHA1_STEP (SHA1_F1 , d, e, a, b, c, (c_67s ^ w0s08 ^ w0s18)); + SHA1_STEP (SHA1_F1 , c, d, e, a, b, (c_68s ^ w0s11 ^ w0s14 ^ w0s15)); + SHA1_STEPX(SHA1_F1 , b, c, d, e, a, (c_69sK)); + SHA1_STEP (SHA1_F1 , a, b, c, d, e, (c_70s ^ w0s12 ^ w0s19)); + SHA1_STEP (SHA1_F1 , e, a, b, c, d, (c_71s ^ w0s12 ^ w0s16)); + SHA1_STEP (SHA1_F1 , d, e, a, b, c, (c_72s ^ w0s05 ^ w0s11 ^ w0s12 ^ w0s13 ^ w0s16 ^ w0s18)); + SHA1_STEP (SHA1_F1 , c, d, e, a, b, (c_73s ^ w0s20)); + SHA1_STEP (SHA1_F1 , b, c, d, e, a, (c_74s ^ w0s08 ^ w0s16)); + SHA1_STEP (SHA1_F1 , a, b, c, d, e, (c_75s ^ w0s06 ^ w0s12 ^ w0s14)); + SHA1_STEP (SHA1_F1 , e, a, b, c, d, (c_76s ^ w0s07 ^ w0s08___w0s12 ^ w0s16 ^ w0s21)); + SHA1_STEP (SHA1_F1 , d, e, a, b, c, (c_77s)); + SHA1_STEP (SHA1_F1 , c, d, e, a, b, (c_78s ^ w0s07 ^ w0s08 ^ w0s15 ^ w0s18 ^ w0s20)); + SHA1_STEP (SHA1_F1 , b, c, d, e, a, (c_79s ^ w0s08 ^ w0s22)); + + a += SHA1M_A; + b += SHA1M_B; + c += SHA1M_C; + d += SHA1M_D; + e += SHA1M_E; + + u32x w0_t = a; + u32x w1_t = b; + u32x w2_t = c; + u32x w3_t = d; + u32x w4_t = e; + u32x w5_t = 0x80000000; + u32x w6_t = 0; + u32x w7_t = 0; + u32x w8_t = 0; + u32x w9_t = 0; + u32x wa_t = 0; + u32x wb_t = 0; + u32x wc_t = 0; + u32x wd_t = 0; + u32x we_t = 0; + u32x wf_t = 20 * 8; + + a = SHA1M_A; + b = SHA1M_B; + c = SHA1M_C; + d = SHA1M_D; + e = SHA1M_E; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w0_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w1_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w2_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w3_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w4_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w5_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w6_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w7_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w8_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w9_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wa_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, wb_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, wc_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, wd_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, we_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F0o, e, a, b, c, d, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F0o, d, e, a, b, c, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F0o, c, d, e, a, b, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F0o, b, c, d, e, a, w3_t); + + #undef K + #define K SHA1C01 + + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w7_t); + + #undef K + #define K SHA1C02 + + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wb_t); + + #undef K + #define K SHA1C03 + + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wf_t); + + + const u32x r0 = d; + const u32x r1 = e; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_M + } +} + +static void m00300s (u32 w[16], const u32 pw_len, __global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global u32x * words_buf_r, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset) +{ + /** + * modifier + */ + + const u32 gid = get_global_id (0); + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 c_16s = rotl32 ((w[13] ^ w[ 8] ^ w[ 2] ), 1u); + const u32 c_17s = rotl32 ((w[14] ^ w[ 9] ^ w[ 3] ^ w[ 1]), 1u); + const u32 c_18s = rotl32 ((w[15] ^ w[10] ^ w[ 4] ^ w[ 2]), 1u); + const u32 c_19s = rotl32 ((c_16s ^ w[11] ^ w[ 5] ^ w[ 3]), 1u); + const u32 c_20s = rotl32 ((c_17s ^ w[12] ^ w[ 6] ^ w[ 4]), 1u); + const u32 c_21s = rotl32 ((c_18s ^ w[13] ^ w[ 7] ^ w[ 5]), 1u); + const u32 c_22s = rotl32 ((c_19s ^ w[14] ^ w[ 8] ^ w[ 6]), 1u); + const u32 c_23s = rotl32 ((c_20s ^ w[15] ^ w[ 9] ^ w[ 7]), 1u); + const u32 c_24s = rotl32 ((c_21s ^ c_16s ^ w[10] ^ w[ 8]), 1u); + const u32 c_25s = rotl32 ((c_22s ^ c_17s ^ w[11] ^ w[ 9]), 1u); + const u32 c_26s = rotl32 ((c_23s ^ c_18s ^ w[12] ^ w[10]), 1u); + const u32 c_27s = rotl32 ((c_24s ^ c_19s ^ w[13] ^ w[11]), 1u); + const u32 c_28s = rotl32 ((c_25s ^ c_20s ^ w[14] ^ w[12]), 1u); + const u32 c_29s = rotl32 ((c_26s ^ c_21s ^ w[15] ^ w[13]), 1u); + const u32 c_30s = rotl32 ((c_27s ^ c_22s ^ c_16s ^ w[14]), 1u); + const u32 c_31s = rotl32 ((c_28s ^ c_23s ^ c_17s ^ w[15]), 1u); + const u32 c_32s = rotl32 ((c_29s ^ c_24s ^ c_18s ^ c_16s), 1u); + const u32 c_33s = rotl32 ((c_30s ^ c_25s ^ c_19s ^ c_17s), 1u); + const u32 c_34s = rotl32 ((c_31s ^ c_26s ^ c_20s ^ c_18s), 1u); + const u32 c_35s = rotl32 ((c_32s ^ c_27s ^ c_21s ^ c_19s), 1u); + const u32 c_36s = rotl32 ((c_33s ^ c_28s ^ c_22s ^ c_20s), 1u); + const u32 c_37s = rotl32 ((c_34s ^ c_29s ^ c_23s ^ c_21s), 1u); + const u32 c_38s = rotl32 ((c_35s ^ c_30s ^ c_24s ^ c_22s), 1u); + const u32 c_39s = rotl32 ((c_36s ^ c_31s ^ c_25s ^ c_23s), 1u); + const u32 c_40s = rotl32 ((c_37s ^ c_32s ^ c_26s ^ c_24s), 1u); + const u32 c_41s = rotl32 ((c_38s ^ c_33s ^ c_27s ^ c_25s), 1u); + const u32 c_42s = rotl32 ((c_39s ^ c_34s ^ c_28s ^ c_26s), 1u); + const u32 c_43s = rotl32 ((c_40s ^ c_35s ^ c_29s ^ c_27s), 1u); + const u32 c_44s = rotl32 ((c_41s ^ c_36s ^ c_30s ^ c_28s), 1u); + const u32 c_45s = rotl32 ((c_42s ^ c_37s ^ c_31s ^ c_29s), 1u); + const u32 c_46s = rotl32 ((c_43s ^ c_38s ^ c_32s ^ c_30s), 1u); + const u32 c_47s = rotl32 ((c_44s ^ c_39s ^ c_33s ^ c_31s), 1u); + const u32 c_48s = rotl32 ((c_45s ^ c_40s ^ c_34s ^ c_32s), 1u); + const u32 c_49s = rotl32 ((c_46s ^ c_41s ^ c_35s ^ c_33s), 1u); + const u32 c_50s = rotl32 ((c_47s ^ c_42s ^ c_36s ^ c_34s), 1u); + const u32 c_51s = rotl32 ((c_48s ^ c_43s ^ c_37s ^ c_35s), 1u); + const u32 c_52s = rotl32 ((c_49s ^ c_44s ^ c_38s ^ c_36s), 1u); + const u32 c_53s = rotl32 ((c_50s ^ c_45s ^ c_39s ^ c_37s), 1u); + const u32 c_54s = rotl32 ((c_51s ^ c_46s ^ c_40s ^ c_38s), 1u); + const u32 c_55s = rotl32 ((c_52s ^ c_47s ^ c_41s ^ c_39s), 1u); + const u32 c_56s = rotl32 ((c_53s ^ c_48s ^ c_42s ^ c_40s), 1u); + const u32 c_57s = rotl32 ((c_54s ^ c_49s ^ c_43s ^ c_41s), 1u); + const u32 c_58s = rotl32 ((c_55s ^ c_50s ^ c_44s ^ c_42s), 1u); + const u32 c_59s = rotl32 ((c_56s ^ c_51s ^ c_45s ^ c_43s), 1u); + const u32 c_60s = rotl32 ((c_57s ^ c_52s ^ c_46s ^ c_44s), 1u); + const u32 c_61s = rotl32 ((c_58s ^ c_53s ^ c_47s ^ c_45s), 1u); + const u32 c_62s = rotl32 ((c_59s ^ c_54s ^ c_48s ^ c_46s), 1u); + const u32 c_63s = rotl32 ((c_60s ^ c_55s ^ c_49s ^ c_47s), 1u); + const u32 c_64s = rotl32 ((c_61s ^ c_56s ^ c_50s ^ c_48s), 1u); + const u32 c_65s = rotl32 ((c_62s ^ c_57s ^ c_51s ^ c_49s), 1u); + const u32 c_66s = rotl32 ((c_63s ^ c_58s ^ c_52s ^ c_50s), 1u); + const u32 c_67s = rotl32 ((c_64s ^ c_59s ^ c_53s ^ c_51s), 1u); + const u32 c_68s = rotl32 ((c_65s ^ c_60s ^ c_54s ^ c_52s), 1u); + const u32 c_69s = rotl32 ((c_66s ^ c_61s ^ c_55s ^ c_53s), 1u); + const u32 c_70s = rotl32 ((c_67s ^ c_62s ^ c_56s ^ c_54s), 1u); + const u32 c_71s = rotl32 ((c_68s ^ c_63s ^ c_57s ^ c_55s), 1u); + const u32 c_72s = rotl32 ((c_69s ^ c_64s ^ c_58s ^ c_56s), 1u); + const u32 c_73s = rotl32 ((c_70s ^ c_65s ^ c_59s ^ c_57s), 1u); + const u32 c_74s = rotl32 ((c_71s ^ c_66s ^ c_60s ^ c_58s), 1u); + const u32 c_75s = rotl32 ((c_72s ^ c_67s ^ c_61s ^ c_59s), 1u); + + const u32 c_17sK = c_17s + SHA1C00; + const u32 c_18sK = c_18s + SHA1C00; + const u32 c_20sK = c_20s + SHA1C01; + const u32 c_21sK = c_21s + SHA1C01; + const u32 c_23sK = c_23s + SHA1C01; + const u32 c_26sK = c_26s + SHA1C01; + const u32 c_27sK = c_27s + SHA1C01; + const u32 c_29sK = c_29s + SHA1C01; + const u32 c_33sK = c_33s + SHA1C01; + const u32 c_39sK = c_39s + SHA1C01; + const u32 c_41sK = c_41s + SHA1C02; + const u32 c_45sK = c_45s + SHA1C02; + const u32 c_53sK = c_53s + SHA1C02; + const u32 c_65sK = c_65s + SHA1C03; + const u32 c_69sK = c_69s + SHA1C03; + + const u32 w1 = w[ 1] + SHA1C00; + const u32 w2 = w[ 2] + SHA1C00; + const u32 w3 = w[ 3] + SHA1C00; + const u32 w4 = w[ 4] + SHA1C00; + const u32 w5 = w[ 5] + SHA1C00; + const u32 w6 = w[ 6] + SHA1C00; + const u32 w7 = w[ 7] + SHA1C00; + const u32 w8 = w[ 8] + SHA1C00; + const u32 w9 = w[ 9] + SHA1C00; + const u32 wa = w[10] + SHA1C00; + const u32 wb = w[11] + SHA1C00; + const u32 wc = w[12] + SHA1C00; + const u32 wd = w[13] + SHA1C00; + const u32 we = w[14] + SHA1C00; + const u32 wf = w[15] + SHA1C00; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * reverse + */ + + const u32 e_rev = rotl32 (search[1], 2u); + + /** + * loop + */ + + const u32 bf_loops = ceil ((float) bfs_cnt / VECT_DIV); + + u32x w0l = w[0]; + + for (u32 il_pos = 0; il_pos < bf_loops; il_pos++) + { + const u32x w0r = words_buf_r[il_pos]; + + const u32x w0 = w0l | w0r; + + const u32x w0s01 = rotl32 (w0, 1u); + const u32x w0s02 = rotl32 (w0, 2u); + const u32x w0s03 = rotl32 (w0, 3u); + const u32x w0s04 = rotl32 (w0, 4u); + const u32x w0s05 = rotl32 (w0, 5u); + const u32x w0s06 = rotl32 (w0, 6u); + const u32x w0s07 = rotl32 (w0, 7u); + const u32x w0s08 = rotl32 (w0, 8u); + const u32x w0s09 = rotl32 (w0, 9u); + const u32x w0s10 = rotl32 (w0, 10u); + const u32x w0s11 = rotl32 (w0, 11u); + const u32x w0s12 = rotl32 (w0, 12u); + const u32x w0s13 = rotl32 (w0, 13u); + const u32x w0s14 = rotl32 (w0, 14u); + const u32x w0s15 = rotl32 (w0, 15u); + const u32x w0s16 = rotl32 (w0, 16u); + const u32x w0s17 = rotl32 (w0, 17u); + const u32x w0s18 = rotl32 (w0, 18u); + const u32x w0s19 = rotl32 (w0, 19u); + const u32x w0s20 = rotl32 (w0, 20u); + + const u32x w0s04___w0s06 = w0s04 ^ w0s06; + const u32x w0s04___w0s08 = w0s04 ^ w0s08; + const u32x w0s08___w0s12 = w0s08 ^ w0s12; + const u32x w0s04___w0s06___w0s07 = w0s04___w0s06 ^ w0s07; + + u32x a = SHA1M_A; + u32x b = SHA1M_B; + u32x c = SHA1M_C; + u32x d = SHA1M_D; + u32x e = SHA1M_E; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w0); + SHA1_STEPX(SHA1_F0o, e, a, b, c, d, w1); + SHA1_STEPX(SHA1_F0o, d, e, a, b, c, w2); + SHA1_STEPX(SHA1_F0o, c, d, e, a, b, w3); + SHA1_STEPX(SHA1_F0o, b, c, d, e, a, w4); + SHA1_STEPX(SHA1_F0o, a, b, c, d, e, w5); + SHA1_STEPX(SHA1_F0o, e, a, b, c, d, w6); + SHA1_STEPX(SHA1_F0o, d, e, a, b, c, w7); + SHA1_STEPX(SHA1_F0o, c, d, e, a, b, w8); + SHA1_STEPX(SHA1_F0o, b, c, d, e, a, w9); + SHA1_STEPX(SHA1_F0o, a, b, c, d, e, wa); + SHA1_STEPX(SHA1_F0o, e, a, b, c, d, wb); + SHA1_STEPX(SHA1_F0o, d, e, a, b, c, wc); + SHA1_STEPX(SHA1_F0o, c, d, e, a, b, wd); + SHA1_STEPX(SHA1_F0o, b, c, d, e, a, we); + SHA1_STEPX(SHA1_F0o, a, b, c, d, e, wf); + + SHA1_STEP (SHA1_F0o, e, a, b, c, d, (c_16s ^ w0s01)); + SHA1_STEPX(SHA1_F0o, d, e, a, b, c, (c_17sK)); + SHA1_STEPX(SHA1_F0o, c, d, e, a, b, (c_18sK)); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, (c_19s ^ w0s02)); + + #undef K + #define K SHA1C01 + + SHA1_STEPX(SHA1_F1 , a, b, c, d, e, (c_20sK)); + SHA1_STEPX(SHA1_F1 , e, a, b, c, d, (c_21sK)); + SHA1_STEP (SHA1_F1 , d, e, a, b, c, (c_22s ^ w0s03)); + SHA1_STEPX(SHA1_F1 , c, d, e, a, b, (c_23sK)); + SHA1_STEP (SHA1_F1 , b, c, d, e, a, (c_24s ^ w0s02)); + SHA1_STEP (SHA1_F1 , a, b, c, d, e, (c_25s ^ w0s04)); + SHA1_STEPX(SHA1_F1 , e, a, b, c, d, (c_26sK)); + SHA1_STEPX(SHA1_F1 , d, e, a, b, c, (c_27sK)); + SHA1_STEP (SHA1_F1 , c, d, e, a, b, (c_28s ^ w0s05)); + SHA1_STEPX(SHA1_F1 , b, c, d, e, a, (c_29sK)); + SHA1_STEP (SHA1_F1 , a, b, c, d, e, (c_30s ^ w0s02 ^ w0s04)); + SHA1_STEP (SHA1_F1 , e, a, b, c, d, (c_31s ^ w0s06)); + SHA1_STEP (SHA1_F1 , d, e, a, b, c, (c_32s ^ w0s02 ^ w0s03)); + SHA1_STEPX(SHA1_F1 , c, d, e, a, b, (c_33sK)); + SHA1_STEP (SHA1_F1 , b, c, d, e, a, (c_34s ^ w0s07)); + SHA1_STEP (SHA1_F1 , a, b, c, d, e, (c_35s ^ w0s04)); + SHA1_STEP (SHA1_F1 , e, a, b, c, d, (c_36s ^ w0s04___w0s06)); + SHA1_STEP (SHA1_F1 , d, e, a, b, c, (c_37s ^ w0s08)); + SHA1_STEP (SHA1_F1 , c, d, e, a, b, (c_38s ^ w0s04)); + SHA1_STEPX(SHA1_F1 , b, c, d, e, a, (c_39sK)); + + #undef K + #define K SHA1C02 + + SHA1_STEP (SHA1_F2o, a, b, c, d, e, (c_40s ^ w0s04 ^ w0s09)); + SHA1_STEPX(SHA1_F2o, e, a, b, c, d, (c_41sK)); + SHA1_STEP (SHA1_F2o, d, e, a, b, c, (c_42s ^ w0s06 ^ w0s08)); + SHA1_STEP (SHA1_F2o, c, d, e, a, b, (c_43s ^ w0s10)); + SHA1_STEP (SHA1_F2o, b, c, d, e, a, (c_44s ^ w0s03 ^ w0s06 ^ w0s07)); + SHA1_STEPX(SHA1_F2o, a, b, c, d, e, (c_45sK)); + SHA1_STEP (SHA1_F2o, e, a, b, c, d, (c_46s ^ w0s04 ^ w0s11)); + SHA1_STEP (SHA1_F2o, d, e, a, b, c, (c_47s ^ w0s04___w0s08)); + SHA1_STEP (SHA1_F2o, c, d, e, a, b, (c_48s ^ w0s03 ^ w0s04___w0s08 ^ w0s05 ^ w0s10)); + SHA1_STEP (SHA1_F2o, b, c, d, e, a, (c_49s ^ w0s12)); + SHA1_STEP (SHA1_F2o, a, b, c, d, e, (c_50s ^ w0s08)); + SHA1_STEP (SHA1_F2o, e, a, b, c, d, (c_51s ^ w0s04___w0s06)); + SHA1_STEP (SHA1_F2o, d, e, a, b, c, (c_52s ^ w0s04___w0s08 ^ w0s13)); + SHA1_STEPX(SHA1_F2o, c, d, e, a, b, (c_53sK)); + SHA1_STEP (SHA1_F2o, b, c, d, e, a, (c_54s ^ w0s07 ^ w0s10 ^ w0s12)); + SHA1_STEP (SHA1_F2o, a, b, c, d, e, (c_55s ^ w0s14)); + SHA1_STEP (SHA1_F2o, e, a, b, c, d, (c_56s ^ w0s04___w0s06___w0s07 ^ w0s10 ^ w0s11)); + SHA1_STEP (SHA1_F2o, d, e, a, b, c, (c_57s ^ w0s08)); + SHA1_STEP (SHA1_F2o, c, d, e, a, b, (c_58s ^ w0s04___w0s08 ^ w0s15)); + SHA1_STEP (SHA1_F2o, b, c, d, e, a, (c_59s ^ w0s08___w0s12)); + + #undef K + #define K SHA1C03 + + SHA1_STEP (SHA1_F1 , a, b, c, d, e, (c_60s ^ w0s04 ^ w0s08___w0s12 ^ w0s07 ^ w0s14)); + SHA1_STEP (SHA1_F1 , e, a, b, c, d, (c_61s ^ w0s16)); + SHA1_STEP (SHA1_F1 , d, e, a, b, c, (c_62s ^ w0s04___w0s06 ^ w0s08___w0s12)); + SHA1_STEP (SHA1_F1 , c, d, e, a, b, (c_63s ^ w0s08)); + SHA1_STEP (SHA1_F1 , b, c, d, e, a, (c_64s ^ w0s04___w0s06___w0s07 ^ w0s08___w0s12 ^ w0s17)); + SHA1_STEPX(SHA1_F1 , a, b, c, d, e, (c_65sK)); + SHA1_STEP (SHA1_F1 , e, a, b, c, d, (c_66s ^ w0s14 ^ w0s16)); + SHA1_STEP (SHA1_F1 , d, e, a, b, c, (c_67s ^ w0s08 ^ w0s18)); + SHA1_STEP (SHA1_F1 , c, d, e, a, b, (c_68s ^ w0s11 ^ w0s14 ^ w0s15)); + SHA1_STEPX(SHA1_F1 , b, c, d, e, a, (c_69sK)); + SHA1_STEP (SHA1_F1 , a, b, c, d, e, (c_70s ^ w0s12 ^ w0s19)); + SHA1_STEP (SHA1_F1 , e, a, b, c, d, (c_71s ^ w0s12 ^ w0s16)); + SHA1_STEP (SHA1_F1 , d, e, a, b, c, (c_72s ^ w0s05 ^ w0s11 ^ w0s12 ^ w0s13 ^ w0s16 ^ w0s18)); + SHA1_STEP (SHA1_F1 , c, d, e, a, b, (c_73s ^ w0s20)); + SHA1_STEP (SHA1_F1 , b, c, d, e, a, (c_74s ^ w0s08 ^ w0s16)); + SHA1_STEP (SHA1_F1 , a, b, c, d, e, (c_75s ^ w0s06 ^ w0s12 ^ w0s14)); + + const u32 c_76s = rotl32 ((c_73s ^ c_68s ^ c_62s ^ c_60s), 1u); + const u32 c_77s = rotl32 ((c_74s ^ c_69s ^ c_63s ^ c_61s), 1u); + const u32 c_78s = rotl32 ((c_75s ^ c_70s ^ c_64s ^ c_62s), 1u); + const u32 c_79s = rotl32 ((c_76s ^ c_71s ^ c_65s ^ c_63s), 1u); + + const u32x w0s21 = rotl32 (w0, 21u); + const u32x w0s22 = rotl32 (w0, 22U); + + SHA1_STEP (SHA1_F1 , e, a, b, c, d, (c_76s ^ w0s07 ^ w0s08___w0s12 ^ w0s16 ^ w0s21)); + SHA1_STEP (SHA1_F1 , d, e, a, b, c, (c_77s)); + SHA1_STEP (SHA1_F1 , c, d, e, a, b, (c_78s ^ w0s07 ^ w0s08 ^ w0s15 ^ w0s18 ^ w0s20)); + SHA1_STEP (SHA1_F1 , b, c, d, e, a, (c_79s ^ w0s08 ^ w0s22)); + + a += SHA1M_A; + b += SHA1M_B; + c += SHA1M_C; + d += SHA1M_D; + e += SHA1M_E; + + u32x w0_t = a; + u32x w1_t = b; + u32x w2_t = c; + u32x w3_t = d; + u32x w4_t = e; + u32x w5_t = 0x80000000; + u32x w6_t = 0; + u32x w7_t = 0; + u32x w8_t = 0; + u32x w9_t = 0; + u32x wa_t = 0; + u32x wb_t = 0; + u32x wc_t = 0; + u32x wd_t = 0; + u32x we_t = 0; + u32x wf_t = 20 * 8; + + a = SHA1M_A; + b = SHA1M_B; + c = SHA1M_C; + d = SHA1M_D; + e = SHA1M_E; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w0_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w1_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w2_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w3_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w4_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w5_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w6_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w7_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w8_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w9_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wa_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, wb_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, wc_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, wd_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, we_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F0o, e, a, b, c, d, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F0o, d, e, a, b, c, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F0o, c, d, e, a, b, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F0o, b, c, d, e, a, w3_t); + + #undef K + #define K SHA1C01 + + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w7_t); + + #undef K + #define K SHA1C02 + + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wb_t); + + #undef K + #define K SHA1C03 + + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wb_t); + + bool q_cond = allx (e_rev != e); + + if (q_cond) continue; + + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wf_t); + + + const u32x r0 = d; + const u32x r1 = e; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_S + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m00300_m04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global u32x * words_buf_r, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32 w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = 0; + w[ 5] = 0; + w[ 6] = 0; + w[ 7] = 0; + w[ 8] = 0; + w[ 9] = 0; + w[10] = 0; + w[11] = 0; + w[12] = 0; + w[13] = 0; + w[14] = 0; + w[15] = pws[gid].i[15]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m00300m (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m00300_m08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global u32x * words_buf_r, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32 w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = pws[gid].i[ 4]; + w[ 5] = pws[gid].i[ 5]; + w[ 6] = pws[gid].i[ 6]; + w[ 7] = pws[gid].i[ 7]; + w[ 8] = 0; + w[ 9] = 0; + w[10] = 0; + w[11] = 0; + w[12] = 0; + w[13] = 0; + w[14] = 0; + w[15] = pws[gid].i[15]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m00300m (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m00300_m16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global u32x * words_buf_r, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32 w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = pws[gid].i[ 4]; + w[ 5] = pws[gid].i[ 5]; + w[ 6] = pws[gid].i[ 6]; + w[ 7] = pws[gid].i[ 7]; + w[ 8] = pws[gid].i[ 8]; + w[ 9] = pws[gid].i[ 9]; + w[10] = pws[gid].i[10]; + w[11] = pws[gid].i[11]; + w[12] = pws[gid].i[12]; + w[13] = pws[gid].i[13]; + w[14] = pws[gid].i[14]; + w[15] = pws[gid].i[15]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m00300m (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m00300_s04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global u32x * words_buf_r, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32 w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = 0; + w[ 5] = 0; + w[ 6] = 0; + w[ 7] = 0; + w[ 8] = 0; + w[ 9] = 0; + w[10] = 0; + w[11] = 0; + w[12] = 0; + w[13] = 0; + w[14] = 0; + w[15] = pws[gid].i[15]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m00300s (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m00300_s08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global u32x * words_buf_r, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32 w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = pws[gid].i[ 4]; + w[ 5] = pws[gid].i[ 5]; + w[ 6] = pws[gid].i[ 6]; + w[ 7] = pws[gid].i[ 7]; + w[ 8] = 0; + w[ 9] = 0; + w[10] = 0; + w[11] = 0; + w[12] = 0; + w[13] = 0; + w[14] = 0; + w[15] = pws[gid].i[15]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m00300s (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m00300_s16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global u32x * words_buf_r, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32 w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = pws[gid].i[ 4]; + w[ 5] = pws[gid].i[ 5]; + w[ 6] = pws[gid].i[ 6]; + w[ 7] = pws[gid].i[ 7]; + w[ 8] = pws[gid].i[ 8]; + w[ 9] = pws[gid].i[ 9]; + w[10] = pws[gid].i[10]; + w[11] = pws[gid].i[11]; + w[12] = pws[gid].i[12]; + w[13] = pws[gid].i[13]; + w[14] = pws[gid].i[14]; + w[15] = pws[gid].i[15]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m00300s (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} diff --git a/amd/m00400.cl b/amd/m00400.cl new file mode 100644 index 0000000000..8de3b0f1bf --- /dev/null +++ b/amd/m00400.cl @@ -0,0 +1,366 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _MD5_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW4 +#define VECT_SIZE4 +#endif + +#ifdef VLIW5 +#define VECT_SIZE4 +#endif + +#define DGST_R0 0 +#define DGST_R1 1 +#define DGST_R2 2 +#define DGST_R3 3 + +#include "include/kernel_functions.c" +#include "types_amd.c" +#include "common_amd.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +static void md5_transform (const u32x w0[4], const u32x w1[4], const u32x w2[4], const u32x w3[4], u32x digest[4]) +{ + u32x a = digest[0]; + u32x b = digest[1]; + u32x c = digest[2]; + u32x d = digest[3]; + + u32x w0_t = w0[0]; + u32x w1_t = w0[1]; + u32x w2_t = w0[2]; + u32x w3_t = w0[3]; + u32x w4_t = w1[0]; + u32x w5_t = w1[1]; + u32x w6_t = w1[2]; + u32x w7_t = w1[3]; + u32x w8_t = w2[0]; + u32x w9_t = w2[1]; + u32x wa_t = w2[2]; + u32x wb_t = w2[3]; + u32x wc_t = w3[0]; + u32x wd_t = w3[1]; + u32x we_t = w3[2]; + u32x wf_t = 0; + + u32x tmp2; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t, MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t, MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t, MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t, MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w4_t, MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w5_t, MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w6_t, MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w7_t, MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w8_t, MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w9_t, MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, wa_t, MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, wb_t, MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, wc_t, MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, wd_t, MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, we_t, MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, wf_t, MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w1_t, MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w6_t, MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, wb_t, MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t, MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w5_t, MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, wa_t, MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, wf_t, MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w4_t, MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w9_t, MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, we_t, MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t, MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w8_t, MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, wd_t, MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t, MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w7_t, MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, wc_t, MD5C1f, MD5S13); + + MD5_STEP (MD5_H1, a, b, c, d, w5_t, MD5C20, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w8_t, MD5C21, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, wb_t, MD5C22, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, we_t, MD5C23, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w1_t, MD5C24, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w4_t, MD5C25, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w7_t, MD5C26, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, wa_t, MD5C27, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, wd_t, MD5C28, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w0_t, MD5C29, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w3_t, MD5C2a, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w6_t, MD5C2b, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w9_t, MD5C2c, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, wc_t, MD5C2d, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, wf_t, MD5C2e, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w2_t, MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t, MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w7_t, MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, we_t, MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w5_t, MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, wc_t, MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t, MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, wa_t, MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t, MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w8_t, MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, wf_t, MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w6_t, MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, wd_t, MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w4_t, MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, wb_t, MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t, MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w9_t, MD5C3f, MD5S33); + + digest[0] += a; + digest[1] += b; + digest[2] += c; + digest[3] += d; +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m00400_init (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global phpass_tmp_t *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = pws[gid].i[ 8]; + w2[1] = pws[gid].i[ 9]; + w2[2] = 0; + w2[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * salt + */ + + u32 salt_buf[2]; + + salt_buf[0] = salt_bufs[salt_pos].salt_buf[0]; + salt_buf[1] = salt_bufs[salt_pos].salt_buf[1]; + + /** + * init + */ + + u32 block_len = 8 + pw_len; + + u32x block0[4]; + + block0[0] = salt_buf[0]; + block0[1] = salt_buf[1]; + block0[2] = w0[0]; + block0[3] = w0[1]; + + u32x block1[4]; + + block1[0] = w0[2]; + block1[1] = w0[3]; + block1[2] = w1[0]; + block1[3] = w1[1]; + + u32x block2[4]; + + block2[0] = w1[2]; + block2[1] = w1[3]; + block2[2] = w2[0]; + block2[3] = w2[1]; + + u32x block3[4]; + + block3[0] = 0; + block3[1] = 0; + block3[2] = block_len * 8; + block3[3] = 0; + + append_0x80_4 (block0, block1, block2, block3, block_len); + + /** + * init + */ + + u32x digest[4]; + + digest[0] = MD5M_A; + digest[1] = MD5M_B; + digest[2] = MD5M_C; + digest[3] = MD5M_D; + + md5_transform (block0, block1, block2, block3, digest); + + tmps[gid].digest_buf[0] = digest[0]; + tmps[gid].digest_buf[1] = digest[1]; + tmps[gid].digest_buf[2] = digest[2]; + tmps[gid].digest_buf[3] = digest[3]; +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m00400_loop (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global phpass_tmp_t *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = pws[gid].i[ 8]; + w2[1] = pws[gid].i[ 9]; + w2[2] = 0; + w2[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * digest + */ + + u32x digest[4]; + + digest[0] = tmps[gid].digest_buf[0]; + digest[1] = tmps[gid].digest_buf[1]; + digest[2] = tmps[gid].digest_buf[2]; + digest[3] = tmps[gid].digest_buf[3]; + + /** + * loop + */ + + u32 block_len = (16 + pw_len); + + u32x block0[4]; + + block0[0] = 0; + block0[1] = 0; + block0[2] = 0; + block0[3] = 0; + + u32x block1[4]; + + block1[0] = w0[0]; + block1[1] = w0[1]; + block1[2] = w0[2]; + block1[3] = w0[3]; + + u32x block2[4]; + + block2[0] = w1[0]; + block2[1] = w1[1]; + block2[2] = w1[2]; + block2[3] = w1[3]; + + u32x block3[4]; + + block3[0] = w2[0]; + block3[1] = w2[1]; + block3[2] = block_len * 8; + block3[3] = 0; + + append_0x80_4 (block0, block1, block2, block3, block_len); + + /** + * init + */ + + for (u32 i = 0; i < loop_cnt; i++) + { + block0[0] = digest[0]; + block0[1] = digest[1]; + block0[2] = digest[2]; + block0[3] = digest[3]; + + digest[0] = MD5M_A; + digest[1] = MD5M_B; + digest[2] = MD5M_C; + digest[3] = MD5M_D; + + md5_transform (block0, block1, block2, block3, digest); + } + + tmps[gid].digest_buf[0] = digest[0]; + tmps[gid].digest_buf[1] = digest[1]; + tmps[gid].digest_buf[2] = digest[2]; + tmps[gid].digest_buf[3] = digest[3]; +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m00400_comp (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global phpass_tmp_t *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + const u32 lid = get_local_id (0); + + /** + * digest + */ + + const u32x r0 = tmps[gid].digest_buf[DGST_R0]; + const u32x r1 = tmps[gid].digest_buf[DGST_R1]; + const u32x r2 = tmps[gid].digest_buf[DGST_R2]; + const u32x r3 = tmps[gid].digest_buf[DGST_R3]; + + #define il_pos 0 + + #include VECT_COMPARE_M +} diff --git a/amd/m00500.cl b/amd/m00500.cl new file mode 100644 index 0000000000..925389020d --- /dev/null +++ b/amd/m00500.cl @@ -0,0 +1,2052 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _MD5_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW4 +#define VECT_SIZE4 +#endif + +#ifdef VLIW5 +#define VECT_SIZE4 +#endif + +#define DGST_R0 0 +#define DGST_R1 1 +#define DGST_R2 2 +#define DGST_R3 3 + +#include "include/kernel_functions.c" +#include "types_amd.c" +#include "common_amd.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +#define md5crypt_magic 0x00243124 + +static void md5_transform (const u32x w0[4], const u32x w1[4], const u32x w2[4], const u32x w3[4], u32x digest[4]) +{ + u32x a = digest[0]; + u32x b = digest[1]; + u32x c = digest[2]; + u32x d = digest[3]; + + u32x w0_t = w0[0]; + u32x w1_t = w0[1]; + u32x w2_t = w0[2]; + u32x w3_t = w0[3]; + u32x w4_t = w1[0]; + u32x w5_t = w1[1]; + u32x w6_t = w1[2]; + u32x w7_t = w1[3]; + u32x w8_t = w2[0]; + u32x w9_t = w2[1]; + u32x wa_t = w2[2]; + u32x wb_t = w2[3]; + u32x wc_t = w3[0]; + u32x wd_t = w3[1]; + u32x we_t = w3[2]; + u32x wf_t = 0; + + u32x tmp2; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t, MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t, MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t, MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t, MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w4_t, MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w5_t, MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w6_t, MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w7_t, MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w8_t, MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w9_t, MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, wa_t, MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, wb_t, MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, wc_t, MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, wd_t, MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, we_t, MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, wf_t, MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w1_t, MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w6_t, MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, wb_t, MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t, MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w5_t, MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, wa_t, MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, wf_t, MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w4_t, MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w9_t, MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, we_t, MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t, MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w8_t, MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, wd_t, MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t, MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w7_t, MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, wc_t, MD5C1f, MD5S13); + + MD5_STEP (MD5_H1, a, b, c, d, w5_t, MD5C20, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w8_t, MD5C21, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, wb_t, MD5C22, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, we_t, MD5C23, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w1_t, MD5C24, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w4_t, MD5C25, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w7_t, MD5C26, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, wa_t, MD5C27, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, wd_t, MD5C28, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w0_t, MD5C29, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w3_t, MD5C2a, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w6_t, MD5C2b, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w9_t, MD5C2c, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, wc_t, MD5C2d, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, wf_t, MD5C2e, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w2_t, MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t, MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w7_t, MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, we_t, MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w5_t, MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, wc_t, MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t, MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, wa_t, MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t, MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w8_t, MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, wf_t, MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w6_t, MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, wd_t, MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w4_t, MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, wb_t, MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t, MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w9_t, MD5C3f, MD5S33); + + digest[0] += a; + digest[1] += b; + digest[2] += c; + digest[3] += d; +} + +static void memcat16 (u32x block0[4], u32x block1[4], u32x block2[4], u32x block3[4], const u32 block_len, const u32x append[4]) +{ + switch (block_len) + { + case 0: + block0[0] = append[0]; + block0[1] = append[1]; + block0[2] = append[2]; + block0[3] = append[3]; + break; + + case 1: + block0[0] = block0[0] | append[0] << 8; + block0[1] = append[0] >> 24 | append[1] << 8; + block0[2] = append[1] >> 24 | append[2] << 8; + block0[3] = append[2] >> 24 | append[3] << 8; + block1[0] = append[3] >> 24; + break; + + case 2: + block0[0] = block0[0] | append[0] << 16; + block0[1] = append[0] >> 16 | append[1] << 16; + block0[2] = append[1] >> 16 | append[2] << 16; + block0[3] = append[2] >> 16 | append[3] << 16; + block1[0] = append[3] >> 16; + break; + + case 3: + block0[0] = block0[0] | append[0] << 24; + block0[1] = append[0] >> 8 | append[1] << 24; + block0[2] = append[1] >> 8 | append[2] << 24; + block0[3] = append[2] >> 8 | append[3] << 24; + block1[0] = append[3] >> 8; + break; + + case 4: + block0[1] = append[0]; + block0[2] = append[1]; + block0[3] = append[2]; + block1[0] = append[3]; + break; + + case 5: + block0[1] = block0[1] | append[0] << 8; + block0[2] = append[0] >> 24 | append[1] << 8; + block0[3] = append[1] >> 24 | append[2] << 8; + block1[0] = append[2] >> 24 | append[3] << 8; + block1[1] = append[3] >> 24; + break; + + case 6: + block0[1] = block0[1] | append[0] << 16; + block0[2] = append[0] >> 16 | append[1] << 16; + block0[3] = append[1] >> 16 | append[2] << 16; + block1[0] = append[2] >> 16 | append[3] << 16; + block1[1] = append[3] >> 16; + break; + + case 7: + block0[1] = block0[1] | append[0] << 24; + block0[2] = append[0] >> 8 | append[1] << 24; + block0[3] = append[1] >> 8 | append[2] << 24; + block1[0] = append[2] >> 8 | append[3] << 24; + block1[1] = append[3] >> 8; + break; + + case 8: + block0[2] = append[0]; + block0[3] = append[1]; + block1[0] = append[2]; + block1[1] = append[3]; + break; + + case 9: + block0[2] = block0[2] | append[0] << 8; + block0[3] = append[0] >> 24 | append[1] << 8; + block1[0] = append[1] >> 24 | append[2] << 8; + block1[1] = append[2] >> 24 | append[3] << 8; + block1[2] = append[3] >> 24; + break; + + case 10: + block0[2] = block0[2] | append[0] << 16; + block0[3] = append[0] >> 16 | append[1] << 16; + block1[0] = append[1] >> 16 | append[2] << 16; + block1[1] = append[2] >> 16 | append[3] << 16; + block1[2] = append[3] >> 16; + break; + + case 11: + block0[2] = block0[2] | append[0] << 24; + block0[3] = append[0] >> 8 | append[1] << 24; + block1[0] = append[1] >> 8 | append[2] << 24; + block1[1] = append[2] >> 8 | append[3] << 24; + block1[2] = append[3] >> 8; + break; + + case 12: + block0[3] = append[0]; + block1[0] = append[1]; + block1[1] = append[2]; + block1[2] = append[3]; + break; + + case 13: + block0[3] = block0[3] | append[0] << 8; + block1[0] = append[0] >> 24 | append[1] << 8; + block1[1] = append[1] >> 24 | append[2] << 8; + block1[2] = append[2] >> 24 | append[3] << 8; + block1[3] = append[3] >> 24; + break; + + case 14: + block0[3] = block0[3] | append[0] << 16; + block1[0] = append[0] >> 16 | append[1] << 16; + block1[1] = append[1] >> 16 | append[2] << 16; + block1[2] = append[2] >> 16 | append[3] << 16; + block1[3] = append[3] >> 16; + break; + + case 15: + block0[3] = block0[3] | append[0] << 24; + block1[0] = append[0] >> 8 | append[1] << 24; + block1[1] = append[1] >> 8 | append[2] << 24; + block1[2] = append[2] >> 8 | append[3] << 24; + block1[3] = append[3] >> 8; + break; + + case 16: + block1[0] = append[0]; + block1[1] = append[1]; + block1[2] = append[2]; + block1[3] = append[3]; + break; + + case 17: + block1[0] = block1[0] | append[0] << 8; + block1[1] = append[0] >> 24 | append[1] << 8; + block1[2] = append[1] >> 24 | append[2] << 8; + block1[3] = append[2] >> 24 | append[3] << 8; + block2[0] = append[3] >> 24; + break; + + case 18: + block1[0] = block1[0] | append[0] << 16; + block1[1] = append[0] >> 16 | append[1] << 16; + block1[2] = append[1] >> 16 | append[2] << 16; + block1[3] = append[2] >> 16 | append[3] << 16; + block2[0] = append[3] >> 16; + break; + + case 19: + block1[0] = block1[0] | append[0] << 24; + block1[1] = append[0] >> 8 | append[1] << 24; + block1[2] = append[1] >> 8 | append[2] << 24; + block1[3] = append[2] >> 8 | append[3] << 24; + block2[0] = append[3] >> 8; + break; + + case 20: + block1[1] = append[0]; + block1[2] = append[1]; + block1[3] = append[2]; + block2[0] = append[3]; + break; + + case 21: + block1[1] = block1[1] | append[0] << 8; + block1[2] = append[0] >> 24 | append[1] << 8; + block1[3] = append[1] >> 24 | append[2] << 8; + block2[0] = append[2] >> 24 | append[3] << 8; + block2[1] = append[3] >> 24; + break; + + case 22: + block1[1] = block1[1] | append[0] << 16; + block1[2] = append[0] >> 16 | append[1] << 16; + block1[3] = append[1] >> 16 | append[2] << 16; + block2[0] = append[2] >> 16 | append[3] << 16; + block2[1] = append[3] >> 16; + break; + + case 23: + block1[1] = block1[1] | append[0] << 24; + block1[2] = append[0] >> 8 | append[1] << 24; + block1[3] = append[1] >> 8 | append[2] << 24; + block2[0] = append[2] >> 8 | append[3] << 24; + block2[1] = append[3] >> 8; + break; + + case 24: + block1[2] = append[0]; + block1[3] = append[1]; + block2[0] = append[2]; + block2[1] = append[3]; + break; + + case 25: + block1[2] = block1[2] | append[0] << 8; + block1[3] = append[0] >> 24 | append[1] << 8; + block2[0] = append[1] >> 24 | append[2] << 8; + block2[1] = append[2] >> 24 | append[3] << 8; + block2[2] = append[3] >> 24; + break; + + case 26: + block1[2] = block1[2] | append[0] << 16; + block1[3] = append[0] >> 16 | append[1] << 16; + block2[0] = append[1] >> 16 | append[2] << 16; + block2[1] = append[2] >> 16 | append[3] << 16; + block2[2] = append[3] >> 16; + break; + + case 27: + block1[2] = block1[2] | append[0] << 24; + block1[3] = append[0] >> 8 | append[1] << 24; + block2[0] = append[1] >> 8 | append[2] << 24; + block2[1] = append[2] >> 8 | append[3] << 24; + block2[2] = append[3] >> 8; + break; + + case 28: + block1[3] = append[0]; + block2[0] = append[1]; + block2[1] = append[2]; + block2[2] = append[3]; + break; + + case 29: + block1[3] = block1[3] | append[0] << 8; + block2[0] = append[0] >> 24 | append[1] << 8; + block2[1] = append[1] >> 24 | append[2] << 8; + block2[2] = append[2] >> 24 | append[3] << 8; + block2[3] = append[3] >> 24; + break; + + case 30: + block1[3] = block1[3] | append[0] << 16; + block2[0] = append[0] >> 16 | append[1] << 16; + block2[1] = append[1] >> 16 | append[2] << 16; + block2[2] = append[2] >> 16 | append[3] << 16; + block2[3] = append[3] >> 16; + break; + + case 31: + block1[3] = block1[3] | append[0] << 24; + block2[0] = append[0] >> 8 | append[1] << 24; + block2[1] = append[1] >> 8 | append[2] << 24; + block2[2] = append[2] >> 8 | append[3] << 24; + block2[3] = append[3] >> 8; + break; + + case 32: + block2[0] = append[0]; + block2[1] = append[1]; + block2[2] = append[2]; + block2[3] = append[3]; + break; + + case 33: + block2[0] = block2[0] | append[0] << 8; + block2[1] = append[0] >> 24 | append[1] << 8; + block2[2] = append[1] >> 24 | append[2] << 8; + block2[3] = append[2] >> 24 | append[3] << 8; + block3[0] = append[3] >> 24; + break; + + case 34: + block2[0] = block2[0] | append[0] << 16; + block2[1] = append[0] >> 16 | append[1] << 16; + block2[2] = append[1] >> 16 | append[2] << 16; + block2[3] = append[2] >> 16 | append[3] << 16; + block3[0] = append[3] >> 16; + break; + + case 35: + block2[0] = block2[0] | append[0] << 24; + block2[1] = append[0] >> 8 | append[1] << 24; + block2[2] = append[1] >> 8 | append[2] << 24; + block2[3] = append[2] >> 8 | append[3] << 24; + block3[0] = append[3] >> 8; + break; + + case 36: + block2[1] = append[0]; + block2[2] = append[1]; + block2[3] = append[2]; + block3[0] = append[3]; + break; + + case 37: + block2[1] = block2[1] | append[0] << 8; + block2[2] = append[0] >> 24 | append[1] << 8; + block2[3] = append[1] >> 24 | append[2] << 8; + block3[0] = append[2] >> 24 | append[3] << 8; + block3[1] = append[3] >> 24; + break; + + case 38: + block2[1] = block2[1] | append[0] << 16; + block2[2] = append[0] >> 16 | append[1] << 16; + block2[3] = append[1] >> 16 | append[2] << 16; + block3[0] = append[2] >> 16 | append[3] << 16; + block3[1] = append[3] >> 16; + break; + + case 39: + block2[1] = block2[1] | append[0] << 24; + block2[2] = append[0] >> 8 | append[1] << 24; + block2[3] = append[1] >> 8 | append[2] << 24; + block3[0] = append[2] >> 8 | append[3] << 24; + block3[1] = append[3] >> 8; + break; + + case 40: + block2[2] = append[0]; + block2[3] = append[1]; + block3[0] = append[2]; + block3[1] = append[3]; + break; + + case 41: + block2[2] = block2[2] | append[0] << 8; + block2[3] = append[0] >> 24 | append[1] << 8; + block3[0] = append[1] >> 24 | append[2] << 8; + block3[1] = append[2] >> 24 | append[3] << 8; + block3[2] = append[3] >> 24; + break; + + case 42: + block2[2] = block2[2] | append[0] << 16; + block2[3] = append[0] >> 16 | append[1] << 16; + block3[0] = append[1] >> 16 | append[2] << 16; + block3[1] = append[2] >> 16 | append[3] << 16; + block3[2] = append[3] >> 16; + break; + + case 43: + block2[2] = block2[2] | append[0] << 24; + block2[3] = append[0] >> 8 | append[1] << 24; + block3[0] = append[1] >> 8 | append[2] << 24; + block3[1] = append[2] >> 8 | append[3] << 24; + block3[2] = append[3] >> 8; + break; + + case 44: + block2[3] = append[0]; + block3[0] = append[1]; + block3[1] = append[2]; + block3[2] = append[3]; + break; + + case 45: + block2[3] = block2[3] | append[0] << 8; + block3[0] = append[0] >> 24 | append[1] << 8; + block3[1] = append[1] >> 24 | append[2] << 8; + block3[2] = append[2] >> 24 | append[3] << 8; + block3[3] = append[3] >> 24; + break; + + case 46: + block2[3] = block2[3] | append[0] << 16; + block3[0] = append[0] >> 16 | append[1] << 16; + block3[1] = append[1] >> 16 | append[2] << 16; + block3[2] = append[2] >> 16 | append[3] << 16; + block3[3] = append[3] >> 16; + break; + + case 47: + block2[3] = block2[3] | append[0] << 24; + block3[0] = append[0] >> 8 | append[1] << 24; + block3[1] = append[1] >> 8 | append[2] << 24; + block3[2] = append[2] >> 8 | append[3] << 24; + block3[3] = append[3] >> 8; + break; + + case 48: + block3[0] = append[0]; + block3[1] = append[1]; + block3[2] = append[2]; + block3[3] = append[3]; + break; + + case 49: + block3[0] = block3[0] | append[0] << 8; + block3[1] = append[0] >> 24 | append[1] << 8; + block3[2] = append[1] >> 24 | append[2] << 8; + block3[3] = append[2] >> 24 | append[3] << 8; + break; + + case 50: + block3[0] = block3[0] | append[0] << 16; + block3[1] = append[0] >> 16 | append[1] << 16; + block3[2] = append[1] >> 16 | append[2] << 16; + block3[3] = append[2] >> 16 | append[3] << 16; + break; + + case 51: + block3[0] = block3[0] | append[0] << 24; + block3[1] = append[0] >> 8 | append[1] << 24; + block3[2] = append[1] >> 8 | append[2] << 24; + block3[3] = append[2] >> 8 | append[3] << 24; + break; + + case 52: + block3[1] = append[0]; + block3[2] = append[1]; + block3[3] = append[2]; + break; + + case 53: + block3[1] = block3[1] | append[0] << 8; + block3[2] = append[0] >> 24 | append[1] << 8; + block3[3] = append[1] >> 24 | append[2] << 8; + break; + + case 54: + block3[1] = block3[1] | append[0] << 16; + block3[2] = append[0] >> 16 | append[1] << 16; + block3[3] = append[1] >> 16 | append[2] << 16; + break; + + case 55: + block3[1] = block3[1] | append[0] << 24; + block3[2] = append[0] >> 8 | append[1] << 24; + block3[3] = append[1] >> 8 | append[2] << 24; + break; + + case 56: + block3[2] = append[0]; + block3[3] = append[1]; + break; + } +} + +static void memcat16_x80 (u32x block0[4], u32x block1[4], u32x block2[4], u32x block3[4], const u32 block_len, const u32x append[4]) +{ + switch (block_len) + { + case 0: + block0[0] = append[0]; + block0[1] = append[1]; + block0[2] = append[2]; + block0[3] = append[3]; + block1[0] = 0x80; + break; + + case 1: + block0[0] = block0[0] | append[0] << 8; + block0[1] = append[0] >> 24 | append[1] << 8; + block0[2] = append[1] >> 24 | append[2] << 8; + block0[3] = append[2] >> 24 | append[3] << 8; + block1[0] = append[3] >> 24 | 0x80u << 8; + break; + + case 2: + block0[0] = block0[0] | append[0] << 16; + block0[1] = append[0] >> 16 | append[1] << 16; + block0[2] = append[1] >> 16 | append[2] << 16; + block0[3] = append[2] >> 16 | append[3] << 16; + block1[0] = append[3] >> 16 | 0x80u << 16; + break; + + case 3: + block0[0] = block0[0] | append[0] << 24; + block0[1] = append[0] >> 8 | append[1] << 24; + block0[2] = append[1] >> 8 | append[2] << 24; + block0[3] = append[2] >> 8 | append[3] << 24; + block1[0] = append[3] >> 8 | 0x80u << 24; + break; + + case 4: + block0[1] = append[0]; + block0[2] = append[1]; + block0[3] = append[2]; + block1[0] = append[3]; + block1[1] = 0x80; + break; + + case 5: + block0[1] = block0[1] | append[0] << 8; + block0[2] = append[0] >> 24 | append[1] << 8; + block0[3] = append[1] >> 24 | append[2] << 8; + block1[0] = append[2] >> 24 | append[3] << 8; + block1[1] = append[3] >> 24 | 0x80u << 8; + break; + + case 6: + block0[1] = block0[1] | append[0] << 16; + block0[2] = append[0] >> 16 | append[1] << 16; + block0[3] = append[1] >> 16 | append[2] << 16; + block1[0] = append[2] >> 16 | append[3] << 16; + block1[1] = append[3] >> 16 | 0x80u << 16; + break; + + case 7: + block0[1] = block0[1] | append[0] << 24; + block0[2] = append[0] >> 8 | append[1] << 24; + block0[3] = append[1] >> 8 | append[2] << 24; + block1[0] = append[2] >> 8 | append[3] << 24; + block1[1] = append[3] >> 8 | 0x80u << 24; + break; + + case 8: + block0[2] = append[0]; + block0[3] = append[1]; + block1[0] = append[2]; + block1[1] = append[3]; + block1[2] = 0x80; + break; + + case 9: + block0[2] = block0[2] | append[0] << 8; + block0[3] = append[0] >> 24 | append[1] << 8; + block1[0] = append[1] >> 24 | append[2] << 8; + block1[1] = append[2] >> 24 | append[3] << 8; + block1[2] = append[3] >> 24 | 0x80u << 8; + break; + + case 10: + block0[2] = block0[2] | append[0] << 16; + block0[3] = append[0] >> 16 | append[1] << 16; + block1[0] = append[1] >> 16 | append[2] << 16; + block1[1] = append[2] >> 16 | append[3] << 16; + block1[2] = append[3] >> 16 | 0x80u << 16; + break; + + case 11: + block0[2] = block0[2] | append[0] << 24; + block0[3] = append[0] >> 8 | append[1] << 24; + block1[0] = append[1] >> 8 | append[2] << 24; + block1[1] = append[2] >> 8 | append[3] << 24; + block1[2] = append[3] >> 8 | 0x80u << 24; + break; + + case 12: + block0[3] = append[0]; + block1[0] = append[1]; + block1[1] = append[2]; + block1[2] = append[3]; + block1[3] = 0x80; + break; + + case 13: + block0[3] = block0[3] | append[0] << 8; + block1[0] = append[0] >> 24 | append[1] << 8; + block1[1] = append[1] >> 24 | append[2] << 8; + block1[2] = append[2] >> 24 | append[3] << 8; + block1[3] = append[3] >> 24 | 0x80u << 8; + break; + + case 14: + block0[3] = block0[3] | append[0] << 16; + block1[0] = append[0] >> 16 | append[1] << 16; + block1[1] = append[1] >> 16 | append[2] << 16; + block1[2] = append[2] >> 16 | append[3] << 16; + block1[3] = append[3] >> 16 | 0x80u << 16; + break; + + case 15: + block0[3] = block0[3] | append[0] << 24; + block1[0] = append[0] >> 8 | append[1] << 24; + block1[1] = append[1] >> 8 | append[2] << 24; + block1[2] = append[2] >> 8 | append[3] << 24; + block1[3] = append[3] >> 8 | 0x80u << 24; + break; + + case 16: + block1[0] = append[0]; + block1[1] = append[1]; + block1[2] = append[2]; + block1[3] = append[3]; + block2[0] = 0x80; + break; + + case 17: + block1[0] = block1[0] | append[0] << 8; + block1[1] = append[0] >> 24 | append[1] << 8; + block1[2] = append[1] >> 24 | append[2] << 8; + block1[3] = append[2] >> 24 | append[3] << 8; + block2[0] = append[3] >> 24 | 0x80u << 8; + break; + + case 18: + block1[0] = block1[0] | append[0] << 16; + block1[1] = append[0] >> 16 | append[1] << 16; + block1[2] = append[1] >> 16 | append[2] << 16; + block1[3] = append[2] >> 16 | append[3] << 16; + block2[0] = append[3] >> 16 | 0x80u << 16; + break; + + case 19: + block1[0] = block1[0] | append[0] << 24; + block1[1] = append[0] >> 8 | append[1] << 24; + block1[2] = append[1] >> 8 | append[2] << 24; + block1[3] = append[2] >> 8 | append[3] << 24; + block2[0] = append[3] >> 8 | 0x80u << 24; + break; + + case 20: + block1[1] = append[0]; + block1[2] = append[1]; + block1[3] = append[2]; + block2[0] = append[3]; + block2[1] = 0x80; + break; + + case 21: + block1[1] = block1[1] | append[0] << 8; + block1[2] = append[0] >> 24 | append[1] << 8; + block1[3] = append[1] >> 24 | append[2] << 8; + block2[0] = append[2] >> 24 | append[3] << 8; + block2[1] = append[3] >> 24 | 0x80u << 8; + break; + + case 22: + block1[1] = block1[1] | append[0] << 16; + block1[2] = append[0] >> 16 | append[1] << 16; + block1[3] = append[1] >> 16 | append[2] << 16; + block2[0] = append[2] >> 16 | append[3] << 16; + block2[1] = append[3] >> 16 | 0x80u << 16; + break; + + case 23: + block1[1] = block1[1] | append[0] << 24; + block1[2] = append[0] >> 8 | append[1] << 24; + block1[3] = append[1] >> 8 | append[2] << 24; + block2[0] = append[2] >> 8 | append[3] << 24; + block2[1] = append[3] >> 8 | 0x80u << 24; + break; + + case 24: + block1[2] = append[0]; + block1[3] = append[1]; + block2[0] = append[2]; + block2[1] = append[3]; + block2[2] = 0x80; + break; + + case 25: + block1[2] = block1[2] | append[0] << 8; + block1[3] = append[0] >> 24 | append[1] << 8; + block2[0] = append[1] >> 24 | append[2] << 8; + block2[1] = append[2] >> 24 | append[3] << 8; + block2[2] = append[3] >> 24 | 0x80u << 8; + break; + + case 26: + block1[2] = block1[2] | append[0] << 16; + block1[3] = append[0] >> 16 | append[1] << 16; + block2[0] = append[1] >> 16 | append[2] << 16; + block2[1] = append[2] >> 16 | append[3] << 16; + block2[2] = append[3] >> 16 | 0x80u << 16; + break; + + case 27: + block1[2] = block1[2] | append[0] << 24; + block1[3] = append[0] >> 8 | append[1] << 24; + block2[0] = append[1] >> 8 | append[2] << 24; + block2[1] = append[2] >> 8 | append[3] << 24; + block2[2] = append[3] >> 8 | 0x80u << 24; + break; + + case 28: + block1[3] = append[0]; + block2[0] = append[1]; + block2[1] = append[2]; + block2[2] = append[3]; + block2[3] = 0x80; + break; + + case 29: + block1[3] = block1[3] | append[0] << 8; + block2[0] = append[0] >> 24 | append[1] << 8; + block2[1] = append[1] >> 24 | append[2] << 8; + block2[2] = append[2] >> 24 | append[3] << 8; + block2[3] = append[3] >> 24 | 0x80u << 8; + break; + + case 30: + block1[3] = block1[3] | append[0] << 16; + block2[0] = append[0] >> 16 | append[1] << 16; + block2[1] = append[1] >> 16 | append[2] << 16; + block2[2] = append[2] >> 16 | append[3] << 16; + block2[3] = append[3] >> 16 | 0x80u << 16; + break; + + case 31: + block1[3] = block1[3] | append[0] << 24; + block2[0] = append[0] >> 8 | append[1] << 24; + block2[1] = append[1] >> 8 | append[2] << 24; + block2[2] = append[2] >> 8 | append[3] << 24; + block2[3] = append[3] >> 8 | 0x80u << 24; + break; + + case 32: + block2[0] = append[0]; + block2[1] = append[1]; + block2[2] = append[2]; + block2[3] = append[3]; + block3[0] = 0x80; + break; + + case 33: + block2[0] = block2[0] | append[0] << 8; + block2[1] = append[0] >> 24 | append[1] << 8; + block2[2] = append[1] >> 24 | append[2] << 8; + block2[3] = append[2] >> 24 | append[3] << 8; + block3[0] = append[3] >> 24 | 0x80u << 8; + break; + + case 34: + block2[0] = block2[0] | append[0] << 16; + block2[1] = append[0] >> 16 | append[1] << 16; + block2[2] = append[1] >> 16 | append[2] << 16; + block2[3] = append[2] >> 16 | append[3] << 16; + block3[0] = append[3] >> 16 | 0x80u << 16; + break; + + case 35: + block2[0] = block2[0] | append[0] << 24; + block2[1] = append[0] >> 8 | append[1] << 24; + block2[2] = append[1] >> 8 | append[2] << 24; + block2[3] = append[2] >> 8 | append[3] << 24; + block3[0] = append[3] >> 8 | 0x80u << 24; + break; + + case 36: + block2[1] = append[0]; + block2[2] = append[1]; + block2[3] = append[2]; + block3[0] = append[3]; + block3[1] = 0x80; + break; + + case 37: + block2[1] = block2[1] | append[0] << 8; + block2[2] = append[0] >> 24 | append[1] << 8; + block2[3] = append[1] >> 24 | append[2] << 8; + block3[0] = append[2] >> 24 | append[3] << 8; + block3[1] = append[3] >> 24 | 0x80u << 8; + break; + + case 38: + block2[1] = block2[1] | append[0] << 16; + block2[2] = append[0] >> 16 | append[1] << 16; + block2[3] = append[1] >> 16 | append[2] << 16; + block3[0] = append[2] >> 16 | append[3] << 16; + block3[1] = append[3] >> 16 | 0x80u << 16; + break; + + case 39: + block2[1] = block2[1] | append[0] << 24; + block2[2] = append[0] >> 8 | append[1] << 24; + block2[3] = append[1] >> 8 | append[2] << 24; + block3[0] = append[2] >> 8 | append[3] << 24; + block3[1] = append[3] >> 8 | 0x80u << 24; + break; + + case 40: + block2[2] = append[0]; + block2[3] = append[1]; + block3[0] = append[2]; + block3[1] = append[3]; + block3[2] = 0x80; + break; + + case 41: + block2[2] = block2[2] | append[0] << 8; + block2[3] = append[0] >> 24 | append[1] << 8; + block3[0] = append[1] >> 24 | append[2] << 8; + block3[1] = append[2] >> 24 | append[3] << 8; + block3[2] = append[3] >> 24 | 0x80u << 8; + break; + + case 42: + block2[2] = block2[2] | append[0] << 16; + block2[3] = append[0] >> 16 | append[1] << 16; + block3[0] = append[1] >> 16 | append[2] << 16; + block3[1] = append[2] >> 16 | append[3] << 16; + block3[2] = append[3] >> 16 | 0x80u << 16; + break; + + case 43: + block2[2] = block2[2] | append[0] << 24; + block2[3] = append[0] >> 8 | append[1] << 24; + block3[0] = append[1] >> 8 | append[2] << 24; + block3[1] = append[2] >> 8 | append[3] << 24; + block3[2] = append[3] >> 8 | 0x80u << 24; + break; + + case 44: + block2[3] = append[0]; + block3[0] = append[1]; + block3[1] = append[2]; + block3[2] = append[3]; + block3[3] = 0x80; + break; + + case 45: + block2[3] = block2[3] | append[0] << 8; + block3[0] = append[0] >> 24 | append[1] << 8; + block3[1] = append[1] >> 24 | append[2] << 8; + block3[2] = append[2] >> 24 | append[3] << 8; + block3[3] = append[3] >> 24 | 0x80u << 8; + break; + + case 46: + block2[3] = block2[3] | append[0] << 16; + block3[0] = append[0] >> 16 | append[1] << 16; + block3[1] = append[1] >> 16 | append[2] << 16; + block3[2] = append[2] >> 16 | append[3] << 16; + block3[3] = append[3] >> 16 | 0x80u << 16; + break; + + case 47: + block2[3] = block2[3] | append[0] << 24; + block3[0] = append[0] >> 8 | append[1] << 24; + block3[1] = append[1] >> 8 | append[2] << 24; + block3[2] = append[2] >> 8 | append[3] << 24; + block3[3] = append[3] >> 8 | 0x80u << 24; + break; + + case 48: + block3[0] = append[0]; + block3[1] = append[1]; + block3[2] = append[2]; + block3[3] = append[3]; + break; + + case 49: + block3[0] = block3[0] | append[0] << 8; + block3[1] = append[0] >> 24 | append[1] << 8; + block3[2] = append[1] >> 24 | append[2] << 8; + block3[3] = append[2] >> 24 | append[3] << 8; + break; + + case 50: + block3[0] = block3[0] | append[0] << 16; + block3[1] = append[0] >> 16 | append[1] << 16; + block3[2] = append[1] >> 16 | append[2] << 16; + block3[3] = append[2] >> 16 | append[3] << 16; + break; + + case 51: + block3[0] = block3[0] | append[0] << 24; + block3[1] = append[0] >> 8 | append[1] << 24; + block3[2] = append[1] >> 8 | append[2] << 24; + block3[3] = append[2] >> 8 | append[3] << 24; + break; + + case 52: + block3[1] = append[0]; + block3[2] = append[1]; + block3[3] = append[2]; + break; + + case 53: + block3[1] = block3[1] | append[0] << 8; + block3[2] = append[0] >> 24 | append[1] << 8; + block3[3] = append[1] >> 24 | append[2] << 8; + break; + + case 54: + block3[1] = block3[1] | append[0] << 16; + block3[2] = append[0] >> 16 | append[1] << 16; + block3[3] = append[1] >> 16 | append[2] << 16; + break; + + case 55: + block3[1] = block3[1] | append[0] << 24; + block3[2] = append[0] >> 8 | append[1] << 24; + block3[3] = append[1] >> 8 | append[2] << 24; + break; + + case 56: + block3[2] = append[0]; + block3[3] = append[1]; + break; + } +} + +static void memcat8 (u32x block0[4], u32x block1[4], u32x block2[4], u32x block3[4], const u32 block_len, const u32 append[2]) +{ + switch (block_len) + { + case 0: + block0[0] = append[0]; + block0[1] = append[1]; + break; + + case 1: + block0[0] = block0[0] | append[0] << 8; + block0[1] = append[0] >> 24 | append[1] << 8; + block0[2] = append[1] >> 24; + break; + + case 2: + block0[0] = block0[0] | append[0] << 16; + block0[1] = append[0] >> 16 | append[1] << 16; + block0[2] = append[1] >> 16; + break; + + case 3: + block0[0] = block0[0] | append[0] << 24; + block0[1] = append[0] >> 8 | append[1] << 24; + block0[2] = append[1] >> 8; + break; + + case 4: + block0[1] = append[0]; + block0[2] = append[1]; + break; + + case 5: + block0[1] = block0[1] | append[0] << 8; + block0[2] = append[0] >> 24 | append[1] << 8; + block0[3] = append[1] >> 24; + break; + + case 6: + block0[1] = block0[1] | append[0] << 16; + block0[2] = append[0] >> 16 | append[1] << 16; + block0[3] = append[1] >> 16; + break; + + case 7: + block0[1] = block0[1] | append[0] << 24; + block0[2] = append[0] >> 8 | append[1] << 24; + block0[3] = append[1] >> 8; + break; + + case 8: + block0[2] = append[0]; + block0[3] = append[1]; + break; + + case 9: + block0[2] = block0[2] | append[0] << 8; + block0[3] = append[0] >> 24 | append[1] << 8; + block1[0] = append[1] >> 24; + break; + + case 10: + block0[2] = block0[2] | append[0] << 16; + block0[3] = append[0] >> 16 | append[1] << 16; + block1[0] = append[1] >> 16; + break; + + case 11: + block0[2] = block0[2] | append[0] << 24; + block0[3] = append[0] >> 8 | append[1] << 24; + block1[0] = append[1] >> 8; + break; + + case 12: + block0[3] = append[0]; + block1[0] = append[1]; + break; + + case 13: + block0[3] = block0[3] | append[0] << 8; + block1[0] = append[0] >> 24 | append[1] << 8; + block1[1] = append[1] >> 24; + break; + + case 14: + block0[3] = block0[3] | append[0] << 16; + block1[0] = append[0] >> 16 | append[1] << 16; + block1[1] = append[1] >> 16; + break; + + case 15: + block0[3] = block0[3] | append[0] << 24; + block1[0] = append[0] >> 8 | append[1] << 24; + block1[1] = append[1] >> 8; + break; + + case 16: + block1[0] = append[0]; + block1[1] = append[1]; + break; + + case 17: + block1[0] = block1[0] | append[0] << 8; + block1[1] = append[0] >> 24 | append[1] << 8; + block1[2] = append[1] >> 24; + break; + + case 18: + block1[0] = block1[0] | append[0] << 16; + block1[1] = append[0] >> 16 | append[1] << 16; + block1[2] = append[1] >> 16; + break; + + case 19: + block1[0] = block1[0] | append[0] << 24; + block1[1] = append[0] >> 8 | append[1] << 24; + block1[2] = append[1] >> 8; + break; + + case 20: + block1[1] = append[0]; + block1[2] = append[1]; + break; + + case 21: + block1[1] = block1[1] | append[0] << 8; + block1[2] = append[0] >> 24 | append[1] << 8; + block1[3] = append[1] >> 24; + break; + + case 22: + block1[1] = block1[1] | append[0] << 16; + block1[2] = append[0] >> 16 | append[1] << 16; + block1[3] = append[1] >> 16; + break; + + case 23: + block1[1] = block1[1] | append[0] << 24; + block1[2] = append[0] >> 8 | append[1] << 24; + block1[3] = append[1] >> 8; + break; + + case 24: + block1[2] = append[0]; + block1[3] = append[1]; + break; + + case 25: + block1[2] = block1[2] | append[0] << 8; + block1[3] = append[0] >> 24 | append[1] << 8; + block2[0] = append[1] >> 24; + break; + + case 26: + block1[2] = block1[2] | append[0] << 16; + block1[3] = append[0] >> 16 | append[1] << 16; + block2[0] = append[1] >> 16; + break; + + case 27: + block1[2] = block1[2] | append[0] << 24; + block1[3] = append[0] >> 8 | append[1] << 24; + block2[0] = append[1] >> 8; + break; + + case 28: + block1[3] = append[0]; + block2[0] = append[1]; + break; + + case 29: + block1[3] = block1[3] | append[0] << 8; + block2[0] = append[0] >> 24 | append[1] << 8; + block2[1] = append[1] >> 24; + break; + + case 30: + block1[3] = block1[3] | append[0] << 16; + block2[0] = append[0] >> 16 | append[1] << 16; + block2[1] = append[1] >> 16; + break; + + case 31: + block1[3] = block1[3] | append[0] << 24; + block2[0] = append[0] >> 8 | append[1] << 24; + block2[1] = append[1] >> 8; + break; + + case 32: + block2[0] = append[0]; + block2[1] = append[1]; + break; + + case 33: + block2[0] = block2[0] | append[0] << 8; + block2[1] = append[0] >> 24 | append[1] << 8; + block2[2] = append[1] >> 24; + break; + + case 34: + block2[0] = block2[0] | append[0] << 16; + block2[1] = append[0] >> 16 | append[1] << 16; + block2[2] = append[1] >> 16; + break; + + case 35: + block2[0] = block2[0] | append[0] << 24; + block2[1] = append[0] >> 8 | append[1] << 24; + block2[2] = append[1] >> 8; + break; + + case 36: + block2[1] = append[0]; + block2[2] = append[1]; + break; + + case 37: + block2[1] = block2[1] | append[0] << 8; + block2[2] = append[0] >> 24 | append[1] << 8; + block2[3] = append[1] >> 24; + break; + + case 38: + block2[1] = block2[1] | append[0] << 16; + block2[2] = append[0] >> 16 | append[1] << 16; + block2[3] = append[1] >> 16; + break; + + case 39: + block2[1] = block2[1] | append[0] << 24; + block2[2] = append[0] >> 8 | append[1] << 24; + block2[3] = append[1] >> 8; + break; + + case 40: + block2[2] = append[0]; + block2[3] = append[1]; + break; + + case 41: + block2[2] = block2[2] | append[0] << 8; + block2[3] = append[0] >> 24 | append[1] << 8; + block3[0] = append[1] >> 24; + break; + + case 42: + block2[2] = block2[2] | append[0] << 16; + block2[3] = append[0] >> 16 | append[1] << 16; + block3[0] = append[1] >> 16; + break; + + case 43: + block2[2] = block2[2] | append[0] << 24; + block2[3] = append[0] >> 8 | append[1] << 24; + block3[0] = append[1] >> 8; + break; + + case 44: + block2[3] = append[0]; + block3[0] = append[1]; + break; + + case 45: + block2[3] = block2[3] | append[0] << 8; + block3[0] = append[0] >> 24 | append[1] << 8; + block3[1] = append[1] >> 24; + break; + + case 46: + block2[3] = block2[3] | append[0] << 16; + block3[0] = append[0] >> 16 | append[1] << 16; + block3[1] = append[1] >> 16; + break; + + case 47: + block2[3] = block2[3] | append[0] << 24; + block3[0] = append[0] >> 8 | append[1] << 24; + block3[1] = append[1] >> 8; + break; + + case 48: + block3[0] = append[0]; + block3[1] = append[1]; + break; + + case 49: + block3[0] = block3[0] | append[0] << 8; + block3[1] = append[0] >> 24 | append[1] << 8; + block3[2] = append[1] >> 24; + break; + + case 50: + block3[0] = block3[0] | append[0] << 16; + block3[1] = append[0] >> 16 | append[1] << 16; + block3[2] = append[1] >> 16; + break; + + case 51: + block3[0] = block3[0] | append[0] << 24; + block3[1] = append[0] >> 8 | append[1] << 24; + block3[2] = append[1] >> 8; + break; + + case 52: + block3[1] = append[0]; + block3[2] = append[1]; + break; + + case 53: + block3[1] = block3[1] | append[0] << 8; + block3[2] = append[0] >> 24 | append[1] << 8; + block3[3] = append[1] >> 24; + break; + + case 54: + block3[1] = block3[1] | append[0] << 16; + block3[2] = append[0] >> 16 | append[1] << 16; + block3[3] = append[1] >> 16; + break; + + case 55: + block3[1] = block3[1] | append[0] << 24; + block3[2] = append[0] >> 8 | append[1] << 24; + block3[3] = append[1] >> 8; + break; + + case 56: + block3[2] = append[0]; + block3[3] = append[1]; + break; + } +} + +static void append_sign (u32x block0[4], u32x block1[4], const u32 block_len) +{ + switch (block_len) + { + case 0: + block0[0] = md5crypt_magic; + break; + + case 1: + block0[0] = block0[0] | md5crypt_magic << 8; + block0[1] = md5crypt_magic >> 24; + break; + + case 2: + block0[0] = block0[0] | md5crypt_magic << 16; + block0[1] = md5crypt_magic >> 16; + break; + + case 3: + block0[0] = block0[0] | md5crypt_magic << 24; + block0[1] = md5crypt_magic >> 8; + break; + + case 4: + block0[1] = md5crypt_magic; + break; + + case 5: + block0[1] = block0[1] | md5crypt_magic << 8; + block0[2] = md5crypt_magic >> 24; + break; + + case 6: + block0[1] = block0[1] | md5crypt_magic << 16; + block0[2] = md5crypt_magic >> 16; + break; + + case 7: + block0[1] = block0[1] | md5crypt_magic << 24; + block0[2] = md5crypt_magic >> 8; + break; + + case 8: + block0[2] = md5crypt_magic; + break; + + case 9: + block0[2] = block0[2] | md5crypt_magic << 8; + block0[3] = md5crypt_magic >> 24; + break; + + case 10: + block0[2] = block0[2] | md5crypt_magic << 16; + block0[3] = md5crypt_magic >> 16; + break; + + case 11: + block0[2] = block0[2] | md5crypt_magic << 24; + block0[3] = md5crypt_magic >> 8; + break; + + case 12: + block0[3] = md5crypt_magic; + break; + + case 13: + block0[3] = block0[3] | md5crypt_magic << 8; + block1[0] = md5crypt_magic >> 24; + break; + + case 14: + block0[3] = block0[3] | md5crypt_magic << 16; + block1[0] = md5crypt_magic >> 16; + break; + + case 15: + block0[3] = block0[3] | md5crypt_magic << 24; + block1[0] = md5crypt_magic >> 8; + break; + } +} + +static void append_1st (u32x block0[4], u32x block1[4], u32x block2[4], u32x block3[4], const u32 block_len, const u32x append) +{ + switch (block_len) + { + case 0: + block0[0] = append; + break; + + case 1: + block0[0] = block0[0] | append << 8; + break; + + case 2: + block0[0] = block0[0] | append << 16; + break; + + case 3: + block0[0] = block0[0] | append << 24; + break; + + case 4: + block0[1] = append; + break; + + case 5: + block0[1] = block0[1] | append << 8; + break; + + case 6: + block0[1] = block0[1] | append << 16; + break; + + case 7: + block0[1] = block0[1] | append << 24; + break; + + case 8: + block0[2] = append; + break; + + case 9: + block0[2] = block0[2] | append << 8; + break; + + case 10: + block0[2] = block0[2] | append << 16; + break; + + case 11: + block0[2] = block0[2] | append << 24; + break; + + case 12: + block0[3] = append; + break; + + case 13: + block0[3] = block0[3] | append << 8; + break; + + case 14: + block0[3] = block0[3] | append << 16; + break; + + case 15: + block0[3] = block0[3] | append << 24; + break; + + case 16: + block1[0] = append; + break; + + case 17: + block1[0] = block1[0] | append << 8; + break; + + case 18: + block1[0] = block1[0] | append << 16; + break; + + case 19: + block1[0] = block1[0] | append << 24; + break; + + case 20: + block1[1] = append; + break; + + case 21: + block1[1] = block1[1] | append << 8; + break; + + case 22: + block1[1] = block1[1] | append << 16; + break; + + case 23: + block1[1] = block1[1] | append << 24; + break; + + case 24: + block1[2] = append; + break; + + case 25: + block1[2] = block1[2] | append << 8; + break; + + case 26: + block1[2] = block1[2] | append << 16; + break; + + case 27: + block1[2] = block1[2] | append << 24; + break; + + case 28: + block1[3] = append; + break; + + case 29: + block1[3] = block1[3] | append << 8; + break; + + case 30: + block1[3] = block1[3] | append << 16; + break; + + case 31: + block1[3] = block1[3] | append << 24; + break; + + case 32: + block2[0] = append; + break; + + case 33: + block2[0] = block2[0] | append << 8; + break; + + case 34: + block2[0] = block2[0] | append << 16; + break; + + case 35: + block2[0] = block2[0] | append << 24; + break; + + case 36: + block2[1] = append; + break; + + case 37: + block2[1] = block2[1] | append << 8; + break; + + case 38: + block2[1] = block2[1] | append << 16; + break; + + case 39: + block2[1] = block2[1] | append << 24; + break; + + case 40: + block2[2] = append; + break; + + case 41: + block2[2] = block2[2] | append << 8; + break; + + case 42: + block2[2] = block2[2] | append << 16; + break; + + case 43: + block2[2] = block2[2] | append << 24; + break; + + case 44: + block2[3] = append; + break; + + case 45: + block2[3] = block2[3] | append << 8; + break; + + case 46: + block2[3] = block2[3] | append << 16; + break; + + case 47: + block2[3] = block2[3] | append << 24; + break; + + case 48: + block3[0] = append; + break; + + case 49: + block3[0] = block3[0] | append << 8; + break; + + case 50: + block3[0] = block3[0] | append << 16; + break; + + case 51: + block3[0] = block3[0] | append << 24; + break; + + case 52: + block3[1] = append; + break; + + case 53: + block3[1] = block3[1] | append << 8; + break; + + case 54: + block3[1] = block3[1] | append << 16; + break; + + case 55: + block3[1] = block3[1] | append << 24; + break; + + case 56: + block3[2] = append; + break; + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m00500_init (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global md5crypt_tmp_t *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[0]; + w0[1] = pws[gid].i[1]; + w0[2] = pws[gid].i[2]; + w0[3] = pws[gid].i[3]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * salt + */ + + u32 salt_buf[2]; + + salt_buf[0] = salt_bufs[salt_pos].salt_buf[0]; + salt_buf[1] = salt_bufs[salt_pos].salt_buf[1]; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + /** + * init + */ + + //memcat16 (block0, block1, block2, block3, block_len, w0); + //block_len += pw_len; + + u32 block_len = pw_len; + + u32x block0[4]; + + block0[0] = w0[0]; + block0[1] = w0[1]; + block0[2] = w0[2]; + block0[3] = w0[3]; + + u32x block1[4]; + + block1[0] = 0; + block1[1] = 0; + block1[2] = 0; + block1[3] = 0; + + u32x block2[4]; + + block2[0] = 0; + block2[1] = 0; + block2[2] = 0; + block2[3] = 0; + + u32x block3[4]; + + block3[0] = 0; + block3[1] = 0; + block3[2] = 0; + block3[3] = 0; + + memcat8 (block0, block1, block2, block3, block_len, salt_buf); + + block_len += salt_len; + + memcat16 (block0, block1, block2, block3, block_len, w0); + + block_len += pw_len; + + append_0x80_4 (block0, block1, block2, block3, block_len); + + block3[2] = block_len * 8; + + u32x digest[4]; + + digest[0] = MD5M_A; + digest[1] = MD5M_B; + digest[2] = MD5M_C; + digest[3] = MD5M_D; + + md5_transform (block0, block1, block2, block3, digest); + + /* The password first, since that is what is most unknown */ + /* Then our magic string */ + /* Then the raw salt */ + /* Then just as many characters of the MD5(pw,salt,pw) */ + + //memcat16 (block0, block1, block2, block3, block_len, w); + //block_len += pw_len; + + block_len = pw_len; + + block0[0] = w0[0]; + block0[1] = w0[1]; + block0[2] = w0[2]; + block0[3] = w0[3]; + + block1[0] = 0; + block1[1] = 0; + block1[2] = 0; + block1[3] = 0; + + block2[0] = 0; + block2[1] = 0; + block2[2] = 0; + block2[3] = 0; + + block3[0] = 0; + block3[1] = 0; + block3[2] = 0; + block3[3] = 0; + + append_sign (block0, block1, block_len); + + block_len += 3; + + memcat8 (block0, block1, block2, block3, block_len, salt_buf); + + block_len += salt_len; + + truncate_block (digest, pw_len); + + memcat16 (block0, block1, block2, block3, block_len, digest); + + block_len += pw_len; + + /* Then something really weird... */ + + u32x append = block0[0] & 0xFF; + + for (u32 j = pw_len; j; j >>= 1) + { + if ((j & 1) == 0) + { + append_1st (block0, block1, block2, block3, block_len, append); + } + + block_len++; + } + + append_0x80_4 (block0, block1, block2, block3, block_len); + + block3[2] = block_len * 8; + + digest[0] = MD5M_A; + digest[1] = MD5M_B; + digest[2] = MD5M_C; + digest[3] = MD5M_D; + + md5_transform (block0, block1, block2, block3, digest); + + tmps[gid].digest_buf[0] = digest[0]; + tmps[gid].digest_buf[1] = digest[1]; + tmps[gid].digest_buf[2] = digest[2]; + tmps[gid].digest_buf[3] = digest[3]; +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m00500_loop (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global md5crypt_tmp_t *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[0]; + w0[1] = pws[gid].i[1]; + w0[2] = pws[gid].i[2]; + w0[3] = pws[gid].i[3]; + + const u32 pw_len = pws[gid].pw_len; + + u32x w0_x80[4]; + + w0_x80[0] = w0[0]; + w0_x80[1] = w0[1]; + w0_x80[2] = w0[2]; + w0_x80[3] = w0[3]; + + append_0x80_1 (w0_x80, pw_len); + + /** + * salt + */ + + u32 salt_buf[2]; + + salt_buf[0] = salt_bufs[salt_pos].salt_buf[0]; + salt_buf[1] = salt_bufs[salt_pos].salt_buf[1]; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + /** + * digest + */ + + u32x digest[4]; + + digest[0] = tmps[gid].digest_buf[0]; + digest[1] = tmps[gid].digest_buf[1]; + digest[2] = tmps[gid].digest_buf[2]; + digest[3] = tmps[gid].digest_buf[3]; + + /** + * loop + */ + + /* and now, just to make sure things don't run too fast */ + + u32 block_len; + + u32x block0[4]; + + block0[0] = 0; + block0[1] = 0; + block0[2] = 0; + block0[3] = 0; + + u32x block1[4]; + + block1[0] = 0; + block1[1] = 0; + block1[2] = 0; + block1[3] = 0; + + u32x block2[4]; + + block2[0] = 0; + block2[1] = 0; + block2[2] = 0; + block2[3] = 0; + + u32x block3[4]; + + block3[0] = 0; + block3[1] = 0; + block3[2] = 0; + block3[3] = 0; + + for (u32 i = 0, j = loop_pos; i < loop_cnt; i++, j++) + { + block1[0] = 0; + block1[1] = 0; + block1[2] = 0; + block1[3] = 0; + block2[0] = 0; + block2[1] = 0; + block2[2] = 0; + block2[3] = 0; + block3[0] = 0; + block3[1] = 0; + + const u32 j1 = (j & 1) ? 1 : 0; + const u32 j3 = (j % 3) ? 1 : 0; + const u32 j7 = (j % 7) ? 1 : 0; + + if (j1) + { + block0[0] = w0[0]; + block0[1] = w0[1]; + block0[2] = w0[2]; + block0[3] = w0[3]; + + block_len = pw_len; + + if (j3) + { + memcat8 (block0, block1, block2, block3, block_len, salt_buf); + + block_len += salt_len; + } + + if (j7) + { + memcat16 (block0, block1, block2, block3, block_len, w0); + + block_len += pw_len; + } + + memcat16_x80 (block0, block1, block2, block3, block_len, digest); + + block_len += 16; + } + else + { + block0[0] = digest[0]; + block0[1] = digest[1]; + block0[2] = digest[2]; + block0[3] = digest[3]; + + block_len = 16; + + if (j3 && j7) + { + block1[0] = salt_buf[0]; + block1[1] = salt_buf[1]; + + block_len += salt_len; + + memcat16 (block0, block1, block2, block3, block_len, w0); + + block_len += pw_len; + } + else if (j3) + { + block1[0] = salt_buf[0]; + block1[1] = salt_buf[1]; + + block_len += salt_len; + } + else if (j7) + { + block1[0] = w0[0]; + block1[1] = w0[1]; + block1[2] = w0[2]; + block1[3] = w0[3]; + + block_len += pw_len; + } + + memcat16 (block0, block1, block2, block3, block_len, w0_x80); + + block_len += pw_len; + } + + block3[2] = block_len * 8; + + digest[0] = MD5M_A; + digest[1] = MD5M_B; + digest[2] = MD5M_C; + digest[3] = MD5M_D; + + md5_transform (block0, block1, block2, block3, digest); + } + + tmps[gid].digest_buf[0] = digest[0]; + tmps[gid].digest_buf[1] = digest[1]; + tmps[gid].digest_buf[2] = digest[2]; + tmps[gid].digest_buf[3] = digest[3]; +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m00500_comp (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global md5crypt_tmp_t *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + const u32 lid = get_local_id (0); + + /** + * digest + */ + + const u32x r0 = tmps[gid].digest_buf[DGST_R0]; + const u32x r1 = tmps[gid].digest_buf[DGST_R1]; + const u32x r2 = tmps[gid].digest_buf[DGST_R2]; + const u32x r3 = tmps[gid].digest_buf[DGST_R3]; + + #define il_pos 0 + + #include VECT_COMPARE_M +} diff --git a/amd/m00900_a0.cl b/amd/m00900_a0.cl new file mode 100644 index 0000000000..cb656cebc7 --- /dev/null +++ b/amd/m00900_a0.cl @@ -0,0 +1,349 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _MD4_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW4 +#define VECT_SIZE4 +#endif + +#ifdef VLIW5 +#define VECT_SIZE4 +#endif + +#define DGST_R0 0 +#define DGST_R1 3 +#define DGST_R2 2 +#define DGST_R3 1 + +#include "include/kernel_functions.c" +#include "types_amd.c" +#include "common_amd.c" +#include "include/rp_gpu.h" +#include "rp_amd.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m00900_m04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + u32x pw_buf1[4]; + + pw_buf1[0] = pws[gid].i[ 4]; + pw_buf1[1] = pws[gid].i[ 5]; + pw_buf1[2] = pws[gid].i[ 6]; + pw_buf1[3] = pws[gid].i[ 7]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + + w0[0] = pw_buf0[0]; + w0[1] = pw_buf0[1]; + w0[2] = pw_buf0[2]; + w0[3] = pw_buf0[3]; + + u32x w1[4]; + + w1[0] = pw_buf1[0]; + w1[1] = pw_buf1[1]; + w1[2] = pw_buf1[2]; + w1[3] = pw_buf1[3]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 out_len = apply_rules (rules_buf[il_pos].cmds, w0, w1, pw_len); + + append_0x80_2 (w0, w1, out_len); + + w3[2] = out_len * 8; + + u32x a = MD4M_A; + u32x b = MD4M_B; + u32x c = MD4M_C; + u32x d = MD4M_D; + + MD4_STEP (MD4_Fo, a, b, c, d, w0[0], MD4C00, MD4S00); + MD4_STEP (MD4_Fo, d, a, b, c, w0[1], MD4C00, MD4S01); + MD4_STEP (MD4_Fo, c, d, a, b, w0[2], MD4C00, MD4S02); + MD4_STEP (MD4_Fo, b, c, d, a, w0[3], MD4C00, MD4S03); + MD4_STEP (MD4_Fo, a, b, c, d, w1[0], MD4C00, MD4S00); + MD4_STEP (MD4_Fo, d, a, b, c, w1[1], MD4C00, MD4S01); + MD4_STEP (MD4_Fo, c, d, a, b, w1[2], MD4C00, MD4S02); + MD4_STEP (MD4_Fo, b, c, d, a, w1[3], MD4C00, MD4S03); + MD4_STEP (MD4_Fo, a, b, c, d, w2[0], MD4C00, MD4S00); + MD4_STEP (MD4_Fo, d, a, b, c, w2[1], MD4C00, MD4S01); + MD4_STEP (MD4_Fo, c, d, a, b, w2[2], MD4C00, MD4S02); + MD4_STEP (MD4_Fo, b, c, d, a, w2[3], MD4C00, MD4S03); + MD4_STEP (MD4_Fo, a, b, c, d, w3[0], MD4C00, MD4S00); + MD4_STEP (MD4_Fo, d, a, b, c, w3[1], MD4C00, MD4S01); + MD4_STEP (MD4_Fo, c, d, a, b, w3[2], MD4C00, MD4S02); + MD4_STEP (MD4_Fo, b, c, d, a, w3[3], MD4C00, MD4S03); + + MD4_STEP (MD4_Go, a, b, c, d, w0[0], MD4C01, MD4S10); + MD4_STEP (MD4_Go, d, a, b, c, w1[0], MD4C01, MD4S11); + MD4_STEP (MD4_Go, c, d, a, b, w2[0], MD4C01, MD4S12); + MD4_STEP (MD4_Go, b, c, d, a, w3[0], MD4C01, MD4S13); + MD4_STEP (MD4_Go, a, b, c, d, w0[1], MD4C01, MD4S10); + MD4_STEP (MD4_Go, d, a, b, c, w1[1], MD4C01, MD4S11); + MD4_STEP (MD4_Go, c, d, a, b, w2[1], MD4C01, MD4S12); + MD4_STEP (MD4_Go, b, c, d, a, w3[1], MD4C01, MD4S13); + MD4_STEP (MD4_Go, a, b, c, d, w0[2], MD4C01, MD4S10); + MD4_STEP (MD4_Go, d, a, b, c, w1[2], MD4C01, MD4S11); + MD4_STEP (MD4_Go, c, d, a, b, w2[2], MD4C01, MD4S12); + MD4_STEP (MD4_Go, b, c, d, a, w3[2], MD4C01, MD4S13); + MD4_STEP (MD4_Go, a, b, c, d, w0[3], MD4C01, MD4S10); + MD4_STEP (MD4_Go, d, a, b, c, w1[3], MD4C01, MD4S11); + MD4_STEP (MD4_Go, c, d, a, b, w2[3], MD4C01, MD4S12); + MD4_STEP (MD4_Go, b, c, d, a, w3[3], MD4C01, MD4S13); + + MD4_STEP (MD4_H , a, b, c, d, w0[0], MD4C02, MD4S20); + MD4_STEP (MD4_H , d, a, b, c, w2[0], MD4C02, MD4S21); + MD4_STEP (MD4_H , c, d, a, b, w1[0], MD4C02, MD4S22); + MD4_STEP (MD4_H , b, c, d, a, w3[0], MD4C02, MD4S23); + MD4_STEP (MD4_H , a, b, c, d, w0[2], MD4C02, MD4S20); + MD4_STEP (MD4_H , d, a, b, c, w2[2], MD4C02, MD4S21); + MD4_STEP (MD4_H , c, d, a, b, w1[2], MD4C02, MD4S22); + MD4_STEP (MD4_H , b, c, d, a, w3[2], MD4C02, MD4S23); + MD4_STEP (MD4_H , a, b, c, d, w0[1], MD4C02, MD4S20); + MD4_STEP (MD4_H , d, a, b, c, w2[1], MD4C02, MD4S21); + MD4_STEP (MD4_H , c, d, a, b, w1[1], MD4C02, MD4S22); + MD4_STEP (MD4_H , b, c, d, a, w3[1], MD4C02, MD4S23); + MD4_STEP (MD4_H , a, b, c, d, w0[3], MD4C02, MD4S20); + MD4_STEP (MD4_H , d, a, b, c, w2[3], MD4C02, MD4S21); + MD4_STEP (MD4_H , c, d, a, b, w1[3], MD4C02, MD4S22); + MD4_STEP (MD4_H , b, c, d, a, w3[3], MD4C02, MD4S23); + + const u32x r0 = a; + const u32x r1 = d; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_M + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m00900_m08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m00900_m16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m00900_s04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + u32x pw_buf1[4]; + + pw_buf1[0] = pws[gid].i[ 4]; + pw_buf1[1] = pws[gid].i[ 5]; + pw_buf1[2] = pws[gid].i[ 6]; + pw_buf1[3] = pws[gid].i[ 7]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + + w0[0] = pw_buf0[0]; + w0[1] = pw_buf0[1]; + w0[2] = pw_buf0[2]; + w0[3] = pw_buf0[3]; + + u32x w1[4]; + + w1[0] = pw_buf1[0]; + w1[1] = pw_buf1[1]; + w1[2] = pw_buf1[2]; + w1[3] = pw_buf1[3]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 out_len = apply_rules (rules_buf[il_pos].cmds, w0, w1, pw_len); + + append_0x80_2 (w0, w1, out_len); + + w3[2] = out_len * 8; + + u32x a = MD4M_A; + u32x b = MD4M_B; + u32x c = MD4M_C; + u32x d = MD4M_D; + + MD4_STEP (MD4_Fo, a, b, c, d, w0[0], MD4C00, MD4S00); + MD4_STEP (MD4_Fo, d, a, b, c, w0[1], MD4C00, MD4S01); + MD4_STEP (MD4_Fo, c, d, a, b, w0[2], MD4C00, MD4S02); + MD4_STEP (MD4_Fo, b, c, d, a, w0[3], MD4C00, MD4S03); + MD4_STEP (MD4_Fo, a, b, c, d, w1[0], MD4C00, MD4S00); + MD4_STEP (MD4_Fo, d, a, b, c, w1[1], MD4C00, MD4S01); + MD4_STEP (MD4_Fo, c, d, a, b, w1[2], MD4C00, MD4S02); + MD4_STEP (MD4_Fo, b, c, d, a, w1[3], MD4C00, MD4S03); + MD4_STEP (MD4_Fo, a, b, c, d, w2[0], MD4C00, MD4S00); + MD4_STEP (MD4_Fo, d, a, b, c, w2[1], MD4C00, MD4S01); + MD4_STEP (MD4_Fo, c, d, a, b, w2[2], MD4C00, MD4S02); + MD4_STEP (MD4_Fo, b, c, d, a, w2[3], MD4C00, MD4S03); + MD4_STEP (MD4_Fo, a, b, c, d, w3[0], MD4C00, MD4S00); + MD4_STEP (MD4_Fo, d, a, b, c, w3[1], MD4C00, MD4S01); + MD4_STEP (MD4_Fo, c, d, a, b, w3[2], MD4C00, MD4S02); + MD4_STEP (MD4_Fo, b, c, d, a, w3[3], MD4C00, MD4S03); + + MD4_STEP (MD4_Go, a, b, c, d, w0[0], MD4C01, MD4S10); + MD4_STEP (MD4_Go, d, a, b, c, w1[0], MD4C01, MD4S11); + MD4_STEP (MD4_Go, c, d, a, b, w2[0], MD4C01, MD4S12); + MD4_STEP (MD4_Go, b, c, d, a, w3[0], MD4C01, MD4S13); + MD4_STEP (MD4_Go, a, b, c, d, w0[1], MD4C01, MD4S10); + MD4_STEP (MD4_Go, d, a, b, c, w1[1], MD4C01, MD4S11); + MD4_STEP (MD4_Go, c, d, a, b, w2[1], MD4C01, MD4S12); + MD4_STEP (MD4_Go, b, c, d, a, w3[1], MD4C01, MD4S13); + MD4_STEP (MD4_Go, a, b, c, d, w0[2], MD4C01, MD4S10); + MD4_STEP (MD4_Go, d, a, b, c, w1[2], MD4C01, MD4S11); + MD4_STEP (MD4_Go, c, d, a, b, w2[2], MD4C01, MD4S12); + MD4_STEP (MD4_Go, b, c, d, a, w3[2], MD4C01, MD4S13); + MD4_STEP (MD4_Go, a, b, c, d, w0[3], MD4C01, MD4S10); + MD4_STEP (MD4_Go, d, a, b, c, w1[3], MD4C01, MD4S11); + MD4_STEP (MD4_Go, c, d, a, b, w2[3], MD4C01, MD4S12); + MD4_STEP (MD4_Go, b, c, d, a, w3[3], MD4C01, MD4S13); + + MD4_STEP (MD4_H , a, b, c, d, w0[0], MD4C02, MD4S20); + MD4_STEP (MD4_H , d, a, b, c, w2[0], MD4C02, MD4S21); + MD4_STEP (MD4_H , c, d, a, b, w1[0], MD4C02, MD4S22); + MD4_STEP (MD4_H , b, c, d, a, w3[0], MD4C02, MD4S23); + MD4_STEP (MD4_H , a, b, c, d, w0[2], MD4C02, MD4S20); + MD4_STEP (MD4_H , d, a, b, c, w2[2], MD4C02, MD4S21); + MD4_STEP (MD4_H , c, d, a, b, w1[2], MD4C02, MD4S22); + MD4_STEP (MD4_H , b, c, d, a, w3[2], MD4C02, MD4S23); + MD4_STEP (MD4_H , a, b, c, d, w0[1], MD4C02, MD4S20); + MD4_STEP (MD4_H , d, a, b, c, w2[1], MD4C02, MD4S21); + MD4_STEP (MD4_H , c, d, a, b, w1[1], MD4C02, MD4S22); + MD4_STEP (MD4_H , b, c, d, a, w3[1], MD4C02, MD4S23); + MD4_STEP (MD4_H , a, b, c, d, w0[3], MD4C02, MD4S20); + MD4_STEP (MD4_H , d, a, b, c, w2[3], MD4C02, MD4S21); + MD4_STEP (MD4_H , c, d, a, b, w1[3], MD4C02, MD4S22); + MD4_STEP (MD4_H , b, c, d, a, w3[3], MD4C02, MD4S23); + + const u32x r0 = a; + const u32x r1 = d; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_S + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m00900_s08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m00900_s16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/amd/m00900_a1.cl b/amd/m00900_a1.cl new file mode 100644 index 0000000000..106bdfe6ff --- /dev/null +++ b/amd/m00900_a1.cl @@ -0,0 +1,451 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _MD4_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW4 +#define VECT_SIZE4 +#endif + +#ifdef VLIW5 +#define VECT_SIZE4 +#endif + +#define DGST_R0 0 +#define DGST_R1 3 +#define DGST_R2 2 +#define DGST_R3 1 + +#include "include/kernel_functions.c" +#include "types_amd.c" +#include "common_amd.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m00900_m04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + append_0x80_2 (wordl0, wordl1, pw_l_len); + + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, combs_buf[0].pw_len); + } + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = combs_buf[il_pos].pw_len; + + const u32 pw_len = pw_l_len + pw_r_len; + + u32 wordr0[4]; + + wordr0[0] = combs_buf[il_pos].i[0]; + wordr0[1] = combs_buf[il_pos].i[1]; + wordr0[2] = combs_buf[il_pos].i[2]; + wordr0[3] = combs_buf[il_pos].i[3]; + + u32 wordr1[4]; + + wordr1[0] = combs_buf[il_pos].i[4]; + wordr1[1] = combs_buf[il_pos].i[5]; + wordr1[2] = combs_buf[il_pos].i[6]; + wordr1[3] = combs_buf[il_pos].i[7]; + + u32 wordr2[4]; + + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + + u32 wordr3[4]; + + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + u32x w0[4]; + + w0[0] = wordl0[0] | wordr0[0]; + w0[1] = wordl0[1] | wordr0[1]; + w0[2] = wordl0[2] | wordr0[2]; + w0[3] = wordl0[3] | wordr0[3]; + + u32x w1[4]; + + w1[0] = wordl1[0] | wordr1[0]; + w1[1] = wordl1[1] | wordr1[1]; + w1[2] = wordl1[2] | wordr1[2]; + w1[3] = wordl1[3] | wordr1[3]; + + u32x w2[4]; + + w2[0] = wordl2[0] | wordr2[0]; + w2[1] = wordl2[1] | wordr2[1]; + w2[2] = wordl2[2] | wordr2[2]; + w2[3] = wordl2[3] | wordr2[3]; + + u32x w3[4]; + + w3[0] = wordl3[0] | wordr3[0]; + w3[1] = wordl3[1] | wordr3[1]; + w3[2] = pw_len * 8; + w3[3] = 0; + + u32x a = MD4M_A; + u32x b = MD4M_B; + u32x c = MD4M_C; + u32x d = MD4M_D; + + MD4_STEP (MD4_Fo, a, b, c, d, w0[0], MD4C00, MD4S00); + MD4_STEP (MD4_Fo, d, a, b, c, w0[1], MD4C00, MD4S01); + MD4_STEP (MD4_Fo, c, d, a, b, w0[2], MD4C00, MD4S02); + MD4_STEP (MD4_Fo, b, c, d, a, w0[3], MD4C00, MD4S03); + MD4_STEP (MD4_Fo, a, b, c, d, w1[0], MD4C00, MD4S00); + MD4_STEP (MD4_Fo, d, a, b, c, w1[1], MD4C00, MD4S01); + MD4_STEP (MD4_Fo, c, d, a, b, w1[2], MD4C00, MD4S02); + MD4_STEP (MD4_Fo, b, c, d, a, w1[3], MD4C00, MD4S03); + MD4_STEP (MD4_Fo, a, b, c, d, w2[0], MD4C00, MD4S00); + MD4_STEP (MD4_Fo, d, a, b, c, w2[1], MD4C00, MD4S01); + MD4_STEP (MD4_Fo, c, d, a, b, w2[2], MD4C00, MD4S02); + MD4_STEP (MD4_Fo, b, c, d, a, w2[3], MD4C00, MD4S03); + MD4_STEP (MD4_Fo, a, b, c, d, w3[0], MD4C00, MD4S00); + MD4_STEP (MD4_Fo, d, a, b, c, w3[1], MD4C00, MD4S01); + MD4_STEP (MD4_Fo, c, d, a, b, w3[2], MD4C00, MD4S02); + MD4_STEP (MD4_Fo, b, c, d, a, w3[3], MD4C00, MD4S03); + + MD4_STEP (MD4_Go, a, b, c, d, w0[0], MD4C01, MD4S10); + MD4_STEP (MD4_Go, d, a, b, c, w1[0], MD4C01, MD4S11); + MD4_STEP (MD4_Go, c, d, a, b, w2[0], MD4C01, MD4S12); + MD4_STEP (MD4_Go, b, c, d, a, w3[0], MD4C01, MD4S13); + MD4_STEP (MD4_Go, a, b, c, d, w0[1], MD4C01, MD4S10); + MD4_STEP (MD4_Go, d, a, b, c, w1[1], MD4C01, MD4S11); + MD4_STEP (MD4_Go, c, d, a, b, w2[1], MD4C01, MD4S12); + MD4_STEP (MD4_Go, b, c, d, a, w3[1], MD4C01, MD4S13); + MD4_STEP (MD4_Go, a, b, c, d, w0[2], MD4C01, MD4S10); + MD4_STEP (MD4_Go, d, a, b, c, w1[2], MD4C01, MD4S11); + MD4_STEP (MD4_Go, c, d, a, b, w2[2], MD4C01, MD4S12); + MD4_STEP (MD4_Go, b, c, d, a, w3[2], MD4C01, MD4S13); + MD4_STEP (MD4_Go, a, b, c, d, w0[3], MD4C01, MD4S10); + MD4_STEP (MD4_Go, d, a, b, c, w1[3], MD4C01, MD4S11); + MD4_STEP (MD4_Go, c, d, a, b, w2[3], MD4C01, MD4S12); + MD4_STEP (MD4_Go, b, c, d, a, w3[3], MD4C01, MD4S13); + + MD4_STEP (MD4_H , a, b, c, d, w0[0], MD4C02, MD4S20); + MD4_STEP (MD4_H , d, a, b, c, w2[0], MD4C02, MD4S21); + MD4_STEP (MD4_H , c, d, a, b, w1[0], MD4C02, MD4S22); + MD4_STEP (MD4_H , b, c, d, a, w3[0], MD4C02, MD4S23); + MD4_STEP (MD4_H , a, b, c, d, w0[2], MD4C02, MD4S20); + MD4_STEP (MD4_H , d, a, b, c, w2[2], MD4C02, MD4S21); + MD4_STEP (MD4_H , c, d, a, b, w1[2], MD4C02, MD4S22); + MD4_STEP (MD4_H , b, c, d, a, w3[2], MD4C02, MD4S23); + MD4_STEP (MD4_H , a, b, c, d, w0[1], MD4C02, MD4S20); + MD4_STEP (MD4_H , d, a, b, c, w2[1], MD4C02, MD4S21); + MD4_STEP (MD4_H , c, d, a, b, w1[1], MD4C02, MD4S22); + MD4_STEP (MD4_H , b, c, d, a, w3[1], MD4C02, MD4S23); + MD4_STEP (MD4_H , a, b, c, d, w0[3], MD4C02, MD4S20); + MD4_STEP (MD4_H , d, a, b, c, w2[3], MD4C02, MD4S21); + MD4_STEP (MD4_H , c, d, a, b, w1[3], MD4C02, MD4S22); + MD4_STEP (MD4_H , b, c, d, a, w3[3], MD4C02, MD4S23); + + const u32x r0 = a; + const u32x r1 = d; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_M + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m00900_m08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m00900_m16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m00900_s04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + append_0x80_2 (wordl0, wordl1, pw_l_len); + + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, combs_buf[0].pw_len); + } + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = combs_buf[il_pos].pw_len; + + const u32 pw_len = pw_l_len + pw_r_len; + + u32 wordr0[4]; + + wordr0[0] = combs_buf[il_pos].i[0]; + wordr0[1] = combs_buf[il_pos].i[1]; + wordr0[2] = combs_buf[il_pos].i[2]; + wordr0[3] = combs_buf[il_pos].i[3]; + + u32 wordr1[4]; + + wordr1[0] = combs_buf[il_pos].i[4]; + wordr1[1] = combs_buf[il_pos].i[5]; + wordr1[2] = combs_buf[il_pos].i[6]; + wordr1[3] = combs_buf[il_pos].i[7]; + + u32 wordr2[4]; + + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + + u32 wordr3[4]; + + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + u32x w0[4]; + + w0[0] = wordl0[0] | wordr0[0]; + w0[1] = wordl0[1] | wordr0[1]; + w0[2] = wordl0[2] | wordr0[2]; + w0[3] = wordl0[3] | wordr0[3]; + + u32x w1[4]; + + w1[0] = wordl1[0] | wordr1[0]; + w1[1] = wordl1[1] | wordr1[1]; + w1[2] = wordl1[2] | wordr1[2]; + w1[3] = wordl1[3] | wordr1[3]; + + u32x w2[4]; + + w2[0] = wordl2[0] | wordr2[0]; + w2[1] = wordl2[1] | wordr2[1]; + w2[2] = wordl2[2] | wordr2[2]; + w2[3] = wordl2[3] | wordr2[3]; + + u32x w3[4]; + + w3[0] = wordl3[0] | wordr3[0]; + w3[1] = wordl3[1] | wordr3[1]; + w3[2] = pw_len * 8; + w3[3] = 0; + + u32x a = MD4M_A; + u32x b = MD4M_B; + u32x c = MD4M_C; + u32x d = MD4M_D; + + MD4_STEP (MD4_Fo, a, b, c, d, w0[0], MD4C00, MD4S00); + MD4_STEP (MD4_Fo, d, a, b, c, w0[1], MD4C00, MD4S01); + MD4_STEP (MD4_Fo, c, d, a, b, w0[2], MD4C00, MD4S02); + MD4_STEP (MD4_Fo, b, c, d, a, w0[3], MD4C00, MD4S03); + MD4_STEP (MD4_Fo, a, b, c, d, w1[0], MD4C00, MD4S00); + MD4_STEP (MD4_Fo, d, a, b, c, w1[1], MD4C00, MD4S01); + MD4_STEP (MD4_Fo, c, d, a, b, w1[2], MD4C00, MD4S02); + MD4_STEP (MD4_Fo, b, c, d, a, w1[3], MD4C00, MD4S03); + MD4_STEP (MD4_Fo, a, b, c, d, w2[0], MD4C00, MD4S00); + MD4_STEP (MD4_Fo, d, a, b, c, w2[1], MD4C00, MD4S01); + MD4_STEP (MD4_Fo, c, d, a, b, w2[2], MD4C00, MD4S02); + MD4_STEP (MD4_Fo, b, c, d, a, w2[3], MD4C00, MD4S03); + MD4_STEP (MD4_Fo, a, b, c, d, w3[0], MD4C00, MD4S00); + MD4_STEP (MD4_Fo, d, a, b, c, w3[1], MD4C00, MD4S01); + MD4_STEP (MD4_Fo, c, d, a, b, w3[2], MD4C00, MD4S02); + MD4_STEP (MD4_Fo, b, c, d, a, w3[3], MD4C00, MD4S03); + + MD4_STEP (MD4_Go, a, b, c, d, w0[0], MD4C01, MD4S10); + MD4_STEP (MD4_Go, d, a, b, c, w1[0], MD4C01, MD4S11); + MD4_STEP (MD4_Go, c, d, a, b, w2[0], MD4C01, MD4S12); + MD4_STEP (MD4_Go, b, c, d, a, w3[0], MD4C01, MD4S13); + MD4_STEP (MD4_Go, a, b, c, d, w0[1], MD4C01, MD4S10); + MD4_STEP (MD4_Go, d, a, b, c, w1[1], MD4C01, MD4S11); + MD4_STEP (MD4_Go, c, d, a, b, w2[1], MD4C01, MD4S12); + MD4_STEP (MD4_Go, b, c, d, a, w3[1], MD4C01, MD4S13); + MD4_STEP (MD4_Go, a, b, c, d, w0[2], MD4C01, MD4S10); + MD4_STEP (MD4_Go, d, a, b, c, w1[2], MD4C01, MD4S11); + MD4_STEP (MD4_Go, c, d, a, b, w2[2], MD4C01, MD4S12); + MD4_STEP (MD4_Go, b, c, d, a, w3[2], MD4C01, MD4S13); + MD4_STEP (MD4_Go, a, b, c, d, w0[3], MD4C01, MD4S10); + MD4_STEP (MD4_Go, d, a, b, c, w1[3], MD4C01, MD4S11); + MD4_STEP (MD4_Go, c, d, a, b, w2[3], MD4C01, MD4S12); + MD4_STEP (MD4_Go, b, c, d, a, w3[3], MD4C01, MD4S13); + + MD4_STEP (MD4_H , a, b, c, d, w0[0], MD4C02, MD4S20); + MD4_STEP (MD4_H , d, a, b, c, w2[0], MD4C02, MD4S21); + MD4_STEP (MD4_H , c, d, a, b, w1[0], MD4C02, MD4S22); + MD4_STEP (MD4_H , b, c, d, a, w3[0], MD4C02, MD4S23); + MD4_STEP (MD4_H , a, b, c, d, w0[2], MD4C02, MD4S20); + MD4_STEP (MD4_H , d, a, b, c, w2[2], MD4C02, MD4S21); + MD4_STEP (MD4_H , c, d, a, b, w1[2], MD4C02, MD4S22); + MD4_STEP (MD4_H , b, c, d, a, w3[2], MD4C02, MD4S23); + MD4_STEP (MD4_H , a, b, c, d, w0[1], MD4C02, MD4S20); + MD4_STEP (MD4_H , d, a, b, c, w2[1], MD4C02, MD4S21); + MD4_STEP (MD4_H , c, d, a, b, w1[1], MD4C02, MD4S22); + MD4_STEP (MD4_H , b, c, d, a, w3[1], MD4C02, MD4S23); + MD4_STEP (MD4_H , a, b, c, d, w0[3], MD4C02, MD4S20); + MD4_STEP (MD4_H , d, a, b, c, w2[3], MD4C02, MD4S21); + MD4_STEP (MD4_H , c, d, a, b, w1[3], MD4C02, MD4S22); + MD4_STEP (MD4_H , b, c, d, a, w3[3], MD4C02, MD4S23); + + const u32x r0 = a; + const u32x r1 = d; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_S + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m00900_s08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m00900_s16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/amd/m00900_a3.cl b/amd/m00900_a3.cl new file mode 100644 index 0000000000..f41c260edd --- /dev/null +++ b/amd/m00900_a3.cl @@ -0,0 +1,637 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _MD4_ +#define _SCALAR_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW4 +#define VECT_SIZE4 +#endif + +#ifdef VLIW5 +#define VECT_SIZE4 +#endif + +#define DGST_R0 0 +#define DGST_R1 3 +#define DGST_R2 2 +#define DGST_R3 1 + +#include "include/kernel_functions.c" +#include "types_amd.c" +#include "common_amd.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4_warp.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4_warp.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4_warp.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4_warp.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4_warp.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4_warp.c" +#endif + +#define MD4_STEP_REV(f,a,b,c,d,x,t,s) \ +{ \ + a = rotr32 (a, s); \ + a -= f (b, c, d); \ + a -= x; \ + a -= t; \ +} + +#define MD4_STEP_REV1(f,a,b,c,d,x,t,s) \ +{ \ + a = rotr32 (a, s); \ + a -= x; \ + a -= t; \ +} + +static void m00900m (u32 w[16], const u32 pw_len, __global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global u32x * words_buf_r, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset) +{ + /** + * modifier + */ + + const u32 gid = get_global_id (0); + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 F_w0c00 = 0 + MD4C00; + const u32 F_w1c00 = w[ 1] + MD4C00; + const u32 F_w2c00 = w[ 2] + MD4C00; + const u32 F_w3c00 = w[ 3] + MD4C00; + const u32 F_w4c00 = w[ 4] + MD4C00; + const u32 F_w5c00 = w[ 5] + MD4C00; + const u32 F_w6c00 = w[ 6] + MD4C00; + const u32 F_w7c00 = w[ 7] + MD4C00; + const u32 F_w8c00 = w[ 8] + MD4C00; + const u32 F_w9c00 = w[ 9] + MD4C00; + const u32 F_wac00 = w[10] + MD4C00; + const u32 F_wbc00 = w[11] + MD4C00; + const u32 F_wcc00 = w[12] + MD4C00; + const u32 F_wdc00 = w[13] + MD4C00; + const u32 F_wec00 = w[14] + MD4C00; + const u32 F_wfc00 = w[15] + MD4C00; + + const u32 G_w0c01 = 0 + MD4C01; + const u32 G_w4c01 = w[ 4] + MD4C01; + const u32 G_w8c01 = w[ 8] + MD4C01; + const u32 G_wcc01 = w[12] + MD4C01; + const u32 G_w1c01 = w[ 1] + MD4C01; + const u32 G_w5c01 = w[ 5] + MD4C01; + const u32 G_w9c01 = w[ 9] + MD4C01; + const u32 G_wdc01 = w[13] + MD4C01; + const u32 G_w2c01 = w[ 2] + MD4C01; + const u32 G_w6c01 = w[ 6] + MD4C01; + const u32 G_wac01 = w[10] + MD4C01; + const u32 G_wec01 = w[14] + MD4C01; + const u32 G_w3c01 = w[ 3] + MD4C01; + const u32 G_w7c01 = w[ 7] + MD4C01; + const u32 G_wbc01 = w[11] + MD4C01; + const u32 G_wfc01 = w[15] + MD4C01; + + const u32 H_w0c02 = 0 + MD4C02; + const u32 H_w8c02 = w[ 8] + MD4C02; + const u32 H_w4c02 = w[ 4] + MD4C02; + const u32 H_wcc02 = w[12] + MD4C02; + const u32 H_w2c02 = w[ 2] + MD4C02; + const u32 H_wac02 = w[10] + MD4C02; + const u32 H_w6c02 = w[ 6] + MD4C02; + const u32 H_wec02 = w[14] + MD4C02; + const u32 H_w1c02 = w[ 1] + MD4C02; + const u32 H_w9c02 = w[ 9] + MD4C02; + const u32 H_w5c02 = w[ 5] + MD4C02; + const u32 H_wdc02 = w[13] + MD4C02; + const u32 H_w3c02 = w[ 3] + MD4C02; + const u32 H_wbc02 = w[11] + MD4C02; + const u32 H_w7c02 = w[ 7] + MD4C02; + const u32 H_wfc02 = w[15] + MD4C02; + + /** + * loop + */ + + const u32 bf_loops = ceil ((float) bfs_cnt / VECT_DIV); + + u32x w0l = w[0]; + + for (u32 il_pos = 0; il_pos < bf_loops; il_pos++) + { + const u32x w0r = words_buf_r[il_pos]; + + const u32x w0 = w0l | w0r; + + u32x a = MD4M_A; + u32x b = MD4M_B; + u32x c = MD4M_C; + u32x d = MD4M_D; + + MD4_STEP (MD4_Fo, a, b, c, d, w0, F_w0c00, MD4S00); + MD4_STEP0(MD4_Fo, d, a, b, c, F_w1c00, MD4S01); + MD4_STEP0(MD4_Fo, c, d, a, b, F_w2c00, MD4S02); + MD4_STEP0(MD4_Fo, b, c, d, a, F_w3c00, MD4S03); + MD4_STEP0(MD4_Fo, a, b, c, d, F_w4c00, MD4S00); + MD4_STEP0(MD4_Fo, d, a, b, c, F_w5c00, MD4S01); + MD4_STEP0(MD4_Fo, c, d, a, b, F_w6c00, MD4S02); + MD4_STEP0(MD4_Fo, b, c, d, a, F_w7c00, MD4S03); + MD4_STEP0(MD4_Fo, a, b, c, d, F_w8c00, MD4S00); + MD4_STEP0(MD4_Fo, d, a, b, c, F_w9c00, MD4S01); + MD4_STEP0(MD4_Fo, c, d, a, b, F_wac00, MD4S02); + MD4_STEP0(MD4_Fo, b, c, d, a, F_wbc00, MD4S03); + MD4_STEP0(MD4_Fo, a, b, c, d, F_wcc00, MD4S00); + MD4_STEP0(MD4_Fo, d, a, b, c, F_wdc00, MD4S01); + MD4_STEP0(MD4_Fo, c, d, a, b, F_wec00, MD4S02); + MD4_STEP0(MD4_Fo, b, c, d, a, F_wfc00, MD4S03); + + MD4_STEP (MD4_Go, a, b, c, d, w0, G_w0c01, MD4S10); + MD4_STEP0(MD4_Go, d, a, b, c, G_w4c01, MD4S11); + MD4_STEP0(MD4_Go, c, d, a, b, G_w8c01, MD4S12); + MD4_STEP0(MD4_Go, b, c, d, a, G_wcc01, MD4S13); + MD4_STEP0(MD4_Go, a, b, c, d, G_w1c01, MD4S10); + MD4_STEP0(MD4_Go, d, a, b, c, G_w5c01, MD4S11); + MD4_STEP0(MD4_Go, c, d, a, b, G_w9c01, MD4S12); + MD4_STEP0(MD4_Go, b, c, d, a, G_wdc01, MD4S13); + MD4_STEP0(MD4_Go, a, b, c, d, G_w2c01, MD4S10); + MD4_STEP0(MD4_Go, d, a, b, c, G_w6c01, MD4S11); + MD4_STEP0(MD4_Go, c, d, a, b, G_wac01, MD4S12); + MD4_STEP0(MD4_Go, b, c, d, a, G_wec01, MD4S13); + MD4_STEP0(MD4_Go, a, b, c, d, G_w3c01, MD4S10); + MD4_STEP0(MD4_Go, d, a, b, c, G_w7c01, MD4S11); + MD4_STEP0(MD4_Go, c, d, a, b, G_wbc01, MD4S12); + MD4_STEP0(MD4_Go, b, c, d, a, G_wfc01, MD4S13); + + MD4_STEP (MD4_H , a, b, c, d, w0, H_w0c02, MD4S20); + MD4_STEP0(MD4_H , d, a, b, c, H_w8c02, MD4S21); + MD4_STEP0(MD4_H , c, d, a, b, H_w4c02, MD4S22); + MD4_STEP0(MD4_H , b, c, d, a, H_wcc02, MD4S23); + MD4_STEP0(MD4_H , a, b, c, d, H_w2c02, MD4S20); + MD4_STEP0(MD4_H , d, a, b, c, H_wac02, MD4S21); + MD4_STEP0(MD4_H , c, d, a, b, H_w6c02, MD4S22); + MD4_STEP0(MD4_H , b, c, d, a, H_wec02, MD4S23); + MD4_STEP0(MD4_H , a, b, c, d, H_w1c02, MD4S20); + MD4_STEP0(MD4_H , d, a, b, c, H_w9c02, MD4S21); + MD4_STEP0(MD4_H , c, d, a, b, H_w5c02, MD4S22); + MD4_STEP0(MD4_H , b, c, d, a, H_wdc02, MD4S23); + MD4_STEP0(MD4_H , a, b, c, d, H_w3c02, MD4S20); + MD4_STEP0(MD4_H , d, a, b, c, H_wbc02, MD4S21); + MD4_STEP0(MD4_H , c, d, a, b, H_w7c02, MD4S22); + MD4_STEP0(MD4_H , b, c, d, a, H_wfc02, MD4S23); + + const u32x r0 = a; + const u32x r1 = d; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_M + } +} + +static void m00900s (u32 w[16], const u32 pw_len, __global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global u32x * words_buf_r, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset) +{ + /** + * modifier + */ + + const u32 gid = get_global_id (0); + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 F_w0c00 = 0 + MD4C00; + const u32 F_w1c00 = w[ 1] + MD4C00; + const u32 F_w2c00 = w[ 2] + MD4C00; + const u32 F_w3c00 = w[ 3] + MD4C00; + const u32 F_w4c00 = w[ 4] + MD4C00; + const u32 F_w5c00 = w[ 5] + MD4C00; + const u32 F_w6c00 = w[ 6] + MD4C00; + const u32 F_w7c00 = w[ 7] + MD4C00; + const u32 F_w8c00 = w[ 8] + MD4C00; + const u32 F_w9c00 = w[ 9] + MD4C00; + const u32 F_wac00 = w[10] + MD4C00; + const u32 F_wbc00 = w[11] + MD4C00; + const u32 F_wcc00 = w[12] + MD4C00; + const u32 F_wdc00 = w[13] + MD4C00; + const u32 F_wec00 = w[14] + MD4C00; + const u32 F_wfc00 = w[15] + MD4C00; + + const u32 G_w0c01 = 0 + MD4C01; + const u32 G_w4c01 = w[ 4] + MD4C01; + const u32 G_w8c01 = w[ 8] + MD4C01; + const u32 G_wcc01 = w[12] + MD4C01; + const u32 G_w1c01 = w[ 1] + MD4C01; + const u32 G_w5c01 = w[ 5] + MD4C01; + const u32 G_w9c01 = w[ 9] + MD4C01; + const u32 G_wdc01 = w[13] + MD4C01; + const u32 G_w2c01 = w[ 2] + MD4C01; + const u32 G_w6c01 = w[ 6] + MD4C01; + const u32 G_wac01 = w[10] + MD4C01; + const u32 G_wec01 = w[14] + MD4C01; + const u32 G_w3c01 = w[ 3] + MD4C01; + const u32 G_w7c01 = w[ 7] + MD4C01; + const u32 G_wbc01 = w[11] + MD4C01; + const u32 G_wfc01 = w[15] + MD4C01; + + const u32 H_w0c02 = 0 + MD4C02; + const u32 H_w8c02 = w[ 8] + MD4C02; + const u32 H_w4c02 = w[ 4] + MD4C02; + const u32 H_wcc02 = w[12] + MD4C02; + const u32 H_w2c02 = w[ 2] + MD4C02; + const u32 H_wac02 = w[10] + MD4C02; + const u32 H_w6c02 = w[ 6] + MD4C02; + const u32 H_wec02 = w[14] + MD4C02; + const u32 H_w1c02 = w[ 1] + MD4C02; + const u32 H_w9c02 = w[ 9] + MD4C02; + const u32 H_w5c02 = w[ 5] + MD4C02; + const u32 H_wdc02 = w[13] + MD4C02; + const u32 H_w3c02 = w[ 3] + MD4C02; + const u32 H_wbc02 = w[11] + MD4C02; + const u32 H_w7c02 = w[ 7] + MD4C02; + const u32 H_wfc02 = w[15] + MD4C02; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * reverse + */ + + u32 a_rev = digests_buf[digests_offset].digest_buf[0]; + u32 b_rev = digests_buf[digests_offset].digest_buf[1]; + u32 c_rev = digests_buf[digests_offset].digest_buf[2]; + u32 d_rev = digests_buf[digests_offset].digest_buf[3]; + + MD4_STEP_REV (MD4_H, b_rev, c_rev, d_rev, a_rev, w[15], MD4C02, MD4S23); + MD4_STEP_REV (MD4_H, c_rev, d_rev, a_rev, b_rev, w[ 7], MD4C02, MD4S22); + MD4_STEP_REV (MD4_H, d_rev, a_rev, b_rev, c_rev, w[11], MD4C02, MD4S21); + MD4_STEP_REV (MD4_H, a_rev, b_rev, c_rev, d_rev, w[ 3], MD4C02, MD4S20); + MD4_STEP_REV (MD4_H, b_rev, c_rev, d_rev, a_rev, w[13], MD4C02, MD4S23); + MD4_STEP_REV (MD4_H, c_rev, d_rev, a_rev, b_rev, w[ 5], MD4C02, MD4S22); + MD4_STEP_REV (MD4_H, d_rev, a_rev, b_rev, c_rev, w[ 9], MD4C02, MD4S21); + MD4_STEP_REV (MD4_H, a_rev, b_rev, c_rev, d_rev, w[ 1], MD4C02, MD4S20); + MD4_STEP_REV (MD4_H, b_rev, c_rev, d_rev, a_rev, w[14], MD4C02, MD4S23); + MD4_STEP_REV (MD4_H, c_rev, d_rev, a_rev, b_rev, w[ 6], MD4C02, MD4S22); + MD4_STEP_REV (MD4_H, d_rev, a_rev, b_rev, c_rev, w[10], MD4C02, MD4S21); + MD4_STEP_REV (MD4_H, a_rev, b_rev, c_rev, d_rev, w[ 2], MD4C02, MD4S20); + MD4_STEP_REV (MD4_H, b_rev, c_rev, d_rev, a_rev, w[12], MD4C02, MD4S23); + MD4_STEP_REV (MD4_H, c_rev, d_rev, a_rev, b_rev, w[ 4], MD4C02, MD4S22); + MD4_STEP_REV (MD4_H, d_rev, a_rev, b_rev, c_rev, w[ 8], MD4C02, MD4S21); + MD4_STEP_REV (MD4_H, a_rev, b_rev, c_rev, d_rev, 0, MD4C02, MD4S20); + + const u32x sav_c = c_rev; + const u32x sav_d = d_rev; + + MD4_STEP_REV1(MD4_G, b_rev, c_rev, d_rev, a_rev, w[15], MD4C01, MD4S13); + MD4_STEP_REV1(MD4_G, c_rev, d_rev, a_rev, b_rev, w[11], MD4C01, MD4S12); + + /** + * loop + */ + + const u32 bf_loops = ceil ((float) bfs_cnt / VECT_DIV); + + u32x w0l = w[0]; + + for (u32 il_pos = 0; il_pos < bf_loops; il_pos++) + { + const u32x w0r = words_buf_r[il_pos]; + + const u32x w0 = w0l | w0r; + + u32x pre_a = a_rev; + u32x pre_b = b_rev; + u32x pre_c = c_rev; + + pre_a = pre_a - w0; + pre_b = pre_b - MD4_G (sav_c, sav_d, pre_a); + pre_c = pre_c - MD4_G (sav_d, pre_a, pre_b); + + u32x a = MD4M_A; + u32x b = MD4M_B; + u32x c = MD4M_C; + u32x d = MD4M_D; + + MD4_STEP (MD4_Fo, a, b, c, d, w0, F_w0c00, MD4S00); + MD4_STEP0(MD4_Fo, d, a, b, c, F_w1c00, MD4S01); + MD4_STEP0(MD4_Fo, c, d, a, b, F_w2c00, MD4S02); + MD4_STEP0(MD4_Fo, b, c, d, a, F_w3c00, MD4S03); + MD4_STEP0(MD4_Fo, a, b, c, d, F_w4c00, MD4S00); + MD4_STEP0(MD4_Fo, d, a, b, c, F_w5c00, MD4S01); + MD4_STEP0(MD4_Fo, c, d, a, b, F_w6c00, MD4S02); + MD4_STEP0(MD4_Fo, b, c, d, a, F_w7c00, MD4S03); + MD4_STEP0(MD4_Fo, a, b, c, d, F_w8c00, MD4S00); + MD4_STEP0(MD4_Fo, d, a, b, c, F_w9c00, MD4S01); + MD4_STEP0(MD4_Fo, c, d, a, b, F_wac00, MD4S02); + MD4_STEP0(MD4_Fo, b, c, d, a, F_wbc00, MD4S03); + MD4_STEP0(MD4_Fo, a, b, c, d, F_wcc00, MD4S00); + MD4_STEP0(MD4_Fo, d, a, b, c, F_wdc00, MD4S01); + MD4_STEP0(MD4_Fo, c, d, a, b, F_wec00, MD4S02); + MD4_STEP0(MD4_Fo, b, c, d, a, F_wfc00, MD4S03); + + MD4_STEP (MD4_Go, a, b, c, d, w0, G_w0c01, MD4S10); + MD4_STEP0(MD4_Go, d, a, b, c, G_w4c01, MD4S11); + MD4_STEP0(MD4_Go, c, d, a, b, G_w8c01, MD4S12); + MD4_STEP0(MD4_Go, b, c, d, a, G_wcc01, MD4S13); + MD4_STEP0(MD4_Go, a, b, c, d, G_w1c01, MD4S10); + MD4_STEP0(MD4_Go, d, a, b, c, G_w5c01, MD4S11); + MD4_STEP0(MD4_Go, c, d, a, b, G_w9c01, MD4S12); + MD4_STEP0(MD4_Go, b, c, d, a, G_wdc01, MD4S13); + MD4_STEP0(MD4_Go, a, b, c, d, G_w2c01, MD4S10); + MD4_STEP0(MD4_Go, d, a, b, c, G_w6c01, MD4S11); + MD4_STEP0(MD4_Go, c, d, a, b, G_wac01, MD4S12); + + bool q_cond = allx (pre_c != c); + + if (q_cond) continue; + + MD4_STEP0(MD4_Go, b, c, d, a, G_wec01, MD4S13); + MD4_STEP0(MD4_Go, a, b, c, d, G_w3c01, MD4S10); + + bool q_cond2 = allx (pre_a != a); + + if (q_cond2) continue; + + MD4_STEP0(MD4_Go, d, a, b, c, G_w7c01, MD4S11); + MD4_STEP0(MD4_Go, c, d, a, b, G_wbc01, MD4S12); + MD4_STEP0(MD4_Go, b, c, d, a, G_wfc01, MD4S13); + + MD4_STEP (MD4_H , a, b, c, d, w0, H_w0c02, MD4S20); + MD4_STEP0(MD4_H , d, a, b, c, H_w8c02, MD4S21); + MD4_STEP0(MD4_H , c, d, a, b, H_w4c02, MD4S22); + MD4_STEP0(MD4_H , b, c, d, a, H_wcc02, MD4S23); + MD4_STEP0(MD4_H , a, b, c, d, H_w2c02, MD4S20); + MD4_STEP0(MD4_H , d, a, b, c, H_wac02, MD4S21); + MD4_STEP0(MD4_H , c, d, a, b, H_w6c02, MD4S22); + MD4_STEP0(MD4_H , b, c, d, a, H_wec02, MD4S23); + MD4_STEP0(MD4_H , a, b, c, d, H_w1c02, MD4S20); + MD4_STEP0(MD4_H , d, a, b, c, H_w9c02, MD4S21); + MD4_STEP0(MD4_H , c, d, a, b, H_w5c02, MD4S22); + MD4_STEP0(MD4_H , b, c, d, a, H_wdc02, MD4S23); + MD4_STEP0(MD4_H , a, b, c, d, H_w3c02, MD4S20); + MD4_STEP0(MD4_H , d, a, b, c, H_wbc02, MD4S21); + MD4_STEP0(MD4_H , c, d, a, b, H_w7c02, MD4S22); + MD4_STEP0(MD4_H , b, c, d, a, H_wfc02, MD4S23); + + const u32x r0 = a; + const u32x r1 = d; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_S + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m00900_m04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global u32x * words_buf_r, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32 w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = 0; + w[ 5] = 0; + w[ 6] = 0; + w[ 7] = 0; + w[ 8] = 0; + w[ 9] = 0; + w[10] = 0; + w[11] = 0; + w[12] = 0; + w[13] = 0; + w[14] = pws[gid].i[14]; + w[15] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m00900m (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m00900_m08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global u32x * words_buf_r, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32 w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = pws[gid].i[ 4]; + w[ 5] = pws[gid].i[ 5]; + w[ 6] = pws[gid].i[ 6]; + w[ 7] = pws[gid].i[ 7]; + w[ 8] = 0; + w[ 9] = 0; + w[10] = 0; + w[11] = 0; + w[12] = 0; + w[13] = 0; + w[14] = pws[gid].i[14]; + w[15] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m00900m (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m00900_m16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global u32x * words_buf_r, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32 w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = pws[gid].i[ 4]; + w[ 5] = pws[gid].i[ 5]; + w[ 6] = pws[gid].i[ 6]; + w[ 7] = pws[gid].i[ 7]; + w[ 8] = pws[gid].i[ 8]; + w[ 9] = pws[gid].i[ 9]; + w[10] = pws[gid].i[10]; + w[11] = pws[gid].i[11]; + w[12] = pws[gid].i[12]; + w[13] = pws[gid].i[13]; + w[14] = pws[gid].i[14]; + w[15] = pws[gid].i[15]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m00900m (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m00900_s04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global u32x * words_buf_r, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32 w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = 0; + w[ 5] = 0; + w[ 6] = 0; + w[ 7] = 0; + w[ 8] = 0; + w[ 9] = 0; + w[10] = 0; + w[11] = 0; + w[12] = 0; + w[13] = 0; + w[14] = pws[gid].i[14]; + w[15] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m00900s (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m00900_s08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global u32x * words_buf_r, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32 w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = pws[gid].i[ 4]; + w[ 5] = pws[gid].i[ 5]; + w[ 6] = pws[gid].i[ 6]; + w[ 7] = pws[gid].i[ 7]; + w[ 8] = 0; + w[ 9] = 0; + w[10] = 0; + w[11] = 0; + w[12] = 0; + w[13] = 0; + w[14] = pws[gid].i[14]; + w[15] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m00900s (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m00900_s16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global u32x * words_buf_r, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32 w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = pws[gid].i[ 4]; + w[ 5] = pws[gid].i[ 5]; + w[ 6] = pws[gid].i[ 6]; + w[ 7] = pws[gid].i[ 7]; + w[ 8] = pws[gid].i[ 8]; + w[ 9] = pws[gid].i[ 9]; + w[10] = pws[gid].i[10]; + w[11] = pws[gid].i[11]; + w[12] = pws[gid].i[12]; + w[13] = pws[gid].i[13]; + w[14] = pws[gid].i[14]; + w[15] = pws[gid].i[15]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m00900s (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} diff --git a/amd/m01000_a0.cl b/amd/m01000_a0.cl new file mode 100644 index 0000000000..4d412ffd54 --- /dev/null +++ b/amd/m01000_a0.cl @@ -0,0 +1,369 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _MD4_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW4 +#define VECT_SIZE4 +#endif + +#ifdef VLIW5 +#define VECT_SIZE4 +#endif + +#define DGST_R0 0 +#define DGST_R1 3 +#define DGST_R2 2 +#define DGST_R3 1 + +#include "include/kernel_functions.c" +#include "types_amd.c" +#include "common_amd.c" +#include "include/rp_gpu.h" +#include "rp_amd.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m01000_m04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + u32x pw_buf1[4]; + + pw_buf1[0] = pws[gid].i[ 4]; + pw_buf1[1] = pws[gid].i[ 5]; + pw_buf1[2] = pws[gid].i[ 6]; + pw_buf1[3] = pws[gid].i[ 7]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + + w0[0] = pw_buf0[0]; + w0[1] = pw_buf0[1]; + w0[2] = pw_buf0[2]; + w0[3] = pw_buf0[3]; + + u32x w1[4]; + + w1[0] = pw_buf1[0]; + w1[1] = pw_buf1[1]; + w1[2] = pw_buf1[2]; + w1[3] = pw_buf1[3]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 out_len = apply_rules (rules_buf[il_pos].cmds, w0, w1, pw_len); + + append_0x80_2 (w0, w1, out_len); + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + make_unicode (w0, w0_t, w1_t); + make_unicode (w1, w2_t, w3_t); + + w3_t[2] = out_len * 8 * 2; + + u32x tmp2; + + u32x a = MD4M_A; + u32x b = MD4M_B; + u32x c = MD4M_C; + u32x d = MD4M_D; + + MD4_STEP (MD4_Fo, a, b, c, d, w0_t[0], MD4C00, MD4S00); + MD4_STEP (MD4_Fo, d, a, b, c, w0_t[1], MD4C00, MD4S01); + MD4_STEP (MD4_Fo, c, d, a, b, w0_t[2], MD4C00, MD4S02); + MD4_STEP (MD4_Fo, b, c, d, a, w0_t[3], MD4C00, MD4S03); + MD4_STEP (MD4_Fo, a, b, c, d, w1_t[0], MD4C00, MD4S00); + MD4_STEP (MD4_Fo, d, a, b, c, w1_t[1], MD4C00, MD4S01); + MD4_STEP (MD4_Fo, c, d, a, b, w1_t[2], MD4C00, MD4S02); + MD4_STEP (MD4_Fo, b, c, d, a, w1_t[3], MD4C00, MD4S03); + MD4_STEP (MD4_Fo, a, b, c, d, w2_t[0], MD4C00, MD4S00); + MD4_STEP (MD4_Fo, d, a, b, c, w2_t[1], MD4C00, MD4S01); + MD4_STEP (MD4_Fo, c, d, a, b, w2_t[2], MD4C00, MD4S02); + MD4_STEP (MD4_Fo, b, c, d, a, w2_t[3], MD4C00, MD4S03); + MD4_STEP (MD4_Fo, a, b, c, d, w3_t[0], MD4C00, MD4S00); + MD4_STEP (MD4_Fo, d, a, b, c, w3_t[1], MD4C00, MD4S01); + MD4_STEP (MD4_Fo, c, d, a, b, w3_t[2], MD4C00, MD4S02); + MD4_STEP (MD4_Fo, b, c, d, a, w3_t[3], MD4C00, MD4S03); + + MD4_STEP (MD4_Go, a, b, c, d, w0_t[0], MD4C01, MD4S10); + MD4_STEP (MD4_Go, d, a, b, c, w1_t[0], MD4C01, MD4S11); + MD4_STEP (MD4_Go, c, d, a, b, w2_t[0], MD4C01, MD4S12); + MD4_STEP (MD4_Go, b, c, d, a, w3_t[0], MD4C01, MD4S13); + MD4_STEP (MD4_Go, a, b, c, d, w0_t[1], MD4C01, MD4S10); + MD4_STEP (MD4_Go, d, a, b, c, w1_t[1], MD4C01, MD4S11); + MD4_STEP (MD4_Go, c, d, a, b, w2_t[1], MD4C01, MD4S12); + MD4_STEP (MD4_Go, b, c, d, a, w3_t[1], MD4C01, MD4S13); + MD4_STEP (MD4_Go, a, b, c, d, w0_t[2], MD4C01, MD4S10); + MD4_STEP (MD4_Go, d, a, b, c, w1_t[2], MD4C01, MD4S11); + MD4_STEP (MD4_Go, c, d, a, b, w2_t[2], MD4C01, MD4S12); + MD4_STEP (MD4_Go, b, c, d, a, w3_t[2], MD4C01, MD4S13); + MD4_STEP (MD4_Go, a, b, c, d, w0_t[3], MD4C01, MD4S10); + MD4_STEP (MD4_Go, d, a, b, c, w1_t[3], MD4C01, MD4S11); + MD4_STEP (MD4_Go, c, d, a, b, w2_t[3], MD4C01, MD4S12); + MD4_STEP (MD4_Go, b, c, d, a, w3_t[3], MD4C01, MD4S13); + + MD4_STEP (MD4_H1, a, b, c, d, w0_t[0], MD4C02, MD4S20); + MD4_STEP (MD4_H2, d, a, b, c, w2_t[0], MD4C02, MD4S21); + MD4_STEP (MD4_H1, c, d, a, b, w1_t[0], MD4C02, MD4S22); + MD4_STEP (MD4_H2, b, c, d, a, w3_t[0], MD4C02, MD4S23); + MD4_STEP (MD4_H1, a, b, c, d, w0_t[2], MD4C02, MD4S20); + MD4_STEP (MD4_H2, d, a, b, c, w2_t[2], MD4C02, MD4S21); + MD4_STEP (MD4_H1, c, d, a, b, w1_t[2], MD4C02, MD4S22); + MD4_STEP (MD4_H2, b, c, d, a, w3_t[2], MD4C02, MD4S23); + MD4_STEP (MD4_H1, a, b, c, d, w0_t[1], MD4C02, MD4S20); + MD4_STEP (MD4_H2, d, a, b, c, w2_t[1], MD4C02, MD4S21); + MD4_STEP (MD4_H1, c, d, a, b, w1_t[1], MD4C02, MD4S22); + MD4_STEP (MD4_H2, b, c, d, a, w3_t[1], MD4C02, MD4S23); + MD4_STEP (MD4_H1, a, b, c, d, w0_t[3], MD4C02, MD4S20); + MD4_STEP (MD4_H2, d, a, b, c, w2_t[3], MD4C02, MD4S21); + MD4_STEP (MD4_H1, c, d, a, b, w1_t[3], MD4C02, MD4S22); + MD4_STEP (MD4_H2, b, c, d, a, w3_t[3], MD4C02, MD4S23); + + const u32x r0 = a; + const u32x r1 = d; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_M + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m01000_m08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m01000_m16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m01000_s04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + u32x pw_buf1[4]; + + pw_buf1[0] = pws[gid].i[ 4]; + pw_buf1[1] = pws[gid].i[ 5]; + pw_buf1[2] = pws[gid].i[ 6]; + pw_buf1[3] = pws[gid].i[ 7]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + + w0[0] = pw_buf0[0]; + w0[1] = pw_buf0[1]; + w0[2] = pw_buf0[2]; + w0[3] = pw_buf0[3]; + + u32x w1[4]; + + w1[0] = pw_buf1[0]; + w1[1] = pw_buf1[1]; + w1[2] = pw_buf1[2]; + w1[3] = pw_buf1[3]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 out_len = apply_rules (rules_buf[il_pos].cmds, w0, w1, pw_len); + + append_0x80_2 (w0, w1, out_len); + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + make_unicode (w0, w0_t, w1_t); + make_unicode (w1, w2_t, w3_t); + + w3_t[2] = out_len * 8 * 2; + + u32x tmp2; + + u32x a = MD4M_A; + u32x b = MD4M_B; + u32x c = MD4M_C; + u32x d = MD4M_D; + + MD4_STEP (MD4_Fo, a, b, c, d, w0_t[0], MD4C00, MD4S00); + MD4_STEP (MD4_Fo, d, a, b, c, w0_t[1], MD4C00, MD4S01); + MD4_STEP (MD4_Fo, c, d, a, b, w0_t[2], MD4C00, MD4S02); + MD4_STEP (MD4_Fo, b, c, d, a, w0_t[3], MD4C00, MD4S03); + MD4_STEP (MD4_Fo, a, b, c, d, w1_t[0], MD4C00, MD4S00); + MD4_STEP (MD4_Fo, d, a, b, c, w1_t[1], MD4C00, MD4S01); + MD4_STEP (MD4_Fo, c, d, a, b, w1_t[2], MD4C00, MD4S02); + MD4_STEP (MD4_Fo, b, c, d, a, w1_t[3], MD4C00, MD4S03); + MD4_STEP (MD4_Fo, a, b, c, d, w2_t[0], MD4C00, MD4S00); + MD4_STEP (MD4_Fo, d, a, b, c, w2_t[1], MD4C00, MD4S01); + MD4_STEP (MD4_Fo, c, d, a, b, w2_t[2], MD4C00, MD4S02); + MD4_STEP (MD4_Fo, b, c, d, a, w2_t[3], MD4C00, MD4S03); + MD4_STEP (MD4_Fo, a, b, c, d, w3_t[0], MD4C00, MD4S00); + MD4_STEP (MD4_Fo, d, a, b, c, w3_t[1], MD4C00, MD4S01); + MD4_STEP (MD4_Fo, c, d, a, b, w3_t[2], MD4C00, MD4S02); + MD4_STEP (MD4_Fo, b, c, d, a, w3_t[3], MD4C00, MD4S03); + + MD4_STEP (MD4_Go, a, b, c, d, w0_t[0], MD4C01, MD4S10); + MD4_STEP (MD4_Go, d, a, b, c, w1_t[0], MD4C01, MD4S11); + MD4_STEP (MD4_Go, c, d, a, b, w2_t[0], MD4C01, MD4S12); + MD4_STEP (MD4_Go, b, c, d, a, w3_t[0], MD4C01, MD4S13); + MD4_STEP (MD4_Go, a, b, c, d, w0_t[1], MD4C01, MD4S10); + MD4_STEP (MD4_Go, d, a, b, c, w1_t[1], MD4C01, MD4S11); + MD4_STEP (MD4_Go, c, d, a, b, w2_t[1], MD4C01, MD4S12); + MD4_STEP (MD4_Go, b, c, d, a, w3_t[1], MD4C01, MD4S13); + MD4_STEP (MD4_Go, a, b, c, d, w0_t[2], MD4C01, MD4S10); + MD4_STEP (MD4_Go, d, a, b, c, w1_t[2], MD4C01, MD4S11); + MD4_STEP (MD4_Go, c, d, a, b, w2_t[2], MD4C01, MD4S12); + MD4_STEP (MD4_Go, b, c, d, a, w3_t[2], MD4C01, MD4S13); + MD4_STEP (MD4_Go, a, b, c, d, w0_t[3], MD4C01, MD4S10); + MD4_STEP (MD4_Go, d, a, b, c, w1_t[3], MD4C01, MD4S11); + MD4_STEP (MD4_Go, c, d, a, b, w2_t[3], MD4C01, MD4S12); + MD4_STEP (MD4_Go, b, c, d, a, w3_t[3], MD4C01, MD4S13); + + MD4_STEP (MD4_H1, a, b, c, d, w0_t[0], MD4C02, MD4S20); + MD4_STEP (MD4_H2, d, a, b, c, w2_t[0], MD4C02, MD4S21); + MD4_STEP (MD4_H1, c, d, a, b, w1_t[0], MD4C02, MD4S22); + MD4_STEP (MD4_H2, b, c, d, a, w3_t[0], MD4C02, MD4S23); + MD4_STEP (MD4_H1, a, b, c, d, w0_t[2], MD4C02, MD4S20); + MD4_STEP (MD4_H2, d, a, b, c, w2_t[2], MD4C02, MD4S21); + MD4_STEP (MD4_H1, c, d, a, b, w1_t[2], MD4C02, MD4S22); + MD4_STEP (MD4_H2, b, c, d, a, w3_t[2], MD4C02, MD4S23); + MD4_STEP (MD4_H1, a, b, c, d, w0_t[1], MD4C02, MD4S20); + MD4_STEP (MD4_H2, d, a, b, c, w2_t[1], MD4C02, MD4S21); + MD4_STEP (MD4_H1, c, d, a, b, w1_t[1], MD4C02, MD4S22); + MD4_STEP (MD4_H2, b, c, d, a, w3_t[1], MD4C02, MD4S23); + MD4_STEP (MD4_H1, a, b, c, d, w0_t[3], MD4C02, MD4S20); + MD4_STEP (MD4_H2, d, a, b, c, w2_t[3], MD4C02, MD4S21); + MD4_STEP (MD4_H1, c, d, a, b, w1_t[3], MD4C02, MD4S22); + MD4_STEP (MD4_H2, b, c, d, a, w3_t[3], MD4C02, MD4S23); + + const u32x r0 = a; + const u32x r1 = d; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_S + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m01000_s08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m01000_s16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/amd/m01000_a1.cl b/amd/m01000_a1.cl new file mode 100644 index 0000000000..3e6168aebd --- /dev/null +++ b/amd/m01000_a1.cl @@ -0,0 +1,475 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _MD4_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW4 +#define VECT_SIZE4 +#endif + +#ifdef VLIW5 +#define VECT_SIZE4 +#endif + +#define DGST_R0 0 +#define DGST_R1 3 +#define DGST_R2 2 +#define DGST_R3 1 + +#include "include/kernel_functions.c" +#include "types_amd.c" +#include "common_amd.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m01000_m04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + append_0x80_2 (wordl0, wordl1, pw_l_len); + + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, combs_buf[0].pw_len); + } + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = combs_buf[il_pos].pw_len; + + const u32 pw_len = pw_l_len + pw_r_len; + + u32 wordr0[4]; + + wordr0[0] = combs_buf[il_pos].i[0]; + wordr0[1] = combs_buf[il_pos].i[1]; + wordr0[2] = combs_buf[il_pos].i[2]; + wordr0[3] = combs_buf[il_pos].i[3]; + + u32 wordr1[4]; + + wordr1[0] = combs_buf[il_pos].i[4]; + wordr1[1] = combs_buf[il_pos].i[5]; + wordr1[2] = combs_buf[il_pos].i[6]; + wordr1[3] = combs_buf[il_pos].i[7]; + + u32 wordr2[4]; + + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + + u32 wordr3[4]; + + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + u32x w0[4]; + + w0[0] = wordl0[0] | wordr0[0]; + w0[1] = wordl0[1] | wordr0[1]; + w0[2] = wordl0[2] | wordr0[2]; + w0[3] = wordl0[3] | wordr0[3]; + + u32x w1[4]; + + w1[0] = wordl1[0] | wordr1[0]; + w1[1] = wordl1[1] | wordr1[1]; + w1[2] = wordl1[2] | wordr1[2]; + w1[3] = wordl1[3] | wordr1[3]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + make_unicode (w0, w0_t, w1_t); + make_unicode (w1, w2_t, w3_t); + + w3_t[2] = pw_len * 8 * 2; + + u32x tmp2; + + u32x a = MD4M_A; + u32x b = MD4M_B; + u32x c = MD4M_C; + u32x d = MD4M_D; + + MD4_STEP (MD4_Fo, a, b, c, d, w0_t[0], MD4C00, MD4S00); + MD4_STEP (MD4_Fo, d, a, b, c, w0_t[1], MD4C00, MD4S01); + MD4_STEP (MD4_Fo, c, d, a, b, w0_t[2], MD4C00, MD4S02); + MD4_STEP (MD4_Fo, b, c, d, a, w0_t[3], MD4C00, MD4S03); + MD4_STEP (MD4_Fo, a, b, c, d, w1_t[0], MD4C00, MD4S00); + MD4_STEP (MD4_Fo, d, a, b, c, w1_t[1], MD4C00, MD4S01); + MD4_STEP (MD4_Fo, c, d, a, b, w1_t[2], MD4C00, MD4S02); + MD4_STEP (MD4_Fo, b, c, d, a, w1_t[3], MD4C00, MD4S03); + MD4_STEP (MD4_Fo, a, b, c, d, w2_t[0], MD4C00, MD4S00); + MD4_STEP (MD4_Fo, d, a, b, c, w2_t[1], MD4C00, MD4S01); + MD4_STEP (MD4_Fo, c, d, a, b, w2_t[2], MD4C00, MD4S02); + MD4_STEP (MD4_Fo, b, c, d, a, w2_t[3], MD4C00, MD4S03); + MD4_STEP (MD4_Fo, a, b, c, d, w3_t[0], MD4C00, MD4S00); + MD4_STEP (MD4_Fo, d, a, b, c, w3_t[1], MD4C00, MD4S01); + MD4_STEP (MD4_Fo, c, d, a, b, w3_t[2], MD4C00, MD4S02); + MD4_STEP (MD4_Fo, b, c, d, a, w3_t[3], MD4C00, MD4S03); + + MD4_STEP (MD4_Go, a, b, c, d, w0_t[0], MD4C01, MD4S10); + MD4_STEP (MD4_Go, d, a, b, c, w1_t[0], MD4C01, MD4S11); + MD4_STEP (MD4_Go, c, d, a, b, w2_t[0], MD4C01, MD4S12); + MD4_STEP (MD4_Go, b, c, d, a, w3_t[0], MD4C01, MD4S13); + MD4_STEP (MD4_Go, a, b, c, d, w0_t[1], MD4C01, MD4S10); + MD4_STEP (MD4_Go, d, a, b, c, w1_t[1], MD4C01, MD4S11); + MD4_STEP (MD4_Go, c, d, a, b, w2_t[1], MD4C01, MD4S12); + MD4_STEP (MD4_Go, b, c, d, a, w3_t[1], MD4C01, MD4S13); + MD4_STEP (MD4_Go, a, b, c, d, w0_t[2], MD4C01, MD4S10); + MD4_STEP (MD4_Go, d, a, b, c, w1_t[2], MD4C01, MD4S11); + MD4_STEP (MD4_Go, c, d, a, b, w2_t[2], MD4C01, MD4S12); + MD4_STEP (MD4_Go, b, c, d, a, w3_t[2], MD4C01, MD4S13); + MD4_STEP (MD4_Go, a, b, c, d, w0_t[3], MD4C01, MD4S10); + MD4_STEP (MD4_Go, d, a, b, c, w1_t[3], MD4C01, MD4S11); + MD4_STEP (MD4_Go, c, d, a, b, w2_t[3], MD4C01, MD4S12); + MD4_STEP (MD4_Go, b, c, d, a, w3_t[3], MD4C01, MD4S13); + + MD4_STEP (MD4_H1, a, b, c, d, w0_t[0], MD4C02, MD4S20); + MD4_STEP (MD4_H2, d, a, b, c, w2_t[0], MD4C02, MD4S21); + MD4_STEP (MD4_H1, c, d, a, b, w1_t[0], MD4C02, MD4S22); + MD4_STEP (MD4_H2, b, c, d, a, w3_t[0], MD4C02, MD4S23); + MD4_STEP (MD4_H1, a, b, c, d, w0_t[2], MD4C02, MD4S20); + MD4_STEP (MD4_H2, d, a, b, c, w2_t[2], MD4C02, MD4S21); + MD4_STEP (MD4_H1, c, d, a, b, w1_t[2], MD4C02, MD4S22); + MD4_STEP (MD4_H2, b, c, d, a, w3_t[2], MD4C02, MD4S23); + MD4_STEP (MD4_H1, a, b, c, d, w0_t[1], MD4C02, MD4S20); + MD4_STEP (MD4_H2, d, a, b, c, w2_t[1], MD4C02, MD4S21); + MD4_STEP (MD4_H1, c, d, a, b, w1_t[1], MD4C02, MD4S22); + MD4_STEP (MD4_H2, b, c, d, a, w3_t[1], MD4C02, MD4S23); + MD4_STEP (MD4_H1, a, b, c, d, w0_t[3], MD4C02, MD4S20); + MD4_STEP (MD4_H2, d, a, b, c, w2_t[3], MD4C02, MD4S21); + MD4_STEP (MD4_H1, c, d, a, b, w1_t[3], MD4C02, MD4S22); + MD4_STEP (MD4_H2, b, c, d, a, w3_t[3], MD4C02, MD4S23); + + const u32x r0 = a; + const u32x r1 = d; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_M + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m01000_m08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m01000_m16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m01000_s04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + append_0x80_2 (wordl0, wordl1, pw_l_len); + + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, combs_buf[0].pw_len); + } + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = combs_buf[il_pos].pw_len; + + const u32 pw_len = pw_l_len + pw_r_len; + + u32 wordr0[4]; + + wordr0[0] = combs_buf[il_pos].i[0]; + wordr0[1] = combs_buf[il_pos].i[1]; + wordr0[2] = combs_buf[il_pos].i[2]; + wordr0[3] = combs_buf[il_pos].i[3]; + + u32 wordr1[4]; + + wordr1[0] = combs_buf[il_pos].i[4]; + wordr1[1] = combs_buf[il_pos].i[5]; + wordr1[2] = combs_buf[il_pos].i[6]; + wordr1[3] = combs_buf[il_pos].i[7]; + + u32 wordr2[4]; + + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + + u32 wordr3[4]; + + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + u32x w0[4]; + + w0[0] = wordl0[0] | wordr0[0]; + w0[1] = wordl0[1] | wordr0[1]; + w0[2] = wordl0[2] | wordr0[2]; + w0[3] = wordl0[3] | wordr0[3]; + + u32x w1[4]; + + w1[0] = wordl1[0] | wordr1[0]; + w1[1] = wordl1[1] | wordr1[1]; + w1[2] = wordl1[2] | wordr1[2]; + w1[3] = wordl1[3] | wordr1[3]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + make_unicode (w0, w0_t, w1_t); + make_unicode (w1, w2_t, w3_t); + + w3_t[2] = pw_len * 8 * 2; + + u32x tmp2; + + u32x a = MD4M_A; + u32x b = MD4M_B; + u32x c = MD4M_C; + u32x d = MD4M_D; + + MD4_STEP (MD4_Fo, a, b, c, d, w0_t[0], MD4C00, MD4S00); + MD4_STEP (MD4_Fo, d, a, b, c, w0_t[1], MD4C00, MD4S01); + MD4_STEP (MD4_Fo, c, d, a, b, w0_t[2], MD4C00, MD4S02); + MD4_STEP (MD4_Fo, b, c, d, a, w0_t[3], MD4C00, MD4S03); + MD4_STEP (MD4_Fo, a, b, c, d, w1_t[0], MD4C00, MD4S00); + MD4_STEP (MD4_Fo, d, a, b, c, w1_t[1], MD4C00, MD4S01); + MD4_STEP (MD4_Fo, c, d, a, b, w1_t[2], MD4C00, MD4S02); + MD4_STEP (MD4_Fo, b, c, d, a, w1_t[3], MD4C00, MD4S03); + MD4_STEP (MD4_Fo, a, b, c, d, w2_t[0], MD4C00, MD4S00); + MD4_STEP (MD4_Fo, d, a, b, c, w2_t[1], MD4C00, MD4S01); + MD4_STEP (MD4_Fo, c, d, a, b, w2_t[2], MD4C00, MD4S02); + MD4_STEP (MD4_Fo, b, c, d, a, w2_t[3], MD4C00, MD4S03); + MD4_STEP (MD4_Fo, a, b, c, d, w3_t[0], MD4C00, MD4S00); + MD4_STEP (MD4_Fo, d, a, b, c, w3_t[1], MD4C00, MD4S01); + MD4_STEP (MD4_Fo, c, d, a, b, w3_t[2], MD4C00, MD4S02); + MD4_STEP (MD4_Fo, b, c, d, a, w3_t[3], MD4C00, MD4S03); + + MD4_STEP (MD4_Go, a, b, c, d, w0_t[0], MD4C01, MD4S10); + MD4_STEP (MD4_Go, d, a, b, c, w1_t[0], MD4C01, MD4S11); + MD4_STEP (MD4_Go, c, d, a, b, w2_t[0], MD4C01, MD4S12); + MD4_STEP (MD4_Go, b, c, d, a, w3_t[0], MD4C01, MD4S13); + MD4_STEP (MD4_Go, a, b, c, d, w0_t[1], MD4C01, MD4S10); + MD4_STEP (MD4_Go, d, a, b, c, w1_t[1], MD4C01, MD4S11); + MD4_STEP (MD4_Go, c, d, a, b, w2_t[1], MD4C01, MD4S12); + MD4_STEP (MD4_Go, b, c, d, a, w3_t[1], MD4C01, MD4S13); + MD4_STEP (MD4_Go, a, b, c, d, w0_t[2], MD4C01, MD4S10); + MD4_STEP (MD4_Go, d, a, b, c, w1_t[2], MD4C01, MD4S11); + MD4_STEP (MD4_Go, c, d, a, b, w2_t[2], MD4C01, MD4S12); + MD4_STEP (MD4_Go, b, c, d, a, w3_t[2], MD4C01, MD4S13); + MD4_STEP (MD4_Go, a, b, c, d, w0_t[3], MD4C01, MD4S10); + MD4_STEP (MD4_Go, d, a, b, c, w1_t[3], MD4C01, MD4S11); + MD4_STEP (MD4_Go, c, d, a, b, w2_t[3], MD4C01, MD4S12); + MD4_STEP (MD4_Go, b, c, d, a, w3_t[3], MD4C01, MD4S13); + + MD4_STEP (MD4_H1, a, b, c, d, w0_t[0], MD4C02, MD4S20); + MD4_STEP (MD4_H2, d, a, b, c, w2_t[0], MD4C02, MD4S21); + MD4_STEP (MD4_H1, c, d, a, b, w1_t[0], MD4C02, MD4S22); + MD4_STEP (MD4_H2, b, c, d, a, w3_t[0], MD4C02, MD4S23); + MD4_STEP (MD4_H1, a, b, c, d, w0_t[2], MD4C02, MD4S20); + MD4_STEP (MD4_H2, d, a, b, c, w2_t[2], MD4C02, MD4S21); + MD4_STEP (MD4_H1, c, d, a, b, w1_t[2], MD4C02, MD4S22); + MD4_STEP (MD4_H2, b, c, d, a, w3_t[2], MD4C02, MD4S23); + MD4_STEP (MD4_H1, a, b, c, d, w0_t[1], MD4C02, MD4S20); + MD4_STEP (MD4_H2, d, a, b, c, w2_t[1], MD4C02, MD4S21); + MD4_STEP (MD4_H1, c, d, a, b, w1_t[1], MD4C02, MD4S22); + MD4_STEP (MD4_H2, b, c, d, a, w3_t[1], MD4C02, MD4S23); + MD4_STEP (MD4_H1, a, b, c, d, w0_t[3], MD4C02, MD4S20); + MD4_STEP (MD4_H2, d, a, b, c, w2_t[3], MD4C02, MD4S21); + MD4_STEP (MD4_H1, c, d, a, b, w1_t[3], MD4C02, MD4S22); + MD4_STEP (MD4_H2, b, c, d, a, w3_t[3], MD4C02, MD4S23); + + const u32x r0 = a; + const u32x r1 = d; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_S + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m01000_s08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m01000_s16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/amd/m01000_a3.cl b/amd/m01000_a3.cl new file mode 100644 index 0000000000..cf5ea40e0f --- /dev/null +++ b/amd/m01000_a3.cl @@ -0,0 +1,641 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _MD4_ +#define _SCALAR_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW4 +#define VECT_SIZE4 +#endif + +#ifdef VLIW5 +#define VECT_SIZE4 +#endif + +#define DGST_R0 0 +#define DGST_R1 3 +#define DGST_R2 2 +#define DGST_R3 1 + +#include "include/kernel_functions.c" +#include "types_amd.c" +#include "common_amd.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4_warp.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4_warp.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4_warp.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4_warp.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4_warp.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4_warp.c" +#endif + +#define MD4_STEP_REV(f,a,b,c,d,x,t,s) \ +{ \ + a = rotr32 (a, s); \ + a -= f (b, c, d); \ + a -= x; \ + a -= t; \ +} + +#define MD4_STEP_REV1(f,a,b,c,d,x,t,s) \ +{ \ + a = rotr32 (a, s); \ + a -= x; \ + a -= t; \ +} + +static void m01000m (u32 w[16], const u32 pw_len, __global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global u32x * words_buf_r, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset) +{ + /** + * modifier + */ + + const u32 gid = get_global_id (0); + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 F_w0c00 = 0 + MD4C00; + const u32 F_w1c00 = w[ 1] + MD4C00; + const u32 F_w2c00 = w[ 2] + MD4C00; + const u32 F_w3c00 = w[ 3] + MD4C00; + const u32 F_w4c00 = w[ 4] + MD4C00; + const u32 F_w5c00 = w[ 5] + MD4C00; + const u32 F_w6c00 = w[ 6] + MD4C00; + const u32 F_w7c00 = w[ 7] + MD4C00; + const u32 F_w8c00 = w[ 8] + MD4C00; + const u32 F_w9c00 = w[ 9] + MD4C00; + const u32 F_wac00 = w[10] + MD4C00; + const u32 F_wbc00 = w[11] + MD4C00; + const u32 F_wcc00 = w[12] + MD4C00; + const u32 F_wdc00 = w[13] + MD4C00; + const u32 F_wec00 = w[14] + MD4C00; + const u32 F_wfc00 = w[15] + MD4C00; + + const u32 G_w0c01 = 0 + MD4C01; + const u32 G_w4c01 = w[ 4] + MD4C01; + const u32 G_w8c01 = w[ 8] + MD4C01; + const u32 G_wcc01 = w[12] + MD4C01; + const u32 G_w1c01 = w[ 1] + MD4C01; + const u32 G_w5c01 = w[ 5] + MD4C01; + const u32 G_w9c01 = w[ 9] + MD4C01; + const u32 G_wdc01 = w[13] + MD4C01; + const u32 G_w2c01 = w[ 2] + MD4C01; + const u32 G_w6c01 = w[ 6] + MD4C01; + const u32 G_wac01 = w[10] + MD4C01; + const u32 G_wec01 = w[14] + MD4C01; + const u32 G_w3c01 = w[ 3] + MD4C01; + const u32 G_w7c01 = w[ 7] + MD4C01; + const u32 G_wbc01 = w[11] + MD4C01; + const u32 G_wfc01 = w[15] + MD4C01; + + const u32 H_w0c02 = 0 + MD4C02; + const u32 H_w8c02 = w[ 8] + MD4C02; + const u32 H_w4c02 = w[ 4] + MD4C02; + const u32 H_wcc02 = w[12] + MD4C02; + const u32 H_w2c02 = w[ 2] + MD4C02; + const u32 H_wac02 = w[10] + MD4C02; + const u32 H_w6c02 = w[ 6] + MD4C02; + const u32 H_wec02 = w[14] + MD4C02; + const u32 H_w1c02 = w[ 1] + MD4C02; + const u32 H_w9c02 = w[ 9] + MD4C02; + const u32 H_w5c02 = w[ 5] + MD4C02; + const u32 H_wdc02 = w[13] + MD4C02; + const u32 H_w3c02 = w[ 3] + MD4C02; + const u32 H_wbc02 = w[11] + MD4C02; + const u32 H_w7c02 = w[ 7] + MD4C02; + const u32 H_wfc02 = w[15] + MD4C02; + + /** + * loop + */ + + const u32 bf_loops = ceil ((float) bfs_cnt / VECT_DIV); + + u32x w0l = w[0]; + + for (u32 il_pos = 0; il_pos < bf_loops; il_pos++) + { + const u32x w0r = words_buf_r[il_pos]; + + const u32x w0 = w0l | w0r; + + u32x tmp2; + + u32x a = MD4M_A; + u32x b = MD4M_B; + u32x c = MD4M_C; + u32x d = MD4M_D; + + MD4_STEP (MD4_Fo, a, b, c, d, w0, F_w0c00, MD4S00); + MD4_STEP0(MD4_Fo, d, a, b, c, F_w1c00, MD4S01); + MD4_STEP0(MD4_Fo, c, d, a, b, F_w2c00, MD4S02); + MD4_STEP0(MD4_Fo, b, c, d, a, F_w3c00, MD4S03); + MD4_STEP0(MD4_Fo, a, b, c, d, F_w4c00, MD4S00); + MD4_STEP0(MD4_Fo, d, a, b, c, F_w5c00, MD4S01); + MD4_STEP0(MD4_Fo, c, d, a, b, F_w6c00, MD4S02); + MD4_STEP0(MD4_Fo, b, c, d, a, F_w7c00, MD4S03); + MD4_STEP0(MD4_Fo, a, b, c, d, F_w8c00, MD4S00); + MD4_STEP0(MD4_Fo, d, a, b, c, F_w9c00, MD4S01); + MD4_STEP0(MD4_Fo, c, d, a, b, F_wac00, MD4S02); + MD4_STEP0(MD4_Fo, b, c, d, a, F_wbc00, MD4S03); + MD4_STEP0(MD4_Fo, a, b, c, d, F_wcc00, MD4S00); + MD4_STEP0(MD4_Fo, d, a, b, c, F_wdc00, MD4S01); + MD4_STEP0(MD4_Fo, c, d, a, b, F_wec00, MD4S02); + MD4_STEP0(MD4_Fo, b, c, d, a, F_wfc00, MD4S03); + + MD4_STEP (MD4_Go, a, b, c, d, w0, G_w0c01, MD4S10); + MD4_STEP0(MD4_Go, d, a, b, c, G_w4c01, MD4S11); + MD4_STEP0(MD4_Go, c, d, a, b, G_w8c01, MD4S12); + MD4_STEP0(MD4_Go, b, c, d, a, G_wcc01, MD4S13); + MD4_STEP0(MD4_Go, a, b, c, d, G_w1c01, MD4S10); + MD4_STEP0(MD4_Go, d, a, b, c, G_w5c01, MD4S11); + MD4_STEP0(MD4_Go, c, d, a, b, G_w9c01, MD4S12); + MD4_STEP0(MD4_Go, b, c, d, a, G_wdc01, MD4S13); + MD4_STEP0(MD4_Go, a, b, c, d, G_w2c01, MD4S10); + MD4_STEP0(MD4_Go, d, a, b, c, G_w6c01, MD4S11); + MD4_STEP0(MD4_Go, c, d, a, b, G_wac01, MD4S12); + MD4_STEP0(MD4_Go, b, c, d, a, G_wec01, MD4S13); + MD4_STEP0(MD4_Go, a, b, c, d, G_w3c01, MD4S10); + MD4_STEP0(MD4_Go, d, a, b, c, G_w7c01, MD4S11); + MD4_STEP0(MD4_Go, c, d, a, b, G_wbc01, MD4S12); + MD4_STEP0(MD4_Go, b, c, d, a, G_wfc01, MD4S13); + + MD4_STEP (MD4_H1, a, b, c, d, w0, H_w0c02, MD4S20); + MD4_STEP0(MD4_H2, d, a, b, c, H_w8c02, MD4S21); + MD4_STEP0(MD4_H1, c, d, a, b, H_w4c02, MD4S22); + MD4_STEP0(MD4_H2, b, c, d, a, H_wcc02, MD4S23); + MD4_STEP0(MD4_H1, a, b, c, d, H_w2c02, MD4S20); + MD4_STEP0(MD4_H2, d, a, b, c, H_wac02, MD4S21); + MD4_STEP0(MD4_H1, c, d, a, b, H_w6c02, MD4S22); + MD4_STEP0(MD4_H2, b, c, d, a, H_wec02, MD4S23); + MD4_STEP0(MD4_H1, a, b, c, d, H_w1c02, MD4S20); + MD4_STEP0(MD4_H2, d, a, b, c, H_w9c02, MD4S21); + MD4_STEP0(MD4_H1, c, d, a, b, H_w5c02, MD4S22); + MD4_STEP0(MD4_H2, b, c, d, a, H_wdc02, MD4S23); + MD4_STEP0(MD4_H1, a, b, c, d, H_w3c02, MD4S20); + MD4_STEP0(MD4_H2, d, a, b, c, H_wbc02, MD4S21); + MD4_STEP0(MD4_H1, c, d, a, b, H_w7c02, MD4S22); + MD4_STEP0(MD4_H2, b, c, d, a, H_wfc02, MD4S23); + + const u32x r0 = a; + const u32x r1 = d; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_M + } +} + +static void m01000s (u32 w[16], const u32 pw_len, __global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global u32x * words_buf_r, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset) +{ + /** + * modifier + */ + + const u32 gid = get_global_id (0); + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 F_w0c00 = 0 + MD4C00; + const u32 F_w1c00 = w[ 1] + MD4C00; + const u32 F_w2c00 = w[ 2] + MD4C00; + const u32 F_w3c00 = w[ 3] + MD4C00; + const u32 F_w4c00 = w[ 4] + MD4C00; + const u32 F_w5c00 = w[ 5] + MD4C00; + const u32 F_w6c00 = w[ 6] + MD4C00; + const u32 F_w7c00 = w[ 7] + MD4C00; + const u32 F_w8c00 = w[ 8] + MD4C00; + const u32 F_w9c00 = w[ 9] + MD4C00; + const u32 F_wac00 = w[10] + MD4C00; + const u32 F_wbc00 = w[11] + MD4C00; + const u32 F_wcc00 = w[12] + MD4C00; + const u32 F_wdc00 = w[13] + MD4C00; + const u32 F_wec00 = w[14] + MD4C00; + const u32 F_wfc00 = w[15] + MD4C00; + + const u32 G_w0c01 = 0 + MD4C01; + const u32 G_w4c01 = w[ 4] + MD4C01; + const u32 G_w8c01 = w[ 8] + MD4C01; + const u32 G_wcc01 = w[12] + MD4C01; + const u32 G_w1c01 = w[ 1] + MD4C01; + const u32 G_w5c01 = w[ 5] + MD4C01; + const u32 G_w9c01 = w[ 9] + MD4C01; + const u32 G_wdc01 = w[13] + MD4C01; + const u32 G_w2c01 = w[ 2] + MD4C01; + const u32 G_w6c01 = w[ 6] + MD4C01; + const u32 G_wac01 = w[10] + MD4C01; + const u32 G_wec01 = w[14] + MD4C01; + const u32 G_w3c01 = w[ 3] + MD4C01; + const u32 G_w7c01 = w[ 7] + MD4C01; + const u32 G_wbc01 = w[11] + MD4C01; + const u32 G_wfc01 = w[15] + MD4C01; + + const u32 H_w0c02 = 0 + MD4C02; + const u32 H_w8c02 = w[ 8] + MD4C02; + const u32 H_w4c02 = w[ 4] + MD4C02; + const u32 H_wcc02 = w[12] + MD4C02; + const u32 H_w2c02 = w[ 2] + MD4C02; + const u32 H_wac02 = w[10] + MD4C02; + const u32 H_w6c02 = w[ 6] + MD4C02; + const u32 H_wec02 = w[14] + MD4C02; + const u32 H_w1c02 = w[ 1] + MD4C02; + const u32 H_w9c02 = w[ 9] + MD4C02; + const u32 H_w5c02 = w[ 5] + MD4C02; + const u32 H_wdc02 = w[13] + MD4C02; + const u32 H_w3c02 = w[ 3] + MD4C02; + const u32 H_wbc02 = w[11] + MD4C02; + const u32 H_w7c02 = w[ 7] + MD4C02; + const u32 H_wfc02 = w[15] + MD4C02; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * reverse + */ + + u32 a_rev = digests_buf[digests_offset].digest_buf[0]; + u32 b_rev = digests_buf[digests_offset].digest_buf[1]; + u32 c_rev = digests_buf[digests_offset].digest_buf[2]; + u32 d_rev = digests_buf[digests_offset].digest_buf[3]; + + MD4_STEP_REV (MD4_H, b_rev, c_rev, d_rev, a_rev, w[15], MD4C02, MD4S23); + MD4_STEP_REV (MD4_H, c_rev, d_rev, a_rev, b_rev, w[ 7], MD4C02, MD4S22); + MD4_STEP_REV (MD4_H, d_rev, a_rev, b_rev, c_rev, w[11], MD4C02, MD4S21); + MD4_STEP_REV (MD4_H, a_rev, b_rev, c_rev, d_rev, w[ 3], MD4C02, MD4S20); + MD4_STEP_REV (MD4_H, b_rev, c_rev, d_rev, a_rev, w[13], MD4C02, MD4S23); + MD4_STEP_REV (MD4_H, c_rev, d_rev, a_rev, b_rev, w[ 5], MD4C02, MD4S22); + MD4_STEP_REV (MD4_H, d_rev, a_rev, b_rev, c_rev, w[ 9], MD4C02, MD4S21); + MD4_STEP_REV (MD4_H, a_rev, b_rev, c_rev, d_rev, w[ 1], MD4C02, MD4S20); + MD4_STEP_REV (MD4_H, b_rev, c_rev, d_rev, a_rev, w[14], MD4C02, MD4S23); + MD4_STEP_REV (MD4_H, c_rev, d_rev, a_rev, b_rev, w[ 6], MD4C02, MD4S22); + MD4_STEP_REV (MD4_H, d_rev, a_rev, b_rev, c_rev, w[10], MD4C02, MD4S21); + MD4_STEP_REV (MD4_H, a_rev, b_rev, c_rev, d_rev, w[ 2], MD4C02, MD4S20); + MD4_STEP_REV (MD4_H, b_rev, c_rev, d_rev, a_rev, w[12], MD4C02, MD4S23); + MD4_STEP_REV (MD4_H, c_rev, d_rev, a_rev, b_rev, w[ 4], MD4C02, MD4S22); + MD4_STEP_REV (MD4_H, d_rev, a_rev, b_rev, c_rev, w[ 8], MD4C02, MD4S21); + MD4_STEP_REV (MD4_H, a_rev, b_rev, c_rev, d_rev, 0, MD4C02, MD4S20); + + const u32x sav_c = c_rev; + const u32x sav_d = d_rev; + + MD4_STEP_REV1(MD4_G, b_rev, c_rev, d_rev, a_rev, w[15], MD4C01, MD4S13); + MD4_STEP_REV1(MD4_G, c_rev, d_rev, a_rev, b_rev, w[11], MD4C01, MD4S12); + + /** + * loop + */ + + const u32 bf_loops = ceil ((float) bfs_cnt / VECT_DIV); + + u32x w0l = w[0]; + + for (u32 il_pos = 0; il_pos < bf_loops; il_pos++) + { + const u32x w0r = words_buf_r[il_pos]; + + const u32x w0 = w0l | w0r; + + u32x pre_a = a_rev; + u32x pre_b = b_rev; + u32x pre_c = c_rev; + + pre_a = pre_a - w0; + pre_b = pre_b - MD4_G (sav_c, sav_d, pre_a); + pre_c = pre_c - MD4_G (sav_d, pre_a, pre_b); + + u32x tmp2; + + u32x a = MD4M_A; + u32x b = MD4M_B; + u32x c = MD4M_C; + u32x d = MD4M_D; + + MD4_STEP (MD4_Fo, a, b, c, d, w0, F_w0c00, MD4S00); + MD4_STEP0(MD4_Fo, d, a, b, c, F_w1c00, MD4S01); + MD4_STEP0(MD4_Fo, c, d, a, b, F_w2c00, MD4S02); + MD4_STEP0(MD4_Fo, b, c, d, a, F_w3c00, MD4S03); + MD4_STEP0(MD4_Fo, a, b, c, d, F_w4c00, MD4S00); + MD4_STEP0(MD4_Fo, d, a, b, c, F_w5c00, MD4S01); + MD4_STEP0(MD4_Fo, c, d, a, b, F_w6c00, MD4S02); + MD4_STEP0(MD4_Fo, b, c, d, a, F_w7c00, MD4S03); + MD4_STEP0(MD4_Fo, a, b, c, d, F_w8c00, MD4S00); + MD4_STEP0(MD4_Fo, d, a, b, c, F_w9c00, MD4S01); + MD4_STEP0(MD4_Fo, c, d, a, b, F_wac00, MD4S02); + MD4_STEP0(MD4_Fo, b, c, d, a, F_wbc00, MD4S03); + MD4_STEP0(MD4_Fo, a, b, c, d, F_wcc00, MD4S00); + MD4_STEP0(MD4_Fo, d, a, b, c, F_wdc00, MD4S01); + MD4_STEP0(MD4_Fo, c, d, a, b, F_wec00, MD4S02); + MD4_STEP0(MD4_Fo, b, c, d, a, F_wfc00, MD4S03); + + MD4_STEP (MD4_Go, a, b, c, d, w0, G_w0c01, MD4S10); + MD4_STEP0(MD4_Go, d, a, b, c, G_w4c01, MD4S11); + MD4_STEP0(MD4_Go, c, d, a, b, G_w8c01, MD4S12); + MD4_STEP0(MD4_Go, b, c, d, a, G_wcc01, MD4S13); + MD4_STEP0(MD4_Go, a, b, c, d, G_w1c01, MD4S10); + MD4_STEP0(MD4_Go, d, a, b, c, G_w5c01, MD4S11); + MD4_STEP0(MD4_Go, c, d, a, b, G_w9c01, MD4S12); + MD4_STEP0(MD4_Go, b, c, d, a, G_wdc01, MD4S13); + MD4_STEP0(MD4_Go, a, b, c, d, G_w2c01, MD4S10); + MD4_STEP0(MD4_Go, d, a, b, c, G_w6c01, MD4S11); + MD4_STEP0(MD4_Go, c, d, a, b, G_wac01, MD4S12); + + bool q_cond = allx (pre_c != c); + + if (q_cond) continue; + + MD4_STEP0(MD4_Go, b, c, d, a, G_wec01, MD4S13); + MD4_STEP0(MD4_Go, a, b, c, d, G_w3c01, MD4S10); + + bool q_cond2 = allx (pre_a != a); + + if (q_cond2) continue; + + MD4_STEP0(MD4_Go, d, a, b, c, G_w7c01, MD4S11); + MD4_STEP0(MD4_Go, c, d, a, b, G_wbc01, MD4S12); + MD4_STEP0(MD4_Go, b, c, d, a, G_wfc01, MD4S13); + + MD4_STEP (MD4_H1, a, b, c, d, w0, H_w0c02, MD4S20); + MD4_STEP0(MD4_H2, d, a, b, c, H_w8c02, MD4S21); + MD4_STEP0(MD4_H1, c, d, a, b, H_w4c02, MD4S22); + MD4_STEP0(MD4_H2, b, c, d, a, H_wcc02, MD4S23); + MD4_STEP0(MD4_H1, a, b, c, d, H_w2c02, MD4S20); + MD4_STEP0(MD4_H2, d, a, b, c, H_wac02, MD4S21); + MD4_STEP0(MD4_H1, c, d, a, b, H_w6c02, MD4S22); + MD4_STEP0(MD4_H2, b, c, d, a, H_wec02, MD4S23); + MD4_STEP0(MD4_H1, a, b, c, d, H_w1c02, MD4S20); + MD4_STEP0(MD4_H2, d, a, b, c, H_w9c02, MD4S21); + MD4_STEP0(MD4_H1, c, d, a, b, H_w5c02, MD4S22); + MD4_STEP0(MD4_H2, b, c, d, a, H_wdc02, MD4S23); + MD4_STEP0(MD4_H1, a, b, c, d, H_w3c02, MD4S20); + MD4_STEP0(MD4_H2, d, a, b, c, H_wbc02, MD4S21); + MD4_STEP0(MD4_H1, c, d, a, b, H_w7c02, MD4S22); + MD4_STEP0(MD4_H2, b, c, d, a, H_wfc02, MD4S23); + + const u32x r0 = a; + const u32x r1 = d; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_S + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m01000_m04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global u32x * words_buf_r, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32 w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = 0; + w[ 5] = 0; + w[ 6] = 0; + w[ 7] = 0; + w[ 8] = 0; + w[ 9] = 0; + w[10] = 0; + w[11] = 0; + w[12] = 0; + w[13] = 0; + w[14] = pws[gid].i[14]; + w[15] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m01000m (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m01000_m08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global u32x * words_buf_r, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32 w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = pws[gid].i[ 4]; + w[ 5] = pws[gid].i[ 5]; + w[ 6] = pws[gid].i[ 6]; + w[ 7] = pws[gid].i[ 7]; + w[ 8] = 0; + w[ 9] = 0; + w[10] = 0; + w[11] = 0; + w[12] = 0; + w[13] = 0; + w[14] = pws[gid].i[14]; + w[15] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m01000m (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m01000_m16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global u32x * words_buf_r, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32 w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = pws[gid].i[ 4]; + w[ 5] = pws[gid].i[ 5]; + w[ 6] = pws[gid].i[ 6]; + w[ 7] = pws[gid].i[ 7]; + w[ 8] = pws[gid].i[ 8]; + w[ 9] = pws[gid].i[ 9]; + w[10] = pws[gid].i[10]; + w[11] = pws[gid].i[11]; + w[12] = pws[gid].i[12]; + w[13] = pws[gid].i[13]; + w[14] = pws[gid].i[14]; + w[15] = pws[gid].i[15]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m01000m (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m01000_s04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global u32x * words_buf_r, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32 w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = 0; + w[ 5] = 0; + w[ 6] = 0; + w[ 7] = 0; + w[ 8] = 0; + w[ 9] = 0; + w[10] = 0; + w[11] = 0; + w[12] = 0; + w[13] = 0; + w[14] = pws[gid].i[14]; + w[15] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m01000s (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m01000_s08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global u32x * words_buf_r, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32 w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = pws[gid].i[ 4]; + w[ 5] = pws[gid].i[ 5]; + w[ 6] = pws[gid].i[ 6]; + w[ 7] = pws[gid].i[ 7]; + w[ 8] = 0; + w[ 9] = 0; + w[10] = 0; + w[11] = 0; + w[12] = 0; + w[13] = 0; + w[14] = pws[gid].i[14]; + w[15] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m01000s (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m01000_s16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global u32x * words_buf_r, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32 w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = pws[gid].i[ 4]; + w[ 5] = pws[gid].i[ 5]; + w[ 6] = pws[gid].i[ 6]; + w[ 7] = pws[gid].i[ 7]; + w[ 8] = pws[gid].i[ 8]; + w[ 9] = pws[gid].i[ 9]; + w[10] = pws[gid].i[10]; + w[11] = pws[gid].i[11]; + w[12] = pws[gid].i[12]; + w[13] = pws[gid].i[13]; + w[14] = pws[gid].i[14]; + w[15] = pws[gid].i[15]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m01000s (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} diff --git a/amd/m01100_a0.cl b/amd/m01100_a0.cl new file mode 100644 index 0000000000..c10e447c66 --- /dev/null +++ b/amd/m01100_a0.cl @@ -0,0 +1,580 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _MD4_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW4 +#define VECT_SIZE4 +#endif + +#ifdef VLIW5 +#define VECT_SIZE4 +#endif + +#define DGST_R0 0 +#define DGST_R1 3 +#define DGST_R2 2 +#define DGST_R3 1 + +#include "include/kernel_functions.c" +#include "types_amd.c" +#include "common_amd.c" +#include "include/rp_gpu.h" +#include "rp_amd.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m01100_m04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + u32x pw_buf1[4]; + + pw_buf1[0] = pws[gid].i[ 4]; + pw_buf1[1] = pws[gid].i[ 5]; + pw_buf1[2] = pws[gid].i[ 6]; + pw_buf1[3] = pws[gid].i[ 7]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[ 1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[ 2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[ 3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[ 4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[ 5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[ 6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[ 7]; + + u32 salt_buf2[4]; + + salt_buf2[0] = salt_bufs[salt_pos].salt_buf[ 8]; + salt_buf2[1] = salt_bufs[salt_pos].salt_buf[ 9]; + salt_buf2[2] = 0; + salt_buf2[3] = 0; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + + w0[0] = pw_buf0[0]; + w0[1] = pw_buf0[1]; + w0[2] = pw_buf0[2]; + w0[3] = pw_buf0[3]; + + u32x w1[4]; + + w1[0] = pw_buf1[0]; + w1[1] = pw_buf1[1]; + w1[2] = pw_buf1[2]; + w1[3] = pw_buf1[3]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 out_len = apply_rules (rules_buf[il_pos].cmds, w0, w1, pw_len); + + append_0x80_2 (w0, w1, out_len); + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + make_unicode (w0, w0_t, w1_t); + make_unicode (w1, w2_t, w3_t); + + w3_t[2] = out_len * 8 * 2; + + u32x a = MD4M_A; + u32x b = MD4M_B; + u32x c = MD4M_C; + u32x d = MD4M_D; + + MD4_STEP (MD4_Fo, a, b, c, d, w0_t[0], MD4C00, MD4S00); + MD4_STEP (MD4_Fo, d, a, b, c, w0_t[1], MD4C00, MD4S01); + MD4_STEP (MD4_Fo, c, d, a, b, w0_t[2], MD4C00, MD4S02); + MD4_STEP (MD4_Fo, b, c, d, a, w0_t[3], MD4C00, MD4S03); + MD4_STEP (MD4_Fo, a, b, c, d, w1_t[0], MD4C00, MD4S00); + MD4_STEP (MD4_Fo, d, a, b, c, w1_t[1], MD4C00, MD4S01); + MD4_STEP (MD4_Fo, c, d, a, b, w1_t[2], MD4C00, MD4S02); + MD4_STEP (MD4_Fo, b, c, d, a, w1_t[3], MD4C00, MD4S03); + MD4_STEP (MD4_Fo, a, b, c, d, w2_t[0], MD4C00, MD4S00); + MD4_STEP (MD4_Fo, d, a, b, c, w2_t[1], MD4C00, MD4S01); + MD4_STEP (MD4_Fo, c, d, a, b, w2_t[2], MD4C00, MD4S02); + MD4_STEP (MD4_Fo, b, c, d, a, w2_t[3], MD4C00, MD4S03); + MD4_STEP (MD4_Fo, a, b, c, d, w3_t[0], MD4C00, MD4S00); + MD4_STEP (MD4_Fo, d, a, b, c, w3_t[1], MD4C00, MD4S01); + MD4_STEP (MD4_Fo, c, d, a, b, w3_t[2], MD4C00, MD4S02); + MD4_STEP (MD4_Fo, b, c, d, a, w3_t[3], MD4C00, MD4S03); + + MD4_STEP (MD4_Go, a, b, c, d, w0_t[0], MD4C01, MD4S10); + MD4_STEP (MD4_Go, d, a, b, c, w1_t[0], MD4C01, MD4S11); + MD4_STEP (MD4_Go, c, d, a, b, w2_t[0], MD4C01, MD4S12); + MD4_STEP (MD4_Go, b, c, d, a, w3_t[0], MD4C01, MD4S13); + MD4_STEP (MD4_Go, a, b, c, d, w0_t[1], MD4C01, MD4S10); + MD4_STEP (MD4_Go, d, a, b, c, w1_t[1], MD4C01, MD4S11); + MD4_STEP (MD4_Go, c, d, a, b, w2_t[1], MD4C01, MD4S12); + MD4_STEP (MD4_Go, b, c, d, a, w3_t[1], MD4C01, MD4S13); + MD4_STEP (MD4_Go, a, b, c, d, w0_t[2], MD4C01, MD4S10); + MD4_STEP (MD4_Go, d, a, b, c, w1_t[2], MD4C01, MD4S11); + MD4_STEP (MD4_Go, c, d, a, b, w2_t[2], MD4C01, MD4S12); + MD4_STEP (MD4_Go, b, c, d, a, w3_t[2], MD4C01, MD4S13); + MD4_STEP (MD4_Go, a, b, c, d, w0_t[3], MD4C01, MD4S10); + MD4_STEP (MD4_Go, d, a, b, c, w1_t[3], MD4C01, MD4S11); + MD4_STEP (MD4_Go, c, d, a, b, w2_t[3], MD4C01, MD4S12); + MD4_STEP (MD4_Go, b, c, d, a, w3_t[3], MD4C01, MD4S13); + + MD4_STEP (MD4_H , a, b, c, d, w0_t[0], MD4C02, MD4S20); + MD4_STEP (MD4_H , d, a, b, c, w2_t[0], MD4C02, MD4S21); + MD4_STEP (MD4_H , c, d, a, b, w1_t[0], MD4C02, MD4S22); + MD4_STEP (MD4_H , b, c, d, a, w3_t[0], MD4C02, MD4S23); + MD4_STEP (MD4_H , a, b, c, d, w0_t[2], MD4C02, MD4S20); + MD4_STEP (MD4_H , d, a, b, c, w2_t[2], MD4C02, MD4S21); + MD4_STEP (MD4_H , c, d, a, b, w1_t[2], MD4C02, MD4S22); + MD4_STEP (MD4_H , b, c, d, a, w3_t[2], MD4C02, MD4S23); + MD4_STEP (MD4_H , a, b, c, d, w0_t[1], MD4C02, MD4S20); + MD4_STEP (MD4_H , d, a, b, c, w2_t[1], MD4C02, MD4S21); + MD4_STEP (MD4_H , c, d, a, b, w1_t[1], MD4C02, MD4S22); + MD4_STEP (MD4_H , b, c, d, a, w3_t[1], MD4C02, MD4S23); + MD4_STEP (MD4_H , a, b, c, d, w0_t[3], MD4C02, MD4S20); + MD4_STEP (MD4_H , d, a, b, c, w2_t[3], MD4C02, MD4S21); + MD4_STEP (MD4_H , c, d, a, b, w1_t[3], MD4C02, MD4S22); + MD4_STEP (MD4_H , b, c, d, a, w3_t[3], MD4C02, MD4S23); + + a += MD4M_A; + b += MD4M_B; + c += MD4M_C; + d += MD4M_D; + + w0_t[0] = a; + w0_t[1] = b; + w0_t[2] = c; + w0_t[3] = d; + w1_t[0] = salt_buf0[0]; + w1_t[1] = salt_buf0[1]; + w1_t[2] = salt_buf0[2]; + w1_t[3] = salt_buf0[3]; + w2_t[0] = salt_buf1[0]; + w2_t[1] = salt_buf1[1]; + w2_t[2] = salt_buf1[2]; + w2_t[3] = salt_buf1[3]; + w3_t[0] = salt_buf2[0]; + w3_t[1] = salt_buf2[1]; + w3_t[2] = (16 + salt_len) * 8; + w3_t[3] = 0; + + a = MD4M_A; + b = MD4M_B; + c = MD4M_C; + d = MD4M_D; + + MD4_STEP (MD4_Fo, a, b, c, d, w0_t[0], MD4C00, MD4S00); + MD4_STEP (MD4_Fo, d, a, b, c, w0_t[1], MD4C00, MD4S01); + MD4_STEP (MD4_Fo, c, d, a, b, w0_t[2], MD4C00, MD4S02); + MD4_STEP (MD4_Fo, b, c, d, a, w0_t[3], MD4C00, MD4S03); + MD4_STEP (MD4_Fo, a, b, c, d, w1_t[0], MD4C00, MD4S00); + MD4_STEP (MD4_Fo, d, a, b, c, w1_t[1], MD4C00, MD4S01); + MD4_STEP (MD4_Fo, c, d, a, b, w1_t[2], MD4C00, MD4S02); + MD4_STEP (MD4_Fo, b, c, d, a, w1_t[3], MD4C00, MD4S03); + MD4_STEP (MD4_Fo, a, b, c, d, w2_t[0], MD4C00, MD4S00); + MD4_STEP (MD4_Fo, d, a, b, c, w2_t[1], MD4C00, MD4S01); + MD4_STEP (MD4_Fo, c, d, a, b, w2_t[2], MD4C00, MD4S02); + MD4_STEP (MD4_Fo, b, c, d, a, w2_t[3], MD4C00, MD4S03); + MD4_STEP (MD4_Fo, a, b, c, d, w3_t[0], MD4C00, MD4S00); + MD4_STEP (MD4_Fo, d, a, b, c, w3_t[1], MD4C00, MD4S01); + MD4_STEP (MD4_Fo, c, d, a, b, w3_t[2], MD4C00, MD4S02); + MD4_STEP (MD4_Fo, b, c, d, a, w3_t[3], MD4C00, MD4S03); + + MD4_STEP (MD4_Go, a, b, c, d, w0_t[0], MD4C01, MD4S10); + MD4_STEP (MD4_Go, d, a, b, c, w1_t[0], MD4C01, MD4S11); + MD4_STEP (MD4_Go, c, d, a, b, w2_t[0], MD4C01, MD4S12); + MD4_STEP (MD4_Go, b, c, d, a, w3_t[0], MD4C01, MD4S13); + MD4_STEP (MD4_Go, a, b, c, d, w0_t[1], MD4C01, MD4S10); + MD4_STEP (MD4_Go, d, a, b, c, w1_t[1], MD4C01, MD4S11); + MD4_STEP (MD4_Go, c, d, a, b, w2_t[1], MD4C01, MD4S12); + MD4_STEP (MD4_Go, b, c, d, a, w3_t[1], MD4C01, MD4S13); + MD4_STEP (MD4_Go, a, b, c, d, w0_t[2], MD4C01, MD4S10); + MD4_STEP (MD4_Go, d, a, b, c, w1_t[2], MD4C01, MD4S11); + MD4_STEP (MD4_Go, c, d, a, b, w2_t[2], MD4C01, MD4S12); + MD4_STEP (MD4_Go, b, c, d, a, w3_t[2], MD4C01, MD4S13); + MD4_STEP (MD4_Go, a, b, c, d, w0_t[3], MD4C01, MD4S10); + MD4_STEP (MD4_Go, d, a, b, c, w1_t[3], MD4C01, MD4S11); + MD4_STEP (MD4_Go, c, d, a, b, w2_t[3], MD4C01, MD4S12); + MD4_STEP (MD4_Go, b, c, d, a, w3_t[3], MD4C01, MD4S13); + + MD4_STEP (MD4_H , a, b, c, d, w0_t[0], MD4C02, MD4S20); + MD4_STEP (MD4_H , d, a, b, c, w2_t[0], MD4C02, MD4S21); + MD4_STEP (MD4_H , c, d, a, b, w1_t[0], MD4C02, MD4S22); + MD4_STEP (MD4_H , b, c, d, a, w3_t[0], MD4C02, MD4S23); + MD4_STEP (MD4_H , a, b, c, d, w0_t[2], MD4C02, MD4S20); + MD4_STEP (MD4_H , d, a, b, c, w2_t[2], MD4C02, MD4S21); + MD4_STEP (MD4_H , c, d, a, b, w1_t[2], MD4C02, MD4S22); + MD4_STEP (MD4_H , b, c, d, a, w3_t[2], MD4C02, MD4S23); + MD4_STEP (MD4_H , a, b, c, d, w0_t[1], MD4C02, MD4S20); + MD4_STEP (MD4_H , d, a, b, c, w2_t[1], MD4C02, MD4S21); + MD4_STEP (MD4_H , c, d, a, b, w1_t[1], MD4C02, MD4S22); + MD4_STEP (MD4_H , b, c, d, a, w3_t[1], MD4C02, MD4S23); + MD4_STEP (MD4_H , a, b, c, d, w0_t[3], MD4C02, MD4S20); + MD4_STEP (MD4_H , d, a, b, c, w2_t[3], MD4C02, MD4S21); + MD4_STEP (MD4_H , c, d, a, b, w1_t[3], MD4C02, MD4S22); + MD4_STEP (MD4_H , b, c, d, a, w3_t[3], MD4C02, MD4S23); + + const u32x r0 = a; + const u32x r1 = d; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_M + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m01100_m08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m01100_m16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m01100_s04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + u32x pw_buf1[4]; + + pw_buf1[0] = pws[gid].i[ 4]; + pw_buf1[1] = pws[gid].i[ 5]; + pw_buf1[2] = pws[gid].i[ 6]; + pw_buf1[3] = pws[gid].i[ 7]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[ 1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[ 2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[ 3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[ 4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[ 5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[ 6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[ 7]; + + u32 salt_buf2[4]; + + salt_buf2[0] = salt_bufs[salt_pos].salt_buf[ 8]; + salt_buf2[1] = salt_bufs[salt_pos].salt_buf[ 9]; + salt_buf2[2] = 0; + salt_buf2[3] = 0; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + + w0[0] = pw_buf0[0]; + w0[1] = pw_buf0[1]; + w0[2] = pw_buf0[2]; + w0[3] = pw_buf0[3]; + + u32x w1[4]; + + w1[0] = pw_buf1[0]; + w1[1] = pw_buf1[1]; + w1[2] = pw_buf1[2]; + w1[3] = pw_buf1[3]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 out_len = apply_rules (rules_buf[il_pos].cmds, w0, w1, pw_len); + + append_0x80_2 (w0, w1, out_len); + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + make_unicode (w0, w0_t, w1_t); + make_unicode (w1, w2_t, w3_t); + + w3_t[2] = out_len * 8 * 2; + + u32x a = MD4M_A; + u32x b = MD4M_B; + u32x c = MD4M_C; + u32x d = MD4M_D; + + MD4_STEP (MD4_Fo, a, b, c, d, w0_t[0], MD4C00, MD4S00); + MD4_STEP (MD4_Fo, d, a, b, c, w0_t[1], MD4C00, MD4S01); + MD4_STEP (MD4_Fo, c, d, a, b, w0_t[2], MD4C00, MD4S02); + MD4_STEP (MD4_Fo, b, c, d, a, w0_t[3], MD4C00, MD4S03); + MD4_STEP (MD4_Fo, a, b, c, d, w1_t[0], MD4C00, MD4S00); + MD4_STEP (MD4_Fo, d, a, b, c, w1_t[1], MD4C00, MD4S01); + MD4_STEP (MD4_Fo, c, d, a, b, w1_t[2], MD4C00, MD4S02); + MD4_STEP (MD4_Fo, b, c, d, a, w1_t[3], MD4C00, MD4S03); + MD4_STEP (MD4_Fo, a, b, c, d, w2_t[0], MD4C00, MD4S00); + MD4_STEP (MD4_Fo, d, a, b, c, w2_t[1], MD4C00, MD4S01); + MD4_STEP (MD4_Fo, c, d, a, b, w2_t[2], MD4C00, MD4S02); + MD4_STEP (MD4_Fo, b, c, d, a, w2_t[3], MD4C00, MD4S03); + MD4_STEP (MD4_Fo, a, b, c, d, w3_t[0], MD4C00, MD4S00); + MD4_STEP (MD4_Fo, d, a, b, c, w3_t[1], MD4C00, MD4S01); + MD4_STEP (MD4_Fo, c, d, a, b, w3_t[2], MD4C00, MD4S02); + MD4_STEP (MD4_Fo, b, c, d, a, w3_t[3], MD4C00, MD4S03); + + MD4_STEP (MD4_Go, a, b, c, d, w0_t[0], MD4C01, MD4S10); + MD4_STEP (MD4_Go, d, a, b, c, w1_t[0], MD4C01, MD4S11); + MD4_STEP (MD4_Go, c, d, a, b, w2_t[0], MD4C01, MD4S12); + MD4_STEP (MD4_Go, b, c, d, a, w3_t[0], MD4C01, MD4S13); + MD4_STEP (MD4_Go, a, b, c, d, w0_t[1], MD4C01, MD4S10); + MD4_STEP (MD4_Go, d, a, b, c, w1_t[1], MD4C01, MD4S11); + MD4_STEP (MD4_Go, c, d, a, b, w2_t[1], MD4C01, MD4S12); + MD4_STEP (MD4_Go, b, c, d, a, w3_t[1], MD4C01, MD4S13); + MD4_STEP (MD4_Go, a, b, c, d, w0_t[2], MD4C01, MD4S10); + MD4_STEP (MD4_Go, d, a, b, c, w1_t[2], MD4C01, MD4S11); + MD4_STEP (MD4_Go, c, d, a, b, w2_t[2], MD4C01, MD4S12); + MD4_STEP (MD4_Go, b, c, d, a, w3_t[2], MD4C01, MD4S13); + MD4_STEP (MD4_Go, a, b, c, d, w0_t[3], MD4C01, MD4S10); + MD4_STEP (MD4_Go, d, a, b, c, w1_t[3], MD4C01, MD4S11); + MD4_STEP (MD4_Go, c, d, a, b, w2_t[3], MD4C01, MD4S12); + MD4_STEP (MD4_Go, b, c, d, a, w3_t[3], MD4C01, MD4S13); + + MD4_STEP (MD4_H , a, b, c, d, w0_t[0], MD4C02, MD4S20); + MD4_STEP (MD4_H , d, a, b, c, w2_t[0], MD4C02, MD4S21); + MD4_STEP (MD4_H , c, d, a, b, w1_t[0], MD4C02, MD4S22); + MD4_STEP (MD4_H , b, c, d, a, w3_t[0], MD4C02, MD4S23); + MD4_STEP (MD4_H , a, b, c, d, w0_t[2], MD4C02, MD4S20); + MD4_STEP (MD4_H , d, a, b, c, w2_t[2], MD4C02, MD4S21); + MD4_STEP (MD4_H , c, d, a, b, w1_t[2], MD4C02, MD4S22); + MD4_STEP (MD4_H , b, c, d, a, w3_t[2], MD4C02, MD4S23); + MD4_STEP (MD4_H , a, b, c, d, w0_t[1], MD4C02, MD4S20); + MD4_STEP (MD4_H , d, a, b, c, w2_t[1], MD4C02, MD4S21); + MD4_STEP (MD4_H , c, d, a, b, w1_t[1], MD4C02, MD4S22); + MD4_STEP (MD4_H , b, c, d, a, w3_t[1], MD4C02, MD4S23); + MD4_STEP (MD4_H , a, b, c, d, w0_t[3], MD4C02, MD4S20); + MD4_STEP (MD4_H , d, a, b, c, w2_t[3], MD4C02, MD4S21); + MD4_STEP (MD4_H , c, d, a, b, w1_t[3], MD4C02, MD4S22); + MD4_STEP (MD4_H , b, c, d, a, w3_t[3], MD4C02, MD4S23); + + a += MD4M_A; + b += MD4M_B; + c += MD4M_C; + d += MD4M_D; + + w0_t[0] = a; + w0_t[1] = b; + w0_t[2] = c; + w0_t[3] = d; + w1_t[0] = salt_buf0[0]; + w1_t[1] = salt_buf0[1]; + w1_t[2] = salt_buf0[2]; + w1_t[3] = salt_buf0[3]; + w2_t[0] = salt_buf1[0]; + w2_t[1] = salt_buf1[1]; + w2_t[2] = salt_buf1[2]; + w2_t[3] = salt_buf1[3]; + w3_t[0] = salt_buf2[0]; + w3_t[1] = salt_buf2[1]; + w3_t[2] = (16 + salt_len) * 8; + w3_t[3] = 0; + + a = MD4M_A; + b = MD4M_B; + c = MD4M_C; + d = MD4M_D; + + MD4_STEP (MD4_Fo, a, b, c, d, w0_t[0], MD4C00, MD4S00); + MD4_STEP (MD4_Fo, d, a, b, c, w0_t[1], MD4C00, MD4S01); + MD4_STEP (MD4_Fo, c, d, a, b, w0_t[2], MD4C00, MD4S02); + MD4_STEP (MD4_Fo, b, c, d, a, w0_t[3], MD4C00, MD4S03); + MD4_STEP (MD4_Fo, a, b, c, d, w1_t[0], MD4C00, MD4S00); + MD4_STEP (MD4_Fo, d, a, b, c, w1_t[1], MD4C00, MD4S01); + MD4_STEP (MD4_Fo, c, d, a, b, w1_t[2], MD4C00, MD4S02); + MD4_STEP (MD4_Fo, b, c, d, a, w1_t[3], MD4C00, MD4S03); + MD4_STEP (MD4_Fo, a, b, c, d, w2_t[0], MD4C00, MD4S00); + MD4_STEP (MD4_Fo, d, a, b, c, w2_t[1], MD4C00, MD4S01); + MD4_STEP (MD4_Fo, c, d, a, b, w2_t[2], MD4C00, MD4S02); + MD4_STEP (MD4_Fo, b, c, d, a, w2_t[3], MD4C00, MD4S03); + MD4_STEP (MD4_Fo, a, b, c, d, w3_t[0], MD4C00, MD4S00); + MD4_STEP (MD4_Fo, d, a, b, c, w3_t[1], MD4C00, MD4S01); + MD4_STEP (MD4_Fo, c, d, a, b, w3_t[2], MD4C00, MD4S02); + MD4_STEP (MD4_Fo, b, c, d, a, w3_t[3], MD4C00, MD4S03); + + MD4_STEP (MD4_Go, a, b, c, d, w0_t[0], MD4C01, MD4S10); + MD4_STEP (MD4_Go, d, a, b, c, w1_t[0], MD4C01, MD4S11); + MD4_STEP (MD4_Go, c, d, a, b, w2_t[0], MD4C01, MD4S12); + MD4_STEP (MD4_Go, b, c, d, a, w3_t[0], MD4C01, MD4S13); + MD4_STEP (MD4_Go, a, b, c, d, w0_t[1], MD4C01, MD4S10); + MD4_STEP (MD4_Go, d, a, b, c, w1_t[1], MD4C01, MD4S11); + MD4_STEP (MD4_Go, c, d, a, b, w2_t[1], MD4C01, MD4S12); + MD4_STEP (MD4_Go, b, c, d, a, w3_t[1], MD4C01, MD4S13); + MD4_STEP (MD4_Go, a, b, c, d, w0_t[2], MD4C01, MD4S10); + MD4_STEP (MD4_Go, d, a, b, c, w1_t[2], MD4C01, MD4S11); + MD4_STEP (MD4_Go, c, d, a, b, w2_t[2], MD4C01, MD4S12); + MD4_STEP (MD4_Go, b, c, d, a, w3_t[2], MD4C01, MD4S13); + MD4_STEP (MD4_Go, a, b, c, d, w0_t[3], MD4C01, MD4S10); + MD4_STEP (MD4_Go, d, a, b, c, w1_t[3], MD4C01, MD4S11); + MD4_STEP (MD4_Go, c, d, a, b, w2_t[3], MD4C01, MD4S12); + MD4_STEP (MD4_Go, b, c, d, a, w3_t[3], MD4C01, MD4S13); + + MD4_STEP (MD4_H , a, b, c, d, w0_t[0], MD4C02, MD4S20); + MD4_STEP (MD4_H , d, a, b, c, w2_t[0], MD4C02, MD4S21); + MD4_STEP (MD4_H , c, d, a, b, w1_t[0], MD4C02, MD4S22); + MD4_STEP (MD4_H , b, c, d, a, w3_t[0], MD4C02, MD4S23); + MD4_STEP (MD4_H , a, b, c, d, w0_t[2], MD4C02, MD4S20); + MD4_STEP (MD4_H , d, a, b, c, w2_t[2], MD4C02, MD4S21); + MD4_STEP (MD4_H , c, d, a, b, w1_t[2], MD4C02, MD4S22); + MD4_STEP (MD4_H , b, c, d, a, w3_t[2], MD4C02, MD4S23); + MD4_STEP (MD4_H , a, b, c, d, w0_t[1], MD4C02, MD4S20); + MD4_STEP (MD4_H , d, a, b, c, w2_t[1], MD4C02, MD4S21); + MD4_STEP (MD4_H , c, d, a, b, w1_t[1], MD4C02, MD4S22); + MD4_STEP (MD4_H , b, c, d, a, w3_t[1], MD4C02, MD4S23); + MD4_STEP (MD4_H , a, b, c, d, w0_t[3], MD4C02, MD4S20); + + bool q_cond = allx (search[0] != a); + + if (q_cond) continue; + + MD4_STEP (MD4_H , d, a, b, c, w2_t[3], MD4C02, MD4S21); + MD4_STEP (MD4_H , c, d, a, b, w1_t[3], MD4C02, MD4S22); + MD4_STEP (MD4_H , b, c, d, a, w3_t[3], MD4C02, MD4S23); + + const u32x r0 = a; + const u32x r1 = d; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_S + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m01100_s08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m01100_s16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/amd/m01100_a1.cl b/amd/m01100_a1.cl new file mode 100644 index 0000000000..87d01f7ca3 --- /dev/null +++ b/amd/m01100_a1.cl @@ -0,0 +1,686 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _MD4_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW4 +#define VECT_SIZE4 +#endif + +#ifdef VLIW5 +#define VECT_SIZE4 +#endif + +#define DGST_R0 0 +#define DGST_R1 3 +#define DGST_R2 2 +#define DGST_R3 1 + +#include "include/kernel_functions.c" +#include "types_amd.c" +#include "common_amd.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m01100_m04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + append_0x80_2 (wordl0, wordl1, pw_l_len); + + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, combs_buf[0].pw_len); + } + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[ 1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[ 2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[ 3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[ 4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[ 5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[ 6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[ 7]; + + u32 salt_buf2[4]; + + salt_buf2[0] = salt_bufs[salt_pos].salt_buf[ 8]; + salt_buf2[1] = salt_bufs[salt_pos].salt_buf[ 9]; + salt_buf2[2] = 0; + salt_buf2[3] = 0; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = combs_buf[il_pos].pw_len; + + const u32 pw_len = pw_l_len + pw_r_len; + + u32 wordr0[4]; + + wordr0[0] = combs_buf[il_pos].i[0]; + wordr0[1] = combs_buf[il_pos].i[1]; + wordr0[2] = combs_buf[il_pos].i[2]; + wordr0[3] = combs_buf[il_pos].i[3]; + + u32 wordr1[4]; + + wordr1[0] = combs_buf[il_pos].i[4]; + wordr1[1] = combs_buf[il_pos].i[5]; + wordr1[2] = combs_buf[il_pos].i[6]; + wordr1[3] = combs_buf[il_pos].i[7]; + + u32 wordr2[4]; + + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + + u32 wordr3[4]; + + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + u32x w0[4]; + + w0[0] = wordl0[0] | wordr0[0]; + w0[1] = wordl0[1] | wordr0[1]; + w0[2] = wordl0[2] | wordr0[2]; + w0[3] = wordl0[3] | wordr0[3]; + + u32x w1[4]; + + w1[0] = wordl1[0] | wordr1[0]; + w1[1] = wordl1[1] | wordr1[1]; + w1[2] = wordl1[2] | wordr1[2]; + w1[3] = wordl1[3] | wordr1[3]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + make_unicode (w0, w0_t, w1_t); + make_unicode (w1, w2_t, w3_t); + + w3_t[2] = pw_len * 8 * 2; + + u32x a = MD4M_A; + u32x b = MD4M_B; + u32x c = MD4M_C; + u32x d = MD4M_D; + + MD4_STEP (MD4_Fo, a, b, c, d, w0_t[0], MD4C00, MD4S00); + MD4_STEP (MD4_Fo, d, a, b, c, w0_t[1], MD4C00, MD4S01); + MD4_STEP (MD4_Fo, c, d, a, b, w0_t[2], MD4C00, MD4S02); + MD4_STEP (MD4_Fo, b, c, d, a, w0_t[3], MD4C00, MD4S03); + MD4_STEP (MD4_Fo, a, b, c, d, w1_t[0], MD4C00, MD4S00); + MD4_STEP (MD4_Fo, d, a, b, c, w1_t[1], MD4C00, MD4S01); + MD4_STEP (MD4_Fo, c, d, a, b, w1_t[2], MD4C00, MD4S02); + MD4_STEP (MD4_Fo, b, c, d, a, w1_t[3], MD4C00, MD4S03); + MD4_STEP (MD4_Fo, a, b, c, d, w2_t[0], MD4C00, MD4S00); + MD4_STEP (MD4_Fo, d, a, b, c, w2_t[1], MD4C00, MD4S01); + MD4_STEP (MD4_Fo, c, d, a, b, w2_t[2], MD4C00, MD4S02); + MD4_STEP (MD4_Fo, b, c, d, a, w2_t[3], MD4C00, MD4S03); + MD4_STEP (MD4_Fo, a, b, c, d, w3_t[0], MD4C00, MD4S00); + MD4_STEP (MD4_Fo, d, a, b, c, w3_t[1], MD4C00, MD4S01); + MD4_STEP (MD4_Fo, c, d, a, b, w3_t[2], MD4C00, MD4S02); + MD4_STEP (MD4_Fo, b, c, d, a, w3_t[3], MD4C00, MD4S03); + + MD4_STEP (MD4_Go, a, b, c, d, w0_t[0], MD4C01, MD4S10); + MD4_STEP (MD4_Go, d, a, b, c, w1_t[0], MD4C01, MD4S11); + MD4_STEP (MD4_Go, c, d, a, b, w2_t[0], MD4C01, MD4S12); + MD4_STEP (MD4_Go, b, c, d, a, w3_t[0], MD4C01, MD4S13); + MD4_STEP (MD4_Go, a, b, c, d, w0_t[1], MD4C01, MD4S10); + MD4_STEP (MD4_Go, d, a, b, c, w1_t[1], MD4C01, MD4S11); + MD4_STEP (MD4_Go, c, d, a, b, w2_t[1], MD4C01, MD4S12); + MD4_STEP (MD4_Go, b, c, d, a, w3_t[1], MD4C01, MD4S13); + MD4_STEP (MD4_Go, a, b, c, d, w0_t[2], MD4C01, MD4S10); + MD4_STEP (MD4_Go, d, a, b, c, w1_t[2], MD4C01, MD4S11); + MD4_STEP (MD4_Go, c, d, a, b, w2_t[2], MD4C01, MD4S12); + MD4_STEP (MD4_Go, b, c, d, a, w3_t[2], MD4C01, MD4S13); + MD4_STEP (MD4_Go, a, b, c, d, w0_t[3], MD4C01, MD4S10); + MD4_STEP (MD4_Go, d, a, b, c, w1_t[3], MD4C01, MD4S11); + MD4_STEP (MD4_Go, c, d, a, b, w2_t[3], MD4C01, MD4S12); + MD4_STEP (MD4_Go, b, c, d, a, w3_t[3], MD4C01, MD4S13); + + MD4_STEP (MD4_H , a, b, c, d, w0_t[0], MD4C02, MD4S20); + MD4_STEP (MD4_H , d, a, b, c, w2_t[0], MD4C02, MD4S21); + MD4_STEP (MD4_H , c, d, a, b, w1_t[0], MD4C02, MD4S22); + MD4_STEP (MD4_H , b, c, d, a, w3_t[0], MD4C02, MD4S23); + MD4_STEP (MD4_H , a, b, c, d, w0_t[2], MD4C02, MD4S20); + MD4_STEP (MD4_H , d, a, b, c, w2_t[2], MD4C02, MD4S21); + MD4_STEP (MD4_H , c, d, a, b, w1_t[2], MD4C02, MD4S22); + MD4_STEP (MD4_H , b, c, d, a, w3_t[2], MD4C02, MD4S23); + MD4_STEP (MD4_H , a, b, c, d, w0_t[1], MD4C02, MD4S20); + MD4_STEP (MD4_H , d, a, b, c, w2_t[1], MD4C02, MD4S21); + MD4_STEP (MD4_H , c, d, a, b, w1_t[1], MD4C02, MD4S22); + MD4_STEP (MD4_H , b, c, d, a, w3_t[1], MD4C02, MD4S23); + MD4_STEP (MD4_H , a, b, c, d, w0_t[3], MD4C02, MD4S20); + MD4_STEP (MD4_H , d, a, b, c, w2_t[3], MD4C02, MD4S21); + MD4_STEP (MD4_H , c, d, a, b, w1_t[3], MD4C02, MD4S22); + MD4_STEP (MD4_H , b, c, d, a, w3_t[3], MD4C02, MD4S23); + + a += MD4M_A; + b += MD4M_B; + c += MD4M_C; + d += MD4M_D; + + w0_t[0] = a; + w0_t[1] = b; + w0_t[2] = c; + w0_t[3] = d; + w1_t[0] = salt_buf0[0]; + w1_t[1] = salt_buf0[1]; + w1_t[2] = salt_buf0[2]; + w1_t[3] = salt_buf0[3]; + w2_t[0] = salt_buf1[0]; + w2_t[1] = salt_buf1[1]; + w2_t[2] = salt_buf1[2]; + w2_t[3] = salt_buf1[3]; + w3_t[0] = salt_buf2[0]; + w3_t[1] = salt_buf2[1]; + w3_t[2] = (16 + salt_len) * 8; + w3_t[3] = 0; + + a = MD4M_A; + b = MD4M_B; + c = MD4M_C; + d = MD4M_D; + + MD4_STEP (MD4_Fo, a, b, c, d, w0_t[0], MD4C00, MD4S00); + MD4_STEP (MD4_Fo, d, a, b, c, w0_t[1], MD4C00, MD4S01); + MD4_STEP (MD4_Fo, c, d, a, b, w0_t[2], MD4C00, MD4S02); + MD4_STEP (MD4_Fo, b, c, d, a, w0_t[3], MD4C00, MD4S03); + MD4_STEP (MD4_Fo, a, b, c, d, w1_t[0], MD4C00, MD4S00); + MD4_STEP (MD4_Fo, d, a, b, c, w1_t[1], MD4C00, MD4S01); + MD4_STEP (MD4_Fo, c, d, a, b, w1_t[2], MD4C00, MD4S02); + MD4_STEP (MD4_Fo, b, c, d, a, w1_t[3], MD4C00, MD4S03); + MD4_STEP (MD4_Fo, a, b, c, d, w2_t[0], MD4C00, MD4S00); + MD4_STEP (MD4_Fo, d, a, b, c, w2_t[1], MD4C00, MD4S01); + MD4_STEP (MD4_Fo, c, d, a, b, w2_t[2], MD4C00, MD4S02); + MD4_STEP (MD4_Fo, b, c, d, a, w2_t[3], MD4C00, MD4S03); + MD4_STEP (MD4_Fo, a, b, c, d, w3_t[0], MD4C00, MD4S00); + MD4_STEP (MD4_Fo, d, a, b, c, w3_t[1], MD4C00, MD4S01); + MD4_STEP (MD4_Fo, c, d, a, b, w3_t[2], MD4C00, MD4S02); + MD4_STEP (MD4_Fo, b, c, d, a, w3_t[3], MD4C00, MD4S03); + + MD4_STEP (MD4_Go, a, b, c, d, w0_t[0], MD4C01, MD4S10); + MD4_STEP (MD4_Go, d, a, b, c, w1_t[0], MD4C01, MD4S11); + MD4_STEP (MD4_Go, c, d, a, b, w2_t[0], MD4C01, MD4S12); + MD4_STEP (MD4_Go, b, c, d, a, w3_t[0], MD4C01, MD4S13); + MD4_STEP (MD4_Go, a, b, c, d, w0_t[1], MD4C01, MD4S10); + MD4_STEP (MD4_Go, d, a, b, c, w1_t[1], MD4C01, MD4S11); + MD4_STEP (MD4_Go, c, d, a, b, w2_t[1], MD4C01, MD4S12); + MD4_STEP (MD4_Go, b, c, d, a, w3_t[1], MD4C01, MD4S13); + MD4_STEP (MD4_Go, a, b, c, d, w0_t[2], MD4C01, MD4S10); + MD4_STEP (MD4_Go, d, a, b, c, w1_t[2], MD4C01, MD4S11); + MD4_STEP (MD4_Go, c, d, a, b, w2_t[2], MD4C01, MD4S12); + MD4_STEP (MD4_Go, b, c, d, a, w3_t[2], MD4C01, MD4S13); + MD4_STEP (MD4_Go, a, b, c, d, w0_t[3], MD4C01, MD4S10); + MD4_STEP (MD4_Go, d, a, b, c, w1_t[3], MD4C01, MD4S11); + MD4_STEP (MD4_Go, c, d, a, b, w2_t[3], MD4C01, MD4S12); + MD4_STEP (MD4_Go, b, c, d, a, w3_t[3], MD4C01, MD4S13); + + MD4_STEP (MD4_H , a, b, c, d, w0_t[0], MD4C02, MD4S20); + MD4_STEP (MD4_H , d, a, b, c, w2_t[0], MD4C02, MD4S21); + MD4_STEP (MD4_H , c, d, a, b, w1_t[0], MD4C02, MD4S22); + MD4_STEP (MD4_H , b, c, d, a, w3_t[0], MD4C02, MD4S23); + MD4_STEP (MD4_H , a, b, c, d, w0_t[2], MD4C02, MD4S20); + MD4_STEP (MD4_H , d, a, b, c, w2_t[2], MD4C02, MD4S21); + MD4_STEP (MD4_H , c, d, a, b, w1_t[2], MD4C02, MD4S22); + MD4_STEP (MD4_H , b, c, d, a, w3_t[2], MD4C02, MD4S23); + MD4_STEP (MD4_H , a, b, c, d, w0_t[1], MD4C02, MD4S20); + MD4_STEP (MD4_H , d, a, b, c, w2_t[1], MD4C02, MD4S21); + MD4_STEP (MD4_H , c, d, a, b, w1_t[1], MD4C02, MD4S22); + MD4_STEP (MD4_H , b, c, d, a, w3_t[1], MD4C02, MD4S23); + MD4_STEP (MD4_H , a, b, c, d, w0_t[3], MD4C02, MD4S20); + MD4_STEP (MD4_H , d, a, b, c, w2_t[3], MD4C02, MD4S21); + MD4_STEP (MD4_H , c, d, a, b, w1_t[3], MD4C02, MD4S22); + MD4_STEP (MD4_H , b, c, d, a, w3_t[3], MD4C02, MD4S23); + + const u32x r0 = a; + const u32x r1 = d; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_M + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m01100_m08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m01100_m16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m01100_s04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + append_0x80_2 (wordl0, wordl1, pw_l_len); + + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, combs_buf[0].pw_len); + } + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[ 1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[ 2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[ 3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[ 4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[ 5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[ 6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[ 7]; + + u32 salt_buf2[4]; + + salt_buf2[0] = salt_bufs[salt_pos].salt_buf[ 8]; + salt_buf2[1] = salt_bufs[salt_pos].salt_buf[ 9]; + salt_buf2[2] = 0; + salt_buf2[3] = 0; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = combs_buf[il_pos].pw_len; + + const u32 pw_len = pw_l_len + pw_r_len; + + u32 wordr0[4]; + + wordr0[0] = combs_buf[il_pos].i[0]; + wordr0[1] = combs_buf[il_pos].i[1]; + wordr0[2] = combs_buf[il_pos].i[2]; + wordr0[3] = combs_buf[il_pos].i[3]; + + u32 wordr1[4]; + + wordr1[0] = combs_buf[il_pos].i[4]; + wordr1[1] = combs_buf[il_pos].i[5]; + wordr1[2] = combs_buf[il_pos].i[6]; + wordr1[3] = combs_buf[il_pos].i[7]; + + u32 wordr2[4]; + + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + + u32 wordr3[4]; + + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + u32x w0[4]; + + w0[0] = wordl0[0] | wordr0[0]; + w0[1] = wordl0[1] | wordr0[1]; + w0[2] = wordl0[2] | wordr0[2]; + w0[3] = wordl0[3] | wordr0[3]; + + u32x w1[4]; + + w1[0] = wordl1[0] | wordr1[0]; + w1[1] = wordl1[1] | wordr1[1]; + w1[2] = wordl1[2] | wordr1[2]; + w1[3] = wordl1[3] | wordr1[3]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + make_unicode (w0, w0_t, w1_t); + make_unicode (w1, w2_t, w3_t); + + w3_t[2] = pw_len * 8 * 2; + + u32x a = MD4M_A; + u32x b = MD4M_B; + u32x c = MD4M_C; + u32x d = MD4M_D; + + MD4_STEP (MD4_Fo, a, b, c, d, w0_t[0], MD4C00, MD4S00); + MD4_STEP (MD4_Fo, d, a, b, c, w0_t[1], MD4C00, MD4S01); + MD4_STEP (MD4_Fo, c, d, a, b, w0_t[2], MD4C00, MD4S02); + MD4_STEP (MD4_Fo, b, c, d, a, w0_t[3], MD4C00, MD4S03); + MD4_STEP (MD4_Fo, a, b, c, d, w1_t[0], MD4C00, MD4S00); + MD4_STEP (MD4_Fo, d, a, b, c, w1_t[1], MD4C00, MD4S01); + MD4_STEP (MD4_Fo, c, d, a, b, w1_t[2], MD4C00, MD4S02); + MD4_STEP (MD4_Fo, b, c, d, a, w1_t[3], MD4C00, MD4S03); + MD4_STEP (MD4_Fo, a, b, c, d, w2_t[0], MD4C00, MD4S00); + MD4_STEP (MD4_Fo, d, a, b, c, w2_t[1], MD4C00, MD4S01); + MD4_STEP (MD4_Fo, c, d, a, b, w2_t[2], MD4C00, MD4S02); + MD4_STEP (MD4_Fo, b, c, d, a, w2_t[3], MD4C00, MD4S03); + MD4_STEP (MD4_Fo, a, b, c, d, w3_t[0], MD4C00, MD4S00); + MD4_STEP (MD4_Fo, d, a, b, c, w3_t[1], MD4C00, MD4S01); + MD4_STEP (MD4_Fo, c, d, a, b, w3_t[2], MD4C00, MD4S02); + MD4_STEP (MD4_Fo, b, c, d, a, w3_t[3], MD4C00, MD4S03); + + MD4_STEP (MD4_Go, a, b, c, d, w0_t[0], MD4C01, MD4S10); + MD4_STEP (MD4_Go, d, a, b, c, w1_t[0], MD4C01, MD4S11); + MD4_STEP (MD4_Go, c, d, a, b, w2_t[0], MD4C01, MD4S12); + MD4_STEP (MD4_Go, b, c, d, a, w3_t[0], MD4C01, MD4S13); + MD4_STEP (MD4_Go, a, b, c, d, w0_t[1], MD4C01, MD4S10); + MD4_STEP (MD4_Go, d, a, b, c, w1_t[1], MD4C01, MD4S11); + MD4_STEP (MD4_Go, c, d, a, b, w2_t[1], MD4C01, MD4S12); + MD4_STEP (MD4_Go, b, c, d, a, w3_t[1], MD4C01, MD4S13); + MD4_STEP (MD4_Go, a, b, c, d, w0_t[2], MD4C01, MD4S10); + MD4_STEP (MD4_Go, d, a, b, c, w1_t[2], MD4C01, MD4S11); + MD4_STEP (MD4_Go, c, d, a, b, w2_t[2], MD4C01, MD4S12); + MD4_STEP (MD4_Go, b, c, d, a, w3_t[2], MD4C01, MD4S13); + MD4_STEP (MD4_Go, a, b, c, d, w0_t[3], MD4C01, MD4S10); + MD4_STEP (MD4_Go, d, a, b, c, w1_t[3], MD4C01, MD4S11); + MD4_STEP (MD4_Go, c, d, a, b, w2_t[3], MD4C01, MD4S12); + MD4_STEP (MD4_Go, b, c, d, a, w3_t[3], MD4C01, MD4S13); + + MD4_STEP (MD4_H , a, b, c, d, w0_t[0], MD4C02, MD4S20); + MD4_STEP (MD4_H , d, a, b, c, w2_t[0], MD4C02, MD4S21); + MD4_STEP (MD4_H , c, d, a, b, w1_t[0], MD4C02, MD4S22); + MD4_STEP (MD4_H , b, c, d, a, w3_t[0], MD4C02, MD4S23); + MD4_STEP (MD4_H , a, b, c, d, w0_t[2], MD4C02, MD4S20); + MD4_STEP (MD4_H , d, a, b, c, w2_t[2], MD4C02, MD4S21); + MD4_STEP (MD4_H , c, d, a, b, w1_t[2], MD4C02, MD4S22); + MD4_STEP (MD4_H , b, c, d, a, w3_t[2], MD4C02, MD4S23); + MD4_STEP (MD4_H , a, b, c, d, w0_t[1], MD4C02, MD4S20); + MD4_STEP (MD4_H , d, a, b, c, w2_t[1], MD4C02, MD4S21); + MD4_STEP (MD4_H , c, d, a, b, w1_t[1], MD4C02, MD4S22); + MD4_STEP (MD4_H , b, c, d, a, w3_t[1], MD4C02, MD4S23); + MD4_STEP (MD4_H , a, b, c, d, w0_t[3], MD4C02, MD4S20); + MD4_STEP (MD4_H , d, a, b, c, w2_t[3], MD4C02, MD4S21); + MD4_STEP (MD4_H , c, d, a, b, w1_t[3], MD4C02, MD4S22); + MD4_STEP (MD4_H , b, c, d, a, w3_t[3], MD4C02, MD4S23); + + a += MD4M_A; + b += MD4M_B; + c += MD4M_C; + d += MD4M_D; + + w0_t[0] = a; + w0_t[1] = b; + w0_t[2] = c; + w0_t[3] = d; + w1_t[0] = salt_buf0[0]; + w1_t[1] = salt_buf0[1]; + w1_t[2] = salt_buf0[2]; + w1_t[3] = salt_buf0[3]; + w2_t[0] = salt_buf1[0]; + w2_t[1] = salt_buf1[1]; + w2_t[2] = salt_buf1[2]; + w2_t[3] = salt_buf1[3]; + w3_t[0] = salt_buf2[0]; + w3_t[1] = salt_buf2[1]; + w3_t[2] = (16 + salt_len) * 8; + w3_t[3] = 0; + + a = MD4M_A; + b = MD4M_B; + c = MD4M_C; + d = MD4M_D; + + MD4_STEP (MD4_Fo, a, b, c, d, w0_t[0], MD4C00, MD4S00); + MD4_STEP (MD4_Fo, d, a, b, c, w0_t[1], MD4C00, MD4S01); + MD4_STEP (MD4_Fo, c, d, a, b, w0_t[2], MD4C00, MD4S02); + MD4_STEP (MD4_Fo, b, c, d, a, w0_t[3], MD4C00, MD4S03); + MD4_STEP (MD4_Fo, a, b, c, d, w1_t[0], MD4C00, MD4S00); + MD4_STEP (MD4_Fo, d, a, b, c, w1_t[1], MD4C00, MD4S01); + MD4_STEP (MD4_Fo, c, d, a, b, w1_t[2], MD4C00, MD4S02); + MD4_STEP (MD4_Fo, b, c, d, a, w1_t[3], MD4C00, MD4S03); + MD4_STEP (MD4_Fo, a, b, c, d, w2_t[0], MD4C00, MD4S00); + MD4_STEP (MD4_Fo, d, a, b, c, w2_t[1], MD4C00, MD4S01); + MD4_STEP (MD4_Fo, c, d, a, b, w2_t[2], MD4C00, MD4S02); + MD4_STEP (MD4_Fo, b, c, d, a, w2_t[3], MD4C00, MD4S03); + MD4_STEP (MD4_Fo, a, b, c, d, w3_t[0], MD4C00, MD4S00); + MD4_STEP (MD4_Fo, d, a, b, c, w3_t[1], MD4C00, MD4S01); + MD4_STEP (MD4_Fo, c, d, a, b, w3_t[2], MD4C00, MD4S02); + MD4_STEP (MD4_Fo, b, c, d, a, w3_t[3], MD4C00, MD4S03); + + MD4_STEP (MD4_Go, a, b, c, d, w0_t[0], MD4C01, MD4S10); + MD4_STEP (MD4_Go, d, a, b, c, w1_t[0], MD4C01, MD4S11); + MD4_STEP (MD4_Go, c, d, a, b, w2_t[0], MD4C01, MD4S12); + MD4_STEP (MD4_Go, b, c, d, a, w3_t[0], MD4C01, MD4S13); + MD4_STEP (MD4_Go, a, b, c, d, w0_t[1], MD4C01, MD4S10); + MD4_STEP (MD4_Go, d, a, b, c, w1_t[1], MD4C01, MD4S11); + MD4_STEP (MD4_Go, c, d, a, b, w2_t[1], MD4C01, MD4S12); + MD4_STEP (MD4_Go, b, c, d, a, w3_t[1], MD4C01, MD4S13); + MD4_STEP (MD4_Go, a, b, c, d, w0_t[2], MD4C01, MD4S10); + MD4_STEP (MD4_Go, d, a, b, c, w1_t[2], MD4C01, MD4S11); + MD4_STEP (MD4_Go, c, d, a, b, w2_t[2], MD4C01, MD4S12); + MD4_STEP (MD4_Go, b, c, d, a, w3_t[2], MD4C01, MD4S13); + MD4_STEP (MD4_Go, a, b, c, d, w0_t[3], MD4C01, MD4S10); + MD4_STEP (MD4_Go, d, a, b, c, w1_t[3], MD4C01, MD4S11); + MD4_STEP (MD4_Go, c, d, a, b, w2_t[3], MD4C01, MD4S12); + MD4_STEP (MD4_Go, b, c, d, a, w3_t[3], MD4C01, MD4S13); + + MD4_STEP (MD4_H , a, b, c, d, w0_t[0], MD4C02, MD4S20); + MD4_STEP (MD4_H , d, a, b, c, w2_t[0], MD4C02, MD4S21); + MD4_STEP (MD4_H , c, d, a, b, w1_t[0], MD4C02, MD4S22); + MD4_STEP (MD4_H , b, c, d, a, w3_t[0], MD4C02, MD4S23); + MD4_STEP (MD4_H , a, b, c, d, w0_t[2], MD4C02, MD4S20); + MD4_STEP (MD4_H , d, a, b, c, w2_t[2], MD4C02, MD4S21); + MD4_STEP (MD4_H , c, d, a, b, w1_t[2], MD4C02, MD4S22); + MD4_STEP (MD4_H , b, c, d, a, w3_t[2], MD4C02, MD4S23); + MD4_STEP (MD4_H , a, b, c, d, w0_t[1], MD4C02, MD4S20); + MD4_STEP (MD4_H , d, a, b, c, w2_t[1], MD4C02, MD4S21); + MD4_STEP (MD4_H , c, d, a, b, w1_t[1], MD4C02, MD4S22); + MD4_STEP (MD4_H , b, c, d, a, w3_t[1], MD4C02, MD4S23); + MD4_STEP (MD4_H , a, b, c, d, w0_t[3], MD4C02, MD4S20); + + bool q_cond = allx (search[0] != a); + + if (q_cond) continue; + + MD4_STEP (MD4_H , d, a, b, c, w2_t[3], MD4C02, MD4S21); + MD4_STEP (MD4_H , c, d, a, b, w1_t[3], MD4C02, MD4S22); + MD4_STEP (MD4_H , b, c, d, a, w3_t[3], MD4C02, MD4S23); + + const u32x r0 = a; + const u32x r1 = d; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_S + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m01100_s08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m01100_s16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/amd/m01100_a3.cl b/amd/m01100_a3.cl new file mode 100644 index 0000000000..1c79c6f838 --- /dev/null +++ b/amd/m01100_a3.cl @@ -0,0 +1,729 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _MD4_ +#define _SCALAR_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW4 +#define VECT_SIZE4 +#endif + +#ifdef VLIW5 +#define VECT_SIZE4 +#endif + +#define DGST_R0 0 +#define DGST_R1 3 +#define DGST_R2 2 +#define DGST_R3 1 + +#include "include/kernel_functions.c" +#include "types_amd.c" +#include "common_amd.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4_warp.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4_warp.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4_warp.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4_warp.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4_warp.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4_warp.c" +#endif + +static void m01100m (u32 w[16], const u32 pw_len, __global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global u32x * words_buf_r, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset) +{ + /** + * modifier + */ + + const u32 gid = get_global_id (0); + const u32 lid = get_local_id (0); + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[ 1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[ 2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[ 3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[ 4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[ 5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[ 6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[ 7]; + + u32 salt_buf2[4]; + + salt_buf2[0] = salt_bufs[salt_pos].salt_buf[ 8]; + salt_buf2[1] = salt_bufs[salt_pos].salt_buf[ 9]; + salt_buf2[2] = 0; + salt_buf2[3] = 0; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + /** + * base + */ + + const u32 F_w0c00 = 0 + MD4C00; + const u32 F_w1c00 = w[ 1] + MD4C00; + const u32 F_w2c00 = w[ 2] + MD4C00; + const u32 F_w3c00 = w[ 3] + MD4C00; + const u32 F_w4c00 = w[ 4] + MD4C00; + const u32 F_w5c00 = w[ 5] + MD4C00; + const u32 F_w6c00 = w[ 6] + MD4C00; + const u32 F_w7c00 = w[ 7] + MD4C00; + const u32 F_w8c00 = w[ 8] + MD4C00; + const u32 F_w9c00 = w[ 9] + MD4C00; + const u32 F_wac00 = w[10] + MD4C00; + const u32 F_wbc00 = w[11] + MD4C00; + const u32 F_wcc00 = w[12] + MD4C00; + const u32 F_wdc00 = w[13] + MD4C00; + const u32 F_wec00 = w[14] + MD4C00; + const u32 F_wfc00 = w[15] + MD4C00; + + const u32 G_w0c01 = 0 + MD4C01; + const u32 G_w4c01 = w[ 4] + MD4C01; + const u32 G_w8c01 = w[ 8] + MD4C01; + const u32 G_wcc01 = w[12] + MD4C01; + const u32 G_w1c01 = w[ 1] + MD4C01; + const u32 G_w5c01 = w[ 5] + MD4C01; + const u32 G_w9c01 = w[ 9] + MD4C01; + const u32 G_wdc01 = w[13] + MD4C01; + const u32 G_w2c01 = w[ 2] + MD4C01; + const u32 G_w6c01 = w[ 6] + MD4C01; + const u32 G_wac01 = w[10] + MD4C01; + const u32 G_wec01 = w[14] + MD4C01; + const u32 G_w3c01 = w[ 3] + MD4C01; + const u32 G_w7c01 = w[ 7] + MD4C01; + const u32 G_wbc01 = w[11] + MD4C01; + const u32 G_wfc01 = w[15] + MD4C01; + + const u32 H_w0c02 = 0 + MD4C02; + const u32 H_w8c02 = w[ 8] + MD4C02; + const u32 H_w4c02 = w[ 4] + MD4C02; + const u32 H_wcc02 = w[12] + MD4C02; + const u32 H_w2c02 = w[ 2] + MD4C02; + const u32 H_wac02 = w[10] + MD4C02; + const u32 H_w6c02 = w[ 6] + MD4C02; + const u32 H_wec02 = w[14] + MD4C02; + const u32 H_w1c02 = w[ 1] + MD4C02; + const u32 H_w9c02 = w[ 9] + MD4C02; + const u32 H_w5c02 = w[ 5] + MD4C02; + const u32 H_wdc02 = w[13] + MD4C02; + const u32 H_w3c02 = w[ 3] + MD4C02; + const u32 H_wbc02 = w[11] + MD4C02; + const u32 H_w7c02 = w[ 7] + MD4C02; + const u32 H_wfc02 = w[15] + MD4C02; + + /** + * loop + */ + + const u32 bf_loops = ceil ((float) bfs_cnt / VECT_DIV); + + u32x w0l = w[0]; + + for (u32 il_pos = 0; il_pos < bf_loops; il_pos++) + { + const u32x w0r = words_buf_r[il_pos]; + + const u32x w0 = w0l | w0r; + + u32x a = MD4M_A; + u32x b = MD4M_B; + u32x c = MD4M_C; + u32x d = MD4M_D; + + MD4_STEP (MD4_Fo, a, b, c, d, w0, F_w0c00, MD4S00); + MD4_STEP0(MD4_Fo, d, a, b, c, F_w1c00, MD4S01); + MD4_STEP0(MD4_Fo, c, d, a, b, F_w2c00, MD4S02); + MD4_STEP0(MD4_Fo, b, c, d, a, F_w3c00, MD4S03); + MD4_STEP0(MD4_Fo, a, b, c, d, F_w4c00, MD4S00); + MD4_STEP0(MD4_Fo, d, a, b, c, F_w5c00, MD4S01); + MD4_STEP0(MD4_Fo, c, d, a, b, F_w6c00, MD4S02); + MD4_STEP0(MD4_Fo, b, c, d, a, F_w7c00, MD4S03); + MD4_STEP0(MD4_Fo, a, b, c, d, F_w8c00, MD4S00); + MD4_STEP0(MD4_Fo, d, a, b, c, F_w9c00, MD4S01); + MD4_STEP0(MD4_Fo, c, d, a, b, F_wac00, MD4S02); + MD4_STEP0(MD4_Fo, b, c, d, a, F_wbc00, MD4S03); + MD4_STEP0(MD4_Fo, a, b, c, d, F_wcc00, MD4S00); + MD4_STEP0(MD4_Fo, d, a, b, c, F_wdc00, MD4S01); + MD4_STEP0(MD4_Fo, c, d, a, b, F_wec00, MD4S02); + MD4_STEP0(MD4_Fo, b, c, d, a, F_wfc00, MD4S03); + + MD4_STEP (MD4_Go, a, b, c, d, w0, G_w0c01, MD4S10); + MD4_STEP0(MD4_Go, d, a, b, c, G_w4c01, MD4S11); + MD4_STEP0(MD4_Go, c, d, a, b, G_w8c01, MD4S12); + MD4_STEP0(MD4_Go, b, c, d, a, G_wcc01, MD4S13); + MD4_STEP0(MD4_Go, a, b, c, d, G_w1c01, MD4S10); + MD4_STEP0(MD4_Go, d, a, b, c, G_w5c01, MD4S11); + MD4_STEP0(MD4_Go, c, d, a, b, G_w9c01, MD4S12); + MD4_STEP0(MD4_Go, b, c, d, a, G_wdc01, MD4S13); + MD4_STEP0(MD4_Go, a, b, c, d, G_w2c01, MD4S10); + MD4_STEP0(MD4_Go, d, a, b, c, G_w6c01, MD4S11); + MD4_STEP0(MD4_Go, c, d, a, b, G_wac01, MD4S12); + MD4_STEP0(MD4_Go, b, c, d, a, G_wec01, MD4S13); + MD4_STEP0(MD4_Go, a, b, c, d, G_w3c01, MD4S10); + MD4_STEP0(MD4_Go, d, a, b, c, G_w7c01, MD4S11); + MD4_STEP0(MD4_Go, c, d, a, b, G_wbc01, MD4S12); + MD4_STEP0(MD4_Go, b, c, d, a, G_wfc01, MD4S13); + + MD4_STEP (MD4_H , a, b, c, d, w0, H_w0c02, MD4S20); + MD4_STEP0(MD4_H , d, a, b, c, H_w8c02, MD4S21); + MD4_STEP0(MD4_H , c, d, a, b, H_w4c02, MD4S22); + MD4_STEP0(MD4_H , b, c, d, a, H_wcc02, MD4S23); + MD4_STEP0(MD4_H , a, b, c, d, H_w2c02, MD4S20); + MD4_STEP0(MD4_H , d, a, b, c, H_wac02, MD4S21); + MD4_STEP0(MD4_H , c, d, a, b, H_w6c02, MD4S22); + MD4_STEP0(MD4_H , b, c, d, a, H_wec02, MD4S23); + MD4_STEP0(MD4_H , a, b, c, d, H_w1c02, MD4S20); + MD4_STEP0(MD4_H , d, a, b, c, H_w9c02, MD4S21); + MD4_STEP0(MD4_H , c, d, a, b, H_w5c02, MD4S22); + MD4_STEP0(MD4_H , b, c, d, a, H_wdc02, MD4S23); + MD4_STEP0(MD4_H , a, b, c, d, H_w3c02, MD4S20); + MD4_STEP0(MD4_H , d, a, b, c, H_wbc02, MD4S21); + MD4_STEP0(MD4_H , c, d, a, b, H_w7c02, MD4S22); + MD4_STEP0(MD4_H , b, c, d, a, H_wfc02, MD4S23); + + a += MD4M_A; + b += MD4M_B; + c += MD4M_C; + d += MD4M_D; + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + w0_t[0] = a; + w0_t[1] = b; + w0_t[2] = c; + w0_t[3] = d; + w1_t[0] = salt_buf0[0]; + w1_t[1] = salt_buf0[1]; + w1_t[2] = salt_buf0[2]; + w1_t[3] = salt_buf0[3]; + w2_t[0] = salt_buf1[0]; + w2_t[1] = salt_buf1[1]; + w2_t[2] = salt_buf1[2]; + w2_t[3] = salt_buf1[3]; + w3_t[0] = salt_buf2[0]; + w3_t[1] = salt_buf2[1]; + w3_t[2] = (16 + salt_len) * 8; + w3_t[3] = 0; + + a = MD4M_A; + b = MD4M_B; + c = MD4M_C; + d = MD4M_D; + + MD4_STEP (MD4_Fo, a, b, c, d, w0_t[0], MD4C00, MD4S00); + MD4_STEP (MD4_Fo, d, a, b, c, w0_t[1], MD4C00, MD4S01); + MD4_STEP (MD4_Fo, c, d, a, b, w0_t[2], MD4C00, MD4S02); + MD4_STEP (MD4_Fo, b, c, d, a, w0_t[3], MD4C00, MD4S03); + MD4_STEP (MD4_Fo, a, b, c, d, w1_t[0], MD4C00, MD4S00); + MD4_STEP (MD4_Fo, d, a, b, c, w1_t[1], MD4C00, MD4S01); + MD4_STEP (MD4_Fo, c, d, a, b, w1_t[2], MD4C00, MD4S02); + MD4_STEP (MD4_Fo, b, c, d, a, w1_t[3], MD4C00, MD4S03); + MD4_STEP (MD4_Fo, a, b, c, d, w2_t[0], MD4C00, MD4S00); + MD4_STEP (MD4_Fo, d, a, b, c, w2_t[1], MD4C00, MD4S01); + MD4_STEP (MD4_Fo, c, d, a, b, w2_t[2], MD4C00, MD4S02); + MD4_STEP (MD4_Fo, b, c, d, a, w2_t[3], MD4C00, MD4S03); + MD4_STEP (MD4_Fo, a, b, c, d, w3_t[0], MD4C00, MD4S00); + MD4_STEP (MD4_Fo, d, a, b, c, w3_t[1], MD4C00, MD4S01); + MD4_STEP (MD4_Fo, c, d, a, b, w3_t[2], MD4C00, MD4S02); + MD4_STEP (MD4_Fo, b, c, d, a, w3_t[3], MD4C00, MD4S03); + + MD4_STEP (MD4_Go, a, b, c, d, w0_t[0], MD4C01, MD4S10); + MD4_STEP (MD4_Go, d, a, b, c, w1_t[0], MD4C01, MD4S11); + MD4_STEP (MD4_Go, c, d, a, b, w2_t[0], MD4C01, MD4S12); + MD4_STEP (MD4_Go, b, c, d, a, w3_t[0], MD4C01, MD4S13); + MD4_STEP (MD4_Go, a, b, c, d, w0_t[1], MD4C01, MD4S10); + MD4_STEP (MD4_Go, d, a, b, c, w1_t[1], MD4C01, MD4S11); + MD4_STEP (MD4_Go, c, d, a, b, w2_t[1], MD4C01, MD4S12); + MD4_STEP (MD4_Go, b, c, d, a, w3_t[1], MD4C01, MD4S13); + MD4_STEP (MD4_Go, a, b, c, d, w0_t[2], MD4C01, MD4S10); + MD4_STEP (MD4_Go, d, a, b, c, w1_t[2], MD4C01, MD4S11); + MD4_STEP (MD4_Go, c, d, a, b, w2_t[2], MD4C01, MD4S12); + MD4_STEP (MD4_Go, b, c, d, a, w3_t[2], MD4C01, MD4S13); + MD4_STEP (MD4_Go, a, b, c, d, w0_t[3], MD4C01, MD4S10); + MD4_STEP (MD4_Go, d, a, b, c, w1_t[3], MD4C01, MD4S11); + MD4_STEP (MD4_Go, c, d, a, b, w2_t[3], MD4C01, MD4S12); + MD4_STEP (MD4_Go, b, c, d, a, w3_t[3], MD4C01, MD4S13); + + MD4_STEP (MD4_H , a, b, c, d, w0_t[0], MD4C02, MD4S20); + MD4_STEP (MD4_H , d, a, b, c, w2_t[0], MD4C02, MD4S21); + MD4_STEP (MD4_H , c, d, a, b, w1_t[0], MD4C02, MD4S22); + MD4_STEP (MD4_H , b, c, d, a, w3_t[0], MD4C02, MD4S23); + MD4_STEP (MD4_H , a, b, c, d, w0_t[2], MD4C02, MD4S20); + MD4_STEP (MD4_H , d, a, b, c, w2_t[2], MD4C02, MD4S21); + MD4_STEP (MD4_H , c, d, a, b, w1_t[2], MD4C02, MD4S22); + MD4_STEP (MD4_H , b, c, d, a, w3_t[2], MD4C02, MD4S23); + MD4_STEP (MD4_H , a, b, c, d, w0_t[1], MD4C02, MD4S20); + MD4_STEP (MD4_H , d, a, b, c, w2_t[1], MD4C02, MD4S21); + MD4_STEP (MD4_H , c, d, a, b, w1_t[1], MD4C02, MD4S22); + MD4_STEP (MD4_H , b, c, d, a, w3_t[1], MD4C02, MD4S23); + MD4_STEP (MD4_H , a, b, c, d, w0_t[3], MD4C02, MD4S20); + MD4_STEP (MD4_H , d, a, b, c, w2_t[3], MD4C02, MD4S21); + MD4_STEP (MD4_H , c, d, a, b, w1_t[3], MD4C02, MD4S22); + MD4_STEP (MD4_H , b, c, d, a, w3_t[3], MD4C02, MD4S23); + + const u32x r0 = a; + const u32x r1 = d; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_M + } +} + +static void m01100s (u32 w[16], const u32 pw_len, __global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global u32x * words_buf_r, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset) +{ + /** + * modifier + */ + + const u32 gid = get_global_id (0); + const u32 lid = get_local_id (0); + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[ 1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[ 2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[ 3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[ 4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[ 5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[ 6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[ 7]; + + u32 salt_buf2[4]; + + salt_buf2[0] = salt_bufs[salt_pos].salt_buf[ 8]; + salt_buf2[1] = salt_bufs[salt_pos].salt_buf[ 9]; + salt_buf2[2] = 0; + salt_buf2[3] = 0; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + /** + * base + */ + + const u32 F_w0c00 = 0 + MD4C00; + const u32 F_w1c00 = w[ 1] + MD4C00; + const u32 F_w2c00 = w[ 2] + MD4C00; + const u32 F_w3c00 = w[ 3] + MD4C00; + const u32 F_w4c00 = w[ 4] + MD4C00; + const u32 F_w5c00 = w[ 5] + MD4C00; + const u32 F_w6c00 = w[ 6] + MD4C00; + const u32 F_w7c00 = w[ 7] + MD4C00; + const u32 F_w8c00 = w[ 8] + MD4C00; + const u32 F_w9c00 = w[ 9] + MD4C00; + const u32 F_wac00 = w[10] + MD4C00; + const u32 F_wbc00 = w[11] + MD4C00; + const u32 F_wcc00 = w[12] + MD4C00; + const u32 F_wdc00 = w[13] + MD4C00; + const u32 F_wec00 = w[14] + MD4C00; + const u32 F_wfc00 = w[15] + MD4C00; + + const u32 G_w0c01 = 0 + MD4C01; + const u32 G_w4c01 = w[ 4] + MD4C01; + const u32 G_w8c01 = w[ 8] + MD4C01; + const u32 G_wcc01 = w[12] + MD4C01; + const u32 G_w1c01 = w[ 1] + MD4C01; + const u32 G_w5c01 = w[ 5] + MD4C01; + const u32 G_w9c01 = w[ 9] + MD4C01; + const u32 G_wdc01 = w[13] + MD4C01; + const u32 G_w2c01 = w[ 2] + MD4C01; + const u32 G_w6c01 = w[ 6] + MD4C01; + const u32 G_wac01 = w[10] + MD4C01; + const u32 G_wec01 = w[14] + MD4C01; + const u32 G_w3c01 = w[ 3] + MD4C01; + const u32 G_w7c01 = w[ 7] + MD4C01; + const u32 G_wbc01 = w[11] + MD4C01; + const u32 G_wfc01 = w[15] + MD4C01; + + const u32 H_w0c02 = 0 + MD4C02; + const u32 H_w8c02 = w[ 8] + MD4C02; + const u32 H_w4c02 = w[ 4] + MD4C02; + const u32 H_wcc02 = w[12] + MD4C02; + const u32 H_w2c02 = w[ 2] + MD4C02; + const u32 H_wac02 = w[10] + MD4C02; + const u32 H_w6c02 = w[ 6] + MD4C02; + const u32 H_wec02 = w[14] + MD4C02; + const u32 H_w1c02 = w[ 1] + MD4C02; + const u32 H_w9c02 = w[ 9] + MD4C02; + const u32 H_w5c02 = w[ 5] + MD4C02; + const u32 H_wdc02 = w[13] + MD4C02; + const u32 H_w3c02 = w[ 3] + MD4C02; + const u32 H_wbc02 = w[11] + MD4C02; + const u32 H_w7c02 = w[ 7] + MD4C02; + const u32 H_wfc02 = w[15] + MD4C02; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * loop + */ + + const u32 bf_loops = ceil ((float) bfs_cnt / VECT_DIV); + + u32x w0l = w[0]; + + for (u32 il_pos = 0; il_pos < bf_loops; il_pos++) + { + const u32x w0r = words_buf_r[il_pos]; + + const u32x w0 = w0l | w0r; + + u32x a = MD4M_A; + u32x b = MD4M_B; + u32x c = MD4M_C; + u32x d = MD4M_D; + + MD4_STEP (MD4_Fo, a, b, c, d, w0, F_w0c00, MD4S00); + MD4_STEP0(MD4_Fo, d, a, b, c, F_w1c00, MD4S01); + MD4_STEP0(MD4_Fo, c, d, a, b, F_w2c00, MD4S02); + MD4_STEP0(MD4_Fo, b, c, d, a, F_w3c00, MD4S03); + MD4_STEP0(MD4_Fo, a, b, c, d, F_w4c00, MD4S00); + MD4_STEP0(MD4_Fo, d, a, b, c, F_w5c00, MD4S01); + MD4_STEP0(MD4_Fo, c, d, a, b, F_w6c00, MD4S02); + MD4_STEP0(MD4_Fo, b, c, d, a, F_w7c00, MD4S03); + MD4_STEP0(MD4_Fo, a, b, c, d, F_w8c00, MD4S00); + MD4_STEP0(MD4_Fo, d, a, b, c, F_w9c00, MD4S01); + MD4_STEP0(MD4_Fo, c, d, a, b, F_wac00, MD4S02); + MD4_STEP0(MD4_Fo, b, c, d, a, F_wbc00, MD4S03); + MD4_STEP0(MD4_Fo, a, b, c, d, F_wcc00, MD4S00); + MD4_STEP0(MD4_Fo, d, a, b, c, F_wdc00, MD4S01); + MD4_STEP0(MD4_Fo, c, d, a, b, F_wec00, MD4S02); + MD4_STEP0(MD4_Fo, b, c, d, a, F_wfc00, MD4S03); + + MD4_STEP (MD4_Go, a, b, c, d, w0, G_w0c01, MD4S10); + MD4_STEP0(MD4_Go, d, a, b, c, G_w4c01, MD4S11); + MD4_STEP0(MD4_Go, c, d, a, b, G_w8c01, MD4S12); + MD4_STEP0(MD4_Go, b, c, d, a, G_wcc01, MD4S13); + MD4_STEP0(MD4_Go, a, b, c, d, G_w1c01, MD4S10); + MD4_STEP0(MD4_Go, d, a, b, c, G_w5c01, MD4S11); + MD4_STEP0(MD4_Go, c, d, a, b, G_w9c01, MD4S12); + MD4_STEP0(MD4_Go, b, c, d, a, G_wdc01, MD4S13); + MD4_STEP0(MD4_Go, a, b, c, d, G_w2c01, MD4S10); + MD4_STEP0(MD4_Go, d, a, b, c, G_w6c01, MD4S11); + MD4_STEP0(MD4_Go, c, d, a, b, G_wac01, MD4S12); + MD4_STEP0(MD4_Go, b, c, d, a, G_wec01, MD4S13); + MD4_STEP0(MD4_Go, a, b, c, d, G_w3c01, MD4S10); + MD4_STEP0(MD4_Go, d, a, b, c, G_w7c01, MD4S11); + MD4_STEP0(MD4_Go, c, d, a, b, G_wbc01, MD4S12); + MD4_STEP0(MD4_Go, b, c, d, a, G_wfc01, MD4S13); + + MD4_STEP (MD4_H , a, b, c, d, w0, H_w0c02, MD4S20); + MD4_STEP0(MD4_H , d, a, b, c, H_w8c02, MD4S21); + MD4_STEP0(MD4_H , c, d, a, b, H_w4c02, MD4S22); + MD4_STEP0(MD4_H , b, c, d, a, H_wcc02, MD4S23); + MD4_STEP0(MD4_H , a, b, c, d, H_w2c02, MD4S20); + MD4_STEP0(MD4_H , d, a, b, c, H_wac02, MD4S21); + MD4_STEP0(MD4_H , c, d, a, b, H_w6c02, MD4S22); + MD4_STEP0(MD4_H , b, c, d, a, H_wec02, MD4S23); + MD4_STEP0(MD4_H , a, b, c, d, H_w1c02, MD4S20); + MD4_STEP0(MD4_H , d, a, b, c, H_w9c02, MD4S21); + MD4_STEP0(MD4_H , c, d, a, b, H_w5c02, MD4S22); + MD4_STEP0(MD4_H , b, c, d, a, H_wdc02, MD4S23); + MD4_STEP0(MD4_H , a, b, c, d, H_w3c02, MD4S20); + MD4_STEP0(MD4_H , d, a, b, c, H_wbc02, MD4S21); + MD4_STEP0(MD4_H , c, d, a, b, H_w7c02, MD4S22); + MD4_STEP0(MD4_H , b, c, d, a, H_wfc02, MD4S23); + + a += MD4M_A; + b += MD4M_B; + c += MD4M_C; + d += MD4M_D; + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + w0_t[0] = a; + w0_t[1] = b; + w0_t[2] = c; + w0_t[3] = d; + w1_t[0] = salt_buf0[0]; + w1_t[1] = salt_buf0[1]; + w1_t[2] = salt_buf0[2]; + w1_t[3] = salt_buf0[3]; + w2_t[0] = salt_buf1[0]; + w2_t[1] = salt_buf1[1]; + w2_t[2] = salt_buf1[2]; + w2_t[3] = salt_buf1[3]; + w3_t[0] = salt_buf2[0]; + w3_t[1] = salt_buf2[1]; + w3_t[2] = (16 + salt_len) * 8; + w3_t[3] = 0; + + a = MD4M_A; + b = MD4M_B; + c = MD4M_C; + d = MD4M_D; + + MD4_STEP (MD4_Fo, a, b, c, d, w0_t[0], MD4C00, MD4S00); + MD4_STEP (MD4_Fo, d, a, b, c, w0_t[1], MD4C00, MD4S01); + MD4_STEP (MD4_Fo, c, d, a, b, w0_t[2], MD4C00, MD4S02); + MD4_STEP (MD4_Fo, b, c, d, a, w0_t[3], MD4C00, MD4S03); + MD4_STEP (MD4_Fo, a, b, c, d, w1_t[0], MD4C00, MD4S00); + MD4_STEP (MD4_Fo, d, a, b, c, w1_t[1], MD4C00, MD4S01); + MD4_STEP (MD4_Fo, c, d, a, b, w1_t[2], MD4C00, MD4S02); + MD4_STEP (MD4_Fo, b, c, d, a, w1_t[3], MD4C00, MD4S03); + MD4_STEP (MD4_Fo, a, b, c, d, w2_t[0], MD4C00, MD4S00); + MD4_STEP (MD4_Fo, d, a, b, c, w2_t[1], MD4C00, MD4S01); + MD4_STEP (MD4_Fo, c, d, a, b, w2_t[2], MD4C00, MD4S02); + MD4_STEP (MD4_Fo, b, c, d, a, w2_t[3], MD4C00, MD4S03); + MD4_STEP (MD4_Fo, a, b, c, d, w3_t[0], MD4C00, MD4S00); + MD4_STEP (MD4_Fo, d, a, b, c, w3_t[1], MD4C00, MD4S01); + MD4_STEP (MD4_Fo, c, d, a, b, w3_t[2], MD4C00, MD4S02); + MD4_STEP (MD4_Fo, b, c, d, a, w3_t[3], MD4C00, MD4S03); + + MD4_STEP (MD4_Go, a, b, c, d, w0_t[0], MD4C01, MD4S10); + MD4_STEP (MD4_Go, d, a, b, c, w1_t[0], MD4C01, MD4S11); + MD4_STEP (MD4_Go, c, d, a, b, w2_t[0], MD4C01, MD4S12); + MD4_STEP (MD4_Go, b, c, d, a, w3_t[0], MD4C01, MD4S13); + MD4_STEP (MD4_Go, a, b, c, d, w0_t[1], MD4C01, MD4S10); + MD4_STEP (MD4_Go, d, a, b, c, w1_t[1], MD4C01, MD4S11); + MD4_STEP (MD4_Go, c, d, a, b, w2_t[1], MD4C01, MD4S12); + MD4_STEP (MD4_Go, b, c, d, a, w3_t[1], MD4C01, MD4S13); + MD4_STEP (MD4_Go, a, b, c, d, w0_t[2], MD4C01, MD4S10); + MD4_STEP (MD4_Go, d, a, b, c, w1_t[2], MD4C01, MD4S11); + MD4_STEP (MD4_Go, c, d, a, b, w2_t[2], MD4C01, MD4S12); + MD4_STEP (MD4_Go, b, c, d, a, w3_t[2], MD4C01, MD4S13); + MD4_STEP (MD4_Go, a, b, c, d, w0_t[3], MD4C01, MD4S10); + MD4_STEP (MD4_Go, d, a, b, c, w1_t[3], MD4C01, MD4S11); + MD4_STEP (MD4_Go, c, d, a, b, w2_t[3], MD4C01, MD4S12); + MD4_STEP (MD4_Go, b, c, d, a, w3_t[3], MD4C01, MD4S13); + + MD4_STEP (MD4_H , a, b, c, d, w0_t[0], MD4C02, MD4S20); + MD4_STEP (MD4_H , d, a, b, c, w2_t[0], MD4C02, MD4S21); + MD4_STEP (MD4_H , c, d, a, b, w1_t[0], MD4C02, MD4S22); + MD4_STEP (MD4_H , b, c, d, a, w3_t[0], MD4C02, MD4S23); + MD4_STEP (MD4_H , a, b, c, d, w0_t[2], MD4C02, MD4S20); + MD4_STEP (MD4_H , d, a, b, c, w2_t[2], MD4C02, MD4S21); + MD4_STEP (MD4_H , c, d, a, b, w1_t[2], MD4C02, MD4S22); + MD4_STEP (MD4_H , b, c, d, a, w3_t[2], MD4C02, MD4S23); + MD4_STEP (MD4_H , a, b, c, d, w0_t[1], MD4C02, MD4S20); + MD4_STEP (MD4_H , d, a, b, c, w2_t[1], MD4C02, MD4S21); + MD4_STEP (MD4_H , c, d, a, b, w1_t[1], MD4C02, MD4S22); + MD4_STEP (MD4_H , b, c, d, a, w3_t[1], MD4C02, MD4S23); + MD4_STEP (MD4_H , a, b, c, d, w0_t[3], MD4C02, MD4S20); + + bool q_cond = allx (search[0] != a); + + if (q_cond) continue; + + MD4_STEP (MD4_H , d, a, b, c, w2_t[3], MD4C02, MD4S21); + MD4_STEP (MD4_H , c, d, a, b, w1_t[3], MD4C02, MD4S22); + MD4_STEP (MD4_H , b, c, d, a, w3_t[3], MD4C02, MD4S23); + + const u32x r0 = a; + const u32x r1 = d; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_S + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m01100_m04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global u32x * words_buf_r, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32 w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = 0; + w[ 5] = 0; + w[ 6] = 0; + w[ 7] = 0; + w[ 8] = 0; + w[ 9] = 0; + w[10] = 0; + w[11] = 0; + w[12] = 0; + w[13] = 0; + w[14] = pws[gid].i[14]; + w[15] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m01100m (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m01100_m08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global u32x * words_buf_r, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32 w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = pws[gid].i[ 4]; + w[ 5] = pws[gid].i[ 5]; + w[ 6] = pws[gid].i[ 6]; + w[ 7] = pws[gid].i[ 7]; + w[ 8] = 0; + w[ 9] = 0; + w[10] = 0; + w[11] = 0; + w[12] = 0; + w[13] = 0; + w[14] = pws[gid].i[14]; + w[15] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m01100m (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m01100_m16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global u32x * words_buf_r, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m01100_s04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global u32x * words_buf_r, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32 w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = 0; + w[ 5] = 0; + w[ 6] = 0; + w[ 7] = 0; + w[ 8] = 0; + w[ 9] = 0; + w[10] = 0; + w[11] = 0; + w[12] = 0; + w[13] = 0; + w[14] = pws[gid].i[14]; + w[15] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m01100s (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m01100_s08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global u32x * words_buf_r, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32 w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = pws[gid].i[ 4]; + w[ 5] = pws[gid].i[ 5]; + w[ 6] = pws[gid].i[ 6]; + w[ 7] = pws[gid].i[ 7]; + w[ 8] = 0; + w[ 9] = 0; + w[10] = 0; + w[11] = 0; + w[12] = 0; + w[13] = 0; + w[14] = pws[gid].i[14]; + w[15] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m01100s (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m01100_s16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global u32x * words_buf_r, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/amd/m01400_a0.cl b/amd/m01400_a0.cl new file mode 100644 index 0000000000..37e37381b3 --- /dev/null +++ b/amd/m01400_a0.cl @@ -0,0 +1,431 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _SHA256_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW4 +#define VECT_SIZE2 +#endif + +#ifdef VLIW5 +#define VECT_SIZE2 +#endif + +#define DGST_R0 3 +#define DGST_R1 7 +#define DGST_R2 2 +#define DGST_R3 6 + +#include "include/kernel_functions.c" +#include "types_amd.c" +#include "common_amd.c" +#include "include/rp_gpu.h" +#include "rp_amd.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m01400_m04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + u32x pw_buf1[4]; + + pw_buf1[0] = pws[gid].i[ 4]; + pw_buf1[1] = pws[gid].i[ 5]; + pw_buf1[2] = pws[gid].i[ 6]; + pw_buf1[3] = pws[gid].i[ 7]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + + w0[0] = pw_buf0[0]; + w0[1] = pw_buf0[1]; + w0[2] = pw_buf0[2]; + w0[3] = pw_buf0[3]; + + u32x w1[4]; + + w1[0] = pw_buf1[0]; + w1[1] = pw_buf1[1]; + w1[2] = pw_buf1[2]; + w1[3] = pw_buf1[3]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 out_len = apply_rules (rules_buf[il_pos].cmds, w0, w1, pw_len); + + append_0x80_2 (w0, w1, out_len); + + /** + * SHA256 + */ + + u32x w0_t = swap_workaround (w0[0]); + u32x w1_t = swap_workaround (w0[1]); + u32x w2_t = swap_workaround (w0[2]); + u32x w3_t = swap_workaround (w0[3]); + u32x w4_t = swap_workaround (w1[0]); + u32x w5_t = swap_workaround (w1[1]); + u32x w6_t = swap_workaround (w1[2]); + u32x w7_t = swap_workaround (w1[3]); + u32x w8_t = 0; + u32x w9_t = 0; + u32x wa_t = 0; + u32x wb_t = 0; + u32x wc_t = 0; + u32x wd_t = 0; + u32x we_t = 0; + u32x wf_t = out_len * 8; + + u32x a = SHA256M_A; + u32x b = SHA256M_B; + u32x c = SHA256M_C; + u32x d = SHA256M_D; + u32x e = SHA256M_E; + u32x f = SHA256M_F; + u32x g = SHA256M_G; + u32x h = SHA256M_H; + + SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C00); + SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C01); + SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C02); + SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C03); + SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C04); + SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C05); + SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C06); + SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C07); + SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C08); + SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C09); + SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C0a); + SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C0b); + SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C0c); + SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C0d); + SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C0e); + SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C0f); + + w0_t = SHA256_EXPAND (we_t, w9_t, w1_t, w0_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C10); + w1_t = SHA256_EXPAND (wf_t, wa_t, w2_t, w1_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C11); + w2_t = SHA256_EXPAND (w0_t, wb_t, w3_t, w2_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C12); + w3_t = SHA256_EXPAND (w1_t, wc_t, w4_t, w3_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C13); + w4_t = SHA256_EXPAND (w2_t, wd_t, w5_t, w4_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C14); + w5_t = SHA256_EXPAND (w3_t, we_t, w6_t, w5_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C15); + w6_t = SHA256_EXPAND (w4_t, wf_t, w7_t, w6_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C16); + w7_t = SHA256_EXPAND (w5_t, w0_t, w8_t, w7_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C17); + w8_t = SHA256_EXPAND (w6_t, w1_t, w9_t, w8_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C18); + w9_t = SHA256_EXPAND (w7_t, w2_t, wa_t, w9_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C19); + wa_t = SHA256_EXPAND (w8_t, w3_t, wb_t, wa_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C1a); + wb_t = SHA256_EXPAND (w9_t, w4_t, wc_t, wb_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C1b); + wc_t = SHA256_EXPAND (wa_t, w5_t, wd_t, wc_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C1c); + wd_t = SHA256_EXPAND (wb_t, w6_t, we_t, wd_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C1d); + we_t = SHA256_EXPAND (wc_t, w7_t, wf_t, we_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C1e); + wf_t = SHA256_EXPAND (wd_t, w8_t, w0_t, wf_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C1f); + + w0_t = SHA256_EXPAND (we_t, w9_t, w1_t, w0_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C20); + w1_t = SHA256_EXPAND (wf_t, wa_t, w2_t, w1_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C21); + w2_t = SHA256_EXPAND (w0_t, wb_t, w3_t, w2_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C22); + w3_t = SHA256_EXPAND (w1_t, wc_t, w4_t, w3_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C23); + w4_t = SHA256_EXPAND (w2_t, wd_t, w5_t, w4_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C24); + w5_t = SHA256_EXPAND (w3_t, we_t, w6_t, w5_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C25); + w6_t = SHA256_EXPAND (w4_t, wf_t, w7_t, w6_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C26); + w7_t = SHA256_EXPAND (w5_t, w0_t, w8_t, w7_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C27); + w8_t = SHA256_EXPAND (w6_t, w1_t, w9_t, w8_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C28); + w9_t = SHA256_EXPAND (w7_t, w2_t, wa_t, w9_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C29); + wa_t = SHA256_EXPAND (w8_t, w3_t, wb_t, wa_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C2a); + wb_t = SHA256_EXPAND (w9_t, w4_t, wc_t, wb_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C2b); + wc_t = SHA256_EXPAND (wa_t, w5_t, wd_t, wc_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C2c); + wd_t = SHA256_EXPAND (wb_t, w6_t, we_t, wd_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C2d); + we_t = SHA256_EXPAND (wc_t, w7_t, wf_t, we_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C2e); + wf_t = SHA256_EXPAND (wd_t, w8_t, w0_t, wf_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C2f); + + w0_t = SHA256_EXPAND (we_t, w9_t, w1_t, w0_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C30); + w1_t = SHA256_EXPAND (wf_t, wa_t, w2_t, w1_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C31); + w2_t = SHA256_EXPAND (w0_t, wb_t, w3_t, w2_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C32); + w3_t = SHA256_EXPAND (w1_t, wc_t, w4_t, w3_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C33); + w4_t = SHA256_EXPAND (w2_t, wd_t, w5_t, w4_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C34); + w5_t = SHA256_EXPAND (w3_t, we_t, w6_t, w5_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C35); + w6_t = SHA256_EXPAND (w4_t, wf_t, w7_t, w6_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C36); + w7_t = SHA256_EXPAND (w5_t, w0_t, w8_t, w7_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C37); + w8_t = SHA256_EXPAND (w6_t, w1_t, w9_t, w8_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C38); + w9_t = SHA256_EXPAND (w7_t, w2_t, wa_t, w9_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C39); + wa_t = SHA256_EXPAND (w8_t, w3_t, wb_t, wa_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C3a); + wb_t = SHA256_EXPAND (w9_t, w4_t, wc_t, wb_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C3b); + wc_t = SHA256_EXPAND (wa_t, w5_t, wd_t, wc_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C3c); + wd_t = SHA256_EXPAND (wb_t, w6_t, we_t, wd_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C3d); + we_t = SHA256_EXPAND (wc_t, w7_t, wf_t, we_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C3e); + wf_t = SHA256_EXPAND (wd_t, w8_t, w0_t, wf_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C3f); + + + const u32x r0 = d; + const u32x r1 = h; + const u32x r2 = c; + const u32x r3 = g; + + #include VECT_COMPARE_M + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m01400_m08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m01400_m16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m01400_s04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + u32x pw_buf1[4]; + + pw_buf1[0] = pws[gid].i[ 4]; + pw_buf1[1] = pws[gid].i[ 5]; + pw_buf1[2] = pws[gid].i[ 6]; + pw_buf1[3] = pws[gid].i[ 7]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + + w0[0] = pw_buf0[0]; + w0[1] = pw_buf0[1]; + w0[2] = pw_buf0[2]; + w0[3] = pw_buf0[3]; + + u32x w1[4]; + + w1[0] = pw_buf1[0]; + w1[1] = pw_buf1[1]; + w1[2] = pw_buf1[2]; + w1[3] = pw_buf1[3]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 out_len = apply_rules (rules_buf[il_pos].cmds, w0, w1, pw_len); + + append_0x80_2 (w0, w1, out_len); + + /** + * SHA256 + */ + + u32x w0_t = swap_workaround (w0[0]); + u32x w1_t = swap_workaround (w0[1]); + u32x w2_t = swap_workaround (w0[2]); + u32x w3_t = swap_workaround (w0[3]); + u32x w4_t = swap_workaround (w1[0]); + u32x w5_t = swap_workaround (w1[1]); + u32x w6_t = swap_workaround (w1[2]); + u32x w7_t = swap_workaround (w1[3]); + u32x w8_t = 0; + u32x w9_t = 0; + u32x wa_t = 0; + u32x wb_t = 0; + u32x wc_t = 0; + u32x wd_t = 0; + u32x we_t = 0; + u32x wf_t = out_len * 8; + + u32x a = SHA256M_A; + u32x b = SHA256M_B; + u32x c = SHA256M_C; + u32x d = SHA256M_D; + u32x e = SHA256M_E; + u32x f = SHA256M_F; + u32x g = SHA256M_G; + u32x h = SHA256M_H; + + SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C00); + SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C01); + SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C02); + SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C03); + SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C04); + SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C05); + SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C06); + SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C07); + SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C08); + SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C09); + SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C0a); + SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C0b); + SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C0c); + SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C0d); + SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C0e); + SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C0f); + + w0_t = SHA256_EXPAND (we_t, w9_t, w1_t, w0_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C10); + w1_t = SHA256_EXPAND (wf_t, wa_t, w2_t, w1_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C11); + w2_t = SHA256_EXPAND (w0_t, wb_t, w3_t, w2_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C12); + w3_t = SHA256_EXPAND (w1_t, wc_t, w4_t, w3_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C13); + w4_t = SHA256_EXPAND (w2_t, wd_t, w5_t, w4_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C14); + w5_t = SHA256_EXPAND (w3_t, we_t, w6_t, w5_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C15); + w6_t = SHA256_EXPAND (w4_t, wf_t, w7_t, w6_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C16); + w7_t = SHA256_EXPAND (w5_t, w0_t, w8_t, w7_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C17); + w8_t = SHA256_EXPAND (w6_t, w1_t, w9_t, w8_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C18); + w9_t = SHA256_EXPAND (w7_t, w2_t, wa_t, w9_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C19); + wa_t = SHA256_EXPAND (w8_t, w3_t, wb_t, wa_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C1a); + wb_t = SHA256_EXPAND (w9_t, w4_t, wc_t, wb_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C1b); + wc_t = SHA256_EXPAND (wa_t, w5_t, wd_t, wc_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C1c); + wd_t = SHA256_EXPAND (wb_t, w6_t, we_t, wd_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C1d); + we_t = SHA256_EXPAND (wc_t, w7_t, wf_t, we_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C1e); + wf_t = SHA256_EXPAND (wd_t, w8_t, w0_t, wf_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C1f); + + w0_t = SHA256_EXPAND (we_t, w9_t, w1_t, w0_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C20); + w1_t = SHA256_EXPAND (wf_t, wa_t, w2_t, w1_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C21); + w2_t = SHA256_EXPAND (w0_t, wb_t, w3_t, w2_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C22); + w3_t = SHA256_EXPAND (w1_t, wc_t, w4_t, w3_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C23); + w4_t = SHA256_EXPAND (w2_t, wd_t, w5_t, w4_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C24); + w5_t = SHA256_EXPAND (w3_t, we_t, w6_t, w5_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C25); + w6_t = SHA256_EXPAND (w4_t, wf_t, w7_t, w6_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C26); + w7_t = SHA256_EXPAND (w5_t, w0_t, w8_t, w7_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C27); + w8_t = SHA256_EXPAND (w6_t, w1_t, w9_t, w8_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C28); + w9_t = SHA256_EXPAND (w7_t, w2_t, wa_t, w9_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C29); + wa_t = SHA256_EXPAND (w8_t, w3_t, wb_t, wa_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C2a); + wb_t = SHA256_EXPAND (w9_t, w4_t, wc_t, wb_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C2b); + wc_t = SHA256_EXPAND (wa_t, w5_t, wd_t, wc_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C2c); + wd_t = SHA256_EXPAND (wb_t, w6_t, we_t, wd_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C2d); + we_t = SHA256_EXPAND (wc_t, w7_t, wf_t, we_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C2e); + wf_t = SHA256_EXPAND (wd_t, w8_t, w0_t, wf_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C2f); + + w0_t = SHA256_EXPAND (we_t, w9_t, w1_t, w0_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C30); + w1_t = SHA256_EXPAND (wf_t, wa_t, w2_t, w1_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C31); + w2_t = SHA256_EXPAND (w0_t, wb_t, w3_t, w2_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C32); + w3_t = SHA256_EXPAND (w1_t, wc_t, w4_t, w3_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C33); + w4_t = SHA256_EXPAND (w2_t, wd_t, w5_t, w4_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C34); + w5_t = SHA256_EXPAND (w3_t, we_t, w6_t, w5_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C35); + w6_t = SHA256_EXPAND (w4_t, wf_t, w7_t, w6_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C36); + w7_t = SHA256_EXPAND (w5_t, w0_t, w8_t, w7_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C37); + w8_t = SHA256_EXPAND (w6_t, w1_t, w9_t, w8_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C38); + w9_t = SHA256_EXPAND (w7_t, w2_t, wa_t, w9_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C39); + wa_t = SHA256_EXPAND (w8_t, w3_t, wb_t, wa_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C3a); + wb_t = SHA256_EXPAND (w9_t, w4_t, wc_t, wb_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C3b); + wc_t = SHA256_EXPAND (wa_t, w5_t, wd_t, wc_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C3c); + wd_t = SHA256_EXPAND (wb_t, w6_t, we_t, wd_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C3d); + we_t = SHA256_EXPAND (wc_t, w7_t, wf_t, we_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C3e); + wf_t = SHA256_EXPAND (wd_t, w8_t, w0_t, wf_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C3f); + + + const u32x r0 = d; + const u32x r1 = h; + const u32x r2 = c; + const u32x r3 = g; + + #include VECT_COMPARE_S + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m01400_s08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m01400_s16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/amd/m01400_a1.cl b/amd/m01400_a1.cl new file mode 100644 index 0000000000..98a03ae5ec --- /dev/null +++ b/amd/m01400_a1.cl @@ -0,0 +1,529 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _SHA256_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW4 +#define VECT_SIZE2 +#endif + +#ifdef VLIW5 +#define VECT_SIZE2 +#endif + +#define DGST_R0 3 +#define DGST_R1 7 +#define DGST_R2 2 +#define DGST_R3 6 + +#include "include/kernel_functions.c" +#include "types_amd.c" +#include "common_amd.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m01400_m04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + append_0x80_2 (wordl0, wordl1, pw_l_len); + + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, combs_buf[0].pw_len); + } + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = combs_buf[il_pos].pw_len; + + const u32 pw_len = pw_l_len + pw_r_len; + + u32 wordr0[4]; + + wordr0[0] = combs_buf[il_pos].i[0]; + wordr0[1] = combs_buf[il_pos].i[1]; + wordr0[2] = combs_buf[il_pos].i[2]; + wordr0[3] = combs_buf[il_pos].i[3]; + + u32 wordr1[4]; + + wordr1[0] = combs_buf[il_pos].i[4]; + wordr1[1] = combs_buf[il_pos].i[5]; + wordr1[2] = combs_buf[il_pos].i[6]; + wordr1[3] = combs_buf[il_pos].i[7]; + + u32 wordr2[4]; + + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + + u32 wordr3[4]; + + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + append_0x80_2 (wordr0, wordr1, pw_r_len); + + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + u32x w0[4]; + u32x w1[4]; + u32x w2[4]; + u32x w3[4]; + + w0[0] = wordl0[0] | wordr0[0]; + w0[1] = wordl0[1] | wordr0[1]; + w0[2] = wordl0[2] | wordr0[2]; + w0[3] = wordl0[3] | wordr0[3]; + w1[0] = wordl1[0] | wordr1[0]; + w1[1] = wordl1[1] | wordr1[1]; + w1[2] = wordl1[2] | wordr1[2]; + w1[3] = wordl1[3] | wordr1[3]; + w2[0] = wordl2[0] | wordr2[0]; + w2[1] = wordl2[1] | wordr2[1]; + w2[2] = wordl2[2] | wordr2[2]; + w2[3] = wordl2[3] | wordr2[3]; + w3[0] = wordl3[0] | wordr3[0]; + w3[1] = wordl3[1] | wordr3[1]; + w3[2] = wordl3[2] | wordr3[2]; + w3[3] = wordl3[3] | wordr3[3]; + + /** + * SHA256 + */ + + u32x w0_t = swap_workaround (w0[0]); + u32x w1_t = swap_workaround (w0[1]); + u32x w2_t = swap_workaround (w0[2]); + u32x w3_t = swap_workaround (w0[3]); + u32x w4_t = swap_workaround (w1[0]); + u32x w5_t = swap_workaround (w1[1]); + u32x w6_t = swap_workaround (w1[2]); + u32x w7_t = swap_workaround (w1[3]); + u32x w8_t = swap_workaround (w2[0]); + u32x w9_t = swap_workaround (w2[1]); + u32x wa_t = swap_workaround (w2[2]); + u32x wb_t = swap_workaround (w2[3]); + u32x wc_t = swap_workaround (w3[0]); + u32x wd_t = swap_workaround (w3[1]); + u32x we_t = 0; + u32x wf_t = pw_len * 8; + + u32x a = SHA256M_A; + u32x b = SHA256M_B; + u32x c = SHA256M_C; + u32x d = SHA256M_D; + u32x e = SHA256M_E; + u32x f = SHA256M_F; + u32x g = SHA256M_G; + u32x h = SHA256M_H; + + SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C00); + SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C01); + SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C02); + SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C03); + SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C04); + SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C05); + SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C06); + SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C07); + SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C08); + SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C09); + SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C0a); + SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C0b); + SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C0c); + SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C0d); + SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C0e); + SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C0f); + + w0_t = SHA256_EXPAND (we_t, w9_t, w1_t, w0_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C10); + w1_t = SHA256_EXPAND (wf_t, wa_t, w2_t, w1_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C11); + w2_t = SHA256_EXPAND (w0_t, wb_t, w3_t, w2_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C12); + w3_t = SHA256_EXPAND (w1_t, wc_t, w4_t, w3_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C13); + w4_t = SHA256_EXPAND (w2_t, wd_t, w5_t, w4_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C14); + w5_t = SHA256_EXPAND (w3_t, we_t, w6_t, w5_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C15); + w6_t = SHA256_EXPAND (w4_t, wf_t, w7_t, w6_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C16); + w7_t = SHA256_EXPAND (w5_t, w0_t, w8_t, w7_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C17); + w8_t = SHA256_EXPAND (w6_t, w1_t, w9_t, w8_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C18); + w9_t = SHA256_EXPAND (w7_t, w2_t, wa_t, w9_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C19); + wa_t = SHA256_EXPAND (w8_t, w3_t, wb_t, wa_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C1a); + wb_t = SHA256_EXPAND (w9_t, w4_t, wc_t, wb_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C1b); + wc_t = SHA256_EXPAND (wa_t, w5_t, wd_t, wc_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C1c); + wd_t = SHA256_EXPAND (wb_t, w6_t, we_t, wd_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C1d); + we_t = SHA256_EXPAND (wc_t, w7_t, wf_t, we_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C1e); + wf_t = SHA256_EXPAND (wd_t, w8_t, w0_t, wf_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C1f); + + w0_t = SHA256_EXPAND (we_t, w9_t, w1_t, w0_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C20); + w1_t = SHA256_EXPAND (wf_t, wa_t, w2_t, w1_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C21); + w2_t = SHA256_EXPAND (w0_t, wb_t, w3_t, w2_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C22); + w3_t = SHA256_EXPAND (w1_t, wc_t, w4_t, w3_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C23); + w4_t = SHA256_EXPAND (w2_t, wd_t, w5_t, w4_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C24); + w5_t = SHA256_EXPAND (w3_t, we_t, w6_t, w5_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C25); + w6_t = SHA256_EXPAND (w4_t, wf_t, w7_t, w6_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C26); + w7_t = SHA256_EXPAND (w5_t, w0_t, w8_t, w7_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C27); + w8_t = SHA256_EXPAND (w6_t, w1_t, w9_t, w8_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C28); + w9_t = SHA256_EXPAND (w7_t, w2_t, wa_t, w9_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C29); + wa_t = SHA256_EXPAND (w8_t, w3_t, wb_t, wa_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C2a); + wb_t = SHA256_EXPAND (w9_t, w4_t, wc_t, wb_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C2b); + wc_t = SHA256_EXPAND (wa_t, w5_t, wd_t, wc_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C2c); + wd_t = SHA256_EXPAND (wb_t, w6_t, we_t, wd_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C2d); + we_t = SHA256_EXPAND (wc_t, w7_t, wf_t, we_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C2e); + wf_t = SHA256_EXPAND (wd_t, w8_t, w0_t, wf_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C2f); + + w0_t = SHA256_EXPAND (we_t, w9_t, w1_t, w0_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C30); + w1_t = SHA256_EXPAND (wf_t, wa_t, w2_t, w1_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C31); + w2_t = SHA256_EXPAND (w0_t, wb_t, w3_t, w2_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C32); + w3_t = SHA256_EXPAND (w1_t, wc_t, w4_t, w3_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C33); + w4_t = SHA256_EXPAND (w2_t, wd_t, w5_t, w4_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C34); + w5_t = SHA256_EXPAND (w3_t, we_t, w6_t, w5_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C35); + w6_t = SHA256_EXPAND (w4_t, wf_t, w7_t, w6_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C36); + w7_t = SHA256_EXPAND (w5_t, w0_t, w8_t, w7_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C37); + w8_t = SHA256_EXPAND (w6_t, w1_t, w9_t, w8_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C38); + w9_t = SHA256_EXPAND (w7_t, w2_t, wa_t, w9_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C39); + wa_t = SHA256_EXPAND (w8_t, w3_t, wb_t, wa_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C3a); + wb_t = SHA256_EXPAND (w9_t, w4_t, wc_t, wb_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C3b); + wc_t = SHA256_EXPAND (wa_t, w5_t, wd_t, wc_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C3c); + wd_t = SHA256_EXPAND (wb_t, w6_t, we_t, wd_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C3d); + we_t = SHA256_EXPAND (wc_t, w7_t, wf_t, we_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C3e); + wf_t = SHA256_EXPAND (wd_t, w8_t, w0_t, wf_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C3f); + + + const u32x r0 = d; + const u32x r1 = h; + const u32x r2 = c; + const u32x r3 = g; + + #include VECT_COMPARE_M + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m01400_m08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m01400_m16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m01400_s04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + append_0x80_2 (wordl0, wordl1, pw_l_len); + + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, combs_buf[0].pw_len); + } + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = combs_buf[il_pos].pw_len; + + const u32 pw_len = pw_l_len + pw_r_len; + + u32 wordr0[4]; + + wordr0[0] = combs_buf[il_pos].i[0]; + wordr0[1] = combs_buf[il_pos].i[1]; + wordr0[2] = combs_buf[il_pos].i[2]; + wordr0[3] = combs_buf[il_pos].i[3]; + + u32 wordr1[4]; + + wordr1[0] = combs_buf[il_pos].i[4]; + wordr1[1] = combs_buf[il_pos].i[5]; + wordr1[2] = combs_buf[il_pos].i[6]; + wordr1[3] = combs_buf[il_pos].i[7]; + + u32 wordr2[4]; + + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + + u32 wordr3[4]; + + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + append_0x80_2 (wordr0, wordr1, pw_r_len); + + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + u32x w0[4]; + u32x w1[4]; + u32x w2[4]; + u32x w3[4]; + + w0[0] = wordl0[0] | wordr0[0]; + w0[1] = wordl0[1] | wordr0[1]; + w0[2] = wordl0[2] | wordr0[2]; + w0[3] = wordl0[3] | wordr0[3]; + w1[0] = wordl1[0] | wordr1[0]; + w1[1] = wordl1[1] | wordr1[1]; + w1[2] = wordl1[2] | wordr1[2]; + w1[3] = wordl1[3] | wordr1[3]; + w2[0] = wordl2[0] | wordr2[0]; + w2[1] = wordl2[1] | wordr2[1]; + w2[2] = wordl2[2] | wordr2[2]; + w2[3] = wordl2[3] | wordr2[3]; + w3[0] = wordl3[0] | wordr3[0]; + w3[1] = wordl3[1] | wordr3[1]; + w3[2] = wordl3[2] | wordr3[2]; + w3[3] = wordl3[3] | wordr3[3]; + + /** + * SHA256 + */ + + u32x w0_t = swap_workaround (w0[0]); + u32x w1_t = swap_workaround (w0[1]); + u32x w2_t = swap_workaround (w0[2]); + u32x w3_t = swap_workaround (w0[3]); + u32x w4_t = swap_workaround (w1[0]); + u32x w5_t = swap_workaround (w1[1]); + u32x w6_t = swap_workaround (w1[2]); + u32x w7_t = swap_workaround (w1[3]); + u32x w8_t = swap_workaround (w2[0]); + u32x w9_t = swap_workaround (w2[1]); + u32x wa_t = swap_workaround (w2[2]); + u32x wb_t = swap_workaround (w2[3]); + u32x wc_t = swap_workaround (w3[0]); + u32x wd_t = swap_workaround (w3[1]); + u32x we_t = 0; + u32x wf_t = pw_len * 8; + + u32x a = SHA256M_A; + u32x b = SHA256M_B; + u32x c = SHA256M_C; + u32x d = SHA256M_D; + u32x e = SHA256M_E; + u32x f = SHA256M_F; + u32x g = SHA256M_G; + u32x h = SHA256M_H; + + SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C00); + SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C01); + SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C02); + SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C03); + SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C04); + SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C05); + SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C06); + SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C07); + SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C08); + SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C09); + SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C0a); + SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C0b); + SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C0c); + SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C0d); + SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C0e); + SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C0f); + + w0_t = SHA256_EXPAND (we_t, w9_t, w1_t, w0_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C10); + w1_t = SHA256_EXPAND (wf_t, wa_t, w2_t, w1_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C11); + w2_t = SHA256_EXPAND (w0_t, wb_t, w3_t, w2_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C12); + w3_t = SHA256_EXPAND (w1_t, wc_t, w4_t, w3_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C13); + w4_t = SHA256_EXPAND (w2_t, wd_t, w5_t, w4_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C14); + w5_t = SHA256_EXPAND (w3_t, we_t, w6_t, w5_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C15); + w6_t = SHA256_EXPAND (w4_t, wf_t, w7_t, w6_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C16); + w7_t = SHA256_EXPAND (w5_t, w0_t, w8_t, w7_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C17); + w8_t = SHA256_EXPAND (w6_t, w1_t, w9_t, w8_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C18); + w9_t = SHA256_EXPAND (w7_t, w2_t, wa_t, w9_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C19); + wa_t = SHA256_EXPAND (w8_t, w3_t, wb_t, wa_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C1a); + wb_t = SHA256_EXPAND (w9_t, w4_t, wc_t, wb_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C1b); + wc_t = SHA256_EXPAND (wa_t, w5_t, wd_t, wc_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C1c); + wd_t = SHA256_EXPAND (wb_t, w6_t, we_t, wd_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C1d); + we_t = SHA256_EXPAND (wc_t, w7_t, wf_t, we_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C1e); + wf_t = SHA256_EXPAND (wd_t, w8_t, w0_t, wf_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C1f); + + w0_t = SHA256_EXPAND (we_t, w9_t, w1_t, w0_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C20); + w1_t = SHA256_EXPAND (wf_t, wa_t, w2_t, w1_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C21); + w2_t = SHA256_EXPAND (w0_t, wb_t, w3_t, w2_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C22); + w3_t = SHA256_EXPAND (w1_t, wc_t, w4_t, w3_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C23); + w4_t = SHA256_EXPAND (w2_t, wd_t, w5_t, w4_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C24); + w5_t = SHA256_EXPAND (w3_t, we_t, w6_t, w5_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C25); + w6_t = SHA256_EXPAND (w4_t, wf_t, w7_t, w6_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C26); + w7_t = SHA256_EXPAND (w5_t, w0_t, w8_t, w7_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C27); + w8_t = SHA256_EXPAND (w6_t, w1_t, w9_t, w8_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C28); + w9_t = SHA256_EXPAND (w7_t, w2_t, wa_t, w9_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C29); + wa_t = SHA256_EXPAND (w8_t, w3_t, wb_t, wa_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C2a); + wb_t = SHA256_EXPAND (w9_t, w4_t, wc_t, wb_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C2b); + wc_t = SHA256_EXPAND (wa_t, w5_t, wd_t, wc_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C2c); + wd_t = SHA256_EXPAND (wb_t, w6_t, we_t, wd_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C2d); + we_t = SHA256_EXPAND (wc_t, w7_t, wf_t, we_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C2e); + wf_t = SHA256_EXPAND (wd_t, w8_t, w0_t, wf_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C2f); + + w0_t = SHA256_EXPAND (we_t, w9_t, w1_t, w0_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C30); + w1_t = SHA256_EXPAND (wf_t, wa_t, w2_t, w1_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C31); + w2_t = SHA256_EXPAND (w0_t, wb_t, w3_t, w2_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C32); + w3_t = SHA256_EXPAND (w1_t, wc_t, w4_t, w3_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C33); + w4_t = SHA256_EXPAND (w2_t, wd_t, w5_t, w4_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C34); + w5_t = SHA256_EXPAND (w3_t, we_t, w6_t, w5_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C35); + w6_t = SHA256_EXPAND (w4_t, wf_t, w7_t, w6_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C36); + w7_t = SHA256_EXPAND (w5_t, w0_t, w8_t, w7_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C37); + w8_t = SHA256_EXPAND (w6_t, w1_t, w9_t, w8_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C38); + w9_t = SHA256_EXPAND (w7_t, w2_t, wa_t, w9_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C39); + wa_t = SHA256_EXPAND (w8_t, w3_t, wb_t, wa_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C3a); + wb_t = SHA256_EXPAND (w9_t, w4_t, wc_t, wb_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C3b); + wc_t = SHA256_EXPAND (wa_t, w5_t, wd_t, wc_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C3c); + wd_t = SHA256_EXPAND (wb_t, w6_t, we_t, wd_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C3d); + we_t = SHA256_EXPAND (wc_t, w7_t, wf_t, we_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C3e); + wf_t = SHA256_EXPAND (wd_t, w8_t, w0_t, wf_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C3f); + + + const u32x r0 = d; + const u32x r1 = h; + const u32x r2 = c; + const u32x r3 = g; + + #include VECT_COMPARE_S + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m01400_s08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m01400_s16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/amd/m01400_a3.cl b/amd/m01400_a3.cl new file mode 100644 index 0000000000..5c029000c1 --- /dev/null +++ b/amd/m01400_a3.cl @@ -0,0 +1,540 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _SHA256_ +#define _SCALAR_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW4 +#define VECT_SIZE2 +#endif + +#ifdef VLIW5 +#define VECT_SIZE2 +#endif + +#define DGST_R0 3 +#define DGST_R1 7 +#define DGST_R2 2 +#define DGST_R3 6 + +#include "include/kernel_functions.c" +#include "types_amd.c" +#include "common_amd.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4_warp.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4_warp.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4_warp.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4_warp.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4_warp.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4_warp.c" +#endif + +static void m01400m (u32 w[16], const u32 pw_len, __global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global u32x * words_buf_r, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset) +{ + /** + * modifier + */ + + const u32 gid = get_global_id (0); + const u32 lid = get_local_id (0); + + /** + * loop + */ + + const u32 bf_loops = ceil ((float) bfs_cnt / VECT_DIV); + + u32x w0l = w[0]; + + for (u32 il_pos = 0; il_pos < bf_loops; il_pos++) + { + const u32x w0r = words_buf_r[il_pos]; + + const u32x w0 = w0l | w0r; + + u32x w0_t = w0; + u32x w1_t = w[ 1]; + u32x w2_t = w[ 2]; + u32x w3_t = w[ 3]; + u32x w4_t = w[ 4]; + u32x w5_t = w[ 5]; + u32x w6_t = w[ 6]; + u32x w7_t = w[ 7]; + u32x w8_t = w[ 8]; + u32x w9_t = w[ 9]; + u32x wa_t = w[10]; + u32x wb_t = w[11]; + u32x wc_t = w[12]; + u32x wd_t = w[13]; + u32x we_t = w[14]; + u32x wf_t = w[15]; + + u32x a = SHA256M_A; + u32x b = SHA256M_B; + u32x c = SHA256M_C; + u32x d = SHA256M_D; + u32x e = SHA256M_E; + u32x f = SHA256M_F; + u32x g = SHA256M_G; + u32x h = SHA256M_H; + + SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C00); + SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C01); + SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C02); + SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C03); + SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C04); + SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C05); + SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C06); + SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C07); + SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C08); + SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C09); + SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C0a); + SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C0b); + SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C0c); + SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C0d); + SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C0e); + SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C0f); + + w0_t = SHA256_EXPAND (we_t, w9_t, w1_t, w0_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C10); + w1_t = SHA256_EXPAND (wf_t, wa_t, w2_t, w1_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C11); + w2_t = SHA256_EXPAND (w0_t, wb_t, w3_t, w2_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C12); + w3_t = SHA256_EXPAND (w1_t, wc_t, w4_t, w3_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C13); + w4_t = SHA256_EXPAND (w2_t, wd_t, w5_t, w4_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C14); + w5_t = SHA256_EXPAND (w3_t, we_t, w6_t, w5_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C15); + w6_t = SHA256_EXPAND (w4_t, wf_t, w7_t, w6_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C16); + w7_t = SHA256_EXPAND (w5_t, w0_t, w8_t, w7_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C17); + w8_t = SHA256_EXPAND (w6_t, w1_t, w9_t, w8_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C18); + w9_t = SHA256_EXPAND (w7_t, w2_t, wa_t, w9_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C19); + wa_t = SHA256_EXPAND (w8_t, w3_t, wb_t, wa_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C1a); + wb_t = SHA256_EXPAND (w9_t, w4_t, wc_t, wb_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C1b); + wc_t = SHA256_EXPAND (wa_t, w5_t, wd_t, wc_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C1c); + wd_t = SHA256_EXPAND (wb_t, w6_t, we_t, wd_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C1d); + we_t = SHA256_EXPAND (wc_t, w7_t, wf_t, we_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C1e); + wf_t = SHA256_EXPAND (wd_t, w8_t, w0_t, wf_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C1f); + + w0_t = SHA256_EXPAND (we_t, w9_t, w1_t, w0_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C20); + w1_t = SHA256_EXPAND (wf_t, wa_t, w2_t, w1_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C21); + w2_t = SHA256_EXPAND (w0_t, wb_t, w3_t, w2_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C22); + w3_t = SHA256_EXPAND (w1_t, wc_t, w4_t, w3_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C23); + w4_t = SHA256_EXPAND (w2_t, wd_t, w5_t, w4_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C24); + w5_t = SHA256_EXPAND (w3_t, we_t, w6_t, w5_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C25); + w6_t = SHA256_EXPAND (w4_t, wf_t, w7_t, w6_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C26); + w7_t = SHA256_EXPAND (w5_t, w0_t, w8_t, w7_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C27); + w8_t = SHA256_EXPAND (w6_t, w1_t, w9_t, w8_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C28); + w9_t = SHA256_EXPAND (w7_t, w2_t, wa_t, w9_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C29); + wa_t = SHA256_EXPAND (w8_t, w3_t, wb_t, wa_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C2a); + wb_t = SHA256_EXPAND (w9_t, w4_t, wc_t, wb_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C2b); + wc_t = SHA256_EXPAND (wa_t, w5_t, wd_t, wc_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C2c); + wd_t = SHA256_EXPAND (wb_t, w6_t, we_t, wd_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C2d); + we_t = SHA256_EXPAND (wc_t, w7_t, wf_t, we_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C2e); + wf_t = SHA256_EXPAND (wd_t, w8_t, w0_t, wf_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C2f); + + w0_t = SHA256_EXPAND (we_t, w9_t, w1_t, w0_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C30); + w1_t = SHA256_EXPAND (wf_t, wa_t, w2_t, w1_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C31); + w2_t = SHA256_EXPAND (w0_t, wb_t, w3_t, w2_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C32); + w3_t = SHA256_EXPAND (w1_t, wc_t, w4_t, w3_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C33); + w4_t = SHA256_EXPAND (w2_t, wd_t, w5_t, w4_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C34); + w5_t = SHA256_EXPAND (w3_t, we_t, w6_t, w5_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C35); + w6_t = SHA256_EXPAND (w4_t, wf_t, w7_t, w6_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C36); + w7_t = SHA256_EXPAND (w5_t, w0_t, w8_t, w7_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C37); + w8_t = SHA256_EXPAND (w6_t, w1_t, w9_t, w8_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C38); + w9_t = SHA256_EXPAND (w7_t, w2_t, wa_t, w9_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C39); + wa_t = SHA256_EXPAND (w8_t, w3_t, wb_t, wa_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C3a); + wb_t = SHA256_EXPAND (w9_t, w4_t, wc_t, wb_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C3b); + wc_t = SHA256_EXPAND (wa_t, w5_t, wd_t, wc_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C3c); + wd_t = SHA256_EXPAND (wb_t, w6_t, we_t, wd_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C3d); + we_t = SHA256_EXPAND (wc_t, w7_t, wf_t, we_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C3e); + wf_t = SHA256_EXPAND (wd_t, w8_t, w0_t, wf_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C3f); + + + const u32x r0 = d; + const u32x r1 = h; + const u32x r2 = c; + const u32x r3 = g; + + #include VECT_COMPARE_M + } +} + +static void m01400s (u32 w[16], const u32 pw_len, __global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global u32x * words_buf_r, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset) +{ + /** + * modifier + */ + + const u32 gid = get_global_id (0); + const u32 lid = get_local_id (0); + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * loop + */ + + const u32 bf_loops = ceil ((float) bfs_cnt / VECT_DIV); + + u32x w0l = w[0]; + + for (u32 il_pos = 0; il_pos < bf_loops; il_pos++) + { + const u32x w0r = words_buf_r[il_pos]; + + const u32x w0 = w0l | w0r; + + u32x w0_t = w0; + u32x w1_t = w[ 1]; + u32x w2_t = w[ 2]; + u32x w3_t = w[ 3]; + u32x w4_t = w[ 4]; + u32x w5_t = w[ 5]; + u32x w6_t = w[ 6]; + u32x w7_t = w[ 7]; + u32x w8_t = w[ 8]; + u32x w9_t = w[ 9]; + u32x wa_t = w[10]; + u32x wb_t = w[11]; + u32x wc_t = w[12]; + u32x wd_t = w[13]; + u32x we_t = w[14]; + u32x wf_t = w[15]; + + u32x a = SHA256M_A; + u32x b = SHA256M_B; + u32x c = SHA256M_C; + u32x d = SHA256M_D; + u32x e = SHA256M_E; + u32x f = SHA256M_F; + u32x g = SHA256M_G; + u32x h = SHA256M_H; + + SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C00); + SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C01); + SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C02); + SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C03); + SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C04); + SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C05); + SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C06); + SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C07); + SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C08); + SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C09); + SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C0a); + SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C0b); + SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C0c); + SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C0d); + SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C0e); + SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C0f); + + w0_t = SHA256_EXPAND (we_t, w9_t, w1_t, w0_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C10); + w1_t = SHA256_EXPAND (wf_t, wa_t, w2_t, w1_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C11); + w2_t = SHA256_EXPAND (w0_t, wb_t, w3_t, w2_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C12); + w3_t = SHA256_EXPAND (w1_t, wc_t, w4_t, w3_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C13); + w4_t = SHA256_EXPAND (w2_t, wd_t, w5_t, w4_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C14); + w5_t = SHA256_EXPAND (w3_t, we_t, w6_t, w5_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C15); + w6_t = SHA256_EXPAND (w4_t, wf_t, w7_t, w6_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C16); + w7_t = SHA256_EXPAND (w5_t, w0_t, w8_t, w7_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C17); + w8_t = SHA256_EXPAND (w6_t, w1_t, w9_t, w8_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C18); + w9_t = SHA256_EXPAND (w7_t, w2_t, wa_t, w9_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C19); + wa_t = SHA256_EXPAND (w8_t, w3_t, wb_t, wa_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C1a); + wb_t = SHA256_EXPAND (w9_t, w4_t, wc_t, wb_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C1b); + wc_t = SHA256_EXPAND (wa_t, w5_t, wd_t, wc_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C1c); + wd_t = SHA256_EXPAND (wb_t, w6_t, we_t, wd_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C1d); + we_t = SHA256_EXPAND (wc_t, w7_t, wf_t, we_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C1e); + wf_t = SHA256_EXPAND (wd_t, w8_t, w0_t, wf_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C1f); + + w0_t = SHA256_EXPAND (we_t, w9_t, w1_t, w0_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C20); + w1_t = SHA256_EXPAND (wf_t, wa_t, w2_t, w1_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C21); + w2_t = SHA256_EXPAND (w0_t, wb_t, w3_t, w2_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C22); + w3_t = SHA256_EXPAND (w1_t, wc_t, w4_t, w3_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C23); + w4_t = SHA256_EXPAND (w2_t, wd_t, w5_t, w4_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C24); + w5_t = SHA256_EXPAND (w3_t, we_t, w6_t, w5_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C25); + w6_t = SHA256_EXPAND (w4_t, wf_t, w7_t, w6_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C26); + w7_t = SHA256_EXPAND (w5_t, w0_t, w8_t, w7_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C27); + w8_t = SHA256_EXPAND (w6_t, w1_t, w9_t, w8_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C28); + w9_t = SHA256_EXPAND (w7_t, w2_t, wa_t, w9_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C29); + wa_t = SHA256_EXPAND (w8_t, w3_t, wb_t, wa_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C2a); + wb_t = SHA256_EXPAND (w9_t, w4_t, wc_t, wb_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C2b); + wc_t = SHA256_EXPAND (wa_t, w5_t, wd_t, wc_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C2c); + wd_t = SHA256_EXPAND (wb_t, w6_t, we_t, wd_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C2d); + we_t = SHA256_EXPAND (wc_t, w7_t, wf_t, we_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C2e); + wf_t = SHA256_EXPAND (wd_t, w8_t, w0_t, wf_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C2f); + + w0_t = SHA256_EXPAND (we_t, w9_t, w1_t, w0_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C30); + w1_t = SHA256_EXPAND (wf_t, wa_t, w2_t, w1_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C31); + w2_t = SHA256_EXPAND (w0_t, wb_t, w3_t, w2_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C32); + w3_t = SHA256_EXPAND (w1_t, wc_t, w4_t, w3_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C33); + w4_t = SHA256_EXPAND (w2_t, wd_t, w5_t, w4_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C34); + w5_t = SHA256_EXPAND (w3_t, we_t, w6_t, w5_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C35); + w6_t = SHA256_EXPAND (w4_t, wf_t, w7_t, w6_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C36); + w7_t = SHA256_EXPAND (w5_t, w0_t, w8_t, w7_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C37); + w8_t = SHA256_EXPAND (w6_t, w1_t, w9_t, w8_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C38); + w9_t = SHA256_EXPAND (w7_t, w2_t, wa_t, w9_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C39); + wa_t = SHA256_EXPAND (w8_t, w3_t, wb_t, wa_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C3a); + wb_t = SHA256_EXPAND (w9_t, w4_t, wc_t, wb_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C3b); + wc_t = SHA256_EXPAND (wa_t, w5_t, wd_t, wc_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C3c); + wd_t = SHA256_EXPAND (wb_t, w6_t, we_t, wd_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C3d); + we_t = SHA256_EXPAND (wc_t, w7_t, wf_t, we_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C3e); + wf_t = SHA256_EXPAND (wd_t, w8_t, w0_t, wf_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C3f); + + + const u32x r0 = d; + const u32x r1 = h; + const u32x r2 = c; + const u32x r3 = g; + + #include VECT_COMPARE_S + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m01400_m04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global u32x * words_buf_r, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32 w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = 0; + w[ 5] = 0; + w[ 6] = 0; + w[ 7] = 0; + w[ 8] = 0; + w[ 9] = 0; + w[10] = 0; + w[11] = 0; + w[12] = 0; + w[13] = 0; + w[14] = 0; + w[15] = pws[gid].i[15]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m01400m (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m01400_m08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global u32x * words_buf_r, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32 w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = pws[gid].i[ 4]; + w[ 5] = pws[gid].i[ 5]; + w[ 6] = pws[gid].i[ 6]; + w[ 7] = pws[gid].i[ 7]; + w[ 8] = 0; + w[ 9] = 0; + w[10] = 0; + w[11] = 0; + w[12] = 0; + w[13] = 0; + w[14] = 0; + w[15] = pws[gid].i[15]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m01400m (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m01400_m16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global u32x * words_buf_r, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32 w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = pws[gid].i[ 4]; + w[ 5] = pws[gid].i[ 5]; + w[ 6] = pws[gid].i[ 6]; + w[ 7] = pws[gid].i[ 7]; + w[ 8] = pws[gid].i[ 8]; + w[ 9] = pws[gid].i[ 9]; + w[10] = pws[gid].i[10]; + w[11] = pws[gid].i[11]; + w[12] = pws[gid].i[12]; + w[13] = pws[gid].i[13]; + w[14] = pws[gid].i[14]; + w[15] = pws[gid].i[15]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m01400m (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m01400_s04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global u32x * words_buf_r, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32 w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = 0; + w[ 5] = 0; + w[ 6] = 0; + w[ 7] = 0; + w[ 8] = 0; + w[ 9] = 0; + w[10] = 0; + w[11] = 0; + w[12] = 0; + w[13] = 0; + w[14] = 0; + w[15] = pws[gid].i[15]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m01400s (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m01400_s08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global u32x * words_buf_r, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32 w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = pws[gid].i[ 4]; + w[ 5] = pws[gid].i[ 5]; + w[ 6] = pws[gid].i[ 6]; + w[ 7] = pws[gid].i[ 7]; + w[ 8] = 0; + w[ 9] = 0; + w[10] = 0; + w[11] = 0; + w[12] = 0; + w[13] = 0; + w[14] = 0; + w[15] = pws[gid].i[15]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m01400s (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m01400_s16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global u32x * words_buf_r, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32 w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = pws[gid].i[ 4]; + w[ 5] = pws[gid].i[ 5]; + w[ 6] = pws[gid].i[ 6]; + w[ 7] = pws[gid].i[ 7]; + w[ 8] = pws[gid].i[ 8]; + w[ 9] = pws[gid].i[ 9]; + w[10] = pws[gid].i[10]; + w[11] = pws[gid].i[11]; + w[12] = pws[gid].i[12]; + w[13] = pws[gid].i[13]; + w[14] = pws[gid].i[14]; + w[15] = pws[gid].i[15]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m01400s (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} diff --git a/amd/m01410_a0.cl b/amd/m01410_a0.cl new file mode 100644 index 0000000000..84702e722a --- /dev/null +++ b/amd/m01410_a0.cl @@ -0,0 +1,583 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _SHA256_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW4 +#define VECT_SIZE2 +#endif + +#ifdef VLIW5 +#define VECT_SIZE2 +#endif + +#define DGST_R0 3 +#define DGST_R1 7 +#define DGST_R2 2 +#define DGST_R3 6 + +#include "include/kernel_functions.c" +#include "types_amd.c" +#include "common_amd.c" +#include "include/rp_gpu.h" +#include "rp_amd.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m01410_m04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + u32x pw_buf1[4]; + + pw_buf1[0] = pws[gid].i[ 4]; + pw_buf1[1] = pws[gid].i[ 5]; + pw_buf1[2] = pws[gid].i[ 6]; + pw_buf1[3] = pws[gid].i[ 7]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[7]; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + + w0[0] = pw_buf0[0]; + w0[1] = pw_buf0[1]; + w0[2] = pw_buf0[2]; + w0[3] = pw_buf0[3]; + + u32x w1[4]; + + w1[0] = pw_buf1[0]; + w1[1] = pw_buf1[1]; + w1[2] = pw_buf1[2]; + w1[3] = pw_buf1[3]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 out_len = apply_rules (rules_buf[il_pos].cmds, w0, w1, pw_len); + + /** + * append salt + */ + + u32 s0[4]; + + s0[0] = salt_buf0[0]; + s0[1] = salt_buf0[1]; + s0[2] = salt_buf0[2]; + s0[3] = salt_buf0[3]; + + u32 s1[4]; + + s1[0] = salt_buf1[0]; + s1[1] = salt_buf1[1]; + s1[2] = salt_buf1[2]; + s1[3] = salt_buf1[3]; + + u32 s2[4]; + + s2[0] = 0; + s2[1] = 0; + s2[2] = 0; + s2[3] = 0; + + u32 s3[4]; + + s3[0] = 0; + s3[1] = 0; + s3[2] = 0; + s3[3] = 0; + + switch_buffer_by_offset (s0, s1, s2, s3, out_len); + + const u32 out_salt_len = out_len + salt_len; + + w0[0] |= s0[0]; + w0[1] |= s0[1]; + w0[2] |= s0[2]; + w0[3] |= s0[3]; + + w1[0] |= s1[0]; + w1[1] |= s1[1]; + w1[2] |= s1[2]; + w1[3] |= s1[3]; + + w2[0] |= s2[0]; + w2[1] |= s2[1]; + w2[2] |= s2[2]; + w2[3] |= s2[3]; + + w3[0] |= s3[0]; + w3[1] |= s3[1]; + w3[2] |= s3[2]; + w3[3] |= s3[3]; + + append_0x80_4 (w0, w1, w2, w3, out_salt_len); + + /** + * sha256 + */ + + u32x w0_t = swap_workaround (w0[0]); + u32x w1_t = swap_workaround (w0[1]); + u32x w2_t = swap_workaround (w0[2]); + u32x w3_t = swap_workaround (w0[3]); + u32x w4_t = swap_workaround (w1[0]); + u32x w5_t = swap_workaround (w1[1]); + u32x w6_t = swap_workaround (w1[2]); + u32x w7_t = swap_workaround (w1[3]); + u32x w8_t = swap_workaround (w2[0]); + u32x w9_t = swap_workaround (w2[1]); + u32x wa_t = swap_workaround (w2[2]); + u32x wb_t = swap_workaround (w2[3]); + u32x wc_t = swap_workaround (w3[0]); + u32x wd_t = swap_workaround (w3[1]); + u32x we_t = 0; + u32x wf_t = out_salt_len * 8; + + u32x a = SHA256M_A; + u32x b = SHA256M_B; + u32x c = SHA256M_C; + u32x d = SHA256M_D; + u32x e = SHA256M_E; + u32x f = SHA256M_F; + u32x g = SHA256M_G; + u32x h = SHA256M_H; + + SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C00); + SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C01); + SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C02); + SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C03); + SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C04); + SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C05); + SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C06); + SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C07); + SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C08); + SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C09); + SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C0a); + SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C0b); + SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C0c); + SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C0d); + SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C0e); + SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C0f); + + w0_t = SHA256_EXPAND (we_t, w9_t, w1_t, w0_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C10); + w1_t = SHA256_EXPAND (wf_t, wa_t, w2_t, w1_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C11); + w2_t = SHA256_EXPAND (w0_t, wb_t, w3_t, w2_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C12); + w3_t = SHA256_EXPAND (w1_t, wc_t, w4_t, w3_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C13); + w4_t = SHA256_EXPAND (w2_t, wd_t, w5_t, w4_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C14); + w5_t = SHA256_EXPAND (w3_t, we_t, w6_t, w5_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C15); + w6_t = SHA256_EXPAND (w4_t, wf_t, w7_t, w6_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C16); + w7_t = SHA256_EXPAND (w5_t, w0_t, w8_t, w7_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C17); + w8_t = SHA256_EXPAND (w6_t, w1_t, w9_t, w8_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C18); + w9_t = SHA256_EXPAND (w7_t, w2_t, wa_t, w9_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C19); + wa_t = SHA256_EXPAND (w8_t, w3_t, wb_t, wa_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C1a); + wb_t = SHA256_EXPAND (w9_t, w4_t, wc_t, wb_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C1b); + wc_t = SHA256_EXPAND (wa_t, w5_t, wd_t, wc_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C1c); + wd_t = SHA256_EXPAND (wb_t, w6_t, we_t, wd_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C1d); + we_t = SHA256_EXPAND (wc_t, w7_t, wf_t, we_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C1e); + wf_t = SHA256_EXPAND (wd_t, w8_t, w0_t, wf_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C1f); + + w0_t = SHA256_EXPAND (we_t, w9_t, w1_t, w0_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C20); + w1_t = SHA256_EXPAND (wf_t, wa_t, w2_t, w1_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C21); + w2_t = SHA256_EXPAND (w0_t, wb_t, w3_t, w2_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C22); + w3_t = SHA256_EXPAND (w1_t, wc_t, w4_t, w3_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C23); + w4_t = SHA256_EXPAND (w2_t, wd_t, w5_t, w4_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C24); + w5_t = SHA256_EXPAND (w3_t, we_t, w6_t, w5_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C25); + w6_t = SHA256_EXPAND (w4_t, wf_t, w7_t, w6_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C26); + w7_t = SHA256_EXPAND (w5_t, w0_t, w8_t, w7_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C27); + w8_t = SHA256_EXPAND (w6_t, w1_t, w9_t, w8_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C28); + w9_t = SHA256_EXPAND (w7_t, w2_t, wa_t, w9_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C29); + wa_t = SHA256_EXPAND (w8_t, w3_t, wb_t, wa_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C2a); + wb_t = SHA256_EXPAND (w9_t, w4_t, wc_t, wb_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C2b); + wc_t = SHA256_EXPAND (wa_t, w5_t, wd_t, wc_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C2c); + wd_t = SHA256_EXPAND (wb_t, w6_t, we_t, wd_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C2d); + we_t = SHA256_EXPAND (wc_t, w7_t, wf_t, we_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C2e); + wf_t = SHA256_EXPAND (wd_t, w8_t, w0_t, wf_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C2f); + + w0_t = SHA256_EXPAND (we_t, w9_t, w1_t, w0_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C30); + w1_t = SHA256_EXPAND (wf_t, wa_t, w2_t, w1_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C31); + w2_t = SHA256_EXPAND (w0_t, wb_t, w3_t, w2_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C32); + w3_t = SHA256_EXPAND (w1_t, wc_t, w4_t, w3_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C33); + w4_t = SHA256_EXPAND (w2_t, wd_t, w5_t, w4_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C34); + w5_t = SHA256_EXPAND (w3_t, we_t, w6_t, w5_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C35); + w6_t = SHA256_EXPAND (w4_t, wf_t, w7_t, w6_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C36); + w7_t = SHA256_EXPAND (w5_t, w0_t, w8_t, w7_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C37); + w8_t = SHA256_EXPAND (w6_t, w1_t, w9_t, w8_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C38); + w9_t = SHA256_EXPAND (w7_t, w2_t, wa_t, w9_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C39); + wa_t = SHA256_EXPAND (w8_t, w3_t, wb_t, wa_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C3a); + wb_t = SHA256_EXPAND (w9_t, w4_t, wc_t, wb_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C3b); + wc_t = SHA256_EXPAND (wa_t, w5_t, wd_t, wc_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C3c); + wd_t = SHA256_EXPAND (wb_t, w6_t, we_t, wd_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C3d); + we_t = SHA256_EXPAND (wc_t, w7_t, wf_t, we_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C3e); + wf_t = SHA256_EXPAND (wd_t, w8_t, w0_t, wf_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C3f); + + + const u32x r0 = d; + const u32x r1 = h; + const u32x r2 = c; + const u32x r3 = g; + + #include VECT_COMPARE_M + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m01410_m08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m01410_m16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m01410_s04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + u32x pw_buf1[4]; + + pw_buf1[0] = pws[gid].i[ 4]; + pw_buf1[1] = pws[gid].i[ 5]; + pw_buf1[2] = pws[gid].i[ 6]; + pw_buf1[3] = pws[gid].i[ 7]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[7]; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + + w0[0] = pw_buf0[0]; + w0[1] = pw_buf0[1]; + w0[2] = pw_buf0[2]; + w0[3] = pw_buf0[3]; + + u32x w1[4]; + + w1[0] = pw_buf1[0]; + w1[1] = pw_buf1[1]; + w1[2] = pw_buf1[2]; + w1[3] = pw_buf1[3]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 out_len = apply_rules (rules_buf[il_pos].cmds, w0, w1, pw_len); + + /** + * append salt + */ + + u32 s0[4]; + + s0[0] = salt_buf0[0]; + s0[1] = salt_buf0[1]; + s0[2] = salt_buf0[2]; + s0[3] = salt_buf0[3]; + + u32 s1[4]; + + s1[0] = salt_buf1[0]; + s1[1] = salt_buf1[1]; + s1[2] = salt_buf1[2]; + s1[3] = salt_buf1[3]; + + u32 s2[4]; + + s2[0] = 0; + s2[1] = 0; + s2[2] = 0; + s2[3] = 0; + + u32 s3[4]; + + s3[0] = 0; + s3[1] = 0; + s3[2] = 0; + s3[3] = 0; + + switch_buffer_by_offset (s0, s1, s2, s3, out_len); + + const u32 out_salt_len = out_len + salt_len; + + w0[0] |= s0[0]; + w0[1] |= s0[1]; + w0[2] |= s0[2]; + w0[3] |= s0[3]; + + w1[0] |= s1[0]; + w1[1] |= s1[1]; + w1[2] |= s1[2]; + w1[3] |= s1[3]; + + w2[0] |= s2[0]; + w2[1] |= s2[1]; + w2[2] |= s2[2]; + w2[3] |= s2[3]; + + w3[0] |= s3[0]; + w3[1] |= s3[1]; + w3[2] |= s3[2]; + w3[3] |= s3[3]; + + append_0x80_4 (w0, w1, w2, w3, out_salt_len); + + /** + * sha256 + */ + + u32x w0_t = swap_workaround (w0[0]); + u32x w1_t = swap_workaround (w0[1]); + u32x w2_t = swap_workaround (w0[2]); + u32x w3_t = swap_workaround (w0[3]); + u32x w4_t = swap_workaround (w1[0]); + u32x w5_t = swap_workaround (w1[1]); + u32x w6_t = swap_workaround (w1[2]); + u32x w7_t = swap_workaround (w1[3]); + u32x w8_t = swap_workaround (w2[0]); + u32x w9_t = swap_workaround (w2[1]); + u32x wa_t = swap_workaround (w2[2]); + u32x wb_t = swap_workaround (w2[3]); + u32x wc_t = swap_workaround (w3[0]); + u32x wd_t = swap_workaround (w3[1]); + u32x we_t = 0; + u32x wf_t = out_salt_len * 8; + + u32x a = SHA256M_A; + u32x b = SHA256M_B; + u32x c = SHA256M_C; + u32x d = SHA256M_D; + u32x e = SHA256M_E; + u32x f = SHA256M_F; + u32x g = SHA256M_G; + u32x h = SHA256M_H; + + SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C00); + SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C01); + SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C02); + SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C03); + SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C04); + SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C05); + SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C06); + SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C07); + SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C08); + SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C09); + SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C0a); + SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C0b); + SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C0c); + SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C0d); + SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C0e); + SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C0f); + + w0_t = SHA256_EXPAND (we_t, w9_t, w1_t, w0_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C10); + w1_t = SHA256_EXPAND (wf_t, wa_t, w2_t, w1_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C11); + w2_t = SHA256_EXPAND (w0_t, wb_t, w3_t, w2_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C12); + w3_t = SHA256_EXPAND (w1_t, wc_t, w4_t, w3_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C13); + w4_t = SHA256_EXPAND (w2_t, wd_t, w5_t, w4_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C14); + w5_t = SHA256_EXPAND (w3_t, we_t, w6_t, w5_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C15); + w6_t = SHA256_EXPAND (w4_t, wf_t, w7_t, w6_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C16); + w7_t = SHA256_EXPAND (w5_t, w0_t, w8_t, w7_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C17); + w8_t = SHA256_EXPAND (w6_t, w1_t, w9_t, w8_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C18); + w9_t = SHA256_EXPAND (w7_t, w2_t, wa_t, w9_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C19); + wa_t = SHA256_EXPAND (w8_t, w3_t, wb_t, wa_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C1a); + wb_t = SHA256_EXPAND (w9_t, w4_t, wc_t, wb_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C1b); + wc_t = SHA256_EXPAND (wa_t, w5_t, wd_t, wc_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C1c); + wd_t = SHA256_EXPAND (wb_t, w6_t, we_t, wd_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C1d); + we_t = SHA256_EXPAND (wc_t, w7_t, wf_t, we_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C1e); + wf_t = SHA256_EXPAND (wd_t, w8_t, w0_t, wf_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C1f); + + w0_t = SHA256_EXPAND (we_t, w9_t, w1_t, w0_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C20); + w1_t = SHA256_EXPAND (wf_t, wa_t, w2_t, w1_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C21); + w2_t = SHA256_EXPAND (w0_t, wb_t, w3_t, w2_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C22); + w3_t = SHA256_EXPAND (w1_t, wc_t, w4_t, w3_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C23); + w4_t = SHA256_EXPAND (w2_t, wd_t, w5_t, w4_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C24); + w5_t = SHA256_EXPAND (w3_t, we_t, w6_t, w5_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C25); + w6_t = SHA256_EXPAND (w4_t, wf_t, w7_t, w6_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C26); + w7_t = SHA256_EXPAND (w5_t, w0_t, w8_t, w7_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C27); + w8_t = SHA256_EXPAND (w6_t, w1_t, w9_t, w8_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C28); + w9_t = SHA256_EXPAND (w7_t, w2_t, wa_t, w9_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C29); + wa_t = SHA256_EXPAND (w8_t, w3_t, wb_t, wa_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C2a); + wb_t = SHA256_EXPAND (w9_t, w4_t, wc_t, wb_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C2b); + wc_t = SHA256_EXPAND (wa_t, w5_t, wd_t, wc_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C2c); + wd_t = SHA256_EXPAND (wb_t, w6_t, we_t, wd_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C2d); + we_t = SHA256_EXPAND (wc_t, w7_t, wf_t, we_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C2e); + wf_t = SHA256_EXPAND (wd_t, w8_t, w0_t, wf_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C2f); + + w0_t = SHA256_EXPAND (we_t, w9_t, w1_t, w0_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C30); + w1_t = SHA256_EXPAND (wf_t, wa_t, w2_t, w1_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C31); + w2_t = SHA256_EXPAND (w0_t, wb_t, w3_t, w2_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C32); + w3_t = SHA256_EXPAND (w1_t, wc_t, w4_t, w3_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C33); + w4_t = SHA256_EXPAND (w2_t, wd_t, w5_t, w4_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C34); + w5_t = SHA256_EXPAND (w3_t, we_t, w6_t, w5_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C35); + w6_t = SHA256_EXPAND (w4_t, wf_t, w7_t, w6_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C36); + w7_t = SHA256_EXPAND (w5_t, w0_t, w8_t, w7_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C37); + w8_t = SHA256_EXPAND (w6_t, w1_t, w9_t, w8_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C38); + w9_t = SHA256_EXPAND (w7_t, w2_t, wa_t, w9_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C39); + wa_t = SHA256_EXPAND (w8_t, w3_t, wb_t, wa_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C3a); + wb_t = SHA256_EXPAND (w9_t, w4_t, wc_t, wb_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C3b); + wc_t = SHA256_EXPAND (wa_t, w5_t, wd_t, wc_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C3c); + wd_t = SHA256_EXPAND (wb_t, w6_t, we_t, wd_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C3d); + we_t = SHA256_EXPAND (wc_t, w7_t, wf_t, we_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C3e); + wf_t = SHA256_EXPAND (wd_t, w8_t, w0_t, wf_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C3f); + + + const u32x r0 = d; + const u32x r1 = h; + const u32x r2 = c; + const u32x r3 = g; + + #include VECT_COMPARE_S + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m01410_s08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m01410_s16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/amd/m01410_a1.cl b/amd/m01410_a1.cl new file mode 100644 index 0000000000..5607b5b785 --- /dev/null +++ b/amd/m01410_a1.cl @@ -0,0 +1,637 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _SHA256_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW4 +#define VECT_SIZE2 +#endif + +#ifdef VLIW5 +#define VECT_SIZE2 +#endif + +#define DGST_R0 3 +#define DGST_R1 7 +#define DGST_R2 2 +#define DGST_R3 6 + +#include "include/kernel_functions.c" +#include "types_amd.c" +#include "common_amd.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m01410_m04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, combs_buf[0].pw_len); + } + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[7]; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = combs_buf[il_pos].pw_len; + + const u32 pw_len = pw_l_len + pw_r_len; + + u32 wordr0[4]; + + wordr0[0] = combs_buf[il_pos].i[0]; + wordr0[1] = combs_buf[il_pos].i[1]; + wordr0[2] = combs_buf[il_pos].i[2]; + wordr0[3] = combs_buf[il_pos].i[3]; + + u32 wordr1[4]; + + wordr1[0] = combs_buf[il_pos].i[4]; + wordr1[1] = combs_buf[il_pos].i[5]; + wordr1[2] = combs_buf[il_pos].i[6]; + wordr1[3] = combs_buf[il_pos].i[7]; + + u32 wordr2[4]; + + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + + u32 wordr3[4]; + + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + /** + * append salt + */ + + u32 s0[4]; + + s0[0] = salt_buf0[0]; + s0[1] = salt_buf0[1]; + s0[2] = salt_buf0[2]; + s0[3] = salt_buf0[3]; + + u32 s1[4]; + + s1[0] = salt_buf1[0]; + s1[1] = salt_buf1[1]; + s1[2] = salt_buf1[2]; + s1[3] = salt_buf1[3]; + + u32 s2[4]; + + s2[0] = 0; + s2[1] = 0; + s2[2] = 0; + s2[3] = 0; + + u32 s3[4]; + + s3[0] = 0; + s3[1] = 0; + s3[2] = 0; + s3[3] = 0; + + switch_buffer_by_offset (s0, s1, s2, s3, pw_len); + + const u32 pw_salt_len = pw_len + salt_len; + + u32x w0[4]; + u32x w1[4]; + u32x w2[4]; + u32x w3[4]; + + w0[0] = wordl0[0] | wordr0[0] | s0[0]; + w0[1] = wordl0[1] | wordr0[1] | s0[1]; + w0[2] = wordl0[2] | wordr0[2] | s0[2]; + w0[3] = wordl0[3] | wordr0[3] | s0[3]; + w1[0] = wordl1[0] | wordr1[0] | s1[0]; + w1[1] = wordl1[1] | wordr1[1] | s1[1]; + w1[2] = wordl1[2] | wordr1[2] | s1[2]; + w1[3] = wordl1[3] | wordr1[3] | s1[3]; + w2[0] = wordl2[0] | wordr2[0] | s2[0]; + w2[1] = wordl2[1] | wordr2[1] | s2[1]; + w2[2] = wordl2[2] | wordr2[2] | s2[2]; + w2[3] = wordl2[3] | wordr2[3] | s2[3]; + w3[0] = wordl3[0] | wordr3[0] | s3[0]; + w3[1] = wordl3[1] | wordr3[1] | s3[1]; + w3[2] = wordl3[2] | wordr3[2] | s3[2]; + w3[3] = wordl3[3] | wordr3[3] | s3[3]; + + append_0x80_4 (w0, w1, w2, w3, pw_salt_len); + + /** + * sha256 + */ + + u32x w0_t = swap_workaround (w0[0]); + u32x w1_t = swap_workaround (w0[1]); + u32x w2_t = swap_workaround (w0[2]); + u32x w3_t = swap_workaround (w0[3]); + u32x w4_t = swap_workaround (w1[0]); + u32x w5_t = swap_workaround (w1[1]); + u32x w6_t = swap_workaround (w1[2]); + u32x w7_t = swap_workaround (w1[3]); + u32x w8_t = swap_workaround (w2[0]); + u32x w9_t = swap_workaround (w2[1]); + u32x wa_t = swap_workaround (w2[2]); + u32x wb_t = swap_workaround (w2[3]); + u32x wc_t = swap_workaround (w3[0]); + u32x wd_t = swap_workaround (w3[1]); + u32x we_t = 0; + u32x wf_t = pw_salt_len * 8; + + u32x a = SHA256M_A; + u32x b = SHA256M_B; + u32x c = SHA256M_C; + u32x d = SHA256M_D; + u32x e = SHA256M_E; + u32x f = SHA256M_F; + u32x g = SHA256M_G; + u32x h = SHA256M_H; + + SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C00); + SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C01); + SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C02); + SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C03); + SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C04); + SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C05); + SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C06); + SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C07); + SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C08); + SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C09); + SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C0a); + SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C0b); + SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C0c); + SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C0d); + SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C0e); + SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C0f); + + w0_t = SHA256_EXPAND (we_t, w9_t, w1_t, w0_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C10); + w1_t = SHA256_EXPAND (wf_t, wa_t, w2_t, w1_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C11); + w2_t = SHA256_EXPAND (w0_t, wb_t, w3_t, w2_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C12); + w3_t = SHA256_EXPAND (w1_t, wc_t, w4_t, w3_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C13); + w4_t = SHA256_EXPAND (w2_t, wd_t, w5_t, w4_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C14); + w5_t = SHA256_EXPAND (w3_t, we_t, w6_t, w5_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C15); + w6_t = SHA256_EXPAND (w4_t, wf_t, w7_t, w6_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C16); + w7_t = SHA256_EXPAND (w5_t, w0_t, w8_t, w7_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C17); + w8_t = SHA256_EXPAND (w6_t, w1_t, w9_t, w8_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C18); + w9_t = SHA256_EXPAND (w7_t, w2_t, wa_t, w9_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C19); + wa_t = SHA256_EXPAND (w8_t, w3_t, wb_t, wa_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C1a); + wb_t = SHA256_EXPAND (w9_t, w4_t, wc_t, wb_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C1b); + wc_t = SHA256_EXPAND (wa_t, w5_t, wd_t, wc_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C1c); + wd_t = SHA256_EXPAND (wb_t, w6_t, we_t, wd_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C1d); + we_t = SHA256_EXPAND (wc_t, w7_t, wf_t, we_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C1e); + wf_t = SHA256_EXPAND (wd_t, w8_t, w0_t, wf_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C1f); + + w0_t = SHA256_EXPAND (we_t, w9_t, w1_t, w0_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C20); + w1_t = SHA256_EXPAND (wf_t, wa_t, w2_t, w1_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C21); + w2_t = SHA256_EXPAND (w0_t, wb_t, w3_t, w2_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C22); + w3_t = SHA256_EXPAND (w1_t, wc_t, w4_t, w3_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C23); + w4_t = SHA256_EXPAND (w2_t, wd_t, w5_t, w4_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C24); + w5_t = SHA256_EXPAND (w3_t, we_t, w6_t, w5_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C25); + w6_t = SHA256_EXPAND (w4_t, wf_t, w7_t, w6_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C26); + w7_t = SHA256_EXPAND (w5_t, w0_t, w8_t, w7_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C27); + w8_t = SHA256_EXPAND (w6_t, w1_t, w9_t, w8_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C28); + w9_t = SHA256_EXPAND (w7_t, w2_t, wa_t, w9_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C29); + wa_t = SHA256_EXPAND (w8_t, w3_t, wb_t, wa_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C2a); + wb_t = SHA256_EXPAND (w9_t, w4_t, wc_t, wb_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C2b); + wc_t = SHA256_EXPAND (wa_t, w5_t, wd_t, wc_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C2c); + wd_t = SHA256_EXPAND (wb_t, w6_t, we_t, wd_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C2d); + we_t = SHA256_EXPAND (wc_t, w7_t, wf_t, we_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C2e); + wf_t = SHA256_EXPAND (wd_t, w8_t, w0_t, wf_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C2f); + + w0_t = SHA256_EXPAND (we_t, w9_t, w1_t, w0_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C30); + w1_t = SHA256_EXPAND (wf_t, wa_t, w2_t, w1_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C31); + w2_t = SHA256_EXPAND (w0_t, wb_t, w3_t, w2_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C32); + w3_t = SHA256_EXPAND (w1_t, wc_t, w4_t, w3_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C33); + w4_t = SHA256_EXPAND (w2_t, wd_t, w5_t, w4_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C34); + w5_t = SHA256_EXPAND (w3_t, we_t, w6_t, w5_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C35); + w6_t = SHA256_EXPAND (w4_t, wf_t, w7_t, w6_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C36); + w7_t = SHA256_EXPAND (w5_t, w0_t, w8_t, w7_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C37); + w8_t = SHA256_EXPAND (w6_t, w1_t, w9_t, w8_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C38); + w9_t = SHA256_EXPAND (w7_t, w2_t, wa_t, w9_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C39); + wa_t = SHA256_EXPAND (w8_t, w3_t, wb_t, wa_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C3a); + wb_t = SHA256_EXPAND (w9_t, w4_t, wc_t, wb_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C3b); + wc_t = SHA256_EXPAND (wa_t, w5_t, wd_t, wc_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C3c); + wd_t = SHA256_EXPAND (wb_t, w6_t, we_t, wd_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C3d); + we_t = SHA256_EXPAND (wc_t, w7_t, wf_t, we_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C3e); + wf_t = SHA256_EXPAND (wd_t, w8_t, w0_t, wf_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C3f); + + + const u32x r0 = d; + const u32x r1 = h; + const u32x r2 = c; + const u32x r3 = g; + + #include VECT_COMPARE_M + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m01410_m08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m01410_m16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m01410_s04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, combs_buf[0].pw_len); + } + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[7]; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = combs_buf[il_pos].pw_len; + + const u32 pw_len = pw_l_len + pw_r_len; + + u32 wordr0[4]; + + wordr0[0] = combs_buf[il_pos].i[0]; + wordr0[1] = combs_buf[il_pos].i[1]; + wordr0[2] = combs_buf[il_pos].i[2]; + wordr0[3] = combs_buf[il_pos].i[3]; + + u32 wordr1[4]; + + wordr1[0] = combs_buf[il_pos].i[4]; + wordr1[1] = combs_buf[il_pos].i[5]; + wordr1[2] = combs_buf[il_pos].i[6]; + wordr1[3] = combs_buf[il_pos].i[7]; + + u32 wordr2[4]; + + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + + u32 wordr3[4]; + + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + /** + * append salt + */ + + u32 s0[4]; + + s0[0] = salt_buf0[0]; + s0[1] = salt_buf0[1]; + s0[2] = salt_buf0[2]; + s0[3] = salt_buf0[3]; + + u32 s1[4]; + + s1[0] = salt_buf1[0]; + s1[1] = salt_buf1[1]; + s1[2] = salt_buf1[2]; + s1[3] = salt_buf1[3]; + + u32 s2[4]; + + s2[0] = 0; + s2[1] = 0; + s2[2] = 0; + s2[3] = 0; + + u32 s3[4]; + + s3[0] = 0; + s3[1] = 0; + s3[2] = 0; + s3[3] = 0; + + switch_buffer_by_offset (s0, s1, s2, s3, pw_len); + + const u32 pw_salt_len = pw_len + salt_len; + + u32x w0[4]; + u32x w1[4]; + u32x w2[4]; + u32x w3[4]; + + w0[0] = wordl0[0] | wordr0[0] | s0[0]; + w0[1] = wordl0[1] | wordr0[1] | s0[1]; + w0[2] = wordl0[2] | wordr0[2] | s0[2]; + w0[3] = wordl0[3] | wordr0[3] | s0[3]; + w1[0] = wordl1[0] | wordr1[0] | s1[0]; + w1[1] = wordl1[1] | wordr1[1] | s1[1]; + w1[2] = wordl1[2] | wordr1[2] | s1[2]; + w1[3] = wordl1[3] | wordr1[3] | s1[3]; + w2[0] = wordl2[0] | wordr2[0] | s2[0]; + w2[1] = wordl2[1] | wordr2[1] | s2[1]; + w2[2] = wordl2[2] | wordr2[2] | s2[2]; + w2[3] = wordl2[3] | wordr2[3] | s2[3]; + w3[0] = wordl3[0] | wordr3[0] | s3[0]; + w3[1] = wordl3[1] | wordr3[1] | s3[1]; + w3[2] = wordl3[2] | wordr3[2] | s3[2]; + w3[3] = wordl3[3] | wordr3[3] | s3[3]; + + append_0x80_4 (w0, w1, w2, w3, pw_salt_len); + + /** + * sha256 + */ + + u32x w0_t = swap_workaround (w0[0]); + u32x w1_t = swap_workaround (w0[1]); + u32x w2_t = swap_workaround (w0[2]); + u32x w3_t = swap_workaround (w0[3]); + u32x w4_t = swap_workaround (w1[0]); + u32x w5_t = swap_workaround (w1[1]); + u32x w6_t = swap_workaround (w1[2]); + u32x w7_t = swap_workaround (w1[3]); + u32x w8_t = swap_workaround (w2[0]); + u32x w9_t = swap_workaround (w2[1]); + u32x wa_t = swap_workaround (w2[2]); + u32x wb_t = swap_workaround (w2[3]); + u32x wc_t = swap_workaround (w3[0]); + u32x wd_t = swap_workaround (w3[1]); + u32x we_t = 0; + u32x wf_t = pw_salt_len * 8; + + u32x a = SHA256M_A; + u32x b = SHA256M_B; + u32x c = SHA256M_C; + u32x d = SHA256M_D; + u32x e = SHA256M_E; + u32x f = SHA256M_F; + u32x g = SHA256M_G; + u32x h = SHA256M_H; + + SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C00); + SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C01); + SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C02); + SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C03); + SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C04); + SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C05); + SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C06); + SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C07); + SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C08); + SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C09); + SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C0a); + SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C0b); + SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C0c); + SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C0d); + SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C0e); + SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C0f); + + w0_t = SHA256_EXPAND (we_t, w9_t, w1_t, w0_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C10); + w1_t = SHA256_EXPAND (wf_t, wa_t, w2_t, w1_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C11); + w2_t = SHA256_EXPAND (w0_t, wb_t, w3_t, w2_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C12); + w3_t = SHA256_EXPAND (w1_t, wc_t, w4_t, w3_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C13); + w4_t = SHA256_EXPAND (w2_t, wd_t, w5_t, w4_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C14); + w5_t = SHA256_EXPAND (w3_t, we_t, w6_t, w5_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C15); + w6_t = SHA256_EXPAND (w4_t, wf_t, w7_t, w6_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C16); + w7_t = SHA256_EXPAND (w5_t, w0_t, w8_t, w7_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C17); + w8_t = SHA256_EXPAND (w6_t, w1_t, w9_t, w8_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C18); + w9_t = SHA256_EXPAND (w7_t, w2_t, wa_t, w9_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C19); + wa_t = SHA256_EXPAND (w8_t, w3_t, wb_t, wa_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C1a); + wb_t = SHA256_EXPAND (w9_t, w4_t, wc_t, wb_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C1b); + wc_t = SHA256_EXPAND (wa_t, w5_t, wd_t, wc_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C1c); + wd_t = SHA256_EXPAND (wb_t, w6_t, we_t, wd_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C1d); + we_t = SHA256_EXPAND (wc_t, w7_t, wf_t, we_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C1e); + wf_t = SHA256_EXPAND (wd_t, w8_t, w0_t, wf_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C1f); + + w0_t = SHA256_EXPAND (we_t, w9_t, w1_t, w0_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C20); + w1_t = SHA256_EXPAND (wf_t, wa_t, w2_t, w1_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C21); + w2_t = SHA256_EXPAND (w0_t, wb_t, w3_t, w2_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C22); + w3_t = SHA256_EXPAND (w1_t, wc_t, w4_t, w3_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C23); + w4_t = SHA256_EXPAND (w2_t, wd_t, w5_t, w4_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C24); + w5_t = SHA256_EXPAND (w3_t, we_t, w6_t, w5_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C25); + w6_t = SHA256_EXPAND (w4_t, wf_t, w7_t, w6_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C26); + w7_t = SHA256_EXPAND (w5_t, w0_t, w8_t, w7_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C27); + w8_t = SHA256_EXPAND (w6_t, w1_t, w9_t, w8_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C28); + w9_t = SHA256_EXPAND (w7_t, w2_t, wa_t, w9_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C29); + wa_t = SHA256_EXPAND (w8_t, w3_t, wb_t, wa_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C2a); + wb_t = SHA256_EXPAND (w9_t, w4_t, wc_t, wb_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C2b); + wc_t = SHA256_EXPAND (wa_t, w5_t, wd_t, wc_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C2c); + wd_t = SHA256_EXPAND (wb_t, w6_t, we_t, wd_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C2d); + we_t = SHA256_EXPAND (wc_t, w7_t, wf_t, we_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C2e); + wf_t = SHA256_EXPAND (wd_t, w8_t, w0_t, wf_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C2f); + + w0_t = SHA256_EXPAND (we_t, w9_t, w1_t, w0_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C30); + w1_t = SHA256_EXPAND (wf_t, wa_t, w2_t, w1_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C31); + w2_t = SHA256_EXPAND (w0_t, wb_t, w3_t, w2_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C32); + w3_t = SHA256_EXPAND (w1_t, wc_t, w4_t, w3_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C33); + w4_t = SHA256_EXPAND (w2_t, wd_t, w5_t, w4_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C34); + w5_t = SHA256_EXPAND (w3_t, we_t, w6_t, w5_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C35); + w6_t = SHA256_EXPAND (w4_t, wf_t, w7_t, w6_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C36); + w7_t = SHA256_EXPAND (w5_t, w0_t, w8_t, w7_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C37); + w8_t = SHA256_EXPAND (w6_t, w1_t, w9_t, w8_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C38); + w9_t = SHA256_EXPAND (w7_t, w2_t, wa_t, w9_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C39); + wa_t = SHA256_EXPAND (w8_t, w3_t, wb_t, wa_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C3a); + wb_t = SHA256_EXPAND (w9_t, w4_t, wc_t, wb_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C3b); + wc_t = SHA256_EXPAND (wa_t, w5_t, wd_t, wc_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C3c); + wd_t = SHA256_EXPAND (wb_t, w6_t, we_t, wd_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C3d); + we_t = SHA256_EXPAND (wc_t, w7_t, wf_t, we_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C3e); + wf_t = SHA256_EXPAND (wd_t, w8_t, w0_t, wf_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C3f); + + + const u32x r0 = d; + const u32x r1 = h; + const u32x r2 = c; + const u32x r3 = g; + + #include VECT_COMPARE_S + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m01410_s08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m01410_s16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/amd/m01410_a3.cl b/amd/m01410_a3.cl new file mode 100644 index 0000000000..855a770dc9 --- /dev/null +++ b/amd/m01410_a3.cl @@ -0,0 +1,597 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _SHA256_ +#define _SCALAR_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW4 +#define VECT_SIZE2 +#endif + +#ifdef VLIW5 +#define VECT_SIZE2 +#endif + +#define DGST_R0 3 +#define DGST_R1 7 +#define DGST_R2 2 +#define DGST_R3 6 + +#include "include/kernel_functions.c" +#include "types_amd.c" +#include "common_amd.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4_warp.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4_warp.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4_warp.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4_warp.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4_warp.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4_warp.c" +#endif + +static void m01410m (u32 w[16], const u32 pw_len, __global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global u32x * words_buf_r, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset) +{ + /** + * modifier + */ + + const u32 gid = get_global_id (0); + const u32 lid = get_local_id (0); + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[ 1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[ 2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[ 3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[ 4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[ 5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[ 6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[ 7]; + + u32 salt_buf2[4]; + + salt_buf2[0] = salt_bufs[salt_pos].salt_buf[ 8]; + salt_buf2[1] = 0; + salt_buf2[2] = 0; + salt_buf2[3] = 0; + + u32 salt_buf3[4]; + + salt_buf3[0] = 0; + salt_buf3[1] = 0; + salt_buf3[2] = 0; + salt_buf3[3] = 0; + + switch_buffer_by_offset (salt_buf0, salt_buf1, salt_buf2, salt_buf3, pw_len); + + w[ 0] |= swap_workaround (salt_buf0[0]); + w[ 1] |= swap_workaround (salt_buf0[1]); + w[ 2] |= swap_workaround (salt_buf0[2]); + w[ 3] |= swap_workaround (salt_buf0[3]); + w[ 4] |= swap_workaround (salt_buf1[0]); + w[ 5] |= swap_workaround (salt_buf1[1]); + w[ 6] |= swap_workaround (salt_buf1[2]); + w[ 7] |= swap_workaround (salt_buf1[3]); + w[ 8] |= swap_workaround (salt_buf2[0]); + w[ 9] |= swap_workaround (salt_buf2[1]); + w[10] |= swap_workaround (salt_buf2[2]); + w[11] |= swap_workaround (salt_buf2[3]); + w[12] |= swap_workaround (salt_buf3[0]); + w[13] |= swap_workaround (salt_buf3[1]); + w[14] |= swap_workaround (salt_buf3[2]); + w[15] |= swap_workaround (salt_buf3[3]); + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + const u32 pw_salt_len = pw_len + salt_len; + + w[15] = pw_salt_len * 8; + + /** + * loop + */ + + const u32 bf_loops = ceil ((float) bfs_cnt / VECT_DIV); + + u32x w0l = w[0]; + + for (u32 il_pos = 0; il_pos < bf_loops; il_pos++) + { + const u32x w0r = words_buf_r[il_pos]; + + const u32x w0 = w0l | w0r; + + u32x w0_t = w0; + u32x w1_t = w[ 1]; + u32x w2_t = w[ 2]; + u32x w3_t = w[ 3]; + u32x w4_t = w[ 4]; + u32x w5_t = w[ 5]; + u32x w6_t = w[ 6]; + u32x w7_t = w[ 7]; + u32x w8_t = w[ 8]; + u32x w9_t = w[ 9]; + u32x wa_t = w[10]; + u32x wb_t = w[11]; + u32x wc_t = w[12]; + u32x wd_t = w[13]; + u32x we_t = w[14]; + u32x wf_t = w[15]; + + u32x a = SHA256M_A; + u32x b = SHA256M_B; + u32x c = SHA256M_C; + u32x d = SHA256M_D; + u32x e = SHA256M_E; + u32x f = SHA256M_F; + u32x g = SHA256M_G; + u32x h = SHA256M_H; + + SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C00); + SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C01); + SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C02); + SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C03); + SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C04); + SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C05); + SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C06); + SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C07); + SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C08); + SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C09); + SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C0a); + SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C0b); + SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C0c); + SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C0d); + SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C0e); + SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C0f); + + w0_t = SHA256_EXPAND (we_t, w9_t, w1_t, w0_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C10); + w1_t = SHA256_EXPAND (wf_t, wa_t, w2_t, w1_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C11); + w2_t = SHA256_EXPAND (w0_t, wb_t, w3_t, w2_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C12); + w3_t = SHA256_EXPAND (w1_t, wc_t, w4_t, w3_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C13); + w4_t = SHA256_EXPAND (w2_t, wd_t, w5_t, w4_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C14); + w5_t = SHA256_EXPAND (w3_t, we_t, w6_t, w5_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C15); + w6_t = SHA256_EXPAND (w4_t, wf_t, w7_t, w6_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C16); + w7_t = SHA256_EXPAND (w5_t, w0_t, w8_t, w7_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C17); + w8_t = SHA256_EXPAND (w6_t, w1_t, w9_t, w8_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C18); + w9_t = SHA256_EXPAND (w7_t, w2_t, wa_t, w9_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C19); + wa_t = SHA256_EXPAND (w8_t, w3_t, wb_t, wa_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C1a); + wb_t = SHA256_EXPAND (w9_t, w4_t, wc_t, wb_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C1b); + wc_t = SHA256_EXPAND (wa_t, w5_t, wd_t, wc_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C1c); + wd_t = SHA256_EXPAND (wb_t, w6_t, we_t, wd_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C1d); + we_t = SHA256_EXPAND (wc_t, w7_t, wf_t, we_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C1e); + wf_t = SHA256_EXPAND (wd_t, w8_t, w0_t, wf_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C1f); + + w0_t = SHA256_EXPAND (we_t, w9_t, w1_t, w0_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C20); + w1_t = SHA256_EXPAND (wf_t, wa_t, w2_t, w1_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C21); + w2_t = SHA256_EXPAND (w0_t, wb_t, w3_t, w2_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C22); + w3_t = SHA256_EXPAND (w1_t, wc_t, w4_t, w3_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C23); + w4_t = SHA256_EXPAND (w2_t, wd_t, w5_t, w4_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C24); + w5_t = SHA256_EXPAND (w3_t, we_t, w6_t, w5_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C25); + w6_t = SHA256_EXPAND (w4_t, wf_t, w7_t, w6_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C26); + w7_t = SHA256_EXPAND (w5_t, w0_t, w8_t, w7_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C27); + w8_t = SHA256_EXPAND (w6_t, w1_t, w9_t, w8_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C28); + w9_t = SHA256_EXPAND (w7_t, w2_t, wa_t, w9_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C29); + wa_t = SHA256_EXPAND (w8_t, w3_t, wb_t, wa_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C2a); + wb_t = SHA256_EXPAND (w9_t, w4_t, wc_t, wb_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C2b); + wc_t = SHA256_EXPAND (wa_t, w5_t, wd_t, wc_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C2c); + wd_t = SHA256_EXPAND (wb_t, w6_t, we_t, wd_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C2d); + we_t = SHA256_EXPAND (wc_t, w7_t, wf_t, we_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C2e); + wf_t = SHA256_EXPAND (wd_t, w8_t, w0_t, wf_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C2f); + + w0_t = SHA256_EXPAND (we_t, w9_t, w1_t, w0_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C30); + w1_t = SHA256_EXPAND (wf_t, wa_t, w2_t, w1_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C31); + w2_t = SHA256_EXPAND (w0_t, wb_t, w3_t, w2_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C32); + w3_t = SHA256_EXPAND (w1_t, wc_t, w4_t, w3_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C33); + w4_t = SHA256_EXPAND (w2_t, wd_t, w5_t, w4_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C34); + w5_t = SHA256_EXPAND (w3_t, we_t, w6_t, w5_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C35); + w6_t = SHA256_EXPAND (w4_t, wf_t, w7_t, w6_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C36); + w7_t = SHA256_EXPAND (w5_t, w0_t, w8_t, w7_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C37); + w8_t = SHA256_EXPAND (w6_t, w1_t, w9_t, w8_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C38); + w9_t = SHA256_EXPAND (w7_t, w2_t, wa_t, w9_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C39); + wa_t = SHA256_EXPAND (w8_t, w3_t, wb_t, wa_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C3a); + wb_t = SHA256_EXPAND (w9_t, w4_t, wc_t, wb_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C3b); + wc_t = SHA256_EXPAND (wa_t, w5_t, wd_t, wc_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C3c); + wd_t = SHA256_EXPAND (wb_t, w6_t, we_t, wd_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C3d); + we_t = SHA256_EXPAND (wc_t, w7_t, wf_t, we_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C3e); + wf_t = SHA256_EXPAND (wd_t, w8_t, w0_t, wf_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C3f); + + + const u32x r0 = d; + const u32x r1 = h; + const u32x r2 = c; + const u32x r3 = g; + + #include VECT_COMPARE_M + } +} + +static void m01410s (u32 w[16], const u32 pw_len, __global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global u32x * words_buf_r, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset) +{ + /** + * modifier + */ + + const u32 gid = get_global_id (0); + const u32 lid = get_local_id (0); + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * loop + */ + + const u32 bf_loops = ceil ((float) bfs_cnt / VECT_DIV); + + u32x w0l = w[0]; + + for (u32 il_pos = 0; il_pos < bf_loops; il_pos++) + { + const u32x w0r = words_buf_r[il_pos]; + + const u32x w0 = w0l | w0r; + + u32x w0_t = w0; + u32x w1_t = w[ 1]; + u32x w2_t = w[ 2]; + u32x w3_t = w[ 3]; + u32x w4_t = w[ 4]; + u32x w5_t = w[ 5]; + u32x w6_t = w[ 6]; + u32x w7_t = w[ 7]; + u32x w8_t = w[ 8]; + u32x w9_t = w[ 9]; + u32x wa_t = w[10]; + u32x wb_t = w[11]; + u32x wc_t = w[12]; + u32x wd_t = w[13]; + u32x we_t = w[14]; + u32x wf_t = w[15]; + + u32x a = SHA256M_A; + u32x b = SHA256M_B; + u32x c = SHA256M_C; + u32x d = SHA256M_D; + u32x e = SHA256M_E; + u32x f = SHA256M_F; + u32x g = SHA256M_G; + u32x h = SHA256M_H; + + SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C00); + SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C01); + SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C02); + SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C03); + SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C04); + SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C05); + SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C06); + SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C07); + SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C08); + SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C09); + SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C0a); + SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C0b); + SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C0c); + SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C0d); + SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C0e); + SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C0f); + + w0_t = SHA256_EXPAND (we_t, w9_t, w1_t, w0_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C10); + w1_t = SHA256_EXPAND (wf_t, wa_t, w2_t, w1_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C11); + w2_t = SHA256_EXPAND (w0_t, wb_t, w3_t, w2_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C12); + w3_t = SHA256_EXPAND (w1_t, wc_t, w4_t, w3_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C13); + w4_t = SHA256_EXPAND (w2_t, wd_t, w5_t, w4_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C14); + w5_t = SHA256_EXPAND (w3_t, we_t, w6_t, w5_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C15); + w6_t = SHA256_EXPAND (w4_t, wf_t, w7_t, w6_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C16); + w7_t = SHA256_EXPAND (w5_t, w0_t, w8_t, w7_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C17); + w8_t = SHA256_EXPAND (w6_t, w1_t, w9_t, w8_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C18); + w9_t = SHA256_EXPAND (w7_t, w2_t, wa_t, w9_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C19); + wa_t = SHA256_EXPAND (w8_t, w3_t, wb_t, wa_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C1a); + wb_t = SHA256_EXPAND (w9_t, w4_t, wc_t, wb_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C1b); + wc_t = SHA256_EXPAND (wa_t, w5_t, wd_t, wc_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C1c); + wd_t = SHA256_EXPAND (wb_t, w6_t, we_t, wd_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C1d); + we_t = SHA256_EXPAND (wc_t, w7_t, wf_t, we_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C1e); + wf_t = SHA256_EXPAND (wd_t, w8_t, w0_t, wf_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C1f); + + w0_t = SHA256_EXPAND (we_t, w9_t, w1_t, w0_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C20); + w1_t = SHA256_EXPAND (wf_t, wa_t, w2_t, w1_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C21); + w2_t = SHA256_EXPAND (w0_t, wb_t, w3_t, w2_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C22); + w3_t = SHA256_EXPAND (w1_t, wc_t, w4_t, w3_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C23); + w4_t = SHA256_EXPAND (w2_t, wd_t, w5_t, w4_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C24); + w5_t = SHA256_EXPAND (w3_t, we_t, w6_t, w5_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C25); + w6_t = SHA256_EXPAND (w4_t, wf_t, w7_t, w6_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C26); + w7_t = SHA256_EXPAND (w5_t, w0_t, w8_t, w7_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C27); + w8_t = SHA256_EXPAND (w6_t, w1_t, w9_t, w8_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C28); + w9_t = SHA256_EXPAND (w7_t, w2_t, wa_t, w9_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C29); + wa_t = SHA256_EXPAND (w8_t, w3_t, wb_t, wa_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C2a); + wb_t = SHA256_EXPAND (w9_t, w4_t, wc_t, wb_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C2b); + wc_t = SHA256_EXPAND (wa_t, w5_t, wd_t, wc_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C2c); + wd_t = SHA256_EXPAND (wb_t, w6_t, we_t, wd_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C2d); + we_t = SHA256_EXPAND (wc_t, w7_t, wf_t, we_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C2e); + wf_t = SHA256_EXPAND (wd_t, w8_t, w0_t, wf_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C2f); + + w0_t = SHA256_EXPAND (we_t, w9_t, w1_t, w0_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C30); + w1_t = SHA256_EXPAND (wf_t, wa_t, w2_t, w1_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C31); + w2_t = SHA256_EXPAND (w0_t, wb_t, w3_t, w2_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C32); + w3_t = SHA256_EXPAND (w1_t, wc_t, w4_t, w3_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C33); + w4_t = SHA256_EXPAND (w2_t, wd_t, w5_t, w4_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C34); + w5_t = SHA256_EXPAND (w3_t, we_t, w6_t, w5_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C35); + w6_t = SHA256_EXPAND (w4_t, wf_t, w7_t, w6_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C36); + w7_t = SHA256_EXPAND (w5_t, w0_t, w8_t, w7_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C37); + w8_t = SHA256_EXPAND (w6_t, w1_t, w9_t, w8_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C38); + w9_t = SHA256_EXPAND (w7_t, w2_t, wa_t, w9_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C39); + wa_t = SHA256_EXPAND (w8_t, w3_t, wb_t, wa_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C3a); + wb_t = SHA256_EXPAND (w9_t, w4_t, wc_t, wb_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C3b); + wc_t = SHA256_EXPAND (wa_t, w5_t, wd_t, wc_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C3c); + wd_t = SHA256_EXPAND (wb_t, w6_t, we_t, wd_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C3d); + we_t = SHA256_EXPAND (wc_t, w7_t, wf_t, we_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C3e); + wf_t = SHA256_EXPAND (wd_t, w8_t, w0_t, wf_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C3f); + + + const u32x r0 = d; + const u32x r1 = h; + const u32x r2 = c; + const u32x r3 = g; + + #include VECT_COMPARE_S + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m01410_m04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global u32x * words_buf_r, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32 w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = 0; + w[ 5] = 0; + w[ 6] = 0; + w[ 7] = 0; + w[ 8] = 0; + w[ 9] = 0; + w[10] = 0; + w[11] = 0; + w[12] = 0; + w[13] = 0; + w[14] = 0; + w[15] = pws[gid].i[15]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m01410m (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m01410_m08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global u32x * words_buf_r, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32 w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = pws[gid].i[ 4]; + w[ 5] = pws[gid].i[ 5]; + w[ 6] = pws[gid].i[ 6]; + w[ 7] = pws[gid].i[ 7]; + w[ 8] = 0; + w[ 9] = 0; + w[10] = 0; + w[11] = 0; + w[12] = 0; + w[13] = 0; + w[14] = 0; + w[15] = pws[gid].i[15]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m01410m (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m01410_m16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global u32x * words_buf_r, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32 w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = pws[gid].i[ 4]; + w[ 5] = pws[gid].i[ 5]; + w[ 6] = pws[gid].i[ 6]; + w[ 7] = pws[gid].i[ 7]; + w[ 8] = pws[gid].i[ 8]; + w[ 9] = pws[gid].i[ 9]; + w[10] = pws[gid].i[10]; + w[11] = pws[gid].i[11]; + w[12] = pws[gid].i[12]; + w[13] = pws[gid].i[13]; + w[14] = pws[gid].i[14]; + w[15] = pws[gid].i[15]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m01410m (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m01410_s04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global u32x * words_buf_r, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32 w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = 0; + w[ 5] = 0; + w[ 6] = 0; + w[ 7] = 0; + w[ 8] = 0; + w[ 9] = 0; + w[10] = 0; + w[11] = 0; + w[12] = 0; + w[13] = 0; + w[14] = 0; + w[15] = pws[gid].i[15]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m01410s (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m01410_s08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global u32x * words_buf_r, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32 w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = pws[gid].i[ 4]; + w[ 5] = pws[gid].i[ 5]; + w[ 6] = pws[gid].i[ 6]; + w[ 7] = pws[gid].i[ 7]; + w[ 8] = 0; + w[ 9] = 0; + w[10] = 0; + w[11] = 0; + w[12] = 0; + w[13] = 0; + w[14] = 0; + w[15] = pws[gid].i[15]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m01410s (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m01410_s16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global u32x * words_buf_r, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32 w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = pws[gid].i[ 4]; + w[ 5] = pws[gid].i[ 5]; + w[ 6] = pws[gid].i[ 6]; + w[ 7] = pws[gid].i[ 7]; + w[ 8] = pws[gid].i[ 8]; + w[ 9] = pws[gid].i[ 9]; + w[10] = pws[gid].i[10]; + w[11] = pws[gid].i[11]; + w[12] = pws[gid].i[12]; + w[13] = pws[gid].i[13]; + w[14] = pws[gid].i[14]; + w[15] = pws[gid].i[15]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m01410s (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} diff --git a/amd/m01420_a0.cl b/amd/m01420_a0.cl new file mode 100644 index 0000000000..6dc2df50dd --- /dev/null +++ b/amd/m01420_a0.cl @@ -0,0 +1,505 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _SHA256_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW4 +#define VECT_SIZE2 +#endif + +#ifdef VLIW5 +#define VECT_SIZE2 +#endif + +#define DGST_R0 3 +#define DGST_R1 7 +#define DGST_R2 2 +#define DGST_R3 6 + +#include "include/kernel_functions.c" +#include "types_amd.c" +#include "common_amd.c" +#include "include/rp_gpu.h" +#include "rp_amd.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m01420_m04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + u32x pw_buf1[4]; + + pw_buf1[0] = pws[gid].i[ 4]; + pw_buf1[1] = pws[gid].i[ 5]; + pw_buf1[2] = pws[gid].i[ 6]; + pw_buf1[3] = pws[gid].i[ 7]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[7]; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + + w0[0] = pw_buf0[0]; + w0[1] = pw_buf0[1]; + w0[2] = pw_buf0[2]; + w0[3] = pw_buf0[3]; + + u32x w1[4]; + + w1[0] = pw_buf1[0]; + w1[1] = pw_buf1[1]; + w1[2] = pw_buf1[2]; + w1[3] = pw_buf1[3]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 out_len = apply_rules (rules_buf[il_pos].cmds, w0, w1, pw_len); + + /** + * prepend salt + */ + + const u32 out_salt_len = out_len + salt_len; + + switch_buffer_by_offset (w0, w1, w2, w3, salt_len); + + w0[0] |= salt_buf0[0]; + w0[1] |= salt_buf0[1]; + w0[2] |= salt_buf0[2]; + w0[3] |= salt_buf0[3]; + w1[0] |= salt_buf1[0]; + w1[1] |= salt_buf1[1]; + w1[2] |= salt_buf1[2]; + w1[3] |= salt_buf1[3]; + + append_0x80_4 (w0, w1, w2, w3, out_salt_len); + + /** + * sha256 + */ + + u32x w0_t = swap_workaround (w0[0]); + u32x w1_t = swap_workaround (w0[1]); + u32x w2_t = swap_workaround (w0[2]); + u32x w3_t = swap_workaround (w0[3]); + u32x w4_t = swap_workaround (w1[0]); + u32x w5_t = swap_workaround (w1[1]); + u32x w6_t = swap_workaround (w1[2]); + u32x w7_t = swap_workaround (w1[3]); + u32x w8_t = swap_workaround (w2[0]); + u32x w9_t = swap_workaround (w2[1]); + u32x wa_t = swap_workaround (w2[2]); + u32x wb_t = swap_workaround (w2[3]); + u32x wc_t = swap_workaround (w3[0]); + u32x wd_t = swap_workaround (w3[1]); + u32x we_t = 0; + u32x wf_t = out_salt_len * 8; + + u32x a = SHA256M_A; + u32x b = SHA256M_B; + u32x c = SHA256M_C; + u32x d = SHA256M_D; + u32x e = SHA256M_E; + u32x f = SHA256M_F; + u32x g = SHA256M_G; + u32x h = SHA256M_H; + + SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C00); + SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C01); + SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C02); + SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C03); + SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C04); + SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C05); + SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C06); + SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C07); + SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C08); + SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C09); + SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C0a); + SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C0b); + SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C0c); + SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C0d); + SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C0e); + SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C0f); + + w0_t = SHA256_EXPAND (we_t, w9_t, w1_t, w0_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C10); + w1_t = SHA256_EXPAND (wf_t, wa_t, w2_t, w1_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C11); + w2_t = SHA256_EXPAND (w0_t, wb_t, w3_t, w2_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C12); + w3_t = SHA256_EXPAND (w1_t, wc_t, w4_t, w3_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C13); + w4_t = SHA256_EXPAND (w2_t, wd_t, w5_t, w4_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C14); + w5_t = SHA256_EXPAND (w3_t, we_t, w6_t, w5_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C15); + w6_t = SHA256_EXPAND (w4_t, wf_t, w7_t, w6_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C16); + w7_t = SHA256_EXPAND (w5_t, w0_t, w8_t, w7_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C17); + w8_t = SHA256_EXPAND (w6_t, w1_t, w9_t, w8_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C18); + w9_t = SHA256_EXPAND (w7_t, w2_t, wa_t, w9_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C19); + wa_t = SHA256_EXPAND (w8_t, w3_t, wb_t, wa_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C1a); + wb_t = SHA256_EXPAND (w9_t, w4_t, wc_t, wb_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C1b); + wc_t = SHA256_EXPAND (wa_t, w5_t, wd_t, wc_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C1c); + wd_t = SHA256_EXPAND (wb_t, w6_t, we_t, wd_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C1d); + we_t = SHA256_EXPAND (wc_t, w7_t, wf_t, we_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C1e); + wf_t = SHA256_EXPAND (wd_t, w8_t, w0_t, wf_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C1f); + + w0_t = SHA256_EXPAND (we_t, w9_t, w1_t, w0_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C20); + w1_t = SHA256_EXPAND (wf_t, wa_t, w2_t, w1_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C21); + w2_t = SHA256_EXPAND (w0_t, wb_t, w3_t, w2_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C22); + w3_t = SHA256_EXPAND (w1_t, wc_t, w4_t, w3_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C23); + w4_t = SHA256_EXPAND (w2_t, wd_t, w5_t, w4_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C24); + w5_t = SHA256_EXPAND (w3_t, we_t, w6_t, w5_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C25); + w6_t = SHA256_EXPAND (w4_t, wf_t, w7_t, w6_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C26); + w7_t = SHA256_EXPAND (w5_t, w0_t, w8_t, w7_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C27); + w8_t = SHA256_EXPAND (w6_t, w1_t, w9_t, w8_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C28); + w9_t = SHA256_EXPAND (w7_t, w2_t, wa_t, w9_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C29); + wa_t = SHA256_EXPAND (w8_t, w3_t, wb_t, wa_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C2a); + wb_t = SHA256_EXPAND (w9_t, w4_t, wc_t, wb_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C2b); + wc_t = SHA256_EXPAND (wa_t, w5_t, wd_t, wc_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C2c); + wd_t = SHA256_EXPAND (wb_t, w6_t, we_t, wd_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C2d); + we_t = SHA256_EXPAND (wc_t, w7_t, wf_t, we_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C2e); + wf_t = SHA256_EXPAND (wd_t, w8_t, w0_t, wf_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C2f); + + w0_t = SHA256_EXPAND (we_t, w9_t, w1_t, w0_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C30); + w1_t = SHA256_EXPAND (wf_t, wa_t, w2_t, w1_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C31); + w2_t = SHA256_EXPAND (w0_t, wb_t, w3_t, w2_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C32); + w3_t = SHA256_EXPAND (w1_t, wc_t, w4_t, w3_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C33); + w4_t = SHA256_EXPAND (w2_t, wd_t, w5_t, w4_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C34); + w5_t = SHA256_EXPAND (w3_t, we_t, w6_t, w5_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C35); + w6_t = SHA256_EXPAND (w4_t, wf_t, w7_t, w6_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C36); + w7_t = SHA256_EXPAND (w5_t, w0_t, w8_t, w7_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C37); + w8_t = SHA256_EXPAND (w6_t, w1_t, w9_t, w8_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C38); + w9_t = SHA256_EXPAND (w7_t, w2_t, wa_t, w9_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C39); + wa_t = SHA256_EXPAND (w8_t, w3_t, wb_t, wa_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C3a); + wb_t = SHA256_EXPAND (w9_t, w4_t, wc_t, wb_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C3b); + wc_t = SHA256_EXPAND (wa_t, w5_t, wd_t, wc_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C3c); + wd_t = SHA256_EXPAND (wb_t, w6_t, we_t, wd_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C3d); + we_t = SHA256_EXPAND (wc_t, w7_t, wf_t, we_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C3e); + wf_t = SHA256_EXPAND (wd_t, w8_t, w0_t, wf_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C3f); + + + const u32x r0 = d; + const u32x r1 = h; + const u32x r2 = c; + const u32x r3 = g; + + #include VECT_COMPARE_M + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m01420_m08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m01420_m16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m01420_s04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + u32x pw_buf1[4]; + + pw_buf1[0] = pws[gid].i[ 4]; + pw_buf1[1] = pws[gid].i[ 5]; + pw_buf1[2] = pws[gid].i[ 6]; + pw_buf1[3] = pws[gid].i[ 7]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[7]; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + + w0[0] = pw_buf0[0]; + w0[1] = pw_buf0[1]; + w0[2] = pw_buf0[2]; + w0[3] = pw_buf0[3]; + + u32x w1[4]; + + w1[0] = pw_buf1[0]; + w1[1] = pw_buf1[1]; + w1[2] = pw_buf1[2]; + w1[3] = pw_buf1[3]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 out_len = apply_rules (rules_buf[il_pos].cmds, w0, w1, pw_len); + + /** + * prepend salt + */ + + const u32 out_salt_len = out_len + salt_len; + + switch_buffer_by_offset (w0, w1, w2, w3, salt_len); + + w0[0] |= salt_buf0[0]; + w0[1] |= salt_buf0[1]; + w0[2] |= salt_buf0[2]; + w0[3] |= salt_buf0[3]; + w1[0] |= salt_buf1[0]; + w1[1] |= salt_buf1[1]; + w1[2] |= salt_buf1[2]; + w1[3] |= salt_buf1[3]; + + append_0x80_4 (w0, w1, w2, w3, out_salt_len); + + /** + * sha256 + */ + + u32x w0_t = swap_workaround (w0[0]); + u32x w1_t = swap_workaround (w0[1]); + u32x w2_t = swap_workaround (w0[2]); + u32x w3_t = swap_workaround (w0[3]); + u32x w4_t = swap_workaround (w1[0]); + u32x w5_t = swap_workaround (w1[1]); + u32x w6_t = swap_workaround (w1[2]); + u32x w7_t = swap_workaround (w1[3]); + u32x w8_t = swap_workaround (w2[0]); + u32x w9_t = swap_workaround (w2[1]); + u32x wa_t = swap_workaround (w2[2]); + u32x wb_t = swap_workaround (w2[3]); + u32x wc_t = swap_workaround (w3[0]); + u32x wd_t = swap_workaround (w3[1]); + u32x we_t = 0; + u32x wf_t = out_salt_len * 8; + + u32x a = SHA256M_A; + u32x b = SHA256M_B; + u32x c = SHA256M_C; + u32x d = SHA256M_D; + u32x e = SHA256M_E; + u32x f = SHA256M_F; + u32x g = SHA256M_G; + u32x h = SHA256M_H; + + SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C00); + SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C01); + SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C02); + SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C03); + SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C04); + SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C05); + SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C06); + SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C07); + SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C08); + SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C09); + SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C0a); + SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C0b); + SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C0c); + SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C0d); + SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C0e); + SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C0f); + + w0_t = SHA256_EXPAND (we_t, w9_t, w1_t, w0_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C10); + w1_t = SHA256_EXPAND (wf_t, wa_t, w2_t, w1_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C11); + w2_t = SHA256_EXPAND (w0_t, wb_t, w3_t, w2_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C12); + w3_t = SHA256_EXPAND (w1_t, wc_t, w4_t, w3_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C13); + w4_t = SHA256_EXPAND (w2_t, wd_t, w5_t, w4_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C14); + w5_t = SHA256_EXPAND (w3_t, we_t, w6_t, w5_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C15); + w6_t = SHA256_EXPAND (w4_t, wf_t, w7_t, w6_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C16); + w7_t = SHA256_EXPAND (w5_t, w0_t, w8_t, w7_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C17); + w8_t = SHA256_EXPAND (w6_t, w1_t, w9_t, w8_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C18); + w9_t = SHA256_EXPAND (w7_t, w2_t, wa_t, w9_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C19); + wa_t = SHA256_EXPAND (w8_t, w3_t, wb_t, wa_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C1a); + wb_t = SHA256_EXPAND (w9_t, w4_t, wc_t, wb_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C1b); + wc_t = SHA256_EXPAND (wa_t, w5_t, wd_t, wc_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C1c); + wd_t = SHA256_EXPAND (wb_t, w6_t, we_t, wd_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C1d); + we_t = SHA256_EXPAND (wc_t, w7_t, wf_t, we_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C1e); + wf_t = SHA256_EXPAND (wd_t, w8_t, w0_t, wf_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C1f); + + w0_t = SHA256_EXPAND (we_t, w9_t, w1_t, w0_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C20); + w1_t = SHA256_EXPAND (wf_t, wa_t, w2_t, w1_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C21); + w2_t = SHA256_EXPAND (w0_t, wb_t, w3_t, w2_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C22); + w3_t = SHA256_EXPAND (w1_t, wc_t, w4_t, w3_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C23); + w4_t = SHA256_EXPAND (w2_t, wd_t, w5_t, w4_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C24); + w5_t = SHA256_EXPAND (w3_t, we_t, w6_t, w5_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C25); + w6_t = SHA256_EXPAND (w4_t, wf_t, w7_t, w6_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C26); + w7_t = SHA256_EXPAND (w5_t, w0_t, w8_t, w7_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C27); + w8_t = SHA256_EXPAND (w6_t, w1_t, w9_t, w8_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C28); + w9_t = SHA256_EXPAND (w7_t, w2_t, wa_t, w9_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C29); + wa_t = SHA256_EXPAND (w8_t, w3_t, wb_t, wa_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C2a); + wb_t = SHA256_EXPAND (w9_t, w4_t, wc_t, wb_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C2b); + wc_t = SHA256_EXPAND (wa_t, w5_t, wd_t, wc_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C2c); + wd_t = SHA256_EXPAND (wb_t, w6_t, we_t, wd_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C2d); + we_t = SHA256_EXPAND (wc_t, w7_t, wf_t, we_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C2e); + wf_t = SHA256_EXPAND (wd_t, w8_t, w0_t, wf_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C2f); + + w0_t = SHA256_EXPAND (we_t, w9_t, w1_t, w0_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C30); + w1_t = SHA256_EXPAND (wf_t, wa_t, w2_t, w1_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C31); + w2_t = SHA256_EXPAND (w0_t, wb_t, w3_t, w2_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C32); + w3_t = SHA256_EXPAND (w1_t, wc_t, w4_t, w3_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C33); + w4_t = SHA256_EXPAND (w2_t, wd_t, w5_t, w4_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C34); + w5_t = SHA256_EXPAND (w3_t, we_t, w6_t, w5_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C35); + w6_t = SHA256_EXPAND (w4_t, wf_t, w7_t, w6_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C36); + w7_t = SHA256_EXPAND (w5_t, w0_t, w8_t, w7_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C37); + w8_t = SHA256_EXPAND (w6_t, w1_t, w9_t, w8_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C38); + w9_t = SHA256_EXPAND (w7_t, w2_t, wa_t, w9_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C39); + wa_t = SHA256_EXPAND (w8_t, w3_t, wb_t, wa_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C3a); + wb_t = SHA256_EXPAND (w9_t, w4_t, wc_t, wb_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C3b); + wc_t = SHA256_EXPAND (wa_t, w5_t, wd_t, wc_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C3c); + wd_t = SHA256_EXPAND (wb_t, w6_t, we_t, wd_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C3d); + we_t = SHA256_EXPAND (wc_t, w7_t, wf_t, we_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C3e); + wf_t = SHA256_EXPAND (wd_t, w8_t, w0_t, wf_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C3f); + + + const u32x r0 = d; + const u32x r1 = h; + const u32x r2 = c; + const u32x r3 = g; + + #include VECT_COMPARE_S + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m01420_s08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m01420_s16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/amd/m01420_a1.cl b/amd/m01420_a1.cl new file mode 100644 index 0000000000..b97c9dd945 --- /dev/null +++ b/amd/m01420_a1.cl @@ -0,0 +1,587 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _SHA256_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW4 +#define VECT_SIZE2 +#endif + +#ifdef VLIW5 +#define VECT_SIZE2 +#endif + +#define DGST_R0 3 +#define DGST_R1 7 +#define DGST_R2 2 +#define DGST_R3 6 + +#include "include/kernel_functions.c" +#include "types_amd.c" +#include "common_amd.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m01420_m04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, combs_buf[0].pw_len); + } + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[7]; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = combs_buf[il_pos].pw_len; + + const u32 pw_len = pw_l_len + pw_r_len; + + u32 wordr0[4]; + u32 wordr1[4]; + u32 wordr2[4]; + u32 wordr3[4]; + + wordr0[0] = combs_buf[il_pos].i[0]; + wordr0[1] = combs_buf[il_pos].i[1]; + wordr0[2] = combs_buf[il_pos].i[2]; + wordr0[3] = combs_buf[il_pos].i[3]; + wordr1[0] = combs_buf[il_pos].i[4]; + wordr1[1] = combs_buf[il_pos].i[5]; + wordr1[2] = combs_buf[il_pos].i[6]; + wordr1[3] = combs_buf[il_pos].i[7]; + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + u32x w0[4]; + u32x w1[4]; + u32x w2[4]; + u32x w3[4]; + + w0[0] = wordl0[0] | wordr0[0]; + w0[1] = wordl0[1] | wordr0[1]; + w0[2] = wordl0[2] | wordr0[2]; + w0[3] = wordl0[3] | wordr0[3]; + w1[0] = wordl1[0] | wordr1[0]; + w1[1] = wordl1[1] | wordr1[1]; + w1[2] = wordl1[2] | wordr1[2]; + w1[3] = wordl1[3] | wordr1[3]; + w2[0] = wordl2[0] | wordr2[0]; + w2[1] = wordl2[1] | wordr2[1]; + w2[2] = wordl2[2] | wordr2[2]; + w2[3] = wordl2[3] | wordr2[3]; + w3[0] = wordl3[0] | wordr3[0]; + w3[1] = wordl3[1] | wordr3[1]; + w3[2] = wordl3[2] | wordr3[2]; + w3[3] = wordl3[3] | wordr3[3]; + + /** + * prepend salt + */ + + const u32 pw_salt_len = pw_len + salt_len; + + switch_buffer_by_offset (w0, w1, w2, w3, salt_len); + + w0[0] |= salt_buf0[0]; + w0[1] |= salt_buf0[1]; + w0[2] |= salt_buf0[2]; + w0[3] |= salt_buf0[3]; + w1[0] |= salt_buf1[0]; + w1[1] |= salt_buf1[1]; + w1[2] |= salt_buf1[2]; + w1[3] |= salt_buf1[3]; + + append_0x80_4 (w0, w1, w2, w3, pw_salt_len); + + /** + * sha256 + */ + + u32x w0_t = swap_workaround (w0[0]); + u32x w1_t = swap_workaround (w0[1]); + u32x w2_t = swap_workaround (w0[2]); + u32x w3_t = swap_workaround (w0[3]); + u32x w4_t = swap_workaround (w1[0]); + u32x w5_t = swap_workaround (w1[1]); + u32x w6_t = swap_workaround (w1[2]); + u32x w7_t = swap_workaround (w1[3]); + u32x w8_t = swap_workaround (w2[0]); + u32x w9_t = swap_workaround (w2[1]); + u32x wa_t = swap_workaround (w2[2]); + u32x wb_t = swap_workaround (w2[3]); + u32x wc_t = swap_workaround (w3[0]); + u32x wd_t = swap_workaround (w3[1]); + u32x we_t = 0; + u32x wf_t = pw_salt_len * 8; + + u32x a = SHA256M_A; + u32x b = SHA256M_B; + u32x c = SHA256M_C; + u32x d = SHA256M_D; + u32x e = SHA256M_E; + u32x f = SHA256M_F; + u32x g = SHA256M_G; + u32x h = SHA256M_H; + + SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C00); + SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C01); + SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C02); + SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C03); + SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C04); + SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C05); + SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C06); + SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C07); + SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C08); + SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C09); + SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C0a); + SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C0b); + SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C0c); + SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C0d); + SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C0e); + SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C0f); + + w0_t = SHA256_EXPAND (we_t, w9_t, w1_t, w0_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C10); + w1_t = SHA256_EXPAND (wf_t, wa_t, w2_t, w1_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C11); + w2_t = SHA256_EXPAND (w0_t, wb_t, w3_t, w2_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C12); + w3_t = SHA256_EXPAND (w1_t, wc_t, w4_t, w3_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C13); + w4_t = SHA256_EXPAND (w2_t, wd_t, w5_t, w4_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C14); + w5_t = SHA256_EXPAND (w3_t, we_t, w6_t, w5_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C15); + w6_t = SHA256_EXPAND (w4_t, wf_t, w7_t, w6_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C16); + w7_t = SHA256_EXPAND (w5_t, w0_t, w8_t, w7_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C17); + w8_t = SHA256_EXPAND (w6_t, w1_t, w9_t, w8_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C18); + w9_t = SHA256_EXPAND (w7_t, w2_t, wa_t, w9_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C19); + wa_t = SHA256_EXPAND (w8_t, w3_t, wb_t, wa_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C1a); + wb_t = SHA256_EXPAND (w9_t, w4_t, wc_t, wb_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C1b); + wc_t = SHA256_EXPAND (wa_t, w5_t, wd_t, wc_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C1c); + wd_t = SHA256_EXPAND (wb_t, w6_t, we_t, wd_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C1d); + we_t = SHA256_EXPAND (wc_t, w7_t, wf_t, we_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C1e); + wf_t = SHA256_EXPAND (wd_t, w8_t, w0_t, wf_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C1f); + + w0_t = SHA256_EXPAND (we_t, w9_t, w1_t, w0_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C20); + w1_t = SHA256_EXPAND (wf_t, wa_t, w2_t, w1_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C21); + w2_t = SHA256_EXPAND (w0_t, wb_t, w3_t, w2_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C22); + w3_t = SHA256_EXPAND (w1_t, wc_t, w4_t, w3_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C23); + w4_t = SHA256_EXPAND (w2_t, wd_t, w5_t, w4_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C24); + w5_t = SHA256_EXPAND (w3_t, we_t, w6_t, w5_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C25); + w6_t = SHA256_EXPAND (w4_t, wf_t, w7_t, w6_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C26); + w7_t = SHA256_EXPAND (w5_t, w0_t, w8_t, w7_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C27); + w8_t = SHA256_EXPAND (w6_t, w1_t, w9_t, w8_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C28); + w9_t = SHA256_EXPAND (w7_t, w2_t, wa_t, w9_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C29); + wa_t = SHA256_EXPAND (w8_t, w3_t, wb_t, wa_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C2a); + wb_t = SHA256_EXPAND (w9_t, w4_t, wc_t, wb_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C2b); + wc_t = SHA256_EXPAND (wa_t, w5_t, wd_t, wc_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C2c); + wd_t = SHA256_EXPAND (wb_t, w6_t, we_t, wd_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C2d); + we_t = SHA256_EXPAND (wc_t, w7_t, wf_t, we_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C2e); + wf_t = SHA256_EXPAND (wd_t, w8_t, w0_t, wf_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C2f); + + w0_t = SHA256_EXPAND (we_t, w9_t, w1_t, w0_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C30); + w1_t = SHA256_EXPAND (wf_t, wa_t, w2_t, w1_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C31); + w2_t = SHA256_EXPAND (w0_t, wb_t, w3_t, w2_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C32); + w3_t = SHA256_EXPAND (w1_t, wc_t, w4_t, w3_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C33); + w4_t = SHA256_EXPAND (w2_t, wd_t, w5_t, w4_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C34); + w5_t = SHA256_EXPAND (w3_t, we_t, w6_t, w5_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C35); + w6_t = SHA256_EXPAND (w4_t, wf_t, w7_t, w6_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C36); + w7_t = SHA256_EXPAND (w5_t, w0_t, w8_t, w7_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C37); + w8_t = SHA256_EXPAND (w6_t, w1_t, w9_t, w8_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C38); + w9_t = SHA256_EXPAND (w7_t, w2_t, wa_t, w9_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C39); + wa_t = SHA256_EXPAND (w8_t, w3_t, wb_t, wa_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C3a); + wb_t = SHA256_EXPAND (w9_t, w4_t, wc_t, wb_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C3b); + wc_t = SHA256_EXPAND (wa_t, w5_t, wd_t, wc_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C3c); + wd_t = SHA256_EXPAND (wb_t, w6_t, we_t, wd_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C3d); + we_t = SHA256_EXPAND (wc_t, w7_t, wf_t, we_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C3e); + wf_t = SHA256_EXPAND (wd_t, w8_t, w0_t, wf_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C3f); + + + const u32x r0 = d; + const u32x r1 = h; + const u32x r2 = c; + const u32x r3 = g; + + #include VECT_COMPARE_M + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m01420_m08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m01420_m16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m01420_s04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, combs_buf[0].pw_len); + } + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[7]; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = combs_buf[il_pos].pw_len; + + const u32 pw_len = pw_l_len + pw_r_len; + + u32 wordr0[4]; + u32 wordr1[4]; + u32 wordr2[4]; + u32 wordr3[4]; + + wordr0[0] = combs_buf[il_pos].i[0]; + wordr0[1] = combs_buf[il_pos].i[1]; + wordr0[2] = combs_buf[il_pos].i[2]; + wordr0[3] = combs_buf[il_pos].i[3]; + wordr1[0] = combs_buf[il_pos].i[4]; + wordr1[1] = combs_buf[il_pos].i[5]; + wordr1[2] = combs_buf[il_pos].i[6]; + wordr1[3] = combs_buf[il_pos].i[7]; + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + u32x w0[4]; + u32x w1[4]; + u32x w2[4]; + u32x w3[4]; + + w0[0] = wordl0[0] | wordr0[0]; + w0[1] = wordl0[1] | wordr0[1]; + w0[2] = wordl0[2] | wordr0[2]; + w0[3] = wordl0[3] | wordr0[3]; + w1[0] = wordl1[0] | wordr1[0]; + w1[1] = wordl1[1] | wordr1[1]; + w1[2] = wordl1[2] | wordr1[2]; + w1[3] = wordl1[3] | wordr1[3]; + w2[0] = wordl2[0] | wordr2[0]; + w2[1] = wordl2[1] | wordr2[1]; + w2[2] = wordl2[2] | wordr2[2]; + w2[3] = wordl2[3] | wordr2[3]; + w3[0] = wordl3[0] | wordr3[0]; + w3[1] = wordl3[1] | wordr3[1]; + w3[2] = wordl3[2] | wordr3[2]; + w3[3] = wordl3[3] | wordr3[3]; + + /** + * prepend salt + */ + + const u32 pw_salt_len = pw_len + salt_len; + + switch_buffer_by_offset (w0, w1, w2, w3, salt_len); + + w0[0] |= salt_buf0[0]; + w0[1] |= salt_buf0[1]; + w0[2] |= salt_buf0[2]; + w0[3] |= salt_buf0[3]; + w1[0] |= salt_buf1[0]; + w1[1] |= salt_buf1[1]; + w1[2] |= salt_buf1[2]; + w1[3] |= salt_buf1[3]; + + append_0x80_4 (w0, w1, w2, w3, pw_salt_len); + + /** + * sha256 + */ + + u32x w0_t = swap_workaround (w0[0]); + u32x w1_t = swap_workaround (w0[1]); + u32x w2_t = swap_workaround (w0[2]); + u32x w3_t = swap_workaround (w0[3]); + u32x w4_t = swap_workaround (w1[0]); + u32x w5_t = swap_workaround (w1[1]); + u32x w6_t = swap_workaround (w1[2]); + u32x w7_t = swap_workaround (w1[3]); + u32x w8_t = swap_workaround (w2[0]); + u32x w9_t = swap_workaround (w2[1]); + u32x wa_t = swap_workaround (w2[2]); + u32x wb_t = swap_workaround (w2[3]); + u32x wc_t = swap_workaround (w3[0]); + u32x wd_t = swap_workaround (w3[1]); + u32x we_t = 0; + u32x wf_t = pw_salt_len * 8; + + u32x a = SHA256M_A; + u32x b = SHA256M_B; + u32x c = SHA256M_C; + u32x d = SHA256M_D; + u32x e = SHA256M_E; + u32x f = SHA256M_F; + u32x g = SHA256M_G; + u32x h = SHA256M_H; + + SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C00); + SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C01); + SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C02); + SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C03); + SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C04); + SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C05); + SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C06); + SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C07); + SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C08); + SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C09); + SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C0a); + SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C0b); + SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C0c); + SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C0d); + SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C0e); + SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C0f); + + w0_t = SHA256_EXPAND (we_t, w9_t, w1_t, w0_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C10); + w1_t = SHA256_EXPAND (wf_t, wa_t, w2_t, w1_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C11); + w2_t = SHA256_EXPAND (w0_t, wb_t, w3_t, w2_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C12); + w3_t = SHA256_EXPAND (w1_t, wc_t, w4_t, w3_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C13); + w4_t = SHA256_EXPAND (w2_t, wd_t, w5_t, w4_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C14); + w5_t = SHA256_EXPAND (w3_t, we_t, w6_t, w5_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C15); + w6_t = SHA256_EXPAND (w4_t, wf_t, w7_t, w6_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C16); + w7_t = SHA256_EXPAND (w5_t, w0_t, w8_t, w7_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C17); + w8_t = SHA256_EXPAND (w6_t, w1_t, w9_t, w8_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C18); + w9_t = SHA256_EXPAND (w7_t, w2_t, wa_t, w9_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C19); + wa_t = SHA256_EXPAND (w8_t, w3_t, wb_t, wa_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C1a); + wb_t = SHA256_EXPAND (w9_t, w4_t, wc_t, wb_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C1b); + wc_t = SHA256_EXPAND (wa_t, w5_t, wd_t, wc_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C1c); + wd_t = SHA256_EXPAND (wb_t, w6_t, we_t, wd_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C1d); + we_t = SHA256_EXPAND (wc_t, w7_t, wf_t, we_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C1e); + wf_t = SHA256_EXPAND (wd_t, w8_t, w0_t, wf_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C1f); + + w0_t = SHA256_EXPAND (we_t, w9_t, w1_t, w0_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C20); + w1_t = SHA256_EXPAND (wf_t, wa_t, w2_t, w1_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C21); + w2_t = SHA256_EXPAND (w0_t, wb_t, w3_t, w2_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C22); + w3_t = SHA256_EXPAND (w1_t, wc_t, w4_t, w3_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C23); + w4_t = SHA256_EXPAND (w2_t, wd_t, w5_t, w4_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C24); + w5_t = SHA256_EXPAND (w3_t, we_t, w6_t, w5_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C25); + w6_t = SHA256_EXPAND (w4_t, wf_t, w7_t, w6_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C26); + w7_t = SHA256_EXPAND (w5_t, w0_t, w8_t, w7_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C27); + w8_t = SHA256_EXPAND (w6_t, w1_t, w9_t, w8_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C28); + w9_t = SHA256_EXPAND (w7_t, w2_t, wa_t, w9_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C29); + wa_t = SHA256_EXPAND (w8_t, w3_t, wb_t, wa_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C2a); + wb_t = SHA256_EXPAND (w9_t, w4_t, wc_t, wb_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C2b); + wc_t = SHA256_EXPAND (wa_t, w5_t, wd_t, wc_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C2c); + wd_t = SHA256_EXPAND (wb_t, w6_t, we_t, wd_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C2d); + we_t = SHA256_EXPAND (wc_t, w7_t, wf_t, we_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C2e); + wf_t = SHA256_EXPAND (wd_t, w8_t, w0_t, wf_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C2f); + + w0_t = SHA256_EXPAND (we_t, w9_t, w1_t, w0_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C30); + w1_t = SHA256_EXPAND (wf_t, wa_t, w2_t, w1_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C31); + w2_t = SHA256_EXPAND (w0_t, wb_t, w3_t, w2_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C32); + w3_t = SHA256_EXPAND (w1_t, wc_t, w4_t, w3_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C33); + w4_t = SHA256_EXPAND (w2_t, wd_t, w5_t, w4_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C34); + w5_t = SHA256_EXPAND (w3_t, we_t, w6_t, w5_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C35); + w6_t = SHA256_EXPAND (w4_t, wf_t, w7_t, w6_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C36); + w7_t = SHA256_EXPAND (w5_t, w0_t, w8_t, w7_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C37); + w8_t = SHA256_EXPAND (w6_t, w1_t, w9_t, w8_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C38); + w9_t = SHA256_EXPAND (w7_t, w2_t, wa_t, w9_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C39); + wa_t = SHA256_EXPAND (w8_t, w3_t, wb_t, wa_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C3a); + wb_t = SHA256_EXPAND (w9_t, w4_t, wc_t, wb_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C3b); + wc_t = SHA256_EXPAND (wa_t, w5_t, wd_t, wc_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C3c); + wd_t = SHA256_EXPAND (wb_t, w6_t, we_t, wd_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C3d); + we_t = SHA256_EXPAND (wc_t, w7_t, wf_t, we_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C3e); + wf_t = SHA256_EXPAND (wd_t, w8_t, w0_t, wf_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C3f); + + + const u32x r0 = d; + const u32x r1 = h; + const u32x r2 = c; + const u32x r3 = g; + + #include VECT_COMPARE_S + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m01420_s08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m01420_s16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/amd/m01420_a3.cl b/amd/m01420_a3.cl new file mode 100644 index 0000000000..5d3b039238 --- /dev/null +++ b/amd/m01420_a3.cl @@ -0,0 +1,759 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _SHA256_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW4 +#define VECT_SIZE2 +#endif + +#ifdef VLIW5 +#define VECT_SIZE2 +#endif + +#define DGST_R0 3 +#define DGST_R1 7 +#define DGST_R2 2 +#define DGST_R3 6 + +#include "include/kernel_functions.c" +#include "types_amd.c" +#include "common_amd.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +static void m01420m (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], const u32 pw_len, __global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset) +{ + /** + * modifier + */ + + const u32 gid = get_global_id (0); + const u32 lid = get_local_id (0); + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[ 1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[ 2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[ 3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[ 4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[ 5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[ 6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[ 7]; + + u32 salt_buf2[4]; + + salt_buf2[0] = 0; + salt_buf2[1] = 0; + salt_buf2[2] = 0; + salt_buf2[3] = 0; + + u32 salt_buf3[4]; + + salt_buf3[0] = 0; + salt_buf3[1] = 0; + salt_buf3[2] = 0; + salt_buf3[3] = 0; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + const u32 pw_salt_len = pw_len + salt_len; + + /** + * loop + */ + + u32x w0l = w0[0]; + + for (u32 il_pos = 0; il_pos < bfs_cnt; il_pos++) + { + const u32 w0r = bfs_buf[il_pos].i; + + w0[0] = w0l | w0r; + + /** + * prepend salt + */ + + u32x w0_t2[4]; + u32x w1_t2[4]; + u32x w2_t2[4]; + u32x w3_t2[4]; + + w0_t2[0] = swap_workaround (w0[0]); + w0_t2[1] = swap_workaround (w0[1]); + w0_t2[2] = swap_workaround (w0[2]); + w0_t2[3] = swap_workaround (w0[3]); + w1_t2[0] = swap_workaround (w1[0]); + w1_t2[1] = swap_workaround (w1[1]); + w1_t2[2] = swap_workaround (w1[2]); + w1_t2[3] = swap_workaround (w1[3]); + w2_t2[0] = swap_workaround (w2[0]); + w2_t2[1] = swap_workaround (w2[1]); + w2_t2[2] = swap_workaround (w2[2]); + w2_t2[3] = swap_workaround (w2[3]); + w3_t2[0] = swap_workaround (w3[0]); + w3_t2[1] = swap_workaround (w3[1]); + w3_t2[2] = swap_workaround (w3[2]); + w3_t2[3] = swap_workaround (w3[3]); + + switch_buffer_by_offset (w0_t2, w1_t2, w2_t2, w3_t2, salt_len); + + w0_t2[0] |= salt_buf0[0]; + w0_t2[1] |= salt_buf0[1]; + w0_t2[2] |= salt_buf0[2]; + w0_t2[3] |= salt_buf0[3]; + w1_t2[0] |= salt_buf1[0]; + w1_t2[1] |= salt_buf1[1]; + w1_t2[2] |= salt_buf1[2]; + w1_t2[3] |= salt_buf1[3]; + w2_t2[0] |= salt_buf2[0]; + w2_t2[1] |= salt_buf2[1]; + w2_t2[2] |= salt_buf2[2]; + w2_t2[3] |= salt_buf2[3]; + w3_t2[0] |= salt_buf3[0]; + w3_t2[1] |= salt_buf3[1]; + w3_t2[2] |= salt_buf3[2]; + w3_t2[3] |= salt_buf3[3]; + + /** + * sha256 + */ + + u32x w0_t = swap_workaround (w0_t2[0]); + u32x w1_t = swap_workaround (w0_t2[1]); + u32x w2_t = swap_workaround (w0_t2[2]); + u32x w3_t = swap_workaround (w0_t2[3]); + u32x w4_t = swap_workaround (w1_t2[0]); + u32x w5_t = swap_workaround (w1_t2[1]); + u32x w6_t = swap_workaround (w1_t2[2]); + u32x w7_t = swap_workaround (w1_t2[3]); + u32x w8_t = swap_workaround (w2_t2[0]); + u32x w9_t = swap_workaround (w2_t2[1]); + u32x wa_t = swap_workaround (w2_t2[2]); + u32x wb_t = swap_workaround (w2_t2[3]); + u32x wc_t = swap_workaround (w3_t2[0]); + u32x wd_t = swap_workaround (w3_t2[1]); + u32x we_t = 0; + u32x wf_t = pw_salt_len * 8; + + u32x a = SHA256M_A; + u32x b = SHA256M_B; + u32x c = SHA256M_C; + u32x d = SHA256M_D; + u32x e = SHA256M_E; + u32x f = SHA256M_F; + u32x g = SHA256M_G; + u32x h = SHA256M_H; + + SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C00); + SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C01); + SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C02); + SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C03); + SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C04); + SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C05); + SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C06); + SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C07); + SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C08); + SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C09); + SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C0a); + SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C0b); + SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C0c); + SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C0d); + SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C0e); + SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C0f); + + w0_t = SHA256_EXPAND (we_t, w9_t, w1_t, w0_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C10); + w1_t = SHA256_EXPAND (wf_t, wa_t, w2_t, w1_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C11); + w2_t = SHA256_EXPAND (w0_t, wb_t, w3_t, w2_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C12); + w3_t = SHA256_EXPAND (w1_t, wc_t, w4_t, w3_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C13); + w4_t = SHA256_EXPAND (w2_t, wd_t, w5_t, w4_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C14); + w5_t = SHA256_EXPAND (w3_t, we_t, w6_t, w5_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C15); + w6_t = SHA256_EXPAND (w4_t, wf_t, w7_t, w6_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C16); + w7_t = SHA256_EXPAND (w5_t, w0_t, w8_t, w7_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C17); + w8_t = SHA256_EXPAND (w6_t, w1_t, w9_t, w8_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C18); + w9_t = SHA256_EXPAND (w7_t, w2_t, wa_t, w9_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C19); + wa_t = SHA256_EXPAND (w8_t, w3_t, wb_t, wa_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C1a); + wb_t = SHA256_EXPAND (w9_t, w4_t, wc_t, wb_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C1b); + wc_t = SHA256_EXPAND (wa_t, w5_t, wd_t, wc_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C1c); + wd_t = SHA256_EXPAND (wb_t, w6_t, we_t, wd_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C1d); + we_t = SHA256_EXPAND (wc_t, w7_t, wf_t, we_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C1e); + wf_t = SHA256_EXPAND (wd_t, w8_t, w0_t, wf_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C1f); + + w0_t = SHA256_EXPAND (we_t, w9_t, w1_t, w0_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C20); + w1_t = SHA256_EXPAND (wf_t, wa_t, w2_t, w1_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C21); + w2_t = SHA256_EXPAND (w0_t, wb_t, w3_t, w2_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C22); + w3_t = SHA256_EXPAND (w1_t, wc_t, w4_t, w3_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C23); + w4_t = SHA256_EXPAND (w2_t, wd_t, w5_t, w4_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C24); + w5_t = SHA256_EXPAND (w3_t, we_t, w6_t, w5_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C25); + w6_t = SHA256_EXPAND (w4_t, wf_t, w7_t, w6_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C26); + w7_t = SHA256_EXPAND (w5_t, w0_t, w8_t, w7_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C27); + w8_t = SHA256_EXPAND (w6_t, w1_t, w9_t, w8_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C28); + w9_t = SHA256_EXPAND (w7_t, w2_t, wa_t, w9_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C29); + wa_t = SHA256_EXPAND (w8_t, w3_t, wb_t, wa_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C2a); + wb_t = SHA256_EXPAND (w9_t, w4_t, wc_t, wb_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C2b); + wc_t = SHA256_EXPAND (wa_t, w5_t, wd_t, wc_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C2c); + wd_t = SHA256_EXPAND (wb_t, w6_t, we_t, wd_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C2d); + we_t = SHA256_EXPAND (wc_t, w7_t, wf_t, we_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C2e); + wf_t = SHA256_EXPAND (wd_t, w8_t, w0_t, wf_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C2f); + + w0_t = SHA256_EXPAND (we_t, w9_t, w1_t, w0_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C30); + w1_t = SHA256_EXPAND (wf_t, wa_t, w2_t, w1_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C31); + w2_t = SHA256_EXPAND (w0_t, wb_t, w3_t, w2_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C32); + w3_t = SHA256_EXPAND (w1_t, wc_t, w4_t, w3_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C33); + w4_t = SHA256_EXPAND (w2_t, wd_t, w5_t, w4_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C34); + w5_t = SHA256_EXPAND (w3_t, we_t, w6_t, w5_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C35); + w6_t = SHA256_EXPAND (w4_t, wf_t, w7_t, w6_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C36); + w7_t = SHA256_EXPAND (w5_t, w0_t, w8_t, w7_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C37); + w8_t = SHA256_EXPAND (w6_t, w1_t, w9_t, w8_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C38); + w9_t = SHA256_EXPAND (w7_t, w2_t, wa_t, w9_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C39); + wa_t = SHA256_EXPAND (w8_t, w3_t, wb_t, wa_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C3a); + wb_t = SHA256_EXPAND (w9_t, w4_t, wc_t, wb_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C3b); + wc_t = SHA256_EXPAND (wa_t, w5_t, wd_t, wc_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C3c); + wd_t = SHA256_EXPAND (wb_t, w6_t, we_t, wd_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C3d); + we_t = SHA256_EXPAND (wc_t, w7_t, wf_t, we_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C3e); + wf_t = SHA256_EXPAND (wd_t, w8_t, w0_t, wf_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C3f); + + + const u32x r0 = d; + const u32x r1 = h; + const u32x r2 = c; + const u32x r3 = g; + + #include VECT_COMPARE_M + } +} + +static void m01420s (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], const u32 pw_len, __global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset) +{ + /** + * modifier + */ + + const u32 gid = get_global_id (0); + const u32 lid = get_local_id (0); + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[ 1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[ 2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[ 3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[ 4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[ 5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[ 6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[ 7]; + + u32 salt_buf2[4]; + + salt_buf2[0] = 0; + salt_buf2[1] = 0; + salt_buf2[2] = 0; + salt_buf2[3] = 0; + + u32 salt_buf3[4]; + + salt_buf3[0] = 0; + salt_buf3[1] = 0; + salt_buf3[2] = 0; + salt_buf3[3] = 0; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + const u32 pw_salt_len = pw_len + salt_len; + + /** + * loop + */ + + u32x w0l = w0[0]; + + for (u32 il_pos = 0; il_pos < bfs_cnt; il_pos++) + { + const u32 w0r = bfs_buf[il_pos].i; + + w0[0] = w0l | w0r; + + /** + * prepend salt + */ + + u32x w0_t2[4]; + u32x w1_t2[4]; + u32x w2_t2[4]; + u32x w3_t2[4]; + + w0_t2[0] = swap_workaround (w0[0]); + w0_t2[1] = swap_workaround (w0[1]); + w0_t2[2] = swap_workaround (w0[2]); + w0_t2[3] = swap_workaround (w0[3]); + w1_t2[0] = swap_workaround (w1[0]); + w1_t2[1] = swap_workaround (w1[1]); + w1_t2[2] = swap_workaround (w1[2]); + w1_t2[3] = swap_workaround (w1[3]); + w2_t2[0] = swap_workaround (w2[0]); + w2_t2[1] = swap_workaround (w2[1]); + w2_t2[2] = swap_workaround (w2[2]); + w2_t2[3] = swap_workaround (w2[3]); + w3_t2[0] = swap_workaround (w3[0]); + w3_t2[1] = swap_workaround (w3[1]); + w3_t2[2] = swap_workaround (w3[2]); + w3_t2[3] = swap_workaround (w3[3]); + + switch_buffer_by_offset (w0_t2, w1_t2, w2_t2, w3_t2, salt_len); + + w0_t2[0] |= salt_buf0[0]; + w0_t2[1] |= salt_buf0[1]; + w0_t2[2] |= salt_buf0[2]; + w0_t2[3] |= salt_buf0[3]; + w1_t2[0] |= salt_buf1[0]; + w1_t2[1] |= salt_buf1[1]; + w1_t2[2] |= salt_buf1[2]; + w1_t2[3] |= salt_buf1[3]; + w2_t2[0] |= salt_buf2[0]; + w2_t2[1] |= salt_buf2[1]; + w2_t2[2] |= salt_buf2[2]; + w2_t2[3] |= salt_buf2[3]; + w3_t2[0] |= salt_buf3[0]; + w3_t2[1] |= salt_buf3[1]; + w3_t2[2] |= salt_buf3[2]; + w3_t2[3] |= salt_buf3[3]; + + /** + * sha256 + */ + + u32x w0_t = swap_workaround (w0_t2[0]); + u32x w1_t = swap_workaround (w0_t2[1]); + u32x w2_t = swap_workaround (w0_t2[2]); + u32x w3_t = swap_workaround (w0_t2[3]); + u32x w4_t = swap_workaround (w1_t2[0]); + u32x w5_t = swap_workaround (w1_t2[1]); + u32x w6_t = swap_workaround (w1_t2[2]); + u32x w7_t = swap_workaround (w1_t2[3]); + u32x w8_t = swap_workaround (w2_t2[0]); + u32x w9_t = swap_workaround (w2_t2[1]); + u32x wa_t = swap_workaround (w2_t2[2]); + u32x wb_t = swap_workaround (w2_t2[3]); + u32x wc_t = swap_workaround (w3_t2[0]); + u32x wd_t = swap_workaround (w3_t2[1]); + u32x we_t = 0; + u32x wf_t = pw_salt_len * 8; + + u32x a = SHA256M_A; + u32x b = SHA256M_B; + u32x c = SHA256M_C; + u32x d = SHA256M_D; + u32x e = SHA256M_E; + u32x f = SHA256M_F; + u32x g = SHA256M_G; + u32x h = SHA256M_H; + + SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C00); + SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C01); + SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C02); + SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C03); + SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C04); + SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C05); + SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C06); + SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C07); + SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C08); + SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C09); + SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C0a); + SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C0b); + SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C0c); + SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C0d); + SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C0e); + SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C0f); + + w0_t = SHA256_EXPAND (we_t, w9_t, w1_t, w0_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C10); + w1_t = SHA256_EXPAND (wf_t, wa_t, w2_t, w1_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C11); + w2_t = SHA256_EXPAND (w0_t, wb_t, w3_t, w2_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C12); + w3_t = SHA256_EXPAND (w1_t, wc_t, w4_t, w3_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C13); + w4_t = SHA256_EXPAND (w2_t, wd_t, w5_t, w4_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C14); + w5_t = SHA256_EXPAND (w3_t, we_t, w6_t, w5_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C15); + w6_t = SHA256_EXPAND (w4_t, wf_t, w7_t, w6_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C16); + w7_t = SHA256_EXPAND (w5_t, w0_t, w8_t, w7_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C17); + w8_t = SHA256_EXPAND (w6_t, w1_t, w9_t, w8_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C18); + w9_t = SHA256_EXPAND (w7_t, w2_t, wa_t, w9_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C19); + wa_t = SHA256_EXPAND (w8_t, w3_t, wb_t, wa_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C1a); + wb_t = SHA256_EXPAND (w9_t, w4_t, wc_t, wb_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C1b); + wc_t = SHA256_EXPAND (wa_t, w5_t, wd_t, wc_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C1c); + wd_t = SHA256_EXPAND (wb_t, w6_t, we_t, wd_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C1d); + we_t = SHA256_EXPAND (wc_t, w7_t, wf_t, we_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C1e); + wf_t = SHA256_EXPAND (wd_t, w8_t, w0_t, wf_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C1f); + + w0_t = SHA256_EXPAND (we_t, w9_t, w1_t, w0_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C20); + w1_t = SHA256_EXPAND (wf_t, wa_t, w2_t, w1_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C21); + w2_t = SHA256_EXPAND (w0_t, wb_t, w3_t, w2_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C22); + w3_t = SHA256_EXPAND (w1_t, wc_t, w4_t, w3_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C23); + w4_t = SHA256_EXPAND (w2_t, wd_t, w5_t, w4_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C24); + w5_t = SHA256_EXPAND (w3_t, we_t, w6_t, w5_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C25); + w6_t = SHA256_EXPAND (w4_t, wf_t, w7_t, w6_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C26); + w7_t = SHA256_EXPAND (w5_t, w0_t, w8_t, w7_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C27); + w8_t = SHA256_EXPAND (w6_t, w1_t, w9_t, w8_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C28); + w9_t = SHA256_EXPAND (w7_t, w2_t, wa_t, w9_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C29); + wa_t = SHA256_EXPAND (w8_t, w3_t, wb_t, wa_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C2a); + wb_t = SHA256_EXPAND (w9_t, w4_t, wc_t, wb_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C2b); + wc_t = SHA256_EXPAND (wa_t, w5_t, wd_t, wc_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C2c); + wd_t = SHA256_EXPAND (wb_t, w6_t, we_t, wd_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C2d); + we_t = SHA256_EXPAND (wc_t, w7_t, wf_t, we_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C2e); + wf_t = SHA256_EXPAND (wd_t, w8_t, w0_t, wf_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C2f); + + w0_t = SHA256_EXPAND (we_t, w9_t, w1_t, w0_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C30); + w1_t = SHA256_EXPAND (wf_t, wa_t, w2_t, w1_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C31); + w2_t = SHA256_EXPAND (w0_t, wb_t, w3_t, w2_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C32); + w3_t = SHA256_EXPAND (w1_t, wc_t, w4_t, w3_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C33); + w4_t = SHA256_EXPAND (w2_t, wd_t, w5_t, w4_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C34); + w5_t = SHA256_EXPAND (w3_t, we_t, w6_t, w5_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C35); + w6_t = SHA256_EXPAND (w4_t, wf_t, w7_t, w6_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C36); + w7_t = SHA256_EXPAND (w5_t, w0_t, w8_t, w7_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C37); + w8_t = SHA256_EXPAND (w6_t, w1_t, w9_t, w8_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C38); + w9_t = SHA256_EXPAND (w7_t, w2_t, wa_t, w9_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C39); + wa_t = SHA256_EXPAND (w8_t, w3_t, wb_t, wa_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C3a); + wb_t = SHA256_EXPAND (w9_t, w4_t, wc_t, wb_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C3b); + wc_t = SHA256_EXPAND (wa_t, w5_t, wd_t, wc_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C3c); + wd_t = SHA256_EXPAND (wb_t, w6_t, we_t, wd_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C3d); + we_t = SHA256_EXPAND (wc_t, w7_t, wf_t, we_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C3e); + wf_t = SHA256_EXPAND (wd_t, w8_t, w0_t, wf_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C3f); + + + const u32x r0 = d; + const u32x r1 = h; + const u32x r2 = c; + const u32x r3 = g; + + #include VECT_COMPARE_S + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m01420_m04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m01420m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m01420_m08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m01420m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m01420_m16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = pws[gid].i[ 8]; + w2[1] = pws[gid].i[ 9]; + w2[2] = pws[gid].i[10]; + w2[3] = pws[gid].i[11]; + + u32x w3[4]; + + w3[0] = pws[gid].i[12]; + w3[1] = pws[gid].i[13]; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m01420m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m01420_s04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m01420s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m01420_s08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m01420s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m01420_s16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = pws[gid].i[ 8]; + w2[1] = pws[gid].i[ 9]; + w2[2] = pws[gid].i[10]; + w2[3] = pws[gid].i[11]; + + u32x w3[4]; + + w3[0] = pws[gid].i[12]; + w3[1] = pws[gid].i[13]; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m01420s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} diff --git a/amd/m01430_a0.cl b/amd/m01430_a0.cl new file mode 100644 index 0000000000..7665ea2a8f --- /dev/null +++ b/amd/m01430_a0.cl @@ -0,0 +1,593 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _SHA256_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW4 +#define VECT_SIZE2 +#endif + +#ifdef VLIW5 +#define VECT_SIZE2 +#endif + +#define DGST_R0 3 +#define DGST_R1 7 +#define DGST_R2 2 +#define DGST_R3 6 + +#include "include/kernel_functions.c" +#include "types_amd.c" +#include "common_amd.c" +#include "include/rp_gpu.h" +#include "rp_amd.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m01430_m04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + u32x pw_buf1[4]; + + pw_buf1[0] = pws[gid].i[ 4]; + pw_buf1[1] = pws[gid].i[ 5]; + pw_buf1[2] = pws[gid].i[ 6]; + pw_buf1[3] = pws[gid].i[ 7]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[7]; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + + w0[0] = pw_buf0[0]; + w0[1] = pw_buf0[1]; + w0[2] = pw_buf0[2]; + w0[3] = pw_buf0[3]; + + u32x w1[4]; + + w1[0] = pw_buf1[0]; + w1[1] = pw_buf1[1]; + w1[2] = pw_buf1[2]; + w1[3] = pw_buf1[3]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 out_len = apply_rules (rules_buf[il_pos].cmds, w0, w1, pw_len); + + /** + * append salt + */ + + u32 s0[4]; + + s0[0] = salt_buf0[0]; + s0[1] = salt_buf0[1]; + s0[2] = salt_buf0[2]; + s0[3] = salt_buf0[3]; + + u32 s1[4]; + + s1[0] = salt_buf1[0]; + s1[1] = salt_buf1[1]; + s1[2] = salt_buf1[2]; + s1[3] = salt_buf1[3]; + + u32 s2[4]; + + s2[0] = 0; + s2[1] = 0; + s2[2] = 0; + s2[3] = 0; + + u32 s3[4]; + + s3[0] = 0; + s3[1] = 0; + s3[2] = 0; + s3[3] = 0; + + switch_buffer_by_offset (s0, s1, s2, s3, (out_len * 2)); + + const u32 out_salt_len = (out_len * 2) + salt_len; + + u32x w0_t2[4]; + u32x w1_t2[4]; + u32x w2_t2[4]; + u32x w3_t2[4]; + + make_unicode (w0, w0_t2, w1_t2); + make_unicode (w1, w2_t2, w3_t2); + + w0_t2[0] |= s0[0]; + w0_t2[1] |= s0[1]; + w0_t2[2] |= s0[2]; + w0_t2[3] |= s0[3]; + w1_t2[0] |= s1[0]; + w1_t2[1] |= s1[1]; + w1_t2[2] |= s1[2]; + w1_t2[3] |= s1[3]; + w2_t2[0] |= s2[0]; + w2_t2[1] |= s2[1]; + w2_t2[2] |= s2[2]; + w2_t2[3] |= s2[3]; + w3_t2[0] |= s3[0]; + w3_t2[1] |= s3[1]; + w3_t2[2] |= s3[2]; + w3_t2[3] |= s3[3]; + + append_0x80_4 (w0_t2, w1_t2, w2_t2, w3_t2, out_salt_len); + + /** + * sha256 + */ + + u32x w0_t = swap_workaround (w0_t2[0]); + u32x w1_t = swap_workaround (w0_t2[1]); + u32x w2_t = swap_workaround (w0_t2[2]); + u32x w3_t = swap_workaround (w0_t2[3]); + u32x w4_t = swap_workaround (w1_t2[0]); + u32x w5_t = swap_workaround (w1_t2[1]); + u32x w6_t = swap_workaround (w1_t2[2]); + u32x w7_t = swap_workaround (w1_t2[3]); + u32x w8_t = swap_workaround (w2_t2[0]); + u32x w9_t = swap_workaround (w2_t2[1]); + u32x wa_t = swap_workaround (w2_t2[2]); + u32x wb_t = swap_workaround (w2_t2[3]); + u32x wc_t = swap_workaround (w3_t2[0]); + u32x wd_t = swap_workaround (w3_t2[1]); + u32x we_t = 0; + u32x wf_t = out_salt_len * 8; + + u32x a = SHA256M_A; + u32x b = SHA256M_B; + u32x c = SHA256M_C; + u32x d = SHA256M_D; + u32x e = SHA256M_E; + u32x f = SHA256M_F; + u32x g = SHA256M_G; + u32x h = SHA256M_H; + + SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C00); + SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C01); + SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C02); + SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C03); + SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C04); + SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C05); + SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C06); + SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C07); + SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C08); + SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C09); + SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C0a); + SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C0b); + SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C0c); + SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C0d); + SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C0e); + SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C0f); + + w0_t = SHA256_EXPAND (we_t, w9_t, w1_t, w0_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C10); + w1_t = SHA256_EXPAND (wf_t, wa_t, w2_t, w1_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C11); + w2_t = SHA256_EXPAND (w0_t, wb_t, w3_t, w2_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C12); + w3_t = SHA256_EXPAND (w1_t, wc_t, w4_t, w3_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C13); + w4_t = SHA256_EXPAND (w2_t, wd_t, w5_t, w4_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C14); + w5_t = SHA256_EXPAND (w3_t, we_t, w6_t, w5_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C15); + w6_t = SHA256_EXPAND (w4_t, wf_t, w7_t, w6_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C16); + w7_t = SHA256_EXPAND (w5_t, w0_t, w8_t, w7_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C17); + w8_t = SHA256_EXPAND (w6_t, w1_t, w9_t, w8_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C18); + w9_t = SHA256_EXPAND (w7_t, w2_t, wa_t, w9_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C19); + wa_t = SHA256_EXPAND (w8_t, w3_t, wb_t, wa_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C1a); + wb_t = SHA256_EXPAND (w9_t, w4_t, wc_t, wb_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C1b); + wc_t = SHA256_EXPAND (wa_t, w5_t, wd_t, wc_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C1c); + wd_t = SHA256_EXPAND (wb_t, w6_t, we_t, wd_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C1d); + we_t = SHA256_EXPAND (wc_t, w7_t, wf_t, we_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C1e); + wf_t = SHA256_EXPAND (wd_t, w8_t, w0_t, wf_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C1f); + + w0_t = SHA256_EXPAND (we_t, w9_t, w1_t, w0_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C20); + w1_t = SHA256_EXPAND (wf_t, wa_t, w2_t, w1_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C21); + w2_t = SHA256_EXPAND (w0_t, wb_t, w3_t, w2_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C22); + w3_t = SHA256_EXPAND (w1_t, wc_t, w4_t, w3_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C23); + w4_t = SHA256_EXPAND (w2_t, wd_t, w5_t, w4_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C24); + w5_t = SHA256_EXPAND (w3_t, we_t, w6_t, w5_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C25); + w6_t = SHA256_EXPAND (w4_t, wf_t, w7_t, w6_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C26); + w7_t = SHA256_EXPAND (w5_t, w0_t, w8_t, w7_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C27); + w8_t = SHA256_EXPAND (w6_t, w1_t, w9_t, w8_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C28); + w9_t = SHA256_EXPAND (w7_t, w2_t, wa_t, w9_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C29); + wa_t = SHA256_EXPAND (w8_t, w3_t, wb_t, wa_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C2a); + wb_t = SHA256_EXPAND (w9_t, w4_t, wc_t, wb_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C2b); + wc_t = SHA256_EXPAND (wa_t, w5_t, wd_t, wc_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C2c); + wd_t = SHA256_EXPAND (wb_t, w6_t, we_t, wd_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C2d); + we_t = SHA256_EXPAND (wc_t, w7_t, wf_t, we_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C2e); + wf_t = SHA256_EXPAND (wd_t, w8_t, w0_t, wf_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C2f); + + w0_t = SHA256_EXPAND (we_t, w9_t, w1_t, w0_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C30); + w1_t = SHA256_EXPAND (wf_t, wa_t, w2_t, w1_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C31); + w2_t = SHA256_EXPAND (w0_t, wb_t, w3_t, w2_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C32); + w3_t = SHA256_EXPAND (w1_t, wc_t, w4_t, w3_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C33); + w4_t = SHA256_EXPAND (w2_t, wd_t, w5_t, w4_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C34); + w5_t = SHA256_EXPAND (w3_t, we_t, w6_t, w5_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C35); + w6_t = SHA256_EXPAND (w4_t, wf_t, w7_t, w6_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C36); + w7_t = SHA256_EXPAND (w5_t, w0_t, w8_t, w7_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C37); + w8_t = SHA256_EXPAND (w6_t, w1_t, w9_t, w8_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C38); + w9_t = SHA256_EXPAND (w7_t, w2_t, wa_t, w9_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C39); + wa_t = SHA256_EXPAND (w8_t, w3_t, wb_t, wa_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C3a); + wb_t = SHA256_EXPAND (w9_t, w4_t, wc_t, wb_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C3b); + wc_t = SHA256_EXPAND (wa_t, w5_t, wd_t, wc_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C3c); + wd_t = SHA256_EXPAND (wb_t, w6_t, we_t, wd_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C3d); + we_t = SHA256_EXPAND (wc_t, w7_t, wf_t, we_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C3e); + wf_t = SHA256_EXPAND (wd_t, w8_t, w0_t, wf_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C3f); + + + const u32x r0 = d; + const u32x r1 = h; + const u32x r2 = c; + const u32x r3 = g; + + #include VECT_COMPARE_M + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m01430_m08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m01430_m16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m01430_s04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + u32x pw_buf1[4]; + + pw_buf1[0] = pws[gid].i[ 4]; + pw_buf1[1] = pws[gid].i[ 5]; + pw_buf1[2] = pws[gid].i[ 6]; + pw_buf1[3] = pws[gid].i[ 7]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[7]; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + + w0[0] = pw_buf0[0]; + w0[1] = pw_buf0[1]; + w0[2] = pw_buf0[2]; + w0[3] = pw_buf0[3]; + + u32x w1[4]; + + w1[0] = pw_buf1[0]; + w1[1] = pw_buf1[1]; + w1[2] = pw_buf1[2]; + w1[3] = pw_buf1[3]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 out_len = apply_rules (rules_buf[il_pos].cmds, w0, w1, pw_len); + + /** + * append salt + */ + + u32 s0[4]; + + s0[0] = salt_buf0[0]; + s0[1] = salt_buf0[1]; + s0[2] = salt_buf0[2]; + s0[3] = salt_buf0[3]; + + u32 s1[4]; + + s1[0] = salt_buf1[0]; + s1[1] = salt_buf1[1]; + s1[2] = salt_buf1[2]; + s1[3] = salt_buf1[3]; + + u32 s2[4]; + + s2[0] = 0; + s2[1] = 0; + s2[2] = 0; + s2[3] = 0; + + u32 s3[4]; + + s3[0] = 0; + s3[1] = 0; + s3[2] = 0; + s3[3] = 0; + + switch_buffer_by_offset (s0, s1, s2, s3, (out_len * 2)); + + const u32 out_salt_len = (out_len * 2) + salt_len; + + u32x w0_t2[4]; + u32x w1_t2[4]; + u32x w2_t2[4]; + u32x w3_t2[4]; + + make_unicode (w0, w0_t2, w1_t2); + make_unicode (w1, w2_t2, w3_t2); + + w0_t2[0] |= s0[0]; + w0_t2[1] |= s0[1]; + w0_t2[2] |= s0[2]; + w0_t2[3] |= s0[3]; + w1_t2[0] |= s1[0]; + w1_t2[1] |= s1[1]; + w1_t2[2] |= s1[2]; + w1_t2[3] |= s1[3]; + w2_t2[0] |= s2[0]; + w2_t2[1] |= s2[1]; + w2_t2[2] |= s2[2]; + w2_t2[3] |= s2[3]; + w3_t2[0] |= s3[0]; + w3_t2[1] |= s3[1]; + w3_t2[2] |= s3[2]; + w3_t2[3] |= s3[3]; + + append_0x80_4 (w0_t2, w1_t2, w2_t2, w3_t2, out_salt_len); + + /** + * sha256 + */ + + u32x w0_t = swap_workaround (w0_t2[0]); + u32x w1_t = swap_workaround (w0_t2[1]); + u32x w2_t = swap_workaround (w0_t2[2]); + u32x w3_t = swap_workaround (w0_t2[3]); + u32x w4_t = swap_workaround (w1_t2[0]); + u32x w5_t = swap_workaround (w1_t2[1]); + u32x w6_t = swap_workaround (w1_t2[2]); + u32x w7_t = swap_workaround (w1_t2[3]); + u32x w8_t = swap_workaround (w2_t2[0]); + u32x w9_t = swap_workaround (w2_t2[1]); + u32x wa_t = swap_workaround (w2_t2[2]); + u32x wb_t = swap_workaround (w2_t2[3]); + u32x wc_t = swap_workaround (w3_t2[0]); + u32x wd_t = swap_workaround (w3_t2[1]); + u32x we_t = 0; + u32x wf_t = out_salt_len * 8; + + u32x a = SHA256M_A; + u32x b = SHA256M_B; + u32x c = SHA256M_C; + u32x d = SHA256M_D; + u32x e = SHA256M_E; + u32x f = SHA256M_F; + u32x g = SHA256M_G; + u32x h = SHA256M_H; + + SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C00); + SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C01); + SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C02); + SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C03); + SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C04); + SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C05); + SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C06); + SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C07); + SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C08); + SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C09); + SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C0a); + SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C0b); + SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C0c); + SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C0d); + SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C0e); + SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C0f); + + w0_t = SHA256_EXPAND (we_t, w9_t, w1_t, w0_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C10); + w1_t = SHA256_EXPAND (wf_t, wa_t, w2_t, w1_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C11); + w2_t = SHA256_EXPAND (w0_t, wb_t, w3_t, w2_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C12); + w3_t = SHA256_EXPAND (w1_t, wc_t, w4_t, w3_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C13); + w4_t = SHA256_EXPAND (w2_t, wd_t, w5_t, w4_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C14); + w5_t = SHA256_EXPAND (w3_t, we_t, w6_t, w5_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C15); + w6_t = SHA256_EXPAND (w4_t, wf_t, w7_t, w6_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C16); + w7_t = SHA256_EXPAND (w5_t, w0_t, w8_t, w7_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C17); + w8_t = SHA256_EXPAND (w6_t, w1_t, w9_t, w8_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C18); + w9_t = SHA256_EXPAND (w7_t, w2_t, wa_t, w9_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C19); + wa_t = SHA256_EXPAND (w8_t, w3_t, wb_t, wa_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C1a); + wb_t = SHA256_EXPAND (w9_t, w4_t, wc_t, wb_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C1b); + wc_t = SHA256_EXPAND (wa_t, w5_t, wd_t, wc_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C1c); + wd_t = SHA256_EXPAND (wb_t, w6_t, we_t, wd_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C1d); + we_t = SHA256_EXPAND (wc_t, w7_t, wf_t, we_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C1e); + wf_t = SHA256_EXPAND (wd_t, w8_t, w0_t, wf_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C1f); + + w0_t = SHA256_EXPAND (we_t, w9_t, w1_t, w0_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C20); + w1_t = SHA256_EXPAND (wf_t, wa_t, w2_t, w1_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C21); + w2_t = SHA256_EXPAND (w0_t, wb_t, w3_t, w2_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C22); + w3_t = SHA256_EXPAND (w1_t, wc_t, w4_t, w3_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C23); + w4_t = SHA256_EXPAND (w2_t, wd_t, w5_t, w4_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C24); + w5_t = SHA256_EXPAND (w3_t, we_t, w6_t, w5_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C25); + w6_t = SHA256_EXPAND (w4_t, wf_t, w7_t, w6_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C26); + w7_t = SHA256_EXPAND (w5_t, w0_t, w8_t, w7_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C27); + w8_t = SHA256_EXPAND (w6_t, w1_t, w9_t, w8_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C28); + w9_t = SHA256_EXPAND (w7_t, w2_t, wa_t, w9_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C29); + wa_t = SHA256_EXPAND (w8_t, w3_t, wb_t, wa_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C2a); + wb_t = SHA256_EXPAND (w9_t, w4_t, wc_t, wb_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C2b); + wc_t = SHA256_EXPAND (wa_t, w5_t, wd_t, wc_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C2c); + wd_t = SHA256_EXPAND (wb_t, w6_t, we_t, wd_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C2d); + we_t = SHA256_EXPAND (wc_t, w7_t, wf_t, we_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C2e); + wf_t = SHA256_EXPAND (wd_t, w8_t, w0_t, wf_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C2f); + + w0_t = SHA256_EXPAND (we_t, w9_t, w1_t, w0_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C30); + w1_t = SHA256_EXPAND (wf_t, wa_t, w2_t, w1_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C31); + w2_t = SHA256_EXPAND (w0_t, wb_t, w3_t, w2_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C32); + w3_t = SHA256_EXPAND (w1_t, wc_t, w4_t, w3_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C33); + w4_t = SHA256_EXPAND (w2_t, wd_t, w5_t, w4_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C34); + w5_t = SHA256_EXPAND (w3_t, we_t, w6_t, w5_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C35); + w6_t = SHA256_EXPAND (w4_t, wf_t, w7_t, w6_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C36); + w7_t = SHA256_EXPAND (w5_t, w0_t, w8_t, w7_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C37); + w8_t = SHA256_EXPAND (w6_t, w1_t, w9_t, w8_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C38); + w9_t = SHA256_EXPAND (w7_t, w2_t, wa_t, w9_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C39); + wa_t = SHA256_EXPAND (w8_t, w3_t, wb_t, wa_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C3a); + wb_t = SHA256_EXPAND (w9_t, w4_t, wc_t, wb_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C3b); + wc_t = SHA256_EXPAND (wa_t, w5_t, wd_t, wc_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C3c); + wd_t = SHA256_EXPAND (wb_t, w6_t, we_t, wd_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C3d); + we_t = SHA256_EXPAND (wc_t, w7_t, wf_t, we_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C3e); + wf_t = SHA256_EXPAND (wd_t, w8_t, w0_t, wf_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C3f); + + + const u32x r0 = d; + const u32x r1 = h; + const u32x r2 = c; + const u32x r3 = g; + + #include VECT_COMPARE_S + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m01430_s08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m01430_s16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/amd/m01430_a1.cl b/amd/m01430_a1.cl new file mode 100644 index 0000000000..32df53891b --- /dev/null +++ b/amd/m01430_a1.cl @@ -0,0 +1,675 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _SHA256_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW4 +#define VECT_SIZE2 +#endif + +#ifdef VLIW5 +#define VECT_SIZE2 +#endif + +#define DGST_R0 3 +#define DGST_R1 7 +#define DGST_R2 2 +#define DGST_R3 6 + +#include "include/kernel_functions.c" +#include "types_amd.c" +#include "common_amd.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m01430_m04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, combs_buf[0].pw_len); + } + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[7]; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = combs_buf[il_pos].pw_len; + + const u32 pw_len = pw_l_len + pw_r_len; + + u32 wordr0[4]; + u32 wordr1[4]; + u32 wordr2[4]; + u32 wordr3[4]; + + wordr0[0] = combs_buf[il_pos].i[0]; + wordr0[1] = combs_buf[il_pos].i[1]; + wordr0[2] = combs_buf[il_pos].i[2]; + wordr0[3] = combs_buf[il_pos].i[3]; + wordr1[0] = combs_buf[il_pos].i[4]; + wordr1[1] = combs_buf[il_pos].i[5]; + wordr1[2] = combs_buf[il_pos].i[6]; + wordr1[3] = combs_buf[il_pos].i[7]; + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + u32x w0[4]; + u32x w1[4]; + u32x w2[4]; + u32x w3[4]; + + w0[0] = wordl0[0] | wordr0[0]; + w0[1] = wordl0[1] | wordr0[1]; + w0[2] = wordl0[2] | wordr0[2]; + w0[3] = wordl0[3] | wordr0[3]; + w1[0] = wordl1[0] | wordr1[0]; + w1[1] = wordl1[1] | wordr1[1]; + w1[2] = wordl1[2] | wordr1[2]; + w1[3] = wordl1[3] | wordr1[3]; + w2[0] = wordl2[0] | wordr2[0]; + w2[1] = wordl2[1] | wordr2[1]; + w2[2] = wordl2[2] | wordr2[2]; + w2[3] = wordl2[3] | wordr2[3]; + w3[0] = wordl3[0] | wordr3[0]; + w3[1] = wordl3[1] | wordr3[1]; + w3[2] = wordl3[2] | wordr3[2]; + w3[3] = wordl3[3] | wordr3[3]; + + /** + * append salt + */ + + u32 s0[4]; + + s0[0] = salt_buf0[0]; + s0[1] = salt_buf0[1]; + s0[2] = salt_buf0[2]; + s0[3] = salt_buf0[3]; + + u32 s1[4]; + + s1[0] = salt_buf1[0]; + s1[1] = salt_buf1[1]; + s1[2] = salt_buf1[2]; + s1[3] = salt_buf1[3]; + + u32 s2[4]; + + s2[0] = 0; + s2[1] = 0; + s2[2] = 0; + s2[3] = 0; + + u32 s3[4]; + + s3[0] = 0; + s3[1] = 0; + s3[2] = 0; + s3[3] = 0; + + switch_buffer_by_offset (s0, s1, s2, s3, (pw_len * 2)); + + const u32 pw_salt_len = (pw_len * 2) + salt_len; + + u32x w0_t2[4]; + u32x w1_t2[4]; + u32x w2_t2[4]; + u32x w3_t2[4]; + + make_unicode (w0, w0_t2, w1_t2); + make_unicode (w1, w2_t2, w3_t2); + + w0_t2[0] |= s0[0]; + w0_t2[1] |= s0[1]; + w0_t2[2] |= s0[2]; + w0_t2[3] |= s0[3]; + w1_t2[0] |= s1[0]; + w1_t2[1] |= s1[1]; + w1_t2[2] |= s1[2]; + w1_t2[3] |= s1[3]; + w2_t2[0] |= s2[0]; + w2_t2[1] |= s2[1]; + w2_t2[2] |= s2[2]; + w2_t2[3] |= s2[3]; + w3_t2[0] |= s3[0]; + w3_t2[1] |= s3[1]; + w3_t2[2] |= s3[2]; + w3_t2[3] |= s3[3]; + + append_0x80_4 (w0_t2, w1_t2, w2_t2, w3_t2, pw_salt_len); + + /** + * sha256 + */ + + u32x w0_t = swap_workaround (w0_t2[0]); + u32x w1_t = swap_workaround (w0_t2[1]); + u32x w2_t = swap_workaround (w0_t2[2]); + u32x w3_t = swap_workaround (w0_t2[3]); + u32x w4_t = swap_workaround (w1_t2[0]); + u32x w5_t = swap_workaround (w1_t2[1]); + u32x w6_t = swap_workaround (w1_t2[2]); + u32x w7_t = swap_workaround (w1_t2[3]); + u32x w8_t = swap_workaround (w2_t2[0]); + u32x w9_t = swap_workaround (w2_t2[1]); + u32x wa_t = swap_workaround (w2_t2[2]); + u32x wb_t = swap_workaround (w2_t2[3]); + u32x wc_t = swap_workaround (w3_t2[0]); + u32x wd_t = swap_workaround (w3_t2[1]); + u32x we_t = 0; + u32x wf_t = pw_salt_len * 8; + + u32x a = SHA256M_A; + u32x b = SHA256M_B; + u32x c = SHA256M_C; + u32x d = SHA256M_D; + u32x e = SHA256M_E; + u32x f = SHA256M_F; + u32x g = SHA256M_G; + u32x h = SHA256M_H; + + SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C00); + SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C01); + SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C02); + SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C03); + SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C04); + SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C05); + SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C06); + SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C07); + SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C08); + SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C09); + SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C0a); + SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C0b); + SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C0c); + SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C0d); + SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C0e); + SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C0f); + + w0_t = SHA256_EXPAND (we_t, w9_t, w1_t, w0_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C10); + w1_t = SHA256_EXPAND (wf_t, wa_t, w2_t, w1_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C11); + w2_t = SHA256_EXPAND (w0_t, wb_t, w3_t, w2_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C12); + w3_t = SHA256_EXPAND (w1_t, wc_t, w4_t, w3_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C13); + w4_t = SHA256_EXPAND (w2_t, wd_t, w5_t, w4_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C14); + w5_t = SHA256_EXPAND (w3_t, we_t, w6_t, w5_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C15); + w6_t = SHA256_EXPAND (w4_t, wf_t, w7_t, w6_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C16); + w7_t = SHA256_EXPAND (w5_t, w0_t, w8_t, w7_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C17); + w8_t = SHA256_EXPAND (w6_t, w1_t, w9_t, w8_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C18); + w9_t = SHA256_EXPAND (w7_t, w2_t, wa_t, w9_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C19); + wa_t = SHA256_EXPAND (w8_t, w3_t, wb_t, wa_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C1a); + wb_t = SHA256_EXPAND (w9_t, w4_t, wc_t, wb_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C1b); + wc_t = SHA256_EXPAND (wa_t, w5_t, wd_t, wc_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C1c); + wd_t = SHA256_EXPAND (wb_t, w6_t, we_t, wd_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C1d); + we_t = SHA256_EXPAND (wc_t, w7_t, wf_t, we_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C1e); + wf_t = SHA256_EXPAND (wd_t, w8_t, w0_t, wf_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C1f); + + w0_t = SHA256_EXPAND (we_t, w9_t, w1_t, w0_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C20); + w1_t = SHA256_EXPAND (wf_t, wa_t, w2_t, w1_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C21); + w2_t = SHA256_EXPAND (w0_t, wb_t, w3_t, w2_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C22); + w3_t = SHA256_EXPAND (w1_t, wc_t, w4_t, w3_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C23); + w4_t = SHA256_EXPAND (w2_t, wd_t, w5_t, w4_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C24); + w5_t = SHA256_EXPAND (w3_t, we_t, w6_t, w5_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C25); + w6_t = SHA256_EXPAND (w4_t, wf_t, w7_t, w6_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C26); + w7_t = SHA256_EXPAND (w5_t, w0_t, w8_t, w7_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C27); + w8_t = SHA256_EXPAND (w6_t, w1_t, w9_t, w8_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C28); + w9_t = SHA256_EXPAND (w7_t, w2_t, wa_t, w9_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C29); + wa_t = SHA256_EXPAND (w8_t, w3_t, wb_t, wa_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C2a); + wb_t = SHA256_EXPAND (w9_t, w4_t, wc_t, wb_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C2b); + wc_t = SHA256_EXPAND (wa_t, w5_t, wd_t, wc_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C2c); + wd_t = SHA256_EXPAND (wb_t, w6_t, we_t, wd_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C2d); + we_t = SHA256_EXPAND (wc_t, w7_t, wf_t, we_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C2e); + wf_t = SHA256_EXPAND (wd_t, w8_t, w0_t, wf_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C2f); + + w0_t = SHA256_EXPAND (we_t, w9_t, w1_t, w0_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C30); + w1_t = SHA256_EXPAND (wf_t, wa_t, w2_t, w1_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C31); + w2_t = SHA256_EXPAND (w0_t, wb_t, w3_t, w2_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C32); + w3_t = SHA256_EXPAND (w1_t, wc_t, w4_t, w3_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C33); + w4_t = SHA256_EXPAND (w2_t, wd_t, w5_t, w4_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C34); + w5_t = SHA256_EXPAND (w3_t, we_t, w6_t, w5_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C35); + w6_t = SHA256_EXPAND (w4_t, wf_t, w7_t, w6_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C36); + w7_t = SHA256_EXPAND (w5_t, w0_t, w8_t, w7_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C37); + w8_t = SHA256_EXPAND (w6_t, w1_t, w9_t, w8_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C38); + w9_t = SHA256_EXPAND (w7_t, w2_t, wa_t, w9_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C39); + wa_t = SHA256_EXPAND (w8_t, w3_t, wb_t, wa_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C3a); + wb_t = SHA256_EXPAND (w9_t, w4_t, wc_t, wb_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C3b); + wc_t = SHA256_EXPAND (wa_t, w5_t, wd_t, wc_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C3c); + wd_t = SHA256_EXPAND (wb_t, w6_t, we_t, wd_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C3d); + we_t = SHA256_EXPAND (wc_t, w7_t, wf_t, we_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C3e); + wf_t = SHA256_EXPAND (wd_t, w8_t, w0_t, wf_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C3f); + + + const u32x r0 = d; + const u32x r1 = h; + const u32x r2 = c; + const u32x r3 = g; + + #include VECT_COMPARE_M + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m01430_m08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m01430_m16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m01430_s04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, combs_buf[0].pw_len); + } + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[7]; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = combs_buf[il_pos].pw_len; + + const u32 pw_len = pw_l_len + pw_r_len; + + u32 wordr0[4]; + u32 wordr1[4]; + u32 wordr2[4]; + u32 wordr3[4]; + + wordr0[0] = combs_buf[il_pos].i[0]; + wordr0[1] = combs_buf[il_pos].i[1]; + wordr0[2] = combs_buf[il_pos].i[2]; + wordr0[3] = combs_buf[il_pos].i[3]; + wordr1[0] = combs_buf[il_pos].i[4]; + wordr1[1] = combs_buf[il_pos].i[5]; + wordr1[2] = combs_buf[il_pos].i[6]; + wordr1[3] = combs_buf[il_pos].i[7]; + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + u32x w0[4]; + u32x w1[4]; + u32x w2[4]; + u32x w3[4]; + + w0[0] = wordl0[0] | wordr0[0]; + w0[1] = wordl0[1] | wordr0[1]; + w0[2] = wordl0[2] | wordr0[2]; + w0[3] = wordl0[3] | wordr0[3]; + w1[0] = wordl1[0] | wordr1[0]; + w1[1] = wordl1[1] | wordr1[1]; + w1[2] = wordl1[2] | wordr1[2]; + w1[3] = wordl1[3] | wordr1[3]; + w2[0] = wordl2[0] | wordr2[0]; + w2[1] = wordl2[1] | wordr2[1]; + w2[2] = wordl2[2] | wordr2[2]; + w2[3] = wordl2[3] | wordr2[3]; + w3[0] = wordl3[0] | wordr3[0]; + w3[1] = wordl3[1] | wordr3[1]; + w3[2] = wordl3[2] | wordr3[2]; + w3[3] = wordl3[3] | wordr3[3]; + + /** + * append salt + */ + + u32 s0[4]; + + s0[0] = salt_buf0[0]; + s0[1] = salt_buf0[1]; + s0[2] = salt_buf0[2]; + s0[3] = salt_buf0[3]; + + u32 s1[4]; + + s1[0] = salt_buf1[0]; + s1[1] = salt_buf1[1]; + s1[2] = salt_buf1[2]; + s1[3] = salt_buf1[3]; + + u32 s2[4]; + + s2[0] = 0; + s2[1] = 0; + s2[2] = 0; + s2[3] = 0; + + u32 s3[4]; + + s3[0] = 0; + s3[1] = 0; + s3[2] = 0; + s3[3] = 0; + + switch_buffer_by_offset (s0, s1, s2, s3, (pw_len * 2)); + + const u32 pw_salt_len = (pw_len * 2) + salt_len; + + u32x w0_t2[4]; + u32x w1_t2[4]; + u32x w2_t2[4]; + u32x w3_t2[4]; + + make_unicode (w0, w0_t2, w1_t2); + make_unicode (w1, w2_t2, w3_t2); + + w0_t2[0] |= s0[0]; + w0_t2[1] |= s0[1]; + w0_t2[2] |= s0[2]; + w0_t2[3] |= s0[3]; + w1_t2[0] |= s1[0]; + w1_t2[1] |= s1[1]; + w1_t2[2] |= s1[2]; + w1_t2[3] |= s1[3]; + w2_t2[0] |= s2[0]; + w2_t2[1] |= s2[1]; + w2_t2[2] |= s2[2]; + w2_t2[3] |= s2[3]; + w3_t2[0] |= s3[0]; + w3_t2[1] |= s3[1]; + w3_t2[2] |= s3[2]; + w3_t2[3] |= s3[3]; + + append_0x80_4 (w0_t2, w1_t2, w2_t2, w3_t2, pw_salt_len); + + /** + * sha256 + */ + + u32x w0_t = swap_workaround (w0_t2[0]); + u32x w1_t = swap_workaround (w0_t2[1]); + u32x w2_t = swap_workaround (w0_t2[2]); + u32x w3_t = swap_workaround (w0_t2[3]); + u32x w4_t = swap_workaround (w1_t2[0]); + u32x w5_t = swap_workaround (w1_t2[1]); + u32x w6_t = swap_workaround (w1_t2[2]); + u32x w7_t = swap_workaround (w1_t2[3]); + u32x w8_t = swap_workaround (w2_t2[0]); + u32x w9_t = swap_workaround (w2_t2[1]); + u32x wa_t = swap_workaround (w2_t2[2]); + u32x wb_t = swap_workaround (w2_t2[3]); + u32x wc_t = swap_workaround (w3_t2[0]); + u32x wd_t = swap_workaround (w3_t2[1]); + u32x we_t = 0; + u32x wf_t = pw_salt_len * 8; + + u32x a = SHA256M_A; + u32x b = SHA256M_B; + u32x c = SHA256M_C; + u32x d = SHA256M_D; + u32x e = SHA256M_E; + u32x f = SHA256M_F; + u32x g = SHA256M_G; + u32x h = SHA256M_H; + + SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C00); + SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C01); + SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C02); + SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C03); + SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C04); + SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C05); + SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C06); + SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C07); + SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C08); + SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C09); + SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C0a); + SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C0b); + SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C0c); + SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C0d); + SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C0e); + SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C0f); + + w0_t = SHA256_EXPAND (we_t, w9_t, w1_t, w0_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C10); + w1_t = SHA256_EXPAND (wf_t, wa_t, w2_t, w1_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C11); + w2_t = SHA256_EXPAND (w0_t, wb_t, w3_t, w2_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C12); + w3_t = SHA256_EXPAND (w1_t, wc_t, w4_t, w3_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C13); + w4_t = SHA256_EXPAND (w2_t, wd_t, w5_t, w4_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C14); + w5_t = SHA256_EXPAND (w3_t, we_t, w6_t, w5_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C15); + w6_t = SHA256_EXPAND (w4_t, wf_t, w7_t, w6_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C16); + w7_t = SHA256_EXPAND (w5_t, w0_t, w8_t, w7_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C17); + w8_t = SHA256_EXPAND (w6_t, w1_t, w9_t, w8_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C18); + w9_t = SHA256_EXPAND (w7_t, w2_t, wa_t, w9_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C19); + wa_t = SHA256_EXPAND (w8_t, w3_t, wb_t, wa_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C1a); + wb_t = SHA256_EXPAND (w9_t, w4_t, wc_t, wb_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C1b); + wc_t = SHA256_EXPAND (wa_t, w5_t, wd_t, wc_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C1c); + wd_t = SHA256_EXPAND (wb_t, w6_t, we_t, wd_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C1d); + we_t = SHA256_EXPAND (wc_t, w7_t, wf_t, we_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C1e); + wf_t = SHA256_EXPAND (wd_t, w8_t, w0_t, wf_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C1f); + + w0_t = SHA256_EXPAND (we_t, w9_t, w1_t, w0_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C20); + w1_t = SHA256_EXPAND (wf_t, wa_t, w2_t, w1_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C21); + w2_t = SHA256_EXPAND (w0_t, wb_t, w3_t, w2_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C22); + w3_t = SHA256_EXPAND (w1_t, wc_t, w4_t, w3_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C23); + w4_t = SHA256_EXPAND (w2_t, wd_t, w5_t, w4_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C24); + w5_t = SHA256_EXPAND (w3_t, we_t, w6_t, w5_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C25); + w6_t = SHA256_EXPAND (w4_t, wf_t, w7_t, w6_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C26); + w7_t = SHA256_EXPAND (w5_t, w0_t, w8_t, w7_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C27); + w8_t = SHA256_EXPAND (w6_t, w1_t, w9_t, w8_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C28); + w9_t = SHA256_EXPAND (w7_t, w2_t, wa_t, w9_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C29); + wa_t = SHA256_EXPAND (w8_t, w3_t, wb_t, wa_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C2a); + wb_t = SHA256_EXPAND (w9_t, w4_t, wc_t, wb_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C2b); + wc_t = SHA256_EXPAND (wa_t, w5_t, wd_t, wc_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C2c); + wd_t = SHA256_EXPAND (wb_t, w6_t, we_t, wd_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C2d); + we_t = SHA256_EXPAND (wc_t, w7_t, wf_t, we_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C2e); + wf_t = SHA256_EXPAND (wd_t, w8_t, w0_t, wf_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C2f); + + w0_t = SHA256_EXPAND (we_t, w9_t, w1_t, w0_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C30); + w1_t = SHA256_EXPAND (wf_t, wa_t, w2_t, w1_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C31); + w2_t = SHA256_EXPAND (w0_t, wb_t, w3_t, w2_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C32); + w3_t = SHA256_EXPAND (w1_t, wc_t, w4_t, w3_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C33); + w4_t = SHA256_EXPAND (w2_t, wd_t, w5_t, w4_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C34); + w5_t = SHA256_EXPAND (w3_t, we_t, w6_t, w5_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C35); + w6_t = SHA256_EXPAND (w4_t, wf_t, w7_t, w6_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C36); + w7_t = SHA256_EXPAND (w5_t, w0_t, w8_t, w7_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C37); + w8_t = SHA256_EXPAND (w6_t, w1_t, w9_t, w8_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C38); + w9_t = SHA256_EXPAND (w7_t, w2_t, wa_t, w9_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C39); + wa_t = SHA256_EXPAND (w8_t, w3_t, wb_t, wa_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C3a); + wb_t = SHA256_EXPAND (w9_t, w4_t, wc_t, wb_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C3b); + wc_t = SHA256_EXPAND (wa_t, w5_t, wd_t, wc_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C3c); + wd_t = SHA256_EXPAND (wb_t, w6_t, we_t, wd_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C3d); + we_t = SHA256_EXPAND (wc_t, w7_t, wf_t, we_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C3e); + wf_t = SHA256_EXPAND (wd_t, w8_t, w0_t, wf_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C3f); + + + const u32x r0 = d; + const u32x r1 = h; + const u32x r2 = c; + const u32x r3 = g; + + #include VECT_COMPARE_S + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m01430_s08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m01430_s16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/amd/m01430_a3.cl b/amd/m01430_a3.cl new file mode 100644 index 0000000000..cfac03e4bc --- /dev/null +++ b/amd/m01430_a3.cl @@ -0,0 +1,597 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _SHA256_ +#define _SCALAR_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW4 +#define VECT_SIZE2 +#endif + +#ifdef VLIW5 +#define VECT_SIZE2 +#endif + +#define DGST_R0 3 +#define DGST_R1 7 +#define DGST_R2 2 +#define DGST_R3 6 + +#include "include/kernel_functions.c" +#include "types_amd.c" +#include "common_amd.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4_warp.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4_warp.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4_warp.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4_warp.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4_warp.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4_warp.c" +#endif + +static void m01430m (u32 w[16], const u32 pw_len, __global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global u32x * words_buf_r, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset) +{ + /** + * modifier + */ + + const u32 gid = get_global_id (0); + const u32 lid = get_local_id (0); + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[ 1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[ 2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[ 3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[ 4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[ 5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[ 6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[ 7]; + + u32 salt_buf2[4]; + + salt_buf2[0] = salt_bufs[salt_pos].salt_buf[ 8]; + salt_buf2[1] = 0; + salt_buf2[2] = 0; + salt_buf2[3] = 0; + + u32 salt_buf3[4]; + + salt_buf3[0] = 0; + salt_buf3[1] = 0; + salt_buf3[2] = 0; + salt_buf3[3] = 0; + + switch_buffer_by_offset (salt_buf0, salt_buf1, salt_buf2, salt_buf3, pw_len); + + w[ 0] |= swap_workaround (salt_buf0[0]); + w[ 1] |= swap_workaround (salt_buf0[1]); + w[ 2] |= swap_workaround (salt_buf0[2]); + w[ 3] |= swap_workaround (salt_buf0[3]); + w[ 4] |= swap_workaround (salt_buf1[0]); + w[ 5] |= swap_workaround (salt_buf1[1]); + w[ 6] |= swap_workaround (salt_buf1[2]); + w[ 7] |= swap_workaround (salt_buf1[3]); + w[ 8] |= swap_workaround (salt_buf2[0]); + w[ 9] |= swap_workaround (salt_buf2[1]); + w[10] |= swap_workaround (salt_buf2[2]); + w[11] |= swap_workaround (salt_buf2[3]); + w[12] |= swap_workaround (salt_buf3[0]); + w[13] |= swap_workaround (salt_buf3[1]); + w[14] |= swap_workaround (salt_buf3[2]); + w[15] |= swap_workaround (salt_buf3[3]); + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + const u32 pw_salt_len = pw_len + salt_len; + + w[15] = pw_salt_len * 8; + + /** + * loop + */ + + const u32 bf_loops = ceil ((float) bfs_cnt / VECT_DIV); + + u32x w0l = w[0]; + + for (u32 il_pos = 0; il_pos < bf_loops; il_pos++) + { + const u32x w0r = words_buf_r[il_pos]; + + const u32x w0 = w0l | w0r; + + u32x w0_t = w0; + u32x w1_t = w[ 1]; + u32x w2_t = w[ 2]; + u32x w3_t = w[ 3]; + u32x w4_t = w[ 4]; + u32x w5_t = w[ 5]; + u32x w6_t = w[ 6]; + u32x w7_t = w[ 7]; + u32x w8_t = w[ 8]; + u32x w9_t = w[ 9]; + u32x wa_t = w[10]; + u32x wb_t = w[11]; + u32x wc_t = w[12]; + u32x wd_t = w[13]; + u32x we_t = w[14]; + u32x wf_t = w[15]; + + u32x a = SHA256M_A; + u32x b = SHA256M_B; + u32x c = SHA256M_C; + u32x d = SHA256M_D; + u32x e = SHA256M_E; + u32x f = SHA256M_F; + u32x g = SHA256M_G; + u32x h = SHA256M_H; + + SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C00); + SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C01); + SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C02); + SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C03); + SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C04); + SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C05); + SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C06); + SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C07); + SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C08); + SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C09); + SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C0a); + SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C0b); + SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C0c); + SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C0d); + SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C0e); + SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C0f); + + w0_t = SHA256_EXPAND (we_t, w9_t, w1_t, w0_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C10); + w1_t = SHA256_EXPAND (wf_t, wa_t, w2_t, w1_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C11); + w2_t = SHA256_EXPAND (w0_t, wb_t, w3_t, w2_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C12); + w3_t = SHA256_EXPAND (w1_t, wc_t, w4_t, w3_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C13); + w4_t = SHA256_EXPAND (w2_t, wd_t, w5_t, w4_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C14); + w5_t = SHA256_EXPAND (w3_t, we_t, w6_t, w5_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C15); + w6_t = SHA256_EXPAND (w4_t, wf_t, w7_t, w6_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C16); + w7_t = SHA256_EXPAND (w5_t, w0_t, w8_t, w7_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C17); + w8_t = SHA256_EXPAND (w6_t, w1_t, w9_t, w8_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C18); + w9_t = SHA256_EXPAND (w7_t, w2_t, wa_t, w9_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C19); + wa_t = SHA256_EXPAND (w8_t, w3_t, wb_t, wa_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C1a); + wb_t = SHA256_EXPAND (w9_t, w4_t, wc_t, wb_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C1b); + wc_t = SHA256_EXPAND (wa_t, w5_t, wd_t, wc_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C1c); + wd_t = SHA256_EXPAND (wb_t, w6_t, we_t, wd_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C1d); + we_t = SHA256_EXPAND (wc_t, w7_t, wf_t, we_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C1e); + wf_t = SHA256_EXPAND (wd_t, w8_t, w0_t, wf_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C1f); + + w0_t = SHA256_EXPAND (we_t, w9_t, w1_t, w0_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C20); + w1_t = SHA256_EXPAND (wf_t, wa_t, w2_t, w1_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C21); + w2_t = SHA256_EXPAND (w0_t, wb_t, w3_t, w2_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C22); + w3_t = SHA256_EXPAND (w1_t, wc_t, w4_t, w3_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C23); + w4_t = SHA256_EXPAND (w2_t, wd_t, w5_t, w4_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C24); + w5_t = SHA256_EXPAND (w3_t, we_t, w6_t, w5_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C25); + w6_t = SHA256_EXPAND (w4_t, wf_t, w7_t, w6_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C26); + w7_t = SHA256_EXPAND (w5_t, w0_t, w8_t, w7_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C27); + w8_t = SHA256_EXPAND (w6_t, w1_t, w9_t, w8_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C28); + w9_t = SHA256_EXPAND (w7_t, w2_t, wa_t, w9_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C29); + wa_t = SHA256_EXPAND (w8_t, w3_t, wb_t, wa_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C2a); + wb_t = SHA256_EXPAND (w9_t, w4_t, wc_t, wb_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C2b); + wc_t = SHA256_EXPAND (wa_t, w5_t, wd_t, wc_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C2c); + wd_t = SHA256_EXPAND (wb_t, w6_t, we_t, wd_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C2d); + we_t = SHA256_EXPAND (wc_t, w7_t, wf_t, we_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C2e); + wf_t = SHA256_EXPAND (wd_t, w8_t, w0_t, wf_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C2f); + + w0_t = SHA256_EXPAND (we_t, w9_t, w1_t, w0_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C30); + w1_t = SHA256_EXPAND (wf_t, wa_t, w2_t, w1_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C31); + w2_t = SHA256_EXPAND (w0_t, wb_t, w3_t, w2_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C32); + w3_t = SHA256_EXPAND (w1_t, wc_t, w4_t, w3_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C33); + w4_t = SHA256_EXPAND (w2_t, wd_t, w5_t, w4_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C34); + w5_t = SHA256_EXPAND (w3_t, we_t, w6_t, w5_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C35); + w6_t = SHA256_EXPAND (w4_t, wf_t, w7_t, w6_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C36); + w7_t = SHA256_EXPAND (w5_t, w0_t, w8_t, w7_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C37); + w8_t = SHA256_EXPAND (w6_t, w1_t, w9_t, w8_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C38); + w9_t = SHA256_EXPAND (w7_t, w2_t, wa_t, w9_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C39); + wa_t = SHA256_EXPAND (w8_t, w3_t, wb_t, wa_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C3a); + wb_t = SHA256_EXPAND (w9_t, w4_t, wc_t, wb_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C3b); + wc_t = SHA256_EXPAND (wa_t, w5_t, wd_t, wc_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C3c); + wd_t = SHA256_EXPAND (wb_t, w6_t, we_t, wd_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C3d); + we_t = SHA256_EXPAND (wc_t, w7_t, wf_t, we_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C3e); + wf_t = SHA256_EXPAND (wd_t, w8_t, w0_t, wf_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C3f); + + + const u32x r0 = d; + const u32x r1 = h; + const u32x r2 = c; + const u32x r3 = g; + + #include VECT_COMPARE_M + } +} + +static void m01430s (u32 w[16], const u32 pw_len, __global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global u32x * words_buf_r, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset) +{ + /** + * modifier + */ + + const u32 gid = get_global_id (0); + const u32 lid = get_local_id (0); + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * loop + */ + + const u32 bf_loops = ceil ((float) bfs_cnt / VECT_DIV); + + u32x w0l = w[0]; + + for (u32 il_pos = 0; il_pos < bf_loops; il_pos++) + { + const u32x w0r = words_buf_r[il_pos]; + + const u32x w0 = w0l | w0r; + + u32x w0_t = w0; + u32x w1_t = w[ 1]; + u32x w2_t = w[ 2]; + u32x w3_t = w[ 3]; + u32x w4_t = w[ 4]; + u32x w5_t = w[ 5]; + u32x w6_t = w[ 6]; + u32x w7_t = w[ 7]; + u32x w8_t = w[ 8]; + u32x w9_t = w[ 9]; + u32x wa_t = w[10]; + u32x wb_t = w[11]; + u32x wc_t = w[12]; + u32x wd_t = w[13]; + u32x we_t = w[14]; + u32x wf_t = w[15]; + + u32x a = SHA256M_A; + u32x b = SHA256M_B; + u32x c = SHA256M_C; + u32x d = SHA256M_D; + u32x e = SHA256M_E; + u32x f = SHA256M_F; + u32x g = SHA256M_G; + u32x h = SHA256M_H; + + SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C00); + SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C01); + SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C02); + SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C03); + SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C04); + SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C05); + SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C06); + SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C07); + SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C08); + SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C09); + SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C0a); + SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C0b); + SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C0c); + SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C0d); + SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C0e); + SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C0f); + + w0_t = SHA256_EXPAND (we_t, w9_t, w1_t, w0_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C10); + w1_t = SHA256_EXPAND (wf_t, wa_t, w2_t, w1_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C11); + w2_t = SHA256_EXPAND (w0_t, wb_t, w3_t, w2_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C12); + w3_t = SHA256_EXPAND (w1_t, wc_t, w4_t, w3_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C13); + w4_t = SHA256_EXPAND (w2_t, wd_t, w5_t, w4_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C14); + w5_t = SHA256_EXPAND (w3_t, we_t, w6_t, w5_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C15); + w6_t = SHA256_EXPAND (w4_t, wf_t, w7_t, w6_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C16); + w7_t = SHA256_EXPAND (w5_t, w0_t, w8_t, w7_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C17); + w8_t = SHA256_EXPAND (w6_t, w1_t, w9_t, w8_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C18); + w9_t = SHA256_EXPAND (w7_t, w2_t, wa_t, w9_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C19); + wa_t = SHA256_EXPAND (w8_t, w3_t, wb_t, wa_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C1a); + wb_t = SHA256_EXPAND (w9_t, w4_t, wc_t, wb_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C1b); + wc_t = SHA256_EXPAND (wa_t, w5_t, wd_t, wc_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C1c); + wd_t = SHA256_EXPAND (wb_t, w6_t, we_t, wd_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C1d); + we_t = SHA256_EXPAND (wc_t, w7_t, wf_t, we_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C1e); + wf_t = SHA256_EXPAND (wd_t, w8_t, w0_t, wf_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C1f); + + w0_t = SHA256_EXPAND (we_t, w9_t, w1_t, w0_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C20); + w1_t = SHA256_EXPAND (wf_t, wa_t, w2_t, w1_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C21); + w2_t = SHA256_EXPAND (w0_t, wb_t, w3_t, w2_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C22); + w3_t = SHA256_EXPAND (w1_t, wc_t, w4_t, w3_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C23); + w4_t = SHA256_EXPAND (w2_t, wd_t, w5_t, w4_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C24); + w5_t = SHA256_EXPAND (w3_t, we_t, w6_t, w5_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C25); + w6_t = SHA256_EXPAND (w4_t, wf_t, w7_t, w6_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C26); + w7_t = SHA256_EXPAND (w5_t, w0_t, w8_t, w7_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C27); + w8_t = SHA256_EXPAND (w6_t, w1_t, w9_t, w8_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C28); + w9_t = SHA256_EXPAND (w7_t, w2_t, wa_t, w9_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C29); + wa_t = SHA256_EXPAND (w8_t, w3_t, wb_t, wa_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C2a); + wb_t = SHA256_EXPAND (w9_t, w4_t, wc_t, wb_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C2b); + wc_t = SHA256_EXPAND (wa_t, w5_t, wd_t, wc_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C2c); + wd_t = SHA256_EXPAND (wb_t, w6_t, we_t, wd_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C2d); + we_t = SHA256_EXPAND (wc_t, w7_t, wf_t, we_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C2e); + wf_t = SHA256_EXPAND (wd_t, w8_t, w0_t, wf_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C2f); + + w0_t = SHA256_EXPAND (we_t, w9_t, w1_t, w0_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C30); + w1_t = SHA256_EXPAND (wf_t, wa_t, w2_t, w1_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C31); + w2_t = SHA256_EXPAND (w0_t, wb_t, w3_t, w2_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C32); + w3_t = SHA256_EXPAND (w1_t, wc_t, w4_t, w3_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C33); + w4_t = SHA256_EXPAND (w2_t, wd_t, w5_t, w4_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C34); + w5_t = SHA256_EXPAND (w3_t, we_t, w6_t, w5_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C35); + w6_t = SHA256_EXPAND (w4_t, wf_t, w7_t, w6_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C36); + w7_t = SHA256_EXPAND (w5_t, w0_t, w8_t, w7_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C37); + w8_t = SHA256_EXPAND (w6_t, w1_t, w9_t, w8_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C38); + w9_t = SHA256_EXPAND (w7_t, w2_t, wa_t, w9_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C39); + wa_t = SHA256_EXPAND (w8_t, w3_t, wb_t, wa_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C3a); + wb_t = SHA256_EXPAND (w9_t, w4_t, wc_t, wb_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C3b); + wc_t = SHA256_EXPAND (wa_t, w5_t, wd_t, wc_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C3c); + wd_t = SHA256_EXPAND (wb_t, w6_t, we_t, wd_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C3d); + we_t = SHA256_EXPAND (wc_t, w7_t, wf_t, we_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C3e); + wf_t = SHA256_EXPAND (wd_t, w8_t, w0_t, wf_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C3f); + + + const u32x r0 = d; + const u32x r1 = h; + const u32x r2 = c; + const u32x r3 = g; + + #include VECT_COMPARE_S + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m01430_m04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global u32x * words_buf_r, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32 w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = 0; + w[ 5] = 0; + w[ 6] = 0; + w[ 7] = 0; + w[ 8] = 0; + w[ 9] = 0; + w[10] = 0; + w[11] = 0; + w[12] = 0; + w[13] = 0; + w[14] = 0; + w[15] = pws[gid].i[15]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m01430m (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m01430_m08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global u32x * words_buf_r, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32 w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = pws[gid].i[ 4]; + w[ 5] = pws[gid].i[ 5]; + w[ 6] = pws[gid].i[ 6]; + w[ 7] = pws[gid].i[ 7]; + w[ 8] = 0; + w[ 9] = 0; + w[10] = 0; + w[11] = 0; + w[12] = 0; + w[13] = 0; + w[14] = 0; + w[15] = pws[gid].i[15]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m01430m (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m01430_m16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global u32x * words_buf_r, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32 w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = pws[gid].i[ 4]; + w[ 5] = pws[gid].i[ 5]; + w[ 6] = pws[gid].i[ 6]; + w[ 7] = pws[gid].i[ 7]; + w[ 8] = pws[gid].i[ 8]; + w[ 9] = pws[gid].i[ 9]; + w[10] = pws[gid].i[10]; + w[11] = pws[gid].i[11]; + w[12] = pws[gid].i[12]; + w[13] = pws[gid].i[13]; + w[14] = pws[gid].i[14]; + w[15] = pws[gid].i[15]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m01430m (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m01430_s04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global u32x * words_buf_r, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32 w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = 0; + w[ 5] = 0; + w[ 6] = 0; + w[ 7] = 0; + w[ 8] = 0; + w[ 9] = 0; + w[10] = 0; + w[11] = 0; + w[12] = 0; + w[13] = 0; + w[14] = 0; + w[15] = pws[gid].i[15]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m01430s (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m01430_s08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global u32x * words_buf_r, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32 w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = pws[gid].i[ 4]; + w[ 5] = pws[gid].i[ 5]; + w[ 6] = pws[gid].i[ 6]; + w[ 7] = pws[gid].i[ 7]; + w[ 8] = 0; + w[ 9] = 0; + w[10] = 0; + w[11] = 0; + w[12] = 0; + w[13] = 0; + w[14] = 0; + w[15] = pws[gid].i[15]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m01430s (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m01430_s16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global u32x * words_buf_r, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32 w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = pws[gid].i[ 4]; + w[ 5] = pws[gid].i[ 5]; + w[ 6] = pws[gid].i[ 6]; + w[ 7] = pws[gid].i[ 7]; + w[ 8] = pws[gid].i[ 8]; + w[ 9] = pws[gid].i[ 9]; + w[10] = pws[gid].i[10]; + w[11] = pws[gid].i[11]; + w[12] = pws[gid].i[12]; + w[13] = pws[gid].i[13]; + w[14] = pws[gid].i[14]; + w[15] = pws[gid].i[15]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m01430s (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} diff --git a/amd/m01440_a0.cl b/amd/m01440_a0.cl new file mode 100644 index 0000000000..b53806a8b1 --- /dev/null +++ b/amd/m01440_a0.cl @@ -0,0 +1,509 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _SHA256_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW4 +#define VECT_SIZE2 +#endif + +#ifdef VLIW5 +#define VECT_SIZE2 +#endif + +#define DGST_R0 3 +#define DGST_R1 7 +#define DGST_R2 2 +#define DGST_R3 6 + +#include "include/kernel_functions.c" +#include "types_amd.c" +#include "common_amd.c" +#include "include/rp_gpu.h" +#include "rp_amd.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m01440_m04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + u32x pw_buf1[4]; + + pw_buf1[0] = pws[gid].i[ 4]; + pw_buf1[1] = pws[gid].i[ 5]; + pw_buf1[2] = pws[gid].i[ 6]; + pw_buf1[3] = pws[gid].i[ 7]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[7]; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + u32x w1[4]; + u32x w2[4]; + u32x w3[4]; + + w0[0] = pw_buf0[0]; + w0[1] = pw_buf0[1]; + w0[2] = pw_buf0[2]; + w0[3] = pw_buf0[3]; + w1[0] = pw_buf1[0]; + w1[1] = pw_buf1[1]; + w1[2] = pw_buf1[2]; + w1[3] = pw_buf1[3]; + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 out_len = apply_rules (rules_buf[il_pos].cmds, w0, w1, pw_len); + + /** + * prepend salt + */ + + const u32 out_salt_len = (out_len * 2) + salt_len; + + u32x w0_t2[4]; + u32x w1_t2[4]; + u32x w2_t2[4]; + u32x w3_t2[4]; + + make_unicode (w0, w0_t2, w1_t2); + make_unicode (w1, w2_t2, w3_t2); + + switch_buffer_by_offset (w0_t2, w1_t2, w2_t2, w3_t2, salt_len); + + w0_t2[0] |= salt_buf0[0]; + w0_t2[1] |= salt_buf0[1]; + w0_t2[2] |= salt_buf0[2]; + w0_t2[3] |= salt_buf0[3]; + w1_t2[0] |= salt_buf1[0]; + w1_t2[1] |= salt_buf1[1]; + w1_t2[2] |= salt_buf1[2]; + w1_t2[3] |= salt_buf1[3]; + + append_0x80_4 (w0_t2, w1_t2, w2_t2, w3_t2, out_salt_len); + + /** + * sha256 + */ + + u32x w0_t = swap_workaround (w0_t2[0]); + u32x w1_t = swap_workaround (w0_t2[1]); + u32x w2_t = swap_workaround (w0_t2[2]); + u32x w3_t = swap_workaround (w0_t2[3]); + u32x w4_t = swap_workaround (w1_t2[0]); + u32x w5_t = swap_workaround (w1_t2[1]); + u32x w6_t = swap_workaround (w1_t2[2]); + u32x w7_t = swap_workaround (w1_t2[3]); + u32x w8_t = swap_workaround (w2_t2[0]); + u32x w9_t = swap_workaround (w2_t2[1]); + u32x wa_t = swap_workaround (w2_t2[2]); + u32x wb_t = swap_workaround (w2_t2[3]); + u32x wc_t = swap_workaround (w3_t2[0]); + u32x wd_t = swap_workaround (w3_t2[1]); + u32x we_t = 0; + u32x wf_t = out_salt_len * 8; + + u32x a = SHA256M_A; + u32x b = SHA256M_B; + u32x c = SHA256M_C; + u32x d = SHA256M_D; + u32x e = SHA256M_E; + u32x f = SHA256M_F; + u32x g = SHA256M_G; + u32x h = SHA256M_H; + + SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C00); + SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C01); + SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C02); + SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C03); + SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C04); + SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C05); + SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C06); + SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C07); + SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C08); + SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C09); + SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C0a); + SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C0b); + SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C0c); + SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C0d); + SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C0e); + SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C0f); + + w0_t = SHA256_EXPAND (we_t, w9_t, w1_t, w0_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C10); + w1_t = SHA256_EXPAND (wf_t, wa_t, w2_t, w1_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C11); + w2_t = SHA256_EXPAND (w0_t, wb_t, w3_t, w2_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C12); + w3_t = SHA256_EXPAND (w1_t, wc_t, w4_t, w3_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C13); + w4_t = SHA256_EXPAND (w2_t, wd_t, w5_t, w4_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C14); + w5_t = SHA256_EXPAND (w3_t, we_t, w6_t, w5_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C15); + w6_t = SHA256_EXPAND (w4_t, wf_t, w7_t, w6_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C16); + w7_t = SHA256_EXPAND (w5_t, w0_t, w8_t, w7_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C17); + w8_t = SHA256_EXPAND (w6_t, w1_t, w9_t, w8_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C18); + w9_t = SHA256_EXPAND (w7_t, w2_t, wa_t, w9_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C19); + wa_t = SHA256_EXPAND (w8_t, w3_t, wb_t, wa_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C1a); + wb_t = SHA256_EXPAND (w9_t, w4_t, wc_t, wb_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C1b); + wc_t = SHA256_EXPAND (wa_t, w5_t, wd_t, wc_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C1c); + wd_t = SHA256_EXPAND (wb_t, w6_t, we_t, wd_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C1d); + we_t = SHA256_EXPAND (wc_t, w7_t, wf_t, we_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C1e); + wf_t = SHA256_EXPAND (wd_t, w8_t, w0_t, wf_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C1f); + + w0_t = SHA256_EXPAND (we_t, w9_t, w1_t, w0_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C20); + w1_t = SHA256_EXPAND (wf_t, wa_t, w2_t, w1_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C21); + w2_t = SHA256_EXPAND (w0_t, wb_t, w3_t, w2_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C22); + w3_t = SHA256_EXPAND (w1_t, wc_t, w4_t, w3_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C23); + w4_t = SHA256_EXPAND (w2_t, wd_t, w5_t, w4_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C24); + w5_t = SHA256_EXPAND (w3_t, we_t, w6_t, w5_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C25); + w6_t = SHA256_EXPAND (w4_t, wf_t, w7_t, w6_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C26); + w7_t = SHA256_EXPAND (w5_t, w0_t, w8_t, w7_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C27); + w8_t = SHA256_EXPAND (w6_t, w1_t, w9_t, w8_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C28); + w9_t = SHA256_EXPAND (w7_t, w2_t, wa_t, w9_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C29); + wa_t = SHA256_EXPAND (w8_t, w3_t, wb_t, wa_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C2a); + wb_t = SHA256_EXPAND (w9_t, w4_t, wc_t, wb_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C2b); + wc_t = SHA256_EXPAND (wa_t, w5_t, wd_t, wc_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C2c); + wd_t = SHA256_EXPAND (wb_t, w6_t, we_t, wd_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C2d); + we_t = SHA256_EXPAND (wc_t, w7_t, wf_t, we_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C2e); + wf_t = SHA256_EXPAND (wd_t, w8_t, w0_t, wf_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C2f); + + w0_t = SHA256_EXPAND (we_t, w9_t, w1_t, w0_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C30); + w1_t = SHA256_EXPAND (wf_t, wa_t, w2_t, w1_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C31); + w2_t = SHA256_EXPAND (w0_t, wb_t, w3_t, w2_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C32); + w3_t = SHA256_EXPAND (w1_t, wc_t, w4_t, w3_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C33); + w4_t = SHA256_EXPAND (w2_t, wd_t, w5_t, w4_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C34); + w5_t = SHA256_EXPAND (w3_t, we_t, w6_t, w5_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C35); + w6_t = SHA256_EXPAND (w4_t, wf_t, w7_t, w6_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C36); + w7_t = SHA256_EXPAND (w5_t, w0_t, w8_t, w7_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C37); + w8_t = SHA256_EXPAND (w6_t, w1_t, w9_t, w8_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C38); + w9_t = SHA256_EXPAND (w7_t, w2_t, wa_t, w9_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C39); + wa_t = SHA256_EXPAND (w8_t, w3_t, wb_t, wa_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C3a); + wb_t = SHA256_EXPAND (w9_t, w4_t, wc_t, wb_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C3b); + wc_t = SHA256_EXPAND (wa_t, w5_t, wd_t, wc_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C3c); + wd_t = SHA256_EXPAND (wb_t, w6_t, we_t, wd_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C3d); + we_t = SHA256_EXPAND (wc_t, w7_t, wf_t, we_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C3e); + wf_t = SHA256_EXPAND (wd_t, w8_t, w0_t, wf_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C3f); + + + const u32x r0 = d; + const u32x r1 = h; + const u32x r2 = c; + const u32x r3 = g; + + #include VECT_COMPARE_M + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m01440_m08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m01440_m16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m01440_s04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + u32x pw_buf1[4]; + + pw_buf1[0] = pws[gid].i[ 4]; + pw_buf1[1] = pws[gid].i[ 5]; + pw_buf1[2] = pws[gid].i[ 6]; + pw_buf1[3] = pws[gid].i[ 7]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[7]; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + u32x w1[4]; + u32x w2[4]; + u32x w3[4]; + + w0[0] = pw_buf0[0]; + w0[1] = pw_buf0[1]; + w0[2] = pw_buf0[2]; + w0[3] = pw_buf0[3]; + w1[0] = pw_buf1[0]; + w1[1] = pw_buf1[1]; + w1[2] = pw_buf1[2]; + w1[3] = pw_buf1[3]; + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 out_len = apply_rules (rules_buf[il_pos].cmds, w0, w1, pw_len); + + /** + * prepend salt + */ + + const u32 out_salt_len = (out_len * 2) + salt_len; + + u32x w0_t2[4]; + u32x w1_t2[4]; + u32x w2_t2[4]; + u32x w3_t2[4]; + + make_unicode (w0, w0_t2, w1_t2); + make_unicode (w1, w2_t2, w3_t2); + + switch_buffer_by_offset (w0_t2, w1_t2, w2_t2, w3_t2, salt_len); + + w0_t2[0] |= salt_buf0[0]; + w0_t2[1] |= salt_buf0[1]; + w0_t2[2] |= salt_buf0[2]; + w0_t2[3] |= salt_buf0[3]; + w1_t2[0] |= salt_buf1[0]; + w1_t2[1] |= salt_buf1[1]; + w1_t2[2] |= salt_buf1[2]; + w1_t2[3] |= salt_buf1[3]; + + append_0x80_4 (w0_t2, w1_t2, w2_t2, w3_t2, out_salt_len); + + /** + * sha256 + */ + + u32x w0_t = swap_workaround (w0_t2[0]); + u32x w1_t = swap_workaround (w0_t2[1]); + u32x w2_t = swap_workaround (w0_t2[2]); + u32x w3_t = swap_workaround (w0_t2[3]); + u32x w4_t = swap_workaround (w1_t2[0]); + u32x w5_t = swap_workaround (w1_t2[1]); + u32x w6_t = swap_workaround (w1_t2[2]); + u32x w7_t = swap_workaround (w1_t2[3]); + u32x w8_t = swap_workaround (w2_t2[0]); + u32x w9_t = swap_workaround (w2_t2[1]); + u32x wa_t = swap_workaround (w2_t2[2]); + u32x wb_t = swap_workaround (w2_t2[3]); + u32x wc_t = swap_workaround (w3_t2[0]); + u32x wd_t = swap_workaround (w3_t2[1]); + u32x we_t = 0; + u32x wf_t = out_salt_len * 8; + + u32x a = SHA256M_A; + u32x b = SHA256M_B; + u32x c = SHA256M_C; + u32x d = SHA256M_D; + u32x e = SHA256M_E; + u32x f = SHA256M_F; + u32x g = SHA256M_G; + u32x h = SHA256M_H; + + SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C00); + SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C01); + SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C02); + SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C03); + SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C04); + SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C05); + SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C06); + SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C07); + SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C08); + SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C09); + SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C0a); + SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C0b); + SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C0c); + SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C0d); + SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C0e); + SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C0f); + + w0_t = SHA256_EXPAND (we_t, w9_t, w1_t, w0_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C10); + w1_t = SHA256_EXPAND (wf_t, wa_t, w2_t, w1_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C11); + w2_t = SHA256_EXPAND (w0_t, wb_t, w3_t, w2_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C12); + w3_t = SHA256_EXPAND (w1_t, wc_t, w4_t, w3_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C13); + w4_t = SHA256_EXPAND (w2_t, wd_t, w5_t, w4_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C14); + w5_t = SHA256_EXPAND (w3_t, we_t, w6_t, w5_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C15); + w6_t = SHA256_EXPAND (w4_t, wf_t, w7_t, w6_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C16); + w7_t = SHA256_EXPAND (w5_t, w0_t, w8_t, w7_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C17); + w8_t = SHA256_EXPAND (w6_t, w1_t, w9_t, w8_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C18); + w9_t = SHA256_EXPAND (w7_t, w2_t, wa_t, w9_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C19); + wa_t = SHA256_EXPAND (w8_t, w3_t, wb_t, wa_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C1a); + wb_t = SHA256_EXPAND (w9_t, w4_t, wc_t, wb_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C1b); + wc_t = SHA256_EXPAND (wa_t, w5_t, wd_t, wc_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C1c); + wd_t = SHA256_EXPAND (wb_t, w6_t, we_t, wd_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C1d); + we_t = SHA256_EXPAND (wc_t, w7_t, wf_t, we_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C1e); + wf_t = SHA256_EXPAND (wd_t, w8_t, w0_t, wf_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C1f); + + w0_t = SHA256_EXPAND (we_t, w9_t, w1_t, w0_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C20); + w1_t = SHA256_EXPAND (wf_t, wa_t, w2_t, w1_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C21); + w2_t = SHA256_EXPAND (w0_t, wb_t, w3_t, w2_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C22); + w3_t = SHA256_EXPAND (w1_t, wc_t, w4_t, w3_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C23); + w4_t = SHA256_EXPAND (w2_t, wd_t, w5_t, w4_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C24); + w5_t = SHA256_EXPAND (w3_t, we_t, w6_t, w5_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C25); + w6_t = SHA256_EXPAND (w4_t, wf_t, w7_t, w6_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C26); + w7_t = SHA256_EXPAND (w5_t, w0_t, w8_t, w7_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C27); + w8_t = SHA256_EXPAND (w6_t, w1_t, w9_t, w8_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C28); + w9_t = SHA256_EXPAND (w7_t, w2_t, wa_t, w9_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C29); + wa_t = SHA256_EXPAND (w8_t, w3_t, wb_t, wa_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C2a); + wb_t = SHA256_EXPAND (w9_t, w4_t, wc_t, wb_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C2b); + wc_t = SHA256_EXPAND (wa_t, w5_t, wd_t, wc_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C2c); + wd_t = SHA256_EXPAND (wb_t, w6_t, we_t, wd_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C2d); + we_t = SHA256_EXPAND (wc_t, w7_t, wf_t, we_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C2e); + wf_t = SHA256_EXPAND (wd_t, w8_t, w0_t, wf_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C2f); + + w0_t = SHA256_EXPAND (we_t, w9_t, w1_t, w0_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C30); + w1_t = SHA256_EXPAND (wf_t, wa_t, w2_t, w1_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C31); + w2_t = SHA256_EXPAND (w0_t, wb_t, w3_t, w2_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C32); + w3_t = SHA256_EXPAND (w1_t, wc_t, w4_t, w3_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C33); + w4_t = SHA256_EXPAND (w2_t, wd_t, w5_t, w4_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C34); + w5_t = SHA256_EXPAND (w3_t, we_t, w6_t, w5_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C35); + w6_t = SHA256_EXPAND (w4_t, wf_t, w7_t, w6_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C36); + w7_t = SHA256_EXPAND (w5_t, w0_t, w8_t, w7_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C37); + w8_t = SHA256_EXPAND (w6_t, w1_t, w9_t, w8_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C38); + w9_t = SHA256_EXPAND (w7_t, w2_t, wa_t, w9_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C39); + wa_t = SHA256_EXPAND (w8_t, w3_t, wb_t, wa_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C3a); + wb_t = SHA256_EXPAND (w9_t, w4_t, wc_t, wb_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C3b); + wc_t = SHA256_EXPAND (wa_t, w5_t, wd_t, wc_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C3c); + wd_t = SHA256_EXPAND (wb_t, w6_t, we_t, wd_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C3d); + we_t = SHA256_EXPAND (wc_t, w7_t, wf_t, we_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C3e); + wf_t = SHA256_EXPAND (wd_t, w8_t, w0_t, wf_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C3f); + + + const u32x r0 = d; + const u32x r1 = h; + const u32x r2 = c; + const u32x r3 = g; + + #include VECT_COMPARE_S + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m01440_s08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m01440_s16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/amd/m01440_a1.cl b/amd/m01440_a1.cl new file mode 100644 index 0000000000..18530b651c --- /dev/null +++ b/amd/m01440_a1.cl @@ -0,0 +1,603 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _SHA256_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW4 +#define VECT_SIZE2 +#endif + +#ifdef VLIW5 +#define VECT_SIZE2 +#endif + +#define DGST_R0 3 +#define DGST_R1 7 +#define DGST_R2 2 +#define DGST_R3 6 + +#include "include/kernel_functions.c" +#include "types_amd.c" +#include "common_amd.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m01440_m04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, combs_buf[0].pw_len); + } + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[7]; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = combs_buf[il_pos].pw_len; + + const u32 pw_len = pw_l_len + pw_r_len; + + u32 wordr0[4]; + u32 wordr1[4]; + u32 wordr2[4]; + u32 wordr3[4]; + + wordr0[0] = combs_buf[il_pos].i[0]; + wordr0[1] = combs_buf[il_pos].i[1]; + wordr0[2] = combs_buf[il_pos].i[2]; + wordr0[3] = combs_buf[il_pos].i[3]; + wordr1[0] = combs_buf[il_pos].i[4]; + wordr1[1] = combs_buf[il_pos].i[5]; + wordr1[2] = combs_buf[il_pos].i[6]; + wordr1[3] = combs_buf[il_pos].i[7]; + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + u32x w0[4]; + u32x w1[4]; + u32x w2[4]; + u32x w3[4]; + + w0[0] = wordl0[0] | wordr0[0]; + w0[1] = wordl0[1] | wordr0[1]; + w0[2] = wordl0[2] | wordr0[2]; + w0[3] = wordl0[3] | wordr0[3]; + w1[0] = wordl1[0] | wordr1[0]; + w1[1] = wordl1[1] | wordr1[1]; + w1[2] = wordl1[2] | wordr1[2]; + w1[3] = wordl1[3] | wordr1[3]; + w2[0] = wordl2[0] | wordr2[0]; + w2[1] = wordl2[1] | wordr2[1]; + w2[2] = wordl2[2] | wordr2[2]; + w2[3] = wordl2[3] | wordr2[3]; + w3[0] = wordl3[0] | wordr3[0]; + w3[1] = wordl3[1] | wordr3[1]; + w3[2] = wordl3[2] | wordr3[2]; + w3[3] = wordl3[3] | wordr3[3]; + + /** + * prepend salt + */ + + const u32 pw_salt_len = (pw_len * 2) + salt_len; + + u32x w0_t2[4]; + u32x w1_t2[4]; + u32x w2_t2[4]; + u32x w3_t2[4]; + + make_unicode (w0, w0_t2, w1_t2); + make_unicode (w1, w2_t2, w3_t2); + + switch_buffer_by_offset (w0_t2, w1_t2, w2_t2, w3_t2, salt_len); + + w0_t2[0] |= salt_buf0[0]; + w0_t2[1] |= salt_buf0[1]; + w0_t2[2] |= salt_buf0[2]; + w0_t2[3] |= salt_buf0[3]; + w1_t2[0] |= salt_buf1[0]; + w1_t2[1] |= salt_buf1[1]; + w1_t2[2] |= salt_buf1[2]; + w1_t2[3] |= salt_buf1[3]; + + append_0x80_4 (w0_t2, w1_t2, w2_t2, w3_t2, pw_salt_len); + + /** + * sha256 + */ + + u32x w0_t = swap_workaround (w0_t2[0]); + u32x w1_t = swap_workaround (w0_t2[1]); + u32x w2_t = swap_workaround (w0_t2[2]); + u32x w3_t = swap_workaround (w0_t2[3]); + u32x w4_t = swap_workaround (w1_t2[0]); + u32x w5_t = swap_workaround (w1_t2[1]); + u32x w6_t = swap_workaround (w1_t2[2]); + u32x w7_t = swap_workaround (w1_t2[3]); + u32x w8_t = swap_workaround (w2_t2[0]); + u32x w9_t = swap_workaround (w2_t2[1]); + u32x wa_t = swap_workaround (w2_t2[2]); + u32x wb_t = swap_workaround (w2_t2[3]); + u32x wc_t = swap_workaround (w3_t2[0]); + u32x wd_t = swap_workaround (w3_t2[1]); + u32x we_t = 0; + u32x wf_t = pw_salt_len * 8; + + u32x a = SHA256M_A; + u32x b = SHA256M_B; + u32x c = SHA256M_C; + u32x d = SHA256M_D; + u32x e = SHA256M_E; + u32x f = SHA256M_F; + u32x g = SHA256M_G; + u32x h = SHA256M_H; + + SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C00); + SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C01); + SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C02); + SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C03); + SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C04); + SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C05); + SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C06); + SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C07); + SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C08); + SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C09); + SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C0a); + SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C0b); + SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C0c); + SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C0d); + SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C0e); + SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C0f); + + w0_t = SHA256_EXPAND (we_t, w9_t, w1_t, w0_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C10); + w1_t = SHA256_EXPAND (wf_t, wa_t, w2_t, w1_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C11); + w2_t = SHA256_EXPAND (w0_t, wb_t, w3_t, w2_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C12); + w3_t = SHA256_EXPAND (w1_t, wc_t, w4_t, w3_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C13); + w4_t = SHA256_EXPAND (w2_t, wd_t, w5_t, w4_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C14); + w5_t = SHA256_EXPAND (w3_t, we_t, w6_t, w5_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C15); + w6_t = SHA256_EXPAND (w4_t, wf_t, w7_t, w6_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C16); + w7_t = SHA256_EXPAND (w5_t, w0_t, w8_t, w7_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C17); + w8_t = SHA256_EXPAND (w6_t, w1_t, w9_t, w8_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C18); + w9_t = SHA256_EXPAND (w7_t, w2_t, wa_t, w9_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C19); + wa_t = SHA256_EXPAND (w8_t, w3_t, wb_t, wa_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C1a); + wb_t = SHA256_EXPAND (w9_t, w4_t, wc_t, wb_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C1b); + wc_t = SHA256_EXPAND (wa_t, w5_t, wd_t, wc_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C1c); + wd_t = SHA256_EXPAND (wb_t, w6_t, we_t, wd_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C1d); + we_t = SHA256_EXPAND (wc_t, w7_t, wf_t, we_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C1e); + wf_t = SHA256_EXPAND (wd_t, w8_t, w0_t, wf_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C1f); + + w0_t = SHA256_EXPAND (we_t, w9_t, w1_t, w0_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C20); + w1_t = SHA256_EXPAND (wf_t, wa_t, w2_t, w1_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C21); + w2_t = SHA256_EXPAND (w0_t, wb_t, w3_t, w2_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C22); + w3_t = SHA256_EXPAND (w1_t, wc_t, w4_t, w3_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C23); + w4_t = SHA256_EXPAND (w2_t, wd_t, w5_t, w4_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C24); + w5_t = SHA256_EXPAND (w3_t, we_t, w6_t, w5_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C25); + w6_t = SHA256_EXPAND (w4_t, wf_t, w7_t, w6_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C26); + w7_t = SHA256_EXPAND (w5_t, w0_t, w8_t, w7_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C27); + w8_t = SHA256_EXPAND (w6_t, w1_t, w9_t, w8_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C28); + w9_t = SHA256_EXPAND (w7_t, w2_t, wa_t, w9_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C29); + wa_t = SHA256_EXPAND (w8_t, w3_t, wb_t, wa_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C2a); + wb_t = SHA256_EXPAND (w9_t, w4_t, wc_t, wb_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C2b); + wc_t = SHA256_EXPAND (wa_t, w5_t, wd_t, wc_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C2c); + wd_t = SHA256_EXPAND (wb_t, w6_t, we_t, wd_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C2d); + we_t = SHA256_EXPAND (wc_t, w7_t, wf_t, we_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C2e); + wf_t = SHA256_EXPAND (wd_t, w8_t, w0_t, wf_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C2f); + + w0_t = SHA256_EXPAND (we_t, w9_t, w1_t, w0_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C30); + w1_t = SHA256_EXPAND (wf_t, wa_t, w2_t, w1_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C31); + w2_t = SHA256_EXPAND (w0_t, wb_t, w3_t, w2_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C32); + w3_t = SHA256_EXPAND (w1_t, wc_t, w4_t, w3_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C33); + w4_t = SHA256_EXPAND (w2_t, wd_t, w5_t, w4_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C34); + w5_t = SHA256_EXPAND (w3_t, we_t, w6_t, w5_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C35); + w6_t = SHA256_EXPAND (w4_t, wf_t, w7_t, w6_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C36); + w7_t = SHA256_EXPAND (w5_t, w0_t, w8_t, w7_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C37); + w8_t = SHA256_EXPAND (w6_t, w1_t, w9_t, w8_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C38); + w9_t = SHA256_EXPAND (w7_t, w2_t, wa_t, w9_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C39); + wa_t = SHA256_EXPAND (w8_t, w3_t, wb_t, wa_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C3a); + wb_t = SHA256_EXPAND (w9_t, w4_t, wc_t, wb_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C3b); + wc_t = SHA256_EXPAND (wa_t, w5_t, wd_t, wc_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C3c); + wd_t = SHA256_EXPAND (wb_t, w6_t, we_t, wd_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C3d); + we_t = SHA256_EXPAND (wc_t, w7_t, wf_t, we_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C3e); + wf_t = SHA256_EXPAND (wd_t, w8_t, w0_t, wf_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C3f); + + + const u32x r0 = d; + const u32x r1 = h; + const u32x r2 = c; + const u32x r3 = g; + + #include VECT_COMPARE_M + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m01440_m08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m01440_m16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m01440_s04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, combs_buf[0].pw_len); + } + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[7]; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = combs_buf[il_pos].pw_len; + + const u32 pw_len = pw_l_len + pw_r_len; + + u32 wordr0[4]; + u32 wordr1[4]; + u32 wordr2[4]; + u32 wordr3[4]; + + wordr0[0] = combs_buf[il_pos].i[0]; + wordr0[1] = combs_buf[il_pos].i[1]; + wordr0[2] = combs_buf[il_pos].i[2]; + wordr0[3] = combs_buf[il_pos].i[3]; + wordr1[0] = combs_buf[il_pos].i[4]; + wordr1[1] = combs_buf[il_pos].i[5]; + wordr1[2] = combs_buf[il_pos].i[6]; + wordr1[3] = combs_buf[il_pos].i[7]; + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + u32x w0[4]; + u32x w1[4]; + u32x w2[4]; + u32x w3[4]; + + w0[0] = wordl0[0] | wordr0[0]; + w0[1] = wordl0[1] | wordr0[1]; + w0[2] = wordl0[2] | wordr0[2]; + w0[3] = wordl0[3] | wordr0[3]; + w1[0] = wordl1[0] | wordr1[0]; + w1[1] = wordl1[1] | wordr1[1]; + w1[2] = wordl1[2] | wordr1[2]; + w1[3] = wordl1[3] | wordr1[3]; + w2[0] = wordl2[0] | wordr2[0]; + w2[1] = wordl2[1] | wordr2[1]; + w2[2] = wordl2[2] | wordr2[2]; + w2[3] = wordl2[3] | wordr2[3]; + w3[0] = wordl3[0] | wordr3[0]; + w3[1] = wordl3[1] | wordr3[1]; + w3[2] = wordl3[2] | wordr3[2]; + w3[3] = wordl3[3] | wordr3[3]; + + /** + * prepend salt + */ + + const u32 pw_salt_len = (pw_len * 2) + salt_len; + + u32x w0_t2[4]; + u32x w1_t2[4]; + u32x w2_t2[4]; + u32x w3_t2[4]; + + make_unicode (w0, w0_t2, w1_t2); + make_unicode (w1, w2_t2, w3_t2); + + switch_buffer_by_offset (w0_t2, w1_t2, w2_t2, w3_t2, salt_len); + + w0_t2[0] |= salt_buf0[0]; + w0_t2[1] |= salt_buf0[1]; + w0_t2[2] |= salt_buf0[2]; + w0_t2[3] |= salt_buf0[3]; + w1_t2[0] |= salt_buf1[0]; + w1_t2[1] |= salt_buf1[1]; + w1_t2[2] |= salt_buf1[2]; + w1_t2[3] |= salt_buf1[3]; + + append_0x80_4 (w0_t2, w1_t2, w2_t2, w3_t2, pw_salt_len); + + /** + * sha256 + */ + + u32x w0_t = swap_workaround (w0_t2[0]); + u32x w1_t = swap_workaround (w0_t2[1]); + u32x w2_t = swap_workaround (w0_t2[2]); + u32x w3_t = swap_workaround (w0_t2[3]); + u32x w4_t = swap_workaround (w1_t2[0]); + u32x w5_t = swap_workaround (w1_t2[1]); + u32x w6_t = swap_workaround (w1_t2[2]); + u32x w7_t = swap_workaround (w1_t2[3]); + u32x w8_t = swap_workaround (w2_t2[0]); + u32x w9_t = swap_workaround (w2_t2[1]); + u32x wa_t = swap_workaround (w2_t2[2]); + u32x wb_t = swap_workaround (w2_t2[3]); + u32x wc_t = swap_workaround (w3_t2[0]); + u32x wd_t = swap_workaround (w3_t2[1]); + u32x we_t = 0; + u32x wf_t = pw_salt_len * 8; + + u32x a = SHA256M_A; + u32x b = SHA256M_B; + u32x c = SHA256M_C; + u32x d = SHA256M_D; + u32x e = SHA256M_E; + u32x f = SHA256M_F; + u32x g = SHA256M_G; + u32x h = SHA256M_H; + + SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C00); + SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C01); + SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C02); + SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C03); + SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C04); + SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C05); + SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C06); + SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C07); + SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C08); + SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C09); + SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C0a); + SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C0b); + SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C0c); + SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C0d); + SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C0e); + SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C0f); + + w0_t = SHA256_EXPAND (we_t, w9_t, w1_t, w0_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C10); + w1_t = SHA256_EXPAND (wf_t, wa_t, w2_t, w1_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C11); + w2_t = SHA256_EXPAND (w0_t, wb_t, w3_t, w2_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C12); + w3_t = SHA256_EXPAND (w1_t, wc_t, w4_t, w3_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C13); + w4_t = SHA256_EXPAND (w2_t, wd_t, w5_t, w4_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C14); + w5_t = SHA256_EXPAND (w3_t, we_t, w6_t, w5_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C15); + w6_t = SHA256_EXPAND (w4_t, wf_t, w7_t, w6_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C16); + w7_t = SHA256_EXPAND (w5_t, w0_t, w8_t, w7_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C17); + w8_t = SHA256_EXPAND (w6_t, w1_t, w9_t, w8_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C18); + w9_t = SHA256_EXPAND (w7_t, w2_t, wa_t, w9_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C19); + wa_t = SHA256_EXPAND (w8_t, w3_t, wb_t, wa_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C1a); + wb_t = SHA256_EXPAND (w9_t, w4_t, wc_t, wb_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C1b); + wc_t = SHA256_EXPAND (wa_t, w5_t, wd_t, wc_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C1c); + wd_t = SHA256_EXPAND (wb_t, w6_t, we_t, wd_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C1d); + we_t = SHA256_EXPAND (wc_t, w7_t, wf_t, we_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C1e); + wf_t = SHA256_EXPAND (wd_t, w8_t, w0_t, wf_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C1f); + + w0_t = SHA256_EXPAND (we_t, w9_t, w1_t, w0_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C20); + w1_t = SHA256_EXPAND (wf_t, wa_t, w2_t, w1_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C21); + w2_t = SHA256_EXPAND (w0_t, wb_t, w3_t, w2_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C22); + w3_t = SHA256_EXPAND (w1_t, wc_t, w4_t, w3_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C23); + w4_t = SHA256_EXPAND (w2_t, wd_t, w5_t, w4_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C24); + w5_t = SHA256_EXPAND (w3_t, we_t, w6_t, w5_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C25); + w6_t = SHA256_EXPAND (w4_t, wf_t, w7_t, w6_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C26); + w7_t = SHA256_EXPAND (w5_t, w0_t, w8_t, w7_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C27); + w8_t = SHA256_EXPAND (w6_t, w1_t, w9_t, w8_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C28); + w9_t = SHA256_EXPAND (w7_t, w2_t, wa_t, w9_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C29); + wa_t = SHA256_EXPAND (w8_t, w3_t, wb_t, wa_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C2a); + wb_t = SHA256_EXPAND (w9_t, w4_t, wc_t, wb_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C2b); + wc_t = SHA256_EXPAND (wa_t, w5_t, wd_t, wc_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C2c); + wd_t = SHA256_EXPAND (wb_t, w6_t, we_t, wd_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C2d); + we_t = SHA256_EXPAND (wc_t, w7_t, wf_t, we_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C2e); + wf_t = SHA256_EXPAND (wd_t, w8_t, w0_t, wf_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C2f); + + w0_t = SHA256_EXPAND (we_t, w9_t, w1_t, w0_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C30); + w1_t = SHA256_EXPAND (wf_t, wa_t, w2_t, w1_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C31); + w2_t = SHA256_EXPAND (w0_t, wb_t, w3_t, w2_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C32); + w3_t = SHA256_EXPAND (w1_t, wc_t, w4_t, w3_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C33); + w4_t = SHA256_EXPAND (w2_t, wd_t, w5_t, w4_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C34); + w5_t = SHA256_EXPAND (w3_t, we_t, w6_t, w5_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C35); + w6_t = SHA256_EXPAND (w4_t, wf_t, w7_t, w6_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C36); + w7_t = SHA256_EXPAND (w5_t, w0_t, w8_t, w7_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C37); + w8_t = SHA256_EXPAND (w6_t, w1_t, w9_t, w8_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C38); + w9_t = SHA256_EXPAND (w7_t, w2_t, wa_t, w9_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C39); + wa_t = SHA256_EXPAND (w8_t, w3_t, wb_t, wa_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C3a); + wb_t = SHA256_EXPAND (w9_t, w4_t, wc_t, wb_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C3b); + wc_t = SHA256_EXPAND (wa_t, w5_t, wd_t, wc_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C3c); + wd_t = SHA256_EXPAND (wb_t, w6_t, we_t, wd_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C3d); + we_t = SHA256_EXPAND (wc_t, w7_t, wf_t, we_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C3e); + wf_t = SHA256_EXPAND (wd_t, w8_t, w0_t, wf_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C3f); + + + const u32x r0 = d; + const u32x r1 = h; + const u32x r2 = c; + const u32x r3 = g; + + #include VECT_COMPARE_S + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m01440_s08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m01440_s16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/amd/m01440_a3.cl b/amd/m01440_a3.cl new file mode 100644 index 0000000000..9c8bb0a49d --- /dev/null +++ b/amd/m01440_a3.cl @@ -0,0 +1,759 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _SHA256_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW4 +#define VECT_SIZE2 +#endif + +#ifdef VLIW5 +#define VECT_SIZE2 +#endif + +#define DGST_R0 3 +#define DGST_R1 7 +#define DGST_R2 2 +#define DGST_R3 6 + +#include "include/kernel_functions.c" +#include "types_amd.c" +#include "common_amd.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +static void m01440m (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], const u32 pw_len, __global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset) +{ + /** + * modifier + */ + + const u32 gid = get_global_id (0); + const u32 lid = get_local_id (0); + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[ 1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[ 2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[ 3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[ 4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[ 5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[ 6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[ 7]; + + u32 salt_buf2[4]; + + salt_buf2[0] = 0; + salt_buf2[1] = 0; + salt_buf2[2] = 0; + salt_buf2[3] = 0; + + u32 salt_buf3[4]; + + salt_buf3[0] = 0; + salt_buf3[1] = 0; + salt_buf3[2] = 0; + salt_buf3[3] = 0; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + const u32 pw_salt_len = pw_len + salt_len; + + /** + * loop + */ + + u32x w0l = w0[0]; + + for (u32 il_pos = 0; il_pos < bfs_cnt; il_pos++) + { + const u32 w0r = bfs_buf[il_pos].i; + + w0[0] = w0l | w0r; + + /** + * prepend salt + */ + + u32x w0_t2[4]; + u32x w1_t2[4]; + u32x w2_t2[4]; + u32x w3_t2[4]; + + w0_t2[0] = swap_workaround (w0[0]); + w0_t2[1] = swap_workaround (w0[1]); + w0_t2[2] = swap_workaround (w0[2]); + w0_t2[3] = swap_workaround (w0[3]); + w1_t2[0] = swap_workaround (w1[0]); + w1_t2[1] = swap_workaround (w1[1]); + w1_t2[2] = swap_workaround (w1[2]); + w1_t2[3] = swap_workaround (w1[3]); + w2_t2[0] = swap_workaround (w2[0]); + w2_t2[1] = swap_workaround (w2[1]); + w2_t2[2] = swap_workaround (w2[2]); + w2_t2[3] = swap_workaround (w2[3]); + w3_t2[0] = swap_workaround (w3[0]); + w3_t2[1] = swap_workaround (w3[1]); + w3_t2[2] = swap_workaround (w3[2]); + w3_t2[3] = swap_workaround (w3[3]); + + switch_buffer_by_offset (w0_t2, w1_t2, w2_t2, w3_t2, salt_len); + + w0_t2[0] |= salt_buf0[0]; + w0_t2[1] |= salt_buf0[1]; + w0_t2[2] |= salt_buf0[2]; + w0_t2[3] |= salt_buf0[3]; + w1_t2[0] |= salt_buf1[0]; + w1_t2[1] |= salt_buf1[1]; + w1_t2[2] |= salt_buf1[2]; + w1_t2[3] |= salt_buf1[3]; + w2_t2[0] |= salt_buf2[0]; + w2_t2[1] |= salt_buf2[1]; + w2_t2[2] |= salt_buf2[2]; + w2_t2[3] |= salt_buf2[3]; + w3_t2[0] |= salt_buf3[0]; + w3_t2[1] |= salt_buf3[1]; + w3_t2[2] |= salt_buf3[2]; + w3_t2[3] |= salt_buf3[3]; + + /** + * sha256 + */ + + u32x w0_t = swap_workaround (w0_t2[0]); + u32x w1_t = swap_workaround (w0_t2[1]); + u32x w2_t = swap_workaround (w0_t2[2]); + u32x w3_t = swap_workaround (w0_t2[3]); + u32x w4_t = swap_workaround (w1_t2[0]); + u32x w5_t = swap_workaround (w1_t2[1]); + u32x w6_t = swap_workaround (w1_t2[2]); + u32x w7_t = swap_workaround (w1_t2[3]); + u32x w8_t = swap_workaround (w2_t2[0]); + u32x w9_t = swap_workaround (w2_t2[1]); + u32x wa_t = swap_workaround (w2_t2[2]); + u32x wb_t = swap_workaround (w2_t2[3]); + u32x wc_t = swap_workaround (w3_t2[0]); + u32x wd_t = swap_workaround (w3_t2[1]); + u32x we_t = 0; + u32x wf_t = pw_salt_len * 8; + + u32x a = SHA256M_A; + u32x b = SHA256M_B; + u32x c = SHA256M_C; + u32x d = SHA256M_D; + u32x e = SHA256M_E; + u32x f = SHA256M_F; + u32x g = SHA256M_G; + u32x h = SHA256M_H; + + SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C00); + SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C01); + SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C02); + SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C03); + SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C04); + SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C05); + SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C06); + SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C07); + SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C08); + SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C09); + SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C0a); + SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C0b); + SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C0c); + SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C0d); + SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C0e); + SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C0f); + + w0_t = SHA256_EXPAND (we_t, w9_t, w1_t, w0_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C10); + w1_t = SHA256_EXPAND (wf_t, wa_t, w2_t, w1_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C11); + w2_t = SHA256_EXPAND (w0_t, wb_t, w3_t, w2_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C12); + w3_t = SHA256_EXPAND (w1_t, wc_t, w4_t, w3_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C13); + w4_t = SHA256_EXPAND (w2_t, wd_t, w5_t, w4_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C14); + w5_t = SHA256_EXPAND (w3_t, we_t, w6_t, w5_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C15); + w6_t = SHA256_EXPAND (w4_t, wf_t, w7_t, w6_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C16); + w7_t = SHA256_EXPAND (w5_t, w0_t, w8_t, w7_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C17); + w8_t = SHA256_EXPAND (w6_t, w1_t, w9_t, w8_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C18); + w9_t = SHA256_EXPAND (w7_t, w2_t, wa_t, w9_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C19); + wa_t = SHA256_EXPAND (w8_t, w3_t, wb_t, wa_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C1a); + wb_t = SHA256_EXPAND (w9_t, w4_t, wc_t, wb_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C1b); + wc_t = SHA256_EXPAND (wa_t, w5_t, wd_t, wc_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C1c); + wd_t = SHA256_EXPAND (wb_t, w6_t, we_t, wd_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C1d); + we_t = SHA256_EXPAND (wc_t, w7_t, wf_t, we_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C1e); + wf_t = SHA256_EXPAND (wd_t, w8_t, w0_t, wf_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C1f); + + w0_t = SHA256_EXPAND (we_t, w9_t, w1_t, w0_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C20); + w1_t = SHA256_EXPAND (wf_t, wa_t, w2_t, w1_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C21); + w2_t = SHA256_EXPAND (w0_t, wb_t, w3_t, w2_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C22); + w3_t = SHA256_EXPAND (w1_t, wc_t, w4_t, w3_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C23); + w4_t = SHA256_EXPAND (w2_t, wd_t, w5_t, w4_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C24); + w5_t = SHA256_EXPAND (w3_t, we_t, w6_t, w5_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C25); + w6_t = SHA256_EXPAND (w4_t, wf_t, w7_t, w6_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C26); + w7_t = SHA256_EXPAND (w5_t, w0_t, w8_t, w7_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C27); + w8_t = SHA256_EXPAND (w6_t, w1_t, w9_t, w8_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C28); + w9_t = SHA256_EXPAND (w7_t, w2_t, wa_t, w9_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C29); + wa_t = SHA256_EXPAND (w8_t, w3_t, wb_t, wa_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C2a); + wb_t = SHA256_EXPAND (w9_t, w4_t, wc_t, wb_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C2b); + wc_t = SHA256_EXPAND (wa_t, w5_t, wd_t, wc_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C2c); + wd_t = SHA256_EXPAND (wb_t, w6_t, we_t, wd_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C2d); + we_t = SHA256_EXPAND (wc_t, w7_t, wf_t, we_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C2e); + wf_t = SHA256_EXPAND (wd_t, w8_t, w0_t, wf_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C2f); + + w0_t = SHA256_EXPAND (we_t, w9_t, w1_t, w0_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C30); + w1_t = SHA256_EXPAND (wf_t, wa_t, w2_t, w1_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C31); + w2_t = SHA256_EXPAND (w0_t, wb_t, w3_t, w2_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C32); + w3_t = SHA256_EXPAND (w1_t, wc_t, w4_t, w3_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C33); + w4_t = SHA256_EXPAND (w2_t, wd_t, w5_t, w4_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C34); + w5_t = SHA256_EXPAND (w3_t, we_t, w6_t, w5_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C35); + w6_t = SHA256_EXPAND (w4_t, wf_t, w7_t, w6_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C36); + w7_t = SHA256_EXPAND (w5_t, w0_t, w8_t, w7_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C37); + w8_t = SHA256_EXPAND (w6_t, w1_t, w9_t, w8_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C38); + w9_t = SHA256_EXPAND (w7_t, w2_t, wa_t, w9_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C39); + wa_t = SHA256_EXPAND (w8_t, w3_t, wb_t, wa_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C3a); + wb_t = SHA256_EXPAND (w9_t, w4_t, wc_t, wb_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C3b); + wc_t = SHA256_EXPAND (wa_t, w5_t, wd_t, wc_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C3c); + wd_t = SHA256_EXPAND (wb_t, w6_t, we_t, wd_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C3d); + we_t = SHA256_EXPAND (wc_t, w7_t, wf_t, we_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C3e); + wf_t = SHA256_EXPAND (wd_t, w8_t, w0_t, wf_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C3f); + + + const u32x r0 = d; + const u32x r1 = h; + const u32x r2 = c; + const u32x r3 = g; + + #include VECT_COMPARE_M + } +} + +static void m01440s (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], const u32 pw_len, __global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset) +{ + /** + * modifier + */ + + const u32 gid = get_global_id (0); + const u32 lid = get_local_id (0); + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[ 1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[ 2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[ 3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[ 4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[ 5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[ 6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[ 7]; + + u32 salt_buf2[4]; + + salt_buf2[0] = 0; + salt_buf2[1] = 0; + salt_buf2[2] = 0; + salt_buf2[3] = 0; + + u32 salt_buf3[4]; + + salt_buf3[0] = 0; + salt_buf3[1] = 0; + salt_buf3[2] = 0; + salt_buf3[3] = 0; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + const u32 pw_salt_len = pw_len + salt_len; + + /** + * loop + */ + + u32x w0l = w0[0]; + + for (u32 il_pos = 0; il_pos < bfs_cnt; il_pos++) + { + const u32 w0r = bfs_buf[il_pos].i; + + w0[0] = w0l | w0r; + + /** + * prepend salt + */ + + u32x w0_t2[4]; + u32x w1_t2[4]; + u32x w2_t2[4]; + u32x w3_t2[4]; + + w0_t2[0] = swap_workaround (w0[0]); + w0_t2[1] = swap_workaround (w0[1]); + w0_t2[2] = swap_workaround (w0[2]); + w0_t2[3] = swap_workaround (w0[3]); + w1_t2[0] = swap_workaround (w1[0]); + w1_t2[1] = swap_workaround (w1[1]); + w1_t2[2] = swap_workaround (w1[2]); + w1_t2[3] = swap_workaround (w1[3]); + w2_t2[0] = swap_workaround (w2[0]); + w2_t2[1] = swap_workaround (w2[1]); + w2_t2[2] = swap_workaround (w2[2]); + w2_t2[3] = swap_workaround (w2[3]); + w3_t2[0] = swap_workaround (w3[0]); + w3_t2[1] = swap_workaround (w3[1]); + w3_t2[2] = swap_workaround (w3[2]); + w3_t2[3] = swap_workaround (w3[3]); + + switch_buffer_by_offset (w0_t2, w1_t2, w2_t2, w3_t2, salt_len); + + w0_t2[0] |= salt_buf0[0]; + w0_t2[1] |= salt_buf0[1]; + w0_t2[2] |= salt_buf0[2]; + w0_t2[3] |= salt_buf0[3]; + w1_t2[0] |= salt_buf1[0]; + w1_t2[1] |= salt_buf1[1]; + w1_t2[2] |= salt_buf1[2]; + w1_t2[3] |= salt_buf1[3]; + w2_t2[0] |= salt_buf2[0]; + w2_t2[1] |= salt_buf2[1]; + w2_t2[2] |= salt_buf2[2]; + w2_t2[3] |= salt_buf2[3]; + w3_t2[0] |= salt_buf3[0]; + w3_t2[1] |= salt_buf3[1]; + w3_t2[2] |= salt_buf3[2]; + w3_t2[3] |= salt_buf3[3]; + + /** + * sha256 + */ + + u32x w0_t = swap_workaround (w0_t2[0]); + u32x w1_t = swap_workaround (w0_t2[1]); + u32x w2_t = swap_workaround (w0_t2[2]); + u32x w3_t = swap_workaround (w0_t2[3]); + u32x w4_t = swap_workaround (w1_t2[0]); + u32x w5_t = swap_workaround (w1_t2[1]); + u32x w6_t = swap_workaround (w1_t2[2]); + u32x w7_t = swap_workaround (w1_t2[3]); + u32x w8_t = swap_workaround (w2_t2[0]); + u32x w9_t = swap_workaround (w2_t2[1]); + u32x wa_t = swap_workaround (w2_t2[2]); + u32x wb_t = swap_workaround (w2_t2[3]); + u32x wc_t = swap_workaround (w3_t2[0]); + u32x wd_t = swap_workaround (w3_t2[1]); + u32x we_t = 0; + u32x wf_t = pw_salt_len * 8; + + u32x a = SHA256M_A; + u32x b = SHA256M_B; + u32x c = SHA256M_C; + u32x d = SHA256M_D; + u32x e = SHA256M_E; + u32x f = SHA256M_F; + u32x g = SHA256M_G; + u32x h = SHA256M_H; + + SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C00); + SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C01); + SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C02); + SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C03); + SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C04); + SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C05); + SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C06); + SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C07); + SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C08); + SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C09); + SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C0a); + SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C0b); + SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C0c); + SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C0d); + SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C0e); + SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C0f); + + w0_t = SHA256_EXPAND (we_t, w9_t, w1_t, w0_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C10); + w1_t = SHA256_EXPAND (wf_t, wa_t, w2_t, w1_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C11); + w2_t = SHA256_EXPAND (w0_t, wb_t, w3_t, w2_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C12); + w3_t = SHA256_EXPAND (w1_t, wc_t, w4_t, w3_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C13); + w4_t = SHA256_EXPAND (w2_t, wd_t, w5_t, w4_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C14); + w5_t = SHA256_EXPAND (w3_t, we_t, w6_t, w5_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C15); + w6_t = SHA256_EXPAND (w4_t, wf_t, w7_t, w6_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C16); + w7_t = SHA256_EXPAND (w5_t, w0_t, w8_t, w7_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C17); + w8_t = SHA256_EXPAND (w6_t, w1_t, w9_t, w8_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C18); + w9_t = SHA256_EXPAND (w7_t, w2_t, wa_t, w9_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C19); + wa_t = SHA256_EXPAND (w8_t, w3_t, wb_t, wa_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C1a); + wb_t = SHA256_EXPAND (w9_t, w4_t, wc_t, wb_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C1b); + wc_t = SHA256_EXPAND (wa_t, w5_t, wd_t, wc_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C1c); + wd_t = SHA256_EXPAND (wb_t, w6_t, we_t, wd_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C1d); + we_t = SHA256_EXPAND (wc_t, w7_t, wf_t, we_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C1e); + wf_t = SHA256_EXPAND (wd_t, w8_t, w0_t, wf_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C1f); + + w0_t = SHA256_EXPAND (we_t, w9_t, w1_t, w0_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C20); + w1_t = SHA256_EXPAND (wf_t, wa_t, w2_t, w1_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C21); + w2_t = SHA256_EXPAND (w0_t, wb_t, w3_t, w2_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C22); + w3_t = SHA256_EXPAND (w1_t, wc_t, w4_t, w3_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C23); + w4_t = SHA256_EXPAND (w2_t, wd_t, w5_t, w4_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C24); + w5_t = SHA256_EXPAND (w3_t, we_t, w6_t, w5_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C25); + w6_t = SHA256_EXPAND (w4_t, wf_t, w7_t, w6_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C26); + w7_t = SHA256_EXPAND (w5_t, w0_t, w8_t, w7_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C27); + w8_t = SHA256_EXPAND (w6_t, w1_t, w9_t, w8_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C28); + w9_t = SHA256_EXPAND (w7_t, w2_t, wa_t, w9_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C29); + wa_t = SHA256_EXPAND (w8_t, w3_t, wb_t, wa_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C2a); + wb_t = SHA256_EXPAND (w9_t, w4_t, wc_t, wb_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C2b); + wc_t = SHA256_EXPAND (wa_t, w5_t, wd_t, wc_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C2c); + wd_t = SHA256_EXPAND (wb_t, w6_t, we_t, wd_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C2d); + we_t = SHA256_EXPAND (wc_t, w7_t, wf_t, we_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C2e); + wf_t = SHA256_EXPAND (wd_t, w8_t, w0_t, wf_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C2f); + + w0_t = SHA256_EXPAND (we_t, w9_t, w1_t, w0_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C30); + w1_t = SHA256_EXPAND (wf_t, wa_t, w2_t, w1_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C31); + w2_t = SHA256_EXPAND (w0_t, wb_t, w3_t, w2_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C32); + w3_t = SHA256_EXPAND (w1_t, wc_t, w4_t, w3_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C33); + w4_t = SHA256_EXPAND (w2_t, wd_t, w5_t, w4_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C34); + w5_t = SHA256_EXPAND (w3_t, we_t, w6_t, w5_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C35); + w6_t = SHA256_EXPAND (w4_t, wf_t, w7_t, w6_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C36); + w7_t = SHA256_EXPAND (w5_t, w0_t, w8_t, w7_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C37); + w8_t = SHA256_EXPAND (w6_t, w1_t, w9_t, w8_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C38); + w9_t = SHA256_EXPAND (w7_t, w2_t, wa_t, w9_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C39); + wa_t = SHA256_EXPAND (w8_t, w3_t, wb_t, wa_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C3a); + wb_t = SHA256_EXPAND (w9_t, w4_t, wc_t, wb_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C3b); + wc_t = SHA256_EXPAND (wa_t, w5_t, wd_t, wc_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C3c); + wd_t = SHA256_EXPAND (wb_t, w6_t, we_t, wd_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C3d); + we_t = SHA256_EXPAND (wc_t, w7_t, wf_t, we_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C3e); + wf_t = SHA256_EXPAND (wd_t, w8_t, w0_t, wf_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C3f); + + + const u32x r0 = d; + const u32x r1 = h; + const u32x r2 = c; + const u32x r3 = g; + + #include VECT_COMPARE_S + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m01440_m04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m01440m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m01440_m08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m01440m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m01440_m16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = pws[gid].i[ 8]; + w2[1] = pws[gid].i[ 9]; + w2[2] = pws[gid].i[10]; + w2[3] = pws[gid].i[11]; + + u32x w3[4]; + + w3[0] = pws[gid].i[12]; + w3[1] = pws[gid].i[13]; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m01440m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m01440_s04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m01440s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m01440_s08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m01440s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m01440_s16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = pws[gid].i[ 8]; + w2[1] = pws[gid].i[ 9]; + w2[2] = pws[gid].i[10]; + w2[3] = pws[gid].i[11]; + + u32x w3[4]; + + w3[0] = pws[gid].i[12]; + w3[1] = pws[gid].i[13]; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m01440s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} diff --git a/amd/m01450_a0.cl b/amd/m01450_a0.cl new file mode 100644 index 0000000000..794c054dd0 --- /dev/null +++ b/amd/m01450_a0.cl @@ -0,0 +1,592 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _SHA256_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW4 +#define VECT_SIZE1 +#endif + +#ifdef VLIW5 +#define VECT_SIZE1 +#endif + +#define DGST_R0 3 +#define DGST_R1 7 +#define DGST_R2 2 +#define DGST_R3 6 + +#include "include/kernel_functions.c" +#include "types_amd.c" +#include "common_amd.c" +#include "include/rp_gpu.h" +#include "rp_amd.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +__constant u32 k_sha256[64] = +{ + SHA256C00, SHA256C01, SHA256C02, SHA256C03, + SHA256C04, SHA256C05, SHA256C06, SHA256C07, + SHA256C08, SHA256C09, SHA256C0a, SHA256C0b, + SHA256C0c, SHA256C0d, SHA256C0e, SHA256C0f, + SHA256C10, SHA256C11, SHA256C12, SHA256C13, + SHA256C14, SHA256C15, SHA256C16, SHA256C17, + SHA256C18, SHA256C19, SHA256C1a, SHA256C1b, + SHA256C1c, SHA256C1d, SHA256C1e, SHA256C1f, + SHA256C20, SHA256C21, SHA256C22, SHA256C23, + SHA256C24, SHA256C25, SHA256C26, SHA256C27, + SHA256C28, SHA256C29, SHA256C2a, SHA256C2b, + SHA256C2c, SHA256C2d, SHA256C2e, SHA256C2f, + SHA256C30, SHA256C31, SHA256C32, SHA256C33, + SHA256C34, SHA256C35, SHA256C36, SHA256C37, + SHA256C38, SHA256C39, SHA256C3a, SHA256C3b, + SHA256C3c, SHA256C3d, SHA256C3e, SHA256C3f, +}; + +static void sha256_transform (const u32x w0[4], const u32x w1[4], const u32x w2[4], const u32x w3[4], u32x digest[8]) +{ + u32x a = digest[0]; + u32x b = digest[1]; + u32x c = digest[2]; + u32x d = digest[3]; + u32x e = digest[4]; + u32x f = digest[5]; + u32x g = digest[6]; + u32x h = digest[7]; + + u32x w0_t = w0[0]; + u32x w1_t = w0[1]; + u32x w2_t = w0[2]; + u32x w3_t = w0[3]; + u32x w4_t = w1[0]; + u32x w5_t = w1[1]; + u32x w6_t = w1[2]; + u32x w7_t = w1[3]; + u32x w8_t = w2[0]; + u32x w9_t = w2[1]; + u32x wa_t = w2[2]; + u32x wb_t = w2[3]; + u32x wc_t = w3[0]; + u32x wd_t = w3[1]; + u32x we_t = w3[2]; + u32x wf_t = w3[3]; + + #define ROUND_EXPAND() \ + { \ + w0_t = SHA256_EXPAND (we_t, w9_t, w1_t, w0_t); \ + w1_t = SHA256_EXPAND (wf_t, wa_t, w2_t, w1_t); \ + w2_t = SHA256_EXPAND (w0_t, wb_t, w3_t, w2_t); \ + w3_t = SHA256_EXPAND (w1_t, wc_t, w4_t, w3_t); \ + w4_t = SHA256_EXPAND (w2_t, wd_t, w5_t, w4_t); \ + w5_t = SHA256_EXPAND (w3_t, we_t, w6_t, w5_t); \ + w6_t = SHA256_EXPAND (w4_t, wf_t, w7_t, w6_t); \ + w7_t = SHA256_EXPAND (w5_t, w0_t, w8_t, w7_t); \ + w8_t = SHA256_EXPAND (w6_t, w1_t, w9_t, w8_t); \ + w9_t = SHA256_EXPAND (w7_t, w2_t, wa_t, w9_t); \ + wa_t = SHA256_EXPAND (w8_t, w3_t, wb_t, wa_t); \ + wb_t = SHA256_EXPAND (w9_t, w4_t, wc_t, wb_t); \ + wc_t = SHA256_EXPAND (wa_t, w5_t, wd_t, wc_t); \ + wd_t = SHA256_EXPAND (wb_t, w6_t, we_t, wd_t); \ + we_t = SHA256_EXPAND (wc_t, w7_t, wf_t, we_t); \ + wf_t = SHA256_EXPAND (wd_t, w8_t, w0_t, wf_t); \ + } + + #define ROUND_STEP(i) \ + { \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, k_sha256[i + 0]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, k_sha256[i + 1]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, k_sha256[i + 2]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, k_sha256[i + 3]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, k_sha256[i + 4]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, k_sha256[i + 5]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, k_sha256[i + 6]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, k_sha256[i + 7]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, k_sha256[i + 8]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, k_sha256[i + 9]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, k_sha256[i + 10]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, k_sha256[i + 11]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, k_sha256[i + 12]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, k_sha256[i + 13]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, k_sha256[i + 14]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, k_sha256[i + 15]); \ + } + + ROUND_STEP (0); + + #pragma unroll + for (int i = 16; i < 64; i += 16) + { + ROUND_EXPAND (); ROUND_STEP (i); + } + + digest[0] += a; + digest[1] += b; + digest[2] += c; + digest[3] += d; + digest[4] += e; + digest[5] += f; + digest[6] += g; + digest[7] += h; +} + +static void hmac_sha256_pad (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], u32x ipad[8], u32x opad[8]) +{ + w0[0] = w0[0] ^ 0x36363636; + w0[1] = w0[1] ^ 0x36363636; + w0[2] = w0[2] ^ 0x36363636; + w0[3] = w0[3] ^ 0x36363636; + w1[0] = w1[0] ^ 0x36363636; + w1[1] = w1[1] ^ 0x36363636; + w1[2] = w1[2] ^ 0x36363636; + w1[3] = w1[3] ^ 0x36363636; + w2[0] = w2[0] ^ 0x36363636; + w2[1] = w2[1] ^ 0x36363636; + w2[2] = w2[2] ^ 0x36363636; + w2[3] = w2[3] ^ 0x36363636; + w3[0] = w3[0] ^ 0x36363636; + w3[1] = w3[1] ^ 0x36363636; + w3[2] = w3[2] ^ 0x36363636; + w3[3] = w3[3] ^ 0x36363636; + + ipad[0] = SHA256M_A; + ipad[1] = SHA256M_B; + ipad[2] = SHA256M_C; + ipad[3] = SHA256M_D; + ipad[4] = SHA256M_E; + ipad[5] = SHA256M_F; + ipad[6] = SHA256M_G; + ipad[7] = SHA256M_H; + + sha256_transform (w0, w1, w2, w3, ipad); + + w0[0] = w0[0] ^ 0x6a6a6a6a; + w0[1] = w0[1] ^ 0x6a6a6a6a; + w0[2] = w0[2] ^ 0x6a6a6a6a; + w0[3] = w0[3] ^ 0x6a6a6a6a; + w1[0] = w1[0] ^ 0x6a6a6a6a; + w1[1] = w1[1] ^ 0x6a6a6a6a; + w1[2] = w1[2] ^ 0x6a6a6a6a; + w1[3] = w1[3] ^ 0x6a6a6a6a; + w2[0] = w2[0] ^ 0x6a6a6a6a; + w2[1] = w2[1] ^ 0x6a6a6a6a; + w2[2] = w2[2] ^ 0x6a6a6a6a; + w2[3] = w2[3] ^ 0x6a6a6a6a; + w3[0] = w3[0] ^ 0x6a6a6a6a; + w3[1] = w3[1] ^ 0x6a6a6a6a; + w3[2] = w3[2] ^ 0x6a6a6a6a; + w3[3] = w3[3] ^ 0x6a6a6a6a; + + opad[0] = SHA256M_A; + opad[1] = SHA256M_B; + opad[2] = SHA256M_C; + opad[3] = SHA256M_D; + opad[4] = SHA256M_E; + opad[5] = SHA256M_F; + opad[6] = SHA256M_G; + opad[7] = SHA256M_H; + + sha256_transform (w0, w1, w2, w3, opad); +} + +static void hmac_sha256_run (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], u32x ipad[8], u32x opad[8], u32x digest[8]) +{ + digest[0] = ipad[0]; + digest[1] = ipad[1]; + digest[2] = ipad[2]; + digest[3] = ipad[3]; + digest[4] = ipad[4]; + digest[5] = ipad[5]; + digest[6] = ipad[6]; + digest[7] = ipad[7]; + + sha256_transform (w0, w1, w2, w3, digest); + + w0[0] = digest[0]; + w0[1] = digest[1]; + w0[2] = digest[2]; + w0[3] = digest[3]; + w1[0] = digest[4]; + w1[1] = digest[5]; + w1[2] = digest[6]; + w1[3] = digest[7]; + w2[0] = 0x80000000; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = (64 + 32) * 8; + + digest[0] = opad[0]; + digest[1] = opad[1]; + digest[2] = opad[2]; + digest[3] = opad[3]; + digest[4] = opad[4]; + digest[5] = opad[5]; + digest[6] = opad[6]; + digest[7] = opad[7]; + + sha256_transform (w0, w1, w2, w3, digest); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m01450_m04 (__global pw_t *pws, __global gpu_rule_t * rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + u32x pw_buf1[4]; + + pw_buf1[0] = pws[gid].i[ 4]; + pw_buf1[1] = pws[gid].i[ 5]; + pw_buf1[2] = pws[gid].i[ 6]; + pw_buf1[3] = pws[gid].i[ 7]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[ 1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[ 2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[ 3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[ 4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[ 5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[ 6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[ 7]; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + + w0[0] = pw_buf0[0]; + w0[1] = pw_buf0[1]; + w0[2] = pw_buf0[2]; + w0[3] = pw_buf0[3]; + + u32x w1[4]; + + w1[0] = pw_buf1[0]; + w1[1] = pw_buf1[1]; + w1[2] = pw_buf1[2]; + w1[3] = pw_buf1[3]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 out_len = apply_rules (rules_buf[il_pos].cmds, w0, w1, pw_len); + + /** + * pads + */ + + u32x w0_t[4]; + + w0_t[0] = swap_workaround (w0[0]); + w0_t[1] = swap_workaround (w0[1]); + w0_t[2] = swap_workaround (w0[2]); + w0_t[3] = swap_workaround (w0[3]); + + u32x w1_t[4]; + + w1_t[0] = swap_workaround (w1[0]); + w1_t[1] = swap_workaround (w1[1]); + w1_t[2] = swap_workaround (w1[2]); + w1_t[3] = swap_workaround (w1[3]); + + u32x w2_t[4]; + + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + + u32x w3_t[4]; + + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = 0; + + u32x ipad[8]; + u32x opad[8]; + + hmac_sha256_pad (w0_t, w1_t, w2_t, w3_t, ipad, opad); + + w0_t[0] = swap_workaround (salt_buf0[0]); + w0_t[1] = swap_workaround (salt_buf0[1]); + w0_t[2] = swap_workaround (salt_buf0[2]); + w0_t[3] = swap_workaround (salt_buf0[3]); + w1_t[0] = swap_workaround (salt_buf1[0]); + w1_t[1] = swap_workaround (salt_buf1[1]); + w1_t[2] = swap_workaround (salt_buf1[2]); + w1_t[3] = swap_workaround (salt_buf1[3]); + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = (64 + salt_len) * 8; + + u32x digest[8]; + + hmac_sha256_run (w0_t, w1_t, w2_t, w3_t, ipad, opad, digest); + + const u32x r0 = digest[3]; + const u32x r1 = digest[7]; + const u32x r2 = digest[2]; + const u32x r3 = digest[6]; + + #include VECT_COMPARE_M + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m01450_m08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m01450_m16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m01450_s04 (__global pw_t *pws, __global gpu_rule_t * rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + u32x pw_buf1[4]; + + pw_buf1[0] = pws[gid].i[ 4]; + pw_buf1[1] = pws[gid].i[ 5]; + pw_buf1[2] = pws[gid].i[ 6]; + pw_buf1[3] = pws[gid].i[ 7]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[ 1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[ 2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[ 3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[ 4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[ 5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[ 6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[ 7]; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + + w0[0] = pw_buf0[0]; + w0[1] = pw_buf0[1]; + w0[2] = pw_buf0[2]; + w0[3] = pw_buf0[3]; + + u32x w1[4]; + + w1[0] = pw_buf1[0]; + w1[1] = pw_buf1[1]; + w1[2] = pw_buf1[2]; + w1[3] = pw_buf1[3]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 out_len = apply_rules (rules_buf[il_pos].cmds, w0, w1, pw_len); + + /** + * pads + */ + + u32x w0_t[4]; + + w0_t[0] = swap_workaround (w0[0]); + w0_t[1] = swap_workaround (w0[1]); + w0_t[2] = swap_workaround (w0[2]); + w0_t[3] = swap_workaround (w0[3]); + + u32x w1_t[4]; + + w1_t[0] = swap_workaround (w1[0]); + w1_t[1] = swap_workaround (w1[1]); + w1_t[2] = swap_workaround (w1[2]); + w1_t[3] = swap_workaround (w1[3]); + + u32x w2_t[4]; + + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + + u32x w3_t[4]; + + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = 0; + + u32x ipad[8]; + u32x opad[8]; + + hmac_sha256_pad (w0_t, w1_t, w2_t, w3_t, ipad, opad); + + w0_t[0] = swap_workaround (salt_buf0[0]); + w0_t[1] = swap_workaround (salt_buf0[1]); + w0_t[2] = swap_workaround (salt_buf0[2]); + w0_t[3] = swap_workaround (salt_buf0[3]); + w1_t[0] = swap_workaround (salt_buf1[0]); + w1_t[1] = swap_workaround (salt_buf1[1]); + w1_t[2] = swap_workaround (salt_buf1[2]); + w1_t[3] = swap_workaround (salt_buf1[3]); + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = (64 + salt_len) * 8; + + u32x digest[8]; + + hmac_sha256_run (w0_t, w1_t, w2_t, w3_t, ipad, opad, digest); + + const u32x r0 = digest[3]; + const u32x r1 = digest[7]; + const u32x r2 = digest[2]; + const u32x r3 = digest[6]; + + #include VECT_COMPARE_S + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m01450_s08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m01450_s16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/amd/m01450_a1.cl b/amd/m01450_a1.cl new file mode 100644 index 0000000000..9ca7e3353c --- /dev/null +++ b/amd/m01450_a1.cl @@ -0,0 +1,698 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _SHA256_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW4 +#define VECT_SIZE1 +#endif + +#ifdef VLIW5 +#define VECT_SIZE1 +#endif + +#define DGST_R0 3 +#define DGST_R1 7 +#define DGST_R2 2 +#define DGST_R3 6 + +#include "include/kernel_functions.c" +#include "types_amd.c" +#include "common_amd.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +__constant u32 k_sha256[64] = +{ + SHA256C00, SHA256C01, SHA256C02, SHA256C03, + SHA256C04, SHA256C05, SHA256C06, SHA256C07, + SHA256C08, SHA256C09, SHA256C0a, SHA256C0b, + SHA256C0c, SHA256C0d, SHA256C0e, SHA256C0f, + SHA256C10, SHA256C11, SHA256C12, SHA256C13, + SHA256C14, SHA256C15, SHA256C16, SHA256C17, + SHA256C18, SHA256C19, SHA256C1a, SHA256C1b, + SHA256C1c, SHA256C1d, SHA256C1e, SHA256C1f, + SHA256C20, SHA256C21, SHA256C22, SHA256C23, + SHA256C24, SHA256C25, SHA256C26, SHA256C27, + SHA256C28, SHA256C29, SHA256C2a, SHA256C2b, + SHA256C2c, SHA256C2d, SHA256C2e, SHA256C2f, + SHA256C30, SHA256C31, SHA256C32, SHA256C33, + SHA256C34, SHA256C35, SHA256C36, SHA256C37, + SHA256C38, SHA256C39, SHA256C3a, SHA256C3b, + SHA256C3c, SHA256C3d, SHA256C3e, SHA256C3f, +}; + +static void sha256_transform (const u32x w0[4], const u32x w1[4], const u32x w2[4], const u32x w3[4], u32x digest[8]) +{ + u32x a = digest[0]; + u32x b = digest[1]; + u32x c = digest[2]; + u32x d = digest[3]; + u32x e = digest[4]; + u32x f = digest[5]; + u32x g = digest[6]; + u32x h = digest[7]; + + u32x w0_t = w0[0]; + u32x w1_t = w0[1]; + u32x w2_t = w0[2]; + u32x w3_t = w0[3]; + u32x w4_t = w1[0]; + u32x w5_t = w1[1]; + u32x w6_t = w1[2]; + u32x w7_t = w1[3]; + u32x w8_t = w2[0]; + u32x w9_t = w2[1]; + u32x wa_t = w2[2]; + u32x wb_t = w2[3]; + u32x wc_t = w3[0]; + u32x wd_t = w3[1]; + u32x we_t = w3[2]; + u32x wf_t = w3[3]; + + #define ROUND_EXPAND() \ + { \ + w0_t = SHA256_EXPAND (we_t, w9_t, w1_t, w0_t); \ + w1_t = SHA256_EXPAND (wf_t, wa_t, w2_t, w1_t); \ + w2_t = SHA256_EXPAND (w0_t, wb_t, w3_t, w2_t); \ + w3_t = SHA256_EXPAND (w1_t, wc_t, w4_t, w3_t); \ + w4_t = SHA256_EXPAND (w2_t, wd_t, w5_t, w4_t); \ + w5_t = SHA256_EXPAND (w3_t, we_t, w6_t, w5_t); \ + w6_t = SHA256_EXPAND (w4_t, wf_t, w7_t, w6_t); \ + w7_t = SHA256_EXPAND (w5_t, w0_t, w8_t, w7_t); \ + w8_t = SHA256_EXPAND (w6_t, w1_t, w9_t, w8_t); \ + w9_t = SHA256_EXPAND (w7_t, w2_t, wa_t, w9_t); \ + wa_t = SHA256_EXPAND (w8_t, w3_t, wb_t, wa_t); \ + wb_t = SHA256_EXPAND (w9_t, w4_t, wc_t, wb_t); \ + wc_t = SHA256_EXPAND (wa_t, w5_t, wd_t, wc_t); \ + wd_t = SHA256_EXPAND (wb_t, w6_t, we_t, wd_t); \ + we_t = SHA256_EXPAND (wc_t, w7_t, wf_t, we_t); \ + wf_t = SHA256_EXPAND (wd_t, w8_t, w0_t, wf_t); \ + } + + #define ROUND_STEP(i) \ + { \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, k_sha256[i + 0]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, k_sha256[i + 1]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, k_sha256[i + 2]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, k_sha256[i + 3]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, k_sha256[i + 4]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, k_sha256[i + 5]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, k_sha256[i + 6]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, k_sha256[i + 7]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, k_sha256[i + 8]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, k_sha256[i + 9]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, k_sha256[i + 10]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, k_sha256[i + 11]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, k_sha256[i + 12]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, k_sha256[i + 13]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, k_sha256[i + 14]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, k_sha256[i + 15]); \ + } + + ROUND_STEP (0); + + #pragma unroll + for (int i = 16; i < 64; i += 16) + { + ROUND_EXPAND (); ROUND_STEP (i); + } + + digest[0] += a; + digest[1] += b; + digest[2] += c; + digest[3] += d; + digest[4] += e; + digest[5] += f; + digest[6] += g; + digest[7] += h; +} + +static void hmac_sha256_pad (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], u32x ipad[8], u32x opad[8]) +{ + w0[0] = w0[0] ^ 0x36363636; + w0[1] = w0[1] ^ 0x36363636; + w0[2] = w0[2] ^ 0x36363636; + w0[3] = w0[3] ^ 0x36363636; + w1[0] = w1[0] ^ 0x36363636; + w1[1] = w1[1] ^ 0x36363636; + w1[2] = w1[2] ^ 0x36363636; + w1[3] = w1[3] ^ 0x36363636; + w2[0] = w2[0] ^ 0x36363636; + w2[1] = w2[1] ^ 0x36363636; + w2[2] = w2[2] ^ 0x36363636; + w2[3] = w2[3] ^ 0x36363636; + w3[0] = w3[0] ^ 0x36363636; + w3[1] = w3[1] ^ 0x36363636; + w3[2] = w3[2] ^ 0x36363636; + w3[3] = w3[3] ^ 0x36363636; + + ipad[0] = SHA256M_A; + ipad[1] = SHA256M_B; + ipad[2] = SHA256M_C; + ipad[3] = SHA256M_D; + ipad[4] = SHA256M_E; + ipad[5] = SHA256M_F; + ipad[6] = SHA256M_G; + ipad[7] = SHA256M_H; + + sha256_transform (w0, w1, w2, w3, ipad); + + w0[0] = w0[0] ^ 0x6a6a6a6a; + w0[1] = w0[1] ^ 0x6a6a6a6a; + w0[2] = w0[2] ^ 0x6a6a6a6a; + w0[3] = w0[3] ^ 0x6a6a6a6a; + w1[0] = w1[0] ^ 0x6a6a6a6a; + w1[1] = w1[1] ^ 0x6a6a6a6a; + w1[2] = w1[2] ^ 0x6a6a6a6a; + w1[3] = w1[3] ^ 0x6a6a6a6a; + w2[0] = w2[0] ^ 0x6a6a6a6a; + w2[1] = w2[1] ^ 0x6a6a6a6a; + w2[2] = w2[2] ^ 0x6a6a6a6a; + w2[3] = w2[3] ^ 0x6a6a6a6a; + w3[0] = w3[0] ^ 0x6a6a6a6a; + w3[1] = w3[1] ^ 0x6a6a6a6a; + w3[2] = w3[2] ^ 0x6a6a6a6a; + w3[3] = w3[3] ^ 0x6a6a6a6a; + + opad[0] = SHA256M_A; + opad[1] = SHA256M_B; + opad[2] = SHA256M_C; + opad[3] = SHA256M_D; + opad[4] = SHA256M_E; + opad[5] = SHA256M_F; + opad[6] = SHA256M_G; + opad[7] = SHA256M_H; + + sha256_transform (w0, w1, w2, w3, opad); +} + +static void hmac_sha256_run (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], u32x ipad[8], u32x opad[8], u32x digest[8]) +{ + digest[0] = ipad[0]; + digest[1] = ipad[1]; + digest[2] = ipad[2]; + digest[3] = ipad[3]; + digest[4] = ipad[4]; + digest[5] = ipad[5]; + digest[6] = ipad[6]; + digest[7] = ipad[7]; + + sha256_transform (w0, w1, w2, w3, digest); + + w0[0] = digest[0]; + w0[1] = digest[1]; + w0[2] = digest[2]; + w0[3] = digest[3]; + w1[0] = digest[4]; + w1[1] = digest[5]; + w1[2] = digest[6]; + w1[3] = digest[7]; + w2[0] = 0x80000000; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = (64 + 32) * 8; + + digest[0] = opad[0]; + digest[1] = opad[1]; + digest[2] = opad[2]; + digest[3] = opad[3]; + digest[4] = opad[4]; + digest[5] = opad[5]; + digest[6] = opad[6]; + digest[7] = opad[7]; + + sha256_transform (w0, w1, w2, w3, digest); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m01450_m04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, combs_buf[0].pw_len); + } + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[ 1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[ 2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[ 3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[ 4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[ 5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[ 6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[ 7]; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = combs_buf[il_pos].pw_len; + + const u32 pw_len = pw_l_len + pw_r_len; + + u32 wordr0[4]; + + wordr0[0] = combs_buf[il_pos].i[0]; + wordr0[1] = combs_buf[il_pos].i[1]; + wordr0[2] = combs_buf[il_pos].i[2]; + wordr0[3] = combs_buf[il_pos].i[3]; + + u32 wordr1[4]; + + wordr1[0] = combs_buf[il_pos].i[4]; + wordr1[1] = combs_buf[il_pos].i[5]; + wordr1[2] = combs_buf[il_pos].i[6]; + wordr1[3] = combs_buf[il_pos].i[7]; + + u32 wordr2[4]; + + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + + u32 wordr3[4]; + + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + u32x w0[4]; + + w0[0] = wordl0[0] | wordr0[0]; + w0[1] = wordl0[1] | wordr0[1]; + w0[2] = wordl0[2] | wordr0[2]; + w0[3] = wordl0[3] | wordr0[3]; + + u32x w1[4]; + + w1[0] = wordl1[0] | wordr1[0]; + w1[1] = wordl1[1] | wordr1[1]; + w1[2] = wordl1[2] | wordr1[2]; + w1[3] = wordl1[3] | wordr1[3]; + + u32x w2[4]; + + w2[0] = wordl2[0] | wordr2[0]; + w2[1] = wordl2[1] | wordr2[1]; + w2[2] = wordl2[2] | wordr2[2]; + w2[3] = wordl2[3] | wordr2[3]; + + u32x w3[4]; + + w3[0] = wordl3[0] | wordr3[0]; + w3[1] = wordl3[1] | wordr3[1]; + w3[2] = wordl3[2] | wordr3[2]; + w3[3] = wordl3[3] | wordr3[3]; + + /** + * pads + */ + + u32x w0_t[4]; + + w0_t[0] = swap_workaround (w0[0]); + w0_t[1] = swap_workaround (w0[1]); + w0_t[2] = swap_workaround (w0[2]); + w0_t[3] = swap_workaround (w0[3]); + + u32x w1_t[4]; + + w1_t[0] = swap_workaround (w1[0]); + w1_t[1] = swap_workaround (w1[1]); + w1_t[2] = swap_workaround (w1[2]); + w1_t[3] = swap_workaround (w1[3]); + + u32x w2_t[4]; + + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + + u32x w3_t[4]; + + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = 0; + + u32x ipad[8]; + u32x opad[8]; + + hmac_sha256_pad (w0_t, w1_t, w2_t, w3_t, ipad, opad); + + w0_t[0] = swap_workaround (salt_buf0[0]); + w0_t[1] = swap_workaround (salt_buf0[1]); + w0_t[2] = swap_workaround (salt_buf0[2]); + w0_t[3] = swap_workaround (salt_buf0[3]); + w1_t[0] = swap_workaround (salt_buf1[0]); + w1_t[1] = swap_workaround (salt_buf1[1]); + w1_t[2] = swap_workaround (salt_buf1[2]); + w1_t[3] = swap_workaround (salt_buf1[3]); + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = (64 + salt_len) * 8; + + u32x digest[8]; + + hmac_sha256_run (w0_t, w1_t, w2_t, w3_t, ipad, opad, digest); + + const u32x r0 = digest[3]; + const u32x r1 = digest[7]; + const u32x r2 = digest[2]; + const u32x r3 = digest[6]; + + #include VECT_COMPARE_M + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m01450_m08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m01450_m16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m01450_s04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, combs_buf[0].pw_len); + } + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[ 1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[ 2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[ 3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[ 4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[ 5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[ 6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[ 7]; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = combs_buf[il_pos].pw_len; + + const u32 pw_len = pw_l_len + pw_r_len; + + u32 wordr0[4]; + + wordr0[0] = combs_buf[il_pos].i[0]; + wordr0[1] = combs_buf[il_pos].i[1]; + wordr0[2] = combs_buf[il_pos].i[2]; + wordr0[3] = combs_buf[il_pos].i[3]; + + u32 wordr1[4]; + + wordr1[0] = combs_buf[il_pos].i[4]; + wordr1[1] = combs_buf[il_pos].i[5]; + wordr1[2] = combs_buf[il_pos].i[6]; + wordr1[3] = combs_buf[il_pos].i[7]; + + u32 wordr2[4]; + + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + + u32 wordr3[4]; + + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + u32x w0[4]; + + w0[0] = wordl0[0] | wordr0[0]; + w0[1] = wordl0[1] | wordr0[1]; + w0[2] = wordl0[2] | wordr0[2]; + w0[3] = wordl0[3] | wordr0[3]; + + u32x w1[4]; + + w1[0] = wordl1[0] | wordr1[0]; + w1[1] = wordl1[1] | wordr1[1]; + w1[2] = wordl1[2] | wordr1[2]; + w1[3] = wordl1[3] | wordr1[3]; + + u32x w2[4]; + + w2[0] = wordl2[0] | wordr2[0]; + w2[1] = wordl2[1] | wordr2[1]; + w2[2] = wordl2[2] | wordr2[2]; + w2[3] = wordl2[3] | wordr2[3]; + + u32x w3[4]; + + w3[0] = wordl3[0] | wordr3[0]; + w3[1] = wordl3[1] | wordr3[1]; + w3[2] = wordl3[2] | wordr3[2]; + w3[3] = wordl3[3] | wordr3[3]; + + /** + * pads + */ + + u32x w0_t[4]; + + w0_t[0] = swap_workaround (w0[0]); + w0_t[1] = swap_workaround (w0[1]); + w0_t[2] = swap_workaround (w0[2]); + w0_t[3] = swap_workaround (w0[3]); + + u32x w1_t[4]; + + w1_t[0] = swap_workaround (w1[0]); + w1_t[1] = swap_workaround (w1[1]); + w1_t[2] = swap_workaround (w1[2]); + w1_t[3] = swap_workaround (w1[3]); + + u32x w2_t[4]; + + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + + u32x w3_t[4]; + + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = 0; + + u32x ipad[8]; + u32x opad[8]; + + hmac_sha256_pad (w0_t, w1_t, w2_t, w3_t, ipad, opad); + + w0_t[0] = swap_workaround (salt_buf0[0]); + w0_t[1] = swap_workaround (salt_buf0[1]); + w0_t[2] = swap_workaround (salt_buf0[2]); + w0_t[3] = swap_workaround (salt_buf0[3]); + w1_t[0] = swap_workaround (salt_buf1[0]); + w1_t[1] = swap_workaround (salt_buf1[1]); + w1_t[2] = swap_workaround (salt_buf1[2]); + w1_t[3] = swap_workaround (salt_buf1[3]); + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = (64 + salt_len) * 8; + + u32x digest[8]; + + hmac_sha256_run (w0_t, w1_t, w2_t, w3_t, ipad, opad, digest); + + const u32x r0 = digest[3]; + const u32x r1 = digest[7]; + const u32x r2 = digest[2]; + const u32x r3 = digest[6]; + + #include VECT_COMPARE_S + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m01450_s08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m01450_s16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/amd/m01450_a3.cl b/amd/m01450_a3.cl new file mode 100644 index 0000000000..264778d078 --- /dev/null +++ b/amd/m01450_a3.cl @@ -0,0 +1,762 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _SHA256_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW4 +#define VECT_SIZE1 +#endif + +#ifdef VLIW5 +#define VECT_SIZE1 +#endif + +#define DGST_R0 3 +#define DGST_R1 7 +#define DGST_R2 2 +#define DGST_R3 6 + +#include "include/kernel_functions.c" +#include "types_amd.c" +#include "common_amd.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +__constant u32 k_sha256[64] = +{ + SHA256C00, SHA256C01, SHA256C02, SHA256C03, + SHA256C04, SHA256C05, SHA256C06, SHA256C07, + SHA256C08, SHA256C09, SHA256C0a, SHA256C0b, + SHA256C0c, SHA256C0d, SHA256C0e, SHA256C0f, + SHA256C10, SHA256C11, SHA256C12, SHA256C13, + SHA256C14, SHA256C15, SHA256C16, SHA256C17, + SHA256C18, SHA256C19, SHA256C1a, SHA256C1b, + SHA256C1c, SHA256C1d, SHA256C1e, SHA256C1f, + SHA256C20, SHA256C21, SHA256C22, SHA256C23, + SHA256C24, SHA256C25, SHA256C26, SHA256C27, + SHA256C28, SHA256C29, SHA256C2a, SHA256C2b, + SHA256C2c, SHA256C2d, SHA256C2e, SHA256C2f, + SHA256C30, SHA256C31, SHA256C32, SHA256C33, + SHA256C34, SHA256C35, SHA256C36, SHA256C37, + SHA256C38, SHA256C39, SHA256C3a, SHA256C3b, + SHA256C3c, SHA256C3d, SHA256C3e, SHA256C3f, +}; + +static void sha256_transform (const u32x w0[4], const u32x w1[4], const u32x w2[4], const u32x w3[4], u32x digest[8]) +{ + u32x a = digest[0]; + u32x b = digest[1]; + u32x c = digest[2]; + u32x d = digest[3]; + u32x e = digest[4]; + u32x f = digest[5]; + u32x g = digest[6]; + u32x h = digest[7]; + + u32x w0_t = w0[0]; + u32x w1_t = w0[1]; + u32x w2_t = w0[2]; + u32x w3_t = w0[3]; + u32x w4_t = w1[0]; + u32x w5_t = w1[1]; + u32x w6_t = w1[2]; + u32x w7_t = w1[3]; + u32x w8_t = w2[0]; + u32x w9_t = w2[1]; + u32x wa_t = w2[2]; + u32x wb_t = w2[3]; + u32x wc_t = w3[0]; + u32x wd_t = w3[1]; + u32x we_t = w3[2]; + u32x wf_t = w3[3]; + + #define ROUND_EXPAND() \ + { \ + w0_t = SHA256_EXPAND (we_t, w9_t, w1_t, w0_t); \ + w1_t = SHA256_EXPAND (wf_t, wa_t, w2_t, w1_t); \ + w2_t = SHA256_EXPAND (w0_t, wb_t, w3_t, w2_t); \ + w3_t = SHA256_EXPAND (w1_t, wc_t, w4_t, w3_t); \ + w4_t = SHA256_EXPAND (w2_t, wd_t, w5_t, w4_t); \ + w5_t = SHA256_EXPAND (w3_t, we_t, w6_t, w5_t); \ + w6_t = SHA256_EXPAND (w4_t, wf_t, w7_t, w6_t); \ + w7_t = SHA256_EXPAND (w5_t, w0_t, w8_t, w7_t); \ + w8_t = SHA256_EXPAND (w6_t, w1_t, w9_t, w8_t); \ + w9_t = SHA256_EXPAND (w7_t, w2_t, wa_t, w9_t); \ + wa_t = SHA256_EXPAND (w8_t, w3_t, wb_t, wa_t); \ + wb_t = SHA256_EXPAND (w9_t, w4_t, wc_t, wb_t); \ + wc_t = SHA256_EXPAND (wa_t, w5_t, wd_t, wc_t); \ + wd_t = SHA256_EXPAND (wb_t, w6_t, we_t, wd_t); \ + we_t = SHA256_EXPAND (wc_t, w7_t, wf_t, we_t); \ + wf_t = SHA256_EXPAND (wd_t, w8_t, w0_t, wf_t); \ + } + + #define ROUND_STEP(i) \ + { \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, k_sha256[i + 0]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, k_sha256[i + 1]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, k_sha256[i + 2]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, k_sha256[i + 3]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, k_sha256[i + 4]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, k_sha256[i + 5]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, k_sha256[i + 6]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, k_sha256[i + 7]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, k_sha256[i + 8]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, k_sha256[i + 9]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, k_sha256[i + 10]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, k_sha256[i + 11]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, k_sha256[i + 12]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, k_sha256[i + 13]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, k_sha256[i + 14]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, k_sha256[i + 15]); \ + } + + ROUND_STEP (0); + + #pragma unroll + for (int i = 16; i < 64; i += 16) + { + ROUND_EXPAND (); ROUND_STEP (i); + } + + digest[0] += a; + digest[1] += b; + digest[2] += c; + digest[3] += d; + digest[4] += e; + digest[5] += f; + digest[6] += g; + digest[7] += h; +} + +static void hmac_sha256_pad (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], u32x ipad[8], u32x opad[8]) +{ + w0[0] = w0[0] ^ 0x36363636; + w0[1] = w0[1] ^ 0x36363636; + w0[2] = w0[2] ^ 0x36363636; + w0[3] = w0[3] ^ 0x36363636; + w1[0] = w1[0] ^ 0x36363636; + w1[1] = w1[1] ^ 0x36363636; + w1[2] = w1[2] ^ 0x36363636; + w1[3] = w1[3] ^ 0x36363636; + w2[0] = w2[0] ^ 0x36363636; + w2[1] = w2[1] ^ 0x36363636; + w2[2] = w2[2] ^ 0x36363636; + w2[3] = w2[3] ^ 0x36363636; + w3[0] = w3[0] ^ 0x36363636; + w3[1] = w3[1] ^ 0x36363636; + w3[2] = w3[2] ^ 0x36363636; + w3[3] = w3[3] ^ 0x36363636; + + ipad[0] = SHA256M_A; + ipad[1] = SHA256M_B; + ipad[2] = SHA256M_C; + ipad[3] = SHA256M_D; + ipad[4] = SHA256M_E; + ipad[5] = SHA256M_F; + ipad[6] = SHA256M_G; + ipad[7] = SHA256M_H; + + sha256_transform (w0, w1, w2, w3, ipad); + + w0[0] = w0[0] ^ 0x6a6a6a6a; + w0[1] = w0[1] ^ 0x6a6a6a6a; + w0[2] = w0[2] ^ 0x6a6a6a6a; + w0[3] = w0[3] ^ 0x6a6a6a6a; + w1[0] = w1[0] ^ 0x6a6a6a6a; + w1[1] = w1[1] ^ 0x6a6a6a6a; + w1[2] = w1[2] ^ 0x6a6a6a6a; + w1[3] = w1[3] ^ 0x6a6a6a6a; + w2[0] = w2[0] ^ 0x6a6a6a6a; + w2[1] = w2[1] ^ 0x6a6a6a6a; + w2[2] = w2[2] ^ 0x6a6a6a6a; + w2[3] = w2[3] ^ 0x6a6a6a6a; + w3[0] = w3[0] ^ 0x6a6a6a6a; + w3[1] = w3[1] ^ 0x6a6a6a6a; + w3[2] = w3[2] ^ 0x6a6a6a6a; + w3[3] = w3[3] ^ 0x6a6a6a6a; + + opad[0] = SHA256M_A; + opad[1] = SHA256M_B; + opad[2] = SHA256M_C; + opad[3] = SHA256M_D; + opad[4] = SHA256M_E; + opad[5] = SHA256M_F; + opad[6] = SHA256M_G; + opad[7] = SHA256M_H; + + sha256_transform (w0, w1, w2, w3, opad); +} + +static void hmac_sha256_run (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], u32x ipad[8], u32x opad[8], u32x digest[8]) +{ + digest[0] = ipad[0]; + digest[1] = ipad[1]; + digest[2] = ipad[2]; + digest[3] = ipad[3]; + digest[4] = ipad[4]; + digest[5] = ipad[5]; + digest[6] = ipad[6]; + digest[7] = ipad[7]; + + sha256_transform (w0, w1, w2, w3, digest); + + w0[0] = digest[0]; + w0[1] = digest[1]; + w0[2] = digest[2]; + w0[3] = digest[3]; + w1[0] = digest[4]; + w1[1] = digest[5]; + w1[2] = digest[6]; + w1[3] = digest[7]; + w2[0] = 0x80000000; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = (64 + 32) * 8; + + digest[0] = opad[0]; + digest[1] = opad[1]; + digest[2] = opad[2]; + digest[3] = opad[3]; + digest[4] = opad[4]; + digest[5] = opad[5]; + digest[6] = opad[6]; + digest[7] = opad[7]; + + sha256_transform (w0, w1, w2, w3, digest); +} + +static void m01450m (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], const u32 pw_len, __global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset) +{ + /** + * modifier + */ + + const u32 gid = get_global_id (0); + const u32 lid = get_local_id (0); + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[ 1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[ 2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[ 3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[ 4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[ 5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[ 6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[ 7]; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + /** + * loop + */ + + u32x w0l = w0[0]; + + for (u32 il_pos = 0; il_pos < bfs_cnt; il_pos++) + { + const u32 w0r = bfs_buf[il_pos].i; + + w0[0] = w0l | w0r; + + /** + * pads + */ + + u32x w0_t[4]; + + w0_t[0] = w0[0]; + w0_t[1] = w0[1]; + w0_t[2] = w0[2]; + w0_t[3] = w0[3]; + + u32x w1_t[4]; + + w1_t[0] = w1[0]; + w1_t[1] = w1[1]; + w1_t[2] = w1[2]; + w1_t[3] = w1[3]; + + u32x w2_t[4]; + + w2_t[0] = w2[0]; + w2_t[1] = w2[1]; + w2_t[2] = w2[2]; + w2_t[3] = w2[3]; + + u32x w3_t[4]; + + w3_t[0] = w3[0]; + w3_t[1] = w3[1]; + w3_t[2] = 0; + w3_t[3] = 0; + + u32x ipad[8]; + u32x opad[8]; + + hmac_sha256_pad (w0_t, w1_t, w2_t, w3_t, ipad, opad); + + w0_t[0] = swap_workaround (salt_buf0[0]); + w0_t[1] = swap_workaround (salt_buf0[1]); + w0_t[2] = swap_workaround (salt_buf0[2]); + w0_t[3] = swap_workaround (salt_buf0[3]); + w1_t[0] = swap_workaround (salt_buf1[0]); + w1_t[1] = swap_workaround (salt_buf1[1]); + w1_t[2] = swap_workaround (salt_buf1[2]); + w1_t[3] = swap_workaround (salt_buf1[3]); + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = (64 + salt_len) * 8; + + u32x digest[8]; + + hmac_sha256_run (w0_t, w1_t, w2_t, w3_t, ipad, opad, digest); + + const u32x r0 = digest[3]; + const u32x r1 = digest[7]; + const u32x r2 = digest[2]; + const u32x r3 = digest[6]; + + #include VECT_COMPARE_M + } +} + +static void m01450s (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], const u32 pw_len, __global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset) +{ + /** + * modifier + */ + + const u32 gid = get_global_id (0); + const u32 lid = get_local_id (0); + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[ 1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[ 2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[ 3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[ 4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[ 5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[ 6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[ 7]; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * loop + */ + + u32x w0l = w0[0]; + + for (u32 il_pos = 0; il_pos < bfs_cnt; il_pos++) + { + const u32 w0r = bfs_buf[il_pos].i; + + w0[0] = w0l | w0r; + + /** + * pads + */ + + u32x w0_t[4]; + + w0_t[0] = w0[0]; + w0_t[1] = w0[1]; + w0_t[2] = w0[2]; + w0_t[3] = w0[3]; + + u32x w1_t[4]; + + w1_t[0] = w1[0]; + w1_t[1] = w1[1]; + w1_t[2] = w1[2]; + w1_t[3] = w1[3]; + + u32x w2_t[4]; + + w2_t[0] = w2[0]; + w2_t[1] = w2[1]; + w2_t[2] = w2[2]; + w2_t[3] = w2[3]; + + u32x w3_t[4]; + + w3_t[0] = w3[0]; + w3_t[1] = w3[1]; + w3_t[2] = 0; + w3_t[3] = 0; + + u32x ipad[8]; + u32x opad[8]; + + hmac_sha256_pad (w0_t, w1_t, w2_t, w3_t, ipad, opad); + + w0_t[0] = swap_workaround (salt_buf0[0]); + w0_t[1] = swap_workaround (salt_buf0[1]); + w0_t[2] = swap_workaround (salt_buf0[2]); + w0_t[3] = swap_workaround (salt_buf0[3]); + w1_t[0] = swap_workaround (salt_buf1[0]); + w1_t[1] = swap_workaround (salt_buf1[1]); + w1_t[2] = swap_workaround (salt_buf1[2]); + w1_t[3] = swap_workaround (salt_buf1[3]); + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = (64 + salt_len) * 8; + + u32x digest[8]; + + hmac_sha256_run (w0_t, w1_t, w2_t, w3_t, ipad, opad, digest); + + const u32x r0 = digest[3]; + const u32x r1 = digest[7]; + const u32x r2 = digest[2]; + const u32x r3 = digest[6]; + + #include VECT_COMPARE_S + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m01450_m04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m01450m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m01450_m08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m01450m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m01450_m16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = pws[gid].i[ 8]; + w2[1] = pws[gid].i[ 9]; + w2[2] = pws[gid].i[10]; + w2[3] = pws[gid].i[11]; + + u32x w3[4]; + + w3[0] = pws[gid].i[12]; + w3[1] = pws[gid].i[13]; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m01450m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m01450_s04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m01450s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m01450_s08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m01450s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m01450_s16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = pws[gid].i[ 8]; + w2[1] = pws[gid].i[ 9]; + w2[2] = pws[gid].i[10]; + w2[3] = pws[gid].i[11]; + + u32x w3[4]; + + w3[0] = pws[gid].i[12]; + w3[1] = pws[gid].i[13]; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m01450s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} diff --git a/amd/m01460_a0.cl b/amd/m01460_a0.cl new file mode 100644 index 0000000000..a41e1d398c --- /dev/null +++ b/amd/m01460_a0.cl @@ -0,0 +1,592 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _SHA256_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW4 +#define VECT_SIZE2 +#endif + +#ifdef VLIW5 +#define VECT_SIZE2 +#endif + +#define DGST_R0 3 +#define DGST_R1 7 +#define DGST_R2 2 +#define DGST_R3 6 + +#include "include/kernel_functions.c" +#include "types_amd.c" +#include "common_amd.c" +#include "include/rp_gpu.h" +#include "rp_amd.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +__constant u32 k_sha256[64] = +{ + SHA256C00, SHA256C01, SHA256C02, SHA256C03, + SHA256C04, SHA256C05, SHA256C06, SHA256C07, + SHA256C08, SHA256C09, SHA256C0a, SHA256C0b, + SHA256C0c, SHA256C0d, SHA256C0e, SHA256C0f, + SHA256C10, SHA256C11, SHA256C12, SHA256C13, + SHA256C14, SHA256C15, SHA256C16, SHA256C17, + SHA256C18, SHA256C19, SHA256C1a, SHA256C1b, + SHA256C1c, SHA256C1d, SHA256C1e, SHA256C1f, + SHA256C20, SHA256C21, SHA256C22, SHA256C23, + SHA256C24, SHA256C25, SHA256C26, SHA256C27, + SHA256C28, SHA256C29, SHA256C2a, SHA256C2b, + SHA256C2c, SHA256C2d, SHA256C2e, SHA256C2f, + SHA256C30, SHA256C31, SHA256C32, SHA256C33, + SHA256C34, SHA256C35, SHA256C36, SHA256C37, + SHA256C38, SHA256C39, SHA256C3a, SHA256C3b, + SHA256C3c, SHA256C3d, SHA256C3e, SHA256C3f, +}; + +static void sha256_transform (const u32x w0[4], const u32x w1[4], const u32x w2[4], const u32x w3[4], u32x digest[8]) +{ + u32x a = digest[0]; + u32x b = digest[1]; + u32x c = digest[2]; + u32x d = digest[3]; + u32x e = digest[4]; + u32x f = digest[5]; + u32x g = digest[6]; + u32x h = digest[7]; + + u32x w0_t = w0[0]; + u32x w1_t = w0[1]; + u32x w2_t = w0[2]; + u32x w3_t = w0[3]; + u32x w4_t = w1[0]; + u32x w5_t = w1[1]; + u32x w6_t = w1[2]; + u32x w7_t = w1[3]; + u32x w8_t = w2[0]; + u32x w9_t = w2[1]; + u32x wa_t = w2[2]; + u32x wb_t = w2[3]; + u32x wc_t = w3[0]; + u32x wd_t = w3[1]; + u32x we_t = w3[2]; + u32x wf_t = w3[3]; + + #define ROUND_EXPAND() \ + { \ + w0_t = SHA256_EXPAND (we_t, w9_t, w1_t, w0_t); \ + w1_t = SHA256_EXPAND (wf_t, wa_t, w2_t, w1_t); \ + w2_t = SHA256_EXPAND (w0_t, wb_t, w3_t, w2_t); \ + w3_t = SHA256_EXPAND (w1_t, wc_t, w4_t, w3_t); \ + w4_t = SHA256_EXPAND (w2_t, wd_t, w5_t, w4_t); \ + w5_t = SHA256_EXPAND (w3_t, we_t, w6_t, w5_t); \ + w6_t = SHA256_EXPAND (w4_t, wf_t, w7_t, w6_t); \ + w7_t = SHA256_EXPAND (w5_t, w0_t, w8_t, w7_t); \ + w8_t = SHA256_EXPAND (w6_t, w1_t, w9_t, w8_t); \ + w9_t = SHA256_EXPAND (w7_t, w2_t, wa_t, w9_t); \ + wa_t = SHA256_EXPAND (w8_t, w3_t, wb_t, wa_t); \ + wb_t = SHA256_EXPAND (w9_t, w4_t, wc_t, wb_t); \ + wc_t = SHA256_EXPAND (wa_t, w5_t, wd_t, wc_t); \ + wd_t = SHA256_EXPAND (wb_t, w6_t, we_t, wd_t); \ + we_t = SHA256_EXPAND (wc_t, w7_t, wf_t, we_t); \ + wf_t = SHA256_EXPAND (wd_t, w8_t, w0_t, wf_t); \ + } + + #define ROUND_STEP(i) \ + { \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, k_sha256[i + 0]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, k_sha256[i + 1]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, k_sha256[i + 2]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, k_sha256[i + 3]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, k_sha256[i + 4]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, k_sha256[i + 5]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, k_sha256[i + 6]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, k_sha256[i + 7]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, k_sha256[i + 8]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, k_sha256[i + 9]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, k_sha256[i + 10]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, k_sha256[i + 11]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, k_sha256[i + 12]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, k_sha256[i + 13]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, k_sha256[i + 14]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, k_sha256[i + 15]); \ + } + + ROUND_STEP (0); + + #pragma unroll + for (int i = 16; i < 64; i += 16) + { + ROUND_EXPAND (); ROUND_STEP (i); + } + + digest[0] += a; + digest[1] += b; + digest[2] += c; + digest[3] += d; + digest[4] += e; + digest[5] += f; + digest[6] += g; + digest[7] += h; +} + +static void hmac_sha256_pad (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], u32x ipad[8], u32x opad[8]) +{ + w0[0] = w0[0] ^ 0x36363636; + w0[1] = w0[1] ^ 0x36363636; + w0[2] = w0[2] ^ 0x36363636; + w0[3] = w0[3] ^ 0x36363636; + w1[0] = w1[0] ^ 0x36363636; + w1[1] = w1[1] ^ 0x36363636; + w1[2] = w1[2] ^ 0x36363636; + w1[3] = w1[3] ^ 0x36363636; + w2[0] = w2[0] ^ 0x36363636; + w2[1] = w2[1] ^ 0x36363636; + w2[2] = w2[2] ^ 0x36363636; + w2[3] = w2[3] ^ 0x36363636; + w3[0] = w3[0] ^ 0x36363636; + w3[1] = w3[1] ^ 0x36363636; + w3[2] = w3[2] ^ 0x36363636; + w3[3] = w3[3] ^ 0x36363636; + + ipad[0] = SHA256M_A; + ipad[1] = SHA256M_B; + ipad[2] = SHA256M_C; + ipad[3] = SHA256M_D; + ipad[4] = SHA256M_E; + ipad[5] = SHA256M_F; + ipad[6] = SHA256M_G; + ipad[7] = SHA256M_H; + + sha256_transform (w0, w1, w2, w3, ipad); + + w0[0] = w0[0] ^ 0x6a6a6a6a; + w0[1] = w0[1] ^ 0x6a6a6a6a; + w0[2] = w0[2] ^ 0x6a6a6a6a; + w0[3] = w0[3] ^ 0x6a6a6a6a; + w1[0] = w1[0] ^ 0x6a6a6a6a; + w1[1] = w1[1] ^ 0x6a6a6a6a; + w1[2] = w1[2] ^ 0x6a6a6a6a; + w1[3] = w1[3] ^ 0x6a6a6a6a; + w2[0] = w2[0] ^ 0x6a6a6a6a; + w2[1] = w2[1] ^ 0x6a6a6a6a; + w2[2] = w2[2] ^ 0x6a6a6a6a; + w2[3] = w2[3] ^ 0x6a6a6a6a; + w3[0] = w3[0] ^ 0x6a6a6a6a; + w3[1] = w3[1] ^ 0x6a6a6a6a; + w3[2] = w3[2] ^ 0x6a6a6a6a; + w3[3] = w3[3] ^ 0x6a6a6a6a; + + opad[0] = SHA256M_A; + opad[1] = SHA256M_B; + opad[2] = SHA256M_C; + opad[3] = SHA256M_D; + opad[4] = SHA256M_E; + opad[5] = SHA256M_F; + opad[6] = SHA256M_G; + opad[7] = SHA256M_H; + + sha256_transform (w0, w1, w2, w3, opad); +} + +static void hmac_sha256_run (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], u32x ipad[8], u32x opad[8], u32x digest[8]) +{ + digest[0] = ipad[0]; + digest[1] = ipad[1]; + digest[2] = ipad[2]; + digest[3] = ipad[3]; + digest[4] = ipad[4]; + digest[5] = ipad[5]; + digest[6] = ipad[6]; + digest[7] = ipad[7]; + + sha256_transform (w0, w1, w2, w3, digest); + + w0[0] = digest[0]; + w0[1] = digest[1]; + w0[2] = digest[2]; + w0[3] = digest[3]; + w1[0] = digest[4]; + w1[1] = digest[5]; + w1[2] = digest[6]; + w1[3] = digest[7]; + w2[0] = 0x80000000; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = (64 + 32) * 8; + + digest[0] = opad[0]; + digest[1] = opad[1]; + digest[2] = opad[2]; + digest[3] = opad[3]; + digest[4] = opad[4]; + digest[5] = opad[5]; + digest[6] = opad[6]; + digest[7] = opad[7]; + + sha256_transform (w0, w1, w2, w3, digest); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m01460_m04 (__global pw_t *pws, __global gpu_rule_t * rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + u32x pw_buf1[4]; + + pw_buf1[0] = pws[gid].i[ 4]; + pw_buf1[1] = pws[gid].i[ 5]; + pw_buf1[2] = pws[gid].i[ 6]; + pw_buf1[3] = pws[gid].i[ 7]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[ 1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[ 2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[ 3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[ 4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[ 5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[ 6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[ 7]; + + /** + * pads + */ + + u32x w0_t[4]; + + w0_t[0] = swap_workaround (salt_buf0[0]); + w0_t[1] = swap_workaround (salt_buf0[1]); + w0_t[2] = swap_workaround (salt_buf0[2]); + w0_t[3] = swap_workaround (salt_buf0[3]); + + u32x w1_t[4]; + + w1_t[0] = swap_workaround (salt_buf1[0]); + w1_t[1] = swap_workaround (salt_buf1[1]); + w1_t[2] = swap_workaround (salt_buf1[2]); + w1_t[3] = swap_workaround (salt_buf1[3]); + + u32x w2_t[4]; + + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + + u32x w3_t[4]; + + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = 0; + + u32x ipad[8]; + u32x opad[8]; + + hmac_sha256_pad (w0_t, w1_t, w2_t, w3_t, ipad, opad); + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + + w0[0] = pw_buf0[0]; + w0[1] = pw_buf0[1]; + w0[2] = pw_buf0[2]; + w0[3] = pw_buf0[3]; + + u32x w1[4]; + + w1[0] = pw_buf1[0]; + w1[1] = pw_buf1[1]; + w1[2] = pw_buf1[2]; + w1[3] = pw_buf1[3]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 out_len = apply_rules (rules_buf[il_pos].cmds, w0, w1, pw_len); + + append_0x80_2 (w0, w1, out_len); + + w0_t[0] = swap_workaround (w0[0]); + w0_t[1] = swap_workaround (w0[1]); + w0_t[2] = swap_workaround (w0[2]); + w0_t[3] = swap_workaround (w0[3]); + w1_t[0] = swap_workaround (w1[0]); + w1_t[1] = swap_workaround (w1[1]); + w1_t[2] = swap_workaround (w1[2]); + w1_t[3] = swap_workaround (w1[3]); + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = (64 + out_len) * 8; + + u32x digest[8]; + + hmac_sha256_run (w0_t, w1_t, w2_t, w3_t, ipad, opad, digest); + + const u32x r0 = digest[3]; + const u32x r1 = digest[7]; + const u32x r2 = digest[2]; + const u32x r3 = digest[6]; + + #include VECT_COMPARE_M + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m01460_m08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m01460_m16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m01460_s04 (__global pw_t *pws, __global gpu_rule_t * rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + u32x pw_buf1[4]; + + pw_buf1[0] = pws[gid].i[ 4]; + pw_buf1[1] = pws[gid].i[ 5]; + pw_buf1[2] = pws[gid].i[ 6]; + pw_buf1[3] = pws[gid].i[ 7]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[ 1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[ 2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[ 3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[ 4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[ 5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[ 6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[ 7]; + + /** + * pads + */ + + u32x w0_t[4]; + + w0_t[0] = swap_workaround (salt_buf0[0]); + w0_t[1] = swap_workaround (salt_buf0[1]); + w0_t[2] = swap_workaround (salt_buf0[2]); + w0_t[3] = swap_workaround (salt_buf0[3]); + + u32x w1_t[4]; + + w1_t[0] = swap_workaround (salt_buf1[0]); + w1_t[1] = swap_workaround (salt_buf1[1]); + w1_t[2] = swap_workaround (salt_buf1[2]); + w1_t[3] = swap_workaround (salt_buf1[3]); + + u32x w2_t[4]; + + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + + u32x w3_t[4]; + + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = 0; + + u32x ipad[8]; + u32x opad[8]; + + hmac_sha256_pad (w0_t, w1_t, w2_t, w3_t, ipad, opad); + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + + w0[0] = pw_buf0[0]; + w0[1] = pw_buf0[1]; + w0[2] = pw_buf0[2]; + w0[3] = pw_buf0[3]; + + u32x w1[4]; + + w1[0] = pw_buf1[0]; + w1[1] = pw_buf1[1]; + w1[2] = pw_buf1[2]; + w1[3] = pw_buf1[3]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 out_len = apply_rules (rules_buf[il_pos].cmds, w0, w1, pw_len); + + append_0x80_2 (w0, w1, out_len); + + w0_t[0] = swap_workaround (w0[0]); + w0_t[1] = swap_workaround (w0[1]); + w0_t[2] = swap_workaround (w0[2]); + w0_t[3] = swap_workaround (w0[3]); + w1_t[0] = swap_workaround (w1[0]); + w1_t[1] = swap_workaround (w1[1]); + w1_t[2] = swap_workaround (w1[2]); + w1_t[3] = swap_workaround (w1[3]); + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = (64 + out_len) * 8; + + u32x digest[8]; + + hmac_sha256_run (w0_t, w1_t, w2_t, w3_t, ipad, opad, digest); + + const u32x r0 = digest[3]; + const u32x r1 = digest[7]; + const u32x r2 = digest[2]; + const u32x r3 = digest[6]; + + #include VECT_COMPARE_S + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m01460_s08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m01460_s16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/amd/m01460_a1.cl b/amd/m01460_a1.cl new file mode 100644 index 0000000000..3306e48d5f --- /dev/null +++ b/amd/m01460_a1.cl @@ -0,0 +1,698 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _SHA256_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW4 +#define VECT_SIZE2 +#endif + +#ifdef VLIW5 +#define VECT_SIZE2 +#endif + +#define DGST_R0 3 +#define DGST_R1 7 +#define DGST_R2 2 +#define DGST_R3 6 + +#include "include/kernel_functions.c" +#include "types_amd.c" +#include "common_amd.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +__constant u32 k_sha256[64] = +{ + SHA256C00, SHA256C01, SHA256C02, SHA256C03, + SHA256C04, SHA256C05, SHA256C06, SHA256C07, + SHA256C08, SHA256C09, SHA256C0a, SHA256C0b, + SHA256C0c, SHA256C0d, SHA256C0e, SHA256C0f, + SHA256C10, SHA256C11, SHA256C12, SHA256C13, + SHA256C14, SHA256C15, SHA256C16, SHA256C17, + SHA256C18, SHA256C19, SHA256C1a, SHA256C1b, + SHA256C1c, SHA256C1d, SHA256C1e, SHA256C1f, + SHA256C20, SHA256C21, SHA256C22, SHA256C23, + SHA256C24, SHA256C25, SHA256C26, SHA256C27, + SHA256C28, SHA256C29, SHA256C2a, SHA256C2b, + SHA256C2c, SHA256C2d, SHA256C2e, SHA256C2f, + SHA256C30, SHA256C31, SHA256C32, SHA256C33, + SHA256C34, SHA256C35, SHA256C36, SHA256C37, + SHA256C38, SHA256C39, SHA256C3a, SHA256C3b, + SHA256C3c, SHA256C3d, SHA256C3e, SHA256C3f, +}; + +static void sha256_transform (const u32x w0[4], const u32x w1[4], const u32x w2[4], const u32x w3[4], u32x digest[8]) +{ + u32x a = digest[0]; + u32x b = digest[1]; + u32x c = digest[2]; + u32x d = digest[3]; + u32x e = digest[4]; + u32x f = digest[5]; + u32x g = digest[6]; + u32x h = digest[7]; + + u32x w0_t = w0[0]; + u32x w1_t = w0[1]; + u32x w2_t = w0[2]; + u32x w3_t = w0[3]; + u32x w4_t = w1[0]; + u32x w5_t = w1[1]; + u32x w6_t = w1[2]; + u32x w7_t = w1[3]; + u32x w8_t = w2[0]; + u32x w9_t = w2[1]; + u32x wa_t = w2[2]; + u32x wb_t = w2[3]; + u32x wc_t = w3[0]; + u32x wd_t = w3[1]; + u32x we_t = w3[2]; + u32x wf_t = w3[3]; + + #define ROUND_EXPAND() \ + { \ + w0_t = SHA256_EXPAND (we_t, w9_t, w1_t, w0_t); \ + w1_t = SHA256_EXPAND (wf_t, wa_t, w2_t, w1_t); \ + w2_t = SHA256_EXPAND (w0_t, wb_t, w3_t, w2_t); \ + w3_t = SHA256_EXPAND (w1_t, wc_t, w4_t, w3_t); \ + w4_t = SHA256_EXPAND (w2_t, wd_t, w5_t, w4_t); \ + w5_t = SHA256_EXPAND (w3_t, we_t, w6_t, w5_t); \ + w6_t = SHA256_EXPAND (w4_t, wf_t, w7_t, w6_t); \ + w7_t = SHA256_EXPAND (w5_t, w0_t, w8_t, w7_t); \ + w8_t = SHA256_EXPAND (w6_t, w1_t, w9_t, w8_t); \ + w9_t = SHA256_EXPAND (w7_t, w2_t, wa_t, w9_t); \ + wa_t = SHA256_EXPAND (w8_t, w3_t, wb_t, wa_t); \ + wb_t = SHA256_EXPAND (w9_t, w4_t, wc_t, wb_t); \ + wc_t = SHA256_EXPAND (wa_t, w5_t, wd_t, wc_t); \ + wd_t = SHA256_EXPAND (wb_t, w6_t, we_t, wd_t); \ + we_t = SHA256_EXPAND (wc_t, w7_t, wf_t, we_t); \ + wf_t = SHA256_EXPAND (wd_t, w8_t, w0_t, wf_t); \ + } + + #define ROUND_STEP(i) \ + { \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, k_sha256[i + 0]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, k_sha256[i + 1]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, k_sha256[i + 2]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, k_sha256[i + 3]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, k_sha256[i + 4]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, k_sha256[i + 5]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, k_sha256[i + 6]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, k_sha256[i + 7]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, k_sha256[i + 8]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, k_sha256[i + 9]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, k_sha256[i + 10]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, k_sha256[i + 11]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, k_sha256[i + 12]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, k_sha256[i + 13]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, k_sha256[i + 14]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, k_sha256[i + 15]); \ + } + + ROUND_STEP (0); + + #pragma unroll + for (int i = 16; i < 64; i += 16) + { + ROUND_EXPAND (); ROUND_STEP (i); + } + + digest[0] += a; + digest[1] += b; + digest[2] += c; + digest[3] += d; + digest[4] += e; + digest[5] += f; + digest[6] += g; + digest[7] += h; +} + +static void hmac_sha256_pad (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], u32x ipad[8], u32x opad[8]) +{ + w0[0] = w0[0] ^ 0x36363636; + w0[1] = w0[1] ^ 0x36363636; + w0[2] = w0[2] ^ 0x36363636; + w0[3] = w0[3] ^ 0x36363636; + w1[0] = w1[0] ^ 0x36363636; + w1[1] = w1[1] ^ 0x36363636; + w1[2] = w1[2] ^ 0x36363636; + w1[3] = w1[3] ^ 0x36363636; + w2[0] = w2[0] ^ 0x36363636; + w2[1] = w2[1] ^ 0x36363636; + w2[2] = w2[2] ^ 0x36363636; + w2[3] = w2[3] ^ 0x36363636; + w3[0] = w3[0] ^ 0x36363636; + w3[1] = w3[1] ^ 0x36363636; + w3[2] = w3[2] ^ 0x36363636; + w3[3] = w3[3] ^ 0x36363636; + + ipad[0] = SHA256M_A; + ipad[1] = SHA256M_B; + ipad[2] = SHA256M_C; + ipad[3] = SHA256M_D; + ipad[4] = SHA256M_E; + ipad[5] = SHA256M_F; + ipad[6] = SHA256M_G; + ipad[7] = SHA256M_H; + + sha256_transform (w0, w1, w2, w3, ipad); + + w0[0] = w0[0] ^ 0x6a6a6a6a; + w0[1] = w0[1] ^ 0x6a6a6a6a; + w0[2] = w0[2] ^ 0x6a6a6a6a; + w0[3] = w0[3] ^ 0x6a6a6a6a; + w1[0] = w1[0] ^ 0x6a6a6a6a; + w1[1] = w1[1] ^ 0x6a6a6a6a; + w1[2] = w1[2] ^ 0x6a6a6a6a; + w1[3] = w1[3] ^ 0x6a6a6a6a; + w2[0] = w2[0] ^ 0x6a6a6a6a; + w2[1] = w2[1] ^ 0x6a6a6a6a; + w2[2] = w2[2] ^ 0x6a6a6a6a; + w2[3] = w2[3] ^ 0x6a6a6a6a; + w3[0] = w3[0] ^ 0x6a6a6a6a; + w3[1] = w3[1] ^ 0x6a6a6a6a; + w3[2] = w3[2] ^ 0x6a6a6a6a; + w3[3] = w3[3] ^ 0x6a6a6a6a; + + opad[0] = SHA256M_A; + opad[1] = SHA256M_B; + opad[2] = SHA256M_C; + opad[3] = SHA256M_D; + opad[4] = SHA256M_E; + opad[5] = SHA256M_F; + opad[6] = SHA256M_G; + opad[7] = SHA256M_H; + + sha256_transform (w0, w1, w2, w3, opad); +} + +static void hmac_sha256_run (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], u32x ipad[8], u32x opad[8], u32x digest[8]) +{ + digest[0] = ipad[0]; + digest[1] = ipad[1]; + digest[2] = ipad[2]; + digest[3] = ipad[3]; + digest[4] = ipad[4]; + digest[5] = ipad[5]; + digest[6] = ipad[6]; + digest[7] = ipad[7]; + + sha256_transform (w0, w1, w2, w3, digest); + + w0[0] = digest[0]; + w0[1] = digest[1]; + w0[2] = digest[2]; + w0[3] = digest[3]; + w1[0] = digest[4]; + w1[1] = digest[5]; + w1[2] = digest[6]; + w1[3] = digest[7]; + w2[0] = 0x80000000; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = (64 + 32) * 8; + + digest[0] = opad[0]; + digest[1] = opad[1]; + digest[2] = opad[2]; + digest[3] = opad[3]; + digest[4] = opad[4]; + digest[5] = opad[5]; + digest[6] = opad[6]; + digest[7] = opad[7]; + + sha256_transform (w0, w1, w2, w3, digest); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m01460_m04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, combs_buf[0].pw_len); + } + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[ 1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[ 2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[ 3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[ 4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[ 5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[ 6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[ 7]; + + /** + * pads + */ + + u32x w0_t[4]; + + w0_t[0] = swap_workaround (salt_buf0[0]); + w0_t[1] = swap_workaround (salt_buf0[1]); + w0_t[2] = swap_workaround (salt_buf0[2]); + w0_t[3] = swap_workaround (salt_buf0[3]); + + u32x w1_t[4]; + + w1_t[0] = swap_workaround (salt_buf1[0]); + w1_t[1] = swap_workaround (salt_buf1[1]); + w1_t[2] = swap_workaround (salt_buf1[2]); + w1_t[3] = swap_workaround (salt_buf1[3]); + + u32x w2_t[4]; + + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + + u32x w3_t[4]; + + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = 0; + + u32x ipad[8]; + u32x opad[8]; + + hmac_sha256_pad (w0_t, w1_t, w2_t, w3_t, ipad, opad); + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = combs_buf[il_pos].pw_len; + + const u32 pw_len = pw_l_len + pw_r_len; + + u32 wordr0[4]; + + wordr0[0] = combs_buf[il_pos].i[0]; + wordr0[1] = combs_buf[il_pos].i[1]; + wordr0[2] = combs_buf[il_pos].i[2]; + wordr0[3] = combs_buf[il_pos].i[3]; + + u32 wordr1[4]; + + wordr1[0] = combs_buf[il_pos].i[4]; + wordr1[1] = combs_buf[il_pos].i[5]; + wordr1[2] = combs_buf[il_pos].i[6]; + wordr1[3] = combs_buf[il_pos].i[7]; + + u32 wordr2[4]; + + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + + u32 wordr3[4]; + + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + u32x w0[4]; + + w0[0] = wordl0[0] | wordr0[0]; + w0[1] = wordl0[1] | wordr0[1]; + w0[2] = wordl0[2] | wordr0[2]; + w0[3] = wordl0[3] | wordr0[3]; + + u32x w1[4]; + + w1[0] = wordl1[0] | wordr1[0]; + w1[1] = wordl1[1] | wordr1[1]; + w1[2] = wordl1[2] | wordr1[2]; + w1[3] = wordl1[3] | wordr1[3]; + + u32x w2[4]; + + w2[0] = wordl2[0] | wordr2[0]; + w2[1] = wordl2[1] | wordr2[1]; + w2[2] = wordl2[2] | wordr2[2]; + w2[3] = wordl2[3] | wordr2[3]; + + u32x w3[4]; + + w3[0] = wordl3[0] | wordr3[0]; + w3[1] = wordl3[1] | wordr3[1]; + w3[2] = 0; + w3[3] = 0; + + append_0x80_4 (w0, w1, w2, w3, pw_len); + + w0_t[0] = swap_workaround (w0[0]); + w0_t[1] = swap_workaround (w0[1]); + w0_t[2] = swap_workaround (w0[2]); + w0_t[3] = swap_workaround (w0[3]); + w1_t[0] = swap_workaround (w1[0]); + w1_t[1] = swap_workaround (w1[1]); + w1_t[2] = swap_workaround (w1[2]); + w1_t[3] = swap_workaround (w1[3]); + w2_t[0] = swap_workaround (w2[0]); + w2_t[1] = swap_workaround (w2[1]); + w2_t[2] = swap_workaround (w2[2]); + w2_t[3] = swap_workaround (w2[3]); + w3_t[0] = swap_workaround (w3[0]); + w3_t[1] = swap_workaround (w3[1]); + w3_t[2] = 0; + w3_t[3] = (64 + pw_len) * 8; + + u32x digest[8]; + + hmac_sha256_run (w0_t, w1_t, w2_t, w3_t, ipad, opad, digest); + + const u32x r0 = digest[3]; + const u32x r1 = digest[7]; + const u32x r2 = digest[2]; + const u32x r3 = digest[6]; + + #include VECT_COMPARE_M + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m01460_m08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m01460_m16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m01460_s04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, combs_buf[0].pw_len); + } + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[ 1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[ 2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[ 3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[ 4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[ 5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[ 6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[ 7]; + + /** + * pads + */ + + u32x w0_t[4]; + + w0_t[0] = swap_workaround (salt_buf0[0]); + w0_t[1] = swap_workaround (salt_buf0[1]); + w0_t[2] = swap_workaround (salt_buf0[2]); + w0_t[3] = swap_workaround (salt_buf0[3]); + + u32x w1_t[4]; + + w1_t[0] = swap_workaround (salt_buf1[0]); + w1_t[1] = swap_workaround (salt_buf1[1]); + w1_t[2] = swap_workaround (salt_buf1[2]); + w1_t[3] = swap_workaround (salt_buf1[3]); + + u32x w2_t[4]; + + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + + u32x w3_t[4]; + + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = 0; + + u32x ipad[8]; + u32x opad[8]; + + hmac_sha256_pad (w0_t, w1_t, w2_t, w3_t, ipad, opad); + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = combs_buf[il_pos].pw_len; + + const u32 pw_len = pw_l_len + pw_r_len; + + u32 wordr0[4]; + + wordr0[0] = combs_buf[il_pos].i[0]; + wordr0[1] = combs_buf[il_pos].i[1]; + wordr0[2] = combs_buf[il_pos].i[2]; + wordr0[3] = combs_buf[il_pos].i[3]; + + u32 wordr1[4]; + + wordr1[0] = combs_buf[il_pos].i[4]; + wordr1[1] = combs_buf[il_pos].i[5]; + wordr1[2] = combs_buf[il_pos].i[6]; + wordr1[3] = combs_buf[il_pos].i[7]; + + u32 wordr2[4]; + + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + + u32 wordr3[4]; + + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + u32x w0[4]; + + w0[0] = wordl0[0] | wordr0[0]; + w0[1] = wordl0[1] | wordr0[1]; + w0[2] = wordl0[2] | wordr0[2]; + w0[3] = wordl0[3] | wordr0[3]; + + u32x w1[4]; + + w1[0] = wordl1[0] | wordr1[0]; + w1[1] = wordl1[1] | wordr1[1]; + w1[2] = wordl1[2] | wordr1[2]; + w1[3] = wordl1[3] | wordr1[3]; + + u32x w2[4]; + + w2[0] = wordl2[0] | wordr2[0]; + w2[1] = wordl2[1] | wordr2[1]; + w2[2] = wordl2[2] | wordr2[2]; + w2[3] = wordl2[3] | wordr2[3]; + + u32x w3[4]; + + w3[0] = wordl3[0] | wordr3[0]; + w3[1] = wordl3[1] | wordr3[1]; + w3[2] = 0; + w3[3] = 0; + + append_0x80_4 (w0, w1, w2, w3, pw_len); + + w0_t[0] = swap_workaround (w0[0]); + w0_t[1] = swap_workaround (w0[1]); + w0_t[2] = swap_workaround (w0[2]); + w0_t[3] = swap_workaround (w0[3]); + w1_t[0] = swap_workaround (w1[0]); + w1_t[1] = swap_workaround (w1[1]); + w1_t[2] = swap_workaround (w1[2]); + w1_t[3] = swap_workaround (w1[3]); + w2_t[0] = swap_workaround (w2[0]); + w2_t[1] = swap_workaround (w2[1]); + w2_t[2] = swap_workaround (w2[2]); + w2_t[3] = swap_workaround (w2[3]); + w3_t[0] = swap_workaround (w3[0]); + w3_t[1] = swap_workaround (w3[1]); + w3_t[2] = 0; + w3_t[3] = (64 + pw_len) * 8; + + u32x digest[8]; + + hmac_sha256_run (w0_t, w1_t, w2_t, w3_t, ipad, opad, digest); + + const u32x r0 = digest[3]; + const u32x r1 = digest[7]; + const u32x r2 = digest[2]; + const u32x r3 = digest[6]; + + #include VECT_COMPARE_S + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m01460_s08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m01460_s16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/amd/m01460_a3.cl b/amd/m01460_a3.cl new file mode 100644 index 0000000000..ba250a21cb --- /dev/null +++ b/amd/m01460_a3.cl @@ -0,0 +1,758 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _SHA256_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW4 +#define VECT_SIZE2 +#endif + +#ifdef VLIW5 +#define VECT_SIZE2 +#endif + +#define DGST_R0 3 +#define DGST_R1 7 +#define DGST_R2 2 +#define DGST_R3 6 + +#include "include/kernel_functions.c" +#include "types_amd.c" +#include "common_amd.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +__constant u32 k_sha256[64] = +{ + SHA256C00, SHA256C01, SHA256C02, SHA256C03, + SHA256C04, SHA256C05, SHA256C06, SHA256C07, + SHA256C08, SHA256C09, SHA256C0a, SHA256C0b, + SHA256C0c, SHA256C0d, SHA256C0e, SHA256C0f, + SHA256C10, SHA256C11, SHA256C12, SHA256C13, + SHA256C14, SHA256C15, SHA256C16, SHA256C17, + SHA256C18, SHA256C19, SHA256C1a, SHA256C1b, + SHA256C1c, SHA256C1d, SHA256C1e, SHA256C1f, + SHA256C20, SHA256C21, SHA256C22, SHA256C23, + SHA256C24, SHA256C25, SHA256C26, SHA256C27, + SHA256C28, SHA256C29, SHA256C2a, SHA256C2b, + SHA256C2c, SHA256C2d, SHA256C2e, SHA256C2f, + SHA256C30, SHA256C31, SHA256C32, SHA256C33, + SHA256C34, SHA256C35, SHA256C36, SHA256C37, + SHA256C38, SHA256C39, SHA256C3a, SHA256C3b, + SHA256C3c, SHA256C3d, SHA256C3e, SHA256C3f, +}; + +static void sha256_transform (const u32x w0[4], const u32x w1[4], const u32x w2[4], const u32x w3[4], u32x digest[8]) +{ + u32x a = digest[0]; + u32x b = digest[1]; + u32x c = digest[2]; + u32x d = digest[3]; + u32x e = digest[4]; + u32x f = digest[5]; + u32x g = digest[6]; + u32x h = digest[7]; + + u32x w0_t = w0[0]; + u32x w1_t = w0[1]; + u32x w2_t = w0[2]; + u32x w3_t = w0[3]; + u32x w4_t = w1[0]; + u32x w5_t = w1[1]; + u32x w6_t = w1[2]; + u32x w7_t = w1[3]; + u32x w8_t = w2[0]; + u32x w9_t = w2[1]; + u32x wa_t = w2[2]; + u32x wb_t = w2[3]; + u32x wc_t = w3[0]; + u32x wd_t = w3[1]; + u32x we_t = w3[2]; + u32x wf_t = w3[3]; + + #define ROUND_EXPAND() \ + { \ + w0_t = SHA256_EXPAND (we_t, w9_t, w1_t, w0_t); \ + w1_t = SHA256_EXPAND (wf_t, wa_t, w2_t, w1_t); \ + w2_t = SHA256_EXPAND (w0_t, wb_t, w3_t, w2_t); \ + w3_t = SHA256_EXPAND (w1_t, wc_t, w4_t, w3_t); \ + w4_t = SHA256_EXPAND (w2_t, wd_t, w5_t, w4_t); \ + w5_t = SHA256_EXPAND (w3_t, we_t, w6_t, w5_t); \ + w6_t = SHA256_EXPAND (w4_t, wf_t, w7_t, w6_t); \ + w7_t = SHA256_EXPAND (w5_t, w0_t, w8_t, w7_t); \ + w8_t = SHA256_EXPAND (w6_t, w1_t, w9_t, w8_t); \ + w9_t = SHA256_EXPAND (w7_t, w2_t, wa_t, w9_t); \ + wa_t = SHA256_EXPAND (w8_t, w3_t, wb_t, wa_t); \ + wb_t = SHA256_EXPAND (w9_t, w4_t, wc_t, wb_t); \ + wc_t = SHA256_EXPAND (wa_t, w5_t, wd_t, wc_t); \ + wd_t = SHA256_EXPAND (wb_t, w6_t, we_t, wd_t); \ + we_t = SHA256_EXPAND (wc_t, w7_t, wf_t, we_t); \ + wf_t = SHA256_EXPAND (wd_t, w8_t, w0_t, wf_t); \ + } + + #define ROUND_STEP(i) \ + { \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, k_sha256[i + 0]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, k_sha256[i + 1]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, k_sha256[i + 2]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, k_sha256[i + 3]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, k_sha256[i + 4]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, k_sha256[i + 5]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, k_sha256[i + 6]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, k_sha256[i + 7]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, k_sha256[i + 8]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, k_sha256[i + 9]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, k_sha256[i + 10]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, k_sha256[i + 11]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, k_sha256[i + 12]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, k_sha256[i + 13]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, k_sha256[i + 14]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, k_sha256[i + 15]); \ + } + + ROUND_STEP (0); + + #pragma unroll + for (int i = 16; i < 64; i += 16) + { + ROUND_EXPAND (); ROUND_STEP (i); + } + + digest[0] += a; + digest[1] += b; + digest[2] += c; + digest[3] += d; + digest[4] += e; + digest[5] += f; + digest[6] += g; + digest[7] += h; +} + +static void hmac_sha256_pad (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], u32x ipad[8], u32x opad[8]) +{ + w0[0] = w0[0] ^ 0x36363636; + w0[1] = w0[1] ^ 0x36363636; + w0[2] = w0[2] ^ 0x36363636; + w0[3] = w0[3] ^ 0x36363636; + w1[0] = w1[0] ^ 0x36363636; + w1[1] = w1[1] ^ 0x36363636; + w1[2] = w1[2] ^ 0x36363636; + w1[3] = w1[3] ^ 0x36363636; + w2[0] = w2[0] ^ 0x36363636; + w2[1] = w2[1] ^ 0x36363636; + w2[2] = w2[2] ^ 0x36363636; + w2[3] = w2[3] ^ 0x36363636; + w3[0] = w3[0] ^ 0x36363636; + w3[1] = w3[1] ^ 0x36363636; + w3[2] = w3[2] ^ 0x36363636; + w3[3] = w3[3] ^ 0x36363636; + + ipad[0] = SHA256M_A; + ipad[1] = SHA256M_B; + ipad[2] = SHA256M_C; + ipad[3] = SHA256M_D; + ipad[4] = SHA256M_E; + ipad[5] = SHA256M_F; + ipad[6] = SHA256M_G; + ipad[7] = SHA256M_H; + + sha256_transform (w0, w1, w2, w3, ipad); + + w0[0] = w0[0] ^ 0x6a6a6a6a; + w0[1] = w0[1] ^ 0x6a6a6a6a; + w0[2] = w0[2] ^ 0x6a6a6a6a; + w0[3] = w0[3] ^ 0x6a6a6a6a; + w1[0] = w1[0] ^ 0x6a6a6a6a; + w1[1] = w1[1] ^ 0x6a6a6a6a; + w1[2] = w1[2] ^ 0x6a6a6a6a; + w1[3] = w1[3] ^ 0x6a6a6a6a; + w2[0] = w2[0] ^ 0x6a6a6a6a; + w2[1] = w2[1] ^ 0x6a6a6a6a; + w2[2] = w2[2] ^ 0x6a6a6a6a; + w2[3] = w2[3] ^ 0x6a6a6a6a; + w3[0] = w3[0] ^ 0x6a6a6a6a; + w3[1] = w3[1] ^ 0x6a6a6a6a; + w3[2] = w3[2] ^ 0x6a6a6a6a; + w3[3] = w3[3] ^ 0x6a6a6a6a; + + opad[0] = SHA256M_A; + opad[1] = SHA256M_B; + opad[2] = SHA256M_C; + opad[3] = SHA256M_D; + opad[4] = SHA256M_E; + opad[5] = SHA256M_F; + opad[6] = SHA256M_G; + opad[7] = SHA256M_H; + + sha256_transform (w0, w1, w2, w3, opad); +} + +static void hmac_sha256_run (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], u32x ipad[8], u32x opad[8], u32x digest[8]) +{ + digest[0] = ipad[0]; + digest[1] = ipad[1]; + digest[2] = ipad[2]; + digest[3] = ipad[3]; + digest[4] = ipad[4]; + digest[5] = ipad[5]; + digest[6] = ipad[6]; + digest[7] = ipad[7]; + + sha256_transform (w0, w1, w2, w3, digest); + + w0[0] = digest[0]; + w0[1] = digest[1]; + w0[2] = digest[2]; + w0[3] = digest[3]; + w1[0] = digest[4]; + w1[1] = digest[5]; + w1[2] = digest[6]; + w1[3] = digest[7]; + w2[0] = 0x80000000; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = (64 + 32) * 8; + + digest[0] = opad[0]; + digest[1] = opad[1]; + digest[2] = opad[2]; + digest[3] = opad[3]; + digest[4] = opad[4]; + digest[5] = opad[5]; + digest[6] = opad[6]; + digest[7] = opad[7]; + + sha256_transform (w0, w1, w2, w3, digest); +} + +static void m01460m (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], const u32 pw_len, __global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esal_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset) +{ + /** + * modifier + */ + + const u32 gid = get_global_id (0); + const u32 lid = get_local_id (0); + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[ 1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[ 2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[ 3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[ 4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[ 5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[ 6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[ 7]; + + /** + * pads + */ + + u32x w0_t[4]; + + w0_t[0] = swap_workaround (salt_buf0[0]); + w0_t[1] = swap_workaround (salt_buf0[1]); + w0_t[2] = swap_workaround (salt_buf0[2]); + w0_t[3] = swap_workaround (salt_buf0[3]); + + u32x w1_t[4]; + + w1_t[0] = swap_workaround (salt_buf1[0]); + w1_t[1] = swap_workaround (salt_buf1[1]); + w1_t[2] = swap_workaround (salt_buf1[2]); + w1_t[3] = swap_workaround (salt_buf1[3]); + + u32x w2_t[4]; + + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + + u32x w3_t[4]; + + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = 0; + + u32x ipad[8]; + u32x opad[8]; + + hmac_sha256_pad (w0_t, w1_t, w2_t, w3_t, ipad, opad); + + /** + * loop + */ + + u32x w0l = w0[0]; + + for (u32 il_pos = 0; il_pos < bfs_cnt; il_pos++) + { + const u32 w0r = bfs_buf[il_pos].i; + + w0[0] = w0l | w0r; + + w0_t[0] = w0[0]; + w0_t[1] = w0[1]; + w0_t[2] = w0[2]; + w0_t[3] = w0[3]; + w1_t[0] = w1[0]; + w1_t[1] = w1[1]; + w1_t[2] = w1[2]; + w1_t[3] = w1[3]; + w2_t[0] = w2[0]; + w2_t[1] = w2[1]; + w2_t[2] = w2[2]; + w2_t[3] = w2[3]; + w3_t[0] = w3[0]; + w3_t[1] = w3[1]; + w3_t[2] = 0; + w3_t[3] = (64 + pw_len) * 8; + + u32x digest[8]; + + hmac_sha256_run (w0_t, w1_t, w2_t, w3_t, ipad, opad, digest); + + const u32x r0 = digest[3]; + const u32x r1 = digest[7]; + const u32x r2 = digest[2]; + const u32x r3 = digest[6]; + + #include VECT_COMPARE_M + } +} + +static void m01460s (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], const u32 pw_len, __global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset) +{ + /** + * modifier + */ + + const u32 gid = get_global_id (0); + const u32 lid = get_local_id (0); + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[ 1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[ 2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[ 3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[ 4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[ 5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[ 6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[ 7]; + + /** + * pads + */ + + u32x w0_t[4]; + + w0_t[0] = swap_workaround (salt_buf0[0]); + w0_t[1] = swap_workaround (salt_buf0[1]); + w0_t[2] = swap_workaround (salt_buf0[2]); + w0_t[3] = swap_workaround (salt_buf0[3]); + + u32x w1_t[4]; + + w1_t[0] = swap_workaround (salt_buf1[0]); + w1_t[1] = swap_workaround (salt_buf1[1]); + w1_t[2] = swap_workaround (salt_buf1[2]); + w1_t[3] = swap_workaround (salt_buf1[3]); + + u32x w2_t[4]; + + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + + u32x w3_t[4]; + + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = 0; + + u32x ipad[8]; + u32x opad[8]; + + hmac_sha256_pad (w0_t, w1_t, w2_t, w3_t, ipad, opad); + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * loop + */ + + u32x w0l = w0[0]; + + for (u32 il_pos = 0; il_pos < bfs_cnt; il_pos++) + { + const u32 w0r = bfs_buf[il_pos].i; + + w0[0] = w0l | w0r; + + w0_t[0] = w0[0]; + w0_t[1] = w0[1]; + w0_t[2] = w0[2]; + w0_t[3] = w0[3]; + w1_t[0] = w1[0]; + w1_t[1] = w1[1]; + w1_t[2] = w1[2]; + w1_t[3] = w1[3]; + w2_t[0] = w2[0]; + w2_t[1] = w2[1]; + w2_t[2] = w2[2]; + w2_t[3] = w2[3]; + w3_t[0] = w3[0]; + w3_t[1] = w3[1]; + w3_t[2] = 0; + w3_t[3] = (64 + pw_len) * 8; + + u32x digest[8]; + + hmac_sha256_run (w0_t, w1_t, w2_t, w3_t, ipad, opad, digest); + + const u32x r0 = digest[3]; + const u32x r1 = digest[7]; + const u32x r2 = digest[2]; + const u32x r3 = digest[6]; + + #include VECT_COMPARE_S + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m01460_m04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m01460m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m01460_m08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m01460m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m01460_m16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = pws[gid].i[ 8]; + w2[1] = pws[gid].i[ 9]; + w2[2] = pws[gid].i[10]; + w2[3] = pws[gid].i[11]; + + u32x w3[4]; + + w3[0] = pws[gid].i[12]; + w3[1] = pws[gid].i[13]; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m01460m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m01460_s04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m01460s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m01460_s08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m01460s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m01460_s16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = pws[gid].i[ 8]; + w2[1] = pws[gid].i[ 9]; + w2[2] = pws[gid].i[10]; + w2[3] = pws[gid].i[11]; + + u32x w3[4]; + + w3[0] = pws[gid].i[12]; + w3[1] = pws[gid].i[13]; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m01460s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} diff --git a/amd/m01500_a0.cl b/amd/m01500_a0.cl new file mode 100644 index 0000000000..709fec8233 --- /dev/null +++ b/amd/m01500_a0.cl @@ -0,0 +1,756 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _DES_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW4 +#define VECT_SIZE4 +#endif + +#ifdef VLIW5 +#define VECT_SIZE4 +#endif + +#define DGST_R0 0 +#define DGST_R1 1 +#define DGST_R2 2 +#define DGST_R3 3 + +#include "include/kernel_functions.c" +#include "types_amd.c" +#include "common_amd.c" +#include "include/rp_gpu.h" +#include "rp_amd.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +#define PERM_OP(a,b,tt,n,m) \ +{ \ + tt = a >> n; \ + tt = tt ^ b; \ + tt = tt & m; \ + b = b ^ tt; \ + tt = tt << n; \ + a = a ^ tt; \ +} + +#define HPERM_OP(a,tt,n,m) \ +{ \ + tt = a << (16 + n); \ + tt = tt ^ a; \ + tt = tt & m; \ + a = a ^ tt; \ + tt = tt >> (16 + n); \ + a = a ^ tt; \ +} + +__constant u32 c_SPtrans[8][64] = +{ + /* nibble 0 */ + 0x00820200, 0x00020000, 0x80800000, 0x80820200, + 0x00800000, 0x80020200, 0x80020000, 0x80800000, + 0x80020200, 0x00820200, 0x00820000, 0x80000200, + 0x80800200, 0x00800000, 0x00000000, 0x80020000, + 0x00020000, 0x80000000, 0x00800200, 0x00020200, + 0x80820200, 0x00820000, 0x80000200, 0x00800200, + 0x80000000, 0x00000200, 0x00020200, 0x80820000, + 0x00000200, 0x80800200, 0x80820000, 0x00000000, + 0x00000000, 0x80820200, 0x00800200, 0x80020000, + 0x00820200, 0x00020000, 0x80000200, 0x00800200, + 0x80820000, 0x00000200, 0x00020200, 0x80800000, + 0x80020200, 0x80000000, 0x80800000, 0x00820000, + 0x80820200, 0x00020200, 0x00820000, 0x80800200, + 0x00800000, 0x80000200, 0x80020000, 0x00000000, + 0x00020000, 0x00800000, 0x80800200, 0x00820200, + 0x80000000, 0x80820000, 0x00000200, 0x80020200, + /* nibble 1 */ + 0x10042004, 0x00000000, 0x00042000, 0x10040000, + 0x10000004, 0x00002004, 0x10002000, 0x00042000, + 0x00002000, 0x10040004, 0x00000004, 0x10002000, + 0x00040004, 0x10042000, 0x10040000, 0x00000004, + 0x00040000, 0x10002004, 0x10040004, 0x00002000, + 0x00042004, 0x10000000, 0x00000000, 0x00040004, + 0x10002004, 0x00042004, 0x10042000, 0x10000004, + 0x10000000, 0x00040000, 0x00002004, 0x10042004, + 0x00040004, 0x10042000, 0x10002000, 0x00042004, + 0x10042004, 0x00040004, 0x10000004, 0x00000000, + 0x10000000, 0x00002004, 0x00040000, 0x10040004, + 0x00002000, 0x10000000, 0x00042004, 0x10002004, + 0x10042000, 0x00002000, 0x00000000, 0x10000004, + 0x00000004, 0x10042004, 0x00042000, 0x10040000, + 0x10040004, 0x00040000, 0x00002004, 0x10002000, + 0x10002004, 0x00000004, 0x10040000, 0x00042000, + /* nibble 2 */ + 0x41000000, 0x01010040, 0x00000040, 0x41000040, + 0x40010000, 0x01000000, 0x41000040, 0x00010040, + 0x01000040, 0x00010000, 0x01010000, 0x40000000, + 0x41010040, 0x40000040, 0x40000000, 0x41010000, + 0x00000000, 0x40010000, 0x01010040, 0x00000040, + 0x40000040, 0x41010040, 0x00010000, 0x41000000, + 0x41010000, 0x01000040, 0x40010040, 0x01010000, + 0x00010040, 0x00000000, 0x01000000, 0x40010040, + 0x01010040, 0x00000040, 0x40000000, 0x00010000, + 0x40000040, 0x40010000, 0x01010000, 0x41000040, + 0x00000000, 0x01010040, 0x00010040, 0x41010000, + 0x40010000, 0x01000000, 0x41010040, 0x40000000, + 0x40010040, 0x41000000, 0x01000000, 0x41010040, + 0x00010000, 0x01000040, 0x41000040, 0x00010040, + 0x01000040, 0x00000000, 0x41010000, 0x40000040, + 0x41000000, 0x40010040, 0x00000040, 0x01010000, + /* nibble 3 */ + 0x00100402, 0x04000400, 0x00000002, 0x04100402, + 0x00000000, 0x04100000, 0x04000402, 0x00100002, + 0x04100400, 0x04000002, 0x04000000, 0x00000402, + 0x04000002, 0x00100402, 0x00100000, 0x04000000, + 0x04100002, 0x00100400, 0x00000400, 0x00000002, + 0x00100400, 0x04000402, 0x04100000, 0x00000400, + 0x00000402, 0x00000000, 0x00100002, 0x04100400, + 0x04000400, 0x04100002, 0x04100402, 0x00100000, + 0x04100002, 0x00000402, 0x00100000, 0x04000002, + 0x00100400, 0x04000400, 0x00000002, 0x04100000, + 0x04000402, 0x00000000, 0x00000400, 0x00100002, + 0x00000000, 0x04100002, 0x04100400, 0x00000400, + 0x04000000, 0x04100402, 0x00100402, 0x00100000, + 0x04100402, 0x00000002, 0x04000400, 0x00100402, + 0x00100002, 0x00100400, 0x04100000, 0x04000402, + 0x00000402, 0x04000000, 0x04000002, 0x04100400, + /* nibble 4 */ + 0x02000000, 0x00004000, 0x00000100, 0x02004108, + 0x02004008, 0x02000100, 0x00004108, 0x02004000, + 0x00004000, 0x00000008, 0x02000008, 0x00004100, + 0x02000108, 0x02004008, 0x02004100, 0x00000000, + 0x00004100, 0x02000000, 0x00004008, 0x00000108, + 0x02000100, 0x00004108, 0x00000000, 0x02000008, + 0x00000008, 0x02000108, 0x02004108, 0x00004008, + 0x02004000, 0x00000100, 0x00000108, 0x02004100, + 0x02004100, 0x02000108, 0x00004008, 0x02004000, + 0x00004000, 0x00000008, 0x02000008, 0x02000100, + 0x02000000, 0x00004100, 0x02004108, 0x00000000, + 0x00004108, 0x02000000, 0x00000100, 0x00004008, + 0x02000108, 0x00000100, 0x00000000, 0x02004108, + 0x02004008, 0x02004100, 0x00000108, 0x00004000, + 0x00004100, 0x02004008, 0x02000100, 0x00000108, + 0x00000008, 0x00004108, 0x02004000, 0x02000008, + /* nibble 5 */ + 0x20000010, 0x00080010, 0x00000000, 0x20080800, + 0x00080010, 0x00000800, 0x20000810, 0x00080000, + 0x00000810, 0x20080810, 0x00080800, 0x20000000, + 0x20000800, 0x20000010, 0x20080000, 0x00080810, + 0x00080000, 0x20000810, 0x20080010, 0x00000000, + 0x00000800, 0x00000010, 0x20080800, 0x20080010, + 0x20080810, 0x20080000, 0x20000000, 0x00000810, + 0x00000010, 0x00080800, 0x00080810, 0x20000800, + 0x00000810, 0x20000000, 0x20000800, 0x00080810, + 0x20080800, 0x00080010, 0x00000000, 0x20000800, + 0x20000000, 0x00000800, 0x20080010, 0x00080000, + 0x00080010, 0x20080810, 0x00080800, 0x00000010, + 0x20080810, 0x00080800, 0x00080000, 0x20000810, + 0x20000010, 0x20080000, 0x00080810, 0x00000000, + 0x00000800, 0x20000010, 0x20000810, 0x20080800, + 0x20080000, 0x00000810, 0x00000010, 0x20080010, + /* nibble 6 */ + 0x00001000, 0x00000080, 0x00400080, 0x00400001, + 0x00401081, 0x00001001, 0x00001080, 0x00000000, + 0x00400000, 0x00400081, 0x00000081, 0x00401000, + 0x00000001, 0x00401080, 0x00401000, 0x00000081, + 0x00400081, 0x00001000, 0x00001001, 0x00401081, + 0x00000000, 0x00400080, 0x00400001, 0x00001080, + 0x00401001, 0x00001081, 0x00401080, 0x00000001, + 0x00001081, 0x00401001, 0x00000080, 0x00400000, + 0x00001081, 0x00401000, 0x00401001, 0x00000081, + 0x00001000, 0x00000080, 0x00400000, 0x00401001, + 0x00400081, 0x00001081, 0x00001080, 0x00000000, + 0x00000080, 0x00400001, 0x00000001, 0x00400080, + 0x00000000, 0x00400081, 0x00400080, 0x00001080, + 0x00000081, 0x00001000, 0x00401081, 0x00400000, + 0x00401080, 0x00000001, 0x00001001, 0x00401081, + 0x00400001, 0x00401080, 0x00401000, 0x00001001, + /* nibble 7 */ + 0x08200020, 0x08208000, 0x00008020, 0x00000000, + 0x08008000, 0x00200020, 0x08200000, 0x08208020, + 0x00000020, 0x08000000, 0x00208000, 0x00008020, + 0x00208020, 0x08008020, 0x08000020, 0x08200000, + 0x00008000, 0x00208020, 0x00200020, 0x08008000, + 0x08208020, 0x08000020, 0x00000000, 0x00208000, + 0x08000000, 0x00200000, 0x08008020, 0x08200020, + 0x00200000, 0x00008000, 0x08208000, 0x00000020, + 0x00200000, 0x00008000, 0x08000020, 0x08208020, + 0x00008020, 0x08000000, 0x00000000, 0x00208000, + 0x08200020, 0x08008020, 0x08008000, 0x00200020, + 0x08208000, 0x00000020, 0x00200020, 0x08008000, + 0x08208020, 0x00200000, 0x08200000, 0x08000020, + 0x00208000, 0x00008020, 0x08008020, 0x08200000, + 0x00000020, 0x08208000, 0x00208020, 0x00000000, + 0x08000000, 0x08200020, 0x00008000, 0x00208020 +}; + +__constant u32 c_skb[8][64] = +{ + /* for C bits (numbered as per FIPS 46) 1 2 3 4 5 6 */ + 0x00000000, 0x00000010, 0x20000000, 0x20000010, + 0x00010000, 0x00010010, 0x20010000, 0x20010010, + 0x00000800, 0x00000810, 0x20000800, 0x20000810, + 0x00010800, 0x00010810, 0x20010800, 0x20010810, + 0x00000020, 0x00000030, 0x20000020, 0x20000030, + 0x00010020, 0x00010030, 0x20010020, 0x20010030, + 0x00000820, 0x00000830, 0x20000820, 0x20000830, + 0x00010820, 0x00010830, 0x20010820, 0x20010830, + 0x00080000, 0x00080010, 0x20080000, 0x20080010, + 0x00090000, 0x00090010, 0x20090000, 0x20090010, + 0x00080800, 0x00080810, 0x20080800, 0x20080810, + 0x00090800, 0x00090810, 0x20090800, 0x20090810, + 0x00080020, 0x00080030, 0x20080020, 0x20080030, + 0x00090020, 0x00090030, 0x20090020, 0x20090030, + 0x00080820, 0x00080830, 0x20080820, 0x20080830, + 0x00090820, 0x00090830, 0x20090820, 0x20090830, + /* for C bits (numbered as per FIPS 46) 7 8 10 11 12 13 */ + 0x00000000, 0x02000000, 0x00002000, 0x02002000, + 0x00200000, 0x02200000, 0x00202000, 0x02202000, + 0x00000004, 0x02000004, 0x00002004, 0x02002004, + 0x00200004, 0x02200004, 0x00202004, 0x02202004, + 0x00000400, 0x02000400, 0x00002400, 0x02002400, + 0x00200400, 0x02200400, 0x00202400, 0x02202400, + 0x00000404, 0x02000404, 0x00002404, 0x02002404, + 0x00200404, 0x02200404, 0x00202404, 0x02202404, + 0x10000000, 0x12000000, 0x10002000, 0x12002000, + 0x10200000, 0x12200000, 0x10202000, 0x12202000, + 0x10000004, 0x12000004, 0x10002004, 0x12002004, + 0x10200004, 0x12200004, 0x10202004, 0x12202004, + 0x10000400, 0x12000400, 0x10002400, 0x12002400, + 0x10200400, 0x12200400, 0x10202400, 0x12202400, + 0x10000404, 0x12000404, 0x10002404, 0x12002404, + 0x10200404, 0x12200404, 0x10202404, 0x12202404, + /* for C bits (numbered as per FIPS 46) 14 15 16 17 19 20 */ + 0x00000000, 0x00000001, 0x00040000, 0x00040001, + 0x01000000, 0x01000001, 0x01040000, 0x01040001, + 0x00000002, 0x00000003, 0x00040002, 0x00040003, + 0x01000002, 0x01000003, 0x01040002, 0x01040003, + 0x00000200, 0x00000201, 0x00040200, 0x00040201, + 0x01000200, 0x01000201, 0x01040200, 0x01040201, + 0x00000202, 0x00000203, 0x00040202, 0x00040203, + 0x01000202, 0x01000203, 0x01040202, 0x01040203, + 0x08000000, 0x08000001, 0x08040000, 0x08040001, + 0x09000000, 0x09000001, 0x09040000, 0x09040001, + 0x08000002, 0x08000003, 0x08040002, 0x08040003, + 0x09000002, 0x09000003, 0x09040002, 0x09040003, + 0x08000200, 0x08000201, 0x08040200, 0x08040201, + 0x09000200, 0x09000201, 0x09040200, 0x09040201, + 0x08000202, 0x08000203, 0x08040202, 0x08040203, + 0x09000202, 0x09000203, 0x09040202, 0x09040203, + /* for C bits (numbered as per FIPS 46) 21 23 24 26 27 28 */ + 0x00000000, 0x00100000, 0x00000100, 0x00100100, + 0x00000008, 0x00100008, 0x00000108, 0x00100108, + 0x00001000, 0x00101000, 0x00001100, 0x00101100, + 0x00001008, 0x00101008, 0x00001108, 0x00101108, + 0x04000000, 0x04100000, 0x04000100, 0x04100100, + 0x04000008, 0x04100008, 0x04000108, 0x04100108, + 0x04001000, 0x04101000, 0x04001100, 0x04101100, + 0x04001008, 0x04101008, 0x04001108, 0x04101108, + 0x00020000, 0x00120000, 0x00020100, 0x00120100, + 0x00020008, 0x00120008, 0x00020108, 0x00120108, + 0x00021000, 0x00121000, 0x00021100, 0x00121100, + 0x00021008, 0x00121008, 0x00021108, 0x00121108, + 0x04020000, 0x04120000, 0x04020100, 0x04120100, + 0x04020008, 0x04120008, 0x04020108, 0x04120108, + 0x04021000, 0x04121000, 0x04021100, 0x04121100, + 0x04021008, 0x04121008, 0x04021108, 0x04121108, + /* for D bits (numbered as per FIPS 46) 1 2 3 4 5 6 */ + 0x00000000, 0x10000000, 0x00010000, 0x10010000, + 0x00000004, 0x10000004, 0x00010004, 0x10010004, + 0x20000000, 0x30000000, 0x20010000, 0x30010000, + 0x20000004, 0x30000004, 0x20010004, 0x30010004, + 0x00100000, 0x10100000, 0x00110000, 0x10110000, + 0x00100004, 0x10100004, 0x00110004, 0x10110004, + 0x20100000, 0x30100000, 0x20110000, 0x30110000, + 0x20100004, 0x30100004, 0x20110004, 0x30110004, + 0x00001000, 0x10001000, 0x00011000, 0x10011000, + 0x00001004, 0x10001004, 0x00011004, 0x10011004, + 0x20001000, 0x30001000, 0x20011000, 0x30011000, + 0x20001004, 0x30001004, 0x20011004, 0x30011004, + 0x00101000, 0x10101000, 0x00111000, 0x10111000, + 0x00101004, 0x10101004, 0x00111004, 0x10111004, + 0x20101000, 0x30101000, 0x20111000, 0x30111000, + 0x20101004, 0x30101004, 0x20111004, 0x30111004, + /* for D bits (numbered as per FIPS 46) 8 9 11 12 13 14 */ + 0x00000000, 0x08000000, 0x00000008, 0x08000008, + 0x00000400, 0x08000400, 0x00000408, 0x08000408, + 0x00020000, 0x08020000, 0x00020008, 0x08020008, + 0x00020400, 0x08020400, 0x00020408, 0x08020408, + 0x00000001, 0x08000001, 0x00000009, 0x08000009, + 0x00000401, 0x08000401, 0x00000409, 0x08000409, + 0x00020001, 0x08020001, 0x00020009, 0x08020009, + 0x00020401, 0x08020401, 0x00020409, 0x08020409, + 0x02000000, 0x0A000000, 0x02000008, 0x0A000008, + 0x02000400, 0x0A000400, 0x02000408, 0x0A000408, + 0x02020000, 0x0A020000, 0x02020008, 0x0A020008, + 0x02020400, 0x0A020400, 0x02020408, 0x0A020408, + 0x02000001, 0x0A000001, 0x02000009, 0x0A000009, + 0x02000401, 0x0A000401, 0x02000409, 0x0A000409, + 0x02020001, 0x0A020001, 0x02020009, 0x0A020009, + 0x02020401, 0x0A020401, 0x02020409, 0x0A020409, + /* for D bits (numbered as per FIPS 46) 16 17 18 19 20 21 */ + 0x00000000, 0x00000100, 0x00080000, 0x00080100, + 0x01000000, 0x01000100, 0x01080000, 0x01080100, + 0x00000010, 0x00000110, 0x00080010, 0x00080110, + 0x01000010, 0x01000110, 0x01080010, 0x01080110, + 0x00200000, 0x00200100, 0x00280000, 0x00280100, + 0x01200000, 0x01200100, 0x01280000, 0x01280100, + 0x00200010, 0x00200110, 0x00280010, 0x00280110, + 0x01200010, 0x01200110, 0x01280010, 0x01280110, + 0x00000200, 0x00000300, 0x00080200, 0x00080300, + 0x01000200, 0x01000300, 0x01080200, 0x01080300, + 0x00000210, 0x00000310, 0x00080210, 0x00080310, + 0x01000210, 0x01000310, 0x01080210, 0x01080310, + 0x00200200, 0x00200300, 0x00280200, 0x00280300, + 0x01200200, 0x01200300, 0x01280200, 0x01280300, + 0x00200210, 0x00200310, 0x00280210, 0x00280310, + 0x01200210, 0x01200310, 0x01280210, 0x01280310, + /* for D bits (numbered as per FIPS 46) 22 23 24 25 27 28 */ + 0x00000000, 0x04000000, 0x00040000, 0x04040000, + 0x00000002, 0x04000002, 0x00040002, 0x04040002, + 0x00002000, 0x04002000, 0x00042000, 0x04042000, + 0x00002002, 0x04002002, 0x00042002, 0x04042002, + 0x00000020, 0x04000020, 0x00040020, 0x04040020, + 0x00000022, 0x04000022, 0x00040022, 0x04040022, + 0x00002020, 0x04002020, 0x00042020, 0x04042020, + 0x00002022, 0x04002022, 0x00042022, 0x04042022, + 0x00000800, 0x04000800, 0x00040800, 0x04040800, + 0x00000802, 0x04000802, 0x00040802, 0x04040802, + 0x00002800, 0x04002800, 0x00042800, 0x04042800, + 0x00002802, 0x04002802, 0x00042802, 0x04042802, + 0x00000820, 0x04000820, 0x00040820, 0x04040820, + 0x00000822, 0x04000822, 0x00040822, 0x04040822, + 0x00002820, 0x04002820, 0x00042820, 0x04042820, + 0x00002822, 0x04002822, 0x00042822, 0x04042822 +}; + +__constant u32 shifts3s0[16] = { 1, 1, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 1 }; +__constant u32 shifts3s1[16] = { 27, 27, 26, 26, 26, 26, 26, 26, 27, 26, 26, 26, 26, 26, 26, 27 }; + +#ifdef VECT_SIZE1 +#define BOX(i,n,S) (u32x) ((S)[(n)][(i)]) +#endif + +#ifdef VECT_SIZE2 +#define BOX(i,n,S) (u32x) ((S)[(n)][(i).s0], (S)[(n)][(i).s1]) +#endif + +#ifdef VECT_SIZE4 +#define BOX(i,n,S) (u32x) ((S)[(n)][(i).s0], (S)[(n)][(i).s1], (S)[(n)][(i).s2], (S)[(n)][(i).s3]) +#endif + +static void _des_crypt_keysetup (u32x c, u32x d, u32x Kc[16], u32x Kd[16], __local u32 s_skb[8][64]) +{ + u32x tt; + + PERM_OP (d, c, tt, 4, 0x0f0f0f0f); + HPERM_OP (c, tt, 2, 0xcccc0000); + HPERM_OP (d, tt, 2, 0xcccc0000); + PERM_OP (d, c, tt, 1, 0x55555555); + PERM_OP (c, d, tt, 8, 0x00ff00ff); + PERM_OP (d, c, tt, 1, 0x55555555); + + d = ((d & 0x000000ff) << 16) + | ((d & 0x0000ff00) << 0) + | ((d & 0x00ff0000) >> 16) + | ((c & 0xf0000000) >> 4); + + c = c & 0x0fffffff; + + #pragma unroll + for (u32 i = 0; i < 16; i++) + { + c = c >> shifts3s0[i] | c << shifts3s1[i]; + d = d >> shifts3s0[i] | d << shifts3s1[i]; + + c = c & 0x0fffffff; + d = d & 0x0fffffff; + + const u32x c00 = (c >> 0) & 0x0000003f; + const u32x c06 = (c >> 6) & 0x00383003; + const u32x c07 = (c >> 7) & 0x0000003c; + const u32x c13 = (c >> 13) & 0x0000060f; + const u32x c20 = (c >> 20) & 0x00000001; + + u32x s = BOX (((c00 >> 0) & 0xff), 0, s_skb) + | BOX (((c06 >> 0) & 0xff) + |((c07 >> 0) & 0xff), 1, s_skb) + | BOX (((c13 >> 0) & 0xff) + |((c06 >> 8) & 0xff), 2, s_skb) + | BOX (((c20 >> 0) & 0xff) + |((c13 >> 8) & 0xff) + |((c06 >> 16) & 0xff), 3, s_skb); + + const u32x d00 = (d >> 0) & 0x00003c3f; + const u32x d07 = (d >> 7) & 0x00003f03; + const u32x d21 = (d >> 21) & 0x0000000f; + const u32x d22 = (d >> 22) & 0x00000030; + + u32x t = BOX (((d00 >> 0) & 0xff), 4, s_skb) + | BOX (((d07 >> 0) & 0xff) + |((d00 >> 8) & 0xff), 5, s_skb) + | BOX (((d07 >> 8) & 0xff), 6, s_skb) + | BOX (((d21 >> 0) & 0xff) + |((d22 >> 0) & 0xff), 7, s_skb); + + Kc[i] = ((t << 16) | (s & 0x0000ffff)); + Kd[i] = ((s >> 16) | (t & 0xffff0000)); + } +} + +static void _des_crypt_encrypt (u32x iv[2], u32 mask, u32x Kc[16], u32x Kd[16], __local u32 s_SPtrans[8][64]) +{ + const u32 E1 = (mask >> 2) & 0x3f0; + const u32 E0 = mask & 0x3f; + + u32x r = 0; + u32x l = 0; + + for (u32 i = 0; i < 25; i++) + { + for (u32 j = 0; j < 16; j += 2) + { + u32x t; + u32x u; + + t = r ^ (r >> 16); + u = t & E0; + t = t & E1; + u = u ^ (u << 16); + u = u ^ r; + u = u ^ Kc[j + 0]; + t = t ^ (t << 16); + t = t ^ r; + t = rotl32 (t, 28u); + t = t ^ Kd[j + 0]; + + l = l + ^ BOX (amd_bfe (u, 0, 6), 0, s_SPtrans) + ^ BOX (amd_bfe (u, 8, 6), 2, s_SPtrans) + ^ BOX (amd_bfe (u, 16, 6), 4, s_SPtrans) + ^ BOX (amd_bfe (u, 24, 6), 6, s_SPtrans) + ^ BOX (amd_bfe (t, 0, 6), 1, s_SPtrans) + ^ BOX (amd_bfe (t, 8, 6), 3, s_SPtrans) + ^ BOX (amd_bfe (t, 16, 6), 5, s_SPtrans) + ^ BOX (amd_bfe (t, 24, 6), 7, s_SPtrans); + + t = l ^ (l >> 16); + u = t & E0; + t = t & E1; + u = u ^ (u << 16); + u = u ^ l; + u = u ^ Kc[j + 1]; + t = t ^ (t << 16); + t = t ^ l; + t = rotl32 (t, 28u); + t = t ^ Kd[j + 1]; + + r = r + ^ BOX (amd_bfe (u, 0, 6), 0, s_SPtrans) + ^ BOX (amd_bfe (u, 8, 6), 2, s_SPtrans) + ^ BOX (amd_bfe (u, 16, 6), 4, s_SPtrans) + ^ BOX (amd_bfe (u, 24, 6), 6, s_SPtrans) + ^ BOX (amd_bfe (t, 0, 6), 1, s_SPtrans) + ^ BOX (amd_bfe (t, 8, 6), 3, s_SPtrans) + ^ BOX (amd_bfe (t, 16, 6), 5, s_SPtrans) + ^ BOX (amd_bfe (t, 24, 6), 7, s_SPtrans); + } + + u32x tt; + + tt = l; + l = r; + r = tt; + } + + iv[0] = rotl32 (r, 31); + iv[1] = rotl32 (l, 31); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m01500_m04 (__global pw_t *pws, __global gpu_rule_t * rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = 0; + pw_buf0[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * sbox, kbox + */ + + __local u32 s_SPtrans[8][64]; + __local u32 s_skb[8][64]; + + s_SPtrans[0][lid] = c_SPtrans[0][lid]; + s_SPtrans[1][lid] = c_SPtrans[1][lid]; + s_SPtrans[2][lid] = c_SPtrans[2][lid]; + s_SPtrans[3][lid] = c_SPtrans[3][lid]; + s_SPtrans[4][lid] = c_SPtrans[4][lid]; + s_SPtrans[5][lid] = c_SPtrans[5][lid]; + s_SPtrans[6][lid] = c_SPtrans[6][lid]; + s_SPtrans[7][lid] = c_SPtrans[7][lid]; + + s_skb[0][lid] = c_skb[0][lid]; + s_skb[1][lid] = c_skb[1][lid]; + s_skb[2][lid] = c_skb[2][lid]; + s_skb[3][lid] = c_skb[3][lid]; + s_skb[4][lid] = c_skb[4][lid]; + s_skb[5][lid] = c_skb[5][lid]; + s_skb[6][lid] = c_skb[6][lid]; + s_skb[7][lid] = c_skb[7][lid]; + + barrier (CLK_LOCAL_MEM_FENCE); + + if (gid >= gid_max) return; + + /** + * salt + */ + + const u32 mask = salt_bufs[salt_pos].salt_buf[0]; + + /** + * main + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + + w0[0] = pw_buf0[0]; + w0[1] = pw_buf0[1]; + w0[2] = 0; + w0[3] = 0; + + u32x w1[4]; + + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + u32 out_len = apply_rules (rules_buf[il_pos].cmds, w0, w1, pw_len); + + out_len = (out_len >= 8) ? 8 : out_len; + + u32x data[2]; + + data[0] = (w0[0] << 1) & 0xfefefefe; + data[1] = (w0[1] << 1) & 0xfefefefe; + + u32x Kc[16]; + u32x Kd[16]; + + _des_crypt_keysetup (data[0], data[1], Kc, Kd, s_skb); + + u32x iv[2]; + + _des_crypt_encrypt (iv, mask, Kc, Kd, s_SPtrans); + + const u32x r0 = iv[0]; + const u32x r1 = iv[1]; + const u32x r2 = 0; + const u32x r3 = 0; + + #include VECT_COMPARE_M + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m01500_m08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m01500_m16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m01500_s04 (__global pw_t *pws, __global gpu_rule_t * rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = 0; + pw_buf0[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * sbox, kbox + */ + + __local u32 s_SPtrans[8][64]; + __local u32 s_skb[8][64]; + + s_SPtrans[0][lid] = c_SPtrans[0][lid]; + s_SPtrans[1][lid] = c_SPtrans[1][lid]; + s_SPtrans[2][lid] = c_SPtrans[2][lid]; + s_SPtrans[3][lid] = c_SPtrans[3][lid]; + s_SPtrans[4][lid] = c_SPtrans[4][lid]; + s_SPtrans[5][lid] = c_SPtrans[5][lid]; + s_SPtrans[6][lid] = c_SPtrans[6][lid]; + s_SPtrans[7][lid] = c_SPtrans[7][lid]; + + s_skb[0][lid] = c_skb[0][lid]; + s_skb[1][lid] = c_skb[1][lid]; + s_skb[2][lid] = c_skb[2][lid]; + s_skb[3][lid] = c_skb[3][lid]; + s_skb[4][lid] = c_skb[4][lid]; + s_skb[5][lid] = c_skb[5][lid]; + s_skb[6][lid] = c_skb[6][lid]; + s_skb[7][lid] = c_skb[7][lid]; + + barrier (CLK_LOCAL_MEM_FENCE); + + if (gid >= gid_max) return; + + /** + * salt + */ + + const u32 mask = salt_bufs[salt_pos].salt_buf[0]; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * main + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + + w0[0] = pw_buf0[0]; + w0[1] = pw_buf0[1]; + w0[2] = 0; + w0[3] = 0; + + u32x w1[4]; + + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + u32 out_len = apply_rules (rules_buf[il_pos].cmds, w0, w1, pw_len); + + out_len = (out_len >= 8) ? 8 : out_len; + + u32x data[2]; + + data[0] = (w0[0] << 1) & 0xfefefefe; + data[1] = (w0[1] << 1) & 0xfefefefe; + + u32x Kc[16]; + u32x Kd[16]; + + _des_crypt_keysetup (data[0], data[1], Kc, Kd, s_skb); + + u32x iv[2]; + + _des_crypt_encrypt (iv, mask, Kc, Kd, s_SPtrans); + + const u32x r0 = iv[0]; + const u32x r1 = iv[1]; + const u32x r2 = 0; + const u32x r3 = 0; + + #include VECT_COMPARE_S + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m01500_s08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m01500_s16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/amd/m01500_a1.cl b/amd/m01500_a1.cl new file mode 100644 index 0000000000..cdf366e5d7 --- /dev/null +++ b/amd/m01500_a1.cl @@ -0,0 +1,878 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _DES_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW4 +#define VECT_SIZE4 +#endif + +#ifdef VLIW5 +#define VECT_SIZE4 +#endif + +#define DGST_R0 0 +#define DGST_R1 1 +#define DGST_R2 2 +#define DGST_R3 3 + +#include "include/kernel_functions.c" +#include "types_amd.c" +#include "common_amd.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +#define PERM_OP(a,b,tt,n,m) \ +{ \ + tt = a >> n; \ + tt = tt ^ b; \ + tt = tt & m; \ + b = b ^ tt; \ + tt = tt << n; \ + a = a ^ tt; \ +} + +#define HPERM_OP(a,tt,n,m) \ +{ \ + tt = a << (16 + n); \ + tt = tt ^ a; \ + tt = tt & m; \ + a = a ^ tt; \ + tt = tt >> (16 + n); \ + a = a ^ tt; \ +} + +__constant u32 c_SPtrans[8][64] = +{ + /* nibble 0 */ + 0x00820200, 0x00020000, 0x80800000, 0x80820200, + 0x00800000, 0x80020200, 0x80020000, 0x80800000, + 0x80020200, 0x00820200, 0x00820000, 0x80000200, + 0x80800200, 0x00800000, 0x00000000, 0x80020000, + 0x00020000, 0x80000000, 0x00800200, 0x00020200, + 0x80820200, 0x00820000, 0x80000200, 0x00800200, + 0x80000000, 0x00000200, 0x00020200, 0x80820000, + 0x00000200, 0x80800200, 0x80820000, 0x00000000, + 0x00000000, 0x80820200, 0x00800200, 0x80020000, + 0x00820200, 0x00020000, 0x80000200, 0x00800200, + 0x80820000, 0x00000200, 0x00020200, 0x80800000, + 0x80020200, 0x80000000, 0x80800000, 0x00820000, + 0x80820200, 0x00020200, 0x00820000, 0x80800200, + 0x00800000, 0x80000200, 0x80020000, 0x00000000, + 0x00020000, 0x00800000, 0x80800200, 0x00820200, + 0x80000000, 0x80820000, 0x00000200, 0x80020200, + /* nibble 1 */ + 0x10042004, 0x00000000, 0x00042000, 0x10040000, + 0x10000004, 0x00002004, 0x10002000, 0x00042000, + 0x00002000, 0x10040004, 0x00000004, 0x10002000, + 0x00040004, 0x10042000, 0x10040000, 0x00000004, + 0x00040000, 0x10002004, 0x10040004, 0x00002000, + 0x00042004, 0x10000000, 0x00000000, 0x00040004, + 0x10002004, 0x00042004, 0x10042000, 0x10000004, + 0x10000000, 0x00040000, 0x00002004, 0x10042004, + 0x00040004, 0x10042000, 0x10002000, 0x00042004, + 0x10042004, 0x00040004, 0x10000004, 0x00000000, + 0x10000000, 0x00002004, 0x00040000, 0x10040004, + 0x00002000, 0x10000000, 0x00042004, 0x10002004, + 0x10042000, 0x00002000, 0x00000000, 0x10000004, + 0x00000004, 0x10042004, 0x00042000, 0x10040000, + 0x10040004, 0x00040000, 0x00002004, 0x10002000, + 0x10002004, 0x00000004, 0x10040000, 0x00042000, + /* nibble 2 */ + 0x41000000, 0x01010040, 0x00000040, 0x41000040, + 0x40010000, 0x01000000, 0x41000040, 0x00010040, + 0x01000040, 0x00010000, 0x01010000, 0x40000000, + 0x41010040, 0x40000040, 0x40000000, 0x41010000, + 0x00000000, 0x40010000, 0x01010040, 0x00000040, + 0x40000040, 0x41010040, 0x00010000, 0x41000000, + 0x41010000, 0x01000040, 0x40010040, 0x01010000, + 0x00010040, 0x00000000, 0x01000000, 0x40010040, + 0x01010040, 0x00000040, 0x40000000, 0x00010000, + 0x40000040, 0x40010000, 0x01010000, 0x41000040, + 0x00000000, 0x01010040, 0x00010040, 0x41010000, + 0x40010000, 0x01000000, 0x41010040, 0x40000000, + 0x40010040, 0x41000000, 0x01000000, 0x41010040, + 0x00010000, 0x01000040, 0x41000040, 0x00010040, + 0x01000040, 0x00000000, 0x41010000, 0x40000040, + 0x41000000, 0x40010040, 0x00000040, 0x01010000, + /* nibble 3 */ + 0x00100402, 0x04000400, 0x00000002, 0x04100402, + 0x00000000, 0x04100000, 0x04000402, 0x00100002, + 0x04100400, 0x04000002, 0x04000000, 0x00000402, + 0x04000002, 0x00100402, 0x00100000, 0x04000000, + 0x04100002, 0x00100400, 0x00000400, 0x00000002, + 0x00100400, 0x04000402, 0x04100000, 0x00000400, + 0x00000402, 0x00000000, 0x00100002, 0x04100400, + 0x04000400, 0x04100002, 0x04100402, 0x00100000, + 0x04100002, 0x00000402, 0x00100000, 0x04000002, + 0x00100400, 0x04000400, 0x00000002, 0x04100000, + 0x04000402, 0x00000000, 0x00000400, 0x00100002, + 0x00000000, 0x04100002, 0x04100400, 0x00000400, + 0x04000000, 0x04100402, 0x00100402, 0x00100000, + 0x04100402, 0x00000002, 0x04000400, 0x00100402, + 0x00100002, 0x00100400, 0x04100000, 0x04000402, + 0x00000402, 0x04000000, 0x04000002, 0x04100400, + /* nibble 4 */ + 0x02000000, 0x00004000, 0x00000100, 0x02004108, + 0x02004008, 0x02000100, 0x00004108, 0x02004000, + 0x00004000, 0x00000008, 0x02000008, 0x00004100, + 0x02000108, 0x02004008, 0x02004100, 0x00000000, + 0x00004100, 0x02000000, 0x00004008, 0x00000108, + 0x02000100, 0x00004108, 0x00000000, 0x02000008, + 0x00000008, 0x02000108, 0x02004108, 0x00004008, + 0x02004000, 0x00000100, 0x00000108, 0x02004100, + 0x02004100, 0x02000108, 0x00004008, 0x02004000, + 0x00004000, 0x00000008, 0x02000008, 0x02000100, + 0x02000000, 0x00004100, 0x02004108, 0x00000000, + 0x00004108, 0x02000000, 0x00000100, 0x00004008, + 0x02000108, 0x00000100, 0x00000000, 0x02004108, + 0x02004008, 0x02004100, 0x00000108, 0x00004000, + 0x00004100, 0x02004008, 0x02000100, 0x00000108, + 0x00000008, 0x00004108, 0x02004000, 0x02000008, + /* nibble 5 */ + 0x20000010, 0x00080010, 0x00000000, 0x20080800, + 0x00080010, 0x00000800, 0x20000810, 0x00080000, + 0x00000810, 0x20080810, 0x00080800, 0x20000000, + 0x20000800, 0x20000010, 0x20080000, 0x00080810, + 0x00080000, 0x20000810, 0x20080010, 0x00000000, + 0x00000800, 0x00000010, 0x20080800, 0x20080010, + 0x20080810, 0x20080000, 0x20000000, 0x00000810, + 0x00000010, 0x00080800, 0x00080810, 0x20000800, + 0x00000810, 0x20000000, 0x20000800, 0x00080810, + 0x20080800, 0x00080010, 0x00000000, 0x20000800, + 0x20000000, 0x00000800, 0x20080010, 0x00080000, + 0x00080010, 0x20080810, 0x00080800, 0x00000010, + 0x20080810, 0x00080800, 0x00080000, 0x20000810, + 0x20000010, 0x20080000, 0x00080810, 0x00000000, + 0x00000800, 0x20000010, 0x20000810, 0x20080800, + 0x20080000, 0x00000810, 0x00000010, 0x20080010, + /* nibble 6 */ + 0x00001000, 0x00000080, 0x00400080, 0x00400001, + 0x00401081, 0x00001001, 0x00001080, 0x00000000, + 0x00400000, 0x00400081, 0x00000081, 0x00401000, + 0x00000001, 0x00401080, 0x00401000, 0x00000081, + 0x00400081, 0x00001000, 0x00001001, 0x00401081, + 0x00000000, 0x00400080, 0x00400001, 0x00001080, + 0x00401001, 0x00001081, 0x00401080, 0x00000001, + 0x00001081, 0x00401001, 0x00000080, 0x00400000, + 0x00001081, 0x00401000, 0x00401001, 0x00000081, + 0x00001000, 0x00000080, 0x00400000, 0x00401001, + 0x00400081, 0x00001081, 0x00001080, 0x00000000, + 0x00000080, 0x00400001, 0x00000001, 0x00400080, + 0x00000000, 0x00400081, 0x00400080, 0x00001080, + 0x00000081, 0x00001000, 0x00401081, 0x00400000, + 0x00401080, 0x00000001, 0x00001001, 0x00401081, + 0x00400001, 0x00401080, 0x00401000, 0x00001001, + /* nibble 7 */ + 0x08200020, 0x08208000, 0x00008020, 0x00000000, + 0x08008000, 0x00200020, 0x08200000, 0x08208020, + 0x00000020, 0x08000000, 0x00208000, 0x00008020, + 0x00208020, 0x08008020, 0x08000020, 0x08200000, + 0x00008000, 0x00208020, 0x00200020, 0x08008000, + 0x08208020, 0x08000020, 0x00000000, 0x00208000, + 0x08000000, 0x00200000, 0x08008020, 0x08200020, + 0x00200000, 0x00008000, 0x08208000, 0x00000020, + 0x00200000, 0x00008000, 0x08000020, 0x08208020, + 0x00008020, 0x08000000, 0x00000000, 0x00208000, + 0x08200020, 0x08008020, 0x08008000, 0x00200020, + 0x08208000, 0x00000020, 0x00200020, 0x08008000, + 0x08208020, 0x00200000, 0x08200000, 0x08000020, + 0x00208000, 0x00008020, 0x08008020, 0x08200000, + 0x00000020, 0x08208000, 0x00208020, 0x00000000, + 0x08000000, 0x08200020, 0x00008000, 0x00208020 +}; + +__constant u32 c_skb[8][64] = +{ + /* for C bits (numbered as per FIPS 46) 1 2 3 4 5 6 */ + 0x00000000, 0x00000010, 0x20000000, 0x20000010, + 0x00010000, 0x00010010, 0x20010000, 0x20010010, + 0x00000800, 0x00000810, 0x20000800, 0x20000810, + 0x00010800, 0x00010810, 0x20010800, 0x20010810, + 0x00000020, 0x00000030, 0x20000020, 0x20000030, + 0x00010020, 0x00010030, 0x20010020, 0x20010030, + 0x00000820, 0x00000830, 0x20000820, 0x20000830, + 0x00010820, 0x00010830, 0x20010820, 0x20010830, + 0x00080000, 0x00080010, 0x20080000, 0x20080010, + 0x00090000, 0x00090010, 0x20090000, 0x20090010, + 0x00080800, 0x00080810, 0x20080800, 0x20080810, + 0x00090800, 0x00090810, 0x20090800, 0x20090810, + 0x00080020, 0x00080030, 0x20080020, 0x20080030, + 0x00090020, 0x00090030, 0x20090020, 0x20090030, + 0x00080820, 0x00080830, 0x20080820, 0x20080830, + 0x00090820, 0x00090830, 0x20090820, 0x20090830, + /* for C bits (numbered as per FIPS 46) 7 8 10 11 12 13 */ + 0x00000000, 0x02000000, 0x00002000, 0x02002000, + 0x00200000, 0x02200000, 0x00202000, 0x02202000, + 0x00000004, 0x02000004, 0x00002004, 0x02002004, + 0x00200004, 0x02200004, 0x00202004, 0x02202004, + 0x00000400, 0x02000400, 0x00002400, 0x02002400, + 0x00200400, 0x02200400, 0x00202400, 0x02202400, + 0x00000404, 0x02000404, 0x00002404, 0x02002404, + 0x00200404, 0x02200404, 0x00202404, 0x02202404, + 0x10000000, 0x12000000, 0x10002000, 0x12002000, + 0x10200000, 0x12200000, 0x10202000, 0x12202000, + 0x10000004, 0x12000004, 0x10002004, 0x12002004, + 0x10200004, 0x12200004, 0x10202004, 0x12202004, + 0x10000400, 0x12000400, 0x10002400, 0x12002400, + 0x10200400, 0x12200400, 0x10202400, 0x12202400, + 0x10000404, 0x12000404, 0x10002404, 0x12002404, + 0x10200404, 0x12200404, 0x10202404, 0x12202404, + /* for C bits (numbered as per FIPS 46) 14 15 16 17 19 20 */ + 0x00000000, 0x00000001, 0x00040000, 0x00040001, + 0x01000000, 0x01000001, 0x01040000, 0x01040001, + 0x00000002, 0x00000003, 0x00040002, 0x00040003, + 0x01000002, 0x01000003, 0x01040002, 0x01040003, + 0x00000200, 0x00000201, 0x00040200, 0x00040201, + 0x01000200, 0x01000201, 0x01040200, 0x01040201, + 0x00000202, 0x00000203, 0x00040202, 0x00040203, + 0x01000202, 0x01000203, 0x01040202, 0x01040203, + 0x08000000, 0x08000001, 0x08040000, 0x08040001, + 0x09000000, 0x09000001, 0x09040000, 0x09040001, + 0x08000002, 0x08000003, 0x08040002, 0x08040003, + 0x09000002, 0x09000003, 0x09040002, 0x09040003, + 0x08000200, 0x08000201, 0x08040200, 0x08040201, + 0x09000200, 0x09000201, 0x09040200, 0x09040201, + 0x08000202, 0x08000203, 0x08040202, 0x08040203, + 0x09000202, 0x09000203, 0x09040202, 0x09040203, + /* for C bits (numbered as per FIPS 46) 21 23 24 26 27 28 */ + 0x00000000, 0x00100000, 0x00000100, 0x00100100, + 0x00000008, 0x00100008, 0x00000108, 0x00100108, + 0x00001000, 0x00101000, 0x00001100, 0x00101100, + 0x00001008, 0x00101008, 0x00001108, 0x00101108, + 0x04000000, 0x04100000, 0x04000100, 0x04100100, + 0x04000008, 0x04100008, 0x04000108, 0x04100108, + 0x04001000, 0x04101000, 0x04001100, 0x04101100, + 0x04001008, 0x04101008, 0x04001108, 0x04101108, + 0x00020000, 0x00120000, 0x00020100, 0x00120100, + 0x00020008, 0x00120008, 0x00020108, 0x00120108, + 0x00021000, 0x00121000, 0x00021100, 0x00121100, + 0x00021008, 0x00121008, 0x00021108, 0x00121108, + 0x04020000, 0x04120000, 0x04020100, 0x04120100, + 0x04020008, 0x04120008, 0x04020108, 0x04120108, + 0x04021000, 0x04121000, 0x04021100, 0x04121100, + 0x04021008, 0x04121008, 0x04021108, 0x04121108, + /* for D bits (numbered as per FIPS 46) 1 2 3 4 5 6 */ + 0x00000000, 0x10000000, 0x00010000, 0x10010000, + 0x00000004, 0x10000004, 0x00010004, 0x10010004, + 0x20000000, 0x30000000, 0x20010000, 0x30010000, + 0x20000004, 0x30000004, 0x20010004, 0x30010004, + 0x00100000, 0x10100000, 0x00110000, 0x10110000, + 0x00100004, 0x10100004, 0x00110004, 0x10110004, + 0x20100000, 0x30100000, 0x20110000, 0x30110000, + 0x20100004, 0x30100004, 0x20110004, 0x30110004, + 0x00001000, 0x10001000, 0x00011000, 0x10011000, + 0x00001004, 0x10001004, 0x00011004, 0x10011004, + 0x20001000, 0x30001000, 0x20011000, 0x30011000, + 0x20001004, 0x30001004, 0x20011004, 0x30011004, + 0x00101000, 0x10101000, 0x00111000, 0x10111000, + 0x00101004, 0x10101004, 0x00111004, 0x10111004, + 0x20101000, 0x30101000, 0x20111000, 0x30111000, + 0x20101004, 0x30101004, 0x20111004, 0x30111004, + /* for D bits (numbered as per FIPS 46) 8 9 11 12 13 14 */ + 0x00000000, 0x08000000, 0x00000008, 0x08000008, + 0x00000400, 0x08000400, 0x00000408, 0x08000408, + 0x00020000, 0x08020000, 0x00020008, 0x08020008, + 0x00020400, 0x08020400, 0x00020408, 0x08020408, + 0x00000001, 0x08000001, 0x00000009, 0x08000009, + 0x00000401, 0x08000401, 0x00000409, 0x08000409, + 0x00020001, 0x08020001, 0x00020009, 0x08020009, + 0x00020401, 0x08020401, 0x00020409, 0x08020409, + 0x02000000, 0x0A000000, 0x02000008, 0x0A000008, + 0x02000400, 0x0A000400, 0x02000408, 0x0A000408, + 0x02020000, 0x0A020000, 0x02020008, 0x0A020008, + 0x02020400, 0x0A020400, 0x02020408, 0x0A020408, + 0x02000001, 0x0A000001, 0x02000009, 0x0A000009, + 0x02000401, 0x0A000401, 0x02000409, 0x0A000409, + 0x02020001, 0x0A020001, 0x02020009, 0x0A020009, + 0x02020401, 0x0A020401, 0x02020409, 0x0A020409, + /* for D bits (numbered as per FIPS 46) 16 17 18 19 20 21 */ + 0x00000000, 0x00000100, 0x00080000, 0x00080100, + 0x01000000, 0x01000100, 0x01080000, 0x01080100, + 0x00000010, 0x00000110, 0x00080010, 0x00080110, + 0x01000010, 0x01000110, 0x01080010, 0x01080110, + 0x00200000, 0x00200100, 0x00280000, 0x00280100, + 0x01200000, 0x01200100, 0x01280000, 0x01280100, + 0x00200010, 0x00200110, 0x00280010, 0x00280110, + 0x01200010, 0x01200110, 0x01280010, 0x01280110, + 0x00000200, 0x00000300, 0x00080200, 0x00080300, + 0x01000200, 0x01000300, 0x01080200, 0x01080300, + 0x00000210, 0x00000310, 0x00080210, 0x00080310, + 0x01000210, 0x01000310, 0x01080210, 0x01080310, + 0x00200200, 0x00200300, 0x00280200, 0x00280300, + 0x01200200, 0x01200300, 0x01280200, 0x01280300, + 0x00200210, 0x00200310, 0x00280210, 0x00280310, + 0x01200210, 0x01200310, 0x01280210, 0x01280310, + /* for D bits (numbered as per FIPS 46) 22 23 24 25 27 28 */ + 0x00000000, 0x04000000, 0x00040000, 0x04040000, + 0x00000002, 0x04000002, 0x00040002, 0x04040002, + 0x00002000, 0x04002000, 0x00042000, 0x04042000, + 0x00002002, 0x04002002, 0x00042002, 0x04042002, + 0x00000020, 0x04000020, 0x00040020, 0x04040020, + 0x00000022, 0x04000022, 0x00040022, 0x04040022, + 0x00002020, 0x04002020, 0x00042020, 0x04042020, + 0x00002022, 0x04002022, 0x00042022, 0x04042022, + 0x00000800, 0x04000800, 0x00040800, 0x04040800, + 0x00000802, 0x04000802, 0x00040802, 0x04040802, + 0x00002800, 0x04002800, 0x00042800, 0x04042800, + 0x00002802, 0x04002802, 0x00042802, 0x04042802, + 0x00000820, 0x04000820, 0x00040820, 0x04040820, + 0x00000822, 0x04000822, 0x00040822, 0x04040822, + 0x00002820, 0x04002820, 0x00042820, 0x04042820, + 0x00002822, 0x04002822, 0x00042822, 0x04042822 +}; + +__constant u32 shifts3s0[16] = { 1, 1, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 1 }; +__constant u32 shifts3s1[16] = { 27, 27, 26, 26, 26, 26, 26, 26, 27, 26, 26, 26, 26, 26, 26, 27 }; + +#ifdef VECT_SIZE1 +#define BOX(i,n,S) (u32x) ((S)[(n)][(i)]) +#endif + +#ifdef VECT_SIZE2 +#define BOX(i,n,S) (u32x) ((S)[(n)][(i).s0], (S)[(n)][(i).s1]) +#endif + +#ifdef VECT_SIZE4 +#define BOX(i,n,S) (u32x) ((S)[(n)][(i).s0], (S)[(n)][(i).s1], (S)[(n)][(i).s2], (S)[(n)][(i).s3]) +#endif + +static void _des_crypt_keysetup (u32x c, u32x d, u32x Kc[16], u32x Kd[16], __local u32 s_skb[8][64]) +{ + u32x tt; + + PERM_OP (d, c, tt, 4, 0x0f0f0f0f); + HPERM_OP (c, tt, 2, 0xcccc0000); + HPERM_OP (d, tt, 2, 0xcccc0000); + PERM_OP (d, c, tt, 1, 0x55555555); + PERM_OP (c, d, tt, 8, 0x00ff00ff); + PERM_OP (d, c, tt, 1, 0x55555555); + + d = ((d & 0x000000ff) << 16) + | ((d & 0x0000ff00) << 0) + | ((d & 0x00ff0000) >> 16) + | ((c & 0xf0000000) >> 4); + + c = c & 0x0fffffff; + + #pragma unroll + for (u32 i = 0; i < 16; i++) + { + c = c >> shifts3s0[i] | c << shifts3s1[i]; + d = d >> shifts3s0[i] | d << shifts3s1[i]; + + c = c & 0x0fffffff; + d = d & 0x0fffffff; + + const u32x c00 = (c >> 0) & 0x0000003f; + const u32x c06 = (c >> 6) & 0x00383003; + const u32x c07 = (c >> 7) & 0x0000003c; + const u32x c13 = (c >> 13) & 0x0000060f; + const u32x c20 = (c >> 20) & 0x00000001; + + u32x s = BOX (((c00 >> 0) & 0xff), 0, s_skb) + | BOX (((c06 >> 0) & 0xff) + |((c07 >> 0) & 0xff), 1, s_skb) + | BOX (((c13 >> 0) & 0xff) + |((c06 >> 8) & 0xff), 2, s_skb) + | BOX (((c20 >> 0) & 0xff) + |((c13 >> 8) & 0xff) + |((c06 >> 16) & 0xff), 3, s_skb); + + const u32x d00 = (d >> 0) & 0x00003c3f; + const u32x d07 = (d >> 7) & 0x00003f03; + const u32x d21 = (d >> 21) & 0x0000000f; + const u32x d22 = (d >> 22) & 0x00000030; + + u32x t = BOX (((d00 >> 0) & 0xff), 4, s_skb) + | BOX (((d07 >> 0) & 0xff) + |((d00 >> 8) & 0xff), 5, s_skb) + | BOX (((d07 >> 8) & 0xff), 6, s_skb) + | BOX (((d21 >> 0) & 0xff) + |((d22 >> 0) & 0xff), 7, s_skb); + + Kc[i] = ((t << 16) | (s & 0x0000ffff)); + Kd[i] = ((s >> 16) | (t & 0xffff0000)); + } +} + +static void _des_crypt_encrypt (u32x iv[2], u32 mask, u32x Kc[16], u32x Kd[16], __local u32 s_SPtrans[8][64]) +{ + const u32 E1 = (mask >> 2) & 0x3f0; + const u32 E0 = mask & 0x3f; + + u32x r = 0; + u32x l = 0; + + for (u32 i = 0; i < 25; i++) + { + for (u32 j = 0; j < 16; j += 2) + { + u32x t; + u32x u; + + t = r ^ (r >> 16); + u = t & E0; + t = t & E1; + u = u ^ (u << 16); + u = u ^ r; + u = u ^ Kc[j + 0]; + t = t ^ (t << 16); + t = t ^ r; + t = rotl32 (t, 28u); + t = t ^ Kd[j + 0]; + + l = l + ^ BOX (amd_bfe (u, 0, 6), 0, s_SPtrans) + ^ BOX (amd_bfe (u, 8, 6), 2, s_SPtrans) + ^ BOX (amd_bfe (u, 16, 6), 4, s_SPtrans) + ^ BOX (amd_bfe (u, 24, 6), 6, s_SPtrans) + ^ BOX (amd_bfe (t, 0, 6), 1, s_SPtrans) + ^ BOX (amd_bfe (t, 8, 6), 3, s_SPtrans) + ^ BOX (amd_bfe (t, 16, 6), 5, s_SPtrans) + ^ BOX (amd_bfe (t, 24, 6), 7, s_SPtrans); + + t = l ^ (l >> 16); + u = t & E0; + t = t & E1; + u = u ^ (u << 16); + u = u ^ l; + u = u ^ Kc[j + 1]; + t = t ^ (t << 16); + t = t ^ l; + t = rotl32 (t, 28u); + t = t ^ Kd[j + 1]; + + r = r + ^ BOX (amd_bfe (u, 0, 6), 0, s_SPtrans) + ^ BOX (amd_bfe (u, 8, 6), 2, s_SPtrans) + ^ BOX (amd_bfe (u, 16, 6), 4, s_SPtrans) + ^ BOX (amd_bfe (u, 24, 6), 6, s_SPtrans) + ^ BOX (amd_bfe (t, 0, 6), 1, s_SPtrans) + ^ BOX (amd_bfe (t, 8, 6), 3, s_SPtrans) + ^ BOX (amd_bfe (t, 16, 6), 5, s_SPtrans) + ^ BOX (amd_bfe (t, 24, 6), 7, s_SPtrans); + } + + u32x tt; + + tt = l; + l = r; + r = tt; + } + + iv[0] = rotl32 (r, 31); + iv[1] = rotl32 (l, 31); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m01500_m04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = 0; + wordl0[3] = 0; + + u32x wordl1[4]; + + wordl1[0] = 0; + wordl1[1] = 0; + wordl1[2] = 0; + wordl1[3] = 0; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, combs_buf[0].pw_len); + } + + /** + * modifier + */ + + __local u32 s_SPtrans[8][64]; + + __local u32 s_skb[8][64]; + + s_SPtrans[0][lid] = c_SPtrans[0][lid]; + s_SPtrans[1][lid] = c_SPtrans[1][lid]; + s_SPtrans[2][lid] = c_SPtrans[2][lid]; + s_SPtrans[3][lid] = c_SPtrans[3][lid]; + s_SPtrans[4][lid] = c_SPtrans[4][lid]; + s_SPtrans[5][lid] = c_SPtrans[5][lid]; + s_SPtrans[6][lid] = c_SPtrans[6][lid]; + s_SPtrans[7][lid] = c_SPtrans[7][lid]; + + s_skb[0][lid] = c_skb[0][lid]; + s_skb[1][lid] = c_skb[1][lid]; + s_skb[2][lid] = c_skb[2][lid]; + s_skb[3][lid] = c_skb[3][lid]; + s_skb[4][lid] = c_skb[4][lid]; + s_skb[5][lid] = c_skb[5][lid]; + s_skb[6][lid] = c_skb[6][lid]; + s_skb[7][lid] = c_skb[7][lid]; + + barrier (CLK_LOCAL_MEM_FENCE); + + if (gid >= gid_max) return; + + /** + * salt + */ + + const u32 mask = salt_bufs[salt_pos].salt_buf[0]; + + /** + * main + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = combs_buf[il_pos].pw_len; + + u32 pw_len = pw_l_len + pw_r_len; + + pw_len = (pw_len >= 8) ? 8 : pw_len; + + u32 wordr0[4]; + + wordr0[0] = combs_buf[il_pos].i[0]; + wordr0[1] = combs_buf[il_pos].i[1]; + wordr0[2] = 0; + wordr0[3] = 0; + + u32 wordr1[4]; + + wordr1[0] = 0; + wordr1[1] = 0; + wordr1[2] = 0; + wordr1[3] = 0; + + u32 wordr2[4]; + + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + + u32 wordr3[4]; + + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + u32x w0[4]; + + w0[0] = wordl0[0] | wordr0[0]; + w0[1] = wordl0[1] | wordr0[1]; + w0[2] = 0; + w0[3] = 0; + + u32x w1[4]; + + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + u32x data[2]; + + data[0] = (w0[0] << 1) & 0xfefefefe; + data[1] = (w0[1] << 1) & 0xfefefefe; + + u32x Kc[16]; + u32x Kd[16]; + + _des_crypt_keysetup (data[0], data[1], Kc, Kd, s_skb); + + u32x iv[2]; + + _des_crypt_encrypt (iv, mask, Kc, Kd, s_SPtrans); + + const u32x r0 = iv[0]; + const u32x r1 = iv[1]; + const u32x r2 = 0; + const u32x r3 = 0; + + #include VECT_COMPARE_M + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m01500_m08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m01500_m16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m01500_s04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = 0; + wordl0[3] = 0; + + u32x wordl1[4]; + + wordl1[0] = 0; + wordl1[1] = 0; + wordl1[2] = 0; + wordl1[3] = 0; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, combs_buf[0].pw_len); + } + + /** + * modifier + */ + + __local u32 s_SPtrans[8][64]; + + __local u32 s_skb[8][64]; + + s_SPtrans[0][lid] = c_SPtrans[0][lid]; + s_SPtrans[1][lid] = c_SPtrans[1][lid]; + s_SPtrans[2][lid] = c_SPtrans[2][lid]; + s_SPtrans[3][lid] = c_SPtrans[3][lid]; + s_SPtrans[4][lid] = c_SPtrans[4][lid]; + s_SPtrans[5][lid] = c_SPtrans[5][lid]; + s_SPtrans[6][lid] = c_SPtrans[6][lid]; + s_SPtrans[7][lid] = c_SPtrans[7][lid]; + + s_skb[0][lid] = c_skb[0][lid]; + s_skb[1][lid] = c_skb[1][lid]; + s_skb[2][lid] = c_skb[2][lid]; + s_skb[3][lid] = c_skb[3][lid]; + s_skb[4][lid] = c_skb[4][lid]; + s_skb[5][lid] = c_skb[5][lid]; + s_skb[6][lid] = c_skb[6][lid]; + s_skb[7][lid] = c_skb[7][lid]; + + barrier (CLK_LOCAL_MEM_FENCE); + + if (gid >= gid_max) return; + + /** + * salt + */ + + const u32 mask = salt_bufs[salt_pos].salt_buf[0]; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * main + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = combs_buf[il_pos].pw_len; + + u32 pw_len = pw_l_len + pw_r_len; + + pw_len = (pw_len >= 8) ? 8 : pw_len; + + u32 wordr0[4]; + + wordr0[0] = combs_buf[il_pos].i[0]; + wordr0[1] = combs_buf[il_pos].i[1]; + wordr0[2] = 0; + wordr0[3] = 0; + + u32 wordr1[4]; + + wordr1[0] = 0; + wordr1[1] = 0; + wordr1[2] = 0; + wordr1[3] = 0; + + u32 wordr2[4]; + + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + + u32 wordr3[4]; + + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + u32x w0[4]; + + w0[0] = wordl0[0] | wordr0[0]; + w0[1] = wordl0[1] | wordr0[1]; + w0[2] = 0; + w0[3] = 0; + + u32x w1[4]; + + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + u32x data[2]; + + data[0] = (w0[0] << 1) & 0xfefefefe; + data[1] = (w0[1] << 1) & 0xfefefefe; + + u32x Kc[16]; + u32x Kd[16]; + + _des_crypt_keysetup (data[0], data[1], Kc, Kd, s_skb); + + u32x iv[2]; + + _des_crypt_encrypt (iv, mask, Kc, Kd, s_SPtrans); + + const u32x r0 = iv[0]; + const u32x r1 = iv[1]; + const u32x r2 = 0; + const u32x r3 = 0; + + #include VECT_COMPARE_S + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m01500_s08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m01500_s16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/amd/m01500_a3.cl b/amd/m01500_a3.cl new file mode 100644 index 0000000000..3967673e17 --- /dev/null +++ b/amd/m01500_a3.cl @@ -0,0 +1,1712 @@ +/** + * Author......: Jens Steube + * License.....: MIT + * NOTE........: sboxes were taken from JtR, license below + */ + +#define _DES_ +#define _SCALAR_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW4 +#define VECT_SIZE1 +#endif + +#ifdef VLIW5 +#define VECT_SIZE1 +#endif + +#define DGST_R0 0 +#define DGST_R1 1 +#define DGST_R2 2 +#define DGST_R3 3 + +#include "include/kernel_functions.c" +#include "types_amd.c" +#include "common_amd.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4_warp_bs.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4_warp_bs.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4_warp_bs.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4_warp_bs.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4_warp_bs.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4_warp_bs.c" +#endif + +#define KXX_DECL volatile +#define sXXX_DECL volatile + +//#define myselx(a,b,c) ((c) ? (b) : (a)) +//#define myselx(a,b,c) ((b & c) | (a & ~c)) +#define myselx(a,b,c) bitselect ((a), (b), (c)) + +/* + * Bitslice DES S-boxes making use of a vector conditional select operation + * (e.g., vsel on PowerPC with AltiVec). + * + * Gate counts: 36 33 33 26 35 34 34 32 + * Average: 32.875 + * + * Several same-gate-count expressions for each S-box are included (for use on + * different CPUs/GPUs). + * + * These Boolean expressions corresponding to DES S-boxes have been generated + * by Roman Rusakov for use in Openwall's + * John the Ripper password cracker: http://www.openwall.com/john/ + * Being mathematical formulas, they are not copyrighted and are free for reuse + * by anyone. + * + * This file (a specific representation of the S-box expressions, surrounding + * logic) is Copyright (c) 2011 by Solar Designer . + * Redistribution and use in source and binary forms, with or without + * modification, are permitted. (This is a heavily cut-down "BSD license".) + * + * The effort has been sponsored by Rapid7: http://www.rapid7.com + */ + +#define vnot(dst, a) (dst) = ~(a) +#define vand(dst, a, b) (dst) = (a) & (b) +#define vor(dst, a, b) (dst) = (a) | (b) +#define vandn(dst, a, b) (dst) = (a) & ~(b) +#define vxor(dst, a, b) (dst) = (a) ^ (b) +#define vsel(dst, a, b, c) (dst) = bitselect((a),(b),(c)) + +static void +s1(u32 a1, u32 a2, u32 a3, u32 a4, u32 a5, u32 a6, + u32 * out1, u32 * out2, u32 * out3, u32 * out4) +{ + u32 x0F0F3333, x3C3C3C3C, x55FF55FF, x69C369C3, x0903B73F, x09FCB7C0, + x5CA9E295; + u32 x55AFD1B7, x3C3C69C3, x6993B874; + u32 x5CEDE59F, x09FCE295, x5D91A51E, x529E962D; + u32 x29EEADC0, x4B8771A3, x428679F3, x6B68D433; + u32 x5BA7E193, x026F12F3, x6B27C493, x94D83B6C; + u32 x965E0B0F, x3327A113, x847F0A1F, xD6E19C32; + u32 x0DBCE883, x3A25A215, x37994A96; + u32 x8A487EA7, x8B480F07, xB96C2D16; + u32 x0, x1, x2, x3; + + vsel(x0F0F3333, a3, a2, a5); + vxor(x3C3C3C3C, a2, a3); + vor(x55FF55FF, a1, a4); + vxor(x69C369C3, x3C3C3C3C, x55FF55FF); + vsel(x0903B73F, a5, x0F0F3333, x69C369C3); + vxor(x09FCB7C0, a4, x0903B73F); + vxor(x5CA9E295, a1, x09FCB7C0); + + vsel(x55AFD1B7, x5CA9E295, x55FF55FF, x0F0F3333); + vsel(x3C3C69C3, x3C3C3C3C, x69C369C3, a5); + vxor(x6993B874, x55AFD1B7, x3C3C69C3); + + vsel(x5CEDE59F, x55FF55FF, x5CA9E295, x6993B874); + vsel(x09FCE295, x09FCB7C0, x5CA9E295, a5); + vsel(x5D91A51E, x5CEDE59F, x6993B874, x09FCE295); + vxor(x529E962D, x0F0F3333, x5D91A51E); + + vsel(x29EEADC0, x69C369C3, x09FCB7C0, x5CEDE59F); + vsel(x4B8771A3, x0F0F3333, x69C369C3, x5CA9E295); + vsel(x428679F3, a5, x4B8771A3, x529E962D); + vxor(x6B68D433, x29EEADC0, x428679F3); + + vsel(x5BA7E193, x5CA9E295, x4B8771A3, a3); + vsel(x026F12F3, a4, x0F0F3333, x529E962D); + vsel(x6B27C493, x6B68D433, x5BA7E193, x026F12F3); + vnot(x94D83B6C, x6B27C493); + vsel(x0, x94D83B6C, x6B68D433, a6); + vxor(*out1, *out1, x0); + + vsel(x965E0B0F, x94D83B6C, a3, x428679F3); + vsel(x3327A113, x5BA7E193, a2, x69C369C3); + vsel(x847F0A1F, x965E0B0F, a4, x3327A113); + vxor(xD6E19C32, x529E962D, x847F0A1F); + vsel(x1, xD6E19C32, x5CA9E295, a6); + vxor(*out2, *out2, x1); + + vsel(x0DBCE883, x09FCE295, x3C3C69C3, x847F0A1F); + vsel(x3A25A215, x3327A113, x5CA9E295, x0903B73F); + vxor(x37994A96, x0DBCE883, x3A25A215); + vsel(x3, x37994A96, x529E962D, a6); + vxor(*out4, *out4, x3); + + vxor(x8A487EA7, x5CA9E295, xD6E19C32); + vsel(x8B480F07, a3, x8A487EA7, x847F0A1F); + vsel(xB96C2D16, x8B480F07, x3C3C3C3C, x3A25A215); + vsel(x2, xB96C2D16, x6993B874, a6); + vxor(*out3, *out3, x2); +} + +static void +s2(u32 a1, u32 a2, u32 a3, u32 a4, u32 a5, u32 a6, + u32 * out1, u32 * out2, u32 * out3, u32 * out4) +{ + u32 x55553333, x0055FF33, x33270F03, x66725A56, x00FFFF00, x668DA556; + u32 x0F0F5A56, xF0F0A5A9, xA5A5969A, xA55A699A; + u32 x0F5AF03C, x6600FF56, x87A5F09C; + u32 xA55A963C, x3C69C30F, xB44BC32D; + u32 x66D7CC56, x0F4B0F2D, x699CC37B, x996C66D2; + u32 xB46C662D, x278DB412, xB66CB43B; + u32 xD2DC4E52, x27993333, xD2994E33; + u32 x278D0F2D, x2E0E547B, x09976748; + u32 x0, x1, x2, x3; + + vsel(x55553333, a1, a3, a6); + vsel(x0055FF33, a6, x55553333, a5); + vsel(x33270F03, a3, a4, x0055FF33); + vxor(x66725A56, a1, x33270F03); + vxor(x00FFFF00, a5, a6); + vxor(x668DA556, x66725A56, x00FFFF00); + + vsel(x0F0F5A56, a4, x66725A56, a6); + vnot(xF0F0A5A9, x0F0F5A56); + vxor(xA5A5969A, x55553333, xF0F0A5A9); + vxor(xA55A699A, x00FFFF00, xA5A5969A); + vsel(x1, xA55A699A, x668DA556, a2); + vxor(*out2, *out2, x1); + + vxor(x0F5AF03C, a4, x0055FF33); + vsel(x6600FF56, x66725A56, a6, x00FFFF00); + vsel(x87A5F09C, xA5A5969A, x0F5AF03C, x6600FF56); + + vsel(xA55A963C, xA5A5969A, x0F5AF03C, a5); + vxor(x3C69C30F, a3, x0F5AF03C); + vsel(xB44BC32D, xA55A963C, x3C69C30F, a1); + + vsel(x66D7CC56, x66725A56, x668DA556, xA5A5969A); + vsel(x0F4B0F2D, a4, xB44BC32D, a5); + vxor(x699CC37B, x66D7CC56, x0F4B0F2D); + vxor(x996C66D2, xF0F0A5A9, x699CC37B); + vsel(x0, x996C66D2, xB44BC32D, a2); + vxor(*out1, *out1, x0); + + vsel(xB46C662D, xB44BC32D, x996C66D2, x00FFFF00); + vsel(x278DB412, x668DA556, xA5A5969A, a1); + vsel(xB66CB43B, xB46C662D, x278DB412, x6600FF56); + + vsel(xD2DC4E52, x66D7CC56, x996C66D2, xB44BC32D); + vsel(x27993333, x278DB412, a3, x0055FF33); + vsel(xD2994E33, xD2DC4E52, x27993333, a5); + vsel(x3, x87A5F09C, xD2994E33, a2); + vxor(*out4, *out4, x3); + + vsel(x278D0F2D, x278DB412, x0F4B0F2D, a6); + vsel(x2E0E547B, x0F0F5A56, xB66CB43B, x278D0F2D); + vxor(x09976748, x27993333, x2E0E547B); + vsel(x2, xB66CB43B, x09976748, a2); + vxor(*out3, *out3, x2); +} + +static void +s3(u32 a1, u32 a2, u32 a3, u32 a4, u32 a5, u32 a6, + u32 * out1, u32 * out2, u32 * out3, u32 * out4) +{ + u32 x0F330F33, x0F33F0CC, x5A66A599; + u32 x2111B7BB, x03FF3033, x05BB50EE, x074F201F, x265E97A4; + u32 x556BA09E, x665A93AC, x99A56C53; + u32 x25A1A797, x5713754C, x66559355, x47B135C6; + u32 x9A5A5C60, xD07AF8F8, x87698DB4, xE13C1EE1; + u32 x9E48CDE4, x655B905E, x00A55CFF, x9E49915E; + u32 xD6599874, x05330022, xD2699876; + u32 x665F9364, xD573F0F2, xB32C6396; + u32 x0, x1, x2, x3; + + vsel(x0F330F33, a4, a3, a5); + vxor(x0F33F0CC, a6, x0F330F33); + vxor(x5A66A599, a2, x0F33F0CC); + + vsel(x2111B7BB, a3, a6, x5A66A599); + vsel(x03FF3033, a5, a3, x0F33F0CC); + vsel(x05BB50EE, a5, x0F33F0CC, a2); + vsel(x074F201F, x03FF3033, a4, x05BB50EE); + vxor(x265E97A4, x2111B7BB, x074F201F); + + vsel(x556BA09E, x5A66A599, x05BB50EE, a4); + vsel(x665A93AC, x556BA09E, x265E97A4, a3); + vnot(x99A56C53, x665A93AC); + vsel(x1, x265E97A4, x99A56C53, a1); + vxor(*out2, *out2, x1); + + vxor(x25A1A797, x03FF3033, x265E97A4); + vsel(x5713754C, a2, x0F33F0CC, x074F201F); + vsel(x66559355, x665A93AC, a2, a5); + vsel(x47B135C6, x25A1A797, x5713754C, x66559355); + + vxor(x9A5A5C60, x03FF3033, x99A56C53); + vsel(xD07AF8F8, x9A5A5C60, x556BA09E, x5A66A599); + vxor(x87698DB4, x5713754C, xD07AF8F8); + vxor(xE13C1EE1, x66559355, x87698DB4); + + vsel(x9E48CDE4, x9A5A5C60, x87698DB4, x265E97A4); + vsel(x655B905E, x66559355, x05BB50EE, a4); + vsel(x00A55CFF, a5, a6, x9A5A5C60); + vsel(x9E49915E, x9E48CDE4, x655B905E, x00A55CFF); + vsel(x0, x9E49915E, xE13C1EE1, a1); + vxor(*out1, *out1, x0); + + vsel(xD6599874, xD07AF8F8, x66559355, x0F33F0CC); + vand(x05330022, x0F330F33, x05BB50EE); + vsel(xD2699876, xD6599874, x00A55CFF, x05330022); + vsel(x3, x5A66A599, xD2699876, a1); + vxor(*out4, *out4, x3); + + vsel(x665F9364, x265E97A4, x66559355, x47B135C6); + vsel(xD573F0F2, xD07AF8F8, x05330022, a4); + vxor(xB32C6396, x665F9364, xD573F0F2); + vsel(x2, xB32C6396, x47B135C6, a1); + vxor(*out3, *out3, x2); +} + +static void +s4(u32 a1, u32 a2, u32 a3, u32 a4, u32 a5, u32 a6, + u32 * out1, u32 * out2, u32 * out3, u32 * out4) +{ + u32 x0505AFAF, x0555AF55, x0A5AA05A, x46566456, x0A0A5F5F, x0AF55FA0, + x0AF50F0F, x4CA36B59; + u32 xB35C94A6; + u32 x01BB23BB, x5050FAFA, xA31C26BE, xA91679E1; + u32 x56E9861E; + u32 x50E9FA1E, x0AF55F00, x827D9784, xD2946D9A; + u32 x31F720B3, x11FB21B3, x4712A7AD, x9586CA37; + u32 x0, x1, x2, x3; + + vsel(x0505AFAF, a5, a3, a1); + vsel(x0555AF55, x0505AFAF, a1, a4); + vxor(x0A5AA05A, a3, x0555AF55); + vsel(x46566456, a1, x0A5AA05A, a2); + vsel(x0A0A5F5F, a3, a5, a1); + vxor(x0AF55FA0, a4, x0A0A5F5F); + vsel(x0AF50F0F, x0AF55FA0, a3, a5); + vxor(x4CA36B59, x46566456, x0AF50F0F); + + vnot(xB35C94A6, x4CA36B59); + + vsel(x01BB23BB, a4, a2, x0555AF55); + vxor(x5050FAFA, a1, x0505AFAF); + vsel(xA31C26BE, xB35C94A6, x01BB23BB, x5050FAFA); + vxor(xA91679E1, x0A0A5F5F, xA31C26BE); + + vnot(x56E9861E, xA91679E1); + + vsel(x50E9FA1E, x5050FAFA, x56E9861E, a4); + vsel(x0AF55F00, x0AF50F0F, x0AF55FA0, x0A0A5F5F); + vsel(x827D9784, xB35C94A6, x0AF55F00, a2); + vxor(xD2946D9A, x50E9FA1E, x827D9784); + vsel(x2, xD2946D9A, x4CA36B59, a6); + vxor(*out3, *out3, x2); + vsel(x3, xB35C94A6, xD2946D9A, a6); + vxor(*out4, *out4, x3); + + vsel(x31F720B3, a2, a4, x0AF55FA0); + vsel(x11FB21B3, x01BB23BB, x31F720B3, x5050FAFA); + vxor(x4712A7AD, x56E9861E, x11FB21B3); + vxor(x9586CA37, xD2946D9A, x4712A7AD); + vsel(x0, x56E9861E, x9586CA37, a6); + vxor(*out1, *out1, x0); + vsel(x1, x9586CA37, xA91679E1, a6); + vxor(*out2, *out2, x1); +} + +static void +s5(u32 a1, u32 a2, u32 a3, u32 a4, u32 a5, u32 a6, + u32 * out1, u32 * out2, u32 * out3, u32 * out4) +{ + u32 x550F550F, xAAF0AAF0, xA5F5A5F5, x96C696C6, x00FFFF00, x963969C6; + u32 x2E3C2E3C, xB73121F7, x1501DF0F, x00558A5F, x2E69A463; + u32 x0679ED42, x045157FD, xB32077FF, x9D49D39C; + u32 xAC81CFB2, xF72577AF, x5BA4B81D; + u32 x5BA477AF, x4895469F, x3A35273A, x1A35669A; + u32 x12E6283D, x9E47D3D4, x1A676AB4; + u32 x891556DF, xE5E77F82, x6CF2295D; + u32 x2E3CA5F5, x9697C1C6, x369CC1D6; + u32 x0, x1, x2, x3; + + vsel(x550F550F, a1, a3, a5); + vnot(xAAF0AAF0, x550F550F); + vsel(xA5F5A5F5, xAAF0AAF0, a1, a3); + vxor(x96C696C6, a2, xA5F5A5F5); + vxor(x00FFFF00, a5, a6); + vxor(x963969C6, x96C696C6, x00FFFF00); + + vsel(x2E3C2E3C, a3, xAAF0AAF0, a2); + vsel(xB73121F7, a2, x963969C6, x96C696C6); + vsel(x1501DF0F, a6, x550F550F, xB73121F7); + vsel(x00558A5F, x1501DF0F, a5, a1); + vxor(x2E69A463, x2E3C2E3C, x00558A5F); + + vsel(x0679ED42, x00FFFF00, x2E69A463, x96C696C6); + vsel(x045157FD, a6, a1, x0679ED42); + vsel(xB32077FF, xB73121F7, a6, x045157FD); + vxor(x9D49D39C, x2E69A463, xB32077FF); + vsel(x2, x9D49D39C, x2E69A463, a4); + vxor(*out3, *out3, x2); + + vsel(xAC81CFB2, xAAF0AAF0, x1501DF0F, x0679ED42); + vsel(xF72577AF, xB32077FF, x550F550F, a1); + vxor(x5BA4B81D, xAC81CFB2, xF72577AF); + vsel(x1, x5BA4B81D, x963969C6, a4); + vxor(*out2, *out2, x1); + + vsel(x5BA477AF, x5BA4B81D, xF72577AF, a6); + vsel(x4895469F, x5BA477AF, x00558A5F, a2); + vsel(x3A35273A, x2E3C2E3C, a2, x963969C6); + vsel(x1A35669A, x4895469F, x3A35273A, x5BA4B81D); + + vsel(x12E6283D, a5, x5BA4B81D, x963969C6); + vsel(x9E47D3D4, x96C696C6, x9D49D39C, xAC81CFB2); + vsel(x1A676AB4, x12E6283D, x9E47D3D4, x4895469F); + + vsel(x891556DF, xB32077FF, x4895469F, x3A35273A); + vsel(xE5E77F82, xF72577AF, x00FFFF00, x12E6283D); + vxor(x6CF2295D, x891556DF, xE5E77F82); + vsel(x3, x1A35669A, x6CF2295D, a4); + vxor(*out4, *out4, x3); + + vsel(x2E3CA5F5, x2E3C2E3C, xA5F5A5F5, a6); + vsel(x9697C1C6, x96C696C6, x963969C6, x045157FD); + vsel(x369CC1D6, x2E3CA5F5, x9697C1C6, x5BA477AF); + vsel(x0, x369CC1D6, x1A676AB4, a4); + vxor(*out1, *out1, x0); +} + +static void +s6(u32 a1, u32 a2, u32 a3, u32 a4, u32 a5, u32 a6, + u32 * out1, u32 * out2, u32 * out3, u32 * out4) +{ + u32 x555500FF, x666633CC, x606F30CF, x353A659A, x353A9A65, xCAC5659A; + u32 x353A6565, x0A3F0A6F, x6C5939A3, x5963A3C6; + u32 x35FF659A, x3AF06A95, x05CF0A9F, x16E94A97; + u32 x86CD4C9B, x12E0FFFD, x942D9A67; + u32 x142956AB, x455D45DF, x1C3EE619; + u32 x2AEA70D5, x20CF7A9F, x3CF19C86, x69A49C79; + u32 x840DBB67, x6DA19C1E, x925E63E1; + u32 x9C3CA761, x257A75D5, xB946D2B4; + u32 x0, x1, x2, x3; + + vsel(x555500FF, a1, a4, a5); + vxor(x666633CC, a2, x555500FF); + vsel(x606F30CF, x666633CC, a4, a3); + vxor(x353A659A, a1, x606F30CF); + vxor(x353A9A65, a5, x353A659A); + vnot(xCAC5659A, x353A9A65); + + vsel(x353A6565, x353A659A, x353A9A65, a4); + vsel(x0A3F0A6F, a3, a4, x353A6565); + vxor(x6C5939A3, x666633CC, x0A3F0A6F); + vxor(x5963A3C6, x353A9A65, x6C5939A3); + + vsel(x35FF659A, a4, x353A659A, x353A6565); + vxor(x3AF06A95, a3, x35FF659A); + vsel(x05CF0A9F, a4, a3, x353A9A65); + vsel(x16E94A97, x3AF06A95, x05CF0A9F, x6C5939A3); + + vsel(x86CD4C9B, xCAC5659A, x05CF0A9F, x6C5939A3); + vsel(x12E0FFFD, a5, x3AF06A95, x16E94A97); + vsel(x942D9A67, x86CD4C9B, x353A9A65, x12E0FFFD); + vsel(x0, xCAC5659A, x942D9A67, a6); + vxor(*out1, *out1, x0); + + vsel(x142956AB, x353A659A, x942D9A67, a2); + vsel(x455D45DF, a1, x86CD4C9B, x142956AB); + vxor(x1C3EE619, x5963A3C6, x455D45DF); + vsel(x3, x5963A3C6, x1C3EE619, a6); + vxor(*out4, *out4, x3); + + vsel(x2AEA70D5, x3AF06A95, x606F30CF, x353A9A65); + vsel(x20CF7A9F, x2AEA70D5, x05CF0A9F, x0A3F0A6F); + vxor(x3CF19C86, x1C3EE619, x20CF7A9F); + vxor(x69A49C79, x555500FF, x3CF19C86); + + vsel(x840DBB67, a5, x942D9A67, x86CD4C9B); + vsel(x6DA19C1E, x69A49C79, x3CF19C86, x840DBB67); + vnot(x925E63E1, x6DA19C1E); + vsel(x1, x925E63E1, x69A49C79, a6); + vxor(*out2, *out2, x1); + + vsel(x9C3CA761, x840DBB67, x1C3EE619, x3CF19C86); + vsel(x257A75D5, x455D45DF, x2AEA70D5, x606F30CF); + vxor(xB946D2B4, x9C3CA761, x257A75D5); + vsel(x2, x16E94A97, xB946D2B4, a6); + vxor(*out3, *out3, x2); +} + +static void +s7(u32 a1, u32 a2, u32 a3, u32 a4, u32 a5, u32 a6, + u32 * out1, u32 * out2, u32 * out3, u32 * out4) +{ + u32 x44447777, x4B4B7878, x22772277, x0505F5F5, x220522F5, x694E5A8D; + u32 x00FFFF00, x66666666, x32353235, x26253636, x26DAC936; + u32 x738F9C63, x11EF9867, x26DA9867; + u32 x4B4B9C63, x4B666663, x4E639396; + u32 x4E4B393C, xFF00FF00, xFF05DD21, xB14EE41D; + u32 xD728827B, x6698807B, x699C585B; + u32 x738C847B, xA4A71E18, x74878E78; + u32 x333D9639, x74879639, x8B7869C6; + u32 x0, x1, x2, x3; + + vsel(x44447777, a2, a6, a3); + vxor(x4B4B7878, a4, x44447777); + vsel(x22772277, a3, a5, a2); + vsel(x0505F5F5, a6, a2, a4); + vsel(x220522F5, x22772277, x0505F5F5, a5); + vxor(x694E5A8D, x4B4B7878, x220522F5); + + vxor(x00FFFF00, a5, a6); + vxor(x66666666, a2, a3); + vsel(x32353235, a3, x220522F5, a4); + vsel(x26253636, x66666666, x32353235, x4B4B7878); + vxor(x26DAC936, x00FFFF00, x26253636); + vsel(x0, x26DAC936, x694E5A8D, a1); + vxor(*out1, *out1, x0); + + vxor(x738F9C63, a2, x26DAC936); + vsel(x11EF9867, x738F9C63, a5, x66666666); + vsel(x26DA9867, x26DAC936, x11EF9867, a6); + + vsel(x4B4B9C63, x4B4B7878, x738F9C63, a6); + vsel(x4B666663, x4B4B9C63, x66666666, x00FFFF00); + vxor(x4E639396, x0505F5F5, x4B666663); + + vsel(x4E4B393C, x4B4B7878, x4E639396, a2); + vnot(xFF00FF00, a5); + vsel(xFF05DD21, xFF00FF00, x738F9C63, x32353235); + vxor(xB14EE41D, x4E4B393C, xFF05DD21); + vsel(x1, xB14EE41D, x26DA9867, a1); + vxor(*out2, *out2, x1); + + vxor(xD728827B, x66666666, xB14EE41D); + vsel(x6698807B, x26DA9867, xD728827B, x4E4B393C); + vsel(x699C585B, x6698807B, x694E5A8D, xFF05DD21); + vsel(x2, x699C585B, x4E639396, a1); + vxor(*out3, *out3, x2); + + vsel(x738C847B, x738F9C63, xD728827B, x4B4B7878); + vxor(xA4A71E18, x738F9C63, xD728827B); + vsel(x74878E78, x738C847B, xA4A71E18, a4); + + vsel(x333D9639, x32353235, x738C847B, xB14EE41D); + vsel(x74879639, x74878E78, x333D9639, a6); + vnot(x8B7869C6, x74879639); + vsel(x3, x74878E78, x8B7869C6, a1); + vxor(*out4, *out4, x3); +} + +static void +s8(u32 a1, u32 a2, u32 a3, u32 a4, u32 a5, u32 a6, + u32 * out1, u32 * out2, u32 * out3, u32 * out4) +{ + u32 x0505F5F5, x05FAF50A, x0F0F00FF, x22227777, x07DA807F, x34E9B34C; + u32 x00FFF00F, x0033FCCF, x5565B15C, x0C0C3F3F, x59698E63; + u32 x3001F74E, x30555745, x693CD926; + u32 x0C0CD926, x0C3F25E9, x38D696A5; + u32 xC729695A; + u32 x03D2117B, xC778395B, xCB471CB2; + u32 x5425B13F, x56B3803F, x919AE965; + u32 x17B3023F, x75555755, x62E6556A, xA59E6C31; + u32 x0, x1, x2, x3; + + vsel(x0505F5F5, a5, a1, a3); + vxor(x05FAF50A, a4, x0505F5F5); + vsel(x0F0F00FF, a3, a4, a5); + vsel(x22227777, a2, a5, a1); + vsel(x07DA807F, x05FAF50A, x0F0F00FF, x22227777); + vxor(x34E9B34C, a2, x07DA807F); + + vsel(x00FFF00F, x05FAF50A, a4, a3); + vsel(x0033FCCF, a5, x00FFF00F, a2); + vsel(x5565B15C, a1, x34E9B34C, x0033FCCF); + vsel(x0C0C3F3F, a3, a5, a2); + vxor(x59698E63, x5565B15C, x0C0C3F3F); + + vsel(x3001F74E, x34E9B34C, a5, x05FAF50A); + vsel(x30555745, x3001F74E, a1, x00FFF00F); + vxor(x693CD926, x59698E63, x30555745); + vsel(x2, x693CD926, x59698E63, a6); + vxor(*out3, *out3, x2); + + vsel(x0C0CD926, x0C0C3F3F, x693CD926, a5); + vxor(x0C3F25E9, x0033FCCF, x0C0CD926); + vxor(x38D696A5, x34E9B34C, x0C3F25E9); + + vnot(xC729695A, x38D696A5); + + vsel(x03D2117B, x07DA807F, a2, x0C0CD926); + vsel(xC778395B, xC729695A, x03D2117B, x30555745); + vxor(xCB471CB2, x0C3F25E9, xC778395B); + vsel(x1, xCB471CB2, x34E9B34C, a6); + vxor(*out2, *out2, x1); + + vsel(x5425B13F, x5565B15C, x0C0C3F3F, x03D2117B); + vsel(x56B3803F, x07DA807F, x5425B13F, x59698E63); + vxor(x919AE965, xC729695A, x56B3803F); + vsel(x3, xC729695A, x919AE965, a6); + vxor(*out4, *out4, x3); + + vsel(x17B3023F, x07DA807F, a2, x59698E63); + vor(x75555755, a1, x30555745); + vxor(x62E6556A, x17B3023F, x75555755); + vxor(xA59E6C31, xC778395B, x62E6556A); + vsel(x0, xA59E6C31, x38D696A5, a6); + vxor(*out1, *out1, x0); +} + +#define SWAP(a, b) { u32 tmp=a;a=b;b=tmp; } + +#define DATASWAP \ + SWAP(D00, D32); \ + SWAP(D01, D33); \ + SWAP(D02, D34); \ + SWAP(D03, D35); \ + SWAP(D04, D36); \ + SWAP(D05, D37); \ + SWAP(D06, D38); \ + SWAP(D07, D39); \ + SWAP(D08, D40); \ + SWAP(D09, D41); \ + SWAP(D10, D42); \ + SWAP(D11, D43); \ + SWAP(D12, D44); \ + SWAP(D13, D45); \ + SWAP(D14, D46); \ + SWAP(D15, D47); \ + SWAP(D16, D48); \ + SWAP(D17, D49); \ + SWAP(D18, D50); \ + SWAP(D19, D51); \ + SWAP(D20, D52); \ + SWAP(D21, D53); \ + SWAP(D22, D54); \ + SWAP(D23, D55); \ + SWAP(D24, D56); \ + SWAP(D25, D57); \ + SWAP(D26, D58); \ + SWAP(D27, D59); \ + SWAP(D28, D60); \ + SWAP(D29, D61); \ + SWAP(D30, D62); \ + SWAP(D31, D63); + +#define KEYSET00 { k00 = K08; k01 = K44; k02 = K29; k03 = K52; k04 = K42; k05 = K14; k06 = K28; k07 = K49; k08 = K01; k09 = K07; k10 = K16; k11 = K36; k12 = K02; k13 = K30; k14 = K22; k15 = K21; k16 = K38; k17 = K50; k18 = K51; k19 = K00; k20 = K31; k21 = K23; k22 = K15; k23 = K35; k24 = K19; k25 = K24; k26 = K34; k27 = K47; k28 = K32; k29 = K03; k30 = K41; k31 = K26; k32 = K04; k33 = K46; k34 = K20; k35 = K25; k36 = K53; k37 = K18; k38 = K33; k39 = K55; k40 = K13; k41 = K17; k42 = K39; k43 = K12; k44 = K11; k45 = K54; k46 = K48; k47 = K27; } +#define KEYSET10 { k00 = K49; k01 = K28; k02 = K45; k03 = K36; k04 = K01; k05 = K30; k06 = K44; k07 = K08; k08 = K42; k09 = K23; k10 = K00; k11 = K52; k12 = K43; k13 = K14; k14 = K38; k15 = K37; k16 = K22; k17 = K09; k18 = K35; k19 = K16; k20 = K15; k21 = K07; k22 = K31; k23 = K51; k24 = K03; k25 = K40; k26 = K46; k27 = K04; k28 = K20; k29 = K19; k30 = K53; k31 = K10; k32 = K47; k33 = K34; k34 = K32; k35 = K13; k36 = K41; k37 = K06; k38 = K17; k39 = K12; k40 = K25; k41 = K33; k42 = K27; k43 = K55; k44 = K54; k45 = K11; k46 = K05; k47 = K39; } +#define KEYSET01 { k00 = K01; k01 = K37; k02 = K22; k03 = K45; k04 = K35; k05 = K07; k06 = K21; k07 = K42; k08 = K51; k09 = K00; k10 = K09; k11 = K29; k12 = K52; k13 = K23; k14 = K15; k15 = K14; k16 = K31; k17 = K43; k18 = K44; k19 = K50; k20 = K49; k21 = K16; k22 = K08; k23 = K28; k24 = K12; k25 = K17; k26 = K27; k27 = K40; k28 = K25; k29 = K55; k30 = K34; k31 = K19; k32 = K24; k33 = K39; k34 = K13; k35 = K18; k36 = K46; k37 = K11; k38 = K26; k39 = K48; k40 = K06; k41 = K10; k42 = K32; k43 = K05; k44 = K04; k45 = K47; k46 = K41; k47 = K20; } +#define KEYSET11 { k00 = K35; k01 = K14; k02 = K31; k03 = K22; k04 = K44; k05 = K16; k06 = K30; k07 = K51; k08 = K28; k09 = K09; k10 = K43; k11 = K38; k12 = K29; k13 = K00; k14 = K49; k15 = K23; k16 = K08; k17 = K52; k18 = K21; k19 = K02; k20 = K01; k21 = K50; k22 = K42; k23 = K37; k24 = K48; k25 = K26; k26 = K32; k27 = K17; k28 = K06; k29 = K05; k30 = K39; k31 = K55; k32 = K33; k33 = K20; k34 = K18; k35 = K54; k36 = K27; k37 = K47; k38 = K03; k39 = K53; k40 = K11; k41 = K19; k42 = K13; k43 = K41; k44 = K40; k45 = K24; k46 = K46; k47 = K25; } +#define KEYSET02 { k00 = K44; k01 = K23; k02 = K08; k03 = K31; k04 = K21; k05 = K50; k06 = K07; k07 = K28; k08 = K37; k09 = K43; k10 = K52; k11 = K15; k12 = K38; k13 = K09; k14 = K01; k15 = K00; k16 = K42; k17 = K29; k18 = K30; k19 = K36; k20 = K35; k21 = K02; k22 = K51; k23 = K14; k24 = K53; k25 = K03; k26 = K13; k27 = K26; k28 = K11; k29 = K41; k30 = K20; k31 = K05; k32 = K10; k33 = K25; k34 = K54; k35 = K04; k36 = K32; k37 = K24; k38 = K12; k39 = K34; k40 = K47; k41 = K55; k42 = K18; k43 = K46; k44 = K17; k45 = K33; k46 = K27; k47 = K06; } +#define KEYSET12 { k00 = K21; k01 = K00; k02 = K42; k03 = K08; k04 = K30; k05 = K02; k06 = K16; k07 = K37; k08 = K14; k09 = K52; k10 = K29; k11 = K49; k12 = K15; k13 = K43; k14 = K35; k15 = K09; k16 = K51; k17 = K38; k18 = K07; k19 = K45; k20 = K44; k21 = K36; k22 = K28; k23 = K23; k24 = K34; k25 = K12; k26 = K18; k27 = K03; k28 = K47; k29 = K46; k30 = K25; k31 = K41; k32 = K19; k33 = K06; k34 = K04; k35 = K40; k36 = K13; k37 = K33; k38 = K48; k39 = K39; k40 = K24; k41 = K05; k42 = K54; k43 = K27; k44 = K26; k45 = K10; k46 = K32; k47 = K11; } +#define KEYSET03 { k00 = K30; k01 = K09; k02 = K51; k03 = K42; k04 = K07; k05 = K36; k06 = K50; k07 = K14; k08 = K23; k09 = K29; k10 = K38; k11 = K01; k12 = K49; k13 = K52; k14 = K44; k15 = K43; k16 = K28; k17 = K15; k18 = K16; k19 = K22; k20 = K21; k21 = K45; k22 = K37; k23 = K00; k24 = K39; k25 = K48; k26 = K54; k27 = K12; k28 = K24; k29 = K27; k30 = K06; k31 = K46; k32 = K55; k33 = K11; k34 = K40; k35 = K17; k36 = K18; k37 = K10; k38 = K53; k39 = K20; k40 = K33; k41 = K41; k42 = K04; k43 = K32; k44 = K03; k45 = K19; k46 = K13; k47 = K47; } +#define KEYSET13 { k00 = K07; k01 = K43; k02 = K28; k03 = K51; k04 = K16; k05 = K45; k06 = K02; k07 = K23; k08 = K00; k09 = K38; k10 = K15; k11 = K35; k12 = K01; k13 = K29; k14 = K21; k15 = K52; k16 = K37; k17 = K49; k18 = K50; k19 = K31; k20 = K30; k21 = K22; k22 = K14; k23 = K09; k24 = K20; k25 = K53; k26 = K04; k27 = K48; k28 = K33; k29 = K32; k30 = K11; k31 = K27; k32 = K05; k33 = K47; k34 = K17; k35 = K26; k36 = K54; k37 = K19; k38 = K34; k39 = K25; k40 = K10; k41 = K46; k42 = K40; k43 = K13; k44 = K12; k45 = K55; k46 = K18; k47 = K24; } +#define KEYSET04 { k00 = K16; k01 = K52; k02 = K37; k03 = K28; k04 = K50; k05 = K22; k06 = K36; k07 = K00; k08 = K09; k09 = K15; k10 = K49; k11 = K44; k12 = K35; k13 = K38; k14 = K30; k15 = K29; k16 = K14; k17 = K01; k18 = K02; k19 = K08; k20 = K07; k21 = K31; k22 = K23; k23 = K43; k24 = K25; k25 = K34; k26 = K40; k27 = K53; k28 = K10; k29 = K13; k30 = K47; k31 = K32; k32 = K41; k33 = K24; k34 = K26; k35 = K03; k36 = K04; k37 = K55; k38 = K39; k39 = K06; k40 = K19; k41 = K27; k42 = K17; k43 = K18; k44 = K48; k45 = K05; k46 = K54; k47 = K33; } +#define KEYSET14 { k00 = K50; k01 = K29; k02 = K14; k03 = K37; k04 = K02; k05 = K31; k06 = K45; k07 = K09; k08 = K43; k09 = K49; k10 = K01; k11 = K21; k12 = K44; k13 = K15; k14 = K07; k15 = K38; k16 = K23; k17 = K35; k18 = K36; k19 = K42; k20 = K16; k21 = K08; k22 = K00; k23 = K52; k24 = K06; k25 = K39; k26 = K17; k27 = K34; k28 = K19; k29 = K18; k30 = K24; k31 = K13; k32 = K46; k33 = K33; k34 = K03; k35 = K12; k36 = K40; k37 = K05; k38 = K20; k39 = K11; k40 = K55; k41 = K32; k42 = K26; k43 = K54; k44 = K53; k45 = K41; k46 = K04; k47 = K10; } +#define KEYSET05 { k00 = K02; k01 = K38; k02 = K23; k03 = K14; k04 = K36; k05 = K08; k06 = K22; k07 = K43; k08 = K52; k09 = K01; k10 = K35; k11 = K30; k12 = K21; k13 = K49; k14 = K16; k15 = K15; k16 = K00; k17 = K44; k18 = K45; k19 = K51; k20 = K50; k21 = K42; k22 = K09; k23 = K29; k24 = K11; k25 = K20; k26 = K26; k27 = K39; k28 = K55; k29 = K54; k30 = K33; k31 = K18; k32 = K27; k33 = K10; k34 = K12; k35 = K48; k36 = K17; k37 = K41; k38 = K25; k39 = K47; k40 = K05; k41 = K13; k42 = K03; k43 = K04; k44 = K34; k45 = K46; k46 = K40; k47 = K19; } +#define KEYSET15 { k00 = K36; k01 = K15; k02 = K00; k03 = K23; k04 = K45; k05 = K42; k06 = K31; k07 = K52; k08 = K29; k09 = K35; k10 = K44; k11 = K07; k12 = K30; k13 = K01; k14 = K50; k15 = K49; k16 = K09; k17 = K21; k18 = K22; k19 = K28; k20 = K02; k21 = K51; k22 = K43; k23 = K38; k24 = K47; k25 = K25; k26 = K03; k27 = K20; k28 = K05; k29 = K04; k30 = K10; k31 = K54; k32 = K32; k33 = K19; k34 = K48; k35 = K53; k36 = K26; k37 = K46; k38 = K06; k39 = K24; k40 = K41; k41 = K18; k42 = K12; k43 = K40; k44 = K39; k45 = K27; k46 = K17; k47 = K55; } +#define KEYSET06 { k00 = K45; k01 = K49; k02 = K09; k03 = K00; k04 = K22; k05 = K51; k06 = K08; k07 = K29; k08 = K38; k09 = K44; k10 = K21; k11 = K16; k12 = K07; k13 = K35; k14 = K02; k15 = K01; k16 = K43; k17 = K30; k18 = K31; k19 = K37; k20 = K36; k21 = K28; k22 = K52; k23 = K15; k24 = K24; k25 = K06; k26 = K12; k27 = K25; k28 = K41; k29 = K40; k30 = K19; k31 = K04; k32 = K13; k33 = K55; k34 = K53; k35 = K34; k36 = K03; k37 = K27; k38 = K11; k39 = K33; k40 = K46; k41 = K54; k42 = K48; k43 = K17; k44 = K20; k45 = K32; k46 = K26; k47 = K05; } +#define KEYSET16 { k00 = K22; k01 = K01; k02 = K43; k03 = K09; k04 = K31; k05 = K28; k06 = K42; k07 = K38; k08 = K15; k09 = K21; k10 = K30; k11 = K50; k12 = K16; k13 = K44; k14 = K36; k15 = K35; k16 = K52; k17 = K07; k18 = K08; k19 = K14; k20 = K45; k21 = K37; k22 = K29; k23 = K49; k24 = K33; k25 = K11; k26 = K48; k27 = K06; k28 = K46; k29 = K17; k30 = K55; k31 = K40; k32 = K18; k33 = K05; k34 = K34; k35 = K39; k36 = K12; k37 = K32; k38 = K47; k39 = K10; k40 = K27; k41 = K04; k42 = K53; k43 = K26; k44 = K25; k45 = K13; k46 = K03; k47 = K41; } +#define KEYSET07 { k00 = K31; k01 = K35; k02 = K52; k03 = K43; k04 = K08; k05 = K37; k06 = K51; k07 = K15; k08 = K49; k09 = K30; k10 = K07; k11 = K02; k12 = K50; k13 = K21; k14 = K45; k15 = K44; k16 = K29; k17 = K16; k18 = K42; k19 = K23; k20 = K22; k21 = K14; k22 = K38; k23 = K01; k24 = K10; k25 = K47; k26 = K53; k27 = K11; k28 = K27; k29 = K26; k30 = K05; k31 = K17; k32 = K54; k33 = K41; k34 = K39; k35 = K20; k36 = K48; k37 = K13; k38 = K24; k39 = K19; k40 = K32; k41 = K40; k42 = K34; k43 = K03; k44 = K06; k45 = K18; k46 = K12; k47 = K46; } +#define KEYSET17 { k00 = K15; k01 = K51; k02 = K36; k03 = K02; k04 = K49; k05 = K21; k06 = K35; k07 = K31; k08 = K08; k09 = K14; k10 = K23; k11 = K43; k12 = K09; k13 = K37; k14 = K29; k15 = K28; k16 = K45; k17 = K00; k18 = K01; k19 = K07; k20 = K38; k21 = K30; k22 = K22; k23 = K42; k24 = K26; k25 = K04; k26 = K41; k27 = K54; k28 = K39; k29 = K10; k30 = K48; k31 = K33; k32 = K11; k33 = K53; k34 = K27; k35 = K32; k36 = K05; k37 = K25; k38 = K40; k39 = K03; k40 = K20; k41 = K24; k42 = K46; k43 = K19; k44 = K18; k45 = K06; k46 = K55; k47 = K34; } + +static void DESCrypt (const u32 SALT, const u32 K00, const u32 K01, const u32 K02, const u32 K03, const u32 K04, const u32 K05, const u32 K06, const u32 K07, const u32 K08, const u32 K09, const u32 K10, const u32 K11, const u32 K12, const u32 K13, const u32 K14, const u32 K15, const u32 K16, const u32 K17, const u32 K18, const u32 K19, const u32 K20, const u32 K21, const u32 K22, const u32 K23, const u32 K24, const u32 K25, const u32 K26, const u32 K27, const u32 K28, const u32 K29, const u32 K30, const u32 K31, const u32 K32, const u32 K33, const u32 K34, const u32 K35, const u32 K36, const u32 K37, const u32 K38, const u32 K39, const u32 K40, const u32 K41, const u32 K42, const u32 K43, const u32 K44, const u32 K45, const u32 K46, const u32 K47, const u32 K48, const u32 K49, const u32 K50, const u32 K51, const u32 K52, const u32 K53, const u32 K54, const u32 K55, u32 &D00, u32 &D01, u32 &D02, u32 &D03, u32 &D04, u32 &D05, u32 &D06, u32 &D07, u32 &D08, u32 &D09, u32 &D10, u32 &D11, u32 &D12, u32 &D13, u32 &D14, u32 &D15, u32 &D16, u32 &D17, u32 &D18, u32 &D19, u32 &D20, u32 &D21, u32 &D22, u32 &D23, u32 &D24, u32 &D25, u32 &D26, u32 &D27, u32 &D28, u32 &D29, u32 &D30, u32 &D31, u32 &D32, u32 &D33, u32 &D34, u32 &D35, u32 &D36, u32 &D37, u32 &D38, u32 &D39, u32 &D40, u32 &D41, u32 &D42, u32 &D43, u32 &D44, u32 &D45, u32 &D46, u32 &D47, u32 &D48, u32 &D49, u32 &D50, u32 &D51, u32 &D52, u32 &D53, u32 &D54, u32 &D55, u32 &D56, u32 &D57, u32 &D58, u32 &D59, u32 &D60, u32 &D61, u32 &D62, u32 &D63) +{ + sXXX_DECL u32 s001 = (0x001 & SALT) ? 0xffffffff : 0; + sXXX_DECL u32 s002 = (0x002 & SALT) ? 0xffffffff : 0; + sXXX_DECL u32 s004 = (0x004 & SALT) ? 0xffffffff : 0; + sXXX_DECL u32 s008 = (0x008 & SALT) ? 0xffffffff : 0; + sXXX_DECL u32 s010 = (0x010 & SALT) ? 0xffffffff : 0; + sXXX_DECL u32 s020 = (0x020 & SALT) ? 0xffffffff : 0; + sXXX_DECL u32 s040 = (0x040 & SALT) ? 0xffffffff : 0; + sXXX_DECL u32 s080 = (0x080 & SALT) ? 0xffffffff : 0; + sXXX_DECL u32 s100 = (0x100 & SALT) ? 0xffffffff : 0; + sXXX_DECL u32 s200 = (0x200 & SALT) ? 0xffffffff : 0; + sXXX_DECL u32 s400 = (0x400 & SALT) ? 0xffffffff : 0; + sXXX_DECL u32 s800 = (0x800 & SALT) ? 0xffffffff : 0; + + KXX_DECL u32 k00, k01, k02, k03, k04, k05; + KXX_DECL u32 k06, k07, k08, k09, k10, k11; + KXX_DECL u32 k12, k13, k14, k15, k16, k17; + KXX_DECL u32 k18, k19, k20, k21, k22, k23; + KXX_DECL u32 k24, k25, k26, k27, k28, k29; + KXX_DECL u32 k30, k31, k32, k33, k34, k35; + KXX_DECL u32 k36, k37, k38, k39, k40, k41; + KXX_DECL u32 k42, k43, k44, k45, k46, k47; + + /* + * descrypt uses all zero data input, so we can optimize this first round of des + */ + + KEYSET00; + + s1(k00, k01, k02, k03, k04, k05, &D08, &D16, &D22, &D30); + s2(k06, k07, k08, k09, k10, k11, &D12, &D27, &D01, &D17); + s3(k12, k13, k14, k15, k16, k17, &D23, &D15, &D29, &D05); + s4(k18, k19, k20, k21, k22, k23, &D25, &D19, &D09, &D00); + s5(k24, k25, k26, k27, k28, k29, &D07, &D13, &D24, &D02); + s6(k30, k31, k32, k33, k34, k35, &D03, &D28, &D10, &D18); + s7(k36, k37, k38, k39, k40, k41, &D31, &D11, &D21, &D06); + s8(k42, k43, k44, k45, k46, k47, &D04, &D26, &D14, &D20); + + DATASWAP; + + for (u32 i = 1; i < 16; i++) + { + switch (i) + { + case 0: KEYSET00; break; + case 1: KEYSET01; break; + case 2: KEYSET02; break; + case 3: KEYSET03; break; + case 4: KEYSET04; break; + case 5: KEYSET05; break; + case 6: KEYSET06; break; + case 7: KEYSET07; break; + case 8: KEYSET10; break; + case 9: KEYSET11; break; + case 10: KEYSET12; break; + case 11: KEYSET13; break; + case 12: KEYSET14; break; + case 13: KEYSET15; break; + case 14: KEYSET16; break; + case 15: KEYSET17; break; + } + + s1(myselx (D63, D47, s001) ^ k00, myselx (D32, D48, s002) ^ k01, myselx (D33, D49, s004) ^ k02, myselx (D34, D50, s008) ^ k03, myselx (D35, D51, s010) ^ k04, myselx (D36, D52, s020) ^ k05, &D08, &D16, &D22, &D30); + s2(myselx (D35, D51, s040) ^ k06, myselx (D36, D52, s080) ^ k07, myselx (D37, D53, s100) ^ k08, myselx (D38, D54, s200) ^ k09, myselx (D39, D55, s400) ^ k10, myselx (D40, D56, s800) ^ k11, &D12, &D27, &D01, &D17); + s3( D39 ^ k12, D40 ^ k13, D41 ^ k14, D42 ^ k15, D43 ^ k16, D44 ^ k17, &D23, &D15, &D29, &D05); + s4( D43 ^ k18, D44 ^ k19, D45 ^ k20, D46 ^ k21, D47 ^ k22, D48 ^ k23, &D25, &D19, &D09, &D00); + s5(myselx (D47, D63, s001) ^ k24, myselx (D48, D32, s002) ^ k25, myselx (D49, D33, s004) ^ k26, myselx (D50, D34, s008) ^ k27, myselx (D51, D35, s010) ^ k28, myselx (D52, D36, s020) ^ k29, &D07, &D13, &D24, &D02); + s6(myselx (D51, D35, s040) ^ k30, myselx (D52, D36, s080) ^ k31, myselx (D53, D37, s100) ^ k32, myselx (D54, D38, s200) ^ k33, myselx (D55, D39, s400) ^ k34, myselx (D56, D40, s800) ^ k35, &D03, &D28, &D10, &D18); + s7( D55 ^ k36, D56 ^ k37, D57 ^ k38, D58 ^ k39, D59 ^ k40, D60 ^ k41, &D31, &D11, &D21, &D06); + s8( D59 ^ k42, D60 ^ k43, D61 ^ k44, D62 ^ k45, D63 ^ k46, D32 ^ k47, &D04, &D26, &D14, &D20); + + DATASWAP; + } + + DATASWAP; + + for (u32 ii = 1; ii < 25; ii++) + { + for (u32 i = 0; i < 16; i++) + { + switch (i) + { + case 0: KEYSET00; break; + case 1: KEYSET01; break; + case 2: KEYSET02; break; + case 3: KEYSET03; break; + case 4: KEYSET04; break; + case 5: KEYSET05; break; + case 6: KEYSET06; break; + case 7: KEYSET07; break; + case 8: KEYSET10; break; + case 9: KEYSET11; break; + case 10: KEYSET12; break; + case 11: KEYSET13; break; + case 12: KEYSET14; break; + case 13: KEYSET15; break; + case 14: KEYSET16; break; + case 15: KEYSET17; break; + } + + s1(myselx (D63, D47, s001) ^ k00, myselx (D32, D48, s002) ^ k01, myselx (D33, D49, s004) ^ k02, myselx (D34, D50, s008) ^ k03, myselx (D35, D51, s010) ^ k04, myselx (D36, D52, s020) ^ k05, &D08, &D16, &D22, &D30); + s2(myselx (D35, D51, s040) ^ k06, myselx (D36, D52, s080) ^ k07, myselx (D37, D53, s100) ^ k08, myselx (D38, D54, s200) ^ k09, myselx (D39, D55, s400) ^ k10, myselx (D40, D56, s800) ^ k11, &D12, &D27, &D01, &D17); + s3( D39 ^ k12, D40 ^ k13, D41 ^ k14, D42 ^ k15, D43 ^ k16, D44 ^ k17, &D23, &D15, &D29, &D05); + s4( D43 ^ k18, D44 ^ k19, D45 ^ k20, D46 ^ k21, D47 ^ k22, D48 ^ k23, &D25, &D19, &D09, &D00); + s5(myselx (D47, D63, s001) ^ k24, myselx (D48, D32, s002) ^ k25, myselx (D49, D33, s004) ^ k26, myselx (D50, D34, s008) ^ k27, myselx (D51, D35, s010) ^ k28, myselx (D52, D36, s020) ^ k29, &D07, &D13, &D24, &D02); + s6(myselx (D51, D35, s040) ^ k30, myselx (D52, D36, s080) ^ k31, myselx (D53, D37, s100) ^ k32, myselx (D54, D38, s200) ^ k33, myselx (D55, D39, s400) ^ k34, myselx (D56, D40, s800) ^ k35, &D03, &D28, &D10, &D18); + s7( D55 ^ k36, D56 ^ k37, D57 ^ k38, D58 ^ k39, D59 ^ k40, D60 ^ k41, &D31, &D11, &D21, &D06); + s8( D59 ^ k42, D60 ^ k43, D61 ^ k44, D62 ^ k45, D63 ^ k46, D32 ^ k47, &D04, &D26, &D14, &D20); + + DATASWAP; + } + + DATASWAP; + } + + DATASWAP; +} + +static void transpose32c (u32 data[32]) +{ + #define swap(x,y,j,m) \ + t = ((x) ^ ((y) >> (j))) & (m); \ + (x) = (x) ^ t; \ + (y) = (y) ^ (t << (j)); + + u32 t; + + swap (data[ 0], data[16], 16, 0x0000ffff); + swap (data[ 1], data[17], 16, 0x0000ffff); + swap (data[ 2], data[18], 16, 0x0000ffff); + swap (data[ 3], data[19], 16, 0x0000ffff); + swap (data[ 4], data[20], 16, 0x0000ffff); + swap (data[ 5], data[21], 16, 0x0000ffff); + swap (data[ 6], data[22], 16, 0x0000ffff); + swap (data[ 7], data[23], 16, 0x0000ffff); + swap (data[ 8], data[24], 16, 0x0000ffff); + swap (data[ 9], data[25], 16, 0x0000ffff); + swap (data[10], data[26], 16, 0x0000ffff); + swap (data[11], data[27], 16, 0x0000ffff); + swap (data[12], data[28], 16, 0x0000ffff); + swap (data[13], data[29], 16, 0x0000ffff); + swap (data[14], data[30], 16, 0x0000ffff); + swap (data[15], data[31], 16, 0x0000ffff); + swap (data[ 0], data[ 8], 8, 0x00ff00ff); + swap (data[ 1], data[ 9], 8, 0x00ff00ff); + swap (data[ 2], data[10], 8, 0x00ff00ff); + swap (data[ 3], data[11], 8, 0x00ff00ff); + swap (data[ 4], data[12], 8, 0x00ff00ff); + swap (data[ 5], data[13], 8, 0x00ff00ff); + swap (data[ 6], data[14], 8, 0x00ff00ff); + swap (data[ 7], data[15], 8, 0x00ff00ff); + swap (data[ 0], data[ 4], 4, 0x0f0f0f0f); + swap (data[ 1], data[ 5], 4, 0x0f0f0f0f); + swap (data[ 2], data[ 6], 4, 0x0f0f0f0f); + swap (data[ 3], data[ 7], 4, 0x0f0f0f0f); + swap (data[ 0], data[ 2], 2, 0x33333333); + swap (data[ 1], data[ 3], 2, 0x33333333); + swap (data[ 0], data[ 1], 1, 0x55555555); + swap (data[ 2], data[ 3], 1, 0x55555555); + swap (data[ 4], data[ 6], 2, 0x33333333); + swap (data[ 5], data[ 7], 2, 0x33333333); + swap (data[ 4], data[ 5], 1, 0x55555555); + swap (data[ 6], data[ 7], 1, 0x55555555); + swap (data[ 8], data[12], 4, 0x0f0f0f0f); + swap (data[ 9], data[13], 4, 0x0f0f0f0f); + swap (data[10], data[14], 4, 0x0f0f0f0f); + swap (data[11], data[15], 4, 0x0f0f0f0f); + swap (data[ 8], data[10], 2, 0x33333333); + swap (data[ 9], data[11], 2, 0x33333333); + swap (data[ 8], data[ 9], 1, 0x55555555); + swap (data[10], data[11], 1, 0x55555555); + swap (data[12], data[14], 2, 0x33333333); + swap (data[13], data[15], 2, 0x33333333); + swap (data[12], data[13], 1, 0x55555555); + swap (data[14], data[15], 1, 0x55555555); + swap (data[16], data[24], 8, 0x00ff00ff); + swap (data[17], data[25], 8, 0x00ff00ff); + swap (data[18], data[26], 8, 0x00ff00ff); + swap (data[19], data[27], 8, 0x00ff00ff); + swap (data[20], data[28], 8, 0x00ff00ff); + swap (data[21], data[29], 8, 0x00ff00ff); + swap (data[22], data[30], 8, 0x00ff00ff); + swap (data[23], data[31], 8, 0x00ff00ff); + swap (data[16], data[20], 4, 0x0f0f0f0f); + swap (data[17], data[21], 4, 0x0f0f0f0f); + swap (data[18], data[22], 4, 0x0f0f0f0f); + swap (data[19], data[23], 4, 0x0f0f0f0f); + swap (data[16], data[18], 2, 0x33333333); + swap (data[17], data[19], 2, 0x33333333); + swap (data[16], data[17], 1, 0x55555555); + swap (data[18], data[19], 1, 0x55555555); + swap (data[20], data[22], 2, 0x33333333); + swap (data[21], data[23], 2, 0x33333333); + swap (data[20], data[21], 1, 0x55555555); + swap (data[22], data[23], 1, 0x55555555); + swap (data[24], data[28], 4, 0x0f0f0f0f); + swap (data[25], data[29], 4, 0x0f0f0f0f); + swap (data[26], data[30], 4, 0x0f0f0f0f); + swap (data[27], data[31], 4, 0x0f0f0f0f); + swap (data[24], data[26], 2, 0x33333333); + swap (data[25], data[27], 2, 0x33333333); + swap (data[24], data[25], 1, 0x55555555); + swap (data[26], data[27], 1, 0x55555555); + swap (data[28], data[30], 2, 0x33333333); + swap (data[29], data[31], 2, 0x33333333); + swap (data[28], data[29], 1, 0x55555555); + swap (data[30], data[31], 1, 0x55555555); +} + +static void m01500m (__local u32 *s_S, __global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bs_word_t * words_buf_r, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + const u32 lid = get_local_id (0); + + /** + * salt + */ + + const u32 salt = salt_bufs[salt_pos].salt_buf[0]; + + /** + * keys + */ + + const u32 K00 = pws[gid].i[ 0]; + const u32 K01 = pws[gid].i[ 1]; + const u32 K02 = pws[gid].i[ 2]; + const u32 K03 = pws[gid].i[ 3]; + const u32 K04 = pws[gid].i[ 4]; + const u32 K05 = pws[gid].i[ 5]; + const u32 K06 = pws[gid].i[ 6]; + const u32 K07 = pws[gid].i[ 7]; + const u32 K08 = pws[gid].i[ 8]; + const u32 K09 = pws[gid].i[ 9]; + const u32 K10 = pws[gid].i[10]; + const u32 K11 = pws[gid].i[11]; + const u32 K12 = pws[gid].i[12]; + const u32 K13 = pws[gid].i[13]; + const u32 K14 = pws[gid].i[14]; + const u32 K15 = pws[gid].i[15]; + const u32 K16 = pws[gid].i[16]; + const u32 K17 = pws[gid].i[17]; + const u32 K18 = pws[gid].i[18]; + const u32 K19 = pws[gid].i[19]; + const u32 K20 = pws[gid].i[20]; + const u32 K21 = pws[gid].i[21]; + const u32 K22 = pws[gid].i[22]; + const u32 K23 = pws[gid].i[23]; + const u32 K24 = pws[gid].i[24]; + const u32 K25 = pws[gid].i[25]; + const u32 K26 = pws[gid].i[26]; + const u32 K27 = pws[gid].i[27]; + const u32 K28 = pws[gid].i[28]; + const u32 K29 = pws[gid].i[29]; + const u32 K30 = pws[gid].i[30]; + const u32 K31 = pws[gid].i[31]; + const u32 K32 = pws[gid].i[32]; + const u32 K33 = pws[gid].i[33]; + const u32 K34 = pws[gid].i[34]; + const u32 K35 = pws[gid].i[35]; + const u32 K36 = pws[gid].i[36]; + const u32 K37 = pws[gid].i[37]; + const u32 K38 = pws[gid].i[38]; + const u32 K39 = pws[gid].i[39]; + const u32 K40 = pws[gid].i[40]; + const u32 K41 = pws[gid].i[41]; + const u32 K42 = pws[gid].i[42]; + const u32 K43 = pws[gid].i[43]; + const u32 K44 = pws[gid].i[44]; + const u32 K45 = pws[gid].i[45]; + const u32 K46 = pws[gid].i[46]; + const u32 K47 = pws[gid].i[47]; + const u32 K48 = pws[gid].i[48]; + const u32 K49 = pws[gid].i[49]; + const u32 K50 = pws[gid].i[50]; + const u32 K51 = pws[gid].i[51]; + const u32 K52 = pws[gid].i[52]; + const u32 K53 = pws[gid].i[53]; + const u32 K54 = pws[gid].i[54]; + const u32 K55 = pws[gid].i[55]; + + /** + * inner loop + */ + + const u32 bf_loops = bfs_cnt; + + const u32 pc_pos = get_local_id (1); + + const u32 il_pos = pc_pos * 32; + + u32 k00 = K00; + u32 k01 = K01; + u32 k02 = K02; + u32 k03 = K03; + u32 k04 = K04; + u32 k05 = K05; + u32 k06 = K06; + u32 k07 = K07; + u32 k08 = K08; + u32 k09 = K09; + u32 k10 = K10; + u32 k11 = K11; + u32 k12 = K12; + u32 k13 = K13; + u32 k14 = K14; + u32 k15 = K15; + u32 k16 = K16; + u32 k17 = K17; + u32 k18 = K18; + u32 k19 = K19; + u32 k20 = K20; + u32 k21 = K21; + u32 k22 = K22; + u32 k23 = K23; + u32 k24 = K24; + u32 k25 = K25; + u32 k26 = K26; + u32 k27 = K27; + + k00 |= words_buf_r[pc_pos].b[ 0]; + k01 |= words_buf_r[pc_pos].b[ 1]; + k02 |= words_buf_r[pc_pos].b[ 2]; + k03 |= words_buf_r[pc_pos].b[ 3]; + k04 |= words_buf_r[pc_pos].b[ 4]; + k05 |= words_buf_r[pc_pos].b[ 5]; + k06 |= words_buf_r[pc_pos].b[ 6]; + k07 |= words_buf_r[pc_pos].b[ 7]; + k08 |= words_buf_r[pc_pos].b[ 8]; + k09 |= words_buf_r[pc_pos].b[ 9]; + k10 |= words_buf_r[pc_pos].b[10]; + k11 |= words_buf_r[pc_pos].b[11]; + k12 |= words_buf_r[pc_pos].b[12]; + k13 |= words_buf_r[pc_pos].b[13]; + k14 |= words_buf_r[pc_pos].b[14]; + k15 |= words_buf_r[pc_pos].b[15]; + k16 |= words_buf_r[pc_pos].b[16]; + k17 |= words_buf_r[pc_pos].b[17]; + k18 |= words_buf_r[pc_pos].b[18]; + k19 |= words_buf_r[pc_pos].b[19]; + k20 |= words_buf_r[pc_pos].b[20]; + k21 |= words_buf_r[pc_pos].b[21]; + k22 |= words_buf_r[pc_pos].b[22]; + k23 |= words_buf_r[pc_pos].b[23]; + k24 |= words_buf_r[pc_pos].b[24]; + k25 |= words_buf_r[pc_pos].b[25]; + k26 |= words_buf_r[pc_pos].b[26]; + k27 |= words_buf_r[pc_pos].b[27]; + + u32 D00 = 0; + u32 D01 = 0; + u32 D02 = 0; + u32 D03 = 0; + u32 D04 = 0; + u32 D05 = 0; + u32 D06 = 0; + u32 D07 = 0; + u32 D08 = 0; + u32 D09 = 0; + u32 D10 = 0; + u32 D11 = 0; + u32 D12 = 0; + u32 D13 = 0; + u32 D14 = 0; + u32 D15 = 0; + u32 D16 = 0; + u32 D17 = 0; + u32 D18 = 0; + u32 D19 = 0; + u32 D20 = 0; + u32 D21 = 0; + u32 D22 = 0; + u32 D23 = 0; + u32 D24 = 0; + u32 D25 = 0; + u32 D26 = 0; + u32 D27 = 0; + u32 D28 = 0; + u32 D29 = 0; + u32 D30 = 0; + u32 D31 = 0; + u32 D32 = 0; + u32 D33 = 0; + u32 D34 = 0; + u32 D35 = 0; + u32 D36 = 0; + u32 D37 = 0; + u32 D38 = 0; + u32 D39 = 0; + u32 D40 = 0; + u32 D41 = 0; + u32 D42 = 0; + u32 D43 = 0; + u32 D44 = 0; + u32 D45 = 0; + u32 D46 = 0; + u32 D47 = 0; + u32 D48 = 0; + u32 D49 = 0; + u32 D50 = 0; + u32 D51 = 0; + u32 D52 = 0; + u32 D53 = 0; + u32 D54 = 0; + u32 D55 = 0; + u32 D56 = 0; + u32 D57 = 0; + u32 D58 = 0; + u32 D59 = 0; + u32 D60 = 0; + u32 D61 = 0; + u32 D62 = 0; + u32 D63 = 0; + + DESCrypt + ( + salt, + k00, k01, k02, k03, k04, k05, k06, + k07, k08, k09, k10, k11, k12, k13, + k14, k15, k16, k17, k18, k19, k20, + k21, k22, k23, k24, k25, k26, k27, + K28, K29, K30, K31, K32, K33, K34, + K35, K36, K37, K38, K39, K40, K41, + K42, K43, K44, K45, K46, K47, K48, + K49, K50, K51, K52, K53, K54, K55, + D00, D01, D02, D03, D04, D05, D06, D07, + D08, D09, D10, D11, D12, D13, D14, D15, + D16, D17, D18, D19, D20, D21, D22, D23, + D24, D25, D26, D27, D28, D29, D30, D31, + D32, D33, D34, D35, D36, D37, D38, D39, + D40, D41, D42, D43, D44, D45, D46, D47, + D48, D49, D50, D51, D52, D53, D54, D55, + D56, D57, D58, D59, D60, D61, D62, D63 + ); + + u32 out[64]; + + out[ 0] = D00; + out[ 1] = D01; + out[ 2] = D02; + out[ 3] = D03; + out[ 4] = D04; + out[ 5] = D05; + out[ 6] = D06; + out[ 7] = D07; + out[ 8] = D08; + out[ 9] = D09; + out[10] = D10; + out[11] = D11; + out[12] = D12; + out[13] = D13; + out[14] = D14; + out[15] = D15; + out[16] = D16; + out[17] = D17; + out[18] = D18; + out[19] = D19; + out[20] = D20; + out[21] = D21; + out[22] = D22; + out[23] = D23; + out[24] = D24; + out[25] = D25; + out[26] = D26; + out[27] = D27; + out[28] = D28; + out[29] = D29; + out[30] = D30; + out[31] = D31; + out[32] = D32; + out[33] = D33; + out[34] = D34; + out[35] = D35; + out[36] = D36; + out[37] = D37; + out[38] = D38; + out[39] = D39; + out[40] = D40; + out[41] = D41; + out[42] = D42; + out[43] = D43; + out[44] = D44; + out[45] = D45; + out[46] = D46; + out[47] = D47; + out[48] = D48; + out[49] = D49; + out[50] = D50; + out[51] = D51; + out[52] = D52; + out[53] = D53; + out[54] = D54; + out[55] = D55; + out[56] = D56; + out[57] = D57; + out[58] = D58; + out[59] = D59; + out[60] = D60; + out[61] = D61; + out[62] = D62; + out[63] = D63; + + if (digests_cnt < 16) + { + for (u32 d = 0; d < digests_cnt; d++) + { + const u32 final_hash_pos = digests_offset + d; + + if (hashes_shown[final_hash_pos]) continue; + + u32 search[2]; + + search[0] = digests_buf[final_hash_pos].digest_buf[DGST_R0]; + search[1] = digests_buf[final_hash_pos].digest_buf[DGST_R1]; + + u32 tmpResult = 0; + + #pragma unroll + for (int i = 0; i < 32; i++) + { + const u32 b0 = -((search[0] >> i) & 1); + const u32 b1 = -((search[1] >> i) & 1); + + tmpResult |= out[ 0 + i] ^ b0; + tmpResult |= out[32 + i] ^ b1; + } + + if (tmpResult == 0xffffffff) continue; + + const u32 slice = 31 - clz (~tmpResult); + + const u32x r0 = search[0]; + const u32x r1 = search[1]; + const u32x r2 = 0; + const u32x r3 = 0; + + #include VECT_COMPARE_M + } + } + else + { + u32 out0[32]; + u32 out1[32]; + + #pragma unroll + for (int i = 0; i < 32; i++) + { + out0[i] = out[ 0 + 31 - i]; + out1[i] = out[32 + 31 - i]; + } + + transpose32c (out0); + transpose32c (out1); + + #pragma unroll + for (int slice = 0; slice < 32; slice++) + { + const u32x r0 = out0[31 - slice]; + const u32x r1 = out1[31 - slice]; + const u32x r2 = 0; + const u32x r3 = 0; + + #include VECT_COMPARE_M + } + } +} + +static void m01500s (__local u32 *s_S, __global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bs_word_t * words_buf_r, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + const u32 lid = get_local_id (0); + + /** + * salt + */ + + const u32 salt = salt_bufs[salt_pos].salt_buf[0]; + + /** + * digest + */ + + #define S00 s_S[ 0] + #define S01 s_S[ 1] + #define S02 s_S[ 2] + #define S03 s_S[ 3] + #define S04 s_S[ 4] + #define S05 s_S[ 5] + #define S06 s_S[ 6] + #define S07 s_S[ 7] + #define S08 s_S[ 8] + #define S09 s_S[ 9] + #define S10 s_S[10] + #define S11 s_S[11] + #define S12 s_S[12] + #define S13 s_S[13] + #define S14 s_S[14] + #define S15 s_S[15] + #define S16 s_S[16] + #define S17 s_S[17] + #define S18 s_S[18] + #define S19 s_S[19] + #define S20 s_S[20] + #define S21 s_S[21] + #define S22 s_S[22] + #define S23 s_S[23] + #define S24 s_S[24] + #define S25 s_S[25] + #define S26 s_S[26] + #define S27 s_S[27] + #define S28 s_S[28] + #define S29 s_S[29] + #define S30 s_S[30] + #define S31 s_S[31] + #define S32 s_S[32] + #define S33 s_S[33] + #define S34 s_S[34] + #define S35 s_S[35] + #define S36 s_S[36] + #define S37 s_S[37] + #define S38 s_S[38] + #define S39 s_S[39] + #define S40 s_S[40] + #define S41 s_S[41] + #define S42 s_S[42] + #define S43 s_S[43] + #define S44 s_S[44] + #define S45 s_S[45] + #define S46 s_S[46] + #define S47 s_S[47] + #define S48 s_S[48] + #define S49 s_S[49] + #define S50 s_S[50] + #define S51 s_S[51] + #define S52 s_S[52] + #define S53 s_S[53] + #define S54 s_S[54] + #define S55 s_S[55] + #define S56 s_S[56] + #define S57 s_S[57] + #define S58 s_S[58] + #define S59 s_S[59] + #define S60 s_S[60] + #define S61 s_S[61] + #define S62 s_S[62] + #define S63 s_S[63] + + /** + * keys + */ + + const u32 K00 = pws[gid].i[ 0]; + const u32 K01 = pws[gid].i[ 1]; + const u32 K02 = pws[gid].i[ 2]; + const u32 K03 = pws[gid].i[ 3]; + const u32 K04 = pws[gid].i[ 4]; + const u32 K05 = pws[gid].i[ 5]; + const u32 K06 = pws[gid].i[ 6]; + const u32 K07 = pws[gid].i[ 7]; + const u32 K08 = pws[gid].i[ 8]; + const u32 K09 = pws[gid].i[ 9]; + const u32 K10 = pws[gid].i[10]; + const u32 K11 = pws[gid].i[11]; + const u32 K12 = pws[gid].i[12]; + const u32 K13 = pws[gid].i[13]; + const u32 K14 = pws[gid].i[14]; + const u32 K15 = pws[gid].i[15]; + const u32 K16 = pws[gid].i[16]; + const u32 K17 = pws[gid].i[17]; + const u32 K18 = pws[gid].i[18]; + const u32 K19 = pws[gid].i[19]; + const u32 K20 = pws[gid].i[20]; + const u32 K21 = pws[gid].i[21]; + const u32 K22 = pws[gid].i[22]; + const u32 K23 = pws[gid].i[23]; + const u32 K24 = pws[gid].i[24]; + const u32 K25 = pws[gid].i[25]; + const u32 K26 = pws[gid].i[26]; + const u32 K27 = pws[gid].i[27]; + const u32 K28 = pws[gid].i[28]; + const u32 K29 = pws[gid].i[29]; + const u32 K30 = pws[gid].i[30]; + const u32 K31 = pws[gid].i[31]; + const u32 K32 = pws[gid].i[32]; + const u32 K33 = pws[gid].i[33]; + const u32 K34 = pws[gid].i[34]; + const u32 K35 = pws[gid].i[35]; + const u32 K36 = pws[gid].i[36]; + const u32 K37 = pws[gid].i[37]; + const u32 K38 = pws[gid].i[38]; + const u32 K39 = pws[gid].i[39]; + const u32 K40 = pws[gid].i[40]; + const u32 K41 = pws[gid].i[41]; + const u32 K42 = pws[gid].i[42]; + const u32 K43 = pws[gid].i[43]; + const u32 K44 = pws[gid].i[44]; + const u32 K45 = pws[gid].i[45]; + const u32 K46 = pws[gid].i[46]; + const u32 K47 = pws[gid].i[47]; + const u32 K48 = pws[gid].i[48]; + const u32 K49 = pws[gid].i[49]; + const u32 K50 = pws[gid].i[50]; + const u32 K51 = pws[gid].i[51]; + const u32 K52 = pws[gid].i[52]; + const u32 K53 = pws[gid].i[53]; + const u32 K54 = pws[gid].i[54]; + const u32 K55 = pws[gid].i[55]; + + /** + * inner loop + */ + + const u32 pc_pos = get_local_id (1); + + const u32 il_pos = pc_pos * 32; + + u32 k00 = K00; + u32 k01 = K01; + u32 k02 = K02; + u32 k03 = K03; + u32 k04 = K04; + u32 k05 = K05; + u32 k06 = K06; + u32 k07 = K07; + u32 k08 = K08; + u32 k09 = K09; + u32 k10 = K10; + u32 k11 = K11; + u32 k12 = K12; + u32 k13 = K13; + u32 k14 = K14; + u32 k15 = K15; + u32 k16 = K16; + u32 k17 = K17; + u32 k18 = K18; + u32 k19 = K19; + u32 k20 = K20; + u32 k21 = K21; + u32 k22 = K22; + u32 k23 = K23; + u32 k24 = K24; + u32 k25 = K25; + u32 k26 = K26; + u32 k27 = K27; + + k00 |= words_buf_r[pc_pos].b[ 0]; + k01 |= words_buf_r[pc_pos].b[ 1]; + k02 |= words_buf_r[pc_pos].b[ 2]; + k03 |= words_buf_r[pc_pos].b[ 3]; + k04 |= words_buf_r[pc_pos].b[ 4]; + k05 |= words_buf_r[pc_pos].b[ 5]; + k06 |= words_buf_r[pc_pos].b[ 6]; + k07 |= words_buf_r[pc_pos].b[ 7]; + k08 |= words_buf_r[pc_pos].b[ 8]; + k09 |= words_buf_r[pc_pos].b[ 9]; + k10 |= words_buf_r[pc_pos].b[10]; + k11 |= words_buf_r[pc_pos].b[11]; + k12 |= words_buf_r[pc_pos].b[12]; + k13 |= words_buf_r[pc_pos].b[13]; + k14 |= words_buf_r[pc_pos].b[14]; + k15 |= words_buf_r[pc_pos].b[15]; + k16 |= words_buf_r[pc_pos].b[16]; + k17 |= words_buf_r[pc_pos].b[17]; + k18 |= words_buf_r[pc_pos].b[18]; + k19 |= words_buf_r[pc_pos].b[19]; + k20 |= words_buf_r[pc_pos].b[20]; + k21 |= words_buf_r[pc_pos].b[21]; + k22 |= words_buf_r[pc_pos].b[22]; + k23 |= words_buf_r[pc_pos].b[23]; + k24 |= words_buf_r[pc_pos].b[24]; + k25 |= words_buf_r[pc_pos].b[25]; + k26 |= words_buf_r[pc_pos].b[26]; + k27 |= words_buf_r[pc_pos].b[27]; + + u32 D00 = 0; + u32 D01 = 0; + u32 D02 = 0; + u32 D03 = 0; + u32 D04 = 0; + u32 D05 = 0; + u32 D06 = 0; + u32 D07 = 0; + u32 D08 = 0; + u32 D09 = 0; + u32 D10 = 0; + u32 D11 = 0; + u32 D12 = 0; + u32 D13 = 0; + u32 D14 = 0; + u32 D15 = 0; + u32 D16 = 0; + u32 D17 = 0; + u32 D18 = 0; + u32 D19 = 0; + u32 D20 = 0; + u32 D21 = 0; + u32 D22 = 0; + u32 D23 = 0; + u32 D24 = 0; + u32 D25 = 0; + u32 D26 = 0; + u32 D27 = 0; + u32 D28 = 0; + u32 D29 = 0; + u32 D30 = 0; + u32 D31 = 0; + u32 D32 = 0; + u32 D33 = 0; + u32 D34 = 0; + u32 D35 = 0; + u32 D36 = 0; + u32 D37 = 0; + u32 D38 = 0; + u32 D39 = 0; + u32 D40 = 0; + u32 D41 = 0; + u32 D42 = 0; + u32 D43 = 0; + u32 D44 = 0; + u32 D45 = 0; + u32 D46 = 0; + u32 D47 = 0; + u32 D48 = 0; + u32 D49 = 0; + u32 D50 = 0; + u32 D51 = 0; + u32 D52 = 0; + u32 D53 = 0; + u32 D54 = 0; + u32 D55 = 0; + u32 D56 = 0; + u32 D57 = 0; + u32 D58 = 0; + u32 D59 = 0; + u32 D60 = 0; + u32 D61 = 0; + u32 D62 = 0; + u32 D63 = 0; + + DESCrypt + ( + salt, + k00, k01, k02, k03, k04, k05, k06, + k07, k08, k09, k10, k11, k12, k13, + k14, k15, k16, k17, k18, k19, k20, + k21, k22, k23, k24, k25, k26, k27, + K28, K29, K30, K31, K32, K33, K34, + K35, K36, K37, K38, K39, K40, K41, + K42, K43, K44, K45, K46, K47, K48, + K49, K50, K51, K52, K53, K54, K55, + D00, D01, D02, D03, D04, D05, D06, D07, + D08, D09, D10, D11, D12, D13, D14, D15, + D16, D17, D18, D19, D20, D21, D22, D23, + D24, D25, D26, D27, D28, D29, D30, D31, + D32, D33, D34, D35, D36, D37, D38, D39, + D40, D41, D42, D43, D44, D45, D46, D47, + D48, D49, D50, D51, D52, D53, D54, D55, + D56, D57, D58, D59, D60, D61, D62, D63 + ); + + u32 tmpResult = 0; + + tmpResult |= D00 ^ S00; + tmpResult |= D01 ^ S01; + tmpResult |= D02 ^ S02; + tmpResult |= D03 ^ S03; + tmpResult |= D04 ^ S04; + tmpResult |= D05 ^ S05; + tmpResult |= D06 ^ S06; + tmpResult |= D07 ^ S07; + tmpResult |= D08 ^ S08; + tmpResult |= D09 ^ S09; + tmpResult |= D10 ^ S10; + tmpResult |= D11 ^ S11; + tmpResult |= D12 ^ S12; + tmpResult |= D13 ^ S13; + tmpResult |= D14 ^ S14; + tmpResult |= D15 ^ S15; + tmpResult |= D16 ^ S16; + tmpResult |= D17 ^ S17; + tmpResult |= D18 ^ S18; + tmpResult |= D19 ^ S19; + tmpResult |= D20 ^ S20; + tmpResult |= D21 ^ S21; + tmpResult |= D22 ^ S22; + tmpResult |= D23 ^ S23; + tmpResult |= D24 ^ S24; + tmpResult |= D25 ^ S25; + tmpResult |= D26 ^ S26; + tmpResult |= D27 ^ S27; + tmpResult |= D28 ^ S28; + tmpResult |= D29 ^ S29; + tmpResult |= D30 ^ S30; + tmpResult |= D31 ^ S31; + tmpResult |= D32 ^ S32; + tmpResult |= D33 ^ S33; + tmpResult |= D34 ^ S34; + tmpResult |= D35 ^ S35; + tmpResult |= D36 ^ S36; + tmpResult |= D37 ^ S37; + tmpResult |= D38 ^ S38; + tmpResult |= D39 ^ S39; + tmpResult |= D40 ^ S40; + tmpResult |= D41 ^ S41; + tmpResult |= D42 ^ S42; + tmpResult |= D43 ^ S43; + tmpResult |= D44 ^ S44; + tmpResult |= D45 ^ S45; + tmpResult |= D46 ^ S46; + tmpResult |= D47 ^ S47; + + if (tmpResult == 0xffffffff) return; + + tmpResult |= D48 ^ S48; + tmpResult |= D49 ^ S49; + tmpResult |= D50 ^ S50; + tmpResult |= D51 ^ S51; + tmpResult |= D52 ^ S52; + tmpResult |= D53 ^ S53; + tmpResult |= D54 ^ S54; + tmpResult |= D55 ^ S55; + tmpResult |= D56 ^ S56; + tmpResult |= D57 ^ S57; + tmpResult |= D58 ^ S58; + tmpResult |= D59 ^ S59; + tmpResult |= D60 ^ S60; + tmpResult |= D61 ^ S61; + tmpResult |= D62 ^ S62; + tmpResult |= D63 ^ S63; + + if (tmpResult == 0xffffffff) return; + + const u32 slice = 31 - clz (~tmpResult); + + #include VECT_COMPARE_S +} + +// +// transpose bitslice base : easy because no overlapping buffers +// mod : attention race conditions, need different buffers for *in and *out +// + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m01500_tb (__global pw_t *pws) +{ + const u32 gid = get_global_id (0); + + const u32 w0 = pws[gid].i[0]; + const u32 w1 = pws[gid].i[1]; + + const u32 w0s = (w0 << 1) & 0xfefefefe; + const u32 w1s = (w1 << 1) & 0xfefefefe; + + #pragma unroll + for (int i = 0, j = 0; i < 32; i += 8, j += 7) + { + pws[gid].i[j + 0 + 0] = -((w0s >> (i + 7)) & 1); + pws[gid].i[j + 0 + 1] = -((w0s >> (i + 6)) & 1); + pws[gid].i[j + 0 + 2] = -((w0s >> (i + 5)) & 1); + pws[gid].i[j + 0 + 3] = -((w0s >> (i + 4)) & 1); + pws[gid].i[j + 0 + 4] = -((w0s >> (i + 3)) & 1); + pws[gid].i[j + 0 + 5] = -((w0s >> (i + 2)) & 1); + pws[gid].i[j + 0 + 6] = -((w0s >> (i + 1)) & 1); + } + + #pragma unroll + for (int i = 0, j = 0; i < 32; i += 8, j += 7) + { + pws[gid].i[j + 28 + 0] = -((w1s >> (i + 7)) & 1); + pws[gid].i[j + 28 + 1] = -((w1s >> (i + 6)) & 1); + pws[gid].i[j + 28 + 2] = -((w1s >> (i + 5)) & 1); + pws[gid].i[j + 28 + 3] = -((w1s >> (i + 4)) & 1); + pws[gid].i[j + 28 + 4] = -((w1s >> (i + 3)) & 1); + pws[gid].i[j + 28 + 5] = -((w1s >> (i + 2)) & 1); + pws[gid].i[j + 28 + 6] = -((w1s >> (i + 1)) & 1); + } +} + +__kernel void __attribute__((reqd_work_group_size (32, 1, 1))) m01500_tm (__global u32 *mod, __global bs_word_t *words_buf_r) +{ + const u32 gid = get_global_id (0); + const u32 lid = get_local_id (0); + + const u32 block = gid / 32; + const u32 slice = gid % 32; + + const u32 w0 = mod[gid]; + + const u32 w0s = (w0 << 1) & 0xfefefefe; + + #pragma unroll + for (int i = 0, j = 0; i < 32; i += 8, j += 7) + { + atomic_or (&words_buf_r[block].b[j + 0], (((w0s >> (i + 7)) & 1) << slice)); + atomic_or (&words_buf_r[block].b[j + 1], (((w0s >> (i + 6)) & 1) << slice)); + atomic_or (&words_buf_r[block].b[j + 2], (((w0s >> (i + 5)) & 1) << slice)); + atomic_or (&words_buf_r[block].b[j + 3], (((w0s >> (i + 4)) & 1) << slice)); + atomic_or (&words_buf_r[block].b[j + 4], (((w0s >> (i + 3)) & 1) << slice)); + atomic_or (&words_buf_r[block].b[j + 5], (((w0s >> (i + 2)) & 1) << slice)); + atomic_or (&words_buf_r[block].b[j + 6], (((w0s >> (i + 1)) & 1) << slice)); + } +} + +__kernel void __attribute__((reqd_work_group_size (2, 32, 1))) m01500_m04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bs_word_t * words_buf_r, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + const u32 lid = get_local_id (0); + const u32 vid = get_local_id (1); + + const u32 s0 = digests_buf[digests_offset].digest_buf[0]; + const u32 s1 = digests_buf[digests_offset].digest_buf[1]; + + __local u32 s_S[64]; + + if (lid == 0) + { + s_S[ 0 + vid] = -((s0 >> vid) & 1); + } + else if (lid == 1) + { + s_S[32 + vid] = -((s1 >> vid) & 1); + } + + barrier (CLK_LOCAL_MEM_FENCE); + + if (gid >= gid_max) return; + + /** + * main + */ + + m01500m (s_S, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +__kernel void __attribute__((reqd_work_group_size (2, 32, 1))) m01500_m08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bs_word_t * words_buf_r, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (2, 32, 1))) m01500_m16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bs_word_t * words_buf_r, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (2, 32, 1))) m01500_s04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bs_word_t * words_buf_r, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + const u32 lid = get_local_id (0); + const u32 vid = get_local_id (1); + + const u32 s0 = digests_buf[digests_offset].digest_buf[0]; + const u32 s1 = digests_buf[digests_offset].digest_buf[1]; + + __local u32 s_S[64]; + + if (lid == 0) + { + s_S[ 0 + vid] = -((s0 >> vid) & 1); + } + else if (lid == 1) + { + s_S[32 + vid] = -((s1 >> vid) & 1); + } + + barrier (CLK_LOCAL_MEM_FENCE); + + if (gid >= gid_max) return; + + /** + * main + */ + + m01500s (s_S, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +__kernel void __attribute__((reqd_work_group_size (2, 32, 1))) m01500_s08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bs_word_t * words_buf_r, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (2, 32, 1))) m01500_s16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bs_word_t * words_buf_r, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/amd/m01600.cl b/amd/m01600.cl new file mode 100644 index 0000000000..50e8e065b8 --- /dev/null +++ b/amd/m01600.cl @@ -0,0 +1,2065 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _MD5_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW4 +#define VECT_SIZE4 +#endif + +#ifdef VLIW5 +#define VECT_SIZE4 +#endif + +#define DGST_R0 0 +#define DGST_R1 1 +#define DGST_R2 2 +#define DGST_R3 3 + +#include "include/kernel_functions.c" +#include "types_amd.c" +#include "common_amd.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +#define md5apr1_magic0 0x72706124 +#define md5apr1_magic1 0x00002431 + +static void md5_transform (const u32x w0[4], const u32x w1[4], const u32x w2[4], const u32x w3[4], u32x digest[4]) +{ + u32x a = digest[0]; + u32x b = digest[1]; + u32x c = digest[2]; + u32x d = digest[3]; + + u32x w0_t = w0[0]; + u32x w1_t = w0[1]; + u32x w2_t = w0[2]; + u32x w3_t = w0[3]; + u32x w4_t = w1[0]; + u32x w5_t = w1[1]; + u32x w6_t = w1[2]; + u32x w7_t = w1[3]; + u32x w8_t = w2[0]; + u32x w9_t = w2[1]; + u32x wa_t = w2[2]; + u32x wb_t = w2[3]; + u32x wc_t = w3[0]; + u32x wd_t = w3[1]; + u32x we_t = w3[2]; + u32x wf_t = 0; + + u32x tmp2; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t, MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t, MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t, MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t, MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w4_t, MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w5_t, MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w6_t, MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w7_t, MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w8_t, MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w9_t, MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, wa_t, MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, wb_t, MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, wc_t, MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, wd_t, MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, we_t, MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, wf_t, MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w1_t, MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w6_t, MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, wb_t, MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t, MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w5_t, MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, wa_t, MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, wf_t, MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w4_t, MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w9_t, MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, we_t, MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t, MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w8_t, MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, wd_t, MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t, MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w7_t, MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, wc_t, MD5C1f, MD5S13); + + MD5_STEP (MD5_H1, a, b, c, d, w5_t, MD5C20, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w8_t, MD5C21, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, wb_t, MD5C22, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, we_t, MD5C23, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w1_t, MD5C24, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w4_t, MD5C25, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w7_t, MD5C26, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, wa_t, MD5C27, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, wd_t, MD5C28, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w0_t, MD5C29, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w3_t, MD5C2a, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w6_t, MD5C2b, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w9_t, MD5C2c, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, wc_t, MD5C2d, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, wf_t, MD5C2e, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w2_t, MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t, MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w7_t, MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, we_t, MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w5_t, MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, wc_t, MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t, MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, wa_t, MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t, MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w8_t, MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, wf_t, MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w6_t, MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, wd_t, MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w4_t, MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, wb_t, MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t, MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w9_t, MD5C3f, MD5S33); + + digest[0] += a; + digest[1] += b; + digest[2] += c; + digest[3] += d; +} + +static void memcat16 (u32x block0[4], u32x block1[4], u32x block2[4], u32x block3[4], const u32 block_len, const u32x append[4]) +{ + switch (block_len) + { + case 0: + block0[0] = append[0]; + block0[1] = append[1]; + block0[2] = append[2]; + block0[3] = append[3]; + break; + + case 1: + block0[0] = block0[0] | append[0] << 8; + block0[1] = append[0] >> 24 | append[1] << 8; + block0[2] = append[1] >> 24 | append[2] << 8; + block0[3] = append[2] >> 24 | append[3] << 8; + block1[0] = append[3] >> 24; + break; + + case 2: + block0[0] = block0[0] | append[0] << 16; + block0[1] = append[0] >> 16 | append[1] << 16; + block0[2] = append[1] >> 16 | append[2] << 16; + block0[3] = append[2] >> 16 | append[3] << 16; + block1[0] = append[3] >> 16; + break; + + case 3: + block0[0] = block0[0] | append[0] << 24; + block0[1] = append[0] >> 8 | append[1] << 24; + block0[2] = append[1] >> 8 | append[2] << 24; + block0[3] = append[2] >> 8 | append[3] << 24; + block1[0] = append[3] >> 8; + break; + + case 4: + block0[1] = append[0]; + block0[2] = append[1]; + block0[3] = append[2]; + block1[0] = append[3]; + break; + + case 5: + block0[1] = block0[1] | append[0] << 8; + block0[2] = append[0] >> 24 | append[1] << 8; + block0[3] = append[1] >> 24 | append[2] << 8; + block1[0] = append[2] >> 24 | append[3] << 8; + block1[1] = append[3] >> 24; + break; + + case 6: + block0[1] = block0[1] | append[0] << 16; + block0[2] = append[0] >> 16 | append[1] << 16; + block0[3] = append[1] >> 16 | append[2] << 16; + block1[0] = append[2] >> 16 | append[3] << 16; + block1[1] = append[3] >> 16; + break; + + case 7: + block0[1] = block0[1] | append[0] << 24; + block0[2] = append[0] >> 8 | append[1] << 24; + block0[3] = append[1] >> 8 | append[2] << 24; + block1[0] = append[2] >> 8 | append[3] << 24; + block1[1] = append[3] >> 8; + break; + + case 8: + block0[2] = append[0]; + block0[3] = append[1]; + block1[0] = append[2]; + block1[1] = append[3]; + break; + + case 9: + block0[2] = block0[2] | append[0] << 8; + block0[3] = append[0] >> 24 | append[1] << 8; + block1[0] = append[1] >> 24 | append[2] << 8; + block1[1] = append[2] >> 24 | append[3] << 8; + block1[2] = append[3] >> 24; + break; + + case 10: + block0[2] = block0[2] | append[0] << 16; + block0[3] = append[0] >> 16 | append[1] << 16; + block1[0] = append[1] >> 16 | append[2] << 16; + block1[1] = append[2] >> 16 | append[3] << 16; + block1[2] = append[3] >> 16; + break; + + case 11: + block0[2] = block0[2] | append[0] << 24; + block0[3] = append[0] >> 8 | append[1] << 24; + block1[0] = append[1] >> 8 | append[2] << 24; + block1[1] = append[2] >> 8 | append[3] << 24; + block1[2] = append[3] >> 8; + break; + + case 12: + block0[3] = append[0]; + block1[0] = append[1]; + block1[1] = append[2]; + block1[2] = append[3]; + break; + + case 13: + block0[3] = block0[3] | append[0] << 8; + block1[0] = append[0] >> 24 | append[1] << 8; + block1[1] = append[1] >> 24 | append[2] << 8; + block1[2] = append[2] >> 24 | append[3] << 8; + block1[3] = append[3] >> 24; + break; + + case 14: + block0[3] = block0[3] | append[0] << 16; + block1[0] = append[0] >> 16 | append[1] << 16; + block1[1] = append[1] >> 16 | append[2] << 16; + block1[2] = append[2] >> 16 | append[3] << 16; + block1[3] = append[3] >> 16; + break; + + case 15: + block0[3] = block0[3] | append[0] << 24; + block1[0] = append[0] >> 8 | append[1] << 24; + block1[1] = append[1] >> 8 | append[2] << 24; + block1[2] = append[2] >> 8 | append[3] << 24; + block1[3] = append[3] >> 8; + break; + + case 16: + block1[0] = append[0]; + block1[1] = append[1]; + block1[2] = append[2]; + block1[3] = append[3]; + break; + + case 17: + block1[0] = block1[0] | append[0] << 8; + block1[1] = append[0] >> 24 | append[1] << 8; + block1[2] = append[1] >> 24 | append[2] << 8; + block1[3] = append[2] >> 24 | append[3] << 8; + block2[0] = append[3] >> 24; + break; + + case 18: + block1[0] = block1[0] | append[0] << 16; + block1[1] = append[0] >> 16 | append[1] << 16; + block1[2] = append[1] >> 16 | append[2] << 16; + block1[3] = append[2] >> 16 | append[3] << 16; + block2[0] = append[3] >> 16; + break; + + case 19: + block1[0] = block1[0] | append[0] << 24; + block1[1] = append[0] >> 8 | append[1] << 24; + block1[2] = append[1] >> 8 | append[2] << 24; + block1[3] = append[2] >> 8 | append[3] << 24; + block2[0] = append[3] >> 8; + break; + + case 20: + block1[1] = append[0]; + block1[2] = append[1]; + block1[3] = append[2]; + block2[0] = append[3]; + break; + + case 21: + block1[1] = block1[1] | append[0] << 8; + block1[2] = append[0] >> 24 | append[1] << 8; + block1[3] = append[1] >> 24 | append[2] << 8; + block2[0] = append[2] >> 24 | append[3] << 8; + block2[1] = append[3] >> 24; + break; + + case 22: + block1[1] = block1[1] | append[0] << 16; + block1[2] = append[0] >> 16 | append[1] << 16; + block1[3] = append[1] >> 16 | append[2] << 16; + block2[0] = append[2] >> 16 | append[3] << 16; + block2[1] = append[3] >> 16; + break; + + case 23: + block1[1] = block1[1] | append[0] << 24; + block1[2] = append[0] >> 8 | append[1] << 24; + block1[3] = append[1] >> 8 | append[2] << 24; + block2[0] = append[2] >> 8 | append[3] << 24; + block2[1] = append[3] >> 8; + break; + + case 24: + block1[2] = append[0]; + block1[3] = append[1]; + block2[0] = append[2]; + block2[1] = append[3]; + break; + + case 25: + block1[2] = block1[2] | append[0] << 8; + block1[3] = append[0] >> 24 | append[1] << 8; + block2[0] = append[1] >> 24 | append[2] << 8; + block2[1] = append[2] >> 24 | append[3] << 8; + block2[2] = append[3] >> 24; + break; + + case 26: + block1[2] = block1[2] | append[0] << 16; + block1[3] = append[0] >> 16 | append[1] << 16; + block2[0] = append[1] >> 16 | append[2] << 16; + block2[1] = append[2] >> 16 | append[3] << 16; + block2[2] = append[3] >> 16; + break; + + case 27: + block1[2] = block1[2] | append[0] << 24; + block1[3] = append[0] >> 8 | append[1] << 24; + block2[0] = append[1] >> 8 | append[2] << 24; + block2[1] = append[2] >> 8 | append[3] << 24; + block2[2] = append[3] >> 8; + break; + + case 28: + block1[3] = append[0]; + block2[0] = append[1]; + block2[1] = append[2]; + block2[2] = append[3]; + break; + + case 29: + block1[3] = block1[3] | append[0] << 8; + block2[0] = append[0] >> 24 | append[1] << 8; + block2[1] = append[1] >> 24 | append[2] << 8; + block2[2] = append[2] >> 24 | append[3] << 8; + block2[3] = append[3] >> 24; + break; + + case 30: + block1[3] = block1[3] | append[0] << 16; + block2[0] = append[0] >> 16 | append[1] << 16; + block2[1] = append[1] >> 16 | append[2] << 16; + block2[2] = append[2] >> 16 | append[3] << 16; + block2[3] = append[3] >> 16; + break; + + case 31: + block1[3] = block1[3] | append[0] << 24; + block2[0] = append[0] >> 8 | append[1] << 24; + block2[1] = append[1] >> 8 | append[2] << 24; + block2[2] = append[2] >> 8 | append[3] << 24; + block2[3] = append[3] >> 8; + break; + + case 32: + block2[0] = append[0]; + block2[1] = append[1]; + block2[2] = append[2]; + block2[3] = append[3]; + break; + + case 33: + block2[0] = block2[0] | append[0] << 8; + block2[1] = append[0] >> 24 | append[1] << 8; + block2[2] = append[1] >> 24 | append[2] << 8; + block2[3] = append[2] >> 24 | append[3] << 8; + block3[0] = append[3] >> 24; + break; + + case 34: + block2[0] = block2[0] | append[0] << 16; + block2[1] = append[0] >> 16 | append[1] << 16; + block2[2] = append[1] >> 16 | append[2] << 16; + block2[3] = append[2] >> 16 | append[3] << 16; + block3[0] = append[3] >> 16; + break; + + case 35: + block2[0] = block2[0] | append[0] << 24; + block2[1] = append[0] >> 8 | append[1] << 24; + block2[2] = append[1] >> 8 | append[2] << 24; + block2[3] = append[2] >> 8 | append[3] << 24; + block3[0] = append[3] >> 8; + break; + + case 36: + block2[1] = append[0]; + block2[2] = append[1]; + block2[3] = append[2]; + block3[0] = append[3]; + break; + + case 37: + block2[1] = block2[1] | append[0] << 8; + block2[2] = append[0] >> 24 | append[1] << 8; + block2[3] = append[1] >> 24 | append[2] << 8; + block3[0] = append[2] >> 24 | append[3] << 8; + block3[1] = append[3] >> 24; + break; + + case 38: + block2[1] = block2[1] | append[0] << 16; + block2[2] = append[0] >> 16 | append[1] << 16; + block2[3] = append[1] >> 16 | append[2] << 16; + block3[0] = append[2] >> 16 | append[3] << 16; + block3[1] = append[3] >> 16; + break; + + case 39: + block2[1] = block2[1] | append[0] << 24; + block2[2] = append[0] >> 8 | append[1] << 24; + block2[3] = append[1] >> 8 | append[2] << 24; + block3[0] = append[2] >> 8 | append[3] << 24; + block3[1] = append[3] >> 8; + break; + + case 40: + block2[2] = append[0]; + block2[3] = append[1]; + block3[0] = append[2]; + block3[1] = append[3]; + break; + + case 41: + block2[2] = block2[2] | append[0] << 8; + block2[3] = append[0] >> 24 | append[1] << 8; + block3[0] = append[1] >> 24 | append[2] << 8; + block3[1] = append[2] >> 24 | append[3] << 8; + block3[2] = append[3] >> 24; + break; + + case 42: + block2[2] = block2[2] | append[0] << 16; + block2[3] = append[0] >> 16 | append[1] << 16; + block3[0] = append[1] >> 16 | append[2] << 16; + block3[1] = append[2] >> 16 | append[3] << 16; + block3[2] = append[3] >> 16; + break; + + case 43: + block2[2] = block2[2] | append[0] << 24; + block2[3] = append[0] >> 8 | append[1] << 24; + block3[0] = append[1] >> 8 | append[2] << 24; + block3[1] = append[2] >> 8 | append[3] << 24; + block3[2] = append[3] >> 8; + break; + + case 44: + block2[3] = append[0]; + block3[0] = append[1]; + block3[1] = append[2]; + block3[2] = append[3]; + break; + + case 45: + block2[3] = block2[3] | append[0] << 8; + block3[0] = append[0] >> 24 | append[1] << 8; + block3[1] = append[1] >> 24 | append[2] << 8; + block3[2] = append[2] >> 24 | append[3] << 8; + block3[3] = append[3] >> 24; + break; + + case 46: + block2[3] = block2[3] | append[0] << 16; + block3[0] = append[0] >> 16 | append[1] << 16; + block3[1] = append[1] >> 16 | append[2] << 16; + block3[2] = append[2] >> 16 | append[3] << 16; + block3[3] = append[3] >> 16; + break; + + case 47: + block2[3] = block2[3] | append[0] << 24; + block3[0] = append[0] >> 8 | append[1] << 24; + block3[1] = append[1] >> 8 | append[2] << 24; + block3[2] = append[2] >> 8 | append[3] << 24; + block3[3] = append[3] >> 8; + break; + + case 48: + block3[0] = append[0]; + block3[1] = append[1]; + block3[2] = append[2]; + block3[3] = append[3]; + break; + + case 49: + block3[0] = block3[0] | append[0] << 8; + block3[1] = append[0] >> 24 | append[1] << 8; + block3[2] = append[1] >> 24 | append[2] << 8; + block3[3] = append[2] >> 24 | append[3] << 8; + break; + + case 50: + block3[0] = block3[0] | append[0] << 16; + block3[1] = append[0] >> 16 | append[1] << 16; + block3[2] = append[1] >> 16 | append[2] << 16; + block3[3] = append[2] >> 16 | append[3] << 16; + break; + + case 51: + block3[0] = block3[0] | append[0] << 24; + block3[1] = append[0] >> 8 | append[1] << 24; + block3[2] = append[1] >> 8 | append[2] << 24; + block3[3] = append[2] >> 8 | append[3] << 24; + break; + + case 52: + block3[1] = append[0]; + block3[2] = append[1]; + block3[3] = append[2]; + break; + + case 53: + block3[1] = block3[1] | append[0] << 8; + block3[2] = append[0] >> 24 | append[1] << 8; + block3[3] = append[1] >> 24 | append[2] << 8; + break; + + case 54: + block3[1] = block3[1] | append[0] << 16; + block3[2] = append[0] >> 16 | append[1] << 16; + block3[3] = append[1] >> 16 | append[2] << 16; + break; + + case 55: + block3[1] = block3[1] | append[0] << 24; + block3[2] = append[0] >> 8 | append[1] << 24; + block3[3] = append[1] >> 8 | append[2] << 24; + break; + + case 56: + block3[2] = append[0]; + block3[3] = append[1]; + break; + } +} + +static void memcat16_x80 (u32x block0[4], u32x block1[4], u32x block2[4], u32x block3[4], const u32 block_len, const u32x append[4]) +{ + switch (block_len) + { + case 0: + block0[0] = append[0]; + block0[1] = append[1]; + block0[2] = append[2]; + block0[3] = append[3]; + block1[0] = 0x80; + break; + + case 1: + block0[0] = block0[0] | append[0] << 8; + block0[1] = append[0] >> 24 | append[1] << 8; + block0[2] = append[1] >> 24 | append[2] << 8; + block0[3] = append[2] >> 24 | append[3] << 8; + block1[0] = append[3] >> 24 | 0x80u << 8; + break; + + case 2: + block0[0] = block0[0] | append[0] << 16; + block0[1] = append[0] >> 16 | append[1] << 16; + block0[2] = append[1] >> 16 | append[2] << 16; + block0[3] = append[2] >> 16 | append[3] << 16; + block1[0] = append[3] >> 16 | 0x80u << 16; + break; + + case 3: + block0[0] = block0[0] | append[0] << 24; + block0[1] = append[0] >> 8 | append[1] << 24; + block0[2] = append[1] >> 8 | append[2] << 24; + block0[3] = append[2] >> 8 | append[3] << 24; + block1[0] = append[3] >> 8 | 0x80u << 24; + break; + + case 4: + block0[1] = append[0]; + block0[2] = append[1]; + block0[3] = append[2]; + block1[0] = append[3]; + block1[1] = 0x80; + break; + + case 5: + block0[1] = block0[1] | append[0] << 8; + block0[2] = append[0] >> 24 | append[1] << 8; + block0[3] = append[1] >> 24 | append[2] << 8; + block1[0] = append[2] >> 24 | append[3] << 8; + block1[1] = append[3] >> 24 | 0x80u << 8; + break; + + case 6: + block0[1] = block0[1] | append[0] << 16; + block0[2] = append[0] >> 16 | append[1] << 16; + block0[3] = append[1] >> 16 | append[2] << 16; + block1[0] = append[2] >> 16 | append[3] << 16; + block1[1] = append[3] >> 16 | 0x80u << 16; + break; + + case 7: + block0[1] = block0[1] | append[0] << 24; + block0[2] = append[0] >> 8 | append[1] << 24; + block0[3] = append[1] >> 8 | append[2] << 24; + block1[0] = append[2] >> 8 | append[3] << 24; + block1[1] = append[3] >> 8 | 0x80u << 24; + break; + + case 8: + block0[2] = append[0]; + block0[3] = append[1]; + block1[0] = append[2]; + block1[1] = append[3]; + block1[2] = 0x80; + break; + + case 9: + block0[2] = block0[2] | append[0] << 8; + block0[3] = append[0] >> 24 | append[1] << 8; + block1[0] = append[1] >> 24 | append[2] << 8; + block1[1] = append[2] >> 24 | append[3] << 8; + block1[2] = append[3] >> 24 | 0x80u << 8; + break; + + case 10: + block0[2] = block0[2] | append[0] << 16; + block0[3] = append[0] >> 16 | append[1] << 16; + block1[0] = append[1] >> 16 | append[2] << 16; + block1[1] = append[2] >> 16 | append[3] << 16; + block1[2] = append[3] >> 16 | 0x80u << 16; + break; + + case 11: + block0[2] = block0[2] | append[0] << 24; + block0[3] = append[0] >> 8 | append[1] << 24; + block1[0] = append[1] >> 8 | append[2] << 24; + block1[1] = append[2] >> 8 | append[3] << 24; + block1[2] = append[3] >> 8 | 0x80u << 24; + break; + + case 12: + block0[3] = append[0]; + block1[0] = append[1]; + block1[1] = append[2]; + block1[2] = append[3]; + block1[3] = 0x80; + break; + + case 13: + block0[3] = block0[3] | append[0] << 8; + block1[0] = append[0] >> 24 | append[1] << 8; + block1[1] = append[1] >> 24 | append[2] << 8; + block1[2] = append[2] >> 24 | append[3] << 8; + block1[3] = append[3] >> 24 | 0x80u << 8; + break; + + case 14: + block0[3] = block0[3] | append[0] << 16; + block1[0] = append[0] >> 16 | append[1] << 16; + block1[1] = append[1] >> 16 | append[2] << 16; + block1[2] = append[2] >> 16 | append[3] << 16; + block1[3] = append[3] >> 16 | 0x80u << 16; + break; + + case 15: + block0[3] = block0[3] | append[0] << 24; + block1[0] = append[0] >> 8 | append[1] << 24; + block1[1] = append[1] >> 8 | append[2] << 24; + block1[2] = append[2] >> 8 | append[3] << 24; + block1[3] = append[3] >> 8 | 0x80u << 24; + break; + + case 16: + block1[0] = append[0]; + block1[1] = append[1]; + block1[2] = append[2]; + block1[3] = append[3]; + block2[0] = 0x80; + break; + + case 17: + block1[0] = block1[0] | append[0] << 8; + block1[1] = append[0] >> 24 | append[1] << 8; + block1[2] = append[1] >> 24 | append[2] << 8; + block1[3] = append[2] >> 24 | append[3] << 8; + block2[0] = append[3] >> 24 | 0x80u << 8; + break; + + case 18: + block1[0] = block1[0] | append[0] << 16; + block1[1] = append[0] >> 16 | append[1] << 16; + block1[2] = append[1] >> 16 | append[2] << 16; + block1[3] = append[2] >> 16 | append[3] << 16; + block2[0] = append[3] >> 16 | 0x80u << 16; + break; + + case 19: + block1[0] = block1[0] | append[0] << 24; + block1[1] = append[0] >> 8 | append[1] << 24; + block1[2] = append[1] >> 8 | append[2] << 24; + block1[3] = append[2] >> 8 | append[3] << 24; + block2[0] = append[3] >> 8 | 0x80u << 24; + break; + + case 20: + block1[1] = append[0]; + block1[2] = append[1]; + block1[3] = append[2]; + block2[0] = append[3]; + block2[1] = 0x80; + break; + + case 21: + block1[1] = block1[1] | append[0] << 8; + block1[2] = append[0] >> 24 | append[1] << 8; + block1[3] = append[1] >> 24 | append[2] << 8; + block2[0] = append[2] >> 24 | append[3] << 8; + block2[1] = append[3] >> 24 | 0x80u << 8; + break; + + case 22: + block1[1] = block1[1] | append[0] << 16; + block1[2] = append[0] >> 16 | append[1] << 16; + block1[3] = append[1] >> 16 | append[2] << 16; + block2[0] = append[2] >> 16 | append[3] << 16; + block2[1] = append[3] >> 16 | 0x80u << 16; + break; + + case 23: + block1[1] = block1[1] | append[0] << 24; + block1[2] = append[0] >> 8 | append[1] << 24; + block1[3] = append[1] >> 8 | append[2] << 24; + block2[0] = append[2] >> 8 | append[3] << 24; + block2[1] = append[3] >> 8 | 0x80u << 24; + break; + + case 24: + block1[2] = append[0]; + block1[3] = append[1]; + block2[0] = append[2]; + block2[1] = append[3]; + block2[2] = 0x80; + break; + + case 25: + block1[2] = block1[2] | append[0] << 8; + block1[3] = append[0] >> 24 | append[1] << 8; + block2[0] = append[1] >> 24 | append[2] << 8; + block2[1] = append[2] >> 24 | append[3] << 8; + block2[2] = append[3] >> 24 | 0x80u << 8; + break; + + case 26: + block1[2] = block1[2] | append[0] << 16; + block1[3] = append[0] >> 16 | append[1] << 16; + block2[0] = append[1] >> 16 | append[2] << 16; + block2[1] = append[2] >> 16 | append[3] << 16; + block2[2] = append[3] >> 16 | 0x80u << 16; + break; + + case 27: + block1[2] = block1[2] | append[0] << 24; + block1[3] = append[0] >> 8 | append[1] << 24; + block2[0] = append[1] >> 8 | append[2] << 24; + block2[1] = append[2] >> 8 | append[3] << 24; + block2[2] = append[3] >> 8 | 0x80u << 24; + break; + + case 28: + block1[3] = append[0]; + block2[0] = append[1]; + block2[1] = append[2]; + block2[2] = append[3]; + block2[3] = 0x80; + break; + + case 29: + block1[3] = block1[3] | append[0] << 8; + block2[0] = append[0] >> 24 | append[1] << 8; + block2[1] = append[1] >> 24 | append[2] << 8; + block2[2] = append[2] >> 24 | append[3] << 8; + block2[3] = append[3] >> 24 | 0x80u << 8; + break; + + case 30: + block1[3] = block1[3] | append[0] << 16; + block2[0] = append[0] >> 16 | append[1] << 16; + block2[1] = append[1] >> 16 | append[2] << 16; + block2[2] = append[2] >> 16 | append[3] << 16; + block2[3] = append[3] >> 16 | 0x80u << 16; + break; + + case 31: + block1[3] = block1[3] | append[0] << 24; + block2[0] = append[0] >> 8 | append[1] << 24; + block2[1] = append[1] >> 8 | append[2] << 24; + block2[2] = append[2] >> 8 | append[3] << 24; + block2[3] = append[3] >> 8 | 0x80u << 24; + break; + + case 32: + block2[0] = append[0]; + block2[1] = append[1]; + block2[2] = append[2]; + block2[3] = append[3]; + block3[0] = 0x80; + break; + + case 33: + block2[0] = block2[0] | append[0] << 8; + block2[1] = append[0] >> 24 | append[1] << 8; + block2[2] = append[1] >> 24 | append[2] << 8; + block2[3] = append[2] >> 24 | append[3] << 8; + block3[0] = append[3] >> 24 | 0x80u << 8; + break; + + case 34: + block2[0] = block2[0] | append[0] << 16; + block2[1] = append[0] >> 16 | append[1] << 16; + block2[2] = append[1] >> 16 | append[2] << 16; + block2[3] = append[2] >> 16 | append[3] << 16; + block3[0] = append[3] >> 16 | 0x80u << 16; + break; + + case 35: + block2[0] = block2[0] | append[0] << 24; + block2[1] = append[0] >> 8 | append[1] << 24; + block2[2] = append[1] >> 8 | append[2] << 24; + block2[3] = append[2] >> 8 | append[3] << 24; + block3[0] = append[3] >> 8 | 0x80u << 24; + break; + + case 36: + block2[1] = append[0]; + block2[2] = append[1]; + block2[3] = append[2]; + block3[0] = append[3]; + block3[1] = 0x80; + break; + + case 37: + block2[1] = block2[1] | append[0] << 8; + block2[2] = append[0] >> 24 | append[1] << 8; + block2[3] = append[1] >> 24 | append[2] << 8; + block3[0] = append[2] >> 24 | append[3] << 8; + block3[1] = append[3] >> 24 | 0x80u << 8; + break; + + case 38: + block2[1] = block2[1] | append[0] << 16; + block2[2] = append[0] >> 16 | append[1] << 16; + block2[3] = append[1] >> 16 | append[2] << 16; + block3[0] = append[2] >> 16 | append[3] << 16; + block3[1] = append[3] >> 16 | 0x80u << 16; + break; + + case 39: + block2[1] = block2[1] | append[0] << 24; + block2[2] = append[0] >> 8 | append[1] << 24; + block2[3] = append[1] >> 8 | append[2] << 24; + block3[0] = append[2] >> 8 | append[3] << 24; + block3[1] = append[3] >> 8 | 0x80u << 24; + break; + + case 40: + block2[2] = append[0]; + block2[3] = append[1]; + block3[0] = append[2]; + block3[1] = append[3]; + block3[2] = 0x80; + break; + + case 41: + block2[2] = block2[2] | append[0] << 8; + block2[3] = append[0] >> 24 | append[1] << 8; + block3[0] = append[1] >> 24 | append[2] << 8; + block3[1] = append[2] >> 24 | append[3] << 8; + block3[2] = append[3] >> 24 | 0x80u << 8; + break; + + case 42: + block2[2] = block2[2] | append[0] << 16; + block2[3] = append[0] >> 16 | append[1] << 16; + block3[0] = append[1] >> 16 | append[2] << 16; + block3[1] = append[2] >> 16 | append[3] << 16; + block3[2] = append[3] >> 16 | 0x80u << 16; + break; + + case 43: + block2[2] = block2[2] | append[0] << 24; + block2[3] = append[0] >> 8 | append[1] << 24; + block3[0] = append[1] >> 8 | append[2] << 24; + block3[1] = append[2] >> 8 | append[3] << 24; + block3[2] = append[3] >> 8 | 0x80u << 24; + break; + + case 44: + block2[3] = append[0]; + block3[0] = append[1]; + block3[1] = append[2]; + block3[2] = append[3]; + block3[3] = 0x80; + break; + + case 45: + block2[3] = block2[3] | append[0] << 8; + block3[0] = append[0] >> 24 | append[1] << 8; + block3[1] = append[1] >> 24 | append[2] << 8; + block3[2] = append[2] >> 24 | append[3] << 8; + block3[3] = append[3] >> 24 | 0x80u << 8; + break; + + case 46: + block2[3] = block2[3] | append[0] << 16; + block3[0] = append[0] >> 16 | append[1] << 16; + block3[1] = append[1] >> 16 | append[2] << 16; + block3[2] = append[2] >> 16 | append[3] << 16; + block3[3] = append[3] >> 16 | 0x80u << 16; + break; + + case 47: + block2[3] = block2[3] | append[0] << 24; + block3[0] = append[0] >> 8 | append[1] << 24; + block3[1] = append[1] >> 8 | append[2] << 24; + block3[2] = append[2] >> 8 | append[3] << 24; + block3[3] = append[3] >> 8 | 0x80u << 24; + break; + + case 48: + block3[0] = append[0]; + block3[1] = append[1]; + block3[2] = append[2]; + block3[3] = append[3]; + break; + + case 49: + block3[0] = block3[0] | append[0] << 8; + block3[1] = append[0] >> 24 | append[1] << 8; + block3[2] = append[1] >> 24 | append[2] << 8; + block3[3] = append[2] >> 24 | append[3] << 8; + break; + + case 50: + block3[0] = block3[0] | append[0] << 16; + block3[1] = append[0] >> 16 | append[1] << 16; + block3[2] = append[1] >> 16 | append[2] << 16; + block3[3] = append[2] >> 16 | append[3] << 16; + break; + + case 51: + block3[0] = block3[0] | append[0] << 24; + block3[1] = append[0] >> 8 | append[1] << 24; + block3[2] = append[1] >> 8 | append[2] << 24; + block3[3] = append[2] >> 8 | append[3] << 24; + break; + + case 52: + block3[1] = append[0]; + block3[2] = append[1]; + block3[3] = append[2]; + break; + + case 53: + block3[1] = block3[1] | append[0] << 8; + block3[2] = append[0] >> 24 | append[1] << 8; + block3[3] = append[1] >> 24 | append[2] << 8; + break; + + case 54: + block3[1] = block3[1] | append[0] << 16; + block3[2] = append[0] >> 16 | append[1] << 16; + block3[3] = append[1] >> 16 | append[2] << 16; + break; + + case 55: + block3[1] = block3[1] | append[0] << 24; + block3[2] = append[0] >> 8 | append[1] << 24; + block3[3] = append[1] >> 8 | append[2] << 24; + break; + + case 56: + block3[2] = append[0]; + block3[3] = append[1]; + break; + } +} + +static void memcat8 (u32x block0[4], u32x block1[4], u32x block2[4], u32x block3[4], const u32 block_len, const u32 append[2]) +{ + switch (block_len) + { + case 0: + block0[0] = append[0]; + block0[1] = append[1]; + break; + + case 1: + block0[0] = block0[0] | append[0] << 8; + block0[1] = append[0] >> 24 | append[1] << 8; + block0[2] = append[1] >> 24; + break; + + case 2: + block0[0] = block0[0] | append[0] << 16; + block0[1] = append[0] >> 16 | append[1] << 16; + block0[2] = append[1] >> 16; + break; + + case 3: + block0[0] = block0[0] | append[0] << 24; + block0[1] = append[0] >> 8 | append[1] << 24; + block0[2] = append[1] >> 8; + break; + + case 4: + block0[1] = append[0]; + block0[2] = append[1]; + break; + + case 5: + block0[1] = block0[1] | append[0] << 8; + block0[2] = append[0] >> 24 | append[1] << 8; + block0[3] = append[1] >> 24; + break; + + case 6: + block0[1] = block0[1] | append[0] << 16; + block0[2] = append[0] >> 16 | append[1] << 16; + block0[3] = append[1] >> 16; + break; + + case 7: + block0[1] = block0[1] | append[0] << 24; + block0[2] = append[0] >> 8 | append[1] << 24; + block0[3] = append[1] >> 8; + break; + + case 8: + block0[2] = append[0]; + block0[3] = append[1]; + break; + + case 9: + block0[2] = block0[2] | append[0] << 8; + block0[3] = append[0] >> 24 | append[1] << 8; + block1[0] = append[1] >> 24; + break; + + case 10: + block0[2] = block0[2] | append[0] << 16; + block0[3] = append[0] >> 16 | append[1] << 16; + block1[0] = append[1] >> 16; + break; + + case 11: + block0[2] = block0[2] | append[0] << 24; + block0[3] = append[0] >> 8 | append[1] << 24; + block1[0] = append[1] >> 8; + break; + + case 12: + block0[3] = append[0]; + block1[0] = append[1]; + break; + + case 13: + block0[3] = block0[3] | append[0] << 8; + block1[0] = append[0] >> 24 | append[1] << 8; + block1[1] = append[1] >> 24; + break; + + case 14: + block0[3] = block0[3] | append[0] << 16; + block1[0] = append[0] >> 16 | append[1] << 16; + block1[1] = append[1] >> 16; + break; + + case 15: + block0[3] = block0[3] | append[0] << 24; + block1[0] = append[0] >> 8 | append[1] << 24; + block1[1] = append[1] >> 8; + break; + + case 16: + block1[0] = append[0]; + block1[1] = append[1]; + break; + + case 17: + block1[0] = block1[0] | append[0] << 8; + block1[1] = append[0] >> 24 | append[1] << 8; + block1[2] = append[1] >> 24; + break; + + case 18: + block1[0] = block1[0] | append[0] << 16; + block1[1] = append[0] >> 16 | append[1] << 16; + block1[2] = append[1] >> 16; + break; + + case 19: + block1[0] = block1[0] | append[0] << 24; + block1[1] = append[0] >> 8 | append[1] << 24; + block1[2] = append[1] >> 8; + break; + + case 20: + block1[1] = append[0]; + block1[2] = append[1]; + break; + + case 21: + block1[1] = block1[1] | append[0] << 8; + block1[2] = append[0] >> 24 | append[1] << 8; + block1[3] = append[1] >> 24; + break; + + case 22: + block1[1] = block1[1] | append[0] << 16; + block1[2] = append[0] >> 16 | append[1] << 16; + block1[3] = append[1] >> 16; + break; + + case 23: + block1[1] = block1[1] | append[0] << 24; + block1[2] = append[0] >> 8 | append[1] << 24; + block1[3] = append[1] >> 8; + break; + + case 24: + block1[2] = append[0]; + block1[3] = append[1]; + break; + + case 25: + block1[2] = block1[2] | append[0] << 8; + block1[3] = append[0] >> 24 | append[1] << 8; + block2[0] = append[1] >> 24; + break; + + case 26: + block1[2] = block1[2] | append[0] << 16; + block1[3] = append[0] >> 16 | append[1] << 16; + block2[0] = append[1] >> 16; + break; + + case 27: + block1[2] = block1[2] | append[0] << 24; + block1[3] = append[0] >> 8 | append[1] << 24; + block2[0] = append[1] >> 8; + break; + + case 28: + block1[3] = append[0]; + block2[0] = append[1]; + break; + + case 29: + block1[3] = block1[3] | append[0] << 8; + block2[0] = append[0] >> 24 | append[1] << 8; + block2[1] = append[1] >> 24; + break; + + case 30: + block1[3] = block1[3] | append[0] << 16; + block2[0] = append[0] >> 16 | append[1] << 16; + block2[1] = append[1] >> 16; + break; + + case 31: + block1[3] = block1[3] | append[0] << 24; + block2[0] = append[0] >> 8 | append[1] << 24; + block2[1] = append[1] >> 8; + break; + + case 32: + block2[0] = append[0]; + block2[1] = append[1]; + break; + + case 33: + block2[0] = block2[0] | append[0] << 8; + block2[1] = append[0] >> 24 | append[1] << 8; + block2[2] = append[1] >> 24; + break; + + case 34: + block2[0] = block2[0] | append[0] << 16; + block2[1] = append[0] >> 16 | append[1] << 16; + block2[2] = append[1] >> 16; + break; + + case 35: + block2[0] = block2[0] | append[0] << 24; + block2[1] = append[0] >> 8 | append[1] << 24; + block2[2] = append[1] >> 8; + break; + + case 36: + block2[1] = append[0]; + block2[2] = append[1]; + break; + + case 37: + block2[1] = block2[1] | append[0] << 8; + block2[2] = append[0] >> 24 | append[1] << 8; + block2[3] = append[1] >> 24; + break; + + case 38: + block2[1] = block2[1] | append[0] << 16; + block2[2] = append[0] >> 16 | append[1] << 16; + block2[3] = append[1] >> 16; + break; + + case 39: + block2[1] = block2[1] | append[0] << 24; + block2[2] = append[0] >> 8 | append[1] << 24; + block2[3] = append[1] >> 8; + break; + + case 40: + block2[2] = append[0]; + block2[3] = append[1]; + break; + + case 41: + block2[2] = block2[2] | append[0] << 8; + block2[3] = append[0] >> 24 | append[1] << 8; + block3[0] = append[1] >> 24; + break; + + case 42: + block2[2] = block2[2] | append[0] << 16; + block2[3] = append[0] >> 16 | append[1] << 16; + block3[0] = append[1] >> 16; + break; + + case 43: + block2[2] = block2[2] | append[0] << 24; + block2[3] = append[0] >> 8 | append[1] << 24; + block3[0] = append[1] >> 8; + break; + + case 44: + block2[3] = append[0]; + block3[0] = append[1]; + break; + + case 45: + block2[3] = block2[3] | append[0] << 8; + block3[0] = append[0] >> 24 | append[1] << 8; + block3[1] = append[1] >> 24; + break; + + case 46: + block2[3] = block2[3] | append[0] << 16; + block3[0] = append[0] >> 16 | append[1] << 16; + block3[1] = append[1] >> 16; + break; + + case 47: + block2[3] = block2[3] | append[0] << 24; + block3[0] = append[0] >> 8 | append[1] << 24; + block3[1] = append[1] >> 8; + break; + + case 48: + block3[0] = append[0]; + block3[1] = append[1]; + break; + + case 49: + block3[0] = block3[0] | append[0] << 8; + block3[1] = append[0] >> 24 | append[1] << 8; + block3[2] = append[1] >> 24; + break; + + case 50: + block3[0] = block3[0] | append[0] << 16; + block3[1] = append[0] >> 16 | append[1] << 16; + block3[2] = append[1] >> 16; + break; + + case 51: + block3[0] = block3[0] | append[0] << 24; + block3[1] = append[0] >> 8 | append[1] << 24; + block3[2] = append[1] >> 8; + break; + + case 52: + block3[1] = append[0]; + block3[2] = append[1]; + break; + + case 53: + block3[1] = block3[1] | append[0] << 8; + block3[2] = append[0] >> 24 | append[1] << 8; + block3[3] = append[1] >> 24; + break; + + case 54: + block3[1] = block3[1] | append[0] << 16; + block3[2] = append[0] >> 16 | append[1] << 16; + block3[3] = append[1] >> 16; + break; + + case 55: + block3[1] = block3[1] | append[0] << 24; + block3[2] = append[0] >> 8 | append[1] << 24; + block3[3] = append[1] >> 8; + break; + + case 56: + block3[2] = append[0]; + block3[3] = append[1]; + break; + } +} + +static void append_sign (u32x block0[4], u32x block1[4], const u32 block_len) +{ + switch (block_len) + { + case 0: + block0[0] = md5apr1_magic0; + block0[1] = md5apr1_magic1; + break; + + case 1: + block0[0] = block0[0] | md5apr1_magic0 << 8; + block0[1] = md5apr1_magic0 >> 24 | md5apr1_magic1 << 8; + block0[2] = md5apr1_magic1 >> 24; + break; + + case 2: + block0[0] = block0[0] | md5apr1_magic0 << 16; + block0[1] = md5apr1_magic0 >> 16 | md5apr1_magic1 << 16; + block0[2] = md5apr1_magic1 >> 16; + break; + + case 3: + block0[0] = block0[0] | md5apr1_magic0 << 24; + block0[1] = md5apr1_magic0 >> 8 | md5apr1_magic1 << 24; + block0[2] = md5apr1_magic1 >> 8; + break; + + case 4: + block0[1] = md5apr1_magic0; + block0[2] = md5apr1_magic1; + break; + + case 5: + block0[1] = block0[1] | md5apr1_magic0 << 8; + block0[2] = md5apr1_magic0 >> 24 | md5apr1_magic1 << 8; + block0[3] = md5apr1_magic1 >> 24; + break; + + case 6: + block0[1] = block0[1] | md5apr1_magic0 << 16; + block0[2] = md5apr1_magic0 >> 16 | md5apr1_magic1 << 16; + block0[3] = md5apr1_magic1 >> 16; + break; + + case 7: + block0[1] = block0[1] | md5apr1_magic0 << 24; + block0[2] = md5apr1_magic0 >> 8 | md5apr1_magic1 << 24; + block0[3] = md5apr1_magic1 >> 8; + break; + + case 8: + block0[2] = md5apr1_magic0; + block0[3] = md5apr1_magic1; + break; + + case 9: + block0[2] = block0[2] | md5apr1_magic0 << 8; + block0[3] = md5apr1_magic0 >> 24 | md5apr1_magic1 << 8; + block1[0] = md5apr1_magic1 >> 24; + break; + + case 10: + block0[2] = block0[2] | md5apr1_magic0 << 16; + block0[3] = md5apr1_magic0 >> 16 | md5apr1_magic1 << 16; + block1[0] = md5apr1_magic1 >> 16; + break; + + case 11: + block0[2] = block0[2] | md5apr1_magic0 << 24; + block0[3] = md5apr1_magic0 >> 8 | md5apr1_magic1 << 24; + block1[0] = md5apr1_magic1 >> 8; + break; + + case 12: + block0[3] = md5apr1_magic0; + block1[0] = md5apr1_magic1; + break; + + case 13: + block0[3] = block0[3] | md5apr1_magic0 << 8; + block1[0] = md5apr1_magic0 >> 24 | md5apr1_magic1 << 8; + block1[1] = md5apr1_magic1 >> 24; + break; + + case 14: + block0[3] = block0[3] | md5apr1_magic0 << 16; + block1[0] = md5apr1_magic0 >> 16 | md5apr1_magic1 << 16; + block1[1] = md5apr1_magic1 >> 16; + break; + + case 15: + block0[3] = block0[3] | md5apr1_magic0 << 24; + block1[0] = md5apr1_magic0 >> 8 | md5apr1_magic1 << 24; + block1[1] = md5apr1_magic1 >> 8; + break; + } +} + +static void append_1st (u32x block0[4], u32x block1[4], u32x block2[4], u32x block3[4], const u32 block_len, const u32x append) +{ + switch (block_len) + { + case 0: + block0[0] = append; + break; + + case 1: + block0[0] = block0[0] | append << 8; + break; + + case 2: + block0[0] = block0[0] | append << 16; + break; + + case 3: + block0[0] = block0[0] | append << 24; + break; + + case 4: + block0[1] = append; + break; + + case 5: + block0[1] = block0[1] | append << 8; + break; + + case 6: + block0[1] = block0[1] | append << 16; + break; + + case 7: + block0[1] = block0[1] | append << 24; + break; + + case 8: + block0[2] = append; + break; + + case 9: + block0[2] = block0[2] | append << 8; + break; + + case 10: + block0[2] = block0[2] | append << 16; + break; + + case 11: + block0[2] = block0[2] | append << 24; + break; + + case 12: + block0[3] = append; + break; + + case 13: + block0[3] = block0[3] | append << 8; + break; + + case 14: + block0[3] = block0[3] | append << 16; + break; + + case 15: + block0[3] = block0[3] | append << 24; + break; + + case 16: + block1[0] = append; + break; + + case 17: + block1[0] = block1[0] | append << 8; + break; + + case 18: + block1[0] = block1[0] | append << 16; + break; + + case 19: + block1[0] = block1[0] | append << 24; + break; + + case 20: + block1[1] = append; + break; + + case 21: + block1[1] = block1[1] | append << 8; + break; + + case 22: + block1[1] = block1[1] | append << 16; + break; + + case 23: + block1[1] = block1[1] | append << 24; + break; + + case 24: + block1[2] = append; + break; + + case 25: + block1[2] = block1[2] | append << 8; + break; + + case 26: + block1[2] = block1[2] | append << 16; + break; + + case 27: + block1[2] = block1[2] | append << 24; + break; + + case 28: + block1[3] = append; + break; + + case 29: + block1[3] = block1[3] | append << 8; + break; + + case 30: + block1[3] = block1[3] | append << 16; + break; + + case 31: + block1[3] = block1[3] | append << 24; + break; + + case 32: + block2[0] = append; + break; + + case 33: + block2[0] = block2[0] | append << 8; + break; + + case 34: + block2[0] = block2[0] | append << 16; + break; + + case 35: + block2[0] = block2[0] | append << 24; + break; + + case 36: + block2[1] = append; + break; + + case 37: + block2[1] = block2[1] | append << 8; + break; + + case 38: + block2[1] = block2[1] | append << 16; + break; + + case 39: + block2[1] = block2[1] | append << 24; + break; + + case 40: + block2[2] = append; + break; + + case 41: + block2[2] = block2[2] | append << 8; + break; + + case 42: + block2[2] = block2[2] | append << 16; + break; + + case 43: + block2[2] = block2[2] | append << 24; + break; + + case 44: + block2[3] = append; + break; + + case 45: + block2[3] = block2[3] | append << 8; + break; + + case 46: + block2[3] = block2[3] | append << 16; + break; + + case 47: + block2[3] = block2[3] | append << 24; + break; + + case 48: + block3[0] = append; + break; + + case 49: + block3[0] = block3[0] | append << 8; + break; + + case 50: + block3[0] = block3[0] | append << 16; + break; + + case 51: + block3[0] = block3[0] | append << 24; + break; + + case 52: + block3[1] = append; + break; + + case 53: + block3[1] = block3[1] | append << 8; + break; + + case 54: + block3[1] = block3[1] | append << 16; + break; + + case 55: + block3[1] = block3[1] | append << 24; + break; + + case 56: + block3[2] = append; + break; + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m01600_init (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global md5crypt_tmp_t *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[0]; + w0[1] = pws[gid].i[1]; + w0[2] = pws[gid].i[2]; + w0[3] = pws[gid].i[3]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * salt + */ + + u32 salt_buf[2]; + + salt_buf[0] = salt_bufs[salt_pos].salt_buf[0]; + salt_buf[1] = salt_bufs[salt_pos].salt_buf[1]; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + /** + * init + */ + + //memcat16 (block0, block1, block2, block3, block_len, w0); + //block_len += pw_len; + + u32 block_len = pw_len; + + u32x block0[4]; + + block0[0] = w0[0]; + block0[1] = w0[1]; + block0[2] = w0[2]; + block0[3] = w0[3]; + + u32x block1[4]; + + block1[0] = 0; + block1[1] = 0; + block1[2] = 0; + block1[3] = 0; + + u32x block2[4]; + + block2[0] = 0; + block2[1] = 0; + block2[2] = 0; + block2[3] = 0; + + u32x block3[4]; + + block3[0] = 0; + block3[1] = 0; + block3[2] = 0; + block3[3] = 0; + + memcat8 (block0, block1, block2, block3, block_len, salt_buf); + + block_len += salt_len; + + memcat16 (block0, block1, block2, block3, block_len, w0); + + block_len += pw_len; + + append_0x80_4 (block0, block1, block2, block3, block_len); + + block3[2] = block_len * 8; + + u32x digest[4]; + + digest[0] = MD5M_A; + digest[1] = MD5M_B; + digest[2] = MD5M_C; + digest[3] = MD5M_D; + + md5_transform (block0, block1, block2, block3, digest); + + /* The password first, since that is what is most unknown */ + /* Then our magic string */ + /* Then the raw salt */ + /* Then just as many characters of the MD5(pw,salt,pw) */ + + //memcat16 (block0, block1, block2, block3, block_len, w); + //block_len += pw_len; + + block_len = pw_len; + + block0[0] = w0[0]; + block0[1] = w0[1]; + block0[2] = w0[2]; + block0[3] = w0[3]; + + block1[0] = 0; + block1[1] = 0; + block1[2] = 0; + block1[3] = 0; + + block2[0] = 0; + block2[1] = 0; + block2[2] = 0; + block2[3] = 0; + + block3[0] = 0; + block3[1] = 0; + block3[2] = 0; + block3[3] = 0; + + append_sign (block0, block1, block_len); + + block_len += 6; + + memcat8 (block0, block1, block2, block3, block_len, salt_buf); + + block_len += salt_len; + + truncate_block (digest, pw_len); + + memcat16 (block0, block1, block2, block3, block_len, digest); + + block_len += pw_len; + + /* Then something really weird... */ + + u32x append = block0[0] & 0xFF; + + for (u32 j = pw_len; j; j >>= 1) + { + if ((j & 1) == 0) + { + append_1st (block0, block1, block2, block3, block_len, append); + } + + block_len++; + } + + append_0x80_4 (block0, block1, block2, block3, block_len); + + block3[2] = block_len * 8; + + digest[0] = MD5M_A; + digest[1] = MD5M_B; + digest[2] = MD5M_C; + digest[3] = MD5M_D; + + md5_transform (block0, block1, block2, block3, digest); + + tmps[gid].digest_buf[0] = digest[0]; + tmps[gid].digest_buf[1] = digest[1]; + tmps[gid].digest_buf[2] = digest[2]; + tmps[gid].digest_buf[3] = digest[3]; +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m01600_loop (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global md5crypt_tmp_t *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[0]; + w0[1] = pws[gid].i[1]; + w0[2] = pws[gid].i[2]; + w0[3] = pws[gid].i[3]; + + const u32 pw_len = pws[gid].pw_len; + + u32x w0_x80[4]; + + w0_x80[0] = w0[0]; + w0_x80[1] = w0[1]; + w0_x80[2] = w0[2]; + w0_x80[3] = w0[3]; + + append_0x80_1 (w0_x80, pw_len); + + /** + * salt + */ + + u32 salt_buf[2]; + + salt_buf[0] = salt_bufs[salt_pos].salt_buf[0]; + salt_buf[1] = salt_bufs[salt_pos].salt_buf[1]; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + /** + * digest + */ + + u32x digest[4]; + + digest[0] = tmps[gid].digest_buf[0]; + digest[1] = tmps[gid].digest_buf[1]; + digest[2] = tmps[gid].digest_buf[2]; + digest[3] = tmps[gid].digest_buf[3]; + + /** + * loop + */ + + /* and now, just to make sure things don't run too fast */ + + u32 block_len; + + u32x block0[4]; + + block0[0] = 0; + block0[1] = 0; + block0[2] = 0; + block0[3] = 0; + + u32x block1[4]; + + block1[0] = 0; + block1[1] = 0; + block1[2] = 0; + block1[3] = 0; + + u32x block2[4]; + + block2[0] = 0; + block2[1] = 0; + block2[2] = 0; + block2[3] = 0; + + u32x block3[4]; + + block3[0] = 0; + block3[1] = 0; + block3[2] = 0; + block3[3] = 0; + + for (u32 i = 0, j = loop_pos; i < loop_cnt; i++, j++) + { + block1[0] = 0; + block1[1] = 0; + block1[2] = 0; + block1[3] = 0; + block2[0] = 0; + block2[1] = 0; + block2[2] = 0; + block2[3] = 0; + block3[0] = 0; + block3[1] = 0; + + const u32 j1 = (j & 1) ? 1 : 0; + const u32 j3 = (j % 3) ? 1 : 0; + const u32 j7 = (j % 7) ? 1 : 0; + + if (j1) + { + block0[0] = w0[0]; + block0[1] = w0[1]; + block0[2] = w0[2]; + block0[3] = w0[3]; + + block_len = pw_len; + + if (j3) + { + memcat8 (block0, block1, block2, block3, block_len, salt_buf); + + block_len += salt_len; + } + + if (j7) + { + memcat16 (block0, block1, block2, block3, block_len, w0); + + block_len += pw_len; + } + + memcat16_x80 (block0, block1, block2, block3, block_len, digest); + + block_len += 16; + } + else + { + block0[0] = digest[0]; + block0[1] = digest[1]; + block0[2] = digest[2]; + block0[3] = digest[3]; + + block_len = 16; + + if (j3 && j7) + { + block1[0] = salt_buf[0]; + block1[1] = salt_buf[1]; + + block_len += salt_len; + + memcat16 (block0, block1, block2, block3, block_len, w0); + + block_len += pw_len; + } + else if (j3) + { + block1[0] = salt_buf[0]; + block1[1] = salt_buf[1]; + + block_len += salt_len; + } + else if (j7) + { + block1[0] = w0[0]; + block1[1] = w0[1]; + block1[2] = w0[2]; + block1[3] = w0[3]; + + block_len += pw_len; + } + + memcat16 (block0, block1, block2, block3, block_len, w0_x80); + + block_len += pw_len; + } + + block3[2] = block_len * 8; + + digest[0] = MD5M_A; + digest[1] = MD5M_B; + digest[2] = MD5M_C; + digest[3] = MD5M_D; + + md5_transform (block0, block1, block2, block3, digest); + } + + tmps[gid].digest_buf[0] = digest[0]; + tmps[gid].digest_buf[1] = digest[1]; + tmps[gid].digest_buf[2] = digest[2]; + tmps[gid].digest_buf[3] = digest[3]; +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m01600_comp (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global md5crypt_tmp_t *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + const u32 lid = get_local_id (0); + + /** + * digest + */ + + const u32x r0 = tmps[gid].digest_buf[DGST_R0]; + const u32x r1 = tmps[gid].digest_buf[DGST_R1]; + const u32x r2 = tmps[gid].digest_buf[DGST_R2]; + const u32x r3 = tmps[gid].digest_buf[DGST_R3]; + + #define il_pos 0 + + #include VECT_COMPARE_M +} diff --git a/amd/m01700_a0.cl b/amd/m01700_a0.cl new file mode 100644 index 0000000000..83b91a0546 --- /dev/null +++ b/amd/m01700_a0.cl @@ -0,0 +1,434 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _SHA512_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW4 +#define VECT_SIZE1 +#endif + +#ifdef VLIW5 +#define VECT_SIZE1 +#endif + +#define DGST_R0 14 +#define DGST_R1 15 +#define DGST_R2 6 +#define DGST_R3 7 + +#include "include/kernel_functions.c" +#include "types_amd.c" +#include "common_amd.c" +#include "include/rp_gpu.h" +#include "rp_amd.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +__constant u64 k_sha512[80] = +{ + SHA512C00, SHA512C01, SHA512C02, SHA512C03, + SHA512C04, SHA512C05, SHA512C06, SHA512C07, + SHA512C08, SHA512C09, SHA512C0a, SHA512C0b, + SHA512C0c, SHA512C0d, SHA512C0e, SHA512C0f, + SHA512C10, SHA512C11, SHA512C12, SHA512C13, + SHA512C14, SHA512C15, SHA512C16, SHA512C17, + SHA512C18, SHA512C19, SHA512C1a, SHA512C1b, + SHA512C1c, SHA512C1d, SHA512C1e, SHA512C1f, + SHA512C20, SHA512C21, SHA512C22, SHA512C23, + SHA512C24, SHA512C25, SHA512C26, SHA512C27, + SHA512C28, SHA512C29, SHA512C2a, SHA512C2b, + SHA512C2c, SHA512C2d, SHA512C2e, SHA512C2f, + SHA512C30, SHA512C31, SHA512C32, SHA512C33, + SHA512C34, SHA512C35, SHA512C36, SHA512C37, + SHA512C38, SHA512C39, SHA512C3a, SHA512C3b, + SHA512C3c, SHA512C3d, SHA512C3e, SHA512C3f, + SHA512C40, SHA512C41, SHA512C42, SHA512C43, + SHA512C44, SHA512C45, SHA512C46, SHA512C47, + SHA512C48, SHA512C49, SHA512C4a, SHA512C4b, + SHA512C4c, SHA512C4d, SHA512C4e, SHA512C4f, +}; + +static void sha512_transform (const u32x w0[4], const u32x w1[4], const u32x w2[4], const u32x w3[4], u64x digest[8]) +{ + u64x w0_t = hl32_to_64 (w0[0], w0[1]); + u64x w1_t = hl32_to_64 (w0[2], w0[3]); + u64x w2_t = hl32_to_64 (w1[0], w1[1]); + u64x w3_t = hl32_to_64 (w1[2], w1[3]); + u64x w4_t = hl32_to_64 (w2[0], w2[1]); + u64x w5_t = hl32_to_64 (w2[2], w2[3]); + u64x w6_t = hl32_to_64 (w3[0], w3[1]); + u64x w7_t = 0; + u64x w8_t = 0; + u64x w9_t = 0; + u64x wa_t = 0; + u64x wb_t = 0; + u64x wc_t = 0; + u64x wd_t = 0; + u64x we_t = 0; + u64x wf_t = hl32_to_64 (w3[2], w3[3]); + + u64x a = digest[0]; + u64x b = digest[1]; + u64x c = digest[2]; + u64x d = digest[3]; + u64x e = digest[4]; + u64x f = digest[5]; + u64x g = digest[6]; + u64x h = digest[7]; + + #define ROUND_EXPAND() \ + { \ + w0_t = SHA512_EXPAND (we_t, w9_t, w1_t, w0_t); \ + w1_t = SHA512_EXPAND (wf_t, wa_t, w2_t, w1_t); \ + w2_t = SHA512_EXPAND (w0_t, wb_t, w3_t, w2_t); \ + w3_t = SHA512_EXPAND (w1_t, wc_t, w4_t, w3_t); \ + w4_t = SHA512_EXPAND (w2_t, wd_t, w5_t, w4_t); \ + w5_t = SHA512_EXPAND (w3_t, we_t, w6_t, w5_t); \ + w6_t = SHA512_EXPAND (w4_t, wf_t, w7_t, w6_t); \ + w7_t = SHA512_EXPAND (w5_t, w0_t, w8_t, w7_t); \ + w8_t = SHA512_EXPAND (w6_t, w1_t, w9_t, w8_t); \ + w9_t = SHA512_EXPAND (w7_t, w2_t, wa_t, w9_t); \ + wa_t = SHA512_EXPAND (w8_t, w3_t, wb_t, wa_t); \ + wb_t = SHA512_EXPAND (w9_t, w4_t, wc_t, wb_t); \ + wc_t = SHA512_EXPAND (wa_t, w5_t, wd_t, wc_t); \ + wd_t = SHA512_EXPAND (wb_t, w6_t, we_t, wd_t); \ + we_t = SHA512_EXPAND (wc_t, w7_t, wf_t, we_t); \ + wf_t = SHA512_EXPAND (wd_t, w8_t, w0_t, wf_t); \ + } + + #define ROUND_STEP(i) \ + { \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, a, b, c, d, e, f, g, h, w0_t, k_sha512[i + 0]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, h, a, b, c, d, e, f, g, w1_t, k_sha512[i + 1]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, g, h, a, b, c, d, e, f, w2_t, k_sha512[i + 2]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, f, g, h, a, b, c, d, e, w3_t, k_sha512[i + 3]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, e, f, g, h, a, b, c, d, w4_t, k_sha512[i + 4]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, d, e, f, g, h, a, b, c, w5_t, k_sha512[i + 5]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, c, d, e, f, g, h, a, b, w6_t, k_sha512[i + 6]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, b, c, d, e, f, g, h, a, w7_t, k_sha512[i + 7]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, a, b, c, d, e, f, g, h, w8_t, k_sha512[i + 8]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, h, a, b, c, d, e, f, g, w9_t, k_sha512[i + 9]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, g, h, a, b, c, d, e, f, wa_t, k_sha512[i + 10]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, f, g, h, a, b, c, d, e, wb_t, k_sha512[i + 11]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, e, f, g, h, a, b, c, d, wc_t, k_sha512[i + 12]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, d, e, f, g, h, a, b, c, wd_t, k_sha512[i + 13]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, c, d, e, f, g, h, a, b, we_t, k_sha512[i + 14]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, b, c, d, e, f, g, h, a, wf_t, k_sha512[i + 15]); \ + } + + ROUND_STEP (0); + + #pragma unroll + for (int i = 16; i < 80; i += 16) + { + ROUND_EXPAND (); ROUND_STEP (i); + } + + /* rev + digest[0] += a; + digest[1] += b; + digest[2] += c; + digest[3] += d; + digest[4] += e; + digest[5] += f; + digest[6] += g; + digest[7] += h; + */ + + digest[0] = a; + digest[1] = b; + digest[2] = c; + digest[3] = d; + digest[4] = e; + digest[5] = f; + digest[6] = g; + digest[7] = h; +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m01700_m04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + u32x pw_buf1[4]; + + pw_buf1[0] = pws[gid].i[ 4]; + pw_buf1[1] = pws[gid].i[ 5]; + pw_buf1[2] = pws[gid].i[ 6]; + pw_buf1[3] = pws[gid].i[ 7]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + + w0[0] = pw_buf0[0]; + w0[1] = pw_buf0[1]; + w0[2] = pw_buf0[2]; + w0[3] = pw_buf0[3]; + + u32x w1[4]; + + w1[0] = pw_buf1[0]; + w1[1] = pw_buf1[1]; + w1[2] = pw_buf1[2]; + w1[3] = pw_buf1[3]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 out_len = apply_rules (rules_buf[il_pos].cmds, w0, w1, pw_len); + + append_0x80_2 (w0, w1, out_len); + + /** + * SHA512 + */ + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + w0_t[0] = swap_workaround (w0[0]); + w0_t[1] = swap_workaround (w0[1]); + w0_t[2] = swap_workaround (w0[2]); + w0_t[3] = swap_workaround (w0[3]); + w1_t[0] = swap_workaround (w1[0]); + w1_t[1] = swap_workaround (w1[1]); + w1_t[2] = swap_workaround (w1[2]); + w1_t[3] = swap_workaround (w1[3]); + w2_t[0] = swap_workaround (w2[0]); + w2_t[1] = swap_workaround (w2[1]); + w2_t[2] = swap_workaround (w2[2]); + w2_t[3] = swap_workaround (w2[3]); + w3_t[0] = swap_workaround (w3[0]); + w3_t[1] = swap_workaround (w3[1]); + w3_t[2] = 0; + w3_t[3] = out_len * 8; + + u64x digest[8]; + + digest[0] = SHA512M_A; + digest[1] = SHA512M_B; + digest[2] = SHA512M_C; + digest[3] = SHA512M_D; + digest[4] = SHA512M_E; + digest[5] = SHA512M_F; + digest[6] = SHA512M_G; + digest[7] = SHA512M_H; + + sha512_transform (w0_t, w1_t, w2_t, w3_t, digest); + + + const u32x r0 = l32_from_64 (digest[7]); + const u32x r1 = h32_from_64 (digest[7]); + const u32x r2 = l32_from_64 (digest[3]); + const u32x r3 = h32_from_64 (digest[3]); + + #include VECT_COMPARE_M + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m01700_m08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m01700_m16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m01700_s04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + u32x pw_buf1[4]; + + pw_buf1[0] = pws[gid].i[ 4]; + pw_buf1[1] = pws[gid].i[ 5]; + pw_buf1[2] = pws[gid].i[ 6]; + pw_buf1[3] = pws[gid].i[ 7]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + + w0[0] = pw_buf0[0]; + w0[1] = pw_buf0[1]; + w0[2] = pw_buf0[2]; + w0[3] = pw_buf0[3]; + + u32x w1[4]; + + w1[0] = pw_buf1[0]; + w1[1] = pw_buf1[1]; + w1[2] = pw_buf1[2]; + w1[3] = pw_buf1[3]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 out_len = apply_rules (rules_buf[il_pos].cmds, w0, w1, pw_len); + + append_0x80_2 (w0, w1, out_len); + + /** + * SHA512 + */ + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + w0_t[0] = swap_workaround (w0[0]); + w0_t[1] = swap_workaround (w0[1]); + w0_t[2] = swap_workaround (w0[2]); + w0_t[3] = swap_workaround (w0[3]); + w1_t[0] = swap_workaround (w1[0]); + w1_t[1] = swap_workaround (w1[1]); + w1_t[2] = swap_workaround (w1[2]); + w1_t[3] = swap_workaround (w1[3]); + w2_t[0] = swap_workaround (w2[0]); + w2_t[1] = swap_workaround (w2[1]); + w2_t[2] = swap_workaround (w2[2]); + w2_t[3] = swap_workaround (w2[3]); + w3_t[0] = swap_workaround (w3[0]); + w3_t[1] = swap_workaround (w3[1]); + w3_t[2] = 0; + w3_t[3] = out_len * 8; + + u64x digest[8]; + + digest[0] = SHA512M_A; + digest[1] = SHA512M_B; + digest[2] = SHA512M_C; + digest[3] = SHA512M_D; + digest[4] = SHA512M_E; + digest[5] = SHA512M_F; + digest[6] = SHA512M_G; + digest[7] = SHA512M_H; + + sha512_transform (w0_t, w1_t, w2_t, w3_t, digest); + + + const u32x r0 = l32_from_64 (digest[7]); + const u32x r1 = h32_from_64 (digest[7]); + const u32x r2 = l32_from_64 (digest[3]); + const u32x r3 = h32_from_64 (digest[3]); + + #include VECT_COMPARE_S + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m01700_s08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m01700_s16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/amd/m01700_a1.cl b/amd/m01700_a1.cl new file mode 100644 index 0000000000..0733c787a2 --- /dev/null +++ b/amd/m01700_a1.cl @@ -0,0 +1,532 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _SHA512_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW4 +#define VECT_SIZE1 +#endif + +#ifdef VLIW5 +#define VECT_SIZE1 +#endif + +#define DGST_R0 14 +#define DGST_R1 15 +#define DGST_R2 6 +#define DGST_R3 7 + +#include "include/kernel_functions.c" +#include "types_amd.c" +#include "common_amd.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +__constant u64 k_sha512[80] = +{ + SHA512C00, SHA512C01, SHA512C02, SHA512C03, + SHA512C04, SHA512C05, SHA512C06, SHA512C07, + SHA512C08, SHA512C09, SHA512C0a, SHA512C0b, + SHA512C0c, SHA512C0d, SHA512C0e, SHA512C0f, + SHA512C10, SHA512C11, SHA512C12, SHA512C13, + SHA512C14, SHA512C15, SHA512C16, SHA512C17, + SHA512C18, SHA512C19, SHA512C1a, SHA512C1b, + SHA512C1c, SHA512C1d, SHA512C1e, SHA512C1f, + SHA512C20, SHA512C21, SHA512C22, SHA512C23, + SHA512C24, SHA512C25, SHA512C26, SHA512C27, + SHA512C28, SHA512C29, SHA512C2a, SHA512C2b, + SHA512C2c, SHA512C2d, SHA512C2e, SHA512C2f, + SHA512C30, SHA512C31, SHA512C32, SHA512C33, + SHA512C34, SHA512C35, SHA512C36, SHA512C37, + SHA512C38, SHA512C39, SHA512C3a, SHA512C3b, + SHA512C3c, SHA512C3d, SHA512C3e, SHA512C3f, + SHA512C40, SHA512C41, SHA512C42, SHA512C43, + SHA512C44, SHA512C45, SHA512C46, SHA512C47, + SHA512C48, SHA512C49, SHA512C4a, SHA512C4b, + SHA512C4c, SHA512C4d, SHA512C4e, SHA512C4f, +}; + +static void sha512_transform (const u32x w0[4], const u32x w1[4], const u32x w2[4], const u32x w3[4], u64x digest[8]) +{ + u64x w0_t = hl32_to_64 (w0[0], w0[1]); + u64x w1_t = hl32_to_64 (w0[2], w0[3]); + u64x w2_t = hl32_to_64 (w1[0], w1[1]); + u64x w3_t = hl32_to_64 (w1[2], w1[3]); + u64x w4_t = hl32_to_64 (w2[0], w2[1]); + u64x w5_t = hl32_to_64 (w2[2], w2[3]); + u64x w6_t = hl32_to_64 (w3[0], w3[1]); + u64x w7_t = 0; + u64x w8_t = 0; + u64x w9_t = 0; + u64x wa_t = 0; + u64x wb_t = 0; + u64x wc_t = 0; + u64x wd_t = 0; + u64x we_t = 0; + u64x wf_t = hl32_to_64 (w3[2], w3[3]); + + u64x a = digest[0]; + u64x b = digest[1]; + u64x c = digest[2]; + u64x d = digest[3]; + u64x e = digest[4]; + u64x f = digest[5]; + u64x g = digest[6]; + u64x h = digest[7]; + + #define ROUND_EXPAND() \ + { \ + w0_t = SHA512_EXPAND (we_t, w9_t, w1_t, w0_t); \ + w1_t = SHA512_EXPAND (wf_t, wa_t, w2_t, w1_t); \ + w2_t = SHA512_EXPAND (w0_t, wb_t, w3_t, w2_t); \ + w3_t = SHA512_EXPAND (w1_t, wc_t, w4_t, w3_t); \ + w4_t = SHA512_EXPAND (w2_t, wd_t, w5_t, w4_t); \ + w5_t = SHA512_EXPAND (w3_t, we_t, w6_t, w5_t); \ + w6_t = SHA512_EXPAND (w4_t, wf_t, w7_t, w6_t); \ + w7_t = SHA512_EXPAND (w5_t, w0_t, w8_t, w7_t); \ + w8_t = SHA512_EXPAND (w6_t, w1_t, w9_t, w8_t); \ + w9_t = SHA512_EXPAND (w7_t, w2_t, wa_t, w9_t); \ + wa_t = SHA512_EXPAND (w8_t, w3_t, wb_t, wa_t); \ + wb_t = SHA512_EXPAND (w9_t, w4_t, wc_t, wb_t); \ + wc_t = SHA512_EXPAND (wa_t, w5_t, wd_t, wc_t); \ + wd_t = SHA512_EXPAND (wb_t, w6_t, we_t, wd_t); \ + we_t = SHA512_EXPAND (wc_t, w7_t, wf_t, we_t); \ + wf_t = SHA512_EXPAND (wd_t, w8_t, w0_t, wf_t); \ + } + + #define ROUND_STEP(i) \ + { \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, a, b, c, d, e, f, g, h, w0_t, k_sha512[i + 0]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, h, a, b, c, d, e, f, g, w1_t, k_sha512[i + 1]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, g, h, a, b, c, d, e, f, w2_t, k_sha512[i + 2]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, f, g, h, a, b, c, d, e, w3_t, k_sha512[i + 3]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, e, f, g, h, a, b, c, d, w4_t, k_sha512[i + 4]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, d, e, f, g, h, a, b, c, w5_t, k_sha512[i + 5]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, c, d, e, f, g, h, a, b, w6_t, k_sha512[i + 6]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, b, c, d, e, f, g, h, a, w7_t, k_sha512[i + 7]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, a, b, c, d, e, f, g, h, w8_t, k_sha512[i + 8]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, h, a, b, c, d, e, f, g, w9_t, k_sha512[i + 9]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, g, h, a, b, c, d, e, f, wa_t, k_sha512[i + 10]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, f, g, h, a, b, c, d, e, wb_t, k_sha512[i + 11]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, e, f, g, h, a, b, c, d, wc_t, k_sha512[i + 12]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, d, e, f, g, h, a, b, c, wd_t, k_sha512[i + 13]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, c, d, e, f, g, h, a, b, we_t, k_sha512[i + 14]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, b, c, d, e, f, g, h, a, wf_t, k_sha512[i + 15]); \ + } + + ROUND_STEP (0); + + #pragma unroll + for (int i = 16; i < 80; i += 16) + { + ROUND_EXPAND (); ROUND_STEP (i); + } + + /* rev + digest[0] += a; + digest[1] += b; + digest[2] += c; + digest[3] += d; + digest[4] += e; + digest[5] += f; + digest[6] += g; + digest[7] += h; + */ + + digest[0] = a; + digest[1] = b; + digest[2] = c; + digest[3] = d; + digest[4] = e; + digest[5] = f; + digest[6] = g; + digest[7] = h; +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m01700_m04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + append_0x80_2 (wordl0, wordl1, pw_l_len); + + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, combs_buf[0].pw_len); + } + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = combs_buf[il_pos].pw_len; + + const u32 pw_len = pw_l_len + pw_r_len; + + u32 wordr0[4]; + + wordr0[0] = combs_buf[il_pos].i[0]; + wordr0[1] = combs_buf[il_pos].i[1]; + wordr0[2] = combs_buf[il_pos].i[2]; + wordr0[3] = combs_buf[il_pos].i[3]; + + u32 wordr1[4]; + + wordr1[0] = combs_buf[il_pos].i[4]; + wordr1[1] = combs_buf[il_pos].i[5]; + wordr1[2] = combs_buf[il_pos].i[6]; + wordr1[3] = combs_buf[il_pos].i[7]; + + u32 wordr2[4]; + + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + + u32 wordr3[4]; + + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + append_0x80_2 (wordr0, wordr1, pw_r_len); + + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + u32x w0[4]; + u32x w1[4]; + u32x w2[4]; + u32x w3[4]; + + w0[0] = wordl0[0] | wordr0[0]; + w0[1] = wordl0[1] | wordr0[1]; + w0[2] = wordl0[2] | wordr0[2]; + w0[3] = wordl0[3] | wordr0[3]; + w1[0] = wordl1[0] | wordr1[0]; + w1[1] = wordl1[1] | wordr1[1]; + w1[2] = wordl1[2] | wordr1[2]; + w1[3] = wordl1[3] | wordr1[3]; + w2[0] = wordl2[0] | wordr2[0]; + w2[1] = wordl2[1] | wordr2[1]; + w2[2] = wordl2[2] | wordr2[2]; + w2[3] = wordl2[3] | wordr2[3]; + w3[0] = wordl3[0] | wordr3[0]; + w3[1] = wordl3[1] | wordr3[1]; + w3[2] = wordl3[2] | wordr3[2]; + w3[3] = wordl3[3] | wordr3[3]; + + /** + * SHA512 + */ + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + w0_t[0] = swap_workaround (w0[0]); + w0_t[1] = swap_workaround (w0[1]); + w0_t[2] = swap_workaround (w0[2]); + w0_t[3] = swap_workaround (w0[3]); + w1_t[0] = swap_workaround (w1[0]); + w1_t[1] = swap_workaround (w1[1]); + w1_t[2] = swap_workaround (w1[2]); + w1_t[3] = swap_workaround (w1[3]); + w2_t[0] = swap_workaround (w2[0]); + w2_t[1] = swap_workaround (w2[1]); + w2_t[2] = swap_workaround (w2[2]); + w2_t[3] = swap_workaround (w2[3]); + w3_t[0] = swap_workaround (w3[0]); + w3_t[1] = swap_workaround (w3[1]); + w3_t[2] = 0; + w3_t[3] = pw_len * 8; + + u64x digest[8]; + + digest[0] = SHA512M_A; + digest[1] = SHA512M_B; + digest[2] = SHA512M_C; + digest[3] = SHA512M_D; + digest[4] = SHA512M_E; + digest[5] = SHA512M_F; + digest[6] = SHA512M_G; + digest[7] = SHA512M_H; + + sha512_transform (w0_t, w1_t, w2_t, w3_t, digest); + + + const u32x r0 = l32_from_64 (digest[7]); + const u32x r1 = h32_from_64 (digest[7]); + const u32x r2 = l32_from_64 (digest[3]); + const u32x r3 = h32_from_64 (digest[3]); + + #include VECT_COMPARE_M + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m01700_m08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m01700_m16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m01700_s04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + append_0x80_2 (wordl0, wordl1, pw_l_len); + + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, combs_buf[0].pw_len); + } + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = combs_buf[il_pos].pw_len; + + const u32 pw_len = pw_l_len + pw_r_len; + + u32 wordr0[4]; + + wordr0[0] = combs_buf[il_pos].i[0]; + wordr0[1] = combs_buf[il_pos].i[1]; + wordr0[2] = combs_buf[il_pos].i[2]; + wordr0[3] = combs_buf[il_pos].i[3]; + + u32 wordr1[4]; + + wordr1[0] = combs_buf[il_pos].i[4]; + wordr1[1] = combs_buf[il_pos].i[5]; + wordr1[2] = combs_buf[il_pos].i[6]; + wordr1[3] = combs_buf[il_pos].i[7]; + + u32 wordr2[4]; + + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + + u32 wordr3[4]; + + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + append_0x80_2 (wordr0, wordr1, pw_r_len); + + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + u32x w0[4]; + u32x w1[4]; + u32x w2[4]; + u32x w3[4]; + + w0[0] = wordl0[0] | wordr0[0]; + w0[1] = wordl0[1] | wordr0[1]; + w0[2] = wordl0[2] | wordr0[2]; + w0[3] = wordl0[3] | wordr0[3]; + w1[0] = wordl1[0] | wordr1[0]; + w1[1] = wordl1[1] | wordr1[1]; + w1[2] = wordl1[2] | wordr1[2]; + w1[3] = wordl1[3] | wordr1[3]; + w2[0] = wordl2[0] | wordr2[0]; + w2[1] = wordl2[1] | wordr2[1]; + w2[2] = wordl2[2] | wordr2[2]; + w2[3] = wordl2[3] | wordr2[3]; + w3[0] = wordl3[0] | wordr3[0]; + w3[1] = wordl3[1] | wordr3[1]; + w3[2] = wordl3[2] | wordr3[2]; + w3[3] = wordl3[3] | wordr3[3]; + + /** + * SHA512 + */ + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + w0_t[0] = swap_workaround (w0[0]); + w0_t[1] = swap_workaround (w0[1]); + w0_t[2] = swap_workaround (w0[2]); + w0_t[3] = swap_workaround (w0[3]); + w1_t[0] = swap_workaround (w1[0]); + w1_t[1] = swap_workaround (w1[1]); + w1_t[2] = swap_workaround (w1[2]); + w1_t[3] = swap_workaround (w1[3]); + w2_t[0] = swap_workaround (w2[0]); + w2_t[1] = swap_workaround (w2[1]); + w2_t[2] = swap_workaround (w2[2]); + w2_t[3] = swap_workaround (w2[3]); + w3_t[0] = swap_workaround (w3[0]); + w3_t[1] = swap_workaround (w3[1]); + w3_t[2] = 0; + w3_t[3] = pw_len * 8; + + u64x digest[8]; + + digest[0] = SHA512M_A; + digest[1] = SHA512M_B; + digest[2] = SHA512M_C; + digest[3] = SHA512M_D; + digest[4] = SHA512M_E; + digest[5] = SHA512M_F; + digest[6] = SHA512M_G; + digest[7] = SHA512M_H; + + sha512_transform (w0_t, w1_t, w2_t, w3_t, digest); + + + const u32x r0 = l32_from_64 (digest[7]); + const u32x r1 = h32_from_64 (digest[7]); + const u32x r2 = l32_from_64 (digest[3]); + const u32x r3 = h32_from_64 (digest[3]); + + #include VECT_COMPARE_S + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m01700_s08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m01700_s16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/amd/m01700_a3.cl b/amd/m01700_a3.cl new file mode 100644 index 0000000000..0e965b1599 --- /dev/null +++ b/amd/m01700_a3.cl @@ -0,0 +1,543 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _SHA512_ +#define _SCALAR_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW4 +#define VECT_SIZE1 +#endif + +#ifdef VLIW5 +#define VECT_SIZE1 +#endif + +#define DGST_R0 14 +#define DGST_R1 15 +#define DGST_R2 6 +#define DGST_R3 7 + +#include "include/kernel_functions.c" +#include "types_amd.c" +#include "common_amd.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4_warp.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4_warp.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4_warp.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4_warp.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4_warp.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4_warp.c" +#endif + +__constant u64 k_sha512[80] = +{ + SHA512C00, SHA512C01, SHA512C02, SHA512C03, + SHA512C04, SHA512C05, SHA512C06, SHA512C07, + SHA512C08, SHA512C09, SHA512C0a, SHA512C0b, + SHA512C0c, SHA512C0d, SHA512C0e, SHA512C0f, + SHA512C10, SHA512C11, SHA512C12, SHA512C13, + SHA512C14, SHA512C15, SHA512C16, SHA512C17, + SHA512C18, SHA512C19, SHA512C1a, SHA512C1b, + SHA512C1c, SHA512C1d, SHA512C1e, SHA512C1f, + SHA512C20, SHA512C21, SHA512C22, SHA512C23, + SHA512C24, SHA512C25, SHA512C26, SHA512C27, + SHA512C28, SHA512C29, SHA512C2a, SHA512C2b, + SHA512C2c, SHA512C2d, SHA512C2e, SHA512C2f, + SHA512C30, SHA512C31, SHA512C32, SHA512C33, + SHA512C34, SHA512C35, SHA512C36, SHA512C37, + SHA512C38, SHA512C39, SHA512C3a, SHA512C3b, + SHA512C3c, SHA512C3d, SHA512C3e, SHA512C3f, + SHA512C40, SHA512C41, SHA512C42, SHA512C43, + SHA512C44, SHA512C45, SHA512C46, SHA512C47, + SHA512C48, SHA512C49, SHA512C4a, SHA512C4b, + SHA512C4c, SHA512C4d, SHA512C4e, SHA512C4f, +}; + +static void sha512_transform (const u32x w0[4], const u32x w1[4], const u32x w2[4], const u32x w3[4], u64x digest[8]) +{ + u64x w0_t = hl32_to_64 (w0[0], w0[1]); + u64x w1_t = hl32_to_64 (w0[2], w0[3]); + u64x w2_t = hl32_to_64 (w1[0], w1[1]); + u64x w3_t = hl32_to_64 (w1[2], w1[3]); + u64x w4_t = hl32_to_64 (w2[0], w2[1]); + u64x w5_t = hl32_to_64 (w2[2], w2[3]); + u64x w6_t = hl32_to_64 (w3[0], w3[1]); + u64x w7_t = 0; + u64x w8_t = 0; + u64x w9_t = 0; + u64x wa_t = 0; + u64x wb_t = 0; + u64x wc_t = 0; + u64x wd_t = 0; + u64x we_t = 0; + u64x wf_t = hl32_to_64 (w3[2], w3[3]); + + u64x a = digest[0]; + u64x b = digest[1]; + u64x c = digest[2]; + u64x d = digest[3]; + u64x e = digest[4]; + u64x f = digest[5]; + u64x g = digest[6]; + u64x h = digest[7]; + + #define ROUND_EXPAND() \ + { \ + w0_t = SHA512_EXPAND (we_t, w9_t, w1_t, w0_t); \ + w1_t = SHA512_EXPAND (wf_t, wa_t, w2_t, w1_t); \ + w2_t = SHA512_EXPAND (w0_t, wb_t, w3_t, w2_t); \ + w3_t = SHA512_EXPAND (w1_t, wc_t, w4_t, w3_t); \ + w4_t = SHA512_EXPAND (w2_t, wd_t, w5_t, w4_t); \ + w5_t = SHA512_EXPAND (w3_t, we_t, w6_t, w5_t); \ + w6_t = SHA512_EXPAND (w4_t, wf_t, w7_t, w6_t); \ + w7_t = SHA512_EXPAND (w5_t, w0_t, w8_t, w7_t); \ + w8_t = SHA512_EXPAND (w6_t, w1_t, w9_t, w8_t); \ + w9_t = SHA512_EXPAND (w7_t, w2_t, wa_t, w9_t); \ + wa_t = SHA512_EXPAND (w8_t, w3_t, wb_t, wa_t); \ + wb_t = SHA512_EXPAND (w9_t, w4_t, wc_t, wb_t); \ + wc_t = SHA512_EXPAND (wa_t, w5_t, wd_t, wc_t); \ + wd_t = SHA512_EXPAND (wb_t, w6_t, we_t, wd_t); \ + we_t = SHA512_EXPAND (wc_t, w7_t, wf_t, we_t); \ + wf_t = SHA512_EXPAND (wd_t, w8_t, w0_t, wf_t); \ + } + + #define ROUND_STEP(i) \ + { \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, a, b, c, d, e, f, g, h, w0_t, k_sha512[i + 0]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, h, a, b, c, d, e, f, g, w1_t, k_sha512[i + 1]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, g, h, a, b, c, d, e, f, w2_t, k_sha512[i + 2]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, f, g, h, a, b, c, d, e, w3_t, k_sha512[i + 3]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, e, f, g, h, a, b, c, d, w4_t, k_sha512[i + 4]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, d, e, f, g, h, a, b, c, w5_t, k_sha512[i + 5]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, c, d, e, f, g, h, a, b, w6_t, k_sha512[i + 6]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, b, c, d, e, f, g, h, a, w7_t, k_sha512[i + 7]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, a, b, c, d, e, f, g, h, w8_t, k_sha512[i + 8]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, h, a, b, c, d, e, f, g, w9_t, k_sha512[i + 9]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, g, h, a, b, c, d, e, f, wa_t, k_sha512[i + 10]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, f, g, h, a, b, c, d, e, wb_t, k_sha512[i + 11]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, e, f, g, h, a, b, c, d, wc_t, k_sha512[i + 12]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, d, e, f, g, h, a, b, c, wd_t, k_sha512[i + 13]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, c, d, e, f, g, h, a, b, we_t, k_sha512[i + 14]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, b, c, d, e, f, g, h, a, wf_t, k_sha512[i + 15]); \ + } + + ROUND_STEP (0); + + #pragma unroll + for (int i = 16; i < 80; i += 16) + { + ROUND_EXPAND (); ROUND_STEP (i); + } + + /* rev + digest[0] += a; + digest[1] += b; + digest[2] += c; + digest[3] += d; + digest[4] += e; + digest[5] += f; + digest[6] += g; + digest[7] += h; + */ + + digest[0] = a; + digest[1] = b; + digest[2] = c; + digest[3] = d; + digest[4] = e; + digest[5] = f; + digest[6] = g; + digest[7] = h; +} + +static void m01700m (u32 w[16], const u32 pw_len, __global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global u32x * words_buf_r, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset) +{ + /** + * modifier + */ + + const u32 gid = get_global_id (0); + const u32 lid = get_local_id (0); + + /** + * loop + */ + + const u32 bf_loops = ceil ((float) bfs_cnt / VECT_DIV); + + u32x w0l = w[0]; + + for (u32 il_pos = 0; il_pos < bf_loops; il_pos++) + { + const u32x w0r = words_buf_r[il_pos]; + + const u32x w0 = w0l | w0r; + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + w0_t[0] = w0; + w0_t[1] = w[ 1]; + w0_t[2] = w[ 2]; + w0_t[3] = w[ 3]; + w1_t[0] = w[ 4]; + w1_t[1] = w[ 5]; + w1_t[2] = w[ 6]; + w1_t[3] = w[ 7]; + w2_t[0] = w[ 8]; + w2_t[1] = w[ 9]; + w2_t[2] = w[10]; + w2_t[3] = w[11]; + w3_t[0] = w[12]; + w3_t[1] = w[13]; + w3_t[2] = w[14]; + w3_t[3] = w[15]; + + u64x digest[8]; + + digest[0] = SHA512M_A; + digest[1] = SHA512M_B; + digest[2] = SHA512M_C; + digest[3] = SHA512M_D; + digest[4] = SHA512M_E; + digest[5] = SHA512M_F; + digest[6] = SHA512M_G; + digest[7] = SHA512M_H; + + sha512_transform (w0_t, w1_t, w2_t, w3_t, digest); + + + const u32x r0 = l32_from_64 (digest[7]); + const u32x r1 = h32_from_64 (digest[7]); + const u32x r2 = l32_from_64 (digest[3]); + const u32x r3 = h32_from_64 (digest[3]); + + #include VECT_COMPARE_M + } +} + +static void m01700s (u32 w[16], const u32 pw_len, __global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global u32x * words_buf_r, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset) +{ + /** + * modifier + */ + + const u32 gid = get_global_id (0); + const u32 lid = get_local_id (0); + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * loop + */ + + const u32 bf_loops = ceil ((float) bfs_cnt / VECT_DIV); + + u32x w0l = w[0]; + + for (u32 il_pos = 0; il_pos < bf_loops; il_pos++) + { + const u32x w0r = words_buf_r[il_pos]; + + const u32x w0 = w0l | w0r; + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + w0_t[0] = w0; + w0_t[1] = w[ 1]; + w0_t[2] = w[ 2]; + w0_t[3] = w[ 3]; + w1_t[0] = w[ 4]; + w1_t[1] = w[ 5]; + w1_t[2] = w[ 6]; + w1_t[3] = w[ 7]; + w2_t[0] = w[ 8]; + w2_t[1] = w[ 9]; + w2_t[2] = w[10]; + w2_t[3] = w[11]; + w3_t[0] = w[12]; + w3_t[1] = w[13]; + w3_t[2] = w[14]; + w3_t[3] = w[15]; + + u64x digest[8]; + + digest[0] = SHA512M_A; + digest[1] = SHA512M_B; + digest[2] = SHA512M_C; + digest[3] = SHA512M_D; + digest[4] = SHA512M_E; + digest[5] = SHA512M_F; + digest[6] = SHA512M_G; + digest[7] = SHA512M_H; + + sha512_transform (w0_t, w1_t, w2_t, w3_t, digest); + + + const u32x r0 = l32_from_64 (digest[7]); + const u32x r1 = h32_from_64 (digest[7]); + const u32x r2 = l32_from_64 (digest[3]); + const u32x r3 = h32_from_64 (digest[3]); + + #include VECT_COMPARE_S + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m01700_m04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global u32x * words_buf_r, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32 w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = 0; + w[ 5] = 0; + w[ 6] = 0; + w[ 7] = 0; + w[ 8] = 0; + w[ 9] = 0; + w[10] = 0; + w[11] = 0; + w[12] = 0; + w[13] = 0; + w[14] = 0; + w[15] = pws[gid].i[15]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m01700m (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m01700_m08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global u32x * words_buf_r, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32 w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = pws[gid].i[ 4]; + w[ 5] = pws[gid].i[ 5]; + w[ 6] = pws[gid].i[ 6]; + w[ 7] = pws[gid].i[ 7]; + w[ 8] = 0; + w[ 9] = 0; + w[10] = 0; + w[11] = 0; + w[12] = 0; + w[13] = 0; + w[14] = 0; + w[15] = pws[gid].i[15]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m01700m (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m01700_m16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global u32x * words_buf_r, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32 w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = pws[gid].i[ 4]; + w[ 5] = pws[gid].i[ 5]; + w[ 6] = pws[gid].i[ 6]; + w[ 7] = pws[gid].i[ 7]; + w[ 8] = pws[gid].i[ 8]; + w[ 9] = pws[gid].i[ 9]; + w[10] = pws[gid].i[10]; + w[11] = pws[gid].i[11]; + w[12] = pws[gid].i[12]; + w[13] = pws[gid].i[13]; + w[14] = pws[gid].i[14]; + w[15] = pws[gid].i[15]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m01700m (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m01700_s04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global u32x * words_buf_r, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32 w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = 0; + w[ 5] = 0; + w[ 6] = 0; + w[ 7] = 0; + w[ 8] = 0; + w[ 9] = 0; + w[10] = 0; + w[11] = 0; + w[12] = 0; + w[13] = 0; + w[14] = 0; + w[15] = pws[gid].i[15]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m01700s (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m01700_s08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global u32x * words_buf_r, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32 w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = pws[gid].i[ 4]; + w[ 5] = pws[gid].i[ 5]; + w[ 6] = pws[gid].i[ 6]; + w[ 7] = pws[gid].i[ 7]; + w[ 8] = 0; + w[ 9] = 0; + w[10] = 0; + w[11] = 0; + w[12] = 0; + w[13] = 0; + w[14] = 0; + w[15] = pws[gid].i[15]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m01700s (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m01700_s16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global u32x * words_buf_r, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32 w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = pws[gid].i[ 4]; + w[ 5] = pws[gid].i[ 5]; + w[ 6] = pws[gid].i[ 6]; + w[ 7] = pws[gid].i[ 7]; + w[ 8] = pws[gid].i[ 8]; + w[ 9] = pws[gid].i[ 9]; + w[10] = pws[gid].i[10]; + w[11] = pws[gid].i[11]; + w[12] = pws[gid].i[12]; + w[13] = pws[gid].i[13]; + w[14] = pws[gid].i[14]; + w[15] = pws[gid].i[15]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m01700s (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} diff --git a/amd/m01710_a0.cl b/amd/m01710_a0.cl new file mode 100644 index 0000000000..8e49df1a35 --- /dev/null +++ b/amd/m01710_a0.cl @@ -0,0 +1,586 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _SHA512_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW4 +#define VECT_SIZE1 +#endif + +#ifdef VLIW5 +#define VECT_SIZE1 +#endif + +#define DGST_R0 14 +#define DGST_R1 15 +#define DGST_R2 6 +#define DGST_R3 7 + +#include "include/kernel_functions.c" +#include "types_amd.c" +#include "common_amd.c" +#include "include/rp_gpu.h" +#include "rp_amd.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +__constant u64 k_sha512[80] = +{ + SHA512C00, SHA512C01, SHA512C02, SHA512C03, + SHA512C04, SHA512C05, SHA512C06, SHA512C07, + SHA512C08, SHA512C09, SHA512C0a, SHA512C0b, + SHA512C0c, SHA512C0d, SHA512C0e, SHA512C0f, + SHA512C10, SHA512C11, SHA512C12, SHA512C13, + SHA512C14, SHA512C15, SHA512C16, SHA512C17, + SHA512C18, SHA512C19, SHA512C1a, SHA512C1b, + SHA512C1c, SHA512C1d, SHA512C1e, SHA512C1f, + SHA512C20, SHA512C21, SHA512C22, SHA512C23, + SHA512C24, SHA512C25, SHA512C26, SHA512C27, + SHA512C28, SHA512C29, SHA512C2a, SHA512C2b, + SHA512C2c, SHA512C2d, SHA512C2e, SHA512C2f, + SHA512C30, SHA512C31, SHA512C32, SHA512C33, + SHA512C34, SHA512C35, SHA512C36, SHA512C37, + SHA512C38, SHA512C39, SHA512C3a, SHA512C3b, + SHA512C3c, SHA512C3d, SHA512C3e, SHA512C3f, + SHA512C40, SHA512C41, SHA512C42, SHA512C43, + SHA512C44, SHA512C45, SHA512C46, SHA512C47, + SHA512C48, SHA512C49, SHA512C4a, SHA512C4b, + SHA512C4c, SHA512C4d, SHA512C4e, SHA512C4f, +}; + +static void sha512_transform (const u32x w0[4], const u32x w1[4], const u32x w2[4], const u32x w3[4], u64x digest[8]) +{ + u64x w0_t = hl32_to_64 (w0[0], w0[1]); + u64x w1_t = hl32_to_64 (w0[2], w0[3]); + u64x w2_t = hl32_to_64 (w1[0], w1[1]); + u64x w3_t = hl32_to_64 (w1[2], w1[3]); + u64x w4_t = hl32_to_64 (w2[0], w2[1]); + u64x w5_t = hl32_to_64 (w2[2], w2[3]); + u64x w6_t = hl32_to_64 (w3[0], w3[1]); + u64x w7_t = 0; + u64x w8_t = 0; + u64x w9_t = 0; + u64x wa_t = 0; + u64x wb_t = 0; + u64x wc_t = 0; + u64x wd_t = 0; + u64x we_t = 0; + u64x wf_t = hl32_to_64 (w3[2], w3[3]); + + u64x a = digest[0]; + u64x b = digest[1]; + u64x c = digest[2]; + u64x d = digest[3]; + u64x e = digest[4]; + u64x f = digest[5]; + u64x g = digest[6]; + u64x h = digest[7]; + + #define ROUND_EXPAND() \ + { \ + w0_t = SHA512_EXPAND (we_t, w9_t, w1_t, w0_t); \ + w1_t = SHA512_EXPAND (wf_t, wa_t, w2_t, w1_t); \ + w2_t = SHA512_EXPAND (w0_t, wb_t, w3_t, w2_t); \ + w3_t = SHA512_EXPAND (w1_t, wc_t, w4_t, w3_t); \ + w4_t = SHA512_EXPAND (w2_t, wd_t, w5_t, w4_t); \ + w5_t = SHA512_EXPAND (w3_t, we_t, w6_t, w5_t); \ + w6_t = SHA512_EXPAND (w4_t, wf_t, w7_t, w6_t); \ + w7_t = SHA512_EXPAND (w5_t, w0_t, w8_t, w7_t); \ + w8_t = SHA512_EXPAND (w6_t, w1_t, w9_t, w8_t); \ + w9_t = SHA512_EXPAND (w7_t, w2_t, wa_t, w9_t); \ + wa_t = SHA512_EXPAND (w8_t, w3_t, wb_t, wa_t); \ + wb_t = SHA512_EXPAND (w9_t, w4_t, wc_t, wb_t); \ + wc_t = SHA512_EXPAND (wa_t, w5_t, wd_t, wc_t); \ + wd_t = SHA512_EXPAND (wb_t, w6_t, we_t, wd_t); \ + we_t = SHA512_EXPAND (wc_t, w7_t, wf_t, we_t); \ + wf_t = SHA512_EXPAND (wd_t, w8_t, w0_t, wf_t); \ + } + + #define ROUND_STEP(i) \ + { \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, a, b, c, d, e, f, g, h, w0_t, k_sha512[i + 0]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, h, a, b, c, d, e, f, g, w1_t, k_sha512[i + 1]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, g, h, a, b, c, d, e, f, w2_t, k_sha512[i + 2]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, f, g, h, a, b, c, d, e, w3_t, k_sha512[i + 3]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, e, f, g, h, a, b, c, d, w4_t, k_sha512[i + 4]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, d, e, f, g, h, a, b, c, w5_t, k_sha512[i + 5]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, c, d, e, f, g, h, a, b, w6_t, k_sha512[i + 6]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, b, c, d, e, f, g, h, a, w7_t, k_sha512[i + 7]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, a, b, c, d, e, f, g, h, w8_t, k_sha512[i + 8]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, h, a, b, c, d, e, f, g, w9_t, k_sha512[i + 9]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, g, h, a, b, c, d, e, f, wa_t, k_sha512[i + 10]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, f, g, h, a, b, c, d, e, wb_t, k_sha512[i + 11]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, e, f, g, h, a, b, c, d, wc_t, k_sha512[i + 12]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, d, e, f, g, h, a, b, c, wd_t, k_sha512[i + 13]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, c, d, e, f, g, h, a, b, we_t, k_sha512[i + 14]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, b, c, d, e, f, g, h, a, wf_t, k_sha512[i + 15]); \ + } + + ROUND_STEP (0); + + #pragma unroll + for (int i = 16; i < 80; i += 16) + { + ROUND_EXPAND (); ROUND_STEP (i); + } + + /* rev + digest[0] += a; + digest[1] += b; + digest[2] += c; + digest[3] += d; + digest[4] += e; + digest[5] += f; + digest[6] += g; + digest[7] += h; + */ + + digest[0] = a; + digest[1] = b; + digest[2] = c; + digest[3] = d; + digest[4] = e; + digest[5] = f; + digest[6] = g; + digest[7] = h; +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m01710_m04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + u32x pw_buf1[4]; + + pw_buf1[0] = pws[gid].i[ 4]; + pw_buf1[1] = pws[gid].i[ 5]; + pw_buf1[2] = pws[gid].i[ 6]; + pw_buf1[3] = pws[gid].i[ 7]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[7]; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + + w0[0] = pw_buf0[0]; + w0[1] = pw_buf0[1]; + w0[2] = pw_buf0[2]; + w0[3] = pw_buf0[3]; + + u32x w1[4]; + + w1[0] = pw_buf1[0]; + w1[1] = pw_buf1[1]; + w1[2] = pw_buf1[2]; + w1[3] = pw_buf1[3]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 out_len = apply_rules (rules_buf[il_pos].cmds, w0, w1, pw_len); + + /** + * append salt + */ + + u32 s0[4]; + + s0[0] = salt_buf0[0]; + s0[1] = salt_buf0[1]; + s0[2] = salt_buf0[2]; + s0[3] = salt_buf0[3]; + + u32 s1[4]; + + s1[0] = salt_buf1[0]; + s1[1] = salt_buf1[1]; + s1[2] = salt_buf1[2]; + s1[3] = salt_buf1[3]; + + u32 s2[4]; + + s2[0] = 0; + s2[1] = 0; + s2[2] = 0; + s2[3] = 0; + + u32 s3[4]; + + s3[0] = 0; + s3[1] = 0; + s3[2] = 0; + s3[3] = 0; + + switch_buffer_by_offset (s0, s1, s2, s3, out_len); + + const u32 out_salt_len = out_len + salt_len; + + w0[0] |= s0[0]; + w0[1] |= s0[1]; + w0[2] |= s0[2]; + w0[3] |= s0[3]; + + w1[0] |= s1[0]; + w1[1] |= s1[1]; + w1[2] |= s1[2]; + w1[3] |= s1[3]; + + w2[0] |= s2[0]; + w2[1] |= s2[1]; + w2[2] |= s2[2]; + w2[3] |= s2[3]; + + w3[0] |= s3[0]; + w3[1] |= s3[1]; + w3[2] |= s3[2]; + w3[3] |= s3[3]; + + append_0x80_4 (w0, w1, w2, w3, out_salt_len); + + /** + * sha512 + */ + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + w0_t[0] = swap_workaround (w0[0]); + w0_t[1] = swap_workaround (w0[1]); + w0_t[2] = swap_workaround (w0[2]); + w0_t[3] = swap_workaround (w0[3]); + w1_t[0] = swap_workaround (w1[0]); + w1_t[1] = swap_workaround (w1[1]); + w1_t[2] = swap_workaround (w1[2]); + w1_t[3] = swap_workaround (w1[3]); + w2_t[0] = swap_workaround (w2[0]); + w2_t[1] = swap_workaround (w2[1]); + w2_t[2] = swap_workaround (w2[2]); + w2_t[3] = swap_workaround (w2[3]); + w3_t[0] = swap_workaround (w3[0]); + w3_t[1] = swap_workaround (w3[1]); + w3_t[2] = 0; + w3_t[3] = out_salt_len * 8; + + u64x digest[8]; + + digest[0] = SHA512M_A; + digest[1] = SHA512M_B; + digest[2] = SHA512M_C; + digest[3] = SHA512M_D; + digest[4] = SHA512M_E; + digest[5] = SHA512M_F; + digest[6] = SHA512M_G; + digest[7] = SHA512M_H; + + sha512_transform (w0_t, w1_t, w2_t, w3_t, digest); + + + const u32x r0 = l32_from_64 (digest[7]); + const u32x r1 = h32_from_64 (digest[7]); + const u32x r2 = l32_from_64 (digest[3]); + const u32x r3 = h32_from_64 (digest[3]); + + #include VECT_COMPARE_M + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m01710_m08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m01710_m16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m01710_s04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + u32x pw_buf1[4]; + + pw_buf1[0] = pws[gid].i[ 4]; + pw_buf1[1] = pws[gid].i[ 5]; + pw_buf1[2] = pws[gid].i[ 6]; + pw_buf1[3] = pws[gid].i[ 7]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[7]; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + + w0[0] = pw_buf0[0]; + w0[1] = pw_buf0[1]; + w0[2] = pw_buf0[2]; + w0[3] = pw_buf0[3]; + + u32x w1[4]; + + w1[0] = pw_buf1[0]; + w1[1] = pw_buf1[1]; + w1[2] = pw_buf1[2]; + w1[3] = pw_buf1[3]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 out_len = apply_rules (rules_buf[il_pos].cmds, w0, w1, pw_len); + + /** + * append salt + */ + + u32 s0[4]; + + s0[0] = salt_buf0[0]; + s0[1] = salt_buf0[1]; + s0[2] = salt_buf0[2]; + s0[3] = salt_buf0[3]; + + u32 s1[4]; + + s1[0] = salt_buf1[0]; + s1[1] = salt_buf1[1]; + s1[2] = salt_buf1[2]; + s1[3] = salt_buf1[3]; + + u32 s2[4]; + + s2[0] = 0; + s2[1] = 0; + s2[2] = 0; + s2[3] = 0; + + u32 s3[4]; + + s3[0] = 0; + s3[1] = 0; + s3[2] = 0; + s3[3] = 0; + + switch_buffer_by_offset (s0, s1, s2, s3, out_len); + + const u32 out_salt_len = out_len + salt_len; + + w0[0] |= s0[0]; + w0[1] |= s0[1]; + w0[2] |= s0[2]; + w0[3] |= s0[3]; + + w1[0] |= s1[0]; + w1[1] |= s1[1]; + w1[2] |= s1[2]; + w1[3] |= s1[3]; + + w2[0] |= s2[0]; + w2[1] |= s2[1]; + w2[2] |= s2[2]; + w2[3] |= s2[3]; + + w3[0] |= s3[0]; + w3[1] |= s3[1]; + w3[2] |= s3[2]; + w3[3] |= s3[3]; + + append_0x80_4 (w0, w1, w2, w3, out_salt_len); + + /** + * sha512 + */ + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + w0_t[0] = swap_workaround (w0[0]); + w0_t[1] = swap_workaround (w0[1]); + w0_t[2] = swap_workaround (w0[2]); + w0_t[3] = swap_workaround (w0[3]); + w1_t[0] = swap_workaround (w1[0]); + w1_t[1] = swap_workaround (w1[1]); + w1_t[2] = swap_workaround (w1[2]); + w1_t[3] = swap_workaround (w1[3]); + w2_t[0] = swap_workaround (w2[0]); + w2_t[1] = swap_workaround (w2[1]); + w2_t[2] = swap_workaround (w2[2]); + w2_t[3] = swap_workaround (w2[3]); + w3_t[0] = swap_workaround (w3[0]); + w3_t[1] = swap_workaround (w3[1]); + w3_t[2] = 0; + w3_t[3] = out_salt_len * 8; + + u64x digest[8]; + + digest[0] = SHA512M_A; + digest[1] = SHA512M_B; + digest[2] = SHA512M_C; + digest[3] = SHA512M_D; + digest[4] = SHA512M_E; + digest[5] = SHA512M_F; + digest[6] = SHA512M_G; + digest[7] = SHA512M_H; + + sha512_transform (w0_t, w1_t, w2_t, w3_t, digest); + + + const u32x r0 = l32_from_64 (digest[7]); + const u32x r1 = h32_from_64 (digest[7]); + const u32x r2 = l32_from_64 (digest[3]); + const u32x r3 = h32_from_64 (digest[3]); + + #include VECT_COMPARE_S + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m01710_s08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m01710_s16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/amd/m01710_a1.cl b/amd/m01710_a1.cl new file mode 100644 index 0000000000..5dd2053bad --- /dev/null +++ b/amd/m01710_a1.cl @@ -0,0 +1,640 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _SHA512_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW4 +#define VECT_SIZE1 +#endif + +#ifdef VLIW5 +#define VECT_SIZE1 +#endif + +#define DGST_R0 14 +#define DGST_R1 15 +#define DGST_R2 6 +#define DGST_R3 7 + +#include "include/kernel_functions.c" +#include "types_amd.c" +#include "common_amd.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +__constant u64 k_sha512[80] = +{ + SHA512C00, SHA512C01, SHA512C02, SHA512C03, + SHA512C04, SHA512C05, SHA512C06, SHA512C07, + SHA512C08, SHA512C09, SHA512C0a, SHA512C0b, + SHA512C0c, SHA512C0d, SHA512C0e, SHA512C0f, + SHA512C10, SHA512C11, SHA512C12, SHA512C13, + SHA512C14, SHA512C15, SHA512C16, SHA512C17, + SHA512C18, SHA512C19, SHA512C1a, SHA512C1b, + SHA512C1c, SHA512C1d, SHA512C1e, SHA512C1f, + SHA512C20, SHA512C21, SHA512C22, SHA512C23, + SHA512C24, SHA512C25, SHA512C26, SHA512C27, + SHA512C28, SHA512C29, SHA512C2a, SHA512C2b, + SHA512C2c, SHA512C2d, SHA512C2e, SHA512C2f, + SHA512C30, SHA512C31, SHA512C32, SHA512C33, + SHA512C34, SHA512C35, SHA512C36, SHA512C37, + SHA512C38, SHA512C39, SHA512C3a, SHA512C3b, + SHA512C3c, SHA512C3d, SHA512C3e, SHA512C3f, + SHA512C40, SHA512C41, SHA512C42, SHA512C43, + SHA512C44, SHA512C45, SHA512C46, SHA512C47, + SHA512C48, SHA512C49, SHA512C4a, SHA512C4b, + SHA512C4c, SHA512C4d, SHA512C4e, SHA512C4f, +}; + +static void sha512_transform (const u32x w0[4], const u32x w1[4], const u32x w2[4], const u32x w3[4], u64x digest[8]) +{ + u64x w0_t = hl32_to_64 (w0[0], w0[1]); + u64x w1_t = hl32_to_64 (w0[2], w0[3]); + u64x w2_t = hl32_to_64 (w1[0], w1[1]); + u64x w3_t = hl32_to_64 (w1[2], w1[3]); + u64x w4_t = hl32_to_64 (w2[0], w2[1]); + u64x w5_t = hl32_to_64 (w2[2], w2[3]); + u64x w6_t = hl32_to_64 (w3[0], w3[1]); + u64x w7_t = 0; + u64x w8_t = 0; + u64x w9_t = 0; + u64x wa_t = 0; + u64x wb_t = 0; + u64x wc_t = 0; + u64x wd_t = 0; + u64x we_t = 0; + u64x wf_t = hl32_to_64 (w3[2], w3[3]); + + u64x a = digest[0]; + u64x b = digest[1]; + u64x c = digest[2]; + u64x d = digest[3]; + u64x e = digest[4]; + u64x f = digest[5]; + u64x g = digest[6]; + u64x h = digest[7]; + + #define ROUND_EXPAND() \ + { \ + w0_t = SHA512_EXPAND (we_t, w9_t, w1_t, w0_t); \ + w1_t = SHA512_EXPAND (wf_t, wa_t, w2_t, w1_t); \ + w2_t = SHA512_EXPAND (w0_t, wb_t, w3_t, w2_t); \ + w3_t = SHA512_EXPAND (w1_t, wc_t, w4_t, w3_t); \ + w4_t = SHA512_EXPAND (w2_t, wd_t, w5_t, w4_t); \ + w5_t = SHA512_EXPAND (w3_t, we_t, w6_t, w5_t); \ + w6_t = SHA512_EXPAND (w4_t, wf_t, w7_t, w6_t); \ + w7_t = SHA512_EXPAND (w5_t, w0_t, w8_t, w7_t); \ + w8_t = SHA512_EXPAND (w6_t, w1_t, w9_t, w8_t); \ + w9_t = SHA512_EXPAND (w7_t, w2_t, wa_t, w9_t); \ + wa_t = SHA512_EXPAND (w8_t, w3_t, wb_t, wa_t); \ + wb_t = SHA512_EXPAND (w9_t, w4_t, wc_t, wb_t); \ + wc_t = SHA512_EXPAND (wa_t, w5_t, wd_t, wc_t); \ + wd_t = SHA512_EXPAND (wb_t, w6_t, we_t, wd_t); \ + we_t = SHA512_EXPAND (wc_t, w7_t, wf_t, we_t); \ + wf_t = SHA512_EXPAND (wd_t, w8_t, w0_t, wf_t); \ + } + + #define ROUND_STEP(i) \ + { \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, a, b, c, d, e, f, g, h, w0_t, k_sha512[i + 0]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, h, a, b, c, d, e, f, g, w1_t, k_sha512[i + 1]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, g, h, a, b, c, d, e, f, w2_t, k_sha512[i + 2]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, f, g, h, a, b, c, d, e, w3_t, k_sha512[i + 3]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, e, f, g, h, a, b, c, d, w4_t, k_sha512[i + 4]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, d, e, f, g, h, a, b, c, w5_t, k_sha512[i + 5]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, c, d, e, f, g, h, a, b, w6_t, k_sha512[i + 6]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, b, c, d, e, f, g, h, a, w7_t, k_sha512[i + 7]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, a, b, c, d, e, f, g, h, w8_t, k_sha512[i + 8]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, h, a, b, c, d, e, f, g, w9_t, k_sha512[i + 9]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, g, h, a, b, c, d, e, f, wa_t, k_sha512[i + 10]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, f, g, h, a, b, c, d, e, wb_t, k_sha512[i + 11]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, e, f, g, h, a, b, c, d, wc_t, k_sha512[i + 12]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, d, e, f, g, h, a, b, c, wd_t, k_sha512[i + 13]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, c, d, e, f, g, h, a, b, we_t, k_sha512[i + 14]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, b, c, d, e, f, g, h, a, wf_t, k_sha512[i + 15]); \ + } + + ROUND_STEP (0); + + #pragma unroll + for (int i = 16; i < 80; i += 16) + { + ROUND_EXPAND (); ROUND_STEP (i); + } + + /* rev + digest[0] += a; + digest[1] += b; + digest[2] += c; + digest[3] += d; + digest[4] += e; + digest[5] += f; + digest[6] += g; + digest[7] += h; + */ + + digest[0] = a; + digest[1] = b; + digest[2] = c; + digest[3] = d; + digest[4] = e; + digest[5] = f; + digest[6] = g; + digest[7] = h; +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m01710_m04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, combs_buf[0].pw_len); + } + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[7]; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = combs_buf[il_pos].pw_len; + + const u32 pw_len = pw_l_len + pw_r_len; + + u32 wordr0[4]; + + wordr0[0] = combs_buf[il_pos].i[0]; + wordr0[1] = combs_buf[il_pos].i[1]; + wordr0[2] = combs_buf[il_pos].i[2]; + wordr0[3] = combs_buf[il_pos].i[3]; + + u32 wordr1[4]; + + wordr1[0] = combs_buf[il_pos].i[4]; + wordr1[1] = combs_buf[il_pos].i[5]; + wordr1[2] = combs_buf[il_pos].i[6]; + wordr1[3] = combs_buf[il_pos].i[7]; + + u32 wordr2[4]; + + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + + u32 wordr3[4]; + + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + /** + * append salt + */ + + u32 s0[4]; + + s0[0] = salt_buf0[0]; + s0[1] = salt_buf0[1]; + s0[2] = salt_buf0[2]; + s0[3] = salt_buf0[3]; + + u32 s1[4]; + + s1[0] = salt_buf1[0]; + s1[1] = salt_buf1[1]; + s1[2] = salt_buf1[2]; + s1[3] = salt_buf1[3]; + + u32 s2[4]; + + s2[0] = 0; + s2[1] = 0; + s2[2] = 0; + s2[3] = 0; + + u32 s3[4]; + + s3[0] = 0; + s3[1] = 0; + s3[2] = 0; + s3[3] = 0; + + switch_buffer_by_offset (s0, s1, s2, s3, pw_len); + + const u32 pw_salt_len = pw_len + salt_len; + + u32x w0[4]; + u32x w1[4]; + u32x w2[4]; + u32x w3[4]; + + w0[0] = wordl0[0] | wordr0[0] | s0[0]; + w0[1] = wordl0[1] | wordr0[1] | s0[1]; + w0[2] = wordl0[2] | wordr0[2] | s0[2]; + w0[3] = wordl0[3] | wordr0[3] | s0[3]; + w1[0] = wordl1[0] | wordr1[0] | s1[0]; + w1[1] = wordl1[1] | wordr1[1] | s1[1]; + w1[2] = wordl1[2] | wordr1[2] | s1[2]; + w1[3] = wordl1[3] | wordr1[3] | s1[3]; + w2[0] = wordl2[0] | wordr2[0] | s2[0]; + w2[1] = wordl2[1] | wordr2[1] | s2[1]; + w2[2] = wordl2[2] | wordr2[2] | s2[2]; + w2[3] = wordl2[3] | wordr2[3] | s2[3]; + w3[0] = wordl3[0] | wordr3[0] | s3[0]; + w3[1] = wordl3[1] | wordr3[1] | s3[1]; + w3[2] = wordl3[2] | wordr3[2] | s3[2]; + w3[3] = wordl3[3] | wordr3[3] | s3[3]; + + append_0x80_4 (w0, w1, w2, w3, pw_salt_len); + + /** + * sha512 + */ + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + w0_t[0] = swap_workaround (w0[0]); + w0_t[1] = swap_workaround (w0[1]); + w0_t[2] = swap_workaround (w0[2]); + w0_t[3] = swap_workaround (w0[3]); + w1_t[0] = swap_workaround (w1[0]); + w1_t[1] = swap_workaround (w1[1]); + w1_t[2] = swap_workaround (w1[2]); + w1_t[3] = swap_workaround (w1[3]); + w2_t[0] = swap_workaround (w2[0]); + w2_t[1] = swap_workaround (w2[1]); + w2_t[2] = swap_workaround (w2[2]); + w2_t[3] = swap_workaround (w2[3]); + w3_t[0] = swap_workaround (w3[0]); + w3_t[1] = swap_workaround (w3[1]); + w3_t[2] = 0; + w3_t[3] = pw_salt_len * 8; + + u64x digest[8]; + + digest[0] = SHA512M_A; + digest[1] = SHA512M_B; + digest[2] = SHA512M_C; + digest[3] = SHA512M_D; + digest[4] = SHA512M_E; + digest[5] = SHA512M_F; + digest[6] = SHA512M_G; + digest[7] = SHA512M_H; + + sha512_transform (w0_t, w1_t, w2_t, w3_t, digest); + + + const u32x r0 = l32_from_64 (digest[7]); + const u32x r1 = h32_from_64 (digest[7]); + const u32x r2 = l32_from_64 (digest[3]); + const u32x r3 = h32_from_64 (digest[3]); + + #include VECT_COMPARE_M + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m01710_m08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m01710_m16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m01710_s04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, combs_buf[0].pw_len); + } + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[7]; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = combs_buf[il_pos].pw_len; + + const u32 pw_len = pw_l_len + pw_r_len; + + u32 wordr0[4]; + + wordr0[0] = combs_buf[il_pos].i[0]; + wordr0[1] = combs_buf[il_pos].i[1]; + wordr0[2] = combs_buf[il_pos].i[2]; + wordr0[3] = combs_buf[il_pos].i[3]; + + u32 wordr1[4]; + + wordr1[0] = combs_buf[il_pos].i[4]; + wordr1[1] = combs_buf[il_pos].i[5]; + wordr1[2] = combs_buf[il_pos].i[6]; + wordr1[3] = combs_buf[il_pos].i[7]; + + u32 wordr2[4]; + + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + + u32 wordr3[4]; + + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + /** + * append salt + */ + + u32 s0[4]; + + s0[0] = salt_buf0[0]; + s0[1] = salt_buf0[1]; + s0[2] = salt_buf0[2]; + s0[3] = salt_buf0[3]; + + u32 s1[4]; + + s1[0] = salt_buf1[0]; + s1[1] = salt_buf1[1]; + s1[2] = salt_buf1[2]; + s1[3] = salt_buf1[3]; + + u32 s2[4]; + + s2[0] = 0; + s2[1] = 0; + s2[2] = 0; + s2[3] = 0; + + u32 s3[4]; + + s3[0] = 0; + s3[1] = 0; + s3[2] = 0; + s3[3] = 0; + + switch_buffer_by_offset (s0, s1, s2, s3, pw_len); + + const u32 pw_salt_len = pw_len + salt_len; + + u32x w0[4]; + u32x w1[4]; + u32x w2[4]; + u32x w3[4]; + + w0[0] = wordl0[0] | wordr0[0] | s0[0]; + w0[1] = wordl0[1] | wordr0[1] | s0[1]; + w0[2] = wordl0[2] | wordr0[2] | s0[2]; + w0[3] = wordl0[3] | wordr0[3] | s0[3]; + w1[0] = wordl1[0] | wordr1[0] | s1[0]; + w1[1] = wordl1[1] | wordr1[1] | s1[1]; + w1[2] = wordl1[2] | wordr1[2] | s1[2]; + w1[3] = wordl1[3] | wordr1[3] | s1[3]; + w2[0] = wordl2[0] | wordr2[0] | s2[0]; + w2[1] = wordl2[1] | wordr2[1] | s2[1]; + w2[2] = wordl2[2] | wordr2[2] | s2[2]; + w2[3] = wordl2[3] | wordr2[3] | s2[3]; + w3[0] = wordl3[0] | wordr3[0] | s3[0]; + w3[1] = wordl3[1] | wordr3[1] | s3[1]; + w3[2] = wordl3[2] | wordr3[2] | s3[2]; + w3[3] = wordl3[3] | wordr3[3] | s3[3]; + + append_0x80_4 (w0, w1, w2, w3, pw_salt_len); + + /** + * sha512 + */ + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + w0_t[0] = swap_workaround (w0[0]); + w0_t[1] = swap_workaround (w0[1]); + w0_t[2] = swap_workaround (w0[2]); + w0_t[3] = swap_workaround (w0[3]); + w1_t[0] = swap_workaround (w1[0]); + w1_t[1] = swap_workaround (w1[1]); + w1_t[2] = swap_workaround (w1[2]); + w1_t[3] = swap_workaround (w1[3]); + w2_t[0] = swap_workaround (w2[0]); + w2_t[1] = swap_workaround (w2[1]); + w2_t[2] = swap_workaround (w2[2]); + w2_t[3] = swap_workaround (w2[3]); + w3_t[0] = swap_workaround (w3[0]); + w3_t[1] = swap_workaround (w3[1]); + w3_t[2] = 0; + w3_t[3] = pw_salt_len * 8; + + u64x digest[8]; + + digest[0] = SHA512M_A; + digest[1] = SHA512M_B; + digest[2] = SHA512M_C; + digest[3] = SHA512M_D; + digest[4] = SHA512M_E; + digest[5] = SHA512M_F; + digest[6] = SHA512M_G; + digest[7] = SHA512M_H; + + sha512_transform (w0_t, w1_t, w2_t, w3_t, digest); + + + const u32x r0 = l32_from_64 (digest[7]); + const u32x r1 = h32_from_64 (digest[7]); + const u32x r2 = l32_from_64 (digest[3]); + const u32x r3 = h32_from_64 (digest[3]); + + #include VECT_COMPARE_S + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m01710_s08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m01710_s16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/amd/m01710_a3.cl b/amd/m01710_a3.cl new file mode 100644 index 0000000000..c7c6531f3e --- /dev/null +++ b/amd/m01710_a3.cl @@ -0,0 +1,600 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _SHA512_ +#define _SCALAR_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW4 +#define VECT_SIZE1 +#endif + +#ifdef VLIW5 +#define VECT_SIZE1 +#endif + +#define DGST_R0 14 +#define DGST_R1 15 +#define DGST_R2 6 +#define DGST_R3 7 + +#include "include/kernel_functions.c" +#include "types_amd.c" +#include "common_amd.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4_warp.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4_warp.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4_warp.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4_warp.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4_warp.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4_warp.c" +#endif + +__constant u64 k_sha512[80] = +{ + SHA512C00, SHA512C01, SHA512C02, SHA512C03, + SHA512C04, SHA512C05, SHA512C06, SHA512C07, + SHA512C08, SHA512C09, SHA512C0a, SHA512C0b, + SHA512C0c, SHA512C0d, SHA512C0e, SHA512C0f, + SHA512C10, SHA512C11, SHA512C12, SHA512C13, + SHA512C14, SHA512C15, SHA512C16, SHA512C17, + SHA512C18, SHA512C19, SHA512C1a, SHA512C1b, + SHA512C1c, SHA512C1d, SHA512C1e, SHA512C1f, + SHA512C20, SHA512C21, SHA512C22, SHA512C23, + SHA512C24, SHA512C25, SHA512C26, SHA512C27, + SHA512C28, SHA512C29, SHA512C2a, SHA512C2b, + SHA512C2c, SHA512C2d, SHA512C2e, SHA512C2f, + SHA512C30, SHA512C31, SHA512C32, SHA512C33, + SHA512C34, SHA512C35, SHA512C36, SHA512C37, + SHA512C38, SHA512C39, SHA512C3a, SHA512C3b, + SHA512C3c, SHA512C3d, SHA512C3e, SHA512C3f, + SHA512C40, SHA512C41, SHA512C42, SHA512C43, + SHA512C44, SHA512C45, SHA512C46, SHA512C47, + SHA512C48, SHA512C49, SHA512C4a, SHA512C4b, + SHA512C4c, SHA512C4d, SHA512C4e, SHA512C4f, +}; + +static void sha512_transform (const u32x w0[4], const u32x w1[4], const u32x w2[4], const u32x w3[4], u64x digest[8]) +{ + u64x w0_t = hl32_to_64 (w0[0], w0[1]); + u64x w1_t = hl32_to_64 (w0[2], w0[3]); + u64x w2_t = hl32_to_64 (w1[0], w1[1]); + u64x w3_t = hl32_to_64 (w1[2], w1[3]); + u64x w4_t = hl32_to_64 (w2[0], w2[1]); + u64x w5_t = hl32_to_64 (w2[2], w2[3]); + u64x w6_t = hl32_to_64 (w3[0], w3[1]); + u64x w7_t = 0; + u64x w8_t = 0; + u64x w9_t = 0; + u64x wa_t = 0; + u64x wb_t = 0; + u64x wc_t = 0; + u64x wd_t = 0; + u64x we_t = 0; + u64x wf_t = hl32_to_64 (w3[2], w3[3]); + + u64x a = digest[0]; + u64x b = digest[1]; + u64x c = digest[2]; + u64x d = digest[3]; + u64x e = digest[4]; + u64x f = digest[5]; + u64x g = digest[6]; + u64x h = digest[7]; + + #define ROUND_EXPAND() \ + { \ + w0_t = SHA512_EXPAND (we_t, w9_t, w1_t, w0_t); \ + w1_t = SHA512_EXPAND (wf_t, wa_t, w2_t, w1_t); \ + w2_t = SHA512_EXPAND (w0_t, wb_t, w3_t, w2_t); \ + w3_t = SHA512_EXPAND (w1_t, wc_t, w4_t, w3_t); \ + w4_t = SHA512_EXPAND (w2_t, wd_t, w5_t, w4_t); \ + w5_t = SHA512_EXPAND (w3_t, we_t, w6_t, w5_t); \ + w6_t = SHA512_EXPAND (w4_t, wf_t, w7_t, w6_t); \ + w7_t = SHA512_EXPAND (w5_t, w0_t, w8_t, w7_t); \ + w8_t = SHA512_EXPAND (w6_t, w1_t, w9_t, w8_t); \ + w9_t = SHA512_EXPAND (w7_t, w2_t, wa_t, w9_t); \ + wa_t = SHA512_EXPAND (w8_t, w3_t, wb_t, wa_t); \ + wb_t = SHA512_EXPAND (w9_t, w4_t, wc_t, wb_t); \ + wc_t = SHA512_EXPAND (wa_t, w5_t, wd_t, wc_t); \ + wd_t = SHA512_EXPAND (wb_t, w6_t, we_t, wd_t); \ + we_t = SHA512_EXPAND (wc_t, w7_t, wf_t, we_t); \ + wf_t = SHA512_EXPAND (wd_t, w8_t, w0_t, wf_t); \ + } + + #define ROUND_STEP(i) \ + { \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, a, b, c, d, e, f, g, h, w0_t, k_sha512[i + 0]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, h, a, b, c, d, e, f, g, w1_t, k_sha512[i + 1]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, g, h, a, b, c, d, e, f, w2_t, k_sha512[i + 2]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, f, g, h, a, b, c, d, e, w3_t, k_sha512[i + 3]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, e, f, g, h, a, b, c, d, w4_t, k_sha512[i + 4]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, d, e, f, g, h, a, b, c, w5_t, k_sha512[i + 5]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, c, d, e, f, g, h, a, b, w6_t, k_sha512[i + 6]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, b, c, d, e, f, g, h, a, w7_t, k_sha512[i + 7]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, a, b, c, d, e, f, g, h, w8_t, k_sha512[i + 8]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, h, a, b, c, d, e, f, g, w9_t, k_sha512[i + 9]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, g, h, a, b, c, d, e, f, wa_t, k_sha512[i + 10]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, f, g, h, a, b, c, d, e, wb_t, k_sha512[i + 11]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, e, f, g, h, a, b, c, d, wc_t, k_sha512[i + 12]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, d, e, f, g, h, a, b, c, wd_t, k_sha512[i + 13]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, c, d, e, f, g, h, a, b, we_t, k_sha512[i + 14]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, b, c, d, e, f, g, h, a, wf_t, k_sha512[i + 15]); \ + } + + ROUND_STEP (0); + + #pragma unroll + for (int i = 16; i < 80; i += 16) + { + ROUND_EXPAND (); ROUND_STEP (i); + } + + /* rev + digest[0] += a; + digest[1] += b; + digest[2] += c; + digest[3] += d; + digest[4] += e; + digest[5] += f; + digest[6] += g; + digest[7] += h; + */ + + digest[0] = a; + digest[1] = b; + digest[2] = c; + digest[3] = d; + digest[4] = e; + digest[5] = f; + digest[6] = g; + digest[7] = h; +} + +static void m01710m (u32 w[16], const u32 pw_len, __global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global u32x * words_buf_r, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset) +{ + /** + * modifier + */ + + const u32 gid = get_global_id (0); + const u32 lid = get_local_id (0); + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[ 1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[ 2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[ 3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[ 4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[ 5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[ 6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[ 7]; + + u32 salt_buf2[4]; + + salt_buf2[0] = salt_bufs[salt_pos].salt_buf[ 8]; + salt_buf2[1] = 0; + salt_buf2[2] = 0; + salt_buf2[3] = 0; + + u32 salt_buf3[4]; + + salt_buf3[0] = 0; + salt_buf3[1] = 0; + salt_buf3[2] = 0; + salt_buf3[3] = 0; + + switch_buffer_by_offset (salt_buf0, salt_buf1, salt_buf2, salt_buf3, pw_len); + + w[ 0] |= swap_workaround (salt_buf0[0]); + w[ 1] |= swap_workaround (salt_buf0[1]); + w[ 2] |= swap_workaround (salt_buf0[2]); + w[ 3] |= swap_workaround (salt_buf0[3]); + w[ 4] |= swap_workaround (salt_buf1[0]); + w[ 5] |= swap_workaround (salt_buf1[1]); + w[ 6] |= swap_workaround (salt_buf1[2]); + w[ 7] |= swap_workaround (salt_buf1[3]); + w[ 8] |= swap_workaround (salt_buf2[0]); + w[ 9] |= swap_workaround (salt_buf2[1]); + w[10] |= swap_workaround (salt_buf2[2]); + w[11] |= swap_workaround (salt_buf2[3]); + w[12] |= swap_workaround (salt_buf3[0]); + w[13] |= swap_workaround (salt_buf3[1]); + w[14] |= swap_workaround (salt_buf3[2]); + w[15] |= swap_workaround (salt_buf3[3]); + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + const u32 pw_salt_len = pw_len + salt_len; + + w[15] = pw_salt_len * 8; + + /** + * loop + */ + + const u32 bf_loops = ceil ((float) bfs_cnt / VECT_DIV); + + u32x w0l = w[0]; + + for (u32 il_pos = 0; il_pos < bf_loops; il_pos++) + { + const u32x w0r = words_buf_r[il_pos]; + + const u32x w0 = w0l | w0r; + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + w0_t[0] = w0; + w0_t[1] = w[ 1]; + w0_t[2] = w[ 2]; + w0_t[3] = w[ 3]; + w1_t[0] = w[ 4]; + w1_t[1] = w[ 5]; + w1_t[2] = w[ 6]; + w1_t[3] = w[ 7]; + w2_t[0] = w[ 8]; + w2_t[1] = w[ 9]; + w2_t[2] = w[10]; + w2_t[3] = w[11]; + w3_t[0] = w[12]; + w3_t[1] = w[13]; + w3_t[2] = w[14]; + w3_t[3] = w[15]; + + u64x digest[8]; + + digest[0] = SHA512M_A; + digest[1] = SHA512M_B; + digest[2] = SHA512M_C; + digest[3] = SHA512M_D; + digest[4] = SHA512M_E; + digest[5] = SHA512M_F; + digest[6] = SHA512M_G; + digest[7] = SHA512M_H; + + sha512_transform (w0_t, w1_t, w2_t, w3_t, digest); + + + const u32x r0 = l32_from_64 (digest[7]); + const u32x r1 = h32_from_64 (digest[7]); + const u32x r2 = l32_from_64 (digest[3]); + const u32x r3 = h32_from_64 (digest[3]); + + #include VECT_COMPARE_M + } +} + +static void m01710s (u32 w[16], const u32 pw_len, __global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global u32x * words_buf_r, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset) +{ + /** + * modifier + */ + + const u32 gid = get_global_id (0); + const u32 lid = get_local_id (0); + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * loop + */ + + const u32 bf_loops = ceil ((float) bfs_cnt / VECT_DIV); + + u32x w0l = w[0]; + + for (u32 il_pos = 0; il_pos < bf_loops; il_pos++) + { + const u32x w0r = words_buf_r[il_pos]; + + const u32x w0 = w0l | w0r; + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + w0_t[0] = w0; + w0_t[1] = w[ 1]; + w0_t[2] = w[ 2]; + w0_t[3] = w[ 3]; + w1_t[0] = w[ 4]; + w1_t[1] = w[ 5]; + w1_t[2] = w[ 6]; + w1_t[3] = w[ 7]; + w2_t[0] = w[ 8]; + w2_t[1] = w[ 9]; + w2_t[2] = w[10]; + w2_t[3] = w[11]; + w3_t[0] = w[12]; + w3_t[1] = w[13]; + w3_t[2] = w[14]; + w3_t[3] = w[15]; + + u64x digest[8]; + + digest[0] = SHA512M_A; + digest[1] = SHA512M_B; + digest[2] = SHA512M_C; + digest[3] = SHA512M_D; + digest[4] = SHA512M_E; + digest[5] = SHA512M_F; + digest[6] = SHA512M_G; + digest[7] = SHA512M_H; + + sha512_transform (w0_t, w1_t, w2_t, w3_t, digest); + + + const u32x r0 = l32_from_64 (digest[7]); + const u32x r1 = h32_from_64 (digest[7]); + const u32x r2 = l32_from_64 (digest[3]); + const u32x r3 = h32_from_64 (digest[3]); + + #include VECT_COMPARE_S + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m01710_m04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global u32x * words_buf_r, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32 w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = 0; + w[ 5] = 0; + w[ 6] = 0; + w[ 7] = 0; + w[ 8] = 0; + w[ 9] = 0; + w[10] = 0; + w[11] = 0; + w[12] = 0; + w[13] = 0; + w[14] = 0; + w[15] = pws[gid].i[15]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m01710m (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m01710_m08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global u32x * words_buf_r, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32 w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = pws[gid].i[ 4]; + w[ 5] = pws[gid].i[ 5]; + w[ 6] = pws[gid].i[ 6]; + w[ 7] = pws[gid].i[ 7]; + w[ 8] = 0; + w[ 9] = 0; + w[10] = 0; + w[11] = 0; + w[12] = 0; + w[13] = 0; + w[14] = 0; + w[15] = pws[gid].i[15]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m01710m (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m01710_m16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global u32x * words_buf_r, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32 w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = pws[gid].i[ 4]; + w[ 5] = pws[gid].i[ 5]; + w[ 6] = pws[gid].i[ 6]; + w[ 7] = pws[gid].i[ 7]; + w[ 8] = pws[gid].i[ 8]; + w[ 9] = pws[gid].i[ 9]; + w[10] = pws[gid].i[10]; + w[11] = pws[gid].i[11]; + w[12] = pws[gid].i[12]; + w[13] = pws[gid].i[13]; + w[14] = pws[gid].i[14]; + w[15] = pws[gid].i[15]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m01710m (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m01710_s04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global u32x * words_buf_r, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32 w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = 0; + w[ 5] = 0; + w[ 6] = 0; + w[ 7] = 0; + w[ 8] = 0; + w[ 9] = 0; + w[10] = 0; + w[11] = 0; + w[12] = 0; + w[13] = 0; + w[14] = 0; + w[15] = pws[gid].i[15]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m01710s (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m01710_s08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global u32x * words_buf_r, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32 w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = pws[gid].i[ 4]; + w[ 5] = pws[gid].i[ 5]; + w[ 6] = pws[gid].i[ 6]; + w[ 7] = pws[gid].i[ 7]; + w[ 8] = 0; + w[ 9] = 0; + w[10] = 0; + w[11] = 0; + w[12] = 0; + w[13] = 0; + w[14] = 0; + w[15] = pws[gid].i[15]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m01710s (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m01710_s16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global u32x * words_buf_r, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32 w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = pws[gid].i[ 4]; + w[ 5] = pws[gid].i[ 5]; + w[ 6] = pws[gid].i[ 6]; + w[ 7] = pws[gid].i[ 7]; + w[ 8] = pws[gid].i[ 8]; + w[ 9] = pws[gid].i[ 9]; + w[10] = pws[gid].i[10]; + w[11] = pws[gid].i[11]; + w[12] = pws[gid].i[12]; + w[13] = pws[gid].i[13]; + w[14] = pws[gid].i[14]; + w[15] = pws[gid].i[15]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m01710s (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} diff --git a/amd/m01720_a0.cl b/amd/m01720_a0.cl new file mode 100644 index 0000000000..dff8fec30c --- /dev/null +++ b/amd/m01720_a0.cl @@ -0,0 +1,508 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _SHA512_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW4 +#define VECT_SIZE1 +#endif + +#ifdef VLIW5 +#define VECT_SIZE1 +#endif + +#define DGST_R0 14 +#define DGST_R1 15 +#define DGST_R2 6 +#define DGST_R3 7 + +#include "include/kernel_functions.c" +#include "types_amd.c" +#include "common_amd.c" +#include "include/rp_gpu.h" +#include "rp_amd.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +__constant u64 k_sha512[80] = +{ + SHA512C00, SHA512C01, SHA512C02, SHA512C03, + SHA512C04, SHA512C05, SHA512C06, SHA512C07, + SHA512C08, SHA512C09, SHA512C0a, SHA512C0b, + SHA512C0c, SHA512C0d, SHA512C0e, SHA512C0f, + SHA512C10, SHA512C11, SHA512C12, SHA512C13, + SHA512C14, SHA512C15, SHA512C16, SHA512C17, + SHA512C18, SHA512C19, SHA512C1a, SHA512C1b, + SHA512C1c, SHA512C1d, SHA512C1e, SHA512C1f, + SHA512C20, SHA512C21, SHA512C22, SHA512C23, + SHA512C24, SHA512C25, SHA512C26, SHA512C27, + SHA512C28, SHA512C29, SHA512C2a, SHA512C2b, + SHA512C2c, SHA512C2d, SHA512C2e, SHA512C2f, + SHA512C30, SHA512C31, SHA512C32, SHA512C33, + SHA512C34, SHA512C35, SHA512C36, SHA512C37, + SHA512C38, SHA512C39, SHA512C3a, SHA512C3b, + SHA512C3c, SHA512C3d, SHA512C3e, SHA512C3f, + SHA512C40, SHA512C41, SHA512C42, SHA512C43, + SHA512C44, SHA512C45, SHA512C46, SHA512C47, + SHA512C48, SHA512C49, SHA512C4a, SHA512C4b, + SHA512C4c, SHA512C4d, SHA512C4e, SHA512C4f, +}; + +static void sha512_transform (const u32x w0[4], const u32x w1[4], const u32x w2[4], const u32x w3[4], u64x digest[8]) +{ + u64x w0_t = hl32_to_64 (w0[0], w0[1]); + u64x w1_t = hl32_to_64 (w0[2], w0[3]); + u64x w2_t = hl32_to_64 (w1[0], w1[1]); + u64x w3_t = hl32_to_64 (w1[2], w1[3]); + u64x w4_t = hl32_to_64 (w2[0], w2[1]); + u64x w5_t = hl32_to_64 (w2[2], w2[3]); + u64x w6_t = hl32_to_64 (w3[0], w3[1]); + u64x w7_t = 0; + u64x w8_t = 0; + u64x w9_t = 0; + u64x wa_t = 0; + u64x wb_t = 0; + u64x wc_t = 0; + u64x wd_t = 0; + u64x we_t = 0; + u64x wf_t = hl32_to_64 (w3[2], w3[3]); + + u64x a = digest[0]; + u64x b = digest[1]; + u64x c = digest[2]; + u64x d = digest[3]; + u64x e = digest[4]; + u64x f = digest[5]; + u64x g = digest[6]; + u64x h = digest[7]; + + #define ROUND_EXPAND() \ + { \ + w0_t = SHA512_EXPAND (we_t, w9_t, w1_t, w0_t); \ + w1_t = SHA512_EXPAND (wf_t, wa_t, w2_t, w1_t); \ + w2_t = SHA512_EXPAND (w0_t, wb_t, w3_t, w2_t); \ + w3_t = SHA512_EXPAND (w1_t, wc_t, w4_t, w3_t); \ + w4_t = SHA512_EXPAND (w2_t, wd_t, w5_t, w4_t); \ + w5_t = SHA512_EXPAND (w3_t, we_t, w6_t, w5_t); \ + w6_t = SHA512_EXPAND (w4_t, wf_t, w7_t, w6_t); \ + w7_t = SHA512_EXPAND (w5_t, w0_t, w8_t, w7_t); \ + w8_t = SHA512_EXPAND (w6_t, w1_t, w9_t, w8_t); \ + w9_t = SHA512_EXPAND (w7_t, w2_t, wa_t, w9_t); \ + wa_t = SHA512_EXPAND (w8_t, w3_t, wb_t, wa_t); \ + wb_t = SHA512_EXPAND (w9_t, w4_t, wc_t, wb_t); \ + wc_t = SHA512_EXPAND (wa_t, w5_t, wd_t, wc_t); \ + wd_t = SHA512_EXPAND (wb_t, w6_t, we_t, wd_t); \ + we_t = SHA512_EXPAND (wc_t, w7_t, wf_t, we_t); \ + wf_t = SHA512_EXPAND (wd_t, w8_t, w0_t, wf_t); \ + } + + #define ROUND_STEP(i) \ + { \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, a, b, c, d, e, f, g, h, w0_t, k_sha512[i + 0]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, h, a, b, c, d, e, f, g, w1_t, k_sha512[i + 1]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, g, h, a, b, c, d, e, f, w2_t, k_sha512[i + 2]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, f, g, h, a, b, c, d, e, w3_t, k_sha512[i + 3]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, e, f, g, h, a, b, c, d, w4_t, k_sha512[i + 4]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, d, e, f, g, h, a, b, c, w5_t, k_sha512[i + 5]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, c, d, e, f, g, h, a, b, w6_t, k_sha512[i + 6]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, b, c, d, e, f, g, h, a, w7_t, k_sha512[i + 7]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, a, b, c, d, e, f, g, h, w8_t, k_sha512[i + 8]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, h, a, b, c, d, e, f, g, w9_t, k_sha512[i + 9]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, g, h, a, b, c, d, e, f, wa_t, k_sha512[i + 10]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, f, g, h, a, b, c, d, e, wb_t, k_sha512[i + 11]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, e, f, g, h, a, b, c, d, wc_t, k_sha512[i + 12]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, d, e, f, g, h, a, b, c, wd_t, k_sha512[i + 13]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, c, d, e, f, g, h, a, b, we_t, k_sha512[i + 14]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, b, c, d, e, f, g, h, a, wf_t, k_sha512[i + 15]); \ + } + + ROUND_STEP (0); + + #pragma unroll + for (int i = 16; i < 80; i += 16) + { + ROUND_EXPAND (); ROUND_STEP (i); + } + + /* rev + digest[0] += a; + digest[1] += b; + digest[2] += c; + digest[3] += d; + digest[4] += e; + digest[5] += f; + digest[6] += g; + digest[7] += h; + */ + + digest[0] = a; + digest[1] = b; + digest[2] = c; + digest[3] = d; + digest[4] = e; + digest[5] = f; + digest[6] = g; + digest[7] = h; +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m01720_m04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + u32x pw_buf1[4]; + + pw_buf1[0] = pws[gid].i[ 4]; + pw_buf1[1] = pws[gid].i[ 5]; + pw_buf1[2] = pws[gid].i[ 6]; + pw_buf1[3] = pws[gid].i[ 7]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[7]; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + + w0[0] = pw_buf0[0]; + w0[1] = pw_buf0[1]; + w0[2] = pw_buf0[2]; + w0[3] = pw_buf0[3]; + + u32x w1[4]; + + w1[0] = pw_buf1[0]; + w1[1] = pw_buf1[1]; + w1[2] = pw_buf1[2]; + w1[3] = pw_buf1[3]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 out_len = apply_rules (rules_buf[il_pos].cmds, w0, w1, pw_len); + + /** + * prepend salt + */ + + const u32 out_salt_len = out_len + salt_len; + + switch_buffer_by_offset (w0, w1, w2, w3, salt_len); + + w0[0] |= salt_buf0[0]; + w0[1] |= salt_buf0[1]; + w0[2] |= salt_buf0[2]; + w0[3] |= salt_buf0[3]; + w1[0] |= salt_buf1[0]; + w1[1] |= salt_buf1[1]; + w1[2] |= salt_buf1[2]; + w1[3] |= salt_buf1[3]; + + append_0x80_4 (w0, w1, w2, w3, out_salt_len); + + /** + * sha512 + */ + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + w0_t[0] = swap_workaround (w0[0]); + w0_t[1] = swap_workaround (w0[1]); + w0_t[2] = swap_workaround (w0[2]); + w0_t[3] = swap_workaround (w0[3]); + w1_t[0] = swap_workaround (w1[0]); + w1_t[1] = swap_workaround (w1[1]); + w1_t[2] = swap_workaround (w1[2]); + w1_t[3] = swap_workaround (w1[3]); + w2_t[0] = swap_workaround (w2[0]); + w2_t[1] = swap_workaround (w2[1]); + w2_t[2] = swap_workaround (w2[2]); + w2_t[3] = swap_workaround (w2[3]); + w3_t[0] = swap_workaround (w3[0]); + w3_t[1] = swap_workaround (w3[1]); + w3_t[2] = 0; + w3_t[3] = out_salt_len * 8; + + u64x digest[8]; + + digest[0] = SHA512M_A; + digest[1] = SHA512M_B; + digest[2] = SHA512M_C; + digest[3] = SHA512M_D; + digest[4] = SHA512M_E; + digest[5] = SHA512M_F; + digest[6] = SHA512M_G; + digest[7] = SHA512M_H; + + sha512_transform (w0_t, w1_t, w2_t, w3_t, digest); + + + const u32x r0 = l32_from_64 (digest[7]); + const u32x r1 = h32_from_64 (digest[7]); + const u32x r2 = l32_from_64 (digest[3]); + const u32x r3 = h32_from_64 (digest[3]); + + #include VECT_COMPARE_M + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m01720_m08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m01720_m16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m01720_s04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + u32x pw_buf1[4]; + + pw_buf1[0] = pws[gid].i[ 4]; + pw_buf1[1] = pws[gid].i[ 5]; + pw_buf1[2] = pws[gid].i[ 6]; + pw_buf1[3] = pws[gid].i[ 7]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[7]; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + + w0[0] = pw_buf0[0]; + w0[1] = pw_buf0[1]; + w0[2] = pw_buf0[2]; + w0[3] = pw_buf0[3]; + + u32x w1[4]; + + w1[0] = pw_buf1[0]; + w1[1] = pw_buf1[1]; + w1[2] = pw_buf1[2]; + w1[3] = pw_buf1[3]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 out_len = apply_rules (rules_buf[il_pos].cmds, w0, w1, pw_len); + + /** + * prepend salt + */ + + const u32 out_salt_len = out_len + salt_len; + + switch_buffer_by_offset (w0, w1, w2, w3, salt_len); + + w0[0] |= salt_buf0[0]; + w0[1] |= salt_buf0[1]; + w0[2] |= salt_buf0[2]; + w0[3] |= salt_buf0[3]; + w1[0] |= salt_buf1[0]; + w1[1] |= salt_buf1[1]; + w1[2] |= salt_buf1[2]; + w1[3] |= salt_buf1[3]; + + append_0x80_4 (w0, w1, w2, w3, out_salt_len); + + /** + * sha512 + */ + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + w0_t[0] = swap_workaround (w0[0]); + w0_t[1] = swap_workaround (w0[1]); + w0_t[2] = swap_workaround (w0[2]); + w0_t[3] = swap_workaround (w0[3]); + w1_t[0] = swap_workaround (w1[0]); + w1_t[1] = swap_workaround (w1[1]); + w1_t[2] = swap_workaround (w1[2]); + w1_t[3] = swap_workaround (w1[3]); + w2_t[0] = swap_workaround (w2[0]); + w2_t[1] = swap_workaround (w2[1]); + w2_t[2] = swap_workaround (w2[2]); + w2_t[3] = swap_workaround (w2[3]); + w3_t[0] = swap_workaround (w3[0]); + w3_t[1] = swap_workaround (w3[1]); + w3_t[2] = 0; + w3_t[3] = out_salt_len * 8; + + u64x digest[8]; + + digest[0] = SHA512M_A; + digest[1] = SHA512M_B; + digest[2] = SHA512M_C; + digest[3] = SHA512M_D; + digest[4] = SHA512M_E; + digest[5] = SHA512M_F; + digest[6] = SHA512M_G; + digest[7] = SHA512M_H; + + sha512_transform (w0_t, w1_t, w2_t, w3_t, digest); + + + const u32x r0 = l32_from_64 (digest[7]); + const u32x r1 = h32_from_64 (digest[7]); + const u32x r2 = l32_from_64 (digest[3]); + const u32x r3 = h32_from_64 (digest[3]); + + #include VECT_COMPARE_S + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m01720_s08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m01720_s16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/amd/m01720_a1.cl b/amd/m01720_a1.cl new file mode 100644 index 0000000000..5ae641ae27 --- /dev/null +++ b/amd/m01720_a1.cl @@ -0,0 +1,590 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _SHA512_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW4 +#define VECT_SIZE1 +#endif + +#ifdef VLIW5 +#define VECT_SIZE1 +#endif + +#define DGST_R0 14 +#define DGST_R1 15 +#define DGST_R2 6 +#define DGST_R3 7 + +#include "include/kernel_functions.c" +#include "types_amd.c" +#include "common_amd.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +__constant u64 k_sha512[80] = +{ + SHA512C00, SHA512C01, SHA512C02, SHA512C03, + SHA512C04, SHA512C05, SHA512C06, SHA512C07, + SHA512C08, SHA512C09, SHA512C0a, SHA512C0b, + SHA512C0c, SHA512C0d, SHA512C0e, SHA512C0f, + SHA512C10, SHA512C11, SHA512C12, SHA512C13, + SHA512C14, SHA512C15, SHA512C16, SHA512C17, + SHA512C18, SHA512C19, SHA512C1a, SHA512C1b, + SHA512C1c, SHA512C1d, SHA512C1e, SHA512C1f, + SHA512C20, SHA512C21, SHA512C22, SHA512C23, + SHA512C24, SHA512C25, SHA512C26, SHA512C27, + SHA512C28, SHA512C29, SHA512C2a, SHA512C2b, + SHA512C2c, SHA512C2d, SHA512C2e, SHA512C2f, + SHA512C30, SHA512C31, SHA512C32, SHA512C33, + SHA512C34, SHA512C35, SHA512C36, SHA512C37, + SHA512C38, SHA512C39, SHA512C3a, SHA512C3b, + SHA512C3c, SHA512C3d, SHA512C3e, SHA512C3f, + SHA512C40, SHA512C41, SHA512C42, SHA512C43, + SHA512C44, SHA512C45, SHA512C46, SHA512C47, + SHA512C48, SHA512C49, SHA512C4a, SHA512C4b, + SHA512C4c, SHA512C4d, SHA512C4e, SHA512C4f, +}; + +static void sha512_transform (const u32x w0[4], const u32x w1[4], const u32x w2[4], const u32x w3[4], u64x digest[8]) +{ + u64x w0_t = hl32_to_64 (w0[0], w0[1]); + u64x w1_t = hl32_to_64 (w0[2], w0[3]); + u64x w2_t = hl32_to_64 (w1[0], w1[1]); + u64x w3_t = hl32_to_64 (w1[2], w1[3]); + u64x w4_t = hl32_to_64 (w2[0], w2[1]); + u64x w5_t = hl32_to_64 (w2[2], w2[3]); + u64x w6_t = hl32_to_64 (w3[0], w3[1]); + u64x w7_t = 0; + u64x w8_t = 0; + u64x w9_t = 0; + u64x wa_t = 0; + u64x wb_t = 0; + u64x wc_t = 0; + u64x wd_t = 0; + u64x we_t = 0; + u64x wf_t = hl32_to_64 (w3[2], w3[3]); + + u64x a = digest[0]; + u64x b = digest[1]; + u64x c = digest[2]; + u64x d = digest[3]; + u64x e = digest[4]; + u64x f = digest[5]; + u64x g = digest[6]; + u64x h = digest[7]; + + #define ROUND_EXPAND() \ + { \ + w0_t = SHA512_EXPAND (we_t, w9_t, w1_t, w0_t); \ + w1_t = SHA512_EXPAND (wf_t, wa_t, w2_t, w1_t); \ + w2_t = SHA512_EXPAND (w0_t, wb_t, w3_t, w2_t); \ + w3_t = SHA512_EXPAND (w1_t, wc_t, w4_t, w3_t); \ + w4_t = SHA512_EXPAND (w2_t, wd_t, w5_t, w4_t); \ + w5_t = SHA512_EXPAND (w3_t, we_t, w6_t, w5_t); \ + w6_t = SHA512_EXPAND (w4_t, wf_t, w7_t, w6_t); \ + w7_t = SHA512_EXPAND (w5_t, w0_t, w8_t, w7_t); \ + w8_t = SHA512_EXPAND (w6_t, w1_t, w9_t, w8_t); \ + w9_t = SHA512_EXPAND (w7_t, w2_t, wa_t, w9_t); \ + wa_t = SHA512_EXPAND (w8_t, w3_t, wb_t, wa_t); \ + wb_t = SHA512_EXPAND (w9_t, w4_t, wc_t, wb_t); \ + wc_t = SHA512_EXPAND (wa_t, w5_t, wd_t, wc_t); \ + wd_t = SHA512_EXPAND (wb_t, w6_t, we_t, wd_t); \ + we_t = SHA512_EXPAND (wc_t, w7_t, wf_t, we_t); \ + wf_t = SHA512_EXPAND (wd_t, w8_t, w0_t, wf_t); \ + } + + #define ROUND_STEP(i) \ + { \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, a, b, c, d, e, f, g, h, w0_t, k_sha512[i + 0]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, h, a, b, c, d, e, f, g, w1_t, k_sha512[i + 1]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, g, h, a, b, c, d, e, f, w2_t, k_sha512[i + 2]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, f, g, h, a, b, c, d, e, w3_t, k_sha512[i + 3]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, e, f, g, h, a, b, c, d, w4_t, k_sha512[i + 4]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, d, e, f, g, h, a, b, c, w5_t, k_sha512[i + 5]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, c, d, e, f, g, h, a, b, w6_t, k_sha512[i + 6]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, b, c, d, e, f, g, h, a, w7_t, k_sha512[i + 7]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, a, b, c, d, e, f, g, h, w8_t, k_sha512[i + 8]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, h, a, b, c, d, e, f, g, w9_t, k_sha512[i + 9]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, g, h, a, b, c, d, e, f, wa_t, k_sha512[i + 10]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, f, g, h, a, b, c, d, e, wb_t, k_sha512[i + 11]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, e, f, g, h, a, b, c, d, wc_t, k_sha512[i + 12]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, d, e, f, g, h, a, b, c, wd_t, k_sha512[i + 13]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, c, d, e, f, g, h, a, b, we_t, k_sha512[i + 14]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, b, c, d, e, f, g, h, a, wf_t, k_sha512[i + 15]); \ + } + + ROUND_STEP (0); + + #pragma unroll + for (int i = 16; i < 80; i += 16) + { + ROUND_EXPAND (); ROUND_STEP (i); + } + + /* rev + digest[0] += a; + digest[1] += b; + digest[2] += c; + digest[3] += d; + digest[4] += e; + digest[5] += f; + digest[6] += g; + digest[7] += h; + */ + + digest[0] = a; + digest[1] = b; + digest[2] = c; + digest[3] = d; + digest[4] = e; + digest[5] = f; + digest[6] = g; + digest[7] = h; +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m01720_m04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, combs_buf[0].pw_len); + } + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[7]; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = combs_buf[il_pos].pw_len; + + const u32 pw_len = pw_l_len + pw_r_len; + + u32 wordr0[4]; + u32 wordr1[4]; + u32 wordr2[4]; + u32 wordr3[4]; + + wordr0[0] = combs_buf[il_pos].i[0]; + wordr0[1] = combs_buf[il_pos].i[1]; + wordr0[2] = combs_buf[il_pos].i[2]; + wordr0[3] = combs_buf[il_pos].i[3]; + wordr1[0] = combs_buf[il_pos].i[4]; + wordr1[1] = combs_buf[il_pos].i[5]; + wordr1[2] = combs_buf[il_pos].i[6]; + wordr1[3] = combs_buf[il_pos].i[7]; + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + u32x w0[4]; + u32x w1[4]; + u32x w2[4]; + u32x w3[4]; + + w0[0] = wordl0[0] | wordr0[0]; + w0[1] = wordl0[1] | wordr0[1]; + w0[2] = wordl0[2] | wordr0[2]; + w0[3] = wordl0[3] | wordr0[3]; + w1[0] = wordl1[0] | wordr1[0]; + w1[1] = wordl1[1] | wordr1[1]; + w1[2] = wordl1[2] | wordr1[2]; + w1[3] = wordl1[3] | wordr1[3]; + w2[0] = wordl2[0] | wordr2[0]; + w2[1] = wordl2[1] | wordr2[1]; + w2[2] = wordl2[2] | wordr2[2]; + w2[3] = wordl2[3] | wordr2[3]; + w3[0] = wordl3[0] | wordr3[0]; + w3[1] = wordl3[1] | wordr3[1]; + w3[2] = wordl3[2] | wordr3[2]; + w3[3] = wordl3[3] | wordr3[3]; + + /** + * prepend salt + */ + + const u32 pw_salt_len = pw_len + salt_len; + + switch_buffer_by_offset (w0, w1, w2, w3, salt_len); + + w0[0] |= salt_buf0[0]; + w0[1] |= salt_buf0[1]; + w0[2] |= salt_buf0[2]; + w0[3] |= salt_buf0[3]; + w1[0] |= salt_buf1[0]; + w1[1] |= salt_buf1[1]; + w1[2] |= salt_buf1[2]; + w1[3] |= salt_buf1[3]; + + append_0x80_4 (w0, w1, w2, w3, pw_salt_len); + + /** + * sha512 + */ + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + w0_t[0] = swap_workaround (w0[0]); + w0_t[1] = swap_workaround (w0[1]); + w0_t[2] = swap_workaround (w0[2]); + w0_t[3] = swap_workaround (w0[3]); + w1_t[0] = swap_workaround (w1[0]); + w1_t[1] = swap_workaround (w1[1]); + w1_t[2] = swap_workaround (w1[2]); + w1_t[3] = swap_workaround (w1[3]); + w2_t[0] = swap_workaround (w2[0]); + w2_t[1] = swap_workaround (w2[1]); + w2_t[2] = swap_workaround (w2[2]); + w2_t[3] = swap_workaround (w2[3]); + w3_t[0] = swap_workaround (w3[0]); + w3_t[1] = swap_workaround (w3[1]); + w3_t[2] = 0; + w3_t[3] = pw_salt_len * 8; + + u64x digest[8]; + + digest[0] = SHA512M_A; + digest[1] = SHA512M_B; + digest[2] = SHA512M_C; + digest[3] = SHA512M_D; + digest[4] = SHA512M_E; + digest[5] = SHA512M_F; + digest[6] = SHA512M_G; + digest[7] = SHA512M_H; + + sha512_transform (w0_t, w1_t, w2_t, w3_t, digest); + + + const u32x r0 = l32_from_64 (digest[7]); + const u32x r1 = h32_from_64 (digest[7]); + const u32x r2 = l32_from_64 (digest[3]); + const u32x r3 = h32_from_64 (digest[3]); + + #include VECT_COMPARE_M + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m01720_m08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m01720_m16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m01720_s04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, combs_buf[0].pw_len); + } + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[7]; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = combs_buf[il_pos].pw_len; + + const u32 pw_len = pw_l_len + pw_r_len; + + u32 wordr0[4]; + u32 wordr1[4]; + u32 wordr2[4]; + u32 wordr3[4]; + + wordr0[0] = combs_buf[il_pos].i[0]; + wordr0[1] = combs_buf[il_pos].i[1]; + wordr0[2] = combs_buf[il_pos].i[2]; + wordr0[3] = combs_buf[il_pos].i[3]; + wordr1[0] = combs_buf[il_pos].i[4]; + wordr1[1] = combs_buf[il_pos].i[5]; + wordr1[2] = combs_buf[il_pos].i[6]; + wordr1[3] = combs_buf[il_pos].i[7]; + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + u32x w0[4]; + u32x w1[4]; + u32x w2[4]; + u32x w3[4]; + + w0[0] = wordl0[0] | wordr0[0]; + w0[1] = wordl0[1] | wordr0[1]; + w0[2] = wordl0[2] | wordr0[2]; + w0[3] = wordl0[3] | wordr0[3]; + w1[0] = wordl1[0] | wordr1[0]; + w1[1] = wordl1[1] | wordr1[1]; + w1[2] = wordl1[2] | wordr1[2]; + w1[3] = wordl1[3] | wordr1[3]; + w2[0] = wordl2[0] | wordr2[0]; + w2[1] = wordl2[1] | wordr2[1]; + w2[2] = wordl2[2] | wordr2[2]; + w2[3] = wordl2[3] | wordr2[3]; + w3[0] = wordl3[0] | wordr3[0]; + w3[1] = wordl3[1] | wordr3[1]; + w3[2] = wordl3[2] | wordr3[2]; + w3[3] = wordl3[3] | wordr3[3]; + + /** + * prepend salt + */ + + const u32 pw_salt_len = pw_len + salt_len; + + switch_buffer_by_offset (w0, w1, w2, w3, salt_len); + + w0[0] |= salt_buf0[0]; + w0[1] |= salt_buf0[1]; + w0[2] |= salt_buf0[2]; + w0[3] |= salt_buf0[3]; + w1[0] |= salt_buf1[0]; + w1[1] |= salt_buf1[1]; + w1[2] |= salt_buf1[2]; + w1[3] |= salt_buf1[3]; + + append_0x80_4 (w0, w1, w2, w3, pw_salt_len); + + /** + * sha512 + */ + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + w0_t[0] = swap_workaround (w0[0]); + w0_t[1] = swap_workaround (w0[1]); + w0_t[2] = swap_workaround (w0[2]); + w0_t[3] = swap_workaround (w0[3]); + w1_t[0] = swap_workaround (w1[0]); + w1_t[1] = swap_workaround (w1[1]); + w1_t[2] = swap_workaround (w1[2]); + w1_t[3] = swap_workaround (w1[3]); + w2_t[0] = swap_workaround (w2[0]); + w2_t[1] = swap_workaround (w2[1]); + w2_t[2] = swap_workaround (w2[2]); + w2_t[3] = swap_workaround (w2[3]); + w3_t[0] = swap_workaround (w3[0]); + w3_t[1] = swap_workaround (w3[1]); + w3_t[2] = 0; + w3_t[3] = pw_salt_len * 8; + + u64x digest[8]; + + digest[0] = SHA512M_A; + digest[1] = SHA512M_B; + digest[2] = SHA512M_C; + digest[3] = SHA512M_D; + digest[4] = SHA512M_E; + digest[5] = SHA512M_F; + digest[6] = SHA512M_G; + digest[7] = SHA512M_H; + + sha512_transform (w0_t, w1_t, w2_t, w3_t, digest); + + + const u32x r0 = l32_from_64 (digest[7]); + const u32x r1 = h32_from_64 (digest[7]); + const u32x r2 = l32_from_64 (digest[3]); + const u32x r3 = h32_from_64 (digest[3]); + + #include VECT_COMPARE_S + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m01720_s08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m01720_s16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/amd/m01720_a3.cl b/amd/m01720_a3.cl new file mode 100644 index 0000000000..75b89ebef1 --- /dev/null +++ b/amd/m01720_a3.cl @@ -0,0 +1,752 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _SHA512_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW4 +#define VECT_SIZE1 +#endif + +#ifdef VLIW5 +#define VECT_SIZE1 +#endif + +#define DGST_R0 14 +#define DGST_R1 15 +#define DGST_R2 6 +#define DGST_R3 7 + +#include "include/kernel_functions.c" +#include "types_amd.c" +#include "common_amd.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +__constant u64 k_sha512[80] = +{ + SHA512C00, SHA512C01, SHA512C02, SHA512C03, + SHA512C04, SHA512C05, SHA512C06, SHA512C07, + SHA512C08, SHA512C09, SHA512C0a, SHA512C0b, + SHA512C0c, SHA512C0d, SHA512C0e, SHA512C0f, + SHA512C10, SHA512C11, SHA512C12, SHA512C13, + SHA512C14, SHA512C15, SHA512C16, SHA512C17, + SHA512C18, SHA512C19, SHA512C1a, SHA512C1b, + SHA512C1c, SHA512C1d, SHA512C1e, SHA512C1f, + SHA512C20, SHA512C21, SHA512C22, SHA512C23, + SHA512C24, SHA512C25, SHA512C26, SHA512C27, + SHA512C28, SHA512C29, SHA512C2a, SHA512C2b, + SHA512C2c, SHA512C2d, SHA512C2e, SHA512C2f, + SHA512C30, SHA512C31, SHA512C32, SHA512C33, + SHA512C34, SHA512C35, SHA512C36, SHA512C37, + SHA512C38, SHA512C39, SHA512C3a, SHA512C3b, + SHA512C3c, SHA512C3d, SHA512C3e, SHA512C3f, + SHA512C40, SHA512C41, SHA512C42, SHA512C43, + SHA512C44, SHA512C45, SHA512C46, SHA512C47, + SHA512C48, SHA512C49, SHA512C4a, SHA512C4b, + SHA512C4c, SHA512C4d, SHA512C4e, SHA512C4f, +}; + +static void sha512_transform (const u32x w0[4], const u32x w1[4], const u32x w2[4], const u32x w3[4], u64x digest[8]) +{ + u64x w0_t = hl32_to_64 (w0[0], w0[1]); + u64x w1_t = hl32_to_64 (w0[2], w0[3]); + u64x w2_t = hl32_to_64 (w1[0], w1[1]); + u64x w3_t = hl32_to_64 (w1[2], w1[3]); + u64x w4_t = hl32_to_64 (w2[0], w2[1]); + u64x w5_t = hl32_to_64 (w2[2], w2[3]); + u64x w6_t = hl32_to_64 (w3[0], w3[1]); + u64x w7_t = 0; + u64x w8_t = 0; + u64x w9_t = 0; + u64x wa_t = 0; + u64x wb_t = 0; + u64x wc_t = 0; + u64x wd_t = 0; + u64x we_t = 0; + u64x wf_t = hl32_to_64 (w3[2], w3[3]); + + u64x a = digest[0]; + u64x b = digest[1]; + u64x c = digest[2]; + u64x d = digest[3]; + u64x e = digest[4]; + u64x f = digest[5]; + u64x g = digest[6]; + u64x h = digest[7]; + + #define ROUND_EXPAND() \ + { \ + w0_t = SHA512_EXPAND (we_t, w9_t, w1_t, w0_t); \ + w1_t = SHA512_EXPAND (wf_t, wa_t, w2_t, w1_t); \ + w2_t = SHA512_EXPAND (w0_t, wb_t, w3_t, w2_t); \ + w3_t = SHA512_EXPAND (w1_t, wc_t, w4_t, w3_t); \ + w4_t = SHA512_EXPAND (w2_t, wd_t, w5_t, w4_t); \ + w5_t = SHA512_EXPAND (w3_t, we_t, w6_t, w5_t); \ + w6_t = SHA512_EXPAND (w4_t, wf_t, w7_t, w6_t); \ + w7_t = SHA512_EXPAND (w5_t, w0_t, w8_t, w7_t); \ + w8_t = SHA512_EXPAND (w6_t, w1_t, w9_t, w8_t); \ + w9_t = SHA512_EXPAND (w7_t, w2_t, wa_t, w9_t); \ + wa_t = SHA512_EXPAND (w8_t, w3_t, wb_t, wa_t); \ + wb_t = SHA512_EXPAND (w9_t, w4_t, wc_t, wb_t); \ + wc_t = SHA512_EXPAND (wa_t, w5_t, wd_t, wc_t); \ + wd_t = SHA512_EXPAND (wb_t, w6_t, we_t, wd_t); \ + we_t = SHA512_EXPAND (wc_t, w7_t, wf_t, we_t); \ + wf_t = SHA512_EXPAND (wd_t, w8_t, w0_t, wf_t); \ + } + + #define ROUND_STEP(i) \ + { \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, a, b, c, d, e, f, g, h, w0_t, k_sha512[i + 0]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, h, a, b, c, d, e, f, g, w1_t, k_sha512[i + 1]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, g, h, a, b, c, d, e, f, w2_t, k_sha512[i + 2]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, f, g, h, a, b, c, d, e, w3_t, k_sha512[i + 3]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, e, f, g, h, a, b, c, d, w4_t, k_sha512[i + 4]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, d, e, f, g, h, a, b, c, w5_t, k_sha512[i + 5]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, c, d, e, f, g, h, a, b, w6_t, k_sha512[i + 6]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, b, c, d, e, f, g, h, a, w7_t, k_sha512[i + 7]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, a, b, c, d, e, f, g, h, w8_t, k_sha512[i + 8]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, h, a, b, c, d, e, f, g, w9_t, k_sha512[i + 9]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, g, h, a, b, c, d, e, f, wa_t, k_sha512[i + 10]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, f, g, h, a, b, c, d, e, wb_t, k_sha512[i + 11]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, e, f, g, h, a, b, c, d, wc_t, k_sha512[i + 12]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, d, e, f, g, h, a, b, c, wd_t, k_sha512[i + 13]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, c, d, e, f, g, h, a, b, we_t, k_sha512[i + 14]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, b, c, d, e, f, g, h, a, wf_t, k_sha512[i + 15]); \ + } + + ROUND_STEP (0); + + #pragma unroll + for (int i = 16; i < 80; i += 16) + { + ROUND_EXPAND (); ROUND_STEP (i); + } + + /* rev + digest[0] += a; + digest[1] += b; + digest[2] += c; + digest[3] += d; + digest[4] += e; + digest[5] += f; + digest[6] += g; + digest[7] += h; + */ + + digest[0] = a; + digest[1] = b; + digest[2] = c; + digest[3] = d; + digest[4] = e; + digest[5] = f; + digest[6] = g; + digest[7] = h; +} + +static void m01720m (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], const u32 pw_len, __global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset) +{ + /** + * modifier + */ + + const u32 gid = get_global_id (0); + const u32 lid = get_local_id (0); + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[ 1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[ 2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[ 3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[ 4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[ 5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[ 6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[ 7]; + + u32 salt_buf2[4]; + + salt_buf2[0] = 0; + salt_buf2[1] = 0; + salt_buf2[2] = 0; + salt_buf2[3] = 0; + + u32 salt_buf3[4]; + + salt_buf3[0] = 0; + salt_buf3[1] = 0; + salt_buf3[2] = 0; + salt_buf3[3] = 0; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + const u32 pw_salt_len = pw_len + salt_len; + + /** + * loop + */ + + u32x w0l = w0[0]; + + for (u32 il_pos = 0; il_pos < bfs_cnt; il_pos++) + { + const u32 w0r = bfs_buf[il_pos].i; + + w0[0] = w0l | w0r; + + /** + * prepend salt + */ + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + w0_t[0] = swap_workaround (w0[0]); + w0_t[1] = swap_workaround (w0[1]); + w0_t[2] = swap_workaround (w0[2]); + w0_t[3] = swap_workaround (w0[3]); + w1_t[0] = swap_workaround (w1[0]); + w1_t[1] = swap_workaround (w1[1]); + w1_t[2] = swap_workaround (w1[2]); + w1_t[3] = swap_workaround (w1[3]); + w2_t[0] = swap_workaround (w2[0]); + w2_t[1] = swap_workaround (w2[1]); + w2_t[2] = swap_workaround (w2[2]); + w2_t[3] = swap_workaround (w2[3]); + w3_t[0] = swap_workaround (w3[0]); + w3_t[1] = swap_workaround (w3[1]); + w3_t[2] = swap_workaround (w3[2]); + w3_t[3] = swap_workaround (w3[3]); + + switch_buffer_by_offset (w0_t, w1_t, w2_t, w3_t, salt_len); + + w0_t[0] |= salt_buf0[0]; + w0_t[1] |= salt_buf0[1]; + w0_t[2] |= salt_buf0[2]; + w0_t[3] |= salt_buf0[3]; + w1_t[0] |= salt_buf1[0]; + w1_t[1] |= salt_buf1[1]; + w1_t[2] |= salt_buf1[2]; + w1_t[3] |= salt_buf1[3]; + w2_t[0] |= salt_buf2[0]; + w2_t[1] |= salt_buf2[1]; + w2_t[2] |= salt_buf2[2]; + w2_t[3] |= salt_buf2[3]; + w3_t[0] |= salt_buf3[0]; + w3_t[1] |= salt_buf3[1]; + w3_t[2] = 0; + w3_t[3] = pw_salt_len * 8; + + /** + * sha512 + */ + + w0_t[0] = swap_workaround (w0_t[0]); + w0_t[1] = swap_workaround (w0_t[1]); + w0_t[2] = swap_workaround (w0_t[2]); + w0_t[3] = swap_workaround (w0_t[3]); + w1_t[0] = swap_workaround (w1_t[0]); + w1_t[1] = swap_workaround (w1_t[1]); + w1_t[2] = swap_workaround (w1_t[2]); + w1_t[3] = swap_workaround (w1_t[3]); + w2_t[0] = swap_workaround (w2_t[0]); + w2_t[1] = swap_workaround (w2_t[1]); + w2_t[2] = swap_workaround (w2_t[2]); + w2_t[3] = swap_workaround (w2_t[3]); + w3_t[0] = swap_workaround (w3_t[0]); + w3_t[1] = swap_workaround (w3_t[1]); + //w3_t[2] = swap_workaround (w3_t[2]); + //w3_t[3] = swap_workaround (w3_t[3]); + + u64x digest[8]; + + digest[0] = SHA512M_A; + digest[1] = SHA512M_B; + digest[2] = SHA512M_C; + digest[3] = SHA512M_D; + digest[4] = SHA512M_E; + digest[5] = SHA512M_F; + digest[6] = SHA512M_G; + digest[7] = SHA512M_H; + + sha512_transform (w0_t, w1_t, w2_t, w3_t, digest); + + + const u32x r0 = l32_from_64 (digest[7]); + const u32x r1 = h32_from_64 (digest[7]); + const u32x r2 = l32_from_64 (digest[3]); + const u32x r3 = h32_from_64 (digest[3]); + + #include VECT_COMPARE_M + } +} + +static void m01720s (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], const u32 pw_len, __global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset) +{ + /** + * modifier + */ + + const u32 gid = get_global_id (0); + const u32 lid = get_local_id (0); + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[ 1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[ 2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[ 3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[ 4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[ 5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[ 6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[ 7]; + + u32 salt_buf2[4]; + + salt_buf2[0] = 0; + salt_buf2[1] = 0; + salt_buf2[2] = 0; + salt_buf2[3] = 0; + + u32 salt_buf3[4]; + + salt_buf3[0] = 0; + salt_buf3[1] = 0; + salt_buf3[2] = 0; + salt_buf3[3] = 0; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + const u32 pw_salt_len = pw_len + salt_len; + + /** + * loop + */ + + u32x w0l = w0[0]; + + for (u32 il_pos = 0; il_pos < bfs_cnt; il_pos++) + { + const u32 w0r = bfs_buf[il_pos].i; + + w0[0] = w0l | w0r; + + /** + * prepend salt + */ + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + w0_t[0] = swap_workaround (w0[0]); + w0_t[1] = swap_workaround (w0[1]); + w0_t[2] = swap_workaround (w0[2]); + w0_t[3] = swap_workaround (w0[3]); + w1_t[0] = swap_workaround (w1[0]); + w1_t[1] = swap_workaround (w1[1]); + w1_t[2] = swap_workaround (w1[2]); + w1_t[3] = swap_workaround (w1[3]); + w2_t[0] = swap_workaround (w2[0]); + w2_t[1] = swap_workaround (w2[1]); + w2_t[2] = swap_workaround (w2[2]); + w2_t[3] = swap_workaround (w2[3]); + w3_t[0] = swap_workaround (w3[0]); + w3_t[1] = swap_workaround (w3[1]); + w3_t[2] = swap_workaround (w3[2]); + w3_t[3] = swap_workaround (w3[3]); + + switch_buffer_by_offset (w0_t, w1_t, w2_t, w3_t, salt_len); + + w0_t[0] |= salt_buf0[0]; + w0_t[1] |= salt_buf0[1]; + w0_t[2] |= salt_buf0[2]; + w0_t[3] |= salt_buf0[3]; + w1_t[0] |= salt_buf1[0]; + w1_t[1] |= salt_buf1[1]; + w1_t[2] |= salt_buf1[2]; + w1_t[3] |= salt_buf1[3]; + w2_t[0] |= salt_buf2[0]; + w2_t[1] |= salt_buf2[1]; + w2_t[2] |= salt_buf2[2]; + w2_t[3] |= salt_buf2[3]; + w3_t[0] |= salt_buf3[0]; + w3_t[1] |= salt_buf3[1]; + w3_t[2] = 0; + w3_t[3] = pw_salt_len * 8; + + /** + * sha512 + */ + + w0_t[0] = swap_workaround (w0_t[0]); + w0_t[1] = swap_workaround (w0_t[1]); + w0_t[2] = swap_workaround (w0_t[2]); + w0_t[3] = swap_workaround (w0_t[3]); + w1_t[0] = swap_workaround (w1_t[0]); + w1_t[1] = swap_workaround (w1_t[1]); + w1_t[2] = swap_workaround (w1_t[2]); + w1_t[3] = swap_workaround (w1_t[3]); + w2_t[0] = swap_workaround (w2_t[0]); + w2_t[1] = swap_workaround (w2_t[1]); + w2_t[2] = swap_workaround (w2_t[2]); + w2_t[3] = swap_workaround (w2_t[3]); + w3_t[0] = swap_workaround (w3_t[0]); + w3_t[1] = swap_workaround (w3_t[1]); + //w3_t[2] = swap_workaround (w3_t[2]); + //w3_t[3] = swap_workaround (w3_t[3]); + + u64x digest[8]; + + digest[0] = SHA512M_A; + digest[1] = SHA512M_B; + digest[2] = SHA512M_C; + digest[3] = SHA512M_D; + digest[4] = SHA512M_E; + digest[5] = SHA512M_F; + digest[6] = SHA512M_G; + digest[7] = SHA512M_H; + + sha512_transform (w0_t, w1_t, w2_t, w3_t, digest); + + + const u32x r0 = l32_from_64 (digest[7]); + const u32x r1 = h32_from_64 (digest[7]); + const u32x r2 = l32_from_64 (digest[3]); + const u32x r3 = h32_from_64 (digest[3]); + + #include VECT_COMPARE_S + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m01720_m04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m01720m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m01720_m08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m01720m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m01720_m16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = pws[gid].i[ 8]; + w2[1] = pws[gid].i[ 9]; + w2[2] = pws[gid].i[10]; + w2[3] = pws[gid].i[11]; + + u32x w3[4]; + + w3[0] = pws[gid].i[12]; + w3[1] = pws[gid].i[13]; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m01720m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m01720_s04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m01720s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m01720_s08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m01720s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m01720_s16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = pws[gid].i[ 8]; + w2[1] = pws[gid].i[ 9]; + w2[2] = pws[gid].i[10]; + w2[3] = pws[gid].i[11]; + + u32x w3[4]; + + w3[0] = pws[gid].i[12]; + w3[1] = pws[gid].i[13]; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m01720s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} diff --git a/amd/m01730_a0.cl b/amd/m01730_a0.cl new file mode 100644 index 0000000000..321996bc66 --- /dev/null +++ b/amd/m01730_a0.cl @@ -0,0 +1,586 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _SHA512_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW4 +#define VECT_SIZE1 +#endif + +#ifdef VLIW5 +#define VECT_SIZE1 +#endif + +#define DGST_R0 14 +#define DGST_R1 15 +#define DGST_R2 6 +#define DGST_R3 7 + +#include "include/kernel_functions.c" +#include "types_amd.c" +#include "common_amd.c" +#include "include/rp_gpu.h" +#include "rp_amd.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +__constant u64 k_sha512[80] = +{ + SHA512C00, SHA512C01, SHA512C02, SHA512C03, + SHA512C04, SHA512C05, SHA512C06, SHA512C07, + SHA512C08, SHA512C09, SHA512C0a, SHA512C0b, + SHA512C0c, SHA512C0d, SHA512C0e, SHA512C0f, + SHA512C10, SHA512C11, SHA512C12, SHA512C13, + SHA512C14, SHA512C15, SHA512C16, SHA512C17, + SHA512C18, SHA512C19, SHA512C1a, SHA512C1b, + SHA512C1c, SHA512C1d, SHA512C1e, SHA512C1f, + SHA512C20, SHA512C21, SHA512C22, SHA512C23, + SHA512C24, SHA512C25, SHA512C26, SHA512C27, + SHA512C28, SHA512C29, SHA512C2a, SHA512C2b, + SHA512C2c, SHA512C2d, SHA512C2e, SHA512C2f, + SHA512C30, SHA512C31, SHA512C32, SHA512C33, + SHA512C34, SHA512C35, SHA512C36, SHA512C37, + SHA512C38, SHA512C39, SHA512C3a, SHA512C3b, + SHA512C3c, SHA512C3d, SHA512C3e, SHA512C3f, + SHA512C40, SHA512C41, SHA512C42, SHA512C43, + SHA512C44, SHA512C45, SHA512C46, SHA512C47, + SHA512C48, SHA512C49, SHA512C4a, SHA512C4b, + SHA512C4c, SHA512C4d, SHA512C4e, SHA512C4f, +}; + +static void sha512_transform (const u32x w0[4], const u32x w1[4], const u32x w2[4], const u32x w3[4], u64x digest[8]) +{ + u64x w0_t = hl32_to_64 (w0[0], w0[1]); + u64x w1_t = hl32_to_64 (w0[2], w0[3]); + u64x w2_t = hl32_to_64 (w1[0], w1[1]); + u64x w3_t = hl32_to_64 (w1[2], w1[3]); + u64x w4_t = hl32_to_64 (w2[0], w2[1]); + u64x w5_t = hl32_to_64 (w2[2], w2[3]); + u64x w6_t = hl32_to_64 (w3[0], w3[1]); + u64x w7_t = 0; + u64x w8_t = 0; + u64x w9_t = 0; + u64x wa_t = 0; + u64x wb_t = 0; + u64x wc_t = 0; + u64x wd_t = 0; + u64x we_t = 0; + u64x wf_t = hl32_to_64 (w3[2], w3[3]); + + u64x a = digest[0]; + u64x b = digest[1]; + u64x c = digest[2]; + u64x d = digest[3]; + u64x e = digest[4]; + u64x f = digest[5]; + u64x g = digest[6]; + u64x h = digest[7]; + + #define ROUND_EXPAND() \ + { \ + w0_t = SHA512_EXPAND (we_t, w9_t, w1_t, w0_t); \ + w1_t = SHA512_EXPAND (wf_t, wa_t, w2_t, w1_t); \ + w2_t = SHA512_EXPAND (w0_t, wb_t, w3_t, w2_t); \ + w3_t = SHA512_EXPAND (w1_t, wc_t, w4_t, w3_t); \ + w4_t = SHA512_EXPAND (w2_t, wd_t, w5_t, w4_t); \ + w5_t = SHA512_EXPAND (w3_t, we_t, w6_t, w5_t); \ + w6_t = SHA512_EXPAND (w4_t, wf_t, w7_t, w6_t); \ + w7_t = SHA512_EXPAND (w5_t, w0_t, w8_t, w7_t); \ + w8_t = SHA512_EXPAND (w6_t, w1_t, w9_t, w8_t); \ + w9_t = SHA512_EXPAND (w7_t, w2_t, wa_t, w9_t); \ + wa_t = SHA512_EXPAND (w8_t, w3_t, wb_t, wa_t); \ + wb_t = SHA512_EXPAND (w9_t, w4_t, wc_t, wb_t); \ + wc_t = SHA512_EXPAND (wa_t, w5_t, wd_t, wc_t); \ + wd_t = SHA512_EXPAND (wb_t, w6_t, we_t, wd_t); \ + we_t = SHA512_EXPAND (wc_t, w7_t, wf_t, we_t); \ + wf_t = SHA512_EXPAND (wd_t, w8_t, w0_t, wf_t); \ + } + + #define ROUND_STEP(i) \ + { \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, a, b, c, d, e, f, g, h, w0_t, k_sha512[i + 0]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, h, a, b, c, d, e, f, g, w1_t, k_sha512[i + 1]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, g, h, a, b, c, d, e, f, w2_t, k_sha512[i + 2]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, f, g, h, a, b, c, d, e, w3_t, k_sha512[i + 3]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, e, f, g, h, a, b, c, d, w4_t, k_sha512[i + 4]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, d, e, f, g, h, a, b, c, w5_t, k_sha512[i + 5]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, c, d, e, f, g, h, a, b, w6_t, k_sha512[i + 6]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, b, c, d, e, f, g, h, a, w7_t, k_sha512[i + 7]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, a, b, c, d, e, f, g, h, w8_t, k_sha512[i + 8]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, h, a, b, c, d, e, f, g, w9_t, k_sha512[i + 9]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, g, h, a, b, c, d, e, f, wa_t, k_sha512[i + 10]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, f, g, h, a, b, c, d, e, wb_t, k_sha512[i + 11]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, e, f, g, h, a, b, c, d, wc_t, k_sha512[i + 12]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, d, e, f, g, h, a, b, c, wd_t, k_sha512[i + 13]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, c, d, e, f, g, h, a, b, we_t, k_sha512[i + 14]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, b, c, d, e, f, g, h, a, wf_t, k_sha512[i + 15]); \ + } + + ROUND_STEP (0); + + #pragma unroll + for (int i = 16; i < 80; i += 16) + { + ROUND_EXPAND (); ROUND_STEP (i); + } + + /* rev + digest[0] += a; + digest[1] += b; + digest[2] += c; + digest[3] += d; + digest[4] += e; + digest[5] += f; + digest[6] += g; + digest[7] += h; + */ + + digest[0] = a; + digest[1] = b; + digest[2] = c; + digest[3] = d; + digest[4] = e; + digest[5] = f; + digest[6] = g; + digest[7] = h; +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m01730_m04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + u32x pw_buf1[4]; + + pw_buf1[0] = pws[gid].i[ 4]; + pw_buf1[1] = pws[gid].i[ 5]; + pw_buf1[2] = pws[gid].i[ 6]; + pw_buf1[3] = pws[gid].i[ 7]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[7]; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + + w0[0] = pw_buf0[0]; + w0[1] = pw_buf0[1]; + w0[2] = pw_buf0[2]; + w0[3] = pw_buf0[3]; + + u32x w1[4]; + + w1[0] = pw_buf1[0]; + w1[1] = pw_buf1[1]; + w1[2] = pw_buf1[2]; + w1[3] = pw_buf1[3]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 out_len = apply_rules (rules_buf[il_pos].cmds, w0, w1, pw_len); + + /** + * append salt + */ + + u32 s0[4]; + + s0[0] = salt_buf0[0]; + s0[1] = salt_buf0[1]; + s0[2] = salt_buf0[2]; + s0[3] = salt_buf0[3]; + + u32 s1[4]; + + s1[0] = salt_buf1[0]; + s1[1] = salt_buf1[1]; + s1[2] = salt_buf1[2]; + s1[3] = salt_buf1[3]; + + u32 s2[4]; + + s2[0] = 0; + s2[1] = 0; + s2[2] = 0; + s2[3] = 0; + + u32 s3[4]; + + s3[0] = 0; + s3[1] = 0; + s3[2] = 0; + s3[3] = 0; + + switch_buffer_by_offset (s0, s1, s2, s3, (out_len * 2)); + + const u32 out_salt_len = (out_len * 2) + salt_len; + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + make_unicode (w0, w0_t, w1_t); + make_unicode (w1, w2_t, w3_t); + + w0_t[0] |= s0[0]; + w0_t[1] |= s0[1]; + w0_t[2] |= s0[2]; + w0_t[3] |= s0[3]; + w1_t[0] |= s1[0]; + w1_t[1] |= s1[1]; + w1_t[2] |= s1[2]; + w1_t[3] |= s1[3]; + w2_t[0] |= s2[0]; + w2_t[1] |= s2[1]; + w2_t[2] |= s2[2]; + w2_t[3] |= s2[3]; + w3_t[0] |= s3[0]; + w3_t[1] |= s3[1]; + w3_t[2] |= s3[2]; + w3_t[3] |= s3[3]; + + append_0x80_4 (w0_t, w1_t, w2_t, w3_t, out_salt_len); + + /** + * sha512 + */ + + w0_t[0] = swap_workaround (w0_t[0]); + w0_t[1] = swap_workaround (w0_t[1]); + w0_t[2] = swap_workaround (w0_t[2]); + w0_t[3] = swap_workaround (w0_t[3]); + w1_t[0] = swap_workaround (w1_t[0]); + w1_t[1] = swap_workaround (w1_t[1]); + w1_t[2] = swap_workaround (w1_t[2]); + w1_t[3] = swap_workaround (w1_t[3]); + w2_t[0] = swap_workaround (w2_t[0]); + w2_t[1] = swap_workaround (w2_t[1]); + w2_t[2] = swap_workaround (w2_t[2]); + w2_t[3] = swap_workaround (w2_t[3]); + w3_t[0] = swap_workaround (w3_t[0]); + w3_t[1] = swap_workaround (w3_t[1]); + w3_t[2] = 0; + w3_t[3] = out_salt_len * 8; + + u64x digest[8]; + + digest[0] = SHA512M_A; + digest[1] = SHA512M_B; + digest[2] = SHA512M_C; + digest[3] = SHA512M_D; + digest[4] = SHA512M_E; + digest[5] = SHA512M_F; + digest[6] = SHA512M_G; + digest[7] = SHA512M_H; + + sha512_transform (w0_t, w1_t, w2_t, w3_t, digest); + + + const u32x r0 = l32_from_64 (digest[7]); + const u32x r1 = h32_from_64 (digest[7]); + const u32x r2 = l32_from_64 (digest[3]); + const u32x r3 = h32_from_64 (digest[3]); + + #include VECT_COMPARE_M + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m01730_m08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m01730_m16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m01730_s04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + u32x pw_buf1[4]; + + pw_buf1[0] = pws[gid].i[ 4]; + pw_buf1[1] = pws[gid].i[ 5]; + pw_buf1[2] = pws[gid].i[ 6]; + pw_buf1[3] = pws[gid].i[ 7]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[7]; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + + w0[0] = pw_buf0[0]; + w0[1] = pw_buf0[1]; + w0[2] = pw_buf0[2]; + w0[3] = pw_buf0[3]; + + u32x w1[4]; + + w1[0] = pw_buf1[0]; + w1[1] = pw_buf1[1]; + w1[2] = pw_buf1[2]; + w1[3] = pw_buf1[3]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 out_len = apply_rules (rules_buf[il_pos].cmds, w0, w1, pw_len); + + /** + * append salt + */ + + u32 s0[4]; + + s0[0] = salt_buf0[0]; + s0[1] = salt_buf0[1]; + s0[2] = salt_buf0[2]; + s0[3] = salt_buf0[3]; + + u32 s1[4]; + + s1[0] = salt_buf1[0]; + s1[1] = salt_buf1[1]; + s1[2] = salt_buf1[2]; + s1[3] = salt_buf1[3]; + + u32 s2[4]; + + s2[0] = 0; + s2[1] = 0; + s2[2] = 0; + s2[3] = 0; + + u32 s3[4]; + + s3[0] = 0; + s3[1] = 0; + s3[2] = 0; + s3[3] = 0; + + switch_buffer_by_offset (s0, s1, s2, s3, (out_len * 2)); + + const u32 out_salt_len = (out_len * 2) + salt_len; + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + make_unicode (w0, w0_t, w1_t); + make_unicode (w1, w2_t, w3_t); + + w0_t[0] |= s0[0]; + w0_t[1] |= s0[1]; + w0_t[2] |= s0[2]; + w0_t[3] |= s0[3]; + w1_t[0] |= s1[0]; + w1_t[1] |= s1[1]; + w1_t[2] |= s1[2]; + w1_t[3] |= s1[3]; + w2_t[0] |= s2[0]; + w2_t[1] |= s2[1]; + w2_t[2] |= s2[2]; + w2_t[3] |= s2[3]; + w3_t[0] |= s3[0]; + w3_t[1] |= s3[1]; + w3_t[2] |= s3[2]; + w3_t[3] |= s3[3]; + + append_0x80_4 (w0_t, w1_t, w2_t, w3_t, out_salt_len); + + /** + * sha512 + */ + + w0_t[0] = swap_workaround (w0_t[0]); + w0_t[1] = swap_workaround (w0_t[1]); + w0_t[2] = swap_workaround (w0_t[2]); + w0_t[3] = swap_workaround (w0_t[3]); + w1_t[0] = swap_workaround (w1_t[0]); + w1_t[1] = swap_workaround (w1_t[1]); + w1_t[2] = swap_workaround (w1_t[2]); + w1_t[3] = swap_workaround (w1_t[3]); + w2_t[0] = swap_workaround (w2_t[0]); + w2_t[1] = swap_workaround (w2_t[1]); + w2_t[2] = swap_workaround (w2_t[2]); + w2_t[3] = swap_workaround (w2_t[3]); + w3_t[0] = swap_workaround (w3_t[0]); + w3_t[1] = swap_workaround (w3_t[1]); + w3_t[2] = 0; + w3_t[3] = out_salt_len * 8; + + u64x digest[8]; + + digest[0] = SHA512M_A; + digest[1] = SHA512M_B; + digest[2] = SHA512M_C; + digest[3] = SHA512M_D; + digest[4] = SHA512M_E; + digest[5] = SHA512M_F; + digest[6] = SHA512M_G; + digest[7] = SHA512M_H; + + sha512_transform (w0_t, w1_t, w2_t, w3_t, digest); + + + const u32x r0 = l32_from_64 (digest[7]); + const u32x r1 = h32_from_64 (digest[7]); + const u32x r2 = l32_from_64 (digest[3]); + const u32x r3 = h32_from_64 (digest[3]); + + #include VECT_COMPARE_S + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m01730_s08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m01730_s16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/amd/m01730_a1.cl b/amd/m01730_a1.cl new file mode 100644 index 0000000000..e433262420 --- /dev/null +++ b/amd/m01730_a1.cl @@ -0,0 +1,668 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _SHA512_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW4 +#define VECT_SIZE1 +#endif + +#ifdef VLIW5 +#define VECT_SIZE1 +#endif + +#define DGST_R0 14 +#define DGST_R1 15 +#define DGST_R2 6 +#define DGST_R3 7 + +#include "include/kernel_functions.c" +#include "types_amd.c" +#include "common_amd.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +__constant u64 k_sha512[80] = +{ + SHA512C00, SHA512C01, SHA512C02, SHA512C03, + SHA512C04, SHA512C05, SHA512C06, SHA512C07, + SHA512C08, SHA512C09, SHA512C0a, SHA512C0b, + SHA512C0c, SHA512C0d, SHA512C0e, SHA512C0f, + SHA512C10, SHA512C11, SHA512C12, SHA512C13, + SHA512C14, SHA512C15, SHA512C16, SHA512C17, + SHA512C18, SHA512C19, SHA512C1a, SHA512C1b, + SHA512C1c, SHA512C1d, SHA512C1e, SHA512C1f, + SHA512C20, SHA512C21, SHA512C22, SHA512C23, + SHA512C24, SHA512C25, SHA512C26, SHA512C27, + SHA512C28, SHA512C29, SHA512C2a, SHA512C2b, + SHA512C2c, SHA512C2d, SHA512C2e, SHA512C2f, + SHA512C30, SHA512C31, SHA512C32, SHA512C33, + SHA512C34, SHA512C35, SHA512C36, SHA512C37, + SHA512C38, SHA512C39, SHA512C3a, SHA512C3b, + SHA512C3c, SHA512C3d, SHA512C3e, SHA512C3f, + SHA512C40, SHA512C41, SHA512C42, SHA512C43, + SHA512C44, SHA512C45, SHA512C46, SHA512C47, + SHA512C48, SHA512C49, SHA512C4a, SHA512C4b, + SHA512C4c, SHA512C4d, SHA512C4e, SHA512C4f, +}; + +static void sha512_transform (const u32x w0[4], const u32x w1[4], const u32x w2[4], const u32x w3[4], u64x digest[8]) +{ + u64x w0_t = hl32_to_64 (w0[0], w0[1]); + u64x w1_t = hl32_to_64 (w0[2], w0[3]); + u64x w2_t = hl32_to_64 (w1[0], w1[1]); + u64x w3_t = hl32_to_64 (w1[2], w1[3]); + u64x w4_t = hl32_to_64 (w2[0], w2[1]); + u64x w5_t = hl32_to_64 (w2[2], w2[3]); + u64x w6_t = hl32_to_64 (w3[0], w3[1]); + u64x w7_t = 0; + u64x w8_t = 0; + u64x w9_t = 0; + u64x wa_t = 0; + u64x wb_t = 0; + u64x wc_t = 0; + u64x wd_t = 0; + u64x we_t = 0; + u64x wf_t = hl32_to_64 (w3[2], w3[3]); + + u64x a = digest[0]; + u64x b = digest[1]; + u64x c = digest[2]; + u64x d = digest[3]; + u64x e = digest[4]; + u64x f = digest[5]; + u64x g = digest[6]; + u64x h = digest[7]; + + #define ROUND_EXPAND() \ + { \ + w0_t = SHA512_EXPAND (we_t, w9_t, w1_t, w0_t); \ + w1_t = SHA512_EXPAND (wf_t, wa_t, w2_t, w1_t); \ + w2_t = SHA512_EXPAND (w0_t, wb_t, w3_t, w2_t); \ + w3_t = SHA512_EXPAND (w1_t, wc_t, w4_t, w3_t); \ + w4_t = SHA512_EXPAND (w2_t, wd_t, w5_t, w4_t); \ + w5_t = SHA512_EXPAND (w3_t, we_t, w6_t, w5_t); \ + w6_t = SHA512_EXPAND (w4_t, wf_t, w7_t, w6_t); \ + w7_t = SHA512_EXPAND (w5_t, w0_t, w8_t, w7_t); \ + w8_t = SHA512_EXPAND (w6_t, w1_t, w9_t, w8_t); \ + w9_t = SHA512_EXPAND (w7_t, w2_t, wa_t, w9_t); \ + wa_t = SHA512_EXPAND (w8_t, w3_t, wb_t, wa_t); \ + wb_t = SHA512_EXPAND (w9_t, w4_t, wc_t, wb_t); \ + wc_t = SHA512_EXPAND (wa_t, w5_t, wd_t, wc_t); \ + wd_t = SHA512_EXPAND (wb_t, w6_t, we_t, wd_t); \ + we_t = SHA512_EXPAND (wc_t, w7_t, wf_t, we_t); \ + wf_t = SHA512_EXPAND (wd_t, w8_t, w0_t, wf_t); \ + } + + #define ROUND_STEP(i) \ + { \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, a, b, c, d, e, f, g, h, w0_t, k_sha512[i + 0]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, h, a, b, c, d, e, f, g, w1_t, k_sha512[i + 1]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, g, h, a, b, c, d, e, f, w2_t, k_sha512[i + 2]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, f, g, h, a, b, c, d, e, w3_t, k_sha512[i + 3]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, e, f, g, h, a, b, c, d, w4_t, k_sha512[i + 4]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, d, e, f, g, h, a, b, c, w5_t, k_sha512[i + 5]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, c, d, e, f, g, h, a, b, w6_t, k_sha512[i + 6]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, b, c, d, e, f, g, h, a, w7_t, k_sha512[i + 7]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, a, b, c, d, e, f, g, h, w8_t, k_sha512[i + 8]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, h, a, b, c, d, e, f, g, w9_t, k_sha512[i + 9]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, g, h, a, b, c, d, e, f, wa_t, k_sha512[i + 10]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, f, g, h, a, b, c, d, e, wb_t, k_sha512[i + 11]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, e, f, g, h, a, b, c, d, wc_t, k_sha512[i + 12]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, d, e, f, g, h, a, b, c, wd_t, k_sha512[i + 13]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, c, d, e, f, g, h, a, b, we_t, k_sha512[i + 14]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, b, c, d, e, f, g, h, a, wf_t, k_sha512[i + 15]); \ + } + + ROUND_STEP (0); + + #pragma unroll + for (int i = 16; i < 80; i += 16) + { + ROUND_EXPAND (); ROUND_STEP (i); + } + + /* rev + digest[0] += a; + digest[1] += b; + digest[2] += c; + digest[3] += d; + digest[4] += e; + digest[5] += f; + digest[6] += g; + digest[7] += h; + */ + + digest[0] = a; + digest[1] = b; + digest[2] = c; + digest[3] = d; + digest[4] = e; + digest[5] = f; + digest[6] = g; + digest[7] = h; +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m01730_m04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, combs_buf[0].pw_len); + } + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[7]; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = combs_buf[il_pos].pw_len; + + const u32 pw_len = pw_l_len + pw_r_len; + + u32 wordr0[4]; + u32 wordr1[4]; + u32 wordr2[4]; + u32 wordr3[4]; + + wordr0[0] = combs_buf[il_pos].i[0]; + wordr0[1] = combs_buf[il_pos].i[1]; + wordr0[2] = combs_buf[il_pos].i[2]; + wordr0[3] = combs_buf[il_pos].i[3]; + wordr1[0] = combs_buf[il_pos].i[4]; + wordr1[1] = combs_buf[il_pos].i[5]; + wordr1[2] = combs_buf[il_pos].i[6]; + wordr1[3] = combs_buf[il_pos].i[7]; + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + u32x w0[4]; + u32x w1[4]; + u32x w2[4]; + u32x w3[4]; + + w0[0] = wordl0[0] | wordr0[0]; + w0[1] = wordl0[1] | wordr0[1]; + w0[2] = wordl0[2] | wordr0[2]; + w0[3] = wordl0[3] | wordr0[3]; + w1[0] = wordl1[0] | wordr1[0]; + w1[1] = wordl1[1] | wordr1[1]; + w1[2] = wordl1[2] | wordr1[2]; + w1[3] = wordl1[3] | wordr1[3]; + w2[0] = wordl2[0] | wordr2[0]; + w2[1] = wordl2[1] | wordr2[1]; + w2[2] = wordl2[2] | wordr2[2]; + w2[3] = wordl2[3] | wordr2[3]; + w3[0] = wordl3[0] | wordr3[0]; + w3[1] = wordl3[1] | wordr3[1]; + w3[2] = wordl3[2] | wordr3[2]; + w3[3] = wordl3[3] | wordr3[3]; + + /** + * append salt + */ + + u32 s0[4]; + + s0[0] = salt_buf0[0]; + s0[1] = salt_buf0[1]; + s0[2] = salt_buf0[2]; + s0[3] = salt_buf0[3]; + + u32 s1[4]; + + s1[0] = salt_buf1[0]; + s1[1] = salt_buf1[1]; + s1[2] = salt_buf1[2]; + s1[3] = salt_buf1[3]; + + u32 s2[4]; + + s2[0] = 0; + s2[1] = 0; + s2[2] = 0; + s2[3] = 0; + + u32 s3[4]; + + s3[0] = 0; + s3[1] = 0; + s3[2] = 0; + s3[3] = 0; + + switch_buffer_by_offset (s0, s1, s2, s3, (pw_len * 2)); + + const u32 pw_salt_len = (pw_len * 2) + salt_len; + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + make_unicode (w0, w0_t, w1_t); + make_unicode (w1, w2_t, w3_t); + + w0_t[0] |= s0[0]; + w0_t[1] |= s0[1]; + w0_t[2] |= s0[2]; + w0_t[3] |= s0[3]; + w1_t[0] |= s1[0]; + w1_t[1] |= s1[1]; + w1_t[2] |= s1[2]; + w1_t[3] |= s1[3]; + w2_t[0] |= s2[0]; + w2_t[1] |= s2[1]; + w2_t[2] |= s2[2]; + w2_t[3] |= s2[3]; + w3_t[0] |= s3[0]; + w3_t[1] |= s3[1]; + w3_t[2] |= s3[2]; + w3_t[3] |= s3[3]; + + append_0x80_4 (w0_t, w1_t, w2_t, w3_t, pw_salt_len); + + /** + * sha512 + */ + + w0_t[0] = swap_workaround (w0_t[0]); + w0_t[1] = swap_workaround (w0_t[1]); + w0_t[2] = swap_workaround (w0_t[2]); + w0_t[3] = swap_workaround (w0_t[3]); + w1_t[0] = swap_workaround (w1_t[0]); + w1_t[1] = swap_workaround (w1_t[1]); + w1_t[2] = swap_workaround (w1_t[2]); + w1_t[3] = swap_workaround (w1_t[3]); + w2_t[0] = swap_workaround (w2_t[0]); + w2_t[1] = swap_workaround (w2_t[1]); + w2_t[2] = swap_workaround (w2_t[2]); + w2_t[3] = swap_workaround (w2_t[3]); + w3_t[0] = swap_workaround (w3_t[0]); + w3_t[1] = swap_workaround (w3_t[1]); + w3_t[2] = 0; + w3_t[3] = pw_salt_len * 8; + + u64x digest[8]; + + digest[0] = SHA512M_A; + digest[1] = SHA512M_B; + digest[2] = SHA512M_C; + digest[3] = SHA512M_D; + digest[4] = SHA512M_E; + digest[5] = SHA512M_F; + digest[6] = SHA512M_G; + digest[7] = SHA512M_H; + + sha512_transform (w0_t, w1_t, w2_t, w3_t, digest); + + + const u32x r0 = l32_from_64 (digest[7]); + const u32x r1 = h32_from_64 (digest[7]); + const u32x r2 = l32_from_64 (digest[3]); + const u32x r3 = h32_from_64 (digest[3]); + + #include VECT_COMPARE_M + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m01730_m08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m01730_m16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m01730_s04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, combs_buf[0].pw_len); + } + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[7]; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = combs_buf[il_pos].pw_len; + + const u32 pw_len = pw_l_len + pw_r_len; + + u32 wordr0[4]; + u32 wordr1[4]; + u32 wordr2[4]; + u32 wordr3[4]; + + wordr0[0] = combs_buf[il_pos].i[0]; + wordr0[1] = combs_buf[il_pos].i[1]; + wordr0[2] = combs_buf[il_pos].i[2]; + wordr0[3] = combs_buf[il_pos].i[3]; + wordr1[0] = combs_buf[il_pos].i[4]; + wordr1[1] = combs_buf[il_pos].i[5]; + wordr1[2] = combs_buf[il_pos].i[6]; + wordr1[3] = combs_buf[il_pos].i[7]; + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + u32x w0[4]; + u32x w1[4]; + u32x w2[4]; + u32x w3[4]; + + w0[0] = wordl0[0] | wordr0[0]; + w0[1] = wordl0[1] | wordr0[1]; + w0[2] = wordl0[2] | wordr0[2]; + w0[3] = wordl0[3] | wordr0[3]; + w1[0] = wordl1[0] | wordr1[0]; + w1[1] = wordl1[1] | wordr1[1]; + w1[2] = wordl1[2] | wordr1[2]; + w1[3] = wordl1[3] | wordr1[3]; + w2[0] = wordl2[0] | wordr2[0]; + w2[1] = wordl2[1] | wordr2[1]; + w2[2] = wordl2[2] | wordr2[2]; + w2[3] = wordl2[3] | wordr2[3]; + w3[0] = wordl3[0] | wordr3[0]; + w3[1] = wordl3[1] | wordr3[1]; + w3[2] = wordl3[2] | wordr3[2]; + w3[3] = wordl3[3] | wordr3[3]; + + /** + * append salt + */ + + u32 s0[4]; + + s0[0] = salt_buf0[0]; + s0[1] = salt_buf0[1]; + s0[2] = salt_buf0[2]; + s0[3] = salt_buf0[3]; + + u32 s1[4]; + + s1[0] = salt_buf1[0]; + s1[1] = salt_buf1[1]; + s1[2] = salt_buf1[2]; + s1[3] = salt_buf1[3]; + + u32 s2[4]; + + s2[0] = 0; + s2[1] = 0; + s2[2] = 0; + s2[3] = 0; + + u32 s3[4]; + + s3[0] = 0; + s3[1] = 0; + s3[2] = 0; + s3[3] = 0; + + switch_buffer_by_offset (s0, s1, s2, s3, (pw_len * 2)); + + const u32 pw_salt_len = (pw_len * 2) + salt_len; + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + make_unicode (w0, w0_t, w1_t); + make_unicode (w1, w2_t, w3_t); + + w0_t[0] |= s0[0]; + w0_t[1] |= s0[1]; + w0_t[2] |= s0[2]; + w0_t[3] |= s0[3]; + w1_t[0] |= s1[0]; + w1_t[1] |= s1[1]; + w1_t[2] |= s1[2]; + w1_t[3] |= s1[3]; + w2_t[0] |= s2[0]; + w2_t[1] |= s2[1]; + w2_t[2] |= s2[2]; + w2_t[3] |= s2[3]; + w3_t[0] |= s3[0]; + w3_t[1] |= s3[1]; + w3_t[2] |= s3[2]; + w3_t[3] |= s3[3]; + + append_0x80_4 (w0_t, w1_t, w2_t, w3_t, pw_salt_len); + + /** + * sha512 + */ + + w0_t[0] = swap_workaround (w0_t[0]); + w0_t[1] = swap_workaround (w0_t[1]); + w0_t[2] = swap_workaround (w0_t[2]); + w0_t[3] = swap_workaround (w0_t[3]); + w1_t[0] = swap_workaround (w1_t[0]); + w1_t[1] = swap_workaround (w1_t[1]); + w1_t[2] = swap_workaround (w1_t[2]); + w1_t[3] = swap_workaround (w1_t[3]); + w2_t[0] = swap_workaround (w2_t[0]); + w2_t[1] = swap_workaround (w2_t[1]); + w2_t[2] = swap_workaround (w2_t[2]); + w2_t[3] = swap_workaround (w2_t[3]); + w3_t[0] = swap_workaround (w3_t[0]); + w3_t[1] = swap_workaround (w3_t[1]); + w3_t[2] = 0; + w3_t[3] = pw_salt_len * 8; + + u64x digest[8]; + + digest[0] = SHA512M_A; + digest[1] = SHA512M_B; + digest[2] = SHA512M_C; + digest[3] = SHA512M_D; + digest[4] = SHA512M_E; + digest[5] = SHA512M_F; + digest[6] = SHA512M_G; + digest[7] = SHA512M_H; + + sha512_transform (w0_t, w1_t, w2_t, w3_t, digest); + + + const u32x r0 = l32_from_64 (digest[7]); + const u32x r1 = h32_from_64 (digest[7]); + const u32x r2 = l32_from_64 (digest[3]); + const u32x r3 = h32_from_64 (digest[3]); + + #include VECT_COMPARE_S + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m01730_s08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m01730_s16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/amd/m01730_a3.cl b/amd/m01730_a3.cl new file mode 100644 index 0000000000..e4b8a3484f --- /dev/null +++ b/amd/m01730_a3.cl @@ -0,0 +1,601 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _SHA512_ +#define _SCALAR_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW4 +#define VECT_SIZE1 +#endif + +#ifdef VLIW5 +#define VECT_SIZE1 +#endif + +#define DGST_R0 14 +#define DGST_R1 15 +#define DGST_R2 6 +#define DGST_R3 7 + +#include "include/kernel_functions.c" +#include "types_amd.c" +#include "common_amd.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4_warp.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4_warp.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4_warp.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4_warp.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4_warp.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4_warp.c" +#endif + +__constant u64 k_sha512[80] = +{ + SHA512C00, SHA512C01, SHA512C02, SHA512C03, + SHA512C04, SHA512C05, SHA512C06, SHA512C07, + SHA512C08, SHA512C09, SHA512C0a, SHA512C0b, + SHA512C0c, SHA512C0d, SHA512C0e, SHA512C0f, + SHA512C10, SHA512C11, SHA512C12, SHA512C13, + SHA512C14, SHA512C15, SHA512C16, SHA512C17, + SHA512C18, SHA512C19, SHA512C1a, SHA512C1b, + SHA512C1c, SHA512C1d, SHA512C1e, SHA512C1f, + SHA512C20, SHA512C21, SHA512C22, SHA512C23, + SHA512C24, SHA512C25, SHA512C26, SHA512C27, + SHA512C28, SHA512C29, SHA512C2a, SHA512C2b, + SHA512C2c, SHA512C2d, SHA512C2e, SHA512C2f, + SHA512C30, SHA512C31, SHA512C32, SHA512C33, + SHA512C34, SHA512C35, SHA512C36, SHA512C37, + SHA512C38, SHA512C39, SHA512C3a, SHA512C3b, + SHA512C3c, SHA512C3d, SHA512C3e, SHA512C3f, + SHA512C40, SHA512C41, SHA512C42, SHA512C43, + SHA512C44, SHA512C45, SHA512C46, SHA512C47, + SHA512C48, SHA512C49, SHA512C4a, SHA512C4b, + SHA512C4c, SHA512C4d, SHA512C4e, SHA512C4f, +}; + +static void sha512_transform (const u32x w0[4], const u32x w1[4], const u32x w2[4], const u32x w3[4], u64x digest[8]) +{ + u64x w0_t = hl32_to_64 (w0[0], w0[1]); + u64x w1_t = hl32_to_64 (w0[2], w0[3]); + u64x w2_t = hl32_to_64 (w1[0], w1[1]); + u64x w3_t = hl32_to_64 (w1[2], w1[3]); + u64x w4_t = hl32_to_64 (w2[0], w2[1]); + u64x w5_t = hl32_to_64 (w2[2], w2[3]); + u64x w6_t = hl32_to_64 (w3[0], w3[1]); + u64x w7_t = 0; + u64x w8_t = 0; + u64x w9_t = 0; + u64x wa_t = 0; + u64x wb_t = 0; + u64x wc_t = 0; + u64x wd_t = 0; + u64x we_t = 0; + u64x wf_t = hl32_to_64 (w3[2], w3[3]); + + u64x a = digest[0]; + u64x b = digest[1]; + u64x c = digest[2]; + u64x d = digest[3]; + u64x e = digest[4]; + u64x f = digest[5]; + u64x g = digest[6]; + u64x h = digest[7]; + + #define ROUND_EXPAND() \ + { \ + w0_t = SHA512_EXPAND (we_t, w9_t, w1_t, w0_t); \ + w1_t = SHA512_EXPAND (wf_t, wa_t, w2_t, w1_t); \ + w2_t = SHA512_EXPAND (w0_t, wb_t, w3_t, w2_t); \ + w3_t = SHA512_EXPAND (w1_t, wc_t, w4_t, w3_t); \ + w4_t = SHA512_EXPAND (w2_t, wd_t, w5_t, w4_t); \ + w5_t = SHA512_EXPAND (w3_t, we_t, w6_t, w5_t); \ + w6_t = SHA512_EXPAND (w4_t, wf_t, w7_t, w6_t); \ + w7_t = SHA512_EXPAND (w5_t, w0_t, w8_t, w7_t); \ + w8_t = SHA512_EXPAND (w6_t, w1_t, w9_t, w8_t); \ + w9_t = SHA512_EXPAND (w7_t, w2_t, wa_t, w9_t); \ + wa_t = SHA512_EXPAND (w8_t, w3_t, wb_t, wa_t); \ + wb_t = SHA512_EXPAND (w9_t, w4_t, wc_t, wb_t); \ + wc_t = SHA512_EXPAND (wa_t, w5_t, wd_t, wc_t); \ + wd_t = SHA512_EXPAND (wb_t, w6_t, we_t, wd_t); \ + we_t = SHA512_EXPAND (wc_t, w7_t, wf_t, we_t); \ + wf_t = SHA512_EXPAND (wd_t, w8_t, w0_t, wf_t); \ + } + + #define ROUND_STEP(i) \ + { \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, a, b, c, d, e, f, g, h, w0_t, k_sha512[i + 0]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, h, a, b, c, d, e, f, g, w1_t, k_sha512[i + 1]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, g, h, a, b, c, d, e, f, w2_t, k_sha512[i + 2]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, f, g, h, a, b, c, d, e, w3_t, k_sha512[i + 3]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, e, f, g, h, a, b, c, d, w4_t, k_sha512[i + 4]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, d, e, f, g, h, a, b, c, w5_t, k_sha512[i + 5]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, c, d, e, f, g, h, a, b, w6_t, k_sha512[i + 6]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, b, c, d, e, f, g, h, a, w7_t, k_sha512[i + 7]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, a, b, c, d, e, f, g, h, w8_t, k_sha512[i + 8]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, h, a, b, c, d, e, f, g, w9_t, k_sha512[i + 9]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, g, h, a, b, c, d, e, f, wa_t, k_sha512[i + 10]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, f, g, h, a, b, c, d, e, wb_t, k_sha512[i + 11]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, e, f, g, h, a, b, c, d, wc_t, k_sha512[i + 12]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, d, e, f, g, h, a, b, c, wd_t, k_sha512[i + 13]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, c, d, e, f, g, h, a, b, we_t, k_sha512[i + 14]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, b, c, d, e, f, g, h, a, wf_t, k_sha512[i + 15]); \ + } + + ROUND_STEP (0); + + #pragma unroll + for (int i = 16; i < 80; i += 16) + { + ROUND_EXPAND (); ROUND_STEP (i); + } + + /* rev + digest[0] += a; + digest[1] += b; + digest[2] += c; + digest[3] += d; + digest[4] += e; + digest[5] += f; + digest[6] += g; + digest[7] += h; + */ + + digest[0] = a; + digest[1] = b; + digest[2] = c; + digest[3] = d; + digest[4] = e; + digest[5] = f; + digest[6] = g; + digest[7] = h; +} + +static void m01730m (u32 w[16], const u32 pw_len, __global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global u32x * words_buf_r, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset) +{ + /** + * modifier + */ + + const u32 gid = get_global_id (0); + const u32 lid = get_local_id (0); + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[ 1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[ 2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[ 3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[ 4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[ 5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[ 6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[ 7]; + + u32 salt_buf2[4]; + + salt_buf2[0] = salt_bufs[salt_pos].salt_buf[ 8]; + salt_buf2[1] = 0; + salt_buf2[2] = 0; + salt_buf2[3] = 0; + + u32 salt_buf3[4]; + + salt_buf3[0] = 0; + salt_buf3[1] = 0; + salt_buf3[2] = 0; + salt_buf3[3] = 0; + + switch_buffer_by_offset (salt_buf0, salt_buf1, salt_buf2, salt_buf3, pw_len); + + w[ 0] |= swap_workaround (salt_buf0[0]); + w[ 1] |= swap_workaround (salt_buf0[1]); + w[ 2] |= swap_workaround (salt_buf0[2]); + w[ 3] |= swap_workaround (salt_buf0[3]); + w[ 4] |= swap_workaround (salt_buf1[0]); + w[ 5] |= swap_workaround (salt_buf1[1]); + w[ 6] |= swap_workaround (salt_buf1[2]); + w[ 7] |= swap_workaround (salt_buf1[3]); + w[ 8] |= swap_workaround (salt_buf2[0]); + w[ 9] |= swap_workaround (salt_buf2[1]); + w[10] |= swap_workaround (salt_buf2[2]); + w[11] |= swap_workaround (salt_buf2[3]); + w[12] |= swap_workaround (salt_buf3[0]); + w[13] |= swap_workaround (salt_buf3[1]); + w[14] |= swap_workaround (salt_buf3[2]); + w[15] |= swap_workaround (salt_buf3[3]); + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + const u32 pw_salt_len = pw_len + salt_len; + + w[15] = pw_salt_len * 8; + + /** + * loop + */ + + const u32 bf_loops = ceil ((float) bfs_cnt / VECT_DIV); + + u32x w0l = w[0]; + + for (u32 il_pos = 0; il_pos < bf_loops; il_pos++) + { + const u32x w0r = words_buf_r[il_pos]; + + const u32x w0 = w0l | w0r; + + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + w0_t[0] = w0; + w0_t[1] = w[ 1]; + w0_t[2] = w[ 2]; + w0_t[3] = w[ 3]; + w1_t[0] = w[ 4]; + w1_t[1] = w[ 5]; + w1_t[2] = w[ 6]; + w1_t[3] = w[ 7]; + w2_t[0] = w[ 8]; + w2_t[1] = w[ 9]; + w2_t[2] = w[10]; + w2_t[3] = w[11]; + w3_t[0] = w[12]; + w3_t[1] = w[13]; + w3_t[2] = w[14]; + w3_t[3] = w[15]; + + u64x digest[8]; + + digest[0] = SHA512M_A; + digest[1] = SHA512M_B; + digest[2] = SHA512M_C; + digest[3] = SHA512M_D; + digest[4] = SHA512M_E; + digest[5] = SHA512M_F; + digest[6] = SHA512M_G; + digest[7] = SHA512M_H; + + sha512_transform (w0_t, w1_t, w2_t, w3_t, digest); + + + const u32x r0 = l32_from_64 (digest[7]); + const u32x r1 = h32_from_64 (digest[7]); + const u32x r2 = l32_from_64 (digest[3]); + const u32x r3 = h32_from_64 (digest[3]); + + #include VECT_COMPARE_M + } +} + +static void m01730s (u32 w[16], const u32 pw_len, __global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global u32x * words_buf_r, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset) +{ + /** + * modifier + */ + + const u32 gid = get_global_id (0); + const u32 lid = get_local_id (0); + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * loop + */ + + const u32 bf_loops = ceil ((float) bfs_cnt / VECT_DIV); + + u32x w0l = w[0]; + + for (u32 il_pos = 0; il_pos < bf_loops; il_pos++) + { + const u32x w0r = words_buf_r[il_pos]; + + const u32x w0 = w0l | w0r; + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + w0_t[0] = w0; + w0_t[1] = w[ 1]; + w0_t[2] = w[ 2]; + w0_t[3] = w[ 3]; + w1_t[0] = w[ 4]; + w1_t[1] = w[ 5]; + w1_t[2] = w[ 6]; + w1_t[3] = w[ 7]; + w2_t[0] = w[ 8]; + w2_t[1] = w[ 9]; + w2_t[2] = w[10]; + w2_t[3] = w[11]; + w3_t[0] = w[12]; + w3_t[1] = w[13]; + w3_t[2] = w[14]; + w3_t[3] = w[15]; + + u64x digest[8]; + + digest[0] = SHA512M_A; + digest[1] = SHA512M_B; + digest[2] = SHA512M_C; + digest[3] = SHA512M_D; + digest[4] = SHA512M_E; + digest[5] = SHA512M_F; + digest[6] = SHA512M_G; + digest[7] = SHA512M_H; + + sha512_transform (w0_t, w1_t, w2_t, w3_t, digest); + + + const u32x r0 = l32_from_64 (digest[7]); + const u32x r1 = h32_from_64 (digest[7]); + const u32x r2 = l32_from_64 (digest[3]); + const u32x r3 = h32_from_64 (digest[3]); + + #include VECT_COMPARE_S + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m01730_m04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global u32x * words_buf_r, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32 w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = 0; + w[ 5] = 0; + w[ 6] = 0; + w[ 7] = 0; + w[ 8] = 0; + w[ 9] = 0; + w[10] = 0; + w[11] = 0; + w[12] = 0; + w[13] = 0; + w[14] = 0; + w[15] = pws[gid].i[15]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m01730m (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m01730_m08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global u32x * words_buf_r, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32 w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = pws[gid].i[ 4]; + w[ 5] = pws[gid].i[ 5]; + w[ 6] = pws[gid].i[ 6]; + w[ 7] = pws[gid].i[ 7]; + w[ 8] = 0; + w[ 9] = 0; + w[10] = 0; + w[11] = 0; + w[12] = 0; + w[13] = 0; + w[14] = 0; + w[15] = pws[gid].i[15]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m01730m (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m01730_m16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global u32x * words_buf_r, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32 w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = pws[gid].i[ 4]; + w[ 5] = pws[gid].i[ 5]; + w[ 6] = pws[gid].i[ 6]; + w[ 7] = pws[gid].i[ 7]; + w[ 8] = pws[gid].i[ 8]; + w[ 9] = pws[gid].i[ 9]; + w[10] = pws[gid].i[10]; + w[11] = pws[gid].i[11]; + w[12] = pws[gid].i[12]; + w[13] = pws[gid].i[13]; + w[14] = pws[gid].i[14]; + w[15] = pws[gid].i[15]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m01730m (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m01730_s04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global u32x * words_buf_r, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32 w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = 0; + w[ 5] = 0; + w[ 6] = 0; + w[ 7] = 0; + w[ 8] = 0; + w[ 9] = 0; + w[10] = 0; + w[11] = 0; + w[12] = 0; + w[13] = 0; + w[14] = 0; + w[15] = pws[gid].i[15]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m01730s (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m01730_s08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global u32x * words_buf_r, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32 w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = pws[gid].i[ 4]; + w[ 5] = pws[gid].i[ 5]; + w[ 6] = pws[gid].i[ 6]; + w[ 7] = pws[gid].i[ 7]; + w[ 8] = 0; + w[ 9] = 0; + w[10] = 0; + w[11] = 0; + w[12] = 0; + w[13] = 0; + w[14] = 0; + w[15] = pws[gid].i[15]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m01730s (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m01730_s16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global u32x * words_buf_r, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32 w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = pws[gid].i[ 4]; + w[ 5] = pws[gid].i[ 5]; + w[ 6] = pws[gid].i[ 6]; + w[ 7] = pws[gid].i[ 7]; + w[ 8] = pws[gid].i[ 8]; + w[ 9] = pws[gid].i[ 9]; + w[10] = pws[gid].i[10]; + w[11] = pws[gid].i[11]; + w[12] = pws[gid].i[12]; + w[13] = pws[gid].i[13]; + w[14] = pws[gid].i[14]; + w[15] = pws[gid].i[15]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m01730s (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} diff --git a/amd/m01740_a0.cl b/amd/m01740_a0.cl new file mode 100644 index 0000000000..393217937b --- /dev/null +++ b/amd/m01740_a0.cl @@ -0,0 +1,502 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _SHA512_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW4 +#define VECT_SIZE1 +#endif + +#ifdef VLIW5 +#define VECT_SIZE1 +#endif + +#define DGST_R0 14 +#define DGST_R1 15 +#define DGST_R2 6 +#define DGST_R3 7 + +#include "include/kernel_functions.c" +#include "types_amd.c" +#include "common_amd.c" +#include "include/rp_gpu.h" +#include "rp_amd.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +__constant u64 k_sha512[80] = +{ + SHA512C00, SHA512C01, SHA512C02, SHA512C03, + SHA512C04, SHA512C05, SHA512C06, SHA512C07, + SHA512C08, SHA512C09, SHA512C0a, SHA512C0b, + SHA512C0c, SHA512C0d, SHA512C0e, SHA512C0f, + SHA512C10, SHA512C11, SHA512C12, SHA512C13, + SHA512C14, SHA512C15, SHA512C16, SHA512C17, + SHA512C18, SHA512C19, SHA512C1a, SHA512C1b, + SHA512C1c, SHA512C1d, SHA512C1e, SHA512C1f, + SHA512C20, SHA512C21, SHA512C22, SHA512C23, + SHA512C24, SHA512C25, SHA512C26, SHA512C27, + SHA512C28, SHA512C29, SHA512C2a, SHA512C2b, + SHA512C2c, SHA512C2d, SHA512C2e, SHA512C2f, + SHA512C30, SHA512C31, SHA512C32, SHA512C33, + SHA512C34, SHA512C35, SHA512C36, SHA512C37, + SHA512C38, SHA512C39, SHA512C3a, SHA512C3b, + SHA512C3c, SHA512C3d, SHA512C3e, SHA512C3f, + SHA512C40, SHA512C41, SHA512C42, SHA512C43, + SHA512C44, SHA512C45, SHA512C46, SHA512C47, + SHA512C48, SHA512C49, SHA512C4a, SHA512C4b, + SHA512C4c, SHA512C4d, SHA512C4e, SHA512C4f, +}; + +static void sha512_transform (const u32x w0[4], const u32x w1[4], const u32x w2[4], const u32x w3[4], u64x digest[8]) +{ + u64x w0_t = hl32_to_64 (w0[0], w0[1]); + u64x w1_t = hl32_to_64 (w0[2], w0[3]); + u64x w2_t = hl32_to_64 (w1[0], w1[1]); + u64x w3_t = hl32_to_64 (w1[2], w1[3]); + u64x w4_t = hl32_to_64 (w2[0], w2[1]); + u64x w5_t = hl32_to_64 (w2[2], w2[3]); + u64x w6_t = hl32_to_64 (w3[0], w3[1]); + u64x w7_t = 0; + u64x w8_t = 0; + u64x w9_t = 0; + u64x wa_t = 0; + u64x wb_t = 0; + u64x wc_t = 0; + u64x wd_t = 0; + u64x we_t = 0; + u64x wf_t = hl32_to_64 (w3[2], w3[3]); + + u64x a = digest[0]; + u64x b = digest[1]; + u64x c = digest[2]; + u64x d = digest[3]; + u64x e = digest[4]; + u64x f = digest[5]; + u64x g = digest[6]; + u64x h = digest[7]; + + #define ROUND_EXPAND() \ + { \ + w0_t = SHA512_EXPAND (we_t, w9_t, w1_t, w0_t); \ + w1_t = SHA512_EXPAND (wf_t, wa_t, w2_t, w1_t); \ + w2_t = SHA512_EXPAND (w0_t, wb_t, w3_t, w2_t); \ + w3_t = SHA512_EXPAND (w1_t, wc_t, w4_t, w3_t); \ + w4_t = SHA512_EXPAND (w2_t, wd_t, w5_t, w4_t); \ + w5_t = SHA512_EXPAND (w3_t, we_t, w6_t, w5_t); \ + w6_t = SHA512_EXPAND (w4_t, wf_t, w7_t, w6_t); \ + w7_t = SHA512_EXPAND (w5_t, w0_t, w8_t, w7_t); \ + w8_t = SHA512_EXPAND (w6_t, w1_t, w9_t, w8_t); \ + w9_t = SHA512_EXPAND (w7_t, w2_t, wa_t, w9_t); \ + wa_t = SHA512_EXPAND (w8_t, w3_t, wb_t, wa_t); \ + wb_t = SHA512_EXPAND (w9_t, w4_t, wc_t, wb_t); \ + wc_t = SHA512_EXPAND (wa_t, w5_t, wd_t, wc_t); \ + wd_t = SHA512_EXPAND (wb_t, w6_t, we_t, wd_t); \ + we_t = SHA512_EXPAND (wc_t, w7_t, wf_t, we_t); \ + wf_t = SHA512_EXPAND (wd_t, w8_t, w0_t, wf_t); \ + } + + #define ROUND_STEP(i) \ + { \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, a, b, c, d, e, f, g, h, w0_t, k_sha512[i + 0]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, h, a, b, c, d, e, f, g, w1_t, k_sha512[i + 1]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, g, h, a, b, c, d, e, f, w2_t, k_sha512[i + 2]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, f, g, h, a, b, c, d, e, w3_t, k_sha512[i + 3]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, e, f, g, h, a, b, c, d, w4_t, k_sha512[i + 4]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, d, e, f, g, h, a, b, c, w5_t, k_sha512[i + 5]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, c, d, e, f, g, h, a, b, w6_t, k_sha512[i + 6]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, b, c, d, e, f, g, h, a, w7_t, k_sha512[i + 7]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, a, b, c, d, e, f, g, h, w8_t, k_sha512[i + 8]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, h, a, b, c, d, e, f, g, w9_t, k_sha512[i + 9]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, g, h, a, b, c, d, e, f, wa_t, k_sha512[i + 10]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, f, g, h, a, b, c, d, e, wb_t, k_sha512[i + 11]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, e, f, g, h, a, b, c, d, wc_t, k_sha512[i + 12]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, d, e, f, g, h, a, b, c, wd_t, k_sha512[i + 13]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, c, d, e, f, g, h, a, b, we_t, k_sha512[i + 14]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, b, c, d, e, f, g, h, a, wf_t, k_sha512[i + 15]); \ + } + + ROUND_STEP (0); + + #pragma unroll + for (int i = 16; i < 80; i += 16) + { + ROUND_EXPAND (); ROUND_STEP (i); + } + + /* rev + digest[0] += a; + digest[1] += b; + digest[2] += c; + digest[3] += d; + digest[4] += e; + digest[5] += f; + digest[6] += g; + digest[7] += h; + */ + + digest[0] = a; + digest[1] = b; + digest[2] = c; + digest[3] = d; + digest[4] = e; + digest[5] = f; + digest[6] = g; + digest[7] = h; +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m01740_m04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + u32x pw_buf1[4]; + + pw_buf1[0] = pws[gid].i[ 4]; + pw_buf1[1] = pws[gid].i[ 5]; + pw_buf1[2] = pws[gid].i[ 6]; + pw_buf1[3] = pws[gid].i[ 7]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[7]; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + u32x w1[4]; + u32x w2[4]; + u32x w3[4]; + + w0[0] = pw_buf0[0]; + w0[1] = pw_buf0[1]; + w0[2] = pw_buf0[2]; + w0[3] = pw_buf0[3]; + w1[0] = pw_buf1[0]; + w1[1] = pw_buf1[1]; + w1[2] = pw_buf1[2]; + w1[3] = pw_buf1[3]; + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 out_len = apply_rules (rules_buf[il_pos].cmds, w0, w1, pw_len); + + /** + * prepend salt + */ + + const u32 out_salt_len = (out_len * 2) + salt_len; + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + make_unicode (w0, w0_t, w1_t); + make_unicode (w1, w2_t, w3_t); + + switch_buffer_by_offset (w0_t, w1_t, w2_t, w3_t, salt_len); + + w0_t[0] |= salt_buf0[0]; + w0_t[1] |= salt_buf0[1]; + w0_t[2] |= salt_buf0[2]; + w0_t[3] |= salt_buf0[3]; + w1_t[0] |= salt_buf1[0]; + w1_t[1] |= salt_buf1[1]; + w1_t[2] |= salt_buf1[2]; + w1_t[3] |= salt_buf1[3]; + + append_0x80_4 (w0_t, w1_t, w2_t, w3_t, out_salt_len); + + /** + * sha512 + */ + + w0_t[0] = swap_workaround (w0_t[0]); + w0_t[1] = swap_workaround (w0_t[1]); + w0_t[2] = swap_workaround (w0_t[2]); + w0_t[3] = swap_workaround (w0_t[3]); + w1_t[0] = swap_workaround (w1_t[0]); + w1_t[1] = swap_workaround (w1_t[1]); + w1_t[2] = swap_workaround (w1_t[2]); + w1_t[3] = swap_workaround (w1_t[3]); + w2_t[0] = swap_workaround (w2_t[0]); + w2_t[1] = swap_workaround (w2_t[1]); + w2_t[2] = swap_workaround (w2_t[2]); + w2_t[3] = swap_workaround (w2_t[3]); + w3_t[0] = swap_workaround (w3_t[0]); + w3_t[1] = swap_workaround (w3_t[1]); + w3_t[2] = 0; + w3_t[3] = out_salt_len * 8; + + u64x digest[8]; + + digest[0] = SHA512M_A; + digest[1] = SHA512M_B; + digest[2] = SHA512M_C; + digest[3] = SHA512M_D; + digest[4] = SHA512M_E; + digest[5] = SHA512M_F; + digest[6] = SHA512M_G; + digest[7] = SHA512M_H; + + sha512_transform (w0_t, w1_t, w2_t, w3_t, digest); + + + const u32x r0 = l32_from_64 (digest[7]); + const u32x r1 = h32_from_64 (digest[7]); + const u32x r2 = l32_from_64 (digest[3]); + const u32x r3 = h32_from_64 (digest[3]); + + #include VECT_COMPARE_M + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m01740_m08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m01740_m16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m01740_s04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + u32x pw_buf1[4]; + + pw_buf1[0] = pws[gid].i[ 4]; + pw_buf1[1] = pws[gid].i[ 5]; + pw_buf1[2] = pws[gid].i[ 6]; + pw_buf1[3] = pws[gid].i[ 7]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[7]; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + u32x w1[4]; + u32x w2[4]; + u32x w3[4]; + + w0[0] = pw_buf0[0]; + w0[1] = pw_buf0[1]; + w0[2] = pw_buf0[2]; + w0[3] = pw_buf0[3]; + w1[0] = pw_buf1[0]; + w1[1] = pw_buf1[1]; + w1[2] = pw_buf1[2]; + w1[3] = pw_buf1[3]; + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 out_len = apply_rules (rules_buf[il_pos].cmds, w0, w1, pw_len); + + /** + * prepend salt + */ + + const u32 out_salt_len = (out_len * 2) + salt_len; + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + make_unicode (w0, w0_t, w1_t); + make_unicode (w1, w2_t, w3_t); + + switch_buffer_by_offset (w0_t, w1_t, w2_t, w3_t, salt_len); + + w0_t[0] |= salt_buf0[0]; + w0_t[1] |= salt_buf0[1]; + w0_t[2] |= salt_buf0[2]; + w0_t[3] |= salt_buf0[3]; + w1_t[0] |= salt_buf1[0]; + w1_t[1] |= salt_buf1[1]; + w1_t[2] |= salt_buf1[2]; + w1_t[3] |= salt_buf1[3]; + + append_0x80_4 (w0_t, w1_t, w2_t, w3_t, out_salt_len); + + /** + * sha512 + */ + + w0_t[0] = swap_workaround (w0_t[0]); + w0_t[1] = swap_workaround (w0_t[1]); + w0_t[2] = swap_workaround (w0_t[2]); + w0_t[3] = swap_workaround (w0_t[3]); + w1_t[0] = swap_workaround (w1_t[0]); + w1_t[1] = swap_workaround (w1_t[1]); + w1_t[2] = swap_workaround (w1_t[2]); + w1_t[3] = swap_workaround (w1_t[3]); + w2_t[0] = swap_workaround (w2_t[0]); + w2_t[1] = swap_workaround (w2_t[1]); + w2_t[2] = swap_workaround (w2_t[2]); + w2_t[3] = swap_workaround (w2_t[3]); + w3_t[0] = swap_workaround (w3_t[0]); + w3_t[1] = swap_workaround (w3_t[1]); + w3_t[2] = 0; + w3_t[3] = out_salt_len * 8; + + u64x digest[8]; + + digest[0] = SHA512M_A; + digest[1] = SHA512M_B; + digest[2] = SHA512M_C; + digest[3] = SHA512M_D; + digest[4] = SHA512M_E; + digest[5] = SHA512M_F; + digest[6] = SHA512M_G; + digest[7] = SHA512M_H; + + sha512_transform (w0_t, w1_t, w2_t, w3_t, digest); + + + const u32x r0 = l32_from_64 (digest[7]); + const u32x r1 = h32_from_64 (digest[7]); + const u32x r2 = l32_from_64 (digest[3]); + const u32x r3 = h32_from_64 (digest[3]); + + #include VECT_COMPARE_S + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m01740_s08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m01740_s16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/amd/m01740_a1.cl b/amd/m01740_a1.cl new file mode 100644 index 0000000000..279307746b --- /dev/null +++ b/amd/m01740_a1.cl @@ -0,0 +1,596 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _SHA512_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW4 +#define VECT_SIZE1 +#endif + +#ifdef VLIW5 +#define VECT_SIZE1 +#endif + +#define DGST_R0 14 +#define DGST_R1 15 +#define DGST_R2 6 +#define DGST_R3 7 + +#include "include/kernel_functions.c" +#include "types_amd.c" +#include "common_amd.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +__constant u64 k_sha512[80] = +{ + SHA512C00, SHA512C01, SHA512C02, SHA512C03, + SHA512C04, SHA512C05, SHA512C06, SHA512C07, + SHA512C08, SHA512C09, SHA512C0a, SHA512C0b, + SHA512C0c, SHA512C0d, SHA512C0e, SHA512C0f, + SHA512C10, SHA512C11, SHA512C12, SHA512C13, + SHA512C14, SHA512C15, SHA512C16, SHA512C17, + SHA512C18, SHA512C19, SHA512C1a, SHA512C1b, + SHA512C1c, SHA512C1d, SHA512C1e, SHA512C1f, + SHA512C20, SHA512C21, SHA512C22, SHA512C23, + SHA512C24, SHA512C25, SHA512C26, SHA512C27, + SHA512C28, SHA512C29, SHA512C2a, SHA512C2b, + SHA512C2c, SHA512C2d, SHA512C2e, SHA512C2f, + SHA512C30, SHA512C31, SHA512C32, SHA512C33, + SHA512C34, SHA512C35, SHA512C36, SHA512C37, + SHA512C38, SHA512C39, SHA512C3a, SHA512C3b, + SHA512C3c, SHA512C3d, SHA512C3e, SHA512C3f, + SHA512C40, SHA512C41, SHA512C42, SHA512C43, + SHA512C44, SHA512C45, SHA512C46, SHA512C47, + SHA512C48, SHA512C49, SHA512C4a, SHA512C4b, + SHA512C4c, SHA512C4d, SHA512C4e, SHA512C4f, +}; + +static void sha512_transform (const u32x w0[4], const u32x w1[4], const u32x w2[4], const u32x w3[4], u64x digest[8]) +{ + u64x w0_t = hl32_to_64 (w0[0], w0[1]); + u64x w1_t = hl32_to_64 (w0[2], w0[3]); + u64x w2_t = hl32_to_64 (w1[0], w1[1]); + u64x w3_t = hl32_to_64 (w1[2], w1[3]); + u64x w4_t = hl32_to_64 (w2[0], w2[1]); + u64x w5_t = hl32_to_64 (w2[2], w2[3]); + u64x w6_t = hl32_to_64 (w3[0], w3[1]); + u64x w7_t = 0; + u64x w8_t = 0; + u64x w9_t = 0; + u64x wa_t = 0; + u64x wb_t = 0; + u64x wc_t = 0; + u64x wd_t = 0; + u64x we_t = 0; + u64x wf_t = hl32_to_64 (w3[2], w3[3]); + + u64x a = digest[0]; + u64x b = digest[1]; + u64x c = digest[2]; + u64x d = digest[3]; + u64x e = digest[4]; + u64x f = digest[5]; + u64x g = digest[6]; + u64x h = digest[7]; + + #define ROUND_EXPAND() \ + { \ + w0_t = SHA512_EXPAND (we_t, w9_t, w1_t, w0_t); \ + w1_t = SHA512_EXPAND (wf_t, wa_t, w2_t, w1_t); \ + w2_t = SHA512_EXPAND (w0_t, wb_t, w3_t, w2_t); \ + w3_t = SHA512_EXPAND (w1_t, wc_t, w4_t, w3_t); \ + w4_t = SHA512_EXPAND (w2_t, wd_t, w5_t, w4_t); \ + w5_t = SHA512_EXPAND (w3_t, we_t, w6_t, w5_t); \ + w6_t = SHA512_EXPAND (w4_t, wf_t, w7_t, w6_t); \ + w7_t = SHA512_EXPAND (w5_t, w0_t, w8_t, w7_t); \ + w8_t = SHA512_EXPAND (w6_t, w1_t, w9_t, w8_t); \ + w9_t = SHA512_EXPAND (w7_t, w2_t, wa_t, w9_t); \ + wa_t = SHA512_EXPAND (w8_t, w3_t, wb_t, wa_t); \ + wb_t = SHA512_EXPAND (w9_t, w4_t, wc_t, wb_t); \ + wc_t = SHA512_EXPAND (wa_t, w5_t, wd_t, wc_t); \ + wd_t = SHA512_EXPAND (wb_t, w6_t, we_t, wd_t); \ + we_t = SHA512_EXPAND (wc_t, w7_t, wf_t, we_t); \ + wf_t = SHA512_EXPAND (wd_t, w8_t, w0_t, wf_t); \ + } + + #define ROUND_STEP(i) \ + { \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, a, b, c, d, e, f, g, h, w0_t, k_sha512[i + 0]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, h, a, b, c, d, e, f, g, w1_t, k_sha512[i + 1]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, g, h, a, b, c, d, e, f, w2_t, k_sha512[i + 2]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, f, g, h, a, b, c, d, e, w3_t, k_sha512[i + 3]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, e, f, g, h, a, b, c, d, w4_t, k_sha512[i + 4]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, d, e, f, g, h, a, b, c, w5_t, k_sha512[i + 5]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, c, d, e, f, g, h, a, b, w6_t, k_sha512[i + 6]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, b, c, d, e, f, g, h, a, w7_t, k_sha512[i + 7]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, a, b, c, d, e, f, g, h, w8_t, k_sha512[i + 8]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, h, a, b, c, d, e, f, g, w9_t, k_sha512[i + 9]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, g, h, a, b, c, d, e, f, wa_t, k_sha512[i + 10]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, f, g, h, a, b, c, d, e, wb_t, k_sha512[i + 11]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, e, f, g, h, a, b, c, d, wc_t, k_sha512[i + 12]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, d, e, f, g, h, a, b, c, wd_t, k_sha512[i + 13]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, c, d, e, f, g, h, a, b, we_t, k_sha512[i + 14]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, b, c, d, e, f, g, h, a, wf_t, k_sha512[i + 15]); \ + } + + ROUND_STEP (0); + + #pragma unroll + for (int i = 16; i < 80; i += 16) + { + ROUND_EXPAND (); ROUND_STEP (i); + } + + /* rev + digest[0] += a; + digest[1] += b; + digest[2] += c; + digest[3] += d; + digest[4] += e; + digest[5] += f; + digest[6] += g; + digest[7] += h; + */ + + digest[0] = a; + digest[1] = b; + digest[2] = c; + digest[3] = d; + digest[4] = e; + digest[5] = f; + digest[6] = g; + digest[7] = h; +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m01740_m04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, combs_buf[0].pw_len); + } + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[7]; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = combs_buf[il_pos].pw_len; + + const u32 pw_len = pw_l_len + pw_r_len; + + u32 wordr0[4]; + u32 wordr1[4]; + u32 wordr2[4]; + u32 wordr3[4]; + + wordr0[0] = combs_buf[il_pos].i[0]; + wordr0[1] = combs_buf[il_pos].i[1]; + wordr0[2] = combs_buf[il_pos].i[2]; + wordr0[3] = combs_buf[il_pos].i[3]; + wordr1[0] = combs_buf[il_pos].i[4]; + wordr1[1] = combs_buf[il_pos].i[5]; + wordr1[2] = combs_buf[il_pos].i[6]; + wordr1[3] = combs_buf[il_pos].i[7]; + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + u32x w0[4]; + u32x w1[4]; + u32x w2[4]; + u32x w3[4]; + + w0[0] = wordl0[0] | wordr0[0]; + w0[1] = wordl0[1] | wordr0[1]; + w0[2] = wordl0[2] | wordr0[2]; + w0[3] = wordl0[3] | wordr0[3]; + w1[0] = wordl1[0] | wordr1[0]; + w1[1] = wordl1[1] | wordr1[1]; + w1[2] = wordl1[2] | wordr1[2]; + w1[3] = wordl1[3] | wordr1[3]; + w2[0] = wordl2[0] | wordr2[0]; + w2[1] = wordl2[1] | wordr2[1]; + w2[2] = wordl2[2] | wordr2[2]; + w2[3] = wordl2[3] | wordr2[3]; + w3[0] = wordl3[0] | wordr3[0]; + w3[1] = wordl3[1] | wordr3[1]; + w3[2] = wordl3[2] | wordr3[2]; + w3[3] = wordl3[3] | wordr3[3]; + + /** + * prepend salt + */ + + const u32 pw_salt_len = (pw_len * 2) + salt_len; + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + make_unicode (w0, w0_t, w1_t); + make_unicode (w1, w2_t, w3_t); + + switch_buffer_by_offset (w0_t, w1_t, w2_t, w3_t, salt_len); + + w0_t[0] |= salt_buf0[0]; + w0_t[1] |= salt_buf0[1]; + w0_t[2] |= salt_buf0[2]; + w0_t[3] |= salt_buf0[3]; + w1_t[0] |= salt_buf1[0]; + w1_t[1] |= salt_buf1[1]; + w1_t[2] |= salt_buf1[2]; + w1_t[3] |= salt_buf1[3]; + + append_0x80_4 (w0_t, w1_t, w2_t, w3_t, pw_salt_len); + + /** + * sha512 + */ + + w0_t[0] = swap_workaround (w0_t[0]); + w0_t[1] = swap_workaround (w0_t[1]); + w0_t[2] = swap_workaround (w0_t[2]); + w0_t[3] = swap_workaround (w0_t[3]); + w1_t[0] = swap_workaround (w1_t[0]); + w1_t[1] = swap_workaround (w1_t[1]); + w1_t[2] = swap_workaround (w1_t[2]); + w1_t[3] = swap_workaround (w1_t[3]); + w2_t[0] = swap_workaround (w2_t[0]); + w2_t[1] = swap_workaround (w2_t[1]); + w2_t[2] = swap_workaround (w2_t[2]); + w2_t[3] = swap_workaround (w2_t[3]); + w3_t[0] = swap_workaround (w3_t[0]); + w3_t[1] = swap_workaround (w3_t[1]); + w3_t[2] = 0; + w3_t[3] = pw_salt_len * 8; + + u64x digest[8]; + + digest[0] = SHA512M_A; + digest[1] = SHA512M_B; + digest[2] = SHA512M_C; + digest[3] = SHA512M_D; + digest[4] = SHA512M_E; + digest[5] = SHA512M_F; + digest[6] = SHA512M_G; + digest[7] = SHA512M_H; + + sha512_transform (w0_t, w1_t, w2_t, w3_t, digest); + + + const u32x r0 = l32_from_64 (digest[7]); + const u32x r1 = h32_from_64 (digest[7]); + const u32x r2 = l32_from_64 (digest[3]); + const u32x r3 = h32_from_64 (digest[3]); + + #include VECT_COMPARE_M + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m01740_m08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m01740_m16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m01740_s04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, combs_buf[0].pw_len); + } + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[7]; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = combs_buf[il_pos].pw_len; + + const u32 pw_len = pw_l_len + pw_r_len; + + u32 wordr0[4]; + u32 wordr1[4]; + u32 wordr2[4]; + u32 wordr3[4]; + + wordr0[0] = combs_buf[il_pos].i[0]; + wordr0[1] = combs_buf[il_pos].i[1]; + wordr0[2] = combs_buf[il_pos].i[2]; + wordr0[3] = combs_buf[il_pos].i[3]; + wordr1[0] = combs_buf[il_pos].i[4]; + wordr1[1] = combs_buf[il_pos].i[5]; + wordr1[2] = combs_buf[il_pos].i[6]; + wordr1[3] = combs_buf[il_pos].i[7]; + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + u32x w0[4]; + u32x w1[4]; + u32x w2[4]; + u32x w3[4]; + + w0[0] = wordl0[0] | wordr0[0]; + w0[1] = wordl0[1] | wordr0[1]; + w0[2] = wordl0[2] | wordr0[2]; + w0[3] = wordl0[3] | wordr0[3]; + w1[0] = wordl1[0] | wordr1[0]; + w1[1] = wordl1[1] | wordr1[1]; + w1[2] = wordl1[2] | wordr1[2]; + w1[3] = wordl1[3] | wordr1[3]; + w2[0] = wordl2[0] | wordr2[0]; + w2[1] = wordl2[1] | wordr2[1]; + w2[2] = wordl2[2] | wordr2[2]; + w2[3] = wordl2[3] | wordr2[3]; + w3[0] = wordl3[0] | wordr3[0]; + w3[1] = wordl3[1] | wordr3[1]; + w3[2] = wordl3[2] | wordr3[2]; + w3[3] = wordl3[3] | wordr3[3]; + + /** + * prepend salt + */ + + const u32 pw_salt_len = (pw_len * 2) + salt_len; + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + make_unicode (w0, w0_t, w1_t); + make_unicode (w1, w2_t, w3_t); + + switch_buffer_by_offset (w0_t, w1_t, w2_t, w3_t, salt_len); + + w0_t[0] |= salt_buf0[0]; + w0_t[1] |= salt_buf0[1]; + w0_t[2] |= salt_buf0[2]; + w0_t[3] |= salt_buf0[3]; + w1_t[0] |= salt_buf1[0]; + w1_t[1] |= salt_buf1[1]; + w1_t[2] |= salt_buf1[2]; + w1_t[3] |= salt_buf1[3]; + + append_0x80_4 (w0_t, w1_t, w2_t, w3_t, pw_salt_len); + + /** + * sha512 + */ + + w0_t[0] = swap_workaround (w0_t[0]); + w0_t[1] = swap_workaround (w0_t[1]); + w0_t[2] = swap_workaround (w0_t[2]); + w0_t[3] = swap_workaround (w0_t[3]); + w1_t[0] = swap_workaround (w1_t[0]); + w1_t[1] = swap_workaround (w1_t[1]); + w1_t[2] = swap_workaround (w1_t[2]); + w1_t[3] = swap_workaround (w1_t[3]); + w2_t[0] = swap_workaround (w2_t[0]); + w2_t[1] = swap_workaround (w2_t[1]); + w2_t[2] = swap_workaround (w2_t[2]); + w2_t[3] = swap_workaround (w2_t[3]); + w3_t[0] = swap_workaround (w3_t[0]); + w3_t[1] = swap_workaround (w3_t[1]); + w3_t[2] = 0; + w3_t[3] = pw_salt_len * 8; + + u64x digest[8]; + + digest[0] = SHA512M_A; + digest[1] = SHA512M_B; + digest[2] = SHA512M_C; + digest[3] = SHA512M_D; + digest[4] = SHA512M_E; + digest[5] = SHA512M_F; + digest[6] = SHA512M_G; + digest[7] = SHA512M_H; + + sha512_transform (w0_t, w1_t, w2_t, w3_t, digest); + + + const u32x r0 = l32_from_64 (digest[7]); + const u32x r1 = h32_from_64 (digest[7]); + const u32x r2 = l32_from_64 (digest[3]); + const u32x r3 = h32_from_64 (digest[3]); + + #include VECT_COMPARE_S + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m01740_s08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m01740_s16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/amd/m01740_a3.cl b/amd/m01740_a3.cl new file mode 100644 index 0000000000..5d5578b1de --- /dev/null +++ b/amd/m01740_a3.cl @@ -0,0 +1,752 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _SHA512_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW4 +#define VECT_SIZE1 +#endif + +#ifdef VLIW5 +#define VECT_SIZE1 +#endif + +#define DGST_R0 14 +#define DGST_R1 15 +#define DGST_R2 6 +#define DGST_R3 7 + +#include "include/kernel_functions.c" +#include "types_amd.c" +#include "common_amd.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +__constant u64 k_sha512[80] = +{ + SHA512C00, SHA512C01, SHA512C02, SHA512C03, + SHA512C04, SHA512C05, SHA512C06, SHA512C07, + SHA512C08, SHA512C09, SHA512C0a, SHA512C0b, + SHA512C0c, SHA512C0d, SHA512C0e, SHA512C0f, + SHA512C10, SHA512C11, SHA512C12, SHA512C13, + SHA512C14, SHA512C15, SHA512C16, SHA512C17, + SHA512C18, SHA512C19, SHA512C1a, SHA512C1b, + SHA512C1c, SHA512C1d, SHA512C1e, SHA512C1f, + SHA512C20, SHA512C21, SHA512C22, SHA512C23, + SHA512C24, SHA512C25, SHA512C26, SHA512C27, + SHA512C28, SHA512C29, SHA512C2a, SHA512C2b, + SHA512C2c, SHA512C2d, SHA512C2e, SHA512C2f, + SHA512C30, SHA512C31, SHA512C32, SHA512C33, + SHA512C34, SHA512C35, SHA512C36, SHA512C37, + SHA512C38, SHA512C39, SHA512C3a, SHA512C3b, + SHA512C3c, SHA512C3d, SHA512C3e, SHA512C3f, + SHA512C40, SHA512C41, SHA512C42, SHA512C43, + SHA512C44, SHA512C45, SHA512C46, SHA512C47, + SHA512C48, SHA512C49, SHA512C4a, SHA512C4b, + SHA512C4c, SHA512C4d, SHA512C4e, SHA512C4f, +}; + +static void sha512_transform (const u32x w0[4], const u32x w1[4], const u32x w2[4], const u32x w3[4], u64x digest[8]) +{ + u64x w0_t = hl32_to_64 (w0[0], w0[1]); + u64x w1_t = hl32_to_64 (w0[2], w0[3]); + u64x w2_t = hl32_to_64 (w1[0], w1[1]); + u64x w3_t = hl32_to_64 (w1[2], w1[3]); + u64x w4_t = hl32_to_64 (w2[0], w2[1]); + u64x w5_t = hl32_to_64 (w2[2], w2[3]); + u64x w6_t = hl32_to_64 (w3[0], w3[1]); + u64x w7_t = 0; + u64x w8_t = 0; + u64x w9_t = 0; + u64x wa_t = 0; + u64x wb_t = 0; + u64x wc_t = 0; + u64x wd_t = 0; + u64x we_t = 0; + u64x wf_t = hl32_to_64 (w3[2], w3[3]); + + u64x a = digest[0]; + u64x b = digest[1]; + u64x c = digest[2]; + u64x d = digest[3]; + u64x e = digest[4]; + u64x f = digest[5]; + u64x g = digest[6]; + u64x h = digest[7]; + + #define ROUND_EXPAND() \ + { \ + w0_t = SHA512_EXPAND (we_t, w9_t, w1_t, w0_t); \ + w1_t = SHA512_EXPAND (wf_t, wa_t, w2_t, w1_t); \ + w2_t = SHA512_EXPAND (w0_t, wb_t, w3_t, w2_t); \ + w3_t = SHA512_EXPAND (w1_t, wc_t, w4_t, w3_t); \ + w4_t = SHA512_EXPAND (w2_t, wd_t, w5_t, w4_t); \ + w5_t = SHA512_EXPAND (w3_t, we_t, w6_t, w5_t); \ + w6_t = SHA512_EXPAND (w4_t, wf_t, w7_t, w6_t); \ + w7_t = SHA512_EXPAND (w5_t, w0_t, w8_t, w7_t); \ + w8_t = SHA512_EXPAND (w6_t, w1_t, w9_t, w8_t); \ + w9_t = SHA512_EXPAND (w7_t, w2_t, wa_t, w9_t); \ + wa_t = SHA512_EXPAND (w8_t, w3_t, wb_t, wa_t); \ + wb_t = SHA512_EXPAND (w9_t, w4_t, wc_t, wb_t); \ + wc_t = SHA512_EXPAND (wa_t, w5_t, wd_t, wc_t); \ + wd_t = SHA512_EXPAND (wb_t, w6_t, we_t, wd_t); \ + we_t = SHA512_EXPAND (wc_t, w7_t, wf_t, we_t); \ + wf_t = SHA512_EXPAND (wd_t, w8_t, w0_t, wf_t); \ + } + + #define ROUND_STEP(i) \ + { \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, a, b, c, d, e, f, g, h, w0_t, k_sha512[i + 0]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, h, a, b, c, d, e, f, g, w1_t, k_sha512[i + 1]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, g, h, a, b, c, d, e, f, w2_t, k_sha512[i + 2]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, f, g, h, a, b, c, d, e, w3_t, k_sha512[i + 3]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, e, f, g, h, a, b, c, d, w4_t, k_sha512[i + 4]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, d, e, f, g, h, a, b, c, w5_t, k_sha512[i + 5]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, c, d, e, f, g, h, a, b, w6_t, k_sha512[i + 6]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, b, c, d, e, f, g, h, a, w7_t, k_sha512[i + 7]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, a, b, c, d, e, f, g, h, w8_t, k_sha512[i + 8]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, h, a, b, c, d, e, f, g, w9_t, k_sha512[i + 9]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, g, h, a, b, c, d, e, f, wa_t, k_sha512[i + 10]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, f, g, h, a, b, c, d, e, wb_t, k_sha512[i + 11]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, e, f, g, h, a, b, c, d, wc_t, k_sha512[i + 12]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, d, e, f, g, h, a, b, c, wd_t, k_sha512[i + 13]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, c, d, e, f, g, h, a, b, we_t, k_sha512[i + 14]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, b, c, d, e, f, g, h, a, wf_t, k_sha512[i + 15]); \ + } + + ROUND_STEP (0); + + #pragma unroll + for (int i = 16; i < 80; i += 16) + { + ROUND_EXPAND (); ROUND_STEP (i); + } + + /* rev + digest[0] += a; + digest[1] += b; + digest[2] += c; + digest[3] += d; + digest[4] += e; + digest[5] += f; + digest[6] += g; + digest[7] += h; + */ + + digest[0] = a; + digest[1] = b; + digest[2] = c; + digest[3] = d; + digest[4] = e; + digest[5] = f; + digest[6] = g; + digest[7] = h; +} + +static void m01740m (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], const u32 pw_len, __global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset) +{ + /** + * modifier + */ + + const u32 gid = get_global_id (0); + const u32 lid = get_local_id (0); + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[ 1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[ 2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[ 3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[ 4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[ 5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[ 6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[ 7]; + + u32 salt_buf2[4]; + + salt_buf2[0] = 0; + salt_buf2[1] = 0; + salt_buf2[2] = 0; + salt_buf2[3] = 0; + + u32 salt_buf3[4]; + + salt_buf3[0] = 0; + salt_buf3[1] = 0; + salt_buf3[2] = 0; + salt_buf3[3] = 0; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + const u32 pw_salt_len = pw_len + salt_len; + + /** + * loop + */ + + u32x w0l = w0[0]; + + for (u32 il_pos = 0; il_pos < bfs_cnt; il_pos++) + { + const u32 w0r = bfs_buf[il_pos].i; + + w0[0] = w0l | w0r; + + /** + * prepend salt + */ + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + w0_t[0] = swap_workaround (w0[0]); + w0_t[1] = swap_workaround (w0[1]); + w0_t[2] = swap_workaround (w0[2]); + w0_t[3] = swap_workaround (w0[3]); + w1_t[0] = swap_workaround (w1[0]); + w1_t[1] = swap_workaround (w1[1]); + w1_t[2] = swap_workaround (w1[2]); + w1_t[3] = swap_workaround (w1[3]); + w2_t[0] = swap_workaround (w2[0]); + w2_t[1] = swap_workaround (w2[1]); + w2_t[2] = swap_workaround (w2[2]); + w2_t[3] = swap_workaround (w2[3]); + w3_t[0] = swap_workaround (w3[0]); + w3_t[1] = swap_workaround (w3[1]); + w3_t[2] = swap_workaround (w3[2]); + w3_t[3] = swap_workaround (w3[3]); + + switch_buffer_by_offset (w0_t, w1_t, w2_t, w3_t, salt_len); + + w0_t[0] |= salt_buf0[0]; + w0_t[1] |= salt_buf0[1]; + w0_t[2] |= salt_buf0[2]; + w0_t[3] |= salt_buf0[3]; + w1_t[0] |= salt_buf1[0]; + w1_t[1] |= salt_buf1[1]; + w1_t[2] |= salt_buf1[2]; + w1_t[3] |= salt_buf1[3]; + w2_t[0] |= salt_buf2[0]; + w2_t[1] |= salt_buf2[1]; + w2_t[2] |= salt_buf2[2]; + w2_t[3] |= salt_buf2[3]; + w3_t[0] |= salt_buf3[0]; + w3_t[1] |= salt_buf3[1]; + w3_t[2] = 0; + w3_t[3] = pw_salt_len * 8; + + /** + * sha512 + */ + + w0_t[0] = swap_workaround (w0_t[0]); + w0_t[1] = swap_workaround (w0_t[1]); + w0_t[2] = swap_workaround (w0_t[2]); + w0_t[3] = swap_workaround (w0_t[3]); + w1_t[0] = swap_workaround (w1_t[0]); + w1_t[1] = swap_workaround (w1_t[1]); + w1_t[2] = swap_workaround (w1_t[2]); + w1_t[3] = swap_workaround (w1_t[3]); + w2_t[0] = swap_workaround (w2_t[0]); + w2_t[1] = swap_workaround (w2_t[1]); + w2_t[2] = swap_workaround (w2_t[2]); + w2_t[3] = swap_workaround (w2_t[3]); + w3_t[0] = swap_workaround (w3_t[0]); + w3_t[1] = swap_workaround (w3_t[1]); + //w3_t[2] = swap_workaround (w3_t[2]); + //w3_t[3] = swap_workaround (w3_t[3]); + + u64x digest[8]; + + digest[0] = SHA512M_A; + digest[1] = SHA512M_B; + digest[2] = SHA512M_C; + digest[3] = SHA512M_D; + digest[4] = SHA512M_E; + digest[5] = SHA512M_F; + digest[6] = SHA512M_G; + digest[7] = SHA512M_H; + + sha512_transform (w0_t, w1_t, w2_t, w3_t, digest); + + + const u32x r0 = l32_from_64 (digest[7]); + const u32x r1 = h32_from_64 (digest[7]); + const u32x r2 = l32_from_64 (digest[3]); + const u32x r3 = h32_from_64 (digest[3]); + + #include VECT_COMPARE_M + } +} + +static void m01740s (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], const u32 pw_len, __global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset) +{ + /** + * modifier + */ + + const u32 gid = get_global_id (0); + const u32 lid = get_local_id (0); + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[ 1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[ 2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[ 3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[ 4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[ 5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[ 6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[ 7]; + + u32 salt_buf2[4]; + + salt_buf2[0] = 0; + salt_buf2[1] = 0; + salt_buf2[2] = 0; + salt_buf2[3] = 0; + + u32 salt_buf3[4]; + + salt_buf3[0] = 0; + salt_buf3[1] = 0; + salt_buf3[2] = 0; + salt_buf3[3] = 0; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + const u32 pw_salt_len = pw_len + salt_len; + + /** + * loop + */ + + u32x w0l = w0[0]; + + for (u32 il_pos = 0; il_pos < bfs_cnt; il_pos++) + { + const u32 w0r = bfs_buf[il_pos].i; + + w0[0] = w0l | w0r; + + /** + * prepend salt + */ + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + w0_t[0] = swap_workaround (w0[0]); + w0_t[1] = swap_workaround (w0[1]); + w0_t[2] = swap_workaround (w0[2]); + w0_t[3] = swap_workaround (w0[3]); + w1_t[0] = swap_workaround (w1[0]); + w1_t[1] = swap_workaround (w1[1]); + w1_t[2] = swap_workaround (w1[2]); + w1_t[3] = swap_workaround (w1[3]); + w2_t[0] = swap_workaround (w2[0]); + w2_t[1] = swap_workaround (w2[1]); + w2_t[2] = swap_workaround (w2[2]); + w2_t[3] = swap_workaround (w2[3]); + w3_t[0] = swap_workaround (w3[0]); + w3_t[1] = swap_workaround (w3[1]); + w3_t[2] = swap_workaround (w3[2]); + w3_t[3] = swap_workaround (w3[3]); + + switch_buffer_by_offset (w0_t, w1_t, w2_t, w3_t, salt_len); + + w0_t[0] |= salt_buf0[0]; + w0_t[1] |= salt_buf0[1]; + w0_t[2] |= salt_buf0[2]; + w0_t[3] |= salt_buf0[3]; + w1_t[0] |= salt_buf1[0]; + w1_t[1] |= salt_buf1[1]; + w1_t[2] |= salt_buf1[2]; + w1_t[3] |= salt_buf1[3]; + w2_t[0] |= salt_buf2[0]; + w2_t[1] |= salt_buf2[1]; + w2_t[2] |= salt_buf2[2]; + w2_t[3] |= salt_buf2[3]; + w3_t[0] |= salt_buf3[0]; + w3_t[1] |= salt_buf3[1]; + w3_t[2] = 0; + w3_t[3] = pw_salt_len * 8; + + /** + * sha512 + */ + + w0_t[0] = swap_workaround (w0_t[0]); + w0_t[1] = swap_workaround (w0_t[1]); + w0_t[2] = swap_workaround (w0_t[2]); + w0_t[3] = swap_workaround (w0_t[3]); + w1_t[0] = swap_workaround (w1_t[0]); + w1_t[1] = swap_workaround (w1_t[1]); + w1_t[2] = swap_workaround (w1_t[2]); + w1_t[3] = swap_workaround (w1_t[3]); + w2_t[0] = swap_workaround (w2_t[0]); + w2_t[1] = swap_workaround (w2_t[1]); + w2_t[2] = swap_workaround (w2_t[2]); + w2_t[3] = swap_workaround (w2_t[3]); + w3_t[0] = swap_workaround (w3_t[0]); + w3_t[1] = swap_workaround (w3_t[1]); + //w3_t[2] = swap_workaround (w3_t[2]); + //w3_t[3] = swap_workaround (w3_t[3]); + + u64x digest[8]; + + digest[0] = SHA512M_A; + digest[1] = SHA512M_B; + digest[2] = SHA512M_C; + digest[3] = SHA512M_D; + digest[4] = SHA512M_E; + digest[5] = SHA512M_F; + digest[6] = SHA512M_G; + digest[7] = SHA512M_H; + + sha512_transform (w0_t, w1_t, w2_t, w3_t, digest); + + + const u32x r0 = l32_from_64 (digest[7]); + const u32x r1 = h32_from_64 (digest[7]); + const u32x r2 = l32_from_64 (digest[3]); + const u32x r3 = h32_from_64 (digest[3]); + + #include VECT_COMPARE_S + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m01740_m04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m01740m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m01740_m08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m01740m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m01740_m16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = pws[gid].i[ 8]; + w2[1] = pws[gid].i[ 9]; + w2[2] = pws[gid].i[10]; + w2[3] = pws[gid].i[11]; + + u32x w3[4]; + + w3[0] = pws[gid].i[12]; + w3[1] = pws[gid].i[13]; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m01740m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m01740_s04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m01740s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m01740_s08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m01740s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m01740_s16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = pws[gid].i[ 8]; + w2[1] = pws[gid].i[ 9]; + w2[2] = pws[gid].i[10]; + w2[3] = pws[gid].i[11]; + + u32x w3[4]; + + w3[0] = pws[gid].i[12]; + w3[1] = pws[gid].i[13]; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m01740s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} diff --git a/amd/m01750_a0.cl b/amd/m01750_a0.cl new file mode 100644 index 0000000000..e9d036d28e --- /dev/null +++ b/amd/m01750_a0.cl @@ -0,0 +1,625 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _SHA512_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW4 +#define VECT_SIZE1 +#endif + +#ifdef VLIW5 +#define VECT_SIZE1 +#endif + +#define DGST_R0 14 +#define DGST_R1 15 +#define DGST_R2 6 +#define DGST_R3 7 + +#include "include/kernel_functions.c" +#include "types_amd.c" +#include "common_amd.c" +#include "include/rp_gpu.h" +#include "rp_amd.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +__constant u64 k_sha512[80] = +{ + SHA512C00, SHA512C01, SHA512C02, SHA512C03, + SHA512C04, SHA512C05, SHA512C06, SHA512C07, + SHA512C08, SHA512C09, SHA512C0a, SHA512C0b, + SHA512C0c, SHA512C0d, SHA512C0e, SHA512C0f, + SHA512C10, SHA512C11, SHA512C12, SHA512C13, + SHA512C14, SHA512C15, SHA512C16, SHA512C17, + SHA512C18, SHA512C19, SHA512C1a, SHA512C1b, + SHA512C1c, SHA512C1d, SHA512C1e, SHA512C1f, + SHA512C20, SHA512C21, SHA512C22, SHA512C23, + SHA512C24, SHA512C25, SHA512C26, SHA512C27, + SHA512C28, SHA512C29, SHA512C2a, SHA512C2b, + SHA512C2c, SHA512C2d, SHA512C2e, SHA512C2f, + SHA512C30, SHA512C31, SHA512C32, SHA512C33, + SHA512C34, SHA512C35, SHA512C36, SHA512C37, + SHA512C38, SHA512C39, SHA512C3a, SHA512C3b, + SHA512C3c, SHA512C3d, SHA512C3e, SHA512C3f, + SHA512C40, SHA512C41, SHA512C42, SHA512C43, + SHA512C44, SHA512C45, SHA512C46, SHA512C47, + SHA512C48, SHA512C49, SHA512C4a, SHA512C4b, + SHA512C4c, SHA512C4d, SHA512C4e, SHA512C4f, +}; + +static void sha512_transform (const u64x w0[4], const u64x w1[4], const u64x w2[4], const u64x w3[4], u64x digest[8]) +{ + u64x w0_t = w0[0]; + u64x w1_t = w0[1]; + u64x w2_t = w0[2]; + u64x w3_t = w0[3]; + u64x w4_t = w1[0]; + u64x w5_t = w1[1]; + u64x w6_t = w1[2]; + u64x w7_t = w1[3]; + u64x w8_t = w2[0]; + u64x w9_t = w2[1]; + u64x wa_t = w2[2]; + u64x wb_t = w2[3]; + u64x wc_t = w3[0]; + u64x wd_t = w3[1]; + u64x we_t = w3[2]; + u64x wf_t = w3[3]; + + u64x a = digest[0]; + u64x b = digest[1]; + u64x c = digest[2]; + u64x d = digest[3]; + u64x e = digest[4]; + u64x f = digest[5]; + u64x g = digest[6]; + u64x h = digest[7]; + + #define ROUND_EXPAND() \ + { \ + w0_t = SHA512_EXPAND (we_t, w9_t, w1_t, w0_t); \ + w1_t = SHA512_EXPAND (wf_t, wa_t, w2_t, w1_t); \ + w2_t = SHA512_EXPAND (w0_t, wb_t, w3_t, w2_t); \ + w3_t = SHA512_EXPAND (w1_t, wc_t, w4_t, w3_t); \ + w4_t = SHA512_EXPAND (w2_t, wd_t, w5_t, w4_t); \ + w5_t = SHA512_EXPAND (w3_t, we_t, w6_t, w5_t); \ + w6_t = SHA512_EXPAND (w4_t, wf_t, w7_t, w6_t); \ + w7_t = SHA512_EXPAND (w5_t, w0_t, w8_t, w7_t); \ + w8_t = SHA512_EXPAND (w6_t, w1_t, w9_t, w8_t); \ + w9_t = SHA512_EXPAND (w7_t, w2_t, wa_t, w9_t); \ + wa_t = SHA512_EXPAND (w8_t, w3_t, wb_t, wa_t); \ + wb_t = SHA512_EXPAND (w9_t, w4_t, wc_t, wb_t); \ + wc_t = SHA512_EXPAND (wa_t, w5_t, wd_t, wc_t); \ + wd_t = SHA512_EXPAND (wb_t, w6_t, we_t, wd_t); \ + we_t = SHA512_EXPAND (wc_t, w7_t, wf_t, we_t); \ + wf_t = SHA512_EXPAND (wd_t, w8_t, w0_t, wf_t); \ + } + + #define ROUND_STEP(i) \ + { \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, a, b, c, d, e, f, g, h, w0_t, k_sha512[i + 0]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, h, a, b, c, d, e, f, g, w1_t, k_sha512[i + 1]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, g, h, a, b, c, d, e, f, w2_t, k_sha512[i + 2]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, f, g, h, a, b, c, d, e, w3_t, k_sha512[i + 3]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, e, f, g, h, a, b, c, d, w4_t, k_sha512[i + 4]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, d, e, f, g, h, a, b, c, w5_t, k_sha512[i + 5]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, c, d, e, f, g, h, a, b, w6_t, k_sha512[i + 6]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, b, c, d, e, f, g, h, a, w7_t, k_sha512[i + 7]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, a, b, c, d, e, f, g, h, w8_t, k_sha512[i + 8]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, h, a, b, c, d, e, f, g, w9_t, k_sha512[i + 9]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, g, h, a, b, c, d, e, f, wa_t, k_sha512[i + 10]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, f, g, h, a, b, c, d, e, wb_t, k_sha512[i + 11]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, e, f, g, h, a, b, c, d, wc_t, k_sha512[i + 12]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, d, e, f, g, h, a, b, c, wd_t, k_sha512[i + 13]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, c, d, e, f, g, h, a, b, we_t, k_sha512[i + 14]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, b, c, d, e, f, g, h, a, wf_t, k_sha512[i + 15]); \ + } + + ROUND_STEP (0); + + //#pragma unroll // kernel fails if used + for (int i = 16; i < 80; i += 16) + { + ROUND_EXPAND (); ROUND_STEP (i); + } + + digest[0] += a; + digest[1] += b; + digest[2] += c; + digest[3] += d; + digest[4] += e; + digest[5] += f; + digest[6] += g; + digest[7] += h; +} + +static void hmac_sha512_pad (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], u64x ipad[8], u64x opad[8]) +{ + u64x w0_t[4]; + u64x w1_t[4]; + u64x w2_t[4]; + u64x w3_t[4]; + + w0_t[0] = hl32_to_64 (w0[0], w0[1]) ^ 0x3636363636363636; + w0_t[1] = hl32_to_64 (w0[2], w0[3]) ^ 0x3636363636363636; + w0_t[2] = hl32_to_64 (w1[0], w1[1]) ^ 0x3636363636363636; + w0_t[3] = hl32_to_64 (w1[2], w1[3]) ^ 0x3636363636363636; + w1_t[0] = hl32_to_64 (w2[0], w2[1]) ^ 0x3636363636363636; + w1_t[1] = hl32_to_64 (w2[2], w2[3]) ^ 0x3636363636363636; + w1_t[2] = hl32_to_64 (w3[0], w3[1]) ^ 0x3636363636363636; + w1_t[3] = hl32_to_64 (w3[2], w3[3]) ^ 0x3636363636363636; + w2_t[0] = 0 ^ 0x3636363636363636; + w2_t[1] = 0 ^ 0x3636363636363636; + w2_t[2] = 0 ^ 0x3636363636363636; + w2_t[3] = 0 ^ 0x3636363636363636; + w3_t[0] = 0 ^ 0x3636363636363636; + w3_t[1] = 0 ^ 0x3636363636363636; + w3_t[2] = 0 ^ 0x3636363636363636; + w3_t[3] = 0 ^ 0x3636363636363636; + + ipad[0] = SHA512M_A; + ipad[1] = SHA512M_B; + ipad[2] = SHA512M_C; + ipad[3] = SHA512M_D; + ipad[4] = SHA512M_E; + ipad[5] = SHA512M_F; + ipad[6] = SHA512M_G; + ipad[7] = SHA512M_H; + + sha512_transform (w0_t, w1_t, w2_t, w3_t, ipad); + + w0_t[0] = hl32_to_64 (w0[0], w0[1]) ^ 0x5c5c5c5c5c5c5c5c; + w0_t[1] = hl32_to_64 (w0[2], w0[3]) ^ 0x5c5c5c5c5c5c5c5c; + w0_t[2] = hl32_to_64 (w1[0], w1[1]) ^ 0x5c5c5c5c5c5c5c5c; + w0_t[3] = hl32_to_64 (w1[2], w1[3]) ^ 0x5c5c5c5c5c5c5c5c; + w1_t[0] = hl32_to_64 (w2[0], w2[1]) ^ 0x5c5c5c5c5c5c5c5c; + w1_t[1] = hl32_to_64 (w2[2], w2[3]) ^ 0x5c5c5c5c5c5c5c5c; + w1_t[2] = hl32_to_64 (w3[0], w3[1]) ^ 0x5c5c5c5c5c5c5c5c; + w1_t[3] = hl32_to_64 (w3[2], w3[3]) ^ 0x5c5c5c5c5c5c5c5c; + w2_t[0] = 0 ^ 0x5c5c5c5c5c5c5c5c; + w2_t[1] = 0 ^ 0x5c5c5c5c5c5c5c5c; + w2_t[2] = 0 ^ 0x5c5c5c5c5c5c5c5c; + w2_t[3] = 0 ^ 0x5c5c5c5c5c5c5c5c; + w3_t[0] = 0 ^ 0x5c5c5c5c5c5c5c5c; + w3_t[1] = 0 ^ 0x5c5c5c5c5c5c5c5c; + w3_t[2] = 0 ^ 0x5c5c5c5c5c5c5c5c; + w3_t[3] = 0 ^ 0x5c5c5c5c5c5c5c5c; + + opad[0] = SHA512M_A; + opad[1] = SHA512M_B; + opad[2] = SHA512M_C; + opad[3] = SHA512M_D; + opad[4] = SHA512M_E; + opad[5] = SHA512M_F; + opad[6] = SHA512M_G; + opad[7] = SHA512M_H; + + sha512_transform (w0_t, w1_t, w2_t, w3_t, opad); +} + +static void hmac_sha512_run (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], u64x ipad[8], u64x opad[8], u64x digest[8]) +{ + u64x w0_t[4]; + u64x w1_t[4]; + u64x w2_t[4]; + u64x w3_t[4]; + + w0_t[0] = hl32_to_64 (w0[0], w0[1]); + w0_t[1] = hl32_to_64 (w0[2], w0[3]); + w0_t[2] = hl32_to_64 (w1[0], w1[1]); + w0_t[3] = hl32_to_64 (w1[2], w1[3]); + w1_t[0] = hl32_to_64 (w2[0], w2[1]); + w1_t[1] = hl32_to_64 (w2[2], w2[3]); + w1_t[2] = hl32_to_64 (w3[0], w3[1]); + w1_t[3] = 0; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = hl32_to_64 (w3[2], w3[3]); + + digest[0] = ipad[0]; + digest[1] = ipad[1]; + digest[2] = ipad[2]; + digest[3] = ipad[3]; + digest[4] = ipad[4]; + digest[5] = ipad[5]; + digest[6] = ipad[6]; + digest[7] = ipad[7]; + + sha512_transform (w0_t, w1_t, w2_t, w3_t, digest); + + w0_t[0] = digest[0]; + w0_t[1] = digest[1]; + w0_t[2] = digest[2]; + w0_t[3] = digest[3]; + w1_t[0] = digest[4]; + w1_t[1] = digest[5]; + w1_t[2] = digest[6]; + w1_t[3] = digest[7]; + w2_t[0] = 0x8000000000000000; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = (128 + 64) * 8; + + digest[0] = opad[0]; + digest[1] = opad[1]; + digest[2] = opad[2]; + digest[3] = opad[3]; + digest[4] = opad[4]; + digest[5] = opad[5]; + digest[6] = opad[6]; + digest[7] = opad[7]; + + sha512_transform (w0_t, w1_t, w2_t, w3_t, digest); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m01750_m04 (__global pw_t *pws, __global gpu_rule_t * rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + u32x pw_buf1[4]; + + pw_buf1[0] = pws[gid].i[ 4]; + pw_buf1[1] = pws[gid].i[ 5]; + pw_buf1[2] = pws[gid].i[ 6]; + pw_buf1[3] = pws[gid].i[ 7]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[ 1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[ 2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[ 3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[ 4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[ 5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[ 6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[ 7]; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + + w0[0] = pw_buf0[0]; + w0[1] = pw_buf0[1]; + w0[2] = pw_buf0[2]; + w0[3] = pw_buf0[3]; + + u32x w1[4]; + + w1[0] = pw_buf1[0]; + w1[1] = pw_buf1[1]; + w1[2] = pw_buf1[2]; + w1[3] = pw_buf1[3]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 out_len = apply_rules (rules_buf[il_pos].cmds, w0, w1, pw_len); + + /** + * pads + */ + + u32x w0_t[4]; + + w0_t[0] = swap_workaround (w0[0]); + w0_t[1] = swap_workaround (w0[1]); + w0_t[2] = swap_workaround (w0[2]); + w0_t[3] = swap_workaround (w0[3]); + + u32x w1_t[4]; + + w1_t[0] = swap_workaround (w1[0]); + w1_t[1] = swap_workaround (w1[1]); + w1_t[2] = swap_workaround (w1[2]); + w1_t[3] = swap_workaround (w1[3]); + + u32x w2_t[4]; + + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + + u32x w3_t[4]; + + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = 0; + + u64x ipad[8]; + u64x opad[8]; + + hmac_sha512_pad (w0_t, w1_t, w2_t, w3_t, ipad, opad); + + w0_t[0] = swap_workaround (salt_buf0[0]); + w0_t[1] = swap_workaround (salt_buf0[1]); + w0_t[2] = swap_workaround (salt_buf0[2]); + w0_t[3] = swap_workaround (salt_buf0[3]); + w1_t[0] = swap_workaround (salt_buf1[0]); + w1_t[1] = swap_workaround (salt_buf1[1]); + w1_t[2] = swap_workaround (salt_buf1[2]); + w1_t[3] = swap_workaround (salt_buf1[3]); + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = (128 + salt_len) * 8; + + u64x digest[8]; + + hmac_sha512_run (w0_t, w1_t, w2_t, w3_t, ipad, opad, digest); + + + const u32x r0 = l32_from_64 (digest[7]); + const u32x r1 = h32_from_64 (digest[7]); + const u32x r2 = l32_from_64 (digest[3]); + const u32x r3 = h32_from_64 (digest[3]); + + #include VECT_COMPARE_M + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m01750_m08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m01750_m16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m01750_s04 (__global pw_t *pws, __global gpu_rule_t * rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + u32x pw_buf1[4]; + + pw_buf1[0] = pws[gid].i[ 4]; + pw_buf1[1] = pws[gid].i[ 5]; + pw_buf1[2] = pws[gid].i[ 6]; + pw_buf1[3] = pws[gid].i[ 7]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[ 1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[ 2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[ 3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[ 4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[ 5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[ 6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[ 7]; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + + w0[0] = pw_buf0[0]; + w0[1] = pw_buf0[1]; + w0[2] = pw_buf0[2]; + w0[3] = pw_buf0[3]; + + u32x w1[4]; + + w1[0] = pw_buf1[0]; + w1[1] = pw_buf1[1]; + w1[2] = pw_buf1[2]; + w1[3] = pw_buf1[3]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 out_len = apply_rules (rules_buf[il_pos].cmds, w0, w1, pw_len); + + /** + * pads + */ + + u32x w0_t[4]; + + w0_t[0] = swap_workaround (w0[0]); + w0_t[1] = swap_workaround (w0[1]); + w0_t[2] = swap_workaround (w0[2]); + w0_t[3] = swap_workaround (w0[3]); + + u32x w1_t[4]; + + w1_t[0] = swap_workaround (w1[0]); + w1_t[1] = swap_workaround (w1[1]); + w1_t[2] = swap_workaround (w1[2]); + w1_t[3] = swap_workaround (w1[3]); + + u32x w2_t[4]; + + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + + u32x w3_t[4]; + + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = 0; + + u64x ipad[8]; + u64x opad[8]; + + hmac_sha512_pad (w0_t, w1_t, w2_t, w3_t, ipad, opad); + + w0_t[0] = swap_workaround (salt_buf0[0]); + w0_t[1] = swap_workaround (salt_buf0[1]); + w0_t[2] = swap_workaround (salt_buf0[2]); + w0_t[3] = swap_workaround (salt_buf0[3]); + w1_t[0] = swap_workaround (salt_buf1[0]); + w1_t[1] = swap_workaround (salt_buf1[1]); + w1_t[2] = swap_workaround (salt_buf1[2]); + w1_t[3] = swap_workaround (salt_buf1[3]); + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = (128 + salt_len) * 8; + + u64x digest[8]; + + hmac_sha512_run (w0_t, w1_t, w2_t, w3_t, ipad, opad, digest); + + + const u32x r0 = l32_from_64 (digest[7]); + const u32x r1 = h32_from_64 (digest[7]); + const u32x r2 = l32_from_64 (digest[3]); + const u32x r3 = h32_from_64 (digest[3]); + + #include VECT_COMPARE_S + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m01750_s08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m01750_s16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/amd/m01750_a1.cl b/amd/m01750_a1.cl new file mode 100644 index 0000000000..918c882da6 --- /dev/null +++ b/amd/m01750_a1.cl @@ -0,0 +1,731 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _SHA512_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW4 +#define VECT_SIZE1 +#endif + +#ifdef VLIW5 +#define VECT_SIZE1 +#endif + +#define DGST_R0 14 +#define DGST_R1 15 +#define DGST_R2 6 +#define DGST_R3 7 + +#include "include/kernel_functions.c" +#include "types_amd.c" +#include "common_amd.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +__constant u64 k_sha512[80] = +{ + SHA512C00, SHA512C01, SHA512C02, SHA512C03, + SHA512C04, SHA512C05, SHA512C06, SHA512C07, + SHA512C08, SHA512C09, SHA512C0a, SHA512C0b, + SHA512C0c, SHA512C0d, SHA512C0e, SHA512C0f, + SHA512C10, SHA512C11, SHA512C12, SHA512C13, + SHA512C14, SHA512C15, SHA512C16, SHA512C17, + SHA512C18, SHA512C19, SHA512C1a, SHA512C1b, + SHA512C1c, SHA512C1d, SHA512C1e, SHA512C1f, + SHA512C20, SHA512C21, SHA512C22, SHA512C23, + SHA512C24, SHA512C25, SHA512C26, SHA512C27, + SHA512C28, SHA512C29, SHA512C2a, SHA512C2b, + SHA512C2c, SHA512C2d, SHA512C2e, SHA512C2f, + SHA512C30, SHA512C31, SHA512C32, SHA512C33, + SHA512C34, SHA512C35, SHA512C36, SHA512C37, + SHA512C38, SHA512C39, SHA512C3a, SHA512C3b, + SHA512C3c, SHA512C3d, SHA512C3e, SHA512C3f, + SHA512C40, SHA512C41, SHA512C42, SHA512C43, + SHA512C44, SHA512C45, SHA512C46, SHA512C47, + SHA512C48, SHA512C49, SHA512C4a, SHA512C4b, + SHA512C4c, SHA512C4d, SHA512C4e, SHA512C4f, +}; + +static void sha512_transform (const u64x w0[4], const u64x w1[4], const u64x w2[4], const u64x w3[4], u64x digest[8]) +{ + u64x w0_t = w0[0]; + u64x w1_t = w0[1]; + u64x w2_t = w0[2]; + u64x w3_t = w0[3]; + u64x w4_t = w1[0]; + u64x w5_t = w1[1]; + u64x w6_t = w1[2]; + u64x w7_t = w1[3]; + u64x w8_t = w2[0]; + u64x w9_t = w2[1]; + u64x wa_t = w2[2]; + u64x wb_t = w2[3]; + u64x wc_t = w3[0]; + u64x wd_t = w3[1]; + u64x we_t = w3[2]; + u64x wf_t = w3[3]; + + u64x a = digest[0]; + u64x b = digest[1]; + u64x c = digest[2]; + u64x d = digest[3]; + u64x e = digest[4]; + u64x f = digest[5]; + u64x g = digest[6]; + u64x h = digest[7]; + + #define ROUND_EXPAND() \ + { \ + w0_t = SHA512_EXPAND (we_t, w9_t, w1_t, w0_t); \ + w1_t = SHA512_EXPAND (wf_t, wa_t, w2_t, w1_t); \ + w2_t = SHA512_EXPAND (w0_t, wb_t, w3_t, w2_t); \ + w3_t = SHA512_EXPAND (w1_t, wc_t, w4_t, w3_t); \ + w4_t = SHA512_EXPAND (w2_t, wd_t, w5_t, w4_t); \ + w5_t = SHA512_EXPAND (w3_t, we_t, w6_t, w5_t); \ + w6_t = SHA512_EXPAND (w4_t, wf_t, w7_t, w6_t); \ + w7_t = SHA512_EXPAND (w5_t, w0_t, w8_t, w7_t); \ + w8_t = SHA512_EXPAND (w6_t, w1_t, w9_t, w8_t); \ + w9_t = SHA512_EXPAND (w7_t, w2_t, wa_t, w9_t); \ + wa_t = SHA512_EXPAND (w8_t, w3_t, wb_t, wa_t); \ + wb_t = SHA512_EXPAND (w9_t, w4_t, wc_t, wb_t); \ + wc_t = SHA512_EXPAND (wa_t, w5_t, wd_t, wc_t); \ + wd_t = SHA512_EXPAND (wb_t, w6_t, we_t, wd_t); \ + we_t = SHA512_EXPAND (wc_t, w7_t, wf_t, we_t); \ + wf_t = SHA512_EXPAND (wd_t, w8_t, w0_t, wf_t); \ + } + + #define ROUND_STEP(i) \ + { \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, a, b, c, d, e, f, g, h, w0_t, k_sha512[i + 0]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, h, a, b, c, d, e, f, g, w1_t, k_sha512[i + 1]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, g, h, a, b, c, d, e, f, w2_t, k_sha512[i + 2]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, f, g, h, a, b, c, d, e, w3_t, k_sha512[i + 3]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, e, f, g, h, a, b, c, d, w4_t, k_sha512[i + 4]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, d, e, f, g, h, a, b, c, w5_t, k_sha512[i + 5]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, c, d, e, f, g, h, a, b, w6_t, k_sha512[i + 6]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, b, c, d, e, f, g, h, a, w7_t, k_sha512[i + 7]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, a, b, c, d, e, f, g, h, w8_t, k_sha512[i + 8]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, h, a, b, c, d, e, f, g, w9_t, k_sha512[i + 9]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, g, h, a, b, c, d, e, f, wa_t, k_sha512[i + 10]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, f, g, h, a, b, c, d, e, wb_t, k_sha512[i + 11]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, e, f, g, h, a, b, c, d, wc_t, k_sha512[i + 12]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, d, e, f, g, h, a, b, c, wd_t, k_sha512[i + 13]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, c, d, e, f, g, h, a, b, we_t, k_sha512[i + 14]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, b, c, d, e, f, g, h, a, wf_t, k_sha512[i + 15]); \ + } + + ROUND_STEP (0); + + //#pragma unroll // kernel fails if used + for (int i = 16; i < 80; i += 16) + { + ROUND_EXPAND (); ROUND_STEP (i); + } + + digest[0] += a; + digest[1] += b; + digest[2] += c; + digest[3] += d; + digest[4] += e; + digest[5] += f; + digest[6] += g; + digest[7] += h; +} + +static void hmac_sha512_pad (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], u64x ipad[8], u64x opad[8]) +{ + u64x w0_t[4]; + u64x w1_t[4]; + u64x w2_t[4]; + u64x w3_t[4]; + + w0_t[0] = hl32_to_64 (w0[0], w0[1]) ^ 0x3636363636363636; + w0_t[1] = hl32_to_64 (w0[2], w0[3]) ^ 0x3636363636363636; + w0_t[2] = hl32_to_64 (w1[0], w1[1]) ^ 0x3636363636363636; + w0_t[3] = hl32_to_64 (w1[2], w1[3]) ^ 0x3636363636363636; + w1_t[0] = hl32_to_64 (w2[0], w2[1]) ^ 0x3636363636363636; + w1_t[1] = hl32_to_64 (w2[2], w2[3]) ^ 0x3636363636363636; + w1_t[2] = hl32_to_64 (w3[0], w3[1]) ^ 0x3636363636363636; + w1_t[3] = hl32_to_64 (w3[2], w3[3]) ^ 0x3636363636363636; + w2_t[0] = 0 ^ 0x3636363636363636; + w2_t[1] = 0 ^ 0x3636363636363636; + w2_t[2] = 0 ^ 0x3636363636363636; + w2_t[3] = 0 ^ 0x3636363636363636; + w3_t[0] = 0 ^ 0x3636363636363636; + w3_t[1] = 0 ^ 0x3636363636363636; + w3_t[2] = 0 ^ 0x3636363636363636; + w3_t[3] = 0 ^ 0x3636363636363636; + + ipad[0] = SHA512M_A; + ipad[1] = SHA512M_B; + ipad[2] = SHA512M_C; + ipad[3] = SHA512M_D; + ipad[4] = SHA512M_E; + ipad[5] = SHA512M_F; + ipad[6] = SHA512M_G; + ipad[7] = SHA512M_H; + + sha512_transform (w0_t, w1_t, w2_t, w3_t, ipad); + + w0_t[0] = hl32_to_64 (w0[0], w0[1]) ^ 0x5c5c5c5c5c5c5c5c; + w0_t[1] = hl32_to_64 (w0[2], w0[3]) ^ 0x5c5c5c5c5c5c5c5c; + w0_t[2] = hl32_to_64 (w1[0], w1[1]) ^ 0x5c5c5c5c5c5c5c5c; + w0_t[3] = hl32_to_64 (w1[2], w1[3]) ^ 0x5c5c5c5c5c5c5c5c; + w1_t[0] = hl32_to_64 (w2[0], w2[1]) ^ 0x5c5c5c5c5c5c5c5c; + w1_t[1] = hl32_to_64 (w2[2], w2[3]) ^ 0x5c5c5c5c5c5c5c5c; + w1_t[2] = hl32_to_64 (w3[0], w3[1]) ^ 0x5c5c5c5c5c5c5c5c; + w1_t[3] = hl32_to_64 (w3[2], w3[3]) ^ 0x5c5c5c5c5c5c5c5c; + w2_t[0] = 0 ^ 0x5c5c5c5c5c5c5c5c; + w2_t[1] = 0 ^ 0x5c5c5c5c5c5c5c5c; + w2_t[2] = 0 ^ 0x5c5c5c5c5c5c5c5c; + w2_t[3] = 0 ^ 0x5c5c5c5c5c5c5c5c; + w3_t[0] = 0 ^ 0x5c5c5c5c5c5c5c5c; + w3_t[1] = 0 ^ 0x5c5c5c5c5c5c5c5c; + w3_t[2] = 0 ^ 0x5c5c5c5c5c5c5c5c; + w3_t[3] = 0 ^ 0x5c5c5c5c5c5c5c5c; + + opad[0] = SHA512M_A; + opad[1] = SHA512M_B; + opad[2] = SHA512M_C; + opad[3] = SHA512M_D; + opad[4] = SHA512M_E; + opad[5] = SHA512M_F; + opad[6] = SHA512M_G; + opad[7] = SHA512M_H; + + sha512_transform (w0_t, w1_t, w2_t, w3_t, opad); +} + +static void hmac_sha512_run (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], u64x ipad[8], u64x opad[8], u64x digest[8]) +{ + u64x w0_t[4]; + u64x w1_t[4]; + u64x w2_t[4]; + u64x w3_t[4]; + + w0_t[0] = hl32_to_64 (w0[0], w0[1]); + w0_t[1] = hl32_to_64 (w0[2], w0[3]); + w0_t[2] = hl32_to_64 (w1[0], w1[1]); + w0_t[3] = hl32_to_64 (w1[2], w1[3]); + w1_t[0] = hl32_to_64 (w2[0], w2[1]); + w1_t[1] = hl32_to_64 (w2[2], w2[3]); + w1_t[2] = hl32_to_64 (w3[0], w3[1]); + w1_t[3] = 0; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = hl32_to_64 (w3[2], w3[3]); + + digest[0] = ipad[0]; + digest[1] = ipad[1]; + digest[2] = ipad[2]; + digest[3] = ipad[3]; + digest[4] = ipad[4]; + digest[5] = ipad[5]; + digest[6] = ipad[6]; + digest[7] = ipad[7]; + + sha512_transform (w0_t, w1_t, w2_t, w3_t, digest); + + w0_t[0] = digest[0]; + w0_t[1] = digest[1]; + w0_t[2] = digest[2]; + w0_t[3] = digest[3]; + w1_t[0] = digest[4]; + w1_t[1] = digest[5]; + w1_t[2] = digest[6]; + w1_t[3] = digest[7]; + w2_t[0] = 0x8000000000000000; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = (128 + 64) * 8; + + digest[0] = opad[0]; + digest[1] = opad[1]; + digest[2] = opad[2]; + digest[3] = opad[3]; + digest[4] = opad[4]; + digest[5] = opad[5]; + digest[6] = opad[6]; + digest[7] = opad[7]; + + sha512_transform (w0_t, w1_t, w2_t, w3_t, digest); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m01750_m04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, combs_buf[0].pw_len); + } + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[ 1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[ 2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[ 3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[ 4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[ 5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[ 6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[ 7]; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = combs_buf[il_pos].pw_len; + + const u32 pw_len = pw_l_len + pw_r_len; + + u32 wordr0[4]; + + wordr0[0] = combs_buf[il_pos].i[0]; + wordr0[1] = combs_buf[il_pos].i[1]; + wordr0[2] = combs_buf[il_pos].i[2]; + wordr0[3] = combs_buf[il_pos].i[3]; + + u32 wordr1[4]; + + wordr1[0] = combs_buf[il_pos].i[4]; + wordr1[1] = combs_buf[il_pos].i[5]; + wordr1[2] = combs_buf[il_pos].i[6]; + wordr1[3] = combs_buf[il_pos].i[7]; + + u32 wordr2[4]; + + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + + u32 wordr3[4]; + + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + u32x w0[4]; + + w0[0] = wordl0[0] | wordr0[0]; + w0[1] = wordl0[1] | wordr0[1]; + w0[2] = wordl0[2] | wordr0[2]; + w0[3] = wordl0[3] | wordr0[3]; + + u32x w1[4]; + + w1[0] = wordl1[0] | wordr1[0]; + w1[1] = wordl1[1] | wordr1[1]; + w1[2] = wordl1[2] | wordr1[2]; + w1[3] = wordl1[3] | wordr1[3]; + + u32x w2[4]; + + w2[0] = wordl2[0] | wordr2[0]; + w2[1] = wordl2[1] | wordr2[1]; + w2[2] = wordl2[2] | wordr2[2]; + w2[3] = wordl2[3] | wordr2[3]; + + u32x w3[4]; + + w3[0] = wordl3[0] | wordr3[0]; + w3[1] = wordl3[1] | wordr3[1]; + w3[2] = wordl3[2] | wordr3[2]; + w3[3] = wordl3[3] | wordr3[3]; + + /** + * pads + */ + + u32x w0_t[4]; + + w0_t[0] = swap_workaround (w0[0]); + w0_t[1] = swap_workaround (w0[1]); + w0_t[2] = swap_workaround (w0[2]); + w0_t[3] = swap_workaround (w0[3]); + + u32x w1_t[4]; + + w1_t[0] = swap_workaround (w1[0]); + w1_t[1] = swap_workaround (w1[1]); + w1_t[2] = swap_workaround (w1[2]); + w1_t[3] = swap_workaround (w1[3]); + + u32x w2_t[4]; + + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + + u32x w3_t[4]; + + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = 0; + + u64x ipad[8]; + u64x opad[8]; + + hmac_sha512_pad (w0_t, w1_t, w2_t, w3_t, ipad, opad); + + w0_t[0] = swap_workaround (salt_buf0[0]); + w0_t[1] = swap_workaround (salt_buf0[1]); + w0_t[2] = swap_workaround (salt_buf0[2]); + w0_t[3] = swap_workaround (salt_buf0[3]); + w1_t[0] = swap_workaround (salt_buf1[0]); + w1_t[1] = swap_workaround (salt_buf1[1]); + w1_t[2] = swap_workaround (salt_buf1[2]); + w1_t[3] = swap_workaround (salt_buf1[3]); + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = (128 + salt_len) * 8; + + u64x digest[8]; + + hmac_sha512_run (w0_t, w1_t, w2_t, w3_t, ipad, opad, digest); + + + const u32x r0 = l32_from_64 (digest[7]); + const u32x r1 = h32_from_64 (digest[7]); + const u32x r2 = l32_from_64 (digest[3]); + const u32x r3 = h32_from_64 (digest[3]); + + #include VECT_COMPARE_M + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m01750_m08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m01750_m16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m01750_s04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, combs_buf[0].pw_len); + } + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[ 1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[ 2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[ 3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[ 4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[ 5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[ 6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[ 7]; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = combs_buf[il_pos].pw_len; + + const u32 pw_len = pw_l_len + pw_r_len; + + u32 wordr0[4]; + + wordr0[0] = combs_buf[il_pos].i[0]; + wordr0[1] = combs_buf[il_pos].i[1]; + wordr0[2] = combs_buf[il_pos].i[2]; + wordr0[3] = combs_buf[il_pos].i[3]; + + u32 wordr1[4]; + + wordr1[0] = combs_buf[il_pos].i[4]; + wordr1[1] = combs_buf[il_pos].i[5]; + wordr1[2] = combs_buf[il_pos].i[6]; + wordr1[3] = combs_buf[il_pos].i[7]; + + u32 wordr2[4]; + + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + + u32 wordr3[4]; + + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + u32x w0[4]; + + w0[0] = wordl0[0] | wordr0[0]; + w0[1] = wordl0[1] | wordr0[1]; + w0[2] = wordl0[2] | wordr0[2]; + w0[3] = wordl0[3] | wordr0[3]; + + u32x w1[4]; + + w1[0] = wordl1[0] | wordr1[0]; + w1[1] = wordl1[1] | wordr1[1]; + w1[2] = wordl1[2] | wordr1[2]; + w1[3] = wordl1[3] | wordr1[3]; + + u32x w2[4]; + + w2[0] = wordl2[0] | wordr2[0]; + w2[1] = wordl2[1] | wordr2[1]; + w2[2] = wordl2[2] | wordr2[2]; + w2[3] = wordl2[3] | wordr2[3]; + + u32x w3[4]; + + w3[0] = wordl3[0] | wordr3[0]; + w3[1] = wordl3[1] | wordr3[1]; + w3[2] = wordl3[2] | wordr3[2]; + w3[3] = wordl3[3] | wordr3[3]; + + /** + * pads + */ + + u32x w0_t[4]; + + w0_t[0] = swap_workaround (w0[0]); + w0_t[1] = swap_workaround (w0[1]); + w0_t[2] = swap_workaround (w0[2]); + w0_t[3] = swap_workaround (w0[3]); + + u32x w1_t[4]; + + w1_t[0] = swap_workaround (w1[0]); + w1_t[1] = swap_workaround (w1[1]); + w1_t[2] = swap_workaround (w1[2]); + w1_t[3] = swap_workaround (w1[3]); + + u32x w2_t[4]; + + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + + u32x w3_t[4]; + + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = 0; + + u64x ipad[8]; + u64x opad[8]; + + hmac_sha512_pad (w0_t, w1_t, w2_t, w3_t, ipad, opad); + + w0_t[0] = swap_workaround (salt_buf0[0]); + w0_t[1] = swap_workaround (salt_buf0[1]); + w0_t[2] = swap_workaround (salt_buf0[2]); + w0_t[3] = swap_workaround (salt_buf0[3]); + w1_t[0] = swap_workaround (salt_buf1[0]); + w1_t[1] = swap_workaround (salt_buf1[1]); + w1_t[2] = swap_workaround (salt_buf1[2]); + w1_t[3] = swap_workaround (salt_buf1[3]); + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = (128 + salt_len) * 8; + + u64x digest[8]; + + hmac_sha512_run (w0_t, w1_t, w2_t, w3_t, ipad, opad, digest); + + + const u32x r0 = l32_from_64 (digest[7]); + const u32x r1 = h32_from_64 (digest[7]); + const u32x r2 = l32_from_64 (digest[3]); + const u32x r3 = h32_from_64 (digest[3]); + + #include VECT_COMPARE_S + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m01750_s08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m01750_s16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/amd/m01750_a3.cl b/amd/m01750_a3.cl new file mode 100644 index 0000000000..2d31fa2e01 --- /dev/null +++ b/amd/m01750_a3.cl @@ -0,0 +1,795 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _SHA512_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW4 +#define VECT_SIZE1 +#endif + +#ifdef VLIW5 +#define VECT_SIZE1 +#endif + +#define DGST_R0 14 +#define DGST_R1 15 +#define DGST_R2 6 +#define DGST_R3 7 + +#include "include/kernel_functions.c" +#include "types_amd.c" +#include "common_amd.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +__constant u64 k_sha512[80] = +{ + SHA512C00, SHA512C01, SHA512C02, SHA512C03, + SHA512C04, SHA512C05, SHA512C06, SHA512C07, + SHA512C08, SHA512C09, SHA512C0a, SHA512C0b, + SHA512C0c, SHA512C0d, SHA512C0e, SHA512C0f, + SHA512C10, SHA512C11, SHA512C12, SHA512C13, + SHA512C14, SHA512C15, SHA512C16, SHA512C17, + SHA512C18, SHA512C19, SHA512C1a, SHA512C1b, + SHA512C1c, SHA512C1d, SHA512C1e, SHA512C1f, + SHA512C20, SHA512C21, SHA512C22, SHA512C23, + SHA512C24, SHA512C25, SHA512C26, SHA512C27, + SHA512C28, SHA512C29, SHA512C2a, SHA512C2b, + SHA512C2c, SHA512C2d, SHA512C2e, SHA512C2f, + SHA512C30, SHA512C31, SHA512C32, SHA512C33, + SHA512C34, SHA512C35, SHA512C36, SHA512C37, + SHA512C38, SHA512C39, SHA512C3a, SHA512C3b, + SHA512C3c, SHA512C3d, SHA512C3e, SHA512C3f, + SHA512C40, SHA512C41, SHA512C42, SHA512C43, + SHA512C44, SHA512C45, SHA512C46, SHA512C47, + SHA512C48, SHA512C49, SHA512C4a, SHA512C4b, + SHA512C4c, SHA512C4d, SHA512C4e, SHA512C4f, +}; + +static void sha512_transform (const u64x w0[4], const u64x w1[4], const u64x w2[4], const u64x w3[4], u64x digest[8]) +{ + u64x w0_t = w0[0]; + u64x w1_t = w0[1]; + u64x w2_t = w0[2]; + u64x w3_t = w0[3]; + u64x w4_t = w1[0]; + u64x w5_t = w1[1]; + u64x w6_t = w1[2]; + u64x w7_t = w1[3]; + u64x w8_t = w2[0]; + u64x w9_t = w2[1]; + u64x wa_t = w2[2]; + u64x wb_t = w2[3]; + u64x wc_t = w3[0]; + u64x wd_t = w3[1]; + u64x we_t = w3[2]; + u64x wf_t = w3[3]; + + u64x a = digest[0]; + u64x b = digest[1]; + u64x c = digest[2]; + u64x d = digest[3]; + u64x e = digest[4]; + u64x f = digest[5]; + u64x g = digest[6]; + u64x h = digest[7]; + + #define ROUND_EXPAND() \ + { \ + w0_t = SHA512_EXPAND (we_t, w9_t, w1_t, w0_t); \ + w1_t = SHA512_EXPAND (wf_t, wa_t, w2_t, w1_t); \ + w2_t = SHA512_EXPAND (w0_t, wb_t, w3_t, w2_t); \ + w3_t = SHA512_EXPAND (w1_t, wc_t, w4_t, w3_t); \ + w4_t = SHA512_EXPAND (w2_t, wd_t, w5_t, w4_t); \ + w5_t = SHA512_EXPAND (w3_t, we_t, w6_t, w5_t); \ + w6_t = SHA512_EXPAND (w4_t, wf_t, w7_t, w6_t); \ + w7_t = SHA512_EXPAND (w5_t, w0_t, w8_t, w7_t); \ + w8_t = SHA512_EXPAND (w6_t, w1_t, w9_t, w8_t); \ + w9_t = SHA512_EXPAND (w7_t, w2_t, wa_t, w9_t); \ + wa_t = SHA512_EXPAND (w8_t, w3_t, wb_t, wa_t); \ + wb_t = SHA512_EXPAND (w9_t, w4_t, wc_t, wb_t); \ + wc_t = SHA512_EXPAND (wa_t, w5_t, wd_t, wc_t); \ + wd_t = SHA512_EXPAND (wb_t, w6_t, we_t, wd_t); \ + we_t = SHA512_EXPAND (wc_t, w7_t, wf_t, we_t); \ + wf_t = SHA512_EXPAND (wd_t, w8_t, w0_t, wf_t); \ + } + + #define ROUND_STEP(i) \ + { \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, a, b, c, d, e, f, g, h, w0_t, k_sha512[i + 0]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, h, a, b, c, d, e, f, g, w1_t, k_sha512[i + 1]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, g, h, a, b, c, d, e, f, w2_t, k_sha512[i + 2]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, f, g, h, a, b, c, d, e, w3_t, k_sha512[i + 3]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, e, f, g, h, a, b, c, d, w4_t, k_sha512[i + 4]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, d, e, f, g, h, a, b, c, w5_t, k_sha512[i + 5]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, c, d, e, f, g, h, a, b, w6_t, k_sha512[i + 6]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, b, c, d, e, f, g, h, a, w7_t, k_sha512[i + 7]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, a, b, c, d, e, f, g, h, w8_t, k_sha512[i + 8]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, h, a, b, c, d, e, f, g, w9_t, k_sha512[i + 9]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, g, h, a, b, c, d, e, f, wa_t, k_sha512[i + 10]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, f, g, h, a, b, c, d, e, wb_t, k_sha512[i + 11]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, e, f, g, h, a, b, c, d, wc_t, k_sha512[i + 12]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, d, e, f, g, h, a, b, c, wd_t, k_sha512[i + 13]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, c, d, e, f, g, h, a, b, we_t, k_sha512[i + 14]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, b, c, d, e, f, g, h, a, wf_t, k_sha512[i + 15]); \ + } + + ROUND_STEP (0); + + //#pragma unroll // kernel fails if used + for (int i = 16; i < 80; i += 16) + { + ROUND_EXPAND (); ROUND_STEP (i); + } + + digest[0] += a; + digest[1] += b; + digest[2] += c; + digest[3] += d; + digest[4] += e; + digest[5] += f; + digest[6] += g; + digest[7] += h; +} + +static void hmac_sha512_pad (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], u64x ipad[8], u64x opad[8]) +{ + u64x w0_t[4]; + u64x w1_t[4]; + u64x w2_t[4]; + u64x w3_t[4]; + + w0_t[0] = hl32_to_64 (w0[0], w0[1]) ^ 0x3636363636363636; + w0_t[1] = hl32_to_64 (w0[2], w0[3]) ^ 0x3636363636363636; + w0_t[2] = hl32_to_64 (w1[0], w1[1]) ^ 0x3636363636363636; + w0_t[3] = hl32_to_64 (w1[2], w1[3]) ^ 0x3636363636363636; + w1_t[0] = hl32_to_64 (w2[0], w2[1]) ^ 0x3636363636363636; + w1_t[1] = hl32_to_64 (w2[2], w2[3]) ^ 0x3636363636363636; + w1_t[2] = hl32_to_64 (w3[0], w3[1]) ^ 0x3636363636363636; + w1_t[3] = hl32_to_64 (w3[2], w3[3]) ^ 0x3636363636363636; + w2_t[0] = 0x3636363636363636; + w2_t[1] = 0x3636363636363636; + w2_t[2] = 0x3636363636363636; + w2_t[3] = 0x3636363636363636; + w3_t[0] = 0x3636363636363636; + w3_t[1] = 0x3636363636363636; + w3_t[2] = 0x3636363636363636; + w3_t[3] = 0x3636363636363636; + + ipad[0] = SHA512M_A; + ipad[1] = SHA512M_B; + ipad[2] = SHA512M_C; + ipad[3] = SHA512M_D; + ipad[4] = SHA512M_E; + ipad[5] = SHA512M_F; + ipad[6] = SHA512M_G; + ipad[7] = SHA512M_H; + + sha512_transform (w0_t, w1_t, w2_t, w3_t, ipad); + + w0_t[0] = hl32_to_64 (w0[0], w0[1]) ^ 0x5c5c5c5c5c5c5c5c; + w0_t[1] = hl32_to_64 (w0[2], w0[3]) ^ 0x5c5c5c5c5c5c5c5c; + w0_t[2] = hl32_to_64 (w1[0], w1[1]) ^ 0x5c5c5c5c5c5c5c5c; + w0_t[3] = hl32_to_64 (w1[2], w1[3]) ^ 0x5c5c5c5c5c5c5c5c; + w1_t[0] = hl32_to_64 (w2[0], w2[1]) ^ 0x5c5c5c5c5c5c5c5c; + w1_t[1] = hl32_to_64 (w2[2], w2[3]) ^ 0x5c5c5c5c5c5c5c5c; + w1_t[2] = hl32_to_64 (w3[0], w3[1]) ^ 0x5c5c5c5c5c5c5c5c; + w1_t[3] = hl32_to_64 (w3[2], w3[3]) ^ 0x5c5c5c5c5c5c5c5c; + w2_t[0] = 0x5c5c5c5c5c5c5c5c; + w2_t[1] = 0x5c5c5c5c5c5c5c5c; + w2_t[2] = 0x5c5c5c5c5c5c5c5c; + w2_t[3] = 0x5c5c5c5c5c5c5c5c; + w3_t[0] = 0x5c5c5c5c5c5c5c5c; + w3_t[1] = 0x5c5c5c5c5c5c5c5c; + w3_t[2] = 0x5c5c5c5c5c5c5c5c; + w3_t[3] = 0x5c5c5c5c5c5c5c5c; + + opad[0] = SHA512M_A; + opad[1] = SHA512M_B; + opad[2] = SHA512M_C; + opad[3] = SHA512M_D; + opad[4] = SHA512M_E; + opad[5] = SHA512M_F; + opad[6] = SHA512M_G; + opad[7] = SHA512M_H; + + sha512_transform (w0_t, w1_t, w2_t, w3_t, opad); +} + +static void hmac_sha512_run (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], u64x ipad[8], u64x opad[8], u64x digest[8]) +{ + u64x w0_t[4]; + u64x w1_t[4]; + u64x w2_t[4]; + u64x w3_t[4]; + + w0_t[0] = hl32_to_64 (w0[0], w0[1]); + w0_t[1] = hl32_to_64 (w0[2], w0[3]); + w0_t[2] = hl32_to_64 (w1[0], w1[1]); + w0_t[3] = hl32_to_64 (w1[2], w1[3]); + w1_t[0] = hl32_to_64 (w2[0], w2[1]); + w1_t[1] = hl32_to_64 (w2[2], w2[3]); + w1_t[2] = hl32_to_64 (w3[0], w3[1]); + w1_t[3] = 0; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = hl32_to_64 (w3[2], w3[3]); + + digest[0] = ipad[0]; + digest[1] = ipad[1]; + digest[2] = ipad[2]; + digest[3] = ipad[3]; + digest[4] = ipad[4]; + digest[5] = ipad[5]; + digest[6] = ipad[6]; + digest[7] = ipad[7]; + + sha512_transform (w0_t, w1_t, w2_t, w3_t, digest); + + w0_t[0] = digest[0]; + w0_t[1] = digest[1]; + w0_t[2] = digest[2]; + w0_t[3] = digest[3]; + w1_t[0] = digest[4]; + w1_t[1] = digest[5]; + w1_t[2] = digest[6]; + w1_t[3] = digest[7]; + w2_t[0] = 0x8000000000000000; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = (128 + 64) * 8; + + digest[0] = opad[0]; + digest[1] = opad[1]; + digest[2] = opad[2]; + digest[3] = opad[3]; + digest[4] = opad[4]; + digest[5] = opad[5]; + digest[6] = opad[6]; + digest[7] = opad[7]; + + sha512_transform (w0_t, w1_t, w2_t, w3_t, digest); +} + +static void m01750m (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], const u32 pw_len, __global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset) +{ + /** + * modifier + */ + + const u32 gid = get_global_id (0); + const u32 lid = get_local_id (0); + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[ 1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[ 2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[ 3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[ 4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[ 5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[ 6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[ 7]; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + /** + * loop + */ + + u32x w0l = w0[0]; + + for (u32 il_pos = 0; il_pos < bfs_cnt; il_pos++) + { + const u32 w0r = bfs_buf[il_pos].i; + + w0[0] = w0l | w0r; + + /** + * pads + */ + + u32x w0_t[4]; + + w0_t[0] = w0[0]; + w0_t[1] = w0[1]; + w0_t[2] = w0[2]; + w0_t[3] = w0[3]; + + u32x w1_t[4]; + + w1_t[0] = w1[0]; + w1_t[1] = w1[1]; + w1_t[2] = w1[2]; + w1_t[3] = w1[3]; + + u32x w2_t[4]; + + w2_t[0] = w2[0]; + w2_t[1] = w2[1]; + w2_t[2] = w2[2]; + w2_t[3] = w2[3]; + + u32x w3_t[4]; + + w3_t[0] = w3[0]; + w3_t[1] = w3[1]; + w3_t[2] = 0; + w3_t[3] = 0; + + u64x ipad[8]; + u64x opad[8]; + + hmac_sha512_pad (w0_t, w1_t, w2_t, w3_t, ipad, opad); + + w0_t[0] = swap_workaround (salt_buf0[0]); + w0_t[1] = swap_workaround (salt_buf0[1]); + w0_t[2] = swap_workaround (salt_buf0[2]); + w0_t[3] = swap_workaround (salt_buf0[3]); + w1_t[0] = swap_workaround (salt_buf1[0]); + w1_t[1] = swap_workaround (salt_buf1[1]); + w1_t[2] = swap_workaround (salt_buf1[2]); + w1_t[3] = swap_workaround (salt_buf1[3]); + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = (128 + salt_len) * 8; + + u64x digest[8]; + + hmac_sha512_run (w0_t, w1_t, w2_t, w3_t, ipad, opad, digest); + + + const u32x r0 = l32_from_64 (digest[7]); + const u32x r1 = h32_from_64 (digest[7]); + const u32x r2 = l32_from_64 (digest[3]); + const u32x r3 = h32_from_64 (digest[3]); + + #include VECT_COMPARE_M + } +} + +static void m01750s (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], const u32 pw_len, __global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset) +{ + /** + * modifier + */ + + const u32 gid = get_global_id (0); + const u32 lid = get_local_id (0); + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[ 1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[ 2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[ 3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[ 4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[ 5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[ 6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[ 7]; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * loop + */ + + u32x w0l = w0[0]; + + for (u32 il_pos = 0; il_pos < bfs_cnt; il_pos++) + { + const u32 w0r = bfs_buf[il_pos].i; + + w0[0] = w0l | w0r; + + /** + * pads + */ + + u32x w0_t[4]; + + w0_t[0] = w0[0]; + w0_t[1] = w0[1]; + w0_t[2] = w0[2]; + w0_t[3] = w0[3]; + + u32x w1_t[4]; + + w1_t[0] = w1[0]; + w1_t[1] = w1[1]; + w1_t[2] = w1[2]; + w1_t[3] = w1[3]; + + u32x w2_t[4]; + + w2_t[0] = w2[0]; + w2_t[1] = w2[1]; + w2_t[2] = w2[2]; + w2_t[3] = w2[3]; + + u32x w3_t[4]; + + w3_t[0] = w3[0]; + w3_t[1] = w3[1]; + w3_t[2] = 0; + w3_t[3] = 0; + + u64x ipad[8]; + u64x opad[8]; + + hmac_sha512_pad (w0_t, w1_t, w2_t, w3_t, ipad, opad); + + w0_t[0] = swap_workaround (salt_buf0[0]); + w0_t[1] = swap_workaround (salt_buf0[1]); + w0_t[2] = swap_workaround (salt_buf0[2]); + w0_t[3] = swap_workaround (salt_buf0[3]); + w1_t[0] = swap_workaround (salt_buf1[0]); + w1_t[1] = swap_workaround (salt_buf1[1]); + w1_t[2] = swap_workaround (salt_buf1[2]); + w1_t[3] = swap_workaround (salt_buf1[3]); + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = (128 + salt_len) * 8; + + u64x digest[8]; + + hmac_sha512_run (w0_t, w1_t, w2_t, w3_t, ipad, opad, digest); + + + const u32x r0 = l32_from_64 (digest[7]); + const u32x r1 = h32_from_64 (digest[7]); + const u32x r2 = l32_from_64 (digest[3]); + const u32x r3 = h32_from_64 (digest[3]); + + #include VECT_COMPARE_S + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m01750_m04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m01750m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m01750_m08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m01750m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m01750_m16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = pws[gid].i[ 8]; + w2[1] = pws[gid].i[ 9]; + w2[2] = pws[gid].i[10]; + w2[3] = pws[gid].i[11]; + + u32x w3[4]; + + w3[0] = pws[gid].i[12]; + w3[1] = pws[gid].i[13]; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m01750m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m01750_s04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m01750s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m01750_s08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m01750s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m01750_s16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = pws[gid].i[ 8]; + w2[1] = pws[gid].i[ 9]; + w2[2] = pws[gid].i[10]; + w2[3] = pws[gid].i[11]; + + u32x w3[4]; + + w3[0] = pws[gid].i[12]; + w3[1] = pws[gid].i[13]; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m01750s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} diff --git a/amd/m01760_a0.cl b/amd/m01760_a0.cl new file mode 100644 index 0000000000..8fef412442 --- /dev/null +++ b/amd/m01760_a0.cl @@ -0,0 +1,625 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _SHA512_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW4 +#define VECT_SIZE1 +#endif + +#ifdef VLIW5 +#define VECT_SIZE1 +#endif + +#define DGST_R0 14 +#define DGST_R1 15 +#define DGST_R2 6 +#define DGST_R3 7 + +#include "include/kernel_functions.c" +#include "types_amd.c" +#include "common_amd.c" +#include "include/rp_gpu.h" +#include "rp_amd.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +__constant u64 k_sha512[80] = +{ + SHA512C00, SHA512C01, SHA512C02, SHA512C03, + SHA512C04, SHA512C05, SHA512C06, SHA512C07, + SHA512C08, SHA512C09, SHA512C0a, SHA512C0b, + SHA512C0c, SHA512C0d, SHA512C0e, SHA512C0f, + SHA512C10, SHA512C11, SHA512C12, SHA512C13, + SHA512C14, SHA512C15, SHA512C16, SHA512C17, + SHA512C18, SHA512C19, SHA512C1a, SHA512C1b, + SHA512C1c, SHA512C1d, SHA512C1e, SHA512C1f, + SHA512C20, SHA512C21, SHA512C22, SHA512C23, + SHA512C24, SHA512C25, SHA512C26, SHA512C27, + SHA512C28, SHA512C29, SHA512C2a, SHA512C2b, + SHA512C2c, SHA512C2d, SHA512C2e, SHA512C2f, + SHA512C30, SHA512C31, SHA512C32, SHA512C33, + SHA512C34, SHA512C35, SHA512C36, SHA512C37, + SHA512C38, SHA512C39, SHA512C3a, SHA512C3b, + SHA512C3c, SHA512C3d, SHA512C3e, SHA512C3f, + SHA512C40, SHA512C41, SHA512C42, SHA512C43, + SHA512C44, SHA512C45, SHA512C46, SHA512C47, + SHA512C48, SHA512C49, SHA512C4a, SHA512C4b, + SHA512C4c, SHA512C4d, SHA512C4e, SHA512C4f, +}; + +static void sha512_transform (const u64x w0[4], const u64x w1[4], const u64x w2[4], const u64x w3[4], u64x digest[8]) +{ + u64x w0_t = w0[0]; + u64x w1_t = w0[1]; + u64x w2_t = w0[2]; + u64x w3_t = w0[3]; + u64x w4_t = w1[0]; + u64x w5_t = w1[1]; + u64x w6_t = w1[2]; + u64x w7_t = w1[3]; + u64x w8_t = w2[0]; + u64x w9_t = w2[1]; + u64x wa_t = w2[2]; + u64x wb_t = w2[3]; + u64x wc_t = w3[0]; + u64x wd_t = w3[1]; + u64x we_t = w3[2]; + u64x wf_t = w3[3]; + + u64x a = digest[0]; + u64x b = digest[1]; + u64x c = digest[2]; + u64x d = digest[3]; + u64x e = digest[4]; + u64x f = digest[5]; + u64x g = digest[6]; + u64x h = digest[7]; + + #define ROUND_EXPAND() \ + { \ + w0_t = SHA512_EXPAND (we_t, w9_t, w1_t, w0_t); \ + w1_t = SHA512_EXPAND (wf_t, wa_t, w2_t, w1_t); \ + w2_t = SHA512_EXPAND (w0_t, wb_t, w3_t, w2_t); \ + w3_t = SHA512_EXPAND (w1_t, wc_t, w4_t, w3_t); \ + w4_t = SHA512_EXPAND (w2_t, wd_t, w5_t, w4_t); \ + w5_t = SHA512_EXPAND (w3_t, we_t, w6_t, w5_t); \ + w6_t = SHA512_EXPAND (w4_t, wf_t, w7_t, w6_t); \ + w7_t = SHA512_EXPAND (w5_t, w0_t, w8_t, w7_t); \ + w8_t = SHA512_EXPAND (w6_t, w1_t, w9_t, w8_t); \ + w9_t = SHA512_EXPAND (w7_t, w2_t, wa_t, w9_t); \ + wa_t = SHA512_EXPAND (w8_t, w3_t, wb_t, wa_t); \ + wb_t = SHA512_EXPAND (w9_t, w4_t, wc_t, wb_t); \ + wc_t = SHA512_EXPAND (wa_t, w5_t, wd_t, wc_t); \ + wd_t = SHA512_EXPAND (wb_t, w6_t, we_t, wd_t); \ + we_t = SHA512_EXPAND (wc_t, w7_t, wf_t, we_t); \ + wf_t = SHA512_EXPAND (wd_t, w8_t, w0_t, wf_t); \ + } + + #define ROUND_STEP(i) \ + { \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, a, b, c, d, e, f, g, h, w0_t, k_sha512[i + 0]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, h, a, b, c, d, e, f, g, w1_t, k_sha512[i + 1]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, g, h, a, b, c, d, e, f, w2_t, k_sha512[i + 2]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, f, g, h, a, b, c, d, e, w3_t, k_sha512[i + 3]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, e, f, g, h, a, b, c, d, w4_t, k_sha512[i + 4]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, d, e, f, g, h, a, b, c, w5_t, k_sha512[i + 5]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, c, d, e, f, g, h, a, b, w6_t, k_sha512[i + 6]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, b, c, d, e, f, g, h, a, w7_t, k_sha512[i + 7]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, a, b, c, d, e, f, g, h, w8_t, k_sha512[i + 8]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, h, a, b, c, d, e, f, g, w9_t, k_sha512[i + 9]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, g, h, a, b, c, d, e, f, wa_t, k_sha512[i + 10]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, f, g, h, a, b, c, d, e, wb_t, k_sha512[i + 11]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, e, f, g, h, a, b, c, d, wc_t, k_sha512[i + 12]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, d, e, f, g, h, a, b, c, wd_t, k_sha512[i + 13]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, c, d, e, f, g, h, a, b, we_t, k_sha512[i + 14]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, b, c, d, e, f, g, h, a, wf_t, k_sha512[i + 15]); \ + } + + ROUND_STEP (0); + + //#pragma unroll // kernel fails if used + for (int i = 16; i < 80; i += 16) + { + ROUND_EXPAND (); ROUND_STEP (i); + } + + digest[0] += a; + digest[1] += b; + digest[2] += c; + digest[3] += d; + digest[4] += e; + digest[5] += f; + digest[6] += g; + digest[7] += h; +} + +static void hmac_sha512_pad (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], u64x ipad[8], u64x opad[8]) +{ + u64x w0_t[4]; + u64x w1_t[4]; + u64x w2_t[4]; + u64x w3_t[4]; + + w0_t[0] = hl32_to_64 (w0[0], w0[1]) ^ 0x3636363636363636; + w0_t[1] = hl32_to_64 (w0[2], w0[3]) ^ 0x3636363636363636; + w0_t[2] = hl32_to_64 (w1[0], w1[1]) ^ 0x3636363636363636; + w0_t[3] = hl32_to_64 (w1[2], w1[3]) ^ 0x3636363636363636; + w1_t[0] = hl32_to_64 (w2[0], w2[1]) ^ 0x3636363636363636; + w1_t[1] = hl32_to_64 (w2[2], w2[3]) ^ 0x3636363636363636; + w1_t[2] = hl32_to_64 (w3[0], w3[1]) ^ 0x3636363636363636; + w1_t[3] = hl32_to_64 (w3[2], w3[3]) ^ 0x3636363636363636; + w2_t[0] = 0 ^ 0x3636363636363636; + w2_t[1] = 0 ^ 0x3636363636363636; + w2_t[2] = 0 ^ 0x3636363636363636; + w2_t[3] = 0 ^ 0x3636363636363636; + w3_t[0] = 0 ^ 0x3636363636363636; + w3_t[1] = 0 ^ 0x3636363636363636; + w3_t[2] = 0 ^ 0x3636363636363636; + w3_t[3] = 0 ^ 0x3636363636363636; + + ipad[0] = SHA512M_A; + ipad[1] = SHA512M_B; + ipad[2] = SHA512M_C; + ipad[3] = SHA512M_D; + ipad[4] = SHA512M_E; + ipad[5] = SHA512M_F; + ipad[6] = SHA512M_G; + ipad[7] = SHA512M_H; + + sha512_transform (w0_t, w1_t, w2_t, w3_t, ipad); + + w0_t[0] = hl32_to_64 (w0[0], w0[1]) ^ 0x5c5c5c5c5c5c5c5c; + w0_t[1] = hl32_to_64 (w0[2], w0[3]) ^ 0x5c5c5c5c5c5c5c5c; + w0_t[2] = hl32_to_64 (w1[0], w1[1]) ^ 0x5c5c5c5c5c5c5c5c; + w0_t[3] = hl32_to_64 (w1[2], w1[3]) ^ 0x5c5c5c5c5c5c5c5c; + w1_t[0] = hl32_to_64 (w2[0], w2[1]) ^ 0x5c5c5c5c5c5c5c5c; + w1_t[1] = hl32_to_64 (w2[2], w2[3]) ^ 0x5c5c5c5c5c5c5c5c; + w1_t[2] = hl32_to_64 (w3[0], w3[1]) ^ 0x5c5c5c5c5c5c5c5c; + w1_t[3] = hl32_to_64 (w3[2], w3[3]) ^ 0x5c5c5c5c5c5c5c5c; + w2_t[0] = 0 ^ 0x5c5c5c5c5c5c5c5c; + w2_t[1] = 0 ^ 0x5c5c5c5c5c5c5c5c; + w2_t[2] = 0 ^ 0x5c5c5c5c5c5c5c5c; + w2_t[3] = 0 ^ 0x5c5c5c5c5c5c5c5c; + w3_t[0] = 0 ^ 0x5c5c5c5c5c5c5c5c; + w3_t[1] = 0 ^ 0x5c5c5c5c5c5c5c5c; + w3_t[2] = 0 ^ 0x5c5c5c5c5c5c5c5c; + w3_t[3] = 0 ^ 0x5c5c5c5c5c5c5c5c; + + opad[0] = SHA512M_A; + opad[1] = SHA512M_B; + opad[2] = SHA512M_C; + opad[3] = SHA512M_D; + opad[4] = SHA512M_E; + opad[5] = SHA512M_F; + opad[6] = SHA512M_G; + opad[7] = SHA512M_H; + + sha512_transform (w0_t, w1_t, w2_t, w3_t, opad); +} + +static void hmac_sha512_run (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], u64x ipad[8], u64x opad[8], u64x digest[8]) +{ + u64x w0_t[4]; + u64x w1_t[4]; + u64x w2_t[4]; + u64x w3_t[4]; + + w0_t[0] = hl32_to_64 (w0[0], w0[1]); + w0_t[1] = hl32_to_64 (w0[2], w0[3]); + w0_t[2] = hl32_to_64 (w1[0], w1[1]); + w0_t[3] = hl32_to_64 (w1[2], w1[3]); + w1_t[0] = hl32_to_64 (w2[0], w2[1]); + w1_t[1] = hl32_to_64 (w2[2], w2[3]); + w1_t[2] = hl32_to_64 (w3[0], w3[1]); + w1_t[3] = 0; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = hl32_to_64 (w3[2], w3[3]); + + digest[0] = ipad[0]; + digest[1] = ipad[1]; + digest[2] = ipad[2]; + digest[3] = ipad[3]; + digest[4] = ipad[4]; + digest[5] = ipad[5]; + digest[6] = ipad[6]; + digest[7] = ipad[7]; + + sha512_transform (w0_t, w1_t, w2_t, w3_t, digest); + + w0_t[0] = digest[0]; + w0_t[1] = digest[1]; + w0_t[2] = digest[2]; + w0_t[3] = digest[3]; + w1_t[0] = digest[4]; + w1_t[1] = digest[5]; + w1_t[2] = digest[6]; + w1_t[3] = digest[7]; + w2_t[0] = 0x8000000000000000; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = (128 + 64) * 8; + + digest[0] = opad[0]; + digest[1] = opad[1]; + digest[2] = opad[2]; + digest[3] = opad[3]; + digest[4] = opad[4]; + digest[5] = opad[5]; + digest[6] = opad[6]; + digest[7] = opad[7]; + + sha512_transform (w0_t, w1_t, w2_t, w3_t, digest); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m01760_m04 (__global pw_t *pws, __global gpu_rule_t * rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + u32x pw_buf1[4]; + + pw_buf1[0] = pws[gid].i[ 4]; + pw_buf1[1] = pws[gid].i[ 5]; + pw_buf1[2] = pws[gid].i[ 6]; + pw_buf1[3] = pws[gid].i[ 7]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[ 1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[ 2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[ 3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[ 4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[ 5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[ 6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[ 7]; + + /** + * pads + */ + + u32x w0_t[4]; + + w0_t[0] = swap_workaround (salt_buf0[0]); + w0_t[1] = swap_workaround (salt_buf0[1]); + w0_t[2] = swap_workaround (salt_buf0[2]); + w0_t[3] = swap_workaround (salt_buf0[3]); + + u32x w1_t[4]; + + w1_t[0] = swap_workaround (salt_buf1[0]); + w1_t[1] = swap_workaround (salt_buf1[1]); + w1_t[2] = swap_workaround (salt_buf1[2]); + w1_t[3] = swap_workaround (salt_buf1[3]); + + u32x w2_t[4]; + + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + + u32x w3_t[4]; + + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = 0; + + u64x ipad[8]; + u64x opad[8]; + + hmac_sha512_pad (w0_t, w1_t, w2_t, w3_t, ipad, opad); + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + + w0[0] = pw_buf0[0]; + w0[1] = pw_buf0[1]; + w0[2] = pw_buf0[2]; + w0[3] = pw_buf0[3]; + + u32x w1[4]; + + w1[0] = pw_buf1[0]; + w1[1] = pw_buf1[1]; + w1[2] = pw_buf1[2]; + w1[3] = pw_buf1[3]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 out_len = apply_rules (rules_buf[il_pos].cmds, w0, w1, pw_len); + + append_0x80_2 (w0, w1, out_len); + + w0_t[0] = swap_workaround (w0[0]); + w0_t[1] = swap_workaround (w0[1]); + w0_t[2] = swap_workaround (w0[2]); + w0_t[3] = swap_workaround (w0[3]); + w1_t[0] = swap_workaround (w1[0]); + w1_t[1] = swap_workaround (w1[1]); + w1_t[2] = swap_workaround (w1[2]); + w1_t[3] = swap_workaround (w1[3]); + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = (128 + out_len) * 8; + + u64x digest[8]; + + hmac_sha512_run (w0_t, w1_t, w2_t, w3_t, ipad, opad, digest); + + + const u32x r0 = l32_from_64 (digest[7]); + const u32x r1 = h32_from_64 (digest[7]); + const u32x r2 = l32_from_64 (digest[3]); + const u32x r3 = h32_from_64 (digest[3]); + + #include VECT_COMPARE_M + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m01760_m08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m01760_m16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m01760_s04 (__global pw_t *pws, __global gpu_rule_t * rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + u32x pw_buf1[4]; + + pw_buf1[0] = pws[gid].i[ 4]; + pw_buf1[1] = pws[gid].i[ 5]; + pw_buf1[2] = pws[gid].i[ 6]; + pw_buf1[3] = pws[gid].i[ 7]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[ 1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[ 2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[ 3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[ 4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[ 5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[ 6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[ 7]; + + /** + * pads + */ + + u32x w0_t[4]; + + w0_t[0] = swap_workaround (salt_buf0[0]); + w0_t[1] = swap_workaround (salt_buf0[1]); + w0_t[2] = swap_workaround (salt_buf0[2]); + w0_t[3] = swap_workaround (salt_buf0[3]); + + u32x w1_t[4]; + + w1_t[0] = swap_workaround (salt_buf1[0]); + w1_t[1] = swap_workaround (salt_buf1[1]); + w1_t[2] = swap_workaround (salt_buf1[2]); + w1_t[3] = swap_workaround (salt_buf1[3]); + + u32x w2_t[4]; + + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + + u32x w3_t[4]; + + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = 0; + + u64x ipad[8]; + u64x opad[8]; + + hmac_sha512_pad (w0_t, w1_t, w2_t, w3_t, ipad, opad); + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + + w0[0] = pw_buf0[0]; + w0[1] = pw_buf0[1]; + w0[2] = pw_buf0[2]; + w0[3] = pw_buf0[3]; + + u32x w1[4]; + + w1[0] = pw_buf1[0]; + w1[1] = pw_buf1[1]; + w1[2] = pw_buf1[2]; + w1[3] = pw_buf1[3]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 out_len = apply_rules (rules_buf[il_pos].cmds, w0, w1, pw_len); + + append_0x80_2 (w0, w1, out_len); + + w0_t[0] = swap_workaround (w0[0]); + w0_t[1] = swap_workaround (w0[1]); + w0_t[2] = swap_workaround (w0[2]); + w0_t[3] = swap_workaround (w0[3]); + w1_t[0] = swap_workaround (w1[0]); + w1_t[1] = swap_workaround (w1[1]); + w1_t[2] = swap_workaround (w1[2]); + w1_t[3] = swap_workaround (w1[3]); + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = (128 + out_len) * 8; + + u64x digest[8]; + + hmac_sha512_run (w0_t, w1_t, w2_t, w3_t, ipad, opad, digest); + + + const u32x r0 = l32_from_64 (digest[7]); + const u32x r1 = h32_from_64 (digest[7]); + const u32x r2 = l32_from_64 (digest[3]); + const u32x r3 = h32_from_64 (digest[3]); + + #include VECT_COMPARE_S + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m01760_s08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m01760_s16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/amd/m01760_a1.cl b/amd/m01760_a1.cl new file mode 100644 index 0000000000..ff8e9c2e82 --- /dev/null +++ b/amd/m01760_a1.cl @@ -0,0 +1,731 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _SHA512_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW4 +#define VECT_SIZE1 +#endif + +#ifdef VLIW5 +#define VECT_SIZE1 +#endif + +#define DGST_R0 14 +#define DGST_R1 15 +#define DGST_R2 6 +#define DGST_R3 7 + +#include "include/kernel_functions.c" +#include "types_amd.c" +#include "common_amd.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +__constant u64 k_sha512[80] = +{ + SHA512C00, SHA512C01, SHA512C02, SHA512C03, + SHA512C04, SHA512C05, SHA512C06, SHA512C07, + SHA512C08, SHA512C09, SHA512C0a, SHA512C0b, + SHA512C0c, SHA512C0d, SHA512C0e, SHA512C0f, + SHA512C10, SHA512C11, SHA512C12, SHA512C13, + SHA512C14, SHA512C15, SHA512C16, SHA512C17, + SHA512C18, SHA512C19, SHA512C1a, SHA512C1b, + SHA512C1c, SHA512C1d, SHA512C1e, SHA512C1f, + SHA512C20, SHA512C21, SHA512C22, SHA512C23, + SHA512C24, SHA512C25, SHA512C26, SHA512C27, + SHA512C28, SHA512C29, SHA512C2a, SHA512C2b, + SHA512C2c, SHA512C2d, SHA512C2e, SHA512C2f, + SHA512C30, SHA512C31, SHA512C32, SHA512C33, + SHA512C34, SHA512C35, SHA512C36, SHA512C37, + SHA512C38, SHA512C39, SHA512C3a, SHA512C3b, + SHA512C3c, SHA512C3d, SHA512C3e, SHA512C3f, + SHA512C40, SHA512C41, SHA512C42, SHA512C43, + SHA512C44, SHA512C45, SHA512C46, SHA512C47, + SHA512C48, SHA512C49, SHA512C4a, SHA512C4b, + SHA512C4c, SHA512C4d, SHA512C4e, SHA512C4f, +}; + +static void sha512_transform (const u64x w0[4], const u64x w1[4], const u64x w2[4], const u64x w3[4], u64x digest[8]) +{ + u64x w0_t = w0[0]; + u64x w1_t = w0[1]; + u64x w2_t = w0[2]; + u64x w3_t = w0[3]; + u64x w4_t = w1[0]; + u64x w5_t = w1[1]; + u64x w6_t = w1[2]; + u64x w7_t = w1[3]; + u64x w8_t = w2[0]; + u64x w9_t = w2[1]; + u64x wa_t = w2[2]; + u64x wb_t = w2[3]; + u64x wc_t = w3[0]; + u64x wd_t = w3[1]; + u64x we_t = w3[2]; + u64x wf_t = w3[3]; + + u64x a = digest[0]; + u64x b = digest[1]; + u64x c = digest[2]; + u64x d = digest[3]; + u64x e = digest[4]; + u64x f = digest[5]; + u64x g = digest[6]; + u64x h = digest[7]; + + #define ROUND_EXPAND() \ + { \ + w0_t = SHA512_EXPAND (we_t, w9_t, w1_t, w0_t); \ + w1_t = SHA512_EXPAND (wf_t, wa_t, w2_t, w1_t); \ + w2_t = SHA512_EXPAND (w0_t, wb_t, w3_t, w2_t); \ + w3_t = SHA512_EXPAND (w1_t, wc_t, w4_t, w3_t); \ + w4_t = SHA512_EXPAND (w2_t, wd_t, w5_t, w4_t); \ + w5_t = SHA512_EXPAND (w3_t, we_t, w6_t, w5_t); \ + w6_t = SHA512_EXPAND (w4_t, wf_t, w7_t, w6_t); \ + w7_t = SHA512_EXPAND (w5_t, w0_t, w8_t, w7_t); \ + w8_t = SHA512_EXPAND (w6_t, w1_t, w9_t, w8_t); \ + w9_t = SHA512_EXPAND (w7_t, w2_t, wa_t, w9_t); \ + wa_t = SHA512_EXPAND (w8_t, w3_t, wb_t, wa_t); \ + wb_t = SHA512_EXPAND (w9_t, w4_t, wc_t, wb_t); \ + wc_t = SHA512_EXPAND (wa_t, w5_t, wd_t, wc_t); \ + wd_t = SHA512_EXPAND (wb_t, w6_t, we_t, wd_t); \ + we_t = SHA512_EXPAND (wc_t, w7_t, wf_t, we_t); \ + wf_t = SHA512_EXPAND (wd_t, w8_t, w0_t, wf_t); \ + } + + #define ROUND_STEP(i) \ + { \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, a, b, c, d, e, f, g, h, w0_t, k_sha512[i + 0]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, h, a, b, c, d, e, f, g, w1_t, k_sha512[i + 1]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, g, h, a, b, c, d, e, f, w2_t, k_sha512[i + 2]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, f, g, h, a, b, c, d, e, w3_t, k_sha512[i + 3]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, e, f, g, h, a, b, c, d, w4_t, k_sha512[i + 4]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, d, e, f, g, h, a, b, c, w5_t, k_sha512[i + 5]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, c, d, e, f, g, h, a, b, w6_t, k_sha512[i + 6]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, b, c, d, e, f, g, h, a, w7_t, k_sha512[i + 7]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, a, b, c, d, e, f, g, h, w8_t, k_sha512[i + 8]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, h, a, b, c, d, e, f, g, w9_t, k_sha512[i + 9]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, g, h, a, b, c, d, e, f, wa_t, k_sha512[i + 10]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, f, g, h, a, b, c, d, e, wb_t, k_sha512[i + 11]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, e, f, g, h, a, b, c, d, wc_t, k_sha512[i + 12]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, d, e, f, g, h, a, b, c, wd_t, k_sha512[i + 13]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, c, d, e, f, g, h, a, b, we_t, k_sha512[i + 14]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, b, c, d, e, f, g, h, a, wf_t, k_sha512[i + 15]); \ + } + + ROUND_STEP (0); + + //#pragma unroll // kernel fails if used + for (int i = 16; i < 80; i += 16) + { + ROUND_EXPAND (); ROUND_STEP (i); + } + + digest[0] += a; + digest[1] += b; + digest[2] += c; + digest[3] += d; + digest[4] += e; + digest[5] += f; + digest[6] += g; + digest[7] += h; +} + +static void hmac_sha512_pad (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], u64x ipad[8], u64x opad[8]) +{ + u64x w0_t[4]; + u64x w1_t[4]; + u64x w2_t[4]; + u64x w3_t[4]; + + w0_t[0] = hl32_to_64 (w0[0], w0[1]) ^ 0x3636363636363636; + w0_t[1] = hl32_to_64 (w0[2], w0[3]) ^ 0x3636363636363636; + w0_t[2] = hl32_to_64 (w1[0], w1[1]) ^ 0x3636363636363636; + w0_t[3] = hl32_to_64 (w1[2], w1[3]) ^ 0x3636363636363636; + w1_t[0] = hl32_to_64 (w2[0], w2[1]) ^ 0x3636363636363636; + w1_t[1] = hl32_to_64 (w2[2], w2[3]) ^ 0x3636363636363636; + w1_t[2] = hl32_to_64 (w3[0], w3[1]) ^ 0x3636363636363636; + w1_t[3] = hl32_to_64 (w3[2], w3[3]) ^ 0x3636363636363636; + w2_t[0] = 0 ^ 0x3636363636363636; + w2_t[1] = 0 ^ 0x3636363636363636; + w2_t[2] = 0 ^ 0x3636363636363636; + w2_t[3] = 0 ^ 0x3636363636363636; + w3_t[0] = 0 ^ 0x3636363636363636; + w3_t[1] = 0 ^ 0x3636363636363636; + w3_t[2] = 0 ^ 0x3636363636363636; + w3_t[3] = 0 ^ 0x3636363636363636; + + ipad[0] = SHA512M_A; + ipad[1] = SHA512M_B; + ipad[2] = SHA512M_C; + ipad[3] = SHA512M_D; + ipad[4] = SHA512M_E; + ipad[5] = SHA512M_F; + ipad[6] = SHA512M_G; + ipad[7] = SHA512M_H; + + sha512_transform (w0_t, w1_t, w2_t, w3_t, ipad); + + w0_t[0] = hl32_to_64 (w0[0], w0[1]) ^ 0x5c5c5c5c5c5c5c5c; + w0_t[1] = hl32_to_64 (w0[2], w0[3]) ^ 0x5c5c5c5c5c5c5c5c; + w0_t[2] = hl32_to_64 (w1[0], w1[1]) ^ 0x5c5c5c5c5c5c5c5c; + w0_t[3] = hl32_to_64 (w1[2], w1[3]) ^ 0x5c5c5c5c5c5c5c5c; + w1_t[0] = hl32_to_64 (w2[0], w2[1]) ^ 0x5c5c5c5c5c5c5c5c; + w1_t[1] = hl32_to_64 (w2[2], w2[3]) ^ 0x5c5c5c5c5c5c5c5c; + w1_t[2] = hl32_to_64 (w3[0], w3[1]) ^ 0x5c5c5c5c5c5c5c5c; + w1_t[3] = hl32_to_64 (w3[2], w3[3]) ^ 0x5c5c5c5c5c5c5c5c; + w2_t[0] = 0 ^ 0x5c5c5c5c5c5c5c5c; + w2_t[1] = 0 ^ 0x5c5c5c5c5c5c5c5c; + w2_t[2] = 0 ^ 0x5c5c5c5c5c5c5c5c; + w2_t[3] = 0 ^ 0x5c5c5c5c5c5c5c5c; + w3_t[0] = 0 ^ 0x5c5c5c5c5c5c5c5c; + w3_t[1] = 0 ^ 0x5c5c5c5c5c5c5c5c; + w3_t[2] = 0 ^ 0x5c5c5c5c5c5c5c5c; + w3_t[3] = 0 ^ 0x5c5c5c5c5c5c5c5c; + + opad[0] = SHA512M_A; + opad[1] = SHA512M_B; + opad[2] = SHA512M_C; + opad[3] = SHA512M_D; + opad[4] = SHA512M_E; + opad[5] = SHA512M_F; + opad[6] = SHA512M_G; + opad[7] = SHA512M_H; + + sha512_transform (w0_t, w1_t, w2_t, w3_t, opad); +} + +static void hmac_sha512_run (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], u64x ipad[8], u64x opad[8], u64x digest[8]) +{ + u64x w0_t[4]; + u64x w1_t[4]; + u64x w2_t[4]; + u64x w3_t[4]; + + w0_t[0] = hl32_to_64 (w0[0], w0[1]); + w0_t[1] = hl32_to_64 (w0[2], w0[3]); + w0_t[2] = hl32_to_64 (w1[0], w1[1]); + w0_t[3] = hl32_to_64 (w1[2], w1[3]); + w1_t[0] = hl32_to_64 (w2[0], w2[1]); + w1_t[1] = hl32_to_64 (w2[2], w2[3]); + w1_t[2] = hl32_to_64 (w3[0], w3[1]); + w1_t[3] = 0; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = hl32_to_64 (w3[2], w3[3]); + + digest[0] = ipad[0]; + digest[1] = ipad[1]; + digest[2] = ipad[2]; + digest[3] = ipad[3]; + digest[4] = ipad[4]; + digest[5] = ipad[5]; + digest[6] = ipad[6]; + digest[7] = ipad[7]; + + sha512_transform (w0_t, w1_t, w2_t, w3_t, digest); + + w0_t[0] = digest[0]; + w0_t[1] = digest[1]; + w0_t[2] = digest[2]; + w0_t[3] = digest[3]; + w1_t[0] = digest[4]; + w1_t[1] = digest[5]; + w1_t[2] = digest[6]; + w1_t[3] = digest[7]; + w2_t[0] = 0x8000000000000000; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = (128 + 64) * 8; + + digest[0] = opad[0]; + digest[1] = opad[1]; + digest[2] = opad[2]; + digest[3] = opad[3]; + digest[4] = opad[4]; + digest[5] = opad[5]; + digest[6] = opad[6]; + digest[7] = opad[7]; + + sha512_transform (w0_t, w1_t, w2_t, w3_t, digest); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m01760_m04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, combs_buf[0].pw_len); + } + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[ 1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[ 2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[ 3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[ 4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[ 5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[ 6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[ 7]; + + /** + * pads + */ + + u32x w0_t[4]; + + w0_t[0] = swap_workaround (salt_buf0[0]); + w0_t[1] = swap_workaround (salt_buf0[1]); + w0_t[2] = swap_workaround (salt_buf0[2]); + w0_t[3] = swap_workaround (salt_buf0[3]); + + u32x w1_t[4]; + + w1_t[0] = swap_workaround (salt_buf1[0]); + w1_t[1] = swap_workaround (salt_buf1[1]); + w1_t[2] = swap_workaround (salt_buf1[2]); + w1_t[3] = swap_workaround (salt_buf1[3]); + + u32x w2_t[4]; + + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + + u32x w3_t[4]; + + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = 0; + + u64x ipad[8]; + u64x opad[8]; + + hmac_sha512_pad (w0_t, w1_t, w2_t, w3_t, ipad, opad); + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = combs_buf[il_pos].pw_len; + + const u32 pw_len = pw_l_len + pw_r_len; + + u32 wordr0[4]; + + wordr0[0] = combs_buf[il_pos].i[0]; + wordr0[1] = combs_buf[il_pos].i[1]; + wordr0[2] = combs_buf[il_pos].i[2]; + wordr0[3] = combs_buf[il_pos].i[3]; + + u32 wordr1[4]; + + wordr1[0] = combs_buf[il_pos].i[4]; + wordr1[1] = combs_buf[il_pos].i[5]; + wordr1[2] = combs_buf[il_pos].i[6]; + wordr1[3] = combs_buf[il_pos].i[7]; + + u32 wordr2[4]; + + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + + u32 wordr3[4]; + + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + u32x w0[4]; + + w0[0] = wordl0[0] | wordr0[0]; + w0[1] = wordl0[1] | wordr0[1]; + w0[2] = wordl0[2] | wordr0[2]; + w0[3] = wordl0[3] | wordr0[3]; + + u32x w1[4]; + + w1[0] = wordl1[0] | wordr1[0]; + w1[1] = wordl1[1] | wordr1[1]; + w1[2] = wordl1[2] | wordr1[2]; + w1[3] = wordl1[3] | wordr1[3]; + + u32x w2[4]; + + w2[0] = wordl2[0] | wordr2[0]; + w2[1] = wordl2[1] | wordr2[1]; + w2[2] = wordl2[2] | wordr2[2]; + w2[3] = wordl2[3] | wordr2[3]; + + u32x w3[4]; + + w3[0] = wordl3[0] | wordr3[0]; + w3[1] = wordl3[1] | wordr3[1]; + w3[2] = 0; + w3[3] = 0; + + append_0x80_4 (w0, w1, w2, w3, pw_len); + + w0_t[0] = swap_workaround (w0[0]); + w0_t[1] = swap_workaround (w0[1]); + w0_t[2] = swap_workaround (w0[2]); + w0_t[3] = swap_workaround (w0[3]); + w1_t[0] = swap_workaround (w1[0]); + w1_t[1] = swap_workaround (w1[1]); + w1_t[2] = swap_workaround (w1[2]); + w1_t[3] = swap_workaround (w1[3]); + w2_t[0] = swap_workaround (w2[0]); + w2_t[1] = swap_workaround (w2[1]); + w2_t[2] = swap_workaround (w2[2]); + w2_t[3] = swap_workaround (w2[3]); + w3_t[0] = swap_workaround (w3[0]); + w3_t[1] = swap_workaround (w3[1]); + w3_t[2] = 0; + w3_t[3] = (128 + pw_len) * 8; + + u64x digest[8]; + + hmac_sha512_run (w0_t, w1_t, w2_t, w3_t, ipad, opad, digest); + + + const u32x r0 = l32_from_64 (digest[7]); + const u32x r1 = h32_from_64 (digest[7]); + const u32x r2 = l32_from_64 (digest[3]); + const u32x r3 = h32_from_64 (digest[3]); + + #include VECT_COMPARE_M + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m01760_m08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m01760_m16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m01760_s04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, combs_buf[0].pw_len); + } + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[ 1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[ 2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[ 3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[ 4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[ 5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[ 6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[ 7]; + + /** + * pads + */ + + u32x w0_t[4]; + + w0_t[0] = swap_workaround (salt_buf0[0]); + w0_t[1] = swap_workaround (salt_buf0[1]); + w0_t[2] = swap_workaround (salt_buf0[2]); + w0_t[3] = swap_workaround (salt_buf0[3]); + + u32x w1_t[4]; + + w1_t[0] = swap_workaround (salt_buf1[0]); + w1_t[1] = swap_workaround (salt_buf1[1]); + w1_t[2] = swap_workaround (salt_buf1[2]); + w1_t[3] = swap_workaround (salt_buf1[3]); + + u32x w2_t[4]; + + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + + u32x w3_t[4]; + + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = 0; + + u64x ipad[8]; + u64x opad[8]; + + hmac_sha512_pad (w0_t, w1_t, w2_t, w3_t, ipad, opad); + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = combs_buf[il_pos].pw_len; + + const u32 pw_len = pw_l_len + pw_r_len; + + u32 wordr0[4]; + + wordr0[0] = combs_buf[il_pos].i[0]; + wordr0[1] = combs_buf[il_pos].i[1]; + wordr0[2] = combs_buf[il_pos].i[2]; + wordr0[3] = combs_buf[il_pos].i[3]; + + u32 wordr1[4]; + + wordr1[0] = combs_buf[il_pos].i[4]; + wordr1[1] = combs_buf[il_pos].i[5]; + wordr1[2] = combs_buf[il_pos].i[6]; + wordr1[3] = combs_buf[il_pos].i[7]; + + u32 wordr2[4]; + + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + + u32 wordr3[4]; + + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + u32x w0[4]; + + w0[0] = wordl0[0] | wordr0[0]; + w0[1] = wordl0[1] | wordr0[1]; + w0[2] = wordl0[2] | wordr0[2]; + w0[3] = wordl0[3] | wordr0[3]; + + u32x w1[4]; + + w1[0] = wordl1[0] | wordr1[0]; + w1[1] = wordl1[1] | wordr1[1]; + w1[2] = wordl1[2] | wordr1[2]; + w1[3] = wordl1[3] | wordr1[3]; + + u32x w2[4]; + + w2[0] = wordl2[0] | wordr2[0]; + w2[1] = wordl2[1] | wordr2[1]; + w2[2] = wordl2[2] | wordr2[2]; + w2[3] = wordl2[3] | wordr2[3]; + + u32x w3[4]; + + w3[0] = wordl3[0] | wordr3[0]; + w3[1] = wordl3[1] | wordr3[1]; + w3[2] = 0; + w3[3] = 0; + + append_0x80_4 (w0, w1, w2, w3, pw_len); + + w0_t[0] = swap_workaround (w0[0]); + w0_t[1] = swap_workaround (w0[1]); + w0_t[2] = swap_workaround (w0[2]); + w0_t[3] = swap_workaround (w0[3]); + w1_t[0] = swap_workaround (w1[0]); + w1_t[1] = swap_workaround (w1[1]); + w1_t[2] = swap_workaround (w1[2]); + w1_t[3] = swap_workaround (w1[3]); + w2_t[0] = swap_workaround (w2[0]); + w2_t[1] = swap_workaround (w2[1]); + w2_t[2] = swap_workaround (w2[2]); + w2_t[3] = swap_workaround (w2[3]); + w3_t[0] = swap_workaround (w3[0]); + w3_t[1] = swap_workaround (w3[1]); + w3_t[2] = 0; + w3_t[3] = (128 + pw_len) * 8; + + u64x digest[8]; + + hmac_sha512_run (w0_t, w1_t, w2_t, w3_t, ipad, opad, digest); + + + const u32x r0 = l32_from_64 (digest[7]); + const u32x r1 = h32_from_64 (digest[7]); + const u32x r2 = l32_from_64 (digest[3]); + const u32x r3 = h32_from_64 (digest[3]); + + #include VECT_COMPARE_S + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m01760_s08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m01760_s16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/amd/m01760_a3.cl b/amd/m01760_a3.cl new file mode 100644 index 0000000000..9a1e0ea0f3 --- /dev/null +++ b/amd/m01760_a3.cl @@ -0,0 +1,791 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _SHA512_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW4 +#define VECT_SIZE1 +#endif + +#ifdef VLIW5 +#define VECT_SIZE1 +#endif + +#define DGST_R0 14 +#define DGST_R1 15 +#define DGST_R2 6 +#define DGST_R3 7 + +#include "include/kernel_functions.c" +#include "types_amd.c" +#include "common_amd.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +__constant u64 k_sha512[80] = +{ + SHA512C00, SHA512C01, SHA512C02, SHA512C03, + SHA512C04, SHA512C05, SHA512C06, SHA512C07, + SHA512C08, SHA512C09, SHA512C0a, SHA512C0b, + SHA512C0c, SHA512C0d, SHA512C0e, SHA512C0f, + SHA512C10, SHA512C11, SHA512C12, SHA512C13, + SHA512C14, SHA512C15, SHA512C16, SHA512C17, + SHA512C18, SHA512C19, SHA512C1a, SHA512C1b, + SHA512C1c, SHA512C1d, SHA512C1e, SHA512C1f, + SHA512C20, SHA512C21, SHA512C22, SHA512C23, + SHA512C24, SHA512C25, SHA512C26, SHA512C27, + SHA512C28, SHA512C29, SHA512C2a, SHA512C2b, + SHA512C2c, SHA512C2d, SHA512C2e, SHA512C2f, + SHA512C30, SHA512C31, SHA512C32, SHA512C33, + SHA512C34, SHA512C35, SHA512C36, SHA512C37, + SHA512C38, SHA512C39, SHA512C3a, SHA512C3b, + SHA512C3c, SHA512C3d, SHA512C3e, SHA512C3f, + SHA512C40, SHA512C41, SHA512C42, SHA512C43, + SHA512C44, SHA512C45, SHA512C46, SHA512C47, + SHA512C48, SHA512C49, SHA512C4a, SHA512C4b, + SHA512C4c, SHA512C4d, SHA512C4e, SHA512C4f, +}; + +static void sha512_transform (const u64x w0[4], const u64x w1[4], const u64x w2[4], const u64x w3[4], u64x digest[8]) +{ + u64x w0_t = w0[0]; + u64x w1_t = w0[1]; + u64x w2_t = w0[2]; + u64x w3_t = w0[3]; + u64x w4_t = w1[0]; + u64x w5_t = w1[1]; + u64x w6_t = w1[2]; + u64x w7_t = w1[3]; + u64x w8_t = w2[0]; + u64x w9_t = w2[1]; + u64x wa_t = w2[2]; + u64x wb_t = w2[3]; + u64x wc_t = w3[0]; + u64x wd_t = w3[1]; + u64x we_t = w3[2]; + u64x wf_t = w3[3]; + + u64x a = digest[0]; + u64x b = digest[1]; + u64x c = digest[2]; + u64x d = digest[3]; + u64x e = digest[4]; + u64x f = digest[5]; + u64x g = digest[6]; + u64x h = digest[7]; + + #define ROUND_EXPAND() \ + { \ + w0_t = SHA512_EXPAND (we_t, w9_t, w1_t, w0_t); \ + w1_t = SHA512_EXPAND (wf_t, wa_t, w2_t, w1_t); \ + w2_t = SHA512_EXPAND (w0_t, wb_t, w3_t, w2_t); \ + w3_t = SHA512_EXPAND (w1_t, wc_t, w4_t, w3_t); \ + w4_t = SHA512_EXPAND (w2_t, wd_t, w5_t, w4_t); \ + w5_t = SHA512_EXPAND (w3_t, we_t, w6_t, w5_t); \ + w6_t = SHA512_EXPAND (w4_t, wf_t, w7_t, w6_t); \ + w7_t = SHA512_EXPAND (w5_t, w0_t, w8_t, w7_t); \ + w8_t = SHA512_EXPAND (w6_t, w1_t, w9_t, w8_t); \ + w9_t = SHA512_EXPAND (w7_t, w2_t, wa_t, w9_t); \ + wa_t = SHA512_EXPAND (w8_t, w3_t, wb_t, wa_t); \ + wb_t = SHA512_EXPAND (w9_t, w4_t, wc_t, wb_t); \ + wc_t = SHA512_EXPAND (wa_t, w5_t, wd_t, wc_t); \ + wd_t = SHA512_EXPAND (wb_t, w6_t, we_t, wd_t); \ + we_t = SHA512_EXPAND (wc_t, w7_t, wf_t, we_t); \ + wf_t = SHA512_EXPAND (wd_t, w8_t, w0_t, wf_t); \ + } + + #define ROUND_STEP(i) \ + { \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, a, b, c, d, e, f, g, h, w0_t, k_sha512[i + 0]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, h, a, b, c, d, e, f, g, w1_t, k_sha512[i + 1]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, g, h, a, b, c, d, e, f, w2_t, k_sha512[i + 2]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, f, g, h, a, b, c, d, e, w3_t, k_sha512[i + 3]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, e, f, g, h, a, b, c, d, w4_t, k_sha512[i + 4]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, d, e, f, g, h, a, b, c, w5_t, k_sha512[i + 5]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, c, d, e, f, g, h, a, b, w6_t, k_sha512[i + 6]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, b, c, d, e, f, g, h, a, w7_t, k_sha512[i + 7]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, a, b, c, d, e, f, g, h, w8_t, k_sha512[i + 8]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, h, a, b, c, d, e, f, g, w9_t, k_sha512[i + 9]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, g, h, a, b, c, d, e, f, wa_t, k_sha512[i + 10]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, f, g, h, a, b, c, d, e, wb_t, k_sha512[i + 11]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, e, f, g, h, a, b, c, d, wc_t, k_sha512[i + 12]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, d, e, f, g, h, a, b, c, wd_t, k_sha512[i + 13]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, c, d, e, f, g, h, a, b, we_t, k_sha512[i + 14]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, b, c, d, e, f, g, h, a, wf_t, k_sha512[i + 15]); \ + } + + ROUND_STEP (0); + + //#pragma unroll // kernel fails if used + for (int i = 16; i < 80; i += 16) + { + ROUND_EXPAND (); ROUND_STEP (i); + } + + digest[0] += a; + digest[1] += b; + digest[2] += c; + digest[3] += d; + digest[4] += e; + digest[5] += f; + digest[6] += g; + digest[7] += h; +} + +static void hmac_sha512_pad (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], u64x ipad[8], u64x opad[8]) +{ + u64x w0_t[4]; + u64x w1_t[4]; + u64x w2_t[4]; + u64x w3_t[4]; + + w0_t[0] = hl32_to_64 (w0[0], w0[1]) ^ 0x3636363636363636; + w0_t[1] = hl32_to_64 (w0[2], w0[3]) ^ 0x3636363636363636; + w0_t[2] = hl32_to_64 (w1[0], w1[1]) ^ 0x3636363636363636; + w0_t[3] = hl32_to_64 (w1[2], w1[3]) ^ 0x3636363636363636; + w1_t[0] = hl32_to_64 (w2[0], w2[1]) ^ 0x3636363636363636; + w1_t[1] = hl32_to_64 (w2[2], w2[3]) ^ 0x3636363636363636; + w1_t[2] = hl32_to_64 (w3[0], w3[1]) ^ 0x3636363636363636; + w1_t[3] = hl32_to_64 (w3[2], w3[3]) ^ 0x3636363636363636; + w2_t[0] = 0 ^ 0x3636363636363636; + w2_t[1] = 0 ^ 0x3636363636363636; + w2_t[2] = 0 ^ 0x3636363636363636; + w2_t[3] = 0 ^ 0x3636363636363636; + w3_t[0] = 0 ^ 0x3636363636363636; + w3_t[1] = 0 ^ 0x3636363636363636; + w3_t[2] = 0 ^ 0x3636363636363636; + w3_t[3] = 0 ^ 0x3636363636363636; + + ipad[0] = SHA512M_A; + ipad[1] = SHA512M_B; + ipad[2] = SHA512M_C; + ipad[3] = SHA512M_D; + ipad[4] = SHA512M_E; + ipad[5] = SHA512M_F; + ipad[6] = SHA512M_G; + ipad[7] = SHA512M_H; + + sha512_transform (w0_t, w1_t, w2_t, w3_t, ipad); + + w0_t[0] = hl32_to_64 (w0[0], w0[1]) ^ 0x5c5c5c5c5c5c5c5c; + w0_t[1] = hl32_to_64 (w0[2], w0[3]) ^ 0x5c5c5c5c5c5c5c5c; + w0_t[2] = hl32_to_64 (w1[0], w1[1]) ^ 0x5c5c5c5c5c5c5c5c; + w0_t[3] = hl32_to_64 (w1[2], w1[3]) ^ 0x5c5c5c5c5c5c5c5c; + w1_t[0] = hl32_to_64 (w2[0], w2[1]) ^ 0x5c5c5c5c5c5c5c5c; + w1_t[1] = hl32_to_64 (w2[2], w2[3]) ^ 0x5c5c5c5c5c5c5c5c; + w1_t[2] = hl32_to_64 (w3[0], w3[1]) ^ 0x5c5c5c5c5c5c5c5c; + w1_t[3] = hl32_to_64 (w3[2], w3[3]) ^ 0x5c5c5c5c5c5c5c5c; + w2_t[0] = 0 ^ 0x5c5c5c5c5c5c5c5c; + w2_t[1] = 0 ^ 0x5c5c5c5c5c5c5c5c; + w2_t[2] = 0 ^ 0x5c5c5c5c5c5c5c5c; + w2_t[3] = 0 ^ 0x5c5c5c5c5c5c5c5c; + w3_t[0] = 0 ^ 0x5c5c5c5c5c5c5c5c; + w3_t[1] = 0 ^ 0x5c5c5c5c5c5c5c5c; + w3_t[2] = 0 ^ 0x5c5c5c5c5c5c5c5c; + w3_t[3] = 0 ^ 0x5c5c5c5c5c5c5c5c; + + opad[0] = SHA512M_A; + opad[1] = SHA512M_B; + opad[2] = SHA512M_C; + opad[3] = SHA512M_D; + opad[4] = SHA512M_E; + opad[5] = SHA512M_F; + opad[6] = SHA512M_G; + opad[7] = SHA512M_H; + + sha512_transform (w0_t, w1_t, w2_t, w3_t, opad); +} + +static void hmac_sha512_run (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], u64x ipad[8], u64x opad[8], u64x digest[8]) +{ + u64x w0_t[4]; + u64x w1_t[4]; + u64x w2_t[4]; + u64x w3_t[4]; + + w0_t[0] = hl32_to_64 (w0[0], w0[1]); + w0_t[1] = hl32_to_64 (w0[2], w0[3]); + w0_t[2] = hl32_to_64 (w1[0], w1[1]); + w0_t[3] = hl32_to_64 (w1[2], w1[3]); + w1_t[0] = hl32_to_64 (w2[0], w2[1]); + w1_t[1] = hl32_to_64 (w2[2], w2[3]); + w1_t[2] = hl32_to_64 (w3[0], w3[1]); + w1_t[3] = 0; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = hl32_to_64 (w3[2], w3[3]); + + digest[0] = ipad[0]; + digest[1] = ipad[1]; + digest[2] = ipad[2]; + digest[3] = ipad[3]; + digest[4] = ipad[4]; + digest[5] = ipad[5]; + digest[6] = ipad[6]; + digest[7] = ipad[7]; + + sha512_transform (w0_t, w1_t, w2_t, w3_t, digest); + + w0_t[0] = digest[0]; + w0_t[1] = digest[1]; + w0_t[2] = digest[2]; + w0_t[3] = digest[3]; + w1_t[0] = digest[4]; + w1_t[1] = digest[5]; + w1_t[2] = digest[6]; + w1_t[3] = digest[7]; + w2_t[0] = 0x8000000000000000; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = (128 + 64) * 8; + + digest[0] = opad[0]; + digest[1] = opad[1]; + digest[2] = opad[2]; + digest[3] = opad[3]; + digest[4] = opad[4]; + digest[5] = opad[5]; + digest[6] = opad[6]; + digest[7] = opad[7]; + + sha512_transform (w0_t, w1_t, w2_t, w3_t, digest); +} + +static void m01760m (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], const u32 pw_len, __global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esal_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset) +{ + /** + * modifier + */ + + const u32 gid = get_global_id (0); + const u32 lid = get_local_id (0); + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[ 1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[ 2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[ 3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[ 4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[ 5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[ 6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[ 7]; + + /** + * pads + */ + + u32x w0_t[4]; + + w0_t[0] = swap_workaround (salt_buf0[0]); + w0_t[1] = swap_workaround (salt_buf0[1]); + w0_t[2] = swap_workaround (salt_buf0[2]); + w0_t[3] = swap_workaround (salt_buf0[3]); + + u32x w1_t[4]; + + w1_t[0] = swap_workaround (salt_buf1[0]); + w1_t[1] = swap_workaround (salt_buf1[1]); + w1_t[2] = swap_workaround (salt_buf1[2]); + w1_t[3] = swap_workaround (salt_buf1[3]); + + u32x w2_t[4]; + + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + + u32x w3_t[4]; + + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = 0; + + u64x ipad[8]; + u64x opad[8]; + + hmac_sha512_pad (w0_t, w1_t, w2_t, w3_t, ipad, opad); + + /** + * loop + */ + + u32x w0l = w0[0]; + + for (u32 il_pos = 0; il_pos < bfs_cnt; il_pos++) + { + const u32 w0r = bfs_buf[il_pos].i; + + w0[0] = w0l | w0r; + + w0_t[0] = w0[0]; + w0_t[1] = w0[1]; + w0_t[2] = w0[2]; + w0_t[3] = w0[3]; + w1_t[0] = w1[0]; + w1_t[1] = w1[1]; + w1_t[2] = w1[2]; + w1_t[3] = w1[3]; + w2_t[0] = w2[0]; + w2_t[1] = w2[1]; + w2_t[2] = w2[2]; + w2_t[3] = w2[3]; + w3_t[0] = w3[0]; + w3_t[1] = w3[1]; + w3_t[2] = 0; + w3_t[3] = (128 + pw_len) * 8; + + u64x digest[8]; + + hmac_sha512_run (w0_t, w1_t, w2_t, w3_t, ipad, opad, digest); + + + const u32x r0 = l32_from_64 (digest[7]); + const u32x r1 = h32_from_64 (digest[7]); + const u32x r2 = l32_from_64 (digest[3]); + const u32x r3 = h32_from_64 (digest[3]); + + #include VECT_COMPARE_M + } +} + +static void m01760s (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], const u32 pw_len, __global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset) +{ + /** + * modifier + */ + + const u32 gid = get_global_id (0); + const u32 lid = get_local_id (0); + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[ 1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[ 2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[ 3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[ 4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[ 5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[ 6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[ 7]; + + /** + * pads + */ + + u32x w0_t[4]; + + w0_t[0] = swap_workaround (salt_buf0[0]); + w0_t[1] = swap_workaround (salt_buf0[1]); + w0_t[2] = swap_workaround (salt_buf0[2]); + w0_t[3] = swap_workaround (salt_buf0[3]); + + u32x w1_t[4]; + + w1_t[0] = swap_workaround (salt_buf1[0]); + w1_t[1] = swap_workaround (salt_buf1[1]); + w1_t[2] = swap_workaround (salt_buf1[2]); + w1_t[3] = swap_workaround (salt_buf1[3]); + + u32x w2_t[4]; + + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + + u32x w3_t[4]; + + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = 0; + + u64x ipad[8]; + u64x opad[8]; + + hmac_sha512_pad (w0_t, w1_t, w2_t, w3_t, ipad, opad); + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * loop + */ + + u32x w0l = w0[0]; + + for (u32 il_pos = 0; il_pos < bfs_cnt; il_pos++) + { + const u32 w0r = bfs_buf[il_pos].i; + + w0[0] = w0l | w0r; + + w0_t[0] = w0[0]; + w0_t[1] = w0[1]; + w0_t[2] = w0[2]; + w0_t[3] = w0[3]; + w1_t[0] = w1[0]; + w1_t[1] = w1[1]; + w1_t[2] = w1[2]; + w1_t[3] = w1[3]; + w2_t[0] = w2[0]; + w2_t[1] = w2[1]; + w2_t[2] = w2[2]; + w2_t[3] = w2[3]; + w3_t[0] = w3[0]; + w3_t[1] = w3[1]; + w3_t[2] = 0; + w3_t[3] = (128 + pw_len) * 8; + + u64x digest[8]; + + hmac_sha512_run (w0_t, w1_t, w2_t, w3_t, ipad, opad, digest); + + + const u32x r0 = l32_from_64 (digest[7]); + const u32x r1 = h32_from_64 (digest[7]); + const u32x r2 = l32_from_64 (digest[3]); + const u32x r3 = h32_from_64 (digest[3]); + + #include VECT_COMPARE_S + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m01760_m04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m01760m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m01760_m08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m01760m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m01760_m16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = pws[gid].i[ 8]; + w2[1] = pws[gid].i[ 9]; + w2[2] = pws[gid].i[10]; + w2[3] = pws[gid].i[11]; + + u32x w3[4]; + + w3[0] = pws[gid].i[12]; + w3[1] = pws[gid].i[13]; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m01760m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m01760_s04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m01760s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m01760_s08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m01760s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m01760_s16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = pws[gid].i[ 8]; + w2[1] = pws[gid].i[ 9]; + w2[2] = pws[gid].i[10]; + w2[3] = pws[gid].i[11]; + + u32x w3[4]; + + w3[0] = pws[gid].i[12]; + w3[1] = pws[gid].i[13]; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m01760s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} diff --git a/amd/m01800.cl b/amd/m01800.cl new file mode 100644 index 0000000000..a65ed52a80 --- /dev/null +++ b/amd/m01800.cl @@ -0,0 +1,635 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _SHA512_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW4 +#define VECT_SIZE1 +#endif + +#ifdef VLIW5 +#define VECT_SIZE1 +#endif + +#define DGST_R0 0 +#define DGST_R1 1 +#define DGST_R2 2 +#define DGST_R3 3 + +#include "include/kernel_functions.c" +#include "types_amd.c" +#include "common_amd.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#define PUTCHAR64_BE(a,p,c) ((u8 *)(a))[(p) ^ 7] = (u8) (c) +#define GETCHAR64_BE(a,p) ((u8 *)(a))[(p) ^ 7] + +typedef struct +{ + u64x state[8]; + u64x buf[16]; + int len; + +} sha512_ctx_t; + +__constant u64 k_sha512[80] = +{ + SHA512C00, SHA512C01, SHA512C02, SHA512C03, + SHA512C04, SHA512C05, SHA512C06, SHA512C07, + SHA512C08, SHA512C09, SHA512C0a, SHA512C0b, + SHA512C0c, SHA512C0d, SHA512C0e, SHA512C0f, + SHA512C10, SHA512C11, SHA512C12, SHA512C13, + SHA512C14, SHA512C15, SHA512C16, SHA512C17, + SHA512C18, SHA512C19, SHA512C1a, SHA512C1b, + SHA512C1c, SHA512C1d, SHA512C1e, SHA512C1f, + SHA512C20, SHA512C21, SHA512C22, SHA512C23, + SHA512C24, SHA512C25, SHA512C26, SHA512C27, + SHA512C28, SHA512C29, SHA512C2a, SHA512C2b, + SHA512C2c, SHA512C2d, SHA512C2e, SHA512C2f, + SHA512C30, SHA512C31, SHA512C32, SHA512C33, + SHA512C34, SHA512C35, SHA512C36, SHA512C37, + SHA512C38, SHA512C39, SHA512C3a, SHA512C3b, + SHA512C3c, SHA512C3d, SHA512C3e, SHA512C3f, + SHA512C40, SHA512C41, SHA512C42, SHA512C43, + SHA512C44, SHA512C45, SHA512C46, SHA512C47, + SHA512C48, SHA512C49, SHA512C4a, SHA512C4b, + SHA512C4c, SHA512C4d, SHA512C4e, SHA512C4f, +}; + +static void sha512_transform (const u64x w[16], u64x digest[8]) +{ + u64x w0_t = w[ 0]; + u64x w1_t = w[ 1]; + u64x w2_t = w[ 2]; + u64x w3_t = w[ 3]; + u64x w4_t = w[ 4]; + u64x w5_t = w[ 5]; + u64x w6_t = w[ 6]; + u64x w7_t = w[ 7]; + u64x w8_t = w[ 8]; + u64x w9_t = w[ 9]; + u64x wa_t = w[10]; + u64x wb_t = w[11]; + u64x wc_t = w[12]; + u64x wd_t = w[13]; + u64x we_t = w[14]; + u64x wf_t = w[15]; + + u64x a = digest[0]; + u64x b = digest[1]; + u64x c = digest[2]; + u64x d = digest[3]; + u64x e = digest[4]; + u64x f = digest[5]; + u64x g = digest[6]; + u64x h = digest[7]; + + #define ROUND_EXPAND() \ + { \ + w0_t = SHA512_EXPAND (we_t, w9_t, w1_t, w0_t); \ + w1_t = SHA512_EXPAND (wf_t, wa_t, w2_t, w1_t); \ + w2_t = SHA512_EXPAND (w0_t, wb_t, w3_t, w2_t); \ + w3_t = SHA512_EXPAND (w1_t, wc_t, w4_t, w3_t); \ + w4_t = SHA512_EXPAND (w2_t, wd_t, w5_t, w4_t); \ + w5_t = SHA512_EXPAND (w3_t, we_t, w6_t, w5_t); \ + w6_t = SHA512_EXPAND (w4_t, wf_t, w7_t, w6_t); \ + w7_t = SHA512_EXPAND (w5_t, w0_t, w8_t, w7_t); \ + w8_t = SHA512_EXPAND (w6_t, w1_t, w9_t, w8_t); \ + w9_t = SHA512_EXPAND (w7_t, w2_t, wa_t, w9_t); \ + wa_t = SHA512_EXPAND (w8_t, w3_t, wb_t, wa_t); \ + wb_t = SHA512_EXPAND (w9_t, w4_t, wc_t, wb_t); \ + wc_t = SHA512_EXPAND (wa_t, w5_t, wd_t, wc_t); \ + wd_t = SHA512_EXPAND (wb_t, w6_t, we_t, wd_t); \ + we_t = SHA512_EXPAND (wc_t, w7_t, wf_t, we_t); \ + wf_t = SHA512_EXPAND (wd_t, w8_t, w0_t, wf_t); \ + } + + #define ROUND_STEP(i) \ + { \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, a, b, c, d, e, f, g, h, w0_t, k_sha512[i + 0]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, h, a, b, c, d, e, f, g, w1_t, k_sha512[i + 1]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, g, h, a, b, c, d, e, f, w2_t, k_sha512[i + 2]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, f, g, h, a, b, c, d, e, w3_t, k_sha512[i + 3]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, e, f, g, h, a, b, c, d, w4_t, k_sha512[i + 4]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, d, e, f, g, h, a, b, c, w5_t, k_sha512[i + 5]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, c, d, e, f, g, h, a, b, w6_t, k_sha512[i + 6]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, b, c, d, e, f, g, h, a, w7_t, k_sha512[i + 7]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, a, b, c, d, e, f, g, h, w8_t, k_sha512[i + 8]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, h, a, b, c, d, e, f, g, w9_t, k_sha512[i + 9]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, g, h, a, b, c, d, e, f, wa_t, k_sha512[i + 10]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, f, g, h, a, b, c, d, e, wb_t, k_sha512[i + 11]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, e, f, g, h, a, b, c, d, wc_t, k_sha512[i + 12]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, d, e, f, g, h, a, b, c, wd_t, k_sha512[i + 13]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, c, d, e, f, g, h, a, b, we_t, k_sha512[i + 14]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, b, c, d, e, f, g, h, a, wf_t, k_sha512[i + 15]); \ + } + + ROUND_STEP (0); + + #pragma unroll + for (int i = 16; i < 80; i += 16) + { + ROUND_EXPAND (); ROUND_STEP (i); + } + + digest[0] += a; + digest[1] += b; + digest[2] += c; + digest[3] += d; + digest[4] += e; + digest[5] += f; + digest[6] += g; + digest[7] += h; +} + +static void sha512_transform_workaround (const u64x w[16], u64x digest[8]) +{ + u64x w0_t = w[ 0]; + u64x w1_t = w[ 1]; + u64x w2_t = w[ 2]; + u64x w3_t = w[ 3]; + u64x w4_t = w[ 4]; + u64x w5_t = w[ 5]; + u64x w6_t = w[ 6]; + u64x w7_t = w[ 7]; + u64x w8_t = w[ 8]; + u64x w9_t = w[ 9]; + u64x wa_t = w[10]; + u64x wb_t = w[11]; + u64x wc_t = w[12]; + u64x wd_t = w[13]; + u64x we_t = w[14]; + u64x wf_t = w[15]; + + u64x a = digest[0]; + u64x b = digest[1]; + u64x c = digest[2]; + u64x d = digest[3]; + u64x e = digest[4]; + u64x f = digest[5]; + u64x g = digest[6]; + u64x h = digest[7]; + + #define ROUND_EXPAND_WO() \ + { \ + w0_t = SHA512_EXPAND_WO (we_t, w9_t, w1_t, w0_t); \ + w1_t = SHA512_EXPAND_WO (wf_t, wa_t, w2_t, w1_t); \ + w2_t = SHA512_EXPAND_WO (w0_t, wb_t, w3_t, w2_t); \ + w3_t = SHA512_EXPAND_WO (w1_t, wc_t, w4_t, w3_t); \ + w4_t = SHA512_EXPAND_WO (w2_t, wd_t, w5_t, w4_t); \ + w5_t = SHA512_EXPAND_WO (w3_t, we_t, w6_t, w5_t); \ + w6_t = SHA512_EXPAND_WO (w4_t, wf_t, w7_t, w6_t); \ + w7_t = SHA512_EXPAND_WO (w5_t, w0_t, w8_t, w7_t); \ + w8_t = SHA512_EXPAND_WO (w6_t, w1_t, w9_t, w8_t); \ + w9_t = SHA512_EXPAND_WO (w7_t, w2_t, wa_t, w9_t); \ + wa_t = SHA512_EXPAND_WO (w8_t, w3_t, wb_t, wa_t); \ + wb_t = SHA512_EXPAND_WO (w9_t, w4_t, wc_t, wb_t); \ + wc_t = SHA512_EXPAND_WO (wa_t, w5_t, wd_t, wc_t); \ + wd_t = SHA512_EXPAND_WO (wb_t, w6_t, we_t, wd_t); \ + we_t = SHA512_EXPAND_WO (wc_t, w7_t, wf_t, we_t); \ + wf_t = SHA512_EXPAND_WO (wd_t, w8_t, w0_t, wf_t); \ + } + + ROUND_STEP (0); + + for (int i = 16; i < 80; i += 16) + { + ROUND_EXPAND_WO (); ROUND_STEP (i); + } + + digest[0] += a; + digest[1] += b; + digest[2] += c; + digest[3] += d; + digest[4] += e; + digest[5] += f; + digest[6] += g; + digest[7] += h; +} + +static void sha512_init (sha512_ctx_t *sha512_ctx) +{ + sha512_ctx->state[0] = SHA512M_A; + sha512_ctx->state[1] = SHA512M_B; + sha512_ctx->state[2] = SHA512M_C; + sha512_ctx->state[3] = SHA512M_D; + sha512_ctx->state[4] = SHA512M_E; + sha512_ctx->state[5] = SHA512M_F; + sha512_ctx->state[6] = SHA512M_G; + sha512_ctx->state[7] = SHA512M_H; + + sha512_ctx->len = 0; +} + +static void sha512_update (sha512_ctx_t *sha512_ctx, const u64x *buf, int len) +{ + int pos = sha512_ctx->len & 0x7f; + + sha512_ctx->len += len; + + if ((pos + len) < 128) + { + for (int i = 0; i < len; i++) + { + PUTCHAR64_BE (sha512_ctx->buf, pos++, GETCHAR64_BE (buf, i)); + } + + return; + } + + int cnt = 128 - pos; + + for (int i = 0; i < cnt; i++) + { + PUTCHAR64_BE (sha512_ctx->buf, pos++, GETCHAR64_BE (buf, i)); + } + + sha512_transform_workaround (sha512_ctx->buf, sha512_ctx->state); + + len -= cnt; + + for (int i = 0; i < len; i++) + { + PUTCHAR64_BE (sha512_ctx->buf, i, GETCHAR64_BE (buf, cnt + i)); + } +} + +static void sha512_final (sha512_ctx_t *sha512_ctx) +{ + int pos = sha512_ctx->len & 0x7f; + + for (int i = pos; i < 128; i++) + { + PUTCHAR64_BE (sha512_ctx->buf, i, 0); + } + + PUTCHAR64_BE (sha512_ctx->buf, pos, 0x80); + + if (pos >= 112) + { + sha512_transform (sha512_ctx->buf, sha512_ctx->state); + + sha512_ctx->buf[ 0] = 0; + sha512_ctx->buf[ 1] = 0; + sha512_ctx->buf[ 2] = 0; + sha512_ctx->buf[ 3] = 0; + sha512_ctx->buf[ 4] = 0; + sha512_ctx->buf[ 5] = 0; + sha512_ctx->buf[ 6] = 0; + sha512_ctx->buf[ 7] = 0; + sha512_ctx->buf[ 8] = 0; + sha512_ctx->buf[ 9] = 0; + sha512_ctx->buf[10] = 0; + sha512_ctx->buf[11] = 0; + sha512_ctx->buf[12] = 0; + sha512_ctx->buf[13] = 0; + sha512_ctx->buf[14] = 0; + sha512_ctx->buf[15] = 0; + } + + sha512_ctx->buf[15] = sha512_ctx->len * 8; + + sha512_transform (sha512_ctx->buf, sha512_ctx->state); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m01800_init (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global sha512crypt_tmp_t *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[0]; + w0[1] = pws[gid].i[1]; + w0[2] = pws[gid].i[2]; + w0[3] = pws[gid].i[3]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * salt + */ + + u32 salt_buf[4]; + + salt_buf[0] = salt_bufs[salt_pos].salt_buf[0]; + salt_buf[1] = salt_bufs[salt_pos].salt_buf[1]; + salt_buf[2] = salt_bufs[salt_pos].salt_buf[2]; + salt_buf[3] = salt_bufs[salt_pos].salt_buf[3]; + + u32 salt_len = salt_bufs[salt_pos].salt_len; + + /** + * buffers + */ + + u64x pw[2]; + + pw[0] = swap_workaround (hl32_to_64 (w0[1], w0[0])); + pw[1] = swap_workaround (hl32_to_64 (w0[3], w0[2])); + + u64x salt[2]; + + salt[0] = swap_workaround (hl32_to_64 (salt_buf[1], salt_buf[0])); + salt[1] = swap_workaround (hl32_to_64 (salt_buf[3], salt_buf[2])); + + /** + * begin + */ + + sha512_ctx_t sha512_ctx; + + sha512_init (&sha512_ctx); + + sha512_update (&sha512_ctx, pw, pw_len); + sha512_update (&sha512_ctx, salt, salt_len); + sha512_update (&sha512_ctx, pw, pw_len); + + sha512_final (&sha512_ctx); + + u64x tmp[8]; + + tmp[0] = sha512_ctx.state[0]; + tmp[1] = sha512_ctx.state[1]; + tmp[2] = sha512_ctx.state[2]; + tmp[3] = sha512_ctx.state[3]; + tmp[4] = sha512_ctx.state[4]; + tmp[5] = sha512_ctx.state[5]; + tmp[6] = sha512_ctx.state[6]; + tmp[7] = sha512_ctx.state[7]; + + sha512_init (&sha512_ctx); + + sha512_update (&sha512_ctx, pw, pw_len); + sha512_update (&sha512_ctx, salt, salt_len); + sha512_update (&sha512_ctx, tmp, pw_len); + + for (u32 j = pw_len; j; j >>= 1) + { + if (j & 1) + { + sha512_update (&sha512_ctx, tmp, 64); + } + else + { + sha512_update (&sha512_ctx, pw, pw_len); + } + } + + sha512_final (&sha512_ctx); + + tmps[gid].l_alt_result[0] = sha512_ctx.state[0]; + tmps[gid].l_alt_result[1] = sha512_ctx.state[1]; + tmps[gid].l_alt_result[2] = sha512_ctx.state[2]; + tmps[gid].l_alt_result[3] = sha512_ctx.state[3]; + tmps[gid].l_alt_result[4] = sha512_ctx.state[4]; + tmps[gid].l_alt_result[5] = sha512_ctx.state[5]; + tmps[gid].l_alt_result[6] = sha512_ctx.state[6]; + tmps[gid].l_alt_result[7] = sha512_ctx.state[7]; + + // p_bytes + + sha512_init (&sha512_ctx); + + for (u32 j = 0; j < pw_len; j++) + { + sha512_update (&sha512_ctx, pw, pw_len); + } + + sha512_final (&sha512_ctx); + + tmps[gid].l_p_bytes[0] = sha512_ctx.state[0]; + tmps[gid].l_p_bytes[1] = sha512_ctx.state[1]; + + // s_bytes + + sha512_init (&sha512_ctx); + + for (u32 j = 0; j < 16 + ((tmps[gid].l_alt_result[0] >> 56) & 0xff); j++) + { + sha512_update (&sha512_ctx, salt, salt_len); + } + + sha512_final (&sha512_ctx); + + tmps[gid].l_s_bytes[0] = sha512_ctx.state[0]; + tmps[gid].l_s_bytes[1] = sha512_ctx.state[1]; +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m01800_loop (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global sha512crypt_tmp_t *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u64x l_p_bytes0[2]; + + l_p_bytes0[0] = tmps[gid].l_p_bytes[0]; + l_p_bytes0[1] = tmps[gid].l_p_bytes[1]; + + const u32 pw_len = pws[gid].pw_len; + + u64x l_s_bytes0[2]; + + l_s_bytes0[0] = tmps[gid].l_s_bytes[0]; + l_s_bytes0[1] = tmps[gid].l_s_bytes[1]; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + u32 wpc_len[8]; + + wpc_len[0] = 64 + 0 + 0 + pw_len; + wpc_len[1] = pw_len + 0 + 0 + 64; + wpc_len[2] = 64 + salt_len + 0 + pw_len; + wpc_len[3] = pw_len + salt_len + 0 + 64; + wpc_len[4] = 64 + 0 + pw_len + pw_len; + wpc_len[5] = pw_len + 0 + pw_len + 64; + wpc_len[6] = 64 + salt_len + pw_len + pw_len; + wpc_len[7] = pw_len + salt_len + pw_len + 64; + + u64 wpc[8][16] = { 0 }; + + for (u32 i = 0; i < 8; i++) + { + u32 block_len = 0; + + if (i & 1) + { + for (u32 j = 0; j < pw_len; j++) + { + PUTCHAR64_BE (wpc[i], block_len++, GETCHAR64_BE (l_p_bytes0, j)); + } + } + else + { + block_len += 64; + } + + if (i & 2) + { + for (u32 j = 0; j < salt_len; j++) + { + PUTCHAR64_BE (wpc[i], block_len++, GETCHAR64_BE (l_s_bytes0, j)); + } + } + + if (i & 4) + { + for (u32 j = 0; j < pw_len; j++) + { + PUTCHAR64_BE (wpc[i], block_len++, GETCHAR64_BE (l_p_bytes0, j)); + } + } + + if (i & 1) + { + block_len += 64; + } + else + { + for (u32 j = 0; j < pw_len; j++) + { + PUTCHAR64_BE (wpc[i], block_len++, GETCHAR64_BE (l_p_bytes0, j)); + } + } + + PUTCHAR64_BE (wpc[i], block_len, 0x80); + + wpc[i][15] = block_len * 8; + } + + /** + * base + */ + + u64x l_alt_result[8]; + + l_alt_result[0] = tmps[gid].l_alt_result[0]; + l_alt_result[1] = tmps[gid].l_alt_result[1]; + l_alt_result[2] = tmps[gid].l_alt_result[2]; + l_alt_result[3] = tmps[gid].l_alt_result[3]; + l_alt_result[4] = tmps[gid].l_alt_result[4]; + l_alt_result[5] = tmps[gid].l_alt_result[5]; + l_alt_result[6] = tmps[gid].l_alt_result[6]; + l_alt_result[7] = tmps[gid].l_alt_result[7]; + + + /* Repeatedly run the collected hash value through SHA512 to burn + CPU cycles. */ + + for (u32 i = 0, j = loop_pos; i < loop_cnt; i++, j++) + { + const u32 j1 = (j & 1) ? 1 : 0; + const u32 j3 = (j % 3) ? 2 : 0; + const u32 j7 = (j % 7) ? 4 : 0; + + const u32 pc = j1 + j3 + j7; + + u64 block[16]; + + block[ 0] = wpc[pc][ 0]; + block[ 1] = wpc[pc][ 1]; + block[ 2] = wpc[pc][ 2]; + block[ 3] = wpc[pc][ 3]; + block[ 4] = wpc[pc][ 4]; + block[ 5] = wpc[pc][ 5]; + block[ 6] = wpc[pc][ 6]; + block[ 7] = wpc[pc][ 7]; + block[ 8] = wpc[pc][ 8]; + block[ 9] = wpc[pc][ 9]; + block[10] = wpc[pc][10]; + block[11] = wpc[pc][11]; + block[12] = wpc[pc][12]; + block[13] = wpc[pc][13]; + block[14] = wpc[pc][14]; + block[15] = wpc[pc][15]; + + if (j1) + { + const u32 block_len = wpc_len[pc]; + + #pragma unroll 64 + for (u32 k = 0, p = block_len - 64; k < 64; k++, p++) + { + PUTCHAR64_BE (block, p, GETCHAR64_BE (l_alt_result, k)); + } + } + else + { + block[0] = l_alt_result[0]; + block[1] = l_alt_result[1]; + block[2] = l_alt_result[2]; + block[3] = l_alt_result[3]; + block[4] = l_alt_result[4]; + block[5] = l_alt_result[5]; + block[6] = l_alt_result[6]; + block[7] = l_alt_result[7]; + } + + l_alt_result[0] = SHA512M_A; + l_alt_result[1] = SHA512M_B; + l_alt_result[2] = SHA512M_C; + l_alt_result[3] = SHA512M_D; + l_alt_result[4] = SHA512M_E; + l_alt_result[5] = SHA512M_F; + l_alt_result[6] = SHA512M_G; + l_alt_result[7] = SHA512M_H; + + sha512_transform (block, l_alt_result); + } + + tmps[gid].l_alt_result[0] = l_alt_result[0]; + tmps[gid].l_alt_result[1] = l_alt_result[1]; + tmps[gid].l_alt_result[2] = l_alt_result[2]; + tmps[gid].l_alt_result[3] = l_alt_result[3]; + tmps[gid].l_alt_result[4] = l_alt_result[4]; + tmps[gid].l_alt_result[5] = l_alt_result[5]; + tmps[gid].l_alt_result[6] = l_alt_result[6]; + tmps[gid].l_alt_result[7] = l_alt_result[7]; +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m01800_comp (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global sha512crypt_tmp_t *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + const u32 lid = get_local_id (0); + + const u64x a = swap_workaround (tmps[gid].l_alt_result[0]); + const u64x b = swap_workaround (tmps[gid].l_alt_result[1]); + + const u32x r0 = l32_from_64 (a); + const u32x r1 = h32_from_64 (a); + const u32x r2 = l32_from_64 (b); + const u32x r3 = h32_from_64 (b); + + #define il_pos 0 + + #include VECT_COMPARE_M +} diff --git a/amd/m02100.cl b/amd/m02100.cl new file mode 100644 index 0000000000..850817a6e3 --- /dev/null +++ b/amd/m02100.cl @@ -0,0 +1,629 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _DCC2_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW4 +#define VECT_SIZE2 +#endif + +#ifdef VLIW5 +#define VECT_SIZE2 +#endif + +#define DGST_R0 0 +#define DGST_R1 1 +#define DGST_R2 2 +#define DGST_R3 3 + +#include "include/kernel_functions.c" +#include "types_amd.c" +#include "common_amd.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +static void md4_transform (const u32x w0[4], const u32x w1[4], const u32x w2[4], const u32x w3[4], u32x digest[4]) +{ + u32x a = digest[0]; + u32x b = digest[1]; + u32x c = digest[2]; + u32x d = digest[3]; + + MD4_STEP (MD4_Fo, a, b, c, d, w0[0], MD4C00, MD4S00); + MD4_STEP (MD4_Fo, d, a, b, c, w0[1], MD4C00, MD4S01); + MD4_STEP (MD4_Fo, c, d, a, b, w0[2], MD4C00, MD4S02); + MD4_STEP (MD4_Fo, b, c, d, a, w0[3], MD4C00, MD4S03); + MD4_STEP (MD4_Fo, a, b, c, d, w1[0], MD4C00, MD4S00); + MD4_STEP (MD4_Fo, d, a, b, c, w1[1], MD4C00, MD4S01); + MD4_STEP (MD4_Fo, c, d, a, b, w1[2], MD4C00, MD4S02); + MD4_STEP (MD4_Fo, b, c, d, a, w1[3], MD4C00, MD4S03); + MD4_STEP (MD4_Fo, a, b, c, d, w2[0], MD4C00, MD4S00); + MD4_STEP (MD4_Fo, d, a, b, c, w2[1], MD4C00, MD4S01); + MD4_STEP (MD4_Fo, c, d, a, b, w2[2], MD4C00, MD4S02); + MD4_STEP (MD4_Fo, b, c, d, a, w2[3], MD4C00, MD4S03); + MD4_STEP (MD4_Fo, a, b, c, d, w3[0], MD4C00, MD4S00); + MD4_STEP (MD4_Fo, d, a, b, c, w3[1], MD4C00, MD4S01); + MD4_STEP (MD4_Fo, c, d, a, b, w3[2], MD4C00, MD4S02); + MD4_STEP (MD4_Fo, b, c, d, a, w3[3], MD4C00, MD4S03); + + MD4_STEP (MD4_Go, a, b, c, d, w0[0], MD4C01, MD4S10); + MD4_STEP (MD4_Go, d, a, b, c, w1[0], MD4C01, MD4S11); + MD4_STEP (MD4_Go, c, d, a, b, w2[0], MD4C01, MD4S12); + MD4_STEP (MD4_Go, b, c, d, a, w3[0], MD4C01, MD4S13); + MD4_STEP (MD4_Go, a, b, c, d, w0[1], MD4C01, MD4S10); + MD4_STEP (MD4_Go, d, a, b, c, w1[1], MD4C01, MD4S11); + MD4_STEP (MD4_Go, c, d, a, b, w2[1], MD4C01, MD4S12); + MD4_STEP (MD4_Go, b, c, d, a, w3[1], MD4C01, MD4S13); + MD4_STEP (MD4_Go, a, b, c, d, w0[2], MD4C01, MD4S10); + MD4_STEP (MD4_Go, d, a, b, c, w1[2], MD4C01, MD4S11); + MD4_STEP (MD4_Go, c, d, a, b, w2[2], MD4C01, MD4S12); + MD4_STEP (MD4_Go, b, c, d, a, w3[2], MD4C01, MD4S13); + MD4_STEP (MD4_Go, a, b, c, d, w0[3], MD4C01, MD4S10); + MD4_STEP (MD4_Go, d, a, b, c, w1[3], MD4C01, MD4S11); + MD4_STEP (MD4_Go, c, d, a, b, w2[3], MD4C01, MD4S12); + MD4_STEP (MD4_Go, b, c, d, a, w3[3], MD4C01, MD4S13); + + MD4_STEP (MD4_H , a, b, c, d, w0[0], MD4C02, MD4S20); + MD4_STEP (MD4_H , d, a, b, c, w2[0], MD4C02, MD4S21); + MD4_STEP (MD4_H , c, d, a, b, w1[0], MD4C02, MD4S22); + MD4_STEP (MD4_H , b, c, d, a, w3[0], MD4C02, MD4S23); + MD4_STEP (MD4_H , a, b, c, d, w0[2], MD4C02, MD4S20); + MD4_STEP (MD4_H , d, a, b, c, w2[2], MD4C02, MD4S21); + MD4_STEP (MD4_H , c, d, a, b, w1[2], MD4C02, MD4S22); + MD4_STEP (MD4_H , b, c, d, a, w3[2], MD4C02, MD4S23); + MD4_STEP (MD4_H , a, b, c, d, w0[1], MD4C02, MD4S20); + MD4_STEP (MD4_H , d, a, b, c, w2[1], MD4C02, MD4S21); + MD4_STEP (MD4_H , c, d, a, b, w1[1], MD4C02, MD4S22); + MD4_STEP (MD4_H , b, c, d, a, w3[1], MD4C02, MD4S23); + MD4_STEP (MD4_H , a, b, c, d, w0[3], MD4C02, MD4S20); + MD4_STEP (MD4_H , d, a, b, c, w2[3], MD4C02, MD4S21); + MD4_STEP (MD4_H , c, d, a, b, w1[3], MD4C02, MD4S22); + MD4_STEP (MD4_H , b, c, d, a, w3[3], MD4C02, MD4S23); + + digest[0] += a; + digest[1] += b; + digest[2] += c; + digest[3] += d; +} + +static void sha1_transform (const u32x w0[4], const u32x w1[4], const u32x w2[4], const u32x w3[4], u32x digest[5]) +{ + u32x A = digest[0]; + u32x B = digest[1]; + u32x C = digest[2]; + u32x D = digest[3]; + u32x E = digest[4]; + + u32x w0_t = w0[0]; + u32x w1_t = w0[1]; + u32x w2_t = w0[2]; + u32x w3_t = w0[3]; + u32x w4_t = w1[0]; + u32x w5_t = w1[1]; + u32x w6_t = w1[2]; + u32x w7_t = w1[3]; + u32x w8_t = w2[0]; + u32x w9_t = w2[1]; + u32x wa_t = w2[2]; + u32x wb_t = w2[3]; + u32x wc_t = w3[0]; + u32x wd_t = w3[1]; + u32x we_t = w3[2]; + u32x wf_t = w3[3]; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, A, B, C, D, E, w0_t); + SHA1_STEP (SHA1_F0o, E, A, B, C, D, w1_t); + SHA1_STEP (SHA1_F0o, D, E, A, B, C, w2_t); + SHA1_STEP (SHA1_F0o, C, D, E, A, B, w3_t); + SHA1_STEP (SHA1_F0o, B, C, D, E, A, w4_t); + SHA1_STEP (SHA1_F0o, A, B, C, D, E, w5_t); + SHA1_STEP (SHA1_F0o, E, A, B, C, D, w6_t); + SHA1_STEP (SHA1_F0o, D, E, A, B, C, w7_t); + SHA1_STEP (SHA1_F0o, C, D, E, A, B, w8_t); + SHA1_STEP (SHA1_F0o, B, C, D, E, A, w9_t); + SHA1_STEP (SHA1_F0o, A, B, C, D, E, wa_t); + SHA1_STEP (SHA1_F0o, E, A, B, C, D, wb_t); + SHA1_STEP (SHA1_F0o, D, E, A, B, C, wc_t); + SHA1_STEP (SHA1_F0o, C, D, E, A, B, wd_t); + SHA1_STEP (SHA1_F0o, B, C, D, E, A, we_t); + SHA1_STEP (SHA1_F0o, A, B, C, D, E, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F0o, E, A, B, C, D, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F0o, D, E, A, B, C, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F0o, C, D, E, A, B, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F0o, B, C, D, E, A, w3_t); + + #undef K + #define K SHA1C01 + + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w7_t); + + #undef K + #define K SHA1C02 + + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, wb_t); + + #undef K + #define K SHA1C03 + + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, wf_t); + + digest[0] += A; + digest[1] += B; + digest[2] += C; + digest[3] += D; + digest[4] += E; +} + +static void hmac_sha1_pad (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], u32x ipad[5], u32x opad[5]) +{ + w0[0] = w0[0] ^ 0x36363636; + w0[1] = w0[1] ^ 0x36363636; + w0[2] = w0[2] ^ 0x36363636; + w0[3] = w0[3] ^ 0x36363636; + w1[0] = w1[0] ^ 0x36363636; + w1[1] = w1[1] ^ 0x36363636; + w1[2] = w1[2] ^ 0x36363636; + w1[3] = w1[3] ^ 0x36363636; + w2[0] = w2[0] ^ 0x36363636; + w2[1] = w2[1] ^ 0x36363636; + w2[2] = w2[2] ^ 0x36363636; + w2[3] = w2[3] ^ 0x36363636; + w3[0] = w3[0] ^ 0x36363636; + w3[1] = w3[1] ^ 0x36363636; + w3[2] = w3[2] ^ 0x36363636; + w3[3] = w3[3] ^ 0x36363636; + + ipad[0] = SHA1M_A; + ipad[1] = SHA1M_B; + ipad[2] = SHA1M_C; + ipad[3] = SHA1M_D; + ipad[4] = SHA1M_E; + + sha1_transform (w0, w1, w2, w3, ipad); + + w0[0] = w0[0] ^ 0x6a6a6a6a; + w0[1] = w0[1] ^ 0x6a6a6a6a; + w0[2] = w0[2] ^ 0x6a6a6a6a; + w0[3] = w0[3] ^ 0x6a6a6a6a; + w1[0] = w1[0] ^ 0x6a6a6a6a; + w1[1] = w1[1] ^ 0x6a6a6a6a; + w1[2] = w1[2] ^ 0x6a6a6a6a; + w1[3] = w1[3] ^ 0x6a6a6a6a; + w2[0] = w2[0] ^ 0x6a6a6a6a; + w2[1] = w2[1] ^ 0x6a6a6a6a; + w2[2] = w2[2] ^ 0x6a6a6a6a; + w2[3] = w2[3] ^ 0x6a6a6a6a; + w3[0] = w3[0] ^ 0x6a6a6a6a; + w3[1] = w3[1] ^ 0x6a6a6a6a; + w3[2] = w3[2] ^ 0x6a6a6a6a; + w3[3] = w3[3] ^ 0x6a6a6a6a; + + opad[0] = SHA1M_A; + opad[1] = SHA1M_B; + opad[2] = SHA1M_C; + opad[3] = SHA1M_D; + opad[4] = SHA1M_E; + + sha1_transform (w0, w1, w2, w3, opad); +} + +static void hmac_sha1_run (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], u32x ipad[5], u32x opad[5], u32x digest[5]) +{ + digest[0] = ipad[0]; + digest[1] = ipad[1]; + digest[2] = ipad[2]; + digest[3] = ipad[3]; + digest[4] = ipad[4]; + + sha1_transform (w0, w1, w2, w3, digest); + + w0[0] = digest[0]; + w0[1] = digest[1]; + w0[2] = digest[2]; + w0[3] = digest[3]; + w1[0] = digest[4]; + w1[1] = 0x80000000; + w1[2] = 0; + w1[3] = 0; + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = (64 + 20) * 8; + + digest[0] = opad[0]; + digest[1] = opad[1]; + digest[2] = opad[2]; + digest[3] = opad[3]; + digest[4] = opad[4]; + + sha1_transform (w0, w1, w2, w3, digest); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m02100_init (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global dcc2_tmp_t *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * salt + */ + + u32 salt_len = salt_bufs[salt_pos].salt_len; + + u32 salt_buf0[4]; + u32 salt_buf1[4]; + u32 salt_buf2[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[3]; + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[7]; + salt_buf2[0] = salt_bufs[salt_pos].salt_buf[8]; + salt_buf2[1] = salt_bufs[salt_pos].salt_buf[9]; + salt_buf2[2] = 0; + salt_buf2[3] = 0; + + /** + * generate dcc + */ + + append_0x80_1 (w0, pw_len); + + make_unicode (w0, w0, w1); + + w3[2] = pw_len * 2 * 8; + + u32x digest_md4[4]; + + digest_md4[0] = MD4M_A; + digest_md4[1] = MD4M_B; + digest_md4[2] = MD4M_C; + digest_md4[3] = MD4M_D; + + md4_transform (w0, w1, w2, w3, digest_md4); + + w0[0] = digest_md4[0]; + w0[1] = digest_md4[1]; + w0[2] = digest_md4[2]; + w0[3] = digest_md4[3]; + w1[0] = salt_buf0[0]; + w1[1] = salt_buf0[1]; + w1[2] = salt_buf0[2]; + w1[3] = salt_buf0[3]; + w2[0] = salt_buf1[0]; + w2[1] = salt_buf1[1]; + w2[2] = salt_buf1[2]; + w2[3] = salt_buf1[3]; + w3[0] = salt_buf2[0]; + w3[1] = salt_buf2[1]; + w3[2] = (16 + salt_len) * 8; + w3[3] = 0; + + append_0x80_4 (w0, w1, w2, w3, 16 + salt_len); + + digest_md4[0] = MD4M_A; + digest_md4[1] = MD4M_B; + digest_md4[2] = MD4M_C; + digest_md4[3] = MD4M_D; + + md4_transform (w0, w1, w2, w3, digest_md4); + + /** + * pads + */ + + w0[0] = swap_workaround (digest_md4[0]); + w0[1] = swap_workaround (digest_md4[1]); + w0[2] = swap_workaround (digest_md4[2]); + w0[3] = swap_workaround (digest_md4[3]); + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + u32x ipad[5]; + u32x opad[5]; + + hmac_sha1_pad (w0, w1, w2, w3, ipad, opad); + + tmps[gid].ipad[0] = ipad[0]; + tmps[gid].ipad[1] = ipad[1]; + tmps[gid].ipad[2] = ipad[2]; + tmps[gid].ipad[3] = ipad[3]; + tmps[gid].ipad[4] = ipad[4]; + + tmps[gid].opad[0] = opad[0]; + tmps[gid].opad[1] = opad[1]; + tmps[gid].opad[2] = opad[2]; + tmps[gid].opad[3] = opad[3]; + tmps[gid].opad[4] = opad[4]; + + /** + * hmac1 + */ + + w0[0] = salt_buf0[0]; + w0[1] = salt_buf0[1]; + w0[2] = salt_buf0[2]; + w0[3] = salt_buf0[3]; + w1[0] = salt_buf1[0]; + w1[1] = salt_buf1[1]; + w1[2] = salt_buf1[2]; + w1[3] = salt_buf1[3]; + w2[0] = salt_buf2[0]; + w2[1] = salt_buf2[1]; + w2[2] = 0; + w2[3] = 0; + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = (64 + salt_len + 4) * 8; + + append_0x01_4 (w0, w1, w2, w3, salt_len + 3); + append_0x80_4 (w0, w1, w2, w3, salt_len + 4); + + w0[0] = swap_workaround (w0[0]); + w0[1] = swap_workaround (w0[1]); + w0[2] = swap_workaround (w0[2]); + w0[3] = swap_workaround (w0[3]); + w1[0] = swap_workaround (w1[0]); + w1[1] = swap_workaround (w1[1]); + w1[2] = swap_workaround (w1[2]); + w1[3] = swap_workaround (w1[3]); + w2[0] = swap_workaround (w2[0]); + w2[1] = swap_workaround (w2[1]); + w2[2] = swap_workaround (w2[2]); + w2[3] = swap_workaround (w2[3]); + w3[0] = swap_workaround (w3[0]); + w3[1] = swap_workaround (w3[1]); + + u32x digest[5]; + + hmac_sha1_run (w0, w1, w2, w3, ipad, opad, digest); + + tmps[gid].dgst[0] = digest[0]; + tmps[gid].dgst[1] = digest[1]; + tmps[gid].dgst[2] = digest[2]; + tmps[gid].dgst[3] = digest[3]; + tmps[gid].dgst[4] = digest[4]; + + tmps[gid].out[0] = digest[0]; + tmps[gid].out[1] = digest[1]; + tmps[gid].out[2] = digest[2]; + tmps[gid].out[3] = digest[3]; +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m02100_loop (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global dcc2_tmp_t *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x ipad[5]; + u32x opad[5]; + + ipad[0] = tmps[gid].ipad[0]; + ipad[1] = tmps[gid].ipad[1]; + ipad[2] = tmps[gid].ipad[2]; + ipad[3] = tmps[gid].ipad[3]; + ipad[4] = tmps[gid].ipad[4]; + + opad[0] = tmps[gid].opad[0]; + opad[1] = tmps[gid].opad[1]; + opad[2] = tmps[gid].opad[2]; + opad[3] = tmps[gid].opad[3]; + opad[4] = tmps[gid].opad[4]; + + /** + * iter1 + */ + + u32x dgst[5]; + u32x out[4]; + + dgst[0] = tmps[gid].dgst[0]; + dgst[1] = tmps[gid].dgst[1]; + dgst[2] = tmps[gid].dgst[2]; + dgst[3] = tmps[gid].dgst[3]; + dgst[4] = tmps[gid].dgst[4]; + + out[0] = tmps[gid].out[0]; + out[1] = tmps[gid].out[1]; + out[2] = tmps[gid].out[2]; + out[3] = tmps[gid].out[3]; + + for (u32 i = 0; i < loop_cnt; i++) + { + u32x w0[4]; + u32x w1[4]; + u32x w2[4]; + u32x w3[4]; + + w0[0] = dgst[0]; + w0[1] = dgst[1]; + w0[2] = dgst[2]; + w0[3] = dgst[3]; + w1[0] = dgst[4]; + w1[1] = 0x80000000; + w1[2] = 0; + w1[3] = 0; + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = (64 + 20) * 8; + + hmac_sha1_run (w0, w1, w2, w3, ipad, opad, dgst); + + out[0] ^= dgst[0]; + out[1] ^= dgst[1]; + out[2] ^= dgst[2]; + out[3] ^= dgst[3]; + } + + tmps[gid].dgst[0] = dgst[0]; + tmps[gid].dgst[1] = dgst[1]; + tmps[gid].dgst[2] = dgst[2]; + tmps[gid].dgst[3] = dgst[3]; + tmps[gid].dgst[4] = dgst[4]; + + tmps[gid].out[0] = out[0]; + tmps[gid].out[1] = out[1]; + tmps[gid].out[2] = out[2]; + tmps[gid].out[3] = out[3]; +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m02100_comp (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global dcc2_tmp_t *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + const u32 lid = get_local_id (0); + + const u32x r0 = tmps[gid].out[DGST_R0]; + const u32x r1 = tmps[gid].out[DGST_R1]; + const u32x r2 = tmps[gid].out[DGST_R2]; + const u32x r3 = tmps[gid].out[DGST_R3]; + + #define il_pos 0 + + #include VECT_COMPARE_M +} diff --git a/amd/m02400_a0.cl b/amd/m02400_a0.cl new file mode 100644 index 0000000000..30fabd25a3 --- /dev/null +++ b/amd/m02400_a0.cl @@ -0,0 +1,390 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _MD5_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW4 +#define VECT_SIZE4 +#endif + +#ifdef VLIW5 +#define VECT_SIZE4 +#endif + +#define DGST_R0 0 +#define DGST_R1 3 +#define DGST_R2 2 +#define DGST_R3 1 + +#include "include/kernel_functions.c" +#include "types_amd.c" +#include "common_amd.c" +#include "include/rp_gpu.h" +#include "rp_amd.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m02400_m04 (__global pw_t *pws, __global gpu_rule_t * rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + + w0[0] = pw_buf0[0]; + w0[1] = pw_buf0[1]; + w0[2] = pw_buf0[2]; + w0[3] = pw_buf0[3]; + + u32x w1[4]; + + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 out_len = apply_rules (rules_buf[il_pos].cmds, w0, w1, pw_len); + + truncate_block (w0, out_len); + + w1[0] = 0x80; + w3[2] = 16 * 8; + + u32x tmp2; + + u32x a = MD5M_A; + u32x b = MD5M_B; + u32x c = MD5M_C; + u32x d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H1, a, b, c, d, w1[1], MD5C20, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w2[0], MD5C21, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w2[3], MD5C22, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w3[2], MD5C23, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w0[1], MD5C24, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w1[0], MD5C25, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w1[3], MD5C26, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w2[2], MD5C27, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w3[1], MD5C28, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w0[0], MD5C29, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w0[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w1[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w2[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w3[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w3[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w0[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1[0], MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w2[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2[1], MD5C3f, MD5S33); + + a &= 0x00ffffff; + d &= 0x00ffffff; + c &= 0x00ffffff; + b &= 0x00ffffff; + + const u32x r0 = a; + const u32x r1 = d; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_M + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m02400_m08 (__global pw_t *pws, __global gpu_rule_t * rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m02400_m16 (__global pw_t *pws, __global gpu_rule_t * rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m02400_s04 (__global pw_t *pws, __global gpu_rule_t * rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + + w0[0] = pw_buf0[0]; + w0[1] = pw_buf0[1]; + w0[2] = pw_buf0[2]; + w0[3] = pw_buf0[3]; + + u32x w1[4]; + + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 out_len = apply_rules (rules_buf[il_pos].cmds, w0, w1, pw_len); + + truncate_block (w0, out_len); + + w1[0] = 0x80; + w3[2] = 16 * 8; + + u32x tmp2; + + u32x a = MD5M_A; + u32x b = MD5M_B; + u32x c = MD5M_C; + u32x d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H1, a, b, c, d, w1[1], MD5C20, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w2[0], MD5C21, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w2[3], MD5C22, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w3[2], MD5C23, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w0[1], MD5C24, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w1[0], MD5C25, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w1[3], MD5C26, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w2[2], MD5C27, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w3[1], MD5C28, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w0[0], MD5C29, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w0[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w1[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w2[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w3[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w3[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w0[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1[0], MD5C3c, MD5S30); + + bool q_cond = allx ((a & 0x00ffffff) != search[0]); + + if (q_cond) continue; + + MD5_STEP (MD5_I , d, a, b, c, w2[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2[1], MD5C3f, MD5S33); + + a &= 0x00ffffff; + d &= 0x00ffffff; + c &= 0x00ffffff; + b &= 0x00ffffff; + + const u32x r0 = a; + const u32x r1 = d; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_S + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m02400_s08 (__global pw_t *pws, __global gpu_rule_t * rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m02400_s16 (__global pw_t *pws, __global gpu_rule_t * rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/amd/m02400_a1.cl b/amd/m02400_a1.cl new file mode 100644 index 0000000000..d70cd642a1 --- /dev/null +++ b/amd/m02400_a1.cl @@ -0,0 +1,510 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _MD5_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW4 +#define VECT_SIZE4 +#endif + +#ifdef VLIW5 +#define VECT_SIZE4 +#endif + +#define DGST_R0 0 +#define DGST_R1 3 +#define DGST_R2 2 +#define DGST_R3 1 + +#include "include/kernel_functions.c" +#include "types_amd.c" +#include "common_amd.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m02400_m04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, combs_buf[0].pw_len); + } + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = combs_buf[il_pos].pw_len; + + const u32 pw_len = pw_l_len + pw_r_len; + + u32 wordr0[4]; + + wordr0[0] = combs_buf[il_pos].i[0]; + wordr0[1] = combs_buf[il_pos].i[1]; + wordr0[2] = combs_buf[il_pos].i[2]; + wordr0[3] = combs_buf[il_pos].i[3]; + + u32 wordr1[4]; + + wordr1[0] = combs_buf[il_pos].i[4]; + wordr1[1] = combs_buf[il_pos].i[5]; + wordr1[2] = combs_buf[il_pos].i[6]; + wordr1[3] = combs_buf[il_pos].i[7]; + + u32 wordr2[4]; + + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + + u32 wordr3[4]; + + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + u32x w0[4]; + + w0[0] = wordl0[0] | wordr0[0]; + w0[1] = wordl0[1] | wordr0[1]; + w0[2] = wordl0[2] | wordr0[2]; + w0[3] = wordl0[3] | wordr0[3]; + + u32x w1[4]; + + w1[0] = wordl1[0] | wordr1[0]; + w1[1] = wordl1[1] | wordr1[1]; + w1[2] = wordl1[2] | wordr1[2]; + w1[3] = wordl1[3] | wordr1[3]; + + u32x w2[4]; + + w2[0] = wordl2[0] | wordr2[0]; + w2[1] = wordl2[1] | wordr2[1]; + w2[2] = wordl2[2] | wordr2[2]; + w2[3] = wordl2[3] | wordr2[3]; + + u32x w3[4]; + + w3[0] = wordl3[0] | wordr3[0]; + w3[1] = wordl3[1] | wordr3[1]; + w3[2] = 0; + w3[3] = 0; + + truncate_block (w0, pw_len); + + w1[0] = 0x80; + w3[2] = 16 * 8; + + u32x tmp2; + + u32x a = MD5M_A; + u32x b = MD5M_B; + u32x c = MD5M_C; + u32x d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H1, a, b, c, d, w1[1], MD5C20, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w2[0], MD5C21, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w2[3], MD5C22, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w3[2], MD5C23, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w0[1], MD5C24, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w1[0], MD5C25, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w1[3], MD5C26, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w2[2], MD5C27, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w3[1], MD5C28, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w0[0], MD5C29, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w0[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w1[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w2[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w3[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w3[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w0[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1[0], MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w2[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2[1], MD5C3f, MD5S33); + + a &= 0x00ffffff; + d &= 0x00ffffff; + c &= 0x00ffffff; + b &= 0x00ffffff; + + const u32x r0 = a; + const u32x r1 = d; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_M + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m02400_m08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m02400_m16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m02400_s04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, combs_buf[0].pw_len); + } + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = combs_buf[il_pos].pw_len; + + const u32 pw_len = pw_l_len + pw_r_len; + + u32 wordr0[4]; + + wordr0[0] = combs_buf[il_pos].i[0]; + wordr0[1] = combs_buf[il_pos].i[1]; + wordr0[2] = combs_buf[il_pos].i[2]; + wordr0[3] = combs_buf[il_pos].i[3]; + + u32 wordr1[4]; + + wordr1[0] = combs_buf[il_pos].i[4]; + wordr1[1] = combs_buf[il_pos].i[5]; + wordr1[2] = combs_buf[il_pos].i[6]; + wordr1[3] = combs_buf[il_pos].i[7]; + + u32 wordr2[4]; + + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + + u32 wordr3[4]; + + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + u32x w0[4]; + + w0[0] = wordl0[0] | wordr0[0]; + w0[1] = wordl0[1] | wordr0[1]; + w0[2] = wordl0[2] | wordr0[2]; + w0[3] = wordl0[3] | wordr0[3]; + + u32x w1[4]; + + w1[0] = wordl1[0] | wordr1[0]; + w1[1] = wordl1[1] | wordr1[1]; + w1[2] = wordl1[2] | wordr1[2]; + w1[3] = wordl1[3] | wordr1[3]; + + u32x w2[4]; + + w2[0] = wordl2[0] | wordr2[0]; + w2[1] = wordl2[1] | wordr2[1]; + w2[2] = wordl2[2] | wordr2[2]; + w2[3] = wordl2[3] | wordr2[3]; + + u32x w3[4]; + + w3[0] = wordl3[0] | wordr3[0]; + w3[1] = wordl3[1] | wordr3[1]; + w3[2] = 0; + w3[3] = 0; + + truncate_block (w0, pw_len); + + w1[0] = 0x80; + w3[2] = 16 * 8; + + u32x tmp2; + + u32x a = MD5M_A; + u32x b = MD5M_B; + u32x c = MD5M_C; + u32x d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H1, a, b, c, d, w1[1], MD5C20, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w2[0], MD5C21, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w2[3], MD5C22, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w3[2], MD5C23, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w0[1], MD5C24, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w1[0], MD5C25, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w1[3], MD5C26, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w2[2], MD5C27, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w3[1], MD5C28, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w0[0], MD5C29, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w0[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w1[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w2[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w3[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w3[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w0[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1[0], MD5C3c, MD5S30); + + bool q_cond = allx ((a & 0x00ffffff) != search[0]); + + if (q_cond) continue; + + MD5_STEP (MD5_I , d, a, b, c, w2[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2[1], MD5C3f, MD5S33); + + a &= 0x00ffffff; + d &= 0x00ffffff; + c &= 0x00ffffff; + b &= 0x00ffffff; + + const u32x r0 = a; + const u32x r1 = d; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_S + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m02400_s08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m02400_s16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/amd/m02400_a3.cl b/amd/m02400_a3.cl new file mode 100644 index 0000000000..bb8bd6c5e8 --- /dev/null +++ b/amd/m02400_a3.cl @@ -0,0 +1,537 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _MD5_ +#define _SCALAR_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW4 +#define VECT_SIZE4 +#endif + +#ifdef VLIW5 +#define VECT_SIZE4 +#endif + +#define DGST_R0 0 +#define DGST_R1 3 +#define DGST_R2 2 +#define DGST_R3 1 + +#include "include/kernel_functions.c" +#include "types_amd.c" +#include "common_amd.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4_warp.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4_warp.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4_warp.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4_warp.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4_warp.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4_warp.c" +#endif + +static void m02400m (u32 w[16], const u32 pw_len, __global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global u32x * words_buf_r, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset) +{ + /** + * modifier + */ + + const u32 gid = get_global_id (0); + const u32 lid = get_local_id (0); + + /** + * algorithm specific + */ + + w[ 4] = 0x80; + w[14] = 16 * 8; + + /** + * base + */ + + const u32 F_w0c00 = 0 + MD5C00; + const u32 F_w1c01 = w[ 1] + MD5C01; + const u32 F_w2c02 = w[ 2] + MD5C02; + const u32 F_w3c03 = w[ 3] + MD5C03; + const u32 F_w4c04 = w[ 4] + MD5C04; + const u32 F_w5c05 = w[ 5] + MD5C05; + const u32 F_w6c06 = w[ 6] + MD5C06; + const u32 F_w7c07 = w[ 7] + MD5C07; + const u32 F_w8c08 = w[ 8] + MD5C08; + const u32 F_w9c09 = w[ 9] + MD5C09; + const u32 F_wac0a = w[10] + MD5C0a; + const u32 F_wbc0b = w[11] + MD5C0b; + const u32 F_wcc0c = w[12] + MD5C0c; + const u32 F_wdc0d = w[13] + MD5C0d; + const u32 F_wec0e = w[14] + MD5C0e; + const u32 F_wfc0f = w[15] + MD5C0f; + + const u32 G_w1c10 = w[ 1] + MD5C10; + const u32 G_w6c11 = w[ 6] + MD5C11; + const u32 G_wbc12 = w[11] + MD5C12; + const u32 G_w0c13 = 0 + MD5C13; + const u32 G_w5c14 = w[ 5] + MD5C14; + const u32 G_wac15 = w[10] + MD5C15; + const u32 G_wfc16 = w[15] + MD5C16; + const u32 G_w4c17 = w[ 4] + MD5C17; + const u32 G_w9c18 = w[ 9] + MD5C18; + const u32 G_wec19 = w[14] + MD5C19; + const u32 G_w3c1a = w[ 3] + MD5C1a; + const u32 G_w8c1b = w[ 8] + MD5C1b; + const u32 G_wdc1c = w[13] + MD5C1c; + const u32 G_w2c1d = w[ 2] + MD5C1d; + const u32 G_w7c1e = w[ 7] + MD5C1e; + const u32 G_wcc1f = w[12] + MD5C1f; + + const u32 H_w5c20 = w[ 5] + MD5C20; + const u32 H_w8c21 = w[ 8] + MD5C21; + const u32 H_wbc22 = w[11] + MD5C22; + const u32 H_wec23 = w[14] + MD5C23; + const u32 H_w1c24 = w[ 1] + MD5C24; + const u32 H_w4c25 = w[ 4] + MD5C25; + const u32 H_w7c26 = w[ 7] + MD5C26; + const u32 H_wac27 = w[10] + MD5C27; + const u32 H_wdc28 = w[13] + MD5C28; + const u32 H_w0c29 = 0 + MD5C29; + const u32 H_w3c2a = w[ 3] + MD5C2a; + const u32 H_w6c2b = w[ 6] + MD5C2b; + const u32 H_w9c2c = w[ 9] + MD5C2c; + const u32 H_wcc2d = w[12] + MD5C2d; + const u32 H_wfc2e = w[15] + MD5C2e; + const u32 H_w2c2f = w[ 2] + MD5C2f; + + const u32 I_w0c30 = 0 + MD5C30; + const u32 I_w7c31 = w[ 7] + MD5C31; + const u32 I_wec32 = w[14] + MD5C32; + const u32 I_w5c33 = w[ 5] + MD5C33; + const u32 I_wcc34 = w[12] + MD5C34; + const u32 I_w3c35 = w[ 3] + MD5C35; + const u32 I_wac36 = w[10] + MD5C36; + const u32 I_w1c37 = w[ 1] + MD5C37; + const u32 I_w8c38 = w[ 8] + MD5C38; + const u32 I_wfc39 = w[15] + MD5C39; + const u32 I_w6c3a = w[ 6] + MD5C3a; + const u32 I_wdc3b = w[13] + MD5C3b; + const u32 I_w4c3c = w[ 4] + MD5C3c; + const u32 I_wbc3d = w[11] + MD5C3d; + const u32 I_w2c3e = w[ 2] + MD5C3e; + const u32 I_w9c3f = w[ 9] + MD5C3f; + + /** + * loop + */ + + const u32 bf_loops = ceil ((float) bfs_cnt / VECT_DIV); + + u32x w0l = w[0]; + + for (u32 il_pos = 0; il_pos < bf_loops; il_pos++) + { + const u32x w0r = words_buf_r[il_pos]; + + const u32x w0 = w0l | w0r; + + u32x tmp2; + + u32x a = MD5M_A; + u32x b = MD5M_B; + u32x c = MD5M_C; + u32x d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0, F_w0c00, MD5S00); + MD5_STEP0(MD5_Fo, d, a, b, c, F_w1c01, MD5S01); + MD5_STEP0(MD5_Fo, c, d, a, b, F_w2c02, MD5S02); + MD5_STEP0(MD5_Fo, b, c, d, a, F_w3c03, MD5S03); + MD5_STEP0(MD5_Fo, a, b, c, d, F_w4c04, MD5S00); + MD5_STEP0(MD5_Fo, d, a, b, c, F_w5c05, MD5S01); + MD5_STEP0(MD5_Fo, c, d, a, b, F_w6c06, MD5S02); + MD5_STEP0(MD5_Fo, b, c, d, a, F_w7c07, MD5S03); + MD5_STEP0(MD5_Fo, a, b, c, d, F_w8c08, MD5S00); + MD5_STEP0(MD5_Fo, d, a, b, c, F_w9c09, MD5S01); + MD5_STEP0(MD5_Fo, c, d, a, b, F_wac0a, MD5S02); + MD5_STEP0(MD5_Fo, b, c, d, a, F_wbc0b, MD5S03); + MD5_STEP0(MD5_Fo, a, b, c, d, F_wcc0c, MD5S00); + MD5_STEP0(MD5_Fo, d, a, b, c, F_wdc0d, MD5S01); + MD5_STEP0(MD5_Fo, c, d, a, b, F_wec0e, MD5S02); + MD5_STEP0(MD5_Fo, b, c, d, a, F_wfc0f, MD5S03); + + MD5_STEP0(MD5_Go, a, b, c, d, G_w1c10, MD5S10); + MD5_STEP0(MD5_Go, d, a, b, c, G_w6c11, MD5S11); + MD5_STEP0(MD5_Go, c, d, a, b, G_wbc12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0, G_w0c13, MD5S13); + MD5_STEP0(MD5_Go, a, b, c, d, G_w5c14, MD5S10); + MD5_STEP0(MD5_Go, d, a, b, c, G_wac15, MD5S11); + MD5_STEP0(MD5_Go, c, d, a, b, G_wfc16, MD5S12); + MD5_STEP0(MD5_Go, b, c, d, a, G_w4c17, MD5S13); + MD5_STEP0(MD5_Go, a, b, c, d, G_w9c18, MD5S10); + MD5_STEP0(MD5_Go, d, a, b, c, G_wec19, MD5S11); + MD5_STEP0(MD5_Go, c, d, a, b, G_w3c1a, MD5S12); + MD5_STEP0(MD5_Go, b, c, d, a, G_w8c1b, MD5S13); + MD5_STEP0(MD5_Go, a, b, c, d, G_wdc1c, MD5S10); + MD5_STEP0(MD5_Go, d, a, b, c, G_w2c1d, MD5S11); + MD5_STEP0(MD5_Go, c, d, a, b, G_w7c1e, MD5S12); + MD5_STEP0(MD5_Go, b, c, d, a, G_wcc1f, MD5S13); + + MD5_STEP0(MD5_H1, a, b, c, d, H_w5c20, MD5S20); + MD5_STEP0(MD5_H2, d, a, b, c, H_w8c21, MD5S21); + MD5_STEP0(MD5_H1, c, d, a, b, H_wbc22, MD5S22); + MD5_STEP0(MD5_H2, b, c, d, a, H_wec23, MD5S23); + MD5_STEP0(MD5_H1, a, b, c, d, H_w1c24, MD5S20); + MD5_STEP0(MD5_H2, d, a, b, c, H_w4c25, MD5S21); + MD5_STEP0(MD5_H1, c, d, a, b, H_w7c26, MD5S22); + MD5_STEP0(MD5_H2, b, c, d, a, H_wac27, MD5S23); + MD5_STEP0(MD5_H1, a, b, c, d, H_wdc28, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w0, H_w0c29, MD5S21); + MD5_STEP0(MD5_H1, c, d, a, b, H_w3c2a, MD5S22); + MD5_STEP0(MD5_H2, b, c, d, a, H_w6c2b, MD5S23); + MD5_STEP0(MD5_H1, a, b, c, d, H_w9c2c, MD5S20); + MD5_STEP0(MD5_H2, d, a, b, c, H_wcc2d, MD5S21); + MD5_STEP0(MD5_H1, c, d, a, b, H_wfc2e, MD5S22); + MD5_STEP0(MD5_H2, b, c, d, a, H_w2c2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0, I_w0c30, MD5S30); + MD5_STEP0(MD5_I , d, a, b, c, I_w7c31, MD5S31); + MD5_STEP0(MD5_I , c, d, a, b, I_wec32, MD5S32); + MD5_STEP0(MD5_I , b, c, d, a, I_w5c33, MD5S33); + MD5_STEP0(MD5_I , a, b, c, d, I_wcc34, MD5S30); + MD5_STEP0(MD5_I , d, a, b, c, I_w3c35, MD5S31); + MD5_STEP0(MD5_I , c, d, a, b, I_wac36, MD5S32); + MD5_STEP0(MD5_I , b, c, d, a, I_w1c37, MD5S33); + MD5_STEP0(MD5_I , a, b, c, d, I_w8c38, MD5S30); + MD5_STEP0(MD5_I , d, a, b, c, I_wfc39, MD5S31); + MD5_STEP0(MD5_I , c, d, a, b, I_w6c3a, MD5S32); + MD5_STEP0(MD5_I , b, c, d, a, I_wdc3b, MD5S33); + MD5_STEP0(MD5_I , a, b, c, d, I_w4c3c, MD5S30); + MD5_STEP0(MD5_I , d, a, b, c, I_wbc3d, MD5S31); + MD5_STEP0(MD5_I , c, d, a, b, I_w2c3e, MD5S32); + MD5_STEP0(MD5_I , b, c, d, a, I_w9c3f, MD5S33); + + a &= 0x00ffffff; + d &= 0x00ffffff; + c &= 0x00ffffff; + b &= 0x00ffffff; + + const u32x r0 = a; + const u32x r1 = d; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_M + } +} + +static void m02400s (u32 w[16], const u32 pw_len, __global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global u32x * words_buf_r, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset) +{ + /** + * modifier + */ + + const u32 gid = get_global_id (0); + const u32 lid = get_local_id (0); + + /** + * algorithm specific + */ + + w[ 4] = 0x80; + w[14] = 16 * 8; + + /** + * base + */ + + const u32 F_w0c00 = 0 + MD5C00; + const u32 F_w1c01 = w[ 1] + MD5C01; + const u32 F_w2c02 = w[ 2] + MD5C02; + const u32 F_w3c03 = w[ 3] + MD5C03; + const u32 F_w4c04 = w[ 4] + MD5C04; + const u32 F_w5c05 = w[ 5] + MD5C05; + const u32 F_w6c06 = w[ 6] + MD5C06; + const u32 F_w7c07 = w[ 7] + MD5C07; + const u32 F_w8c08 = w[ 8] + MD5C08; + const u32 F_w9c09 = w[ 9] + MD5C09; + const u32 F_wac0a = w[10] + MD5C0a; + const u32 F_wbc0b = w[11] + MD5C0b; + const u32 F_wcc0c = w[12] + MD5C0c; + const u32 F_wdc0d = w[13] + MD5C0d; + const u32 F_wec0e = w[14] + MD5C0e; + const u32 F_wfc0f = w[15] + MD5C0f; + + const u32 G_w1c10 = w[ 1] + MD5C10; + const u32 G_w6c11 = w[ 6] + MD5C11; + const u32 G_wbc12 = w[11] + MD5C12; + const u32 G_w0c13 = 0 + MD5C13; + const u32 G_w5c14 = w[ 5] + MD5C14; + const u32 G_wac15 = w[10] + MD5C15; + const u32 G_wfc16 = w[15] + MD5C16; + const u32 G_w4c17 = w[ 4] + MD5C17; + const u32 G_w9c18 = w[ 9] + MD5C18; + const u32 G_wec19 = w[14] + MD5C19; + const u32 G_w3c1a = w[ 3] + MD5C1a; + const u32 G_w8c1b = w[ 8] + MD5C1b; + const u32 G_wdc1c = w[13] + MD5C1c; + const u32 G_w2c1d = w[ 2] + MD5C1d; + const u32 G_w7c1e = w[ 7] + MD5C1e; + const u32 G_wcc1f = w[12] + MD5C1f; + + const u32 H_w5c20 = w[ 5] + MD5C20; + const u32 H_w8c21 = w[ 8] + MD5C21; + const u32 H_wbc22 = w[11] + MD5C22; + const u32 H_wec23 = w[14] + MD5C23; + const u32 H_w1c24 = w[ 1] + MD5C24; + const u32 H_w4c25 = w[ 4] + MD5C25; + const u32 H_w7c26 = w[ 7] + MD5C26; + const u32 H_wac27 = w[10] + MD5C27; + const u32 H_wdc28 = w[13] + MD5C28; + const u32 H_w0c29 = 0 + MD5C29; + const u32 H_w3c2a = w[ 3] + MD5C2a; + const u32 H_w6c2b = w[ 6] + MD5C2b; + const u32 H_w9c2c = w[ 9] + MD5C2c; + const u32 H_wcc2d = w[12] + MD5C2d; + const u32 H_wfc2e = w[15] + MD5C2e; + const u32 H_w2c2f = w[ 2] + MD5C2f; + + const u32 I_w0c30 = 0 + MD5C30; + const u32 I_w7c31 = w[ 7] + MD5C31; + const u32 I_wec32 = w[14] + MD5C32; + const u32 I_w5c33 = w[ 5] + MD5C33; + const u32 I_wcc34 = w[12] + MD5C34; + const u32 I_w3c35 = w[ 3] + MD5C35; + const u32 I_wac36 = w[10] + MD5C36; + const u32 I_w1c37 = w[ 1] + MD5C37; + const u32 I_w8c38 = w[ 8] + MD5C38; + const u32 I_wfc39 = w[15] + MD5C39; + const u32 I_w6c3a = w[ 6] + MD5C3a; + const u32 I_wdc3b = w[13] + MD5C3b; + const u32 I_w4c3c = w[ 4] + MD5C3c; + const u32 I_wbc3d = w[11] + MD5C3d; + const u32 I_w2c3e = w[ 2] + MD5C3e; + const u32 I_w9c3f = w[ 9] + MD5C3f; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * loop + */ + + const u32 bf_loops = ceil ((float) bfs_cnt / VECT_DIV); + + u32x w0l = w[0]; + + for (u32 il_pos = 0; il_pos < bf_loops; il_pos++) + { + const u32x w0r = words_buf_r[il_pos]; + + const u32x w0 = w0l | w0r; + + u32x tmp2; + + u32x a = MD5M_A; + u32x b = MD5M_B; + u32x c = MD5M_C; + u32x d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0, F_w0c00, MD5S00); + MD5_STEP0(MD5_Fo, d, a, b, c, F_w1c01, MD5S01); + MD5_STEP0(MD5_Fo, c, d, a, b, F_w2c02, MD5S02); + MD5_STEP0(MD5_Fo, b, c, d, a, F_w3c03, MD5S03); + MD5_STEP0(MD5_Fo, a, b, c, d, F_w4c04, MD5S00); + MD5_STEP0(MD5_Fo, d, a, b, c, F_w5c05, MD5S01); + MD5_STEP0(MD5_Fo, c, d, a, b, F_w6c06, MD5S02); + MD5_STEP0(MD5_Fo, b, c, d, a, F_w7c07, MD5S03); + MD5_STEP0(MD5_Fo, a, b, c, d, F_w8c08, MD5S00); + MD5_STEP0(MD5_Fo, d, a, b, c, F_w9c09, MD5S01); + MD5_STEP0(MD5_Fo, c, d, a, b, F_wac0a, MD5S02); + MD5_STEP0(MD5_Fo, b, c, d, a, F_wbc0b, MD5S03); + MD5_STEP0(MD5_Fo, a, b, c, d, F_wcc0c, MD5S00); + MD5_STEP0(MD5_Fo, d, a, b, c, F_wdc0d, MD5S01); + MD5_STEP0(MD5_Fo, c, d, a, b, F_wec0e, MD5S02); + MD5_STEP0(MD5_Fo, b, c, d, a, F_wfc0f, MD5S03); + + MD5_STEP0(MD5_Go, a, b, c, d, G_w1c10, MD5S10); + MD5_STEP0(MD5_Go, d, a, b, c, G_w6c11, MD5S11); + MD5_STEP0(MD5_Go, c, d, a, b, G_wbc12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0, G_w0c13, MD5S13); + MD5_STEP0(MD5_Go, a, b, c, d, G_w5c14, MD5S10); + MD5_STEP0(MD5_Go, d, a, b, c, G_wac15, MD5S11); + MD5_STEP0(MD5_Go, c, d, a, b, G_wfc16, MD5S12); + MD5_STEP0(MD5_Go, b, c, d, a, G_w4c17, MD5S13); + MD5_STEP0(MD5_Go, a, b, c, d, G_w9c18, MD5S10); + MD5_STEP0(MD5_Go, d, a, b, c, G_wec19, MD5S11); + MD5_STEP0(MD5_Go, c, d, a, b, G_w3c1a, MD5S12); + MD5_STEP0(MD5_Go, b, c, d, a, G_w8c1b, MD5S13); + MD5_STEP0(MD5_Go, a, b, c, d, G_wdc1c, MD5S10); + MD5_STEP0(MD5_Go, d, a, b, c, G_w2c1d, MD5S11); + MD5_STEP0(MD5_Go, c, d, a, b, G_w7c1e, MD5S12); + MD5_STEP0(MD5_Go, b, c, d, a, G_wcc1f, MD5S13); + + MD5_STEP0(MD5_H1, a, b, c, d, H_w5c20, MD5S20); + MD5_STEP0(MD5_H2, d, a, b, c, H_w8c21, MD5S21); + MD5_STEP0(MD5_H1, c, d, a, b, H_wbc22, MD5S22); + MD5_STEP0(MD5_H2, b, c, d, a, H_wec23, MD5S23); + MD5_STEP0(MD5_H1, a, b, c, d, H_w1c24, MD5S20); + MD5_STEP0(MD5_H2, d, a, b, c, H_w4c25, MD5S21); + MD5_STEP0(MD5_H1, c, d, a, b, H_w7c26, MD5S22); + MD5_STEP0(MD5_H2, b, c, d, a, H_wac27, MD5S23); + MD5_STEP0(MD5_H1, a, b, c, d, H_wdc28, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w0, H_w0c29, MD5S21); + MD5_STEP0(MD5_H1, c, d, a, b, H_w3c2a, MD5S22); + MD5_STEP0(MD5_H2, b, c, d, a, H_w6c2b, MD5S23); + MD5_STEP0(MD5_H1, a, b, c, d, H_w9c2c, MD5S20); + MD5_STEP0(MD5_H2, d, a, b, c, H_wcc2d, MD5S21); + MD5_STEP0(MD5_H1, c, d, a, b, H_wfc2e, MD5S22); + MD5_STEP0(MD5_H2, b, c, d, a, H_w2c2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0, I_w0c30, MD5S30); + MD5_STEP0(MD5_I , d, a, b, c, I_w7c31, MD5S31); + MD5_STEP0(MD5_I , c, d, a, b, I_wec32, MD5S32); + MD5_STEP0(MD5_I , b, c, d, a, I_w5c33, MD5S33); + MD5_STEP0(MD5_I , a, b, c, d, I_wcc34, MD5S30); + MD5_STEP0(MD5_I , d, a, b, c, I_w3c35, MD5S31); + MD5_STEP0(MD5_I , c, d, a, b, I_wac36, MD5S32); + MD5_STEP0(MD5_I , b, c, d, a, I_w1c37, MD5S33); + MD5_STEP0(MD5_I , a, b, c, d, I_w8c38, MD5S30); + MD5_STEP0(MD5_I , d, a, b, c, I_wfc39, MD5S31); + MD5_STEP0(MD5_I , c, d, a, b, I_w6c3a, MD5S32); + MD5_STEP0(MD5_I , b, c, d, a, I_wdc3b, MD5S33); + MD5_STEP0(MD5_I , a, b, c, d, I_w4c3c, MD5S30); + + bool q_cond = allx ((a & 0x00ffffff) != search[0]); + + if (q_cond) continue; + + MD5_STEP0(MD5_I , d, a, b, c, I_wbc3d, MD5S31); + MD5_STEP0(MD5_I , c, d, a, b, I_w2c3e, MD5S32); + MD5_STEP0(MD5_I , b, c, d, a, I_w9c3f, MD5S33); + + a &= 0x00ffffff; + d &= 0x00ffffff; + c &= 0x00ffffff; + b &= 0x00ffffff; + + const u32x r0 = a; + const u32x r1 = d; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_S + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m02400_m04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global u32x * words_buf_r, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32 w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = 0; + w[ 5] = 0; + w[ 6] = 0; + w[ 7] = 0; + w[ 8] = 0; + w[ 9] = 0; + w[10] = 0; + w[11] = 0; + w[12] = 0; + w[13] = 0; + w[14] = 0; + w[15] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m02400m (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m02400_m08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global u32x * words_buf_r, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m02400_m16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global u32x * words_buf_r, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m02400_s04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global u32x * words_buf_r, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32 w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = 0; + w[ 5] = 0; + w[ 6] = 0; + w[ 7] = 0; + w[ 8] = 0; + w[ 9] = 0; + w[10] = 0; + w[11] = 0; + w[12] = 0; + w[13] = 0; + w[14] = 0; + w[15] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m02400s (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m02400_s08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global u32x * words_buf_r, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m02400_s16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global u32x * words_buf_r, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/amd/m02410_a0.cl b/amd/m02410_a0.cl new file mode 100644 index 0000000000..edb4dff150 --- /dev/null +++ b/amd/m02410_a0.cl @@ -0,0 +1,498 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _MD5_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW4 +#define VECT_SIZE4 +#endif + +#ifdef VLIW5 +#define VECT_SIZE4 +#endif + +#define DGST_R0 0 +#define DGST_R1 3 +#define DGST_R2 2 +#define DGST_R3 1 + +#include "include/kernel_functions.c" +#include "types_amd.c" +#include "common_amd.c" +#include "include/rp_gpu.h" +#include "rp_amd.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m02410_m04 (__global pw_t *pws, __global gpu_rule_t * rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[0]; + salt_buf0[1] = 0; + salt_buf0[2] = 0; + salt_buf0[3] = 0; + + const u32 salt_len = (salt_bufs[salt_pos].salt_len < 4) ? salt_bufs[salt_pos].salt_len : 4; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + + w0[0] = pw_buf0[0]; + w0[1] = pw_buf0[1]; + w0[2] = pw_buf0[2]; + w0[3] = pw_buf0[3]; + + u32x w1[4]; + + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 out_len = apply_rules (rules_buf[il_pos].cmds, w0, w1, pw_len); + + /** + * append salt + */ + + u32 s0[4]; + + s0[0] = salt_buf0[0]; + s0[1] = salt_buf0[1]; + s0[2] = salt_buf0[2]; + s0[3] = salt_buf0[3]; + + u32 s1[4]; + + s1[0] = 0; + s1[1] = 0; + s1[2] = 0; + s1[3] = 0; + + u32 s2[4]; + + s2[0] = 0; + s2[1] = 0; + s2[2] = 0; + s2[3] = 0; + + u32 s3[4]; + + s3[0] = 0; + s3[1] = 0; + s3[2] = 0; + s3[3] = 0; + + switch_buffer_by_offset (s0, s1, s2, s3, out_len); + + w0[0] |= s0[0]; + w0[1] |= s0[1]; + w0[2] |= s0[2]; + w0[3] |= s0[3]; + + const u32 pw_salt_len = out_len + salt_len; + + truncate_block (w0, pw_salt_len); + + w1[0] = 0x80; + w3[2] = 16 * 8; + + u32x tmp2; + + u32x a = MD5M_A; + u32x b = MD5M_B; + u32x c = MD5M_C; + u32x d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H1, a, b, c, d, w1[1], MD5C20, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w2[0], MD5C21, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w2[3], MD5C22, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w3[2], MD5C23, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w0[1], MD5C24, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w1[0], MD5C25, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w1[3], MD5C26, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w2[2], MD5C27, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w3[1], MD5C28, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w0[0], MD5C29, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w0[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w1[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w2[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w3[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w3[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w0[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1[0], MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w2[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2[1], MD5C3f, MD5S33); + + a &= 0x00ffffff; + d &= 0x00ffffff; + c &= 0x00ffffff; + b &= 0x00ffffff; + + const u32x r0 = a; + const u32x r1 = d; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_M + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m02410_m08 (__global pw_t *pws, __global gpu_rule_t * rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m02410_m16 (__global pw_t *pws, __global gpu_rule_t * rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m02410_s04 (__global pw_t *pws, __global gpu_rule_t * rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[0]; + salt_buf0[1] = 0; + salt_buf0[2] = 0; + salt_buf0[3] = 0; + + const u32 salt_len = (salt_bufs[salt_pos].salt_len < 4) ? salt_bufs[salt_pos].salt_len : 4; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + + w0[0] = pw_buf0[0]; + w0[1] = pw_buf0[1]; + w0[2] = pw_buf0[2]; + w0[3] = pw_buf0[3]; + + u32x w1[4]; + + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 out_len = apply_rules (rules_buf[il_pos].cmds, w0, w1, pw_len); + + /** + * append salt + */ + + u32 s0[4]; + + s0[0] = salt_buf0[0]; + s0[1] = salt_buf0[1]; + s0[2] = salt_buf0[2]; + s0[3] = salt_buf0[3]; + + u32 s1[4]; + + s1[0] = 0; + s1[1] = 0; + s1[2] = 0; + s1[3] = 0; + + u32 s2[4]; + + s2[0] = 0; + s2[1] = 0; + s2[2] = 0; + s2[3] = 0; + + u32 s3[4]; + + s3[0] = 0; + s3[1] = 0; + s3[2] = 0; + s3[3] = 0; + + switch_buffer_by_offset (s0, s1, s2, s3, out_len); + + w0[0] |= s0[0]; + w0[1] |= s0[1]; + w0[2] |= s0[2]; + w0[3] |= s0[3]; + + const u32 pw_salt_len = out_len + salt_len; + + truncate_block (w0, pw_salt_len); + + w1[0] = 0x80; + w3[2] = 16 * 8; + + u32x tmp2; + + u32x a = MD5M_A; + u32x b = MD5M_B; + u32x c = MD5M_C; + u32x d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H1, a, b, c, d, w1[1], MD5C20, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w2[0], MD5C21, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w2[3], MD5C22, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w3[2], MD5C23, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w0[1], MD5C24, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w1[0], MD5C25, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w1[3], MD5C26, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w2[2], MD5C27, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w3[1], MD5C28, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w0[0], MD5C29, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w0[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w1[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w2[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w3[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w3[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w0[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1[0], MD5C3c, MD5S30); + + bool q_cond = allx ((a & 0x00ffffff) != search[0]); + + if (q_cond) continue; + + MD5_STEP (MD5_I , d, a, b, c, w2[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2[1], MD5C3f, MD5S33); + + a &= 0x00ffffff; + d &= 0x00ffffff; + c &= 0x00ffffff; + b &= 0x00ffffff; + + const u32x r0 = a; + const u32x r1 = d; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_S + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m02410_s08 (__global pw_t *pws, __global gpu_rule_t * rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m02410_s16 (__global pw_t *pws, __global gpu_rule_t * rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/amd/m02410_a1.cl b/amd/m02410_a1.cl new file mode 100644 index 0000000000..4e8d369510 --- /dev/null +++ b/amd/m02410_a1.cl @@ -0,0 +1,608 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _MD5_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW4 +#define VECT_SIZE4 +#endif + +#ifdef VLIW5 +#define VECT_SIZE4 +#endif + +#define DGST_R0 0 +#define DGST_R1 3 +#define DGST_R2 2 +#define DGST_R3 1 + +#include "include/kernel_functions.c" +#include "types_amd.c" +#include "common_amd.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m02410_m04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, combs_buf[0].pw_len); + } + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[0]; + salt_buf0[1] = 0; + salt_buf0[2] = 0; + salt_buf0[3] = 0; + + const u32 salt_len = (salt_bufs[salt_pos].salt_len < 4) ? salt_bufs[salt_pos].salt_len : 4; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = combs_buf[il_pos].pw_len; + + const u32 pw_len = pw_l_len + pw_r_len; + + u32 wordr0[4]; + + wordr0[0] = combs_buf[il_pos].i[0]; + wordr0[1] = combs_buf[il_pos].i[1]; + wordr0[2] = combs_buf[il_pos].i[2]; + wordr0[3] = combs_buf[il_pos].i[3]; + + u32 wordr1[4]; + + wordr1[0] = combs_buf[il_pos].i[4]; + wordr1[1] = combs_buf[il_pos].i[5]; + wordr1[2] = combs_buf[il_pos].i[6]; + wordr1[3] = combs_buf[il_pos].i[7]; + + u32 wordr2[4]; + + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + + u32 wordr3[4]; + + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + /** + * append salt + */ + + u32 s0[4]; + + s0[0] = salt_buf0[0]; + s0[1] = salt_buf0[1]; + s0[2] = salt_buf0[2]; + s0[3] = salt_buf0[3]; + + u32 s1[4]; + + s1[0] = 0; + s1[1] = 0; + s1[2] = 0; + s1[3] = 0; + + u32 s2[4]; + + s2[0] = 0; + s2[1] = 0; + s2[2] = 0; + s2[3] = 0; + + u32 s3[4]; + + s3[0] = 0; + s3[1] = 0; + s3[2] = 0; + s3[3] = 0; + + switch_buffer_by_offset (s0, s1, s2, s3, pw_len); + + const u32 pw_salt_len = pw_len + salt_len; + + u32x w0[4]; + + w0[0] = wordl0[0] | wordr0[0] | s0[0]; + w0[1] = wordl0[1] | wordr0[1] | s0[1]; + w0[2] = wordl0[2] | wordr0[2] | s0[2]; + w0[3] = wordl0[3] | wordr0[3] | s0[3]; + + u32x w1[4]; + + w1[0] = wordl1[0] | wordr1[0]; + w1[1] = wordl1[1] | wordr1[1]; + w1[2] = wordl1[2] | wordr1[2]; + w1[3] = wordl1[3] | wordr1[3]; + + u32x w2[4]; + + w2[0] = wordl2[0] | wordr2[0]; + w2[1] = wordl2[1] | wordr2[1]; + w2[2] = wordl2[2] | wordr2[2]; + w2[3] = wordl2[3] | wordr2[3]; + + u32x w3[4]; + + w3[0] = wordl3[0] | wordr3[0]; + w3[1] = wordl3[1] | wordr3[1]; + w3[2] = 0; + w3[3] = 0; + + truncate_block (w0, pw_salt_len); + + w1[0] = 0x80; + w3[2] = 16 * 8; + + u32x tmp2; + + u32x a = MD5M_A; + u32x b = MD5M_B; + u32x c = MD5M_C; + u32x d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H1, a, b, c, d, w1[1], MD5C20, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w2[0], MD5C21, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w2[3], MD5C22, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w3[2], MD5C23, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w0[1], MD5C24, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w1[0], MD5C25, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w1[3], MD5C26, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w2[2], MD5C27, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w3[1], MD5C28, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w0[0], MD5C29, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w0[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w1[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w2[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w3[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w3[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w0[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1[0], MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w2[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2[1], MD5C3f, MD5S33); + + a &= 0x00ffffff; + d &= 0x00ffffff; + c &= 0x00ffffff; + b &= 0x00ffffff; + + const u32x r0 = a; + const u32x r1 = d; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_M + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m02410_m08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m02410_m16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m02410_s04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, combs_buf[0].pw_len); + } + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[0]; + salt_buf0[1] = 0; + salt_buf0[2] = 0; + salt_buf0[3] = 0; + + const u32 salt_len = (salt_bufs[salt_pos].salt_len < 4) ? salt_bufs[salt_pos].salt_len : 4; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = combs_buf[il_pos].pw_len; + + const u32 pw_len = pw_l_len + pw_r_len; + + u32 wordr0[4]; + + wordr0[0] = combs_buf[il_pos].i[0]; + wordr0[1] = combs_buf[il_pos].i[1]; + wordr0[2] = combs_buf[il_pos].i[2]; + wordr0[3] = combs_buf[il_pos].i[3]; + + u32 wordr1[4]; + + wordr1[0] = combs_buf[il_pos].i[4]; + wordr1[1] = combs_buf[il_pos].i[5]; + wordr1[2] = combs_buf[il_pos].i[6]; + wordr1[3] = combs_buf[il_pos].i[7]; + + u32 wordr2[4]; + + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + + u32 wordr3[4]; + + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + /** + * append salt + */ + + u32 s0[4]; + + s0[0] = salt_buf0[0]; + s0[1] = salt_buf0[1]; + s0[2] = salt_buf0[2]; + s0[3] = salt_buf0[3]; + + u32 s1[4]; + + s1[0] = 0; + s1[1] = 0; + s1[2] = 0; + s1[3] = 0; + + u32 s2[4]; + + s2[0] = 0; + s2[1] = 0; + s2[2] = 0; + s2[3] = 0; + + u32 s3[4]; + + s3[0] = 0; + s3[1] = 0; + s3[2] = 0; + s3[3] = 0; + + switch_buffer_by_offset (s0, s1, s2, s3, pw_len); + + const u32 pw_salt_len = pw_len + salt_len; + + u32x w0[4]; + + w0[0] = wordl0[0] | wordr0[0] | s0[0]; + w0[1] = wordl0[1] | wordr0[1] | s0[1]; + w0[2] = wordl0[2] | wordr0[2] | s0[2]; + w0[3] = wordl0[3] | wordr0[3] | s0[3]; + + u32x w1[4]; + + w1[0] = wordl1[0] | wordr1[0]; + w1[1] = wordl1[1] | wordr1[1]; + w1[2] = wordl1[2] | wordr1[2]; + w1[3] = wordl1[3] | wordr1[3]; + + u32x w2[4]; + + w2[0] = wordl2[0] | wordr2[0]; + w2[1] = wordl2[1] | wordr2[1]; + w2[2] = wordl2[2] | wordr2[2]; + w2[3] = wordl2[3] | wordr2[3]; + + u32x w3[4]; + + w3[0] = wordl3[0] | wordr3[0]; + w3[1] = wordl3[1] | wordr3[1]; + w3[2] = 0; + w3[3] = 0; + + truncate_block (w0, pw_salt_len); + + w1[0] = 0x80; + w3[2] = 16 * 8; + + u32x tmp2; + + u32x a = MD5M_A; + u32x b = MD5M_B; + u32x c = MD5M_C; + u32x d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H1, a, b, c, d, w1[1], MD5C20, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w2[0], MD5C21, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w2[3], MD5C22, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w3[2], MD5C23, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w0[1], MD5C24, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w1[0], MD5C25, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w1[3], MD5C26, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w2[2], MD5C27, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w3[1], MD5C28, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w0[0], MD5C29, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w0[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w1[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w2[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w3[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w3[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w0[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1[0], MD5C3c, MD5S30); + + bool q_cond = allx ((a & 0x00ffffff) != search[0]); + + if (q_cond) continue; + + MD5_STEP (MD5_I , d, a, b, c, w2[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2[1], MD5C3f, MD5S33); + + a &= 0x00ffffff; + d &= 0x00ffffff; + c &= 0x00ffffff; + b &= 0x00ffffff; + + const u32x r0 = a; + const u32x r1 = d; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_S + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m02410_s08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m02410_s16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/amd/m02410_a3.cl b/amd/m02410_a3.cl new file mode 100644 index 0000000000..10f8d68ff4 --- /dev/null +++ b/amd/m02410_a3.cl @@ -0,0 +1,627 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _MD5_ +#define _SCALAR_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW4 +#define VECT_SIZE4 +#endif + +#ifdef VLIW5 +#define VECT_SIZE4 +#endif + +#define DGST_R0 0 +#define DGST_R1 3 +#define DGST_R2 2 +#define DGST_R3 1 + +#include "include/kernel_functions.c" +#include "types_amd.c" +#include "common_amd.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4_warp.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4_warp.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4_warp.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4_warp.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4_warp.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4_warp.c" +#endif + +static void m02410m (u32 w[16], const u32 pw_len, __global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global u32x * words_buf_r, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset) +{ + /** + * modifier + */ + + const u32 gid = get_global_id (0); + const u32 lid = get_local_id (0); + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; + salt_buf0[1] = 0; + salt_buf0[2] = 0; + salt_buf0[3] = 0; + + u32 salt_buf1[4]; + + salt_buf1[0] = 0; + salt_buf1[1] = 0; + salt_buf1[2] = 0; + salt_buf1[3] = 0; + + u32 salt_buf2[4]; + + salt_buf2[0] = 0; + salt_buf2[1] = 0; + salt_buf2[2] = 0; + salt_buf2[3] = 0; + + u32 salt_buf3[4]; + + salt_buf3[0] = 0; + salt_buf3[1] = 0; + salt_buf3[2] = 0; + salt_buf3[3] = 0; + + switch_buffer_by_offset (salt_buf0, salt_buf1, salt_buf2, salt_buf3, pw_len); + + w[0] |= salt_buf0[0]; + w[1] |= salt_buf0[1]; + w[2] |= salt_buf0[2]; + w[3] |= salt_buf0[3]; + + const u32 salt_len = (salt_bufs[salt_pos].salt_len < 4) ? salt_bufs[salt_pos].salt_len : 4; + + const u32 pw_salt_len = pw_len + salt_len; + + truncate_block (w, pw_salt_len); + + /** + * algorithm specific + */ + + w[ 4] = 0x80; + w[14] = 16 * 8; + + /** + * base + */ + + const u32 F_w0c00 = 0 + MD5C00; + const u32 F_w1c01 = w[ 1] + MD5C01; + const u32 F_w2c02 = w[ 2] + MD5C02; + const u32 F_w3c03 = w[ 3] + MD5C03; + const u32 F_w4c04 = w[ 4] + MD5C04; + const u32 F_w5c05 = w[ 5] + MD5C05; + const u32 F_w6c06 = w[ 6] + MD5C06; + const u32 F_w7c07 = w[ 7] + MD5C07; + const u32 F_w8c08 = w[ 8] + MD5C08; + const u32 F_w9c09 = w[ 9] + MD5C09; + const u32 F_wac0a = w[10] + MD5C0a; + const u32 F_wbc0b = w[11] + MD5C0b; + const u32 F_wcc0c = w[12] + MD5C0c; + const u32 F_wdc0d = w[13] + MD5C0d; + const u32 F_wec0e = w[14] + MD5C0e; + const u32 F_wfc0f = w[15] + MD5C0f; + + const u32 G_w1c10 = w[ 1] + MD5C10; + const u32 G_w6c11 = w[ 6] + MD5C11; + const u32 G_wbc12 = w[11] + MD5C12; + const u32 G_w0c13 = 0 + MD5C13; + const u32 G_w5c14 = w[ 5] + MD5C14; + const u32 G_wac15 = w[10] + MD5C15; + const u32 G_wfc16 = w[15] + MD5C16; + const u32 G_w4c17 = w[ 4] + MD5C17; + const u32 G_w9c18 = w[ 9] + MD5C18; + const u32 G_wec19 = w[14] + MD5C19; + const u32 G_w3c1a = w[ 3] + MD5C1a; + const u32 G_w8c1b = w[ 8] + MD5C1b; + const u32 G_wdc1c = w[13] + MD5C1c; + const u32 G_w2c1d = w[ 2] + MD5C1d; + const u32 G_w7c1e = w[ 7] + MD5C1e; + const u32 G_wcc1f = w[12] + MD5C1f; + + const u32 H_w5c20 = w[ 5] + MD5C20; + const u32 H_w8c21 = w[ 8] + MD5C21; + const u32 H_wbc22 = w[11] + MD5C22; + const u32 H_wec23 = w[14] + MD5C23; + const u32 H_w1c24 = w[ 1] + MD5C24; + const u32 H_w4c25 = w[ 4] + MD5C25; + const u32 H_w7c26 = w[ 7] + MD5C26; + const u32 H_wac27 = w[10] + MD5C27; + const u32 H_wdc28 = w[13] + MD5C28; + const u32 H_w0c29 = 0 + MD5C29; + const u32 H_w3c2a = w[ 3] + MD5C2a; + const u32 H_w6c2b = w[ 6] + MD5C2b; + const u32 H_w9c2c = w[ 9] + MD5C2c; + const u32 H_wcc2d = w[12] + MD5C2d; + const u32 H_wfc2e = w[15] + MD5C2e; + const u32 H_w2c2f = w[ 2] + MD5C2f; + + const u32 I_w0c30 = 0 + MD5C30; + const u32 I_w7c31 = w[ 7] + MD5C31; + const u32 I_wec32 = w[14] + MD5C32; + const u32 I_w5c33 = w[ 5] + MD5C33; + const u32 I_wcc34 = w[12] + MD5C34; + const u32 I_w3c35 = w[ 3] + MD5C35; + const u32 I_wac36 = w[10] + MD5C36; + const u32 I_w1c37 = w[ 1] + MD5C37; + const u32 I_w8c38 = w[ 8] + MD5C38; + const u32 I_wfc39 = w[15] + MD5C39; + const u32 I_w6c3a = w[ 6] + MD5C3a; + const u32 I_wdc3b = w[13] + MD5C3b; + const u32 I_w4c3c = w[ 4] + MD5C3c; + const u32 I_wbc3d = w[11] + MD5C3d; + const u32 I_w2c3e = w[ 2] + MD5C3e; + const u32 I_w9c3f = w[ 9] + MD5C3f; + + /** + * loop + */ + + const u32 bf_loops = ceil ((float) bfs_cnt / VECT_DIV); + + u32x w0l = w[0]; + + for (u32 il_pos = 0; il_pos < bf_loops; il_pos++) + { + const u32x w0r = words_buf_r[il_pos]; + + const u32x w0 = w0l | w0r; + + u32x tmp2; + + u32x a = MD5M_A; + u32x b = MD5M_B; + u32x c = MD5M_C; + u32x d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0, F_w0c00, MD5S00); + MD5_STEP0(MD5_Fo, d, a, b, c, F_w1c01, MD5S01); + MD5_STEP0(MD5_Fo, c, d, a, b, F_w2c02, MD5S02); + MD5_STEP0(MD5_Fo, b, c, d, a, F_w3c03, MD5S03); + MD5_STEP0(MD5_Fo, a, b, c, d, F_w4c04, MD5S00); + MD5_STEP0(MD5_Fo, d, a, b, c, F_w5c05, MD5S01); + MD5_STEP0(MD5_Fo, c, d, a, b, F_w6c06, MD5S02); + MD5_STEP0(MD5_Fo, b, c, d, a, F_w7c07, MD5S03); + MD5_STEP0(MD5_Fo, a, b, c, d, F_w8c08, MD5S00); + MD5_STEP0(MD5_Fo, d, a, b, c, F_w9c09, MD5S01); + MD5_STEP0(MD5_Fo, c, d, a, b, F_wac0a, MD5S02); + MD5_STEP0(MD5_Fo, b, c, d, a, F_wbc0b, MD5S03); + MD5_STEP0(MD5_Fo, a, b, c, d, F_wcc0c, MD5S00); + MD5_STEP0(MD5_Fo, d, a, b, c, F_wdc0d, MD5S01); + MD5_STEP0(MD5_Fo, c, d, a, b, F_wec0e, MD5S02); + MD5_STEP0(MD5_Fo, b, c, d, a, F_wfc0f, MD5S03); + + MD5_STEP0(MD5_Go, a, b, c, d, G_w1c10, MD5S10); + MD5_STEP0(MD5_Go, d, a, b, c, G_w6c11, MD5S11); + MD5_STEP0(MD5_Go, c, d, a, b, G_wbc12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0, G_w0c13, MD5S13); + MD5_STEP0(MD5_Go, a, b, c, d, G_w5c14, MD5S10); + MD5_STEP0(MD5_Go, d, a, b, c, G_wac15, MD5S11); + MD5_STEP0(MD5_Go, c, d, a, b, G_wfc16, MD5S12); + MD5_STEP0(MD5_Go, b, c, d, a, G_w4c17, MD5S13); + MD5_STEP0(MD5_Go, a, b, c, d, G_w9c18, MD5S10); + MD5_STEP0(MD5_Go, d, a, b, c, G_wec19, MD5S11); + MD5_STEP0(MD5_Go, c, d, a, b, G_w3c1a, MD5S12); + MD5_STEP0(MD5_Go, b, c, d, a, G_w8c1b, MD5S13); + MD5_STEP0(MD5_Go, a, b, c, d, G_wdc1c, MD5S10); + MD5_STEP0(MD5_Go, d, a, b, c, G_w2c1d, MD5S11); + MD5_STEP0(MD5_Go, c, d, a, b, G_w7c1e, MD5S12); + MD5_STEP0(MD5_Go, b, c, d, a, G_wcc1f, MD5S13); + + MD5_STEP0(MD5_H1, a, b, c, d, H_w5c20, MD5S20); + MD5_STEP0(MD5_H2, d, a, b, c, H_w8c21, MD5S21); + MD5_STEP0(MD5_H1, c, d, a, b, H_wbc22, MD5S22); + MD5_STEP0(MD5_H2, b, c, d, a, H_wec23, MD5S23); + MD5_STEP0(MD5_H1, a, b, c, d, H_w1c24, MD5S20); + MD5_STEP0(MD5_H2, d, a, b, c, H_w4c25, MD5S21); + MD5_STEP0(MD5_H1, c, d, a, b, H_w7c26, MD5S22); + MD5_STEP0(MD5_H2, b, c, d, a, H_wac27, MD5S23); + MD5_STEP0(MD5_H1, a, b, c, d, H_wdc28, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w0, H_w0c29, MD5S21); + MD5_STEP0(MD5_H1, c, d, a, b, H_w3c2a, MD5S22); + MD5_STEP0(MD5_H2, b, c, d, a, H_w6c2b, MD5S23); + MD5_STEP0(MD5_H1, a, b, c, d, H_w9c2c, MD5S20); + MD5_STEP0(MD5_H2, d, a, b, c, H_wcc2d, MD5S21); + MD5_STEP0(MD5_H1, c, d, a, b, H_wfc2e, MD5S22); + MD5_STEP0(MD5_H2, b, c, d, a, H_w2c2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0, I_w0c30, MD5S30); + MD5_STEP0(MD5_I , d, a, b, c, I_w7c31, MD5S31); + MD5_STEP0(MD5_I , c, d, a, b, I_wec32, MD5S32); + MD5_STEP0(MD5_I , b, c, d, a, I_w5c33, MD5S33); + MD5_STEP0(MD5_I , a, b, c, d, I_wcc34, MD5S30); + MD5_STEP0(MD5_I , d, a, b, c, I_w3c35, MD5S31); + MD5_STEP0(MD5_I , c, d, a, b, I_wac36, MD5S32); + MD5_STEP0(MD5_I , b, c, d, a, I_w1c37, MD5S33); + MD5_STEP0(MD5_I , a, b, c, d, I_w8c38, MD5S30); + MD5_STEP0(MD5_I , d, a, b, c, I_wfc39, MD5S31); + MD5_STEP0(MD5_I , c, d, a, b, I_w6c3a, MD5S32); + MD5_STEP0(MD5_I , b, c, d, a, I_wdc3b, MD5S33); + MD5_STEP0(MD5_I , a, b, c, d, I_w4c3c, MD5S30); + MD5_STEP0(MD5_I , d, a, b, c, I_wbc3d, MD5S31); + MD5_STEP0(MD5_I , c, d, a, b, I_w2c3e, MD5S32); + MD5_STEP0(MD5_I , b, c, d, a, I_w9c3f, MD5S33); + + a &= 0x00ffffff; + d &= 0x00ffffff; + c &= 0x00ffffff; + b &= 0x00ffffff; + + const u32x r0 = a; + const u32x r1 = d; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_M + } +} + +static void m02410s (u32 w[16], const u32 pw_len, __global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global u32x * words_buf_r, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset) +{ + /** + * modifier + */ + + const u32 gid = get_global_id (0); + const u32 lid = get_local_id (0); + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; + salt_buf0[1] = 0; + salt_buf0[2] = 0; + salt_buf0[3] = 0; + + u32 salt_buf1[4]; + + salt_buf1[0] = 0; + salt_buf1[1] = 0; + salt_buf1[2] = 0; + salt_buf1[3] = 0; + + u32 salt_buf2[4]; + + salt_buf2[0] = 0; + salt_buf2[1] = 0; + salt_buf2[2] = 0; + salt_buf2[3] = 0; + + u32 salt_buf3[4]; + + salt_buf3[0] = 0; + salt_buf3[1] = 0; + salt_buf3[2] = 0; + salt_buf3[3] = 0; + + switch_buffer_by_offset (salt_buf0, salt_buf1, salt_buf2, salt_buf3, pw_len); + + w[0] |= salt_buf0[0]; + w[1] |= salt_buf0[1]; + w[2] |= salt_buf0[2]; + w[3] |= salt_buf0[3]; + + const u32 salt_len = (salt_bufs[salt_pos].salt_len < 4) ? salt_bufs[salt_pos].salt_len : 4; + + const u32 pw_salt_len = pw_len + salt_len; + + truncate_block (w, pw_salt_len); + + /** + * algorithm specific + */ + + w[ 4] = 0x80; + w[14] = 16 * 8; + + /** + * base + */ + + const u32 F_w0c00 = 0 + MD5C00; + const u32 F_w1c01 = w[ 1] + MD5C01; + const u32 F_w2c02 = w[ 2] + MD5C02; + const u32 F_w3c03 = w[ 3] + MD5C03; + const u32 F_w4c04 = w[ 4] + MD5C04; + const u32 F_w5c05 = w[ 5] + MD5C05; + const u32 F_w6c06 = w[ 6] + MD5C06; + const u32 F_w7c07 = w[ 7] + MD5C07; + const u32 F_w8c08 = w[ 8] + MD5C08; + const u32 F_w9c09 = w[ 9] + MD5C09; + const u32 F_wac0a = w[10] + MD5C0a; + const u32 F_wbc0b = w[11] + MD5C0b; + const u32 F_wcc0c = w[12] + MD5C0c; + const u32 F_wdc0d = w[13] + MD5C0d; + const u32 F_wec0e = w[14] + MD5C0e; + const u32 F_wfc0f = w[15] + MD5C0f; + + const u32 G_w1c10 = w[ 1] + MD5C10; + const u32 G_w6c11 = w[ 6] + MD5C11; + const u32 G_wbc12 = w[11] + MD5C12; + const u32 G_w0c13 = 0 + MD5C13; + const u32 G_w5c14 = w[ 5] + MD5C14; + const u32 G_wac15 = w[10] + MD5C15; + const u32 G_wfc16 = w[15] + MD5C16; + const u32 G_w4c17 = w[ 4] + MD5C17; + const u32 G_w9c18 = w[ 9] + MD5C18; + const u32 G_wec19 = w[14] + MD5C19; + const u32 G_w3c1a = w[ 3] + MD5C1a; + const u32 G_w8c1b = w[ 8] + MD5C1b; + const u32 G_wdc1c = w[13] + MD5C1c; + const u32 G_w2c1d = w[ 2] + MD5C1d; + const u32 G_w7c1e = w[ 7] + MD5C1e; + const u32 G_wcc1f = w[12] + MD5C1f; + + const u32 H_w5c20 = w[ 5] + MD5C20; + const u32 H_w8c21 = w[ 8] + MD5C21; + const u32 H_wbc22 = w[11] + MD5C22; + const u32 H_wec23 = w[14] + MD5C23; + const u32 H_w1c24 = w[ 1] + MD5C24; + const u32 H_w4c25 = w[ 4] + MD5C25; + const u32 H_w7c26 = w[ 7] + MD5C26; + const u32 H_wac27 = w[10] + MD5C27; + const u32 H_wdc28 = w[13] + MD5C28; + const u32 H_w0c29 = 0 + MD5C29; + const u32 H_w3c2a = w[ 3] + MD5C2a; + const u32 H_w6c2b = w[ 6] + MD5C2b; + const u32 H_w9c2c = w[ 9] + MD5C2c; + const u32 H_wcc2d = w[12] + MD5C2d; + const u32 H_wfc2e = w[15] + MD5C2e; + const u32 H_w2c2f = w[ 2] + MD5C2f; + + const u32 I_w0c30 = 0 + MD5C30; + const u32 I_w7c31 = w[ 7] + MD5C31; + const u32 I_wec32 = w[14] + MD5C32; + const u32 I_w5c33 = w[ 5] + MD5C33; + const u32 I_wcc34 = w[12] + MD5C34; + const u32 I_w3c35 = w[ 3] + MD5C35; + const u32 I_wac36 = w[10] + MD5C36; + const u32 I_w1c37 = w[ 1] + MD5C37; + const u32 I_w8c38 = w[ 8] + MD5C38; + const u32 I_wfc39 = w[15] + MD5C39; + const u32 I_w6c3a = w[ 6] + MD5C3a; + const u32 I_wdc3b = w[13] + MD5C3b; + const u32 I_w4c3c = w[ 4] + MD5C3c; + const u32 I_wbc3d = w[11] + MD5C3d; + const u32 I_w2c3e = w[ 2] + MD5C3e; + const u32 I_w9c3f = w[ 9] + MD5C3f; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * loop + */ + + const u32 bf_loops = ceil ((float) bfs_cnt / VECT_DIV); + + u32x w0l = w[0]; + + for (u32 il_pos = 0; il_pos < bf_loops; il_pos++) + { + const u32x w0r = words_buf_r[il_pos]; + + const u32x w0 = w0l | w0r; + + u32x tmp2; + + u32x a = MD5M_A; + u32x b = MD5M_B; + u32x c = MD5M_C; + u32x d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0, F_w0c00, MD5S00); + MD5_STEP0(MD5_Fo, d, a, b, c, F_w1c01, MD5S01); + MD5_STEP0(MD5_Fo, c, d, a, b, F_w2c02, MD5S02); + MD5_STEP0(MD5_Fo, b, c, d, a, F_w3c03, MD5S03); + MD5_STEP0(MD5_Fo, a, b, c, d, F_w4c04, MD5S00); + MD5_STEP0(MD5_Fo, d, a, b, c, F_w5c05, MD5S01); + MD5_STEP0(MD5_Fo, c, d, a, b, F_w6c06, MD5S02); + MD5_STEP0(MD5_Fo, b, c, d, a, F_w7c07, MD5S03); + MD5_STEP0(MD5_Fo, a, b, c, d, F_w8c08, MD5S00); + MD5_STEP0(MD5_Fo, d, a, b, c, F_w9c09, MD5S01); + MD5_STEP0(MD5_Fo, c, d, a, b, F_wac0a, MD5S02); + MD5_STEP0(MD5_Fo, b, c, d, a, F_wbc0b, MD5S03); + MD5_STEP0(MD5_Fo, a, b, c, d, F_wcc0c, MD5S00); + MD5_STEP0(MD5_Fo, d, a, b, c, F_wdc0d, MD5S01); + MD5_STEP0(MD5_Fo, c, d, a, b, F_wec0e, MD5S02); + MD5_STEP0(MD5_Fo, b, c, d, a, F_wfc0f, MD5S03); + + MD5_STEP0(MD5_Go, a, b, c, d, G_w1c10, MD5S10); + MD5_STEP0(MD5_Go, d, a, b, c, G_w6c11, MD5S11); + MD5_STEP0(MD5_Go, c, d, a, b, G_wbc12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0, G_w0c13, MD5S13); + MD5_STEP0(MD5_Go, a, b, c, d, G_w5c14, MD5S10); + MD5_STEP0(MD5_Go, d, a, b, c, G_wac15, MD5S11); + MD5_STEP0(MD5_Go, c, d, a, b, G_wfc16, MD5S12); + MD5_STEP0(MD5_Go, b, c, d, a, G_w4c17, MD5S13); + MD5_STEP0(MD5_Go, a, b, c, d, G_w9c18, MD5S10); + MD5_STEP0(MD5_Go, d, a, b, c, G_wec19, MD5S11); + MD5_STEP0(MD5_Go, c, d, a, b, G_w3c1a, MD5S12); + MD5_STEP0(MD5_Go, b, c, d, a, G_w8c1b, MD5S13); + MD5_STEP0(MD5_Go, a, b, c, d, G_wdc1c, MD5S10); + MD5_STEP0(MD5_Go, d, a, b, c, G_w2c1d, MD5S11); + MD5_STEP0(MD5_Go, c, d, a, b, G_w7c1e, MD5S12); + MD5_STEP0(MD5_Go, b, c, d, a, G_wcc1f, MD5S13); + + MD5_STEP0(MD5_H1, a, b, c, d, H_w5c20, MD5S20); + MD5_STEP0(MD5_H2, d, a, b, c, H_w8c21, MD5S21); + MD5_STEP0(MD5_H1, c, d, a, b, H_wbc22, MD5S22); + MD5_STEP0(MD5_H2, b, c, d, a, H_wec23, MD5S23); + MD5_STEP0(MD5_H1, a, b, c, d, H_w1c24, MD5S20); + MD5_STEP0(MD5_H2, d, a, b, c, H_w4c25, MD5S21); + MD5_STEP0(MD5_H1, c, d, a, b, H_w7c26, MD5S22); + MD5_STEP0(MD5_H2, b, c, d, a, H_wac27, MD5S23); + MD5_STEP0(MD5_H1, a, b, c, d, H_wdc28, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w0, H_w0c29, MD5S21); + MD5_STEP0(MD5_H1, c, d, a, b, H_w3c2a, MD5S22); + MD5_STEP0(MD5_H2, b, c, d, a, H_w6c2b, MD5S23); + MD5_STEP0(MD5_H1, a, b, c, d, H_w9c2c, MD5S20); + MD5_STEP0(MD5_H2, d, a, b, c, H_wcc2d, MD5S21); + MD5_STEP0(MD5_H1, c, d, a, b, H_wfc2e, MD5S22); + MD5_STEP0(MD5_H2, b, c, d, a, H_w2c2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0, I_w0c30, MD5S30); + MD5_STEP0(MD5_I , d, a, b, c, I_w7c31, MD5S31); + MD5_STEP0(MD5_I , c, d, a, b, I_wec32, MD5S32); + MD5_STEP0(MD5_I , b, c, d, a, I_w5c33, MD5S33); + MD5_STEP0(MD5_I , a, b, c, d, I_wcc34, MD5S30); + MD5_STEP0(MD5_I , d, a, b, c, I_w3c35, MD5S31); + MD5_STEP0(MD5_I , c, d, a, b, I_wac36, MD5S32); + MD5_STEP0(MD5_I , b, c, d, a, I_w1c37, MD5S33); + MD5_STEP0(MD5_I , a, b, c, d, I_w8c38, MD5S30); + MD5_STEP0(MD5_I , d, a, b, c, I_wfc39, MD5S31); + MD5_STEP0(MD5_I , c, d, a, b, I_w6c3a, MD5S32); + MD5_STEP0(MD5_I , b, c, d, a, I_wdc3b, MD5S33); + MD5_STEP0(MD5_I , a, b, c, d, I_w4c3c, MD5S30); + + bool q_cond = allx ((a & 0x00ffffff) != search[0]); + + if (q_cond) continue; + + MD5_STEP0(MD5_I , d, a, b, c, I_wbc3d, MD5S31); + MD5_STEP0(MD5_I , c, d, a, b, I_w2c3e, MD5S32); + MD5_STEP0(MD5_I , b, c, d, a, I_w9c3f, MD5S33); + + a &= 0x00ffffff; + d &= 0x00ffffff; + c &= 0x00ffffff; + b &= 0x00ffffff; + + const u32x r0 = a; + const u32x r1 = d; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_S + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m02410_m04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global u32x * words_buf_r, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32 w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = 0; + w[ 5] = 0; + w[ 6] = 0; + w[ 7] = 0; + w[ 8] = 0; + w[ 9] = 0; + w[10] = 0; + w[11] = 0; + w[12] = 0; + w[13] = 0; + w[14] = 0; + w[15] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m02410m (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m02410_m08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global u32x * words_buf_r, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m02410_m16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global u32x * words_buf_r, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m02410_s04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global u32x * words_buf_r, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32 w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = 0; + w[ 5] = 0; + w[ 6] = 0; + w[ 7] = 0; + w[ 8] = 0; + w[ 9] = 0; + w[10] = 0; + w[11] = 0; + w[12] = 0; + w[13] = 0; + w[14] = 0; + w[15] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m02410s (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m02410_s08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global u32x * words_buf_r, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m02410_s16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global u32x * words_buf_r, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/amd/m02500.cl b/amd/m02500.cl new file mode 100644 index 0000000000..724f0e1006 --- /dev/null +++ b/amd/m02500.cl @@ -0,0 +1,924 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _WPA_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW4 +#define VECT_SIZE2 +#endif + +#ifdef VLIW5 +#define VECT_SIZE2 +#endif + +#define DGST_R0 0 +#define DGST_R1 1 +#define DGST_R2 2 +#define DGST_R3 3 + +#include "include/kernel_functions.c" +#include "types_amd.c" +#include "common_amd.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +static void md5_transform (const u32x w0[4], const u32x w1[4], const u32x w2[4], const u32x w3[4], u32x digest[4]) +{ + u32x a = digest[0]; + u32x b = digest[1]; + u32x c = digest[2]; + u32x d = digest[3]; + + u32x w0_t = w0[0]; + u32x w1_t = w0[1]; + u32x w2_t = w0[2]; + u32x w3_t = w0[3]; + u32x w4_t = w1[0]; + u32x w5_t = w1[1]; + u32x w6_t = w1[2]; + u32x w7_t = w1[3]; + u32x w8_t = w2[0]; + u32x w9_t = w2[1]; + u32x wa_t = w2[2]; + u32x wb_t = w2[3]; + u32x wc_t = w3[0]; + u32x wd_t = w3[1]; + u32x we_t = w3[2]; + u32x wf_t = w3[3]; + + u32x tmp2; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t, MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t, MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t, MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t, MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w4_t, MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w5_t, MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w6_t, MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w7_t, MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w8_t, MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w9_t, MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, wa_t, MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, wb_t, MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, wc_t, MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, wd_t, MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, we_t, MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, wf_t, MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w1_t, MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w6_t, MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, wb_t, MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t, MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w5_t, MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, wa_t, MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, wf_t, MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w4_t, MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w9_t, MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, we_t, MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t, MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w8_t, MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, wd_t, MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t, MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w7_t, MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, wc_t, MD5C1f, MD5S13); + + MD5_STEP (MD5_H1, a, b, c, d, w5_t, MD5C20, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w8_t, MD5C21, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, wb_t, MD5C22, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, we_t, MD5C23, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w1_t, MD5C24, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w4_t, MD5C25, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w7_t, MD5C26, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, wa_t, MD5C27, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, wd_t, MD5C28, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w0_t, MD5C29, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w3_t, MD5C2a, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w6_t, MD5C2b, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w9_t, MD5C2c, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, wc_t, MD5C2d, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, wf_t, MD5C2e, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w2_t, MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t, MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w7_t, MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, we_t, MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w5_t, MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, wc_t, MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t, MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, wa_t, MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t, MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w8_t, MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, wf_t, MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w6_t, MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, wd_t, MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w4_t, MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, wb_t, MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t, MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w9_t, MD5C3f, MD5S33); + + digest[0] += a; + digest[1] += b; + digest[2] += c; + digest[3] += d; +} + +static void hmac_md5_pad (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], u32x ipad[4], u32x opad[4]) +{ + w0[0] = w0[0] ^ 0x36363636; + w0[1] = w0[1] ^ 0x36363636; + w0[2] = w0[2] ^ 0x36363636; + w0[3] = w0[3] ^ 0x36363636; + w1[0] = w1[0] ^ 0x36363636; + w1[1] = w1[1] ^ 0x36363636; + w1[2] = w1[2] ^ 0x36363636; + w1[3] = w1[3] ^ 0x36363636; + w2[0] = w2[0] ^ 0x36363636; + w2[1] = w2[1] ^ 0x36363636; + w2[2] = w2[2] ^ 0x36363636; + w2[3] = w2[3] ^ 0x36363636; + w3[0] = w3[0] ^ 0x36363636; + w3[1] = w3[1] ^ 0x36363636; + w3[2] = w3[2] ^ 0x36363636; + w3[3] = w3[3] ^ 0x36363636; + + ipad[0] = MD5M_A; + ipad[1] = MD5M_B; + ipad[2] = MD5M_C; + ipad[3] = MD5M_D; + + md5_transform (w0, w1, w2, w3, ipad); + + w0[0] = w0[0] ^ 0x6a6a6a6a; + w0[1] = w0[1] ^ 0x6a6a6a6a; + w0[2] = w0[2] ^ 0x6a6a6a6a; + w0[3] = w0[3] ^ 0x6a6a6a6a; + w1[0] = w1[0] ^ 0x6a6a6a6a; + w1[1] = w1[1] ^ 0x6a6a6a6a; + w1[2] = w1[2] ^ 0x6a6a6a6a; + w1[3] = w1[3] ^ 0x6a6a6a6a; + w2[0] = w2[0] ^ 0x6a6a6a6a; + w2[1] = w2[1] ^ 0x6a6a6a6a; + w2[2] = w2[2] ^ 0x6a6a6a6a; + w2[3] = w2[3] ^ 0x6a6a6a6a; + w3[0] = w3[0] ^ 0x6a6a6a6a; + w3[1] = w3[1] ^ 0x6a6a6a6a; + w3[2] = w3[2] ^ 0x6a6a6a6a; + w3[3] = w3[3] ^ 0x6a6a6a6a; + + opad[0] = MD5M_A; + opad[1] = MD5M_B; + opad[2] = MD5M_C; + opad[3] = MD5M_D; + + md5_transform (w0, w1, w2, w3, opad); +} + +static void hmac_md5_run (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], u32x ipad[4], u32x opad[4], u32x digest[4]) +{ + digest[0] = ipad[0]; + digest[1] = ipad[1]; + digest[2] = ipad[2]; + digest[3] = ipad[3]; + + md5_transform (w0, w1, w2, w3, digest); + + w0[0] = digest[0]; + w0[1] = digest[1]; + w0[2] = digest[2]; + w0[3] = digest[3]; + w1[0] = 0x80; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + w3[0] = 0; + w3[1] = 0; + w3[2] = (64 + 16) * 8; + w3[3] = 0; + + digest[0] = opad[0]; + digest[1] = opad[1]; + digest[2] = opad[2]; + digest[3] = opad[3]; + + md5_transform (w0, w1, w2, w3, digest); +} + +static void sha1_transform (const u32x w0[4], const u32x w1[4], const u32x w2[4], const u32x w3[4], u32x digest[5]) +{ + u32x A = digest[0]; + u32x B = digest[1]; + u32x C = digest[2]; + u32x D = digest[3]; + u32x E = digest[4]; + + u32x w0_t = w0[0]; + u32x w1_t = w0[1]; + u32x w2_t = w0[2]; + u32x w3_t = w0[3]; + u32x w4_t = w1[0]; + u32x w5_t = w1[1]; + u32x w6_t = w1[2]; + u32x w7_t = w1[3]; + u32x w8_t = w2[0]; + u32x w9_t = w2[1]; + u32x wa_t = w2[2]; + u32x wb_t = w2[3]; + u32x wc_t = w3[0]; + u32x wd_t = w3[1]; + u32x we_t = w3[2]; + u32x wf_t = w3[3]; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, A, B, C, D, E, w0_t); + SHA1_STEP (SHA1_F0o, E, A, B, C, D, w1_t); + SHA1_STEP (SHA1_F0o, D, E, A, B, C, w2_t); + SHA1_STEP (SHA1_F0o, C, D, E, A, B, w3_t); + SHA1_STEP (SHA1_F0o, B, C, D, E, A, w4_t); + SHA1_STEP (SHA1_F0o, A, B, C, D, E, w5_t); + SHA1_STEP (SHA1_F0o, E, A, B, C, D, w6_t); + SHA1_STEP (SHA1_F0o, D, E, A, B, C, w7_t); + SHA1_STEP (SHA1_F0o, C, D, E, A, B, w8_t); + SHA1_STEP (SHA1_F0o, B, C, D, E, A, w9_t); + SHA1_STEP (SHA1_F0o, A, B, C, D, E, wa_t); + SHA1_STEP (SHA1_F0o, E, A, B, C, D, wb_t); + SHA1_STEP (SHA1_F0o, D, E, A, B, C, wc_t); + SHA1_STEP (SHA1_F0o, C, D, E, A, B, wd_t); + SHA1_STEP (SHA1_F0o, B, C, D, E, A, we_t); + SHA1_STEP (SHA1_F0o, A, B, C, D, E, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F0o, E, A, B, C, D, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F0o, D, E, A, B, C, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F0o, C, D, E, A, B, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F0o, B, C, D, E, A, w3_t); + + #undef K + #define K SHA1C01 + + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w7_t); + + #undef K + #define K SHA1C02 + + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, wb_t); + + #undef K + #define K SHA1C03 + + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, wf_t); + + digest[0] += A; + digest[1] += B; + digest[2] += C; + digest[3] += D; + digest[4] += E; +} + +static void hmac_sha1_pad (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], u32x ipad[5], u32x opad[5]) +{ + w0[0] = w0[0] ^ 0x36363636; + w0[1] = w0[1] ^ 0x36363636; + w0[2] = w0[2] ^ 0x36363636; + w0[3] = w0[3] ^ 0x36363636; + w1[0] = w1[0] ^ 0x36363636; + w1[1] = w1[1] ^ 0x36363636; + w1[2] = w1[2] ^ 0x36363636; + w1[3] = w1[3] ^ 0x36363636; + w2[0] = w2[0] ^ 0x36363636; + w2[1] = w2[1] ^ 0x36363636; + w2[2] = w2[2] ^ 0x36363636; + w2[3] = w2[3] ^ 0x36363636; + w3[0] = w3[0] ^ 0x36363636; + w3[1] = w3[1] ^ 0x36363636; + w3[2] = w3[2] ^ 0x36363636; + w3[3] = w3[3] ^ 0x36363636; + + ipad[0] = SHA1M_A; + ipad[1] = SHA1M_B; + ipad[2] = SHA1M_C; + ipad[3] = SHA1M_D; + ipad[4] = SHA1M_E; + + sha1_transform (w0, w1, w2, w3, ipad); + + w0[0] = w0[0] ^ 0x6a6a6a6a; + w0[1] = w0[1] ^ 0x6a6a6a6a; + w0[2] = w0[2] ^ 0x6a6a6a6a; + w0[3] = w0[3] ^ 0x6a6a6a6a; + w1[0] = w1[0] ^ 0x6a6a6a6a; + w1[1] = w1[1] ^ 0x6a6a6a6a; + w1[2] = w1[2] ^ 0x6a6a6a6a; + w1[3] = w1[3] ^ 0x6a6a6a6a; + w2[0] = w2[0] ^ 0x6a6a6a6a; + w2[1] = w2[1] ^ 0x6a6a6a6a; + w2[2] = w2[2] ^ 0x6a6a6a6a; + w2[3] = w2[3] ^ 0x6a6a6a6a; + w3[0] = w3[0] ^ 0x6a6a6a6a; + w3[1] = w3[1] ^ 0x6a6a6a6a; + w3[2] = w3[2] ^ 0x6a6a6a6a; + w3[3] = w3[3] ^ 0x6a6a6a6a; + + opad[0] = SHA1M_A; + opad[1] = SHA1M_B; + opad[2] = SHA1M_C; + opad[3] = SHA1M_D; + opad[4] = SHA1M_E; + + sha1_transform (w0, w1, w2, w3, opad); +} + +static void hmac_sha1_run (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], u32x ipad[5], u32x opad[5], u32x digest[5]) +{ + digest[0] = ipad[0]; + digest[1] = ipad[1]; + digest[2] = ipad[2]; + digest[3] = ipad[3]; + digest[4] = ipad[4]; + + sha1_transform (w0, w1, w2, w3, digest); + + w0[0] = digest[0]; + w0[1] = digest[1]; + w0[2] = digest[2]; + w0[3] = digest[3]; + w1[0] = digest[4]; + w1[1] = 0x80000000; + w1[2] = 0; + w1[3] = 0; + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = (64 + 20) * 8; + + digest[0] = opad[0]; + digest[1] = opad[1]; + digest[2] = opad[2]; + digest[3] = opad[3]; + digest[4] = opad[4]; + + sha1_transform (w0, w1, w2, w3, digest); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m02500_init (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global wpa_tmp_t *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global wpa_t *wpa_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = pws[gid].i[ 8]; + w2[1] = pws[gid].i[ 9]; + w2[2] = pws[gid].i[10]; + w2[3] = pws[gid].i[11]; + + u32x w3[4]; + + w3[0] = pws[gid].i[12]; + w3[1] = pws[gid].i[13]; + w3[2] = pws[gid].i[14]; + w3[3] = pws[gid].i[15]; + + /** + * salt + */ + + u32 salt_len = salt_bufs[salt_pos].salt_len; + + u32 salt_buf0[4]; + u32 salt_buf1[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[3]; + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[7]; + + /** + * pads + */ + + w0[0] = swap_workaround (w0[0]); + w0[1] = swap_workaround (w0[1]); + w0[2] = swap_workaround (w0[2]); + w0[3] = swap_workaround (w0[3]); + w1[0] = swap_workaround (w1[0]); + w1[1] = swap_workaround (w1[1]); + w1[2] = swap_workaround (w1[2]); + w1[3] = swap_workaround (w1[3]); + w2[0] = swap_workaround (w2[0]); + w2[1] = swap_workaround (w2[1]); + w2[2] = swap_workaround (w2[2]); + w2[3] = swap_workaround (w2[3]); + w3[0] = swap_workaround (w3[0]); + w3[1] = swap_workaround (w3[1]); + w3[2] = swap_workaround (w3[2]); + w3[3] = swap_workaround (w3[3]); + + u32x ipad[5]; + u32x opad[5]; + + hmac_sha1_pad (w0, w1, w2, w3, ipad, opad); + + tmps[gid].ipad[0] = ipad[0]; + tmps[gid].ipad[1] = ipad[1]; + tmps[gid].ipad[2] = ipad[2]; + tmps[gid].ipad[3] = ipad[3]; + tmps[gid].ipad[4] = ipad[4]; + + tmps[gid].opad[0] = opad[0]; + tmps[gid].opad[1] = opad[1]; + tmps[gid].opad[2] = opad[2]; + tmps[gid].opad[3] = opad[3]; + tmps[gid].opad[4] = opad[4]; + + for (u32 i = 0, j = 1; i < 8; i += 5, j += 1) + { + w0[0] = salt_buf0[0]; + w0[1] = salt_buf0[1]; + w0[2] = salt_buf0[2]; + w0[3] = salt_buf0[3]; + w1[0] = salt_buf1[0]; + w1[1] = salt_buf1[1]; + w1[2] = salt_buf1[2]; + w1[3] = salt_buf1[3]; + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + if (j == 1) + append_0x01_3 (w0, w1, w2, salt_len + 3); + else + append_0x02_3 (w0, w1, w2, salt_len + 3); + + append_0x80_3 (w0, w1, w2, salt_len + 4); + + w0[0] = swap_workaround (w0[0]); + w0[1] = swap_workaround (w0[1]); + w0[2] = swap_workaround (w0[2]); + w0[3] = swap_workaround (w0[3]); + w1[0] = swap_workaround (w1[0]); + w1[1] = swap_workaround (w1[1]); + w1[2] = swap_workaround (w1[2]); + w1[3] = swap_workaround (w1[3]); + w2[0] = swap_workaround (w2[0]); + w2[1] = swap_workaround (w2[1]); + w2[2] = 0; + w2[3] = 0; + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = (64 + salt_len + 4) * 8; + + u32x dgst[5]; + + hmac_sha1_run (w0, w1, w2, w3, ipad, opad, dgst); + + tmps[gid].dgst[i + 0] = dgst[0]; + tmps[gid].dgst[i + 1] = dgst[1]; + tmps[gid].dgst[i + 2] = dgst[2]; + tmps[gid].dgst[i + 3] = dgst[3]; + tmps[gid].dgst[i + 4] = dgst[4]; + + tmps[gid].out[i + 0] = dgst[0]; + tmps[gid].out[i + 1] = dgst[1]; + tmps[gid].out[i + 2] = dgst[2]; + tmps[gid].out[i + 3] = dgst[3]; + tmps[gid].out[i + 4] = dgst[4]; + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m02500_loop (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global wpa_tmp_t *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global wpa_t *wpa_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x ipad[5]; + u32x opad[5]; + + ipad[0] = tmps[gid].ipad[0]; + ipad[1] = tmps[gid].ipad[1]; + ipad[2] = tmps[gid].ipad[2]; + ipad[3] = tmps[gid].ipad[3]; + ipad[4] = tmps[gid].ipad[4]; + + opad[0] = tmps[gid].opad[0]; + opad[1] = tmps[gid].opad[1]; + opad[2] = tmps[gid].opad[2]; + opad[3] = tmps[gid].opad[3]; + opad[4] = tmps[gid].opad[4]; + + for (u32 i = 0; i < 8; i += 5) + { + u32x dgst[5]; + u32x out[5]; + + dgst[0] = tmps[gid].dgst[i + 0]; + dgst[1] = tmps[gid].dgst[i + 1]; + dgst[2] = tmps[gid].dgst[i + 2]; + dgst[3] = tmps[gid].dgst[i + 3]; + dgst[4] = tmps[gid].dgst[i + 4]; + + out[0] = tmps[gid].out[i + 0]; + out[1] = tmps[gid].out[i + 1]; + out[2] = tmps[gid].out[i + 2]; + out[3] = tmps[gid].out[i + 3]; + out[4] = tmps[gid].out[i + 4]; + + for (u32 j = 0; j < loop_cnt; j++) + { + u32x w0[4]; + u32x w1[4]; + u32x w2[4]; + u32x w3[4]; + + w0[0] = dgst[0]; + w0[1] = dgst[1]; + w0[2] = dgst[2]; + w0[3] = dgst[3]; + w1[0] = dgst[4]; + w1[1] = 0x80000000; + w1[2] = 0; + w1[3] = 0; + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = (64 + 20) * 8; + + hmac_sha1_run (w0, w1, w2, w3, ipad, opad, dgst); + + out[0] ^= dgst[0]; + out[1] ^= dgst[1]; + out[2] ^= dgst[2]; + out[3] ^= dgst[3]; + out[4] ^= dgst[4]; + } + + tmps[gid].dgst[i + 0] = dgst[0]; + tmps[gid].dgst[i + 1] = dgst[1]; + tmps[gid].dgst[i + 2] = dgst[2]; + tmps[gid].dgst[i + 3] = dgst[3]; + tmps[gid].dgst[i + 4] = dgst[4]; + + tmps[gid].out[i + 0] = out[0]; + tmps[gid].out[i + 1] = out[1]; + tmps[gid].out[i + 2] = out[2]; + tmps[gid].out[i + 3] = out[3]; + tmps[gid].out[i + 4] = out[4]; + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m02500_comp (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global wpa_tmp_t *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global wpa_t *wpa_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + const u32 lid = get_local_id (0); + + u32x w0[4]; + u32x w1[4]; + u32x w2[4]; + u32x w3[4]; + + w0[0] = tmps[gid].out[0]; + w0[1] = tmps[gid].out[1]; + w0[2] = tmps[gid].out[2]; + w0[3] = tmps[gid].out[3]; + w1[0] = tmps[gid].out[4]; + w1[1] = tmps[gid].out[5]; + w1[2] = tmps[gid].out[6]; + w1[3] = tmps[gid].out[7]; + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + u32x ipad[5]; + u32x opad[5]; + + hmac_sha1_pad (w0, w1, w2, w3, ipad, opad); + + w0[0] = wpa_bufs[salt_pos].pke[ 0]; + w0[1] = wpa_bufs[salt_pos].pke[ 1]; + w0[2] = wpa_bufs[salt_pos].pke[ 2]; + w0[3] = wpa_bufs[salt_pos].pke[ 3]; + w1[0] = wpa_bufs[salt_pos].pke[ 4]; + w1[1] = wpa_bufs[salt_pos].pke[ 5]; + w1[2] = wpa_bufs[salt_pos].pke[ 6]; + w1[3] = wpa_bufs[salt_pos].pke[ 7]; + w2[0] = wpa_bufs[salt_pos].pke[ 8]; + w2[1] = wpa_bufs[salt_pos].pke[ 9]; + w2[2] = wpa_bufs[salt_pos].pke[10]; + w2[3] = wpa_bufs[salt_pos].pke[11]; + w3[0] = wpa_bufs[salt_pos].pke[12]; + w3[1] = wpa_bufs[salt_pos].pke[13]; + w3[2] = wpa_bufs[salt_pos].pke[14]; + w3[3] = wpa_bufs[salt_pos].pke[15]; + + sha1_transform (w0, w1, w2, w3, ipad); + + w0[0] = wpa_bufs[salt_pos].pke[16]; + w0[1] = wpa_bufs[salt_pos].pke[17]; + w0[2] = wpa_bufs[salt_pos].pke[18]; + w0[3] = wpa_bufs[salt_pos].pke[19]; + w1[0] = wpa_bufs[salt_pos].pke[20]; + w1[1] = wpa_bufs[salt_pos].pke[21]; + w1[2] = wpa_bufs[salt_pos].pke[22]; + w1[3] = wpa_bufs[salt_pos].pke[23]; + w2[0] = wpa_bufs[salt_pos].pke[24]; + w2[1] = 0x80000000; + w2[2] = 0; + w2[3] = 0; + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = (64 + 100) * 8; + + u32x digest[5]; + + hmac_sha1_run (w0, w1, w2, w3, ipad, opad, digest); + + { + w0[0] = swap_workaround (digest[0]); + w0[1] = swap_workaround (digest[1]); + w0[2] = swap_workaround (digest[2]); + w0[3] = swap_workaround (digest[3]); + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + hmac_md5_pad (w0, w1, w2, w3, ipad, opad); + + int eapol_size = wpa_bufs[salt_pos].eapol_size; + + int eapol_left; + int eapol_off; + + for (eapol_left = eapol_size, eapol_off = 0; eapol_left >= 56; eapol_left -= 64, eapol_off += 16) + { + w0[0] = wpa_bufs[salt_pos].eapol[eapol_off + 0]; + w0[1] = wpa_bufs[salt_pos].eapol[eapol_off + 1]; + w0[2] = wpa_bufs[salt_pos].eapol[eapol_off + 2]; + w0[3] = wpa_bufs[salt_pos].eapol[eapol_off + 3]; + w1[0] = wpa_bufs[salt_pos].eapol[eapol_off + 4]; + w1[1] = wpa_bufs[salt_pos].eapol[eapol_off + 5]; + w1[2] = wpa_bufs[salt_pos].eapol[eapol_off + 6]; + w1[3] = wpa_bufs[salt_pos].eapol[eapol_off + 7]; + w2[0] = wpa_bufs[salt_pos].eapol[eapol_off + 8]; + w2[1] = wpa_bufs[salt_pos].eapol[eapol_off + 9]; + w2[2] = wpa_bufs[salt_pos].eapol[eapol_off + 10]; + w2[3] = wpa_bufs[salt_pos].eapol[eapol_off + 11]; + w3[0] = wpa_bufs[salt_pos].eapol[eapol_off + 12]; + w3[1] = wpa_bufs[salt_pos].eapol[eapol_off + 13]; + w3[2] = wpa_bufs[salt_pos].eapol[eapol_off + 14]; + w3[3] = wpa_bufs[salt_pos].eapol[eapol_off + 15]; + + md5_transform (w0, w1, w2, w3, ipad); + } + + w0[0] = wpa_bufs[salt_pos].eapol[eapol_off + 0]; + w0[1] = wpa_bufs[salt_pos].eapol[eapol_off + 1]; + w0[2] = wpa_bufs[salt_pos].eapol[eapol_off + 2]; + w0[3] = wpa_bufs[salt_pos].eapol[eapol_off + 3]; + w1[0] = wpa_bufs[salt_pos].eapol[eapol_off + 4]; + w1[1] = wpa_bufs[salt_pos].eapol[eapol_off + 5]; + w1[2] = wpa_bufs[salt_pos].eapol[eapol_off + 6]; + w1[3] = wpa_bufs[salt_pos].eapol[eapol_off + 7]; + w2[0] = wpa_bufs[salt_pos].eapol[eapol_off + 8]; + w2[1] = wpa_bufs[salt_pos].eapol[eapol_off + 9]; + w2[2] = wpa_bufs[salt_pos].eapol[eapol_off + 10]; + w2[3] = wpa_bufs[salt_pos].eapol[eapol_off + 11]; + w3[0] = wpa_bufs[salt_pos].eapol[eapol_off + 12]; + w3[1] = wpa_bufs[salt_pos].eapol[eapol_off + 13]; + w3[2] = (64 + eapol_size) * 8; + w3[3] = 0; + + u32x digest1[4]; + + hmac_md5_run (w0, w1, w2, w3, ipad, opad, digest1); + + /** + * base + */ + + #define il_pos 0 + + const u32x r0 = digest1[DGST_R0]; + const u32x r1 = digest1[DGST_R1]; + const u32x r2 = digest1[DGST_R2]; + const u32x r3 = digest1[DGST_R3]; + + #include VECT_COMPARE_M + } + + { + w0[0] = digest[0]; + w0[1] = digest[1]; + w0[2] = digest[2]; + w0[3] = digest[3]; + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + hmac_sha1_pad (w0, w1, w2, w3, ipad, opad); + + int eapol_size = wpa_bufs[salt_pos].eapol_size; + + int eapol_left; + int eapol_off; + + for (eapol_left = eapol_size, eapol_off = 0; eapol_left >= 56; eapol_left -= 64, eapol_off += 16) + { + w0[0] = wpa_bufs[salt_pos].eapol[eapol_off + 0]; + w0[1] = wpa_bufs[salt_pos].eapol[eapol_off + 1]; + w0[2] = wpa_bufs[salt_pos].eapol[eapol_off + 2]; + w0[3] = wpa_bufs[salt_pos].eapol[eapol_off + 3]; + w1[0] = wpa_bufs[salt_pos].eapol[eapol_off + 4]; + w1[1] = wpa_bufs[salt_pos].eapol[eapol_off + 5]; + w1[2] = wpa_bufs[salt_pos].eapol[eapol_off + 6]; + w1[3] = wpa_bufs[salt_pos].eapol[eapol_off + 7]; + w2[0] = wpa_bufs[salt_pos].eapol[eapol_off + 8]; + w2[1] = wpa_bufs[salt_pos].eapol[eapol_off + 9]; + w2[2] = wpa_bufs[salt_pos].eapol[eapol_off + 10]; + w2[3] = wpa_bufs[salt_pos].eapol[eapol_off + 11]; + w3[0] = wpa_bufs[salt_pos].eapol[eapol_off + 12]; + w3[1] = wpa_bufs[salt_pos].eapol[eapol_off + 13]; + w3[2] = wpa_bufs[salt_pos].eapol[eapol_off + 14]; + w3[3] = wpa_bufs[salt_pos].eapol[eapol_off + 15]; + + sha1_transform (w0, w1, w2, w3, ipad); + } + + w0[0] = wpa_bufs[salt_pos].eapol[eapol_off + 0]; + w0[1] = wpa_bufs[salt_pos].eapol[eapol_off + 1]; + w0[2] = wpa_bufs[salt_pos].eapol[eapol_off + 2]; + w0[3] = wpa_bufs[salt_pos].eapol[eapol_off + 3]; + w1[0] = wpa_bufs[salt_pos].eapol[eapol_off + 4]; + w1[1] = wpa_bufs[salt_pos].eapol[eapol_off + 5]; + w1[2] = wpa_bufs[salt_pos].eapol[eapol_off + 6]; + w1[3] = wpa_bufs[salt_pos].eapol[eapol_off + 7]; + w2[0] = wpa_bufs[salt_pos].eapol[eapol_off + 8]; + w2[1] = wpa_bufs[salt_pos].eapol[eapol_off + 9]; + w2[2] = wpa_bufs[salt_pos].eapol[eapol_off + 10]; + w2[3] = wpa_bufs[salt_pos].eapol[eapol_off + 11]; + w3[0] = wpa_bufs[salt_pos].eapol[eapol_off + 12]; + w3[1] = wpa_bufs[salt_pos].eapol[eapol_off + 13]; + w3[2] = 0; + w3[3] = (64 + eapol_size) * 8; + + u32x digest2[5]; + + hmac_sha1_run (w0, w1, w2, w3, ipad, opad, digest2); + + /** + * base + */ + + #define il_pos 0 + + const u32x r0 = digest2[DGST_R0]; + const u32x r1 = digest2[DGST_R1]; + const u32x r2 = digest2[DGST_R2]; + const u32x r3 = digest2[DGST_R3]; + + #include VECT_COMPARE_M + } +} diff --git a/amd/m02610_a0.cl b/amd/m02610_a0.cl new file mode 100644 index 0000000000..8a12831824 --- /dev/null +++ b/amd/m02610_a0.cl @@ -0,0 +1,703 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _MD5_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW4 +#define VECT_SIZE4 +#endif + +#ifdef VLIW5 +#define VECT_SIZE4 +#endif + +#define DGST_R0 0 +#define DGST_R1 3 +#define DGST_R2 2 +#define DGST_R3 1 + +#include "include/kernel_functions.c" +#include "types_amd.c" +#include "common_amd.c" +#include "include/rp_gpu.h" +#include "rp_amd.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +#ifdef VECT_SIZE1 +#define uint_to_hex_lower8(i) l_bin2asc[(i)] +#endif + +#ifdef VECT_SIZE2 +#define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1]) +#endif + +#ifdef VECT_SIZE4 +#define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3]) +#endif + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m02610_m04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + u32x pw_buf1[4]; + + pw_buf1[0] = pws[gid].i[ 4]; + pw_buf1[1] = pws[gid].i[ 5]; + pw_buf1[2] = pws[gid].i[ 6]; + pw_buf1[3] = pws[gid].i[ 7]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * salt + */ + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + u32 s[8]; + + s[0] = salt_bufs[salt_pos].salt_buf[0]; + s[1] = salt_bufs[salt_pos].salt_buf[1]; + s[2] = salt_bufs[salt_pos].salt_buf[2]; + s[3] = salt_bufs[salt_pos].salt_buf[3]; + s[4] = salt_bufs[salt_pos].salt_buf[4]; + s[5] = salt_bufs[salt_pos].salt_buf[5]; + s[6] = (32 + salt_len) * 8; + s[7] = 0; + + /** + * bin2asc table + */ + + __local u32 l_bin2asc[256]; + + const u32 lid4 = lid * 4; + + const u32 lid40 = lid4 + 0; + const u32 lid41 = lid4 + 1; + const u32 lid42 = lid4 + 2; + const u32 lid43 = lid4 + 3; + + const u32 v400 = (lid40 >> 0) & 15; + const u32 v401 = (lid40 >> 4) & 15; + const u32 v410 = (lid41 >> 0) & 15; + const u32 v411 = (lid41 >> 4) & 15; + const u32 v420 = (lid42 >> 0) & 15; + const u32 v421 = (lid42 >> 4) & 15; + const u32 v430 = (lid43 >> 0) & 15; + const u32 v431 = (lid43 >> 4) & 15; + + l_bin2asc[lid40] = ((v400 < 10) ? '0' + v400 : 'a' - 10 + v400) << 8 + | ((v401 < 10) ? '0' + v401 : 'a' - 10 + v401) << 0; + l_bin2asc[lid41] = ((v410 < 10) ? '0' + v410 : 'a' - 10 + v410) << 8 + | ((v411 < 10) ? '0' + v411 : 'a' - 10 + v411) << 0; + l_bin2asc[lid42] = ((v420 < 10) ? '0' + v420 : 'a' - 10 + v420) << 8 + | ((v421 < 10) ? '0' + v421 : 'a' - 10 + v421) << 0; + l_bin2asc[lid43] = ((v430 < 10) ? '0' + v430 : 'a' - 10 + v430) << 8 + | ((v431 < 10) ? '0' + v431 : 'a' - 10 + v431) << 0; + + barrier (CLK_LOCAL_MEM_FENCE); + + if (gid >= gid_max) return; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + + w0[0] = pw_buf0[0]; + w0[1] = pw_buf0[1]; + w0[2] = pw_buf0[2]; + w0[3] = pw_buf0[3]; + + u32x w1[4]; + + w1[0] = pw_buf1[0]; + w1[1] = pw_buf1[1]; + w1[2] = pw_buf1[2]; + w1[3] = pw_buf1[3]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 out_len = apply_rules (rules_buf[il_pos].cmds, w0, w1, pw_len); + + append_0x80_2 (w0, w1, out_len); + + w3[2] = out_len * 8; + + u32x a = MD5M_A; + u32x b = MD5M_B; + u32x c = MD5M_C; + u32x d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H , a, b, c, d, w1[1], MD5C20, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w2[0], MD5C21, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w2[3], MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w3[2], MD5C23, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w0[1], MD5C24, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w1[0], MD5C25, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w1[3], MD5C26, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w2[2], MD5C27, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w3[1], MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w0[0], MD5C29, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w0[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w1[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w2[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w3[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w3[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w0[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1[0], MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w2[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2[1], MD5C3f, MD5S33); + + a += MD5M_A; + b += MD5M_B; + c += MD5M_C; + d += MD5M_D; + + const u32x w0_t = uint_to_hex_lower8 ((a >> 0) & 255) << 0 + | uint_to_hex_lower8 ((a >> 8) & 255) << 16; + const u32x w1_t = uint_to_hex_lower8 ((a >> 16) & 255) << 0 + | uint_to_hex_lower8 ((a >> 24) & 255) << 16; + const u32x w2_t = uint_to_hex_lower8 ((b >> 0) & 255) << 0 + | uint_to_hex_lower8 ((b >> 8) & 255) << 16; + const u32x w3_t = uint_to_hex_lower8 ((b >> 16) & 255) << 0 + | uint_to_hex_lower8 ((b >> 24) & 255) << 16; + const u32x w4_t = uint_to_hex_lower8 ((c >> 0) & 255) << 0 + | uint_to_hex_lower8 ((c >> 8) & 255) << 16; + const u32x w5_t = uint_to_hex_lower8 ((c >> 16) & 255) << 0 + | uint_to_hex_lower8 ((c >> 24) & 255) << 16; + const u32x w6_t = uint_to_hex_lower8 ((d >> 0) & 255) << 0 + | uint_to_hex_lower8 ((d >> 8) & 255) << 16; + const u32x w7_t = uint_to_hex_lower8 ((d >> 16) & 255) << 0 + | uint_to_hex_lower8 ((d >> 24) & 255) << 16; + + const u32 w8_t = s[0]; + const u32 w9_t = s[1]; + const u32 wa_t = s[2]; + const u32 wb_t = s[3]; + const u32 wc_t = s[4]; + const u32 wd_t = s[5]; + const u32 we_t = s[6]; + const u32 wf_t = s[7]; + + a = MD5M_A; + b = MD5M_B; + c = MD5M_C; + d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t, MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t, MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t, MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t, MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w4_t, MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w5_t, MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w6_t, MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w7_t, MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w8_t, MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w9_t, MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, wa_t, MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, wb_t, MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, wc_t, MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, wd_t, MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, we_t, MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, wf_t, MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w1_t, MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w6_t, MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, wb_t, MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t, MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w5_t, MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, wa_t, MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, wf_t, MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w4_t, MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w9_t, MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, we_t, MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t, MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w8_t, MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, wd_t, MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t, MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w7_t, MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, wc_t, MD5C1f, MD5S13); + + MD5_STEP (MD5_H , a, b, c, d, w5_t, MD5C20, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w8_t, MD5C21, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, wb_t, MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, we_t, MD5C23, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w1_t, MD5C24, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w4_t, MD5C25, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w7_t, MD5C26, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, wa_t, MD5C27, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, wd_t, MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w0_t, MD5C29, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w3_t, MD5C2a, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w6_t, MD5C2b, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w9_t, MD5C2c, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, wc_t, MD5C2d, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, wf_t, MD5C2e, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w2_t, MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t, MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w7_t, MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, we_t, MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w5_t, MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, wc_t, MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t, MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, wa_t, MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t, MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w8_t, MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, wf_t, MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w6_t, MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, wd_t, MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w4_t, MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, wb_t, MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t, MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w9_t, MD5C3f, MD5S33); + + const u32x r0 = a; + const u32x r1 = d; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_M + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m02610_m08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m02610_m16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m02610_s04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + u32x pw_buf1[4]; + + pw_buf1[0] = pws[gid].i[ 4]; + pw_buf1[1] = pws[gid].i[ 5]; + pw_buf1[2] = pws[gid].i[ 6]; + pw_buf1[3] = pws[gid].i[ 7]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * salt + */ + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + u32 s[8]; + + s[0] = salt_bufs[salt_pos].salt_buf[0]; + s[1] = salt_bufs[salt_pos].salt_buf[1]; + s[2] = salt_bufs[salt_pos].salt_buf[2]; + s[3] = salt_bufs[salt_pos].salt_buf[3]; + s[4] = salt_bufs[salt_pos].salt_buf[4]; + s[5] = salt_bufs[salt_pos].salt_buf[5]; + s[6] = (32 + salt_len) * 8; + s[7] = 0; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * bin2asc table + */ + + __local u32 l_bin2asc[256]; + + const u32 lid4 = lid * 4; + + const u32 lid40 = lid4 + 0; + const u32 lid41 = lid4 + 1; + const u32 lid42 = lid4 + 2; + const u32 lid43 = lid4 + 3; + + const u32 v400 = (lid40 >> 0) & 15; + const u32 v401 = (lid40 >> 4) & 15; + const u32 v410 = (lid41 >> 0) & 15; + const u32 v411 = (lid41 >> 4) & 15; + const u32 v420 = (lid42 >> 0) & 15; + const u32 v421 = (lid42 >> 4) & 15; + const u32 v430 = (lid43 >> 0) & 15; + const u32 v431 = (lid43 >> 4) & 15; + + l_bin2asc[lid40] = ((v400 < 10) ? '0' + v400 : 'a' - 10 + v400) << 8 + | ((v401 < 10) ? '0' + v401 : 'a' - 10 + v401) << 0; + l_bin2asc[lid41] = ((v410 < 10) ? '0' + v410 : 'a' - 10 + v410) << 8 + | ((v411 < 10) ? '0' + v411 : 'a' - 10 + v411) << 0; + l_bin2asc[lid42] = ((v420 < 10) ? '0' + v420 : 'a' - 10 + v420) << 8 + | ((v421 < 10) ? '0' + v421 : 'a' - 10 + v421) << 0; + l_bin2asc[lid43] = ((v430 < 10) ? '0' + v430 : 'a' - 10 + v430) << 8 + | ((v431 < 10) ? '0' + v431 : 'a' - 10 + v431) << 0; + + barrier (CLK_LOCAL_MEM_FENCE); + + if (gid >= gid_max) return; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + + w0[0] = pw_buf0[0]; + w0[1] = pw_buf0[1]; + w0[2] = pw_buf0[2]; + w0[3] = pw_buf0[3]; + + u32x w1[4]; + + w1[0] = pw_buf1[0]; + w1[1] = pw_buf1[1]; + w1[2] = pw_buf1[2]; + w1[3] = pw_buf1[3]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 out_len = apply_rules (rules_buf[il_pos].cmds, w0, w1, pw_len); + + append_0x80_2 (w0, w1, out_len); + + w3[2] = out_len * 8; + + u32x a = MD5M_A; + u32x b = MD5M_B; + u32x c = MD5M_C; + u32x d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H , a, b, c, d, w1[1], MD5C20, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w2[0], MD5C21, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w2[3], MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w3[2], MD5C23, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w0[1], MD5C24, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w1[0], MD5C25, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w1[3], MD5C26, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w2[2], MD5C27, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w3[1], MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w0[0], MD5C29, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w0[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w1[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w2[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w3[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w3[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w0[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1[0], MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w2[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2[1], MD5C3f, MD5S33); + + a += MD5M_A; + b += MD5M_B; + c += MD5M_C; + d += MD5M_D; + + const u32x w0_t = uint_to_hex_lower8 ((a >> 0) & 255) << 0 + | uint_to_hex_lower8 ((a >> 8) & 255) << 16; + const u32x w1_t = uint_to_hex_lower8 ((a >> 16) & 255) << 0 + | uint_to_hex_lower8 ((a >> 24) & 255) << 16; + const u32x w2_t = uint_to_hex_lower8 ((b >> 0) & 255) << 0 + | uint_to_hex_lower8 ((b >> 8) & 255) << 16; + const u32x w3_t = uint_to_hex_lower8 ((b >> 16) & 255) << 0 + | uint_to_hex_lower8 ((b >> 24) & 255) << 16; + const u32x w4_t = uint_to_hex_lower8 ((c >> 0) & 255) << 0 + | uint_to_hex_lower8 ((c >> 8) & 255) << 16; + const u32x w5_t = uint_to_hex_lower8 ((c >> 16) & 255) << 0 + | uint_to_hex_lower8 ((c >> 24) & 255) << 16; + const u32x w6_t = uint_to_hex_lower8 ((d >> 0) & 255) << 0 + | uint_to_hex_lower8 ((d >> 8) & 255) << 16; + const u32x w7_t = uint_to_hex_lower8 ((d >> 16) & 255) << 0 + | uint_to_hex_lower8 ((d >> 24) & 255) << 16; + + const u32 w8_t = s[0]; + const u32 w9_t = s[1]; + const u32 wa_t = s[2]; + const u32 wb_t = s[3]; + const u32 wc_t = s[4]; + const u32 wd_t = s[5]; + const u32 we_t = s[6]; + const u32 wf_t = s[7]; + + a = MD5M_A; + b = MD5M_B; + c = MD5M_C; + d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t, MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t, MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t, MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t, MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w4_t, MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w5_t, MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w6_t, MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w7_t, MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w8_t, MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w9_t, MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, wa_t, MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, wb_t, MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, wc_t, MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, wd_t, MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, we_t, MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, wf_t, MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w1_t, MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w6_t, MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, wb_t, MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t, MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w5_t, MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, wa_t, MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, wf_t, MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w4_t, MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w9_t, MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, we_t, MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t, MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w8_t, MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, wd_t, MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t, MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w7_t, MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, wc_t, MD5C1f, MD5S13); + + MD5_STEP (MD5_H , a, b, c, d, w5_t, MD5C20, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w8_t, MD5C21, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, wb_t, MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, we_t, MD5C23, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w1_t, MD5C24, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w4_t, MD5C25, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w7_t, MD5C26, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, wa_t, MD5C27, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, wd_t, MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w0_t, MD5C29, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w3_t, MD5C2a, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w6_t, MD5C2b, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w9_t, MD5C2c, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, wc_t, MD5C2d, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, wf_t, MD5C2e, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w2_t, MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t, MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w7_t, MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, we_t, MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w5_t, MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, wc_t, MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t, MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, wa_t, MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t, MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w8_t, MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, wf_t, MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w6_t, MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, wd_t, MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w4_t, MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, wb_t, MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t, MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w9_t, MD5C3f, MD5S33); + + const u32x r0 = a; + const u32x r1 = d; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_S + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m02610_s08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m02610_s16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/amd/m02610_a1.cl b/amd/m02610_a1.cl new file mode 100644 index 0000000000..78549d7f15 --- /dev/null +++ b/amd/m02610_a1.cl @@ -0,0 +1,805 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _MD5_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW4 +#define VECT_SIZE4 +#endif + +#ifdef VLIW5 +#define VECT_SIZE4 +#endif + +#define DGST_R0 0 +#define DGST_R1 3 +#define DGST_R2 2 +#define DGST_R3 1 + +#include "include/kernel_functions.c" +#include "types_amd.c" +#include "common_amd.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +#ifdef VECT_SIZE1 +#define uint_to_hex_lower8(i) l_bin2asc[(i)] +#endif + +#ifdef VECT_SIZE2 +#define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1]) +#endif + +#ifdef VECT_SIZE4 +#define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3]) +#endif + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m02610_m04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + append_0x80_2 (wordl0, wordl1, pw_l_len); + + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, combs_buf[0].pw_len); + } + + /** + * salt + */ + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + u32 s[8]; + + s[0] = salt_bufs[salt_pos].salt_buf[0]; + s[1] = salt_bufs[salt_pos].salt_buf[1]; + s[2] = salt_bufs[salt_pos].salt_buf[2]; + s[3] = salt_bufs[salt_pos].salt_buf[3]; + s[4] = salt_bufs[salt_pos].salt_buf[4]; + s[5] = salt_bufs[salt_pos].salt_buf[5]; + s[6] = (32 + salt_len) * 8; + s[7] = 0; + + /** + * bin2asc table + */ + + __local u32 l_bin2asc[256]; + + const u32 lid4 = lid * 4; + + const u32 lid40 = lid4 + 0; + const u32 lid41 = lid4 + 1; + const u32 lid42 = lid4 + 2; + const u32 lid43 = lid4 + 3; + + const u32 v400 = (lid40 >> 0) & 15; + const u32 v401 = (lid40 >> 4) & 15; + const u32 v410 = (lid41 >> 0) & 15; + const u32 v411 = (lid41 >> 4) & 15; + const u32 v420 = (lid42 >> 0) & 15; + const u32 v421 = (lid42 >> 4) & 15; + const u32 v430 = (lid43 >> 0) & 15; + const u32 v431 = (lid43 >> 4) & 15; + + l_bin2asc[lid40] = ((v400 < 10) ? '0' + v400 : 'a' - 10 + v400) << 8 + | ((v401 < 10) ? '0' + v401 : 'a' - 10 + v401) << 0; + l_bin2asc[lid41] = ((v410 < 10) ? '0' + v410 : 'a' - 10 + v410) << 8 + | ((v411 < 10) ? '0' + v411 : 'a' - 10 + v411) << 0; + l_bin2asc[lid42] = ((v420 < 10) ? '0' + v420 : 'a' - 10 + v420) << 8 + | ((v421 < 10) ? '0' + v421 : 'a' - 10 + v421) << 0; + l_bin2asc[lid43] = ((v430 < 10) ? '0' + v430 : 'a' - 10 + v430) << 8 + | ((v431 < 10) ? '0' + v431 : 'a' - 10 + v431) << 0; + + barrier (CLK_LOCAL_MEM_FENCE); + + if (gid >= gid_max) return; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = combs_buf[il_pos].pw_len; + + const u32 pw_len = pw_l_len + pw_r_len; + + u32 wordr0[4]; + + wordr0[0] = combs_buf[il_pos].i[0]; + wordr0[1] = combs_buf[il_pos].i[1]; + wordr0[2] = combs_buf[il_pos].i[2]; + wordr0[3] = combs_buf[il_pos].i[3]; + + u32 wordr1[4]; + + wordr1[0] = combs_buf[il_pos].i[4]; + wordr1[1] = combs_buf[il_pos].i[5]; + wordr1[2] = combs_buf[il_pos].i[6]; + wordr1[3] = combs_buf[il_pos].i[7]; + + u32 wordr2[4]; + + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + + u32 wordr3[4]; + + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + u32x w0[4]; + + w0[0] = wordl0[0] | wordr0[0]; + w0[1] = wordl0[1] | wordr0[1]; + w0[2] = wordl0[2] | wordr0[2]; + w0[3] = wordl0[3] | wordr0[3]; + + u32x w1[4]; + + w1[0] = wordl1[0] | wordr1[0]; + w1[1] = wordl1[1] | wordr1[1]; + w1[2] = wordl1[2] | wordr1[2]; + w1[3] = wordl1[3] | wordr1[3]; + + u32x w2[4]; + + w2[0] = wordl2[0] | wordr2[0]; + w2[1] = wordl2[1] | wordr2[1]; + w2[2] = wordl2[2] | wordr2[2]; + w2[3] = wordl2[3] | wordr2[3]; + + u32x w3[4]; + + w3[0] = wordl3[0] | wordr3[0]; + w3[1] = wordl3[1] | wordr3[1]; + w3[2] = pw_len * 8; + w3[3] = 0; + + u32x a = MD5M_A; + u32x b = MD5M_B; + u32x c = MD5M_C; + u32x d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H , a, b, c, d, w1[1], MD5C20, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w2[0], MD5C21, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w2[3], MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w3[2], MD5C23, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w0[1], MD5C24, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w1[0], MD5C25, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w1[3], MD5C26, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w2[2], MD5C27, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w3[1], MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w0[0], MD5C29, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w0[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w1[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w2[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w3[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w3[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w0[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1[0], MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w2[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2[1], MD5C3f, MD5S33); + + a += MD5M_A; + b += MD5M_B; + c += MD5M_C; + d += MD5M_D; + + const u32x w0_t = uint_to_hex_lower8 ((a >> 0) & 255) << 0 + | uint_to_hex_lower8 ((a >> 8) & 255) << 16; + const u32x w1_t = uint_to_hex_lower8 ((a >> 16) & 255) << 0 + | uint_to_hex_lower8 ((a >> 24) & 255) << 16; + const u32x w2_t = uint_to_hex_lower8 ((b >> 0) & 255) << 0 + | uint_to_hex_lower8 ((b >> 8) & 255) << 16; + const u32x w3_t = uint_to_hex_lower8 ((b >> 16) & 255) << 0 + | uint_to_hex_lower8 ((b >> 24) & 255) << 16; + const u32x w4_t = uint_to_hex_lower8 ((c >> 0) & 255) << 0 + | uint_to_hex_lower8 ((c >> 8) & 255) << 16; + const u32x w5_t = uint_to_hex_lower8 ((c >> 16) & 255) << 0 + | uint_to_hex_lower8 ((c >> 24) & 255) << 16; + const u32x w6_t = uint_to_hex_lower8 ((d >> 0) & 255) << 0 + | uint_to_hex_lower8 ((d >> 8) & 255) << 16; + const u32x w7_t = uint_to_hex_lower8 ((d >> 16) & 255) << 0 + | uint_to_hex_lower8 ((d >> 24) & 255) << 16; + + const u32 w8_t = s[0]; + const u32 w9_t = s[1]; + const u32 wa_t = s[2]; + const u32 wb_t = s[3]; + const u32 wc_t = s[4]; + const u32 wd_t = s[5]; + const u32 we_t = s[6]; + const u32 wf_t = s[7]; + + a = MD5M_A; + b = MD5M_B; + c = MD5M_C; + d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t, MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t, MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t, MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t, MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w4_t, MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w5_t, MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w6_t, MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w7_t, MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w8_t, MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w9_t, MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, wa_t, MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, wb_t, MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, wc_t, MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, wd_t, MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, we_t, MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, wf_t, MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w1_t, MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w6_t, MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, wb_t, MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t, MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w5_t, MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, wa_t, MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, wf_t, MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w4_t, MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w9_t, MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, we_t, MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t, MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w8_t, MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, wd_t, MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t, MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w7_t, MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, wc_t, MD5C1f, MD5S13); + + MD5_STEP (MD5_H , a, b, c, d, w5_t, MD5C20, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w8_t, MD5C21, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, wb_t, MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, we_t, MD5C23, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w1_t, MD5C24, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w4_t, MD5C25, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w7_t, MD5C26, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, wa_t, MD5C27, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, wd_t, MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w0_t, MD5C29, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w3_t, MD5C2a, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w6_t, MD5C2b, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w9_t, MD5C2c, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, wc_t, MD5C2d, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, wf_t, MD5C2e, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w2_t, MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t, MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w7_t, MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, we_t, MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w5_t, MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, wc_t, MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t, MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, wa_t, MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t, MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w8_t, MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, wf_t, MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w6_t, MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, wd_t, MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w4_t, MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, wb_t, MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t, MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w9_t, MD5C3f, MD5S33); + + const u32x r0 = a; + const u32x r1 = d; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_M + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m02610_m08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m02610_m16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m02610_s04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + append_0x80_2 (wordl0, wordl1, pw_l_len); + + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, combs_buf[0].pw_len); + } + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * salt + */ + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + u32 s[8]; + + s[0] = salt_bufs[salt_pos].salt_buf[0]; + s[1] = salt_bufs[salt_pos].salt_buf[1]; + s[2] = salt_bufs[salt_pos].salt_buf[2]; + s[3] = salt_bufs[salt_pos].salt_buf[3]; + s[4] = salt_bufs[salt_pos].salt_buf[4]; + s[5] = salt_bufs[salt_pos].salt_buf[5]; + s[6] = (32 + salt_len) * 8; + s[7] = 0; + + /** + * bin2asc table + */ + + __local u32 l_bin2asc[256]; + + const u32 lid4 = lid * 4; + + const u32 lid40 = lid4 + 0; + const u32 lid41 = lid4 + 1; + const u32 lid42 = lid4 + 2; + const u32 lid43 = lid4 + 3; + + const u32 v400 = (lid40 >> 0) & 15; + const u32 v401 = (lid40 >> 4) & 15; + const u32 v410 = (lid41 >> 0) & 15; + const u32 v411 = (lid41 >> 4) & 15; + const u32 v420 = (lid42 >> 0) & 15; + const u32 v421 = (lid42 >> 4) & 15; + const u32 v430 = (lid43 >> 0) & 15; + const u32 v431 = (lid43 >> 4) & 15; + + l_bin2asc[lid40] = ((v400 < 10) ? '0' + v400 : 'a' - 10 + v400) << 8 + | ((v401 < 10) ? '0' + v401 : 'a' - 10 + v401) << 0; + l_bin2asc[lid41] = ((v410 < 10) ? '0' + v410 : 'a' - 10 + v410) << 8 + | ((v411 < 10) ? '0' + v411 : 'a' - 10 + v411) << 0; + l_bin2asc[lid42] = ((v420 < 10) ? '0' + v420 : 'a' - 10 + v420) << 8 + | ((v421 < 10) ? '0' + v421 : 'a' - 10 + v421) << 0; + l_bin2asc[lid43] = ((v430 < 10) ? '0' + v430 : 'a' - 10 + v430) << 8 + | ((v431 < 10) ? '0' + v431 : 'a' - 10 + v431) << 0; + + barrier (CLK_LOCAL_MEM_FENCE); + + if (gid >= gid_max) return; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = combs_buf[il_pos].pw_len; + + const u32 pw_len = pw_l_len + pw_r_len; + + u32 wordr0[4]; + + wordr0[0] = combs_buf[il_pos].i[0]; + wordr0[1] = combs_buf[il_pos].i[1]; + wordr0[2] = combs_buf[il_pos].i[2]; + wordr0[3] = combs_buf[il_pos].i[3]; + + u32 wordr1[4]; + + wordr1[0] = combs_buf[il_pos].i[4]; + wordr1[1] = combs_buf[il_pos].i[5]; + wordr1[2] = combs_buf[il_pos].i[6]; + wordr1[3] = combs_buf[il_pos].i[7]; + + u32 wordr2[4]; + + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + + u32 wordr3[4]; + + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + u32x w0[4]; + + w0[0] = wordl0[0] | wordr0[0]; + w0[1] = wordl0[1] | wordr0[1]; + w0[2] = wordl0[2] | wordr0[2]; + w0[3] = wordl0[3] | wordr0[3]; + + u32x w1[4]; + + w1[0] = wordl1[0] | wordr1[0]; + w1[1] = wordl1[1] | wordr1[1]; + w1[2] = wordl1[2] | wordr1[2]; + w1[3] = wordl1[3] | wordr1[3]; + + u32x w2[4]; + + w2[0] = wordl2[0] | wordr2[0]; + w2[1] = wordl2[1] | wordr2[1]; + w2[2] = wordl2[2] | wordr2[2]; + w2[3] = wordl2[3] | wordr2[3]; + + u32x w3[4]; + + w3[0] = wordl3[0] | wordr3[0]; + w3[1] = wordl3[1] | wordr3[1]; + w3[2] = pw_len * 8; + w3[3] = 0; + + u32x a = MD5M_A; + u32x b = MD5M_B; + u32x c = MD5M_C; + u32x d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H , a, b, c, d, w1[1], MD5C20, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w2[0], MD5C21, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w2[3], MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w3[2], MD5C23, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w0[1], MD5C24, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w1[0], MD5C25, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w1[3], MD5C26, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w2[2], MD5C27, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w3[1], MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w0[0], MD5C29, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w0[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w1[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w2[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w3[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w3[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w0[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1[0], MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w2[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2[1], MD5C3f, MD5S33); + + a += MD5M_A; + b += MD5M_B; + c += MD5M_C; + d += MD5M_D; + + const u32x w0_t = uint_to_hex_lower8 ((a >> 0) & 255) << 0 + | uint_to_hex_lower8 ((a >> 8) & 255) << 16; + const u32x w1_t = uint_to_hex_lower8 ((a >> 16) & 255) << 0 + | uint_to_hex_lower8 ((a >> 24) & 255) << 16; + const u32x w2_t = uint_to_hex_lower8 ((b >> 0) & 255) << 0 + | uint_to_hex_lower8 ((b >> 8) & 255) << 16; + const u32x w3_t = uint_to_hex_lower8 ((b >> 16) & 255) << 0 + | uint_to_hex_lower8 ((b >> 24) & 255) << 16; + const u32x w4_t = uint_to_hex_lower8 ((c >> 0) & 255) << 0 + | uint_to_hex_lower8 ((c >> 8) & 255) << 16; + const u32x w5_t = uint_to_hex_lower8 ((c >> 16) & 255) << 0 + | uint_to_hex_lower8 ((c >> 24) & 255) << 16; + const u32x w6_t = uint_to_hex_lower8 ((d >> 0) & 255) << 0 + | uint_to_hex_lower8 ((d >> 8) & 255) << 16; + const u32x w7_t = uint_to_hex_lower8 ((d >> 16) & 255) << 0 + | uint_to_hex_lower8 ((d >> 24) & 255) << 16; + + const u32 w8_t = s[0]; + const u32 w9_t = s[1]; + const u32 wa_t = s[2]; + const u32 wb_t = s[3]; + const u32 wc_t = s[4]; + const u32 wd_t = s[5]; + const u32 we_t = s[6]; + const u32 wf_t = s[7]; + + a = MD5M_A; + b = MD5M_B; + c = MD5M_C; + d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t, MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t, MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t, MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t, MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w4_t, MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w5_t, MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w6_t, MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w7_t, MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w8_t, MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w9_t, MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, wa_t, MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, wb_t, MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, wc_t, MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, wd_t, MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, we_t, MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, wf_t, MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w1_t, MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w6_t, MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, wb_t, MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t, MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w5_t, MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, wa_t, MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, wf_t, MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w4_t, MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w9_t, MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, we_t, MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t, MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w8_t, MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, wd_t, MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t, MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w7_t, MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, wc_t, MD5C1f, MD5S13); + + MD5_STEP (MD5_H , a, b, c, d, w5_t, MD5C20, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w8_t, MD5C21, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, wb_t, MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, we_t, MD5C23, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w1_t, MD5C24, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w4_t, MD5C25, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w7_t, MD5C26, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, wa_t, MD5C27, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, wd_t, MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w0_t, MD5C29, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w3_t, MD5C2a, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w6_t, MD5C2b, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w9_t, MD5C2c, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, wc_t, MD5C2d, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, wf_t, MD5C2e, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w2_t, MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t, MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w7_t, MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, we_t, MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w5_t, MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, wc_t, MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t, MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, wa_t, MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t, MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w8_t, MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, wf_t, MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w6_t, MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, wd_t, MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w4_t, MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, wb_t, MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t, MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w9_t, MD5C3f, MD5S33); + + const u32x r0 = a; + const u32x r1 = d; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_S + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m02610_s08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m02610_s16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/amd/m02610_a3.cl b/amd/m02610_a3.cl new file mode 100644 index 0000000000..7e3e8e3d3c --- /dev/null +++ b/amd/m02610_a3.cl @@ -0,0 +1,1034 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _MD5_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW4 +#define VECT_SIZE4 +#endif + +#ifdef VLIW5 +#define VECT_SIZE4 +#endif + +#define DGST_R0 0 +#define DGST_R1 3 +#define DGST_R2 2 +#define DGST_R3 1 + +#include "include/kernel_functions.c" +#include "types_amd.c" +#include "common_amd.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +#ifdef VECT_SIZE1 +#define uint_to_hex_lower8(i) l_bin2asc[(i)] +#endif + +#ifdef VECT_SIZE2 +#define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1]) +#endif + +#ifdef VECT_SIZE4 +#define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3]) +#endif + +static void m02610m (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], const u32 pw_len, __global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, __local u32 l_bin2asc[256]) +{ + /** + * modifier + */ + + const u32 gid = get_global_id (0); + const u32 lid = get_local_id (0); + + /** + * salt + */ + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + u32 s[8]; + + s[0] = salt_bufs[salt_pos].salt_buf[0]; + s[1] = salt_bufs[salt_pos].salt_buf[1]; + s[2] = salt_bufs[salt_pos].salt_buf[2]; + s[3] = salt_bufs[salt_pos].salt_buf[3]; + s[4] = salt_bufs[salt_pos].salt_buf[4]; + s[5] = salt_bufs[salt_pos].salt_buf[5]; + s[6] = (32 + salt_len) * 8; + s[7] = 0; + + /** + * loop + */ + + u32x w0l = w0[0]; + + for (u32 il_pos = 0; il_pos < bfs_cnt; il_pos++) + { + const u32 w0r = bfs_buf[il_pos].i; + + w0[0] = w0l | w0r; + + u32x a = MD5M_A; + u32x b = MD5M_B; + u32x c = MD5M_C; + u32x d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H , a, b, c, d, w1[1], MD5C20, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w2[0], MD5C21, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w2[3], MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w3[2], MD5C23, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w0[1], MD5C24, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w1[0], MD5C25, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w1[3], MD5C26, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w2[2], MD5C27, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w3[1], MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w0[0], MD5C29, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w0[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w1[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w2[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w3[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w3[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w0[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1[0], MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w2[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2[1], MD5C3f, MD5S33); + + a += MD5M_A; + b += MD5M_B; + c += MD5M_C; + d += MD5M_D; + + const u32x w0_t = uint_to_hex_lower8 ((a >> 0) & 255) << 0 + | uint_to_hex_lower8 ((a >> 8) & 255) << 16; + const u32x w1_t = uint_to_hex_lower8 ((a >> 16) & 255) << 0 + | uint_to_hex_lower8 ((a >> 24) & 255) << 16; + const u32x w2_t = uint_to_hex_lower8 ((b >> 0) & 255) << 0 + | uint_to_hex_lower8 ((b >> 8) & 255) << 16; + const u32x w3_t = uint_to_hex_lower8 ((b >> 16) & 255) << 0 + | uint_to_hex_lower8 ((b >> 24) & 255) << 16; + const u32x w4_t = uint_to_hex_lower8 ((c >> 0) & 255) << 0 + | uint_to_hex_lower8 ((c >> 8) & 255) << 16; + const u32x w5_t = uint_to_hex_lower8 ((c >> 16) & 255) << 0 + | uint_to_hex_lower8 ((c >> 24) & 255) << 16; + const u32x w6_t = uint_to_hex_lower8 ((d >> 0) & 255) << 0 + | uint_to_hex_lower8 ((d >> 8) & 255) << 16; + const u32x w7_t = uint_to_hex_lower8 ((d >> 16) & 255) << 0 + | uint_to_hex_lower8 ((d >> 24) & 255) << 16; + + const u32 w8_t = s[0]; + const u32 w9_t = s[1]; + const u32 wa_t = s[2]; + const u32 wb_t = s[3]; + const u32 wc_t = s[4]; + const u32 wd_t = s[5]; + const u32 we_t = s[6]; + const u32 wf_t = s[7]; + + a = MD5M_A; + b = MD5M_B; + c = MD5M_C; + d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t, MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t, MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t, MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t, MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w4_t, MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w5_t, MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w6_t, MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w7_t, MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w8_t, MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w9_t, MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, wa_t, MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, wb_t, MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, wc_t, MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, wd_t, MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, we_t, MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, wf_t, MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w1_t, MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w6_t, MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, wb_t, MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t, MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w5_t, MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, wa_t, MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, wf_t, MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w4_t, MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w9_t, MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, we_t, MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t, MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w8_t, MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, wd_t, MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t, MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w7_t, MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, wc_t, MD5C1f, MD5S13); + + MD5_STEP (MD5_H , a, b, c, d, w5_t, MD5C20, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w8_t, MD5C21, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, wb_t, MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, we_t, MD5C23, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w1_t, MD5C24, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w4_t, MD5C25, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w7_t, MD5C26, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, wa_t, MD5C27, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, wd_t, MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w0_t, MD5C29, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w3_t, MD5C2a, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w6_t, MD5C2b, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w9_t, MD5C2c, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, wc_t, MD5C2d, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, wf_t, MD5C2e, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w2_t, MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t, MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w7_t, MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, we_t, MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w5_t, MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, wc_t, MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t, MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, wa_t, MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t, MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w8_t, MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, wf_t, MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w6_t, MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, wd_t, MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w4_t, MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, wb_t, MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t, MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w9_t, MD5C3f, MD5S33); + + const u32x r0 = a; + const u32x r1 = d; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_M + } +} + +static void m02610s (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], const u32 pw_len, __global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, __local u32 l_bin2asc[256]) +{ + /** + * modifier + */ + + const u32 gid = get_global_id (0); + const u32 lid = get_local_id (0); + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * salt + */ + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + u32 s[8]; + + s[0] = salt_bufs[salt_pos].salt_buf[0]; + s[1] = salt_bufs[salt_pos].salt_buf[1]; + s[2] = salt_bufs[salt_pos].salt_buf[2]; + s[3] = salt_bufs[salt_pos].salt_buf[3]; + s[4] = salt_bufs[salt_pos].salt_buf[4]; + s[5] = salt_bufs[salt_pos].salt_buf[5]; + s[6] = (32 + salt_len) * 8; + s[7] = 0; + + /** + * loop + */ + + u32x w0l = w0[0]; + + for (u32 il_pos = 0; il_pos < bfs_cnt; il_pos++) + { + const u32 w0r = bfs_buf[il_pos].i; + + w0[0] = w0l | w0r; + + u32x a = MD5M_A; + u32x b = MD5M_B; + u32x c = MD5M_C; + u32x d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H , a, b, c, d, w1[1], MD5C20, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w2[0], MD5C21, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w2[3], MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w3[2], MD5C23, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w0[1], MD5C24, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w1[0], MD5C25, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w1[3], MD5C26, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w2[2], MD5C27, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w3[1], MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w0[0], MD5C29, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w0[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w1[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w2[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w3[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w3[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w0[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1[0], MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w2[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2[1], MD5C3f, MD5S33); + + a += MD5M_A; + b += MD5M_B; + c += MD5M_C; + d += MD5M_D; + + const u32x w0_t = uint_to_hex_lower8 ((a >> 0) & 255) << 0 + | uint_to_hex_lower8 ((a >> 8) & 255) << 16; + const u32x w1_t = uint_to_hex_lower8 ((a >> 16) & 255) << 0 + | uint_to_hex_lower8 ((a >> 24) & 255) << 16; + const u32x w2_t = uint_to_hex_lower8 ((b >> 0) & 255) << 0 + | uint_to_hex_lower8 ((b >> 8) & 255) << 16; + const u32x w3_t = uint_to_hex_lower8 ((b >> 16) & 255) << 0 + | uint_to_hex_lower8 ((b >> 24) & 255) << 16; + const u32x w4_t = uint_to_hex_lower8 ((c >> 0) & 255) << 0 + | uint_to_hex_lower8 ((c >> 8) & 255) << 16; + const u32x w5_t = uint_to_hex_lower8 ((c >> 16) & 255) << 0 + | uint_to_hex_lower8 ((c >> 24) & 255) << 16; + const u32x w6_t = uint_to_hex_lower8 ((d >> 0) & 255) << 0 + | uint_to_hex_lower8 ((d >> 8) & 255) << 16; + const u32x w7_t = uint_to_hex_lower8 ((d >> 16) & 255) << 0 + | uint_to_hex_lower8 ((d >> 24) & 255) << 16; + + const u32 w8_t = s[0]; + const u32 w9_t = s[1]; + const u32 wa_t = s[2]; + const u32 wb_t = s[3]; + const u32 wc_t = s[4]; + const u32 wd_t = s[5]; + const u32 we_t = s[6]; + const u32 wf_t = s[7]; + + a = MD5M_A; + b = MD5M_B; + c = MD5M_C; + d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t, MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t, MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t, MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t, MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w4_t, MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w5_t, MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w6_t, MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w7_t, MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w8_t, MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w9_t, MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, wa_t, MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, wb_t, MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, wc_t, MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, wd_t, MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, we_t, MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, wf_t, MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w1_t, MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w6_t, MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, wb_t, MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t, MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w5_t, MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, wa_t, MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, wf_t, MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w4_t, MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w9_t, MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, we_t, MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t, MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w8_t, MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, wd_t, MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t, MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w7_t, MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, wc_t, MD5C1f, MD5S13); + + MD5_STEP (MD5_H , a, b, c, d, w5_t, MD5C20, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w8_t, MD5C21, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, wb_t, MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, we_t, MD5C23, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w1_t, MD5C24, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w4_t, MD5C25, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w7_t, MD5C26, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, wa_t, MD5C27, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, wd_t, MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w0_t, MD5C29, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w3_t, MD5C2a, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w6_t, MD5C2b, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w9_t, MD5C2c, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, wc_t, MD5C2d, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, wf_t, MD5C2e, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w2_t, MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t, MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w7_t, MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, we_t, MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w5_t, MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, wc_t, MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t, MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, wa_t, MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t, MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w8_t, MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, wf_t, MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w6_t, MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, wd_t, MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w4_t, MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, wb_t, MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t, MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w9_t, MD5C3f, MD5S33); + + const u32x r0 = a; + const u32x r1 = d; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_S + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m02610_m04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = pws[gid].i[14]; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * bin2asc table + */ + + __local u32 l_bin2asc[256]; + + const u32 lid4 = lid * 4; + + const u32 lid40 = lid4 + 0; + const u32 lid41 = lid4 + 1; + const u32 lid42 = lid4 + 2; + const u32 lid43 = lid4 + 3; + + const u32 v400 = (lid40 >> 0) & 15; + const u32 v401 = (lid40 >> 4) & 15; + const u32 v410 = (lid41 >> 0) & 15; + const u32 v411 = (lid41 >> 4) & 15; + const u32 v420 = (lid42 >> 0) & 15; + const u32 v421 = (lid42 >> 4) & 15; + const u32 v430 = (lid43 >> 0) & 15; + const u32 v431 = (lid43 >> 4) & 15; + + l_bin2asc[lid40] = ((v400 < 10) ? '0' + v400 : 'a' - 10 + v400) << 8 + | ((v401 < 10) ? '0' + v401 : 'a' - 10 + v401) << 0; + l_bin2asc[lid41] = ((v410 < 10) ? '0' + v410 : 'a' - 10 + v410) << 8 + | ((v411 < 10) ? '0' + v411 : 'a' - 10 + v411) << 0; + l_bin2asc[lid42] = ((v420 < 10) ? '0' + v420 : 'a' - 10 + v420) << 8 + | ((v421 < 10) ? '0' + v421 : 'a' - 10 + v421) << 0; + l_bin2asc[lid43] = ((v430 < 10) ? '0' + v430 : 'a' - 10 + v430) << 8 + | ((v431 < 10) ? '0' + v431 : 'a' - 10 + v431) << 0; + + barrier (CLK_LOCAL_MEM_FENCE); + + if (gid >= gid_max) return; + + /** + * main + */ + + m02610m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset, l_bin2asc); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m02610_m08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = pws[gid].i[14]; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * bin2asc table + */ + + __local u32 l_bin2asc[256]; + + const u32 lid4 = lid * 4; + + const u32 lid40 = lid4 + 0; + const u32 lid41 = lid4 + 1; + const u32 lid42 = lid4 + 2; + const u32 lid43 = lid4 + 3; + + const u32 v400 = (lid40 >> 0) & 15; + const u32 v401 = (lid40 >> 4) & 15; + const u32 v410 = (lid41 >> 0) & 15; + const u32 v411 = (lid41 >> 4) & 15; + const u32 v420 = (lid42 >> 0) & 15; + const u32 v421 = (lid42 >> 4) & 15; + const u32 v430 = (lid43 >> 0) & 15; + const u32 v431 = (lid43 >> 4) & 15; + + l_bin2asc[lid40] = ((v400 < 10) ? '0' + v400 : 'a' - 10 + v400) << 8 + | ((v401 < 10) ? '0' + v401 : 'a' - 10 + v401) << 0; + l_bin2asc[lid41] = ((v410 < 10) ? '0' + v410 : 'a' - 10 + v410) << 8 + | ((v411 < 10) ? '0' + v411 : 'a' - 10 + v411) << 0; + l_bin2asc[lid42] = ((v420 < 10) ? '0' + v420 : 'a' - 10 + v420) << 8 + | ((v421 < 10) ? '0' + v421 : 'a' - 10 + v421) << 0; + l_bin2asc[lid43] = ((v430 < 10) ? '0' + v430 : 'a' - 10 + v430) << 8 + | ((v431 < 10) ? '0' + v431 : 'a' - 10 + v431) << 0; + + barrier (CLK_LOCAL_MEM_FENCE); + + if (gid >= gid_max) return; + + /** + * main + */ + + m02610m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset, l_bin2asc); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m02610_m16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = pws[gid].i[ 8]; + w2[1] = pws[gid].i[ 9]; + w2[2] = pws[gid].i[10]; + w2[3] = pws[gid].i[11]; + + u32x w3[4]; + + w3[0] = pws[gid].i[12]; + w3[1] = pws[gid].i[13]; + w3[2] = pws[gid].i[14]; + w3[3] = pws[gid].i[15]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * bin2asc table + */ + + __local u32 l_bin2asc[256]; + + const u32 lid4 = lid * 4; + + const u32 lid40 = lid4 + 0; + const u32 lid41 = lid4 + 1; + const u32 lid42 = lid4 + 2; + const u32 lid43 = lid4 + 3; + + const u32 v400 = (lid40 >> 0) & 15; + const u32 v401 = (lid40 >> 4) & 15; + const u32 v410 = (lid41 >> 0) & 15; + const u32 v411 = (lid41 >> 4) & 15; + const u32 v420 = (lid42 >> 0) & 15; + const u32 v421 = (lid42 >> 4) & 15; + const u32 v430 = (lid43 >> 0) & 15; + const u32 v431 = (lid43 >> 4) & 15; + + l_bin2asc[lid40] = ((v400 < 10) ? '0' + v400 : 'a' - 10 + v400) << 8 + | ((v401 < 10) ? '0' + v401 : 'a' - 10 + v401) << 0; + l_bin2asc[lid41] = ((v410 < 10) ? '0' + v410 : 'a' - 10 + v410) << 8 + | ((v411 < 10) ? '0' + v411 : 'a' - 10 + v411) << 0; + l_bin2asc[lid42] = ((v420 < 10) ? '0' + v420 : 'a' - 10 + v420) << 8 + | ((v421 < 10) ? '0' + v421 : 'a' - 10 + v421) << 0; + l_bin2asc[lid43] = ((v430 < 10) ? '0' + v430 : 'a' - 10 + v430) << 8 + | ((v431 < 10) ? '0' + v431 : 'a' - 10 + v431) << 0; + + barrier (CLK_LOCAL_MEM_FENCE); + + if (gid >= gid_max) return; + + /** + * main + */ + + m02610m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset, l_bin2asc); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m02610_s04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = pws[gid].i[14]; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * bin2asc table + */ + + __local u32 l_bin2asc[256]; + + const u32 lid4 = lid * 4; + + const u32 lid40 = lid4 + 0; + const u32 lid41 = lid4 + 1; + const u32 lid42 = lid4 + 2; + const u32 lid43 = lid4 + 3; + + const u32 v400 = (lid40 >> 0) & 15; + const u32 v401 = (lid40 >> 4) & 15; + const u32 v410 = (lid41 >> 0) & 15; + const u32 v411 = (lid41 >> 4) & 15; + const u32 v420 = (lid42 >> 0) & 15; + const u32 v421 = (lid42 >> 4) & 15; + const u32 v430 = (lid43 >> 0) & 15; + const u32 v431 = (lid43 >> 4) & 15; + + l_bin2asc[lid40] = ((v400 < 10) ? '0' + v400 : 'a' - 10 + v400) << 8 + | ((v401 < 10) ? '0' + v401 : 'a' - 10 + v401) << 0; + l_bin2asc[lid41] = ((v410 < 10) ? '0' + v410 : 'a' - 10 + v410) << 8 + | ((v411 < 10) ? '0' + v411 : 'a' - 10 + v411) << 0; + l_bin2asc[lid42] = ((v420 < 10) ? '0' + v420 : 'a' - 10 + v420) << 8 + | ((v421 < 10) ? '0' + v421 : 'a' - 10 + v421) << 0; + l_bin2asc[lid43] = ((v430 < 10) ? '0' + v430 : 'a' - 10 + v430) << 8 + | ((v431 < 10) ? '0' + v431 : 'a' - 10 + v431) << 0; + + barrier (CLK_LOCAL_MEM_FENCE); + + if (gid >= gid_max) return; + + /** + * main + */ + + m02610s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset, l_bin2asc); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m02610_s08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = pws[gid].i[14]; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * bin2asc table + */ + + __local u32 l_bin2asc[256]; + + const u32 lid4 = lid * 4; + + const u32 lid40 = lid4 + 0; + const u32 lid41 = lid4 + 1; + const u32 lid42 = lid4 + 2; + const u32 lid43 = lid4 + 3; + + const u32 v400 = (lid40 >> 0) & 15; + const u32 v401 = (lid40 >> 4) & 15; + const u32 v410 = (lid41 >> 0) & 15; + const u32 v411 = (lid41 >> 4) & 15; + const u32 v420 = (lid42 >> 0) & 15; + const u32 v421 = (lid42 >> 4) & 15; + const u32 v430 = (lid43 >> 0) & 15; + const u32 v431 = (lid43 >> 4) & 15; + + l_bin2asc[lid40] = ((v400 < 10) ? '0' + v400 : 'a' - 10 + v400) << 8 + | ((v401 < 10) ? '0' + v401 : 'a' - 10 + v401) << 0; + l_bin2asc[lid41] = ((v410 < 10) ? '0' + v410 : 'a' - 10 + v410) << 8 + | ((v411 < 10) ? '0' + v411 : 'a' - 10 + v411) << 0; + l_bin2asc[lid42] = ((v420 < 10) ? '0' + v420 : 'a' - 10 + v420) << 8 + | ((v421 < 10) ? '0' + v421 : 'a' - 10 + v421) << 0; + l_bin2asc[lid43] = ((v430 < 10) ? '0' + v430 : 'a' - 10 + v430) << 8 + | ((v431 < 10) ? '0' + v431 : 'a' - 10 + v431) << 0; + + barrier (CLK_LOCAL_MEM_FENCE); + + if (gid >= gid_max) return; + + /** + * main + */ + + m02610s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset, l_bin2asc); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m02610_s16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = pws[gid].i[ 8]; + w2[1] = pws[gid].i[ 9]; + w2[2] = pws[gid].i[10]; + w2[3] = pws[gid].i[11]; + + u32x w3[4]; + + w3[0] = pws[gid].i[12]; + w3[1] = pws[gid].i[13]; + w3[2] = pws[gid].i[14]; + w3[3] = pws[gid].i[15]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * bin2asc table + */ + + __local u32 l_bin2asc[256]; + + const u32 lid4 = lid * 4; + + const u32 lid40 = lid4 + 0; + const u32 lid41 = lid4 + 1; + const u32 lid42 = lid4 + 2; + const u32 lid43 = lid4 + 3; + + const u32 v400 = (lid40 >> 0) & 15; + const u32 v401 = (lid40 >> 4) & 15; + const u32 v410 = (lid41 >> 0) & 15; + const u32 v411 = (lid41 >> 4) & 15; + const u32 v420 = (lid42 >> 0) & 15; + const u32 v421 = (lid42 >> 4) & 15; + const u32 v430 = (lid43 >> 0) & 15; + const u32 v431 = (lid43 >> 4) & 15; + + l_bin2asc[lid40] = ((v400 < 10) ? '0' + v400 : 'a' - 10 + v400) << 8 + | ((v401 < 10) ? '0' + v401 : 'a' - 10 + v401) << 0; + l_bin2asc[lid41] = ((v410 < 10) ? '0' + v410 : 'a' - 10 + v410) << 8 + | ((v411 < 10) ? '0' + v411 : 'a' - 10 + v411) << 0; + l_bin2asc[lid42] = ((v420 < 10) ? '0' + v420 : 'a' - 10 + v420) << 8 + | ((v421 < 10) ? '0' + v421 : 'a' - 10 + v421) << 0; + l_bin2asc[lid43] = ((v430 < 10) ? '0' + v430 : 'a' - 10 + v430) << 8 + | ((v431 < 10) ? '0' + v431 : 'a' - 10 + v431) << 0; + + barrier (CLK_LOCAL_MEM_FENCE); + + if (gid >= gid_max) return; + + /** + * main + */ + + m02610s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset, l_bin2asc); +} diff --git a/amd/m02710_a0.cl b/amd/m02710_a0.cl new file mode 100644 index 0000000000..290f5d96b0 --- /dev/null +++ b/amd/m02710_a0.cl @@ -0,0 +1,876 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _MD5_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW4 +#define VECT_SIZE4 +#endif + +#ifdef VLIW5 +#define VECT_SIZE4 +#endif + +#define DGST_R0 0 +#define DGST_R1 3 +#define DGST_R2 2 +#define DGST_R3 1 + +#include "include/kernel_functions.c" +#include "types_amd.c" +#include "common_amd.c" +#include "include/rp_gpu.h" +#include "rp_amd.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +#ifdef VECT_SIZE1 +#define uint_to_hex_lower8(i) l_bin2asc[(i)] +#endif + +#ifdef VECT_SIZE2 +#define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1]) +#endif + +#ifdef VECT_SIZE4 +#define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3]) +#endif + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m02710_m04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + u32x pw_buf1[4]; + + pw_buf1[0] = pws[gid].i[ 4]; + pw_buf1[1] = pws[gid].i[ 5]; + pw_buf1[2] = pws[gid].i[ 6]; + pw_buf1[3] = pws[gid].i[ 7]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * salt + */ + + u32 s[8]; + + s[0] = salt_bufs[salt_pos].salt_buf[0]; + s[1] = salt_bufs[salt_pos].salt_buf[1]; + s[2] = salt_bufs[salt_pos].salt_buf[2]; + s[3] = salt_bufs[salt_pos].salt_buf[3]; + s[4] = salt_bufs[salt_pos].salt_buf[4]; + s[5] = salt_bufs[salt_pos].salt_buf[5]; + s[6] = salt_bufs[salt_pos].salt_buf[6]; + s[7] = salt_bufs[salt_pos].salt_buf[7]; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + const u32 r_14 = (32 + salt_len) * 8; + + /** + * bin2asc table + */ + + __local u32 l_bin2asc[256]; + + const u32 lid4 = lid * 4; + + const u32 lid40 = lid4 + 0; + const u32 lid41 = lid4 + 1; + const u32 lid42 = lid4 + 2; + const u32 lid43 = lid4 + 3; + + const u32 v400 = (lid40 >> 0) & 15; + const u32 v401 = (lid40 >> 4) & 15; + const u32 v410 = (lid41 >> 0) & 15; + const u32 v411 = (lid41 >> 4) & 15; + const u32 v420 = (lid42 >> 0) & 15; + const u32 v421 = (lid42 >> 4) & 15; + const u32 v430 = (lid43 >> 0) & 15; + const u32 v431 = (lid43 >> 4) & 15; + + l_bin2asc[lid40] = ((v400 < 10) ? '0' + v400 : 'a' - 10 + v400) << 8 + | ((v401 < 10) ? '0' + v401 : 'a' - 10 + v401) << 0; + l_bin2asc[lid41] = ((v410 < 10) ? '0' + v410 : 'a' - 10 + v410) << 8 + | ((v411 < 10) ? '0' + v411 : 'a' - 10 + v411) << 0; + l_bin2asc[lid42] = ((v420 < 10) ? '0' + v420 : 'a' - 10 + v420) << 8 + | ((v421 < 10) ? '0' + v421 : 'a' - 10 + v421) << 0; + l_bin2asc[lid43] = ((v430 < 10) ? '0' + v430 : 'a' - 10 + v430) << 8 + | ((v431 < 10) ? '0' + v431 : 'a' - 10 + v431) << 0; + + barrier (CLK_LOCAL_MEM_FENCE); + + if (gid >= gid_max) return; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + + w0[0] = pw_buf0[0]; + w0[1] = pw_buf0[1]; + w0[2] = pw_buf0[2]; + w0[3] = pw_buf0[3]; + + u32x w1[4]; + + w1[0] = pw_buf1[0]; + w1[1] = pw_buf1[1]; + w1[2] = pw_buf1[2]; + w1[3] = pw_buf1[3]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 out_len = apply_rules (rules_buf[il_pos].cmds, w0, w1, pw_len); + + append_0x80_2 (w0, w1, out_len); + + w3[2] = out_len * 8; + + u32x a = MD5M_A; + u32x b = MD5M_B; + u32x c = MD5M_C; + u32x d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H , a, b, c, d, w1[1], MD5C20, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w2[0], MD5C21, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w2[3], MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w3[2], MD5C23, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w0[1], MD5C24, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w1[0], MD5C25, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w1[3], MD5C26, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w2[2], MD5C27, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w3[1], MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w0[0], MD5C29, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w0[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w1[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w2[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w3[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w3[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w0[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1[0], MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w2[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2[1], MD5C3f, MD5S33); + + a += MD5M_A; + b += MD5M_B; + c += MD5M_C; + d += MD5M_D; + + const u32x w0_t = uint_to_hex_lower8 ((a >> 0) & 255) << 0 + | uint_to_hex_lower8 ((a >> 8) & 255) << 16; + const u32x w1_t = uint_to_hex_lower8 ((a >> 16) & 255) << 0 + | uint_to_hex_lower8 ((a >> 24) & 255) << 16; + const u32x w2_t = uint_to_hex_lower8 ((b >> 0) & 255) << 0 + | uint_to_hex_lower8 ((b >> 8) & 255) << 16; + const u32x w3_t = uint_to_hex_lower8 ((b >> 16) & 255) << 0 + | uint_to_hex_lower8 ((b >> 24) & 255) << 16; + const u32x w4_t = uint_to_hex_lower8 ((c >> 0) & 255) << 0 + | uint_to_hex_lower8 ((c >> 8) & 255) << 16; + const u32x w5_t = uint_to_hex_lower8 ((c >> 16) & 255) << 0 + | uint_to_hex_lower8 ((c >> 24) & 255) << 16; + const u32x w6_t = uint_to_hex_lower8 ((d >> 0) & 255) << 0 + | uint_to_hex_lower8 ((d >> 8) & 255) << 16; + const u32x w7_t = uint_to_hex_lower8 ((d >> 16) & 255) << 0 + | uint_to_hex_lower8 ((d >> 24) & 255) << 16; + + const u32 w8_t = s[0]; + const u32 w9_t = s[1]; + const u32 wa_t = s[2]; + const u32 wb_t = s[3]; + const u32 wc_t = s[4]; + const u32 wd_t = s[5]; + const u32 we_t = s[6]; + const u32 wf_t = s[7]; + + a = MD5M_A; + b = MD5M_B; + c = MD5M_C; + d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t, MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t, MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t, MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t, MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w4_t, MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w5_t, MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w6_t, MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w7_t, MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w8_t, MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w9_t, MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, wa_t, MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, wb_t, MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, wc_t, MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, wd_t, MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, we_t, MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, wf_t, MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w1_t, MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w6_t, MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, wb_t, MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t, MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w5_t, MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, wa_t, MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, wf_t, MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w4_t, MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w9_t, MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, we_t, MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t, MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w8_t, MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, wd_t, MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t, MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w7_t, MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, wc_t, MD5C1f, MD5S13); + + MD5_STEP (MD5_H , a, b, c, d, w5_t, MD5C20, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w8_t, MD5C21, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, wb_t, MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, we_t, MD5C23, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w1_t, MD5C24, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w4_t, MD5C25, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w7_t, MD5C26, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, wa_t, MD5C27, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, wd_t, MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w0_t, MD5C29, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w3_t, MD5C2a, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w6_t, MD5C2b, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w9_t, MD5C2c, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, wc_t, MD5C2d, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, wf_t, MD5C2e, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w2_t, MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t, MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w7_t, MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, we_t, MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w5_t, MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, wc_t, MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t, MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, wa_t, MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t, MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w8_t, MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, wf_t, MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w6_t, MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, wd_t, MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w4_t, MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, wb_t, MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t, MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w9_t, MD5C3f, MD5S33); + + const u32x r_a = a + MD5M_A; + const u32x r_b = b + MD5M_B; + const u32x r_c = c + MD5M_C; + const u32x r_d = d + MD5M_D; + + a = r_a; + b = r_b; + c = r_c; + d = r_d; + + MD5_STEP0(MD5_Fo, a, b, c, d, MD5C00, MD5S00); + MD5_STEP0(MD5_Fo, d, a, b, c, MD5C01, MD5S01); + MD5_STEP0(MD5_Fo, c, d, a, b, MD5C02, MD5S02); + MD5_STEP0(MD5_Fo, b, c, d, a, MD5C03, MD5S03); + MD5_STEP0(MD5_Fo, a, b, c, d, MD5C04, MD5S00); + MD5_STEP0(MD5_Fo, d, a, b, c, MD5C05, MD5S01); + MD5_STEP0(MD5_Fo, c, d, a, b, MD5C06, MD5S02); + MD5_STEP0(MD5_Fo, b, c, d, a, MD5C07, MD5S03); + MD5_STEP0(MD5_Fo, a, b, c, d, MD5C08, MD5S00); + MD5_STEP0(MD5_Fo, d, a, b, c, MD5C09, MD5S01); + MD5_STEP0(MD5_Fo, c, d, a, b, MD5C0a, MD5S02); + MD5_STEP0(MD5_Fo, b, c, d, a, MD5C0b, MD5S03); + MD5_STEP0(MD5_Fo, a, b, c, d, MD5C0c, MD5S00); + MD5_STEP0(MD5_Fo, d, a, b, c, MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, r_14, MD5C0e, MD5S02); + MD5_STEP0(MD5_Fo, b, c, d, a, MD5C0f, MD5S03); + + MD5_STEP0(MD5_Go, a, b, c, d, MD5C10, MD5S10); + MD5_STEP0(MD5_Go, d, a, b, c, MD5C11, MD5S11); + MD5_STEP0(MD5_Go, c, d, a, b, MD5C12, MD5S12); + MD5_STEP0(MD5_Go, b, c, d, a, MD5C13, MD5S13); + MD5_STEP0(MD5_Go, a, b, c, d, MD5C14, MD5S10); + MD5_STEP0(MD5_Go, d, a, b, c, MD5C15, MD5S11); + MD5_STEP0(MD5_Go, c, d, a, b, MD5C16, MD5S12); + MD5_STEP0(MD5_Go, b, c, d, a, MD5C17, MD5S13); + MD5_STEP0(MD5_Go, a, b, c, d, MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, r_14, MD5C19, MD5S11); + MD5_STEP0(MD5_Go, c, d, a, b, MD5C1a, MD5S12); + MD5_STEP0(MD5_Go, b, c, d, a, MD5C1b, MD5S13); + MD5_STEP0(MD5_Go, a, b, c, d, MD5C1c, MD5S10); + MD5_STEP0(MD5_Go, d, a, b, c, MD5C1d, MD5S11); + MD5_STEP0(MD5_Go, c, d, a, b, MD5C1e, MD5S12); + MD5_STEP0(MD5_Go, b, c, d, a, MD5C1f, MD5S13); + + MD5_STEP0(MD5_H , a, b, c, d, MD5C20, MD5S20); + MD5_STEP0(MD5_H , d, a, b, c, MD5C21, MD5S21); + MD5_STEP0(MD5_H , c, d, a, b, MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, r_14, MD5C23, MD5S23); + MD5_STEP0(MD5_H , a, b, c, d, MD5C24, MD5S20); + MD5_STEP0(MD5_H , d, a, b, c, MD5C25, MD5S21); + MD5_STEP0(MD5_H , c, d, a, b, MD5C26, MD5S22); + MD5_STEP0(MD5_H , b, c, d, a, MD5C27, MD5S23); + MD5_STEP0(MD5_H , a, b, c, d, MD5C28, MD5S20); + MD5_STEP0(MD5_H , d, a, b, c, MD5C29, MD5S21); + MD5_STEP0(MD5_H , c, d, a, b, MD5C2a, MD5S22); + MD5_STEP0(MD5_H , b, c, d, a, MD5C2b, MD5S23); + MD5_STEP0(MD5_H , a, b, c, d, MD5C2c, MD5S20); + MD5_STEP0(MD5_H , d, a, b, c, MD5C2d, MD5S21); + MD5_STEP0(MD5_H , c, d, a, b, MD5C2e, MD5S22); + MD5_STEP0(MD5_H , b, c, d, a, MD5C2f, MD5S23); + + MD5_STEP0(MD5_I , a, b, c, d, MD5C30, MD5S30); + MD5_STEP0(MD5_I , d, a, b, c, MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, r_14, MD5C32, MD5S32); + MD5_STEP0(MD5_I , b, c, d, a, MD5C33, MD5S33); + MD5_STEP0(MD5_I , a, b, c, d, MD5C34, MD5S30); + MD5_STEP0(MD5_I , d, a, b, c, MD5C35, MD5S31); + MD5_STEP0(MD5_I , c, d, a, b, MD5C36, MD5S32); + MD5_STEP0(MD5_I , b, c, d, a, MD5C37, MD5S33); + MD5_STEP0(MD5_I , a, b, c, d, MD5C38, MD5S30); + MD5_STEP0(MD5_I , d, a, b, c, MD5C39, MD5S31); + MD5_STEP0(MD5_I , c, d, a, b, MD5C3a, MD5S32); + MD5_STEP0(MD5_I , b, c, d, a, MD5C3b, MD5S33); + MD5_STEP0(MD5_I , a, b, c, d, MD5C3c, MD5S30); + MD5_STEP0(MD5_I , d, a, b, c, MD5C3d, MD5S31); + MD5_STEP0(MD5_I , c, d, a, b, MD5C3e, MD5S32); + MD5_STEP0(MD5_I , b, c, d, a, MD5C3f, MD5S33); + + a += r_a; + b += r_b; + c += r_c; + d += r_d; + + const u32x r0 = a; + const u32x r1 = d; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_M + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m02710_m08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m02710_m16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m02710_s04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + u32x pw_buf1[4]; + + pw_buf1[0] = pws[gid].i[ 4]; + pw_buf1[1] = pws[gid].i[ 5]; + pw_buf1[2] = pws[gid].i[ 6]; + pw_buf1[3] = pws[gid].i[ 7]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * salt + */ + + u32 s[8]; + + s[0] = salt_bufs[salt_pos].salt_buf[0]; + s[1] = salt_bufs[salt_pos].salt_buf[1]; + s[2] = salt_bufs[salt_pos].salt_buf[2]; + s[3] = salt_bufs[salt_pos].salt_buf[3]; + s[4] = salt_bufs[salt_pos].salt_buf[4]; + s[5] = salt_bufs[salt_pos].salt_buf[5]; + s[6] = salt_bufs[salt_pos].salt_buf[6]; + s[7] = salt_bufs[salt_pos].salt_buf[7]; + + u32 salt_len = salt_bufs[salt_pos].salt_len; + + const u32 r_14 = (32 + salt_len) * 8; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * bin2asc table + */ + + __local u32 l_bin2asc[256]; + + const u32 lid4 = lid * 4; + + const u32 lid40 = lid4 + 0; + const u32 lid41 = lid4 + 1; + const u32 lid42 = lid4 + 2; + const u32 lid43 = lid4 + 3; + + const u32 v400 = (lid40 >> 0) & 15; + const u32 v401 = (lid40 >> 4) & 15; + const u32 v410 = (lid41 >> 0) & 15; + const u32 v411 = (lid41 >> 4) & 15; + const u32 v420 = (lid42 >> 0) & 15; + const u32 v421 = (lid42 >> 4) & 15; + const u32 v430 = (lid43 >> 0) & 15; + const u32 v431 = (lid43 >> 4) & 15; + + l_bin2asc[lid40] = ((v400 < 10) ? '0' + v400 : 'a' - 10 + v400) << 8 + | ((v401 < 10) ? '0' + v401 : 'a' - 10 + v401) << 0; + l_bin2asc[lid41] = ((v410 < 10) ? '0' + v410 : 'a' - 10 + v410) << 8 + | ((v411 < 10) ? '0' + v411 : 'a' - 10 + v411) << 0; + l_bin2asc[lid42] = ((v420 < 10) ? '0' + v420 : 'a' - 10 + v420) << 8 + | ((v421 < 10) ? '0' + v421 : 'a' - 10 + v421) << 0; + l_bin2asc[lid43] = ((v430 < 10) ? '0' + v430 : 'a' - 10 + v430) << 8 + | ((v431 < 10) ? '0' + v431 : 'a' - 10 + v431) << 0; + + barrier (CLK_LOCAL_MEM_FENCE); + + if (gid >= gid_max) return; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + + w0[0] = pw_buf0[0]; + w0[1] = pw_buf0[1]; + w0[2] = pw_buf0[2]; + w0[3] = pw_buf0[3]; + + u32x w1[4]; + + w1[0] = pw_buf1[0]; + w1[1] = pw_buf1[1]; + w1[2] = pw_buf1[2]; + w1[3] = pw_buf1[3]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 out_len = apply_rules (rules_buf[il_pos].cmds, w0, w1, pw_len); + + append_0x80_2 (w0, w1, out_len); + + w3[2] = out_len * 8; + + u32x a = MD5M_A; + u32x b = MD5M_B; + u32x c = MD5M_C; + u32x d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H , a, b, c, d, w1[1], MD5C20, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w2[0], MD5C21, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w2[3], MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w3[2], MD5C23, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w0[1], MD5C24, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w1[0], MD5C25, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w1[3], MD5C26, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w2[2], MD5C27, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w3[1], MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w0[0], MD5C29, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w0[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w1[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w2[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w3[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w3[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w0[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1[0], MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w2[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2[1], MD5C3f, MD5S33); + + a += MD5M_A; + b += MD5M_B; + c += MD5M_C; + d += MD5M_D; + + const u32x w0_t = uint_to_hex_lower8 ((a >> 0) & 255) << 0 + | uint_to_hex_lower8 ((a >> 8) & 255) << 16; + const u32x w1_t = uint_to_hex_lower8 ((a >> 16) & 255) << 0 + | uint_to_hex_lower8 ((a >> 24) & 255) << 16; + const u32x w2_t = uint_to_hex_lower8 ((b >> 0) & 255) << 0 + | uint_to_hex_lower8 ((b >> 8) & 255) << 16; + const u32x w3_t = uint_to_hex_lower8 ((b >> 16) & 255) << 0 + | uint_to_hex_lower8 ((b >> 24) & 255) << 16; + const u32x w4_t = uint_to_hex_lower8 ((c >> 0) & 255) << 0 + | uint_to_hex_lower8 ((c >> 8) & 255) << 16; + const u32x w5_t = uint_to_hex_lower8 ((c >> 16) & 255) << 0 + | uint_to_hex_lower8 ((c >> 24) & 255) << 16; + const u32x w6_t = uint_to_hex_lower8 ((d >> 0) & 255) << 0 + | uint_to_hex_lower8 ((d >> 8) & 255) << 16; + const u32x w7_t = uint_to_hex_lower8 ((d >> 16) & 255) << 0 + | uint_to_hex_lower8 ((d >> 24) & 255) << 16; + + const u32 w8_t = s[0]; + const u32 w9_t = s[1]; + const u32 wa_t = s[2]; + const u32 wb_t = s[3]; + const u32 wc_t = s[4]; + const u32 wd_t = s[5]; + const u32 we_t = s[6]; + const u32 wf_t = s[7]; + + a = MD5M_A; + b = MD5M_B; + c = MD5M_C; + d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t, MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t, MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t, MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t, MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w4_t, MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w5_t, MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w6_t, MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w7_t, MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w8_t, MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w9_t, MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, wa_t, MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, wb_t, MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, wc_t, MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, wd_t, MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, we_t, MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, wf_t, MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w1_t, MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w6_t, MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, wb_t, MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t, MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w5_t, MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, wa_t, MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, wf_t, MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w4_t, MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w9_t, MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, we_t, MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t, MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w8_t, MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, wd_t, MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t, MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w7_t, MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, wc_t, MD5C1f, MD5S13); + + MD5_STEP (MD5_H , a, b, c, d, w5_t, MD5C20, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w8_t, MD5C21, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, wb_t, MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, we_t, MD5C23, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w1_t, MD5C24, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w4_t, MD5C25, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w7_t, MD5C26, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, wa_t, MD5C27, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, wd_t, MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w0_t, MD5C29, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w3_t, MD5C2a, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w6_t, MD5C2b, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w9_t, MD5C2c, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, wc_t, MD5C2d, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, wf_t, MD5C2e, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w2_t, MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t, MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w7_t, MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, we_t, MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w5_t, MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, wc_t, MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t, MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, wa_t, MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t, MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w8_t, MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, wf_t, MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w6_t, MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, wd_t, MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w4_t, MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, wb_t, MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t, MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w9_t, MD5C3f, MD5S33); + + const u32x r_a = a + MD5M_A; + const u32x r_b = b + MD5M_B; + const u32x r_c = c + MD5M_C; + const u32x r_d = d + MD5M_D; + + a = r_a; + b = r_b; + c = r_c; + d = r_d; + + MD5_STEP0(MD5_Fo, a, b, c, d, MD5C00, MD5S00); + MD5_STEP0(MD5_Fo, d, a, b, c, MD5C01, MD5S01); + MD5_STEP0(MD5_Fo, c, d, a, b, MD5C02, MD5S02); + MD5_STEP0(MD5_Fo, b, c, d, a, MD5C03, MD5S03); + MD5_STEP0(MD5_Fo, a, b, c, d, MD5C04, MD5S00); + MD5_STEP0(MD5_Fo, d, a, b, c, MD5C05, MD5S01); + MD5_STEP0(MD5_Fo, c, d, a, b, MD5C06, MD5S02); + MD5_STEP0(MD5_Fo, b, c, d, a, MD5C07, MD5S03); + MD5_STEP0(MD5_Fo, a, b, c, d, MD5C08, MD5S00); + MD5_STEP0(MD5_Fo, d, a, b, c, MD5C09, MD5S01); + MD5_STEP0(MD5_Fo, c, d, a, b, MD5C0a, MD5S02); + MD5_STEP0(MD5_Fo, b, c, d, a, MD5C0b, MD5S03); + MD5_STEP0(MD5_Fo, a, b, c, d, MD5C0c, MD5S00); + MD5_STEP0(MD5_Fo, d, a, b, c, MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, r_14, MD5C0e, MD5S02); + MD5_STEP0(MD5_Fo, b, c, d, a, MD5C0f, MD5S03); + + MD5_STEP0(MD5_Go, a, b, c, d, MD5C10, MD5S10); + MD5_STEP0(MD5_Go, d, a, b, c, MD5C11, MD5S11); + MD5_STEP0(MD5_Go, c, d, a, b, MD5C12, MD5S12); + MD5_STEP0(MD5_Go, b, c, d, a, MD5C13, MD5S13); + MD5_STEP0(MD5_Go, a, b, c, d, MD5C14, MD5S10); + MD5_STEP0(MD5_Go, d, a, b, c, MD5C15, MD5S11); + MD5_STEP0(MD5_Go, c, d, a, b, MD5C16, MD5S12); + MD5_STEP0(MD5_Go, b, c, d, a, MD5C17, MD5S13); + MD5_STEP0(MD5_Go, a, b, c, d, MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, r_14, MD5C19, MD5S11); + MD5_STEP0(MD5_Go, c, d, a, b, MD5C1a, MD5S12); + MD5_STEP0(MD5_Go, b, c, d, a, MD5C1b, MD5S13); + MD5_STEP0(MD5_Go, a, b, c, d, MD5C1c, MD5S10); + MD5_STEP0(MD5_Go, d, a, b, c, MD5C1d, MD5S11); + MD5_STEP0(MD5_Go, c, d, a, b, MD5C1e, MD5S12); + MD5_STEP0(MD5_Go, b, c, d, a, MD5C1f, MD5S13); + + MD5_STEP0(MD5_H , a, b, c, d, MD5C20, MD5S20); + MD5_STEP0(MD5_H , d, a, b, c, MD5C21, MD5S21); + MD5_STEP0(MD5_H , c, d, a, b, MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, r_14, MD5C23, MD5S23); + MD5_STEP0(MD5_H , a, b, c, d, MD5C24, MD5S20); + MD5_STEP0(MD5_H , d, a, b, c, MD5C25, MD5S21); + MD5_STEP0(MD5_H , c, d, a, b, MD5C26, MD5S22); + MD5_STEP0(MD5_H , b, c, d, a, MD5C27, MD5S23); + MD5_STEP0(MD5_H , a, b, c, d, MD5C28, MD5S20); + MD5_STEP0(MD5_H , d, a, b, c, MD5C29, MD5S21); + MD5_STEP0(MD5_H , c, d, a, b, MD5C2a, MD5S22); + MD5_STEP0(MD5_H , b, c, d, a, MD5C2b, MD5S23); + MD5_STEP0(MD5_H , a, b, c, d, MD5C2c, MD5S20); + MD5_STEP0(MD5_H , d, a, b, c, MD5C2d, MD5S21); + MD5_STEP0(MD5_H , c, d, a, b, MD5C2e, MD5S22); + MD5_STEP0(MD5_H , b, c, d, a, MD5C2f, MD5S23); + + MD5_STEP0(MD5_I , a, b, c, d, MD5C30, MD5S30); + MD5_STEP0(MD5_I , d, a, b, c, MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, r_14, MD5C32, MD5S32); + MD5_STEP0(MD5_I , b, c, d, a, MD5C33, MD5S33); + MD5_STEP0(MD5_I , a, b, c, d, MD5C34, MD5S30); + MD5_STEP0(MD5_I , d, a, b, c, MD5C35, MD5S31); + MD5_STEP0(MD5_I , c, d, a, b, MD5C36, MD5S32); + MD5_STEP0(MD5_I , b, c, d, a, MD5C37, MD5S33); + MD5_STEP0(MD5_I , a, b, c, d, MD5C38, MD5S30); + MD5_STEP0(MD5_I , d, a, b, c, MD5C39, MD5S31); + MD5_STEP0(MD5_I , c, d, a, b, MD5C3a, MD5S32); + MD5_STEP0(MD5_I , b, c, d, a, MD5C3b, MD5S33); + MD5_STEP0(MD5_I , a, b, c, d, MD5C3c, MD5S30); + + if (allx ((a + r_a) != search[0])) continue; + + MD5_STEP0(MD5_I , d, a, b, c, MD5C3d, MD5S31); + MD5_STEP0(MD5_I , c, d, a, b, MD5C3e, MD5S32); + MD5_STEP0(MD5_I , b, c, d, a, MD5C3f, MD5S33); + + a += r_a; + b += r_b; + c += r_c; + d += r_d; + + const u32x r0 = a; + const u32x r1 = d; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_S + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m02710_s08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m02710_s16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/amd/m02710_a1.cl b/amd/m02710_a1.cl new file mode 100644 index 0000000000..6b587370ab --- /dev/null +++ b/amd/m02710_a1.cl @@ -0,0 +1,982 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _MD5_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW4 +#define VECT_SIZE4 +#endif + +#ifdef VLIW5 +#define VECT_SIZE4 +#endif + +#define DGST_R0 0 +#define DGST_R1 3 +#define DGST_R2 2 +#define DGST_R3 1 + +#include "include/kernel_functions.c" +#include "types_amd.c" +#include "common_amd.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +#ifdef VECT_SIZE1 +#define uint_to_hex_lower8(i) l_bin2asc[(i)] +#endif + +#ifdef VECT_SIZE1 +#define uint_to_hex_lower8(i) l_bin2asc[(i)] +#endif + +#ifdef VECT_SIZE2 +#define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1]) +#endif + +#ifdef VECT_SIZE4 +#define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3]) +#endif + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m02710_m04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + append_0x80_2 (wordl0, wordl1, pw_l_len); + + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, combs_buf[0].pw_len); + } + + /** + * salt + */ + + u32 s[8]; + + s[0] = salt_bufs[salt_pos].salt_buf[0]; + s[1] = salt_bufs[salt_pos].salt_buf[1]; + s[2] = salt_bufs[salt_pos].salt_buf[2]; + s[3] = salt_bufs[salt_pos].salt_buf[3]; + s[4] = salt_bufs[salt_pos].salt_buf[4]; + s[5] = salt_bufs[salt_pos].salt_buf[5]; + s[6] = salt_bufs[salt_pos].salt_buf[6]; + s[7] = salt_bufs[salt_pos].salt_buf[7]; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + const u32 r_14 = (32 + salt_len) * 8; + + /** + * bin2asc table + */ + + __local u32 l_bin2asc[256]; + + const u32 lid4 = lid * 4; + + const u32 lid40 = lid4 + 0; + const u32 lid41 = lid4 + 1; + const u32 lid42 = lid4 + 2; + const u32 lid43 = lid4 + 3; + + const u32 v400 = (lid40 >> 0) & 15; + const u32 v401 = (lid40 >> 4) & 15; + const u32 v410 = (lid41 >> 0) & 15; + const u32 v411 = (lid41 >> 4) & 15; + const u32 v420 = (lid42 >> 0) & 15; + const u32 v421 = (lid42 >> 4) & 15; + const u32 v430 = (lid43 >> 0) & 15; + const u32 v431 = (lid43 >> 4) & 15; + + l_bin2asc[lid40] = ((v400 < 10) ? '0' + v400 : 'a' - 10 + v400) << 8 + | ((v401 < 10) ? '0' + v401 : 'a' - 10 + v401) << 0; + l_bin2asc[lid41] = ((v410 < 10) ? '0' + v410 : 'a' - 10 + v410) << 8 + | ((v411 < 10) ? '0' + v411 : 'a' - 10 + v411) << 0; + l_bin2asc[lid42] = ((v420 < 10) ? '0' + v420 : 'a' - 10 + v420) << 8 + | ((v421 < 10) ? '0' + v421 : 'a' - 10 + v421) << 0; + l_bin2asc[lid43] = ((v430 < 10) ? '0' + v430 : 'a' - 10 + v430) << 8 + | ((v431 < 10) ? '0' + v431 : 'a' - 10 + v431) << 0; + + barrier (CLK_LOCAL_MEM_FENCE); + + if (gid >= gid_max) return; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = combs_buf[il_pos].pw_len; + + const u32 pw_len = pw_l_len + pw_r_len; + + u32 wordr0[4]; + + wordr0[0] = combs_buf[il_pos].i[0]; + wordr0[1] = combs_buf[il_pos].i[1]; + wordr0[2] = combs_buf[il_pos].i[2]; + wordr0[3] = combs_buf[il_pos].i[3]; + + u32 wordr1[4]; + + wordr1[0] = combs_buf[il_pos].i[4]; + wordr1[1] = combs_buf[il_pos].i[5]; + wordr1[2] = combs_buf[il_pos].i[6]; + wordr1[3] = combs_buf[il_pos].i[7]; + + u32 wordr2[4]; + + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + + u32 wordr3[4]; + + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + u32x w0[4]; + + w0[0] = wordl0[0] | wordr0[0]; + w0[1] = wordl0[1] | wordr0[1]; + w0[2] = wordl0[2] | wordr0[2]; + w0[3] = wordl0[3] | wordr0[3]; + + u32x w1[4]; + + w1[0] = wordl1[0] | wordr1[0]; + w1[1] = wordl1[1] | wordr1[1]; + w1[2] = wordl1[2] | wordr1[2]; + w1[3] = wordl1[3] | wordr1[3]; + + u32x w2[4]; + + w2[0] = wordl2[0] | wordr2[0]; + w2[1] = wordl2[1] | wordr2[1]; + w2[2] = wordl2[2] | wordr2[2]; + w2[3] = wordl2[3] | wordr2[3]; + + u32x w3[4]; + + w3[0] = wordl3[0] | wordr3[0]; + w3[1] = wordl3[1] | wordr3[1]; + w3[2] = pw_len * 8; + w3[3] = 0; + + u32x a = MD5M_A; + u32x b = MD5M_B; + u32x c = MD5M_C; + u32x d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H , a, b, c, d, w1[1], MD5C20, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w2[0], MD5C21, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w2[3], MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w3[2], MD5C23, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w0[1], MD5C24, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w1[0], MD5C25, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w1[3], MD5C26, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w2[2], MD5C27, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w3[1], MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w0[0], MD5C29, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w0[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w1[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w2[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w3[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w3[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w0[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1[0], MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w2[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2[1], MD5C3f, MD5S33); + + a += MD5M_A; + b += MD5M_B; + c += MD5M_C; + d += MD5M_D; + + const u32x w0_t = uint_to_hex_lower8 ((a >> 0) & 255) << 0 + | uint_to_hex_lower8 ((a >> 8) & 255) << 16; + const u32x w1_t = uint_to_hex_lower8 ((a >> 16) & 255) << 0 + | uint_to_hex_lower8 ((a >> 24) & 255) << 16; + const u32x w2_t = uint_to_hex_lower8 ((b >> 0) & 255) << 0 + | uint_to_hex_lower8 ((b >> 8) & 255) << 16; + const u32x w3_t = uint_to_hex_lower8 ((b >> 16) & 255) << 0 + | uint_to_hex_lower8 ((b >> 24) & 255) << 16; + const u32x w4_t = uint_to_hex_lower8 ((c >> 0) & 255) << 0 + | uint_to_hex_lower8 ((c >> 8) & 255) << 16; + const u32x w5_t = uint_to_hex_lower8 ((c >> 16) & 255) << 0 + | uint_to_hex_lower8 ((c >> 24) & 255) << 16; + const u32x w6_t = uint_to_hex_lower8 ((d >> 0) & 255) << 0 + | uint_to_hex_lower8 ((d >> 8) & 255) << 16; + const u32x w7_t = uint_to_hex_lower8 ((d >> 16) & 255) << 0 + | uint_to_hex_lower8 ((d >> 24) & 255) << 16; + + const u32 w8_t = s[0]; + const u32 w9_t = s[1]; + const u32 wa_t = s[2]; + const u32 wb_t = s[3]; + const u32 wc_t = s[4]; + const u32 wd_t = s[5]; + const u32 we_t = s[6]; + const u32 wf_t = s[7]; + + a = MD5M_A; + b = MD5M_B; + c = MD5M_C; + d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t, MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t, MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t, MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t, MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w4_t, MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w5_t, MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w6_t, MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w7_t, MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w8_t, MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w9_t, MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, wa_t, MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, wb_t, MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, wc_t, MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, wd_t, MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, we_t, MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, wf_t, MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w1_t, MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w6_t, MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, wb_t, MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t, MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w5_t, MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, wa_t, MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, wf_t, MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w4_t, MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w9_t, MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, we_t, MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t, MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w8_t, MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, wd_t, MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t, MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w7_t, MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, wc_t, MD5C1f, MD5S13); + + MD5_STEP (MD5_H , a, b, c, d, w5_t, MD5C20, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w8_t, MD5C21, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, wb_t, MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, we_t, MD5C23, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w1_t, MD5C24, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w4_t, MD5C25, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w7_t, MD5C26, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, wa_t, MD5C27, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, wd_t, MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w0_t, MD5C29, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w3_t, MD5C2a, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w6_t, MD5C2b, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w9_t, MD5C2c, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, wc_t, MD5C2d, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, wf_t, MD5C2e, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w2_t, MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t, MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w7_t, MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, we_t, MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w5_t, MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, wc_t, MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t, MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, wa_t, MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t, MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w8_t, MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, wf_t, MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w6_t, MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, wd_t, MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w4_t, MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, wb_t, MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t, MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w9_t, MD5C3f, MD5S33); + + const u32x r_a = a + MD5M_A; + const u32x r_b = b + MD5M_B; + const u32x r_c = c + MD5M_C; + const u32x r_d = d + MD5M_D; + + a = r_a; + b = r_b; + c = r_c; + d = r_d; + + MD5_STEP0(MD5_Fo, a, b, c, d, MD5C00, MD5S00); + MD5_STEP0(MD5_Fo, d, a, b, c, MD5C01, MD5S01); + MD5_STEP0(MD5_Fo, c, d, a, b, MD5C02, MD5S02); + MD5_STEP0(MD5_Fo, b, c, d, a, MD5C03, MD5S03); + MD5_STEP0(MD5_Fo, a, b, c, d, MD5C04, MD5S00); + MD5_STEP0(MD5_Fo, d, a, b, c, MD5C05, MD5S01); + MD5_STEP0(MD5_Fo, c, d, a, b, MD5C06, MD5S02); + MD5_STEP0(MD5_Fo, b, c, d, a, MD5C07, MD5S03); + MD5_STEP0(MD5_Fo, a, b, c, d, MD5C08, MD5S00); + MD5_STEP0(MD5_Fo, d, a, b, c, MD5C09, MD5S01); + MD5_STEP0(MD5_Fo, c, d, a, b, MD5C0a, MD5S02); + MD5_STEP0(MD5_Fo, b, c, d, a, MD5C0b, MD5S03); + MD5_STEP0(MD5_Fo, a, b, c, d, MD5C0c, MD5S00); + MD5_STEP0(MD5_Fo, d, a, b, c, MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, r_14, MD5C0e, MD5S02); + MD5_STEP0(MD5_Fo, b, c, d, a, MD5C0f, MD5S03); + + MD5_STEP0(MD5_Go, a, b, c, d, MD5C10, MD5S10); + MD5_STEP0(MD5_Go, d, a, b, c, MD5C11, MD5S11); + MD5_STEP0(MD5_Go, c, d, a, b, MD5C12, MD5S12); + MD5_STEP0(MD5_Go, b, c, d, a, MD5C13, MD5S13); + MD5_STEP0(MD5_Go, a, b, c, d, MD5C14, MD5S10); + MD5_STEP0(MD5_Go, d, a, b, c, MD5C15, MD5S11); + MD5_STEP0(MD5_Go, c, d, a, b, MD5C16, MD5S12); + MD5_STEP0(MD5_Go, b, c, d, a, MD5C17, MD5S13); + MD5_STEP0(MD5_Go, a, b, c, d, MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, r_14, MD5C19, MD5S11); + MD5_STEP0(MD5_Go, c, d, a, b, MD5C1a, MD5S12); + MD5_STEP0(MD5_Go, b, c, d, a, MD5C1b, MD5S13); + MD5_STEP0(MD5_Go, a, b, c, d, MD5C1c, MD5S10); + MD5_STEP0(MD5_Go, d, a, b, c, MD5C1d, MD5S11); + MD5_STEP0(MD5_Go, c, d, a, b, MD5C1e, MD5S12); + MD5_STEP0(MD5_Go, b, c, d, a, MD5C1f, MD5S13); + + MD5_STEP0(MD5_H , a, b, c, d, MD5C20, MD5S20); + MD5_STEP0(MD5_H , d, a, b, c, MD5C21, MD5S21); + MD5_STEP0(MD5_H , c, d, a, b, MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, r_14, MD5C23, MD5S23); + MD5_STEP0(MD5_H , a, b, c, d, MD5C24, MD5S20); + MD5_STEP0(MD5_H , d, a, b, c, MD5C25, MD5S21); + MD5_STEP0(MD5_H , c, d, a, b, MD5C26, MD5S22); + MD5_STEP0(MD5_H , b, c, d, a, MD5C27, MD5S23); + MD5_STEP0(MD5_H , a, b, c, d, MD5C28, MD5S20); + MD5_STEP0(MD5_H , d, a, b, c, MD5C29, MD5S21); + MD5_STEP0(MD5_H , c, d, a, b, MD5C2a, MD5S22); + MD5_STEP0(MD5_H , b, c, d, a, MD5C2b, MD5S23); + MD5_STEP0(MD5_H , a, b, c, d, MD5C2c, MD5S20); + MD5_STEP0(MD5_H , d, a, b, c, MD5C2d, MD5S21); + MD5_STEP0(MD5_H , c, d, a, b, MD5C2e, MD5S22); + MD5_STEP0(MD5_H , b, c, d, a, MD5C2f, MD5S23); + + MD5_STEP0(MD5_I , a, b, c, d, MD5C30, MD5S30); + MD5_STEP0(MD5_I , d, a, b, c, MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, r_14, MD5C32, MD5S32); + MD5_STEP0(MD5_I , b, c, d, a, MD5C33, MD5S33); + MD5_STEP0(MD5_I , a, b, c, d, MD5C34, MD5S30); + MD5_STEP0(MD5_I , d, a, b, c, MD5C35, MD5S31); + MD5_STEP0(MD5_I , c, d, a, b, MD5C36, MD5S32); + MD5_STEP0(MD5_I , b, c, d, a, MD5C37, MD5S33); + MD5_STEP0(MD5_I , a, b, c, d, MD5C38, MD5S30); + MD5_STEP0(MD5_I , d, a, b, c, MD5C39, MD5S31); + MD5_STEP0(MD5_I , c, d, a, b, MD5C3a, MD5S32); + MD5_STEP0(MD5_I , b, c, d, a, MD5C3b, MD5S33); + MD5_STEP0(MD5_I , a, b, c, d, MD5C3c, MD5S30); + MD5_STEP0(MD5_I , d, a, b, c, MD5C3d, MD5S31); + MD5_STEP0(MD5_I , c, d, a, b, MD5C3e, MD5S32); + MD5_STEP0(MD5_I , b, c, d, a, MD5C3f, MD5S33); + + a += r_a; + b += r_b; + c += r_c; + d += r_d; + + const u32x r0 = a; + const u32x r1 = d; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_M + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m02710_m08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m02710_m16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m02710_s04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + append_0x80_2 (wordl0, wordl1, pw_l_len); + + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, combs_buf[0].pw_len); + } + + /** + * salt + */ + + u32 s[8]; + + s[0] = salt_bufs[salt_pos].salt_buf[0]; + s[1] = salt_bufs[salt_pos].salt_buf[1]; + s[2] = salt_bufs[salt_pos].salt_buf[2]; + s[3] = salt_bufs[salt_pos].salt_buf[3]; + s[4] = salt_bufs[salt_pos].salt_buf[4]; + s[5] = salt_bufs[salt_pos].salt_buf[5]; + s[6] = salt_bufs[salt_pos].salt_buf[6]; + s[7] = salt_bufs[salt_pos].salt_buf[7]; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + const u32 r_14 = (32 + salt_len) * 8; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * bin2asc table + */ + + __local u32 l_bin2asc[256]; + + const u32 lid4 = lid * 4; + + const u32 lid40 = lid4 + 0; + const u32 lid41 = lid4 + 1; + const u32 lid42 = lid4 + 2; + const u32 lid43 = lid4 + 3; + + const u32 v400 = (lid40 >> 0) & 15; + const u32 v401 = (lid40 >> 4) & 15; + const u32 v410 = (lid41 >> 0) & 15; + const u32 v411 = (lid41 >> 4) & 15; + const u32 v420 = (lid42 >> 0) & 15; + const u32 v421 = (lid42 >> 4) & 15; + const u32 v430 = (lid43 >> 0) & 15; + const u32 v431 = (lid43 >> 4) & 15; + + l_bin2asc[lid40] = ((v400 < 10) ? '0' + v400 : 'a' - 10 + v400) << 8 + | ((v401 < 10) ? '0' + v401 : 'a' - 10 + v401) << 0; + l_bin2asc[lid41] = ((v410 < 10) ? '0' + v410 : 'a' - 10 + v410) << 8 + | ((v411 < 10) ? '0' + v411 : 'a' - 10 + v411) << 0; + l_bin2asc[lid42] = ((v420 < 10) ? '0' + v420 : 'a' - 10 + v420) << 8 + | ((v421 < 10) ? '0' + v421 : 'a' - 10 + v421) << 0; + l_bin2asc[lid43] = ((v430 < 10) ? '0' + v430 : 'a' - 10 + v430) << 8 + | ((v431 < 10) ? '0' + v431 : 'a' - 10 + v431) << 0; + + barrier (CLK_LOCAL_MEM_FENCE); + + if (gid >= gid_max) return; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = combs_buf[il_pos].pw_len; + + const u32 pw_len = pw_l_len + pw_r_len; + + u32 wordr0[4]; + + wordr0[0] = combs_buf[il_pos].i[0]; + wordr0[1] = combs_buf[il_pos].i[1]; + wordr0[2] = combs_buf[il_pos].i[2]; + wordr0[3] = combs_buf[il_pos].i[3]; + + u32 wordr1[4]; + + wordr1[0] = combs_buf[il_pos].i[4]; + wordr1[1] = combs_buf[il_pos].i[5]; + wordr1[2] = combs_buf[il_pos].i[6]; + wordr1[3] = combs_buf[il_pos].i[7]; + + u32 wordr2[4]; + + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + + u32 wordr3[4]; + + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + u32x w0[4]; + + w0[0] = wordl0[0] | wordr0[0]; + w0[1] = wordl0[1] | wordr0[1]; + w0[2] = wordl0[2] | wordr0[2]; + w0[3] = wordl0[3] | wordr0[3]; + + u32x w1[4]; + + w1[0] = wordl1[0] | wordr1[0]; + w1[1] = wordl1[1] | wordr1[1]; + w1[2] = wordl1[2] | wordr1[2]; + w1[3] = wordl1[3] | wordr1[3]; + + u32x w2[4]; + + w2[0] = wordl2[0] | wordr2[0]; + w2[1] = wordl2[1] | wordr2[1]; + w2[2] = wordl2[2] | wordr2[2]; + w2[3] = wordl2[3] | wordr2[3]; + + u32x w3[4]; + + w3[0] = wordl3[0] | wordr3[0]; + w3[1] = wordl3[1] | wordr3[1]; + w3[2] = pw_len * 8; + w3[3] = 0; + + u32x a = MD5M_A; + u32x b = MD5M_B; + u32x c = MD5M_C; + u32x d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H , a, b, c, d, w1[1], MD5C20, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w2[0], MD5C21, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w2[3], MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w3[2], MD5C23, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w0[1], MD5C24, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w1[0], MD5C25, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w1[3], MD5C26, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w2[2], MD5C27, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w3[1], MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w0[0], MD5C29, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w0[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w1[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w2[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w3[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w3[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w0[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1[0], MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w2[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2[1], MD5C3f, MD5S33); + + a += MD5M_A; + b += MD5M_B; + c += MD5M_C; + d += MD5M_D; + + const u32x w0_t = uint_to_hex_lower8 ((a >> 0) & 255) << 0 + | uint_to_hex_lower8 ((a >> 8) & 255) << 16; + const u32x w1_t = uint_to_hex_lower8 ((a >> 16) & 255) << 0 + | uint_to_hex_lower8 ((a >> 24) & 255) << 16; + const u32x w2_t = uint_to_hex_lower8 ((b >> 0) & 255) << 0 + | uint_to_hex_lower8 ((b >> 8) & 255) << 16; + const u32x w3_t = uint_to_hex_lower8 ((b >> 16) & 255) << 0 + | uint_to_hex_lower8 ((b >> 24) & 255) << 16; + const u32x w4_t = uint_to_hex_lower8 ((c >> 0) & 255) << 0 + | uint_to_hex_lower8 ((c >> 8) & 255) << 16; + const u32x w5_t = uint_to_hex_lower8 ((c >> 16) & 255) << 0 + | uint_to_hex_lower8 ((c >> 24) & 255) << 16; + const u32x w6_t = uint_to_hex_lower8 ((d >> 0) & 255) << 0 + | uint_to_hex_lower8 ((d >> 8) & 255) << 16; + const u32x w7_t = uint_to_hex_lower8 ((d >> 16) & 255) << 0 + | uint_to_hex_lower8 ((d >> 24) & 255) << 16; + + const u32 w8_t = s[0]; + const u32 w9_t = s[1]; + const u32 wa_t = s[2]; + const u32 wb_t = s[3]; + const u32 wc_t = s[4]; + const u32 wd_t = s[5]; + const u32 we_t = s[6]; + const u32 wf_t = s[7]; + + a = MD5M_A; + b = MD5M_B; + c = MD5M_C; + d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t, MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t, MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t, MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t, MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w4_t, MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w5_t, MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w6_t, MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w7_t, MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w8_t, MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w9_t, MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, wa_t, MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, wb_t, MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, wc_t, MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, wd_t, MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, we_t, MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, wf_t, MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w1_t, MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w6_t, MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, wb_t, MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t, MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w5_t, MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, wa_t, MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, wf_t, MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w4_t, MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w9_t, MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, we_t, MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t, MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w8_t, MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, wd_t, MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t, MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w7_t, MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, wc_t, MD5C1f, MD5S13); + + MD5_STEP (MD5_H , a, b, c, d, w5_t, MD5C20, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w8_t, MD5C21, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, wb_t, MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, we_t, MD5C23, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w1_t, MD5C24, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w4_t, MD5C25, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w7_t, MD5C26, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, wa_t, MD5C27, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, wd_t, MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w0_t, MD5C29, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w3_t, MD5C2a, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w6_t, MD5C2b, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w9_t, MD5C2c, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, wc_t, MD5C2d, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, wf_t, MD5C2e, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w2_t, MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t, MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w7_t, MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, we_t, MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w5_t, MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, wc_t, MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t, MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, wa_t, MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t, MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w8_t, MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, wf_t, MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w6_t, MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, wd_t, MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w4_t, MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, wb_t, MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t, MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w9_t, MD5C3f, MD5S33); + + const u32x r_a = a + MD5M_A; + const u32x r_b = b + MD5M_B; + const u32x r_c = c + MD5M_C; + const u32x r_d = d + MD5M_D; + + a = r_a; + b = r_b; + c = r_c; + d = r_d; + + MD5_STEP0(MD5_Fo, a, b, c, d, MD5C00, MD5S00); + MD5_STEP0(MD5_Fo, d, a, b, c, MD5C01, MD5S01); + MD5_STEP0(MD5_Fo, c, d, a, b, MD5C02, MD5S02); + MD5_STEP0(MD5_Fo, b, c, d, a, MD5C03, MD5S03); + MD5_STEP0(MD5_Fo, a, b, c, d, MD5C04, MD5S00); + MD5_STEP0(MD5_Fo, d, a, b, c, MD5C05, MD5S01); + MD5_STEP0(MD5_Fo, c, d, a, b, MD5C06, MD5S02); + MD5_STEP0(MD5_Fo, b, c, d, a, MD5C07, MD5S03); + MD5_STEP0(MD5_Fo, a, b, c, d, MD5C08, MD5S00); + MD5_STEP0(MD5_Fo, d, a, b, c, MD5C09, MD5S01); + MD5_STEP0(MD5_Fo, c, d, a, b, MD5C0a, MD5S02); + MD5_STEP0(MD5_Fo, b, c, d, a, MD5C0b, MD5S03); + MD5_STEP0(MD5_Fo, a, b, c, d, MD5C0c, MD5S00); + MD5_STEP0(MD5_Fo, d, a, b, c, MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, r_14, MD5C0e, MD5S02); + MD5_STEP0(MD5_Fo, b, c, d, a, MD5C0f, MD5S03); + + MD5_STEP0(MD5_Go, a, b, c, d, MD5C10, MD5S10); + MD5_STEP0(MD5_Go, d, a, b, c, MD5C11, MD5S11); + MD5_STEP0(MD5_Go, c, d, a, b, MD5C12, MD5S12); + MD5_STEP0(MD5_Go, b, c, d, a, MD5C13, MD5S13); + MD5_STEP0(MD5_Go, a, b, c, d, MD5C14, MD5S10); + MD5_STEP0(MD5_Go, d, a, b, c, MD5C15, MD5S11); + MD5_STEP0(MD5_Go, c, d, a, b, MD5C16, MD5S12); + MD5_STEP0(MD5_Go, b, c, d, a, MD5C17, MD5S13); + MD5_STEP0(MD5_Go, a, b, c, d, MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, r_14, MD5C19, MD5S11); + MD5_STEP0(MD5_Go, c, d, a, b, MD5C1a, MD5S12); + MD5_STEP0(MD5_Go, b, c, d, a, MD5C1b, MD5S13); + MD5_STEP0(MD5_Go, a, b, c, d, MD5C1c, MD5S10); + MD5_STEP0(MD5_Go, d, a, b, c, MD5C1d, MD5S11); + MD5_STEP0(MD5_Go, c, d, a, b, MD5C1e, MD5S12); + MD5_STEP0(MD5_Go, b, c, d, a, MD5C1f, MD5S13); + + MD5_STEP0(MD5_H , a, b, c, d, MD5C20, MD5S20); + MD5_STEP0(MD5_H , d, a, b, c, MD5C21, MD5S21); + MD5_STEP0(MD5_H , c, d, a, b, MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, r_14, MD5C23, MD5S23); + MD5_STEP0(MD5_H , a, b, c, d, MD5C24, MD5S20); + MD5_STEP0(MD5_H , d, a, b, c, MD5C25, MD5S21); + MD5_STEP0(MD5_H , c, d, a, b, MD5C26, MD5S22); + MD5_STEP0(MD5_H , b, c, d, a, MD5C27, MD5S23); + MD5_STEP0(MD5_H , a, b, c, d, MD5C28, MD5S20); + MD5_STEP0(MD5_H , d, a, b, c, MD5C29, MD5S21); + MD5_STEP0(MD5_H , c, d, a, b, MD5C2a, MD5S22); + MD5_STEP0(MD5_H , b, c, d, a, MD5C2b, MD5S23); + MD5_STEP0(MD5_H , a, b, c, d, MD5C2c, MD5S20); + MD5_STEP0(MD5_H , d, a, b, c, MD5C2d, MD5S21); + MD5_STEP0(MD5_H , c, d, a, b, MD5C2e, MD5S22); + MD5_STEP0(MD5_H , b, c, d, a, MD5C2f, MD5S23); + + MD5_STEP0(MD5_I , a, b, c, d, MD5C30, MD5S30); + MD5_STEP0(MD5_I , d, a, b, c, MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, r_14, MD5C32, MD5S32); + MD5_STEP0(MD5_I , b, c, d, a, MD5C33, MD5S33); + MD5_STEP0(MD5_I , a, b, c, d, MD5C34, MD5S30); + MD5_STEP0(MD5_I , d, a, b, c, MD5C35, MD5S31); + MD5_STEP0(MD5_I , c, d, a, b, MD5C36, MD5S32); + MD5_STEP0(MD5_I , b, c, d, a, MD5C37, MD5S33); + MD5_STEP0(MD5_I , a, b, c, d, MD5C38, MD5S30); + MD5_STEP0(MD5_I , d, a, b, c, MD5C39, MD5S31); + MD5_STEP0(MD5_I , c, d, a, b, MD5C3a, MD5S32); + MD5_STEP0(MD5_I , b, c, d, a, MD5C3b, MD5S33); + MD5_STEP0(MD5_I , a, b, c, d, MD5C3c, MD5S30); + + if (allx ((a + r_a) != search[0])) continue; + + MD5_STEP0(MD5_I , d, a, b, c, MD5C3d, MD5S31); + MD5_STEP0(MD5_I , c, d, a, b, MD5C3e, MD5S32); + MD5_STEP0(MD5_I , b, c, d, a, MD5C3f, MD5S33); + + a += r_a; + b += r_b; + c += r_c; + d += r_d; + + const u32x r0 = a; + const u32x r1 = d; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_S + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m02710_s08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m02710_s16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/amd/m02710_a3.cl b/amd/m02710_a3.cl new file mode 100644 index 0000000000..1505030674 --- /dev/null +++ b/amd/m02710_a3.cl @@ -0,0 +1,1207 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _MD5_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW4 +#define VECT_SIZE4 +#endif + +#ifdef VLIW5 +#define VECT_SIZE4 +#endif + +#define DGST_R0 0 +#define DGST_R1 3 +#define DGST_R2 2 +#define DGST_R3 1 + +#include "include/kernel_functions.c" +#include "types_amd.c" +#include "common_amd.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +#ifdef VECT_SIZE1 +#define uint_to_hex_lower8(i) l_bin2asc[(i)] +#endif + +#ifdef VECT_SIZE2 +#define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1]) +#endif + +#ifdef VECT_SIZE4 +#define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3]) +#endif + +static void m02710m (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], const u32 pw_len, __global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, __local u32 l_bin2asc[256]) +{ + /** + * modifier + */ + + const u32 gid = get_global_id (0); + const u32 lid = get_local_id (0); + + /** + * salt + */ + + u32 s[8]; + + s[0] = salt_bufs[salt_pos].salt_buf[0]; + s[1] = salt_bufs[salt_pos].salt_buf[1]; + s[2] = salt_bufs[salt_pos].salt_buf[2]; + s[3] = salt_bufs[salt_pos].salt_buf[3]; + s[4] = salt_bufs[salt_pos].salt_buf[4]; + s[5] = salt_bufs[salt_pos].salt_buf[5]; + s[6] = salt_bufs[salt_pos].salt_buf[6]; + s[7] = salt_bufs[salt_pos].salt_buf[7]; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + const u32 r_14 = (32 + salt_len) * 8; + + /** + * loop + */ + + u32x w0l = w0[0]; + + for (u32 il_pos = 0; il_pos < bfs_cnt; il_pos++) + { + const u32 w0r = bfs_buf[il_pos].i; + + w0[0] = w0l | w0r; + + u32x a = MD5M_A; + u32x b = MD5M_B; + u32x c = MD5M_C; + u32x d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H , a, b, c, d, w1[1], MD5C20, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w2[0], MD5C21, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w2[3], MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w3[2], MD5C23, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w0[1], MD5C24, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w1[0], MD5C25, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w1[3], MD5C26, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w2[2], MD5C27, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w3[1], MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w0[0], MD5C29, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w0[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w1[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w2[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w3[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w3[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w0[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1[0], MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w2[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2[1], MD5C3f, MD5S33); + + a += MD5M_A; + b += MD5M_B; + c += MD5M_C; + d += MD5M_D; + + const u32x w0_t = uint_to_hex_lower8 ((a >> 0) & 255) << 0 + | uint_to_hex_lower8 ((a >> 8) & 255) << 16; + const u32x w1_t = uint_to_hex_lower8 ((a >> 16) & 255) << 0 + | uint_to_hex_lower8 ((a >> 24) & 255) << 16; + const u32x w2_t = uint_to_hex_lower8 ((b >> 0) & 255) << 0 + | uint_to_hex_lower8 ((b >> 8) & 255) << 16; + const u32x w3_t = uint_to_hex_lower8 ((b >> 16) & 255) << 0 + | uint_to_hex_lower8 ((b >> 24) & 255) << 16; + const u32x w4_t = uint_to_hex_lower8 ((c >> 0) & 255) << 0 + | uint_to_hex_lower8 ((c >> 8) & 255) << 16; + const u32x w5_t = uint_to_hex_lower8 ((c >> 16) & 255) << 0 + | uint_to_hex_lower8 ((c >> 24) & 255) << 16; + const u32x w6_t = uint_to_hex_lower8 ((d >> 0) & 255) << 0 + | uint_to_hex_lower8 ((d >> 8) & 255) << 16; + const u32x w7_t = uint_to_hex_lower8 ((d >> 16) & 255) << 0 + | uint_to_hex_lower8 ((d >> 24) & 255) << 16; + + const u32 w8_t = s[0]; + const u32 w9_t = s[1]; + const u32 wa_t = s[2]; + const u32 wb_t = s[3]; + const u32 wc_t = s[4]; + const u32 wd_t = s[5]; + const u32 we_t = s[6]; + const u32 wf_t = s[7]; + + a = MD5M_A; + b = MD5M_B; + c = MD5M_C; + d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t, MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t, MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t, MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t, MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w4_t, MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w5_t, MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w6_t, MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w7_t, MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w8_t, MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w9_t, MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, wa_t, MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, wb_t, MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, wc_t, MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, wd_t, MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, we_t, MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, wf_t, MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w1_t, MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w6_t, MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, wb_t, MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t, MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w5_t, MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, wa_t, MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, wf_t, MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w4_t, MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w9_t, MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, we_t, MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t, MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w8_t, MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, wd_t, MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t, MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w7_t, MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, wc_t, MD5C1f, MD5S13); + + MD5_STEP (MD5_H , a, b, c, d, w5_t, MD5C20, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w8_t, MD5C21, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, wb_t, MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, we_t, MD5C23, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w1_t, MD5C24, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w4_t, MD5C25, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w7_t, MD5C26, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, wa_t, MD5C27, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, wd_t, MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w0_t, MD5C29, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w3_t, MD5C2a, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w6_t, MD5C2b, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w9_t, MD5C2c, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, wc_t, MD5C2d, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, wf_t, MD5C2e, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w2_t, MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t, MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w7_t, MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, we_t, MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w5_t, MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, wc_t, MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t, MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, wa_t, MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t, MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w8_t, MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, wf_t, MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w6_t, MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, wd_t, MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w4_t, MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, wb_t, MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t, MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w9_t, MD5C3f, MD5S33); + + const u32x r_a = a + MD5M_A; + const u32x r_b = b + MD5M_B; + const u32x r_c = c + MD5M_C; + const u32x r_d = d + MD5M_D; + + a = r_a; + b = r_b; + c = r_c; + d = r_d; + + MD5_STEP0(MD5_Fo, a, b, c, d, MD5C00, MD5S00); + MD5_STEP0(MD5_Fo, d, a, b, c, MD5C01, MD5S01); + MD5_STEP0(MD5_Fo, c, d, a, b, MD5C02, MD5S02); + MD5_STEP0(MD5_Fo, b, c, d, a, MD5C03, MD5S03); + MD5_STEP0(MD5_Fo, a, b, c, d, MD5C04, MD5S00); + MD5_STEP0(MD5_Fo, d, a, b, c, MD5C05, MD5S01); + MD5_STEP0(MD5_Fo, c, d, a, b, MD5C06, MD5S02); + MD5_STEP0(MD5_Fo, b, c, d, a, MD5C07, MD5S03); + MD5_STEP0(MD5_Fo, a, b, c, d, MD5C08, MD5S00); + MD5_STEP0(MD5_Fo, d, a, b, c, MD5C09, MD5S01); + MD5_STEP0(MD5_Fo, c, d, a, b, MD5C0a, MD5S02); + MD5_STEP0(MD5_Fo, b, c, d, a, MD5C0b, MD5S03); + MD5_STEP0(MD5_Fo, a, b, c, d, MD5C0c, MD5S00); + MD5_STEP0(MD5_Fo, d, a, b, c, MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, r_14, MD5C0e, MD5S02); + MD5_STEP0(MD5_Fo, b, c, d, a, MD5C0f, MD5S03); + + MD5_STEP0(MD5_Go, a, b, c, d, MD5C10, MD5S10); + MD5_STEP0(MD5_Go, d, a, b, c, MD5C11, MD5S11); + MD5_STEP0(MD5_Go, c, d, a, b, MD5C12, MD5S12); + MD5_STEP0(MD5_Go, b, c, d, a, MD5C13, MD5S13); + MD5_STEP0(MD5_Go, a, b, c, d, MD5C14, MD5S10); + MD5_STEP0(MD5_Go, d, a, b, c, MD5C15, MD5S11); + MD5_STEP0(MD5_Go, c, d, a, b, MD5C16, MD5S12); + MD5_STEP0(MD5_Go, b, c, d, a, MD5C17, MD5S13); + MD5_STEP0(MD5_Go, a, b, c, d, MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, r_14, MD5C19, MD5S11); + MD5_STEP0(MD5_Go, c, d, a, b, MD5C1a, MD5S12); + MD5_STEP0(MD5_Go, b, c, d, a, MD5C1b, MD5S13); + MD5_STEP0(MD5_Go, a, b, c, d, MD5C1c, MD5S10); + MD5_STEP0(MD5_Go, d, a, b, c, MD5C1d, MD5S11); + MD5_STEP0(MD5_Go, c, d, a, b, MD5C1e, MD5S12); + MD5_STEP0(MD5_Go, b, c, d, a, MD5C1f, MD5S13); + + MD5_STEP0(MD5_H , a, b, c, d, MD5C20, MD5S20); + MD5_STEP0(MD5_H , d, a, b, c, MD5C21, MD5S21); + MD5_STEP0(MD5_H , c, d, a, b, MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, r_14, MD5C23, MD5S23); + MD5_STEP0(MD5_H , a, b, c, d, MD5C24, MD5S20); + MD5_STEP0(MD5_H , d, a, b, c, MD5C25, MD5S21); + MD5_STEP0(MD5_H , c, d, a, b, MD5C26, MD5S22); + MD5_STEP0(MD5_H , b, c, d, a, MD5C27, MD5S23); + MD5_STEP0(MD5_H , a, b, c, d, MD5C28, MD5S20); + MD5_STEP0(MD5_H , d, a, b, c, MD5C29, MD5S21); + MD5_STEP0(MD5_H , c, d, a, b, MD5C2a, MD5S22); + MD5_STEP0(MD5_H , b, c, d, a, MD5C2b, MD5S23); + MD5_STEP0(MD5_H , a, b, c, d, MD5C2c, MD5S20); + MD5_STEP0(MD5_H , d, a, b, c, MD5C2d, MD5S21); + MD5_STEP0(MD5_H , c, d, a, b, MD5C2e, MD5S22); + MD5_STEP0(MD5_H , b, c, d, a, MD5C2f, MD5S23); + + MD5_STEP0(MD5_I , a, b, c, d, MD5C30, MD5S30); + MD5_STEP0(MD5_I , d, a, b, c, MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, r_14, MD5C32, MD5S32); + MD5_STEP0(MD5_I , b, c, d, a, MD5C33, MD5S33); + MD5_STEP0(MD5_I , a, b, c, d, MD5C34, MD5S30); + MD5_STEP0(MD5_I , d, a, b, c, MD5C35, MD5S31); + MD5_STEP0(MD5_I , c, d, a, b, MD5C36, MD5S32); + MD5_STEP0(MD5_I , b, c, d, a, MD5C37, MD5S33); + MD5_STEP0(MD5_I , a, b, c, d, MD5C38, MD5S30); + MD5_STEP0(MD5_I , d, a, b, c, MD5C39, MD5S31); + MD5_STEP0(MD5_I , c, d, a, b, MD5C3a, MD5S32); + MD5_STEP0(MD5_I , b, c, d, a, MD5C3b, MD5S33); + MD5_STEP0(MD5_I , a, b, c, d, MD5C3c, MD5S30); + MD5_STEP0(MD5_I , d, a, b, c, MD5C3d, MD5S31); + MD5_STEP0(MD5_I , c, d, a, b, MD5C3e, MD5S32); + MD5_STEP0(MD5_I , b, c, d, a, MD5C3f, MD5S33); + + a += r_a; + b += r_b; + c += r_c; + d += r_d; + + const u32x r0 = a; + const u32x r1 = d; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_M + } +} + +static void m02710s (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], const u32 pw_len, __global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, __local u32 l_bin2asc[256]) +{ + /** + * modifier + */ + + const u32 gid = get_global_id (0); + const u32 lid = get_local_id (0); + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * salt + */ + + u32 s[8]; + + s[0] = salt_bufs[salt_pos].salt_buf[0]; + s[1] = salt_bufs[salt_pos].salt_buf[1]; + s[2] = salt_bufs[salt_pos].salt_buf[2]; + s[3] = salt_bufs[salt_pos].salt_buf[3]; + s[4] = salt_bufs[salt_pos].salt_buf[4]; + s[5] = salt_bufs[salt_pos].salt_buf[5]; + s[6] = salt_bufs[salt_pos].salt_buf[6]; + s[7] = salt_bufs[salt_pos].salt_buf[7]; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + const u32 r_14 = (32 + salt_len) * 8; + + /** + * loop + */ + + u32x w0l = w0[0]; + + for (u32 il_pos = 0; il_pos < bfs_cnt; il_pos++) + { + const u32 w0r = bfs_buf[il_pos].i; + + w0[0] = w0l | w0r; + + u32x a = MD5M_A; + u32x b = MD5M_B; + u32x c = MD5M_C; + u32x d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H , a, b, c, d, w1[1], MD5C20, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w2[0], MD5C21, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w2[3], MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w3[2], MD5C23, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w0[1], MD5C24, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w1[0], MD5C25, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w1[3], MD5C26, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w2[2], MD5C27, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w3[1], MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w0[0], MD5C29, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w0[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w1[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w2[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w3[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w3[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w0[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1[0], MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w2[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2[1], MD5C3f, MD5S33); + + a += MD5M_A; + b += MD5M_B; + c += MD5M_C; + d += MD5M_D; + + const u32x w0_t = uint_to_hex_lower8 ((a >> 0) & 255) << 0 + | uint_to_hex_lower8 ((a >> 8) & 255) << 16; + const u32x w1_t = uint_to_hex_lower8 ((a >> 16) & 255) << 0 + | uint_to_hex_lower8 ((a >> 24) & 255) << 16; + const u32x w2_t = uint_to_hex_lower8 ((b >> 0) & 255) << 0 + | uint_to_hex_lower8 ((b >> 8) & 255) << 16; + const u32x w3_t = uint_to_hex_lower8 ((b >> 16) & 255) << 0 + | uint_to_hex_lower8 ((b >> 24) & 255) << 16; + const u32x w4_t = uint_to_hex_lower8 ((c >> 0) & 255) << 0 + | uint_to_hex_lower8 ((c >> 8) & 255) << 16; + const u32x w5_t = uint_to_hex_lower8 ((c >> 16) & 255) << 0 + | uint_to_hex_lower8 ((c >> 24) & 255) << 16; + const u32x w6_t = uint_to_hex_lower8 ((d >> 0) & 255) << 0 + | uint_to_hex_lower8 ((d >> 8) & 255) << 16; + const u32x w7_t = uint_to_hex_lower8 ((d >> 16) & 255) << 0 + | uint_to_hex_lower8 ((d >> 24) & 255) << 16; + + const u32 w8_t = s[0]; + const u32 w9_t = s[1]; + const u32 wa_t = s[2]; + const u32 wb_t = s[3]; + const u32 wc_t = s[4]; + const u32 wd_t = s[5]; + const u32 we_t = s[6]; + const u32 wf_t = s[7]; + + a = MD5M_A; + b = MD5M_B; + c = MD5M_C; + d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t, MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t, MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t, MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t, MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w4_t, MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w5_t, MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w6_t, MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w7_t, MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w8_t, MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w9_t, MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, wa_t, MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, wb_t, MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, wc_t, MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, wd_t, MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, we_t, MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, wf_t, MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w1_t, MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w6_t, MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, wb_t, MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t, MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w5_t, MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, wa_t, MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, wf_t, MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w4_t, MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w9_t, MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, we_t, MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t, MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w8_t, MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, wd_t, MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t, MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w7_t, MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, wc_t, MD5C1f, MD5S13); + + MD5_STEP (MD5_H , a, b, c, d, w5_t, MD5C20, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w8_t, MD5C21, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, wb_t, MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, we_t, MD5C23, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w1_t, MD5C24, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w4_t, MD5C25, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w7_t, MD5C26, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, wa_t, MD5C27, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, wd_t, MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w0_t, MD5C29, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w3_t, MD5C2a, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w6_t, MD5C2b, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w9_t, MD5C2c, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, wc_t, MD5C2d, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, wf_t, MD5C2e, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w2_t, MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t, MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w7_t, MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, we_t, MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w5_t, MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, wc_t, MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t, MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, wa_t, MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t, MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w8_t, MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, wf_t, MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w6_t, MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, wd_t, MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w4_t, MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, wb_t, MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t, MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w9_t, MD5C3f, MD5S33); + + const u32x r_a = a + MD5M_A; + const u32x r_b = b + MD5M_B; + const u32x r_c = c + MD5M_C; + const u32x r_d = d + MD5M_D; + + a = r_a; + b = r_b; + c = r_c; + d = r_d; + + MD5_STEP0(MD5_Fo, a, b, c, d, MD5C00, MD5S00); + MD5_STEP0(MD5_Fo, d, a, b, c, MD5C01, MD5S01); + MD5_STEP0(MD5_Fo, c, d, a, b, MD5C02, MD5S02); + MD5_STEP0(MD5_Fo, b, c, d, a, MD5C03, MD5S03); + MD5_STEP0(MD5_Fo, a, b, c, d, MD5C04, MD5S00); + MD5_STEP0(MD5_Fo, d, a, b, c, MD5C05, MD5S01); + MD5_STEP0(MD5_Fo, c, d, a, b, MD5C06, MD5S02); + MD5_STEP0(MD5_Fo, b, c, d, a, MD5C07, MD5S03); + MD5_STEP0(MD5_Fo, a, b, c, d, MD5C08, MD5S00); + MD5_STEP0(MD5_Fo, d, a, b, c, MD5C09, MD5S01); + MD5_STEP0(MD5_Fo, c, d, a, b, MD5C0a, MD5S02); + MD5_STEP0(MD5_Fo, b, c, d, a, MD5C0b, MD5S03); + MD5_STEP0(MD5_Fo, a, b, c, d, MD5C0c, MD5S00); + MD5_STEP0(MD5_Fo, d, a, b, c, MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, r_14, MD5C0e, MD5S02); + MD5_STEP0(MD5_Fo, b, c, d, a, MD5C0f, MD5S03); + + MD5_STEP0(MD5_Go, a, b, c, d, MD5C10, MD5S10); + MD5_STEP0(MD5_Go, d, a, b, c, MD5C11, MD5S11); + MD5_STEP0(MD5_Go, c, d, a, b, MD5C12, MD5S12); + MD5_STEP0(MD5_Go, b, c, d, a, MD5C13, MD5S13); + MD5_STEP0(MD5_Go, a, b, c, d, MD5C14, MD5S10); + MD5_STEP0(MD5_Go, d, a, b, c, MD5C15, MD5S11); + MD5_STEP0(MD5_Go, c, d, a, b, MD5C16, MD5S12); + MD5_STEP0(MD5_Go, b, c, d, a, MD5C17, MD5S13); + MD5_STEP0(MD5_Go, a, b, c, d, MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, r_14, MD5C19, MD5S11); + MD5_STEP0(MD5_Go, c, d, a, b, MD5C1a, MD5S12); + MD5_STEP0(MD5_Go, b, c, d, a, MD5C1b, MD5S13); + MD5_STEP0(MD5_Go, a, b, c, d, MD5C1c, MD5S10); + MD5_STEP0(MD5_Go, d, a, b, c, MD5C1d, MD5S11); + MD5_STEP0(MD5_Go, c, d, a, b, MD5C1e, MD5S12); + MD5_STEP0(MD5_Go, b, c, d, a, MD5C1f, MD5S13); + + MD5_STEP0(MD5_H , a, b, c, d, MD5C20, MD5S20); + MD5_STEP0(MD5_H , d, a, b, c, MD5C21, MD5S21); + MD5_STEP0(MD5_H , c, d, a, b, MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, r_14, MD5C23, MD5S23); + MD5_STEP0(MD5_H , a, b, c, d, MD5C24, MD5S20); + MD5_STEP0(MD5_H , d, a, b, c, MD5C25, MD5S21); + MD5_STEP0(MD5_H , c, d, a, b, MD5C26, MD5S22); + MD5_STEP0(MD5_H , b, c, d, a, MD5C27, MD5S23); + MD5_STEP0(MD5_H , a, b, c, d, MD5C28, MD5S20); + MD5_STEP0(MD5_H , d, a, b, c, MD5C29, MD5S21); + MD5_STEP0(MD5_H , c, d, a, b, MD5C2a, MD5S22); + MD5_STEP0(MD5_H , b, c, d, a, MD5C2b, MD5S23); + MD5_STEP0(MD5_H , a, b, c, d, MD5C2c, MD5S20); + MD5_STEP0(MD5_H , d, a, b, c, MD5C2d, MD5S21); + MD5_STEP0(MD5_H , c, d, a, b, MD5C2e, MD5S22); + MD5_STEP0(MD5_H , b, c, d, a, MD5C2f, MD5S23); + + MD5_STEP0(MD5_I , a, b, c, d, MD5C30, MD5S30); + MD5_STEP0(MD5_I , d, a, b, c, MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, r_14, MD5C32, MD5S32); + MD5_STEP0(MD5_I , b, c, d, a, MD5C33, MD5S33); + MD5_STEP0(MD5_I , a, b, c, d, MD5C34, MD5S30); + MD5_STEP0(MD5_I , d, a, b, c, MD5C35, MD5S31); + MD5_STEP0(MD5_I , c, d, a, b, MD5C36, MD5S32); + MD5_STEP0(MD5_I , b, c, d, a, MD5C37, MD5S33); + MD5_STEP0(MD5_I , a, b, c, d, MD5C38, MD5S30); + MD5_STEP0(MD5_I , d, a, b, c, MD5C39, MD5S31); + MD5_STEP0(MD5_I , c, d, a, b, MD5C3a, MD5S32); + MD5_STEP0(MD5_I , b, c, d, a, MD5C3b, MD5S33); + MD5_STEP0(MD5_I , a, b, c, d, MD5C3c, MD5S30); + + if (allx ((a + r_a) != search[0])) continue; + + MD5_STEP0(MD5_I , d, a, b, c, MD5C3d, MD5S31); + MD5_STEP0(MD5_I , c, d, a, b, MD5C3e, MD5S32); + MD5_STEP0(MD5_I , b, c, d, a, MD5C3f, MD5S33); + + a += r_a; + b += r_b; + c += r_c; + d += r_d; + + const u32x r0 = a; + const u32x r1 = d; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_S + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m02710_m04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = pws[gid].i[14]; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * bin2asc table + */ + + __local u32 l_bin2asc[256]; + + const u32 lid4 = lid * 4; + + const u32 lid40 = lid4 + 0; + const u32 lid41 = lid4 + 1; + const u32 lid42 = lid4 + 2; + const u32 lid43 = lid4 + 3; + + const u32 v400 = (lid40 >> 0) & 15; + const u32 v401 = (lid40 >> 4) & 15; + const u32 v410 = (lid41 >> 0) & 15; + const u32 v411 = (lid41 >> 4) & 15; + const u32 v420 = (lid42 >> 0) & 15; + const u32 v421 = (lid42 >> 4) & 15; + const u32 v430 = (lid43 >> 0) & 15; + const u32 v431 = (lid43 >> 4) & 15; + + l_bin2asc[lid40] = ((v400 < 10) ? '0' + v400 : 'a' - 10 + v400) << 8 + | ((v401 < 10) ? '0' + v401 : 'a' - 10 + v401) << 0; + l_bin2asc[lid41] = ((v410 < 10) ? '0' + v410 : 'a' - 10 + v410) << 8 + | ((v411 < 10) ? '0' + v411 : 'a' - 10 + v411) << 0; + l_bin2asc[lid42] = ((v420 < 10) ? '0' + v420 : 'a' - 10 + v420) << 8 + | ((v421 < 10) ? '0' + v421 : 'a' - 10 + v421) << 0; + l_bin2asc[lid43] = ((v430 < 10) ? '0' + v430 : 'a' - 10 + v430) << 8 + | ((v431 < 10) ? '0' + v431 : 'a' - 10 + v431) << 0; + + barrier (CLK_LOCAL_MEM_FENCE); + + if (gid >= gid_max) return; + + /** + * main + */ + + m02710m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset, l_bin2asc); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m02710_m08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = pws[gid].i[14]; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * bin2asc table + */ + + __local u32 l_bin2asc[256]; + + const u32 lid4 = lid * 4; + + const u32 lid40 = lid4 + 0; + const u32 lid41 = lid4 + 1; + const u32 lid42 = lid4 + 2; + const u32 lid43 = lid4 + 3; + + const u32 v400 = (lid40 >> 0) & 15; + const u32 v401 = (lid40 >> 4) & 15; + const u32 v410 = (lid41 >> 0) & 15; + const u32 v411 = (lid41 >> 4) & 15; + const u32 v420 = (lid42 >> 0) & 15; + const u32 v421 = (lid42 >> 4) & 15; + const u32 v430 = (lid43 >> 0) & 15; + const u32 v431 = (lid43 >> 4) & 15; + + l_bin2asc[lid40] = ((v400 < 10) ? '0' + v400 : 'a' - 10 + v400) << 8 + | ((v401 < 10) ? '0' + v401 : 'a' - 10 + v401) << 0; + l_bin2asc[lid41] = ((v410 < 10) ? '0' + v410 : 'a' - 10 + v410) << 8 + | ((v411 < 10) ? '0' + v411 : 'a' - 10 + v411) << 0; + l_bin2asc[lid42] = ((v420 < 10) ? '0' + v420 : 'a' - 10 + v420) << 8 + | ((v421 < 10) ? '0' + v421 : 'a' - 10 + v421) << 0; + l_bin2asc[lid43] = ((v430 < 10) ? '0' + v430 : 'a' - 10 + v430) << 8 + | ((v431 < 10) ? '0' + v431 : 'a' - 10 + v431) << 0; + + barrier (CLK_LOCAL_MEM_FENCE); + + if (gid >= gid_max) return; + + /** + * main + */ + + m02710m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset, l_bin2asc); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m02710_m16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = pws[gid].i[ 8]; + w2[1] = pws[gid].i[ 9]; + w2[2] = pws[gid].i[10]; + w2[3] = pws[gid].i[11]; + + u32x w3[4]; + + w3[0] = pws[gid].i[12]; + w3[1] = pws[gid].i[13]; + w3[2] = pws[gid].i[14]; + w3[3] = pws[gid].i[15]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * bin2asc table + */ + + __local u32 l_bin2asc[256]; + + const u32 lid4 = lid * 4; + + const u32 lid40 = lid4 + 0; + const u32 lid41 = lid4 + 1; + const u32 lid42 = lid4 + 2; + const u32 lid43 = lid4 + 3; + + const u32 v400 = (lid40 >> 0) & 15; + const u32 v401 = (lid40 >> 4) & 15; + const u32 v410 = (lid41 >> 0) & 15; + const u32 v411 = (lid41 >> 4) & 15; + const u32 v420 = (lid42 >> 0) & 15; + const u32 v421 = (lid42 >> 4) & 15; + const u32 v430 = (lid43 >> 0) & 15; + const u32 v431 = (lid43 >> 4) & 15; + + l_bin2asc[lid40] = ((v400 < 10) ? '0' + v400 : 'a' - 10 + v400) << 8 + | ((v401 < 10) ? '0' + v401 : 'a' - 10 + v401) << 0; + l_bin2asc[lid41] = ((v410 < 10) ? '0' + v410 : 'a' - 10 + v410) << 8 + | ((v411 < 10) ? '0' + v411 : 'a' - 10 + v411) << 0; + l_bin2asc[lid42] = ((v420 < 10) ? '0' + v420 : 'a' - 10 + v420) << 8 + | ((v421 < 10) ? '0' + v421 : 'a' - 10 + v421) << 0; + l_bin2asc[lid43] = ((v430 < 10) ? '0' + v430 : 'a' - 10 + v430) << 8 + | ((v431 < 10) ? '0' + v431 : 'a' - 10 + v431) << 0; + + barrier (CLK_LOCAL_MEM_FENCE); + + if (gid >= gid_max) return; + + /** + * main + */ + + m02710m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset, l_bin2asc); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m02710_s04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = pws[gid].i[14]; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * bin2asc table + */ + + __local u32 l_bin2asc[256]; + + const u32 lid4 = lid * 4; + + const u32 lid40 = lid4 + 0; + const u32 lid41 = lid4 + 1; + const u32 lid42 = lid4 + 2; + const u32 lid43 = lid4 + 3; + + const u32 v400 = (lid40 >> 0) & 15; + const u32 v401 = (lid40 >> 4) & 15; + const u32 v410 = (lid41 >> 0) & 15; + const u32 v411 = (lid41 >> 4) & 15; + const u32 v420 = (lid42 >> 0) & 15; + const u32 v421 = (lid42 >> 4) & 15; + const u32 v430 = (lid43 >> 0) & 15; + const u32 v431 = (lid43 >> 4) & 15; + + l_bin2asc[lid40] = ((v400 < 10) ? '0' + v400 : 'a' - 10 + v400) << 8 + | ((v401 < 10) ? '0' + v401 : 'a' - 10 + v401) << 0; + l_bin2asc[lid41] = ((v410 < 10) ? '0' + v410 : 'a' - 10 + v410) << 8 + | ((v411 < 10) ? '0' + v411 : 'a' - 10 + v411) << 0; + l_bin2asc[lid42] = ((v420 < 10) ? '0' + v420 : 'a' - 10 + v420) << 8 + | ((v421 < 10) ? '0' + v421 : 'a' - 10 + v421) << 0; + l_bin2asc[lid43] = ((v430 < 10) ? '0' + v430 : 'a' - 10 + v430) << 8 + | ((v431 < 10) ? '0' + v431 : 'a' - 10 + v431) << 0; + + barrier (CLK_LOCAL_MEM_FENCE); + + if (gid >= gid_max) return; + + /** + * main + */ + + m02710s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset, l_bin2asc); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m02710_s08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = pws[gid].i[14]; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * bin2asc table + */ + + __local u32 l_bin2asc[256]; + + const u32 lid4 = lid * 4; + + const u32 lid40 = lid4 + 0; + const u32 lid41 = lid4 + 1; + const u32 lid42 = lid4 + 2; + const u32 lid43 = lid4 + 3; + + const u32 v400 = (lid40 >> 0) & 15; + const u32 v401 = (lid40 >> 4) & 15; + const u32 v410 = (lid41 >> 0) & 15; + const u32 v411 = (lid41 >> 4) & 15; + const u32 v420 = (lid42 >> 0) & 15; + const u32 v421 = (lid42 >> 4) & 15; + const u32 v430 = (lid43 >> 0) & 15; + const u32 v431 = (lid43 >> 4) & 15; + + l_bin2asc[lid40] = ((v400 < 10) ? '0' + v400 : 'a' - 10 + v400) << 8 + | ((v401 < 10) ? '0' + v401 : 'a' - 10 + v401) << 0; + l_bin2asc[lid41] = ((v410 < 10) ? '0' + v410 : 'a' - 10 + v410) << 8 + | ((v411 < 10) ? '0' + v411 : 'a' - 10 + v411) << 0; + l_bin2asc[lid42] = ((v420 < 10) ? '0' + v420 : 'a' - 10 + v420) << 8 + | ((v421 < 10) ? '0' + v421 : 'a' - 10 + v421) << 0; + l_bin2asc[lid43] = ((v430 < 10) ? '0' + v430 : 'a' - 10 + v430) << 8 + | ((v431 < 10) ? '0' + v431 : 'a' - 10 + v431) << 0; + + barrier (CLK_LOCAL_MEM_FENCE); + + if (gid >= gid_max) return; + + /** + * main + */ + + m02710s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset, l_bin2asc); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m02710_s16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = pws[gid].i[ 8]; + w2[1] = pws[gid].i[ 9]; + w2[2] = pws[gid].i[10]; + w2[3] = pws[gid].i[11]; + + u32x w3[4]; + + w3[0] = pws[gid].i[12]; + w3[1] = pws[gid].i[13]; + w3[2] = pws[gid].i[14]; + w3[3] = pws[gid].i[15]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * bin2asc table + */ + + __local u32 l_bin2asc[256]; + + const u32 lid4 = lid * 4; + + const u32 lid40 = lid4 + 0; + const u32 lid41 = lid4 + 1; + const u32 lid42 = lid4 + 2; + const u32 lid43 = lid4 + 3; + + const u32 v400 = (lid40 >> 0) & 15; + const u32 v401 = (lid40 >> 4) & 15; + const u32 v410 = (lid41 >> 0) & 15; + const u32 v411 = (lid41 >> 4) & 15; + const u32 v420 = (lid42 >> 0) & 15; + const u32 v421 = (lid42 >> 4) & 15; + const u32 v430 = (lid43 >> 0) & 15; + const u32 v431 = (lid43 >> 4) & 15; + + l_bin2asc[lid40] = ((v400 < 10) ? '0' + v400 : 'a' - 10 + v400) << 8 + | ((v401 < 10) ? '0' + v401 : 'a' - 10 + v401) << 0; + l_bin2asc[lid41] = ((v410 < 10) ? '0' + v410 : 'a' - 10 + v410) << 8 + | ((v411 < 10) ? '0' + v411 : 'a' - 10 + v411) << 0; + l_bin2asc[lid42] = ((v420 < 10) ? '0' + v420 : 'a' - 10 + v420) << 8 + | ((v421 < 10) ? '0' + v421 : 'a' - 10 + v421) << 0; + l_bin2asc[lid43] = ((v430 < 10) ? '0' + v430 : 'a' - 10 + v430) << 8 + | ((v431 < 10) ? '0' + v431 : 'a' - 10 + v431) << 0; + + barrier (CLK_LOCAL_MEM_FENCE); + + if (gid >= gid_max) return; + + /** + * main + */ + + m02710s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset, l_bin2asc); +} diff --git a/amd/m02810_a0.cl b/amd/m02810_a0.cl new file mode 100644 index 0000000000..db09766f5c --- /dev/null +++ b/amd/m02810_a0.cl @@ -0,0 +1,878 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _MD5_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW4 +#define VECT_SIZE4 +#endif + +#ifdef VLIW5 +#define VECT_SIZE4 +#endif + +#define DGST_R0 0 +#define DGST_R1 3 +#define DGST_R2 2 +#define DGST_R3 1 + +#include "include/kernel_functions.c" +#include "types_amd.c" +#include "common_amd.c" +#include "include/rp_gpu.h" +#include "rp_amd.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +#ifdef VECT_SIZE1 +#define uint_to_hex_lower8(i) l_bin2asc[(i)] +#endif + +#ifdef VECT_SIZE2 +#define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1]) +#endif + +#ifdef VECT_SIZE4 +#define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3]) +#endif + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m02810_m04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + u32x pw_buf1[4]; + + pw_buf1[0] = pws[gid].i[ 4]; + pw_buf1[1] = pws[gid].i[ 5]; + pw_buf1[2] = pws[gid].i[ 6]; + pw_buf1[3] = pws[gid].i[ 7]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * salt + */ + + u32 s[8]; + + s[0] = salt_bufs[salt_pos].salt_buf_pc[0]; + s[1] = salt_bufs[salt_pos].salt_buf_pc[1]; + s[2] = salt_bufs[salt_pos].salt_buf_pc[2]; + s[3] = salt_bufs[salt_pos].salt_buf_pc[3]; + s[4] = salt_bufs[salt_pos].salt_buf_pc[4]; + s[5] = salt_bufs[salt_pos].salt_buf_pc[5]; + s[6] = salt_bufs[salt_pos].salt_buf_pc[6]; + s[7] = salt_bufs[salt_pos].salt_buf_pc[7]; + + const u32 r_00 = 0x80; + const u32 r_14 = 64 * 8; + + /** + * bin2asc table + */ + + __local u32 l_bin2asc[256]; + + const u32 lid4 = lid * 4; + + const u32 lid40 = lid4 + 0; + const u32 lid41 = lid4 + 1; + const u32 lid42 = lid4 + 2; + const u32 lid43 = lid4 + 3; + + const u32 v400 = (lid40 >> 0) & 15; + const u32 v401 = (lid40 >> 4) & 15; + const u32 v410 = (lid41 >> 0) & 15; + const u32 v411 = (lid41 >> 4) & 15; + const u32 v420 = (lid42 >> 0) & 15; + const u32 v421 = (lid42 >> 4) & 15; + const u32 v430 = (lid43 >> 0) & 15; + const u32 v431 = (lid43 >> 4) & 15; + + l_bin2asc[lid40] = ((v400 < 10) ? '0' + v400 : 'a' - 10 + v400) << 8 + | ((v401 < 10) ? '0' + v401 : 'a' - 10 + v401) << 0; + l_bin2asc[lid41] = ((v410 < 10) ? '0' + v410 : 'a' - 10 + v410) << 8 + | ((v411 < 10) ? '0' + v411 : 'a' - 10 + v411) << 0; + l_bin2asc[lid42] = ((v420 < 10) ? '0' + v420 : 'a' - 10 + v420) << 8 + | ((v421 < 10) ? '0' + v421 : 'a' - 10 + v421) << 0; + l_bin2asc[lid43] = ((v430 < 10) ? '0' + v430 : 'a' - 10 + v430) << 8 + | ((v431 < 10) ? '0' + v431 : 'a' - 10 + v431) << 0; + + barrier (CLK_LOCAL_MEM_FENCE); + + if (gid >= gid_max) return; + + /** + * loop + */ + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + + w0[0] = pw_buf0[0]; + w0[1] = pw_buf0[1]; + w0[2] = pw_buf0[2]; + w0[3] = pw_buf0[3]; + + u32x w1[4]; + + w1[0] = pw_buf1[0]; + w1[1] = pw_buf1[1]; + w1[2] = pw_buf1[2]; + w1[3] = pw_buf1[3]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 out_len = apply_rules (rules_buf[il_pos].cmds, w0, w1, pw_len); + + append_0x80_2 (w0, w1, out_len); + + w3[2] = out_len * 8; + + u32x a = MD5M_A; + u32x b = MD5M_B; + u32x c = MD5M_C; + u32x d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H , a, b, c, d, w1[1], MD5C20, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w2[0], MD5C21, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w2[3], MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w3[2], MD5C23, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w0[1], MD5C24, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w1[0], MD5C25, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w1[3], MD5C26, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w2[2], MD5C27, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w3[1], MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w0[0], MD5C29, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w0[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w1[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w2[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w3[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w3[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w0[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1[0], MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w2[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2[1], MD5C3f, MD5S33); + + a += MD5M_A; + b += MD5M_B; + c += MD5M_C; + d += MD5M_D; + + const u32 w0_t = s[0]; + const u32 w1_t = s[1]; + const u32 w2_t = s[2]; + const u32 w3_t = s[3]; + const u32 w4_t = s[4]; + const u32 w5_t = s[5]; + const u32 w6_t = s[6]; + const u32 w7_t = s[7]; + + const u32x w8_t = uint_to_hex_lower8 ((a >> 0) & 255) << 0 + | uint_to_hex_lower8 ((a >> 8) & 255) << 16; + const u32x w9_t = uint_to_hex_lower8 ((a >> 16) & 255) << 0 + | uint_to_hex_lower8 ((a >> 24) & 255) << 16; + const u32x wa_t = uint_to_hex_lower8 ((b >> 0) & 255) << 0 + | uint_to_hex_lower8 ((b >> 8) & 255) << 16; + const u32x wb_t = uint_to_hex_lower8 ((b >> 16) & 255) << 0 + | uint_to_hex_lower8 ((b >> 24) & 255) << 16; + const u32x wc_t = uint_to_hex_lower8 ((c >> 0) & 255) << 0 + | uint_to_hex_lower8 ((c >> 8) & 255) << 16; + const u32x wd_t = uint_to_hex_lower8 ((c >> 16) & 255) << 0 + | uint_to_hex_lower8 ((c >> 24) & 255) << 16; + const u32x we_t = uint_to_hex_lower8 ((d >> 0) & 255) << 0 + | uint_to_hex_lower8 ((d >> 8) & 255) << 16; + const u32x wf_t = uint_to_hex_lower8 ((d >> 16) & 255) << 0 + | uint_to_hex_lower8 ((d >> 24) & 255) << 16; + + a = MD5M_A; + b = MD5M_B; + c = MD5M_C; + d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t, MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t, MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t, MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t, MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w4_t, MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w5_t, MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w6_t, MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w7_t, MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w8_t, MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w9_t, MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, wa_t, MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, wb_t, MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, wc_t, MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, wd_t, MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, we_t, MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, wf_t, MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w1_t, MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w6_t, MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, wb_t, MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t, MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w5_t, MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, wa_t, MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, wf_t, MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w4_t, MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w9_t, MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, we_t, MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t, MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w8_t, MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, wd_t, MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t, MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w7_t, MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, wc_t, MD5C1f, MD5S13); + + MD5_STEP (MD5_H , a, b, c, d, w5_t, MD5C20, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w8_t, MD5C21, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, wb_t, MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, we_t, MD5C23, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w1_t, MD5C24, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w4_t, MD5C25, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w7_t, MD5C26, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, wa_t, MD5C27, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, wd_t, MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w0_t, MD5C29, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w3_t, MD5C2a, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w6_t, MD5C2b, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w9_t, MD5C2c, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, wc_t, MD5C2d, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, wf_t, MD5C2e, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w2_t, MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t, MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w7_t, MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, we_t, MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w5_t, MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, wc_t, MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t, MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, wa_t, MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t, MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w8_t, MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, wf_t, MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w6_t, MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, wd_t, MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w4_t, MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, wb_t, MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t, MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w9_t, MD5C3f, MD5S33); + + const u32x r_a = a + MD5M_A; + const u32x r_b = b + MD5M_B; + const u32x r_c = c + MD5M_C; + const u32x r_d = d + MD5M_D; + + a = r_a; + b = r_b; + c = r_c; + d = r_d; + + MD5_STEP (MD5_Fo, a, b, c, d, r_00, MD5C00, MD5S00); + MD5_STEP0(MD5_Fo, d, a, b, c, MD5C01, MD5S01); + MD5_STEP0(MD5_Fo, c, d, a, b, MD5C02, MD5S02); + MD5_STEP0(MD5_Fo, b, c, d, a, MD5C03, MD5S03); + MD5_STEP0(MD5_Fo, a, b, c, d, MD5C04, MD5S00); + MD5_STEP0(MD5_Fo, d, a, b, c, MD5C05, MD5S01); + MD5_STEP0(MD5_Fo, c, d, a, b, MD5C06, MD5S02); + MD5_STEP0(MD5_Fo, b, c, d, a, MD5C07, MD5S03); + MD5_STEP0(MD5_Fo, a, b, c, d, MD5C08, MD5S00); + MD5_STEP0(MD5_Fo, d, a, b, c, MD5C09, MD5S01); + MD5_STEP0(MD5_Fo, c, d, a, b, MD5C0a, MD5S02); + MD5_STEP0(MD5_Fo, b, c, d, a, MD5C0b, MD5S03); + MD5_STEP0(MD5_Fo, a, b, c, d, MD5C0c, MD5S00); + MD5_STEP0(MD5_Fo, d, a, b, c, MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, r_14, MD5C0e, MD5S02); + MD5_STEP0(MD5_Fo, b, c, d, a, MD5C0f, MD5S03); + + MD5_STEP0(MD5_Go, a, b, c, d, MD5C10, MD5S10); + MD5_STEP0(MD5_Go, d, a, b, c, MD5C11, MD5S11); + MD5_STEP0(MD5_Go, c, d, a, b, MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, r_00, MD5C13, MD5S13); + MD5_STEP0(MD5_Go, a, b, c, d, MD5C14, MD5S10); + MD5_STEP0(MD5_Go, d, a, b, c, MD5C15, MD5S11); + MD5_STEP0(MD5_Go, c, d, a, b, MD5C16, MD5S12); + MD5_STEP0(MD5_Go, b, c, d, a, MD5C17, MD5S13); + MD5_STEP0(MD5_Go, a, b, c, d, MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, r_14, MD5C19, MD5S11); + MD5_STEP0(MD5_Go, c, d, a, b, MD5C1a, MD5S12); + MD5_STEP0(MD5_Go, b, c, d, a, MD5C1b, MD5S13); + MD5_STEP0(MD5_Go, a, b, c, d, MD5C1c, MD5S10); + MD5_STEP0(MD5_Go, d, a, b, c, MD5C1d, MD5S11); + MD5_STEP0(MD5_Go, c, d, a, b, MD5C1e, MD5S12); + MD5_STEP0(MD5_Go, b, c, d, a, MD5C1f, MD5S13); + + MD5_STEP0(MD5_H , a, b, c, d, MD5C20, MD5S20); + MD5_STEP0(MD5_H , d, a, b, c, MD5C21, MD5S21); + MD5_STEP0(MD5_H , c, d, a, b, MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, r_14, MD5C23, MD5S23); + MD5_STEP0(MD5_H , a, b, c, d, MD5C24, MD5S20); + MD5_STEP0(MD5_H , d, a, b, c, MD5C25, MD5S21); + MD5_STEP0(MD5_H , c, d, a, b, MD5C26, MD5S22); + MD5_STEP0(MD5_H , b, c, d, a, MD5C27, MD5S23); + MD5_STEP0(MD5_H , a, b, c, d, MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, r_00, MD5C29, MD5S21); + MD5_STEP0(MD5_H , c, d, a, b, MD5C2a, MD5S22); + MD5_STEP0(MD5_H , b, c, d, a, MD5C2b, MD5S23); + MD5_STEP0(MD5_H , a, b, c, d, MD5C2c, MD5S20); + MD5_STEP0(MD5_H , d, a, b, c, MD5C2d, MD5S21); + MD5_STEP0(MD5_H , c, d, a, b, MD5C2e, MD5S22); + MD5_STEP0(MD5_H , b, c, d, a, MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, r_00, MD5C30, MD5S30); + MD5_STEP0(MD5_I , d, a, b, c, MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, r_14, MD5C32, MD5S32); + MD5_STEP0(MD5_I , b, c, d, a, MD5C33, MD5S33); + MD5_STEP0(MD5_I , a, b, c, d, MD5C34, MD5S30); + MD5_STEP0(MD5_I , d, a, b, c, MD5C35, MD5S31); + MD5_STEP0(MD5_I , c, d, a, b, MD5C36, MD5S32); + MD5_STEP0(MD5_I , b, c, d, a, MD5C37, MD5S33); + MD5_STEP0(MD5_I , a, b, c, d, MD5C38, MD5S30); + MD5_STEP0(MD5_I , d, a, b, c, MD5C39, MD5S31); + MD5_STEP0(MD5_I , c, d, a, b, MD5C3a, MD5S32); + MD5_STEP0(MD5_I , b, c, d, a, MD5C3b, MD5S33); + MD5_STEP0(MD5_I , a, b, c, d, MD5C3c, MD5S30); + MD5_STEP0(MD5_I , d, a, b, c, MD5C3d, MD5S31); + MD5_STEP0(MD5_I , c, d, a, b, MD5C3e, MD5S32); + MD5_STEP0(MD5_I , b, c, d, a, MD5C3f, MD5S33); + + a += r_a; + b += r_b; + c += r_c; + d += r_d; + + const u32x r0 = a; + const u32x r1 = d; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_M + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m02810_m08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m02810_m16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m02810_s04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + u32x pw_buf1[4]; + + pw_buf1[0] = pws[gid].i[ 4]; + pw_buf1[1] = pws[gid].i[ 5]; + pw_buf1[2] = pws[gid].i[ 6]; + pw_buf1[3] = pws[gid].i[ 7]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * salt + */ + + u32 s[8]; + + s[0] = salt_bufs[salt_pos].salt_buf_pc[0]; + s[1] = salt_bufs[salt_pos].salt_buf_pc[1]; + s[2] = salt_bufs[salt_pos].salt_buf_pc[2]; + s[3] = salt_bufs[salt_pos].salt_buf_pc[3]; + s[4] = salt_bufs[salt_pos].salt_buf_pc[4]; + s[5] = salt_bufs[salt_pos].salt_buf_pc[5]; + s[6] = salt_bufs[salt_pos].salt_buf_pc[6]; + s[7] = salt_bufs[salt_pos].salt_buf_pc[7]; + + const u32 r_00 = 0x80; + const u32 r_14 = 64 * 8; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * bin2asc table + */ + + __local u32 l_bin2asc[256]; + + const u32 lid4 = lid * 4; + + const u32 lid40 = lid4 + 0; + const u32 lid41 = lid4 + 1; + const u32 lid42 = lid4 + 2; + const u32 lid43 = lid4 + 3; + + const u32 v400 = (lid40 >> 0) & 15; + const u32 v401 = (lid40 >> 4) & 15; + const u32 v410 = (lid41 >> 0) & 15; + const u32 v411 = (lid41 >> 4) & 15; + const u32 v420 = (lid42 >> 0) & 15; + const u32 v421 = (lid42 >> 4) & 15; + const u32 v430 = (lid43 >> 0) & 15; + const u32 v431 = (lid43 >> 4) & 15; + + l_bin2asc[lid40] = ((v400 < 10) ? '0' + v400 : 'a' - 10 + v400) << 8 + | ((v401 < 10) ? '0' + v401 : 'a' - 10 + v401) << 0; + l_bin2asc[lid41] = ((v410 < 10) ? '0' + v410 : 'a' - 10 + v410) << 8 + | ((v411 < 10) ? '0' + v411 : 'a' - 10 + v411) << 0; + l_bin2asc[lid42] = ((v420 < 10) ? '0' + v420 : 'a' - 10 + v420) << 8 + | ((v421 < 10) ? '0' + v421 : 'a' - 10 + v421) << 0; + l_bin2asc[lid43] = ((v430 < 10) ? '0' + v430 : 'a' - 10 + v430) << 8 + | ((v431 < 10) ? '0' + v431 : 'a' - 10 + v431) << 0; + + barrier (CLK_LOCAL_MEM_FENCE); + + if (gid >= gid_max) return; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + + w0[0] = pw_buf0[0]; + w0[1] = pw_buf0[1]; + w0[2] = pw_buf0[2]; + w0[3] = pw_buf0[3]; + + u32x w1[4]; + + w1[0] = pw_buf1[0]; + w1[1] = pw_buf1[1]; + w1[2] = pw_buf1[2]; + w1[3] = pw_buf1[3]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 out_len = apply_rules (rules_buf[il_pos].cmds, w0, w1, pw_len); + + append_0x80_2 (w0, w1, out_len); + + w3[2] = out_len * 8; + + u32x a = MD5M_A; + u32x b = MD5M_B; + u32x c = MD5M_C; + u32x d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H , a, b, c, d, w1[1], MD5C20, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w2[0], MD5C21, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w2[3], MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w3[2], MD5C23, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w0[1], MD5C24, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w1[0], MD5C25, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w1[3], MD5C26, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w2[2], MD5C27, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w3[1], MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w0[0], MD5C29, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w0[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w1[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w2[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w3[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w3[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w0[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1[0], MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w2[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2[1], MD5C3f, MD5S33); + + a += MD5M_A; + b += MD5M_B; + c += MD5M_C; + d += MD5M_D; + + const u32 w0_t = s[0]; + const u32 w1_t = s[1]; + const u32 w2_t = s[2]; + const u32 w3_t = s[3]; + const u32 w4_t = s[4]; + const u32 w5_t = s[5]; + const u32 w6_t = s[6]; + const u32 w7_t = s[7]; + + const u32x w8_t = uint_to_hex_lower8 ((a >> 0) & 255) << 0 + | uint_to_hex_lower8 ((a >> 8) & 255) << 16; + const u32x w9_t = uint_to_hex_lower8 ((a >> 16) & 255) << 0 + | uint_to_hex_lower8 ((a >> 24) & 255) << 16; + const u32x wa_t = uint_to_hex_lower8 ((b >> 0) & 255) << 0 + | uint_to_hex_lower8 ((b >> 8) & 255) << 16; + const u32x wb_t = uint_to_hex_lower8 ((b >> 16) & 255) << 0 + | uint_to_hex_lower8 ((b >> 24) & 255) << 16; + const u32x wc_t = uint_to_hex_lower8 ((c >> 0) & 255) << 0 + | uint_to_hex_lower8 ((c >> 8) & 255) << 16; + const u32x wd_t = uint_to_hex_lower8 ((c >> 16) & 255) << 0 + | uint_to_hex_lower8 ((c >> 24) & 255) << 16; + const u32x we_t = uint_to_hex_lower8 ((d >> 0) & 255) << 0 + | uint_to_hex_lower8 ((d >> 8) & 255) << 16; + const u32x wf_t = uint_to_hex_lower8 ((d >> 16) & 255) << 0 + | uint_to_hex_lower8 ((d >> 24) & 255) << 16; + + a = MD5M_A; + b = MD5M_B; + c = MD5M_C; + d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t, MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t, MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t, MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t, MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w4_t, MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w5_t, MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w6_t, MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w7_t, MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w8_t, MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w9_t, MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, wa_t, MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, wb_t, MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, wc_t, MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, wd_t, MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, we_t, MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, wf_t, MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w1_t, MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w6_t, MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, wb_t, MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t, MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w5_t, MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, wa_t, MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, wf_t, MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w4_t, MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w9_t, MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, we_t, MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t, MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w8_t, MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, wd_t, MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t, MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w7_t, MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, wc_t, MD5C1f, MD5S13); + + MD5_STEP (MD5_H , a, b, c, d, w5_t, MD5C20, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w8_t, MD5C21, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, wb_t, MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, we_t, MD5C23, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w1_t, MD5C24, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w4_t, MD5C25, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w7_t, MD5C26, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, wa_t, MD5C27, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, wd_t, MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w0_t, MD5C29, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w3_t, MD5C2a, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w6_t, MD5C2b, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w9_t, MD5C2c, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, wc_t, MD5C2d, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, wf_t, MD5C2e, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w2_t, MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t, MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w7_t, MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, we_t, MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w5_t, MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, wc_t, MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t, MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, wa_t, MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t, MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w8_t, MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, wf_t, MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w6_t, MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, wd_t, MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w4_t, MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, wb_t, MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t, MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w9_t, MD5C3f, MD5S33); + + const u32x r_a = a + MD5M_A; + const u32x r_b = b + MD5M_B; + const u32x r_c = c + MD5M_C; + const u32x r_d = d + MD5M_D; + + a = r_a; + b = r_b; + c = r_c; + d = r_d; + + MD5_STEP (MD5_Fo, a, b, c, d, r_00, MD5C00, MD5S00); + MD5_STEP0(MD5_Fo, d, a, b, c, MD5C01, MD5S01); + MD5_STEP0(MD5_Fo, c, d, a, b, MD5C02, MD5S02); + MD5_STEP0(MD5_Fo, b, c, d, a, MD5C03, MD5S03); + MD5_STEP0(MD5_Fo, a, b, c, d, MD5C04, MD5S00); + MD5_STEP0(MD5_Fo, d, a, b, c, MD5C05, MD5S01); + MD5_STEP0(MD5_Fo, c, d, a, b, MD5C06, MD5S02); + MD5_STEP0(MD5_Fo, b, c, d, a, MD5C07, MD5S03); + MD5_STEP0(MD5_Fo, a, b, c, d, MD5C08, MD5S00); + MD5_STEP0(MD5_Fo, d, a, b, c, MD5C09, MD5S01); + MD5_STEP0(MD5_Fo, c, d, a, b, MD5C0a, MD5S02); + MD5_STEP0(MD5_Fo, b, c, d, a, MD5C0b, MD5S03); + MD5_STEP0(MD5_Fo, a, b, c, d, MD5C0c, MD5S00); + MD5_STEP0(MD5_Fo, d, a, b, c, MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, r_14, MD5C0e, MD5S02); + MD5_STEP0(MD5_Fo, b, c, d, a, MD5C0f, MD5S03); + + MD5_STEP0(MD5_Go, a, b, c, d, MD5C10, MD5S10); + MD5_STEP0(MD5_Go, d, a, b, c, MD5C11, MD5S11); + MD5_STEP0(MD5_Go, c, d, a, b, MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, r_00, MD5C13, MD5S13); + MD5_STEP0(MD5_Go, a, b, c, d, MD5C14, MD5S10); + MD5_STEP0(MD5_Go, d, a, b, c, MD5C15, MD5S11); + MD5_STEP0(MD5_Go, c, d, a, b, MD5C16, MD5S12); + MD5_STEP0(MD5_Go, b, c, d, a, MD5C17, MD5S13); + MD5_STEP0(MD5_Go, a, b, c, d, MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, r_14, MD5C19, MD5S11); + MD5_STEP0(MD5_Go, c, d, a, b, MD5C1a, MD5S12); + MD5_STEP0(MD5_Go, b, c, d, a, MD5C1b, MD5S13); + MD5_STEP0(MD5_Go, a, b, c, d, MD5C1c, MD5S10); + MD5_STEP0(MD5_Go, d, a, b, c, MD5C1d, MD5S11); + MD5_STEP0(MD5_Go, c, d, a, b, MD5C1e, MD5S12); + MD5_STEP0(MD5_Go, b, c, d, a, MD5C1f, MD5S13); + + MD5_STEP0(MD5_H , a, b, c, d, MD5C20, MD5S20); + MD5_STEP0(MD5_H , d, a, b, c, MD5C21, MD5S21); + MD5_STEP0(MD5_H , c, d, a, b, MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, r_14, MD5C23, MD5S23); + MD5_STEP0(MD5_H , a, b, c, d, MD5C24, MD5S20); + MD5_STEP0(MD5_H , d, a, b, c, MD5C25, MD5S21); + MD5_STEP0(MD5_H , c, d, a, b, MD5C26, MD5S22); + MD5_STEP0(MD5_H , b, c, d, a, MD5C27, MD5S23); + MD5_STEP0(MD5_H , a, b, c, d, MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, r_00, MD5C29, MD5S21); + MD5_STEP0(MD5_H , c, d, a, b, MD5C2a, MD5S22); + MD5_STEP0(MD5_H , b, c, d, a, MD5C2b, MD5S23); + MD5_STEP0(MD5_H , a, b, c, d, MD5C2c, MD5S20); + MD5_STEP0(MD5_H , d, a, b, c, MD5C2d, MD5S21); + MD5_STEP0(MD5_H , c, d, a, b, MD5C2e, MD5S22); + MD5_STEP0(MD5_H , b, c, d, a, MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, r_00, MD5C30, MD5S30); + MD5_STEP0(MD5_I , d, a, b, c, MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, r_14, MD5C32, MD5S32); + MD5_STEP0(MD5_I , b, c, d, a, MD5C33, MD5S33); + MD5_STEP0(MD5_I , a, b, c, d, MD5C34, MD5S30); + MD5_STEP0(MD5_I , d, a, b, c, MD5C35, MD5S31); + MD5_STEP0(MD5_I , c, d, a, b, MD5C36, MD5S32); + MD5_STEP0(MD5_I , b, c, d, a, MD5C37, MD5S33); + MD5_STEP0(MD5_I , a, b, c, d, MD5C38, MD5S30); + MD5_STEP0(MD5_I , d, a, b, c, MD5C39, MD5S31); + MD5_STEP0(MD5_I , c, d, a, b, MD5C3a, MD5S32); + MD5_STEP0(MD5_I , b, c, d, a, MD5C3b, MD5S33); + MD5_STEP0(MD5_I , a, b, c, d, MD5C3c, MD5S30); + + if (allx ((a + r_a) != search[0])) continue; + + MD5_STEP0(MD5_I , d, a, b, c, MD5C3d, MD5S31); + MD5_STEP0(MD5_I , c, d, a, b, MD5C3e, MD5S32); + MD5_STEP0(MD5_I , b, c, d, a, MD5C3f, MD5S33); + + a += r_a; + b += r_b; + c += r_c; + d += r_d; + + const u32x r0 = a; + const u32x r1 = d; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_S + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m02810_s08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m02810_s16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/amd/m02810_a1.cl b/amd/m02810_a1.cl new file mode 100644 index 0000000000..c4fb50be03 --- /dev/null +++ b/amd/m02810_a1.cl @@ -0,0 +1,976 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _MD5_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW4 +#define VECT_SIZE4 +#endif + +#ifdef VLIW5 +#define VECT_SIZE4 +#endif + +#define DGST_R0 0 +#define DGST_R1 3 +#define DGST_R2 2 +#define DGST_R3 1 + +#include "include/kernel_functions.c" +#include "types_amd.c" +#include "common_amd.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +#ifdef VECT_SIZE1 +#define uint_to_hex_lower8(i) l_bin2asc[(i)] +#endif + +#ifdef VECT_SIZE2 +#define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1]) +#endif + +#ifdef VECT_SIZE4 +#define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3]) +#endif + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m02810_m04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + append_0x80_2 (wordl0, wordl1, pw_l_len); + + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, combs_buf[0].pw_len); + } + + /** + * salt + */ + + u32 s[8]; + + s[0] = salt_bufs[salt_pos].salt_buf_pc[0]; + s[1] = salt_bufs[salt_pos].salt_buf_pc[1]; + s[2] = salt_bufs[salt_pos].salt_buf_pc[2]; + s[3] = salt_bufs[salt_pos].salt_buf_pc[3]; + s[4] = salt_bufs[salt_pos].salt_buf_pc[4]; + s[5] = salt_bufs[salt_pos].salt_buf_pc[5]; + s[6] = salt_bufs[salt_pos].salt_buf_pc[6]; + s[7] = salt_bufs[salt_pos].salt_buf_pc[7]; + + const u32 r_00 = 0x80; + const u32 r_14 = 64 * 8; + + /** + * bin2asc table + */ + + __local u32 l_bin2asc[256]; + + const u32 lid4 = lid * 4; + + const u32 lid40 = lid4 + 0; + const u32 lid41 = lid4 + 1; + const u32 lid42 = lid4 + 2; + const u32 lid43 = lid4 + 3; + + const u32 v400 = (lid40 >> 0) & 15; + const u32 v401 = (lid40 >> 4) & 15; + const u32 v410 = (lid41 >> 0) & 15; + const u32 v411 = (lid41 >> 4) & 15; + const u32 v420 = (lid42 >> 0) & 15; + const u32 v421 = (lid42 >> 4) & 15; + const u32 v430 = (lid43 >> 0) & 15; + const u32 v431 = (lid43 >> 4) & 15; + + l_bin2asc[lid40] = ((v400 < 10) ? '0' + v400 : 'a' - 10 + v400) << 8 + | ((v401 < 10) ? '0' + v401 : 'a' - 10 + v401) << 0; + l_bin2asc[lid41] = ((v410 < 10) ? '0' + v410 : 'a' - 10 + v410) << 8 + | ((v411 < 10) ? '0' + v411 : 'a' - 10 + v411) << 0; + l_bin2asc[lid42] = ((v420 < 10) ? '0' + v420 : 'a' - 10 + v420) << 8 + | ((v421 < 10) ? '0' + v421 : 'a' - 10 + v421) << 0; + l_bin2asc[lid43] = ((v430 < 10) ? '0' + v430 : 'a' - 10 + v430) << 8 + | ((v431 < 10) ? '0' + v431 : 'a' - 10 + v431) << 0; + + barrier (CLK_LOCAL_MEM_FENCE); + + if (gid >= gid_max) return; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = combs_buf[il_pos].pw_len; + + const u32 pw_len = pw_l_len + pw_r_len; + + u32 wordr0[4]; + + wordr0[0] = combs_buf[il_pos].i[0]; + wordr0[1] = combs_buf[il_pos].i[1]; + wordr0[2] = combs_buf[il_pos].i[2]; + wordr0[3] = combs_buf[il_pos].i[3]; + + u32 wordr1[4]; + + wordr1[0] = combs_buf[il_pos].i[4]; + wordr1[1] = combs_buf[il_pos].i[5]; + wordr1[2] = combs_buf[il_pos].i[6]; + wordr1[3] = combs_buf[il_pos].i[7]; + + u32 wordr2[4]; + + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + + u32 wordr3[4]; + + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + u32x w0[4]; + + w0[0] = wordl0[0] | wordr0[0]; + w0[1] = wordl0[1] | wordr0[1]; + w0[2] = wordl0[2] | wordr0[2]; + w0[3] = wordl0[3] | wordr0[3]; + + u32x w1[4]; + + w1[0] = wordl1[0] | wordr1[0]; + w1[1] = wordl1[1] | wordr1[1]; + w1[2] = wordl1[2] | wordr1[2]; + w1[3] = wordl1[3] | wordr1[3]; + + u32x w2[4]; + + w2[0] = wordl2[0] | wordr2[0]; + w2[1] = wordl2[1] | wordr2[1]; + w2[2] = wordl2[2] | wordr2[2]; + w2[3] = wordl2[3] | wordr2[3]; + + u32x w3[4]; + + w3[0] = wordl3[0] | wordr3[0]; + w3[1] = wordl3[1] | wordr3[1]; + w3[2] = pw_len * 8; + w3[3] = 0; + + u32x a = MD5M_A; + u32x b = MD5M_B; + u32x c = MD5M_C; + u32x d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H , a, b, c, d, w1[1], MD5C20, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w2[0], MD5C21, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w2[3], MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w3[2], MD5C23, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w0[1], MD5C24, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w1[0], MD5C25, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w1[3], MD5C26, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w2[2], MD5C27, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w3[1], MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w0[0], MD5C29, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w0[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w1[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w2[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w3[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w3[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w0[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1[0], MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w2[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2[1], MD5C3f, MD5S33); + + a += MD5M_A; + b += MD5M_B; + c += MD5M_C; + d += MD5M_D; + + const u32 w0_t = s[0]; + const u32 w1_t = s[1]; + const u32 w2_t = s[2]; + const u32 w3_t = s[3]; + const u32 w4_t = s[4]; + const u32 w5_t = s[5]; + const u32 w6_t = s[6]; + const u32 w7_t = s[7]; + + const u32x w8_t = uint_to_hex_lower8 ((a >> 0) & 255) << 0 + | uint_to_hex_lower8 ((a >> 8) & 255) << 16; + const u32x w9_t = uint_to_hex_lower8 ((a >> 16) & 255) << 0 + | uint_to_hex_lower8 ((a >> 24) & 255) << 16; + const u32x wa_t = uint_to_hex_lower8 ((b >> 0) & 255) << 0 + | uint_to_hex_lower8 ((b >> 8) & 255) << 16; + const u32x wb_t = uint_to_hex_lower8 ((b >> 16) & 255) << 0 + | uint_to_hex_lower8 ((b >> 24) & 255) << 16; + const u32x wc_t = uint_to_hex_lower8 ((c >> 0) & 255) << 0 + | uint_to_hex_lower8 ((c >> 8) & 255) << 16; + const u32x wd_t = uint_to_hex_lower8 ((c >> 16) & 255) << 0 + | uint_to_hex_lower8 ((c >> 24) & 255) << 16; + const u32x we_t = uint_to_hex_lower8 ((d >> 0) & 255) << 0 + | uint_to_hex_lower8 ((d >> 8) & 255) << 16; + const u32x wf_t = uint_to_hex_lower8 ((d >> 16) & 255) << 0 + | uint_to_hex_lower8 ((d >> 24) & 255) << 16; + + a = MD5M_A; + b = MD5M_B; + c = MD5M_C; + d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t, MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t, MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t, MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t, MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w4_t, MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w5_t, MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w6_t, MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w7_t, MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w8_t, MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w9_t, MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, wa_t, MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, wb_t, MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, wc_t, MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, wd_t, MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, we_t, MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, wf_t, MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w1_t, MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w6_t, MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, wb_t, MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t, MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w5_t, MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, wa_t, MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, wf_t, MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w4_t, MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w9_t, MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, we_t, MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t, MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w8_t, MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, wd_t, MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t, MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w7_t, MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, wc_t, MD5C1f, MD5S13); + + MD5_STEP (MD5_H , a, b, c, d, w5_t, MD5C20, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w8_t, MD5C21, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, wb_t, MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, we_t, MD5C23, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w1_t, MD5C24, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w4_t, MD5C25, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w7_t, MD5C26, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, wa_t, MD5C27, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, wd_t, MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w0_t, MD5C29, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w3_t, MD5C2a, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w6_t, MD5C2b, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w9_t, MD5C2c, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, wc_t, MD5C2d, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, wf_t, MD5C2e, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w2_t, MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t, MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w7_t, MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, we_t, MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w5_t, MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, wc_t, MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t, MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, wa_t, MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t, MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w8_t, MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, wf_t, MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w6_t, MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, wd_t, MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w4_t, MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, wb_t, MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t, MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w9_t, MD5C3f, MD5S33); + + const u32x r_a = a + MD5M_A; + const u32x r_b = b + MD5M_B; + const u32x r_c = c + MD5M_C; + const u32x r_d = d + MD5M_D; + + a = r_a; + b = r_b; + c = r_c; + d = r_d; + + MD5_STEP (MD5_Fo, a, b, c, d, r_00, MD5C00, MD5S00); + MD5_STEP0(MD5_Fo, d, a, b, c, MD5C01, MD5S01); + MD5_STEP0(MD5_Fo, c, d, a, b, MD5C02, MD5S02); + MD5_STEP0(MD5_Fo, b, c, d, a, MD5C03, MD5S03); + MD5_STEP0(MD5_Fo, a, b, c, d, MD5C04, MD5S00); + MD5_STEP0(MD5_Fo, d, a, b, c, MD5C05, MD5S01); + MD5_STEP0(MD5_Fo, c, d, a, b, MD5C06, MD5S02); + MD5_STEP0(MD5_Fo, b, c, d, a, MD5C07, MD5S03); + MD5_STEP0(MD5_Fo, a, b, c, d, MD5C08, MD5S00); + MD5_STEP0(MD5_Fo, d, a, b, c, MD5C09, MD5S01); + MD5_STEP0(MD5_Fo, c, d, a, b, MD5C0a, MD5S02); + MD5_STEP0(MD5_Fo, b, c, d, a, MD5C0b, MD5S03); + MD5_STEP0(MD5_Fo, a, b, c, d, MD5C0c, MD5S00); + MD5_STEP0(MD5_Fo, d, a, b, c, MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, r_14, MD5C0e, MD5S02); + MD5_STEP0(MD5_Fo, b, c, d, a, MD5C0f, MD5S03); + + MD5_STEP0(MD5_Go, a, b, c, d, MD5C10, MD5S10); + MD5_STEP0(MD5_Go, d, a, b, c, MD5C11, MD5S11); + MD5_STEP0(MD5_Go, c, d, a, b, MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, r_00, MD5C13, MD5S13); + MD5_STEP0(MD5_Go, a, b, c, d, MD5C14, MD5S10); + MD5_STEP0(MD5_Go, d, a, b, c, MD5C15, MD5S11); + MD5_STEP0(MD5_Go, c, d, a, b, MD5C16, MD5S12); + MD5_STEP0(MD5_Go, b, c, d, a, MD5C17, MD5S13); + MD5_STEP0(MD5_Go, a, b, c, d, MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, r_14, MD5C19, MD5S11); + MD5_STEP0(MD5_Go, c, d, a, b, MD5C1a, MD5S12); + MD5_STEP0(MD5_Go, b, c, d, a, MD5C1b, MD5S13); + MD5_STEP0(MD5_Go, a, b, c, d, MD5C1c, MD5S10); + MD5_STEP0(MD5_Go, d, a, b, c, MD5C1d, MD5S11); + MD5_STEP0(MD5_Go, c, d, a, b, MD5C1e, MD5S12); + MD5_STEP0(MD5_Go, b, c, d, a, MD5C1f, MD5S13); + + MD5_STEP0(MD5_H , a, b, c, d, MD5C20, MD5S20); + MD5_STEP0(MD5_H , d, a, b, c, MD5C21, MD5S21); + MD5_STEP0(MD5_H , c, d, a, b, MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, r_14, MD5C23, MD5S23); + MD5_STEP0(MD5_H , a, b, c, d, MD5C24, MD5S20); + MD5_STEP0(MD5_H , d, a, b, c, MD5C25, MD5S21); + MD5_STEP0(MD5_H , c, d, a, b, MD5C26, MD5S22); + MD5_STEP0(MD5_H , b, c, d, a, MD5C27, MD5S23); + MD5_STEP0(MD5_H , a, b, c, d, MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, r_00, MD5C29, MD5S21); + MD5_STEP0(MD5_H , c, d, a, b, MD5C2a, MD5S22); + MD5_STEP0(MD5_H , b, c, d, a, MD5C2b, MD5S23); + MD5_STEP0(MD5_H , a, b, c, d, MD5C2c, MD5S20); + MD5_STEP0(MD5_H , d, a, b, c, MD5C2d, MD5S21); + MD5_STEP0(MD5_H , c, d, a, b, MD5C2e, MD5S22); + MD5_STEP0(MD5_H , b, c, d, a, MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, r_00, MD5C30, MD5S30); + MD5_STEP0(MD5_I , d, a, b, c, MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, r_14, MD5C32, MD5S32); + MD5_STEP0(MD5_I , b, c, d, a, MD5C33, MD5S33); + MD5_STEP0(MD5_I , a, b, c, d, MD5C34, MD5S30); + MD5_STEP0(MD5_I , d, a, b, c, MD5C35, MD5S31); + MD5_STEP0(MD5_I , c, d, a, b, MD5C36, MD5S32); + MD5_STEP0(MD5_I , b, c, d, a, MD5C37, MD5S33); + MD5_STEP0(MD5_I , a, b, c, d, MD5C38, MD5S30); + MD5_STEP0(MD5_I , d, a, b, c, MD5C39, MD5S31); + MD5_STEP0(MD5_I , c, d, a, b, MD5C3a, MD5S32); + MD5_STEP0(MD5_I , b, c, d, a, MD5C3b, MD5S33); + MD5_STEP0(MD5_I , a, b, c, d, MD5C3c, MD5S30); + MD5_STEP0(MD5_I , d, a, b, c, MD5C3d, MD5S31); + MD5_STEP0(MD5_I , c, d, a, b, MD5C3e, MD5S32); + MD5_STEP0(MD5_I , b, c, d, a, MD5C3f, MD5S33); + + a += r_a; + b += r_b; + c += r_c; + d += r_d; + + const u32x r0 = a; + const u32x r1 = d; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_M + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m02810_m08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m02810_m16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m02810_s04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + append_0x80_2 (wordl0, wordl1, pw_l_len); + + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, combs_buf[0].pw_len); + } + + /** + * salt + */ + + u32 s[8]; + + s[0] = salt_bufs[salt_pos].salt_buf_pc[0]; + s[1] = salt_bufs[salt_pos].salt_buf_pc[1]; + s[2] = salt_bufs[salt_pos].salt_buf_pc[2]; + s[3] = salt_bufs[salt_pos].salt_buf_pc[3]; + s[4] = salt_bufs[salt_pos].salt_buf_pc[4]; + s[5] = salt_bufs[salt_pos].salt_buf_pc[5]; + s[6] = salt_bufs[salt_pos].salt_buf_pc[6]; + s[7] = salt_bufs[salt_pos].salt_buf_pc[7]; + + const u32 r_00 = 0x80; + const u32 r_14 = 64 * 8; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * bin2asc table + */ + + __local u32 l_bin2asc[256]; + + const u32 lid4 = lid * 4; + + const u32 lid40 = lid4 + 0; + const u32 lid41 = lid4 + 1; + const u32 lid42 = lid4 + 2; + const u32 lid43 = lid4 + 3; + + const u32 v400 = (lid40 >> 0) & 15; + const u32 v401 = (lid40 >> 4) & 15; + const u32 v410 = (lid41 >> 0) & 15; + const u32 v411 = (lid41 >> 4) & 15; + const u32 v420 = (lid42 >> 0) & 15; + const u32 v421 = (lid42 >> 4) & 15; + const u32 v430 = (lid43 >> 0) & 15; + const u32 v431 = (lid43 >> 4) & 15; + + l_bin2asc[lid40] = ((v400 < 10) ? '0' + v400 : 'a' - 10 + v400) << 8 + | ((v401 < 10) ? '0' + v401 : 'a' - 10 + v401) << 0; + l_bin2asc[lid41] = ((v410 < 10) ? '0' + v410 : 'a' - 10 + v410) << 8 + | ((v411 < 10) ? '0' + v411 : 'a' - 10 + v411) << 0; + l_bin2asc[lid42] = ((v420 < 10) ? '0' + v420 : 'a' - 10 + v420) << 8 + | ((v421 < 10) ? '0' + v421 : 'a' - 10 + v421) << 0; + l_bin2asc[lid43] = ((v430 < 10) ? '0' + v430 : 'a' - 10 + v430) << 8 + | ((v431 < 10) ? '0' + v431 : 'a' - 10 + v431) << 0; + + barrier (CLK_LOCAL_MEM_FENCE); + + if (gid >= gid_max) return; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = combs_buf[il_pos].pw_len; + + const u32 pw_len = pw_l_len + pw_r_len; + + u32 wordr0[4]; + + wordr0[0] = combs_buf[il_pos].i[0]; + wordr0[1] = combs_buf[il_pos].i[1]; + wordr0[2] = combs_buf[il_pos].i[2]; + wordr0[3] = combs_buf[il_pos].i[3]; + + u32 wordr1[4]; + + wordr1[0] = combs_buf[il_pos].i[4]; + wordr1[1] = combs_buf[il_pos].i[5]; + wordr1[2] = combs_buf[il_pos].i[6]; + wordr1[3] = combs_buf[il_pos].i[7]; + + u32 wordr2[4]; + + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + + u32 wordr3[4]; + + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + u32x w0[4]; + + w0[0] = wordl0[0] | wordr0[0]; + w0[1] = wordl0[1] | wordr0[1]; + w0[2] = wordl0[2] | wordr0[2]; + w0[3] = wordl0[3] | wordr0[3]; + + u32x w1[4]; + + w1[0] = wordl1[0] | wordr1[0]; + w1[1] = wordl1[1] | wordr1[1]; + w1[2] = wordl1[2] | wordr1[2]; + w1[3] = wordl1[3] | wordr1[3]; + + u32x w2[4]; + + w2[0] = wordl2[0] | wordr2[0]; + w2[1] = wordl2[1] | wordr2[1]; + w2[2] = wordl2[2] | wordr2[2]; + w2[3] = wordl2[3] | wordr2[3]; + + u32x w3[4]; + + w3[0] = wordl3[0] | wordr3[0]; + w3[1] = wordl3[1] | wordr3[1]; + w3[2] = pw_len * 8; + w3[3] = 0; + + u32x a = MD5M_A; + u32x b = MD5M_B; + u32x c = MD5M_C; + u32x d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H , a, b, c, d, w1[1], MD5C20, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w2[0], MD5C21, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w2[3], MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w3[2], MD5C23, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w0[1], MD5C24, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w1[0], MD5C25, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w1[3], MD5C26, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w2[2], MD5C27, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w3[1], MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w0[0], MD5C29, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w0[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w1[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w2[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w3[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w3[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w0[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1[0], MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w2[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2[1], MD5C3f, MD5S33); + + a += MD5M_A; + b += MD5M_B; + c += MD5M_C; + d += MD5M_D; + + const u32 w0_t = s[0]; + const u32 w1_t = s[1]; + const u32 w2_t = s[2]; + const u32 w3_t = s[3]; + const u32 w4_t = s[4]; + const u32 w5_t = s[5]; + const u32 w6_t = s[6]; + const u32 w7_t = s[7]; + + const u32x w8_t = uint_to_hex_lower8 ((a >> 0) & 255) << 0 + | uint_to_hex_lower8 ((a >> 8) & 255) << 16; + const u32x w9_t = uint_to_hex_lower8 ((a >> 16) & 255) << 0 + | uint_to_hex_lower8 ((a >> 24) & 255) << 16; + const u32x wa_t = uint_to_hex_lower8 ((b >> 0) & 255) << 0 + | uint_to_hex_lower8 ((b >> 8) & 255) << 16; + const u32x wb_t = uint_to_hex_lower8 ((b >> 16) & 255) << 0 + | uint_to_hex_lower8 ((b >> 24) & 255) << 16; + const u32x wc_t = uint_to_hex_lower8 ((c >> 0) & 255) << 0 + | uint_to_hex_lower8 ((c >> 8) & 255) << 16; + const u32x wd_t = uint_to_hex_lower8 ((c >> 16) & 255) << 0 + | uint_to_hex_lower8 ((c >> 24) & 255) << 16; + const u32x we_t = uint_to_hex_lower8 ((d >> 0) & 255) << 0 + | uint_to_hex_lower8 ((d >> 8) & 255) << 16; + const u32x wf_t = uint_to_hex_lower8 ((d >> 16) & 255) << 0 + | uint_to_hex_lower8 ((d >> 24) & 255) << 16; + + a = MD5M_A; + b = MD5M_B; + c = MD5M_C; + d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t, MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t, MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t, MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t, MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w4_t, MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w5_t, MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w6_t, MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w7_t, MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w8_t, MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w9_t, MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, wa_t, MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, wb_t, MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, wc_t, MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, wd_t, MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, we_t, MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, wf_t, MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w1_t, MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w6_t, MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, wb_t, MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t, MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w5_t, MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, wa_t, MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, wf_t, MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w4_t, MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w9_t, MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, we_t, MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t, MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w8_t, MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, wd_t, MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t, MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w7_t, MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, wc_t, MD5C1f, MD5S13); + + MD5_STEP (MD5_H , a, b, c, d, w5_t, MD5C20, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w8_t, MD5C21, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, wb_t, MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, we_t, MD5C23, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w1_t, MD5C24, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w4_t, MD5C25, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w7_t, MD5C26, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, wa_t, MD5C27, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, wd_t, MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w0_t, MD5C29, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w3_t, MD5C2a, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w6_t, MD5C2b, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w9_t, MD5C2c, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, wc_t, MD5C2d, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, wf_t, MD5C2e, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w2_t, MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t, MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w7_t, MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, we_t, MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w5_t, MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, wc_t, MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t, MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, wa_t, MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t, MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w8_t, MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, wf_t, MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w6_t, MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, wd_t, MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w4_t, MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, wb_t, MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t, MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w9_t, MD5C3f, MD5S33); + + const u32x r_a = a + MD5M_A; + const u32x r_b = b + MD5M_B; + const u32x r_c = c + MD5M_C; + const u32x r_d = d + MD5M_D; + + a = r_a; + b = r_b; + c = r_c; + d = r_d; + + MD5_STEP (MD5_Fo, a, b, c, d, r_00, MD5C00, MD5S00); + MD5_STEP0(MD5_Fo, d, a, b, c, MD5C01, MD5S01); + MD5_STEP0(MD5_Fo, c, d, a, b, MD5C02, MD5S02); + MD5_STEP0(MD5_Fo, b, c, d, a, MD5C03, MD5S03); + MD5_STEP0(MD5_Fo, a, b, c, d, MD5C04, MD5S00); + MD5_STEP0(MD5_Fo, d, a, b, c, MD5C05, MD5S01); + MD5_STEP0(MD5_Fo, c, d, a, b, MD5C06, MD5S02); + MD5_STEP0(MD5_Fo, b, c, d, a, MD5C07, MD5S03); + MD5_STEP0(MD5_Fo, a, b, c, d, MD5C08, MD5S00); + MD5_STEP0(MD5_Fo, d, a, b, c, MD5C09, MD5S01); + MD5_STEP0(MD5_Fo, c, d, a, b, MD5C0a, MD5S02); + MD5_STEP0(MD5_Fo, b, c, d, a, MD5C0b, MD5S03); + MD5_STEP0(MD5_Fo, a, b, c, d, MD5C0c, MD5S00); + MD5_STEP0(MD5_Fo, d, a, b, c, MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, r_14, MD5C0e, MD5S02); + MD5_STEP0(MD5_Fo, b, c, d, a, MD5C0f, MD5S03); + + MD5_STEP0(MD5_Go, a, b, c, d, MD5C10, MD5S10); + MD5_STEP0(MD5_Go, d, a, b, c, MD5C11, MD5S11); + MD5_STEP0(MD5_Go, c, d, a, b, MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, r_00, MD5C13, MD5S13); + MD5_STEP0(MD5_Go, a, b, c, d, MD5C14, MD5S10); + MD5_STEP0(MD5_Go, d, a, b, c, MD5C15, MD5S11); + MD5_STEP0(MD5_Go, c, d, a, b, MD5C16, MD5S12); + MD5_STEP0(MD5_Go, b, c, d, a, MD5C17, MD5S13); + MD5_STEP0(MD5_Go, a, b, c, d, MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, r_14, MD5C19, MD5S11); + MD5_STEP0(MD5_Go, c, d, a, b, MD5C1a, MD5S12); + MD5_STEP0(MD5_Go, b, c, d, a, MD5C1b, MD5S13); + MD5_STEP0(MD5_Go, a, b, c, d, MD5C1c, MD5S10); + MD5_STEP0(MD5_Go, d, a, b, c, MD5C1d, MD5S11); + MD5_STEP0(MD5_Go, c, d, a, b, MD5C1e, MD5S12); + MD5_STEP0(MD5_Go, b, c, d, a, MD5C1f, MD5S13); + + MD5_STEP0(MD5_H , a, b, c, d, MD5C20, MD5S20); + MD5_STEP0(MD5_H , d, a, b, c, MD5C21, MD5S21); + MD5_STEP0(MD5_H , c, d, a, b, MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, r_14, MD5C23, MD5S23); + MD5_STEP0(MD5_H , a, b, c, d, MD5C24, MD5S20); + MD5_STEP0(MD5_H , d, a, b, c, MD5C25, MD5S21); + MD5_STEP0(MD5_H , c, d, a, b, MD5C26, MD5S22); + MD5_STEP0(MD5_H , b, c, d, a, MD5C27, MD5S23); + MD5_STEP0(MD5_H , a, b, c, d, MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, r_00, MD5C29, MD5S21); + MD5_STEP0(MD5_H , c, d, a, b, MD5C2a, MD5S22); + MD5_STEP0(MD5_H , b, c, d, a, MD5C2b, MD5S23); + MD5_STEP0(MD5_H , a, b, c, d, MD5C2c, MD5S20); + MD5_STEP0(MD5_H , d, a, b, c, MD5C2d, MD5S21); + MD5_STEP0(MD5_H , c, d, a, b, MD5C2e, MD5S22); + MD5_STEP0(MD5_H , b, c, d, a, MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, r_00, MD5C30, MD5S30); + MD5_STEP0(MD5_I , d, a, b, c, MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, r_14, MD5C32, MD5S32); + MD5_STEP0(MD5_I , b, c, d, a, MD5C33, MD5S33); + MD5_STEP0(MD5_I , a, b, c, d, MD5C34, MD5S30); + MD5_STEP0(MD5_I , d, a, b, c, MD5C35, MD5S31); + MD5_STEP0(MD5_I , c, d, a, b, MD5C36, MD5S32); + MD5_STEP0(MD5_I , b, c, d, a, MD5C37, MD5S33); + MD5_STEP0(MD5_I , a, b, c, d, MD5C38, MD5S30); + MD5_STEP0(MD5_I , d, a, b, c, MD5C39, MD5S31); + MD5_STEP0(MD5_I , c, d, a, b, MD5C3a, MD5S32); + MD5_STEP0(MD5_I , b, c, d, a, MD5C3b, MD5S33); + MD5_STEP0(MD5_I , a, b, c, d, MD5C3c, MD5S30); + + if (allx ((a + r_a) != search[0])) continue; + + MD5_STEP0(MD5_I , d, a, b, c, MD5C3d, MD5S31); + MD5_STEP0(MD5_I , c, d, a, b, MD5C3e, MD5S32); + MD5_STEP0(MD5_I , b, c, d, a, MD5C3f, MD5S33); + + a += r_a; + b += r_b; + c += r_c; + d += r_d; + + const u32x r0 = a; + const u32x r1 = d; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_S + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m02810_s08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m02810_s16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/amd/m02810_a3.cl b/amd/m02810_a3.cl new file mode 100644 index 0000000000..309b2715db --- /dev/null +++ b/amd/m02810_a3.cl @@ -0,0 +1,1205 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _MD5_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW4 +#define VECT_SIZE4 +#endif + +#ifdef VLIW5 +#define VECT_SIZE4 +#endif + +#define DGST_R0 0 +#define DGST_R1 3 +#define DGST_R2 2 +#define DGST_R3 1 + +#include "include/kernel_functions.c" +#include "types_amd.c" +#include "common_amd.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +#ifdef VECT_SIZE1 +#define uint_to_hex_lower8(i) l_bin2asc[(i)] +#endif + +#ifdef VECT_SIZE2 +#define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1]) +#endif + +#ifdef VECT_SIZE4 +#define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3]) +#endif + +static void m02810m (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], const u32 pw_len, __global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, __local u32 l_bin2asc[256]) +{ + /** + * modifier + */ + + const u32 gid = get_global_id (0); + const u32 lid = get_local_id (0); + + /** + * salt + */ + + u32 s[8]; + + s[0] = salt_bufs[salt_pos].salt_buf_pc[0]; + s[1] = salt_bufs[salt_pos].salt_buf_pc[1]; + s[2] = salt_bufs[salt_pos].salt_buf_pc[2]; + s[3] = salt_bufs[salt_pos].salt_buf_pc[3]; + s[4] = salt_bufs[salt_pos].salt_buf_pc[4]; + s[5] = salt_bufs[salt_pos].salt_buf_pc[5]; + s[6] = salt_bufs[salt_pos].salt_buf_pc[6]; + s[7] = salt_bufs[salt_pos].salt_buf_pc[7]; + + const u32 r_00 = 0x80; + const u32 r_14 = 64 * 8; + + /** + * loop + */ + + u32x w0l = w0[0]; + + for (u32 il_pos = 0; il_pos < bfs_cnt; il_pos++) + { + const u32 w0r = bfs_buf[il_pos].i; + + w0[0] = w0l | w0r; + + u32x a = MD5M_A; + u32x b = MD5M_B; + u32x c = MD5M_C; + u32x d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H , a, b, c, d, w1[1], MD5C20, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w2[0], MD5C21, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w2[3], MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w3[2], MD5C23, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w0[1], MD5C24, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w1[0], MD5C25, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w1[3], MD5C26, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w2[2], MD5C27, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w3[1], MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w0[0], MD5C29, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w0[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w1[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w2[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w3[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w3[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w0[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1[0], MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w2[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2[1], MD5C3f, MD5S33); + + a += MD5M_A; + b += MD5M_B; + c += MD5M_C; + d += MD5M_D; + + const u32 w0_t = s[0]; + const u32 w1_t = s[1]; + const u32 w2_t = s[2]; + const u32 w3_t = s[3]; + const u32 w4_t = s[4]; + const u32 w5_t = s[5]; + const u32 w6_t = s[6]; + const u32 w7_t = s[7]; + + const u32x w8_t = uint_to_hex_lower8 ((a >> 0) & 255) << 0 + | uint_to_hex_lower8 ((a >> 8) & 255) << 16; + const u32x w9_t = uint_to_hex_lower8 ((a >> 16) & 255) << 0 + | uint_to_hex_lower8 ((a >> 24) & 255) << 16; + const u32x wa_t = uint_to_hex_lower8 ((b >> 0) & 255) << 0 + | uint_to_hex_lower8 ((b >> 8) & 255) << 16; + const u32x wb_t = uint_to_hex_lower8 ((b >> 16) & 255) << 0 + | uint_to_hex_lower8 ((b >> 24) & 255) << 16; + const u32x wc_t = uint_to_hex_lower8 ((c >> 0) & 255) << 0 + | uint_to_hex_lower8 ((c >> 8) & 255) << 16; + const u32x wd_t = uint_to_hex_lower8 ((c >> 16) & 255) << 0 + | uint_to_hex_lower8 ((c >> 24) & 255) << 16; + const u32x we_t = uint_to_hex_lower8 ((d >> 0) & 255) << 0 + | uint_to_hex_lower8 ((d >> 8) & 255) << 16; + const u32x wf_t = uint_to_hex_lower8 ((d >> 16) & 255) << 0 + | uint_to_hex_lower8 ((d >> 24) & 255) << 16; + + a = MD5M_A; + b = MD5M_B; + c = MD5M_C; + d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t, MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t, MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t, MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t, MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w4_t, MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w5_t, MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w6_t, MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w7_t, MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w8_t, MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w9_t, MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, wa_t, MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, wb_t, MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, wc_t, MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, wd_t, MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, we_t, MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, wf_t, MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w1_t, MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w6_t, MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, wb_t, MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t, MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w5_t, MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, wa_t, MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, wf_t, MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w4_t, MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w9_t, MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, we_t, MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t, MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w8_t, MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, wd_t, MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t, MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w7_t, MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, wc_t, MD5C1f, MD5S13); + + MD5_STEP (MD5_H , a, b, c, d, w5_t, MD5C20, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w8_t, MD5C21, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, wb_t, MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, we_t, MD5C23, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w1_t, MD5C24, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w4_t, MD5C25, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w7_t, MD5C26, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, wa_t, MD5C27, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, wd_t, MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w0_t, MD5C29, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w3_t, MD5C2a, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w6_t, MD5C2b, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w9_t, MD5C2c, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, wc_t, MD5C2d, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, wf_t, MD5C2e, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w2_t, MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t, MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w7_t, MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, we_t, MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w5_t, MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, wc_t, MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t, MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, wa_t, MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t, MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w8_t, MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, wf_t, MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w6_t, MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, wd_t, MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w4_t, MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, wb_t, MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t, MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w9_t, MD5C3f, MD5S33); + + const u32x r_a = a + MD5M_A; + const u32x r_b = b + MD5M_B; + const u32x r_c = c + MD5M_C; + const u32x r_d = d + MD5M_D; + + a = r_a; + b = r_b; + c = r_c; + d = r_d; + + MD5_STEP (MD5_Fo, a, b, c, d, r_00, MD5C00, MD5S00); + MD5_STEP0(MD5_Fo, d, a, b, c, MD5C01, MD5S01); + MD5_STEP0(MD5_Fo, c, d, a, b, MD5C02, MD5S02); + MD5_STEP0(MD5_Fo, b, c, d, a, MD5C03, MD5S03); + MD5_STEP0(MD5_Fo, a, b, c, d, MD5C04, MD5S00); + MD5_STEP0(MD5_Fo, d, a, b, c, MD5C05, MD5S01); + MD5_STEP0(MD5_Fo, c, d, a, b, MD5C06, MD5S02); + MD5_STEP0(MD5_Fo, b, c, d, a, MD5C07, MD5S03); + MD5_STEP0(MD5_Fo, a, b, c, d, MD5C08, MD5S00); + MD5_STEP0(MD5_Fo, d, a, b, c, MD5C09, MD5S01); + MD5_STEP0(MD5_Fo, c, d, a, b, MD5C0a, MD5S02); + MD5_STEP0(MD5_Fo, b, c, d, a, MD5C0b, MD5S03); + MD5_STEP0(MD5_Fo, a, b, c, d, MD5C0c, MD5S00); + MD5_STEP0(MD5_Fo, d, a, b, c, MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, r_14, MD5C0e, MD5S02); + MD5_STEP0(MD5_Fo, b, c, d, a, MD5C0f, MD5S03); + + MD5_STEP0(MD5_Go, a, b, c, d, MD5C10, MD5S10); + MD5_STEP0(MD5_Go, d, a, b, c, MD5C11, MD5S11); + MD5_STEP0(MD5_Go, c, d, a, b, MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, r_00, MD5C13, MD5S13); + MD5_STEP0(MD5_Go, a, b, c, d, MD5C14, MD5S10); + MD5_STEP0(MD5_Go, d, a, b, c, MD5C15, MD5S11); + MD5_STEP0(MD5_Go, c, d, a, b, MD5C16, MD5S12); + MD5_STEP0(MD5_Go, b, c, d, a, MD5C17, MD5S13); + MD5_STEP0(MD5_Go, a, b, c, d, MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, r_14, MD5C19, MD5S11); + MD5_STEP0(MD5_Go, c, d, a, b, MD5C1a, MD5S12); + MD5_STEP0(MD5_Go, b, c, d, a, MD5C1b, MD5S13); + MD5_STEP0(MD5_Go, a, b, c, d, MD5C1c, MD5S10); + MD5_STEP0(MD5_Go, d, a, b, c, MD5C1d, MD5S11); + MD5_STEP0(MD5_Go, c, d, a, b, MD5C1e, MD5S12); + MD5_STEP0(MD5_Go, b, c, d, a, MD5C1f, MD5S13); + + MD5_STEP0(MD5_H , a, b, c, d, MD5C20, MD5S20); + MD5_STEP0(MD5_H , d, a, b, c, MD5C21, MD5S21); + MD5_STEP0(MD5_H , c, d, a, b, MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, r_14, MD5C23, MD5S23); + MD5_STEP0(MD5_H , a, b, c, d, MD5C24, MD5S20); + MD5_STEP0(MD5_H , d, a, b, c, MD5C25, MD5S21); + MD5_STEP0(MD5_H , c, d, a, b, MD5C26, MD5S22); + MD5_STEP0(MD5_H , b, c, d, a, MD5C27, MD5S23); + MD5_STEP0(MD5_H , a, b, c, d, MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, r_00, MD5C29, MD5S21); + MD5_STEP0(MD5_H , c, d, a, b, MD5C2a, MD5S22); + MD5_STEP0(MD5_H , b, c, d, a, MD5C2b, MD5S23); + MD5_STEP0(MD5_H , a, b, c, d, MD5C2c, MD5S20); + MD5_STEP0(MD5_H , d, a, b, c, MD5C2d, MD5S21); + MD5_STEP0(MD5_H , c, d, a, b, MD5C2e, MD5S22); + MD5_STEP0(MD5_H , b, c, d, a, MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, r_00, MD5C30, MD5S30); + MD5_STEP0(MD5_I , d, a, b, c, MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, r_14, MD5C32, MD5S32); + MD5_STEP0(MD5_I , b, c, d, a, MD5C33, MD5S33); + MD5_STEP0(MD5_I , a, b, c, d, MD5C34, MD5S30); + MD5_STEP0(MD5_I , d, a, b, c, MD5C35, MD5S31); + MD5_STEP0(MD5_I , c, d, a, b, MD5C36, MD5S32); + MD5_STEP0(MD5_I , b, c, d, a, MD5C37, MD5S33); + MD5_STEP0(MD5_I , a, b, c, d, MD5C38, MD5S30); + MD5_STEP0(MD5_I , d, a, b, c, MD5C39, MD5S31); + MD5_STEP0(MD5_I , c, d, a, b, MD5C3a, MD5S32); + MD5_STEP0(MD5_I , b, c, d, a, MD5C3b, MD5S33); + MD5_STEP0(MD5_I , a, b, c, d, MD5C3c, MD5S30); + MD5_STEP0(MD5_I , d, a, b, c, MD5C3d, MD5S31); + MD5_STEP0(MD5_I , c, d, a, b, MD5C3e, MD5S32); + MD5_STEP0(MD5_I , b, c, d, a, MD5C3f, MD5S33); + + a += r_a; + b += r_b; + c += r_c; + d += r_d; + + const u32x r0 = a; + const u32x r1 = d; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_M + } +} + +static void m02810s (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], const u32 pw_len, __global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, __local u32 l_bin2asc[256]) +{ + /** + * modifier + */ + + const u32 gid = get_global_id (0); + const u32 lid = get_local_id (0); + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * salt + */ + + u32 s[8]; + + s[0] = salt_bufs[salt_pos].salt_buf_pc[0]; + s[1] = salt_bufs[salt_pos].salt_buf_pc[1]; + s[2] = salt_bufs[salt_pos].salt_buf_pc[2]; + s[3] = salt_bufs[salt_pos].salt_buf_pc[3]; + s[4] = salt_bufs[salt_pos].salt_buf_pc[4]; + s[5] = salt_bufs[salt_pos].salt_buf_pc[5]; + s[6] = salt_bufs[salt_pos].salt_buf_pc[6]; + s[7] = salt_bufs[salt_pos].salt_buf_pc[7]; + + const u32 r_00 = 0x80; + const u32 r_14 = 64 * 8; + + /** + * loop + */ + + u32x w0l = w0[0]; + + for (u32 il_pos = 0; il_pos < bfs_cnt; il_pos++) + { + const u32 w0r = bfs_buf[il_pos].i; + + w0[0] = w0l | w0r; + + u32x a = MD5M_A; + u32x b = MD5M_B; + u32x c = MD5M_C; + u32x d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H , a, b, c, d, w1[1], MD5C20, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w2[0], MD5C21, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w2[3], MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w3[2], MD5C23, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w0[1], MD5C24, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w1[0], MD5C25, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w1[3], MD5C26, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w2[2], MD5C27, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w3[1], MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w0[0], MD5C29, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w0[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w1[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w2[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w3[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w3[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w0[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1[0], MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w2[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2[1], MD5C3f, MD5S33); + + a += MD5M_A; + b += MD5M_B; + c += MD5M_C; + d += MD5M_D; + + const u32 w0_t = s[0]; + const u32 w1_t = s[1]; + const u32 w2_t = s[2]; + const u32 w3_t = s[3]; + const u32 w4_t = s[4]; + const u32 w5_t = s[5]; + const u32 w6_t = s[6]; + const u32 w7_t = s[7]; + + const u32x w8_t = uint_to_hex_lower8 ((a >> 0) & 255) << 0 + | uint_to_hex_lower8 ((a >> 8) & 255) << 16; + const u32x w9_t = uint_to_hex_lower8 ((a >> 16) & 255) << 0 + | uint_to_hex_lower8 ((a >> 24) & 255) << 16; + const u32x wa_t = uint_to_hex_lower8 ((b >> 0) & 255) << 0 + | uint_to_hex_lower8 ((b >> 8) & 255) << 16; + const u32x wb_t = uint_to_hex_lower8 ((b >> 16) & 255) << 0 + | uint_to_hex_lower8 ((b >> 24) & 255) << 16; + const u32x wc_t = uint_to_hex_lower8 ((c >> 0) & 255) << 0 + | uint_to_hex_lower8 ((c >> 8) & 255) << 16; + const u32x wd_t = uint_to_hex_lower8 ((c >> 16) & 255) << 0 + | uint_to_hex_lower8 ((c >> 24) & 255) << 16; + const u32x we_t = uint_to_hex_lower8 ((d >> 0) & 255) << 0 + | uint_to_hex_lower8 ((d >> 8) & 255) << 16; + const u32x wf_t = uint_to_hex_lower8 ((d >> 16) & 255) << 0 + | uint_to_hex_lower8 ((d >> 24) & 255) << 16; + + a = MD5M_A; + b = MD5M_B; + c = MD5M_C; + d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t, MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t, MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t, MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t, MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w4_t, MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w5_t, MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w6_t, MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w7_t, MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w8_t, MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w9_t, MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, wa_t, MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, wb_t, MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, wc_t, MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, wd_t, MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, we_t, MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, wf_t, MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w1_t, MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w6_t, MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, wb_t, MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t, MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w5_t, MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, wa_t, MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, wf_t, MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w4_t, MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w9_t, MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, we_t, MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t, MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w8_t, MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, wd_t, MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t, MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w7_t, MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, wc_t, MD5C1f, MD5S13); + + MD5_STEP (MD5_H , a, b, c, d, w5_t, MD5C20, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w8_t, MD5C21, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, wb_t, MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, we_t, MD5C23, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w1_t, MD5C24, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w4_t, MD5C25, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w7_t, MD5C26, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, wa_t, MD5C27, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, wd_t, MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w0_t, MD5C29, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w3_t, MD5C2a, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w6_t, MD5C2b, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w9_t, MD5C2c, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, wc_t, MD5C2d, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, wf_t, MD5C2e, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w2_t, MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t, MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w7_t, MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, we_t, MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w5_t, MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, wc_t, MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t, MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, wa_t, MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t, MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w8_t, MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, wf_t, MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w6_t, MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, wd_t, MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w4_t, MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, wb_t, MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t, MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w9_t, MD5C3f, MD5S33); + + const u32x r_a = a + MD5M_A; + const u32x r_b = b + MD5M_B; + const u32x r_c = c + MD5M_C; + const u32x r_d = d + MD5M_D; + + a = r_a; + b = r_b; + c = r_c; + d = r_d; + + MD5_STEP (MD5_Fo, a, b, c, d, r_00, MD5C00, MD5S00); + MD5_STEP0(MD5_Fo, d, a, b, c, MD5C01, MD5S01); + MD5_STEP0(MD5_Fo, c, d, a, b, MD5C02, MD5S02); + MD5_STEP0(MD5_Fo, b, c, d, a, MD5C03, MD5S03); + MD5_STEP0(MD5_Fo, a, b, c, d, MD5C04, MD5S00); + MD5_STEP0(MD5_Fo, d, a, b, c, MD5C05, MD5S01); + MD5_STEP0(MD5_Fo, c, d, a, b, MD5C06, MD5S02); + MD5_STEP0(MD5_Fo, b, c, d, a, MD5C07, MD5S03); + MD5_STEP0(MD5_Fo, a, b, c, d, MD5C08, MD5S00); + MD5_STEP0(MD5_Fo, d, a, b, c, MD5C09, MD5S01); + MD5_STEP0(MD5_Fo, c, d, a, b, MD5C0a, MD5S02); + MD5_STEP0(MD5_Fo, b, c, d, a, MD5C0b, MD5S03); + MD5_STEP0(MD5_Fo, a, b, c, d, MD5C0c, MD5S00); + MD5_STEP0(MD5_Fo, d, a, b, c, MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, r_14, MD5C0e, MD5S02); + MD5_STEP0(MD5_Fo, b, c, d, a, MD5C0f, MD5S03); + + MD5_STEP0(MD5_Go, a, b, c, d, MD5C10, MD5S10); + MD5_STEP0(MD5_Go, d, a, b, c, MD5C11, MD5S11); + MD5_STEP0(MD5_Go, c, d, a, b, MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, r_00, MD5C13, MD5S13); + MD5_STEP0(MD5_Go, a, b, c, d, MD5C14, MD5S10); + MD5_STEP0(MD5_Go, d, a, b, c, MD5C15, MD5S11); + MD5_STEP0(MD5_Go, c, d, a, b, MD5C16, MD5S12); + MD5_STEP0(MD5_Go, b, c, d, a, MD5C17, MD5S13); + MD5_STEP0(MD5_Go, a, b, c, d, MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, r_14, MD5C19, MD5S11); + MD5_STEP0(MD5_Go, c, d, a, b, MD5C1a, MD5S12); + MD5_STEP0(MD5_Go, b, c, d, a, MD5C1b, MD5S13); + MD5_STEP0(MD5_Go, a, b, c, d, MD5C1c, MD5S10); + MD5_STEP0(MD5_Go, d, a, b, c, MD5C1d, MD5S11); + MD5_STEP0(MD5_Go, c, d, a, b, MD5C1e, MD5S12); + MD5_STEP0(MD5_Go, b, c, d, a, MD5C1f, MD5S13); + + MD5_STEP0(MD5_H , a, b, c, d, MD5C20, MD5S20); + MD5_STEP0(MD5_H , d, a, b, c, MD5C21, MD5S21); + MD5_STEP0(MD5_H , c, d, a, b, MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, r_14, MD5C23, MD5S23); + MD5_STEP0(MD5_H , a, b, c, d, MD5C24, MD5S20); + MD5_STEP0(MD5_H , d, a, b, c, MD5C25, MD5S21); + MD5_STEP0(MD5_H , c, d, a, b, MD5C26, MD5S22); + MD5_STEP0(MD5_H , b, c, d, a, MD5C27, MD5S23); + MD5_STEP0(MD5_H , a, b, c, d, MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, r_00, MD5C29, MD5S21); + MD5_STEP0(MD5_H , c, d, a, b, MD5C2a, MD5S22); + MD5_STEP0(MD5_H , b, c, d, a, MD5C2b, MD5S23); + MD5_STEP0(MD5_H , a, b, c, d, MD5C2c, MD5S20); + MD5_STEP0(MD5_H , d, a, b, c, MD5C2d, MD5S21); + MD5_STEP0(MD5_H , c, d, a, b, MD5C2e, MD5S22); + MD5_STEP0(MD5_H , b, c, d, a, MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, r_00, MD5C30, MD5S30); + MD5_STEP0(MD5_I , d, a, b, c, MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, r_14, MD5C32, MD5S32); + MD5_STEP0(MD5_I , b, c, d, a, MD5C33, MD5S33); + MD5_STEP0(MD5_I , a, b, c, d, MD5C34, MD5S30); + MD5_STEP0(MD5_I , d, a, b, c, MD5C35, MD5S31); + MD5_STEP0(MD5_I , c, d, a, b, MD5C36, MD5S32); + MD5_STEP0(MD5_I , b, c, d, a, MD5C37, MD5S33); + MD5_STEP0(MD5_I , a, b, c, d, MD5C38, MD5S30); + MD5_STEP0(MD5_I , d, a, b, c, MD5C39, MD5S31); + MD5_STEP0(MD5_I , c, d, a, b, MD5C3a, MD5S32); + MD5_STEP0(MD5_I , b, c, d, a, MD5C3b, MD5S33); + MD5_STEP0(MD5_I , a, b, c, d, MD5C3c, MD5S30); + + if (allx ((a + r_a) != search[0])) continue; + + MD5_STEP0(MD5_I , d, a, b, c, MD5C3d, MD5S31); + MD5_STEP0(MD5_I , c, d, a, b, MD5C3e, MD5S32); + MD5_STEP0(MD5_I , b, c, d, a, MD5C3f, MD5S33); + + a += r_a; + b += r_b; + c += r_c; + d += r_d; + + const u32x r0 = a; + const u32x r1 = d; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_S + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m02810_m04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = pws[gid].i[14]; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * bin2asc table + */ + + __local u32 l_bin2asc[256]; + + const u32 lid4 = lid * 4; + + const u32 lid40 = lid4 + 0; + const u32 lid41 = lid4 + 1; + const u32 lid42 = lid4 + 2; + const u32 lid43 = lid4 + 3; + + const u32 v400 = (lid40 >> 0) & 15; + const u32 v401 = (lid40 >> 4) & 15; + const u32 v410 = (lid41 >> 0) & 15; + const u32 v411 = (lid41 >> 4) & 15; + const u32 v420 = (lid42 >> 0) & 15; + const u32 v421 = (lid42 >> 4) & 15; + const u32 v430 = (lid43 >> 0) & 15; + const u32 v431 = (lid43 >> 4) & 15; + + l_bin2asc[lid40] = ((v400 < 10) ? '0' + v400 : 'a' - 10 + v400) << 8 + | ((v401 < 10) ? '0' + v401 : 'a' - 10 + v401) << 0; + l_bin2asc[lid41] = ((v410 < 10) ? '0' + v410 : 'a' - 10 + v410) << 8 + | ((v411 < 10) ? '0' + v411 : 'a' - 10 + v411) << 0; + l_bin2asc[lid42] = ((v420 < 10) ? '0' + v420 : 'a' - 10 + v420) << 8 + | ((v421 < 10) ? '0' + v421 : 'a' - 10 + v421) << 0; + l_bin2asc[lid43] = ((v430 < 10) ? '0' + v430 : 'a' - 10 + v430) << 8 + | ((v431 < 10) ? '0' + v431 : 'a' - 10 + v431) << 0; + + barrier (CLK_LOCAL_MEM_FENCE); + + if (gid >= gid_max) return; + + /** + * main + */ + + m02810m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset, l_bin2asc); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m02810_m08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = pws[gid].i[14]; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * bin2asc table + */ + + __local u32 l_bin2asc[256]; + + const u32 lid4 = lid * 4; + + const u32 lid40 = lid4 + 0; + const u32 lid41 = lid4 + 1; + const u32 lid42 = lid4 + 2; + const u32 lid43 = lid4 + 3; + + const u32 v400 = (lid40 >> 0) & 15; + const u32 v401 = (lid40 >> 4) & 15; + const u32 v410 = (lid41 >> 0) & 15; + const u32 v411 = (lid41 >> 4) & 15; + const u32 v420 = (lid42 >> 0) & 15; + const u32 v421 = (lid42 >> 4) & 15; + const u32 v430 = (lid43 >> 0) & 15; + const u32 v431 = (lid43 >> 4) & 15; + + l_bin2asc[lid40] = ((v400 < 10) ? '0' + v400 : 'a' - 10 + v400) << 8 + | ((v401 < 10) ? '0' + v401 : 'a' - 10 + v401) << 0; + l_bin2asc[lid41] = ((v410 < 10) ? '0' + v410 : 'a' - 10 + v410) << 8 + | ((v411 < 10) ? '0' + v411 : 'a' - 10 + v411) << 0; + l_bin2asc[lid42] = ((v420 < 10) ? '0' + v420 : 'a' - 10 + v420) << 8 + | ((v421 < 10) ? '0' + v421 : 'a' - 10 + v421) << 0; + l_bin2asc[lid43] = ((v430 < 10) ? '0' + v430 : 'a' - 10 + v430) << 8 + | ((v431 < 10) ? '0' + v431 : 'a' - 10 + v431) << 0; + + barrier (CLK_LOCAL_MEM_FENCE); + + if (gid >= gid_max) return; + + /** + * main + */ + + m02810m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset, l_bin2asc); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m02810_m16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = pws[gid].i[ 8]; + w2[1] = pws[gid].i[ 9]; + w2[2] = pws[gid].i[10]; + w2[3] = pws[gid].i[11]; + + u32x w3[4]; + + w3[0] = pws[gid].i[12]; + w3[1] = pws[gid].i[13]; + w3[2] = pws[gid].i[14]; + w3[3] = pws[gid].i[15]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * bin2asc table + */ + + __local u32 l_bin2asc[256]; + + const u32 lid4 = lid * 4; + + const u32 lid40 = lid4 + 0; + const u32 lid41 = lid4 + 1; + const u32 lid42 = lid4 + 2; + const u32 lid43 = lid4 + 3; + + const u32 v400 = (lid40 >> 0) & 15; + const u32 v401 = (lid40 >> 4) & 15; + const u32 v410 = (lid41 >> 0) & 15; + const u32 v411 = (lid41 >> 4) & 15; + const u32 v420 = (lid42 >> 0) & 15; + const u32 v421 = (lid42 >> 4) & 15; + const u32 v430 = (lid43 >> 0) & 15; + const u32 v431 = (lid43 >> 4) & 15; + + l_bin2asc[lid40] = ((v400 < 10) ? '0' + v400 : 'a' - 10 + v400) << 8 + | ((v401 < 10) ? '0' + v401 : 'a' - 10 + v401) << 0; + l_bin2asc[lid41] = ((v410 < 10) ? '0' + v410 : 'a' - 10 + v410) << 8 + | ((v411 < 10) ? '0' + v411 : 'a' - 10 + v411) << 0; + l_bin2asc[lid42] = ((v420 < 10) ? '0' + v420 : 'a' - 10 + v420) << 8 + | ((v421 < 10) ? '0' + v421 : 'a' - 10 + v421) << 0; + l_bin2asc[lid43] = ((v430 < 10) ? '0' + v430 : 'a' - 10 + v430) << 8 + | ((v431 < 10) ? '0' + v431 : 'a' - 10 + v431) << 0; + + barrier (CLK_LOCAL_MEM_FENCE); + + if (gid >= gid_max) return; + + /** + * main + */ + + m02810m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset, l_bin2asc); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m02810_s04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = pws[gid].i[14]; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * bin2asc table + */ + + __local u32 l_bin2asc[256]; + + const u32 lid4 = lid * 4; + + const u32 lid40 = lid4 + 0; + const u32 lid41 = lid4 + 1; + const u32 lid42 = lid4 + 2; + const u32 lid43 = lid4 + 3; + + const u32 v400 = (lid40 >> 0) & 15; + const u32 v401 = (lid40 >> 4) & 15; + const u32 v410 = (lid41 >> 0) & 15; + const u32 v411 = (lid41 >> 4) & 15; + const u32 v420 = (lid42 >> 0) & 15; + const u32 v421 = (lid42 >> 4) & 15; + const u32 v430 = (lid43 >> 0) & 15; + const u32 v431 = (lid43 >> 4) & 15; + + l_bin2asc[lid40] = ((v400 < 10) ? '0' + v400 : 'a' - 10 + v400) << 8 + | ((v401 < 10) ? '0' + v401 : 'a' - 10 + v401) << 0; + l_bin2asc[lid41] = ((v410 < 10) ? '0' + v410 : 'a' - 10 + v410) << 8 + | ((v411 < 10) ? '0' + v411 : 'a' - 10 + v411) << 0; + l_bin2asc[lid42] = ((v420 < 10) ? '0' + v420 : 'a' - 10 + v420) << 8 + | ((v421 < 10) ? '0' + v421 : 'a' - 10 + v421) << 0; + l_bin2asc[lid43] = ((v430 < 10) ? '0' + v430 : 'a' - 10 + v430) << 8 + | ((v431 < 10) ? '0' + v431 : 'a' - 10 + v431) << 0; + + barrier (CLK_LOCAL_MEM_FENCE); + + if (gid >= gid_max) return; + + /** + * main + */ + + m02810s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset, l_bin2asc); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m02810_s08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = pws[gid].i[14]; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * bin2asc table + */ + + __local u32 l_bin2asc[256]; + + const u32 lid4 = lid * 4; + + const u32 lid40 = lid4 + 0; + const u32 lid41 = lid4 + 1; + const u32 lid42 = lid4 + 2; + const u32 lid43 = lid4 + 3; + + const u32 v400 = (lid40 >> 0) & 15; + const u32 v401 = (lid40 >> 4) & 15; + const u32 v410 = (lid41 >> 0) & 15; + const u32 v411 = (lid41 >> 4) & 15; + const u32 v420 = (lid42 >> 0) & 15; + const u32 v421 = (lid42 >> 4) & 15; + const u32 v430 = (lid43 >> 0) & 15; + const u32 v431 = (lid43 >> 4) & 15; + + l_bin2asc[lid40] = ((v400 < 10) ? '0' + v400 : 'a' - 10 + v400) << 8 + | ((v401 < 10) ? '0' + v401 : 'a' - 10 + v401) << 0; + l_bin2asc[lid41] = ((v410 < 10) ? '0' + v410 : 'a' - 10 + v410) << 8 + | ((v411 < 10) ? '0' + v411 : 'a' - 10 + v411) << 0; + l_bin2asc[lid42] = ((v420 < 10) ? '0' + v420 : 'a' - 10 + v420) << 8 + | ((v421 < 10) ? '0' + v421 : 'a' - 10 + v421) << 0; + l_bin2asc[lid43] = ((v430 < 10) ? '0' + v430 : 'a' - 10 + v430) << 8 + | ((v431 < 10) ? '0' + v431 : 'a' - 10 + v431) << 0; + + barrier (CLK_LOCAL_MEM_FENCE); + + if (gid >= gid_max) return; + + /** + * main + */ + + m02810s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset, l_bin2asc); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m02810_s16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = pws[gid].i[ 8]; + w2[1] = pws[gid].i[ 9]; + w2[2] = pws[gid].i[10]; + w2[3] = pws[gid].i[11]; + + u32x w3[4]; + + w3[0] = pws[gid].i[12]; + w3[1] = pws[gid].i[13]; + w3[2] = pws[gid].i[14]; + w3[3] = pws[gid].i[15]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * bin2asc table + */ + + __local u32 l_bin2asc[256]; + + const u32 lid4 = lid * 4; + + const u32 lid40 = lid4 + 0; + const u32 lid41 = lid4 + 1; + const u32 lid42 = lid4 + 2; + const u32 lid43 = lid4 + 3; + + const u32 v400 = (lid40 >> 0) & 15; + const u32 v401 = (lid40 >> 4) & 15; + const u32 v410 = (lid41 >> 0) & 15; + const u32 v411 = (lid41 >> 4) & 15; + const u32 v420 = (lid42 >> 0) & 15; + const u32 v421 = (lid42 >> 4) & 15; + const u32 v430 = (lid43 >> 0) & 15; + const u32 v431 = (lid43 >> 4) & 15; + + l_bin2asc[lid40] = ((v400 < 10) ? '0' + v400 : 'a' - 10 + v400) << 8 + | ((v401 < 10) ? '0' + v401 : 'a' - 10 + v401) << 0; + l_bin2asc[lid41] = ((v410 < 10) ? '0' + v410 : 'a' - 10 + v410) << 8 + | ((v411 < 10) ? '0' + v411 : 'a' - 10 + v411) << 0; + l_bin2asc[lid42] = ((v420 < 10) ? '0' + v420 : 'a' - 10 + v420) << 8 + | ((v421 < 10) ? '0' + v421 : 'a' - 10 + v421) << 0; + l_bin2asc[lid43] = ((v430 < 10) ? '0' + v430 : 'a' - 10 + v430) << 8 + | ((v431 < 10) ? '0' + v431 : 'a' - 10 + v431) << 0; + + barrier (CLK_LOCAL_MEM_FENCE); + + if (gid >= gid_max) return; + + /** + * main + */ + + m02810s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset, l_bin2asc); +} diff --git a/amd/m03000_a0.cl b/amd/m03000_a0.cl new file mode 100644 index 0000000000..648128f6ac --- /dev/null +++ b/amd/m03000_a0.cl @@ -0,0 +1,833 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _DES_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW4 +#define VECT_SIZE2 +#endif + +#ifdef VLIW5 +#define VECT_SIZE2 +#endif + +#define DGST_R0 0 +#define DGST_R1 1 +#define DGST_R2 2 +#define DGST_R3 3 + +#include "include/kernel_functions.c" +#include "types_amd.c" +#include "common_amd.c" +#include "include/rp_gpu.h" +#include "rp_amd.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +#define PERM_OP(a,b,tt,n,m) \ +{ \ + tt = a >> n; \ + tt = tt ^ b; \ + tt = tt & m; \ + b = b ^ tt; \ + tt = tt << n; \ + a = a ^ tt; \ +} + +#define HPERM_OP(a,tt,n,m) \ +{ \ + tt = a << (16 + n); \ + tt = tt ^ a; \ + tt = tt & m; \ + a = a ^ tt; \ + tt = tt >> (16 + n); \ + a = a ^ tt; \ +} + +__constant u32 c_SPtrans[8][64] = +{ + /* nibble 0 */ + 0x02080800, 0x00080000, 0x02000002, 0x02080802, + 0x02000000, 0x00080802, 0x00080002, 0x02000002, + 0x00080802, 0x02080800, 0x02080000, 0x00000802, + 0x02000802, 0x02000000, 0x00000000, 0x00080002, + 0x00080000, 0x00000002, 0x02000800, 0x00080800, + 0x02080802, 0x02080000, 0x00000802, 0x02000800, + 0x00000002, 0x00000800, 0x00080800, 0x02080002, + 0x00000800, 0x02000802, 0x02080002, 0x00000000, + 0x00000000, 0x02080802, 0x02000800, 0x00080002, + 0x02080800, 0x00080000, 0x00000802, 0x02000800, + 0x02080002, 0x00000800, 0x00080800, 0x02000002, + 0x00080802, 0x00000002, 0x02000002, 0x02080000, + 0x02080802, 0x00080800, 0x02080000, 0x02000802, + 0x02000000, 0x00000802, 0x00080002, 0x00000000, + 0x00080000, 0x02000000, 0x02000802, 0x02080800, + 0x00000002, 0x02080002, 0x00000800, 0x00080802, + /* nibble 1 */ + 0x40108010, 0x00000000, 0x00108000, 0x40100000, + 0x40000010, 0x00008010, 0x40008000, 0x00108000, + 0x00008000, 0x40100010, 0x00000010, 0x40008000, + 0x00100010, 0x40108000, 0x40100000, 0x00000010, + 0x00100000, 0x40008010, 0x40100010, 0x00008000, + 0x00108010, 0x40000000, 0x00000000, 0x00100010, + 0x40008010, 0x00108010, 0x40108000, 0x40000010, + 0x40000000, 0x00100000, 0x00008010, 0x40108010, + 0x00100010, 0x40108000, 0x40008000, 0x00108010, + 0x40108010, 0x00100010, 0x40000010, 0x00000000, + 0x40000000, 0x00008010, 0x00100000, 0x40100010, + 0x00008000, 0x40000000, 0x00108010, 0x40008010, + 0x40108000, 0x00008000, 0x00000000, 0x40000010, + 0x00000010, 0x40108010, 0x00108000, 0x40100000, + 0x40100010, 0x00100000, 0x00008010, 0x40008000, + 0x40008010, 0x00000010, 0x40100000, 0x00108000, + /* nibble 2 */ + 0x04000001, 0x04040100, 0x00000100, 0x04000101, + 0x00040001, 0x04000000, 0x04000101, 0x00040100, + 0x04000100, 0x00040000, 0x04040000, 0x00000001, + 0x04040101, 0x00000101, 0x00000001, 0x04040001, + 0x00000000, 0x00040001, 0x04040100, 0x00000100, + 0x00000101, 0x04040101, 0x00040000, 0x04000001, + 0x04040001, 0x04000100, 0x00040101, 0x04040000, + 0x00040100, 0x00000000, 0x04000000, 0x00040101, + 0x04040100, 0x00000100, 0x00000001, 0x00040000, + 0x00000101, 0x00040001, 0x04040000, 0x04000101, + 0x00000000, 0x04040100, 0x00040100, 0x04040001, + 0x00040001, 0x04000000, 0x04040101, 0x00000001, + 0x00040101, 0x04000001, 0x04000000, 0x04040101, + 0x00040000, 0x04000100, 0x04000101, 0x00040100, + 0x04000100, 0x00000000, 0x04040001, 0x00000101, + 0x04000001, 0x00040101, 0x00000100, 0x04040000, + /* nibble 3 */ + 0x00401008, 0x10001000, 0x00000008, 0x10401008, + 0x00000000, 0x10400000, 0x10001008, 0x00400008, + 0x10401000, 0x10000008, 0x10000000, 0x00001008, + 0x10000008, 0x00401008, 0x00400000, 0x10000000, + 0x10400008, 0x00401000, 0x00001000, 0x00000008, + 0x00401000, 0x10001008, 0x10400000, 0x00001000, + 0x00001008, 0x00000000, 0x00400008, 0x10401000, + 0x10001000, 0x10400008, 0x10401008, 0x00400000, + 0x10400008, 0x00001008, 0x00400000, 0x10000008, + 0x00401000, 0x10001000, 0x00000008, 0x10400000, + 0x10001008, 0x00000000, 0x00001000, 0x00400008, + 0x00000000, 0x10400008, 0x10401000, 0x00001000, + 0x10000000, 0x10401008, 0x00401008, 0x00400000, + 0x10401008, 0x00000008, 0x10001000, 0x00401008, + 0x00400008, 0x00401000, 0x10400000, 0x10001008, + 0x00001008, 0x10000000, 0x10000008, 0x10401000, + /* nibble 4 */ + 0x08000000, 0x00010000, 0x00000400, 0x08010420, + 0x08010020, 0x08000400, 0x00010420, 0x08010000, + 0x00010000, 0x00000020, 0x08000020, 0x00010400, + 0x08000420, 0x08010020, 0x08010400, 0x00000000, + 0x00010400, 0x08000000, 0x00010020, 0x00000420, + 0x08000400, 0x00010420, 0x00000000, 0x08000020, + 0x00000020, 0x08000420, 0x08010420, 0x00010020, + 0x08010000, 0x00000400, 0x00000420, 0x08010400, + 0x08010400, 0x08000420, 0x00010020, 0x08010000, + 0x00010000, 0x00000020, 0x08000020, 0x08000400, + 0x08000000, 0x00010400, 0x08010420, 0x00000000, + 0x00010420, 0x08000000, 0x00000400, 0x00010020, + 0x08000420, 0x00000400, 0x00000000, 0x08010420, + 0x08010020, 0x08010400, 0x00000420, 0x00010000, + 0x00010400, 0x08010020, 0x08000400, 0x00000420, + 0x00000020, 0x00010420, 0x08010000, 0x08000020, + /* nibble 5 */ + 0x80000040, 0x00200040, 0x00000000, 0x80202000, + 0x00200040, 0x00002000, 0x80002040, 0x00200000, + 0x00002040, 0x80202040, 0x00202000, 0x80000000, + 0x80002000, 0x80000040, 0x80200000, 0x00202040, + 0x00200000, 0x80002040, 0x80200040, 0x00000000, + 0x00002000, 0x00000040, 0x80202000, 0x80200040, + 0x80202040, 0x80200000, 0x80000000, 0x00002040, + 0x00000040, 0x00202000, 0x00202040, 0x80002000, + 0x00002040, 0x80000000, 0x80002000, 0x00202040, + 0x80202000, 0x00200040, 0x00000000, 0x80002000, + 0x80000000, 0x00002000, 0x80200040, 0x00200000, + 0x00200040, 0x80202040, 0x00202000, 0x00000040, + 0x80202040, 0x00202000, 0x00200000, 0x80002040, + 0x80000040, 0x80200000, 0x00202040, 0x00000000, + 0x00002000, 0x80000040, 0x80002040, 0x80202000, + 0x80200000, 0x00002040, 0x00000040, 0x80200040, + /* nibble 6 */ + 0x00004000, 0x00000200, 0x01000200, 0x01000004, + 0x01004204, 0x00004004, 0x00004200, 0x00000000, + 0x01000000, 0x01000204, 0x00000204, 0x01004000, + 0x00000004, 0x01004200, 0x01004000, 0x00000204, + 0x01000204, 0x00004000, 0x00004004, 0x01004204, + 0x00000000, 0x01000200, 0x01000004, 0x00004200, + 0x01004004, 0x00004204, 0x01004200, 0x00000004, + 0x00004204, 0x01004004, 0x00000200, 0x01000000, + 0x00004204, 0x01004000, 0x01004004, 0x00000204, + 0x00004000, 0x00000200, 0x01000000, 0x01004004, + 0x01000204, 0x00004204, 0x00004200, 0x00000000, + 0x00000200, 0x01000004, 0x00000004, 0x01000200, + 0x00000000, 0x01000204, 0x01000200, 0x00004200, + 0x00000204, 0x00004000, 0x01004204, 0x01000000, + 0x01004200, 0x00000004, 0x00004004, 0x01004204, + 0x01000004, 0x01004200, 0x01004000, 0x00004004, + /* nibble 7 */ + 0x20800080, 0x20820000, 0x00020080, 0x00000000, + 0x20020000, 0x00800080, 0x20800000, 0x20820080, + 0x00000080, 0x20000000, 0x00820000, 0x00020080, + 0x00820080, 0x20020080, 0x20000080, 0x20800000, + 0x00020000, 0x00820080, 0x00800080, 0x20020000, + 0x20820080, 0x20000080, 0x00000000, 0x00820000, + 0x20000000, 0x00800000, 0x20020080, 0x20800080, + 0x00800000, 0x00020000, 0x20820000, 0x00000080, + 0x00800000, 0x00020000, 0x20000080, 0x20820080, + 0x00020080, 0x20000000, 0x00000000, 0x00820000, + 0x20800080, 0x20020080, 0x20020000, 0x00800080, + 0x20820000, 0x00000080, 0x00800080, 0x20020000, + 0x20820080, 0x00800000, 0x20800000, 0x20000080, + 0x00820000, 0x00020080, 0x20020080, 0x20800000, + 0x00000080, 0x20820000, 0x00820080, 0x00000000, + 0x20000000, 0x20800080, 0x00020000, 0x00820080, +}; + +__constant u32 c_skb[8][64] = +{ + /* for C bits (numbered as per FIPS 46) 1 2 3 4 5 6 */ + 0x00000000, 0x00000010, 0x20000000, 0x20000010, + 0x00010000, 0x00010010, 0x20010000, 0x20010010, + 0x00000800, 0x00000810, 0x20000800, 0x20000810, + 0x00010800, 0x00010810, 0x20010800, 0x20010810, + 0x00000020, 0x00000030, 0x20000020, 0x20000030, + 0x00010020, 0x00010030, 0x20010020, 0x20010030, + 0x00000820, 0x00000830, 0x20000820, 0x20000830, + 0x00010820, 0x00010830, 0x20010820, 0x20010830, + 0x00080000, 0x00080010, 0x20080000, 0x20080010, + 0x00090000, 0x00090010, 0x20090000, 0x20090010, + 0x00080800, 0x00080810, 0x20080800, 0x20080810, + 0x00090800, 0x00090810, 0x20090800, 0x20090810, + 0x00080020, 0x00080030, 0x20080020, 0x20080030, + 0x00090020, 0x00090030, 0x20090020, 0x20090030, + 0x00080820, 0x00080830, 0x20080820, 0x20080830, + 0x00090820, 0x00090830, 0x20090820, 0x20090830, + /* for C bits (numbered as per FIPS 46) 7 8 10 11 12 13 */ + 0x00000000, 0x02000000, 0x00002000, 0x02002000, + 0x00200000, 0x02200000, 0x00202000, 0x02202000, + 0x00000004, 0x02000004, 0x00002004, 0x02002004, + 0x00200004, 0x02200004, 0x00202004, 0x02202004, + 0x00000400, 0x02000400, 0x00002400, 0x02002400, + 0x00200400, 0x02200400, 0x00202400, 0x02202400, + 0x00000404, 0x02000404, 0x00002404, 0x02002404, + 0x00200404, 0x02200404, 0x00202404, 0x02202404, + 0x10000000, 0x12000000, 0x10002000, 0x12002000, + 0x10200000, 0x12200000, 0x10202000, 0x12202000, + 0x10000004, 0x12000004, 0x10002004, 0x12002004, + 0x10200004, 0x12200004, 0x10202004, 0x12202004, + 0x10000400, 0x12000400, 0x10002400, 0x12002400, + 0x10200400, 0x12200400, 0x10202400, 0x12202400, + 0x10000404, 0x12000404, 0x10002404, 0x12002404, + 0x10200404, 0x12200404, 0x10202404, 0x12202404, + /* for C bits (numbered as per FIPS 46) 14 15 16 17 19 20 */ + 0x00000000, 0x00000001, 0x00040000, 0x00040001, + 0x01000000, 0x01000001, 0x01040000, 0x01040001, + 0x00000002, 0x00000003, 0x00040002, 0x00040003, + 0x01000002, 0x01000003, 0x01040002, 0x01040003, + 0x00000200, 0x00000201, 0x00040200, 0x00040201, + 0x01000200, 0x01000201, 0x01040200, 0x01040201, + 0x00000202, 0x00000203, 0x00040202, 0x00040203, + 0x01000202, 0x01000203, 0x01040202, 0x01040203, + 0x08000000, 0x08000001, 0x08040000, 0x08040001, + 0x09000000, 0x09000001, 0x09040000, 0x09040001, + 0x08000002, 0x08000003, 0x08040002, 0x08040003, + 0x09000002, 0x09000003, 0x09040002, 0x09040003, + 0x08000200, 0x08000201, 0x08040200, 0x08040201, + 0x09000200, 0x09000201, 0x09040200, 0x09040201, + 0x08000202, 0x08000203, 0x08040202, 0x08040203, + 0x09000202, 0x09000203, 0x09040202, 0x09040203, + /* for C bits (numbered as per FIPS 46) 21 23 24 26 27 28 */ + 0x00000000, 0x00100000, 0x00000100, 0x00100100, + 0x00000008, 0x00100008, 0x00000108, 0x00100108, + 0x00001000, 0x00101000, 0x00001100, 0x00101100, + 0x00001008, 0x00101008, 0x00001108, 0x00101108, + 0x04000000, 0x04100000, 0x04000100, 0x04100100, + 0x04000008, 0x04100008, 0x04000108, 0x04100108, + 0x04001000, 0x04101000, 0x04001100, 0x04101100, + 0x04001008, 0x04101008, 0x04001108, 0x04101108, + 0x00020000, 0x00120000, 0x00020100, 0x00120100, + 0x00020008, 0x00120008, 0x00020108, 0x00120108, + 0x00021000, 0x00121000, 0x00021100, 0x00121100, + 0x00021008, 0x00121008, 0x00021108, 0x00121108, + 0x04020000, 0x04120000, 0x04020100, 0x04120100, + 0x04020008, 0x04120008, 0x04020108, 0x04120108, + 0x04021000, 0x04121000, 0x04021100, 0x04121100, + 0x04021008, 0x04121008, 0x04021108, 0x04121108, + /* for D bits (numbered as per FIPS 46) 1 2 3 4 5 6 */ + 0x00000000, 0x10000000, 0x00010000, 0x10010000, + 0x00000004, 0x10000004, 0x00010004, 0x10010004, + 0x20000000, 0x30000000, 0x20010000, 0x30010000, + 0x20000004, 0x30000004, 0x20010004, 0x30010004, + 0x00100000, 0x10100000, 0x00110000, 0x10110000, + 0x00100004, 0x10100004, 0x00110004, 0x10110004, + 0x20100000, 0x30100000, 0x20110000, 0x30110000, + 0x20100004, 0x30100004, 0x20110004, 0x30110004, + 0x00001000, 0x10001000, 0x00011000, 0x10011000, + 0x00001004, 0x10001004, 0x00011004, 0x10011004, + 0x20001000, 0x30001000, 0x20011000, 0x30011000, + 0x20001004, 0x30001004, 0x20011004, 0x30011004, + 0x00101000, 0x10101000, 0x00111000, 0x10111000, + 0x00101004, 0x10101004, 0x00111004, 0x10111004, + 0x20101000, 0x30101000, 0x20111000, 0x30111000, + 0x20101004, 0x30101004, 0x20111004, 0x30111004, + /* for D bits (numbered as per FIPS 46) 8 9 11 12 13 14 */ + 0x00000000, 0x08000000, 0x00000008, 0x08000008, + 0x00000400, 0x08000400, 0x00000408, 0x08000408, + 0x00020000, 0x08020000, 0x00020008, 0x08020008, + 0x00020400, 0x08020400, 0x00020408, 0x08020408, + 0x00000001, 0x08000001, 0x00000009, 0x08000009, + 0x00000401, 0x08000401, 0x00000409, 0x08000409, + 0x00020001, 0x08020001, 0x00020009, 0x08020009, + 0x00020401, 0x08020401, 0x00020409, 0x08020409, + 0x02000000, 0x0A000000, 0x02000008, 0x0A000008, + 0x02000400, 0x0A000400, 0x02000408, 0x0A000408, + 0x02020000, 0x0A020000, 0x02020008, 0x0A020008, + 0x02020400, 0x0A020400, 0x02020408, 0x0A020408, + 0x02000001, 0x0A000001, 0x02000009, 0x0A000009, + 0x02000401, 0x0A000401, 0x02000409, 0x0A000409, + 0x02020001, 0x0A020001, 0x02020009, 0x0A020009, + 0x02020401, 0x0A020401, 0x02020409, 0x0A020409, + /* for D bits (numbered as per FIPS 46) 16 17 18 19 20 21 */ + 0x00000000, 0x00000100, 0x00080000, 0x00080100, + 0x01000000, 0x01000100, 0x01080000, 0x01080100, + 0x00000010, 0x00000110, 0x00080010, 0x00080110, + 0x01000010, 0x01000110, 0x01080010, 0x01080110, + 0x00200000, 0x00200100, 0x00280000, 0x00280100, + 0x01200000, 0x01200100, 0x01280000, 0x01280100, + 0x00200010, 0x00200110, 0x00280010, 0x00280110, + 0x01200010, 0x01200110, 0x01280010, 0x01280110, + 0x00000200, 0x00000300, 0x00080200, 0x00080300, + 0x01000200, 0x01000300, 0x01080200, 0x01080300, + 0x00000210, 0x00000310, 0x00080210, 0x00080310, + 0x01000210, 0x01000310, 0x01080210, 0x01080310, + 0x00200200, 0x00200300, 0x00280200, 0x00280300, + 0x01200200, 0x01200300, 0x01280200, 0x01280300, + 0x00200210, 0x00200310, 0x00280210, 0x00280310, + 0x01200210, 0x01200310, 0x01280210, 0x01280310, + /* for D bits (numbered as per FIPS 46) 22 23 24 25 27 28 */ + 0x00000000, 0x04000000, 0x00040000, 0x04040000, + 0x00000002, 0x04000002, 0x00040002, 0x04040002, + 0x00002000, 0x04002000, 0x00042000, 0x04042000, + 0x00002002, 0x04002002, 0x00042002, 0x04042002, + 0x00000020, 0x04000020, 0x00040020, 0x04040020, + 0x00000022, 0x04000022, 0x00040022, 0x04040022, + 0x00002020, 0x04002020, 0x00042020, 0x04042020, + 0x00002022, 0x04002022, 0x00042022, 0x04042022, + 0x00000800, 0x04000800, 0x00040800, 0x04040800, + 0x00000802, 0x04000802, 0x00040802, 0x04040802, + 0x00002800, 0x04002800, 0x00042800, 0x04042800, + 0x00002802, 0x04002802, 0x00042802, 0x04042802, + 0x00000820, 0x04000820, 0x00040820, 0x04040820, + 0x00000822, 0x04000822, 0x00040822, 0x04040822, + 0x00002820, 0x04002820, 0x00042820, 0x04042820, + 0x00002822, 0x04002822, 0x00042822, 0x04042822 +}; + +__constant u32 shifts3s0[16] = { 1, 1, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 1 }; +__constant u32 shifts3s1[16] = { 27, 27, 26, 26, 26, 26, 26, 26, 27, 26, 26, 26, 26, 26, 26, 27 }; + +#define LM_IV_0_IP_RR3 0x2400b807 +#define LM_IV_1_IP_RR3 0xaa190747 + +#ifdef VECT_SIZE1 +#define BOX(i,n,S) u32x ((S)[(n)][(i)]) +#endif + +#ifdef VECT_SIZE2 +#define BOX(i,n,S) u32x ((S)[(n)][(i).s0], (S)[(n)][(i).s1]) +#endif + +#ifdef VECT_SIZE4 +#define BOX(i,n,S) u32x ((S)[(n)][(i).s0], (S)[(n)][(i).s1], (S)[(n)][(i).s2], (S)[(n)][(i).s3]) +#endif + +static void _des_crypt_encrypt (u32x iv[2], u32x data[2], u32x Kc[16], u32x Kd[16], __local u32 s_SPtrans[8][64]) +{ + u32x r = data[0]; + u32x l = data[1]; + + #pragma unroll 16 + for (u32 i = 0; i < 16; i += 2) + { + u32x u; + u32x t; + + u = Kc[i + 0] ^ rotl32 (r, 30u); + t = Kd[i + 0] ^ rotl32 (r, 26u); + + l = l + ^ BOX (amd_bfe (u, 0, 6), 0, s_SPtrans) + ^ BOX (amd_bfe (u, 8, 6), 2, s_SPtrans) + ^ BOX (amd_bfe (u, 16, 6), 4, s_SPtrans) + ^ BOX (amd_bfe (u, 24, 6), 6, s_SPtrans) + ^ BOX (amd_bfe (t, 0, 6), 1, s_SPtrans) + ^ BOX (amd_bfe (t, 8, 6), 3, s_SPtrans) + ^ BOX (amd_bfe (t, 16, 6), 5, s_SPtrans) + ^ BOX (amd_bfe (t, 24, 6), 7, s_SPtrans); + + u = Kc[i + 1] ^ rotl32 (l, 30u); + t = Kd[i + 1] ^ rotl32 (l, 26u); + + r = r + ^ BOX (amd_bfe (u, 0, 6), 0, s_SPtrans) + ^ BOX (amd_bfe (u, 8, 6), 2, s_SPtrans) + ^ BOX (amd_bfe (u, 16, 6), 4, s_SPtrans) + ^ BOX (amd_bfe (u, 24, 6), 6, s_SPtrans) + ^ BOX (amd_bfe (t, 0, 6), 1, s_SPtrans) + ^ BOX (amd_bfe (t, 8, 6), 3, s_SPtrans) + ^ BOX (amd_bfe (t, 16, 6), 5, s_SPtrans) + ^ BOX (amd_bfe (t, 24, 6), 7, s_SPtrans); + } + + iv[0] = rotl32 (l, 29); + iv[1] = rotl32 (r, 29); +} + +static void _des_crypt_keysetup (u32x c, u32x d, u32x Kc[16], u32x Kd[16], __local u32 s_skb[8][64]) +{ + u32x tt; + + PERM_OP (d, c, tt, 4, 0x0f0f0f0f); + HPERM_OP (c, tt, 2, 0xcccc0000); + HPERM_OP (d, tt, 2, 0xcccc0000); + PERM_OP (d, c, tt, 1, 0x55555555); + PERM_OP (c, d, tt, 8, 0x00ff00ff); + PERM_OP (d, c, tt, 1, 0x55555555); + + d = ((d & 0x000000ff) << 16) + | ((d & 0x0000ff00) << 0) + | ((d & 0x00ff0000) >> 16) + | ((c & 0xf0000000) >> 4); + + c = c & 0x0fffffff; + + #pragma unroll 16 + for (u32 i = 0; i < 16; i++) + { + c = c >> shifts3s0[i] | c << shifts3s1[i]; + d = d >> shifts3s0[i] | d << shifts3s1[i]; + + c = c & 0x0fffffff; + d = d & 0x0fffffff; + + const u32x c00 = (c >> 0) & 0x0000003f; + const u32x c06 = (c >> 6) & 0x00383003; + const u32x c07 = (c >> 7) & 0x0000003c; + const u32x c13 = (c >> 13) & 0x0000060f; + const u32x c20 = (c >> 20) & 0x00000001; + + u32x s = BOX (((c00 >> 0) & 0xff), 0, s_skb) + | BOX (((c06 >> 0) & 0xff) + |((c07 >> 0) & 0xff), 1, s_skb) + | BOX (((c13 >> 0) & 0xff) + |((c06 >> 8) & 0xff), 2, s_skb) + | BOX (((c20 >> 0) & 0xff) + |((c13 >> 8) & 0xff) + |((c06 >> 16) & 0xff), 3, s_skb); + + const u32x d00 = (d >> 0) & 0x00003c3f; + const u32x d07 = (d >> 7) & 0x00003f03; + const u32x d21 = (d >> 21) & 0x0000000f; + const u32x d22 = (d >> 22) & 0x00000030; + + u32x t = BOX (((d00 >> 0) & 0xff), 4, s_skb) + | BOX (((d07 >> 0) & 0xff) + |((d00 >> 8) & 0xff), 5, s_skb) + | BOX (((d07 >> 8) & 0xff), 6, s_skb) + | BOX (((d21 >> 0) & 0xff) + |((d22 >> 0) & 0xff), 7, s_skb); + + Kc[i] = ((t << 16) | (s & 0x0000ffff)); + Kd[i] = ((s >> 16) | (t & 0xffff0000)); + } +} + +static void transform_netntlmv1_key (const u32x w0, const u32x w1, u32x out[2]) +{ + #ifdef VECT_SIZE1 + const uchar4 t0 = as_uchar4 (w0); + const uchar4 t1 = as_uchar4 (w1); + + uchar4 k0; + uchar4 k1; + + k0.s0 = (t0.s0 >> 0); + k0.s1 = (t0.s0 << 7) | (t0.s1 >> 1); + k0.s2 = (t0.s1 << 6) | (t0.s2 >> 2); + k0.s3 = (t0.s2 << 5) | (t0.s3 >> 3); + k1.s0 = (t0.s3 << 4) | (t1.s0 >> 4); + k1.s1 = (t1.s0 << 3) | (t1.s1 >> 5); + k1.s2 = (t1.s1 << 2) | (t1.s2 >> 6); + k1.s3 = (t1.s2 << 1); + + out[0] = as_uint (k0); + out[1] = as_uint (k1); + #endif + + #ifdef VECT_SIZE2 + const uchar8 t0 = as_uchar8 (w0); + const uchar8 t1 = as_uchar8 (w1); + + uchar8 k0; + uchar8 k1; + + k0.s0 = (t0.s0 >> 0); + k0.s1 = (t0.s0 << 7) | (t0.s1 >> 1); + k0.s2 = (t0.s1 << 6) | (t0.s2 >> 2); + k0.s3 = (t0.s2 << 5) | (t0.s3 >> 3); + k1.s0 = (t0.s3 << 4) | (t1.s0 >> 4); + k1.s1 = (t1.s0 << 3) | (t1.s1 >> 5); + k1.s2 = (t1.s1 << 2) | (t1.s2 >> 6); + k1.s3 = (t1.s2 << 1); + + k0.s4 = (t0.s4 >> 0); + k0.s5 = (t0.s4 << 7) | (t0.s5 >> 1); + k0.s6 = (t0.s5 << 6) | (t0.s6 >> 2); + k0.s7 = (t0.s6 << 5) | (t0.s7 >> 3); + k1.s4 = (t0.s7 << 4) | (t1.s4 >> 4); + k1.s5 = (t1.s4 << 3) | (t1.s5 >> 5); + k1.s6 = (t1.s5 << 2) | (t1.s6 >> 6); + k1.s7 = (t1.s6 << 1); + + out[0] = as_uint2 (k0); + out[1] = as_uint2 (k1); + #endif + + #ifdef VECT_SIZE4 + const uchar16 t0 = as_uchar16 (w0); + const uchar16 t1 = as_uchar16 (w1); + + uchar16 k0; + uchar16 k1; + + k0.s0 = (t0.s0 >> 0); + k0.s1 = (t0.s0 << 7) | (t0.s1 >> 1); + k0.s2 = (t0.s1 << 6) | (t0.s2 >> 2); + k0.s3 = (t0.s2 << 5) | (t0.s3 >> 3); + k1.s0 = (t0.s3 << 4) | (t1.s0 >> 4); + k1.s1 = (t1.s0 << 3) | (t1.s1 >> 5); + k1.s2 = (t1.s1 << 2) | (t1.s2 >> 6); + k1.s3 = (t1.s2 << 1); + + k0.s4 = (t0.s4 >> 0); + k0.s5 = (t0.s4 << 7) | (t0.s5 >> 1); + k0.s6 = (t0.s5 << 6) | (t0.s6 >> 2); + k0.s7 = (t0.s6 << 5) | (t0.s7 >> 3); + k1.s4 = (t0.s7 << 4) | (t1.s4 >> 4); + k1.s5 = (t1.s4 << 3) | (t1.s5 >> 5); + k1.s6 = (t1.s5 << 2) | (t1.s6 >> 6); + k1.s7 = (t1.s6 << 1); + + k0.s8 = (t0.s8 >> 0); + k0.s9 = (t0.s8 << 7) | (t0.s9 >> 1); + k0.sa = (t0.s9 << 6) | (t0.sa >> 2); + k0.sb = (t0.sa << 5) | (t0.sb >> 3); + k1.s8 = (t0.sb << 4) | (t1.s8 >> 4); + k1.s9 = (t1.s8 << 3) | (t1.s9 >> 5); + k1.sa = (t1.s9 << 2) | (t1.sa >> 6); + k1.sb = (t1.sa << 1); + + k0.sc = (t0.sc >> 0); + k0.sd = (t0.sc << 7) | (t0.sd >> 1); + k0.se = (t0.sd << 6) | (t0.se >> 2); + k0.sf = (t0.se << 5) | (t0.sf >> 3); + k1.sc = (t0.sf << 4) | (t1.sc >> 4); + k1.sd = (t1.sc << 3) | (t1.sd >> 5); + k1.se = (t1.sd << 2) | (t1.se >> 6); + k1.sf = (t1.se << 1); + + out[0] = as_uint4 (k0); + out[1] = as_uint4 (k1); + #endif +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m03000_m04 (__global pw_t *pws, __global gpu_rule_t * rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + u32x pw_buf[4]; + + pw_buf[0] = pws[gid].i[ 0]; + pw_buf[1] = pws[gid].i[ 1]; + pw_buf[2] = 0; + pw_buf[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * sbox, kbox + */ + + __local u32 s_SPtrans[8][64]; + __local u32 s_skb[8][64]; + + s_SPtrans[0][lid] = c_SPtrans[0][lid]; + s_SPtrans[1][lid] = c_SPtrans[1][lid]; + s_SPtrans[2][lid] = c_SPtrans[2][lid]; + s_SPtrans[3][lid] = c_SPtrans[3][lid]; + s_SPtrans[4][lid] = c_SPtrans[4][lid]; + s_SPtrans[5][lid] = c_SPtrans[5][lid]; + s_SPtrans[6][lid] = c_SPtrans[6][lid]; + s_SPtrans[7][lid] = c_SPtrans[7][lid]; + + s_skb[0][lid] = c_skb[0][lid]; + s_skb[1][lid] = c_skb[1][lid]; + s_skb[2][lid] = c_skb[2][lid]; + s_skb[3][lid] = c_skb[3][lid]; + s_skb[4][lid] = c_skb[4][lid]; + s_skb[5][lid] = c_skb[5][lid]; + s_skb[6][lid] = c_skb[6][lid]; + s_skb[7][lid] = c_skb[7][lid]; + + barrier (CLK_LOCAL_MEM_FENCE); + + if (gid >= gid_max) return; + + /** + * main + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + + w0[0] = pw_buf[0]; + w0[1] = pw_buf[1]; + w0[2] = pw_buf[2]; + w0[3] = pw_buf[3]; + + u32x w1[4]; + + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + u32 out_len = apply_rules (rules_buf[il_pos].cmds, w0, w1, pw_len); + + out_len = (out_len >= 7) ? 7 : out_len; + + u32x key[2]; + + transform_netntlmv1_key (w0[0], w0[1], key); + + const u32x c = key[0]; + const u32x d = key[1]; + + u32x Kc[16]; + u32x Kd[16]; + + _des_crypt_keysetup (c, d, Kc, Kd, s_skb); + + u32x data[2]; + + data[0] = LM_IV_0_IP_RR3; + data[1] = LM_IV_1_IP_RR3; + + u32x iv[2]; + + _des_crypt_encrypt (iv, data, Kc, Kd, s_SPtrans); + + const u32x r0 = iv[0]; + const u32x r1 = iv[1]; + const u32x r2 = 0; + const u32x r3 = 0; + + #include VECT_COMPARE_M + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m03000_m08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m03000_m16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m03000_s04 (__global pw_t *pws, __global gpu_rule_t * rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + u32x pw_buf[4]; + + pw_buf[0] = pws[gid].i[ 0]; + pw_buf[1] = pws[gid].i[ 1]; + pw_buf[2] = 0; + pw_buf[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * sbox, kbox + */ + + __local u32 s_SPtrans[8][64]; + __local u32 s_skb[8][64]; + + s_SPtrans[0][lid] = c_SPtrans[0][lid]; + s_SPtrans[1][lid] = c_SPtrans[1][lid]; + s_SPtrans[2][lid] = c_SPtrans[2][lid]; + s_SPtrans[3][lid] = c_SPtrans[3][lid]; + s_SPtrans[4][lid] = c_SPtrans[4][lid]; + s_SPtrans[5][lid] = c_SPtrans[5][lid]; + s_SPtrans[6][lid] = c_SPtrans[6][lid]; + s_SPtrans[7][lid] = c_SPtrans[7][lid]; + + s_skb[0][lid] = c_skb[0][lid]; + s_skb[1][lid] = c_skb[1][lid]; + s_skb[2][lid] = c_skb[2][lid]; + s_skb[3][lid] = c_skb[3][lid]; + s_skb[4][lid] = c_skb[4][lid]; + s_skb[5][lid] = c_skb[5][lid]; + s_skb[6][lid] = c_skb[6][lid]; + s_skb[7][lid] = c_skb[7][lid]; + + barrier (CLK_LOCAL_MEM_FENCE); + + if (gid >= gid_max) return; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * main + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + + w0[0] = pw_buf[0]; + w0[1] = pw_buf[1]; + w0[2] = pw_buf[2]; + w0[3] = pw_buf[3]; + + u32x w1[4]; + + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + u32 out_len = apply_rules (rules_buf[il_pos].cmds, w0, w1, pw_len); + + out_len = (out_len >= 7) ? 7 : out_len; + + u32x key[2]; + + transform_netntlmv1_key (w0[0], w0[1], key); + + const u32x c = key[0]; + const u32x d = key[1]; + + u32x Kc[16]; + u32x Kd[16]; + + _des_crypt_keysetup (c, d, Kc, Kd, s_skb); + + u32x data[2]; + + data[0] = LM_IV_0_IP_RR3; + data[1] = LM_IV_1_IP_RR3; + + u32x iv[2]; + + _des_crypt_encrypt (iv, data, Kc, Kd, s_SPtrans); + + const u32x r0 = iv[0]; + const u32x r1 = iv[1]; + const u32x r2 = 0; + const u32x r3 = 0; + + #include VECT_COMPARE_S + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m03000_s08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m03000_s16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/amd/m03000_a1.cl b/amd/m03000_a1.cl new file mode 100644 index 0000000000..6873d94157 --- /dev/null +++ b/amd/m03000_a1.cl @@ -0,0 +1,955 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _DES_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW4 +#define VECT_SIZE2 +#endif + +#ifdef VLIW5 +#define VECT_SIZE2 +#endif + +#define DGST_R0 0 +#define DGST_R1 1 +#define DGST_R2 2 +#define DGST_R3 3 + +#include "include/kernel_functions.c" +#include "types_amd.c" +#include "common_amd.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +#define PERM_OP(a,b,tt,n,m) \ +{ \ + tt = a >> n; \ + tt = tt ^ b; \ + tt = tt & m; \ + b = b ^ tt; \ + tt = tt << n; \ + a = a ^ tt; \ +} + +#define HPERM_OP(a,tt,n,m) \ +{ \ + tt = a << (16 + n); \ + tt = tt ^ a; \ + tt = tt & m; \ + a = a ^ tt; \ + tt = tt >> (16 + n); \ + a = a ^ tt; \ +} + +__constant u32 c_SPtrans[8][64] = +{ + /* nibble 0 */ + 0x02080800, 0x00080000, 0x02000002, 0x02080802, + 0x02000000, 0x00080802, 0x00080002, 0x02000002, + 0x00080802, 0x02080800, 0x02080000, 0x00000802, + 0x02000802, 0x02000000, 0x00000000, 0x00080002, + 0x00080000, 0x00000002, 0x02000800, 0x00080800, + 0x02080802, 0x02080000, 0x00000802, 0x02000800, + 0x00000002, 0x00000800, 0x00080800, 0x02080002, + 0x00000800, 0x02000802, 0x02080002, 0x00000000, + 0x00000000, 0x02080802, 0x02000800, 0x00080002, + 0x02080800, 0x00080000, 0x00000802, 0x02000800, + 0x02080002, 0x00000800, 0x00080800, 0x02000002, + 0x00080802, 0x00000002, 0x02000002, 0x02080000, + 0x02080802, 0x00080800, 0x02080000, 0x02000802, + 0x02000000, 0x00000802, 0x00080002, 0x00000000, + 0x00080000, 0x02000000, 0x02000802, 0x02080800, + 0x00000002, 0x02080002, 0x00000800, 0x00080802, + /* nibble 1 */ + 0x40108010, 0x00000000, 0x00108000, 0x40100000, + 0x40000010, 0x00008010, 0x40008000, 0x00108000, + 0x00008000, 0x40100010, 0x00000010, 0x40008000, + 0x00100010, 0x40108000, 0x40100000, 0x00000010, + 0x00100000, 0x40008010, 0x40100010, 0x00008000, + 0x00108010, 0x40000000, 0x00000000, 0x00100010, + 0x40008010, 0x00108010, 0x40108000, 0x40000010, + 0x40000000, 0x00100000, 0x00008010, 0x40108010, + 0x00100010, 0x40108000, 0x40008000, 0x00108010, + 0x40108010, 0x00100010, 0x40000010, 0x00000000, + 0x40000000, 0x00008010, 0x00100000, 0x40100010, + 0x00008000, 0x40000000, 0x00108010, 0x40008010, + 0x40108000, 0x00008000, 0x00000000, 0x40000010, + 0x00000010, 0x40108010, 0x00108000, 0x40100000, + 0x40100010, 0x00100000, 0x00008010, 0x40008000, + 0x40008010, 0x00000010, 0x40100000, 0x00108000, + /* nibble 2 */ + 0x04000001, 0x04040100, 0x00000100, 0x04000101, + 0x00040001, 0x04000000, 0x04000101, 0x00040100, + 0x04000100, 0x00040000, 0x04040000, 0x00000001, + 0x04040101, 0x00000101, 0x00000001, 0x04040001, + 0x00000000, 0x00040001, 0x04040100, 0x00000100, + 0x00000101, 0x04040101, 0x00040000, 0x04000001, + 0x04040001, 0x04000100, 0x00040101, 0x04040000, + 0x00040100, 0x00000000, 0x04000000, 0x00040101, + 0x04040100, 0x00000100, 0x00000001, 0x00040000, + 0x00000101, 0x00040001, 0x04040000, 0x04000101, + 0x00000000, 0x04040100, 0x00040100, 0x04040001, + 0x00040001, 0x04000000, 0x04040101, 0x00000001, + 0x00040101, 0x04000001, 0x04000000, 0x04040101, + 0x00040000, 0x04000100, 0x04000101, 0x00040100, + 0x04000100, 0x00000000, 0x04040001, 0x00000101, + 0x04000001, 0x00040101, 0x00000100, 0x04040000, + /* nibble 3 */ + 0x00401008, 0x10001000, 0x00000008, 0x10401008, + 0x00000000, 0x10400000, 0x10001008, 0x00400008, + 0x10401000, 0x10000008, 0x10000000, 0x00001008, + 0x10000008, 0x00401008, 0x00400000, 0x10000000, + 0x10400008, 0x00401000, 0x00001000, 0x00000008, + 0x00401000, 0x10001008, 0x10400000, 0x00001000, + 0x00001008, 0x00000000, 0x00400008, 0x10401000, + 0x10001000, 0x10400008, 0x10401008, 0x00400000, + 0x10400008, 0x00001008, 0x00400000, 0x10000008, + 0x00401000, 0x10001000, 0x00000008, 0x10400000, + 0x10001008, 0x00000000, 0x00001000, 0x00400008, + 0x00000000, 0x10400008, 0x10401000, 0x00001000, + 0x10000000, 0x10401008, 0x00401008, 0x00400000, + 0x10401008, 0x00000008, 0x10001000, 0x00401008, + 0x00400008, 0x00401000, 0x10400000, 0x10001008, + 0x00001008, 0x10000000, 0x10000008, 0x10401000, + /* nibble 4 */ + 0x08000000, 0x00010000, 0x00000400, 0x08010420, + 0x08010020, 0x08000400, 0x00010420, 0x08010000, + 0x00010000, 0x00000020, 0x08000020, 0x00010400, + 0x08000420, 0x08010020, 0x08010400, 0x00000000, + 0x00010400, 0x08000000, 0x00010020, 0x00000420, + 0x08000400, 0x00010420, 0x00000000, 0x08000020, + 0x00000020, 0x08000420, 0x08010420, 0x00010020, + 0x08010000, 0x00000400, 0x00000420, 0x08010400, + 0x08010400, 0x08000420, 0x00010020, 0x08010000, + 0x00010000, 0x00000020, 0x08000020, 0x08000400, + 0x08000000, 0x00010400, 0x08010420, 0x00000000, + 0x00010420, 0x08000000, 0x00000400, 0x00010020, + 0x08000420, 0x00000400, 0x00000000, 0x08010420, + 0x08010020, 0x08010400, 0x00000420, 0x00010000, + 0x00010400, 0x08010020, 0x08000400, 0x00000420, + 0x00000020, 0x00010420, 0x08010000, 0x08000020, + /* nibble 5 */ + 0x80000040, 0x00200040, 0x00000000, 0x80202000, + 0x00200040, 0x00002000, 0x80002040, 0x00200000, + 0x00002040, 0x80202040, 0x00202000, 0x80000000, + 0x80002000, 0x80000040, 0x80200000, 0x00202040, + 0x00200000, 0x80002040, 0x80200040, 0x00000000, + 0x00002000, 0x00000040, 0x80202000, 0x80200040, + 0x80202040, 0x80200000, 0x80000000, 0x00002040, + 0x00000040, 0x00202000, 0x00202040, 0x80002000, + 0x00002040, 0x80000000, 0x80002000, 0x00202040, + 0x80202000, 0x00200040, 0x00000000, 0x80002000, + 0x80000000, 0x00002000, 0x80200040, 0x00200000, + 0x00200040, 0x80202040, 0x00202000, 0x00000040, + 0x80202040, 0x00202000, 0x00200000, 0x80002040, + 0x80000040, 0x80200000, 0x00202040, 0x00000000, + 0x00002000, 0x80000040, 0x80002040, 0x80202000, + 0x80200000, 0x00002040, 0x00000040, 0x80200040, + /* nibble 6 */ + 0x00004000, 0x00000200, 0x01000200, 0x01000004, + 0x01004204, 0x00004004, 0x00004200, 0x00000000, + 0x01000000, 0x01000204, 0x00000204, 0x01004000, + 0x00000004, 0x01004200, 0x01004000, 0x00000204, + 0x01000204, 0x00004000, 0x00004004, 0x01004204, + 0x00000000, 0x01000200, 0x01000004, 0x00004200, + 0x01004004, 0x00004204, 0x01004200, 0x00000004, + 0x00004204, 0x01004004, 0x00000200, 0x01000000, + 0x00004204, 0x01004000, 0x01004004, 0x00000204, + 0x00004000, 0x00000200, 0x01000000, 0x01004004, + 0x01000204, 0x00004204, 0x00004200, 0x00000000, + 0x00000200, 0x01000004, 0x00000004, 0x01000200, + 0x00000000, 0x01000204, 0x01000200, 0x00004200, + 0x00000204, 0x00004000, 0x01004204, 0x01000000, + 0x01004200, 0x00000004, 0x00004004, 0x01004204, + 0x01000004, 0x01004200, 0x01004000, 0x00004004, + /* nibble 7 */ + 0x20800080, 0x20820000, 0x00020080, 0x00000000, + 0x20020000, 0x00800080, 0x20800000, 0x20820080, + 0x00000080, 0x20000000, 0x00820000, 0x00020080, + 0x00820080, 0x20020080, 0x20000080, 0x20800000, + 0x00020000, 0x00820080, 0x00800080, 0x20020000, + 0x20820080, 0x20000080, 0x00000000, 0x00820000, + 0x20000000, 0x00800000, 0x20020080, 0x20800080, + 0x00800000, 0x00020000, 0x20820000, 0x00000080, + 0x00800000, 0x00020000, 0x20000080, 0x20820080, + 0x00020080, 0x20000000, 0x00000000, 0x00820000, + 0x20800080, 0x20020080, 0x20020000, 0x00800080, + 0x20820000, 0x00000080, 0x00800080, 0x20020000, + 0x20820080, 0x00800000, 0x20800000, 0x20000080, + 0x00820000, 0x00020080, 0x20020080, 0x20800000, + 0x00000080, 0x20820000, 0x00820080, 0x00000000, + 0x20000000, 0x20800080, 0x00020000, 0x00820080, +}; + +__constant u32 c_skb[8][64] = +{ + /* for C bits (numbered as per FIPS 46) 1 2 3 4 5 6 */ + 0x00000000, 0x00000010, 0x20000000, 0x20000010, + 0x00010000, 0x00010010, 0x20010000, 0x20010010, + 0x00000800, 0x00000810, 0x20000800, 0x20000810, + 0x00010800, 0x00010810, 0x20010800, 0x20010810, + 0x00000020, 0x00000030, 0x20000020, 0x20000030, + 0x00010020, 0x00010030, 0x20010020, 0x20010030, + 0x00000820, 0x00000830, 0x20000820, 0x20000830, + 0x00010820, 0x00010830, 0x20010820, 0x20010830, + 0x00080000, 0x00080010, 0x20080000, 0x20080010, + 0x00090000, 0x00090010, 0x20090000, 0x20090010, + 0x00080800, 0x00080810, 0x20080800, 0x20080810, + 0x00090800, 0x00090810, 0x20090800, 0x20090810, + 0x00080020, 0x00080030, 0x20080020, 0x20080030, + 0x00090020, 0x00090030, 0x20090020, 0x20090030, + 0x00080820, 0x00080830, 0x20080820, 0x20080830, + 0x00090820, 0x00090830, 0x20090820, 0x20090830, + /* for C bits (numbered as per FIPS 46) 7 8 10 11 12 13 */ + 0x00000000, 0x02000000, 0x00002000, 0x02002000, + 0x00200000, 0x02200000, 0x00202000, 0x02202000, + 0x00000004, 0x02000004, 0x00002004, 0x02002004, + 0x00200004, 0x02200004, 0x00202004, 0x02202004, + 0x00000400, 0x02000400, 0x00002400, 0x02002400, + 0x00200400, 0x02200400, 0x00202400, 0x02202400, + 0x00000404, 0x02000404, 0x00002404, 0x02002404, + 0x00200404, 0x02200404, 0x00202404, 0x02202404, + 0x10000000, 0x12000000, 0x10002000, 0x12002000, + 0x10200000, 0x12200000, 0x10202000, 0x12202000, + 0x10000004, 0x12000004, 0x10002004, 0x12002004, + 0x10200004, 0x12200004, 0x10202004, 0x12202004, + 0x10000400, 0x12000400, 0x10002400, 0x12002400, + 0x10200400, 0x12200400, 0x10202400, 0x12202400, + 0x10000404, 0x12000404, 0x10002404, 0x12002404, + 0x10200404, 0x12200404, 0x10202404, 0x12202404, + /* for C bits (numbered as per FIPS 46) 14 15 16 17 19 20 */ + 0x00000000, 0x00000001, 0x00040000, 0x00040001, + 0x01000000, 0x01000001, 0x01040000, 0x01040001, + 0x00000002, 0x00000003, 0x00040002, 0x00040003, + 0x01000002, 0x01000003, 0x01040002, 0x01040003, + 0x00000200, 0x00000201, 0x00040200, 0x00040201, + 0x01000200, 0x01000201, 0x01040200, 0x01040201, + 0x00000202, 0x00000203, 0x00040202, 0x00040203, + 0x01000202, 0x01000203, 0x01040202, 0x01040203, + 0x08000000, 0x08000001, 0x08040000, 0x08040001, + 0x09000000, 0x09000001, 0x09040000, 0x09040001, + 0x08000002, 0x08000003, 0x08040002, 0x08040003, + 0x09000002, 0x09000003, 0x09040002, 0x09040003, + 0x08000200, 0x08000201, 0x08040200, 0x08040201, + 0x09000200, 0x09000201, 0x09040200, 0x09040201, + 0x08000202, 0x08000203, 0x08040202, 0x08040203, + 0x09000202, 0x09000203, 0x09040202, 0x09040203, + /* for C bits (numbered as per FIPS 46) 21 23 24 26 27 28 */ + 0x00000000, 0x00100000, 0x00000100, 0x00100100, + 0x00000008, 0x00100008, 0x00000108, 0x00100108, + 0x00001000, 0x00101000, 0x00001100, 0x00101100, + 0x00001008, 0x00101008, 0x00001108, 0x00101108, + 0x04000000, 0x04100000, 0x04000100, 0x04100100, + 0x04000008, 0x04100008, 0x04000108, 0x04100108, + 0x04001000, 0x04101000, 0x04001100, 0x04101100, + 0x04001008, 0x04101008, 0x04001108, 0x04101108, + 0x00020000, 0x00120000, 0x00020100, 0x00120100, + 0x00020008, 0x00120008, 0x00020108, 0x00120108, + 0x00021000, 0x00121000, 0x00021100, 0x00121100, + 0x00021008, 0x00121008, 0x00021108, 0x00121108, + 0x04020000, 0x04120000, 0x04020100, 0x04120100, + 0x04020008, 0x04120008, 0x04020108, 0x04120108, + 0x04021000, 0x04121000, 0x04021100, 0x04121100, + 0x04021008, 0x04121008, 0x04021108, 0x04121108, + /* for D bits (numbered as per FIPS 46) 1 2 3 4 5 6 */ + 0x00000000, 0x10000000, 0x00010000, 0x10010000, + 0x00000004, 0x10000004, 0x00010004, 0x10010004, + 0x20000000, 0x30000000, 0x20010000, 0x30010000, + 0x20000004, 0x30000004, 0x20010004, 0x30010004, + 0x00100000, 0x10100000, 0x00110000, 0x10110000, + 0x00100004, 0x10100004, 0x00110004, 0x10110004, + 0x20100000, 0x30100000, 0x20110000, 0x30110000, + 0x20100004, 0x30100004, 0x20110004, 0x30110004, + 0x00001000, 0x10001000, 0x00011000, 0x10011000, + 0x00001004, 0x10001004, 0x00011004, 0x10011004, + 0x20001000, 0x30001000, 0x20011000, 0x30011000, + 0x20001004, 0x30001004, 0x20011004, 0x30011004, + 0x00101000, 0x10101000, 0x00111000, 0x10111000, + 0x00101004, 0x10101004, 0x00111004, 0x10111004, + 0x20101000, 0x30101000, 0x20111000, 0x30111000, + 0x20101004, 0x30101004, 0x20111004, 0x30111004, + /* for D bits (numbered as per FIPS 46) 8 9 11 12 13 14 */ + 0x00000000, 0x08000000, 0x00000008, 0x08000008, + 0x00000400, 0x08000400, 0x00000408, 0x08000408, + 0x00020000, 0x08020000, 0x00020008, 0x08020008, + 0x00020400, 0x08020400, 0x00020408, 0x08020408, + 0x00000001, 0x08000001, 0x00000009, 0x08000009, + 0x00000401, 0x08000401, 0x00000409, 0x08000409, + 0x00020001, 0x08020001, 0x00020009, 0x08020009, + 0x00020401, 0x08020401, 0x00020409, 0x08020409, + 0x02000000, 0x0A000000, 0x02000008, 0x0A000008, + 0x02000400, 0x0A000400, 0x02000408, 0x0A000408, + 0x02020000, 0x0A020000, 0x02020008, 0x0A020008, + 0x02020400, 0x0A020400, 0x02020408, 0x0A020408, + 0x02000001, 0x0A000001, 0x02000009, 0x0A000009, + 0x02000401, 0x0A000401, 0x02000409, 0x0A000409, + 0x02020001, 0x0A020001, 0x02020009, 0x0A020009, + 0x02020401, 0x0A020401, 0x02020409, 0x0A020409, + /* for D bits (numbered as per FIPS 46) 16 17 18 19 20 21 */ + 0x00000000, 0x00000100, 0x00080000, 0x00080100, + 0x01000000, 0x01000100, 0x01080000, 0x01080100, + 0x00000010, 0x00000110, 0x00080010, 0x00080110, + 0x01000010, 0x01000110, 0x01080010, 0x01080110, + 0x00200000, 0x00200100, 0x00280000, 0x00280100, + 0x01200000, 0x01200100, 0x01280000, 0x01280100, + 0x00200010, 0x00200110, 0x00280010, 0x00280110, + 0x01200010, 0x01200110, 0x01280010, 0x01280110, + 0x00000200, 0x00000300, 0x00080200, 0x00080300, + 0x01000200, 0x01000300, 0x01080200, 0x01080300, + 0x00000210, 0x00000310, 0x00080210, 0x00080310, + 0x01000210, 0x01000310, 0x01080210, 0x01080310, + 0x00200200, 0x00200300, 0x00280200, 0x00280300, + 0x01200200, 0x01200300, 0x01280200, 0x01280300, + 0x00200210, 0x00200310, 0x00280210, 0x00280310, + 0x01200210, 0x01200310, 0x01280210, 0x01280310, + /* for D bits (numbered as per FIPS 46) 22 23 24 25 27 28 */ + 0x00000000, 0x04000000, 0x00040000, 0x04040000, + 0x00000002, 0x04000002, 0x00040002, 0x04040002, + 0x00002000, 0x04002000, 0x00042000, 0x04042000, + 0x00002002, 0x04002002, 0x00042002, 0x04042002, + 0x00000020, 0x04000020, 0x00040020, 0x04040020, + 0x00000022, 0x04000022, 0x00040022, 0x04040022, + 0x00002020, 0x04002020, 0x00042020, 0x04042020, + 0x00002022, 0x04002022, 0x00042022, 0x04042022, + 0x00000800, 0x04000800, 0x00040800, 0x04040800, + 0x00000802, 0x04000802, 0x00040802, 0x04040802, + 0x00002800, 0x04002800, 0x00042800, 0x04042800, + 0x00002802, 0x04002802, 0x00042802, 0x04042802, + 0x00000820, 0x04000820, 0x00040820, 0x04040820, + 0x00000822, 0x04000822, 0x00040822, 0x04040822, + 0x00002820, 0x04002820, 0x00042820, 0x04042820, + 0x00002822, 0x04002822, 0x00042822, 0x04042822 +}; + +__constant u32 shifts3s0[16] = { 1, 1, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 1 }; +__constant u32 shifts3s1[16] = { 27, 27, 26, 26, 26, 26, 26, 26, 27, 26, 26, 26, 26, 26, 26, 27 }; + +#define LM_IV_0_IP_RR3 0x2400b807 +#define LM_IV_1_IP_RR3 0xaa190747 + +#ifdef VECT_SIZE1 +#define BOX(i,n,S) u32x ((S)[(n)][(i)]) +#endif + +#ifdef VECT_SIZE2 +#define BOX(i,n,S) u32x ((S)[(n)][(i).s0], (S)[(n)][(i).s1]) +#endif + +#ifdef VECT_SIZE4 +#define BOX(i,n,S) u32x ((S)[(n)][(i).s0], (S)[(n)][(i).s1], (S)[(n)][(i).s2], (S)[(n)][(i).s3]) +#endif + +static void _des_crypt_encrypt (u32x iv[2], u32x data[2], u32x Kc[16], u32x Kd[16], __local u32 s_SPtrans[8][64]) +{ + u32x r = data[0]; + u32x l = data[1]; + + #pragma unroll 16 + for (u32 i = 0; i < 16; i += 2) + { + u32x u; + u32x t; + + u = Kc[i + 0] ^ rotl32 (r, 30u); + t = Kd[i + 0] ^ rotl32 (r, 26u); + + l = l + ^ BOX (amd_bfe (u, 0, 6), 0, s_SPtrans) + ^ BOX (amd_bfe (u, 8, 6), 2, s_SPtrans) + ^ BOX (amd_bfe (u, 16, 6), 4, s_SPtrans) + ^ BOX (amd_bfe (u, 24, 6), 6, s_SPtrans) + ^ BOX (amd_bfe (t, 0, 6), 1, s_SPtrans) + ^ BOX (amd_bfe (t, 8, 6), 3, s_SPtrans) + ^ BOX (amd_bfe (t, 16, 6), 5, s_SPtrans) + ^ BOX (amd_bfe (t, 24, 6), 7, s_SPtrans); + + u = Kc[i + 1] ^ rotl32 (l, 30u); + t = Kd[i + 1] ^ rotl32 (l, 26u); + + r = r + ^ BOX (amd_bfe (u, 0, 6), 0, s_SPtrans) + ^ BOX (amd_bfe (u, 8, 6), 2, s_SPtrans) + ^ BOX (amd_bfe (u, 16, 6), 4, s_SPtrans) + ^ BOX (amd_bfe (u, 24, 6), 6, s_SPtrans) + ^ BOX (amd_bfe (t, 0, 6), 1, s_SPtrans) + ^ BOX (amd_bfe (t, 8, 6), 3, s_SPtrans) + ^ BOX (amd_bfe (t, 16, 6), 5, s_SPtrans) + ^ BOX (amd_bfe (t, 24, 6), 7, s_SPtrans); + } + + iv[0] = rotl32 (l, 29); + iv[1] = rotl32 (r, 29); +} + +static void _des_crypt_keysetup (u32x c, u32x d, u32x Kc[16], u32x Kd[16], __local u32 s_skb[8][64]) +{ + u32x tt; + + PERM_OP (d, c, tt, 4, 0x0f0f0f0f); + HPERM_OP (c, tt, 2, 0xcccc0000); + HPERM_OP (d, tt, 2, 0xcccc0000); + PERM_OP (d, c, tt, 1, 0x55555555); + PERM_OP (c, d, tt, 8, 0x00ff00ff); + PERM_OP (d, c, tt, 1, 0x55555555); + + d = ((d & 0x000000ff) << 16) + | ((d & 0x0000ff00) << 0) + | ((d & 0x00ff0000) >> 16) + | ((c & 0xf0000000) >> 4); + + c = c & 0x0fffffff; + + #pragma unroll 16 + for (u32 i = 0; i < 16; i++) + { + c = c >> shifts3s0[i] | c << shifts3s1[i]; + d = d >> shifts3s0[i] | d << shifts3s1[i]; + + c = c & 0x0fffffff; + d = d & 0x0fffffff; + + const u32x c00 = (c >> 0) & 0x0000003f; + const u32x c06 = (c >> 6) & 0x00383003; + const u32x c07 = (c >> 7) & 0x0000003c; + const u32x c13 = (c >> 13) & 0x0000060f; + const u32x c20 = (c >> 20) & 0x00000001; + + u32x s = BOX (((c00 >> 0) & 0xff), 0, s_skb) + | BOX (((c06 >> 0) & 0xff) + |((c07 >> 0) & 0xff), 1, s_skb) + | BOX (((c13 >> 0) & 0xff) + |((c06 >> 8) & 0xff), 2, s_skb) + | BOX (((c20 >> 0) & 0xff) + |((c13 >> 8) & 0xff) + |((c06 >> 16) & 0xff), 3, s_skb); + + const u32x d00 = (d >> 0) & 0x00003c3f; + const u32x d07 = (d >> 7) & 0x00003f03; + const u32x d21 = (d >> 21) & 0x0000000f; + const u32x d22 = (d >> 22) & 0x00000030; + + u32x t = BOX (((d00 >> 0) & 0xff), 4, s_skb) + | BOX (((d07 >> 0) & 0xff) + |((d00 >> 8) & 0xff), 5, s_skb) + | BOX (((d07 >> 8) & 0xff), 6, s_skb) + | BOX (((d21 >> 0) & 0xff) + |((d22 >> 0) & 0xff), 7, s_skb); + + Kc[i] = ((t << 16) | (s & 0x0000ffff)); + Kd[i] = ((s >> 16) | (t & 0xffff0000)); + } +} + +static void transform_netntlmv1_key (const u32x w0, const u32x w1, u32x out[2]) +{ + #ifdef VECT_SIZE1 + const uchar4 t0 = as_uchar4 (w0); + const uchar4 t1 = as_uchar4 (w1); + + uchar4 k0; + uchar4 k1; + + k0.s0 = (t0.s0 >> 0); + k0.s1 = (t0.s0 << 7) | (t0.s1 >> 1); + k0.s2 = (t0.s1 << 6) | (t0.s2 >> 2); + k0.s3 = (t0.s2 << 5) | (t0.s3 >> 3); + k1.s0 = (t0.s3 << 4) | (t1.s0 >> 4); + k1.s1 = (t1.s0 << 3) | (t1.s1 >> 5); + k1.s2 = (t1.s1 << 2) | (t1.s2 >> 6); + k1.s3 = (t1.s2 << 1); + + out[0] = as_uint (k0); + out[1] = as_uint (k1); + #endif + + #ifdef VECT_SIZE2 + const uchar8 t0 = as_uchar8 (w0); + const uchar8 t1 = as_uchar8 (w1); + + uchar8 k0; + uchar8 k1; + + k0.s0 = (t0.s0 >> 0); + k0.s1 = (t0.s0 << 7) | (t0.s1 >> 1); + k0.s2 = (t0.s1 << 6) | (t0.s2 >> 2); + k0.s3 = (t0.s2 << 5) | (t0.s3 >> 3); + k1.s0 = (t0.s3 << 4) | (t1.s0 >> 4); + k1.s1 = (t1.s0 << 3) | (t1.s1 >> 5); + k1.s2 = (t1.s1 << 2) | (t1.s2 >> 6); + k1.s3 = (t1.s2 << 1); + + k0.s4 = (t0.s4 >> 0); + k0.s5 = (t0.s4 << 7) | (t0.s5 >> 1); + k0.s6 = (t0.s5 << 6) | (t0.s6 >> 2); + k0.s7 = (t0.s6 << 5) | (t0.s7 >> 3); + k1.s4 = (t0.s7 << 4) | (t1.s4 >> 4); + k1.s5 = (t1.s4 << 3) | (t1.s5 >> 5); + k1.s6 = (t1.s5 << 2) | (t1.s6 >> 6); + k1.s7 = (t1.s6 << 1); + + out[0] = as_uint2 (k0); + out[1] = as_uint2 (k1); + #endif + + #ifdef VECT_SIZE4 + const uchar16 t0 = as_uchar16 (w0); + const uchar16 t1 = as_uchar16 (w1); + + uchar16 k0; + uchar16 k1; + + k0.s0 = (t0.s0 >> 0); + k0.s1 = (t0.s0 << 7) | (t0.s1 >> 1); + k0.s2 = (t0.s1 << 6) | (t0.s2 >> 2); + k0.s3 = (t0.s2 << 5) | (t0.s3 >> 3); + k1.s0 = (t0.s3 << 4) | (t1.s0 >> 4); + k1.s1 = (t1.s0 << 3) | (t1.s1 >> 5); + k1.s2 = (t1.s1 << 2) | (t1.s2 >> 6); + k1.s3 = (t1.s2 << 1); + + k0.s4 = (t0.s4 >> 0); + k0.s5 = (t0.s4 << 7) | (t0.s5 >> 1); + k0.s6 = (t0.s5 << 6) | (t0.s6 >> 2); + k0.s7 = (t0.s6 << 5) | (t0.s7 >> 3); + k1.s4 = (t0.s7 << 4) | (t1.s4 >> 4); + k1.s5 = (t1.s4 << 3) | (t1.s5 >> 5); + k1.s6 = (t1.s5 << 2) | (t1.s6 >> 6); + k1.s7 = (t1.s6 << 1); + + k0.s8 = (t0.s8 >> 0); + k0.s9 = (t0.s8 << 7) | (t0.s9 >> 1); + k0.sa = (t0.s9 << 6) | (t0.sa >> 2); + k0.sb = (t0.sa << 5) | (t0.sb >> 3); + k1.s8 = (t0.sb << 4) | (t1.s8 >> 4); + k1.s9 = (t1.s8 << 3) | (t1.s9 >> 5); + k1.sa = (t1.s9 << 2) | (t1.sa >> 6); + k1.sb = (t1.sa << 1); + + k0.sc = (t0.sc >> 0); + k0.sd = (t0.sc << 7) | (t0.sd >> 1); + k0.se = (t0.sd << 6) | (t0.se >> 2); + k0.sf = (t0.se << 5) | (t0.sf >> 3); + k1.sc = (t0.sf << 4) | (t1.sc >> 4); + k1.sd = (t1.sc << 3) | (t1.sd >> 5); + k1.se = (t1.sd << 2) | (t1.se >> 6); + k1.sf = (t1.se << 1); + + out[0] = as_uint4 (k0); + out[1] = as_uint4 (k1); + #endif +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m03000_m04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = 0; + wordl0[3] = 0; + + u32x wordl1[4]; + + wordl1[0] = 0; + wordl1[1] = 0; + wordl1[2] = 0; + wordl1[3] = 0; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, combs_buf[0].pw_len); + } + + /** + * sbox, kbox + */ + + __local u32 s_SPtrans[8][64]; + + __local u32 s_skb[8][64]; + + s_SPtrans[0][lid] = c_SPtrans[0][lid]; + s_SPtrans[1][lid] = c_SPtrans[1][lid]; + s_SPtrans[2][lid] = c_SPtrans[2][lid]; + s_SPtrans[3][lid] = c_SPtrans[3][lid]; + s_SPtrans[4][lid] = c_SPtrans[4][lid]; + s_SPtrans[5][lid] = c_SPtrans[5][lid]; + s_SPtrans[6][lid] = c_SPtrans[6][lid]; + s_SPtrans[7][lid] = c_SPtrans[7][lid]; + + s_skb[0][lid] = c_skb[0][lid]; + s_skb[1][lid] = c_skb[1][lid]; + s_skb[2][lid] = c_skb[2][lid]; + s_skb[3][lid] = c_skb[3][lid]; + s_skb[4][lid] = c_skb[4][lid]; + s_skb[5][lid] = c_skb[5][lid]; + s_skb[6][lid] = c_skb[6][lid]; + s_skb[7][lid] = c_skb[7][lid]; + + barrier (CLK_LOCAL_MEM_FENCE); + + if (gid >= gid_max) return; + + /** + * main + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = combs_buf[il_pos].pw_len; + + u32 pw_len = pw_l_len + pw_r_len; + + pw_len = (pw_len >= 7) ? 7 : pw_len; + + u32 wordr0[4]; + + wordr0[0] = combs_buf[il_pos].i[0]; + wordr0[1] = combs_buf[il_pos].i[1]; + wordr0[2] = 0; + wordr0[3] = 0; + + u32 wordr1[4]; + + wordr1[0] = 0; + wordr1[1] = 0; + wordr1[2] = 0; + wordr1[3] = 0; + + u32 wordr2[4]; + + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + + u32 wordr3[4]; + + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + u32x w0[4]; + + w0[0] = wordl0[0] | wordr0[0]; + w0[1] = wordl0[1] | wordr0[1]; + w0[2] = 0; + w0[3] = 0; + + u32x w1[4]; + + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + u32x key[2]; + + transform_netntlmv1_key (w0[0], w0[1], key); + + const u32x c = key[0]; + const u32x d = key[1]; + + u32x Kc[16]; + u32x Kd[16]; + + _des_crypt_keysetup (c, d, Kc, Kd, s_skb); + + u32x data[2]; + + data[0] = LM_IV_0_IP_RR3; + data[1] = LM_IV_1_IP_RR3; + + u32x iv[2]; + + _des_crypt_encrypt (iv, data, Kc, Kd, s_SPtrans); + + const u32x r0 = iv[0]; + const u32x r1 = iv[1]; + const u32x r2 = 0; + const u32x r3 = 0; + + #include VECT_COMPARE_M + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m03000_m08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m03000_m16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m03000_s04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = 0; + wordl0[3] = 0; + + u32x wordl1[4]; + + wordl1[0] = 0; + wordl1[1] = 0; + wordl1[2] = 0; + wordl1[3] = 0; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, combs_buf[0].pw_len); + } + + /** + * sbox, kbox + */ + + __local u32 s_SPtrans[8][64]; + + __local u32 s_skb[8][64]; + + s_SPtrans[0][lid] = c_SPtrans[0][lid]; + s_SPtrans[1][lid] = c_SPtrans[1][lid]; + s_SPtrans[2][lid] = c_SPtrans[2][lid]; + s_SPtrans[3][lid] = c_SPtrans[3][lid]; + s_SPtrans[4][lid] = c_SPtrans[4][lid]; + s_SPtrans[5][lid] = c_SPtrans[5][lid]; + s_SPtrans[6][lid] = c_SPtrans[6][lid]; + s_SPtrans[7][lid] = c_SPtrans[7][lid]; + + s_skb[0][lid] = c_skb[0][lid]; + s_skb[1][lid] = c_skb[1][lid]; + s_skb[2][lid] = c_skb[2][lid]; + s_skb[3][lid] = c_skb[3][lid]; + s_skb[4][lid] = c_skb[4][lid]; + s_skb[5][lid] = c_skb[5][lid]; + s_skb[6][lid] = c_skb[6][lid]; + s_skb[7][lid] = c_skb[7][lid]; + + barrier (CLK_LOCAL_MEM_FENCE); + + if (gid >= gid_max) return; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * main + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = combs_buf[il_pos].pw_len; + + u32 pw_len = pw_l_len + pw_r_len; + + pw_len = (pw_len >= 7) ? 7 : pw_len; + + u32 wordr0[4]; + + wordr0[0] = combs_buf[il_pos].i[0]; + wordr0[1] = combs_buf[il_pos].i[1]; + wordr0[2] = 0; + wordr0[3] = 0; + + u32 wordr1[4]; + + wordr1[0] = 0; + wordr1[1] = 0; + wordr1[2] = 0; + wordr1[3] = 0; + + u32 wordr2[4]; + + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + + u32 wordr3[4]; + + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + u32x w0[4]; + + w0[0] = wordl0[0] | wordr0[0]; + w0[1] = wordl0[1] | wordr0[1]; + w0[2] = 0; + w0[3] = 0; + + u32x w1[4]; + + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + u32x key[2]; + + transform_netntlmv1_key (w0[0], w0[1], key); + + const u32x c = key[0]; + const u32x d = key[1]; + + u32x Kc[16]; + u32x Kd[16]; + + _des_crypt_keysetup (c, d, Kc, Kd, s_skb); + + u32x data[2]; + + data[0] = LM_IV_0_IP_RR3; + data[1] = LM_IV_1_IP_RR3; + + u32x iv[2]; + + _des_crypt_encrypt (iv, data, Kc, Kd, s_SPtrans); + + const u32x r0 = iv[0]; + const u32x r1 = iv[1]; + const u32x r2 = 0; + const u32x r3 = 0; + + #include VECT_COMPARE_S + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m03000_s08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m03000_s16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/amd/m03000_a3.cl b/amd/m03000_a3.cl new file mode 100644 index 0000000000..5befb1df6a --- /dev/null +++ b/amd/m03000_a3.cl @@ -0,0 +1,1636 @@ +/** + * Author......: Jens Steube + * License.....: MIT + * NOTE........: sboxes were taken from JtR, license below + */ + +#define _DES_ +#define _SCALAR_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW4 +#define VECT_SIZE1 +#endif + +#ifdef VLIW5 +#define VECT_SIZE1 +#endif + +#define DGST_R0 0 +#define DGST_R1 1 +#define DGST_R2 2 +#define DGST_R3 3 + +#include "include/kernel_functions.c" +#include "types_amd.c" +#include "common_amd.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4_warp_bs.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4_warp_bs.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4_warp_bs.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4_warp_bs.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4_warp_bs.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4_warp_bs.c" +#endif + +#define KXX_DECL + +/* + * Bitslice DES S-boxes making use of a vector conditional select operation + * (e.g., vsel on PowerPC with AltiVec). + * + * Gate counts: 36 33 33 26 35 34 34 32 + * Average: 32.875 + * + * Several same-gate-count expressions for each S-box are included (for use on + * different CPUs/GPUs). + * + * These Boolean expressions corresponding to DES S-boxes have been generated + * by Roman Rusakov for use in Openwall's + * John the Ripper password cracker: http://www.openwall.com/john/ + * Being mathematical formulas, they are not copyrighted and are free for reuse + * by anyone. + * + * This file (a specific representation of the S-box expressions, surrounding + * logic) is Copyright (c) 2011 by Solar Designer . + * Redistribution and use in source and binary forms, with or without + * modification, are permitted. (This is a heavily cut-down "BSD license".) + * + * The effort has been sponsored by Rapid7: http://www.rapid7.com + */ + +#define vnot(dst, a) (dst) = ~(a) +#define vand(dst, a, b) (dst) = (a) & (b) +#define vor(dst, a, b) (dst) = (a) | (b) +#define vandn(dst, a, b) (dst) = (a) & ~(b) +#define vxor(dst, a, b) (dst) = (a) ^ (b) +#define vsel(dst, a, b, c) (dst) = bitselect((a),(b),(c)) + +static void +s1(u32 a1, u32 a2, u32 a3, u32 a4, u32 a5, u32 a6, + u32 * out1, u32 * out2, u32 * out3, u32 * out4) +{ + u32 x0F0F3333, x3C3C3C3C, x55FF55FF, x69C369C3, x0903B73F, x09FCB7C0, + x5CA9E295; + u32 x55AFD1B7, x3C3C69C3, x6993B874; + u32 x5CEDE59F, x09FCE295, x5D91A51E, x529E962D; + u32 x29EEADC0, x4B8771A3, x428679F3, x6B68D433; + u32 x5BA7E193, x026F12F3, x6B27C493, x94D83B6C; + u32 x965E0B0F, x3327A113, x847F0A1F, xD6E19C32; + u32 x0DBCE883, x3A25A215, x37994A96; + u32 x8A487EA7, x8B480F07, xB96C2D16; + u32 x0, x1, x2, x3; + + vsel(x0F0F3333, a3, a2, a5); + vxor(x3C3C3C3C, a2, a3); + vor(x55FF55FF, a1, a4); + vxor(x69C369C3, x3C3C3C3C, x55FF55FF); + vsel(x0903B73F, a5, x0F0F3333, x69C369C3); + vxor(x09FCB7C0, a4, x0903B73F); + vxor(x5CA9E295, a1, x09FCB7C0); + + vsel(x55AFD1B7, x5CA9E295, x55FF55FF, x0F0F3333); + vsel(x3C3C69C3, x3C3C3C3C, x69C369C3, a5); + vxor(x6993B874, x55AFD1B7, x3C3C69C3); + + vsel(x5CEDE59F, x55FF55FF, x5CA9E295, x6993B874); + vsel(x09FCE295, x09FCB7C0, x5CA9E295, a5); + vsel(x5D91A51E, x5CEDE59F, x6993B874, x09FCE295); + vxor(x529E962D, x0F0F3333, x5D91A51E); + + vsel(x29EEADC0, x69C369C3, x09FCB7C0, x5CEDE59F); + vsel(x4B8771A3, x0F0F3333, x69C369C3, x5CA9E295); + vsel(x428679F3, a5, x4B8771A3, x529E962D); + vxor(x6B68D433, x29EEADC0, x428679F3); + + vsel(x5BA7E193, x5CA9E295, x4B8771A3, a3); + vsel(x026F12F3, a4, x0F0F3333, x529E962D); + vsel(x6B27C493, x6B68D433, x5BA7E193, x026F12F3); + vnot(x94D83B6C, x6B27C493); + vsel(x0, x94D83B6C, x6B68D433, a6); + vxor(*out1, *out1, x0); + + vsel(x965E0B0F, x94D83B6C, a3, x428679F3); + vsel(x3327A113, x5BA7E193, a2, x69C369C3); + vsel(x847F0A1F, x965E0B0F, a4, x3327A113); + vxor(xD6E19C32, x529E962D, x847F0A1F); + vsel(x1, xD6E19C32, x5CA9E295, a6); + vxor(*out2, *out2, x1); + + vsel(x0DBCE883, x09FCE295, x3C3C69C3, x847F0A1F); + vsel(x3A25A215, x3327A113, x5CA9E295, x0903B73F); + vxor(x37994A96, x0DBCE883, x3A25A215); + vsel(x3, x37994A96, x529E962D, a6); + vxor(*out4, *out4, x3); + + vxor(x8A487EA7, x5CA9E295, xD6E19C32); + vsel(x8B480F07, a3, x8A487EA7, x847F0A1F); + vsel(xB96C2D16, x8B480F07, x3C3C3C3C, x3A25A215); + vsel(x2, xB96C2D16, x6993B874, a6); + vxor(*out3, *out3, x2); +} + +static void +s2(u32 a1, u32 a2, u32 a3, u32 a4, u32 a5, u32 a6, + u32 * out1, u32 * out2, u32 * out3, u32 * out4) +{ + u32 x55553333, x0055FF33, x33270F03, x66725A56, x00FFFF00, x668DA556; + u32 x0F0F5A56, xF0F0A5A9, xA5A5969A, xA55A699A; + u32 x0F5AF03C, x6600FF56, x87A5F09C; + u32 xA55A963C, x3C69C30F, xB44BC32D; + u32 x66D7CC56, x0F4B0F2D, x699CC37B, x996C66D2; + u32 xB46C662D, x278DB412, xB66CB43B; + u32 xD2DC4E52, x27993333, xD2994E33; + u32 x278D0F2D, x2E0E547B, x09976748; + u32 x0, x1, x2, x3; + + vsel(x55553333, a1, a3, a6); + vsel(x0055FF33, a6, x55553333, a5); + vsel(x33270F03, a3, a4, x0055FF33); + vxor(x66725A56, a1, x33270F03); + vxor(x00FFFF00, a5, a6); + vxor(x668DA556, x66725A56, x00FFFF00); + + vsel(x0F0F5A56, a4, x66725A56, a6); + vnot(xF0F0A5A9, x0F0F5A56); + vxor(xA5A5969A, x55553333, xF0F0A5A9); + vxor(xA55A699A, x00FFFF00, xA5A5969A); + vsel(x1, xA55A699A, x668DA556, a2); + vxor(*out2, *out2, x1); + + vxor(x0F5AF03C, a4, x0055FF33); + vsel(x6600FF56, x66725A56, a6, x00FFFF00); + vsel(x87A5F09C, xA5A5969A, x0F5AF03C, x6600FF56); + + vsel(xA55A963C, xA5A5969A, x0F5AF03C, a5); + vxor(x3C69C30F, a3, x0F5AF03C); + vsel(xB44BC32D, xA55A963C, x3C69C30F, a1); + + vsel(x66D7CC56, x66725A56, x668DA556, xA5A5969A); + vsel(x0F4B0F2D, a4, xB44BC32D, a5); + vxor(x699CC37B, x66D7CC56, x0F4B0F2D); + vxor(x996C66D2, xF0F0A5A9, x699CC37B); + vsel(x0, x996C66D2, xB44BC32D, a2); + vxor(*out1, *out1, x0); + + vsel(xB46C662D, xB44BC32D, x996C66D2, x00FFFF00); + vsel(x278DB412, x668DA556, xA5A5969A, a1); + vsel(xB66CB43B, xB46C662D, x278DB412, x6600FF56); + + vsel(xD2DC4E52, x66D7CC56, x996C66D2, xB44BC32D); + vsel(x27993333, x278DB412, a3, x0055FF33); + vsel(xD2994E33, xD2DC4E52, x27993333, a5); + vsel(x3, x87A5F09C, xD2994E33, a2); + vxor(*out4, *out4, x3); + + vsel(x278D0F2D, x278DB412, x0F4B0F2D, a6); + vsel(x2E0E547B, x0F0F5A56, xB66CB43B, x278D0F2D); + vxor(x09976748, x27993333, x2E0E547B); + vsel(x2, xB66CB43B, x09976748, a2); + vxor(*out3, *out3, x2); +} + +static void +s3(u32 a1, u32 a2, u32 a3, u32 a4, u32 a5, u32 a6, + u32 * out1, u32 * out2, u32 * out3, u32 * out4) +{ + u32 x0F330F33, x0F33F0CC, x5A66A599; + u32 x2111B7BB, x03FF3033, x05BB50EE, x074F201F, x265E97A4; + u32 x556BA09E, x665A93AC, x99A56C53; + u32 x25A1A797, x5713754C, x66559355, x47B135C6; + u32 x9A5A5C60, xD07AF8F8, x87698DB4, xE13C1EE1; + u32 x9E48CDE4, x655B905E, x00A55CFF, x9E49915E; + u32 xD6599874, x05330022, xD2699876; + u32 x665F9364, xD573F0F2, xB32C6396; + u32 x0, x1, x2, x3; + + vsel(x0F330F33, a4, a3, a5); + vxor(x0F33F0CC, a6, x0F330F33); + vxor(x5A66A599, a2, x0F33F0CC); + + vsel(x2111B7BB, a3, a6, x5A66A599); + vsel(x03FF3033, a5, a3, x0F33F0CC); + vsel(x05BB50EE, a5, x0F33F0CC, a2); + vsel(x074F201F, x03FF3033, a4, x05BB50EE); + vxor(x265E97A4, x2111B7BB, x074F201F); + + vsel(x556BA09E, x5A66A599, x05BB50EE, a4); + vsel(x665A93AC, x556BA09E, x265E97A4, a3); + vnot(x99A56C53, x665A93AC); + vsel(x1, x265E97A4, x99A56C53, a1); + vxor(*out2, *out2, x1); + + vxor(x25A1A797, x03FF3033, x265E97A4); + vsel(x5713754C, a2, x0F33F0CC, x074F201F); + vsel(x66559355, x665A93AC, a2, a5); + vsel(x47B135C6, x25A1A797, x5713754C, x66559355); + + vxor(x9A5A5C60, x03FF3033, x99A56C53); + vsel(xD07AF8F8, x9A5A5C60, x556BA09E, x5A66A599); + vxor(x87698DB4, x5713754C, xD07AF8F8); + vxor(xE13C1EE1, x66559355, x87698DB4); + + vsel(x9E48CDE4, x9A5A5C60, x87698DB4, x265E97A4); + vsel(x655B905E, x66559355, x05BB50EE, a4); + vsel(x00A55CFF, a5, a6, x9A5A5C60); + vsel(x9E49915E, x9E48CDE4, x655B905E, x00A55CFF); + vsel(x0, x9E49915E, xE13C1EE1, a1); + vxor(*out1, *out1, x0); + + vsel(xD6599874, xD07AF8F8, x66559355, x0F33F0CC); + vand(x05330022, x0F330F33, x05BB50EE); + vsel(xD2699876, xD6599874, x00A55CFF, x05330022); + vsel(x3, x5A66A599, xD2699876, a1); + vxor(*out4, *out4, x3); + + vsel(x665F9364, x265E97A4, x66559355, x47B135C6); + vsel(xD573F0F2, xD07AF8F8, x05330022, a4); + vxor(xB32C6396, x665F9364, xD573F0F2); + vsel(x2, xB32C6396, x47B135C6, a1); + vxor(*out3, *out3, x2); +} + +static void +s4(u32 a1, u32 a2, u32 a3, u32 a4, u32 a5, u32 a6, + u32 * out1, u32 * out2, u32 * out3, u32 * out4) +{ + u32 x0505AFAF, x0555AF55, x0A5AA05A, x46566456, x0A0A5F5F, x0AF55FA0, + x0AF50F0F, x4CA36B59; + u32 xB35C94A6; + u32 x01BB23BB, x5050FAFA, xA31C26BE, xA91679E1; + u32 x56E9861E; + u32 x50E9FA1E, x0AF55F00, x827D9784, xD2946D9A; + u32 x31F720B3, x11FB21B3, x4712A7AD, x9586CA37; + u32 x0, x1, x2, x3; + + vsel(x0505AFAF, a5, a3, a1); + vsel(x0555AF55, x0505AFAF, a1, a4); + vxor(x0A5AA05A, a3, x0555AF55); + vsel(x46566456, a1, x0A5AA05A, a2); + vsel(x0A0A5F5F, a3, a5, a1); + vxor(x0AF55FA0, a4, x0A0A5F5F); + vsel(x0AF50F0F, x0AF55FA0, a3, a5); + vxor(x4CA36B59, x46566456, x0AF50F0F); + + vnot(xB35C94A6, x4CA36B59); + + vsel(x01BB23BB, a4, a2, x0555AF55); + vxor(x5050FAFA, a1, x0505AFAF); + vsel(xA31C26BE, xB35C94A6, x01BB23BB, x5050FAFA); + vxor(xA91679E1, x0A0A5F5F, xA31C26BE); + + vnot(x56E9861E, xA91679E1); + + vsel(x50E9FA1E, x5050FAFA, x56E9861E, a4); + vsel(x0AF55F00, x0AF50F0F, x0AF55FA0, x0A0A5F5F); + vsel(x827D9784, xB35C94A6, x0AF55F00, a2); + vxor(xD2946D9A, x50E9FA1E, x827D9784); + vsel(x2, xD2946D9A, x4CA36B59, a6); + vxor(*out3, *out3, x2); + vsel(x3, xB35C94A6, xD2946D9A, a6); + vxor(*out4, *out4, x3); + + vsel(x31F720B3, a2, a4, x0AF55FA0); + vsel(x11FB21B3, x01BB23BB, x31F720B3, x5050FAFA); + vxor(x4712A7AD, x56E9861E, x11FB21B3); + vxor(x9586CA37, xD2946D9A, x4712A7AD); + vsel(x0, x56E9861E, x9586CA37, a6); + vxor(*out1, *out1, x0); + vsel(x1, x9586CA37, xA91679E1, a6); + vxor(*out2, *out2, x1); +} + +static void +s5(u32 a1, u32 a2, u32 a3, u32 a4, u32 a5, u32 a6, + u32 * out1, u32 * out2, u32 * out3, u32 * out4) +{ + u32 x550F550F, xAAF0AAF0, xA5F5A5F5, x96C696C6, x00FFFF00, x963969C6; + u32 x2E3C2E3C, xB73121F7, x1501DF0F, x00558A5F, x2E69A463; + u32 x0679ED42, x045157FD, xB32077FF, x9D49D39C; + u32 xAC81CFB2, xF72577AF, x5BA4B81D; + u32 x5BA477AF, x4895469F, x3A35273A, x1A35669A; + u32 x12E6283D, x9E47D3D4, x1A676AB4; + u32 x891556DF, xE5E77F82, x6CF2295D; + u32 x2E3CA5F5, x9697C1C6, x369CC1D6; + u32 x0, x1, x2, x3; + + vsel(x550F550F, a1, a3, a5); + vnot(xAAF0AAF0, x550F550F); + vsel(xA5F5A5F5, xAAF0AAF0, a1, a3); + vxor(x96C696C6, a2, xA5F5A5F5); + vxor(x00FFFF00, a5, a6); + vxor(x963969C6, x96C696C6, x00FFFF00); + + vsel(x2E3C2E3C, a3, xAAF0AAF0, a2); + vsel(xB73121F7, a2, x963969C6, x96C696C6); + vsel(x1501DF0F, a6, x550F550F, xB73121F7); + vsel(x00558A5F, x1501DF0F, a5, a1); + vxor(x2E69A463, x2E3C2E3C, x00558A5F); + + vsel(x0679ED42, x00FFFF00, x2E69A463, x96C696C6); + vsel(x045157FD, a6, a1, x0679ED42); + vsel(xB32077FF, xB73121F7, a6, x045157FD); + vxor(x9D49D39C, x2E69A463, xB32077FF); + vsel(x2, x9D49D39C, x2E69A463, a4); + vxor(*out3, *out3, x2); + + vsel(xAC81CFB2, xAAF0AAF0, x1501DF0F, x0679ED42); + vsel(xF72577AF, xB32077FF, x550F550F, a1); + vxor(x5BA4B81D, xAC81CFB2, xF72577AF); + vsel(x1, x5BA4B81D, x963969C6, a4); + vxor(*out2, *out2, x1); + + vsel(x5BA477AF, x5BA4B81D, xF72577AF, a6); + vsel(x4895469F, x5BA477AF, x00558A5F, a2); + vsel(x3A35273A, x2E3C2E3C, a2, x963969C6); + vsel(x1A35669A, x4895469F, x3A35273A, x5BA4B81D); + + vsel(x12E6283D, a5, x5BA4B81D, x963969C6); + vsel(x9E47D3D4, x96C696C6, x9D49D39C, xAC81CFB2); + vsel(x1A676AB4, x12E6283D, x9E47D3D4, x4895469F); + + vsel(x891556DF, xB32077FF, x4895469F, x3A35273A); + vsel(xE5E77F82, xF72577AF, x00FFFF00, x12E6283D); + vxor(x6CF2295D, x891556DF, xE5E77F82); + vsel(x3, x1A35669A, x6CF2295D, a4); + vxor(*out4, *out4, x3); + + vsel(x2E3CA5F5, x2E3C2E3C, xA5F5A5F5, a6); + vsel(x9697C1C6, x96C696C6, x963969C6, x045157FD); + vsel(x369CC1D6, x2E3CA5F5, x9697C1C6, x5BA477AF); + vsel(x0, x369CC1D6, x1A676AB4, a4); + vxor(*out1, *out1, x0); +} + +static void +s6(u32 a1, u32 a2, u32 a3, u32 a4, u32 a5, u32 a6, + u32 * out1, u32 * out2, u32 * out3, u32 * out4) +{ + u32 x555500FF, x666633CC, x606F30CF, x353A659A, x353A9A65, xCAC5659A; + u32 x353A6565, x0A3F0A6F, x6C5939A3, x5963A3C6; + u32 x35FF659A, x3AF06A95, x05CF0A9F, x16E94A97; + u32 x86CD4C9B, x12E0FFFD, x942D9A67; + u32 x142956AB, x455D45DF, x1C3EE619; + u32 x2AEA70D5, x20CF7A9F, x3CF19C86, x69A49C79; + u32 x840DBB67, x6DA19C1E, x925E63E1; + u32 x9C3CA761, x257A75D5, xB946D2B4; + u32 x0, x1, x2, x3; + + vsel(x555500FF, a1, a4, a5); + vxor(x666633CC, a2, x555500FF); + vsel(x606F30CF, x666633CC, a4, a3); + vxor(x353A659A, a1, x606F30CF); + vxor(x353A9A65, a5, x353A659A); + vnot(xCAC5659A, x353A9A65); + + vsel(x353A6565, x353A659A, x353A9A65, a4); + vsel(x0A3F0A6F, a3, a4, x353A6565); + vxor(x6C5939A3, x666633CC, x0A3F0A6F); + vxor(x5963A3C6, x353A9A65, x6C5939A3); + + vsel(x35FF659A, a4, x353A659A, x353A6565); + vxor(x3AF06A95, a3, x35FF659A); + vsel(x05CF0A9F, a4, a3, x353A9A65); + vsel(x16E94A97, x3AF06A95, x05CF0A9F, x6C5939A3); + + vsel(x86CD4C9B, xCAC5659A, x05CF0A9F, x6C5939A3); + vsel(x12E0FFFD, a5, x3AF06A95, x16E94A97); + vsel(x942D9A67, x86CD4C9B, x353A9A65, x12E0FFFD); + vsel(x0, xCAC5659A, x942D9A67, a6); + vxor(*out1, *out1, x0); + + vsel(x142956AB, x353A659A, x942D9A67, a2); + vsel(x455D45DF, a1, x86CD4C9B, x142956AB); + vxor(x1C3EE619, x5963A3C6, x455D45DF); + vsel(x3, x5963A3C6, x1C3EE619, a6); + vxor(*out4, *out4, x3); + + vsel(x2AEA70D5, x3AF06A95, x606F30CF, x353A9A65); + vsel(x20CF7A9F, x2AEA70D5, x05CF0A9F, x0A3F0A6F); + vxor(x3CF19C86, x1C3EE619, x20CF7A9F); + vxor(x69A49C79, x555500FF, x3CF19C86); + + vsel(x840DBB67, a5, x942D9A67, x86CD4C9B); + vsel(x6DA19C1E, x69A49C79, x3CF19C86, x840DBB67); + vnot(x925E63E1, x6DA19C1E); + vsel(x1, x925E63E1, x69A49C79, a6); + vxor(*out2, *out2, x1); + + vsel(x9C3CA761, x840DBB67, x1C3EE619, x3CF19C86); + vsel(x257A75D5, x455D45DF, x2AEA70D5, x606F30CF); + vxor(xB946D2B4, x9C3CA761, x257A75D5); + vsel(x2, x16E94A97, xB946D2B4, a6); + vxor(*out3, *out3, x2); +} + +static void +s7(u32 a1, u32 a2, u32 a3, u32 a4, u32 a5, u32 a6, + u32 * out1, u32 * out2, u32 * out3, u32 * out4) +{ + u32 x44447777, x4B4B7878, x22772277, x0505F5F5, x220522F5, x694E5A8D; + u32 x00FFFF00, x66666666, x32353235, x26253636, x26DAC936; + u32 x738F9C63, x11EF9867, x26DA9867; + u32 x4B4B9C63, x4B666663, x4E639396; + u32 x4E4B393C, xFF00FF00, xFF05DD21, xB14EE41D; + u32 xD728827B, x6698807B, x699C585B; + u32 x738C847B, xA4A71E18, x74878E78; + u32 x333D9639, x74879639, x8B7869C6; + u32 x0, x1, x2, x3; + + vsel(x44447777, a2, a6, a3); + vxor(x4B4B7878, a4, x44447777); + vsel(x22772277, a3, a5, a2); + vsel(x0505F5F5, a6, a2, a4); + vsel(x220522F5, x22772277, x0505F5F5, a5); + vxor(x694E5A8D, x4B4B7878, x220522F5); + + vxor(x00FFFF00, a5, a6); + vxor(x66666666, a2, a3); + vsel(x32353235, a3, x220522F5, a4); + vsel(x26253636, x66666666, x32353235, x4B4B7878); + vxor(x26DAC936, x00FFFF00, x26253636); + vsel(x0, x26DAC936, x694E5A8D, a1); + vxor(*out1, *out1, x0); + + vxor(x738F9C63, a2, x26DAC936); + vsel(x11EF9867, x738F9C63, a5, x66666666); + vsel(x26DA9867, x26DAC936, x11EF9867, a6); + + vsel(x4B4B9C63, x4B4B7878, x738F9C63, a6); + vsel(x4B666663, x4B4B9C63, x66666666, x00FFFF00); + vxor(x4E639396, x0505F5F5, x4B666663); + + vsel(x4E4B393C, x4B4B7878, x4E639396, a2); + vnot(xFF00FF00, a5); + vsel(xFF05DD21, xFF00FF00, x738F9C63, x32353235); + vxor(xB14EE41D, x4E4B393C, xFF05DD21); + vsel(x1, xB14EE41D, x26DA9867, a1); + vxor(*out2, *out2, x1); + + vxor(xD728827B, x66666666, xB14EE41D); + vsel(x6698807B, x26DA9867, xD728827B, x4E4B393C); + vsel(x699C585B, x6698807B, x694E5A8D, xFF05DD21); + vsel(x2, x699C585B, x4E639396, a1); + vxor(*out3, *out3, x2); + + vsel(x738C847B, x738F9C63, xD728827B, x4B4B7878); + vxor(xA4A71E18, x738F9C63, xD728827B); + vsel(x74878E78, x738C847B, xA4A71E18, a4); + + vsel(x333D9639, x32353235, x738C847B, xB14EE41D); + vsel(x74879639, x74878E78, x333D9639, a6); + vnot(x8B7869C6, x74879639); + vsel(x3, x74878E78, x8B7869C6, a1); + vxor(*out4, *out4, x3); +} + +static void +s8(u32 a1, u32 a2, u32 a3, u32 a4, u32 a5, u32 a6, + u32 * out1, u32 * out2, u32 * out3, u32 * out4) +{ + u32 x0505F5F5, x05FAF50A, x0F0F00FF, x22227777, x07DA807F, x34E9B34C; + u32 x00FFF00F, x0033FCCF, x5565B15C, x0C0C3F3F, x59698E63; + u32 x3001F74E, x30555745, x693CD926; + u32 x0C0CD926, x0C3F25E9, x38D696A5; + u32 xC729695A; + u32 x03D2117B, xC778395B, xCB471CB2; + u32 x5425B13F, x56B3803F, x919AE965; + u32 x17B3023F, x75555755, x62E6556A, xA59E6C31; + u32 x0, x1, x2, x3; + + vsel(x0505F5F5, a5, a1, a3); + vxor(x05FAF50A, a4, x0505F5F5); + vsel(x0F0F00FF, a3, a4, a5); + vsel(x22227777, a2, a5, a1); + vsel(x07DA807F, x05FAF50A, x0F0F00FF, x22227777); + vxor(x34E9B34C, a2, x07DA807F); + + vsel(x00FFF00F, x05FAF50A, a4, a3); + vsel(x0033FCCF, a5, x00FFF00F, a2); + vsel(x5565B15C, a1, x34E9B34C, x0033FCCF); + vsel(x0C0C3F3F, a3, a5, a2); + vxor(x59698E63, x5565B15C, x0C0C3F3F); + + vsel(x3001F74E, x34E9B34C, a5, x05FAF50A); + vsel(x30555745, x3001F74E, a1, x00FFF00F); + vxor(x693CD926, x59698E63, x30555745); + vsel(x2, x693CD926, x59698E63, a6); + vxor(*out3, *out3, x2); + + vsel(x0C0CD926, x0C0C3F3F, x693CD926, a5); + vxor(x0C3F25E9, x0033FCCF, x0C0CD926); + vxor(x38D696A5, x34E9B34C, x0C3F25E9); + + vnot(xC729695A, x38D696A5); + + vsel(x03D2117B, x07DA807F, a2, x0C0CD926); + vsel(xC778395B, xC729695A, x03D2117B, x30555745); + vxor(xCB471CB2, x0C3F25E9, xC778395B); + vsel(x1, xCB471CB2, x34E9B34C, a6); + vxor(*out2, *out2, x1); + + vsel(x5425B13F, x5565B15C, x0C0C3F3F, x03D2117B); + vsel(x56B3803F, x07DA807F, x5425B13F, x59698E63); + vxor(x919AE965, xC729695A, x56B3803F); + vsel(x3, xC729695A, x919AE965, a6); + vxor(*out4, *out4, x3); + + vsel(x17B3023F, x07DA807F, a2, x59698E63); + vor(x75555755, a1, x30555745); + vxor(x62E6556A, x17B3023F, x75555755); + vxor(xA59E6C31, xC778395B, x62E6556A); + vsel(x0, xA59E6C31, x38D696A5, a6); + vxor(*out1, *out1, x0); +} + +#define SWAP(a, b) { u32 tmp=a;a=b;b=tmp; } + +#define DATASWAP \ + SWAP(D00, D32); \ + SWAP(D01, D33); \ + SWAP(D02, D34); \ + SWAP(D03, D35); \ + SWAP(D04, D36); \ + SWAP(D05, D37); \ + SWAP(D06, D38); \ + SWAP(D07, D39); \ + SWAP(D08, D40); \ + SWAP(D09, D41); \ + SWAP(D10, D42); \ + SWAP(D11, D43); \ + SWAP(D12, D44); \ + SWAP(D13, D45); \ + SWAP(D14, D46); \ + SWAP(D15, D47); \ + SWAP(D16, D48); \ + SWAP(D17, D49); \ + SWAP(D18, D50); \ + SWAP(D19, D51); \ + SWAP(D20, D52); \ + SWAP(D21, D53); \ + SWAP(D22, D54); \ + SWAP(D23, D55); \ + SWAP(D24, D56); \ + SWAP(D25, D57); \ + SWAP(D26, D58); \ + SWAP(D27, D59); \ + SWAP(D28, D60); \ + SWAP(D29, D61); \ + SWAP(D30, D62); \ + SWAP(D31, D63); + +#define KEYSET00 { k00 = K08; k01 = K44; k02 = K29; k03 = K52; k04 = K42; k05 = K14; k06 = K28; k07 = K49; k08 = K01; k09 = K07; k10 = K16; k11 = K36; k12 = K02; k13 = K30; k14 = K22; k15 = K21; k16 = K38; k17 = K50; k18 = K51; k19 = K00; k20 = K31; k21 = K23; k22 = K15; k23 = K35; k24 = K19; k25 = K24; k26 = K34; k27 = K47; k28 = K32; k29 = K03; k30 = K41; k31 = K26; k32 = K04; k33 = K46; k34 = K20; k35 = K25; k36 = K53; k37 = K18; k38 = K33; k39 = K55; k40 = K13; k41 = K17; k42 = K39; k43 = K12; k44 = K11; k45 = K54; k46 = K48; k47 = K27; } +#define KEYSET10 { k00 = K49; k01 = K28; k02 = K45; k03 = K36; k04 = K01; k05 = K30; k06 = K44; k07 = K08; k08 = K42; k09 = K23; k10 = K00; k11 = K52; k12 = K43; k13 = K14; k14 = K38; k15 = K37; k16 = K22; k17 = K09; k18 = K35; k19 = K16; k20 = K15; k21 = K07; k22 = K31; k23 = K51; k24 = K03; k25 = K40; k26 = K46; k27 = K04; k28 = K20; k29 = K19; k30 = K53; k31 = K10; k32 = K47; k33 = K34; k34 = K32; k35 = K13; k36 = K41; k37 = K06; k38 = K17; k39 = K12; k40 = K25; k41 = K33; k42 = K27; k43 = K55; k44 = K54; k45 = K11; k46 = K05; k47 = K39; } +#define KEYSET01 { k00 = K01; k01 = K37; k02 = K22; k03 = K45; k04 = K35; k05 = K07; k06 = K21; k07 = K42; k08 = K51; k09 = K00; k10 = K09; k11 = K29; k12 = K52; k13 = K23; k14 = K15; k15 = K14; k16 = K31; k17 = K43; k18 = K44; k19 = K50; k20 = K49; k21 = K16; k22 = K08; k23 = K28; k24 = K12; k25 = K17; k26 = K27; k27 = K40; k28 = K25; k29 = K55; k30 = K34; k31 = K19; k32 = K24; k33 = K39; k34 = K13; k35 = K18; k36 = K46; k37 = K11; k38 = K26; k39 = K48; k40 = K06; k41 = K10; k42 = K32; k43 = K05; k44 = K04; k45 = K47; k46 = K41; k47 = K20; } +#define KEYSET11 { k00 = K35; k01 = K14; k02 = K31; k03 = K22; k04 = K44; k05 = K16; k06 = K30; k07 = K51; k08 = K28; k09 = K09; k10 = K43; k11 = K38; k12 = K29; k13 = K00; k14 = K49; k15 = K23; k16 = K08; k17 = K52; k18 = K21; k19 = K02; k20 = K01; k21 = K50; k22 = K42; k23 = K37; k24 = K48; k25 = K26; k26 = K32; k27 = K17; k28 = K06; k29 = K05; k30 = K39; k31 = K55; k32 = K33; k33 = K20; k34 = K18; k35 = K54; k36 = K27; k37 = K47; k38 = K03; k39 = K53; k40 = K11; k41 = K19; k42 = K13; k43 = K41; k44 = K40; k45 = K24; k46 = K46; k47 = K25; } +#define KEYSET02 { k00 = K44; k01 = K23; k02 = K08; k03 = K31; k04 = K21; k05 = K50; k06 = K07; k07 = K28; k08 = K37; k09 = K43; k10 = K52; k11 = K15; k12 = K38; k13 = K09; k14 = K01; k15 = K00; k16 = K42; k17 = K29; k18 = K30; k19 = K36; k20 = K35; k21 = K02; k22 = K51; k23 = K14; k24 = K53; k25 = K03; k26 = K13; k27 = K26; k28 = K11; k29 = K41; k30 = K20; k31 = K05; k32 = K10; k33 = K25; k34 = K54; k35 = K04; k36 = K32; k37 = K24; k38 = K12; k39 = K34; k40 = K47; k41 = K55; k42 = K18; k43 = K46; k44 = K17; k45 = K33; k46 = K27; k47 = K06; } +#define KEYSET12 { k00 = K21; k01 = K00; k02 = K42; k03 = K08; k04 = K30; k05 = K02; k06 = K16; k07 = K37; k08 = K14; k09 = K52; k10 = K29; k11 = K49; k12 = K15; k13 = K43; k14 = K35; k15 = K09; k16 = K51; k17 = K38; k18 = K07; k19 = K45; k20 = K44; k21 = K36; k22 = K28; k23 = K23; k24 = K34; k25 = K12; k26 = K18; k27 = K03; k28 = K47; k29 = K46; k30 = K25; k31 = K41; k32 = K19; k33 = K06; k34 = K04; k35 = K40; k36 = K13; k37 = K33; k38 = K48; k39 = K39; k40 = K24; k41 = K05; k42 = K54; k43 = K27; k44 = K26; k45 = K10; k46 = K32; k47 = K11; } +#define KEYSET03 { k00 = K30; k01 = K09; k02 = K51; k03 = K42; k04 = K07; k05 = K36; k06 = K50; k07 = K14; k08 = K23; k09 = K29; k10 = K38; k11 = K01; k12 = K49; k13 = K52; k14 = K44; k15 = K43; k16 = K28; k17 = K15; k18 = K16; k19 = K22; k20 = K21; k21 = K45; k22 = K37; k23 = K00; k24 = K39; k25 = K48; k26 = K54; k27 = K12; k28 = K24; k29 = K27; k30 = K06; k31 = K46; k32 = K55; k33 = K11; k34 = K40; k35 = K17; k36 = K18; k37 = K10; k38 = K53; k39 = K20; k40 = K33; k41 = K41; k42 = K04; k43 = K32; k44 = K03; k45 = K19; k46 = K13; k47 = K47; } +#define KEYSET13 { k00 = K07; k01 = K43; k02 = K28; k03 = K51; k04 = K16; k05 = K45; k06 = K02; k07 = K23; k08 = K00; k09 = K38; k10 = K15; k11 = K35; k12 = K01; k13 = K29; k14 = K21; k15 = K52; k16 = K37; k17 = K49; k18 = K50; k19 = K31; k20 = K30; k21 = K22; k22 = K14; k23 = K09; k24 = K20; k25 = K53; k26 = K04; k27 = K48; k28 = K33; k29 = K32; k30 = K11; k31 = K27; k32 = K05; k33 = K47; k34 = K17; k35 = K26; k36 = K54; k37 = K19; k38 = K34; k39 = K25; k40 = K10; k41 = K46; k42 = K40; k43 = K13; k44 = K12; k45 = K55; k46 = K18; k47 = K24; } +#define KEYSET04 { k00 = K16; k01 = K52; k02 = K37; k03 = K28; k04 = K50; k05 = K22; k06 = K36; k07 = K00; k08 = K09; k09 = K15; k10 = K49; k11 = K44; k12 = K35; k13 = K38; k14 = K30; k15 = K29; k16 = K14; k17 = K01; k18 = K02; k19 = K08; k20 = K07; k21 = K31; k22 = K23; k23 = K43; k24 = K25; k25 = K34; k26 = K40; k27 = K53; k28 = K10; k29 = K13; k30 = K47; k31 = K32; k32 = K41; k33 = K24; k34 = K26; k35 = K03; k36 = K04; k37 = K55; k38 = K39; k39 = K06; k40 = K19; k41 = K27; k42 = K17; k43 = K18; k44 = K48; k45 = K05; k46 = K54; k47 = K33; } +#define KEYSET14 { k00 = K50; k01 = K29; k02 = K14; k03 = K37; k04 = K02; k05 = K31; k06 = K45; k07 = K09; k08 = K43; k09 = K49; k10 = K01; k11 = K21; k12 = K44; k13 = K15; k14 = K07; k15 = K38; k16 = K23; k17 = K35; k18 = K36; k19 = K42; k20 = K16; k21 = K08; k22 = K00; k23 = K52; k24 = K06; k25 = K39; k26 = K17; k27 = K34; k28 = K19; k29 = K18; k30 = K24; k31 = K13; k32 = K46; k33 = K33; k34 = K03; k35 = K12; k36 = K40; k37 = K05; k38 = K20; k39 = K11; k40 = K55; k41 = K32; k42 = K26; k43 = K54; k44 = K53; k45 = K41; k46 = K04; k47 = K10; } +#define KEYSET05 { k00 = K02; k01 = K38; k02 = K23; k03 = K14; k04 = K36; k05 = K08; k06 = K22; k07 = K43; k08 = K52; k09 = K01; k10 = K35; k11 = K30; k12 = K21; k13 = K49; k14 = K16; k15 = K15; k16 = K00; k17 = K44; k18 = K45; k19 = K51; k20 = K50; k21 = K42; k22 = K09; k23 = K29; k24 = K11; k25 = K20; k26 = K26; k27 = K39; k28 = K55; k29 = K54; k30 = K33; k31 = K18; k32 = K27; k33 = K10; k34 = K12; k35 = K48; k36 = K17; k37 = K41; k38 = K25; k39 = K47; k40 = K05; k41 = K13; k42 = K03; k43 = K04; k44 = K34; k45 = K46; k46 = K40; k47 = K19; } +#define KEYSET15 { k00 = K36; k01 = K15; k02 = K00; k03 = K23; k04 = K45; k05 = K42; k06 = K31; k07 = K52; k08 = K29; k09 = K35; k10 = K44; k11 = K07; k12 = K30; k13 = K01; k14 = K50; k15 = K49; k16 = K09; k17 = K21; k18 = K22; k19 = K28; k20 = K02; k21 = K51; k22 = K43; k23 = K38; k24 = K47; k25 = K25; k26 = K03; k27 = K20; k28 = K05; k29 = K04; k30 = K10; k31 = K54; k32 = K32; k33 = K19; k34 = K48; k35 = K53; k36 = K26; k37 = K46; k38 = K06; k39 = K24; k40 = K41; k41 = K18; k42 = K12; k43 = K40; k44 = K39; k45 = K27; k46 = K17; k47 = K55; } +#define KEYSET06 { k00 = K45; k01 = K49; k02 = K09; k03 = K00; k04 = K22; k05 = K51; k06 = K08; k07 = K29; k08 = K38; k09 = K44; k10 = K21; k11 = K16; k12 = K07; k13 = K35; k14 = K02; k15 = K01; k16 = K43; k17 = K30; k18 = K31; k19 = K37; k20 = K36; k21 = K28; k22 = K52; k23 = K15; k24 = K24; k25 = K06; k26 = K12; k27 = K25; k28 = K41; k29 = K40; k30 = K19; k31 = K04; k32 = K13; k33 = K55; k34 = K53; k35 = K34; k36 = K03; k37 = K27; k38 = K11; k39 = K33; k40 = K46; k41 = K54; k42 = K48; k43 = K17; k44 = K20; k45 = K32; k46 = K26; k47 = K05; } +#define KEYSET16 { k00 = K22; k01 = K01; k02 = K43; k03 = K09; k04 = K31; k05 = K28; k06 = K42; k07 = K38; k08 = K15; k09 = K21; k10 = K30; k11 = K50; k12 = K16; k13 = K44; k14 = K36; k15 = K35; k16 = K52; k17 = K07; k18 = K08; k19 = K14; k20 = K45; k21 = K37; k22 = K29; k23 = K49; k24 = K33; k25 = K11; k26 = K48; k27 = K06; k28 = K46; k29 = K17; k30 = K55; k31 = K40; k32 = K18; k33 = K05; k34 = K34; k35 = K39; k36 = K12; k37 = K32; k38 = K47; k39 = K10; k40 = K27; k41 = K04; k42 = K53; k43 = K26; k44 = K25; k45 = K13; k46 = K03; k47 = K41; } +#define KEYSET07 { k00 = K31; k01 = K35; k02 = K52; k03 = K43; k04 = K08; k05 = K37; k06 = K51; k07 = K15; k08 = K49; k09 = K30; k10 = K07; k11 = K02; k12 = K50; k13 = K21; k14 = K45; k15 = K44; k16 = K29; k17 = K16; k18 = K42; k19 = K23; k20 = K22; k21 = K14; k22 = K38; k23 = K01; k24 = K10; k25 = K47; k26 = K53; k27 = K11; k28 = K27; k29 = K26; k30 = K05; k31 = K17; k32 = K54; k33 = K41; k34 = K39; k35 = K20; k36 = K48; k37 = K13; k38 = K24; k39 = K19; k40 = K32; k41 = K40; k42 = K34; k43 = K03; k44 = K06; k45 = K18; k46 = K12; k47 = K46; } +#define KEYSET17 { k00 = K15; k01 = K51; k02 = K36; k03 = K02; k04 = K49; k05 = K21; k06 = K35; k07 = K31; k08 = K08; k09 = K14; k10 = K23; k11 = K43; k12 = K09; k13 = K37; k14 = K29; k15 = K28; k16 = K45; k17 = K00; k18 = K01; k19 = K07; k20 = K38; k21 = K30; k22 = K22; k23 = K42; k24 = K26; k25 = K04; k26 = K41; k27 = K54; k28 = K39; k29 = K10; k30 = K48; k31 = K33; k32 = K11; k33 = K53; k34 = K27; k35 = K32; k36 = K05; k37 = K25; k38 = K40; k39 = K03; k40 = K20; k41 = K24; k42 = K46; k43 = K19; k44 = K18; k45 = K06; k46 = K55; k47 = K34; } + +static void DES (const u32 K00, const u32 K01, const u32 K02, const u32 K03, const u32 K04, const u32 K05, const u32 K06, const u32 K07, const u32 K08, const u32 K09, const u32 K10, const u32 K11, const u32 K12, const u32 K13, const u32 K14, const u32 K15, const u32 K16, const u32 K17, const u32 K18, const u32 K19, const u32 K20, const u32 K21, const u32 K22, const u32 K23, const u32 K24, const u32 K25, const u32 K26, const u32 K27, const u32 K28, const u32 K29, const u32 K30, const u32 K31, const u32 K32, const u32 K33, const u32 K34, const u32 K35, const u32 K36, const u32 K37, const u32 K38, const u32 K39, const u32 K40, const u32 K41, const u32 K42, const u32 K43, const u32 K44, const u32 K45, const u32 K46, const u32 K47, const u32 K48, const u32 K49, const u32 K50, const u32 K51, const u32 K52, const u32 K53, const u32 K54, const u32 K55, u32 &D00, u32 &D01, u32 &D02, u32 &D03, u32 &D04, u32 &D05, u32 &D06, u32 &D07, u32 &D08, u32 &D09, u32 &D10, u32 &D11, u32 &D12, u32 &D13, u32 &D14, u32 &D15, u32 &D16, u32 &D17, u32 &D18, u32 &D19, u32 &D20, u32 &D21, u32 &D22, u32 &D23, u32 &D24, u32 &D25, u32 &D26, u32 &D27, u32 &D28, u32 &D29, u32 &D30, u32 &D31, u32 &D32, u32 &D33, u32 &D34, u32 &D35, u32 &D36, u32 &D37, u32 &D38, u32 &D39, u32 &D40, u32 &D41, u32 &D42, u32 &D43, u32 &D44, u32 &D45, u32 &D46, u32 &D47, u32 &D48, u32 &D49, u32 &D50, u32 &D51, u32 &D52, u32 &D53, u32 &D54, u32 &D55, u32 &D56, u32 &D57, u32 &D58, u32 &D59, u32 &D60, u32 &D61, u32 &D62, u32 &D63) +{ + KXX_DECL u32 k00, k01, k02, k03, k04, k05; + KXX_DECL u32 k06, k07, k08, k09, k10, k11; + KXX_DECL u32 k12, k13, k14, k15, k16, k17; + KXX_DECL u32 k18, k19, k20, k21, k22, k23; + KXX_DECL u32 k24, k25, k26, k27, k28, k29; + KXX_DECL u32 k30, k31, k32, k33, k34, k35; + KXX_DECL u32 k36, k37, k38, k39, k40, k41; + KXX_DECL u32 k42, k43, k44, k45, k46, k47; + + #pragma unroll + for (u32 i = 0; i < 16; i++) + { + switch (i) + { + case 0: KEYSET00; break; + case 1: KEYSET01; break; + case 2: KEYSET02; break; + case 3: KEYSET03; break; + case 4: KEYSET04; break; + case 5: KEYSET05; break; + case 6: KEYSET06; break; + case 7: KEYSET07; break; + case 8: KEYSET10; break; + case 9: KEYSET11; break; + case 10: KEYSET12; break; + case 11: KEYSET13; break; + case 12: KEYSET14; break; + case 13: KEYSET15; break; + case 14: KEYSET16; break; + case 15: KEYSET17; break; + } + + s1(D63 ^ k00, D32 ^ k01, D33 ^ k02, D34 ^ k03, D35 ^ k04, D36 ^ k05, &D08, &D16, &D22, &D30); + s2(D35 ^ k06, D36 ^ k07, D37 ^ k08, D38 ^ k09, D39 ^ k10, D40 ^ k11, &D12, &D27, &D01, &D17); + s3(D39 ^ k12, D40 ^ k13, D41 ^ k14, D42 ^ k15, D43 ^ k16, D44 ^ k17, &D23, &D15, &D29, &D05); + s4(D43 ^ k18, D44 ^ k19, D45 ^ k20, D46 ^ k21, D47 ^ k22, D48 ^ k23, &D25, &D19, &D09, &D00); + s5(D47 ^ k24, D48 ^ k25, D49 ^ k26, D50 ^ k27, D51 ^ k28, D52 ^ k29, &D07, &D13, &D24, &D02); + s6(D51 ^ k30, D52 ^ k31, D53 ^ k32, D54 ^ k33, D55 ^ k34, D56 ^ k35, &D03, &D28, &D10, &D18); + s7(D55 ^ k36, D56 ^ k37, D57 ^ k38, D58 ^ k39, D59 ^ k40, D60 ^ k41, &D31, &D11, &D21, &D06); + s8(D59 ^ k42, D60 ^ k43, D61 ^ k44, D62 ^ k45, D63 ^ k46, D32 ^ k47, &D04, &D26, &D14, &D20); + + DATASWAP; + } +} + +static void transpose32c (u32 data[32]) +{ + #define swap(x,y,j,m) \ + t = ((x) ^ ((y) >> (j))) & (m); \ + (x) = (x) ^ t; \ + (y) = (y) ^ (t << (j)); + + u32 t; + + swap (data[ 0], data[16], 16, 0x0000ffff); + swap (data[ 1], data[17], 16, 0x0000ffff); + swap (data[ 2], data[18], 16, 0x0000ffff); + swap (data[ 3], data[19], 16, 0x0000ffff); + swap (data[ 4], data[20], 16, 0x0000ffff); + swap (data[ 5], data[21], 16, 0x0000ffff); + swap (data[ 6], data[22], 16, 0x0000ffff); + swap (data[ 7], data[23], 16, 0x0000ffff); + swap (data[ 8], data[24], 16, 0x0000ffff); + swap (data[ 9], data[25], 16, 0x0000ffff); + swap (data[10], data[26], 16, 0x0000ffff); + swap (data[11], data[27], 16, 0x0000ffff); + swap (data[12], data[28], 16, 0x0000ffff); + swap (data[13], data[29], 16, 0x0000ffff); + swap (data[14], data[30], 16, 0x0000ffff); + swap (data[15], data[31], 16, 0x0000ffff); + swap (data[ 0], data[ 8], 8, 0x00ff00ff); + swap (data[ 1], data[ 9], 8, 0x00ff00ff); + swap (data[ 2], data[10], 8, 0x00ff00ff); + swap (data[ 3], data[11], 8, 0x00ff00ff); + swap (data[ 4], data[12], 8, 0x00ff00ff); + swap (data[ 5], data[13], 8, 0x00ff00ff); + swap (data[ 6], data[14], 8, 0x00ff00ff); + swap (data[ 7], data[15], 8, 0x00ff00ff); + swap (data[ 0], data[ 4], 4, 0x0f0f0f0f); + swap (data[ 1], data[ 5], 4, 0x0f0f0f0f); + swap (data[ 2], data[ 6], 4, 0x0f0f0f0f); + swap (data[ 3], data[ 7], 4, 0x0f0f0f0f); + swap (data[ 0], data[ 2], 2, 0x33333333); + swap (data[ 1], data[ 3], 2, 0x33333333); + swap (data[ 0], data[ 1], 1, 0x55555555); + swap (data[ 2], data[ 3], 1, 0x55555555); + swap (data[ 4], data[ 6], 2, 0x33333333); + swap (data[ 5], data[ 7], 2, 0x33333333); + swap (data[ 4], data[ 5], 1, 0x55555555); + swap (data[ 6], data[ 7], 1, 0x55555555); + swap (data[ 8], data[12], 4, 0x0f0f0f0f); + swap (data[ 9], data[13], 4, 0x0f0f0f0f); + swap (data[10], data[14], 4, 0x0f0f0f0f); + swap (data[11], data[15], 4, 0x0f0f0f0f); + swap (data[ 8], data[10], 2, 0x33333333); + swap (data[ 9], data[11], 2, 0x33333333); + swap (data[ 8], data[ 9], 1, 0x55555555); + swap (data[10], data[11], 1, 0x55555555); + swap (data[12], data[14], 2, 0x33333333); + swap (data[13], data[15], 2, 0x33333333); + swap (data[12], data[13], 1, 0x55555555); + swap (data[14], data[15], 1, 0x55555555); + swap (data[16], data[24], 8, 0x00ff00ff); + swap (data[17], data[25], 8, 0x00ff00ff); + swap (data[18], data[26], 8, 0x00ff00ff); + swap (data[19], data[27], 8, 0x00ff00ff); + swap (data[20], data[28], 8, 0x00ff00ff); + swap (data[21], data[29], 8, 0x00ff00ff); + swap (data[22], data[30], 8, 0x00ff00ff); + swap (data[23], data[31], 8, 0x00ff00ff); + swap (data[16], data[20], 4, 0x0f0f0f0f); + swap (data[17], data[21], 4, 0x0f0f0f0f); + swap (data[18], data[22], 4, 0x0f0f0f0f); + swap (data[19], data[23], 4, 0x0f0f0f0f); + swap (data[16], data[18], 2, 0x33333333); + swap (data[17], data[19], 2, 0x33333333); + swap (data[16], data[17], 1, 0x55555555); + swap (data[18], data[19], 1, 0x55555555); + swap (data[20], data[22], 2, 0x33333333); + swap (data[21], data[23], 2, 0x33333333); + swap (data[20], data[21], 1, 0x55555555); + swap (data[22], data[23], 1, 0x55555555); + swap (data[24], data[28], 4, 0x0f0f0f0f); + swap (data[25], data[29], 4, 0x0f0f0f0f); + swap (data[26], data[30], 4, 0x0f0f0f0f); + swap (data[27], data[31], 4, 0x0f0f0f0f); + swap (data[24], data[26], 2, 0x33333333); + swap (data[25], data[27], 2, 0x33333333); + swap (data[24], data[25], 1, 0x55555555); + swap (data[26], data[27], 1, 0x55555555); + swap (data[28], data[30], 2, 0x33333333); + swap (data[29], data[31], 2, 0x33333333); + swap (data[28], data[29], 1, 0x55555555); + swap (data[30], data[31], 1, 0x55555555); +} + +static void m03000m (__local u32 *s_S, __global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bs_word_t * words_buf_r, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + const u32 lid = get_local_id (0); + + /** + * keys + */ + + const u32 K00 = pws[gid].i[ 0]; + const u32 K01 = pws[gid].i[ 1]; + const u32 K02 = pws[gid].i[ 2]; + const u32 K03 = pws[gid].i[ 3]; + const u32 K04 = pws[gid].i[ 4]; + const u32 K05 = pws[gid].i[ 5]; + const u32 K06 = pws[gid].i[ 6]; + const u32 K07 = pws[gid].i[ 7]; + const u32 K08 = pws[gid].i[ 8]; + const u32 K09 = pws[gid].i[ 9]; + const u32 K10 = pws[gid].i[10]; + const u32 K11 = pws[gid].i[11]; + const u32 K12 = pws[gid].i[12]; + const u32 K13 = pws[gid].i[13]; + const u32 K14 = pws[gid].i[14]; + const u32 K15 = pws[gid].i[15]; + const u32 K16 = pws[gid].i[16]; + const u32 K17 = pws[gid].i[17]; + const u32 K18 = pws[gid].i[18]; + const u32 K19 = pws[gid].i[19]; + const u32 K20 = pws[gid].i[20]; + const u32 K21 = pws[gid].i[21]; + const u32 K22 = pws[gid].i[22]; + const u32 K23 = pws[gid].i[23]; + const u32 K24 = pws[gid].i[24]; + const u32 K25 = pws[gid].i[25]; + const u32 K26 = pws[gid].i[26]; + const u32 K27 = pws[gid].i[27]; + const u32 K28 = pws[gid].i[28]; + const u32 K29 = pws[gid].i[29]; + const u32 K30 = pws[gid].i[30]; + const u32 K31 = pws[gid].i[31]; + const u32 K32 = pws[gid].i[32]; + const u32 K33 = pws[gid].i[33]; + const u32 K34 = pws[gid].i[34]; + const u32 K35 = pws[gid].i[35]; + const u32 K36 = pws[gid].i[36]; + const u32 K37 = pws[gid].i[37]; + const u32 K38 = pws[gid].i[38]; + const u32 K39 = pws[gid].i[39]; + const u32 K40 = pws[gid].i[40]; + const u32 K41 = pws[gid].i[41]; + const u32 K42 = pws[gid].i[42]; + const u32 K43 = pws[gid].i[43]; + const u32 K44 = pws[gid].i[44]; + const u32 K45 = pws[gid].i[45]; + const u32 K46 = pws[gid].i[46]; + const u32 K47 = pws[gid].i[47]; + const u32 K48 = pws[gid].i[48]; + const u32 K49 = pws[gid].i[49]; + const u32 K50 = pws[gid].i[50]; + const u32 K51 = pws[gid].i[51]; + const u32 K52 = pws[gid].i[52]; + const u32 K53 = pws[gid].i[53]; + const u32 K54 = pws[gid].i[54]; + const u32 K55 = pws[gid].i[55]; + + const u32 bf_loops = bfs_cnt; + + const u32 pc_pos = get_local_id (1); + + const u32 il_pos = pc_pos * 32; + + u32 k00 = K00; + u32 k01 = K01; + u32 k02 = K02; + u32 k03 = K03; + u32 k04 = K04; + u32 k05 = K05; + u32 k06 = K06; + u32 k07 = K07; + u32 k08 = K08; + u32 k09 = K09; + u32 k10 = K10; + u32 k11 = K11; + u32 k12 = K12; + u32 k13 = K13; + u32 k14 = K14; + u32 k15 = K15; + u32 k16 = K16; + u32 k17 = K17; + u32 k18 = K18; + u32 k19 = K19; + u32 k20 = K20; + u32 k21 = K21; + u32 k22 = K22; + u32 k23 = K23; + u32 k24 = K24; + u32 k25 = K25; + u32 k26 = K26; + u32 k27 = K27; + u32 k28 = K28; + u32 k29 = K29; + u32 k30 = K30; + u32 k31 = K31; + + k00 |= words_buf_r[pc_pos].b[ 0]; + k01 |= words_buf_r[pc_pos].b[ 1]; + k02 |= words_buf_r[pc_pos].b[ 2]; + k03 |= words_buf_r[pc_pos].b[ 3]; + k04 |= words_buf_r[pc_pos].b[ 4]; + k05 |= words_buf_r[pc_pos].b[ 5]; + k06 |= words_buf_r[pc_pos].b[ 6]; + k07 |= words_buf_r[pc_pos].b[ 7]; + k08 |= words_buf_r[pc_pos].b[ 8]; + k09 |= words_buf_r[pc_pos].b[ 9]; + k10 |= words_buf_r[pc_pos].b[10]; + k11 |= words_buf_r[pc_pos].b[11]; + k12 |= words_buf_r[pc_pos].b[12]; + k13 |= words_buf_r[pc_pos].b[13]; + k14 |= words_buf_r[pc_pos].b[14]; + k15 |= words_buf_r[pc_pos].b[15]; + k16 |= words_buf_r[pc_pos].b[16]; + k17 |= words_buf_r[pc_pos].b[17]; + k18 |= words_buf_r[pc_pos].b[18]; + k19 |= words_buf_r[pc_pos].b[19]; + k20 |= words_buf_r[pc_pos].b[20]; + k21 |= words_buf_r[pc_pos].b[21]; + k22 |= words_buf_r[pc_pos].b[22]; + k23 |= words_buf_r[pc_pos].b[23]; + k24 |= words_buf_r[pc_pos].b[24]; + k25 |= words_buf_r[pc_pos].b[25]; + k26 |= words_buf_r[pc_pos].b[26]; + k27 |= words_buf_r[pc_pos].b[27]; + k28 |= words_buf_r[pc_pos].b[28]; + k29 |= words_buf_r[pc_pos].b[29]; + k30 |= words_buf_r[pc_pos].b[30]; + k31 |= words_buf_r[pc_pos].b[31]; + + // KGS!@#$% including IP + + u32 D00 = 0; + u32 D01 = 0; + u32 D02 = 0; + u32 D03 = 0xffffffff; + u32 D04 = 0; + u32 D05 = 0xffffffff; + u32 D06 = 0xffffffff; + u32 D07 = 0xffffffff; + u32 D08 = 0; + u32 D09 = 0; + u32 D10 = 0; + u32 D11 = 0; + u32 D12 = 0; + u32 D13 = 0xffffffff; + u32 D14 = 0; + u32 D15 = 0; + u32 D16 = 0xffffffff; + u32 D17 = 0xffffffff; + u32 D18 = 0; + u32 D19 = 0; + u32 D20 = 0; + u32 D21 = 0; + u32 D22 = 0xffffffff; + u32 D23 = 0; + u32 D24 = 0xffffffff; + u32 D25 = 0; + u32 D26 = 0xffffffff; + u32 D27 = 0; + u32 D28 = 0xffffffff; + u32 D29 = 0xffffffff; + u32 D30 = 0xffffffff; + u32 D31 = 0xffffffff; + u32 D32 = 0; + u32 D33 = 0; + u32 D34 = 0; + u32 D35 = 0; + u32 D36 = 0; + u32 D37 = 0; + u32 D38 = 0; + u32 D39 = 0; + u32 D40 = 0xffffffff; + u32 D41 = 0xffffffff; + u32 D42 = 0xffffffff; + u32 D43 = 0; + u32 D44 = 0xffffffff; + u32 D45 = 0; + u32 D46 = 0; + u32 D47 = 0; + u32 D48 = 0; + u32 D49 = 0; + u32 D50 = 0; + u32 D51 = 0; + u32 D52 = 0; + u32 D53 = 0; + u32 D54 = 0; + u32 D55 = 0xffffffff; + u32 D56 = 0; + u32 D57 = 0; + u32 D58 = 0xffffffff; + u32 D59 = 0; + u32 D60 = 0; + u32 D61 = 0xffffffff; + u32 D62 = 0xffffffff; + u32 D63 = 0xffffffff; + + DES + ( + k00, k01, k02, k03, k04, k05, k06, + k07, k08, k09, k10, k11, k12, k13, + k14, k15, k16, k17, k18, k19, k20, + k21, k22, k23, k24, k25, k26, k27, + k28, k29, k30, k31, K32, K33, K34, + K35, K36, K37, K38, K39, K40, K41, + K42, K43, K44, K45, K46, K47, K48, + K49, K50, K51, K52, K53, K54, K55, + D00, D01, D02, D03, D04, D05, D06, D07, + D08, D09, D10, D11, D12, D13, D14, D15, + D16, D17, D18, D19, D20, D21, D22, D23, + D24, D25, D26, D27, D28, D29, D30, D31, + D32, D33, D34, D35, D36, D37, D38, D39, + D40, D41, D42, D43, D44, D45, D46, D47, + D48, D49, D50, D51, D52, D53, D54, D55, + D56, D57, D58, D59, D60, D61, D62, D63 + ); + + u32 out[64]; + + out[ 0] = D00; + out[ 1] = D01; + out[ 2] = D02; + out[ 3] = D03; + out[ 4] = D04; + out[ 5] = D05; + out[ 6] = D06; + out[ 7] = D07; + out[ 8] = D08; + out[ 9] = D09; + out[10] = D10; + out[11] = D11; + out[12] = D12; + out[13] = D13; + out[14] = D14; + out[15] = D15; + out[16] = D16; + out[17] = D17; + out[18] = D18; + out[19] = D19; + out[20] = D20; + out[21] = D21; + out[22] = D22; + out[23] = D23; + out[24] = D24; + out[25] = D25; + out[26] = D26; + out[27] = D27; + out[28] = D28; + out[29] = D29; + out[30] = D30; + out[31] = D31; + out[32] = D32; + out[33] = D33; + out[34] = D34; + out[35] = D35; + out[36] = D36; + out[37] = D37; + out[38] = D38; + out[39] = D39; + out[40] = D40; + out[41] = D41; + out[42] = D42; + out[43] = D43; + out[44] = D44; + out[45] = D45; + out[46] = D46; + out[47] = D47; + out[48] = D48; + out[49] = D49; + out[50] = D50; + out[51] = D51; + out[52] = D52; + out[53] = D53; + out[54] = D54; + out[55] = D55; + out[56] = D56; + out[57] = D57; + out[58] = D58; + out[59] = D59; + out[60] = D60; + out[61] = D61; + out[62] = D62; + out[63] = D63; + + if (digests_cnt < 16) + { + for (u32 d = 0; d < digests_cnt; d++) + { + const u32 final_hash_pos = digests_offset + d; + + if (hashes_shown[final_hash_pos]) continue; + + u32 search[2]; + + search[0] = digests_buf[final_hash_pos].digest_buf[DGST_R0]; + search[1] = digests_buf[final_hash_pos].digest_buf[DGST_R1]; + + u32 tmpResult = 0; + + #pragma unroll + for (int i = 0; i < 32; i++) + { + const u32 b0 = -((search[0] >> i) & 1); + const u32 b1 = -((search[1] >> i) & 1); + + tmpResult |= out[ 0 + i] ^ b0; + tmpResult |= out[32 + i] ^ b1; + } + + if (tmpResult == 0xffffffff) continue; + + const u32 slice = 31 - clz (~tmpResult); + + const u32x r0 = search[0]; + const u32x r1 = search[1]; + const u32x r2 = 0; + const u32x r3 = 0; + + #include VECT_COMPARE_M + } + } + else + { + u32 out0[32]; + u32 out1[32]; + + #pragma unroll + for (int i = 0; i < 32; i++) + { + out0[i] = out[ 0 + 31 - i]; + out1[i] = out[32 + 31 - i]; + } + + transpose32c (out0); + transpose32c (out1); + + #pragma unroll + for (int slice = 0; slice < 32; slice++) + { + const u32x r0 = out0[31 - slice]; + const u32x r1 = out1[31 - slice]; + const u32x r2 = 0; + const u32x r3 = 0; + + #include VECT_COMPARE_M + } + } +} + +static void m03000s (__local u32 *s_S, __global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bs_word_t * words_buf_r, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + const u32 lid = get_local_id (0); + + /** + * digest + */ + + #define S00 s_S[ 0] + #define S01 s_S[ 1] + #define S02 s_S[ 2] + #define S03 s_S[ 3] + #define S04 s_S[ 4] + #define S05 s_S[ 5] + #define S06 s_S[ 6] + #define S07 s_S[ 7] + #define S08 s_S[ 8] + #define S09 s_S[ 9] + #define S10 s_S[10] + #define S11 s_S[11] + #define S12 s_S[12] + #define S13 s_S[13] + #define S14 s_S[14] + #define S15 s_S[15] + #define S16 s_S[16] + #define S17 s_S[17] + #define S18 s_S[18] + #define S19 s_S[19] + #define S20 s_S[20] + #define S21 s_S[21] + #define S22 s_S[22] + #define S23 s_S[23] + #define S24 s_S[24] + #define S25 s_S[25] + #define S26 s_S[26] + #define S27 s_S[27] + #define S28 s_S[28] + #define S29 s_S[29] + #define S30 s_S[30] + #define S31 s_S[31] + #define S32 s_S[32] + #define S33 s_S[33] + #define S34 s_S[34] + #define S35 s_S[35] + #define S36 s_S[36] + #define S37 s_S[37] + #define S38 s_S[38] + #define S39 s_S[39] + #define S40 s_S[40] + #define S41 s_S[41] + #define S42 s_S[42] + #define S43 s_S[43] + #define S44 s_S[44] + #define S45 s_S[45] + #define S46 s_S[46] + #define S47 s_S[47] + #define S48 s_S[48] + #define S49 s_S[49] + #define S50 s_S[50] + #define S51 s_S[51] + #define S52 s_S[52] + #define S53 s_S[53] + #define S54 s_S[54] + #define S55 s_S[55] + #define S56 s_S[56] + #define S57 s_S[57] + #define S58 s_S[58] + #define S59 s_S[59] + #define S60 s_S[60] + #define S61 s_S[61] + #define S62 s_S[62] + #define S63 s_S[63] + + /** + * keys + */ + + const u32 K00 = pws[gid].i[ 0]; + const u32 K01 = pws[gid].i[ 1]; + const u32 K02 = pws[gid].i[ 2]; + const u32 K03 = pws[gid].i[ 3]; + const u32 K04 = pws[gid].i[ 4]; + const u32 K05 = pws[gid].i[ 5]; + const u32 K06 = pws[gid].i[ 6]; + const u32 K07 = pws[gid].i[ 7]; + const u32 K08 = pws[gid].i[ 8]; + const u32 K09 = pws[gid].i[ 9]; + const u32 K10 = pws[gid].i[10]; + const u32 K11 = pws[gid].i[11]; + const u32 K12 = pws[gid].i[12]; + const u32 K13 = pws[gid].i[13]; + const u32 K14 = pws[gid].i[14]; + const u32 K15 = pws[gid].i[15]; + const u32 K16 = pws[gid].i[16]; + const u32 K17 = pws[gid].i[17]; + const u32 K18 = pws[gid].i[18]; + const u32 K19 = pws[gid].i[19]; + const u32 K20 = pws[gid].i[20]; + const u32 K21 = pws[gid].i[21]; + const u32 K22 = pws[gid].i[22]; + const u32 K23 = pws[gid].i[23]; + const u32 K24 = pws[gid].i[24]; + const u32 K25 = pws[gid].i[25]; + const u32 K26 = pws[gid].i[26]; + const u32 K27 = pws[gid].i[27]; + const u32 K28 = pws[gid].i[28]; + const u32 K29 = pws[gid].i[29]; + const u32 K30 = pws[gid].i[30]; + const u32 K31 = pws[gid].i[31]; + const u32 K32 = pws[gid].i[32]; + const u32 K33 = pws[gid].i[33]; + const u32 K34 = pws[gid].i[34]; + const u32 K35 = pws[gid].i[35]; + const u32 K36 = pws[gid].i[36]; + const u32 K37 = pws[gid].i[37]; + const u32 K38 = pws[gid].i[38]; + const u32 K39 = pws[gid].i[39]; + const u32 K40 = pws[gid].i[40]; + const u32 K41 = pws[gid].i[41]; + const u32 K42 = pws[gid].i[42]; + const u32 K43 = pws[gid].i[43]; + const u32 K44 = pws[gid].i[44]; + const u32 K45 = pws[gid].i[45]; + const u32 K46 = pws[gid].i[46]; + const u32 K47 = pws[gid].i[47]; + const u32 K48 = pws[gid].i[48]; + const u32 K49 = pws[gid].i[49]; + const u32 K50 = pws[gid].i[50]; + const u32 K51 = pws[gid].i[51]; + const u32 K52 = pws[gid].i[52]; + const u32 K53 = pws[gid].i[53]; + const u32 K54 = pws[gid].i[54]; + const u32 K55 = pws[gid].i[55]; + + const u32 pc_pos = get_local_id (1); + + const u32 il_pos = pc_pos * 32; + + u32 k00 = K00; + u32 k01 = K01; + u32 k02 = K02; + u32 k03 = K03; + u32 k04 = K04; + u32 k05 = K05; + u32 k06 = K06; + u32 k07 = K07; + u32 k08 = K08; + u32 k09 = K09; + u32 k10 = K10; + u32 k11 = K11; + u32 k12 = K12; + u32 k13 = K13; + u32 k14 = K14; + u32 k15 = K15; + u32 k16 = K16; + u32 k17 = K17; + u32 k18 = K18; + u32 k19 = K19; + u32 k20 = K20; + u32 k21 = K21; + u32 k22 = K22; + u32 k23 = K23; + u32 k24 = K24; + u32 k25 = K25; + u32 k26 = K26; + u32 k27 = K27; + u32 k28 = K28; + u32 k29 = K29; + u32 k30 = K30; + u32 k31 = K31; + + k00 |= words_buf_r[pc_pos].b[ 0]; + k01 |= words_buf_r[pc_pos].b[ 1]; + k02 |= words_buf_r[pc_pos].b[ 2]; + k03 |= words_buf_r[pc_pos].b[ 3]; + k04 |= words_buf_r[pc_pos].b[ 4]; + k05 |= words_buf_r[pc_pos].b[ 5]; + k06 |= words_buf_r[pc_pos].b[ 6]; + k07 |= words_buf_r[pc_pos].b[ 7]; + k08 |= words_buf_r[pc_pos].b[ 8]; + k09 |= words_buf_r[pc_pos].b[ 9]; + k10 |= words_buf_r[pc_pos].b[10]; + k11 |= words_buf_r[pc_pos].b[11]; + k12 |= words_buf_r[pc_pos].b[12]; + k13 |= words_buf_r[pc_pos].b[13]; + k14 |= words_buf_r[pc_pos].b[14]; + k15 |= words_buf_r[pc_pos].b[15]; + k16 |= words_buf_r[pc_pos].b[16]; + k17 |= words_buf_r[pc_pos].b[17]; + k18 |= words_buf_r[pc_pos].b[18]; + k19 |= words_buf_r[pc_pos].b[19]; + k20 |= words_buf_r[pc_pos].b[20]; + k21 |= words_buf_r[pc_pos].b[21]; + k22 |= words_buf_r[pc_pos].b[22]; + k23 |= words_buf_r[pc_pos].b[23]; + k24 |= words_buf_r[pc_pos].b[24]; + k25 |= words_buf_r[pc_pos].b[25]; + k26 |= words_buf_r[pc_pos].b[26]; + k27 |= words_buf_r[pc_pos].b[27]; + k28 |= words_buf_r[pc_pos].b[28]; + k29 |= words_buf_r[pc_pos].b[29]; + k30 |= words_buf_r[pc_pos].b[30]; + k31 |= words_buf_r[pc_pos].b[31]; + + // KGS!@#$% including IP + + u32 D00 = 0; + u32 D01 = 0; + u32 D02 = 0; + u32 D03 = 0xffffffff; + u32 D04 = 0; + u32 D05 = 0xffffffff; + u32 D06 = 0xffffffff; + u32 D07 = 0xffffffff; + u32 D08 = 0; + u32 D09 = 0; + u32 D10 = 0; + u32 D11 = 0; + u32 D12 = 0; + u32 D13 = 0xffffffff; + u32 D14 = 0; + u32 D15 = 0; + u32 D16 = 0xffffffff; + u32 D17 = 0xffffffff; + u32 D18 = 0; + u32 D19 = 0; + u32 D20 = 0; + u32 D21 = 0; + u32 D22 = 0xffffffff; + u32 D23 = 0; + u32 D24 = 0xffffffff; + u32 D25 = 0; + u32 D26 = 0xffffffff; + u32 D27 = 0; + u32 D28 = 0xffffffff; + u32 D29 = 0xffffffff; + u32 D30 = 0xffffffff; + u32 D31 = 0xffffffff; + u32 D32 = 0; + u32 D33 = 0; + u32 D34 = 0; + u32 D35 = 0; + u32 D36 = 0; + u32 D37 = 0; + u32 D38 = 0; + u32 D39 = 0; + u32 D40 = 0xffffffff; + u32 D41 = 0xffffffff; + u32 D42 = 0xffffffff; + u32 D43 = 0; + u32 D44 = 0xffffffff; + u32 D45 = 0; + u32 D46 = 0; + u32 D47 = 0; + u32 D48 = 0; + u32 D49 = 0; + u32 D50 = 0; + u32 D51 = 0; + u32 D52 = 0; + u32 D53 = 0; + u32 D54 = 0; + u32 D55 = 0xffffffff; + u32 D56 = 0; + u32 D57 = 0; + u32 D58 = 0xffffffff; + u32 D59 = 0; + u32 D60 = 0; + u32 D61 = 0xffffffff; + u32 D62 = 0xffffffff; + u32 D63 = 0xffffffff; + + DES + ( + k00, k01, k02, k03, k04, k05, k06, + k07, k08, k09, k10, k11, k12, k13, + k14, k15, k16, k17, k18, k19, k20, + k21, k22, k23, k24, k25, k26, k27, + k28, k29, k30, k31, K32, K33, K34, + K35, K36, K37, K38, K39, K40, K41, + K42, K43, K44, K45, K46, K47, K48, + K49, K50, K51, K52, K53, K54, K55, + D00, D01, D02, D03, D04, D05, D06, D07, + D08, D09, D10, D11, D12, D13, D14, D15, + D16, D17, D18, D19, D20, D21, D22, D23, + D24, D25, D26, D27, D28, D29, D30, D31, + D32, D33, D34, D35, D36, D37, D38, D39, + D40, D41, D42, D43, D44, D45, D46, D47, + D48, D49, D50, D51, D52, D53, D54, D55, + D56, D57, D58, D59, D60, D61, D62, D63 + ); + + u32 tmpResult = 0; + + tmpResult |= D00 ^ S00; + tmpResult |= D01 ^ S01; + tmpResult |= D02 ^ S02; + tmpResult |= D03 ^ S03; + tmpResult |= D04 ^ S04; + tmpResult |= D05 ^ S05; + tmpResult |= D06 ^ S06; + tmpResult |= D07 ^ S07; + tmpResult |= D08 ^ S08; + tmpResult |= D09 ^ S09; + tmpResult |= D10 ^ S10; + tmpResult |= D11 ^ S11; + tmpResult |= D12 ^ S12; + tmpResult |= D13 ^ S13; + tmpResult |= D14 ^ S14; + tmpResult |= D15 ^ S15; + + if (tmpResult == 0xffffffff) return; + + tmpResult |= D16 ^ S16; + tmpResult |= D17 ^ S17; + tmpResult |= D18 ^ S18; + tmpResult |= D19 ^ S19; + tmpResult |= D20 ^ S20; + tmpResult |= D21 ^ S21; + tmpResult |= D22 ^ S22; + tmpResult |= D23 ^ S23; + tmpResult |= D24 ^ S24; + tmpResult |= D25 ^ S25; + tmpResult |= D26 ^ S26; + tmpResult |= D27 ^ S27; + tmpResult |= D28 ^ S28; + tmpResult |= D29 ^ S29; + tmpResult |= D30 ^ S30; + tmpResult |= D31 ^ S31; + + if (tmpResult == 0xffffffff) return; + + tmpResult |= D32 ^ S32; + tmpResult |= D33 ^ S33; + tmpResult |= D34 ^ S34; + tmpResult |= D35 ^ S35; + tmpResult |= D36 ^ S36; + tmpResult |= D37 ^ S37; + tmpResult |= D38 ^ S38; + tmpResult |= D39 ^ S39; + tmpResult |= D40 ^ S40; + tmpResult |= D41 ^ S41; + tmpResult |= D42 ^ S42; + tmpResult |= D43 ^ S43; + tmpResult |= D44 ^ S44; + tmpResult |= D45 ^ S45; + tmpResult |= D46 ^ S46; + tmpResult |= D47 ^ S47; + + if (tmpResult == 0xffffffff) return; + + tmpResult |= D48 ^ S48; + tmpResult |= D49 ^ S49; + tmpResult |= D50 ^ S50; + tmpResult |= D51 ^ S51; + tmpResult |= D52 ^ S52; + tmpResult |= D53 ^ S53; + tmpResult |= D54 ^ S54; + tmpResult |= D55 ^ S55; + tmpResult |= D56 ^ S56; + tmpResult |= D57 ^ S57; + tmpResult |= D58 ^ S58; + tmpResult |= D59 ^ S59; + tmpResult |= D60 ^ S60; + tmpResult |= D61 ^ S61; + tmpResult |= D62 ^ S62; + tmpResult |= D63 ^ S63; + + if (tmpResult == 0xffffffff) return; + + const u32 slice = 31 - clz (~tmpResult); + + #include VECT_COMPARE_S +} + +// +// transpose bitslice base : easy because no overlapping buffers +// mod : attention race conditions, need different buffers for *in and *out +// + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m03000_tb (__global pw_t *pws) +{ + const u32 gid = get_global_id (0); + + const u32 w0s = pws[gid].i[0]; + const u32 w1s = pws[gid].i[1]; + + #pragma unroll + for (int i = 0; i < 32; i += 8) + { + pws[gid].i[i + 0 + 0] = -((w0s >> (i + 7)) & 1); + pws[gid].i[i + 0 + 1] = -((w0s >> (i + 6)) & 1); + pws[gid].i[i + 0 + 2] = -((w0s >> (i + 5)) & 1); + pws[gid].i[i + 0 + 3] = -((w0s >> (i + 4)) & 1); + pws[gid].i[i + 0 + 4] = -((w0s >> (i + 3)) & 1); + pws[gid].i[i + 0 + 5] = -((w0s >> (i + 2)) & 1); + pws[gid].i[i + 0 + 6] = -((w0s >> (i + 1)) & 1); + pws[gid].i[i + 0 + 7] = -((w0s >> (i + 0)) & 1); + } + + #pragma unroll + for (int i = 0; i < 24; i += 8) + { + pws[gid].i[i + 32 + 0] = -((w1s >> (i + 7)) & 1); + pws[gid].i[i + 32 + 1] = -((w1s >> (i + 6)) & 1); + pws[gid].i[i + 32 + 2] = -((w1s >> (i + 5)) & 1); + pws[gid].i[i + 32 + 3] = -((w1s >> (i + 4)) & 1); + pws[gid].i[i + 32 + 4] = -((w1s >> (i + 3)) & 1); + pws[gid].i[i + 32 + 5] = -((w1s >> (i + 2)) & 1); + pws[gid].i[i + 32 + 6] = -((w1s >> (i + 1)) & 1); + pws[gid].i[i + 32 + 7] = -((w1s >> (i + 0)) & 1); + } +} + +__kernel void __attribute__((reqd_work_group_size (32, 1, 1))) m03000_tm (__global u32 *mod, __global bs_word_t *words_buf_r) +{ + const u32 gid = get_global_id (0); + + const u32 block = gid / 32; + const u32 slice = gid % 32; + + const u32 w0 = mod[gid]; + + #pragma unroll + for (int i = 0; i < 32; i += 8) + { + atomic_or (&words_buf_r[block].b[i + 0], (((w0 >> (i + 7)) & 1) << slice)); + atomic_or (&words_buf_r[block].b[i + 1], (((w0 >> (i + 6)) & 1) << slice)); + atomic_or (&words_buf_r[block].b[i + 2], (((w0 >> (i + 5)) & 1) << slice)); + atomic_or (&words_buf_r[block].b[i + 3], (((w0 >> (i + 4)) & 1) << slice)); + atomic_or (&words_buf_r[block].b[i + 4], (((w0 >> (i + 3)) & 1) << slice)); + atomic_or (&words_buf_r[block].b[i + 5], (((w0 >> (i + 2)) & 1) << slice)); + atomic_or (&words_buf_r[block].b[i + 6], (((w0 >> (i + 1)) & 1) << slice)); + atomic_or (&words_buf_r[block].b[i + 7], (((w0 >> (i + 0)) & 1) << slice)); + } +} + +__kernel void __attribute__((reqd_work_group_size (2, 32, 1))) m03000_m04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bs_word_t * words_buf_r, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + const u32 lid = get_local_id (0); + const u32 vid = get_local_id (1); + + const u32 s0 = digests_buf[digests_offset].digest_buf[0]; + const u32 s1 = digests_buf[digests_offset].digest_buf[1]; + + __local u32 s_S[64]; + + if (lid == 0) + { + s_S[ 0 + vid] = -((s0 >> vid) & 1); + } + else if (lid == 1) + { + s_S[32 + vid] = -((s1 >> vid) & 1); + } + + barrier (CLK_LOCAL_MEM_FENCE); + + if (gid >= gid_max) return; + + /** + * main + */ + + m03000m (s_S, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +__kernel void __attribute__((reqd_work_group_size (2, 32, 1))) m03000_m08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bs_word_t * words_buf_r, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (2, 32, 1))) m03000_m16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bs_word_t * words_buf_r, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (2, 32, 1))) m03000_s04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bs_word_t * words_buf_r, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + const u32 lid = get_local_id (0); + const u32 vid = get_local_id (1); + + const u32 s0 = digests_buf[digests_offset].digest_buf[0]; + const u32 s1 = digests_buf[digests_offset].digest_buf[1]; + + __local u32 s_S[64]; + + if (lid == 0) + { + s_S[ 0 + vid] = -((s0 >> vid) & 1); + } + else if (lid == 1) + { + s_S[32 + vid] = -((s1 >> vid) & 1); + } + + barrier (CLK_LOCAL_MEM_FENCE); + + if (gid >= gid_max) return; + + /** + * main + */ + + m03000s (s_S, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +__kernel void __attribute__((reqd_work_group_size (2, 32, 1))) m03000_s08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bs_word_t * words_buf_r, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (2, 32, 1))) m03000_s16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bs_word_t * words_buf_r, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/amd/m03100_a0.cl b/amd/m03100_a0.cl new file mode 100644 index 0000000000..23f60db196 --- /dev/null +++ b/amd/m03100_a0.cl @@ -0,0 +1,1076 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _DES_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW4 +#define VECT_SIZE2 +#endif + +#ifdef VLIW5 +#define VECT_SIZE2 +#endif + +#define DGST_R0 0 +#define DGST_R1 1 +#define DGST_R2 2 +#define DGST_R3 3 + +#include "include/kernel_functions.c" +#include "types_amd.c" +#include "common_amd.c" +#include "include/rp_gpu.h" +#include "rp_amd.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +#define PERM_OP(a,b,tt,n,m) \ +{ \ + tt = a >> n; \ + tt = tt ^ b; \ + tt = tt & m; \ + b = b ^ tt; \ + tt = tt << n; \ + a = a ^ tt; \ +} + +#define HPERM_OP(a,tt,n,m) \ +{ \ + tt = a << (16 + n); \ + tt = tt ^ a; \ + tt = tt & m; \ + a = a ^ tt; \ + tt = tt >> (16 + n); \ + a = a ^ tt; \ +} + +#define IP(l,r,tt) \ +{ \ + PERM_OP (r, l, tt, 4, 0x0f0f0f0f); \ + PERM_OP (l, r, tt, 16, 0x0000ffff); \ + PERM_OP (r, l, tt, 2, 0x33333333); \ + PERM_OP (l, r, tt, 8, 0x00ff00ff); \ + PERM_OP (r, l, tt, 1, 0x55555555); \ +} + +#define FP(l,r,tt) \ +{ \ + PERM_OP (l, r, tt, 1, 0x55555555); \ + PERM_OP (r, l, tt, 8, 0x00ff00ff); \ + PERM_OP (l, r, tt, 2, 0x33333333); \ + PERM_OP (r, l, tt, 16, 0x0000ffff); \ + PERM_OP (l, r, tt, 4, 0x0f0f0f0f); \ +} + +__constant u32 c_SPtrans[8][64] = +{ + /* nibble 0 */ + 0x02080800, 0x00080000, 0x02000002, 0x02080802, + 0x02000000, 0x00080802, 0x00080002, 0x02000002, + 0x00080802, 0x02080800, 0x02080000, 0x00000802, + 0x02000802, 0x02000000, 0x00000000, 0x00080002, + 0x00080000, 0x00000002, 0x02000800, 0x00080800, + 0x02080802, 0x02080000, 0x00000802, 0x02000800, + 0x00000002, 0x00000800, 0x00080800, 0x02080002, + 0x00000800, 0x02000802, 0x02080002, 0x00000000, + 0x00000000, 0x02080802, 0x02000800, 0x00080002, + 0x02080800, 0x00080000, 0x00000802, 0x02000800, + 0x02080002, 0x00000800, 0x00080800, 0x02000002, + 0x00080802, 0x00000002, 0x02000002, 0x02080000, + 0x02080802, 0x00080800, 0x02080000, 0x02000802, + 0x02000000, 0x00000802, 0x00080002, 0x00000000, + 0x00080000, 0x02000000, 0x02000802, 0x02080800, + 0x00000002, 0x02080002, 0x00000800, 0x00080802, + /* nibble 1 */ + 0x40108010, 0x00000000, 0x00108000, 0x40100000, + 0x40000010, 0x00008010, 0x40008000, 0x00108000, + 0x00008000, 0x40100010, 0x00000010, 0x40008000, + 0x00100010, 0x40108000, 0x40100000, 0x00000010, + 0x00100000, 0x40008010, 0x40100010, 0x00008000, + 0x00108010, 0x40000000, 0x00000000, 0x00100010, + 0x40008010, 0x00108010, 0x40108000, 0x40000010, + 0x40000000, 0x00100000, 0x00008010, 0x40108010, + 0x00100010, 0x40108000, 0x40008000, 0x00108010, + 0x40108010, 0x00100010, 0x40000010, 0x00000000, + 0x40000000, 0x00008010, 0x00100000, 0x40100010, + 0x00008000, 0x40000000, 0x00108010, 0x40008010, + 0x40108000, 0x00008000, 0x00000000, 0x40000010, + 0x00000010, 0x40108010, 0x00108000, 0x40100000, + 0x40100010, 0x00100000, 0x00008010, 0x40008000, + 0x40008010, 0x00000010, 0x40100000, 0x00108000, + /* nibble 2 */ + 0x04000001, 0x04040100, 0x00000100, 0x04000101, + 0x00040001, 0x04000000, 0x04000101, 0x00040100, + 0x04000100, 0x00040000, 0x04040000, 0x00000001, + 0x04040101, 0x00000101, 0x00000001, 0x04040001, + 0x00000000, 0x00040001, 0x04040100, 0x00000100, + 0x00000101, 0x04040101, 0x00040000, 0x04000001, + 0x04040001, 0x04000100, 0x00040101, 0x04040000, + 0x00040100, 0x00000000, 0x04000000, 0x00040101, + 0x04040100, 0x00000100, 0x00000001, 0x00040000, + 0x00000101, 0x00040001, 0x04040000, 0x04000101, + 0x00000000, 0x04040100, 0x00040100, 0x04040001, + 0x00040001, 0x04000000, 0x04040101, 0x00000001, + 0x00040101, 0x04000001, 0x04000000, 0x04040101, + 0x00040000, 0x04000100, 0x04000101, 0x00040100, + 0x04000100, 0x00000000, 0x04040001, 0x00000101, + 0x04000001, 0x00040101, 0x00000100, 0x04040000, + /* nibble 3 */ + 0x00401008, 0x10001000, 0x00000008, 0x10401008, + 0x00000000, 0x10400000, 0x10001008, 0x00400008, + 0x10401000, 0x10000008, 0x10000000, 0x00001008, + 0x10000008, 0x00401008, 0x00400000, 0x10000000, + 0x10400008, 0x00401000, 0x00001000, 0x00000008, + 0x00401000, 0x10001008, 0x10400000, 0x00001000, + 0x00001008, 0x00000000, 0x00400008, 0x10401000, + 0x10001000, 0x10400008, 0x10401008, 0x00400000, + 0x10400008, 0x00001008, 0x00400000, 0x10000008, + 0x00401000, 0x10001000, 0x00000008, 0x10400000, + 0x10001008, 0x00000000, 0x00001000, 0x00400008, + 0x00000000, 0x10400008, 0x10401000, 0x00001000, + 0x10000000, 0x10401008, 0x00401008, 0x00400000, + 0x10401008, 0x00000008, 0x10001000, 0x00401008, + 0x00400008, 0x00401000, 0x10400000, 0x10001008, + 0x00001008, 0x10000000, 0x10000008, 0x10401000, + /* nibble 4 */ + 0x08000000, 0x00010000, 0x00000400, 0x08010420, + 0x08010020, 0x08000400, 0x00010420, 0x08010000, + 0x00010000, 0x00000020, 0x08000020, 0x00010400, + 0x08000420, 0x08010020, 0x08010400, 0x00000000, + 0x00010400, 0x08000000, 0x00010020, 0x00000420, + 0x08000400, 0x00010420, 0x00000000, 0x08000020, + 0x00000020, 0x08000420, 0x08010420, 0x00010020, + 0x08010000, 0x00000400, 0x00000420, 0x08010400, + 0x08010400, 0x08000420, 0x00010020, 0x08010000, + 0x00010000, 0x00000020, 0x08000020, 0x08000400, + 0x08000000, 0x00010400, 0x08010420, 0x00000000, + 0x00010420, 0x08000000, 0x00000400, 0x00010020, + 0x08000420, 0x00000400, 0x00000000, 0x08010420, + 0x08010020, 0x08010400, 0x00000420, 0x00010000, + 0x00010400, 0x08010020, 0x08000400, 0x00000420, + 0x00000020, 0x00010420, 0x08010000, 0x08000020, + /* nibble 5 */ + 0x80000040, 0x00200040, 0x00000000, 0x80202000, + 0x00200040, 0x00002000, 0x80002040, 0x00200000, + 0x00002040, 0x80202040, 0x00202000, 0x80000000, + 0x80002000, 0x80000040, 0x80200000, 0x00202040, + 0x00200000, 0x80002040, 0x80200040, 0x00000000, + 0x00002000, 0x00000040, 0x80202000, 0x80200040, + 0x80202040, 0x80200000, 0x80000000, 0x00002040, + 0x00000040, 0x00202000, 0x00202040, 0x80002000, + 0x00002040, 0x80000000, 0x80002000, 0x00202040, + 0x80202000, 0x00200040, 0x00000000, 0x80002000, + 0x80000000, 0x00002000, 0x80200040, 0x00200000, + 0x00200040, 0x80202040, 0x00202000, 0x00000040, + 0x80202040, 0x00202000, 0x00200000, 0x80002040, + 0x80000040, 0x80200000, 0x00202040, 0x00000000, + 0x00002000, 0x80000040, 0x80002040, 0x80202000, + 0x80200000, 0x00002040, 0x00000040, 0x80200040, + /* nibble 6 */ + 0x00004000, 0x00000200, 0x01000200, 0x01000004, + 0x01004204, 0x00004004, 0x00004200, 0x00000000, + 0x01000000, 0x01000204, 0x00000204, 0x01004000, + 0x00000004, 0x01004200, 0x01004000, 0x00000204, + 0x01000204, 0x00004000, 0x00004004, 0x01004204, + 0x00000000, 0x01000200, 0x01000004, 0x00004200, + 0x01004004, 0x00004204, 0x01004200, 0x00000004, + 0x00004204, 0x01004004, 0x00000200, 0x01000000, + 0x00004204, 0x01004000, 0x01004004, 0x00000204, + 0x00004000, 0x00000200, 0x01000000, 0x01004004, + 0x01000204, 0x00004204, 0x00004200, 0x00000000, + 0x00000200, 0x01000004, 0x00000004, 0x01000200, + 0x00000000, 0x01000204, 0x01000200, 0x00004200, + 0x00000204, 0x00004000, 0x01004204, 0x01000000, + 0x01004200, 0x00000004, 0x00004004, 0x01004204, + 0x01000004, 0x01004200, 0x01004000, 0x00004004, + /* nibble 7 */ + 0x20800080, 0x20820000, 0x00020080, 0x00000000, + 0x20020000, 0x00800080, 0x20800000, 0x20820080, + 0x00000080, 0x20000000, 0x00820000, 0x00020080, + 0x00820080, 0x20020080, 0x20000080, 0x20800000, + 0x00020000, 0x00820080, 0x00800080, 0x20020000, + 0x20820080, 0x20000080, 0x00000000, 0x00820000, + 0x20000000, 0x00800000, 0x20020080, 0x20800080, + 0x00800000, 0x00020000, 0x20820000, 0x00000080, + 0x00800000, 0x00020000, 0x20000080, 0x20820080, + 0x00020080, 0x20000000, 0x00000000, 0x00820000, + 0x20800080, 0x20020080, 0x20020000, 0x00800080, + 0x20820000, 0x00000080, 0x00800080, 0x20020000, + 0x20820080, 0x00800000, 0x20800000, 0x20000080, + 0x00820000, 0x00020080, 0x20020080, 0x20800000, + 0x00000080, 0x20820000, 0x00820080, 0x00000000, + 0x20000000, 0x20800080, 0x00020000, 0x00820080, +}; + +__constant u32 c_skb[8][64] = +{ + /* for C bits (numbered as per FIPS 46) 1 2 3 4 5 6 */ + 0x00000000, 0x00000010, 0x20000000, 0x20000010, + 0x00010000, 0x00010010, 0x20010000, 0x20010010, + 0x00000800, 0x00000810, 0x20000800, 0x20000810, + 0x00010800, 0x00010810, 0x20010800, 0x20010810, + 0x00000020, 0x00000030, 0x20000020, 0x20000030, + 0x00010020, 0x00010030, 0x20010020, 0x20010030, + 0x00000820, 0x00000830, 0x20000820, 0x20000830, + 0x00010820, 0x00010830, 0x20010820, 0x20010830, + 0x00080000, 0x00080010, 0x20080000, 0x20080010, + 0x00090000, 0x00090010, 0x20090000, 0x20090010, + 0x00080800, 0x00080810, 0x20080800, 0x20080810, + 0x00090800, 0x00090810, 0x20090800, 0x20090810, + 0x00080020, 0x00080030, 0x20080020, 0x20080030, + 0x00090020, 0x00090030, 0x20090020, 0x20090030, + 0x00080820, 0x00080830, 0x20080820, 0x20080830, + 0x00090820, 0x00090830, 0x20090820, 0x20090830, + /* for C bits (numbered as per FIPS 46) 7 8 10 11 12 13 */ + 0x00000000, 0x02000000, 0x00002000, 0x02002000, + 0x00200000, 0x02200000, 0x00202000, 0x02202000, + 0x00000004, 0x02000004, 0x00002004, 0x02002004, + 0x00200004, 0x02200004, 0x00202004, 0x02202004, + 0x00000400, 0x02000400, 0x00002400, 0x02002400, + 0x00200400, 0x02200400, 0x00202400, 0x02202400, + 0x00000404, 0x02000404, 0x00002404, 0x02002404, + 0x00200404, 0x02200404, 0x00202404, 0x02202404, + 0x10000000, 0x12000000, 0x10002000, 0x12002000, + 0x10200000, 0x12200000, 0x10202000, 0x12202000, + 0x10000004, 0x12000004, 0x10002004, 0x12002004, + 0x10200004, 0x12200004, 0x10202004, 0x12202004, + 0x10000400, 0x12000400, 0x10002400, 0x12002400, + 0x10200400, 0x12200400, 0x10202400, 0x12202400, + 0x10000404, 0x12000404, 0x10002404, 0x12002404, + 0x10200404, 0x12200404, 0x10202404, 0x12202404, + /* for C bits (numbered as per FIPS 46) 14 15 16 17 19 20 */ + 0x00000000, 0x00000001, 0x00040000, 0x00040001, + 0x01000000, 0x01000001, 0x01040000, 0x01040001, + 0x00000002, 0x00000003, 0x00040002, 0x00040003, + 0x01000002, 0x01000003, 0x01040002, 0x01040003, + 0x00000200, 0x00000201, 0x00040200, 0x00040201, + 0x01000200, 0x01000201, 0x01040200, 0x01040201, + 0x00000202, 0x00000203, 0x00040202, 0x00040203, + 0x01000202, 0x01000203, 0x01040202, 0x01040203, + 0x08000000, 0x08000001, 0x08040000, 0x08040001, + 0x09000000, 0x09000001, 0x09040000, 0x09040001, + 0x08000002, 0x08000003, 0x08040002, 0x08040003, + 0x09000002, 0x09000003, 0x09040002, 0x09040003, + 0x08000200, 0x08000201, 0x08040200, 0x08040201, + 0x09000200, 0x09000201, 0x09040200, 0x09040201, + 0x08000202, 0x08000203, 0x08040202, 0x08040203, + 0x09000202, 0x09000203, 0x09040202, 0x09040203, + /* for C bits (numbered as per FIPS 46) 21 23 24 26 27 28 */ + 0x00000000, 0x00100000, 0x00000100, 0x00100100, + 0x00000008, 0x00100008, 0x00000108, 0x00100108, + 0x00001000, 0x00101000, 0x00001100, 0x00101100, + 0x00001008, 0x00101008, 0x00001108, 0x00101108, + 0x04000000, 0x04100000, 0x04000100, 0x04100100, + 0x04000008, 0x04100008, 0x04000108, 0x04100108, + 0x04001000, 0x04101000, 0x04001100, 0x04101100, + 0x04001008, 0x04101008, 0x04001108, 0x04101108, + 0x00020000, 0x00120000, 0x00020100, 0x00120100, + 0x00020008, 0x00120008, 0x00020108, 0x00120108, + 0x00021000, 0x00121000, 0x00021100, 0x00121100, + 0x00021008, 0x00121008, 0x00021108, 0x00121108, + 0x04020000, 0x04120000, 0x04020100, 0x04120100, + 0x04020008, 0x04120008, 0x04020108, 0x04120108, + 0x04021000, 0x04121000, 0x04021100, 0x04121100, + 0x04021008, 0x04121008, 0x04021108, 0x04121108, + /* for D bits (numbered as per FIPS 46) 1 2 3 4 5 6 */ + 0x00000000, 0x10000000, 0x00010000, 0x10010000, + 0x00000004, 0x10000004, 0x00010004, 0x10010004, + 0x20000000, 0x30000000, 0x20010000, 0x30010000, + 0x20000004, 0x30000004, 0x20010004, 0x30010004, + 0x00100000, 0x10100000, 0x00110000, 0x10110000, + 0x00100004, 0x10100004, 0x00110004, 0x10110004, + 0x20100000, 0x30100000, 0x20110000, 0x30110000, + 0x20100004, 0x30100004, 0x20110004, 0x30110004, + 0x00001000, 0x10001000, 0x00011000, 0x10011000, + 0x00001004, 0x10001004, 0x00011004, 0x10011004, + 0x20001000, 0x30001000, 0x20011000, 0x30011000, + 0x20001004, 0x30001004, 0x20011004, 0x30011004, + 0x00101000, 0x10101000, 0x00111000, 0x10111000, + 0x00101004, 0x10101004, 0x00111004, 0x10111004, + 0x20101000, 0x30101000, 0x20111000, 0x30111000, + 0x20101004, 0x30101004, 0x20111004, 0x30111004, + /* for D bits (numbered as per FIPS 46) 8 9 11 12 13 14 */ + 0x00000000, 0x08000000, 0x00000008, 0x08000008, + 0x00000400, 0x08000400, 0x00000408, 0x08000408, + 0x00020000, 0x08020000, 0x00020008, 0x08020008, + 0x00020400, 0x08020400, 0x00020408, 0x08020408, + 0x00000001, 0x08000001, 0x00000009, 0x08000009, + 0x00000401, 0x08000401, 0x00000409, 0x08000409, + 0x00020001, 0x08020001, 0x00020009, 0x08020009, + 0x00020401, 0x08020401, 0x00020409, 0x08020409, + 0x02000000, 0x0A000000, 0x02000008, 0x0A000008, + 0x02000400, 0x0A000400, 0x02000408, 0x0A000408, + 0x02020000, 0x0A020000, 0x02020008, 0x0A020008, + 0x02020400, 0x0A020400, 0x02020408, 0x0A020408, + 0x02000001, 0x0A000001, 0x02000009, 0x0A000009, + 0x02000401, 0x0A000401, 0x02000409, 0x0A000409, + 0x02020001, 0x0A020001, 0x02020009, 0x0A020009, + 0x02020401, 0x0A020401, 0x02020409, 0x0A020409, + /* for D bits (numbered as per FIPS 46) 16 17 18 19 20 21 */ + 0x00000000, 0x00000100, 0x00080000, 0x00080100, + 0x01000000, 0x01000100, 0x01080000, 0x01080100, + 0x00000010, 0x00000110, 0x00080010, 0x00080110, + 0x01000010, 0x01000110, 0x01080010, 0x01080110, + 0x00200000, 0x00200100, 0x00280000, 0x00280100, + 0x01200000, 0x01200100, 0x01280000, 0x01280100, + 0x00200010, 0x00200110, 0x00280010, 0x00280110, + 0x01200010, 0x01200110, 0x01280010, 0x01280110, + 0x00000200, 0x00000300, 0x00080200, 0x00080300, + 0x01000200, 0x01000300, 0x01080200, 0x01080300, + 0x00000210, 0x00000310, 0x00080210, 0x00080310, + 0x01000210, 0x01000310, 0x01080210, 0x01080310, + 0x00200200, 0x00200300, 0x00280200, 0x00280300, + 0x01200200, 0x01200300, 0x01280200, 0x01280300, + 0x00200210, 0x00200310, 0x00280210, 0x00280310, + 0x01200210, 0x01200310, 0x01280210, 0x01280310, + /* for D bits (numbered as per FIPS 46) 22 23 24 25 27 28 */ + 0x00000000, 0x04000000, 0x00040000, 0x04040000, + 0x00000002, 0x04000002, 0x00040002, 0x04040002, + 0x00002000, 0x04002000, 0x00042000, 0x04042000, + 0x00002002, 0x04002002, 0x00042002, 0x04042002, + 0x00000020, 0x04000020, 0x00040020, 0x04040020, + 0x00000022, 0x04000022, 0x00040022, 0x04040022, + 0x00002020, 0x04002020, 0x00042020, 0x04042020, + 0x00002022, 0x04002022, 0x00042022, 0x04042022, + 0x00000800, 0x04000800, 0x00040800, 0x04040800, + 0x00000802, 0x04000802, 0x00040802, 0x04040802, + 0x00002800, 0x04002800, 0x00042800, 0x04042800, + 0x00002802, 0x04002802, 0x00042802, 0x04042802, + 0x00000820, 0x04000820, 0x00040820, 0x04040820, + 0x00000822, 0x04000822, 0x00040822, 0x04040822, + 0x00002820, 0x04002820, 0x00042820, 0x04042820, + 0x00002822, 0x04002822, 0x00042822, 0x04042822 +}; + +__constant u32 shifts3s0[16] = { 1, 1, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 1 }; +__constant u32 shifts3s1[16] = { 27, 27, 26, 26, 26, 26, 26, 26, 27, 26, 26, 26, 26, 26, 26, 27 }; + +#ifdef VECT_SIZE1 +#define BOX(i,n,S) u32x ((S)[(n)][(i)]) +#endif + +#ifdef VECT_SIZE2 +#define BOX(i,n,S) u32x ((S)[(n)][(i).s0], (S)[(n)][(i).s1]) +#endif + +#ifdef VECT_SIZE4 +#define BOX(i,n,S) u32x ((S)[(n)][(i).s0], (S)[(n)][(i).s1], (S)[(n)][(i).s2], (S)[(n)][(i).s3]) +#endif + +static void _des_crypt_encrypt (u32x iv[2], u32x data[2], u32x Kc[16], u32x Kd[16], __local u32 s_SPtrans[8][64]) +{ + u32x tt; + + u32x r = data[0]; + u32x l = data[1]; + + IP (r, l, tt); + + r = rotl32 (r, 3u); + l = rotl32 (l, 3u); + + #pragma unroll 16 + for (u32 i = 0; i < 16; i += 2) + { + u32x u; + u32x t; + + u = Kc[i + 0] ^ r; + t = Kd[i + 0] ^ rotl32 (r, 28u); + + l = l + ^ BOX (amd_bfe (u, 2, 6), 0, s_SPtrans) + ^ BOX (amd_bfe (u, 10, 6), 2, s_SPtrans) + ^ BOX (amd_bfe (u, 18, 6), 4, s_SPtrans) + ^ BOX (amd_bfe (u, 26, 6), 6, s_SPtrans) + ^ BOX (amd_bfe (t, 2, 6), 1, s_SPtrans) + ^ BOX (amd_bfe (t, 10, 6), 3, s_SPtrans) + ^ BOX (amd_bfe (t, 18, 6), 5, s_SPtrans) + ^ BOX (amd_bfe (t, 26, 6), 7, s_SPtrans); + + u = Kc[i + 1] ^ l; + t = Kd[i + 1] ^ rotl32 (l, 28u); + + r = r + ^ BOX (amd_bfe (u, 2, 6), 0, s_SPtrans) + ^ BOX (amd_bfe (u, 10, 6), 2, s_SPtrans) + ^ BOX (amd_bfe (u, 18, 6), 4, s_SPtrans) + ^ BOX (amd_bfe (u, 26, 6), 6, s_SPtrans) + ^ BOX (amd_bfe (t, 2, 6), 1, s_SPtrans) + ^ BOX (amd_bfe (t, 10, 6), 3, s_SPtrans) + ^ BOX (amd_bfe (t, 18, 6), 5, s_SPtrans) + ^ BOX (amd_bfe (t, 26, 6), 7, s_SPtrans); + } + + l = rotl32 (l, 29u); + r = rotl32 (r, 29u); + + FP (r, l, tt); + + iv[0] = l; + iv[1] = r; +} + +static void _des_crypt_keysetup (u32x c, u32x d, u32x Kc[16], u32x Kd[16], __local u32 s_skb[8][64]) +{ + u32x tt; + + PERM_OP (d, c, tt, 4, 0x0f0f0f0f); + HPERM_OP (c, tt, 2, 0xcccc0000); + HPERM_OP (d, tt, 2, 0xcccc0000); + PERM_OP (d, c, tt, 1, 0x55555555); + PERM_OP (c, d, tt, 8, 0x00ff00ff); + PERM_OP (d, c, tt, 1, 0x55555555); + + d = ((d & 0x000000ff) << 16) + | ((d & 0x0000ff00) << 0) + | ((d & 0x00ff0000) >> 16) + | ((c & 0xf0000000) >> 4); + + c = c & 0x0fffffff; + + #pragma unroll 16 + for (u32 i = 0; i < 16; i++) + { + c = c >> shifts3s0[i] | c << shifts3s1[i]; + d = d >> shifts3s0[i] | d << shifts3s1[i]; + + c = c & 0x0fffffff; + d = d & 0x0fffffff; + + u32x s = BOX ((( c >> 0) & 0x3f), 0, s_skb) + | BOX ((((c >> 6) & 0x03) + | ((c >> 7) & 0x3c)), 1, s_skb) + | BOX ((((c >> 13) & 0x0f) + | ((c >> 14) & 0x30)), 2, s_skb) + | BOX ((((c >> 20) & 0x01) + | ((c >> 21) & 0x06) + | ((c >> 22) & 0x38)), 3, s_skb); + + u32x t = BOX ((( d >> 0) & 0x3f), 4, s_skb) + | BOX ((((d >> 7) & 0x03) + | ((d >> 8) & 0x3c)), 5, s_skb) + | BOX ((((d >> 15) & 0x3f)), 6, s_skb) + | BOX ((((d >> 21) & 0x0f) + | ((d >> 22) & 0x30)), 7, s_skb); + + #if defined cl_amd_media_ops + Kc[i] = amd_bytealign (t, s << 16, 2); + Kd[i] = amd_bytealign (t >> 16, s, 2); + #else + Kc[i] = ((t << 16) | (s & 0x0000ffff)); + Kd[i] = ((s >> 16) | (t & 0xffff0000)); + #endif + + Kc[i] = rotl32 (Kc[i], 2u); + Kd[i] = rotl32 (Kd[i], 2u); + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m03100_m04 (__global pw_t *pws, __global gpu_rule_t * rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + u32x pw_buf1[4]; + + pw_buf1[0] = pws[gid].i[ 4]; + pw_buf1[1] = pws[gid].i[ 5]; + pw_buf1[2] = pws[gid].i[ 6]; + pw_buf1[3] = pws[gid].i[ 7]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * sbox, kbox + */ + + __local u32 s_SPtrans[8][64]; + __local u32 s_skb[8][64]; + + s_SPtrans[0][lid] = c_SPtrans[0][lid]; + s_SPtrans[1][lid] = c_SPtrans[1][lid]; + s_SPtrans[2][lid] = c_SPtrans[2][lid]; + s_SPtrans[3][lid] = c_SPtrans[3][lid]; + s_SPtrans[4][lid] = c_SPtrans[4][lid]; + s_SPtrans[5][lid] = c_SPtrans[5][lid]; + s_SPtrans[6][lid] = c_SPtrans[6][lid]; + s_SPtrans[7][lid] = c_SPtrans[7][lid]; + + s_skb[0][lid] = c_skb[0][lid]; + s_skb[1][lid] = c_skb[1][lid]; + s_skb[2][lid] = c_skb[2][lid]; + s_skb[3][lid] = c_skb[3][lid]; + s_skb[4][lid] = c_skb[4][lid]; + s_skb[5][lid] = c_skb[5][lid]; + s_skb[6][lid] = c_skb[6][lid]; + s_skb[7][lid] = c_skb[7][lid]; + + barrier (CLK_LOCAL_MEM_FENCE); + + if (gid >= gid_max) return; + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[7]; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + + w0[0] = pw_buf0[0]; + w0[1] = pw_buf0[1]; + w0[2] = pw_buf0[2]; + w0[3] = pw_buf0[3]; + + u32x w1[4]; + + w1[0] = pw_buf1[0]; + w1[1] = pw_buf1[1]; + w1[2] = pw_buf1[2]; + w1[3] = pw_buf1[3]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 out_len = apply_rules (rules_buf[il_pos].cmds, w0, w1, pw_len); + + const u32 salt_word_len = (salt_len + out_len) * 2; + + /** + * prepend salt + */ + + u32x w0_t[4]; + + w0_t[0] = w0[0]; + w0_t[1] = w0[1]; + w0_t[2] = w0[2]; + w0_t[3] = w0[3]; + + u32x w1_t[4]; + + w1_t[0] = w1[0]; + w1_t[1] = w1[1]; + w1_t[2] = w1[2]; + w1_t[3] = w1[3]; + + u32x w2_t[4]; + + w2_t[0] = w2[0]; + w2_t[1] = w2[1]; + w2_t[2] = w2[2]; + w2_t[3] = w2[3]; + + u32x w3_t[4]; + + w3_t[0] = w3[0]; + w3_t[1] = w3[1]; + w3_t[2] = w3[2]; + w3_t[3] = w3[3]; + + switch_buffer_by_offset (w0_t, w1_t, w2_t, w3_t, salt_len); + + w0_t[0] |= salt_buf0[0]; + w0_t[1] |= salt_buf0[1]; + w0_t[2] |= salt_buf0[2]; + w0_t[3] |= salt_buf0[3]; + w1_t[0] |= salt_buf1[0]; + w1_t[1] |= salt_buf1[1]; + w1_t[2] |= salt_buf1[2]; + w1_t[3] |= salt_buf1[3]; + + u32x dst[16]; + + dst[ 0] = w0_t[0]; + dst[ 1] = w0_t[1]; + dst[ 2] = w0_t[2]; + dst[ 3] = w0_t[3]; + dst[ 4] = w1_t[0]; + dst[ 5] = w1_t[1]; + dst[ 6] = w1_t[2]; + dst[ 7] = w1_t[3]; + dst[ 8] = w2_t[0]; + dst[ 9] = w2_t[1]; + dst[10] = w2_t[2]; + dst[11] = w2_t[3]; + dst[12] = 0; + dst[13] = 0; + dst[14] = 0; + dst[15] = 0; + + /** + * precompute key1 since key is static: 0x0123456789abcdef + * plus LEFT_ROTATE by 2 + */ + + u32x Kc[16]; + + Kc[ 0] = 0x64649040; + Kc[ 1] = 0x14909858; + Kc[ 2] = 0xc4b44888; + Kc[ 3] = 0x9094e438; + Kc[ 4] = 0xd8a004f0; + Kc[ 5] = 0xa8f02810; + Kc[ 6] = 0xc84048d8; + Kc[ 7] = 0x68d804a8; + Kc[ 8] = 0x0490e40c; + Kc[ 9] = 0xac183024; + Kc[10] = 0x24c07c10; + Kc[11] = 0x8c88c038; + Kc[12] = 0xc048c824; + Kc[13] = 0x4c0470a8; + Kc[14] = 0x584020b4; + Kc[15] = 0x00742c4c; + + u32x Kd[16]; + + Kd[ 0] = 0xa42ce40c; + Kd[ 1] = 0x64689858; + Kd[ 2] = 0x484050b8; + Kd[ 3] = 0xe8184814; + Kd[ 4] = 0x405cc070; + Kd[ 5] = 0xa010784c; + Kd[ 6] = 0x6074a800; + Kd[ 7] = 0x80701c1c; + Kd[ 8] = 0x9cd49430; + Kd[ 9] = 0x4c8ce078; + Kd[10] = 0x5c18c088; + Kd[11] = 0x28a8a4c8; + Kd[12] = 0x3c180838; + Kd[13] = 0xb0b86c20; + Kd[14] = 0xac84a094; + Kd[15] = 0x4ce0c0c4; + + /** + * key1 (generate key) + */ + + u32x iv[2]; + + iv[0] = 0; + iv[1] = 0; + + for (u32 j = 0, k = 0; j < salt_word_len; j += 8, k++) + { + u32x data[2]; + + data[0] = ((dst[k] << 16) & 0xff000000) | ((dst[k] << 8) & 0x0000ff00); + data[1] = ((dst[k] >> 0) & 0xff000000) | ((dst[k] >> 8) & 0x0000ff00); + + data[0] ^= iv[0]; + data[1] ^= iv[1]; + + _des_crypt_encrypt (iv, data, Kc, Kd, s_SPtrans); + } + + /** + * key2 (generate hash) + */ + + _des_crypt_keysetup (iv[0], iv[1], Kc, Kd, s_skb); + + iv[0] = 0; + iv[1] = 0; + + for (u32 j = 0, k = 0; j < salt_word_len; j += 8, k++) + { + u32x data[2]; + + data[0] = ((dst[k] << 16) & 0xff000000) | ((dst[k] << 8) & 0x0000ff00); + data[1] = ((dst[k] >> 0) & 0xff000000) | ((dst[k] >> 8) & 0x0000ff00); + + data[0] ^= iv[0]; + data[1] ^= iv[1]; + + _des_crypt_encrypt (iv, data, Kc, Kd, s_SPtrans); + } + + /** + * cmp + */ + + const u32x r0 = iv[0]; + const u32x r1 = iv[1]; + const u32x r2 = 0; + const u32x r3 = 0; + + #include VECT_COMPARE_M + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m03100_m08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m03100_m16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m03100_s04 (__global pw_t *pws, __global gpu_rule_t * rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + u32x pw_buf1[4]; + + pw_buf1[0] = pws[gid].i[ 4]; + pw_buf1[1] = pws[gid].i[ 5]; + pw_buf1[2] = pws[gid].i[ 6]; + pw_buf1[3] = pws[gid].i[ 7]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * sbox, kbox + */ + + __local u32 s_SPtrans[8][64]; + __local u32 s_skb[8][64]; + + s_SPtrans[0][lid] = c_SPtrans[0][lid]; + s_SPtrans[1][lid] = c_SPtrans[1][lid]; + s_SPtrans[2][lid] = c_SPtrans[2][lid]; + s_SPtrans[3][lid] = c_SPtrans[3][lid]; + s_SPtrans[4][lid] = c_SPtrans[4][lid]; + s_SPtrans[5][lid] = c_SPtrans[5][lid]; + s_SPtrans[6][lid] = c_SPtrans[6][lid]; + s_SPtrans[7][lid] = c_SPtrans[7][lid]; + + s_skb[0][lid] = c_skb[0][lid]; + s_skb[1][lid] = c_skb[1][lid]; + s_skb[2][lid] = c_skb[2][lid]; + s_skb[3][lid] = c_skb[3][lid]; + s_skb[4][lid] = c_skb[4][lid]; + s_skb[5][lid] = c_skb[5][lid]; + s_skb[6][lid] = c_skb[6][lid]; + s_skb[7][lid] = c_skb[7][lid]; + + barrier (CLK_LOCAL_MEM_FENCE); + + if (gid >= gid_max) return; + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[7]; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + + w0[0] = pw_buf0[0]; + w0[1] = pw_buf0[1]; + w0[2] = pw_buf0[2]; + w0[3] = pw_buf0[3]; + + u32x w1[4]; + + w1[0] = pw_buf1[0]; + w1[1] = pw_buf1[1]; + w1[2] = pw_buf1[2]; + w1[3] = pw_buf1[3]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 out_len = apply_rules (rules_buf[il_pos].cmds, w0, w1, pw_len); + + const u32 salt_word_len = (salt_len + out_len) * 2; + + /** + * prepend salt + */ + + u32x w0_t[4]; + + w0_t[0] = w0[0]; + w0_t[1] = w0[1]; + w0_t[2] = w0[2]; + w0_t[3] = w0[3]; + + u32x w1_t[4]; + + w1_t[0] = w1[0]; + w1_t[1] = w1[1]; + w1_t[2] = w1[2]; + w1_t[3] = w1[3]; + + u32x w2_t[4]; + + w2_t[0] = w2[0]; + w2_t[1] = w2[1]; + w2_t[2] = w2[2]; + w2_t[3] = w2[3]; + + u32x w3_t[4]; + + w3_t[0] = w3[0]; + w3_t[1] = w3[1]; + w3_t[2] = w3[2]; + w3_t[3] = w3[3]; + + switch_buffer_by_offset (w0_t, w1_t, w2_t, w3_t, salt_len); + + w0_t[0] |= salt_buf0[0]; + w0_t[1] |= salt_buf0[1]; + w0_t[2] |= salt_buf0[2]; + w0_t[3] |= salt_buf0[3]; + w1_t[0] |= salt_buf1[0]; + w1_t[1] |= salt_buf1[1]; + w1_t[2] |= salt_buf1[2]; + w1_t[3] |= salt_buf1[3]; + + u32x dst[16]; + + dst[ 0] = w0_t[0]; + dst[ 1] = w0_t[1]; + dst[ 2] = w0_t[2]; + dst[ 3] = w0_t[3]; + dst[ 4] = w1_t[0]; + dst[ 5] = w1_t[1]; + dst[ 6] = w1_t[2]; + dst[ 7] = w1_t[3]; + dst[ 8] = w2_t[0]; + dst[ 9] = w2_t[1]; + dst[10] = w2_t[2]; + dst[11] = w2_t[3]; + dst[12] = 0; + dst[13] = 0; + dst[14] = 0; + dst[15] = 0; + + /** + * precompute key1 since key is static: 0x0123456789abcdef + * plus LEFT_ROTATE by 2 + */ + + u32x Kc[16]; + + Kc[ 0] = 0x64649040; + Kc[ 1] = 0x14909858; + Kc[ 2] = 0xc4b44888; + Kc[ 3] = 0x9094e438; + Kc[ 4] = 0xd8a004f0; + Kc[ 5] = 0xa8f02810; + Kc[ 6] = 0xc84048d8; + Kc[ 7] = 0x68d804a8; + Kc[ 8] = 0x0490e40c; + Kc[ 9] = 0xac183024; + Kc[10] = 0x24c07c10; + Kc[11] = 0x8c88c038; + Kc[12] = 0xc048c824; + Kc[13] = 0x4c0470a8; + Kc[14] = 0x584020b4; + Kc[15] = 0x00742c4c; + + u32x Kd[16]; + + Kd[ 0] = 0xa42ce40c; + Kd[ 1] = 0x64689858; + Kd[ 2] = 0x484050b8; + Kd[ 3] = 0xe8184814; + Kd[ 4] = 0x405cc070; + Kd[ 5] = 0xa010784c; + Kd[ 6] = 0x6074a800; + Kd[ 7] = 0x80701c1c; + Kd[ 8] = 0x9cd49430; + Kd[ 9] = 0x4c8ce078; + Kd[10] = 0x5c18c088; + Kd[11] = 0x28a8a4c8; + Kd[12] = 0x3c180838; + Kd[13] = 0xb0b86c20; + Kd[14] = 0xac84a094; + Kd[15] = 0x4ce0c0c4; + + /** + * key1 (generate key) + */ + + u32x iv[2]; + + iv[0] = 0; + iv[1] = 0; + + for (u32 j = 0, k = 0; j < salt_word_len; j += 8, k++) + { + u32x data[2]; + + data[0] = ((dst[k] << 16) & 0xff000000) | ((dst[k] << 8) & 0x0000ff00); + data[1] = ((dst[k] >> 0) & 0xff000000) | ((dst[k] >> 8) & 0x0000ff00); + + data[0] ^= iv[0]; + data[1] ^= iv[1]; + + _des_crypt_encrypt (iv, data, Kc, Kd, s_SPtrans); + } + + /** + * key2 (generate hash) + */ + + _des_crypt_keysetup (iv[0], iv[1], Kc, Kd, s_skb); + + iv[0] = 0; + iv[1] = 0; + + for (u32 j = 0, k = 0; j < salt_word_len; j += 8, k++) + { + u32x data[2]; + + data[0] = ((dst[k] << 16) & 0xff000000) | ((dst[k] << 8) & 0x0000ff00); + data[1] = ((dst[k] >> 0) & 0xff000000) | ((dst[k] >> 8) & 0x0000ff00); + + data[0] ^= iv[0]; + data[1] ^= iv[1]; + + _des_crypt_encrypt (iv, data, Kc, Kd, s_SPtrans); + } + + /** + * cmp + */ + + const u32x r0 = iv[0]; + const u32x r1 = iv[1]; + const u32x r2 = 0; + const u32x r3 = 0; + + #include VECT_COMPARE_S + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m03100_s08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m03100_s16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/amd/m03100_a1.cl b/amd/m03100_a1.cl new file mode 100644 index 0000000000..51de5ba1e1 --- /dev/null +++ b/amd/m03100_a1.cl @@ -0,0 +1,1172 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _DES_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW4 +#define VECT_SIZE2 +#endif + +#ifdef VLIW5 +#define VECT_SIZE2 +#endif + +#define DGST_R0 0 +#define DGST_R1 1 +#define DGST_R2 2 +#define DGST_R3 3 + +#include "include/kernel_functions.c" +#include "types_amd.c" +#include "common_amd.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +#define PERM_OP(a,b,tt,n,m) \ +{ \ + tt = a >> n; \ + tt = tt ^ b; \ + tt = tt & m; \ + b = b ^ tt; \ + tt = tt << n; \ + a = a ^ tt; \ +} + +#define HPERM_OP(a,tt,n,m) \ +{ \ + tt = a << (16 + n); \ + tt = tt ^ a; \ + tt = tt & m; \ + a = a ^ tt; \ + tt = tt >> (16 + n); \ + a = a ^ tt; \ +} + +#define IP(l,r,tt) \ +{ \ + PERM_OP (r, l, tt, 4, 0x0f0f0f0f); \ + PERM_OP (l, r, tt, 16, 0x0000ffff); \ + PERM_OP (r, l, tt, 2, 0x33333333); \ + PERM_OP (l, r, tt, 8, 0x00ff00ff); \ + PERM_OP (r, l, tt, 1, 0x55555555); \ +} + +#define FP(l,r,tt) \ +{ \ + PERM_OP (l, r, tt, 1, 0x55555555); \ + PERM_OP (r, l, tt, 8, 0x00ff00ff); \ + PERM_OP (l, r, tt, 2, 0x33333333); \ + PERM_OP (r, l, tt, 16, 0x0000ffff); \ + PERM_OP (l, r, tt, 4, 0x0f0f0f0f); \ +} + +__constant u32 c_SPtrans[8][64] = +{ + /* nibble 0 */ + 0x02080800, 0x00080000, 0x02000002, 0x02080802, + 0x02000000, 0x00080802, 0x00080002, 0x02000002, + 0x00080802, 0x02080800, 0x02080000, 0x00000802, + 0x02000802, 0x02000000, 0x00000000, 0x00080002, + 0x00080000, 0x00000002, 0x02000800, 0x00080800, + 0x02080802, 0x02080000, 0x00000802, 0x02000800, + 0x00000002, 0x00000800, 0x00080800, 0x02080002, + 0x00000800, 0x02000802, 0x02080002, 0x00000000, + 0x00000000, 0x02080802, 0x02000800, 0x00080002, + 0x02080800, 0x00080000, 0x00000802, 0x02000800, + 0x02080002, 0x00000800, 0x00080800, 0x02000002, + 0x00080802, 0x00000002, 0x02000002, 0x02080000, + 0x02080802, 0x00080800, 0x02080000, 0x02000802, + 0x02000000, 0x00000802, 0x00080002, 0x00000000, + 0x00080000, 0x02000000, 0x02000802, 0x02080800, + 0x00000002, 0x02080002, 0x00000800, 0x00080802, + /* nibble 1 */ + 0x40108010, 0x00000000, 0x00108000, 0x40100000, + 0x40000010, 0x00008010, 0x40008000, 0x00108000, + 0x00008000, 0x40100010, 0x00000010, 0x40008000, + 0x00100010, 0x40108000, 0x40100000, 0x00000010, + 0x00100000, 0x40008010, 0x40100010, 0x00008000, + 0x00108010, 0x40000000, 0x00000000, 0x00100010, + 0x40008010, 0x00108010, 0x40108000, 0x40000010, + 0x40000000, 0x00100000, 0x00008010, 0x40108010, + 0x00100010, 0x40108000, 0x40008000, 0x00108010, + 0x40108010, 0x00100010, 0x40000010, 0x00000000, + 0x40000000, 0x00008010, 0x00100000, 0x40100010, + 0x00008000, 0x40000000, 0x00108010, 0x40008010, + 0x40108000, 0x00008000, 0x00000000, 0x40000010, + 0x00000010, 0x40108010, 0x00108000, 0x40100000, + 0x40100010, 0x00100000, 0x00008010, 0x40008000, + 0x40008010, 0x00000010, 0x40100000, 0x00108000, + /* nibble 2 */ + 0x04000001, 0x04040100, 0x00000100, 0x04000101, + 0x00040001, 0x04000000, 0x04000101, 0x00040100, + 0x04000100, 0x00040000, 0x04040000, 0x00000001, + 0x04040101, 0x00000101, 0x00000001, 0x04040001, + 0x00000000, 0x00040001, 0x04040100, 0x00000100, + 0x00000101, 0x04040101, 0x00040000, 0x04000001, + 0x04040001, 0x04000100, 0x00040101, 0x04040000, + 0x00040100, 0x00000000, 0x04000000, 0x00040101, + 0x04040100, 0x00000100, 0x00000001, 0x00040000, + 0x00000101, 0x00040001, 0x04040000, 0x04000101, + 0x00000000, 0x04040100, 0x00040100, 0x04040001, + 0x00040001, 0x04000000, 0x04040101, 0x00000001, + 0x00040101, 0x04000001, 0x04000000, 0x04040101, + 0x00040000, 0x04000100, 0x04000101, 0x00040100, + 0x04000100, 0x00000000, 0x04040001, 0x00000101, + 0x04000001, 0x00040101, 0x00000100, 0x04040000, + /* nibble 3 */ + 0x00401008, 0x10001000, 0x00000008, 0x10401008, + 0x00000000, 0x10400000, 0x10001008, 0x00400008, + 0x10401000, 0x10000008, 0x10000000, 0x00001008, + 0x10000008, 0x00401008, 0x00400000, 0x10000000, + 0x10400008, 0x00401000, 0x00001000, 0x00000008, + 0x00401000, 0x10001008, 0x10400000, 0x00001000, + 0x00001008, 0x00000000, 0x00400008, 0x10401000, + 0x10001000, 0x10400008, 0x10401008, 0x00400000, + 0x10400008, 0x00001008, 0x00400000, 0x10000008, + 0x00401000, 0x10001000, 0x00000008, 0x10400000, + 0x10001008, 0x00000000, 0x00001000, 0x00400008, + 0x00000000, 0x10400008, 0x10401000, 0x00001000, + 0x10000000, 0x10401008, 0x00401008, 0x00400000, + 0x10401008, 0x00000008, 0x10001000, 0x00401008, + 0x00400008, 0x00401000, 0x10400000, 0x10001008, + 0x00001008, 0x10000000, 0x10000008, 0x10401000, + /* nibble 4 */ + 0x08000000, 0x00010000, 0x00000400, 0x08010420, + 0x08010020, 0x08000400, 0x00010420, 0x08010000, + 0x00010000, 0x00000020, 0x08000020, 0x00010400, + 0x08000420, 0x08010020, 0x08010400, 0x00000000, + 0x00010400, 0x08000000, 0x00010020, 0x00000420, + 0x08000400, 0x00010420, 0x00000000, 0x08000020, + 0x00000020, 0x08000420, 0x08010420, 0x00010020, + 0x08010000, 0x00000400, 0x00000420, 0x08010400, + 0x08010400, 0x08000420, 0x00010020, 0x08010000, + 0x00010000, 0x00000020, 0x08000020, 0x08000400, + 0x08000000, 0x00010400, 0x08010420, 0x00000000, + 0x00010420, 0x08000000, 0x00000400, 0x00010020, + 0x08000420, 0x00000400, 0x00000000, 0x08010420, + 0x08010020, 0x08010400, 0x00000420, 0x00010000, + 0x00010400, 0x08010020, 0x08000400, 0x00000420, + 0x00000020, 0x00010420, 0x08010000, 0x08000020, + /* nibble 5 */ + 0x80000040, 0x00200040, 0x00000000, 0x80202000, + 0x00200040, 0x00002000, 0x80002040, 0x00200000, + 0x00002040, 0x80202040, 0x00202000, 0x80000000, + 0x80002000, 0x80000040, 0x80200000, 0x00202040, + 0x00200000, 0x80002040, 0x80200040, 0x00000000, + 0x00002000, 0x00000040, 0x80202000, 0x80200040, + 0x80202040, 0x80200000, 0x80000000, 0x00002040, + 0x00000040, 0x00202000, 0x00202040, 0x80002000, + 0x00002040, 0x80000000, 0x80002000, 0x00202040, + 0x80202000, 0x00200040, 0x00000000, 0x80002000, + 0x80000000, 0x00002000, 0x80200040, 0x00200000, + 0x00200040, 0x80202040, 0x00202000, 0x00000040, + 0x80202040, 0x00202000, 0x00200000, 0x80002040, + 0x80000040, 0x80200000, 0x00202040, 0x00000000, + 0x00002000, 0x80000040, 0x80002040, 0x80202000, + 0x80200000, 0x00002040, 0x00000040, 0x80200040, + /* nibble 6 */ + 0x00004000, 0x00000200, 0x01000200, 0x01000004, + 0x01004204, 0x00004004, 0x00004200, 0x00000000, + 0x01000000, 0x01000204, 0x00000204, 0x01004000, + 0x00000004, 0x01004200, 0x01004000, 0x00000204, + 0x01000204, 0x00004000, 0x00004004, 0x01004204, + 0x00000000, 0x01000200, 0x01000004, 0x00004200, + 0x01004004, 0x00004204, 0x01004200, 0x00000004, + 0x00004204, 0x01004004, 0x00000200, 0x01000000, + 0x00004204, 0x01004000, 0x01004004, 0x00000204, + 0x00004000, 0x00000200, 0x01000000, 0x01004004, + 0x01000204, 0x00004204, 0x00004200, 0x00000000, + 0x00000200, 0x01000004, 0x00000004, 0x01000200, + 0x00000000, 0x01000204, 0x01000200, 0x00004200, + 0x00000204, 0x00004000, 0x01004204, 0x01000000, + 0x01004200, 0x00000004, 0x00004004, 0x01004204, + 0x01000004, 0x01004200, 0x01004000, 0x00004004, + /* nibble 7 */ + 0x20800080, 0x20820000, 0x00020080, 0x00000000, + 0x20020000, 0x00800080, 0x20800000, 0x20820080, + 0x00000080, 0x20000000, 0x00820000, 0x00020080, + 0x00820080, 0x20020080, 0x20000080, 0x20800000, + 0x00020000, 0x00820080, 0x00800080, 0x20020000, + 0x20820080, 0x20000080, 0x00000000, 0x00820000, + 0x20000000, 0x00800000, 0x20020080, 0x20800080, + 0x00800000, 0x00020000, 0x20820000, 0x00000080, + 0x00800000, 0x00020000, 0x20000080, 0x20820080, + 0x00020080, 0x20000000, 0x00000000, 0x00820000, + 0x20800080, 0x20020080, 0x20020000, 0x00800080, + 0x20820000, 0x00000080, 0x00800080, 0x20020000, + 0x20820080, 0x00800000, 0x20800000, 0x20000080, + 0x00820000, 0x00020080, 0x20020080, 0x20800000, + 0x00000080, 0x20820000, 0x00820080, 0x00000000, + 0x20000000, 0x20800080, 0x00020000, 0x00820080, +}; + +__constant u32 c_skb[8][64] = +{ + /* for C bits (numbered as per FIPS 46) 1 2 3 4 5 6 */ + 0x00000000, 0x00000010, 0x20000000, 0x20000010, + 0x00010000, 0x00010010, 0x20010000, 0x20010010, + 0x00000800, 0x00000810, 0x20000800, 0x20000810, + 0x00010800, 0x00010810, 0x20010800, 0x20010810, + 0x00000020, 0x00000030, 0x20000020, 0x20000030, + 0x00010020, 0x00010030, 0x20010020, 0x20010030, + 0x00000820, 0x00000830, 0x20000820, 0x20000830, + 0x00010820, 0x00010830, 0x20010820, 0x20010830, + 0x00080000, 0x00080010, 0x20080000, 0x20080010, + 0x00090000, 0x00090010, 0x20090000, 0x20090010, + 0x00080800, 0x00080810, 0x20080800, 0x20080810, + 0x00090800, 0x00090810, 0x20090800, 0x20090810, + 0x00080020, 0x00080030, 0x20080020, 0x20080030, + 0x00090020, 0x00090030, 0x20090020, 0x20090030, + 0x00080820, 0x00080830, 0x20080820, 0x20080830, + 0x00090820, 0x00090830, 0x20090820, 0x20090830, + /* for C bits (numbered as per FIPS 46) 7 8 10 11 12 13 */ + 0x00000000, 0x02000000, 0x00002000, 0x02002000, + 0x00200000, 0x02200000, 0x00202000, 0x02202000, + 0x00000004, 0x02000004, 0x00002004, 0x02002004, + 0x00200004, 0x02200004, 0x00202004, 0x02202004, + 0x00000400, 0x02000400, 0x00002400, 0x02002400, + 0x00200400, 0x02200400, 0x00202400, 0x02202400, + 0x00000404, 0x02000404, 0x00002404, 0x02002404, + 0x00200404, 0x02200404, 0x00202404, 0x02202404, + 0x10000000, 0x12000000, 0x10002000, 0x12002000, + 0x10200000, 0x12200000, 0x10202000, 0x12202000, + 0x10000004, 0x12000004, 0x10002004, 0x12002004, + 0x10200004, 0x12200004, 0x10202004, 0x12202004, + 0x10000400, 0x12000400, 0x10002400, 0x12002400, + 0x10200400, 0x12200400, 0x10202400, 0x12202400, + 0x10000404, 0x12000404, 0x10002404, 0x12002404, + 0x10200404, 0x12200404, 0x10202404, 0x12202404, + /* for C bits (numbered as per FIPS 46) 14 15 16 17 19 20 */ + 0x00000000, 0x00000001, 0x00040000, 0x00040001, + 0x01000000, 0x01000001, 0x01040000, 0x01040001, + 0x00000002, 0x00000003, 0x00040002, 0x00040003, + 0x01000002, 0x01000003, 0x01040002, 0x01040003, + 0x00000200, 0x00000201, 0x00040200, 0x00040201, + 0x01000200, 0x01000201, 0x01040200, 0x01040201, + 0x00000202, 0x00000203, 0x00040202, 0x00040203, + 0x01000202, 0x01000203, 0x01040202, 0x01040203, + 0x08000000, 0x08000001, 0x08040000, 0x08040001, + 0x09000000, 0x09000001, 0x09040000, 0x09040001, + 0x08000002, 0x08000003, 0x08040002, 0x08040003, + 0x09000002, 0x09000003, 0x09040002, 0x09040003, + 0x08000200, 0x08000201, 0x08040200, 0x08040201, + 0x09000200, 0x09000201, 0x09040200, 0x09040201, + 0x08000202, 0x08000203, 0x08040202, 0x08040203, + 0x09000202, 0x09000203, 0x09040202, 0x09040203, + /* for C bits (numbered as per FIPS 46) 21 23 24 26 27 28 */ + 0x00000000, 0x00100000, 0x00000100, 0x00100100, + 0x00000008, 0x00100008, 0x00000108, 0x00100108, + 0x00001000, 0x00101000, 0x00001100, 0x00101100, + 0x00001008, 0x00101008, 0x00001108, 0x00101108, + 0x04000000, 0x04100000, 0x04000100, 0x04100100, + 0x04000008, 0x04100008, 0x04000108, 0x04100108, + 0x04001000, 0x04101000, 0x04001100, 0x04101100, + 0x04001008, 0x04101008, 0x04001108, 0x04101108, + 0x00020000, 0x00120000, 0x00020100, 0x00120100, + 0x00020008, 0x00120008, 0x00020108, 0x00120108, + 0x00021000, 0x00121000, 0x00021100, 0x00121100, + 0x00021008, 0x00121008, 0x00021108, 0x00121108, + 0x04020000, 0x04120000, 0x04020100, 0x04120100, + 0x04020008, 0x04120008, 0x04020108, 0x04120108, + 0x04021000, 0x04121000, 0x04021100, 0x04121100, + 0x04021008, 0x04121008, 0x04021108, 0x04121108, + /* for D bits (numbered as per FIPS 46) 1 2 3 4 5 6 */ + 0x00000000, 0x10000000, 0x00010000, 0x10010000, + 0x00000004, 0x10000004, 0x00010004, 0x10010004, + 0x20000000, 0x30000000, 0x20010000, 0x30010000, + 0x20000004, 0x30000004, 0x20010004, 0x30010004, + 0x00100000, 0x10100000, 0x00110000, 0x10110000, + 0x00100004, 0x10100004, 0x00110004, 0x10110004, + 0x20100000, 0x30100000, 0x20110000, 0x30110000, + 0x20100004, 0x30100004, 0x20110004, 0x30110004, + 0x00001000, 0x10001000, 0x00011000, 0x10011000, + 0x00001004, 0x10001004, 0x00011004, 0x10011004, + 0x20001000, 0x30001000, 0x20011000, 0x30011000, + 0x20001004, 0x30001004, 0x20011004, 0x30011004, + 0x00101000, 0x10101000, 0x00111000, 0x10111000, + 0x00101004, 0x10101004, 0x00111004, 0x10111004, + 0x20101000, 0x30101000, 0x20111000, 0x30111000, + 0x20101004, 0x30101004, 0x20111004, 0x30111004, + /* for D bits (numbered as per FIPS 46) 8 9 11 12 13 14 */ + 0x00000000, 0x08000000, 0x00000008, 0x08000008, + 0x00000400, 0x08000400, 0x00000408, 0x08000408, + 0x00020000, 0x08020000, 0x00020008, 0x08020008, + 0x00020400, 0x08020400, 0x00020408, 0x08020408, + 0x00000001, 0x08000001, 0x00000009, 0x08000009, + 0x00000401, 0x08000401, 0x00000409, 0x08000409, + 0x00020001, 0x08020001, 0x00020009, 0x08020009, + 0x00020401, 0x08020401, 0x00020409, 0x08020409, + 0x02000000, 0x0A000000, 0x02000008, 0x0A000008, + 0x02000400, 0x0A000400, 0x02000408, 0x0A000408, + 0x02020000, 0x0A020000, 0x02020008, 0x0A020008, + 0x02020400, 0x0A020400, 0x02020408, 0x0A020408, + 0x02000001, 0x0A000001, 0x02000009, 0x0A000009, + 0x02000401, 0x0A000401, 0x02000409, 0x0A000409, + 0x02020001, 0x0A020001, 0x02020009, 0x0A020009, + 0x02020401, 0x0A020401, 0x02020409, 0x0A020409, + /* for D bits (numbered as per FIPS 46) 16 17 18 19 20 21 */ + 0x00000000, 0x00000100, 0x00080000, 0x00080100, + 0x01000000, 0x01000100, 0x01080000, 0x01080100, + 0x00000010, 0x00000110, 0x00080010, 0x00080110, + 0x01000010, 0x01000110, 0x01080010, 0x01080110, + 0x00200000, 0x00200100, 0x00280000, 0x00280100, + 0x01200000, 0x01200100, 0x01280000, 0x01280100, + 0x00200010, 0x00200110, 0x00280010, 0x00280110, + 0x01200010, 0x01200110, 0x01280010, 0x01280110, + 0x00000200, 0x00000300, 0x00080200, 0x00080300, + 0x01000200, 0x01000300, 0x01080200, 0x01080300, + 0x00000210, 0x00000310, 0x00080210, 0x00080310, + 0x01000210, 0x01000310, 0x01080210, 0x01080310, + 0x00200200, 0x00200300, 0x00280200, 0x00280300, + 0x01200200, 0x01200300, 0x01280200, 0x01280300, + 0x00200210, 0x00200310, 0x00280210, 0x00280310, + 0x01200210, 0x01200310, 0x01280210, 0x01280310, + /* for D bits (numbered as per FIPS 46) 22 23 24 25 27 28 */ + 0x00000000, 0x04000000, 0x00040000, 0x04040000, + 0x00000002, 0x04000002, 0x00040002, 0x04040002, + 0x00002000, 0x04002000, 0x00042000, 0x04042000, + 0x00002002, 0x04002002, 0x00042002, 0x04042002, + 0x00000020, 0x04000020, 0x00040020, 0x04040020, + 0x00000022, 0x04000022, 0x00040022, 0x04040022, + 0x00002020, 0x04002020, 0x00042020, 0x04042020, + 0x00002022, 0x04002022, 0x00042022, 0x04042022, + 0x00000800, 0x04000800, 0x00040800, 0x04040800, + 0x00000802, 0x04000802, 0x00040802, 0x04040802, + 0x00002800, 0x04002800, 0x00042800, 0x04042800, + 0x00002802, 0x04002802, 0x00042802, 0x04042802, + 0x00000820, 0x04000820, 0x00040820, 0x04040820, + 0x00000822, 0x04000822, 0x00040822, 0x04040822, + 0x00002820, 0x04002820, 0x00042820, 0x04042820, + 0x00002822, 0x04002822, 0x00042822, 0x04042822 +}; + +__constant u32 shifts3s0[16] = { 1, 1, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 1 }; +__constant u32 shifts3s1[16] = { 27, 27, 26, 26, 26, 26, 26, 26, 27, 26, 26, 26, 26, 26, 26, 27 }; + +#ifdef VECT_SIZE1 +#define BOX(i,n,S) u32x ((S)[(n)][(i)]) +#endif + +#ifdef VECT_SIZE2 +#define BOX(i,n,S) u32x ((S)[(n)][(i).s0], (S)[(n)][(i).s1]) +#endif + +#ifdef VECT_SIZE4 +#define BOX(i,n,S) u32x ((S)[(n)][(i).s0], (S)[(n)][(i).s1], (S)[(n)][(i).s2], (S)[(n)][(i).s3]) +#endif + +static void _des_crypt_encrypt (u32x iv[2], u32x data[2], u32x Kc[16], u32x Kd[16], __local u32 s_SPtrans[8][64]) +{ + u32x tt; + + u32x r = data[0]; + u32x l = data[1]; + + IP (r, l, tt); + + r = rotl32 (r, 3u); + l = rotl32 (l, 3u); + + #pragma unroll 16 + for (u32 i = 0; i < 16; i += 2) + { + u32x u; + u32x t; + + u = Kc[i + 0] ^ r; + t = Kd[i + 0] ^ rotl32 (r, 28u); + + l = l + ^ BOX (amd_bfe (u, 2, 6), 0, s_SPtrans) + ^ BOX (amd_bfe (u, 10, 6), 2, s_SPtrans) + ^ BOX (amd_bfe (u, 18, 6), 4, s_SPtrans) + ^ BOX (amd_bfe (u, 26, 6), 6, s_SPtrans) + ^ BOX (amd_bfe (t, 2, 6), 1, s_SPtrans) + ^ BOX (amd_bfe (t, 10, 6), 3, s_SPtrans) + ^ BOX (amd_bfe (t, 18, 6), 5, s_SPtrans) + ^ BOX (amd_bfe (t, 26, 6), 7, s_SPtrans); + + u = Kc[i + 1] ^ l; + t = Kd[i + 1] ^ rotl32 (l, 28u); + + r = r + ^ BOX (amd_bfe (u, 2, 6), 0, s_SPtrans) + ^ BOX (amd_bfe (u, 10, 6), 2, s_SPtrans) + ^ BOX (amd_bfe (u, 18, 6), 4, s_SPtrans) + ^ BOX (amd_bfe (u, 26, 6), 6, s_SPtrans) + ^ BOX (amd_bfe (t, 2, 6), 1, s_SPtrans) + ^ BOX (amd_bfe (t, 10, 6), 3, s_SPtrans) + ^ BOX (amd_bfe (t, 18, 6), 5, s_SPtrans) + ^ BOX (amd_bfe (t, 26, 6), 7, s_SPtrans); + } + + l = rotl32 (l, 29u); + r = rotl32 (r, 29u); + + FP (r, l, tt); + + iv[0] = l; + iv[1] = r; +} + +static void _des_crypt_keysetup (u32x c, u32x d, u32x Kc[16], u32x Kd[16], __local u32 s_skb[8][64]) +{ + u32x tt; + + PERM_OP (d, c, tt, 4, 0x0f0f0f0f); + HPERM_OP (c, tt, 2, 0xcccc0000); + HPERM_OP (d, tt, 2, 0xcccc0000); + PERM_OP (d, c, tt, 1, 0x55555555); + PERM_OP (c, d, tt, 8, 0x00ff00ff); + PERM_OP (d, c, tt, 1, 0x55555555); + + d = ((d & 0x000000ff) << 16) + | ((d & 0x0000ff00) << 0) + | ((d & 0x00ff0000) >> 16) + | ((c & 0xf0000000) >> 4); + + c = c & 0x0fffffff; + + #pragma unroll 16 + for (u32 i = 0; i < 16; i++) + { + c = c >> shifts3s0[i] | c << shifts3s1[i]; + d = d >> shifts3s0[i] | d << shifts3s1[i]; + + c = c & 0x0fffffff; + d = d & 0x0fffffff; + + u32x s = BOX ((( c >> 0) & 0x3f), 0, s_skb) + | BOX ((((c >> 6) & 0x03) + | ((c >> 7) & 0x3c)), 1, s_skb) + | BOX ((((c >> 13) & 0x0f) + | ((c >> 14) & 0x30)), 2, s_skb) + | BOX ((((c >> 20) & 0x01) + | ((c >> 21) & 0x06) + | ((c >> 22) & 0x38)), 3, s_skb); + + u32x t = BOX ((( d >> 0) & 0x3f), 4, s_skb) + | BOX ((((d >> 7) & 0x03) + | ((d >> 8) & 0x3c)), 5, s_skb) + | BOX ((((d >> 15) & 0x3f)), 6, s_skb) + | BOX ((((d >> 21) & 0x0f) + | ((d >> 22) & 0x30)), 7, s_skb); + + #if defined cl_amd_media_ops + Kc[i] = amd_bytealign (t, s << 16, 2); + Kd[i] = amd_bytealign (t >> 16, s, 2); + #else + Kc[i] = ((t << 16) | (s & 0x0000ffff)); + Kd[i] = ((s >> 16) | (t & 0xffff0000)); + #endif + + Kc[i] = rotl32 (Kc[i], 2u); + Kd[i] = rotl32 (Kd[i], 2u); + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m03100_m04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, combs_buf[0].pw_len); + } + + /** + * sbox, kbox + */ + + __local u32 s_SPtrans[8][64]; + + __local u32 s_skb[8][64]; + + s_SPtrans[0][lid] = c_SPtrans[0][lid]; + s_SPtrans[1][lid] = c_SPtrans[1][lid]; + s_SPtrans[2][lid] = c_SPtrans[2][lid]; + s_SPtrans[3][lid] = c_SPtrans[3][lid]; + s_SPtrans[4][lid] = c_SPtrans[4][lid]; + s_SPtrans[5][lid] = c_SPtrans[5][lid]; + s_SPtrans[6][lid] = c_SPtrans[6][lid]; + s_SPtrans[7][lid] = c_SPtrans[7][lid]; + + s_skb[0][lid] = c_skb[0][lid]; + s_skb[1][lid] = c_skb[1][lid]; + s_skb[2][lid] = c_skb[2][lid]; + s_skb[3][lid] = c_skb[3][lid]; + s_skb[4][lid] = c_skb[4][lid]; + s_skb[5][lid] = c_skb[5][lid]; + s_skb[6][lid] = c_skb[6][lid]; + s_skb[7][lid] = c_skb[7][lid]; + + barrier (CLK_LOCAL_MEM_FENCE); + + if (gid >= gid_max) return; + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[7]; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = combs_buf[il_pos].pw_len; + + const u32 pw_len = pw_l_len + pw_r_len; + + const u32 salt_word_len = (salt_len + pw_len) * 2; + + u32 wordr0[4]; + + wordr0[0] = combs_buf[il_pos].i[0]; + wordr0[1] = combs_buf[il_pos].i[1]; + wordr0[2] = combs_buf[il_pos].i[2]; + wordr0[3] = combs_buf[il_pos].i[3]; + + u32 wordr1[4]; + + wordr1[0] = combs_buf[il_pos].i[4]; + wordr1[1] = combs_buf[il_pos].i[5]; + wordr1[2] = combs_buf[il_pos].i[6]; + wordr1[3] = combs_buf[il_pos].i[7]; + + u32 wordr2[4]; + + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + + u32 wordr3[4]; + + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + u32x w0[4]; + + w0[0] = wordl0[0] | wordr0[0]; + w0[1] = wordl0[1] | wordr0[1]; + w0[2] = wordl0[2] | wordr0[2]; + w0[3] = wordl0[3] | wordr0[3]; + + u32x w1[4]; + + w1[0] = wordl1[0] | wordr1[0]; + w1[1] = wordl1[1] | wordr1[1]; + w1[2] = wordl1[2] | wordr1[2]; + w1[3] = wordl1[3] | wordr1[3]; + + u32x w2[4]; + + w2[0] = wordl2[0] | wordr2[0]; + w2[1] = wordl2[1] | wordr2[1]; + w2[2] = wordl2[2] | wordr2[2]; + w2[3] = wordl2[3] | wordr2[3]; + + u32x w3[4]; + + w3[0] = wordl3[0] | wordr3[0]; + w3[1] = wordl3[1] | wordr3[1]; + w3[2] = wordl3[2] | wordr3[2]; + w3[3] = wordl3[3] | wordr3[3]; + + /** + * prepend salt + */ + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + w0_t[0] = w0[0]; + w0_t[1] = w0[1]; + w0_t[2] = w0[2]; + w0_t[3] = w0[3]; + w1_t[0] = w1[0]; + w1_t[1] = w1[1]; + w1_t[2] = w1[2]; + w1_t[3] = w1[3]; + w2_t[0] = w2[0]; + w2_t[1] = w2[1]; + w2_t[2] = w2[2]; + w2_t[3] = w2[3]; + w3_t[0] = w3[0]; + w3_t[1] = w3[1]; + w3_t[2] = w3[2]; + w3_t[3] = w3[3]; + + switch_buffer_by_offset (w0_t, w1_t, w2_t, w3_t, salt_len); + + w0_t[0] |= salt_buf0[0]; + w0_t[1] |= salt_buf0[1]; + w0_t[2] |= salt_buf0[2]; + w0_t[3] |= salt_buf0[3]; + w1_t[0] |= salt_buf1[0]; + w1_t[1] |= salt_buf1[1]; + w1_t[2] |= salt_buf1[2]; + w1_t[3] |= salt_buf1[3]; + + u32x dst[16]; + + dst[ 0] = w0_t[0]; + dst[ 1] = w0_t[1]; + dst[ 2] = w0_t[2]; + dst[ 3] = w0_t[3]; + dst[ 4] = w1_t[0]; + dst[ 5] = w1_t[1]; + dst[ 6] = w1_t[2]; + dst[ 7] = w1_t[3]; + dst[ 8] = w2_t[0]; + dst[ 9] = w2_t[1]; + dst[10] = w2_t[2]; + dst[11] = w2_t[3]; + dst[12] = 0; + dst[13] = 0; + dst[14] = 0; + dst[15] = 0; + + /** + * precompute key1 since key is static: 0x0123456789abcdef + * plus LEFT_ROTATE by 2 + */ + + u32x Kc[16]; + + Kc[ 0] = 0x64649040; + Kc[ 1] = 0x14909858; + Kc[ 2] = 0xc4b44888; + Kc[ 3] = 0x9094e438; + Kc[ 4] = 0xd8a004f0; + Kc[ 5] = 0xa8f02810; + Kc[ 6] = 0xc84048d8; + Kc[ 7] = 0x68d804a8; + Kc[ 8] = 0x0490e40c; + Kc[ 9] = 0xac183024; + Kc[10] = 0x24c07c10; + Kc[11] = 0x8c88c038; + Kc[12] = 0xc048c824; + Kc[13] = 0x4c0470a8; + Kc[14] = 0x584020b4; + Kc[15] = 0x00742c4c; + + u32x Kd[16]; + + Kd[ 0] = 0xa42ce40c; + Kd[ 1] = 0x64689858; + Kd[ 2] = 0x484050b8; + Kd[ 3] = 0xe8184814; + Kd[ 4] = 0x405cc070; + Kd[ 5] = 0xa010784c; + Kd[ 6] = 0x6074a800; + Kd[ 7] = 0x80701c1c; + Kd[ 8] = 0x9cd49430; + Kd[ 9] = 0x4c8ce078; + Kd[10] = 0x5c18c088; + Kd[11] = 0x28a8a4c8; + Kd[12] = 0x3c180838; + Kd[13] = 0xb0b86c20; + Kd[14] = 0xac84a094; + Kd[15] = 0x4ce0c0c4; + + /** + * key1 (generate key) + */ + + u32x iv[2]; + + iv[0] = 0; + iv[1] = 0; + + for (u32 j = 0, k = 0; j < salt_word_len; j += 8, k++) + { + u32x data[2]; + + data[0] = ((dst[k] << 16) & 0xff000000) | ((dst[k] << 8) & 0x0000ff00); + data[1] = ((dst[k] >> 0) & 0xff000000) | ((dst[k] >> 8) & 0x0000ff00); + + data[0] ^= iv[0]; + data[1] ^= iv[1]; + + _des_crypt_encrypt (iv, data, Kc, Kd, s_SPtrans); + } + + /** + * key2 (generate hash) + */ + + _des_crypt_keysetup (iv[0], iv[1], Kc, Kd, s_skb); + + iv[0] = 0; + iv[1] = 0; + + for (u32 j = 0, k = 0; j < salt_word_len; j += 8, k++) + { + u32x data[2]; + + data[0] = ((dst[k] << 16) & 0xff000000) | ((dst[k] << 8) & 0x0000ff00); + data[1] = ((dst[k] >> 0) & 0xff000000) | ((dst[k] >> 8) & 0x0000ff00); + + data[0] ^= iv[0]; + data[1] ^= iv[1]; + + _des_crypt_encrypt (iv, data, Kc, Kd, s_SPtrans); + } + + /** + * cmp + */ + + const u32x r0 = iv[0]; + const u32x r1 = iv[1]; + const u32x r2 = 0; + const u32x r3 = 0; + + #include VECT_COMPARE_M + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m03100_m08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m03100_m16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m03100_s04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, combs_buf[0].pw_len); + } + + /** + * sbox, kbox + */ + + __local u32 s_SPtrans[8][64]; + + __local u32 s_skb[8][64]; + + s_SPtrans[0][lid] = c_SPtrans[0][lid]; + s_SPtrans[1][lid] = c_SPtrans[1][lid]; + s_SPtrans[2][lid] = c_SPtrans[2][lid]; + s_SPtrans[3][lid] = c_SPtrans[3][lid]; + s_SPtrans[4][lid] = c_SPtrans[4][lid]; + s_SPtrans[5][lid] = c_SPtrans[5][lid]; + s_SPtrans[6][lid] = c_SPtrans[6][lid]; + s_SPtrans[7][lid] = c_SPtrans[7][lid]; + + s_skb[0][lid] = c_skb[0][lid]; + s_skb[1][lid] = c_skb[1][lid]; + s_skb[2][lid] = c_skb[2][lid]; + s_skb[3][lid] = c_skb[3][lid]; + s_skb[4][lid] = c_skb[4][lid]; + s_skb[5][lid] = c_skb[5][lid]; + s_skb[6][lid] = c_skb[6][lid]; + s_skb[7][lid] = c_skb[7][lid]; + + barrier (CLK_LOCAL_MEM_FENCE); + + if (gid >= gid_max) return; + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[7]; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = combs_buf[il_pos].pw_len; + + const u32 pw_len = pw_l_len + pw_r_len; + + const u32 salt_word_len = (salt_len + pw_len) * 2; + + u32 wordr0[4]; + + wordr0[0] = combs_buf[il_pos].i[0]; + wordr0[1] = combs_buf[il_pos].i[1]; + wordr0[2] = combs_buf[il_pos].i[2]; + wordr0[3] = combs_buf[il_pos].i[3]; + + u32 wordr1[4]; + + wordr1[0] = combs_buf[il_pos].i[4]; + wordr1[1] = combs_buf[il_pos].i[5]; + wordr1[2] = combs_buf[il_pos].i[6]; + wordr1[3] = combs_buf[il_pos].i[7]; + + u32 wordr2[4]; + + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + + u32 wordr3[4]; + + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + u32x w0[4]; + + w0[0] = wordl0[0] | wordr0[0]; + w0[1] = wordl0[1] | wordr0[1]; + w0[2] = wordl0[2] | wordr0[2]; + w0[3] = wordl0[3] | wordr0[3]; + + u32x w1[4]; + + w1[0] = wordl1[0] | wordr1[0]; + w1[1] = wordl1[1] | wordr1[1]; + w1[2] = wordl1[2] | wordr1[2]; + w1[3] = wordl1[3] | wordr1[3]; + + u32x w2[4]; + + w2[0] = wordl2[0] | wordr2[0]; + w2[1] = wordl2[1] | wordr2[1]; + w2[2] = wordl2[2] | wordr2[2]; + w2[3] = wordl2[3] | wordr2[3]; + + u32x w3[4]; + + w3[0] = wordl3[0] | wordr3[0]; + w3[1] = wordl3[1] | wordr3[1]; + w3[2] = wordl3[2] | wordr3[2]; + w3[3] = wordl3[3] | wordr3[3]; + + /** + * prepend salt + */ + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + w0_t[0] = w0[0]; + w0_t[1] = w0[1]; + w0_t[2] = w0[2]; + w0_t[3] = w0[3]; + w1_t[0] = w1[0]; + w1_t[1] = w1[1]; + w1_t[2] = w1[2]; + w1_t[3] = w1[3]; + w2_t[0] = w2[0]; + w2_t[1] = w2[1]; + w2_t[2] = w2[2]; + w2_t[3] = w2[3]; + w3_t[0] = w3[0]; + w3_t[1] = w3[1]; + w3_t[2] = w3[2]; + w3_t[3] = w3[3]; + + switch_buffer_by_offset (w0_t, w1_t, w2_t, w3_t, salt_len); + + w0_t[0] |= salt_buf0[0]; + w0_t[1] |= salt_buf0[1]; + w0_t[2] |= salt_buf0[2]; + w0_t[3] |= salt_buf0[3]; + w1_t[0] |= salt_buf1[0]; + w1_t[1] |= salt_buf1[1]; + w1_t[2] |= salt_buf1[2]; + w1_t[3] |= salt_buf1[3]; + + u32x dst[16]; + + dst[ 0] = w0_t[0]; + dst[ 1] = w0_t[1]; + dst[ 2] = w0_t[2]; + dst[ 3] = w0_t[3]; + dst[ 4] = w1_t[0]; + dst[ 5] = w1_t[1]; + dst[ 6] = w1_t[2]; + dst[ 7] = w1_t[3]; + dst[ 8] = w2_t[0]; + dst[ 9] = w2_t[1]; + dst[10] = w2_t[2]; + dst[11] = w2_t[3]; + dst[12] = 0; + dst[13] = 0; + dst[14] = 0; + dst[15] = 0; + + /** + * precompute key1 since key is static: 0x0123456789abcdef + * plus LEFT_ROTATE by 2 + */ + + u32x Kc[16]; + + Kc[ 0] = 0x64649040; + Kc[ 1] = 0x14909858; + Kc[ 2] = 0xc4b44888; + Kc[ 3] = 0x9094e438; + Kc[ 4] = 0xd8a004f0; + Kc[ 5] = 0xa8f02810; + Kc[ 6] = 0xc84048d8; + Kc[ 7] = 0x68d804a8; + Kc[ 8] = 0x0490e40c; + Kc[ 9] = 0xac183024; + Kc[10] = 0x24c07c10; + Kc[11] = 0x8c88c038; + Kc[12] = 0xc048c824; + Kc[13] = 0x4c0470a8; + Kc[14] = 0x584020b4; + Kc[15] = 0x00742c4c; + + u32x Kd[16]; + + Kd[ 0] = 0xa42ce40c; + Kd[ 1] = 0x64689858; + Kd[ 2] = 0x484050b8; + Kd[ 3] = 0xe8184814; + Kd[ 4] = 0x405cc070; + Kd[ 5] = 0xa010784c; + Kd[ 6] = 0x6074a800; + Kd[ 7] = 0x80701c1c; + Kd[ 8] = 0x9cd49430; + Kd[ 9] = 0x4c8ce078; + Kd[10] = 0x5c18c088; + Kd[11] = 0x28a8a4c8; + Kd[12] = 0x3c180838; + Kd[13] = 0xb0b86c20; + Kd[14] = 0xac84a094; + Kd[15] = 0x4ce0c0c4; + + /** + * key1 (generate key) + */ + + u32x iv[2]; + + iv[0] = 0; + iv[1] = 0; + + for (u32 j = 0, k = 0; j < salt_word_len; j += 8, k++) + { + u32x data[2]; + + data[0] = ((dst[k] << 16) & 0xff000000) | ((dst[k] << 8) & 0x0000ff00); + data[1] = ((dst[k] >> 0) & 0xff000000) | ((dst[k] >> 8) & 0x0000ff00); + + data[0] ^= iv[0]; + data[1] ^= iv[1]; + + _des_crypt_encrypt (iv, data, Kc, Kd, s_SPtrans); + } + + /** + * key2 (generate hash) + */ + + _des_crypt_keysetup (iv[0], iv[1], Kc, Kd, s_skb); + + iv[0] = 0; + iv[1] = 0; + + for (u32 j = 0, k = 0; j < salt_word_len; j += 8, k++) + { + u32x data[2]; + + data[0] = ((dst[k] << 16) & 0xff000000) | ((dst[k] << 8) & 0x0000ff00); + data[1] = ((dst[k] >> 0) & 0xff000000) | ((dst[k] >> 8) & 0x0000ff00); + + data[0] ^= iv[0]; + data[1] ^= iv[1]; + + _des_crypt_encrypt (iv, data, Kc, Kd, s_SPtrans); + } + + /** + * cmp + */ + + const u32x r0 = iv[0]; + const u32x r1 = iv[1]; + const u32x r2 = 0; + const u32x r3 = 0; + + #include VECT_COMPARE_S + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m03100_s08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m03100_s16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/amd/m03100_a3.cl b/amd/m03100_a3.cl new file mode 100644 index 0000000000..cce9f04f40 --- /dev/null +++ b/amd/m03100_a3.cl @@ -0,0 +1,1402 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _DES_ +#define _SCALAR_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW4 +#define VECT_SIZE2 +#endif + +#ifdef VLIW5 +#define VECT_SIZE2 +#endif + +#define DGST_R0 0 +#define DGST_R1 1 +#define DGST_R2 2 +#define DGST_R3 3 + +#include "include/kernel_functions.c" +#include "types_amd.c" +#include "common_amd.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4_warp.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4_warp.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4_warp.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4_warp.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4_warp.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4_warp.c" +#endif + +#define PERM_OP(a,b,tt,n,m) \ +{ \ + tt = a >> n; \ + tt = tt ^ b; \ + tt = tt & m; \ + b = b ^ tt; \ + tt = tt << n; \ + a = a ^ tt; \ +} + +#define HPERM_OP(a,tt,n,m) \ +{ \ + tt = a << (16 + n); \ + tt = tt ^ a; \ + tt = tt & m; \ + a = a ^ tt; \ + tt = tt >> (16 + n); \ + a = a ^ tt; \ +} + +#define IP(l,r,tt) \ +{ \ + PERM_OP (r, l, tt, 4, 0x0f0f0f0f); \ + PERM_OP (l, r, tt, 16, 0x0000ffff); \ + PERM_OP (r, l, tt, 2, 0x33333333); \ + PERM_OP (l, r, tt, 8, 0x00ff00ff); \ + PERM_OP (r, l, tt, 1, 0x55555555); \ +} + +#define FP(l,r,tt) \ +{ \ + PERM_OP (l, r, tt, 1, 0x55555555); \ + PERM_OP (r, l, tt, 8, 0x00ff00ff); \ + PERM_OP (l, r, tt, 2, 0x33333333); \ + PERM_OP (r, l, tt, 16, 0x0000ffff); \ + PERM_OP (l, r, tt, 4, 0x0f0f0f0f); \ +} + +__constant u32 c_SPtrans[8][64] = +{ + /* nibble 0 */ + 0x02080800, 0x00080000, 0x02000002, 0x02080802, + 0x02000000, 0x00080802, 0x00080002, 0x02000002, + 0x00080802, 0x02080800, 0x02080000, 0x00000802, + 0x02000802, 0x02000000, 0x00000000, 0x00080002, + 0x00080000, 0x00000002, 0x02000800, 0x00080800, + 0x02080802, 0x02080000, 0x00000802, 0x02000800, + 0x00000002, 0x00000800, 0x00080800, 0x02080002, + 0x00000800, 0x02000802, 0x02080002, 0x00000000, + 0x00000000, 0x02080802, 0x02000800, 0x00080002, + 0x02080800, 0x00080000, 0x00000802, 0x02000800, + 0x02080002, 0x00000800, 0x00080800, 0x02000002, + 0x00080802, 0x00000002, 0x02000002, 0x02080000, + 0x02080802, 0x00080800, 0x02080000, 0x02000802, + 0x02000000, 0x00000802, 0x00080002, 0x00000000, + 0x00080000, 0x02000000, 0x02000802, 0x02080800, + 0x00000002, 0x02080002, 0x00000800, 0x00080802, + /* nibble 1 */ + 0x40108010, 0x00000000, 0x00108000, 0x40100000, + 0x40000010, 0x00008010, 0x40008000, 0x00108000, + 0x00008000, 0x40100010, 0x00000010, 0x40008000, + 0x00100010, 0x40108000, 0x40100000, 0x00000010, + 0x00100000, 0x40008010, 0x40100010, 0x00008000, + 0x00108010, 0x40000000, 0x00000000, 0x00100010, + 0x40008010, 0x00108010, 0x40108000, 0x40000010, + 0x40000000, 0x00100000, 0x00008010, 0x40108010, + 0x00100010, 0x40108000, 0x40008000, 0x00108010, + 0x40108010, 0x00100010, 0x40000010, 0x00000000, + 0x40000000, 0x00008010, 0x00100000, 0x40100010, + 0x00008000, 0x40000000, 0x00108010, 0x40008010, + 0x40108000, 0x00008000, 0x00000000, 0x40000010, + 0x00000010, 0x40108010, 0x00108000, 0x40100000, + 0x40100010, 0x00100000, 0x00008010, 0x40008000, + 0x40008010, 0x00000010, 0x40100000, 0x00108000, + /* nibble 2 */ + 0x04000001, 0x04040100, 0x00000100, 0x04000101, + 0x00040001, 0x04000000, 0x04000101, 0x00040100, + 0x04000100, 0x00040000, 0x04040000, 0x00000001, + 0x04040101, 0x00000101, 0x00000001, 0x04040001, + 0x00000000, 0x00040001, 0x04040100, 0x00000100, + 0x00000101, 0x04040101, 0x00040000, 0x04000001, + 0x04040001, 0x04000100, 0x00040101, 0x04040000, + 0x00040100, 0x00000000, 0x04000000, 0x00040101, + 0x04040100, 0x00000100, 0x00000001, 0x00040000, + 0x00000101, 0x00040001, 0x04040000, 0x04000101, + 0x00000000, 0x04040100, 0x00040100, 0x04040001, + 0x00040001, 0x04000000, 0x04040101, 0x00000001, + 0x00040101, 0x04000001, 0x04000000, 0x04040101, + 0x00040000, 0x04000100, 0x04000101, 0x00040100, + 0x04000100, 0x00000000, 0x04040001, 0x00000101, + 0x04000001, 0x00040101, 0x00000100, 0x04040000, + /* nibble 3 */ + 0x00401008, 0x10001000, 0x00000008, 0x10401008, + 0x00000000, 0x10400000, 0x10001008, 0x00400008, + 0x10401000, 0x10000008, 0x10000000, 0x00001008, + 0x10000008, 0x00401008, 0x00400000, 0x10000000, + 0x10400008, 0x00401000, 0x00001000, 0x00000008, + 0x00401000, 0x10001008, 0x10400000, 0x00001000, + 0x00001008, 0x00000000, 0x00400008, 0x10401000, + 0x10001000, 0x10400008, 0x10401008, 0x00400000, + 0x10400008, 0x00001008, 0x00400000, 0x10000008, + 0x00401000, 0x10001000, 0x00000008, 0x10400000, + 0x10001008, 0x00000000, 0x00001000, 0x00400008, + 0x00000000, 0x10400008, 0x10401000, 0x00001000, + 0x10000000, 0x10401008, 0x00401008, 0x00400000, + 0x10401008, 0x00000008, 0x10001000, 0x00401008, + 0x00400008, 0x00401000, 0x10400000, 0x10001008, + 0x00001008, 0x10000000, 0x10000008, 0x10401000, + /* nibble 4 */ + 0x08000000, 0x00010000, 0x00000400, 0x08010420, + 0x08010020, 0x08000400, 0x00010420, 0x08010000, + 0x00010000, 0x00000020, 0x08000020, 0x00010400, + 0x08000420, 0x08010020, 0x08010400, 0x00000000, + 0x00010400, 0x08000000, 0x00010020, 0x00000420, + 0x08000400, 0x00010420, 0x00000000, 0x08000020, + 0x00000020, 0x08000420, 0x08010420, 0x00010020, + 0x08010000, 0x00000400, 0x00000420, 0x08010400, + 0x08010400, 0x08000420, 0x00010020, 0x08010000, + 0x00010000, 0x00000020, 0x08000020, 0x08000400, + 0x08000000, 0x00010400, 0x08010420, 0x00000000, + 0x00010420, 0x08000000, 0x00000400, 0x00010020, + 0x08000420, 0x00000400, 0x00000000, 0x08010420, + 0x08010020, 0x08010400, 0x00000420, 0x00010000, + 0x00010400, 0x08010020, 0x08000400, 0x00000420, + 0x00000020, 0x00010420, 0x08010000, 0x08000020, + /* nibble 5 */ + 0x80000040, 0x00200040, 0x00000000, 0x80202000, + 0x00200040, 0x00002000, 0x80002040, 0x00200000, + 0x00002040, 0x80202040, 0x00202000, 0x80000000, + 0x80002000, 0x80000040, 0x80200000, 0x00202040, + 0x00200000, 0x80002040, 0x80200040, 0x00000000, + 0x00002000, 0x00000040, 0x80202000, 0x80200040, + 0x80202040, 0x80200000, 0x80000000, 0x00002040, + 0x00000040, 0x00202000, 0x00202040, 0x80002000, + 0x00002040, 0x80000000, 0x80002000, 0x00202040, + 0x80202000, 0x00200040, 0x00000000, 0x80002000, + 0x80000000, 0x00002000, 0x80200040, 0x00200000, + 0x00200040, 0x80202040, 0x00202000, 0x00000040, + 0x80202040, 0x00202000, 0x00200000, 0x80002040, + 0x80000040, 0x80200000, 0x00202040, 0x00000000, + 0x00002000, 0x80000040, 0x80002040, 0x80202000, + 0x80200000, 0x00002040, 0x00000040, 0x80200040, + /* nibble 6 */ + 0x00004000, 0x00000200, 0x01000200, 0x01000004, + 0x01004204, 0x00004004, 0x00004200, 0x00000000, + 0x01000000, 0x01000204, 0x00000204, 0x01004000, + 0x00000004, 0x01004200, 0x01004000, 0x00000204, + 0x01000204, 0x00004000, 0x00004004, 0x01004204, + 0x00000000, 0x01000200, 0x01000004, 0x00004200, + 0x01004004, 0x00004204, 0x01004200, 0x00000004, + 0x00004204, 0x01004004, 0x00000200, 0x01000000, + 0x00004204, 0x01004000, 0x01004004, 0x00000204, + 0x00004000, 0x00000200, 0x01000000, 0x01004004, + 0x01000204, 0x00004204, 0x00004200, 0x00000000, + 0x00000200, 0x01000004, 0x00000004, 0x01000200, + 0x00000000, 0x01000204, 0x01000200, 0x00004200, + 0x00000204, 0x00004000, 0x01004204, 0x01000000, + 0x01004200, 0x00000004, 0x00004004, 0x01004204, + 0x01000004, 0x01004200, 0x01004000, 0x00004004, + /* nibble 7 */ + 0x20800080, 0x20820000, 0x00020080, 0x00000000, + 0x20020000, 0x00800080, 0x20800000, 0x20820080, + 0x00000080, 0x20000000, 0x00820000, 0x00020080, + 0x00820080, 0x20020080, 0x20000080, 0x20800000, + 0x00020000, 0x00820080, 0x00800080, 0x20020000, + 0x20820080, 0x20000080, 0x00000000, 0x00820000, + 0x20000000, 0x00800000, 0x20020080, 0x20800080, + 0x00800000, 0x00020000, 0x20820000, 0x00000080, + 0x00800000, 0x00020000, 0x20000080, 0x20820080, + 0x00020080, 0x20000000, 0x00000000, 0x00820000, + 0x20800080, 0x20020080, 0x20020000, 0x00800080, + 0x20820000, 0x00000080, 0x00800080, 0x20020000, + 0x20820080, 0x00800000, 0x20800000, 0x20000080, + 0x00820000, 0x00020080, 0x20020080, 0x20800000, + 0x00000080, 0x20820000, 0x00820080, 0x00000000, + 0x20000000, 0x20800080, 0x00020000, 0x00820080, +}; + +__constant u32 c_skb[8][64] = +{ + /* for C bits (numbered as per FIPS 46) 1 2 3 4 5 6 */ + 0x00000000, 0x00000010, 0x20000000, 0x20000010, + 0x00010000, 0x00010010, 0x20010000, 0x20010010, + 0x00000800, 0x00000810, 0x20000800, 0x20000810, + 0x00010800, 0x00010810, 0x20010800, 0x20010810, + 0x00000020, 0x00000030, 0x20000020, 0x20000030, + 0x00010020, 0x00010030, 0x20010020, 0x20010030, + 0x00000820, 0x00000830, 0x20000820, 0x20000830, + 0x00010820, 0x00010830, 0x20010820, 0x20010830, + 0x00080000, 0x00080010, 0x20080000, 0x20080010, + 0x00090000, 0x00090010, 0x20090000, 0x20090010, + 0x00080800, 0x00080810, 0x20080800, 0x20080810, + 0x00090800, 0x00090810, 0x20090800, 0x20090810, + 0x00080020, 0x00080030, 0x20080020, 0x20080030, + 0x00090020, 0x00090030, 0x20090020, 0x20090030, + 0x00080820, 0x00080830, 0x20080820, 0x20080830, + 0x00090820, 0x00090830, 0x20090820, 0x20090830, + /* for C bits (numbered as per FIPS 46) 7 8 10 11 12 13 */ + 0x00000000, 0x02000000, 0x00002000, 0x02002000, + 0x00200000, 0x02200000, 0x00202000, 0x02202000, + 0x00000004, 0x02000004, 0x00002004, 0x02002004, + 0x00200004, 0x02200004, 0x00202004, 0x02202004, + 0x00000400, 0x02000400, 0x00002400, 0x02002400, + 0x00200400, 0x02200400, 0x00202400, 0x02202400, + 0x00000404, 0x02000404, 0x00002404, 0x02002404, + 0x00200404, 0x02200404, 0x00202404, 0x02202404, + 0x10000000, 0x12000000, 0x10002000, 0x12002000, + 0x10200000, 0x12200000, 0x10202000, 0x12202000, + 0x10000004, 0x12000004, 0x10002004, 0x12002004, + 0x10200004, 0x12200004, 0x10202004, 0x12202004, + 0x10000400, 0x12000400, 0x10002400, 0x12002400, + 0x10200400, 0x12200400, 0x10202400, 0x12202400, + 0x10000404, 0x12000404, 0x10002404, 0x12002404, + 0x10200404, 0x12200404, 0x10202404, 0x12202404, + /* for C bits (numbered as per FIPS 46) 14 15 16 17 19 20 */ + 0x00000000, 0x00000001, 0x00040000, 0x00040001, + 0x01000000, 0x01000001, 0x01040000, 0x01040001, + 0x00000002, 0x00000003, 0x00040002, 0x00040003, + 0x01000002, 0x01000003, 0x01040002, 0x01040003, + 0x00000200, 0x00000201, 0x00040200, 0x00040201, + 0x01000200, 0x01000201, 0x01040200, 0x01040201, + 0x00000202, 0x00000203, 0x00040202, 0x00040203, + 0x01000202, 0x01000203, 0x01040202, 0x01040203, + 0x08000000, 0x08000001, 0x08040000, 0x08040001, + 0x09000000, 0x09000001, 0x09040000, 0x09040001, + 0x08000002, 0x08000003, 0x08040002, 0x08040003, + 0x09000002, 0x09000003, 0x09040002, 0x09040003, + 0x08000200, 0x08000201, 0x08040200, 0x08040201, + 0x09000200, 0x09000201, 0x09040200, 0x09040201, + 0x08000202, 0x08000203, 0x08040202, 0x08040203, + 0x09000202, 0x09000203, 0x09040202, 0x09040203, + /* for C bits (numbered as per FIPS 46) 21 23 24 26 27 28 */ + 0x00000000, 0x00100000, 0x00000100, 0x00100100, + 0x00000008, 0x00100008, 0x00000108, 0x00100108, + 0x00001000, 0x00101000, 0x00001100, 0x00101100, + 0x00001008, 0x00101008, 0x00001108, 0x00101108, + 0x04000000, 0x04100000, 0x04000100, 0x04100100, + 0x04000008, 0x04100008, 0x04000108, 0x04100108, + 0x04001000, 0x04101000, 0x04001100, 0x04101100, + 0x04001008, 0x04101008, 0x04001108, 0x04101108, + 0x00020000, 0x00120000, 0x00020100, 0x00120100, + 0x00020008, 0x00120008, 0x00020108, 0x00120108, + 0x00021000, 0x00121000, 0x00021100, 0x00121100, + 0x00021008, 0x00121008, 0x00021108, 0x00121108, + 0x04020000, 0x04120000, 0x04020100, 0x04120100, + 0x04020008, 0x04120008, 0x04020108, 0x04120108, + 0x04021000, 0x04121000, 0x04021100, 0x04121100, + 0x04021008, 0x04121008, 0x04021108, 0x04121108, + /* for D bits (numbered as per FIPS 46) 1 2 3 4 5 6 */ + 0x00000000, 0x10000000, 0x00010000, 0x10010000, + 0x00000004, 0x10000004, 0x00010004, 0x10010004, + 0x20000000, 0x30000000, 0x20010000, 0x30010000, + 0x20000004, 0x30000004, 0x20010004, 0x30010004, + 0x00100000, 0x10100000, 0x00110000, 0x10110000, + 0x00100004, 0x10100004, 0x00110004, 0x10110004, + 0x20100000, 0x30100000, 0x20110000, 0x30110000, + 0x20100004, 0x30100004, 0x20110004, 0x30110004, + 0x00001000, 0x10001000, 0x00011000, 0x10011000, + 0x00001004, 0x10001004, 0x00011004, 0x10011004, + 0x20001000, 0x30001000, 0x20011000, 0x30011000, + 0x20001004, 0x30001004, 0x20011004, 0x30011004, + 0x00101000, 0x10101000, 0x00111000, 0x10111000, + 0x00101004, 0x10101004, 0x00111004, 0x10111004, + 0x20101000, 0x30101000, 0x20111000, 0x30111000, + 0x20101004, 0x30101004, 0x20111004, 0x30111004, + /* for D bits (numbered as per FIPS 46) 8 9 11 12 13 14 */ + 0x00000000, 0x08000000, 0x00000008, 0x08000008, + 0x00000400, 0x08000400, 0x00000408, 0x08000408, + 0x00020000, 0x08020000, 0x00020008, 0x08020008, + 0x00020400, 0x08020400, 0x00020408, 0x08020408, + 0x00000001, 0x08000001, 0x00000009, 0x08000009, + 0x00000401, 0x08000401, 0x00000409, 0x08000409, + 0x00020001, 0x08020001, 0x00020009, 0x08020009, + 0x00020401, 0x08020401, 0x00020409, 0x08020409, + 0x02000000, 0x0A000000, 0x02000008, 0x0A000008, + 0x02000400, 0x0A000400, 0x02000408, 0x0A000408, + 0x02020000, 0x0A020000, 0x02020008, 0x0A020008, + 0x02020400, 0x0A020400, 0x02020408, 0x0A020408, + 0x02000001, 0x0A000001, 0x02000009, 0x0A000009, + 0x02000401, 0x0A000401, 0x02000409, 0x0A000409, + 0x02020001, 0x0A020001, 0x02020009, 0x0A020009, + 0x02020401, 0x0A020401, 0x02020409, 0x0A020409, + /* for D bits (numbered as per FIPS 46) 16 17 18 19 20 21 */ + 0x00000000, 0x00000100, 0x00080000, 0x00080100, + 0x01000000, 0x01000100, 0x01080000, 0x01080100, + 0x00000010, 0x00000110, 0x00080010, 0x00080110, + 0x01000010, 0x01000110, 0x01080010, 0x01080110, + 0x00200000, 0x00200100, 0x00280000, 0x00280100, + 0x01200000, 0x01200100, 0x01280000, 0x01280100, + 0x00200010, 0x00200110, 0x00280010, 0x00280110, + 0x01200010, 0x01200110, 0x01280010, 0x01280110, + 0x00000200, 0x00000300, 0x00080200, 0x00080300, + 0x01000200, 0x01000300, 0x01080200, 0x01080300, + 0x00000210, 0x00000310, 0x00080210, 0x00080310, + 0x01000210, 0x01000310, 0x01080210, 0x01080310, + 0x00200200, 0x00200300, 0x00280200, 0x00280300, + 0x01200200, 0x01200300, 0x01280200, 0x01280300, + 0x00200210, 0x00200310, 0x00280210, 0x00280310, + 0x01200210, 0x01200310, 0x01280210, 0x01280310, + /* for D bits (numbered as per FIPS 46) 22 23 24 25 27 28 */ + 0x00000000, 0x04000000, 0x00040000, 0x04040000, + 0x00000002, 0x04000002, 0x00040002, 0x04040002, + 0x00002000, 0x04002000, 0x00042000, 0x04042000, + 0x00002002, 0x04002002, 0x00042002, 0x04042002, + 0x00000020, 0x04000020, 0x00040020, 0x04040020, + 0x00000022, 0x04000022, 0x00040022, 0x04040022, + 0x00002020, 0x04002020, 0x00042020, 0x04042020, + 0x00002022, 0x04002022, 0x00042022, 0x04042022, + 0x00000800, 0x04000800, 0x00040800, 0x04040800, + 0x00000802, 0x04000802, 0x00040802, 0x04040802, + 0x00002800, 0x04002800, 0x00042800, 0x04042800, + 0x00002802, 0x04002802, 0x00042802, 0x04042802, + 0x00000820, 0x04000820, 0x00040820, 0x04040820, + 0x00000822, 0x04000822, 0x00040822, 0x04040822, + 0x00002820, 0x04002820, 0x00042820, 0x04042820, + 0x00002822, 0x04002822, 0x00042822, 0x04042822 +}; + +__constant u32 shifts3s0[16] = { 1, 1, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 1 }; +__constant u32 shifts3s1[16] = { 27, 27, 26, 26, 26, 26, 26, 26, 27, 26, 26, 26, 26, 26, 26, 27 }; + +#ifdef VECT_SIZE1 +#define BOX(i,n,S) u32x ((S)[(n)][(i)]) +#endif + +#ifdef VECT_SIZE2 +#define BOX(i,n,S) u32x ((S)[(n)][(i).s0], (S)[(n)][(i).s1]) +#endif + +#ifdef VECT_SIZE4 +#define BOX(i,n,S) u32x ((S)[(n)][(i).s0], (S)[(n)][(i).s1], (S)[(n)][(i).s2], (S)[(n)][(i).s3]) +#endif + +static void _des_crypt_encrypt (u32x iv[2], u32x data[2], u32x Kc[16], u32x Kd[16], __local u32 s_SPtrans[8][64]) +{ + u32x tt; + + u32x r = data[0]; + u32x l = data[1]; + + IP (r, l, tt); + + r = rotl32 (r, 3u); + l = rotl32 (l, 3u); + + #pragma unroll 16 + for (u32 i = 0; i < 16; i += 2) + { + u32x u; + u32x t; + + u = Kc[i + 0] ^ r; + t = Kd[i + 0] ^ rotl32 (r, 28u); + + l = l + ^ BOX (amd_bfe (u, 2, 6), 0, s_SPtrans) + ^ BOX (amd_bfe (u, 10, 6), 2, s_SPtrans) + ^ BOX (amd_bfe (u, 18, 6), 4, s_SPtrans) + ^ BOX (amd_bfe (u, 26, 6), 6, s_SPtrans) + ^ BOX (amd_bfe (t, 2, 6), 1, s_SPtrans) + ^ BOX (amd_bfe (t, 10, 6), 3, s_SPtrans) + ^ BOX (amd_bfe (t, 18, 6), 5, s_SPtrans) + ^ BOX (amd_bfe (t, 26, 6), 7, s_SPtrans); + + u = Kc[i + 1] ^ l; + t = Kd[i + 1] ^ rotl32 (l, 28u); + + r = r + ^ BOX (amd_bfe (u, 2, 6), 0, s_SPtrans) + ^ BOX (amd_bfe (u, 10, 6), 2, s_SPtrans) + ^ BOX (amd_bfe (u, 18, 6), 4, s_SPtrans) + ^ BOX (amd_bfe (u, 26, 6), 6, s_SPtrans) + ^ BOX (amd_bfe (t, 2, 6), 1, s_SPtrans) + ^ BOX (amd_bfe (t, 10, 6), 3, s_SPtrans) + ^ BOX (amd_bfe (t, 18, 6), 5, s_SPtrans) + ^ BOX (amd_bfe (t, 26, 6), 7, s_SPtrans); + } + + l = rotl32 (l, 29u); + r = rotl32 (r, 29u); + + FP (r, l, tt); + + iv[0] = l; + iv[1] = r; +} + +static void _des_crypt_keysetup (u32x c, u32x d, u32x Kc[16], u32x Kd[16], __local u32 s_skb[8][64]) +{ + u32x tt; + + PERM_OP (d, c, tt, 4, 0x0f0f0f0f); + HPERM_OP (c, tt, 2, 0xcccc0000); + HPERM_OP (d, tt, 2, 0xcccc0000); + PERM_OP (d, c, tt, 1, 0x55555555); + PERM_OP (c, d, tt, 8, 0x00ff00ff); + PERM_OP (d, c, tt, 1, 0x55555555); + + d = ((d & 0x000000ff) << 16) + | ((d & 0x0000ff00) << 0) + | ((d & 0x00ff0000) >> 16) + | ((c & 0xf0000000) >> 4); + + c = c & 0x0fffffff; + + #pragma unroll 16 + for (u32 i = 0; i < 16; i++) + { + c = c >> shifts3s0[i] | c << shifts3s1[i]; + d = d >> shifts3s0[i] | d << shifts3s1[i]; + + c = c & 0x0fffffff; + d = d & 0x0fffffff; + + u32x s = BOX ((( c >> 0) & 0x3f), 0, s_skb) + | BOX ((((c >> 6) & 0x03) + | ((c >> 7) & 0x3c)), 1, s_skb) + | BOX ((((c >> 13) & 0x0f) + | ((c >> 14) & 0x30)), 2, s_skb) + | BOX ((((c >> 20) & 0x01) + | ((c >> 21) & 0x06) + | ((c >> 22) & 0x38)), 3, s_skb); + + u32x t = BOX ((( d >> 0) & 0x3f), 4, s_skb) + | BOX ((((d >> 7) & 0x03) + | ((d >> 8) & 0x3c)), 5, s_skb) + | BOX ((((d >> 15) & 0x3f)), 6, s_skb) + | BOX ((((d >> 21) & 0x0f) + | ((d >> 22) & 0x30)), 7, s_skb); + + #if defined cl_amd_media_ops + Kc[i] = amd_bytealign (t, s << 16, 2); + Kd[i] = amd_bytealign (t >> 16, s, 2); + #else + Kc[i] = ((t << 16) | (s & 0x0000ffff)); + Kd[i] = ((s >> 16) | (t & 0xffff0000)); + #endif + + Kc[i] = rotl32 (Kc[i], 2u); + Kd[i] = rotl32 (Kd[i], 2u); + } +} + +static void overwrite_at (u32x sw[16], const u32x w0, const u32 salt_len) +{ + #if defined cl_amd_media_ops + switch (salt_len) + { + case 0: sw[0] = w0; + break; + case 1: sw[0] = amd_bytealign (w0, sw[0] << 24, 3); + sw[1] = amd_bytealign (sw[1] >> 8, w0, 3); + break; + case 2: sw[0] = amd_bytealign (w0, sw[0] << 16, 2); + sw[1] = amd_bytealign (sw[1] >> 16, w0, 2); + break; + case 3: sw[0] = amd_bytealign (w0, sw[0] << 8, 1); + sw[1] = amd_bytealign (sw[1] >> 24, w0, 1); + break; + case 4: sw[1] = w0; + break; + case 5: sw[1] = amd_bytealign (w0, sw[1] << 24, 3); + sw[2] = amd_bytealign (sw[2] >> 8, w0, 3); + break; + case 6: sw[1] = amd_bytealign (w0, sw[1] << 16, 2); + sw[2] = amd_bytealign (sw[2] >> 16, w0, 2); + break; + case 7: sw[1] = amd_bytealign (w0, sw[1] << 8, 1); + sw[2] = amd_bytealign (sw[2] >> 24, w0, 1); + break; + case 8: sw[2] = w0; + break; + case 9: sw[2] = amd_bytealign (w0, sw[2] << 24, 3); + sw[3] = amd_bytealign (sw[3] >> 8, w0, 3); + break; + case 10: sw[2] = amd_bytealign (w0, sw[2] << 16, 2); + sw[3] = amd_bytealign (sw[3] >> 16, w0, 2); + break; + case 11: sw[2] = amd_bytealign (w0, sw[2] << 8, 1); + sw[3] = amd_bytealign (sw[3] >> 24, w0, 1); + break; + case 12: sw[3] = w0; + break; + case 13: sw[3] = amd_bytealign (w0, sw[3] << 24, 3); + sw[4] = amd_bytealign (sw[4] >> 8, w0, 3); + break; + case 14: sw[3] = amd_bytealign (w0, sw[3] << 16, 2); + sw[4] = amd_bytealign (sw[4] >> 16, w0, 2); + break; + case 15: sw[3] = amd_bytealign (w0, sw[3] << 8, 1); + sw[4] = amd_bytealign (sw[4] >> 24, w0, 1); + break; + case 16: sw[4] = w0; + break; + case 17: sw[4] = amd_bytealign (w0, sw[4] << 24, 3); + sw[5] = amd_bytealign (sw[5] >> 8, w0, 3); + break; + case 18: sw[4] = amd_bytealign (w0, sw[4] << 16, 2); + sw[5] = amd_bytealign (sw[5] >> 16, w0, 2); + break; + case 19: sw[4] = amd_bytealign (w0, sw[4] << 8, 1); + sw[5] = amd_bytealign (sw[5] >> 24, w0, 1); + break; + case 20: sw[5] = w0; + break; + case 21: sw[5] = amd_bytealign (w0, sw[5] << 24, 3); + sw[6] = amd_bytealign (sw[6] >> 8, w0, 3); + break; + case 22: sw[5] = amd_bytealign (w0, sw[5] << 16, 2); + sw[6] = amd_bytealign (sw[6] >> 16, w0, 2); + break; + case 23: sw[5] = amd_bytealign (w0, sw[5] << 8, 1); + sw[6] = amd_bytealign (sw[6] >> 24, w0, 1); + break; + case 24: sw[6] = w0; + break; + case 25: sw[6] = amd_bytealign (w0, sw[6] << 24, 3); + sw[7] = amd_bytealign (sw[7] >> 8, w0, 3); + break; + case 26: sw[6] = amd_bytealign (w0, sw[6] << 16, 2); + sw[7] = amd_bytealign (sw[7] >> 16, w0, 2); + break; + case 27: sw[6] = amd_bytealign (w0, sw[6] << 8, 1); + sw[7] = amd_bytealign (sw[7] >> 24, w0, 1); + break; + case 28: sw[7] = w0; + break; + case 29: sw[7] = amd_bytealign (w0, sw[7] << 24, 3); + sw[8] = amd_bytealign (sw[8] >> 8, w0, 3); + break; + case 30: sw[7] = amd_bytealign (w0, sw[7] << 16, 2); + sw[8] = amd_bytealign (sw[8] >> 16, w0, 2); + break; + case 31: sw[7] = amd_bytealign (w0, sw[7] << 8, 1); + sw[8] = amd_bytealign (sw[8] >> 24, w0, 1); + break; + } + #else + switch (salt_len) + { + case 0: sw[0] = w0; + break; + case 1: sw[0] = (sw[0] & 0x000000ff) | (w0 << 8); + sw[1] = (sw[1] & 0xffffff00) | (w0 >> 24); + break; + case 2: sw[0] = (sw[0] & 0x0000ffff) | (w0 << 16); + sw[1] = (sw[1] & 0xffff0000) | (w0 >> 16); + break; + case 3: sw[0] = (sw[0] & 0x00ffffff) | (w0 << 24); + sw[1] = (sw[1] & 0xff000000) | (w0 >> 8); + break; + case 4: sw[1] = w0; + break; + case 5: sw[1] = (sw[1] & 0x000000ff) | (w0 << 8); + sw[2] = (sw[2] & 0xffffff00) | (w0 >> 24); + break; + case 6: sw[1] = (sw[1] & 0x0000ffff) | (w0 << 16); + sw[2] = (sw[2] & 0xffff0000) | (w0 >> 16); + break; + case 7: sw[1] = (sw[1] & 0x00ffffff) | (w0 << 24); + sw[2] = (sw[2] & 0xff000000) | (w0 >> 8); + break; + case 8: sw[2] = w0; + break; + case 9: sw[2] = (sw[2] & 0x000000ff) | (w0 << 8); + sw[3] = (sw[3] & 0xffffff00) | (w0 >> 24); + break; + case 10: sw[2] = (sw[2] & 0x0000ffff) | (w0 << 16); + sw[3] = (sw[3] & 0xffff0000) | (w0 >> 16); + break; + case 11: sw[2] = (sw[2] & 0x00ffffff) | (w0 << 24); + sw[3] = (sw[3] & 0xff000000) | (w0 >> 8); + break; + case 12: sw[3] = w0; + break; + case 13: sw[3] = (sw[3] & 0x000000ff) | (w0 << 8); + sw[4] = (sw[4] & 0xffffff00) | (w0 >> 24); + break; + case 14: sw[3] = (sw[3] & 0x0000ffff) | (w0 << 16); + sw[4] = (sw[4] & 0xffff0000) | (w0 >> 16); + break; + case 15: sw[3] = (sw[3] & 0x00ffffff) | (w0 << 24); + sw[4] = (sw[4] & 0xff000000) | (w0 >> 8); + break; + case 16: sw[4] = w0; + break; + case 17: sw[4] = (sw[4] & 0x000000ff) | (w0 << 8); + sw[5] = (sw[5] & 0xffffff00) | (w0 >> 24); + break; + case 18: sw[4] = (sw[4] & 0x0000ffff) | (w0 << 16); + sw[5] = (sw[5] & 0xffff0000) | (w0 >> 16); + break; + case 19: sw[4] = (sw[4] & 0x00ffffff) | (w0 << 24); + sw[5] = (sw[5] & 0xff000000) | (w0 >> 8); + break; + case 20: sw[5] = w0; + break; + case 21: sw[5] = (sw[5] & 0x000000ff) | (w0 << 8); + sw[6] = (sw[6] & 0xffffff00) | (w0 >> 24); + break; + case 22: sw[5] = (sw[5] & 0x0000ffff) | (w0 << 16); + sw[6] = (sw[6] & 0xffff0000) | (w0 >> 16); + break; + case 23: sw[5] = (sw[5] & 0x00ffffff) | (w0 << 24); + sw[6] = (sw[6] & 0xff000000) | (w0 >> 8); + break; + case 24: sw[6] = w0; + break; + case 25: sw[6] = (sw[6] & 0x000000ff) | (w0 << 8); + sw[7] = (sw[7] & 0xffffff00) | (w0 >> 24); + break; + case 26: sw[6] = (sw[6] & 0x0000ffff) | (w0 << 16); + sw[7] = (sw[7] & 0xffff0000) | (w0 >> 16); + break; + case 27: sw[6] = (sw[6] & 0x00ffffff) | (w0 << 24); + sw[7] = (sw[7] & 0xff000000) | (w0 >> 8); + break; + case 28: sw[7] = w0; + break; + case 29: sw[7] = (sw[7] & 0x000000ff) | (w0 << 8); + sw[8] = (sw[8] & 0xffffff00) | (w0 >> 24); + break; + case 30: sw[7] = (sw[7] & 0x0000ffff) | (w0 << 16); + sw[8] = (sw[8] & 0xffff0000) | (w0 >> 16); + break; + case 31: sw[7] = (sw[7] & 0x00ffffff) | (w0 << 24); + sw[8] = (sw[8] & 0xff000000) | (w0 >> 8); + break; + } + #endif +} + +static void m03100m (__local u32 s_SPtrans[8][64], __local u32 s_skb[8][64], u32 w[16], const u32 pw_len, __global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global u32x * words_buf_r, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset) +{ + /** + * modifier + */ + + const u32 gid = get_global_id (0); + const u32 lid = get_local_id (0); + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[7]; + + u32 salt_buf2[4]; + + salt_buf2[0] = 0; + salt_buf2[1] = 0; + salt_buf2[2] = 0; + salt_buf2[3] = 0; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + const u32 salt_word_len = (salt_len + pw_len) * 2; + + /** + * prepend salt + */ + + u32 w0_t[4]; + u32 w1_t[4]; + u32 w2_t[4]; + u32 w3_t[4]; + + w0_t[0] = w[ 0]; + w0_t[1] = w[ 1]; + w0_t[2] = w[ 2]; + w0_t[3] = w[ 3]; + w1_t[0] = w[ 4]; + w1_t[1] = w[ 5]; + w1_t[2] = w[ 6]; + w1_t[3] = w[ 7]; + w2_t[0] = w[ 8]; + w2_t[1] = w[ 9]; + w2_t[2] = w[10]; + w2_t[3] = w[11]; + w3_t[0] = w[12]; + w3_t[1] = w[13]; + w3_t[2] = w[14]; + w3_t[3] = w[15]; + + switch_buffer_by_offset (w0_t, w1_t, w2_t, w3_t, salt_len); + + w0_t[0] |= salt_buf0[0]; + w0_t[1] |= salt_buf0[1]; + w0_t[2] |= salt_buf0[2]; + w0_t[3] |= salt_buf0[3]; + w1_t[0] |= salt_buf1[0]; + w1_t[1] |= salt_buf1[1]; + w1_t[2] |= salt_buf1[2]; + w1_t[3] |= salt_buf1[3]; + w2_t[0] |= salt_buf2[0]; + w2_t[1] |= salt_buf2[1]; + w2_t[2] |= salt_buf2[2]; + w2_t[3] |= salt_buf2[3]; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = 0; + + u32x dst[16]; + + dst[ 0] = w0_t[0]; + dst[ 1] = w0_t[1]; + dst[ 2] = w0_t[2]; + dst[ 3] = w0_t[3]; + dst[ 4] = w1_t[0]; + dst[ 5] = w1_t[1]; + dst[ 6] = w1_t[2]; + dst[ 7] = w1_t[3]; + dst[ 8] = w2_t[0]; + dst[ 9] = w2_t[1]; + dst[10] = w2_t[2]; + dst[11] = w2_t[3]; + dst[12] = w3_t[0]; + dst[13] = w3_t[1]; + dst[14] = w3_t[2]; + dst[15] = w3_t[3]; + + /** + * loop + */ + + const u32 bf_loops = ceil ((float) bfs_cnt / VECT_DIV); + + u32x w0l = w[0]; + + for (u32 il_pos = 0; il_pos < bf_loops; il_pos++) + { + const u32x w0r = words_buf_r[il_pos]; + + const u32x w0 = w0l | w0r; + + overwrite_at (dst, w0, salt_len); + + /** + * precompute key1 since key is static: 0x0123456789abcdef + * plus LEFT_ROTATE by 2 + */ + + u32x Kc[16]; + + Kc[ 0] = 0x64649040; + Kc[ 1] = 0x14909858; + Kc[ 2] = 0xc4b44888; + Kc[ 3] = 0x9094e438; + Kc[ 4] = 0xd8a004f0; + Kc[ 5] = 0xa8f02810; + Kc[ 6] = 0xc84048d8; + Kc[ 7] = 0x68d804a8; + Kc[ 8] = 0x0490e40c; + Kc[ 9] = 0xac183024; + Kc[10] = 0x24c07c10; + Kc[11] = 0x8c88c038; + Kc[12] = 0xc048c824; + Kc[13] = 0x4c0470a8; + Kc[14] = 0x584020b4; + Kc[15] = 0x00742c4c; + + u32x Kd[16]; + + Kd[ 0] = 0xa42ce40c; + Kd[ 1] = 0x64689858; + Kd[ 2] = 0x484050b8; + Kd[ 3] = 0xe8184814; + Kd[ 4] = 0x405cc070; + Kd[ 5] = 0xa010784c; + Kd[ 6] = 0x6074a800; + Kd[ 7] = 0x80701c1c; + Kd[ 8] = 0x9cd49430; + Kd[ 9] = 0x4c8ce078; + Kd[10] = 0x5c18c088; + Kd[11] = 0x28a8a4c8; + Kd[12] = 0x3c180838; + Kd[13] = 0xb0b86c20; + Kd[14] = 0xac84a094; + Kd[15] = 0x4ce0c0c4; + + /** + * key1 (generate key) + */ + + u32x iv[2]; + + iv[0] = 0; + iv[1] = 0; + + for (u32 j = 0, k = 0; j < salt_word_len; j += 8, k++) + { + u32x data[2]; + + data[0] = ((dst[k] << 16) & 0xff000000) | ((dst[k] << 8) & 0x0000ff00); + data[1] = ((dst[k] >> 0) & 0xff000000) | ((dst[k] >> 8) & 0x0000ff00); + + data[0] ^= iv[0]; + data[1] ^= iv[1]; + + _des_crypt_encrypt (iv, data, Kc, Kd, s_SPtrans); + } + + /** + * key2 (generate hash) + */ + + _des_crypt_keysetup (iv[0], iv[1], Kc, Kd, s_skb); + + iv[0] = 0; + iv[1] = 0; + + for (u32 j = 0, k = 0; j < salt_word_len; j += 8, k++) + { + u32x data[2]; + + data[0] = ((dst[k] << 16) & 0xff000000) | ((dst[k] << 8) & 0x0000ff00); + data[1] = ((dst[k] >> 0) & 0xff000000) | ((dst[k] >> 8) & 0x0000ff00); + + data[0] ^= iv[0]; + data[1] ^= iv[1]; + + _des_crypt_encrypt (iv, data, Kc, Kd, s_SPtrans); + } + + /** + * cmp + */ + + const u32x r0 = iv[0]; + const u32x r1 = iv[1]; + const u32x r2 = 0; + const u32x r3 = 0; + + #include VECT_COMPARE_M + } +} + +static void m03100s (__local u32 s_SPtrans[8][64], __local u32 s_skb[8][64], u32 w[16], const u32 pw_len, __global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global u32x * words_buf_r, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset) +{ + /** + * modifier + */ + + const u32 gid = get_global_id (0); + const u32 lid = get_local_id (0); + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[7]; + + u32 salt_buf2[4]; + + salt_buf2[0] = 0; + salt_buf2[1] = 0; + salt_buf2[2] = 0; + salt_buf2[3] = 0; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + const u32 salt_word_len = (salt_len + pw_len) * 2; + + /** + * prepend salt + */ + + u32 w0_t[4]; + u32 w1_t[4]; + u32 w2_t[4]; + u32 w3_t[4]; + + w0_t[0] = w[ 0]; + w0_t[1] = w[ 1]; + w0_t[2] = w[ 2]; + w0_t[3] = w[ 3]; + w1_t[0] = w[ 4]; + w1_t[1] = w[ 5]; + w1_t[2] = w[ 6]; + w1_t[3] = w[ 7]; + w2_t[0] = w[ 8]; + w2_t[1] = w[ 9]; + w2_t[2] = w[10]; + w2_t[3] = w[11]; + w3_t[0] = w[12]; + w3_t[1] = w[13]; + w3_t[2] = w[14]; + w3_t[3] = w[15]; + + switch_buffer_by_offset (w0_t, w1_t, w2_t, w3_t, salt_len); + + w0_t[0] |= salt_buf0[0]; + w0_t[1] |= salt_buf0[1]; + w0_t[2] |= salt_buf0[2]; + w0_t[3] |= salt_buf0[3]; + w1_t[0] |= salt_buf1[0]; + w1_t[1] |= salt_buf1[1]; + w1_t[2] |= salt_buf1[2]; + w1_t[3] |= salt_buf1[3]; + w2_t[0] |= salt_buf2[0]; + w2_t[1] |= salt_buf2[1]; + w2_t[2] |= salt_buf2[2]; + w2_t[3] |= salt_buf2[3]; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = 0; + + u32x dst[16]; + + dst[ 0] = w0_t[0]; + dst[ 1] = w0_t[1]; + dst[ 2] = w0_t[2]; + dst[ 3] = w0_t[3]; + dst[ 4] = w1_t[0]; + dst[ 5] = w1_t[1]; + dst[ 6] = w1_t[2]; + dst[ 7] = w1_t[3]; + dst[ 8] = w2_t[0]; + dst[ 9] = w2_t[1]; + dst[10] = w2_t[2]; + dst[11] = w2_t[3]; + dst[12] = w3_t[0]; + dst[13] = w3_t[1]; + dst[14] = w3_t[2]; + dst[15] = w3_t[3]; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * loop + */ + + const u32 bf_loops = ceil ((float) bfs_cnt / VECT_DIV); + + u32x w0l = w[0]; + + for (u32 il_pos = 0; il_pos < bf_loops; il_pos++) + { + const u32x w0r = words_buf_r[il_pos]; + + const u32x w0 = w0l | w0r; + + overwrite_at (dst, w0, salt_len); + + /** + * precompute key1 since key is static: 0x0123456789abcdef + * plus LEFT_ROTATE by 2 + */ + + u32x Kc[16]; + + Kc[ 0] = 0x64649040; + Kc[ 1] = 0x14909858; + Kc[ 2] = 0xc4b44888; + Kc[ 3] = 0x9094e438; + Kc[ 4] = 0xd8a004f0; + Kc[ 5] = 0xa8f02810; + Kc[ 6] = 0xc84048d8; + Kc[ 7] = 0x68d804a8; + Kc[ 8] = 0x0490e40c; + Kc[ 9] = 0xac183024; + Kc[10] = 0x24c07c10; + Kc[11] = 0x8c88c038; + Kc[12] = 0xc048c824; + Kc[13] = 0x4c0470a8; + Kc[14] = 0x584020b4; + Kc[15] = 0x00742c4c; + + u32x Kd[16]; + + Kd[ 0] = 0xa42ce40c; + Kd[ 1] = 0x64689858; + Kd[ 2] = 0x484050b8; + Kd[ 3] = 0xe8184814; + Kd[ 4] = 0x405cc070; + Kd[ 5] = 0xa010784c; + Kd[ 6] = 0x6074a800; + Kd[ 7] = 0x80701c1c; + Kd[ 8] = 0x9cd49430; + Kd[ 9] = 0x4c8ce078; + Kd[10] = 0x5c18c088; + Kd[11] = 0x28a8a4c8; + Kd[12] = 0x3c180838; + Kd[13] = 0xb0b86c20; + Kd[14] = 0xac84a094; + Kd[15] = 0x4ce0c0c4; + + /** + * key1 (generate key) + */ + + u32x iv[2]; + + iv[0] = 0; + iv[1] = 0; + + for (u32 j = 0, k = 0; j < salt_word_len; j += 8, k++) + { + u32x data[2]; + + data[0] = ((dst[k] << 16) & 0xff000000) | ((dst[k] << 8) & 0x0000ff00); + data[1] = ((dst[k] >> 0) & 0xff000000) | ((dst[k] >> 8) & 0x0000ff00); + + data[0] ^= iv[0]; + data[1] ^= iv[1]; + + _des_crypt_encrypt (iv, data, Kc, Kd, s_SPtrans); + } + + /** + * key2 (generate hash) + */ + + _des_crypt_keysetup (iv[0], iv[1], Kc, Kd, s_skb); + + iv[0] = 0; + iv[1] = 0; + + for (u32 j = 0, k = 0; j < salt_word_len; j += 8, k++) + { + u32x data[2]; + + data[0] = ((dst[k] << 16) & 0xff000000) | ((dst[k] << 8) & 0x0000ff00); + data[1] = ((dst[k] >> 0) & 0xff000000) | ((dst[k] >> 8) & 0x0000ff00); + + data[0] ^= iv[0]; + data[1] ^= iv[1]; + + _des_crypt_encrypt (iv, data, Kc, Kd, s_SPtrans); + } + + /** + * cmp + */ + + const u32x r0 = iv[0]; + const u32x r1 = iv[1]; + const u32x r2 = 0; + const u32x r3 = 0; + + #include VECT_COMPARE_S + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m03100_m04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global u32x * words_buf_r, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + __local u32 s_SPtrans[8][64]; + + __local u32 s_skb[8][64]; + + /** + * base + */ + + const u32 gid = get_global_id (0); + const u32 lid = get_local_id (0); + + u32 w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = 0; + w[ 5] = 0; + w[ 6] = 0; + w[ 7] = 0; + w[ 8] = 0; + w[ 9] = 0; + w[10] = 0; + w[11] = 0; + w[12] = 0; + w[13] = 0; + w[14] = 0; + w[15] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * sbox, kbox + */ + + s_SPtrans[0][lid] = c_SPtrans[0][lid]; + s_SPtrans[1][lid] = c_SPtrans[1][lid]; + s_SPtrans[2][lid] = c_SPtrans[2][lid]; + s_SPtrans[3][lid] = c_SPtrans[3][lid]; + s_SPtrans[4][lid] = c_SPtrans[4][lid]; + s_SPtrans[5][lid] = c_SPtrans[5][lid]; + s_SPtrans[6][lid] = c_SPtrans[6][lid]; + s_SPtrans[7][lid] = c_SPtrans[7][lid]; + + s_skb[0][lid] = c_skb[0][lid]; + s_skb[1][lid] = c_skb[1][lid]; + s_skb[2][lid] = c_skb[2][lid]; + s_skb[3][lid] = c_skb[3][lid]; + s_skb[4][lid] = c_skb[4][lid]; + s_skb[5][lid] = c_skb[5][lid]; + s_skb[6][lid] = c_skb[6][lid]; + s_skb[7][lid] = c_skb[7][lid]; + + barrier (CLK_LOCAL_MEM_FENCE); + + if (gid >= gid_max) return; + + /** + * main + */ + + m03100m (s_SPtrans, s_skb, w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m03100_m08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global u32x * words_buf_r, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + __local u32 s_SPtrans[8][64]; + + __local u32 s_skb[8][64]; + + /** + * base + */ + + const u32 gid = get_global_id (0); + const u32 lid = get_local_id (0); + + u32 w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = pws[gid].i[ 4]; + w[ 5] = pws[gid].i[ 5]; + w[ 6] = pws[gid].i[ 6]; + w[ 7] = pws[gid].i[ 7]; + w[ 8] = 0; + w[ 9] = 0; + w[10] = 0; + w[11] = 0; + w[12] = 0; + w[13] = 0; + w[14] = 0; + w[15] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * sbox, kbox + */ + + s_SPtrans[0][lid] = c_SPtrans[0][lid]; + s_SPtrans[1][lid] = c_SPtrans[1][lid]; + s_SPtrans[2][lid] = c_SPtrans[2][lid]; + s_SPtrans[3][lid] = c_SPtrans[3][lid]; + s_SPtrans[4][lid] = c_SPtrans[4][lid]; + s_SPtrans[5][lid] = c_SPtrans[5][lid]; + s_SPtrans[6][lid] = c_SPtrans[6][lid]; + s_SPtrans[7][lid] = c_SPtrans[7][lid]; + + s_skb[0][lid] = c_skb[0][lid]; + s_skb[1][lid] = c_skb[1][lid]; + s_skb[2][lid] = c_skb[2][lid]; + s_skb[3][lid] = c_skb[3][lid]; + s_skb[4][lid] = c_skb[4][lid]; + s_skb[5][lid] = c_skb[5][lid]; + s_skb[6][lid] = c_skb[6][lid]; + s_skb[7][lid] = c_skb[7][lid]; + + barrier (CLK_LOCAL_MEM_FENCE); + + if (gid >= gid_max) return; + + /** + * main + */ + + m03100m (s_SPtrans, s_skb, w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m03100_m16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global u32x * words_buf_r, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m03100_s04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global u32x * words_buf_r, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + __local u32 s_SPtrans[8][64]; + + __local u32 s_skb[8][64]; + + /** + * base + */ + + const u32 gid = get_global_id (0); + const u32 lid = get_local_id (0); + + u32 w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = 0; + w[ 5] = 0; + w[ 6] = 0; + w[ 7] = 0; + w[ 8] = 0; + w[ 9] = 0; + w[10] = 0; + w[11] = 0; + w[12] = 0; + w[13] = 0; + w[14] = 0; + w[15] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * sbox, kbox + */ + + s_SPtrans[0][lid] = c_SPtrans[0][lid]; + s_SPtrans[1][lid] = c_SPtrans[1][lid]; + s_SPtrans[2][lid] = c_SPtrans[2][lid]; + s_SPtrans[3][lid] = c_SPtrans[3][lid]; + s_SPtrans[4][lid] = c_SPtrans[4][lid]; + s_SPtrans[5][lid] = c_SPtrans[5][lid]; + s_SPtrans[6][lid] = c_SPtrans[6][lid]; + s_SPtrans[7][lid] = c_SPtrans[7][lid]; + + s_skb[0][lid] = c_skb[0][lid]; + s_skb[1][lid] = c_skb[1][lid]; + s_skb[2][lid] = c_skb[2][lid]; + s_skb[3][lid] = c_skb[3][lid]; + s_skb[4][lid] = c_skb[4][lid]; + s_skb[5][lid] = c_skb[5][lid]; + s_skb[6][lid] = c_skb[6][lid]; + s_skb[7][lid] = c_skb[7][lid]; + + barrier (CLK_LOCAL_MEM_FENCE); + + if (gid >= gid_max) return; + + /** + * main + */ + + m03100s (s_SPtrans, s_skb, w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m03100_s08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global u32x * words_buf_r, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + __local u32 s_SPtrans[8][64]; + + __local u32 s_skb[8][64]; + + /** + * base + */ + + const u32 gid = get_global_id (0); + const u32 lid = get_local_id (0); + + u32 w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = pws[gid].i[ 4]; + w[ 5] = pws[gid].i[ 5]; + w[ 6] = pws[gid].i[ 6]; + w[ 7] = pws[gid].i[ 7]; + w[ 8] = 0; + w[ 9] = 0; + w[10] = 0; + w[11] = 0; + w[12] = 0; + w[13] = 0; + w[14] = 0; + w[15] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * sbox, kbox + */ + + s_SPtrans[0][lid] = c_SPtrans[0][lid]; + s_SPtrans[1][lid] = c_SPtrans[1][lid]; + s_SPtrans[2][lid] = c_SPtrans[2][lid]; + s_SPtrans[3][lid] = c_SPtrans[3][lid]; + s_SPtrans[4][lid] = c_SPtrans[4][lid]; + s_SPtrans[5][lid] = c_SPtrans[5][lid]; + s_SPtrans[6][lid] = c_SPtrans[6][lid]; + s_SPtrans[7][lid] = c_SPtrans[7][lid]; + + s_skb[0][lid] = c_skb[0][lid]; + s_skb[1][lid] = c_skb[1][lid]; + s_skb[2][lid] = c_skb[2][lid]; + s_skb[3][lid] = c_skb[3][lid]; + s_skb[4][lid] = c_skb[4][lid]; + s_skb[5][lid] = c_skb[5][lid]; + s_skb[6][lid] = c_skb[6][lid]; + s_skb[7][lid] = c_skb[7][lid]; + + barrier (CLK_LOCAL_MEM_FENCE); + + if (gid >= gid_max) return; + + /** + * main + */ + + m03100s (s_SPtrans, s_skb, w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m03100_s16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global u32x * words_buf_r, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/amd/m03200.cl b/amd/m03200.cl new file mode 100644 index 0000000000..77cda5ec75 --- /dev/null +++ b/amd/m03200.cl @@ -0,0 +1,901 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _BCRYPT_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW4 +#define VECT_SIZE1 +#endif + +#ifdef VLIW5 +#define VECT_SIZE1 +#endif + +#define DGST_R0 0 +#define DGST_R1 1 +#define DGST_R2 2 +#define DGST_R3 3 + +#include "include/kernel_functions.c" +#include "types_amd.c" +#include "common_amd.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +// http://www.schneier.com/code/constants.txt + +__constant u32 c_sbox0[256] = +{ + 0xd1310ba6, 0x98dfb5ac, 0x2ffd72db, 0xd01adfb7, + 0xb8e1afed, 0x6a267e96, 0xba7c9045, 0xf12c7f99, + 0x24a19947, 0xb3916cf7, 0x0801f2e2, 0x858efc16, + 0x636920d8, 0x71574e69, 0xa458fea3, 0xf4933d7e, + 0x0d95748f, 0x728eb658, 0x718bcd58, 0x82154aee, + 0x7b54a41d, 0xc25a59b5, 0x9c30d539, 0x2af26013, + 0xc5d1b023, 0x286085f0, 0xca417918, 0xb8db38ef, + 0x8e79dcb0, 0x603a180e, 0x6c9e0e8b, 0xb01e8a3e, + 0xd71577c1, 0xbd314b27, 0x78af2fda, 0x55605c60, + 0xe65525f3, 0xaa55ab94, 0x57489862, 0x63e81440, + 0x55ca396a, 0x2aab10b6, 0xb4cc5c34, 0x1141e8ce, + 0xa15486af, 0x7c72e993, 0xb3ee1411, 0x636fbc2a, + 0x2ba9c55d, 0x741831f6, 0xce5c3e16, 0x9b87931e, + 0xafd6ba33, 0x6c24cf5c, 0x7a325381, 0x28958677, + 0x3b8f4898, 0x6b4bb9af, 0xc4bfe81b, 0x66282193, + 0x61d809cc, 0xfb21a991, 0x487cac60, 0x5dec8032, + 0xef845d5d, 0xe98575b1, 0xdc262302, 0xeb651b88, + 0x23893e81, 0xd396acc5, 0x0f6d6ff3, 0x83f44239, + 0x2e0b4482, 0xa4842004, 0x69c8f04a, 0x9e1f9b5e, + 0x21c66842, 0xf6e96c9a, 0x670c9c61, 0xabd388f0, + 0x6a51a0d2, 0xd8542f68, 0x960fa728, 0xab5133a3, + 0x6eef0b6c, 0x137a3be4, 0xba3bf050, 0x7efb2a98, + 0xa1f1651d, 0x39af0176, 0x66ca593e, 0x82430e88, + 0x8cee8619, 0x456f9fb4, 0x7d84a5c3, 0x3b8b5ebe, + 0xe06f75d8, 0x85c12073, 0x401a449f, 0x56c16aa6, + 0x4ed3aa62, 0x363f7706, 0x1bfedf72, 0x429b023d, + 0x37d0d724, 0xd00a1248, 0xdb0fead3, 0x49f1c09b, + 0x075372c9, 0x80991b7b, 0x25d479d8, 0xf6e8def7, + 0xe3fe501a, 0xb6794c3b, 0x976ce0bd, 0x04c006ba, + 0xc1a94fb6, 0x409f60c4, 0x5e5c9ec2, 0x196a2463, + 0x68fb6faf, 0x3e6c53b5, 0x1339b2eb, 0x3b52ec6f, + 0x6dfc511f, 0x9b30952c, 0xcc814544, 0xaf5ebd09, + 0xbee3d004, 0xde334afd, 0x660f2807, 0x192e4bb3, + 0xc0cba857, 0x45c8740f, 0xd20b5f39, 0xb9d3fbdb, + 0x5579c0bd, 0x1a60320a, 0xd6a100c6, 0x402c7279, + 0x679f25fe, 0xfb1fa3cc, 0x8ea5e9f8, 0xdb3222f8, + 0x3c7516df, 0xfd616b15, 0x2f501ec8, 0xad0552ab, + 0x323db5fa, 0xfd238760, 0x53317b48, 0x3e00df82, + 0x9e5c57bb, 0xca6f8ca0, 0x1a87562e, 0xdf1769db, + 0xd542a8f6, 0x287effc3, 0xac6732c6, 0x8c4f5573, + 0x695b27b0, 0xbbca58c8, 0xe1ffa35d, 0xb8f011a0, + 0x10fa3d98, 0xfd2183b8, 0x4afcb56c, 0x2dd1d35b, + 0x9a53e479, 0xb6f84565, 0xd28e49bc, 0x4bfb9790, + 0xe1ddf2da, 0xa4cb7e33, 0x62fb1341, 0xcee4c6e8, + 0xef20cada, 0x36774c01, 0xd07e9efe, 0x2bf11fb4, + 0x95dbda4d, 0xae909198, 0xeaad8e71, 0x6b93d5a0, + 0xd08ed1d0, 0xafc725e0, 0x8e3c5b2f, 0x8e7594b7, + 0x8ff6e2fb, 0xf2122b64, 0x8888b812, 0x900df01c, + 0x4fad5ea0, 0x688fc31c, 0xd1cff191, 0xb3a8c1ad, + 0x2f2f2218, 0xbe0e1777, 0xea752dfe, 0x8b021fa1, + 0xe5a0cc0f, 0xb56f74e8, 0x18acf3d6, 0xce89e299, + 0xb4a84fe0, 0xfd13e0b7, 0x7cc43b81, 0xd2ada8d9, + 0x165fa266, 0x80957705, 0x93cc7314, 0x211a1477, + 0xe6ad2065, 0x77b5fa86, 0xc75442f5, 0xfb9d35cf, + 0xebcdaf0c, 0x7b3e89a0, 0xd6411bd3, 0xae1e7e49, + 0x00250e2d, 0x2071b35e, 0x226800bb, 0x57b8e0af, + 0x2464369b, 0xf009b91e, 0x5563911d, 0x59dfa6aa, + 0x78c14389, 0xd95a537f, 0x207d5ba2, 0x02e5b9c5, + 0x83260376, 0x6295cfa9, 0x11c81968, 0x4e734a41, + 0xb3472dca, 0x7b14a94a, 0x1b510052, 0x9a532915, + 0xd60f573f, 0xbc9bc6e4, 0x2b60a476, 0x81e67400, + 0x08ba6fb5, 0x571be91f, 0xf296ec6b, 0x2a0dd915, + 0xb6636521, 0xe7b9f9b6, 0xff34052e, 0xc5855664, + 0x53b02d5d, 0xa99f8fa1, 0x08ba4799, 0x6e85076a +}; + +__constant u32 c_sbox1[256] = +{ + 0x4b7a70e9, 0xb5b32944, 0xdb75092e, 0xc4192623, + 0xad6ea6b0, 0x49a7df7d, 0x9cee60b8, 0x8fedb266, + 0xecaa8c71, 0x699a17ff, 0x5664526c, 0xc2b19ee1, + 0x193602a5, 0x75094c29, 0xa0591340, 0xe4183a3e, + 0x3f54989a, 0x5b429d65, 0x6b8fe4d6, 0x99f73fd6, + 0xa1d29c07, 0xefe830f5, 0x4d2d38e6, 0xf0255dc1, + 0x4cdd2086, 0x8470eb26, 0x6382e9c6, 0x021ecc5e, + 0x09686b3f, 0x3ebaefc9, 0x3c971814, 0x6b6a70a1, + 0x687f3584, 0x52a0e286, 0xb79c5305, 0xaa500737, + 0x3e07841c, 0x7fdeae5c, 0x8e7d44ec, 0x5716f2b8, + 0xb03ada37, 0xf0500c0d, 0xf01c1f04, 0x0200b3ff, + 0xae0cf51a, 0x3cb574b2, 0x25837a58, 0xdc0921bd, + 0xd19113f9, 0x7ca92ff6, 0x94324773, 0x22f54701, + 0x3ae5e581, 0x37c2dadc, 0xc8b57634, 0x9af3dda7, + 0xa9446146, 0x0fd0030e, 0xecc8c73e, 0xa4751e41, + 0xe238cd99, 0x3bea0e2f, 0x3280bba1, 0x183eb331, + 0x4e548b38, 0x4f6db908, 0x6f420d03, 0xf60a04bf, + 0x2cb81290, 0x24977c79, 0x5679b072, 0xbcaf89af, + 0xde9a771f, 0xd9930810, 0xb38bae12, 0xdccf3f2e, + 0x5512721f, 0x2e6b7124, 0x501adde6, 0x9f84cd87, + 0x7a584718, 0x7408da17, 0xbc9f9abc, 0xe94b7d8c, + 0xec7aec3a, 0xdb851dfa, 0x63094366, 0xc464c3d2, + 0xef1c1847, 0x3215d908, 0xdd433b37, 0x24c2ba16, + 0x12a14d43, 0x2a65c451, 0x50940002, 0x133ae4dd, + 0x71dff89e, 0x10314e55, 0x81ac77d6, 0x5f11199b, + 0x043556f1, 0xd7a3c76b, 0x3c11183b, 0x5924a509, + 0xf28fe6ed, 0x97f1fbfa, 0x9ebabf2c, 0x1e153c6e, + 0x86e34570, 0xeae96fb1, 0x860e5e0a, 0x5a3e2ab3, + 0x771fe71c, 0x4e3d06fa, 0x2965dcb9, 0x99e71d0f, + 0x803e89d6, 0x5266c825, 0x2e4cc978, 0x9c10b36a, + 0xc6150eba, 0x94e2ea78, 0xa5fc3c53, 0x1e0a2df4, + 0xf2f74ea7, 0x361d2b3d, 0x1939260f, 0x19c27960, + 0x5223a708, 0xf71312b6, 0xebadfe6e, 0xeac31f66, + 0xe3bc4595, 0xa67bc883, 0xb17f37d1, 0x018cff28, + 0xc332ddef, 0xbe6c5aa5, 0x65582185, 0x68ab9802, + 0xeecea50f, 0xdb2f953b, 0x2aef7dad, 0x5b6e2f84, + 0x1521b628, 0x29076170, 0xecdd4775, 0x619f1510, + 0x13cca830, 0xeb61bd96, 0x0334fe1e, 0xaa0363cf, + 0xb5735c90, 0x4c70a239, 0xd59e9e0b, 0xcbaade14, + 0xeecc86bc, 0x60622ca7, 0x9cab5cab, 0xb2f3846e, + 0x648b1eaf, 0x19bdf0ca, 0xa02369b9, 0x655abb50, + 0x40685a32, 0x3c2ab4b3, 0x319ee9d5, 0xc021b8f7, + 0x9b540b19, 0x875fa099, 0x95f7997e, 0x623d7da8, + 0xf837889a, 0x97e32d77, 0x11ed935f, 0x16681281, + 0x0e358829, 0xc7e61fd6, 0x96dedfa1, 0x7858ba99, + 0x57f584a5, 0x1b227263, 0x9b83c3ff, 0x1ac24696, + 0xcdb30aeb, 0x532e3054, 0x8fd948e4, 0x6dbc3128, + 0x58ebf2ef, 0x34c6ffea, 0xfe28ed61, 0xee7c3c73, + 0x5d4a14d9, 0xe864b7e3, 0x42105d14, 0x203e13e0, + 0x45eee2b6, 0xa3aaabea, 0xdb6c4f15, 0xfacb4fd0, + 0xc742f442, 0xef6abbb5, 0x654f3b1d, 0x41cd2105, + 0xd81e799e, 0x86854dc7, 0xe44b476a, 0x3d816250, + 0xcf62a1f2, 0x5b8d2646, 0xfc8883a0, 0xc1c7b6a3, + 0x7f1524c3, 0x69cb7492, 0x47848a0b, 0x5692b285, + 0x095bbf00, 0xad19489d, 0x1462b174, 0x23820e00, + 0x58428d2a, 0x0c55f5ea, 0x1dadf43e, 0x233f7061, + 0x3372f092, 0x8d937e41, 0xd65fecf1, 0x6c223bdb, + 0x7cde3759, 0xcbee7460, 0x4085f2a7, 0xce77326e, + 0xa6078084, 0x19f8509e, 0xe8efd855, 0x61d99735, + 0xa969a7aa, 0xc50c06c2, 0x5a04abfc, 0x800bcadc, + 0x9e447a2e, 0xc3453484, 0xfdd56705, 0x0e1e9ec9, + 0xdb73dbd3, 0x105588cd, 0x675fda79, 0xe3674340, + 0xc5c43465, 0x713e38d8, 0x3d28f89e, 0xf16dff20, + 0x153e21e7, 0x8fb03d4a, 0xe6e39f2b, 0xdb83adf7 +}; + +__constant u32 c_sbox2[256] = +{ + 0xe93d5a68, 0x948140f7, 0xf64c261c, 0x94692934, + 0x411520f7, 0x7602d4f7, 0xbcf46b2e, 0xd4a20068, + 0xd4082471, 0x3320f46a, 0x43b7d4b7, 0x500061af, + 0x1e39f62e, 0x97244546, 0x14214f74, 0xbf8b8840, + 0x4d95fc1d, 0x96b591af, 0x70f4ddd3, 0x66a02f45, + 0xbfbc09ec, 0x03bd9785, 0x7fac6dd0, 0x31cb8504, + 0x96eb27b3, 0x55fd3941, 0xda2547e6, 0xabca0a9a, + 0x28507825, 0x530429f4, 0x0a2c86da, 0xe9b66dfb, + 0x68dc1462, 0xd7486900, 0x680ec0a4, 0x27a18dee, + 0x4f3ffea2, 0xe887ad8c, 0xb58ce006, 0x7af4d6b6, + 0xaace1e7c, 0xd3375fec, 0xce78a399, 0x406b2a42, + 0x20fe9e35, 0xd9f385b9, 0xee39d7ab, 0x3b124e8b, + 0x1dc9faf7, 0x4b6d1856, 0x26a36631, 0xeae397b2, + 0x3a6efa74, 0xdd5b4332, 0x6841e7f7, 0xca7820fb, + 0xfb0af54e, 0xd8feb397, 0x454056ac, 0xba489527, + 0x55533a3a, 0x20838d87, 0xfe6ba9b7, 0xd096954b, + 0x55a867bc, 0xa1159a58, 0xcca92963, 0x99e1db33, + 0xa62a4a56, 0x3f3125f9, 0x5ef47e1c, 0x9029317c, + 0xfdf8e802, 0x04272f70, 0x80bb155c, 0x05282ce3, + 0x95c11548, 0xe4c66d22, 0x48c1133f, 0xc70f86dc, + 0x07f9c9ee, 0x41041f0f, 0x404779a4, 0x5d886e17, + 0x325f51eb, 0xd59bc0d1, 0xf2bcc18f, 0x41113564, + 0x257b7834, 0x602a9c60, 0xdff8e8a3, 0x1f636c1b, + 0x0e12b4c2, 0x02e1329e, 0xaf664fd1, 0xcad18115, + 0x6b2395e0, 0x333e92e1, 0x3b240b62, 0xeebeb922, + 0x85b2a20e, 0xe6ba0d99, 0xde720c8c, 0x2da2f728, + 0xd0127845, 0x95b794fd, 0x647d0862, 0xe7ccf5f0, + 0x5449a36f, 0x877d48fa, 0xc39dfd27, 0xf33e8d1e, + 0x0a476341, 0x992eff74, 0x3a6f6eab, 0xf4f8fd37, + 0xa812dc60, 0xa1ebddf8, 0x991be14c, 0xdb6e6b0d, + 0xc67b5510, 0x6d672c37, 0x2765d43b, 0xdcd0e804, + 0xf1290dc7, 0xcc00ffa3, 0xb5390f92, 0x690fed0b, + 0x667b9ffb, 0xcedb7d9c, 0xa091cf0b, 0xd9155ea3, + 0xbb132f88, 0x515bad24, 0x7b9479bf, 0x763bd6eb, + 0x37392eb3, 0xcc115979, 0x8026e297, 0xf42e312d, + 0x6842ada7, 0xc66a2b3b, 0x12754ccc, 0x782ef11c, + 0x6a124237, 0xb79251e7, 0x06a1bbe6, 0x4bfb6350, + 0x1a6b1018, 0x11caedfa, 0x3d25bdd8, 0xe2e1c3c9, + 0x44421659, 0x0a121386, 0xd90cec6e, 0xd5abea2a, + 0x64af674e, 0xda86a85f, 0xbebfe988, 0x64e4c3fe, + 0x9dbc8057, 0xf0f7c086, 0x60787bf8, 0x6003604d, + 0xd1fd8346, 0xf6381fb0, 0x7745ae04, 0xd736fccc, + 0x83426b33, 0xf01eab71, 0xb0804187, 0x3c005e5f, + 0x77a057be, 0xbde8ae24, 0x55464299, 0xbf582e61, + 0x4e58f48f, 0xf2ddfda2, 0xf474ef38, 0x8789bdc2, + 0x5366f9c3, 0xc8b38e74, 0xb475f255, 0x46fcd9b9, + 0x7aeb2661, 0x8b1ddf84, 0x846a0e79, 0x915f95e2, + 0x466e598e, 0x20b45770, 0x8cd55591, 0xc902de4c, + 0xb90bace1, 0xbb8205d0, 0x11a86248, 0x7574a99e, + 0xb77f19b6, 0xe0a9dc09, 0x662d09a1, 0xc4324633, + 0xe85a1f02, 0x09f0be8c, 0x4a99a025, 0x1d6efe10, + 0x1ab93d1d, 0x0ba5a4df, 0xa186f20f, 0x2868f169, + 0xdcb7da83, 0x573906fe, 0xa1e2ce9b, 0x4fcd7f52, + 0x50115e01, 0xa70683fa, 0xa002b5c4, 0x0de6d027, + 0x9af88c27, 0x773f8641, 0xc3604c06, 0x61a806b5, + 0xf0177a28, 0xc0f586e0, 0x006058aa, 0x30dc7d62, + 0x11e69ed7, 0x2338ea63, 0x53c2dd94, 0xc2c21634, + 0xbbcbee56, 0x90bcb6de, 0xebfc7da1, 0xce591d76, + 0x6f05e409, 0x4b7c0188, 0x39720a3d, 0x7c927c24, + 0x86e3725f, 0x724d9db9, 0x1ac15bb4, 0xd39eb8fc, + 0xed545578, 0x08fca5b5, 0xd83d7cd3, 0x4dad0fc4, + 0x1e50ef5e, 0xb161e6f8, 0xa28514d9, 0x6c51133c, + 0x6fd5c7e7, 0x56e14ec4, 0x362abfce, 0xddc6c837, + 0xd79a3234, 0x92638212, 0x670efa8e, 0x406000e0 +}; + +__constant u32 c_sbox3[256] = +{ + 0x3a39ce37, 0xd3faf5cf, 0xabc27737, 0x5ac52d1b, + 0x5cb0679e, 0x4fa33742, 0xd3822740, 0x99bc9bbe, + 0xd5118e9d, 0xbf0f7315, 0xd62d1c7e, 0xc700c47b, + 0xb78c1b6b, 0x21a19045, 0xb26eb1be, 0x6a366eb4, + 0x5748ab2f, 0xbc946e79, 0xc6a376d2, 0x6549c2c8, + 0x530ff8ee, 0x468dde7d, 0xd5730a1d, 0x4cd04dc6, + 0x2939bbdb, 0xa9ba4650, 0xac9526e8, 0xbe5ee304, + 0xa1fad5f0, 0x6a2d519a, 0x63ef8ce2, 0x9a86ee22, + 0xc089c2b8, 0x43242ef6, 0xa51e03aa, 0x9cf2d0a4, + 0x83c061ba, 0x9be96a4d, 0x8fe51550, 0xba645bd6, + 0x2826a2f9, 0xa73a3ae1, 0x4ba99586, 0xef5562e9, + 0xc72fefd3, 0xf752f7da, 0x3f046f69, 0x77fa0a59, + 0x80e4a915, 0x87b08601, 0x9b09e6ad, 0x3b3ee593, + 0xe990fd5a, 0x9e34d797, 0x2cf0b7d9, 0x022b8b51, + 0x96d5ac3a, 0x017da67d, 0xd1cf3ed6, 0x7c7d2d28, + 0x1f9f25cf, 0xadf2b89b, 0x5ad6b472, 0x5a88f54c, + 0xe029ac71, 0xe019a5e6, 0x47b0acfd, 0xed93fa9b, + 0xe8d3c48d, 0x283b57cc, 0xf8d56629, 0x79132e28, + 0x785f0191, 0xed756055, 0xf7960e44, 0xe3d35e8c, + 0x15056dd4, 0x88f46dba, 0x03a16125, 0x0564f0bd, + 0xc3eb9e15, 0x3c9057a2, 0x97271aec, 0xa93a072a, + 0x1b3f6d9b, 0x1e6321f5, 0xf59c66fb, 0x26dcf319, + 0x7533d928, 0xb155fdf5, 0x03563482, 0x8aba3cbb, + 0x28517711, 0xc20ad9f8, 0xabcc5167, 0xccad925f, + 0x4de81751, 0x3830dc8e, 0x379d5862, 0x9320f991, + 0xea7a90c2, 0xfb3e7bce, 0x5121ce64, 0x774fbe32, + 0xa8b6e37e, 0xc3293d46, 0x48de5369, 0x6413e680, + 0xa2ae0810, 0xdd6db224, 0x69852dfd, 0x09072166, + 0xb39a460a, 0x6445c0dd, 0x586cdecf, 0x1c20c8ae, + 0x5bbef7dd, 0x1b588d40, 0xccd2017f, 0x6bb4e3bb, + 0xdda26a7e, 0x3a59ff45, 0x3e350a44, 0xbcb4cdd5, + 0x72eacea8, 0xfa6484bb, 0x8d6612ae, 0xbf3c6f47, + 0xd29be463, 0x542f5d9e, 0xaec2771b, 0xf64e6370, + 0x740e0d8d, 0xe75b1357, 0xf8721671, 0xaf537d5d, + 0x4040cb08, 0x4eb4e2cc, 0x34d2466a, 0x0115af84, + 0xe1b00428, 0x95983a1d, 0x06b89fb4, 0xce6ea048, + 0x6f3f3b82, 0x3520ab82, 0x011a1d4b, 0x277227f8, + 0x611560b1, 0xe7933fdc, 0xbb3a792b, 0x344525bd, + 0xa08839e1, 0x51ce794b, 0x2f32c9b7, 0xa01fbac9, + 0xe01cc87e, 0xbcc7d1f6, 0xcf0111c3, 0xa1e8aac7, + 0x1a908749, 0xd44fbd9a, 0xd0dadecb, 0xd50ada38, + 0x0339c32a, 0xc6913667, 0x8df9317c, 0xe0b12b4f, + 0xf79e59b7, 0x43f5bb3a, 0xf2d519ff, 0x27d9459c, + 0xbf97222c, 0x15e6fc2a, 0x0f91fc71, 0x9b941525, + 0xfae59361, 0xceb69ceb, 0xc2a86459, 0x12baa8d1, + 0xb6c1075e, 0xe3056a0c, 0x10d25065, 0xcb03a442, + 0xe0ec6e0e, 0x1698db3b, 0x4c98a0be, 0x3278e964, + 0x9f1f9532, 0xe0d392df, 0xd3a0342b, 0x8971f21e, + 0x1b0a7441, 0x4ba3348c, 0xc5be7120, 0xc37632d8, + 0xdf359f8d, 0x9b992f2e, 0xe60b6f47, 0x0fe3f11d, + 0xe54cda54, 0x1edad891, 0xce6279cf, 0xcd3e7e6f, + 0x1618b166, 0xfd2c1d05, 0x848fd2c5, 0xf6fb2299, + 0xf523f357, 0xa6327623, 0x93a83531, 0x56cccd02, + 0xacf08162, 0x5a75ebb5, 0x6e163697, 0x88d273cc, + 0xde966292, 0x81b949d0, 0x4c50901b, 0x71c65614, + 0xe6c6c7bd, 0x327a140a, 0x45e1d006, 0xc3f27b9a, + 0xc9aa53fd, 0x62a80f00, 0xbb25bfe2, 0x35bdd2f6, + 0x71126905, 0xb2040222, 0xb6cbcf7c, 0xcd769c2b, + 0x53113ec0, 0x1640e3d3, 0x38abbd60, 0x2547adf0, + 0xba38209c, 0xf746ce76, 0x77afa1c5, 0x20756060, + 0x85cbfe4e, 0x8ae88dd8, 0x7aaaf9b0, 0x4cf9aa7e, + 0x1948c25c, 0x02fb8a8c, 0x01c36ae4, 0xd6ebe1f9, + 0x90d4f869, 0xa65cdea0, 0x3f09252d, 0xc208e69f, + 0xb74e6132, 0xce77e25b, 0x578fdfe3, 0x3ac372e6 +}; + +__constant u32 c_pbox[18] = +{ + 0x243f6a88, 0x85a308d3, 0x13198a2e, 0x03707344, + 0xa4093822, 0x299f31d0, 0x082efa98, 0xec4e6c89, + 0x452821e6, 0x38d01377, 0xbe5466cf, 0x34e90c6c, + 0xc0ac29b7, 0xc97c50dd, 0x3f84d5b5, 0xb5470917, + 0x9216d5d9, 0x8979fb1b +}; + +#define BF_ROUND(L,R,N) \ +{ \ + uchar4 c = as_uchar4 ((L)); \ + \ + u32x tmp; \ + \ + tmp = S0[c.s3]; \ + tmp += S1[c.s2]; \ + tmp ^= S2[c.s1]; \ + tmp += S3[c.s0]; \ + \ + (R) ^= tmp ^ P[(N)]; \ +} + +#define BF_ENCRYPT(L,R) \ +{ \ + L ^= P[0]; \ + \ + BF_ROUND (L, R, 1); \ + BF_ROUND (R, L, 2); \ + BF_ROUND (L, R, 3); \ + BF_ROUND (R, L, 4); \ + BF_ROUND (L, R, 5); \ + BF_ROUND (R, L, 6); \ + BF_ROUND (L, R, 7); \ + BF_ROUND (R, L, 8); \ + BF_ROUND (L, R, 9); \ + BF_ROUND (R, L, 10); \ + BF_ROUND (L, R, 11); \ + BF_ROUND (R, L, 12); \ + BF_ROUND (L, R, 13); \ + BF_ROUND (R, L, 14); \ + BF_ROUND (L, R, 15); \ + BF_ROUND (R, L, 16); \ + \ + u32x tmp; \ + \ + tmp = R; \ + R = L; \ + L = tmp; \ + \ + L ^= P[17]; \ +} + +static void expand_key (u32x E[34], const u32x W[16], const u32 len) +{ + u8 *E_cur = (u8 *) E; + u8 *E_stop = E_cur + 72; + + while (E_cur < E_stop) + { + u8 *W_cur = (u8 *) W; + u8 *W_stop = W_cur + len; + + while (W_cur < W_stop) + { + *E_cur++ = *W_cur++; + } + + *E_cur++ = 0; + } +} + +__kernel void __attribute__((reqd_work_group_size (8, 1, 1))) m03200_init (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global bcrypt_tmp_t *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + const u32 lid = get_local_id (0); + + const u32 pw_len = pws[gid].pw_len; + + u32x w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = pws[gid].i[ 4]; + w[ 5] = pws[gid].i[ 5]; + w[ 6] = pws[gid].i[ 6]; + w[ 7] = pws[gid].i[ 7]; + w[ 8] = pws[gid].i[ 8]; + w[ 9] = pws[gid].i[ 9]; + w[10] = pws[gid].i[10]; + w[11] = pws[gid].i[11]; + w[12] = pws[gid].i[12]; + w[13] = pws[gid].i[13]; + w[14] = pws[gid].i[14]; + w[15] = pws[gid].i[15]; + + u32x E[34]; + + expand_key (E, w, pw_len); + + E[ 0] = swap_workaround (E[ 0]); + E[ 1] = swap_workaround (E[ 1]); + E[ 2] = swap_workaround (E[ 2]); + E[ 3] = swap_workaround (E[ 3]); + E[ 4] = swap_workaround (E[ 4]); + E[ 5] = swap_workaround (E[ 5]); + E[ 6] = swap_workaround (E[ 6]); + E[ 7] = swap_workaround (E[ 7]); + E[ 8] = swap_workaround (E[ 8]); + E[ 9] = swap_workaround (E[ 9]); + E[10] = swap_workaround (E[10]); + E[11] = swap_workaround (E[11]); + E[12] = swap_workaround (E[12]); + E[13] = swap_workaround (E[13]); + E[14] = swap_workaround (E[14]); + E[15] = swap_workaround (E[15]); + E[16] = swap_workaround (E[16]); + E[17] = swap_workaround (E[17]); + + /** + * salt + */ + + u32 salt_buf[4]; + + salt_buf[0] = salt_bufs[salt_pos].salt_buf[0]; + salt_buf[1] = salt_bufs[salt_pos].salt_buf[1]; + salt_buf[2] = salt_bufs[salt_pos].salt_buf[2]; + salt_buf[3] = salt_bufs[salt_pos].salt_buf[3]; + + /** + * do the key setup + */ + + __local u32x S0_all[8][256]; + __local u32x S1_all[8][256]; + __local u32x S2_all[8][256]; + __local u32x S3_all[8][256]; + + __local u32x *S0 = S0_all[lid]; + __local u32x *S1 = S1_all[lid]; + __local u32x *S2 = S2_all[lid]; + __local u32x *S3 = S3_all[lid]; + + // initstate + + u32x P[18]; + + for (u32 i = 0; i < 18; i++) + { + P[i] = c_pbox[i]; + } + + for (u32 i = 0; i < 256; i++) + { + S0[i] = c_sbox0[i]; + S1[i] = c_sbox1[i]; + S2[i] = c_sbox2[i]; + S3[i] = c_sbox3[i]; + } + + // expandstate + + for (u32 i = 0; i < 18; i++) + { + P[i] ^= E[i]; + } + + u32 L0 = 0; + u32 R0 = 0; + + for (u32 i = 0; i < 18; i += 2) + { + L0 ^= salt_buf[(i & 2) + 0]; + R0 ^= salt_buf[(i & 2) + 1]; + + BF_ENCRYPT (L0, R0); + + P[i + 0] = L0; + P[i + 1] = R0; + } + + for (u32 i = 0; i < 256; i += 4) + { + L0 ^= salt_buf[2]; + R0 ^= salt_buf[3]; + + BF_ENCRYPT (L0, R0); + + S0[i + 0] = L0; + S0[i + 1] = R0; + + L0 ^= salt_buf[0]; + R0 ^= salt_buf[1]; + + BF_ENCRYPT (L0, R0); + + S0[i + 2] = L0; + S0[i + 3] = R0; + } + + for (u32 i = 0; i < 256; i += 4) + { + L0 ^= salt_buf[2]; + R0 ^= salt_buf[3]; + + BF_ENCRYPT (L0, R0); + + S1[i + 0] = L0; + S1[i + 1] = R0; + + L0 ^= salt_buf[0]; + R0 ^= salt_buf[1]; + + BF_ENCRYPT (L0, R0); + + S1[i + 2] = L0; + S1[i + 3] = R0; + } + + for (u32 i = 0; i < 256; i += 4) + { + L0 ^= salt_buf[2]; + R0 ^= salt_buf[3]; + + BF_ENCRYPT (L0, R0); + + S2[i + 0] = L0; + S2[i + 1] = R0; + + L0 ^= salt_buf[0]; + R0 ^= salt_buf[1]; + + BF_ENCRYPT (L0, R0); + + S2[i + 2] = L0; + S2[i + 3] = R0; + } + + for (u32 i = 0; i < 256; i += 4) + { + L0 ^= salt_buf[2]; + R0 ^= salt_buf[3]; + + BF_ENCRYPT (L0, R0); + + S3[i + 0] = L0; + S3[i + 1] = R0; + + L0 ^= salt_buf[0]; + R0 ^= salt_buf[1]; + + BF_ENCRYPT (L0, R0); + + S3[i + 2] = L0; + S3[i + 3] = R0; + } + + // store + + for (u32 i = 0; i < 18; i++) + { + tmps[gid].P[i] = P[i]; + } + + for (u32 i = 0; i < 256; i++) + { + tmps[gid].S0[i] = S0[i]; + tmps[gid].S1[i] = S1[i]; + tmps[gid].S2[i] = S2[i]; + tmps[gid].S3[i] = S3[i]; + } +} + +__kernel void __attribute__((reqd_work_group_size (8, 1, 1))) m03200_loop (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global bcrypt_tmp_t *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + const u32 lid = get_local_id (0); + + const u32 pw_len = pws[gid].pw_len; + + u32x w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = pws[gid].i[ 4]; + w[ 5] = pws[gid].i[ 5]; + w[ 6] = pws[gid].i[ 6]; + w[ 7] = pws[gid].i[ 7]; + w[ 8] = pws[gid].i[ 8]; + w[ 9] = pws[gid].i[ 9]; + w[10] = pws[gid].i[10]; + w[11] = pws[gid].i[11]; + w[12] = pws[gid].i[12]; + w[13] = pws[gid].i[13]; + w[14] = pws[gid].i[14]; + w[15] = pws[gid].i[15]; + + u32x E[34]; + + expand_key (E, w, pw_len); + + E[ 0] = swap_workaround (E[ 0]); + E[ 1] = swap_workaround (E[ 1]); + E[ 2] = swap_workaround (E[ 2]); + E[ 3] = swap_workaround (E[ 3]); + E[ 4] = swap_workaround (E[ 4]); + E[ 5] = swap_workaround (E[ 5]); + E[ 6] = swap_workaround (E[ 6]); + E[ 7] = swap_workaround (E[ 7]); + E[ 8] = swap_workaround (E[ 8]); + E[ 9] = swap_workaround (E[ 9]); + E[10] = swap_workaround (E[10]); + E[11] = swap_workaround (E[11]); + E[12] = swap_workaround (E[12]); + E[13] = swap_workaround (E[13]); + E[14] = swap_workaround (E[14]); + E[15] = swap_workaround (E[15]); + E[16] = swap_workaround (E[16]); + E[17] = swap_workaround (E[17]); + + // load + + u32x P[18]; + + for (u32 i = 0; i < 18; i++) + { + P[i] = tmps[gid].P[i]; + } + + __local u32x S0_all[8][256]; + __local u32x S1_all[8][256]; + __local u32x S2_all[8][256]; + __local u32x S3_all[8][256]; + + __local u32x *S0 = S0_all[lid]; + __local u32x *S1 = S1_all[lid]; + __local u32x *S2 = S2_all[lid]; + __local u32x *S3 = S3_all[lid]; + + for (u32 i = 0; i < 256; i++) + { + S0[i] = tmps[gid].S0[i]; + S1[i] = tmps[gid].S1[i]; + S2[i] = tmps[gid].S2[i]; + S3[i] = tmps[gid].S3[i]; + } + + /** + * salt + */ + + u32 salt_buf[4]; + + salt_buf[0] = salt_bufs[salt_pos].salt_buf[0]; + salt_buf[1] = salt_bufs[salt_pos].salt_buf[1]; + salt_buf[2] = salt_bufs[salt_pos].salt_buf[2]; + salt_buf[3] = salt_bufs[salt_pos].salt_buf[3]; + + /** + * main loop + */ + + u32 L0; + u32 R0; + + for (u32 i = 0; i < loop_cnt; i++) + { + for (u32 i = 0; i < 18; i++) + { + P[i] ^= E[i]; + } + + L0 = 0; + R0 = 0; + + for (u32 i = 0; i < 9; i++) + { + BF_ENCRYPT (L0, R0); + + P[i * 2 + 0] = L0; + P[i * 2 + 1] = R0; + } + + for (u32 i = 0; i < 256; i += 2) + { + BF_ENCRYPT (L0, R0); + + S0[i + 0] = L0; + S0[i + 1] = R0; + } + + for (u32 i = 0; i < 256; i += 2) + { + BF_ENCRYPT (L0, R0); + + S1[i + 0] = L0; + S1[i + 1] = R0; + } + + for (u32 i = 0; i < 256; i += 2) + { + BF_ENCRYPT (L0, R0); + + S2[i + 0] = L0; + S2[i + 1] = R0; + } + + for (u32 i = 0; i < 256; i += 2) + { + BF_ENCRYPT (L0, R0); + + S3[i + 0] = L0; + S3[i + 1] = R0; + } + + P[ 0] ^= salt_buf[0]; + P[ 1] ^= salt_buf[1]; + P[ 2] ^= salt_buf[2]; + P[ 3] ^= salt_buf[3]; + P[ 4] ^= salt_buf[0]; + P[ 5] ^= salt_buf[1]; + P[ 6] ^= salt_buf[2]; + P[ 7] ^= salt_buf[3]; + P[ 8] ^= salt_buf[0]; + P[ 9] ^= salt_buf[1]; + P[10] ^= salt_buf[2]; + P[11] ^= salt_buf[3]; + P[12] ^= salt_buf[0]; + P[13] ^= salt_buf[1]; + P[14] ^= salt_buf[2]; + P[15] ^= salt_buf[3]; + P[16] ^= salt_buf[0]; + P[17] ^= salt_buf[1]; + + L0 = 0; + R0 = 0; + + for (u32 i = 0; i < 9; i++) + { + BF_ENCRYPT (L0, R0); + + P[i * 2 + 0] = L0; + P[i * 2 + 1] = R0; + } + + for (u32 i = 0; i < 256; i += 2) + { + BF_ENCRYPT (L0, R0); + + S0[i + 0] = L0; + S0[i + 1] = R0; + } + + for (u32 i = 0; i < 256; i += 2) + { + BF_ENCRYPT (L0, R0); + + S1[i + 0] = L0; + S1[i + 1] = R0; + } + + for (u32 i = 0; i < 256; i += 2) + { + BF_ENCRYPT (L0, R0); + + S2[i + 0] = L0; + S2[i + 1] = R0; + } + + for (u32 i = 0; i < 256; i += 2) + { + BF_ENCRYPT (L0, R0); + + S3[i + 0] = L0; + S3[i + 1] = R0; + } + } + + // store + + for (u32 i = 0; i < 18; i++) + { + tmps[gid].P[i] = P[i]; + } + + for (u32 i = 0; i < 256; i++) + { + tmps[gid].S0[i] = S0[i]; + tmps[gid].S1[i] = S1[i]; + tmps[gid].S2[i] = S2[i]; + tmps[gid].S3[i] = S3[i]; + } +} + +__kernel void __attribute__((reqd_work_group_size (8, 1, 1))) m03200_comp (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global bcrypt_tmp_t *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + const u32 lid = get_local_id (0); + + // load + + u32x P[18]; + + for (u32 i = 0; i < 18; i++) + { + P[i] = tmps[gid].P[i]; + } + + __local u32x S0_all[8][256]; + __local u32x S1_all[8][256]; + __local u32x S2_all[8][256]; + __local u32x S3_all[8][256]; + + __local u32x *S0 = S0_all[lid]; + __local u32x *S1 = S1_all[lid]; + __local u32x *S2 = S2_all[lid]; + __local u32x *S3 = S3_all[lid]; + + for (u32 i = 0; i < 256; i++) + { + S0[i] = tmps[gid].S0[i]; + S1[i] = tmps[gid].S1[i]; + S2[i] = tmps[gid].S2[i]; + S3[i] = tmps[gid].S3[i]; + } + + /** + * main + */ + + u32 L0; + u32 R0; + + L0 = BCRYPTM_0; + R0 = BCRYPTM_1; + + for (u32 i = 0; i < 64; i++) + { + BF_ENCRYPT (L0, R0); + } + + const u32x r0 = L0; + const u32x r1 = R0; + + L0 = BCRYPTM_2; + R0 = BCRYPTM_3; + + for (u32 i = 0; i < 64; i++) + { + BF_ENCRYPT (L0, R0); + } + + const u32x r2 = L0; + const u32x r3 = R0; + + /* + e = L0; + f = R0; + + f &= ~0xff; // its just 23 not 24 ! + */ + + #define il_pos 0 + + #include VECT_COMPARE_M +} diff --git a/amd/m03710_a0.cl b/amd/m03710_a0.cl new file mode 100644 index 0000000000..142a953e3b --- /dev/null +++ b/amd/m03710_a0.cl @@ -0,0 +1,811 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _MD5_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW4 +#define VECT_SIZE4 +#endif + +#ifdef VLIW5 +#define VECT_SIZE4 +#endif + +#define DGST_R0 0 +#define DGST_R1 3 +#define DGST_R2 2 +#define DGST_R3 1 + +#include "include/kernel_functions.c" +#include "types_amd.c" +#include "common_amd.c" +#include "include/rp_gpu.h" +#include "rp_amd.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +#ifdef VECT_SIZE1 +#define uint_to_hex_lower8(i) l_bin2asc[(i)] +#endif + +#ifdef VECT_SIZE2 +#define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1]) +#endif + +#ifdef VECT_SIZE4 +#define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3]) +#endif + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m03710_m04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + u32x pw_buf1[4]; + + pw_buf1[0] = pws[gid].i[ 4]; + pw_buf1[1] = pws[gid].i[ 5]; + pw_buf1[2] = pws[gid].i[ 6]; + pw_buf1[3] = pws[gid].i[ 7]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[ 1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[ 2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[ 3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[ 4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[ 5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[ 6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[ 7]; + + u32 salt_buf2[4]; + + salt_buf2[0] = 0; + salt_buf2[1] = 0; + salt_buf2[2] = 0; + salt_buf2[3] = 0; + + u32 salt_buf3[4]; + + salt_buf3[0] = 0; + salt_buf3[1] = 0; + salt_buf3[2] = 0; + salt_buf3[3] = 0; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + const u32 pw_salt_len = 32 + salt_len; + + /** + * bin2asc table + */ + + __local u32 l_bin2asc[256]; + + const u32 lid4 = lid * 4; + + const u32 lid40 = lid4 + 0; + const u32 lid41 = lid4 + 1; + const u32 lid42 = lid4 + 2; + const u32 lid43 = lid4 + 3; + + const u32 v400 = (lid40 >> 0) & 15; + const u32 v401 = (lid40 >> 4) & 15; + const u32 v410 = (lid41 >> 0) & 15; + const u32 v411 = (lid41 >> 4) & 15; + const u32 v420 = (lid42 >> 0) & 15; + const u32 v421 = (lid42 >> 4) & 15; + const u32 v430 = (lid43 >> 0) & 15; + const u32 v431 = (lid43 >> 4) & 15; + + l_bin2asc[lid40] = ((v400 < 10) ? '0' + v400 : 'a' - 10 + v400) << 8 + | ((v401 < 10) ? '0' + v401 : 'a' - 10 + v401) << 0; + l_bin2asc[lid41] = ((v410 < 10) ? '0' + v410 : 'a' - 10 + v410) << 8 + | ((v411 < 10) ? '0' + v411 : 'a' - 10 + v411) << 0; + l_bin2asc[lid42] = ((v420 < 10) ? '0' + v420 : 'a' - 10 + v420) << 8 + | ((v421 < 10) ? '0' + v421 : 'a' - 10 + v421) << 0; + l_bin2asc[lid43] = ((v430 < 10) ? '0' + v430 : 'a' - 10 + v430) << 8 + | ((v431 < 10) ? '0' + v431 : 'a' - 10 + v431) << 0; + + barrier (CLK_LOCAL_MEM_FENCE); + + if (gid >= gid_max) return; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + + w0[0] = pw_buf0[0]; + w0[1] = pw_buf0[1]; + w0[2] = pw_buf0[2]; + w0[3] = pw_buf0[3]; + + u32x w1[4]; + + w1[0] = pw_buf1[0]; + w1[1] = pw_buf1[1]; + w1[2] = pw_buf1[2]; + w1[3] = pw_buf1[3]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 out_len = apply_rules (rules_buf[il_pos].cmds, w0, w1, pw_len); + + append_0x80_2 (w0, w1, out_len); + + w3[2] = out_len * 8; + + u32x a = MD5M_A; + u32x b = MD5M_B; + u32x c = MD5M_C; + u32x d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H , a, b, c, d, w1[1], MD5C20, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w2[0], MD5C21, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w2[3], MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w3[2], MD5C23, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w0[1], MD5C24, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w1[0], MD5C25, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w1[3], MD5C26, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w2[2], MD5C27, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w3[1], MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w0[0], MD5C29, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w0[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w1[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w2[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w3[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w3[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w0[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1[0], MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w2[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2[1], MD5C3f, MD5S33); + + a += MD5M_A; + b += MD5M_B; + c += MD5M_C; + d += MD5M_D; + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + w0_t[0] = uint_to_hex_lower8 ((a >> 0) & 255) << 0 + | uint_to_hex_lower8 ((a >> 8) & 255) << 16; + w0_t[1] = uint_to_hex_lower8 ((a >> 16) & 255) << 0 + | uint_to_hex_lower8 ((a >> 24) & 255) << 16; + w0_t[2] = uint_to_hex_lower8 ((b >> 0) & 255) << 0 + | uint_to_hex_lower8 ((b >> 8) & 255) << 16; + w0_t[3] = uint_to_hex_lower8 ((b >> 16) & 255) << 0 + | uint_to_hex_lower8 ((b >> 24) & 255) << 16; + w1_t[0] = uint_to_hex_lower8 ((c >> 0) & 255) << 0 + | uint_to_hex_lower8 ((c >> 8) & 255) << 16; + w1_t[1] = uint_to_hex_lower8 ((c >> 16) & 255) << 0 + | uint_to_hex_lower8 ((c >> 24) & 255) << 16; + w1_t[2] = uint_to_hex_lower8 ((d >> 0) & 255) << 0 + | uint_to_hex_lower8 ((d >> 8) & 255) << 16; + w1_t[3] = uint_to_hex_lower8 ((d >> 16) & 255) << 0 + | uint_to_hex_lower8 ((d >> 24) & 255) << 16; + + w2_t[0] = 0x00000080; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = 0; + + /** + * prepend salt + */ + + switch_buffer_by_offset (w0_t, w1_t, w2_t, w3_t, salt_len); + + w3_t[2] = pw_salt_len * 8; + + w0_t[0] |= salt_buf0[0]; + w0_t[1] |= salt_buf0[1]; + w0_t[2] |= salt_buf0[2]; + w0_t[3] |= salt_buf0[3]; + w1_t[0] |= salt_buf1[0]; + w1_t[1] |= salt_buf1[1]; + w1_t[2] |= salt_buf1[2]; + w1_t[3] |= salt_buf1[3]; + w2_t[0] |= salt_buf2[0]; + w2_t[1] |= salt_buf2[1]; + w2_t[2] |= salt_buf2[2]; + w2_t[3] |= salt_buf2[3]; + w3_t[0] |= salt_buf3[0]; + w3_t[1] |= salt_buf3[1]; + w3_t[2] |= salt_buf3[2]; + w3_t[3] |= salt_buf3[3]; + + /** + * md5 + */ + + a = MD5M_A; + b = MD5M_B; + c = MD5M_C; + d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0_t[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0_t[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0_t[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1_t[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1_t[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1_t[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2_t[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2_t[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2_t[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3_t[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3_t[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3_t[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0_t[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1_t[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2_t[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1_t[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1_t[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2_t[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3_t[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0_t[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2_t[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3_t[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0_t[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1_t[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3_t[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H , a, b, c, d, w1_t[1], MD5C20, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w2_t[0], MD5C21, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w2_t[3], MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w3_t[2], MD5C23, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w0_t[1], MD5C24, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w1_t[0], MD5C25, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w1_t[3], MD5C26, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w2_t[2], MD5C27, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w3_t[1], MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w0_t[0], MD5C29, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w0_t[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w1_t[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w2_t[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w3_t[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w3_t[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w0_t[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1_t[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3_t[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3_t[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0_t[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0_t[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2_t[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1_t[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3_t[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1_t[0], MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w2_t[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0_t[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2_t[1], MD5C3f, MD5S33); + + const u32x r0 = a; + const u32x r1 = d; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_M + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m03710_m08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m03710_m16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m03710_s04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + u32x pw_buf1[4]; + + pw_buf1[0] = pws[gid].i[ 4]; + pw_buf1[1] = pws[gid].i[ 5]; + pw_buf1[2] = pws[gid].i[ 6]; + pw_buf1[3] = pws[gid].i[ 7]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[ 1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[ 2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[ 3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[ 4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[ 5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[ 6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[ 7]; + + u32 salt_buf2[4]; + + salt_buf2[0] = 0; + salt_buf2[1] = 0; + salt_buf2[2] = 0; + salt_buf2[3] = 0; + + u32 salt_buf3[4]; + + salt_buf3[0] = 0; + salt_buf3[1] = 0; + salt_buf3[2] = 0; + salt_buf3[3] = 0; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + const u32 pw_salt_len = 32 + salt_len; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * bin2asc table + */ + + __local u32 l_bin2asc[256]; + + const u32 lid4 = lid * 4; + + const u32 lid40 = lid4 + 0; + const u32 lid41 = lid4 + 1; + const u32 lid42 = lid4 + 2; + const u32 lid43 = lid4 + 3; + + const u32 v400 = (lid40 >> 0) & 15; + const u32 v401 = (lid40 >> 4) & 15; + const u32 v410 = (lid41 >> 0) & 15; + const u32 v411 = (lid41 >> 4) & 15; + const u32 v420 = (lid42 >> 0) & 15; + const u32 v421 = (lid42 >> 4) & 15; + const u32 v430 = (lid43 >> 0) & 15; + const u32 v431 = (lid43 >> 4) & 15; + + l_bin2asc[lid40] = ((v400 < 10) ? '0' + v400 : 'a' - 10 + v400) << 8 + | ((v401 < 10) ? '0' + v401 : 'a' - 10 + v401) << 0; + l_bin2asc[lid41] = ((v410 < 10) ? '0' + v410 : 'a' - 10 + v410) << 8 + | ((v411 < 10) ? '0' + v411 : 'a' - 10 + v411) << 0; + l_bin2asc[lid42] = ((v420 < 10) ? '0' + v420 : 'a' - 10 + v420) << 8 + | ((v421 < 10) ? '0' + v421 : 'a' - 10 + v421) << 0; + l_bin2asc[lid43] = ((v430 < 10) ? '0' + v430 : 'a' - 10 + v430) << 8 + | ((v431 < 10) ? '0' + v431 : 'a' - 10 + v431) << 0; + + barrier (CLK_LOCAL_MEM_FENCE); + + if (gid >= gid_max) return; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + + w0[0] = pw_buf0[0]; + w0[1] = pw_buf0[1]; + w0[2] = pw_buf0[2]; + w0[3] = pw_buf0[3]; + + u32x w1[4]; + + w1[0] = pw_buf1[0]; + w1[1] = pw_buf1[1]; + w1[2] = pw_buf1[2]; + w1[3] = pw_buf1[3]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 out_len = apply_rules (rules_buf[il_pos].cmds, w0, w1, pw_len); + + append_0x80_2 (w0, w1, out_len); + + w3[2] = out_len * 8; + + u32x a = MD5M_A; + u32x b = MD5M_B; + u32x c = MD5M_C; + u32x d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H , a, b, c, d, w1[1], MD5C20, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w2[0], MD5C21, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w2[3], MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w3[2], MD5C23, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w0[1], MD5C24, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w1[0], MD5C25, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w1[3], MD5C26, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w2[2], MD5C27, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w3[1], MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w0[0], MD5C29, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w0[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w1[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w2[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w3[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w3[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w0[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1[0], MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w2[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2[1], MD5C3f, MD5S33); + + a += MD5M_A; + b += MD5M_B; + c += MD5M_C; + d += MD5M_D; + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + w0_t[0] = uint_to_hex_lower8 ((a >> 0) & 255) << 0 + | uint_to_hex_lower8 ((a >> 8) & 255) << 16; + w0_t[1] = uint_to_hex_lower8 ((a >> 16) & 255) << 0 + | uint_to_hex_lower8 ((a >> 24) & 255) << 16; + w0_t[2] = uint_to_hex_lower8 ((b >> 0) & 255) << 0 + | uint_to_hex_lower8 ((b >> 8) & 255) << 16; + w0_t[3] = uint_to_hex_lower8 ((b >> 16) & 255) << 0 + | uint_to_hex_lower8 ((b >> 24) & 255) << 16; + w1_t[0] = uint_to_hex_lower8 ((c >> 0) & 255) << 0 + | uint_to_hex_lower8 ((c >> 8) & 255) << 16; + w1_t[1] = uint_to_hex_lower8 ((c >> 16) & 255) << 0 + | uint_to_hex_lower8 ((c >> 24) & 255) << 16; + w1_t[2] = uint_to_hex_lower8 ((d >> 0) & 255) << 0 + | uint_to_hex_lower8 ((d >> 8) & 255) << 16; + w1_t[3] = uint_to_hex_lower8 ((d >> 16) & 255) << 0 + | uint_to_hex_lower8 ((d >> 24) & 255) << 16; + + w2_t[0] = 0x00000080; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = 0; + + /** + * prepend salt + */ + + switch_buffer_by_offset (w0_t, w1_t, w2_t, w3_t, salt_len); + + w3_t[2] = pw_salt_len * 8; + + w0_t[0] |= salt_buf0[0]; + w0_t[1] |= salt_buf0[1]; + w0_t[2] |= salt_buf0[2]; + w0_t[3] |= salt_buf0[3]; + w1_t[0] |= salt_buf1[0]; + w1_t[1] |= salt_buf1[1]; + w1_t[2] |= salt_buf1[2]; + w1_t[3] |= salt_buf1[3]; + w2_t[0] |= salt_buf2[0]; + w2_t[1] |= salt_buf2[1]; + w2_t[2] |= salt_buf2[2]; + w2_t[3] |= salt_buf2[3]; + w3_t[0] |= salt_buf3[0]; + w3_t[1] |= salt_buf3[1]; + w3_t[2] |= salt_buf3[2]; + w3_t[3] |= salt_buf3[3]; + + /** + * md5 + */ + + a = MD5M_A; + b = MD5M_B; + c = MD5M_C; + d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0_t[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0_t[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0_t[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1_t[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1_t[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1_t[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2_t[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2_t[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2_t[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3_t[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3_t[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3_t[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0_t[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1_t[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2_t[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1_t[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1_t[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2_t[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3_t[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0_t[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2_t[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3_t[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0_t[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1_t[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3_t[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H , a, b, c, d, w1_t[1], MD5C20, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w2_t[0], MD5C21, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w2_t[3], MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w3_t[2], MD5C23, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w0_t[1], MD5C24, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w1_t[0], MD5C25, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w1_t[3], MD5C26, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w2_t[2], MD5C27, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w3_t[1], MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w0_t[0], MD5C29, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w0_t[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w1_t[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w2_t[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w3_t[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w3_t[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w0_t[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1_t[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3_t[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3_t[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0_t[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0_t[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2_t[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1_t[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3_t[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1_t[0], MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w2_t[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0_t[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2_t[1], MD5C3f, MD5S33); + + const u32x r0 = a; + const u32x r1 = d; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_S + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m03710_s08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m03710_s16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/amd/m03710_a1.cl b/amd/m03710_a1.cl new file mode 100644 index 0000000000..880d1549a1 --- /dev/null +++ b/amd/m03710_a1.cl @@ -0,0 +1,913 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _MD5_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW4 +#define VECT_SIZE4 +#endif + +#ifdef VLIW5 +#define VECT_SIZE4 +#endif + +#define DGST_R0 0 +#define DGST_R1 3 +#define DGST_R2 2 +#define DGST_R3 1 + +#include "include/kernel_functions.c" +#include "types_amd.c" +#include "common_amd.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +#ifdef VECT_SIZE1 +#define uint_to_hex_lower8(i) l_bin2asc[(i)] +#endif + +#ifdef VECT_SIZE2 +#define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1]) +#endif + +#ifdef VECT_SIZE4 +#define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3]) +#endif + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m03710_m04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + append_0x80_2 (wordl0, wordl1, pw_l_len); + + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, combs_buf[0].pw_len); + } + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[ 1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[ 2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[ 3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[ 4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[ 5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[ 6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[ 7]; + + u32 salt_buf2[4]; + + salt_buf2[0] = 0; + salt_buf2[1] = 0; + salt_buf2[2] = 0; + salt_buf2[3] = 0; + + u32 salt_buf3[4]; + + salt_buf3[0] = 0; + salt_buf3[1] = 0; + salt_buf3[2] = 0; + salt_buf3[3] = 0; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + const u32 pw_salt_len = 32 + salt_len; + + /** + * bin2asc table + */ + + __local u32 l_bin2asc[256]; + + const u32 lid4 = lid * 4; + + const u32 lid40 = lid4 + 0; + const u32 lid41 = lid4 + 1; + const u32 lid42 = lid4 + 2; + const u32 lid43 = lid4 + 3; + + const u32 v400 = (lid40 >> 0) & 15; + const u32 v401 = (lid40 >> 4) & 15; + const u32 v410 = (lid41 >> 0) & 15; + const u32 v411 = (lid41 >> 4) & 15; + const u32 v420 = (lid42 >> 0) & 15; + const u32 v421 = (lid42 >> 4) & 15; + const u32 v430 = (lid43 >> 0) & 15; + const u32 v431 = (lid43 >> 4) & 15; + + l_bin2asc[lid40] = ((v400 < 10) ? '0' + v400 : 'a' - 10 + v400) << 8 + | ((v401 < 10) ? '0' + v401 : 'a' - 10 + v401) << 0; + l_bin2asc[lid41] = ((v410 < 10) ? '0' + v410 : 'a' - 10 + v410) << 8 + | ((v411 < 10) ? '0' + v411 : 'a' - 10 + v411) << 0; + l_bin2asc[lid42] = ((v420 < 10) ? '0' + v420 : 'a' - 10 + v420) << 8 + | ((v421 < 10) ? '0' + v421 : 'a' - 10 + v421) << 0; + l_bin2asc[lid43] = ((v430 < 10) ? '0' + v430 : 'a' - 10 + v430) << 8 + | ((v431 < 10) ? '0' + v431 : 'a' - 10 + v431) << 0; + + barrier (CLK_LOCAL_MEM_FENCE); + + if (gid >= gid_max) return; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = combs_buf[il_pos].pw_len; + + const u32 pw_len = pw_l_len + pw_r_len; + + u32 wordr0[4]; + + wordr0[0] = combs_buf[il_pos].i[0]; + wordr0[1] = combs_buf[il_pos].i[1]; + wordr0[2] = combs_buf[il_pos].i[2]; + wordr0[3] = combs_buf[il_pos].i[3]; + + u32 wordr1[4]; + + wordr1[0] = combs_buf[il_pos].i[4]; + wordr1[1] = combs_buf[il_pos].i[5]; + wordr1[2] = combs_buf[il_pos].i[6]; + wordr1[3] = combs_buf[il_pos].i[7]; + + u32 wordr2[4]; + + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + + u32 wordr3[4]; + + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + u32x w0[4]; + + w0[0] = wordl0[0] | wordr0[0]; + w0[1] = wordl0[1] | wordr0[1]; + w0[2] = wordl0[2] | wordr0[2]; + w0[3] = wordl0[3] | wordr0[3]; + + u32x w1[4]; + + w1[0] = wordl1[0] | wordr1[0]; + w1[1] = wordl1[1] | wordr1[1]; + w1[2] = wordl1[2] | wordr1[2]; + w1[3] = wordl1[3] | wordr1[3]; + + u32x w2[4]; + + w2[0] = wordl2[0] | wordr2[0]; + w2[1] = wordl2[1] | wordr2[1]; + w2[2] = wordl2[2] | wordr2[2]; + w2[3] = wordl2[3] | wordr2[3]; + + u32x w3[4]; + + w3[0] = wordl3[0] | wordr3[0]; + w3[1] = wordl3[1] | wordr3[1]; + w3[2] = pw_len * 8; + w3[3] = 0; + + u32x a = MD5M_A; + u32x b = MD5M_B; + u32x c = MD5M_C; + u32x d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H , a, b, c, d, w1[1], MD5C20, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w2[0], MD5C21, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w2[3], MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w3[2], MD5C23, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w0[1], MD5C24, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w1[0], MD5C25, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w1[3], MD5C26, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w2[2], MD5C27, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w3[1], MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w0[0], MD5C29, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w0[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w1[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w2[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w3[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w3[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w0[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1[0], MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w2[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2[1], MD5C3f, MD5S33); + + a += MD5M_A; + b += MD5M_B; + c += MD5M_C; + d += MD5M_D; + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + w0_t[0] = uint_to_hex_lower8 ((a >> 0) & 255) << 0 + | uint_to_hex_lower8 ((a >> 8) & 255) << 16; + w0_t[1] = uint_to_hex_lower8 ((a >> 16) & 255) << 0 + | uint_to_hex_lower8 ((a >> 24) & 255) << 16; + w0_t[2] = uint_to_hex_lower8 ((b >> 0) & 255) << 0 + | uint_to_hex_lower8 ((b >> 8) & 255) << 16; + w0_t[3] = uint_to_hex_lower8 ((b >> 16) & 255) << 0 + | uint_to_hex_lower8 ((b >> 24) & 255) << 16; + w1_t[0] = uint_to_hex_lower8 ((c >> 0) & 255) << 0 + | uint_to_hex_lower8 ((c >> 8) & 255) << 16; + w1_t[1] = uint_to_hex_lower8 ((c >> 16) & 255) << 0 + | uint_to_hex_lower8 ((c >> 24) & 255) << 16; + w1_t[2] = uint_to_hex_lower8 ((d >> 0) & 255) << 0 + | uint_to_hex_lower8 ((d >> 8) & 255) << 16; + w1_t[3] = uint_to_hex_lower8 ((d >> 16) & 255) << 0 + | uint_to_hex_lower8 ((d >> 24) & 255) << 16; + + w2_t[0] = 0x00000080; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = 0; + + /** + * prepend salt + */ + + switch_buffer_by_offset (w0_t, w1_t, w2_t, w3_t, salt_len); + + w3_t[2] = pw_salt_len * 8; + + w0_t[0] |= salt_buf0[0]; + w0_t[1] |= salt_buf0[1]; + w0_t[2] |= salt_buf0[2]; + w0_t[3] |= salt_buf0[3]; + w1_t[0] |= salt_buf1[0]; + w1_t[1] |= salt_buf1[1]; + w1_t[2] |= salt_buf1[2]; + w1_t[3] |= salt_buf1[3]; + w2_t[0] |= salt_buf2[0]; + w2_t[1] |= salt_buf2[1]; + w2_t[2] |= salt_buf2[2]; + w2_t[3] |= salt_buf2[3]; + w3_t[0] |= salt_buf3[0]; + w3_t[1] |= salt_buf3[1]; + w3_t[2] |= salt_buf3[2]; + w3_t[3] |= salt_buf3[3]; + + /** + * md5 + */ + + a = MD5M_A; + b = MD5M_B; + c = MD5M_C; + d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0_t[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0_t[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0_t[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1_t[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1_t[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1_t[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2_t[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2_t[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2_t[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3_t[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3_t[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3_t[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0_t[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1_t[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2_t[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1_t[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1_t[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2_t[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3_t[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0_t[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2_t[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3_t[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0_t[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1_t[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3_t[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H , a, b, c, d, w1_t[1], MD5C20, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w2_t[0], MD5C21, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w2_t[3], MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w3_t[2], MD5C23, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w0_t[1], MD5C24, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w1_t[0], MD5C25, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w1_t[3], MD5C26, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w2_t[2], MD5C27, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w3_t[1], MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w0_t[0], MD5C29, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w0_t[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w1_t[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w2_t[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w3_t[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w3_t[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w0_t[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1_t[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3_t[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3_t[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0_t[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0_t[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2_t[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1_t[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3_t[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1_t[0], MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w2_t[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0_t[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2_t[1], MD5C3f, MD5S33); + + const u32x r0 = a; + const u32x r1 = d; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_M + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m03710_m08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m03710_m16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m03710_s04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + append_0x80_2 (wordl0, wordl1, pw_l_len); + + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, combs_buf[0].pw_len); + } + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[ 1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[ 2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[ 3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[ 4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[ 5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[ 6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[ 7]; + + u32 salt_buf2[4]; + + salt_buf2[0] = 0; + salt_buf2[1] = 0; + salt_buf2[2] = 0; + salt_buf2[3] = 0; + + u32 salt_buf3[4]; + + salt_buf3[0] = 0; + salt_buf3[1] = 0; + salt_buf3[2] = 0; + salt_buf3[3] = 0; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + const u32 pw_salt_len = 32 + salt_len; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * bin2asc table + */ + + __local u32 l_bin2asc[256]; + + const u32 lid4 = lid * 4; + + const u32 lid40 = lid4 + 0; + const u32 lid41 = lid4 + 1; + const u32 lid42 = lid4 + 2; + const u32 lid43 = lid4 + 3; + + const u32 v400 = (lid40 >> 0) & 15; + const u32 v401 = (lid40 >> 4) & 15; + const u32 v410 = (lid41 >> 0) & 15; + const u32 v411 = (lid41 >> 4) & 15; + const u32 v420 = (lid42 >> 0) & 15; + const u32 v421 = (lid42 >> 4) & 15; + const u32 v430 = (lid43 >> 0) & 15; + const u32 v431 = (lid43 >> 4) & 15; + + l_bin2asc[lid40] = ((v400 < 10) ? '0' + v400 : 'a' - 10 + v400) << 8 + | ((v401 < 10) ? '0' + v401 : 'a' - 10 + v401) << 0; + l_bin2asc[lid41] = ((v410 < 10) ? '0' + v410 : 'a' - 10 + v410) << 8 + | ((v411 < 10) ? '0' + v411 : 'a' - 10 + v411) << 0; + l_bin2asc[lid42] = ((v420 < 10) ? '0' + v420 : 'a' - 10 + v420) << 8 + | ((v421 < 10) ? '0' + v421 : 'a' - 10 + v421) << 0; + l_bin2asc[lid43] = ((v430 < 10) ? '0' + v430 : 'a' - 10 + v430) << 8 + | ((v431 < 10) ? '0' + v431 : 'a' - 10 + v431) << 0; + + barrier (CLK_LOCAL_MEM_FENCE); + + if (gid >= gid_max) return; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = combs_buf[il_pos].pw_len; + + const u32 pw_len = pw_l_len + pw_r_len; + + u32 wordr0[4]; + + wordr0[0] = combs_buf[il_pos].i[0]; + wordr0[1] = combs_buf[il_pos].i[1]; + wordr0[2] = combs_buf[il_pos].i[2]; + wordr0[3] = combs_buf[il_pos].i[3]; + + u32 wordr1[4]; + + wordr1[0] = combs_buf[il_pos].i[4]; + wordr1[1] = combs_buf[il_pos].i[5]; + wordr1[2] = combs_buf[il_pos].i[6]; + wordr1[3] = combs_buf[il_pos].i[7]; + + u32 wordr2[4]; + + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + + u32 wordr3[4]; + + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + u32x w0[4]; + + w0[0] = wordl0[0] | wordr0[0]; + w0[1] = wordl0[1] | wordr0[1]; + w0[2] = wordl0[2] | wordr0[2]; + w0[3] = wordl0[3] | wordr0[3]; + + u32x w1[4]; + + w1[0] = wordl1[0] | wordr1[0]; + w1[1] = wordl1[1] | wordr1[1]; + w1[2] = wordl1[2] | wordr1[2]; + w1[3] = wordl1[3] | wordr1[3]; + + u32x w2[4]; + + w2[0] = wordl2[0] | wordr2[0]; + w2[1] = wordl2[1] | wordr2[1]; + w2[2] = wordl2[2] | wordr2[2]; + w2[3] = wordl2[3] | wordr2[3]; + + u32x w3[4]; + + w3[0] = wordl3[0] | wordr3[0]; + w3[1] = wordl3[1] | wordr3[1]; + w3[2] = pw_len * 8; + w3[3] = 0; + + u32x a = MD5M_A; + u32x b = MD5M_B; + u32x c = MD5M_C; + u32x d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H , a, b, c, d, w1[1], MD5C20, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w2[0], MD5C21, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w2[3], MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w3[2], MD5C23, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w0[1], MD5C24, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w1[0], MD5C25, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w1[3], MD5C26, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w2[2], MD5C27, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w3[1], MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w0[0], MD5C29, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w0[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w1[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w2[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w3[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w3[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w0[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1[0], MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w2[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2[1], MD5C3f, MD5S33); + + a += MD5M_A; + b += MD5M_B; + c += MD5M_C; + d += MD5M_D; + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + w0_t[0] = uint_to_hex_lower8 ((a >> 0) & 255) << 0 + | uint_to_hex_lower8 ((a >> 8) & 255) << 16; + w0_t[1] = uint_to_hex_lower8 ((a >> 16) & 255) << 0 + | uint_to_hex_lower8 ((a >> 24) & 255) << 16; + w0_t[2] = uint_to_hex_lower8 ((b >> 0) & 255) << 0 + | uint_to_hex_lower8 ((b >> 8) & 255) << 16; + w0_t[3] = uint_to_hex_lower8 ((b >> 16) & 255) << 0 + | uint_to_hex_lower8 ((b >> 24) & 255) << 16; + w1_t[0] = uint_to_hex_lower8 ((c >> 0) & 255) << 0 + | uint_to_hex_lower8 ((c >> 8) & 255) << 16; + w1_t[1] = uint_to_hex_lower8 ((c >> 16) & 255) << 0 + | uint_to_hex_lower8 ((c >> 24) & 255) << 16; + w1_t[2] = uint_to_hex_lower8 ((d >> 0) & 255) << 0 + | uint_to_hex_lower8 ((d >> 8) & 255) << 16; + w1_t[3] = uint_to_hex_lower8 ((d >> 16) & 255) << 0 + | uint_to_hex_lower8 ((d >> 24) & 255) << 16; + + w2_t[0] = 0x00000080; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = 0; + + /** + * prepend salt + */ + + switch_buffer_by_offset (w0_t, w1_t, w2_t, w3_t, salt_len); + + w3_t[2] = pw_salt_len * 8; + + w0_t[0] |= salt_buf0[0]; + w0_t[1] |= salt_buf0[1]; + w0_t[2] |= salt_buf0[2]; + w0_t[3] |= salt_buf0[3]; + w1_t[0] |= salt_buf1[0]; + w1_t[1] |= salt_buf1[1]; + w1_t[2] |= salt_buf1[2]; + w1_t[3] |= salt_buf1[3]; + w2_t[0] |= salt_buf2[0]; + w2_t[1] |= salt_buf2[1]; + w2_t[2] |= salt_buf2[2]; + w2_t[3] |= salt_buf2[3]; + w3_t[0] |= salt_buf3[0]; + w3_t[1] |= salt_buf3[1]; + w3_t[2] |= salt_buf3[2]; + w3_t[3] |= salt_buf3[3]; + + /** + * md5 + */ + + a = MD5M_A; + b = MD5M_B; + c = MD5M_C; + d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0_t[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0_t[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0_t[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1_t[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1_t[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1_t[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2_t[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2_t[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2_t[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3_t[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3_t[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3_t[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0_t[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1_t[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2_t[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1_t[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1_t[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2_t[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3_t[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0_t[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2_t[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3_t[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0_t[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1_t[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3_t[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H , a, b, c, d, w1_t[1], MD5C20, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w2_t[0], MD5C21, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w2_t[3], MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w3_t[2], MD5C23, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w0_t[1], MD5C24, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w1_t[0], MD5C25, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w1_t[3], MD5C26, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w2_t[2], MD5C27, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w3_t[1], MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w0_t[0], MD5C29, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w0_t[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w1_t[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w2_t[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w3_t[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w3_t[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w0_t[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1_t[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3_t[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3_t[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0_t[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0_t[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2_t[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1_t[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3_t[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1_t[0], MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w2_t[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0_t[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2_t[1], MD5C3f, MD5S33); + + const u32x r0 = a; + const u32x r1 = d; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_S + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m03710_s08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m03710_s16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/amd/m03710_a3.cl b/amd/m03710_a3.cl new file mode 100644 index 0000000000..75c66504cc --- /dev/null +++ b/amd/m03710_a3.cl @@ -0,0 +1,1141 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _MD5_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW4 +#define VECT_SIZE4 +#endif + +#ifdef VLIW5 +#define VECT_SIZE4 +#endif + +#define DGST_R0 0 +#define DGST_R1 3 +#define DGST_R2 2 +#define DGST_R3 1 + +#include "include/kernel_functions.c" +#include "types_amd.c" +#include "common_amd.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +#ifdef VECT_SIZE1 +#define uint_to_hex_lower8(i) l_bin2asc[(i)] +#endif + +#ifdef VECT_SIZE2 +#define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1]) +#endif + +#ifdef VECT_SIZE4 +#define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3]) +#endif + +static void m03710m (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], const u32 pw_len, __global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, __local u32 l_bin2asc[256]) +{ + /** + * modifier + */ + + const u32 gid = get_global_id (0); + const u32 lid = get_local_id (0); + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[ 1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[ 2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[ 3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[ 4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[ 5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[ 6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[ 7]; + + u32 salt_buf2[4]; + + salt_buf2[0] = 0; + salt_buf2[1] = 0; + salt_buf2[2] = 0; + salt_buf2[3] = 0; + + u32 salt_buf3[4]; + + salt_buf3[0] = 0; + salt_buf3[1] = 0; + salt_buf3[2] = 0; + salt_buf3[3] = 0; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + const u32 pw_salt_len = 32 + salt_len; + + /** + * loop + */ + + u32x w0l = w0[0]; + + for (u32 il_pos = 0; il_pos < bfs_cnt; il_pos++) + { + const u32 w0r = bfs_buf[il_pos].i; + + w0[0] = w0l | w0r; + + u32x a = MD5M_A; + u32x b = MD5M_B; + u32x c = MD5M_C; + u32x d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H , a, b, c, d, w1[1], MD5C20, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w2[0], MD5C21, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w2[3], MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w3[2], MD5C23, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w0[1], MD5C24, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w1[0], MD5C25, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w1[3], MD5C26, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w2[2], MD5C27, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w3[1], MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w0[0], MD5C29, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w0[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w1[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w2[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w3[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w3[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w0[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1[0], MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w2[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2[1], MD5C3f, MD5S33); + + a += MD5M_A; + b += MD5M_B; + c += MD5M_C; + d += MD5M_D; + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + w0_t[0] = uint_to_hex_lower8 ((a >> 0) & 255) << 0 + | uint_to_hex_lower8 ((a >> 8) & 255) << 16; + w0_t[1] = uint_to_hex_lower8 ((a >> 16) & 255) << 0 + | uint_to_hex_lower8 ((a >> 24) & 255) << 16; + w0_t[2] = uint_to_hex_lower8 ((b >> 0) & 255) << 0 + | uint_to_hex_lower8 ((b >> 8) & 255) << 16; + w0_t[3] = uint_to_hex_lower8 ((b >> 16) & 255) << 0 + | uint_to_hex_lower8 ((b >> 24) & 255) << 16; + w1_t[0] = uint_to_hex_lower8 ((c >> 0) & 255) << 0 + | uint_to_hex_lower8 ((c >> 8) & 255) << 16; + w1_t[1] = uint_to_hex_lower8 ((c >> 16) & 255) << 0 + | uint_to_hex_lower8 ((c >> 24) & 255) << 16; + w1_t[2] = uint_to_hex_lower8 ((d >> 0) & 255) << 0 + | uint_to_hex_lower8 ((d >> 8) & 255) << 16; + w1_t[3] = uint_to_hex_lower8 ((d >> 16) & 255) << 0 + | uint_to_hex_lower8 ((d >> 24) & 255) << 16; + + w2_t[0] = 0x00000080; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = 0; + + /** + * prepend salt + */ + + switch_buffer_by_offset (w0_t, w1_t, w2_t, w3_t, salt_len); + + w3_t[2] = pw_salt_len * 8; + + w0_t[0] |= salt_buf0[0]; + w0_t[1] |= salt_buf0[1]; + w0_t[2] |= salt_buf0[2]; + w0_t[3] |= salt_buf0[3]; + w1_t[0] |= salt_buf1[0]; + w1_t[1] |= salt_buf1[1]; + w1_t[2] |= salt_buf1[2]; + w1_t[3] |= salt_buf1[3]; + w2_t[0] |= salt_buf2[0]; + w2_t[1] |= salt_buf2[1]; + w2_t[2] |= salt_buf2[2]; + w2_t[3] |= salt_buf2[3]; + w3_t[0] |= salt_buf3[0]; + w3_t[1] |= salt_buf3[1]; + w3_t[2] |= salt_buf3[2]; + w3_t[3] |= salt_buf3[3]; + + /** + * md5 + */ + + a = MD5M_A; + b = MD5M_B; + c = MD5M_C; + d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0_t[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0_t[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0_t[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1_t[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1_t[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1_t[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2_t[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2_t[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2_t[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3_t[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3_t[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3_t[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0_t[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1_t[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2_t[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1_t[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1_t[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2_t[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3_t[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0_t[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2_t[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3_t[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0_t[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1_t[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3_t[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H , a, b, c, d, w1_t[1], MD5C20, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w2_t[0], MD5C21, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w2_t[3], MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w3_t[2], MD5C23, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w0_t[1], MD5C24, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w1_t[0], MD5C25, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w1_t[3], MD5C26, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w2_t[2], MD5C27, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w3_t[1], MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w0_t[0], MD5C29, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w0_t[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w1_t[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w2_t[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w3_t[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w3_t[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w0_t[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1_t[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3_t[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3_t[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0_t[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0_t[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2_t[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1_t[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3_t[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1_t[0], MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w2_t[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0_t[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2_t[1], MD5C3f, MD5S33); + + const u32x r0 = a; + const u32x r1 = d; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_M + } +} + +static void m03710s (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], const u32 pw_len, __global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, __local u32 l_bin2asc[256]) +{ + /** + * modifier + */ + + const u32 gid = get_global_id (0); + const u32 lid = get_local_id (0); + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[ 1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[ 2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[ 3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[ 4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[ 5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[ 6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[ 7]; + + u32 salt_buf2[4]; + + salt_buf2[0] = 0; + salt_buf2[1] = 0; + salt_buf2[2] = 0; + salt_buf2[3] = 0; + + u32 salt_buf3[4]; + + salt_buf3[0] = 0; + salt_buf3[1] = 0; + salt_buf3[2] = 0; + salt_buf3[3] = 0; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + const u32 pw_salt_len = 32 + salt_len; + + /** + * loop + */ + + u32x w0l = w0[0]; + + for (u32 il_pos = 0; il_pos < bfs_cnt; il_pos++) + { + const u32 w0r = bfs_buf[il_pos].i; + + w0[0] = w0l | w0r; + + u32x a = MD5M_A; + u32x b = MD5M_B; + u32x c = MD5M_C; + u32x d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H , a, b, c, d, w1[1], MD5C20, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w2[0], MD5C21, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w2[3], MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w3[2], MD5C23, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w0[1], MD5C24, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w1[0], MD5C25, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w1[3], MD5C26, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w2[2], MD5C27, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w3[1], MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w0[0], MD5C29, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w0[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w1[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w2[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w3[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w3[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w0[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1[0], MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w2[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2[1], MD5C3f, MD5S33); + + a += MD5M_A; + b += MD5M_B; + c += MD5M_C; + d += MD5M_D; + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + w0_t[0] = uint_to_hex_lower8 ((a >> 0) & 255) << 0 + | uint_to_hex_lower8 ((a >> 8) & 255) << 16; + w0_t[1] = uint_to_hex_lower8 ((a >> 16) & 255) << 0 + | uint_to_hex_lower8 ((a >> 24) & 255) << 16; + w0_t[2] = uint_to_hex_lower8 ((b >> 0) & 255) << 0 + | uint_to_hex_lower8 ((b >> 8) & 255) << 16; + w0_t[3] = uint_to_hex_lower8 ((b >> 16) & 255) << 0 + | uint_to_hex_lower8 ((b >> 24) & 255) << 16; + w1_t[0] = uint_to_hex_lower8 ((c >> 0) & 255) << 0 + | uint_to_hex_lower8 ((c >> 8) & 255) << 16; + w1_t[1] = uint_to_hex_lower8 ((c >> 16) & 255) << 0 + | uint_to_hex_lower8 ((c >> 24) & 255) << 16; + w1_t[2] = uint_to_hex_lower8 ((d >> 0) & 255) << 0 + | uint_to_hex_lower8 ((d >> 8) & 255) << 16; + w1_t[3] = uint_to_hex_lower8 ((d >> 16) & 255) << 0 + | uint_to_hex_lower8 ((d >> 24) & 255) << 16; + + w2_t[0] = 0x00000080; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = 0; + + /** + * prepend salt + */ + + switch_buffer_by_offset (w0_t, w1_t, w2_t, w3_t, salt_len); + + w3_t[2] = pw_salt_len * 8; + + w0_t[0] |= salt_buf0[0]; + w0_t[1] |= salt_buf0[1]; + w0_t[2] |= salt_buf0[2]; + w0_t[3] |= salt_buf0[3]; + w1_t[0] |= salt_buf1[0]; + w1_t[1] |= salt_buf1[1]; + w1_t[2] |= salt_buf1[2]; + w1_t[3] |= salt_buf1[3]; + w2_t[0] |= salt_buf2[0]; + w2_t[1] |= salt_buf2[1]; + w2_t[2] |= salt_buf2[2]; + w2_t[3] |= salt_buf2[3]; + w3_t[0] |= salt_buf3[0]; + w3_t[1] |= salt_buf3[1]; + w3_t[2] |= salt_buf3[2]; + w3_t[3] |= salt_buf3[3]; + + /** + * md5 + */ + + a = MD5M_A; + b = MD5M_B; + c = MD5M_C; + d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0_t[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0_t[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0_t[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1_t[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1_t[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1_t[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2_t[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2_t[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2_t[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3_t[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3_t[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3_t[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0_t[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1_t[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2_t[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1_t[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1_t[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2_t[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3_t[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0_t[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2_t[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3_t[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0_t[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1_t[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3_t[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H , a, b, c, d, w1_t[1], MD5C20, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w2_t[0], MD5C21, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w2_t[3], MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w3_t[2], MD5C23, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w0_t[1], MD5C24, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w1_t[0], MD5C25, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w1_t[3], MD5C26, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w2_t[2], MD5C27, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w3_t[1], MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w0_t[0], MD5C29, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w0_t[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w1_t[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w2_t[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w3_t[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w3_t[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w0_t[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1_t[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3_t[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3_t[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0_t[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0_t[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2_t[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1_t[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3_t[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1_t[0], MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w2_t[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0_t[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2_t[1], MD5C3f, MD5S33); + + const u32x r0 = a; + const u32x r1 = d; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_S + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m03710_m04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = pws[gid].i[14]; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * bin2asc table + */ + + __local u32 l_bin2asc[256]; + + const u32 lid4 = lid * 4; + + const u32 lid40 = lid4 + 0; + const u32 lid41 = lid4 + 1; + const u32 lid42 = lid4 + 2; + const u32 lid43 = lid4 + 3; + + const u32 v400 = (lid40 >> 0) & 15; + const u32 v401 = (lid40 >> 4) & 15; + const u32 v410 = (lid41 >> 0) & 15; + const u32 v411 = (lid41 >> 4) & 15; + const u32 v420 = (lid42 >> 0) & 15; + const u32 v421 = (lid42 >> 4) & 15; + const u32 v430 = (lid43 >> 0) & 15; + const u32 v431 = (lid43 >> 4) & 15; + + l_bin2asc[lid40] = ((v400 < 10) ? '0' + v400 : 'a' - 10 + v400) << 8 + | ((v401 < 10) ? '0' + v401 : 'a' - 10 + v401) << 0; + l_bin2asc[lid41] = ((v410 < 10) ? '0' + v410 : 'a' - 10 + v410) << 8 + | ((v411 < 10) ? '0' + v411 : 'a' - 10 + v411) << 0; + l_bin2asc[lid42] = ((v420 < 10) ? '0' + v420 : 'a' - 10 + v420) << 8 + | ((v421 < 10) ? '0' + v421 : 'a' - 10 + v421) << 0; + l_bin2asc[lid43] = ((v430 < 10) ? '0' + v430 : 'a' - 10 + v430) << 8 + | ((v431 < 10) ? '0' + v431 : 'a' - 10 + v431) << 0; + + barrier (CLK_LOCAL_MEM_FENCE); + + if (gid >= gid_max) return; + + /** + * main + */ + + m03710m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset, l_bin2asc); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m03710_m08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = pws[gid].i[14]; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * bin2asc table + */ + + __local u32 l_bin2asc[256]; + + const u32 lid4 = lid * 4; + + const u32 lid40 = lid4 + 0; + const u32 lid41 = lid4 + 1; + const u32 lid42 = lid4 + 2; + const u32 lid43 = lid4 + 3; + + const u32 v400 = (lid40 >> 0) & 15; + const u32 v401 = (lid40 >> 4) & 15; + const u32 v410 = (lid41 >> 0) & 15; + const u32 v411 = (lid41 >> 4) & 15; + const u32 v420 = (lid42 >> 0) & 15; + const u32 v421 = (lid42 >> 4) & 15; + const u32 v430 = (lid43 >> 0) & 15; + const u32 v431 = (lid43 >> 4) & 15; + + l_bin2asc[lid40] = ((v400 < 10) ? '0' + v400 : 'a' - 10 + v400) << 8 + | ((v401 < 10) ? '0' + v401 : 'a' - 10 + v401) << 0; + l_bin2asc[lid41] = ((v410 < 10) ? '0' + v410 : 'a' - 10 + v410) << 8 + | ((v411 < 10) ? '0' + v411 : 'a' - 10 + v411) << 0; + l_bin2asc[lid42] = ((v420 < 10) ? '0' + v420 : 'a' - 10 + v420) << 8 + | ((v421 < 10) ? '0' + v421 : 'a' - 10 + v421) << 0; + l_bin2asc[lid43] = ((v430 < 10) ? '0' + v430 : 'a' - 10 + v430) << 8 + | ((v431 < 10) ? '0' + v431 : 'a' - 10 + v431) << 0; + + barrier (CLK_LOCAL_MEM_FENCE); + + if (gid >= gid_max) return; + + /** + * main + */ + + m03710m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset, l_bin2asc); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m03710_m16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = pws[gid].i[ 8]; + w2[1] = pws[gid].i[ 9]; + w2[2] = pws[gid].i[10]; + w2[3] = pws[gid].i[11]; + + u32x w3[4]; + + w3[0] = pws[gid].i[12]; + w3[1] = pws[gid].i[13]; + w3[2] = pws[gid].i[14]; + w3[3] = pws[gid].i[15]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * bin2asc table + */ + + __local u32 l_bin2asc[256]; + + const u32 lid4 = lid * 4; + + const u32 lid40 = lid4 + 0; + const u32 lid41 = lid4 + 1; + const u32 lid42 = lid4 + 2; + const u32 lid43 = lid4 + 3; + + const u32 v400 = (lid40 >> 0) & 15; + const u32 v401 = (lid40 >> 4) & 15; + const u32 v410 = (lid41 >> 0) & 15; + const u32 v411 = (lid41 >> 4) & 15; + const u32 v420 = (lid42 >> 0) & 15; + const u32 v421 = (lid42 >> 4) & 15; + const u32 v430 = (lid43 >> 0) & 15; + const u32 v431 = (lid43 >> 4) & 15; + + l_bin2asc[lid40] = ((v400 < 10) ? '0' + v400 : 'a' - 10 + v400) << 8 + | ((v401 < 10) ? '0' + v401 : 'a' - 10 + v401) << 0; + l_bin2asc[lid41] = ((v410 < 10) ? '0' + v410 : 'a' - 10 + v410) << 8 + | ((v411 < 10) ? '0' + v411 : 'a' - 10 + v411) << 0; + l_bin2asc[lid42] = ((v420 < 10) ? '0' + v420 : 'a' - 10 + v420) << 8 + | ((v421 < 10) ? '0' + v421 : 'a' - 10 + v421) << 0; + l_bin2asc[lid43] = ((v430 < 10) ? '0' + v430 : 'a' - 10 + v430) << 8 + | ((v431 < 10) ? '0' + v431 : 'a' - 10 + v431) << 0; + + barrier (CLK_LOCAL_MEM_FENCE); + + if (gid >= gid_max) return; + + /** + * main + */ + + m03710m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset, l_bin2asc); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m03710_s04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = pws[gid].i[14]; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * bin2asc table + */ + + __local u32 l_bin2asc[256]; + + const u32 lid4 = lid * 4; + + const u32 lid40 = lid4 + 0; + const u32 lid41 = lid4 + 1; + const u32 lid42 = lid4 + 2; + const u32 lid43 = lid4 + 3; + + const u32 v400 = (lid40 >> 0) & 15; + const u32 v401 = (lid40 >> 4) & 15; + const u32 v410 = (lid41 >> 0) & 15; + const u32 v411 = (lid41 >> 4) & 15; + const u32 v420 = (lid42 >> 0) & 15; + const u32 v421 = (lid42 >> 4) & 15; + const u32 v430 = (lid43 >> 0) & 15; + const u32 v431 = (lid43 >> 4) & 15; + + l_bin2asc[lid40] = ((v400 < 10) ? '0' + v400 : 'a' - 10 + v400) << 8 + | ((v401 < 10) ? '0' + v401 : 'a' - 10 + v401) << 0; + l_bin2asc[lid41] = ((v410 < 10) ? '0' + v410 : 'a' - 10 + v410) << 8 + | ((v411 < 10) ? '0' + v411 : 'a' - 10 + v411) << 0; + l_bin2asc[lid42] = ((v420 < 10) ? '0' + v420 : 'a' - 10 + v420) << 8 + | ((v421 < 10) ? '0' + v421 : 'a' - 10 + v421) << 0; + l_bin2asc[lid43] = ((v430 < 10) ? '0' + v430 : 'a' - 10 + v430) << 8 + | ((v431 < 10) ? '0' + v431 : 'a' - 10 + v431) << 0; + + barrier (CLK_LOCAL_MEM_FENCE); + + if (gid >= gid_max) return; + + /** + * main + */ + + m03710s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset, l_bin2asc); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m03710_s08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = pws[gid].i[14]; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * bin2asc table + */ + + __local u32 l_bin2asc[256]; + + const u32 lid4 = lid * 4; + + const u32 lid40 = lid4 + 0; + const u32 lid41 = lid4 + 1; + const u32 lid42 = lid4 + 2; + const u32 lid43 = lid4 + 3; + + const u32 v400 = (lid40 >> 0) & 15; + const u32 v401 = (lid40 >> 4) & 15; + const u32 v410 = (lid41 >> 0) & 15; + const u32 v411 = (lid41 >> 4) & 15; + const u32 v420 = (lid42 >> 0) & 15; + const u32 v421 = (lid42 >> 4) & 15; + const u32 v430 = (lid43 >> 0) & 15; + const u32 v431 = (lid43 >> 4) & 15; + + l_bin2asc[lid40] = ((v400 < 10) ? '0' + v400 : 'a' - 10 + v400) << 8 + | ((v401 < 10) ? '0' + v401 : 'a' - 10 + v401) << 0; + l_bin2asc[lid41] = ((v410 < 10) ? '0' + v410 : 'a' - 10 + v410) << 8 + | ((v411 < 10) ? '0' + v411 : 'a' - 10 + v411) << 0; + l_bin2asc[lid42] = ((v420 < 10) ? '0' + v420 : 'a' - 10 + v420) << 8 + | ((v421 < 10) ? '0' + v421 : 'a' - 10 + v421) << 0; + l_bin2asc[lid43] = ((v430 < 10) ? '0' + v430 : 'a' - 10 + v430) << 8 + | ((v431 < 10) ? '0' + v431 : 'a' - 10 + v431) << 0; + + barrier (CLK_LOCAL_MEM_FENCE); + + if (gid >= gid_max) return; + + /** + * main + */ + + m03710s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset, l_bin2asc); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m03710_s16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = pws[gid].i[ 8]; + w2[1] = pws[gid].i[ 9]; + w2[2] = pws[gid].i[10]; + w2[3] = pws[gid].i[11]; + + u32x w3[4]; + + w3[0] = pws[gid].i[12]; + w3[1] = pws[gid].i[13]; + w3[2] = pws[gid].i[14]; + w3[3] = pws[gid].i[15]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * bin2asc table + */ + + __local u32 l_bin2asc[256]; + + const u32 lid4 = lid * 4; + + const u32 lid40 = lid4 + 0; + const u32 lid41 = lid4 + 1; + const u32 lid42 = lid4 + 2; + const u32 lid43 = lid4 + 3; + + const u32 v400 = (lid40 >> 0) & 15; + const u32 v401 = (lid40 >> 4) & 15; + const u32 v410 = (lid41 >> 0) & 15; + const u32 v411 = (lid41 >> 4) & 15; + const u32 v420 = (lid42 >> 0) & 15; + const u32 v421 = (lid42 >> 4) & 15; + const u32 v430 = (lid43 >> 0) & 15; + const u32 v431 = (lid43 >> 4) & 15; + + l_bin2asc[lid40] = ((v400 < 10) ? '0' + v400 : 'a' - 10 + v400) << 8 + | ((v401 < 10) ? '0' + v401 : 'a' - 10 + v401) << 0; + l_bin2asc[lid41] = ((v410 < 10) ? '0' + v410 : 'a' - 10 + v410) << 8 + | ((v411 < 10) ? '0' + v411 : 'a' - 10 + v411) << 0; + l_bin2asc[lid42] = ((v420 < 10) ? '0' + v420 : 'a' - 10 + v420) << 8 + | ((v421 < 10) ? '0' + v421 : 'a' - 10 + v421) << 0; + l_bin2asc[lid43] = ((v430 < 10) ? '0' + v430 : 'a' - 10 + v430) << 8 + | ((v431 < 10) ? '0' + v431 : 'a' - 10 + v431) << 0; + + barrier (CLK_LOCAL_MEM_FENCE); + + if (gid >= gid_max) return; + + /** + * main + */ + + m03710s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset, l_bin2asc); +} diff --git a/amd/m03800_a0.cl b/amd/m03800_a0.cl new file mode 100644 index 0000000000..cc04da250b --- /dev/null +++ b/amd/m03800_a0.cl @@ -0,0 +1,736 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _MD5_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW4 +#define VECT_SIZE4 +#endif + +#ifdef VLIW5 +#define VECT_SIZE4 +#endif + +#define DGST_R0 0 +#define DGST_R1 3 +#define DGST_R2 2 +#define DGST_R3 1 + +#include "include/kernel_functions.c" +#include "types_amd.c" +#include "common_amd.c" +#include "include/rp_gpu.h" +#include "rp_amd.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m03800_m04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + u32x pw_buf1[4]; + + pw_buf1[0] = pws[gid].i[ 4]; + pw_buf1[1] = pws[gid].i[ 5]; + pw_buf1[2] = pws[gid].i[ 6]; + pw_buf1[3] = pws[gid].i[ 7]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[ 1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[ 2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[ 3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[ 4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[ 5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[ 6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[ 7]; + + u32 salt_buf2[4]; + + salt_buf2[0] = 0; + salt_buf2[1] = 0; + salt_buf2[2] = 0; + salt_buf2[3] = 0; + + u32 salt_buf3[4]; + + salt_buf3[0] = 0; + salt_buf3[1] = 0; + salt_buf3[2] = 0; + salt_buf3[3] = 0; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + /** + * bin2asc table + */ + + __local u32 l_bin2asc[256]; + + const u32 lid4 = lid * 4; + + const u32 lid40 = lid4 + 0; + const u32 lid41 = lid4 + 1; + const u32 lid42 = lid4 + 2; + const u32 lid43 = lid4 + 3; + + const u32 v400 = (lid40 >> 0) & 15; + const u32 v401 = (lid40 >> 4) & 15; + const u32 v410 = (lid41 >> 0) & 15; + const u32 v411 = (lid41 >> 4) & 15; + const u32 v420 = (lid42 >> 0) & 15; + const u32 v421 = (lid42 >> 4) & 15; + const u32 v430 = (lid43 >> 0) & 15; + const u32 v431 = (lid43 >> 4) & 15; + + l_bin2asc[lid40] = ((v400 < 10) ? '0' + v400 : 'a' - 10 + v400) << 8 + | ((v401 < 10) ? '0' + v401 : 'a' - 10 + v401) << 0; + l_bin2asc[lid41] = ((v410 < 10) ? '0' + v410 : 'a' - 10 + v410) << 8 + | ((v411 < 10) ? '0' + v411 : 'a' - 10 + v411) << 0; + l_bin2asc[lid42] = ((v420 < 10) ? '0' + v420 : 'a' - 10 + v420) << 8 + | ((v421 < 10) ? '0' + v421 : 'a' - 10 + v421) << 0; + l_bin2asc[lid43] = ((v430 < 10) ? '0' + v430 : 'a' - 10 + v430) << 8 + | ((v431 < 10) ? '0' + v431 : 'a' - 10 + v431) << 0; + + barrier (CLK_LOCAL_MEM_FENCE); + + if (gid >= gid_max) return; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + + w0[0] = pw_buf0[0]; + w0[1] = pw_buf0[1]; + w0[2] = pw_buf0[2]; + w0[3] = pw_buf0[3]; + + u32x w1[4]; + + w1[0] = pw_buf1[0]; + w1[1] = pw_buf1[1]; + w1[2] = pw_buf1[2]; + w1[3] = pw_buf1[3]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 out_len = apply_rules (rules_buf[il_pos].cmds, w0, w1, pw_len); + + u32x w0_t[4]; + + w0_t[0] = w0[0]; + w0_t[1] = w0[1]; + w0_t[2] = w0[2]; + w0_t[3] = w0[3]; + + u32x w1_t[4]; + + w1_t[0] = w1[0]; + w1_t[1] = w1[1]; + w1_t[2] = w1[2]; + w1_t[3] = w1[3]; + + u32x w2_t[4]; + + w2_t[0] = w2[0]; + w2_t[1] = w2[1]; + w2_t[2] = w2[2]; + w2_t[3] = w2[3]; + + u32x w3_t[4]; + + w3_t[0] = w3[0]; + w3_t[1] = w3[1]; + w3_t[2] = w3[2]; + w3_t[3] = w3[3]; + + + /** + * prepend salt + */ + + switch_buffer_by_offset (w0_t, w1_t, w2_t, w3_t, salt_len); + + w0_t[0] |= salt_buf0[0]; + w0_t[1] |= salt_buf0[1]; + w0_t[2] |= salt_buf0[2]; + w0_t[3] |= salt_buf0[3]; + w1_t[0] |= salt_buf1[0]; + w1_t[1] |= salt_buf1[1]; + w1_t[2] |= salt_buf1[2]; + w1_t[3] |= salt_buf1[3]; + w2_t[0] |= salt_buf2[0]; + w2_t[1] |= salt_buf2[1]; + w2_t[2] |= salt_buf2[2]; + w2_t[3] |= salt_buf2[3]; + w3_t[0] |= salt_buf3[0]; + w3_t[1] |= salt_buf3[1]; + w3_t[2] |= salt_buf3[2]; + w3_t[3] |= salt_buf3[3]; + + /** + * append salt + */ + + u32 s0[4]; + + s0[0] = salt_buf0[0]; + s0[1] = salt_buf0[1]; + s0[2] = salt_buf0[2]; + s0[3] = salt_buf0[3]; + + u32 s1[4]; + + s1[0] = salt_buf1[0]; + s1[1] = salt_buf1[1]; + s1[2] = salt_buf1[2]; + s1[3] = salt_buf1[3]; + + u32 s2[4]; + + s2[0] = 0; + s2[1] = 0; + s2[2] = 0; + s2[3] = 0; + + u32 s3[4]; + + s3[0] = 0; + s3[1] = 0; + s3[2] = 0; + s3[3] = 0; + + switch_buffer_by_offset (s0, s1, s2, s3, salt_len + out_len); + + w0_t[0] |= s0[0]; + w0_t[1] |= s0[1]; + w0_t[2] |= s0[2]; + w0_t[3] |= s0[3]; + w1_t[0] |= s1[0]; + w1_t[1] |= s1[1]; + w1_t[2] |= s1[2]; + w1_t[3] |= s1[3]; + w2_t[0] |= s2[0]; + w2_t[1] |= s2[1]; + w2_t[2] |= s2[2]; + w2_t[3] |= s2[3]; + w3_t[0] |= s3[0]; + w3_t[1] |= s3[1]; + w3_t[2] |= s3[2]; + w3_t[3] |= s3[3]; + + const u32 pw_salt_len = salt_len + out_len + salt_len; + + append_0x80_4 (w0_t, w1_t, w2_t, w3_t, pw_salt_len); + + w3_t[2] = pw_salt_len * 8; + + /** + * md5 + */ + + u32x a = MD5M_A; + u32x b = MD5M_B; + u32x c = MD5M_C; + u32x d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0_t[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0_t[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0_t[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1_t[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1_t[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1_t[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2_t[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2_t[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2_t[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3_t[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3_t[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3_t[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0_t[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1_t[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2_t[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1_t[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1_t[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2_t[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3_t[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0_t[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2_t[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3_t[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0_t[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1_t[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3_t[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H , a, b, c, d, w1_t[1], MD5C20, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w2_t[0], MD5C21, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w2_t[3], MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w3_t[2], MD5C23, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w0_t[1], MD5C24, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w1_t[0], MD5C25, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w1_t[3], MD5C26, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w2_t[2], MD5C27, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w3_t[1], MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w0_t[0], MD5C29, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w0_t[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w1_t[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w2_t[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w3_t[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w3_t[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w0_t[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1_t[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3_t[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3_t[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0_t[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0_t[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2_t[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1_t[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3_t[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1_t[0], MD5C3c, MD5S30); + + MD5_STEP (MD5_I , d, a, b, c, w2_t[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0_t[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2_t[1], MD5C3f, MD5S33); + + const u32x r0 = a; + const u32x r1 = d; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_M + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m03800_m08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m03800_m16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m03800_s04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + u32x pw_buf1[4]; + + pw_buf1[0] = pws[gid].i[ 4]; + pw_buf1[1] = pws[gid].i[ 5]; + pw_buf1[2] = pws[gid].i[ 6]; + pw_buf1[3] = pws[gid].i[ 7]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[ 1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[ 2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[ 3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[ 4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[ 5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[ 6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[ 7]; + + u32 salt_buf2[4]; + + salt_buf2[0] = 0; + salt_buf2[1] = 0; + salt_buf2[2] = 0; + salt_buf2[3] = 0; + + u32 salt_buf3[4]; + + salt_buf3[0] = 0; + salt_buf3[1] = 0; + salt_buf3[2] = 0; + salt_buf3[3] = 0; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * bin2asc table + */ + + __local u32 l_bin2asc[256]; + + const u32 lid4 = lid * 4; + + const u32 lid40 = lid4 + 0; + const u32 lid41 = lid4 + 1; + const u32 lid42 = lid4 + 2; + const u32 lid43 = lid4 + 3; + + const u32 v400 = (lid40 >> 0) & 15; + const u32 v401 = (lid40 >> 4) & 15; + const u32 v410 = (lid41 >> 0) & 15; + const u32 v411 = (lid41 >> 4) & 15; + const u32 v420 = (lid42 >> 0) & 15; + const u32 v421 = (lid42 >> 4) & 15; + const u32 v430 = (lid43 >> 0) & 15; + const u32 v431 = (lid43 >> 4) & 15; + + l_bin2asc[lid40] = ((v400 < 10) ? '0' + v400 : 'a' - 10 + v400) << 8 + | ((v401 < 10) ? '0' + v401 : 'a' - 10 + v401) << 0; + l_bin2asc[lid41] = ((v410 < 10) ? '0' + v410 : 'a' - 10 + v410) << 8 + | ((v411 < 10) ? '0' + v411 : 'a' - 10 + v411) << 0; + l_bin2asc[lid42] = ((v420 < 10) ? '0' + v420 : 'a' - 10 + v420) << 8 + | ((v421 < 10) ? '0' + v421 : 'a' - 10 + v421) << 0; + l_bin2asc[lid43] = ((v430 < 10) ? '0' + v430 : 'a' - 10 + v430) << 8 + | ((v431 < 10) ? '0' + v431 : 'a' - 10 + v431) << 0; + + barrier (CLK_LOCAL_MEM_FENCE); + + if (gid >= gid_max) return; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + + w0[0] = pw_buf0[0]; + w0[1] = pw_buf0[1]; + w0[2] = pw_buf0[2]; + w0[3] = pw_buf0[3]; + + u32x w1[4]; + + w1[0] = pw_buf1[0]; + w1[1] = pw_buf1[1]; + w1[2] = pw_buf1[2]; + w1[3] = pw_buf1[3]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 out_len = apply_rules (rules_buf[il_pos].cmds, w0, w1, pw_len); + + u32x w0_t[4]; + + w0_t[0] = w0[0]; + w0_t[1] = w0[1]; + w0_t[2] = w0[2]; + w0_t[3] = w0[3]; + + u32x w1_t[4]; + + w1_t[0] = w1[0]; + w1_t[1] = w1[1]; + w1_t[2] = w1[2]; + w1_t[3] = w1[3]; + + u32x w2_t[4]; + + w2_t[0] = w2[0]; + w2_t[1] = w2[1]; + w2_t[2] = w2[2]; + w2_t[3] = w2[3]; + + u32x w3_t[4]; + + w3_t[0] = w3[0]; + w3_t[1] = w3[1]; + w3_t[2] = w3[2]; + w3_t[3] = w3[3]; + + + /** + * prepend salt + */ + + switch_buffer_by_offset (w0_t, w1_t, w2_t, w3_t, salt_len); + + w0_t[0] |= salt_buf0[0]; + w0_t[1] |= salt_buf0[1]; + w0_t[2] |= salt_buf0[2]; + w0_t[3] |= salt_buf0[3]; + w1_t[0] |= salt_buf1[0]; + w1_t[1] |= salt_buf1[1]; + w1_t[2] |= salt_buf1[2]; + w1_t[3] |= salt_buf1[3]; + w2_t[0] |= salt_buf2[0]; + w2_t[1] |= salt_buf2[1]; + w2_t[2] |= salt_buf2[2]; + w2_t[3] |= salt_buf2[3]; + w3_t[0] |= salt_buf3[0]; + w3_t[1] |= salt_buf3[1]; + w3_t[2] |= salt_buf3[2]; + w3_t[3] |= salt_buf3[3]; + + /** + * append salt + */ + + u32 s0[4]; + + s0[0] = salt_buf0[0]; + s0[1] = salt_buf0[1]; + s0[2] = salt_buf0[2]; + s0[3] = salt_buf0[3]; + + u32 s1[4]; + + s1[0] = salt_buf1[0]; + s1[1] = salt_buf1[1]; + s1[2] = salt_buf1[2]; + s1[3] = salt_buf1[3]; + + u32 s2[4]; + + s2[0] = 0; + s2[1] = 0; + s2[2] = 0; + s2[3] = 0; + + u32 s3[4]; + + s3[0] = 0; + s3[1] = 0; + s3[2] = 0; + s3[3] = 0; + + switch_buffer_by_offset (s0, s1, s2, s3, salt_len + out_len); + + w0_t[0] |= s0[0]; + w0_t[1] |= s0[1]; + w0_t[2] |= s0[2]; + w0_t[3] |= s0[3]; + w1_t[0] |= s1[0]; + w1_t[1] |= s1[1]; + w1_t[2] |= s1[2]; + w1_t[3] |= s1[3]; + w2_t[0] |= s2[0]; + w2_t[1] |= s2[1]; + w2_t[2] |= s2[2]; + w2_t[3] |= s2[3]; + w3_t[0] |= s3[0]; + w3_t[1] |= s3[1]; + w3_t[2] |= s3[2]; + w3_t[3] |= s3[3]; + + const u32 pw_salt_len = salt_len + out_len + salt_len; + + append_0x80_4 (w0_t, w1_t, w2_t, w3_t, pw_salt_len); + + w3_t[2] = pw_salt_len * 8; + + /** + * md5 + */ + + u32x a = MD5M_A; + u32x b = MD5M_B; + u32x c = MD5M_C; + u32x d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0_t[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0_t[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0_t[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1_t[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1_t[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1_t[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2_t[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2_t[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2_t[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3_t[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3_t[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3_t[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0_t[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1_t[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2_t[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1_t[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1_t[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2_t[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3_t[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0_t[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2_t[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3_t[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0_t[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1_t[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3_t[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H , a, b, c, d, w1_t[1], MD5C20, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w2_t[0], MD5C21, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w2_t[3], MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w3_t[2], MD5C23, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w0_t[1], MD5C24, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w1_t[0], MD5C25, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w1_t[3], MD5C26, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w2_t[2], MD5C27, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w3_t[1], MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w0_t[0], MD5C29, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w0_t[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w1_t[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w2_t[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w3_t[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w3_t[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w0_t[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1_t[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3_t[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3_t[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0_t[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0_t[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2_t[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1_t[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3_t[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1_t[0], MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w2_t[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0_t[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2_t[1], MD5C3f, MD5S33); + + const u32x r0 = a; + const u32x r1 = d; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_S + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m03800_s08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m03800_s16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/amd/m03800_a1.cl b/amd/m03800_a1.cl new file mode 100644 index 0000000000..f47e271ea2 --- /dev/null +++ b/amd/m03800_a1.cl @@ -0,0 +1,840 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _MD5_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW4 +#define VECT_SIZE4 +#endif + +#ifdef VLIW5 +#define VECT_SIZE4 +#endif + +#define DGST_R0 0 +#define DGST_R1 3 +#define DGST_R2 2 +#define DGST_R3 1 + +#include "include/kernel_functions.c" +#include "types_amd.c" +#include "common_amd.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m03800_m04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, combs_buf[0].pw_len); + } + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[ 1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[ 2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[ 3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[ 4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[ 5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[ 6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[ 7]; + + u32 salt_buf2[4]; + + salt_buf2[0] = 0; + salt_buf2[1] = 0; + salt_buf2[2] = 0; + salt_buf2[3] = 0; + + u32 salt_buf3[4]; + + salt_buf3[0] = 0; + salt_buf3[1] = 0; + salt_buf3[2] = 0; + salt_buf3[3] = 0; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + /** + * bin2asc table + */ + + __local u32 l_bin2asc[256]; + + const u32 lid4 = lid * 4; + + const u32 lid40 = lid4 + 0; + const u32 lid41 = lid4 + 1; + const u32 lid42 = lid4 + 2; + const u32 lid43 = lid4 + 3; + + const u32 v400 = (lid40 >> 0) & 15; + const u32 v401 = (lid40 >> 4) & 15; + const u32 v410 = (lid41 >> 0) & 15; + const u32 v411 = (lid41 >> 4) & 15; + const u32 v420 = (lid42 >> 0) & 15; + const u32 v421 = (lid42 >> 4) & 15; + const u32 v430 = (lid43 >> 0) & 15; + const u32 v431 = (lid43 >> 4) & 15; + + l_bin2asc[lid40] = ((v400 < 10) ? '0' + v400 : 'a' - 10 + v400) << 8 + | ((v401 < 10) ? '0' + v401 : 'a' - 10 + v401) << 0; + l_bin2asc[lid41] = ((v410 < 10) ? '0' + v410 : 'a' - 10 + v410) << 8 + | ((v411 < 10) ? '0' + v411 : 'a' - 10 + v411) << 0; + l_bin2asc[lid42] = ((v420 < 10) ? '0' + v420 : 'a' - 10 + v420) << 8 + | ((v421 < 10) ? '0' + v421 : 'a' - 10 + v421) << 0; + l_bin2asc[lid43] = ((v430 < 10) ? '0' + v430 : 'a' - 10 + v430) << 8 + | ((v431 < 10) ? '0' + v431 : 'a' - 10 + v431) << 0; + + barrier (CLK_LOCAL_MEM_FENCE); + + if (gid >= gid_max) return; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = combs_buf[il_pos].pw_len; + + const u32 pw_len = pw_l_len + pw_r_len; + + u32 wordr0[4]; + + wordr0[0] = combs_buf[il_pos].i[0]; + wordr0[1] = combs_buf[il_pos].i[1]; + wordr0[2] = combs_buf[il_pos].i[2]; + wordr0[3] = combs_buf[il_pos].i[3]; + + u32 wordr1[4]; + + wordr1[0] = combs_buf[il_pos].i[4]; + wordr1[1] = combs_buf[il_pos].i[5]; + wordr1[2] = combs_buf[il_pos].i[6]; + wordr1[3] = combs_buf[il_pos].i[7]; + + u32 wordr2[4]; + + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + + u32 wordr3[4]; + + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + u32x w0[4]; + + w0[0] = wordl0[0] | wordr0[0]; + w0[1] = wordl0[1] | wordr0[1]; + w0[2] = wordl0[2] | wordr0[2]; + w0[3] = wordl0[3] | wordr0[3]; + + u32x w1[4]; + + w1[0] = wordl1[0] | wordr1[0]; + w1[1] = wordl1[1] | wordr1[1]; + w1[2] = wordl1[2] | wordr1[2]; + w1[3] = wordl1[3] | wordr1[3]; + + u32x w2[4]; + + w2[0] = wordl2[0] | wordr2[0]; + w2[1] = wordl2[1] | wordr2[1]; + w2[2] = wordl2[2] | wordr2[2]; + w2[3] = wordl2[3] | wordr2[3]; + + u32x w3[4]; + + w3[0] = wordl3[0] | wordr3[0]; + w3[1] = wordl3[1] | wordr3[1]; + w3[2] = 0; + w3[3] = 0; + + /** + * prepend salt + */ + + u32x w0_t[4]; + + w0_t[0] = w0[0]; + w0_t[1] = w0[1]; + w0_t[2] = w0[2]; + w0_t[3] = w0[3]; + + u32x w1_t[4]; + + w1_t[0] = w1[0]; + w1_t[1] = w1[1]; + w1_t[2] = w1[2]; + w1_t[3] = w1[3]; + + u32x w2_t[4]; + + w2_t[0] = w2[0]; + w2_t[1] = w2[1]; + w2_t[2] = w2[2]; + w2_t[3] = w2[3]; + + u32x w3_t[4]; + + w3_t[0] = w3[0]; + w3_t[1] = w3[1]; + w3_t[2] = w3[2]; + w3_t[3] = w3[3]; + + switch_buffer_by_offset (w0_t, w1_t, w2_t, w3_t, salt_len); + + w0_t[0] |= salt_buf0[0]; + w0_t[1] |= salt_buf0[1]; + w0_t[2] |= salt_buf0[2]; + w0_t[3] |= salt_buf0[3]; + w1_t[0] |= salt_buf1[0]; + w1_t[1] |= salt_buf1[1]; + w1_t[2] |= salt_buf1[2]; + w1_t[3] |= salt_buf1[3]; + w2_t[0] |= salt_buf2[0]; + w2_t[1] |= salt_buf2[1]; + w2_t[2] |= salt_buf2[2]; + w2_t[3] |= salt_buf2[3]; + w3_t[0] |= salt_buf3[0]; + w3_t[1] |= salt_buf3[1]; + w3_t[2] |= salt_buf3[2]; + w3_t[3] |= salt_buf3[3]; + + /** + * append salt + */ + + u32 s0[4]; + + s0[0] = salt_buf0[0]; + s0[1] = salt_buf0[1]; + s0[2] = salt_buf0[2]; + s0[3] = salt_buf0[3]; + + u32 s1[4]; + + s1[0] = salt_buf1[0]; + s1[1] = salt_buf1[1]; + s1[2] = salt_buf1[2]; + s1[3] = salt_buf1[3]; + + u32 s2[4]; + + s2[0] = 0; + s2[1] = 0; + s2[2] = 0; + s2[3] = 0; + + u32 s3[4]; + + s3[0] = 0; + s3[1] = 0; + s3[2] = 0; + s3[3] = 0; + + switch_buffer_by_offset (s0, s1, s2, s3, salt_len + pw_len); + + w0_t[0] |= s0[0]; + w0_t[1] |= s0[1]; + w0_t[2] |= s0[2]; + w0_t[3] |= s0[3]; + w1_t[0] |= s1[0]; + w1_t[1] |= s1[1]; + w1_t[2] |= s1[2]; + w1_t[3] |= s1[3]; + w2_t[0] |= s2[0]; + w2_t[1] |= s2[1]; + w2_t[2] |= s2[2]; + w2_t[3] |= s2[3]; + w3_t[0] |= s3[0]; + w3_t[1] |= s3[1]; + w3_t[2] |= s3[2]; + w3_t[3] |= s3[3]; + + const u32 pw_salt_len = salt_len + pw_len + salt_len; + + append_0x80_4 (w0_t, w1_t, w2_t, w3_t, pw_salt_len); + + w3_t[2] = pw_salt_len * 8; + + /** + * md5 + */ + + u32x a = MD5M_A; + u32x b = MD5M_B; + u32x c = MD5M_C; + u32x d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0_t[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0_t[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0_t[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1_t[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1_t[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1_t[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2_t[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2_t[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2_t[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3_t[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3_t[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3_t[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0_t[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1_t[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2_t[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1_t[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1_t[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2_t[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3_t[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0_t[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2_t[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3_t[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0_t[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1_t[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3_t[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H , a, b, c, d, w1_t[1], MD5C20, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w2_t[0], MD5C21, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w2_t[3], MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w3_t[2], MD5C23, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w0_t[1], MD5C24, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w1_t[0], MD5C25, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w1_t[3], MD5C26, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w2_t[2], MD5C27, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w3_t[1], MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w0_t[0], MD5C29, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w0_t[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w1_t[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w2_t[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w3_t[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w3_t[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w0_t[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1_t[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3_t[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3_t[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0_t[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0_t[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2_t[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1_t[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3_t[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1_t[0], MD5C3c, MD5S30); + + MD5_STEP (MD5_I , d, a, b, c, w2_t[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0_t[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2_t[1], MD5C3f, MD5S33); + + const u32x r0 = a; + const u32x r1 = d; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_M + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m03800_m08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m03800_m16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m03800_s04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, combs_buf[0].pw_len); + } + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[ 1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[ 2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[ 3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[ 4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[ 5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[ 6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[ 7]; + + u32 salt_buf2[4]; + + salt_buf2[0] = 0; + salt_buf2[1] = 0; + salt_buf2[2] = 0; + salt_buf2[3] = 0; + + u32 salt_buf3[4]; + + salt_buf3[0] = 0; + salt_buf3[1] = 0; + salt_buf3[2] = 0; + salt_buf3[3] = 0; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * bin2asc table + */ + + __local u32 l_bin2asc[256]; + + const u32 lid4 = lid * 4; + + const u32 lid40 = lid4 + 0; + const u32 lid41 = lid4 + 1; + const u32 lid42 = lid4 + 2; + const u32 lid43 = lid4 + 3; + + const u32 v400 = (lid40 >> 0) & 15; + const u32 v401 = (lid40 >> 4) & 15; + const u32 v410 = (lid41 >> 0) & 15; + const u32 v411 = (lid41 >> 4) & 15; + const u32 v420 = (lid42 >> 0) & 15; + const u32 v421 = (lid42 >> 4) & 15; + const u32 v430 = (lid43 >> 0) & 15; + const u32 v431 = (lid43 >> 4) & 15; + + l_bin2asc[lid40] = ((v400 < 10) ? '0' + v400 : 'a' - 10 + v400) << 8 + | ((v401 < 10) ? '0' + v401 : 'a' - 10 + v401) << 0; + l_bin2asc[lid41] = ((v410 < 10) ? '0' + v410 : 'a' - 10 + v410) << 8 + | ((v411 < 10) ? '0' + v411 : 'a' - 10 + v411) << 0; + l_bin2asc[lid42] = ((v420 < 10) ? '0' + v420 : 'a' - 10 + v420) << 8 + | ((v421 < 10) ? '0' + v421 : 'a' - 10 + v421) << 0; + l_bin2asc[lid43] = ((v430 < 10) ? '0' + v430 : 'a' - 10 + v430) << 8 + | ((v431 < 10) ? '0' + v431 : 'a' - 10 + v431) << 0; + + barrier (CLK_LOCAL_MEM_FENCE); + + if (gid >= gid_max) return; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = combs_buf[il_pos].pw_len; + + const u32 pw_len = pw_l_len + pw_r_len; + + u32 wordr0[4]; + + wordr0[0] = combs_buf[il_pos].i[0]; + wordr0[1] = combs_buf[il_pos].i[1]; + wordr0[2] = combs_buf[il_pos].i[2]; + wordr0[3] = combs_buf[il_pos].i[3]; + + u32 wordr1[4]; + + wordr1[0] = combs_buf[il_pos].i[4]; + wordr1[1] = combs_buf[il_pos].i[5]; + wordr1[2] = combs_buf[il_pos].i[6]; + wordr1[3] = combs_buf[il_pos].i[7]; + + u32 wordr2[4]; + + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + + u32 wordr3[4]; + + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + u32x w0[4]; + + w0[0] = wordl0[0] | wordr0[0]; + w0[1] = wordl0[1] | wordr0[1]; + w0[2] = wordl0[2] | wordr0[2]; + w0[3] = wordl0[3] | wordr0[3]; + + u32x w1[4]; + + w1[0] = wordl1[0] | wordr1[0]; + w1[1] = wordl1[1] | wordr1[1]; + w1[2] = wordl1[2] | wordr1[2]; + w1[3] = wordl1[3] | wordr1[3]; + + u32x w2[4]; + + w2[0] = wordl2[0] | wordr2[0]; + w2[1] = wordl2[1] | wordr2[1]; + w2[2] = wordl2[2] | wordr2[2]; + w2[3] = wordl2[3] | wordr2[3]; + + u32x w3[4]; + + w3[0] = wordl3[0] | wordr3[0]; + w3[1] = wordl3[1] | wordr3[1]; + w3[2] = 0; + w3[3] = 0; + + /** + * prepend salt + */ + + u32x w0_t[4]; + + w0_t[0] = w0[0]; + w0_t[1] = w0[1]; + w0_t[2] = w0[2]; + w0_t[3] = w0[3]; + + u32x w1_t[4]; + + w1_t[0] = w1[0]; + w1_t[1] = w1[1]; + w1_t[2] = w1[2]; + w1_t[3] = w1[3]; + + u32x w2_t[4]; + + w2_t[0] = w2[0]; + w2_t[1] = w2[1]; + w2_t[2] = w2[2]; + w2_t[3] = w2[3]; + + u32x w3_t[4]; + + w3_t[0] = w3[0]; + w3_t[1] = w3[1]; + w3_t[2] = w3[2]; + w3_t[3] = w3[3]; + + switch_buffer_by_offset (w0_t, w1_t, w2_t, w3_t, salt_len); + + w0_t[0] |= salt_buf0[0]; + w0_t[1] |= salt_buf0[1]; + w0_t[2] |= salt_buf0[2]; + w0_t[3] |= salt_buf0[3]; + w1_t[0] |= salt_buf1[0]; + w1_t[1] |= salt_buf1[1]; + w1_t[2] |= salt_buf1[2]; + w1_t[3] |= salt_buf1[3]; + w2_t[0] |= salt_buf2[0]; + w2_t[1] |= salt_buf2[1]; + w2_t[2] |= salt_buf2[2]; + w2_t[3] |= salt_buf2[3]; + w3_t[0] |= salt_buf3[0]; + w3_t[1] |= salt_buf3[1]; + w3_t[2] |= salt_buf3[2]; + w3_t[3] |= salt_buf3[3]; + + /** + * append salt + */ + + u32 s0[4]; + + s0[0] = salt_buf0[0]; + s0[1] = salt_buf0[1]; + s0[2] = salt_buf0[2]; + s0[3] = salt_buf0[3]; + + u32 s1[4]; + + s1[0] = salt_buf1[0]; + s1[1] = salt_buf1[1]; + s1[2] = salt_buf1[2]; + s1[3] = salt_buf1[3]; + + u32 s2[4]; + + s2[0] = 0; + s2[1] = 0; + s2[2] = 0; + s2[3] = 0; + + u32 s3[4]; + + s3[0] = 0; + s3[1] = 0; + s3[2] = 0; + s3[3] = 0; + + switch_buffer_by_offset (s0, s1, s2, s3, salt_len + pw_len); + + w0_t[0] |= s0[0]; + w0_t[1] |= s0[1]; + w0_t[2] |= s0[2]; + w0_t[3] |= s0[3]; + w1_t[0] |= s1[0]; + w1_t[1] |= s1[1]; + w1_t[2] |= s1[2]; + w1_t[3] |= s1[3]; + w2_t[0] |= s2[0]; + w2_t[1] |= s2[1]; + w2_t[2] |= s2[2]; + w2_t[3] |= s2[3]; + w3_t[0] |= s3[0]; + w3_t[1] |= s3[1]; + w3_t[2] |= s3[2]; + w3_t[3] |= s3[3]; + + const u32 pw_salt_len = salt_len + pw_len + salt_len; + + append_0x80_4 (w0_t, w1_t, w2_t, w3_t, pw_salt_len); + + w3_t[2] = pw_salt_len * 8; + + /** + * md5 + */ + + u32x a = MD5M_A; + u32x b = MD5M_B; + u32x c = MD5M_C; + u32x d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0_t[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0_t[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0_t[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1_t[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1_t[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1_t[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2_t[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2_t[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2_t[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3_t[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3_t[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3_t[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0_t[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1_t[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2_t[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1_t[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1_t[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2_t[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3_t[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0_t[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2_t[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3_t[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0_t[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1_t[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3_t[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H , a, b, c, d, w1_t[1], MD5C20, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w2_t[0], MD5C21, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w2_t[3], MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w3_t[2], MD5C23, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w0_t[1], MD5C24, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w1_t[0], MD5C25, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w1_t[3], MD5C26, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w2_t[2], MD5C27, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w3_t[1], MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w0_t[0], MD5C29, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w0_t[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w1_t[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w2_t[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w3_t[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w3_t[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w0_t[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1_t[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3_t[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3_t[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0_t[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0_t[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2_t[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1_t[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3_t[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1_t[0], MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w2_t[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0_t[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2_t[1], MD5C3f, MD5S33); + + const u32x r0 = a; + const u32x r1 = d; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_S + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m03800_s08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m03800_s16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/amd/m03800_a3.cl b/amd/m03800_a3.cl new file mode 100644 index 0000000000..ce61421731 --- /dev/null +++ b/amd/m03800_a3.cl @@ -0,0 +1,880 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _MD5_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW4 +#define VECT_SIZE4 +#endif + +#ifdef VLIW5 +#define VECT_SIZE4 +#endif + +#define DGST_R0 0 +#define DGST_R1 3 +#define DGST_R2 2 +#define DGST_R3 1 + +#include "include/kernel_functions.c" +#include "types_amd.c" +#include "common_amd.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +static void m03800m (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], const u32 pw_len, __global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset) +{ + /** + * modifier + */ + + const u32 gid = get_global_id (0); + const u32 lid = get_local_id (0); + + /** + * digest + */ + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[ 1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[ 2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[ 3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[ 4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[ 5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[ 6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[ 7]; + + u32 salt_buf2[4]; + + salt_buf2[0] = 0; + salt_buf2[1] = 0; + salt_buf2[2] = 0; + salt_buf2[3] = 0; + + u32 salt_buf3[4]; + + salt_buf3[0] = 0; + salt_buf3[1] = 0; + salt_buf3[2] = 0; + salt_buf3[3] = 0; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + const u32 pw_salt_len = salt_len + pw_len + salt_len; + + /** + * loop + */ + + u32x w0l = w0[0]; + + for (u32 il_pos = 0; il_pos < bfs_cnt; il_pos++) + { + const u32 w0r = bfs_buf[il_pos].i; + + w0[0] = w0l | w0r; + + u32x w0_t[4]; + + w0_t[0] = w0[0]; + w0_t[1] = w0[1]; + w0_t[2] = w0[2]; + w0_t[3] = w0[3]; + + u32x w1_t[4]; + + w1_t[0] = w1[0]; + w1_t[1] = w1[1]; + w1_t[2] = w1[2]; + w1_t[3] = w1[3]; + + u32x w2_t[4]; + + w2_t[0] = w2[0]; + w2_t[1] = w2[1]; + w2_t[2] = w2[2]; + w2_t[3] = w2[3]; + + u32x w3_t[4]; + + w3_t[0] = w3[0]; + w3_t[1] = w3[1]; + w3_t[2] = w3[2]; + w3_t[3] = w3[3]; + + + /** + * prepend salt + */ + + switch_buffer_by_offset (w0_t, w1_t, w2_t, w3_t, salt_len); + + w0_t[0] |= salt_buf0[0]; + w0_t[1] |= salt_buf0[1]; + w0_t[2] |= salt_buf0[2]; + w0_t[3] |= salt_buf0[3]; + w1_t[0] |= salt_buf1[0]; + w1_t[1] |= salt_buf1[1]; + w1_t[2] |= salt_buf1[2]; + w1_t[3] |= salt_buf1[3]; + w2_t[0] |= salt_buf2[0]; + w2_t[1] |= salt_buf2[1]; + w2_t[2] |= salt_buf2[2]; + w2_t[3] |= salt_buf2[3]; + w3_t[0] |= salt_buf3[0]; + w3_t[1] |= salt_buf3[1]; + w3_t[2] |= salt_buf3[2]; + w3_t[3] |= salt_buf3[3]; + + /** + * append salt + */ + + u32 s0[4]; + + s0[0] = salt_buf0[0]; + s0[1] = salt_buf0[1]; + s0[2] = salt_buf0[2]; + s0[3] = salt_buf0[3]; + + u32 s1[4]; + + s1[0] = salt_buf1[0]; + s1[1] = salt_buf1[1]; + s1[2] = salt_buf1[2]; + s1[3] = salt_buf1[3]; + + u32 s2[4]; + + s2[0] = 0; + s2[1] = 0; + s2[2] = 0; + s2[3] = 0; + + u32 s3[4]; + + s3[0] = 0; + s3[1] = 0; + s3[2] = 0; + s3[3] = 0; + + switch_buffer_by_offset (s0, s1, s2, s3, salt_len + pw_len); + + w0_t[0] |= s0[0]; + w0_t[1] |= s0[1]; + w0_t[2] |= s0[2]; + w0_t[3] |= s0[3]; + w1_t[0] |= s1[0]; + w1_t[1] |= s1[1]; + w1_t[2] |= s1[2]; + w1_t[3] |= s1[3]; + w2_t[0] |= s2[0]; + w2_t[1] |= s2[1]; + w2_t[2] |= s2[2]; + w2_t[3] |= s2[3]; + w3_t[0] |= s3[0]; + w3_t[1] |= s3[1]; + w3_t[2] |= s3[2]; + w3_t[3] |= s3[3]; + + append_0x80_4 (w0_t, w1_t, w2_t, w3_t, pw_salt_len); + + w3_t[2] = pw_salt_len * 8; + + /** + * md5 + */ + + u32x a = MD5M_A; + u32x b = MD5M_B; + u32x c = MD5M_C; + u32x d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0_t[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0_t[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0_t[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1_t[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1_t[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1_t[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2_t[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2_t[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2_t[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3_t[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3_t[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3_t[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0_t[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1_t[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2_t[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1_t[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1_t[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2_t[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3_t[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0_t[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2_t[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3_t[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0_t[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1_t[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3_t[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H , a, b, c, d, w1_t[1], MD5C20, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w2_t[0], MD5C21, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w2_t[3], MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w3_t[2], MD5C23, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w0_t[1], MD5C24, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w1_t[0], MD5C25, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w1_t[3], MD5C26, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w2_t[2], MD5C27, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w3_t[1], MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w0_t[0], MD5C29, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w0_t[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w1_t[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w2_t[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w3_t[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w3_t[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w0_t[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1_t[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3_t[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3_t[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0_t[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0_t[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2_t[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1_t[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3_t[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1_t[0], MD5C3c, MD5S30); + + MD5_STEP (MD5_I , d, a, b, c, w2_t[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0_t[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2_t[1], MD5C3f, MD5S33); + + const u32x r0 = a; + const u32x r1 = d; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_M + } +} + +static void m03800s (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], const u32 pw_len, __global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset) +{ + /** + * modifier + */ + + const u32 gid = get_global_id (0); + const u32 lid = get_local_id (0); + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[ 1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[ 2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[ 3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[ 4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[ 5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[ 6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[ 7]; + + u32 salt_buf2[4]; + + salt_buf2[0] = 0; + salt_buf2[1] = 0; + salt_buf2[2] = 0; + salt_buf2[3] = 0; + + u32 salt_buf3[4]; + + salt_buf3[0] = 0; + salt_buf3[1] = 0; + salt_buf3[2] = 0; + salt_buf3[3] = 0; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + const u32 pw_salt_len = salt_len + pw_len + salt_len; + + /** + * loop + */ + + u32x w0l = w0[0]; + + for (u32 il_pos = 0; il_pos < bfs_cnt; il_pos++) + { + const u32 w0r = bfs_buf[il_pos].i; + + w0[0] = w0l | w0r; + + u32x w0_t[4]; + + w0_t[0] = w0[0]; + w0_t[1] = w0[1]; + w0_t[2] = w0[2]; + w0_t[3] = w0[3]; + + u32x w1_t[4]; + + w1_t[0] = w1[0]; + w1_t[1] = w1[1]; + w1_t[2] = w1[2]; + w1_t[3] = w1[3]; + + u32x w2_t[4]; + + w2_t[0] = w2[0]; + w2_t[1] = w2[1]; + w2_t[2] = w2[2]; + w2_t[3] = w2[3]; + + u32x w3_t[4]; + + w3_t[0] = w3[0]; + w3_t[1] = w3[1]; + w3_t[2] = w3[2]; + w3_t[3] = w3[3]; + + + /** + * prepend salt + */ + + switch_buffer_by_offset (w0_t, w1_t, w2_t, w3_t, salt_len); + + w0_t[0] |= salt_buf0[0]; + w0_t[1] |= salt_buf0[1]; + w0_t[2] |= salt_buf0[2]; + w0_t[3] |= salt_buf0[3]; + w1_t[0] |= salt_buf1[0]; + w1_t[1] |= salt_buf1[1]; + w1_t[2] |= salt_buf1[2]; + w1_t[3] |= salt_buf1[3]; + w2_t[0] |= salt_buf2[0]; + w2_t[1] |= salt_buf2[1]; + w2_t[2] |= salt_buf2[2]; + w2_t[3] |= salt_buf2[3]; + w3_t[0] |= salt_buf3[0]; + w3_t[1] |= salt_buf3[1]; + w3_t[2] |= salt_buf3[2]; + w3_t[3] |= salt_buf3[3]; + + /** + * append salt + */ + + u32 s0[4]; + + s0[0] = salt_buf0[0]; + s0[1] = salt_buf0[1]; + s0[2] = salt_buf0[2]; + s0[3] = salt_buf0[3]; + + u32 s1[4]; + + s1[0] = salt_buf1[0]; + s1[1] = salt_buf1[1]; + s1[2] = salt_buf1[2]; + s1[3] = salt_buf1[3]; + + u32 s2[4]; + + s2[0] = 0; + s2[1] = 0; + s2[2] = 0; + s2[3] = 0; + + u32 s3[4]; + + s3[0] = 0; + s3[1] = 0; + s3[2] = 0; + s3[3] = 0; + + switch_buffer_by_offset (s0, s1, s2, s3, salt_len + pw_len); + + w0_t[0] |= s0[0]; + w0_t[1] |= s0[1]; + w0_t[2] |= s0[2]; + w0_t[3] |= s0[3]; + w1_t[0] |= s1[0]; + w1_t[1] |= s1[1]; + w1_t[2] |= s1[2]; + w1_t[3] |= s1[3]; + w2_t[0] |= s2[0]; + w2_t[1] |= s2[1]; + w2_t[2] |= s2[2]; + w2_t[3] |= s2[3]; + w3_t[0] |= s3[0]; + w3_t[1] |= s3[1]; + w3_t[2] |= s3[2]; + w3_t[3] |= s3[3]; + + append_0x80_4 (w0_t, w1_t, w2_t, w3_t, pw_salt_len); + + w3_t[2] = pw_salt_len * 8; + + /** + * md5 + */ + + u32x a = MD5M_A; + u32x b = MD5M_B; + u32x c = MD5M_C; + u32x d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0_t[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0_t[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0_t[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1_t[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1_t[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1_t[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2_t[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2_t[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2_t[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3_t[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3_t[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3_t[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0_t[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1_t[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2_t[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1_t[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1_t[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2_t[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3_t[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0_t[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2_t[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3_t[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0_t[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1_t[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3_t[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H , a, b, c, d, w1_t[1], MD5C20, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w2_t[0], MD5C21, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w2_t[3], MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w3_t[2], MD5C23, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w0_t[1], MD5C24, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w1_t[0], MD5C25, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w1_t[3], MD5C26, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w2_t[2], MD5C27, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w3_t[1], MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w0_t[0], MD5C29, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w0_t[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w1_t[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w2_t[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w3_t[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w3_t[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w0_t[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1_t[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3_t[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3_t[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0_t[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0_t[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2_t[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1_t[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3_t[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1_t[0], MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w2_t[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0_t[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2_t[1], MD5C3f, MD5S33); + + const u32x r0 = a; + const u32x r1 = d; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_S + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m03800_m04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = pws[gid].i[14]; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m03800m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m03800_m08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = pws[gid].i[14]; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m03800m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m03800_m16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = pws[gid].i[ 8]; + w2[1] = pws[gid].i[ 9]; + w2[2] = pws[gid].i[10]; + w2[3] = pws[gid].i[11]; + + u32x w3[4]; + + w3[0] = pws[gid].i[12]; + w3[1] = pws[gid].i[13]; + w3[2] = pws[gid].i[14]; + w3[3] = pws[gid].i[15]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m03800m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m03800_s04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = pws[gid].i[14]; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m03800s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m03800_s08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = pws[gid].i[14]; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m03800s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m03800_s16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = pws[gid].i[ 8]; + w2[1] = pws[gid].i[ 9]; + w2[2] = pws[gid].i[10]; + w2[3] = pws[gid].i[11]; + + u32x w3[4]; + + w3[0] = pws[gid].i[12]; + w3[1] = pws[gid].i[13]; + w3[2] = pws[gid].i[14]; + w3[3] = pws[gid].i[15]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m03800s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} diff --git a/amd/m04310_a0.cl b/amd/m04310_a0.cl new file mode 100644 index 0000000000..40e01566d5 --- /dev/null +++ b/amd/m04310_a0.cl @@ -0,0 +1,703 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _MD5_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW4 +#define VECT_SIZE4 +#endif + +#ifdef VLIW5 +#define VECT_SIZE4 +#endif + +#define DGST_R0 0 +#define DGST_R1 3 +#define DGST_R2 2 +#define DGST_R3 1 + +#include "include/kernel_functions.c" +#include "types_amd.c" +#include "common_amd.c" +#include "include/rp_gpu.h" +#include "rp_amd.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +#ifdef VECT_SIZE1 +#define uint_to_hex_lower8(i) l_bin2asc[(i)] +#endif + +#ifdef VECT_SIZE2 +#define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1]) +#endif + +#ifdef VECT_SIZE4 +#define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3]) +#endif + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m04310_m04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + u32x pw_buf1[4]; + + pw_buf1[0] = pws[gid].i[ 4]; + pw_buf1[1] = pws[gid].i[ 5]; + pw_buf1[2] = pws[gid].i[ 6]; + pw_buf1[3] = pws[gid].i[ 7]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * salt + */ + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + u32 s[8]; + + s[0] = salt_bufs[salt_pos].salt_buf[0]; + s[1] = salt_bufs[salt_pos].salt_buf[1]; + s[2] = salt_bufs[salt_pos].salt_buf[2]; + s[3] = salt_bufs[salt_pos].salt_buf[3]; + s[4] = salt_bufs[salt_pos].salt_buf[4]; + s[5] = salt_bufs[salt_pos].salt_buf[5]; + s[6] = (32 + salt_len) * 8; + s[7] = 0; + + /** + * bin2asc table + */ + + __local u32 l_bin2asc[256]; + + const u32 lid4 = lid * 4; + + const u32 lid40 = lid4 + 0; + const u32 lid41 = lid4 + 1; + const u32 lid42 = lid4 + 2; + const u32 lid43 = lid4 + 3; + + const u32 v400 = (lid40 >> 0) & 15; + const u32 v401 = (lid40 >> 4) & 15; + const u32 v410 = (lid41 >> 0) & 15; + const u32 v411 = (lid41 >> 4) & 15; + const u32 v420 = (lid42 >> 0) & 15; + const u32 v421 = (lid42 >> 4) & 15; + const u32 v430 = (lid43 >> 0) & 15; + const u32 v431 = (lid43 >> 4) & 15; + + l_bin2asc[lid40] = ((v400 < 10) ? '0' + v400 : 'A' - 10 + v400) << 8 + | ((v401 < 10) ? '0' + v401 : 'A' - 10 + v401) << 0; + l_bin2asc[lid41] = ((v410 < 10) ? '0' + v410 : 'A' - 10 + v410) << 8 + | ((v411 < 10) ? '0' + v411 : 'A' - 10 + v411) << 0; + l_bin2asc[lid42] = ((v420 < 10) ? '0' + v420 : 'A' - 10 + v420) << 8 + | ((v421 < 10) ? '0' + v421 : 'A' - 10 + v421) << 0; + l_bin2asc[lid43] = ((v430 < 10) ? '0' + v430 : 'A' - 10 + v430) << 8 + | ((v431 < 10) ? '0' + v431 : 'A' - 10 + v431) << 0; + + barrier (CLK_LOCAL_MEM_FENCE); + + if (gid >= gid_max) return; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + + w0[0] = pw_buf0[0]; + w0[1] = pw_buf0[1]; + w0[2] = pw_buf0[2]; + w0[3] = pw_buf0[3]; + + u32x w1[4]; + + w1[0] = pw_buf1[0]; + w1[1] = pw_buf1[1]; + w1[2] = pw_buf1[2]; + w1[3] = pw_buf1[3]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 out_len = apply_rules (rules_buf[il_pos].cmds, w0, w1, pw_len); + + append_0x80_2 (w0, w1, out_len); + + w3[2] = out_len * 8; + + u32x a = MD5M_A; + u32x b = MD5M_B; + u32x c = MD5M_C; + u32x d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H , a, b, c, d, w1[1], MD5C20, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w2[0], MD5C21, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w2[3], MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w3[2], MD5C23, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w0[1], MD5C24, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w1[0], MD5C25, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w1[3], MD5C26, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w2[2], MD5C27, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w3[1], MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w0[0], MD5C29, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w0[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w1[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w2[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w3[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w3[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w0[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1[0], MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w2[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2[1], MD5C3f, MD5S33); + + a += MD5M_A; + b += MD5M_B; + c += MD5M_C; + d += MD5M_D; + + const u32x w0_t = uint_to_hex_lower8 ((a >> 0) & 255) << 0 + | uint_to_hex_lower8 ((a >> 8) & 255) << 16; + const u32x w1_t = uint_to_hex_lower8 ((a >> 16) & 255) << 0 + | uint_to_hex_lower8 ((a >> 24) & 255) << 16; + const u32x w2_t = uint_to_hex_lower8 ((b >> 0) & 255) << 0 + | uint_to_hex_lower8 ((b >> 8) & 255) << 16; + const u32x w3_t = uint_to_hex_lower8 ((b >> 16) & 255) << 0 + | uint_to_hex_lower8 ((b >> 24) & 255) << 16; + const u32x w4_t = uint_to_hex_lower8 ((c >> 0) & 255) << 0 + | uint_to_hex_lower8 ((c >> 8) & 255) << 16; + const u32x w5_t = uint_to_hex_lower8 ((c >> 16) & 255) << 0 + | uint_to_hex_lower8 ((c >> 24) & 255) << 16; + const u32x w6_t = uint_to_hex_lower8 ((d >> 0) & 255) << 0 + | uint_to_hex_lower8 ((d >> 8) & 255) << 16; + const u32x w7_t = uint_to_hex_lower8 ((d >> 16) & 255) << 0 + | uint_to_hex_lower8 ((d >> 24) & 255) << 16; + + const u32 w8_t = s[0]; + const u32 w9_t = s[1]; + const u32 wa_t = s[2]; + const u32 wb_t = s[3]; + const u32 wc_t = s[4]; + const u32 wd_t = s[5]; + const u32 we_t = s[6]; + const u32 wf_t = s[7]; + + a = MD5M_A; + b = MD5M_B; + c = MD5M_C; + d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t, MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t, MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t, MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t, MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w4_t, MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w5_t, MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w6_t, MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w7_t, MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w8_t, MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w9_t, MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, wa_t, MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, wb_t, MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, wc_t, MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, wd_t, MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, we_t, MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, wf_t, MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w1_t, MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w6_t, MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, wb_t, MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t, MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w5_t, MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, wa_t, MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, wf_t, MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w4_t, MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w9_t, MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, we_t, MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t, MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w8_t, MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, wd_t, MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t, MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w7_t, MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, wc_t, MD5C1f, MD5S13); + + MD5_STEP (MD5_H , a, b, c, d, w5_t, MD5C20, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w8_t, MD5C21, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, wb_t, MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, we_t, MD5C23, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w1_t, MD5C24, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w4_t, MD5C25, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w7_t, MD5C26, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, wa_t, MD5C27, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, wd_t, MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w0_t, MD5C29, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w3_t, MD5C2a, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w6_t, MD5C2b, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w9_t, MD5C2c, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, wc_t, MD5C2d, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, wf_t, MD5C2e, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w2_t, MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t, MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w7_t, MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, we_t, MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w5_t, MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, wc_t, MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t, MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, wa_t, MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t, MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w8_t, MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, wf_t, MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w6_t, MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, wd_t, MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w4_t, MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, wb_t, MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t, MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w9_t, MD5C3f, MD5S33); + + const u32x r0 = a; + const u32x r1 = d; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_M + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m04310_m08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m04310_m16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m04310_s04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + u32x pw_buf1[4]; + + pw_buf1[0] = pws[gid].i[ 4]; + pw_buf1[1] = pws[gid].i[ 5]; + pw_buf1[2] = pws[gid].i[ 6]; + pw_buf1[3] = pws[gid].i[ 7]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * salt + */ + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + u32 s[8]; + + s[0] = salt_bufs[salt_pos].salt_buf[0]; + s[1] = salt_bufs[salt_pos].salt_buf[1]; + s[2] = salt_bufs[salt_pos].salt_buf[2]; + s[3] = salt_bufs[salt_pos].salt_buf[3]; + s[4] = salt_bufs[salt_pos].salt_buf[4]; + s[5] = salt_bufs[salt_pos].salt_buf[5]; + s[6] = (32 + salt_len) * 8; + s[7] = 0; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * bin2asc table + */ + + __local u32 l_bin2asc[256]; + + const u32 lid4 = lid * 4; + + const u32 lid40 = lid4 + 0; + const u32 lid41 = lid4 + 1; + const u32 lid42 = lid4 + 2; + const u32 lid43 = lid4 + 3; + + const u32 v400 = (lid40 >> 0) & 15; + const u32 v401 = (lid40 >> 4) & 15; + const u32 v410 = (lid41 >> 0) & 15; + const u32 v411 = (lid41 >> 4) & 15; + const u32 v420 = (lid42 >> 0) & 15; + const u32 v421 = (lid42 >> 4) & 15; + const u32 v430 = (lid43 >> 0) & 15; + const u32 v431 = (lid43 >> 4) & 15; + + l_bin2asc[lid40] = ((v400 < 10) ? '0' + v400 : 'A' - 10 + v400) << 8 + | ((v401 < 10) ? '0' + v401 : 'A' - 10 + v401) << 0; + l_bin2asc[lid41] = ((v410 < 10) ? '0' + v410 : 'A' - 10 + v410) << 8 + | ((v411 < 10) ? '0' + v411 : 'A' - 10 + v411) << 0; + l_bin2asc[lid42] = ((v420 < 10) ? '0' + v420 : 'A' - 10 + v420) << 8 + | ((v421 < 10) ? '0' + v421 : 'A' - 10 + v421) << 0; + l_bin2asc[lid43] = ((v430 < 10) ? '0' + v430 : 'A' - 10 + v430) << 8 + | ((v431 < 10) ? '0' + v431 : 'A' - 10 + v431) << 0; + + barrier (CLK_LOCAL_MEM_FENCE); + + if (gid >= gid_max) return; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + + w0[0] = pw_buf0[0]; + w0[1] = pw_buf0[1]; + w0[2] = pw_buf0[2]; + w0[3] = pw_buf0[3]; + + u32x w1[4]; + + w1[0] = pw_buf1[0]; + w1[1] = pw_buf1[1]; + w1[2] = pw_buf1[2]; + w1[3] = pw_buf1[3]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 out_len = apply_rules (rules_buf[il_pos].cmds, w0, w1, pw_len); + + append_0x80_2 (w0, w1, out_len); + + w3[2] = out_len * 8; + + u32x a = MD5M_A; + u32x b = MD5M_B; + u32x c = MD5M_C; + u32x d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H , a, b, c, d, w1[1], MD5C20, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w2[0], MD5C21, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w2[3], MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w3[2], MD5C23, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w0[1], MD5C24, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w1[0], MD5C25, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w1[3], MD5C26, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w2[2], MD5C27, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w3[1], MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w0[0], MD5C29, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w0[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w1[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w2[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w3[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w3[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w0[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1[0], MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w2[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2[1], MD5C3f, MD5S33); + + a += MD5M_A; + b += MD5M_B; + c += MD5M_C; + d += MD5M_D; + + const u32x w0_t = uint_to_hex_lower8 ((a >> 0) & 255) << 0 + | uint_to_hex_lower8 ((a >> 8) & 255) << 16; + const u32x w1_t = uint_to_hex_lower8 ((a >> 16) & 255) << 0 + | uint_to_hex_lower8 ((a >> 24) & 255) << 16; + const u32x w2_t = uint_to_hex_lower8 ((b >> 0) & 255) << 0 + | uint_to_hex_lower8 ((b >> 8) & 255) << 16; + const u32x w3_t = uint_to_hex_lower8 ((b >> 16) & 255) << 0 + | uint_to_hex_lower8 ((b >> 24) & 255) << 16; + const u32x w4_t = uint_to_hex_lower8 ((c >> 0) & 255) << 0 + | uint_to_hex_lower8 ((c >> 8) & 255) << 16; + const u32x w5_t = uint_to_hex_lower8 ((c >> 16) & 255) << 0 + | uint_to_hex_lower8 ((c >> 24) & 255) << 16; + const u32x w6_t = uint_to_hex_lower8 ((d >> 0) & 255) << 0 + | uint_to_hex_lower8 ((d >> 8) & 255) << 16; + const u32x w7_t = uint_to_hex_lower8 ((d >> 16) & 255) << 0 + | uint_to_hex_lower8 ((d >> 24) & 255) << 16; + + const u32 w8_t = s[0]; + const u32 w9_t = s[1]; + const u32 wa_t = s[2]; + const u32 wb_t = s[3]; + const u32 wc_t = s[4]; + const u32 wd_t = s[5]; + const u32 we_t = s[6]; + const u32 wf_t = s[7]; + + a = MD5M_A; + b = MD5M_B; + c = MD5M_C; + d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t, MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t, MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t, MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t, MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w4_t, MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w5_t, MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w6_t, MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w7_t, MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w8_t, MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w9_t, MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, wa_t, MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, wb_t, MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, wc_t, MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, wd_t, MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, we_t, MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, wf_t, MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w1_t, MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w6_t, MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, wb_t, MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t, MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w5_t, MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, wa_t, MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, wf_t, MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w4_t, MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w9_t, MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, we_t, MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t, MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w8_t, MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, wd_t, MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t, MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w7_t, MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, wc_t, MD5C1f, MD5S13); + + MD5_STEP (MD5_H , a, b, c, d, w5_t, MD5C20, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w8_t, MD5C21, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, wb_t, MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, we_t, MD5C23, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w1_t, MD5C24, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w4_t, MD5C25, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w7_t, MD5C26, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, wa_t, MD5C27, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, wd_t, MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w0_t, MD5C29, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w3_t, MD5C2a, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w6_t, MD5C2b, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w9_t, MD5C2c, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, wc_t, MD5C2d, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, wf_t, MD5C2e, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w2_t, MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t, MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w7_t, MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, we_t, MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w5_t, MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, wc_t, MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t, MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, wa_t, MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t, MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w8_t, MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, wf_t, MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w6_t, MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, wd_t, MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w4_t, MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, wb_t, MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t, MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w9_t, MD5C3f, MD5S33); + + const u32x r0 = a; + const u32x r1 = d; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_S + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m04310_s08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m04310_s16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/amd/m04310_a1.cl b/amd/m04310_a1.cl new file mode 100644 index 0000000000..bae892c298 --- /dev/null +++ b/amd/m04310_a1.cl @@ -0,0 +1,805 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _MD5_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW4 +#define VECT_SIZE4 +#endif + +#ifdef VLIW5 +#define VECT_SIZE4 +#endif + +#define DGST_R0 0 +#define DGST_R1 3 +#define DGST_R2 2 +#define DGST_R3 1 + +#include "include/kernel_functions.c" +#include "types_amd.c" +#include "common_amd.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +#ifdef VECT_SIZE1 +#define uint_to_hex_lower8(i) l_bin2asc[(i)] +#endif + +#ifdef VECT_SIZE2 +#define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1]) +#endif + +#ifdef VECT_SIZE4 +#define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3]) +#endif + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m04310_m04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + append_0x80_2 (wordl0, wordl1, pw_l_len); + + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, combs_buf[0].pw_len); + } + + /** + * salt + */ + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + u32 s[8]; + + s[0] = salt_bufs[salt_pos].salt_buf[0]; + s[1] = salt_bufs[salt_pos].salt_buf[1]; + s[2] = salt_bufs[salt_pos].salt_buf[2]; + s[3] = salt_bufs[salt_pos].salt_buf[3]; + s[4] = salt_bufs[salt_pos].salt_buf[4]; + s[5] = salt_bufs[salt_pos].salt_buf[5]; + s[6] = (32 + salt_len) * 8; + s[7] = 0; + + /** + * bin2asc table + */ + + __local u32 l_bin2asc[256]; + + const u32 lid4 = lid * 4; + + const u32 lid40 = lid4 + 0; + const u32 lid41 = lid4 + 1; + const u32 lid42 = lid4 + 2; + const u32 lid43 = lid4 + 3; + + const u32 v400 = (lid40 >> 0) & 15; + const u32 v401 = (lid40 >> 4) & 15; + const u32 v410 = (lid41 >> 0) & 15; + const u32 v411 = (lid41 >> 4) & 15; + const u32 v420 = (lid42 >> 0) & 15; + const u32 v421 = (lid42 >> 4) & 15; + const u32 v430 = (lid43 >> 0) & 15; + const u32 v431 = (lid43 >> 4) & 15; + + l_bin2asc[lid40] = ((v400 < 10) ? '0' + v400 : 'A' - 10 + v400) << 8 + | ((v401 < 10) ? '0' + v401 : 'A' - 10 + v401) << 0; + l_bin2asc[lid41] = ((v410 < 10) ? '0' + v410 : 'A' - 10 + v410) << 8 + | ((v411 < 10) ? '0' + v411 : 'A' - 10 + v411) << 0; + l_bin2asc[lid42] = ((v420 < 10) ? '0' + v420 : 'A' - 10 + v420) << 8 + | ((v421 < 10) ? '0' + v421 : 'A' - 10 + v421) << 0; + l_bin2asc[lid43] = ((v430 < 10) ? '0' + v430 : 'A' - 10 + v430) << 8 + | ((v431 < 10) ? '0' + v431 : 'A' - 10 + v431) << 0; + + barrier (CLK_LOCAL_MEM_FENCE); + + if (gid >= gid_max) return; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = combs_buf[il_pos].pw_len; + + const u32 pw_len = pw_l_len + pw_r_len; + + u32 wordr0[4]; + + wordr0[0] = combs_buf[il_pos].i[0]; + wordr0[1] = combs_buf[il_pos].i[1]; + wordr0[2] = combs_buf[il_pos].i[2]; + wordr0[3] = combs_buf[il_pos].i[3]; + + u32 wordr1[4]; + + wordr1[0] = combs_buf[il_pos].i[4]; + wordr1[1] = combs_buf[il_pos].i[5]; + wordr1[2] = combs_buf[il_pos].i[6]; + wordr1[3] = combs_buf[il_pos].i[7]; + + u32 wordr2[4]; + + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + + u32 wordr3[4]; + + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + u32x w0[4]; + + w0[0] = wordl0[0] | wordr0[0]; + w0[1] = wordl0[1] | wordr0[1]; + w0[2] = wordl0[2] | wordr0[2]; + w0[3] = wordl0[3] | wordr0[3]; + + u32x w1[4]; + + w1[0] = wordl1[0] | wordr1[0]; + w1[1] = wordl1[1] | wordr1[1]; + w1[2] = wordl1[2] | wordr1[2]; + w1[3] = wordl1[3] | wordr1[3]; + + u32x w2[4]; + + w2[0] = wordl2[0] | wordr2[0]; + w2[1] = wordl2[1] | wordr2[1]; + w2[2] = wordl2[2] | wordr2[2]; + w2[3] = wordl2[3] | wordr2[3]; + + u32x w3[4]; + + w3[0] = wordl3[0] | wordr3[0]; + w3[1] = wordl3[1] | wordr3[1]; + w3[2] = pw_len * 8; + w3[3] = 0; + + u32x a = MD5M_A; + u32x b = MD5M_B; + u32x c = MD5M_C; + u32x d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H , a, b, c, d, w1[1], MD5C20, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w2[0], MD5C21, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w2[3], MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w3[2], MD5C23, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w0[1], MD5C24, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w1[0], MD5C25, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w1[3], MD5C26, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w2[2], MD5C27, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w3[1], MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w0[0], MD5C29, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w0[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w1[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w2[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w3[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w3[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w0[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1[0], MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w2[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2[1], MD5C3f, MD5S33); + + a += MD5M_A; + b += MD5M_B; + c += MD5M_C; + d += MD5M_D; + + const u32x w0_t = uint_to_hex_lower8 ((a >> 0) & 255) << 0 + | uint_to_hex_lower8 ((a >> 8) & 255) << 16; + const u32x w1_t = uint_to_hex_lower8 ((a >> 16) & 255) << 0 + | uint_to_hex_lower8 ((a >> 24) & 255) << 16; + const u32x w2_t = uint_to_hex_lower8 ((b >> 0) & 255) << 0 + | uint_to_hex_lower8 ((b >> 8) & 255) << 16; + const u32x w3_t = uint_to_hex_lower8 ((b >> 16) & 255) << 0 + | uint_to_hex_lower8 ((b >> 24) & 255) << 16; + const u32x w4_t = uint_to_hex_lower8 ((c >> 0) & 255) << 0 + | uint_to_hex_lower8 ((c >> 8) & 255) << 16; + const u32x w5_t = uint_to_hex_lower8 ((c >> 16) & 255) << 0 + | uint_to_hex_lower8 ((c >> 24) & 255) << 16; + const u32x w6_t = uint_to_hex_lower8 ((d >> 0) & 255) << 0 + | uint_to_hex_lower8 ((d >> 8) & 255) << 16; + const u32x w7_t = uint_to_hex_lower8 ((d >> 16) & 255) << 0 + | uint_to_hex_lower8 ((d >> 24) & 255) << 16; + + const u32 w8_t = s[0]; + const u32 w9_t = s[1]; + const u32 wa_t = s[2]; + const u32 wb_t = s[3]; + const u32 wc_t = s[4]; + const u32 wd_t = s[5]; + const u32 we_t = s[6]; + const u32 wf_t = s[7]; + + a = MD5M_A; + b = MD5M_B; + c = MD5M_C; + d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t, MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t, MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t, MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t, MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w4_t, MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w5_t, MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w6_t, MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w7_t, MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w8_t, MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w9_t, MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, wa_t, MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, wb_t, MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, wc_t, MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, wd_t, MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, we_t, MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, wf_t, MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w1_t, MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w6_t, MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, wb_t, MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t, MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w5_t, MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, wa_t, MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, wf_t, MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w4_t, MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w9_t, MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, we_t, MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t, MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w8_t, MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, wd_t, MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t, MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w7_t, MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, wc_t, MD5C1f, MD5S13); + + MD5_STEP (MD5_H , a, b, c, d, w5_t, MD5C20, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w8_t, MD5C21, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, wb_t, MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, we_t, MD5C23, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w1_t, MD5C24, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w4_t, MD5C25, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w7_t, MD5C26, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, wa_t, MD5C27, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, wd_t, MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w0_t, MD5C29, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w3_t, MD5C2a, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w6_t, MD5C2b, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w9_t, MD5C2c, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, wc_t, MD5C2d, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, wf_t, MD5C2e, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w2_t, MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t, MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w7_t, MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, we_t, MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w5_t, MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, wc_t, MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t, MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, wa_t, MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t, MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w8_t, MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, wf_t, MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w6_t, MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, wd_t, MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w4_t, MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, wb_t, MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t, MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w9_t, MD5C3f, MD5S33); + + const u32x r0 = a; + const u32x r1 = d; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_M + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m04310_m08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m04310_m16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m04310_s04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + append_0x80_2 (wordl0, wordl1, pw_l_len); + + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, combs_buf[0].pw_len); + } + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * salt + */ + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + u32 s[8]; + + s[0] = salt_bufs[salt_pos].salt_buf[0]; + s[1] = salt_bufs[salt_pos].salt_buf[1]; + s[2] = salt_bufs[salt_pos].salt_buf[2]; + s[3] = salt_bufs[salt_pos].salt_buf[3]; + s[4] = salt_bufs[salt_pos].salt_buf[4]; + s[5] = salt_bufs[salt_pos].salt_buf[5]; + s[6] = (32 + salt_len) * 8; + s[7] = 0; + + /** + * bin2asc table + */ + + __local u32 l_bin2asc[256]; + + const u32 lid4 = lid * 4; + + const u32 lid40 = lid4 + 0; + const u32 lid41 = lid4 + 1; + const u32 lid42 = lid4 + 2; + const u32 lid43 = lid4 + 3; + + const u32 v400 = (lid40 >> 0) & 15; + const u32 v401 = (lid40 >> 4) & 15; + const u32 v410 = (lid41 >> 0) & 15; + const u32 v411 = (lid41 >> 4) & 15; + const u32 v420 = (lid42 >> 0) & 15; + const u32 v421 = (lid42 >> 4) & 15; + const u32 v430 = (lid43 >> 0) & 15; + const u32 v431 = (lid43 >> 4) & 15; + + l_bin2asc[lid40] = ((v400 < 10) ? '0' + v400 : 'A' - 10 + v400) << 8 + | ((v401 < 10) ? '0' + v401 : 'A' - 10 + v401) << 0; + l_bin2asc[lid41] = ((v410 < 10) ? '0' + v410 : 'A' - 10 + v410) << 8 + | ((v411 < 10) ? '0' + v411 : 'A' - 10 + v411) << 0; + l_bin2asc[lid42] = ((v420 < 10) ? '0' + v420 : 'A' - 10 + v420) << 8 + | ((v421 < 10) ? '0' + v421 : 'A' - 10 + v421) << 0; + l_bin2asc[lid43] = ((v430 < 10) ? '0' + v430 : 'A' - 10 + v430) << 8 + | ((v431 < 10) ? '0' + v431 : 'A' - 10 + v431) << 0; + + barrier (CLK_LOCAL_MEM_FENCE); + + if (gid >= gid_max) return; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = combs_buf[il_pos].pw_len; + + const u32 pw_len = pw_l_len + pw_r_len; + + u32 wordr0[4]; + + wordr0[0] = combs_buf[il_pos].i[0]; + wordr0[1] = combs_buf[il_pos].i[1]; + wordr0[2] = combs_buf[il_pos].i[2]; + wordr0[3] = combs_buf[il_pos].i[3]; + + u32 wordr1[4]; + + wordr1[0] = combs_buf[il_pos].i[4]; + wordr1[1] = combs_buf[il_pos].i[5]; + wordr1[2] = combs_buf[il_pos].i[6]; + wordr1[3] = combs_buf[il_pos].i[7]; + + u32 wordr2[4]; + + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + + u32 wordr3[4]; + + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + u32x w0[4]; + + w0[0] = wordl0[0] | wordr0[0]; + w0[1] = wordl0[1] | wordr0[1]; + w0[2] = wordl0[2] | wordr0[2]; + w0[3] = wordl0[3] | wordr0[3]; + + u32x w1[4]; + + w1[0] = wordl1[0] | wordr1[0]; + w1[1] = wordl1[1] | wordr1[1]; + w1[2] = wordl1[2] | wordr1[2]; + w1[3] = wordl1[3] | wordr1[3]; + + u32x w2[4]; + + w2[0] = wordl2[0] | wordr2[0]; + w2[1] = wordl2[1] | wordr2[1]; + w2[2] = wordl2[2] | wordr2[2]; + w2[3] = wordl2[3] | wordr2[3]; + + u32x w3[4]; + + w3[0] = wordl3[0] | wordr3[0]; + w3[1] = wordl3[1] | wordr3[1]; + w3[2] = pw_len * 8; + w3[3] = 0; + + u32x a = MD5M_A; + u32x b = MD5M_B; + u32x c = MD5M_C; + u32x d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H , a, b, c, d, w1[1], MD5C20, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w2[0], MD5C21, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w2[3], MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w3[2], MD5C23, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w0[1], MD5C24, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w1[0], MD5C25, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w1[3], MD5C26, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w2[2], MD5C27, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w3[1], MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w0[0], MD5C29, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w0[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w1[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w2[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w3[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w3[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w0[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1[0], MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w2[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2[1], MD5C3f, MD5S33); + + a += MD5M_A; + b += MD5M_B; + c += MD5M_C; + d += MD5M_D; + + const u32x w0_t = uint_to_hex_lower8 ((a >> 0) & 255) << 0 + | uint_to_hex_lower8 ((a >> 8) & 255) << 16; + const u32x w1_t = uint_to_hex_lower8 ((a >> 16) & 255) << 0 + | uint_to_hex_lower8 ((a >> 24) & 255) << 16; + const u32x w2_t = uint_to_hex_lower8 ((b >> 0) & 255) << 0 + | uint_to_hex_lower8 ((b >> 8) & 255) << 16; + const u32x w3_t = uint_to_hex_lower8 ((b >> 16) & 255) << 0 + | uint_to_hex_lower8 ((b >> 24) & 255) << 16; + const u32x w4_t = uint_to_hex_lower8 ((c >> 0) & 255) << 0 + | uint_to_hex_lower8 ((c >> 8) & 255) << 16; + const u32x w5_t = uint_to_hex_lower8 ((c >> 16) & 255) << 0 + | uint_to_hex_lower8 ((c >> 24) & 255) << 16; + const u32x w6_t = uint_to_hex_lower8 ((d >> 0) & 255) << 0 + | uint_to_hex_lower8 ((d >> 8) & 255) << 16; + const u32x w7_t = uint_to_hex_lower8 ((d >> 16) & 255) << 0 + | uint_to_hex_lower8 ((d >> 24) & 255) << 16; + + const u32 w8_t = s[0]; + const u32 w9_t = s[1]; + const u32 wa_t = s[2]; + const u32 wb_t = s[3]; + const u32 wc_t = s[4]; + const u32 wd_t = s[5]; + const u32 we_t = s[6]; + const u32 wf_t = s[7]; + + a = MD5M_A; + b = MD5M_B; + c = MD5M_C; + d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t, MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t, MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t, MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t, MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w4_t, MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w5_t, MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w6_t, MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w7_t, MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w8_t, MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w9_t, MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, wa_t, MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, wb_t, MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, wc_t, MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, wd_t, MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, we_t, MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, wf_t, MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w1_t, MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w6_t, MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, wb_t, MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t, MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w5_t, MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, wa_t, MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, wf_t, MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w4_t, MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w9_t, MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, we_t, MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t, MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w8_t, MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, wd_t, MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t, MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w7_t, MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, wc_t, MD5C1f, MD5S13); + + MD5_STEP (MD5_H , a, b, c, d, w5_t, MD5C20, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w8_t, MD5C21, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, wb_t, MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, we_t, MD5C23, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w1_t, MD5C24, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w4_t, MD5C25, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w7_t, MD5C26, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, wa_t, MD5C27, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, wd_t, MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w0_t, MD5C29, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w3_t, MD5C2a, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w6_t, MD5C2b, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w9_t, MD5C2c, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, wc_t, MD5C2d, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, wf_t, MD5C2e, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w2_t, MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t, MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w7_t, MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, we_t, MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w5_t, MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, wc_t, MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t, MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, wa_t, MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t, MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w8_t, MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, wf_t, MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w6_t, MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, wd_t, MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w4_t, MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, wb_t, MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t, MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w9_t, MD5C3f, MD5S33); + + const u32x r0 = a; + const u32x r1 = d; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_S + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m04310_s08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m04310_s16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/amd/m04310_a3.cl b/amd/m04310_a3.cl new file mode 100644 index 0000000000..ce814c2afe --- /dev/null +++ b/amd/m04310_a3.cl @@ -0,0 +1,1034 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _MD5_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW4 +#define VECT_SIZE4 +#endif + +#ifdef VLIW5 +#define VECT_SIZE4 +#endif + +#define DGST_R0 0 +#define DGST_R1 3 +#define DGST_R2 2 +#define DGST_R3 1 + +#include "include/kernel_functions.c" +#include "types_amd.c" +#include "common_amd.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +#ifdef VECT_SIZE1 +#define uint_to_hex_lower8(i) l_bin2asc[(i)] +#endif + +#ifdef VECT_SIZE2 +#define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1]) +#endif + +#ifdef VECT_SIZE4 +#define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3]) +#endif + +static void m04310m (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], const u32 pw_len, __global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, __local u32 l_bin2asc[256]) +{ + /** + * modifier + */ + + const u32 gid = get_global_id (0); + const u32 lid = get_local_id (0); + + /** + * salt + */ + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + u32 s[8]; + + s[0] = salt_bufs[salt_pos].salt_buf[0]; + s[1] = salt_bufs[salt_pos].salt_buf[1]; + s[2] = salt_bufs[salt_pos].salt_buf[2]; + s[3] = salt_bufs[salt_pos].salt_buf[3]; + s[4] = salt_bufs[salt_pos].salt_buf[4]; + s[5] = salt_bufs[salt_pos].salt_buf[5]; + s[6] = (32 + salt_len) * 8; + s[7] = 0; + + /** + * loop + */ + + u32x w0l = w0[0]; + + for (u32 il_pos = 0; il_pos < bfs_cnt; il_pos++) + { + const u32 w0r = bfs_buf[il_pos].i; + + w0[0] = w0l | w0r; + + u32x a = MD5M_A; + u32x b = MD5M_B; + u32x c = MD5M_C; + u32x d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H , a, b, c, d, w1[1], MD5C20, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w2[0], MD5C21, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w2[3], MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w3[2], MD5C23, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w0[1], MD5C24, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w1[0], MD5C25, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w1[3], MD5C26, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w2[2], MD5C27, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w3[1], MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w0[0], MD5C29, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w0[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w1[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w2[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w3[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w3[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w0[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1[0], MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w2[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2[1], MD5C3f, MD5S33); + + a += MD5M_A; + b += MD5M_B; + c += MD5M_C; + d += MD5M_D; + + const u32x w0_t = uint_to_hex_lower8 ((a >> 0) & 255) << 0 + | uint_to_hex_lower8 ((a >> 8) & 255) << 16; + const u32x w1_t = uint_to_hex_lower8 ((a >> 16) & 255) << 0 + | uint_to_hex_lower8 ((a >> 24) & 255) << 16; + const u32x w2_t = uint_to_hex_lower8 ((b >> 0) & 255) << 0 + | uint_to_hex_lower8 ((b >> 8) & 255) << 16; + const u32x w3_t = uint_to_hex_lower8 ((b >> 16) & 255) << 0 + | uint_to_hex_lower8 ((b >> 24) & 255) << 16; + const u32x w4_t = uint_to_hex_lower8 ((c >> 0) & 255) << 0 + | uint_to_hex_lower8 ((c >> 8) & 255) << 16; + const u32x w5_t = uint_to_hex_lower8 ((c >> 16) & 255) << 0 + | uint_to_hex_lower8 ((c >> 24) & 255) << 16; + const u32x w6_t = uint_to_hex_lower8 ((d >> 0) & 255) << 0 + | uint_to_hex_lower8 ((d >> 8) & 255) << 16; + const u32x w7_t = uint_to_hex_lower8 ((d >> 16) & 255) << 0 + | uint_to_hex_lower8 ((d >> 24) & 255) << 16; + + const u32 w8_t = s[0]; + const u32 w9_t = s[1]; + const u32 wa_t = s[2]; + const u32 wb_t = s[3]; + const u32 wc_t = s[4]; + const u32 wd_t = s[5]; + const u32 we_t = s[6]; + const u32 wf_t = s[7]; + + a = MD5M_A; + b = MD5M_B; + c = MD5M_C; + d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t, MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t, MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t, MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t, MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w4_t, MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w5_t, MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w6_t, MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w7_t, MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w8_t, MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w9_t, MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, wa_t, MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, wb_t, MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, wc_t, MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, wd_t, MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, we_t, MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, wf_t, MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w1_t, MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w6_t, MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, wb_t, MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t, MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w5_t, MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, wa_t, MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, wf_t, MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w4_t, MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w9_t, MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, we_t, MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t, MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w8_t, MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, wd_t, MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t, MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w7_t, MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, wc_t, MD5C1f, MD5S13); + + MD5_STEP (MD5_H , a, b, c, d, w5_t, MD5C20, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w8_t, MD5C21, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, wb_t, MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, we_t, MD5C23, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w1_t, MD5C24, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w4_t, MD5C25, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w7_t, MD5C26, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, wa_t, MD5C27, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, wd_t, MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w0_t, MD5C29, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w3_t, MD5C2a, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w6_t, MD5C2b, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w9_t, MD5C2c, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, wc_t, MD5C2d, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, wf_t, MD5C2e, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w2_t, MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t, MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w7_t, MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, we_t, MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w5_t, MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, wc_t, MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t, MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, wa_t, MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t, MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w8_t, MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, wf_t, MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w6_t, MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, wd_t, MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w4_t, MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, wb_t, MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t, MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w9_t, MD5C3f, MD5S33); + + const u32x r0 = a; + const u32x r1 = d; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_M + } +} + +static void m04310s (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], const u32 pw_len, __global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, __local u32 l_bin2asc[256]) +{ + /** + * modifier + */ + + const u32 gid = get_global_id (0); + const u32 lid = get_local_id (0); + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * salt + */ + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + u32 s[8]; + + s[0] = salt_bufs[salt_pos].salt_buf[0]; + s[1] = salt_bufs[salt_pos].salt_buf[1]; + s[2] = salt_bufs[salt_pos].salt_buf[2]; + s[3] = salt_bufs[salt_pos].salt_buf[3]; + s[4] = salt_bufs[salt_pos].salt_buf[4]; + s[5] = salt_bufs[salt_pos].salt_buf[5]; + s[6] = (32 + salt_len) * 8; + s[7] = 0; + + /** + * loop + */ + + u32x w0l = w0[0]; + + for (u32 il_pos = 0; il_pos < bfs_cnt; il_pos++) + { + const u32 w0r = bfs_buf[il_pos].i; + + w0[0] = w0l | w0r; + + u32x a = MD5M_A; + u32x b = MD5M_B; + u32x c = MD5M_C; + u32x d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H , a, b, c, d, w1[1], MD5C20, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w2[0], MD5C21, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w2[3], MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w3[2], MD5C23, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w0[1], MD5C24, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w1[0], MD5C25, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w1[3], MD5C26, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w2[2], MD5C27, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w3[1], MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w0[0], MD5C29, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w0[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w1[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w2[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w3[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w3[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w0[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1[0], MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w2[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2[1], MD5C3f, MD5S33); + + a += MD5M_A; + b += MD5M_B; + c += MD5M_C; + d += MD5M_D; + + const u32x w0_t = uint_to_hex_lower8 ((a >> 0) & 255) << 0 + | uint_to_hex_lower8 ((a >> 8) & 255) << 16; + const u32x w1_t = uint_to_hex_lower8 ((a >> 16) & 255) << 0 + | uint_to_hex_lower8 ((a >> 24) & 255) << 16; + const u32x w2_t = uint_to_hex_lower8 ((b >> 0) & 255) << 0 + | uint_to_hex_lower8 ((b >> 8) & 255) << 16; + const u32x w3_t = uint_to_hex_lower8 ((b >> 16) & 255) << 0 + | uint_to_hex_lower8 ((b >> 24) & 255) << 16; + const u32x w4_t = uint_to_hex_lower8 ((c >> 0) & 255) << 0 + | uint_to_hex_lower8 ((c >> 8) & 255) << 16; + const u32x w5_t = uint_to_hex_lower8 ((c >> 16) & 255) << 0 + | uint_to_hex_lower8 ((c >> 24) & 255) << 16; + const u32x w6_t = uint_to_hex_lower8 ((d >> 0) & 255) << 0 + | uint_to_hex_lower8 ((d >> 8) & 255) << 16; + const u32x w7_t = uint_to_hex_lower8 ((d >> 16) & 255) << 0 + | uint_to_hex_lower8 ((d >> 24) & 255) << 16; + + const u32 w8_t = s[0]; + const u32 w9_t = s[1]; + const u32 wa_t = s[2]; + const u32 wb_t = s[3]; + const u32 wc_t = s[4]; + const u32 wd_t = s[5]; + const u32 we_t = s[6]; + const u32 wf_t = s[7]; + + a = MD5M_A; + b = MD5M_B; + c = MD5M_C; + d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t, MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t, MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t, MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t, MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w4_t, MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w5_t, MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w6_t, MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w7_t, MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w8_t, MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w9_t, MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, wa_t, MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, wb_t, MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, wc_t, MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, wd_t, MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, we_t, MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, wf_t, MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w1_t, MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w6_t, MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, wb_t, MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t, MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w5_t, MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, wa_t, MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, wf_t, MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w4_t, MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w9_t, MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, we_t, MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t, MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w8_t, MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, wd_t, MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t, MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w7_t, MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, wc_t, MD5C1f, MD5S13); + + MD5_STEP (MD5_H , a, b, c, d, w5_t, MD5C20, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w8_t, MD5C21, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, wb_t, MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, we_t, MD5C23, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w1_t, MD5C24, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w4_t, MD5C25, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w7_t, MD5C26, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, wa_t, MD5C27, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, wd_t, MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w0_t, MD5C29, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w3_t, MD5C2a, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w6_t, MD5C2b, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w9_t, MD5C2c, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, wc_t, MD5C2d, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, wf_t, MD5C2e, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w2_t, MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t, MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w7_t, MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, we_t, MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w5_t, MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, wc_t, MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t, MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, wa_t, MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t, MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w8_t, MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, wf_t, MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w6_t, MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, wd_t, MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w4_t, MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, wb_t, MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t, MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w9_t, MD5C3f, MD5S33); + + const u32x r0 = a; + const u32x r1 = d; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_S + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m04310_m04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = pws[gid].i[14]; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * bin2asc table + */ + + __local u32 l_bin2asc[256]; + + const u32 lid4 = lid * 4; + + const u32 lid40 = lid4 + 0; + const u32 lid41 = lid4 + 1; + const u32 lid42 = lid4 + 2; + const u32 lid43 = lid4 + 3; + + const u32 v400 = (lid40 >> 0) & 15; + const u32 v401 = (lid40 >> 4) & 15; + const u32 v410 = (lid41 >> 0) & 15; + const u32 v411 = (lid41 >> 4) & 15; + const u32 v420 = (lid42 >> 0) & 15; + const u32 v421 = (lid42 >> 4) & 15; + const u32 v430 = (lid43 >> 0) & 15; + const u32 v431 = (lid43 >> 4) & 15; + + l_bin2asc[lid40] = ((v400 < 10) ? '0' + v400 : 'A' - 10 + v400) << 8 + | ((v401 < 10) ? '0' + v401 : 'A' - 10 + v401) << 0; + l_bin2asc[lid41] = ((v410 < 10) ? '0' + v410 : 'A' - 10 + v410) << 8 + | ((v411 < 10) ? '0' + v411 : 'A' - 10 + v411) << 0; + l_bin2asc[lid42] = ((v420 < 10) ? '0' + v420 : 'A' - 10 + v420) << 8 + | ((v421 < 10) ? '0' + v421 : 'A' - 10 + v421) << 0; + l_bin2asc[lid43] = ((v430 < 10) ? '0' + v430 : 'A' - 10 + v430) << 8 + | ((v431 < 10) ? '0' + v431 : 'A' - 10 + v431) << 0; + + barrier (CLK_LOCAL_MEM_FENCE); + + if (gid >= gid_max) return; + + /** + * main + */ + + m04310m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset, l_bin2asc); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m04310_m08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = pws[gid].i[14]; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * bin2asc table + */ + + __local u32 l_bin2asc[256]; + + const u32 lid4 = lid * 4; + + const u32 lid40 = lid4 + 0; + const u32 lid41 = lid4 + 1; + const u32 lid42 = lid4 + 2; + const u32 lid43 = lid4 + 3; + + const u32 v400 = (lid40 >> 0) & 15; + const u32 v401 = (lid40 >> 4) & 15; + const u32 v410 = (lid41 >> 0) & 15; + const u32 v411 = (lid41 >> 4) & 15; + const u32 v420 = (lid42 >> 0) & 15; + const u32 v421 = (lid42 >> 4) & 15; + const u32 v430 = (lid43 >> 0) & 15; + const u32 v431 = (lid43 >> 4) & 15; + + l_bin2asc[lid40] = ((v400 < 10) ? '0' + v400 : 'A' - 10 + v400) << 8 + | ((v401 < 10) ? '0' + v401 : 'A' - 10 + v401) << 0; + l_bin2asc[lid41] = ((v410 < 10) ? '0' + v410 : 'A' - 10 + v410) << 8 + | ((v411 < 10) ? '0' + v411 : 'A' - 10 + v411) << 0; + l_bin2asc[lid42] = ((v420 < 10) ? '0' + v420 : 'A' - 10 + v420) << 8 + | ((v421 < 10) ? '0' + v421 : 'A' - 10 + v421) << 0; + l_bin2asc[lid43] = ((v430 < 10) ? '0' + v430 : 'A' - 10 + v430) << 8 + | ((v431 < 10) ? '0' + v431 : 'A' - 10 + v431) << 0; + + barrier (CLK_LOCAL_MEM_FENCE); + + if (gid >= gid_max) return; + + /** + * main + */ + + m04310m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset, l_bin2asc); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m04310_m16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = pws[gid].i[ 8]; + w2[1] = pws[gid].i[ 9]; + w2[2] = pws[gid].i[10]; + w2[3] = pws[gid].i[11]; + + u32x w3[4]; + + w3[0] = pws[gid].i[12]; + w3[1] = pws[gid].i[13]; + w3[2] = pws[gid].i[14]; + w3[3] = pws[gid].i[15]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * bin2asc table + */ + + __local u32 l_bin2asc[256]; + + const u32 lid4 = lid * 4; + + const u32 lid40 = lid4 + 0; + const u32 lid41 = lid4 + 1; + const u32 lid42 = lid4 + 2; + const u32 lid43 = lid4 + 3; + + const u32 v400 = (lid40 >> 0) & 15; + const u32 v401 = (lid40 >> 4) & 15; + const u32 v410 = (lid41 >> 0) & 15; + const u32 v411 = (lid41 >> 4) & 15; + const u32 v420 = (lid42 >> 0) & 15; + const u32 v421 = (lid42 >> 4) & 15; + const u32 v430 = (lid43 >> 0) & 15; + const u32 v431 = (lid43 >> 4) & 15; + + l_bin2asc[lid40] = ((v400 < 10) ? '0' + v400 : 'A' - 10 + v400) << 8 + | ((v401 < 10) ? '0' + v401 : 'A' - 10 + v401) << 0; + l_bin2asc[lid41] = ((v410 < 10) ? '0' + v410 : 'A' - 10 + v410) << 8 + | ((v411 < 10) ? '0' + v411 : 'A' - 10 + v411) << 0; + l_bin2asc[lid42] = ((v420 < 10) ? '0' + v420 : 'A' - 10 + v420) << 8 + | ((v421 < 10) ? '0' + v421 : 'A' - 10 + v421) << 0; + l_bin2asc[lid43] = ((v430 < 10) ? '0' + v430 : 'A' - 10 + v430) << 8 + | ((v431 < 10) ? '0' + v431 : 'A' - 10 + v431) << 0; + + barrier (CLK_LOCAL_MEM_FENCE); + + if (gid >= gid_max) return; + + /** + * main + */ + + m04310m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset, l_bin2asc); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m04310_s04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = pws[gid].i[14]; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * bin2asc table + */ + + __local u32 l_bin2asc[256]; + + const u32 lid4 = lid * 4; + + const u32 lid40 = lid4 + 0; + const u32 lid41 = lid4 + 1; + const u32 lid42 = lid4 + 2; + const u32 lid43 = lid4 + 3; + + const u32 v400 = (lid40 >> 0) & 15; + const u32 v401 = (lid40 >> 4) & 15; + const u32 v410 = (lid41 >> 0) & 15; + const u32 v411 = (lid41 >> 4) & 15; + const u32 v420 = (lid42 >> 0) & 15; + const u32 v421 = (lid42 >> 4) & 15; + const u32 v430 = (lid43 >> 0) & 15; + const u32 v431 = (lid43 >> 4) & 15; + + l_bin2asc[lid40] = ((v400 < 10) ? '0' + v400 : 'A' - 10 + v400) << 8 + | ((v401 < 10) ? '0' + v401 : 'A' - 10 + v401) << 0; + l_bin2asc[lid41] = ((v410 < 10) ? '0' + v410 : 'A' - 10 + v410) << 8 + | ((v411 < 10) ? '0' + v411 : 'A' - 10 + v411) << 0; + l_bin2asc[lid42] = ((v420 < 10) ? '0' + v420 : 'A' - 10 + v420) << 8 + | ((v421 < 10) ? '0' + v421 : 'A' - 10 + v421) << 0; + l_bin2asc[lid43] = ((v430 < 10) ? '0' + v430 : 'A' - 10 + v430) << 8 + | ((v431 < 10) ? '0' + v431 : 'A' - 10 + v431) << 0; + + barrier (CLK_LOCAL_MEM_FENCE); + + if (gid >= gid_max) return; + + /** + * main + */ + + m04310s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset, l_bin2asc); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m04310_s08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = pws[gid].i[14]; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * bin2asc table + */ + + __local u32 l_bin2asc[256]; + + const u32 lid4 = lid * 4; + + const u32 lid40 = lid4 + 0; + const u32 lid41 = lid4 + 1; + const u32 lid42 = lid4 + 2; + const u32 lid43 = lid4 + 3; + + const u32 v400 = (lid40 >> 0) & 15; + const u32 v401 = (lid40 >> 4) & 15; + const u32 v410 = (lid41 >> 0) & 15; + const u32 v411 = (lid41 >> 4) & 15; + const u32 v420 = (lid42 >> 0) & 15; + const u32 v421 = (lid42 >> 4) & 15; + const u32 v430 = (lid43 >> 0) & 15; + const u32 v431 = (lid43 >> 4) & 15; + + l_bin2asc[lid40] = ((v400 < 10) ? '0' + v400 : 'A' - 10 + v400) << 8 + | ((v401 < 10) ? '0' + v401 : 'A' - 10 + v401) << 0; + l_bin2asc[lid41] = ((v410 < 10) ? '0' + v410 : 'A' - 10 + v410) << 8 + | ((v411 < 10) ? '0' + v411 : 'A' - 10 + v411) << 0; + l_bin2asc[lid42] = ((v420 < 10) ? '0' + v420 : 'A' - 10 + v420) << 8 + | ((v421 < 10) ? '0' + v421 : 'A' - 10 + v421) << 0; + l_bin2asc[lid43] = ((v430 < 10) ? '0' + v430 : 'A' - 10 + v430) << 8 + | ((v431 < 10) ? '0' + v431 : 'A' - 10 + v431) << 0; + + barrier (CLK_LOCAL_MEM_FENCE); + + if (gid >= gid_max) return; + + /** + * main + */ + + m04310s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset, l_bin2asc); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m04310_s16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = pws[gid].i[ 8]; + w2[1] = pws[gid].i[ 9]; + w2[2] = pws[gid].i[10]; + w2[3] = pws[gid].i[11]; + + u32x w3[4]; + + w3[0] = pws[gid].i[12]; + w3[1] = pws[gid].i[13]; + w3[2] = pws[gid].i[14]; + w3[3] = pws[gid].i[15]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * bin2asc table + */ + + __local u32 l_bin2asc[256]; + + const u32 lid4 = lid * 4; + + const u32 lid40 = lid4 + 0; + const u32 lid41 = lid4 + 1; + const u32 lid42 = lid4 + 2; + const u32 lid43 = lid4 + 3; + + const u32 v400 = (lid40 >> 0) & 15; + const u32 v401 = (lid40 >> 4) & 15; + const u32 v410 = (lid41 >> 0) & 15; + const u32 v411 = (lid41 >> 4) & 15; + const u32 v420 = (lid42 >> 0) & 15; + const u32 v421 = (lid42 >> 4) & 15; + const u32 v430 = (lid43 >> 0) & 15; + const u32 v431 = (lid43 >> 4) & 15; + + l_bin2asc[lid40] = ((v400 < 10) ? '0' + v400 : 'A' - 10 + v400) << 8 + | ((v401 < 10) ? '0' + v401 : 'A' - 10 + v401) << 0; + l_bin2asc[lid41] = ((v410 < 10) ? '0' + v410 : 'A' - 10 + v410) << 8 + | ((v411 < 10) ? '0' + v411 : 'A' - 10 + v411) << 0; + l_bin2asc[lid42] = ((v420 < 10) ? '0' + v420 : 'A' - 10 + v420) << 8 + | ((v421 < 10) ? '0' + v421 : 'A' - 10 + v421) << 0; + l_bin2asc[lid43] = ((v430 < 10) ? '0' + v430 : 'A' - 10 + v430) << 8 + | ((v431 < 10) ? '0' + v431 : 'A' - 10 + v431) << 0; + + barrier (CLK_LOCAL_MEM_FENCE); + + if (gid >= gid_max) return; + + /** + * main + */ + + m04310s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset, l_bin2asc); +} diff --git a/amd/m04400_a0.cl b/amd/m04400_a0.cl new file mode 100644 index 0000000000..f8e97590a0 --- /dev/null +++ b/amd/m04400_a0.cl @@ -0,0 +1,779 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _MD5_SHA1_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW4 +#define VECT_SIZE4 +#endif + +#ifdef VLIW5 +#define VECT_SIZE4 +#endif + +#define DGST_R0 0 +#define DGST_R1 3 +#define DGST_R2 2 +#define DGST_R3 1 + +#include "include/kernel_functions.c" +#include "types_amd.c" +#include "common_amd.c" +#include "include/rp_gpu.h" +#include "rp_amd.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +#ifdef VECT_SIZE1 +#define uint_to_hex_lower8(i) l_bin2asc[(i)] +#endif + +#ifdef VECT_SIZE2 +#define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1]) +#endif + +#ifdef VECT_SIZE4 +#define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3]) +#endif + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m04400_m04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + u32x pw_buf1[4]; + + pw_buf1[0] = pws[gid].i[ 4]; + pw_buf1[1] = pws[gid].i[ 5]; + pw_buf1[2] = pws[gid].i[ 6]; + pw_buf1[3] = pws[gid].i[ 7]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * bin2asc table + */ + + __local u32 l_bin2asc[256]; + + const u32 lid4 = lid * 4; + + const u32 lid40 = lid4 + 0; + const u32 lid41 = lid4 + 1; + const u32 lid42 = lid4 + 2; + const u32 lid43 = lid4 + 3; + + const u32 v400 = (lid40 >> 0) & 15; + const u32 v401 = (lid40 >> 4) & 15; + const u32 v410 = (lid41 >> 0) & 15; + const u32 v411 = (lid41 >> 4) & 15; + const u32 v420 = (lid42 >> 0) & 15; + const u32 v421 = (lid42 >> 4) & 15; + const u32 v430 = (lid43 >> 0) & 15; + const u32 v431 = (lid43 >> 4) & 15; + + l_bin2asc[lid40] = ((v400 < 10) ? '0' + v400 : 'a' - 10 + v400) << 8 + | ((v401 < 10) ? '0' + v401 : 'a' - 10 + v401) << 0; + l_bin2asc[lid41] = ((v410 < 10) ? '0' + v410 : 'a' - 10 + v410) << 8 + | ((v411 < 10) ? '0' + v411 : 'a' - 10 + v411) << 0; + l_bin2asc[lid42] = ((v420 < 10) ? '0' + v420 : 'a' - 10 + v420) << 8 + | ((v421 < 10) ? '0' + v421 : 'a' - 10 + v421) << 0; + l_bin2asc[lid43] = ((v430 < 10) ? '0' + v430 : 'a' - 10 + v430) << 8 + | ((v431 < 10) ? '0' + v431 : 'a' - 10 + v431) << 0; + + barrier (CLK_LOCAL_MEM_FENCE); + + if (gid >= gid_max) return; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + + w0[0] = pw_buf0[0]; + w0[1] = pw_buf0[1]; + w0[2] = pw_buf0[2]; + w0[3] = pw_buf0[3]; + + u32x w1[4]; + + w1[0] = pw_buf1[0]; + w1[1] = pw_buf1[1]; + w1[2] = pw_buf1[2]; + w1[3] = pw_buf1[3]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 out_len = apply_rules (rules_buf[il_pos].cmds, w0, w1, pw_len); + + append_0x80_2 (w0, w1, out_len); + + /** + * sha1 + */ + + u32x w0_t = swap_workaround (w0[0]); + u32x w1_t = swap_workaround (w0[1]); + u32x w2_t = swap_workaround (w0[2]); + u32x w3_t = swap_workaround (w0[3]); + u32x w4_t = swap_workaround (w1[0]); + u32x w5_t = swap_workaround (w1[1]); + u32x w6_t = swap_workaround (w1[2]); + u32x w7_t = swap_workaround (w1[3]); + u32x w8_t = swap_workaround (w2[0]); + u32x w9_t = swap_workaround (w2[1]); + u32x wa_t = swap_workaround (w2[2]); + u32x wb_t = swap_workaround (w2[3]); + u32x wc_t = swap_workaround (w3[0]); + u32x wd_t = swap_workaround (w3[1]); + u32x we_t = 0; + u32x wf_t = out_len * 8; + + u32x a = SHA1M_A; + u32x b = SHA1M_B; + u32x c = SHA1M_C; + u32x d = SHA1M_D; + u32x e = SHA1M_E; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w0_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w1_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w2_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w3_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w4_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w5_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w6_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w7_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w8_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w9_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wa_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, wb_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, wc_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, wd_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, we_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F0o, e, a, b, c, d, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F0o, d, e, a, b, c, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F0o, c, d, e, a, b, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F0o, b, c, d, e, a, w3_t); + + #undef K + #define K SHA1C01 + + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w7_t); + + #undef K + #define K SHA1C02 + + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wb_t); + + #undef K + #define K SHA1C03 + + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wf_t); + + a += SHA1M_A; + b += SHA1M_B; + c += SHA1M_C; + d += SHA1M_D; + e += SHA1M_E; + + /** + * md5 + */ + + w0_t = uint_to_hex_lower8 ((a >> 24) & 255) << 0 + | uint_to_hex_lower8 ((a >> 16) & 255) << 16; + w1_t = uint_to_hex_lower8 ((a >> 8) & 255) << 0 + | uint_to_hex_lower8 ((a >> 0) & 255) << 16; + w2_t = uint_to_hex_lower8 ((b >> 24) & 255) << 0 + | uint_to_hex_lower8 ((b >> 16) & 255) << 16; + w3_t = uint_to_hex_lower8 ((b >> 8) & 255) << 0 + | uint_to_hex_lower8 ((b >> 0) & 255) << 16; + w4_t = uint_to_hex_lower8 ((c >> 24) & 255) << 0 + | uint_to_hex_lower8 ((c >> 16) & 255) << 16; + w5_t = uint_to_hex_lower8 ((c >> 8) & 255) << 0 + | uint_to_hex_lower8 ((c >> 0) & 255) << 16; + w6_t = uint_to_hex_lower8 ((d >> 24) & 255) << 0 + | uint_to_hex_lower8 ((d >> 16) & 255) << 16; + w7_t = uint_to_hex_lower8 ((d >> 8) & 255) << 0 + | uint_to_hex_lower8 ((d >> 0) & 255) << 16; + w8_t = uint_to_hex_lower8 ((e >> 24) & 255) << 0 + | uint_to_hex_lower8 ((e >> 16) & 255) << 16; + w9_t = uint_to_hex_lower8 ((e >> 8) & 255) << 0 + | uint_to_hex_lower8 ((e >> 0) & 255) << 16; + + wa_t = 0x80; + wb_t = 0; + wc_t = 0; + wd_t = 0; + we_t = 40 * 8; + wf_t = 0; + + a = MD5M_A; + b = MD5M_B; + c = MD5M_C; + d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t, MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t, MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t, MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t, MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w4_t, MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w5_t, MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w6_t, MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w7_t, MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w8_t, MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w9_t, MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, wa_t, MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, wb_t, MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, wc_t, MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, wd_t, MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, we_t, MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, wf_t, MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w1_t, MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w6_t, MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, wb_t, MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t, MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w5_t, MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, wa_t, MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, wf_t, MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w4_t, MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w9_t, MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, we_t, MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t, MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w8_t, MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, wd_t, MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t, MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w7_t, MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, wc_t, MD5C1f, MD5S13); + + MD5_STEP (MD5_H , a, b, c, d, w5_t, MD5C20, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w8_t, MD5C21, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, wb_t, MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, we_t, MD5C23, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w1_t, MD5C24, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w4_t, MD5C25, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w7_t, MD5C26, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, wa_t, MD5C27, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, wd_t, MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w0_t, MD5C29, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w3_t, MD5C2a, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w6_t, MD5C2b, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w9_t, MD5C2c, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, wc_t, MD5C2d, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, wf_t, MD5C2e, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w2_t, MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t, MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w7_t, MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, we_t, MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w5_t, MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, wc_t, MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t, MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, wa_t, MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t, MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w8_t, MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, wf_t, MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w6_t, MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, wd_t, MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w4_t, MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, wb_t, MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t, MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w9_t, MD5C3f, MD5S33); + + const u32x r0 = a; + const u32x r1 = d; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_M + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m04400_m08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m04400_m16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m04400_s04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + u32x pw_buf1[4]; + + pw_buf1[0] = pws[gid].i[ 4]; + pw_buf1[1] = pws[gid].i[ 5]; + pw_buf1[2] = pws[gid].i[ 6]; + pw_buf1[3] = pws[gid].i[ 7]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * bin2asc table + */ + + __local u32 l_bin2asc[256]; + + const u32 lid4 = lid * 4; + + const u32 lid40 = lid4 + 0; + const u32 lid41 = lid4 + 1; + const u32 lid42 = lid4 + 2; + const u32 lid43 = lid4 + 3; + + const u32 v400 = (lid40 >> 0) & 15; + const u32 v401 = (lid40 >> 4) & 15; + const u32 v410 = (lid41 >> 0) & 15; + const u32 v411 = (lid41 >> 4) & 15; + const u32 v420 = (lid42 >> 0) & 15; + const u32 v421 = (lid42 >> 4) & 15; + const u32 v430 = (lid43 >> 0) & 15; + const u32 v431 = (lid43 >> 4) & 15; + + l_bin2asc[lid40] = ((v400 < 10) ? '0' + v400 : 'a' - 10 + v400) << 8 + | ((v401 < 10) ? '0' + v401 : 'a' - 10 + v401) << 0; + l_bin2asc[lid41] = ((v410 < 10) ? '0' + v410 : 'a' - 10 + v410) << 8 + | ((v411 < 10) ? '0' + v411 : 'a' - 10 + v411) << 0; + l_bin2asc[lid42] = ((v420 < 10) ? '0' + v420 : 'a' - 10 + v420) << 8 + | ((v421 < 10) ? '0' + v421 : 'a' - 10 + v421) << 0; + l_bin2asc[lid43] = ((v430 < 10) ? '0' + v430 : 'a' - 10 + v430) << 8 + | ((v431 < 10) ? '0' + v431 : 'a' - 10 + v431) << 0; + + barrier (CLK_LOCAL_MEM_FENCE); + + if (gid >= gid_max) return; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + + w0[0] = pw_buf0[0]; + w0[1] = pw_buf0[1]; + w0[2] = pw_buf0[2]; + w0[3] = pw_buf0[3]; + + u32x w1[4]; + + w1[0] = pw_buf1[0]; + w1[1] = pw_buf1[1]; + w1[2] = pw_buf1[2]; + w1[3] = pw_buf1[3]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 out_len = apply_rules (rules_buf[il_pos].cmds, w0, w1, pw_len); + + append_0x80_2 (w0, w1, out_len); + + /** + * sha1 + */ + + u32x w0_t = swap_workaround (w0[0]); + u32x w1_t = swap_workaround (w0[1]); + u32x w2_t = swap_workaround (w0[2]); + u32x w3_t = swap_workaround (w0[3]); + u32x w4_t = swap_workaround (w1[0]); + u32x w5_t = swap_workaround (w1[1]); + u32x w6_t = swap_workaround (w1[2]); + u32x w7_t = swap_workaround (w1[3]); + u32x w8_t = swap_workaround (w2[0]); + u32x w9_t = swap_workaround (w2[1]); + u32x wa_t = swap_workaround (w2[2]); + u32x wb_t = swap_workaround (w2[3]); + u32x wc_t = swap_workaround (w3[0]); + u32x wd_t = swap_workaround (w3[1]); + u32x we_t = 0; + u32x wf_t = out_len * 8; + + u32x a = SHA1M_A; + u32x b = SHA1M_B; + u32x c = SHA1M_C; + u32x d = SHA1M_D; + u32x e = SHA1M_E; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w0_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w1_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w2_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w3_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w4_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w5_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w6_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w7_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w8_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w9_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wa_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, wb_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, wc_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, wd_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, we_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F0o, e, a, b, c, d, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F0o, d, e, a, b, c, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F0o, c, d, e, a, b, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F0o, b, c, d, e, a, w3_t); + + #undef K + #define K SHA1C01 + + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w7_t); + + #undef K + #define K SHA1C02 + + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wb_t); + + #undef K + #define K SHA1C03 + + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wf_t); + + a += SHA1M_A; + b += SHA1M_B; + c += SHA1M_C; + d += SHA1M_D; + e += SHA1M_E; + + /** + * md5 + */ + + w0_t = uint_to_hex_lower8 ((a >> 24) & 255) << 0 + | uint_to_hex_lower8 ((a >> 16) & 255) << 16; + w1_t = uint_to_hex_lower8 ((a >> 8) & 255) << 0 + | uint_to_hex_lower8 ((a >> 0) & 255) << 16; + w2_t = uint_to_hex_lower8 ((b >> 24) & 255) << 0 + | uint_to_hex_lower8 ((b >> 16) & 255) << 16; + w3_t = uint_to_hex_lower8 ((b >> 8) & 255) << 0 + | uint_to_hex_lower8 ((b >> 0) & 255) << 16; + w4_t = uint_to_hex_lower8 ((c >> 24) & 255) << 0 + | uint_to_hex_lower8 ((c >> 16) & 255) << 16; + w5_t = uint_to_hex_lower8 ((c >> 8) & 255) << 0 + | uint_to_hex_lower8 ((c >> 0) & 255) << 16; + w6_t = uint_to_hex_lower8 ((d >> 24) & 255) << 0 + | uint_to_hex_lower8 ((d >> 16) & 255) << 16; + w7_t = uint_to_hex_lower8 ((d >> 8) & 255) << 0 + | uint_to_hex_lower8 ((d >> 0) & 255) << 16; + w8_t = uint_to_hex_lower8 ((e >> 24) & 255) << 0 + | uint_to_hex_lower8 ((e >> 16) & 255) << 16; + w9_t = uint_to_hex_lower8 ((e >> 8) & 255) << 0 + | uint_to_hex_lower8 ((e >> 0) & 255) << 16; + + wa_t = 0x80; + wb_t = 0; + wc_t = 0; + wd_t = 0; + we_t = 40 * 8; + wf_t = 0; + + a = MD5M_A; + b = MD5M_B; + c = MD5M_C; + d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t, MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t, MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t, MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t, MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w4_t, MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w5_t, MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w6_t, MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w7_t, MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w8_t, MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w9_t, MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, wa_t, MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, wb_t, MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, wc_t, MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, wd_t, MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, we_t, MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, wf_t, MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w1_t, MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w6_t, MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, wb_t, MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t, MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w5_t, MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, wa_t, MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, wf_t, MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w4_t, MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w9_t, MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, we_t, MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t, MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w8_t, MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, wd_t, MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t, MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w7_t, MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, wc_t, MD5C1f, MD5S13); + + MD5_STEP (MD5_H , a, b, c, d, w5_t, MD5C20, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w8_t, MD5C21, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, wb_t, MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, we_t, MD5C23, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w1_t, MD5C24, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w4_t, MD5C25, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w7_t, MD5C26, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, wa_t, MD5C27, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, wd_t, MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w0_t, MD5C29, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w3_t, MD5C2a, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w6_t, MD5C2b, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w9_t, MD5C2c, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, wc_t, MD5C2d, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, wf_t, MD5C2e, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w2_t, MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t, MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w7_t, MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, we_t, MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w5_t, MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, wc_t, MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t, MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, wa_t, MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t, MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w8_t, MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, wf_t, MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w6_t, MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, wd_t, MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w4_t, MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, wb_t, MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t, MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w9_t, MD5C3f, MD5S33); + + const u32x r0 = a; + const u32x r1 = d; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_S + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m04400_s08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m04400_s16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/amd/m04400_a1.cl b/amd/m04400_a1.cl new file mode 100644 index 0000000000..df4409508b --- /dev/null +++ b/amd/m04400_a1.cl @@ -0,0 +1,889 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _MD5_SHA1_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW4 +#define VECT_SIZE4 +#endif + +#ifdef VLIW5 +#define VECT_SIZE4 +#endif + +#define DGST_R0 0 +#define DGST_R1 3 +#define DGST_R2 2 +#define DGST_R3 1 + +#include "include/kernel_functions.c" +#include "types_amd.c" +#include "common_amd.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +#ifdef VECT_SIZE1 +#define uint_to_hex_lower8(i) l_bin2asc[(i)] +#endif + +#ifdef VECT_SIZE2 +#define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1]) +#endif + +#ifdef VECT_SIZE4 +#define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3]) +#endif + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m04400_m04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + append_0x80_2 (wordl0, wordl1, pw_l_len); + + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, combs_buf[0].pw_len); + } + + /** + * bin2asc table + */ + + __local u32 l_bin2asc[256]; + + const u32 lid4 = lid * 4; + + const u32 lid40 = lid4 + 0; + const u32 lid41 = lid4 + 1; + const u32 lid42 = lid4 + 2; + const u32 lid43 = lid4 + 3; + + const u32 v400 = (lid40 >> 0) & 15; + const u32 v401 = (lid40 >> 4) & 15; + const u32 v410 = (lid41 >> 0) & 15; + const u32 v411 = (lid41 >> 4) & 15; + const u32 v420 = (lid42 >> 0) & 15; + const u32 v421 = (lid42 >> 4) & 15; + const u32 v430 = (lid43 >> 0) & 15; + const u32 v431 = (lid43 >> 4) & 15; + + l_bin2asc[lid40] = ((v400 < 10) ? '0' + v400 : 'a' - 10 + v400) << 8 + | ((v401 < 10) ? '0' + v401 : 'a' - 10 + v401) << 0; + l_bin2asc[lid41] = ((v410 < 10) ? '0' + v410 : 'a' - 10 + v410) << 8 + | ((v411 < 10) ? '0' + v411 : 'a' - 10 + v411) << 0; + l_bin2asc[lid42] = ((v420 < 10) ? '0' + v420 : 'a' - 10 + v420) << 8 + | ((v421 < 10) ? '0' + v421 : 'a' - 10 + v421) << 0; + l_bin2asc[lid43] = ((v430 < 10) ? '0' + v430 : 'a' - 10 + v430) << 8 + | ((v431 < 10) ? '0' + v431 : 'a' - 10 + v431) << 0; + + barrier (CLK_LOCAL_MEM_FENCE); + + if (gid >= gid_max) return; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = combs_buf[il_pos].pw_len; + + const u32 pw_len = pw_l_len + pw_r_len; + + u32 wordr0[4]; + + wordr0[0] = combs_buf[il_pos].i[0]; + wordr0[1] = combs_buf[il_pos].i[1]; + wordr0[2] = combs_buf[il_pos].i[2]; + wordr0[3] = combs_buf[il_pos].i[3]; + + u32 wordr1[4]; + + wordr1[0] = combs_buf[il_pos].i[4]; + wordr1[1] = combs_buf[il_pos].i[5]; + wordr1[2] = combs_buf[il_pos].i[6]; + wordr1[3] = combs_buf[il_pos].i[7]; + + u32 wordr2[4]; + + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + + u32 wordr3[4]; + + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + append_0x80_2 (wordr0, wordr1, pw_r_len); + + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + u32x w0[4]; + + w0[0] = wordl0[0] | wordr0[0]; + w0[1] = wordl0[1] | wordr0[1]; + w0[2] = wordl0[2] | wordr0[2]; + w0[3] = wordl0[3] | wordr0[3]; + + u32x w1[4]; + + w1[0] = wordl1[0] | wordr1[0]; + w1[1] = wordl1[1] | wordr1[1]; + w1[2] = wordl1[2] | wordr1[2]; + w1[3] = wordl1[3] | wordr1[3]; + + u32x w2[4]; + + w2[0] = wordl2[0] | wordr2[0]; + w2[1] = wordl2[1] | wordr2[1]; + w2[2] = wordl2[2] | wordr2[2]; + w2[3] = wordl2[3] | wordr2[3]; + + u32x w3[4]; + + w3[0] = wordl3[0] | wordr3[0]; + w3[1] = wordl3[1] | wordr3[1]; + w3[2] = 0; + w3[3] = 0; + + /** + * sha1 + */ + + u32x w0_t = swap_workaround (w0[0]); + u32x w1_t = swap_workaround (w0[1]); + u32x w2_t = swap_workaround (w0[2]); + u32x w3_t = swap_workaround (w0[3]); + u32x w4_t = swap_workaround (w1[0]); + u32x w5_t = swap_workaround (w1[1]); + u32x w6_t = swap_workaround (w1[2]); + u32x w7_t = swap_workaround (w1[3]); + u32x w8_t = swap_workaround (w2[0]); + u32x w9_t = swap_workaround (w2[1]); + u32x wa_t = swap_workaround (w2[2]); + u32x wb_t = swap_workaround (w2[3]); + u32x wc_t = swap_workaround (w3[0]); + u32x wd_t = swap_workaround (w3[1]); + u32x we_t = 0; + u32x wf_t = pw_len * 8; + + u32x a = SHA1M_A; + u32x b = SHA1M_B; + u32x c = SHA1M_C; + u32x d = SHA1M_D; + u32x e = SHA1M_E; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w0_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w1_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w2_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w3_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w4_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w5_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w6_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w7_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w8_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w9_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wa_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, wb_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, wc_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, wd_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, we_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F0o, e, a, b, c, d, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F0o, d, e, a, b, c, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F0o, c, d, e, a, b, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F0o, b, c, d, e, a, w3_t); + + #undef K + #define K SHA1C01 + + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w7_t); + + #undef K + #define K SHA1C02 + + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wb_t); + + #undef K + #define K SHA1C03 + + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wf_t); + + a += SHA1M_A; + b += SHA1M_B; + c += SHA1M_C; + d += SHA1M_D; + e += SHA1M_E; + + /** + * md5 + */ + + w0_t = uint_to_hex_lower8 ((a >> 24) & 255) << 0 + | uint_to_hex_lower8 ((a >> 16) & 255) << 16; + w1_t = uint_to_hex_lower8 ((a >> 8) & 255) << 0 + | uint_to_hex_lower8 ((a >> 0) & 255) << 16; + w2_t = uint_to_hex_lower8 ((b >> 24) & 255) << 0 + | uint_to_hex_lower8 ((b >> 16) & 255) << 16; + w3_t = uint_to_hex_lower8 ((b >> 8) & 255) << 0 + | uint_to_hex_lower8 ((b >> 0) & 255) << 16; + w4_t = uint_to_hex_lower8 ((c >> 24) & 255) << 0 + | uint_to_hex_lower8 ((c >> 16) & 255) << 16; + w5_t = uint_to_hex_lower8 ((c >> 8) & 255) << 0 + | uint_to_hex_lower8 ((c >> 0) & 255) << 16; + w6_t = uint_to_hex_lower8 ((d >> 24) & 255) << 0 + | uint_to_hex_lower8 ((d >> 16) & 255) << 16; + w7_t = uint_to_hex_lower8 ((d >> 8) & 255) << 0 + | uint_to_hex_lower8 ((d >> 0) & 255) << 16; + w8_t = uint_to_hex_lower8 ((e >> 24) & 255) << 0 + | uint_to_hex_lower8 ((e >> 16) & 255) << 16; + w9_t = uint_to_hex_lower8 ((e >> 8) & 255) << 0 + | uint_to_hex_lower8 ((e >> 0) & 255) << 16; + + wa_t = 0x80; + wb_t = 0; + wc_t = 0; + wd_t = 0; + we_t = 40 * 8; + wf_t = 0; + + a = MD5M_A; + b = MD5M_B; + c = MD5M_C; + d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t, MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t, MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t, MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t, MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w4_t, MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w5_t, MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w6_t, MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w7_t, MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w8_t, MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w9_t, MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, wa_t, MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, wb_t, MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, wc_t, MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, wd_t, MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, we_t, MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, wf_t, MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w1_t, MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w6_t, MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, wb_t, MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t, MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w5_t, MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, wa_t, MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, wf_t, MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w4_t, MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w9_t, MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, we_t, MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t, MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w8_t, MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, wd_t, MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t, MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w7_t, MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, wc_t, MD5C1f, MD5S13); + + MD5_STEP (MD5_H , a, b, c, d, w5_t, MD5C20, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w8_t, MD5C21, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, wb_t, MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, we_t, MD5C23, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w1_t, MD5C24, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w4_t, MD5C25, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w7_t, MD5C26, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, wa_t, MD5C27, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, wd_t, MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w0_t, MD5C29, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w3_t, MD5C2a, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w6_t, MD5C2b, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w9_t, MD5C2c, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, wc_t, MD5C2d, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, wf_t, MD5C2e, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w2_t, MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t, MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w7_t, MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, we_t, MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w5_t, MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, wc_t, MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t, MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, wa_t, MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t, MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w8_t, MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, wf_t, MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w6_t, MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, wd_t, MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w4_t, MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, wb_t, MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t, MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w9_t, MD5C3f, MD5S33); + + const u32x r0 = a; + const u32x r1 = d; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_M + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m04400_m08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m04400_m16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m04400_s04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + append_0x80_2 (wordl0, wordl1, pw_l_len); + + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, combs_buf[0].pw_len); + } + + /** + * bin2asc table + */ + + __local u32 l_bin2asc[256]; + + const u32 lid4 = lid * 4; + + const u32 lid40 = lid4 + 0; + const u32 lid41 = lid4 + 1; + const u32 lid42 = lid4 + 2; + const u32 lid43 = lid4 + 3; + + const u32 v400 = (lid40 >> 0) & 15; + const u32 v401 = (lid40 >> 4) & 15; + const u32 v410 = (lid41 >> 0) & 15; + const u32 v411 = (lid41 >> 4) & 15; + const u32 v420 = (lid42 >> 0) & 15; + const u32 v421 = (lid42 >> 4) & 15; + const u32 v430 = (lid43 >> 0) & 15; + const u32 v431 = (lid43 >> 4) & 15; + + l_bin2asc[lid40] = ((v400 < 10) ? '0' + v400 : 'a' - 10 + v400) << 8 + | ((v401 < 10) ? '0' + v401 : 'a' - 10 + v401) << 0; + l_bin2asc[lid41] = ((v410 < 10) ? '0' + v410 : 'a' - 10 + v410) << 8 + | ((v411 < 10) ? '0' + v411 : 'a' - 10 + v411) << 0; + l_bin2asc[lid42] = ((v420 < 10) ? '0' + v420 : 'a' - 10 + v420) << 8 + | ((v421 < 10) ? '0' + v421 : 'a' - 10 + v421) << 0; + l_bin2asc[lid43] = ((v430 < 10) ? '0' + v430 : 'a' - 10 + v430) << 8 + | ((v431 < 10) ? '0' + v431 : 'a' - 10 + v431) << 0; + + barrier (CLK_LOCAL_MEM_FENCE); + + if (gid >= gid_max) return; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = combs_buf[il_pos].pw_len; + + const u32 pw_len = pw_l_len + pw_r_len; + + u32 wordr0[4]; + + wordr0[0] = combs_buf[il_pos].i[0]; + wordr0[1] = combs_buf[il_pos].i[1]; + wordr0[2] = combs_buf[il_pos].i[2]; + wordr0[3] = combs_buf[il_pos].i[3]; + + u32 wordr1[4]; + + wordr1[0] = combs_buf[il_pos].i[4]; + wordr1[1] = combs_buf[il_pos].i[5]; + wordr1[2] = combs_buf[il_pos].i[6]; + wordr1[3] = combs_buf[il_pos].i[7]; + + u32 wordr2[4]; + + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + + u32 wordr3[4]; + + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + append_0x80_2 (wordr0, wordr1, pw_r_len); + + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + u32x w0[4]; + + w0[0] = wordl0[0] | wordr0[0]; + w0[1] = wordl0[1] | wordr0[1]; + w0[2] = wordl0[2] | wordr0[2]; + w0[3] = wordl0[3] | wordr0[3]; + + u32x w1[4]; + + w1[0] = wordl1[0] | wordr1[0]; + w1[1] = wordl1[1] | wordr1[1]; + w1[2] = wordl1[2] | wordr1[2]; + w1[3] = wordl1[3] | wordr1[3]; + + u32x w2[4]; + + w2[0] = wordl2[0] | wordr2[0]; + w2[1] = wordl2[1] | wordr2[1]; + w2[2] = wordl2[2] | wordr2[2]; + w2[3] = wordl2[3] | wordr2[3]; + + u32x w3[4]; + + w3[0] = wordl3[0] | wordr3[0]; + w3[1] = wordl3[1] | wordr3[1]; + w3[2] = 0; + w3[3] = 0; + + /** + * sha1 + */ + + u32x w0_t = swap_workaround (w0[0]); + u32x w1_t = swap_workaround (w0[1]); + u32x w2_t = swap_workaround (w0[2]); + u32x w3_t = swap_workaround (w0[3]); + u32x w4_t = swap_workaround (w1[0]); + u32x w5_t = swap_workaround (w1[1]); + u32x w6_t = swap_workaround (w1[2]); + u32x w7_t = swap_workaround (w1[3]); + u32x w8_t = swap_workaround (w2[0]); + u32x w9_t = swap_workaround (w2[1]); + u32x wa_t = swap_workaround (w2[2]); + u32x wb_t = swap_workaround (w2[3]); + u32x wc_t = swap_workaround (w3[0]); + u32x wd_t = swap_workaround (w3[1]); + u32x we_t = 0; + u32x wf_t = pw_len * 8; + + u32x a = SHA1M_A; + u32x b = SHA1M_B; + u32x c = SHA1M_C; + u32x d = SHA1M_D; + u32x e = SHA1M_E; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w0_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w1_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w2_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w3_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w4_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w5_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w6_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w7_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w8_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w9_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wa_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, wb_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, wc_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, wd_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, we_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F0o, e, a, b, c, d, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F0o, d, e, a, b, c, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F0o, c, d, e, a, b, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F0o, b, c, d, e, a, w3_t); + + #undef K + #define K SHA1C01 + + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w7_t); + + #undef K + #define K SHA1C02 + + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wb_t); + + #undef K + #define K SHA1C03 + + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wf_t); + + a += SHA1M_A; + b += SHA1M_B; + c += SHA1M_C; + d += SHA1M_D; + e += SHA1M_E; + + /** + * md5 + */ + + w0_t = uint_to_hex_lower8 ((a >> 24) & 255) << 0 + | uint_to_hex_lower8 ((a >> 16) & 255) << 16; + w1_t = uint_to_hex_lower8 ((a >> 8) & 255) << 0 + | uint_to_hex_lower8 ((a >> 0) & 255) << 16; + w2_t = uint_to_hex_lower8 ((b >> 24) & 255) << 0 + | uint_to_hex_lower8 ((b >> 16) & 255) << 16; + w3_t = uint_to_hex_lower8 ((b >> 8) & 255) << 0 + | uint_to_hex_lower8 ((b >> 0) & 255) << 16; + w4_t = uint_to_hex_lower8 ((c >> 24) & 255) << 0 + | uint_to_hex_lower8 ((c >> 16) & 255) << 16; + w5_t = uint_to_hex_lower8 ((c >> 8) & 255) << 0 + | uint_to_hex_lower8 ((c >> 0) & 255) << 16; + w6_t = uint_to_hex_lower8 ((d >> 24) & 255) << 0 + | uint_to_hex_lower8 ((d >> 16) & 255) << 16; + w7_t = uint_to_hex_lower8 ((d >> 8) & 255) << 0 + | uint_to_hex_lower8 ((d >> 0) & 255) << 16; + w8_t = uint_to_hex_lower8 ((e >> 24) & 255) << 0 + | uint_to_hex_lower8 ((e >> 16) & 255) << 16; + w9_t = uint_to_hex_lower8 ((e >> 8) & 255) << 0 + | uint_to_hex_lower8 ((e >> 0) & 255) << 16; + + wa_t = 0x80; + wb_t = 0; + wc_t = 0; + wd_t = 0; + we_t = 40 * 8; + wf_t = 0; + + a = MD5M_A; + b = MD5M_B; + c = MD5M_C; + d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t, MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t, MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t, MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t, MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w4_t, MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w5_t, MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w6_t, MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w7_t, MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w8_t, MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w9_t, MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, wa_t, MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, wb_t, MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, wc_t, MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, wd_t, MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, we_t, MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, wf_t, MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w1_t, MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w6_t, MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, wb_t, MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t, MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w5_t, MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, wa_t, MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, wf_t, MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w4_t, MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w9_t, MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, we_t, MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t, MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w8_t, MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, wd_t, MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t, MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w7_t, MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, wc_t, MD5C1f, MD5S13); + + MD5_STEP (MD5_H , a, b, c, d, w5_t, MD5C20, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w8_t, MD5C21, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, wb_t, MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, we_t, MD5C23, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w1_t, MD5C24, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w4_t, MD5C25, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w7_t, MD5C26, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, wa_t, MD5C27, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, wd_t, MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w0_t, MD5C29, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w3_t, MD5C2a, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w6_t, MD5C2b, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w9_t, MD5C2c, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, wc_t, MD5C2d, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, wf_t, MD5C2e, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w2_t, MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t, MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w7_t, MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, we_t, MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w5_t, MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, wc_t, MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t, MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, wa_t, MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t, MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w8_t, MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, wf_t, MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w6_t, MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, wd_t, MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w4_t, MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, wb_t, MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t, MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w9_t, MD5C3f, MD5S33); + + const u32x r0 = a; + const u32x r1 = d; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_S + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m04400_s08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m04400_s16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/amd/m04400_a3.cl b/amd/m04400_a3.cl new file mode 100644 index 0000000000..b14bac300c --- /dev/null +++ b/amd/m04400_a3.cl @@ -0,0 +1,1118 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _MD5_SHA1_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW4 +#define VECT_SIZE4 +#endif + +#ifdef VLIW5 +#define VECT_SIZE4 +#endif + +#define DGST_R0 0 +#define DGST_R1 3 +#define DGST_R2 2 +#define DGST_R3 1 + +#include "include/kernel_functions.c" +#include "types_amd.c" +#include "common_amd.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +#ifdef VECT_SIZE1 +#define uint_to_hex_lower8(i) l_bin2asc[(i)] +#endif + +#ifdef VECT_SIZE2 +#define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1]) +#endif + +#ifdef VECT_SIZE4 +#define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3]) +#endif + +static void m04400m (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], const u32 pw_len, __global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, __local u32 l_bin2asc[256]) +{ + /** + * modifier + */ + + const u32 gid = get_global_id (0); + const u32 lid = get_local_id (0); + + /** + * digest + */ + + /** + * loop + */ + + u32x w0l = w0[0]; + + for (u32 il_pos = 0; il_pos < bfs_cnt; il_pos++) + { + const u32 w0r = bfs_buf[il_pos].i; + + w0[0] = w0l | w0r; + + /** + * sha1 + */ + + u32x w0_t = w0[0]; + u32x w1_t = w0[1]; + u32x w2_t = w0[2]; + u32x w3_t = w0[3]; + u32x w4_t = w1[0]; + u32x w5_t = w1[1]; + u32x w6_t = w1[2]; + u32x w7_t = w1[3]; + u32x w8_t = w2[0]; + u32x w9_t = w2[1]; + u32x wa_t = w2[2]; + u32x wb_t = w2[3]; + u32x wc_t = w3[0]; + u32x wd_t = w3[1]; + u32x we_t = 0; + u32x wf_t = pw_len * 8; + + u32x a = SHA1M_A; + u32x b = SHA1M_B; + u32x c = SHA1M_C; + u32x d = SHA1M_D; + u32x e = SHA1M_E; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w0_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w1_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w2_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w3_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w4_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w5_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w6_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w7_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w8_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w9_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wa_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, wb_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, wc_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, wd_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, we_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F0o, e, a, b, c, d, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F0o, d, e, a, b, c, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F0o, c, d, e, a, b, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F0o, b, c, d, e, a, w3_t); + + #undef K + #define K SHA1C01 + + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w7_t); + + #undef K + #define K SHA1C02 + + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wb_t); + + #undef K + #define K SHA1C03 + + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wf_t); + + a += SHA1M_A; + b += SHA1M_B; + c += SHA1M_C; + d += SHA1M_D; + e += SHA1M_E; + + /** + * md5 + */ + + w0_t = uint_to_hex_lower8 ((a >> 24) & 255) << 0 + | uint_to_hex_lower8 ((a >> 16) & 255) << 16; + w1_t = uint_to_hex_lower8 ((a >> 8) & 255) << 0 + | uint_to_hex_lower8 ((a >> 0) & 255) << 16; + w2_t = uint_to_hex_lower8 ((b >> 24) & 255) << 0 + | uint_to_hex_lower8 ((b >> 16) & 255) << 16; + w3_t = uint_to_hex_lower8 ((b >> 8) & 255) << 0 + | uint_to_hex_lower8 ((b >> 0) & 255) << 16; + w4_t = uint_to_hex_lower8 ((c >> 24) & 255) << 0 + | uint_to_hex_lower8 ((c >> 16) & 255) << 16; + w5_t = uint_to_hex_lower8 ((c >> 8) & 255) << 0 + | uint_to_hex_lower8 ((c >> 0) & 255) << 16; + w6_t = uint_to_hex_lower8 ((d >> 24) & 255) << 0 + | uint_to_hex_lower8 ((d >> 16) & 255) << 16; + w7_t = uint_to_hex_lower8 ((d >> 8) & 255) << 0 + | uint_to_hex_lower8 ((d >> 0) & 255) << 16; + w8_t = uint_to_hex_lower8 ((e >> 24) & 255) << 0 + | uint_to_hex_lower8 ((e >> 16) & 255) << 16; + w9_t = uint_to_hex_lower8 ((e >> 8) & 255) << 0 + | uint_to_hex_lower8 ((e >> 0) & 255) << 16; + + wa_t = 0x80; + wb_t = 0; + wc_t = 0; + wd_t = 0; + we_t = 40 * 8; + wf_t = 0; + + a = MD5M_A; + b = MD5M_B; + c = MD5M_C; + d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t, MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t, MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t, MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t, MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w4_t, MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w5_t, MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w6_t, MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w7_t, MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w8_t, MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w9_t, MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, wa_t, MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, wb_t, MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, wc_t, MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, wd_t, MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, we_t, MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, wf_t, MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w1_t, MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w6_t, MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, wb_t, MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t, MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w5_t, MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, wa_t, MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, wf_t, MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w4_t, MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w9_t, MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, we_t, MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t, MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w8_t, MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, wd_t, MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t, MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w7_t, MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, wc_t, MD5C1f, MD5S13); + + MD5_STEP (MD5_H , a, b, c, d, w5_t, MD5C20, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w8_t, MD5C21, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, wb_t, MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, we_t, MD5C23, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w1_t, MD5C24, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w4_t, MD5C25, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w7_t, MD5C26, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, wa_t, MD5C27, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, wd_t, MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w0_t, MD5C29, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w3_t, MD5C2a, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w6_t, MD5C2b, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w9_t, MD5C2c, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, wc_t, MD5C2d, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, wf_t, MD5C2e, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w2_t, MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t, MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w7_t, MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, we_t, MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w5_t, MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, wc_t, MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t, MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, wa_t, MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t, MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w8_t, MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, wf_t, MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w6_t, MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, wd_t, MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w4_t, MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, wb_t, MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t, MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w9_t, MD5C3f, MD5S33); + + const u32x r0 = a; + const u32x r1 = d; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_M + } +} + +static void m04400s (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], const u32 pw_len, __global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, __local u32 l_bin2asc[256]) +{ + /** + * modifier + */ + + const u32 gid = get_global_id (0); + const u32 lid = get_local_id (0); + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * loop + */ + + u32x w0l = w0[0]; + + for (u32 il_pos = 0; il_pos < bfs_cnt; il_pos++) + { + const u32 w0r = bfs_buf[il_pos].i; + + w0[0] = w0l | w0r; + + /** + * sha1 + */ + + u32x w0_t = w0[0]; + u32x w1_t = w0[1]; + u32x w2_t = w0[2]; + u32x w3_t = w0[3]; + u32x w4_t = w1[0]; + u32x w5_t = w1[1]; + u32x w6_t = w1[2]; + u32x w7_t = w1[3]; + u32x w8_t = w2[0]; + u32x w9_t = w2[1]; + u32x wa_t = w2[2]; + u32x wb_t = w2[3]; + u32x wc_t = w3[0]; + u32x wd_t = w3[1]; + u32x we_t = 0; + u32x wf_t = pw_len * 8; + + u32x a = SHA1M_A; + u32x b = SHA1M_B; + u32x c = SHA1M_C; + u32x d = SHA1M_D; + u32x e = SHA1M_E; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w0_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w1_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w2_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w3_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w4_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w5_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w6_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w7_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w8_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w9_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wa_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, wb_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, wc_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, wd_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, we_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F0o, e, a, b, c, d, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F0o, d, e, a, b, c, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F0o, c, d, e, a, b, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F0o, b, c, d, e, a, w3_t); + + #undef K + #define K SHA1C01 + + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w7_t); + + #undef K + #define K SHA1C02 + + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wb_t); + + #undef K + #define K SHA1C03 + + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wf_t); + + a += SHA1M_A; + b += SHA1M_B; + c += SHA1M_C; + d += SHA1M_D; + e += SHA1M_E; + + /** + * md5 + */ + + w0_t = uint_to_hex_lower8 ((a >> 24) & 255) << 0 + | uint_to_hex_lower8 ((a >> 16) & 255) << 16; + w1_t = uint_to_hex_lower8 ((a >> 8) & 255) << 0 + | uint_to_hex_lower8 ((a >> 0) & 255) << 16; + w2_t = uint_to_hex_lower8 ((b >> 24) & 255) << 0 + | uint_to_hex_lower8 ((b >> 16) & 255) << 16; + w3_t = uint_to_hex_lower8 ((b >> 8) & 255) << 0 + | uint_to_hex_lower8 ((b >> 0) & 255) << 16; + w4_t = uint_to_hex_lower8 ((c >> 24) & 255) << 0 + | uint_to_hex_lower8 ((c >> 16) & 255) << 16; + w5_t = uint_to_hex_lower8 ((c >> 8) & 255) << 0 + | uint_to_hex_lower8 ((c >> 0) & 255) << 16; + w6_t = uint_to_hex_lower8 ((d >> 24) & 255) << 0 + | uint_to_hex_lower8 ((d >> 16) & 255) << 16; + w7_t = uint_to_hex_lower8 ((d >> 8) & 255) << 0 + | uint_to_hex_lower8 ((d >> 0) & 255) << 16; + w8_t = uint_to_hex_lower8 ((e >> 24) & 255) << 0 + | uint_to_hex_lower8 ((e >> 16) & 255) << 16; + w9_t = uint_to_hex_lower8 ((e >> 8) & 255) << 0 + | uint_to_hex_lower8 ((e >> 0) & 255) << 16; + + wa_t = 0x80; + wb_t = 0; + wc_t = 0; + wd_t = 0; + we_t = 40 * 8; + wf_t = 0; + + a = MD5M_A; + b = MD5M_B; + c = MD5M_C; + d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t, MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t, MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t, MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t, MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w4_t, MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w5_t, MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w6_t, MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w7_t, MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w8_t, MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w9_t, MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, wa_t, MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, wb_t, MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, wc_t, MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, wd_t, MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, we_t, MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, wf_t, MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w1_t, MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w6_t, MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, wb_t, MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t, MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w5_t, MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, wa_t, MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, wf_t, MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w4_t, MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w9_t, MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, we_t, MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t, MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w8_t, MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, wd_t, MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t, MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w7_t, MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, wc_t, MD5C1f, MD5S13); + + MD5_STEP (MD5_H , a, b, c, d, w5_t, MD5C20, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w8_t, MD5C21, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, wb_t, MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, we_t, MD5C23, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w1_t, MD5C24, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w4_t, MD5C25, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w7_t, MD5C26, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, wa_t, MD5C27, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, wd_t, MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w0_t, MD5C29, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w3_t, MD5C2a, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w6_t, MD5C2b, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w9_t, MD5C2c, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, wc_t, MD5C2d, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, wf_t, MD5C2e, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w2_t, MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t, MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w7_t, MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, we_t, MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w5_t, MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, wc_t, MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t, MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, wa_t, MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t, MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w8_t, MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, wf_t, MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w6_t, MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, wd_t, MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w4_t, MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, wb_t, MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t, MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w9_t, MD5C3f, MD5S33); + + const u32x r0 = a; + const u32x r1 = d; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_S + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m04400_m04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = pws[gid].i[15]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * bin2asc table + */ + + __local u32 l_bin2asc[256]; + + const u32 lid4 = lid * 4; + + const u32 lid40 = lid4 + 0; + const u32 lid41 = lid4 + 1; + const u32 lid42 = lid4 + 2; + const u32 lid43 = lid4 + 3; + + const u32 v400 = (lid40 >> 0) & 15; + const u32 v401 = (lid40 >> 4) & 15; + const u32 v410 = (lid41 >> 0) & 15; + const u32 v411 = (lid41 >> 4) & 15; + const u32 v420 = (lid42 >> 0) & 15; + const u32 v421 = (lid42 >> 4) & 15; + const u32 v430 = (lid43 >> 0) & 15; + const u32 v431 = (lid43 >> 4) & 15; + + l_bin2asc[lid40] = ((v400 < 10) ? '0' + v400 : 'a' - 10 + v400) << 8 + | ((v401 < 10) ? '0' + v401 : 'a' - 10 + v401) << 0; + l_bin2asc[lid41] = ((v410 < 10) ? '0' + v410 : 'a' - 10 + v410) << 8 + | ((v411 < 10) ? '0' + v411 : 'a' - 10 + v411) << 0; + l_bin2asc[lid42] = ((v420 < 10) ? '0' + v420 : 'a' - 10 + v420) << 8 + | ((v421 < 10) ? '0' + v421 : 'a' - 10 + v421) << 0; + l_bin2asc[lid43] = ((v430 < 10) ? '0' + v430 : 'a' - 10 + v430) << 8 + | ((v431 < 10) ? '0' + v431 : 'a' - 10 + v431) << 0; + + barrier (CLK_LOCAL_MEM_FENCE); + + if (gid >= gid_max) return; + + /** + * main + */ + + m04400m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset, l_bin2asc); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m04400_m08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = pws[gid].i[15]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * bin2asc table + */ + + __local u32 l_bin2asc[256]; + + const u32 lid4 = lid * 4; + + const u32 lid40 = lid4 + 0; + const u32 lid41 = lid4 + 1; + const u32 lid42 = lid4 + 2; + const u32 lid43 = lid4 + 3; + + const u32 v400 = (lid40 >> 0) & 15; + const u32 v401 = (lid40 >> 4) & 15; + const u32 v410 = (lid41 >> 0) & 15; + const u32 v411 = (lid41 >> 4) & 15; + const u32 v420 = (lid42 >> 0) & 15; + const u32 v421 = (lid42 >> 4) & 15; + const u32 v430 = (lid43 >> 0) & 15; + const u32 v431 = (lid43 >> 4) & 15; + + l_bin2asc[lid40] = ((v400 < 10) ? '0' + v400 : 'a' - 10 + v400) << 8 + | ((v401 < 10) ? '0' + v401 : 'a' - 10 + v401) << 0; + l_bin2asc[lid41] = ((v410 < 10) ? '0' + v410 : 'a' - 10 + v410) << 8 + | ((v411 < 10) ? '0' + v411 : 'a' - 10 + v411) << 0; + l_bin2asc[lid42] = ((v420 < 10) ? '0' + v420 : 'a' - 10 + v420) << 8 + | ((v421 < 10) ? '0' + v421 : 'a' - 10 + v421) << 0; + l_bin2asc[lid43] = ((v430 < 10) ? '0' + v430 : 'a' - 10 + v430) << 8 + | ((v431 < 10) ? '0' + v431 : 'a' - 10 + v431) << 0; + + barrier (CLK_LOCAL_MEM_FENCE); + + if (gid >= gid_max) return; + + /** + * main + */ + + m04400m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset, l_bin2asc); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m04400_m16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = pws[gid].i[ 8]; + w2[1] = pws[gid].i[ 9]; + w2[2] = pws[gid].i[10]; + w2[3] = pws[gid].i[11]; + + u32x w3[4]; + + w3[0] = pws[gid].i[12]; + w3[1] = pws[gid].i[13]; + w3[2] = pws[gid].i[14]; + w3[3] = pws[gid].i[15]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * bin2asc table + */ + + __local u32 l_bin2asc[256]; + + const u32 lid4 = lid * 4; + + const u32 lid40 = lid4 + 0; + const u32 lid41 = lid4 + 1; + const u32 lid42 = lid4 + 2; + const u32 lid43 = lid4 + 3; + + const u32 v400 = (lid40 >> 0) & 15; + const u32 v401 = (lid40 >> 4) & 15; + const u32 v410 = (lid41 >> 0) & 15; + const u32 v411 = (lid41 >> 4) & 15; + const u32 v420 = (lid42 >> 0) & 15; + const u32 v421 = (lid42 >> 4) & 15; + const u32 v430 = (lid43 >> 0) & 15; + const u32 v431 = (lid43 >> 4) & 15; + + l_bin2asc[lid40] = ((v400 < 10) ? '0' + v400 : 'a' - 10 + v400) << 8 + | ((v401 < 10) ? '0' + v401 : 'a' - 10 + v401) << 0; + l_bin2asc[lid41] = ((v410 < 10) ? '0' + v410 : 'a' - 10 + v410) << 8 + | ((v411 < 10) ? '0' + v411 : 'a' - 10 + v411) << 0; + l_bin2asc[lid42] = ((v420 < 10) ? '0' + v420 : 'a' - 10 + v420) << 8 + | ((v421 < 10) ? '0' + v421 : 'a' - 10 + v421) << 0; + l_bin2asc[lid43] = ((v430 < 10) ? '0' + v430 : 'a' - 10 + v430) << 8 + | ((v431 < 10) ? '0' + v431 : 'a' - 10 + v431) << 0; + + barrier (CLK_LOCAL_MEM_FENCE); + + if (gid >= gid_max) return; + + /** + * main + */ + + m04400m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset, l_bin2asc); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m04400_s04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = pws[gid].i[15]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * bin2asc table + */ + + __local u32 l_bin2asc[256]; + + const u32 lid4 = lid * 4; + + const u32 lid40 = lid4 + 0; + const u32 lid41 = lid4 + 1; + const u32 lid42 = lid4 + 2; + const u32 lid43 = lid4 + 3; + + const u32 v400 = (lid40 >> 0) & 15; + const u32 v401 = (lid40 >> 4) & 15; + const u32 v410 = (lid41 >> 0) & 15; + const u32 v411 = (lid41 >> 4) & 15; + const u32 v420 = (lid42 >> 0) & 15; + const u32 v421 = (lid42 >> 4) & 15; + const u32 v430 = (lid43 >> 0) & 15; + const u32 v431 = (lid43 >> 4) & 15; + + l_bin2asc[lid40] = ((v400 < 10) ? '0' + v400 : 'a' - 10 + v400) << 8 + | ((v401 < 10) ? '0' + v401 : 'a' - 10 + v401) << 0; + l_bin2asc[lid41] = ((v410 < 10) ? '0' + v410 : 'a' - 10 + v410) << 8 + | ((v411 < 10) ? '0' + v411 : 'a' - 10 + v411) << 0; + l_bin2asc[lid42] = ((v420 < 10) ? '0' + v420 : 'a' - 10 + v420) << 8 + | ((v421 < 10) ? '0' + v421 : 'a' - 10 + v421) << 0; + l_bin2asc[lid43] = ((v430 < 10) ? '0' + v430 : 'a' - 10 + v430) << 8 + | ((v431 < 10) ? '0' + v431 : 'a' - 10 + v431) << 0; + + barrier (CLK_LOCAL_MEM_FENCE); + + if (gid >= gid_max) return; + + /** + * main + */ + + m04400s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset, l_bin2asc); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m04400_s08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = pws[gid].i[15]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * bin2asc table + */ + + __local u32 l_bin2asc[256]; + + const u32 lid4 = lid * 4; + + const u32 lid40 = lid4 + 0; + const u32 lid41 = lid4 + 1; + const u32 lid42 = lid4 + 2; + const u32 lid43 = lid4 + 3; + + const u32 v400 = (lid40 >> 0) & 15; + const u32 v401 = (lid40 >> 4) & 15; + const u32 v410 = (lid41 >> 0) & 15; + const u32 v411 = (lid41 >> 4) & 15; + const u32 v420 = (lid42 >> 0) & 15; + const u32 v421 = (lid42 >> 4) & 15; + const u32 v430 = (lid43 >> 0) & 15; + const u32 v431 = (lid43 >> 4) & 15; + + l_bin2asc[lid40] = ((v400 < 10) ? '0' + v400 : 'a' - 10 + v400) << 8 + | ((v401 < 10) ? '0' + v401 : 'a' - 10 + v401) << 0; + l_bin2asc[lid41] = ((v410 < 10) ? '0' + v410 : 'a' - 10 + v410) << 8 + | ((v411 < 10) ? '0' + v411 : 'a' - 10 + v411) << 0; + l_bin2asc[lid42] = ((v420 < 10) ? '0' + v420 : 'a' - 10 + v420) << 8 + | ((v421 < 10) ? '0' + v421 : 'a' - 10 + v421) << 0; + l_bin2asc[lid43] = ((v430 < 10) ? '0' + v430 : 'a' - 10 + v430) << 8 + | ((v431 < 10) ? '0' + v431 : 'a' - 10 + v431) << 0; + + barrier (CLK_LOCAL_MEM_FENCE); + + if (gid >= gid_max) return; + + /** + * main + */ + + m04400s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset, l_bin2asc); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m04400_s16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = pws[gid].i[ 8]; + w2[1] = pws[gid].i[ 9]; + w2[2] = pws[gid].i[10]; + w2[3] = pws[gid].i[11]; + + u32x w3[4]; + + w3[0] = pws[gid].i[12]; + w3[1] = pws[gid].i[13]; + w3[2] = pws[gid].i[14]; + w3[3] = pws[gid].i[15]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * bin2asc table + */ + + __local u32 l_bin2asc[256]; + + const u32 lid4 = lid * 4; + + const u32 lid40 = lid4 + 0; + const u32 lid41 = lid4 + 1; + const u32 lid42 = lid4 + 2; + const u32 lid43 = lid4 + 3; + + const u32 v400 = (lid40 >> 0) & 15; + const u32 v401 = (lid40 >> 4) & 15; + const u32 v410 = (lid41 >> 0) & 15; + const u32 v411 = (lid41 >> 4) & 15; + const u32 v420 = (lid42 >> 0) & 15; + const u32 v421 = (lid42 >> 4) & 15; + const u32 v430 = (lid43 >> 0) & 15; + const u32 v431 = (lid43 >> 4) & 15; + + l_bin2asc[lid40] = ((v400 < 10) ? '0' + v400 : 'a' - 10 + v400) << 8 + | ((v401 < 10) ? '0' + v401 : 'a' - 10 + v401) << 0; + l_bin2asc[lid41] = ((v410 < 10) ? '0' + v410 : 'a' - 10 + v410) << 8 + | ((v411 < 10) ? '0' + v411 : 'a' - 10 + v411) << 0; + l_bin2asc[lid42] = ((v420 < 10) ? '0' + v420 : 'a' - 10 + v420) << 8 + | ((v421 < 10) ? '0' + v421 : 'a' - 10 + v421) << 0; + l_bin2asc[lid43] = ((v430 < 10) ? '0' + v430 : 'a' - 10 + v430) << 8 + | ((v431 < 10) ? '0' + v431 : 'a' - 10 + v431) << 0; + + barrier (CLK_LOCAL_MEM_FENCE); + + if (gid >= gid_max) return; + + /** + * main + */ + + m04400s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset, l_bin2asc); +} diff --git a/amd/m04500_a0.cl b/amd/m04500_a0.cl new file mode 100644 index 0000000000..d656901dd1 --- /dev/null +++ b/amd/m04500_a0.cl @@ -0,0 +1,847 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _SHA1_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW4 +#define VECT_SIZE4 +#endif + +#ifdef VLIW5 +#define VECT_SIZE4 +#endif + +#define DGST_R0 3 +#define DGST_R1 4 +#define DGST_R2 2 +#define DGST_R3 1 + +#include "include/kernel_functions.c" +#include "types_amd.c" +#include "common_amd.c" +#include "include/rp_gpu.h" +#include "rp_amd.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +#ifdef VECT_SIZE1 +#define uint_to_hex_lower8_le(i) l_bin2asc[(i)] +#endif + +#ifdef VECT_SIZE2 +#define uint_to_hex_lower8_le(i) u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1]) +#endif + +#ifdef VECT_SIZE4 +#define uint_to_hex_lower8_le(i) u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3]) +#endif + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m04500_m04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + u32x pw_buf1[4]; + + pw_buf1[0] = pws[gid].i[ 4]; + pw_buf1[1] = pws[gid].i[ 5]; + pw_buf1[2] = pws[gid].i[ 6]; + pw_buf1[3] = pws[gid].i[ 7]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * bin2asc table + */ + + __local u32 l_bin2asc[256]; + + const u32 lid4 = lid * 4; + + const u32 lid40 = lid4 + 0; + const u32 lid41 = lid4 + 1; + const u32 lid42 = lid4 + 2; + const u32 lid43 = lid4 + 3; + + const u32 v400 = (lid40 >> 0) & 15; + const u32 v401 = (lid40 >> 4) & 15; + const u32 v410 = (lid41 >> 0) & 15; + const u32 v411 = (lid41 >> 4) & 15; + const u32 v420 = (lid42 >> 0) & 15; + const u32 v421 = (lid42 >> 4) & 15; + const u32 v430 = (lid43 >> 0) & 15; + const u32 v431 = (lid43 >> 4) & 15; + + l_bin2asc[lid40] = ((v400 < 10) ? '0' + v400 : 'a' - 10 + v400) << 0 + | ((v401 < 10) ? '0' + v401 : 'a' - 10 + v401) << 8; + l_bin2asc[lid41] = ((v410 < 10) ? '0' + v410 : 'a' - 10 + v410) << 0 + | ((v411 < 10) ? '0' + v411 : 'a' - 10 + v411) << 8; + l_bin2asc[lid42] = ((v420 < 10) ? '0' + v420 : 'a' - 10 + v420) << 0 + | ((v421 < 10) ? '0' + v421 : 'a' - 10 + v421) << 8; + l_bin2asc[lid43] = ((v430 < 10) ? '0' + v430 : 'a' - 10 + v430) << 0 + | ((v431 < 10) ? '0' + v431 : 'a' - 10 + v431) << 8; + + barrier (CLK_LOCAL_MEM_FENCE); + + if (gid >= gid_max) return; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + + w0[0] = pw_buf0[0]; + w0[1] = pw_buf0[1]; + w0[2] = pw_buf0[2]; + w0[3] = pw_buf0[3]; + + u32x w1[4]; + + w1[0] = pw_buf1[0]; + w1[1] = pw_buf1[1]; + w1[2] = pw_buf1[2]; + w1[3] = pw_buf1[3]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 out_len = apply_rules (rules_buf[il_pos].cmds, w0, w1, pw_len); + + append_0x80_2 (w0, w1, out_len); + + /** + * sha1 + */ + + u32x w0_t = swap_workaround (w0[0]); + u32x w1_t = swap_workaround (w0[1]); + u32x w2_t = swap_workaround (w0[2]); + u32x w3_t = swap_workaround (w0[3]); + u32x w4_t = swap_workaround (w1[0]); + u32x w5_t = swap_workaround (w1[1]); + u32x w6_t = swap_workaround (w1[2]); + u32x w7_t = swap_workaround (w1[3]); + u32x w8_t = swap_workaround (w2[0]); + u32x w9_t = swap_workaround (w2[1]); + u32x wa_t = swap_workaround (w2[2]); + u32x wb_t = swap_workaround (w2[3]); + u32x wc_t = swap_workaround (w3[0]); + u32x wd_t = swap_workaround (w3[1]); + u32x we_t = 0; + u32x wf_t = out_len * 8; + + u32x a = SHA1M_A; + u32x b = SHA1M_B; + u32x c = SHA1M_C; + u32x d = SHA1M_D; + u32x e = SHA1M_E; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w0_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w1_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w2_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w3_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w4_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w5_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w6_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w7_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w8_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w9_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wa_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, wb_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, wc_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, wd_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, we_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F0o, e, a, b, c, d, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F0o, d, e, a, b, c, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F0o, c, d, e, a, b, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F0o, b, c, d, e, a, w3_t); + + #undef K + #define K SHA1C01 + + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w7_t); + + #undef K + #define K SHA1C02 + + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wb_t); + + #undef K + #define K SHA1C03 + + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wf_t); + + a += SHA1M_A; + b += SHA1M_B; + c += SHA1M_C; + d += SHA1M_D; + e += SHA1M_E; + + /** + * 2nd SHA1 + */ + + w0_t = uint_to_hex_lower8_le ((a >> 16) & 255) << 0 + | uint_to_hex_lower8_le ((a >> 24) & 255) << 16; + w1_t = uint_to_hex_lower8_le ((a >> 0) & 255) << 0 + | uint_to_hex_lower8_le ((a >> 8) & 255) << 16; + w2_t = uint_to_hex_lower8_le ((b >> 16) & 255) << 0 + | uint_to_hex_lower8_le ((b >> 24) & 255) << 16; + w3_t = uint_to_hex_lower8_le ((b >> 0) & 255) << 0 + | uint_to_hex_lower8_le ((b >> 8) & 255) << 16; + w4_t = uint_to_hex_lower8_le ((c >> 16) & 255) << 0 + | uint_to_hex_lower8_le ((c >> 24) & 255) << 16; + w5_t = uint_to_hex_lower8_le ((c >> 0) & 255) << 0 + | uint_to_hex_lower8_le ((c >> 8) & 255) << 16; + w6_t = uint_to_hex_lower8_le ((d >> 16) & 255) << 0 + | uint_to_hex_lower8_le ((d >> 24) & 255) << 16; + w7_t = uint_to_hex_lower8_le ((d >> 0) & 255) << 0 + | uint_to_hex_lower8_le ((d >> 8) & 255) << 16; + w8_t = uint_to_hex_lower8_le ((e >> 16) & 255) << 0 + | uint_to_hex_lower8_le ((e >> 24) & 255) << 16; + w9_t = uint_to_hex_lower8_le ((e >> 0) & 255) << 0 + | uint_to_hex_lower8_le ((e >> 8) & 255) << 16; + + wa_t = 0x80000000; + wb_t = 0; + wc_t = 0; + wd_t = 0; + we_t = 0; + wf_t = 40 * 8; + + a = SHA1M_A; + b = SHA1M_B; + c = SHA1M_C; + d = SHA1M_D; + e = SHA1M_E; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w0_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w1_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w2_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w3_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w4_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w5_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w6_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w7_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w8_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w9_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wa_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, wb_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, wc_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, wd_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, we_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F0o, e, a, b, c, d, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F0o, d, e, a, b, c, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F0o, c, d, e, a, b, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F0o, b, c, d, e, a, w3_t); + + #undef K + #define K SHA1C01 + + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w7_t); + + #undef K + #define K SHA1C02 + + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wb_t); + + #undef K + #define K SHA1C03 + + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wb_t); + + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wf_t); + + const u32x r0 = d; + const u32x r1 = e; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_M + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m04500_m08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m04500_m16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m04500_s04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + u32x pw_buf1[4]; + + pw_buf1[0] = pws[gid].i[ 4]; + pw_buf1[1] = pws[gid].i[ 5]; + pw_buf1[2] = pws[gid].i[ 6]; + pw_buf1[3] = pws[gid].i[ 7]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * bin2asc table + */ + + __local u32 l_bin2asc[256]; + + const u32 lid4 = lid * 4; + + const u32 lid40 = lid4 + 0; + const u32 lid41 = lid4 + 1; + const u32 lid42 = lid4 + 2; + const u32 lid43 = lid4 + 3; + + const u32 v400 = (lid40 >> 0) & 15; + const u32 v401 = (lid40 >> 4) & 15; + const u32 v410 = (lid41 >> 0) & 15; + const u32 v411 = (lid41 >> 4) & 15; + const u32 v420 = (lid42 >> 0) & 15; + const u32 v421 = (lid42 >> 4) & 15; + const u32 v430 = (lid43 >> 0) & 15; + const u32 v431 = (lid43 >> 4) & 15; + + l_bin2asc[lid40] = ((v400 < 10) ? '0' + v400 : 'a' - 10 + v400) << 0 + | ((v401 < 10) ? '0' + v401 : 'a' - 10 + v401) << 8; + l_bin2asc[lid41] = ((v410 < 10) ? '0' + v410 : 'a' - 10 + v410) << 0 + | ((v411 < 10) ? '0' + v411 : 'a' - 10 + v411) << 8; + l_bin2asc[lid42] = ((v420 < 10) ? '0' + v420 : 'a' - 10 + v420) << 0 + | ((v421 < 10) ? '0' + v421 : 'a' - 10 + v421) << 8; + l_bin2asc[lid43] = ((v430 < 10) ? '0' + v430 : 'a' - 10 + v430) << 0 + | ((v431 < 10) ? '0' + v431 : 'a' - 10 + v431) << 8; + + barrier (CLK_LOCAL_MEM_FENCE); + + if (gid >= gid_max) return; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * reverse + */ + + const u32 e_rev = rotl32 (search[1], 2u); + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + + w0[0] = pw_buf0[0]; + w0[1] = pw_buf0[1]; + w0[2] = pw_buf0[2]; + w0[3] = pw_buf0[3]; + + u32x w1[4]; + + w1[0] = pw_buf1[0]; + w1[1] = pw_buf1[1]; + w1[2] = pw_buf1[2]; + w1[3] = pw_buf1[3]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 out_len = apply_rules (rules_buf[il_pos].cmds, w0, w1, pw_len); + + append_0x80_2 (w0, w1, out_len); + + /** + * sha1 + */ + + u32x w0_t = swap_workaround (w0[0]); + u32x w1_t = swap_workaround (w0[1]); + u32x w2_t = swap_workaround (w0[2]); + u32x w3_t = swap_workaround (w0[3]); + u32x w4_t = swap_workaround (w1[0]); + u32x w5_t = swap_workaround (w1[1]); + u32x w6_t = swap_workaround (w1[2]); + u32x w7_t = swap_workaround (w1[3]); + u32x w8_t = swap_workaround (w2[0]); + u32x w9_t = swap_workaround (w2[1]); + u32x wa_t = swap_workaround (w2[2]); + u32x wb_t = swap_workaround (w2[3]); + u32x wc_t = swap_workaround (w3[0]); + u32x wd_t = swap_workaround (w3[1]); + u32x we_t = 0; + u32x wf_t = out_len * 8; + + u32x a = SHA1M_A; + u32x b = SHA1M_B; + u32x c = SHA1M_C; + u32x d = SHA1M_D; + u32x e = SHA1M_E; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w0_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w1_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w2_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w3_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w4_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w5_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w6_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w7_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w8_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w9_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wa_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, wb_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, wc_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, wd_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, we_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F0o, e, a, b, c, d, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F0o, d, e, a, b, c, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F0o, c, d, e, a, b, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F0o, b, c, d, e, a, w3_t); + + #undef K + #define K SHA1C01 + + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w7_t); + + #undef K + #define K SHA1C02 + + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wb_t); + + #undef K + #define K SHA1C03 + + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wf_t); + + a += SHA1M_A; + b += SHA1M_B; + c += SHA1M_C; + d += SHA1M_D; + e += SHA1M_E; + + /** + * 2nd SHA1 + */ + + w0_t = uint_to_hex_lower8_le ((a >> 16) & 255) << 0 + | uint_to_hex_lower8_le ((a >> 24) & 255) << 16; + w1_t = uint_to_hex_lower8_le ((a >> 0) & 255) << 0 + | uint_to_hex_lower8_le ((a >> 8) & 255) << 16; + w2_t = uint_to_hex_lower8_le ((b >> 16) & 255) << 0 + | uint_to_hex_lower8_le ((b >> 24) & 255) << 16; + w3_t = uint_to_hex_lower8_le ((b >> 0) & 255) << 0 + | uint_to_hex_lower8_le ((b >> 8) & 255) << 16; + w4_t = uint_to_hex_lower8_le ((c >> 16) & 255) << 0 + | uint_to_hex_lower8_le ((c >> 24) & 255) << 16; + w5_t = uint_to_hex_lower8_le ((c >> 0) & 255) << 0 + | uint_to_hex_lower8_le ((c >> 8) & 255) << 16; + w6_t = uint_to_hex_lower8_le ((d >> 16) & 255) << 0 + | uint_to_hex_lower8_le ((d >> 24) & 255) << 16; + w7_t = uint_to_hex_lower8_le ((d >> 0) & 255) << 0 + | uint_to_hex_lower8_le ((d >> 8) & 255) << 16; + w8_t = uint_to_hex_lower8_le ((e >> 16) & 255) << 0 + | uint_to_hex_lower8_le ((e >> 24) & 255) << 16; + w9_t = uint_to_hex_lower8_le ((e >> 0) & 255) << 0 + | uint_to_hex_lower8_le ((e >> 8) & 255) << 16; + + wa_t = 0x80000000; + wb_t = 0; + wc_t = 0; + wd_t = 0; + we_t = 0; + wf_t = 40 * 8; + + a = SHA1M_A; + b = SHA1M_B; + c = SHA1M_C; + d = SHA1M_D; + e = SHA1M_E; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w0_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w1_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w2_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w3_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w4_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w5_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w6_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w7_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w8_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w9_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wa_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, wb_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, wc_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, wd_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, we_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F0o, e, a, b, c, d, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F0o, d, e, a, b, c, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F0o, c, d, e, a, b, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F0o, b, c, d, e, a, w3_t); + + #undef K + #define K SHA1C01 + + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w7_t); + + #undef K + #define K SHA1C02 + + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wb_t); + + #undef K + #define K SHA1C03 + + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wb_t); + + if (allx (e != e_rev)) continue; + + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wf_t); + + const u32x r0 = d; + const u32x r1 = e; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_S + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m04500_s08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m04500_s16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/amd/m04500_a1.cl b/amd/m04500_a1.cl new file mode 100644 index 0000000000..a60a70ff10 --- /dev/null +++ b/amd/m04500_a1.cl @@ -0,0 +1,956 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _SHA1_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW4 +#define VECT_SIZE4 +#endif + +#ifdef VLIW5 +#define VECT_SIZE4 +#endif + +#define DGST_R0 3 +#define DGST_R1 4 +#define DGST_R2 2 +#define DGST_R3 1 + +#include "include/kernel_functions.c" +#include "types_amd.c" +#include "common_amd.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +#ifdef VECT_SIZE1 +#define uint_to_hex_lower8_le(i) l_bin2asc[(i)] +#endif + +#ifdef VECT_SIZE2 +#define uint_to_hex_lower8_le(i) u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1]) +#endif + +#ifdef VECT_SIZE4 +#define uint_to_hex_lower8_le(i) u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3]) +#endif + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m04500_m04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + append_0x80_2 (wordl0, wordl1, pw_l_len); + + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, combs_buf[0].pw_len); + } + + /** + * bin2asc table + */ + + __local u32 l_bin2asc[256]; + + const u32 lid4 = lid * 4; + + const u32 lid40 = lid4 + 0; + const u32 lid41 = lid4 + 1; + const u32 lid42 = lid4 + 2; + const u32 lid43 = lid4 + 3; + + const u32 v400 = (lid40 >> 0) & 15; + const u32 v401 = (lid40 >> 4) & 15; + const u32 v410 = (lid41 >> 0) & 15; + const u32 v411 = (lid41 >> 4) & 15; + const u32 v420 = (lid42 >> 0) & 15; + const u32 v421 = (lid42 >> 4) & 15; + const u32 v430 = (lid43 >> 0) & 15; + const u32 v431 = (lid43 >> 4) & 15; + + l_bin2asc[lid40] = ((v400 < 10) ? '0' + v400 : 'a' - 10 + v400) << 0 + | ((v401 < 10) ? '0' + v401 : 'a' - 10 + v401) << 8; + l_bin2asc[lid41] = ((v410 < 10) ? '0' + v410 : 'a' - 10 + v410) << 0 + | ((v411 < 10) ? '0' + v411 : 'a' - 10 + v411) << 8; + l_bin2asc[lid42] = ((v420 < 10) ? '0' + v420 : 'a' - 10 + v420) << 0 + | ((v421 < 10) ? '0' + v421 : 'a' - 10 + v421) << 8; + l_bin2asc[lid43] = ((v430 < 10) ? '0' + v430 : 'a' - 10 + v430) << 0 + | ((v431 < 10) ? '0' + v431 : 'a' - 10 + v431) << 8; + + barrier (CLK_LOCAL_MEM_FENCE); + + if (gid >= gid_max) return; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = combs_buf[il_pos].pw_len; + + const u32 pw_len = pw_l_len + pw_r_len; + + u32 wordr0[4]; + + wordr0[0] = combs_buf[il_pos].i[0]; + wordr0[1] = combs_buf[il_pos].i[1]; + wordr0[2] = combs_buf[il_pos].i[2]; + wordr0[3] = combs_buf[il_pos].i[3]; + + u32 wordr1[4]; + + wordr1[0] = combs_buf[il_pos].i[4]; + wordr1[1] = combs_buf[il_pos].i[5]; + wordr1[2] = combs_buf[il_pos].i[6]; + wordr1[3] = combs_buf[il_pos].i[7]; + + u32 wordr2[4]; + + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + + u32 wordr3[4]; + + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + append_0x80_2 (wordr0, wordr1, pw_r_len); + + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + u32x w0[4]; + + w0[0] = wordl0[0] | wordr0[0]; + w0[1] = wordl0[1] | wordr0[1]; + w0[2] = wordl0[2] | wordr0[2]; + w0[3] = wordl0[3] | wordr0[3]; + + u32x w1[4]; + + w1[0] = wordl1[0] | wordr1[0]; + w1[1] = wordl1[1] | wordr1[1]; + w1[2] = wordl1[2] | wordr1[2]; + w1[3] = wordl1[3] | wordr1[3]; + + u32x w2[4]; + + w2[0] = wordl2[0] | wordr2[0]; + w2[1] = wordl2[1] | wordr2[1]; + w2[2] = wordl2[2] | wordr2[2]; + w2[3] = wordl2[3] | wordr2[3]; + + u32x w3[4]; + + w3[0] = wordl3[0] | wordr3[0]; + w3[1] = wordl3[1] | wordr3[1]; + w3[2] = 0; + w3[3] = 0; + + /** + * sha1 + */ + + u32x w0_t = swap_workaround (w0[0]); + u32x w1_t = swap_workaround (w0[1]); + u32x w2_t = swap_workaround (w0[2]); + u32x w3_t = swap_workaround (w0[3]); + u32x w4_t = swap_workaround (w1[0]); + u32x w5_t = swap_workaround (w1[1]); + u32x w6_t = swap_workaround (w1[2]); + u32x w7_t = swap_workaround (w1[3]); + u32x w8_t = swap_workaround (w2[0]); + u32x w9_t = swap_workaround (w2[1]); + u32x wa_t = swap_workaround (w2[2]); + u32x wb_t = swap_workaround (w2[3]); + u32x wc_t = swap_workaround (w3[0]); + u32x wd_t = swap_workaround (w3[1]); + u32x we_t = 0; + u32x wf_t = pw_len * 8; + + u32x a = SHA1M_A; + u32x b = SHA1M_B; + u32x c = SHA1M_C; + u32x d = SHA1M_D; + u32x e = SHA1M_E; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w0_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w1_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w2_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w3_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w4_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w5_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w6_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w7_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w8_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w9_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wa_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, wb_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, wc_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, wd_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, we_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F0o, e, a, b, c, d, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F0o, d, e, a, b, c, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F0o, c, d, e, a, b, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F0o, b, c, d, e, a, w3_t); + + #undef K + #define K SHA1C01 + + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w7_t); + + #undef K + #define K SHA1C02 + + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wb_t); + + #undef K + #define K SHA1C03 + + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wf_t); + + a += SHA1M_A; + b += SHA1M_B; + c += SHA1M_C; + d += SHA1M_D; + e += SHA1M_E; + + /** + * 2nd SHA1 + */ + + w0_t = uint_to_hex_lower8_le ((a >> 16) & 255) << 0 + | uint_to_hex_lower8_le ((a >> 24) & 255) << 16; + w1_t = uint_to_hex_lower8_le ((a >> 0) & 255) << 0 + | uint_to_hex_lower8_le ((a >> 8) & 255) << 16; + w2_t = uint_to_hex_lower8_le ((b >> 16) & 255) << 0 + | uint_to_hex_lower8_le ((b >> 24) & 255) << 16; + w3_t = uint_to_hex_lower8_le ((b >> 0) & 255) << 0 + | uint_to_hex_lower8_le ((b >> 8) & 255) << 16; + w4_t = uint_to_hex_lower8_le ((c >> 16) & 255) << 0 + | uint_to_hex_lower8_le ((c >> 24) & 255) << 16; + w5_t = uint_to_hex_lower8_le ((c >> 0) & 255) << 0 + | uint_to_hex_lower8_le ((c >> 8) & 255) << 16; + w6_t = uint_to_hex_lower8_le ((d >> 16) & 255) << 0 + | uint_to_hex_lower8_le ((d >> 24) & 255) << 16; + w7_t = uint_to_hex_lower8_le ((d >> 0) & 255) << 0 + | uint_to_hex_lower8_le ((d >> 8) & 255) << 16; + w8_t = uint_to_hex_lower8_le ((e >> 16) & 255) << 0 + | uint_to_hex_lower8_le ((e >> 24) & 255) << 16; + w9_t = uint_to_hex_lower8_le ((e >> 0) & 255) << 0 + | uint_to_hex_lower8_le ((e >> 8) & 255) << 16; + + wa_t = 0x80000000; + wb_t = 0; + wc_t = 0; + wd_t = 0; + we_t = 0; + wf_t = 40 * 8; + + a = SHA1M_A; + b = SHA1M_B; + c = SHA1M_C; + d = SHA1M_D; + e = SHA1M_E; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w0_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w1_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w2_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w3_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w4_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w5_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w6_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w7_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w8_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w9_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wa_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, wb_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, wc_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, wd_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, we_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F0o, e, a, b, c, d, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F0o, d, e, a, b, c, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F0o, c, d, e, a, b, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F0o, b, c, d, e, a, w3_t); + + #undef K + #define K SHA1C01 + + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w7_t); + + #undef K + #define K SHA1C02 + + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wb_t); + + #undef K + #define K SHA1C03 + + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wf_t); + + const u32x r0 = d; + const u32x r1 = e; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_M + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m04500_m08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m04500_m16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m04500_s04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + append_0x80_2 (wordl0, wordl1, pw_l_len); + + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, combs_buf[0].pw_len); + } + + /** + * bin2asc table + */ + + __local u32 l_bin2asc[256]; + + const u32 lid4 = lid * 4; + + const u32 lid40 = lid4 + 0; + const u32 lid41 = lid4 + 1; + const u32 lid42 = lid4 + 2; + const u32 lid43 = lid4 + 3; + + const u32 v400 = (lid40 >> 0) & 15; + const u32 v401 = (lid40 >> 4) & 15; + const u32 v410 = (lid41 >> 0) & 15; + const u32 v411 = (lid41 >> 4) & 15; + const u32 v420 = (lid42 >> 0) & 15; + const u32 v421 = (lid42 >> 4) & 15; + const u32 v430 = (lid43 >> 0) & 15; + const u32 v431 = (lid43 >> 4) & 15; + + l_bin2asc[lid40] = ((v400 < 10) ? '0' + v400 : 'a' - 10 + v400) << 0 + | ((v401 < 10) ? '0' + v401 : 'a' - 10 + v401) << 8; + l_bin2asc[lid41] = ((v410 < 10) ? '0' + v410 : 'a' - 10 + v410) << 0 + | ((v411 < 10) ? '0' + v411 : 'a' - 10 + v411) << 8; + l_bin2asc[lid42] = ((v420 < 10) ? '0' + v420 : 'a' - 10 + v420) << 0 + | ((v421 < 10) ? '0' + v421 : 'a' - 10 + v421) << 8; + l_bin2asc[lid43] = ((v430 < 10) ? '0' + v430 : 'a' - 10 + v430) << 0 + | ((v431 < 10) ? '0' + v431 : 'a' - 10 + v431) << 8; + + barrier (CLK_LOCAL_MEM_FENCE); + + if (gid >= gid_max) return; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * reverse + */ + + const u32 e_rev = rotl32 (search[1], 2u); + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = combs_buf[il_pos].pw_len; + + const u32 pw_len = pw_l_len + pw_r_len; + + u32 wordr0[4]; + + wordr0[0] = combs_buf[il_pos].i[0]; + wordr0[1] = combs_buf[il_pos].i[1]; + wordr0[2] = combs_buf[il_pos].i[2]; + wordr0[3] = combs_buf[il_pos].i[3]; + + u32 wordr1[4]; + + wordr1[0] = combs_buf[il_pos].i[4]; + wordr1[1] = combs_buf[il_pos].i[5]; + wordr1[2] = combs_buf[il_pos].i[6]; + wordr1[3] = combs_buf[il_pos].i[7]; + + u32 wordr2[4]; + + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + + u32 wordr3[4]; + + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + append_0x80_2 (wordr0, wordr1, pw_r_len); + + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + u32x w0[4]; + + w0[0] = wordl0[0] | wordr0[0]; + w0[1] = wordl0[1] | wordr0[1]; + w0[2] = wordl0[2] | wordr0[2]; + w0[3] = wordl0[3] | wordr0[3]; + + u32x w1[4]; + + w1[0] = wordl1[0] | wordr1[0]; + w1[1] = wordl1[1] | wordr1[1]; + w1[2] = wordl1[2] | wordr1[2]; + w1[3] = wordl1[3] | wordr1[3]; + + u32x w2[4]; + + w2[0] = wordl2[0] | wordr2[0]; + w2[1] = wordl2[1] | wordr2[1]; + w2[2] = wordl2[2] | wordr2[2]; + w2[3] = wordl2[3] | wordr2[3]; + + u32x w3[4]; + + w3[0] = wordl3[0] | wordr3[0]; + w3[1] = wordl3[1] | wordr3[1]; + w3[2] = 0; + w3[3] = 0; + + /** + * sha1 + */ + + u32x w0_t = swap_workaround (w0[0]); + u32x w1_t = swap_workaround (w0[1]); + u32x w2_t = swap_workaround (w0[2]); + u32x w3_t = swap_workaround (w0[3]); + u32x w4_t = swap_workaround (w1[0]); + u32x w5_t = swap_workaround (w1[1]); + u32x w6_t = swap_workaround (w1[2]); + u32x w7_t = swap_workaround (w1[3]); + u32x w8_t = swap_workaround (w2[0]); + u32x w9_t = swap_workaround (w2[1]); + u32x wa_t = swap_workaround (w2[2]); + u32x wb_t = swap_workaround (w2[3]); + u32x wc_t = swap_workaround (w3[0]); + u32x wd_t = swap_workaround (w3[1]); + u32x we_t = 0; + u32x wf_t = pw_len * 8; + + u32x a = SHA1M_A; + u32x b = SHA1M_B; + u32x c = SHA1M_C; + u32x d = SHA1M_D; + u32x e = SHA1M_E; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w0_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w1_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w2_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w3_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w4_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w5_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w6_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w7_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w8_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w9_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wa_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, wb_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, wc_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, wd_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, we_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F0o, e, a, b, c, d, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F0o, d, e, a, b, c, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F0o, c, d, e, a, b, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F0o, b, c, d, e, a, w3_t); + + #undef K + #define K SHA1C01 + + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w7_t); + + #undef K + #define K SHA1C02 + + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wb_t); + + #undef K + #define K SHA1C03 + + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wf_t); + + a += SHA1M_A; + b += SHA1M_B; + c += SHA1M_C; + d += SHA1M_D; + e += SHA1M_E; + + /** + * 2nd SHA1 + */ + + w0_t = uint_to_hex_lower8_le ((a >> 16) & 255) << 0 + | uint_to_hex_lower8_le ((a >> 24) & 255) << 16; + w1_t = uint_to_hex_lower8_le ((a >> 0) & 255) << 0 + | uint_to_hex_lower8_le ((a >> 8) & 255) << 16; + w2_t = uint_to_hex_lower8_le ((b >> 16) & 255) << 0 + | uint_to_hex_lower8_le ((b >> 24) & 255) << 16; + w3_t = uint_to_hex_lower8_le ((b >> 0) & 255) << 0 + | uint_to_hex_lower8_le ((b >> 8) & 255) << 16; + w4_t = uint_to_hex_lower8_le ((c >> 16) & 255) << 0 + | uint_to_hex_lower8_le ((c >> 24) & 255) << 16; + w5_t = uint_to_hex_lower8_le ((c >> 0) & 255) << 0 + | uint_to_hex_lower8_le ((c >> 8) & 255) << 16; + w6_t = uint_to_hex_lower8_le ((d >> 16) & 255) << 0 + | uint_to_hex_lower8_le ((d >> 24) & 255) << 16; + w7_t = uint_to_hex_lower8_le ((d >> 0) & 255) << 0 + | uint_to_hex_lower8_le ((d >> 8) & 255) << 16; + w8_t = uint_to_hex_lower8_le ((e >> 16) & 255) << 0 + | uint_to_hex_lower8_le ((e >> 24) & 255) << 16; + w9_t = uint_to_hex_lower8_le ((e >> 0) & 255) << 0 + | uint_to_hex_lower8_le ((e >> 8) & 255) << 16; + + wa_t = 0x80000000; + wb_t = 0; + wc_t = 0; + wd_t = 0; + we_t = 0; + wf_t = 40 * 8; + + a = SHA1M_A; + b = SHA1M_B; + c = SHA1M_C; + d = SHA1M_D; + e = SHA1M_E; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w0_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w1_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w2_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w3_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w4_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w5_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w6_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w7_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w8_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w9_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wa_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, wb_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, wc_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, wd_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, we_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F0o, e, a, b, c, d, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F0o, d, e, a, b, c, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F0o, c, d, e, a, b, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F0o, b, c, d, e, a, w3_t); + + #undef K + #define K SHA1C01 + + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w7_t); + + #undef K + #define K SHA1C02 + + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wb_t); + + #undef K + #define K SHA1C03 + + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wb_t); + + if (allx (e != e_rev)) continue; + + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wf_t); + + const u32x r0 = d; + const u32x r1 = e; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_S + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m04500_s08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m04500_s16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/amd/m04500_a3.cl b/amd/m04500_a3.cl new file mode 100644 index 0000000000..a21f3f4f66 --- /dev/null +++ b/amd/m04500_a3.cl @@ -0,0 +1,1181 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _SHA1_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW4 +#define VECT_SIZE4 +#endif + +#ifdef VLIW5 +#define VECT_SIZE4 +#endif + +#define DGST_R0 3 +#define DGST_R1 4 +#define DGST_R2 2 +#define DGST_R3 1 + +#include "include/kernel_functions.c" +#include "types_amd.c" +#include "common_amd.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +#ifdef VECT_SIZE1 +#define uint_to_hex_lower8_le(i) l_bin2asc[(i)] +#endif + +#ifdef VECT_SIZE2 +#define uint_to_hex_lower8_le(i) u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1]) +#endif + +#ifdef VECT_SIZE4 +#define uint_to_hex_lower8_le(i) u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3]) +#endif + +static void m04500m (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], const u32 pw_len, __global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, __local u32 l_bin2asc[256]) +{ + /** + * modifier + */ + + const u32 gid = get_global_id (0); + const u32 lid = get_local_id (0); + + /** + * loop + */ + + u32x w0l = w0[0]; + + for (u32 il_pos = 0; il_pos < bfs_cnt; il_pos++) + { + const u32 w0r = bfs_buf[il_pos].i; + + w0[0] = w0l | w0r; + + /** + * sha1 + */ + + u32x w0_t = w0[0]; + u32x w1_t = w0[1]; + u32x w2_t = w0[2]; + u32x w3_t = w0[3]; + u32x w4_t = w1[0]; + u32x w5_t = w1[1]; + u32x w6_t = w1[2]; + u32x w7_t = w1[3]; + u32x w8_t = w2[0]; + u32x w9_t = w2[1]; + u32x wa_t = w2[2]; + u32x wb_t = w2[3]; + u32x wc_t = w3[0]; + u32x wd_t = w3[1]; + u32x we_t = 0; + u32x wf_t = pw_len * 8; + + u32x a = SHA1M_A; + u32x b = SHA1M_B; + u32x c = SHA1M_C; + u32x d = SHA1M_D; + u32x e = SHA1M_E; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w0_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w1_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w2_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w3_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w4_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w5_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w6_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w7_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w8_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w9_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wa_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, wb_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, wc_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, wd_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, we_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F0o, e, a, b, c, d, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F0o, d, e, a, b, c, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F0o, c, d, e, a, b, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F0o, b, c, d, e, a, w3_t); + + #undef K + #define K SHA1C01 + + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w7_t); + + #undef K + #define K SHA1C02 + + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wb_t); + + #undef K + #define K SHA1C03 + + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wf_t); + + a += SHA1M_A; + b += SHA1M_B; + c += SHA1M_C; + d += SHA1M_D; + e += SHA1M_E; + + /** + * 2nd SHA1 + */ + + w0_t = uint_to_hex_lower8_le ((a >> 16) & 255) << 0 + | uint_to_hex_lower8_le ((a >> 24) & 255) << 16; + w1_t = uint_to_hex_lower8_le ((a >> 0) & 255) << 0 + | uint_to_hex_lower8_le ((a >> 8) & 255) << 16; + w2_t = uint_to_hex_lower8_le ((b >> 16) & 255) << 0 + | uint_to_hex_lower8_le ((b >> 24) & 255) << 16; + w3_t = uint_to_hex_lower8_le ((b >> 0) & 255) << 0 + | uint_to_hex_lower8_le ((b >> 8) & 255) << 16; + w4_t = uint_to_hex_lower8_le ((c >> 16) & 255) << 0 + | uint_to_hex_lower8_le ((c >> 24) & 255) << 16; + w5_t = uint_to_hex_lower8_le ((c >> 0) & 255) << 0 + | uint_to_hex_lower8_le ((c >> 8) & 255) << 16; + w6_t = uint_to_hex_lower8_le ((d >> 16) & 255) << 0 + | uint_to_hex_lower8_le ((d >> 24) & 255) << 16; + w7_t = uint_to_hex_lower8_le ((d >> 0) & 255) << 0 + | uint_to_hex_lower8_le ((d >> 8) & 255) << 16; + w8_t = uint_to_hex_lower8_le ((e >> 16) & 255) << 0 + | uint_to_hex_lower8_le ((e >> 24) & 255) << 16; + w9_t = uint_to_hex_lower8_le ((e >> 0) & 255) << 0 + | uint_to_hex_lower8_le ((e >> 8) & 255) << 16; + + wa_t = 0x80000000; + wb_t = 0; + wc_t = 0; + wd_t = 0; + we_t = 0; + wf_t = 40 * 8; + + a = SHA1M_A; + b = SHA1M_B; + c = SHA1M_C; + d = SHA1M_D; + e = SHA1M_E; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w0_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w1_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w2_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w3_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w4_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w5_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w6_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w7_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w8_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w9_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wa_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, wb_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, wc_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, wd_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, we_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F0o, e, a, b, c, d, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F0o, d, e, a, b, c, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F0o, c, d, e, a, b, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F0o, b, c, d, e, a, w3_t); + + #undef K + #define K SHA1C01 + + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w7_t); + + #undef K + #define K SHA1C02 + + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wb_t); + + #undef K + #define K SHA1C03 + + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wf_t); + + const u32x r0 = d; + const u32x r1 = e; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_M + } +} + +static void m04500s (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], const u32 pw_len, __global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, __local u32 l_bin2asc[256]) +{ + /** + * modifier + */ + + const u32 gid = get_global_id (0); + const u32 lid = get_local_id (0); + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * reverse + */ + + const u32 e_rev = rotl32 (search[1], 2u); + + /** + * loop + */ + + u32x w0l = w0[0]; + + for (u32 il_pos = 0; il_pos < bfs_cnt; il_pos++) + { + const u32 w0r = bfs_buf[il_pos].i; + + w0[0] = w0l | w0r; + + /** + * sha1 + */ + + u32x w0_t = w0[0]; + u32x w1_t = w0[1]; + u32x w2_t = w0[2]; + u32x w3_t = w0[3]; + u32x w4_t = w1[0]; + u32x w5_t = w1[1]; + u32x w6_t = w1[2]; + u32x w7_t = w1[3]; + u32x w8_t = w2[0]; + u32x w9_t = w2[1]; + u32x wa_t = w2[2]; + u32x wb_t = w2[3]; + u32x wc_t = w3[0]; + u32x wd_t = w3[1]; + u32x we_t = 0; + u32x wf_t = pw_len * 8; + + u32x a = SHA1M_A; + u32x b = SHA1M_B; + u32x c = SHA1M_C; + u32x d = SHA1M_D; + u32x e = SHA1M_E; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w0_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w1_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w2_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w3_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w4_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w5_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w6_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w7_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w8_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w9_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wa_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, wb_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, wc_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, wd_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, we_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F0o, e, a, b, c, d, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F0o, d, e, a, b, c, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F0o, c, d, e, a, b, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F0o, b, c, d, e, a, w3_t); + + #undef K + #define K SHA1C01 + + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w7_t); + + #undef K + #define K SHA1C02 + + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wb_t); + + #undef K + #define K SHA1C03 + + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wf_t); + + a += SHA1M_A; + b += SHA1M_B; + c += SHA1M_C; + d += SHA1M_D; + e += SHA1M_E; + + /** + * 2nd SHA1 + */ + + w0_t = uint_to_hex_lower8_le ((a >> 16) & 255) << 0 + | uint_to_hex_lower8_le ((a >> 24) & 255) << 16; + w1_t = uint_to_hex_lower8_le ((a >> 0) & 255) << 0 + | uint_to_hex_lower8_le ((a >> 8) & 255) << 16; + w2_t = uint_to_hex_lower8_le ((b >> 16) & 255) << 0 + | uint_to_hex_lower8_le ((b >> 24) & 255) << 16; + w3_t = uint_to_hex_lower8_le ((b >> 0) & 255) << 0 + | uint_to_hex_lower8_le ((b >> 8) & 255) << 16; + w4_t = uint_to_hex_lower8_le ((c >> 16) & 255) << 0 + | uint_to_hex_lower8_le ((c >> 24) & 255) << 16; + w5_t = uint_to_hex_lower8_le ((c >> 0) & 255) << 0 + | uint_to_hex_lower8_le ((c >> 8) & 255) << 16; + w6_t = uint_to_hex_lower8_le ((d >> 16) & 255) << 0 + | uint_to_hex_lower8_le ((d >> 24) & 255) << 16; + w7_t = uint_to_hex_lower8_le ((d >> 0) & 255) << 0 + | uint_to_hex_lower8_le ((d >> 8) & 255) << 16; + w8_t = uint_to_hex_lower8_le ((e >> 16) & 255) << 0 + | uint_to_hex_lower8_le ((e >> 24) & 255) << 16; + w9_t = uint_to_hex_lower8_le ((e >> 0) & 255) << 0 + | uint_to_hex_lower8_le ((e >> 8) & 255) << 16; + + wa_t = 0x80000000; + wb_t = 0; + wc_t = 0; + wd_t = 0; + we_t = 0; + wf_t = 40 * 8; + + a = SHA1M_A; + b = SHA1M_B; + c = SHA1M_C; + d = SHA1M_D; + e = SHA1M_E; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w0_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w1_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w2_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w3_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w4_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w5_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w6_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w7_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w8_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w9_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wa_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, wb_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, wc_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, wd_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, we_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F0o, e, a, b, c, d, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F0o, d, e, a, b, c, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F0o, c, d, e, a, b, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F0o, b, c, d, e, a, w3_t); + + #undef K + #define K SHA1C01 + + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w7_t); + + #undef K + #define K SHA1C02 + + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wb_t); + + #undef K + #define K SHA1C03 + + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wb_t); + + if (allx (e != e_rev)) continue; + + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wf_t); + + const u32x r0 = d; + const u32x r1 = e; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_S + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m04500_m04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = pws[gid].i[15]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * bin2asc table + */ + + __local u32 l_bin2asc[256]; + + const u32 lid4 = lid * 4; + + const u32 lid40 = lid4 + 0; + const u32 lid41 = lid4 + 1; + const u32 lid42 = lid4 + 2; + const u32 lid43 = lid4 + 3; + + const u32 v400 = (lid40 >> 0) & 15; + const u32 v401 = (lid40 >> 4) & 15; + const u32 v410 = (lid41 >> 0) & 15; + const u32 v411 = (lid41 >> 4) & 15; + const u32 v420 = (lid42 >> 0) & 15; + const u32 v421 = (lid42 >> 4) & 15; + const u32 v430 = (lid43 >> 0) & 15; + const u32 v431 = (lid43 >> 4) & 15; + + l_bin2asc[lid40] = ((v400 < 10) ? '0' + v400 : 'a' - 10 + v400) << 0 + | ((v401 < 10) ? '0' + v401 : 'a' - 10 + v401) << 8; + l_bin2asc[lid41] = ((v410 < 10) ? '0' + v410 : 'a' - 10 + v410) << 0 + | ((v411 < 10) ? '0' + v411 : 'a' - 10 + v411) << 8; + l_bin2asc[lid42] = ((v420 < 10) ? '0' + v420 : 'a' - 10 + v420) << 0 + | ((v421 < 10) ? '0' + v421 : 'a' - 10 + v421) << 8; + l_bin2asc[lid43] = ((v430 < 10) ? '0' + v430 : 'a' - 10 + v430) << 0 + | ((v431 < 10) ? '0' + v431 : 'a' - 10 + v431) << 8; + + barrier (CLK_LOCAL_MEM_FENCE); + + if (gid >= gid_max) return; + + /** + * main + */ + + m04500m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset, l_bin2asc); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m04500_m08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = pws[gid].i[15]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * bin2asc table + */ + + __local u32 l_bin2asc[256]; + + const u32 lid4 = lid * 4; + + const u32 lid40 = lid4 + 0; + const u32 lid41 = lid4 + 1; + const u32 lid42 = lid4 + 2; + const u32 lid43 = lid4 + 3; + + const u32 v400 = (lid40 >> 0) & 15; + const u32 v401 = (lid40 >> 4) & 15; + const u32 v410 = (lid41 >> 0) & 15; + const u32 v411 = (lid41 >> 4) & 15; + const u32 v420 = (lid42 >> 0) & 15; + const u32 v421 = (lid42 >> 4) & 15; + const u32 v430 = (lid43 >> 0) & 15; + const u32 v431 = (lid43 >> 4) & 15; + + l_bin2asc[lid40] = ((v400 < 10) ? '0' + v400 : 'a' - 10 + v400) << 0 + | ((v401 < 10) ? '0' + v401 : 'a' - 10 + v401) << 8; + l_bin2asc[lid41] = ((v410 < 10) ? '0' + v410 : 'a' - 10 + v410) << 0 + | ((v411 < 10) ? '0' + v411 : 'a' - 10 + v411) << 8; + l_bin2asc[lid42] = ((v420 < 10) ? '0' + v420 : 'a' - 10 + v420) << 0 + | ((v421 < 10) ? '0' + v421 : 'a' - 10 + v421) << 8; + l_bin2asc[lid43] = ((v430 < 10) ? '0' + v430 : 'a' - 10 + v430) << 0 + | ((v431 < 10) ? '0' + v431 : 'a' - 10 + v431) << 8; + + barrier (CLK_LOCAL_MEM_FENCE); + + if (gid >= gid_max) return; + + /** + * main + */ + + m04500m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset, l_bin2asc); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m04500_m16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = pws[gid].i[ 8]; + w2[1] = pws[gid].i[ 9]; + w2[2] = pws[gid].i[10]; + w2[3] = pws[gid].i[11]; + + u32x w3[4]; + + w3[0] = pws[gid].i[12]; + w3[1] = pws[gid].i[13]; + w3[2] = pws[gid].i[14]; + w3[3] = pws[gid].i[15]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * bin2asc table + */ + + __local u32 l_bin2asc[256]; + + const u32 lid4 = lid * 4; + + const u32 lid40 = lid4 + 0; + const u32 lid41 = lid4 + 1; + const u32 lid42 = lid4 + 2; + const u32 lid43 = lid4 + 3; + + const u32 v400 = (lid40 >> 0) & 15; + const u32 v401 = (lid40 >> 4) & 15; + const u32 v410 = (lid41 >> 0) & 15; + const u32 v411 = (lid41 >> 4) & 15; + const u32 v420 = (lid42 >> 0) & 15; + const u32 v421 = (lid42 >> 4) & 15; + const u32 v430 = (lid43 >> 0) & 15; + const u32 v431 = (lid43 >> 4) & 15; + + l_bin2asc[lid40] = ((v400 < 10) ? '0' + v400 : 'a' - 10 + v400) << 0 + | ((v401 < 10) ? '0' + v401 : 'a' - 10 + v401) << 8; + l_bin2asc[lid41] = ((v410 < 10) ? '0' + v410 : 'a' - 10 + v410) << 0 + | ((v411 < 10) ? '0' + v411 : 'a' - 10 + v411) << 8; + l_bin2asc[lid42] = ((v420 < 10) ? '0' + v420 : 'a' - 10 + v420) << 0 + | ((v421 < 10) ? '0' + v421 : 'a' - 10 + v421) << 8; + l_bin2asc[lid43] = ((v430 < 10) ? '0' + v430 : 'a' - 10 + v430) << 0 + | ((v431 < 10) ? '0' + v431 : 'a' - 10 + v431) << 8; + + barrier (CLK_LOCAL_MEM_FENCE); + + if (gid >= gid_max) return; + + /** + * main + */ + + m04500m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset, l_bin2asc); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m04500_s04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = pws[gid].i[15]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * bin2asc table + */ + + __local u32 l_bin2asc[256]; + + const u32 lid4 = lid * 4; + + const u32 lid40 = lid4 + 0; + const u32 lid41 = lid4 + 1; + const u32 lid42 = lid4 + 2; + const u32 lid43 = lid4 + 3; + + const u32 v400 = (lid40 >> 0) & 15; + const u32 v401 = (lid40 >> 4) & 15; + const u32 v410 = (lid41 >> 0) & 15; + const u32 v411 = (lid41 >> 4) & 15; + const u32 v420 = (lid42 >> 0) & 15; + const u32 v421 = (lid42 >> 4) & 15; + const u32 v430 = (lid43 >> 0) & 15; + const u32 v431 = (lid43 >> 4) & 15; + + l_bin2asc[lid40] = ((v400 < 10) ? '0' + v400 : 'a' - 10 + v400) << 0 + | ((v401 < 10) ? '0' + v401 : 'a' - 10 + v401) << 8; + l_bin2asc[lid41] = ((v410 < 10) ? '0' + v410 : 'a' - 10 + v410) << 0 + | ((v411 < 10) ? '0' + v411 : 'a' - 10 + v411) << 8; + l_bin2asc[lid42] = ((v420 < 10) ? '0' + v420 : 'a' - 10 + v420) << 0 + | ((v421 < 10) ? '0' + v421 : 'a' - 10 + v421) << 8; + l_bin2asc[lid43] = ((v430 < 10) ? '0' + v430 : 'a' - 10 + v430) << 0 + | ((v431 < 10) ? '0' + v431 : 'a' - 10 + v431) << 8; + + barrier (CLK_LOCAL_MEM_FENCE); + + if (gid >= gid_max) return; + + /** + * main + */ + + m04500s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset, l_bin2asc); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m04500_s08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = pws[gid].i[15]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * bin2asc table + */ + + __local u32 l_bin2asc[256]; + + const u32 lid4 = lid * 4; + + const u32 lid40 = lid4 + 0; + const u32 lid41 = lid4 + 1; + const u32 lid42 = lid4 + 2; + const u32 lid43 = lid4 + 3; + + const u32 v400 = (lid40 >> 0) & 15; + const u32 v401 = (lid40 >> 4) & 15; + const u32 v410 = (lid41 >> 0) & 15; + const u32 v411 = (lid41 >> 4) & 15; + const u32 v420 = (lid42 >> 0) & 15; + const u32 v421 = (lid42 >> 4) & 15; + const u32 v430 = (lid43 >> 0) & 15; + const u32 v431 = (lid43 >> 4) & 15; + + l_bin2asc[lid40] = ((v400 < 10) ? '0' + v400 : 'a' - 10 + v400) << 0 + | ((v401 < 10) ? '0' + v401 : 'a' - 10 + v401) << 8; + l_bin2asc[lid41] = ((v410 < 10) ? '0' + v410 : 'a' - 10 + v410) << 0 + | ((v411 < 10) ? '0' + v411 : 'a' - 10 + v411) << 8; + l_bin2asc[lid42] = ((v420 < 10) ? '0' + v420 : 'a' - 10 + v420) << 0 + | ((v421 < 10) ? '0' + v421 : 'a' - 10 + v421) << 8; + l_bin2asc[lid43] = ((v430 < 10) ? '0' + v430 : 'a' - 10 + v430) << 0 + | ((v431 < 10) ? '0' + v431 : 'a' - 10 + v431) << 8; + + barrier (CLK_LOCAL_MEM_FENCE); + + if (gid >= gid_max) return; + + /** + * main + */ + + m04500s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset, l_bin2asc); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m04500_s16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = pws[gid].i[ 8]; + w2[1] = pws[gid].i[ 9]; + w2[2] = pws[gid].i[10]; + w2[3] = pws[gid].i[11]; + + u32x w3[4]; + + w3[0] = pws[gid].i[12]; + w3[1] = pws[gid].i[13]; + w3[2] = pws[gid].i[14]; + w3[3] = pws[gid].i[15]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * bin2asc table + */ + + __local u32 l_bin2asc[256]; + + const u32 lid4 = lid * 4; + + const u32 lid40 = lid4 + 0; + const u32 lid41 = lid4 + 1; + const u32 lid42 = lid4 + 2; + const u32 lid43 = lid4 + 3; + + const u32 v400 = (lid40 >> 0) & 15; + const u32 v401 = (lid40 >> 4) & 15; + const u32 v410 = (lid41 >> 0) & 15; + const u32 v411 = (lid41 >> 4) & 15; + const u32 v420 = (lid42 >> 0) & 15; + const u32 v421 = (lid42 >> 4) & 15; + const u32 v430 = (lid43 >> 0) & 15; + const u32 v431 = (lid43 >> 4) & 15; + + l_bin2asc[lid40] = ((v400 < 10) ? '0' + v400 : 'a' - 10 + v400) << 0 + | ((v401 < 10) ? '0' + v401 : 'a' - 10 + v401) << 8; + l_bin2asc[lid41] = ((v410 < 10) ? '0' + v410 : 'a' - 10 + v410) << 0 + | ((v411 < 10) ? '0' + v411 : 'a' - 10 + v411) << 8; + l_bin2asc[lid42] = ((v420 < 10) ? '0' + v420 : 'a' - 10 + v420) << 0 + | ((v421 < 10) ? '0' + v421 : 'a' - 10 + v421) << 8; + l_bin2asc[lid43] = ((v430 < 10) ? '0' + v430 : 'a' - 10 + v430) << 0 + | ((v431 < 10) ? '0' + v431 : 'a' - 10 + v431) << 8; + + barrier (CLK_LOCAL_MEM_FENCE); + + if (gid >= gid_max) return; + + /** + * main + */ + + m04500s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset, l_bin2asc); +} diff --git a/amd/m04700_a0.cl b/amd/m04700_a0.cl new file mode 100644 index 0000000000..23743db921 --- /dev/null +++ b/amd/m04700_a0.cl @@ -0,0 +1,753 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _SHA1_MD5_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW4 +#define VECT_SIZE4 +#endif + +#ifdef VLIW5 +#define VECT_SIZE4 +#endif + +#define DGST_R0 3 +#define DGST_R1 4 +#define DGST_R2 2 +#define DGST_R3 1 + +#include "include/kernel_functions.c" +#undef _MD5_ +#include "types_amd.c" +#include "common_amd.c" +#include "include/rp_gpu.h" +#include "rp_amd.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +#ifdef VECT_SIZE1 +#define uint_to_hex_lower8_le(i) l_bin2asc[(i)] +#endif + +#ifdef VECT_SIZE2 +#define uint_to_hex_lower8_le(i) u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1]) +#endif + +#ifdef VECT_SIZE4 +#define uint_to_hex_lower8_le(i) u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3]) +#endif + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m04700_m04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + u32x pw_buf1[4]; + + pw_buf1[0] = pws[gid].i[ 4]; + pw_buf1[1] = pws[gid].i[ 5]; + pw_buf1[2] = pws[gid].i[ 6]; + pw_buf1[3] = pws[gid].i[ 7]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * bin2asc table + */ + + __local u32 l_bin2asc[256]; + + const u32 lid4 = lid * 4; + + const u32 lid40 = lid4 + 0; + const u32 lid41 = lid4 + 1; + const u32 lid42 = lid4 + 2; + const u32 lid43 = lid4 + 3; + + const u32 v400 = (lid40 >> 0) & 15; + const u32 v401 = (lid40 >> 4) & 15; + const u32 v410 = (lid41 >> 0) & 15; + const u32 v411 = (lid41 >> 4) & 15; + const u32 v420 = (lid42 >> 0) & 15; + const u32 v421 = (lid42 >> 4) & 15; + const u32 v430 = (lid43 >> 0) & 15; + const u32 v431 = (lid43 >> 4) & 15; + + l_bin2asc[lid40] = ((v400 < 10) ? '0' + v400 : 'a' - 10 + v400) << 0 + | ((v401 < 10) ? '0' + v401 : 'a' - 10 + v401) << 8; + l_bin2asc[lid41] = ((v410 < 10) ? '0' + v410 : 'a' - 10 + v410) << 0 + | ((v411 < 10) ? '0' + v411 : 'a' - 10 + v411) << 8; + l_bin2asc[lid42] = ((v420 < 10) ? '0' + v420 : 'a' - 10 + v420) << 0 + | ((v421 < 10) ? '0' + v421 : 'a' - 10 + v421) << 8; + l_bin2asc[lid43] = ((v430 < 10) ? '0' + v430 : 'a' - 10 + v430) << 0 + | ((v431 < 10) ? '0' + v431 : 'a' - 10 + v431) << 8; + + barrier (CLK_LOCAL_MEM_FENCE); + + if (gid >= gid_max) return; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + + w0[0] = pw_buf0[0]; + w0[1] = pw_buf0[1]; + w0[2] = pw_buf0[2]; + w0[3] = pw_buf0[3]; + + u32x w1[4]; + + w1[0] = pw_buf1[0]; + w1[1] = pw_buf1[1]; + w1[2] = pw_buf1[2]; + w1[3] = pw_buf1[3]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = pw_len * 8; + w3[3] = 0; + + const u32 out_len = apply_rules (rules_buf[il_pos].cmds, w0, w1, pw_len); + + append_0x80_2 (w0, w1, out_len); + + /** + * md5 + */ + + u32x a = MD5M_A; + u32x b = MD5M_B; + u32x c = MD5M_C; + u32x d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H , a, b, c, d, w1[1], MD5C20, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w2[0], MD5C21, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w2[3], MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w3[2], MD5C23, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w0[1], MD5C24, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w1[0], MD5C25, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w1[3], MD5C26, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w2[2], MD5C27, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w3[1], MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w0[0], MD5C29, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w0[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w1[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w2[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w3[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w3[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w0[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1[0], MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w2[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2[1], MD5C3f, MD5S33); + + a += MD5M_A; + b += MD5M_B; + c += MD5M_C; + d += MD5M_D; + + /* + * sha1 + */ + + u32x w0_t = uint_to_hex_lower8_le ((a >> 8) & 255) << 0 + | uint_to_hex_lower8_le ((a >> 0) & 255) << 16; + u32x w1_t = uint_to_hex_lower8_le ((a >> 24) & 255) << 0 + | uint_to_hex_lower8_le ((a >> 16) & 255) << 16; + u32x w2_t = uint_to_hex_lower8_le ((b >> 8) & 255) << 0 + | uint_to_hex_lower8_le ((b >> 0) & 255) << 16; + u32x w3_t = uint_to_hex_lower8_le ((b >> 24) & 255) << 0 + | uint_to_hex_lower8_le ((b >> 16) & 255) << 16; + u32x w4_t = uint_to_hex_lower8_le ((c >> 8) & 255) << 0 + | uint_to_hex_lower8_le ((c >> 0) & 255) << 16; + u32x w5_t = uint_to_hex_lower8_le ((c >> 24) & 255) << 0 + | uint_to_hex_lower8_le ((c >> 16) & 255) << 16; + u32x w6_t = uint_to_hex_lower8_le ((d >> 8) & 255) << 0 + | uint_to_hex_lower8_le ((d >> 0) & 255) << 16; + u32x w7_t = uint_to_hex_lower8_le ((d >> 24) & 255) << 0 + | uint_to_hex_lower8_le ((d >> 16) & 255) << 16; + + u32x w8_t = 0x80000000; + u32x w9_t = 0; + u32x wa_t = 0; + u32x wb_t = 0; + u32x wc_t = 0; + u32x wd_t = 0; + u32x we_t = 0; + u32x wf_t = 32 * 8; + + u32x e; + + a = SHA1M_A; + b = SHA1M_B; + c = SHA1M_C; + d = SHA1M_D; + e = SHA1M_E; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w0_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w1_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w2_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w3_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w4_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w5_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w6_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w7_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w8_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w9_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wa_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, wb_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, wc_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, wd_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, we_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F0o, e, a, b, c, d, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F0o, d, e, a, b, c, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F0o, c, d, e, a, b, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F0o, b, c, d, e, a, w3_t); + + #undef K + #define K SHA1C01 + + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w7_t); + + #undef K + #define K SHA1C02 + + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wb_t); + + #undef K + #define K SHA1C03 + + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wf_t); + + const u32x r0 = d; + const u32x r1 = e; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_M + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m04700_m08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m04700_m16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m04700_s04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + u32x pw_buf1[4]; + + pw_buf1[0] = pws[gid].i[ 4]; + pw_buf1[1] = pws[gid].i[ 5]; + pw_buf1[2] = pws[gid].i[ 6]; + pw_buf1[3] = pws[gid].i[ 7]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * bin2asc table + */ + + __local u32 l_bin2asc[256]; + + const u32 lid4 = lid * 4; + + const u32 lid40 = lid4 + 0; + const u32 lid41 = lid4 + 1; + const u32 lid42 = lid4 + 2; + const u32 lid43 = lid4 + 3; + + const u32 v400 = (lid40 >> 0) & 15; + const u32 v401 = (lid40 >> 4) & 15; + const u32 v410 = (lid41 >> 0) & 15; + const u32 v411 = (lid41 >> 4) & 15; + const u32 v420 = (lid42 >> 0) & 15; + const u32 v421 = (lid42 >> 4) & 15; + const u32 v430 = (lid43 >> 0) & 15; + const u32 v431 = (lid43 >> 4) & 15; + + l_bin2asc[lid40] = ((v400 < 10) ? '0' + v400 : 'a' - 10 + v400) << 0 + | ((v401 < 10) ? '0' + v401 : 'a' - 10 + v401) << 8; + l_bin2asc[lid41] = ((v410 < 10) ? '0' + v410 : 'a' - 10 + v410) << 0 + | ((v411 < 10) ? '0' + v411 : 'a' - 10 + v411) << 8; + l_bin2asc[lid42] = ((v420 < 10) ? '0' + v420 : 'a' - 10 + v420) << 0 + | ((v421 < 10) ? '0' + v421 : 'a' - 10 + v421) << 8; + l_bin2asc[lid43] = ((v430 < 10) ? '0' + v430 : 'a' - 10 + v430) << 0 + | ((v431 < 10) ? '0' + v431 : 'a' - 10 + v431) << 8; + + barrier (CLK_LOCAL_MEM_FENCE); + + if (gid >= gid_max) return; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * reverse + */ + + const u32 e_rev = rotl32 (search[1], 2u); + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + + w0[0] = pw_buf0[0]; + w0[1] = pw_buf0[1]; + w0[2] = pw_buf0[2]; + w0[3] = pw_buf0[3]; + + u32x w1[4]; + + w1[0] = pw_buf1[0]; + w1[1] = pw_buf1[1]; + w1[2] = pw_buf1[2]; + w1[3] = pw_buf1[3]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = pw_len * 8; + w3[3] = 0; + + const u32 out_len = apply_rules (rules_buf[il_pos].cmds, w0, w1, pw_len); + + append_0x80_2 (w0, w1, out_len); + + /** + * md5 + */ + + u32x a = MD5M_A; + u32x b = MD5M_B; + u32x c = MD5M_C; + u32x d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H , a, b, c, d, w1[1], MD5C20, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w2[0], MD5C21, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w2[3], MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w3[2], MD5C23, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w0[1], MD5C24, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w1[0], MD5C25, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w1[3], MD5C26, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w2[2], MD5C27, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w3[1], MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w0[0], MD5C29, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w0[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w1[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w2[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w3[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w3[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w0[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1[0], MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w2[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2[1], MD5C3f, MD5S33); + + a += MD5M_A; + b += MD5M_B; + c += MD5M_C; + d += MD5M_D; + + /* + * sha1 + */ + + u32x w0_t = uint_to_hex_lower8_le ((a >> 8) & 255) << 0 + | uint_to_hex_lower8_le ((a >> 0) & 255) << 16; + u32x w1_t = uint_to_hex_lower8_le ((a >> 24) & 255) << 0 + | uint_to_hex_lower8_le ((a >> 16) & 255) << 16; + u32x w2_t = uint_to_hex_lower8_le ((b >> 8) & 255) << 0 + | uint_to_hex_lower8_le ((b >> 0) & 255) << 16; + u32x w3_t = uint_to_hex_lower8_le ((b >> 24) & 255) << 0 + | uint_to_hex_lower8_le ((b >> 16) & 255) << 16; + u32x w4_t = uint_to_hex_lower8_le ((c >> 8) & 255) << 0 + | uint_to_hex_lower8_le ((c >> 0) & 255) << 16; + u32x w5_t = uint_to_hex_lower8_le ((c >> 24) & 255) << 0 + | uint_to_hex_lower8_le ((c >> 16) & 255) << 16; + u32x w6_t = uint_to_hex_lower8_le ((d >> 8) & 255) << 0 + | uint_to_hex_lower8_le ((d >> 0) & 255) << 16; + u32x w7_t = uint_to_hex_lower8_le ((d >> 24) & 255) << 0 + | uint_to_hex_lower8_le ((d >> 16) & 255) << 16; + + u32x w8_t = 0x80000000; + u32x w9_t = 0; + u32x wa_t = 0; + u32x wb_t = 0; + u32x wc_t = 0; + u32x wd_t = 0; + u32x we_t = 0; + u32x wf_t = 32 * 8; + + u32x e; + + a = SHA1M_A; + b = SHA1M_B; + c = SHA1M_C; + d = SHA1M_D; + e = SHA1M_E; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w0_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w1_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w2_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w3_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w4_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w5_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w6_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w7_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w8_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w9_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wa_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, wb_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, wc_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, wd_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, we_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F0o, e, a, b, c, d, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F0o, d, e, a, b, c, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F0o, c, d, e, a, b, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F0o, b, c, d, e, a, w3_t); + + #undef K + #define K SHA1C01 + + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w7_t); + + #undef K + #define K SHA1C02 + + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wb_t); + + #undef K + #define K SHA1C03 + + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wb_t); + + if (allx (e != e_rev)) continue; + + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wf_t); + + const u32x r0 = d; + const u32x r1 = e; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_S + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m04700_s08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m04700_s16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/amd/m04700_a1.cl b/amd/m04700_a1.cl new file mode 100644 index 0000000000..ff3133c362 --- /dev/null +++ b/amd/m04700_a1.cl @@ -0,0 +1,863 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _SHA1_MD5_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW4 +#define VECT_SIZE4 +#endif + +#ifdef VLIW5 +#define VECT_SIZE4 +#endif + +#define DGST_R0 3 +#define DGST_R1 4 +#define DGST_R2 2 +#define DGST_R3 1 + +#include "include/kernel_functions.c" +#undef _MD5_ +#include "types_amd.c" +#include "common_amd.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +#ifdef VECT_SIZE1 +#define uint_to_hex_lower8_le(i) l_bin2asc[(i)] +#endif + +#ifdef VECT_SIZE2 +#define uint_to_hex_lower8_le(i) u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1]) +#endif + +#ifdef VECT_SIZE4 +#define uint_to_hex_lower8_le(i) u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3]) +#endif + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m04700_m04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + append_0x80_2 (wordl0, wordl1, pw_l_len); + + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, combs_buf[0].pw_len); + } + + /** + * bin2asc table + */ + + __local u32 l_bin2asc[256]; + + const u32 lid4 = lid * 4; + + const u32 lid40 = lid4 + 0; + const u32 lid41 = lid4 + 1; + const u32 lid42 = lid4 + 2; + const u32 lid43 = lid4 + 3; + + const u32 v400 = (lid40 >> 0) & 15; + const u32 v401 = (lid40 >> 4) & 15; + const u32 v410 = (lid41 >> 0) & 15; + const u32 v411 = (lid41 >> 4) & 15; + const u32 v420 = (lid42 >> 0) & 15; + const u32 v421 = (lid42 >> 4) & 15; + const u32 v430 = (lid43 >> 0) & 15; + const u32 v431 = (lid43 >> 4) & 15; + + l_bin2asc[lid40] = ((v400 < 10) ? '0' + v400 : 'a' - 10 + v400) << 0 + | ((v401 < 10) ? '0' + v401 : 'a' - 10 + v401) << 8; + l_bin2asc[lid41] = ((v410 < 10) ? '0' + v410 : 'a' - 10 + v410) << 0 + | ((v411 < 10) ? '0' + v411 : 'a' - 10 + v411) << 8; + l_bin2asc[lid42] = ((v420 < 10) ? '0' + v420 : 'a' - 10 + v420) << 0 + | ((v421 < 10) ? '0' + v421 : 'a' - 10 + v421) << 8; + l_bin2asc[lid43] = ((v430 < 10) ? '0' + v430 : 'a' - 10 + v430) << 0 + | ((v431 < 10) ? '0' + v431 : 'a' - 10 + v431) << 8; + + barrier (CLK_LOCAL_MEM_FENCE); + + if (gid >= gid_max) return; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = combs_buf[il_pos].pw_len; + + const u32 pw_len = pw_l_len + pw_r_len; + + u32 wordr0[4]; + + wordr0[0] = combs_buf[il_pos].i[0]; + wordr0[1] = combs_buf[il_pos].i[1]; + wordr0[2] = combs_buf[il_pos].i[2]; + wordr0[3] = combs_buf[il_pos].i[3]; + + u32 wordr1[4]; + + wordr1[0] = combs_buf[il_pos].i[4]; + wordr1[1] = combs_buf[il_pos].i[5]; + wordr1[2] = combs_buf[il_pos].i[6]; + wordr1[3] = combs_buf[il_pos].i[7]; + + u32 wordr2[4]; + + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + + u32 wordr3[4]; + + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + append_0x80_2 (wordr0, wordr1, pw_r_len); + + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + u32x w0[4]; + + w0[0] = wordl0[0] | wordr0[0]; + w0[1] = wordl0[1] | wordr0[1]; + w0[2] = wordl0[2] | wordr0[2]; + w0[3] = wordl0[3] | wordr0[3]; + + u32x w1[4]; + + w1[0] = wordl1[0] | wordr1[0]; + w1[1] = wordl1[1] | wordr1[1]; + w1[2] = wordl1[2] | wordr1[2]; + w1[3] = wordl1[3] | wordr1[3]; + + u32x w2[4]; + + w2[0] = wordl2[0] | wordr2[0]; + w2[1] = wordl2[1] | wordr2[1]; + w2[2] = wordl2[2] | wordr2[2]; + w2[3] = wordl2[3] | wordr2[3]; + + u32x w3[4]; + + w3[0] = wordl3[0] | wordr3[0]; + w3[1] = wordl3[1] | wordr3[1]; + w3[2] = pw_len * 8; + w3[3] = 0; + + /** + * md5 + */ + + u32x a = MD5M_A; + u32x b = MD5M_B; + u32x c = MD5M_C; + u32x d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H , a, b, c, d, w1[1], MD5C20, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w2[0], MD5C21, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w2[3], MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w3[2], MD5C23, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w0[1], MD5C24, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w1[0], MD5C25, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w1[3], MD5C26, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w2[2], MD5C27, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w3[1], MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w0[0], MD5C29, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w0[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w1[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w2[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w3[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w3[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w0[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1[0], MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w2[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2[1], MD5C3f, MD5S33); + + a += MD5M_A; + b += MD5M_B; + c += MD5M_C; + d += MD5M_D; + + /* + * sha1 + */ + + u32x w0_t = uint_to_hex_lower8_le ((a >> 8) & 255) << 0 + | uint_to_hex_lower8_le ((a >> 0) & 255) << 16; + u32x w1_t = uint_to_hex_lower8_le ((a >> 24) & 255) << 0 + | uint_to_hex_lower8_le ((a >> 16) & 255) << 16; + u32x w2_t = uint_to_hex_lower8_le ((b >> 8) & 255) << 0 + | uint_to_hex_lower8_le ((b >> 0) & 255) << 16; + u32x w3_t = uint_to_hex_lower8_le ((b >> 24) & 255) << 0 + | uint_to_hex_lower8_le ((b >> 16) & 255) << 16; + u32x w4_t = uint_to_hex_lower8_le ((c >> 8) & 255) << 0 + | uint_to_hex_lower8_le ((c >> 0) & 255) << 16; + u32x w5_t = uint_to_hex_lower8_le ((c >> 24) & 255) << 0 + | uint_to_hex_lower8_le ((c >> 16) & 255) << 16; + u32x w6_t = uint_to_hex_lower8_le ((d >> 8) & 255) << 0 + | uint_to_hex_lower8_le ((d >> 0) & 255) << 16; + u32x w7_t = uint_to_hex_lower8_le ((d >> 24) & 255) << 0 + | uint_to_hex_lower8_le ((d >> 16) & 255) << 16; + + u32x w8_t = 0x80000000; + u32x w9_t = 0; + u32x wa_t = 0; + u32x wb_t = 0; + u32x wc_t = 0; + u32x wd_t = 0; + u32x we_t = 0; + u32x wf_t = 32 * 8; + + u32x e; + + a = SHA1M_A; + b = SHA1M_B; + c = SHA1M_C; + d = SHA1M_D; + e = SHA1M_E; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w0_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w1_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w2_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w3_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w4_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w5_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w6_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w7_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w8_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w9_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wa_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, wb_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, wc_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, wd_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, we_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F0o, e, a, b, c, d, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F0o, d, e, a, b, c, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F0o, c, d, e, a, b, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F0o, b, c, d, e, a, w3_t); + + #undef K + #define K SHA1C01 + + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w7_t); + + #undef K + #define K SHA1C02 + + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wb_t); + + #undef K + #define K SHA1C03 + + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wf_t); + + const u32x r0 = d; + const u32x r1 = e; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_M + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m04700_m08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m04700_m16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m04700_s04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + append_0x80_2 (wordl0, wordl1, pw_l_len); + + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, combs_buf[0].pw_len); + } + + /** + * bin2asc table + */ + + __local u32 l_bin2asc[256]; + + const u32 lid4 = lid * 4; + + const u32 lid40 = lid4 + 0; + const u32 lid41 = lid4 + 1; + const u32 lid42 = lid4 + 2; + const u32 lid43 = lid4 + 3; + + const u32 v400 = (lid40 >> 0) & 15; + const u32 v401 = (lid40 >> 4) & 15; + const u32 v410 = (lid41 >> 0) & 15; + const u32 v411 = (lid41 >> 4) & 15; + const u32 v420 = (lid42 >> 0) & 15; + const u32 v421 = (lid42 >> 4) & 15; + const u32 v430 = (lid43 >> 0) & 15; + const u32 v431 = (lid43 >> 4) & 15; + + l_bin2asc[lid40] = ((v400 < 10) ? '0' + v400 : 'a' - 10 + v400) << 0 + | ((v401 < 10) ? '0' + v401 : 'a' - 10 + v401) << 8; + l_bin2asc[lid41] = ((v410 < 10) ? '0' + v410 : 'a' - 10 + v410) << 0 + | ((v411 < 10) ? '0' + v411 : 'a' - 10 + v411) << 8; + l_bin2asc[lid42] = ((v420 < 10) ? '0' + v420 : 'a' - 10 + v420) << 0 + | ((v421 < 10) ? '0' + v421 : 'a' - 10 + v421) << 8; + l_bin2asc[lid43] = ((v430 < 10) ? '0' + v430 : 'a' - 10 + v430) << 0 + | ((v431 < 10) ? '0' + v431 : 'a' - 10 + v431) << 8; + + barrier (CLK_LOCAL_MEM_FENCE); + + if (gid >= gid_max) return; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * reverse + */ + + const u32 e_rev = rotl32 (search[1], 2u); + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = combs_buf[il_pos].pw_len; + + const u32 pw_len = pw_l_len + pw_r_len; + + u32 wordr0[4]; + + wordr0[0] = combs_buf[il_pos].i[0]; + wordr0[1] = combs_buf[il_pos].i[1]; + wordr0[2] = combs_buf[il_pos].i[2]; + wordr0[3] = combs_buf[il_pos].i[3]; + + u32 wordr1[4]; + + wordr1[0] = combs_buf[il_pos].i[4]; + wordr1[1] = combs_buf[il_pos].i[5]; + wordr1[2] = combs_buf[il_pos].i[6]; + wordr1[3] = combs_buf[il_pos].i[7]; + + u32 wordr2[4]; + + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + + u32 wordr3[4]; + + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + append_0x80_2 (wordr0, wordr1, pw_r_len); + + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + u32x w0[4]; + + w0[0] = wordl0[0] | wordr0[0]; + w0[1] = wordl0[1] | wordr0[1]; + w0[2] = wordl0[2] | wordr0[2]; + w0[3] = wordl0[3] | wordr0[3]; + + u32x w1[4]; + + w1[0] = wordl1[0] | wordr1[0]; + w1[1] = wordl1[1] | wordr1[1]; + w1[2] = wordl1[2] | wordr1[2]; + w1[3] = wordl1[3] | wordr1[3]; + + u32x w2[4]; + + w2[0] = wordl2[0] | wordr2[0]; + w2[1] = wordl2[1] | wordr2[1]; + w2[2] = wordl2[2] | wordr2[2]; + w2[3] = wordl2[3] | wordr2[3]; + + u32x w3[4]; + + w3[0] = wordl3[0] | wordr3[0]; + w3[1] = wordl3[1] | wordr3[1]; + w3[2] = pw_len * 8; + w3[3] = 0; + + /** + * md5 + */ + + u32x a = MD5M_A; + u32x b = MD5M_B; + u32x c = MD5M_C; + u32x d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H , a, b, c, d, w1[1], MD5C20, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w2[0], MD5C21, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w2[3], MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w3[2], MD5C23, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w0[1], MD5C24, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w1[0], MD5C25, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w1[3], MD5C26, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w2[2], MD5C27, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w3[1], MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w0[0], MD5C29, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w0[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w1[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w2[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w3[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w3[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w0[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1[0], MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w2[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2[1], MD5C3f, MD5S33); + + a += MD5M_A; + b += MD5M_B; + c += MD5M_C; + d += MD5M_D; + + /* + * sha1 + */ + + u32x w0_t = uint_to_hex_lower8_le ((a >> 8) & 255) << 0 + | uint_to_hex_lower8_le ((a >> 0) & 255) << 16; + u32x w1_t = uint_to_hex_lower8_le ((a >> 24) & 255) << 0 + | uint_to_hex_lower8_le ((a >> 16) & 255) << 16; + u32x w2_t = uint_to_hex_lower8_le ((b >> 8) & 255) << 0 + | uint_to_hex_lower8_le ((b >> 0) & 255) << 16; + u32x w3_t = uint_to_hex_lower8_le ((b >> 24) & 255) << 0 + | uint_to_hex_lower8_le ((b >> 16) & 255) << 16; + u32x w4_t = uint_to_hex_lower8_le ((c >> 8) & 255) << 0 + | uint_to_hex_lower8_le ((c >> 0) & 255) << 16; + u32x w5_t = uint_to_hex_lower8_le ((c >> 24) & 255) << 0 + | uint_to_hex_lower8_le ((c >> 16) & 255) << 16; + u32x w6_t = uint_to_hex_lower8_le ((d >> 8) & 255) << 0 + | uint_to_hex_lower8_le ((d >> 0) & 255) << 16; + u32x w7_t = uint_to_hex_lower8_le ((d >> 24) & 255) << 0 + | uint_to_hex_lower8_le ((d >> 16) & 255) << 16; + + u32x w8_t = 0x80000000; + u32x w9_t = 0; + u32x wa_t = 0; + u32x wb_t = 0; + u32x wc_t = 0; + u32x wd_t = 0; + u32x we_t = 0; + u32x wf_t = 32 * 8; + + u32x e; + + a = SHA1M_A; + b = SHA1M_B; + c = SHA1M_C; + d = SHA1M_D; + e = SHA1M_E; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w0_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w1_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w2_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w3_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w4_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w5_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w6_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w7_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w8_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w9_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wa_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, wb_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, wc_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, wd_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, we_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F0o, e, a, b, c, d, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F0o, d, e, a, b, c, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F0o, c, d, e, a, b, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F0o, b, c, d, e, a, w3_t); + + #undef K + #define K SHA1C01 + + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w7_t); + + #undef K + #define K SHA1C02 + + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wb_t); + + #undef K + #define K SHA1C03 + + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wb_t); + + if (allx (e != e_rev)) continue; + + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wf_t); + + const u32x r0 = d; + const u32x r1 = e; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_S + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m04700_s08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m04700_s16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/amd/m04700_a3.cl b/amd/m04700_a3.cl new file mode 100644 index 0000000000..0c5628c134 --- /dev/null +++ b/amd/m04700_a3.cl @@ -0,0 +1,1088 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _SHA1_MD5_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW4 +#define VECT_SIZE4 +#endif + +#ifdef VLIW5 +#define VECT_SIZE4 +#endif + +#define DGST_R0 3 +#define DGST_R1 4 +#define DGST_R2 2 +#define DGST_R3 1 + +#include "include/kernel_functions.c" +#undef _MD5_ +#include "types_amd.c" +#include "common_amd.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +#ifdef VECT_SIZE1 +#define uint_to_hex_lower8_le(i) l_bin2asc[(i)] +#endif + +#ifdef VECT_SIZE2 +#define uint_to_hex_lower8_le(i) u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1]) +#endif + +#ifdef VECT_SIZE4 +#define uint_to_hex_lower8_le(i) u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3]) +#endif + +static void m04700m (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], const u32 pw_len, __global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, __local u32 l_bin2asc[256]) +{ + /** + * modifier + */ + + const u32 gid = get_global_id (0); + const u32 lid = get_local_id (0); + + /** + * loop + */ + + u32x w0l = w0[0]; + + for (u32 il_pos = 0; il_pos < bfs_cnt; il_pos++) + { + const u32 w0r = bfs_buf[il_pos].i; + + w0[0] = w0l | w0r; + + /** + * md5 + */ + + u32x a = MD5M_A; + u32x b = MD5M_B; + u32x c = MD5M_C; + u32x d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H , a, b, c, d, w1[1], MD5C20, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w2[0], MD5C21, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w2[3], MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w3[2], MD5C23, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w0[1], MD5C24, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w1[0], MD5C25, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w1[3], MD5C26, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w2[2], MD5C27, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w3[1], MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w0[0], MD5C29, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w0[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w1[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w2[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w3[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w3[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w0[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1[0], MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w2[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2[1], MD5C3f, MD5S33); + + a += MD5M_A; + b += MD5M_B; + c += MD5M_C; + d += MD5M_D; + + /* + * sha1 + */ + + u32x w0_t = uint_to_hex_lower8_le ((a >> 8) & 255) << 0 + | uint_to_hex_lower8_le ((a >> 0) & 255) << 16; + u32x w1_t = uint_to_hex_lower8_le ((a >> 24) & 255) << 0 + | uint_to_hex_lower8_le ((a >> 16) & 255) << 16; + u32x w2_t = uint_to_hex_lower8_le ((b >> 8) & 255) << 0 + | uint_to_hex_lower8_le ((b >> 0) & 255) << 16; + u32x w3_t = uint_to_hex_lower8_le ((b >> 24) & 255) << 0 + | uint_to_hex_lower8_le ((b >> 16) & 255) << 16; + u32x w4_t = uint_to_hex_lower8_le ((c >> 8) & 255) << 0 + | uint_to_hex_lower8_le ((c >> 0) & 255) << 16; + u32x w5_t = uint_to_hex_lower8_le ((c >> 24) & 255) << 0 + | uint_to_hex_lower8_le ((c >> 16) & 255) << 16; + u32x w6_t = uint_to_hex_lower8_le ((d >> 8) & 255) << 0 + | uint_to_hex_lower8_le ((d >> 0) & 255) << 16; + u32x w7_t = uint_to_hex_lower8_le ((d >> 24) & 255) << 0 + | uint_to_hex_lower8_le ((d >> 16) & 255) << 16; + + u32x w8_t = 0x80000000; + u32x w9_t = 0; + u32x wa_t = 0; + u32x wb_t = 0; + u32x wc_t = 0; + u32x wd_t = 0; + u32x we_t = 0; + u32x wf_t = 32 * 8; + + u32x e; + + a = SHA1M_A; + b = SHA1M_B; + c = SHA1M_C; + d = SHA1M_D; + e = SHA1M_E; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w0_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w1_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w2_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w3_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w4_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w5_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w6_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w7_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w8_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w9_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wa_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, wb_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, wc_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, wd_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, we_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F0o, e, a, b, c, d, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F0o, d, e, a, b, c, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F0o, c, d, e, a, b, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F0o, b, c, d, e, a, w3_t); + + #undef K + #define K SHA1C01 + + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w7_t); + + #undef K + #define K SHA1C02 + + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wb_t); + + #undef K + #define K SHA1C03 + + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wf_t); + + const u32x r0 = d; + const u32x r1 = e; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_M + } +} + +static void m04700s (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], const u32 pw_len, __global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, __local u32 l_bin2asc[256]) +{ + /** + * modifier + */ + + const u32 gid = get_global_id (0); + const u32 lid = get_local_id (0); + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * reverse + */ + + const u32 e_rev = rotl32 (search[1], 2u); + + /** + * loop + */ + + u32x w0l = w0[0]; + + for (u32 il_pos = 0; il_pos < bfs_cnt; il_pos++) + { + const u32 w0r = bfs_buf[il_pos].i; + + w0[0] = w0l | w0r; + + /** + * md5 + */ + + u32x a = MD5M_A; + u32x b = MD5M_B; + u32x c = MD5M_C; + u32x d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H , a, b, c, d, w1[1], MD5C20, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w2[0], MD5C21, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w2[3], MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w3[2], MD5C23, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w0[1], MD5C24, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w1[0], MD5C25, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w1[3], MD5C26, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w2[2], MD5C27, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w3[1], MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w0[0], MD5C29, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w0[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w1[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w2[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w3[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w3[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w0[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1[0], MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w2[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2[1], MD5C3f, MD5S33); + + a += MD5M_A; + b += MD5M_B; + c += MD5M_C; + d += MD5M_D; + + /* + * sha1 + */ + + u32x w0_t = uint_to_hex_lower8_le ((a >> 8) & 255) << 0 + | uint_to_hex_lower8_le ((a >> 0) & 255) << 16; + u32x w1_t = uint_to_hex_lower8_le ((a >> 24) & 255) << 0 + | uint_to_hex_lower8_le ((a >> 16) & 255) << 16; + u32x w2_t = uint_to_hex_lower8_le ((b >> 8) & 255) << 0 + | uint_to_hex_lower8_le ((b >> 0) & 255) << 16; + u32x w3_t = uint_to_hex_lower8_le ((b >> 24) & 255) << 0 + | uint_to_hex_lower8_le ((b >> 16) & 255) << 16; + u32x w4_t = uint_to_hex_lower8_le ((c >> 8) & 255) << 0 + | uint_to_hex_lower8_le ((c >> 0) & 255) << 16; + u32x w5_t = uint_to_hex_lower8_le ((c >> 24) & 255) << 0 + | uint_to_hex_lower8_le ((c >> 16) & 255) << 16; + u32x w6_t = uint_to_hex_lower8_le ((d >> 8) & 255) << 0 + | uint_to_hex_lower8_le ((d >> 0) & 255) << 16; + u32x w7_t = uint_to_hex_lower8_le ((d >> 24) & 255) << 0 + | uint_to_hex_lower8_le ((d >> 16) & 255) << 16; + + u32x w8_t = 0x80000000; + u32x w9_t = 0; + u32x wa_t = 0; + u32x wb_t = 0; + u32x wc_t = 0; + u32x wd_t = 0; + u32x we_t = 0; + u32x wf_t = 32 * 8; + + u32x e; + + a = SHA1M_A; + b = SHA1M_B; + c = SHA1M_C; + d = SHA1M_D; + e = SHA1M_E; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w0_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w1_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w2_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w3_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w4_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w5_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w6_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w7_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w8_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w9_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wa_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, wb_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, wc_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, wd_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, we_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F0o, e, a, b, c, d, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F0o, d, e, a, b, c, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F0o, c, d, e, a, b, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F0o, b, c, d, e, a, w3_t); + + #undef K + #define K SHA1C01 + + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w7_t); + + #undef K + #define K SHA1C02 + + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wb_t); + + #undef K + #define K SHA1C03 + + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wb_t); + + if (allx (e != e_rev)) continue; + + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wf_t); + + const u32x r0 = d; + const u32x r1 = e; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_S + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m04700_m04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = pws[gid].i[14]; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * bin2asc table + */ + + __local u32 l_bin2asc[256]; + + const u32 lid4 = lid * 4; + + const u32 lid40 = lid4 + 0; + const u32 lid41 = lid4 + 1; + const u32 lid42 = lid4 + 2; + const u32 lid43 = lid4 + 3; + + const u32 v400 = (lid40 >> 0) & 15; + const u32 v401 = (lid40 >> 4) & 15; + const u32 v410 = (lid41 >> 0) & 15; + const u32 v411 = (lid41 >> 4) & 15; + const u32 v420 = (lid42 >> 0) & 15; + const u32 v421 = (lid42 >> 4) & 15; + const u32 v430 = (lid43 >> 0) & 15; + const u32 v431 = (lid43 >> 4) & 15; + + l_bin2asc[lid40] = ((v400 < 10) ? '0' + v400 : 'a' - 10 + v400) << 0 + | ((v401 < 10) ? '0' + v401 : 'a' - 10 + v401) << 8; + l_bin2asc[lid41] = ((v410 < 10) ? '0' + v410 : 'a' - 10 + v410) << 0 + | ((v411 < 10) ? '0' + v411 : 'a' - 10 + v411) << 8; + l_bin2asc[lid42] = ((v420 < 10) ? '0' + v420 : 'a' - 10 + v420) << 0 + | ((v421 < 10) ? '0' + v421 : 'a' - 10 + v421) << 8; + l_bin2asc[lid43] = ((v430 < 10) ? '0' + v430 : 'a' - 10 + v430) << 0 + | ((v431 < 10) ? '0' + v431 : 'a' - 10 + v431) << 8; + + barrier (CLK_LOCAL_MEM_FENCE); + + if (gid >= gid_max) return; + + /** + * main + */ + + m04700m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset, l_bin2asc); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m04700_m08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = pws[gid].i[14]; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * bin2asc table + */ + + __local u32 l_bin2asc[256]; + + const u32 lid4 = lid * 4; + + const u32 lid40 = lid4 + 0; + const u32 lid41 = lid4 + 1; + const u32 lid42 = lid4 + 2; + const u32 lid43 = lid4 + 3; + + const u32 v400 = (lid40 >> 0) & 15; + const u32 v401 = (lid40 >> 4) & 15; + const u32 v410 = (lid41 >> 0) & 15; + const u32 v411 = (lid41 >> 4) & 15; + const u32 v420 = (lid42 >> 0) & 15; + const u32 v421 = (lid42 >> 4) & 15; + const u32 v430 = (lid43 >> 0) & 15; + const u32 v431 = (lid43 >> 4) & 15; + + l_bin2asc[lid40] = ((v400 < 10) ? '0' + v400 : 'a' - 10 + v400) << 0 + | ((v401 < 10) ? '0' + v401 : 'a' - 10 + v401) << 8; + l_bin2asc[lid41] = ((v410 < 10) ? '0' + v410 : 'a' - 10 + v410) << 0 + | ((v411 < 10) ? '0' + v411 : 'a' - 10 + v411) << 8; + l_bin2asc[lid42] = ((v420 < 10) ? '0' + v420 : 'a' - 10 + v420) << 0 + | ((v421 < 10) ? '0' + v421 : 'a' - 10 + v421) << 8; + l_bin2asc[lid43] = ((v430 < 10) ? '0' + v430 : 'a' - 10 + v430) << 0 + | ((v431 < 10) ? '0' + v431 : 'a' - 10 + v431) << 8; + + barrier (CLK_LOCAL_MEM_FENCE); + + if (gid >= gid_max) return; + + /** + * main + */ + + m04700m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset, l_bin2asc); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m04700_m16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = pws[gid].i[ 8]; + w2[1] = pws[gid].i[ 9]; + w2[2] = pws[gid].i[10]; + w2[3] = pws[gid].i[11]; + + u32x w3[4]; + + w3[0] = pws[gid].i[12]; + w3[1] = pws[gid].i[13]; + w3[2] = pws[gid].i[14]; + w3[3] = pws[gid].i[15]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * bin2asc table + */ + + __local u32 l_bin2asc[256]; + + const u32 lid4 = lid * 4; + + const u32 lid40 = lid4 + 0; + const u32 lid41 = lid4 + 1; + const u32 lid42 = lid4 + 2; + const u32 lid43 = lid4 + 3; + + const u32 v400 = (lid40 >> 0) & 15; + const u32 v401 = (lid40 >> 4) & 15; + const u32 v410 = (lid41 >> 0) & 15; + const u32 v411 = (lid41 >> 4) & 15; + const u32 v420 = (lid42 >> 0) & 15; + const u32 v421 = (lid42 >> 4) & 15; + const u32 v430 = (lid43 >> 0) & 15; + const u32 v431 = (lid43 >> 4) & 15; + + l_bin2asc[lid40] = ((v400 < 10) ? '0' + v400 : 'a' - 10 + v400) << 0 + | ((v401 < 10) ? '0' + v401 : 'a' - 10 + v401) << 8; + l_bin2asc[lid41] = ((v410 < 10) ? '0' + v410 : 'a' - 10 + v410) << 0 + | ((v411 < 10) ? '0' + v411 : 'a' - 10 + v411) << 8; + l_bin2asc[lid42] = ((v420 < 10) ? '0' + v420 : 'a' - 10 + v420) << 0 + | ((v421 < 10) ? '0' + v421 : 'a' - 10 + v421) << 8; + l_bin2asc[lid43] = ((v430 < 10) ? '0' + v430 : 'a' - 10 + v430) << 0 + | ((v431 < 10) ? '0' + v431 : 'a' - 10 + v431) << 8; + + barrier (CLK_LOCAL_MEM_FENCE); + + if (gid >= gid_max) return; + + /** + * main + */ + + m04700m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset, l_bin2asc); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m04700_s04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = pws[gid].i[14]; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * bin2asc table + */ + + __local u32 l_bin2asc[256]; + + const u32 lid4 = lid * 4; + + const u32 lid40 = lid4 + 0; + const u32 lid41 = lid4 + 1; + const u32 lid42 = lid4 + 2; + const u32 lid43 = lid4 + 3; + + const u32 v400 = (lid40 >> 0) & 15; + const u32 v401 = (lid40 >> 4) & 15; + const u32 v410 = (lid41 >> 0) & 15; + const u32 v411 = (lid41 >> 4) & 15; + const u32 v420 = (lid42 >> 0) & 15; + const u32 v421 = (lid42 >> 4) & 15; + const u32 v430 = (lid43 >> 0) & 15; + const u32 v431 = (lid43 >> 4) & 15; + + l_bin2asc[lid40] = ((v400 < 10) ? '0' + v400 : 'a' - 10 + v400) << 0 + | ((v401 < 10) ? '0' + v401 : 'a' - 10 + v401) << 8; + l_bin2asc[lid41] = ((v410 < 10) ? '0' + v410 : 'a' - 10 + v410) << 0 + | ((v411 < 10) ? '0' + v411 : 'a' - 10 + v411) << 8; + l_bin2asc[lid42] = ((v420 < 10) ? '0' + v420 : 'a' - 10 + v420) << 0 + | ((v421 < 10) ? '0' + v421 : 'a' - 10 + v421) << 8; + l_bin2asc[lid43] = ((v430 < 10) ? '0' + v430 : 'a' - 10 + v430) << 0 + | ((v431 < 10) ? '0' + v431 : 'a' - 10 + v431) << 8; + + barrier (CLK_LOCAL_MEM_FENCE); + + if (gid >= gid_max) return; + + /** + * main + */ + + m04700s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset, l_bin2asc); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m04700_s08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = pws[gid].i[14]; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * bin2asc table + */ + + __local u32 l_bin2asc[256]; + + const u32 lid4 = lid * 4; + + const u32 lid40 = lid4 + 0; + const u32 lid41 = lid4 + 1; + const u32 lid42 = lid4 + 2; + const u32 lid43 = lid4 + 3; + + const u32 v400 = (lid40 >> 0) & 15; + const u32 v401 = (lid40 >> 4) & 15; + const u32 v410 = (lid41 >> 0) & 15; + const u32 v411 = (lid41 >> 4) & 15; + const u32 v420 = (lid42 >> 0) & 15; + const u32 v421 = (lid42 >> 4) & 15; + const u32 v430 = (lid43 >> 0) & 15; + const u32 v431 = (lid43 >> 4) & 15; + + l_bin2asc[lid40] = ((v400 < 10) ? '0' + v400 : 'a' - 10 + v400) << 0 + | ((v401 < 10) ? '0' + v401 : 'a' - 10 + v401) << 8; + l_bin2asc[lid41] = ((v410 < 10) ? '0' + v410 : 'a' - 10 + v410) << 0 + | ((v411 < 10) ? '0' + v411 : 'a' - 10 + v411) << 8; + l_bin2asc[lid42] = ((v420 < 10) ? '0' + v420 : 'a' - 10 + v420) << 0 + | ((v421 < 10) ? '0' + v421 : 'a' - 10 + v421) << 8; + l_bin2asc[lid43] = ((v430 < 10) ? '0' + v430 : 'a' - 10 + v430) << 0 + | ((v431 < 10) ? '0' + v431 : 'a' - 10 + v431) << 8; + + barrier (CLK_LOCAL_MEM_FENCE); + + if (gid >= gid_max) return; + + /** + * main + */ + + m04700s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset, l_bin2asc); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m04700_s16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = pws[gid].i[ 8]; + w2[1] = pws[gid].i[ 9]; + w2[2] = pws[gid].i[10]; + w2[3] = pws[gid].i[11]; + + u32x w3[4]; + + w3[0] = pws[gid].i[12]; + w3[1] = pws[gid].i[13]; + w3[2] = pws[gid].i[14]; + w3[3] = pws[gid].i[15]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * bin2asc table + */ + + __local u32 l_bin2asc[256]; + + const u32 lid4 = lid * 4; + + const u32 lid40 = lid4 + 0; + const u32 lid41 = lid4 + 1; + const u32 lid42 = lid4 + 2; + const u32 lid43 = lid4 + 3; + + const u32 v400 = (lid40 >> 0) & 15; + const u32 v401 = (lid40 >> 4) & 15; + const u32 v410 = (lid41 >> 0) & 15; + const u32 v411 = (lid41 >> 4) & 15; + const u32 v420 = (lid42 >> 0) & 15; + const u32 v421 = (lid42 >> 4) & 15; + const u32 v430 = (lid43 >> 0) & 15; + const u32 v431 = (lid43 >> 4) & 15; + + l_bin2asc[lid40] = ((v400 < 10) ? '0' + v400 : 'a' - 10 + v400) << 0 + | ((v401 < 10) ? '0' + v401 : 'a' - 10 + v401) << 8; + l_bin2asc[lid41] = ((v410 < 10) ? '0' + v410 : 'a' - 10 + v410) << 0 + | ((v411 < 10) ? '0' + v411 : 'a' - 10 + v411) << 8; + l_bin2asc[lid42] = ((v420 < 10) ? '0' + v420 : 'a' - 10 + v420) << 0 + | ((v421 < 10) ? '0' + v421 : 'a' - 10 + v421) << 8; + l_bin2asc[lid43] = ((v430 < 10) ? '0' + v430 : 'a' - 10 + v430) << 0 + | ((v431 < 10) ? '0' + v431 : 'a' - 10 + v431) << 8; + + barrier (CLK_LOCAL_MEM_FENCE); + + if (gid >= gid_max) return; + + /** + * main + */ + + m04700s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset, l_bin2asc); +} diff --git a/amd/m04800_a0.cl b/amd/m04800_a0.cl new file mode 100644 index 0000000000..5b9b4077b8 --- /dev/null +++ b/amd/m04800_a0.cl @@ -0,0 +1,548 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _MD5_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW4 +#define VECT_SIZE4 +#endif + +#ifdef VLIW5 +#define VECT_SIZE4 +#endif + +#define DGST_R0 0 +#define DGST_R1 3 +#define DGST_R2 2 +#define DGST_R3 1 + +#include "include/kernel_functions.c" +#include "types_amd.c" +#include "common_amd.c" +#include "include/rp_gpu.h" +#include "rp_amd.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m04800_m04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + u32x pw_buf1[4]; + + pw_buf1[0] = pws[gid].i[ 4]; + pw_buf1[1] = pws[gid].i[ 5]; + pw_buf1[2] = pws[gid].i[ 6]; + pw_buf1[3] = pws[gid].i[ 7]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * salt + */ + + u32 salt_buf[5]; + + salt_buf[0] = salt_bufs[salt_pos].salt_buf[0]; + salt_buf[1] = salt_bufs[salt_pos].salt_buf[1]; + salt_buf[2] = salt_bufs[salt_pos].salt_buf[2]; + salt_buf[3] = salt_bufs[salt_pos].salt_buf[3]; + salt_buf[4] = salt_bufs[salt_pos].salt_buf[4]; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + + w0[0] = pw_buf0[0]; + w0[1] = pw_buf0[1]; + w0[2] = pw_buf0[2]; + w0[3] = pw_buf0[3]; + + u32x w1[4]; + + w1[0] = pw_buf1[0]; + w1[1] = pw_buf1[1]; + w1[2] = pw_buf1[2]; + w1[3] = pw_buf1[3]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 out_len = apply_rules (rules_buf[il_pos].cmds, w0, w1, pw_len); + + u32 pw_salt_len = out_len + salt_len; + + /** + * append salt + */ + + u32 s0[4]; + + s0[0] = salt_buf[0]; + s0[1] = salt_buf[1]; + s0[2] = salt_buf[2]; + s0[3] = salt_buf[3]; + + u32 s1[4]; + + s1[0] = 0x80; + s1[1] = 0; + s1[2] = 0; + s1[3] = 0; + + u32 s2[4]; + + s2[0] = 0; + s2[1] = 0; + s2[2] = 0; + s2[3] = 0; + + u32 s3[4]; + + s3[0] = 0; + s3[1] = 0; + s3[2] = 0; + s3[3] = 0; + + switch_buffer_by_offset (s0, s1, s2, s3, out_len); + + w0[0] |= s0[0]; + w0[1] |= s0[1]; + w0[2] |= s0[2]; + w0[3] |= s0[3]; + + w1[0] |= s1[0]; + w1[1] |= s1[1]; + w1[2] |= s1[2]; + w1[3] |= s1[3]; + + w2[0] |= s2[0]; + w2[1] |= s2[1]; + w2[2] |= s2[2]; + w2[3] |= s2[3]; + + w3[0] |= s3[0]; + w3[1] |= s3[1]; + w3[2] = 0; + w3[3] = 0; + + /* + * add id byte + */ + + switch_buffer_by_offset (w0, w1, w2, w3, 1); + + w0[0] |= salt_buf[4]; + + w3[2] = pw_salt_len * 8; + + /** + * md5 + */ + + u32x a = MD5M_A; + u32x b = MD5M_B; + u32x c = MD5M_C; + u32x d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H , a, b, c, d, w1[1], MD5C20, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w2[0], MD5C21, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w2[3], MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w3[2], MD5C23, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w0[1], MD5C24, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w1[0], MD5C25, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w1[3], MD5C26, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w2[2], MD5C27, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w3[1], MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w0[0], MD5C29, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w0[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w1[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w2[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w3[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w3[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w0[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1[0], MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w2[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2[1], MD5C3f, MD5S33); + + const u32x r0 = a; + const u32x r1 = d; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_M + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m04800_m08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m04800_m16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m04800_s04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + u32x pw_buf1[4]; + + pw_buf1[0] = pws[gid].i[ 4]; + pw_buf1[1] = pws[gid].i[ 5]; + pw_buf1[2] = pws[gid].i[ 6]; + pw_buf1[3] = pws[gid].i[ 7]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * salt + */ + + u32 salt_buf[5]; + + salt_buf[0] = salt_bufs[salt_pos].salt_buf[0]; + salt_buf[1] = salt_bufs[salt_pos].salt_buf[1]; + salt_buf[2] = salt_bufs[salt_pos].salt_buf[2]; + salt_buf[3] = salt_bufs[salt_pos].salt_buf[3]; + salt_buf[4] = salt_bufs[salt_pos].salt_buf[4]; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + + w0[0] = pw_buf0[0]; + w0[1] = pw_buf0[1]; + w0[2] = pw_buf0[2]; + w0[3] = pw_buf0[3]; + + u32x w1[4]; + + w1[0] = pw_buf1[0]; + w1[1] = pw_buf1[1]; + w1[2] = pw_buf1[2]; + w1[3] = pw_buf1[3]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 out_len = apply_rules (rules_buf[il_pos].cmds, w0, w1, pw_len); + + u32 pw_salt_len = out_len + salt_len; + + /** + * append salt + */ + + u32 s0[4]; + + s0[0] = salt_buf[0]; + s0[1] = salt_buf[1]; + s0[2] = salt_buf[2]; + s0[3] = salt_buf[3]; + + u32 s1[4]; + + s1[0] = 0x80; + s1[1] = 0; + s1[2] = 0; + s1[3] = 0; + + u32 s2[4]; + + s2[0] = 0; + s2[1] = 0; + s2[2] = 0; + s2[3] = 0; + + u32 s3[4]; + + s3[0] = 0; + s3[1] = 0; + s3[2] = 0; + s3[3] = 0; + + switch_buffer_by_offset (s0, s1, s2, s3, out_len); + + w0[0] |= s0[0]; + w0[1] |= s0[1]; + w0[2] |= s0[2]; + w0[3] |= s0[3]; + + w1[0] |= s1[0]; + w1[1] |= s1[1]; + w1[2] |= s1[2]; + w1[3] |= s1[3]; + + w2[0] |= s2[0]; + w2[1] |= s2[1]; + w2[2] |= s2[2]; + w2[3] |= s2[3]; + + w3[0] |= s3[0]; + w3[1] |= s3[1]; + w3[2] = 0; + w3[3] = 0; + + /* + * add id byte + */ + + switch_buffer_by_offset (w0, w1, w2, w3, 1); + + w0[0] |= salt_buf[4]; + + w3[2] = pw_salt_len * 8; + + /** + * md5 + */ + + u32x a = MD5M_A; + u32x b = MD5M_B; + u32x c = MD5M_C; + u32x d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H , a, b, c, d, w1[1], MD5C20, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w2[0], MD5C21, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w2[3], MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w3[2], MD5C23, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w0[1], MD5C24, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w1[0], MD5C25, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w1[3], MD5C26, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w2[2], MD5C27, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w3[1], MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w0[0], MD5C29, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w0[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w1[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w2[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w3[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w3[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w0[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1[0], MD5C3c, MD5S30); + + bool q_cond = allx (search[0] != a); + + if (q_cond) continue; + + MD5_STEP (MD5_I , d, a, b, c, w2[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2[1], MD5C3f, MD5S33); + + const u32x r0 = a; + const u32x r1 = d; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_S + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m04800_s08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m04800_s16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/amd/m04800_a1.cl b/amd/m04800_a1.cl new file mode 100644 index 0000000000..e5d9877a33 --- /dev/null +++ b/amd/m04800_a1.cl @@ -0,0 +1,644 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _MD5_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW4 +#define VECT_SIZE4 +#endif + +#ifdef VLIW5 +#define VECT_SIZE4 +#endif + +#define DGST_R0 0 +#define DGST_R1 3 +#define DGST_R2 2 +#define DGST_R3 1 + +#include "include/kernel_functions.c" +#include "types_amd.c" +#include "common_amd.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m04800_m04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, combs_buf[0].pw_len); + } + + /** + * salt + */ + + u32 salt_buf[5]; + + salt_buf[0] = salt_bufs[salt_pos].salt_buf[0]; + salt_buf[1] = salt_bufs[salt_pos].salt_buf[1]; + salt_buf[2] = salt_bufs[salt_pos].salt_buf[2]; + salt_buf[3] = salt_bufs[salt_pos].salt_buf[3]; + salt_buf[4] = salt_bufs[salt_pos].salt_buf[4]; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = combs_buf[il_pos].pw_len; + + const u32 pw_len = pw_l_len + pw_r_len; + + u32 wordr0[4]; + + wordr0[0] = combs_buf[il_pos].i[0]; + wordr0[1] = combs_buf[il_pos].i[1]; + wordr0[2] = combs_buf[il_pos].i[2]; + wordr0[3] = combs_buf[il_pos].i[3]; + + u32 wordr1[4]; + + wordr1[0] = combs_buf[il_pos].i[4]; + wordr1[1] = combs_buf[il_pos].i[5]; + wordr1[2] = combs_buf[il_pos].i[6]; + wordr1[3] = combs_buf[il_pos].i[7]; + + u32 wordr2[4]; + + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + + u32 wordr3[4]; + + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + u32x w0[4]; + + w0[0] = wordl0[0] | wordr0[0]; + w0[1] = wordl0[1] | wordr0[1]; + w0[2] = wordl0[2] | wordr0[2]; + w0[3] = wordl0[3] | wordr0[3]; + + u32x w1[4]; + + w1[0] = wordl1[0] | wordr1[0]; + w1[1] = wordl1[1] | wordr1[1]; + w1[2] = wordl1[2] | wordr1[2]; + w1[3] = wordl1[3] | wordr1[3]; + + u32x w2[4]; + + w2[0] = wordl2[0] | wordr2[0]; + w2[1] = wordl2[1] | wordr2[1]; + w2[2] = wordl2[2] | wordr2[2]; + w2[3] = wordl2[3] | wordr2[3]; + + u32x w3[4]; + + w3[0] = wordl3[0] | wordr3[0]; + w3[1] = wordl3[1] | wordr3[1]; + w3[2] = wordl3[2] | wordr3[2]; + w3[3] = wordl3[3] | wordr3[3]; + + /* + * add id byte + */ + + switch_buffer_by_offset (w0, w1, w2, w3, 1); + + w0[0] |= salt_buf[4]; + + /** + * append salt + */ + + u32 s0[4]; + + s0[0] = salt_buf[0]; + s0[1] = salt_buf[1]; + s0[2] = salt_buf[2]; + s0[3] = salt_buf[3]; + + u32 s1[4]; + + s1[0] = 0x80; + s1[1] = 0; + s1[2] = 0; + s1[3] = 0; + + u32 s2[4]; + + s2[0] = 0; + s2[1] = 0; + s2[2] = 0; + s2[3] = 0; + + u32 s3[4]; + + s3[0] = 0; + s3[1] = 0; + s3[2] = 0; + s3[3] = 0; + + switch_buffer_by_offset (s0, s1, s2, s3, 1 + pw_len); + + const u32 pw_salt_len = pw_len + salt_len; + + w0[0] |= s0[0]; + w0[1] |= s0[1]; + w0[2] |= s0[2]; + w0[3] |= s0[3]; + w1[0] |= s1[0]; + w1[1] |= s1[1]; + w1[2] |= s1[2]; + w1[3] |= s1[3]; + w2[0] |= s2[0]; + w2[1] |= s2[1]; + w2[2] |= s2[2]; + w2[3] |= s2[3]; + w3[0] |= s3[0]; + w3[1] |= s3[1]; + w3[2] = pw_salt_len * 8; + w3[3] = 0; + + /** + * md5 + */ + + u32x a = MD5M_A; + u32x b = MD5M_B; + u32x c = MD5M_C; + u32x d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H , a, b, c, d, w1[1], MD5C20, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w2[0], MD5C21, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w2[3], MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w3[2], MD5C23, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w0[1], MD5C24, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w1[0], MD5C25, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w1[3], MD5C26, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w2[2], MD5C27, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w3[1], MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w0[0], MD5C29, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w0[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w1[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w2[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w3[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w3[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w0[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1[0], MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w2[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2[1], MD5C3f, MD5S33); + + const u32x r0 = a; + const u32x r1 = d; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_M + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m04800_m08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m04800_m16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m04800_s04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, combs_buf[0].pw_len); + } + + /** + * salt + */ + + u32 salt_buf[5]; + + salt_buf[0] = salt_bufs[salt_pos].salt_buf[0]; + salt_buf[1] = salt_bufs[salt_pos].salt_buf[1]; + salt_buf[2] = salt_bufs[salt_pos].salt_buf[2]; + salt_buf[3] = salt_bufs[salt_pos].salt_buf[3]; + salt_buf[4] = salt_bufs[salt_pos].salt_buf[4]; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = combs_buf[il_pos].pw_len; + + const u32 pw_len = pw_l_len + pw_r_len; + + u32 wordr0[4]; + + wordr0[0] = combs_buf[il_pos].i[0]; + wordr0[1] = combs_buf[il_pos].i[1]; + wordr0[2] = combs_buf[il_pos].i[2]; + wordr0[3] = combs_buf[il_pos].i[3]; + + u32 wordr1[4]; + + wordr1[0] = combs_buf[il_pos].i[4]; + wordr1[1] = combs_buf[il_pos].i[5]; + wordr1[2] = combs_buf[il_pos].i[6]; + wordr1[3] = combs_buf[il_pos].i[7]; + + u32 wordr2[4]; + + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + + u32 wordr3[4]; + + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + u32x w0[4]; + + w0[0] = wordl0[0] | wordr0[0]; + w0[1] = wordl0[1] | wordr0[1]; + w0[2] = wordl0[2] | wordr0[2]; + w0[3] = wordl0[3] | wordr0[3]; + + u32x w1[4]; + + w1[0] = wordl1[0] | wordr1[0]; + w1[1] = wordl1[1] | wordr1[1]; + w1[2] = wordl1[2] | wordr1[2]; + w1[3] = wordl1[3] | wordr1[3]; + + u32x w2[4]; + + w2[0] = wordl2[0] | wordr2[0]; + w2[1] = wordl2[1] | wordr2[1]; + w2[2] = wordl2[2] | wordr2[2]; + w2[3] = wordl2[3] | wordr2[3]; + + u32x w3[4]; + + w3[0] = wordl3[0] | wordr3[0]; + w3[1] = wordl3[1] | wordr3[1]; + w3[2] = wordl3[2] | wordr3[2]; + w3[3] = wordl3[3] | wordr3[3]; + + /* + * add id byte + */ + + switch_buffer_by_offset (w0, w1, w2, w3, 1); + + w0[0] |= salt_buf[4]; + + /** + * append salt + */ + + u32 s0[4]; + + s0[0] = salt_buf[0]; + s0[1] = salt_buf[1]; + s0[2] = salt_buf[2]; + s0[3] = salt_buf[3]; + + u32 s1[4]; + + s1[0] = 0x80; + s1[1] = 0; + s1[2] = 0; + s1[3] = 0; + + u32 s2[4]; + + s2[0] = 0; + s2[1] = 0; + s2[2] = 0; + s2[3] = 0; + + u32 s3[4]; + + s3[0] = 0; + s3[1] = 0; + s3[2] = 0; + s3[3] = 0; + + switch_buffer_by_offset (s0, s1, s2, s3, 1 + pw_len); + + const u32 pw_salt_len = pw_len + salt_len; + + w0[0] |= s0[0]; + w0[1] |= s0[1]; + w0[2] |= s0[2]; + w0[3] |= s0[3]; + w1[0] |= s1[0]; + w1[1] |= s1[1]; + w1[2] |= s1[2]; + w1[3] |= s1[3]; + w2[0] |= s2[0]; + w2[1] |= s2[1]; + w2[2] |= s2[2]; + w2[3] |= s2[3]; + w3[0] |= s3[0]; + w3[1] |= s3[1]; + w3[2] = pw_salt_len * 8; + w3[3] = 0; + + /** + * md5 + */ + + u32x a = MD5M_A; + u32x b = MD5M_B; + u32x c = MD5M_C; + u32x d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H , a, b, c, d, w1[1], MD5C20, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w2[0], MD5C21, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w2[3], MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w3[2], MD5C23, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w0[1], MD5C24, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w1[0], MD5C25, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w1[3], MD5C26, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w2[2], MD5C27, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w3[1], MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w0[0], MD5C29, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w0[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w1[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w2[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w3[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w3[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w0[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1[0], MD5C3c, MD5S30); + + bool q_cond = allx (search[0] != a); + + if (q_cond) continue; + + MD5_STEP (MD5_I , d, a, b, c, w2[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2[1], MD5C3f, MD5S33); + + const u32x r0 = a; + const u32x r1 = d; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_S + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m04800_s08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m04800_s16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/amd/m04800_a3.cl b/amd/m04800_a3.cl new file mode 100644 index 0000000000..4e1ddd9e23 --- /dev/null +++ b/amd/m04800_a3.cl @@ -0,0 +1,807 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _MD5_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW4 +#define VECT_SIZE4 +#endif + +#ifdef VLIW5 +#define VECT_SIZE4 +#endif + +#define DGST_R0 0 +#define DGST_R1 3 +#define DGST_R2 2 +#define DGST_R3 1 + +#include "include/kernel_functions.c" +#include "types_amd.c" +#include "common_amd.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +static void m04800m (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], const u32 pw_len, __global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset) +{ + /** + * modifier + */ + + const u32 gid = get_global_id (0); + const u32 lid = get_local_id (0); + + /** + * salt + */ + + u32 salt_buf[5]; + + salt_buf[0] = salt_bufs[salt_pos].salt_buf[0]; + salt_buf[1] = salt_bufs[salt_pos].salt_buf[1]; + salt_buf[2] = salt_bufs[salt_pos].salt_buf[2]; + salt_buf[3] = salt_bufs[salt_pos].salt_buf[3]; + salt_buf[4] = salt_bufs[salt_pos].salt_buf[4]; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + const u32 pw_salt_len = pw_len + salt_len; + + u32 s0[4]; + + s0[0] = salt_buf[0]; + s0[1] = salt_buf[1]; + s0[2] = salt_buf[2]; + s0[3] = salt_buf[3]; + + u32 s1[4]; + + s1[0] = 0x80; + s1[1] = 0; + s1[2] = 0; + s1[3] = 0; + + u32 s2[4]; + + s2[0] = 0; + s2[1] = 0; + s2[2] = 0; + s2[3] = 0; + + u32 s3[4]; + + s3[0] = 0; + s3[1] = 0; + s3[2] = 0; + s3[3] = 0; + + // move w by 1 + + u32x w0_t[4]; + + w0_t[0] = w0[0]; + w0_t[1] = w0[1]; + w0_t[2] = w0[2]; + w0_t[3] = w0[3]; + + u32x w1_t[4]; + + w1_t[0] = w1[0]; + w1_t[1] = w1[1]; + w1_t[2] = w1[2]; + w1_t[3] = w1[3]; + + u32x w2_t[4]; + + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + + u32x w3_t[4]; + + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = 0; + + switch_buffer_by_offset (w0_t, w1_t, w2_t, w3_t, 1); + + switch_buffer_by_offset (s0, s1, s2, s3, 1 + pw_len); + + w0_t[0] |= s0[0]; + w0_t[1] |= s0[1]; + w0_t[2] |= s0[2]; + w0_t[3] |= s0[3]; + + w1_t[0] |= s1[0]; + w1_t[1] |= s1[1]; + w1_t[2] |= s1[2]; + w1_t[3] |= s1[3]; + + w2_t[0] |= s2[0]; + w2_t[1] |= s2[1]; + w2_t[2] |= s2[2]; + w2_t[3] |= s2[3]; + + w3_t[0] |= s3[0]; + w3_t[1] |= s3[1]; + w3_t[2] = pw_salt_len * 8; + w3_t[3] = 0; + + /** + * add id byte + */ + + w0_t[0] |= salt_buf[4]; + + /** + * loop + */ + + u32x w0l = w0_t[0]; + u32x w1l = w0_t[1]; + + for (u32 il_pos = 0; il_pos < bfs_cnt; il_pos++) + { + const u32 w0r = bfs_buf[il_pos].i; + + w0_t[0] = w0l | (w0r << 8); + w0_t[1] = w1l | (w0r >> 24); + + /** + * md5 + */ + + u32x a = MD5M_A; + u32x b = MD5M_B; + u32x c = MD5M_C; + u32x d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0_t[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0_t[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0_t[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1_t[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1_t[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1_t[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2_t[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2_t[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2_t[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3_t[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3_t[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3_t[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0_t[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1_t[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2_t[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1_t[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1_t[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2_t[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3_t[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0_t[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2_t[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3_t[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0_t[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1_t[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3_t[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H , a, b, c, d, w1_t[1], MD5C20, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w2_t[0], MD5C21, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w2_t[3], MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w3_t[2], MD5C23, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w0_t[1], MD5C24, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w1_t[0], MD5C25, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w1_t[3], MD5C26, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w2_t[2], MD5C27, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w3_t[1], MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w0_t[0], MD5C29, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w0_t[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w1_t[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w2_t[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w3_t[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w3_t[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w0_t[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1_t[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3_t[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3_t[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0_t[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0_t[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2_t[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1_t[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3_t[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1_t[0], MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w2_t[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0_t[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2_t[1], MD5C3f, MD5S33); + + const u32x r0 = a; + const u32x r1 = d; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_M + } +} + +static void m04800s (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], const u32 pw_len, __global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset) +{ + /** + * modifier + */ + + const u32 gid = get_global_id (0); + const u32 lid = get_local_id (0); + + /** + * salt + */ + + u32 salt_buf[5]; + + salt_buf[0] = salt_bufs[salt_pos].salt_buf[0]; + salt_buf[1] = salt_bufs[salt_pos].salt_buf[1]; + salt_buf[2] = salt_bufs[salt_pos].salt_buf[2]; + salt_buf[3] = salt_bufs[salt_pos].salt_buf[3]; + salt_buf[4] = salt_bufs[salt_pos].salt_buf[4]; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + const u32 pw_salt_len = pw_len + salt_len; + + u32 s0[4]; + + s0[0] = salt_buf[0]; + s0[1] = salt_buf[1]; + s0[2] = salt_buf[2]; + s0[3] = salt_buf[3]; + + u32 s1[4]; + + s1[0] = 0x80; + s1[1] = 0; + s1[2] = 0; + s1[3] = 0; + + u32 s2[4]; + + s2[0] = 0; + s2[1] = 0; + s2[2] = 0; + s2[3] = 0; + + u32 s3[4]; + + s3[0] = 0; + s3[1] = 0; + s3[2] = 0; + s3[3] = 0; + + // move w by 1 + + u32x w0_t[4]; + + w0_t[0] = w0[0]; + w0_t[1] = w0[1]; + w0_t[2] = w0[2]; + w0_t[3] = w0[3]; + + u32x w1_t[4]; + + w1_t[0] = w1[0]; + w1_t[1] = w1[1]; + w1_t[2] = w1[2]; + w1_t[3] = w1[3]; + + u32x w2_t[4]; + + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + + u32x w3_t[4]; + + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = 0; + + switch_buffer_by_offset (w0_t, w1_t, w2_t, w3_t, 1); + + switch_buffer_by_offset (s0, s1, s2, s3, 1 + pw_len); + + w0_t[0] |= s0[0]; + w0_t[1] |= s0[1]; + w0_t[2] |= s0[2]; + w0_t[3] |= s0[3]; + + w1_t[0] |= s1[0]; + w1_t[1] |= s1[1]; + w1_t[2] |= s1[2]; + w1_t[3] |= s1[3]; + + w2_t[0] |= s2[0]; + w2_t[1] |= s2[1]; + w2_t[2] |= s2[2]; + w2_t[3] |= s2[3]; + + w3_t[0] |= s3[0]; + w3_t[1] |= s3[1]; + w3_t[2] = pw_salt_len * 8; + w3_t[3] = 0; + + /** + * add id byte + */ + + w0_t[0] |= salt_buf[4]; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * loop + */ + + u32x w0l = w0_t[0]; + u32x w1l = w0_t[1]; + + for (u32 il_pos = 0; il_pos < bfs_cnt; il_pos++) + { + const u32 w0r = bfs_buf[il_pos].i; + + w0_t[0] = w0l | (w0r << 8); + w0_t[1] = w1l | (w0r >> 24); + + /** + * md5 + */ + + u32x a = MD5M_A; + u32x b = MD5M_B; + u32x c = MD5M_C; + u32x d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0_t[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0_t[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0_t[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1_t[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1_t[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1_t[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2_t[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2_t[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2_t[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3_t[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3_t[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3_t[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0_t[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1_t[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2_t[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1_t[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1_t[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2_t[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3_t[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0_t[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2_t[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3_t[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0_t[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1_t[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3_t[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H , a, b, c, d, w1_t[1], MD5C20, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w2_t[0], MD5C21, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w2_t[3], MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w3_t[2], MD5C23, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w0_t[1], MD5C24, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w1_t[0], MD5C25, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w1_t[3], MD5C26, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w2_t[2], MD5C27, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w3_t[1], MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w0_t[0], MD5C29, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w0_t[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w1_t[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w2_t[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w3_t[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w3_t[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w0_t[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1_t[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3_t[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3_t[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0_t[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0_t[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2_t[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1_t[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3_t[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1_t[0], MD5C3c, MD5S30); + + bool q_cond = allx (search[0] != a); + + if (q_cond) continue; + + MD5_STEP (MD5_I , d, a, b, c, w2_t[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0_t[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2_t[1], MD5C3f, MD5S33); + + const u32x r0 = a; + const u32x r1 = d; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_S + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m04800_m04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m04800m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m04800_m08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m04800m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m04800_m16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = pws[gid].i[ 8]; + w2[1] = pws[gid].i[ 9]; + w2[2] = pws[gid].i[10]; + w2[3] = pws[gid].i[11]; + + u32x w3[4]; + + w3[0] = pws[gid].i[12]; + w3[1] = pws[gid].i[13]; + w3[2] = pws[gid].i[14]; + w3[3] = pws[gid].i[15]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m04800m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m04800_s04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m04800s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m04800_s08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m04800s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m04800_s16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = pws[gid].i[ 8]; + w2[1] = pws[gid].i[ 9]; + w2[2] = pws[gid].i[10]; + w2[3] = pws[gid].i[11]; + + u32x w3[4]; + + w3[0] = pws[gid].i[12]; + w3[1] = pws[gid].i[13]; + w3[2] = pws[gid].i[14]; + w3[3] = pws[gid].i[15]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m04800s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} diff --git a/amd/m04900_a0.cl b/amd/m04900_a0.cl new file mode 100644 index 0000000000..f0b63bca64 --- /dev/null +++ b/amd/m04900_a0.cl @@ -0,0 +1,708 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _SHA1_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW4 +#define VECT_SIZE4 +#endif + +#ifdef VLIW5 +#define VECT_SIZE4 +#endif + +#define DGST_R0 3 +#define DGST_R1 4 +#define DGST_R2 2 +#define DGST_R3 1 + +#include "include/kernel_functions.c" +#include "types_amd.c" +#include "common_amd.c" +#include "include/rp_gpu.h" +#include "rp_amd.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m04900_m04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + u32x pw_buf1[4]; + + pw_buf1[0] = pws[gid].i[ 4]; + pw_buf1[1] = pws[gid].i[ 5]; + pw_buf1[2] = pws[gid].i[ 6]; + pw_buf1[3] = pws[gid].i[ 7]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[ 1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[ 2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[ 3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[ 4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[ 5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[ 6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[ 7]; + + u32 salt_buf2[4]; + + salt_buf2[0] = 0; + salt_buf2[1] = 0; + salt_buf2[2] = 0; + salt_buf2[3] = 0; + + u32 salt_buf3[4]; + + salt_buf3[0] = 0; + salt_buf3[1] = 0; + salt_buf3[2] = 0; + salt_buf3[3] = 0; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0_t[4]; + + w0_t[0] = pw_buf0[0]; + w0_t[1] = pw_buf0[1]; + w0_t[2] = pw_buf0[2]; + w0_t[3] = pw_buf0[3]; + + u32x w1_t[4]; + + w1_t[0] = pw_buf1[0]; + w1_t[1] = pw_buf1[1]; + w1_t[2] = pw_buf1[2]; + w1_t[3] = pw_buf1[3]; + + u32x w2_t[4]; + + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + + u32x w3_t[4]; + + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = 0; + + const u32 out_len = apply_rules (rules_buf[il_pos].cmds, w0_t, w1_t, pw_len); + + /** + * prepend salt + */ + + switch_buffer_by_offset (w0_t, w1_t, w2_t, w3_t, salt_len); + + w0_t[0] |= salt_buf0[0]; + w0_t[1] |= salt_buf0[1]; + w0_t[2] |= salt_buf0[2]; + w0_t[3] |= salt_buf0[3]; + w1_t[0] |= salt_buf1[0]; + w1_t[1] |= salt_buf1[1]; + w1_t[2] |= salt_buf1[2]; + w1_t[3] |= salt_buf1[3]; + w2_t[0] |= salt_buf2[0]; + w2_t[1] |= salt_buf2[1]; + w2_t[2] |= salt_buf2[2]; + w2_t[3] |= salt_buf2[3]; + w3_t[0] |= salt_buf3[0]; + w3_t[1] |= salt_buf3[1]; + w3_t[2] |= salt_buf3[2]; + w3_t[3] |= salt_buf3[3]; + + /** + * append salt + */ + + u32 s0[4]; + + s0[0] = salt_buf0[0]; + s0[1] = salt_buf0[1]; + s0[2] = salt_buf0[2]; + s0[3] = salt_buf0[3]; + + u32 s1[4]; + + s1[0] = salt_buf1[0]; + s1[1] = salt_buf1[1]; + s1[2] = salt_buf1[2]; + s1[3] = salt_buf1[3]; + + u32 s2[4]; + + s2[0] = 0; + s2[1] = 0; + s2[2] = 0; + s2[3] = 0; + + u32 s3[4]; + + s3[0] = 0; + s3[1] = 0; + s3[2] = 0; + s3[3] = 0; + + switch_buffer_by_offset (s0, s1, s2, s3, salt_len + out_len); + + w0_t[0] |= s0[0]; + w0_t[1] |= s0[1]; + w0_t[2] |= s0[2]; + w0_t[3] |= s0[3]; + w1_t[0] |= s1[0]; + w1_t[1] |= s1[1]; + w1_t[2] |= s1[2]; + w1_t[3] |= s1[3]; + w2_t[0] |= s2[0]; + w2_t[1] |= s2[1]; + w2_t[2] |= s2[2]; + w2_t[3] |= s2[3]; + w3_t[0] |= s3[0]; + w3_t[1] |= s3[1]; + w3_t[2] |= s3[2]; + w3_t[3] |= s3[3]; + + const u32 pw_salt_len = salt_len + out_len + salt_len; + + append_0x80_4 (w0_t, w1_t, w2_t, w3_t, pw_salt_len); + + u32x w0 = swap_workaround (w0_t[0]); + u32x w1 = swap_workaround (w0_t[1]); + u32x w2 = swap_workaround (w0_t[2]); + u32x w3 = swap_workaround (w0_t[3]); + u32x w4 = swap_workaround (w1_t[0]); + u32x w5 = swap_workaround (w1_t[1]); + u32x w6 = swap_workaround (w1_t[2]); + u32x w7 = swap_workaround (w1_t[3]); + u32x w8 = swap_workaround (w2_t[0]); + u32x w9 = swap_workaround (w2_t[1]); + u32x wa = swap_workaround (w2_t[2]); + u32x wb = swap_workaround (w2_t[3]); + u32x wc = swap_workaround (w3_t[0]); + u32x wd = swap_workaround (w3_t[1]); + u32x we = 0; + u32x wf = pw_salt_len * 8; + + /** + * sha1 + */ + + u32x a = SHA1M_A; + u32x b = SHA1M_B; + u32x c = SHA1M_C; + u32x d = SHA1M_D; + u32x e = SHA1M_E; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w0); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w1); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w2); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w3); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w4); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w5); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w6); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w7); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w8); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w9); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wa); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, wb); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, wc); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, wd); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, we); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wf); + w0 = rotl32 ((wd ^ w8 ^ w2 ^ w0), 1u); SHA1_STEP (SHA1_F0o, e, a, b, c, d, w0); + w1 = rotl32 ((we ^ w9 ^ w3 ^ w1), 1u); SHA1_STEP (SHA1_F0o, d, e, a, b, c, w1); + w2 = rotl32 ((wf ^ wa ^ w4 ^ w2), 1u); SHA1_STEP (SHA1_F0o, c, d, e, a, b, w2); + w3 = rotl32 ((w0 ^ wb ^ w5 ^ w3), 1u); SHA1_STEP (SHA1_F0o, b, c, d, e, a, w3); + + #undef K + #define K SHA1C01 + + w4 = rotl32 ((w1 ^ wc ^ w6 ^ w4), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w4); + w5 = rotl32 ((w2 ^ wd ^ w7 ^ w5), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w5); + w6 = rotl32 ((w3 ^ we ^ w8 ^ w6), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w6); + w7 = rotl32 ((w4 ^ wf ^ w9 ^ w7), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w7); + w8 = rotl32 ((w5 ^ w0 ^ wa ^ w8), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w8); + w9 = rotl32 ((w6 ^ w1 ^ wb ^ w9), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w9); + wa = rotl32 ((w7 ^ w2 ^ wc ^ wa), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wa); + wb = rotl32 ((w8 ^ w3 ^ wd ^ wb), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wb); + wc = rotl32 ((w9 ^ w4 ^ we ^ wc), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wc); + wd = rotl32 ((wa ^ w5 ^ wf ^ wd), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wd); + we = rotl32 ((wb ^ w6 ^ w0 ^ we), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, we); + wf = rotl32 ((wc ^ w7 ^ w1 ^ wf), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wf); + w0 = rotl32 ((wd ^ w8 ^ w2 ^ w0), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w0); + w1 = rotl32 ((we ^ w9 ^ w3 ^ w1), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1); + w2 = rotl32 ((wf ^ wa ^ w4 ^ w2), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w2); + w3 = rotl32 ((w0 ^ wb ^ w5 ^ w3), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w3); + w4 = rotl32 ((w1 ^ wc ^ w6 ^ w4), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w4); + w5 = rotl32 ((w2 ^ wd ^ w7 ^ w5), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w5); + w6 = rotl32 ((w3 ^ we ^ w8 ^ w6), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w6); + w7 = rotl32 ((w4 ^ wf ^ w9 ^ w7), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w7); + + #undef K + #define K SHA1C02 + + w8 = rotl32 ((w5 ^ w0 ^ wa ^ w8), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w8); + w9 = rotl32 ((w6 ^ w1 ^ wb ^ w9), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w9); + wa = rotl32 ((w7 ^ w2 ^ wc ^ wa), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wa); + wb = rotl32 ((w8 ^ w3 ^ wd ^ wb), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wb); + wc = rotl32 ((w9 ^ w4 ^ we ^ wc), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wc); + wd = rotl32 ((wa ^ w5 ^ wf ^ wd), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, wd); + we = rotl32 ((wb ^ w6 ^ w0 ^ we), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, we); + wf = rotl32 ((wc ^ w7 ^ w1 ^ wf), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wf); + w0 = rotl32 ((wd ^ w8 ^ w2 ^ w0), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w0); + w1 = rotl32 ((we ^ w9 ^ w3 ^ w1), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w1); + w2 = rotl32 ((wf ^ wa ^ w4 ^ w2), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w2); + w3 = rotl32 ((w0 ^ wb ^ w5 ^ w3), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w3); + w4 = rotl32 ((w1 ^ wc ^ w6 ^ w4), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w4); + w5 = rotl32 ((w2 ^ wd ^ w7 ^ w5), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w5); + w6 = rotl32 ((w3 ^ we ^ w8 ^ w6), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w6); + w7 = rotl32 ((w4 ^ wf ^ w9 ^ w7), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w7); + w8 = rotl32 ((w5 ^ w0 ^ wa ^ w8), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w8); + w9 = rotl32 ((w6 ^ w1 ^ wb ^ w9), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w9); + wa = rotl32 ((w7 ^ w2 ^ wc ^ wa), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wa); + wb = rotl32 ((w8 ^ w3 ^ wd ^ wb), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wb); + + #undef K + #define K SHA1C03 + + wc = rotl32 ((w9 ^ w4 ^ we ^ wc), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wc); + wd = rotl32 ((wa ^ w5 ^ wf ^ wd), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wd); + we = rotl32 ((wb ^ w6 ^ w0 ^ we), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, we); + wf = rotl32 ((wc ^ w7 ^ w1 ^ wf), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wf); + w0 = rotl32 ((wd ^ w8 ^ w2 ^ w0), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w0); + w1 = rotl32 ((we ^ w9 ^ w3 ^ w1), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w1); + w2 = rotl32 ((wf ^ wa ^ w4 ^ w2), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w2); + w3 = rotl32 ((w0 ^ wb ^ w5 ^ w3), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w3); + w4 = rotl32 ((w1 ^ wc ^ w6 ^ w4), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w4); + w5 = rotl32 ((w2 ^ wd ^ w7 ^ w5), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w5); + w6 = rotl32 ((w3 ^ we ^ w8 ^ w6), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w6); + w7 = rotl32 ((w4 ^ wf ^ w9 ^ w7), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w7); + w8 = rotl32 ((w5 ^ w0 ^ wa ^ w8), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w8); + w9 = rotl32 ((w6 ^ w1 ^ wb ^ w9), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w9); + wa = rotl32 ((w7 ^ w2 ^ wc ^ wa), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wa); + wb = rotl32 ((w8 ^ w3 ^ wd ^ wb), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wb); + wc = rotl32 ((w9 ^ w4 ^ we ^ wc), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wc); + wd = rotl32 ((wa ^ w5 ^ wf ^ wd), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wd); + we = rotl32 ((wb ^ w6 ^ w0 ^ we), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, we); + wf = rotl32 ((wc ^ w7 ^ w1 ^ wf), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wf); + + const u32x r0 = d; + const u32x r1 = e; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_M + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m04900_m08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m04900_m16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m04900_s04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + u32x pw_buf1[4]; + + pw_buf1[0] = pws[gid].i[ 4]; + pw_buf1[1] = pws[gid].i[ 5]; + pw_buf1[2] = pws[gid].i[ 6]; + pw_buf1[3] = pws[gid].i[ 7]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[ 1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[ 2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[ 3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[ 4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[ 5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[ 6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[ 7]; + + u32 salt_buf2[4]; + + salt_buf2[0] = 0; + salt_buf2[1] = 0; + salt_buf2[2] = 0; + salt_buf2[3] = 0; + + u32 salt_buf3[4]; + + salt_buf3[0] = 0; + salt_buf3[1] = 0; + salt_buf3[2] = 0; + salt_buf3[3] = 0; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * reverse + */ + + const u32 e_rev = rotl32 (search[1], 2u); + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0_t[4]; + + w0_t[0] = pw_buf0[0]; + w0_t[1] = pw_buf0[1]; + w0_t[2] = pw_buf0[2]; + w0_t[3] = pw_buf0[3]; + + u32x w1_t[4]; + + w1_t[0] = pw_buf1[0]; + w1_t[1] = pw_buf1[1]; + w1_t[2] = pw_buf1[2]; + w1_t[3] = pw_buf1[3]; + + u32x w2_t[4]; + + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + + u32x w3_t[4]; + + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = 0; + + const u32 out_len = apply_rules (rules_buf[il_pos].cmds, w0_t, w1_t, pw_len); + + /** + * prepend salt + */ + + switch_buffer_by_offset (w0_t, w1_t, w2_t, w3_t, salt_len); + + w0_t[0] |= salt_buf0[0]; + w0_t[1] |= salt_buf0[1]; + w0_t[2] |= salt_buf0[2]; + w0_t[3] |= salt_buf0[3]; + w1_t[0] |= salt_buf1[0]; + w1_t[1] |= salt_buf1[1]; + w1_t[2] |= salt_buf1[2]; + w1_t[3] |= salt_buf1[3]; + w2_t[0] |= salt_buf2[0]; + w2_t[1] |= salt_buf2[1]; + w2_t[2] |= salt_buf2[2]; + w2_t[3] |= salt_buf2[3]; + w3_t[0] |= salt_buf3[0]; + w3_t[1] |= salt_buf3[1]; + w3_t[2] |= salt_buf3[2]; + w3_t[3] |= salt_buf3[3]; + + /** + * append salt + */ + + u32 s0[4]; + + s0[0] = salt_buf0[0]; + s0[1] = salt_buf0[1]; + s0[2] = salt_buf0[2]; + s0[3] = salt_buf0[3]; + + u32 s1[4]; + + s1[0] = salt_buf1[0]; + s1[1] = salt_buf1[1]; + s1[2] = salt_buf1[2]; + s1[3] = salt_buf1[3]; + + u32 s2[4]; + + s2[0] = 0; + s2[1] = 0; + s2[2] = 0; + s2[3] = 0; + + u32 s3[4]; + + s3[0] = 0; + s3[1] = 0; + s3[2] = 0; + s3[3] = 0; + + switch_buffer_by_offset (s0, s1, s2, s3, salt_len + out_len); + + w0_t[0] |= s0[0]; + w0_t[1] |= s0[1]; + w0_t[2] |= s0[2]; + w0_t[3] |= s0[3]; + w1_t[0] |= s1[0]; + w1_t[1] |= s1[1]; + w1_t[2] |= s1[2]; + w1_t[3] |= s1[3]; + w2_t[0] |= s2[0]; + w2_t[1] |= s2[1]; + w2_t[2] |= s2[2]; + w2_t[3] |= s2[3]; + w3_t[0] |= s3[0]; + w3_t[1] |= s3[1]; + w3_t[2] |= s3[2]; + w3_t[3] |= s3[3]; + + const u32 pw_salt_len = salt_len + out_len + salt_len; + + append_0x80_4 (w0_t, w1_t, w2_t, w3_t, pw_salt_len); + + u32x w0 = swap_workaround (w0_t[0]); + u32x w1 = swap_workaround (w0_t[1]); + u32x w2 = swap_workaround (w0_t[2]); + u32x w3 = swap_workaround (w0_t[3]); + u32x w4 = swap_workaround (w1_t[0]); + u32x w5 = swap_workaround (w1_t[1]); + u32x w6 = swap_workaround (w1_t[2]); + u32x w7 = swap_workaround (w1_t[3]); + u32x w8 = swap_workaround (w2_t[0]); + u32x w9 = swap_workaround (w2_t[1]); + u32x wa = swap_workaround (w2_t[2]); + u32x wb = swap_workaround (w2_t[3]); + u32x wc = swap_workaround (w3_t[0]); + u32x wd = swap_workaround (w3_t[1]); + u32x we = 0; + u32x wf = pw_salt_len * 8; + + /** + * sha1 + */ + + u32x a = SHA1M_A; + u32x b = SHA1M_B; + u32x c = SHA1M_C; + u32x d = SHA1M_D; + u32x e = SHA1M_E; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w0); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w1); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w2); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w3); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w4); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w5); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w6); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w7); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w8); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w9); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wa); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, wb); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, wc); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, wd); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, we); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wf); + w0 = rotl32 ((wd ^ w8 ^ w2 ^ w0), 1u); SHA1_STEP (SHA1_F0o, e, a, b, c, d, w0); + w1 = rotl32 ((we ^ w9 ^ w3 ^ w1), 1u); SHA1_STEP (SHA1_F0o, d, e, a, b, c, w1); + w2 = rotl32 ((wf ^ wa ^ w4 ^ w2), 1u); SHA1_STEP (SHA1_F0o, c, d, e, a, b, w2); + w3 = rotl32 ((w0 ^ wb ^ w5 ^ w3), 1u); SHA1_STEP (SHA1_F0o, b, c, d, e, a, w3); + + #undef K + #define K SHA1C01 + + w4 = rotl32 ((w1 ^ wc ^ w6 ^ w4), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w4); + w5 = rotl32 ((w2 ^ wd ^ w7 ^ w5), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w5); + w6 = rotl32 ((w3 ^ we ^ w8 ^ w6), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w6); + w7 = rotl32 ((w4 ^ wf ^ w9 ^ w7), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w7); + w8 = rotl32 ((w5 ^ w0 ^ wa ^ w8), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w8); + w9 = rotl32 ((w6 ^ w1 ^ wb ^ w9), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w9); + wa = rotl32 ((w7 ^ w2 ^ wc ^ wa), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wa); + wb = rotl32 ((w8 ^ w3 ^ wd ^ wb), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wb); + wc = rotl32 ((w9 ^ w4 ^ we ^ wc), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wc); + wd = rotl32 ((wa ^ w5 ^ wf ^ wd), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wd); + we = rotl32 ((wb ^ w6 ^ w0 ^ we), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, we); + wf = rotl32 ((wc ^ w7 ^ w1 ^ wf), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wf); + w0 = rotl32 ((wd ^ w8 ^ w2 ^ w0), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w0); + w1 = rotl32 ((we ^ w9 ^ w3 ^ w1), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1); + w2 = rotl32 ((wf ^ wa ^ w4 ^ w2), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w2); + w3 = rotl32 ((w0 ^ wb ^ w5 ^ w3), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w3); + w4 = rotl32 ((w1 ^ wc ^ w6 ^ w4), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w4); + w5 = rotl32 ((w2 ^ wd ^ w7 ^ w5), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w5); + w6 = rotl32 ((w3 ^ we ^ w8 ^ w6), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w6); + w7 = rotl32 ((w4 ^ wf ^ w9 ^ w7), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w7); + + #undef K + #define K SHA1C02 + + w8 = rotl32 ((w5 ^ w0 ^ wa ^ w8), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w8); + w9 = rotl32 ((w6 ^ w1 ^ wb ^ w9), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w9); + wa = rotl32 ((w7 ^ w2 ^ wc ^ wa), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wa); + wb = rotl32 ((w8 ^ w3 ^ wd ^ wb), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wb); + wc = rotl32 ((w9 ^ w4 ^ we ^ wc), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wc); + wd = rotl32 ((wa ^ w5 ^ wf ^ wd), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, wd); + we = rotl32 ((wb ^ w6 ^ w0 ^ we), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, we); + wf = rotl32 ((wc ^ w7 ^ w1 ^ wf), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wf); + w0 = rotl32 ((wd ^ w8 ^ w2 ^ w0), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w0); + w1 = rotl32 ((we ^ w9 ^ w3 ^ w1), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w1); + w2 = rotl32 ((wf ^ wa ^ w4 ^ w2), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w2); + w3 = rotl32 ((w0 ^ wb ^ w5 ^ w3), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w3); + w4 = rotl32 ((w1 ^ wc ^ w6 ^ w4), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w4); + w5 = rotl32 ((w2 ^ wd ^ w7 ^ w5), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w5); + w6 = rotl32 ((w3 ^ we ^ w8 ^ w6), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w6); + w7 = rotl32 ((w4 ^ wf ^ w9 ^ w7), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w7); + w8 = rotl32 ((w5 ^ w0 ^ wa ^ w8), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w8); + w9 = rotl32 ((w6 ^ w1 ^ wb ^ w9), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w9); + wa = rotl32 ((w7 ^ w2 ^ wc ^ wa), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wa); + wb = rotl32 ((w8 ^ w3 ^ wd ^ wb), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wb); + + #undef K + #define K SHA1C03 + + wc = rotl32 ((w9 ^ w4 ^ we ^ wc), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wc); + wd = rotl32 ((wa ^ w5 ^ wf ^ wd), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wd); + we = rotl32 ((wb ^ w6 ^ w0 ^ we), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, we); + wf = rotl32 ((wc ^ w7 ^ w1 ^ wf), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wf); + w0 = rotl32 ((wd ^ w8 ^ w2 ^ w0), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w0); + w1 = rotl32 ((we ^ w9 ^ w3 ^ w1), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w1); + w2 = rotl32 ((wf ^ wa ^ w4 ^ w2), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w2); + w3 = rotl32 ((w0 ^ wb ^ w5 ^ w3), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w3); + w4 = rotl32 ((w1 ^ wc ^ w6 ^ w4), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w4); + w5 = rotl32 ((w2 ^ wd ^ w7 ^ w5), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w5); + w6 = rotl32 ((w3 ^ we ^ w8 ^ w6), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w6); + w7 = rotl32 ((w4 ^ wf ^ w9 ^ w7), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w7); + w8 = rotl32 ((w5 ^ w0 ^ wa ^ w8), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w8); + w9 = rotl32 ((w6 ^ w1 ^ wb ^ w9), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w9); + wa = rotl32 ((w7 ^ w2 ^ wc ^ wa), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wa); + wb = rotl32 ((w8 ^ w3 ^ wd ^ wb), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wb); + + if (allx (e != e_rev)) continue; + + wc = rotl32 ((w9 ^ w4 ^ we ^ wc), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wc); + wd = rotl32 ((wa ^ w5 ^ wf ^ wd), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wd); + we = rotl32 ((wb ^ w6 ^ w0 ^ we), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, we); + wf = rotl32 ((wc ^ w7 ^ w1 ^ wf), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wf); + + const u32x r0 = d; + const u32x r1 = e; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_S + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m04900_s08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m04900_s16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/amd/m04900_a1.cl b/amd/m04900_a1.cl new file mode 100644 index 0000000000..0334f3efeb --- /dev/null +++ b/amd/m04900_a1.cl @@ -0,0 +1,814 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _SHA1_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW4 +#define VECT_SIZE4 +#endif + +#ifdef VLIW5 +#define VECT_SIZE4 +#endif + +#define DGST_R0 3 +#define DGST_R1 4 +#define DGST_R2 2 +#define DGST_R3 1 + +#include "include/kernel_functions.c" +#include "types_amd.c" +#include "common_amd.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m04900_m04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, combs_buf[0].pw_len); + } + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[ 1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[ 2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[ 3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[ 4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[ 5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[ 6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[ 7]; + + u32 salt_buf2[4]; + + salt_buf2[0] = 0; + salt_buf2[1] = 0; + salt_buf2[2] = 0; + salt_buf2[3] = 0; + + u32 salt_buf3[4]; + + salt_buf3[0] = 0; + salt_buf3[1] = 0; + salt_buf3[2] = 0; + salt_buf3[3] = 0; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = combs_buf[il_pos].pw_len; + + const u32 pw_len = pw_l_len + pw_r_len; + + u32 wordr0[4]; + + wordr0[0] = combs_buf[il_pos].i[0]; + wordr0[1] = combs_buf[il_pos].i[1]; + wordr0[2] = combs_buf[il_pos].i[2]; + wordr0[3] = combs_buf[il_pos].i[3]; + + u32 wordr1[4]; + + wordr1[0] = combs_buf[il_pos].i[4]; + wordr1[1] = combs_buf[il_pos].i[5]; + wordr1[2] = combs_buf[il_pos].i[6]; + wordr1[3] = combs_buf[il_pos].i[7]; + + u32 wordr2[4]; + + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + + u32 wordr3[4]; + + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + u32x w0_t[4]; + + w0_t[0] = wordl0[0] | wordr0[0]; + w0_t[1] = wordl0[1] | wordr0[1]; + w0_t[2] = wordl0[2] | wordr0[2]; + w0_t[3] = wordl0[3] | wordr0[3]; + + u32x w1_t[4]; + + w1_t[0] = wordl1[0] | wordr1[0]; + w1_t[1] = wordl1[1] | wordr1[1]; + w1_t[2] = wordl1[2] | wordr1[2]; + w1_t[3] = wordl1[3] | wordr1[3]; + + u32x w2_t[4]; + + w2_t[0] = wordl2[0] | wordr2[0]; + w2_t[1] = wordl2[1] | wordr2[1]; + w2_t[2] = wordl2[2] | wordr2[2]; + w2_t[3] = wordl2[3] | wordr2[3]; + + u32x w3_t[4]; + + w3_t[0] = wordl3[0] | wordr3[0]; + w3_t[1] = wordl3[1] | wordr3[1]; + w3_t[2] = 0; + w3_t[3] = 0; + + /** + * prepend salt + */ + + switch_buffer_by_offset (w0_t, w1_t, w2_t, w3_t, salt_len); + + w0_t[0] |= salt_buf0[0]; + w0_t[1] |= salt_buf0[1]; + w0_t[2] |= salt_buf0[2]; + w0_t[3] |= salt_buf0[3]; + w1_t[0] |= salt_buf1[0]; + w1_t[1] |= salt_buf1[1]; + w1_t[2] |= salt_buf1[2]; + w1_t[3] |= salt_buf1[3]; + w2_t[0] |= salt_buf2[0]; + w2_t[1] |= salt_buf2[1]; + w2_t[2] |= salt_buf2[2]; + w2_t[3] |= salt_buf2[3]; + w3_t[0] |= salt_buf3[0]; + w3_t[1] |= salt_buf3[1]; + w3_t[2] |= salt_buf3[2]; + w3_t[3] |= salt_buf3[3]; + + /** + * append salt + */ + + u32 s0[4]; + + s0[0] = salt_buf0[0]; + s0[1] = salt_buf0[1]; + s0[2] = salt_buf0[2]; + s0[3] = salt_buf0[3]; + + u32 s1[4]; + + s1[0] = salt_buf1[0]; + s1[1] = salt_buf1[1]; + s1[2] = salt_buf1[2]; + s1[3] = salt_buf1[3]; + + u32 s2[4]; + + s2[0] = 0; + s2[1] = 0; + s2[2] = 0; + s2[3] = 0; + + u32 s3[4]; + + s3[0] = 0; + s3[1] = 0; + s3[2] = 0; + s3[3] = 0; + + switch_buffer_by_offset (s0, s1, s2, s3, salt_len + pw_len); + + w0_t[0] |= s0[0]; + w0_t[1] |= s0[1]; + w0_t[2] |= s0[2]; + w0_t[3] |= s0[3]; + w1_t[0] |= s1[0]; + w1_t[1] |= s1[1]; + w1_t[2] |= s1[2]; + w1_t[3] |= s1[3]; + w2_t[0] |= s2[0]; + w2_t[1] |= s2[1]; + w2_t[2] |= s2[2]; + w2_t[3] |= s2[3]; + w3_t[0] |= s3[0]; + w3_t[1] |= s3[1]; + w3_t[2] |= s3[2]; + w3_t[3] |= s3[3]; + + const u32 pw_salt_len = salt_len + pw_len + salt_len; + + append_0x80_4 (w0_t, w1_t, w2_t, w3_t, pw_salt_len); + + u32x w0 = swap_workaround (w0_t[0]); + u32x w1 = swap_workaround (w0_t[1]); + u32x w2 = swap_workaround (w0_t[2]); + u32x w3 = swap_workaround (w0_t[3]); + u32x w4 = swap_workaround (w1_t[0]); + u32x w5 = swap_workaround (w1_t[1]); + u32x w6 = swap_workaround (w1_t[2]); + u32x w7 = swap_workaround (w1_t[3]); + u32x w8 = swap_workaround (w2_t[0]); + u32x w9 = swap_workaround (w2_t[1]); + u32x wa = swap_workaround (w2_t[2]); + u32x wb = swap_workaround (w2_t[3]); + u32x wc = swap_workaround (w3_t[0]); + u32x wd = swap_workaround (w3_t[1]); + u32x we = 0; + u32x wf = pw_salt_len * 8; + + /** + * sha1 + */ + + u32x a = SHA1M_A; + u32x b = SHA1M_B; + u32x c = SHA1M_C; + u32x d = SHA1M_D; + u32x e = SHA1M_E; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w0); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w1); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w2); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w3); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w4); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w5); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w6); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w7); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w8); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w9); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wa); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, wb); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, wc); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, wd); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, we); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wf); + w0 = rotl32 ((wd ^ w8 ^ w2 ^ w0), 1u); SHA1_STEP (SHA1_F0o, e, a, b, c, d, w0); + w1 = rotl32 ((we ^ w9 ^ w3 ^ w1), 1u); SHA1_STEP (SHA1_F0o, d, e, a, b, c, w1); + w2 = rotl32 ((wf ^ wa ^ w4 ^ w2), 1u); SHA1_STEP (SHA1_F0o, c, d, e, a, b, w2); + w3 = rotl32 ((w0 ^ wb ^ w5 ^ w3), 1u); SHA1_STEP (SHA1_F0o, b, c, d, e, a, w3); + + #undef K + #define K SHA1C01 + + w4 = rotl32 ((w1 ^ wc ^ w6 ^ w4), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w4); + w5 = rotl32 ((w2 ^ wd ^ w7 ^ w5), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w5); + w6 = rotl32 ((w3 ^ we ^ w8 ^ w6), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w6); + w7 = rotl32 ((w4 ^ wf ^ w9 ^ w7), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w7); + w8 = rotl32 ((w5 ^ w0 ^ wa ^ w8), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w8); + w9 = rotl32 ((w6 ^ w1 ^ wb ^ w9), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w9); + wa = rotl32 ((w7 ^ w2 ^ wc ^ wa), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wa); + wb = rotl32 ((w8 ^ w3 ^ wd ^ wb), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wb); + wc = rotl32 ((w9 ^ w4 ^ we ^ wc), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wc); + wd = rotl32 ((wa ^ w5 ^ wf ^ wd), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wd); + we = rotl32 ((wb ^ w6 ^ w0 ^ we), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, we); + wf = rotl32 ((wc ^ w7 ^ w1 ^ wf), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wf); + w0 = rotl32 ((wd ^ w8 ^ w2 ^ w0), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w0); + w1 = rotl32 ((we ^ w9 ^ w3 ^ w1), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1); + w2 = rotl32 ((wf ^ wa ^ w4 ^ w2), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w2); + w3 = rotl32 ((w0 ^ wb ^ w5 ^ w3), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w3); + w4 = rotl32 ((w1 ^ wc ^ w6 ^ w4), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w4); + w5 = rotl32 ((w2 ^ wd ^ w7 ^ w5), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w5); + w6 = rotl32 ((w3 ^ we ^ w8 ^ w6), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w6); + w7 = rotl32 ((w4 ^ wf ^ w9 ^ w7), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w7); + + #undef K + #define K SHA1C02 + + w8 = rotl32 ((w5 ^ w0 ^ wa ^ w8), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w8); + w9 = rotl32 ((w6 ^ w1 ^ wb ^ w9), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w9); + wa = rotl32 ((w7 ^ w2 ^ wc ^ wa), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wa); + wb = rotl32 ((w8 ^ w3 ^ wd ^ wb), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wb); + wc = rotl32 ((w9 ^ w4 ^ we ^ wc), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wc); + wd = rotl32 ((wa ^ w5 ^ wf ^ wd), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, wd); + we = rotl32 ((wb ^ w6 ^ w0 ^ we), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, we); + wf = rotl32 ((wc ^ w7 ^ w1 ^ wf), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wf); + w0 = rotl32 ((wd ^ w8 ^ w2 ^ w0), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w0); + w1 = rotl32 ((we ^ w9 ^ w3 ^ w1), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w1); + w2 = rotl32 ((wf ^ wa ^ w4 ^ w2), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w2); + w3 = rotl32 ((w0 ^ wb ^ w5 ^ w3), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w3); + w4 = rotl32 ((w1 ^ wc ^ w6 ^ w4), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w4); + w5 = rotl32 ((w2 ^ wd ^ w7 ^ w5), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w5); + w6 = rotl32 ((w3 ^ we ^ w8 ^ w6), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w6); + w7 = rotl32 ((w4 ^ wf ^ w9 ^ w7), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w7); + w8 = rotl32 ((w5 ^ w0 ^ wa ^ w8), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w8); + w9 = rotl32 ((w6 ^ w1 ^ wb ^ w9), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w9); + wa = rotl32 ((w7 ^ w2 ^ wc ^ wa), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wa); + wb = rotl32 ((w8 ^ w3 ^ wd ^ wb), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wb); + + #undef K + #define K SHA1C03 + + wc = rotl32 ((w9 ^ w4 ^ we ^ wc), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wc); + wd = rotl32 ((wa ^ w5 ^ wf ^ wd), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wd); + we = rotl32 ((wb ^ w6 ^ w0 ^ we), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, we); + wf = rotl32 ((wc ^ w7 ^ w1 ^ wf), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wf); + w0 = rotl32 ((wd ^ w8 ^ w2 ^ w0), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w0); + w1 = rotl32 ((we ^ w9 ^ w3 ^ w1), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w1); + w2 = rotl32 ((wf ^ wa ^ w4 ^ w2), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w2); + w3 = rotl32 ((w0 ^ wb ^ w5 ^ w3), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w3); + w4 = rotl32 ((w1 ^ wc ^ w6 ^ w4), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w4); + w5 = rotl32 ((w2 ^ wd ^ w7 ^ w5), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w5); + w6 = rotl32 ((w3 ^ we ^ w8 ^ w6), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w6); + w7 = rotl32 ((w4 ^ wf ^ w9 ^ w7), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w7); + w8 = rotl32 ((w5 ^ w0 ^ wa ^ w8), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w8); + w9 = rotl32 ((w6 ^ w1 ^ wb ^ w9), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w9); + wa = rotl32 ((w7 ^ w2 ^ wc ^ wa), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wa); + wb = rotl32 ((w8 ^ w3 ^ wd ^ wb), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wb); + wc = rotl32 ((w9 ^ w4 ^ we ^ wc), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wc); + wd = rotl32 ((wa ^ w5 ^ wf ^ wd), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wd); + we = rotl32 ((wb ^ w6 ^ w0 ^ we), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, we); + wf = rotl32 ((wc ^ w7 ^ w1 ^ wf), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wf); + + const u32x r0 = d; + const u32x r1 = e; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_M + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m04900_m08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m04900_m16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m04900_s04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, combs_buf[0].pw_len); + } + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[ 1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[ 2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[ 3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[ 4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[ 5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[ 6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[ 7]; + + u32 salt_buf2[4]; + + salt_buf2[0] = 0; + salt_buf2[1] = 0; + salt_buf2[2] = 0; + salt_buf2[3] = 0; + + u32 salt_buf3[4]; + + salt_buf3[0] = 0; + salt_buf3[1] = 0; + salt_buf3[2] = 0; + salt_buf3[3] = 0; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * reverse + */ + + const u32 e_rev = rotl32 (search[1], 2u); + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = combs_buf[il_pos].pw_len; + + const u32 pw_len = pw_l_len + pw_r_len; + + u32 wordr0[4]; + + wordr0[0] = combs_buf[il_pos].i[0]; + wordr0[1] = combs_buf[il_pos].i[1]; + wordr0[2] = combs_buf[il_pos].i[2]; + wordr0[3] = combs_buf[il_pos].i[3]; + + u32 wordr1[4]; + + wordr1[0] = combs_buf[il_pos].i[4]; + wordr1[1] = combs_buf[il_pos].i[5]; + wordr1[2] = combs_buf[il_pos].i[6]; + wordr1[3] = combs_buf[il_pos].i[7]; + + u32 wordr2[4]; + + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + + u32 wordr3[4]; + + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + u32x w0_t[4]; + + w0_t[0] = wordl0[0] | wordr0[0]; + w0_t[1] = wordl0[1] | wordr0[1]; + w0_t[2] = wordl0[2] | wordr0[2]; + w0_t[3] = wordl0[3] | wordr0[3]; + + u32x w1_t[4]; + + w1_t[0] = wordl1[0] | wordr1[0]; + w1_t[1] = wordl1[1] | wordr1[1]; + w1_t[2] = wordl1[2] | wordr1[2]; + w1_t[3] = wordl1[3] | wordr1[3]; + + u32x w2_t[4]; + + w2_t[0] = wordl2[0] | wordr2[0]; + w2_t[1] = wordl2[1] | wordr2[1]; + w2_t[2] = wordl2[2] | wordr2[2]; + w2_t[3] = wordl2[3] | wordr2[3]; + + u32x w3_t[4]; + + w3_t[0] = wordl3[0] | wordr3[0]; + w3_t[1] = wordl3[1] | wordr3[1]; + w3_t[2] = 0; + w3_t[3] = 0; + + /** + * prepend salt + */ + + switch_buffer_by_offset (w0_t, w1_t, w2_t, w3_t, salt_len); + + w0_t[0] |= salt_buf0[0]; + w0_t[1] |= salt_buf0[1]; + w0_t[2] |= salt_buf0[2]; + w0_t[3] |= salt_buf0[3]; + w1_t[0] |= salt_buf1[0]; + w1_t[1] |= salt_buf1[1]; + w1_t[2] |= salt_buf1[2]; + w1_t[3] |= salt_buf1[3]; + w2_t[0] |= salt_buf2[0]; + w2_t[1] |= salt_buf2[1]; + w2_t[2] |= salt_buf2[2]; + w2_t[3] |= salt_buf2[3]; + w3_t[0] |= salt_buf3[0]; + w3_t[1] |= salt_buf3[1]; + w3_t[2] |= salt_buf3[2]; + w3_t[3] |= salt_buf3[3]; + + /** + * append salt + */ + + u32 s0[4]; + + s0[0] = salt_buf0[0]; + s0[1] = salt_buf0[1]; + s0[2] = salt_buf0[2]; + s0[3] = salt_buf0[3]; + + u32 s1[4]; + + s1[0] = salt_buf1[0]; + s1[1] = salt_buf1[1]; + s1[2] = salt_buf1[2]; + s1[3] = salt_buf1[3]; + + u32 s2[4]; + + s2[0] = 0; + s2[1] = 0; + s2[2] = 0; + s2[3] = 0; + + u32 s3[4]; + + s3[0] = 0; + s3[1] = 0; + s3[2] = 0; + s3[3] = 0; + + switch_buffer_by_offset (s0, s1, s2, s3, salt_len + pw_len); + + w0_t[0] |= s0[0]; + w0_t[1] |= s0[1]; + w0_t[2] |= s0[2]; + w0_t[3] |= s0[3]; + w1_t[0] |= s1[0]; + w1_t[1] |= s1[1]; + w1_t[2] |= s1[2]; + w1_t[3] |= s1[3]; + w2_t[0] |= s2[0]; + w2_t[1] |= s2[1]; + w2_t[2] |= s2[2]; + w2_t[3] |= s2[3]; + w3_t[0] |= s3[0]; + w3_t[1] |= s3[1]; + w3_t[2] |= s3[2]; + w3_t[3] |= s3[3]; + + const u32 pw_salt_len = salt_len + pw_len + salt_len; + + append_0x80_4 (w0_t, w1_t, w2_t, w3_t, pw_salt_len); + + u32x w0 = swap_workaround (w0_t[0]); + u32x w1 = swap_workaround (w0_t[1]); + u32x w2 = swap_workaround (w0_t[2]); + u32x w3 = swap_workaround (w0_t[3]); + u32x w4 = swap_workaround (w1_t[0]); + u32x w5 = swap_workaround (w1_t[1]); + u32x w6 = swap_workaround (w1_t[2]); + u32x w7 = swap_workaround (w1_t[3]); + u32x w8 = swap_workaround (w2_t[0]); + u32x w9 = swap_workaround (w2_t[1]); + u32x wa = swap_workaround (w2_t[2]); + u32x wb = swap_workaround (w2_t[3]); + u32x wc = swap_workaround (w3_t[0]); + u32x wd = swap_workaround (w3_t[1]); + u32x we = 0; + u32x wf = pw_salt_len * 8; + + /** + * sha1 + */ + + u32x a = SHA1M_A; + u32x b = SHA1M_B; + u32x c = SHA1M_C; + u32x d = SHA1M_D; + u32x e = SHA1M_E; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w0); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w1); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w2); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w3); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w4); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w5); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w6); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w7); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w8); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w9); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wa); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, wb); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, wc); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, wd); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, we); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wf); + w0 = rotl32 ((wd ^ w8 ^ w2 ^ w0), 1u); SHA1_STEP (SHA1_F0o, e, a, b, c, d, w0); + w1 = rotl32 ((we ^ w9 ^ w3 ^ w1), 1u); SHA1_STEP (SHA1_F0o, d, e, a, b, c, w1); + w2 = rotl32 ((wf ^ wa ^ w4 ^ w2), 1u); SHA1_STEP (SHA1_F0o, c, d, e, a, b, w2); + w3 = rotl32 ((w0 ^ wb ^ w5 ^ w3), 1u); SHA1_STEP (SHA1_F0o, b, c, d, e, a, w3); + + #undef K + #define K SHA1C01 + + w4 = rotl32 ((w1 ^ wc ^ w6 ^ w4), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w4); + w5 = rotl32 ((w2 ^ wd ^ w7 ^ w5), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w5); + w6 = rotl32 ((w3 ^ we ^ w8 ^ w6), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w6); + w7 = rotl32 ((w4 ^ wf ^ w9 ^ w7), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w7); + w8 = rotl32 ((w5 ^ w0 ^ wa ^ w8), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w8); + w9 = rotl32 ((w6 ^ w1 ^ wb ^ w9), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w9); + wa = rotl32 ((w7 ^ w2 ^ wc ^ wa), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wa); + wb = rotl32 ((w8 ^ w3 ^ wd ^ wb), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wb); + wc = rotl32 ((w9 ^ w4 ^ we ^ wc), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wc); + wd = rotl32 ((wa ^ w5 ^ wf ^ wd), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wd); + we = rotl32 ((wb ^ w6 ^ w0 ^ we), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, we); + wf = rotl32 ((wc ^ w7 ^ w1 ^ wf), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wf); + w0 = rotl32 ((wd ^ w8 ^ w2 ^ w0), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w0); + w1 = rotl32 ((we ^ w9 ^ w3 ^ w1), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1); + w2 = rotl32 ((wf ^ wa ^ w4 ^ w2), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w2); + w3 = rotl32 ((w0 ^ wb ^ w5 ^ w3), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w3); + w4 = rotl32 ((w1 ^ wc ^ w6 ^ w4), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w4); + w5 = rotl32 ((w2 ^ wd ^ w7 ^ w5), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w5); + w6 = rotl32 ((w3 ^ we ^ w8 ^ w6), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w6); + w7 = rotl32 ((w4 ^ wf ^ w9 ^ w7), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w7); + + #undef K + #define K SHA1C02 + + w8 = rotl32 ((w5 ^ w0 ^ wa ^ w8), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w8); + w9 = rotl32 ((w6 ^ w1 ^ wb ^ w9), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w9); + wa = rotl32 ((w7 ^ w2 ^ wc ^ wa), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wa); + wb = rotl32 ((w8 ^ w3 ^ wd ^ wb), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wb); + wc = rotl32 ((w9 ^ w4 ^ we ^ wc), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wc); + wd = rotl32 ((wa ^ w5 ^ wf ^ wd), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, wd); + we = rotl32 ((wb ^ w6 ^ w0 ^ we), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, we); + wf = rotl32 ((wc ^ w7 ^ w1 ^ wf), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wf); + w0 = rotl32 ((wd ^ w8 ^ w2 ^ w0), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w0); + w1 = rotl32 ((we ^ w9 ^ w3 ^ w1), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w1); + w2 = rotl32 ((wf ^ wa ^ w4 ^ w2), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w2); + w3 = rotl32 ((w0 ^ wb ^ w5 ^ w3), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w3); + w4 = rotl32 ((w1 ^ wc ^ w6 ^ w4), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w4); + w5 = rotl32 ((w2 ^ wd ^ w7 ^ w5), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w5); + w6 = rotl32 ((w3 ^ we ^ w8 ^ w6), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w6); + w7 = rotl32 ((w4 ^ wf ^ w9 ^ w7), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w7); + w8 = rotl32 ((w5 ^ w0 ^ wa ^ w8), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w8); + w9 = rotl32 ((w6 ^ w1 ^ wb ^ w9), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w9); + wa = rotl32 ((w7 ^ w2 ^ wc ^ wa), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wa); + wb = rotl32 ((w8 ^ w3 ^ wd ^ wb), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wb); + + #undef K + #define K SHA1C03 + + wc = rotl32 ((w9 ^ w4 ^ we ^ wc), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wc); + wd = rotl32 ((wa ^ w5 ^ wf ^ wd), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wd); + we = rotl32 ((wb ^ w6 ^ w0 ^ we), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, we); + wf = rotl32 ((wc ^ w7 ^ w1 ^ wf), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wf); + w0 = rotl32 ((wd ^ w8 ^ w2 ^ w0), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w0); + w1 = rotl32 ((we ^ w9 ^ w3 ^ w1), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w1); + w2 = rotl32 ((wf ^ wa ^ w4 ^ w2), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w2); + w3 = rotl32 ((w0 ^ wb ^ w5 ^ w3), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w3); + w4 = rotl32 ((w1 ^ wc ^ w6 ^ w4), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w4); + w5 = rotl32 ((w2 ^ wd ^ w7 ^ w5), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w5); + w6 = rotl32 ((w3 ^ we ^ w8 ^ w6), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w6); + w7 = rotl32 ((w4 ^ wf ^ w9 ^ w7), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w7); + w8 = rotl32 ((w5 ^ w0 ^ wa ^ w8), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w8); + w9 = rotl32 ((w6 ^ w1 ^ wb ^ w9), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w9); + wa = rotl32 ((w7 ^ w2 ^ wc ^ wa), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wa); + wb = rotl32 ((w8 ^ w3 ^ wd ^ wb), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wb); + + if (allx (e != e_rev)) continue; + + wc = rotl32 ((w9 ^ w4 ^ we ^ wc), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wc); + wd = rotl32 ((wa ^ w5 ^ wf ^ wd), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wd); + we = rotl32 ((wb ^ w6 ^ w0 ^ we), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, we); + wf = rotl32 ((wc ^ w7 ^ w1 ^ wf), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wf); + + const u32x r0 = d; + const u32x r1 = e; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_S + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m04900_s08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m04900_s16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/amd/m04900_a3.cl b/amd/m04900_a3.cl new file mode 100644 index 0000000000..30ccc70835 --- /dev/null +++ b/amd/m04900_a3.cl @@ -0,0 +1,974 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _SHA1_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW4 +#define VECT_SIZE4 +#endif + +#ifdef VLIW5 +#define VECT_SIZE4 +#endif + +#define DGST_R0 3 +#define DGST_R1 4 +#define DGST_R2 2 +#define DGST_R3 1 + +#include "include/kernel_functions.c" +#include "types_amd.c" +#include "common_amd.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +static void m04900m (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], const u32 pw_len, __global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset) +{ + /** + * modifier + */ + + const u32 gid = get_global_id (0); + const u32 lid = get_local_id (0); + + /** + * salt + */ + + u32 salt_buf0_t[4]; + + salt_buf0_t[0] = salt_bufs[salt_pos].salt_buf[0]; + salt_buf0_t[1] = salt_bufs[salt_pos].salt_buf[1]; + salt_buf0_t[2] = salt_bufs[salt_pos].salt_buf[2]; + salt_buf0_t[3] = salt_bufs[salt_pos].salt_buf[3]; + + u32 salt_buf1_t[4]; + + salt_buf1_t[0] = salt_bufs[salt_pos].salt_buf[4]; + salt_buf1_t[1] = salt_bufs[salt_pos].salt_buf[5]; + salt_buf1_t[2] = salt_bufs[salt_pos].salt_buf[6]; + salt_buf1_t[3] = salt_bufs[salt_pos].salt_buf[7]; + + u32 salt_buf2_t[4]; + + salt_buf2_t[0] = 0; + salt_buf2_t[1] = 0; + salt_buf2_t[2] = 0; + salt_buf2_t[3] = 0; + + u32 salt_buf3_t[4]; + + salt_buf3_t[0] = 0; + salt_buf3_t[1] = 0; + salt_buf3_t[2] = 0; + salt_buf3_t[3] = 0; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + const u32 pw_salt_len = salt_len + pw_len + salt_len; + + // first we need to switch the right-hand salt to the correct position (2nd salt) + + switch_buffer_by_offset (salt_buf0_t, salt_buf1_t, salt_buf2_t, salt_buf3_t, salt_len + pw_len); + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[7]; + + u32 salt_buf2[4]; + + salt_buf2[0] = 0; + salt_buf2[1] = 0; + salt_buf2[2] = 0; + salt_buf2[3] = 0; + + u32 salt_buf3[4]; + + salt_buf3[0] = 0; + salt_buf3[1] = 0; + salt_buf3[2] = 0; + salt_buf3[3] = 0; + + // concatenate the 1st and 2nd instance of the salt + + salt_buf0[0] |= salt_buf0_t[0]; + salt_buf0[1] |= salt_buf0_t[1]; + salt_buf0[2] |= salt_buf0_t[2]; + salt_buf0[3] |= salt_buf0_t[3]; + + salt_buf1[0] |= salt_buf1_t[0]; + salt_buf1[1] |= salt_buf1_t[1]; + salt_buf1[2] |= salt_buf1_t[2]; + salt_buf1[3] |= salt_buf1_t[3]; + + salt_buf2[0] |= salt_buf2_t[0]; + salt_buf2[1] |= salt_buf2_t[1]; + salt_buf2[2] |= salt_buf2_t[2]; + salt_buf2[3] |= salt_buf2_t[3]; + + salt_buf3[0] |= salt_buf3_t[0]; + salt_buf3[1] |= salt_buf3_t[1]; + salt_buf3[2] |= salt_buf3_t[2]; + salt_buf3[3] |= salt_buf3_t[3]; + + append_0x80_4 (salt_buf0, salt_buf1, salt_buf2, salt_buf3, pw_salt_len); + + /** + * loop + */ + + u32x w0l = w0[0]; + + for (u32 il_pos = 0; il_pos < bfs_cnt; il_pos++) + { + const u32 w0r = bfs_buf[il_pos].i; + + w0[0] = w0l | w0r; + + u32x w0_t[4]; + + w0_t[0] = w0[0]; + w0_t[1] = w0[1]; + w0_t[2] = w0[2]; + w0_t[3] = w0[3]; + + u32x w1_t[4]; + + w1_t[0] = w1[0]; + w1_t[1] = w1[1]; + w1_t[2] = w1[2]; + w1_t[3] = w1[3]; + + u32x w2_t[4]; + + w2_t[0] = w2[0]; + w2_t[1] = w2[1]; + w2_t[2] = w2[2]; + w2_t[3] = w2[3]; + + u32x w3_t[4]; + + w3_t[0] = w3[0]; + w3_t[1] = w3[1]; + w3_t[2] = w3[2]; + w3_t[3] = w3[3]; + + /** + * put the password after the first salt but before the second salt + */ + + switch_buffer_by_offset (w0_t, w1_t, w2_t, w3_t, salt_len); + + w0_t[0] |= salt_buf0[0]; + w0_t[1] |= salt_buf0[1]; + w0_t[2] |= salt_buf0[2]; + w0_t[3] |= salt_buf0[3]; + w1_t[0] |= salt_buf1[0]; + w1_t[1] |= salt_buf1[1]; + w1_t[2] |= salt_buf1[2]; + w1_t[3] |= salt_buf1[3]; + w2_t[0] |= salt_buf2[0]; + w2_t[1] |= salt_buf2[1]; + w2_t[2] |= salt_buf2[2]; + w2_t[3] |= salt_buf2[3]; + w3_t[0] |= salt_buf3[0]; + w3_t[1] |= salt_buf3[1]; + w3_t[2] |= salt_buf3[2]; + + u32x w0 = swap_workaround (w0_t[0]); + u32x w1 = swap_workaround (w0_t[1]); + u32x w2 = swap_workaround (w0_t[2]); + u32x w3 = swap_workaround (w0_t[3]); + u32x w4 = swap_workaround (w1_t[0]); + u32x w5 = swap_workaround (w1_t[1]); + u32x w6 = swap_workaround (w1_t[2]); + u32x w7 = swap_workaround (w1_t[3]); + u32x w8 = swap_workaround (w2_t[0]); + u32x w9 = swap_workaround (w2_t[1]); + u32x wa = swap_workaround (w2_t[2]); + u32x wb = swap_workaround (w2_t[3]); + u32x wc = swap_workaround (w3_t[0]); + u32x wd = swap_workaround (w3_t[1]); + u32x we = swap_workaround (w3_t[2]); + u32x wf = pw_salt_len * 8; + + /** + * sha1 + */ + + u32x a = SHA1M_A; + u32x b = SHA1M_B; + u32x c = SHA1M_C; + u32x d = SHA1M_D; + u32x e = SHA1M_E; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w0); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w1); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w2); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w3); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w4); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w5); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w6); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w7); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w8); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w9); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wa); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, wb); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, wc); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, wd); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, we); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wf); + w0 = rotl32 ((wd ^ w8 ^ w2 ^ w0), 1u); SHA1_STEP (SHA1_F0o, e, a, b, c, d, w0); + w1 = rotl32 ((we ^ w9 ^ w3 ^ w1), 1u); SHA1_STEP (SHA1_F0o, d, e, a, b, c, w1); + w2 = rotl32 ((wf ^ wa ^ w4 ^ w2), 1u); SHA1_STEP (SHA1_F0o, c, d, e, a, b, w2); + w3 = rotl32 ((w0 ^ wb ^ w5 ^ w3), 1u); SHA1_STEP (SHA1_F0o, b, c, d, e, a, w3); + + #undef K + #define K SHA1C01 + + w4 = rotl32 ((w1 ^ wc ^ w6 ^ w4), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w4); + w5 = rotl32 ((w2 ^ wd ^ w7 ^ w5), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w5); + w6 = rotl32 ((w3 ^ we ^ w8 ^ w6), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w6); + w7 = rotl32 ((w4 ^ wf ^ w9 ^ w7), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w7); + w8 = rotl32 ((w5 ^ w0 ^ wa ^ w8), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w8); + w9 = rotl32 ((w6 ^ w1 ^ wb ^ w9), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w9); + wa = rotl32 ((w7 ^ w2 ^ wc ^ wa), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wa); + wb = rotl32 ((w8 ^ w3 ^ wd ^ wb), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wb); + wc = rotl32 ((w9 ^ w4 ^ we ^ wc), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wc); + wd = rotl32 ((wa ^ w5 ^ wf ^ wd), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wd); + we = rotl32 ((wb ^ w6 ^ w0 ^ we), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, we); + wf = rotl32 ((wc ^ w7 ^ w1 ^ wf), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wf); + w0 = rotl32 ((wd ^ w8 ^ w2 ^ w0), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w0); + w1 = rotl32 ((we ^ w9 ^ w3 ^ w1), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1); + w2 = rotl32 ((wf ^ wa ^ w4 ^ w2), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w2); + w3 = rotl32 ((w0 ^ wb ^ w5 ^ w3), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w3); + w4 = rotl32 ((w1 ^ wc ^ w6 ^ w4), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w4); + w5 = rotl32 ((w2 ^ wd ^ w7 ^ w5), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w5); + w6 = rotl32 ((w3 ^ we ^ w8 ^ w6), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w6); + w7 = rotl32 ((w4 ^ wf ^ w9 ^ w7), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w7); + + #undef K + #define K SHA1C02 + + w8 = rotl32 ((w5 ^ w0 ^ wa ^ w8), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w8); + w9 = rotl32 ((w6 ^ w1 ^ wb ^ w9), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w9); + wa = rotl32 ((w7 ^ w2 ^ wc ^ wa), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wa); + wb = rotl32 ((w8 ^ w3 ^ wd ^ wb), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wb); + wc = rotl32 ((w9 ^ w4 ^ we ^ wc), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wc); + wd = rotl32 ((wa ^ w5 ^ wf ^ wd), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, wd); + we = rotl32 ((wb ^ w6 ^ w0 ^ we), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, we); + wf = rotl32 ((wc ^ w7 ^ w1 ^ wf), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wf); + w0 = rotl32 ((wd ^ w8 ^ w2 ^ w0), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w0); + w1 = rotl32 ((we ^ w9 ^ w3 ^ w1), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w1); + w2 = rotl32 ((wf ^ wa ^ w4 ^ w2), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w2); + w3 = rotl32 ((w0 ^ wb ^ w5 ^ w3), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w3); + w4 = rotl32 ((w1 ^ wc ^ w6 ^ w4), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w4); + w5 = rotl32 ((w2 ^ wd ^ w7 ^ w5), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w5); + w6 = rotl32 ((w3 ^ we ^ w8 ^ w6), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w6); + w7 = rotl32 ((w4 ^ wf ^ w9 ^ w7), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w7); + w8 = rotl32 ((w5 ^ w0 ^ wa ^ w8), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w8); + w9 = rotl32 ((w6 ^ w1 ^ wb ^ w9), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w9); + wa = rotl32 ((w7 ^ w2 ^ wc ^ wa), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wa); + wb = rotl32 ((w8 ^ w3 ^ wd ^ wb), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wb); + + #undef K + #define K SHA1C03 + + wc = rotl32 ((w9 ^ w4 ^ we ^ wc), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wc); + wd = rotl32 ((wa ^ w5 ^ wf ^ wd), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wd); + we = rotl32 ((wb ^ w6 ^ w0 ^ we), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, we); + wf = rotl32 ((wc ^ w7 ^ w1 ^ wf), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wf); + w0 = rotl32 ((wd ^ w8 ^ w2 ^ w0), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w0); + w1 = rotl32 ((we ^ w9 ^ w3 ^ w1), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w1); + w2 = rotl32 ((wf ^ wa ^ w4 ^ w2), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w2); + w3 = rotl32 ((w0 ^ wb ^ w5 ^ w3), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w3); + w4 = rotl32 ((w1 ^ wc ^ w6 ^ w4), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w4); + w5 = rotl32 ((w2 ^ wd ^ w7 ^ w5), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w5); + w6 = rotl32 ((w3 ^ we ^ w8 ^ w6), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w6); + w7 = rotl32 ((w4 ^ wf ^ w9 ^ w7), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w7); + w8 = rotl32 ((w5 ^ w0 ^ wa ^ w8), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w8); + w9 = rotl32 ((w6 ^ w1 ^ wb ^ w9), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w9); + wa = rotl32 ((w7 ^ w2 ^ wc ^ wa), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wa); + wb = rotl32 ((w8 ^ w3 ^ wd ^ wb), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wb); + wc = rotl32 ((w9 ^ w4 ^ we ^ wc), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wc); + wd = rotl32 ((wa ^ w5 ^ wf ^ wd), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wd); + we = rotl32 ((wb ^ w6 ^ w0 ^ we), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, we); + wf = rotl32 ((wc ^ w7 ^ w1 ^ wf), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wf); + + const u32x r0 = d; + const u32x r1 = e; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_M + } +} + +static void m04900s (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], const u32 pw_len, __global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset) +{ + /** + * modifier + */ + + const u32 gid = get_global_id (0); + const u32 lid = get_local_id (0); + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * reverse + */ + + const u32 e_rev = rotl32 (search[1], 2u); + + /** + * salt + */ + + u32 salt_buf0_t[4]; + + salt_buf0_t[0] = salt_bufs[salt_pos].salt_buf[0]; + salt_buf0_t[1] = salt_bufs[salt_pos].salt_buf[1]; + salt_buf0_t[2] = salt_bufs[salt_pos].salt_buf[2]; + salt_buf0_t[3] = salt_bufs[salt_pos].salt_buf[3]; + + u32 salt_buf1_t[4]; + + salt_buf1_t[0] = salt_bufs[salt_pos].salt_buf[4]; + salt_buf1_t[1] = salt_bufs[salt_pos].salt_buf[5]; + salt_buf1_t[2] = salt_bufs[salt_pos].salt_buf[6]; + salt_buf1_t[3] = salt_bufs[salt_pos].salt_buf[7]; + + u32 salt_buf2_t[4]; + + salt_buf2_t[0] = 0; + salt_buf2_t[1] = 0; + salt_buf2_t[2] = 0; + salt_buf2_t[3] = 0; + + u32 salt_buf3_t[4]; + + salt_buf3_t[0] = 0; + salt_buf3_t[1] = 0; + salt_buf3_t[2] = 0; + salt_buf3_t[3] = 0; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + const u32 pw_salt_len = salt_len + pw_len + salt_len; + + // first we need to switch the right-hand salt to the correct position (2nd salt) + + switch_buffer_by_offset (salt_buf0_t, salt_buf1_t, salt_buf2_t, salt_buf3_t, salt_len + pw_len); + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[7]; + + u32 salt_buf2[4]; + + salt_buf2[0] = 0; + salt_buf2[1] = 0; + salt_buf2[2] = 0; + salt_buf2[3] = 0; + + u32 salt_buf3[4]; + + salt_buf3[0] = 0; + salt_buf3[1] = 0; + salt_buf3[2] = 0; + salt_buf3[3] = 0; + + // concatenate the 1st and 2nd instance of the salt + + salt_buf0[0] |= salt_buf0_t[0]; + salt_buf0[1] |= salt_buf0_t[1]; + salt_buf0[2] |= salt_buf0_t[2]; + salt_buf0[3] |= salt_buf0_t[3]; + + salt_buf1[0] |= salt_buf1_t[0]; + salt_buf1[1] |= salt_buf1_t[1]; + salt_buf1[2] |= salt_buf1_t[2]; + salt_buf1[3] |= salt_buf1_t[3]; + + salt_buf2[0] |= salt_buf2_t[0]; + salt_buf2[1] |= salt_buf2_t[1]; + salt_buf2[2] |= salt_buf2_t[2]; + salt_buf2[3] |= salt_buf2_t[3]; + + salt_buf3[0] |= salt_buf3_t[0]; + salt_buf3[1] |= salt_buf3_t[1]; + salt_buf3[2] |= salt_buf3_t[2]; + salt_buf3[3] |= salt_buf3_t[3]; + + append_0x80_4 (salt_buf0, salt_buf1, salt_buf2, salt_buf3, pw_salt_len); + + /** + * loop + */ + + u32x w0l = w0[0]; + + for (u32 il_pos = 0; il_pos < bfs_cnt; il_pos++) + { + const u32 w0r = bfs_buf[il_pos].i; + + w0[0] = w0l | w0r; + + u32x w0_t[4]; + + w0_t[0] = w0[0]; + w0_t[1] = w0[1]; + w0_t[2] = w0[2]; + w0_t[3] = w0[3]; + + u32x w1_t[4]; + + w1_t[0] = w1[0]; + w1_t[1] = w1[1]; + w1_t[2] = w1[2]; + w1_t[3] = w1[3]; + + u32x w2_t[4]; + + w2_t[0] = w2[0]; + w2_t[1] = w2[1]; + w2_t[2] = w2[2]; + w2_t[3] = w2[3]; + + u32x w3_t[4]; + + w3_t[0] = w3[0]; + w3_t[1] = w3[1]; + w3_t[2] = w3[2]; + w3_t[3] = w3[3]; + + /** + * put the password after the first salt but before the second salt + */ + + switch_buffer_by_offset (w0_t, w1_t, w2_t, w3_t, salt_len); + + w0_t[0] |= salt_buf0[0]; + w0_t[1] |= salt_buf0[1]; + w0_t[2] |= salt_buf0[2]; + w0_t[3] |= salt_buf0[3]; + w1_t[0] |= salt_buf1[0]; + w1_t[1] |= salt_buf1[1]; + w1_t[2] |= salt_buf1[2]; + w1_t[3] |= salt_buf1[3]; + w2_t[0] |= salt_buf2[0]; + w2_t[1] |= salt_buf2[1]; + w2_t[2] |= salt_buf2[2]; + w2_t[3] |= salt_buf2[3]; + w3_t[0] |= salt_buf3[0]; + w3_t[1] |= salt_buf3[1]; + w3_t[2] |= salt_buf3[2]; + + u32x w0 = swap_workaround (w0_t[0]); + u32x w1 = swap_workaround (w0_t[1]); + u32x w2 = swap_workaround (w0_t[2]); + u32x w3 = swap_workaround (w0_t[3]); + u32x w4 = swap_workaround (w1_t[0]); + u32x w5 = swap_workaround (w1_t[1]); + u32x w6 = swap_workaround (w1_t[2]); + u32x w7 = swap_workaround (w1_t[3]); + u32x w8 = swap_workaround (w2_t[0]); + u32x w9 = swap_workaround (w2_t[1]); + u32x wa = swap_workaround (w2_t[2]); + u32x wb = swap_workaround (w2_t[3]); + u32x wc = swap_workaround (w3_t[0]); + u32x wd = swap_workaround (w3_t[1]); + u32x we = swap_workaround (w3_t[2]); + u32x wf = pw_salt_len * 8; + + /** + * sha1 + */ + + u32x a = SHA1M_A; + u32x b = SHA1M_B; + u32x c = SHA1M_C; + u32x d = SHA1M_D; + u32x e = SHA1M_E; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w0); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w1); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w2); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w3); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w4); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w5); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w6); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w7); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w8); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w9); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wa); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, wb); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, wc); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, wd); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, we); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wf); + w0 = rotl32 ((wd ^ w8 ^ w2 ^ w0), 1u); SHA1_STEP (SHA1_F0o, e, a, b, c, d, w0); + w1 = rotl32 ((we ^ w9 ^ w3 ^ w1), 1u); SHA1_STEP (SHA1_F0o, d, e, a, b, c, w1); + w2 = rotl32 ((wf ^ wa ^ w4 ^ w2), 1u); SHA1_STEP (SHA1_F0o, c, d, e, a, b, w2); + w3 = rotl32 ((w0 ^ wb ^ w5 ^ w3), 1u); SHA1_STEP (SHA1_F0o, b, c, d, e, a, w3); + + #undef K + #define K SHA1C01 + + w4 = rotl32 ((w1 ^ wc ^ w6 ^ w4), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w4); + w5 = rotl32 ((w2 ^ wd ^ w7 ^ w5), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w5); + w6 = rotl32 ((w3 ^ we ^ w8 ^ w6), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w6); + w7 = rotl32 ((w4 ^ wf ^ w9 ^ w7), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w7); + w8 = rotl32 ((w5 ^ w0 ^ wa ^ w8), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w8); + w9 = rotl32 ((w6 ^ w1 ^ wb ^ w9), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w9); + wa = rotl32 ((w7 ^ w2 ^ wc ^ wa), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wa); + wb = rotl32 ((w8 ^ w3 ^ wd ^ wb), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wb); + wc = rotl32 ((w9 ^ w4 ^ we ^ wc), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wc); + wd = rotl32 ((wa ^ w5 ^ wf ^ wd), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wd); + we = rotl32 ((wb ^ w6 ^ w0 ^ we), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, we); + wf = rotl32 ((wc ^ w7 ^ w1 ^ wf), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wf); + w0 = rotl32 ((wd ^ w8 ^ w2 ^ w0), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w0); + w1 = rotl32 ((we ^ w9 ^ w3 ^ w1), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1); + w2 = rotl32 ((wf ^ wa ^ w4 ^ w2), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w2); + w3 = rotl32 ((w0 ^ wb ^ w5 ^ w3), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w3); + w4 = rotl32 ((w1 ^ wc ^ w6 ^ w4), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w4); + w5 = rotl32 ((w2 ^ wd ^ w7 ^ w5), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w5); + w6 = rotl32 ((w3 ^ we ^ w8 ^ w6), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w6); + w7 = rotl32 ((w4 ^ wf ^ w9 ^ w7), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w7); + + #undef K + #define K SHA1C02 + + w8 = rotl32 ((w5 ^ w0 ^ wa ^ w8), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w8); + w9 = rotl32 ((w6 ^ w1 ^ wb ^ w9), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w9); + wa = rotl32 ((w7 ^ w2 ^ wc ^ wa), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wa); + wb = rotl32 ((w8 ^ w3 ^ wd ^ wb), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wb); + wc = rotl32 ((w9 ^ w4 ^ we ^ wc), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wc); + wd = rotl32 ((wa ^ w5 ^ wf ^ wd), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, wd); + we = rotl32 ((wb ^ w6 ^ w0 ^ we), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, we); + wf = rotl32 ((wc ^ w7 ^ w1 ^ wf), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wf); + w0 = rotl32 ((wd ^ w8 ^ w2 ^ w0), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w0); + w1 = rotl32 ((we ^ w9 ^ w3 ^ w1), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w1); + w2 = rotl32 ((wf ^ wa ^ w4 ^ w2), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w2); + w3 = rotl32 ((w0 ^ wb ^ w5 ^ w3), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w3); + w4 = rotl32 ((w1 ^ wc ^ w6 ^ w4), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w4); + w5 = rotl32 ((w2 ^ wd ^ w7 ^ w5), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w5); + w6 = rotl32 ((w3 ^ we ^ w8 ^ w6), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w6); + w7 = rotl32 ((w4 ^ wf ^ w9 ^ w7), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w7); + w8 = rotl32 ((w5 ^ w0 ^ wa ^ w8), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w8); + w9 = rotl32 ((w6 ^ w1 ^ wb ^ w9), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w9); + wa = rotl32 ((w7 ^ w2 ^ wc ^ wa), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wa); + wb = rotl32 ((w8 ^ w3 ^ wd ^ wb), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wb); + + #undef K + #define K SHA1C03 + + wc = rotl32 ((w9 ^ w4 ^ we ^ wc), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wc); + wd = rotl32 ((wa ^ w5 ^ wf ^ wd), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wd); + we = rotl32 ((wb ^ w6 ^ w0 ^ we), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, we); + wf = rotl32 ((wc ^ w7 ^ w1 ^ wf), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wf); + w0 = rotl32 ((wd ^ w8 ^ w2 ^ w0), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w0); + w1 = rotl32 ((we ^ w9 ^ w3 ^ w1), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w1); + w2 = rotl32 ((wf ^ wa ^ w4 ^ w2), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w2); + w3 = rotl32 ((w0 ^ wb ^ w5 ^ w3), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w3); + w4 = rotl32 ((w1 ^ wc ^ w6 ^ w4), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w4); + w5 = rotl32 ((w2 ^ wd ^ w7 ^ w5), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w5); + w6 = rotl32 ((w3 ^ we ^ w8 ^ w6), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w6); + w7 = rotl32 ((w4 ^ wf ^ w9 ^ w7), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w7); + w8 = rotl32 ((w5 ^ w0 ^ wa ^ w8), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w8); + w9 = rotl32 ((w6 ^ w1 ^ wb ^ w9), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w9); + wa = rotl32 ((w7 ^ w2 ^ wc ^ wa), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wa); + wb = rotl32 ((w8 ^ w3 ^ wd ^ wb), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wb); + + if (allx (e != e_rev)) continue; + + wc = rotl32 ((w9 ^ w4 ^ we ^ wc), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wc); + wd = rotl32 ((wa ^ w5 ^ wf ^ wd), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wd); + we = rotl32 ((wb ^ w6 ^ w0 ^ we), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, we); + wf = rotl32 ((wc ^ w7 ^ w1 ^ wf), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wf); + + const u32x r0 = d; + const u32x r1 = e; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_S + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m04900_m04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = pws[gid].i[14]; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m04900m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m04900_m08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = pws[gid].i[14]; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m04900m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m04900_m16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = pws[gid].i[ 8]; + w2[1] = pws[gid].i[ 9]; + w2[2] = pws[gid].i[10]; + w2[3] = pws[gid].i[11]; + + u32x w3[4]; + + w3[0] = pws[gid].i[12]; + w3[1] = pws[gid].i[13]; + w3[2] = pws[gid].i[14]; + w3[3] = pws[gid].i[15]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m04900m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m04900_s04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = pws[gid].i[14]; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m04900s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m04900_s08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = pws[gid].i[14]; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m04900s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m04900_s16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = pws[gid].i[ 8]; + w2[1] = pws[gid].i[ 9]; + w2[2] = pws[gid].i[10]; + w2[3] = pws[gid].i[11]; + + u32x w3[4]; + + w3[0] = pws[gid].i[12]; + w3[1] = pws[gid].i[13]; + w3[2] = pws[gid].i[14]; + w3[3] = pws[gid].i[15]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m04900s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} diff --git a/amd/m05000_a0.cl b/amd/m05000_a0.cl new file mode 100644 index 0000000000..6f505fa655 --- /dev/null +++ b/amd/m05000_a0.cl @@ -0,0 +1,514 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _KECCAK_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW4 +#define VECT_SIZE1 +#endif + +#ifdef VLIW5 +#define VECT_SIZE1 +#endif + +#define DGST_R0 2 +#define DGST_R1 3 +#define DGST_R2 4 +#define DGST_R3 5 + +#include "include/kernel_functions.c" +#include "types_amd.c" +#include "common_amd.c" +#include "include/rp_gpu.h" +#include "rp_amd.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +__constant u64 keccakf_rndc[24] = +{ + 0x0000000000000001, 0x0000000000008082, 0x800000000000808a, + 0x8000000080008000, 0x000000000000808b, 0x0000000080000001, + 0x8000000080008081, 0x8000000000008009, 0x000000000000008a, + 0x0000000000000088, 0x0000000080008009, 0x000000008000000a, + 0x000000008000808b, 0x800000000000008b, 0x8000000000008089, + 0x8000000000008003, 0x8000000000008002, 0x8000000000000080, + 0x000000000000800a, 0x800000008000000a, 0x8000000080008081, + 0x8000000000008080, 0x0000000080000001, 0x8000000080008008 +}; + +__constant u32 keccakf_rotc[24] = +{ + 1, 3, 6, 10, 15, 21, 28, 36, 45, 55, 2, 14, + 27, 41, 56, 8, 25, 43, 62, 18, 39, 61, 20, 44 +}; + +__constant u32 keccakf_piln[24] = +{ + 10, 7, 11, 17, 18, 3, 5, 16, 8, 21, 24, 4, + 15, 23, 19, 13, 12, 2, 20, 14, 22, 9, 6, 1 +}; + +#ifndef KECCAK_ROUNDS +#define KECCAK_ROUNDS 24 +#endif + +#define Theta1(s) (st[0 + s] ^ st[5 + s] ^ st[10 + s] ^ st[15 + s] ^ st[20 + s]) + +#define Theta2(s) \ +{ \ + st[ 0 + s] ^= t; \ + st[ 5 + s] ^= t; \ + st[10 + s] ^= t; \ + st[15 + s] ^= t; \ + st[20 + s] ^= t; \ +} + +#define Rho_Pi(s) \ +{ \ + u32 j = keccakf_piln[s]; \ + u32 k = keccakf_rotc[s]; \ + bc0 = st[j]; \ + st[j] = rotl64 (t, k); \ + t = bc0; \ +} + +#define Chi(s) \ +{ \ + bc0 = st[0 + s]; \ + bc1 = st[1 + s]; \ + bc2 = st[2 + s]; \ + bc3 = st[3 + s]; \ + bc4 = st[4 + s]; \ + st[0 + s] ^= ~bc1 & bc2; \ + st[1 + s] ^= ~bc2 & bc3; \ + st[2 + s] ^= ~bc3 & bc4; \ + st[3 + s] ^= ~bc4 & bc0; \ + st[4 + s] ^= ~bc0 & bc1; \ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m05000_m04 (__global pw_t *pws, __global gpu_rule_t * rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + u32x pw_buf1[4]; + + pw_buf1[0] = pws[gid].i[ 4]; + pw_buf1[1] = pws[gid].i[ 5]; + pw_buf1[2] = pws[gid].i[ 6]; + pw_buf1[3] = pws[gid].i[ 7]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * 0x80 keccak, very special + */ + + const u32 mdlen = salt_bufs[salt_pos].keccak_mdlen; + + const u32 rsiz = 200 - (2 * mdlen); + + const u32 add80w = (rsiz - 1) / 8; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + + w0[0] = pw_buf0[0]; + w0[1] = pw_buf0[1]; + w0[2] = pw_buf0[2]; + w0[3] = pw_buf0[3]; + + u32x w1[4]; + + w1[0] = pw_buf1[0]; + w1[1] = pw_buf1[1]; + w1[2] = pw_buf1[2]; + w1[3] = pw_buf1[3]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 out_len = apply_rules (rules_buf[il_pos].cmds, w0, w1, pw_len); + + append_0x01_2 (w0, w1, out_len); + + u64x st[25]; + + #ifdef VECT_SIZE1 + st[ 0] = (u64x) (w0[0]) | (u64x) (w0[1]) << 32; + st[ 1] = (u64x) (w0[2]) | (u64x) (w0[3]) << 32; + st[ 2] = (u64x) (w1[0]) | (u64x) (w1[1]) << 32; + st[ 3] = (u64x) (w1[2]) | (u64x) (w1[3]) << 32; + #endif + + #ifdef VECT_SIZE2 + st[ 0] = (u64x) (w0[0].s0, w0[0].s1) | (u64x) (w0[1].s0, w0[1].s1) << 32; + st[ 1] = (u64x) (w0[2].s0, w0[2].s1) | (u64x) (w0[3].s0, w0[3].s1) << 32; + st[ 2] = (u64x) (w1[0].s0, w1[0].s1) | (u64x) (w1[1].s0, w1[1].s1) << 32; + st[ 3] = (u64x) (w1[2].s0, w1[2].s1) | (u64x) (w1[3].s0, w1[3].s1) << 32; + #endif + + st[ 4] = 0; + st[ 5] = 0; + st[ 6] = 0; + st[ 7] = 0; + st[ 8] = 0; + st[ 9] = 0; + st[10] = 0; + st[11] = 0; + st[12] = 0; + st[13] = 0; + st[14] = 0; + st[15] = 0; + st[16] = 0; + st[17] = 0; + st[18] = 0; + st[19] = 0; + st[20] = 0; + st[21] = 0; + st[22] = 0; + st[23] = 0; + st[24] = 0; + + st[add80w] |= 0x8000000000000000; + + int round; + + for (round = 0; round < KECCAK_ROUNDS; round++) + { + // Theta + + u64x bc0 = Theta1 (0); + u64x bc1 = Theta1 (1); + u64x bc2 = Theta1 (2); + u64x bc3 = Theta1 (3); + u64x bc4 = Theta1 (4); + + u64x t; + + t = bc4 ^ rotl64 (bc1, 1); Theta2 (0); + t = bc0 ^ rotl64 (bc2, 1); Theta2 (1); + t = bc1 ^ rotl64 (bc3, 1); Theta2 (2); + t = bc2 ^ rotl64 (bc4, 1); Theta2 (3); + t = bc3 ^ rotl64 (bc0, 1); Theta2 (4); + + // Rho Pi + + t = st[1]; + + Rho_Pi (0); + Rho_Pi (1); + Rho_Pi (2); + Rho_Pi (3); + Rho_Pi (4); + Rho_Pi (5); + Rho_Pi (6); + Rho_Pi (7); + Rho_Pi (8); + Rho_Pi (9); + Rho_Pi (10); + Rho_Pi (11); + Rho_Pi (12); + Rho_Pi (13); + Rho_Pi (14); + Rho_Pi (15); + Rho_Pi (16); + Rho_Pi (17); + Rho_Pi (18); + Rho_Pi (19); + Rho_Pi (20); + Rho_Pi (21); + Rho_Pi (22); + Rho_Pi (23); + + // Chi + + Chi (0); + Chi (5); + Chi (10); + Chi (15); + Chi (20); + + // Iota + + st[0] ^= keccakf_rndc[round]; + } + + const u32x r0 = l32_from_64 (st[1]); + const u32x r1 = h32_from_64 (st[1]); + const u32x r2 = l32_from_64 (st[2]); + const u32x r3 = h32_from_64 (st[2]); + + #include VECT_COMPARE_M + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m05000_m08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m05000_m16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m05000_s04 (__global pw_t *pws, __global gpu_rule_t * rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + u32x pw_buf1[4]; + + pw_buf1[0] = pws[gid].i[ 4]; + pw_buf1[1] = pws[gid].i[ 5]; + pw_buf1[2] = pws[gid].i[ 6]; + pw_buf1[3] = pws[gid].i[ 7]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * 0x80 keccak, very special + */ + + const u32 mdlen = salt_bufs[salt_pos].keccak_mdlen; + + const u32 rsiz = 200 - (2 * mdlen); + + const u32 add80w = (rsiz - 1) / 8; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + + w0[0] = pw_buf0[0]; + w0[1] = pw_buf0[1]; + w0[2] = pw_buf0[2]; + w0[3] = pw_buf0[3]; + + u32x w1[4]; + + w1[0] = pw_buf1[0]; + w1[1] = pw_buf1[1]; + w1[2] = pw_buf1[2]; + w1[3] = pw_buf1[3]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 out_len = apply_rules (rules_buf[il_pos].cmds, w0, w1, pw_len); + + append_0x01_2 (w0, w1, out_len); + + u64x st[25]; + + #ifdef VECT_SIZE1 + st[ 0] = (u64x) (w0[0]) | (u64x) (w0[1]) << 32; + st[ 1] = (u64x) (w0[2]) | (u64x) (w0[3]) << 32; + st[ 2] = (u64x) (w1[0]) | (u64x) (w1[1]) << 32; + st[ 3] = (u64x) (w1[2]) | (u64x) (w1[3]) << 32; + #endif + + #ifdef VECT_SIZE2 + st[ 0] = (u64x) (w0[0].s0, w0[0].s1) | (u64x) (w0[1].s0, w0[1].s1) << 32; + st[ 1] = (u64x) (w0[2].s0, w0[2].s1) | (u64x) (w0[3].s0, w0[3].s1) << 32; + st[ 2] = (u64x) (w1[0].s0, w1[0].s1) | (u64x) (w1[1].s0, w1[1].s1) << 32; + st[ 3] = (u64x) (w1[2].s0, w1[2].s1) | (u64x) (w1[3].s0, w1[3].s1) << 32; + #endif + + st[ 4] = 0; + st[ 5] = 0; + st[ 6] = 0; + st[ 7] = 0; + st[ 8] = 0; + st[ 9] = 0; + st[10] = 0; + st[11] = 0; + st[12] = 0; + st[13] = 0; + st[14] = 0; + st[15] = 0; + st[16] = 0; + st[17] = 0; + st[18] = 0; + st[19] = 0; + st[20] = 0; + st[21] = 0; + st[22] = 0; + st[23] = 0; + st[24] = 0; + + st[add80w] |= 0x8000000000000000; + + int round; + + for (round = 0; round < KECCAK_ROUNDS; round++) + { + // Theta + + u64x bc0 = Theta1 (0); + u64x bc1 = Theta1 (1); + u64x bc2 = Theta1 (2); + u64x bc3 = Theta1 (3); + u64x bc4 = Theta1 (4); + + u64x t; + + t = bc4 ^ rotl64 (bc1, 1); Theta2 (0); + t = bc0 ^ rotl64 (bc2, 1); Theta2 (1); + t = bc1 ^ rotl64 (bc3, 1); Theta2 (2); + t = bc2 ^ rotl64 (bc4, 1); Theta2 (3); + t = bc3 ^ rotl64 (bc0, 1); Theta2 (4); + + // Rho Pi + + t = st[1]; + + Rho_Pi (0); + Rho_Pi (1); + Rho_Pi (2); + Rho_Pi (3); + Rho_Pi (4); + Rho_Pi (5); + Rho_Pi (6); + Rho_Pi (7); + Rho_Pi (8); + Rho_Pi (9); + Rho_Pi (10); + Rho_Pi (11); + Rho_Pi (12); + Rho_Pi (13); + Rho_Pi (14); + Rho_Pi (15); + Rho_Pi (16); + Rho_Pi (17); + Rho_Pi (18); + Rho_Pi (19); + Rho_Pi (20); + Rho_Pi (21); + Rho_Pi (22); + Rho_Pi (23); + + // Chi + + Chi (0); + Chi (5); + Chi (10); + Chi (15); + Chi (20); + + // Iota + + st[0] ^= keccakf_rndc[round]; + } + + const u32x r0 = l32_from_64 (st[1]); + const u32x r1 = h32_from_64 (st[1]); + const u32x r2 = l32_from_64 (st[2]); + const u32x r3 = h32_from_64 (st[2]); + + #include VECT_COMPARE_S + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m05000_s08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m05000_s16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/amd/m05000_a1.cl b/amd/m05000_a1.cl new file mode 100644 index 0000000000..6d0686b4f0 --- /dev/null +++ b/amd/m05000_a1.cl @@ -0,0 +1,624 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _KECCAK_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW4 +#define VECT_SIZE1 +#endif + +#ifdef VLIW5 +#define VECT_SIZE1 +#endif + +#define DGST_R0 2 +#define DGST_R1 3 +#define DGST_R2 4 +#define DGST_R3 5 + +#include "include/kernel_functions.c" +#include "types_amd.c" +#include "common_amd.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +__constant u64 keccakf_rndc[24] = +{ + 0x0000000000000001, 0x0000000000008082, 0x800000000000808a, + 0x8000000080008000, 0x000000000000808b, 0x0000000080000001, + 0x8000000080008081, 0x8000000000008009, 0x000000000000008a, + 0x0000000000000088, 0x0000000080008009, 0x000000008000000a, + 0x000000008000808b, 0x800000000000008b, 0x8000000000008089, + 0x8000000000008003, 0x8000000000008002, 0x8000000000000080, + 0x000000000000800a, 0x800000008000000a, 0x8000000080008081, + 0x8000000000008080, 0x0000000080000001, 0x8000000080008008 +}; + +__constant u32 keccakf_rotc[24] = +{ + 1, 3, 6, 10, 15, 21, 28, 36, 45, 55, 2, 14, + 27, 41, 56, 8, 25, 43, 62, 18, 39, 61, 20, 44 +}; + +__constant u32 keccakf_piln[24] = +{ + 10, 7, 11, 17, 18, 3, 5, 16, 8, 21, 24, 4, + 15, 23, 19, 13, 12, 2, 20, 14, 22, 9, 6, 1 +}; + +#ifndef KECCAK_ROUNDS +#define KECCAK_ROUNDS 24 +#endif + +#define Theta1(s) (st[0 + s] ^ st[5 + s] ^ st[10 + s] ^ st[15 + s] ^ st[20 + s]) + +#define Theta2(s) \ +{ \ + st[ 0 + s] ^= t; \ + st[ 5 + s] ^= t; \ + st[10 + s] ^= t; \ + st[15 + s] ^= t; \ + st[20 + s] ^= t; \ +} + +#define Rho_Pi(s) \ +{ \ + u32 j = keccakf_piln[s]; \ + u32 k = keccakf_rotc[s]; \ + bc0 = st[j]; \ + st[j] = rotl64 (t, k); \ + t = bc0; \ +} + +#define Chi(s) \ +{ \ + bc0 = st[0 + s]; \ + bc1 = st[1 + s]; \ + bc2 = st[2 + s]; \ + bc3 = st[3 + s]; \ + bc4 = st[4 + s]; \ + st[0 + s] ^= ~bc1 & bc2; \ + st[1 + s] ^= ~bc2 & bc3; \ + st[2 + s] ^= ~bc3 & bc4; \ + st[3 + s] ^= ~bc4 & bc0; \ + st[4 + s] ^= ~bc0 & bc1; \ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m05000_m04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + append_0x01_2 (wordl0, wordl1, pw_l_len); + + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, combs_buf[0].pw_len); + } + + /** + * 0x80 keccak, very special + */ + + const u32 mdlen = salt_bufs[salt_pos].keccak_mdlen; + + const u32 rsiz = 200 - (2 * mdlen); + + const u32 add80w = (rsiz - 1) / 8; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = combs_buf[il_pos].pw_len; + + const u32 pw_len = pw_l_len + pw_r_len; + + u32 wordr0[4]; + + wordr0[0] = combs_buf[il_pos].i[0]; + wordr0[1] = combs_buf[il_pos].i[1]; + wordr0[2] = combs_buf[il_pos].i[2]; + wordr0[3] = combs_buf[il_pos].i[3]; + + u32 wordr1[4]; + + wordr1[0] = combs_buf[il_pos].i[4]; + wordr1[1] = combs_buf[il_pos].i[5]; + wordr1[2] = combs_buf[il_pos].i[6]; + wordr1[3] = combs_buf[il_pos].i[7]; + + u32 wordr2[4]; + + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + + u32 wordr3[4]; + + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + append_0x01_2 (wordr0, wordr1, pw_r_len); + + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + u32x w0[4]; + + w0[0] = wordl0[0] | wordr0[0]; + w0[1] = wordl0[1] | wordr0[1]; + w0[2] = wordl0[2] | wordr0[2]; + w0[3] = wordl0[3] | wordr0[3]; + + u32x w1[4]; + + w1[0] = wordl1[0] | wordr1[0]; + w1[1] = wordl1[1] | wordr1[1]; + w1[2] = wordl1[2] | wordr1[2]; + w1[3] = wordl1[3] | wordr1[3]; + + u32x w2[4]; + + w2[0] = wordl2[0] | wordr2[0]; + w2[1] = wordl2[1] | wordr2[1]; + w2[2] = wordl2[2] | wordr2[2]; + w2[3] = wordl2[3] | wordr2[3]; + + u32x w3[4]; + + w3[0] = wordl3[0] | wordr3[0]; + w3[1] = wordl3[1] | wordr3[1]; + w3[2] = pw_len * 8; + w3[3] = 0; + + u64x st[25]; + + #ifdef VECT_SIZE1 + st[ 0] = (u64x) (w0[0]) | (u64x) (w0[1]) << 32; + st[ 1] = (u64x) (w0[2]) | (u64x) (w0[3]) << 32; + st[ 2] = (u64x) (w1[0]) | (u64x) (w1[1]) << 32; + st[ 3] = (u64x) (w1[2]) | (u64x) (w1[3]) << 32; + #endif + + #ifdef VECT_SIZE2 + st[ 0] = (u64x) (w0[0].s0, w0[0].s1) | (u64x) (w0[1].s0, w0[1].s1) << 32; + st[ 1] = (u64x) (w0[2].s0, w0[2].s1) | (u64x) (w0[3].s0, w0[3].s1) << 32; + st[ 2] = (u64x) (w1[0].s0, w1[0].s1) | (u64x) (w1[1].s0, w1[1].s1) << 32; + st[ 3] = (u64x) (w1[2].s0, w1[2].s1) | (u64x) (w1[3].s0, w1[3].s1) << 32; + #endif + + st[ 4] = 0; + st[ 5] = 0; + st[ 6] = 0; + st[ 7] = 0; + st[ 8] = 0; + st[ 9] = 0; + st[10] = 0; + st[11] = 0; + st[12] = 0; + st[13] = 0; + st[14] = 0; + st[15] = 0; + st[16] = 0; + st[17] = 0; + st[18] = 0; + st[19] = 0; + st[20] = 0; + st[21] = 0; + st[22] = 0; + st[23] = 0; + st[24] = 0; + + st[add80w] |= 0x8000000000000000; + + int round; + + for (round = 0; round < KECCAK_ROUNDS; round++) + { + // Theta + + u64x bc0 = Theta1 (0); + u64x bc1 = Theta1 (1); + u64x bc2 = Theta1 (2); + u64x bc3 = Theta1 (3); + u64x bc4 = Theta1 (4); + + u64x t; + + t = bc4 ^ rotl64 (bc1, 1); Theta2 (0); + t = bc0 ^ rotl64 (bc2, 1); Theta2 (1); + t = bc1 ^ rotl64 (bc3, 1); Theta2 (2); + t = bc2 ^ rotl64 (bc4, 1); Theta2 (3); + t = bc3 ^ rotl64 (bc0, 1); Theta2 (4); + + // Rho Pi + + t = st[1]; + + Rho_Pi (0); + Rho_Pi (1); + Rho_Pi (2); + Rho_Pi (3); + Rho_Pi (4); + Rho_Pi (5); + Rho_Pi (6); + Rho_Pi (7); + Rho_Pi (8); + Rho_Pi (9); + Rho_Pi (10); + Rho_Pi (11); + Rho_Pi (12); + Rho_Pi (13); + Rho_Pi (14); + Rho_Pi (15); + Rho_Pi (16); + Rho_Pi (17); + Rho_Pi (18); + Rho_Pi (19); + Rho_Pi (20); + Rho_Pi (21); + Rho_Pi (22); + Rho_Pi (23); + + // Chi + + Chi (0); + Chi (5); + Chi (10); + Chi (15); + Chi (20); + + // Iota + + st[0] ^= keccakf_rndc[round]; + } + + const u32x r0 = l32_from_64 (st[1]); + const u32x r1 = h32_from_64 (st[1]); + const u32x r2 = l32_from_64 (st[2]); + const u32x r3 = h32_from_64 (st[2]); + + #include VECT_COMPARE_M + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m05000_m08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m05000_m16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m05000_s04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + append_0x01_2 (wordl0, wordl1, pw_l_len); + + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, combs_buf[0].pw_len); + } + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * 0x80 keccak, very special + */ + + const u32 mdlen = salt_bufs[salt_pos].keccak_mdlen; + + const u32 rsiz = 200 - (2 * mdlen); + + const u32 add80w = (rsiz - 1) / 8; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = combs_buf[il_pos].pw_len; + + const u32 pw_len = pw_l_len + pw_r_len; + + u32 wordr0[4]; + + wordr0[0] = combs_buf[il_pos].i[0]; + wordr0[1] = combs_buf[il_pos].i[1]; + wordr0[2] = combs_buf[il_pos].i[2]; + wordr0[3] = combs_buf[il_pos].i[3]; + + u32 wordr1[4]; + + wordr1[0] = combs_buf[il_pos].i[4]; + wordr1[1] = combs_buf[il_pos].i[5]; + wordr1[2] = combs_buf[il_pos].i[6]; + wordr1[3] = combs_buf[il_pos].i[7]; + + u32 wordr2[4]; + + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + + u32 wordr3[4]; + + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + append_0x01_2 (wordr0, wordr1, pw_r_len); + + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + u32x w0[4]; + + w0[0] = wordl0[0] | wordr0[0]; + w0[1] = wordl0[1] | wordr0[1]; + w0[2] = wordl0[2] | wordr0[2]; + w0[3] = wordl0[3] | wordr0[3]; + + u32x w1[4]; + + w1[0] = wordl1[0] | wordr1[0]; + w1[1] = wordl1[1] | wordr1[1]; + w1[2] = wordl1[2] | wordr1[2]; + w1[3] = wordl1[3] | wordr1[3]; + + u32x w2[4]; + + w2[0] = wordl2[0] | wordr2[0]; + w2[1] = wordl2[1] | wordr2[1]; + w2[2] = wordl2[2] | wordr2[2]; + w2[3] = wordl2[3] | wordr2[3]; + + u32x w3[4]; + + w3[0] = wordl3[0] | wordr3[0]; + w3[1] = wordl3[1] | wordr3[1]; + w3[2] = pw_len * 8; + w3[3] = 0; + + u64x st[25]; + + #ifdef VECT_SIZE1 + st[ 0] = (u64x) (w0[0]) | (u64x) (w0[1]) << 32; + st[ 1] = (u64x) (w0[2]) | (u64x) (w0[3]) << 32; + st[ 2] = (u64x) (w1[0]) | (u64x) (w1[1]) << 32; + st[ 3] = (u64x) (w1[2]) | (u64x) (w1[3]) << 32; + #endif + + #ifdef VECT_SIZE2 + st[ 0] = (u64x) (w0[0].s0, w0[0].s1) | (u64x) (w0[1].s0, w0[1].s1) << 32; + st[ 1] = (u64x) (w0[2].s0, w0[2].s1) | (u64x) (w0[3].s0, w0[3].s1) << 32; + st[ 2] = (u64x) (w1[0].s0, w1[0].s1) | (u64x) (w1[1].s0, w1[1].s1) << 32; + st[ 3] = (u64x) (w1[2].s0, w1[2].s1) | (u64x) (w1[3].s0, w1[3].s1) << 32; + #endif + + st[ 4] = 0; + st[ 5] = 0; + st[ 6] = 0; + st[ 7] = 0; + st[ 8] = 0; + st[ 9] = 0; + st[10] = 0; + st[11] = 0; + st[12] = 0; + st[13] = 0; + st[14] = 0; + st[15] = 0; + st[16] = 0; + st[17] = 0; + st[18] = 0; + st[19] = 0; + st[20] = 0; + st[21] = 0; + st[22] = 0; + st[23] = 0; + st[24] = 0; + + st[add80w] |= 0x8000000000000000; + + int round; + + for (round = 0; round < KECCAK_ROUNDS; round++) + { + // Theta + + u64x bc0 = Theta1 (0); + u64x bc1 = Theta1 (1); + u64x bc2 = Theta1 (2); + u64x bc3 = Theta1 (3); + u64x bc4 = Theta1 (4); + + u64x t; + + t = bc4 ^ rotl64 (bc1, 1); Theta2 (0); + t = bc0 ^ rotl64 (bc2, 1); Theta2 (1); + t = bc1 ^ rotl64 (bc3, 1); Theta2 (2); + t = bc2 ^ rotl64 (bc4, 1); Theta2 (3); + t = bc3 ^ rotl64 (bc0, 1); Theta2 (4); + + // Rho Pi + + t = st[1]; + + Rho_Pi (0); + Rho_Pi (1); + Rho_Pi (2); + Rho_Pi (3); + Rho_Pi (4); + Rho_Pi (5); + Rho_Pi (6); + Rho_Pi (7); + Rho_Pi (8); + Rho_Pi (9); + Rho_Pi (10); + Rho_Pi (11); + Rho_Pi (12); + Rho_Pi (13); + Rho_Pi (14); + Rho_Pi (15); + Rho_Pi (16); + Rho_Pi (17); + Rho_Pi (18); + Rho_Pi (19); + Rho_Pi (20); + Rho_Pi (21); + Rho_Pi (22); + Rho_Pi (23); + + // Chi + + Chi (0); + Chi (5); + Chi (10); + Chi (15); + Chi (20); + + // Iota + + st[0] ^= keccakf_rndc[round]; + } + + const u32x r0 = l32_from_64 (st[1]); + const u32x r1 = h32_from_64 (st[1]); + const u32x r2 = l32_from_64 (st[2]); + const u32x r3 = h32_from_64 (st[2]); + + #include VECT_COMPARE_S + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m05000_s08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m05000_s16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/amd/m05000_a3.cl b/amd/m05000_a3.cl new file mode 100644 index 0000000000..ddaf8052fa --- /dev/null +++ b/amd/m05000_a3.cl @@ -0,0 +1,688 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _KECCAK_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW4 +#define VECT_SIZE1 +#endif + +#ifdef VLIW5 +#define VECT_SIZE1 +#endif + +#define DGST_R0 2 +#define DGST_R1 3 +#define DGST_R2 4 +#define DGST_R3 5 + +#include "include/kernel_functions.c" +#include "types_amd.c" +#include "common_amd.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +__constant u64 keccakf_rndc[24] = +{ + 0x0000000000000001, 0x0000000000008082, 0x800000000000808a, + 0x8000000080008000, 0x000000000000808b, 0x0000000080000001, + 0x8000000080008081, 0x8000000000008009, 0x000000000000008a, + 0x0000000000000088, 0x0000000080008009, 0x000000008000000a, + 0x000000008000808b, 0x800000000000008b, 0x8000000000008089, + 0x8000000000008003, 0x8000000000008002, 0x8000000000000080, + 0x000000000000800a, 0x800000008000000a, 0x8000000080008081, + 0x8000000000008080, 0x0000000080000001, 0x8000000080008008 +}; + +__constant u32 keccakf_rotc[24] = +{ + 1, 3, 6, 10, 15, 21, 28, 36, 45, 55, 2, 14, + 27, 41, 56, 8, 25, 43, 62, 18, 39, 61, 20, 44 +}; + +__constant u32 keccakf_piln[24] = +{ + 10, 7, 11, 17, 18, 3, 5, 16, 8, 21, 24, 4, + 15, 23, 19, 13, 12, 2, 20, 14, 22, 9, 6, 1 +}; + +#ifndef KECCAK_ROUNDS +#define KECCAK_ROUNDS 24 +#endif + +#define Theta1(s) (st[0 + s] ^ st[5 + s] ^ st[10 + s] ^ st[15 + s] ^ st[20 + s]) + +#define Theta2(s) \ +{ \ + st[ 0 + s] ^= t; \ + st[ 5 + s] ^= t; \ + st[10 + s] ^= t; \ + st[15 + s] ^= t; \ + st[20 + s] ^= t; \ +} + +#define Rho_Pi(s) \ +{ \ + u32 j = keccakf_piln[s]; \ + u32 k = keccakf_rotc[s]; \ + bc0 = st[j]; \ + st[j] = rotl64 (t, k); \ + t = bc0; \ +} + +#define Chi(s) \ +{ \ + bc0 = st[0 + s]; \ + bc1 = st[1 + s]; \ + bc2 = st[2 + s]; \ + bc3 = st[3 + s]; \ + bc4 = st[4 + s]; \ + st[0 + s] ^= ~bc1 & bc2; \ + st[1 + s] ^= ~bc2 & bc3; \ + st[2 + s] ^= ~bc3 & bc4; \ + st[3 + s] ^= ~bc4 & bc0; \ + st[4 + s] ^= ~bc0 & bc1; \ +} + +static void m05000m (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], const u32 pw_len, __global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset) +{ + /** + * modifier + */ + + const u32 gid = get_global_id (0); + const u32 lid = get_local_id (0); + + /** + * 0x80 keccak, very special + */ + + const u32 mdlen = salt_bufs[salt_pos].keccak_mdlen; + + const u32 rsiz = 200 - (2 * mdlen); + + const u32 add80w = (rsiz - 1) / 8; + + /** + * loop + */ + + u32x w0l = w0[0]; + + for (u32 il_pos = 0; il_pos < bfs_cnt; il_pos++) + { + const u32 w0r = bfs_buf[il_pos].i; + + w0[0] = w0l | w0r; + + u64x st[25]; + + #ifdef VECT_SIZE1 + st[ 0] = (u64x) (w0[0]) | (u64x) (w0[1]) << 32; + st[ 1] = (u64x) (w0[2]) | (u64x) (w0[3]) << 32; + st[ 2] = (u64x) (w1[0]) | (u64x) (w1[1]) << 32; + st[ 3] = (u64x) (w1[2]) | (u64x) (w1[3]) << 32; + st[ 4] = (u64x) (w2[0]) | (u64x) (w2[1]) << 32; + st[ 5] = (u64x) (w2[2]) | (u64x) (w2[3]) << 32; + st[ 6] = (u64x) (w3[0]) | (u64x) (w3[1]) << 32; + st[ 7] = (u64x) (w3[2]) | (u64x) (w3[3]) << 32; + #endif + + #ifdef VECT_SIZE2 + st[ 0] = (u64x) (w0[0].s0, w0[0].s1) | (u64x) (w0[1].s0, w0[1].s1) << 32; + st[ 1] = (u64x) (w0[2].s0, w0[2].s1) | (u64x) (w0[3].s0, w0[3].s1) << 32; + st[ 2] = (u64x) (w1[0].s0, w1[0].s1) | (u64x) (w1[1].s0, w1[1].s1) << 32; + st[ 3] = (u64x) (w1[2].s0, w1[2].s1) | (u64x) (w1[3].s0, w1[3].s1) << 32; + st[ 4] = (u64x) (w2[0].s0, w2[0].s1) | (u64x) (w2[1].s0, w2[1].s1) << 32; + st[ 5] = (u64x) (w2[2].s0, w2[2].s1) | (u64x) (w2[3].s0, w2[3].s1) << 32; + st[ 6] = (u64x) (w3[0].s0, w3[0].s1) | (u64x) (w3[1].s0, w3[1].s1) << 32; + st[ 7] = (u64x) (w3[2].s0, w3[2].s1) | (u64x) (w3[3].s0, w3[3].s1) << 32; + #endif + + st[ 8] = 0; + st[ 9] = 0; + st[10] = 0; + st[11] = 0; + st[12] = 0; + st[13] = 0; + st[14] = 0; + st[15] = 0; + st[16] = 0; + st[17] = 0; + st[18] = 0; + st[19] = 0; + st[20] = 0; + st[21] = 0; + st[22] = 0; + st[23] = 0; + st[24] = 0; + + st[add80w] |= 0x8000000000000000; + + int round; + + for (round = 0; round < KECCAK_ROUNDS; round++) + { + // Theta + + u64x bc0 = Theta1 (0); + u64x bc1 = Theta1 (1); + u64x bc2 = Theta1 (2); + u64x bc3 = Theta1 (3); + u64x bc4 = Theta1 (4); + + u64x t; + + t = bc4 ^ rotl64 (bc1, 1); Theta2 (0); + t = bc0 ^ rotl64 (bc2, 1); Theta2 (1); + t = bc1 ^ rotl64 (bc3, 1); Theta2 (2); + t = bc2 ^ rotl64 (bc4, 1); Theta2 (3); + t = bc3 ^ rotl64 (bc0, 1); Theta2 (4); + + // Rho Pi + + t = st[1]; + + Rho_Pi (0); + Rho_Pi (1); + Rho_Pi (2); + Rho_Pi (3); + Rho_Pi (4); + Rho_Pi (5); + Rho_Pi (6); + Rho_Pi (7); + Rho_Pi (8); + Rho_Pi (9); + Rho_Pi (10); + Rho_Pi (11); + Rho_Pi (12); + Rho_Pi (13); + Rho_Pi (14); + Rho_Pi (15); + Rho_Pi (16); + Rho_Pi (17); + Rho_Pi (18); + Rho_Pi (19); + Rho_Pi (20); + Rho_Pi (21); + Rho_Pi (22); + Rho_Pi (23); + + // Chi + + Chi (0); + Chi (5); + Chi (10); + Chi (15); + Chi (20); + + // Iota + + st[0] ^= keccakf_rndc[round]; + } + + const u32x r0 = l32_from_64 (st[1]); + const u32x r1 = h32_from_64 (st[1]); + const u32x r2 = l32_from_64 (st[2]); + const u32x r3 = h32_from_64 (st[2]); + + #include VECT_COMPARE_M + } +} + +static void m05000s (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], const u32 pw_len, __global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset) +{ + /** + * modifier + */ + + const u32 gid = get_global_id (0); + const u32 lid = get_local_id (0); + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * 0x80 keccak, very special + */ + + const u32 mdlen = salt_bufs[salt_pos].keccak_mdlen; + + const u32 rsiz = 200 - (2 * mdlen); + + const u32 add80w = (rsiz - 1) / 8; + + /** + * loop + */ + + u32x w0l = w0[0]; + + for (u32 il_pos = 0; il_pos < bfs_cnt; il_pos++) + { + const u32 w0r = bfs_buf[il_pos].i; + + w0[0] = w0l | w0r; + + u64x st[25]; + + #ifdef VECT_SIZE1 + st[ 0] = (u64x) (w0[0]) | (u64x) (w0[1]) << 32; + st[ 1] = (u64x) (w0[2]) | (u64x) (w0[3]) << 32; + st[ 2] = (u64x) (w1[0]) | (u64x) (w1[1]) << 32; + st[ 3] = (u64x) (w1[2]) | (u64x) (w1[3]) << 32; + st[ 4] = (u64x) (w2[0]) | (u64x) (w2[1]) << 32; + st[ 5] = (u64x) (w2[2]) | (u64x) (w2[3]) << 32; + st[ 6] = (u64x) (w3[0]) | (u64x) (w3[1]) << 32; + st[ 7] = (u64x) (w3[2]) | (u64x) (w3[3]) << 32; + #endif + + #ifdef VECT_SIZE2 + st[ 0] = (u64x) (w0[0].s0, w0[0].s1) | (u64x) (w0[1].s0, w0[1].s1) << 32; + st[ 1] = (u64x) (w0[2].s0, w0[2].s1) | (u64x) (w0[3].s0, w0[3].s1) << 32; + st[ 2] = (u64x) (w1[0].s0, w1[0].s1) | (u64x) (w1[1].s0, w1[1].s1) << 32; + st[ 3] = (u64x) (w1[2].s0, w1[2].s1) | (u64x) (w1[3].s0, w1[3].s1) << 32; + st[ 4] = (u64x) (w2[0].s0, w2[0].s1) | (u64x) (w2[1].s0, w2[1].s1) << 32; + st[ 5] = (u64x) (w2[2].s0, w2[2].s1) | (u64x) (w2[3].s0, w2[3].s1) << 32; + st[ 6] = (u64x) (w3[0].s0, w3[0].s1) | (u64x) (w3[1].s0, w3[1].s1) << 32; + st[ 7] = (u64x) (w3[2].s0, w3[2].s1) | (u64x) (w3[3].s0, w3[3].s1) << 32; + #endif + + st[ 8] = 0; + st[ 9] = 0; + st[10] = 0; + st[11] = 0; + st[12] = 0; + st[13] = 0; + st[14] = 0; + st[15] = 0; + st[16] = 0; + st[17] = 0; + st[18] = 0; + st[19] = 0; + st[20] = 0; + st[21] = 0; + st[22] = 0; + st[23] = 0; + st[24] = 0; + + st[add80w] |= 0x8000000000000000; + + int round; + + for (round = 0; round < KECCAK_ROUNDS; round++) + { + // Theta + + u64x bc0 = Theta1 (0); + u64x bc1 = Theta1 (1); + u64x bc2 = Theta1 (2); + u64x bc3 = Theta1 (3); + u64x bc4 = Theta1 (4); + + u64x t; + + t = bc4 ^ rotl64 (bc1, 1); Theta2 (0); + t = bc0 ^ rotl64 (bc2, 1); Theta2 (1); + t = bc1 ^ rotl64 (bc3, 1); Theta2 (2); + t = bc2 ^ rotl64 (bc4, 1); Theta2 (3); + t = bc3 ^ rotl64 (bc0, 1); Theta2 (4); + + // Rho Pi + + t = st[1]; + + Rho_Pi (0); + Rho_Pi (1); + Rho_Pi (2); + Rho_Pi (3); + Rho_Pi (4); + Rho_Pi (5); + Rho_Pi (6); + Rho_Pi (7); + Rho_Pi (8); + Rho_Pi (9); + Rho_Pi (10); + Rho_Pi (11); + Rho_Pi (12); + Rho_Pi (13); + Rho_Pi (14); + Rho_Pi (15); + Rho_Pi (16); + Rho_Pi (17); + Rho_Pi (18); + Rho_Pi (19); + Rho_Pi (20); + Rho_Pi (21); + Rho_Pi (22); + Rho_Pi (23); + + // Chi + + Chi (0); + Chi (5); + Chi (10); + Chi (15); + Chi (20); + + // Iota + + st[0] ^= keccakf_rndc[round]; + } + + const u32x r0 = l32_from_64 (st[1]); + const u32x r1 = h32_from_64 (st[1]); + const u32x r2 = l32_from_64 (st[2]); + const u32x r3 = h32_from_64 (st[2]); + + #include VECT_COMPARE_S + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m05000_m04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m05000m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m05000_m08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m05000m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m05000_m16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = pws[gid].i[ 8]; + w2[1] = pws[gid].i[ 9]; + w2[2] = pws[gid].i[10]; + w2[3] = pws[gid].i[11]; + + u32x w3[4]; + + w3[0] = pws[gid].i[12]; + w3[1] = pws[gid].i[13]; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m05000m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m05000_s04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m05000s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m05000_s08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m05000s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m05000_s16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = pws[gid].i[ 8]; + w2[1] = pws[gid].i[ 9]; + w2[2] = pws[gid].i[10]; + w2[3] = pws[gid].i[11]; + + u32x w3[4]; + + w3[0] = pws[gid].i[12]; + w3[1] = pws[gid].i[13]; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m05000s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} diff --git a/amd/m05100_a0.cl b/amd/m05100_a0.cl new file mode 100644 index 0000000000..599ee680d2 --- /dev/null +++ b/amd/m05100_a0.cl @@ -0,0 +1,428 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _MD5H_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW4 +#define VECT_SIZE4 +#endif + +#ifdef VLIW5 +#define VECT_SIZE4 +#endif + +#define DGST_R0 0 +#define DGST_R1 1 +#define DGST_R2 2 +#define DGST_R3 3 + +#include "include/kernel_functions.c" +#include "types_amd.c" +#include "common_amd.c" +#include "include/rp_gpu.h" +#include "rp_amd.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m05100_m04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + u32x pw_buf1[4]; + + pw_buf1[0] = pws[gid].i[ 4]; + pw_buf1[1] = pws[gid].i[ 5]; + pw_buf1[2] = pws[gid].i[ 6]; + pw_buf1[3] = pws[gid].i[ 7]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + + w0[0] = pw_buf0[0]; + w0[1] = pw_buf0[1]; + w0[2] = pw_buf0[2]; + w0[3] = pw_buf0[3]; + + u32x w1[4]; + + w1[0] = pw_buf1[0]; + w1[1] = pw_buf1[1]; + w1[2] = pw_buf1[2]; + w1[3] = pw_buf1[3]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 out_len = apply_rules (rules_buf[il_pos].cmds, w0, w1, pw_len); + + append_0x80_2 (w0, w1, out_len); + + w3[2] = out_len * 8; + + u32x a = MD5M_A; + u32x b = MD5M_B; + u32x c = MD5M_C; + u32x d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H , a, b, c, d, w1[1], MD5C20, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w2[0], MD5C21, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w2[3], MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w3[2], MD5C23, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w0[1], MD5C24, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w1[0], MD5C25, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w1[3], MD5C26, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w2[2], MD5C27, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w3[1], MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w0[0], MD5C29, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w0[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w1[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w2[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w3[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w3[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w0[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1[0], MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w2[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2[1], MD5C3f, MD5S33); + + a += MD5M_A; + b += MD5M_B; + c += MD5M_C; + d += MD5M_D; + + { + const u32x r0 = a; + const u32x r1 = b; + const u32x r2 = 0; + const u32x r3 = 0; + + #include VECT_COMPARE_M + } + + { + const u32x r0 = b; + const u32x r1 = c; + const u32x r2 = 0; + const u32x r3 = 0; + + #include VECT_COMPARE_M + } + + { + const u32x r0 = c; + const u32x r1 = d; + const u32x r2 = 0; + const u32x r3 = 0; + + #include VECT_COMPARE_M + } + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m05100_m08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m05100_m16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m05100_s04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + u32x pw_buf1[4]; + + pw_buf1[0] = pws[gid].i[ 4]; + pw_buf1[1] = pws[gid].i[ 5]; + pw_buf1[2] = pws[gid].i[ 6]; + pw_buf1[3] = pws[gid].i[ 7]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + + w0[0] = pw_buf0[0]; + w0[1] = pw_buf0[1]; + w0[2] = pw_buf0[2]; + w0[3] = pw_buf0[3]; + + u32x w1[4]; + + w1[0] = pw_buf1[0]; + w1[1] = pw_buf1[1]; + w1[2] = pw_buf1[2]; + w1[3] = pw_buf1[3]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 out_len = apply_rules (rules_buf[il_pos].cmds, w0, w1, pw_len); + + append_0x80_2 (w0, w1, out_len); + + w3[2] = out_len * 8; + + u32x a = MD5M_A; + u32x b = MD5M_B; + u32x c = MD5M_C; + u32x d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H , a, b, c, d, w1[1], MD5C20, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w2[0], MD5C21, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w2[3], MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w3[2], MD5C23, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w0[1], MD5C24, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w1[0], MD5C25, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w1[3], MD5C26, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w2[2], MD5C27, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w3[1], MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w0[0], MD5C29, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w0[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w1[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w2[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w3[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w3[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w0[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1[0], MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w2[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2[1], MD5C3f, MD5S33); + + a += MD5M_A; + b += MD5M_B; + c += MD5M_C; + d += MD5M_D; + + { + const u32x r0 = a; + const u32x r1 = b; + const u32x r2 = 0; + const u32x r3 = 0; + + #include VECT_COMPARE_S + } + + { + const u32x r0 = b; + const u32x r1 = c; + const u32x r2 = 0; + const u32x r3 = 0; + + #include VECT_COMPARE_S + } + + { + const u32x r0 = c; + const u32x r1 = d; + const u32x r2 = 0; + const u32x r3 = 0; + + #include VECT_COMPARE_S + } + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m05100_s08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m05100_s16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/amd/m05100_a1.cl b/amd/m05100_a1.cl new file mode 100644 index 0000000000..dccb8f7aa4 --- /dev/null +++ b/amd/m05100_a1.cl @@ -0,0 +1,530 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _MD5H_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW4 +#define VECT_SIZE4 +#endif + +#ifdef VLIW5 +#define VECT_SIZE4 +#endif + +#define DGST_R0 0 +#define DGST_R1 1 +#define DGST_R2 2 +#define DGST_R3 3 + +#include "include/kernel_functions.c" +#include "types_amd.c" +#include "common_amd.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m05100_m04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + append_0x80_2 (wordl0, wordl1, pw_l_len); + + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, combs_buf[0].pw_len); + } + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = combs_buf[il_pos].pw_len; + + const u32 pw_len = pw_l_len + pw_r_len; + + u32 wordr0[4]; + + wordr0[0] = combs_buf[il_pos].i[0]; + wordr0[1] = combs_buf[il_pos].i[1]; + wordr0[2] = combs_buf[il_pos].i[2]; + wordr0[3] = combs_buf[il_pos].i[3]; + + u32 wordr1[4]; + + wordr1[0] = combs_buf[il_pos].i[4]; + wordr1[1] = combs_buf[il_pos].i[5]; + wordr1[2] = combs_buf[il_pos].i[6]; + wordr1[3] = combs_buf[il_pos].i[7]; + + u32 wordr2[4]; + + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + + u32 wordr3[4]; + + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + u32x w0[4]; + + w0[0] = wordl0[0] | wordr0[0]; + w0[1] = wordl0[1] | wordr0[1]; + w0[2] = wordl0[2] | wordr0[2]; + w0[3] = wordl0[3] | wordr0[3]; + + u32x w1[4]; + + w1[0] = wordl1[0] | wordr1[0]; + w1[1] = wordl1[1] | wordr1[1]; + w1[2] = wordl1[2] | wordr1[2]; + w1[3] = wordl1[3] | wordr1[3]; + + u32x w2[4]; + + w2[0] = wordl2[0] | wordr2[0]; + w2[1] = wordl2[1] | wordr2[1]; + w2[2] = wordl2[2] | wordr2[2]; + w2[3] = wordl2[3] | wordr2[3]; + + u32x w3[4]; + + w3[0] = wordl3[0] | wordr3[0]; + w3[1] = wordl3[1] | wordr3[1]; + w3[2] = pw_len * 8; + w3[3] = 0; + + u32x a = MD5M_A; + u32x b = MD5M_B; + u32x c = MD5M_C; + u32x d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H , a, b, c, d, w1[1], MD5C20, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w2[0], MD5C21, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w2[3], MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w3[2], MD5C23, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w0[1], MD5C24, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w1[0], MD5C25, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w1[3], MD5C26, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w2[2], MD5C27, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w3[1], MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w0[0], MD5C29, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w0[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w1[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w2[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w3[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w3[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w0[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1[0], MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w2[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2[1], MD5C3f, MD5S33); + + a += MD5M_A; + b += MD5M_B; + c += MD5M_C; + d += MD5M_D; + + { + const u32x r0 = a; + const u32x r1 = b; + const u32x r2 = 0; + const u32x r3 = 0; + + #include VECT_COMPARE_M + } + + { + const u32x r0 = b; + const u32x r1 = c; + const u32x r2 = 0; + const u32x r3 = 0; + + #include VECT_COMPARE_M + } + + { + const u32x r0 = c; + const u32x r1 = d; + const u32x r2 = 0; + const u32x r3 = 0; + + #include VECT_COMPARE_M + } + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m05100_m08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m05100_m16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m05100_s04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + append_0x80_2 (wordl0, wordl1, pw_l_len); + + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, combs_buf[0].pw_len); + } + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = combs_buf[il_pos].pw_len; + + const u32 pw_len = pw_l_len + pw_r_len; + + u32 wordr0[4]; + + wordr0[0] = combs_buf[il_pos].i[0]; + wordr0[1] = combs_buf[il_pos].i[1]; + wordr0[2] = combs_buf[il_pos].i[2]; + wordr0[3] = combs_buf[il_pos].i[3]; + + u32 wordr1[4]; + + wordr1[0] = combs_buf[il_pos].i[4]; + wordr1[1] = combs_buf[il_pos].i[5]; + wordr1[2] = combs_buf[il_pos].i[6]; + wordr1[3] = combs_buf[il_pos].i[7]; + + u32 wordr2[4]; + + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + + u32 wordr3[4]; + + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + u32x w0[4]; + + w0[0] = wordl0[0] | wordr0[0]; + w0[1] = wordl0[1] | wordr0[1]; + w0[2] = wordl0[2] | wordr0[2]; + w0[3] = wordl0[3] | wordr0[3]; + + u32x w1[4]; + + w1[0] = wordl1[0] | wordr1[0]; + w1[1] = wordl1[1] | wordr1[1]; + w1[2] = wordl1[2] | wordr1[2]; + w1[3] = wordl1[3] | wordr1[3]; + + u32x w2[4]; + + w2[0] = wordl2[0] | wordr2[0]; + w2[1] = wordl2[1] | wordr2[1]; + w2[2] = wordl2[2] | wordr2[2]; + w2[3] = wordl2[3] | wordr2[3]; + + u32x w3[4]; + + w3[0] = wordl3[0] | wordr3[0]; + w3[1] = wordl3[1] | wordr3[1]; + w3[2] = pw_len * 8; + w3[3] = 0; + + u32x a = MD5M_A; + u32x b = MD5M_B; + u32x c = MD5M_C; + u32x d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H , a, b, c, d, w1[1], MD5C20, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w2[0], MD5C21, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w2[3], MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w3[2], MD5C23, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w0[1], MD5C24, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w1[0], MD5C25, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w1[3], MD5C26, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w2[2], MD5C27, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w3[1], MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w0[0], MD5C29, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w0[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w1[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w2[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w3[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w3[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w0[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1[0], MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w2[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2[1], MD5C3f, MD5S33); + + a += MD5M_A; + b += MD5M_B; + c += MD5M_C; + d += MD5M_D; + + { + const u32x r0 = a; + const u32x r1 = b; + const u32x r2 = 0; + const u32x r3 = 0; + + #include VECT_COMPARE_S + } + + { + const u32x r0 = b; + const u32x r1 = c; + const u32x r2 = 0; + const u32x r3 = 0; + + #include VECT_COMPARE_S + } + + { + const u32x r0 = c; + const u32x r1 = d; + const u32x r2 = 0; + const u32x r3 = 0; + + #include VECT_COMPARE_S + } + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m05100_s08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m05100_s16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/amd/m05100_a3.cl b/amd/m05100_a3.cl new file mode 100644 index 0000000000..dba6d8a73e --- /dev/null +++ b/amd/m05100_a3.cl @@ -0,0 +1,602 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _MD5H_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW4 +#define VECT_SIZE4 +#endif + +#ifdef VLIW5 +#define VECT_SIZE4 +#endif + +#define DGST_R0 0 +#define DGST_R1 1 +#define DGST_R2 2 +#define DGST_R3 3 + +#include "include/kernel_functions.c" +#include "types_amd.c" +#include "common_amd.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +static void m05100m (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], const u32 pw_len, __global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset) +{ + /** + * modifier + */ + + const u32 gid = get_global_id (0); + const u32 lid = get_local_id (0); + + /** + * base + */ + + w3[2] = pw_len * 8; + + /** + * loop + */ + + u32x w0l = w0[0]; + + for (u32 il_pos = 0; il_pos < bfs_cnt; il_pos++) + { + const u32 w0r = bfs_buf[il_pos].i; + + w0[0] = w0l | w0r; + + u32x a = MD5M_A; + u32x b = MD5M_B; + u32x c = MD5M_C; + u32x d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H , a, b, c, d, w1[1], MD5C20, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w2[0], MD5C21, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w2[3], MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w3[2], MD5C23, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w0[1], MD5C24, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w1[0], MD5C25, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w1[3], MD5C26, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w2[2], MD5C27, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w3[1], MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w0[0], MD5C29, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w0[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w1[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w2[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w3[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w3[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w0[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1[0], MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w2[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2[1], MD5C3f, MD5S33); + + a += MD5M_A; + b += MD5M_B; + c += MD5M_C; + d += MD5M_D; + + { + const u32x r0 = a; + const u32x r1 = b; + const u32x r2 = 0; + const u32x r3 = 0; + + #include VECT_COMPARE_M + } + + { + const u32x r0 = b; + const u32x r1 = c; + const u32x r2 = 0; + const u32x r3 = 0; + + #include VECT_COMPARE_M + } + + { + const u32x r0 = c; + const u32x r1 = d; + const u32x r2 = 0; + const u32x r3 = 0; + + #include VECT_COMPARE_M + } + } +} + +static void m05100s (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], const u32 pw_len, __global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset) +{ + /** + * modifier + */ + + const u32 gid = get_global_id (0); + const u32 lid = get_local_id (0); + + /** + * base + */ + + w3[2] = pw_len * 8; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * loop + */ + + u32x w0l = w0[0]; + + for (u32 il_pos = 0; il_pos < bfs_cnt; il_pos++) + { + const u32 w0r = bfs_buf[il_pos].i; + + w0[0] = w0l | w0r; + + u32x a = MD5M_A; + u32x b = MD5M_B; + u32x c = MD5M_C; + u32x d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H , a, b, c, d, w1[1], MD5C20, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w2[0], MD5C21, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w2[3], MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w3[2], MD5C23, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w0[1], MD5C24, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w1[0], MD5C25, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w1[3], MD5C26, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w2[2], MD5C27, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w3[1], MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w0[0], MD5C29, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w0[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w1[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w2[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w3[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w3[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w0[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1[0], MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w2[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2[1], MD5C3f, MD5S33); + + a += MD5M_A; + b += MD5M_B; + c += MD5M_C; + d += MD5M_D; + + { + const u32x r0 = a; + const u32x r1 = b; + const u32x r2 = 0; + const u32x r3 = 0; + + #include VECT_COMPARE_S + } + + { + const u32x r0 = b; + const u32x r1 = c; + const u32x r2 = 0; + const u32x r3 = 0; + + #include VECT_COMPARE_S + } + + { + const u32x r0 = c; + const u32x r1 = d; + const u32x r2 = 0; + const u32x r3 = 0; + + #include VECT_COMPARE_S + } + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m05100_m04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m05100m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m05100_m08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m05100m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m05100_m16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = pws[gid].i[ 8]; + w2[1] = pws[gid].i[ 9]; + w2[2] = pws[gid].i[10]; + w2[3] = pws[gid].i[11]; + + u32x w3[4]; + + w3[0] = pws[gid].i[12]; + w3[1] = pws[gid].i[13]; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m05100m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m05100_s04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m05100s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m05100_s08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m05100s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m05100_s16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = pws[gid].i[ 8]; + w2[1] = pws[gid].i[ 9]; + w2[2] = pws[gid].i[10]; + w2[3] = pws[gid].i[11]; + + u32x w3[4]; + + w3[0] = pws[gid].i[12]; + w3[1] = pws[gid].i[13]; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m05100s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} diff --git a/amd/m05200.cl b/amd/m05200.cl new file mode 100644 index 0000000000..b9209fca47 --- /dev/null +++ b/amd/m05200.cl @@ -0,0 +1,402 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _SHA256_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW4 +#define VECT_SIZE2 +#endif + +#ifdef VLIW5 +#define VECT_SIZE2 +#endif + +#define DGST_R0 0 +#define DGST_R1 1 +#define DGST_R2 2 +#define DGST_R3 3 + +#include "include/kernel_functions.c" +#include "types_amd.c" +#include "common_amd.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +__constant u32 k_sha256[64] = +{ + SHA256C00, SHA256C01, SHA256C02, SHA256C03, + SHA256C04, SHA256C05, SHA256C06, SHA256C07, + SHA256C08, SHA256C09, SHA256C0a, SHA256C0b, + SHA256C0c, SHA256C0d, SHA256C0e, SHA256C0f, + SHA256C10, SHA256C11, SHA256C12, SHA256C13, + SHA256C14, SHA256C15, SHA256C16, SHA256C17, + SHA256C18, SHA256C19, SHA256C1a, SHA256C1b, + SHA256C1c, SHA256C1d, SHA256C1e, SHA256C1f, + SHA256C20, SHA256C21, SHA256C22, SHA256C23, + SHA256C24, SHA256C25, SHA256C26, SHA256C27, + SHA256C28, SHA256C29, SHA256C2a, SHA256C2b, + SHA256C2c, SHA256C2d, SHA256C2e, SHA256C2f, + SHA256C30, SHA256C31, SHA256C32, SHA256C33, + SHA256C34, SHA256C35, SHA256C36, SHA256C37, + SHA256C38, SHA256C39, SHA256C3a, SHA256C3b, + SHA256C3c, SHA256C3d, SHA256C3e, SHA256C3f, +}; + +static void sha256_transform (const u32x w0[4], const u32x w1[4], const u32x w2[4], const u32x w3[4], u32x digest[8]) +{ + u32x a = digest[0]; + u32x b = digest[1]; + u32x c = digest[2]; + u32x d = digest[3]; + u32x e = digest[4]; + u32x f = digest[5]; + u32x g = digest[6]; + u32x h = digest[7]; + + u32x w0_t = w0[0]; + u32x w1_t = w0[1]; + u32x w2_t = w0[2]; + u32x w3_t = w0[3]; + u32x w4_t = w1[0]; + u32x w5_t = w1[1]; + u32x w6_t = w1[2]; + u32x w7_t = w1[3]; + u32x w8_t = w2[0]; + u32x w9_t = w2[1]; + u32x wa_t = w2[2]; + u32x wb_t = w2[3]; + u32x wc_t = w3[0]; + u32x wd_t = w3[1]; + u32x we_t = w3[2]; + u32x wf_t = w3[3]; + + #define ROUND_EXPAND() \ + { \ + w0_t = SHA256_EXPAND (we_t, w9_t, w1_t, w0_t); \ + w1_t = SHA256_EXPAND (wf_t, wa_t, w2_t, w1_t); \ + w2_t = SHA256_EXPAND (w0_t, wb_t, w3_t, w2_t); \ + w3_t = SHA256_EXPAND (w1_t, wc_t, w4_t, w3_t); \ + w4_t = SHA256_EXPAND (w2_t, wd_t, w5_t, w4_t); \ + w5_t = SHA256_EXPAND (w3_t, we_t, w6_t, w5_t); \ + w6_t = SHA256_EXPAND (w4_t, wf_t, w7_t, w6_t); \ + w7_t = SHA256_EXPAND (w5_t, w0_t, w8_t, w7_t); \ + w8_t = SHA256_EXPAND (w6_t, w1_t, w9_t, w8_t); \ + w9_t = SHA256_EXPAND (w7_t, w2_t, wa_t, w9_t); \ + wa_t = SHA256_EXPAND (w8_t, w3_t, wb_t, wa_t); \ + wb_t = SHA256_EXPAND (w9_t, w4_t, wc_t, wb_t); \ + wc_t = SHA256_EXPAND (wa_t, w5_t, wd_t, wc_t); \ + wd_t = SHA256_EXPAND (wb_t, w6_t, we_t, wd_t); \ + we_t = SHA256_EXPAND (wc_t, w7_t, wf_t, we_t); \ + wf_t = SHA256_EXPAND (wd_t, w8_t, w0_t, wf_t); \ + } + + #define ROUND_STEP(i) \ + { \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, k_sha256[i + 0]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, k_sha256[i + 1]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, k_sha256[i + 2]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, k_sha256[i + 3]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, k_sha256[i + 4]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, k_sha256[i + 5]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, k_sha256[i + 6]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, k_sha256[i + 7]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, k_sha256[i + 8]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, k_sha256[i + 9]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, k_sha256[i + 10]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, k_sha256[i + 11]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, k_sha256[i + 12]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, k_sha256[i + 13]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, k_sha256[i + 14]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, k_sha256[i + 15]); \ + } + + ROUND_STEP (0); + + #pragma unroll + for (int i = 16; i < 64; i += 16) + { + ROUND_EXPAND (); ROUND_STEP (i); + } + + digest[0] += a; + digest[1] += b; + digest[2] += c; + digest[3] += d; + digest[4] += e; + digest[5] += f; + digest[6] += g; + digest[7] += h; +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m05200_init (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global pwsafe3_tmp_t *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = 0; + w1[3] = 0; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[7]; + + u32 salt_buf2[4]; + + salt_buf2[0] = 0; + salt_buf2[1] = 0; + salt_buf2[2] = 0; + salt_buf2[3] = 0; + + u32 salt_buf3[4]; + + salt_buf3[0] = 0; + salt_buf3[1] = 0; + salt_buf3[2] = 0; + salt_buf3[3] = 0; + + u32 salt_len = salt_bufs[salt_pos].salt_len; + + switch_buffer_by_offset (salt_buf0, salt_buf1, salt_buf2, salt_buf3, pw_len); + + w0[0] |= salt_buf0[0]; + w0[1] |= salt_buf0[1]; + w0[2] |= salt_buf0[2]; + w0[3] |= salt_buf0[3]; + + w1[0] |= salt_buf1[0]; + w1[1] |= salt_buf1[1]; + w1[2] |= salt_buf1[2]; + w1[3] |= salt_buf1[3]; + + w2[0] |= salt_buf2[0]; + w2[1] |= salt_buf2[1]; + w2[2] |= salt_buf2[2]; + w2[3] |= salt_buf2[3]; + + w3[0] |= salt_buf3[0]; + w3[1] |= salt_buf3[1]; + w3[2] |= salt_buf3[2]; + w3[3] |= salt_buf3[3]; + + const u32 block_len = pw_len + salt_len; + + append_0x80_4 (w0, w1, w2, w3, block_len); + + /** + * init + */ + + w0[0] = swap_workaround (w0[0]); + w0[1] = swap_workaround (w0[1]); + w0[2] = swap_workaround (w0[2]); + w0[3] = swap_workaround (w0[3]); + + w1[0] = swap_workaround (w1[0]); + w1[1] = swap_workaround (w1[1]); + w1[2] = swap_workaround (w1[2]); + w1[3] = swap_workaround (w1[3]); + + w2[0] = swap_workaround (w2[0]); + w2[1] = swap_workaround (w2[1]); + w2[2] = swap_workaround (w2[2]); + w2[3] = swap_workaround (w2[3]); + + w3[0] = swap_workaround (w3[0]); + w3[1] = swap_workaround (w3[1]); + w3[2] = 0; + w3[3] = block_len * 8; + + /** + * main + */ + + u32x digest[8]; + + digest[0] = SHA256M_A; + digest[1] = SHA256M_B; + digest[2] = SHA256M_C; + digest[3] = SHA256M_D; + digest[4] = SHA256M_E; + digest[5] = SHA256M_F; + digest[6] = SHA256M_G; + digest[7] = SHA256M_H; + + sha256_transform (w0, w1, w2, w3, digest); + + /** + * store + */ + + tmps[gid].digest_buf[0] = digest[0]; + tmps[gid].digest_buf[1] = digest[1]; + tmps[gid].digest_buf[2] = digest[2]; + tmps[gid].digest_buf[3] = digest[3]; + tmps[gid].digest_buf[4] = digest[4]; + tmps[gid].digest_buf[5] = digest[5]; + tmps[gid].digest_buf[6] = digest[6]; + tmps[gid].digest_buf[7] = digest[7]; +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m05200_loop (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global pwsafe3_tmp_t *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x digest[8]; + + digest[0] = tmps[gid].digest_buf[0]; + digest[1] = tmps[gid].digest_buf[1]; + digest[2] = tmps[gid].digest_buf[2]; + digest[3] = tmps[gid].digest_buf[3]; + digest[4] = tmps[gid].digest_buf[4]; + digest[5] = tmps[gid].digest_buf[5]; + digest[6] = tmps[gid].digest_buf[6]; + digest[7] = tmps[gid].digest_buf[7]; + + /** + * init + */ + + for (u32 i = 0; i < loop_cnt; i++) + { + u32x w0[4]; + + w0[0] = digest[0]; + w0[1] = digest[1]; + w0[2] = digest[2]; + w0[3] = digest[3]; + + u32x w1[4]; + + w1[0] = digest[4]; + w1[1] = digest[5]; + w1[2] = digest[6]; + w1[3] = digest[7]; + + u32x w2[4]; + + w2[0] = 0x80000000; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 32 * 8; + + digest[0] = SHA256M_A; + digest[1] = SHA256M_B; + digest[2] = SHA256M_C; + digest[3] = SHA256M_D; + digest[4] = SHA256M_E; + digest[5] = SHA256M_F; + digest[6] = SHA256M_G; + digest[7] = SHA256M_H; + + sha256_transform (w0, w1, w2, w3, digest); + } + + tmps[gid].digest_buf[0] = digest[0]; + tmps[gid].digest_buf[1] = digest[1]; + tmps[gid].digest_buf[2] = digest[2]; + tmps[gid].digest_buf[3] = digest[3]; + tmps[gid].digest_buf[4] = digest[4]; + tmps[gid].digest_buf[5] = digest[5]; + tmps[gid].digest_buf[6] = digest[6]; + tmps[gid].digest_buf[7] = digest[7]; +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m05200_comp (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global pwsafe3_tmp_t *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + const u32 lid = get_local_id (0); + + /** + * digest + */ + + const u32x r0 = tmps[gid].digest_buf[DGST_R0]; + const u32x r1 = tmps[gid].digest_buf[DGST_R1]; + const u32x r2 = tmps[gid].digest_buf[DGST_R2]; + const u32x r3 = tmps[gid].digest_buf[DGST_R3]; + + #define il_pos 0 + + #include VECT_COMPARE_M +} diff --git a/amd/m05300_a0.cl b/amd/m05300_a0.cl new file mode 100644 index 0000000000..d979060d18 --- /dev/null +++ b/amd/m05300_a0.cl @@ -0,0 +1,737 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _MD5_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW4 +#define VECT_SIZE4 +#endif + +#ifdef VLIW5 +#define VECT_SIZE4 +#endif + +#define DGST_R0 0 +#define DGST_R1 3 +#define DGST_R2 2 +#define DGST_R3 1 + +#include "include/kernel_functions.c" +#include "types_amd.c" +#include "common_amd.c" +#include "include/rp_gpu.h" +#include "rp_amd.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +static void md5_transform (const u32x w0[4], const u32x w1[4], const u32x w2[4], const u32x w3[4], u32x digest[4]) +{ + u32x a = digest[0]; + u32x b = digest[1]; + u32x c = digest[2]; + u32x d = digest[3]; + + u32x w0_t = w0[0]; + u32x w1_t = w0[1]; + u32x w2_t = w0[2]; + u32x w3_t = w0[3]; + u32x w4_t = w1[0]; + u32x w5_t = w1[1]; + u32x w6_t = w1[2]; + u32x w7_t = w1[3]; + u32x w8_t = w2[0]; + u32x w9_t = w2[1]; + u32x wa_t = w2[2]; + u32x wb_t = w2[3]; + u32x wc_t = w3[0]; + u32x wd_t = w3[1]; + u32x we_t = w3[2]; + u32x wf_t = w3[3]; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t, MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t, MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t, MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t, MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w4_t, MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w5_t, MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w6_t, MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w7_t, MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w8_t, MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w9_t, MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, wa_t, MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, wb_t, MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, wc_t, MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, wd_t, MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, we_t, MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, wf_t, MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w1_t, MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w6_t, MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, wb_t, MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t, MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w5_t, MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, wa_t, MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, wf_t, MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w4_t, MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w9_t, MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, we_t, MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t, MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w8_t, MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, wd_t, MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t, MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w7_t, MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, wc_t, MD5C1f, MD5S13); + + MD5_STEP (MD5_H , a, b, c, d, w5_t, MD5C20, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w8_t, MD5C21, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, wb_t, MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, we_t, MD5C23, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w1_t, MD5C24, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w4_t, MD5C25, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w7_t, MD5C26, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, wa_t, MD5C27, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, wd_t, MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w0_t, MD5C29, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w3_t, MD5C2a, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w6_t, MD5C2b, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w9_t, MD5C2c, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, wc_t, MD5C2d, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, wf_t, MD5C2e, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w2_t, MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t, MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w7_t, MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, we_t, MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w5_t, MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, wc_t, MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t, MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, wa_t, MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t, MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w8_t, MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, wf_t, MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w6_t, MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, wd_t, MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w4_t, MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, wb_t, MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t, MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w9_t, MD5C3f, MD5S33); + + digest[0] += a; + digest[1] += b; + digest[2] += c; + digest[3] += d; +} + +static void hmac_md5_pad (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], u32x ipad[4], u32x opad[4]) +{ + w0[0] = w0[0] ^ 0x36363636; + w0[1] = w0[1] ^ 0x36363636; + w0[2] = w0[2] ^ 0x36363636; + w0[3] = w0[3] ^ 0x36363636; + w1[0] = w1[0] ^ 0x36363636; + w1[1] = w1[1] ^ 0x36363636; + w1[2] = w1[2] ^ 0x36363636; + w1[3] = w1[3] ^ 0x36363636; + w2[0] = w2[0] ^ 0x36363636; + w2[1] = w2[1] ^ 0x36363636; + w2[2] = w2[2] ^ 0x36363636; + w2[3] = w2[3] ^ 0x36363636; + w3[0] = w3[0] ^ 0x36363636; + w3[1] = w3[1] ^ 0x36363636; + w3[2] = w3[2] ^ 0x36363636; + w3[3] = w3[3] ^ 0x36363636; + + ipad[0] = MD5M_A; + ipad[1] = MD5M_B; + ipad[2] = MD5M_C; + ipad[3] = MD5M_D; + + md5_transform (w0, w1, w2, w3, ipad); + + w0[0] = w0[0] ^ 0x6a6a6a6a; + w0[1] = w0[1] ^ 0x6a6a6a6a; + w0[2] = w0[2] ^ 0x6a6a6a6a; + w0[3] = w0[3] ^ 0x6a6a6a6a; + w1[0] = w1[0] ^ 0x6a6a6a6a; + w1[1] = w1[1] ^ 0x6a6a6a6a; + w1[2] = w1[2] ^ 0x6a6a6a6a; + w1[3] = w1[3] ^ 0x6a6a6a6a; + w2[0] = w2[0] ^ 0x6a6a6a6a; + w2[1] = w2[1] ^ 0x6a6a6a6a; + w2[2] = w2[2] ^ 0x6a6a6a6a; + w2[3] = w2[3] ^ 0x6a6a6a6a; + w3[0] = w3[0] ^ 0x6a6a6a6a; + w3[1] = w3[1] ^ 0x6a6a6a6a; + w3[2] = w3[2] ^ 0x6a6a6a6a; + w3[3] = w3[3] ^ 0x6a6a6a6a; + + opad[0] = MD5M_A; + opad[1] = MD5M_B; + opad[2] = MD5M_C; + opad[3] = MD5M_D; + + md5_transform (w0, w1, w2, w3, opad); +} + +static void hmac_md5_run (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], u32x ipad[4], u32x opad[4], u32x digest[4]) +{ + digest[0] = ipad[0]; + digest[1] = ipad[1]; + digest[2] = ipad[2]; + digest[3] = ipad[3]; + + md5_transform (w0, w1, w2, w3, digest); + + w0[0] = digest[0]; + w0[1] = digest[1]; + w0[2] = digest[2]; + w0[3] = digest[3]; + w1[0] = 0x80; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + w3[0] = 0; + w3[1] = 0; + w3[2] = (64 + 16) * 8; + w3[3] = 0; + + digest[0] = opad[0]; + digest[1] = opad[1]; + digest[2] = opad[2]; + digest[3] = opad[3]; + + md5_transform (w0, w1, w2, w3, digest); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m05300_m04 (__global pw_t *pws, __global gpu_rule_t * rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global ikepsk_t *ikepsk_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + u32x pw_buf1[4]; + + pw_buf1[0] = pws[gid].i[ 4]; + pw_buf1[1] = pws[gid].i[ 5]; + pw_buf1[2] = pws[gid].i[ 6]; + pw_buf1[3] = pws[gid].i[ 7]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * salt + */ + + const u32 nr_len = ikepsk_bufs[salt_pos].nr_len; + const u32 msg_len = ikepsk_bufs[salt_pos].msg_len; + + u32 salt_buf0[4]; + + salt_buf0[0] = ikepsk_bufs[salt_pos].nr_buf[ 0]; + salt_buf0[1] = ikepsk_bufs[salt_pos].nr_buf[ 1]; + salt_buf0[2] = ikepsk_bufs[salt_pos].nr_buf[ 2]; + salt_buf0[3] = ikepsk_bufs[salt_pos].nr_buf[ 3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = ikepsk_bufs[salt_pos].nr_buf[ 4]; + salt_buf1[1] = ikepsk_bufs[salt_pos].nr_buf[ 5]; + salt_buf1[2] = ikepsk_bufs[salt_pos].nr_buf[ 6]; + salt_buf1[3] = ikepsk_bufs[salt_pos].nr_buf[ 7]; + + u32 salt_buf2[4]; + + salt_buf2[0] = ikepsk_bufs[salt_pos].nr_buf[ 8]; + salt_buf2[1] = ikepsk_bufs[salt_pos].nr_buf[ 9]; + salt_buf2[2] = ikepsk_bufs[salt_pos].nr_buf[10]; + salt_buf2[3] = ikepsk_bufs[salt_pos].nr_buf[11]; + + u32 salt_buf3[4]; + + salt_buf3[0] = ikepsk_bufs[salt_pos].nr_buf[12]; + salt_buf3[1] = ikepsk_bufs[salt_pos].nr_buf[13]; + salt_buf3[2] = 0; + salt_buf3[3] = 0; + + __local u32 s_msg_buf[128]; + + const u32 lid2 = lid * 2; + + s_msg_buf[lid2 + 0] = ikepsk_bufs[salt_pos].msg_buf[lid2 + 0]; + s_msg_buf[lid2 + 1] = ikepsk_bufs[salt_pos].msg_buf[lid2 + 1]; + + barrier (CLK_LOCAL_MEM_FENCE); + + if (gid >= gid_max) return; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + + w0[0] = pw_buf0[0]; + w0[1] = pw_buf0[1]; + w0[2] = pw_buf0[2]; + w0[3] = pw_buf0[3]; + + u32x w1[4]; + + w1[0] = pw_buf1[0]; + w1[1] = pw_buf1[1]; + w1[2] = pw_buf1[2]; + w1[3] = pw_buf1[3]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 out_len = apply_rules (rules_buf[il_pos].cmds, w0, w1, pw_len); + + /** + * pads + */ + + u32x w0_t[4]; + + w0_t[0] = w0[0]; + w0_t[1] = w0[1]; + w0_t[2] = w0[2]; + w0_t[3] = w0[3]; + + u32x w1_t[4]; + + w1_t[0] = w1[0]; + w1_t[1] = w1[1]; + w1_t[2] = w1[2]; + w1_t[3] = w1[3]; + + u32x w2_t[4]; + + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + + u32x w3_t[4]; + + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = 0; + + u32x ipad[4]; + u32x opad[4]; + + hmac_md5_pad (w0_t, w1_t, w2_t, w3_t, ipad, opad); + + w0_t[0] = salt_buf0[0]; + w0_t[1] = salt_buf0[1]; + w0_t[2] = salt_buf0[2]; + w0_t[3] = salt_buf0[3]; + w1_t[0] = salt_buf1[0]; + w1_t[1] = salt_buf1[1]; + w1_t[2] = salt_buf1[2]; + w1_t[3] = salt_buf1[3]; + w2_t[0] = salt_buf2[0]; + w2_t[1] = salt_buf2[1]; + w2_t[2] = salt_buf2[2]; + w2_t[3] = salt_buf2[3]; + w3_t[0] = salt_buf3[0]; + w3_t[1] = salt_buf3[1]; + w3_t[2] = (64 + nr_len) * 8; + w3_t[3] = 0; + + u32x digest[4]; + + hmac_md5_run (w0_t, w1_t, w2_t, w3_t, ipad, opad, digest); + + w0_t[0] = digest[0]; + w0_t[1] = digest[1]; + w0_t[2] = digest[2]; + w0_t[3] = digest[3]; + w1_t[0] = 0; + w1_t[1] = 0; + w1_t[2] = 0; + w1_t[3] = 0; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = 0; + + hmac_md5_pad (w0_t, w1_t, w2_t, w3_t, ipad, opad); + + int left; + int off; + + for (left = ikepsk_bufs[salt_pos].msg_len, off = 0; left >= 56; left -= 64, off += 16) + { + w0_t[0] = s_msg_buf[off + 0]; + w0_t[1] = s_msg_buf[off + 1]; + w0_t[2] = s_msg_buf[off + 2]; + w0_t[3] = s_msg_buf[off + 3]; + w1_t[0] = s_msg_buf[off + 4]; + w1_t[1] = s_msg_buf[off + 5]; + w1_t[2] = s_msg_buf[off + 6]; + w1_t[3] = s_msg_buf[off + 7]; + w2_t[0] = s_msg_buf[off + 8]; + w2_t[1] = s_msg_buf[off + 9]; + w2_t[2] = s_msg_buf[off + 10]; + w2_t[3] = s_msg_buf[off + 11]; + w3_t[0] = s_msg_buf[off + 12]; + w3_t[1] = s_msg_buf[off + 13]; + w3_t[2] = s_msg_buf[off + 14]; + w3_t[3] = s_msg_buf[off + 15]; + + md5_transform (w0_t, w1_t, w2_t, w3_t, ipad); + } + + w0_t[0] = s_msg_buf[off + 0]; + w0_t[1] = s_msg_buf[off + 1]; + w0_t[2] = s_msg_buf[off + 2]; + w0_t[3] = s_msg_buf[off + 3]; + w1_t[0] = s_msg_buf[off + 4]; + w1_t[1] = s_msg_buf[off + 5]; + w1_t[2] = s_msg_buf[off + 6]; + w1_t[3] = s_msg_buf[off + 7]; + w2_t[0] = s_msg_buf[off + 8]; + w2_t[1] = s_msg_buf[off + 9]; + w2_t[2] = s_msg_buf[off + 10]; + w2_t[3] = s_msg_buf[off + 11]; + w3_t[0] = s_msg_buf[off + 12]; + w3_t[1] = s_msg_buf[off + 13]; + w3_t[2] = (64 + msg_len) * 8; + w3_t[3] = 0; + + hmac_md5_run (w0_t, w1_t, w2_t, w3_t, ipad, opad, digest); + + const u32x r0 = digest[0]; + const u32x r1 = digest[3]; + const u32x r2 = digest[2]; + const u32x r3 = digest[1]; + + #include VECT_COMPARE_M + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m05300_m08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global ikepsk_t *ikepsk_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m05300_m16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global ikepsk_t *ikepsk_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m05300_s04 (__global pw_t *pws, __global gpu_rule_t * rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global ikepsk_t *ikepsk_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + u32x pw_buf1[4]; + + pw_buf1[0] = pws[gid].i[ 4]; + pw_buf1[1] = pws[gid].i[ 5]; + pw_buf1[2] = pws[gid].i[ 6]; + pw_buf1[3] = pws[gid].i[ 7]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * salt + */ + + const u32 nr_len = ikepsk_bufs[salt_pos].nr_len; + const u32 msg_len = ikepsk_bufs[salt_pos].msg_len; + + u32 salt_buf0[4]; + + salt_buf0[0] = ikepsk_bufs[salt_pos].nr_buf[ 0]; + salt_buf0[1] = ikepsk_bufs[salt_pos].nr_buf[ 1]; + salt_buf0[2] = ikepsk_bufs[salt_pos].nr_buf[ 2]; + salt_buf0[3] = ikepsk_bufs[salt_pos].nr_buf[ 3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = ikepsk_bufs[salt_pos].nr_buf[ 4]; + salt_buf1[1] = ikepsk_bufs[salt_pos].nr_buf[ 5]; + salt_buf1[2] = ikepsk_bufs[salt_pos].nr_buf[ 6]; + salt_buf1[3] = ikepsk_bufs[salt_pos].nr_buf[ 7]; + + u32 salt_buf2[4]; + + salt_buf2[0] = ikepsk_bufs[salt_pos].nr_buf[ 8]; + salt_buf2[1] = ikepsk_bufs[salt_pos].nr_buf[ 9]; + salt_buf2[2] = ikepsk_bufs[salt_pos].nr_buf[10]; + salt_buf2[3] = ikepsk_bufs[salt_pos].nr_buf[11]; + + u32 salt_buf3[4]; + + salt_buf3[0] = ikepsk_bufs[salt_pos].nr_buf[12]; + salt_buf3[1] = ikepsk_bufs[salt_pos].nr_buf[13]; + salt_buf3[2] = 0; + salt_buf3[3] = 0; + + __local u32 s_msg_buf[128]; + + const u32 lid2 = lid * 2; + + s_msg_buf[lid2 + 0] = ikepsk_bufs[salt_pos].msg_buf[lid2 + 0]; + s_msg_buf[lid2 + 1] = ikepsk_bufs[salt_pos].msg_buf[lid2 + 1]; + + barrier (CLK_LOCAL_MEM_FENCE); + + if (gid >= gid_max) return; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + + w0[0] = pw_buf0[0]; + w0[1] = pw_buf0[1]; + w0[2] = pw_buf0[2]; + w0[3] = pw_buf0[3]; + + u32x w1[4]; + + w1[0] = pw_buf1[0]; + w1[1] = pw_buf1[1]; + w1[2] = pw_buf1[2]; + w1[3] = pw_buf1[3]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 out_len = apply_rules (rules_buf[il_pos].cmds, w0, w1, pw_len); + + /** + * pads + */ + + u32x w0_t[4]; + + w0_t[0] = w0[0]; + w0_t[1] = w0[1]; + w0_t[2] = w0[2]; + w0_t[3] = w0[3]; + + u32x w1_t[4]; + + w1_t[0] = w1[0]; + w1_t[1] = w1[1]; + w1_t[2] = w1[2]; + w1_t[3] = w1[3]; + + u32x w2_t[4]; + + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + + u32x w3_t[4]; + + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = 0; + + u32x ipad[4]; + u32x opad[4]; + + hmac_md5_pad (w0_t, w1_t, w2_t, w3_t, ipad, opad); + + w0_t[0] = salt_buf0[0]; + w0_t[1] = salt_buf0[1]; + w0_t[2] = salt_buf0[2]; + w0_t[3] = salt_buf0[3]; + w1_t[0] = salt_buf1[0]; + w1_t[1] = salt_buf1[1]; + w1_t[2] = salt_buf1[2]; + w1_t[3] = salt_buf1[3]; + w2_t[0] = salt_buf2[0]; + w2_t[1] = salt_buf2[1]; + w2_t[2] = salt_buf2[2]; + w2_t[3] = salt_buf2[3]; + w3_t[0] = salt_buf3[0]; + w3_t[1] = salt_buf3[1]; + w3_t[2] = (64 + nr_len) * 8; + w3_t[3] = 0; + + u32x digest[4]; + + hmac_md5_run (w0_t, w1_t, w2_t, w3_t, ipad, opad, digest); + + w0_t[0] = digest[0]; + w0_t[1] = digest[1]; + w0_t[2] = digest[2]; + w0_t[3] = digest[3]; + w1_t[0] = 0; + w1_t[1] = 0; + w1_t[2] = 0; + w1_t[3] = 0; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = 0; + + hmac_md5_pad (w0_t, w1_t, w2_t, w3_t, ipad, opad); + + int left; + int off; + + for (left = ikepsk_bufs[salt_pos].msg_len, off = 0; left >= 56; left -= 64, off += 16) + { + w0_t[0] = s_msg_buf[off + 0]; + w0_t[1] = s_msg_buf[off + 1]; + w0_t[2] = s_msg_buf[off + 2]; + w0_t[3] = s_msg_buf[off + 3]; + w1_t[0] = s_msg_buf[off + 4]; + w1_t[1] = s_msg_buf[off + 5]; + w1_t[2] = s_msg_buf[off + 6]; + w1_t[3] = s_msg_buf[off + 7]; + w2_t[0] = s_msg_buf[off + 8]; + w2_t[1] = s_msg_buf[off + 9]; + w2_t[2] = s_msg_buf[off + 10]; + w2_t[3] = s_msg_buf[off + 11]; + w3_t[0] = s_msg_buf[off + 12]; + w3_t[1] = s_msg_buf[off + 13]; + w3_t[2] = s_msg_buf[off + 14]; + w3_t[3] = s_msg_buf[off + 15]; + + md5_transform (w0_t, w1_t, w2_t, w3_t, ipad); + } + + w0_t[0] = s_msg_buf[off + 0]; + w0_t[1] = s_msg_buf[off + 1]; + w0_t[2] = s_msg_buf[off + 2]; + w0_t[3] = s_msg_buf[off + 3]; + w1_t[0] = s_msg_buf[off + 4]; + w1_t[1] = s_msg_buf[off + 5]; + w1_t[2] = s_msg_buf[off + 6]; + w1_t[3] = s_msg_buf[off + 7]; + w2_t[0] = s_msg_buf[off + 8]; + w2_t[1] = s_msg_buf[off + 9]; + w2_t[2] = s_msg_buf[off + 10]; + w2_t[3] = s_msg_buf[off + 11]; + w3_t[0] = s_msg_buf[off + 12]; + w3_t[1] = s_msg_buf[off + 13]; + w3_t[2] = (64 + msg_len) * 8; + w3_t[3] = 0; + + hmac_md5_run (w0_t, w1_t, w2_t, w3_t, ipad, opad, digest); + + const u32x r0 = digest[0]; + const u32x r1 = digest[3]; + const u32x r2 = digest[2]; + const u32x r3 = digest[1]; + + #include VECT_COMPARE_S + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m05300_s08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global ikepsk_t *ikepsk_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m05300_s16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global ikepsk_t *ikepsk_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/amd/m05300_a1.cl b/amd/m05300_a1.cl new file mode 100644 index 0000000000..3428cc3aba --- /dev/null +++ b/amd/m05300_a1.cl @@ -0,0 +1,843 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _MD5_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW4 +#define VECT_SIZE4 +#endif + +#ifdef VLIW5 +#define VECT_SIZE4 +#endif + +#define DGST_R0 0 +#define DGST_R1 3 +#define DGST_R2 2 +#define DGST_R3 1 + +#include "include/kernel_functions.c" +#include "types_amd.c" +#include "common_amd.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +static void md5_transform (const u32x w0[4], const u32x w1[4], const u32x w2[4], const u32x w3[4], u32x digest[4]) +{ + u32x a = digest[0]; + u32x b = digest[1]; + u32x c = digest[2]; + u32x d = digest[3]; + + u32x w0_t = w0[0]; + u32x w1_t = w0[1]; + u32x w2_t = w0[2]; + u32x w3_t = w0[3]; + u32x w4_t = w1[0]; + u32x w5_t = w1[1]; + u32x w6_t = w1[2]; + u32x w7_t = w1[3]; + u32x w8_t = w2[0]; + u32x w9_t = w2[1]; + u32x wa_t = w2[2]; + u32x wb_t = w2[3]; + u32x wc_t = w3[0]; + u32x wd_t = w3[1]; + u32x we_t = w3[2]; + u32x wf_t = w3[3]; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t, MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t, MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t, MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t, MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w4_t, MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w5_t, MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w6_t, MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w7_t, MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w8_t, MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w9_t, MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, wa_t, MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, wb_t, MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, wc_t, MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, wd_t, MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, we_t, MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, wf_t, MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w1_t, MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w6_t, MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, wb_t, MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t, MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w5_t, MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, wa_t, MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, wf_t, MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w4_t, MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w9_t, MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, we_t, MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t, MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w8_t, MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, wd_t, MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t, MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w7_t, MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, wc_t, MD5C1f, MD5S13); + + MD5_STEP (MD5_H , a, b, c, d, w5_t, MD5C20, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w8_t, MD5C21, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, wb_t, MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, we_t, MD5C23, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w1_t, MD5C24, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w4_t, MD5C25, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w7_t, MD5C26, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, wa_t, MD5C27, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, wd_t, MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w0_t, MD5C29, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w3_t, MD5C2a, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w6_t, MD5C2b, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w9_t, MD5C2c, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, wc_t, MD5C2d, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, wf_t, MD5C2e, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w2_t, MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t, MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w7_t, MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, we_t, MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w5_t, MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, wc_t, MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t, MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, wa_t, MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t, MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w8_t, MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, wf_t, MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w6_t, MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, wd_t, MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w4_t, MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, wb_t, MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t, MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w9_t, MD5C3f, MD5S33); + + digest[0] += a; + digest[1] += b; + digest[2] += c; + digest[3] += d; +} + +static void hmac_md5_pad (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], u32x ipad[4], u32x opad[4]) +{ + w0[0] = w0[0] ^ 0x36363636; + w0[1] = w0[1] ^ 0x36363636; + w0[2] = w0[2] ^ 0x36363636; + w0[3] = w0[3] ^ 0x36363636; + w1[0] = w1[0] ^ 0x36363636; + w1[1] = w1[1] ^ 0x36363636; + w1[2] = w1[2] ^ 0x36363636; + w1[3] = w1[3] ^ 0x36363636; + w2[0] = w2[0] ^ 0x36363636; + w2[1] = w2[1] ^ 0x36363636; + w2[2] = w2[2] ^ 0x36363636; + w2[3] = w2[3] ^ 0x36363636; + w3[0] = w3[0] ^ 0x36363636; + w3[1] = w3[1] ^ 0x36363636; + w3[2] = w3[2] ^ 0x36363636; + w3[3] = w3[3] ^ 0x36363636; + + ipad[0] = MD5M_A; + ipad[1] = MD5M_B; + ipad[2] = MD5M_C; + ipad[3] = MD5M_D; + + md5_transform (w0, w1, w2, w3, ipad); + + w0[0] = w0[0] ^ 0x6a6a6a6a; + w0[1] = w0[1] ^ 0x6a6a6a6a; + w0[2] = w0[2] ^ 0x6a6a6a6a; + w0[3] = w0[3] ^ 0x6a6a6a6a; + w1[0] = w1[0] ^ 0x6a6a6a6a; + w1[1] = w1[1] ^ 0x6a6a6a6a; + w1[2] = w1[2] ^ 0x6a6a6a6a; + w1[3] = w1[3] ^ 0x6a6a6a6a; + w2[0] = w2[0] ^ 0x6a6a6a6a; + w2[1] = w2[1] ^ 0x6a6a6a6a; + w2[2] = w2[2] ^ 0x6a6a6a6a; + w2[3] = w2[3] ^ 0x6a6a6a6a; + w3[0] = w3[0] ^ 0x6a6a6a6a; + w3[1] = w3[1] ^ 0x6a6a6a6a; + w3[2] = w3[2] ^ 0x6a6a6a6a; + w3[3] = w3[3] ^ 0x6a6a6a6a; + + opad[0] = MD5M_A; + opad[1] = MD5M_B; + opad[2] = MD5M_C; + opad[3] = MD5M_D; + + md5_transform (w0, w1, w2, w3, opad); +} + +static void hmac_md5_run (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], u32x ipad[4], u32x opad[4], u32x digest[4]) +{ + digest[0] = ipad[0]; + digest[1] = ipad[1]; + digest[2] = ipad[2]; + digest[3] = ipad[3]; + + md5_transform (w0, w1, w2, w3, digest); + + w0[0] = digest[0]; + w0[1] = digest[1]; + w0[2] = digest[2]; + w0[3] = digest[3]; + w1[0] = 0x80; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + w3[0] = 0; + w3[1] = 0; + w3[2] = (64 + 16) * 8; + w3[3] = 0; + + digest[0] = opad[0]; + digest[1] = opad[1]; + digest[2] = opad[2]; + digest[3] = opad[3]; + + md5_transform (w0, w1, w2, w3, digest); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m05300_m04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global ikepsk_t *ikepsk_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, combs_buf[0].pw_len); + } + + /** + * salt + */ + + const u32 nr_len = ikepsk_bufs[salt_pos].nr_len; + const u32 msg_len = ikepsk_bufs[salt_pos].msg_len; + + u32 salt_buf0[4]; + + salt_buf0[0] = ikepsk_bufs[salt_pos].nr_buf[ 0]; + salt_buf0[1] = ikepsk_bufs[salt_pos].nr_buf[ 1]; + salt_buf0[2] = ikepsk_bufs[salt_pos].nr_buf[ 2]; + salt_buf0[3] = ikepsk_bufs[salt_pos].nr_buf[ 3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = ikepsk_bufs[salt_pos].nr_buf[ 4]; + salt_buf1[1] = ikepsk_bufs[salt_pos].nr_buf[ 5]; + salt_buf1[2] = ikepsk_bufs[salt_pos].nr_buf[ 6]; + salt_buf1[3] = ikepsk_bufs[salt_pos].nr_buf[ 7]; + + u32 salt_buf2[4]; + + salt_buf2[0] = ikepsk_bufs[salt_pos].nr_buf[ 8]; + salt_buf2[1] = ikepsk_bufs[salt_pos].nr_buf[ 9]; + salt_buf2[2] = ikepsk_bufs[salt_pos].nr_buf[10]; + salt_buf2[3] = ikepsk_bufs[salt_pos].nr_buf[11]; + + u32 salt_buf3[4]; + + salt_buf3[0] = ikepsk_bufs[salt_pos].nr_buf[12]; + salt_buf3[1] = ikepsk_bufs[salt_pos].nr_buf[13]; + salt_buf3[2] = 0; + salt_buf3[3] = 0; + + __local u32 s_msg_buf[128]; + + const u32 lid2 = lid * 2; + + s_msg_buf[lid2 + 0] = ikepsk_bufs[salt_pos].msg_buf[lid2 + 0]; + s_msg_buf[lid2 + 1] = ikepsk_bufs[salt_pos].msg_buf[lid2 + 1]; + + barrier (CLK_LOCAL_MEM_FENCE); + + if (gid >= gid_max) return; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = combs_buf[il_pos].pw_len; + + const u32 pw_len = pw_l_len + pw_r_len; + + u32 wordr0[4]; + + wordr0[0] = combs_buf[il_pos].i[0]; + wordr0[1] = combs_buf[il_pos].i[1]; + wordr0[2] = combs_buf[il_pos].i[2]; + wordr0[3] = combs_buf[il_pos].i[3]; + + u32 wordr1[4]; + + wordr1[0] = combs_buf[il_pos].i[4]; + wordr1[1] = combs_buf[il_pos].i[5]; + wordr1[2] = combs_buf[il_pos].i[6]; + wordr1[3] = combs_buf[il_pos].i[7]; + + u32 wordr2[4]; + + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + + u32 wordr3[4]; + + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + u32x w0[4]; + + w0[0] = wordl0[0] | wordr0[0]; + w0[1] = wordl0[1] | wordr0[1]; + w0[2] = wordl0[2] | wordr0[2]; + w0[3] = wordl0[3] | wordr0[3]; + + u32x w1[4]; + + w1[0] = wordl1[0] | wordr1[0]; + w1[1] = wordl1[1] | wordr1[1]; + w1[2] = wordl1[2] | wordr1[2]; + w1[3] = wordl1[3] | wordr1[3]; + + u32x w2[4]; + + w2[0] = wordl2[0] | wordr2[0]; + w2[1] = wordl2[1] | wordr2[1]; + w2[2] = wordl2[2] | wordr2[2]; + w2[3] = wordl2[3] | wordr2[3]; + + u32x w3[4]; + + w3[0] = wordl3[0] | wordr3[0]; + w3[1] = wordl3[1] | wordr3[1]; + w3[2] = wordl3[2] | wordr3[2]; + w3[3] = wordl3[3] | wordr3[3]; + + /** + * pads + */ + + u32x w0_t[4]; + + w0_t[0] = w0[0]; + w0_t[1] = w0[1]; + w0_t[2] = w0[2]; + w0_t[3] = w0[3]; + + u32x w1_t[4]; + + w1_t[0] = w1[0]; + w1_t[1] = w1[1]; + w1_t[2] = w1[2]; + w1_t[3] = w1[3]; + + u32x w2_t[4]; + + w2_t[0] = w2[0]; + w2_t[1] = w2[1]; + w2_t[2] = w2[2]; + w2_t[3] = w2[3]; + + u32x w3_t[4]; + + w3_t[0] = w3[0]; + w3_t[1] = w3[1]; + w3_t[2] = w3[2]; + w3_t[3] = w3[3]; + + u32x ipad[4]; + u32x opad[4]; + + hmac_md5_pad (w0_t, w1_t, w2_t, w3_t, ipad, opad); + + w0_t[0] = salt_buf0[0]; + w0_t[1] = salt_buf0[1]; + w0_t[2] = salt_buf0[2]; + w0_t[3] = salt_buf0[3]; + w1_t[0] = salt_buf1[0]; + w1_t[1] = salt_buf1[1]; + w1_t[2] = salt_buf1[2]; + w1_t[3] = salt_buf1[3]; + w2_t[0] = salt_buf2[0]; + w2_t[1] = salt_buf2[1]; + w2_t[2] = salt_buf2[2]; + w2_t[3] = salt_buf2[3]; + w3_t[0] = salt_buf3[0]; + w3_t[1] = salt_buf3[1]; + w3_t[2] = (64 + nr_len) * 8; + w3_t[3] = 0; + + u32x digest[4]; + + hmac_md5_run (w0_t, w1_t, w2_t, w3_t, ipad, opad, digest); + + w0_t[0] = digest[0]; + w0_t[1] = digest[1]; + w0_t[2] = digest[2]; + w0_t[3] = digest[3]; + w1_t[0] = 0; + w1_t[1] = 0; + w1_t[2] = 0; + w1_t[3] = 0; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = 0; + + hmac_md5_pad (w0_t, w1_t, w2_t, w3_t, ipad, opad); + + int left; + int off; + + for (left = ikepsk_bufs[salt_pos].msg_len, off = 0; left >= 56; left -= 64, off += 16) + { + w0_t[0] = s_msg_buf[off + 0]; + w0_t[1] = s_msg_buf[off + 1]; + w0_t[2] = s_msg_buf[off + 2]; + w0_t[3] = s_msg_buf[off + 3]; + w1_t[0] = s_msg_buf[off + 4]; + w1_t[1] = s_msg_buf[off + 5]; + w1_t[2] = s_msg_buf[off + 6]; + w1_t[3] = s_msg_buf[off + 7]; + w2_t[0] = s_msg_buf[off + 8]; + w2_t[1] = s_msg_buf[off + 9]; + w2_t[2] = s_msg_buf[off + 10]; + w2_t[3] = s_msg_buf[off + 11]; + w3_t[0] = s_msg_buf[off + 12]; + w3_t[1] = s_msg_buf[off + 13]; + w3_t[2] = s_msg_buf[off + 14]; + w3_t[3] = s_msg_buf[off + 15]; + + md5_transform (w0_t, w1_t, w2_t, w3_t, ipad); + } + + w0_t[0] = s_msg_buf[off + 0]; + w0_t[1] = s_msg_buf[off + 1]; + w0_t[2] = s_msg_buf[off + 2]; + w0_t[3] = s_msg_buf[off + 3]; + w1_t[0] = s_msg_buf[off + 4]; + w1_t[1] = s_msg_buf[off + 5]; + w1_t[2] = s_msg_buf[off + 6]; + w1_t[3] = s_msg_buf[off + 7]; + w2_t[0] = s_msg_buf[off + 8]; + w2_t[1] = s_msg_buf[off + 9]; + w2_t[2] = s_msg_buf[off + 10]; + w2_t[3] = s_msg_buf[off + 11]; + w3_t[0] = s_msg_buf[off + 12]; + w3_t[1] = s_msg_buf[off + 13]; + w3_t[2] = (64 + msg_len) * 8; + w3_t[3] = 0; + + hmac_md5_run (w0_t, w1_t, w2_t, w3_t, ipad, opad, digest); + + const u32x r0 = digest[0]; + const u32x r1 = digest[3]; + const u32x r2 = digest[2]; + const u32x r3 = digest[1]; + + #include VECT_COMPARE_M + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m05300_m08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global ikepsk_t *ikepsk_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m05300_m16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global ikepsk_t *ikepsk_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m05300_s04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global ikepsk_t *ikepsk_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, combs_buf[0].pw_len); + } + + /** + * salt + */ + + const u32 nr_len = ikepsk_bufs[salt_pos].nr_len; + const u32 msg_len = ikepsk_bufs[salt_pos].msg_len; + + u32 salt_buf0[4]; + + salt_buf0[0] = ikepsk_bufs[salt_pos].nr_buf[ 0]; + salt_buf0[1] = ikepsk_bufs[salt_pos].nr_buf[ 1]; + salt_buf0[2] = ikepsk_bufs[salt_pos].nr_buf[ 2]; + salt_buf0[3] = ikepsk_bufs[salt_pos].nr_buf[ 3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = ikepsk_bufs[salt_pos].nr_buf[ 4]; + salt_buf1[1] = ikepsk_bufs[salt_pos].nr_buf[ 5]; + salt_buf1[2] = ikepsk_bufs[salt_pos].nr_buf[ 6]; + salt_buf1[3] = ikepsk_bufs[salt_pos].nr_buf[ 7]; + + u32 salt_buf2[4]; + + salt_buf2[0] = ikepsk_bufs[salt_pos].nr_buf[ 8]; + salt_buf2[1] = ikepsk_bufs[salt_pos].nr_buf[ 9]; + salt_buf2[2] = ikepsk_bufs[salt_pos].nr_buf[10]; + salt_buf2[3] = ikepsk_bufs[salt_pos].nr_buf[11]; + + u32 salt_buf3[4]; + + salt_buf3[0] = ikepsk_bufs[salt_pos].nr_buf[12]; + salt_buf3[1] = ikepsk_bufs[salt_pos].nr_buf[13]; + salt_buf3[2] = 0; + salt_buf3[3] = 0; + + __local u32 s_msg_buf[128]; + + const u32 lid2 = lid * 2; + + s_msg_buf[lid2 + 0] = ikepsk_bufs[salt_pos].msg_buf[lid2 + 0]; + s_msg_buf[lid2 + 1] = ikepsk_bufs[salt_pos].msg_buf[lid2 + 1]; + + barrier (CLK_LOCAL_MEM_FENCE); + + if (gid >= gid_max) return; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = combs_buf[il_pos].pw_len; + + const u32 pw_len = pw_l_len + pw_r_len; + + u32 wordr0[4]; + + wordr0[0] = combs_buf[il_pos].i[0]; + wordr0[1] = combs_buf[il_pos].i[1]; + wordr0[2] = combs_buf[il_pos].i[2]; + wordr0[3] = combs_buf[il_pos].i[3]; + + u32 wordr1[4]; + + wordr1[0] = combs_buf[il_pos].i[4]; + wordr1[1] = combs_buf[il_pos].i[5]; + wordr1[2] = combs_buf[il_pos].i[6]; + wordr1[3] = combs_buf[il_pos].i[7]; + + u32 wordr2[4]; + + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + + u32 wordr3[4]; + + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + u32x w0[4]; + + w0[0] = wordl0[0] | wordr0[0]; + w0[1] = wordl0[1] | wordr0[1]; + w0[2] = wordl0[2] | wordr0[2]; + w0[3] = wordl0[3] | wordr0[3]; + + u32x w1[4]; + + w1[0] = wordl1[0] | wordr1[0]; + w1[1] = wordl1[1] | wordr1[1]; + w1[2] = wordl1[2] | wordr1[2]; + w1[3] = wordl1[3] | wordr1[3]; + + u32x w2[4]; + + w2[0] = wordl2[0] | wordr2[0]; + w2[1] = wordl2[1] | wordr2[1]; + w2[2] = wordl2[2] | wordr2[2]; + w2[3] = wordl2[3] | wordr2[3]; + + u32x w3[4]; + + w3[0] = wordl3[0] | wordr3[0]; + w3[1] = wordl3[1] | wordr3[1]; + w3[2] = wordl3[2] | wordr3[2]; + w3[3] = wordl3[3] | wordr3[3]; + + /** + * pads + */ + + u32x w0_t[4]; + + w0_t[0] = w0[0]; + w0_t[1] = w0[1]; + w0_t[2] = w0[2]; + w0_t[3] = w0[3]; + + u32x w1_t[4]; + + w1_t[0] = w1[0]; + w1_t[1] = w1[1]; + w1_t[2] = w1[2]; + w1_t[3] = w1[3]; + + u32x w2_t[4]; + + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + + u32x w3_t[4]; + + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = 0; + + u32x ipad[4]; + u32x opad[4]; + + hmac_md5_pad (w0_t, w1_t, w2_t, w3_t, ipad, opad); + + w0_t[0] = salt_buf0[0]; + w0_t[1] = salt_buf0[1]; + w0_t[2] = salt_buf0[2]; + w0_t[3] = salt_buf0[3]; + w1_t[0] = salt_buf1[0]; + w1_t[1] = salt_buf1[1]; + w1_t[2] = salt_buf1[2]; + w1_t[3] = salt_buf1[3]; + w2_t[0] = salt_buf2[0]; + w2_t[1] = salt_buf2[1]; + w2_t[2] = salt_buf2[2]; + w2_t[3] = salt_buf2[3]; + w3_t[0] = salt_buf3[0]; + w3_t[1] = salt_buf3[1]; + w3_t[2] = (64 + nr_len) * 8; + w3_t[3] = 0; + + u32x digest[4]; + + hmac_md5_run (w0_t, w1_t, w2_t, w3_t, ipad, opad, digest); + + w0_t[0] = digest[0]; + w0_t[1] = digest[1]; + w0_t[2] = digest[2]; + w0_t[3] = digest[3]; + w1_t[0] = 0; + w1_t[1] = 0; + w1_t[2] = 0; + w1_t[3] = 0; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = 0; + + hmac_md5_pad (w0_t, w1_t, w2_t, w3_t, ipad, opad); + + int left; + int off; + + for (left = ikepsk_bufs[salt_pos].msg_len, off = 0; left >= 56; left -= 64, off += 16) + { + w0_t[0] = s_msg_buf[off + 0]; + w0_t[1] = s_msg_buf[off + 1]; + w0_t[2] = s_msg_buf[off + 2]; + w0_t[3] = s_msg_buf[off + 3]; + w1_t[0] = s_msg_buf[off + 4]; + w1_t[1] = s_msg_buf[off + 5]; + w1_t[2] = s_msg_buf[off + 6]; + w1_t[3] = s_msg_buf[off + 7]; + w2_t[0] = s_msg_buf[off + 8]; + w2_t[1] = s_msg_buf[off + 9]; + w2_t[2] = s_msg_buf[off + 10]; + w2_t[3] = s_msg_buf[off + 11]; + w3_t[0] = s_msg_buf[off + 12]; + w3_t[1] = s_msg_buf[off + 13]; + w3_t[2] = s_msg_buf[off + 14]; + w3_t[3] = s_msg_buf[off + 15]; + + md5_transform (w0_t, w1_t, w2_t, w3_t, ipad); + } + + w0_t[0] = s_msg_buf[off + 0]; + w0_t[1] = s_msg_buf[off + 1]; + w0_t[2] = s_msg_buf[off + 2]; + w0_t[3] = s_msg_buf[off + 3]; + w1_t[0] = s_msg_buf[off + 4]; + w1_t[1] = s_msg_buf[off + 5]; + w1_t[2] = s_msg_buf[off + 6]; + w1_t[3] = s_msg_buf[off + 7]; + w2_t[0] = s_msg_buf[off + 8]; + w2_t[1] = s_msg_buf[off + 9]; + w2_t[2] = s_msg_buf[off + 10]; + w2_t[3] = s_msg_buf[off + 11]; + w3_t[0] = s_msg_buf[off + 12]; + w3_t[1] = s_msg_buf[off + 13]; + w3_t[2] = (64 + msg_len) * 8; + w3_t[3] = 0; + + hmac_md5_run (w0_t, w1_t, w2_t, w3_t, ipad, opad, digest); + + const u32x r0 = digest[0]; + const u32x r1 = digest[3]; + const u32x r2 = digest[2]; + const u32x r3 = digest[1]; + + #include VECT_COMPARE_S + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m05300_s08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global ikepsk_t *ikepsk_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m05300_s16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global ikepsk_t *ikepsk_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/amd/m05300_a3.cl b/amd/m05300_a3.cl new file mode 100644 index 0000000000..a6885a6249 --- /dev/null +++ b/amd/m05300_a3.cl @@ -0,0 +1,1003 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _MD5_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW4 +#define VECT_SIZE4 +#endif + +#ifdef VLIW5 +#define VECT_SIZE4 +#endif + +#define DGST_R0 0 +#define DGST_R1 3 +#define DGST_R2 2 +#define DGST_R3 1 + +#include "include/kernel_functions.c" +#include "types_amd.c" +#include "common_amd.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +static void md5_transform (const u32x w0[4], const u32x w1[4], const u32x w2[4], const u32x w3[4], u32x digest[4]) +{ + u32x a = digest[0]; + u32x b = digest[1]; + u32x c = digest[2]; + u32x d = digest[3]; + + u32x w0_t = w0[0]; + u32x w1_t = w0[1]; + u32x w2_t = w0[2]; + u32x w3_t = w0[3]; + u32x w4_t = w1[0]; + u32x w5_t = w1[1]; + u32x w6_t = w1[2]; + u32x w7_t = w1[3]; + u32x w8_t = w2[0]; + u32x w9_t = w2[1]; + u32x wa_t = w2[2]; + u32x wb_t = w2[3]; + u32x wc_t = w3[0]; + u32x wd_t = w3[1]; + u32x we_t = w3[2]; + u32x wf_t = w3[3]; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t, MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t, MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t, MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t, MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w4_t, MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w5_t, MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w6_t, MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w7_t, MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w8_t, MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w9_t, MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, wa_t, MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, wb_t, MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, wc_t, MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, wd_t, MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, we_t, MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, wf_t, MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w1_t, MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w6_t, MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, wb_t, MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t, MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w5_t, MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, wa_t, MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, wf_t, MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w4_t, MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w9_t, MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, we_t, MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t, MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w8_t, MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, wd_t, MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t, MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w7_t, MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, wc_t, MD5C1f, MD5S13); + + MD5_STEP (MD5_H , a, b, c, d, w5_t, MD5C20, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w8_t, MD5C21, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, wb_t, MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, we_t, MD5C23, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w1_t, MD5C24, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w4_t, MD5C25, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w7_t, MD5C26, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, wa_t, MD5C27, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, wd_t, MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w0_t, MD5C29, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w3_t, MD5C2a, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w6_t, MD5C2b, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w9_t, MD5C2c, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, wc_t, MD5C2d, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, wf_t, MD5C2e, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w2_t, MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t, MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w7_t, MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, we_t, MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w5_t, MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, wc_t, MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t, MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, wa_t, MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t, MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w8_t, MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, wf_t, MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w6_t, MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, wd_t, MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w4_t, MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, wb_t, MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t, MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w9_t, MD5C3f, MD5S33); + + digest[0] += a; + digest[1] += b; + digest[2] += c; + digest[3] += d; +} + +static void hmac_md5_pad (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], u32x ipad[4], u32x opad[4]) +{ + w0[0] = w0[0] ^ 0x36363636; + w0[1] = w0[1] ^ 0x36363636; + w0[2] = w0[2] ^ 0x36363636; + w0[3] = w0[3] ^ 0x36363636; + w1[0] = w1[0] ^ 0x36363636; + w1[1] = w1[1] ^ 0x36363636; + w1[2] = w1[2] ^ 0x36363636; + w1[3] = w1[3] ^ 0x36363636; + w2[0] = w2[0] ^ 0x36363636; + w2[1] = w2[1] ^ 0x36363636; + w2[2] = w2[2] ^ 0x36363636; + w2[3] = w2[3] ^ 0x36363636; + w3[0] = w3[0] ^ 0x36363636; + w3[1] = w3[1] ^ 0x36363636; + w3[2] = w3[2] ^ 0x36363636; + w3[3] = w3[3] ^ 0x36363636; + + ipad[0] = MD5M_A; + ipad[1] = MD5M_B; + ipad[2] = MD5M_C; + ipad[3] = MD5M_D; + + md5_transform (w0, w1, w2, w3, ipad); + + w0[0] = w0[0] ^ 0x6a6a6a6a; + w0[1] = w0[1] ^ 0x6a6a6a6a; + w0[2] = w0[2] ^ 0x6a6a6a6a; + w0[3] = w0[3] ^ 0x6a6a6a6a; + w1[0] = w1[0] ^ 0x6a6a6a6a; + w1[1] = w1[1] ^ 0x6a6a6a6a; + w1[2] = w1[2] ^ 0x6a6a6a6a; + w1[3] = w1[3] ^ 0x6a6a6a6a; + w2[0] = w2[0] ^ 0x6a6a6a6a; + w2[1] = w2[1] ^ 0x6a6a6a6a; + w2[2] = w2[2] ^ 0x6a6a6a6a; + w2[3] = w2[3] ^ 0x6a6a6a6a; + w3[0] = w3[0] ^ 0x6a6a6a6a; + w3[1] = w3[1] ^ 0x6a6a6a6a; + w3[2] = w3[2] ^ 0x6a6a6a6a; + w3[3] = w3[3] ^ 0x6a6a6a6a; + + opad[0] = MD5M_A; + opad[1] = MD5M_B; + opad[2] = MD5M_C; + opad[3] = MD5M_D; + + md5_transform (w0, w1, w2, w3, opad); +} + +static void hmac_md5_run (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], u32x ipad[4], u32x opad[4], u32x digest[4]) +{ + digest[0] = ipad[0]; + digest[1] = ipad[1]; + digest[2] = ipad[2]; + digest[3] = ipad[3]; + + md5_transform (w0, w1, w2, w3, digest); + + w0[0] = digest[0]; + w0[1] = digest[1]; + w0[2] = digest[2]; + w0[3] = digest[3]; + w1[0] = 0x80; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + w3[0] = 0; + w3[1] = 0; + w3[2] = (64 + 16) * 8; + w3[3] = 0; + + digest[0] = opad[0]; + digest[1] = opad[1]; + digest[2] = opad[2]; + digest[3] = opad[3]; + + md5_transform (w0, w1, w2, w3, digest); +} + +static void m05300m (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], const u32 pw_len, __global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global ikepsk_t *ikepsk_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, __local u32 s_msg_buf[128]) +{ + /** + * modifier + */ + + const u32 gid = get_global_id (0); + const u32 lid = get_local_id (0); + + /** + * salt + */ + + const u32 nr_len = ikepsk_bufs[salt_pos].nr_len; + const u32 msg_len = ikepsk_bufs[salt_pos].msg_len; + + u32 salt_buf0[4]; + + salt_buf0[0] = ikepsk_bufs[salt_pos].nr_buf[ 0]; + salt_buf0[1] = ikepsk_bufs[salt_pos].nr_buf[ 1]; + salt_buf0[2] = ikepsk_bufs[salt_pos].nr_buf[ 2]; + salt_buf0[3] = ikepsk_bufs[salt_pos].nr_buf[ 3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = ikepsk_bufs[salt_pos].nr_buf[ 4]; + salt_buf1[1] = ikepsk_bufs[salt_pos].nr_buf[ 5]; + salt_buf1[2] = ikepsk_bufs[salt_pos].nr_buf[ 6]; + salt_buf1[3] = ikepsk_bufs[salt_pos].nr_buf[ 7]; + + u32 salt_buf2[4]; + + salt_buf2[0] = ikepsk_bufs[salt_pos].nr_buf[ 8]; + salt_buf2[1] = ikepsk_bufs[salt_pos].nr_buf[ 9]; + salt_buf2[2] = ikepsk_bufs[salt_pos].nr_buf[10]; + salt_buf2[3] = ikepsk_bufs[salt_pos].nr_buf[11]; + + u32 salt_buf3[4]; + + salt_buf3[0] = ikepsk_bufs[salt_pos].nr_buf[12]; + salt_buf3[1] = ikepsk_bufs[salt_pos].nr_buf[13]; + salt_buf3[2] = 0; + salt_buf3[3] = 0; + + /** + * loop + */ + + u32x w0l = w0[0]; + + for (u32 il_pos = 0; il_pos < bfs_cnt; il_pos++) + { + const u32 w0r = bfs_buf[il_pos].i; + + w0[0] = w0l | w0r; + + /** + * pads + */ + + u32x w0_t[4]; + + w0_t[0] = w0[0]; + w0_t[1] = w0[1]; + w0_t[2] = w0[2]; + w0_t[3] = w0[3]; + + u32x w1_t[4]; + + w1_t[0] = w1[0]; + w1_t[1] = w1[1]; + w1_t[2] = w1[2]; + w1_t[3] = w1[3]; + + u32x w2_t[4]; + + w2_t[0] = w2[0]; + w2_t[1] = w2[1]; + w2_t[2] = w2[2]; + w2_t[3] = w2[3]; + + u32x w3_t[4]; + + w3_t[0] = w3[0]; + w3_t[1] = w3[1]; + w3_t[2] = w3[2]; + w3_t[3] = w3[3]; + + u32x ipad[4]; + u32x opad[4]; + + hmac_md5_pad (w0_t, w1_t, w2_t, w3_t, ipad, opad); + + w0_t[0] = salt_buf0[0]; + w0_t[1] = salt_buf0[1]; + w0_t[2] = salt_buf0[2]; + w0_t[3] = salt_buf0[3]; + w1_t[0] = salt_buf1[0]; + w1_t[1] = salt_buf1[1]; + w1_t[2] = salt_buf1[2]; + w1_t[3] = salt_buf1[3]; + w2_t[0] = salt_buf2[0]; + w2_t[1] = salt_buf2[1]; + w2_t[2] = salt_buf2[2]; + w2_t[3] = salt_buf2[3]; + w3_t[0] = salt_buf3[0]; + w3_t[1] = salt_buf3[1]; + w3_t[2] = (64 + nr_len) * 8; + w3_t[3] = 0; + + u32x digest[4]; + + hmac_md5_run (w0_t, w1_t, w2_t, w3_t, ipad, opad, digest); + + w0_t[0] = digest[0]; + w0_t[1] = digest[1]; + w0_t[2] = digest[2]; + w0_t[3] = digest[3]; + w1_t[0] = 0; + w1_t[1] = 0; + w1_t[2] = 0; + w1_t[3] = 0; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = 0; + + hmac_md5_pad (w0_t, w1_t, w2_t, w3_t, ipad, opad); + + int left; + int off; + + for (left = ikepsk_bufs[salt_pos].msg_len, off = 0; left >= 56; left -= 64, off += 16) + { + w0_t[0] = s_msg_buf[off + 0]; + w0_t[1] = s_msg_buf[off + 1]; + w0_t[2] = s_msg_buf[off + 2]; + w0_t[3] = s_msg_buf[off + 3]; + w1_t[0] = s_msg_buf[off + 4]; + w1_t[1] = s_msg_buf[off + 5]; + w1_t[2] = s_msg_buf[off + 6]; + w1_t[3] = s_msg_buf[off + 7]; + w2_t[0] = s_msg_buf[off + 8]; + w2_t[1] = s_msg_buf[off + 9]; + w2_t[2] = s_msg_buf[off + 10]; + w2_t[3] = s_msg_buf[off + 11]; + w3_t[0] = s_msg_buf[off + 12]; + w3_t[1] = s_msg_buf[off + 13]; + w3_t[2] = s_msg_buf[off + 14]; + w3_t[3] = s_msg_buf[off + 15]; + + md5_transform (w0_t, w1_t, w2_t, w3_t, ipad); + } + + w0_t[0] = s_msg_buf[off + 0]; + w0_t[1] = s_msg_buf[off + 1]; + w0_t[2] = s_msg_buf[off + 2]; + w0_t[3] = s_msg_buf[off + 3]; + w1_t[0] = s_msg_buf[off + 4]; + w1_t[1] = s_msg_buf[off + 5]; + w1_t[2] = s_msg_buf[off + 6]; + w1_t[3] = s_msg_buf[off + 7]; + w2_t[0] = s_msg_buf[off + 8]; + w2_t[1] = s_msg_buf[off + 9]; + w2_t[2] = s_msg_buf[off + 10]; + w2_t[3] = s_msg_buf[off + 11]; + w3_t[0] = s_msg_buf[off + 12]; + w3_t[1] = s_msg_buf[off + 13]; + w3_t[2] = (64 + msg_len) * 8; + w3_t[3] = 0; + + hmac_md5_run (w0_t, w1_t, w2_t, w3_t, ipad, opad, digest); + + const u32x r0 = digest[0]; + const u32x r1 = digest[3]; + const u32x r2 = digest[2]; + const u32x r3 = digest[1]; + + #include VECT_COMPARE_M + } +} + +static void m05300s (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], const u32 pw_len, __global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global ikepsk_t *ikepsk_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, __local u32 s_msg_buf[128]) +{ + /** + * modifier + */ + + const u32 gid = get_global_id (0); + const u32 lid = get_local_id (0); + + /** + * salt + */ + + const u32 nr_len = ikepsk_bufs[salt_pos].nr_len; + const u32 msg_len = ikepsk_bufs[salt_pos].msg_len; + + u32 salt_buf0[4]; + + salt_buf0[0] = ikepsk_bufs[salt_pos].nr_buf[ 0]; + salt_buf0[1] = ikepsk_bufs[salt_pos].nr_buf[ 1]; + salt_buf0[2] = ikepsk_bufs[salt_pos].nr_buf[ 2]; + salt_buf0[3] = ikepsk_bufs[salt_pos].nr_buf[ 3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = ikepsk_bufs[salt_pos].nr_buf[ 4]; + salt_buf1[1] = ikepsk_bufs[salt_pos].nr_buf[ 5]; + salt_buf1[2] = ikepsk_bufs[salt_pos].nr_buf[ 6]; + salt_buf1[3] = ikepsk_bufs[salt_pos].nr_buf[ 7]; + + u32 salt_buf2[4]; + + salt_buf2[0] = ikepsk_bufs[salt_pos].nr_buf[ 8]; + salt_buf2[1] = ikepsk_bufs[salt_pos].nr_buf[ 9]; + salt_buf2[2] = ikepsk_bufs[salt_pos].nr_buf[10]; + salt_buf2[3] = ikepsk_bufs[salt_pos].nr_buf[11]; + + u32 salt_buf3[4]; + + salt_buf3[0] = ikepsk_bufs[salt_pos].nr_buf[12]; + salt_buf3[1] = ikepsk_bufs[salt_pos].nr_buf[13]; + salt_buf3[2] = 0; + salt_buf3[3] = 0; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * loop + */ + + u32x w0l = w0[0]; + + for (u32 il_pos = 0; il_pos < bfs_cnt; il_pos++) + { + const u32 w0r = bfs_buf[il_pos].i; + + w0[0] = w0l | w0r; + + /** + * pads + */ + + u32x w0_t[4]; + + w0_t[0] = w0[0]; + w0_t[1] = w0[1]; + w0_t[2] = w0[2]; + w0_t[3] = w0[3]; + + u32x w1_t[4]; + + w1_t[0] = w1[0]; + w1_t[1] = w1[1]; + w1_t[2] = w1[2]; + w1_t[3] = w1[3]; + + u32x w2_t[4]; + + w2_t[0] = w2[0]; + w2_t[1] = w2[1]; + w2_t[2] = w2[2]; + w2_t[3] = w2[3]; + + u32x w3_t[4]; + + w3_t[0] = w3[0]; + w3_t[1] = w3[1]; + w3_t[2] = w3[2]; + w3_t[3] = w3[3]; + + u32x ipad[4]; + u32x opad[4]; + + hmac_md5_pad (w0_t, w1_t, w2_t, w3_t, ipad, opad); + + w0_t[0] = salt_buf0[0]; + w0_t[1] = salt_buf0[1]; + w0_t[2] = salt_buf0[2]; + w0_t[3] = salt_buf0[3]; + w1_t[0] = salt_buf1[0]; + w1_t[1] = salt_buf1[1]; + w1_t[2] = salt_buf1[2]; + w1_t[3] = salt_buf1[3]; + w2_t[0] = salt_buf2[0]; + w2_t[1] = salt_buf2[1]; + w2_t[2] = salt_buf2[2]; + w2_t[3] = salt_buf2[3]; + w3_t[0] = salt_buf3[0]; + w3_t[1] = salt_buf3[1]; + w3_t[2] = (64 + nr_len) * 8; + w3_t[3] = 0; + + u32x digest[4]; + + hmac_md5_run (w0_t, w1_t, w2_t, w3_t, ipad, opad, digest); + + w0_t[0] = digest[0]; + w0_t[1] = digest[1]; + w0_t[2] = digest[2]; + w0_t[3] = digest[3]; + w1_t[0] = 0; + w1_t[1] = 0; + w1_t[2] = 0; + w1_t[3] = 0; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = 0; + + hmac_md5_pad (w0_t, w1_t, w2_t, w3_t, ipad, opad); + + int left; + int off; + + for (left = ikepsk_bufs[salt_pos].msg_len, off = 0; left >= 56; left -= 64, off += 16) + { + w0_t[0] = s_msg_buf[off + 0]; + w0_t[1] = s_msg_buf[off + 1]; + w0_t[2] = s_msg_buf[off + 2]; + w0_t[3] = s_msg_buf[off + 3]; + w1_t[0] = s_msg_buf[off + 4]; + w1_t[1] = s_msg_buf[off + 5]; + w1_t[2] = s_msg_buf[off + 6]; + w1_t[3] = s_msg_buf[off + 7]; + w2_t[0] = s_msg_buf[off + 8]; + w2_t[1] = s_msg_buf[off + 9]; + w2_t[2] = s_msg_buf[off + 10]; + w2_t[3] = s_msg_buf[off + 11]; + w3_t[0] = s_msg_buf[off + 12]; + w3_t[1] = s_msg_buf[off + 13]; + w3_t[2] = s_msg_buf[off + 14]; + w3_t[3] = s_msg_buf[off + 15]; + + md5_transform (w0_t, w1_t, w2_t, w3_t, ipad); + } + + w0_t[0] = s_msg_buf[off + 0]; + w0_t[1] = s_msg_buf[off + 1]; + w0_t[2] = s_msg_buf[off + 2]; + w0_t[3] = s_msg_buf[off + 3]; + w1_t[0] = s_msg_buf[off + 4]; + w1_t[1] = s_msg_buf[off + 5]; + w1_t[2] = s_msg_buf[off + 6]; + w1_t[3] = s_msg_buf[off + 7]; + w2_t[0] = s_msg_buf[off + 8]; + w2_t[1] = s_msg_buf[off + 9]; + w2_t[2] = s_msg_buf[off + 10]; + w2_t[3] = s_msg_buf[off + 11]; + w3_t[0] = s_msg_buf[off + 12]; + w3_t[1] = s_msg_buf[off + 13]; + w3_t[2] = (64 + msg_len) * 8; + w3_t[3] = 0; + + hmac_md5_run (w0_t, w1_t, w2_t, w3_t, ipad, opad, digest); + + const u32x r0 = digest[0]; + const u32x r1 = digest[3]; + const u32x r2 = digest[2]; + const u32x r3 = digest[1]; + + #include VECT_COMPARE_S + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m05300_m04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global ikepsk_t *ikepsk_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * s_msg + */ + + __local u32 s_msg_buf[128]; + + const u32 lid2 = lid * 2; + + s_msg_buf[lid2 + 0] = ikepsk_bufs[salt_pos].msg_buf[lid2 + 0]; + s_msg_buf[lid2 + 1] = ikepsk_bufs[salt_pos].msg_buf[lid2 + 1]; + + barrier (CLK_LOCAL_MEM_FENCE); + + if (gid >= gid_max) return; + + /** + * main + */ + + m05300m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, ikepsk_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset, s_msg_buf); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m05300_m08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global ikepsk_t *ikepsk_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * s_msg + */ + + __local u32 s_msg_buf[128]; + + const u32 lid2 = lid * 2; + + s_msg_buf[lid2 + 0] = ikepsk_bufs[salt_pos].msg_buf[lid2 + 0]; + s_msg_buf[lid2 + 1] = ikepsk_bufs[salt_pos].msg_buf[lid2 + 1]; + + barrier (CLK_LOCAL_MEM_FENCE); + + if (gid >= gid_max) return; + + /** + * main + */ + + m05300m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, ikepsk_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset, s_msg_buf); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m05300_m16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global ikepsk_t *ikepsk_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = pws[gid].i[ 8]; + w2[1] = pws[gid].i[ 9]; + w2[2] = pws[gid].i[10]; + w2[3] = pws[gid].i[11]; + + u32x w3[4]; + + w3[0] = pws[gid].i[12]; + w3[1] = pws[gid].i[13]; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * s_msg + */ + + __local u32 s_msg_buf[128]; + + const u32 lid2 = lid * 2; + + s_msg_buf[lid2 + 0] = ikepsk_bufs[salt_pos].msg_buf[lid2 + 0]; + s_msg_buf[lid2 + 1] = ikepsk_bufs[salt_pos].msg_buf[lid2 + 1]; + + barrier (CLK_LOCAL_MEM_FENCE); + + if (gid >= gid_max) return; + + /** + * main + */ + + m05300m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, ikepsk_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset, s_msg_buf); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m05300_s04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global ikepsk_t *ikepsk_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * s_msg + */ + + __local u32 s_msg_buf[128]; + + const u32 lid2 = lid * 2; + + s_msg_buf[lid2 + 0] = ikepsk_bufs[salt_pos].msg_buf[lid2 + 0]; + s_msg_buf[lid2 + 1] = ikepsk_bufs[salt_pos].msg_buf[lid2 + 1]; + + barrier (CLK_LOCAL_MEM_FENCE); + + if (gid >= gid_max) return; + + /** + * main + */ + + m05300s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, ikepsk_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset, s_msg_buf); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m05300_s08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global ikepsk_t *ikepsk_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * s_msg + */ + + __local u32 s_msg_buf[128]; + + const u32 lid2 = lid * 2; + + s_msg_buf[lid2 + 0] = ikepsk_bufs[salt_pos].msg_buf[lid2 + 0]; + s_msg_buf[lid2 + 1] = ikepsk_bufs[salt_pos].msg_buf[lid2 + 1]; + + barrier (CLK_LOCAL_MEM_FENCE); + + if (gid >= gid_max) return; + + /** + * main + */ + + m05300s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, ikepsk_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset, s_msg_buf); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m05300_s16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global ikepsk_t *ikepsk_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = pws[gid].i[ 8]; + w2[1] = pws[gid].i[ 9]; + w2[2] = pws[gid].i[10]; + w2[3] = pws[gid].i[11]; + + u32x w3[4]; + + w3[0] = pws[gid].i[12]; + w3[1] = pws[gid].i[13]; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * s_msg + */ + + __local u32 s_msg_buf[128]; + + const u32 lid2 = lid * 2; + + s_msg_buf[lid2 + 0] = ikepsk_bufs[salt_pos].msg_buf[lid2 + 0]; + s_msg_buf[lid2 + 1] = ikepsk_bufs[salt_pos].msg_buf[lid2 + 1]; + + barrier (CLK_LOCAL_MEM_FENCE); + + if (gid >= gid_max) return; + + /** + * main + */ + + m05300s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, ikepsk_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset, s_msg_buf); +} diff --git a/amd/m05400_a0.cl b/amd/m05400_a0.cl new file mode 100644 index 0000000000..9fe4e046f8 --- /dev/null +++ b/amd/m05400_a0.cl @@ -0,0 +1,776 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _SHA1_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW4 +#define VECT_SIZE4 +#endif + +#ifdef VLIW5 +#define VECT_SIZE2 +#endif + +#define DGST_R0 3 +#define DGST_R1 4 +#define DGST_R2 2 +#define DGST_R3 1 + +#include "include/kernel_functions.c" +#include "types_amd.c" +#include "common_amd.c" +#include "include/rp_gpu.h" +#include "rp_amd.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +static void sha1_transform (const u32x w0[4], const u32x w1[4], const u32x w2[4], const u32x w3[4], u32x digest[5]) +{ + u32x A = digest[0]; + u32x B = digest[1]; + u32x C = digest[2]; + u32x D = digest[3]; + u32x E = digest[4]; + + u32x w0_t = w0[0]; + u32x w1_t = w0[1]; + u32x w2_t = w0[2]; + u32x w3_t = w0[3]; + u32x w4_t = w1[0]; + u32x w5_t = w1[1]; + u32x w6_t = w1[2]; + u32x w7_t = w1[3]; + u32x w8_t = w2[0]; + u32x w9_t = w2[1]; + u32x wa_t = w2[2]; + u32x wb_t = w2[3]; + u32x wc_t = w3[0]; + u32x wd_t = w3[1]; + u32x we_t = w3[2]; + u32x wf_t = w3[3]; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, A, B, C, D, E, w0_t); + SHA1_STEP (SHA1_F0o, E, A, B, C, D, w1_t); + SHA1_STEP (SHA1_F0o, D, E, A, B, C, w2_t); + SHA1_STEP (SHA1_F0o, C, D, E, A, B, w3_t); + SHA1_STEP (SHA1_F0o, B, C, D, E, A, w4_t); + SHA1_STEP (SHA1_F0o, A, B, C, D, E, w5_t); + SHA1_STEP (SHA1_F0o, E, A, B, C, D, w6_t); + SHA1_STEP (SHA1_F0o, D, E, A, B, C, w7_t); + SHA1_STEP (SHA1_F0o, C, D, E, A, B, w8_t); + SHA1_STEP (SHA1_F0o, B, C, D, E, A, w9_t); + SHA1_STEP (SHA1_F0o, A, B, C, D, E, wa_t); + SHA1_STEP (SHA1_F0o, E, A, B, C, D, wb_t); + SHA1_STEP (SHA1_F0o, D, E, A, B, C, wc_t); + SHA1_STEP (SHA1_F0o, C, D, E, A, B, wd_t); + SHA1_STEP (SHA1_F0o, B, C, D, E, A, we_t); + SHA1_STEP (SHA1_F0o, A, B, C, D, E, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F0o, E, A, B, C, D, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F0o, D, E, A, B, C, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F0o, C, D, E, A, B, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F0o, B, C, D, E, A, w3_t); + + #undef K + #define K SHA1C01 + + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w7_t); + + #undef K + #define K SHA1C02 + + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, wb_t); + + #undef K + #define K SHA1C03 + + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, wf_t); + + digest[0] += A; + digest[1] += B; + digest[2] += C; + digest[3] += D; + digest[4] += E; +} + +static void hmac_sha1_pad (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], u32x ipad[5], u32x opad[5]) +{ + w0[0] = w0[0] ^ 0x36363636; + w0[1] = w0[1] ^ 0x36363636; + w0[2] = w0[2] ^ 0x36363636; + w0[3] = w0[3] ^ 0x36363636; + w1[0] = w1[0] ^ 0x36363636; + w1[1] = w1[1] ^ 0x36363636; + w1[2] = w1[2] ^ 0x36363636; + w1[3] = w1[3] ^ 0x36363636; + w2[0] = w2[0] ^ 0x36363636; + w2[1] = w2[1] ^ 0x36363636; + w2[2] = w2[2] ^ 0x36363636; + w2[3] = w2[3] ^ 0x36363636; + w3[0] = w3[0] ^ 0x36363636; + w3[1] = w3[1] ^ 0x36363636; + w3[2] = w3[2] ^ 0x36363636; + w3[3] = w3[3] ^ 0x36363636; + + ipad[0] = SHA1M_A; + ipad[1] = SHA1M_B; + ipad[2] = SHA1M_C; + ipad[3] = SHA1M_D; + ipad[4] = SHA1M_E; + + sha1_transform (w0, w1, w2, w3, ipad); + + w0[0] = w0[0] ^ 0x6a6a6a6a; + w0[1] = w0[1] ^ 0x6a6a6a6a; + w0[2] = w0[2] ^ 0x6a6a6a6a; + w0[3] = w0[3] ^ 0x6a6a6a6a; + w1[0] = w1[0] ^ 0x6a6a6a6a; + w1[1] = w1[1] ^ 0x6a6a6a6a; + w1[2] = w1[2] ^ 0x6a6a6a6a; + w1[3] = w1[3] ^ 0x6a6a6a6a; + w2[0] = w2[0] ^ 0x6a6a6a6a; + w2[1] = w2[1] ^ 0x6a6a6a6a; + w2[2] = w2[2] ^ 0x6a6a6a6a; + w2[3] = w2[3] ^ 0x6a6a6a6a; + w3[0] = w3[0] ^ 0x6a6a6a6a; + w3[1] = w3[1] ^ 0x6a6a6a6a; + w3[2] = w3[2] ^ 0x6a6a6a6a; + w3[3] = w3[3] ^ 0x6a6a6a6a; + + opad[0] = SHA1M_A; + opad[1] = SHA1M_B; + opad[2] = SHA1M_C; + opad[3] = SHA1M_D; + opad[4] = SHA1M_E; + + sha1_transform (w0, w1, w2, w3, opad); +} + +static void hmac_sha1_run (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], u32x ipad[5], u32x opad[5], u32x digest[5]) +{ + digest[0] = ipad[0]; + digest[1] = ipad[1]; + digest[2] = ipad[2]; + digest[3] = ipad[3]; + digest[4] = ipad[4]; + + sha1_transform (w0, w1, w2, w3, digest); + + w0[0] = digest[0]; + w0[1] = digest[1]; + w0[2] = digest[2]; + w0[3] = digest[3]; + w1[0] = digest[4]; + w1[1] = 0x80000000; + w1[2] = 0; + w1[3] = 0; + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = (64 + 20) * 8; + + digest[0] = opad[0]; + digest[1] = opad[1]; + digest[2] = opad[2]; + digest[3] = opad[3]; + digest[4] = opad[4]; + + sha1_transform (w0, w1, w2, w3, digest); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m05400_m04 (__global pw_t *pws, __global gpu_rule_t * rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global ikepsk_t *ikepsk_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + u32x pw_buf1[4]; + + pw_buf1[0] = pws[gid].i[ 4]; + pw_buf1[1] = pws[gid].i[ 5]; + pw_buf1[2] = pws[gid].i[ 6]; + pw_buf1[3] = pws[gid].i[ 7]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * salt + */ + + const u32 nr_len = ikepsk_bufs[salt_pos].nr_len; + const u32 msg_len = ikepsk_bufs[salt_pos].msg_len; + + u32 salt_buf0[4]; + + salt_buf0[0] = swap_workaround (ikepsk_bufs[salt_pos].nr_buf[ 0]); + salt_buf0[1] = swap_workaround (ikepsk_bufs[salt_pos].nr_buf[ 1]); + salt_buf0[2] = swap_workaround (ikepsk_bufs[salt_pos].nr_buf[ 2]); + salt_buf0[3] = swap_workaround (ikepsk_bufs[salt_pos].nr_buf[ 3]); + + u32 salt_buf1[4]; + + salt_buf1[0] = swap_workaround (ikepsk_bufs[salt_pos].nr_buf[ 4]); + salt_buf1[1] = swap_workaround (ikepsk_bufs[salt_pos].nr_buf[ 5]); + salt_buf1[2] = swap_workaround (ikepsk_bufs[salt_pos].nr_buf[ 6]); + salt_buf1[3] = swap_workaround (ikepsk_bufs[salt_pos].nr_buf[ 7]); + + u32 salt_buf2[4]; + + salt_buf2[0] = swap_workaround (ikepsk_bufs[salt_pos].nr_buf[ 8]); + salt_buf2[1] = swap_workaround (ikepsk_bufs[salt_pos].nr_buf[ 9]); + salt_buf2[2] = swap_workaround (ikepsk_bufs[salt_pos].nr_buf[10]); + salt_buf2[3] = swap_workaround (ikepsk_bufs[salt_pos].nr_buf[11]); + + u32 salt_buf3[4]; + + salt_buf3[0] = swap_workaround (ikepsk_bufs[salt_pos].nr_buf[12]); + salt_buf3[1] = swap_workaround (ikepsk_bufs[salt_pos].nr_buf[13]); + salt_buf3[2] = 0; + salt_buf3[3] = 0; + + __local u32 s_msg_buf[128]; + + const u32 lid2 = lid * 2; + + s_msg_buf[lid2 + 0] = swap_workaround (ikepsk_bufs[salt_pos].msg_buf[lid2 + 0]); + s_msg_buf[lid2 + 1] = swap_workaround (ikepsk_bufs[salt_pos].msg_buf[lid2 + 1]); + + barrier (CLK_LOCAL_MEM_FENCE); + + if (gid >= gid_max) return; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + + w0[0] = pw_buf0[0]; + w0[1] = pw_buf0[1]; + w0[2] = pw_buf0[2]; + w0[3] = pw_buf0[3]; + + u32x w1[4]; + + w1[0] = pw_buf1[0]; + w1[1] = pw_buf1[1]; + w1[2] = pw_buf1[2]; + w1[3] = pw_buf1[3]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 out_len = apply_rules (rules_buf[il_pos].cmds, w0, w1, pw_len); + + /** + * pads + */ + + u32x w0_t[4]; + + w0_t[0] = swap_workaround (w0[0]); + w0_t[1] = swap_workaround (w0[1]); + w0_t[2] = swap_workaround (w0[2]); + w0_t[3] = swap_workaround (w0[3]); + + u32x w1_t[4]; + + w1_t[0] = swap_workaround (w1[0]); + w1_t[1] = swap_workaround (w1[1]); + w1_t[2] = swap_workaround (w1[2]); + w1_t[3] = swap_workaround (w1[3]); + + u32x w2_t[4]; + + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + + u32x w3_t[4]; + + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = 0; + + u32x ipad[5]; + u32x opad[5]; + + hmac_sha1_pad (w0_t, w1_t, w2_t, w3_t, ipad, opad); + + w0_t[0] = salt_buf0[0]; + w0_t[1] = salt_buf0[1]; + w0_t[2] = salt_buf0[2]; + w0_t[3] = salt_buf0[3]; + w1_t[0] = salt_buf1[0]; + w1_t[1] = salt_buf1[1]; + w1_t[2] = salt_buf1[2]; + w1_t[3] = salt_buf1[3]; + w2_t[0] = salt_buf2[0]; + w2_t[1] = salt_buf2[1]; + w2_t[2] = salt_buf2[2]; + w2_t[3] = salt_buf2[3]; + w3_t[0] = salt_buf3[0]; + w3_t[1] = salt_buf3[1]; + w3_t[2] = 0; + w3_t[3] = (64 + nr_len) * 8; + + u32x digest[5]; + + hmac_sha1_run (w0_t, w1_t, w2_t, w3_t, ipad, opad, digest); + + w0_t[0] = digest[0]; + w0_t[1] = digest[1]; + w0_t[2] = digest[2]; + w0_t[3] = digest[3]; + w1_t[0] = digest[4]; + w1_t[1] = 0; + w1_t[2] = 0; + w1_t[3] = 0; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = 0; + + hmac_sha1_pad (w0_t, w1_t, w2_t, w3_t, ipad, opad); + + int left; + int off; + + for (left = ikepsk_bufs[salt_pos].msg_len, off = 0; left >= 56; left -= 64, off += 16) + { + w0_t[0] = s_msg_buf[off + 0]; + w0_t[1] = s_msg_buf[off + 1]; + w0_t[2] = s_msg_buf[off + 2]; + w0_t[3] = s_msg_buf[off + 3]; + w1_t[0] = s_msg_buf[off + 4]; + w1_t[1] = s_msg_buf[off + 5]; + w1_t[2] = s_msg_buf[off + 6]; + w1_t[3] = s_msg_buf[off + 7]; + w2_t[0] = s_msg_buf[off + 8]; + w2_t[1] = s_msg_buf[off + 9]; + w2_t[2] = s_msg_buf[off + 10]; + w2_t[3] = s_msg_buf[off + 11]; + w3_t[0] = s_msg_buf[off + 12]; + w3_t[1] = s_msg_buf[off + 13]; + w3_t[2] = s_msg_buf[off + 14]; + w3_t[3] = s_msg_buf[off + 15]; + + sha1_transform (w0_t, w1_t, w2_t, w3_t, ipad); + } + + w0_t[0] = s_msg_buf[off + 0]; + w0_t[1] = s_msg_buf[off + 1]; + w0_t[2] = s_msg_buf[off + 2]; + w0_t[3] = s_msg_buf[off + 3]; + w1_t[0] = s_msg_buf[off + 4]; + w1_t[1] = s_msg_buf[off + 5]; + w1_t[2] = s_msg_buf[off + 6]; + w1_t[3] = s_msg_buf[off + 7]; + w2_t[0] = s_msg_buf[off + 8]; + w2_t[1] = s_msg_buf[off + 9]; + w2_t[2] = s_msg_buf[off + 10]; + w2_t[3] = s_msg_buf[off + 11]; + w3_t[0] = s_msg_buf[off + 12]; + w3_t[1] = s_msg_buf[off + 13]; + w3_t[2] = 0; + w3_t[3] = (64 + msg_len) * 8; + + hmac_sha1_run (w0_t, w1_t, w2_t, w3_t, ipad, opad, digest); + + const u32x r0 = digest[3]; + const u32x r1 = digest[4]; + const u32x r2 = digest[2]; + const u32x r3 = digest[1]; + + #include VECT_COMPARE_M + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m05400_m08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global ikepsk_t *ikepsk_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m05400_m16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global ikepsk_t *ikepsk_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m05400_s04 (__global pw_t *pws, __global gpu_rule_t * rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global ikepsk_t *ikepsk_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + u32x pw_buf1[4]; + + pw_buf1[0] = pws[gid].i[ 4]; + pw_buf1[1] = pws[gid].i[ 5]; + pw_buf1[2] = pws[gid].i[ 6]; + pw_buf1[3] = pws[gid].i[ 7]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * salt + */ + + const u32 nr_len = ikepsk_bufs[salt_pos].nr_len; + const u32 msg_len = ikepsk_bufs[salt_pos].msg_len; + + u32 salt_buf0[4]; + + salt_buf0[0] = swap_workaround (ikepsk_bufs[salt_pos].nr_buf[ 0]); + salt_buf0[1] = swap_workaround (ikepsk_bufs[salt_pos].nr_buf[ 1]); + salt_buf0[2] = swap_workaround (ikepsk_bufs[salt_pos].nr_buf[ 2]); + salt_buf0[3] = swap_workaround (ikepsk_bufs[salt_pos].nr_buf[ 3]); + + u32 salt_buf1[4]; + + salt_buf1[0] = swap_workaround (ikepsk_bufs[salt_pos].nr_buf[ 4]); + salt_buf1[1] = swap_workaround (ikepsk_bufs[salt_pos].nr_buf[ 5]); + salt_buf1[2] = swap_workaround (ikepsk_bufs[salt_pos].nr_buf[ 6]); + salt_buf1[3] = swap_workaround (ikepsk_bufs[salt_pos].nr_buf[ 7]); + + u32 salt_buf2[4]; + + salt_buf2[0] = swap_workaround (ikepsk_bufs[salt_pos].nr_buf[ 8]); + salt_buf2[1] = swap_workaround (ikepsk_bufs[salt_pos].nr_buf[ 9]); + salt_buf2[2] = swap_workaround (ikepsk_bufs[salt_pos].nr_buf[10]); + salt_buf2[3] = swap_workaround (ikepsk_bufs[salt_pos].nr_buf[11]); + + u32 salt_buf3[4]; + + salt_buf3[0] = swap_workaround (ikepsk_bufs[salt_pos].nr_buf[12]); + salt_buf3[1] = swap_workaround (ikepsk_bufs[salt_pos].nr_buf[13]); + salt_buf3[2] = 0; + salt_buf3[3] = 0; + + __local u32 s_msg_buf[128]; + + const u32 lid2 = lid * 2; + + s_msg_buf[lid2 + 0] = swap_workaround (ikepsk_bufs[salt_pos].msg_buf[lid2 + 0]); + s_msg_buf[lid2 + 1] = swap_workaround (ikepsk_bufs[salt_pos].msg_buf[lid2 + 1]); + + barrier (CLK_LOCAL_MEM_FENCE); + + if (gid >= gid_max) return; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + + w0[0] = pw_buf0[0]; + w0[1] = pw_buf0[1]; + w0[2] = pw_buf0[2]; + w0[3] = pw_buf0[3]; + + u32x w1[4]; + + w1[0] = pw_buf1[0]; + w1[1] = pw_buf1[1]; + w1[2] = pw_buf1[2]; + w1[3] = pw_buf1[3]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 out_len = apply_rules (rules_buf[il_pos].cmds, w0, w1, pw_len); + + /** + * pads + */ + + u32x w0_t[4]; + + w0_t[0] = swap_workaround (w0[0]); + w0_t[1] = swap_workaround (w0[1]); + w0_t[2] = swap_workaround (w0[2]); + w0_t[3] = swap_workaround (w0[3]); + + u32x w1_t[4]; + + w1_t[0] = swap_workaround (w1[0]); + w1_t[1] = swap_workaround (w1[1]); + w1_t[2] = swap_workaround (w1[2]); + w1_t[3] = swap_workaround (w1[3]); + + u32x w2_t[4]; + + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + + u32x w3_t[4]; + + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = 0; + + u32x ipad[5]; + u32x opad[5]; + + hmac_sha1_pad (w0_t, w1_t, w2_t, w3_t, ipad, opad); + + w0_t[0] = salt_buf0[0]; + w0_t[1] = salt_buf0[1]; + w0_t[2] = salt_buf0[2]; + w0_t[3] = salt_buf0[3]; + w1_t[0] = salt_buf1[0]; + w1_t[1] = salt_buf1[1]; + w1_t[2] = salt_buf1[2]; + w1_t[3] = salt_buf1[3]; + w2_t[0] = salt_buf2[0]; + w2_t[1] = salt_buf2[1]; + w2_t[2] = salt_buf2[2]; + w2_t[3] = salt_buf2[3]; + w3_t[0] = salt_buf3[0]; + w3_t[1] = salt_buf3[1]; + w3_t[2] = 0; + w3_t[3] = (64 + nr_len) * 8; + + u32x digest[5]; + + hmac_sha1_run (w0_t, w1_t, w2_t, w3_t, ipad, opad, digest); + + w0_t[0] = digest[0]; + w0_t[1] = digest[1]; + w0_t[2] = digest[2]; + w0_t[3] = digest[3]; + w1_t[0] = digest[4]; + w1_t[1] = 0; + w1_t[2] = 0; + w1_t[3] = 0; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = 0; + + hmac_sha1_pad (w0_t, w1_t, w2_t, w3_t, ipad, opad); + + int left; + int off; + + for (left = ikepsk_bufs[salt_pos].msg_len, off = 0; left >= 56; left -= 64, off += 16) + { + w0_t[0] = s_msg_buf[off + 0]; + w0_t[1] = s_msg_buf[off + 1]; + w0_t[2] = s_msg_buf[off + 2]; + w0_t[3] = s_msg_buf[off + 3]; + w1_t[0] = s_msg_buf[off + 4]; + w1_t[1] = s_msg_buf[off + 5]; + w1_t[2] = s_msg_buf[off + 6]; + w1_t[3] = s_msg_buf[off + 7]; + w2_t[0] = s_msg_buf[off + 8]; + w2_t[1] = s_msg_buf[off + 9]; + w2_t[2] = s_msg_buf[off + 10]; + w2_t[3] = s_msg_buf[off + 11]; + w3_t[0] = s_msg_buf[off + 12]; + w3_t[1] = s_msg_buf[off + 13]; + w3_t[2] = s_msg_buf[off + 14]; + w3_t[3] = s_msg_buf[off + 15]; + + sha1_transform (w0_t, w1_t, w2_t, w3_t, ipad); + } + + w0_t[0] = s_msg_buf[off + 0]; + w0_t[1] = s_msg_buf[off + 1]; + w0_t[2] = s_msg_buf[off + 2]; + w0_t[3] = s_msg_buf[off + 3]; + w1_t[0] = s_msg_buf[off + 4]; + w1_t[1] = s_msg_buf[off + 5]; + w1_t[2] = s_msg_buf[off + 6]; + w1_t[3] = s_msg_buf[off + 7]; + w2_t[0] = s_msg_buf[off + 8]; + w2_t[1] = s_msg_buf[off + 9]; + w2_t[2] = s_msg_buf[off + 10]; + w2_t[3] = s_msg_buf[off + 11]; + w3_t[0] = s_msg_buf[off + 12]; + w3_t[1] = s_msg_buf[off + 13]; + w3_t[2] = 0; + w3_t[3] = (64 + msg_len) * 8; + + hmac_sha1_run (w0_t, w1_t, w2_t, w3_t, ipad, opad, digest); + + const u32x r0 = digest[3]; + const u32x r1 = digest[4]; + const u32x r2 = digest[2]; + const u32x r3 = digest[1]; + + #include VECT_COMPARE_S + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m05400_s08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global ikepsk_t *ikepsk_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m05400_s16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global ikepsk_t *ikepsk_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/amd/m05400_a1.cl b/amd/m05400_a1.cl new file mode 100644 index 0000000000..a45c82bb0c --- /dev/null +++ b/amd/m05400_a1.cl @@ -0,0 +1,882 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _SHA1_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW4 +#define VECT_SIZE4 +#endif + +#ifdef VLIW5 +#define VECT_SIZE2 +#endif + +#define DGST_R0 3 +#define DGST_R1 4 +#define DGST_R2 2 +#define DGST_R3 1 + +#include "include/kernel_functions.c" +#include "types_amd.c" +#include "common_amd.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +static void sha1_transform (const u32x w0[4], const u32x w1[4], const u32x w2[4], const u32x w3[4], u32x digest[5]) +{ + u32x A = digest[0]; + u32x B = digest[1]; + u32x C = digest[2]; + u32x D = digest[3]; + u32x E = digest[4]; + + u32x w0_t = w0[0]; + u32x w1_t = w0[1]; + u32x w2_t = w0[2]; + u32x w3_t = w0[3]; + u32x w4_t = w1[0]; + u32x w5_t = w1[1]; + u32x w6_t = w1[2]; + u32x w7_t = w1[3]; + u32x w8_t = w2[0]; + u32x w9_t = w2[1]; + u32x wa_t = w2[2]; + u32x wb_t = w2[3]; + u32x wc_t = w3[0]; + u32x wd_t = w3[1]; + u32x we_t = w3[2]; + u32x wf_t = w3[3]; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, A, B, C, D, E, w0_t); + SHA1_STEP (SHA1_F0o, E, A, B, C, D, w1_t); + SHA1_STEP (SHA1_F0o, D, E, A, B, C, w2_t); + SHA1_STEP (SHA1_F0o, C, D, E, A, B, w3_t); + SHA1_STEP (SHA1_F0o, B, C, D, E, A, w4_t); + SHA1_STEP (SHA1_F0o, A, B, C, D, E, w5_t); + SHA1_STEP (SHA1_F0o, E, A, B, C, D, w6_t); + SHA1_STEP (SHA1_F0o, D, E, A, B, C, w7_t); + SHA1_STEP (SHA1_F0o, C, D, E, A, B, w8_t); + SHA1_STEP (SHA1_F0o, B, C, D, E, A, w9_t); + SHA1_STEP (SHA1_F0o, A, B, C, D, E, wa_t); + SHA1_STEP (SHA1_F0o, E, A, B, C, D, wb_t); + SHA1_STEP (SHA1_F0o, D, E, A, B, C, wc_t); + SHA1_STEP (SHA1_F0o, C, D, E, A, B, wd_t); + SHA1_STEP (SHA1_F0o, B, C, D, E, A, we_t); + SHA1_STEP (SHA1_F0o, A, B, C, D, E, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F0o, E, A, B, C, D, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F0o, D, E, A, B, C, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F0o, C, D, E, A, B, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F0o, B, C, D, E, A, w3_t); + + #undef K + #define K SHA1C01 + + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w7_t); + + #undef K + #define K SHA1C02 + + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, wb_t); + + #undef K + #define K SHA1C03 + + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, wf_t); + + digest[0] += A; + digest[1] += B; + digest[2] += C; + digest[3] += D; + digest[4] += E; +} + +static void hmac_sha1_pad (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], u32x ipad[5], u32x opad[5]) +{ + w0[0] = w0[0] ^ 0x36363636; + w0[1] = w0[1] ^ 0x36363636; + w0[2] = w0[2] ^ 0x36363636; + w0[3] = w0[3] ^ 0x36363636; + w1[0] = w1[0] ^ 0x36363636; + w1[1] = w1[1] ^ 0x36363636; + w1[2] = w1[2] ^ 0x36363636; + w1[3] = w1[3] ^ 0x36363636; + w2[0] = w2[0] ^ 0x36363636; + w2[1] = w2[1] ^ 0x36363636; + w2[2] = w2[2] ^ 0x36363636; + w2[3] = w2[3] ^ 0x36363636; + w3[0] = w3[0] ^ 0x36363636; + w3[1] = w3[1] ^ 0x36363636; + w3[2] = w3[2] ^ 0x36363636; + w3[3] = w3[3] ^ 0x36363636; + + ipad[0] = SHA1M_A; + ipad[1] = SHA1M_B; + ipad[2] = SHA1M_C; + ipad[3] = SHA1M_D; + ipad[4] = SHA1M_E; + + sha1_transform (w0, w1, w2, w3, ipad); + + w0[0] = w0[0] ^ 0x6a6a6a6a; + w0[1] = w0[1] ^ 0x6a6a6a6a; + w0[2] = w0[2] ^ 0x6a6a6a6a; + w0[3] = w0[3] ^ 0x6a6a6a6a; + w1[0] = w1[0] ^ 0x6a6a6a6a; + w1[1] = w1[1] ^ 0x6a6a6a6a; + w1[2] = w1[2] ^ 0x6a6a6a6a; + w1[3] = w1[3] ^ 0x6a6a6a6a; + w2[0] = w2[0] ^ 0x6a6a6a6a; + w2[1] = w2[1] ^ 0x6a6a6a6a; + w2[2] = w2[2] ^ 0x6a6a6a6a; + w2[3] = w2[3] ^ 0x6a6a6a6a; + w3[0] = w3[0] ^ 0x6a6a6a6a; + w3[1] = w3[1] ^ 0x6a6a6a6a; + w3[2] = w3[2] ^ 0x6a6a6a6a; + w3[3] = w3[3] ^ 0x6a6a6a6a; + + opad[0] = SHA1M_A; + opad[1] = SHA1M_B; + opad[2] = SHA1M_C; + opad[3] = SHA1M_D; + opad[4] = SHA1M_E; + + sha1_transform (w0, w1, w2, w3, opad); +} + +static void hmac_sha1_run (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], u32x ipad[5], u32x opad[5], u32x digest[5]) +{ + digest[0] = ipad[0]; + digest[1] = ipad[1]; + digest[2] = ipad[2]; + digest[3] = ipad[3]; + digest[4] = ipad[4]; + + sha1_transform (w0, w1, w2, w3, digest); + + w0[0] = digest[0]; + w0[1] = digest[1]; + w0[2] = digest[2]; + w0[3] = digest[3]; + w1[0] = digest[4]; + w1[1] = 0x80000000; + w1[2] = 0; + w1[3] = 0; + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = (64 + 20) * 8; + + digest[0] = opad[0]; + digest[1] = opad[1]; + digest[2] = opad[2]; + digest[3] = opad[3]; + digest[4] = opad[4]; + + sha1_transform (w0, w1, w2, w3, digest); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m05400_m04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global ikepsk_t *ikepsk_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, combs_buf[0].pw_len); + } + + /** + * salt + */ + + const u32 nr_len = ikepsk_bufs[salt_pos].nr_len; + const u32 msg_len = ikepsk_bufs[salt_pos].msg_len; + + u32 salt_buf0[4]; + + salt_buf0[0] = swap_workaround (ikepsk_bufs[salt_pos].nr_buf[ 0]); + salt_buf0[1] = swap_workaround (ikepsk_bufs[salt_pos].nr_buf[ 1]); + salt_buf0[2] = swap_workaround (ikepsk_bufs[salt_pos].nr_buf[ 2]); + salt_buf0[3] = swap_workaround (ikepsk_bufs[salt_pos].nr_buf[ 3]); + + u32 salt_buf1[4]; + + salt_buf1[0] = swap_workaround (ikepsk_bufs[salt_pos].nr_buf[ 4]); + salt_buf1[1] = swap_workaround (ikepsk_bufs[salt_pos].nr_buf[ 5]); + salt_buf1[2] = swap_workaround (ikepsk_bufs[salt_pos].nr_buf[ 6]); + salt_buf1[3] = swap_workaround (ikepsk_bufs[salt_pos].nr_buf[ 7]); + + u32 salt_buf2[4]; + + salt_buf2[0] = swap_workaround (ikepsk_bufs[salt_pos].nr_buf[ 8]); + salt_buf2[1] = swap_workaround (ikepsk_bufs[salt_pos].nr_buf[ 9]); + salt_buf2[2] = swap_workaround (ikepsk_bufs[salt_pos].nr_buf[10]); + salt_buf2[3] = swap_workaround (ikepsk_bufs[salt_pos].nr_buf[11]); + + u32 salt_buf3[4]; + + salt_buf3[0] = swap_workaround (ikepsk_bufs[salt_pos].nr_buf[12]); + salt_buf3[1] = swap_workaround (ikepsk_bufs[salt_pos].nr_buf[13]); + salt_buf3[2] = 0; + salt_buf3[3] = 0; + + __local u32 s_msg_buf[128]; + + const u32 lid2 = lid * 2; + + s_msg_buf[lid2 + 0] = swap_workaround (ikepsk_bufs[salt_pos].msg_buf[lid2 + 0]); + s_msg_buf[lid2 + 1] = swap_workaround (ikepsk_bufs[salt_pos].msg_buf[lid2 + 1]); + + barrier (CLK_LOCAL_MEM_FENCE); + + if (gid >= gid_max) return; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = combs_buf[il_pos].pw_len; + + const u32 pw_len = pw_l_len + pw_r_len; + + u32 wordr0[4]; + + wordr0[0] = combs_buf[il_pos].i[0]; + wordr0[1] = combs_buf[il_pos].i[1]; + wordr0[2] = combs_buf[il_pos].i[2]; + wordr0[3] = combs_buf[il_pos].i[3]; + + u32 wordr1[4]; + + wordr1[0] = combs_buf[il_pos].i[4]; + wordr1[1] = combs_buf[il_pos].i[5]; + wordr1[2] = combs_buf[il_pos].i[6]; + wordr1[3] = combs_buf[il_pos].i[7]; + + u32 wordr2[4]; + + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + + u32 wordr3[4]; + + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + u32x w0[4]; + + w0[0] = wordl0[0] | wordr0[0]; + w0[1] = wordl0[1] | wordr0[1]; + w0[2] = wordl0[2] | wordr0[2]; + w0[3] = wordl0[3] | wordr0[3]; + + u32x w1[4]; + + w1[0] = wordl1[0] | wordr1[0]; + w1[1] = wordl1[1] | wordr1[1]; + w1[2] = wordl1[2] | wordr1[2]; + w1[3] = wordl1[3] | wordr1[3]; + + u32x w2[4]; + + w2[0] = wordl2[0] | wordr2[0]; + w2[1] = wordl2[1] | wordr2[1]; + w2[2] = wordl2[2] | wordr2[2]; + w2[3] = wordl2[3] | wordr2[3]; + + u32x w3[4]; + + w3[0] = wordl3[0] | wordr3[0]; + w3[1] = wordl3[1] | wordr3[1]; + w3[2] = wordl3[2] | wordr3[2]; + w3[3] = wordl3[3] | wordr3[3]; + + /** + * pads + */ + + u32x w0_t[4]; + + w0_t[0] = swap_workaround (w0[0]); + w0_t[1] = swap_workaround (w0[1]); + w0_t[2] = swap_workaround (w0[2]); + w0_t[3] = swap_workaround (w0[3]); + + u32x w1_t[4]; + + w1_t[0] = swap_workaround (w1[0]); + w1_t[1] = swap_workaround (w1[1]); + w1_t[2] = swap_workaround (w1[2]); + w1_t[3] = swap_workaround (w1[3]); + + u32x w2_t[4]; + + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + + u32x w3_t[4]; + + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = 0; + + u32x ipad[5]; + u32x opad[5]; + + hmac_sha1_pad (w0_t, w1_t, w2_t, w3_t, ipad, opad); + + w0_t[0] = salt_buf0[0]; + w0_t[1] = salt_buf0[1]; + w0_t[2] = salt_buf0[2]; + w0_t[3] = salt_buf0[3]; + w1_t[0] = salt_buf1[0]; + w1_t[1] = salt_buf1[1]; + w1_t[2] = salt_buf1[2]; + w1_t[3] = salt_buf1[3]; + w2_t[0] = salt_buf2[0]; + w2_t[1] = salt_buf2[1]; + w2_t[2] = salt_buf2[2]; + w2_t[3] = salt_buf2[3]; + w3_t[0] = salt_buf3[0]; + w3_t[1] = salt_buf3[1]; + w3_t[2] = 0; + w3_t[3] = (64 + nr_len) * 8; + + u32x digest[5]; + + hmac_sha1_run (w0_t, w1_t, w2_t, w3_t, ipad, opad, digest); + + w0_t[0] = digest[0]; + w0_t[1] = digest[1]; + w0_t[2] = digest[2]; + w0_t[3] = digest[3]; + w1_t[0] = digest[4]; + w1_t[1] = 0; + w1_t[2] = 0; + w1_t[3] = 0; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = 0; + + hmac_sha1_pad (w0_t, w1_t, w2_t, w3_t, ipad, opad); + + int left; + int off; + + for (left = ikepsk_bufs[salt_pos].msg_len, off = 0; left >= 56; left -= 64, off += 16) + { + w0_t[0] = s_msg_buf[off + 0]; + w0_t[1] = s_msg_buf[off + 1]; + w0_t[2] = s_msg_buf[off + 2]; + w0_t[3] = s_msg_buf[off + 3]; + w1_t[0] = s_msg_buf[off + 4]; + w1_t[1] = s_msg_buf[off + 5]; + w1_t[2] = s_msg_buf[off + 6]; + w1_t[3] = s_msg_buf[off + 7]; + w2_t[0] = s_msg_buf[off + 8]; + w2_t[1] = s_msg_buf[off + 9]; + w2_t[2] = s_msg_buf[off + 10]; + w2_t[3] = s_msg_buf[off + 11]; + w3_t[0] = s_msg_buf[off + 12]; + w3_t[1] = s_msg_buf[off + 13]; + w3_t[2] = s_msg_buf[off + 14]; + w3_t[3] = s_msg_buf[off + 15]; + + sha1_transform (w0_t, w1_t, w2_t, w3_t, ipad); + } + + w0_t[0] = s_msg_buf[off + 0]; + w0_t[1] = s_msg_buf[off + 1]; + w0_t[2] = s_msg_buf[off + 2]; + w0_t[3] = s_msg_buf[off + 3]; + w1_t[0] = s_msg_buf[off + 4]; + w1_t[1] = s_msg_buf[off + 5]; + w1_t[2] = s_msg_buf[off + 6]; + w1_t[3] = s_msg_buf[off + 7]; + w2_t[0] = s_msg_buf[off + 8]; + w2_t[1] = s_msg_buf[off + 9]; + w2_t[2] = s_msg_buf[off + 10]; + w2_t[3] = s_msg_buf[off + 11]; + w3_t[0] = s_msg_buf[off + 12]; + w3_t[1] = s_msg_buf[off + 13]; + w3_t[2] = 0; + w3_t[3] = (64 + msg_len) * 8; + + hmac_sha1_run (w0_t, w1_t, w2_t, w3_t, ipad, opad, digest); + + const u32x r0 = digest[3]; + const u32x r1 = digest[4]; + const u32x r2 = digest[2]; + const u32x r3 = digest[1]; + + #include VECT_COMPARE_M + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m05400_m08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global ikepsk_t *ikepsk_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m05400_m16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global ikepsk_t *ikepsk_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m05400_s04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global ikepsk_t *ikepsk_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, combs_buf[0].pw_len); + } + + /** + * salt + */ + + const u32 nr_len = ikepsk_bufs[salt_pos].nr_len; + const u32 msg_len = ikepsk_bufs[salt_pos].msg_len; + + u32 salt_buf0[4]; + + salt_buf0[0] = swap_workaround (ikepsk_bufs[salt_pos].nr_buf[ 0]); + salt_buf0[1] = swap_workaround (ikepsk_bufs[salt_pos].nr_buf[ 1]); + salt_buf0[2] = swap_workaround (ikepsk_bufs[salt_pos].nr_buf[ 2]); + salt_buf0[3] = swap_workaround (ikepsk_bufs[salt_pos].nr_buf[ 3]); + + u32 salt_buf1[4]; + + salt_buf1[0] = swap_workaround (ikepsk_bufs[salt_pos].nr_buf[ 4]); + salt_buf1[1] = swap_workaround (ikepsk_bufs[salt_pos].nr_buf[ 5]); + salt_buf1[2] = swap_workaround (ikepsk_bufs[salt_pos].nr_buf[ 6]); + salt_buf1[3] = swap_workaround (ikepsk_bufs[salt_pos].nr_buf[ 7]); + + u32 salt_buf2[4]; + + salt_buf2[0] = swap_workaround (ikepsk_bufs[salt_pos].nr_buf[ 8]); + salt_buf2[1] = swap_workaround (ikepsk_bufs[salt_pos].nr_buf[ 9]); + salt_buf2[2] = swap_workaround (ikepsk_bufs[salt_pos].nr_buf[10]); + salt_buf2[3] = swap_workaround (ikepsk_bufs[salt_pos].nr_buf[11]); + + u32 salt_buf3[4]; + + salt_buf3[0] = swap_workaround (ikepsk_bufs[salt_pos].nr_buf[12]); + salt_buf3[1] = swap_workaround (ikepsk_bufs[salt_pos].nr_buf[13]); + salt_buf3[2] = 0; + salt_buf3[3] = 0; + + __local u32 s_msg_buf[128]; + + const u32 lid2 = lid * 2; + + s_msg_buf[lid2 + 0] = swap_workaround (ikepsk_bufs[salt_pos].msg_buf[lid2 + 0]); + s_msg_buf[lid2 + 1] = swap_workaround (ikepsk_bufs[salt_pos].msg_buf[lid2 + 1]); + + barrier (CLK_LOCAL_MEM_FENCE); + + if (gid >= gid_max) return; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = combs_buf[il_pos].pw_len; + + const u32 pw_len = pw_l_len + pw_r_len; + + u32 wordr0[4]; + + wordr0[0] = combs_buf[il_pos].i[0]; + wordr0[1] = combs_buf[il_pos].i[1]; + wordr0[2] = combs_buf[il_pos].i[2]; + wordr0[3] = combs_buf[il_pos].i[3]; + + u32 wordr1[4]; + + wordr1[0] = combs_buf[il_pos].i[4]; + wordr1[1] = combs_buf[il_pos].i[5]; + wordr1[2] = combs_buf[il_pos].i[6]; + wordr1[3] = combs_buf[il_pos].i[7]; + + u32 wordr2[4]; + + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + + u32 wordr3[4]; + + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + u32x w0[4]; + + w0[0] = wordl0[0] | wordr0[0]; + w0[1] = wordl0[1] | wordr0[1]; + w0[2] = wordl0[2] | wordr0[2]; + w0[3] = wordl0[3] | wordr0[3]; + + u32x w1[4]; + + w1[0] = wordl1[0] | wordr1[0]; + w1[1] = wordl1[1] | wordr1[1]; + w1[2] = wordl1[2] | wordr1[2]; + w1[3] = wordl1[3] | wordr1[3]; + + u32x w2[4]; + + w2[0] = wordl2[0] | wordr2[0]; + w2[1] = wordl2[1] | wordr2[1]; + w2[2] = wordl2[2] | wordr2[2]; + w2[3] = wordl2[3] | wordr2[3]; + + u32x w3[4]; + + w3[0] = wordl3[0] | wordr3[0]; + w3[1] = wordl3[1] | wordr3[1]; + w3[2] = wordl3[2] | wordr3[2]; + w3[3] = wordl3[3] | wordr3[3]; + + /** + * pads + */ + + u32x w0_t[4]; + + w0_t[0] = swap_workaround (w0[0]); + w0_t[1] = swap_workaround (w0[1]); + w0_t[2] = swap_workaround (w0[2]); + w0_t[3] = swap_workaround (w0[3]); + + u32x w1_t[4]; + + w1_t[0] = swap_workaround (w1[0]); + w1_t[1] = swap_workaround (w1[1]); + w1_t[2] = swap_workaround (w1[2]); + w1_t[3] = swap_workaround (w1[3]); + + u32x w2_t[4]; + + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + + u32x w3_t[4]; + + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = 0; + + u32x ipad[5]; + u32x opad[5]; + + hmac_sha1_pad (w0_t, w1_t, w2_t, w3_t, ipad, opad); + + w0_t[0] = salt_buf0[0]; + w0_t[1] = salt_buf0[1]; + w0_t[2] = salt_buf0[2]; + w0_t[3] = salt_buf0[3]; + w1_t[0] = salt_buf1[0]; + w1_t[1] = salt_buf1[1]; + w1_t[2] = salt_buf1[2]; + w1_t[3] = salt_buf1[3]; + w2_t[0] = salt_buf2[0]; + w2_t[1] = salt_buf2[1]; + w2_t[2] = salt_buf2[2]; + w2_t[3] = salt_buf2[3]; + w3_t[0] = salt_buf3[0]; + w3_t[1] = salt_buf3[1]; + w3_t[2] = 0; + w3_t[3] = (64 + nr_len) * 8; + + u32x digest[5]; + + hmac_sha1_run (w0_t, w1_t, w2_t, w3_t, ipad, opad, digest); + + w0_t[0] = digest[0]; + w0_t[1] = digest[1]; + w0_t[2] = digest[2]; + w0_t[3] = digest[3]; + w1_t[0] = digest[4]; + w1_t[1] = 0; + w1_t[2] = 0; + w1_t[3] = 0; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = 0; + + hmac_sha1_pad (w0_t, w1_t, w2_t, w3_t, ipad, opad); + + int left; + int off; + + for (left = ikepsk_bufs[salt_pos].msg_len, off = 0; left >= 56; left -= 64, off += 16) + { + w0_t[0] = s_msg_buf[off + 0]; + w0_t[1] = s_msg_buf[off + 1]; + w0_t[2] = s_msg_buf[off + 2]; + w0_t[3] = s_msg_buf[off + 3]; + w1_t[0] = s_msg_buf[off + 4]; + w1_t[1] = s_msg_buf[off + 5]; + w1_t[2] = s_msg_buf[off + 6]; + w1_t[3] = s_msg_buf[off + 7]; + w2_t[0] = s_msg_buf[off + 8]; + w2_t[1] = s_msg_buf[off + 9]; + w2_t[2] = s_msg_buf[off + 10]; + w2_t[3] = s_msg_buf[off + 11]; + w3_t[0] = s_msg_buf[off + 12]; + w3_t[1] = s_msg_buf[off + 13]; + w3_t[2] = s_msg_buf[off + 14]; + w3_t[3] = s_msg_buf[off + 15]; + + sha1_transform (w0_t, w1_t, w2_t, w3_t, ipad); + } + + w0_t[0] = s_msg_buf[off + 0]; + w0_t[1] = s_msg_buf[off + 1]; + w0_t[2] = s_msg_buf[off + 2]; + w0_t[3] = s_msg_buf[off + 3]; + w1_t[0] = s_msg_buf[off + 4]; + w1_t[1] = s_msg_buf[off + 5]; + w1_t[2] = s_msg_buf[off + 6]; + w1_t[3] = s_msg_buf[off + 7]; + w2_t[0] = s_msg_buf[off + 8]; + w2_t[1] = s_msg_buf[off + 9]; + w2_t[2] = s_msg_buf[off + 10]; + w2_t[3] = s_msg_buf[off + 11]; + w3_t[0] = s_msg_buf[off + 12]; + w3_t[1] = s_msg_buf[off + 13]; + w3_t[2] = 0; + w3_t[3] = (64 + msg_len) * 8; + + hmac_sha1_run (w0_t, w1_t, w2_t, w3_t, ipad, opad, digest); + + const u32x r0 = digest[3]; + const u32x r1 = digest[4]; + const u32x r2 = digest[2]; + const u32x r3 = digest[1]; + + #include VECT_COMPARE_S + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m05400_s08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global ikepsk_t *ikepsk_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m05400_s16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global ikepsk_t *ikepsk_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/amd/m05400_a3.cl b/amd/m05400_a3.cl new file mode 100644 index 0000000000..b56d71193e --- /dev/null +++ b/amd/m05400_a3.cl @@ -0,0 +1,1042 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _SHA1_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW4 +#define VECT_SIZE4 +#endif + +#ifdef VLIW5 +#define VECT_SIZE2 +#endif + +#define DGST_R0 3 +#define DGST_R1 4 +#define DGST_R2 2 +#define DGST_R3 1 + +#include "include/kernel_functions.c" +#include "types_amd.c" +#include "common_amd.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +static void sha1_transform (const u32x w0[4], const u32x w1[4], const u32x w2[4], const u32x w3[4], u32x digest[5]) +{ + u32x A = digest[0]; + u32x B = digest[1]; + u32x C = digest[2]; + u32x D = digest[3]; + u32x E = digest[4]; + + u32x w0_t = w0[0]; + u32x w1_t = w0[1]; + u32x w2_t = w0[2]; + u32x w3_t = w0[3]; + u32x w4_t = w1[0]; + u32x w5_t = w1[1]; + u32x w6_t = w1[2]; + u32x w7_t = w1[3]; + u32x w8_t = w2[0]; + u32x w9_t = w2[1]; + u32x wa_t = w2[2]; + u32x wb_t = w2[3]; + u32x wc_t = w3[0]; + u32x wd_t = w3[1]; + u32x we_t = w3[2]; + u32x wf_t = w3[3]; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, A, B, C, D, E, w0_t); + SHA1_STEP (SHA1_F0o, E, A, B, C, D, w1_t); + SHA1_STEP (SHA1_F0o, D, E, A, B, C, w2_t); + SHA1_STEP (SHA1_F0o, C, D, E, A, B, w3_t); + SHA1_STEP (SHA1_F0o, B, C, D, E, A, w4_t); + SHA1_STEP (SHA1_F0o, A, B, C, D, E, w5_t); + SHA1_STEP (SHA1_F0o, E, A, B, C, D, w6_t); + SHA1_STEP (SHA1_F0o, D, E, A, B, C, w7_t); + SHA1_STEP (SHA1_F0o, C, D, E, A, B, w8_t); + SHA1_STEP (SHA1_F0o, B, C, D, E, A, w9_t); + SHA1_STEP (SHA1_F0o, A, B, C, D, E, wa_t); + SHA1_STEP (SHA1_F0o, E, A, B, C, D, wb_t); + SHA1_STEP (SHA1_F0o, D, E, A, B, C, wc_t); + SHA1_STEP (SHA1_F0o, C, D, E, A, B, wd_t); + SHA1_STEP (SHA1_F0o, B, C, D, E, A, we_t); + SHA1_STEP (SHA1_F0o, A, B, C, D, E, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F0o, E, A, B, C, D, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F0o, D, E, A, B, C, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F0o, C, D, E, A, B, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F0o, B, C, D, E, A, w3_t); + + #undef K + #define K SHA1C01 + + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w7_t); + + #undef K + #define K SHA1C02 + + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, wb_t); + + #undef K + #define K SHA1C03 + + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, wf_t); + + digest[0] += A; + digest[1] += B; + digest[2] += C; + digest[3] += D; + digest[4] += E; +} + +static void hmac_sha1_pad (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], u32x ipad[5], u32x opad[5]) +{ + w0[0] = w0[0] ^ 0x36363636; + w0[1] = w0[1] ^ 0x36363636; + w0[2] = w0[2] ^ 0x36363636; + w0[3] = w0[3] ^ 0x36363636; + w1[0] = w1[0] ^ 0x36363636; + w1[1] = w1[1] ^ 0x36363636; + w1[2] = w1[2] ^ 0x36363636; + w1[3] = w1[3] ^ 0x36363636; + w2[0] = w2[0] ^ 0x36363636; + w2[1] = w2[1] ^ 0x36363636; + w2[2] = w2[2] ^ 0x36363636; + w2[3] = w2[3] ^ 0x36363636; + w3[0] = w3[0] ^ 0x36363636; + w3[1] = w3[1] ^ 0x36363636; + w3[2] = w3[2] ^ 0x36363636; + w3[3] = w3[3] ^ 0x36363636; + + ipad[0] = SHA1M_A; + ipad[1] = SHA1M_B; + ipad[2] = SHA1M_C; + ipad[3] = SHA1M_D; + ipad[4] = SHA1M_E; + + sha1_transform (w0, w1, w2, w3, ipad); + + w0[0] = w0[0] ^ 0x6a6a6a6a; + w0[1] = w0[1] ^ 0x6a6a6a6a; + w0[2] = w0[2] ^ 0x6a6a6a6a; + w0[3] = w0[3] ^ 0x6a6a6a6a; + w1[0] = w1[0] ^ 0x6a6a6a6a; + w1[1] = w1[1] ^ 0x6a6a6a6a; + w1[2] = w1[2] ^ 0x6a6a6a6a; + w1[3] = w1[3] ^ 0x6a6a6a6a; + w2[0] = w2[0] ^ 0x6a6a6a6a; + w2[1] = w2[1] ^ 0x6a6a6a6a; + w2[2] = w2[2] ^ 0x6a6a6a6a; + w2[3] = w2[3] ^ 0x6a6a6a6a; + w3[0] = w3[0] ^ 0x6a6a6a6a; + w3[1] = w3[1] ^ 0x6a6a6a6a; + w3[2] = w3[2] ^ 0x6a6a6a6a; + w3[3] = w3[3] ^ 0x6a6a6a6a; + + opad[0] = SHA1M_A; + opad[1] = SHA1M_B; + opad[2] = SHA1M_C; + opad[3] = SHA1M_D; + opad[4] = SHA1M_E; + + sha1_transform (w0, w1, w2, w3, opad); +} + +static void hmac_sha1_run (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], u32x ipad[5], u32x opad[5], u32x digest[5]) +{ + digest[0] = ipad[0]; + digest[1] = ipad[1]; + digest[2] = ipad[2]; + digest[3] = ipad[3]; + digest[4] = ipad[4]; + + sha1_transform (w0, w1, w2, w3, digest); + + w0[0] = digest[0]; + w0[1] = digest[1]; + w0[2] = digest[2]; + w0[3] = digest[3]; + w1[0] = digest[4]; + w1[1] = 0x80000000; + w1[2] = 0; + w1[3] = 0; + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = (64 + 20) * 8; + + digest[0] = opad[0]; + digest[1] = opad[1]; + digest[2] = opad[2]; + digest[3] = opad[3]; + digest[4] = opad[4]; + + sha1_transform (w0, w1, w2, w3, digest); +} + +static void m05400m (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], const u32 pw_len, __global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global ikepsk_t *ikepsk_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, __local u32 s_msg_buf[128]) +{ + /** + * modifier + */ + + const u32 gid = get_global_id (0); + const u32 lid = get_local_id (0); + + /** + * salt + */ + + const u32 nr_len = ikepsk_bufs[salt_pos].nr_len; + const u32 msg_len = ikepsk_bufs[salt_pos].msg_len; + + u32 salt_buf0[4]; + + salt_buf0[0] = swap_workaround (ikepsk_bufs[salt_pos].nr_buf[ 0]); + salt_buf0[1] = swap_workaround (ikepsk_bufs[salt_pos].nr_buf[ 1]); + salt_buf0[2] = swap_workaround (ikepsk_bufs[salt_pos].nr_buf[ 2]); + salt_buf0[3] = swap_workaround (ikepsk_bufs[salt_pos].nr_buf[ 3]); + + u32 salt_buf1[4]; + + salt_buf1[0] = swap_workaround (ikepsk_bufs[salt_pos].nr_buf[ 4]); + salt_buf1[1] = swap_workaround (ikepsk_bufs[salt_pos].nr_buf[ 5]); + salt_buf1[2] = swap_workaround (ikepsk_bufs[salt_pos].nr_buf[ 6]); + salt_buf1[3] = swap_workaround (ikepsk_bufs[salt_pos].nr_buf[ 7]); + + u32 salt_buf2[4]; + + salt_buf2[0] = swap_workaround (ikepsk_bufs[salt_pos].nr_buf[ 8]); + salt_buf2[1] = swap_workaround (ikepsk_bufs[salt_pos].nr_buf[ 9]); + salt_buf2[2] = swap_workaround (ikepsk_bufs[salt_pos].nr_buf[10]); + salt_buf2[3] = swap_workaround (ikepsk_bufs[salt_pos].nr_buf[11]); + + u32 salt_buf3[4]; + + salt_buf3[0] = swap_workaround (ikepsk_bufs[salt_pos].nr_buf[12]); + salt_buf3[1] = swap_workaround (ikepsk_bufs[salt_pos].nr_buf[13]); + salt_buf3[2] = 0; + salt_buf3[3] = 0; + + /** + * loop + */ + + u32x w0l = w0[0]; + + for (u32 il_pos = 0; il_pos < bfs_cnt; il_pos++) + { + const u32 w0r = bfs_buf[il_pos].i; + + w0[0] = w0l | w0r; + + /** + * pads + */ + + u32x w0_t[4]; + + w0_t[0] = w0[0]; + w0_t[1] = w0[1]; + w0_t[2] = w0[2]; + w0_t[3] = w0[3]; + + u32x w1_t[4]; + + w1_t[0] = w1[0]; + w1_t[1] = w1[1]; + w1_t[2] = w1[2]; + w1_t[3] = w1[3]; + + u32x w2_t[4]; + + w2_t[0] = w2[0]; + w2_t[1] = w2[1]; + w2_t[2] = w2[2]; + w2_t[3] = w2[3]; + + u32x w3_t[4]; + + w3_t[0] = w3[0]; + w3_t[1] = w3[1]; + w3_t[2] = 0; + w3_t[3] = 0; + + u32x ipad[5]; + u32x opad[5]; + + hmac_sha1_pad (w0_t, w1_t, w2_t, w3_t, ipad, opad); + + w0_t[0] = salt_buf0[0]; + w0_t[1] = salt_buf0[1]; + w0_t[2] = salt_buf0[2]; + w0_t[3] = salt_buf0[3]; + w1_t[0] = salt_buf1[0]; + w1_t[1] = salt_buf1[1]; + w1_t[2] = salt_buf1[2]; + w1_t[3] = salt_buf1[3]; + w2_t[0] = salt_buf2[0]; + w2_t[1] = salt_buf2[1]; + w2_t[2] = salt_buf2[2]; + w2_t[3] = salt_buf2[3]; + w3_t[0] = salt_buf3[0]; + w3_t[1] = salt_buf3[1]; + w3_t[2] = 0; + w3_t[3] = (64 + nr_len) * 8; + + u32x digest[5]; + + hmac_sha1_run (w0_t, w1_t, w2_t, w3_t, ipad, opad, digest); + + w0_t[0] = digest[0]; + w0_t[1] = digest[1]; + w0_t[2] = digest[2]; + w0_t[3] = digest[3]; + w1_t[0] = digest[4]; + w1_t[1] = 0; + w1_t[2] = 0; + w1_t[3] = 0; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = 0; + + hmac_sha1_pad (w0_t, w1_t, w2_t, w3_t, ipad, opad); + + int left; + int off; + + for (left = ikepsk_bufs[salt_pos].msg_len, off = 0; left >= 56; left -= 64, off += 16) + { + w0_t[0] = s_msg_buf[off + 0]; + w0_t[1] = s_msg_buf[off + 1]; + w0_t[2] = s_msg_buf[off + 2]; + w0_t[3] = s_msg_buf[off + 3]; + w1_t[0] = s_msg_buf[off + 4]; + w1_t[1] = s_msg_buf[off + 5]; + w1_t[2] = s_msg_buf[off + 6]; + w1_t[3] = s_msg_buf[off + 7]; + w2_t[0] = s_msg_buf[off + 8]; + w2_t[1] = s_msg_buf[off + 9]; + w2_t[2] = s_msg_buf[off + 10]; + w2_t[3] = s_msg_buf[off + 11]; + w3_t[0] = s_msg_buf[off + 12]; + w3_t[1] = s_msg_buf[off + 13]; + w3_t[2] = s_msg_buf[off + 14]; + w3_t[3] = s_msg_buf[off + 15]; + + sha1_transform (w0_t, w1_t, w2_t, w3_t, ipad); + } + + w0_t[0] = s_msg_buf[off + 0]; + w0_t[1] = s_msg_buf[off + 1]; + w0_t[2] = s_msg_buf[off + 2]; + w0_t[3] = s_msg_buf[off + 3]; + w1_t[0] = s_msg_buf[off + 4]; + w1_t[1] = s_msg_buf[off + 5]; + w1_t[2] = s_msg_buf[off + 6]; + w1_t[3] = s_msg_buf[off + 7]; + w2_t[0] = s_msg_buf[off + 8]; + w2_t[1] = s_msg_buf[off + 9]; + w2_t[2] = s_msg_buf[off + 10]; + w2_t[3] = s_msg_buf[off + 11]; + w3_t[0] = s_msg_buf[off + 12]; + w3_t[1] = s_msg_buf[off + 13]; + w3_t[2] = 0; + w3_t[3] = (64 + msg_len) * 8; + + hmac_sha1_run (w0_t, w1_t, w2_t, w3_t, ipad, opad, digest); + + const u32x r0 = digest[3]; + const u32x r1 = digest[4]; + const u32x r2 = digest[2]; + const u32x r3 = digest[1]; + + #include VECT_COMPARE_M + } +} + +static void m05400s (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], const u32 pw_len, __global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global ikepsk_t *ikepsk_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, __local u32 s_msg_buf[128]) +{ + /** + * modifier + */ + + const u32 gid = get_global_id (0); + const u32 lid = get_local_id (0); + + /** + * salt + */ + + const u32 nr_len = ikepsk_bufs[salt_pos].nr_len; + const u32 msg_len = ikepsk_bufs[salt_pos].msg_len; + + u32 salt_buf0[4]; + + salt_buf0[0] = swap_workaround (ikepsk_bufs[salt_pos].nr_buf[ 0]); + salt_buf0[1] = swap_workaround (ikepsk_bufs[salt_pos].nr_buf[ 1]); + salt_buf0[2] = swap_workaround (ikepsk_bufs[salt_pos].nr_buf[ 2]); + salt_buf0[3] = swap_workaround (ikepsk_bufs[salt_pos].nr_buf[ 3]); + + u32 salt_buf1[4]; + + salt_buf1[0] = swap_workaround (ikepsk_bufs[salt_pos].nr_buf[ 4]); + salt_buf1[1] = swap_workaround (ikepsk_bufs[salt_pos].nr_buf[ 5]); + salt_buf1[2] = swap_workaround (ikepsk_bufs[salt_pos].nr_buf[ 6]); + salt_buf1[3] = swap_workaround (ikepsk_bufs[salt_pos].nr_buf[ 7]); + + u32 salt_buf2[4]; + + salt_buf2[0] = swap_workaround (ikepsk_bufs[salt_pos].nr_buf[ 8]); + salt_buf2[1] = swap_workaround (ikepsk_bufs[salt_pos].nr_buf[ 9]); + salt_buf2[2] = swap_workaround (ikepsk_bufs[salt_pos].nr_buf[10]); + salt_buf2[3] = swap_workaround (ikepsk_bufs[salt_pos].nr_buf[11]); + + u32 salt_buf3[4]; + + salt_buf3[0] = swap_workaround (ikepsk_bufs[salt_pos].nr_buf[12]); + salt_buf3[1] = swap_workaround (ikepsk_bufs[salt_pos].nr_buf[13]); + salt_buf3[2] = 0; + salt_buf3[3] = 0; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * loop + */ + + u32x w0l = w0[0]; + + for (u32 il_pos = 0; il_pos < bfs_cnt; il_pos++) + { + const u32 w0r = bfs_buf[il_pos].i; + + w0[0] = w0l | w0r; + + /** + * pads + */ + + u32x w0_t[4]; + + w0_t[0] = w0[0]; + w0_t[1] = w0[1]; + w0_t[2] = w0[2]; + w0_t[3] = w0[3]; + + u32x w1_t[4]; + + w1_t[0] = w1[0]; + w1_t[1] = w1[1]; + w1_t[2] = w1[2]; + w1_t[3] = w1[3]; + + u32x w2_t[4]; + + w2_t[0] = w2[0]; + w2_t[1] = w2[1]; + w2_t[2] = w2[2]; + w2_t[3] = w2[3]; + + u32x w3_t[4]; + + w3_t[0] = w3[0]; + w3_t[1] = w3[1]; + w3_t[2] = 0; + w3_t[3] = 0; + + u32x ipad[5]; + u32x opad[5]; + + hmac_sha1_pad (w0_t, w1_t, w2_t, w3_t, ipad, opad); + + w0_t[0] = salt_buf0[0]; + w0_t[1] = salt_buf0[1]; + w0_t[2] = salt_buf0[2]; + w0_t[3] = salt_buf0[3]; + w1_t[0] = salt_buf1[0]; + w1_t[1] = salt_buf1[1]; + w1_t[2] = salt_buf1[2]; + w1_t[3] = salt_buf1[3]; + w2_t[0] = salt_buf2[0]; + w2_t[1] = salt_buf2[1]; + w2_t[2] = salt_buf2[2]; + w2_t[3] = salt_buf2[3]; + w3_t[0] = salt_buf3[0]; + w3_t[1] = salt_buf3[1]; + w3_t[2] = 0; + w3_t[3] = (64 + nr_len) * 8; + + u32x digest[5]; + + hmac_sha1_run (w0_t, w1_t, w2_t, w3_t, ipad, opad, digest); + + w0_t[0] = digest[0]; + w0_t[1] = digest[1]; + w0_t[2] = digest[2]; + w0_t[3] = digest[3]; + w1_t[0] = digest[4]; + w1_t[1] = 0; + w1_t[2] = 0; + w1_t[3] = 0; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = 0; + + hmac_sha1_pad (w0_t, w1_t, w2_t, w3_t, ipad, opad); + + int left; + int off; + + for (left = ikepsk_bufs[salt_pos].msg_len, off = 0; left >= 56; left -= 64, off += 16) + { + w0_t[0] = s_msg_buf[off + 0]; + w0_t[1] = s_msg_buf[off + 1]; + w0_t[2] = s_msg_buf[off + 2]; + w0_t[3] = s_msg_buf[off + 3]; + w1_t[0] = s_msg_buf[off + 4]; + w1_t[1] = s_msg_buf[off + 5]; + w1_t[2] = s_msg_buf[off + 6]; + w1_t[3] = s_msg_buf[off + 7]; + w2_t[0] = s_msg_buf[off + 8]; + w2_t[1] = s_msg_buf[off + 9]; + w2_t[2] = s_msg_buf[off + 10]; + w2_t[3] = s_msg_buf[off + 11]; + w3_t[0] = s_msg_buf[off + 12]; + w3_t[1] = s_msg_buf[off + 13]; + w3_t[2] = s_msg_buf[off + 14]; + w3_t[3] = s_msg_buf[off + 15]; + + sha1_transform (w0_t, w1_t, w2_t, w3_t, ipad); + } + + w0_t[0] = s_msg_buf[off + 0]; + w0_t[1] = s_msg_buf[off + 1]; + w0_t[2] = s_msg_buf[off + 2]; + w0_t[3] = s_msg_buf[off + 3]; + w1_t[0] = s_msg_buf[off + 4]; + w1_t[1] = s_msg_buf[off + 5]; + w1_t[2] = s_msg_buf[off + 6]; + w1_t[3] = s_msg_buf[off + 7]; + w2_t[0] = s_msg_buf[off + 8]; + w2_t[1] = s_msg_buf[off + 9]; + w2_t[2] = s_msg_buf[off + 10]; + w2_t[3] = s_msg_buf[off + 11]; + w3_t[0] = s_msg_buf[off + 12]; + w3_t[1] = s_msg_buf[off + 13]; + w3_t[2] = 0; + w3_t[3] = (64 + msg_len) * 8; + + hmac_sha1_run (w0_t, w1_t, w2_t, w3_t, ipad, opad, digest); + + const u32x r0 = digest[3]; + const u32x r1 = digest[4]; + const u32x r2 = digest[2]; + const u32x r3 = digest[1]; + + #include VECT_COMPARE_S + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m05400_m04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global ikepsk_t *ikepsk_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * s_msg + */ + + __local u32 s_msg_buf[128]; + + const u32 lid2 = lid * 2; + + s_msg_buf[lid2 + 0] = swap_workaround (ikepsk_bufs[salt_pos].msg_buf[lid2 + 0]); + s_msg_buf[lid2 + 1] = swap_workaround (ikepsk_bufs[salt_pos].msg_buf[lid2 + 1]); + + barrier (CLK_LOCAL_MEM_FENCE); + + if (gid >= gid_max) return; + + /** + * main + */ + + m05400m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, ikepsk_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset, s_msg_buf); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m05400_m08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global ikepsk_t *ikepsk_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * s_msg + */ + + __local u32 s_msg_buf[128]; + + const u32 lid2 = lid * 2; + + s_msg_buf[lid2 + 0] = swap_workaround (ikepsk_bufs[salt_pos].msg_buf[lid2 + 0]); + s_msg_buf[lid2 + 1] = swap_workaround (ikepsk_bufs[salt_pos].msg_buf[lid2 + 1]); + + barrier (CLK_LOCAL_MEM_FENCE); + + if (gid >= gid_max) return; + + /** + * main + */ + + m05400m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, ikepsk_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset, s_msg_buf); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m05400_m16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global ikepsk_t *ikepsk_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = pws[gid].i[ 8]; + w2[1] = pws[gid].i[ 9]; + w2[2] = pws[gid].i[10]; + w2[3] = pws[gid].i[11]; + + u32x w3[4]; + + w3[0] = pws[gid].i[12]; + w3[1] = pws[gid].i[13]; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * s_msg + */ + + __local u32 s_msg_buf[128]; + + const u32 lid2 = lid * 2; + + s_msg_buf[lid2 + 0] = swap_workaround (ikepsk_bufs[salt_pos].msg_buf[lid2 + 0]); + s_msg_buf[lid2 + 1] = swap_workaround (ikepsk_bufs[salt_pos].msg_buf[lid2 + 1]); + + barrier (CLK_LOCAL_MEM_FENCE); + + if (gid >= gid_max) return; + + /** + * main + */ + + m05400m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, ikepsk_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset, s_msg_buf); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m05400_s04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global ikepsk_t *ikepsk_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /* + * s_msg_buf + */ + + __local u32 s_msg_buf[128]; + + const u32 lid2 = lid * 2; + + s_msg_buf[lid2 + 0] = swap_workaround (ikepsk_bufs[salt_pos].msg_buf[lid2 + 0]); + s_msg_buf[lid2 + 1] = swap_workaround (ikepsk_bufs[salt_pos].msg_buf[lid2 + 1]); + + barrier (CLK_LOCAL_MEM_FENCE); + + if (gid >= gid_max) return; + + /** + * main + */ + + m05400s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, ikepsk_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset, s_msg_buf); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m05400_s08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global ikepsk_t *ikepsk_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /* + * s_msg_buf + */ + + __local u32 s_msg_buf[128]; + + const u32 lid2 = lid * 2; + + s_msg_buf[lid2 + 0] = swap_workaround (ikepsk_bufs[salt_pos].msg_buf[lid2 + 0]); + s_msg_buf[lid2 + 1] = swap_workaround (ikepsk_bufs[salt_pos].msg_buf[lid2 + 1]); + + barrier (CLK_LOCAL_MEM_FENCE); + + if (gid >= gid_max) return; + + /** + * main + */ + + m05400s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, ikepsk_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset, s_msg_buf); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m05400_s16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global ikepsk_t *ikepsk_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = pws[gid].i[ 8]; + w2[1] = pws[gid].i[ 9]; + w2[2] = pws[gid].i[10]; + w2[3] = pws[gid].i[11]; + + u32x w3[4]; + + w3[0] = pws[gid].i[12]; + w3[1] = pws[gid].i[13]; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /* + * s_msg_buf + */ + + __local u32 s_msg_buf[128]; + + const u32 lid2 = lid * 2; + + s_msg_buf[lid2 + 0] = swap_workaround (ikepsk_bufs[salt_pos].msg_buf[lid2 + 0]); + s_msg_buf[lid2 + 1] = swap_workaround (ikepsk_bufs[salt_pos].msg_buf[lid2 + 1]); + + barrier (CLK_LOCAL_MEM_FENCE); + + if (gid >= gid_max) return; + + /** + * main + */ + + m05400s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, ikepsk_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset, s_msg_buf); +} diff --git a/amd/m05500_a0.cl b/amd/m05500_a0.cl new file mode 100644 index 0000000000..2b9c8516a7 --- /dev/null +++ b/amd/m05500_a0.cl @@ -0,0 +1,1049 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _MD4_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW4 +#define VECT_SIZE4 +#endif + +#ifdef VLIW5 +#define VECT_SIZE4 +#endif + +#define DGST_R0 0 +#define DGST_R1 1 +#define DGST_R2 2 +#define DGST_R3 3 + +#include "include/kernel_functions.c" +#include "types_amd.c" +#include "common_amd.c" +#include "include/rp_gpu.h" +#include "rp_amd.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +#define PERM_OP(a,b,tt,n,m) \ +{ \ + tt = a >> n; \ + tt = tt ^ b; \ + tt = tt & m; \ + b = b ^ tt; \ + tt = tt << n; \ + a = a ^ tt; \ +} + +#define HPERM_OP(a,tt,n,m) \ +{ \ + tt = a << (16 + n); \ + tt = tt ^ a; \ + tt = tt & m; \ + a = a ^ tt; \ + tt = tt >> (16 + n); \ + a = a ^ tt; \ +} + +__constant u32 c_SPtrans[8][64] = +{ + /* nibble 0 */ + 0x02080800, 0x00080000, 0x02000002, 0x02080802, + 0x02000000, 0x00080802, 0x00080002, 0x02000002, + 0x00080802, 0x02080800, 0x02080000, 0x00000802, + 0x02000802, 0x02000000, 0x00000000, 0x00080002, + 0x00080000, 0x00000002, 0x02000800, 0x00080800, + 0x02080802, 0x02080000, 0x00000802, 0x02000800, + 0x00000002, 0x00000800, 0x00080800, 0x02080002, + 0x00000800, 0x02000802, 0x02080002, 0x00000000, + 0x00000000, 0x02080802, 0x02000800, 0x00080002, + 0x02080800, 0x00080000, 0x00000802, 0x02000800, + 0x02080002, 0x00000800, 0x00080800, 0x02000002, + 0x00080802, 0x00000002, 0x02000002, 0x02080000, + 0x02080802, 0x00080800, 0x02080000, 0x02000802, + 0x02000000, 0x00000802, 0x00080002, 0x00000000, + 0x00080000, 0x02000000, 0x02000802, 0x02080800, + 0x00000002, 0x02080002, 0x00000800, 0x00080802, + /* nibble 1 */ + 0x40108010, 0x00000000, 0x00108000, 0x40100000, + 0x40000010, 0x00008010, 0x40008000, 0x00108000, + 0x00008000, 0x40100010, 0x00000010, 0x40008000, + 0x00100010, 0x40108000, 0x40100000, 0x00000010, + 0x00100000, 0x40008010, 0x40100010, 0x00008000, + 0x00108010, 0x40000000, 0x00000000, 0x00100010, + 0x40008010, 0x00108010, 0x40108000, 0x40000010, + 0x40000000, 0x00100000, 0x00008010, 0x40108010, + 0x00100010, 0x40108000, 0x40008000, 0x00108010, + 0x40108010, 0x00100010, 0x40000010, 0x00000000, + 0x40000000, 0x00008010, 0x00100000, 0x40100010, + 0x00008000, 0x40000000, 0x00108010, 0x40008010, + 0x40108000, 0x00008000, 0x00000000, 0x40000010, + 0x00000010, 0x40108010, 0x00108000, 0x40100000, + 0x40100010, 0x00100000, 0x00008010, 0x40008000, + 0x40008010, 0x00000010, 0x40100000, 0x00108000, + /* nibble 2 */ + 0x04000001, 0x04040100, 0x00000100, 0x04000101, + 0x00040001, 0x04000000, 0x04000101, 0x00040100, + 0x04000100, 0x00040000, 0x04040000, 0x00000001, + 0x04040101, 0x00000101, 0x00000001, 0x04040001, + 0x00000000, 0x00040001, 0x04040100, 0x00000100, + 0x00000101, 0x04040101, 0x00040000, 0x04000001, + 0x04040001, 0x04000100, 0x00040101, 0x04040000, + 0x00040100, 0x00000000, 0x04000000, 0x00040101, + 0x04040100, 0x00000100, 0x00000001, 0x00040000, + 0x00000101, 0x00040001, 0x04040000, 0x04000101, + 0x00000000, 0x04040100, 0x00040100, 0x04040001, + 0x00040001, 0x04000000, 0x04040101, 0x00000001, + 0x00040101, 0x04000001, 0x04000000, 0x04040101, + 0x00040000, 0x04000100, 0x04000101, 0x00040100, + 0x04000100, 0x00000000, 0x04040001, 0x00000101, + 0x04000001, 0x00040101, 0x00000100, 0x04040000, + /* nibble 3 */ + 0x00401008, 0x10001000, 0x00000008, 0x10401008, + 0x00000000, 0x10400000, 0x10001008, 0x00400008, + 0x10401000, 0x10000008, 0x10000000, 0x00001008, + 0x10000008, 0x00401008, 0x00400000, 0x10000000, + 0x10400008, 0x00401000, 0x00001000, 0x00000008, + 0x00401000, 0x10001008, 0x10400000, 0x00001000, + 0x00001008, 0x00000000, 0x00400008, 0x10401000, + 0x10001000, 0x10400008, 0x10401008, 0x00400000, + 0x10400008, 0x00001008, 0x00400000, 0x10000008, + 0x00401000, 0x10001000, 0x00000008, 0x10400000, + 0x10001008, 0x00000000, 0x00001000, 0x00400008, + 0x00000000, 0x10400008, 0x10401000, 0x00001000, + 0x10000000, 0x10401008, 0x00401008, 0x00400000, + 0x10401008, 0x00000008, 0x10001000, 0x00401008, + 0x00400008, 0x00401000, 0x10400000, 0x10001008, + 0x00001008, 0x10000000, 0x10000008, 0x10401000, + /* nibble 4 */ + 0x08000000, 0x00010000, 0x00000400, 0x08010420, + 0x08010020, 0x08000400, 0x00010420, 0x08010000, + 0x00010000, 0x00000020, 0x08000020, 0x00010400, + 0x08000420, 0x08010020, 0x08010400, 0x00000000, + 0x00010400, 0x08000000, 0x00010020, 0x00000420, + 0x08000400, 0x00010420, 0x00000000, 0x08000020, + 0x00000020, 0x08000420, 0x08010420, 0x00010020, + 0x08010000, 0x00000400, 0x00000420, 0x08010400, + 0x08010400, 0x08000420, 0x00010020, 0x08010000, + 0x00010000, 0x00000020, 0x08000020, 0x08000400, + 0x08000000, 0x00010400, 0x08010420, 0x00000000, + 0x00010420, 0x08000000, 0x00000400, 0x00010020, + 0x08000420, 0x00000400, 0x00000000, 0x08010420, + 0x08010020, 0x08010400, 0x00000420, 0x00010000, + 0x00010400, 0x08010020, 0x08000400, 0x00000420, + 0x00000020, 0x00010420, 0x08010000, 0x08000020, + /* nibble 5 */ + 0x80000040, 0x00200040, 0x00000000, 0x80202000, + 0x00200040, 0x00002000, 0x80002040, 0x00200000, + 0x00002040, 0x80202040, 0x00202000, 0x80000000, + 0x80002000, 0x80000040, 0x80200000, 0x00202040, + 0x00200000, 0x80002040, 0x80200040, 0x00000000, + 0x00002000, 0x00000040, 0x80202000, 0x80200040, + 0x80202040, 0x80200000, 0x80000000, 0x00002040, + 0x00000040, 0x00202000, 0x00202040, 0x80002000, + 0x00002040, 0x80000000, 0x80002000, 0x00202040, + 0x80202000, 0x00200040, 0x00000000, 0x80002000, + 0x80000000, 0x00002000, 0x80200040, 0x00200000, + 0x00200040, 0x80202040, 0x00202000, 0x00000040, + 0x80202040, 0x00202000, 0x00200000, 0x80002040, + 0x80000040, 0x80200000, 0x00202040, 0x00000000, + 0x00002000, 0x80000040, 0x80002040, 0x80202000, + 0x80200000, 0x00002040, 0x00000040, 0x80200040, + /* nibble 6 */ + 0x00004000, 0x00000200, 0x01000200, 0x01000004, + 0x01004204, 0x00004004, 0x00004200, 0x00000000, + 0x01000000, 0x01000204, 0x00000204, 0x01004000, + 0x00000004, 0x01004200, 0x01004000, 0x00000204, + 0x01000204, 0x00004000, 0x00004004, 0x01004204, + 0x00000000, 0x01000200, 0x01000004, 0x00004200, + 0x01004004, 0x00004204, 0x01004200, 0x00000004, + 0x00004204, 0x01004004, 0x00000200, 0x01000000, + 0x00004204, 0x01004000, 0x01004004, 0x00000204, + 0x00004000, 0x00000200, 0x01000000, 0x01004004, + 0x01000204, 0x00004204, 0x00004200, 0x00000000, + 0x00000200, 0x01000004, 0x00000004, 0x01000200, + 0x00000000, 0x01000204, 0x01000200, 0x00004200, + 0x00000204, 0x00004000, 0x01004204, 0x01000000, + 0x01004200, 0x00000004, 0x00004004, 0x01004204, + 0x01000004, 0x01004200, 0x01004000, 0x00004004, + /* nibble 7 */ + 0x20800080, 0x20820000, 0x00020080, 0x00000000, + 0x20020000, 0x00800080, 0x20800000, 0x20820080, + 0x00000080, 0x20000000, 0x00820000, 0x00020080, + 0x00820080, 0x20020080, 0x20000080, 0x20800000, + 0x00020000, 0x00820080, 0x00800080, 0x20020000, + 0x20820080, 0x20000080, 0x00000000, 0x00820000, + 0x20000000, 0x00800000, 0x20020080, 0x20800080, + 0x00800000, 0x00020000, 0x20820000, 0x00000080, + 0x00800000, 0x00020000, 0x20000080, 0x20820080, + 0x00020080, 0x20000000, 0x00000000, 0x00820000, + 0x20800080, 0x20020080, 0x20020000, 0x00800080, + 0x20820000, 0x00000080, 0x00800080, 0x20020000, + 0x20820080, 0x00800000, 0x20800000, 0x20000080, + 0x00820000, 0x00020080, 0x20020080, 0x20800000, + 0x00000080, 0x20820000, 0x00820080, 0x00000000, + 0x20000000, 0x20800080, 0x00020000, 0x00820080, +}; + +__constant u32 c_skb[8][64] = +{ + /* for C bits (numbered as per FIPS 46) 1 2 3 4 5 6 */ + 0x00000000, 0x00000010, 0x20000000, 0x20000010, + 0x00010000, 0x00010010, 0x20010000, 0x20010010, + 0x00000800, 0x00000810, 0x20000800, 0x20000810, + 0x00010800, 0x00010810, 0x20010800, 0x20010810, + 0x00000020, 0x00000030, 0x20000020, 0x20000030, + 0x00010020, 0x00010030, 0x20010020, 0x20010030, + 0x00000820, 0x00000830, 0x20000820, 0x20000830, + 0x00010820, 0x00010830, 0x20010820, 0x20010830, + 0x00080000, 0x00080010, 0x20080000, 0x20080010, + 0x00090000, 0x00090010, 0x20090000, 0x20090010, + 0x00080800, 0x00080810, 0x20080800, 0x20080810, + 0x00090800, 0x00090810, 0x20090800, 0x20090810, + 0x00080020, 0x00080030, 0x20080020, 0x20080030, + 0x00090020, 0x00090030, 0x20090020, 0x20090030, + 0x00080820, 0x00080830, 0x20080820, 0x20080830, + 0x00090820, 0x00090830, 0x20090820, 0x20090830, + /* for C bits (numbered as per FIPS 46) 7 8 10 11 12 13 */ + 0x00000000, 0x02000000, 0x00002000, 0x02002000, + 0x00200000, 0x02200000, 0x00202000, 0x02202000, + 0x00000004, 0x02000004, 0x00002004, 0x02002004, + 0x00200004, 0x02200004, 0x00202004, 0x02202004, + 0x00000400, 0x02000400, 0x00002400, 0x02002400, + 0x00200400, 0x02200400, 0x00202400, 0x02202400, + 0x00000404, 0x02000404, 0x00002404, 0x02002404, + 0x00200404, 0x02200404, 0x00202404, 0x02202404, + 0x10000000, 0x12000000, 0x10002000, 0x12002000, + 0x10200000, 0x12200000, 0x10202000, 0x12202000, + 0x10000004, 0x12000004, 0x10002004, 0x12002004, + 0x10200004, 0x12200004, 0x10202004, 0x12202004, + 0x10000400, 0x12000400, 0x10002400, 0x12002400, + 0x10200400, 0x12200400, 0x10202400, 0x12202400, + 0x10000404, 0x12000404, 0x10002404, 0x12002404, + 0x10200404, 0x12200404, 0x10202404, 0x12202404, + /* for C bits (numbered as per FIPS 46) 14 15 16 17 19 20 */ + 0x00000000, 0x00000001, 0x00040000, 0x00040001, + 0x01000000, 0x01000001, 0x01040000, 0x01040001, + 0x00000002, 0x00000003, 0x00040002, 0x00040003, + 0x01000002, 0x01000003, 0x01040002, 0x01040003, + 0x00000200, 0x00000201, 0x00040200, 0x00040201, + 0x01000200, 0x01000201, 0x01040200, 0x01040201, + 0x00000202, 0x00000203, 0x00040202, 0x00040203, + 0x01000202, 0x01000203, 0x01040202, 0x01040203, + 0x08000000, 0x08000001, 0x08040000, 0x08040001, + 0x09000000, 0x09000001, 0x09040000, 0x09040001, + 0x08000002, 0x08000003, 0x08040002, 0x08040003, + 0x09000002, 0x09000003, 0x09040002, 0x09040003, + 0x08000200, 0x08000201, 0x08040200, 0x08040201, + 0x09000200, 0x09000201, 0x09040200, 0x09040201, + 0x08000202, 0x08000203, 0x08040202, 0x08040203, + 0x09000202, 0x09000203, 0x09040202, 0x09040203, + /* for C bits (numbered as per FIPS 46) 21 23 24 26 27 28 */ + 0x00000000, 0x00100000, 0x00000100, 0x00100100, + 0x00000008, 0x00100008, 0x00000108, 0x00100108, + 0x00001000, 0x00101000, 0x00001100, 0x00101100, + 0x00001008, 0x00101008, 0x00001108, 0x00101108, + 0x04000000, 0x04100000, 0x04000100, 0x04100100, + 0x04000008, 0x04100008, 0x04000108, 0x04100108, + 0x04001000, 0x04101000, 0x04001100, 0x04101100, + 0x04001008, 0x04101008, 0x04001108, 0x04101108, + 0x00020000, 0x00120000, 0x00020100, 0x00120100, + 0x00020008, 0x00120008, 0x00020108, 0x00120108, + 0x00021000, 0x00121000, 0x00021100, 0x00121100, + 0x00021008, 0x00121008, 0x00021108, 0x00121108, + 0x04020000, 0x04120000, 0x04020100, 0x04120100, + 0x04020008, 0x04120008, 0x04020108, 0x04120108, + 0x04021000, 0x04121000, 0x04021100, 0x04121100, + 0x04021008, 0x04121008, 0x04021108, 0x04121108, + /* for D bits (numbered as per FIPS 46) 1 2 3 4 5 6 */ + 0x00000000, 0x10000000, 0x00010000, 0x10010000, + 0x00000004, 0x10000004, 0x00010004, 0x10010004, + 0x20000000, 0x30000000, 0x20010000, 0x30010000, + 0x20000004, 0x30000004, 0x20010004, 0x30010004, + 0x00100000, 0x10100000, 0x00110000, 0x10110000, + 0x00100004, 0x10100004, 0x00110004, 0x10110004, + 0x20100000, 0x30100000, 0x20110000, 0x30110000, + 0x20100004, 0x30100004, 0x20110004, 0x30110004, + 0x00001000, 0x10001000, 0x00011000, 0x10011000, + 0x00001004, 0x10001004, 0x00011004, 0x10011004, + 0x20001000, 0x30001000, 0x20011000, 0x30011000, + 0x20001004, 0x30001004, 0x20011004, 0x30011004, + 0x00101000, 0x10101000, 0x00111000, 0x10111000, + 0x00101004, 0x10101004, 0x00111004, 0x10111004, + 0x20101000, 0x30101000, 0x20111000, 0x30111000, + 0x20101004, 0x30101004, 0x20111004, 0x30111004, + /* for D bits (numbered as per FIPS 46) 8 9 11 12 13 14 */ + 0x00000000, 0x08000000, 0x00000008, 0x08000008, + 0x00000400, 0x08000400, 0x00000408, 0x08000408, + 0x00020000, 0x08020000, 0x00020008, 0x08020008, + 0x00020400, 0x08020400, 0x00020408, 0x08020408, + 0x00000001, 0x08000001, 0x00000009, 0x08000009, + 0x00000401, 0x08000401, 0x00000409, 0x08000409, + 0x00020001, 0x08020001, 0x00020009, 0x08020009, + 0x00020401, 0x08020401, 0x00020409, 0x08020409, + 0x02000000, 0x0A000000, 0x02000008, 0x0A000008, + 0x02000400, 0x0A000400, 0x02000408, 0x0A000408, + 0x02020000, 0x0A020000, 0x02020008, 0x0A020008, + 0x02020400, 0x0A020400, 0x02020408, 0x0A020408, + 0x02000001, 0x0A000001, 0x02000009, 0x0A000009, + 0x02000401, 0x0A000401, 0x02000409, 0x0A000409, + 0x02020001, 0x0A020001, 0x02020009, 0x0A020009, + 0x02020401, 0x0A020401, 0x02020409, 0x0A020409, + /* for D bits (numbered as per FIPS 46) 16 17 18 19 20 21 */ + 0x00000000, 0x00000100, 0x00080000, 0x00080100, + 0x01000000, 0x01000100, 0x01080000, 0x01080100, + 0x00000010, 0x00000110, 0x00080010, 0x00080110, + 0x01000010, 0x01000110, 0x01080010, 0x01080110, + 0x00200000, 0x00200100, 0x00280000, 0x00280100, + 0x01200000, 0x01200100, 0x01280000, 0x01280100, + 0x00200010, 0x00200110, 0x00280010, 0x00280110, + 0x01200010, 0x01200110, 0x01280010, 0x01280110, + 0x00000200, 0x00000300, 0x00080200, 0x00080300, + 0x01000200, 0x01000300, 0x01080200, 0x01080300, + 0x00000210, 0x00000310, 0x00080210, 0x00080310, + 0x01000210, 0x01000310, 0x01080210, 0x01080310, + 0x00200200, 0x00200300, 0x00280200, 0x00280300, + 0x01200200, 0x01200300, 0x01280200, 0x01280300, + 0x00200210, 0x00200310, 0x00280210, 0x00280310, + 0x01200210, 0x01200310, 0x01280210, 0x01280310, + /* for D bits (numbered as per FIPS 46) 22 23 24 25 27 28 */ + 0x00000000, 0x04000000, 0x00040000, 0x04040000, + 0x00000002, 0x04000002, 0x00040002, 0x04040002, + 0x00002000, 0x04002000, 0x00042000, 0x04042000, + 0x00002002, 0x04002002, 0x00042002, 0x04042002, + 0x00000020, 0x04000020, 0x00040020, 0x04040020, + 0x00000022, 0x04000022, 0x00040022, 0x04040022, + 0x00002020, 0x04002020, 0x00042020, 0x04042020, + 0x00002022, 0x04002022, 0x00042022, 0x04042022, + 0x00000800, 0x04000800, 0x00040800, 0x04040800, + 0x00000802, 0x04000802, 0x00040802, 0x04040802, + 0x00002800, 0x04002800, 0x00042800, 0x04042800, + 0x00002802, 0x04002802, 0x00042802, 0x04042802, + 0x00000820, 0x04000820, 0x00040820, 0x04040820, + 0x00000822, 0x04000822, 0x00040822, 0x04040822, + 0x00002820, 0x04002820, 0x00042820, 0x04042820, + 0x00002822, 0x04002822, 0x00042822, 0x04042822 +}; + +__constant u32 shifts3s0[16] = { 1, 1, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 1 }; +__constant u32 shifts3s1[16] = { 27, 27, 26, 26, 26, 26, 26, 26, 27, 26, 26, 26, 26, 26, 26, 27 }; + +#ifdef VECT_SIZE1 +#define BOX(i,n,S) (u32x) ((S)[(n)][(i)]) +#endif + +#ifdef VECT_SIZE2 +#define BOX(i,n,S) (u32x) ((S)[(n)][(i).s0], (S)[(n)][(i).s1]) +#endif + +#ifdef VECT_SIZE4 +#define BOX(i,n,S) (u32x) ((S)[(n)][(i).s0], (S)[(n)][(i).s1], (S)[(n)][(i).s2], (S)[(n)][(i).s3]) +#endif + +static void _des_crypt_encrypt (u32x iv[2], u32x data[2], u32x Kc[16], u32x Kd[16], __local u32 s_SPtrans[8][64]) +{ + u32x r = data[0]; + u32x l = data[1]; + + #pragma unroll 16 + for (u32 i = 0; i < 16; i += 2) + { + u32x u; + u32x t; + + u = Kc[i + 0] ^ rotl32 (r, 30u); + t = Kd[i + 0] ^ rotl32 (r, 26u); + + l = l + ^ BOX (amd_bfe (u, 0, 6), 0, s_SPtrans) + ^ BOX (amd_bfe (u, 8, 6), 2, s_SPtrans) + ^ BOX (amd_bfe (u, 16, 6), 4, s_SPtrans) + ^ BOX (amd_bfe (u, 24, 6), 6, s_SPtrans) + ^ BOX (amd_bfe (t, 0, 6), 1, s_SPtrans) + ^ BOX (amd_bfe (t, 8, 6), 3, s_SPtrans) + ^ BOX (amd_bfe (t, 16, 6), 5, s_SPtrans) + ^ BOX (amd_bfe (t, 24, 6), 7, s_SPtrans); + + u = Kc[i + 1] ^ rotl32 (l, 30u); + t = Kd[i + 1] ^ rotl32 (l, 26u); + + r = r + ^ BOX (amd_bfe (u, 0, 6), 0, s_SPtrans) + ^ BOX (amd_bfe (u, 8, 6), 2, s_SPtrans) + ^ BOX (amd_bfe (u, 16, 6), 4, s_SPtrans) + ^ BOX (amd_bfe (u, 24, 6), 6, s_SPtrans) + ^ BOX (amd_bfe (t, 0, 6), 1, s_SPtrans) + ^ BOX (amd_bfe (t, 8, 6), 3, s_SPtrans) + ^ BOX (amd_bfe (t, 16, 6), 5, s_SPtrans) + ^ BOX (amd_bfe (t, 24, 6), 7, s_SPtrans); + } + + iv[0] = l; + iv[1] = r; +} + +static void _des_crypt_keysetup (u32x c, u32x d, u32x Kc[16], u32x Kd[16], __local u32 s_skb[8][64]) +{ + u32x tt; + + PERM_OP (d, c, tt, 4, 0x0f0f0f0f); + HPERM_OP (c, tt, 2, 0xcccc0000); + HPERM_OP (d, tt, 2, 0xcccc0000); + PERM_OP (d, c, tt, 1, 0x55555555); + PERM_OP (c, d, tt, 8, 0x00ff00ff); + PERM_OP (d, c, tt, 1, 0x55555555); + + d = ((d & 0x000000ff) << 16) + | ((d & 0x0000ff00) << 0) + | ((d & 0x00ff0000) >> 16) + | ((c & 0xf0000000) >> 4); + + c = c & 0x0fffffff; + + #pragma unroll 16 + for (u32 i = 0; i < 16; i++) + { + c = c >> shifts3s0[i] | c << shifts3s1[i]; + d = d >> shifts3s0[i] | d << shifts3s1[i]; + + c = c & 0x0fffffff; + d = d & 0x0fffffff; + + const u32x c00 = (c >> 0) & 0x0000003f; + const u32x c06 = (c >> 6) & 0x00383003; + const u32x c07 = (c >> 7) & 0x0000003c; + const u32x c13 = (c >> 13) & 0x0000060f; + const u32x c20 = (c >> 20) & 0x00000001; + + u32x s = BOX (((c00 >> 0) & 0xff), 0, s_skb) + | BOX (((c06 >> 0) & 0xff) + |((c07 >> 0) & 0xff), 1, s_skb) + | BOX (((c13 >> 0) & 0xff) + |((c06 >> 8) & 0xff), 2, s_skb) + | BOX (((c20 >> 0) & 0xff) + |((c13 >> 8) & 0xff) + |((c06 >> 16) & 0xff), 3, s_skb); + + const u32x d00 = (d >> 0) & 0x00003c3f; + const u32x d07 = (d >> 7) & 0x00003f03; + const u32x d21 = (d >> 21) & 0x0000000f; + const u32x d22 = (d >> 22) & 0x00000030; + + u32x t = BOX (((d00 >> 0) & 0xff), 4, s_skb) + | BOX (((d07 >> 0) & 0xff) + |((d00 >> 8) & 0xff), 5, s_skb) + | BOX (((d07 >> 8) & 0xff), 6, s_skb) + | BOX (((d21 >> 0) & 0xff) + |((d22 >> 0) & 0xff), 7, s_skb); + + Kc[i] = ((t << 16) | (s & 0x0000ffff)); + Kd[i] = ((s >> 16) | (t & 0xffff0000)); + } +} + +static void transform_netntlmv1_key (const u32x w0, const u32x w1, u32x out[2]) +{ + #ifdef VECT_SIZE1 + const uchar4 t0 = as_uchar4 (w0); + const uchar4 t1 = as_uchar4 (w1); + + uchar4 k0; + uchar4 k1; + + k0.s0 = (t0.s0 >> 0); + k0.s1 = (t0.s0 << 7) | (t0.s1 >> 1); + k0.s2 = (t0.s1 << 6) | (t0.s2 >> 2); + k0.s3 = (t0.s2 << 5) | (t0.s3 >> 3); + k1.s0 = (t0.s3 << 4) | (t1.s0 >> 4); + k1.s1 = (t1.s0 << 3) | (t1.s1 >> 5); + k1.s2 = (t1.s1 << 2) | (t1.s2 >> 6); + k1.s3 = (t1.s2 << 1); + + out[0] = as_uint (k0); + out[1] = as_uint (k1); + #endif + + #ifdef VECT_SIZE2 + const uchar8 t0 = as_uchar8 (w0); + const uchar8 t1 = as_uchar8 (w1); + + uchar8 k0; + uchar8 k1; + + k0.s0 = (t0.s0 >> 0); + k0.s1 = (t0.s0 << 7) | (t0.s1 >> 1); + k0.s2 = (t0.s1 << 6) | (t0.s2 >> 2); + k0.s3 = (t0.s2 << 5) | (t0.s3 >> 3); + k1.s0 = (t0.s3 << 4) | (t1.s0 >> 4); + k1.s1 = (t1.s0 << 3) | (t1.s1 >> 5); + k1.s2 = (t1.s1 << 2) | (t1.s2 >> 6); + k1.s3 = (t1.s2 << 1); + + k0.s4 = (t0.s4 >> 0); + k0.s5 = (t0.s4 << 7) | (t0.s5 >> 1); + k0.s6 = (t0.s5 << 6) | (t0.s6 >> 2); + k0.s7 = (t0.s6 << 5) | (t0.s7 >> 3); + k1.s4 = (t0.s7 << 4) | (t1.s4 >> 4); + k1.s5 = (t1.s4 << 3) | (t1.s5 >> 5); + k1.s6 = (t1.s5 << 2) | (t1.s6 >> 6); + k1.s7 = (t1.s6 << 1); + + out[0] = as_uint2 (k0); + out[1] = as_uint2 (k1); + #endif + + #ifdef VECT_SIZE4 + const uchar16 t0 = as_uchar16 (w0); + const uchar16 t1 = as_uchar16 (w1); + + uchar16 k0; + uchar16 k1; + + k0.s0 = (t0.s0 >> 0); + k0.s1 = (t0.s0 << 7) | (t0.s1 >> 1); + k0.s2 = (t0.s1 << 6) | (t0.s2 >> 2); + k0.s3 = (t0.s2 << 5) | (t0.s3 >> 3); + k1.s0 = (t0.s3 << 4) | (t1.s0 >> 4); + k1.s1 = (t1.s0 << 3) | (t1.s1 >> 5); + k1.s2 = (t1.s1 << 2) | (t1.s2 >> 6); + k1.s3 = (t1.s2 << 1); + + k0.s4 = (t0.s4 >> 0); + k0.s5 = (t0.s4 << 7) | (t0.s5 >> 1); + k0.s6 = (t0.s5 << 6) | (t0.s6 >> 2); + k0.s7 = (t0.s6 << 5) | (t0.s7 >> 3); + k1.s4 = (t0.s7 << 4) | (t1.s4 >> 4); + k1.s5 = (t1.s4 << 3) | (t1.s5 >> 5); + k1.s6 = (t1.s5 << 2) | (t1.s6 >> 6); + k1.s7 = (t1.s6 << 1); + + k0.s8 = (t0.s8 >> 0); + k0.s9 = (t0.s8 << 7) | (t0.s9 >> 1); + k0.sa = (t0.s9 << 6) | (t0.sa >> 2); + k0.sb = (t0.sa << 5) | (t0.sb >> 3); + k1.s8 = (t0.sb << 4) | (t1.s8 >> 4); + k1.s9 = (t1.s8 << 3) | (t1.s9 >> 5); + k1.sa = (t1.s9 << 2) | (t1.sa >> 6); + k1.sb = (t1.sa << 1); + + k0.sc = (t0.sc >> 0); + k0.sd = (t0.sc << 7) | (t0.sd >> 1); + k0.se = (t0.sd << 6) | (t0.se >> 2); + k0.sf = (t0.se << 5) | (t0.sf >> 3); + k1.sc = (t0.sf << 4) | (t1.sc >> 4); + k1.sd = (t1.sc << 3) | (t1.sd >> 5); + k1.se = (t1.sd << 2) | (t1.se >> 6); + k1.sf = (t1.se << 1); + + out[0] = as_uint4 (k0); + out[1] = as_uint4 (k1); + #endif +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m05500_m04 (__global pw_t *pws, __global gpu_rule_t * rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + u32x pw_buf1[4]; + + pw_buf1[0] = pws[gid].i[ 4]; + pw_buf1[1] = pws[gid].i[ 5]; + pw_buf1[2] = pws[gid].i[ 6]; + pw_buf1[3] = pws[gid].i[ 7]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * sbox, kbox + */ + + __local u32 s_SPtrans[8][64]; + __local u32 s_skb[8][64]; + + s_SPtrans[0][lid] = c_SPtrans[0][lid]; + s_SPtrans[1][lid] = c_SPtrans[1][lid]; + s_SPtrans[2][lid] = c_SPtrans[2][lid]; + s_SPtrans[3][lid] = c_SPtrans[3][lid]; + s_SPtrans[4][lid] = c_SPtrans[4][lid]; + s_SPtrans[5][lid] = c_SPtrans[5][lid]; + s_SPtrans[6][lid] = c_SPtrans[6][lid]; + s_SPtrans[7][lid] = c_SPtrans[7][lid]; + + s_skb[0][lid] = c_skb[0][lid]; + s_skb[1][lid] = c_skb[1][lid]; + s_skb[2][lid] = c_skb[2][lid]; + s_skb[3][lid] = c_skb[3][lid]; + s_skb[4][lid] = c_skb[4][lid]; + s_skb[5][lid] = c_skb[5][lid]; + s_skb[6][lid] = c_skb[6][lid]; + s_skb[7][lid] = c_skb[7][lid]; + + barrier (CLK_LOCAL_MEM_FENCE); + + if (gid >= gid_max) return; + + /** + * salt + */ + + const u32 s0 = salt_bufs[salt_pos].salt_buf[0]; + const u32 s1 = salt_bufs[salt_pos].salt_buf[1]; + const u32 s2 = salt_bufs[salt_pos].salt_buf[2]; + + u32x data[2]; + + data[0] = s0; + data[1] = s1; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + + w0[0] = pw_buf0[0]; + w0[1] = pw_buf0[1]; + w0[2] = pw_buf0[2]; + w0[3] = pw_buf0[3]; + + u32x w1[4]; + + w1[0] = pw_buf1[0]; + w1[1] = pw_buf1[1]; + w1[2] = pw_buf1[2]; + w1[3] = pw_buf1[3]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 out_len = apply_rules (rules_buf[il_pos].cmds, w0, w1, pw_len); + + append_0x80_2 (w0, w1, out_len); + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + make_unicode (w0, w0_t, w1_t); + make_unicode (w1, w2_t, w3_t); + + w3_t[2] = out_len * 8 * 2; + + u32x a = MD4M_A; + u32x b = MD4M_B; + u32x c = MD4M_C; + u32x d = MD4M_D; + + MD4_STEP (MD4_Fo, a, b, c, d, w0_t[0], MD4C00, MD4S00); + MD4_STEP (MD4_Fo, d, a, b, c, w0_t[1], MD4C00, MD4S01); + MD4_STEP (MD4_Fo, c, d, a, b, w0_t[2], MD4C00, MD4S02); + MD4_STEP (MD4_Fo, b, c, d, a, w0_t[3], MD4C00, MD4S03); + MD4_STEP (MD4_Fo, a, b, c, d, w1_t[0], MD4C00, MD4S00); + MD4_STEP (MD4_Fo, d, a, b, c, w1_t[1], MD4C00, MD4S01); + MD4_STEP (MD4_Fo, c, d, a, b, w1_t[2], MD4C00, MD4S02); + MD4_STEP (MD4_Fo, b, c, d, a, w1_t[3], MD4C00, MD4S03); + MD4_STEP (MD4_Fo, a, b, c, d, w2_t[0], MD4C00, MD4S00); + MD4_STEP (MD4_Fo, d, a, b, c, w2_t[1], MD4C00, MD4S01); + MD4_STEP (MD4_Fo, c, d, a, b, w2_t[2], MD4C00, MD4S02); + MD4_STEP (MD4_Fo, b, c, d, a, w2_t[3], MD4C00, MD4S03); + MD4_STEP (MD4_Fo, a, b, c, d, w3_t[0], MD4C00, MD4S00); + MD4_STEP (MD4_Fo, d, a, b, c, w3_t[1], MD4C00, MD4S01); + MD4_STEP (MD4_Fo, c, d, a, b, w3_t[2], MD4C00, MD4S02); + MD4_STEP (MD4_Fo, b, c, d, a, w3_t[3], MD4C00, MD4S03); + + MD4_STEP (MD4_Go, a, b, c, d, w0_t[0], MD4C01, MD4S10); + MD4_STEP (MD4_Go, d, a, b, c, w1_t[0], MD4C01, MD4S11); + MD4_STEP (MD4_Go, c, d, a, b, w2_t[0], MD4C01, MD4S12); + MD4_STEP (MD4_Go, b, c, d, a, w3_t[0], MD4C01, MD4S13); + MD4_STEP (MD4_Go, a, b, c, d, w0_t[1], MD4C01, MD4S10); + MD4_STEP (MD4_Go, d, a, b, c, w1_t[1], MD4C01, MD4S11); + MD4_STEP (MD4_Go, c, d, a, b, w2_t[1], MD4C01, MD4S12); + MD4_STEP (MD4_Go, b, c, d, a, w3_t[1], MD4C01, MD4S13); + MD4_STEP (MD4_Go, a, b, c, d, w0_t[2], MD4C01, MD4S10); + MD4_STEP (MD4_Go, d, a, b, c, w1_t[2], MD4C01, MD4S11); + MD4_STEP (MD4_Go, c, d, a, b, w2_t[2], MD4C01, MD4S12); + MD4_STEP (MD4_Go, b, c, d, a, w3_t[2], MD4C01, MD4S13); + MD4_STEP (MD4_Go, a, b, c, d, w0_t[3], MD4C01, MD4S10); + MD4_STEP (MD4_Go, d, a, b, c, w1_t[3], MD4C01, MD4S11); + MD4_STEP (MD4_Go, c, d, a, b, w2_t[3], MD4C01, MD4S12); + MD4_STEP (MD4_Go, b, c, d, a, w3_t[3], MD4C01, MD4S13); + + MD4_STEP (MD4_H , a, b, c, d, w0_t[0], MD4C02, MD4S20); + MD4_STEP (MD4_H , d, a, b, c, w2_t[0], MD4C02, MD4S21); + MD4_STEP (MD4_H , c, d, a, b, w1_t[0], MD4C02, MD4S22); + MD4_STEP (MD4_H , b, c, d, a, w3_t[0], MD4C02, MD4S23); + MD4_STEP (MD4_H , a, b, c, d, w0_t[2], MD4C02, MD4S20); + MD4_STEP (MD4_H , d, a, b, c, w2_t[2], MD4C02, MD4S21); + MD4_STEP (MD4_H , c, d, a, b, w1_t[2], MD4C02, MD4S22); + MD4_STEP (MD4_H , b, c, d, a, w3_t[2], MD4C02, MD4S23); + MD4_STEP (MD4_H , a, b, c, d, w0_t[1], MD4C02, MD4S20); + MD4_STEP (MD4_H , d, a, b, c, w2_t[1], MD4C02, MD4S21); + MD4_STEP (MD4_H , c, d, a, b, w1_t[1], MD4C02, MD4S22); + MD4_STEP (MD4_H , b, c, d, a, w3_t[1], MD4C02, MD4S23); + MD4_STEP (MD4_H , a, b, c, d, w0_t[3], MD4C02, MD4S20); + MD4_STEP (MD4_H , d, a, b, c, w2_t[3], MD4C02, MD4S21); + + if (allx (s2 != ((d + MD4M_D) >> 16))) continue; + + MD4_STEP (MD4_H , c, d, a, b, w1_t[3], MD4C02, MD4S22); + MD4_STEP (MD4_H , b, c, d, a, w3_t[3], MD4C02, MD4S23); + + a += MD4M_A; + b += MD4M_B; + c += MD4M_C; + d += MD4M_D; + + /** + * DES1 + */ + + u32x key[2]; + + transform_netntlmv1_key (a, b, key); + + u32x Kc[16]; + u32x Kd[16]; + + _des_crypt_keysetup (key[0], key[1], Kc, Kd, s_skb); + + u32x iv1[2]; + + _des_crypt_encrypt (iv1, data, Kc, Kd, s_SPtrans); + + /** + * DES2 + */ + + transform_netntlmv1_key (((b >> 24) | (c << 8)), ((c >> 24) | (d << 8)), key); + + _des_crypt_keysetup (key[0], key[1], Kc, Kd, s_skb); + + u32x iv2[2]; + + _des_crypt_encrypt (iv2, data, Kc, Kd, s_SPtrans); + + /** + * compare + */ + + const u32x r0 = iv1[0]; + const u32x r1 = iv1[1]; + const u32x r2 = iv2[0]; + const u32x r3 = iv2[1]; + + #include VECT_COMPARE_M + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m05500_m08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m05500_m16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m05500_s04 (__global pw_t *pws, __global gpu_rule_t * rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + u32x pw_buf1[4]; + + pw_buf1[0] = pws[gid].i[ 4]; + pw_buf1[1] = pws[gid].i[ 5]; + pw_buf1[2] = pws[gid].i[ 6]; + pw_buf1[3] = pws[gid].i[ 7]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * sbox, kbox + */ + + __local u32 s_SPtrans[8][64]; + __local u32 s_skb[8][64]; + + s_SPtrans[0][lid] = c_SPtrans[0][lid]; + s_SPtrans[1][lid] = c_SPtrans[1][lid]; + s_SPtrans[2][lid] = c_SPtrans[2][lid]; + s_SPtrans[3][lid] = c_SPtrans[3][lid]; + s_SPtrans[4][lid] = c_SPtrans[4][lid]; + s_SPtrans[5][lid] = c_SPtrans[5][lid]; + s_SPtrans[6][lid] = c_SPtrans[6][lid]; + s_SPtrans[7][lid] = c_SPtrans[7][lid]; + + s_skb[0][lid] = c_skb[0][lid]; + s_skb[1][lid] = c_skb[1][lid]; + s_skb[2][lid] = c_skb[2][lid]; + s_skb[3][lid] = c_skb[3][lid]; + s_skb[4][lid] = c_skb[4][lid]; + s_skb[5][lid] = c_skb[5][lid]; + s_skb[6][lid] = c_skb[6][lid]; + s_skb[7][lid] = c_skb[7][lid]; + + barrier (CLK_LOCAL_MEM_FENCE); + + if (gid >= gid_max) return; + + /** + * salt + */ + + const u32 s0 = salt_bufs[salt_pos].salt_buf[0]; + const u32 s1 = salt_bufs[salt_pos].salt_buf[1]; + const u32 s2 = salt_bufs[salt_pos].salt_buf[2]; + + u32x data[2]; + + data[0] = s0; + data[1] = s1; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + + w0[0] = pw_buf0[0]; + w0[1] = pw_buf0[1]; + w0[2] = pw_buf0[2]; + w0[3] = pw_buf0[3]; + + u32x w1[4]; + + w1[0] = pw_buf1[0]; + w1[1] = pw_buf1[1]; + w1[2] = pw_buf1[2]; + w1[3] = pw_buf1[3]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 out_len = apply_rules (rules_buf[il_pos].cmds, w0, w1, pw_len); + + append_0x80_2 (w0, w1, out_len); + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + make_unicode (w0, w0_t, w1_t); + make_unicode (w1, w2_t, w3_t); + + w3_t[2] = out_len * 8 * 2; + + u32x a = MD4M_A; + u32x b = MD4M_B; + u32x c = MD4M_C; + u32x d = MD4M_D; + + MD4_STEP (MD4_Fo, a, b, c, d, w0_t[0], MD4C00, MD4S00); + MD4_STEP (MD4_Fo, d, a, b, c, w0_t[1], MD4C00, MD4S01); + MD4_STEP (MD4_Fo, c, d, a, b, w0_t[2], MD4C00, MD4S02); + MD4_STEP (MD4_Fo, b, c, d, a, w0_t[3], MD4C00, MD4S03); + MD4_STEP (MD4_Fo, a, b, c, d, w1_t[0], MD4C00, MD4S00); + MD4_STEP (MD4_Fo, d, a, b, c, w1_t[1], MD4C00, MD4S01); + MD4_STEP (MD4_Fo, c, d, a, b, w1_t[2], MD4C00, MD4S02); + MD4_STEP (MD4_Fo, b, c, d, a, w1_t[3], MD4C00, MD4S03); + MD4_STEP (MD4_Fo, a, b, c, d, w2_t[0], MD4C00, MD4S00); + MD4_STEP (MD4_Fo, d, a, b, c, w2_t[1], MD4C00, MD4S01); + MD4_STEP (MD4_Fo, c, d, a, b, w2_t[2], MD4C00, MD4S02); + MD4_STEP (MD4_Fo, b, c, d, a, w2_t[3], MD4C00, MD4S03); + MD4_STEP (MD4_Fo, a, b, c, d, w3_t[0], MD4C00, MD4S00); + MD4_STEP (MD4_Fo, d, a, b, c, w3_t[1], MD4C00, MD4S01); + MD4_STEP (MD4_Fo, c, d, a, b, w3_t[2], MD4C00, MD4S02); + MD4_STEP (MD4_Fo, b, c, d, a, w3_t[3], MD4C00, MD4S03); + + MD4_STEP (MD4_Go, a, b, c, d, w0_t[0], MD4C01, MD4S10); + MD4_STEP (MD4_Go, d, a, b, c, w1_t[0], MD4C01, MD4S11); + MD4_STEP (MD4_Go, c, d, a, b, w2_t[0], MD4C01, MD4S12); + MD4_STEP (MD4_Go, b, c, d, a, w3_t[0], MD4C01, MD4S13); + MD4_STEP (MD4_Go, a, b, c, d, w0_t[1], MD4C01, MD4S10); + MD4_STEP (MD4_Go, d, a, b, c, w1_t[1], MD4C01, MD4S11); + MD4_STEP (MD4_Go, c, d, a, b, w2_t[1], MD4C01, MD4S12); + MD4_STEP (MD4_Go, b, c, d, a, w3_t[1], MD4C01, MD4S13); + MD4_STEP (MD4_Go, a, b, c, d, w0_t[2], MD4C01, MD4S10); + MD4_STEP (MD4_Go, d, a, b, c, w1_t[2], MD4C01, MD4S11); + MD4_STEP (MD4_Go, c, d, a, b, w2_t[2], MD4C01, MD4S12); + MD4_STEP (MD4_Go, b, c, d, a, w3_t[2], MD4C01, MD4S13); + MD4_STEP (MD4_Go, a, b, c, d, w0_t[3], MD4C01, MD4S10); + MD4_STEP (MD4_Go, d, a, b, c, w1_t[3], MD4C01, MD4S11); + MD4_STEP (MD4_Go, c, d, a, b, w2_t[3], MD4C01, MD4S12); + MD4_STEP (MD4_Go, b, c, d, a, w3_t[3], MD4C01, MD4S13); + + MD4_STEP (MD4_H , a, b, c, d, w0_t[0], MD4C02, MD4S20); + MD4_STEP (MD4_H , d, a, b, c, w2_t[0], MD4C02, MD4S21); + MD4_STEP (MD4_H , c, d, a, b, w1_t[0], MD4C02, MD4S22); + MD4_STEP (MD4_H , b, c, d, a, w3_t[0], MD4C02, MD4S23); + MD4_STEP (MD4_H , a, b, c, d, w0_t[2], MD4C02, MD4S20); + MD4_STEP (MD4_H , d, a, b, c, w2_t[2], MD4C02, MD4S21); + MD4_STEP (MD4_H , c, d, a, b, w1_t[2], MD4C02, MD4S22); + MD4_STEP (MD4_H , b, c, d, a, w3_t[2], MD4C02, MD4S23); + MD4_STEP (MD4_H , a, b, c, d, w0_t[1], MD4C02, MD4S20); + MD4_STEP (MD4_H , d, a, b, c, w2_t[1], MD4C02, MD4S21); + MD4_STEP (MD4_H , c, d, a, b, w1_t[1], MD4C02, MD4S22); + MD4_STEP (MD4_H , b, c, d, a, w3_t[1], MD4C02, MD4S23); + MD4_STEP (MD4_H , a, b, c, d, w0_t[3], MD4C02, MD4S20); + MD4_STEP (MD4_H , d, a, b, c, w2_t[3], MD4C02, MD4S21); + + if (allx (s2 != ((d + MD4M_D) >> 16))) continue; + + MD4_STEP (MD4_H , c, d, a, b, w1_t[3], MD4C02, MD4S22); + MD4_STEP (MD4_H , b, c, d, a, w3_t[3], MD4C02, MD4S23); + + a += MD4M_A; + b += MD4M_B; + c += MD4M_C; + d += MD4M_D; + + /** + * DES1 + */ + + u32x key[2]; + + transform_netntlmv1_key (a, b, key); + + u32x Kc[16]; + u32x Kd[16]; + + _des_crypt_keysetup (key[0], key[1], Kc, Kd, s_skb); + + u32x iv1[2]; + + _des_crypt_encrypt (iv1, data, Kc, Kd, s_SPtrans); + + /** + * DES2 + */ + + /* + transform_netntlmv1_key (((b >> 24) | (c << 8)), ((c >> 24) | (d << 8)), key); + + _des_crypt_keysetup (key[0], key[1], Kc, Kd, s_skb); + + u32x iv2[2]; + + _des_crypt_encrypt (iv2, data, Kc, Kd, s_SPtrans); + */ + + u32x iv2[2]; + + iv2[0] = search[2]; + iv2[1] = search[3]; + + /** + * compare + */ + + const u32x r0 = iv1[0]; + const u32x r1 = iv1[1]; + const u32x r2 = iv2[0]; + const u32x r3 = iv2[1]; + + #include VECT_COMPARE_S + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m05500_s08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m05500_s16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/amd/m05500_a1.cl b/amd/m05500_a1.cl new file mode 100644 index 0000000000..a85924d25b --- /dev/null +++ b/amd/m05500_a1.cl @@ -0,0 +1,1155 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _MD4_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW4 +#define VECT_SIZE4 +#endif + +#ifdef VLIW5 +#define VECT_SIZE4 +#endif + +#define DGST_R0 0 +#define DGST_R1 1 +#define DGST_R2 2 +#define DGST_R3 3 + +#include "include/kernel_functions.c" +#include "types_amd.c" +#include "common_amd.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +#define PERM_OP(a,b,tt,n,m) \ +{ \ + tt = a >> n; \ + tt = tt ^ b; \ + tt = tt & m; \ + b = b ^ tt; \ + tt = tt << n; \ + a = a ^ tt; \ +} + +#define HPERM_OP(a,tt,n,m) \ +{ \ + tt = a << (16 + n); \ + tt = tt ^ a; \ + tt = tt & m; \ + a = a ^ tt; \ + tt = tt >> (16 + n); \ + a = a ^ tt; \ +} + +__constant u32 c_SPtrans[8][64] = +{ + /* nibble 0 */ + 0x02080800, 0x00080000, 0x02000002, 0x02080802, + 0x02000000, 0x00080802, 0x00080002, 0x02000002, + 0x00080802, 0x02080800, 0x02080000, 0x00000802, + 0x02000802, 0x02000000, 0x00000000, 0x00080002, + 0x00080000, 0x00000002, 0x02000800, 0x00080800, + 0x02080802, 0x02080000, 0x00000802, 0x02000800, + 0x00000002, 0x00000800, 0x00080800, 0x02080002, + 0x00000800, 0x02000802, 0x02080002, 0x00000000, + 0x00000000, 0x02080802, 0x02000800, 0x00080002, + 0x02080800, 0x00080000, 0x00000802, 0x02000800, + 0x02080002, 0x00000800, 0x00080800, 0x02000002, + 0x00080802, 0x00000002, 0x02000002, 0x02080000, + 0x02080802, 0x00080800, 0x02080000, 0x02000802, + 0x02000000, 0x00000802, 0x00080002, 0x00000000, + 0x00080000, 0x02000000, 0x02000802, 0x02080800, + 0x00000002, 0x02080002, 0x00000800, 0x00080802, + /* nibble 1 */ + 0x40108010, 0x00000000, 0x00108000, 0x40100000, + 0x40000010, 0x00008010, 0x40008000, 0x00108000, + 0x00008000, 0x40100010, 0x00000010, 0x40008000, + 0x00100010, 0x40108000, 0x40100000, 0x00000010, + 0x00100000, 0x40008010, 0x40100010, 0x00008000, + 0x00108010, 0x40000000, 0x00000000, 0x00100010, + 0x40008010, 0x00108010, 0x40108000, 0x40000010, + 0x40000000, 0x00100000, 0x00008010, 0x40108010, + 0x00100010, 0x40108000, 0x40008000, 0x00108010, + 0x40108010, 0x00100010, 0x40000010, 0x00000000, + 0x40000000, 0x00008010, 0x00100000, 0x40100010, + 0x00008000, 0x40000000, 0x00108010, 0x40008010, + 0x40108000, 0x00008000, 0x00000000, 0x40000010, + 0x00000010, 0x40108010, 0x00108000, 0x40100000, + 0x40100010, 0x00100000, 0x00008010, 0x40008000, + 0x40008010, 0x00000010, 0x40100000, 0x00108000, + /* nibble 2 */ + 0x04000001, 0x04040100, 0x00000100, 0x04000101, + 0x00040001, 0x04000000, 0x04000101, 0x00040100, + 0x04000100, 0x00040000, 0x04040000, 0x00000001, + 0x04040101, 0x00000101, 0x00000001, 0x04040001, + 0x00000000, 0x00040001, 0x04040100, 0x00000100, + 0x00000101, 0x04040101, 0x00040000, 0x04000001, + 0x04040001, 0x04000100, 0x00040101, 0x04040000, + 0x00040100, 0x00000000, 0x04000000, 0x00040101, + 0x04040100, 0x00000100, 0x00000001, 0x00040000, + 0x00000101, 0x00040001, 0x04040000, 0x04000101, + 0x00000000, 0x04040100, 0x00040100, 0x04040001, + 0x00040001, 0x04000000, 0x04040101, 0x00000001, + 0x00040101, 0x04000001, 0x04000000, 0x04040101, + 0x00040000, 0x04000100, 0x04000101, 0x00040100, + 0x04000100, 0x00000000, 0x04040001, 0x00000101, + 0x04000001, 0x00040101, 0x00000100, 0x04040000, + /* nibble 3 */ + 0x00401008, 0x10001000, 0x00000008, 0x10401008, + 0x00000000, 0x10400000, 0x10001008, 0x00400008, + 0x10401000, 0x10000008, 0x10000000, 0x00001008, + 0x10000008, 0x00401008, 0x00400000, 0x10000000, + 0x10400008, 0x00401000, 0x00001000, 0x00000008, + 0x00401000, 0x10001008, 0x10400000, 0x00001000, + 0x00001008, 0x00000000, 0x00400008, 0x10401000, + 0x10001000, 0x10400008, 0x10401008, 0x00400000, + 0x10400008, 0x00001008, 0x00400000, 0x10000008, + 0x00401000, 0x10001000, 0x00000008, 0x10400000, + 0x10001008, 0x00000000, 0x00001000, 0x00400008, + 0x00000000, 0x10400008, 0x10401000, 0x00001000, + 0x10000000, 0x10401008, 0x00401008, 0x00400000, + 0x10401008, 0x00000008, 0x10001000, 0x00401008, + 0x00400008, 0x00401000, 0x10400000, 0x10001008, + 0x00001008, 0x10000000, 0x10000008, 0x10401000, + /* nibble 4 */ + 0x08000000, 0x00010000, 0x00000400, 0x08010420, + 0x08010020, 0x08000400, 0x00010420, 0x08010000, + 0x00010000, 0x00000020, 0x08000020, 0x00010400, + 0x08000420, 0x08010020, 0x08010400, 0x00000000, + 0x00010400, 0x08000000, 0x00010020, 0x00000420, + 0x08000400, 0x00010420, 0x00000000, 0x08000020, + 0x00000020, 0x08000420, 0x08010420, 0x00010020, + 0x08010000, 0x00000400, 0x00000420, 0x08010400, + 0x08010400, 0x08000420, 0x00010020, 0x08010000, + 0x00010000, 0x00000020, 0x08000020, 0x08000400, + 0x08000000, 0x00010400, 0x08010420, 0x00000000, + 0x00010420, 0x08000000, 0x00000400, 0x00010020, + 0x08000420, 0x00000400, 0x00000000, 0x08010420, + 0x08010020, 0x08010400, 0x00000420, 0x00010000, + 0x00010400, 0x08010020, 0x08000400, 0x00000420, + 0x00000020, 0x00010420, 0x08010000, 0x08000020, + /* nibble 5 */ + 0x80000040, 0x00200040, 0x00000000, 0x80202000, + 0x00200040, 0x00002000, 0x80002040, 0x00200000, + 0x00002040, 0x80202040, 0x00202000, 0x80000000, + 0x80002000, 0x80000040, 0x80200000, 0x00202040, + 0x00200000, 0x80002040, 0x80200040, 0x00000000, + 0x00002000, 0x00000040, 0x80202000, 0x80200040, + 0x80202040, 0x80200000, 0x80000000, 0x00002040, + 0x00000040, 0x00202000, 0x00202040, 0x80002000, + 0x00002040, 0x80000000, 0x80002000, 0x00202040, + 0x80202000, 0x00200040, 0x00000000, 0x80002000, + 0x80000000, 0x00002000, 0x80200040, 0x00200000, + 0x00200040, 0x80202040, 0x00202000, 0x00000040, + 0x80202040, 0x00202000, 0x00200000, 0x80002040, + 0x80000040, 0x80200000, 0x00202040, 0x00000000, + 0x00002000, 0x80000040, 0x80002040, 0x80202000, + 0x80200000, 0x00002040, 0x00000040, 0x80200040, + /* nibble 6 */ + 0x00004000, 0x00000200, 0x01000200, 0x01000004, + 0x01004204, 0x00004004, 0x00004200, 0x00000000, + 0x01000000, 0x01000204, 0x00000204, 0x01004000, + 0x00000004, 0x01004200, 0x01004000, 0x00000204, + 0x01000204, 0x00004000, 0x00004004, 0x01004204, + 0x00000000, 0x01000200, 0x01000004, 0x00004200, + 0x01004004, 0x00004204, 0x01004200, 0x00000004, + 0x00004204, 0x01004004, 0x00000200, 0x01000000, + 0x00004204, 0x01004000, 0x01004004, 0x00000204, + 0x00004000, 0x00000200, 0x01000000, 0x01004004, + 0x01000204, 0x00004204, 0x00004200, 0x00000000, + 0x00000200, 0x01000004, 0x00000004, 0x01000200, + 0x00000000, 0x01000204, 0x01000200, 0x00004200, + 0x00000204, 0x00004000, 0x01004204, 0x01000000, + 0x01004200, 0x00000004, 0x00004004, 0x01004204, + 0x01000004, 0x01004200, 0x01004000, 0x00004004, + /* nibble 7 */ + 0x20800080, 0x20820000, 0x00020080, 0x00000000, + 0x20020000, 0x00800080, 0x20800000, 0x20820080, + 0x00000080, 0x20000000, 0x00820000, 0x00020080, + 0x00820080, 0x20020080, 0x20000080, 0x20800000, + 0x00020000, 0x00820080, 0x00800080, 0x20020000, + 0x20820080, 0x20000080, 0x00000000, 0x00820000, + 0x20000000, 0x00800000, 0x20020080, 0x20800080, + 0x00800000, 0x00020000, 0x20820000, 0x00000080, + 0x00800000, 0x00020000, 0x20000080, 0x20820080, + 0x00020080, 0x20000000, 0x00000000, 0x00820000, + 0x20800080, 0x20020080, 0x20020000, 0x00800080, + 0x20820000, 0x00000080, 0x00800080, 0x20020000, + 0x20820080, 0x00800000, 0x20800000, 0x20000080, + 0x00820000, 0x00020080, 0x20020080, 0x20800000, + 0x00000080, 0x20820000, 0x00820080, 0x00000000, + 0x20000000, 0x20800080, 0x00020000, 0x00820080, +}; + +__constant u32 c_skb[8][64] = +{ + /* for C bits (numbered as per FIPS 46) 1 2 3 4 5 6 */ + 0x00000000, 0x00000010, 0x20000000, 0x20000010, + 0x00010000, 0x00010010, 0x20010000, 0x20010010, + 0x00000800, 0x00000810, 0x20000800, 0x20000810, + 0x00010800, 0x00010810, 0x20010800, 0x20010810, + 0x00000020, 0x00000030, 0x20000020, 0x20000030, + 0x00010020, 0x00010030, 0x20010020, 0x20010030, + 0x00000820, 0x00000830, 0x20000820, 0x20000830, + 0x00010820, 0x00010830, 0x20010820, 0x20010830, + 0x00080000, 0x00080010, 0x20080000, 0x20080010, + 0x00090000, 0x00090010, 0x20090000, 0x20090010, + 0x00080800, 0x00080810, 0x20080800, 0x20080810, + 0x00090800, 0x00090810, 0x20090800, 0x20090810, + 0x00080020, 0x00080030, 0x20080020, 0x20080030, + 0x00090020, 0x00090030, 0x20090020, 0x20090030, + 0x00080820, 0x00080830, 0x20080820, 0x20080830, + 0x00090820, 0x00090830, 0x20090820, 0x20090830, + /* for C bits (numbered as per FIPS 46) 7 8 10 11 12 13 */ + 0x00000000, 0x02000000, 0x00002000, 0x02002000, + 0x00200000, 0x02200000, 0x00202000, 0x02202000, + 0x00000004, 0x02000004, 0x00002004, 0x02002004, + 0x00200004, 0x02200004, 0x00202004, 0x02202004, + 0x00000400, 0x02000400, 0x00002400, 0x02002400, + 0x00200400, 0x02200400, 0x00202400, 0x02202400, + 0x00000404, 0x02000404, 0x00002404, 0x02002404, + 0x00200404, 0x02200404, 0x00202404, 0x02202404, + 0x10000000, 0x12000000, 0x10002000, 0x12002000, + 0x10200000, 0x12200000, 0x10202000, 0x12202000, + 0x10000004, 0x12000004, 0x10002004, 0x12002004, + 0x10200004, 0x12200004, 0x10202004, 0x12202004, + 0x10000400, 0x12000400, 0x10002400, 0x12002400, + 0x10200400, 0x12200400, 0x10202400, 0x12202400, + 0x10000404, 0x12000404, 0x10002404, 0x12002404, + 0x10200404, 0x12200404, 0x10202404, 0x12202404, + /* for C bits (numbered as per FIPS 46) 14 15 16 17 19 20 */ + 0x00000000, 0x00000001, 0x00040000, 0x00040001, + 0x01000000, 0x01000001, 0x01040000, 0x01040001, + 0x00000002, 0x00000003, 0x00040002, 0x00040003, + 0x01000002, 0x01000003, 0x01040002, 0x01040003, + 0x00000200, 0x00000201, 0x00040200, 0x00040201, + 0x01000200, 0x01000201, 0x01040200, 0x01040201, + 0x00000202, 0x00000203, 0x00040202, 0x00040203, + 0x01000202, 0x01000203, 0x01040202, 0x01040203, + 0x08000000, 0x08000001, 0x08040000, 0x08040001, + 0x09000000, 0x09000001, 0x09040000, 0x09040001, + 0x08000002, 0x08000003, 0x08040002, 0x08040003, + 0x09000002, 0x09000003, 0x09040002, 0x09040003, + 0x08000200, 0x08000201, 0x08040200, 0x08040201, + 0x09000200, 0x09000201, 0x09040200, 0x09040201, + 0x08000202, 0x08000203, 0x08040202, 0x08040203, + 0x09000202, 0x09000203, 0x09040202, 0x09040203, + /* for C bits (numbered as per FIPS 46) 21 23 24 26 27 28 */ + 0x00000000, 0x00100000, 0x00000100, 0x00100100, + 0x00000008, 0x00100008, 0x00000108, 0x00100108, + 0x00001000, 0x00101000, 0x00001100, 0x00101100, + 0x00001008, 0x00101008, 0x00001108, 0x00101108, + 0x04000000, 0x04100000, 0x04000100, 0x04100100, + 0x04000008, 0x04100008, 0x04000108, 0x04100108, + 0x04001000, 0x04101000, 0x04001100, 0x04101100, + 0x04001008, 0x04101008, 0x04001108, 0x04101108, + 0x00020000, 0x00120000, 0x00020100, 0x00120100, + 0x00020008, 0x00120008, 0x00020108, 0x00120108, + 0x00021000, 0x00121000, 0x00021100, 0x00121100, + 0x00021008, 0x00121008, 0x00021108, 0x00121108, + 0x04020000, 0x04120000, 0x04020100, 0x04120100, + 0x04020008, 0x04120008, 0x04020108, 0x04120108, + 0x04021000, 0x04121000, 0x04021100, 0x04121100, + 0x04021008, 0x04121008, 0x04021108, 0x04121108, + /* for D bits (numbered as per FIPS 46) 1 2 3 4 5 6 */ + 0x00000000, 0x10000000, 0x00010000, 0x10010000, + 0x00000004, 0x10000004, 0x00010004, 0x10010004, + 0x20000000, 0x30000000, 0x20010000, 0x30010000, + 0x20000004, 0x30000004, 0x20010004, 0x30010004, + 0x00100000, 0x10100000, 0x00110000, 0x10110000, + 0x00100004, 0x10100004, 0x00110004, 0x10110004, + 0x20100000, 0x30100000, 0x20110000, 0x30110000, + 0x20100004, 0x30100004, 0x20110004, 0x30110004, + 0x00001000, 0x10001000, 0x00011000, 0x10011000, + 0x00001004, 0x10001004, 0x00011004, 0x10011004, + 0x20001000, 0x30001000, 0x20011000, 0x30011000, + 0x20001004, 0x30001004, 0x20011004, 0x30011004, + 0x00101000, 0x10101000, 0x00111000, 0x10111000, + 0x00101004, 0x10101004, 0x00111004, 0x10111004, + 0x20101000, 0x30101000, 0x20111000, 0x30111000, + 0x20101004, 0x30101004, 0x20111004, 0x30111004, + /* for D bits (numbered as per FIPS 46) 8 9 11 12 13 14 */ + 0x00000000, 0x08000000, 0x00000008, 0x08000008, + 0x00000400, 0x08000400, 0x00000408, 0x08000408, + 0x00020000, 0x08020000, 0x00020008, 0x08020008, + 0x00020400, 0x08020400, 0x00020408, 0x08020408, + 0x00000001, 0x08000001, 0x00000009, 0x08000009, + 0x00000401, 0x08000401, 0x00000409, 0x08000409, + 0x00020001, 0x08020001, 0x00020009, 0x08020009, + 0x00020401, 0x08020401, 0x00020409, 0x08020409, + 0x02000000, 0x0A000000, 0x02000008, 0x0A000008, + 0x02000400, 0x0A000400, 0x02000408, 0x0A000408, + 0x02020000, 0x0A020000, 0x02020008, 0x0A020008, + 0x02020400, 0x0A020400, 0x02020408, 0x0A020408, + 0x02000001, 0x0A000001, 0x02000009, 0x0A000009, + 0x02000401, 0x0A000401, 0x02000409, 0x0A000409, + 0x02020001, 0x0A020001, 0x02020009, 0x0A020009, + 0x02020401, 0x0A020401, 0x02020409, 0x0A020409, + /* for D bits (numbered as per FIPS 46) 16 17 18 19 20 21 */ + 0x00000000, 0x00000100, 0x00080000, 0x00080100, + 0x01000000, 0x01000100, 0x01080000, 0x01080100, + 0x00000010, 0x00000110, 0x00080010, 0x00080110, + 0x01000010, 0x01000110, 0x01080010, 0x01080110, + 0x00200000, 0x00200100, 0x00280000, 0x00280100, + 0x01200000, 0x01200100, 0x01280000, 0x01280100, + 0x00200010, 0x00200110, 0x00280010, 0x00280110, + 0x01200010, 0x01200110, 0x01280010, 0x01280110, + 0x00000200, 0x00000300, 0x00080200, 0x00080300, + 0x01000200, 0x01000300, 0x01080200, 0x01080300, + 0x00000210, 0x00000310, 0x00080210, 0x00080310, + 0x01000210, 0x01000310, 0x01080210, 0x01080310, + 0x00200200, 0x00200300, 0x00280200, 0x00280300, + 0x01200200, 0x01200300, 0x01280200, 0x01280300, + 0x00200210, 0x00200310, 0x00280210, 0x00280310, + 0x01200210, 0x01200310, 0x01280210, 0x01280310, + /* for D bits (numbered as per FIPS 46) 22 23 24 25 27 28 */ + 0x00000000, 0x04000000, 0x00040000, 0x04040000, + 0x00000002, 0x04000002, 0x00040002, 0x04040002, + 0x00002000, 0x04002000, 0x00042000, 0x04042000, + 0x00002002, 0x04002002, 0x00042002, 0x04042002, + 0x00000020, 0x04000020, 0x00040020, 0x04040020, + 0x00000022, 0x04000022, 0x00040022, 0x04040022, + 0x00002020, 0x04002020, 0x00042020, 0x04042020, + 0x00002022, 0x04002022, 0x00042022, 0x04042022, + 0x00000800, 0x04000800, 0x00040800, 0x04040800, + 0x00000802, 0x04000802, 0x00040802, 0x04040802, + 0x00002800, 0x04002800, 0x00042800, 0x04042800, + 0x00002802, 0x04002802, 0x00042802, 0x04042802, + 0x00000820, 0x04000820, 0x00040820, 0x04040820, + 0x00000822, 0x04000822, 0x00040822, 0x04040822, + 0x00002820, 0x04002820, 0x00042820, 0x04042820, + 0x00002822, 0x04002822, 0x00042822, 0x04042822 +}; + +__constant u32 shifts3s0[16] = { 1, 1, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 1 }; +__constant u32 shifts3s1[16] = { 27, 27, 26, 26, 26, 26, 26, 26, 27, 26, 26, 26, 26, 26, 26, 27 }; + +#ifdef VECT_SIZE1 +#define BOX(i,n,S) (u32x) ((S)[(n)][(i)]) +#endif + +#ifdef VECT_SIZE2 +#define BOX(i,n,S) (u32x) ((S)[(n)][(i).s0], (S)[(n)][(i).s1]) +#endif + +#ifdef VECT_SIZE4 +#define BOX(i,n,S) (u32x) ((S)[(n)][(i).s0], (S)[(n)][(i).s1], (S)[(n)][(i).s2], (S)[(n)][(i).s3]) +#endif + +static void _des_crypt_encrypt (u32x iv[2], u32x data[2], u32x Kc[16], u32x Kd[16], __local u32 s_SPtrans[8][64]) +{ + u32x r = data[0]; + u32x l = data[1]; + + #pragma unroll 16 + for (u32 i = 0; i < 16; i += 2) + { + u32x u; + u32x t; + + u = Kc[i + 0] ^ rotl32 (r, 30u); + t = Kd[i + 0] ^ rotl32 (r, 26u); + + l = l + ^ BOX (amd_bfe (u, 0, 6), 0, s_SPtrans) + ^ BOX (amd_bfe (u, 8, 6), 2, s_SPtrans) + ^ BOX (amd_bfe (u, 16, 6), 4, s_SPtrans) + ^ BOX (amd_bfe (u, 24, 6), 6, s_SPtrans) + ^ BOX (amd_bfe (t, 0, 6), 1, s_SPtrans) + ^ BOX (amd_bfe (t, 8, 6), 3, s_SPtrans) + ^ BOX (amd_bfe (t, 16, 6), 5, s_SPtrans) + ^ BOX (amd_bfe (t, 24, 6), 7, s_SPtrans); + + u = Kc[i + 1] ^ rotl32 (l, 30u); + t = Kd[i + 1] ^ rotl32 (l, 26u); + + r = r + ^ BOX (amd_bfe (u, 0, 6), 0, s_SPtrans) + ^ BOX (amd_bfe (u, 8, 6), 2, s_SPtrans) + ^ BOX (amd_bfe (u, 16, 6), 4, s_SPtrans) + ^ BOX (amd_bfe (u, 24, 6), 6, s_SPtrans) + ^ BOX (amd_bfe (t, 0, 6), 1, s_SPtrans) + ^ BOX (amd_bfe (t, 8, 6), 3, s_SPtrans) + ^ BOX (amd_bfe (t, 16, 6), 5, s_SPtrans) + ^ BOX (amd_bfe (t, 24, 6), 7, s_SPtrans); + } + + iv[0] = l; + iv[1] = r; +} + +static void _des_crypt_keysetup (u32x c, u32x d, u32x Kc[16], u32x Kd[16], __local u32 s_skb[8][64]) +{ + u32x tt; + + PERM_OP (d, c, tt, 4, 0x0f0f0f0f); + HPERM_OP (c, tt, 2, 0xcccc0000); + HPERM_OP (d, tt, 2, 0xcccc0000); + PERM_OP (d, c, tt, 1, 0x55555555); + PERM_OP (c, d, tt, 8, 0x00ff00ff); + PERM_OP (d, c, tt, 1, 0x55555555); + + d = ((d & 0x000000ff) << 16) + | ((d & 0x0000ff00) << 0) + | ((d & 0x00ff0000) >> 16) + | ((c & 0xf0000000) >> 4); + + c = c & 0x0fffffff; + + #pragma unroll 16 + for (u32 i = 0; i < 16; i++) + { + c = c >> shifts3s0[i] | c << shifts3s1[i]; + d = d >> shifts3s0[i] | d << shifts3s1[i]; + + c = c & 0x0fffffff; + d = d & 0x0fffffff; + + const u32x c00 = (c >> 0) & 0x0000003f; + const u32x c06 = (c >> 6) & 0x00383003; + const u32x c07 = (c >> 7) & 0x0000003c; + const u32x c13 = (c >> 13) & 0x0000060f; + const u32x c20 = (c >> 20) & 0x00000001; + + u32x s = BOX (((c00 >> 0) & 0xff), 0, s_skb) + | BOX (((c06 >> 0) & 0xff) + |((c07 >> 0) & 0xff), 1, s_skb) + | BOX (((c13 >> 0) & 0xff) + |((c06 >> 8) & 0xff), 2, s_skb) + | BOX (((c20 >> 0) & 0xff) + |((c13 >> 8) & 0xff) + |((c06 >> 16) & 0xff), 3, s_skb); + + const u32x d00 = (d >> 0) & 0x00003c3f; + const u32x d07 = (d >> 7) & 0x00003f03; + const u32x d21 = (d >> 21) & 0x0000000f; + const u32x d22 = (d >> 22) & 0x00000030; + + u32x t = BOX (((d00 >> 0) & 0xff), 4, s_skb) + | BOX (((d07 >> 0) & 0xff) + |((d00 >> 8) & 0xff), 5, s_skb) + | BOX (((d07 >> 8) & 0xff), 6, s_skb) + | BOX (((d21 >> 0) & 0xff) + |((d22 >> 0) & 0xff), 7, s_skb); + + Kc[i] = ((t << 16) | (s & 0x0000ffff)); + Kd[i] = ((s >> 16) | (t & 0xffff0000)); + } +} + +static void transform_netntlmv1_key (const u32x w0, const u32x w1, u32x out[2]) +{ + #ifdef VECT_SIZE1 + const uchar4 t0 = as_uchar4 (w0); + const uchar4 t1 = as_uchar4 (w1); + + uchar4 k0; + uchar4 k1; + + k0.s0 = (t0.s0 >> 0); + k0.s1 = (t0.s0 << 7) | (t0.s1 >> 1); + k0.s2 = (t0.s1 << 6) | (t0.s2 >> 2); + k0.s3 = (t0.s2 << 5) | (t0.s3 >> 3); + k1.s0 = (t0.s3 << 4) | (t1.s0 >> 4); + k1.s1 = (t1.s0 << 3) | (t1.s1 >> 5); + k1.s2 = (t1.s1 << 2) | (t1.s2 >> 6); + k1.s3 = (t1.s2 << 1); + + out[0] = as_uint (k0); + out[1] = as_uint (k1); + #endif + + #ifdef VECT_SIZE2 + const uchar8 t0 = as_uchar8 (w0); + const uchar8 t1 = as_uchar8 (w1); + + uchar8 k0; + uchar8 k1; + + k0.s0 = (t0.s0 >> 0); + k0.s1 = (t0.s0 << 7) | (t0.s1 >> 1); + k0.s2 = (t0.s1 << 6) | (t0.s2 >> 2); + k0.s3 = (t0.s2 << 5) | (t0.s3 >> 3); + k1.s0 = (t0.s3 << 4) | (t1.s0 >> 4); + k1.s1 = (t1.s0 << 3) | (t1.s1 >> 5); + k1.s2 = (t1.s1 << 2) | (t1.s2 >> 6); + k1.s3 = (t1.s2 << 1); + + k0.s4 = (t0.s4 >> 0); + k0.s5 = (t0.s4 << 7) | (t0.s5 >> 1); + k0.s6 = (t0.s5 << 6) | (t0.s6 >> 2); + k0.s7 = (t0.s6 << 5) | (t0.s7 >> 3); + k1.s4 = (t0.s7 << 4) | (t1.s4 >> 4); + k1.s5 = (t1.s4 << 3) | (t1.s5 >> 5); + k1.s6 = (t1.s5 << 2) | (t1.s6 >> 6); + k1.s7 = (t1.s6 << 1); + + out[0] = as_uint2 (k0); + out[1] = as_uint2 (k1); + #endif + + #ifdef VECT_SIZE4 + const uchar16 t0 = as_uchar16 (w0); + const uchar16 t1 = as_uchar16 (w1); + + uchar16 k0; + uchar16 k1; + + k0.s0 = (t0.s0 >> 0); + k0.s1 = (t0.s0 << 7) | (t0.s1 >> 1); + k0.s2 = (t0.s1 << 6) | (t0.s2 >> 2); + k0.s3 = (t0.s2 << 5) | (t0.s3 >> 3); + k1.s0 = (t0.s3 << 4) | (t1.s0 >> 4); + k1.s1 = (t1.s0 << 3) | (t1.s1 >> 5); + k1.s2 = (t1.s1 << 2) | (t1.s2 >> 6); + k1.s3 = (t1.s2 << 1); + + k0.s4 = (t0.s4 >> 0); + k0.s5 = (t0.s4 << 7) | (t0.s5 >> 1); + k0.s6 = (t0.s5 << 6) | (t0.s6 >> 2); + k0.s7 = (t0.s6 << 5) | (t0.s7 >> 3); + k1.s4 = (t0.s7 << 4) | (t1.s4 >> 4); + k1.s5 = (t1.s4 << 3) | (t1.s5 >> 5); + k1.s6 = (t1.s5 << 2) | (t1.s6 >> 6); + k1.s7 = (t1.s6 << 1); + + k0.s8 = (t0.s8 >> 0); + k0.s9 = (t0.s8 << 7) | (t0.s9 >> 1); + k0.sa = (t0.s9 << 6) | (t0.sa >> 2); + k0.sb = (t0.sa << 5) | (t0.sb >> 3); + k1.s8 = (t0.sb << 4) | (t1.s8 >> 4); + k1.s9 = (t1.s8 << 3) | (t1.s9 >> 5); + k1.sa = (t1.s9 << 2) | (t1.sa >> 6); + k1.sb = (t1.sa << 1); + + k0.sc = (t0.sc >> 0); + k0.sd = (t0.sc << 7) | (t0.sd >> 1); + k0.se = (t0.sd << 6) | (t0.se >> 2); + k0.sf = (t0.se << 5) | (t0.sf >> 3); + k1.sc = (t0.sf << 4) | (t1.sc >> 4); + k1.sd = (t1.sc << 3) | (t1.sd >> 5); + k1.se = (t1.sd << 2) | (t1.se >> 6); + k1.sf = (t1.se << 1); + + out[0] = as_uint4 (k0); + out[1] = as_uint4 (k1); + #endif +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m05500_m04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + append_0x80_2 (wordl0, wordl1, pw_l_len); + + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, combs_buf[0].pw_len); + } + + /** + * sbox, kbox + */ + + __local u32 s_SPtrans[8][64]; + __local u32 s_skb[8][64]; + + s_SPtrans[0][lid] = c_SPtrans[0][lid]; + s_SPtrans[1][lid] = c_SPtrans[1][lid]; + s_SPtrans[2][lid] = c_SPtrans[2][lid]; + s_SPtrans[3][lid] = c_SPtrans[3][lid]; + s_SPtrans[4][lid] = c_SPtrans[4][lid]; + s_SPtrans[5][lid] = c_SPtrans[5][lid]; + s_SPtrans[6][lid] = c_SPtrans[6][lid]; + s_SPtrans[7][lid] = c_SPtrans[7][lid]; + + s_skb[0][lid] = c_skb[0][lid]; + s_skb[1][lid] = c_skb[1][lid]; + s_skb[2][lid] = c_skb[2][lid]; + s_skb[3][lid] = c_skb[3][lid]; + s_skb[4][lid] = c_skb[4][lid]; + s_skb[5][lid] = c_skb[5][lid]; + s_skb[6][lid] = c_skb[6][lid]; + s_skb[7][lid] = c_skb[7][lid]; + + barrier (CLK_LOCAL_MEM_FENCE); + + if (gid >= gid_max) return; + + /** + * salt + */ + + const u32 s0 = salt_bufs[salt_pos].salt_buf[0]; + const u32 s1 = salt_bufs[salt_pos].salt_buf[1]; + const u32 s2 = salt_bufs[salt_pos].salt_buf[2]; + + u32x data[2]; + + data[0] = s0; + data[1] = s1; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = combs_buf[il_pos].pw_len; + + const u32 pw_len = pw_l_len + pw_r_len; + + u32 wordr0[4]; + + wordr0[0] = combs_buf[il_pos].i[0]; + wordr0[1] = combs_buf[il_pos].i[1]; + wordr0[2] = combs_buf[il_pos].i[2]; + wordr0[3] = combs_buf[il_pos].i[3]; + + u32 wordr1[4]; + + wordr1[0] = combs_buf[il_pos].i[4]; + wordr1[1] = combs_buf[il_pos].i[5]; + wordr1[2] = combs_buf[il_pos].i[6]; + wordr1[3] = combs_buf[il_pos].i[7]; + + u32 wordr2[4]; + + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + + u32 wordr3[4]; + + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + u32x w0[4]; + + w0[0] = wordl0[0] | wordr0[0]; + w0[1] = wordl0[1] | wordr0[1]; + w0[2] = wordl0[2] | wordr0[2]; + w0[3] = wordl0[3] | wordr0[3]; + + u32x w1[4]; + + w1[0] = wordl1[0] | wordr1[0]; + w1[1] = wordl1[1] | wordr1[1]; + w1[2] = wordl1[2] | wordr1[2]; + w1[3] = wordl1[3] | wordr1[3]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + make_unicode (w0, w0_t, w1_t); + make_unicode (w1, w2_t, w3_t); + + w3_t[2] = pw_len * 8 * 2; + + u32x a = MD4M_A; + u32x b = MD4M_B; + u32x c = MD4M_C; + u32x d = MD4M_D; + + MD4_STEP (MD4_Fo, a, b, c, d, w0_t[0], MD4C00, MD4S00); + MD4_STEP (MD4_Fo, d, a, b, c, w0_t[1], MD4C00, MD4S01); + MD4_STEP (MD4_Fo, c, d, a, b, w0_t[2], MD4C00, MD4S02); + MD4_STEP (MD4_Fo, b, c, d, a, w0_t[3], MD4C00, MD4S03); + MD4_STEP (MD4_Fo, a, b, c, d, w1_t[0], MD4C00, MD4S00); + MD4_STEP (MD4_Fo, d, a, b, c, w1_t[1], MD4C00, MD4S01); + MD4_STEP (MD4_Fo, c, d, a, b, w1_t[2], MD4C00, MD4S02); + MD4_STEP (MD4_Fo, b, c, d, a, w1_t[3], MD4C00, MD4S03); + MD4_STEP (MD4_Fo, a, b, c, d, w2_t[0], MD4C00, MD4S00); + MD4_STEP (MD4_Fo, d, a, b, c, w2_t[1], MD4C00, MD4S01); + MD4_STEP (MD4_Fo, c, d, a, b, w2_t[2], MD4C00, MD4S02); + MD4_STEP (MD4_Fo, b, c, d, a, w2_t[3], MD4C00, MD4S03); + MD4_STEP (MD4_Fo, a, b, c, d, w3_t[0], MD4C00, MD4S00); + MD4_STEP (MD4_Fo, d, a, b, c, w3_t[1], MD4C00, MD4S01); + MD4_STEP (MD4_Fo, c, d, a, b, w3_t[2], MD4C00, MD4S02); + MD4_STEP (MD4_Fo, b, c, d, a, w3_t[3], MD4C00, MD4S03); + + MD4_STEP (MD4_Go, a, b, c, d, w0_t[0], MD4C01, MD4S10); + MD4_STEP (MD4_Go, d, a, b, c, w1_t[0], MD4C01, MD4S11); + MD4_STEP (MD4_Go, c, d, a, b, w2_t[0], MD4C01, MD4S12); + MD4_STEP (MD4_Go, b, c, d, a, w3_t[0], MD4C01, MD4S13); + MD4_STEP (MD4_Go, a, b, c, d, w0_t[1], MD4C01, MD4S10); + MD4_STEP (MD4_Go, d, a, b, c, w1_t[1], MD4C01, MD4S11); + MD4_STEP (MD4_Go, c, d, a, b, w2_t[1], MD4C01, MD4S12); + MD4_STEP (MD4_Go, b, c, d, a, w3_t[1], MD4C01, MD4S13); + MD4_STEP (MD4_Go, a, b, c, d, w0_t[2], MD4C01, MD4S10); + MD4_STEP (MD4_Go, d, a, b, c, w1_t[2], MD4C01, MD4S11); + MD4_STEP (MD4_Go, c, d, a, b, w2_t[2], MD4C01, MD4S12); + MD4_STEP (MD4_Go, b, c, d, a, w3_t[2], MD4C01, MD4S13); + MD4_STEP (MD4_Go, a, b, c, d, w0_t[3], MD4C01, MD4S10); + MD4_STEP (MD4_Go, d, a, b, c, w1_t[3], MD4C01, MD4S11); + MD4_STEP (MD4_Go, c, d, a, b, w2_t[3], MD4C01, MD4S12); + MD4_STEP (MD4_Go, b, c, d, a, w3_t[3], MD4C01, MD4S13); + + MD4_STEP (MD4_H , a, b, c, d, w0_t[0], MD4C02, MD4S20); + MD4_STEP (MD4_H , d, a, b, c, w2_t[0], MD4C02, MD4S21); + MD4_STEP (MD4_H , c, d, a, b, w1_t[0], MD4C02, MD4S22); + MD4_STEP (MD4_H , b, c, d, a, w3_t[0], MD4C02, MD4S23); + MD4_STEP (MD4_H , a, b, c, d, w0_t[2], MD4C02, MD4S20); + MD4_STEP (MD4_H , d, a, b, c, w2_t[2], MD4C02, MD4S21); + MD4_STEP (MD4_H , c, d, a, b, w1_t[2], MD4C02, MD4S22); + MD4_STEP (MD4_H , b, c, d, a, w3_t[2], MD4C02, MD4S23); + MD4_STEP (MD4_H , a, b, c, d, w0_t[1], MD4C02, MD4S20); + MD4_STEP (MD4_H , d, a, b, c, w2_t[1], MD4C02, MD4S21); + MD4_STEP (MD4_H , c, d, a, b, w1_t[1], MD4C02, MD4S22); + MD4_STEP (MD4_H , b, c, d, a, w3_t[1], MD4C02, MD4S23); + MD4_STEP (MD4_H , a, b, c, d, w0_t[3], MD4C02, MD4S20); + MD4_STEP (MD4_H , d, a, b, c, w2_t[3], MD4C02, MD4S21); + + if (allx (s2 != ((d + MD4M_D) >> 16))) continue; + + MD4_STEP (MD4_H , c, d, a, b, w1_t[3], MD4C02, MD4S22); + MD4_STEP (MD4_H , b, c, d, a, w3_t[3], MD4C02, MD4S23); + + a += MD4M_A; + b += MD4M_B; + c += MD4M_C; + d += MD4M_D; + + /** + * DES1 + */ + + u32x key[2]; + + transform_netntlmv1_key (a, b, key); + + u32x Kc[16]; + u32x Kd[16]; + + _des_crypt_keysetup (key[0], key[1], Kc, Kd, s_skb); + + u32x iv1[2]; + + _des_crypt_encrypt (iv1, data, Kc, Kd, s_SPtrans); + + /** + * DES2 + */ + + transform_netntlmv1_key (((b >> 24) | (c << 8)), ((c >> 24) | (d << 8)), key); + + _des_crypt_keysetup (key[0], key[1], Kc, Kd, s_skb); + + u32x iv2[2]; + + _des_crypt_encrypt (iv2, data, Kc, Kd, s_SPtrans); + + /** + * compare + */ + + const u32x r0 = iv1[0]; + const u32x r1 = iv1[1]; + const u32x r2 = iv2[0]; + const u32x r3 = iv2[1]; + + #include VECT_COMPARE_M + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m05500_m08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m05500_m16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m05500_s04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + append_0x80_2 (wordl0, wordl1, pw_l_len); + + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, combs_buf[0].pw_len); + } + + /** + * sbox, kbox + */ + + __local u32 s_SPtrans[8][64]; + __local u32 s_skb[8][64]; + + s_SPtrans[0][lid] = c_SPtrans[0][lid]; + s_SPtrans[1][lid] = c_SPtrans[1][lid]; + s_SPtrans[2][lid] = c_SPtrans[2][lid]; + s_SPtrans[3][lid] = c_SPtrans[3][lid]; + s_SPtrans[4][lid] = c_SPtrans[4][lid]; + s_SPtrans[5][lid] = c_SPtrans[5][lid]; + s_SPtrans[6][lid] = c_SPtrans[6][lid]; + s_SPtrans[7][lid] = c_SPtrans[7][lid]; + + s_skb[0][lid] = c_skb[0][lid]; + s_skb[1][lid] = c_skb[1][lid]; + s_skb[2][lid] = c_skb[2][lid]; + s_skb[3][lid] = c_skb[3][lid]; + s_skb[4][lid] = c_skb[4][lid]; + s_skb[5][lid] = c_skb[5][lid]; + s_skb[6][lid] = c_skb[6][lid]; + s_skb[7][lid] = c_skb[7][lid]; + + barrier (CLK_LOCAL_MEM_FENCE); + + if (gid >= gid_max) return; + + /** + * salt + */ + + const u32 s0 = salt_bufs[salt_pos].salt_buf[0]; + const u32 s1 = salt_bufs[salt_pos].salt_buf[1]; + const u32 s2 = salt_bufs[salt_pos].salt_buf[2]; + + u32x data[2]; + + data[0] = s0; + data[1] = s1; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = combs_buf[il_pos].pw_len; + + const u32 pw_len = pw_l_len + pw_r_len; + + u32 wordr0[4]; + + wordr0[0] = combs_buf[il_pos].i[0]; + wordr0[1] = combs_buf[il_pos].i[1]; + wordr0[2] = combs_buf[il_pos].i[2]; + wordr0[3] = combs_buf[il_pos].i[3]; + + u32 wordr1[4]; + + wordr1[0] = combs_buf[il_pos].i[4]; + wordr1[1] = combs_buf[il_pos].i[5]; + wordr1[2] = combs_buf[il_pos].i[6]; + wordr1[3] = combs_buf[il_pos].i[7]; + + u32 wordr2[4]; + + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + + u32 wordr3[4]; + + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + u32x w0[4]; + + w0[0] = wordl0[0] | wordr0[0]; + w0[1] = wordl0[1] | wordr0[1]; + w0[2] = wordl0[2] | wordr0[2]; + w0[3] = wordl0[3] | wordr0[3]; + + u32x w1[4]; + + w1[0] = wordl1[0] | wordr1[0]; + w1[1] = wordl1[1] | wordr1[1]; + w1[2] = wordl1[2] | wordr1[2]; + w1[3] = wordl1[3] | wordr1[3]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + make_unicode (w0, w0_t, w1_t); + make_unicode (w1, w2_t, w3_t); + + w3_t[2] = pw_len * 8 * 2; + + u32x a = MD4M_A; + u32x b = MD4M_B; + u32x c = MD4M_C; + u32x d = MD4M_D; + + MD4_STEP (MD4_Fo, a, b, c, d, w0_t[0], MD4C00, MD4S00); + MD4_STEP (MD4_Fo, d, a, b, c, w0_t[1], MD4C00, MD4S01); + MD4_STEP (MD4_Fo, c, d, a, b, w0_t[2], MD4C00, MD4S02); + MD4_STEP (MD4_Fo, b, c, d, a, w0_t[3], MD4C00, MD4S03); + MD4_STEP (MD4_Fo, a, b, c, d, w1_t[0], MD4C00, MD4S00); + MD4_STEP (MD4_Fo, d, a, b, c, w1_t[1], MD4C00, MD4S01); + MD4_STEP (MD4_Fo, c, d, a, b, w1_t[2], MD4C00, MD4S02); + MD4_STEP (MD4_Fo, b, c, d, a, w1_t[3], MD4C00, MD4S03); + MD4_STEP (MD4_Fo, a, b, c, d, w2_t[0], MD4C00, MD4S00); + MD4_STEP (MD4_Fo, d, a, b, c, w2_t[1], MD4C00, MD4S01); + MD4_STEP (MD4_Fo, c, d, a, b, w2_t[2], MD4C00, MD4S02); + MD4_STEP (MD4_Fo, b, c, d, a, w2_t[3], MD4C00, MD4S03); + MD4_STEP (MD4_Fo, a, b, c, d, w3_t[0], MD4C00, MD4S00); + MD4_STEP (MD4_Fo, d, a, b, c, w3_t[1], MD4C00, MD4S01); + MD4_STEP (MD4_Fo, c, d, a, b, w3_t[2], MD4C00, MD4S02); + MD4_STEP (MD4_Fo, b, c, d, a, w3_t[3], MD4C00, MD4S03); + + MD4_STEP (MD4_Go, a, b, c, d, w0_t[0], MD4C01, MD4S10); + MD4_STEP (MD4_Go, d, a, b, c, w1_t[0], MD4C01, MD4S11); + MD4_STEP (MD4_Go, c, d, a, b, w2_t[0], MD4C01, MD4S12); + MD4_STEP (MD4_Go, b, c, d, a, w3_t[0], MD4C01, MD4S13); + MD4_STEP (MD4_Go, a, b, c, d, w0_t[1], MD4C01, MD4S10); + MD4_STEP (MD4_Go, d, a, b, c, w1_t[1], MD4C01, MD4S11); + MD4_STEP (MD4_Go, c, d, a, b, w2_t[1], MD4C01, MD4S12); + MD4_STEP (MD4_Go, b, c, d, a, w3_t[1], MD4C01, MD4S13); + MD4_STEP (MD4_Go, a, b, c, d, w0_t[2], MD4C01, MD4S10); + MD4_STEP (MD4_Go, d, a, b, c, w1_t[2], MD4C01, MD4S11); + MD4_STEP (MD4_Go, c, d, a, b, w2_t[2], MD4C01, MD4S12); + MD4_STEP (MD4_Go, b, c, d, a, w3_t[2], MD4C01, MD4S13); + MD4_STEP (MD4_Go, a, b, c, d, w0_t[3], MD4C01, MD4S10); + MD4_STEP (MD4_Go, d, a, b, c, w1_t[3], MD4C01, MD4S11); + MD4_STEP (MD4_Go, c, d, a, b, w2_t[3], MD4C01, MD4S12); + MD4_STEP (MD4_Go, b, c, d, a, w3_t[3], MD4C01, MD4S13); + + MD4_STEP (MD4_H , a, b, c, d, w0_t[0], MD4C02, MD4S20); + MD4_STEP (MD4_H , d, a, b, c, w2_t[0], MD4C02, MD4S21); + MD4_STEP (MD4_H , c, d, a, b, w1_t[0], MD4C02, MD4S22); + MD4_STEP (MD4_H , b, c, d, a, w3_t[0], MD4C02, MD4S23); + MD4_STEP (MD4_H , a, b, c, d, w0_t[2], MD4C02, MD4S20); + MD4_STEP (MD4_H , d, a, b, c, w2_t[2], MD4C02, MD4S21); + MD4_STEP (MD4_H , c, d, a, b, w1_t[2], MD4C02, MD4S22); + MD4_STEP (MD4_H , b, c, d, a, w3_t[2], MD4C02, MD4S23); + MD4_STEP (MD4_H , a, b, c, d, w0_t[1], MD4C02, MD4S20); + MD4_STEP (MD4_H , d, a, b, c, w2_t[1], MD4C02, MD4S21); + MD4_STEP (MD4_H , c, d, a, b, w1_t[1], MD4C02, MD4S22); + MD4_STEP (MD4_H , b, c, d, a, w3_t[1], MD4C02, MD4S23); + MD4_STEP (MD4_H , a, b, c, d, w0_t[3], MD4C02, MD4S20); + MD4_STEP (MD4_H , d, a, b, c, w2_t[3], MD4C02, MD4S21); + + if (allx (s2 != ((d + MD4M_D) >> 16))) continue; + + MD4_STEP (MD4_H , c, d, a, b, w1_t[3], MD4C02, MD4S22); + MD4_STEP (MD4_H , b, c, d, a, w3_t[3], MD4C02, MD4S23); + + a += MD4M_A; + b += MD4M_B; + c += MD4M_C; + d += MD4M_D; + + /** + * DES1 + */ + + u32x key[2]; + + transform_netntlmv1_key (a, b, key); + + u32x Kc[16]; + u32x Kd[16]; + + _des_crypt_keysetup (key[0], key[1], Kc, Kd, s_skb); + + u32x iv1[2]; + + _des_crypt_encrypt (iv1, data, Kc, Kd, s_SPtrans); + + /** + * DES2 + */ + + /* + transform_netntlmv1_key (((b >> 24) | (c << 8)), ((c >> 24) | (d << 8)), key); + + _des_crypt_keysetup (key[0], key[1], Kc, Kd, s_skb); + + u32x iv2[2]; + + _des_crypt_encrypt (iv2, data, Kc, Kd, s_SPtrans); + */ + + u32x iv2[2]; + + iv2[0] = search[2]; + iv2[1] = search[3]; + + /** + * compare + */ + + const u32x r0 = iv1[0]; + const u32x r1 = iv1[1]; + const u32x r2 = iv2[0]; + const u32x r3 = iv2[1]; + + #include VECT_COMPARE_S + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m05500_s08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m05500_s16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/amd/m05500_a3.cl b/amd/m05500_a3.cl new file mode 100644 index 0000000000..f2196acfa9 --- /dev/null +++ b/amd/m05500_a3.cl @@ -0,0 +1,1170 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _MD4_ +#define _SCALAR_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW4 +#define VECT_SIZE4 +#endif + +#ifdef VLIW5 +#define VECT_SIZE4 +#endif + +#define DGST_R0 0 +#define DGST_R1 1 +#define DGST_R2 2 +#define DGST_R3 3 + +#include "include/kernel_functions.c" +#include "types_amd.c" +#include "common_amd.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4_warp.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4_warp.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4_warp.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4_warp.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4_warp.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4_warp.c" +#endif + +#define PERM_OP(a,b,tt,n,m) \ +{ \ + tt = a >> n; \ + tt = tt ^ b; \ + tt = tt & m; \ + b = b ^ tt; \ + tt = tt << n; \ + a = a ^ tt; \ +} + +#define HPERM_OP(a,tt,n,m) \ +{ \ + tt = a << (16 + n); \ + tt = tt ^ a; \ + tt = tt & m; \ + a = a ^ tt; \ + tt = tt >> (16 + n); \ + a = a ^ tt; \ +} + +__constant u32 c_SPtrans[8][64] = +{ + /* nibble 0 */ + 0x02080800, 0x00080000, 0x02000002, 0x02080802, + 0x02000000, 0x00080802, 0x00080002, 0x02000002, + 0x00080802, 0x02080800, 0x02080000, 0x00000802, + 0x02000802, 0x02000000, 0x00000000, 0x00080002, + 0x00080000, 0x00000002, 0x02000800, 0x00080800, + 0x02080802, 0x02080000, 0x00000802, 0x02000800, + 0x00000002, 0x00000800, 0x00080800, 0x02080002, + 0x00000800, 0x02000802, 0x02080002, 0x00000000, + 0x00000000, 0x02080802, 0x02000800, 0x00080002, + 0x02080800, 0x00080000, 0x00000802, 0x02000800, + 0x02080002, 0x00000800, 0x00080800, 0x02000002, + 0x00080802, 0x00000002, 0x02000002, 0x02080000, + 0x02080802, 0x00080800, 0x02080000, 0x02000802, + 0x02000000, 0x00000802, 0x00080002, 0x00000000, + 0x00080000, 0x02000000, 0x02000802, 0x02080800, + 0x00000002, 0x02080002, 0x00000800, 0x00080802, + /* nibble 1 */ + 0x40108010, 0x00000000, 0x00108000, 0x40100000, + 0x40000010, 0x00008010, 0x40008000, 0x00108000, + 0x00008000, 0x40100010, 0x00000010, 0x40008000, + 0x00100010, 0x40108000, 0x40100000, 0x00000010, + 0x00100000, 0x40008010, 0x40100010, 0x00008000, + 0x00108010, 0x40000000, 0x00000000, 0x00100010, + 0x40008010, 0x00108010, 0x40108000, 0x40000010, + 0x40000000, 0x00100000, 0x00008010, 0x40108010, + 0x00100010, 0x40108000, 0x40008000, 0x00108010, + 0x40108010, 0x00100010, 0x40000010, 0x00000000, + 0x40000000, 0x00008010, 0x00100000, 0x40100010, + 0x00008000, 0x40000000, 0x00108010, 0x40008010, + 0x40108000, 0x00008000, 0x00000000, 0x40000010, + 0x00000010, 0x40108010, 0x00108000, 0x40100000, + 0x40100010, 0x00100000, 0x00008010, 0x40008000, + 0x40008010, 0x00000010, 0x40100000, 0x00108000, + /* nibble 2 */ + 0x04000001, 0x04040100, 0x00000100, 0x04000101, + 0x00040001, 0x04000000, 0x04000101, 0x00040100, + 0x04000100, 0x00040000, 0x04040000, 0x00000001, + 0x04040101, 0x00000101, 0x00000001, 0x04040001, + 0x00000000, 0x00040001, 0x04040100, 0x00000100, + 0x00000101, 0x04040101, 0x00040000, 0x04000001, + 0x04040001, 0x04000100, 0x00040101, 0x04040000, + 0x00040100, 0x00000000, 0x04000000, 0x00040101, + 0x04040100, 0x00000100, 0x00000001, 0x00040000, + 0x00000101, 0x00040001, 0x04040000, 0x04000101, + 0x00000000, 0x04040100, 0x00040100, 0x04040001, + 0x00040001, 0x04000000, 0x04040101, 0x00000001, + 0x00040101, 0x04000001, 0x04000000, 0x04040101, + 0x00040000, 0x04000100, 0x04000101, 0x00040100, + 0x04000100, 0x00000000, 0x04040001, 0x00000101, + 0x04000001, 0x00040101, 0x00000100, 0x04040000, + /* nibble 3 */ + 0x00401008, 0x10001000, 0x00000008, 0x10401008, + 0x00000000, 0x10400000, 0x10001008, 0x00400008, + 0x10401000, 0x10000008, 0x10000000, 0x00001008, + 0x10000008, 0x00401008, 0x00400000, 0x10000000, + 0x10400008, 0x00401000, 0x00001000, 0x00000008, + 0x00401000, 0x10001008, 0x10400000, 0x00001000, + 0x00001008, 0x00000000, 0x00400008, 0x10401000, + 0x10001000, 0x10400008, 0x10401008, 0x00400000, + 0x10400008, 0x00001008, 0x00400000, 0x10000008, + 0x00401000, 0x10001000, 0x00000008, 0x10400000, + 0x10001008, 0x00000000, 0x00001000, 0x00400008, + 0x00000000, 0x10400008, 0x10401000, 0x00001000, + 0x10000000, 0x10401008, 0x00401008, 0x00400000, + 0x10401008, 0x00000008, 0x10001000, 0x00401008, + 0x00400008, 0x00401000, 0x10400000, 0x10001008, + 0x00001008, 0x10000000, 0x10000008, 0x10401000, + /* nibble 4 */ + 0x08000000, 0x00010000, 0x00000400, 0x08010420, + 0x08010020, 0x08000400, 0x00010420, 0x08010000, + 0x00010000, 0x00000020, 0x08000020, 0x00010400, + 0x08000420, 0x08010020, 0x08010400, 0x00000000, + 0x00010400, 0x08000000, 0x00010020, 0x00000420, + 0x08000400, 0x00010420, 0x00000000, 0x08000020, + 0x00000020, 0x08000420, 0x08010420, 0x00010020, + 0x08010000, 0x00000400, 0x00000420, 0x08010400, + 0x08010400, 0x08000420, 0x00010020, 0x08010000, + 0x00010000, 0x00000020, 0x08000020, 0x08000400, + 0x08000000, 0x00010400, 0x08010420, 0x00000000, + 0x00010420, 0x08000000, 0x00000400, 0x00010020, + 0x08000420, 0x00000400, 0x00000000, 0x08010420, + 0x08010020, 0x08010400, 0x00000420, 0x00010000, + 0x00010400, 0x08010020, 0x08000400, 0x00000420, + 0x00000020, 0x00010420, 0x08010000, 0x08000020, + /* nibble 5 */ + 0x80000040, 0x00200040, 0x00000000, 0x80202000, + 0x00200040, 0x00002000, 0x80002040, 0x00200000, + 0x00002040, 0x80202040, 0x00202000, 0x80000000, + 0x80002000, 0x80000040, 0x80200000, 0x00202040, + 0x00200000, 0x80002040, 0x80200040, 0x00000000, + 0x00002000, 0x00000040, 0x80202000, 0x80200040, + 0x80202040, 0x80200000, 0x80000000, 0x00002040, + 0x00000040, 0x00202000, 0x00202040, 0x80002000, + 0x00002040, 0x80000000, 0x80002000, 0x00202040, + 0x80202000, 0x00200040, 0x00000000, 0x80002000, + 0x80000000, 0x00002000, 0x80200040, 0x00200000, + 0x00200040, 0x80202040, 0x00202000, 0x00000040, + 0x80202040, 0x00202000, 0x00200000, 0x80002040, + 0x80000040, 0x80200000, 0x00202040, 0x00000000, + 0x00002000, 0x80000040, 0x80002040, 0x80202000, + 0x80200000, 0x00002040, 0x00000040, 0x80200040, + /* nibble 6 */ + 0x00004000, 0x00000200, 0x01000200, 0x01000004, + 0x01004204, 0x00004004, 0x00004200, 0x00000000, + 0x01000000, 0x01000204, 0x00000204, 0x01004000, + 0x00000004, 0x01004200, 0x01004000, 0x00000204, + 0x01000204, 0x00004000, 0x00004004, 0x01004204, + 0x00000000, 0x01000200, 0x01000004, 0x00004200, + 0x01004004, 0x00004204, 0x01004200, 0x00000004, + 0x00004204, 0x01004004, 0x00000200, 0x01000000, + 0x00004204, 0x01004000, 0x01004004, 0x00000204, + 0x00004000, 0x00000200, 0x01000000, 0x01004004, + 0x01000204, 0x00004204, 0x00004200, 0x00000000, + 0x00000200, 0x01000004, 0x00000004, 0x01000200, + 0x00000000, 0x01000204, 0x01000200, 0x00004200, + 0x00000204, 0x00004000, 0x01004204, 0x01000000, + 0x01004200, 0x00000004, 0x00004004, 0x01004204, + 0x01000004, 0x01004200, 0x01004000, 0x00004004, + /* nibble 7 */ + 0x20800080, 0x20820000, 0x00020080, 0x00000000, + 0x20020000, 0x00800080, 0x20800000, 0x20820080, + 0x00000080, 0x20000000, 0x00820000, 0x00020080, + 0x00820080, 0x20020080, 0x20000080, 0x20800000, + 0x00020000, 0x00820080, 0x00800080, 0x20020000, + 0x20820080, 0x20000080, 0x00000000, 0x00820000, + 0x20000000, 0x00800000, 0x20020080, 0x20800080, + 0x00800000, 0x00020000, 0x20820000, 0x00000080, + 0x00800000, 0x00020000, 0x20000080, 0x20820080, + 0x00020080, 0x20000000, 0x00000000, 0x00820000, + 0x20800080, 0x20020080, 0x20020000, 0x00800080, + 0x20820000, 0x00000080, 0x00800080, 0x20020000, + 0x20820080, 0x00800000, 0x20800000, 0x20000080, + 0x00820000, 0x00020080, 0x20020080, 0x20800000, + 0x00000080, 0x20820000, 0x00820080, 0x00000000, + 0x20000000, 0x20800080, 0x00020000, 0x00820080, +}; + +__constant u32 c_skb[8][64] = +{ + /* for C bits (numbered as per FIPS 46) 1 2 3 4 5 6 */ + 0x00000000, 0x00000010, 0x20000000, 0x20000010, + 0x00010000, 0x00010010, 0x20010000, 0x20010010, + 0x00000800, 0x00000810, 0x20000800, 0x20000810, + 0x00010800, 0x00010810, 0x20010800, 0x20010810, + 0x00000020, 0x00000030, 0x20000020, 0x20000030, + 0x00010020, 0x00010030, 0x20010020, 0x20010030, + 0x00000820, 0x00000830, 0x20000820, 0x20000830, + 0x00010820, 0x00010830, 0x20010820, 0x20010830, + 0x00080000, 0x00080010, 0x20080000, 0x20080010, + 0x00090000, 0x00090010, 0x20090000, 0x20090010, + 0x00080800, 0x00080810, 0x20080800, 0x20080810, + 0x00090800, 0x00090810, 0x20090800, 0x20090810, + 0x00080020, 0x00080030, 0x20080020, 0x20080030, + 0x00090020, 0x00090030, 0x20090020, 0x20090030, + 0x00080820, 0x00080830, 0x20080820, 0x20080830, + 0x00090820, 0x00090830, 0x20090820, 0x20090830, + /* for C bits (numbered as per FIPS 46) 7 8 10 11 12 13 */ + 0x00000000, 0x02000000, 0x00002000, 0x02002000, + 0x00200000, 0x02200000, 0x00202000, 0x02202000, + 0x00000004, 0x02000004, 0x00002004, 0x02002004, + 0x00200004, 0x02200004, 0x00202004, 0x02202004, + 0x00000400, 0x02000400, 0x00002400, 0x02002400, + 0x00200400, 0x02200400, 0x00202400, 0x02202400, + 0x00000404, 0x02000404, 0x00002404, 0x02002404, + 0x00200404, 0x02200404, 0x00202404, 0x02202404, + 0x10000000, 0x12000000, 0x10002000, 0x12002000, + 0x10200000, 0x12200000, 0x10202000, 0x12202000, + 0x10000004, 0x12000004, 0x10002004, 0x12002004, + 0x10200004, 0x12200004, 0x10202004, 0x12202004, + 0x10000400, 0x12000400, 0x10002400, 0x12002400, + 0x10200400, 0x12200400, 0x10202400, 0x12202400, + 0x10000404, 0x12000404, 0x10002404, 0x12002404, + 0x10200404, 0x12200404, 0x10202404, 0x12202404, + /* for C bits (numbered as per FIPS 46) 14 15 16 17 19 20 */ + 0x00000000, 0x00000001, 0x00040000, 0x00040001, + 0x01000000, 0x01000001, 0x01040000, 0x01040001, + 0x00000002, 0x00000003, 0x00040002, 0x00040003, + 0x01000002, 0x01000003, 0x01040002, 0x01040003, + 0x00000200, 0x00000201, 0x00040200, 0x00040201, + 0x01000200, 0x01000201, 0x01040200, 0x01040201, + 0x00000202, 0x00000203, 0x00040202, 0x00040203, + 0x01000202, 0x01000203, 0x01040202, 0x01040203, + 0x08000000, 0x08000001, 0x08040000, 0x08040001, + 0x09000000, 0x09000001, 0x09040000, 0x09040001, + 0x08000002, 0x08000003, 0x08040002, 0x08040003, + 0x09000002, 0x09000003, 0x09040002, 0x09040003, + 0x08000200, 0x08000201, 0x08040200, 0x08040201, + 0x09000200, 0x09000201, 0x09040200, 0x09040201, + 0x08000202, 0x08000203, 0x08040202, 0x08040203, + 0x09000202, 0x09000203, 0x09040202, 0x09040203, + /* for C bits (numbered as per FIPS 46) 21 23 24 26 27 28 */ + 0x00000000, 0x00100000, 0x00000100, 0x00100100, + 0x00000008, 0x00100008, 0x00000108, 0x00100108, + 0x00001000, 0x00101000, 0x00001100, 0x00101100, + 0x00001008, 0x00101008, 0x00001108, 0x00101108, + 0x04000000, 0x04100000, 0x04000100, 0x04100100, + 0x04000008, 0x04100008, 0x04000108, 0x04100108, + 0x04001000, 0x04101000, 0x04001100, 0x04101100, + 0x04001008, 0x04101008, 0x04001108, 0x04101108, + 0x00020000, 0x00120000, 0x00020100, 0x00120100, + 0x00020008, 0x00120008, 0x00020108, 0x00120108, + 0x00021000, 0x00121000, 0x00021100, 0x00121100, + 0x00021008, 0x00121008, 0x00021108, 0x00121108, + 0x04020000, 0x04120000, 0x04020100, 0x04120100, + 0x04020008, 0x04120008, 0x04020108, 0x04120108, + 0x04021000, 0x04121000, 0x04021100, 0x04121100, + 0x04021008, 0x04121008, 0x04021108, 0x04121108, + /* for D bits (numbered as per FIPS 46) 1 2 3 4 5 6 */ + 0x00000000, 0x10000000, 0x00010000, 0x10010000, + 0x00000004, 0x10000004, 0x00010004, 0x10010004, + 0x20000000, 0x30000000, 0x20010000, 0x30010000, + 0x20000004, 0x30000004, 0x20010004, 0x30010004, + 0x00100000, 0x10100000, 0x00110000, 0x10110000, + 0x00100004, 0x10100004, 0x00110004, 0x10110004, + 0x20100000, 0x30100000, 0x20110000, 0x30110000, + 0x20100004, 0x30100004, 0x20110004, 0x30110004, + 0x00001000, 0x10001000, 0x00011000, 0x10011000, + 0x00001004, 0x10001004, 0x00011004, 0x10011004, + 0x20001000, 0x30001000, 0x20011000, 0x30011000, + 0x20001004, 0x30001004, 0x20011004, 0x30011004, + 0x00101000, 0x10101000, 0x00111000, 0x10111000, + 0x00101004, 0x10101004, 0x00111004, 0x10111004, + 0x20101000, 0x30101000, 0x20111000, 0x30111000, + 0x20101004, 0x30101004, 0x20111004, 0x30111004, + /* for D bits (numbered as per FIPS 46) 8 9 11 12 13 14 */ + 0x00000000, 0x08000000, 0x00000008, 0x08000008, + 0x00000400, 0x08000400, 0x00000408, 0x08000408, + 0x00020000, 0x08020000, 0x00020008, 0x08020008, + 0x00020400, 0x08020400, 0x00020408, 0x08020408, + 0x00000001, 0x08000001, 0x00000009, 0x08000009, + 0x00000401, 0x08000401, 0x00000409, 0x08000409, + 0x00020001, 0x08020001, 0x00020009, 0x08020009, + 0x00020401, 0x08020401, 0x00020409, 0x08020409, + 0x02000000, 0x0A000000, 0x02000008, 0x0A000008, + 0x02000400, 0x0A000400, 0x02000408, 0x0A000408, + 0x02020000, 0x0A020000, 0x02020008, 0x0A020008, + 0x02020400, 0x0A020400, 0x02020408, 0x0A020408, + 0x02000001, 0x0A000001, 0x02000009, 0x0A000009, + 0x02000401, 0x0A000401, 0x02000409, 0x0A000409, + 0x02020001, 0x0A020001, 0x02020009, 0x0A020009, + 0x02020401, 0x0A020401, 0x02020409, 0x0A020409, + /* for D bits (numbered as per FIPS 46) 16 17 18 19 20 21 */ + 0x00000000, 0x00000100, 0x00080000, 0x00080100, + 0x01000000, 0x01000100, 0x01080000, 0x01080100, + 0x00000010, 0x00000110, 0x00080010, 0x00080110, + 0x01000010, 0x01000110, 0x01080010, 0x01080110, + 0x00200000, 0x00200100, 0x00280000, 0x00280100, + 0x01200000, 0x01200100, 0x01280000, 0x01280100, + 0x00200010, 0x00200110, 0x00280010, 0x00280110, + 0x01200010, 0x01200110, 0x01280010, 0x01280110, + 0x00000200, 0x00000300, 0x00080200, 0x00080300, + 0x01000200, 0x01000300, 0x01080200, 0x01080300, + 0x00000210, 0x00000310, 0x00080210, 0x00080310, + 0x01000210, 0x01000310, 0x01080210, 0x01080310, + 0x00200200, 0x00200300, 0x00280200, 0x00280300, + 0x01200200, 0x01200300, 0x01280200, 0x01280300, + 0x00200210, 0x00200310, 0x00280210, 0x00280310, + 0x01200210, 0x01200310, 0x01280210, 0x01280310, + /* for D bits (numbered as per FIPS 46) 22 23 24 25 27 28 */ + 0x00000000, 0x04000000, 0x00040000, 0x04040000, + 0x00000002, 0x04000002, 0x00040002, 0x04040002, + 0x00002000, 0x04002000, 0x00042000, 0x04042000, + 0x00002002, 0x04002002, 0x00042002, 0x04042002, + 0x00000020, 0x04000020, 0x00040020, 0x04040020, + 0x00000022, 0x04000022, 0x00040022, 0x04040022, + 0x00002020, 0x04002020, 0x00042020, 0x04042020, + 0x00002022, 0x04002022, 0x00042022, 0x04042022, + 0x00000800, 0x04000800, 0x00040800, 0x04040800, + 0x00000802, 0x04000802, 0x00040802, 0x04040802, + 0x00002800, 0x04002800, 0x00042800, 0x04042800, + 0x00002802, 0x04002802, 0x00042802, 0x04042802, + 0x00000820, 0x04000820, 0x00040820, 0x04040820, + 0x00000822, 0x04000822, 0x00040822, 0x04040822, + 0x00002820, 0x04002820, 0x00042820, 0x04042820, + 0x00002822, 0x04002822, 0x00042822, 0x04042822 +}; + +__constant u32 shifts3s0[16] = { 1, 1, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 1 }; +__constant u32 shifts3s1[16] = { 27, 27, 26, 26, 26, 26, 26, 26, 27, 26, 26, 26, 26, 26, 26, 27 }; + +#ifdef VECT_SIZE1 +#define BOX(i,n,S) (u32x) ((S)[(n)][(i)]) +#endif + +#ifdef VECT_SIZE2 +#define BOX(i,n,S) (u32x) ((S)[(n)][(i).s0], (S)[(n)][(i).s1]) +#endif + +#ifdef VECT_SIZE4 +#define BOX(i,n,S) (u32x) ((S)[(n)][(i).s0], (S)[(n)][(i).s1], (S)[(n)][(i).s2], (S)[(n)][(i).s3]) +#endif + +static void _des_crypt_encrypt (u32x iv[2], u32x data[2], u32x Kc[16], u32x Kd[16], __local u32 s_SPtrans[8][64]) +{ + u32x r = data[0]; + u32x l = data[1]; + + #pragma unroll 16 + for (u32 i = 0; i < 16; i += 2) + { + u32x u; + u32x t; + + u = Kc[i + 0] ^ rotl32 (r, 30u); + t = Kd[i + 0] ^ rotl32 (r, 26u); + + l = l + ^ BOX (amd_bfe (u, 0, 6), 0, s_SPtrans) + ^ BOX (amd_bfe (u, 8, 6), 2, s_SPtrans) + ^ BOX (amd_bfe (u, 16, 6), 4, s_SPtrans) + ^ BOX (amd_bfe (u, 24, 6), 6, s_SPtrans) + ^ BOX (amd_bfe (t, 0, 6), 1, s_SPtrans) + ^ BOX (amd_bfe (t, 8, 6), 3, s_SPtrans) + ^ BOX (amd_bfe (t, 16, 6), 5, s_SPtrans) + ^ BOX (amd_bfe (t, 24, 6), 7, s_SPtrans); + + u = Kc[i + 1] ^ rotl32 (l, 30u); + t = Kd[i + 1] ^ rotl32 (l, 26u); + + r = r + ^ BOX (amd_bfe (u, 0, 6), 0, s_SPtrans) + ^ BOX (amd_bfe (u, 8, 6), 2, s_SPtrans) + ^ BOX (amd_bfe (u, 16, 6), 4, s_SPtrans) + ^ BOX (amd_bfe (u, 24, 6), 6, s_SPtrans) + ^ BOX (amd_bfe (t, 0, 6), 1, s_SPtrans) + ^ BOX (amd_bfe (t, 8, 6), 3, s_SPtrans) + ^ BOX (amd_bfe (t, 16, 6), 5, s_SPtrans) + ^ BOX (amd_bfe (t, 24, 6), 7, s_SPtrans); + } + + iv[0] = l; + iv[1] = r; +} + +static void _des_crypt_keysetup (u32x c, u32x d, u32x Kc[16], u32x Kd[16], __local u32 s_skb[8][64]) +{ + u32x tt; + + PERM_OP (d, c, tt, 4, 0x0f0f0f0f); + HPERM_OP (c, tt, 2, 0xcccc0000); + HPERM_OP (d, tt, 2, 0xcccc0000); + PERM_OP (d, c, tt, 1, 0x55555555); + PERM_OP (c, d, tt, 8, 0x00ff00ff); + PERM_OP (d, c, tt, 1, 0x55555555); + + d = ((d & 0x000000ff) << 16) + | ((d & 0x0000ff00) << 0) + | ((d & 0x00ff0000) >> 16) + | ((c & 0xf0000000) >> 4); + + c = c & 0x0fffffff; + + #pragma unroll 16 + for (u32 i = 0; i < 16; i++) + { + c = c >> shifts3s0[i] | c << shifts3s1[i]; + d = d >> shifts3s0[i] | d << shifts3s1[i]; + + c = c & 0x0fffffff; + d = d & 0x0fffffff; + + const u32x c00 = (c >> 0) & 0x0000003f; + const u32x c06 = (c >> 6) & 0x00383003; + const u32x c07 = (c >> 7) & 0x0000003c; + const u32x c13 = (c >> 13) & 0x0000060f; + const u32x c20 = (c >> 20) & 0x00000001; + + u32x s = BOX (((c00 >> 0) & 0xff), 0, s_skb) + | BOX (((c06 >> 0) & 0xff) + |((c07 >> 0) & 0xff), 1, s_skb) + | BOX (((c13 >> 0) & 0xff) + |((c06 >> 8) & 0xff), 2, s_skb) + | BOX (((c20 >> 0) & 0xff) + |((c13 >> 8) & 0xff) + |((c06 >> 16) & 0xff), 3, s_skb); + + const u32x d00 = (d >> 0) & 0x00003c3f; + const u32x d07 = (d >> 7) & 0x00003f03; + const u32x d21 = (d >> 21) & 0x0000000f; + const u32x d22 = (d >> 22) & 0x00000030; + + u32x t = BOX (((d00 >> 0) & 0xff), 4, s_skb) + | BOX (((d07 >> 0) & 0xff) + |((d00 >> 8) & 0xff), 5, s_skb) + | BOX (((d07 >> 8) & 0xff), 6, s_skb) + | BOX (((d21 >> 0) & 0xff) + |((d22 >> 0) & 0xff), 7, s_skb); + + Kc[i] = ((t << 16) | (s & 0x0000ffff)); + Kd[i] = ((s >> 16) | (t & 0xffff0000)); + } +} + +static void transform_netntlmv1_key (const u32x w0, const u32x w1, u32x out[2]) +{ + #ifdef VECT_SIZE1 + const uchar4 t0 = as_uchar4 (w0); + const uchar4 t1 = as_uchar4 (w1); + + uchar4 k0; + uchar4 k1; + + k0.s0 = (t0.s0 >> 0); + k0.s1 = (t0.s0 << 7) | (t0.s1 >> 1); + k0.s2 = (t0.s1 << 6) | (t0.s2 >> 2); + k0.s3 = (t0.s2 << 5) | (t0.s3 >> 3); + k1.s0 = (t0.s3 << 4) | (t1.s0 >> 4); + k1.s1 = (t1.s0 << 3) | (t1.s1 >> 5); + k1.s2 = (t1.s1 << 2) | (t1.s2 >> 6); + k1.s3 = (t1.s2 << 1); + + out[0] = as_uint (k0); + out[1] = as_uint (k1); + #endif + + #ifdef VECT_SIZE2 + const uchar8 t0 = as_uchar8 (w0); + const uchar8 t1 = as_uchar8 (w1); + + uchar8 k0; + uchar8 k1; + + k0.s0 = (t0.s0 >> 0); + k0.s1 = (t0.s0 << 7) | (t0.s1 >> 1); + k0.s2 = (t0.s1 << 6) | (t0.s2 >> 2); + k0.s3 = (t0.s2 << 5) | (t0.s3 >> 3); + k1.s0 = (t0.s3 << 4) | (t1.s0 >> 4); + k1.s1 = (t1.s0 << 3) | (t1.s1 >> 5); + k1.s2 = (t1.s1 << 2) | (t1.s2 >> 6); + k1.s3 = (t1.s2 << 1); + + k0.s4 = (t0.s4 >> 0); + k0.s5 = (t0.s4 << 7) | (t0.s5 >> 1); + k0.s6 = (t0.s5 << 6) | (t0.s6 >> 2); + k0.s7 = (t0.s6 << 5) | (t0.s7 >> 3); + k1.s4 = (t0.s7 << 4) | (t1.s4 >> 4); + k1.s5 = (t1.s4 << 3) | (t1.s5 >> 5); + k1.s6 = (t1.s5 << 2) | (t1.s6 >> 6); + k1.s7 = (t1.s6 << 1); + + out[0] = as_uint2 (k0); + out[1] = as_uint2 (k1); + #endif + + #ifdef VECT_SIZE4 + const uchar16 t0 = as_uchar16 (w0); + const uchar16 t1 = as_uchar16 (w1); + + uchar16 k0; + uchar16 k1; + + k0.s0 = (t0.s0 >> 0); + k0.s1 = (t0.s0 << 7) | (t0.s1 >> 1); + k0.s2 = (t0.s1 << 6) | (t0.s2 >> 2); + k0.s3 = (t0.s2 << 5) | (t0.s3 >> 3); + k1.s0 = (t0.s3 << 4) | (t1.s0 >> 4); + k1.s1 = (t1.s0 << 3) | (t1.s1 >> 5); + k1.s2 = (t1.s1 << 2) | (t1.s2 >> 6); + k1.s3 = (t1.s2 << 1); + + k0.s4 = (t0.s4 >> 0); + k0.s5 = (t0.s4 << 7) | (t0.s5 >> 1); + k0.s6 = (t0.s5 << 6) | (t0.s6 >> 2); + k0.s7 = (t0.s6 << 5) | (t0.s7 >> 3); + k1.s4 = (t0.s7 << 4) | (t1.s4 >> 4); + k1.s5 = (t1.s4 << 3) | (t1.s5 >> 5); + k1.s6 = (t1.s5 << 2) | (t1.s6 >> 6); + k1.s7 = (t1.s6 << 1); + + k0.s8 = (t0.s8 >> 0); + k0.s9 = (t0.s8 << 7) | (t0.s9 >> 1); + k0.sa = (t0.s9 << 6) | (t0.sa >> 2); + k0.sb = (t0.sa << 5) | (t0.sb >> 3); + k1.s8 = (t0.sb << 4) | (t1.s8 >> 4); + k1.s9 = (t1.s8 << 3) | (t1.s9 >> 5); + k1.sa = (t1.s9 << 2) | (t1.sa >> 6); + k1.sb = (t1.sa << 1); + + k0.sc = (t0.sc >> 0); + k0.sd = (t0.sc << 7) | (t0.sd >> 1); + k0.se = (t0.sd << 6) | (t0.se >> 2); + k0.sf = (t0.se << 5) | (t0.sf >> 3); + k1.sc = (t0.sf << 4) | (t1.sc >> 4); + k1.sd = (t1.sc << 3) | (t1.sd >> 5); + k1.se = (t1.sd << 2) | (t1.se >> 6); + k1.sf = (t1.se << 1); + + out[0] = as_uint4 (k0); + out[1] = as_uint4 (k1); + #endif +} + +static void m05500m (__local u32 s_SPtrans[8][64], __local u32 s_skb[8][64], u32 w[16], const u32 pw_len, __global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global u32x * words_buf_r, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset) +{ + /** + * modifier + */ + + const u32 gid = get_global_id (0); + const u32 lid = get_local_id (0); + + /** + * salt + */ + + const u32 s0 = salt_bufs[salt_pos].salt_buf[0]; + const u32 s1 = salt_bufs[salt_pos].salt_buf[1]; + const u32 s2 = salt_bufs[salt_pos].salt_buf[2]; + + u32x data[2]; + + data[0] = s0; + data[1] = s1; + + /** + * loop + */ + + const u32 bf_loops = ceil ((float) bfs_cnt / VECT_DIV); + + u32x w0l = w[0]; + + for (u32 il_pos = 0; il_pos < bf_loops; il_pos++) + { + const u32x w0r = words_buf_r[il_pos]; + + const u32x w0 = w0l | w0r; + + u32x a = MD4M_A; + u32x b = MD4M_B; + u32x c = MD4M_C; + u32x d = MD4M_D; + + #define w0_t w0 + #define w1_t w[ 1] + #define w2_t w[ 2] + #define w3_t w[ 3] + #define w4_t w[ 4] + #define w5_t w[ 5] + #define w6_t w[ 6] + #define w7_t w[ 7] + #define w8_t w[ 8] + #define w9_t w[ 9] + #define wa_t w[10] + #define wb_t w[11] + #define wc_t w[12] + #define wd_t w[13] + #define we_t w[14] + #define wf_t w[15] + + MD4_STEP (MD4_Fo, a, b, c, d, w0_t, MD4C00, MD4S00); + MD4_STEP (MD4_Fo, d, a, b, c, w1_t, MD4C00, MD4S01); + MD4_STEP (MD4_Fo, c, d, a, b, w2_t, MD4C00, MD4S02); + MD4_STEP (MD4_Fo, b, c, d, a, w3_t, MD4C00, MD4S03); + MD4_STEP (MD4_Fo, a, b, c, d, w4_t, MD4C00, MD4S00); + MD4_STEP (MD4_Fo, d, a, b, c, w5_t, MD4C00, MD4S01); + MD4_STEP (MD4_Fo, c, d, a, b, w6_t, MD4C00, MD4S02); + MD4_STEP (MD4_Fo, b, c, d, a, w7_t, MD4C00, MD4S03); + MD4_STEP (MD4_Fo, a, b, c, d, w8_t, MD4C00, MD4S00); + MD4_STEP (MD4_Fo, d, a, b, c, w9_t, MD4C00, MD4S01); + MD4_STEP (MD4_Fo, c, d, a, b, wa_t, MD4C00, MD4S02); + MD4_STEP (MD4_Fo, b, c, d, a, wb_t, MD4C00, MD4S03); + MD4_STEP (MD4_Fo, a, b, c, d, wc_t, MD4C00, MD4S00); + MD4_STEP (MD4_Fo, d, a, b, c, wd_t, MD4C00, MD4S01); + MD4_STEP (MD4_Fo, c, d, a, b, we_t, MD4C00, MD4S02); + MD4_STEP (MD4_Fo, b, c, d, a, wf_t, MD4C00, MD4S03); + + MD4_STEP (MD4_Go, a, b, c, d, w0_t, MD4C01, MD4S10); + MD4_STEP (MD4_Go, d, a, b, c, w4_t, MD4C01, MD4S11); + MD4_STEP (MD4_Go, c, d, a, b, w8_t, MD4C01, MD4S12); + MD4_STEP (MD4_Go, b, c, d, a, wc_t, MD4C01, MD4S13); + MD4_STEP (MD4_Go, a, b, c, d, w1_t, MD4C01, MD4S10); + MD4_STEP (MD4_Go, d, a, b, c, w5_t, MD4C01, MD4S11); + MD4_STEP (MD4_Go, c, d, a, b, w9_t, MD4C01, MD4S12); + MD4_STEP (MD4_Go, b, c, d, a, wd_t, MD4C01, MD4S13); + MD4_STEP (MD4_Go, a, b, c, d, w2_t, MD4C01, MD4S10); + MD4_STEP (MD4_Go, d, a, b, c, w6_t, MD4C01, MD4S11); + MD4_STEP (MD4_Go, c, d, a, b, wa_t, MD4C01, MD4S12); + MD4_STEP (MD4_Go, b, c, d, a, we_t, MD4C01, MD4S13); + MD4_STEP (MD4_Go, a, b, c, d, w3_t, MD4C01, MD4S10); + MD4_STEP (MD4_Go, d, a, b, c, w7_t, MD4C01, MD4S11); + MD4_STEP (MD4_Go, c, d, a, b, wb_t, MD4C01, MD4S12); + MD4_STEP (MD4_Go, b, c, d, a, wf_t, MD4C01, MD4S13); + + MD4_STEP (MD4_H , a, b, c, d, w0_t, MD4C02, MD4S20); + MD4_STEP (MD4_H , d, a, b, c, w8_t, MD4C02, MD4S21); + MD4_STEP (MD4_H , c, d, a, b, w4_t, MD4C02, MD4S22); + MD4_STEP (MD4_H , b, c, d, a, wc_t, MD4C02, MD4S23); + MD4_STEP (MD4_H , a, b, c, d, w2_t, MD4C02, MD4S20); + MD4_STEP (MD4_H , d, a, b, c, wa_t, MD4C02, MD4S21); + MD4_STEP (MD4_H , c, d, a, b, w6_t, MD4C02, MD4S22); + MD4_STEP (MD4_H , b, c, d, a, we_t, MD4C02, MD4S23); + MD4_STEP (MD4_H , a, b, c, d, w1_t, MD4C02, MD4S20); + MD4_STEP (MD4_H , d, a, b, c, w9_t, MD4C02, MD4S21); + MD4_STEP (MD4_H , c, d, a, b, w5_t, MD4C02, MD4S22); + MD4_STEP (MD4_H , b, c, d, a, wd_t, MD4C02, MD4S23); + MD4_STEP (MD4_H , a, b, c, d, w3_t, MD4C02, MD4S20); + MD4_STEP (MD4_H , d, a, b, c, wb_t, MD4C02, MD4S21); + + if (allx (s2 != ((d + MD4M_D) >> 16))) continue; + + MD4_STEP (MD4_H , c, d, a, b, w7_t, MD4C02, MD4S22); + MD4_STEP (MD4_H , b, c, d, a, wf_t, MD4C02, MD4S23); + + a += MD4M_A; + b += MD4M_B; + c += MD4M_C; + d += MD4M_D; + + /** + * DES1 + */ + + u32x key[2]; + + transform_netntlmv1_key (a, b, key); + + u32x Kc[16]; + u32x Kd[16]; + + _des_crypt_keysetup (key[0], key[1], Kc, Kd, s_skb); + + u32x iv1[2]; + + _des_crypt_encrypt (iv1, data, Kc, Kd, s_SPtrans); + + /** + * DES2 + */ + + transform_netntlmv1_key (((b >> 24) | (c << 8)), ((c >> 24) | (d << 8)), key); + + _des_crypt_keysetup (key[0], key[1], Kc, Kd, s_skb); + + u32x iv2[2]; + + _des_crypt_encrypt (iv2, data, Kc, Kd, s_SPtrans); + + /** + * compare + */ + + const u32x r0 = iv1[0]; + const u32x r1 = iv1[1]; + const u32x r2 = iv2[0]; + const u32x r3 = iv2[1]; + + #include VECT_COMPARE_M + } +} + +static void m05500s (__local u32 s_SPtrans[8][64], __local u32 s_skb[8][64], u32 w[16], const u32 pw_len, __global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global u32x * words_buf_r, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset) +{ + /** + * modifier + */ + + const u32 gid = get_global_id (0); + const u32 lid = get_local_id (0); + + /** + * salt + */ + + const u32 s0 = salt_bufs[salt_pos].salt_buf[0]; + const u32 s1 = salt_bufs[salt_pos].salt_buf[1]; + const u32 s2 = salt_bufs[salt_pos].salt_buf[2]; + + u32x data[2]; + + data[0] = s0; + data[1] = s1; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * loop + */ + + const u32 bf_loops = ceil ((float) bfs_cnt / VECT_DIV); + + u32x w0l = w[0]; + + for (u32 il_pos = 0; il_pos < bf_loops; il_pos++) + { + const u32x w0r = words_buf_r[il_pos]; + + const u32x w0 = w0l | w0r; + + u32x a = MD4M_A; + u32x b = MD4M_B; + u32x c = MD4M_C; + u32x d = MD4M_D; + + #define w0_t w0 + #define w1_t w[ 1] + #define w2_t w[ 2] + #define w3_t w[ 3] + #define w4_t w[ 4] + #define w5_t w[ 5] + #define w6_t w[ 6] + #define w7_t w[ 7] + #define w8_t w[ 8] + #define w9_t w[ 9] + #define wa_t w[10] + #define wb_t w[11] + #define wc_t w[12] + #define wd_t w[13] + #define we_t w[14] + #define wf_t w[15] + + MD4_STEP (MD4_Fo, a, b, c, d, w0_t, MD4C00, MD4S00); + MD4_STEP (MD4_Fo, d, a, b, c, w1_t, MD4C00, MD4S01); + MD4_STEP (MD4_Fo, c, d, a, b, w2_t, MD4C00, MD4S02); + MD4_STEP (MD4_Fo, b, c, d, a, w3_t, MD4C00, MD4S03); + MD4_STEP (MD4_Fo, a, b, c, d, w4_t, MD4C00, MD4S00); + MD4_STEP (MD4_Fo, d, a, b, c, w5_t, MD4C00, MD4S01); + MD4_STEP (MD4_Fo, c, d, a, b, w6_t, MD4C00, MD4S02); + MD4_STEP (MD4_Fo, b, c, d, a, w7_t, MD4C00, MD4S03); + MD4_STEP (MD4_Fo, a, b, c, d, w8_t, MD4C00, MD4S00); + MD4_STEP (MD4_Fo, d, a, b, c, w9_t, MD4C00, MD4S01); + MD4_STEP (MD4_Fo, c, d, a, b, wa_t, MD4C00, MD4S02); + MD4_STEP (MD4_Fo, b, c, d, a, wb_t, MD4C00, MD4S03); + MD4_STEP (MD4_Fo, a, b, c, d, wc_t, MD4C00, MD4S00); + MD4_STEP (MD4_Fo, d, a, b, c, wd_t, MD4C00, MD4S01); + MD4_STEP (MD4_Fo, c, d, a, b, we_t, MD4C00, MD4S02); + MD4_STEP (MD4_Fo, b, c, d, a, wf_t, MD4C00, MD4S03); + + MD4_STEP (MD4_Go, a, b, c, d, w0_t, MD4C01, MD4S10); + MD4_STEP (MD4_Go, d, a, b, c, w4_t, MD4C01, MD4S11); + MD4_STEP (MD4_Go, c, d, a, b, w8_t, MD4C01, MD4S12); + MD4_STEP (MD4_Go, b, c, d, a, wc_t, MD4C01, MD4S13); + MD4_STEP (MD4_Go, a, b, c, d, w1_t, MD4C01, MD4S10); + MD4_STEP (MD4_Go, d, a, b, c, w5_t, MD4C01, MD4S11); + MD4_STEP (MD4_Go, c, d, a, b, w9_t, MD4C01, MD4S12); + MD4_STEP (MD4_Go, b, c, d, a, wd_t, MD4C01, MD4S13); + MD4_STEP (MD4_Go, a, b, c, d, w2_t, MD4C01, MD4S10); + MD4_STEP (MD4_Go, d, a, b, c, w6_t, MD4C01, MD4S11); + MD4_STEP (MD4_Go, c, d, a, b, wa_t, MD4C01, MD4S12); + MD4_STEP (MD4_Go, b, c, d, a, we_t, MD4C01, MD4S13); + MD4_STEP (MD4_Go, a, b, c, d, w3_t, MD4C01, MD4S10); + MD4_STEP (MD4_Go, d, a, b, c, w7_t, MD4C01, MD4S11); + MD4_STEP (MD4_Go, c, d, a, b, wb_t, MD4C01, MD4S12); + MD4_STEP (MD4_Go, b, c, d, a, wf_t, MD4C01, MD4S13); + + MD4_STEP (MD4_H , a, b, c, d, w0_t, MD4C02, MD4S20); + MD4_STEP (MD4_H , d, a, b, c, w8_t, MD4C02, MD4S21); + MD4_STEP (MD4_H , c, d, a, b, w4_t, MD4C02, MD4S22); + MD4_STEP (MD4_H , b, c, d, a, wc_t, MD4C02, MD4S23); + MD4_STEP (MD4_H , a, b, c, d, w2_t, MD4C02, MD4S20); + MD4_STEP (MD4_H , d, a, b, c, wa_t, MD4C02, MD4S21); + MD4_STEP (MD4_H , c, d, a, b, w6_t, MD4C02, MD4S22); + MD4_STEP (MD4_H , b, c, d, a, we_t, MD4C02, MD4S23); + MD4_STEP (MD4_H , a, b, c, d, w1_t, MD4C02, MD4S20); + MD4_STEP (MD4_H , d, a, b, c, w9_t, MD4C02, MD4S21); + MD4_STEP (MD4_H , c, d, a, b, w5_t, MD4C02, MD4S22); + MD4_STEP (MD4_H , b, c, d, a, wd_t, MD4C02, MD4S23); + MD4_STEP (MD4_H , a, b, c, d, w3_t, MD4C02, MD4S20); + MD4_STEP (MD4_H , d, a, b, c, wb_t, MD4C02, MD4S21); + + if (allx (s2 != ((d + MD4M_D) >> 16))) continue; + + MD4_STEP (MD4_H , c, d, a, b, w7_t, MD4C02, MD4S22); + MD4_STEP (MD4_H , b, c, d, a, wf_t, MD4C02, MD4S23); + + a += MD4M_A; + b += MD4M_B; + c += MD4M_C; + d += MD4M_D; + + /** + * DES1 + */ + + u32x key[2]; + + transform_netntlmv1_key (a, b, key); + + u32x Kc[16]; + u32x Kd[16]; + + _des_crypt_keysetup (key[0], key[1], Kc, Kd, s_skb); + + u32x iv1[2]; + + _des_crypt_encrypt (iv1, data, Kc, Kd, s_SPtrans); + + /** + * DES2 + */ + + /* + transform_netntlmv1_key (((b >> 24) | (c << 8)), ((c >> 24) | (d << 8)), key); + + _des_crypt_keysetup (key[0], key[1], Kc, Kd, s_skb); + + u32x iv2[2]; + + _des_crypt_encrypt (iv2, data, Kc, Kd, s_SPtrans); + */ + + u32x iv2[2]; + + iv2[0] = search[2]; + iv2[1] = search[3]; + + /** + * compare + */ + + const u32x r0 = iv1[0]; + const u32x r1 = iv1[1]; + const u32x r2 = iv2[0]; + const u32x r3 = iv2[1]; + + #include VECT_COMPARE_S + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m05500_m04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global u32x * words_buf_r, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + const u32 lid = get_local_id (0); + + u32 w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = 0; + w[ 5] = 0; + w[ 6] = 0; + w[ 7] = 0; + w[ 8] = 0; + w[ 9] = 0; + w[10] = 0; + w[11] = 0; + w[12] = 0; + w[13] = 0; + w[14] = pws[gid].i[14]; + w[15] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * sbox, kbox + */ + + __local u32 s_SPtrans[8][64]; + __local u32 s_skb[8][64]; + + s_SPtrans[0][lid] = c_SPtrans[0][lid]; + s_SPtrans[1][lid] = c_SPtrans[1][lid]; + s_SPtrans[2][lid] = c_SPtrans[2][lid]; + s_SPtrans[3][lid] = c_SPtrans[3][lid]; + s_SPtrans[4][lid] = c_SPtrans[4][lid]; + s_SPtrans[5][lid] = c_SPtrans[5][lid]; + s_SPtrans[6][lid] = c_SPtrans[6][lid]; + s_SPtrans[7][lid] = c_SPtrans[7][lid]; + + s_skb[0][lid] = c_skb[0][lid]; + s_skb[1][lid] = c_skb[1][lid]; + s_skb[2][lid] = c_skb[2][lid]; + s_skb[3][lid] = c_skb[3][lid]; + s_skb[4][lid] = c_skb[4][lid]; + s_skb[5][lid] = c_skb[5][lid]; + s_skb[6][lid] = c_skb[6][lid]; + s_skb[7][lid] = c_skb[7][lid]; + + barrier (CLK_LOCAL_MEM_FENCE); + + if (gid >= gid_max) return; + + /** + * main + */ + + m05500m (s_SPtrans, s_skb, w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m05500_m08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global u32x * words_buf_r, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + const u32 lid = get_local_id (0); + + u32 w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = pws[gid].i[ 4]; + w[ 5] = pws[gid].i[ 5]; + w[ 6] = pws[gid].i[ 6]; + w[ 7] = pws[gid].i[ 7]; + w[ 8] = 0; + w[ 9] = 0; + w[10] = 0; + w[11] = 0; + w[12] = 0; + w[13] = 0; + w[14] = pws[gid].i[14]; + w[15] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * sbox, kbox + */ + + __local u32 s_SPtrans[8][64]; + __local u32 s_skb[8][64]; + + s_SPtrans[0][lid] = c_SPtrans[0][lid]; + s_SPtrans[1][lid] = c_SPtrans[1][lid]; + s_SPtrans[2][lid] = c_SPtrans[2][lid]; + s_SPtrans[3][lid] = c_SPtrans[3][lid]; + s_SPtrans[4][lid] = c_SPtrans[4][lid]; + s_SPtrans[5][lid] = c_SPtrans[5][lid]; + s_SPtrans[6][lid] = c_SPtrans[6][lid]; + s_SPtrans[7][lid] = c_SPtrans[7][lid]; + + s_skb[0][lid] = c_skb[0][lid]; + s_skb[1][lid] = c_skb[1][lid]; + s_skb[2][lid] = c_skb[2][lid]; + s_skb[3][lid] = c_skb[3][lid]; + s_skb[4][lid] = c_skb[4][lid]; + s_skb[5][lid] = c_skb[5][lid]; + s_skb[6][lid] = c_skb[6][lid]; + s_skb[7][lid] = c_skb[7][lid]; + + barrier (CLK_LOCAL_MEM_FENCE); + + if (gid >= gid_max) return; + + /** + * main + */ + + m05500m (s_SPtrans, s_skb, w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m05500_m16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global u32x * words_buf_r, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m05500_s04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global u32x * words_buf_r, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + const u32 lid = get_local_id (0); + + u32 w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = 0; + w[ 5] = 0; + w[ 6] = 0; + w[ 7] = 0; + w[ 8] = 0; + w[ 9] = 0; + w[10] = 0; + w[11] = 0; + w[12] = 0; + w[13] = 0; + w[14] = pws[gid].i[14]; + w[15] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * sbox, kbox + */ + + __local u32 s_SPtrans[8][64]; + __local u32 s_skb[8][64]; + + s_SPtrans[0][lid] = c_SPtrans[0][lid]; + s_SPtrans[1][lid] = c_SPtrans[1][lid]; + s_SPtrans[2][lid] = c_SPtrans[2][lid]; + s_SPtrans[3][lid] = c_SPtrans[3][lid]; + s_SPtrans[4][lid] = c_SPtrans[4][lid]; + s_SPtrans[5][lid] = c_SPtrans[5][lid]; + s_SPtrans[6][lid] = c_SPtrans[6][lid]; + s_SPtrans[7][lid] = c_SPtrans[7][lid]; + + s_skb[0][lid] = c_skb[0][lid]; + s_skb[1][lid] = c_skb[1][lid]; + s_skb[2][lid] = c_skb[2][lid]; + s_skb[3][lid] = c_skb[3][lid]; + s_skb[4][lid] = c_skb[4][lid]; + s_skb[5][lid] = c_skb[5][lid]; + s_skb[6][lid] = c_skb[6][lid]; + s_skb[7][lid] = c_skb[7][lid]; + + barrier (CLK_LOCAL_MEM_FENCE); + + if (gid >= gid_max) return; + + /** + * main + */ + + m05500s (s_SPtrans, s_skb, w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m05500_s08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global u32x * words_buf_r, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + const u32 lid = get_local_id (0); + + u32 w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = pws[gid].i[ 4]; + w[ 5] = pws[gid].i[ 5]; + w[ 6] = pws[gid].i[ 6]; + w[ 7] = pws[gid].i[ 7]; + w[ 8] = 0; + w[ 9] = 0; + w[10] = 0; + w[11] = 0; + w[12] = 0; + w[13] = 0; + w[14] = pws[gid].i[14]; + w[15] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * sbox, kbox + */ + + __local u32 s_SPtrans[8][64]; + __local u32 s_skb[8][64]; + + s_SPtrans[0][lid] = c_SPtrans[0][lid]; + s_SPtrans[1][lid] = c_SPtrans[1][lid]; + s_SPtrans[2][lid] = c_SPtrans[2][lid]; + s_SPtrans[3][lid] = c_SPtrans[3][lid]; + s_SPtrans[4][lid] = c_SPtrans[4][lid]; + s_SPtrans[5][lid] = c_SPtrans[5][lid]; + s_SPtrans[6][lid] = c_SPtrans[6][lid]; + s_SPtrans[7][lid] = c_SPtrans[7][lid]; + + s_skb[0][lid] = c_skb[0][lid]; + s_skb[1][lid] = c_skb[1][lid]; + s_skb[2][lid] = c_skb[2][lid]; + s_skb[3][lid] = c_skb[3][lid]; + s_skb[4][lid] = c_skb[4][lid]; + s_skb[5][lid] = c_skb[5][lid]; + s_skb[6][lid] = c_skb[6][lid]; + s_skb[7][lid] = c_skb[7][lid]; + + barrier (CLK_LOCAL_MEM_FENCE); + + if (gid >= gid_max) return; + + /** + * main + */ + + m05500s (s_SPtrans, s_skb, w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m05500_s16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global u32x * words_buf_r, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/amd/m05600_a0.cl b/amd/m05600_a0.cl new file mode 100644 index 0000000000..fdd43e9d60 --- /dev/null +++ b/amd/m05600_a0.cl @@ -0,0 +1,856 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _NETNTLMV2_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW4 +#define VECT_SIZE2 +#endif + +#ifdef VLIW5 +#define VECT_SIZE2 +#endif + +#define DGST_R0 0 +#define DGST_R1 3 +#define DGST_R2 2 +#define DGST_R3 1 + +#include "include/kernel_functions.c" +#include "types_amd.c" +#include "common_amd.c" +#include "include/rp_gpu.h" +#include "rp_amd.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +static void md4_transform (const u32x w0[4], const u32x w1[4], const u32x w2[4], const u32x w3[4], u32x digest[4]) +{ + u32x a = digest[0]; + u32x b = digest[1]; + u32x c = digest[2]; + u32x d = digest[3]; + + u32x w0_t = w0[0]; + u32x w1_t = w0[1]; + u32x w2_t = w0[2]; + u32x w3_t = w0[3]; + u32x w4_t = w1[0]; + u32x w5_t = w1[1]; + u32x w6_t = w1[2]; + u32x w7_t = w1[3]; + u32x w8_t = w2[0]; + u32x w9_t = w2[1]; + u32x wa_t = w2[2]; + u32x wb_t = w2[3]; + u32x wc_t = w3[0]; + u32x wd_t = w3[1]; + u32x we_t = w3[2]; + u32x wf_t = w3[3]; + + MD4_STEP (MD4_Fo, a, b, c, d, w0_t, MD4C00, MD4S00); + MD4_STEP (MD4_Fo, d, a, b, c, w1_t, MD4C00, MD4S01); + MD4_STEP (MD4_Fo, c, d, a, b, w2_t, MD4C00, MD4S02); + MD4_STEP (MD4_Fo, b, c, d, a, w3_t, MD4C00, MD4S03); + MD4_STEP (MD4_Fo, a, b, c, d, w4_t, MD4C00, MD4S00); + MD4_STEP (MD4_Fo, d, a, b, c, w5_t, MD4C00, MD4S01); + MD4_STEP (MD4_Fo, c, d, a, b, w6_t, MD4C00, MD4S02); + MD4_STEP (MD4_Fo, b, c, d, a, w7_t, MD4C00, MD4S03); + MD4_STEP (MD4_Fo, a, b, c, d, w8_t, MD4C00, MD4S00); + MD4_STEP (MD4_Fo, d, a, b, c, w9_t, MD4C00, MD4S01); + MD4_STEP (MD4_Fo, c, d, a, b, wa_t, MD4C00, MD4S02); + MD4_STEP (MD4_Fo, b, c, d, a, wb_t, MD4C00, MD4S03); + MD4_STEP (MD4_Fo, a, b, c, d, wc_t, MD4C00, MD4S00); + MD4_STEP (MD4_Fo, d, a, b, c, wd_t, MD4C00, MD4S01); + MD4_STEP (MD4_Fo, c, d, a, b, we_t, MD4C00, MD4S02); + MD4_STEP (MD4_Fo, b, c, d, a, wf_t, MD4C00, MD4S03); + + MD4_STEP (MD4_Go, a, b, c, d, w0_t, MD4C01, MD4S10); + MD4_STEP (MD4_Go, d, a, b, c, w4_t, MD4C01, MD4S11); + MD4_STEP (MD4_Go, c, d, a, b, w8_t, MD4C01, MD4S12); + MD4_STEP (MD4_Go, b, c, d, a, wc_t, MD4C01, MD4S13); + MD4_STEP (MD4_Go, a, b, c, d, w1_t, MD4C01, MD4S10); + MD4_STEP (MD4_Go, d, a, b, c, w5_t, MD4C01, MD4S11); + MD4_STEP (MD4_Go, c, d, a, b, w9_t, MD4C01, MD4S12); + MD4_STEP (MD4_Go, b, c, d, a, wd_t, MD4C01, MD4S13); + MD4_STEP (MD4_Go, a, b, c, d, w2_t, MD4C01, MD4S10); + MD4_STEP (MD4_Go, d, a, b, c, w6_t, MD4C01, MD4S11); + MD4_STEP (MD4_Go, c, d, a, b, wa_t, MD4C01, MD4S12); + MD4_STEP (MD4_Go, b, c, d, a, we_t, MD4C01, MD4S13); + MD4_STEP (MD4_Go, a, b, c, d, w3_t, MD4C01, MD4S10); + MD4_STEP (MD4_Go, d, a, b, c, w7_t, MD4C01, MD4S11); + MD4_STEP (MD4_Go, c, d, a, b, wb_t, MD4C01, MD4S12); + MD4_STEP (MD4_Go, b, c, d, a, wf_t, MD4C01, MD4S13); + + MD4_STEP (MD4_H , a, b, c, d, w0_t, MD4C02, MD4S20); + MD4_STEP (MD4_H , d, a, b, c, w8_t, MD4C02, MD4S21); + MD4_STEP (MD4_H , c, d, a, b, w4_t, MD4C02, MD4S22); + MD4_STEP (MD4_H , b, c, d, a, wc_t, MD4C02, MD4S23); + MD4_STEP (MD4_H , a, b, c, d, w2_t, MD4C02, MD4S20); + MD4_STEP (MD4_H , d, a, b, c, wa_t, MD4C02, MD4S21); + MD4_STEP (MD4_H , c, d, a, b, w6_t, MD4C02, MD4S22); + MD4_STEP (MD4_H , b, c, d, a, we_t, MD4C02, MD4S23); + MD4_STEP (MD4_H , a, b, c, d, w1_t, MD4C02, MD4S20); + MD4_STEP (MD4_H , d, a, b, c, w9_t, MD4C02, MD4S21); + MD4_STEP (MD4_H , c, d, a, b, w5_t, MD4C02, MD4S22); + MD4_STEP (MD4_H , b, c, d, a, wd_t, MD4C02, MD4S23); + MD4_STEP (MD4_H , a, b, c, d, w3_t, MD4C02, MD4S20); + MD4_STEP (MD4_H , d, a, b, c, wb_t, MD4C02, MD4S21); + MD4_STEP (MD4_H , c, d, a, b, w7_t, MD4C02, MD4S22); + MD4_STEP (MD4_H , b, c, d, a, wf_t, MD4C02, MD4S23); + + digest[0] += a; + digest[1] += b; + digest[2] += c; + digest[3] += d; +} + +static void md5_transform (const u32x w0[4], const u32x w1[4], const u32x w2[4], const u32x w3[4], u32x digest[4]) +{ + u32x a = digest[0]; + u32x b = digest[1]; + u32x c = digest[2]; + u32x d = digest[3]; + + u32x w0_t = w0[0]; + u32x w1_t = w0[1]; + u32x w2_t = w0[2]; + u32x w3_t = w0[3]; + u32x w4_t = w1[0]; + u32x w5_t = w1[1]; + u32x w6_t = w1[2]; + u32x w7_t = w1[3]; + u32x w8_t = w2[0]; + u32x w9_t = w2[1]; + u32x wa_t = w2[2]; + u32x wb_t = w2[3]; + u32x wc_t = w3[0]; + u32x wd_t = w3[1]; + u32x we_t = w3[2]; + u32x wf_t = w3[3]; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t, MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t, MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t, MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t, MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w4_t, MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w5_t, MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w6_t, MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w7_t, MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w8_t, MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w9_t, MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, wa_t, MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, wb_t, MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, wc_t, MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, wd_t, MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, we_t, MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, wf_t, MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w1_t, MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w6_t, MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, wb_t, MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t, MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w5_t, MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, wa_t, MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, wf_t, MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w4_t, MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w9_t, MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, we_t, MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t, MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w8_t, MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, wd_t, MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t, MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w7_t, MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, wc_t, MD5C1f, MD5S13); + + MD5_STEP (MD5_H , a, b, c, d, w5_t, MD5C20, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w8_t, MD5C21, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, wb_t, MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, we_t, MD5C23, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w1_t, MD5C24, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w4_t, MD5C25, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w7_t, MD5C26, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, wa_t, MD5C27, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, wd_t, MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w0_t, MD5C29, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w3_t, MD5C2a, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w6_t, MD5C2b, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w9_t, MD5C2c, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, wc_t, MD5C2d, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, wf_t, MD5C2e, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w2_t, MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t, MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w7_t, MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, we_t, MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w5_t, MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, wc_t, MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t, MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, wa_t, MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t, MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w8_t, MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, wf_t, MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w6_t, MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, wd_t, MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w4_t, MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, wb_t, MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t, MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w9_t, MD5C3f, MD5S33); + + digest[0] += a; + digest[1] += b; + digest[2] += c; + digest[3] += d; +} + +static void hmac_md5_pad (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], u32x ipad[4], u32x opad[4]) +{ + w0[0] = w0[0] ^ 0x36363636; + w0[1] = w0[1] ^ 0x36363636; + w0[2] = w0[2] ^ 0x36363636; + w0[3] = w0[3] ^ 0x36363636; + w1[0] = w1[0] ^ 0x36363636; + w1[1] = w1[1] ^ 0x36363636; + w1[2] = w1[2] ^ 0x36363636; + w1[3] = w1[3] ^ 0x36363636; + w2[0] = w2[0] ^ 0x36363636; + w2[1] = w2[1] ^ 0x36363636; + w2[2] = w2[2] ^ 0x36363636; + w2[3] = w2[3] ^ 0x36363636; + w3[0] = w3[0] ^ 0x36363636; + w3[1] = w3[1] ^ 0x36363636; + w3[2] = w3[2] ^ 0x36363636; + w3[3] = w3[3] ^ 0x36363636; + + ipad[0] = MD5M_A; + ipad[1] = MD5M_B; + ipad[2] = MD5M_C; + ipad[3] = MD5M_D; + + md5_transform (w0, w1, w2, w3, ipad); + + w0[0] = w0[0] ^ 0x6a6a6a6a; + w0[1] = w0[1] ^ 0x6a6a6a6a; + w0[2] = w0[2] ^ 0x6a6a6a6a; + w0[3] = w0[3] ^ 0x6a6a6a6a; + w1[0] = w1[0] ^ 0x6a6a6a6a; + w1[1] = w1[1] ^ 0x6a6a6a6a; + w1[2] = w1[2] ^ 0x6a6a6a6a; + w1[3] = w1[3] ^ 0x6a6a6a6a; + w2[0] = w2[0] ^ 0x6a6a6a6a; + w2[1] = w2[1] ^ 0x6a6a6a6a; + w2[2] = w2[2] ^ 0x6a6a6a6a; + w2[3] = w2[3] ^ 0x6a6a6a6a; + w3[0] = w3[0] ^ 0x6a6a6a6a; + w3[1] = w3[1] ^ 0x6a6a6a6a; + w3[2] = w3[2] ^ 0x6a6a6a6a; + w3[3] = w3[3] ^ 0x6a6a6a6a; + + opad[0] = MD5M_A; + opad[1] = MD5M_B; + opad[2] = MD5M_C; + opad[3] = MD5M_D; + + md5_transform (w0, w1, w2, w3, opad); +} + +static void hmac_md5_run (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], u32x ipad[4], u32x opad[4], u32x digest[4]) +{ + digest[0] = ipad[0]; + digest[1] = ipad[1]; + digest[2] = ipad[2]; + digest[3] = ipad[3]; + + md5_transform (w0, w1, w2, w3, digest); + + w0[0] = digest[0]; + w0[1] = digest[1]; + w0[2] = digest[2]; + w0[3] = digest[3]; + w1[0] = 0x80; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + w3[0] = 0; + w3[1] = 0; + w3[2] = (64 + 16) * 8; + w3[3] = 0; + + digest[0] = opad[0]; + digest[1] = opad[1]; + digest[2] = opad[2]; + digest[3] = opad[3]; + + md5_transform (w0, w1, w2, w3, digest); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m05600_m04 (__global pw_t *pws, __global gpu_rule_t * rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global netntlm_t *netntlm_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + u32x pw_buf1[4]; + + pw_buf1[0] = pws[gid].i[ 4]; + pw_buf1[1] = pws[gid].i[ 5]; + pw_buf1[2] = pws[gid].i[ 6]; + pw_buf1[3] = pws[gid].i[ 7]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * salt + */ + + __local u32 s_userdomain_buf[64]; + __local u32 s_chall_buf[256]; + + const u32 userdomain_len = netntlm_bufs[salt_pos].user_len + + netntlm_bufs[salt_pos].domain_len; + + const u32 chall_len = netntlm_bufs[salt_pos].srvchall_len + + netntlm_bufs[salt_pos].clichall_len; + + if (lid < 64) + { + s_userdomain_buf[lid] = netntlm_bufs[salt_pos].userdomain_buf[lid]; + } + + const u32 lid4 = lid * 4; + + s_chall_buf[lid4 + 0] = netntlm_bufs[salt_pos].chall_buf[lid4 + 0]; + s_chall_buf[lid4 + 1] = netntlm_bufs[salt_pos].chall_buf[lid4 + 1]; + s_chall_buf[lid4 + 2] = netntlm_bufs[salt_pos].chall_buf[lid4 + 2]; + s_chall_buf[lid4 + 3] = netntlm_bufs[salt_pos].chall_buf[lid4 + 3]; + + barrier (CLK_LOCAL_MEM_FENCE); + + if (gid >= gid_max) return; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + + w0[0] = pw_buf0[0]; + w0[1] = pw_buf0[1]; + w0[2] = pw_buf0[2]; + w0[3] = pw_buf0[3]; + + u32x w1[4]; + + w1[0] = pw_buf1[0]; + w1[1] = pw_buf1[1]; + w1[2] = pw_buf1[2]; + w1[3] = pw_buf1[3]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 out_len = apply_rules (rules_buf[il_pos].cmds, w0, w1, pw_len); + + append_0x80_2 (w0, w1, out_len); + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + make_unicode (w0, w0_t, w1_t); + make_unicode (w1, w2_t, w3_t); + + w3_t[2] = out_len * 8 * 2; + + u32x digest[4]; + + digest[0] = MD4M_A; + digest[1] = MD4M_B; + digest[2] = MD4M_C; + digest[3] = MD4M_D; + + md4_transform (w0_t, w1_t, w2_t, w3_t, digest); + + w0_t[0] = digest[0]; + w0_t[1] = digest[1]; + w0_t[2] = digest[2]; + w0_t[3] = digest[3]; + w1_t[0] = 0; + w1_t[1] = 0; + w1_t[2] = 0; + w1_t[3] = 0; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = 0; + + digest[0] = MD5M_A; + digest[1] = MD5M_B; + digest[2] = MD5M_C; + digest[3] = MD5M_D; + + u32x ipad[4]; + u32x opad[4]; + + hmac_md5_pad (w0_t, w1_t, w2_t, w3_t, ipad, opad); + + int left; + int off; + + for (left = userdomain_len, off = 0; left >= 56; left -= 64, off += 16) + { + w0_t[0] = s_userdomain_buf[off + 0]; + w0_t[1] = s_userdomain_buf[off + 1]; + w0_t[2] = s_userdomain_buf[off + 2]; + w0_t[3] = s_userdomain_buf[off + 3]; + w1_t[0] = s_userdomain_buf[off + 4]; + w1_t[1] = s_userdomain_buf[off + 5]; + w1_t[2] = s_userdomain_buf[off + 6]; + w1_t[3] = s_userdomain_buf[off + 7]; + w2_t[0] = s_userdomain_buf[off + 8]; + w2_t[1] = s_userdomain_buf[off + 9]; + w2_t[2] = s_userdomain_buf[off + 10]; + w2_t[3] = s_userdomain_buf[off + 11]; + w3_t[0] = s_userdomain_buf[off + 12]; + w3_t[1] = s_userdomain_buf[off + 13]; + w3_t[2] = s_userdomain_buf[off + 14]; + w3_t[3] = s_userdomain_buf[off + 15]; + + md5_transform (w0_t, w1_t, w2_t, w3_t, ipad); + } + + w0_t[0] = s_userdomain_buf[off + 0]; + w0_t[1] = s_userdomain_buf[off + 1]; + w0_t[2] = s_userdomain_buf[off + 2]; + w0_t[3] = s_userdomain_buf[off + 3]; + w1_t[0] = s_userdomain_buf[off + 4]; + w1_t[1] = s_userdomain_buf[off + 5]; + w1_t[2] = s_userdomain_buf[off + 6]; + w1_t[3] = s_userdomain_buf[off + 7]; + w2_t[0] = s_userdomain_buf[off + 8]; + w2_t[1] = s_userdomain_buf[off + 9]; + w2_t[2] = s_userdomain_buf[off + 10]; + w2_t[3] = s_userdomain_buf[off + 11]; + w3_t[0] = s_userdomain_buf[off + 12]; + w3_t[1] = s_userdomain_buf[off + 13]; + w3_t[2] = (64 + userdomain_len) * 8; + w3_t[3] = 0; + + hmac_md5_run (w0_t, w1_t, w2_t, w3_t, ipad, opad, digest); + + w0_t[0] = digest[0]; + w0_t[1] = digest[1]; + w0_t[2] = digest[2]; + w0_t[3] = digest[3]; + w1_t[0] = 0; + w1_t[1] = 0; + w1_t[2] = 0; + w1_t[3] = 0; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = 0; + + digest[0] = MD5M_A; + digest[1] = MD5M_B; + digest[2] = MD5M_C; + digest[3] = MD5M_D; + + hmac_md5_pad (w0_t, w1_t, w2_t, w3_t, ipad, opad); + + for (left = chall_len, off = 0; left >= 56; left -= 64, off += 16) + { + w0_t[0] = s_chall_buf[off + 0]; + w0_t[1] = s_chall_buf[off + 1]; + w0_t[2] = s_chall_buf[off + 2]; + w0_t[3] = s_chall_buf[off + 3]; + w1_t[0] = s_chall_buf[off + 4]; + w1_t[1] = s_chall_buf[off + 5]; + w1_t[2] = s_chall_buf[off + 6]; + w1_t[3] = s_chall_buf[off + 7]; + w2_t[0] = s_chall_buf[off + 8]; + w2_t[1] = s_chall_buf[off + 9]; + w2_t[2] = s_chall_buf[off + 10]; + w2_t[3] = s_chall_buf[off + 11]; + w3_t[0] = s_chall_buf[off + 12]; + w3_t[1] = s_chall_buf[off + 13]; + w3_t[2] = s_chall_buf[off + 14]; + w3_t[3] = s_chall_buf[off + 15]; + + md5_transform (w0_t, w1_t, w2_t, w3_t, ipad); + } + + w0_t[0] = s_chall_buf[off + 0]; + w0_t[1] = s_chall_buf[off + 1]; + w0_t[2] = s_chall_buf[off + 2]; + w0_t[3] = s_chall_buf[off + 3]; + w1_t[0] = s_chall_buf[off + 4]; + w1_t[1] = s_chall_buf[off + 5]; + w1_t[2] = s_chall_buf[off + 6]; + w1_t[3] = s_chall_buf[off + 7]; + w2_t[0] = s_chall_buf[off + 8]; + w2_t[1] = s_chall_buf[off + 9]; + w2_t[2] = s_chall_buf[off + 10]; + w2_t[3] = s_chall_buf[off + 11]; + w3_t[0] = s_chall_buf[off + 12]; + w3_t[1] = s_chall_buf[off + 13]; + w3_t[2] = (64 + chall_len) * 8; + w3_t[3] = 0; + + hmac_md5_run (w0_t, w1_t, w2_t, w3_t, ipad, opad, digest); + + const u32x r0 = digest[0]; + const u32x r1 = digest[3]; + const u32x r2 = digest[2]; + const u32x r3 = digest[1]; + + #include VECT_COMPARE_M + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m05600_m08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global netntlm_t *netntlm_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m05600_m16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global netntlm_t *netntlm_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m05600_s04 (__global pw_t *pws, __global gpu_rule_t * rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global netntlm_t *netntlm_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + u32x pw_buf1[4]; + + pw_buf1[0] = pws[gid].i[ 4]; + pw_buf1[1] = pws[gid].i[ 5]; + pw_buf1[2] = pws[gid].i[ 6]; + pw_buf1[3] = pws[gid].i[ 7]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * salt + */ + + __local u32 s_userdomain_buf[64]; + __local u32 s_chall_buf[256]; + + const u32 userdomain_len = netntlm_bufs[salt_pos].user_len + + netntlm_bufs[salt_pos].domain_len; + + const u32 chall_len = netntlm_bufs[salt_pos].srvchall_len + + netntlm_bufs[salt_pos].clichall_len; + + if (lid < 64) + { + s_userdomain_buf[lid] = netntlm_bufs[salt_pos].userdomain_buf[lid]; + } + + const u32 lid4 = lid * 4; + + s_chall_buf[lid4 + 0] = netntlm_bufs[salt_pos].chall_buf[lid4 + 0]; + s_chall_buf[lid4 + 1] = netntlm_bufs[salt_pos].chall_buf[lid4 + 1]; + s_chall_buf[lid4 + 2] = netntlm_bufs[salt_pos].chall_buf[lid4 + 2]; + s_chall_buf[lid4 + 3] = netntlm_bufs[salt_pos].chall_buf[lid4 + 3]; + + barrier (CLK_LOCAL_MEM_FENCE); + + if (gid >= gid_max) return; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + + w0[0] = pw_buf0[0]; + w0[1] = pw_buf0[1]; + w0[2] = pw_buf0[2]; + w0[3] = pw_buf0[3]; + + u32x w1[4]; + + w1[0] = pw_buf1[0]; + w1[1] = pw_buf1[1]; + w1[2] = pw_buf1[2]; + w1[3] = pw_buf1[3]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 out_len = apply_rules (rules_buf[il_pos].cmds, w0, w1, pw_len); + + append_0x80_2 (w0, w1, out_len); + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + make_unicode (w0, w0_t, w1_t); + make_unicode (w1, w2_t, w3_t); + + w3_t[2] = out_len * 8 * 2; + + u32x digest[4]; + + digest[0] = MD4M_A; + digest[1] = MD4M_B; + digest[2] = MD4M_C; + digest[3] = MD4M_D; + + md4_transform (w0_t, w1_t, w2_t, w3_t, digest); + + w0_t[0] = digest[0]; + w0_t[1] = digest[1]; + w0_t[2] = digest[2]; + w0_t[3] = digest[3]; + w1_t[0] = 0; + w1_t[1] = 0; + w1_t[2] = 0; + w1_t[3] = 0; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = 0; + + digest[0] = MD5M_A; + digest[1] = MD5M_B; + digest[2] = MD5M_C; + digest[3] = MD5M_D; + + u32x ipad[4]; + u32x opad[4]; + + hmac_md5_pad (w0_t, w1_t, w2_t, w3_t, ipad, opad); + + int left; + int off; + + for (left = userdomain_len, off = 0; left >= 56; left -= 64, off += 16) + { + w0_t[0] = s_userdomain_buf[off + 0]; + w0_t[1] = s_userdomain_buf[off + 1]; + w0_t[2] = s_userdomain_buf[off + 2]; + w0_t[3] = s_userdomain_buf[off + 3]; + w1_t[0] = s_userdomain_buf[off + 4]; + w1_t[1] = s_userdomain_buf[off + 5]; + w1_t[2] = s_userdomain_buf[off + 6]; + w1_t[3] = s_userdomain_buf[off + 7]; + w2_t[0] = s_userdomain_buf[off + 8]; + w2_t[1] = s_userdomain_buf[off + 9]; + w2_t[2] = s_userdomain_buf[off + 10]; + w2_t[3] = s_userdomain_buf[off + 11]; + w3_t[0] = s_userdomain_buf[off + 12]; + w3_t[1] = s_userdomain_buf[off + 13]; + w3_t[2] = s_userdomain_buf[off + 14]; + w3_t[3] = s_userdomain_buf[off + 15]; + + md5_transform (w0_t, w1_t, w2_t, w3_t, ipad); + } + + w0_t[0] = s_userdomain_buf[off + 0]; + w0_t[1] = s_userdomain_buf[off + 1]; + w0_t[2] = s_userdomain_buf[off + 2]; + w0_t[3] = s_userdomain_buf[off + 3]; + w1_t[0] = s_userdomain_buf[off + 4]; + w1_t[1] = s_userdomain_buf[off + 5]; + w1_t[2] = s_userdomain_buf[off + 6]; + w1_t[3] = s_userdomain_buf[off + 7]; + w2_t[0] = s_userdomain_buf[off + 8]; + w2_t[1] = s_userdomain_buf[off + 9]; + w2_t[2] = s_userdomain_buf[off + 10]; + w2_t[3] = s_userdomain_buf[off + 11]; + w3_t[0] = s_userdomain_buf[off + 12]; + w3_t[1] = s_userdomain_buf[off + 13]; + w3_t[2] = (64 + userdomain_len) * 8; + w3_t[3] = 0; + + hmac_md5_run (w0_t, w1_t, w2_t, w3_t, ipad, opad, digest); + + w0_t[0] = digest[0]; + w0_t[1] = digest[1]; + w0_t[2] = digest[2]; + w0_t[3] = digest[3]; + w1_t[0] = 0; + w1_t[1] = 0; + w1_t[2] = 0; + w1_t[3] = 0; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = 0; + + digest[0] = MD5M_A; + digest[1] = MD5M_B; + digest[2] = MD5M_C; + digest[3] = MD5M_D; + + hmac_md5_pad (w0_t, w1_t, w2_t, w3_t, ipad, opad); + + for (left = chall_len, off = 0; left >= 56; left -= 64, off += 16) + { + w0_t[0] = s_chall_buf[off + 0]; + w0_t[1] = s_chall_buf[off + 1]; + w0_t[2] = s_chall_buf[off + 2]; + w0_t[3] = s_chall_buf[off + 3]; + w1_t[0] = s_chall_buf[off + 4]; + w1_t[1] = s_chall_buf[off + 5]; + w1_t[2] = s_chall_buf[off + 6]; + w1_t[3] = s_chall_buf[off + 7]; + w2_t[0] = s_chall_buf[off + 8]; + w2_t[1] = s_chall_buf[off + 9]; + w2_t[2] = s_chall_buf[off + 10]; + w2_t[3] = s_chall_buf[off + 11]; + w3_t[0] = s_chall_buf[off + 12]; + w3_t[1] = s_chall_buf[off + 13]; + w3_t[2] = s_chall_buf[off + 14]; + w3_t[3] = s_chall_buf[off + 15]; + + md5_transform (w0_t, w1_t, w2_t, w3_t, ipad); + } + + w0_t[0] = s_chall_buf[off + 0]; + w0_t[1] = s_chall_buf[off + 1]; + w0_t[2] = s_chall_buf[off + 2]; + w0_t[3] = s_chall_buf[off + 3]; + w1_t[0] = s_chall_buf[off + 4]; + w1_t[1] = s_chall_buf[off + 5]; + w1_t[2] = s_chall_buf[off + 6]; + w1_t[3] = s_chall_buf[off + 7]; + w2_t[0] = s_chall_buf[off + 8]; + w2_t[1] = s_chall_buf[off + 9]; + w2_t[2] = s_chall_buf[off + 10]; + w2_t[3] = s_chall_buf[off + 11]; + w3_t[0] = s_chall_buf[off + 12]; + w3_t[1] = s_chall_buf[off + 13]; + w3_t[2] = (64 + chall_len) * 8; + w3_t[3] = 0; + + hmac_md5_run (w0_t, w1_t, w2_t, w3_t, ipad, opad, digest); + + const u32x r0 = digest[0]; + const u32x r1 = digest[3]; + const u32x r2 = digest[2]; + const u32x r3 = digest[1]; + + #include VECT_COMPARE_S + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m05600_s08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global netntlm_t *netntlm_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m05600_s16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global netntlm_t *netntlm_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/amd/m05600_a1.cl b/amd/m05600_a1.cl new file mode 100644 index 0000000000..44a698f243 --- /dev/null +++ b/amd/m05600_a1.cl @@ -0,0 +1,962 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _NETNTLMV2_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW4 +#define VECT_SIZE2 +#endif + +#ifdef VLIW5 +#define VECT_SIZE2 +#endif + +#define DGST_R0 0 +#define DGST_R1 3 +#define DGST_R2 2 +#define DGST_R3 1 + +#include "include/kernel_functions.c" +#include "types_amd.c" +#include "common_amd.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +static void md4_transform (const u32x w0[4], const u32x w1[4], const u32x w2[4], const u32x w3[4], u32x digest[4]) +{ + u32x a = digest[0]; + u32x b = digest[1]; + u32x c = digest[2]; + u32x d = digest[3]; + + u32x w0_t = w0[0]; + u32x w1_t = w0[1]; + u32x w2_t = w0[2]; + u32x w3_t = w0[3]; + u32x w4_t = w1[0]; + u32x w5_t = w1[1]; + u32x w6_t = w1[2]; + u32x w7_t = w1[3]; + u32x w8_t = w2[0]; + u32x w9_t = w2[1]; + u32x wa_t = w2[2]; + u32x wb_t = w2[3]; + u32x wc_t = w3[0]; + u32x wd_t = w3[1]; + u32x we_t = w3[2]; + u32x wf_t = w3[3]; + + MD4_STEP (MD4_Fo, a, b, c, d, w0_t, MD4C00, MD4S00); + MD4_STEP (MD4_Fo, d, a, b, c, w1_t, MD4C00, MD4S01); + MD4_STEP (MD4_Fo, c, d, a, b, w2_t, MD4C00, MD4S02); + MD4_STEP (MD4_Fo, b, c, d, a, w3_t, MD4C00, MD4S03); + MD4_STEP (MD4_Fo, a, b, c, d, w4_t, MD4C00, MD4S00); + MD4_STEP (MD4_Fo, d, a, b, c, w5_t, MD4C00, MD4S01); + MD4_STEP (MD4_Fo, c, d, a, b, w6_t, MD4C00, MD4S02); + MD4_STEP (MD4_Fo, b, c, d, a, w7_t, MD4C00, MD4S03); + MD4_STEP (MD4_Fo, a, b, c, d, w8_t, MD4C00, MD4S00); + MD4_STEP (MD4_Fo, d, a, b, c, w9_t, MD4C00, MD4S01); + MD4_STEP (MD4_Fo, c, d, a, b, wa_t, MD4C00, MD4S02); + MD4_STEP (MD4_Fo, b, c, d, a, wb_t, MD4C00, MD4S03); + MD4_STEP (MD4_Fo, a, b, c, d, wc_t, MD4C00, MD4S00); + MD4_STEP (MD4_Fo, d, a, b, c, wd_t, MD4C00, MD4S01); + MD4_STEP (MD4_Fo, c, d, a, b, we_t, MD4C00, MD4S02); + MD4_STEP (MD4_Fo, b, c, d, a, wf_t, MD4C00, MD4S03); + + MD4_STEP (MD4_Go, a, b, c, d, w0_t, MD4C01, MD4S10); + MD4_STEP (MD4_Go, d, a, b, c, w4_t, MD4C01, MD4S11); + MD4_STEP (MD4_Go, c, d, a, b, w8_t, MD4C01, MD4S12); + MD4_STEP (MD4_Go, b, c, d, a, wc_t, MD4C01, MD4S13); + MD4_STEP (MD4_Go, a, b, c, d, w1_t, MD4C01, MD4S10); + MD4_STEP (MD4_Go, d, a, b, c, w5_t, MD4C01, MD4S11); + MD4_STEP (MD4_Go, c, d, a, b, w9_t, MD4C01, MD4S12); + MD4_STEP (MD4_Go, b, c, d, a, wd_t, MD4C01, MD4S13); + MD4_STEP (MD4_Go, a, b, c, d, w2_t, MD4C01, MD4S10); + MD4_STEP (MD4_Go, d, a, b, c, w6_t, MD4C01, MD4S11); + MD4_STEP (MD4_Go, c, d, a, b, wa_t, MD4C01, MD4S12); + MD4_STEP (MD4_Go, b, c, d, a, we_t, MD4C01, MD4S13); + MD4_STEP (MD4_Go, a, b, c, d, w3_t, MD4C01, MD4S10); + MD4_STEP (MD4_Go, d, a, b, c, w7_t, MD4C01, MD4S11); + MD4_STEP (MD4_Go, c, d, a, b, wb_t, MD4C01, MD4S12); + MD4_STEP (MD4_Go, b, c, d, a, wf_t, MD4C01, MD4S13); + + MD4_STEP (MD4_H , a, b, c, d, w0_t, MD4C02, MD4S20); + MD4_STEP (MD4_H , d, a, b, c, w8_t, MD4C02, MD4S21); + MD4_STEP (MD4_H , c, d, a, b, w4_t, MD4C02, MD4S22); + MD4_STEP (MD4_H , b, c, d, a, wc_t, MD4C02, MD4S23); + MD4_STEP (MD4_H , a, b, c, d, w2_t, MD4C02, MD4S20); + MD4_STEP (MD4_H , d, a, b, c, wa_t, MD4C02, MD4S21); + MD4_STEP (MD4_H , c, d, a, b, w6_t, MD4C02, MD4S22); + MD4_STEP (MD4_H , b, c, d, a, we_t, MD4C02, MD4S23); + MD4_STEP (MD4_H , a, b, c, d, w1_t, MD4C02, MD4S20); + MD4_STEP (MD4_H , d, a, b, c, w9_t, MD4C02, MD4S21); + MD4_STEP (MD4_H , c, d, a, b, w5_t, MD4C02, MD4S22); + MD4_STEP (MD4_H , b, c, d, a, wd_t, MD4C02, MD4S23); + MD4_STEP (MD4_H , a, b, c, d, w3_t, MD4C02, MD4S20); + MD4_STEP (MD4_H , d, a, b, c, wb_t, MD4C02, MD4S21); + MD4_STEP (MD4_H , c, d, a, b, w7_t, MD4C02, MD4S22); + MD4_STEP (MD4_H , b, c, d, a, wf_t, MD4C02, MD4S23); + + digest[0] += a; + digest[1] += b; + digest[2] += c; + digest[3] += d; +} + +static void md5_transform (const u32x w0[4], const u32x w1[4], const u32x w2[4], const u32x w3[4], u32x digest[4]) +{ + u32x a = digest[0]; + u32x b = digest[1]; + u32x c = digest[2]; + u32x d = digest[3]; + + u32x w0_t = w0[0]; + u32x w1_t = w0[1]; + u32x w2_t = w0[2]; + u32x w3_t = w0[3]; + u32x w4_t = w1[0]; + u32x w5_t = w1[1]; + u32x w6_t = w1[2]; + u32x w7_t = w1[3]; + u32x w8_t = w2[0]; + u32x w9_t = w2[1]; + u32x wa_t = w2[2]; + u32x wb_t = w2[3]; + u32x wc_t = w3[0]; + u32x wd_t = w3[1]; + u32x we_t = w3[2]; + u32x wf_t = w3[3]; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t, MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t, MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t, MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t, MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w4_t, MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w5_t, MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w6_t, MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w7_t, MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w8_t, MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w9_t, MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, wa_t, MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, wb_t, MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, wc_t, MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, wd_t, MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, we_t, MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, wf_t, MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w1_t, MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w6_t, MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, wb_t, MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t, MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w5_t, MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, wa_t, MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, wf_t, MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w4_t, MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w9_t, MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, we_t, MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t, MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w8_t, MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, wd_t, MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t, MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w7_t, MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, wc_t, MD5C1f, MD5S13); + + MD5_STEP (MD5_H , a, b, c, d, w5_t, MD5C20, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w8_t, MD5C21, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, wb_t, MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, we_t, MD5C23, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w1_t, MD5C24, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w4_t, MD5C25, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w7_t, MD5C26, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, wa_t, MD5C27, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, wd_t, MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w0_t, MD5C29, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w3_t, MD5C2a, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w6_t, MD5C2b, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w9_t, MD5C2c, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, wc_t, MD5C2d, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, wf_t, MD5C2e, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w2_t, MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t, MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w7_t, MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, we_t, MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w5_t, MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, wc_t, MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t, MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, wa_t, MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t, MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w8_t, MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, wf_t, MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w6_t, MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, wd_t, MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w4_t, MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, wb_t, MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t, MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w9_t, MD5C3f, MD5S33); + + digest[0] += a; + digest[1] += b; + digest[2] += c; + digest[3] += d; +} + +static void hmac_md5_pad (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], u32x ipad[4], u32x opad[4]) +{ + w0[0] = w0[0] ^ 0x36363636; + w0[1] = w0[1] ^ 0x36363636; + w0[2] = w0[2] ^ 0x36363636; + w0[3] = w0[3] ^ 0x36363636; + w1[0] = w1[0] ^ 0x36363636; + w1[1] = w1[1] ^ 0x36363636; + w1[2] = w1[2] ^ 0x36363636; + w1[3] = w1[3] ^ 0x36363636; + w2[0] = w2[0] ^ 0x36363636; + w2[1] = w2[1] ^ 0x36363636; + w2[2] = w2[2] ^ 0x36363636; + w2[3] = w2[3] ^ 0x36363636; + w3[0] = w3[0] ^ 0x36363636; + w3[1] = w3[1] ^ 0x36363636; + w3[2] = w3[2] ^ 0x36363636; + w3[3] = w3[3] ^ 0x36363636; + + ipad[0] = MD5M_A; + ipad[1] = MD5M_B; + ipad[2] = MD5M_C; + ipad[3] = MD5M_D; + + md5_transform (w0, w1, w2, w3, ipad); + + w0[0] = w0[0] ^ 0x6a6a6a6a; + w0[1] = w0[1] ^ 0x6a6a6a6a; + w0[2] = w0[2] ^ 0x6a6a6a6a; + w0[3] = w0[3] ^ 0x6a6a6a6a; + w1[0] = w1[0] ^ 0x6a6a6a6a; + w1[1] = w1[1] ^ 0x6a6a6a6a; + w1[2] = w1[2] ^ 0x6a6a6a6a; + w1[3] = w1[3] ^ 0x6a6a6a6a; + w2[0] = w2[0] ^ 0x6a6a6a6a; + w2[1] = w2[1] ^ 0x6a6a6a6a; + w2[2] = w2[2] ^ 0x6a6a6a6a; + w2[3] = w2[3] ^ 0x6a6a6a6a; + w3[0] = w3[0] ^ 0x6a6a6a6a; + w3[1] = w3[1] ^ 0x6a6a6a6a; + w3[2] = w3[2] ^ 0x6a6a6a6a; + w3[3] = w3[3] ^ 0x6a6a6a6a; + + opad[0] = MD5M_A; + opad[1] = MD5M_B; + opad[2] = MD5M_C; + opad[3] = MD5M_D; + + md5_transform (w0, w1, w2, w3, opad); +} + +static void hmac_md5_run (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], u32x ipad[4], u32x opad[4], u32x digest[4]) +{ + digest[0] = ipad[0]; + digest[1] = ipad[1]; + digest[2] = ipad[2]; + digest[3] = ipad[3]; + + md5_transform (w0, w1, w2, w3, digest); + + w0[0] = digest[0]; + w0[1] = digest[1]; + w0[2] = digest[2]; + w0[3] = digest[3]; + w1[0] = 0x80; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + w3[0] = 0; + w3[1] = 0; + w3[2] = (64 + 16) * 8; + w3[3] = 0; + + digest[0] = opad[0]; + digest[1] = opad[1]; + digest[2] = opad[2]; + digest[3] = opad[3]; + + md5_transform (w0, w1, w2, w3, digest); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m05600_m04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global netntlm_t *netntlm_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + append_0x80_2 (wordl0, wordl1, pw_l_len); + + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, combs_buf[0].pw_len); + } + + /** + * salt + */ + + __local u32 s_userdomain_buf[64]; + __local u32 s_chall_buf[256]; + + const u32 userdomain_len = netntlm_bufs[salt_pos].user_len + + netntlm_bufs[salt_pos].domain_len; + + const u32 chall_len = netntlm_bufs[salt_pos].srvchall_len + + netntlm_bufs[salt_pos].clichall_len; + + if (lid < 64) + { + s_userdomain_buf[lid] = netntlm_bufs[salt_pos].userdomain_buf[lid]; + } + + const u32 lid4 = lid * 4; + + s_chall_buf[lid4 + 0] = netntlm_bufs[salt_pos].chall_buf[lid4 + 0]; + s_chall_buf[lid4 + 1] = netntlm_bufs[salt_pos].chall_buf[lid4 + 1]; + s_chall_buf[lid4 + 2] = netntlm_bufs[salt_pos].chall_buf[lid4 + 2]; + s_chall_buf[lid4 + 3] = netntlm_bufs[salt_pos].chall_buf[lid4 + 3]; + + barrier (CLK_LOCAL_MEM_FENCE); + + if (gid >= gid_max) return; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = combs_buf[il_pos].pw_len; + + const u32 pw_len = pw_l_len + pw_r_len; + + u32 wordr0[4]; + + wordr0[0] = combs_buf[il_pos].i[0]; + wordr0[1] = combs_buf[il_pos].i[1]; + wordr0[2] = combs_buf[il_pos].i[2]; + wordr0[3] = combs_buf[il_pos].i[3]; + + u32 wordr1[4]; + + wordr1[0] = combs_buf[il_pos].i[4]; + wordr1[1] = combs_buf[il_pos].i[5]; + wordr1[2] = combs_buf[il_pos].i[6]; + wordr1[3] = combs_buf[il_pos].i[7]; + + u32 wordr2[4]; + + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + + u32 wordr3[4]; + + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + u32x w0[4]; + + w0[0] = wordl0[0] | wordr0[0]; + w0[1] = wordl0[1] | wordr0[1]; + w0[2] = wordl0[2] | wordr0[2]; + w0[3] = wordl0[3] | wordr0[3]; + + u32x w1[4]; + + w1[0] = wordl1[0] | wordr1[0]; + w1[1] = wordl1[1] | wordr1[1]; + w1[2] = wordl1[2] | wordr1[2]; + w1[3] = wordl1[3] | wordr1[3]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + make_unicode (w0, w0_t, w1_t); + make_unicode (w1, w2_t, w3_t); + + w3_t[2] = pw_len * 8 * 2; + + u32x digest[4]; + + digest[0] = MD4M_A; + digest[1] = MD4M_B; + digest[2] = MD4M_C; + digest[3] = MD4M_D; + + md4_transform (w0_t, w1_t, w2_t, w3_t, digest); + + w0_t[0] = digest[0]; + w0_t[1] = digest[1]; + w0_t[2] = digest[2]; + w0_t[3] = digest[3]; + w1_t[0] = 0; + w1_t[1] = 0; + w1_t[2] = 0; + w1_t[3] = 0; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = 0; + + digest[0] = MD5M_A; + digest[1] = MD5M_B; + digest[2] = MD5M_C; + digest[3] = MD5M_D; + + u32x ipad[4]; + u32x opad[4]; + + hmac_md5_pad (w0_t, w1_t, w2_t, w3_t, ipad, opad); + + int left; + int off; + + for (left = userdomain_len, off = 0; left >= 56; left -= 64, off += 16) + { + w0_t[0] = s_userdomain_buf[off + 0]; + w0_t[1] = s_userdomain_buf[off + 1]; + w0_t[2] = s_userdomain_buf[off + 2]; + w0_t[3] = s_userdomain_buf[off + 3]; + w1_t[0] = s_userdomain_buf[off + 4]; + w1_t[1] = s_userdomain_buf[off + 5]; + w1_t[2] = s_userdomain_buf[off + 6]; + w1_t[3] = s_userdomain_buf[off + 7]; + w2_t[0] = s_userdomain_buf[off + 8]; + w2_t[1] = s_userdomain_buf[off + 9]; + w2_t[2] = s_userdomain_buf[off + 10]; + w2_t[3] = s_userdomain_buf[off + 11]; + w3_t[0] = s_userdomain_buf[off + 12]; + w3_t[1] = s_userdomain_buf[off + 13]; + w3_t[2] = s_userdomain_buf[off + 14]; + w3_t[3] = s_userdomain_buf[off + 15]; + + md5_transform (w0_t, w1_t, w2_t, w3_t, ipad); + } + + w0_t[0] = s_userdomain_buf[off + 0]; + w0_t[1] = s_userdomain_buf[off + 1]; + w0_t[2] = s_userdomain_buf[off + 2]; + w0_t[3] = s_userdomain_buf[off + 3]; + w1_t[0] = s_userdomain_buf[off + 4]; + w1_t[1] = s_userdomain_buf[off + 5]; + w1_t[2] = s_userdomain_buf[off + 6]; + w1_t[3] = s_userdomain_buf[off + 7]; + w2_t[0] = s_userdomain_buf[off + 8]; + w2_t[1] = s_userdomain_buf[off + 9]; + w2_t[2] = s_userdomain_buf[off + 10]; + w2_t[3] = s_userdomain_buf[off + 11]; + w3_t[0] = s_userdomain_buf[off + 12]; + w3_t[1] = s_userdomain_buf[off + 13]; + w3_t[2] = (64 + userdomain_len) * 8; + w3_t[3] = 0; + + hmac_md5_run (w0_t, w1_t, w2_t, w3_t, ipad, opad, digest); + + w0_t[0] = digest[0]; + w0_t[1] = digest[1]; + w0_t[2] = digest[2]; + w0_t[3] = digest[3]; + w1_t[0] = 0; + w1_t[1] = 0; + w1_t[2] = 0; + w1_t[3] = 0; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = 0; + + digest[0] = MD5M_A; + digest[1] = MD5M_B; + digest[2] = MD5M_C; + digest[3] = MD5M_D; + + hmac_md5_pad (w0_t, w1_t, w2_t, w3_t, ipad, opad); + + for (left = chall_len, off = 0; left >= 56; left -= 64, off += 16) + { + w0_t[0] = s_chall_buf[off + 0]; + w0_t[1] = s_chall_buf[off + 1]; + w0_t[2] = s_chall_buf[off + 2]; + w0_t[3] = s_chall_buf[off + 3]; + w1_t[0] = s_chall_buf[off + 4]; + w1_t[1] = s_chall_buf[off + 5]; + w1_t[2] = s_chall_buf[off + 6]; + w1_t[3] = s_chall_buf[off + 7]; + w2_t[0] = s_chall_buf[off + 8]; + w2_t[1] = s_chall_buf[off + 9]; + w2_t[2] = s_chall_buf[off + 10]; + w2_t[3] = s_chall_buf[off + 11]; + w3_t[0] = s_chall_buf[off + 12]; + w3_t[1] = s_chall_buf[off + 13]; + w3_t[2] = s_chall_buf[off + 14]; + w3_t[3] = s_chall_buf[off + 15]; + + md5_transform (w0_t, w1_t, w2_t, w3_t, ipad); + } + + w0_t[0] = s_chall_buf[off + 0]; + w0_t[1] = s_chall_buf[off + 1]; + w0_t[2] = s_chall_buf[off + 2]; + w0_t[3] = s_chall_buf[off + 3]; + w1_t[0] = s_chall_buf[off + 4]; + w1_t[1] = s_chall_buf[off + 5]; + w1_t[2] = s_chall_buf[off + 6]; + w1_t[3] = s_chall_buf[off + 7]; + w2_t[0] = s_chall_buf[off + 8]; + w2_t[1] = s_chall_buf[off + 9]; + w2_t[2] = s_chall_buf[off + 10]; + w2_t[3] = s_chall_buf[off + 11]; + w3_t[0] = s_chall_buf[off + 12]; + w3_t[1] = s_chall_buf[off + 13]; + w3_t[2] = (64 + chall_len) * 8; + w3_t[3] = 0; + + hmac_md5_run (w0_t, w1_t, w2_t, w3_t, ipad, opad, digest); + + const u32x r0 = digest[0]; + const u32x r1 = digest[3]; + const u32x r2 = digest[2]; + const u32x r3 = digest[1]; + + #include VECT_COMPARE_M + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m05600_m08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global netntlm_t *netntlm_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m05600_m16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global netntlm_t *netntlm_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m05600_s04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global netntlm_t *netntlm_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + append_0x80_2 (wordl0, wordl1, pw_l_len); + + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, combs_buf[0].pw_len); + } + + /** + * salt + */ + + __local u32 s_userdomain_buf[64]; + __local u32 s_chall_buf[256]; + + const u32 userdomain_len = netntlm_bufs[salt_pos].user_len + + netntlm_bufs[salt_pos].domain_len; + + const u32 chall_len = netntlm_bufs[salt_pos].srvchall_len + + netntlm_bufs[salt_pos].clichall_len; + + if (lid < 64) + { + s_userdomain_buf[lid] = netntlm_bufs[salt_pos].userdomain_buf[lid]; + } + + const u32 lid4 = lid * 4; + + s_chall_buf[lid4 + 0] = netntlm_bufs[salt_pos].chall_buf[lid4 + 0]; + s_chall_buf[lid4 + 1] = netntlm_bufs[salt_pos].chall_buf[lid4 + 1]; + s_chall_buf[lid4 + 2] = netntlm_bufs[salt_pos].chall_buf[lid4 + 2]; + s_chall_buf[lid4 + 3] = netntlm_bufs[salt_pos].chall_buf[lid4 + 3]; + + barrier (CLK_LOCAL_MEM_FENCE); + + if (gid >= gid_max) return; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = combs_buf[il_pos].pw_len; + + const u32 pw_len = pw_l_len + pw_r_len; + + u32 wordr0[4]; + + wordr0[0] = combs_buf[il_pos].i[0]; + wordr0[1] = combs_buf[il_pos].i[1]; + wordr0[2] = combs_buf[il_pos].i[2]; + wordr0[3] = combs_buf[il_pos].i[3]; + + u32 wordr1[4]; + + wordr1[0] = combs_buf[il_pos].i[4]; + wordr1[1] = combs_buf[il_pos].i[5]; + wordr1[2] = combs_buf[il_pos].i[6]; + wordr1[3] = combs_buf[il_pos].i[7]; + + u32 wordr2[4]; + + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + + u32 wordr3[4]; + + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + u32x w0[4]; + + w0[0] = wordl0[0] | wordr0[0]; + w0[1] = wordl0[1] | wordr0[1]; + w0[2] = wordl0[2] | wordr0[2]; + w0[3] = wordl0[3] | wordr0[3]; + + u32x w1[4]; + + w1[0] = wordl1[0] | wordr1[0]; + w1[1] = wordl1[1] | wordr1[1]; + w1[2] = wordl1[2] | wordr1[2]; + w1[3] = wordl1[3] | wordr1[3]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + make_unicode (w0, w0_t, w1_t); + make_unicode (w1, w2_t, w3_t); + + w3_t[2] = pw_len * 8 * 2; + + u32x digest[4]; + + digest[0] = MD4M_A; + digest[1] = MD4M_B; + digest[2] = MD4M_C; + digest[3] = MD4M_D; + + md4_transform (w0_t, w1_t, w2_t, w3_t, digest); + + w0_t[0] = digest[0]; + w0_t[1] = digest[1]; + w0_t[2] = digest[2]; + w0_t[3] = digest[3]; + w1_t[0] = 0; + w1_t[1] = 0; + w1_t[2] = 0; + w1_t[3] = 0; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = 0; + + digest[0] = MD5M_A; + digest[1] = MD5M_B; + digest[2] = MD5M_C; + digest[3] = MD5M_D; + + u32x ipad[4]; + u32x opad[4]; + + hmac_md5_pad (w0_t, w1_t, w2_t, w3_t, ipad, opad); + + int left; + int off; + + for (left = userdomain_len, off = 0; left >= 56; left -= 64, off += 16) + { + w0_t[0] = s_userdomain_buf[off + 0]; + w0_t[1] = s_userdomain_buf[off + 1]; + w0_t[2] = s_userdomain_buf[off + 2]; + w0_t[3] = s_userdomain_buf[off + 3]; + w1_t[0] = s_userdomain_buf[off + 4]; + w1_t[1] = s_userdomain_buf[off + 5]; + w1_t[2] = s_userdomain_buf[off + 6]; + w1_t[3] = s_userdomain_buf[off + 7]; + w2_t[0] = s_userdomain_buf[off + 8]; + w2_t[1] = s_userdomain_buf[off + 9]; + w2_t[2] = s_userdomain_buf[off + 10]; + w2_t[3] = s_userdomain_buf[off + 11]; + w3_t[0] = s_userdomain_buf[off + 12]; + w3_t[1] = s_userdomain_buf[off + 13]; + w3_t[2] = s_userdomain_buf[off + 14]; + w3_t[3] = s_userdomain_buf[off + 15]; + + md5_transform (w0_t, w1_t, w2_t, w3_t, ipad); + } + + w0_t[0] = s_userdomain_buf[off + 0]; + w0_t[1] = s_userdomain_buf[off + 1]; + w0_t[2] = s_userdomain_buf[off + 2]; + w0_t[3] = s_userdomain_buf[off + 3]; + w1_t[0] = s_userdomain_buf[off + 4]; + w1_t[1] = s_userdomain_buf[off + 5]; + w1_t[2] = s_userdomain_buf[off + 6]; + w1_t[3] = s_userdomain_buf[off + 7]; + w2_t[0] = s_userdomain_buf[off + 8]; + w2_t[1] = s_userdomain_buf[off + 9]; + w2_t[2] = s_userdomain_buf[off + 10]; + w2_t[3] = s_userdomain_buf[off + 11]; + w3_t[0] = s_userdomain_buf[off + 12]; + w3_t[1] = s_userdomain_buf[off + 13]; + w3_t[2] = (64 + userdomain_len) * 8; + w3_t[3] = 0; + + hmac_md5_run (w0_t, w1_t, w2_t, w3_t, ipad, opad, digest); + + w0_t[0] = digest[0]; + w0_t[1] = digest[1]; + w0_t[2] = digest[2]; + w0_t[3] = digest[3]; + w1_t[0] = 0; + w1_t[1] = 0; + w1_t[2] = 0; + w1_t[3] = 0; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = 0; + + digest[0] = MD5M_A; + digest[1] = MD5M_B; + digest[2] = MD5M_C; + digest[3] = MD5M_D; + + hmac_md5_pad (w0_t, w1_t, w2_t, w3_t, ipad, opad); + + for (left = chall_len, off = 0; left >= 56; left -= 64, off += 16) + { + w0_t[0] = s_chall_buf[off + 0]; + w0_t[1] = s_chall_buf[off + 1]; + w0_t[2] = s_chall_buf[off + 2]; + w0_t[3] = s_chall_buf[off + 3]; + w1_t[0] = s_chall_buf[off + 4]; + w1_t[1] = s_chall_buf[off + 5]; + w1_t[2] = s_chall_buf[off + 6]; + w1_t[3] = s_chall_buf[off + 7]; + w2_t[0] = s_chall_buf[off + 8]; + w2_t[1] = s_chall_buf[off + 9]; + w2_t[2] = s_chall_buf[off + 10]; + w2_t[3] = s_chall_buf[off + 11]; + w3_t[0] = s_chall_buf[off + 12]; + w3_t[1] = s_chall_buf[off + 13]; + w3_t[2] = s_chall_buf[off + 14]; + w3_t[3] = s_chall_buf[off + 15]; + + md5_transform (w0_t, w1_t, w2_t, w3_t, ipad); + } + + w0_t[0] = s_chall_buf[off + 0]; + w0_t[1] = s_chall_buf[off + 1]; + w0_t[2] = s_chall_buf[off + 2]; + w0_t[3] = s_chall_buf[off + 3]; + w1_t[0] = s_chall_buf[off + 4]; + w1_t[1] = s_chall_buf[off + 5]; + w1_t[2] = s_chall_buf[off + 6]; + w1_t[3] = s_chall_buf[off + 7]; + w2_t[0] = s_chall_buf[off + 8]; + w2_t[1] = s_chall_buf[off + 9]; + w2_t[2] = s_chall_buf[off + 10]; + w2_t[3] = s_chall_buf[off + 11]; + w3_t[0] = s_chall_buf[off + 12]; + w3_t[1] = s_chall_buf[off + 13]; + w3_t[2] = (64 + chall_len) * 8; + w3_t[3] = 0; + + hmac_md5_run (w0_t, w1_t, w2_t, w3_t, ipad, opad, digest); + + const u32x r0 = digest[0]; + const u32x r1 = digest[3]; + const u32x r2 = digest[2]; + const u32x r3 = digest[1]; + + #include VECT_COMPARE_S + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m05600_s08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global netntlm_t *netntlm_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m05600_s16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global netntlm_t *netntlm_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/amd/m05600_a3.cl b/amd/m05600_a3.cl new file mode 100644 index 0000000000..1f375bf623 --- /dev/null +++ b/amd/m05600_a3.cl @@ -0,0 +1,1000 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _NETNTLMV2_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW4 +#define VECT_SIZE2 +#endif + +#ifdef VLIW5 +#define VECT_SIZE2 +#endif + +#define DGST_R0 0 +#define DGST_R1 3 +#define DGST_R2 2 +#define DGST_R3 1 + +#include "include/kernel_functions.c" +#include "types_amd.c" +#include "common_amd.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +static void md4_transform (const u32x w0[4], const u32x w1[4], const u32x w2[4], const u32x w3[4], u32x digest[4]) +{ + u32x a = digest[0]; + u32x b = digest[1]; + u32x c = digest[2]; + u32x d = digest[3]; + + u32x w0_t = w0[0]; + u32x w1_t = w0[1]; + u32x w2_t = w0[2]; + u32x w3_t = w0[3]; + u32x w4_t = w1[0]; + u32x w5_t = w1[1]; + u32x w6_t = w1[2]; + u32x w7_t = w1[3]; + u32x w8_t = w2[0]; + u32x w9_t = w2[1]; + u32x wa_t = w2[2]; + u32x wb_t = w2[3]; + u32x wc_t = w3[0]; + u32x wd_t = w3[1]; + u32x we_t = w3[2]; + u32x wf_t = w3[3]; + + MD4_STEP (MD4_Fo, a, b, c, d, w0_t, MD4C00, MD4S00); + MD4_STEP (MD4_Fo, d, a, b, c, w1_t, MD4C00, MD4S01); + MD4_STEP (MD4_Fo, c, d, a, b, w2_t, MD4C00, MD4S02); + MD4_STEP (MD4_Fo, b, c, d, a, w3_t, MD4C00, MD4S03); + MD4_STEP (MD4_Fo, a, b, c, d, w4_t, MD4C00, MD4S00); + MD4_STEP (MD4_Fo, d, a, b, c, w5_t, MD4C00, MD4S01); + MD4_STEP (MD4_Fo, c, d, a, b, w6_t, MD4C00, MD4S02); + MD4_STEP (MD4_Fo, b, c, d, a, w7_t, MD4C00, MD4S03); + MD4_STEP (MD4_Fo, a, b, c, d, w8_t, MD4C00, MD4S00); + MD4_STEP (MD4_Fo, d, a, b, c, w9_t, MD4C00, MD4S01); + MD4_STEP (MD4_Fo, c, d, a, b, wa_t, MD4C00, MD4S02); + MD4_STEP (MD4_Fo, b, c, d, a, wb_t, MD4C00, MD4S03); + MD4_STEP (MD4_Fo, a, b, c, d, wc_t, MD4C00, MD4S00); + MD4_STEP (MD4_Fo, d, a, b, c, wd_t, MD4C00, MD4S01); + MD4_STEP (MD4_Fo, c, d, a, b, we_t, MD4C00, MD4S02); + MD4_STEP (MD4_Fo, b, c, d, a, wf_t, MD4C00, MD4S03); + + MD4_STEP (MD4_Go, a, b, c, d, w0_t, MD4C01, MD4S10); + MD4_STEP (MD4_Go, d, a, b, c, w4_t, MD4C01, MD4S11); + MD4_STEP (MD4_Go, c, d, a, b, w8_t, MD4C01, MD4S12); + MD4_STEP (MD4_Go, b, c, d, a, wc_t, MD4C01, MD4S13); + MD4_STEP (MD4_Go, a, b, c, d, w1_t, MD4C01, MD4S10); + MD4_STEP (MD4_Go, d, a, b, c, w5_t, MD4C01, MD4S11); + MD4_STEP (MD4_Go, c, d, a, b, w9_t, MD4C01, MD4S12); + MD4_STEP (MD4_Go, b, c, d, a, wd_t, MD4C01, MD4S13); + MD4_STEP (MD4_Go, a, b, c, d, w2_t, MD4C01, MD4S10); + MD4_STEP (MD4_Go, d, a, b, c, w6_t, MD4C01, MD4S11); + MD4_STEP (MD4_Go, c, d, a, b, wa_t, MD4C01, MD4S12); + MD4_STEP (MD4_Go, b, c, d, a, we_t, MD4C01, MD4S13); + MD4_STEP (MD4_Go, a, b, c, d, w3_t, MD4C01, MD4S10); + MD4_STEP (MD4_Go, d, a, b, c, w7_t, MD4C01, MD4S11); + MD4_STEP (MD4_Go, c, d, a, b, wb_t, MD4C01, MD4S12); + MD4_STEP (MD4_Go, b, c, d, a, wf_t, MD4C01, MD4S13); + + MD4_STEP (MD4_H , a, b, c, d, w0_t, MD4C02, MD4S20); + MD4_STEP (MD4_H , d, a, b, c, w8_t, MD4C02, MD4S21); + MD4_STEP (MD4_H , c, d, a, b, w4_t, MD4C02, MD4S22); + MD4_STEP (MD4_H , b, c, d, a, wc_t, MD4C02, MD4S23); + MD4_STEP (MD4_H , a, b, c, d, w2_t, MD4C02, MD4S20); + MD4_STEP (MD4_H , d, a, b, c, wa_t, MD4C02, MD4S21); + MD4_STEP (MD4_H , c, d, a, b, w6_t, MD4C02, MD4S22); + MD4_STEP (MD4_H , b, c, d, a, we_t, MD4C02, MD4S23); + MD4_STEP (MD4_H , a, b, c, d, w1_t, MD4C02, MD4S20); + MD4_STEP (MD4_H , d, a, b, c, w9_t, MD4C02, MD4S21); + MD4_STEP (MD4_H , c, d, a, b, w5_t, MD4C02, MD4S22); + MD4_STEP (MD4_H , b, c, d, a, wd_t, MD4C02, MD4S23); + MD4_STEP (MD4_H , a, b, c, d, w3_t, MD4C02, MD4S20); + MD4_STEP (MD4_H , d, a, b, c, wb_t, MD4C02, MD4S21); + MD4_STEP (MD4_H , c, d, a, b, w7_t, MD4C02, MD4S22); + MD4_STEP (MD4_H , b, c, d, a, wf_t, MD4C02, MD4S23); + + digest[0] += a; + digest[1] += b; + digest[2] += c; + digest[3] += d; +} + +static void md5_transform (const u32x w0[4], const u32x w1[4], const u32x w2[4], const u32x w3[4], u32x digest[4]) +{ + u32x a = digest[0]; + u32x b = digest[1]; + u32x c = digest[2]; + u32x d = digest[3]; + + u32x w0_t = w0[0]; + u32x w1_t = w0[1]; + u32x w2_t = w0[2]; + u32x w3_t = w0[3]; + u32x w4_t = w1[0]; + u32x w5_t = w1[1]; + u32x w6_t = w1[2]; + u32x w7_t = w1[3]; + u32x w8_t = w2[0]; + u32x w9_t = w2[1]; + u32x wa_t = w2[2]; + u32x wb_t = w2[3]; + u32x wc_t = w3[0]; + u32x wd_t = w3[1]; + u32x we_t = w3[2]; + u32x wf_t = w3[3]; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t, MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t, MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t, MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t, MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w4_t, MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w5_t, MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w6_t, MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w7_t, MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w8_t, MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w9_t, MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, wa_t, MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, wb_t, MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, wc_t, MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, wd_t, MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, we_t, MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, wf_t, MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w1_t, MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w6_t, MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, wb_t, MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t, MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w5_t, MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, wa_t, MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, wf_t, MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w4_t, MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w9_t, MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, we_t, MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t, MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w8_t, MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, wd_t, MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t, MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w7_t, MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, wc_t, MD5C1f, MD5S13); + + MD5_STEP (MD5_H , a, b, c, d, w5_t, MD5C20, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w8_t, MD5C21, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, wb_t, MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, we_t, MD5C23, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w1_t, MD5C24, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w4_t, MD5C25, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w7_t, MD5C26, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, wa_t, MD5C27, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, wd_t, MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w0_t, MD5C29, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w3_t, MD5C2a, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w6_t, MD5C2b, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w9_t, MD5C2c, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, wc_t, MD5C2d, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, wf_t, MD5C2e, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w2_t, MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t, MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w7_t, MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, we_t, MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w5_t, MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, wc_t, MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t, MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, wa_t, MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t, MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w8_t, MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, wf_t, MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w6_t, MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, wd_t, MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w4_t, MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, wb_t, MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t, MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w9_t, MD5C3f, MD5S33); + + digest[0] += a; + digest[1] += b; + digest[2] += c; + digest[3] += d; +} + +static void hmac_md5_pad (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], u32x ipad[4], u32x opad[4]) +{ + w0[0] = w0[0] ^ 0x36363636; + w0[1] = w0[1] ^ 0x36363636; + w0[2] = w0[2] ^ 0x36363636; + w0[3] = w0[3] ^ 0x36363636; + w1[0] = w1[0] ^ 0x36363636; + w1[1] = w1[1] ^ 0x36363636; + w1[2] = w1[2] ^ 0x36363636; + w1[3] = w1[3] ^ 0x36363636; + w2[0] = w2[0] ^ 0x36363636; + w2[1] = w2[1] ^ 0x36363636; + w2[2] = w2[2] ^ 0x36363636; + w2[3] = w2[3] ^ 0x36363636; + w3[0] = w3[0] ^ 0x36363636; + w3[1] = w3[1] ^ 0x36363636; + w3[2] = w3[2] ^ 0x36363636; + w3[3] = w3[3] ^ 0x36363636; + + ipad[0] = MD5M_A; + ipad[1] = MD5M_B; + ipad[2] = MD5M_C; + ipad[3] = MD5M_D; + + md5_transform (w0, w1, w2, w3, ipad); + + w0[0] = w0[0] ^ 0x6a6a6a6a; + w0[1] = w0[1] ^ 0x6a6a6a6a; + w0[2] = w0[2] ^ 0x6a6a6a6a; + w0[3] = w0[3] ^ 0x6a6a6a6a; + w1[0] = w1[0] ^ 0x6a6a6a6a; + w1[1] = w1[1] ^ 0x6a6a6a6a; + w1[2] = w1[2] ^ 0x6a6a6a6a; + w1[3] = w1[3] ^ 0x6a6a6a6a; + w2[0] = w2[0] ^ 0x6a6a6a6a; + w2[1] = w2[1] ^ 0x6a6a6a6a; + w2[2] = w2[2] ^ 0x6a6a6a6a; + w2[3] = w2[3] ^ 0x6a6a6a6a; + w3[0] = w3[0] ^ 0x6a6a6a6a; + w3[1] = w3[1] ^ 0x6a6a6a6a; + w3[2] = w3[2] ^ 0x6a6a6a6a; + w3[3] = w3[3] ^ 0x6a6a6a6a; + + opad[0] = MD5M_A; + opad[1] = MD5M_B; + opad[2] = MD5M_C; + opad[3] = MD5M_D; + + md5_transform (w0, w1, w2, w3, opad); +} + +static void hmac_md5_run (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], u32x ipad[4], u32x opad[4], u32x digest[4]) +{ + digest[0] = ipad[0]; + digest[1] = ipad[1]; + digest[2] = ipad[2]; + digest[3] = ipad[3]; + + md5_transform (w0, w1, w2, w3, digest); + + w0[0] = digest[0]; + w0[1] = digest[1]; + w0[2] = digest[2]; + w0[3] = digest[3]; + w1[0] = 0x80; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + w3[0] = 0; + w3[1] = 0; + w3[2] = (64 + 16) * 8; + w3[3] = 0; + + digest[0] = opad[0]; + digest[1] = opad[1]; + digest[2] = opad[2]; + digest[3] = opad[3]; + + md5_transform (w0, w1, w2, w3, digest); +} + +static void m05600m (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], const u32 pw_len, __global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global netntlm_t *netntlm_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, __local u32 s_userdomain_buf[64], __local u32 s_chall_buf[256]) +{ + /** + * modifier + */ + + const u32 gid = get_global_id (0); + const u32 lid = get_local_id (0); + + /** + * prepare + */ + + const u32 userdomain_len = netntlm_bufs[salt_pos].user_len + + netntlm_bufs[salt_pos].domain_len; + + const u32 chall_len = netntlm_bufs[salt_pos].srvchall_len + + netntlm_bufs[salt_pos].clichall_len; + + /** + * loop + */ + + u32x w0l = w0[0]; + + for (u32 il_pos = 0; il_pos < bfs_cnt; il_pos++) + { + const u32 w0r = bfs_buf[il_pos].i; + + w0[0] = w0l | w0r; + + u32x digest[4]; + + digest[0] = MD4M_A; + digest[1] = MD4M_B; + digest[2] = MD4M_C; + digest[3] = MD4M_D; + + md4_transform (w0, w1, w2, w3, digest); + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + w0_t[0] = digest[0]; + w0_t[1] = digest[1]; + w0_t[2] = digest[2]; + w0_t[3] = digest[3]; + w1_t[0] = 0; + w1_t[1] = 0; + w1_t[2] = 0; + w1_t[3] = 0; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = 0; + + digest[0] = MD5M_A; + digest[1] = MD5M_B; + digest[2] = MD5M_C; + digest[3] = MD5M_D; + + u32x ipad[4]; + u32x opad[4]; + + hmac_md5_pad (w0_t, w1_t, w2_t, w3_t, ipad, opad); + + int left; + int off; + + for (left = userdomain_len, off = 0; left >= 56; left -= 64, off += 16) + { + w0_t[0] = s_userdomain_buf[off + 0]; + w0_t[1] = s_userdomain_buf[off + 1]; + w0_t[2] = s_userdomain_buf[off + 2]; + w0_t[3] = s_userdomain_buf[off + 3]; + w1_t[0] = s_userdomain_buf[off + 4]; + w1_t[1] = s_userdomain_buf[off + 5]; + w1_t[2] = s_userdomain_buf[off + 6]; + w1_t[3] = s_userdomain_buf[off + 7]; + w2_t[0] = s_userdomain_buf[off + 8]; + w2_t[1] = s_userdomain_buf[off + 9]; + w2_t[2] = s_userdomain_buf[off + 10]; + w2_t[3] = s_userdomain_buf[off + 11]; + w3_t[0] = s_userdomain_buf[off + 12]; + w3_t[1] = s_userdomain_buf[off + 13]; + w3_t[2] = s_userdomain_buf[off + 14]; + w3_t[3] = s_userdomain_buf[off + 15]; + + md5_transform (w0_t, w1_t, w2_t, w3_t, ipad); + } + + w0_t[0] = s_userdomain_buf[off + 0]; + w0_t[1] = s_userdomain_buf[off + 1]; + w0_t[2] = s_userdomain_buf[off + 2]; + w0_t[3] = s_userdomain_buf[off + 3]; + w1_t[0] = s_userdomain_buf[off + 4]; + w1_t[1] = s_userdomain_buf[off + 5]; + w1_t[2] = s_userdomain_buf[off + 6]; + w1_t[3] = s_userdomain_buf[off + 7]; + w2_t[0] = s_userdomain_buf[off + 8]; + w2_t[1] = s_userdomain_buf[off + 9]; + w2_t[2] = s_userdomain_buf[off + 10]; + w2_t[3] = s_userdomain_buf[off + 11]; + w3_t[0] = s_userdomain_buf[off + 12]; + w3_t[1] = s_userdomain_buf[off + 13]; + w3_t[2] = (64 + userdomain_len) * 8; + w3_t[3] = 0; + + hmac_md5_run (w0_t, w1_t, w2_t, w3_t, ipad, opad, digest); + + w0_t[0] = digest[0]; + w0_t[1] = digest[1]; + w0_t[2] = digest[2]; + w0_t[3] = digest[3]; + w1_t[0] = 0; + w1_t[1] = 0; + w1_t[2] = 0; + w1_t[3] = 0; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = 0; + + digest[0] = MD5M_A; + digest[1] = MD5M_B; + digest[2] = MD5M_C; + digest[3] = MD5M_D; + + hmac_md5_pad (w0_t, w1_t, w2_t, w3_t, ipad, opad); + + for (left = chall_len, off = 0; left >= 56; left -= 64, off += 16) + { + w0_t[0] = s_chall_buf[off + 0]; + w0_t[1] = s_chall_buf[off + 1]; + w0_t[2] = s_chall_buf[off + 2]; + w0_t[3] = s_chall_buf[off + 3]; + w1_t[0] = s_chall_buf[off + 4]; + w1_t[1] = s_chall_buf[off + 5]; + w1_t[2] = s_chall_buf[off + 6]; + w1_t[3] = s_chall_buf[off + 7]; + w2_t[0] = s_chall_buf[off + 8]; + w2_t[1] = s_chall_buf[off + 9]; + w2_t[2] = s_chall_buf[off + 10]; + w2_t[3] = s_chall_buf[off + 11]; + w3_t[0] = s_chall_buf[off + 12]; + w3_t[1] = s_chall_buf[off + 13]; + w3_t[2] = s_chall_buf[off + 14]; + w3_t[3] = s_chall_buf[off + 15]; + + md5_transform (w0_t, w1_t, w2_t, w3_t, ipad); + } + + w0_t[0] = s_chall_buf[off + 0]; + w0_t[1] = s_chall_buf[off + 1]; + w0_t[2] = s_chall_buf[off + 2]; + w0_t[3] = s_chall_buf[off + 3]; + w1_t[0] = s_chall_buf[off + 4]; + w1_t[1] = s_chall_buf[off + 5]; + w1_t[2] = s_chall_buf[off + 6]; + w1_t[3] = s_chall_buf[off + 7]; + w2_t[0] = s_chall_buf[off + 8]; + w2_t[1] = s_chall_buf[off + 9]; + w2_t[2] = s_chall_buf[off + 10]; + w2_t[3] = s_chall_buf[off + 11]; + w3_t[0] = s_chall_buf[off + 12]; + w3_t[1] = s_chall_buf[off + 13]; + w3_t[2] = (64 + chall_len) * 8; + w3_t[3] = 0; + + hmac_md5_run (w0_t, w1_t, w2_t, w3_t, ipad, opad, digest); + + const u32x r0 = digest[0]; + const u32x r1 = digest[3]; + const u32x r2 = digest[2]; + const u32x r3 = digest[1]; + + #include VECT_COMPARE_M + } +} + +static void m05600s (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], const u32 pw_len, __global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global netntlm_t *netntlm_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, __local u32 s_userdomain_buf[64], __local u32 s_chall_buf[256]) +{ + /** + * modifier + */ + + const u32 gid = get_global_id (0); + const u32 lid = get_local_id (0); + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * prepare + */ + + const u32 userdomain_len = netntlm_bufs[salt_pos].user_len + + netntlm_bufs[salt_pos].domain_len; + + const u32 chall_len = netntlm_bufs[salt_pos].srvchall_len + + netntlm_bufs[salt_pos].clichall_len; + + /** + * loop + */ + + u32x w0l = w0[0]; + + for (u32 il_pos = 0; il_pos < bfs_cnt; il_pos++) + { + const u32 w0r = bfs_buf[il_pos].i; + + w0[0] = w0l | w0r; + + u32x digest[4]; + + digest[0] = MD4M_A; + digest[1] = MD4M_B; + digest[2] = MD4M_C; + digest[3] = MD4M_D; + + md4_transform (w0, w1, w2, w3, digest); + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + w0_t[0] = digest[0]; + w0_t[1] = digest[1]; + w0_t[2] = digest[2]; + w0_t[3] = digest[3]; + w1_t[0] = 0; + w1_t[1] = 0; + w1_t[2] = 0; + w1_t[3] = 0; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = 0; + + digest[0] = MD5M_A; + digest[1] = MD5M_B; + digest[2] = MD5M_C; + digest[3] = MD5M_D; + + u32x ipad[4]; + u32x opad[4]; + + hmac_md5_pad (w0_t, w1_t, w2_t, w3_t, ipad, opad); + + int left; + int off; + + for (left = userdomain_len, off = 0; left >= 56; left -= 64, off += 16) + { + w0_t[0] = s_userdomain_buf[off + 0]; + w0_t[1] = s_userdomain_buf[off + 1]; + w0_t[2] = s_userdomain_buf[off + 2]; + w0_t[3] = s_userdomain_buf[off + 3]; + w1_t[0] = s_userdomain_buf[off + 4]; + w1_t[1] = s_userdomain_buf[off + 5]; + w1_t[2] = s_userdomain_buf[off + 6]; + w1_t[3] = s_userdomain_buf[off + 7]; + w2_t[0] = s_userdomain_buf[off + 8]; + w2_t[1] = s_userdomain_buf[off + 9]; + w2_t[2] = s_userdomain_buf[off + 10]; + w2_t[3] = s_userdomain_buf[off + 11]; + w3_t[0] = s_userdomain_buf[off + 12]; + w3_t[1] = s_userdomain_buf[off + 13]; + w3_t[2] = s_userdomain_buf[off + 14]; + w3_t[3] = s_userdomain_buf[off + 15]; + + md5_transform (w0_t, w1_t, w2_t, w3_t, ipad); + } + + w0_t[0] = s_userdomain_buf[off + 0]; + w0_t[1] = s_userdomain_buf[off + 1]; + w0_t[2] = s_userdomain_buf[off + 2]; + w0_t[3] = s_userdomain_buf[off + 3]; + w1_t[0] = s_userdomain_buf[off + 4]; + w1_t[1] = s_userdomain_buf[off + 5]; + w1_t[2] = s_userdomain_buf[off + 6]; + w1_t[3] = s_userdomain_buf[off + 7]; + w2_t[0] = s_userdomain_buf[off + 8]; + w2_t[1] = s_userdomain_buf[off + 9]; + w2_t[2] = s_userdomain_buf[off + 10]; + w2_t[3] = s_userdomain_buf[off + 11]; + w3_t[0] = s_userdomain_buf[off + 12]; + w3_t[1] = s_userdomain_buf[off + 13]; + w3_t[2] = (64 + userdomain_len) * 8; + w3_t[3] = 0; + + hmac_md5_run (w0_t, w1_t, w2_t, w3_t, ipad, opad, digest); + + w0_t[0] = digest[0]; + w0_t[1] = digest[1]; + w0_t[2] = digest[2]; + w0_t[3] = digest[3]; + w1_t[0] = 0; + w1_t[1] = 0; + w1_t[2] = 0; + w1_t[3] = 0; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = 0; + + digest[0] = MD5M_A; + digest[1] = MD5M_B; + digest[2] = MD5M_C; + digest[3] = MD5M_D; + + hmac_md5_pad (w0_t, w1_t, w2_t, w3_t, ipad, opad); + + for (left = chall_len, off = 0; left >= 56; left -= 64, off += 16) + { + w0_t[0] = s_chall_buf[off + 0]; + w0_t[1] = s_chall_buf[off + 1]; + w0_t[2] = s_chall_buf[off + 2]; + w0_t[3] = s_chall_buf[off + 3]; + w1_t[0] = s_chall_buf[off + 4]; + w1_t[1] = s_chall_buf[off + 5]; + w1_t[2] = s_chall_buf[off + 6]; + w1_t[3] = s_chall_buf[off + 7]; + w2_t[0] = s_chall_buf[off + 8]; + w2_t[1] = s_chall_buf[off + 9]; + w2_t[2] = s_chall_buf[off + 10]; + w2_t[3] = s_chall_buf[off + 11]; + w3_t[0] = s_chall_buf[off + 12]; + w3_t[1] = s_chall_buf[off + 13]; + w3_t[2] = s_chall_buf[off + 14]; + w3_t[3] = s_chall_buf[off + 15]; + + md5_transform (w0_t, w1_t, w2_t, w3_t, ipad); + } + + w0_t[0] = s_chall_buf[off + 0]; + w0_t[1] = s_chall_buf[off + 1]; + w0_t[2] = s_chall_buf[off + 2]; + w0_t[3] = s_chall_buf[off + 3]; + w1_t[0] = s_chall_buf[off + 4]; + w1_t[1] = s_chall_buf[off + 5]; + w1_t[2] = s_chall_buf[off + 6]; + w1_t[3] = s_chall_buf[off + 7]; + w2_t[0] = s_chall_buf[off + 8]; + w2_t[1] = s_chall_buf[off + 9]; + w2_t[2] = s_chall_buf[off + 10]; + w2_t[3] = s_chall_buf[off + 11]; + w3_t[0] = s_chall_buf[off + 12]; + w3_t[1] = s_chall_buf[off + 13]; + w3_t[2] = (64 + chall_len) * 8; + w3_t[3] = 0; + + hmac_md5_run (w0_t, w1_t, w2_t, w3_t, ipad, opad, digest); + + const u32x r0 = digest[0]; + const u32x r1 = digest[3]; + const u32x r2 = digest[2]; + const u32x r3 = digest[1]; + + #include VECT_COMPARE_S + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m05600_m04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global netntlm_t *netntlm_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = pws[gid].i[14]; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * s_userdomain, s_chall + */ + + __local u32 s_userdomain_buf[64]; + __local u32 s_chall_buf[256]; + + if (lid < 64) + { + s_userdomain_buf[lid] = netntlm_bufs[salt_pos].userdomain_buf[lid]; + } + + const u32 lid4 = lid * 4; + + s_chall_buf[lid4 + 0] = netntlm_bufs[salt_pos].chall_buf[lid4 + 0]; + s_chall_buf[lid4 + 1] = netntlm_bufs[salt_pos].chall_buf[lid4 + 1]; + s_chall_buf[lid4 + 2] = netntlm_bufs[salt_pos].chall_buf[lid4 + 2]; + s_chall_buf[lid4 + 3] = netntlm_bufs[salt_pos].chall_buf[lid4 + 3]; + + barrier (CLK_LOCAL_MEM_FENCE); + + if (gid >= gid_max) return; + + /** + * main + */ + + m05600m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, netntlm_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset, s_userdomain_buf, s_chall_buf); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m05600_m08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global netntlm_t *netntlm_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = pws[gid].i[14]; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * s_userdomain, s_chall + */ + + __local u32 s_userdomain_buf[64]; + __local u32 s_chall_buf[256]; + + if (lid < 64) + { + s_userdomain_buf[lid] = netntlm_bufs[salt_pos].userdomain_buf[lid]; + } + + const u32 lid4 = lid * 4; + + s_chall_buf[lid4 + 0] = netntlm_bufs[salt_pos].chall_buf[lid4 + 0]; + s_chall_buf[lid4 + 1] = netntlm_bufs[salt_pos].chall_buf[lid4 + 1]; + s_chall_buf[lid4 + 2] = netntlm_bufs[salt_pos].chall_buf[lid4 + 2]; + s_chall_buf[lid4 + 3] = netntlm_bufs[salt_pos].chall_buf[lid4 + 3]; + + barrier (CLK_LOCAL_MEM_FENCE); + + if (gid >= gid_max) return; + + /** + * main + */ + + m05600m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, netntlm_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset, s_userdomain_buf, s_chall_buf); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m05600_m16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global netntlm_t *netntlm_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m05600_s04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global netntlm_t *netntlm_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = pws[gid].i[14]; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * salt + */ + + __local u32 s_userdomain_buf[64]; + __local u32 s_chall_buf[256]; + + if (lid < 64) + { + s_userdomain_buf[lid] = netntlm_bufs[salt_pos].userdomain_buf[lid]; + } + + const u32 lid4 = lid * 4; + + s_chall_buf[lid4 + 0] = netntlm_bufs[salt_pos].chall_buf[lid4 + 0]; + s_chall_buf[lid4 + 1] = netntlm_bufs[salt_pos].chall_buf[lid4 + 1]; + s_chall_buf[lid4 + 2] = netntlm_bufs[salt_pos].chall_buf[lid4 + 2]; + s_chall_buf[lid4 + 3] = netntlm_bufs[salt_pos].chall_buf[lid4 + 3]; + + barrier (CLK_LOCAL_MEM_FENCE); + + if (gid >= gid_max) return; + + /** + * main + */ + + m05600s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, netntlm_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset, s_userdomain_buf, s_chall_buf); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m05600_s08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global netntlm_t *netntlm_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = pws[gid].i[14]; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * salt + */ + + __local u32 s_userdomain_buf[64]; + __local u32 s_chall_buf[256]; + + if (lid < 64) + { + s_userdomain_buf[lid] = netntlm_bufs[salt_pos].userdomain_buf[lid]; + } + + const u32 lid4 = lid * 4; + + s_chall_buf[lid4 + 0] = netntlm_bufs[salt_pos].chall_buf[lid4 + 0]; + s_chall_buf[lid4 + 1] = netntlm_bufs[salt_pos].chall_buf[lid4 + 1]; + s_chall_buf[lid4 + 2] = netntlm_bufs[salt_pos].chall_buf[lid4 + 2]; + s_chall_buf[lid4 + 3] = netntlm_bufs[salt_pos].chall_buf[lid4 + 3]; + + barrier (CLK_LOCAL_MEM_FENCE); + + if (gid >= gid_max) return; + + /** + * main + */ + + m05600s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, netntlm_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset, s_userdomain_buf, s_chall_buf); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m05600_s16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global netntlm_t *netntlm_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/amd/m05800.cl b/amd/m05800.cl new file mode 100644 index 0000000000..a9c10bf26d --- /dev/null +++ b/amd/m05800.cl @@ -0,0 +1,745 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _SHA1_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW4 +#define VECT_SIZE4 +#endif + +#ifdef VLIW5 +#define VECT_SIZE4 +#endif + +#define DGST_R0 0 +#define DGST_R1 1 +#define DGST_R2 2 +#define DGST_R3 3 + +#include "include/kernel_functions.c" +#include "types_amd.c" +#include "common_amd.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +typedef struct +{ + u32 dec; + u32 len; + +} entry_t; + +__constant entry_t pc[1024] = +{ + 0x00000030, 1, 0x00000031, 1, 0x00000032, 1, 0x00000033, 1, 0x00000034, 1, 0x00000035, 1, 0x00000036, 1, 0x00000037, 1, + 0x00000038, 1, 0x00000039, 1, 0x00003031, 2, 0x00003131, 2, 0x00003231, 2, 0x00003331, 2, 0x00003431, 2, 0x00003531, 2, + 0x00003631, 2, 0x00003731, 2, 0x00003831, 2, 0x00003931, 2, 0x00003032, 2, 0x00003132, 2, 0x00003232, 2, 0x00003332, 2, + 0x00003432, 2, 0x00003532, 2, 0x00003632, 2, 0x00003732, 2, 0x00003832, 2, 0x00003932, 2, 0x00003033, 2, 0x00003133, 2, + 0x00003233, 2, 0x00003333, 2, 0x00003433, 2, 0x00003533, 2, 0x00003633, 2, 0x00003733, 2, 0x00003833, 2, 0x00003933, 2, + 0x00003034, 2, 0x00003134, 2, 0x00003234, 2, 0x00003334, 2, 0x00003434, 2, 0x00003534, 2, 0x00003634, 2, 0x00003734, 2, + 0x00003834, 2, 0x00003934, 2, 0x00003035, 2, 0x00003135, 2, 0x00003235, 2, 0x00003335, 2, 0x00003435, 2, 0x00003535, 2, + 0x00003635, 2, 0x00003735, 2, 0x00003835, 2, 0x00003935, 2, 0x00003036, 2, 0x00003136, 2, 0x00003236, 2, 0x00003336, 2, + 0x00003436, 2, 0x00003536, 2, 0x00003636, 2, 0x00003736, 2, 0x00003836, 2, 0x00003936, 2, 0x00003037, 2, 0x00003137, 2, + 0x00003237, 2, 0x00003337, 2, 0x00003437, 2, 0x00003537, 2, 0x00003637, 2, 0x00003737, 2, 0x00003837, 2, 0x00003937, 2, + 0x00003038, 2, 0x00003138, 2, 0x00003238, 2, 0x00003338, 2, 0x00003438, 2, 0x00003538, 2, 0x00003638, 2, 0x00003738, 2, + 0x00003838, 2, 0x00003938, 2, 0x00003039, 2, 0x00003139, 2, 0x00003239, 2, 0x00003339, 2, 0x00003439, 2, 0x00003539, 2, + 0x00003639, 2, 0x00003739, 2, 0x00003839, 2, 0x00003939, 2, 0x00303031, 3, 0x00313031, 3, 0x00323031, 3, 0x00333031, 3, + 0x00343031, 3, 0x00353031, 3, 0x00363031, 3, 0x00373031, 3, 0x00383031, 3, 0x00393031, 3, 0x00303131, 3, 0x00313131, 3, + 0x00323131, 3, 0x00333131, 3, 0x00343131, 3, 0x00353131, 3, 0x00363131, 3, 0x00373131, 3, 0x00383131, 3, 0x00393131, 3, + 0x00303231, 3, 0x00313231, 3, 0x00323231, 3, 0x00333231, 3, 0x00343231, 3, 0x00353231, 3, 0x00363231, 3, 0x00373231, 3, + 0x00383231, 3, 0x00393231, 3, 0x00303331, 3, 0x00313331, 3, 0x00323331, 3, 0x00333331, 3, 0x00343331, 3, 0x00353331, 3, + 0x00363331, 3, 0x00373331, 3, 0x00383331, 3, 0x00393331, 3, 0x00303431, 3, 0x00313431, 3, 0x00323431, 3, 0x00333431, 3, + 0x00343431, 3, 0x00353431, 3, 0x00363431, 3, 0x00373431, 3, 0x00383431, 3, 0x00393431, 3, 0x00303531, 3, 0x00313531, 3, + 0x00323531, 3, 0x00333531, 3, 0x00343531, 3, 0x00353531, 3, 0x00363531, 3, 0x00373531, 3, 0x00383531, 3, 0x00393531, 3, + 0x00303631, 3, 0x00313631, 3, 0x00323631, 3, 0x00333631, 3, 0x00343631, 3, 0x00353631, 3, 0x00363631, 3, 0x00373631, 3, + 0x00383631, 3, 0x00393631, 3, 0x00303731, 3, 0x00313731, 3, 0x00323731, 3, 0x00333731, 3, 0x00343731, 3, 0x00353731, 3, + 0x00363731, 3, 0x00373731, 3, 0x00383731, 3, 0x00393731, 3, 0x00303831, 3, 0x00313831, 3, 0x00323831, 3, 0x00333831, 3, + 0x00343831, 3, 0x00353831, 3, 0x00363831, 3, 0x00373831, 3, 0x00383831, 3, 0x00393831, 3, 0x00303931, 3, 0x00313931, 3, + 0x00323931, 3, 0x00333931, 3, 0x00343931, 3, 0x00353931, 3, 0x00363931, 3, 0x00373931, 3, 0x00383931, 3, 0x00393931, 3, + 0x00303032, 3, 0x00313032, 3, 0x00323032, 3, 0x00333032, 3, 0x00343032, 3, 0x00353032, 3, 0x00363032, 3, 0x00373032, 3, + 0x00383032, 3, 0x00393032, 3, 0x00303132, 3, 0x00313132, 3, 0x00323132, 3, 0x00333132, 3, 0x00343132, 3, 0x00353132, 3, + 0x00363132, 3, 0x00373132, 3, 0x00383132, 3, 0x00393132, 3, 0x00303232, 3, 0x00313232, 3, 0x00323232, 3, 0x00333232, 3, + 0x00343232, 3, 0x00353232, 3, 0x00363232, 3, 0x00373232, 3, 0x00383232, 3, 0x00393232, 3, 0x00303332, 3, 0x00313332, 3, + 0x00323332, 3, 0x00333332, 3, 0x00343332, 3, 0x00353332, 3, 0x00363332, 3, 0x00373332, 3, 0x00383332, 3, 0x00393332, 3, + 0x00303432, 3, 0x00313432, 3, 0x00323432, 3, 0x00333432, 3, 0x00343432, 3, 0x00353432, 3, 0x00363432, 3, 0x00373432, 3, + 0x00383432, 3, 0x00393432, 3, 0x00303532, 3, 0x00313532, 3, 0x00323532, 3, 0x00333532, 3, 0x00343532, 3, 0x00353532, 3, + 0x00363532, 3, 0x00373532, 3, 0x00383532, 3, 0x00393532, 3, 0x00303632, 3, 0x00313632, 3, 0x00323632, 3, 0x00333632, 3, + 0x00343632, 3, 0x00353632, 3, 0x00363632, 3, 0x00373632, 3, 0x00383632, 3, 0x00393632, 3, 0x00303732, 3, 0x00313732, 3, + 0x00323732, 3, 0x00333732, 3, 0x00343732, 3, 0x00353732, 3, 0x00363732, 3, 0x00373732, 3, 0x00383732, 3, 0x00393732, 3, + 0x00303832, 3, 0x00313832, 3, 0x00323832, 3, 0x00333832, 3, 0x00343832, 3, 0x00353832, 3, 0x00363832, 3, 0x00373832, 3, + 0x00383832, 3, 0x00393832, 3, 0x00303932, 3, 0x00313932, 3, 0x00323932, 3, 0x00333932, 3, 0x00343932, 3, 0x00353932, 3, + 0x00363932, 3, 0x00373932, 3, 0x00383932, 3, 0x00393932, 3, 0x00303033, 3, 0x00313033, 3, 0x00323033, 3, 0x00333033, 3, + 0x00343033, 3, 0x00353033, 3, 0x00363033, 3, 0x00373033, 3, 0x00383033, 3, 0x00393033, 3, 0x00303133, 3, 0x00313133, 3, + 0x00323133, 3, 0x00333133, 3, 0x00343133, 3, 0x00353133, 3, 0x00363133, 3, 0x00373133, 3, 0x00383133, 3, 0x00393133, 3, + 0x00303233, 3, 0x00313233, 3, 0x00323233, 3, 0x00333233, 3, 0x00343233, 3, 0x00353233, 3, 0x00363233, 3, 0x00373233, 3, + 0x00383233, 3, 0x00393233, 3, 0x00303333, 3, 0x00313333, 3, 0x00323333, 3, 0x00333333, 3, 0x00343333, 3, 0x00353333, 3, + 0x00363333, 3, 0x00373333, 3, 0x00383333, 3, 0x00393333, 3, 0x00303433, 3, 0x00313433, 3, 0x00323433, 3, 0x00333433, 3, + 0x00343433, 3, 0x00353433, 3, 0x00363433, 3, 0x00373433, 3, 0x00383433, 3, 0x00393433, 3, 0x00303533, 3, 0x00313533, 3, + 0x00323533, 3, 0x00333533, 3, 0x00343533, 3, 0x00353533, 3, 0x00363533, 3, 0x00373533, 3, 0x00383533, 3, 0x00393533, 3, + 0x00303633, 3, 0x00313633, 3, 0x00323633, 3, 0x00333633, 3, 0x00343633, 3, 0x00353633, 3, 0x00363633, 3, 0x00373633, 3, + 0x00383633, 3, 0x00393633, 3, 0x00303733, 3, 0x00313733, 3, 0x00323733, 3, 0x00333733, 3, 0x00343733, 3, 0x00353733, 3, + 0x00363733, 3, 0x00373733, 3, 0x00383733, 3, 0x00393733, 3, 0x00303833, 3, 0x00313833, 3, 0x00323833, 3, 0x00333833, 3, + 0x00343833, 3, 0x00353833, 3, 0x00363833, 3, 0x00373833, 3, 0x00383833, 3, 0x00393833, 3, 0x00303933, 3, 0x00313933, 3, + 0x00323933, 3, 0x00333933, 3, 0x00343933, 3, 0x00353933, 3, 0x00363933, 3, 0x00373933, 3, 0x00383933, 3, 0x00393933, 3, + 0x00303034, 3, 0x00313034, 3, 0x00323034, 3, 0x00333034, 3, 0x00343034, 3, 0x00353034, 3, 0x00363034, 3, 0x00373034, 3, + 0x00383034, 3, 0x00393034, 3, 0x00303134, 3, 0x00313134, 3, 0x00323134, 3, 0x00333134, 3, 0x00343134, 3, 0x00353134, 3, + 0x00363134, 3, 0x00373134, 3, 0x00383134, 3, 0x00393134, 3, 0x00303234, 3, 0x00313234, 3, 0x00323234, 3, 0x00333234, 3, + 0x00343234, 3, 0x00353234, 3, 0x00363234, 3, 0x00373234, 3, 0x00383234, 3, 0x00393234, 3, 0x00303334, 3, 0x00313334, 3, + 0x00323334, 3, 0x00333334, 3, 0x00343334, 3, 0x00353334, 3, 0x00363334, 3, 0x00373334, 3, 0x00383334, 3, 0x00393334, 3, + 0x00303434, 3, 0x00313434, 3, 0x00323434, 3, 0x00333434, 3, 0x00343434, 3, 0x00353434, 3, 0x00363434, 3, 0x00373434, 3, + 0x00383434, 3, 0x00393434, 3, 0x00303534, 3, 0x00313534, 3, 0x00323534, 3, 0x00333534, 3, 0x00343534, 3, 0x00353534, 3, + 0x00363534, 3, 0x00373534, 3, 0x00383534, 3, 0x00393534, 3, 0x00303634, 3, 0x00313634, 3, 0x00323634, 3, 0x00333634, 3, + 0x00343634, 3, 0x00353634, 3, 0x00363634, 3, 0x00373634, 3, 0x00383634, 3, 0x00393634, 3, 0x00303734, 3, 0x00313734, 3, + 0x00323734, 3, 0x00333734, 3, 0x00343734, 3, 0x00353734, 3, 0x00363734, 3, 0x00373734, 3, 0x00383734, 3, 0x00393734, 3, + 0x00303834, 3, 0x00313834, 3, 0x00323834, 3, 0x00333834, 3, 0x00343834, 3, 0x00353834, 3, 0x00363834, 3, 0x00373834, 3, + 0x00383834, 3, 0x00393834, 3, 0x00303934, 3, 0x00313934, 3, 0x00323934, 3, 0x00333934, 3, 0x00343934, 3, 0x00353934, 3, + 0x00363934, 3, 0x00373934, 3, 0x00383934, 3, 0x00393934, 3, 0x00303035, 3, 0x00313035, 3, 0x00323035, 3, 0x00333035, 3, + 0x00343035, 3, 0x00353035, 3, 0x00363035, 3, 0x00373035, 3, 0x00383035, 3, 0x00393035, 3, 0x00303135, 3, 0x00313135, 3, + 0x00323135, 3, 0x00333135, 3, 0x00343135, 3, 0x00353135, 3, 0x00363135, 3, 0x00373135, 3, 0x00383135, 3, 0x00393135, 3, + 0x00303235, 3, 0x00313235, 3, 0x00323235, 3, 0x00333235, 3, 0x00343235, 3, 0x00353235, 3, 0x00363235, 3, 0x00373235, 3, + 0x00383235, 3, 0x00393235, 3, 0x00303335, 3, 0x00313335, 3, 0x00323335, 3, 0x00333335, 3, 0x00343335, 3, 0x00353335, 3, + 0x00363335, 3, 0x00373335, 3, 0x00383335, 3, 0x00393335, 3, 0x00303435, 3, 0x00313435, 3, 0x00323435, 3, 0x00333435, 3, + 0x00343435, 3, 0x00353435, 3, 0x00363435, 3, 0x00373435, 3, 0x00383435, 3, 0x00393435, 3, 0x00303535, 3, 0x00313535, 3, + 0x00323535, 3, 0x00333535, 3, 0x00343535, 3, 0x00353535, 3, 0x00363535, 3, 0x00373535, 3, 0x00383535, 3, 0x00393535, 3, + 0x00303635, 3, 0x00313635, 3, 0x00323635, 3, 0x00333635, 3, 0x00343635, 3, 0x00353635, 3, 0x00363635, 3, 0x00373635, 3, + 0x00383635, 3, 0x00393635, 3, 0x00303735, 3, 0x00313735, 3, 0x00323735, 3, 0x00333735, 3, 0x00343735, 3, 0x00353735, 3, + 0x00363735, 3, 0x00373735, 3, 0x00383735, 3, 0x00393735, 3, 0x00303835, 3, 0x00313835, 3, 0x00323835, 3, 0x00333835, 3, + 0x00343835, 3, 0x00353835, 3, 0x00363835, 3, 0x00373835, 3, 0x00383835, 3, 0x00393835, 3, 0x00303935, 3, 0x00313935, 3, + 0x00323935, 3, 0x00333935, 3, 0x00343935, 3, 0x00353935, 3, 0x00363935, 3, 0x00373935, 3, 0x00383935, 3, 0x00393935, 3, + 0x00303036, 3, 0x00313036, 3, 0x00323036, 3, 0x00333036, 3, 0x00343036, 3, 0x00353036, 3, 0x00363036, 3, 0x00373036, 3, + 0x00383036, 3, 0x00393036, 3, 0x00303136, 3, 0x00313136, 3, 0x00323136, 3, 0x00333136, 3, 0x00343136, 3, 0x00353136, 3, + 0x00363136, 3, 0x00373136, 3, 0x00383136, 3, 0x00393136, 3, 0x00303236, 3, 0x00313236, 3, 0x00323236, 3, 0x00333236, 3, + 0x00343236, 3, 0x00353236, 3, 0x00363236, 3, 0x00373236, 3, 0x00383236, 3, 0x00393236, 3, 0x00303336, 3, 0x00313336, 3, + 0x00323336, 3, 0x00333336, 3, 0x00343336, 3, 0x00353336, 3, 0x00363336, 3, 0x00373336, 3, 0x00383336, 3, 0x00393336, 3, + 0x00303436, 3, 0x00313436, 3, 0x00323436, 3, 0x00333436, 3, 0x00343436, 3, 0x00353436, 3, 0x00363436, 3, 0x00373436, 3, + 0x00383436, 3, 0x00393436, 3, 0x00303536, 3, 0x00313536, 3, 0x00323536, 3, 0x00333536, 3, 0x00343536, 3, 0x00353536, 3, + 0x00363536, 3, 0x00373536, 3, 0x00383536, 3, 0x00393536, 3, 0x00303636, 3, 0x00313636, 3, 0x00323636, 3, 0x00333636, 3, + 0x00343636, 3, 0x00353636, 3, 0x00363636, 3, 0x00373636, 3, 0x00383636, 3, 0x00393636, 3, 0x00303736, 3, 0x00313736, 3, + 0x00323736, 3, 0x00333736, 3, 0x00343736, 3, 0x00353736, 3, 0x00363736, 3, 0x00373736, 3, 0x00383736, 3, 0x00393736, 3, + 0x00303836, 3, 0x00313836, 3, 0x00323836, 3, 0x00333836, 3, 0x00343836, 3, 0x00353836, 3, 0x00363836, 3, 0x00373836, 3, + 0x00383836, 3, 0x00393836, 3, 0x00303936, 3, 0x00313936, 3, 0x00323936, 3, 0x00333936, 3, 0x00343936, 3, 0x00353936, 3, + 0x00363936, 3, 0x00373936, 3, 0x00383936, 3, 0x00393936, 3, 0x00303037, 3, 0x00313037, 3, 0x00323037, 3, 0x00333037, 3, + 0x00343037, 3, 0x00353037, 3, 0x00363037, 3, 0x00373037, 3, 0x00383037, 3, 0x00393037, 3, 0x00303137, 3, 0x00313137, 3, + 0x00323137, 3, 0x00333137, 3, 0x00343137, 3, 0x00353137, 3, 0x00363137, 3, 0x00373137, 3, 0x00383137, 3, 0x00393137, 3, + 0x00303237, 3, 0x00313237, 3, 0x00323237, 3, 0x00333237, 3, 0x00343237, 3, 0x00353237, 3, 0x00363237, 3, 0x00373237, 3, + 0x00383237, 3, 0x00393237, 3, 0x00303337, 3, 0x00313337, 3, 0x00323337, 3, 0x00333337, 3, 0x00343337, 3, 0x00353337, 3, + 0x00363337, 3, 0x00373337, 3, 0x00383337, 3, 0x00393337, 3, 0x00303437, 3, 0x00313437, 3, 0x00323437, 3, 0x00333437, 3, + 0x00343437, 3, 0x00353437, 3, 0x00363437, 3, 0x00373437, 3, 0x00383437, 3, 0x00393437, 3, 0x00303537, 3, 0x00313537, 3, + 0x00323537, 3, 0x00333537, 3, 0x00343537, 3, 0x00353537, 3, 0x00363537, 3, 0x00373537, 3, 0x00383537, 3, 0x00393537, 3, + 0x00303637, 3, 0x00313637, 3, 0x00323637, 3, 0x00333637, 3, 0x00343637, 3, 0x00353637, 3, 0x00363637, 3, 0x00373637, 3, + 0x00383637, 3, 0x00393637, 3, 0x00303737, 3, 0x00313737, 3, 0x00323737, 3, 0x00333737, 3, 0x00343737, 3, 0x00353737, 3, + 0x00363737, 3, 0x00373737, 3, 0x00383737, 3, 0x00393737, 3, 0x00303837, 3, 0x00313837, 3, 0x00323837, 3, 0x00333837, 3, + 0x00343837, 3, 0x00353837, 3, 0x00363837, 3, 0x00373837, 3, 0x00383837, 3, 0x00393837, 3, 0x00303937, 3, 0x00313937, 3, + 0x00323937, 3, 0x00333937, 3, 0x00343937, 3, 0x00353937, 3, 0x00363937, 3, 0x00373937, 3, 0x00383937, 3, 0x00393937, 3, + 0x00303038, 3, 0x00313038, 3, 0x00323038, 3, 0x00333038, 3, 0x00343038, 3, 0x00353038, 3, 0x00363038, 3, 0x00373038, 3, + 0x00383038, 3, 0x00393038, 3, 0x00303138, 3, 0x00313138, 3, 0x00323138, 3, 0x00333138, 3, 0x00343138, 3, 0x00353138, 3, + 0x00363138, 3, 0x00373138, 3, 0x00383138, 3, 0x00393138, 3, 0x00303238, 3, 0x00313238, 3, 0x00323238, 3, 0x00333238, 3, + 0x00343238, 3, 0x00353238, 3, 0x00363238, 3, 0x00373238, 3, 0x00383238, 3, 0x00393238, 3, 0x00303338, 3, 0x00313338, 3, + 0x00323338, 3, 0x00333338, 3, 0x00343338, 3, 0x00353338, 3, 0x00363338, 3, 0x00373338, 3, 0x00383338, 3, 0x00393338, 3, + 0x00303438, 3, 0x00313438, 3, 0x00323438, 3, 0x00333438, 3, 0x00343438, 3, 0x00353438, 3, 0x00363438, 3, 0x00373438, 3, + 0x00383438, 3, 0x00393438, 3, 0x00303538, 3, 0x00313538, 3, 0x00323538, 3, 0x00333538, 3, 0x00343538, 3, 0x00353538, 3, + 0x00363538, 3, 0x00373538, 3, 0x00383538, 3, 0x00393538, 3, 0x00303638, 3, 0x00313638, 3, 0x00323638, 3, 0x00333638, 3, + 0x00343638, 3, 0x00353638, 3, 0x00363638, 3, 0x00373638, 3, 0x00383638, 3, 0x00393638, 3, 0x00303738, 3, 0x00313738, 3, + 0x00323738, 3, 0x00333738, 3, 0x00343738, 3, 0x00353738, 3, 0x00363738, 3, 0x00373738, 3, 0x00383738, 3, 0x00393738, 3, + 0x00303838, 3, 0x00313838, 3, 0x00323838, 3, 0x00333838, 3, 0x00343838, 3, 0x00353838, 3, 0x00363838, 3, 0x00373838, 3, + 0x00383838, 3, 0x00393838, 3, 0x00303938, 3, 0x00313938, 3, 0x00323938, 3, 0x00333938, 3, 0x00343938, 3, 0x00353938, 3, + 0x00363938, 3, 0x00373938, 3, 0x00383938, 3, 0x00393938, 3, 0x00303039, 3, 0x00313039, 3, 0x00323039, 3, 0x00333039, 3, + 0x00343039, 3, 0x00353039, 3, 0x00363039, 3, 0x00373039, 3, 0x00383039, 3, 0x00393039, 3, 0x00303139, 3, 0x00313139, 3, + 0x00323139, 3, 0x00333139, 3, 0x00343139, 3, 0x00353139, 3, 0x00363139, 3, 0x00373139, 3, 0x00383139, 3, 0x00393139, 3, + 0x00303239, 3, 0x00313239, 3, 0x00323239, 3, 0x00333239, 3, 0x00343239, 3, 0x00353239, 3, 0x00363239, 3, 0x00373239, 3, + 0x00383239, 3, 0x00393239, 3, 0x00303339, 3, 0x00313339, 3, 0x00323339, 3, 0x00333339, 3, 0x00343339, 3, 0x00353339, 3, + 0x00363339, 3, 0x00373339, 3, 0x00383339, 3, 0x00393339, 3, 0x00303439, 3, 0x00313439, 3, 0x00323439, 3, 0x00333439, 3, + 0x00343439, 3, 0x00353439, 3, 0x00363439, 3, 0x00373439, 3, 0x00383439, 3, 0x00393439, 3, 0x00303539, 3, 0x00313539, 3, + 0x00323539, 3, 0x00333539, 3, 0x00343539, 3, 0x00353539, 3, 0x00363539, 3, 0x00373539, 3, 0x00383539, 3, 0x00393539, 3, + 0x00303639, 3, 0x00313639, 3, 0x00323639, 3, 0x00333639, 3, 0x00343639, 3, 0x00353639, 3, 0x00363639, 3, 0x00373639, 3, + 0x00383639, 3, 0x00393639, 3, 0x00303739, 3, 0x00313739, 3, 0x00323739, 3, 0x00333739, 3, 0x00343739, 3, 0x00353739, 3, + 0x00363739, 3, 0x00373739, 3, 0x00383739, 3, 0x00393739, 3, 0x00303839, 3, 0x00313839, 3, 0x00323839, 3, 0x00333839, 3, + 0x00343839, 3, 0x00353839, 3, 0x00363839, 3, 0x00373839, 3, 0x00383839, 3, 0x00393839, 3, 0x00303939, 3, 0x00313939, 3, + 0x00323939, 3, 0x00333939, 3, 0x00343939, 3, 0x00353939, 3, 0x00363939, 3, 0x00373939, 3, 0x00383939, 3, 0x00393939, 3, + 0x30303031, 4, 0x31303031, 4, 0x32303031, 4, 0x33303031, 4, 0x34303031, 4, 0x35303031, 4, 0x36303031, 4, 0x37303031, 4, + 0x38303031, 4, 0x39303031, 4, 0x30313031, 4, 0x31313031, 4, 0x32313031, 4, 0x33313031, 4, 0x34313031, 4, 0x35313031, 4, + 0x36313031, 4, 0x37313031, 4, 0x38313031, 4, 0x39313031, 4, 0x30323031, 4, 0x31323031, 4, 0x32323031, 4, 0x33323031, 4, +}; + +static void append_word (u32x w0[4], u32x w1[4], const u32x append[4], const u32 offset) +{ + switch (offset) + { + case 1: + w0[0] = w0[0] | append[0] << 8; + w0[1] = append[0] >> 24 | append[1] << 8; + w0[2] = append[1] >> 24 | append[2] << 8; + w0[3] = append[2] >> 24 | append[3] << 8; + break; + + case 2: + w0[0] = w0[0] | append[0] << 16; + w0[1] = append[0] >> 16 | append[1] << 16; + w0[2] = append[1] >> 16 | append[2] << 16; + w0[3] = append[2] >> 16 | append[3] << 16; + break; + + case 3: + w0[0] = w0[0] | append[0] << 24; + w0[1] = append[0] >> 8 | append[1] << 24; + w0[2] = append[1] >> 8 | append[2] << 24; + w0[3] = append[2] >> 8 | append[3] << 24; + break; + + case 4: + w0[1] = append[0]; + w0[2] = append[1]; + w0[3] = append[2]; + w1[0] = append[3]; + break; + } +} + +static void append_salt (u32x w0[4], u32x w1[4], u32x w2[4], const u32 append[5], const u32 offset) +{ + switch (offset) + { + case 2: + w0[0] = w0[0] | append[0] << 16; + w0[1] = append[0] >> 16 | append[1] << 16; + w0[2] = append[1] >> 16 | append[2] << 16; + w0[3] = append[2] >> 16 | append[3] << 16; + w1[0] = append[3] >> 16 | append[4] << 16; + w1[1] = append[4] >> 16; + break; + + case 3: + w0[0] = w0[0] | append[0] << 24; + w0[1] = append[0] >> 8 | append[1] << 24; + w0[2] = append[1] >> 8 | append[2] << 24; + w0[3] = append[2] >> 8 | append[3] << 24; + w1[0] = append[3] >> 8 | append[4] << 24; + w1[1] = append[4] >> 8; + break; + + case 4: + w0[1] = append[0]; + w0[2] = append[1]; + w0[3] = append[2]; + w1[0] = append[3]; + w1[1] = append[4]; + break; + + case 5: + w0[1] = w0[1] | append[0] << 8; + w0[2] = append[0] >> 24 | append[1] << 8; + w0[3] = append[1] >> 24 | append[2] << 8; + w1[0] = append[2] >> 24 | append[3] << 8; + w1[1] = append[3] >> 24 | append[4] << 8; + w1[2] = append[4] >> 24; + break; + + case 6: + w0[1] = w0[1] | append[0] << 16; + w0[2] = append[0] >> 16 | append[1] << 16; + w0[3] = append[1] >> 16 | append[2] << 16; + w1[0] = append[2] >> 16 | append[3] << 16; + w1[1] = append[3] >> 16 | append[4] << 16; + w1[2] = append[4] >> 16; + break; + + case 7: + w0[1] = w0[1] | append[0] << 24; + w0[2] = append[0] >> 8 | append[1] << 24; + w0[3] = append[1] >> 8 | append[2] << 24; + w1[0] = append[2] >> 8 | append[3] << 24; + w1[1] = append[3] >> 8 | append[4] << 24; + w1[2] = append[4] >> 8; + break; + + case 8: + w0[2] = append[0]; + w0[3] = append[1]; + w1[0] = append[2]; + w1[1] = append[3]; + w1[2] = append[4]; + break; + + case 9: + w0[2] = w0[2] | append[0] << 8; + w0[3] = append[0] >> 24 | append[1] << 8; + w1[0] = append[1] >> 24 | append[2] << 8; + w1[1] = append[2] >> 24 | append[3] << 8; + w1[2] = append[3] >> 24 | append[4] << 8; + w1[3] = append[4] >> 24; + break; + + case 10: + w0[2] = w0[2] | append[0] << 16; + w0[3] = append[0] >> 16 | append[1] << 16; + w1[0] = append[1] >> 16 | append[2] << 16; + w1[1] = append[2] >> 16 | append[3] << 16; + w1[2] = append[3] >> 16 | append[4] << 16; + w1[3] = append[4] >> 16; + break; + + case 11: + w0[2] = w0[2] | append[0] << 24; + w0[3] = append[0] >> 8 | append[1] << 24; + w1[0] = append[1] >> 8 | append[2] << 24; + w1[1] = append[2] >> 8 | append[3] << 24; + w1[2] = append[3] >> 8 | append[4] << 24; + w1[3] = append[4] >> 8; + break; + + case 12: + w0[3] = append[0]; + w1[0] = append[1]; + w1[1] = append[2]; + w1[2] = append[3]; + w1[3] = append[4]; + break; + + case 13: + w0[3] = w0[3] | append[0] << 8; + w1[0] = append[0] >> 24 | append[1] << 8; + w1[1] = append[1] >> 24 | append[2] << 8; + w1[2] = append[2] >> 24 | append[3] << 8; + w1[3] = append[3] >> 24 | append[4] << 8; + w2[0] = append[4] >> 24; + break; + + case 14: + w0[3] = w0[3] | append[0] << 16; + w1[0] = append[0] >> 16 | append[1] << 16; + w1[1] = append[1] >> 16 | append[2] << 16; + w1[2] = append[2] >> 16 | append[3] << 16; + w1[3] = append[3] >> 16 | append[4] << 16; + w2[0] = append[4] >> 16; + break; + + case 15: + w0[3] = w0[3] | append[0] << 24; + w1[0] = append[0] >> 8 | append[1] << 24; + w1[1] = append[1] >> 8 | append[2] << 24; + w1[2] = append[2] >> 8 | append[3] << 24; + w1[3] = append[3] >> 8 | append[4] << 24; + w2[0] = append[4] >> 8; + break; + + case 16: + w1[0] = append[0]; + w1[1] = append[1]; + w1[2] = append[2]; + w1[3] = append[3]; + w2[0] = append[4]; + break; + + case 17: + w1[0] = w1[0] | append[0] << 8; + w1[1] = append[0] >> 24 | append[1] << 8; + w1[2] = append[1] >> 24 | append[2] << 8; + w1[3] = append[2] >> 24 | append[3] << 8; + w2[0] = append[3] >> 24 | append[4] << 8; + w2[1] = append[4] >> 24; + break; + + case 18: + w1[0] = w1[0] | append[0] << 16; + w1[1] = append[0] >> 16 | append[1] << 16; + w1[2] = append[1] >> 16 | append[2] << 16; + w1[3] = append[2] >> 16 | append[3] << 16; + w2[0] = append[3] >> 16 | append[4] << 16; + w2[1] = append[4] >> 16; + break; + + case 19: + w1[0] = w1[0] | append[0] << 24; + w1[1] = append[0] >> 8 | append[1] << 24; + w1[2] = append[1] >> 8 | append[2] << 24; + w1[3] = append[2] >> 8 | append[3] << 24; + w2[0] = append[3] >> 8 | append[4] << 24; + w2[1] = append[4] >> 8; + break; + } +} + +static void sha1_transform (const u32x w0[4], const u32x w1[4], const u32x w2[4], const u32x w3[4], u32x digest[5]) +{ + u32x A = digest[0]; + u32x B = digest[1]; + u32x C = digest[2]; + u32x D = digest[3]; + u32x E = digest[4]; + + u32x w0_t = w0[0]; + u32x w1_t = w0[1]; + u32x w2_t = w0[2]; + u32x w3_t = w0[3]; + u32x w4_t = w1[0]; + u32x w5_t = w1[1]; + u32x w6_t = w1[2]; + u32x w7_t = w1[3]; + u32x w8_t = w2[0]; + u32x w9_t = w2[1]; + u32x wa_t = w2[2]; + u32x wb_t = w2[3]; + u32x wc_t = w3[0]; + u32x wd_t = w3[1]; + u32x we_t = w3[2]; + u32x wf_t = w3[3]; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, A, B, C, D, E, w0_t); + SHA1_STEP (SHA1_F0o, E, A, B, C, D, w1_t); + SHA1_STEP (SHA1_F0o, D, E, A, B, C, w2_t); + SHA1_STEP (SHA1_F0o, C, D, E, A, B, w3_t); + SHA1_STEP (SHA1_F0o, B, C, D, E, A, w4_t); + SHA1_STEP (SHA1_F0o, A, B, C, D, E, w5_t); + SHA1_STEP (SHA1_F0o, E, A, B, C, D, w6_t); + SHA1_STEP (SHA1_F0o, D, E, A, B, C, w7_t); + SHA1_STEP (SHA1_F0o, C, D, E, A, B, w8_t); + SHA1_STEP (SHA1_F0o, B, C, D, E, A, w9_t); + SHA1_STEP (SHA1_F0o, A, B, C, D, E, wa_t); + SHA1_STEP (SHA1_F0o, E, A, B, C, D, wb_t); + SHA1_STEP (SHA1_F0o, D, E, A, B, C, wc_t); + SHA1_STEP (SHA1_F0o, C, D, E, A, B, wd_t); + SHA1_STEP (SHA1_F0o, B, C, D, E, A, we_t); + SHA1_STEP (SHA1_F0o, A, B, C, D, E, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F0o, E, A, B, C, D, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F0o, D, E, A, B, C, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F0o, C, D, E, A, B, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F0o, B, C, D, E, A, w3_t); + + #undef K + #define K SHA1C01 + + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w7_t); + + #undef K + #define K SHA1C02 + + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, wb_t); + + #undef K + #define K SHA1C03 + + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, wf_t); + + digest[0] += A; + digest[1] += B; + digest[2] += C; + digest[3] += D; + digest[4] += E; +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m05800_init (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global androidpin_tmp_t *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x word_buf[4]; + + word_buf[0] = pws[gid].i[ 0]; + word_buf[1] = pws[gid].i[ 1]; + word_buf[2] = pws[gid].i[ 2]; + word_buf[3] = pws[gid].i[ 3]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * salt + */ + + u32 salt_len = salt_bufs[salt_pos].salt_len; + + u32 salt_buf[5]; + + salt_buf[0] = salt_bufs[salt_pos].salt_buf[0]; + salt_buf[1] = salt_bufs[salt_pos].salt_buf[1]; + salt_buf[2] = salt_bufs[salt_pos].salt_buf[2]; + salt_buf[3] = salt_bufs[salt_pos].salt_buf[3]; + salt_buf[4] = salt_bufs[salt_pos].salt_buf[4]; + + /** + * init + */ + + const u32 pc_len = 1; + const u32 pc_dec = 0x30; + + u32x data0[4] = { 0, 0, 0, 0 }; + u32x data1[4] = { 0, 0, 0, 0 }; + u32x data2[4] = { 0, 0, 0, 0 }; + + data0[0] = pc_dec; + + append_word (data0, data1, word_buf, pc_len); + + append_salt (data0, data1, data2, salt_buf, pc_len + pw_len); + + u32x w0[4]; + u32x w1[4]; + u32x w2[4]; + u32x w3[4]; + + w0[0] = swap_workaround (data0[0]); + w0[1] = swap_workaround (data0[1]); + w0[2] = swap_workaround (data0[2]); + w0[3] = swap_workaround (data0[3]); + w1[0] = swap_workaround (data1[0]); + w1[1] = swap_workaround (data1[1]); + w1[2] = swap_workaround (data1[2]); + w1[3] = swap_workaround (data1[3]); + w2[0] = swap_workaround (data2[0]); + w2[1] = swap_workaround (data2[1]); + w2[2] = 0; + w2[3] = 0; + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = (pc_len + pw_len + salt_len) * 8; + + u32x digest[5]; + + digest[0] = SHA1M_A; + digest[1] = SHA1M_B; + digest[2] = SHA1M_C; + digest[3] = SHA1M_D; + digest[4] = SHA1M_E; + + sha1_transform (w0, w1, w2, w3, digest); + + tmps[gid].digest_buf[0] = digest[0]; + tmps[gid].digest_buf[1] = digest[1]; + tmps[gid].digest_buf[2] = digest[2]; + tmps[gid].digest_buf[3] = digest[3]; + tmps[gid].digest_buf[4] = digest[4]; +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m05800_loop (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global androidpin_tmp_t *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + u32x word_buf[4]; + + word_buf[0] = pws[gid].i[ 0]; + word_buf[1] = pws[gid].i[ 1]; + word_buf[2] = pws[gid].i[ 2]; + word_buf[3] = pws[gid].i[ 3]; + + const u32 pw_len = pws[gid].pw_len; + + const u32 lid = get_local_id (0); + + u32x digest[5]; + + digest[0] = tmps[gid].digest_buf[0]; + digest[1] = tmps[gid].digest_buf[1]; + digest[2] = tmps[gid].digest_buf[2]; + digest[3] = tmps[gid].digest_buf[3]; + digest[4] = tmps[gid].digest_buf[4]; + + /** + * cache precomputed conversion table in shared memory + */ + + __local entry_t s_pc[1024]; + + const u32 lid16 = lid * 16; + + s_pc[lid16 + 0] = pc[lid16 + 0]; + s_pc[lid16 + 1] = pc[lid16 + 1]; + s_pc[lid16 + 2] = pc[lid16 + 2]; + s_pc[lid16 + 3] = pc[lid16 + 3]; + s_pc[lid16 + 4] = pc[lid16 + 4]; + s_pc[lid16 + 5] = pc[lid16 + 5]; + s_pc[lid16 + 6] = pc[lid16 + 6]; + s_pc[lid16 + 7] = pc[lid16 + 7]; + s_pc[lid16 + 8] = pc[lid16 + 8]; + s_pc[lid16 + 9] = pc[lid16 + 9]; + s_pc[lid16 + 10] = pc[lid16 + 10]; + s_pc[lid16 + 11] = pc[lid16 + 11]; + s_pc[lid16 + 12] = pc[lid16 + 12]; + s_pc[lid16 + 13] = pc[lid16 + 13]; + s_pc[lid16 + 14] = pc[lid16 + 14]; + s_pc[lid16 + 15] = pc[lid16 + 15]; + + barrier (CLK_LOCAL_MEM_FENCE); + + if (gid >= gid_max) return; + + /** + * salt + */ + + u32 salt_len = salt_bufs[salt_pos].salt_len; + + u32 salt_buf[5]; + + salt_buf[0] = salt_bufs[salt_pos].salt_buf[0]; + salt_buf[1] = salt_bufs[salt_pos].salt_buf[1]; + salt_buf[2] = salt_bufs[salt_pos].salt_buf[2]; + salt_buf[3] = salt_bufs[salt_pos].salt_buf[3]; + salt_buf[4] = salt_bufs[salt_pos].salt_buf[4]; + + /** + * loop + */ + + for (u32 i = 0, j = loop_pos + 1; i < loop_cnt; i++, j++) + { + const u32 pc_len = s_pc[j].len; + const u32 pc_dec = s_pc[j].dec; + + u32x data0[4] = { 0, 0, 0, 0 }; + u32x data1[4] = { 0, 0, 0, 0 }; + u32x data2[4] = { 0, 0, 0, 0 }; + + data0[0] = pc_dec; + + append_word (data0, data1, word_buf, pc_len); + + append_salt (data0, data1, data2, salt_buf, pc_len + pw_len); + + u32x w0[4]; + u32x w1[4]; + u32x w2[4]; + u32x w3[4]; + + w0[0] = digest[0]; + w0[1] = digest[1]; + w0[2] = digest[2]; + w0[3] = digest[3]; + w1[0] = digest[4]; + w1[1] = swap_workaround (data0[0]); + w1[2] = swap_workaround (data0[1]); + w1[3] = swap_workaround (data0[2]); + w2[0] = swap_workaround (data0[3]); + w2[1] = swap_workaround (data1[0]); + w2[2] = swap_workaround (data1[1]); + w2[3] = swap_workaround (data1[2]); + w3[0] = swap_workaround (data1[3]); + w3[1] = swap_workaround (data2[0]); + w3[2] = 0; + w3[3] = (20 + pc_len + pw_len + salt_len) * 8; + + digest[0] = SHA1M_A; + digest[1] = SHA1M_B; + digest[2] = SHA1M_C; + digest[3] = SHA1M_D; + digest[4] = SHA1M_E; + + sha1_transform (w0, w1, w2, w3, digest); + } + + tmps[gid].digest_buf[0] = digest[0]; + tmps[gid].digest_buf[1] = digest[1]; + tmps[gid].digest_buf[2] = digest[2]; + tmps[gid].digest_buf[3] = digest[3]; + tmps[gid].digest_buf[4] = digest[4]; +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m05800_comp (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global androidpin_tmp_t *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + const u32 lid = get_local_id (0); + + /** + * digest + */ + + const u32x r0 = tmps[gid].digest_buf[DGST_R0]; + const u32x r1 = tmps[gid].digest_buf[DGST_R1]; + const u32x r2 = tmps[gid].digest_buf[DGST_R2]; + const u32x r3 = tmps[gid].digest_buf[DGST_R3]; + + #define il_pos 0 + + #include VECT_COMPARE_M +} diff --git a/amd/m06000_a0.cl b/amd/m06000_a0.cl new file mode 100644 index 0000000000..0d8448b34d --- /dev/null +++ b/amd/m06000_a0.cl @@ -0,0 +1,483 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _RIPEMD160_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW4 +#define VECT_SIZE4 +#endif + +#ifdef VLIW5 +#define VECT_SIZE4 +#endif + +#define DGST_R0 0 +#define DGST_R1 1 +#define DGST_R2 2 +#define DGST_R3 3 + +#include "include/kernel_functions.c" +#include "types_amd.c" +#include "common_amd.c" +#include "include/rp_gpu.h" +#include "rp_amd.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +static void ripemd160_transform (const u32x w[16], u32x dgst[5]) +{ + u32x a1 = dgst[0]; + u32x b1 = dgst[1]; + u32x c1 = dgst[2]; + u32x d1 = dgst[3]; + u32x e1 = dgst[4]; + + RIPEMD160_STEP (RIPEMD160_F , a1, b1, c1, d1, e1, w[ 0], RIPEMD160C00, RIPEMD160S00); + RIPEMD160_STEP (RIPEMD160_F , e1, a1, b1, c1, d1, w[ 1], RIPEMD160C00, RIPEMD160S01); + RIPEMD160_STEP (RIPEMD160_F , d1, e1, a1, b1, c1, w[ 2], RIPEMD160C00, RIPEMD160S02); + RIPEMD160_STEP (RIPEMD160_F , c1, d1, e1, a1, b1, w[ 3], RIPEMD160C00, RIPEMD160S03); + RIPEMD160_STEP (RIPEMD160_F , b1, c1, d1, e1, a1, w[ 4], RIPEMD160C00, RIPEMD160S04); + RIPEMD160_STEP (RIPEMD160_F , a1, b1, c1, d1, e1, w[ 5], RIPEMD160C00, RIPEMD160S05); + RIPEMD160_STEP (RIPEMD160_F , e1, a1, b1, c1, d1, w[ 6], RIPEMD160C00, RIPEMD160S06); + RIPEMD160_STEP (RIPEMD160_F , d1, e1, a1, b1, c1, w[ 7], RIPEMD160C00, RIPEMD160S07); + RIPEMD160_STEP (RIPEMD160_F , c1, d1, e1, a1, b1, w[ 8], RIPEMD160C00, RIPEMD160S08); + RIPEMD160_STEP (RIPEMD160_F , b1, c1, d1, e1, a1, w[ 9], RIPEMD160C00, RIPEMD160S09); + RIPEMD160_STEP (RIPEMD160_F , a1, b1, c1, d1, e1, w[10], RIPEMD160C00, RIPEMD160S0A); + RIPEMD160_STEP (RIPEMD160_F , e1, a1, b1, c1, d1, w[11], RIPEMD160C00, RIPEMD160S0B); + RIPEMD160_STEP (RIPEMD160_F , d1, e1, a1, b1, c1, w[12], RIPEMD160C00, RIPEMD160S0C); + RIPEMD160_STEP (RIPEMD160_F , c1, d1, e1, a1, b1, w[13], RIPEMD160C00, RIPEMD160S0D); + RIPEMD160_STEP (RIPEMD160_F , b1, c1, d1, e1, a1, w[14], RIPEMD160C00, RIPEMD160S0E); + RIPEMD160_STEP (RIPEMD160_F , a1, b1, c1, d1, e1, w[15], RIPEMD160C00, RIPEMD160S0F); + + RIPEMD160_STEP (RIPEMD160_Go, e1, a1, b1, c1, d1, w[ 7], RIPEMD160C10, RIPEMD160S10); + RIPEMD160_STEP (RIPEMD160_Go, d1, e1, a1, b1, c1, w[ 4], RIPEMD160C10, RIPEMD160S11); + RIPEMD160_STEP (RIPEMD160_Go, c1, d1, e1, a1, b1, w[13], RIPEMD160C10, RIPEMD160S12); + RIPEMD160_STEP (RIPEMD160_Go, b1, c1, d1, e1, a1, w[ 1], RIPEMD160C10, RIPEMD160S13); + RIPEMD160_STEP (RIPEMD160_Go, a1, b1, c1, d1, e1, w[10], RIPEMD160C10, RIPEMD160S14); + RIPEMD160_STEP (RIPEMD160_Go, e1, a1, b1, c1, d1, w[ 6], RIPEMD160C10, RIPEMD160S15); + RIPEMD160_STEP (RIPEMD160_Go, d1, e1, a1, b1, c1, w[15], RIPEMD160C10, RIPEMD160S16); + RIPEMD160_STEP (RIPEMD160_Go, c1, d1, e1, a1, b1, w[ 3], RIPEMD160C10, RIPEMD160S17); + RIPEMD160_STEP (RIPEMD160_Go, b1, c1, d1, e1, a1, w[12], RIPEMD160C10, RIPEMD160S18); + RIPEMD160_STEP (RIPEMD160_Go, a1, b1, c1, d1, e1, w[ 0], RIPEMD160C10, RIPEMD160S19); + RIPEMD160_STEP (RIPEMD160_Go, e1, a1, b1, c1, d1, w[ 9], RIPEMD160C10, RIPEMD160S1A); + RIPEMD160_STEP (RIPEMD160_Go, d1, e1, a1, b1, c1, w[ 5], RIPEMD160C10, RIPEMD160S1B); + RIPEMD160_STEP (RIPEMD160_Go, c1, d1, e1, a1, b1, w[ 2], RIPEMD160C10, RIPEMD160S1C); + RIPEMD160_STEP (RIPEMD160_Go, b1, c1, d1, e1, a1, w[14], RIPEMD160C10, RIPEMD160S1D); + RIPEMD160_STEP (RIPEMD160_Go, a1, b1, c1, d1, e1, w[11], RIPEMD160C10, RIPEMD160S1E); + RIPEMD160_STEP (RIPEMD160_Go, e1, a1, b1, c1, d1, w[ 8], RIPEMD160C10, RIPEMD160S1F); + + RIPEMD160_STEP (RIPEMD160_H , d1, e1, a1, b1, c1, w[ 3], RIPEMD160C20, RIPEMD160S20); + RIPEMD160_STEP (RIPEMD160_H , c1, d1, e1, a1, b1, w[10], RIPEMD160C20, RIPEMD160S21); + RIPEMD160_STEP (RIPEMD160_H , b1, c1, d1, e1, a1, w[14], RIPEMD160C20, RIPEMD160S22); + RIPEMD160_STEP (RIPEMD160_H , a1, b1, c1, d1, e1, w[ 4], RIPEMD160C20, RIPEMD160S23); + RIPEMD160_STEP (RIPEMD160_H , e1, a1, b1, c1, d1, w[ 9], RIPEMD160C20, RIPEMD160S24); + RIPEMD160_STEP (RIPEMD160_H , d1, e1, a1, b1, c1, w[15], RIPEMD160C20, RIPEMD160S25); + RIPEMD160_STEP (RIPEMD160_H , c1, d1, e1, a1, b1, w[ 8], RIPEMD160C20, RIPEMD160S26); + RIPEMD160_STEP (RIPEMD160_H , b1, c1, d1, e1, a1, w[ 1], RIPEMD160C20, RIPEMD160S27); + RIPEMD160_STEP (RIPEMD160_H , a1, b1, c1, d1, e1, w[ 2], RIPEMD160C20, RIPEMD160S28); + RIPEMD160_STEP (RIPEMD160_H , e1, a1, b1, c1, d1, w[ 7], RIPEMD160C20, RIPEMD160S29); + RIPEMD160_STEP (RIPEMD160_H , d1, e1, a1, b1, c1, w[ 0], RIPEMD160C20, RIPEMD160S2A); + RIPEMD160_STEP (RIPEMD160_H , c1, d1, e1, a1, b1, w[ 6], RIPEMD160C20, RIPEMD160S2B); + RIPEMD160_STEP (RIPEMD160_H , b1, c1, d1, e1, a1, w[13], RIPEMD160C20, RIPEMD160S2C); + RIPEMD160_STEP (RIPEMD160_H , a1, b1, c1, d1, e1, w[11], RIPEMD160C20, RIPEMD160S2D); + RIPEMD160_STEP (RIPEMD160_H , e1, a1, b1, c1, d1, w[ 5], RIPEMD160C20, RIPEMD160S2E); + RIPEMD160_STEP (RIPEMD160_H , d1, e1, a1, b1, c1, w[12], RIPEMD160C20, RIPEMD160S2F); + + RIPEMD160_STEP (RIPEMD160_Io, c1, d1, e1, a1, b1, w[ 1], RIPEMD160C30, RIPEMD160S30); + RIPEMD160_STEP (RIPEMD160_Io, b1, c1, d1, e1, a1, w[ 9], RIPEMD160C30, RIPEMD160S31); + RIPEMD160_STEP (RIPEMD160_Io, a1, b1, c1, d1, e1, w[11], RIPEMD160C30, RIPEMD160S32); + RIPEMD160_STEP (RIPEMD160_Io, e1, a1, b1, c1, d1, w[10], RIPEMD160C30, RIPEMD160S33); + RIPEMD160_STEP (RIPEMD160_Io, d1, e1, a1, b1, c1, w[ 0], RIPEMD160C30, RIPEMD160S34); + RIPEMD160_STEP (RIPEMD160_Io, c1, d1, e1, a1, b1, w[ 8], RIPEMD160C30, RIPEMD160S35); + RIPEMD160_STEP (RIPEMD160_Io, b1, c1, d1, e1, a1, w[12], RIPEMD160C30, RIPEMD160S36); + RIPEMD160_STEP (RIPEMD160_Io, a1, b1, c1, d1, e1, w[ 4], RIPEMD160C30, RIPEMD160S37); + RIPEMD160_STEP (RIPEMD160_Io, e1, a1, b1, c1, d1, w[13], RIPEMD160C30, RIPEMD160S38); + RIPEMD160_STEP (RIPEMD160_Io, d1, e1, a1, b1, c1, w[ 3], RIPEMD160C30, RIPEMD160S39); + RIPEMD160_STEP (RIPEMD160_Io, c1, d1, e1, a1, b1, w[ 7], RIPEMD160C30, RIPEMD160S3A); + RIPEMD160_STEP (RIPEMD160_Io, b1, c1, d1, e1, a1, w[15], RIPEMD160C30, RIPEMD160S3B); + RIPEMD160_STEP (RIPEMD160_Io, a1, b1, c1, d1, e1, w[14], RIPEMD160C30, RIPEMD160S3C); + RIPEMD160_STEP (RIPEMD160_Io, e1, a1, b1, c1, d1, w[ 5], RIPEMD160C30, RIPEMD160S3D); + RIPEMD160_STEP (RIPEMD160_Io, d1, e1, a1, b1, c1, w[ 6], RIPEMD160C30, RIPEMD160S3E); + RIPEMD160_STEP (RIPEMD160_Io, c1, d1, e1, a1, b1, w[ 2], RIPEMD160C30, RIPEMD160S3F); + + RIPEMD160_STEP (RIPEMD160_J , b1, c1, d1, e1, a1, w[ 4], RIPEMD160C40, RIPEMD160S40); + RIPEMD160_STEP (RIPEMD160_J , a1, b1, c1, d1, e1, w[ 0], RIPEMD160C40, RIPEMD160S41); + RIPEMD160_STEP (RIPEMD160_J , e1, a1, b1, c1, d1, w[ 5], RIPEMD160C40, RIPEMD160S42); + RIPEMD160_STEP (RIPEMD160_J , d1, e1, a1, b1, c1, w[ 9], RIPEMD160C40, RIPEMD160S43); + RIPEMD160_STEP (RIPEMD160_J , c1, d1, e1, a1, b1, w[ 7], RIPEMD160C40, RIPEMD160S44); + RIPEMD160_STEP (RIPEMD160_J , b1, c1, d1, e1, a1, w[12], RIPEMD160C40, RIPEMD160S45); + RIPEMD160_STEP (RIPEMD160_J , a1, b1, c1, d1, e1, w[ 2], RIPEMD160C40, RIPEMD160S46); + RIPEMD160_STEP (RIPEMD160_J , e1, a1, b1, c1, d1, w[10], RIPEMD160C40, RIPEMD160S47); + RIPEMD160_STEP (RIPEMD160_J , d1, e1, a1, b1, c1, w[14], RIPEMD160C40, RIPEMD160S48); + RIPEMD160_STEP (RIPEMD160_J , c1, d1, e1, a1, b1, w[ 1], RIPEMD160C40, RIPEMD160S49); + RIPEMD160_STEP (RIPEMD160_J , b1, c1, d1, e1, a1, w[ 3], RIPEMD160C40, RIPEMD160S4A); + RIPEMD160_STEP (RIPEMD160_J , a1, b1, c1, d1, e1, w[ 8], RIPEMD160C40, RIPEMD160S4B); + RIPEMD160_STEP (RIPEMD160_J , e1, a1, b1, c1, d1, w[11], RIPEMD160C40, RIPEMD160S4C); + RIPEMD160_STEP (RIPEMD160_J , d1, e1, a1, b1, c1, w[ 6], RIPEMD160C40, RIPEMD160S4D); + RIPEMD160_STEP (RIPEMD160_J , c1, d1, e1, a1, b1, w[15], RIPEMD160C40, RIPEMD160S4E); + RIPEMD160_STEP (RIPEMD160_J , b1, c1, d1, e1, a1, w[13], RIPEMD160C40, RIPEMD160S4F); + + u32x a2 = dgst[0]; + u32x b2 = dgst[1]; + u32x c2 = dgst[2]; + u32x d2 = dgst[3]; + u32x e2 = dgst[4]; + + RIPEMD160_STEP_WORKAROUND_BUG (RIPEMD160_J , a2, b2, c2, d2, e2, w[ 5], RIPEMD160C50, RIPEMD160S50); + RIPEMD160_STEP (RIPEMD160_J , e2, a2, b2, c2, d2, w[14], RIPEMD160C50, RIPEMD160S51); + RIPEMD160_STEP (RIPEMD160_J , d2, e2, a2, b2, c2, w[ 7], RIPEMD160C50, RIPEMD160S52); + RIPEMD160_STEP (RIPEMD160_J , c2, d2, e2, a2, b2, w[ 0], RIPEMD160C50, RIPEMD160S53); + RIPEMD160_STEP (RIPEMD160_J , b2, c2, d2, e2, a2, w[ 9], RIPEMD160C50, RIPEMD160S54); + RIPEMD160_STEP (RIPEMD160_J , a2, b2, c2, d2, e2, w[ 2], RIPEMD160C50, RIPEMD160S55); + RIPEMD160_STEP (RIPEMD160_J , e2, a2, b2, c2, d2, w[11], RIPEMD160C50, RIPEMD160S56); + RIPEMD160_STEP (RIPEMD160_J , d2, e2, a2, b2, c2, w[ 4], RIPEMD160C50, RIPEMD160S57); + RIPEMD160_STEP (RIPEMD160_J , c2, d2, e2, a2, b2, w[13], RIPEMD160C50, RIPEMD160S58); + RIPEMD160_STEP (RIPEMD160_J , b2, c2, d2, e2, a2, w[ 6], RIPEMD160C50, RIPEMD160S59); + RIPEMD160_STEP (RIPEMD160_J , a2, b2, c2, d2, e2, w[15], RIPEMD160C50, RIPEMD160S5A); + RIPEMD160_STEP (RIPEMD160_J , e2, a2, b2, c2, d2, w[ 8], RIPEMD160C50, RIPEMD160S5B); + RIPEMD160_STEP (RIPEMD160_J , d2, e2, a2, b2, c2, w[ 1], RIPEMD160C50, RIPEMD160S5C); + RIPEMD160_STEP (RIPEMD160_J , c2, d2, e2, a2, b2, w[10], RIPEMD160C50, RIPEMD160S5D); + RIPEMD160_STEP (RIPEMD160_J , b2, c2, d2, e2, a2, w[ 3], RIPEMD160C50, RIPEMD160S5E); + RIPEMD160_STEP (RIPEMD160_J , a2, b2, c2, d2, e2, w[12], RIPEMD160C50, RIPEMD160S5F); + + RIPEMD160_STEP (RIPEMD160_Io, e2, a2, b2, c2, d2, w[ 6], RIPEMD160C60, RIPEMD160S60); + RIPEMD160_STEP (RIPEMD160_Io, d2, e2, a2, b2, c2, w[11], RIPEMD160C60, RIPEMD160S61); + RIPEMD160_STEP (RIPEMD160_Io, c2, d2, e2, a2, b2, w[ 3], RIPEMD160C60, RIPEMD160S62); + RIPEMD160_STEP (RIPEMD160_Io, b2, c2, d2, e2, a2, w[ 7], RIPEMD160C60, RIPEMD160S63); + RIPEMD160_STEP (RIPEMD160_Io, a2, b2, c2, d2, e2, w[ 0], RIPEMD160C60, RIPEMD160S64); + RIPEMD160_STEP (RIPEMD160_Io, e2, a2, b2, c2, d2, w[13], RIPEMD160C60, RIPEMD160S65); + RIPEMD160_STEP (RIPEMD160_Io, d2, e2, a2, b2, c2, w[ 5], RIPEMD160C60, RIPEMD160S66); + RIPEMD160_STEP (RIPEMD160_Io, c2, d2, e2, a2, b2, w[10], RIPEMD160C60, RIPEMD160S67); + RIPEMD160_STEP (RIPEMD160_Io, b2, c2, d2, e2, a2, w[14], RIPEMD160C60, RIPEMD160S68); + RIPEMD160_STEP (RIPEMD160_Io, a2, b2, c2, d2, e2, w[15], RIPEMD160C60, RIPEMD160S69); + RIPEMD160_STEP (RIPEMD160_Io, e2, a2, b2, c2, d2, w[ 8], RIPEMD160C60, RIPEMD160S6A); + RIPEMD160_STEP (RIPEMD160_Io, d2, e2, a2, b2, c2, w[12], RIPEMD160C60, RIPEMD160S6B); + RIPEMD160_STEP (RIPEMD160_Io, c2, d2, e2, a2, b2, w[ 4], RIPEMD160C60, RIPEMD160S6C); + RIPEMD160_STEP (RIPEMD160_Io, b2, c2, d2, e2, a2, w[ 9], RIPEMD160C60, RIPEMD160S6D); + RIPEMD160_STEP (RIPEMD160_Io, a2, b2, c2, d2, e2, w[ 1], RIPEMD160C60, RIPEMD160S6E); + RIPEMD160_STEP (RIPEMD160_Io, e2, a2, b2, c2, d2, w[ 2], RIPEMD160C60, RIPEMD160S6F); + + RIPEMD160_STEP (RIPEMD160_H , d2, e2, a2, b2, c2, w[15], RIPEMD160C70, RIPEMD160S70); + RIPEMD160_STEP (RIPEMD160_H , c2, d2, e2, a2, b2, w[ 5], RIPEMD160C70, RIPEMD160S71); + RIPEMD160_STEP (RIPEMD160_H , b2, c2, d2, e2, a2, w[ 1], RIPEMD160C70, RIPEMD160S72); + RIPEMD160_STEP (RIPEMD160_H , a2, b2, c2, d2, e2, w[ 3], RIPEMD160C70, RIPEMD160S73); + RIPEMD160_STEP (RIPEMD160_H , e2, a2, b2, c2, d2, w[ 7], RIPEMD160C70, RIPEMD160S74); + RIPEMD160_STEP (RIPEMD160_H , d2, e2, a2, b2, c2, w[14], RIPEMD160C70, RIPEMD160S75); + RIPEMD160_STEP (RIPEMD160_H , c2, d2, e2, a2, b2, w[ 6], RIPEMD160C70, RIPEMD160S76); + RIPEMD160_STEP (RIPEMD160_H , b2, c2, d2, e2, a2, w[ 9], RIPEMD160C70, RIPEMD160S77); + RIPEMD160_STEP (RIPEMD160_H , a2, b2, c2, d2, e2, w[11], RIPEMD160C70, RIPEMD160S78); + RIPEMD160_STEP (RIPEMD160_H , e2, a2, b2, c2, d2, w[ 8], RIPEMD160C70, RIPEMD160S79); + RIPEMD160_STEP (RIPEMD160_H , d2, e2, a2, b2, c2, w[12], RIPEMD160C70, RIPEMD160S7A); + RIPEMD160_STEP (RIPEMD160_H , c2, d2, e2, a2, b2, w[ 2], RIPEMD160C70, RIPEMD160S7B); + RIPEMD160_STEP (RIPEMD160_H , b2, c2, d2, e2, a2, w[10], RIPEMD160C70, RIPEMD160S7C); + RIPEMD160_STEP (RIPEMD160_H , a2, b2, c2, d2, e2, w[ 0], RIPEMD160C70, RIPEMD160S7D); + RIPEMD160_STEP (RIPEMD160_H , e2, a2, b2, c2, d2, w[ 4], RIPEMD160C70, RIPEMD160S7E); + RIPEMD160_STEP (RIPEMD160_H , d2, e2, a2, b2, c2, w[13], RIPEMD160C70, RIPEMD160S7F); + + RIPEMD160_STEP (RIPEMD160_Go, c2, d2, e2, a2, b2, w[ 8], RIPEMD160C80, RIPEMD160S80); + RIPEMD160_STEP (RIPEMD160_Go, b2, c2, d2, e2, a2, w[ 6], RIPEMD160C80, RIPEMD160S81); + RIPEMD160_STEP (RIPEMD160_Go, a2, b2, c2, d2, e2, w[ 4], RIPEMD160C80, RIPEMD160S82); + RIPEMD160_STEP (RIPEMD160_Go, e2, a2, b2, c2, d2, w[ 1], RIPEMD160C80, RIPEMD160S83); + RIPEMD160_STEP (RIPEMD160_Go, d2, e2, a2, b2, c2, w[ 3], RIPEMD160C80, RIPEMD160S84); + RIPEMD160_STEP (RIPEMD160_Go, c2, d2, e2, a2, b2, w[11], RIPEMD160C80, RIPEMD160S85); + RIPEMD160_STEP (RIPEMD160_Go, b2, c2, d2, e2, a2, w[15], RIPEMD160C80, RIPEMD160S86); + RIPEMD160_STEP (RIPEMD160_Go, a2, b2, c2, d2, e2, w[ 0], RIPEMD160C80, RIPEMD160S87); + RIPEMD160_STEP (RIPEMD160_Go, e2, a2, b2, c2, d2, w[ 5], RIPEMD160C80, RIPEMD160S88); + RIPEMD160_STEP (RIPEMD160_Go, d2, e2, a2, b2, c2, w[12], RIPEMD160C80, RIPEMD160S89); + RIPEMD160_STEP (RIPEMD160_Go, c2, d2, e2, a2, b2, w[ 2], RIPEMD160C80, RIPEMD160S8A); + RIPEMD160_STEP (RIPEMD160_Go, b2, c2, d2, e2, a2, w[13], RIPEMD160C80, RIPEMD160S8B); + RIPEMD160_STEP (RIPEMD160_Go, a2, b2, c2, d2, e2, w[ 9], RIPEMD160C80, RIPEMD160S8C); + RIPEMD160_STEP (RIPEMD160_Go, e2, a2, b2, c2, d2, w[ 7], RIPEMD160C80, RIPEMD160S8D); + RIPEMD160_STEP (RIPEMD160_Go, d2, e2, a2, b2, c2, w[10], RIPEMD160C80, RIPEMD160S8E); + RIPEMD160_STEP (RIPEMD160_Go, c2, d2, e2, a2, b2, w[14], RIPEMD160C80, RIPEMD160S8F); + + RIPEMD160_STEP (RIPEMD160_F , b2, c2, d2, e2, a2, w[12], RIPEMD160C90, RIPEMD160S90); + RIPEMD160_STEP (RIPEMD160_F , a2, b2, c2, d2, e2, w[15], RIPEMD160C90, RIPEMD160S91); + RIPEMD160_STEP (RIPEMD160_F , e2, a2, b2, c2, d2, w[10], RIPEMD160C90, RIPEMD160S92); + RIPEMD160_STEP (RIPEMD160_F , d2, e2, a2, b2, c2, w[ 4], RIPEMD160C90, RIPEMD160S93); + RIPEMD160_STEP (RIPEMD160_F , c2, d2, e2, a2, b2, w[ 1], RIPEMD160C90, RIPEMD160S94); + RIPEMD160_STEP (RIPEMD160_F , b2, c2, d2, e2, a2, w[ 5], RIPEMD160C90, RIPEMD160S95); + RIPEMD160_STEP (RIPEMD160_F , a2, b2, c2, d2, e2, w[ 8], RIPEMD160C90, RIPEMD160S96); + RIPEMD160_STEP (RIPEMD160_F , e2, a2, b2, c2, d2, w[ 7], RIPEMD160C90, RIPEMD160S97); + RIPEMD160_STEP (RIPEMD160_F , d2, e2, a2, b2, c2, w[ 6], RIPEMD160C90, RIPEMD160S98); + RIPEMD160_STEP (RIPEMD160_F , c2, d2, e2, a2, b2, w[ 2], RIPEMD160C90, RIPEMD160S99); + RIPEMD160_STEP (RIPEMD160_F , b2, c2, d2, e2, a2, w[13], RIPEMD160C90, RIPEMD160S9A); + RIPEMD160_STEP (RIPEMD160_F , a2, b2, c2, d2, e2, w[14], RIPEMD160C90, RIPEMD160S9B); + RIPEMD160_STEP (RIPEMD160_F , e2, a2, b2, c2, d2, w[ 0], RIPEMD160C90, RIPEMD160S9C); + RIPEMD160_STEP (RIPEMD160_F , d2, e2, a2, b2, c2, w[ 3], RIPEMD160C90, RIPEMD160S9D); + RIPEMD160_STEP (RIPEMD160_F , c2, d2, e2, a2, b2, w[ 9], RIPEMD160C90, RIPEMD160S9E); + RIPEMD160_STEP (RIPEMD160_F , b2, c2, d2, e2, a2, w[11], RIPEMD160C90, RIPEMD160S9F); + + const u32x a = dgst[1] + c1 + d2; + const u32x b = dgst[2] + d1 + e2; + const u32x c = dgst[3] + e1 + a2; + const u32x d = dgst[4] + a1 + b2; + const u32x e = dgst[0] + b1 + c2; + + dgst[0] = a; + dgst[1] = b; + dgst[2] = c; + dgst[3] = d; + dgst[4] = e; +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m06000_m04 (__global pw_t *pws, __global gpu_rule_t * rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global netntlm_t *netntlm_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + u32x pw_buf1[4]; + + pw_buf1[0] = pws[gid].i[ 4]; + pw_buf1[1] = pws[gid].i[ 5]; + pw_buf1[2] = pws[gid].i[ 6]; + pw_buf1[3] = pws[gid].i[ 7]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + + w0[0] = pw_buf0[0]; + w0[1] = pw_buf0[1]; + w0[2] = pw_buf0[2]; + w0[3] = pw_buf0[3]; + + u32x w1[4]; + + w1[0] = pw_buf1[0]; + w1[1] = pw_buf1[1]; + w1[2] = pw_buf1[2]; + w1[3] = pw_buf1[3]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 out_len = apply_rules (rules_buf[il_pos].cmds, w0, w1, pw_len); + + append_0x80_2 (w0, w1, out_len); + + u32x wl[16]; + + wl[ 0] = w0[0]; + wl[ 1] = w0[1]; + wl[ 2] = w0[2]; + wl[ 3] = w0[3]; + wl[ 4] = w1[0]; + wl[ 5] = w1[1]; + wl[ 6] = w1[2]; + wl[ 7] = w1[3]; + wl[ 8] = 0; + wl[ 9] = 0; + wl[10] = 0; + wl[11] = 0; + wl[12] = 0; + wl[13] = 0; + wl[14] = out_len * 8; + wl[15] = 0; + + u32x dgst[5]; + + dgst[0] = RIPEMD160M_A; + dgst[1] = RIPEMD160M_B; + dgst[2] = RIPEMD160M_C; + dgst[3] = RIPEMD160M_D; + dgst[4] = RIPEMD160M_E; + + ripemd160_transform (wl, dgst); + + const u32x r0 = dgst[0]; + const u32x r1 = dgst[1]; + const u32x r2 = dgst[2]; + const u32x r3 = dgst[3]; + + #include VECT_COMPARE_M + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m06000_m08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m06000_m16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m06000_s04 (__global pw_t *pws, __global gpu_rule_t * rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global netntlm_t *netntlm_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + u32x pw_buf1[4]; + + pw_buf1[0] = pws[gid].i[ 4]; + pw_buf1[1] = pws[gid].i[ 5]; + pw_buf1[2] = pws[gid].i[ 6]; + pw_buf1[3] = pws[gid].i[ 7]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + + w0[0] = pw_buf0[0]; + w0[1] = pw_buf0[1]; + w0[2] = pw_buf0[2]; + w0[3] = pw_buf0[3]; + + u32x w1[4]; + + w1[0] = pw_buf1[0]; + w1[1] = pw_buf1[1]; + w1[2] = pw_buf1[2]; + w1[3] = pw_buf1[3]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 out_len = apply_rules (rules_buf[il_pos].cmds, w0, w1, pw_len); + + append_0x80_2 (w0, w1, out_len); + + u32x wl[16]; + + wl[ 0] = w0[0]; + wl[ 1] = w0[1]; + wl[ 2] = w0[2]; + wl[ 3] = w0[3]; + wl[ 4] = w1[0]; + wl[ 5] = w1[1]; + wl[ 6] = w1[2]; + wl[ 7] = w1[3]; + wl[ 8] = 0; + wl[ 9] = 0; + wl[10] = 0; + wl[11] = 0; + wl[12] = 0; + wl[13] = 0; + wl[14] = out_len * 8; + wl[15] = 0; + + u32x dgst[5]; + + dgst[0] = RIPEMD160M_A; + dgst[1] = RIPEMD160M_B; + dgst[2] = RIPEMD160M_C; + dgst[3] = RIPEMD160M_D; + dgst[4] = RIPEMD160M_E; + + ripemd160_transform (wl, dgst); + + const u32x r0 = dgst[0]; + const u32x r1 = dgst[1]; + const u32x r2 = dgst[2]; + const u32x r3 = dgst[3]; + + #include VECT_COMPARE_S + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m06000_s08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m06000_s16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/amd/m06000_a1.cl b/amd/m06000_a1.cl new file mode 100644 index 0000000000..8a52770b12 --- /dev/null +++ b/amd/m06000_a1.cl @@ -0,0 +1,589 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _RIPEMD160_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW4 +#define VECT_SIZE4 +#endif + +#ifdef VLIW5 +#define VECT_SIZE4 +#endif + +#define DGST_R0 0 +#define DGST_R1 1 +#define DGST_R2 2 +#define DGST_R3 3 + +#include "include/kernel_functions.c" +#include "types_amd.c" +#include "common_amd.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +static void ripemd160_transform (const u32x w[16], u32x dgst[5]) +{ + u32x a1 = dgst[0]; + u32x b1 = dgst[1]; + u32x c1 = dgst[2]; + u32x d1 = dgst[3]; + u32x e1 = dgst[4]; + + RIPEMD160_STEP (RIPEMD160_F , a1, b1, c1, d1, e1, w[ 0], RIPEMD160C00, RIPEMD160S00); + RIPEMD160_STEP (RIPEMD160_F , e1, a1, b1, c1, d1, w[ 1], RIPEMD160C00, RIPEMD160S01); + RIPEMD160_STEP (RIPEMD160_F , d1, e1, a1, b1, c1, w[ 2], RIPEMD160C00, RIPEMD160S02); + RIPEMD160_STEP (RIPEMD160_F , c1, d1, e1, a1, b1, w[ 3], RIPEMD160C00, RIPEMD160S03); + RIPEMD160_STEP (RIPEMD160_F , b1, c1, d1, e1, a1, w[ 4], RIPEMD160C00, RIPEMD160S04); + RIPEMD160_STEP (RIPEMD160_F , a1, b1, c1, d1, e1, w[ 5], RIPEMD160C00, RIPEMD160S05); + RIPEMD160_STEP (RIPEMD160_F , e1, a1, b1, c1, d1, w[ 6], RIPEMD160C00, RIPEMD160S06); + RIPEMD160_STEP (RIPEMD160_F , d1, e1, a1, b1, c1, w[ 7], RIPEMD160C00, RIPEMD160S07); + RIPEMD160_STEP (RIPEMD160_F , c1, d1, e1, a1, b1, w[ 8], RIPEMD160C00, RIPEMD160S08); + RIPEMD160_STEP (RIPEMD160_F , b1, c1, d1, e1, a1, w[ 9], RIPEMD160C00, RIPEMD160S09); + RIPEMD160_STEP (RIPEMD160_F , a1, b1, c1, d1, e1, w[10], RIPEMD160C00, RIPEMD160S0A); + RIPEMD160_STEP (RIPEMD160_F , e1, a1, b1, c1, d1, w[11], RIPEMD160C00, RIPEMD160S0B); + RIPEMD160_STEP (RIPEMD160_F , d1, e1, a1, b1, c1, w[12], RIPEMD160C00, RIPEMD160S0C); + RIPEMD160_STEP (RIPEMD160_F , c1, d1, e1, a1, b1, w[13], RIPEMD160C00, RIPEMD160S0D); + RIPEMD160_STEP (RIPEMD160_F , b1, c1, d1, e1, a1, w[14], RIPEMD160C00, RIPEMD160S0E); + RIPEMD160_STEP (RIPEMD160_F , a1, b1, c1, d1, e1, w[15], RIPEMD160C00, RIPEMD160S0F); + + RIPEMD160_STEP (RIPEMD160_Go, e1, a1, b1, c1, d1, w[ 7], RIPEMD160C10, RIPEMD160S10); + RIPEMD160_STEP (RIPEMD160_Go, d1, e1, a1, b1, c1, w[ 4], RIPEMD160C10, RIPEMD160S11); + RIPEMD160_STEP (RIPEMD160_Go, c1, d1, e1, a1, b1, w[13], RIPEMD160C10, RIPEMD160S12); + RIPEMD160_STEP (RIPEMD160_Go, b1, c1, d1, e1, a1, w[ 1], RIPEMD160C10, RIPEMD160S13); + RIPEMD160_STEP (RIPEMD160_Go, a1, b1, c1, d1, e1, w[10], RIPEMD160C10, RIPEMD160S14); + RIPEMD160_STEP (RIPEMD160_Go, e1, a1, b1, c1, d1, w[ 6], RIPEMD160C10, RIPEMD160S15); + RIPEMD160_STEP (RIPEMD160_Go, d1, e1, a1, b1, c1, w[15], RIPEMD160C10, RIPEMD160S16); + RIPEMD160_STEP (RIPEMD160_Go, c1, d1, e1, a1, b1, w[ 3], RIPEMD160C10, RIPEMD160S17); + RIPEMD160_STEP (RIPEMD160_Go, b1, c1, d1, e1, a1, w[12], RIPEMD160C10, RIPEMD160S18); + RIPEMD160_STEP (RIPEMD160_Go, a1, b1, c1, d1, e1, w[ 0], RIPEMD160C10, RIPEMD160S19); + RIPEMD160_STEP (RIPEMD160_Go, e1, a1, b1, c1, d1, w[ 9], RIPEMD160C10, RIPEMD160S1A); + RIPEMD160_STEP (RIPEMD160_Go, d1, e1, a1, b1, c1, w[ 5], RIPEMD160C10, RIPEMD160S1B); + RIPEMD160_STEP (RIPEMD160_Go, c1, d1, e1, a1, b1, w[ 2], RIPEMD160C10, RIPEMD160S1C); + RIPEMD160_STEP (RIPEMD160_Go, b1, c1, d1, e1, a1, w[14], RIPEMD160C10, RIPEMD160S1D); + RIPEMD160_STEP (RIPEMD160_Go, a1, b1, c1, d1, e1, w[11], RIPEMD160C10, RIPEMD160S1E); + RIPEMD160_STEP (RIPEMD160_Go, e1, a1, b1, c1, d1, w[ 8], RIPEMD160C10, RIPEMD160S1F); + + RIPEMD160_STEP (RIPEMD160_H , d1, e1, a1, b1, c1, w[ 3], RIPEMD160C20, RIPEMD160S20); + RIPEMD160_STEP (RIPEMD160_H , c1, d1, e1, a1, b1, w[10], RIPEMD160C20, RIPEMD160S21); + RIPEMD160_STEP (RIPEMD160_H , b1, c1, d1, e1, a1, w[14], RIPEMD160C20, RIPEMD160S22); + RIPEMD160_STEP (RIPEMD160_H , a1, b1, c1, d1, e1, w[ 4], RIPEMD160C20, RIPEMD160S23); + RIPEMD160_STEP (RIPEMD160_H , e1, a1, b1, c1, d1, w[ 9], RIPEMD160C20, RIPEMD160S24); + RIPEMD160_STEP (RIPEMD160_H , d1, e1, a1, b1, c1, w[15], RIPEMD160C20, RIPEMD160S25); + RIPEMD160_STEP (RIPEMD160_H , c1, d1, e1, a1, b1, w[ 8], RIPEMD160C20, RIPEMD160S26); + RIPEMD160_STEP (RIPEMD160_H , b1, c1, d1, e1, a1, w[ 1], RIPEMD160C20, RIPEMD160S27); + RIPEMD160_STEP (RIPEMD160_H , a1, b1, c1, d1, e1, w[ 2], RIPEMD160C20, RIPEMD160S28); + RIPEMD160_STEP (RIPEMD160_H , e1, a1, b1, c1, d1, w[ 7], RIPEMD160C20, RIPEMD160S29); + RIPEMD160_STEP (RIPEMD160_H , d1, e1, a1, b1, c1, w[ 0], RIPEMD160C20, RIPEMD160S2A); + RIPEMD160_STEP (RIPEMD160_H , c1, d1, e1, a1, b1, w[ 6], RIPEMD160C20, RIPEMD160S2B); + RIPEMD160_STEP (RIPEMD160_H , b1, c1, d1, e1, a1, w[13], RIPEMD160C20, RIPEMD160S2C); + RIPEMD160_STEP (RIPEMD160_H , a1, b1, c1, d1, e1, w[11], RIPEMD160C20, RIPEMD160S2D); + RIPEMD160_STEP (RIPEMD160_H , e1, a1, b1, c1, d1, w[ 5], RIPEMD160C20, RIPEMD160S2E); + RIPEMD160_STEP (RIPEMD160_H , d1, e1, a1, b1, c1, w[12], RIPEMD160C20, RIPEMD160S2F); + + RIPEMD160_STEP (RIPEMD160_Io, c1, d1, e1, a1, b1, w[ 1], RIPEMD160C30, RIPEMD160S30); + RIPEMD160_STEP (RIPEMD160_Io, b1, c1, d1, e1, a1, w[ 9], RIPEMD160C30, RIPEMD160S31); + RIPEMD160_STEP (RIPEMD160_Io, a1, b1, c1, d1, e1, w[11], RIPEMD160C30, RIPEMD160S32); + RIPEMD160_STEP (RIPEMD160_Io, e1, a1, b1, c1, d1, w[10], RIPEMD160C30, RIPEMD160S33); + RIPEMD160_STEP (RIPEMD160_Io, d1, e1, a1, b1, c1, w[ 0], RIPEMD160C30, RIPEMD160S34); + RIPEMD160_STEP (RIPEMD160_Io, c1, d1, e1, a1, b1, w[ 8], RIPEMD160C30, RIPEMD160S35); + RIPEMD160_STEP (RIPEMD160_Io, b1, c1, d1, e1, a1, w[12], RIPEMD160C30, RIPEMD160S36); + RIPEMD160_STEP (RIPEMD160_Io, a1, b1, c1, d1, e1, w[ 4], RIPEMD160C30, RIPEMD160S37); + RIPEMD160_STEP (RIPEMD160_Io, e1, a1, b1, c1, d1, w[13], RIPEMD160C30, RIPEMD160S38); + RIPEMD160_STEP (RIPEMD160_Io, d1, e1, a1, b1, c1, w[ 3], RIPEMD160C30, RIPEMD160S39); + RIPEMD160_STEP (RIPEMD160_Io, c1, d1, e1, a1, b1, w[ 7], RIPEMD160C30, RIPEMD160S3A); + RIPEMD160_STEP (RIPEMD160_Io, b1, c1, d1, e1, a1, w[15], RIPEMD160C30, RIPEMD160S3B); + RIPEMD160_STEP (RIPEMD160_Io, a1, b1, c1, d1, e1, w[14], RIPEMD160C30, RIPEMD160S3C); + RIPEMD160_STEP (RIPEMD160_Io, e1, a1, b1, c1, d1, w[ 5], RIPEMD160C30, RIPEMD160S3D); + RIPEMD160_STEP (RIPEMD160_Io, d1, e1, a1, b1, c1, w[ 6], RIPEMD160C30, RIPEMD160S3E); + RIPEMD160_STEP (RIPEMD160_Io, c1, d1, e1, a1, b1, w[ 2], RIPEMD160C30, RIPEMD160S3F); + + RIPEMD160_STEP (RIPEMD160_J , b1, c1, d1, e1, a1, w[ 4], RIPEMD160C40, RIPEMD160S40); + RIPEMD160_STEP (RIPEMD160_J , a1, b1, c1, d1, e1, w[ 0], RIPEMD160C40, RIPEMD160S41); + RIPEMD160_STEP (RIPEMD160_J , e1, a1, b1, c1, d1, w[ 5], RIPEMD160C40, RIPEMD160S42); + RIPEMD160_STEP (RIPEMD160_J , d1, e1, a1, b1, c1, w[ 9], RIPEMD160C40, RIPEMD160S43); + RIPEMD160_STEP (RIPEMD160_J , c1, d1, e1, a1, b1, w[ 7], RIPEMD160C40, RIPEMD160S44); + RIPEMD160_STEP (RIPEMD160_J , b1, c1, d1, e1, a1, w[12], RIPEMD160C40, RIPEMD160S45); + RIPEMD160_STEP (RIPEMD160_J , a1, b1, c1, d1, e1, w[ 2], RIPEMD160C40, RIPEMD160S46); + RIPEMD160_STEP (RIPEMD160_J , e1, a1, b1, c1, d1, w[10], RIPEMD160C40, RIPEMD160S47); + RIPEMD160_STEP (RIPEMD160_J , d1, e1, a1, b1, c1, w[14], RIPEMD160C40, RIPEMD160S48); + RIPEMD160_STEP (RIPEMD160_J , c1, d1, e1, a1, b1, w[ 1], RIPEMD160C40, RIPEMD160S49); + RIPEMD160_STEP (RIPEMD160_J , b1, c1, d1, e1, a1, w[ 3], RIPEMD160C40, RIPEMD160S4A); + RIPEMD160_STEP (RIPEMD160_J , a1, b1, c1, d1, e1, w[ 8], RIPEMD160C40, RIPEMD160S4B); + RIPEMD160_STEP (RIPEMD160_J , e1, a1, b1, c1, d1, w[11], RIPEMD160C40, RIPEMD160S4C); + RIPEMD160_STEP (RIPEMD160_J , d1, e1, a1, b1, c1, w[ 6], RIPEMD160C40, RIPEMD160S4D); + RIPEMD160_STEP (RIPEMD160_J , c1, d1, e1, a1, b1, w[15], RIPEMD160C40, RIPEMD160S4E); + RIPEMD160_STEP (RIPEMD160_J , b1, c1, d1, e1, a1, w[13], RIPEMD160C40, RIPEMD160S4F); + + u32x a2 = dgst[0]; + u32x b2 = dgst[1]; + u32x c2 = dgst[2]; + u32x d2 = dgst[3]; + u32x e2 = dgst[4]; + + RIPEMD160_STEP_WORKAROUND_BUG (RIPEMD160_J , a2, b2, c2, d2, e2, w[ 5], RIPEMD160C50, RIPEMD160S50); + RIPEMD160_STEP (RIPEMD160_J , e2, a2, b2, c2, d2, w[14], RIPEMD160C50, RIPEMD160S51); + RIPEMD160_STEP (RIPEMD160_J , d2, e2, a2, b2, c2, w[ 7], RIPEMD160C50, RIPEMD160S52); + RIPEMD160_STEP (RIPEMD160_J , c2, d2, e2, a2, b2, w[ 0], RIPEMD160C50, RIPEMD160S53); + RIPEMD160_STEP (RIPEMD160_J , b2, c2, d2, e2, a2, w[ 9], RIPEMD160C50, RIPEMD160S54); + RIPEMD160_STEP (RIPEMD160_J , a2, b2, c2, d2, e2, w[ 2], RIPEMD160C50, RIPEMD160S55); + RIPEMD160_STEP (RIPEMD160_J , e2, a2, b2, c2, d2, w[11], RIPEMD160C50, RIPEMD160S56); + RIPEMD160_STEP (RIPEMD160_J , d2, e2, a2, b2, c2, w[ 4], RIPEMD160C50, RIPEMD160S57); + RIPEMD160_STEP (RIPEMD160_J , c2, d2, e2, a2, b2, w[13], RIPEMD160C50, RIPEMD160S58); + RIPEMD160_STEP (RIPEMD160_J , b2, c2, d2, e2, a2, w[ 6], RIPEMD160C50, RIPEMD160S59); + RIPEMD160_STEP (RIPEMD160_J , a2, b2, c2, d2, e2, w[15], RIPEMD160C50, RIPEMD160S5A); + RIPEMD160_STEP (RIPEMD160_J , e2, a2, b2, c2, d2, w[ 8], RIPEMD160C50, RIPEMD160S5B); + RIPEMD160_STEP (RIPEMD160_J , d2, e2, a2, b2, c2, w[ 1], RIPEMD160C50, RIPEMD160S5C); + RIPEMD160_STEP (RIPEMD160_J , c2, d2, e2, a2, b2, w[10], RIPEMD160C50, RIPEMD160S5D); + RIPEMD160_STEP (RIPEMD160_J , b2, c2, d2, e2, a2, w[ 3], RIPEMD160C50, RIPEMD160S5E); + RIPEMD160_STEP (RIPEMD160_J , a2, b2, c2, d2, e2, w[12], RIPEMD160C50, RIPEMD160S5F); + + RIPEMD160_STEP (RIPEMD160_Io, e2, a2, b2, c2, d2, w[ 6], RIPEMD160C60, RIPEMD160S60); + RIPEMD160_STEP (RIPEMD160_Io, d2, e2, a2, b2, c2, w[11], RIPEMD160C60, RIPEMD160S61); + RIPEMD160_STEP (RIPEMD160_Io, c2, d2, e2, a2, b2, w[ 3], RIPEMD160C60, RIPEMD160S62); + RIPEMD160_STEP (RIPEMD160_Io, b2, c2, d2, e2, a2, w[ 7], RIPEMD160C60, RIPEMD160S63); + RIPEMD160_STEP (RIPEMD160_Io, a2, b2, c2, d2, e2, w[ 0], RIPEMD160C60, RIPEMD160S64); + RIPEMD160_STEP (RIPEMD160_Io, e2, a2, b2, c2, d2, w[13], RIPEMD160C60, RIPEMD160S65); + RIPEMD160_STEP (RIPEMD160_Io, d2, e2, a2, b2, c2, w[ 5], RIPEMD160C60, RIPEMD160S66); + RIPEMD160_STEP (RIPEMD160_Io, c2, d2, e2, a2, b2, w[10], RIPEMD160C60, RIPEMD160S67); + RIPEMD160_STEP (RIPEMD160_Io, b2, c2, d2, e2, a2, w[14], RIPEMD160C60, RIPEMD160S68); + RIPEMD160_STEP (RIPEMD160_Io, a2, b2, c2, d2, e2, w[15], RIPEMD160C60, RIPEMD160S69); + RIPEMD160_STEP (RIPEMD160_Io, e2, a2, b2, c2, d2, w[ 8], RIPEMD160C60, RIPEMD160S6A); + RIPEMD160_STEP (RIPEMD160_Io, d2, e2, a2, b2, c2, w[12], RIPEMD160C60, RIPEMD160S6B); + RIPEMD160_STEP (RIPEMD160_Io, c2, d2, e2, a2, b2, w[ 4], RIPEMD160C60, RIPEMD160S6C); + RIPEMD160_STEP (RIPEMD160_Io, b2, c2, d2, e2, a2, w[ 9], RIPEMD160C60, RIPEMD160S6D); + RIPEMD160_STEP (RIPEMD160_Io, a2, b2, c2, d2, e2, w[ 1], RIPEMD160C60, RIPEMD160S6E); + RIPEMD160_STEP (RIPEMD160_Io, e2, a2, b2, c2, d2, w[ 2], RIPEMD160C60, RIPEMD160S6F); + + RIPEMD160_STEP (RIPEMD160_H , d2, e2, a2, b2, c2, w[15], RIPEMD160C70, RIPEMD160S70); + RIPEMD160_STEP (RIPEMD160_H , c2, d2, e2, a2, b2, w[ 5], RIPEMD160C70, RIPEMD160S71); + RIPEMD160_STEP (RIPEMD160_H , b2, c2, d2, e2, a2, w[ 1], RIPEMD160C70, RIPEMD160S72); + RIPEMD160_STEP (RIPEMD160_H , a2, b2, c2, d2, e2, w[ 3], RIPEMD160C70, RIPEMD160S73); + RIPEMD160_STEP (RIPEMD160_H , e2, a2, b2, c2, d2, w[ 7], RIPEMD160C70, RIPEMD160S74); + RIPEMD160_STEP (RIPEMD160_H , d2, e2, a2, b2, c2, w[14], RIPEMD160C70, RIPEMD160S75); + RIPEMD160_STEP (RIPEMD160_H , c2, d2, e2, a2, b2, w[ 6], RIPEMD160C70, RIPEMD160S76); + RIPEMD160_STEP (RIPEMD160_H , b2, c2, d2, e2, a2, w[ 9], RIPEMD160C70, RIPEMD160S77); + RIPEMD160_STEP (RIPEMD160_H , a2, b2, c2, d2, e2, w[11], RIPEMD160C70, RIPEMD160S78); + RIPEMD160_STEP (RIPEMD160_H , e2, a2, b2, c2, d2, w[ 8], RIPEMD160C70, RIPEMD160S79); + RIPEMD160_STEP (RIPEMD160_H , d2, e2, a2, b2, c2, w[12], RIPEMD160C70, RIPEMD160S7A); + RIPEMD160_STEP (RIPEMD160_H , c2, d2, e2, a2, b2, w[ 2], RIPEMD160C70, RIPEMD160S7B); + RIPEMD160_STEP (RIPEMD160_H , b2, c2, d2, e2, a2, w[10], RIPEMD160C70, RIPEMD160S7C); + RIPEMD160_STEP (RIPEMD160_H , a2, b2, c2, d2, e2, w[ 0], RIPEMD160C70, RIPEMD160S7D); + RIPEMD160_STEP (RIPEMD160_H , e2, a2, b2, c2, d2, w[ 4], RIPEMD160C70, RIPEMD160S7E); + RIPEMD160_STEP (RIPEMD160_H , d2, e2, a2, b2, c2, w[13], RIPEMD160C70, RIPEMD160S7F); + + RIPEMD160_STEP (RIPEMD160_Go, c2, d2, e2, a2, b2, w[ 8], RIPEMD160C80, RIPEMD160S80); + RIPEMD160_STEP (RIPEMD160_Go, b2, c2, d2, e2, a2, w[ 6], RIPEMD160C80, RIPEMD160S81); + RIPEMD160_STEP (RIPEMD160_Go, a2, b2, c2, d2, e2, w[ 4], RIPEMD160C80, RIPEMD160S82); + RIPEMD160_STEP (RIPEMD160_Go, e2, a2, b2, c2, d2, w[ 1], RIPEMD160C80, RIPEMD160S83); + RIPEMD160_STEP (RIPEMD160_Go, d2, e2, a2, b2, c2, w[ 3], RIPEMD160C80, RIPEMD160S84); + RIPEMD160_STEP (RIPEMD160_Go, c2, d2, e2, a2, b2, w[11], RIPEMD160C80, RIPEMD160S85); + RIPEMD160_STEP (RIPEMD160_Go, b2, c2, d2, e2, a2, w[15], RIPEMD160C80, RIPEMD160S86); + RIPEMD160_STEP (RIPEMD160_Go, a2, b2, c2, d2, e2, w[ 0], RIPEMD160C80, RIPEMD160S87); + RIPEMD160_STEP (RIPEMD160_Go, e2, a2, b2, c2, d2, w[ 5], RIPEMD160C80, RIPEMD160S88); + RIPEMD160_STEP (RIPEMD160_Go, d2, e2, a2, b2, c2, w[12], RIPEMD160C80, RIPEMD160S89); + RIPEMD160_STEP (RIPEMD160_Go, c2, d2, e2, a2, b2, w[ 2], RIPEMD160C80, RIPEMD160S8A); + RIPEMD160_STEP (RIPEMD160_Go, b2, c2, d2, e2, a2, w[13], RIPEMD160C80, RIPEMD160S8B); + RIPEMD160_STEP (RIPEMD160_Go, a2, b2, c2, d2, e2, w[ 9], RIPEMD160C80, RIPEMD160S8C); + RIPEMD160_STEP (RIPEMD160_Go, e2, a2, b2, c2, d2, w[ 7], RIPEMD160C80, RIPEMD160S8D); + RIPEMD160_STEP (RIPEMD160_Go, d2, e2, a2, b2, c2, w[10], RIPEMD160C80, RIPEMD160S8E); + RIPEMD160_STEP (RIPEMD160_Go, c2, d2, e2, a2, b2, w[14], RIPEMD160C80, RIPEMD160S8F); + + RIPEMD160_STEP (RIPEMD160_F , b2, c2, d2, e2, a2, w[12], RIPEMD160C90, RIPEMD160S90); + RIPEMD160_STEP (RIPEMD160_F , a2, b2, c2, d2, e2, w[15], RIPEMD160C90, RIPEMD160S91); + RIPEMD160_STEP (RIPEMD160_F , e2, a2, b2, c2, d2, w[10], RIPEMD160C90, RIPEMD160S92); + RIPEMD160_STEP (RIPEMD160_F , d2, e2, a2, b2, c2, w[ 4], RIPEMD160C90, RIPEMD160S93); + RIPEMD160_STEP (RIPEMD160_F , c2, d2, e2, a2, b2, w[ 1], RIPEMD160C90, RIPEMD160S94); + RIPEMD160_STEP (RIPEMD160_F , b2, c2, d2, e2, a2, w[ 5], RIPEMD160C90, RIPEMD160S95); + RIPEMD160_STEP (RIPEMD160_F , a2, b2, c2, d2, e2, w[ 8], RIPEMD160C90, RIPEMD160S96); + RIPEMD160_STEP (RIPEMD160_F , e2, a2, b2, c2, d2, w[ 7], RIPEMD160C90, RIPEMD160S97); + RIPEMD160_STEP (RIPEMD160_F , d2, e2, a2, b2, c2, w[ 6], RIPEMD160C90, RIPEMD160S98); + RIPEMD160_STEP (RIPEMD160_F , c2, d2, e2, a2, b2, w[ 2], RIPEMD160C90, RIPEMD160S99); + RIPEMD160_STEP (RIPEMD160_F , b2, c2, d2, e2, a2, w[13], RIPEMD160C90, RIPEMD160S9A); + RIPEMD160_STEP (RIPEMD160_F , a2, b2, c2, d2, e2, w[14], RIPEMD160C90, RIPEMD160S9B); + RIPEMD160_STEP (RIPEMD160_F , e2, a2, b2, c2, d2, w[ 0], RIPEMD160C90, RIPEMD160S9C); + RIPEMD160_STEP (RIPEMD160_F , d2, e2, a2, b2, c2, w[ 3], RIPEMD160C90, RIPEMD160S9D); + RIPEMD160_STEP (RIPEMD160_F , c2, d2, e2, a2, b2, w[ 9], RIPEMD160C90, RIPEMD160S9E); + RIPEMD160_STEP (RIPEMD160_F , b2, c2, d2, e2, a2, w[11], RIPEMD160C90, RIPEMD160S9F); + + const u32x a = dgst[1] + c1 + d2; + const u32x b = dgst[2] + d1 + e2; + const u32x c = dgst[3] + e1 + a2; + const u32x d = dgst[4] + a1 + b2; + const u32x e = dgst[0] + b1 + c2; + + dgst[0] = a; + dgst[1] = b; + dgst[2] = c; + dgst[3] = d; + dgst[4] = e; +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m06000_m04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global netntlm_t *netntlm_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + append_0x80_2 (wordl0, wordl1, pw_l_len); + + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, combs_buf[0].pw_len); + } + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = combs_buf[il_pos].pw_len; + + const u32 pw_len = pw_l_len + pw_r_len; + + u32 wordr0[4]; + + wordr0[0] = combs_buf[il_pos].i[0]; + wordr0[1] = combs_buf[il_pos].i[1]; + wordr0[2] = combs_buf[il_pos].i[2]; + wordr0[3] = combs_buf[il_pos].i[3]; + + u32 wordr1[4]; + + wordr1[0] = combs_buf[il_pos].i[4]; + wordr1[1] = combs_buf[il_pos].i[5]; + wordr1[2] = combs_buf[il_pos].i[6]; + wordr1[3] = combs_buf[il_pos].i[7]; + + u32 wordr2[4]; + + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + + u32 wordr3[4]; + + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + u32x w0[4]; + + w0[0] = wordl0[0] | wordr0[0]; + w0[1] = wordl0[1] | wordr0[1]; + w0[2] = wordl0[2] | wordr0[2]; + w0[3] = wordl0[3] | wordr0[3]; + + u32x w1[4]; + + w1[0] = wordl1[0] | wordr1[0]; + w1[1] = wordl1[1] | wordr1[1]; + w1[2] = wordl1[2] | wordr1[2]; + w1[3] = wordl1[3] | wordr1[3]; + + u32x w2[4]; + + w2[0] = wordl2[0] | wordr2[0]; + w2[1] = wordl2[1] | wordr2[1]; + w2[2] = wordl2[2] | wordr2[2]; + w2[3] = wordl2[3] | wordr2[3]; + + u32x w3[4]; + + w3[0] = wordl3[0] | wordr3[0]; + w3[1] = wordl3[1] | wordr3[1]; + w3[2] = pw_len * 8; + w3[3] = 0; + + u32x wl[16]; + + wl[ 0] = w0[0]; + wl[ 1] = w0[1]; + wl[ 2] = w0[2]; + wl[ 3] = w0[3]; + wl[ 4] = w1[0]; + wl[ 5] = w1[1]; + wl[ 6] = w1[2]; + wl[ 7] = w1[3]; + wl[ 8] = 0; + wl[ 9] = 0; + wl[10] = 0; + wl[11] = 0; + wl[12] = 0; + wl[13] = 0; + wl[14] = pw_len * 8; + wl[15] = 0; + + u32x dgst[5]; + + dgst[0] = RIPEMD160M_A; + dgst[1] = RIPEMD160M_B; + dgst[2] = RIPEMD160M_C; + dgst[3] = RIPEMD160M_D; + dgst[4] = RIPEMD160M_E; + + ripemd160_transform (wl, dgst); + + const u32x r0 = dgst[0]; + const u32x r1 = dgst[1]; + const u32x r2 = dgst[2]; + const u32x r3 = dgst[3]; + + #include VECT_COMPARE_M + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m06000_m08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m06000_m16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m06000_s04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global netntlm_t *netntlm_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + append_0x80_2 (wordl0, wordl1, pw_l_len); + + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, combs_buf[0].pw_len); + } + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = combs_buf[il_pos].pw_len; + + const u32 pw_len = pw_l_len + pw_r_len; + + u32 wordr0[4]; + + wordr0[0] = combs_buf[il_pos].i[0]; + wordr0[1] = combs_buf[il_pos].i[1]; + wordr0[2] = combs_buf[il_pos].i[2]; + wordr0[3] = combs_buf[il_pos].i[3]; + + u32 wordr1[4]; + + wordr1[0] = combs_buf[il_pos].i[4]; + wordr1[1] = combs_buf[il_pos].i[5]; + wordr1[2] = combs_buf[il_pos].i[6]; + wordr1[3] = combs_buf[il_pos].i[7]; + + u32 wordr2[4]; + + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + + u32 wordr3[4]; + + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + u32x w0[4]; + + w0[0] = wordl0[0] | wordr0[0]; + w0[1] = wordl0[1] | wordr0[1]; + w0[2] = wordl0[2] | wordr0[2]; + w0[3] = wordl0[3] | wordr0[3]; + + u32x w1[4]; + + w1[0] = wordl1[0] | wordr1[0]; + w1[1] = wordl1[1] | wordr1[1]; + w1[2] = wordl1[2] | wordr1[2]; + w1[3] = wordl1[3] | wordr1[3]; + + u32x w2[4]; + + w2[0] = wordl2[0] | wordr2[0]; + w2[1] = wordl2[1] | wordr2[1]; + w2[2] = wordl2[2] | wordr2[2]; + w2[3] = wordl2[3] | wordr2[3]; + + u32x w3[4]; + + w3[0] = wordl3[0] | wordr3[0]; + w3[1] = wordl3[1] | wordr3[1]; + w3[2] = pw_len * 8; + w3[3] = 0; + + u32x wl[16]; + + wl[ 0] = w0[0]; + wl[ 1] = w0[1]; + wl[ 2] = w0[2]; + wl[ 3] = w0[3]; + wl[ 4] = w1[0]; + wl[ 5] = w1[1]; + wl[ 6] = w1[2]; + wl[ 7] = w1[3]; + wl[ 8] = 0; + wl[ 9] = 0; + wl[10] = 0; + wl[11] = 0; + wl[12] = 0; + wl[13] = 0; + wl[14] = pw_len * 8; + wl[15] = 0; + + u32x dgst[5]; + + dgst[0] = RIPEMD160M_A; + dgst[1] = RIPEMD160M_B; + dgst[2] = RIPEMD160M_C; + dgst[3] = RIPEMD160M_D; + dgst[4] = RIPEMD160M_E; + + ripemd160_transform (wl, dgst); + + const u32x r0 = dgst[0]; + const u32x r1 = dgst[1]; + const u32x r2 = dgst[2]; + const u32x r3 = dgst[3]; + + #include VECT_COMPARE_S + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m06000_s08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m06000_s16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/amd/m06000_a3.cl b/amd/m06000_a3.cl new file mode 100644 index 0000000000..0e4d96acd2 --- /dev/null +++ b/amd/m06000_a3.cl @@ -0,0 +1,661 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _RIPEMD160_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW4 +#define VECT_SIZE4 +#endif + +#ifdef VLIW5 +#define VECT_SIZE4 +#endif + +#define DGST_R0 0 +#define DGST_R1 1 +#define DGST_R2 2 +#define DGST_R3 3 + +#include "include/kernel_functions.c" +#include "types_amd.c" +#include "common_amd.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +static void ripemd160_transform (const u32x w[16], u32x dgst[5]) +{ + u32x a1 = dgst[0]; + u32x b1 = dgst[1]; + u32x c1 = dgst[2]; + u32x d1 = dgst[3]; + u32x e1 = dgst[4]; + + RIPEMD160_STEP (RIPEMD160_F , a1, b1, c1, d1, e1, w[ 0], RIPEMD160C00, RIPEMD160S00); + RIPEMD160_STEP (RIPEMD160_F , e1, a1, b1, c1, d1, w[ 1], RIPEMD160C00, RIPEMD160S01); + RIPEMD160_STEP (RIPEMD160_F , d1, e1, a1, b1, c1, w[ 2], RIPEMD160C00, RIPEMD160S02); + RIPEMD160_STEP (RIPEMD160_F , c1, d1, e1, a1, b1, w[ 3], RIPEMD160C00, RIPEMD160S03); + RIPEMD160_STEP (RIPEMD160_F , b1, c1, d1, e1, a1, w[ 4], RIPEMD160C00, RIPEMD160S04); + RIPEMD160_STEP (RIPEMD160_F , a1, b1, c1, d1, e1, w[ 5], RIPEMD160C00, RIPEMD160S05); + RIPEMD160_STEP (RIPEMD160_F , e1, a1, b1, c1, d1, w[ 6], RIPEMD160C00, RIPEMD160S06); + RIPEMD160_STEP (RIPEMD160_F , d1, e1, a1, b1, c1, w[ 7], RIPEMD160C00, RIPEMD160S07); + RIPEMD160_STEP (RIPEMD160_F , c1, d1, e1, a1, b1, w[ 8], RIPEMD160C00, RIPEMD160S08); + RIPEMD160_STEP (RIPEMD160_F , b1, c1, d1, e1, a1, w[ 9], RIPEMD160C00, RIPEMD160S09); + RIPEMD160_STEP (RIPEMD160_F , a1, b1, c1, d1, e1, w[10], RIPEMD160C00, RIPEMD160S0A); + RIPEMD160_STEP (RIPEMD160_F , e1, a1, b1, c1, d1, w[11], RIPEMD160C00, RIPEMD160S0B); + RIPEMD160_STEP (RIPEMD160_F , d1, e1, a1, b1, c1, w[12], RIPEMD160C00, RIPEMD160S0C); + RIPEMD160_STEP (RIPEMD160_F , c1, d1, e1, a1, b1, w[13], RIPEMD160C00, RIPEMD160S0D); + RIPEMD160_STEP (RIPEMD160_F , b1, c1, d1, e1, a1, w[14], RIPEMD160C00, RIPEMD160S0E); + RIPEMD160_STEP (RIPEMD160_F , a1, b1, c1, d1, e1, w[15], RIPEMD160C00, RIPEMD160S0F); + + RIPEMD160_STEP (RIPEMD160_Go, e1, a1, b1, c1, d1, w[ 7], RIPEMD160C10, RIPEMD160S10); + RIPEMD160_STEP (RIPEMD160_Go, d1, e1, a1, b1, c1, w[ 4], RIPEMD160C10, RIPEMD160S11); + RIPEMD160_STEP (RIPEMD160_Go, c1, d1, e1, a1, b1, w[13], RIPEMD160C10, RIPEMD160S12); + RIPEMD160_STEP (RIPEMD160_Go, b1, c1, d1, e1, a1, w[ 1], RIPEMD160C10, RIPEMD160S13); + RIPEMD160_STEP (RIPEMD160_Go, a1, b1, c1, d1, e1, w[10], RIPEMD160C10, RIPEMD160S14); + RIPEMD160_STEP (RIPEMD160_Go, e1, a1, b1, c1, d1, w[ 6], RIPEMD160C10, RIPEMD160S15); + RIPEMD160_STEP (RIPEMD160_Go, d1, e1, a1, b1, c1, w[15], RIPEMD160C10, RIPEMD160S16); + RIPEMD160_STEP (RIPEMD160_Go, c1, d1, e1, a1, b1, w[ 3], RIPEMD160C10, RIPEMD160S17); + RIPEMD160_STEP (RIPEMD160_Go, b1, c1, d1, e1, a1, w[12], RIPEMD160C10, RIPEMD160S18); + RIPEMD160_STEP (RIPEMD160_Go, a1, b1, c1, d1, e1, w[ 0], RIPEMD160C10, RIPEMD160S19); + RIPEMD160_STEP (RIPEMD160_Go, e1, a1, b1, c1, d1, w[ 9], RIPEMD160C10, RIPEMD160S1A); + RIPEMD160_STEP (RIPEMD160_Go, d1, e1, a1, b1, c1, w[ 5], RIPEMD160C10, RIPEMD160S1B); + RIPEMD160_STEP (RIPEMD160_Go, c1, d1, e1, a1, b1, w[ 2], RIPEMD160C10, RIPEMD160S1C); + RIPEMD160_STEP (RIPEMD160_Go, b1, c1, d1, e1, a1, w[14], RIPEMD160C10, RIPEMD160S1D); + RIPEMD160_STEP (RIPEMD160_Go, a1, b1, c1, d1, e1, w[11], RIPEMD160C10, RIPEMD160S1E); + RIPEMD160_STEP (RIPEMD160_Go, e1, a1, b1, c1, d1, w[ 8], RIPEMD160C10, RIPEMD160S1F); + + RIPEMD160_STEP (RIPEMD160_H , d1, e1, a1, b1, c1, w[ 3], RIPEMD160C20, RIPEMD160S20); + RIPEMD160_STEP (RIPEMD160_H , c1, d1, e1, a1, b1, w[10], RIPEMD160C20, RIPEMD160S21); + RIPEMD160_STEP (RIPEMD160_H , b1, c1, d1, e1, a1, w[14], RIPEMD160C20, RIPEMD160S22); + RIPEMD160_STEP (RIPEMD160_H , a1, b1, c1, d1, e1, w[ 4], RIPEMD160C20, RIPEMD160S23); + RIPEMD160_STEP (RIPEMD160_H , e1, a1, b1, c1, d1, w[ 9], RIPEMD160C20, RIPEMD160S24); + RIPEMD160_STEP (RIPEMD160_H , d1, e1, a1, b1, c1, w[15], RIPEMD160C20, RIPEMD160S25); + RIPEMD160_STEP (RIPEMD160_H , c1, d1, e1, a1, b1, w[ 8], RIPEMD160C20, RIPEMD160S26); + RIPEMD160_STEP (RIPEMD160_H , b1, c1, d1, e1, a1, w[ 1], RIPEMD160C20, RIPEMD160S27); + RIPEMD160_STEP (RIPEMD160_H , a1, b1, c1, d1, e1, w[ 2], RIPEMD160C20, RIPEMD160S28); + RIPEMD160_STEP (RIPEMD160_H , e1, a1, b1, c1, d1, w[ 7], RIPEMD160C20, RIPEMD160S29); + RIPEMD160_STEP (RIPEMD160_H , d1, e1, a1, b1, c1, w[ 0], RIPEMD160C20, RIPEMD160S2A); + RIPEMD160_STEP (RIPEMD160_H , c1, d1, e1, a1, b1, w[ 6], RIPEMD160C20, RIPEMD160S2B); + RIPEMD160_STEP (RIPEMD160_H , b1, c1, d1, e1, a1, w[13], RIPEMD160C20, RIPEMD160S2C); + RIPEMD160_STEP (RIPEMD160_H , a1, b1, c1, d1, e1, w[11], RIPEMD160C20, RIPEMD160S2D); + RIPEMD160_STEP (RIPEMD160_H , e1, a1, b1, c1, d1, w[ 5], RIPEMD160C20, RIPEMD160S2E); + RIPEMD160_STEP (RIPEMD160_H , d1, e1, a1, b1, c1, w[12], RIPEMD160C20, RIPEMD160S2F); + + RIPEMD160_STEP (RIPEMD160_Io, c1, d1, e1, a1, b1, w[ 1], RIPEMD160C30, RIPEMD160S30); + RIPEMD160_STEP (RIPEMD160_Io, b1, c1, d1, e1, a1, w[ 9], RIPEMD160C30, RIPEMD160S31); + RIPEMD160_STEP (RIPEMD160_Io, a1, b1, c1, d1, e1, w[11], RIPEMD160C30, RIPEMD160S32); + RIPEMD160_STEP (RIPEMD160_Io, e1, a1, b1, c1, d1, w[10], RIPEMD160C30, RIPEMD160S33); + RIPEMD160_STEP (RIPEMD160_Io, d1, e1, a1, b1, c1, w[ 0], RIPEMD160C30, RIPEMD160S34); + RIPEMD160_STEP (RIPEMD160_Io, c1, d1, e1, a1, b1, w[ 8], RIPEMD160C30, RIPEMD160S35); + RIPEMD160_STEP (RIPEMD160_Io, b1, c1, d1, e1, a1, w[12], RIPEMD160C30, RIPEMD160S36); + RIPEMD160_STEP (RIPEMD160_Io, a1, b1, c1, d1, e1, w[ 4], RIPEMD160C30, RIPEMD160S37); + RIPEMD160_STEP (RIPEMD160_Io, e1, a1, b1, c1, d1, w[13], RIPEMD160C30, RIPEMD160S38); + RIPEMD160_STEP (RIPEMD160_Io, d1, e1, a1, b1, c1, w[ 3], RIPEMD160C30, RIPEMD160S39); + RIPEMD160_STEP (RIPEMD160_Io, c1, d1, e1, a1, b1, w[ 7], RIPEMD160C30, RIPEMD160S3A); + RIPEMD160_STEP (RIPEMD160_Io, b1, c1, d1, e1, a1, w[15], RIPEMD160C30, RIPEMD160S3B); + RIPEMD160_STEP (RIPEMD160_Io, a1, b1, c1, d1, e1, w[14], RIPEMD160C30, RIPEMD160S3C); + RIPEMD160_STEP (RIPEMD160_Io, e1, a1, b1, c1, d1, w[ 5], RIPEMD160C30, RIPEMD160S3D); + RIPEMD160_STEP (RIPEMD160_Io, d1, e1, a1, b1, c1, w[ 6], RIPEMD160C30, RIPEMD160S3E); + RIPEMD160_STEP (RIPEMD160_Io, c1, d1, e1, a1, b1, w[ 2], RIPEMD160C30, RIPEMD160S3F); + + RIPEMD160_STEP (RIPEMD160_J , b1, c1, d1, e1, a1, w[ 4], RIPEMD160C40, RIPEMD160S40); + RIPEMD160_STEP (RIPEMD160_J , a1, b1, c1, d1, e1, w[ 0], RIPEMD160C40, RIPEMD160S41); + RIPEMD160_STEP (RIPEMD160_J , e1, a1, b1, c1, d1, w[ 5], RIPEMD160C40, RIPEMD160S42); + RIPEMD160_STEP (RIPEMD160_J , d1, e1, a1, b1, c1, w[ 9], RIPEMD160C40, RIPEMD160S43); + RIPEMD160_STEP (RIPEMD160_J , c1, d1, e1, a1, b1, w[ 7], RIPEMD160C40, RIPEMD160S44); + RIPEMD160_STEP (RIPEMD160_J , b1, c1, d1, e1, a1, w[12], RIPEMD160C40, RIPEMD160S45); + RIPEMD160_STEP (RIPEMD160_J , a1, b1, c1, d1, e1, w[ 2], RIPEMD160C40, RIPEMD160S46); + RIPEMD160_STEP (RIPEMD160_J , e1, a1, b1, c1, d1, w[10], RIPEMD160C40, RIPEMD160S47); + RIPEMD160_STEP (RIPEMD160_J , d1, e1, a1, b1, c1, w[14], RIPEMD160C40, RIPEMD160S48); + RIPEMD160_STEP (RIPEMD160_J , c1, d1, e1, a1, b1, w[ 1], RIPEMD160C40, RIPEMD160S49); + RIPEMD160_STEP (RIPEMD160_J , b1, c1, d1, e1, a1, w[ 3], RIPEMD160C40, RIPEMD160S4A); + RIPEMD160_STEP (RIPEMD160_J , a1, b1, c1, d1, e1, w[ 8], RIPEMD160C40, RIPEMD160S4B); + RIPEMD160_STEP (RIPEMD160_J , e1, a1, b1, c1, d1, w[11], RIPEMD160C40, RIPEMD160S4C); + RIPEMD160_STEP (RIPEMD160_J , d1, e1, a1, b1, c1, w[ 6], RIPEMD160C40, RIPEMD160S4D); + RIPEMD160_STEP (RIPEMD160_J , c1, d1, e1, a1, b1, w[15], RIPEMD160C40, RIPEMD160S4E); + RIPEMD160_STEP (RIPEMD160_J , b1, c1, d1, e1, a1, w[13], RIPEMD160C40, RIPEMD160S4F); + + u32x a2 = dgst[0]; + u32x b2 = dgst[1]; + u32x c2 = dgst[2]; + u32x d2 = dgst[3]; + u32x e2 = dgst[4]; + + RIPEMD160_STEP_WORKAROUND_BUG (RIPEMD160_J , a2, b2, c2, d2, e2, w[ 5], RIPEMD160C50, RIPEMD160S50); + RIPEMD160_STEP (RIPEMD160_J , e2, a2, b2, c2, d2, w[14], RIPEMD160C50, RIPEMD160S51); + RIPEMD160_STEP (RIPEMD160_J , d2, e2, a2, b2, c2, w[ 7], RIPEMD160C50, RIPEMD160S52); + RIPEMD160_STEP (RIPEMD160_J , c2, d2, e2, a2, b2, w[ 0], RIPEMD160C50, RIPEMD160S53); + RIPEMD160_STEP (RIPEMD160_J , b2, c2, d2, e2, a2, w[ 9], RIPEMD160C50, RIPEMD160S54); + RIPEMD160_STEP (RIPEMD160_J , a2, b2, c2, d2, e2, w[ 2], RIPEMD160C50, RIPEMD160S55); + RIPEMD160_STEP (RIPEMD160_J , e2, a2, b2, c2, d2, w[11], RIPEMD160C50, RIPEMD160S56); + RIPEMD160_STEP (RIPEMD160_J , d2, e2, a2, b2, c2, w[ 4], RIPEMD160C50, RIPEMD160S57); + RIPEMD160_STEP (RIPEMD160_J , c2, d2, e2, a2, b2, w[13], RIPEMD160C50, RIPEMD160S58); + RIPEMD160_STEP (RIPEMD160_J , b2, c2, d2, e2, a2, w[ 6], RIPEMD160C50, RIPEMD160S59); + RIPEMD160_STEP (RIPEMD160_J , a2, b2, c2, d2, e2, w[15], RIPEMD160C50, RIPEMD160S5A); + RIPEMD160_STEP (RIPEMD160_J , e2, a2, b2, c2, d2, w[ 8], RIPEMD160C50, RIPEMD160S5B); + RIPEMD160_STEP (RIPEMD160_J , d2, e2, a2, b2, c2, w[ 1], RIPEMD160C50, RIPEMD160S5C); + RIPEMD160_STEP (RIPEMD160_J , c2, d2, e2, a2, b2, w[10], RIPEMD160C50, RIPEMD160S5D); + RIPEMD160_STEP (RIPEMD160_J , b2, c2, d2, e2, a2, w[ 3], RIPEMD160C50, RIPEMD160S5E); + RIPEMD160_STEP (RIPEMD160_J , a2, b2, c2, d2, e2, w[12], RIPEMD160C50, RIPEMD160S5F); + + RIPEMD160_STEP (RIPEMD160_Io, e2, a2, b2, c2, d2, w[ 6], RIPEMD160C60, RIPEMD160S60); + RIPEMD160_STEP (RIPEMD160_Io, d2, e2, a2, b2, c2, w[11], RIPEMD160C60, RIPEMD160S61); + RIPEMD160_STEP (RIPEMD160_Io, c2, d2, e2, a2, b2, w[ 3], RIPEMD160C60, RIPEMD160S62); + RIPEMD160_STEP (RIPEMD160_Io, b2, c2, d2, e2, a2, w[ 7], RIPEMD160C60, RIPEMD160S63); + RIPEMD160_STEP (RIPEMD160_Io, a2, b2, c2, d2, e2, w[ 0], RIPEMD160C60, RIPEMD160S64); + RIPEMD160_STEP (RIPEMD160_Io, e2, a2, b2, c2, d2, w[13], RIPEMD160C60, RIPEMD160S65); + RIPEMD160_STEP (RIPEMD160_Io, d2, e2, a2, b2, c2, w[ 5], RIPEMD160C60, RIPEMD160S66); + RIPEMD160_STEP (RIPEMD160_Io, c2, d2, e2, a2, b2, w[10], RIPEMD160C60, RIPEMD160S67); + RIPEMD160_STEP (RIPEMD160_Io, b2, c2, d2, e2, a2, w[14], RIPEMD160C60, RIPEMD160S68); + RIPEMD160_STEP (RIPEMD160_Io, a2, b2, c2, d2, e2, w[15], RIPEMD160C60, RIPEMD160S69); + RIPEMD160_STEP (RIPEMD160_Io, e2, a2, b2, c2, d2, w[ 8], RIPEMD160C60, RIPEMD160S6A); + RIPEMD160_STEP (RIPEMD160_Io, d2, e2, a2, b2, c2, w[12], RIPEMD160C60, RIPEMD160S6B); + RIPEMD160_STEP (RIPEMD160_Io, c2, d2, e2, a2, b2, w[ 4], RIPEMD160C60, RIPEMD160S6C); + RIPEMD160_STEP (RIPEMD160_Io, b2, c2, d2, e2, a2, w[ 9], RIPEMD160C60, RIPEMD160S6D); + RIPEMD160_STEP (RIPEMD160_Io, a2, b2, c2, d2, e2, w[ 1], RIPEMD160C60, RIPEMD160S6E); + RIPEMD160_STEP (RIPEMD160_Io, e2, a2, b2, c2, d2, w[ 2], RIPEMD160C60, RIPEMD160S6F); + + RIPEMD160_STEP (RIPEMD160_H , d2, e2, a2, b2, c2, w[15], RIPEMD160C70, RIPEMD160S70); + RIPEMD160_STEP (RIPEMD160_H , c2, d2, e2, a2, b2, w[ 5], RIPEMD160C70, RIPEMD160S71); + RIPEMD160_STEP (RIPEMD160_H , b2, c2, d2, e2, a2, w[ 1], RIPEMD160C70, RIPEMD160S72); + RIPEMD160_STEP (RIPEMD160_H , a2, b2, c2, d2, e2, w[ 3], RIPEMD160C70, RIPEMD160S73); + RIPEMD160_STEP (RIPEMD160_H , e2, a2, b2, c2, d2, w[ 7], RIPEMD160C70, RIPEMD160S74); + RIPEMD160_STEP (RIPEMD160_H , d2, e2, a2, b2, c2, w[14], RIPEMD160C70, RIPEMD160S75); + RIPEMD160_STEP (RIPEMD160_H , c2, d2, e2, a2, b2, w[ 6], RIPEMD160C70, RIPEMD160S76); + RIPEMD160_STEP (RIPEMD160_H , b2, c2, d2, e2, a2, w[ 9], RIPEMD160C70, RIPEMD160S77); + RIPEMD160_STEP (RIPEMD160_H , a2, b2, c2, d2, e2, w[11], RIPEMD160C70, RIPEMD160S78); + RIPEMD160_STEP (RIPEMD160_H , e2, a2, b2, c2, d2, w[ 8], RIPEMD160C70, RIPEMD160S79); + RIPEMD160_STEP (RIPEMD160_H , d2, e2, a2, b2, c2, w[12], RIPEMD160C70, RIPEMD160S7A); + RIPEMD160_STEP (RIPEMD160_H , c2, d2, e2, a2, b2, w[ 2], RIPEMD160C70, RIPEMD160S7B); + RIPEMD160_STEP (RIPEMD160_H , b2, c2, d2, e2, a2, w[10], RIPEMD160C70, RIPEMD160S7C); + RIPEMD160_STEP (RIPEMD160_H , a2, b2, c2, d2, e2, w[ 0], RIPEMD160C70, RIPEMD160S7D); + RIPEMD160_STEP (RIPEMD160_H , e2, a2, b2, c2, d2, w[ 4], RIPEMD160C70, RIPEMD160S7E); + RIPEMD160_STEP (RIPEMD160_H , d2, e2, a2, b2, c2, w[13], RIPEMD160C70, RIPEMD160S7F); + + RIPEMD160_STEP (RIPEMD160_Go, c2, d2, e2, a2, b2, w[ 8], RIPEMD160C80, RIPEMD160S80); + RIPEMD160_STEP (RIPEMD160_Go, b2, c2, d2, e2, a2, w[ 6], RIPEMD160C80, RIPEMD160S81); + RIPEMD160_STEP (RIPEMD160_Go, a2, b2, c2, d2, e2, w[ 4], RIPEMD160C80, RIPEMD160S82); + RIPEMD160_STEP (RIPEMD160_Go, e2, a2, b2, c2, d2, w[ 1], RIPEMD160C80, RIPEMD160S83); + RIPEMD160_STEP (RIPEMD160_Go, d2, e2, a2, b2, c2, w[ 3], RIPEMD160C80, RIPEMD160S84); + RIPEMD160_STEP (RIPEMD160_Go, c2, d2, e2, a2, b2, w[11], RIPEMD160C80, RIPEMD160S85); + RIPEMD160_STEP (RIPEMD160_Go, b2, c2, d2, e2, a2, w[15], RIPEMD160C80, RIPEMD160S86); + RIPEMD160_STEP (RIPEMD160_Go, a2, b2, c2, d2, e2, w[ 0], RIPEMD160C80, RIPEMD160S87); + RIPEMD160_STEP (RIPEMD160_Go, e2, a2, b2, c2, d2, w[ 5], RIPEMD160C80, RIPEMD160S88); + RIPEMD160_STEP (RIPEMD160_Go, d2, e2, a2, b2, c2, w[12], RIPEMD160C80, RIPEMD160S89); + RIPEMD160_STEP (RIPEMD160_Go, c2, d2, e2, a2, b2, w[ 2], RIPEMD160C80, RIPEMD160S8A); + RIPEMD160_STEP (RIPEMD160_Go, b2, c2, d2, e2, a2, w[13], RIPEMD160C80, RIPEMD160S8B); + RIPEMD160_STEP (RIPEMD160_Go, a2, b2, c2, d2, e2, w[ 9], RIPEMD160C80, RIPEMD160S8C); + RIPEMD160_STEP (RIPEMD160_Go, e2, a2, b2, c2, d2, w[ 7], RIPEMD160C80, RIPEMD160S8D); + RIPEMD160_STEP (RIPEMD160_Go, d2, e2, a2, b2, c2, w[10], RIPEMD160C80, RIPEMD160S8E); + RIPEMD160_STEP (RIPEMD160_Go, c2, d2, e2, a2, b2, w[14], RIPEMD160C80, RIPEMD160S8F); + + RIPEMD160_STEP (RIPEMD160_F , b2, c2, d2, e2, a2, w[12], RIPEMD160C90, RIPEMD160S90); + RIPEMD160_STEP (RIPEMD160_F , a2, b2, c2, d2, e2, w[15], RIPEMD160C90, RIPEMD160S91); + RIPEMD160_STEP (RIPEMD160_F , e2, a2, b2, c2, d2, w[10], RIPEMD160C90, RIPEMD160S92); + RIPEMD160_STEP (RIPEMD160_F , d2, e2, a2, b2, c2, w[ 4], RIPEMD160C90, RIPEMD160S93); + RIPEMD160_STEP (RIPEMD160_F , c2, d2, e2, a2, b2, w[ 1], RIPEMD160C90, RIPEMD160S94); + RIPEMD160_STEP (RIPEMD160_F , b2, c2, d2, e2, a2, w[ 5], RIPEMD160C90, RIPEMD160S95); + RIPEMD160_STEP (RIPEMD160_F , a2, b2, c2, d2, e2, w[ 8], RIPEMD160C90, RIPEMD160S96); + RIPEMD160_STEP (RIPEMD160_F , e2, a2, b2, c2, d2, w[ 7], RIPEMD160C90, RIPEMD160S97); + RIPEMD160_STEP (RIPEMD160_F , d2, e2, a2, b2, c2, w[ 6], RIPEMD160C90, RIPEMD160S98); + RIPEMD160_STEP (RIPEMD160_F , c2, d2, e2, a2, b2, w[ 2], RIPEMD160C90, RIPEMD160S99); + RIPEMD160_STEP (RIPEMD160_F , b2, c2, d2, e2, a2, w[13], RIPEMD160C90, RIPEMD160S9A); + RIPEMD160_STEP (RIPEMD160_F , a2, b2, c2, d2, e2, w[14], RIPEMD160C90, RIPEMD160S9B); + RIPEMD160_STEP (RIPEMD160_F , e2, a2, b2, c2, d2, w[ 0], RIPEMD160C90, RIPEMD160S9C); + RIPEMD160_STEP (RIPEMD160_F , d2, e2, a2, b2, c2, w[ 3], RIPEMD160C90, RIPEMD160S9D); + RIPEMD160_STEP (RIPEMD160_F , c2, d2, e2, a2, b2, w[ 9], RIPEMD160C90, RIPEMD160S9E); + RIPEMD160_STEP (RIPEMD160_F , b2, c2, d2, e2, a2, w[11], RIPEMD160C90, RIPEMD160S9F); + + const u32x a = dgst[1] + c1 + d2; + const u32x b = dgst[2] + d1 + e2; + const u32x c = dgst[3] + e1 + a2; + const u32x d = dgst[4] + a1 + b2; + const u32x e = dgst[0] + b1 + c2; + + dgst[0] = a; + dgst[1] = b; + dgst[2] = c; + dgst[3] = d; + dgst[4] = e; +} + +static void m06000m (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], const u32 pw_len, __global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset) +{ + /** + * modifier + */ + + const u32 gid = get_global_id (0); + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 w14 = pw_len * 8; + + /** + * loop + */ + + u32x w0l = w0[0]; + + for (u32 il_pos = 0; il_pos < bfs_cnt; il_pos++) + { + const u32 w0r = bfs_buf[il_pos].i; + + w0[0] = w0l | w0r; + + u32x wl[16]; + + wl[ 0] = w0[0]; + wl[ 1] = w0[1]; + wl[ 2] = w0[2]; + wl[ 3] = w0[3]; + wl[ 4] = w1[0]; + wl[ 5] = w1[1]; + wl[ 6] = w1[2]; + wl[ 7] = w1[3]; + wl[ 8] = w2[0]; + wl[ 9] = w2[1]; + wl[10] = w2[2]; + wl[11] = w2[3]; + wl[12] = w3[0]; + wl[13] = w3[1]; + wl[14] = w14; + wl[15] = 0; + + u32x dgst[5]; + + dgst[0] = RIPEMD160M_A; + dgst[1] = RIPEMD160M_B; + dgst[2] = RIPEMD160M_C; + dgst[3] = RIPEMD160M_D; + dgst[4] = RIPEMD160M_E; + + ripemd160_transform (wl, dgst); + + const u32x r0 = dgst[0]; + const u32x r1 = dgst[1]; + const u32x r2 = dgst[2]; + const u32x r3 = dgst[3]; + + #include VECT_COMPARE_M + } +} + +static void m06000s (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], const u32 pw_len, __global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset) +{ + /** + * modifier + */ + + const u32 gid = get_global_id (0); + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 w14 = pw_len * 8; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * loop + */ + + u32x w0l = w0[0]; + + for (u32 il_pos = 0; il_pos < bfs_cnt; il_pos++) + { + const u32 w0r = bfs_buf[il_pos].i; + + w0[0] = w0l | w0r; + + u32x wl[16]; + + wl[ 0] = w0[0]; + wl[ 1] = w0[1]; + wl[ 2] = w0[2]; + wl[ 3] = w0[3]; + wl[ 4] = w1[0]; + wl[ 5] = w1[1]; + wl[ 6] = w1[2]; + wl[ 7] = w1[3]; + wl[ 8] = w2[0]; + wl[ 9] = w2[1]; + wl[10] = w2[2]; + wl[11] = w2[3]; + wl[12] = w3[0]; + wl[13] = w3[1]; + wl[14] = w14; + wl[15] = 0; + + u32x dgst[5]; + + dgst[0] = RIPEMD160M_A; + dgst[1] = RIPEMD160M_B; + dgst[2] = RIPEMD160M_C; + dgst[3] = RIPEMD160M_D; + dgst[4] = RIPEMD160M_E; + + ripemd160_transform (wl, dgst); + + const u32x r0 = dgst[0]; + const u32x r1 = dgst[1]; + const u32x r2 = dgst[2]; + const u32x r3 = dgst[3]; + + #include VECT_COMPARE_S + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m06000_m04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m06000m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m06000_m08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m06000m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m06000_m16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = pws[gid].i[ 8]; + w2[1] = pws[gid].i[ 9]; + w2[2] = pws[gid].i[10]; + w2[3] = pws[gid].i[11]; + + u32x w3[4]; + + w3[0] = pws[gid].i[12]; + w3[1] = pws[gid].i[13]; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m06000m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m06000_s04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m06000s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m06000_s08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m06000s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m06000_s16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = pws[gid].i[ 8]; + w2[1] = pws[gid].i[ 9]; + w2[2] = pws[gid].i[10]; + w2[3] = pws[gid].i[11]; + + u32x w3[4]; + + w3[0] = pws[gid].i[12]; + w3[1] = pws[gid].i[13]; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m06000s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} diff --git a/amd/m06100_a0.cl b/amd/m06100_a0.cl new file mode 100644 index 0000000000..c7b50563fc --- /dev/null +++ b/amd/m06100_a0.cl @@ -0,0 +1,1673 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _WHIRLPOOL_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW4 +#define VECT_SIZE2 +#endif + +#ifdef VLIW5 +#define VECT_SIZE2 +#endif + +#define DGST_R0 0 +#define DGST_R1 1 +#define DGST_R2 2 +#define DGST_R3 3 + +#include "include/kernel_functions.c" +#include "types_amd.c" +#include "common_amd.c" +#include "include/rp_gpu.h" +#include "rp_amd.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#define R 10 + +#ifdef VECT_SIZE1 +#define BOX(S,n,i) u32x ((S)[(n)][(i)]) +#endif + +#ifdef VECT_SIZE2 +#define BOX(S,n,i) u32x ((S)[(n)][(i).s0], (S)[(n)][(i).s1]) +#endif + +__constant u32 Ch[8][256] = +{ + { + 0x18186018, 0x23238c23, 0xc6c63fc6, 0xe8e887e8, + 0x87872687, 0xb8b8dab8, 0x01010401, 0x4f4f214f, + 0x3636d836, 0xa6a6a2a6, 0xd2d26fd2, 0xf5f5f3f5, + 0x7979f979, 0x6f6fa16f, 0x91917e91, 0x52525552, + 0x60609d60, 0xbcbccabc, 0x9b9b569b, 0x8e8e028e, + 0xa3a3b6a3, 0x0c0c300c, 0x7b7bf17b, 0x3535d435, + 0x1d1d741d, 0xe0e0a7e0, 0xd7d77bd7, 0xc2c22fc2, + 0x2e2eb82e, 0x4b4b314b, 0xfefedffe, 0x57574157, + 0x15155415, 0x7777c177, 0x3737dc37, 0xe5e5b3e5, + 0x9f9f469f, 0xf0f0e7f0, 0x4a4a354a, 0xdada4fda, + 0x58587d58, 0xc9c903c9, 0x2929a429, 0x0a0a280a, + 0xb1b1feb1, 0xa0a0baa0, 0x6b6bb16b, 0x85852e85, + 0xbdbdcebd, 0x5d5d695d, 0x10104010, 0xf4f4f7f4, + 0xcbcb0bcb, 0x3e3ef83e, 0x05051405, 0x67678167, + 0xe4e4b7e4, 0x27279c27, 0x41411941, 0x8b8b168b, + 0xa7a7a6a7, 0x7d7de97d, 0x95956e95, 0xd8d847d8, + 0xfbfbcbfb, 0xeeee9fee, 0x7c7ced7c, 0x66668566, + 0xdddd53dd, 0x17175c17, 0x47470147, 0x9e9e429e, + 0xcaca0fca, 0x2d2db42d, 0xbfbfc6bf, 0x07071c07, + 0xadad8ead, 0x5a5a755a, 0x83833683, 0x3333cc33, + 0x63639163, 0x02020802, 0xaaaa92aa, 0x7171d971, + 0xc8c807c8, 0x19196419, 0x49493949, 0xd9d943d9, + 0xf2f2eff2, 0xe3e3abe3, 0x5b5b715b, 0x88881a88, + 0x9a9a529a, 0x26269826, 0x3232c832, 0xb0b0fab0, + 0xe9e983e9, 0x0f0f3c0f, 0xd5d573d5, 0x80803a80, + 0xbebec2be, 0xcdcd13cd, 0x3434d034, 0x48483d48, + 0xffffdbff, 0x7a7af57a, 0x90907a90, 0x5f5f615f, + 0x20208020, 0x6868bd68, 0x1a1a681a, 0xaeae82ae, + 0xb4b4eab4, 0x54544d54, 0x93937693, 0x22228822, + 0x64648d64, 0xf1f1e3f1, 0x7373d173, 0x12124812, + 0x40401d40, 0x08082008, 0xc3c32bc3, 0xecec97ec, + 0xdbdb4bdb, 0xa1a1bea1, 0x8d8d0e8d, 0x3d3df43d, + 0x97976697, 0x00000000, 0xcfcf1bcf, 0x2b2bac2b, + 0x7676c576, 0x82823282, 0xd6d67fd6, 0x1b1b6c1b, + 0xb5b5eeb5, 0xafaf86af, 0x6a6ab56a, 0x50505d50, + 0x45450945, 0xf3f3ebf3, 0x3030c030, 0xefef9bef, + 0x3f3ffc3f, 0x55554955, 0xa2a2b2a2, 0xeaea8fea, + 0x65658965, 0xbabad2ba, 0x2f2fbc2f, 0xc0c027c0, + 0xdede5fde, 0x1c1c701c, 0xfdfdd3fd, 0x4d4d294d, + 0x92927292, 0x7575c975, 0x06061806, 0x8a8a128a, + 0xb2b2f2b2, 0xe6e6bfe6, 0x0e0e380e, 0x1f1f7c1f, + 0x62629562, 0xd4d477d4, 0xa8a89aa8, 0x96966296, + 0xf9f9c3f9, 0xc5c533c5, 0x25259425, 0x59597959, + 0x84842a84, 0x7272d572, 0x3939e439, 0x4c4c2d4c, + 0x5e5e655e, 0x7878fd78, 0x3838e038, 0x8c8c0a8c, + 0xd1d163d1, 0xa5a5aea5, 0xe2e2afe2, 0x61619961, + 0xb3b3f6b3, 0x21218421, 0x9c9c4a9c, 0x1e1e781e, + 0x43431143, 0xc7c73bc7, 0xfcfcd7fc, 0x04041004, + 0x51515951, 0x99995e99, 0x6d6da96d, 0x0d0d340d, + 0xfafacffa, 0xdfdf5bdf, 0x7e7ee57e, 0x24249024, + 0x3b3bec3b, 0xabab96ab, 0xcece1fce, 0x11114411, + 0x8f8f068f, 0x4e4e254e, 0xb7b7e6b7, 0xebeb8beb, + 0x3c3cf03c, 0x81813e81, 0x94946a94, 0xf7f7fbf7, + 0xb9b9deb9, 0x13134c13, 0x2c2cb02c, 0xd3d36bd3, + 0xe7e7bbe7, 0x6e6ea56e, 0xc4c437c4, 0x03030c03, + 0x56564556, 0x44440d44, 0x7f7fe17f, 0xa9a99ea9, + 0x2a2aa82a, 0xbbbbd6bb, 0xc1c123c1, 0x53535153, + 0xdcdc57dc, 0x0b0b2c0b, 0x9d9d4e9d, 0x6c6cad6c, + 0x3131c431, 0x7474cd74, 0xf6f6fff6, 0x46460546, + 0xacac8aac, 0x89891e89, 0x14145014, 0xe1e1a3e1, + 0x16165816, 0x3a3ae83a, 0x6969b969, 0x09092409, + 0x7070dd70, 0xb6b6e2b6, 0xd0d067d0, 0xeded93ed, + 0xcccc17cc, 0x42421542, 0x98985a98, 0xa4a4aaa4, + 0x2828a028, 0x5c5c6d5c, 0xf8f8c7f8, 0x86862286, + }, + { + 0xd8181860, 0x2623238c, 0xb8c6c63f, 0xfbe8e887, + 0xcb878726, 0x11b8b8da, 0x09010104, 0x0d4f4f21, + 0x9b3636d8, 0xffa6a6a2, 0x0cd2d26f, 0x0ef5f5f3, + 0x967979f9, 0x306f6fa1, 0x6d91917e, 0xf8525255, + 0x4760609d, 0x35bcbcca, 0x379b9b56, 0x8a8e8e02, + 0xd2a3a3b6, 0x6c0c0c30, 0x847b7bf1, 0x803535d4, + 0xf51d1d74, 0xb3e0e0a7, 0x21d7d77b, 0x9cc2c22f, + 0x432e2eb8, 0x294b4b31, 0x5dfefedf, 0xd5575741, + 0xbd151554, 0xe87777c1, 0x923737dc, 0x9ee5e5b3, + 0x139f9f46, 0x23f0f0e7, 0x204a4a35, 0x44dada4f, + 0xa258587d, 0xcfc9c903, 0x7c2929a4, 0x5a0a0a28, + 0x50b1b1fe, 0xc9a0a0ba, 0x146b6bb1, 0xd985852e, + 0x3cbdbdce, 0x8f5d5d69, 0x90101040, 0x07f4f4f7, + 0xddcbcb0b, 0xd33e3ef8, 0x2d050514, 0x78676781, + 0x97e4e4b7, 0x0227279c, 0x73414119, 0xa78b8b16, + 0xf6a7a7a6, 0xb27d7de9, 0x4995956e, 0x56d8d847, + 0x70fbfbcb, 0xcdeeee9f, 0xbb7c7ced, 0x71666685, + 0x7bdddd53, 0xaf17175c, 0x45474701, 0x1a9e9e42, + 0xd4caca0f, 0x582d2db4, 0x2ebfbfc6, 0x3f07071c, + 0xacadad8e, 0xb05a5a75, 0xef838336, 0xb63333cc, + 0x5c636391, 0x12020208, 0x93aaaa92, 0xde7171d9, + 0xc6c8c807, 0xd1191964, 0x3b494939, 0x5fd9d943, + 0x31f2f2ef, 0xa8e3e3ab, 0xb95b5b71, 0xbc88881a, + 0x3e9a9a52, 0x0b262698, 0xbf3232c8, 0x59b0b0fa, + 0xf2e9e983, 0x770f0f3c, 0x33d5d573, 0xf480803a, + 0x27bebec2, 0xebcdcd13, 0x893434d0, 0x3248483d, + 0x54ffffdb, 0x8d7a7af5, 0x6490907a, 0x9d5f5f61, + 0x3d202080, 0x0f6868bd, 0xca1a1a68, 0xb7aeae82, + 0x7db4b4ea, 0xce54544d, 0x7f939376, 0x2f222288, + 0x6364648d, 0x2af1f1e3, 0xcc7373d1, 0x82121248, + 0x7a40401d, 0x48080820, 0x95c3c32b, 0xdfecec97, + 0x4ddbdb4b, 0xc0a1a1be, 0x918d8d0e, 0xc83d3df4, + 0x5b979766, 0x00000000, 0xf9cfcf1b, 0x6e2b2bac, + 0xe17676c5, 0xe6828232, 0x28d6d67f, 0xc31b1b6c, + 0x74b5b5ee, 0xbeafaf86, 0x1d6a6ab5, 0xea50505d, + 0x57454509, 0x38f3f3eb, 0xad3030c0, 0xc4efef9b, + 0xda3f3ffc, 0xc7555549, 0xdba2a2b2, 0xe9eaea8f, + 0x6a656589, 0x03babad2, 0x4a2f2fbc, 0x8ec0c027, + 0x60dede5f, 0xfc1c1c70, 0x46fdfdd3, 0x1f4d4d29, + 0x76929272, 0xfa7575c9, 0x36060618, 0xae8a8a12, + 0x4bb2b2f2, 0x85e6e6bf, 0x7e0e0e38, 0xe71f1f7c, + 0x55626295, 0x3ad4d477, 0x81a8a89a, 0x52969662, + 0x62f9f9c3, 0xa3c5c533, 0x10252594, 0xab595979, + 0xd084842a, 0xc57272d5, 0xec3939e4, 0x164c4c2d, + 0x945e5e65, 0x9f7878fd, 0xe53838e0, 0x988c8c0a, + 0x17d1d163, 0xe4a5a5ae, 0xa1e2e2af, 0x4e616199, + 0x42b3b3f6, 0x34212184, 0x089c9c4a, 0xee1e1e78, + 0x61434311, 0xb1c7c73b, 0x4ffcfcd7, 0x24040410, + 0xe3515159, 0x2599995e, 0x226d6da9, 0x650d0d34, + 0x79fafacf, 0x69dfdf5b, 0xa97e7ee5, 0x19242490, + 0xfe3b3bec, 0x9aabab96, 0xf0cece1f, 0x99111144, + 0x838f8f06, 0x044e4e25, 0x66b7b7e6, 0xe0ebeb8b, + 0xc13c3cf0, 0xfd81813e, 0x4094946a, 0x1cf7f7fb, + 0x18b9b9de, 0x8b13134c, 0x512c2cb0, 0x05d3d36b, + 0x8ce7e7bb, 0x396e6ea5, 0xaac4c437, 0x1b03030c, + 0xdc565645, 0x5e44440d, 0xa07f7fe1, 0x88a9a99e, + 0x672a2aa8, 0x0abbbbd6, 0x87c1c123, 0xf1535351, + 0x72dcdc57, 0x530b0b2c, 0x019d9d4e, 0x2b6c6cad, + 0xa43131c4, 0xf37474cd, 0x15f6f6ff, 0x4c464605, + 0xa5acac8a, 0xb589891e, 0xb4141450, 0xbae1e1a3, + 0xa6161658, 0xf73a3ae8, 0x066969b9, 0x41090924, + 0xd77070dd, 0x6fb6b6e2, 0x1ed0d067, 0xd6eded93, + 0xe2cccc17, 0x68424215, 0x2c98985a, 0xeda4a4aa, + 0x752828a0, 0x865c5c6d, 0x6bf8f8c7, 0xc2868622, + }, + { + 0x30d81818, 0x46262323, 0x91b8c6c6, 0xcdfbe8e8, + 0x13cb8787, 0x6d11b8b8, 0x02090101, 0x9e0d4f4f, + 0x6c9b3636, 0x51ffa6a6, 0xb90cd2d2, 0xf70ef5f5, + 0xf2967979, 0xde306f6f, 0x3f6d9191, 0xa4f85252, + 0xc0476060, 0x6535bcbc, 0x2b379b9b, 0x018a8e8e, + 0x5bd2a3a3, 0x186c0c0c, 0xf6847b7b, 0x6a803535, + 0x3af51d1d, 0xddb3e0e0, 0xb321d7d7, 0x999cc2c2, + 0x5c432e2e, 0x96294b4b, 0xe15dfefe, 0xaed55757, + 0x2abd1515, 0xeee87777, 0x6e923737, 0xd79ee5e5, + 0x23139f9f, 0xfd23f0f0, 0x94204a4a, 0xa944dada, + 0xb0a25858, 0x8fcfc9c9, 0x527c2929, 0x145a0a0a, + 0x7f50b1b1, 0x5dc9a0a0, 0xd6146b6b, 0x17d98585, + 0x673cbdbd, 0xba8f5d5d, 0x20901010, 0xf507f4f4, + 0x8bddcbcb, 0x7cd33e3e, 0x0a2d0505, 0xce786767, + 0xd597e4e4, 0x4e022727, 0x82734141, 0x0ba78b8b, + 0x53f6a7a7, 0xfab27d7d, 0x37499595, 0xad56d8d8, + 0xeb70fbfb, 0xc1cdeeee, 0xf8bb7c7c, 0xcc716666, + 0xa77bdddd, 0x2eaf1717, 0x8e454747, 0x211a9e9e, + 0x89d4caca, 0x5a582d2d, 0x632ebfbf, 0x0e3f0707, + 0x47acadad, 0xb4b05a5a, 0x1bef8383, 0x66b63333, + 0xc65c6363, 0x04120202, 0x4993aaaa, 0xe2de7171, + 0x8dc6c8c8, 0x32d11919, 0x923b4949, 0xaf5fd9d9, + 0xf931f2f2, 0xdba8e3e3, 0xb6b95b5b, 0x0dbc8888, + 0x293e9a9a, 0x4c0b2626, 0x64bf3232, 0x7d59b0b0, + 0xcff2e9e9, 0x1e770f0f, 0xb733d5d5, 0x1df48080, + 0x6127bebe, 0x87ebcdcd, 0x68893434, 0x90324848, + 0xe354ffff, 0xf48d7a7a, 0x3d649090, 0xbe9d5f5f, + 0x403d2020, 0xd00f6868, 0x34ca1a1a, 0x41b7aeae, + 0x757db4b4, 0xa8ce5454, 0x3b7f9393, 0x442f2222, + 0xc8636464, 0xff2af1f1, 0xe6cc7373, 0x24821212, + 0x807a4040, 0x10480808, 0x9b95c3c3, 0xc5dfecec, + 0xab4ddbdb, 0x5fc0a1a1, 0x07918d8d, 0x7ac83d3d, + 0x335b9797, 0x00000000, 0x83f9cfcf, 0x566e2b2b, + 0xece17676, 0x19e68282, 0xb128d6d6, 0x36c31b1b, + 0x7774b5b5, 0x43beafaf, 0xd41d6a6a, 0xa0ea5050, + 0x8a574545, 0xfb38f3f3, 0x60ad3030, 0xc3c4efef, + 0x7eda3f3f, 0xaac75555, 0x59dba2a2, 0xc9e9eaea, + 0xca6a6565, 0x6903baba, 0x5e4a2f2f, 0x9d8ec0c0, + 0xa160dede, 0x38fc1c1c, 0xe746fdfd, 0x9a1f4d4d, + 0x39769292, 0xeafa7575, 0x0c360606, 0x09ae8a8a, + 0x794bb2b2, 0xd185e6e6, 0x1c7e0e0e, 0x3ee71f1f, + 0xc4556262, 0xb53ad4d4, 0x4d81a8a8, 0x31529696, + 0xef62f9f9, 0x97a3c5c5, 0x4a102525, 0xb2ab5959, + 0x15d08484, 0xe4c57272, 0x72ec3939, 0x98164c4c, + 0xbc945e5e, 0xf09f7878, 0x70e53838, 0x05988c8c, + 0xbf17d1d1, 0x57e4a5a5, 0xd9a1e2e2, 0xc24e6161, + 0x7b42b3b3, 0x42342121, 0x25089c9c, 0x3cee1e1e, + 0x86614343, 0x93b1c7c7, 0xe54ffcfc, 0x08240404, + 0xa2e35151, 0x2f259999, 0xda226d6d, 0x1a650d0d, + 0xe979fafa, 0xa369dfdf, 0xfca97e7e, 0x48192424, + 0x76fe3b3b, 0x4b9aabab, 0x81f0cece, 0x22991111, + 0x03838f8f, 0x9c044e4e, 0x7366b7b7, 0xcbe0ebeb, + 0x78c13c3c, 0x1ffd8181, 0x35409494, 0xf31cf7f7, + 0x6f18b9b9, 0x268b1313, 0x58512c2c, 0xbb05d3d3, + 0xd38ce7e7, 0xdc396e6e, 0x95aac4c4, 0x061b0303, + 0xacdc5656, 0x885e4444, 0xfea07f7f, 0x4f88a9a9, + 0x54672a2a, 0x6b0abbbb, 0x9f87c1c1, 0xa6f15353, + 0xa572dcdc, 0x16530b0b, 0x27019d9d, 0xd82b6c6c, + 0x62a43131, 0xe8f37474, 0xf115f6f6, 0x8c4c4646, + 0x45a5acac, 0x0fb58989, 0x28b41414, 0xdfbae1e1, + 0x2ca61616, 0x74f73a3a, 0xd2066969, 0x12410909, + 0xe0d77070, 0x716fb6b6, 0xbd1ed0d0, 0xc7d6eded, + 0x85e2cccc, 0x84684242, 0x2d2c9898, 0x55eda4a4, + 0x50752828, 0xb8865c5c, 0xed6bf8f8, 0x11c28686, + }, + { + 0x7830d818, 0xaf462623, 0xf991b8c6, 0x6fcdfbe8, + 0xa113cb87, 0x626d11b8, 0x05020901, 0x6e9e0d4f, + 0xee6c9b36, 0x0451ffa6, 0xbdb90cd2, 0x06f70ef5, + 0x80f29679, 0xcede306f, 0xef3f6d91, 0x07a4f852, + 0xfdc04760, 0x766535bc, 0xcd2b379b, 0x8c018a8e, + 0x155bd2a3, 0x3c186c0c, 0x8af6847b, 0xe16a8035, + 0x693af51d, 0x47ddb3e0, 0xacb321d7, 0xed999cc2, + 0x965c432e, 0x7a96294b, 0x21e15dfe, 0x16aed557, + 0x412abd15, 0xb6eee877, 0xeb6e9237, 0x56d79ee5, + 0xd923139f, 0x17fd23f0, 0x7f94204a, 0x95a944da, + 0x25b0a258, 0xca8fcfc9, 0x8d527c29, 0x22145a0a, + 0x4f7f50b1, 0x1a5dc9a0, 0xdad6146b, 0xab17d985, + 0x73673cbd, 0x34ba8f5d, 0x50209010, 0x03f507f4, + 0xc08bddcb, 0xc67cd33e, 0x110a2d05, 0xe6ce7867, + 0x53d597e4, 0xbb4e0227, 0x58827341, 0x9d0ba78b, + 0x0153f6a7, 0x94fab27d, 0xfb374995, 0x9fad56d8, + 0x30eb70fb, 0x71c1cdee, 0x91f8bb7c, 0xe3cc7166, + 0x8ea77bdd, 0x4b2eaf17, 0x468e4547, 0xdc211a9e, + 0xc589d4ca, 0x995a582d, 0x79632ebf, 0x1b0e3f07, + 0x2347acad, 0x2fb4b05a, 0xb51bef83, 0xff66b633, + 0xf2c65c63, 0x0a041202, 0x384993aa, 0xa8e2de71, + 0xcf8dc6c8, 0x7d32d119, 0x70923b49, 0x9aaf5fd9, + 0x1df931f2, 0x48dba8e3, 0x2ab6b95b, 0x920dbc88, + 0xc8293e9a, 0xbe4c0b26, 0xfa64bf32, 0x4a7d59b0, + 0x6acff2e9, 0x331e770f, 0xa6b733d5, 0xba1df480, + 0x7c6127be, 0xde87ebcd, 0xe4688934, 0x75903248, + 0x24e354ff, 0x8ff48d7a, 0xea3d6490, 0x3ebe9d5f, + 0xa0403d20, 0xd5d00f68, 0x7234ca1a, 0x2c41b7ae, + 0x5e757db4, 0x19a8ce54, 0xe53b7f93, 0xaa442f22, + 0xe9c86364, 0x12ff2af1, 0xa2e6cc73, 0x5a248212, + 0x5d807a40, 0x28104808, 0xe89b95c3, 0x7bc5dfec, + 0x90ab4ddb, 0x1f5fc0a1, 0x8307918d, 0xc97ac83d, + 0xf1335b97, 0x00000000, 0xd483f9cf, 0x87566e2b, + 0xb3ece176, 0xb019e682, 0xa9b128d6, 0x7736c31b, + 0x5b7774b5, 0x2943beaf, 0xdfd41d6a, 0x0da0ea50, + 0x4c8a5745, 0x18fb38f3, 0xf060ad30, 0x74c3c4ef, + 0xc37eda3f, 0x1caac755, 0x1059dba2, 0x65c9e9ea, + 0xecca6a65, 0x686903ba, 0x935e4a2f, 0xe79d8ec0, + 0x81a160de, 0x6c38fc1c, 0x2ee746fd, 0x649a1f4d, + 0xe0397692, 0xbceafa75, 0x1e0c3606, 0x9809ae8a, + 0x40794bb2, 0x59d185e6, 0x361c7e0e, 0x633ee71f, + 0xf7c45562, 0xa3b53ad4, 0x324d81a8, 0xf4315296, + 0x3aef62f9, 0xf697a3c5, 0xb14a1025, 0x20b2ab59, + 0xae15d084, 0xa7e4c572, 0xdd72ec39, 0x6198164c, + 0x3bbc945e, 0x85f09f78, 0xd870e538, 0x8605988c, + 0xb2bf17d1, 0x0b57e4a5, 0x4dd9a1e2, 0xf8c24e61, + 0x457b42b3, 0xa5423421, 0xd625089c, 0x663cee1e, + 0x52866143, 0xfc93b1c7, 0x2be54ffc, 0x14082404, + 0x08a2e351, 0xc72f2599, 0xc4da226d, 0x391a650d, + 0x35e979fa, 0x84a369df, 0x9bfca97e, 0xb4481924, + 0xd776fe3b, 0x3d4b9aab, 0xd181f0ce, 0x55229911, + 0x8903838f, 0x6b9c044e, 0x517366b7, 0x60cbe0eb, + 0xcc78c13c, 0xbf1ffd81, 0xfe354094, 0x0cf31cf7, + 0x676f18b9, 0x5f268b13, 0x9c58512c, 0xb8bb05d3, + 0x5cd38ce7, 0xcbdc396e, 0xf395aac4, 0x0f061b03, + 0x13acdc56, 0x49885e44, 0x9efea07f, 0x374f88a9, + 0x8254672a, 0x6d6b0abb, 0xe29f87c1, 0x02a6f153, + 0x8ba572dc, 0x2716530b, 0xd327019d, 0xc1d82b6c, + 0xf562a431, 0xb9e8f374, 0x09f115f6, 0x438c4c46, + 0x2645a5ac, 0x970fb589, 0x4428b414, 0x42dfbae1, + 0x4e2ca616, 0xd274f73a, 0xd0d20669, 0x2d124109, + 0xade0d770, 0x54716fb6, 0xb7bd1ed0, 0x7ec7d6ed, + 0xdb85e2cc, 0x57846842, 0xc22d2c98, 0x0e55eda4, + 0x88507528, 0x31b8865c, 0x3fed6bf8, 0xa411c286, + }, + { + 0xc07830d8, 0x05af4626, 0x7ef991b8, 0x136fcdfb, + 0x4ca113cb, 0xa9626d11, 0x08050209, 0x426e9e0d, + 0xadee6c9b, 0x590451ff, 0xdebdb90c, 0xfb06f70e, + 0xef80f296, 0x5fcede30, 0xfcef3f6d, 0xaa07a4f8, + 0x27fdc047, 0x89766535, 0xaccd2b37, 0x048c018a, + 0x71155bd2, 0x603c186c, 0xff8af684, 0xb5e16a80, + 0xe8693af5, 0x5347ddb3, 0xf6acb321, 0x5eed999c, + 0x6d965c43, 0x627a9629, 0xa321e15d, 0x8216aed5, + 0xa8412abd, 0x9fb6eee8, 0xa5eb6e92, 0x7b56d79e, + 0x8cd92313, 0xd317fd23, 0x6a7f9420, 0x9e95a944, + 0xfa25b0a2, 0x06ca8fcf, 0x558d527c, 0x5022145a, + 0xe14f7f50, 0x691a5dc9, 0x7fdad614, 0x5cab17d9, + 0x8173673c, 0xd234ba8f, 0x80502090, 0xf303f507, + 0x16c08bdd, 0xedc67cd3, 0x28110a2d, 0x1fe6ce78, + 0x7353d597, 0x25bb4e02, 0x32588273, 0x2c9d0ba7, + 0x510153f6, 0xcf94fab2, 0xdcfb3749, 0x8e9fad56, + 0x8b30eb70, 0x2371c1cd, 0xc791f8bb, 0x17e3cc71, + 0xa68ea77b, 0xb84b2eaf, 0x02468e45, 0x84dc211a, + 0x1ec589d4, 0x75995a58, 0x9179632e, 0x381b0e3f, + 0x012347ac, 0xea2fb4b0, 0x6cb51bef, 0x85ff66b6, + 0x3ff2c65c, 0x100a0412, 0x39384993, 0xafa8e2de, + 0x0ecf8dc6, 0xc87d32d1, 0x7270923b, 0x869aaf5f, + 0xc31df931, 0x4b48dba8, 0xe22ab6b9, 0x34920dbc, + 0xa4c8293e, 0x2dbe4c0b, 0x8dfa64bf, 0xe94a7d59, + 0x1b6acff2, 0x78331e77, 0xe6a6b733, 0x74ba1df4, + 0x997c6127, 0x26de87eb, 0xbde46889, 0x7a759032, + 0xab24e354, 0xf78ff48d, 0xf4ea3d64, 0xc23ebe9d, + 0x1da0403d, 0x67d5d00f, 0xd07234ca, 0x192c41b7, + 0xc95e757d, 0x9a19a8ce, 0xece53b7f, 0x0daa442f, + 0x07e9c863, 0xdb12ff2a, 0xbfa2e6cc, 0x905a2482, + 0x3a5d807a, 0x40281048, 0x56e89b95, 0x337bc5df, + 0x9690ab4d, 0x611f5fc0, 0x1c830791, 0xf5c97ac8, + 0xccf1335b, 0x00000000, 0x36d483f9, 0x4587566e, + 0x97b3ece1, 0x64b019e6, 0xfea9b128, 0xd87736c3, + 0xc15b7774, 0x112943be, 0x77dfd41d, 0xba0da0ea, + 0x124c8a57, 0xcb18fb38, 0x9df060ad, 0x2b74c3c4, + 0xe5c37eda, 0x921caac7, 0x791059db, 0x0365c9e9, + 0x0fecca6a, 0xb9686903, 0x65935e4a, 0x4ee79d8e, + 0xbe81a160, 0xe06c38fc, 0xbb2ee746, 0x52649a1f, + 0xe4e03976, 0x8fbceafa, 0x301e0c36, 0x249809ae, + 0xf940794b, 0x6359d185, 0x70361c7e, 0xf8633ee7, + 0x37f7c455, 0xeea3b53a, 0x29324d81, 0xc4f43152, + 0x9b3aef62, 0x66f697a3, 0x35b14a10, 0xf220b2ab, + 0x54ae15d0, 0xb7a7e4c5, 0xd5dd72ec, 0x5a619816, + 0xca3bbc94, 0xe785f09f, 0xddd870e5, 0x14860598, + 0xc6b2bf17, 0x410b57e4, 0x434dd9a1, 0x2ff8c24e, + 0xf1457b42, 0x15a54234, 0x94d62508, 0xf0663cee, + 0x22528661, 0x76fc93b1, 0xb32be54f, 0x20140824, + 0xb208a2e3, 0xbcc72f25, 0x4fc4da22, 0x68391a65, + 0x8335e979, 0xb684a369, 0xd79bfca9, 0x3db44819, + 0xc5d776fe, 0x313d4b9a, 0x3ed181f0, 0x88552299, + 0x0c890383, 0x4a6b9c04, 0xd1517366, 0x0b60cbe0, + 0xfdcc78c1, 0x7cbf1ffd, 0xd4fe3540, 0xeb0cf31c, + 0xa1676f18, 0x985f268b, 0x7d9c5851, 0xd6b8bb05, + 0x6b5cd38c, 0x57cbdc39, 0x6ef395aa, 0x180f061b, + 0x8a13acdc, 0x1a49885e, 0xdf9efea0, 0x21374f88, + 0x4d825467, 0xb16d6b0a, 0x46e29f87, 0xa202a6f1, + 0xae8ba572, 0x58271653, 0x9cd32701, 0x47c1d82b, + 0x95f562a4, 0x87b9e8f3, 0xe309f115, 0x0a438c4c, + 0x092645a5, 0x3c970fb5, 0xa04428b4, 0x5b42dfba, + 0xb04e2ca6, 0xcdd274f7, 0x6fd0d206, 0x482d1241, + 0xa7ade0d7, 0xd954716f, 0xceb7bd1e, 0x3b7ec7d6, + 0x2edb85e2, 0x2a578468, 0xb4c22d2c, 0x490e55ed, + 0x5d885075, 0xda31b886, 0x933fed6b, 0x44a411c2, + }, + { + 0x18c07830, 0x2305af46, 0xc67ef991, 0xe8136fcd, + 0x874ca113, 0xb8a9626d, 0x01080502, 0x4f426e9e, + 0x36adee6c, 0xa6590451, 0xd2debdb9, 0xf5fb06f7, + 0x79ef80f2, 0x6f5fcede, 0x91fcef3f, 0x52aa07a4, + 0x6027fdc0, 0xbc897665, 0x9baccd2b, 0x8e048c01, + 0xa371155b, 0x0c603c18, 0x7bff8af6, 0x35b5e16a, + 0x1de8693a, 0xe05347dd, 0xd7f6acb3, 0xc25eed99, + 0x2e6d965c, 0x4b627a96, 0xfea321e1, 0x578216ae, + 0x15a8412a, 0x779fb6ee, 0x37a5eb6e, 0xe57b56d7, + 0x9f8cd923, 0xf0d317fd, 0x4a6a7f94, 0xda9e95a9, + 0x58fa25b0, 0xc906ca8f, 0x29558d52, 0x0a502214, + 0xb1e14f7f, 0xa0691a5d, 0x6b7fdad6, 0x855cab17, + 0xbd817367, 0x5dd234ba, 0x10805020, 0xf4f303f5, + 0xcb16c08b, 0x3eedc67c, 0x0528110a, 0x671fe6ce, + 0xe47353d5, 0x2725bb4e, 0x41325882, 0x8b2c9d0b, + 0xa7510153, 0x7dcf94fa, 0x95dcfb37, 0xd88e9fad, + 0xfb8b30eb, 0xee2371c1, 0x7cc791f8, 0x6617e3cc, + 0xdda68ea7, 0x17b84b2e, 0x4702468e, 0x9e84dc21, + 0xca1ec589, 0x2d75995a, 0xbf917963, 0x07381b0e, + 0xad012347, 0x5aea2fb4, 0x836cb51b, 0x3385ff66, + 0x633ff2c6, 0x02100a04, 0xaa393849, 0x71afa8e2, + 0xc80ecf8d, 0x19c87d32, 0x49727092, 0xd9869aaf, + 0xf2c31df9, 0xe34b48db, 0x5be22ab6, 0x8834920d, + 0x9aa4c829, 0x262dbe4c, 0x328dfa64, 0xb0e94a7d, + 0xe91b6acf, 0x0f78331e, 0xd5e6a6b7, 0x8074ba1d, + 0xbe997c61, 0xcd26de87, 0x34bde468, 0x487a7590, + 0xffab24e3, 0x7af78ff4, 0x90f4ea3d, 0x5fc23ebe, + 0x201da040, 0x6867d5d0, 0x1ad07234, 0xae192c41, + 0xb4c95e75, 0x549a19a8, 0x93ece53b, 0x220daa44, + 0x6407e9c8, 0xf1db12ff, 0x73bfa2e6, 0x12905a24, + 0x403a5d80, 0x08402810, 0xc356e89b, 0xec337bc5, + 0xdb9690ab, 0xa1611f5f, 0x8d1c8307, 0x3df5c97a, + 0x97ccf133, 0x00000000, 0xcf36d483, 0x2b458756, + 0x7697b3ec, 0x8264b019, 0xd6fea9b1, 0x1bd87736, + 0xb5c15b77, 0xaf112943, 0x6a77dfd4, 0x50ba0da0, + 0x45124c8a, 0xf3cb18fb, 0x309df060, 0xef2b74c3, + 0x3fe5c37e, 0x55921caa, 0xa2791059, 0xea0365c9, + 0x650fecca, 0xbab96869, 0x2f65935e, 0xc04ee79d, + 0xdebe81a1, 0x1ce06c38, 0xfdbb2ee7, 0x4d52649a, + 0x92e4e039, 0x758fbcea, 0x06301e0c, 0x8a249809, + 0xb2f94079, 0xe66359d1, 0x0e70361c, 0x1ff8633e, + 0x6237f7c4, 0xd4eea3b5, 0xa829324d, 0x96c4f431, + 0xf99b3aef, 0xc566f697, 0x2535b14a, 0x59f220b2, + 0x8454ae15, 0x72b7a7e4, 0x39d5dd72, 0x4c5a6198, + 0x5eca3bbc, 0x78e785f0, 0x38ddd870, 0x8c148605, + 0xd1c6b2bf, 0xa5410b57, 0xe2434dd9, 0x612ff8c2, + 0xb3f1457b, 0x2115a542, 0x9c94d625, 0x1ef0663c, + 0x43225286, 0xc776fc93, 0xfcb32be5, 0x04201408, + 0x51b208a2, 0x99bcc72f, 0x6d4fc4da, 0x0d68391a, + 0xfa8335e9, 0xdfb684a3, 0x7ed79bfc, 0x243db448, + 0x3bc5d776, 0xab313d4b, 0xce3ed181, 0x11885522, + 0x8f0c8903, 0x4e4a6b9c, 0xb7d15173, 0xeb0b60cb, + 0x3cfdcc78, 0x817cbf1f, 0x94d4fe35, 0xf7eb0cf3, + 0xb9a1676f, 0x13985f26, 0x2c7d9c58, 0xd3d6b8bb, + 0xe76b5cd3, 0x6e57cbdc, 0xc46ef395, 0x03180f06, + 0x568a13ac, 0x441a4988, 0x7fdf9efe, 0xa921374f, + 0x2a4d8254, 0xbbb16d6b, 0xc146e29f, 0x53a202a6, + 0xdcae8ba5, 0x0b582716, 0x9d9cd327, 0x6c47c1d8, + 0x3195f562, 0x7487b9e8, 0xf6e309f1, 0x460a438c, + 0xac092645, 0x893c970f, 0x14a04428, 0xe15b42df, + 0x16b04e2c, 0x3acdd274, 0x696fd0d2, 0x09482d12, + 0x70a7ade0, 0xb6d95471, 0xd0ceb7bd, 0xed3b7ec7, + 0xcc2edb85, 0x422a5784, 0x98b4c22d, 0xa4490e55, + 0x285d8850, 0x5cda31b8, 0xf8933fed, 0x8644a411, + }, + { + 0x6018c078, 0x8c2305af, 0x3fc67ef9, 0x87e8136f, + 0x26874ca1, 0xdab8a962, 0x04010805, 0x214f426e, + 0xd836adee, 0xa2a65904, 0x6fd2debd, 0xf3f5fb06, + 0xf979ef80, 0xa16f5fce, 0x7e91fcef, 0x5552aa07, + 0x9d6027fd, 0xcabc8976, 0x569baccd, 0x028e048c, + 0xb6a37115, 0x300c603c, 0xf17bff8a, 0xd435b5e1, + 0x741de869, 0xa7e05347, 0x7bd7f6ac, 0x2fc25eed, + 0xb82e6d96, 0x314b627a, 0xdffea321, 0x41578216, + 0x5415a841, 0xc1779fb6, 0xdc37a5eb, 0xb3e57b56, + 0x469f8cd9, 0xe7f0d317, 0x354a6a7f, 0x4fda9e95, + 0x7d58fa25, 0x03c906ca, 0xa429558d, 0x280a5022, + 0xfeb1e14f, 0xbaa0691a, 0xb16b7fda, 0x2e855cab, + 0xcebd8173, 0x695dd234, 0x40108050, 0xf7f4f303, + 0x0bcb16c0, 0xf83eedc6, 0x14052811, 0x81671fe6, + 0xb7e47353, 0x9c2725bb, 0x19413258, 0x168b2c9d, + 0xa6a75101, 0xe97dcf94, 0x6e95dcfb, 0x47d88e9f, + 0xcbfb8b30, 0x9fee2371, 0xed7cc791, 0x856617e3, + 0x53dda68e, 0x5c17b84b, 0x01470246, 0x429e84dc, + 0x0fca1ec5, 0xb42d7599, 0xc6bf9179, 0x1c07381b, + 0x8ead0123, 0x755aea2f, 0x36836cb5, 0xcc3385ff, + 0x91633ff2, 0x0802100a, 0x92aa3938, 0xd971afa8, + 0x07c80ecf, 0x6419c87d, 0x39497270, 0x43d9869a, + 0xeff2c31d, 0xabe34b48, 0x715be22a, 0x1a883492, + 0x529aa4c8, 0x98262dbe, 0xc8328dfa, 0xfab0e94a, + 0x83e91b6a, 0x3c0f7833, 0x73d5e6a6, 0x3a8074ba, + 0xc2be997c, 0x13cd26de, 0xd034bde4, 0x3d487a75, + 0xdbffab24, 0xf57af78f, 0x7a90f4ea, 0x615fc23e, + 0x80201da0, 0xbd6867d5, 0x681ad072, 0x82ae192c, + 0xeab4c95e, 0x4d549a19, 0x7693ece5, 0x88220daa, + 0x8d6407e9, 0xe3f1db12, 0xd173bfa2, 0x4812905a, + 0x1d403a5d, 0x20084028, 0x2bc356e8, 0x97ec337b, + 0x4bdb9690, 0xbea1611f, 0x0e8d1c83, 0xf43df5c9, + 0x6697ccf1, 0x00000000, 0x1bcf36d4, 0xac2b4587, + 0xc57697b3, 0x328264b0, 0x7fd6fea9, 0x6c1bd877, + 0xeeb5c15b, 0x86af1129, 0xb56a77df, 0x5d50ba0d, + 0x0945124c, 0xebf3cb18, 0xc0309df0, 0x9bef2b74, + 0xfc3fe5c3, 0x4955921c, 0xb2a27910, 0x8fea0365, + 0x89650fec, 0xd2bab968, 0xbc2f6593, 0x27c04ee7, + 0x5fdebe81, 0x701ce06c, 0xd3fdbb2e, 0x294d5264, + 0x7292e4e0, 0xc9758fbc, 0x1806301e, 0x128a2498, + 0xf2b2f940, 0xbfe66359, 0x380e7036, 0x7c1ff863, + 0x956237f7, 0x77d4eea3, 0x9aa82932, 0x6296c4f4, + 0xc3f99b3a, 0x33c566f6, 0x942535b1, 0x7959f220, + 0x2a8454ae, 0xd572b7a7, 0xe439d5dd, 0x2d4c5a61, + 0x655eca3b, 0xfd78e785, 0xe038ddd8, 0x0a8c1486, + 0x63d1c6b2, 0xaea5410b, 0xafe2434d, 0x99612ff8, + 0xf6b3f145, 0x842115a5, 0x4a9c94d6, 0x781ef066, + 0x11432252, 0x3bc776fc, 0xd7fcb32b, 0x10042014, + 0x5951b208, 0x5e99bcc7, 0xa96d4fc4, 0x340d6839, + 0xcffa8335, 0x5bdfb684, 0xe57ed79b, 0x90243db4, + 0xec3bc5d7, 0x96ab313d, 0x1fce3ed1, 0x44118855, + 0x068f0c89, 0x254e4a6b, 0xe6b7d151, 0x8beb0b60, + 0xf03cfdcc, 0x3e817cbf, 0x6a94d4fe, 0xfbf7eb0c, + 0xdeb9a167, 0x4c13985f, 0xb02c7d9c, 0x6bd3d6b8, + 0xbbe76b5c, 0xa56e57cb, 0x37c46ef3, 0x0c03180f, + 0x45568a13, 0x0d441a49, 0xe17fdf9e, 0x9ea92137, + 0xa82a4d82, 0xd6bbb16d, 0x23c146e2, 0x5153a202, + 0x57dcae8b, 0x2c0b5827, 0x4e9d9cd3, 0xad6c47c1, + 0xc43195f5, 0xcd7487b9, 0xfff6e309, 0x05460a43, + 0x8aac0926, 0x1e893c97, 0x5014a044, 0xa3e15b42, + 0x5816b04e, 0xe83acdd2, 0xb9696fd0, 0x2409482d, + 0xdd70a7ad, 0xe2b6d954, 0x67d0ceb7, 0x93ed3b7e, + 0x17cc2edb, 0x15422a57, 0x5a98b4c2, 0xaaa4490e, + 0xa0285d88, 0x6d5cda31, 0xc7f8933f, 0x228644a4, + }, + { + 0x186018c0, 0x238c2305, 0xc63fc67e, 0xe887e813, + 0x8726874c, 0xb8dab8a9, 0x01040108, 0x4f214f42, + 0x36d836ad, 0xa6a2a659, 0xd26fd2de, 0xf5f3f5fb, + 0x79f979ef, 0x6fa16f5f, 0x917e91fc, 0x525552aa, + 0x609d6027, 0xbccabc89, 0x9b569bac, 0x8e028e04, + 0xa3b6a371, 0x0c300c60, 0x7bf17bff, 0x35d435b5, + 0x1d741de8, 0xe0a7e053, 0xd77bd7f6, 0xc22fc25e, + 0x2eb82e6d, 0x4b314b62, 0xfedffea3, 0x57415782, + 0x155415a8, 0x77c1779f, 0x37dc37a5, 0xe5b3e57b, + 0x9f469f8c, 0xf0e7f0d3, 0x4a354a6a, 0xda4fda9e, + 0x587d58fa, 0xc903c906, 0x29a42955, 0x0a280a50, + 0xb1feb1e1, 0xa0baa069, 0x6bb16b7f, 0x852e855c, + 0xbdcebd81, 0x5d695dd2, 0x10401080, 0xf4f7f4f3, + 0xcb0bcb16, 0x3ef83eed, 0x05140528, 0x6781671f, + 0xe4b7e473, 0x279c2725, 0x41194132, 0x8b168b2c, + 0xa7a6a751, 0x7de97dcf, 0x956e95dc, 0xd847d88e, + 0xfbcbfb8b, 0xee9fee23, 0x7ced7cc7, 0x66856617, + 0xdd53dda6, 0x175c17b8, 0x47014702, 0x9e429e84, + 0xca0fca1e, 0x2db42d75, 0xbfc6bf91, 0x071c0738, + 0xad8ead01, 0x5a755aea, 0x8336836c, 0x33cc3385, + 0x6391633f, 0x02080210, 0xaa92aa39, 0x71d971af, + 0xc807c80e, 0x196419c8, 0x49394972, 0xd943d986, + 0xf2eff2c3, 0xe3abe34b, 0x5b715be2, 0x881a8834, + 0x9a529aa4, 0x2698262d, 0x32c8328d, 0xb0fab0e9, + 0xe983e91b, 0x0f3c0f78, 0xd573d5e6, 0x803a8074, + 0xbec2be99, 0xcd13cd26, 0x34d034bd, 0x483d487a, + 0xffdbffab, 0x7af57af7, 0x907a90f4, 0x5f615fc2, + 0x2080201d, 0x68bd6867, 0x1a681ad0, 0xae82ae19, + 0xb4eab4c9, 0x544d549a, 0x937693ec, 0x2288220d, + 0x648d6407, 0xf1e3f1db, 0x73d173bf, 0x12481290, + 0x401d403a, 0x08200840, 0xc32bc356, 0xec97ec33, + 0xdb4bdb96, 0xa1bea161, 0x8d0e8d1c, 0x3df43df5, + 0x976697cc, 0x00000000, 0xcf1bcf36, 0x2bac2b45, + 0x76c57697, 0x82328264, 0xd67fd6fe, 0x1b6c1bd8, + 0xb5eeb5c1, 0xaf86af11, 0x6ab56a77, 0x505d50ba, + 0x45094512, 0xf3ebf3cb, 0x30c0309d, 0xef9bef2b, + 0x3ffc3fe5, 0x55495592, 0xa2b2a279, 0xea8fea03, + 0x6589650f, 0xbad2bab9, 0x2fbc2f65, 0xc027c04e, + 0xde5fdebe, 0x1c701ce0, 0xfdd3fdbb, 0x4d294d52, + 0x927292e4, 0x75c9758f, 0x06180630, 0x8a128a24, + 0xb2f2b2f9, 0xe6bfe663, 0x0e380e70, 0x1f7c1ff8, + 0x62956237, 0xd477d4ee, 0xa89aa829, 0x966296c4, + 0xf9c3f99b, 0xc533c566, 0x25942535, 0x597959f2, + 0x842a8454, 0x72d572b7, 0x39e439d5, 0x4c2d4c5a, + 0x5e655eca, 0x78fd78e7, 0x38e038dd, 0x8c0a8c14, + 0xd163d1c6, 0xa5aea541, 0xe2afe243, 0x6199612f, + 0xb3f6b3f1, 0x21842115, 0x9c4a9c94, 0x1e781ef0, + 0x43114322, 0xc73bc776, 0xfcd7fcb3, 0x04100420, + 0x515951b2, 0x995e99bc, 0x6da96d4f, 0x0d340d68, + 0xfacffa83, 0xdf5bdfb6, 0x7ee57ed7, 0x2490243d, + 0x3bec3bc5, 0xab96ab31, 0xce1fce3e, 0x11441188, + 0x8f068f0c, 0x4e254e4a, 0xb7e6b7d1, 0xeb8beb0b, + 0x3cf03cfd, 0x813e817c, 0x946a94d4, 0xf7fbf7eb, + 0xb9deb9a1, 0x134c1398, 0x2cb02c7d, 0xd36bd3d6, + 0xe7bbe76b, 0x6ea56e57, 0xc437c46e, 0x030c0318, + 0x5645568a, 0x440d441a, 0x7fe17fdf, 0xa99ea921, + 0x2aa82a4d, 0xbbd6bbb1, 0xc123c146, 0x535153a2, + 0xdc57dcae, 0x0b2c0b58, 0x9d4e9d9c, 0x6cad6c47, + 0x31c43195, 0x74cd7487, 0xf6fff6e3, 0x4605460a, + 0xac8aac09, 0x891e893c, 0x145014a0, 0xe1a3e15b, + 0x165816b0, 0x3ae83acd, 0x69b9696f, 0x09240948, + 0x70dd70a7, 0xb6e2b6d9, 0xd067d0ce, 0xed93ed3b, + 0xcc17cc2e, 0x4215422a, 0x985a98b4, 0xa4aaa449, + 0x28a0285d, 0x5c6d5cda, 0xf8c7f893, 0x86228644, + } +}; + +__constant u32 Cl[8][256] = +{ + { + 0xc07830d8, 0x05af4626, 0x7ef991b8, 0x136fcdfb, + 0x4ca113cb, 0xa9626d11, 0x08050209, 0x426e9e0d, + 0xadee6c9b, 0x590451ff, 0xdebdb90c, 0xfb06f70e, + 0xef80f296, 0x5fcede30, 0xfcef3f6d, 0xaa07a4f8, + 0x27fdc047, 0x89766535, 0xaccd2b37, 0x048c018a, + 0x71155bd2, 0x603c186c, 0xff8af684, 0xb5e16a80, + 0xe8693af5, 0x5347ddb3, 0xf6acb321, 0x5eed999c, + 0x6d965c43, 0x627a9629, 0xa321e15d, 0x8216aed5, + 0xa8412abd, 0x9fb6eee8, 0xa5eb6e92, 0x7b56d79e, + 0x8cd92313, 0xd317fd23, 0x6a7f9420, 0x9e95a944, + 0xfa25b0a2, 0x06ca8fcf, 0x558d527c, 0x5022145a, + 0xe14f7f50, 0x691a5dc9, 0x7fdad614, 0x5cab17d9, + 0x8173673c, 0xd234ba8f, 0x80502090, 0xf303f507, + 0x16c08bdd, 0xedc67cd3, 0x28110a2d, 0x1fe6ce78, + 0x7353d597, 0x25bb4e02, 0x32588273, 0x2c9d0ba7, + 0x510153f6, 0xcf94fab2, 0xdcfb3749, 0x8e9fad56, + 0x8b30eb70, 0x2371c1cd, 0xc791f8bb, 0x17e3cc71, + 0xa68ea77b, 0xb84b2eaf, 0x02468e45, 0x84dc211a, + 0x1ec589d4, 0x75995a58, 0x9179632e, 0x381b0e3f, + 0x012347ac, 0xea2fb4b0, 0x6cb51bef, 0x85ff66b6, + 0x3ff2c65c, 0x100a0412, 0x39384993, 0xafa8e2de, + 0x0ecf8dc6, 0xc87d32d1, 0x7270923b, 0x869aaf5f, + 0xc31df931, 0x4b48dba8, 0xe22ab6b9, 0x34920dbc, + 0xa4c8293e, 0x2dbe4c0b, 0x8dfa64bf, 0xe94a7d59, + 0x1b6acff2, 0x78331e77, 0xe6a6b733, 0x74ba1df4, + 0x997c6127, 0x26de87eb, 0xbde46889, 0x7a759032, + 0xab24e354, 0xf78ff48d, 0xf4ea3d64, 0xc23ebe9d, + 0x1da0403d, 0x67d5d00f, 0xd07234ca, 0x192c41b7, + 0xc95e757d, 0x9a19a8ce, 0xece53b7f, 0x0daa442f, + 0x07e9c863, 0xdb12ff2a, 0xbfa2e6cc, 0x905a2482, + 0x3a5d807a, 0x40281048, 0x56e89b95, 0x337bc5df, + 0x9690ab4d, 0x611f5fc0, 0x1c830791, 0xf5c97ac8, + 0xccf1335b, 0x00000000, 0x36d483f9, 0x4587566e, + 0x97b3ece1, 0x64b019e6, 0xfea9b128, 0xd87736c3, + 0xc15b7774, 0x112943be, 0x77dfd41d, 0xba0da0ea, + 0x124c8a57, 0xcb18fb38, 0x9df060ad, 0x2b74c3c4, + 0xe5c37eda, 0x921caac7, 0x791059db, 0x0365c9e9, + 0x0fecca6a, 0xb9686903, 0x65935e4a, 0x4ee79d8e, + 0xbe81a160, 0xe06c38fc, 0xbb2ee746, 0x52649a1f, + 0xe4e03976, 0x8fbceafa, 0x301e0c36, 0x249809ae, + 0xf940794b, 0x6359d185, 0x70361c7e, 0xf8633ee7, + 0x37f7c455, 0xeea3b53a, 0x29324d81, 0xc4f43152, + 0x9b3aef62, 0x66f697a3, 0x35b14a10, 0xf220b2ab, + 0x54ae15d0, 0xb7a7e4c5, 0xd5dd72ec, 0x5a619816, + 0xca3bbc94, 0xe785f09f, 0xddd870e5, 0x14860598, + 0xc6b2bf17, 0x410b57e4, 0x434dd9a1, 0x2ff8c24e, + 0xf1457b42, 0x15a54234, 0x94d62508, 0xf0663cee, + 0x22528661, 0x76fc93b1, 0xb32be54f, 0x20140824, + 0xb208a2e3, 0xbcc72f25, 0x4fc4da22, 0x68391a65, + 0x8335e979, 0xb684a369, 0xd79bfca9, 0x3db44819, + 0xc5d776fe, 0x313d4b9a, 0x3ed181f0, 0x88552299, + 0x0c890383, 0x4a6b9c04, 0xd1517366, 0x0b60cbe0, + 0xfdcc78c1, 0x7cbf1ffd, 0xd4fe3540, 0xeb0cf31c, + 0xa1676f18, 0x985f268b, 0x7d9c5851, 0xd6b8bb05, + 0x6b5cd38c, 0x57cbdc39, 0x6ef395aa, 0x180f061b, + 0x8a13acdc, 0x1a49885e, 0xdf9efea0, 0x21374f88, + 0x4d825467, 0xb16d6b0a, 0x46e29f87, 0xa202a6f1, + 0xae8ba572, 0x58271653, 0x9cd32701, 0x47c1d82b, + 0x95f562a4, 0x87b9e8f3, 0xe309f115, 0x0a438c4c, + 0x092645a5, 0x3c970fb5, 0xa04428b4, 0x5b42dfba, + 0xb04e2ca6, 0xcdd274f7, 0x6fd0d206, 0x482d1241, + 0xa7ade0d7, 0xd954716f, 0xceb7bd1e, 0x3b7ec7d6, + 0x2edb85e2, 0x2a578468, 0xb4c22d2c, 0x490e55ed, + 0x5d885075, 0xda31b886, 0x933fed6b, 0x44a411c2, + }, + { + 0x18c07830, 0x2305af46, 0xc67ef991, 0xe8136fcd, + 0x874ca113, 0xb8a9626d, 0x01080502, 0x4f426e9e, + 0x36adee6c, 0xa6590451, 0xd2debdb9, 0xf5fb06f7, + 0x79ef80f2, 0x6f5fcede, 0x91fcef3f, 0x52aa07a4, + 0x6027fdc0, 0xbc897665, 0x9baccd2b, 0x8e048c01, + 0xa371155b, 0x0c603c18, 0x7bff8af6, 0x35b5e16a, + 0x1de8693a, 0xe05347dd, 0xd7f6acb3, 0xc25eed99, + 0x2e6d965c, 0x4b627a96, 0xfea321e1, 0x578216ae, + 0x15a8412a, 0x779fb6ee, 0x37a5eb6e, 0xe57b56d7, + 0x9f8cd923, 0xf0d317fd, 0x4a6a7f94, 0xda9e95a9, + 0x58fa25b0, 0xc906ca8f, 0x29558d52, 0x0a502214, + 0xb1e14f7f, 0xa0691a5d, 0x6b7fdad6, 0x855cab17, + 0xbd817367, 0x5dd234ba, 0x10805020, 0xf4f303f5, + 0xcb16c08b, 0x3eedc67c, 0x0528110a, 0x671fe6ce, + 0xe47353d5, 0x2725bb4e, 0x41325882, 0x8b2c9d0b, + 0xa7510153, 0x7dcf94fa, 0x95dcfb37, 0xd88e9fad, + 0xfb8b30eb, 0xee2371c1, 0x7cc791f8, 0x6617e3cc, + 0xdda68ea7, 0x17b84b2e, 0x4702468e, 0x9e84dc21, + 0xca1ec589, 0x2d75995a, 0xbf917963, 0x07381b0e, + 0xad012347, 0x5aea2fb4, 0x836cb51b, 0x3385ff66, + 0x633ff2c6, 0x02100a04, 0xaa393849, 0x71afa8e2, + 0xc80ecf8d, 0x19c87d32, 0x49727092, 0xd9869aaf, + 0xf2c31df9, 0xe34b48db, 0x5be22ab6, 0x8834920d, + 0x9aa4c829, 0x262dbe4c, 0x328dfa64, 0xb0e94a7d, + 0xe91b6acf, 0x0f78331e, 0xd5e6a6b7, 0x8074ba1d, + 0xbe997c61, 0xcd26de87, 0x34bde468, 0x487a7590, + 0xffab24e3, 0x7af78ff4, 0x90f4ea3d, 0x5fc23ebe, + 0x201da040, 0x6867d5d0, 0x1ad07234, 0xae192c41, + 0xb4c95e75, 0x549a19a8, 0x93ece53b, 0x220daa44, + 0x6407e9c8, 0xf1db12ff, 0x73bfa2e6, 0x12905a24, + 0x403a5d80, 0x08402810, 0xc356e89b, 0xec337bc5, + 0xdb9690ab, 0xa1611f5f, 0x8d1c8307, 0x3df5c97a, + 0x97ccf133, 0x00000000, 0xcf36d483, 0x2b458756, + 0x7697b3ec, 0x8264b019, 0xd6fea9b1, 0x1bd87736, + 0xb5c15b77, 0xaf112943, 0x6a77dfd4, 0x50ba0da0, + 0x45124c8a, 0xf3cb18fb, 0x309df060, 0xef2b74c3, + 0x3fe5c37e, 0x55921caa, 0xa2791059, 0xea0365c9, + 0x650fecca, 0xbab96869, 0x2f65935e, 0xc04ee79d, + 0xdebe81a1, 0x1ce06c38, 0xfdbb2ee7, 0x4d52649a, + 0x92e4e039, 0x758fbcea, 0x06301e0c, 0x8a249809, + 0xb2f94079, 0xe66359d1, 0x0e70361c, 0x1ff8633e, + 0x6237f7c4, 0xd4eea3b5, 0xa829324d, 0x96c4f431, + 0xf99b3aef, 0xc566f697, 0x2535b14a, 0x59f220b2, + 0x8454ae15, 0x72b7a7e4, 0x39d5dd72, 0x4c5a6198, + 0x5eca3bbc, 0x78e785f0, 0x38ddd870, 0x8c148605, + 0xd1c6b2bf, 0xa5410b57, 0xe2434dd9, 0x612ff8c2, + 0xb3f1457b, 0x2115a542, 0x9c94d625, 0x1ef0663c, + 0x43225286, 0xc776fc93, 0xfcb32be5, 0x04201408, + 0x51b208a2, 0x99bcc72f, 0x6d4fc4da, 0x0d68391a, + 0xfa8335e9, 0xdfb684a3, 0x7ed79bfc, 0x243db448, + 0x3bc5d776, 0xab313d4b, 0xce3ed181, 0x11885522, + 0x8f0c8903, 0x4e4a6b9c, 0xb7d15173, 0xeb0b60cb, + 0x3cfdcc78, 0x817cbf1f, 0x94d4fe35, 0xf7eb0cf3, + 0xb9a1676f, 0x13985f26, 0x2c7d9c58, 0xd3d6b8bb, + 0xe76b5cd3, 0x6e57cbdc, 0xc46ef395, 0x03180f06, + 0x568a13ac, 0x441a4988, 0x7fdf9efe, 0xa921374f, + 0x2a4d8254, 0xbbb16d6b, 0xc146e29f, 0x53a202a6, + 0xdcae8ba5, 0x0b582716, 0x9d9cd327, 0x6c47c1d8, + 0x3195f562, 0x7487b9e8, 0xf6e309f1, 0x460a438c, + 0xac092645, 0x893c970f, 0x14a04428, 0xe15b42df, + 0x16b04e2c, 0x3acdd274, 0x696fd0d2, 0x09482d12, + 0x70a7ade0, 0xb6d95471, 0xd0ceb7bd, 0xed3b7ec7, + 0xcc2edb85, 0x422a5784, 0x98b4c22d, 0xa4490e55, + 0x285d8850, 0x5cda31b8, 0xf8933fed, 0x8644a411, + }, + { + 0x6018c078, 0x8c2305af, 0x3fc67ef9, 0x87e8136f, + 0x26874ca1, 0xdab8a962, 0x04010805, 0x214f426e, + 0xd836adee, 0xa2a65904, 0x6fd2debd, 0xf3f5fb06, + 0xf979ef80, 0xa16f5fce, 0x7e91fcef, 0x5552aa07, + 0x9d6027fd, 0xcabc8976, 0x569baccd, 0x028e048c, + 0xb6a37115, 0x300c603c, 0xf17bff8a, 0xd435b5e1, + 0x741de869, 0xa7e05347, 0x7bd7f6ac, 0x2fc25eed, + 0xb82e6d96, 0x314b627a, 0xdffea321, 0x41578216, + 0x5415a841, 0xc1779fb6, 0xdc37a5eb, 0xb3e57b56, + 0x469f8cd9, 0xe7f0d317, 0x354a6a7f, 0x4fda9e95, + 0x7d58fa25, 0x03c906ca, 0xa429558d, 0x280a5022, + 0xfeb1e14f, 0xbaa0691a, 0xb16b7fda, 0x2e855cab, + 0xcebd8173, 0x695dd234, 0x40108050, 0xf7f4f303, + 0x0bcb16c0, 0xf83eedc6, 0x14052811, 0x81671fe6, + 0xb7e47353, 0x9c2725bb, 0x19413258, 0x168b2c9d, + 0xa6a75101, 0xe97dcf94, 0x6e95dcfb, 0x47d88e9f, + 0xcbfb8b30, 0x9fee2371, 0xed7cc791, 0x856617e3, + 0x53dda68e, 0x5c17b84b, 0x01470246, 0x429e84dc, + 0x0fca1ec5, 0xb42d7599, 0xc6bf9179, 0x1c07381b, + 0x8ead0123, 0x755aea2f, 0x36836cb5, 0xcc3385ff, + 0x91633ff2, 0x0802100a, 0x92aa3938, 0xd971afa8, + 0x07c80ecf, 0x6419c87d, 0x39497270, 0x43d9869a, + 0xeff2c31d, 0xabe34b48, 0x715be22a, 0x1a883492, + 0x529aa4c8, 0x98262dbe, 0xc8328dfa, 0xfab0e94a, + 0x83e91b6a, 0x3c0f7833, 0x73d5e6a6, 0x3a8074ba, + 0xc2be997c, 0x13cd26de, 0xd034bde4, 0x3d487a75, + 0xdbffab24, 0xf57af78f, 0x7a90f4ea, 0x615fc23e, + 0x80201da0, 0xbd6867d5, 0x681ad072, 0x82ae192c, + 0xeab4c95e, 0x4d549a19, 0x7693ece5, 0x88220daa, + 0x8d6407e9, 0xe3f1db12, 0xd173bfa2, 0x4812905a, + 0x1d403a5d, 0x20084028, 0x2bc356e8, 0x97ec337b, + 0x4bdb9690, 0xbea1611f, 0x0e8d1c83, 0xf43df5c9, + 0x6697ccf1, 0x00000000, 0x1bcf36d4, 0xac2b4587, + 0xc57697b3, 0x328264b0, 0x7fd6fea9, 0x6c1bd877, + 0xeeb5c15b, 0x86af1129, 0xb56a77df, 0x5d50ba0d, + 0x0945124c, 0xebf3cb18, 0xc0309df0, 0x9bef2b74, + 0xfc3fe5c3, 0x4955921c, 0xb2a27910, 0x8fea0365, + 0x89650fec, 0xd2bab968, 0xbc2f6593, 0x27c04ee7, + 0x5fdebe81, 0x701ce06c, 0xd3fdbb2e, 0x294d5264, + 0x7292e4e0, 0xc9758fbc, 0x1806301e, 0x128a2498, + 0xf2b2f940, 0xbfe66359, 0x380e7036, 0x7c1ff863, + 0x956237f7, 0x77d4eea3, 0x9aa82932, 0x6296c4f4, + 0xc3f99b3a, 0x33c566f6, 0x942535b1, 0x7959f220, + 0x2a8454ae, 0xd572b7a7, 0xe439d5dd, 0x2d4c5a61, + 0x655eca3b, 0xfd78e785, 0xe038ddd8, 0x0a8c1486, + 0x63d1c6b2, 0xaea5410b, 0xafe2434d, 0x99612ff8, + 0xf6b3f145, 0x842115a5, 0x4a9c94d6, 0x781ef066, + 0x11432252, 0x3bc776fc, 0xd7fcb32b, 0x10042014, + 0x5951b208, 0x5e99bcc7, 0xa96d4fc4, 0x340d6839, + 0xcffa8335, 0x5bdfb684, 0xe57ed79b, 0x90243db4, + 0xec3bc5d7, 0x96ab313d, 0x1fce3ed1, 0x44118855, + 0x068f0c89, 0x254e4a6b, 0xe6b7d151, 0x8beb0b60, + 0xf03cfdcc, 0x3e817cbf, 0x6a94d4fe, 0xfbf7eb0c, + 0xdeb9a167, 0x4c13985f, 0xb02c7d9c, 0x6bd3d6b8, + 0xbbe76b5c, 0xa56e57cb, 0x37c46ef3, 0x0c03180f, + 0x45568a13, 0x0d441a49, 0xe17fdf9e, 0x9ea92137, + 0xa82a4d82, 0xd6bbb16d, 0x23c146e2, 0x5153a202, + 0x57dcae8b, 0x2c0b5827, 0x4e9d9cd3, 0xad6c47c1, + 0xc43195f5, 0xcd7487b9, 0xfff6e309, 0x05460a43, + 0x8aac0926, 0x1e893c97, 0x5014a044, 0xa3e15b42, + 0x5816b04e, 0xe83acdd2, 0xb9696fd0, 0x2409482d, + 0xdd70a7ad, 0xe2b6d954, 0x67d0ceb7, 0x93ed3b7e, + 0x17cc2edb, 0x15422a57, 0x5a98b4c2, 0xaaa4490e, + 0xa0285d88, 0x6d5cda31, 0xc7f8933f, 0x228644a4, + }, + { + 0x186018c0, 0x238c2305, 0xc63fc67e, 0xe887e813, + 0x8726874c, 0xb8dab8a9, 0x01040108, 0x4f214f42, + 0x36d836ad, 0xa6a2a659, 0xd26fd2de, 0xf5f3f5fb, + 0x79f979ef, 0x6fa16f5f, 0x917e91fc, 0x525552aa, + 0x609d6027, 0xbccabc89, 0x9b569bac, 0x8e028e04, + 0xa3b6a371, 0x0c300c60, 0x7bf17bff, 0x35d435b5, + 0x1d741de8, 0xe0a7e053, 0xd77bd7f6, 0xc22fc25e, + 0x2eb82e6d, 0x4b314b62, 0xfedffea3, 0x57415782, + 0x155415a8, 0x77c1779f, 0x37dc37a5, 0xe5b3e57b, + 0x9f469f8c, 0xf0e7f0d3, 0x4a354a6a, 0xda4fda9e, + 0x587d58fa, 0xc903c906, 0x29a42955, 0x0a280a50, + 0xb1feb1e1, 0xa0baa069, 0x6bb16b7f, 0x852e855c, + 0xbdcebd81, 0x5d695dd2, 0x10401080, 0xf4f7f4f3, + 0xcb0bcb16, 0x3ef83eed, 0x05140528, 0x6781671f, + 0xe4b7e473, 0x279c2725, 0x41194132, 0x8b168b2c, + 0xa7a6a751, 0x7de97dcf, 0x956e95dc, 0xd847d88e, + 0xfbcbfb8b, 0xee9fee23, 0x7ced7cc7, 0x66856617, + 0xdd53dda6, 0x175c17b8, 0x47014702, 0x9e429e84, + 0xca0fca1e, 0x2db42d75, 0xbfc6bf91, 0x071c0738, + 0xad8ead01, 0x5a755aea, 0x8336836c, 0x33cc3385, + 0x6391633f, 0x02080210, 0xaa92aa39, 0x71d971af, + 0xc807c80e, 0x196419c8, 0x49394972, 0xd943d986, + 0xf2eff2c3, 0xe3abe34b, 0x5b715be2, 0x881a8834, + 0x9a529aa4, 0x2698262d, 0x32c8328d, 0xb0fab0e9, + 0xe983e91b, 0x0f3c0f78, 0xd573d5e6, 0x803a8074, + 0xbec2be99, 0xcd13cd26, 0x34d034bd, 0x483d487a, + 0xffdbffab, 0x7af57af7, 0x907a90f4, 0x5f615fc2, + 0x2080201d, 0x68bd6867, 0x1a681ad0, 0xae82ae19, + 0xb4eab4c9, 0x544d549a, 0x937693ec, 0x2288220d, + 0x648d6407, 0xf1e3f1db, 0x73d173bf, 0x12481290, + 0x401d403a, 0x08200840, 0xc32bc356, 0xec97ec33, + 0xdb4bdb96, 0xa1bea161, 0x8d0e8d1c, 0x3df43df5, + 0x976697cc, 0x00000000, 0xcf1bcf36, 0x2bac2b45, + 0x76c57697, 0x82328264, 0xd67fd6fe, 0x1b6c1bd8, + 0xb5eeb5c1, 0xaf86af11, 0x6ab56a77, 0x505d50ba, + 0x45094512, 0xf3ebf3cb, 0x30c0309d, 0xef9bef2b, + 0x3ffc3fe5, 0x55495592, 0xa2b2a279, 0xea8fea03, + 0x6589650f, 0xbad2bab9, 0x2fbc2f65, 0xc027c04e, + 0xde5fdebe, 0x1c701ce0, 0xfdd3fdbb, 0x4d294d52, + 0x927292e4, 0x75c9758f, 0x06180630, 0x8a128a24, + 0xb2f2b2f9, 0xe6bfe663, 0x0e380e70, 0x1f7c1ff8, + 0x62956237, 0xd477d4ee, 0xa89aa829, 0x966296c4, + 0xf9c3f99b, 0xc533c566, 0x25942535, 0x597959f2, + 0x842a8454, 0x72d572b7, 0x39e439d5, 0x4c2d4c5a, + 0x5e655eca, 0x78fd78e7, 0x38e038dd, 0x8c0a8c14, + 0xd163d1c6, 0xa5aea541, 0xe2afe243, 0x6199612f, + 0xb3f6b3f1, 0x21842115, 0x9c4a9c94, 0x1e781ef0, + 0x43114322, 0xc73bc776, 0xfcd7fcb3, 0x04100420, + 0x515951b2, 0x995e99bc, 0x6da96d4f, 0x0d340d68, + 0xfacffa83, 0xdf5bdfb6, 0x7ee57ed7, 0x2490243d, + 0x3bec3bc5, 0xab96ab31, 0xce1fce3e, 0x11441188, + 0x8f068f0c, 0x4e254e4a, 0xb7e6b7d1, 0xeb8beb0b, + 0x3cf03cfd, 0x813e817c, 0x946a94d4, 0xf7fbf7eb, + 0xb9deb9a1, 0x134c1398, 0x2cb02c7d, 0xd36bd3d6, + 0xe7bbe76b, 0x6ea56e57, 0xc437c46e, 0x030c0318, + 0x5645568a, 0x440d441a, 0x7fe17fdf, 0xa99ea921, + 0x2aa82a4d, 0xbbd6bbb1, 0xc123c146, 0x535153a2, + 0xdc57dcae, 0x0b2c0b58, 0x9d4e9d9c, 0x6cad6c47, + 0x31c43195, 0x74cd7487, 0xf6fff6e3, 0x4605460a, + 0xac8aac09, 0x891e893c, 0x145014a0, 0xe1a3e15b, + 0x165816b0, 0x3ae83acd, 0x69b9696f, 0x09240948, + 0x70dd70a7, 0xb6e2b6d9, 0xd067d0ce, 0xed93ed3b, + 0xcc17cc2e, 0x4215422a, 0x985a98b4, 0xa4aaa449, + 0x28a0285d, 0x5c6d5cda, 0xf8c7f893, 0x86228644, + }, + { + 0x18186018, 0x23238c23, 0xc6c63fc6, 0xe8e887e8, + 0x87872687, 0xb8b8dab8, 0x01010401, 0x4f4f214f, + 0x3636d836, 0xa6a6a2a6, 0xd2d26fd2, 0xf5f5f3f5, + 0x7979f979, 0x6f6fa16f, 0x91917e91, 0x52525552, + 0x60609d60, 0xbcbccabc, 0x9b9b569b, 0x8e8e028e, + 0xa3a3b6a3, 0x0c0c300c, 0x7b7bf17b, 0x3535d435, + 0x1d1d741d, 0xe0e0a7e0, 0xd7d77bd7, 0xc2c22fc2, + 0x2e2eb82e, 0x4b4b314b, 0xfefedffe, 0x57574157, + 0x15155415, 0x7777c177, 0x3737dc37, 0xe5e5b3e5, + 0x9f9f469f, 0xf0f0e7f0, 0x4a4a354a, 0xdada4fda, + 0x58587d58, 0xc9c903c9, 0x2929a429, 0x0a0a280a, + 0xb1b1feb1, 0xa0a0baa0, 0x6b6bb16b, 0x85852e85, + 0xbdbdcebd, 0x5d5d695d, 0x10104010, 0xf4f4f7f4, + 0xcbcb0bcb, 0x3e3ef83e, 0x05051405, 0x67678167, + 0xe4e4b7e4, 0x27279c27, 0x41411941, 0x8b8b168b, + 0xa7a7a6a7, 0x7d7de97d, 0x95956e95, 0xd8d847d8, + 0xfbfbcbfb, 0xeeee9fee, 0x7c7ced7c, 0x66668566, + 0xdddd53dd, 0x17175c17, 0x47470147, 0x9e9e429e, + 0xcaca0fca, 0x2d2db42d, 0xbfbfc6bf, 0x07071c07, + 0xadad8ead, 0x5a5a755a, 0x83833683, 0x3333cc33, + 0x63639163, 0x02020802, 0xaaaa92aa, 0x7171d971, + 0xc8c807c8, 0x19196419, 0x49493949, 0xd9d943d9, + 0xf2f2eff2, 0xe3e3abe3, 0x5b5b715b, 0x88881a88, + 0x9a9a529a, 0x26269826, 0x3232c832, 0xb0b0fab0, + 0xe9e983e9, 0x0f0f3c0f, 0xd5d573d5, 0x80803a80, + 0xbebec2be, 0xcdcd13cd, 0x3434d034, 0x48483d48, + 0xffffdbff, 0x7a7af57a, 0x90907a90, 0x5f5f615f, + 0x20208020, 0x6868bd68, 0x1a1a681a, 0xaeae82ae, + 0xb4b4eab4, 0x54544d54, 0x93937693, 0x22228822, + 0x64648d64, 0xf1f1e3f1, 0x7373d173, 0x12124812, + 0x40401d40, 0x08082008, 0xc3c32bc3, 0xecec97ec, + 0xdbdb4bdb, 0xa1a1bea1, 0x8d8d0e8d, 0x3d3df43d, + 0x97976697, 0x00000000, 0xcfcf1bcf, 0x2b2bac2b, + 0x7676c576, 0x82823282, 0xd6d67fd6, 0x1b1b6c1b, + 0xb5b5eeb5, 0xafaf86af, 0x6a6ab56a, 0x50505d50, + 0x45450945, 0xf3f3ebf3, 0x3030c030, 0xefef9bef, + 0x3f3ffc3f, 0x55554955, 0xa2a2b2a2, 0xeaea8fea, + 0x65658965, 0xbabad2ba, 0x2f2fbc2f, 0xc0c027c0, + 0xdede5fde, 0x1c1c701c, 0xfdfdd3fd, 0x4d4d294d, + 0x92927292, 0x7575c975, 0x06061806, 0x8a8a128a, + 0xb2b2f2b2, 0xe6e6bfe6, 0x0e0e380e, 0x1f1f7c1f, + 0x62629562, 0xd4d477d4, 0xa8a89aa8, 0x96966296, + 0xf9f9c3f9, 0xc5c533c5, 0x25259425, 0x59597959, + 0x84842a84, 0x7272d572, 0x3939e439, 0x4c4c2d4c, + 0x5e5e655e, 0x7878fd78, 0x3838e038, 0x8c8c0a8c, + 0xd1d163d1, 0xa5a5aea5, 0xe2e2afe2, 0x61619961, + 0xb3b3f6b3, 0x21218421, 0x9c9c4a9c, 0x1e1e781e, + 0x43431143, 0xc7c73bc7, 0xfcfcd7fc, 0x04041004, + 0x51515951, 0x99995e99, 0x6d6da96d, 0x0d0d340d, + 0xfafacffa, 0xdfdf5bdf, 0x7e7ee57e, 0x24249024, + 0x3b3bec3b, 0xabab96ab, 0xcece1fce, 0x11114411, + 0x8f8f068f, 0x4e4e254e, 0xb7b7e6b7, 0xebeb8beb, + 0x3c3cf03c, 0x81813e81, 0x94946a94, 0xf7f7fbf7, + 0xb9b9deb9, 0x13134c13, 0x2c2cb02c, 0xd3d36bd3, + 0xe7e7bbe7, 0x6e6ea56e, 0xc4c437c4, 0x03030c03, + 0x56564556, 0x44440d44, 0x7f7fe17f, 0xa9a99ea9, + 0x2a2aa82a, 0xbbbbd6bb, 0xc1c123c1, 0x53535153, + 0xdcdc57dc, 0x0b0b2c0b, 0x9d9d4e9d, 0x6c6cad6c, + 0x3131c431, 0x7474cd74, 0xf6f6fff6, 0x46460546, + 0xacac8aac, 0x89891e89, 0x14145014, 0xe1e1a3e1, + 0x16165816, 0x3a3ae83a, 0x6969b969, 0x09092409, + 0x7070dd70, 0xb6b6e2b6, 0xd0d067d0, 0xeded93ed, + 0xcccc17cc, 0x42421542, 0x98985a98, 0xa4a4aaa4, + 0x2828a028, 0x5c5c6d5c, 0xf8f8c7f8, 0x86862286, + }, + { + 0xd8181860, 0x2623238c, 0xb8c6c63f, 0xfbe8e887, + 0xcb878726, 0x11b8b8da, 0x09010104, 0x0d4f4f21, + 0x9b3636d8, 0xffa6a6a2, 0x0cd2d26f, 0x0ef5f5f3, + 0x967979f9, 0x306f6fa1, 0x6d91917e, 0xf8525255, + 0x4760609d, 0x35bcbcca, 0x379b9b56, 0x8a8e8e02, + 0xd2a3a3b6, 0x6c0c0c30, 0x847b7bf1, 0x803535d4, + 0xf51d1d74, 0xb3e0e0a7, 0x21d7d77b, 0x9cc2c22f, + 0x432e2eb8, 0x294b4b31, 0x5dfefedf, 0xd5575741, + 0xbd151554, 0xe87777c1, 0x923737dc, 0x9ee5e5b3, + 0x139f9f46, 0x23f0f0e7, 0x204a4a35, 0x44dada4f, + 0xa258587d, 0xcfc9c903, 0x7c2929a4, 0x5a0a0a28, + 0x50b1b1fe, 0xc9a0a0ba, 0x146b6bb1, 0xd985852e, + 0x3cbdbdce, 0x8f5d5d69, 0x90101040, 0x07f4f4f7, + 0xddcbcb0b, 0xd33e3ef8, 0x2d050514, 0x78676781, + 0x97e4e4b7, 0x0227279c, 0x73414119, 0xa78b8b16, + 0xf6a7a7a6, 0xb27d7de9, 0x4995956e, 0x56d8d847, + 0x70fbfbcb, 0xcdeeee9f, 0xbb7c7ced, 0x71666685, + 0x7bdddd53, 0xaf17175c, 0x45474701, 0x1a9e9e42, + 0xd4caca0f, 0x582d2db4, 0x2ebfbfc6, 0x3f07071c, + 0xacadad8e, 0xb05a5a75, 0xef838336, 0xb63333cc, + 0x5c636391, 0x12020208, 0x93aaaa92, 0xde7171d9, + 0xc6c8c807, 0xd1191964, 0x3b494939, 0x5fd9d943, + 0x31f2f2ef, 0xa8e3e3ab, 0xb95b5b71, 0xbc88881a, + 0x3e9a9a52, 0x0b262698, 0xbf3232c8, 0x59b0b0fa, + 0xf2e9e983, 0x770f0f3c, 0x33d5d573, 0xf480803a, + 0x27bebec2, 0xebcdcd13, 0x893434d0, 0x3248483d, + 0x54ffffdb, 0x8d7a7af5, 0x6490907a, 0x9d5f5f61, + 0x3d202080, 0x0f6868bd, 0xca1a1a68, 0xb7aeae82, + 0x7db4b4ea, 0xce54544d, 0x7f939376, 0x2f222288, + 0x6364648d, 0x2af1f1e3, 0xcc7373d1, 0x82121248, + 0x7a40401d, 0x48080820, 0x95c3c32b, 0xdfecec97, + 0x4ddbdb4b, 0xc0a1a1be, 0x918d8d0e, 0xc83d3df4, + 0x5b979766, 0x00000000, 0xf9cfcf1b, 0x6e2b2bac, + 0xe17676c5, 0xe6828232, 0x28d6d67f, 0xc31b1b6c, + 0x74b5b5ee, 0xbeafaf86, 0x1d6a6ab5, 0xea50505d, + 0x57454509, 0x38f3f3eb, 0xad3030c0, 0xc4efef9b, + 0xda3f3ffc, 0xc7555549, 0xdba2a2b2, 0xe9eaea8f, + 0x6a656589, 0x03babad2, 0x4a2f2fbc, 0x8ec0c027, + 0x60dede5f, 0xfc1c1c70, 0x46fdfdd3, 0x1f4d4d29, + 0x76929272, 0xfa7575c9, 0x36060618, 0xae8a8a12, + 0x4bb2b2f2, 0x85e6e6bf, 0x7e0e0e38, 0xe71f1f7c, + 0x55626295, 0x3ad4d477, 0x81a8a89a, 0x52969662, + 0x62f9f9c3, 0xa3c5c533, 0x10252594, 0xab595979, + 0xd084842a, 0xc57272d5, 0xec3939e4, 0x164c4c2d, + 0x945e5e65, 0x9f7878fd, 0xe53838e0, 0x988c8c0a, + 0x17d1d163, 0xe4a5a5ae, 0xa1e2e2af, 0x4e616199, + 0x42b3b3f6, 0x34212184, 0x089c9c4a, 0xee1e1e78, + 0x61434311, 0xb1c7c73b, 0x4ffcfcd7, 0x24040410, + 0xe3515159, 0x2599995e, 0x226d6da9, 0x650d0d34, + 0x79fafacf, 0x69dfdf5b, 0xa97e7ee5, 0x19242490, + 0xfe3b3bec, 0x9aabab96, 0xf0cece1f, 0x99111144, + 0x838f8f06, 0x044e4e25, 0x66b7b7e6, 0xe0ebeb8b, + 0xc13c3cf0, 0xfd81813e, 0x4094946a, 0x1cf7f7fb, + 0x18b9b9de, 0x8b13134c, 0x512c2cb0, 0x05d3d36b, + 0x8ce7e7bb, 0x396e6ea5, 0xaac4c437, 0x1b03030c, + 0xdc565645, 0x5e44440d, 0xa07f7fe1, 0x88a9a99e, + 0x672a2aa8, 0x0abbbbd6, 0x87c1c123, 0xf1535351, + 0x72dcdc57, 0x530b0b2c, 0x019d9d4e, 0x2b6c6cad, + 0xa43131c4, 0xf37474cd, 0x15f6f6ff, 0x4c464605, + 0xa5acac8a, 0xb589891e, 0xb4141450, 0xbae1e1a3, + 0xa6161658, 0xf73a3ae8, 0x066969b9, 0x41090924, + 0xd77070dd, 0x6fb6b6e2, 0x1ed0d067, 0xd6eded93, + 0xe2cccc17, 0x68424215, 0x2c98985a, 0xeda4a4aa, + 0x752828a0, 0x865c5c6d, 0x6bf8f8c7, 0xc2868622, + }, + { + 0x30d81818, 0x46262323, 0x91b8c6c6, 0xcdfbe8e8, + 0x13cb8787, 0x6d11b8b8, 0x02090101, 0x9e0d4f4f, + 0x6c9b3636, 0x51ffa6a6, 0xb90cd2d2, 0xf70ef5f5, + 0xf2967979, 0xde306f6f, 0x3f6d9191, 0xa4f85252, + 0xc0476060, 0x6535bcbc, 0x2b379b9b, 0x018a8e8e, + 0x5bd2a3a3, 0x186c0c0c, 0xf6847b7b, 0x6a803535, + 0x3af51d1d, 0xddb3e0e0, 0xb321d7d7, 0x999cc2c2, + 0x5c432e2e, 0x96294b4b, 0xe15dfefe, 0xaed55757, + 0x2abd1515, 0xeee87777, 0x6e923737, 0xd79ee5e5, + 0x23139f9f, 0xfd23f0f0, 0x94204a4a, 0xa944dada, + 0xb0a25858, 0x8fcfc9c9, 0x527c2929, 0x145a0a0a, + 0x7f50b1b1, 0x5dc9a0a0, 0xd6146b6b, 0x17d98585, + 0x673cbdbd, 0xba8f5d5d, 0x20901010, 0xf507f4f4, + 0x8bddcbcb, 0x7cd33e3e, 0x0a2d0505, 0xce786767, + 0xd597e4e4, 0x4e022727, 0x82734141, 0x0ba78b8b, + 0x53f6a7a7, 0xfab27d7d, 0x37499595, 0xad56d8d8, + 0xeb70fbfb, 0xc1cdeeee, 0xf8bb7c7c, 0xcc716666, + 0xa77bdddd, 0x2eaf1717, 0x8e454747, 0x211a9e9e, + 0x89d4caca, 0x5a582d2d, 0x632ebfbf, 0x0e3f0707, + 0x47acadad, 0xb4b05a5a, 0x1bef8383, 0x66b63333, + 0xc65c6363, 0x04120202, 0x4993aaaa, 0xe2de7171, + 0x8dc6c8c8, 0x32d11919, 0x923b4949, 0xaf5fd9d9, + 0xf931f2f2, 0xdba8e3e3, 0xb6b95b5b, 0x0dbc8888, + 0x293e9a9a, 0x4c0b2626, 0x64bf3232, 0x7d59b0b0, + 0xcff2e9e9, 0x1e770f0f, 0xb733d5d5, 0x1df48080, + 0x6127bebe, 0x87ebcdcd, 0x68893434, 0x90324848, + 0xe354ffff, 0xf48d7a7a, 0x3d649090, 0xbe9d5f5f, + 0x403d2020, 0xd00f6868, 0x34ca1a1a, 0x41b7aeae, + 0x757db4b4, 0xa8ce5454, 0x3b7f9393, 0x442f2222, + 0xc8636464, 0xff2af1f1, 0xe6cc7373, 0x24821212, + 0x807a4040, 0x10480808, 0x9b95c3c3, 0xc5dfecec, + 0xab4ddbdb, 0x5fc0a1a1, 0x07918d8d, 0x7ac83d3d, + 0x335b9797, 0x00000000, 0x83f9cfcf, 0x566e2b2b, + 0xece17676, 0x19e68282, 0xb128d6d6, 0x36c31b1b, + 0x7774b5b5, 0x43beafaf, 0xd41d6a6a, 0xa0ea5050, + 0x8a574545, 0xfb38f3f3, 0x60ad3030, 0xc3c4efef, + 0x7eda3f3f, 0xaac75555, 0x59dba2a2, 0xc9e9eaea, + 0xca6a6565, 0x6903baba, 0x5e4a2f2f, 0x9d8ec0c0, + 0xa160dede, 0x38fc1c1c, 0xe746fdfd, 0x9a1f4d4d, + 0x39769292, 0xeafa7575, 0x0c360606, 0x09ae8a8a, + 0x794bb2b2, 0xd185e6e6, 0x1c7e0e0e, 0x3ee71f1f, + 0xc4556262, 0xb53ad4d4, 0x4d81a8a8, 0x31529696, + 0xef62f9f9, 0x97a3c5c5, 0x4a102525, 0xb2ab5959, + 0x15d08484, 0xe4c57272, 0x72ec3939, 0x98164c4c, + 0xbc945e5e, 0xf09f7878, 0x70e53838, 0x05988c8c, + 0xbf17d1d1, 0x57e4a5a5, 0xd9a1e2e2, 0xc24e6161, + 0x7b42b3b3, 0x42342121, 0x25089c9c, 0x3cee1e1e, + 0x86614343, 0x93b1c7c7, 0xe54ffcfc, 0x08240404, + 0xa2e35151, 0x2f259999, 0xda226d6d, 0x1a650d0d, + 0xe979fafa, 0xa369dfdf, 0xfca97e7e, 0x48192424, + 0x76fe3b3b, 0x4b9aabab, 0x81f0cece, 0x22991111, + 0x03838f8f, 0x9c044e4e, 0x7366b7b7, 0xcbe0ebeb, + 0x78c13c3c, 0x1ffd8181, 0x35409494, 0xf31cf7f7, + 0x6f18b9b9, 0x268b1313, 0x58512c2c, 0xbb05d3d3, + 0xd38ce7e7, 0xdc396e6e, 0x95aac4c4, 0x061b0303, + 0xacdc5656, 0x885e4444, 0xfea07f7f, 0x4f88a9a9, + 0x54672a2a, 0x6b0abbbb, 0x9f87c1c1, 0xa6f15353, + 0xa572dcdc, 0x16530b0b, 0x27019d9d, 0xd82b6c6c, + 0x62a43131, 0xe8f37474, 0xf115f6f6, 0x8c4c4646, + 0x45a5acac, 0x0fb58989, 0x28b41414, 0xdfbae1e1, + 0x2ca61616, 0x74f73a3a, 0xd2066969, 0x12410909, + 0xe0d77070, 0x716fb6b6, 0xbd1ed0d0, 0xc7d6eded, + 0x85e2cccc, 0x84684242, 0x2d2c9898, 0x55eda4a4, + 0x50752828, 0xb8865c5c, 0xed6bf8f8, 0x11c28686, + }, + { + 0x7830d818, 0xaf462623, 0xf991b8c6, 0x6fcdfbe8, + 0xa113cb87, 0x626d11b8, 0x05020901, 0x6e9e0d4f, + 0xee6c9b36, 0x0451ffa6, 0xbdb90cd2, 0x06f70ef5, + 0x80f29679, 0xcede306f, 0xef3f6d91, 0x07a4f852, + 0xfdc04760, 0x766535bc, 0xcd2b379b, 0x8c018a8e, + 0x155bd2a3, 0x3c186c0c, 0x8af6847b, 0xe16a8035, + 0x693af51d, 0x47ddb3e0, 0xacb321d7, 0xed999cc2, + 0x965c432e, 0x7a96294b, 0x21e15dfe, 0x16aed557, + 0x412abd15, 0xb6eee877, 0xeb6e9237, 0x56d79ee5, + 0xd923139f, 0x17fd23f0, 0x7f94204a, 0x95a944da, + 0x25b0a258, 0xca8fcfc9, 0x8d527c29, 0x22145a0a, + 0x4f7f50b1, 0x1a5dc9a0, 0xdad6146b, 0xab17d985, + 0x73673cbd, 0x34ba8f5d, 0x50209010, 0x03f507f4, + 0xc08bddcb, 0xc67cd33e, 0x110a2d05, 0xe6ce7867, + 0x53d597e4, 0xbb4e0227, 0x58827341, 0x9d0ba78b, + 0x0153f6a7, 0x94fab27d, 0xfb374995, 0x9fad56d8, + 0x30eb70fb, 0x71c1cdee, 0x91f8bb7c, 0xe3cc7166, + 0x8ea77bdd, 0x4b2eaf17, 0x468e4547, 0xdc211a9e, + 0xc589d4ca, 0x995a582d, 0x79632ebf, 0x1b0e3f07, + 0x2347acad, 0x2fb4b05a, 0xb51bef83, 0xff66b633, + 0xf2c65c63, 0x0a041202, 0x384993aa, 0xa8e2de71, + 0xcf8dc6c8, 0x7d32d119, 0x70923b49, 0x9aaf5fd9, + 0x1df931f2, 0x48dba8e3, 0x2ab6b95b, 0x920dbc88, + 0xc8293e9a, 0xbe4c0b26, 0xfa64bf32, 0x4a7d59b0, + 0x6acff2e9, 0x331e770f, 0xa6b733d5, 0xba1df480, + 0x7c6127be, 0xde87ebcd, 0xe4688934, 0x75903248, + 0x24e354ff, 0x8ff48d7a, 0xea3d6490, 0x3ebe9d5f, + 0xa0403d20, 0xd5d00f68, 0x7234ca1a, 0x2c41b7ae, + 0x5e757db4, 0x19a8ce54, 0xe53b7f93, 0xaa442f22, + 0xe9c86364, 0x12ff2af1, 0xa2e6cc73, 0x5a248212, + 0x5d807a40, 0x28104808, 0xe89b95c3, 0x7bc5dfec, + 0x90ab4ddb, 0x1f5fc0a1, 0x8307918d, 0xc97ac83d, + 0xf1335b97, 0x00000000, 0xd483f9cf, 0x87566e2b, + 0xb3ece176, 0xb019e682, 0xa9b128d6, 0x7736c31b, + 0x5b7774b5, 0x2943beaf, 0xdfd41d6a, 0x0da0ea50, + 0x4c8a5745, 0x18fb38f3, 0xf060ad30, 0x74c3c4ef, + 0xc37eda3f, 0x1caac755, 0x1059dba2, 0x65c9e9ea, + 0xecca6a65, 0x686903ba, 0x935e4a2f, 0xe79d8ec0, + 0x81a160de, 0x6c38fc1c, 0x2ee746fd, 0x649a1f4d, + 0xe0397692, 0xbceafa75, 0x1e0c3606, 0x9809ae8a, + 0x40794bb2, 0x59d185e6, 0x361c7e0e, 0x633ee71f, + 0xf7c45562, 0xa3b53ad4, 0x324d81a8, 0xf4315296, + 0x3aef62f9, 0xf697a3c5, 0xb14a1025, 0x20b2ab59, + 0xae15d084, 0xa7e4c572, 0xdd72ec39, 0x6198164c, + 0x3bbc945e, 0x85f09f78, 0xd870e538, 0x8605988c, + 0xb2bf17d1, 0x0b57e4a5, 0x4dd9a1e2, 0xf8c24e61, + 0x457b42b3, 0xa5423421, 0xd625089c, 0x663cee1e, + 0x52866143, 0xfc93b1c7, 0x2be54ffc, 0x14082404, + 0x08a2e351, 0xc72f2599, 0xc4da226d, 0x391a650d, + 0x35e979fa, 0x84a369df, 0x9bfca97e, 0xb4481924, + 0xd776fe3b, 0x3d4b9aab, 0xd181f0ce, 0x55229911, + 0x8903838f, 0x6b9c044e, 0x517366b7, 0x60cbe0eb, + 0xcc78c13c, 0xbf1ffd81, 0xfe354094, 0x0cf31cf7, + 0x676f18b9, 0x5f268b13, 0x9c58512c, 0xb8bb05d3, + 0x5cd38ce7, 0xcbdc396e, 0xf395aac4, 0x0f061b03, + 0x13acdc56, 0x49885e44, 0x9efea07f, 0x374f88a9, + 0x8254672a, 0x6d6b0abb, 0xe29f87c1, 0x02a6f153, + 0x8ba572dc, 0x2716530b, 0xd327019d, 0xc1d82b6c, + 0xf562a431, 0xb9e8f374, 0x09f115f6, 0x438c4c46, + 0x2645a5ac, 0x970fb589, 0x4428b414, 0x42dfbae1, + 0x4e2ca616, 0xd274f73a, 0xd0d20669, 0x2d124109, + 0xade0d770, 0x54716fb6, 0xb7bd1ed0, 0x7ec7d6ed, + 0xdb85e2cc, 0x57846842, 0xc22d2c98, 0x0e55eda4, + 0x88507528, 0x31b8865c, 0x3fed6bf8, 0xa411c286, + }, +}; + +__constant u32 rch[R + 1] = +{ + 0x00000000, + 0x1823c6e8, + 0x36a6d2f5, + 0x60bc9b8e, + 0x1de0d7c2, + 0x157737e5, + 0x58c9290a, + 0xbd5d10f4, + 0xe427418b, + 0xfbee7c66, + 0xca2dbf07, +}; + +__constant u32 rcl[R + 1] = +{ + 0x00000000, + 0x87b8014f, + 0x796f9152, + 0xa30c7b35, + 0x2e4bfe57, + 0x9ff04ada, + 0xb1a06b85, + 0xcb3e0567, + 0xa77d95d8, + 0xdd17479e, + 0xad5a8333, +}; + +// this is a highly optimized that assumes dgst[16] = { 0 }; only reuse of no 2nd transform is needed + +static void whirlpool_transform (const u32x w[16], u32x dgst[16], __local u32 s_Ch[8][256], __local u32 s_Cl[8][256]) +{ + u32x Kh[8]; + u32x Kl[8]; + + Kh[0] = 0x300beec0; + Kl[0] = 0xaf902967; + Kh[1] = 0x28282828; + Kl[1] = 0x28282828; + Kh[2] = 0x28282828; + Kl[2] = 0x28282828; + Kh[3] = 0x28282828; + Kl[3] = 0x28282828; + Kh[4] = 0x28282828; + Kl[4] = 0x28282828; + Kh[5] = 0x28282828; + Kl[5] = 0x28282828; + Kh[6] = 0x28282828; + Kl[6] = 0x28282828; + Kh[7] = 0x28282828; + Kl[7] = 0x28282828; + + u32x stateh[8]; + u32x statel[8]; + + stateh[0] = w[ 0]; + statel[0] = w[ 1]; + stateh[1] = w[ 2]; + statel[1] = w[ 3]; + stateh[2] = w[ 4]; + statel[2] = w[ 5]; + stateh[3] = w[ 6]; + statel[3] = w[ 7]; + stateh[4] = w[ 8]; + statel[4] = w[ 9]; + stateh[5] = w[10]; + statel[5] = w[11]; + stateh[6] = w[12]; + statel[6] = w[13]; + stateh[7] = w[14]; + statel[7] = w[15]; + + u32x Lh[8]; + u32x Ll[8]; + + #pragma unroll + for (int i = 0; i < 8; i++) + { + const u32x Lp0 = stateh[(i + 8) & 7] >> 24; + const u32x Lp1 = stateh[(i + 7) & 7] >> 16; + const u32x Lp2 = stateh[(i + 6) & 7] >> 8; + const u32x Lp3 = stateh[(i + 5) & 7] >> 0; + const u32x Lp4 = statel[(i + 4) & 7] >> 24; + const u32x Lp5 = statel[(i + 3) & 7] >> 16; + const u32x Lp6 = statel[(i + 2) & 7] >> 8; + const u32x Lp7 = statel[(i + 1) & 7] >> 0; + + Lh[i] = BOX (s_Ch, 0, Lp0 & 0xff) + ^ BOX (s_Ch, 1, Lp1 & 0xff) + ^ BOX (s_Ch, 2, Lp2 & 0xff) + ^ BOX (s_Ch, 3, Lp3 & 0xff) + ^ BOX (s_Ch, 4, Lp4 & 0xff) + ^ BOX (s_Ch, 5, Lp5 & 0xff) + ^ BOX (s_Ch, 6, Lp6 & 0xff) + ^ BOX (s_Ch, 7, Lp7 & 0xff); + + Ll[i] = BOX (s_Cl, 0, Lp0 & 0xff) + ^ BOX (s_Cl, 1, Lp1 & 0xff) + ^ BOX (s_Cl, 2, Lp2 & 0xff) + ^ BOX (s_Cl, 3, Lp3 & 0xff) + ^ BOX (s_Cl, 4, Lp4 & 0xff) + ^ BOX (s_Cl, 5, Lp5 & 0xff) + ^ BOX (s_Cl, 6, Lp6 & 0xff) + ^ BOX (s_Cl, 7, Lp7 & 0xff); + } + + stateh[0] = Lh[0] ^ Kh[0]; + statel[0] = Ll[0] ^ Kl[0]; + stateh[1] = Lh[1] ^ Kh[1]; + statel[1] = Ll[1] ^ Kl[1]; + stateh[2] = Lh[2] ^ Kh[2]; + statel[2] = Ll[2] ^ Kl[2]; + stateh[3] = Lh[3] ^ Kh[3]; + statel[3] = Ll[3] ^ Kl[3]; + stateh[4] = Lh[4] ^ Kh[4]; + statel[4] = Ll[4] ^ Kl[4]; + stateh[5] = Lh[5] ^ Kh[5]; + statel[5] = Ll[5] ^ Kl[5]; + stateh[6] = Lh[6] ^ Kh[6]; + statel[6] = Ll[6] ^ Kl[6]; + stateh[7] = Lh[7] ^ Kh[7]; + statel[7] = Ll[7] ^ Kl[7]; + + for (int r = 2; r <= R; r++) + { + u32x Lh[8]; + u32x Ll[8]; + + #pragma unroll + for (int i = 0; i < 8; i++) + { + const u32x Lp0 = Kh[(i + 8) & 7] >> 24; + const u32x Lp1 = Kh[(i + 7) & 7] >> 16; + const u32x Lp2 = Kh[(i + 6) & 7] >> 8; + const u32x Lp3 = Kh[(i + 5) & 7] >> 0; + const u32x Lp4 = Kl[(i + 4) & 7] >> 24; + const u32x Lp5 = Kl[(i + 3) & 7] >> 16; + const u32x Lp6 = Kl[(i + 2) & 7] >> 8; + const u32x Lp7 = Kl[(i + 1) & 7] >> 0; + + Lh[i] = BOX (s_Ch, 0, Lp0 & 0xff) + ^ BOX (s_Ch, 1, Lp1 & 0xff) + ^ BOX (s_Ch, 2, Lp2 & 0xff) + ^ BOX (s_Ch, 3, Lp3 & 0xff) + ^ BOX (s_Ch, 4, Lp4 & 0xff) + ^ BOX (s_Ch, 5, Lp5 & 0xff) + ^ BOX (s_Ch, 6, Lp6 & 0xff) + ^ BOX (s_Ch, 7, Lp7 & 0xff); + + Ll[i] = BOX (s_Cl, 0, Lp0 & 0xff) + ^ BOX (s_Cl, 1, Lp1 & 0xff) + ^ BOX (s_Cl, 2, Lp2 & 0xff) + ^ BOX (s_Cl, 3, Lp3 & 0xff) + ^ BOX (s_Cl, 4, Lp4 & 0xff) + ^ BOX (s_Cl, 5, Lp5 & 0xff) + ^ BOX (s_Cl, 6, Lp6 & 0xff) + ^ BOX (s_Cl, 7, Lp7 & 0xff); + } + + Kh[0] = Lh[0] ^ rch[r]; + Kl[0] = Ll[0] ^ rcl[r]; + Kh[1] = Lh[1]; + Kl[1] = Ll[1]; + Kh[2] = Lh[2]; + Kl[2] = Ll[2]; + Kh[3] = Lh[3]; + Kl[3] = Ll[3]; + Kh[4] = Lh[4]; + Kl[4] = Ll[4]; + Kh[5] = Lh[5]; + Kl[5] = Ll[5]; + Kh[6] = Lh[6]; + Kl[6] = Ll[6]; + Kh[7] = Lh[7]; + Kl[7] = Ll[7]; + + #pragma unroll 8 + for (int i = 0; i < 8; i++) + { + const u32x Lp0 = stateh[(i + 8) & 7] >> 24; + const u32x Lp1 = stateh[(i + 7) & 7] >> 16; + const u32x Lp2 = stateh[(i + 6) & 7] >> 8; + const u32x Lp3 = stateh[(i + 5) & 7] >> 0; + const u32x Lp4 = statel[(i + 4) & 7] >> 24; + const u32x Lp5 = statel[(i + 3) & 7] >> 16; + const u32x Lp6 = statel[(i + 2) & 7] >> 8; + const u32x Lp7 = statel[(i + 1) & 7] >> 0; + + Lh[i] = BOX (s_Ch, 0, Lp0 & 0xff) + ^ BOX (s_Ch, 1, Lp1 & 0xff) + ^ BOX (s_Ch, 2, Lp2 & 0xff) + ^ BOX (s_Ch, 3, Lp3 & 0xff) + ^ BOX (s_Ch, 4, Lp4 & 0xff) + ^ BOX (s_Ch, 5, Lp5 & 0xff) + ^ BOX (s_Ch, 6, Lp6 & 0xff) + ^ BOX (s_Ch, 7, Lp7 & 0xff); + + Ll[i] = BOX (s_Cl, 0, Lp0 & 0xff) + ^ BOX (s_Cl, 1, Lp1 & 0xff) + ^ BOX (s_Cl, 2, Lp2 & 0xff) + ^ BOX (s_Cl, 3, Lp3 & 0xff) + ^ BOX (s_Cl, 4, Lp4 & 0xff) + ^ BOX (s_Cl, 5, Lp5 & 0xff) + ^ BOX (s_Cl, 6, Lp6 & 0xff) + ^ BOX (s_Cl, 7, Lp7 & 0xff); + } + + stateh[0] = Lh[0] ^ Kh[0]; + statel[0] = Ll[0] ^ Kl[0]; + stateh[1] = Lh[1] ^ Kh[1]; + statel[1] = Ll[1] ^ Kl[1]; + stateh[2] = Lh[2] ^ Kh[2]; + statel[2] = Ll[2] ^ Kl[2]; + stateh[3] = Lh[3] ^ Kh[3]; + statel[3] = Ll[3] ^ Kl[3]; + stateh[4] = Lh[4] ^ Kh[4]; + statel[4] = Ll[4] ^ Kl[4]; + stateh[5] = Lh[5] ^ Kh[5]; + statel[5] = Ll[5] ^ Kl[5]; + stateh[6] = Lh[6] ^ Kh[6]; + statel[6] = Ll[6] ^ Kl[6]; + stateh[7] = Lh[7] ^ Kh[7]; + statel[7] = Ll[7] ^ Kl[7]; + } + + dgst[ 0] = stateh[0] ^ w[ 0]; + dgst[ 1] = statel[0] ^ w[ 1]; + dgst[ 2] = stateh[1] ^ w[ 2]; + dgst[ 3] = statel[1] ^ w[ 3]; + dgst[ 4] = stateh[2] ^ w[ 4]; + dgst[ 5] = statel[2] ^ w[ 5]; + dgst[ 6] = stateh[3] ^ w[ 6]; + dgst[ 7] = statel[3] ^ w[ 7]; + dgst[ 8] = stateh[4] ^ w[ 8]; + dgst[ 9] = statel[4] ^ w[ 9]; + dgst[10] = stateh[5] ^ w[10]; + dgst[11] = statel[5] ^ w[11]; + dgst[12] = stateh[6] ^ w[12]; + dgst[13] = statel[6] ^ w[13]; + dgst[14] = stateh[7] ^ w[14]; + dgst[15] = statel[7] ^ w[15]; +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m06100_m04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global netntlm_t *netntlm_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + u32x pw_buf1[4]; + + pw_buf1[0] = pws[gid].i[ 4]; + pw_buf1[1] = pws[gid].i[ 5]; + pw_buf1[2] = pws[gid].i[ 6]; + pw_buf1[3] = pws[gid].i[ 7]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * modifier + */ + + __local u32 s_Ch[8][256]; + __local u32 s_Cl[8][256]; + + const u32 lid4 = lid * 4; + + for (u32 i = 0; i < 8; i++) + { + s_Ch[i][lid4 + 0] = Ch[i][lid4 + 0]; + s_Ch[i][lid4 + 1] = Ch[i][lid4 + 1]; + s_Ch[i][lid4 + 2] = Ch[i][lid4 + 2]; + s_Ch[i][lid4 + 3] = Ch[i][lid4 + 3]; + s_Cl[i][lid4 + 0] = Cl[i][lid4 + 0]; + s_Cl[i][lid4 + 1] = Cl[i][lid4 + 1]; + s_Cl[i][lid4 + 2] = Cl[i][lid4 + 2]; + s_Cl[i][lid4 + 3] = Cl[i][lid4 + 3]; + } + + barrier (CLK_LOCAL_MEM_FENCE); + + if (gid >= gid_max) return; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + + w0[0] = pw_buf0[0]; + w0[1] = pw_buf0[1]; + w0[2] = pw_buf0[2]; + w0[3] = pw_buf0[3]; + + u32x w1[4]; + + w1[0] = pw_buf1[0]; + w1[1] = pw_buf1[1]; + w1[2] = pw_buf1[2]; + w1[3] = pw_buf1[3]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 out_len = apply_rules (rules_buf[il_pos].cmds, w0, w1, pw_len); + + append_0x80_2 (w0, w1, out_len); + + u32x wl[16]; + + wl[ 0] = swap_workaround (w0[0]); + wl[ 1] = swap_workaround (w0[1]); + wl[ 2] = swap_workaround (w0[2]); + wl[ 3] = swap_workaround (w0[3]); + wl[ 4] = swap_workaround (w1[0]); + wl[ 5] = swap_workaround (w1[1]); + wl[ 6] = swap_workaround (w1[2]); + wl[ 7] = swap_workaround (w1[3]); + wl[ 8] = 0; + wl[ 9] = 0; + wl[10] = 0; + wl[11] = 0; + wl[12] = 0; + wl[13] = 0; + wl[14] = 0; + wl[15] = out_len * 8; + + u32x dgst[16]; + + dgst[ 0] = 0; + dgst[ 1] = 0; + dgst[ 2] = 0; + dgst[ 3] = 0; + dgst[ 4] = 0; + dgst[ 5] = 0; + dgst[ 6] = 0; + dgst[ 7] = 0; + dgst[ 8] = 0; + dgst[ 9] = 0; + dgst[10] = 0; + dgst[11] = 0; + dgst[12] = 0; + dgst[13] = 0; + dgst[14] = 0; + dgst[15] = 0; + + whirlpool_transform (wl, dgst, s_Ch, s_Cl); + + const u32x r0 = dgst[0]; + const u32x r1 = dgst[1]; + const u32x r2 = dgst[2]; + const u32x r3 = dgst[3]; + + #include VECT_COMPARE_M + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m06100_m08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m06100_m16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m06100_s04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global netntlm_t *netntlm_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + u32x pw_buf1[4]; + + pw_buf1[0] = pws[gid].i[ 4]; + pw_buf1[1] = pws[gid].i[ 5]; + pw_buf1[2] = pws[gid].i[ 6]; + pw_buf1[3] = pws[gid].i[ 7]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * modifier + */ + + __local u32 s_Ch[8][256]; + __local u32 s_Cl[8][256]; + + const u32 lid4 = lid * 4; + + for (u32 i = 0; i < 8; i++) + { + s_Ch[i][lid4 + 0] = Ch[i][lid4 + 0]; + s_Ch[i][lid4 + 1] = Ch[i][lid4 + 1]; + s_Ch[i][lid4 + 2] = Ch[i][lid4 + 2]; + s_Ch[i][lid4 + 3] = Ch[i][lid4 + 3]; + s_Cl[i][lid4 + 0] = Cl[i][lid4 + 0]; + s_Cl[i][lid4 + 1] = Cl[i][lid4 + 1]; + s_Cl[i][lid4 + 2] = Cl[i][lid4 + 2]; + s_Cl[i][lid4 + 3] = Cl[i][lid4 + 3]; + } + + barrier (CLK_LOCAL_MEM_FENCE); + + if (gid >= gid_max) return; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + + w0[0] = pw_buf0[0]; + w0[1] = pw_buf0[1]; + w0[2] = pw_buf0[2]; + w0[3] = pw_buf0[3]; + + u32x w1[4]; + + w1[0] = pw_buf1[0]; + w1[1] = pw_buf1[1]; + w1[2] = pw_buf1[2]; + w1[3] = pw_buf1[3]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 out_len = apply_rules (rules_buf[il_pos].cmds, w0, w1, pw_len); + + append_0x80_2 (w0, w1, out_len); + + u32x wl[16]; + + wl[ 0] = swap_workaround (w0[0]); + wl[ 1] = swap_workaround (w0[1]); + wl[ 2] = swap_workaround (w0[2]); + wl[ 3] = swap_workaround (w0[3]); + wl[ 4] = swap_workaround (w1[0]); + wl[ 5] = swap_workaround (w1[1]); + wl[ 6] = swap_workaround (w1[2]); + wl[ 7] = swap_workaround (w1[3]); + wl[ 8] = 0; + wl[ 9] = 0; + wl[10] = 0; + wl[11] = 0; + wl[12] = 0; + wl[13] = 0; + wl[14] = 0; + wl[15] = out_len * 8; + + u32x dgst[16]; + + dgst[ 0] = 0; + dgst[ 1] = 0; + dgst[ 2] = 0; + dgst[ 3] = 0; + dgst[ 4] = 0; + dgst[ 5] = 0; + dgst[ 6] = 0; + dgst[ 7] = 0; + dgst[ 8] = 0; + dgst[ 9] = 0; + dgst[10] = 0; + dgst[11] = 0; + dgst[12] = 0; + dgst[13] = 0; + dgst[14] = 0; + dgst[15] = 0; + + whirlpool_transform (wl, dgst, s_Ch, s_Cl); + + const u32x r0 = dgst[0]; + const u32x r1 = dgst[1]; + const u32x r2 = dgst[2]; + const u32x r3 = dgst[3]; + + #include VECT_COMPARE_S + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m06100_s08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m06100_s16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/amd/m06100_a1.cl b/amd/m06100_a1.cl new file mode 100644 index 0000000000..491c7fdd82 --- /dev/null +++ b/amd/m06100_a1.cl @@ -0,0 +1,1779 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _WHIRLPOOL_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW4 +#define VECT_SIZE2 +#endif + +#ifdef VLIW5 +#define VECT_SIZE2 +#endif + +#define DGST_R0 0 +#define DGST_R1 1 +#define DGST_R2 2 +#define DGST_R3 3 + +#include "include/kernel_functions.c" +#include "types_amd.c" +#include "common_amd.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#define R 10 + +#ifdef VECT_SIZE1 +#define BOX(S,n,i) u32x ((S)[(n)][(i)]) +#endif + +#ifdef VECT_SIZE2 +#define BOX(S,n,i) u32x ((S)[(n)][(i).s0], (S)[(n)][(i).s1]) +#endif + +__constant u32 Ch[8][256] = +{ + { + 0x18186018, 0x23238c23, 0xc6c63fc6, 0xe8e887e8, + 0x87872687, 0xb8b8dab8, 0x01010401, 0x4f4f214f, + 0x3636d836, 0xa6a6a2a6, 0xd2d26fd2, 0xf5f5f3f5, + 0x7979f979, 0x6f6fa16f, 0x91917e91, 0x52525552, + 0x60609d60, 0xbcbccabc, 0x9b9b569b, 0x8e8e028e, + 0xa3a3b6a3, 0x0c0c300c, 0x7b7bf17b, 0x3535d435, + 0x1d1d741d, 0xe0e0a7e0, 0xd7d77bd7, 0xc2c22fc2, + 0x2e2eb82e, 0x4b4b314b, 0xfefedffe, 0x57574157, + 0x15155415, 0x7777c177, 0x3737dc37, 0xe5e5b3e5, + 0x9f9f469f, 0xf0f0e7f0, 0x4a4a354a, 0xdada4fda, + 0x58587d58, 0xc9c903c9, 0x2929a429, 0x0a0a280a, + 0xb1b1feb1, 0xa0a0baa0, 0x6b6bb16b, 0x85852e85, + 0xbdbdcebd, 0x5d5d695d, 0x10104010, 0xf4f4f7f4, + 0xcbcb0bcb, 0x3e3ef83e, 0x05051405, 0x67678167, + 0xe4e4b7e4, 0x27279c27, 0x41411941, 0x8b8b168b, + 0xa7a7a6a7, 0x7d7de97d, 0x95956e95, 0xd8d847d8, + 0xfbfbcbfb, 0xeeee9fee, 0x7c7ced7c, 0x66668566, + 0xdddd53dd, 0x17175c17, 0x47470147, 0x9e9e429e, + 0xcaca0fca, 0x2d2db42d, 0xbfbfc6bf, 0x07071c07, + 0xadad8ead, 0x5a5a755a, 0x83833683, 0x3333cc33, + 0x63639163, 0x02020802, 0xaaaa92aa, 0x7171d971, + 0xc8c807c8, 0x19196419, 0x49493949, 0xd9d943d9, + 0xf2f2eff2, 0xe3e3abe3, 0x5b5b715b, 0x88881a88, + 0x9a9a529a, 0x26269826, 0x3232c832, 0xb0b0fab0, + 0xe9e983e9, 0x0f0f3c0f, 0xd5d573d5, 0x80803a80, + 0xbebec2be, 0xcdcd13cd, 0x3434d034, 0x48483d48, + 0xffffdbff, 0x7a7af57a, 0x90907a90, 0x5f5f615f, + 0x20208020, 0x6868bd68, 0x1a1a681a, 0xaeae82ae, + 0xb4b4eab4, 0x54544d54, 0x93937693, 0x22228822, + 0x64648d64, 0xf1f1e3f1, 0x7373d173, 0x12124812, + 0x40401d40, 0x08082008, 0xc3c32bc3, 0xecec97ec, + 0xdbdb4bdb, 0xa1a1bea1, 0x8d8d0e8d, 0x3d3df43d, + 0x97976697, 0x00000000, 0xcfcf1bcf, 0x2b2bac2b, + 0x7676c576, 0x82823282, 0xd6d67fd6, 0x1b1b6c1b, + 0xb5b5eeb5, 0xafaf86af, 0x6a6ab56a, 0x50505d50, + 0x45450945, 0xf3f3ebf3, 0x3030c030, 0xefef9bef, + 0x3f3ffc3f, 0x55554955, 0xa2a2b2a2, 0xeaea8fea, + 0x65658965, 0xbabad2ba, 0x2f2fbc2f, 0xc0c027c0, + 0xdede5fde, 0x1c1c701c, 0xfdfdd3fd, 0x4d4d294d, + 0x92927292, 0x7575c975, 0x06061806, 0x8a8a128a, + 0xb2b2f2b2, 0xe6e6bfe6, 0x0e0e380e, 0x1f1f7c1f, + 0x62629562, 0xd4d477d4, 0xa8a89aa8, 0x96966296, + 0xf9f9c3f9, 0xc5c533c5, 0x25259425, 0x59597959, + 0x84842a84, 0x7272d572, 0x3939e439, 0x4c4c2d4c, + 0x5e5e655e, 0x7878fd78, 0x3838e038, 0x8c8c0a8c, + 0xd1d163d1, 0xa5a5aea5, 0xe2e2afe2, 0x61619961, + 0xb3b3f6b3, 0x21218421, 0x9c9c4a9c, 0x1e1e781e, + 0x43431143, 0xc7c73bc7, 0xfcfcd7fc, 0x04041004, + 0x51515951, 0x99995e99, 0x6d6da96d, 0x0d0d340d, + 0xfafacffa, 0xdfdf5bdf, 0x7e7ee57e, 0x24249024, + 0x3b3bec3b, 0xabab96ab, 0xcece1fce, 0x11114411, + 0x8f8f068f, 0x4e4e254e, 0xb7b7e6b7, 0xebeb8beb, + 0x3c3cf03c, 0x81813e81, 0x94946a94, 0xf7f7fbf7, + 0xb9b9deb9, 0x13134c13, 0x2c2cb02c, 0xd3d36bd3, + 0xe7e7bbe7, 0x6e6ea56e, 0xc4c437c4, 0x03030c03, + 0x56564556, 0x44440d44, 0x7f7fe17f, 0xa9a99ea9, + 0x2a2aa82a, 0xbbbbd6bb, 0xc1c123c1, 0x53535153, + 0xdcdc57dc, 0x0b0b2c0b, 0x9d9d4e9d, 0x6c6cad6c, + 0x3131c431, 0x7474cd74, 0xf6f6fff6, 0x46460546, + 0xacac8aac, 0x89891e89, 0x14145014, 0xe1e1a3e1, + 0x16165816, 0x3a3ae83a, 0x6969b969, 0x09092409, + 0x7070dd70, 0xb6b6e2b6, 0xd0d067d0, 0xeded93ed, + 0xcccc17cc, 0x42421542, 0x98985a98, 0xa4a4aaa4, + 0x2828a028, 0x5c5c6d5c, 0xf8f8c7f8, 0x86862286, + }, + { + 0xd8181860, 0x2623238c, 0xb8c6c63f, 0xfbe8e887, + 0xcb878726, 0x11b8b8da, 0x09010104, 0x0d4f4f21, + 0x9b3636d8, 0xffa6a6a2, 0x0cd2d26f, 0x0ef5f5f3, + 0x967979f9, 0x306f6fa1, 0x6d91917e, 0xf8525255, + 0x4760609d, 0x35bcbcca, 0x379b9b56, 0x8a8e8e02, + 0xd2a3a3b6, 0x6c0c0c30, 0x847b7bf1, 0x803535d4, + 0xf51d1d74, 0xb3e0e0a7, 0x21d7d77b, 0x9cc2c22f, + 0x432e2eb8, 0x294b4b31, 0x5dfefedf, 0xd5575741, + 0xbd151554, 0xe87777c1, 0x923737dc, 0x9ee5e5b3, + 0x139f9f46, 0x23f0f0e7, 0x204a4a35, 0x44dada4f, + 0xa258587d, 0xcfc9c903, 0x7c2929a4, 0x5a0a0a28, + 0x50b1b1fe, 0xc9a0a0ba, 0x146b6bb1, 0xd985852e, + 0x3cbdbdce, 0x8f5d5d69, 0x90101040, 0x07f4f4f7, + 0xddcbcb0b, 0xd33e3ef8, 0x2d050514, 0x78676781, + 0x97e4e4b7, 0x0227279c, 0x73414119, 0xa78b8b16, + 0xf6a7a7a6, 0xb27d7de9, 0x4995956e, 0x56d8d847, + 0x70fbfbcb, 0xcdeeee9f, 0xbb7c7ced, 0x71666685, + 0x7bdddd53, 0xaf17175c, 0x45474701, 0x1a9e9e42, + 0xd4caca0f, 0x582d2db4, 0x2ebfbfc6, 0x3f07071c, + 0xacadad8e, 0xb05a5a75, 0xef838336, 0xb63333cc, + 0x5c636391, 0x12020208, 0x93aaaa92, 0xde7171d9, + 0xc6c8c807, 0xd1191964, 0x3b494939, 0x5fd9d943, + 0x31f2f2ef, 0xa8e3e3ab, 0xb95b5b71, 0xbc88881a, + 0x3e9a9a52, 0x0b262698, 0xbf3232c8, 0x59b0b0fa, + 0xf2e9e983, 0x770f0f3c, 0x33d5d573, 0xf480803a, + 0x27bebec2, 0xebcdcd13, 0x893434d0, 0x3248483d, + 0x54ffffdb, 0x8d7a7af5, 0x6490907a, 0x9d5f5f61, + 0x3d202080, 0x0f6868bd, 0xca1a1a68, 0xb7aeae82, + 0x7db4b4ea, 0xce54544d, 0x7f939376, 0x2f222288, + 0x6364648d, 0x2af1f1e3, 0xcc7373d1, 0x82121248, + 0x7a40401d, 0x48080820, 0x95c3c32b, 0xdfecec97, + 0x4ddbdb4b, 0xc0a1a1be, 0x918d8d0e, 0xc83d3df4, + 0x5b979766, 0x00000000, 0xf9cfcf1b, 0x6e2b2bac, + 0xe17676c5, 0xe6828232, 0x28d6d67f, 0xc31b1b6c, + 0x74b5b5ee, 0xbeafaf86, 0x1d6a6ab5, 0xea50505d, + 0x57454509, 0x38f3f3eb, 0xad3030c0, 0xc4efef9b, + 0xda3f3ffc, 0xc7555549, 0xdba2a2b2, 0xe9eaea8f, + 0x6a656589, 0x03babad2, 0x4a2f2fbc, 0x8ec0c027, + 0x60dede5f, 0xfc1c1c70, 0x46fdfdd3, 0x1f4d4d29, + 0x76929272, 0xfa7575c9, 0x36060618, 0xae8a8a12, + 0x4bb2b2f2, 0x85e6e6bf, 0x7e0e0e38, 0xe71f1f7c, + 0x55626295, 0x3ad4d477, 0x81a8a89a, 0x52969662, + 0x62f9f9c3, 0xa3c5c533, 0x10252594, 0xab595979, + 0xd084842a, 0xc57272d5, 0xec3939e4, 0x164c4c2d, + 0x945e5e65, 0x9f7878fd, 0xe53838e0, 0x988c8c0a, + 0x17d1d163, 0xe4a5a5ae, 0xa1e2e2af, 0x4e616199, + 0x42b3b3f6, 0x34212184, 0x089c9c4a, 0xee1e1e78, + 0x61434311, 0xb1c7c73b, 0x4ffcfcd7, 0x24040410, + 0xe3515159, 0x2599995e, 0x226d6da9, 0x650d0d34, + 0x79fafacf, 0x69dfdf5b, 0xa97e7ee5, 0x19242490, + 0xfe3b3bec, 0x9aabab96, 0xf0cece1f, 0x99111144, + 0x838f8f06, 0x044e4e25, 0x66b7b7e6, 0xe0ebeb8b, + 0xc13c3cf0, 0xfd81813e, 0x4094946a, 0x1cf7f7fb, + 0x18b9b9de, 0x8b13134c, 0x512c2cb0, 0x05d3d36b, + 0x8ce7e7bb, 0x396e6ea5, 0xaac4c437, 0x1b03030c, + 0xdc565645, 0x5e44440d, 0xa07f7fe1, 0x88a9a99e, + 0x672a2aa8, 0x0abbbbd6, 0x87c1c123, 0xf1535351, + 0x72dcdc57, 0x530b0b2c, 0x019d9d4e, 0x2b6c6cad, + 0xa43131c4, 0xf37474cd, 0x15f6f6ff, 0x4c464605, + 0xa5acac8a, 0xb589891e, 0xb4141450, 0xbae1e1a3, + 0xa6161658, 0xf73a3ae8, 0x066969b9, 0x41090924, + 0xd77070dd, 0x6fb6b6e2, 0x1ed0d067, 0xd6eded93, + 0xe2cccc17, 0x68424215, 0x2c98985a, 0xeda4a4aa, + 0x752828a0, 0x865c5c6d, 0x6bf8f8c7, 0xc2868622, + }, + { + 0x30d81818, 0x46262323, 0x91b8c6c6, 0xcdfbe8e8, + 0x13cb8787, 0x6d11b8b8, 0x02090101, 0x9e0d4f4f, + 0x6c9b3636, 0x51ffa6a6, 0xb90cd2d2, 0xf70ef5f5, + 0xf2967979, 0xde306f6f, 0x3f6d9191, 0xa4f85252, + 0xc0476060, 0x6535bcbc, 0x2b379b9b, 0x018a8e8e, + 0x5bd2a3a3, 0x186c0c0c, 0xf6847b7b, 0x6a803535, + 0x3af51d1d, 0xddb3e0e0, 0xb321d7d7, 0x999cc2c2, + 0x5c432e2e, 0x96294b4b, 0xe15dfefe, 0xaed55757, + 0x2abd1515, 0xeee87777, 0x6e923737, 0xd79ee5e5, + 0x23139f9f, 0xfd23f0f0, 0x94204a4a, 0xa944dada, + 0xb0a25858, 0x8fcfc9c9, 0x527c2929, 0x145a0a0a, + 0x7f50b1b1, 0x5dc9a0a0, 0xd6146b6b, 0x17d98585, + 0x673cbdbd, 0xba8f5d5d, 0x20901010, 0xf507f4f4, + 0x8bddcbcb, 0x7cd33e3e, 0x0a2d0505, 0xce786767, + 0xd597e4e4, 0x4e022727, 0x82734141, 0x0ba78b8b, + 0x53f6a7a7, 0xfab27d7d, 0x37499595, 0xad56d8d8, + 0xeb70fbfb, 0xc1cdeeee, 0xf8bb7c7c, 0xcc716666, + 0xa77bdddd, 0x2eaf1717, 0x8e454747, 0x211a9e9e, + 0x89d4caca, 0x5a582d2d, 0x632ebfbf, 0x0e3f0707, + 0x47acadad, 0xb4b05a5a, 0x1bef8383, 0x66b63333, + 0xc65c6363, 0x04120202, 0x4993aaaa, 0xe2de7171, + 0x8dc6c8c8, 0x32d11919, 0x923b4949, 0xaf5fd9d9, + 0xf931f2f2, 0xdba8e3e3, 0xb6b95b5b, 0x0dbc8888, + 0x293e9a9a, 0x4c0b2626, 0x64bf3232, 0x7d59b0b0, + 0xcff2e9e9, 0x1e770f0f, 0xb733d5d5, 0x1df48080, + 0x6127bebe, 0x87ebcdcd, 0x68893434, 0x90324848, + 0xe354ffff, 0xf48d7a7a, 0x3d649090, 0xbe9d5f5f, + 0x403d2020, 0xd00f6868, 0x34ca1a1a, 0x41b7aeae, + 0x757db4b4, 0xa8ce5454, 0x3b7f9393, 0x442f2222, + 0xc8636464, 0xff2af1f1, 0xe6cc7373, 0x24821212, + 0x807a4040, 0x10480808, 0x9b95c3c3, 0xc5dfecec, + 0xab4ddbdb, 0x5fc0a1a1, 0x07918d8d, 0x7ac83d3d, + 0x335b9797, 0x00000000, 0x83f9cfcf, 0x566e2b2b, + 0xece17676, 0x19e68282, 0xb128d6d6, 0x36c31b1b, + 0x7774b5b5, 0x43beafaf, 0xd41d6a6a, 0xa0ea5050, + 0x8a574545, 0xfb38f3f3, 0x60ad3030, 0xc3c4efef, + 0x7eda3f3f, 0xaac75555, 0x59dba2a2, 0xc9e9eaea, + 0xca6a6565, 0x6903baba, 0x5e4a2f2f, 0x9d8ec0c0, + 0xa160dede, 0x38fc1c1c, 0xe746fdfd, 0x9a1f4d4d, + 0x39769292, 0xeafa7575, 0x0c360606, 0x09ae8a8a, + 0x794bb2b2, 0xd185e6e6, 0x1c7e0e0e, 0x3ee71f1f, + 0xc4556262, 0xb53ad4d4, 0x4d81a8a8, 0x31529696, + 0xef62f9f9, 0x97a3c5c5, 0x4a102525, 0xb2ab5959, + 0x15d08484, 0xe4c57272, 0x72ec3939, 0x98164c4c, + 0xbc945e5e, 0xf09f7878, 0x70e53838, 0x05988c8c, + 0xbf17d1d1, 0x57e4a5a5, 0xd9a1e2e2, 0xc24e6161, + 0x7b42b3b3, 0x42342121, 0x25089c9c, 0x3cee1e1e, + 0x86614343, 0x93b1c7c7, 0xe54ffcfc, 0x08240404, + 0xa2e35151, 0x2f259999, 0xda226d6d, 0x1a650d0d, + 0xe979fafa, 0xa369dfdf, 0xfca97e7e, 0x48192424, + 0x76fe3b3b, 0x4b9aabab, 0x81f0cece, 0x22991111, + 0x03838f8f, 0x9c044e4e, 0x7366b7b7, 0xcbe0ebeb, + 0x78c13c3c, 0x1ffd8181, 0x35409494, 0xf31cf7f7, + 0x6f18b9b9, 0x268b1313, 0x58512c2c, 0xbb05d3d3, + 0xd38ce7e7, 0xdc396e6e, 0x95aac4c4, 0x061b0303, + 0xacdc5656, 0x885e4444, 0xfea07f7f, 0x4f88a9a9, + 0x54672a2a, 0x6b0abbbb, 0x9f87c1c1, 0xa6f15353, + 0xa572dcdc, 0x16530b0b, 0x27019d9d, 0xd82b6c6c, + 0x62a43131, 0xe8f37474, 0xf115f6f6, 0x8c4c4646, + 0x45a5acac, 0x0fb58989, 0x28b41414, 0xdfbae1e1, + 0x2ca61616, 0x74f73a3a, 0xd2066969, 0x12410909, + 0xe0d77070, 0x716fb6b6, 0xbd1ed0d0, 0xc7d6eded, + 0x85e2cccc, 0x84684242, 0x2d2c9898, 0x55eda4a4, + 0x50752828, 0xb8865c5c, 0xed6bf8f8, 0x11c28686, + }, + { + 0x7830d818, 0xaf462623, 0xf991b8c6, 0x6fcdfbe8, + 0xa113cb87, 0x626d11b8, 0x05020901, 0x6e9e0d4f, + 0xee6c9b36, 0x0451ffa6, 0xbdb90cd2, 0x06f70ef5, + 0x80f29679, 0xcede306f, 0xef3f6d91, 0x07a4f852, + 0xfdc04760, 0x766535bc, 0xcd2b379b, 0x8c018a8e, + 0x155bd2a3, 0x3c186c0c, 0x8af6847b, 0xe16a8035, + 0x693af51d, 0x47ddb3e0, 0xacb321d7, 0xed999cc2, + 0x965c432e, 0x7a96294b, 0x21e15dfe, 0x16aed557, + 0x412abd15, 0xb6eee877, 0xeb6e9237, 0x56d79ee5, + 0xd923139f, 0x17fd23f0, 0x7f94204a, 0x95a944da, + 0x25b0a258, 0xca8fcfc9, 0x8d527c29, 0x22145a0a, + 0x4f7f50b1, 0x1a5dc9a0, 0xdad6146b, 0xab17d985, + 0x73673cbd, 0x34ba8f5d, 0x50209010, 0x03f507f4, + 0xc08bddcb, 0xc67cd33e, 0x110a2d05, 0xe6ce7867, + 0x53d597e4, 0xbb4e0227, 0x58827341, 0x9d0ba78b, + 0x0153f6a7, 0x94fab27d, 0xfb374995, 0x9fad56d8, + 0x30eb70fb, 0x71c1cdee, 0x91f8bb7c, 0xe3cc7166, + 0x8ea77bdd, 0x4b2eaf17, 0x468e4547, 0xdc211a9e, + 0xc589d4ca, 0x995a582d, 0x79632ebf, 0x1b0e3f07, + 0x2347acad, 0x2fb4b05a, 0xb51bef83, 0xff66b633, + 0xf2c65c63, 0x0a041202, 0x384993aa, 0xa8e2de71, + 0xcf8dc6c8, 0x7d32d119, 0x70923b49, 0x9aaf5fd9, + 0x1df931f2, 0x48dba8e3, 0x2ab6b95b, 0x920dbc88, + 0xc8293e9a, 0xbe4c0b26, 0xfa64bf32, 0x4a7d59b0, + 0x6acff2e9, 0x331e770f, 0xa6b733d5, 0xba1df480, + 0x7c6127be, 0xde87ebcd, 0xe4688934, 0x75903248, + 0x24e354ff, 0x8ff48d7a, 0xea3d6490, 0x3ebe9d5f, + 0xa0403d20, 0xd5d00f68, 0x7234ca1a, 0x2c41b7ae, + 0x5e757db4, 0x19a8ce54, 0xe53b7f93, 0xaa442f22, + 0xe9c86364, 0x12ff2af1, 0xa2e6cc73, 0x5a248212, + 0x5d807a40, 0x28104808, 0xe89b95c3, 0x7bc5dfec, + 0x90ab4ddb, 0x1f5fc0a1, 0x8307918d, 0xc97ac83d, + 0xf1335b97, 0x00000000, 0xd483f9cf, 0x87566e2b, + 0xb3ece176, 0xb019e682, 0xa9b128d6, 0x7736c31b, + 0x5b7774b5, 0x2943beaf, 0xdfd41d6a, 0x0da0ea50, + 0x4c8a5745, 0x18fb38f3, 0xf060ad30, 0x74c3c4ef, + 0xc37eda3f, 0x1caac755, 0x1059dba2, 0x65c9e9ea, + 0xecca6a65, 0x686903ba, 0x935e4a2f, 0xe79d8ec0, + 0x81a160de, 0x6c38fc1c, 0x2ee746fd, 0x649a1f4d, + 0xe0397692, 0xbceafa75, 0x1e0c3606, 0x9809ae8a, + 0x40794bb2, 0x59d185e6, 0x361c7e0e, 0x633ee71f, + 0xf7c45562, 0xa3b53ad4, 0x324d81a8, 0xf4315296, + 0x3aef62f9, 0xf697a3c5, 0xb14a1025, 0x20b2ab59, + 0xae15d084, 0xa7e4c572, 0xdd72ec39, 0x6198164c, + 0x3bbc945e, 0x85f09f78, 0xd870e538, 0x8605988c, + 0xb2bf17d1, 0x0b57e4a5, 0x4dd9a1e2, 0xf8c24e61, + 0x457b42b3, 0xa5423421, 0xd625089c, 0x663cee1e, + 0x52866143, 0xfc93b1c7, 0x2be54ffc, 0x14082404, + 0x08a2e351, 0xc72f2599, 0xc4da226d, 0x391a650d, + 0x35e979fa, 0x84a369df, 0x9bfca97e, 0xb4481924, + 0xd776fe3b, 0x3d4b9aab, 0xd181f0ce, 0x55229911, + 0x8903838f, 0x6b9c044e, 0x517366b7, 0x60cbe0eb, + 0xcc78c13c, 0xbf1ffd81, 0xfe354094, 0x0cf31cf7, + 0x676f18b9, 0x5f268b13, 0x9c58512c, 0xb8bb05d3, + 0x5cd38ce7, 0xcbdc396e, 0xf395aac4, 0x0f061b03, + 0x13acdc56, 0x49885e44, 0x9efea07f, 0x374f88a9, + 0x8254672a, 0x6d6b0abb, 0xe29f87c1, 0x02a6f153, + 0x8ba572dc, 0x2716530b, 0xd327019d, 0xc1d82b6c, + 0xf562a431, 0xb9e8f374, 0x09f115f6, 0x438c4c46, + 0x2645a5ac, 0x970fb589, 0x4428b414, 0x42dfbae1, + 0x4e2ca616, 0xd274f73a, 0xd0d20669, 0x2d124109, + 0xade0d770, 0x54716fb6, 0xb7bd1ed0, 0x7ec7d6ed, + 0xdb85e2cc, 0x57846842, 0xc22d2c98, 0x0e55eda4, + 0x88507528, 0x31b8865c, 0x3fed6bf8, 0xa411c286, + }, + { + 0xc07830d8, 0x05af4626, 0x7ef991b8, 0x136fcdfb, + 0x4ca113cb, 0xa9626d11, 0x08050209, 0x426e9e0d, + 0xadee6c9b, 0x590451ff, 0xdebdb90c, 0xfb06f70e, + 0xef80f296, 0x5fcede30, 0xfcef3f6d, 0xaa07a4f8, + 0x27fdc047, 0x89766535, 0xaccd2b37, 0x048c018a, + 0x71155bd2, 0x603c186c, 0xff8af684, 0xb5e16a80, + 0xe8693af5, 0x5347ddb3, 0xf6acb321, 0x5eed999c, + 0x6d965c43, 0x627a9629, 0xa321e15d, 0x8216aed5, + 0xa8412abd, 0x9fb6eee8, 0xa5eb6e92, 0x7b56d79e, + 0x8cd92313, 0xd317fd23, 0x6a7f9420, 0x9e95a944, + 0xfa25b0a2, 0x06ca8fcf, 0x558d527c, 0x5022145a, + 0xe14f7f50, 0x691a5dc9, 0x7fdad614, 0x5cab17d9, + 0x8173673c, 0xd234ba8f, 0x80502090, 0xf303f507, + 0x16c08bdd, 0xedc67cd3, 0x28110a2d, 0x1fe6ce78, + 0x7353d597, 0x25bb4e02, 0x32588273, 0x2c9d0ba7, + 0x510153f6, 0xcf94fab2, 0xdcfb3749, 0x8e9fad56, + 0x8b30eb70, 0x2371c1cd, 0xc791f8bb, 0x17e3cc71, + 0xa68ea77b, 0xb84b2eaf, 0x02468e45, 0x84dc211a, + 0x1ec589d4, 0x75995a58, 0x9179632e, 0x381b0e3f, + 0x012347ac, 0xea2fb4b0, 0x6cb51bef, 0x85ff66b6, + 0x3ff2c65c, 0x100a0412, 0x39384993, 0xafa8e2de, + 0x0ecf8dc6, 0xc87d32d1, 0x7270923b, 0x869aaf5f, + 0xc31df931, 0x4b48dba8, 0xe22ab6b9, 0x34920dbc, + 0xa4c8293e, 0x2dbe4c0b, 0x8dfa64bf, 0xe94a7d59, + 0x1b6acff2, 0x78331e77, 0xe6a6b733, 0x74ba1df4, + 0x997c6127, 0x26de87eb, 0xbde46889, 0x7a759032, + 0xab24e354, 0xf78ff48d, 0xf4ea3d64, 0xc23ebe9d, + 0x1da0403d, 0x67d5d00f, 0xd07234ca, 0x192c41b7, + 0xc95e757d, 0x9a19a8ce, 0xece53b7f, 0x0daa442f, + 0x07e9c863, 0xdb12ff2a, 0xbfa2e6cc, 0x905a2482, + 0x3a5d807a, 0x40281048, 0x56e89b95, 0x337bc5df, + 0x9690ab4d, 0x611f5fc0, 0x1c830791, 0xf5c97ac8, + 0xccf1335b, 0x00000000, 0x36d483f9, 0x4587566e, + 0x97b3ece1, 0x64b019e6, 0xfea9b128, 0xd87736c3, + 0xc15b7774, 0x112943be, 0x77dfd41d, 0xba0da0ea, + 0x124c8a57, 0xcb18fb38, 0x9df060ad, 0x2b74c3c4, + 0xe5c37eda, 0x921caac7, 0x791059db, 0x0365c9e9, + 0x0fecca6a, 0xb9686903, 0x65935e4a, 0x4ee79d8e, + 0xbe81a160, 0xe06c38fc, 0xbb2ee746, 0x52649a1f, + 0xe4e03976, 0x8fbceafa, 0x301e0c36, 0x249809ae, + 0xf940794b, 0x6359d185, 0x70361c7e, 0xf8633ee7, + 0x37f7c455, 0xeea3b53a, 0x29324d81, 0xc4f43152, + 0x9b3aef62, 0x66f697a3, 0x35b14a10, 0xf220b2ab, + 0x54ae15d0, 0xb7a7e4c5, 0xd5dd72ec, 0x5a619816, + 0xca3bbc94, 0xe785f09f, 0xddd870e5, 0x14860598, + 0xc6b2bf17, 0x410b57e4, 0x434dd9a1, 0x2ff8c24e, + 0xf1457b42, 0x15a54234, 0x94d62508, 0xf0663cee, + 0x22528661, 0x76fc93b1, 0xb32be54f, 0x20140824, + 0xb208a2e3, 0xbcc72f25, 0x4fc4da22, 0x68391a65, + 0x8335e979, 0xb684a369, 0xd79bfca9, 0x3db44819, + 0xc5d776fe, 0x313d4b9a, 0x3ed181f0, 0x88552299, + 0x0c890383, 0x4a6b9c04, 0xd1517366, 0x0b60cbe0, + 0xfdcc78c1, 0x7cbf1ffd, 0xd4fe3540, 0xeb0cf31c, + 0xa1676f18, 0x985f268b, 0x7d9c5851, 0xd6b8bb05, + 0x6b5cd38c, 0x57cbdc39, 0x6ef395aa, 0x180f061b, + 0x8a13acdc, 0x1a49885e, 0xdf9efea0, 0x21374f88, + 0x4d825467, 0xb16d6b0a, 0x46e29f87, 0xa202a6f1, + 0xae8ba572, 0x58271653, 0x9cd32701, 0x47c1d82b, + 0x95f562a4, 0x87b9e8f3, 0xe309f115, 0x0a438c4c, + 0x092645a5, 0x3c970fb5, 0xa04428b4, 0x5b42dfba, + 0xb04e2ca6, 0xcdd274f7, 0x6fd0d206, 0x482d1241, + 0xa7ade0d7, 0xd954716f, 0xceb7bd1e, 0x3b7ec7d6, + 0x2edb85e2, 0x2a578468, 0xb4c22d2c, 0x490e55ed, + 0x5d885075, 0xda31b886, 0x933fed6b, 0x44a411c2, + }, + { + 0x18c07830, 0x2305af46, 0xc67ef991, 0xe8136fcd, + 0x874ca113, 0xb8a9626d, 0x01080502, 0x4f426e9e, + 0x36adee6c, 0xa6590451, 0xd2debdb9, 0xf5fb06f7, + 0x79ef80f2, 0x6f5fcede, 0x91fcef3f, 0x52aa07a4, + 0x6027fdc0, 0xbc897665, 0x9baccd2b, 0x8e048c01, + 0xa371155b, 0x0c603c18, 0x7bff8af6, 0x35b5e16a, + 0x1de8693a, 0xe05347dd, 0xd7f6acb3, 0xc25eed99, + 0x2e6d965c, 0x4b627a96, 0xfea321e1, 0x578216ae, + 0x15a8412a, 0x779fb6ee, 0x37a5eb6e, 0xe57b56d7, + 0x9f8cd923, 0xf0d317fd, 0x4a6a7f94, 0xda9e95a9, + 0x58fa25b0, 0xc906ca8f, 0x29558d52, 0x0a502214, + 0xb1e14f7f, 0xa0691a5d, 0x6b7fdad6, 0x855cab17, + 0xbd817367, 0x5dd234ba, 0x10805020, 0xf4f303f5, + 0xcb16c08b, 0x3eedc67c, 0x0528110a, 0x671fe6ce, + 0xe47353d5, 0x2725bb4e, 0x41325882, 0x8b2c9d0b, + 0xa7510153, 0x7dcf94fa, 0x95dcfb37, 0xd88e9fad, + 0xfb8b30eb, 0xee2371c1, 0x7cc791f8, 0x6617e3cc, + 0xdda68ea7, 0x17b84b2e, 0x4702468e, 0x9e84dc21, + 0xca1ec589, 0x2d75995a, 0xbf917963, 0x07381b0e, + 0xad012347, 0x5aea2fb4, 0x836cb51b, 0x3385ff66, + 0x633ff2c6, 0x02100a04, 0xaa393849, 0x71afa8e2, + 0xc80ecf8d, 0x19c87d32, 0x49727092, 0xd9869aaf, + 0xf2c31df9, 0xe34b48db, 0x5be22ab6, 0x8834920d, + 0x9aa4c829, 0x262dbe4c, 0x328dfa64, 0xb0e94a7d, + 0xe91b6acf, 0x0f78331e, 0xd5e6a6b7, 0x8074ba1d, + 0xbe997c61, 0xcd26de87, 0x34bde468, 0x487a7590, + 0xffab24e3, 0x7af78ff4, 0x90f4ea3d, 0x5fc23ebe, + 0x201da040, 0x6867d5d0, 0x1ad07234, 0xae192c41, + 0xb4c95e75, 0x549a19a8, 0x93ece53b, 0x220daa44, + 0x6407e9c8, 0xf1db12ff, 0x73bfa2e6, 0x12905a24, + 0x403a5d80, 0x08402810, 0xc356e89b, 0xec337bc5, + 0xdb9690ab, 0xa1611f5f, 0x8d1c8307, 0x3df5c97a, + 0x97ccf133, 0x00000000, 0xcf36d483, 0x2b458756, + 0x7697b3ec, 0x8264b019, 0xd6fea9b1, 0x1bd87736, + 0xb5c15b77, 0xaf112943, 0x6a77dfd4, 0x50ba0da0, + 0x45124c8a, 0xf3cb18fb, 0x309df060, 0xef2b74c3, + 0x3fe5c37e, 0x55921caa, 0xa2791059, 0xea0365c9, + 0x650fecca, 0xbab96869, 0x2f65935e, 0xc04ee79d, + 0xdebe81a1, 0x1ce06c38, 0xfdbb2ee7, 0x4d52649a, + 0x92e4e039, 0x758fbcea, 0x06301e0c, 0x8a249809, + 0xb2f94079, 0xe66359d1, 0x0e70361c, 0x1ff8633e, + 0x6237f7c4, 0xd4eea3b5, 0xa829324d, 0x96c4f431, + 0xf99b3aef, 0xc566f697, 0x2535b14a, 0x59f220b2, + 0x8454ae15, 0x72b7a7e4, 0x39d5dd72, 0x4c5a6198, + 0x5eca3bbc, 0x78e785f0, 0x38ddd870, 0x8c148605, + 0xd1c6b2bf, 0xa5410b57, 0xe2434dd9, 0x612ff8c2, + 0xb3f1457b, 0x2115a542, 0x9c94d625, 0x1ef0663c, + 0x43225286, 0xc776fc93, 0xfcb32be5, 0x04201408, + 0x51b208a2, 0x99bcc72f, 0x6d4fc4da, 0x0d68391a, + 0xfa8335e9, 0xdfb684a3, 0x7ed79bfc, 0x243db448, + 0x3bc5d776, 0xab313d4b, 0xce3ed181, 0x11885522, + 0x8f0c8903, 0x4e4a6b9c, 0xb7d15173, 0xeb0b60cb, + 0x3cfdcc78, 0x817cbf1f, 0x94d4fe35, 0xf7eb0cf3, + 0xb9a1676f, 0x13985f26, 0x2c7d9c58, 0xd3d6b8bb, + 0xe76b5cd3, 0x6e57cbdc, 0xc46ef395, 0x03180f06, + 0x568a13ac, 0x441a4988, 0x7fdf9efe, 0xa921374f, + 0x2a4d8254, 0xbbb16d6b, 0xc146e29f, 0x53a202a6, + 0xdcae8ba5, 0x0b582716, 0x9d9cd327, 0x6c47c1d8, + 0x3195f562, 0x7487b9e8, 0xf6e309f1, 0x460a438c, + 0xac092645, 0x893c970f, 0x14a04428, 0xe15b42df, + 0x16b04e2c, 0x3acdd274, 0x696fd0d2, 0x09482d12, + 0x70a7ade0, 0xb6d95471, 0xd0ceb7bd, 0xed3b7ec7, + 0xcc2edb85, 0x422a5784, 0x98b4c22d, 0xa4490e55, + 0x285d8850, 0x5cda31b8, 0xf8933fed, 0x8644a411, + }, + { + 0x6018c078, 0x8c2305af, 0x3fc67ef9, 0x87e8136f, + 0x26874ca1, 0xdab8a962, 0x04010805, 0x214f426e, + 0xd836adee, 0xa2a65904, 0x6fd2debd, 0xf3f5fb06, + 0xf979ef80, 0xa16f5fce, 0x7e91fcef, 0x5552aa07, + 0x9d6027fd, 0xcabc8976, 0x569baccd, 0x028e048c, + 0xb6a37115, 0x300c603c, 0xf17bff8a, 0xd435b5e1, + 0x741de869, 0xa7e05347, 0x7bd7f6ac, 0x2fc25eed, + 0xb82e6d96, 0x314b627a, 0xdffea321, 0x41578216, + 0x5415a841, 0xc1779fb6, 0xdc37a5eb, 0xb3e57b56, + 0x469f8cd9, 0xe7f0d317, 0x354a6a7f, 0x4fda9e95, + 0x7d58fa25, 0x03c906ca, 0xa429558d, 0x280a5022, + 0xfeb1e14f, 0xbaa0691a, 0xb16b7fda, 0x2e855cab, + 0xcebd8173, 0x695dd234, 0x40108050, 0xf7f4f303, + 0x0bcb16c0, 0xf83eedc6, 0x14052811, 0x81671fe6, + 0xb7e47353, 0x9c2725bb, 0x19413258, 0x168b2c9d, + 0xa6a75101, 0xe97dcf94, 0x6e95dcfb, 0x47d88e9f, + 0xcbfb8b30, 0x9fee2371, 0xed7cc791, 0x856617e3, + 0x53dda68e, 0x5c17b84b, 0x01470246, 0x429e84dc, + 0x0fca1ec5, 0xb42d7599, 0xc6bf9179, 0x1c07381b, + 0x8ead0123, 0x755aea2f, 0x36836cb5, 0xcc3385ff, + 0x91633ff2, 0x0802100a, 0x92aa3938, 0xd971afa8, + 0x07c80ecf, 0x6419c87d, 0x39497270, 0x43d9869a, + 0xeff2c31d, 0xabe34b48, 0x715be22a, 0x1a883492, + 0x529aa4c8, 0x98262dbe, 0xc8328dfa, 0xfab0e94a, + 0x83e91b6a, 0x3c0f7833, 0x73d5e6a6, 0x3a8074ba, + 0xc2be997c, 0x13cd26de, 0xd034bde4, 0x3d487a75, + 0xdbffab24, 0xf57af78f, 0x7a90f4ea, 0x615fc23e, + 0x80201da0, 0xbd6867d5, 0x681ad072, 0x82ae192c, + 0xeab4c95e, 0x4d549a19, 0x7693ece5, 0x88220daa, + 0x8d6407e9, 0xe3f1db12, 0xd173bfa2, 0x4812905a, + 0x1d403a5d, 0x20084028, 0x2bc356e8, 0x97ec337b, + 0x4bdb9690, 0xbea1611f, 0x0e8d1c83, 0xf43df5c9, + 0x6697ccf1, 0x00000000, 0x1bcf36d4, 0xac2b4587, + 0xc57697b3, 0x328264b0, 0x7fd6fea9, 0x6c1bd877, + 0xeeb5c15b, 0x86af1129, 0xb56a77df, 0x5d50ba0d, + 0x0945124c, 0xebf3cb18, 0xc0309df0, 0x9bef2b74, + 0xfc3fe5c3, 0x4955921c, 0xb2a27910, 0x8fea0365, + 0x89650fec, 0xd2bab968, 0xbc2f6593, 0x27c04ee7, + 0x5fdebe81, 0x701ce06c, 0xd3fdbb2e, 0x294d5264, + 0x7292e4e0, 0xc9758fbc, 0x1806301e, 0x128a2498, + 0xf2b2f940, 0xbfe66359, 0x380e7036, 0x7c1ff863, + 0x956237f7, 0x77d4eea3, 0x9aa82932, 0x6296c4f4, + 0xc3f99b3a, 0x33c566f6, 0x942535b1, 0x7959f220, + 0x2a8454ae, 0xd572b7a7, 0xe439d5dd, 0x2d4c5a61, + 0x655eca3b, 0xfd78e785, 0xe038ddd8, 0x0a8c1486, + 0x63d1c6b2, 0xaea5410b, 0xafe2434d, 0x99612ff8, + 0xf6b3f145, 0x842115a5, 0x4a9c94d6, 0x781ef066, + 0x11432252, 0x3bc776fc, 0xd7fcb32b, 0x10042014, + 0x5951b208, 0x5e99bcc7, 0xa96d4fc4, 0x340d6839, + 0xcffa8335, 0x5bdfb684, 0xe57ed79b, 0x90243db4, + 0xec3bc5d7, 0x96ab313d, 0x1fce3ed1, 0x44118855, + 0x068f0c89, 0x254e4a6b, 0xe6b7d151, 0x8beb0b60, + 0xf03cfdcc, 0x3e817cbf, 0x6a94d4fe, 0xfbf7eb0c, + 0xdeb9a167, 0x4c13985f, 0xb02c7d9c, 0x6bd3d6b8, + 0xbbe76b5c, 0xa56e57cb, 0x37c46ef3, 0x0c03180f, + 0x45568a13, 0x0d441a49, 0xe17fdf9e, 0x9ea92137, + 0xa82a4d82, 0xd6bbb16d, 0x23c146e2, 0x5153a202, + 0x57dcae8b, 0x2c0b5827, 0x4e9d9cd3, 0xad6c47c1, + 0xc43195f5, 0xcd7487b9, 0xfff6e309, 0x05460a43, + 0x8aac0926, 0x1e893c97, 0x5014a044, 0xa3e15b42, + 0x5816b04e, 0xe83acdd2, 0xb9696fd0, 0x2409482d, + 0xdd70a7ad, 0xe2b6d954, 0x67d0ceb7, 0x93ed3b7e, + 0x17cc2edb, 0x15422a57, 0x5a98b4c2, 0xaaa4490e, + 0xa0285d88, 0x6d5cda31, 0xc7f8933f, 0x228644a4, + }, + { + 0x186018c0, 0x238c2305, 0xc63fc67e, 0xe887e813, + 0x8726874c, 0xb8dab8a9, 0x01040108, 0x4f214f42, + 0x36d836ad, 0xa6a2a659, 0xd26fd2de, 0xf5f3f5fb, + 0x79f979ef, 0x6fa16f5f, 0x917e91fc, 0x525552aa, + 0x609d6027, 0xbccabc89, 0x9b569bac, 0x8e028e04, + 0xa3b6a371, 0x0c300c60, 0x7bf17bff, 0x35d435b5, + 0x1d741de8, 0xe0a7e053, 0xd77bd7f6, 0xc22fc25e, + 0x2eb82e6d, 0x4b314b62, 0xfedffea3, 0x57415782, + 0x155415a8, 0x77c1779f, 0x37dc37a5, 0xe5b3e57b, + 0x9f469f8c, 0xf0e7f0d3, 0x4a354a6a, 0xda4fda9e, + 0x587d58fa, 0xc903c906, 0x29a42955, 0x0a280a50, + 0xb1feb1e1, 0xa0baa069, 0x6bb16b7f, 0x852e855c, + 0xbdcebd81, 0x5d695dd2, 0x10401080, 0xf4f7f4f3, + 0xcb0bcb16, 0x3ef83eed, 0x05140528, 0x6781671f, + 0xe4b7e473, 0x279c2725, 0x41194132, 0x8b168b2c, + 0xa7a6a751, 0x7de97dcf, 0x956e95dc, 0xd847d88e, + 0xfbcbfb8b, 0xee9fee23, 0x7ced7cc7, 0x66856617, + 0xdd53dda6, 0x175c17b8, 0x47014702, 0x9e429e84, + 0xca0fca1e, 0x2db42d75, 0xbfc6bf91, 0x071c0738, + 0xad8ead01, 0x5a755aea, 0x8336836c, 0x33cc3385, + 0x6391633f, 0x02080210, 0xaa92aa39, 0x71d971af, + 0xc807c80e, 0x196419c8, 0x49394972, 0xd943d986, + 0xf2eff2c3, 0xe3abe34b, 0x5b715be2, 0x881a8834, + 0x9a529aa4, 0x2698262d, 0x32c8328d, 0xb0fab0e9, + 0xe983e91b, 0x0f3c0f78, 0xd573d5e6, 0x803a8074, + 0xbec2be99, 0xcd13cd26, 0x34d034bd, 0x483d487a, + 0xffdbffab, 0x7af57af7, 0x907a90f4, 0x5f615fc2, + 0x2080201d, 0x68bd6867, 0x1a681ad0, 0xae82ae19, + 0xb4eab4c9, 0x544d549a, 0x937693ec, 0x2288220d, + 0x648d6407, 0xf1e3f1db, 0x73d173bf, 0x12481290, + 0x401d403a, 0x08200840, 0xc32bc356, 0xec97ec33, + 0xdb4bdb96, 0xa1bea161, 0x8d0e8d1c, 0x3df43df5, + 0x976697cc, 0x00000000, 0xcf1bcf36, 0x2bac2b45, + 0x76c57697, 0x82328264, 0xd67fd6fe, 0x1b6c1bd8, + 0xb5eeb5c1, 0xaf86af11, 0x6ab56a77, 0x505d50ba, + 0x45094512, 0xf3ebf3cb, 0x30c0309d, 0xef9bef2b, + 0x3ffc3fe5, 0x55495592, 0xa2b2a279, 0xea8fea03, + 0x6589650f, 0xbad2bab9, 0x2fbc2f65, 0xc027c04e, + 0xde5fdebe, 0x1c701ce0, 0xfdd3fdbb, 0x4d294d52, + 0x927292e4, 0x75c9758f, 0x06180630, 0x8a128a24, + 0xb2f2b2f9, 0xe6bfe663, 0x0e380e70, 0x1f7c1ff8, + 0x62956237, 0xd477d4ee, 0xa89aa829, 0x966296c4, + 0xf9c3f99b, 0xc533c566, 0x25942535, 0x597959f2, + 0x842a8454, 0x72d572b7, 0x39e439d5, 0x4c2d4c5a, + 0x5e655eca, 0x78fd78e7, 0x38e038dd, 0x8c0a8c14, + 0xd163d1c6, 0xa5aea541, 0xe2afe243, 0x6199612f, + 0xb3f6b3f1, 0x21842115, 0x9c4a9c94, 0x1e781ef0, + 0x43114322, 0xc73bc776, 0xfcd7fcb3, 0x04100420, + 0x515951b2, 0x995e99bc, 0x6da96d4f, 0x0d340d68, + 0xfacffa83, 0xdf5bdfb6, 0x7ee57ed7, 0x2490243d, + 0x3bec3bc5, 0xab96ab31, 0xce1fce3e, 0x11441188, + 0x8f068f0c, 0x4e254e4a, 0xb7e6b7d1, 0xeb8beb0b, + 0x3cf03cfd, 0x813e817c, 0x946a94d4, 0xf7fbf7eb, + 0xb9deb9a1, 0x134c1398, 0x2cb02c7d, 0xd36bd3d6, + 0xe7bbe76b, 0x6ea56e57, 0xc437c46e, 0x030c0318, + 0x5645568a, 0x440d441a, 0x7fe17fdf, 0xa99ea921, + 0x2aa82a4d, 0xbbd6bbb1, 0xc123c146, 0x535153a2, + 0xdc57dcae, 0x0b2c0b58, 0x9d4e9d9c, 0x6cad6c47, + 0x31c43195, 0x74cd7487, 0xf6fff6e3, 0x4605460a, + 0xac8aac09, 0x891e893c, 0x145014a0, 0xe1a3e15b, + 0x165816b0, 0x3ae83acd, 0x69b9696f, 0x09240948, + 0x70dd70a7, 0xb6e2b6d9, 0xd067d0ce, 0xed93ed3b, + 0xcc17cc2e, 0x4215422a, 0x985a98b4, 0xa4aaa449, + 0x28a0285d, 0x5c6d5cda, 0xf8c7f893, 0x86228644, + } +}; + +__constant u32 Cl[8][256] = +{ + { + 0xc07830d8, 0x05af4626, 0x7ef991b8, 0x136fcdfb, + 0x4ca113cb, 0xa9626d11, 0x08050209, 0x426e9e0d, + 0xadee6c9b, 0x590451ff, 0xdebdb90c, 0xfb06f70e, + 0xef80f296, 0x5fcede30, 0xfcef3f6d, 0xaa07a4f8, + 0x27fdc047, 0x89766535, 0xaccd2b37, 0x048c018a, + 0x71155bd2, 0x603c186c, 0xff8af684, 0xb5e16a80, + 0xe8693af5, 0x5347ddb3, 0xf6acb321, 0x5eed999c, + 0x6d965c43, 0x627a9629, 0xa321e15d, 0x8216aed5, + 0xa8412abd, 0x9fb6eee8, 0xa5eb6e92, 0x7b56d79e, + 0x8cd92313, 0xd317fd23, 0x6a7f9420, 0x9e95a944, + 0xfa25b0a2, 0x06ca8fcf, 0x558d527c, 0x5022145a, + 0xe14f7f50, 0x691a5dc9, 0x7fdad614, 0x5cab17d9, + 0x8173673c, 0xd234ba8f, 0x80502090, 0xf303f507, + 0x16c08bdd, 0xedc67cd3, 0x28110a2d, 0x1fe6ce78, + 0x7353d597, 0x25bb4e02, 0x32588273, 0x2c9d0ba7, + 0x510153f6, 0xcf94fab2, 0xdcfb3749, 0x8e9fad56, + 0x8b30eb70, 0x2371c1cd, 0xc791f8bb, 0x17e3cc71, + 0xa68ea77b, 0xb84b2eaf, 0x02468e45, 0x84dc211a, + 0x1ec589d4, 0x75995a58, 0x9179632e, 0x381b0e3f, + 0x012347ac, 0xea2fb4b0, 0x6cb51bef, 0x85ff66b6, + 0x3ff2c65c, 0x100a0412, 0x39384993, 0xafa8e2de, + 0x0ecf8dc6, 0xc87d32d1, 0x7270923b, 0x869aaf5f, + 0xc31df931, 0x4b48dba8, 0xe22ab6b9, 0x34920dbc, + 0xa4c8293e, 0x2dbe4c0b, 0x8dfa64bf, 0xe94a7d59, + 0x1b6acff2, 0x78331e77, 0xe6a6b733, 0x74ba1df4, + 0x997c6127, 0x26de87eb, 0xbde46889, 0x7a759032, + 0xab24e354, 0xf78ff48d, 0xf4ea3d64, 0xc23ebe9d, + 0x1da0403d, 0x67d5d00f, 0xd07234ca, 0x192c41b7, + 0xc95e757d, 0x9a19a8ce, 0xece53b7f, 0x0daa442f, + 0x07e9c863, 0xdb12ff2a, 0xbfa2e6cc, 0x905a2482, + 0x3a5d807a, 0x40281048, 0x56e89b95, 0x337bc5df, + 0x9690ab4d, 0x611f5fc0, 0x1c830791, 0xf5c97ac8, + 0xccf1335b, 0x00000000, 0x36d483f9, 0x4587566e, + 0x97b3ece1, 0x64b019e6, 0xfea9b128, 0xd87736c3, + 0xc15b7774, 0x112943be, 0x77dfd41d, 0xba0da0ea, + 0x124c8a57, 0xcb18fb38, 0x9df060ad, 0x2b74c3c4, + 0xe5c37eda, 0x921caac7, 0x791059db, 0x0365c9e9, + 0x0fecca6a, 0xb9686903, 0x65935e4a, 0x4ee79d8e, + 0xbe81a160, 0xe06c38fc, 0xbb2ee746, 0x52649a1f, + 0xe4e03976, 0x8fbceafa, 0x301e0c36, 0x249809ae, + 0xf940794b, 0x6359d185, 0x70361c7e, 0xf8633ee7, + 0x37f7c455, 0xeea3b53a, 0x29324d81, 0xc4f43152, + 0x9b3aef62, 0x66f697a3, 0x35b14a10, 0xf220b2ab, + 0x54ae15d0, 0xb7a7e4c5, 0xd5dd72ec, 0x5a619816, + 0xca3bbc94, 0xe785f09f, 0xddd870e5, 0x14860598, + 0xc6b2bf17, 0x410b57e4, 0x434dd9a1, 0x2ff8c24e, + 0xf1457b42, 0x15a54234, 0x94d62508, 0xf0663cee, + 0x22528661, 0x76fc93b1, 0xb32be54f, 0x20140824, + 0xb208a2e3, 0xbcc72f25, 0x4fc4da22, 0x68391a65, + 0x8335e979, 0xb684a369, 0xd79bfca9, 0x3db44819, + 0xc5d776fe, 0x313d4b9a, 0x3ed181f0, 0x88552299, + 0x0c890383, 0x4a6b9c04, 0xd1517366, 0x0b60cbe0, + 0xfdcc78c1, 0x7cbf1ffd, 0xd4fe3540, 0xeb0cf31c, + 0xa1676f18, 0x985f268b, 0x7d9c5851, 0xd6b8bb05, + 0x6b5cd38c, 0x57cbdc39, 0x6ef395aa, 0x180f061b, + 0x8a13acdc, 0x1a49885e, 0xdf9efea0, 0x21374f88, + 0x4d825467, 0xb16d6b0a, 0x46e29f87, 0xa202a6f1, + 0xae8ba572, 0x58271653, 0x9cd32701, 0x47c1d82b, + 0x95f562a4, 0x87b9e8f3, 0xe309f115, 0x0a438c4c, + 0x092645a5, 0x3c970fb5, 0xa04428b4, 0x5b42dfba, + 0xb04e2ca6, 0xcdd274f7, 0x6fd0d206, 0x482d1241, + 0xa7ade0d7, 0xd954716f, 0xceb7bd1e, 0x3b7ec7d6, + 0x2edb85e2, 0x2a578468, 0xb4c22d2c, 0x490e55ed, + 0x5d885075, 0xda31b886, 0x933fed6b, 0x44a411c2, + }, + { + 0x18c07830, 0x2305af46, 0xc67ef991, 0xe8136fcd, + 0x874ca113, 0xb8a9626d, 0x01080502, 0x4f426e9e, + 0x36adee6c, 0xa6590451, 0xd2debdb9, 0xf5fb06f7, + 0x79ef80f2, 0x6f5fcede, 0x91fcef3f, 0x52aa07a4, + 0x6027fdc0, 0xbc897665, 0x9baccd2b, 0x8e048c01, + 0xa371155b, 0x0c603c18, 0x7bff8af6, 0x35b5e16a, + 0x1de8693a, 0xe05347dd, 0xd7f6acb3, 0xc25eed99, + 0x2e6d965c, 0x4b627a96, 0xfea321e1, 0x578216ae, + 0x15a8412a, 0x779fb6ee, 0x37a5eb6e, 0xe57b56d7, + 0x9f8cd923, 0xf0d317fd, 0x4a6a7f94, 0xda9e95a9, + 0x58fa25b0, 0xc906ca8f, 0x29558d52, 0x0a502214, + 0xb1e14f7f, 0xa0691a5d, 0x6b7fdad6, 0x855cab17, + 0xbd817367, 0x5dd234ba, 0x10805020, 0xf4f303f5, + 0xcb16c08b, 0x3eedc67c, 0x0528110a, 0x671fe6ce, + 0xe47353d5, 0x2725bb4e, 0x41325882, 0x8b2c9d0b, + 0xa7510153, 0x7dcf94fa, 0x95dcfb37, 0xd88e9fad, + 0xfb8b30eb, 0xee2371c1, 0x7cc791f8, 0x6617e3cc, + 0xdda68ea7, 0x17b84b2e, 0x4702468e, 0x9e84dc21, + 0xca1ec589, 0x2d75995a, 0xbf917963, 0x07381b0e, + 0xad012347, 0x5aea2fb4, 0x836cb51b, 0x3385ff66, + 0x633ff2c6, 0x02100a04, 0xaa393849, 0x71afa8e2, + 0xc80ecf8d, 0x19c87d32, 0x49727092, 0xd9869aaf, + 0xf2c31df9, 0xe34b48db, 0x5be22ab6, 0x8834920d, + 0x9aa4c829, 0x262dbe4c, 0x328dfa64, 0xb0e94a7d, + 0xe91b6acf, 0x0f78331e, 0xd5e6a6b7, 0x8074ba1d, + 0xbe997c61, 0xcd26de87, 0x34bde468, 0x487a7590, + 0xffab24e3, 0x7af78ff4, 0x90f4ea3d, 0x5fc23ebe, + 0x201da040, 0x6867d5d0, 0x1ad07234, 0xae192c41, + 0xb4c95e75, 0x549a19a8, 0x93ece53b, 0x220daa44, + 0x6407e9c8, 0xf1db12ff, 0x73bfa2e6, 0x12905a24, + 0x403a5d80, 0x08402810, 0xc356e89b, 0xec337bc5, + 0xdb9690ab, 0xa1611f5f, 0x8d1c8307, 0x3df5c97a, + 0x97ccf133, 0x00000000, 0xcf36d483, 0x2b458756, + 0x7697b3ec, 0x8264b019, 0xd6fea9b1, 0x1bd87736, + 0xb5c15b77, 0xaf112943, 0x6a77dfd4, 0x50ba0da0, + 0x45124c8a, 0xf3cb18fb, 0x309df060, 0xef2b74c3, + 0x3fe5c37e, 0x55921caa, 0xa2791059, 0xea0365c9, + 0x650fecca, 0xbab96869, 0x2f65935e, 0xc04ee79d, + 0xdebe81a1, 0x1ce06c38, 0xfdbb2ee7, 0x4d52649a, + 0x92e4e039, 0x758fbcea, 0x06301e0c, 0x8a249809, + 0xb2f94079, 0xe66359d1, 0x0e70361c, 0x1ff8633e, + 0x6237f7c4, 0xd4eea3b5, 0xa829324d, 0x96c4f431, + 0xf99b3aef, 0xc566f697, 0x2535b14a, 0x59f220b2, + 0x8454ae15, 0x72b7a7e4, 0x39d5dd72, 0x4c5a6198, + 0x5eca3bbc, 0x78e785f0, 0x38ddd870, 0x8c148605, + 0xd1c6b2bf, 0xa5410b57, 0xe2434dd9, 0x612ff8c2, + 0xb3f1457b, 0x2115a542, 0x9c94d625, 0x1ef0663c, + 0x43225286, 0xc776fc93, 0xfcb32be5, 0x04201408, + 0x51b208a2, 0x99bcc72f, 0x6d4fc4da, 0x0d68391a, + 0xfa8335e9, 0xdfb684a3, 0x7ed79bfc, 0x243db448, + 0x3bc5d776, 0xab313d4b, 0xce3ed181, 0x11885522, + 0x8f0c8903, 0x4e4a6b9c, 0xb7d15173, 0xeb0b60cb, + 0x3cfdcc78, 0x817cbf1f, 0x94d4fe35, 0xf7eb0cf3, + 0xb9a1676f, 0x13985f26, 0x2c7d9c58, 0xd3d6b8bb, + 0xe76b5cd3, 0x6e57cbdc, 0xc46ef395, 0x03180f06, + 0x568a13ac, 0x441a4988, 0x7fdf9efe, 0xa921374f, + 0x2a4d8254, 0xbbb16d6b, 0xc146e29f, 0x53a202a6, + 0xdcae8ba5, 0x0b582716, 0x9d9cd327, 0x6c47c1d8, + 0x3195f562, 0x7487b9e8, 0xf6e309f1, 0x460a438c, + 0xac092645, 0x893c970f, 0x14a04428, 0xe15b42df, + 0x16b04e2c, 0x3acdd274, 0x696fd0d2, 0x09482d12, + 0x70a7ade0, 0xb6d95471, 0xd0ceb7bd, 0xed3b7ec7, + 0xcc2edb85, 0x422a5784, 0x98b4c22d, 0xa4490e55, + 0x285d8850, 0x5cda31b8, 0xf8933fed, 0x8644a411, + }, + { + 0x6018c078, 0x8c2305af, 0x3fc67ef9, 0x87e8136f, + 0x26874ca1, 0xdab8a962, 0x04010805, 0x214f426e, + 0xd836adee, 0xa2a65904, 0x6fd2debd, 0xf3f5fb06, + 0xf979ef80, 0xa16f5fce, 0x7e91fcef, 0x5552aa07, + 0x9d6027fd, 0xcabc8976, 0x569baccd, 0x028e048c, + 0xb6a37115, 0x300c603c, 0xf17bff8a, 0xd435b5e1, + 0x741de869, 0xa7e05347, 0x7bd7f6ac, 0x2fc25eed, + 0xb82e6d96, 0x314b627a, 0xdffea321, 0x41578216, + 0x5415a841, 0xc1779fb6, 0xdc37a5eb, 0xb3e57b56, + 0x469f8cd9, 0xe7f0d317, 0x354a6a7f, 0x4fda9e95, + 0x7d58fa25, 0x03c906ca, 0xa429558d, 0x280a5022, + 0xfeb1e14f, 0xbaa0691a, 0xb16b7fda, 0x2e855cab, + 0xcebd8173, 0x695dd234, 0x40108050, 0xf7f4f303, + 0x0bcb16c0, 0xf83eedc6, 0x14052811, 0x81671fe6, + 0xb7e47353, 0x9c2725bb, 0x19413258, 0x168b2c9d, + 0xa6a75101, 0xe97dcf94, 0x6e95dcfb, 0x47d88e9f, + 0xcbfb8b30, 0x9fee2371, 0xed7cc791, 0x856617e3, + 0x53dda68e, 0x5c17b84b, 0x01470246, 0x429e84dc, + 0x0fca1ec5, 0xb42d7599, 0xc6bf9179, 0x1c07381b, + 0x8ead0123, 0x755aea2f, 0x36836cb5, 0xcc3385ff, + 0x91633ff2, 0x0802100a, 0x92aa3938, 0xd971afa8, + 0x07c80ecf, 0x6419c87d, 0x39497270, 0x43d9869a, + 0xeff2c31d, 0xabe34b48, 0x715be22a, 0x1a883492, + 0x529aa4c8, 0x98262dbe, 0xc8328dfa, 0xfab0e94a, + 0x83e91b6a, 0x3c0f7833, 0x73d5e6a6, 0x3a8074ba, + 0xc2be997c, 0x13cd26de, 0xd034bde4, 0x3d487a75, + 0xdbffab24, 0xf57af78f, 0x7a90f4ea, 0x615fc23e, + 0x80201da0, 0xbd6867d5, 0x681ad072, 0x82ae192c, + 0xeab4c95e, 0x4d549a19, 0x7693ece5, 0x88220daa, + 0x8d6407e9, 0xe3f1db12, 0xd173bfa2, 0x4812905a, + 0x1d403a5d, 0x20084028, 0x2bc356e8, 0x97ec337b, + 0x4bdb9690, 0xbea1611f, 0x0e8d1c83, 0xf43df5c9, + 0x6697ccf1, 0x00000000, 0x1bcf36d4, 0xac2b4587, + 0xc57697b3, 0x328264b0, 0x7fd6fea9, 0x6c1bd877, + 0xeeb5c15b, 0x86af1129, 0xb56a77df, 0x5d50ba0d, + 0x0945124c, 0xebf3cb18, 0xc0309df0, 0x9bef2b74, + 0xfc3fe5c3, 0x4955921c, 0xb2a27910, 0x8fea0365, + 0x89650fec, 0xd2bab968, 0xbc2f6593, 0x27c04ee7, + 0x5fdebe81, 0x701ce06c, 0xd3fdbb2e, 0x294d5264, + 0x7292e4e0, 0xc9758fbc, 0x1806301e, 0x128a2498, + 0xf2b2f940, 0xbfe66359, 0x380e7036, 0x7c1ff863, + 0x956237f7, 0x77d4eea3, 0x9aa82932, 0x6296c4f4, + 0xc3f99b3a, 0x33c566f6, 0x942535b1, 0x7959f220, + 0x2a8454ae, 0xd572b7a7, 0xe439d5dd, 0x2d4c5a61, + 0x655eca3b, 0xfd78e785, 0xe038ddd8, 0x0a8c1486, + 0x63d1c6b2, 0xaea5410b, 0xafe2434d, 0x99612ff8, + 0xf6b3f145, 0x842115a5, 0x4a9c94d6, 0x781ef066, + 0x11432252, 0x3bc776fc, 0xd7fcb32b, 0x10042014, + 0x5951b208, 0x5e99bcc7, 0xa96d4fc4, 0x340d6839, + 0xcffa8335, 0x5bdfb684, 0xe57ed79b, 0x90243db4, + 0xec3bc5d7, 0x96ab313d, 0x1fce3ed1, 0x44118855, + 0x068f0c89, 0x254e4a6b, 0xe6b7d151, 0x8beb0b60, + 0xf03cfdcc, 0x3e817cbf, 0x6a94d4fe, 0xfbf7eb0c, + 0xdeb9a167, 0x4c13985f, 0xb02c7d9c, 0x6bd3d6b8, + 0xbbe76b5c, 0xa56e57cb, 0x37c46ef3, 0x0c03180f, + 0x45568a13, 0x0d441a49, 0xe17fdf9e, 0x9ea92137, + 0xa82a4d82, 0xd6bbb16d, 0x23c146e2, 0x5153a202, + 0x57dcae8b, 0x2c0b5827, 0x4e9d9cd3, 0xad6c47c1, + 0xc43195f5, 0xcd7487b9, 0xfff6e309, 0x05460a43, + 0x8aac0926, 0x1e893c97, 0x5014a044, 0xa3e15b42, + 0x5816b04e, 0xe83acdd2, 0xb9696fd0, 0x2409482d, + 0xdd70a7ad, 0xe2b6d954, 0x67d0ceb7, 0x93ed3b7e, + 0x17cc2edb, 0x15422a57, 0x5a98b4c2, 0xaaa4490e, + 0xa0285d88, 0x6d5cda31, 0xc7f8933f, 0x228644a4, + }, + { + 0x186018c0, 0x238c2305, 0xc63fc67e, 0xe887e813, + 0x8726874c, 0xb8dab8a9, 0x01040108, 0x4f214f42, + 0x36d836ad, 0xa6a2a659, 0xd26fd2de, 0xf5f3f5fb, + 0x79f979ef, 0x6fa16f5f, 0x917e91fc, 0x525552aa, + 0x609d6027, 0xbccabc89, 0x9b569bac, 0x8e028e04, + 0xa3b6a371, 0x0c300c60, 0x7bf17bff, 0x35d435b5, + 0x1d741de8, 0xe0a7e053, 0xd77bd7f6, 0xc22fc25e, + 0x2eb82e6d, 0x4b314b62, 0xfedffea3, 0x57415782, + 0x155415a8, 0x77c1779f, 0x37dc37a5, 0xe5b3e57b, + 0x9f469f8c, 0xf0e7f0d3, 0x4a354a6a, 0xda4fda9e, + 0x587d58fa, 0xc903c906, 0x29a42955, 0x0a280a50, + 0xb1feb1e1, 0xa0baa069, 0x6bb16b7f, 0x852e855c, + 0xbdcebd81, 0x5d695dd2, 0x10401080, 0xf4f7f4f3, + 0xcb0bcb16, 0x3ef83eed, 0x05140528, 0x6781671f, + 0xe4b7e473, 0x279c2725, 0x41194132, 0x8b168b2c, + 0xa7a6a751, 0x7de97dcf, 0x956e95dc, 0xd847d88e, + 0xfbcbfb8b, 0xee9fee23, 0x7ced7cc7, 0x66856617, + 0xdd53dda6, 0x175c17b8, 0x47014702, 0x9e429e84, + 0xca0fca1e, 0x2db42d75, 0xbfc6bf91, 0x071c0738, + 0xad8ead01, 0x5a755aea, 0x8336836c, 0x33cc3385, + 0x6391633f, 0x02080210, 0xaa92aa39, 0x71d971af, + 0xc807c80e, 0x196419c8, 0x49394972, 0xd943d986, + 0xf2eff2c3, 0xe3abe34b, 0x5b715be2, 0x881a8834, + 0x9a529aa4, 0x2698262d, 0x32c8328d, 0xb0fab0e9, + 0xe983e91b, 0x0f3c0f78, 0xd573d5e6, 0x803a8074, + 0xbec2be99, 0xcd13cd26, 0x34d034bd, 0x483d487a, + 0xffdbffab, 0x7af57af7, 0x907a90f4, 0x5f615fc2, + 0x2080201d, 0x68bd6867, 0x1a681ad0, 0xae82ae19, + 0xb4eab4c9, 0x544d549a, 0x937693ec, 0x2288220d, + 0x648d6407, 0xf1e3f1db, 0x73d173bf, 0x12481290, + 0x401d403a, 0x08200840, 0xc32bc356, 0xec97ec33, + 0xdb4bdb96, 0xa1bea161, 0x8d0e8d1c, 0x3df43df5, + 0x976697cc, 0x00000000, 0xcf1bcf36, 0x2bac2b45, + 0x76c57697, 0x82328264, 0xd67fd6fe, 0x1b6c1bd8, + 0xb5eeb5c1, 0xaf86af11, 0x6ab56a77, 0x505d50ba, + 0x45094512, 0xf3ebf3cb, 0x30c0309d, 0xef9bef2b, + 0x3ffc3fe5, 0x55495592, 0xa2b2a279, 0xea8fea03, + 0x6589650f, 0xbad2bab9, 0x2fbc2f65, 0xc027c04e, + 0xde5fdebe, 0x1c701ce0, 0xfdd3fdbb, 0x4d294d52, + 0x927292e4, 0x75c9758f, 0x06180630, 0x8a128a24, + 0xb2f2b2f9, 0xe6bfe663, 0x0e380e70, 0x1f7c1ff8, + 0x62956237, 0xd477d4ee, 0xa89aa829, 0x966296c4, + 0xf9c3f99b, 0xc533c566, 0x25942535, 0x597959f2, + 0x842a8454, 0x72d572b7, 0x39e439d5, 0x4c2d4c5a, + 0x5e655eca, 0x78fd78e7, 0x38e038dd, 0x8c0a8c14, + 0xd163d1c6, 0xa5aea541, 0xe2afe243, 0x6199612f, + 0xb3f6b3f1, 0x21842115, 0x9c4a9c94, 0x1e781ef0, + 0x43114322, 0xc73bc776, 0xfcd7fcb3, 0x04100420, + 0x515951b2, 0x995e99bc, 0x6da96d4f, 0x0d340d68, + 0xfacffa83, 0xdf5bdfb6, 0x7ee57ed7, 0x2490243d, + 0x3bec3bc5, 0xab96ab31, 0xce1fce3e, 0x11441188, + 0x8f068f0c, 0x4e254e4a, 0xb7e6b7d1, 0xeb8beb0b, + 0x3cf03cfd, 0x813e817c, 0x946a94d4, 0xf7fbf7eb, + 0xb9deb9a1, 0x134c1398, 0x2cb02c7d, 0xd36bd3d6, + 0xe7bbe76b, 0x6ea56e57, 0xc437c46e, 0x030c0318, + 0x5645568a, 0x440d441a, 0x7fe17fdf, 0xa99ea921, + 0x2aa82a4d, 0xbbd6bbb1, 0xc123c146, 0x535153a2, + 0xdc57dcae, 0x0b2c0b58, 0x9d4e9d9c, 0x6cad6c47, + 0x31c43195, 0x74cd7487, 0xf6fff6e3, 0x4605460a, + 0xac8aac09, 0x891e893c, 0x145014a0, 0xe1a3e15b, + 0x165816b0, 0x3ae83acd, 0x69b9696f, 0x09240948, + 0x70dd70a7, 0xb6e2b6d9, 0xd067d0ce, 0xed93ed3b, + 0xcc17cc2e, 0x4215422a, 0x985a98b4, 0xa4aaa449, + 0x28a0285d, 0x5c6d5cda, 0xf8c7f893, 0x86228644, + }, + { + 0x18186018, 0x23238c23, 0xc6c63fc6, 0xe8e887e8, + 0x87872687, 0xb8b8dab8, 0x01010401, 0x4f4f214f, + 0x3636d836, 0xa6a6a2a6, 0xd2d26fd2, 0xf5f5f3f5, + 0x7979f979, 0x6f6fa16f, 0x91917e91, 0x52525552, + 0x60609d60, 0xbcbccabc, 0x9b9b569b, 0x8e8e028e, + 0xa3a3b6a3, 0x0c0c300c, 0x7b7bf17b, 0x3535d435, + 0x1d1d741d, 0xe0e0a7e0, 0xd7d77bd7, 0xc2c22fc2, + 0x2e2eb82e, 0x4b4b314b, 0xfefedffe, 0x57574157, + 0x15155415, 0x7777c177, 0x3737dc37, 0xe5e5b3e5, + 0x9f9f469f, 0xf0f0e7f0, 0x4a4a354a, 0xdada4fda, + 0x58587d58, 0xc9c903c9, 0x2929a429, 0x0a0a280a, + 0xb1b1feb1, 0xa0a0baa0, 0x6b6bb16b, 0x85852e85, + 0xbdbdcebd, 0x5d5d695d, 0x10104010, 0xf4f4f7f4, + 0xcbcb0bcb, 0x3e3ef83e, 0x05051405, 0x67678167, + 0xe4e4b7e4, 0x27279c27, 0x41411941, 0x8b8b168b, + 0xa7a7a6a7, 0x7d7de97d, 0x95956e95, 0xd8d847d8, + 0xfbfbcbfb, 0xeeee9fee, 0x7c7ced7c, 0x66668566, + 0xdddd53dd, 0x17175c17, 0x47470147, 0x9e9e429e, + 0xcaca0fca, 0x2d2db42d, 0xbfbfc6bf, 0x07071c07, + 0xadad8ead, 0x5a5a755a, 0x83833683, 0x3333cc33, + 0x63639163, 0x02020802, 0xaaaa92aa, 0x7171d971, + 0xc8c807c8, 0x19196419, 0x49493949, 0xd9d943d9, + 0xf2f2eff2, 0xe3e3abe3, 0x5b5b715b, 0x88881a88, + 0x9a9a529a, 0x26269826, 0x3232c832, 0xb0b0fab0, + 0xe9e983e9, 0x0f0f3c0f, 0xd5d573d5, 0x80803a80, + 0xbebec2be, 0xcdcd13cd, 0x3434d034, 0x48483d48, + 0xffffdbff, 0x7a7af57a, 0x90907a90, 0x5f5f615f, + 0x20208020, 0x6868bd68, 0x1a1a681a, 0xaeae82ae, + 0xb4b4eab4, 0x54544d54, 0x93937693, 0x22228822, + 0x64648d64, 0xf1f1e3f1, 0x7373d173, 0x12124812, + 0x40401d40, 0x08082008, 0xc3c32bc3, 0xecec97ec, + 0xdbdb4bdb, 0xa1a1bea1, 0x8d8d0e8d, 0x3d3df43d, + 0x97976697, 0x00000000, 0xcfcf1bcf, 0x2b2bac2b, + 0x7676c576, 0x82823282, 0xd6d67fd6, 0x1b1b6c1b, + 0xb5b5eeb5, 0xafaf86af, 0x6a6ab56a, 0x50505d50, + 0x45450945, 0xf3f3ebf3, 0x3030c030, 0xefef9bef, + 0x3f3ffc3f, 0x55554955, 0xa2a2b2a2, 0xeaea8fea, + 0x65658965, 0xbabad2ba, 0x2f2fbc2f, 0xc0c027c0, + 0xdede5fde, 0x1c1c701c, 0xfdfdd3fd, 0x4d4d294d, + 0x92927292, 0x7575c975, 0x06061806, 0x8a8a128a, + 0xb2b2f2b2, 0xe6e6bfe6, 0x0e0e380e, 0x1f1f7c1f, + 0x62629562, 0xd4d477d4, 0xa8a89aa8, 0x96966296, + 0xf9f9c3f9, 0xc5c533c5, 0x25259425, 0x59597959, + 0x84842a84, 0x7272d572, 0x3939e439, 0x4c4c2d4c, + 0x5e5e655e, 0x7878fd78, 0x3838e038, 0x8c8c0a8c, + 0xd1d163d1, 0xa5a5aea5, 0xe2e2afe2, 0x61619961, + 0xb3b3f6b3, 0x21218421, 0x9c9c4a9c, 0x1e1e781e, + 0x43431143, 0xc7c73bc7, 0xfcfcd7fc, 0x04041004, + 0x51515951, 0x99995e99, 0x6d6da96d, 0x0d0d340d, + 0xfafacffa, 0xdfdf5bdf, 0x7e7ee57e, 0x24249024, + 0x3b3bec3b, 0xabab96ab, 0xcece1fce, 0x11114411, + 0x8f8f068f, 0x4e4e254e, 0xb7b7e6b7, 0xebeb8beb, + 0x3c3cf03c, 0x81813e81, 0x94946a94, 0xf7f7fbf7, + 0xb9b9deb9, 0x13134c13, 0x2c2cb02c, 0xd3d36bd3, + 0xe7e7bbe7, 0x6e6ea56e, 0xc4c437c4, 0x03030c03, + 0x56564556, 0x44440d44, 0x7f7fe17f, 0xa9a99ea9, + 0x2a2aa82a, 0xbbbbd6bb, 0xc1c123c1, 0x53535153, + 0xdcdc57dc, 0x0b0b2c0b, 0x9d9d4e9d, 0x6c6cad6c, + 0x3131c431, 0x7474cd74, 0xf6f6fff6, 0x46460546, + 0xacac8aac, 0x89891e89, 0x14145014, 0xe1e1a3e1, + 0x16165816, 0x3a3ae83a, 0x6969b969, 0x09092409, + 0x7070dd70, 0xb6b6e2b6, 0xd0d067d0, 0xeded93ed, + 0xcccc17cc, 0x42421542, 0x98985a98, 0xa4a4aaa4, + 0x2828a028, 0x5c5c6d5c, 0xf8f8c7f8, 0x86862286, + }, + { + 0xd8181860, 0x2623238c, 0xb8c6c63f, 0xfbe8e887, + 0xcb878726, 0x11b8b8da, 0x09010104, 0x0d4f4f21, + 0x9b3636d8, 0xffa6a6a2, 0x0cd2d26f, 0x0ef5f5f3, + 0x967979f9, 0x306f6fa1, 0x6d91917e, 0xf8525255, + 0x4760609d, 0x35bcbcca, 0x379b9b56, 0x8a8e8e02, + 0xd2a3a3b6, 0x6c0c0c30, 0x847b7bf1, 0x803535d4, + 0xf51d1d74, 0xb3e0e0a7, 0x21d7d77b, 0x9cc2c22f, + 0x432e2eb8, 0x294b4b31, 0x5dfefedf, 0xd5575741, + 0xbd151554, 0xe87777c1, 0x923737dc, 0x9ee5e5b3, + 0x139f9f46, 0x23f0f0e7, 0x204a4a35, 0x44dada4f, + 0xa258587d, 0xcfc9c903, 0x7c2929a4, 0x5a0a0a28, + 0x50b1b1fe, 0xc9a0a0ba, 0x146b6bb1, 0xd985852e, + 0x3cbdbdce, 0x8f5d5d69, 0x90101040, 0x07f4f4f7, + 0xddcbcb0b, 0xd33e3ef8, 0x2d050514, 0x78676781, + 0x97e4e4b7, 0x0227279c, 0x73414119, 0xa78b8b16, + 0xf6a7a7a6, 0xb27d7de9, 0x4995956e, 0x56d8d847, + 0x70fbfbcb, 0xcdeeee9f, 0xbb7c7ced, 0x71666685, + 0x7bdddd53, 0xaf17175c, 0x45474701, 0x1a9e9e42, + 0xd4caca0f, 0x582d2db4, 0x2ebfbfc6, 0x3f07071c, + 0xacadad8e, 0xb05a5a75, 0xef838336, 0xb63333cc, + 0x5c636391, 0x12020208, 0x93aaaa92, 0xde7171d9, + 0xc6c8c807, 0xd1191964, 0x3b494939, 0x5fd9d943, + 0x31f2f2ef, 0xa8e3e3ab, 0xb95b5b71, 0xbc88881a, + 0x3e9a9a52, 0x0b262698, 0xbf3232c8, 0x59b0b0fa, + 0xf2e9e983, 0x770f0f3c, 0x33d5d573, 0xf480803a, + 0x27bebec2, 0xebcdcd13, 0x893434d0, 0x3248483d, + 0x54ffffdb, 0x8d7a7af5, 0x6490907a, 0x9d5f5f61, + 0x3d202080, 0x0f6868bd, 0xca1a1a68, 0xb7aeae82, + 0x7db4b4ea, 0xce54544d, 0x7f939376, 0x2f222288, + 0x6364648d, 0x2af1f1e3, 0xcc7373d1, 0x82121248, + 0x7a40401d, 0x48080820, 0x95c3c32b, 0xdfecec97, + 0x4ddbdb4b, 0xc0a1a1be, 0x918d8d0e, 0xc83d3df4, + 0x5b979766, 0x00000000, 0xf9cfcf1b, 0x6e2b2bac, + 0xe17676c5, 0xe6828232, 0x28d6d67f, 0xc31b1b6c, + 0x74b5b5ee, 0xbeafaf86, 0x1d6a6ab5, 0xea50505d, + 0x57454509, 0x38f3f3eb, 0xad3030c0, 0xc4efef9b, + 0xda3f3ffc, 0xc7555549, 0xdba2a2b2, 0xe9eaea8f, + 0x6a656589, 0x03babad2, 0x4a2f2fbc, 0x8ec0c027, + 0x60dede5f, 0xfc1c1c70, 0x46fdfdd3, 0x1f4d4d29, + 0x76929272, 0xfa7575c9, 0x36060618, 0xae8a8a12, + 0x4bb2b2f2, 0x85e6e6bf, 0x7e0e0e38, 0xe71f1f7c, + 0x55626295, 0x3ad4d477, 0x81a8a89a, 0x52969662, + 0x62f9f9c3, 0xa3c5c533, 0x10252594, 0xab595979, + 0xd084842a, 0xc57272d5, 0xec3939e4, 0x164c4c2d, + 0x945e5e65, 0x9f7878fd, 0xe53838e0, 0x988c8c0a, + 0x17d1d163, 0xe4a5a5ae, 0xa1e2e2af, 0x4e616199, + 0x42b3b3f6, 0x34212184, 0x089c9c4a, 0xee1e1e78, + 0x61434311, 0xb1c7c73b, 0x4ffcfcd7, 0x24040410, + 0xe3515159, 0x2599995e, 0x226d6da9, 0x650d0d34, + 0x79fafacf, 0x69dfdf5b, 0xa97e7ee5, 0x19242490, + 0xfe3b3bec, 0x9aabab96, 0xf0cece1f, 0x99111144, + 0x838f8f06, 0x044e4e25, 0x66b7b7e6, 0xe0ebeb8b, + 0xc13c3cf0, 0xfd81813e, 0x4094946a, 0x1cf7f7fb, + 0x18b9b9de, 0x8b13134c, 0x512c2cb0, 0x05d3d36b, + 0x8ce7e7bb, 0x396e6ea5, 0xaac4c437, 0x1b03030c, + 0xdc565645, 0x5e44440d, 0xa07f7fe1, 0x88a9a99e, + 0x672a2aa8, 0x0abbbbd6, 0x87c1c123, 0xf1535351, + 0x72dcdc57, 0x530b0b2c, 0x019d9d4e, 0x2b6c6cad, + 0xa43131c4, 0xf37474cd, 0x15f6f6ff, 0x4c464605, + 0xa5acac8a, 0xb589891e, 0xb4141450, 0xbae1e1a3, + 0xa6161658, 0xf73a3ae8, 0x066969b9, 0x41090924, + 0xd77070dd, 0x6fb6b6e2, 0x1ed0d067, 0xd6eded93, + 0xe2cccc17, 0x68424215, 0x2c98985a, 0xeda4a4aa, + 0x752828a0, 0x865c5c6d, 0x6bf8f8c7, 0xc2868622, + }, + { + 0x30d81818, 0x46262323, 0x91b8c6c6, 0xcdfbe8e8, + 0x13cb8787, 0x6d11b8b8, 0x02090101, 0x9e0d4f4f, + 0x6c9b3636, 0x51ffa6a6, 0xb90cd2d2, 0xf70ef5f5, + 0xf2967979, 0xde306f6f, 0x3f6d9191, 0xa4f85252, + 0xc0476060, 0x6535bcbc, 0x2b379b9b, 0x018a8e8e, + 0x5bd2a3a3, 0x186c0c0c, 0xf6847b7b, 0x6a803535, + 0x3af51d1d, 0xddb3e0e0, 0xb321d7d7, 0x999cc2c2, + 0x5c432e2e, 0x96294b4b, 0xe15dfefe, 0xaed55757, + 0x2abd1515, 0xeee87777, 0x6e923737, 0xd79ee5e5, + 0x23139f9f, 0xfd23f0f0, 0x94204a4a, 0xa944dada, + 0xb0a25858, 0x8fcfc9c9, 0x527c2929, 0x145a0a0a, + 0x7f50b1b1, 0x5dc9a0a0, 0xd6146b6b, 0x17d98585, + 0x673cbdbd, 0xba8f5d5d, 0x20901010, 0xf507f4f4, + 0x8bddcbcb, 0x7cd33e3e, 0x0a2d0505, 0xce786767, + 0xd597e4e4, 0x4e022727, 0x82734141, 0x0ba78b8b, + 0x53f6a7a7, 0xfab27d7d, 0x37499595, 0xad56d8d8, + 0xeb70fbfb, 0xc1cdeeee, 0xf8bb7c7c, 0xcc716666, + 0xa77bdddd, 0x2eaf1717, 0x8e454747, 0x211a9e9e, + 0x89d4caca, 0x5a582d2d, 0x632ebfbf, 0x0e3f0707, + 0x47acadad, 0xb4b05a5a, 0x1bef8383, 0x66b63333, + 0xc65c6363, 0x04120202, 0x4993aaaa, 0xe2de7171, + 0x8dc6c8c8, 0x32d11919, 0x923b4949, 0xaf5fd9d9, + 0xf931f2f2, 0xdba8e3e3, 0xb6b95b5b, 0x0dbc8888, + 0x293e9a9a, 0x4c0b2626, 0x64bf3232, 0x7d59b0b0, + 0xcff2e9e9, 0x1e770f0f, 0xb733d5d5, 0x1df48080, + 0x6127bebe, 0x87ebcdcd, 0x68893434, 0x90324848, + 0xe354ffff, 0xf48d7a7a, 0x3d649090, 0xbe9d5f5f, + 0x403d2020, 0xd00f6868, 0x34ca1a1a, 0x41b7aeae, + 0x757db4b4, 0xa8ce5454, 0x3b7f9393, 0x442f2222, + 0xc8636464, 0xff2af1f1, 0xe6cc7373, 0x24821212, + 0x807a4040, 0x10480808, 0x9b95c3c3, 0xc5dfecec, + 0xab4ddbdb, 0x5fc0a1a1, 0x07918d8d, 0x7ac83d3d, + 0x335b9797, 0x00000000, 0x83f9cfcf, 0x566e2b2b, + 0xece17676, 0x19e68282, 0xb128d6d6, 0x36c31b1b, + 0x7774b5b5, 0x43beafaf, 0xd41d6a6a, 0xa0ea5050, + 0x8a574545, 0xfb38f3f3, 0x60ad3030, 0xc3c4efef, + 0x7eda3f3f, 0xaac75555, 0x59dba2a2, 0xc9e9eaea, + 0xca6a6565, 0x6903baba, 0x5e4a2f2f, 0x9d8ec0c0, + 0xa160dede, 0x38fc1c1c, 0xe746fdfd, 0x9a1f4d4d, + 0x39769292, 0xeafa7575, 0x0c360606, 0x09ae8a8a, + 0x794bb2b2, 0xd185e6e6, 0x1c7e0e0e, 0x3ee71f1f, + 0xc4556262, 0xb53ad4d4, 0x4d81a8a8, 0x31529696, + 0xef62f9f9, 0x97a3c5c5, 0x4a102525, 0xb2ab5959, + 0x15d08484, 0xe4c57272, 0x72ec3939, 0x98164c4c, + 0xbc945e5e, 0xf09f7878, 0x70e53838, 0x05988c8c, + 0xbf17d1d1, 0x57e4a5a5, 0xd9a1e2e2, 0xc24e6161, + 0x7b42b3b3, 0x42342121, 0x25089c9c, 0x3cee1e1e, + 0x86614343, 0x93b1c7c7, 0xe54ffcfc, 0x08240404, + 0xa2e35151, 0x2f259999, 0xda226d6d, 0x1a650d0d, + 0xe979fafa, 0xa369dfdf, 0xfca97e7e, 0x48192424, + 0x76fe3b3b, 0x4b9aabab, 0x81f0cece, 0x22991111, + 0x03838f8f, 0x9c044e4e, 0x7366b7b7, 0xcbe0ebeb, + 0x78c13c3c, 0x1ffd8181, 0x35409494, 0xf31cf7f7, + 0x6f18b9b9, 0x268b1313, 0x58512c2c, 0xbb05d3d3, + 0xd38ce7e7, 0xdc396e6e, 0x95aac4c4, 0x061b0303, + 0xacdc5656, 0x885e4444, 0xfea07f7f, 0x4f88a9a9, + 0x54672a2a, 0x6b0abbbb, 0x9f87c1c1, 0xa6f15353, + 0xa572dcdc, 0x16530b0b, 0x27019d9d, 0xd82b6c6c, + 0x62a43131, 0xe8f37474, 0xf115f6f6, 0x8c4c4646, + 0x45a5acac, 0x0fb58989, 0x28b41414, 0xdfbae1e1, + 0x2ca61616, 0x74f73a3a, 0xd2066969, 0x12410909, + 0xe0d77070, 0x716fb6b6, 0xbd1ed0d0, 0xc7d6eded, + 0x85e2cccc, 0x84684242, 0x2d2c9898, 0x55eda4a4, + 0x50752828, 0xb8865c5c, 0xed6bf8f8, 0x11c28686, + }, + { + 0x7830d818, 0xaf462623, 0xf991b8c6, 0x6fcdfbe8, + 0xa113cb87, 0x626d11b8, 0x05020901, 0x6e9e0d4f, + 0xee6c9b36, 0x0451ffa6, 0xbdb90cd2, 0x06f70ef5, + 0x80f29679, 0xcede306f, 0xef3f6d91, 0x07a4f852, + 0xfdc04760, 0x766535bc, 0xcd2b379b, 0x8c018a8e, + 0x155bd2a3, 0x3c186c0c, 0x8af6847b, 0xe16a8035, + 0x693af51d, 0x47ddb3e0, 0xacb321d7, 0xed999cc2, + 0x965c432e, 0x7a96294b, 0x21e15dfe, 0x16aed557, + 0x412abd15, 0xb6eee877, 0xeb6e9237, 0x56d79ee5, + 0xd923139f, 0x17fd23f0, 0x7f94204a, 0x95a944da, + 0x25b0a258, 0xca8fcfc9, 0x8d527c29, 0x22145a0a, + 0x4f7f50b1, 0x1a5dc9a0, 0xdad6146b, 0xab17d985, + 0x73673cbd, 0x34ba8f5d, 0x50209010, 0x03f507f4, + 0xc08bddcb, 0xc67cd33e, 0x110a2d05, 0xe6ce7867, + 0x53d597e4, 0xbb4e0227, 0x58827341, 0x9d0ba78b, + 0x0153f6a7, 0x94fab27d, 0xfb374995, 0x9fad56d8, + 0x30eb70fb, 0x71c1cdee, 0x91f8bb7c, 0xe3cc7166, + 0x8ea77bdd, 0x4b2eaf17, 0x468e4547, 0xdc211a9e, + 0xc589d4ca, 0x995a582d, 0x79632ebf, 0x1b0e3f07, + 0x2347acad, 0x2fb4b05a, 0xb51bef83, 0xff66b633, + 0xf2c65c63, 0x0a041202, 0x384993aa, 0xa8e2de71, + 0xcf8dc6c8, 0x7d32d119, 0x70923b49, 0x9aaf5fd9, + 0x1df931f2, 0x48dba8e3, 0x2ab6b95b, 0x920dbc88, + 0xc8293e9a, 0xbe4c0b26, 0xfa64bf32, 0x4a7d59b0, + 0x6acff2e9, 0x331e770f, 0xa6b733d5, 0xba1df480, + 0x7c6127be, 0xde87ebcd, 0xe4688934, 0x75903248, + 0x24e354ff, 0x8ff48d7a, 0xea3d6490, 0x3ebe9d5f, + 0xa0403d20, 0xd5d00f68, 0x7234ca1a, 0x2c41b7ae, + 0x5e757db4, 0x19a8ce54, 0xe53b7f93, 0xaa442f22, + 0xe9c86364, 0x12ff2af1, 0xa2e6cc73, 0x5a248212, + 0x5d807a40, 0x28104808, 0xe89b95c3, 0x7bc5dfec, + 0x90ab4ddb, 0x1f5fc0a1, 0x8307918d, 0xc97ac83d, + 0xf1335b97, 0x00000000, 0xd483f9cf, 0x87566e2b, + 0xb3ece176, 0xb019e682, 0xa9b128d6, 0x7736c31b, + 0x5b7774b5, 0x2943beaf, 0xdfd41d6a, 0x0da0ea50, + 0x4c8a5745, 0x18fb38f3, 0xf060ad30, 0x74c3c4ef, + 0xc37eda3f, 0x1caac755, 0x1059dba2, 0x65c9e9ea, + 0xecca6a65, 0x686903ba, 0x935e4a2f, 0xe79d8ec0, + 0x81a160de, 0x6c38fc1c, 0x2ee746fd, 0x649a1f4d, + 0xe0397692, 0xbceafa75, 0x1e0c3606, 0x9809ae8a, + 0x40794bb2, 0x59d185e6, 0x361c7e0e, 0x633ee71f, + 0xf7c45562, 0xa3b53ad4, 0x324d81a8, 0xf4315296, + 0x3aef62f9, 0xf697a3c5, 0xb14a1025, 0x20b2ab59, + 0xae15d084, 0xa7e4c572, 0xdd72ec39, 0x6198164c, + 0x3bbc945e, 0x85f09f78, 0xd870e538, 0x8605988c, + 0xb2bf17d1, 0x0b57e4a5, 0x4dd9a1e2, 0xf8c24e61, + 0x457b42b3, 0xa5423421, 0xd625089c, 0x663cee1e, + 0x52866143, 0xfc93b1c7, 0x2be54ffc, 0x14082404, + 0x08a2e351, 0xc72f2599, 0xc4da226d, 0x391a650d, + 0x35e979fa, 0x84a369df, 0x9bfca97e, 0xb4481924, + 0xd776fe3b, 0x3d4b9aab, 0xd181f0ce, 0x55229911, + 0x8903838f, 0x6b9c044e, 0x517366b7, 0x60cbe0eb, + 0xcc78c13c, 0xbf1ffd81, 0xfe354094, 0x0cf31cf7, + 0x676f18b9, 0x5f268b13, 0x9c58512c, 0xb8bb05d3, + 0x5cd38ce7, 0xcbdc396e, 0xf395aac4, 0x0f061b03, + 0x13acdc56, 0x49885e44, 0x9efea07f, 0x374f88a9, + 0x8254672a, 0x6d6b0abb, 0xe29f87c1, 0x02a6f153, + 0x8ba572dc, 0x2716530b, 0xd327019d, 0xc1d82b6c, + 0xf562a431, 0xb9e8f374, 0x09f115f6, 0x438c4c46, + 0x2645a5ac, 0x970fb589, 0x4428b414, 0x42dfbae1, + 0x4e2ca616, 0xd274f73a, 0xd0d20669, 0x2d124109, + 0xade0d770, 0x54716fb6, 0xb7bd1ed0, 0x7ec7d6ed, + 0xdb85e2cc, 0x57846842, 0xc22d2c98, 0x0e55eda4, + 0x88507528, 0x31b8865c, 0x3fed6bf8, 0xa411c286, + }, +}; + +__constant u32 rch[R + 1] = +{ + 0x00000000, + 0x1823c6e8, + 0x36a6d2f5, + 0x60bc9b8e, + 0x1de0d7c2, + 0x157737e5, + 0x58c9290a, + 0xbd5d10f4, + 0xe427418b, + 0xfbee7c66, + 0xca2dbf07, +}; + +__constant u32 rcl[R + 1] = +{ + 0x00000000, + 0x87b8014f, + 0x796f9152, + 0xa30c7b35, + 0x2e4bfe57, + 0x9ff04ada, + 0xb1a06b85, + 0xcb3e0567, + 0xa77d95d8, + 0xdd17479e, + 0xad5a8333, +}; + +// this is a highly optimized that assumes dgst[16] = { 0 }; only reuse of no 2nd transform is needed + +static void whirlpool_transform (const u32x w[16], u32x dgst[16], __local u32 s_Ch[8][256], __local u32 s_Cl[8][256]) +{ + u32x Kh[8]; + u32x Kl[8]; + + Kh[0] = 0x300beec0; + Kl[0] = 0xaf902967; + Kh[1] = 0x28282828; + Kl[1] = 0x28282828; + Kh[2] = 0x28282828; + Kl[2] = 0x28282828; + Kh[3] = 0x28282828; + Kl[3] = 0x28282828; + Kh[4] = 0x28282828; + Kl[4] = 0x28282828; + Kh[5] = 0x28282828; + Kl[5] = 0x28282828; + Kh[6] = 0x28282828; + Kl[6] = 0x28282828; + Kh[7] = 0x28282828; + Kl[7] = 0x28282828; + + u32x stateh[8]; + u32x statel[8]; + + stateh[0] = w[ 0]; + statel[0] = w[ 1]; + stateh[1] = w[ 2]; + statel[1] = w[ 3]; + stateh[2] = w[ 4]; + statel[2] = w[ 5]; + stateh[3] = w[ 6]; + statel[3] = w[ 7]; + stateh[4] = w[ 8]; + statel[4] = w[ 9]; + stateh[5] = w[10]; + statel[5] = w[11]; + stateh[6] = w[12]; + statel[6] = w[13]; + stateh[7] = w[14]; + statel[7] = w[15]; + + u32x Lh[8]; + u32x Ll[8]; + + #pragma unroll + for (int i = 0; i < 8; i++) + { + const u32x Lp0 = stateh[(i + 8) & 7] >> 24; + const u32x Lp1 = stateh[(i + 7) & 7] >> 16; + const u32x Lp2 = stateh[(i + 6) & 7] >> 8; + const u32x Lp3 = stateh[(i + 5) & 7] >> 0; + const u32x Lp4 = statel[(i + 4) & 7] >> 24; + const u32x Lp5 = statel[(i + 3) & 7] >> 16; + const u32x Lp6 = statel[(i + 2) & 7] >> 8; + const u32x Lp7 = statel[(i + 1) & 7] >> 0; + + Lh[i] = BOX (s_Ch, 0, Lp0 & 0xff) + ^ BOX (s_Ch, 1, Lp1 & 0xff) + ^ BOX (s_Ch, 2, Lp2 & 0xff) + ^ BOX (s_Ch, 3, Lp3 & 0xff) + ^ BOX (s_Ch, 4, Lp4 & 0xff) + ^ BOX (s_Ch, 5, Lp5 & 0xff) + ^ BOX (s_Ch, 6, Lp6 & 0xff) + ^ BOX (s_Ch, 7, Lp7 & 0xff); + + Ll[i] = BOX (s_Cl, 0, Lp0 & 0xff) + ^ BOX (s_Cl, 1, Lp1 & 0xff) + ^ BOX (s_Cl, 2, Lp2 & 0xff) + ^ BOX (s_Cl, 3, Lp3 & 0xff) + ^ BOX (s_Cl, 4, Lp4 & 0xff) + ^ BOX (s_Cl, 5, Lp5 & 0xff) + ^ BOX (s_Cl, 6, Lp6 & 0xff) + ^ BOX (s_Cl, 7, Lp7 & 0xff); + } + + stateh[0] = Lh[0] ^ Kh[0]; + statel[0] = Ll[0] ^ Kl[0]; + stateh[1] = Lh[1] ^ Kh[1]; + statel[1] = Ll[1] ^ Kl[1]; + stateh[2] = Lh[2] ^ Kh[2]; + statel[2] = Ll[2] ^ Kl[2]; + stateh[3] = Lh[3] ^ Kh[3]; + statel[3] = Ll[3] ^ Kl[3]; + stateh[4] = Lh[4] ^ Kh[4]; + statel[4] = Ll[4] ^ Kl[4]; + stateh[5] = Lh[5] ^ Kh[5]; + statel[5] = Ll[5] ^ Kl[5]; + stateh[6] = Lh[6] ^ Kh[6]; + statel[6] = Ll[6] ^ Kl[6]; + stateh[7] = Lh[7] ^ Kh[7]; + statel[7] = Ll[7] ^ Kl[7]; + + for (int r = 2; r <= R; r++) + { + u32x Lh[8]; + u32x Ll[8]; + + #pragma unroll + for (int i = 0; i < 8; i++) + { + const u32x Lp0 = Kh[(i + 8) & 7] >> 24; + const u32x Lp1 = Kh[(i + 7) & 7] >> 16; + const u32x Lp2 = Kh[(i + 6) & 7] >> 8; + const u32x Lp3 = Kh[(i + 5) & 7] >> 0; + const u32x Lp4 = Kl[(i + 4) & 7] >> 24; + const u32x Lp5 = Kl[(i + 3) & 7] >> 16; + const u32x Lp6 = Kl[(i + 2) & 7] >> 8; + const u32x Lp7 = Kl[(i + 1) & 7] >> 0; + + Lh[i] = BOX (s_Ch, 0, Lp0 & 0xff) + ^ BOX (s_Ch, 1, Lp1 & 0xff) + ^ BOX (s_Ch, 2, Lp2 & 0xff) + ^ BOX (s_Ch, 3, Lp3 & 0xff) + ^ BOX (s_Ch, 4, Lp4 & 0xff) + ^ BOX (s_Ch, 5, Lp5 & 0xff) + ^ BOX (s_Ch, 6, Lp6 & 0xff) + ^ BOX (s_Ch, 7, Lp7 & 0xff); + + Ll[i] = BOX (s_Cl, 0, Lp0 & 0xff) + ^ BOX (s_Cl, 1, Lp1 & 0xff) + ^ BOX (s_Cl, 2, Lp2 & 0xff) + ^ BOX (s_Cl, 3, Lp3 & 0xff) + ^ BOX (s_Cl, 4, Lp4 & 0xff) + ^ BOX (s_Cl, 5, Lp5 & 0xff) + ^ BOX (s_Cl, 6, Lp6 & 0xff) + ^ BOX (s_Cl, 7, Lp7 & 0xff); + } + + Kh[0] = Lh[0] ^ rch[r]; + Kl[0] = Ll[0] ^ rcl[r]; + Kh[1] = Lh[1]; + Kl[1] = Ll[1]; + Kh[2] = Lh[2]; + Kl[2] = Ll[2]; + Kh[3] = Lh[3]; + Kl[3] = Ll[3]; + Kh[4] = Lh[4]; + Kl[4] = Ll[4]; + Kh[5] = Lh[5]; + Kl[5] = Ll[5]; + Kh[6] = Lh[6]; + Kl[6] = Ll[6]; + Kh[7] = Lh[7]; + Kl[7] = Ll[7]; + + #pragma unroll 8 + for (int i = 0; i < 8; i++) + { + const u32x Lp0 = stateh[(i + 8) & 7] >> 24; + const u32x Lp1 = stateh[(i + 7) & 7] >> 16; + const u32x Lp2 = stateh[(i + 6) & 7] >> 8; + const u32x Lp3 = stateh[(i + 5) & 7] >> 0; + const u32x Lp4 = statel[(i + 4) & 7] >> 24; + const u32x Lp5 = statel[(i + 3) & 7] >> 16; + const u32x Lp6 = statel[(i + 2) & 7] >> 8; + const u32x Lp7 = statel[(i + 1) & 7] >> 0; + + Lh[i] = BOX (s_Ch, 0, Lp0 & 0xff) + ^ BOX (s_Ch, 1, Lp1 & 0xff) + ^ BOX (s_Ch, 2, Lp2 & 0xff) + ^ BOX (s_Ch, 3, Lp3 & 0xff) + ^ BOX (s_Ch, 4, Lp4 & 0xff) + ^ BOX (s_Ch, 5, Lp5 & 0xff) + ^ BOX (s_Ch, 6, Lp6 & 0xff) + ^ BOX (s_Ch, 7, Lp7 & 0xff); + + Ll[i] = BOX (s_Cl, 0, Lp0 & 0xff) + ^ BOX (s_Cl, 1, Lp1 & 0xff) + ^ BOX (s_Cl, 2, Lp2 & 0xff) + ^ BOX (s_Cl, 3, Lp3 & 0xff) + ^ BOX (s_Cl, 4, Lp4 & 0xff) + ^ BOX (s_Cl, 5, Lp5 & 0xff) + ^ BOX (s_Cl, 6, Lp6 & 0xff) + ^ BOX (s_Cl, 7, Lp7 & 0xff); + } + + stateh[0] = Lh[0] ^ Kh[0]; + statel[0] = Ll[0] ^ Kl[0]; + stateh[1] = Lh[1] ^ Kh[1]; + statel[1] = Ll[1] ^ Kl[1]; + stateh[2] = Lh[2] ^ Kh[2]; + statel[2] = Ll[2] ^ Kl[2]; + stateh[3] = Lh[3] ^ Kh[3]; + statel[3] = Ll[3] ^ Kl[3]; + stateh[4] = Lh[4] ^ Kh[4]; + statel[4] = Ll[4] ^ Kl[4]; + stateh[5] = Lh[5] ^ Kh[5]; + statel[5] = Ll[5] ^ Kl[5]; + stateh[6] = Lh[6] ^ Kh[6]; + statel[6] = Ll[6] ^ Kl[6]; + stateh[7] = Lh[7] ^ Kh[7]; + statel[7] = Ll[7] ^ Kl[7]; + } + + dgst[ 0] = stateh[0] ^ w[ 0]; + dgst[ 1] = statel[0] ^ w[ 1]; + dgst[ 2] = stateh[1] ^ w[ 2]; + dgst[ 3] = statel[1] ^ w[ 3]; + dgst[ 4] = stateh[2] ^ w[ 4]; + dgst[ 5] = statel[2] ^ w[ 5]; + dgst[ 6] = stateh[3] ^ w[ 6]; + dgst[ 7] = statel[3] ^ w[ 7]; + dgst[ 8] = stateh[4] ^ w[ 8]; + dgst[ 9] = statel[4] ^ w[ 9]; + dgst[10] = stateh[5] ^ w[10]; + dgst[11] = statel[5] ^ w[11]; + dgst[12] = stateh[6] ^ w[12]; + dgst[13] = statel[6] ^ w[13]; + dgst[14] = stateh[7] ^ w[14]; + dgst[15] = statel[7] ^ w[15]; +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m06100_m04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global netntlm_t *netntlm_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + append_0x80_2 (wordl0, wordl1, pw_l_len); + + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, combs_buf[0].pw_len); + } + + /** + * modifier + */ + + __local u32 s_Ch[8][256]; + __local u32 s_Cl[8][256]; + + const u32 lid4 = lid * 4; + + for (u32 i = 0; i < 8; i++) + { + s_Ch[i][lid4 + 0] = Ch[i][lid4 + 0]; + s_Ch[i][lid4 + 1] = Ch[i][lid4 + 1]; + s_Ch[i][lid4 + 2] = Ch[i][lid4 + 2]; + s_Ch[i][lid4 + 3] = Ch[i][lid4 + 3]; + s_Cl[i][lid4 + 0] = Cl[i][lid4 + 0]; + s_Cl[i][lid4 + 1] = Cl[i][lid4 + 1]; + s_Cl[i][lid4 + 2] = Cl[i][lid4 + 2]; + s_Cl[i][lid4 + 3] = Cl[i][lid4 + 3]; + } + + barrier (CLK_LOCAL_MEM_FENCE); + + if (gid >= gid_max) return; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = combs_buf[il_pos].pw_len; + + const u32 pw_len = pw_l_len + pw_r_len; + + u32 wordr0[4]; + + wordr0[0] = combs_buf[il_pos].i[0]; + wordr0[1] = combs_buf[il_pos].i[1]; + wordr0[2] = combs_buf[il_pos].i[2]; + wordr0[3] = combs_buf[il_pos].i[3]; + + u32 wordr1[4]; + + wordr1[0] = combs_buf[il_pos].i[4]; + wordr1[1] = combs_buf[il_pos].i[5]; + wordr1[2] = combs_buf[il_pos].i[6]; + wordr1[3] = combs_buf[il_pos].i[7]; + + u32 wordr2[4]; + + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + + u32 wordr3[4]; + + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + u32x w0[4]; + + w0[0] = wordl0[0] | wordr0[0]; + w0[1] = wordl0[1] | wordr0[1]; + w0[2] = wordl0[2] | wordr0[2]; + w0[3] = wordl0[3] | wordr0[3]; + + u32x w1[4]; + + w1[0] = wordl1[0] | wordr1[0]; + w1[1] = wordl1[1] | wordr1[1]; + w1[2] = wordl1[2] | wordr1[2]; + w1[3] = wordl1[3] | wordr1[3]; + + u32x w2[4]; + + w2[0] = wordl2[0] | wordr2[0]; + w2[1] = wordl2[1] | wordr2[1]; + w2[2] = wordl2[2] | wordr2[2]; + w2[3] = wordl2[3] | wordr2[3]; + + u32x w3[4]; + + w3[0] = wordl3[0] | wordr3[0]; + w3[1] = wordl3[1] | wordr3[1]; + w3[2] = 0; + w3[3] = 0; + + u32x wl[16]; + + wl[ 0] = swap_workaround (w0[0]); + wl[ 1] = swap_workaround (w0[1]); + wl[ 2] = swap_workaround (w0[2]); + wl[ 3] = swap_workaround (w0[3]); + wl[ 4] = swap_workaround (w1[0]); + wl[ 5] = swap_workaround (w1[1]); + wl[ 6] = swap_workaround (w1[2]); + wl[ 7] = swap_workaround (w1[3]); + wl[ 8] = 0; + wl[ 9] = 0; + wl[10] = 0; + wl[11] = 0; + wl[12] = 0; + wl[13] = 0; + wl[14] = 0; + wl[15] = pw_len * 8; + + u32x dgst[16]; + + dgst[ 0] = 0; + dgst[ 1] = 0; + dgst[ 2] = 0; + dgst[ 3] = 0; + dgst[ 4] = 0; + dgst[ 5] = 0; + dgst[ 6] = 0; + dgst[ 7] = 0; + dgst[ 8] = 0; + dgst[ 9] = 0; + dgst[10] = 0; + dgst[11] = 0; + dgst[12] = 0; + dgst[13] = 0; + dgst[14] = 0; + dgst[15] = 0; + + whirlpool_transform (wl, dgst, s_Ch, s_Cl); + + const u32x r0 = dgst[0]; + const u32x r1 = dgst[1]; + const u32x r2 = dgst[2]; + const u32x r3 = dgst[3]; + + #include VECT_COMPARE_M + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m06100_m08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m06100_m16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m06100_s04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global netntlm_t *netntlm_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + append_0x80_2 (wordl0, wordl1, pw_l_len); + + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, combs_buf[0].pw_len); + } + + /** + * modifier + */ + + __local u32 s_Ch[8][256]; + __local u32 s_Cl[8][256]; + + const u32 lid4 = lid * 4; + + for (u32 i = 0; i < 8; i++) + { + s_Ch[i][lid4 + 0] = Ch[i][lid4 + 0]; + s_Ch[i][lid4 + 1] = Ch[i][lid4 + 1]; + s_Ch[i][lid4 + 2] = Ch[i][lid4 + 2]; + s_Ch[i][lid4 + 3] = Ch[i][lid4 + 3]; + s_Cl[i][lid4 + 0] = Cl[i][lid4 + 0]; + s_Cl[i][lid4 + 1] = Cl[i][lid4 + 1]; + s_Cl[i][lid4 + 2] = Cl[i][lid4 + 2]; + s_Cl[i][lid4 + 3] = Cl[i][lid4 + 3]; + } + + barrier (CLK_LOCAL_MEM_FENCE); + + if (gid >= gid_max) return; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = combs_buf[il_pos].pw_len; + + const u32 pw_len = pw_l_len + pw_r_len; + + u32 wordr0[4]; + + wordr0[0] = combs_buf[il_pos].i[0]; + wordr0[1] = combs_buf[il_pos].i[1]; + wordr0[2] = combs_buf[il_pos].i[2]; + wordr0[3] = combs_buf[il_pos].i[3]; + + u32 wordr1[4]; + + wordr1[0] = combs_buf[il_pos].i[4]; + wordr1[1] = combs_buf[il_pos].i[5]; + wordr1[2] = combs_buf[il_pos].i[6]; + wordr1[3] = combs_buf[il_pos].i[7]; + + u32 wordr2[4]; + + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + + u32 wordr3[4]; + + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + u32x w0[4]; + + w0[0] = wordl0[0] | wordr0[0]; + w0[1] = wordl0[1] | wordr0[1]; + w0[2] = wordl0[2] | wordr0[2]; + w0[3] = wordl0[3] | wordr0[3]; + + u32x w1[4]; + + w1[0] = wordl1[0] | wordr1[0]; + w1[1] = wordl1[1] | wordr1[1]; + w1[2] = wordl1[2] | wordr1[2]; + w1[3] = wordl1[3] | wordr1[3]; + + u32x w2[4]; + + w2[0] = wordl2[0] | wordr2[0]; + w2[1] = wordl2[1] | wordr2[1]; + w2[2] = wordl2[2] | wordr2[2]; + w2[3] = wordl2[3] | wordr2[3]; + + u32x w3[4]; + + w3[0] = wordl3[0] | wordr3[0]; + w3[1] = wordl3[1] | wordr3[1]; + w3[2] = 0; + w3[3] = 0; + + u32x wl[16]; + + wl[ 0] = swap_workaround (w0[0]); + wl[ 1] = swap_workaround (w0[1]); + wl[ 2] = swap_workaround (w0[2]); + wl[ 3] = swap_workaround (w0[3]); + wl[ 4] = swap_workaround (w1[0]); + wl[ 5] = swap_workaround (w1[1]); + wl[ 6] = swap_workaround (w1[2]); + wl[ 7] = swap_workaround (w1[3]); + wl[ 8] = 0; + wl[ 9] = 0; + wl[10] = 0; + wl[11] = 0; + wl[12] = 0; + wl[13] = 0; + wl[14] = 0; + wl[15] = pw_len * 8; + + u32x dgst[16]; + + dgst[ 0] = 0; + dgst[ 1] = 0; + dgst[ 2] = 0; + dgst[ 3] = 0; + dgst[ 4] = 0; + dgst[ 5] = 0; + dgst[ 6] = 0; + dgst[ 7] = 0; + dgst[ 8] = 0; + dgst[ 9] = 0; + dgst[10] = 0; + dgst[11] = 0; + dgst[12] = 0; + dgst[13] = 0; + dgst[14] = 0; + dgst[15] = 0; + + whirlpool_transform (wl, dgst, s_Ch, s_Cl); + + const u32x r0 = dgst[0]; + const u32x r1 = dgst[1]; + const u32x r2 = dgst[2]; + const u32x r3 = dgst[3]; + + #include VECT_COMPARE_S + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m06100_s08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m06100_s16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/amd/m06100_a3.cl b/amd/m06100_a3.cl new file mode 100644 index 0000000000..ff12c0e213 --- /dev/null +++ b/amd/m06100_a3.cl @@ -0,0 +1,1933 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _WHIRLPOOL_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW4 +#define VECT_SIZE2 +#endif + +#ifdef VLIW5 +#define VECT_SIZE2 +#endif + +#define DGST_R0 0 +#define DGST_R1 1 +#define DGST_R2 2 +#define DGST_R3 3 + +#include "include/kernel_functions.c" +#include "types_amd.c" +#include "common_amd.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#define R 10 + +#ifdef VECT_SIZE1 +#define BOX(S,n,i) u32x ((S)[(n)][(i)]) +#endif + +#ifdef VECT_SIZE2 +#define BOX(S,n,i) u32x ((S)[(n)][(i).s0], (S)[(n)][(i).s1]) +#endif + +__constant u32 Ch[8][256] = +{ + { + 0x18186018, 0x23238c23, 0xc6c63fc6, 0xe8e887e8, + 0x87872687, 0xb8b8dab8, 0x01010401, 0x4f4f214f, + 0x3636d836, 0xa6a6a2a6, 0xd2d26fd2, 0xf5f5f3f5, + 0x7979f979, 0x6f6fa16f, 0x91917e91, 0x52525552, + 0x60609d60, 0xbcbccabc, 0x9b9b569b, 0x8e8e028e, + 0xa3a3b6a3, 0x0c0c300c, 0x7b7bf17b, 0x3535d435, + 0x1d1d741d, 0xe0e0a7e0, 0xd7d77bd7, 0xc2c22fc2, + 0x2e2eb82e, 0x4b4b314b, 0xfefedffe, 0x57574157, + 0x15155415, 0x7777c177, 0x3737dc37, 0xe5e5b3e5, + 0x9f9f469f, 0xf0f0e7f0, 0x4a4a354a, 0xdada4fda, + 0x58587d58, 0xc9c903c9, 0x2929a429, 0x0a0a280a, + 0xb1b1feb1, 0xa0a0baa0, 0x6b6bb16b, 0x85852e85, + 0xbdbdcebd, 0x5d5d695d, 0x10104010, 0xf4f4f7f4, + 0xcbcb0bcb, 0x3e3ef83e, 0x05051405, 0x67678167, + 0xe4e4b7e4, 0x27279c27, 0x41411941, 0x8b8b168b, + 0xa7a7a6a7, 0x7d7de97d, 0x95956e95, 0xd8d847d8, + 0xfbfbcbfb, 0xeeee9fee, 0x7c7ced7c, 0x66668566, + 0xdddd53dd, 0x17175c17, 0x47470147, 0x9e9e429e, + 0xcaca0fca, 0x2d2db42d, 0xbfbfc6bf, 0x07071c07, + 0xadad8ead, 0x5a5a755a, 0x83833683, 0x3333cc33, + 0x63639163, 0x02020802, 0xaaaa92aa, 0x7171d971, + 0xc8c807c8, 0x19196419, 0x49493949, 0xd9d943d9, + 0xf2f2eff2, 0xe3e3abe3, 0x5b5b715b, 0x88881a88, + 0x9a9a529a, 0x26269826, 0x3232c832, 0xb0b0fab0, + 0xe9e983e9, 0x0f0f3c0f, 0xd5d573d5, 0x80803a80, + 0xbebec2be, 0xcdcd13cd, 0x3434d034, 0x48483d48, + 0xffffdbff, 0x7a7af57a, 0x90907a90, 0x5f5f615f, + 0x20208020, 0x6868bd68, 0x1a1a681a, 0xaeae82ae, + 0xb4b4eab4, 0x54544d54, 0x93937693, 0x22228822, + 0x64648d64, 0xf1f1e3f1, 0x7373d173, 0x12124812, + 0x40401d40, 0x08082008, 0xc3c32bc3, 0xecec97ec, + 0xdbdb4bdb, 0xa1a1bea1, 0x8d8d0e8d, 0x3d3df43d, + 0x97976697, 0x00000000, 0xcfcf1bcf, 0x2b2bac2b, + 0x7676c576, 0x82823282, 0xd6d67fd6, 0x1b1b6c1b, + 0xb5b5eeb5, 0xafaf86af, 0x6a6ab56a, 0x50505d50, + 0x45450945, 0xf3f3ebf3, 0x3030c030, 0xefef9bef, + 0x3f3ffc3f, 0x55554955, 0xa2a2b2a2, 0xeaea8fea, + 0x65658965, 0xbabad2ba, 0x2f2fbc2f, 0xc0c027c0, + 0xdede5fde, 0x1c1c701c, 0xfdfdd3fd, 0x4d4d294d, + 0x92927292, 0x7575c975, 0x06061806, 0x8a8a128a, + 0xb2b2f2b2, 0xe6e6bfe6, 0x0e0e380e, 0x1f1f7c1f, + 0x62629562, 0xd4d477d4, 0xa8a89aa8, 0x96966296, + 0xf9f9c3f9, 0xc5c533c5, 0x25259425, 0x59597959, + 0x84842a84, 0x7272d572, 0x3939e439, 0x4c4c2d4c, + 0x5e5e655e, 0x7878fd78, 0x3838e038, 0x8c8c0a8c, + 0xd1d163d1, 0xa5a5aea5, 0xe2e2afe2, 0x61619961, + 0xb3b3f6b3, 0x21218421, 0x9c9c4a9c, 0x1e1e781e, + 0x43431143, 0xc7c73bc7, 0xfcfcd7fc, 0x04041004, + 0x51515951, 0x99995e99, 0x6d6da96d, 0x0d0d340d, + 0xfafacffa, 0xdfdf5bdf, 0x7e7ee57e, 0x24249024, + 0x3b3bec3b, 0xabab96ab, 0xcece1fce, 0x11114411, + 0x8f8f068f, 0x4e4e254e, 0xb7b7e6b7, 0xebeb8beb, + 0x3c3cf03c, 0x81813e81, 0x94946a94, 0xf7f7fbf7, + 0xb9b9deb9, 0x13134c13, 0x2c2cb02c, 0xd3d36bd3, + 0xe7e7bbe7, 0x6e6ea56e, 0xc4c437c4, 0x03030c03, + 0x56564556, 0x44440d44, 0x7f7fe17f, 0xa9a99ea9, + 0x2a2aa82a, 0xbbbbd6bb, 0xc1c123c1, 0x53535153, + 0xdcdc57dc, 0x0b0b2c0b, 0x9d9d4e9d, 0x6c6cad6c, + 0x3131c431, 0x7474cd74, 0xf6f6fff6, 0x46460546, + 0xacac8aac, 0x89891e89, 0x14145014, 0xe1e1a3e1, + 0x16165816, 0x3a3ae83a, 0x6969b969, 0x09092409, + 0x7070dd70, 0xb6b6e2b6, 0xd0d067d0, 0xeded93ed, + 0xcccc17cc, 0x42421542, 0x98985a98, 0xa4a4aaa4, + 0x2828a028, 0x5c5c6d5c, 0xf8f8c7f8, 0x86862286, + }, + { + 0xd8181860, 0x2623238c, 0xb8c6c63f, 0xfbe8e887, + 0xcb878726, 0x11b8b8da, 0x09010104, 0x0d4f4f21, + 0x9b3636d8, 0xffa6a6a2, 0x0cd2d26f, 0x0ef5f5f3, + 0x967979f9, 0x306f6fa1, 0x6d91917e, 0xf8525255, + 0x4760609d, 0x35bcbcca, 0x379b9b56, 0x8a8e8e02, + 0xd2a3a3b6, 0x6c0c0c30, 0x847b7bf1, 0x803535d4, + 0xf51d1d74, 0xb3e0e0a7, 0x21d7d77b, 0x9cc2c22f, + 0x432e2eb8, 0x294b4b31, 0x5dfefedf, 0xd5575741, + 0xbd151554, 0xe87777c1, 0x923737dc, 0x9ee5e5b3, + 0x139f9f46, 0x23f0f0e7, 0x204a4a35, 0x44dada4f, + 0xa258587d, 0xcfc9c903, 0x7c2929a4, 0x5a0a0a28, + 0x50b1b1fe, 0xc9a0a0ba, 0x146b6bb1, 0xd985852e, + 0x3cbdbdce, 0x8f5d5d69, 0x90101040, 0x07f4f4f7, + 0xddcbcb0b, 0xd33e3ef8, 0x2d050514, 0x78676781, + 0x97e4e4b7, 0x0227279c, 0x73414119, 0xa78b8b16, + 0xf6a7a7a6, 0xb27d7de9, 0x4995956e, 0x56d8d847, + 0x70fbfbcb, 0xcdeeee9f, 0xbb7c7ced, 0x71666685, + 0x7bdddd53, 0xaf17175c, 0x45474701, 0x1a9e9e42, + 0xd4caca0f, 0x582d2db4, 0x2ebfbfc6, 0x3f07071c, + 0xacadad8e, 0xb05a5a75, 0xef838336, 0xb63333cc, + 0x5c636391, 0x12020208, 0x93aaaa92, 0xde7171d9, + 0xc6c8c807, 0xd1191964, 0x3b494939, 0x5fd9d943, + 0x31f2f2ef, 0xa8e3e3ab, 0xb95b5b71, 0xbc88881a, + 0x3e9a9a52, 0x0b262698, 0xbf3232c8, 0x59b0b0fa, + 0xf2e9e983, 0x770f0f3c, 0x33d5d573, 0xf480803a, + 0x27bebec2, 0xebcdcd13, 0x893434d0, 0x3248483d, + 0x54ffffdb, 0x8d7a7af5, 0x6490907a, 0x9d5f5f61, + 0x3d202080, 0x0f6868bd, 0xca1a1a68, 0xb7aeae82, + 0x7db4b4ea, 0xce54544d, 0x7f939376, 0x2f222288, + 0x6364648d, 0x2af1f1e3, 0xcc7373d1, 0x82121248, + 0x7a40401d, 0x48080820, 0x95c3c32b, 0xdfecec97, + 0x4ddbdb4b, 0xc0a1a1be, 0x918d8d0e, 0xc83d3df4, + 0x5b979766, 0x00000000, 0xf9cfcf1b, 0x6e2b2bac, + 0xe17676c5, 0xe6828232, 0x28d6d67f, 0xc31b1b6c, + 0x74b5b5ee, 0xbeafaf86, 0x1d6a6ab5, 0xea50505d, + 0x57454509, 0x38f3f3eb, 0xad3030c0, 0xc4efef9b, + 0xda3f3ffc, 0xc7555549, 0xdba2a2b2, 0xe9eaea8f, + 0x6a656589, 0x03babad2, 0x4a2f2fbc, 0x8ec0c027, + 0x60dede5f, 0xfc1c1c70, 0x46fdfdd3, 0x1f4d4d29, + 0x76929272, 0xfa7575c9, 0x36060618, 0xae8a8a12, + 0x4bb2b2f2, 0x85e6e6bf, 0x7e0e0e38, 0xe71f1f7c, + 0x55626295, 0x3ad4d477, 0x81a8a89a, 0x52969662, + 0x62f9f9c3, 0xa3c5c533, 0x10252594, 0xab595979, + 0xd084842a, 0xc57272d5, 0xec3939e4, 0x164c4c2d, + 0x945e5e65, 0x9f7878fd, 0xe53838e0, 0x988c8c0a, + 0x17d1d163, 0xe4a5a5ae, 0xa1e2e2af, 0x4e616199, + 0x42b3b3f6, 0x34212184, 0x089c9c4a, 0xee1e1e78, + 0x61434311, 0xb1c7c73b, 0x4ffcfcd7, 0x24040410, + 0xe3515159, 0x2599995e, 0x226d6da9, 0x650d0d34, + 0x79fafacf, 0x69dfdf5b, 0xa97e7ee5, 0x19242490, + 0xfe3b3bec, 0x9aabab96, 0xf0cece1f, 0x99111144, + 0x838f8f06, 0x044e4e25, 0x66b7b7e6, 0xe0ebeb8b, + 0xc13c3cf0, 0xfd81813e, 0x4094946a, 0x1cf7f7fb, + 0x18b9b9de, 0x8b13134c, 0x512c2cb0, 0x05d3d36b, + 0x8ce7e7bb, 0x396e6ea5, 0xaac4c437, 0x1b03030c, + 0xdc565645, 0x5e44440d, 0xa07f7fe1, 0x88a9a99e, + 0x672a2aa8, 0x0abbbbd6, 0x87c1c123, 0xf1535351, + 0x72dcdc57, 0x530b0b2c, 0x019d9d4e, 0x2b6c6cad, + 0xa43131c4, 0xf37474cd, 0x15f6f6ff, 0x4c464605, + 0xa5acac8a, 0xb589891e, 0xb4141450, 0xbae1e1a3, + 0xa6161658, 0xf73a3ae8, 0x066969b9, 0x41090924, + 0xd77070dd, 0x6fb6b6e2, 0x1ed0d067, 0xd6eded93, + 0xe2cccc17, 0x68424215, 0x2c98985a, 0xeda4a4aa, + 0x752828a0, 0x865c5c6d, 0x6bf8f8c7, 0xc2868622, + }, + { + 0x30d81818, 0x46262323, 0x91b8c6c6, 0xcdfbe8e8, + 0x13cb8787, 0x6d11b8b8, 0x02090101, 0x9e0d4f4f, + 0x6c9b3636, 0x51ffa6a6, 0xb90cd2d2, 0xf70ef5f5, + 0xf2967979, 0xde306f6f, 0x3f6d9191, 0xa4f85252, + 0xc0476060, 0x6535bcbc, 0x2b379b9b, 0x018a8e8e, + 0x5bd2a3a3, 0x186c0c0c, 0xf6847b7b, 0x6a803535, + 0x3af51d1d, 0xddb3e0e0, 0xb321d7d7, 0x999cc2c2, + 0x5c432e2e, 0x96294b4b, 0xe15dfefe, 0xaed55757, + 0x2abd1515, 0xeee87777, 0x6e923737, 0xd79ee5e5, + 0x23139f9f, 0xfd23f0f0, 0x94204a4a, 0xa944dada, + 0xb0a25858, 0x8fcfc9c9, 0x527c2929, 0x145a0a0a, + 0x7f50b1b1, 0x5dc9a0a0, 0xd6146b6b, 0x17d98585, + 0x673cbdbd, 0xba8f5d5d, 0x20901010, 0xf507f4f4, + 0x8bddcbcb, 0x7cd33e3e, 0x0a2d0505, 0xce786767, + 0xd597e4e4, 0x4e022727, 0x82734141, 0x0ba78b8b, + 0x53f6a7a7, 0xfab27d7d, 0x37499595, 0xad56d8d8, + 0xeb70fbfb, 0xc1cdeeee, 0xf8bb7c7c, 0xcc716666, + 0xa77bdddd, 0x2eaf1717, 0x8e454747, 0x211a9e9e, + 0x89d4caca, 0x5a582d2d, 0x632ebfbf, 0x0e3f0707, + 0x47acadad, 0xb4b05a5a, 0x1bef8383, 0x66b63333, + 0xc65c6363, 0x04120202, 0x4993aaaa, 0xe2de7171, + 0x8dc6c8c8, 0x32d11919, 0x923b4949, 0xaf5fd9d9, + 0xf931f2f2, 0xdba8e3e3, 0xb6b95b5b, 0x0dbc8888, + 0x293e9a9a, 0x4c0b2626, 0x64bf3232, 0x7d59b0b0, + 0xcff2e9e9, 0x1e770f0f, 0xb733d5d5, 0x1df48080, + 0x6127bebe, 0x87ebcdcd, 0x68893434, 0x90324848, + 0xe354ffff, 0xf48d7a7a, 0x3d649090, 0xbe9d5f5f, + 0x403d2020, 0xd00f6868, 0x34ca1a1a, 0x41b7aeae, + 0x757db4b4, 0xa8ce5454, 0x3b7f9393, 0x442f2222, + 0xc8636464, 0xff2af1f1, 0xe6cc7373, 0x24821212, + 0x807a4040, 0x10480808, 0x9b95c3c3, 0xc5dfecec, + 0xab4ddbdb, 0x5fc0a1a1, 0x07918d8d, 0x7ac83d3d, + 0x335b9797, 0x00000000, 0x83f9cfcf, 0x566e2b2b, + 0xece17676, 0x19e68282, 0xb128d6d6, 0x36c31b1b, + 0x7774b5b5, 0x43beafaf, 0xd41d6a6a, 0xa0ea5050, + 0x8a574545, 0xfb38f3f3, 0x60ad3030, 0xc3c4efef, + 0x7eda3f3f, 0xaac75555, 0x59dba2a2, 0xc9e9eaea, + 0xca6a6565, 0x6903baba, 0x5e4a2f2f, 0x9d8ec0c0, + 0xa160dede, 0x38fc1c1c, 0xe746fdfd, 0x9a1f4d4d, + 0x39769292, 0xeafa7575, 0x0c360606, 0x09ae8a8a, + 0x794bb2b2, 0xd185e6e6, 0x1c7e0e0e, 0x3ee71f1f, + 0xc4556262, 0xb53ad4d4, 0x4d81a8a8, 0x31529696, + 0xef62f9f9, 0x97a3c5c5, 0x4a102525, 0xb2ab5959, + 0x15d08484, 0xe4c57272, 0x72ec3939, 0x98164c4c, + 0xbc945e5e, 0xf09f7878, 0x70e53838, 0x05988c8c, + 0xbf17d1d1, 0x57e4a5a5, 0xd9a1e2e2, 0xc24e6161, + 0x7b42b3b3, 0x42342121, 0x25089c9c, 0x3cee1e1e, + 0x86614343, 0x93b1c7c7, 0xe54ffcfc, 0x08240404, + 0xa2e35151, 0x2f259999, 0xda226d6d, 0x1a650d0d, + 0xe979fafa, 0xa369dfdf, 0xfca97e7e, 0x48192424, + 0x76fe3b3b, 0x4b9aabab, 0x81f0cece, 0x22991111, + 0x03838f8f, 0x9c044e4e, 0x7366b7b7, 0xcbe0ebeb, + 0x78c13c3c, 0x1ffd8181, 0x35409494, 0xf31cf7f7, + 0x6f18b9b9, 0x268b1313, 0x58512c2c, 0xbb05d3d3, + 0xd38ce7e7, 0xdc396e6e, 0x95aac4c4, 0x061b0303, + 0xacdc5656, 0x885e4444, 0xfea07f7f, 0x4f88a9a9, + 0x54672a2a, 0x6b0abbbb, 0x9f87c1c1, 0xa6f15353, + 0xa572dcdc, 0x16530b0b, 0x27019d9d, 0xd82b6c6c, + 0x62a43131, 0xe8f37474, 0xf115f6f6, 0x8c4c4646, + 0x45a5acac, 0x0fb58989, 0x28b41414, 0xdfbae1e1, + 0x2ca61616, 0x74f73a3a, 0xd2066969, 0x12410909, + 0xe0d77070, 0x716fb6b6, 0xbd1ed0d0, 0xc7d6eded, + 0x85e2cccc, 0x84684242, 0x2d2c9898, 0x55eda4a4, + 0x50752828, 0xb8865c5c, 0xed6bf8f8, 0x11c28686, + }, + { + 0x7830d818, 0xaf462623, 0xf991b8c6, 0x6fcdfbe8, + 0xa113cb87, 0x626d11b8, 0x05020901, 0x6e9e0d4f, + 0xee6c9b36, 0x0451ffa6, 0xbdb90cd2, 0x06f70ef5, + 0x80f29679, 0xcede306f, 0xef3f6d91, 0x07a4f852, + 0xfdc04760, 0x766535bc, 0xcd2b379b, 0x8c018a8e, + 0x155bd2a3, 0x3c186c0c, 0x8af6847b, 0xe16a8035, + 0x693af51d, 0x47ddb3e0, 0xacb321d7, 0xed999cc2, + 0x965c432e, 0x7a96294b, 0x21e15dfe, 0x16aed557, + 0x412abd15, 0xb6eee877, 0xeb6e9237, 0x56d79ee5, + 0xd923139f, 0x17fd23f0, 0x7f94204a, 0x95a944da, + 0x25b0a258, 0xca8fcfc9, 0x8d527c29, 0x22145a0a, + 0x4f7f50b1, 0x1a5dc9a0, 0xdad6146b, 0xab17d985, + 0x73673cbd, 0x34ba8f5d, 0x50209010, 0x03f507f4, + 0xc08bddcb, 0xc67cd33e, 0x110a2d05, 0xe6ce7867, + 0x53d597e4, 0xbb4e0227, 0x58827341, 0x9d0ba78b, + 0x0153f6a7, 0x94fab27d, 0xfb374995, 0x9fad56d8, + 0x30eb70fb, 0x71c1cdee, 0x91f8bb7c, 0xe3cc7166, + 0x8ea77bdd, 0x4b2eaf17, 0x468e4547, 0xdc211a9e, + 0xc589d4ca, 0x995a582d, 0x79632ebf, 0x1b0e3f07, + 0x2347acad, 0x2fb4b05a, 0xb51bef83, 0xff66b633, + 0xf2c65c63, 0x0a041202, 0x384993aa, 0xa8e2de71, + 0xcf8dc6c8, 0x7d32d119, 0x70923b49, 0x9aaf5fd9, + 0x1df931f2, 0x48dba8e3, 0x2ab6b95b, 0x920dbc88, + 0xc8293e9a, 0xbe4c0b26, 0xfa64bf32, 0x4a7d59b0, + 0x6acff2e9, 0x331e770f, 0xa6b733d5, 0xba1df480, + 0x7c6127be, 0xde87ebcd, 0xe4688934, 0x75903248, + 0x24e354ff, 0x8ff48d7a, 0xea3d6490, 0x3ebe9d5f, + 0xa0403d20, 0xd5d00f68, 0x7234ca1a, 0x2c41b7ae, + 0x5e757db4, 0x19a8ce54, 0xe53b7f93, 0xaa442f22, + 0xe9c86364, 0x12ff2af1, 0xa2e6cc73, 0x5a248212, + 0x5d807a40, 0x28104808, 0xe89b95c3, 0x7bc5dfec, + 0x90ab4ddb, 0x1f5fc0a1, 0x8307918d, 0xc97ac83d, + 0xf1335b97, 0x00000000, 0xd483f9cf, 0x87566e2b, + 0xb3ece176, 0xb019e682, 0xa9b128d6, 0x7736c31b, + 0x5b7774b5, 0x2943beaf, 0xdfd41d6a, 0x0da0ea50, + 0x4c8a5745, 0x18fb38f3, 0xf060ad30, 0x74c3c4ef, + 0xc37eda3f, 0x1caac755, 0x1059dba2, 0x65c9e9ea, + 0xecca6a65, 0x686903ba, 0x935e4a2f, 0xe79d8ec0, + 0x81a160de, 0x6c38fc1c, 0x2ee746fd, 0x649a1f4d, + 0xe0397692, 0xbceafa75, 0x1e0c3606, 0x9809ae8a, + 0x40794bb2, 0x59d185e6, 0x361c7e0e, 0x633ee71f, + 0xf7c45562, 0xa3b53ad4, 0x324d81a8, 0xf4315296, + 0x3aef62f9, 0xf697a3c5, 0xb14a1025, 0x20b2ab59, + 0xae15d084, 0xa7e4c572, 0xdd72ec39, 0x6198164c, + 0x3bbc945e, 0x85f09f78, 0xd870e538, 0x8605988c, + 0xb2bf17d1, 0x0b57e4a5, 0x4dd9a1e2, 0xf8c24e61, + 0x457b42b3, 0xa5423421, 0xd625089c, 0x663cee1e, + 0x52866143, 0xfc93b1c7, 0x2be54ffc, 0x14082404, + 0x08a2e351, 0xc72f2599, 0xc4da226d, 0x391a650d, + 0x35e979fa, 0x84a369df, 0x9bfca97e, 0xb4481924, + 0xd776fe3b, 0x3d4b9aab, 0xd181f0ce, 0x55229911, + 0x8903838f, 0x6b9c044e, 0x517366b7, 0x60cbe0eb, + 0xcc78c13c, 0xbf1ffd81, 0xfe354094, 0x0cf31cf7, + 0x676f18b9, 0x5f268b13, 0x9c58512c, 0xb8bb05d3, + 0x5cd38ce7, 0xcbdc396e, 0xf395aac4, 0x0f061b03, + 0x13acdc56, 0x49885e44, 0x9efea07f, 0x374f88a9, + 0x8254672a, 0x6d6b0abb, 0xe29f87c1, 0x02a6f153, + 0x8ba572dc, 0x2716530b, 0xd327019d, 0xc1d82b6c, + 0xf562a431, 0xb9e8f374, 0x09f115f6, 0x438c4c46, + 0x2645a5ac, 0x970fb589, 0x4428b414, 0x42dfbae1, + 0x4e2ca616, 0xd274f73a, 0xd0d20669, 0x2d124109, + 0xade0d770, 0x54716fb6, 0xb7bd1ed0, 0x7ec7d6ed, + 0xdb85e2cc, 0x57846842, 0xc22d2c98, 0x0e55eda4, + 0x88507528, 0x31b8865c, 0x3fed6bf8, 0xa411c286, + }, + { + 0xc07830d8, 0x05af4626, 0x7ef991b8, 0x136fcdfb, + 0x4ca113cb, 0xa9626d11, 0x08050209, 0x426e9e0d, + 0xadee6c9b, 0x590451ff, 0xdebdb90c, 0xfb06f70e, + 0xef80f296, 0x5fcede30, 0xfcef3f6d, 0xaa07a4f8, + 0x27fdc047, 0x89766535, 0xaccd2b37, 0x048c018a, + 0x71155bd2, 0x603c186c, 0xff8af684, 0xb5e16a80, + 0xe8693af5, 0x5347ddb3, 0xf6acb321, 0x5eed999c, + 0x6d965c43, 0x627a9629, 0xa321e15d, 0x8216aed5, + 0xa8412abd, 0x9fb6eee8, 0xa5eb6e92, 0x7b56d79e, + 0x8cd92313, 0xd317fd23, 0x6a7f9420, 0x9e95a944, + 0xfa25b0a2, 0x06ca8fcf, 0x558d527c, 0x5022145a, + 0xe14f7f50, 0x691a5dc9, 0x7fdad614, 0x5cab17d9, + 0x8173673c, 0xd234ba8f, 0x80502090, 0xf303f507, + 0x16c08bdd, 0xedc67cd3, 0x28110a2d, 0x1fe6ce78, + 0x7353d597, 0x25bb4e02, 0x32588273, 0x2c9d0ba7, + 0x510153f6, 0xcf94fab2, 0xdcfb3749, 0x8e9fad56, + 0x8b30eb70, 0x2371c1cd, 0xc791f8bb, 0x17e3cc71, + 0xa68ea77b, 0xb84b2eaf, 0x02468e45, 0x84dc211a, + 0x1ec589d4, 0x75995a58, 0x9179632e, 0x381b0e3f, + 0x012347ac, 0xea2fb4b0, 0x6cb51bef, 0x85ff66b6, + 0x3ff2c65c, 0x100a0412, 0x39384993, 0xafa8e2de, + 0x0ecf8dc6, 0xc87d32d1, 0x7270923b, 0x869aaf5f, + 0xc31df931, 0x4b48dba8, 0xe22ab6b9, 0x34920dbc, + 0xa4c8293e, 0x2dbe4c0b, 0x8dfa64bf, 0xe94a7d59, + 0x1b6acff2, 0x78331e77, 0xe6a6b733, 0x74ba1df4, + 0x997c6127, 0x26de87eb, 0xbde46889, 0x7a759032, + 0xab24e354, 0xf78ff48d, 0xf4ea3d64, 0xc23ebe9d, + 0x1da0403d, 0x67d5d00f, 0xd07234ca, 0x192c41b7, + 0xc95e757d, 0x9a19a8ce, 0xece53b7f, 0x0daa442f, + 0x07e9c863, 0xdb12ff2a, 0xbfa2e6cc, 0x905a2482, + 0x3a5d807a, 0x40281048, 0x56e89b95, 0x337bc5df, + 0x9690ab4d, 0x611f5fc0, 0x1c830791, 0xf5c97ac8, + 0xccf1335b, 0x00000000, 0x36d483f9, 0x4587566e, + 0x97b3ece1, 0x64b019e6, 0xfea9b128, 0xd87736c3, + 0xc15b7774, 0x112943be, 0x77dfd41d, 0xba0da0ea, + 0x124c8a57, 0xcb18fb38, 0x9df060ad, 0x2b74c3c4, + 0xe5c37eda, 0x921caac7, 0x791059db, 0x0365c9e9, + 0x0fecca6a, 0xb9686903, 0x65935e4a, 0x4ee79d8e, + 0xbe81a160, 0xe06c38fc, 0xbb2ee746, 0x52649a1f, + 0xe4e03976, 0x8fbceafa, 0x301e0c36, 0x249809ae, + 0xf940794b, 0x6359d185, 0x70361c7e, 0xf8633ee7, + 0x37f7c455, 0xeea3b53a, 0x29324d81, 0xc4f43152, + 0x9b3aef62, 0x66f697a3, 0x35b14a10, 0xf220b2ab, + 0x54ae15d0, 0xb7a7e4c5, 0xd5dd72ec, 0x5a619816, + 0xca3bbc94, 0xe785f09f, 0xddd870e5, 0x14860598, + 0xc6b2bf17, 0x410b57e4, 0x434dd9a1, 0x2ff8c24e, + 0xf1457b42, 0x15a54234, 0x94d62508, 0xf0663cee, + 0x22528661, 0x76fc93b1, 0xb32be54f, 0x20140824, + 0xb208a2e3, 0xbcc72f25, 0x4fc4da22, 0x68391a65, + 0x8335e979, 0xb684a369, 0xd79bfca9, 0x3db44819, + 0xc5d776fe, 0x313d4b9a, 0x3ed181f0, 0x88552299, + 0x0c890383, 0x4a6b9c04, 0xd1517366, 0x0b60cbe0, + 0xfdcc78c1, 0x7cbf1ffd, 0xd4fe3540, 0xeb0cf31c, + 0xa1676f18, 0x985f268b, 0x7d9c5851, 0xd6b8bb05, + 0x6b5cd38c, 0x57cbdc39, 0x6ef395aa, 0x180f061b, + 0x8a13acdc, 0x1a49885e, 0xdf9efea0, 0x21374f88, + 0x4d825467, 0xb16d6b0a, 0x46e29f87, 0xa202a6f1, + 0xae8ba572, 0x58271653, 0x9cd32701, 0x47c1d82b, + 0x95f562a4, 0x87b9e8f3, 0xe309f115, 0x0a438c4c, + 0x092645a5, 0x3c970fb5, 0xa04428b4, 0x5b42dfba, + 0xb04e2ca6, 0xcdd274f7, 0x6fd0d206, 0x482d1241, + 0xa7ade0d7, 0xd954716f, 0xceb7bd1e, 0x3b7ec7d6, + 0x2edb85e2, 0x2a578468, 0xb4c22d2c, 0x490e55ed, + 0x5d885075, 0xda31b886, 0x933fed6b, 0x44a411c2, + }, + { + 0x18c07830, 0x2305af46, 0xc67ef991, 0xe8136fcd, + 0x874ca113, 0xb8a9626d, 0x01080502, 0x4f426e9e, + 0x36adee6c, 0xa6590451, 0xd2debdb9, 0xf5fb06f7, + 0x79ef80f2, 0x6f5fcede, 0x91fcef3f, 0x52aa07a4, + 0x6027fdc0, 0xbc897665, 0x9baccd2b, 0x8e048c01, + 0xa371155b, 0x0c603c18, 0x7bff8af6, 0x35b5e16a, + 0x1de8693a, 0xe05347dd, 0xd7f6acb3, 0xc25eed99, + 0x2e6d965c, 0x4b627a96, 0xfea321e1, 0x578216ae, + 0x15a8412a, 0x779fb6ee, 0x37a5eb6e, 0xe57b56d7, + 0x9f8cd923, 0xf0d317fd, 0x4a6a7f94, 0xda9e95a9, + 0x58fa25b0, 0xc906ca8f, 0x29558d52, 0x0a502214, + 0xb1e14f7f, 0xa0691a5d, 0x6b7fdad6, 0x855cab17, + 0xbd817367, 0x5dd234ba, 0x10805020, 0xf4f303f5, + 0xcb16c08b, 0x3eedc67c, 0x0528110a, 0x671fe6ce, + 0xe47353d5, 0x2725bb4e, 0x41325882, 0x8b2c9d0b, + 0xa7510153, 0x7dcf94fa, 0x95dcfb37, 0xd88e9fad, + 0xfb8b30eb, 0xee2371c1, 0x7cc791f8, 0x6617e3cc, + 0xdda68ea7, 0x17b84b2e, 0x4702468e, 0x9e84dc21, + 0xca1ec589, 0x2d75995a, 0xbf917963, 0x07381b0e, + 0xad012347, 0x5aea2fb4, 0x836cb51b, 0x3385ff66, + 0x633ff2c6, 0x02100a04, 0xaa393849, 0x71afa8e2, + 0xc80ecf8d, 0x19c87d32, 0x49727092, 0xd9869aaf, + 0xf2c31df9, 0xe34b48db, 0x5be22ab6, 0x8834920d, + 0x9aa4c829, 0x262dbe4c, 0x328dfa64, 0xb0e94a7d, + 0xe91b6acf, 0x0f78331e, 0xd5e6a6b7, 0x8074ba1d, + 0xbe997c61, 0xcd26de87, 0x34bde468, 0x487a7590, + 0xffab24e3, 0x7af78ff4, 0x90f4ea3d, 0x5fc23ebe, + 0x201da040, 0x6867d5d0, 0x1ad07234, 0xae192c41, + 0xb4c95e75, 0x549a19a8, 0x93ece53b, 0x220daa44, + 0x6407e9c8, 0xf1db12ff, 0x73bfa2e6, 0x12905a24, + 0x403a5d80, 0x08402810, 0xc356e89b, 0xec337bc5, + 0xdb9690ab, 0xa1611f5f, 0x8d1c8307, 0x3df5c97a, + 0x97ccf133, 0x00000000, 0xcf36d483, 0x2b458756, + 0x7697b3ec, 0x8264b019, 0xd6fea9b1, 0x1bd87736, + 0xb5c15b77, 0xaf112943, 0x6a77dfd4, 0x50ba0da0, + 0x45124c8a, 0xf3cb18fb, 0x309df060, 0xef2b74c3, + 0x3fe5c37e, 0x55921caa, 0xa2791059, 0xea0365c9, + 0x650fecca, 0xbab96869, 0x2f65935e, 0xc04ee79d, + 0xdebe81a1, 0x1ce06c38, 0xfdbb2ee7, 0x4d52649a, + 0x92e4e039, 0x758fbcea, 0x06301e0c, 0x8a249809, + 0xb2f94079, 0xe66359d1, 0x0e70361c, 0x1ff8633e, + 0x6237f7c4, 0xd4eea3b5, 0xa829324d, 0x96c4f431, + 0xf99b3aef, 0xc566f697, 0x2535b14a, 0x59f220b2, + 0x8454ae15, 0x72b7a7e4, 0x39d5dd72, 0x4c5a6198, + 0x5eca3bbc, 0x78e785f0, 0x38ddd870, 0x8c148605, + 0xd1c6b2bf, 0xa5410b57, 0xe2434dd9, 0x612ff8c2, + 0xb3f1457b, 0x2115a542, 0x9c94d625, 0x1ef0663c, + 0x43225286, 0xc776fc93, 0xfcb32be5, 0x04201408, + 0x51b208a2, 0x99bcc72f, 0x6d4fc4da, 0x0d68391a, + 0xfa8335e9, 0xdfb684a3, 0x7ed79bfc, 0x243db448, + 0x3bc5d776, 0xab313d4b, 0xce3ed181, 0x11885522, + 0x8f0c8903, 0x4e4a6b9c, 0xb7d15173, 0xeb0b60cb, + 0x3cfdcc78, 0x817cbf1f, 0x94d4fe35, 0xf7eb0cf3, + 0xb9a1676f, 0x13985f26, 0x2c7d9c58, 0xd3d6b8bb, + 0xe76b5cd3, 0x6e57cbdc, 0xc46ef395, 0x03180f06, + 0x568a13ac, 0x441a4988, 0x7fdf9efe, 0xa921374f, + 0x2a4d8254, 0xbbb16d6b, 0xc146e29f, 0x53a202a6, + 0xdcae8ba5, 0x0b582716, 0x9d9cd327, 0x6c47c1d8, + 0x3195f562, 0x7487b9e8, 0xf6e309f1, 0x460a438c, + 0xac092645, 0x893c970f, 0x14a04428, 0xe15b42df, + 0x16b04e2c, 0x3acdd274, 0x696fd0d2, 0x09482d12, + 0x70a7ade0, 0xb6d95471, 0xd0ceb7bd, 0xed3b7ec7, + 0xcc2edb85, 0x422a5784, 0x98b4c22d, 0xa4490e55, + 0x285d8850, 0x5cda31b8, 0xf8933fed, 0x8644a411, + }, + { + 0x6018c078, 0x8c2305af, 0x3fc67ef9, 0x87e8136f, + 0x26874ca1, 0xdab8a962, 0x04010805, 0x214f426e, + 0xd836adee, 0xa2a65904, 0x6fd2debd, 0xf3f5fb06, + 0xf979ef80, 0xa16f5fce, 0x7e91fcef, 0x5552aa07, + 0x9d6027fd, 0xcabc8976, 0x569baccd, 0x028e048c, + 0xb6a37115, 0x300c603c, 0xf17bff8a, 0xd435b5e1, + 0x741de869, 0xa7e05347, 0x7bd7f6ac, 0x2fc25eed, + 0xb82e6d96, 0x314b627a, 0xdffea321, 0x41578216, + 0x5415a841, 0xc1779fb6, 0xdc37a5eb, 0xb3e57b56, + 0x469f8cd9, 0xe7f0d317, 0x354a6a7f, 0x4fda9e95, + 0x7d58fa25, 0x03c906ca, 0xa429558d, 0x280a5022, + 0xfeb1e14f, 0xbaa0691a, 0xb16b7fda, 0x2e855cab, + 0xcebd8173, 0x695dd234, 0x40108050, 0xf7f4f303, + 0x0bcb16c0, 0xf83eedc6, 0x14052811, 0x81671fe6, + 0xb7e47353, 0x9c2725bb, 0x19413258, 0x168b2c9d, + 0xa6a75101, 0xe97dcf94, 0x6e95dcfb, 0x47d88e9f, + 0xcbfb8b30, 0x9fee2371, 0xed7cc791, 0x856617e3, + 0x53dda68e, 0x5c17b84b, 0x01470246, 0x429e84dc, + 0x0fca1ec5, 0xb42d7599, 0xc6bf9179, 0x1c07381b, + 0x8ead0123, 0x755aea2f, 0x36836cb5, 0xcc3385ff, + 0x91633ff2, 0x0802100a, 0x92aa3938, 0xd971afa8, + 0x07c80ecf, 0x6419c87d, 0x39497270, 0x43d9869a, + 0xeff2c31d, 0xabe34b48, 0x715be22a, 0x1a883492, + 0x529aa4c8, 0x98262dbe, 0xc8328dfa, 0xfab0e94a, + 0x83e91b6a, 0x3c0f7833, 0x73d5e6a6, 0x3a8074ba, + 0xc2be997c, 0x13cd26de, 0xd034bde4, 0x3d487a75, + 0xdbffab24, 0xf57af78f, 0x7a90f4ea, 0x615fc23e, + 0x80201da0, 0xbd6867d5, 0x681ad072, 0x82ae192c, + 0xeab4c95e, 0x4d549a19, 0x7693ece5, 0x88220daa, + 0x8d6407e9, 0xe3f1db12, 0xd173bfa2, 0x4812905a, + 0x1d403a5d, 0x20084028, 0x2bc356e8, 0x97ec337b, + 0x4bdb9690, 0xbea1611f, 0x0e8d1c83, 0xf43df5c9, + 0x6697ccf1, 0x00000000, 0x1bcf36d4, 0xac2b4587, + 0xc57697b3, 0x328264b0, 0x7fd6fea9, 0x6c1bd877, + 0xeeb5c15b, 0x86af1129, 0xb56a77df, 0x5d50ba0d, + 0x0945124c, 0xebf3cb18, 0xc0309df0, 0x9bef2b74, + 0xfc3fe5c3, 0x4955921c, 0xb2a27910, 0x8fea0365, + 0x89650fec, 0xd2bab968, 0xbc2f6593, 0x27c04ee7, + 0x5fdebe81, 0x701ce06c, 0xd3fdbb2e, 0x294d5264, + 0x7292e4e0, 0xc9758fbc, 0x1806301e, 0x128a2498, + 0xf2b2f940, 0xbfe66359, 0x380e7036, 0x7c1ff863, + 0x956237f7, 0x77d4eea3, 0x9aa82932, 0x6296c4f4, + 0xc3f99b3a, 0x33c566f6, 0x942535b1, 0x7959f220, + 0x2a8454ae, 0xd572b7a7, 0xe439d5dd, 0x2d4c5a61, + 0x655eca3b, 0xfd78e785, 0xe038ddd8, 0x0a8c1486, + 0x63d1c6b2, 0xaea5410b, 0xafe2434d, 0x99612ff8, + 0xf6b3f145, 0x842115a5, 0x4a9c94d6, 0x781ef066, + 0x11432252, 0x3bc776fc, 0xd7fcb32b, 0x10042014, + 0x5951b208, 0x5e99bcc7, 0xa96d4fc4, 0x340d6839, + 0xcffa8335, 0x5bdfb684, 0xe57ed79b, 0x90243db4, + 0xec3bc5d7, 0x96ab313d, 0x1fce3ed1, 0x44118855, + 0x068f0c89, 0x254e4a6b, 0xe6b7d151, 0x8beb0b60, + 0xf03cfdcc, 0x3e817cbf, 0x6a94d4fe, 0xfbf7eb0c, + 0xdeb9a167, 0x4c13985f, 0xb02c7d9c, 0x6bd3d6b8, + 0xbbe76b5c, 0xa56e57cb, 0x37c46ef3, 0x0c03180f, + 0x45568a13, 0x0d441a49, 0xe17fdf9e, 0x9ea92137, + 0xa82a4d82, 0xd6bbb16d, 0x23c146e2, 0x5153a202, + 0x57dcae8b, 0x2c0b5827, 0x4e9d9cd3, 0xad6c47c1, + 0xc43195f5, 0xcd7487b9, 0xfff6e309, 0x05460a43, + 0x8aac0926, 0x1e893c97, 0x5014a044, 0xa3e15b42, + 0x5816b04e, 0xe83acdd2, 0xb9696fd0, 0x2409482d, + 0xdd70a7ad, 0xe2b6d954, 0x67d0ceb7, 0x93ed3b7e, + 0x17cc2edb, 0x15422a57, 0x5a98b4c2, 0xaaa4490e, + 0xa0285d88, 0x6d5cda31, 0xc7f8933f, 0x228644a4, + }, + { + 0x186018c0, 0x238c2305, 0xc63fc67e, 0xe887e813, + 0x8726874c, 0xb8dab8a9, 0x01040108, 0x4f214f42, + 0x36d836ad, 0xa6a2a659, 0xd26fd2de, 0xf5f3f5fb, + 0x79f979ef, 0x6fa16f5f, 0x917e91fc, 0x525552aa, + 0x609d6027, 0xbccabc89, 0x9b569bac, 0x8e028e04, + 0xa3b6a371, 0x0c300c60, 0x7bf17bff, 0x35d435b5, + 0x1d741de8, 0xe0a7e053, 0xd77bd7f6, 0xc22fc25e, + 0x2eb82e6d, 0x4b314b62, 0xfedffea3, 0x57415782, + 0x155415a8, 0x77c1779f, 0x37dc37a5, 0xe5b3e57b, + 0x9f469f8c, 0xf0e7f0d3, 0x4a354a6a, 0xda4fda9e, + 0x587d58fa, 0xc903c906, 0x29a42955, 0x0a280a50, + 0xb1feb1e1, 0xa0baa069, 0x6bb16b7f, 0x852e855c, + 0xbdcebd81, 0x5d695dd2, 0x10401080, 0xf4f7f4f3, + 0xcb0bcb16, 0x3ef83eed, 0x05140528, 0x6781671f, + 0xe4b7e473, 0x279c2725, 0x41194132, 0x8b168b2c, + 0xa7a6a751, 0x7de97dcf, 0x956e95dc, 0xd847d88e, + 0xfbcbfb8b, 0xee9fee23, 0x7ced7cc7, 0x66856617, + 0xdd53dda6, 0x175c17b8, 0x47014702, 0x9e429e84, + 0xca0fca1e, 0x2db42d75, 0xbfc6bf91, 0x071c0738, + 0xad8ead01, 0x5a755aea, 0x8336836c, 0x33cc3385, + 0x6391633f, 0x02080210, 0xaa92aa39, 0x71d971af, + 0xc807c80e, 0x196419c8, 0x49394972, 0xd943d986, + 0xf2eff2c3, 0xe3abe34b, 0x5b715be2, 0x881a8834, + 0x9a529aa4, 0x2698262d, 0x32c8328d, 0xb0fab0e9, + 0xe983e91b, 0x0f3c0f78, 0xd573d5e6, 0x803a8074, + 0xbec2be99, 0xcd13cd26, 0x34d034bd, 0x483d487a, + 0xffdbffab, 0x7af57af7, 0x907a90f4, 0x5f615fc2, + 0x2080201d, 0x68bd6867, 0x1a681ad0, 0xae82ae19, + 0xb4eab4c9, 0x544d549a, 0x937693ec, 0x2288220d, + 0x648d6407, 0xf1e3f1db, 0x73d173bf, 0x12481290, + 0x401d403a, 0x08200840, 0xc32bc356, 0xec97ec33, + 0xdb4bdb96, 0xa1bea161, 0x8d0e8d1c, 0x3df43df5, + 0x976697cc, 0x00000000, 0xcf1bcf36, 0x2bac2b45, + 0x76c57697, 0x82328264, 0xd67fd6fe, 0x1b6c1bd8, + 0xb5eeb5c1, 0xaf86af11, 0x6ab56a77, 0x505d50ba, + 0x45094512, 0xf3ebf3cb, 0x30c0309d, 0xef9bef2b, + 0x3ffc3fe5, 0x55495592, 0xa2b2a279, 0xea8fea03, + 0x6589650f, 0xbad2bab9, 0x2fbc2f65, 0xc027c04e, + 0xde5fdebe, 0x1c701ce0, 0xfdd3fdbb, 0x4d294d52, + 0x927292e4, 0x75c9758f, 0x06180630, 0x8a128a24, + 0xb2f2b2f9, 0xe6bfe663, 0x0e380e70, 0x1f7c1ff8, + 0x62956237, 0xd477d4ee, 0xa89aa829, 0x966296c4, + 0xf9c3f99b, 0xc533c566, 0x25942535, 0x597959f2, + 0x842a8454, 0x72d572b7, 0x39e439d5, 0x4c2d4c5a, + 0x5e655eca, 0x78fd78e7, 0x38e038dd, 0x8c0a8c14, + 0xd163d1c6, 0xa5aea541, 0xe2afe243, 0x6199612f, + 0xb3f6b3f1, 0x21842115, 0x9c4a9c94, 0x1e781ef0, + 0x43114322, 0xc73bc776, 0xfcd7fcb3, 0x04100420, + 0x515951b2, 0x995e99bc, 0x6da96d4f, 0x0d340d68, + 0xfacffa83, 0xdf5bdfb6, 0x7ee57ed7, 0x2490243d, + 0x3bec3bc5, 0xab96ab31, 0xce1fce3e, 0x11441188, + 0x8f068f0c, 0x4e254e4a, 0xb7e6b7d1, 0xeb8beb0b, + 0x3cf03cfd, 0x813e817c, 0x946a94d4, 0xf7fbf7eb, + 0xb9deb9a1, 0x134c1398, 0x2cb02c7d, 0xd36bd3d6, + 0xe7bbe76b, 0x6ea56e57, 0xc437c46e, 0x030c0318, + 0x5645568a, 0x440d441a, 0x7fe17fdf, 0xa99ea921, + 0x2aa82a4d, 0xbbd6bbb1, 0xc123c146, 0x535153a2, + 0xdc57dcae, 0x0b2c0b58, 0x9d4e9d9c, 0x6cad6c47, + 0x31c43195, 0x74cd7487, 0xf6fff6e3, 0x4605460a, + 0xac8aac09, 0x891e893c, 0x145014a0, 0xe1a3e15b, + 0x165816b0, 0x3ae83acd, 0x69b9696f, 0x09240948, + 0x70dd70a7, 0xb6e2b6d9, 0xd067d0ce, 0xed93ed3b, + 0xcc17cc2e, 0x4215422a, 0x985a98b4, 0xa4aaa449, + 0x28a0285d, 0x5c6d5cda, 0xf8c7f893, 0x86228644, + } +}; + +__constant u32 Cl[8][256] = +{ + { + 0xc07830d8, 0x05af4626, 0x7ef991b8, 0x136fcdfb, + 0x4ca113cb, 0xa9626d11, 0x08050209, 0x426e9e0d, + 0xadee6c9b, 0x590451ff, 0xdebdb90c, 0xfb06f70e, + 0xef80f296, 0x5fcede30, 0xfcef3f6d, 0xaa07a4f8, + 0x27fdc047, 0x89766535, 0xaccd2b37, 0x048c018a, + 0x71155bd2, 0x603c186c, 0xff8af684, 0xb5e16a80, + 0xe8693af5, 0x5347ddb3, 0xf6acb321, 0x5eed999c, + 0x6d965c43, 0x627a9629, 0xa321e15d, 0x8216aed5, + 0xa8412abd, 0x9fb6eee8, 0xa5eb6e92, 0x7b56d79e, + 0x8cd92313, 0xd317fd23, 0x6a7f9420, 0x9e95a944, + 0xfa25b0a2, 0x06ca8fcf, 0x558d527c, 0x5022145a, + 0xe14f7f50, 0x691a5dc9, 0x7fdad614, 0x5cab17d9, + 0x8173673c, 0xd234ba8f, 0x80502090, 0xf303f507, + 0x16c08bdd, 0xedc67cd3, 0x28110a2d, 0x1fe6ce78, + 0x7353d597, 0x25bb4e02, 0x32588273, 0x2c9d0ba7, + 0x510153f6, 0xcf94fab2, 0xdcfb3749, 0x8e9fad56, + 0x8b30eb70, 0x2371c1cd, 0xc791f8bb, 0x17e3cc71, + 0xa68ea77b, 0xb84b2eaf, 0x02468e45, 0x84dc211a, + 0x1ec589d4, 0x75995a58, 0x9179632e, 0x381b0e3f, + 0x012347ac, 0xea2fb4b0, 0x6cb51bef, 0x85ff66b6, + 0x3ff2c65c, 0x100a0412, 0x39384993, 0xafa8e2de, + 0x0ecf8dc6, 0xc87d32d1, 0x7270923b, 0x869aaf5f, + 0xc31df931, 0x4b48dba8, 0xe22ab6b9, 0x34920dbc, + 0xa4c8293e, 0x2dbe4c0b, 0x8dfa64bf, 0xe94a7d59, + 0x1b6acff2, 0x78331e77, 0xe6a6b733, 0x74ba1df4, + 0x997c6127, 0x26de87eb, 0xbde46889, 0x7a759032, + 0xab24e354, 0xf78ff48d, 0xf4ea3d64, 0xc23ebe9d, + 0x1da0403d, 0x67d5d00f, 0xd07234ca, 0x192c41b7, + 0xc95e757d, 0x9a19a8ce, 0xece53b7f, 0x0daa442f, + 0x07e9c863, 0xdb12ff2a, 0xbfa2e6cc, 0x905a2482, + 0x3a5d807a, 0x40281048, 0x56e89b95, 0x337bc5df, + 0x9690ab4d, 0x611f5fc0, 0x1c830791, 0xf5c97ac8, + 0xccf1335b, 0x00000000, 0x36d483f9, 0x4587566e, + 0x97b3ece1, 0x64b019e6, 0xfea9b128, 0xd87736c3, + 0xc15b7774, 0x112943be, 0x77dfd41d, 0xba0da0ea, + 0x124c8a57, 0xcb18fb38, 0x9df060ad, 0x2b74c3c4, + 0xe5c37eda, 0x921caac7, 0x791059db, 0x0365c9e9, + 0x0fecca6a, 0xb9686903, 0x65935e4a, 0x4ee79d8e, + 0xbe81a160, 0xe06c38fc, 0xbb2ee746, 0x52649a1f, + 0xe4e03976, 0x8fbceafa, 0x301e0c36, 0x249809ae, + 0xf940794b, 0x6359d185, 0x70361c7e, 0xf8633ee7, + 0x37f7c455, 0xeea3b53a, 0x29324d81, 0xc4f43152, + 0x9b3aef62, 0x66f697a3, 0x35b14a10, 0xf220b2ab, + 0x54ae15d0, 0xb7a7e4c5, 0xd5dd72ec, 0x5a619816, + 0xca3bbc94, 0xe785f09f, 0xddd870e5, 0x14860598, + 0xc6b2bf17, 0x410b57e4, 0x434dd9a1, 0x2ff8c24e, + 0xf1457b42, 0x15a54234, 0x94d62508, 0xf0663cee, + 0x22528661, 0x76fc93b1, 0xb32be54f, 0x20140824, + 0xb208a2e3, 0xbcc72f25, 0x4fc4da22, 0x68391a65, + 0x8335e979, 0xb684a369, 0xd79bfca9, 0x3db44819, + 0xc5d776fe, 0x313d4b9a, 0x3ed181f0, 0x88552299, + 0x0c890383, 0x4a6b9c04, 0xd1517366, 0x0b60cbe0, + 0xfdcc78c1, 0x7cbf1ffd, 0xd4fe3540, 0xeb0cf31c, + 0xa1676f18, 0x985f268b, 0x7d9c5851, 0xd6b8bb05, + 0x6b5cd38c, 0x57cbdc39, 0x6ef395aa, 0x180f061b, + 0x8a13acdc, 0x1a49885e, 0xdf9efea0, 0x21374f88, + 0x4d825467, 0xb16d6b0a, 0x46e29f87, 0xa202a6f1, + 0xae8ba572, 0x58271653, 0x9cd32701, 0x47c1d82b, + 0x95f562a4, 0x87b9e8f3, 0xe309f115, 0x0a438c4c, + 0x092645a5, 0x3c970fb5, 0xa04428b4, 0x5b42dfba, + 0xb04e2ca6, 0xcdd274f7, 0x6fd0d206, 0x482d1241, + 0xa7ade0d7, 0xd954716f, 0xceb7bd1e, 0x3b7ec7d6, + 0x2edb85e2, 0x2a578468, 0xb4c22d2c, 0x490e55ed, + 0x5d885075, 0xda31b886, 0x933fed6b, 0x44a411c2, + }, + { + 0x18c07830, 0x2305af46, 0xc67ef991, 0xe8136fcd, + 0x874ca113, 0xb8a9626d, 0x01080502, 0x4f426e9e, + 0x36adee6c, 0xa6590451, 0xd2debdb9, 0xf5fb06f7, + 0x79ef80f2, 0x6f5fcede, 0x91fcef3f, 0x52aa07a4, + 0x6027fdc0, 0xbc897665, 0x9baccd2b, 0x8e048c01, + 0xa371155b, 0x0c603c18, 0x7bff8af6, 0x35b5e16a, + 0x1de8693a, 0xe05347dd, 0xd7f6acb3, 0xc25eed99, + 0x2e6d965c, 0x4b627a96, 0xfea321e1, 0x578216ae, + 0x15a8412a, 0x779fb6ee, 0x37a5eb6e, 0xe57b56d7, + 0x9f8cd923, 0xf0d317fd, 0x4a6a7f94, 0xda9e95a9, + 0x58fa25b0, 0xc906ca8f, 0x29558d52, 0x0a502214, + 0xb1e14f7f, 0xa0691a5d, 0x6b7fdad6, 0x855cab17, + 0xbd817367, 0x5dd234ba, 0x10805020, 0xf4f303f5, + 0xcb16c08b, 0x3eedc67c, 0x0528110a, 0x671fe6ce, + 0xe47353d5, 0x2725bb4e, 0x41325882, 0x8b2c9d0b, + 0xa7510153, 0x7dcf94fa, 0x95dcfb37, 0xd88e9fad, + 0xfb8b30eb, 0xee2371c1, 0x7cc791f8, 0x6617e3cc, + 0xdda68ea7, 0x17b84b2e, 0x4702468e, 0x9e84dc21, + 0xca1ec589, 0x2d75995a, 0xbf917963, 0x07381b0e, + 0xad012347, 0x5aea2fb4, 0x836cb51b, 0x3385ff66, + 0x633ff2c6, 0x02100a04, 0xaa393849, 0x71afa8e2, + 0xc80ecf8d, 0x19c87d32, 0x49727092, 0xd9869aaf, + 0xf2c31df9, 0xe34b48db, 0x5be22ab6, 0x8834920d, + 0x9aa4c829, 0x262dbe4c, 0x328dfa64, 0xb0e94a7d, + 0xe91b6acf, 0x0f78331e, 0xd5e6a6b7, 0x8074ba1d, + 0xbe997c61, 0xcd26de87, 0x34bde468, 0x487a7590, + 0xffab24e3, 0x7af78ff4, 0x90f4ea3d, 0x5fc23ebe, + 0x201da040, 0x6867d5d0, 0x1ad07234, 0xae192c41, + 0xb4c95e75, 0x549a19a8, 0x93ece53b, 0x220daa44, + 0x6407e9c8, 0xf1db12ff, 0x73bfa2e6, 0x12905a24, + 0x403a5d80, 0x08402810, 0xc356e89b, 0xec337bc5, + 0xdb9690ab, 0xa1611f5f, 0x8d1c8307, 0x3df5c97a, + 0x97ccf133, 0x00000000, 0xcf36d483, 0x2b458756, + 0x7697b3ec, 0x8264b019, 0xd6fea9b1, 0x1bd87736, + 0xb5c15b77, 0xaf112943, 0x6a77dfd4, 0x50ba0da0, + 0x45124c8a, 0xf3cb18fb, 0x309df060, 0xef2b74c3, + 0x3fe5c37e, 0x55921caa, 0xa2791059, 0xea0365c9, + 0x650fecca, 0xbab96869, 0x2f65935e, 0xc04ee79d, + 0xdebe81a1, 0x1ce06c38, 0xfdbb2ee7, 0x4d52649a, + 0x92e4e039, 0x758fbcea, 0x06301e0c, 0x8a249809, + 0xb2f94079, 0xe66359d1, 0x0e70361c, 0x1ff8633e, + 0x6237f7c4, 0xd4eea3b5, 0xa829324d, 0x96c4f431, + 0xf99b3aef, 0xc566f697, 0x2535b14a, 0x59f220b2, + 0x8454ae15, 0x72b7a7e4, 0x39d5dd72, 0x4c5a6198, + 0x5eca3bbc, 0x78e785f0, 0x38ddd870, 0x8c148605, + 0xd1c6b2bf, 0xa5410b57, 0xe2434dd9, 0x612ff8c2, + 0xb3f1457b, 0x2115a542, 0x9c94d625, 0x1ef0663c, + 0x43225286, 0xc776fc93, 0xfcb32be5, 0x04201408, + 0x51b208a2, 0x99bcc72f, 0x6d4fc4da, 0x0d68391a, + 0xfa8335e9, 0xdfb684a3, 0x7ed79bfc, 0x243db448, + 0x3bc5d776, 0xab313d4b, 0xce3ed181, 0x11885522, + 0x8f0c8903, 0x4e4a6b9c, 0xb7d15173, 0xeb0b60cb, + 0x3cfdcc78, 0x817cbf1f, 0x94d4fe35, 0xf7eb0cf3, + 0xb9a1676f, 0x13985f26, 0x2c7d9c58, 0xd3d6b8bb, + 0xe76b5cd3, 0x6e57cbdc, 0xc46ef395, 0x03180f06, + 0x568a13ac, 0x441a4988, 0x7fdf9efe, 0xa921374f, + 0x2a4d8254, 0xbbb16d6b, 0xc146e29f, 0x53a202a6, + 0xdcae8ba5, 0x0b582716, 0x9d9cd327, 0x6c47c1d8, + 0x3195f562, 0x7487b9e8, 0xf6e309f1, 0x460a438c, + 0xac092645, 0x893c970f, 0x14a04428, 0xe15b42df, + 0x16b04e2c, 0x3acdd274, 0x696fd0d2, 0x09482d12, + 0x70a7ade0, 0xb6d95471, 0xd0ceb7bd, 0xed3b7ec7, + 0xcc2edb85, 0x422a5784, 0x98b4c22d, 0xa4490e55, + 0x285d8850, 0x5cda31b8, 0xf8933fed, 0x8644a411, + }, + { + 0x6018c078, 0x8c2305af, 0x3fc67ef9, 0x87e8136f, + 0x26874ca1, 0xdab8a962, 0x04010805, 0x214f426e, + 0xd836adee, 0xa2a65904, 0x6fd2debd, 0xf3f5fb06, + 0xf979ef80, 0xa16f5fce, 0x7e91fcef, 0x5552aa07, + 0x9d6027fd, 0xcabc8976, 0x569baccd, 0x028e048c, + 0xb6a37115, 0x300c603c, 0xf17bff8a, 0xd435b5e1, + 0x741de869, 0xa7e05347, 0x7bd7f6ac, 0x2fc25eed, + 0xb82e6d96, 0x314b627a, 0xdffea321, 0x41578216, + 0x5415a841, 0xc1779fb6, 0xdc37a5eb, 0xb3e57b56, + 0x469f8cd9, 0xe7f0d317, 0x354a6a7f, 0x4fda9e95, + 0x7d58fa25, 0x03c906ca, 0xa429558d, 0x280a5022, + 0xfeb1e14f, 0xbaa0691a, 0xb16b7fda, 0x2e855cab, + 0xcebd8173, 0x695dd234, 0x40108050, 0xf7f4f303, + 0x0bcb16c0, 0xf83eedc6, 0x14052811, 0x81671fe6, + 0xb7e47353, 0x9c2725bb, 0x19413258, 0x168b2c9d, + 0xa6a75101, 0xe97dcf94, 0x6e95dcfb, 0x47d88e9f, + 0xcbfb8b30, 0x9fee2371, 0xed7cc791, 0x856617e3, + 0x53dda68e, 0x5c17b84b, 0x01470246, 0x429e84dc, + 0x0fca1ec5, 0xb42d7599, 0xc6bf9179, 0x1c07381b, + 0x8ead0123, 0x755aea2f, 0x36836cb5, 0xcc3385ff, + 0x91633ff2, 0x0802100a, 0x92aa3938, 0xd971afa8, + 0x07c80ecf, 0x6419c87d, 0x39497270, 0x43d9869a, + 0xeff2c31d, 0xabe34b48, 0x715be22a, 0x1a883492, + 0x529aa4c8, 0x98262dbe, 0xc8328dfa, 0xfab0e94a, + 0x83e91b6a, 0x3c0f7833, 0x73d5e6a6, 0x3a8074ba, + 0xc2be997c, 0x13cd26de, 0xd034bde4, 0x3d487a75, + 0xdbffab24, 0xf57af78f, 0x7a90f4ea, 0x615fc23e, + 0x80201da0, 0xbd6867d5, 0x681ad072, 0x82ae192c, + 0xeab4c95e, 0x4d549a19, 0x7693ece5, 0x88220daa, + 0x8d6407e9, 0xe3f1db12, 0xd173bfa2, 0x4812905a, + 0x1d403a5d, 0x20084028, 0x2bc356e8, 0x97ec337b, + 0x4bdb9690, 0xbea1611f, 0x0e8d1c83, 0xf43df5c9, + 0x6697ccf1, 0x00000000, 0x1bcf36d4, 0xac2b4587, + 0xc57697b3, 0x328264b0, 0x7fd6fea9, 0x6c1bd877, + 0xeeb5c15b, 0x86af1129, 0xb56a77df, 0x5d50ba0d, + 0x0945124c, 0xebf3cb18, 0xc0309df0, 0x9bef2b74, + 0xfc3fe5c3, 0x4955921c, 0xb2a27910, 0x8fea0365, + 0x89650fec, 0xd2bab968, 0xbc2f6593, 0x27c04ee7, + 0x5fdebe81, 0x701ce06c, 0xd3fdbb2e, 0x294d5264, + 0x7292e4e0, 0xc9758fbc, 0x1806301e, 0x128a2498, + 0xf2b2f940, 0xbfe66359, 0x380e7036, 0x7c1ff863, + 0x956237f7, 0x77d4eea3, 0x9aa82932, 0x6296c4f4, + 0xc3f99b3a, 0x33c566f6, 0x942535b1, 0x7959f220, + 0x2a8454ae, 0xd572b7a7, 0xe439d5dd, 0x2d4c5a61, + 0x655eca3b, 0xfd78e785, 0xe038ddd8, 0x0a8c1486, + 0x63d1c6b2, 0xaea5410b, 0xafe2434d, 0x99612ff8, + 0xf6b3f145, 0x842115a5, 0x4a9c94d6, 0x781ef066, + 0x11432252, 0x3bc776fc, 0xd7fcb32b, 0x10042014, + 0x5951b208, 0x5e99bcc7, 0xa96d4fc4, 0x340d6839, + 0xcffa8335, 0x5bdfb684, 0xe57ed79b, 0x90243db4, + 0xec3bc5d7, 0x96ab313d, 0x1fce3ed1, 0x44118855, + 0x068f0c89, 0x254e4a6b, 0xe6b7d151, 0x8beb0b60, + 0xf03cfdcc, 0x3e817cbf, 0x6a94d4fe, 0xfbf7eb0c, + 0xdeb9a167, 0x4c13985f, 0xb02c7d9c, 0x6bd3d6b8, + 0xbbe76b5c, 0xa56e57cb, 0x37c46ef3, 0x0c03180f, + 0x45568a13, 0x0d441a49, 0xe17fdf9e, 0x9ea92137, + 0xa82a4d82, 0xd6bbb16d, 0x23c146e2, 0x5153a202, + 0x57dcae8b, 0x2c0b5827, 0x4e9d9cd3, 0xad6c47c1, + 0xc43195f5, 0xcd7487b9, 0xfff6e309, 0x05460a43, + 0x8aac0926, 0x1e893c97, 0x5014a044, 0xa3e15b42, + 0x5816b04e, 0xe83acdd2, 0xb9696fd0, 0x2409482d, + 0xdd70a7ad, 0xe2b6d954, 0x67d0ceb7, 0x93ed3b7e, + 0x17cc2edb, 0x15422a57, 0x5a98b4c2, 0xaaa4490e, + 0xa0285d88, 0x6d5cda31, 0xc7f8933f, 0x228644a4, + }, + { + 0x186018c0, 0x238c2305, 0xc63fc67e, 0xe887e813, + 0x8726874c, 0xb8dab8a9, 0x01040108, 0x4f214f42, + 0x36d836ad, 0xa6a2a659, 0xd26fd2de, 0xf5f3f5fb, + 0x79f979ef, 0x6fa16f5f, 0x917e91fc, 0x525552aa, + 0x609d6027, 0xbccabc89, 0x9b569bac, 0x8e028e04, + 0xa3b6a371, 0x0c300c60, 0x7bf17bff, 0x35d435b5, + 0x1d741de8, 0xe0a7e053, 0xd77bd7f6, 0xc22fc25e, + 0x2eb82e6d, 0x4b314b62, 0xfedffea3, 0x57415782, + 0x155415a8, 0x77c1779f, 0x37dc37a5, 0xe5b3e57b, + 0x9f469f8c, 0xf0e7f0d3, 0x4a354a6a, 0xda4fda9e, + 0x587d58fa, 0xc903c906, 0x29a42955, 0x0a280a50, + 0xb1feb1e1, 0xa0baa069, 0x6bb16b7f, 0x852e855c, + 0xbdcebd81, 0x5d695dd2, 0x10401080, 0xf4f7f4f3, + 0xcb0bcb16, 0x3ef83eed, 0x05140528, 0x6781671f, + 0xe4b7e473, 0x279c2725, 0x41194132, 0x8b168b2c, + 0xa7a6a751, 0x7de97dcf, 0x956e95dc, 0xd847d88e, + 0xfbcbfb8b, 0xee9fee23, 0x7ced7cc7, 0x66856617, + 0xdd53dda6, 0x175c17b8, 0x47014702, 0x9e429e84, + 0xca0fca1e, 0x2db42d75, 0xbfc6bf91, 0x071c0738, + 0xad8ead01, 0x5a755aea, 0x8336836c, 0x33cc3385, + 0x6391633f, 0x02080210, 0xaa92aa39, 0x71d971af, + 0xc807c80e, 0x196419c8, 0x49394972, 0xd943d986, + 0xf2eff2c3, 0xe3abe34b, 0x5b715be2, 0x881a8834, + 0x9a529aa4, 0x2698262d, 0x32c8328d, 0xb0fab0e9, + 0xe983e91b, 0x0f3c0f78, 0xd573d5e6, 0x803a8074, + 0xbec2be99, 0xcd13cd26, 0x34d034bd, 0x483d487a, + 0xffdbffab, 0x7af57af7, 0x907a90f4, 0x5f615fc2, + 0x2080201d, 0x68bd6867, 0x1a681ad0, 0xae82ae19, + 0xb4eab4c9, 0x544d549a, 0x937693ec, 0x2288220d, + 0x648d6407, 0xf1e3f1db, 0x73d173bf, 0x12481290, + 0x401d403a, 0x08200840, 0xc32bc356, 0xec97ec33, + 0xdb4bdb96, 0xa1bea161, 0x8d0e8d1c, 0x3df43df5, + 0x976697cc, 0x00000000, 0xcf1bcf36, 0x2bac2b45, + 0x76c57697, 0x82328264, 0xd67fd6fe, 0x1b6c1bd8, + 0xb5eeb5c1, 0xaf86af11, 0x6ab56a77, 0x505d50ba, + 0x45094512, 0xf3ebf3cb, 0x30c0309d, 0xef9bef2b, + 0x3ffc3fe5, 0x55495592, 0xa2b2a279, 0xea8fea03, + 0x6589650f, 0xbad2bab9, 0x2fbc2f65, 0xc027c04e, + 0xde5fdebe, 0x1c701ce0, 0xfdd3fdbb, 0x4d294d52, + 0x927292e4, 0x75c9758f, 0x06180630, 0x8a128a24, + 0xb2f2b2f9, 0xe6bfe663, 0x0e380e70, 0x1f7c1ff8, + 0x62956237, 0xd477d4ee, 0xa89aa829, 0x966296c4, + 0xf9c3f99b, 0xc533c566, 0x25942535, 0x597959f2, + 0x842a8454, 0x72d572b7, 0x39e439d5, 0x4c2d4c5a, + 0x5e655eca, 0x78fd78e7, 0x38e038dd, 0x8c0a8c14, + 0xd163d1c6, 0xa5aea541, 0xe2afe243, 0x6199612f, + 0xb3f6b3f1, 0x21842115, 0x9c4a9c94, 0x1e781ef0, + 0x43114322, 0xc73bc776, 0xfcd7fcb3, 0x04100420, + 0x515951b2, 0x995e99bc, 0x6da96d4f, 0x0d340d68, + 0xfacffa83, 0xdf5bdfb6, 0x7ee57ed7, 0x2490243d, + 0x3bec3bc5, 0xab96ab31, 0xce1fce3e, 0x11441188, + 0x8f068f0c, 0x4e254e4a, 0xb7e6b7d1, 0xeb8beb0b, + 0x3cf03cfd, 0x813e817c, 0x946a94d4, 0xf7fbf7eb, + 0xb9deb9a1, 0x134c1398, 0x2cb02c7d, 0xd36bd3d6, + 0xe7bbe76b, 0x6ea56e57, 0xc437c46e, 0x030c0318, + 0x5645568a, 0x440d441a, 0x7fe17fdf, 0xa99ea921, + 0x2aa82a4d, 0xbbd6bbb1, 0xc123c146, 0x535153a2, + 0xdc57dcae, 0x0b2c0b58, 0x9d4e9d9c, 0x6cad6c47, + 0x31c43195, 0x74cd7487, 0xf6fff6e3, 0x4605460a, + 0xac8aac09, 0x891e893c, 0x145014a0, 0xe1a3e15b, + 0x165816b0, 0x3ae83acd, 0x69b9696f, 0x09240948, + 0x70dd70a7, 0xb6e2b6d9, 0xd067d0ce, 0xed93ed3b, + 0xcc17cc2e, 0x4215422a, 0x985a98b4, 0xa4aaa449, + 0x28a0285d, 0x5c6d5cda, 0xf8c7f893, 0x86228644, + }, + { + 0x18186018, 0x23238c23, 0xc6c63fc6, 0xe8e887e8, + 0x87872687, 0xb8b8dab8, 0x01010401, 0x4f4f214f, + 0x3636d836, 0xa6a6a2a6, 0xd2d26fd2, 0xf5f5f3f5, + 0x7979f979, 0x6f6fa16f, 0x91917e91, 0x52525552, + 0x60609d60, 0xbcbccabc, 0x9b9b569b, 0x8e8e028e, + 0xa3a3b6a3, 0x0c0c300c, 0x7b7bf17b, 0x3535d435, + 0x1d1d741d, 0xe0e0a7e0, 0xd7d77bd7, 0xc2c22fc2, + 0x2e2eb82e, 0x4b4b314b, 0xfefedffe, 0x57574157, + 0x15155415, 0x7777c177, 0x3737dc37, 0xe5e5b3e5, + 0x9f9f469f, 0xf0f0e7f0, 0x4a4a354a, 0xdada4fda, + 0x58587d58, 0xc9c903c9, 0x2929a429, 0x0a0a280a, + 0xb1b1feb1, 0xa0a0baa0, 0x6b6bb16b, 0x85852e85, + 0xbdbdcebd, 0x5d5d695d, 0x10104010, 0xf4f4f7f4, + 0xcbcb0bcb, 0x3e3ef83e, 0x05051405, 0x67678167, + 0xe4e4b7e4, 0x27279c27, 0x41411941, 0x8b8b168b, + 0xa7a7a6a7, 0x7d7de97d, 0x95956e95, 0xd8d847d8, + 0xfbfbcbfb, 0xeeee9fee, 0x7c7ced7c, 0x66668566, + 0xdddd53dd, 0x17175c17, 0x47470147, 0x9e9e429e, + 0xcaca0fca, 0x2d2db42d, 0xbfbfc6bf, 0x07071c07, + 0xadad8ead, 0x5a5a755a, 0x83833683, 0x3333cc33, + 0x63639163, 0x02020802, 0xaaaa92aa, 0x7171d971, + 0xc8c807c8, 0x19196419, 0x49493949, 0xd9d943d9, + 0xf2f2eff2, 0xe3e3abe3, 0x5b5b715b, 0x88881a88, + 0x9a9a529a, 0x26269826, 0x3232c832, 0xb0b0fab0, + 0xe9e983e9, 0x0f0f3c0f, 0xd5d573d5, 0x80803a80, + 0xbebec2be, 0xcdcd13cd, 0x3434d034, 0x48483d48, + 0xffffdbff, 0x7a7af57a, 0x90907a90, 0x5f5f615f, + 0x20208020, 0x6868bd68, 0x1a1a681a, 0xaeae82ae, + 0xb4b4eab4, 0x54544d54, 0x93937693, 0x22228822, + 0x64648d64, 0xf1f1e3f1, 0x7373d173, 0x12124812, + 0x40401d40, 0x08082008, 0xc3c32bc3, 0xecec97ec, + 0xdbdb4bdb, 0xa1a1bea1, 0x8d8d0e8d, 0x3d3df43d, + 0x97976697, 0x00000000, 0xcfcf1bcf, 0x2b2bac2b, + 0x7676c576, 0x82823282, 0xd6d67fd6, 0x1b1b6c1b, + 0xb5b5eeb5, 0xafaf86af, 0x6a6ab56a, 0x50505d50, + 0x45450945, 0xf3f3ebf3, 0x3030c030, 0xefef9bef, + 0x3f3ffc3f, 0x55554955, 0xa2a2b2a2, 0xeaea8fea, + 0x65658965, 0xbabad2ba, 0x2f2fbc2f, 0xc0c027c0, + 0xdede5fde, 0x1c1c701c, 0xfdfdd3fd, 0x4d4d294d, + 0x92927292, 0x7575c975, 0x06061806, 0x8a8a128a, + 0xb2b2f2b2, 0xe6e6bfe6, 0x0e0e380e, 0x1f1f7c1f, + 0x62629562, 0xd4d477d4, 0xa8a89aa8, 0x96966296, + 0xf9f9c3f9, 0xc5c533c5, 0x25259425, 0x59597959, + 0x84842a84, 0x7272d572, 0x3939e439, 0x4c4c2d4c, + 0x5e5e655e, 0x7878fd78, 0x3838e038, 0x8c8c0a8c, + 0xd1d163d1, 0xa5a5aea5, 0xe2e2afe2, 0x61619961, + 0xb3b3f6b3, 0x21218421, 0x9c9c4a9c, 0x1e1e781e, + 0x43431143, 0xc7c73bc7, 0xfcfcd7fc, 0x04041004, + 0x51515951, 0x99995e99, 0x6d6da96d, 0x0d0d340d, + 0xfafacffa, 0xdfdf5bdf, 0x7e7ee57e, 0x24249024, + 0x3b3bec3b, 0xabab96ab, 0xcece1fce, 0x11114411, + 0x8f8f068f, 0x4e4e254e, 0xb7b7e6b7, 0xebeb8beb, + 0x3c3cf03c, 0x81813e81, 0x94946a94, 0xf7f7fbf7, + 0xb9b9deb9, 0x13134c13, 0x2c2cb02c, 0xd3d36bd3, + 0xe7e7bbe7, 0x6e6ea56e, 0xc4c437c4, 0x03030c03, + 0x56564556, 0x44440d44, 0x7f7fe17f, 0xa9a99ea9, + 0x2a2aa82a, 0xbbbbd6bb, 0xc1c123c1, 0x53535153, + 0xdcdc57dc, 0x0b0b2c0b, 0x9d9d4e9d, 0x6c6cad6c, + 0x3131c431, 0x7474cd74, 0xf6f6fff6, 0x46460546, + 0xacac8aac, 0x89891e89, 0x14145014, 0xe1e1a3e1, + 0x16165816, 0x3a3ae83a, 0x6969b969, 0x09092409, + 0x7070dd70, 0xb6b6e2b6, 0xd0d067d0, 0xeded93ed, + 0xcccc17cc, 0x42421542, 0x98985a98, 0xa4a4aaa4, + 0x2828a028, 0x5c5c6d5c, 0xf8f8c7f8, 0x86862286, + }, + { + 0xd8181860, 0x2623238c, 0xb8c6c63f, 0xfbe8e887, + 0xcb878726, 0x11b8b8da, 0x09010104, 0x0d4f4f21, + 0x9b3636d8, 0xffa6a6a2, 0x0cd2d26f, 0x0ef5f5f3, + 0x967979f9, 0x306f6fa1, 0x6d91917e, 0xf8525255, + 0x4760609d, 0x35bcbcca, 0x379b9b56, 0x8a8e8e02, + 0xd2a3a3b6, 0x6c0c0c30, 0x847b7bf1, 0x803535d4, + 0xf51d1d74, 0xb3e0e0a7, 0x21d7d77b, 0x9cc2c22f, + 0x432e2eb8, 0x294b4b31, 0x5dfefedf, 0xd5575741, + 0xbd151554, 0xe87777c1, 0x923737dc, 0x9ee5e5b3, + 0x139f9f46, 0x23f0f0e7, 0x204a4a35, 0x44dada4f, + 0xa258587d, 0xcfc9c903, 0x7c2929a4, 0x5a0a0a28, + 0x50b1b1fe, 0xc9a0a0ba, 0x146b6bb1, 0xd985852e, + 0x3cbdbdce, 0x8f5d5d69, 0x90101040, 0x07f4f4f7, + 0xddcbcb0b, 0xd33e3ef8, 0x2d050514, 0x78676781, + 0x97e4e4b7, 0x0227279c, 0x73414119, 0xa78b8b16, + 0xf6a7a7a6, 0xb27d7de9, 0x4995956e, 0x56d8d847, + 0x70fbfbcb, 0xcdeeee9f, 0xbb7c7ced, 0x71666685, + 0x7bdddd53, 0xaf17175c, 0x45474701, 0x1a9e9e42, + 0xd4caca0f, 0x582d2db4, 0x2ebfbfc6, 0x3f07071c, + 0xacadad8e, 0xb05a5a75, 0xef838336, 0xb63333cc, + 0x5c636391, 0x12020208, 0x93aaaa92, 0xde7171d9, + 0xc6c8c807, 0xd1191964, 0x3b494939, 0x5fd9d943, + 0x31f2f2ef, 0xa8e3e3ab, 0xb95b5b71, 0xbc88881a, + 0x3e9a9a52, 0x0b262698, 0xbf3232c8, 0x59b0b0fa, + 0xf2e9e983, 0x770f0f3c, 0x33d5d573, 0xf480803a, + 0x27bebec2, 0xebcdcd13, 0x893434d0, 0x3248483d, + 0x54ffffdb, 0x8d7a7af5, 0x6490907a, 0x9d5f5f61, + 0x3d202080, 0x0f6868bd, 0xca1a1a68, 0xb7aeae82, + 0x7db4b4ea, 0xce54544d, 0x7f939376, 0x2f222288, + 0x6364648d, 0x2af1f1e3, 0xcc7373d1, 0x82121248, + 0x7a40401d, 0x48080820, 0x95c3c32b, 0xdfecec97, + 0x4ddbdb4b, 0xc0a1a1be, 0x918d8d0e, 0xc83d3df4, + 0x5b979766, 0x00000000, 0xf9cfcf1b, 0x6e2b2bac, + 0xe17676c5, 0xe6828232, 0x28d6d67f, 0xc31b1b6c, + 0x74b5b5ee, 0xbeafaf86, 0x1d6a6ab5, 0xea50505d, + 0x57454509, 0x38f3f3eb, 0xad3030c0, 0xc4efef9b, + 0xda3f3ffc, 0xc7555549, 0xdba2a2b2, 0xe9eaea8f, + 0x6a656589, 0x03babad2, 0x4a2f2fbc, 0x8ec0c027, + 0x60dede5f, 0xfc1c1c70, 0x46fdfdd3, 0x1f4d4d29, + 0x76929272, 0xfa7575c9, 0x36060618, 0xae8a8a12, + 0x4bb2b2f2, 0x85e6e6bf, 0x7e0e0e38, 0xe71f1f7c, + 0x55626295, 0x3ad4d477, 0x81a8a89a, 0x52969662, + 0x62f9f9c3, 0xa3c5c533, 0x10252594, 0xab595979, + 0xd084842a, 0xc57272d5, 0xec3939e4, 0x164c4c2d, + 0x945e5e65, 0x9f7878fd, 0xe53838e0, 0x988c8c0a, + 0x17d1d163, 0xe4a5a5ae, 0xa1e2e2af, 0x4e616199, + 0x42b3b3f6, 0x34212184, 0x089c9c4a, 0xee1e1e78, + 0x61434311, 0xb1c7c73b, 0x4ffcfcd7, 0x24040410, + 0xe3515159, 0x2599995e, 0x226d6da9, 0x650d0d34, + 0x79fafacf, 0x69dfdf5b, 0xa97e7ee5, 0x19242490, + 0xfe3b3bec, 0x9aabab96, 0xf0cece1f, 0x99111144, + 0x838f8f06, 0x044e4e25, 0x66b7b7e6, 0xe0ebeb8b, + 0xc13c3cf0, 0xfd81813e, 0x4094946a, 0x1cf7f7fb, + 0x18b9b9de, 0x8b13134c, 0x512c2cb0, 0x05d3d36b, + 0x8ce7e7bb, 0x396e6ea5, 0xaac4c437, 0x1b03030c, + 0xdc565645, 0x5e44440d, 0xa07f7fe1, 0x88a9a99e, + 0x672a2aa8, 0x0abbbbd6, 0x87c1c123, 0xf1535351, + 0x72dcdc57, 0x530b0b2c, 0x019d9d4e, 0x2b6c6cad, + 0xa43131c4, 0xf37474cd, 0x15f6f6ff, 0x4c464605, + 0xa5acac8a, 0xb589891e, 0xb4141450, 0xbae1e1a3, + 0xa6161658, 0xf73a3ae8, 0x066969b9, 0x41090924, + 0xd77070dd, 0x6fb6b6e2, 0x1ed0d067, 0xd6eded93, + 0xe2cccc17, 0x68424215, 0x2c98985a, 0xeda4a4aa, + 0x752828a0, 0x865c5c6d, 0x6bf8f8c7, 0xc2868622, + }, + { + 0x30d81818, 0x46262323, 0x91b8c6c6, 0xcdfbe8e8, + 0x13cb8787, 0x6d11b8b8, 0x02090101, 0x9e0d4f4f, + 0x6c9b3636, 0x51ffa6a6, 0xb90cd2d2, 0xf70ef5f5, + 0xf2967979, 0xde306f6f, 0x3f6d9191, 0xa4f85252, + 0xc0476060, 0x6535bcbc, 0x2b379b9b, 0x018a8e8e, + 0x5bd2a3a3, 0x186c0c0c, 0xf6847b7b, 0x6a803535, + 0x3af51d1d, 0xddb3e0e0, 0xb321d7d7, 0x999cc2c2, + 0x5c432e2e, 0x96294b4b, 0xe15dfefe, 0xaed55757, + 0x2abd1515, 0xeee87777, 0x6e923737, 0xd79ee5e5, + 0x23139f9f, 0xfd23f0f0, 0x94204a4a, 0xa944dada, + 0xb0a25858, 0x8fcfc9c9, 0x527c2929, 0x145a0a0a, + 0x7f50b1b1, 0x5dc9a0a0, 0xd6146b6b, 0x17d98585, + 0x673cbdbd, 0xba8f5d5d, 0x20901010, 0xf507f4f4, + 0x8bddcbcb, 0x7cd33e3e, 0x0a2d0505, 0xce786767, + 0xd597e4e4, 0x4e022727, 0x82734141, 0x0ba78b8b, + 0x53f6a7a7, 0xfab27d7d, 0x37499595, 0xad56d8d8, + 0xeb70fbfb, 0xc1cdeeee, 0xf8bb7c7c, 0xcc716666, + 0xa77bdddd, 0x2eaf1717, 0x8e454747, 0x211a9e9e, + 0x89d4caca, 0x5a582d2d, 0x632ebfbf, 0x0e3f0707, + 0x47acadad, 0xb4b05a5a, 0x1bef8383, 0x66b63333, + 0xc65c6363, 0x04120202, 0x4993aaaa, 0xe2de7171, + 0x8dc6c8c8, 0x32d11919, 0x923b4949, 0xaf5fd9d9, + 0xf931f2f2, 0xdba8e3e3, 0xb6b95b5b, 0x0dbc8888, + 0x293e9a9a, 0x4c0b2626, 0x64bf3232, 0x7d59b0b0, + 0xcff2e9e9, 0x1e770f0f, 0xb733d5d5, 0x1df48080, + 0x6127bebe, 0x87ebcdcd, 0x68893434, 0x90324848, + 0xe354ffff, 0xf48d7a7a, 0x3d649090, 0xbe9d5f5f, + 0x403d2020, 0xd00f6868, 0x34ca1a1a, 0x41b7aeae, + 0x757db4b4, 0xa8ce5454, 0x3b7f9393, 0x442f2222, + 0xc8636464, 0xff2af1f1, 0xe6cc7373, 0x24821212, + 0x807a4040, 0x10480808, 0x9b95c3c3, 0xc5dfecec, + 0xab4ddbdb, 0x5fc0a1a1, 0x07918d8d, 0x7ac83d3d, + 0x335b9797, 0x00000000, 0x83f9cfcf, 0x566e2b2b, + 0xece17676, 0x19e68282, 0xb128d6d6, 0x36c31b1b, + 0x7774b5b5, 0x43beafaf, 0xd41d6a6a, 0xa0ea5050, + 0x8a574545, 0xfb38f3f3, 0x60ad3030, 0xc3c4efef, + 0x7eda3f3f, 0xaac75555, 0x59dba2a2, 0xc9e9eaea, + 0xca6a6565, 0x6903baba, 0x5e4a2f2f, 0x9d8ec0c0, + 0xa160dede, 0x38fc1c1c, 0xe746fdfd, 0x9a1f4d4d, + 0x39769292, 0xeafa7575, 0x0c360606, 0x09ae8a8a, + 0x794bb2b2, 0xd185e6e6, 0x1c7e0e0e, 0x3ee71f1f, + 0xc4556262, 0xb53ad4d4, 0x4d81a8a8, 0x31529696, + 0xef62f9f9, 0x97a3c5c5, 0x4a102525, 0xb2ab5959, + 0x15d08484, 0xe4c57272, 0x72ec3939, 0x98164c4c, + 0xbc945e5e, 0xf09f7878, 0x70e53838, 0x05988c8c, + 0xbf17d1d1, 0x57e4a5a5, 0xd9a1e2e2, 0xc24e6161, + 0x7b42b3b3, 0x42342121, 0x25089c9c, 0x3cee1e1e, + 0x86614343, 0x93b1c7c7, 0xe54ffcfc, 0x08240404, + 0xa2e35151, 0x2f259999, 0xda226d6d, 0x1a650d0d, + 0xe979fafa, 0xa369dfdf, 0xfca97e7e, 0x48192424, + 0x76fe3b3b, 0x4b9aabab, 0x81f0cece, 0x22991111, + 0x03838f8f, 0x9c044e4e, 0x7366b7b7, 0xcbe0ebeb, + 0x78c13c3c, 0x1ffd8181, 0x35409494, 0xf31cf7f7, + 0x6f18b9b9, 0x268b1313, 0x58512c2c, 0xbb05d3d3, + 0xd38ce7e7, 0xdc396e6e, 0x95aac4c4, 0x061b0303, + 0xacdc5656, 0x885e4444, 0xfea07f7f, 0x4f88a9a9, + 0x54672a2a, 0x6b0abbbb, 0x9f87c1c1, 0xa6f15353, + 0xa572dcdc, 0x16530b0b, 0x27019d9d, 0xd82b6c6c, + 0x62a43131, 0xe8f37474, 0xf115f6f6, 0x8c4c4646, + 0x45a5acac, 0x0fb58989, 0x28b41414, 0xdfbae1e1, + 0x2ca61616, 0x74f73a3a, 0xd2066969, 0x12410909, + 0xe0d77070, 0x716fb6b6, 0xbd1ed0d0, 0xc7d6eded, + 0x85e2cccc, 0x84684242, 0x2d2c9898, 0x55eda4a4, + 0x50752828, 0xb8865c5c, 0xed6bf8f8, 0x11c28686, + }, + { + 0x7830d818, 0xaf462623, 0xf991b8c6, 0x6fcdfbe8, + 0xa113cb87, 0x626d11b8, 0x05020901, 0x6e9e0d4f, + 0xee6c9b36, 0x0451ffa6, 0xbdb90cd2, 0x06f70ef5, + 0x80f29679, 0xcede306f, 0xef3f6d91, 0x07a4f852, + 0xfdc04760, 0x766535bc, 0xcd2b379b, 0x8c018a8e, + 0x155bd2a3, 0x3c186c0c, 0x8af6847b, 0xe16a8035, + 0x693af51d, 0x47ddb3e0, 0xacb321d7, 0xed999cc2, + 0x965c432e, 0x7a96294b, 0x21e15dfe, 0x16aed557, + 0x412abd15, 0xb6eee877, 0xeb6e9237, 0x56d79ee5, + 0xd923139f, 0x17fd23f0, 0x7f94204a, 0x95a944da, + 0x25b0a258, 0xca8fcfc9, 0x8d527c29, 0x22145a0a, + 0x4f7f50b1, 0x1a5dc9a0, 0xdad6146b, 0xab17d985, + 0x73673cbd, 0x34ba8f5d, 0x50209010, 0x03f507f4, + 0xc08bddcb, 0xc67cd33e, 0x110a2d05, 0xe6ce7867, + 0x53d597e4, 0xbb4e0227, 0x58827341, 0x9d0ba78b, + 0x0153f6a7, 0x94fab27d, 0xfb374995, 0x9fad56d8, + 0x30eb70fb, 0x71c1cdee, 0x91f8bb7c, 0xe3cc7166, + 0x8ea77bdd, 0x4b2eaf17, 0x468e4547, 0xdc211a9e, + 0xc589d4ca, 0x995a582d, 0x79632ebf, 0x1b0e3f07, + 0x2347acad, 0x2fb4b05a, 0xb51bef83, 0xff66b633, + 0xf2c65c63, 0x0a041202, 0x384993aa, 0xa8e2de71, + 0xcf8dc6c8, 0x7d32d119, 0x70923b49, 0x9aaf5fd9, + 0x1df931f2, 0x48dba8e3, 0x2ab6b95b, 0x920dbc88, + 0xc8293e9a, 0xbe4c0b26, 0xfa64bf32, 0x4a7d59b0, + 0x6acff2e9, 0x331e770f, 0xa6b733d5, 0xba1df480, + 0x7c6127be, 0xde87ebcd, 0xe4688934, 0x75903248, + 0x24e354ff, 0x8ff48d7a, 0xea3d6490, 0x3ebe9d5f, + 0xa0403d20, 0xd5d00f68, 0x7234ca1a, 0x2c41b7ae, + 0x5e757db4, 0x19a8ce54, 0xe53b7f93, 0xaa442f22, + 0xe9c86364, 0x12ff2af1, 0xa2e6cc73, 0x5a248212, + 0x5d807a40, 0x28104808, 0xe89b95c3, 0x7bc5dfec, + 0x90ab4ddb, 0x1f5fc0a1, 0x8307918d, 0xc97ac83d, + 0xf1335b97, 0x00000000, 0xd483f9cf, 0x87566e2b, + 0xb3ece176, 0xb019e682, 0xa9b128d6, 0x7736c31b, + 0x5b7774b5, 0x2943beaf, 0xdfd41d6a, 0x0da0ea50, + 0x4c8a5745, 0x18fb38f3, 0xf060ad30, 0x74c3c4ef, + 0xc37eda3f, 0x1caac755, 0x1059dba2, 0x65c9e9ea, + 0xecca6a65, 0x686903ba, 0x935e4a2f, 0xe79d8ec0, + 0x81a160de, 0x6c38fc1c, 0x2ee746fd, 0x649a1f4d, + 0xe0397692, 0xbceafa75, 0x1e0c3606, 0x9809ae8a, + 0x40794bb2, 0x59d185e6, 0x361c7e0e, 0x633ee71f, + 0xf7c45562, 0xa3b53ad4, 0x324d81a8, 0xf4315296, + 0x3aef62f9, 0xf697a3c5, 0xb14a1025, 0x20b2ab59, + 0xae15d084, 0xa7e4c572, 0xdd72ec39, 0x6198164c, + 0x3bbc945e, 0x85f09f78, 0xd870e538, 0x8605988c, + 0xb2bf17d1, 0x0b57e4a5, 0x4dd9a1e2, 0xf8c24e61, + 0x457b42b3, 0xa5423421, 0xd625089c, 0x663cee1e, + 0x52866143, 0xfc93b1c7, 0x2be54ffc, 0x14082404, + 0x08a2e351, 0xc72f2599, 0xc4da226d, 0x391a650d, + 0x35e979fa, 0x84a369df, 0x9bfca97e, 0xb4481924, + 0xd776fe3b, 0x3d4b9aab, 0xd181f0ce, 0x55229911, + 0x8903838f, 0x6b9c044e, 0x517366b7, 0x60cbe0eb, + 0xcc78c13c, 0xbf1ffd81, 0xfe354094, 0x0cf31cf7, + 0x676f18b9, 0x5f268b13, 0x9c58512c, 0xb8bb05d3, + 0x5cd38ce7, 0xcbdc396e, 0xf395aac4, 0x0f061b03, + 0x13acdc56, 0x49885e44, 0x9efea07f, 0x374f88a9, + 0x8254672a, 0x6d6b0abb, 0xe29f87c1, 0x02a6f153, + 0x8ba572dc, 0x2716530b, 0xd327019d, 0xc1d82b6c, + 0xf562a431, 0xb9e8f374, 0x09f115f6, 0x438c4c46, + 0x2645a5ac, 0x970fb589, 0x4428b414, 0x42dfbae1, + 0x4e2ca616, 0xd274f73a, 0xd0d20669, 0x2d124109, + 0xade0d770, 0x54716fb6, 0xb7bd1ed0, 0x7ec7d6ed, + 0xdb85e2cc, 0x57846842, 0xc22d2c98, 0x0e55eda4, + 0x88507528, 0x31b8865c, 0x3fed6bf8, 0xa411c286, + }, +}; + +__constant u32 rch[R + 1] = +{ + 0x00000000, + 0x1823c6e8, + 0x36a6d2f5, + 0x60bc9b8e, + 0x1de0d7c2, + 0x157737e5, + 0x58c9290a, + 0xbd5d10f4, + 0xe427418b, + 0xfbee7c66, + 0xca2dbf07, +}; + +__constant u32 rcl[R + 1] = +{ + 0x00000000, + 0x87b8014f, + 0x796f9152, + 0xa30c7b35, + 0x2e4bfe57, + 0x9ff04ada, + 0xb1a06b85, + 0xcb3e0567, + 0xa77d95d8, + 0xdd17479e, + 0xad5a8333, +}; + +// this is a highly optimized that assumes dgst[16] = { 0 }; only reuse of no 2nd transform is needed + +static void whirlpool_transform (const u32x w[16], u32x dgst[16], __local u32 s_Ch[8][256], __local u32 s_Cl[8][256]) +{ + u32x Kh[8]; + u32x Kl[8]; + + Kh[0] = 0x300beec0; + Kl[0] = 0xaf902967; + Kh[1] = 0x28282828; + Kl[1] = 0x28282828; + Kh[2] = 0x28282828; + Kl[2] = 0x28282828; + Kh[3] = 0x28282828; + Kl[3] = 0x28282828; + Kh[4] = 0x28282828; + Kl[4] = 0x28282828; + Kh[5] = 0x28282828; + Kl[5] = 0x28282828; + Kh[6] = 0x28282828; + Kl[6] = 0x28282828; + Kh[7] = 0x28282828; + Kl[7] = 0x28282828; + + u32x stateh[8]; + u32x statel[8]; + + stateh[0] = w[ 0]; + statel[0] = w[ 1]; + stateh[1] = w[ 2]; + statel[1] = w[ 3]; + stateh[2] = w[ 4]; + statel[2] = w[ 5]; + stateh[3] = w[ 6]; + statel[3] = w[ 7]; + stateh[4] = w[ 8]; + statel[4] = w[ 9]; + stateh[5] = w[10]; + statel[5] = w[11]; + stateh[6] = w[12]; + statel[6] = w[13]; + stateh[7] = w[14]; + statel[7] = w[15]; + + u32x Lh[8]; + u32x Ll[8]; + + #pragma unroll + for (int i = 0; i < 8; i++) + { + const u32x Lp0 = stateh[(i + 8) & 7] >> 24; + const u32x Lp1 = stateh[(i + 7) & 7] >> 16; + const u32x Lp2 = stateh[(i + 6) & 7] >> 8; + const u32x Lp3 = stateh[(i + 5) & 7] >> 0; + const u32x Lp4 = statel[(i + 4) & 7] >> 24; + const u32x Lp5 = statel[(i + 3) & 7] >> 16; + const u32x Lp6 = statel[(i + 2) & 7] >> 8; + const u32x Lp7 = statel[(i + 1) & 7] >> 0; + + Lh[i] = BOX (s_Ch, 0, Lp0 & 0xff) + ^ BOX (s_Ch, 1, Lp1 & 0xff) + ^ BOX (s_Ch, 2, Lp2 & 0xff) + ^ BOX (s_Ch, 3, Lp3 & 0xff) + ^ BOX (s_Ch, 4, Lp4 & 0xff) + ^ BOX (s_Ch, 5, Lp5 & 0xff) + ^ BOX (s_Ch, 6, Lp6 & 0xff) + ^ BOX (s_Ch, 7, Lp7 & 0xff); + + Ll[i] = BOX (s_Cl, 0, Lp0 & 0xff) + ^ BOX (s_Cl, 1, Lp1 & 0xff) + ^ BOX (s_Cl, 2, Lp2 & 0xff) + ^ BOX (s_Cl, 3, Lp3 & 0xff) + ^ BOX (s_Cl, 4, Lp4 & 0xff) + ^ BOX (s_Cl, 5, Lp5 & 0xff) + ^ BOX (s_Cl, 6, Lp6 & 0xff) + ^ BOX (s_Cl, 7, Lp7 & 0xff); + } + + stateh[0] = Lh[0] ^ Kh[0]; + statel[0] = Ll[0] ^ Kl[0]; + stateh[1] = Lh[1] ^ Kh[1]; + statel[1] = Ll[1] ^ Kl[1]; + stateh[2] = Lh[2] ^ Kh[2]; + statel[2] = Ll[2] ^ Kl[2]; + stateh[3] = Lh[3] ^ Kh[3]; + statel[3] = Ll[3] ^ Kl[3]; + stateh[4] = Lh[4] ^ Kh[4]; + statel[4] = Ll[4] ^ Kl[4]; + stateh[5] = Lh[5] ^ Kh[5]; + statel[5] = Ll[5] ^ Kl[5]; + stateh[6] = Lh[6] ^ Kh[6]; + statel[6] = Ll[6] ^ Kl[6]; + stateh[7] = Lh[7] ^ Kh[7]; + statel[7] = Ll[7] ^ Kl[7]; + + for (int r = 2; r <= R; r++) + { + u32x Lh[8]; + u32x Ll[8]; + + #pragma unroll + for (int i = 0; i < 8; i++) + { + const u32x Lp0 = Kh[(i + 8) & 7] >> 24; + const u32x Lp1 = Kh[(i + 7) & 7] >> 16; + const u32x Lp2 = Kh[(i + 6) & 7] >> 8; + const u32x Lp3 = Kh[(i + 5) & 7] >> 0; + const u32x Lp4 = Kl[(i + 4) & 7] >> 24; + const u32x Lp5 = Kl[(i + 3) & 7] >> 16; + const u32x Lp6 = Kl[(i + 2) & 7] >> 8; + const u32x Lp7 = Kl[(i + 1) & 7] >> 0; + + Lh[i] = BOX (s_Ch, 0, Lp0 & 0xff) + ^ BOX (s_Ch, 1, Lp1 & 0xff) + ^ BOX (s_Ch, 2, Lp2 & 0xff) + ^ BOX (s_Ch, 3, Lp3 & 0xff) + ^ BOX (s_Ch, 4, Lp4 & 0xff) + ^ BOX (s_Ch, 5, Lp5 & 0xff) + ^ BOX (s_Ch, 6, Lp6 & 0xff) + ^ BOX (s_Ch, 7, Lp7 & 0xff); + + Ll[i] = BOX (s_Cl, 0, Lp0 & 0xff) + ^ BOX (s_Cl, 1, Lp1 & 0xff) + ^ BOX (s_Cl, 2, Lp2 & 0xff) + ^ BOX (s_Cl, 3, Lp3 & 0xff) + ^ BOX (s_Cl, 4, Lp4 & 0xff) + ^ BOX (s_Cl, 5, Lp5 & 0xff) + ^ BOX (s_Cl, 6, Lp6 & 0xff) + ^ BOX (s_Cl, 7, Lp7 & 0xff); + } + + Kh[0] = Lh[0] ^ rch[r]; + Kl[0] = Ll[0] ^ rcl[r]; + Kh[1] = Lh[1]; + Kl[1] = Ll[1]; + Kh[2] = Lh[2]; + Kl[2] = Ll[2]; + Kh[3] = Lh[3]; + Kl[3] = Ll[3]; + Kh[4] = Lh[4]; + Kl[4] = Ll[4]; + Kh[5] = Lh[5]; + Kl[5] = Ll[5]; + Kh[6] = Lh[6]; + Kl[6] = Ll[6]; + Kh[7] = Lh[7]; + Kl[7] = Ll[7]; + + #pragma unroll 8 + for (int i = 0; i < 8; i++) + { + const u32x Lp0 = stateh[(i + 8) & 7] >> 24; + const u32x Lp1 = stateh[(i + 7) & 7] >> 16; + const u32x Lp2 = stateh[(i + 6) & 7] >> 8; + const u32x Lp3 = stateh[(i + 5) & 7] >> 0; + const u32x Lp4 = statel[(i + 4) & 7] >> 24; + const u32x Lp5 = statel[(i + 3) & 7] >> 16; + const u32x Lp6 = statel[(i + 2) & 7] >> 8; + const u32x Lp7 = statel[(i + 1) & 7] >> 0; + + Lh[i] = BOX (s_Ch, 0, Lp0 & 0xff) + ^ BOX (s_Ch, 1, Lp1 & 0xff) + ^ BOX (s_Ch, 2, Lp2 & 0xff) + ^ BOX (s_Ch, 3, Lp3 & 0xff) + ^ BOX (s_Ch, 4, Lp4 & 0xff) + ^ BOX (s_Ch, 5, Lp5 & 0xff) + ^ BOX (s_Ch, 6, Lp6 & 0xff) + ^ BOX (s_Ch, 7, Lp7 & 0xff); + + Ll[i] = BOX (s_Cl, 0, Lp0 & 0xff) + ^ BOX (s_Cl, 1, Lp1 & 0xff) + ^ BOX (s_Cl, 2, Lp2 & 0xff) + ^ BOX (s_Cl, 3, Lp3 & 0xff) + ^ BOX (s_Cl, 4, Lp4 & 0xff) + ^ BOX (s_Cl, 5, Lp5 & 0xff) + ^ BOX (s_Cl, 6, Lp6 & 0xff) + ^ BOX (s_Cl, 7, Lp7 & 0xff); + } + + stateh[0] = Lh[0] ^ Kh[0]; + statel[0] = Ll[0] ^ Kl[0]; + stateh[1] = Lh[1] ^ Kh[1]; + statel[1] = Ll[1] ^ Kl[1]; + stateh[2] = Lh[2] ^ Kh[2]; + statel[2] = Ll[2] ^ Kl[2]; + stateh[3] = Lh[3] ^ Kh[3]; + statel[3] = Ll[3] ^ Kl[3]; + stateh[4] = Lh[4] ^ Kh[4]; + statel[4] = Ll[4] ^ Kl[4]; + stateh[5] = Lh[5] ^ Kh[5]; + statel[5] = Ll[5] ^ Kl[5]; + stateh[6] = Lh[6] ^ Kh[6]; + statel[6] = Ll[6] ^ Kl[6]; + stateh[7] = Lh[7] ^ Kh[7]; + statel[7] = Ll[7] ^ Kl[7]; + } + + dgst[ 0] = stateh[0] ^ w[ 0]; + dgst[ 1] = statel[0] ^ w[ 1]; + dgst[ 2] = stateh[1] ^ w[ 2]; + dgst[ 3] = statel[1] ^ w[ 3]; + dgst[ 4] = stateh[2] ^ w[ 4]; + dgst[ 5] = statel[2] ^ w[ 5]; + dgst[ 6] = stateh[3] ^ w[ 6]; + dgst[ 7] = statel[3] ^ w[ 7]; + dgst[ 8] = stateh[4] ^ w[ 8]; + dgst[ 9] = statel[4] ^ w[ 9]; + dgst[10] = stateh[5] ^ w[10]; + dgst[11] = statel[5] ^ w[11]; + dgst[12] = stateh[6] ^ w[12]; + dgst[13] = statel[6] ^ w[13]; + dgst[14] = stateh[7] ^ w[14]; + dgst[15] = statel[7] ^ w[15]; +} + +static void m06100m (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], const u32 pw_len, __global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, __local u32 s_Cl[8][256], __local u32 s_Ch[8][256]) +{ + /** + * modifier + */ + + const u32 gid = get_global_id (0); + const u32 lid = get_local_id (0); + + /** + * loop + */ + + u32x w0l = w0[0]; + + for (u32 il_pos = 0; il_pos < bfs_cnt; il_pos++) + { + const u32 w0r = bfs_buf[il_pos].i; + + w0[0] = w0l | w0r; + + u32x wl[16]; + + wl[ 0] = w0[0]; + wl[ 1] = w0[1]; + wl[ 2] = w0[2]; + wl[ 3] = w0[3]; + wl[ 4] = w1[0]; + wl[ 5] = w1[1]; + wl[ 6] = w1[2]; + wl[ 7] = w1[3]; + wl[ 8] = w2[0]; + wl[ 9] = w2[1]; + wl[10] = w2[2]; + wl[11] = w2[3]; + wl[12] = w3[0]; + wl[13] = w3[1]; + wl[14] = 0; + wl[15] = pw_len * 8; + + u32x dgst[16]; + + whirlpool_transform (wl, dgst, s_Ch, s_Cl); + + const u32x r0 = dgst[0]; + const u32x r1 = dgst[1]; + const u32x r2 = dgst[2]; + const u32x r3 = dgst[3]; + + #include VECT_COMPARE_M + } +} + +static void m06100s (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], const u32 pw_len, __global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, __local u32 s_Cl[8][256], __local u32 s_Ch[8][256]) +{ + /** + * modifier + */ + + const u32 gid = get_global_id (0); + const u32 lid = get_local_id (0); + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * loop + */ + + u32x w0l = w0[0]; + + for (u32 il_pos = 0; il_pos < bfs_cnt; il_pos++) + { + const u32 w0r = bfs_buf[il_pos].i; + + w0[0] = w0l | w0r; + + u32x wl[16]; + + wl[ 0] = w0[0]; + wl[ 1] = w0[1]; + wl[ 2] = w0[2]; + wl[ 3] = w0[3]; + wl[ 4] = w1[0]; + wl[ 5] = w1[1]; + wl[ 6] = w1[2]; + wl[ 7] = w1[3]; + wl[ 8] = w2[0]; + wl[ 9] = w2[1]; + wl[10] = w2[2]; + wl[11] = w2[3]; + wl[12] = w3[0]; + wl[13] = w3[1]; + wl[14] = 0; + wl[15] = pw_len * 8; + + u32x dgst[16]; + + whirlpool_transform (wl, dgst, s_Ch, s_Cl); + + const u32x r0 = dgst[0]; + const u32x r1 = dgst[1]; + const u32x r2 = dgst[2]; + const u32x r3 = dgst[3]; + + #include VECT_COMPARE_S + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m06100_m04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * modifier + */ + + __local u32 s_Ch[8][256]; + __local u32 s_Cl[8][256]; + + const u32 lid4 = lid * 4; + + for (u32 i = 0; i < 8; i++) + { + s_Ch[i][lid4 + 0] = Ch[i][lid4 + 0]; + s_Ch[i][lid4 + 1] = Ch[i][lid4 + 1]; + s_Ch[i][lid4 + 2] = Ch[i][lid4 + 2]; + s_Ch[i][lid4 + 3] = Ch[i][lid4 + 3]; + s_Cl[i][lid4 + 0] = Cl[i][lid4 + 0]; + s_Cl[i][lid4 + 1] = Cl[i][lid4 + 1]; + s_Cl[i][lid4 + 2] = Cl[i][lid4 + 2]; + s_Cl[i][lid4 + 3] = Cl[i][lid4 + 3]; + } + + barrier (CLK_LOCAL_MEM_FENCE); + + if (gid >= gid_max) return; + + /** + * main + */ + + m06100m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset, s_Cl, s_Ch); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m06100_m08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * modifier + */ + + __local u32 s_Ch[8][256]; + __local u32 s_Cl[8][256]; + + const u32 lid4 = lid * 4; + + for (u32 i = 0; i < 8; i++) + { + s_Ch[i][lid4 + 0] = Ch[i][lid4 + 0]; + s_Ch[i][lid4 + 1] = Ch[i][lid4 + 1]; + s_Ch[i][lid4 + 2] = Ch[i][lid4 + 2]; + s_Ch[i][lid4 + 3] = Ch[i][lid4 + 3]; + s_Cl[i][lid4 + 0] = Cl[i][lid4 + 0]; + s_Cl[i][lid4 + 1] = Cl[i][lid4 + 1]; + s_Cl[i][lid4 + 2] = Cl[i][lid4 + 2]; + s_Cl[i][lid4 + 3] = Cl[i][lid4 + 3]; + } + + barrier (CLK_LOCAL_MEM_FENCE); + + if (gid >= gid_max) return; + + /** + * main + */ + + m06100m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset, s_Cl, s_Ch); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m06100_m16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = pws[gid].i[ 8]; + w2[1] = pws[gid].i[ 9]; + w2[2] = pws[gid].i[10]; + w2[3] = pws[gid].i[11]; + + u32x w3[4]; + + w3[0] = pws[gid].i[12]; + w3[1] = pws[gid].i[13]; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * modifier + */ + + __local u32 s_Ch[8][256]; + __local u32 s_Cl[8][256]; + + const u32 lid4 = lid * 4; + + for (u32 i = 0; i < 8; i++) + { + s_Ch[i][lid4 + 0] = Ch[i][lid4 + 0]; + s_Ch[i][lid4 + 1] = Ch[i][lid4 + 1]; + s_Ch[i][lid4 + 2] = Ch[i][lid4 + 2]; + s_Ch[i][lid4 + 3] = Ch[i][lid4 + 3]; + s_Cl[i][lid4 + 0] = Cl[i][lid4 + 0]; + s_Cl[i][lid4 + 1] = Cl[i][lid4 + 1]; + s_Cl[i][lid4 + 2] = Cl[i][lid4 + 2]; + s_Cl[i][lid4 + 3] = Cl[i][lid4 + 3]; + } + + barrier (CLK_LOCAL_MEM_FENCE); + + if (gid >= gid_max) return; + + /** + * main + */ + + m06100m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset, s_Cl, s_Ch); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m06100_s04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * modifier + */ + + __local u32 s_Ch[8][256]; + __local u32 s_Cl[8][256]; + + const u32 lid4 = lid * 4; + + for (u32 i = 0; i < 8; i++) + { + s_Ch[i][lid4 + 0] = Ch[i][lid4 + 0]; + s_Ch[i][lid4 + 1] = Ch[i][lid4 + 1]; + s_Ch[i][lid4 + 2] = Ch[i][lid4 + 2]; + s_Ch[i][lid4 + 3] = Ch[i][lid4 + 3]; + s_Cl[i][lid4 + 0] = Cl[i][lid4 + 0]; + s_Cl[i][lid4 + 1] = Cl[i][lid4 + 1]; + s_Cl[i][lid4 + 2] = Cl[i][lid4 + 2]; + s_Cl[i][lid4 + 3] = Cl[i][lid4 + 3]; + } + + barrier (CLK_LOCAL_MEM_FENCE); + + if (gid >= gid_max) return; + + /** + * main + */ + + m06100s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset, s_Cl, s_Ch); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m06100_s08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * modifier + */ + + __local u32 s_Ch[8][256]; + __local u32 s_Cl[8][256]; + + const u32 lid4 = lid * 4; + + for (u32 i = 0; i < 8; i++) + { + s_Ch[i][lid4 + 0] = Ch[i][lid4 + 0]; + s_Ch[i][lid4 + 1] = Ch[i][lid4 + 1]; + s_Ch[i][lid4 + 2] = Ch[i][lid4 + 2]; + s_Ch[i][lid4 + 3] = Ch[i][lid4 + 3]; + s_Cl[i][lid4 + 0] = Cl[i][lid4 + 0]; + s_Cl[i][lid4 + 1] = Cl[i][lid4 + 1]; + s_Cl[i][lid4 + 2] = Cl[i][lid4 + 2]; + s_Cl[i][lid4 + 3] = Cl[i][lid4 + 3]; + } + + barrier (CLK_LOCAL_MEM_FENCE); + + if (gid >= gid_max) return; + + /** + * main + */ + + m06100s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset, s_Cl, s_Ch); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m06100_s16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = pws[gid].i[ 8]; + w2[1] = pws[gid].i[ 9]; + w2[2] = pws[gid].i[10]; + w2[3] = pws[gid].i[11]; + + u32x w3[4]; + + w3[0] = pws[gid].i[12]; + w3[1] = pws[gid].i[13]; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * modifier + */ + + __local u32 s_Ch[8][256]; + __local u32 s_Cl[8][256]; + + const u32 lid4 = lid * 4; + + for (u32 i = 0; i < 8; i++) + { + s_Ch[i][lid4 + 0] = Ch[i][lid4 + 0]; + s_Ch[i][lid4 + 1] = Ch[i][lid4 + 1]; + s_Ch[i][lid4 + 2] = Ch[i][lid4 + 2]; + s_Ch[i][lid4 + 3] = Ch[i][lid4 + 3]; + s_Cl[i][lid4 + 0] = Cl[i][lid4 + 0]; + s_Cl[i][lid4 + 1] = Cl[i][lid4 + 1]; + s_Cl[i][lid4 + 2] = Cl[i][lid4 + 2]; + s_Cl[i][lid4 + 3] = Cl[i][lid4 + 3]; + } + + barrier (CLK_LOCAL_MEM_FENCE); + + if (gid >= gid_max) return; + + /** + * main + */ + + m06100s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset, s_Cl, s_Ch); +} diff --git a/amd/m06211.cl b/amd/m06211.cl new file mode 100644 index 0000000000..d4cc214292 --- /dev/null +++ b/amd/m06211.cl @@ -0,0 +1,720 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _RIPEMD160_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW4 +#define VECT_SIZE1 +#endif + +#ifdef VLIW5 +#define VECT_SIZE1 +#endif + +#define DGST_R0 0 +#define DGST_R1 1 +#define DGST_R2 2 +#define DGST_R3 3 + +#include "include/kernel_functions.c" +#include "types_amd.c" +#include "common_amd.c" + +#include "gpu_aes256_amd.c" +#include "gpu_twofish256_amd.c" +#include "gpu_serpent256_amd.c" + +static void ripemd160_transform (const u32x w[16], u32x dgst[5]) +{ + u32x a1 = dgst[0]; + u32x b1 = dgst[1]; + u32x c1 = dgst[2]; + u32x d1 = dgst[3]; + u32x e1 = dgst[4]; + + RIPEMD160_STEP (RIPEMD160_F , a1, b1, c1, d1, e1, w[ 0], RIPEMD160C00, RIPEMD160S00); + RIPEMD160_STEP (RIPEMD160_F , e1, a1, b1, c1, d1, w[ 1], RIPEMD160C00, RIPEMD160S01); + RIPEMD160_STEP (RIPEMD160_F , d1, e1, a1, b1, c1, w[ 2], RIPEMD160C00, RIPEMD160S02); + RIPEMD160_STEP (RIPEMD160_F , c1, d1, e1, a1, b1, w[ 3], RIPEMD160C00, RIPEMD160S03); + RIPEMD160_STEP (RIPEMD160_F , b1, c1, d1, e1, a1, w[ 4], RIPEMD160C00, RIPEMD160S04); + RIPEMD160_STEP (RIPEMD160_F , a1, b1, c1, d1, e1, w[ 5], RIPEMD160C00, RIPEMD160S05); + RIPEMD160_STEP (RIPEMD160_F , e1, a1, b1, c1, d1, w[ 6], RIPEMD160C00, RIPEMD160S06); + RIPEMD160_STEP (RIPEMD160_F , d1, e1, a1, b1, c1, w[ 7], RIPEMD160C00, RIPEMD160S07); + RIPEMD160_STEP (RIPEMD160_F , c1, d1, e1, a1, b1, w[ 8], RIPEMD160C00, RIPEMD160S08); + RIPEMD160_STEP (RIPEMD160_F , b1, c1, d1, e1, a1, w[ 9], RIPEMD160C00, RIPEMD160S09); + RIPEMD160_STEP (RIPEMD160_F , a1, b1, c1, d1, e1, w[10], RIPEMD160C00, RIPEMD160S0A); + RIPEMD160_STEP (RIPEMD160_F , e1, a1, b1, c1, d1, w[11], RIPEMD160C00, RIPEMD160S0B); + RIPEMD160_STEP (RIPEMD160_F , d1, e1, a1, b1, c1, w[12], RIPEMD160C00, RIPEMD160S0C); + RIPEMD160_STEP (RIPEMD160_F , c1, d1, e1, a1, b1, w[13], RIPEMD160C00, RIPEMD160S0D); + RIPEMD160_STEP (RIPEMD160_F , b1, c1, d1, e1, a1, w[14], RIPEMD160C00, RIPEMD160S0E); + RIPEMD160_STEP (RIPEMD160_F , a1, b1, c1, d1, e1, w[15], RIPEMD160C00, RIPEMD160S0F); + + RIPEMD160_STEP (RIPEMD160_Go, e1, a1, b1, c1, d1, w[ 7], RIPEMD160C10, RIPEMD160S10); + RIPEMD160_STEP (RIPEMD160_Go, d1, e1, a1, b1, c1, w[ 4], RIPEMD160C10, RIPEMD160S11); + RIPEMD160_STEP (RIPEMD160_Go, c1, d1, e1, a1, b1, w[13], RIPEMD160C10, RIPEMD160S12); + RIPEMD160_STEP (RIPEMD160_Go, b1, c1, d1, e1, a1, w[ 1], RIPEMD160C10, RIPEMD160S13); + RIPEMD160_STEP (RIPEMD160_Go, a1, b1, c1, d1, e1, w[10], RIPEMD160C10, RIPEMD160S14); + RIPEMD160_STEP (RIPEMD160_Go, e1, a1, b1, c1, d1, w[ 6], RIPEMD160C10, RIPEMD160S15); + RIPEMD160_STEP (RIPEMD160_Go, d1, e1, a1, b1, c1, w[15], RIPEMD160C10, RIPEMD160S16); + RIPEMD160_STEP (RIPEMD160_Go, c1, d1, e1, a1, b1, w[ 3], RIPEMD160C10, RIPEMD160S17); + RIPEMD160_STEP (RIPEMD160_Go, b1, c1, d1, e1, a1, w[12], RIPEMD160C10, RIPEMD160S18); + RIPEMD160_STEP (RIPEMD160_Go, a1, b1, c1, d1, e1, w[ 0], RIPEMD160C10, RIPEMD160S19); + RIPEMD160_STEP (RIPEMD160_Go, e1, a1, b1, c1, d1, w[ 9], RIPEMD160C10, RIPEMD160S1A); + RIPEMD160_STEP (RIPEMD160_Go, d1, e1, a1, b1, c1, w[ 5], RIPEMD160C10, RIPEMD160S1B); + RIPEMD160_STEP (RIPEMD160_Go, c1, d1, e1, a1, b1, w[ 2], RIPEMD160C10, RIPEMD160S1C); + RIPEMD160_STEP (RIPEMD160_Go, b1, c1, d1, e1, a1, w[14], RIPEMD160C10, RIPEMD160S1D); + RIPEMD160_STEP (RIPEMD160_Go, a1, b1, c1, d1, e1, w[11], RIPEMD160C10, RIPEMD160S1E); + RIPEMD160_STEP (RIPEMD160_Go, e1, a1, b1, c1, d1, w[ 8], RIPEMD160C10, RIPEMD160S1F); + + RIPEMD160_STEP (RIPEMD160_H , d1, e1, a1, b1, c1, w[ 3], RIPEMD160C20, RIPEMD160S20); + RIPEMD160_STEP (RIPEMD160_H , c1, d1, e1, a1, b1, w[10], RIPEMD160C20, RIPEMD160S21); + RIPEMD160_STEP (RIPEMD160_H , b1, c1, d1, e1, a1, w[14], RIPEMD160C20, RIPEMD160S22); + RIPEMD160_STEP (RIPEMD160_H , a1, b1, c1, d1, e1, w[ 4], RIPEMD160C20, RIPEMD160S23); + RIPEMD160_STEP (RIPEMD160_H , e1, a1, b1, c1, d1, w[ 9], RIPEMD160C20, RIPEMD160S24); + RIPEMD160_STEP (RIPEMD160_H , d1, e1, a1, b1, c1, w[15], RIPEMD160C20, RIPEMD160S25); + RIPEMD160_STEP (RIPEMD160_H , c1, d1, e1, a1, b1, w[ 8], RIPEMD160C20, RIPEMD160S26); + RIPEMD160_STEP (RIPEMD160_H , b1, c1, d1, e1, a1, w[ 1], RIPEMD160C20, RIPEMD160S27); + RIPEMD160_STEP (RIPEMD160_H , a1, b1, c1, d1, e1, w[ 2], RIPEMD160C20, RIPEMD160S28); + RIPEMD160_STEP (RIPEMD160_H , e1, a1, b1, c1, d1, w[ 7], RIPEMD160C20, RIPEMD160S29); + RIPEMD160_STEP (RIPEMD160_H , d1, e1, a1, b1, c1, w[ 0], RIPEMD160C20, RIPEMD160S2A); + RIPEMD160_STEP (RIPEMD160_H , c1, d1, e1, a1, b1, w[ 6], RIPEMD160C20, RIPEMD160S2B); + RIPEMD160_STEP (RIPEMD160_H , b1, c1, d1, e1, a1, w[13], RIPEMD160C20, RIPEMD160S2C); + RIPEMD160_STEP (RIPEMD160_H , a1, b1, c1, d1, e1, w[11], RIPEMD160C20, RIPEMD160S2D); + RIPEMD160_STEP (RIPEMD160_H , e1, a1, b1, c1, d1, w[ 5], RIPEMD160C20, RIPEMD160S2E); + RIPEMD160_STEP (RIPEMD160_H , d1, e1, a1, b1, c1, w[12], RIPEMD160C20, RIPEMD160S2F); + + RIPEMD160_STEP (RIPEMD160_Io, c1, d1, e1, a1, b1, w[ 1], RIPEMD160C30, RIPEMD160S30); + RIPEMD160_STEP (RIPEMD160_Io, b1, c1, d1, e1, a1, w[ 9], RIPEMD160C30, RIPEMD160S31); + RIPEMD160_STEP (RIPEMD160_Io, a1, b1, c1, d1, e1, w[11], RIPEMD160C30, RIPEMD160S32); + RIPEMD160_STEP (RIPEMD160_Io, e1, a1, b1, c1, d1, w[10], RIPEMD160C30, RIPEMD160S33); + RIPEMD160_STEP (RIPEMD160_Io, d1, e1, a1, b1, c1, w[ 0], RIPEMD160C30, RIPEMD160S34); + RIPEMD160_STEP (RIPEMD160_Io, c1, d1, e1, a1, b1, w[ 8], RIPEMD160C30, RIPEMD160S35); + RIPEMD160_STEP (RIPEMD160_Io, b1, c1, d1, e1, a1, w[12], RIPEMD160C30, RIPEMD160S36); + RIPEMD160_STEP (RIPEMD160_Io, a1, b1, c1, d1, e1, w[ 4], RIPEMD160C30, RIPEMD160S37); + RIPEMD160_STEP (RIPEMD160_Io, e1, a1, b1, c1, d1, w[13], RIPEMD160C30, RIPEMD160S38); + RIPEMD160_STEP (RIPEMD160_Io, d1, e1, a1, b1, c1, w[ 3], RIPEMD160C30, RIPEMD160S39); + RIPEMD160_STEP (RIPEMD160_Io, c1, d1, e1, a1, b1, w[ 7], RIPEMD160C30, RIPEMD160S3A); + RIPEMD160_STEP (RIPEMD160_Io, b1, c1, d1, e1, a1, w[15], RIPEMD160C30, RIPEMD160S3B); + RIPEMD160_STEP (RIPEMD160_Io, a1, b1, c1, d1, e1, w[14], RIPEMD160C30, RIPEMD160S3C); + RIPEMD160_STEP (RIPEMD160_Io, e1, a1, b1, c1, d1, w[ 5], RIPEMD160C30, RIPEMD160S3D); + RIPEMD160_STEP (RIPEMD160_Io, d1, e1, a1, b1, c1, w[ 6], RIPEMD160C30, RIPEMD160S3E); + RIPEMD160_STEP (RIPEMD160_Io, c1, d1, e1, a1, b1, w[ 2], RIPEMD160C30, RIPEMD160S3F); + + RIPEMD160_STEP (RIPEMD160_J , b1, c1, d1, e1, a1, w[ 4], RIPEMD160C40, RIPEMD160S40); + RIPEMD160_STEP (RIPEMD160_J , a1, b1, c1, d1, e1, w[ 0], RIPEMD160C40, RIPEMD160S41); + RIPEMD160_STEP (RIPEMD160_J , e1, a1, b1, c1, d1, w[ 5], RIPEMD160C40, RIPEMD160S42); + RIPEMD160_STEP (RIPEMD160_J , d1, e1, a1, b1, c1, w[ 9], RIPEMD160C40, RIPEMD160S43); + RIPEMD160_STEP (RIPEMD160_J , c1, d1, e1, a1, b1, w[ 7], RIPEMD160C40, RIPEMD160S44); + RIPEMD160_STEP (RIPEMD160_J , b1, c1, d1, e1, a1, w[12], RIPEMD160C40, RIPEMD160S45); + RIPEMD160_STEP (RIPEMD160_J , a1, b1, c1, d1, e1, w[ 2], RIPEMD160C40, RIPEMD160S46); + RIPEMD160_STEP (RIPEMD160_J , e1, a1, b1, c1, d1, w[10], RIPEMD160C40, RIPEMD160S47); + RIPEMD160_STEP (RIPEMD160_J , d1, e1, a1, b1, c1, w[14], RIPEMD160C40, RIPEMD160S48); + RIPEMD160_STEP (RIPEMD160_J , c1, d1, e1, a1, b1, w[ 1], RIPEMD160C40, RIPEMD160S49); + RIPEMD160_STEP (RIPEMD160_J , b1, c1, d1, e1, a1, w[ 3], RIPEMD160C40, RIPEMD160S4A); + RIPEMD160_STEP (RIPEMD160_J , a1, b1, c1, d1, e1, w[ 8], RIPEMD160C40, RIPEMD160S4B); + RIPEMD160_STEP (RIPEMD160_J , e1, a1, b1, c1, d1, w[11], RIPEMD160C40, RIPEMD160S4C); + RIPEMD160_STEP (RIPEMD160_J , d1, e1, a1, b1, c1, w[ 6], RIPEMD160C40, RIPEMD160S4D); + RIPEMD160_STEP (RIPEMD160_J , c1, d1, e1, a1, b1, w[15], RIPEMD160C40, RIPEMD160S4E); + RIPEMD160_STEP (RIPEMD160_J , b1, c1, d1, e1, a1, w[13], RIPEMD160C40, RIPEMD160S4F); + + u32x a2 = dgst[0]; + u32x b2 = dgst[1]; + u32x c2 = dgst[2]; + u32x d2 = dgst[3]; + u32x e2 = dgst[4]; + + RIPEMD160_STEP_WORKAROUND_BUG (RIPEMD160_J , a2, b2, c2, d2, e2, w[ 5], RIPEMD160C50, RIPEMD160S50); + RIPEMD160_STEP (RIPEMD160_J , e2, a2, b2, c2, d2, w[14], RIPEMD160C50, RIPEMD160S51); + RIPEMD160_STEP (RIPEMD160_J , d2, e2, a2, b2, c2, w[ 7], RIPEMD160C50, RIPEMD160S52); + RIPEMD160_STEP (RIPEMD160_J , c2, d2, e2, a2, b2, w[ 0], RIPEMD160C50, RIPEMD160S53); + RIPEMD160_STEP (RIPEMD160_J , b2, c2, d2, e2, a2, w[ 9], RIPEMD160C50, RIPEMD160S54); + RIPEMD160_STEP (RIPEMD160_J , a2, b2, c2, d2, e2, w[ 2], RIPEMD160C50, RIPEMD160S55); + RIPEMD160_STEP (RIPEMD160_J , e2, a2, b2, c2, d2, w[11], RIPEMD160C50, RIPEMD160S56); + RIPEMD160_STEP (RIPEMD160_J , d2, e2, a2, b2, c2, w[ 4], RIPEMD160C50, RIPEMD160S57); + RIPEMD160_STEP (RIPEMD160_J , c2, d2, e2, a2, b2, w[13], RIPEMD160C50, RIPEMD160S58); + RIPEMD160_STEP (RIPEMD160_J , b2, c2, d2, e2, a2, w[ 6], RIPEMD160C50, RIPEMD160S59); + RIPEMD160_STEP (RIPEMD160_J , a2, b2, c2, d2, e2, w[15], RIPEMD160C50, RIPEMD160S5A); + RIPEMD160_STEP (RIPEMD160_J , e2, a2, b2, c2, d2, w[ 8], RIPEMD160C50, RIPEMD160S5B); + RIPEMD160_STEP (RIPEMD160_J , d2, e2, a2, b2, c2, w[ 1], RIPEMD160C50, RIPEMD160S5C); + RIPEMD160_STEP (RIPEMD160_J , c2, d2, e2, a2, b2, w[10], RIPEMD160C50, RIPEMD160S5D); + RIPEMD160_STEP (RIPEMD160_J , b2, c2, d2, e2, a2, w[ 3], RIPEMD160C50, RIPEMD160S5E); + RIPEMD160_STEP (RIPEMD160_J , a2, b2, c2, d2, e2, w[12], RIPEMD160C50, RIPEMD160S5F); + + RIPEMD160_STEP (RIPEMD160_Io, e2, a2, b2, c2, d2, w[ 6], RIPEMD160C60, RIPEMD160S60); + RIPEMD160_STEP (RIPEMD160_Io, d2, e2, a2, b2, c2, w[11], RIPEMD160C60, RIPEMD160S61); + RIPEMD160_STEP (RIPEMD160_Io, c2, d2, e2, a2, b2, w[ 3], RIPEMD160C60, RIPEMD160S62); + RIPEMD160_STEP (RIPEMD160_Io, b2, c2, d2, e2, a2, w[ 7], RIPEMD160C60, RIPEMD160S63); + RIPEMD160_STEP (RIPEMD160_Io, a2, b2, c2, d2, e2, w[ 0], RIPEMD160C60, RIPEMD160S64); + RIPEMD160_STEP (RIPEMD160_Io, e2, a2, b2, c2, d2, w[13], RIPEMD160C60, RIPEMD160S65); + RIPEMD160_STEP (RIPEMD160_Io, d2, e2, a2, b2, c2, w[ 5], RIPEMD160C60, RIPEMD160S66); + RIPEMD160_STEP (RIPEMD160_Io, c2, d2, e2, a2, b2, w[10], RIPEMD160C60, RIPEMD160S67); + RIPEMD160_STEP (RIPEMD160_Io, b2, c2, d2, e2, a2, w[14], RIPEMD160C60, RIPEMD160S68); + RIPEMD160_STEP (RIPEMD160_Io, a2, b2, c2, d2, e2, w[15], RIPEMD160C60, RIPEMD160S69); + RIPEMD160_STEP (RIPEMD160_Io, e2, a2, b2, c2, d2, w[ 8], RIPEMD160C60, RIPEMD160S6A); + RIPEMD160_STEP (RIPEMD160_Io, d2, e2, a2, b2, c2, w[12], RIPEMD160C60, RIPEMD160S6B); + RIPEMD160_STEP (RIPEMD160_Io, c2, d2, e2, a2, b2, w[ 4], RIPEMD160C60, RIPEMD160S6C); + RIPEMD160_STEP (RIPEMD160_Io, b2, c2, d2, e2, a2, w[ 9], RIPEMD160C60, RIPEMD160S6D); + RIPEMD160_STEP (RIPEMD160_Io, a2, b2, c2, d2, e2, w[ 1], RIPEMD160C60, RIPEMD160S6E); + RIPEMD160_STEP (RIPEMD160_Io, e2, a2, b2, c2, d2, w[ 2], RIPEMD160C60, RIPEMD160S6F); + + RIPEMD160_STEP (RIPEMD160_H , d2, e2, a2, b2, c2, w[15], RIPEMD160C70, RIPEMD160S70); + RIPEMD160_STEP (RIPEMD160_H , c2, d2, e2, a2, b2, w[ 5], RIPEMD160C70, RIPEMD160S71); + RIPEMD160_STEP (RIPEMD160_H , b2, c2, d2, e2, a2, w[ 1], RIPEMD160C70, RIPEMD160S72); + RIPEMD160_STEP (RIPEMD160_H , a2, b2, c2, d2, e2, w[ 3], RIPEMD160C70, RIPEMD160S73); + RIPEMD160_STEP (RIPEMD160_H , e2, a2, b2, c2, d2, w[ 7], RIPEMD160C70, RIPEMD160S74); + RIPEMD160_STEP (RIPEMD160_H , d2, e2, a2, b2, c2, w[14], RIPEMD160C70, RIPEMD160S75); + RIPEMD160_STEP (RIPEMD160_H , c2, d2, e2, a2, b2, w[ 6], RIPEMD160C70, RIPEMD160S76); + RIPEMD160_STEP (RIPEMD160_H , b2, c2, d2, e2, a2, w[ 9], RIPEMD160C70, RIPEMD160S77); + RIPEMD160_STEP (RIPEMD160_H , a2, b2, c2, d2, e2, w[11], RIPEMD160C70, RIPEMD160S78); + RIPEMD160_STEP (RIPEMD160_H , e2, a2, b2, c2, d2, w[ 8], RIPEMD160C70, RIPEMD160S79); + RIPEMD160_STEP (RIPEMD160_H , d2, e2, a2, b2, c2, w[12], RIPEMD160C70, RIPEMD160S7A); + RIPEMD160_STEP (RIPEMD160_H , c2, d2, e2, a2, b2, w[ 2], RIPEMD160C70, RIPEMD160S7B); + RIPEMD160_STEP (RIPEMD160_H , b2, c2, d2, e2, a2, w[10], RIPEMD160C70, RIPEMD160S7C); + RIPEMD160_STEP (RIPEMD160_H , a2, b2, c2, d2, e2, w[ 0], RIPEMD160C70, RIPEMD160S7D); + RIPEMD160_STEP (RIPEMD160_H , e2, a2, b2, c2, d2, w[ 4], RIPEMD160C70, RIPEMD160S7E); + RIPEMD160_STEP (RIPEMD160_H , d2, e2, a2, b2, c2, w[13], RIPEMD160C70, RIPEMD160S7F); + + RIPEMD160_STEP (RIPEMD160_Go, c2, d2, e2, a2, b2, w[ 8], RIPEMD160C80, RIPEMD160S80); + RIPEMD160_STEP (RIPEMD160_Go, b2, c2, d2, e2, a2, w[ 6], RIPEMD160C80, RIPEMD160S81); + RIPEMD160_STEP (RIPEMD160_Go, a2, b2, c2, d2, e2, w[ 4], RIPEMD160C80, RIPEMD160S82); + RIPEMD160_STEP (RIPEMD160_Go, e2, a2, b2, c2, d2, w[ 1], RIPEMD160C80, RIPEMD160S83); + RIPEMD160_STEP (RIPEMD160_Go, d2, e2, a2, b2, c2, w[ 3], RIPEMD160C80, RIPEMD160S84); + RIPEMD160_STEP (RIPEMD160_Go, c2, d2, e2, a2, b2, w[11], RIPEMD160C80, RIPEMD160S85); + RIPEMD160_STEP (RIPEMD160_Go, b2, c2, d2, e2, a2, w[15], RIPEMD160C80, RIPEMD160S86); + RIPEMD160_STEP (RIPEMD160_Go, a2, b2, c2, d2, e2, w[ 0], RIPEMD160C80, RIPEMD160S87); + RIPEMD160_STEP (RIPEMD160_Go, e2, a2, b2, c2, d2, w[ 5], RIPEMD160C80, RIPEMD160S88); + RIPEMD160_STEP (RIPEMD160_Go, d2, e2, a2, b2, c2, w[12], RIPEMD160C80, RIPEMD160S89); + RIPEMD160_STEP (RIPEMD160_Go, c2, d2, e2, a2, b2, w[ 2], RIPEMD160C80, RIPEMD160S8A); + RIPEMD160_STEP (RIPEMD160_Go, b2, c2, d2, e2, a2, w[13], RIPEMD160C80, RIPEMD160S8B); + RIPEMD160_STEP (RIPEMD160_Go, a2, b2, c2, d2, e2, w[ 9], RIPEMD160C80, RIPEMD160S8C); + RIPEMD160_STEP (RIPEMD160_Go, e2, a2, b2, c2, d2, w[ 7], RIPEMD160C80, RIPEMD160S8D); + RIPEMD160_STEP (RIPEMD160_Go, d2, e2, a2, b2, c2, w[10], RIPEMD160C80, RIPEMD160S8E); + RIPEMD160_STEP (RIPEMD160_Go, c2, d2, e2, a2, b2, w[14], RIPEMD160C80, RIPEMD160S8F); + + RIPEMD160_STEP (RIPEMD160_F , b2, c2, d2, e2, a2, w[12], RIPEMD160C90, RIPEMD160S90); + RIPEMD160_STEP (RIPEMD160_F , a2, b2, c2, d2, e2, w[15], RIPEMD160C90, RIPEMD160S91); + RIPEMD160_STEP (RIPEMD160_F , e2, a2, b2, c2, d2, w[10], RIPEMD160C90, RIPEMD160S92); + RIPEMD160_STEP (RIPEMD160_F , d2, e2, a2, b2, c2, w[ 4], RIPEMD160C90, RIPEMD160S93); + RIPEMD160_STEP (RIPEMD160_F , c2, d2, e2, a2, b2, w[ 1], RIPEMD160C90, RIPEMD160S94); + RIPEMD160_STEP (RIPEMD160_F , b2, c2, d2, e2, a2, w[ 5], RIPEMD160C90, RIPEMD160S95); + RIPEMD160_STEP (RIPEMD160_F , a2, b2, c2, d2, e2, w[ 8], RIPEMD160C90, RIPEMD160S96); + RIPEMD160_STEP (RIPEMD160_F , e2, a2, b2, c2, d2, w[ 7], RIPEMD160C90, RIPEMD160S97); + RIPEMD160_STEP (RIPEMD160_F , d2, e2, a2, b2, c2, w[ 6], RIPEMD160C90, RIPEMD160S98); + RIPEMD160_STEP (RIPEMD160_F , c2, d2, e2, a2, b2, w[ 2], RIPEMD160C90, RIPEMD160S99); + RIPEMD160_STEP (RIPEMD160_F , b2, c2, d2, e2, a2, w[13], RIPEMD160C90, RIPEMD160S9A); + RIPEMD160_STEP (RIPEMD160_F , a2, b2, c2, d2, e2, w[14], RIPEMD160C90, RIPEMD160S9B); + RIPEMD160_STEP (RIPEMD160_F , e2, a2, b2, c2, d2, w[ 0], RIPEMD160C90, RIPEMD160S9C); + RIPEMD160_STEP (RIPEMD160_F , d2, e2, a2, b2, c2, w[ 3], RIPEMD160C90, RIPEMD160S9D); + RIPEMD160_STEP (RIPEMD160_F , c2, d2, e2, a2, b2, w[ 9], RIPEMD160C90, RIPEMD160S9E); + RIPEMD160_STEP (RIPEMD160_F , b2, c2, d2, e2, a2, w[11], RIPEMD160C90, RIPEMD160S9F); + + const u32x a = dgst[1] + c1 + d2; + const u32x b = dgst[2] + d1 + e2; + const u32x c = dgst[3] + e1 + a2; + const u32x d = dgst[4] + a1 + b2; + const u32x e = dgst[0] + b1 + c2; + + dgst[0] = a; + dgst[1] = b; + dgst[2] = c; + dgst[3] = d; + dgst[4] = e; +} + +static void hmac_run2 (const u32x w1[16], const u32x w2[16], const u32x ipad[5], const u32x opad[5], u32x dgst[5]) +{ + dgst[0] = ipad[0]; + dgst[1] = ipad[1]; + dgst[2] = ipad[2]; + dgst[3] = ipad[3]; + dgst[4] = ipad[4]; + + ripemd160_transform (w1, dgst); + ripemd160_transform (w2, dgst); + + u32x w[16]; + + w[ 0] = dgst[0]; + w[ 1] = dgst[1]; + w[ 2] = dgst[2]; + w[ 3] = dgst[3]; + w[ 4] = dgst[4]; + w[ 5] = 0x80; + w[ 6] = 0; + w[ 7] = 0; + w[ 8] = 0; + w[ 9] = 0; + w[10] = 0; + w[11] = 0; + w[12] = 0; + w[13] = 0; + w[14] = (64 + 20) * 8; + w[15] = 0; + + dgst[0] = opad[0]; + dgst[1] = opad[1]; + dgst[2] = opad[2]; + dgst[3] = opad[3]; + dgst[4] = opad[4]; + + ripemd160_transform (w, dgst); +} + +static void hmac_run (u32x w[16], const u32x ipad[5], const u32x opad[5], u32x dgst[5]) +{ + dgst[0] = ipad[0]; + dgst[1] = ipad[1]; + dgst[2] = ipad[2]; + dgst[3] = ipad[3]; + dgst[4] = ipad[4]; + + ripemd160_transform (w, dgst); + + w[ 0] = dgst[0]; + w[ 1] = dgst[1]; + w[ 2] = dgst[2]; + w[ 3] = dgst[3]; + w[ 4] = dgst[4]; + w[ 5] = 0x80; + w[ 6] = 0; + w[ 7] = 0; + w[ 8] = 0; + w[ 9] = 0; + w[10] = 0; + w[11] = 0; + w[12] = 0; + w[13] = 0; + w[14] = (64 + 20) * 8; + w[15] = 0; + + dgst[0] = opad[0]; + dgst[1] = opad[1]; + dgst[2] = opad[2]; + dgst[3] = opad[3]; + dgst[4] = opad[4]; + + ripemd160_transform (w, dgst); +} + +static void hmac_init (u32x w[16], u32x ipad[5], u32x opad[5]) +{ + w[ 0] ^= 0x36363636; + w[ 1] ^= 0x36363636; + w[ 2] ^= 0x36363636; + w[ 3] ^= 0x36363636; + w[ 4] ^= 0x36363636; + w[ 5] ^= 0x36363636; + w[ 6] ^= 0x36363636; + w[ 7] ^= 0x36363636; + w[ 8] ^= 0x36363636; + w[ 9] ^= 0x36363636; + w[10] ^= 0x36363636; + w[11] ^= 0x36363636; + w[12] ^= 0x36363636; + w[13] ^= 0x36363636; + w[14] ^= 0x36363636; + w[15] ^= 0x36363636; + + ipad[0] = RIPEMD160M_A; + ipad[1] = RIPEMD160M_B; + ipad[2] = RIPEMD160M_C; + ipad[3] = RIPEMD160M_D; + ipad[4] = RIPEMD160M_E; + + ripemd160_transform (w, ipad); + + w[ 0] ^= 0x6a6a6a6a; + w[ 1] ^= 0x6a6a6a6a; + w[ 2] ^= 0x6a6a6a6a; + w[ 3] ^= 0x6a6a6a6a; + w[ 4] ^= 0x6a6a6a6a; + w[ 5] ^= 0x6a6a6a6a; + w[ 6] ^= 0x6a6a6a6a; + w[ 7] ^= 0x6a6a6a6a; + w[ 8] ^= 0x6a6a6a6a; + w[ 9] ^= 0x6a6a6a6a; + w[10] ^= 0x6a6a6a6a; + w[11] ^= 0x6a6a6a6a; + w[12] ^= 0x6a6a6a6a; + w[13] ^= 0x6a6a6a6a; + w[14] ^= 0x6a6a6a6a; + w[15] ^= 0x6a6a6a6a; + + opad[0] = RIPEMD160M_A; + opad[1] = RIPEMD160M_B; + opad[2] = RIPEMD160M_C; + opad[3] = RIPEMD160M_D; + opad[4] = RIPEMD160M_E; + + ripemd160_transform (w, opad); +} + +static u32 u8add (const u32 a, const u32 b) +{ + const u32 a1 = (a >> 0) & 0xff; + const u32 a2 = (a >> 8) & 0xff; + const u32 a3 = (a >> 16) & 0xff; + const u32 a4 = (a >> 24) & 0xff; + + const u32 b1 = (b >> 0) & 0xff; + const u32 b2 = (b >> 8) & 0xff; + const u32 b3 = (b >> 16) & 0xff; + const u32 b4 = (b >> 24) & 0xff; + + const u32 r1 = (a1 + b1) & 0xff; + const u32 r2 = (a2 + b2) & 0xff; + const u32 r3 = (a3 + b3) & 0xff; + const u32 r4 = (a4 + b4) & 0xff; + + const u32 r = r1 << 0 + | r2 << 8 + | r3 << 16 + | r4 << 24; + + return r; +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m06211_init (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global tc_tmp_t *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global tc_t *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = pws[gid].i[ 8]; + w2[1] = pws[gid].i[ 9]; + w2[2] = pws[gid].i[10]; + w2[3] = pws[gid].i[11]; + + u32x w3[4]; + + w3[0] = pws[gid].i[12]; + w3[1] = pws[gid].i[13]; + w3[2] = pws[gid].i[14]; + w3[3] = pws[gid].i[15]; + + /** + * keyfile + */ + + w0[0] = u8add (w0[0], esalt_bufs[salt_pos].keyfile_buf[ 0]); + w0[1] = u8add (w0[1], esalt_bufs[salt_pos].keyfile_buf[ 1]); + w0[2] = u8add (w0[2], esalt_bufs[salt_pos].keyfile_buf[ 2]); + w0[3] = u8add (w0[3], esalt_bufs[salt_pos].keyfile_buf[ 3]); + w1[0] = u8add (w1[0], esalt_bufs[salt_pos].keyfile_buf[ 4]); + w1[1] = u8add (w1[1], esalt_bufs[salt_pos].keyfile_buf[ 5]); + w1[2] = u8add (w1[2], esalt_bufs[salt_pos].keyfile_buf[ 6]); + w1[3] = u8add (w1[3], esalt_bufs[salt_pos].keyfile_buf[ 7]); + w2[0] = u8add (w2[0], esalt_bufs[salt_pos].keyfile_buf[ 8]); + w2[1] = u8add (w2[1], esalt_bufs[salt_pos].keyfile_buf[ 9]); + w2[2] = u8add (w2[2], esalt_bufs[salt_pos].keyfile_buf[10]); + w2[3] = u8add (w2[3], esalt_bufs[salt_pos].keyfile_buf[11]); + w3[0] = u8add (w3[0], esalt_bufs[salt_pos].keyfile_buf[12]); + w3[1] = u8add (w3[1], esalt_bufs[salt_pos].keyfile_buf[13]); + w3[2] = u8add (w3[2], esalt_bufs[salt_pos].keyfile_buf[14]); + w3[3] = u8add (w3[3], esalt_bufs[salt_pos].keyfile_buf[15]); + + /** + * salt + */ + + u32x salt_buf1[16]; + + salt_buf1[ 0] = esalt_bufs[salt_pos].salt_buf[ 0]; + salt_buf1[ 1] = esalt_bufs[salt_pos].salt_buf[ 1]; + salt_buf1[ 2] = esalt_bufs[salt_pos].salt_buf[ 2]; + salt_buf1[ 3] = esalt_bufs[salt_pos].salt_buf[ 3]; + salt_buf1[ 4] = esalt_bufs[salt_pos].salt_buf[ 4]; + salt_buf1[ 5] = esalt_bufs[salt_pos].salt_buf[ 5]; + salt_buf1[ 6] = esalt_bufs[salt_pos].salt_buf[ 6]; + salt_buf1[ 7] = esalt_bufs[salt_pos].salt_buf[ 7]; + salt_buf1[ 8] = esalt_bufs[salt_pos].salt_buf[ 8]; + salt_buf1[ 9] = esalt_bufs[salt_pos].salt_buf[ 9]; + salt_buf1[10] = esalt_bufs[salt_pos].salt_buf[10]; + salt_buf1[11] = esalt_bufs[salt_pos].salt_buf[11]; + salt_buf1[12] = esalt_bufs[salt_pos].salt_buf[12]; + salt_buf1[13] = esalt_bufs[salt_pos].salt_buf[13]; + salt_buf1[14] = esalt_bufs[salt_pos].salt_buf[14]; + salt_buf1[15] = esalt_bufs[salt_pos].salt_buf[15]; + + u32x salt_buf2[16]; + + salt_buf2[ 0] = 0; + salt_buf2[ 1] = 0x80; + salt_buf2[ 2] = 0; + salt_buf2[ 3] = 0; + salt_buf2[ 4] = 0; + salt_buf2[ 5] = 0; + salt_buf2[ 6] = 0; + salt_buf2[ 7] = 0; + salt_buf2[ 8] = 0; + salt_buf2[ 9] = 0; + salt_buf2[10] = 0; + salt_buf2[11] = 0; + salt_buf2[12] = 0; + salt_buf2[13] = 0; + salt_buf2[14] = (64 + 64 + 4) * 8; + salt_buf2[15] = 0; + + const u32 truecrypt_mdlen = salt_bufs[0].truecrypt_mdlen; + + u32x w[16]; + + w[ 0] = w0[0]; + w[ 1] = w0[1]; + w[ 2] = w0[2]; + w[ 3] = w0[3]; + w[ 4] = w1[0]; + w[ 5] = w1[1]; + w[ 6] = w1[2]; + w[ 7] = w1[3]; + w[ 8] = w2[0]; + w[ 9] = w2[1]; + w[10] = w2[2]; + w[11] = w2[3]; + w[12] = w3[0]; + w[13] = w3[1]; + w[14] = w3[2]; + w[15] = w3[3]; + + u32x ipad[5]; + u32x opad[5]; + + hmac_init (w, ipad, opad); + + tmps[gid].ipad[0] = ipad[0]; + tmps[gid].ipad[1] = ipad[1]; + tmps[gid].ipad[2] = ipad[2]; + tmps[gid].ipad[3] = ipad[3]; + tmps[gid].ipad[4] = ipad[4]; + + tmps[gid].opad[0] = opad[0]; + tmps[gid].opad[1] = opad[1]; + tmps[gid].opad[2] = opad[2]; + tmps[gid].opad[3] = opad[3]; + tmps[gid].opad[4] = opad[4]; + + for (u32 i = 0, j = 1; i < (truecrypt_mdlen / 8 / 4); i += 5, j += 1) + { + salt_buf2[0] = swap_workaround (j); + + u32x dgst[5]; + + hmac_run2 (salt_buf1, salt_buf2, ipad, opad, dgst); + + tmps[gid].dgst[i + 0] = dgst[0]; + tmps[gid].dgst[i + 1] = dgst[1]; + tmps[gid].dgst[i + 2] = dgst[2]; + tmps[gid].dgst[i + 3] = dgst[3]; + tmps[gid].dgst[i + 4] = dgst[4]; + + tmps[gid].out[i + 0] = dgst[0]; + tmps[gid].out[i + 1] = dgst[1]; + tmps[gid].out[i + 2] = dgst[2]; + tmps[gid].out[i + 3] = dgst[3]; + tmps[gid].out[i + 4] = dgst[4]; + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m06211_loop (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global tc_tmp_t *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global tc_t *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + const u32 truecrypt_mdlen = salt_bufs[0].truecrypt_mdlen; + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x ipad[5]; + u32x opad[5]; + + ipad[0] = tmps[gid].ipad[0]; + ipad[1] = tmps[gid].ipad[1]; + ipad[2] = tmps[gid].ipad[2]; + ipad[3] = tmps[gid].ipad[3]; + ipad[4] = tmps[gid].ipad[4]; + + opad[0] = tmps[gid].opad[0]; + opad[1] = tmps[gid].opad[1]; + opad[2] = tmps[gid].opad[2]; + opad[3] = tmps[gid].opad[3]; + opad[4] = tmps[gid].opad[4]; + + for (u32 i = 0; i < (truecrypt_mdlen / 8 / 4); i += 5) + { + u32x dgst[5]; + u32x out[5]; + + dgst[0] = tmps[gid].dgst[i + 0]; + dgst[1] = tmps[gid].dgst[i + 1]; + dgst[2] = tmps[gid].dgst[i + 2]; + dgst[3] = tmps[gid].dgst[i + 3]; + dgst[4] = tmps[gid].dgst[i + 4]; + + out[0] = tmps[gid].out[i + 0]; + out[1] = tmps[gid].out[i + 1]; + out[2] = tmps[gid].out[i + 2]; + out[3] = tmps[gid].out[i + 3]; + out[4] = tmps[gid].out[i + 4]; + + for (u32 j = 0; j < loop_cnt; j++) + { + u32x w[16]; + + w[ 0] = dgst[0]; + w[ 1] = dgst[1]; + w[ 2] = dgst[2]; + w[ 3] = dgst[3]; + w[ 4] = dgst[4]; + w[ 5] = 0x80; + w[ 6] = 0; + w[ 7] = 0; + w[ 8] = 0; + w[ 9] = 0; + w[10] = 0; + w[11] = 0; + w[12] = 0; + w[13] = 0; + w[14] = (64 + 20) * 8; + w[15] = 0; + + hmac_run (w, ipad, opad, dgst); + + out[0] ^= dgst[0]; + out[1] ^= dgst[1]; + out[2] ^= dgst[2]; + out[3] ^= dgst[3]; + out[4] ^= dgst[4]; + } + + tmps[gid].dgst[i + 0] = dgst[0]; + tmps[gid].dgst[i + 1] = dgst[1]; + tmps[gid].dgst[i + 2] = dgst[2]; + tmps[gid].dgst[i + 3] = dgst[3]; + tmps[gid].dgst[i + 4] = dgst[4]; + + tmps[gid].out[i + 0] = out[0]; + tmps[gid].out[i + 1] = out[1]; + tmps[gid].out[i + 2] = out[2]; + tmps[gid].out[i + 3] = out[3]; + tmps[gid].out[i + 4] = out[4]; + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m06211_comp (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global tc_tmp_t *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global tc_t *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + const u32 lid = get_local_id (0); + + if (gid >= gid_max) return; + + u32 ukey1[8]; + + ukey1[0] = tmps[gid].out[ 0]; + ukey1[1] = tmps[gid].out[ 1]; + ukey1[2] = tmps[gid].out[ 2]; + ukey1[3] = tmps[gid].out[ 3]; + ukey1[4] = tmps[gid].out[ 4]; + ukey1[5] = tmps[gid].out[ 5]; + ukey1[6] = tmps[gid].out[ 6]; + ukey1[7] = tmps[gid].out[ 7]; + + u32 ukey2[8]; + + ukey2[0] = tmps[gid].out[ 8]; + ukey2[1] = tmps[gid].out[ 9]; + ukey2[2] = tmps[gid].out[10]; + ukey2[3] = tmps[gid].out[11]; + ukey2[4] = tmps[gid].out[12]; + ukey2[5] = tmps[gid].out[13]; + ukey2[6] = tmps[gid].out[14]; + ukey2[7] = tmps[gid].out[15]; + + u32 data[4]; + + data[0] = esalt_bufs[0].data_buf[0]; + data[1] = esalt_bufs[0].data_buf[1]; + data[2] = esalt_bufs[0].data_buf[2]; + data[3] = esalt_bufs[0].data_buf[3]; + + u32 tmp[4]; + + { + tmp[0] = data[0]; + tmp[1] = data[1]; + tmp[2] = data[2]; + tmp[3] = data[3]; + + aes256_decrypt_xts (ukey1, ukey2, tmp, tmp); + + if (((tmp[0] == 0x45555254) && (tmp[3] == 0)) || ((tmp[0] == 0x45555254) && ((tmp[1] >> 16) <= 5))) + { + mark_hash_s0 (plains_buf, hashes_shown, 0, gid, 0); + + d_return_buf[lid] = 1; + } + } + + { + tmp[0] = data[0]; + tmp[1] = data[1]; + tmp[2] = data[2]; + tmp[3] = data[3]; + + serpent256_decrypt_xts (ukey1, ukey2, tmp, tmp); + + if (((tmp[0] == 0x45555254) && (tmp[3] == 0)) || ((tmp[0] == 0x45555254) && ((tmp[1] >> 16) <= 5))) + { + mark_hash_s0 (plains_buf, hashes_shown, 0, gid, 0); + + d_return_buf[lid] = 1; + } + } + + { + tmp[0] = data[0]; + tmp[1] = data[1]; + tmp[2] = data[2]; + tmp[3] = data[3]; + + twofish256_decrypt_xts (ukey1, ukey2, tmp, tmp); + + if (((tmp[0] == 0x45555254) && (tmp[3] == 0)) || ((tmp[0] == 0x45555254) && ((tmp[1] >> 16) <= 5))) + { + mark_hash_s0 (plains_buf, hashes_shown, 0, gid, 0); + + d_return_buf[lid] = 1; + } + } +} diff --git a/amd/m06212.cl b/amd/m06212.cl new file mode 100644 index 0000000000..8d02bedab8 --- /dev/null +++ b/amd/m06212.cl @@ -0,0 +1,793 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _RIPEMD160_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW4 +#define VECT_SIZE1 +#endif + +#ifdef VLIW5 +#define VECT_SIZE1 +#endif + +#define DGST_R0 0 +#define DGST_R1 1 +#define DGST_R2 2 +#define DGST_R3 3 + +#include "include/kernel_functions.c" +#include "types_amd.c" +#include "common_amd.c" + +#include "gpu_aes256_amd.c" +#include "gpu_twofish256_amd.c" +#include "gpu_serpent256_amd.c" + +static void ripemd160_transform (const u32x w[16], u32x dgst[5]) +{ + u32x a1 = dgst[0]; + u32x b1 = dgst[1]; + u32x c1 = dgst[2]; + u32x d1 = dgst[3]; + u32x e1 = dgst[4]; + + RIPEMD160_STEP (RIPEMD160_F , a1, b1, c1, d1, e1, w[ 0], RIPEMD160C00, RIPEMD160S00); + RIPEMD160_STEP (RIPEMD160_F , e1, a1, b1, c1, d1, w[ 1], RIPEMD160C00, RIPEMD160S01); + RIPEMD160_STEP (RIPEMD160_F , d1, e1, a1, b1, c1, w[ 2], RIPEMD160C00, RIPEMD160S02); + RIPEMD160_STEP (RIPEMD160_F , c1, d1, e1, a1, b1, w[ 3], RIPEMD160C00, RIPEMD160S03); + RIPEMD160_STEP (RIPEMD160_F , b1, c1, d1, e1, a1, w[ 4], RIPEMD160C00, RIPEMD160S04); + RIPEMD160_STEP (RIPEMD160_F , a1, b1, c1, d1, e1, w[ 5], RIPEMD160C00, RIPEMD160S05); + RIPEMD160_STEP (RIPEMD160_F , e1, a1, b1, c1, d1, w[ 6], RIPEMD160C00, RIPEMD160S06); + RIPEMD160_STEP (RIPEMD160_F , d1, e1, a1, b1, c1, w[ 7], RIPEMD160C00, RIPEMD160S07); + RIPEMD160_STEP (RIPEMD160_F , c1, d1, e1, a1, b1, w[ 8], RIPEMD160C00, RIPEMD160S08); + RIPEMD160_STEP (RIPEMD160_F , b1, c1, d1, e1, a1, w[ 9], RIPEMD160C00, RIPEMD160S09); + RIPEMD160_STEP (RIPEMD160_F , a1, b1, c1, d1, e1, w[10], RIPEMD160C00, RIPEMD160S0A); + RIPEMD160_STEP (RIPEMD160_F , e1, a1, b1, c1, d1, w[11], RIPEMD160C00, RIPEMD160S0B); + RIPEMD160_STEP (RIPEMD160_F , d1, e1, a1, b1, c1, w[12], RIPEMD160C00, RIPEMD160S0C); + RIPEMD160_STEP (RIPEMD160_F , c1, d1, e1, a1, b1, w[13], RIPEMD160C00, RIPEMD160S0D); + RIPEMD160_STEP (RIPEMD160_F , b1, c1, d1, e1, a1, w[14], RIPEMD160C00, RIPEMD160S0E); + RIPEMD160_STEP (RIPEMD160_F , a1, b1, c1, d1, e1, w[15], RIPEMD160C00, RIPEMD160S0F); + + RIPEMD160_STEP (RIPEMD160_Go, e1, a1, b1, c1, d1, w[ 7], RIPEMD160C10, RIPEMD160S10); + RIPEMD160_STEP (RIPEMD160_Go, d1, e1, a1, b1, c1, w[ 4], RIPEMD160C10, RIPEMD160S11); + RIPEMD160_STEP (RIPEMD160_Go, c1, d1, e1, a1, b1, w[13], RIPEMD160C10, RIPEMD160S12); + RIPEMD160_STEP (RIPEMD160_Go, b1, c1, d1, e1, a1, w[ 1], RIPEMD160C10, RIPEMD160S13); + RIPEMD160_STEP (RIPEMD160_Go, a1, b1, c1, d1, e1, w[10], RIPEMD160C10, RIPEMD160S14); + RIPEMD160_STEP (RIPEMD160_Go, e1, a1, b1, c1, d1, w[ 6], RIPEMD160C10, RIPEMD160S15); + RIPEMD160_STEP (RIPEMD160_Go, d1, e1, a1, b1, c1, w[15], RIPEMD160C10, RIPEMD160S16); + RIPEMD160_STEP (RIPEMD160_Go, c1, d1, e1, a1, b1, w[ 3], RIPEMD160C10, RIPEMD160S17); + RIPEMD160_STEP (RIPEMD160_Go, b1, c1, d1, e1, a1, w[12], RIPEMD160C10, RIPEMD160S18); + RIPEMD160_STEP (RIPEMD160_Go, a1, b1, c1, d1, e1, w[ 0], RIPEMD160C10, RIPEMD160S19); + RIPEMD160_STEP (RIPEMD160_Go, e1, a1, b1, c1, d1, w[ 9], RIPEMD160C10, RIPEMD160S1A); + RIPEMD160_STEP (RIPEMD160_Go, d1, e1, a1, b1, c1, w[ 5], RIPEMD160C10, RIPEMD160S1B); + RIPEMD160_STEP (RIPEMD160_Go, c1, d1, e1, a1, b1, w[ 2], RIPEMD160C10, RIPEMD160S1C); + RIPEMD160_STEP (RIPEMD160_Go, b1, c1, d1, e1, a1, w[14], RIPEMD160C10, RIPEMD160S1D); + RIPEMD160_STEP (RIPEMD160_Go, a1, b1, c1, d1, e1, w[11], RIPEMD160C10, RIPEMD160S1E); + RIPEMD160_STEP (RIPEMD160_Go, e1, a1, b1, c1, d1, w[ 8], RIPEMD160C10, RIPEMD160S1F); + + RIPEMD160_STEP (RIPEMD160_H , d1, e1, a1, b1, c1, w[ 3], RIPEMD160C20, RIPEMD160S20); + RIPEMD160_STEP (RIPEMD160_H , c1, d1, e1, a1, b1, w[10], RIPEMD160C20, RIPEMD160S21); + RIPEMD160_STEP (RIPEMD160_H , b1, c1, d1, e1, a1, w[14], RIPEMD160C20, RIPEMD160S22); + RIPEMD160_STEP (RIPEMD160_H , a1, b1, c1, d1, e1, w[ 4], RIPEMD160C20, RIPEMD160S23); + RIPEMD160_STEP (RIPEMD160_H , e1, a1, b1, c1, d1, w[ 9], RIPEMD160C20, RIPEMD160S24); + RIPEMD160_STEP (RIPEMD160_H , d1, e1, a1, b1, c1, w[15], RIPEMD160C20, RIPEMD160S25); + RIPEMD160_STEP (RIPEMD160_H , c1, d1, e1, a1, b1, w[ 8], RIPEMD160C20, RIPEMD160S26); + RIPEMD160_STEP (RIPEMD160_H , b1, c1, d1, e1, a1, w[ 1], RIPEMD160C20, RIPEMD160S27); + RIPEMD160_STEP (RIPEMD160_H , a1, b1, c1, d1, e1, w[ 2], RIPEMD160C20, RIPEMD160S28); + RIPEMD160_STEP (RIPEMD160_H , e1, a1, b1, c1, d1, w[ 7], RIPEMD160C20, RIPEMD160S29); + RIPEMD160_STEP (RIPEMD160_H , d1, e1, a1, b1, c1, w[ 0], RIPEMD160C20, RIPEMD160S2A); + RIPEMD160_STEP (RIPEMD160_H , c1, d1, e1, a1, b1, w[ 6], RIPEMD160C20, RIPEMD160S2B); + RIPEMD160_STEP (RIPEMD160_H , b1, c1, d1, e1, a1, w[13], RIPEMD160C20, RIPEMD160S2C); + RIPEMD160_STEP (RIPEMD160_H , a1, b1, c1, d1, e1, w[11], RIPEMD160C20, RIPEMD160S2D); + RIPEMD160_STEP (RIPEMD160_H , e1, a1, b1, c1, d1, w[ 5], RIPEMD160C20, RIPEMD160S2E); + RIPEMD160_STEP (RIPEMD160_H , d1, e1, a1, b1, c1, w[12], RIPEMD160C20, RIPEMD160S2F); + + RIPEMD160_STEP (RIPEMD160_Io, c1, d1, e1, a1, b1, w[ 1], RIPEMD160C30, RIPEMD160S30); + RIPEMD160_STEP (RIPEMD160_Io, b1, c1, d1, e1, a1, w[ 9], RIPEMD160C30, RIPEMD160S31); + RIPEMD160_STEP (RIPEMD160_Io, a1, b1, c1, d1, e1, w[11], RIPEMD160C30, RIPEMD160S32); + RIPEMD160_STEP (RIPEMD160_Io, e1, a1, b1, c1, d1, w[10], RIPEMD160C30, RIPEMD160S33); + RIPEMD160_STEP (RIPEMD160_Io, d1, e1, a1, b1, c1, w[ 0], RIPEMD160C30, RIPEMD160S34); + RIPEMD160_STEP (RIPEMD160_Io, c1, d1, e1, a1, b1, w[ 8], RIPEMD160C30, RIPEMD160S35); + RIPEMD160_STEP (RIPEMD160_Io, b1, c1, d1, e1, a1, w[12], RIPEMD160C30, RIPEMD160S36); + RIPEMD160_STEP (RIPEMD160_Io, a1, b1, c1, d1, e1, w[ 4], RIPEMD160C30, RIPEMD160S37); + RIPEMD160_STEP (RIPEMD160_Io, e1, a1, b1, c1, d1, w[13], RIPEMD160C30, RIPEMD160S38); + RIPEMD160_STEP (RIPEMD160_Io, d1, e1, a1, b1, c1, w[ 3], RIPEMD160C30, RIPEMD160S39); + RIPEMD160_STEP (RIPEMD160_Io, c1, d1, e1, a1, b1, w[ 7], RIPEMD160C30, RIPEMD160S3A); + RIPEMD160_STEP (RIPEMD160_Io, b1, c1, d1, e1, a1, w[15], RIPEMD160C30, RIPEMD160S3B); + RIPEMD160_STEP (RIPEMD160_Io, a1, b1, c1, d1, e1, w[14], RIPEMD160C30, RIPEMD160S3C); + RIPEMD160_STEP (RIPEMD160_Io, e1, a1, b1, c1, d1, w[ 5], RIPEMD160C30, RIPEMD160S3D); + RIPEMD160_STEP (RIPEMD160_Io, d1, e1, a1, b1, c1, w[ 6], RIPEMD160C30, RIPEMD160S3E); + RIPEMD160_STEP (RIPEMD160_Io, c1, d1, e1, a1, b1, w[ 2], RIPEMD160C30, RIPEMD160S3F); + + RIPEMD160_STEP (RIPEMD160_J , b1, c1, d1, e1, a1, w[ 4], RIPEMD160C40, RIPEMD160S40); + RIPEMD160_STEP (RIPEMD160_J , a1, b1, c1, d1, e1, w[ 0], RIPEMD160C40, RIPEMD160S41); + RIPEMD160_STEP (RIPEMD160_J , e1, a1, b1, c1, d1, w[ 5], RIPEMD160C40, RIPEMD160S42); + RIPEMD160_STEP (RIPEMD160_J , d1, e1, a1, b1, c1, w[ 9], RIPEMD160C40, RIPEMD160S43); + RIPEMD160_STEP (RIPEMD160_J , c1, d1, e1, a1, b1, w[ 7], RIPEMD160C40, RIPEMD160S44); + RIPEMD160_STEP (RIPEMD160_J , b1, c1, d1, e1, a1, w[12], RIPEMD160C40, RIPEMD160S45); + RIPEMD160_STEP (RIPEMD160_J , a1, b1, c1, d1, e1, w[ 2], RIPEMD160C40, RIPEMD160S46); + RIPEMD160_STEP (RIPEMD160_J , e1, a1, b1, c1, d1, w[10], RIPEMD160C40, RIPEMD160S47); + RIPEMD160_STEP (RIPEMD160_J , d1, e1, a1, b1, c1, w[14], RIPEMD160C40, RIPEMD160S48); + RIPEMD160_STEP (RIPEMD160_J , c1, d1, e1, a1, b1, w[ 1], RIPEMD160C40, RIPEMD160S49); + RIPEMD160_STEP (RIPEMD160_J , b1, c1, d1, e1, a1, w[ 3], RIPEMD160C40, RIPEMD160S4A); + RIPEMD160_STEP (RIPEMD160_J , a1, b1, c1, d1, e1, w[ 8], RIPEMD160C40, RIPEMD160S4B); + RIPEMD160_STEP (RIPEMD160_J , e1, a1, b1, c1, d1, w[11], RIPEMD160C40, RIPEMD160S4C); + RIPEMD160_STEP (RIPEMD160_J , d1, e1, a1, b1, c1, w[ 6], RIPEMD160C40, RIPEMD160S4D); + RIPEMD160_STEP (RIPEMD160_J , c1, d1, e1, a1, b1, w[15], RIPEMD160C40, RIPEMD160S4E); + RIPEMD160_STEP (RIPEMD160_J , b1, c1, d1, e1, a1, w[13], RIPEMD160C40, RIPEMD160S4F); + + u32x a2 = dgst[0]; + u32x b2 = dgst[1]; + u32x c2 = dgst[2]; + u32x d2 = dgst[3]; + u32x e2 = dgst[4]; + + RIPEMD160_STEP_WORKAROUND_BUG (RIPEMD160_J , a2, b2, c2, d2, e2, w[ 5], RIPEMD160C50, RIPEMD160S50); + RIPEMD160_STEP (RIPEMD160_J , e2, a2, b2, c2, d2, w[14], RIPEMD160C50, RIPEMD160S51); + RIPEMD160_STEP (RIPEMD160_J , d2, e2, a2, b2, c2, w[ 7], RIPEMD160C50, RIPEMD160S52); + RIPEMD160_STEP (RIPEMD160_J , c2, d2, e2, a2, b2, w[ 0], RIPEMD160C50, RIPEMD160S53); + RIPEMD160_STEP (RIPEMD160_J , b2, c2, d2, e2, a2, w[ 9], RIPEMD160C50, RIPEMD160S54); + RIPEMD160_STEP (RIPEMD160_J , a2, b2, c2, d2, e2, w[ 2], RIPEMD160C50, RIPEMD160S55); + RIPEMD160_STEP (RIPEMD160_J , e2, a2, b2, c2, d2, w[11], RIPEMD160C50, RIPEMD160S56); + RIPEMD160_STEP (RIPEMD160_J , d2, e2, a2, b2, c2, w[ 4], RIPEMD160C50, RIPEMD160S57); + RIPEMD160_STEP (RIPEMD160_J , c2, d2, e2, a2, b2, w[13], RIPEMD160C50, RIPEMD160S58); + RIPEMD160_STEP (RIPEMD160_J , b2, c2, d2, e2, a2, w[ 6], RIPEMD160C50, RIPEMD160S59); + RIPEMD160_STEP (RIPEMD160_J , a2, b2, c2, d2, e2, w[15], RIPEMD160C50, RIPEMD160S5A); + RIPEMD160_STEP (RIPEMD160_J , e2, a2, b2, c2, d2, w[ 8], RIPEMD160C50, RIPEMD160S5B); + RIPEMD160_STEP (RIPEMD160_J , d2, e2, a2, b2, c2, w[ 1], RIPEMD160C50, RIPEMD160S5C); + RIPEMD160_STEP (RIPEMD160_J , c2, d2, e2, a2, b2, w[10], RIPEMD160C50, RIPEMD160S5D); + RIPEMD160_STEP (RIPEMD160_J , b2, c2, d2, e2, a2, w[ 3], RIPEMD160C50, RIPEMD160S5E); + RIPEMD160_STEP (RIPEMD160_J , a2, b2, c2, d2, e2, w[12], RIPEMD160C50, RIPEMD160S5F); + + RIPEMD160_STEP (RIPEMD160_Io, e2, a2, b2, c2, d2, w[ 6], RIPEMD160C60, RIPEMD160S60); + RIPEMD160_STEP (RIPEMD160_Io, d2, e2, a2, b2, c2, w[11], RIPEMD160C60, RIPEMD160S61); + RIPEMD160_STEP (RIPEMD160_Io, c2, d2, e2, a2, b2, w[ 3], RIPEMD160C60, RIPEMD160S62); + RIPEMD160_STEP (RIPEMD160_Io, b2, c2, d2, e2, a2, w[ 7], RIPEMD160C60, RIPEMD160S63); + RIPEMD160_STEP (RIPEMD160_Io, a2, b2, c2, d2, e2, w[ 0], RIPEMD160C60, RIPEMD160S64); + RIPEMD160_STEP (RIPEMD160_Io, e2, a2, b2, c2, d2, w[13], RIPEMD160C60, RIPEMD160S65); + RIPEMD160_STEP (RIPEMD160_Io, d2, e2, a2, b2, c2, w[ 5], RIPEMD160C60, RIPEMD160S66); + RIPEMD160_STEP (RIPEMD160_Io, c2, d2, e2, a2, b2, w[10], RIPEMD160C60, RIPEMD160S67); + RIPEMD160_STEP (RIPEMD160_Io, b2, c2, d2, e2, a2, w[14], RIPEMD160C60, RIPEMD160S68); + RIPEMD160_STEP (RIPEMD160_Io, a2, b2, c2, d2, e2, w[15], RIPEMD160C60, RIPEMD160S69); + RIPEMD160_STEP (RIPEMD160_Io, e2, a2, b2, c2, d2, w[ 8], RIPEMD160C60, RIPEMD160S6A); + RIPEMD160_STEP (RIPEMD160_Io, d2, e2, a2, b2, c2, w[12], RIPEMD160C60, RIPEMD160S6B); + RIPEMD160_STEP (RIPEMD160_Io, c2, d2, e2, a2, b2, w[ 4], RIPEMD160C60, RIPEMD160S6C); + RIPEMD160_STEP (RIPEMD160_Io, b2, c2, d2, e2, a2, w[ 9], RIPEMD160C60, RIPEMD160S6D); + RIPEMD160_STEP (RIPEMD160_Io, a2, b2, c2, d2, e2, w[ 1], RIPEMD160C60, RIPEMD160S6E); + RIPEMD160_STEP (RIPEMD160_Io, e2, a2, b2, c2, d2, w[ 2], RIPEMD160C60, RIPEMD160S6F); + + RIPEMD160_STEP (RIPEMD160_H , d2, e2, a2, b2, c2, w[15], RIPEMD160C70, RIPEMD160S70); + RIPEMD160_STEP (RIPEMD160_H , c2, d2, e2, a2, b2, w[ 5], RIPEMD160C70, RIPEMD160S71); + RIPEMD160_STEP (RIPEMD160_H , b2, c2, d2, e2, a2, w[ 1], RIPEMD160C70, RIPEMD160S72); + RIPEMD160_STEP (RIPEMD160_H , a2, b2, c2, d2, e2, w[ 3], RIPEMD160C70, RIPEMD160S73); + RIPEMD160_STEP (RIPEMD160_H , e2, a2, b2, c2, d2, w[ 7], RIPEMD160C70, RIPEMD160S74); + RIPEMD160_STEP (RIPEMD160_H , d2, e2, a2, b2, c2, w[14], RIPEMD160C70, RIPEMD160S75); + RIPEMD160_STEP (RIPEMD160_H , c2, d2, e2, a2, b2, w[ 6], RIPEMD160C70, RIPEMD160S76); + RIPEMD160_STEP (RIPEMD160_H , b2, c2, d2, e2, a2, w[ 9], RIPEMD160C70, RIPEMD160S77); + RIPEMD160_STEP (RIPEMD160_H , a2, b2, c2, d2, e2, w[11], RIPEMD160C70, RIPEMD160S78); + RIPEMD160_STEP (RIPEMD160_H , e2, a2, b2, c2, d2, w[ 8], RIPEMD160C70, RIPEMD160S79); + RIPEMD160_STEP (RIPEMD160_H , d2, e2, a2, b2, c2, w[12], RIPEMD160C70, RIPEMD160S7A); + RIPEMD160_STEP (RIPEMD160_H , c2, d2, e2, a2, b2, w[ 2], RIPEMD160C70, RIPEMD160S7B); + RIPEMD160_STEP (RIPEMD160_H , b2, c2, d2, e2, a2, w[10], RIPEMD160C70, RIPEMD160S7C); + RIPEMD160_STEP (RIPEMD160_H , a2, b2, c2, d2, e2, w[ 0], RIPEMD160C70, RIPEMD160S7D); + RIPEMD160_STEP (RIPEMD160_H , e2, a2, b2, c2, d2, w[ 4], RIPEMD160C70, RIPEMD160S7E); + RIPEMD160_STEP (RIPEMD160_H , d2, e2, a2, b2, c2, w[13], RIPEMD160C70, RIPEMD160S7F); + + RIPEMD160_STEP (RIPEMD160_Go, c2, d2, e2, a2, b2, w[ 8], RIPEMD160C80, RIPEMD160S80); + RIPEMD160_STEP (RIPEMD160_Go, b2, c2, d2, e2, a2, w[ 6], RIPEMD160C80, RIPEMD160S81); + RIPEMD160_STEP (RIPEMD160_Go, a2, b2, c2, d2, e2, w[ 4], RIPEMD160C80, RIPEMD160S82); + RIPEMD160_STEP (RIPEMD160_Go, e2, a2, b2, c2, d2, w[ 1], RIPEMD160C80, RIPEMD160S83); + RIPEMD160_STEP (RIPEMD160_Go, d2, e2, a2, b2, c2, w[ 3], RIPEMD160C80, RIPEMD160S84); + RIPEMD160_STEP (RIPEMD160_Go, c2, d2, e2, a2, b2, w[11], RIPEMD160C80, RIPEMD160S85); + RIPEMD160_STEP (RIPEMD160_Go, b2, c2, d2, e2, a2, w[15], RIPEMD160C80, RIPEMD160S86); + RIPEMD160_STEP (RIPEMD160_Go, a2, b2, c2, d2, e2, w[ 0], RIPEMD160C80, RIPEMD160S87); + RIPEMD160_STEP (RIPEMD160_Go, e2, a2, b2, c2, d2, w[ 5], RIPEMD160C80, RIPEMD160S88); + RIPEMD160_STEP (RIPEMD160_Go, d2, e2, a2, b2, c2, w[12], RIPEMD160C80, RIPEMD160S89); + RIPEMD160_STEP (RIPEMD160_Go, c2, d2, e2, a2, b2, w[ 2], RIPEMD160C80, RIPEMD160S8A); + RIPEMD160_STEP (RIPEMD160_Go, b2, c2, d2, e2, a2, w[13], RIPEMD160C80, RIPEMD160S8B); + RIPEMD160_STEP (RIPEMD160_Go, a2, b2, c2, d2, e2, w[ 9], RIPEMD160C80, RIPEMD160S8C); + RIPEMD160_STEP (RIPEMD160_Go, e2, a2, b2, c2, d2, w[ 7], RIPEMD160C80, RIPEMD160S8D); + RIPEMD160_STEP (RIPEMD160_Go, d2, e2, a2, b2, c2, w[10], RIPEMD160C80, RIPEMD160S8E); + RIPEMD160_STEP (RIPEMD160_Go, c2, d2, e2, a2, b2, w[14], RIPEMD160C80, RIPEMD160S8F); + + RIPEMD160_STEP (RIPEMD160_F , b2, c2, d2, e2, a2, w[12], RIPEMD160C90, RIPEMD160S90); + RIPEMD160_STEP (RIPEMD160_F , a2, b2, c2, d2, e2, w[15], RIPEMD160C90, RIPEMD160S91); + RIPEMD160_STEP (RIPEMD160_F , e2, a2, b2, c2, d2, w[10], RIPEMD160C90, RIPEMD160S92); + RIPEMD160_STEP (RIPEMD160_F , d2, e2, a2, b2, c2, w[ 4], RIPEMD160C90, RIPEMD160S93); + RIPEMD160_STEP (RIPEMD160_F , c2, d2, e2, a2, b2, w[ 1], RIPEMD160C90, RIPEMD160S94); + RIPEMD160_STEP (RIPEMD160_F , b2, c2, d2, e2, a2, w[ 5], RIPEMD160C90, RIPEMD160S95); + RIPEMD160_STEP (RIPEMD160_F , a2, b2, c2, d2, e2, w[ 8], RIPEMD160C90, RIPEMD160S96); + RIPEMD160_STEP (RIPEMD160_F , e2, a2, b2, c2, d2, w[ 7], RIPEMD160C90, RIPEMD160S97); + RIPEMD160_STEP (RIPEMD160_F , d2, e2, a2, b2, c2, w[ 6], RIPEMD160C90, RIPEMD160S98); + RIPEMD160_STEP (RIPEMD160_F , c2, d2, e2, a2, b2, w[ 2], RIPEMD160C90, RIPEMD160S99); + RIPEMD160_STEP (RIPEMD160_F , b2, c2, d2, e2, a2, w[13], RIPEMD160C90, RIPEMD160S9A); + RIPEMD160_STEP (RIPEMD160_F , a2, b2, c2, d2, e2, w[14], RIPEMD160C90, RIPEMD160S9B); + RIPEMD160_STEP (RIPEMD160_F , e2, a2, b2, c2, d2, w[ 0], RIPEMD160C90, RIPEMD160S9C); + RIPEMD160_STEP (RIPEMD160_F , d2, e2, a2, b2, c2, w[ 3], RIPEMD160C90, RIPEMD160S9D); + RIPEMD160_STEP (RIPEMD160_F , c2, d2, e2, a2, b2, w[ 9], RIPEMD160C90, RIPEMD160S9E); + RIPEMD160_STEP (RIPEMD160_F , b2, c2, d2, e2, a2, w[11], RIPEMD160C90, RIPEMD160S9F); + + const u32x a = dgst[1] + c1 + d2; + const u32x b = dgst[2] + d1 + e2; + const u32x c = dgst[3] + e1 + a2; + const u32x d = dgst[4] + a1 + b2; + const u32x e = dgst[0] + b1 + c2; + + dgst[0] = a; + dgst[1] = b; + dgst[2] = c; + dgst[3] = d; + dgst[4] = e; +} + +static void hmac_run2 (const u32x w1[16], const u32x w2[16], const u32x ipad[5], const u32x opad[5], u32x dgst[5]) +{ + dgst[0] = ipad[0]; + dgst[1] = ipad[1]; + dgst[2] = ipad[2]; + dgst[3] = ipad[3]; + dgst[4] = ipad[4]; + + ripemd160_transform (w1, dgst); + ripemd160_transform (w2, dgst); + + u32x w[16]; + + w[ 0] = dgst[0]; + w[ 1] = dgst[1]; + w[ 2] = dgst[2]; + w[ 3] = dgst[3]; + w[ 4] = dgst[4]; + w[ 5] = 0x80; + w[ 6] = 0; + w[ 7] = 0; + w[ 8] = 0; + w[ 9] = 0; + w[10] = 0; + w[11] = 0; + w[12] = 0; + w[13] = 0; + w[14] = (64 + 20) * 8; + w[15] = 0; + + dgst[0] = opad[0]; + dgst[1] = opad[1]; + dgst[2] = opad[2]; + dgst[3] = opad[3]; + dgst[4] = opad[4]; + + ripemd160_transform (w, dgst); +} + +static void hmac_run (u32x w[16], const u32x ipad[5], const u32x opad[5], u32x dgst[5]) +{ + dgst[0] = ipad[0]; + dgst[1] = ipad[1]; + dgst[2] = ipad[2]; + dgst[3] = ipad[3]; + dgst[4] = ipad[4]; + + ripemd160_transform (w, dgst); + + w[ 0] = dgst[0]; + w[ 1] = dgst[1]; + w[ 2] = dgst[2]; + w[ 3] = dgst[3]; + w[ 4] = dgst[4]; + w[ 5] = 0x80; + w[ 6] = 0; + w[ 7] = 0; + w[ 8] = 0; + w[ 9] = 0; + w[10] = 0; + w[11] = 0; + w[12] = 0; + w[13] = 0; + w[14] = (64 + 20) * 8; + w[15] = 0; + + dgst[0] = opad[0]; + dgst[1] = opad[1]; + dgst[2] = opad[2]; + dgst[3] = opad[3]; + dgst[4] = opad[4]; + + ripemd160_transform (w, dgst); +} + +static void hmac_init (u32x w[16], u32x ipad[5], u32x opad[5]) +{ + w[ 0] ^= 0x36363636; + w[ 1] ^= 0x36363636; + w[ 2] ^= 0x36363636; + w[ 3] ^= 0x36363636; + w[ 4] ^= 0x36363636; + w[ 5] ^= 0x36363636; + w[ 6] ^= 0x36363636; + w[ 7] ^= 0x36363636; + w[ 8] ^= 0x36363636; + w[ 9] ^= 0x36363636; + w[10] ^= 0x36363636; + w[11] ^= 0x36363636; + w[12] ^= 0x36363636; + w[13] ^= 0x36363636; + w[14] ^= 0x36363636; + w[15] ^= 0x36363636; + + ipad[0] = RIPEMD160M_A; + ipad[1] = RIPEMD160M_B; + ipad[2] = RIPEMD160M_C; + ipad[3] = RIPEMD160M_D; + ipad[4] = RIPEMD160M_E; + + ripemd160_transform (w, ipad); + + w[ 0] ^= 0x6a6a6a6a; + w[ 1] ^= 0x6a6a6a6a; + w[ 2] ^= 0x6a6a6a6a; + w[ 3] ^= 0x6a6a6a6a; + w[ 4] ^= 0x6a6a6a6a; + w[ 5] ^= 0x6a6a6a6a; + w[ 6] ^= 0x6a6a6a6a; + w[ 7] ^= 0x6a6a6a6a; + w[ 8] ^= 0x6a6a6a6a; + w[ 9] ^= 0x6a6a6a6a; + w[10] ^= 0x6a6a6a6a; + w[11] ^= 0x6a6a6a6a; + w[12] ^= 0x6a6a6a6a; + w[13] ^= 0x6a6a6a6a; + w[14] ^= 0x6a6a6a6a; + w[15] ^= 0x6a6a6a6a; + + opad[0] = RIPEMD160M_A; + opad[1] = RIPEMD160M_B; + opad[2] = RIPEMD160M_C; + opad[3] = RIPEMD160M_D; + opad[4] = RIPEMD160M_E; + + ripemd160_transform (w, opad); +} + +static u32 u8add (const u32 a, const u32 b) +{ + const u32 a1 = (a >> 0) & 0xff; + const u32 a2 = (a >> 8) & 0xff; + const u32 a3 = (a >> 16) & 0xff; + const u32 a4 = (a >> 24) & 0xff; + + const u32 b1 = (b >> 0) & 0xff; + const u32 b2 = (b >> 8) & 0xff; + const u32 b3 = (b >> 16) & 0xff; + const u32 b4 = (b >> 24) & 0xff; + + const u32 r1 = (a1 + b1) & 0xff; + const u32 r2 = (a2 + b2) & 0xff; + const u32 r3 = (a3 + b3) & 0xff; + const u32 r4 = (a4 + b4) & 0xff; + + const u32 r = r1 << 0 + | r2 << 8 + | r3 << 16 + | r4 << 24; + + return r; +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m06212_init (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global tc_tmp_t *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global tc_t *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = pws[gid].i[ 8]; + w2[1] = pws[gid].i[ 9]; + w2[2] = pws[gid].i[10]; + w2[3] = pws[gid].i[11]; + + u32x w3[4]; + + w3[0] = pws[gid].i[12]; + w3[1] = pws[gid].i[13]; + w3[2] = pws[gid].i[14]; + w3[3] = pws[gid].i[15]; + + /** + * keyfile + */ + + w0[0] = u8add (w0[0], esalt_bufs[salt_pos].keyfile_buf[ 0]); + w0[1] = u8add (w0[1], esalt_bufs[salt_pos].keyfile_buf[ 1]); + w0[2] = u8add (w0[2], esalt_bufs[salt_pos].keyfile_buf[ 2]); + w0[3] = u8add (w0[3], esalt_bufs[salt_pos].keyfile_buf[ 3]); + w1[0] = u8add (w1[0], esalt_bufs[salt_pos].keyfile_buf[ 4]); + w1[1] = u8add (w1[1], esalt_bufs[salt_pos].keyfile_buf[ 5]); + w1[2] = u8add (w1[2], esalt_bufs[salt_pos].keyfile_buf[ 6]); + w1[3] = u8add (w1[3], esalt_bufs[salt_pos].keyfile_buf[ 7]); + w2[0] = u8add (w2[0], esalt_bufs[salt_pos].keyfile_buf[ 8]); + w2[1] = u8add (w2[1], esalt_bufs[salt_pos].keyfile_buf[ 9]); + w2[2] = u8add (w2[2], esalt_bufs[salt_pos].keyfile_buf[10]); + w2[3] = u8add (w2[3], esalt_bufs[salt_pos].keyfile_buf[11]); + w3[0] = u8add (w3[0], esalt_bufs[salt_pos].keyfile_buf[12]); + w3[1] = u8add (w3[1], esalt_bufs[salt_pos].keyfile_buf[13]); + w3[2] = u8add (w3[2], esalt_bufs[salt_pos].keyfile_buf[14]); + w3[3] = u8add (w3[3], esalt_bufs[salt_pos].keyfile_buf[15]); + + /** + * salt + */ + + u32x salt_buf1[16]; + + salt_buf1[ 0] = esalt_bufs[salt_pos].salt_buf[ 0]; + salt_buf1[ 1] = esalt_bufs[salt_pos].salt_buf[ 1]; + salt_buf1[ 2] = esalt_bufs[salt_pos].salt_buf[ 2]; + salt_buf1[ 3] = esalt_bufs[salt_pos].salt_buf[ 3]; + salt_buf1[ 4] = esalt_bufs[salt_pos].salt_buf[ 4]; + salt_buf1[ 5] = esalt_bufs[salt_pos].salt_buf[ 5]; + salt_buf1[ 6] = esalt_bufs[salt_pos].salt_buf[ 6]; + salt_buf1[ 7] = esalt_bufs[salt_pos].salt_buf[ 7]; + salt_buf1[ 8] = esalt_bufs[salt_pos].salt_buf[ 8]; + salt_buf1[ 9] = esalt_bufs[salt_pos].salt_buf[ 9]; + salt_buf1[10] = esalt_bufs[salt_pos].salt_buf[10]; + salt_buf1[11] = esalt_bufs[salt_pos].salt_buf[11]; + salt_buf1[12] = esalt_bufs[salt_pos].salt_buf[12]; + salt_buf1[13] = esalt_bufs[salt_pos].salt_buf[13]; + salt_buf1[14] = esalt_bufs[salt_pos].salt_buf[14]; + salt_buf1[15] = esalt_bufs[salt_pos].salt_buf[15]; + + u32x salt_buf2[16]; + + salt_buf2[ 0] = 0; + salt_buf2[ 1] = 0x80; + salt_buf2[ 2] = 0; + salt_buf2[ 3] = 0; + salt_buf2[ 4] = 0; + salt_buf2[ 5] = 0; + salt_buf2[ 6] = 0; + salt_buf2[ 7] = 0; + salt_buf2[ 8] = 0; + salt_buf2[ 9] = 0; + salt_buf2[10] = 0; + salt_buf2[11] = 0; + salt_buf2[12] = 0; + salt_buf2[13] = 0; + salt_buf2[14] = (64 + 64 + 4) * 8; + salt_buf2[15] = 0; + + const u32 truecrypt_mdlen = salt_bufs[0].truecrypt_mdlen; + + u32x w[16]; + + w[ 0] = w0[0]; + w[ 1] = w0[1]; + w[ 2] = w0[2]; + w[ 3] = w0[3]; + w[ 4] = w1[0]; + w[ 5] = w1[1]; + w[ 6] = w1[2]; + w[ 7] = w1[3]; + w[ 8] = w2[0]; + w[ 9] = w2[1]; + w[10] = w2[2]; + w[11] = w2[3]; + w[12] = w3[0]; + w[13] = w3[1]; + w[14] = w3[2]; + w[15] = w3[3]; + + u32x ipad[5]; + u32x opad[5]; + + hmac_init (w, ipad, opad); + + tmps[gid].ipad[0] = ipad[0]; + tmps[gid].ipad[1] = ipad[1]; + tmps[gid].ipad[2] = ipad[2]; + tmps[gid].ipad[3] = ipad[3]; + tmps[gid].ipad[4] = ipad[4]; + + tmps[gid].opad[0] = opad[0]; + tmps[gid].opad[1] = opad[1]; + tmps[gid].opad[2] = opad[2]; + tmps[gid].opad[3] = opad[3]; + tmps[gid].opad[4] = opad[4]; + + for (u32 i = 0, j = 1; i < (truecrypt_mdlen / 8 / 4); i += 5, j += 1) + { + salt_buf2[0] = swap_workaround (j); + + u32x dgst[5]; + + hmac_run2 (salt_buf1, salt_buf2, ipad, opad, dgst); + + tmps[gid].dgst[i + 0] = dgst[0]; + tmps[gid].dgst[i + 1] = dgst[1]; + tmps[gid].dgst[i + 2] = dgst[2]; + tmps[gid].dgst[i + 3] = dgst[3]; + tmps[gid].dgst[i + 4] = dgst[4]; + + tmps[gid].out[i + 0] = dgst[0]; + tmps[gid].out[i + 1] = dgst[1]; + tmps[gid].out[i + 2] = dgst[2]; + tmps[gid].out[i + 3] = dgst[3]; + tmps[gid].out[i + 4] = dgst[4]; + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m06212_loop (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global tc_tmp_t *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global tc_t *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + const u32 truecrypt_mdlen = salt_bufs[0].truecrypt_mdlen; + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x ipad[5]; + u32x opad[5]; + + ipad[0] = tmps[gid].ipad[0]; + ipad[1] = tmps[gid].ipad[1]; + ipad[2] = tmps[gid].ipad[2]; + ipad[3] = tmps[gid].ipad[3]; + ipad[4] = tmps[gid].ipad[4]; + + opad[0] = tmps[gid].opad[0]; + opad[1] = tmps[gid].opad[1]; + opad[2] = tmps[gid].opad[2]; + opad[3] = tmps[gid].opad[3]; + opad[4] = tmps[gid].opad[4]; + + for (u32 i = 0; i < (truecrypt_mdlen / 8 / 4); i += 5) + { + u32x dgst[5]; + u32x out[5]; + + dgst[0] = tmps[gid].dgst[i + 0]; + dgst[1] = tmps[gid].dgst[i + 1]; + dgst[2] = tmps[gid].dgst[i + 2]; + dgst[3] = tmps[gid].dgst[i + 3]; + dgst[4] = tmps[gid].dgst[i + 4]; + + out[0] = tmps[gid].out[i + 0]; + out[1] = tmps[gid].out[i + 1]; + out[2] = tmps[gid].out[i + 2]; + out[3] = tmps[gid].out[i + 3]; + out[4] = tmps[gid].out[i + 4]; + + for (u32 j = 0; j < loop_cnt; j++) + { + u32x w[16]; + + w[ 0] = dgst[0]; + w[ 1] = dgst[1]; + w[ 2] = dgst[2]; + w[ 3] = dgst[3]; + w[ 4] = dgst[4]; + w[ 5] = 0x80; + w[ 6] = 0; + w[ 7] = 0; + w[ 8] = 0; + w[ 9] = 0; + w[10] = 0; + w[11] = 0; + w[12] = 0; + w[13] = 0; + w[14] = (64 + 20) * 8; + w[15] = 0; + + hmac_run (w, ipad, opad, dgst); + + out[0] ^= dgst[0]; + out[1] ^= dgst[1]; + out[2] ^= dgst[2]; + out[3] ^= dgst[3]; + out[4] ^= dgst[4]; + } + + tmps[gid].dgst[i + 0] = dgst[0]; + tmps[gid].dgst[i + 1] = dgst[1]; + tmps[gid].dgst[i + 2] = dgst[2]; + tmps[gid].dgst[i + 3] = dgst[3]; + tmps[gid].dgst[i + 4] = dgst[4]; + + tmps[gid].out[i + 0] = out[0]; + tmps[gid].out[i + 1] = out[1]; + tmps[gid].out[i + 2] = out[2]; + tmps[gid].out[i + 3] = out[3]; + tmps[gid].out[i + 4] = out[4]; + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m06212_comp (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global tc_tmp_t *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global tc_t *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + const u32 lid = get_local_id (0); + + if (gid >= gid_max) return; + + u32 ukey1[8]; + + ukey1[0] = tmps[gid].out[ 0]; + ukey1[1] = tmps[gid].out[ 1]; + ukey1[2] = tmps[gid].out[ 2]; + ukey1[3] = tmps[gid].out[ 3]; + ukey1[4] = tmps[gid].out[ 4]; + ukey1[5] = tmps[gid].out[ 5]; + ukey1[6] = tmps[gid].out[ 6]; + ukey1[7] = tmps[gid].out[ 7]; + + u32 ukey2[8]; + + ukey2[0] = tmps[gid].out[ 8]; + ukey2[1] = tmps[gid].out[ 9]; + ukey2[2] = tmps[gid].out[10]; + ukey2[3] = tmps[gid].out[11]; + ukey2[4] = tmps[gid].out[12]; + ukey2[5] = tmps[gid].out[13]; + ukey2[6] = tmps[gid].out[14]; + ukey2[7] = tmps[gid].out[15]; + + u32 data[4]; + + data[0] = esalt_bufs[0].data_buf[0]; + data[1] = esalt_bufs[0].data_buf[1]; + data[2] = esalt_bufs[0].data_buf[2]; + data[3] = esalt_bufs[0].data_buf[3]; + + u32 tmp[4]; + + { + tmp[0] = data[0]; + tmp[1] = data[1]; + tmp[2] = data[2]; + tmp[3] = data[3]; + + aes256_decrypt_xts (ukey1, ukey2, tmp, tmp); + + if (((tmp[0] == 0x45555254) && (tmp[3] == 0)) || ((tmp[0] == 0x45555254) && ((tmp[1] >> 16) <= 5))) + { + mark_hash_s0 (plains_buf, hashes_shown, 0, gid, 0); + + d_return_buf[lid] = 1; + } + } + + { + tmp[0] = data[0]; + tmp[1] = data[1]; + tmp[2] = data[2]; + tmp[3] = data[3]; + + serpent256_decrypt_xts (ukey1, ukey2, tmp, tmp); + + if (((tmp[0] == 0x45555254) && (tmp[3] == 0)) || ((tmp[0] == 0x45555254) && ((tmp[1] >> 16) <= 5))) + { + mark_hash_s0 (plains_buf, hashes_shown, 0, gid, 0); + + d_return_buf[lid] = 1; + } + } + + { + tmp[0] = data[0]; + tmp[1] = data[1]; + tmp[2] = data[2]; + tmp[3] = data[3]; + + twofish256_decrypt_xts (ukey1, ukey2, tmp, tmp); + + if (((tmp[0] == 0x45555254) && (tmp[3] == 0)) || ((tmp[0] == 0x45555254) && ((tmp[1] >> 16) <= 5))) + { + mark_hash_s0 (plains_buf, hashes_shown, 0, gid, 0); + + d_return_buf[lid] = 1; + } + } + + u32 ukey3[8]; + + ukey3[0] = tmps[gid].out[16]; + ukey3[1] = tmps[gid].out[17]; + ukey3[2] = tmps[gid].out[18]; + ukey3[3] = tmps[gid].out[19]; + ukey3[4] = tmps[gid].out[20]; + ukey3[5] = tmps[gid].out[21]; + ukey3[6] = tmps[gid].out[22]; + ukey3[7] = tmps[gid].out[23]; + + u32 ukey4[8]; + + ukey4[0] = tmps[gid].out[24]; + ukey4[1] = tmps[gid].out[25]; + ukey4[2] = tmps[gid].out[26]; + ukey4[3] = tmps[gid].out[27]; + ukey4[4] = tmps[gid].out[28]; + ukey4[5] = tmps[gid].out[29]; + ukey4[6] = tmps[gid].out[30]; + ukey4[7] = tmps[gid].out[31]; + + { + tmp[0] = data[0]; + tmp[1] = data[1]; + tmp[2] = data[2]; + tmp[3] = data[3]; + + aes256_decrypt_xts (ukey2, ukey4, tmp, tmp); + twofish256_decrypt_xts (ukey1, ukey3, tmp, tmp); + + if (((tmp[0] == 0x45555254) && (tmp[3] == 0)) || ((tmp[0] == 0x45555254) && ((tmp[1] >> 16) <= 5))) + { + mark_hash_s0 (plains_buf, hashes_shown, 0, gid, 0); + + d_return_buf[lid] = 1; + } + } + + { + tmp[0] = data[0]; + tmp[1] = data[1]; + tmp[2] = data[2]; + tmp[3] = data[3]; + + serpent256_decrypt_xts (ukey2, ukey4, tmp, tmp); + aes256_decrypt_xts (ukey1, ukey3, tmp, tmp); + + if (((tmp[0] == 0x45555254) && (tmp[3] == 0)) || ((tmp[0] == 0x45555254) && ((tmp[1] >> 16) <= 5))) + { + mark_hash_s0 (plains_buf, hashes_shown, 0, gid, 0); + + d_return_buf[lid] = 1; + } + } + + { + tmp[0] = data[0]; + tmp[1] = data[1]; + tmp[2] = data[2]; + tmp[3] = data[3]; + + twofish256_decrypt_xts (ukey2, ukey4, tmp, tmp); + serpent256_decrypt_xts (ukey1, ukey3, tmp, tmp); + + if (((tmp[0] == 0x45555254) && (tmp[3] == 0)) || ((tmp[0] == 0x45555254) && ((tmp[1] >> 16) <= 5))) + { + mark_hash_s0 (plains_buf, hashes_shown, 0, gid, 0); + + d_return_buf[lid] = 1; + } + } +} diff --git a/amd/m06213.cl b/amd/m06213.cl new file mode 100644 index 0000000000..c0ba879b4a --- /dev/null +++ b/amd/m06213.cl @@ -0,0 +1,852 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _RIPEMD160_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW4 +#define VECT_SIZE1 +#endif + +#ifdef VLIW5 +#define VECT_SIZE1 +#endif + +#define DGST_R0 0 +#define DGST_R1 1 +#define DGST_R2 2 +#define DGST_R3 3 + +#include "include/kernel_functions.c" +#include "types_amd.c" +#include "common_amd.c" + +#include "gpu_aes256_amd.c" +#include "gpu_twofish256_amd.c" +#include "gpu_serpent256_amd.c" + +static void ripemd160_transform (const u32x w[16], u32x dgst[5]) +{ + u32x a1 = dgst[0]; + u32x b1 = dgst[1]; + u32x c1 = dgst[2]; + u32x d1 = dgst[3]; + u32x e1 = dgst[4]; + + RIPEMD160_STEP (RIPEMD160_F , a1, b1, c1, d1, e1, w[ 0], RIPEMD160C00, RIPEMD160S00); + RIPEMD160_STEP (RIPEMD160_F , e1, a1, b1, c1, d1, w[ 1], RIPEMD160C00, RIPEMD160S01); + RIPEMD160_STEP (RIPEMD160_F , d1, e1, a1, b1, c1, w[ 2], RIPEMD160C00, RIPEMD160S02); + RIPEMD160_STEP (RIPEMD160_F , c1, d1, e1, a1, b1, w[ 3], RIPEMD160C00, RIPEMD160S03); + RIPEMD160_STEP (RIPEMD160_F , b1, c1, d1, e1, a1, w[ 4], RIPEMD160C00, RIPEMD160S04); + RIPEMD160_STEP (RIPEMD160_F , a1, b1, c1, d1, e1, w[ 5], RIPEMD160C00, RIPEMD160S05); + RIPEMD160_STEP (RIPEMD160_F , e1, a1, b1, c1, d1, w[ 6], RIPEMD160C00, RIPEMD160S06); + RIPEMD160_STEP (RIPEMD160_F , d1, e1, a1, b1, c1, w[ 7], RIPEMD160C00, RIPEMD160S07); + RIPEMD160_STEP (RIPEMD160_F , c1, d1, e1, a1, b1, w[ 8], RIPEMD160C00, RIPEMD160S08); + RIPEMD160_STEP (RIPEMD160_F , b1, c1, d1, e1, a1, w[ 9], RIPEMD160C00, RIPEMD160S09); + RIPEMD160_STEP (RIPEMD160_F , a1, b1, c1, d1, e1, w[10], RIPEMD160C00, RIPEMD160S0A); + RIPEMD160_STEP (RIPEMD160_F , e1, a1, b1, c1, d1, w[11], RIPEMD160C00, RIPEMD160S0B); + RIPEMD160_STEP (RIPEMD160_F , d1, e1, a1, b1, c1, w[12], RIPEMD160C00, RIPEMD160S0C); + RIPEMD160_STEP (RIPEMD160_F , c1, d1, e1, a1, b1, w[13], RIPEMD160C00, RIPEMD160S0D); + RIPEMD160_STEP (RIPEMD160_F , b1, c1, d1, e1, a1, w[14], RIPEMD160C00, RIPEMD160S0E); + RIPEMD160_STEP (RIPEMD160_F , a1, b1, c1, d1, e1, w[15], RIPEMD160C00, RIPEMD160S0F); + + RIPEMD160_STEP (RIPEMD160_Go, e1, a1, b1, c1, d1, w[ 7], RIPEMD160C10, RIPEMD160S10); + RIPEMD160_STEP (RIPEMD160_Go, d1, e1, a1, b1, c1, w[ 4], RIPEMD160C10, RIPEMD160S11); + RIPEMD160_STEP (RIPEMD160_Go, c1, d1, e1, a1, b1, w[13], RIPEMD160C10, RIPEMD160S12); + RIPEMD160_STEP (RIPEMD160_Go, b1, c1, d1, e1, a1, w[ 1], RIPEMD160C10, RIPEMD160S13); + RIPEMD160_STEP (RIPEMD160_Go, a1, b1, c1, d1, e1, w[10], RIPEMD160C10, RIPEMD160S14); + RIPEMD160_STEP (RIPEMD160_Go, e1, a1, b1, c1, d1, w[ 6], RIPEMD160C10, RIPEMD160S15); + RIPEMD160_STEP (RIPEMD160_Go, d1, e1, a1, b1, c1, w[15], RIPEMD160C10, RIPEMD160S16); + RIPEMD160_STEP (RIPEMD160_Go, c1, d1, e1, a1, b1, w[ 3], RIPEMD160C10, RIPEMD160S17); + RIPEMD160_STEP (RIPEMD160_Go, b1, c1, d1, e1, a1, w[12], RIPEMD160C10, RIPEMD160S18); + RIPEMD160_STEP (RIPEMD160_Go, a1, b1, c1, d1, e1, w[ 0], RIPEMD160C10, RIPEMD160S19); + RIPEMD160_STEP (RIPEMD160_Go, e1, a1, b1, c1, d1, w[ 9], RIPEMD160C10, RIPEMD160S1A); + RIPEMD160_STEP (RIPEMD160_Go, d1, e1, a1, b1, c1, w[ 5], RIPEMD160C10, RIPEMD160S1B); + RIPEMD160_STEP (RIPEMD160_Go, c1, d1, e1, a1, b1, w[ 2], RIPEMD160C10, RIPEMD160S1C); + RIPEMD160_STEP (RIPEMD160_Go, b1, c1, d1, e1, a1, w[14], RIPEMD160C10, RIPEMD160S1D); + RIPEMD160_STEP (RIPEMD160_Go, a1, b1, c1, d1, e1, w[11], RIPEMD160C10, RIPEMD160S1E); + RIPEMD160_STEP (RIPEMD160_Go, e1, a1, b1, c1, d1, w[ 8], RIPEMD160C10, RIPEMD160S1F); + + RIPEMD160_STEP (RIPEMD160_H , d1, e1, a1, b1, c1, w[ 3], RIPEMD160C20, RIPEMD160S20); + RIPEMD160_STEP (RIPEMD160_H , c1, d1, e1, a1, b1, w[10], RIPEMD160C20, RIPEMD160S21); + RIPEMD160_STEP (RIPEMD160_H , b1, c1, d1, e1, a1, w[14], RIPEMD160C20, RIPEMD160S22); + RIPEMD160_STEP (RIPEMD160_H , a1, b1, c1, d1, e1, w[ 4], RIPEMD160C20, RIPEMD160S23); + RIPEMD160_STEP (RIPEMD160_H , e1, a1, b1, c1, d1, w[ 9], RIPEMD160C20, RIPEMD160S24); + RIPEMD160_STEP (RIPEMD160_H , d1, e1, a1, b1, c1, w[15], RIPEMD160C20, RIPEMD160S25); + RIPEMD160_STEP (RIPEMD160_H , c1, d1, e1, a1, b1, w[ 8], RIPEMD160C20, RIPEMD160S26); + RIPEMD160_STEP (RIPEMD160_H , b1, c1, d1, e1, a1, w[ 1], RIPEMD160C20, RIPEMD160S27); + RIPEMD160_STEP (RIPEMD160_H , a1, b1, c1, d1, e1, w[ 2], RIPEMD160C20, RIPEMD160S28); + RIPEMD160_STEP (RIPEMD160_H , e1, a1, b1, c1, d1, w[ 7], RIPEMD160C20, RIPEMD160S29); + RIPEMD160_STEP (RIPEMD160_H , d1, e1, a1, b1, c1, w[ 0], RIPEMD160C20, RIPEMD160S2A); + RIPEMD160_STEP (RIPEMD160_H , c1, d1, e1, a1, b1, w[ 6], RIPEMD160C20, RIPEMD160S2B); + RIPEMD160_STEP (RIPEMD160_H , b1, c1, d1, e1, a1, w[13], RIPEMD160C20, RIPEMD160S2C); + RIPEMD160_STEP (RIPEMD160_H , a1, b1, c1, d1, e1, w[11], RIPEMD160C20, RIPEMD160S2D); + RIPEMD160_STEP (RIPEMD160_H , e1, a1, b1, c1, d1, w[ 5], RIPEMD160C20, RIPEMD160S2E); + RIPEMD160_STEP (RIPEMD160_H , d1, e1, a1, b1, c1, w[12], RIPEMD160C20, RIPEMD160S2F); + + RIPEMD160_STEP (RIPEMD160_Io, c1, d1, e1, a1, b1, w[ 1], RIPEMD160C30, RIPEMD160S30); + RIPEMD160_STEP (RIPEMD160_Io, b1, c1, d1, e1, a1, w[ 9], RIPEMD160C30, RIPEMD160S31); + RIPEMD160_STEP (RIPEMD160_Io, a1, b1, c1, d1, e1, w[11], RIPEMD160C30, RIPEMD160S32); + RIPEMD160_STEP (RIPEMD160_Io, e1, a1, b1, c1, d1, w[10], RIPEMD160C30, RIPEMD160S33); + RIPEMD160_STEP (RIPEMD160_Io, d1, e1, a1, b1, c1, w[ 0], RIPEMD160C30, RIPEMD160S34); + RIPEMD160_STEP (RIPEMD160_Io, c1, d1, e1, a1, b1, w[ 8], RIPEMD160C30, RIPEMD160S35); + RIPEMD160_STEP (RIPEMD160_Io, b1, c1, d1, e1, a1, w[12], RIPEMD160C30, RIPEMD160S36); + RIPEMD160_STEP (RIPEMD160_Io, a1, b1, c1, d1, e1, w[ 4], RIPEMD160C30, RIPEMD160S37); + RIPEMD160_STEP (RIPEMD160_Io, e1, a1, b1, c1, d1, w[13], RIPEMD160C30, RIPEMD160S38); + RIPEMD160_STEP (RIPEMD160_Io, d1, e1, a1, b1, c1, w[ 3], RIPEMD160C30, RIPEMD160S39); + RIPEMD160_STEP (RIPEMD160_Io, c1, d1, e1, a1, b1, w[ 7], RIPEMD160C30, RIPEMD160S3A); + RIPEMD160_STEP (RIPEMD160_Io, b1, c1, d1, e1, a1, w[15], RIPEMD160C30, RIPEMD160S3B); + RIPEMD160_STEP (RIPEMD160_Io, a1, b1, c1, d1, e1, w[14], RIPEMD160C30, RIPEMD160S3C); + RIPEMD160_STEP (RIPEMD160_Io, e1, a1, b1, c1, d1, w[ 5], RIPEMD160C30, RIPEMD160S3D); + RIPEMD160_STEP (RIPEMD160_Io, d1, e1, a1, b1, c1, w[ 6], RIPEMD160C30, RIPEMD160S3E); + RIPEMD160_STEP (RIPEMD160_Io, c1, d1, e1, a1, b1, w[ 2], RIPEMD160C30, RIPEMD160S3F); + + RIPEMD160_STEP (RIPEMD160_J , b1, c1, d1, e1, a1, w[ 4], RIPEMD160C40, RIPEMD160S40); + RIPEMD160_STEP (RIPEMD160_J , a1, b1, c1, d1, e1, w[ 0], RIPEMD160C40, RIPEMD160S41); + RIPEMD160_STEP (RIPEMD160_J , e1, a1, b1, c1, d1, w[ 5], RIPEMD160C40, RIPEMD160S42); + RIPEMD160_STEP (RIPEMD160_J , d1, e1, a1, b1, c1, w[ 9], RIPEMD160C40, RIPEMD160S43); + RIPEMD160_STEP (RIPEMD160_J , c1, d1, e1, a1, b1, w[ 7], RIPEMD160C40, RIPEMD160S44); + RIPEMD160_STEP (RIPEMD160_J , b1, c1, d1, e1, a1, w[12], RIPEMD160C40, RIPEMD160S45); + RIPEMD160_STEP (RIPEMD160_J , a1, b1, c1, d1, e1, w[ 2], RIPEMD160C40, RIPEMD160S46); + RIPEMD160_STEP (RIPEMD160_J , e1, a1, b1, c1, d1, w[10], RIPEMD160C40, RIPEMD160S47); + RIPEMD160_STEP (RIPEMD160_J , d1, e1, a1, b1, c1, w[14], RIPEMD160C40, RIPEMD160S48); + RIPEMD160_STEP (RIPEMD160_J , c1, d1, e1, a1, b1, w[ 1], RIPEMD160C40, RIPEMD160S49); + RIPEMD160_STEP (RIPEMD160_J , b1, c1, d1, e1, a1, w[ 3], RIPEMD160C40, RIPEMD160S4A); + RIPEMD160_STEP (RIPEMD160_J , a1, b1, c1, d1, e1, w[ 8], RIPEMD160C40, RIPEMD160S4B); + RIPEMD160_STEP (RIPEMD160_J , e1, a1, b1, c1, d1, w[11], RIPEMD160C40, RIPEMD160S4C); + RIPEMD160_STEP (RIPEMD160_J , d1, e1, a1, b1, c1, w[ 6], RIPEMD160C40, RIPEMD160S4D); + RIPEMD160_STEP (RIPEMD160_J , c1, d1, e1, a1, b1, w[15], RIPEMD160C40, RIPEMD160S4E); + RIPEMD160_STEP (RIPEMD160_J , b1, c1, d1, e1, a1, w[13], RIPEMD160C40, RIPEMD160S4F); + + u32x a2 = dgst[0]; + u32x b2 = dgst[1]; + u32x c2 = dgst[2]; + u32x d2 = dgst[3]; + u32x e2 = dgst[4]; + + RIPEMD160_STEP_WORKAROUND_BUG (RIPEMD160_J , a2, b2, c2, d2, e2, w[ 5], RIPEMD160C50, RIPEMD160S50); + RIPEMD160_STEP (RIPEMD160_J , e2, a2, b2, c2, d2, w[14], RIPEMD160C50, RIPEMD160S51); + RIPEMD160_STEP (RIPEMD160_J , d2, e2, a2, b2, c2, w[ 7], RIPEMD160C50, RIPEMD160S52); + RIPEMD160_STEP (RIPEMD160_J , c2, d2, e2, a2, b2, w[ 0], RIPEMD160C50, RIPEMD160S53); + RIPEMD160_STEP (RIPEMD160_J , b2, c2, d2, e2, a2, w[ 9], RIPEMD160C50, RIPEMD160S54); + RIPEMD160_STEP (RIPEMD160_J , a2, b2, c2, d2, e2, w[ 2], RIPEMD160C50, RIPEMD160S55); + RIPEMD160_STEP (RIPEMD160_J , e2, a2, b2, c2, d2, w[11], RIPEMD160C50, RIPEMD160S56); + RIPEMD160_STEP (RIPEMD160_J , d2, e2, a2, b2, c2, w[ 4], RIPEMD160C50, RIPEMD160S57); + RIPEMD160_STEP (RIPEMD160_J , c2, d2, e2, a2, b2, w[13], RIPEMD160C50, RIPEMD160S58); + RIPEMD160_STEP (RIPEMD160_J , b2, c2, d2, e2, a2, w[ 6], RIPEMD160C50, RIPEMD160S59); + RIPEMD160_STEP (RIPEMD160_J , a2, b2, c2, d2, e2, w[15], RIPEMD160C50, RIPEMD160S5A); + RIPEMD160_STEP (RIPEMD160_J , e2, a2, b2, c2, d2, w[ 8], RIPEMD160C50, RIPEMD160S5B); + RIPEMD160_STEP (RIPEMD160_J , d2, e2, a2, b2, c2, w[ 1], RIPEMD160C50, RIPEMD160S5C); + RIPEMD160_STEP (RIPEMD160_J , c2, d2, e2, a2, b2, w[10], RIPEMD160C50, RIPEMD160S5D); + RIPEMD160_STEP (RIPEMD160_J , b2, c2, d2, e2, a2, w[ 3], RIPEMD160C50, RIPEMD160S5E); + RIPEMD160_STEP (RIPEMD160_J , a2, b2, c2, d2, e2, w[12], RIPEMD160C50, RIPEMD160S5F); + + RIPEMD160_STEP (RIPEMD160_Io, e2, a2, b2, c2, d2, w[ 6], RIPEMD160C60, RIPEMD160S60); + RIPEMD160_STEP (RIPEMD160_Io, d2, e2, a2, b2, c2, w[11], RIPEMD160C60, RIPEMD160S61); + RIPEMD160_STEP (RIPEMD160_Io, c2, d2, e2, a2, b2, w[ 3], RIPEMD160C60, RIPEMD160S62); + RIPEMD160_STEP (RIPEMD160_Io, b2, c2, d2, e2, a2, w[ 7], RIPEMD160C60, RIPEMD160S63); + RIPEMD160_STEP (RIPEMD160_Io, a2, b2, c2, d2, e2, w[ 0], RIPEMD160C60, RIPEMD160S64); + RIPEMD160_STEP (RIPEMD160_Io, e2, a2, b2, c2, d2, w[13], RIPEMD160C60, RIPEMD160S65); + RIPEMD160_STEP (RIPEMD160_Io, d2, e2, a2, b2, c2, w[ 5], RIPEMD160C60, RIPEMD160S66); + RIPEMD160_STEP (RIPEMD160_Io, c2, d2, e2, a2, b2, w[10], RIPEMD160C60, RIPEMD160S67); + RIPEMD160_STEP (RIPEMD160_Io, b2, c2, d2, e2, a2, w[14], RIPEMD160C60, RIPEMD160S68); + RIPEMD160_STEP (RIPEMD160_Io, a2, b2, c2, d2, e2, w[15], RIPEMD160C60, RIPEMD160S69); + RIPEMD160_STEP (RIPEMD160_Io, e2, a2, b2, c2, d2, w[ 8], RIPEMD160C60, RIPEMD160S6A); + RIPEMD160_STEP (RIPEMD160_Io, d2, e2, a2, b2, c2, w[12], RIPEMD160C60, RIPEMD160S6B); + RIPEMD160_STEP (RIPEMD160_Io, c2, d2, e2, a2, b2, w[ 4], RIPEMD160C60, RIPEMD160S6C); + RIPEMD160_STEP (RIPEMD160_Io, b2, c2, d2, e2, a2, w[ 9], RIPEMD160C60, RIPEMD160S6D); + RIPEMD160_STEP (RIPEMD160_Io, a2, b2, c2, d2, e2, w[ 1], RIPEMD160C60, RIPEMD160S6E); + RIPEMD160_STEP (RIPEMD160_Io, e2, a2, b2, c2, d2, w[ 2], RIPEMD160C60, RIPEMD160S6F); + + RIPEMD160_STEP (RIPEMD160_H , d2, e2, a2, b2, c2, w[15], RIPEMD160C70, RIPEMD160S70); + RIPEMD160_STEP (RIPEMD160_H , c2, d2, e2, a2, b2, w[ 5], RIPEMD160C70, RIPEMD160S71); + RIPEMD160_STEP (RIPEMD160_H , b2, c2, d2, e2, a2, w[ 1], RIPEMD160C70, RIPEMD160S72); + RIPEMD160_STEP (RIPEMD160_H , a2, b2, c2, d2, e2, w[ 3], RIPEMD160C70, RIPEMD160S73); + RIPEMD160_STEP (RIPEMD160_H , e2, a2, b2, c2, d2, w[ 7], RIPEMD160C70, RIPEMD160S74); + RIPEMD160_STEP (RIPEMD160_H , d2, e2, a2, b2, c2, w[14], RIPEMD160C70, RIPEMD160S75); + RIPEMD160_STEP (RIPEMD160_H , c2, d2, e2, a2, b2, w[ 6], RIPEMD160C70, RIPEMD160S76); + RIPEMD160_STEP (RIPEMD160_H , b2, c2, d2, e2, a2, w[ 9], RIPEMD160C70, RIPEMD160S77); + RIPEMD160_STEP (RIPEMD160_H , a2, b2, c2, d2, e2, w[11], RIPEMD160C70, RIPEMD160S78); + RIPEMD160_STEP (RIPEMD160_H , e2, a2, b2, c2, d2, w[ 8], RIPEMD160C70, RIPEMD160S79); + RIPEMD160_STEP (RIPEMD160_H , d2, e2, a2, b2, c2, w[12], RIPEMD160C70, RIPEMD160S7A); + RIPEMD160_STEP (RIPEMD160_H , c2, d2, e2, a2, b2, w[ 2], RIPEMD160C70, RIPEMD160S7B); + RIPEMD160_STEP (RIPEMD160_H , b2, c2, d2, e2, a2, w[10], RIPEMD160C70, RIPEMD160S7C); + RIPEMD160_STEP (RIPEMD160_H , a2, b2, c2, d2, e2, w[ 0], RIPEMD160C70, RIPEMD160S7D); + RIPEMD160_STEP (RIPEMD160_H , e2, a2, b2, c2, d2, w[ 4], RIPEMD160C70, RIPEMD160S7E); + RIPEMD160_STEP (RIPEMD160_H , d2, e2, a2, b2, c2, w[13], RIPEMD160C70, RIPEMD160S7F); + + RIPEMD160_STEP (RIPEMD160_Go, c2, d2, e2, a2, b2, w[ 8], RIPEMD160C80, RIPEMD160S80); + RIPEMD160_STEP (RIPEMD160_Go, b2, c2, d2, e2, a2, w[ 6], RIPEMD160C80, RIPEMD160S81); + RIPEMD160_STEP (RIPEMD160_Go, a2, b2, c2, d2, e2, w[ 4], RIPEMD160C80, RIPEMD160S82); + RIPEMD160_STEP (RIPEMD160_Go, e2, a2, b2, c2, d2, w[ 1], RIPEMD160C80, RIPEMD160S83); + RIPEMD160_STEP (RIPEMD160_Go, d2, e2, a2, b2, c2, w[ 3], RIPEMD160C80, RIPEMD160S84); + RIPEMD160_STEP (RIPEMD160_Go, c2, d2, e2, a2, b2, w[11], RIPEMD160C80, RIPEMD160S85); + RIPEMD160_STEP (RIPEMD160_Go, b2, c2, d2, e2, a2, w[15], RIPEMD160C80, RIPEMD160S86); + RIPEMD160_STEP (RIPEMD160_Go, a2, b2, c2, d2, e2, w[ 0], RIPEMD160C80, RIPEMD160S87); + RIPEMD160_STEP (RIPEMD160_Go, e2, a2, b2, c2, d2, w[ 5], RIPEMD160C80, RIPEMD160S88); + RIPEMD160_STEP (RIPEMD160_Go, d2, e2, a2, b2, c2, w[12], RIPEMD160C80, RIPEMD160S89); + RIPEMD160_STEP (RIPEMD160_Go, c2, d2, e2, a2, b2, w[ 2], RIPEMD160C80, RIPEMD160S8A); + RIPEMD160_STEP (RIPEMD160_Go, b2, c2, d2, e2, a2, w[13], RIPEMD160C80, RIPEMD160S8B); + RIPEMD160_STEP (RIPEMD160_Go, a2, b2, c2, d2, e2, w[ 9], RIPEMD160C80, RIPEMD160S8C); + RIPEMD160_STEP (RIPEMD160_Go, e2, a2, b2, c2, d2, w[ 7], RIPEMD160C80, RIPEMD160S8D); + RIPEMD160_STEP (RIPEMD160_Go, d2, e2, a2, b2, c2, w[10], RIPEMD160C80, RIPEMD160S8E); + RIPEMD160_STEP (RIPEMD160_Go, c2, d2, e2, a2, b2, w[14], RIPEMD160C80, RIPEMD160S8F); + + RIPEMD160_STEP (RIPEMD160_F , b2, c2, d2, e2, a2, w[12], RIPEMD160C90, RIPEMD160S90); + RIPEMD160_STEP (RIPEMD160_F , a2, b2, c2, d2, e2, w[15], RIPEMD160C90, RIPEMD160S91); + RIPEMD160_STEP (RIPEMD160_F , e2, a2, b2, c2, d2, w[10], RIPEMD160C90, RIPEMD160S92); + RIPEMD160_STEP (RIPEMD160_F , d2, e2, a2, b2, c2, w[ 4], RIPEMD160C90, RIPEMD160S93); + RIPEMD160_STEP (RIPEMD160_F , c2, d2, e2, a2, b2, w[ 1], RIPEMD160C90, RIPEMD160S94); + RIPEMD160_STEP (RIPEMD160_F , b2, c2, d2, e2, a2, w[ 5], RIPEMD160C90, RIPEMD160S95); + RIPEMD160_STEP (RIPEMD160_F , a2, b2, c2, d2, e2, w[ 8], RIPEMD160C90, RIPEMD160S96); + RIPEMD160_STEP (RIPEMD160_F , e2, a2, b2, c2, d2, w[ 7], RIPEMD160C90, RIPEMD160S97); + RIPEMD160_STEP (RIPEMD160_F , d2, e2, a2, b2, c2, w[ 6], RIPEMD160C90, RIPEMD160S98); + RIPEMD160_STEP (RIPEMD160_F , c2, d2, e2, a2, b2, w[ 2], RIPEMD160C90, RIPEMD160S99); + RIPEMD160_STEP (RIPEMD160_F , b2, c2, d2, e2, a2, w[13], RIPEMD160C90, RIPEMD160S9A); + RIPEMD160_STEP (RIPEMD160_F , a2, b2, c2, d2, e2, w[14], RIPEMD160C90, RIPEMD160S9B); + RIPEMD160_STEP (RIPEMD160_F , e2, a2, b2, c2, d2, w[ 0], RIPEMD160C90, RIPEMD160S9C); + RIPEMD160_STEP (RIPEMD160_F , d2, e2, a2, b2, c2, w[ 3], RIPEMD160C90, RIPEMD160S9D); + RIPEMD160_STEP (RIPEMD160_F , c2, d2, e2, a2, b2, w[ 9], RIPEMD160C90, RIPEMD160S9E); + RIPEMD160_STEP (RIPEMD160_F , b2, c2, d2, e2, a2, w[11], RIPEMD160C90, RIPEMD160S9F); + + const u32x a = dgst[1] + c1 + d2; + const u32x b = dgst[2] + d1 + e2; + const u32x c = dgst[3] + e1 + a2; + const u32x d = dgst[4] + a1 + b2; + const u32x e = dgst[0] + b1 + c2; + + dgst[0] = a; + dgst[1] = b; + dgst[2] = c; + dgst[3] = d; + dgst[4] = e; +} + +static void hmac_run2 (const u32x w1[16], const u32x w2[16], const u32x ipad[5], const u32x opad[5], u32x dgst[5]) +{ + dgst[0] = ipad[0]; + dgst[1] = ipad[1]; + dgst[2] = ipad[2]; + dgst[3] = ipad[3]; + dgst[4] = ipad[4]; + + ripemd160_transform (w1, dgst); + ripemd160_transform (w2, dgst); + + u32x w[16]; + + w[ 0] = dgst[0]; + w[ 1] = dgst[1]; + w[ 2] = dgst[2]; + w[ 3] = dgst[3]; + w[ 4] = dgst[4]; + w[ 5] = 0x80; + w[ 6] = 0; + w[ 7] = 0; + w[ 8] = 0; + w[ 9] = 0; + w[10] = 0; + w[11] = 0; + w[12] = 0; + w[13] = 0; + w[14] = (64 + 20) * 8; + w[15] = 0; + + dgst[0] = opad[0]; + dgst[1] = opad[1]; + dgst[2] = opad[2]; + dgst[3] = opad[3]; + dgst[4] = opad[4]; + + ripemd160_transform (w, dgst); +} + +static void hmac_run (u32x w[16], const u32x ipad[5], const u32x opad[5], u32x dgst[5]) +{ + dgst[0] = ipad[0]; + dgst[1] = ipad[1]; + dgst[2] = ipad[2]; + dgst[3] = ipad[3]; + dgst[4] = ipad[4]; + + ripemd160_transform (w, dgst); + + w[ 0] = dgst[0]; + w[ 1] = dgst[1]; + w[ 2] = dgst[2]; + w[ 3] = dgst[3]; + w[ 4] = dgst[4]; + w[ 5] = 0x80; + w[ 6] = 0; + w[ 7] = 0; + w[ 8] = 0; + w[ 9] = 0; + w[10] = 0; + w[11] = 0; + w[12] = 0; + w[13] = 0; + w[14] = (64 + 20) * 8; + w[15] = 0; + + dgst[0] = opad[0]; + dgst[1] = opad[1]; + dgst[2] = opad[2]; + dgst[3] = opad[3]; + dgst[4] = opad[4]; + + ripemd160_transform (w, dgst); +} + +static void hmac_init (u32x w[16], u32x ipad[5], u32x opad[5]) +{ + w[ 0] ^= 0x36363636; + w[ 1] ^= 0x36363636; + w[ 2] ^= 0x36363636; + w[ 3] ^= 0x36363636; + w[ 4] ^= 0x36363636; + w[ 5] ^= 0x36363636; + w[ 6] ^= 0x36363636; + w[ 7] ^= 0x36363636; + w[ 8] ^= 0x36363636; + w[ 9] ^= 0x36363636; + w[10] ^= 0x36363636; + w[11] ^= 0x36363636; + w[12] ^= 0x36363636; + w[13] ^= 0x36363636; + w[14] ^= 0x36363636; + w[15] ^= 0x36363636; + + ipad[0] = RIPEMD160M_A; + ipad[1] = RIPEMD160M_B; + ipad[2] = RIPEMD160M_C; + ipad[3] = RIPEMD160M_D; + ipad[4] = RIPEMD160M_E; + + ripemd160_transform (w, ipad); + + w[ 0] ^= 0x6a6a6a6a; + w[ 1] ^= 0x6a6a6a6a; + w[ 2] ^= 0x6a6a6a6a; + w[ 3] ^= 0x6a6a6a6a; + w[ 4] ^= 0x6a6a6a6a; + w[ 5] ^= 0x6a6a6a6a; + w[ 6] ^= 0x6a6a6a6a; + w[ 7] ^= 0x6a6a6a6a; + w[ 8] ^= 0x6a6a6a6a; + w[ 9] ^= 0x6a6a6a6a; + w[10] ^= 0x6a6a6a6a; + w[11] ^= 0x6a6a6a6a; + w[12] ^= 0x6a6a6a6a; + w[13] ^= 0x6a6a6a6a; + w[14] ^= 0x6a6a6a6a; + w[15] ^= 0x6a6a6a6a; + + opad[0] = RIPEMD160M_A; + opad[1] = RIPEMD160M_B; + opad[2] = RIPEMD160M_C; + opad[3] = RIPEMD160M_D; + opad[4] = RIPEMD160M_E; + + ripemd160_transform (w, opad); +} + +static u32 u8add (const u32 a, const u32 b) +{ + const u32 a1 = (a >> 0) & 0xff; + const u32 a2 = (a >> 8) & 0xff; + const u32 a3 = (a >> 16) & 0xff; + const u32 a4 = (a >> 24) & 0xff; + + const u32 b1 = (b >> 0) & 0xff; + const u32 b2 = (b >> 8) & 0xff; + const u32 b3 = (b >> 16) & 0xff; + const u32 b4 = (b >> 24) & 0xff; + + const u32 r1 = (a1 + b1) & 0xff; + const u32 r2 = (a2 + b2) & 0xff; + const u32 r3 = (a3 + b3) & 0xff; + const u32 r4 = (a4 + b4) & 0xff; + + const u32 r = r1 << 0 + | r2 << 8 + | r3 << 16 + | r4 << 24; + + return r; +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m06213_init (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global tc_tmp_t *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global tc_t *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = pws[gid].i[ 8]; + w2[1] = pws[gid].i[ 9]; + w2[2] = pws[gid].i[10]; + w2[3] = pws[gid].i[11]; + + u32x w3[4]; + + w3[0] = pws[gid].i[12]; + w3[1] = pws[gid].i[13]; + w3[2] = pws[gid].i[14]; + w3[3] = pws[gid].i[15]; + + /** + * keyfile + */ + + w0[0] = u8add (w0[0], esalt_bufs[salt_pos].keyfile_buf[ 0]); + w0[1] = u8add (w0[1], esalt_bufs[salt_pos].keyfile_buf[ 1]); + w0[2] = u8add (w0[2], esalt_bufs[salt_pos].keyfile_buf[ 2]); + w0[3] = u8add (w0[3], esalt_bufs[salt_pos].keyfile_buf[ 3]); + w1[0] = u8add (w1[0], esalt_bufs[salt_pos].keyfile_buf[ 4]); + w1[1] = u8add (w1[1], esalt_bufs[salt_pos].keyfile_buf[ 5]); + w1[2] = u8add (w1[2], esalt_bufs[salt_pos].keyfile_buf[ 6]); + w1[3] = u8add (w1[3], esalt_bufs[salt_pos].keyfile_buf[ 7]); + w2[0] = u8add (w2[0], esalt_bufs[salt_pos].keyfile_buf[ 8]); + w2[1] = u8add (w2[1], esalt_bufs[salt_pos].keyfile_buf[ 9]); + w2[2] = u8add (w2[2], esalt_bufs[salt_pos].keyfile_buf[10]); + w2[3] = u8add (w2[3], esalt_bufs[salt_pos].keyfile_buf[11]); + w3[0] = u8add (w3[0], esalt_bufs[salt_pos].keyfile_buf[12]); + w3[1] = u8add (w3[1], esalt_bufs[salt_pos].keyfile_buf[13]); + w3[2] = u8add (w3[2], esalt_bufs[salt_pos].keyfile_buf[14]); + w3[3] = u8add (w3[3], esalt_bufs[salt_pos].keyfile_buf[15]); + + /** + * salt + */ + + u32x salt_buf1[16]; + + salt_buf1[ 0] = esalt_bufs[salt_pos].salt_buf[ 0]; + salt_buf1[ 1] = esalt_bufs[salt_pos].salt_buf[ 1]; + salt_buf1[ 2] = esalt_bufs[salt_pos].salt_buf[ 2]; + salt_buf1[ 3] = esalt_bufs[salt_pos].salt_buf[ 3]; + salt_buf1[ 4] = esalt_bufs[salt_pos].salt_buf[ 4]; + salt_buf1[ 5] = esalt_bufs[salt_pos].salt_buf[ 5]; + salt_buf1[ 6] = esalt_bufs[salt_pos].salt_buf[ 6]; + salt_buf1[ 7] = esalt_bufs[salt_pos].salt_buf[ 7]; + salt_buf1[ 8] = esalt_bufs[salt_pos].salt_buf[ 8]; + salt_buf1[ 9] = esalt_bufs[salt_pos].salt_buf[ 9]; + salt_buf1[10] = esalt_bufs[salt_pos].salt_buf[10]; + salt_buf1[11] = esalt_bufs[salt_pos].salt_buf[11]; + salt_buf1[12] = esalt_bufs[salt_pos].salt_buf[12]; + salt_buf1[13] = esalt_bufs[salt_pos].salt_buf[13]; + salt_buf1[14] = esalt_bufs[salt_pos].salt_buf[14]; + salt_buf1[15] = esalt_bufs[salt_pos].salt_buf[15]; + + u32x salt_buf2[16]; + + salt_buf2[ 0] = 0; + salt_buf2[ 1] = 0x80; + salt_buf2[ 2] = 0; + salt_buf2[ 3] = 0; + salt_buf2[ 4] = 0; + salt_buf2[ 5] = 0; + salt_buf2[ 6] = 0; + salt_buf2[ 7] = 0; + salt_buf2[ 8] = 0; + salt_buf2[ 9] = 0; + salt_buf2[10] = 0; + salt_buf2[11] = 0; + salt_buf2[12] = 0; + salt_buf2[13] = 0; + salt_buf2[14] = (64 + 64 + 4) * 8; + salt_buf2[15] = 0; + + const u32 truecrypt_mdlen = salt_bufs[0].truecrypt_mdlen; + + u32x w[16]; + + w[ 0] = w0[0]; + w[ 1] = w0[1]; + w[ 2] = w0[2]; + w[ 3] = w0[3]; + w[ 4] = w1[0]; + w[ 5] = w1[1]; + w[ 6] = w1[2]; + w[ 7] = w1[3]; + w[ 8] = w2[0]; + w[ 9] = w2[1]; + w[10] = w2[2]; + w[11] = w2[3]; + w[12] = w3[0]; + w[13] = w3[1]; + w[14] = w3[2]; + w[15] = w3[3]; + + u32x ipad[5]; + u32x opad[5]; + + hmac_init (w, ipad, opad); + + tmps[gid].ipad[0] = ipad[0]; + tmps[gid].ipad[1] = ipad[1]; + tmps[gid].ipad[2] = ipad[2]; + tmps[gid].ipad[3] = ipad[3]; + tmps[gid].ipad[4] = ipad[4]; + + tmps[gid].opad[0] = opad[0]; + tmps[gid].opad[1] = opad[1]; + tmps[gid].opad[2] = opad[2]; + tmps[gid].opad[3] = opad[3]; + tmps[gid].opad[4] = opad[4]; + + for (u32 i = 0, j = 1; i < (truecrypt_mdlen / 8 / 4); i += 5, j += 1) + { + salt_buf2[0] = swap_workaround (j); + + u32x dgst[5]; + + hmac_run2 (salt_buf1, salt_buf2, ipad, opad, dgst); + + tmps[gid].dgst[i + 0] = dgst[0]; + tmps[gid].dgst[i + 1] = dgst[1]; + tmps[gid].dgst[i + 2] = dgst[2]; + tmps[gid].dgst[i + 3] = dgst[3]; + tmps[gid].dgst[i + 4] = dgst[4]; + + tmps[gid].out[i + 0] = dgst[0]; + tmps[gid].out[i + 1] = dgst[1]; + tmps[gid].out[i + 2] = dgst[2]; + tmps[gid].out[i + 3] = dgst[3]; + tmps[gid].out[i + 4] = dgst[4]; + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m06213_loop (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global tc_tmp_t *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global tc_t *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + const u32 truecrypt_mdlen = salt_bufs[0].truecrypt_mdlen; + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x ipad[5]; + u32x opad[5]; + + ipad[0] = tmps[gid].ipad[0]; + ipad[1] = tmps[gid].ipad[1]; + ipad[2] = tmps[gid].ipad[2]; + ipad[3] = tmps[gid].ipad[3]; + ipad[4] = tmps[gid].ipad[4]; + + opad[0] = tmps[gid].opad[0]; + opad[1] = tmps[gid].opad[1]; + opad[2] = tmps[gid].opad[2]; + opad[3] = tmps[gid].opad[3]; + opad[4] = tmps[gid].opad[4]; + + for (u32 i = 0; i < (truecrypt_mdlen / 8 / 4); i += 5) + { + u32x dgst[5]; + u32x out[5]; + + dgst[0] = tmps[gid].dgst[i + 0]; + dgst[1] = tmps[gid].dgst[i + 1]; + dgst[2] = tmps[gid].dgst[i + 2]; + dgst[3] = tmps[gid].dgst[i + 3]; + dgst[4] = tmps[gid].dgst[i + 4]; + + out[0] = tmps[gid].out[i + 0]; + out[1] = tmps[gid].out[i + 1]; + out[2] = tmps[gid].out[i + 2]; + out[3] = tmps[gid].out[i + 3]; + out[4] = tmps[gid].out[i + 4]; + + for (u32 j = 0; j < loop_cnt; j++) + { + u32x w[16]; + + w[ 0] = dgst[0]; + w[ 1] = dgst[1]; + w[ 2] = dgst[2]; + w[ 3] = dgst[3]; + w[ 4] = dgst[4]; + w[ 5] = 0x80; + w[ 6] = 0; + w[ 7] = 0; + w[ 8] = 0; + w[ 9] = 0; + w[10] = 0; + w[11] = 0; + w[12] = 0; + w[13] = 0; + w[14] = (64 + 20) * 8; + w[15] = 0; + + hmac_run (w, ipad, opad, dgst); + + out[0] ^= dgst[0]; + out[1] ^= dgst[1]; + out[2] ^= dgst[2]; + out[3] ^= dgst[3]; + out[4] ^= dgst[4]; + } + + tmps[gid].dgst[i + 0] = dgst[0]; + tmps[gid].dgst[i + 1] = dgst[1]; + tmps[gid].dgst[i + 2] = dgst[2]; + tmps[gid].dgst[i + 3] = dgst[3]; + tmps[gid].dgst[i + 4] = dgst[4]; + + tmps[gid].out[i + 0] = out[0]; + tmps[gid].out[i + 1] = out[1]; + tmps[gid].out[i + 2] = out[2]; + tmps[gid].out[i + 3] = out[3]; + tmps[gid].out[i + 4] = out[4]; + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m06213_comp (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global tc_tmp_t *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global tc_t *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + const u32 lid = get_local_id (0); + + if (gid >= gid_max) return; + + u32 ukey1[8]; + + ukey1[0] = tmps[gid].out[ 0]; + ukey1[1] = tmps[gid].out[ 1]; + ukey1[2] = tmps[gid].out[ 2]; + ukey1[3] = tmps[gid].out[ 3]; + ukey1[4] = tmps[gid].out[ 4]; + ukey1[5] = tmps[gid].out[ 5]; + ukey1[6] = tmps[gid].out[ 6]; + ukey1[7] = tmps[gid].out[ 7]; + + u32 ukey2[8]; + + ukey2[0] = tmps[gid].out[ 8]; + ukey2[1] = tmps[gid].out[ 9]; + ukey2[2] = tmps[gid].out[10]; + ukey2[3] = tmps[gid].out[11]; + ukey2[4] = tmps[gid].out[12]; + ukey2[5] = tmps[gid].out[13]; + ukey2[6] = tmps[gid].out[14]; + ukey2[7] = tmps[gid].out[15]; + + u32 data[4]; + + data[0] = esalt_bufs[0].data_buf[0]; + data[1] = esalt_bufs[0].data_buf[1]; + data[2] = esalt_bufs[0].data_buf[2]; + data[3] = esalt_bufs[0].data_buf[3]; + + u32 tmp[4]; + + { + tmp[0] = data[0]; + tmp[1] = data[1]; + tmp[2] = data[2]; + tmp[3] = data[3]; + + aes256_decrypt_xts (ukey1, ukey2, tmp, tmp); + + if (((tmp[0] == 0x45555254) && (tmp[3] == 0)) || ((tmp[0] == 0x45555254) && ((tmp[1] >> 16) <= 5))) + { + mark_hash_s0 (plains_buf, hashes_shown, 0, gid, 0); + + d_return_buf[lid] = 1; + } + } + + { + tmp[0] = data[0]; + tmp[1] = data[1]; + tmp[2] = data[2]; + tmp[3] = data[3]; + + serpent256_decrypt_xts (ukey1, ukey2, tmp, tmp); + + if (((tmp[0] == 0x45555254) && (tmp[3] == 0)) || ((tmp[0] == 0x45555254) && ((tmp[1] >> 16) <= 5))) + { + mark_hash_s0 (plains_buf, hashes_shown, 0, gid, 0); + + d_return_buf[lid] = 1; + } + } + + { + tmp[0] = data[0]; + tmp[1] = data[1]; + tmp[2] = data[2]; + tmp[3] = data[3]; + + twofish256_decrypt_xts (ukey1, ukey2, tmp, tmp); + + if (((tmp[0] == 0x45555254) && (tmp[3] == 0)) || ((tmp[0] == 0x45555254) && ((tmp[1] >> 16) <= 5))) + { + mark_hash_s0 (plains_buf, hashes_shown, 0, gid, 0); + + d_return_buf[lid] = 1; + } + } + + u32 ukey3[8]; + + ukey3[0] = tmps[gid].out[16]; + ukey3[1] = tmps[gid].out[17]; + ukey3[2] = tmps[gid].out[18]; + ukey3[3] = tmps[gid].out[19]; + ukey3[4] = tmps[gid].out[20]; + ukey3[5] = tmps[gid].out[21]; + ukey3[6] = tmps[gid].out[22]; + ukey3[7] = tmps[gid].out[23]; + + u32 ukey4[8]; + + ukey4[0] = tmps[gid].out[24]; + ukey4[1] = tmps[gid].out[25]; + ukey4[2] = tmps[gid].out[26]; + ukey4[3] = tmps[gid].out[27]; + ukey4[4] = tmps[gid].out[28]; + ukey4[5] = tmps[gid].out[29]; + ukey4[6] = tmps[gid].out[30]; + ukey4[7] = tmps[gid].out[31]; + + { + tmp[0] = data[0]; + tmp[1] = data[1]; + tmp[2] = data[2]; + tmp[3] = data[3]; + + aes256_decrypt_xts (ukey2, ukey4, tmp, tmp); + twofish256_decrypt_xts (ukey1, ukey3, tmp, tmp); + + if (((tmp[0] == 0x45555254) && (tmp[3] == 0)) || ((tmp[0] == 0x45555254) && ((tmp[1] >> 16) <= 5))) + { + mark_hash_s0 (plains_buf, hashes_shown, 0, gid, 0); + + d_return_buf[lid] = 1; + } + } + + { + tmp[0] = data[0]; + tmp[1] = data[1]; + tmp[2] = data[2]; + tmp[3] = data[3]; + + serpent256_decrypt_xts (ukey2, ukey4, tmp, tmp); + aes256_decrypt_xts (ukey1, ukey3, tmp, tmp); + + if (((tmp[0] == 0x45555254) && (tmp[3] == 0)) || ((tmp[0] == 0x45555254) && ((tmp[1] >> 16) <= 5))) + { + mark_hash_s0 (plains_buf, hashes_shown, 0, gid, 0); + + d_return_buf[lid] = 1; + } + } + + { + tmp[0] = data[0]; + tmp[1] = data[1]; + tmp[2] = data[2]; + tmp[3] = data[3]; + + twofish256_decrypt_xts (ukey2, ukey4, tmp, tmp); + serpent256_decrypt_xts (ukey1, ukey3, tmp, tmp); + + if (((tmp[0] == 0x45555254) && (tmp[3] == 0)) || ((tmp[0] == 0x45555254) && ((tmp[1] >> 16) <= 5))) + { + mark_hash_s0 (plains_buf, hashes_shown, 0, gid, 0); + + d_return_buf[lid] = 1; + } + } + + u32 ukey5[8]; + + ukey5[0] = tmps[gid].out[32]; + ukey5[1] = tmps[gid].out[33]; + ukey5[2] = tmps[gid].out[34]; + ukey5[3] = tmps[gid].out[35]; + ukey5[4] = tmps[gid].out[36]; + ukey5[5] = tmps[gid].out[37]; + ukey5[6] = tmps[gid].out[38]; + ukey5[7] = tmps[gid].out[39]; + + u32 ukey6[8]; + + ukey6[0] = tmps[gid].out[40]; + ukey6[1] = tmps[gid].out[41]; + ukey6[2] = tmps[gid].out[42]; + ukey6[3] = tmps[gid].out[43]; + ukey6[4] = tmps[gid].out[44]; + ukey6[5] = tmps[gid].out[45]; + ukey6[6] = tmps[gid].out[46]; + ukey6[7] = tmps[gid].out[47]; + + { + tmp[0] = data[0]; + tmp[1] = data[1]; + tmp[2] = data[2]; + tmp[3] = data[3]; + + aes256_decrypt_xts (ukey3, ukey6, tmp, tmp); + twofish256_decrypt_xts (ukey2, ukey5, tmp, tmp); + serpent256_decrypt_xts (ukey1, ukey4, tmp, tmp); + + if (((tmp[0] == 0x45555254) && (tmp[3] == 0)) || ((tmp[0] == 0x45555254) && ((tmp[1] >> 16) <= 5))) + { + mark_hash_s0 (plains_buf, hashes_shown, 0, gid, 0); + + d_return_buf[lid] = 1; + } + } + + { + tmp[0] = data[0]; + tmp[1] = data[1]; + tmp[2] = data[2]; + tmp[3] = data[3]; + + serpent256_decrypt_xts (ukey3, ukey6, tmp, tmp); + twofish256_decrypt_xts (ukey2, ukey5, tmp, tmp); + aes256_decrypt_xts (ukey1, ukey4, tmp, tmp); + + if (((tmp[0] == 0x45555254) && (tmp[3] == 0)) || ((tmp[0] == 0x45555254) && ((tmp[1] >> 16) <= 5))) + { + mark_hash_s0 (plains_buf, hashes_shown, 0, gid, 0); + + d_return_buf[lid] = 1; + } + } +} + diff --git a/amd/m06221.cl b/amd/m06221.cl new file mode 100644 index 0000000000..2935832346 --- /dev/null +++ b/amd/m06221.cl @@ -0,0 +1,627 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _SHA512_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW4 +#define VECT_SIZE1 +#endif + +#ifdef VLIW5 +#define VECT_SIZE1 +#endif + +#define DGST_R0 0 +#define DGST_R1 1 +#define DGST_R2 2 +#define DGST_R3 3 + +#include "include/kernel_functions.c" +#include "types_amd.c" +#include "common_amd.c" + +#include "gpu_aes256_amd.c" +#include "gpu_twofish256_amd.c" +#include "gpu_serpent256_amd.c" + +__constant u64 k_sha512[80] = +{ + SHA512C00, SHA512C01, SHA512C02, SHA512C03, + SHA512C04, SHA512C05, SHA512C06, SHA512C07, + SHA512C08, SHA512C09, SHA512C0a, SHA512C0b, + SHA512C0c, SHA512C0d, SHA512C0e, SHA512C0f, + SHA512C10, SHA512C11, SHA512C12, SHA512C13, + SHA512C14, SHA512C15, SHA512C16, SHA512C17, + SHA512C18, SHA512C19, SHA512C1a, SHA512C1b, + SHA512C1c, SHA512C1d, SHA512C1e, SHA512C1f, + SHA512C20, SHA512C21, SHA512C22, SHA512C23, + SHA512C24, SHA512C25, SHA512C26, SHA512C27, + SHA512C28, SHA512C29, SHA512C2a, SHA512C2b, + SHA512C2c, SHA512C2d, SHA512C2e, SHA512C2f, + SHA512C30, SHA512C31, SHA512C32, SHA512C33, + SHA512C34, SHA512C35, SHA512C36, SHA512C37, + SHA512C38, SHA512C39, SHA512C3a, SHA512C3b, + SHA512C3c, SHA512C3d, SHA512C3e, SHA512C3f, + SHA512C40, SHA512C41, SHA512C42, SHA512C43, + SHA512C44, SHA512C45, SHA512C46, SHA512C47, + SHA512C48, SHA512C49, SHA512C4a, SHA512C4b, + SHA512C4c, SHA512C4d, SHA512C4e, SHA512C4f, +}; + +static void sha512_transform (const u64 w[16], u64 dgst[8]) +{ + u64 a = dgst[0]; + u64 b = dgst[1]; + u64 c = dgst[2]; + u64 d = dgst[3]; + u64 e = dgst[4]; + u64 f = dgst[5]; + u64 g = dgst[6]; + u64 h = dgst[7]; + + u64 w0_t = w[ 0]; + u64 w1_t = w[ 1]; + u64 w2_t = w[ 2]; + u64 w3_t = w[ 3]; + u64 w4_t = w[ 4]; + u64 w5_t = w[ 5]; + u64 w6_t = w[ 6]; + u64 w7_t = w[ 7]; + u64 w8_t = w[ 8]; + u64 w9_t = w[ 9]; + u64 wa_t = w[10]; + u64 wb_t = w[11]; + u64 wc_t = w[12]; + u64 wd_t = w[13]; + u64 we_t = w[14]; + u64 wf_t = w[15]; + + #define ROUND_EXPAND() \ + { \ + w0_t = SHA512_EXPAND (we_t, w9_t, w1_t, w0_t); \ + w1_t = SHA512_EXPAND (wf_t, wa_t, w2_t, w1_t); \ + w2_t = SHA512_EXPAND (w0_t, wb_t, w3_t, w2_t); \ + w3_t = SHA512_EXPAND (w1_t, wc_t, w4_t, w3_t); \ + w4_t = SHA512_EXPAND (w2_t, wd_t, w5_t, w4_t); \ + w5_t = SHA512_EXPAND (w3_t, we_t, w6_t, w5_t); \ + w6_t = SHA512_EXPAND (w4_t, wf_t, w7_t, w6_t); \ + w7_t = SHA512_EXPAND (w5_t, w0_t, w8_t, w7_t); \ + w8_t = SHA512_EXPAND (w6_t, w1_t, w9_t, w8_t); \ + w9_t = SHA512_EXPAND (w7_t, w2_t, wa_t, w9_t); \ + wa_t = SHA512_EXPAND (w8_t, w3_t, wb_t, wa_t); \ + wb_t = SHA512_EXPAND (w9_t, w4_t, wc_t, wb_t); \ + wc_t = SHA512_EXPAND (wa_t, w5_t, wd_t, wc_t); \ + wd_t = SHA512_EXPAND (wb_t, w6_t, we_t, wd_t); \ + we_t = SHA512_EXPAND (wc_t, w7_t, wf_t, we_t); \ + wf_t = SHA512_EXPAND (wd_t, w8_t, w0_t, wf_t); \ + } + + #define ROUND_STEP(i) \ + { \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, a, b, c, d, e, f, g, h, w0_t, k_sha512[i + 0]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, h, a, b, c, d, e, f, g, w1_t, k_sha512[i + 1]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, g, h, a, b, c, d, e, f, w2_t, k_sha512[i + 2]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, f, g, h, a, b, c, d, e, w3_t, k_sha512[i + 3]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, e, f, g, h, a, b, c, d, w4_t, k_sha512[i + 4]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, d, e, f, g, h, a, b, c, w5_t, k_sha512[i + 5]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, c, d, e, f, g, h, a, b, w6_t, k_sha512[i + 6]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, b, c, d, e, f, g, h, a, w7_t, k_sha512[i + 7]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, a, b, c, d, e, f, g, h, w8_t, k_sha512[i + 8]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, h, a, b, c, d, e, f, g, w9_t, k_sha512[i + 9]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, g, h, a, b, c, d, e, f, wa_t, k_sha512[i + 10]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, f, g, h, a, b, c, d, e, wb_t, k_sha512[i + 11]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, e, f, g, h, a, b, c, d, wc_t, k_sha512[i + 12]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, d, e, f, g, h, a, b, c, wd_t, k_sha512[i + 13]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, c, d, e, f, g, h, a, b, we_t, k_sha512[i + 14]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, b, c, d, e, f, g, h, a, wf_t, k_sha512[i + 15]); \ + } + + ROUND_STEP (0); + + //#pragma unroll + for (int i = 16; i < 80; i += 16) + { + ROUND_EXPAND (); ROUND_STEP (i); + } + + dgst[0] += a; + dgst[1] += b; + dgst[2] += c; + dgst[3] += d; + dgst[4] += e; + dgst[5] += f; + dgst[6] += g; + dgst[7] += h; +} + +static void hmac_run (const u64 w1[16], const u64 ipad[8], const u64 opad[8], u64 dgst[8]) +{ + dgst[0] = ipad[0]; + dgst[1] = ipad[1]; + dgst[2] = ipad[2]; + dgst[3] = ipad[3]; + dgst[4] = ipad[4]; + dgst[5] = ipad[5]; + dgst[6] = ipad[6]; + dgst[7] = ipad[7]; + + sha512_transform (w1, dgst); + + u64 w[16]; + + w[ 0] = dgst[0]; + w[ 1] = dgst[1]; + w[ 2] = dgst[2]; + w[ 3] = dgst[3]; + w[ 4] = dgst[4]; + w[ 5] = dgst[5]; + w[ 6] = dgst[6]; + w[ 7] = dgst[7]; + w[ 8] = 0x8000000000000000; + w[ 9] = 0; + w[10] = 0; + w[11] = 0; + w[12] = 0; + w[13] = 0; + w[14] = 0; + w[15] = (128 + 64) * 8; + + dgst[0] = opad[0]; + dgst[1] = opad[1]; + dgst[2] = opad[2]; + dgst[3] = opad[3]; + dgst[4] = opad[4]; + dgst[5] = opad[5]; + dgst[6] = opad[6]; + dgst[7] = opad[7]; + + sha512_transform (w, dgst); +} + +static void hmac_init (u64 w[16], u64 ipad[8], u64 opad[8]) +{ + w[ 0] ^= 0x3636363636363636; + w[ 1] ^= 0x3636363636363636; + w[ 2] ^= 0x3636363636363636; + w[ 3] ^= 0x3636363636363636; + w[ 4] ^= 0x3636363636363636; + w[ 5] ^= 0x3636363636363636; + w[ 6] ^= 0x3636363636363636; + w[ 7] ^= 0x3636363636363636; + w[ 8] ^= 0x3636363636363636; + w[ 9] ^= 0x3636363636363636; + w[10] ^= 0x3636363636363636; + w[11] ^= 0x3636363636363636; + w[12] ^= 0x3636363636363636; + w[13] ^= 0x3636363636363636; + w[14] ^= 0x3636363636363636; + w[15] ^= 0x3636363636363636; + + ipad[0] = SHA512M_A; + ipad[1] = SHA512M_B; + ipad[2] = SHA512M_C; + ipad[3] = SHA512M_D; + ipad[4] = SHA512M_E; + ipad[5] = SHA512M_F; + ipad[6] = SHA512M_G; + ipad[7] = SHA512M_H; + + sha512_transform (w, ipad); + + w[ 0] ^= 0x6a6a6a6a6a6a6a6a; + w[ 1] ^= 0x6a6a6a6a6a6a6a6a; + w[ 2] ^= 0x6a6a6a6a6a6a6a6a; + w[ 3] ^= 0x6a6a6a6a6a6a6a6a; + w[ 4] ^= 0x6a6a6a6a6a6a6a6a; + w[ 5] ^= 0x6a6a6a6a6a6a6a6a; + w[ 6] ^= 0x6a6a6a6a6a6a6a6a; + w[ 7] ^= 0x6a6a6a6a6a6a6a6a; + w[ 8] ^= 0x6a6a6a6a6a6a6a6a; + w[ 9] ^= 0x6a6a6a6a6a6a6a6a; + w[10] ^= 0x6a6a6a6a6a6a6a6a; + w[11] ^= 0x6a6a6a6a6a6a6a6a; + w[12] ^= 0x6a6a6a6a6a6a6a6a; + w[13] ^= 0x6a6a6a6a6a6a6a6a; + w[14] ^= 0x6a6a6a6a6a6a6a6a; + w[15] ^= 0x6a6a6a6a6a6a6a6a; + + opad[0] = SHA512M_A; + opad[1] = SHA512M_B; + opad[2] = SHA512M_C; + opad[3] = SHA512M_D; + opad[4] = SHA512M_E; + opad[5] = SHA512M_F; + opad[6] = SHA512M_G; + opad[7] = SHA512M_H; + + sha512_transform (w, opad); +} + +static u32 u8add (const u32 a, const u32 b) +{ + const u32 a1 = (a >> 0) & 0xff; + const u32 a2 = (a >> 8) & 0xff; + const u32 a3 = (a >> 16) & 0xff; + const u32 a4 = (a >> 24) & 0xff; + + const u32 b1 = (b >> 0) & 0xff; + const u32 b2 = (b >> 8) & 0xff; + const u32 b3 = (b >> 16) & 0xff; + const u32 b4 = (b >> 24) & 0xff; + + const u32 r1 = (a1 + b1) & 0xff; + const u32 r2 = (a2 + b2) & 0xff; + const u32 r3 = (a3 + b3) & 0xff; + const u32 r4 = (a4 + b4) & 0xff; + + const u32 r = r1 << 0 + | r2 << 8 + | r3 << 16 + | r4 << 24; + + return r; +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m06221_init (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global tc64_tmp_t *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global tc_t *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = pws[gid].i[ 8]; + w2[1] = pws[gid].i[ 9]; + w2[2] = pws[gid].i[10]; + w2[3] = pws[gid].i[11]; + + u32x w3[4]; + + w3[0] = pws[gid].i[12]; + w3[1] = pws[gid].i[13]; + w3[2] = pws[gid].i[14]; + w3[3] = pws[gid].i[15]; + + /** + * keyfile + */ + + w0[0] = u8add (w0[0], esalt_bufs[salt_pos].keyfile_buf[ 0]); + w0[1] = u8add (w0[1], esalt_bufs[salt_pos].keyfile_buf[ 1]); + w0[2] = u8add (w0[2], esalt_bufs[salt_pos].keyfile_buf[ 2]); + w0[3] = u8add (w0[3], esalt_bufs[salt_pos].keyfile_buf[ 3]); + w1[0] = u8add (w1[0], esalt_bufs[salt_pos].keyfile_buf[ 4]); + w1[1] = u8add (w1[1], esalt_bufs[salt_pos].keyfile_buf[ 5]); + w1[2] = u8add (w1[2], esalt_bufs[salt_pos].keyfile_buf[ 6]); + w1[3] = u8add (w1[3], esalt_bufs[salt_pos].keyfile_buf[ 7]); + w2[0] = u8add (w2[0], esalt_bufs[salt_pos].keyfile_buf[ 8]); + w2[1] = u8add (w2[1], esalt_bufs[salt_pos].keyfile_buf[ 9]); + w2[2] = u8add (w2[2], esalt_bufs[salt_pos].keyfile_buf[10]); + w2[3] = u8add (w2[3], esalt_bufs[salt_pos].keyfile_buf[11]); + w3[0] = u8add (w3[0], esalt_bufs[salt_pos].keyfile_buf[12]); + w3[1] = u8add (w3[1], esalt_bufs[salt_pos].keyfile_buf[13]); + w3[2] = u8add (w3[2], esalt_bufs[salt_pos].keyfile_buf[14]); + w3[3] = u8add (w3[3], esalt_bufs[salt_pos].keyfile_buf[15]); + + /** + * salt + */ + + u64 salt_buf[16]; + + // swap fehlt + + salt_buf[ 0] = ((u64) swap_workaround (esalt_bufs[salt_pos].salt_buf[ 0])) << 32 | (u64) swap_workaround (esalt_bufs[salt_pos].salt_buf[ 1]); + salt_buf[ 1] = ((u64) swap_workaround (esalt_bufs[salt_pos].salt_buf[ 2])) << 32 | (u64) swap_workaround (esalt_bufs[salt_pos].salt_buf[ 3]); + salt_buf[ 2] = ((u64) swap_workaround (esalt_bufs[salt_pos].salt_buf[ 4])) << 32 | (u64) swap_workaround (esalt_bufs[salt_pos].salt_buf[ 5]); + salt_buf[ 3] = ((u64) swap_workaround (esalt_bufs[salt_pos].salt_buf[ 6])) << 32 | (u64) swap_workaround (esalt_bufs[salt_pos].salt_buf[ 7]); + salt_buf[ 4] = ((u64) swap_workaround (esalt_bufs[salt_pos].salt_buf[ 8])) << 32 | (u64) swap_workaround (esalt_bufs[salt_pos].salt_buf[ 9]); + salt_buf[ 5] = ((u64) swap_workaround (esalt_bufs[salt_pos].salt_buf[10])) << 32 | (u64) swap_workaround (esalt_bufs[salt_pos].salt_buf[11]); + salt_buf[ 6] = ((u64) swap_workaround (esalt_bufs[salt_pos].salt_buf[12])) << 32 | (u64) swap_workaround (esalt_bufs[salt_pos].salt_buf[13]); + salt_buf[ 7] = ((u64) swap_workaround (esalt_bufs[salt_pos].salt_buf[14])) << 32 | (u64) swap_workaround (esalt_bufs[salt_pos].salt_buf[15]); + salt_buf[ 8] = 0; + salt_buf[ 9] = 0; + salt_buf[10] = 0; + salt_buf[11] = 0; + salt_buf[12] = 0; + salt_buf[13] = 0; + salt_buf[14] = 0; + salt_buf[15] = (128 + 64 + 4) * 8; + + const u32 truecrypt_mdlen = salt_bufs[0].truecrypt_mdlen; + + u64 w[16]; + + w[ 0] = ((u64) swap_workaround (w0[0])) << 32 | (u64) swap_workaround (w0[1]); + w[ 1] = ((u64) swap_workaround (w0[2])) << 32 | (u64) swap_workaround (w0[3]); + w[ 2] = ((u64) swap_workaround (w1[0])) << 32 | (u64) swap_workaround (w1[1]); + w[ 3] = ((u64) swap_workaround (w1[2])) << 32 | (u64) swap_workaround (w1[3]); + w[ 4] = ((u64) swap_workaround (w2[0])) << 32 | (u64) swap_workaround (w2[1]); + w[ 5] = ((u64) swap_workaround (w2[2])) << 32 | (u64) swap_workaround (w2[3]); + w[ 6] = ((u64) swap_workaround (w3[0])) << 32 | (u64) swap_workaround (w3[1]); + w[ 7] = ((u64) swap_workaround (w3[2])) << 32 | (u64) swap_workaround (w3[3]); + w[ 8] = 0; + w[ 9] = 0; + w[10] = 0; + w[11] = 0; + w[12] = 0; + w[13] = 0; + w[14] = 0; + w[15] = 0; + + u64 ipad[8]; + u64 opad[8]; + + hmac_init (w, ipad, opad); + + tmps[gid].ipad[0] = ipad[0]; + tmps[gid].ipad[1] = ipad[1]; + tmps[gid].ipad[2] = ipad[2]; + tmps[gid].ipad[3] = ipad[3]; + tmps[gid].ipad[4] = ipad[4]; + tmps[gid].ipad[5] = ipad[5]; + tmps[gid].ipad[6] = ipad[6]; + tmps[gid].ipad[7] = ipad[7]; + + tmps[gid].opad[0] = opad[0]; + tmps[gid].opad[1] = opad[1]; + tmps[gid].opad[2] = opad[2]; + tmps[gid].opad[3] = opad[3]; + tmps[gid].opad[4] = opad[4]; + tmps[gid].opad[5] = opad[5]; + tmps[gid].opad[6] = opad[6]; + tmps[gid].opad[7] = opad[7]; + + for (u32 i = 0, j = 1; i < (truecrypt_mdlen / 8 / 8); i += 8, j += 1) + { + salt_buf[8] = (u64) j << 32 | (u64) 0x80000000; + + u64 dgst[8]; + + hmac_run (salt_buf, ipad, opad, dgst); + + tmps[gid].dgst[i + 0] = dgst[0]; + tmps[gid].dgst[i + 1] = dgst[1]; + tmps[gid].dgst[i + 2] = dgst[2]; + tmps[gid].dgst[i + 3] = dgst[3]; + tmps[gid].dgst[i + 4] = dgst[4]; + tmps[gid].dgst[i + 5] = dgst[5]; + tmps[gid].dgst[i + 6] = dgst[6]; + tmps[gid].dgst[i + 7] = dgst[7]; + + tmps[gid].out[i + 0] = dgst[0]; + tmps[gid].out[i + 1] = dgst[1]; + tmps[gid].out[i + 2] = dgst[2]; + tmps[gid].out[i + 3] = dgst[3]; + tmps[gid].out[i + 4] = dgst[4]; + tmps[gid].out[i + 5] = dgst[5]; + tmps[gid].out[i + 6] = dgst[6]; + tmps[gid].out[i + 7] = dgst[7]; + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m06221_loop (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global tc64_tmp_t *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global tc_t *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + const u32 truecrypt_mdlen = salt_bufs[0].truecrypt_mdlen; + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u64 ipad[8]; + + ipad[0] = tmps[gid].ipad[0]; + ipad[1] = tmps[gid].ipad[1]; + ipad[2] = tmps[gid].ipad[2]; + ipad[3] = tmps[gid].ipad[3]; + ipad[4] = tmps[gid].ipad[4]; + ipad[5] = tmps[gid].ipad[5]; + ipad[6] = tmps[gid].ipad[6]; + ipad[7] = tmps[gid].ipad[7]; + + u64 opad[8]; + + opad[0] = tmps[gid].opad[0]; + opad[1] = tmps[gid].opad[1]; + opad[2] = tmps[gid].opad[2]; + opad[3] = tmps[gid].opad[3]; + opad[4] = tmps[gid].opad[4]; + opad[5] = tmps[gid].opad[5]; + opad[6] = tmps[gid].opad[6]; + opad[7] = tmps[gid].opad[7]; + + for (u32 i = 0; i < (truecrypt_mdlen / 8 / 8); i += 8) + { + u64 dgst[8]; + + dgst[0] = tmps[gid].dgst[i + 0]; + dgst[1] = tmps[gid].dgst[i + 1]; + dgst[2] = tmps[gid].dgst[i + 2]; + dgst[3] = tmps[gid].dgst[i + 3]; + dgst[4] = tmps[gid].dgst[i + 4]; + dgst[5] = tmps[gid].dgst[i + 5]; + dgst[6] = tmps[gid].dgst[i + 6]; + dgst[7] = tmps[gid].dgst[i + 7]; + + u64 out[8]; + + out[0] = tmps[gid].out[i + 0]; + out[1] = tmps[gid].out[i + 1]; + out[2] = tmps[gid].out[i + 2]; + out[3] = tmps[gid].out[i + 3]; + out[4] = tmps[gid].out[i + 4]; + out[5] = tmps[gid].out[i + 5]; + out[6] = tmps[gid].out[i + 6]; + out[7] = tmps[gid].out[i + 7]; + + for (u32 j = 0; j < loop_cnt; j++) + { + u64 w[16]; + + w[ 0] = dgst[0]; + w[ 1] = dgst[1]; + w[ 2] = dgst[2]; + w[ 3] = dgst[3]; + w[ 4] = dgst[4]; + w[ 5] = dgst[5]; + w[ 6] = dgst[6]; + w[ 7] = dgst[7]; + w[ 8] = 0x8000000000000000; + w[ 9] = 0; + w[10] = 0; + w[11] = 0; + w[12] = 0; + w[13] = 0; + w[14] = 0; + w[15] = (128 + 64) * 8; + + hmac_run (w, ipad, opad, dgst); + + out[0] ^= dgst[0]; + out[1] ^= dgst[1]; + out[2] ^= dgst[2]; + out[3] ^= dgst[3]; + out[4] ^= dgst[4]; + out[5] ^= dgst[5]; + out[6] ^= dgst[6]; + out[7] ^= dgst[7]; + } + + tmps[gid].dgst[i + 0] = dgst[0]; + tmps[gid].dgst[i + 1] = dgst[1]; + tmps[gid].dgst[i + 2] = dgst[2]; + tmps[gid].dgst[i + 3] = dgst[3]; + tmps[gid].dgst[i + 4] = dgst[4]; + tmps[gid].dgst[i + 5] = dgst[5]; + tmps[gid].dgst[i + 6] = dgst[6]; + tmps[gid].dgst[i + 7] = dgst[7]; + + tmps[gid].out[i + 0] = out[0]; + tmps[gid].out[i + 1] = out[1]; + tmps[gid].out[i + 2] = out[2]; + tmps[gid].out[i + 3] = out[3]; + tmps[gid].out[i + 4] = out[4]; + tmps[gid].out[i + 5] = out[5]; + tmps[gid].out[i + 6] = out[6]; + tmps[gid].out[i + 7] = out[7]; + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m06221_comp (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global tc64_tmp_t *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global tc_t *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + const u32 lid = get_local_id (0); + + if (gid >= gid_max) return; + + u32 ukey1[8]; + + ukey1[0] = swap_workaround (h32_from_64 (tmps[gid].out[ 0])); + ukey1[1] = swap_workaround (l32_from_64 (tmps[gid].out[ 0])); + ukey1[2] = swap_workaround (h32_from_64 (tmps[gid].out[ 1])); + ukey1[3] = swap_workaround (l32_from_64 (tmps[gid].out[ 1])); + ukey1[4] = swap_workaround (h32_from_64 (tmps[gid].out[ 2])); + ukey1[5] = swap_workaround (l32_from_64 (tmps[gid].out[ 2])); + ukey1[6] = swap_workaround (h32_from_64 (tmps[gid].out[ 3])); + ukey1[7] = swap_workaround (l32_from_64 (tmps[gid].out[ 3])); + + u32 ukey2[8]; + + ukey2[0] = swap_workaround (h32_from_64 (tmps[gid].out[ 4])); + ukey2[1] = swap_workaround (l32_from_64 (tmps[gid].out[ 4])); + ukey2[2] = swap_workaround (h32_from_64 (tmps[gid].out[ 5])); + ukey2[3] = swap_workaround (l32_from_64 (tmps[gid].out[ 5])); + ukey2[4] = swap_workaround (h32_from_64 (tmps[gid].out[ 6])); + ukey2[5] = swap_workaround (l32_from_64 (tmps[gid].out[ 6])); + ukey2[6] = swap_workaround (h32_from_64 (tmps[gid].out[ 7])); + ukey2[7] = swap_workaround (l32_from_64 (tmps[gid].out[ 7])); + + u32 data[4]; + + data[0] = esalt_bufs[0].data_buf[0]; + data[1] = esalt_bufs[0].data_buf[1]; + data[2] = esalt_bufs[0].data_buf[2]; + data[3] = esalt_bufs[0].data_buf[3]; + + u32 tmp[4]; + + { + tmp[0] = data[0]; + tmp[1] = data[1]; + tmp[2] = data[2]; + tmp[3] = data[3]; + + aes256_decrypt_xts (ukey1, ukey2, tmp, tmp); + + if (((tmp[0] == 0x45555254) && (tmp[3] == 0)) || ((tmp[0] == 0x45555254) && ((tmp[1] >> 16) <= 5))) + { + mark_hash_s0 (plains_buf, hashes_shown, 0, gid, 0); + + d_return_buf[lid] = 1; + } + } + + { + tmp[0] = data[0]; + tmp[1] = data[1]; + tmp[2] = data[2]; + tmp[3] = data[3]; + + serpent256_decrypt_xts (ukey1, ukey2, tmp, tmp); + + if (((tmp[0] == 0x45555254) && (tmp[3] == 0)) || ((tmp[0] == 0x45555254) && ((tmp[1] >> 16) <= 5))) + { + mark_hash_s0 (plains_buf, hashes_shown, 0, gid, 0); + + d_return_buf[lid] = 1; + } + } + + { + tmp[0] = data[0]; + tmp[1] = data[1]; + tmp[2] = data[2]; + tmp[3] = data[3]; + + twofish256_decrypt_xts (ukey1, ukey2, tmp, tmp); + + if (((tmp[0] == 0x45555254) && (tmp[3] == 0)) || ((tmp[0] == 0x45555254) && ((tmp[1] >> 16) <= 5))) + { + mark_hash_s0 (plains_buf, hashes_shown, 0, gid, 0); + + d_return_buf[lid] = 1; + } + } +} + diff --git a/amd/m06222.cl b/amd/m06222.cl new file mode 100644 index 0000000000..040b59370a --- /dev/null +++ b/amd/m06222.cl @@ -0,0 +1,700 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _SHA512_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW4 +#define VECT_SIZE1 +#endif + +#ifdef VLIW5 +#define VECT_SIZE1 +#endif + +#define DGST_R0 0 +#define DGST_R1 1 +#define DGST_R2 2 +#define DGST_R3 3 + +#include "include/kernel_functions.c" +#include "types_amd.c" +#include "common_amd.c" + +#include "gpu_aes256_amd.c" +#include "gpu_twofish256_amd.c" +#include "gpu_serpent256_amd.c" + +__constant u64 k_sha512[80] = +{ + SHA512C00, SHA512C01, SHA512C02, SHA512C03, + SHA512C04, SHA512C05, SHA512C06, SHA512C07, + SHA512C08, SHA512C09, SHA512C0a, SHA512C0b, + SHA512C0c, SHA512C0d, SHA512C0e, SHA512C0f, + SHA512C10, SHA512C11, SHA512C12, SHA512C13, + SHA512C14, SHA512C15, SHA512C16, SHA512C17, + SHA512C18, SHA512C19, SHA512C1a, SHA512C1b, + SHA512C1c, SHA512C1d, SHA512C1e, SHA512C1f, + SHA512C20, SHA512C21, SHA512C22, SHA512C23, + SHA512C24, SHA512C25, SHA512C26, SHA512C27, + SHA512C28, SHA512C29, SHA512C2a, SHA512C2b, + SHA512C2c, SHA512C2d, SHA512C2e, SHA512C2f, + SHA512C30, SHA512C31, SHA512C32, SHA512C33, + SHA512C34, SHA512C35, SHA512C36, SHA512C37, + SHA512C38, SHA512C39, SHA512C3a, SHA512C3b, + SHA512C3c, SHA512C3d, SHA512C3e, SHA512C3f, + SHA512C40, SHA512C41, SHA512C42, SHA512C43, + SHA512C44, SHA512C45, SHA512C46, SHA512C47, + SHA512C48, SHA512C49, SHA512C4a, SHA512C4b, + SHA512C4c, SHA512C4d, SHA512C4e, SHA512C4f, +}; + +static void sha512_transform (const u64 w[16], u64 dgst[8]) +{ + u64 a = dgst[0]; + u64 b = dgst[1]; + u64 c = dgst[2]; + u64 d = dgst[3]; + u64 e = dgst[4]; + u64 f = dgst[5]; + u64 g = dgst[6]; + u64 h = dgst[7]; + + u64 w0_t = w[ 0]; + u64 w1_t = w[ 1]; + u64 w2_t = w[ 2]; + u64 w3_t = w[ 3]; + u64 w4_t = w[ 4]; + u64 w5_t = w[ 5]; + u64 w6_t = w[ 6]; + u64 w7_t = w[ 7]; + u64 w8_t = w[ 8]; + u64 w9_t = w[ 9]; + u64 wa_t = w[10]; + u64 wb_t = w[11]; + u64 wc_t = w[12]; + u64 wd_t = w[13]; + u64 we_t = w[14]; + u64 wf_t = w[15]; + + #define ROUND_EXPAND() \ + { \ + w0_t = SHA512_EXPAND (we_t, w9_t, w1_t, w0_t); \ + w1_t = SHA512_EXPAND (wf_t, wa_t, w2_t, w1_t); \ + w2_t = SHA512_EXPAND (w0_t, wb_t, w3_t, w2_t); \ + w3_t = SHA512_EXPAND (w1_t, wc_t, w4_t, w3_t); \ + w4_t = SHA512_EXPAND (w2_t, wd_t, w5_t, w4_t); \ + w5_t = SHA512_EXPAND (w3_t, we_t, w6_t, w5_t); \ + w6_t = SHA512_EXPAND (w4_t, wf_t, w7_t, w6_t); \ + w7_t = SHA512_EXPAND (w5_t, w0_t, w8_t, w7_t); \ + w8_t = SHA512_EXPAND (w6_t, w1_t, w9_t, w8_t); \ + w9_t = SHA512_EXPAND (w7_t, w2_t, wa_t, w9_t); \ + wa_t = SHA512_EXPAND (w8_t, w3_t, wb_t, wa_t); \ + wb_t = SHA512_EXPAND (w9_t, w4_t, wc_t, wb_t); \ + wc_t = SHA512_EXPAND (wa_t, w5_t, wd_t, wc_t); \ + wd_t = SHA512_EXPAND (wb_t, w6_t, we_t, wd_t); \ + we_t = SHA512_EXPAND (wc_t, w7_t, wf_t, we_t); \ + wf_t = SHA512_EXPAND (wd_t, w8_t, w0_t, wf_t); \ + } + + #define ROUND_STEP(i) \ + { \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, a, b, c, d, e, f, g, h, w0_t, k_sha512[i + 0]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, h, a, b, c, d, e, f, g, w1_t, k_sha512[i + 1]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, g, h, a, b, c, d, e, f, w2_t, k_sha512[i + 2]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, f, g, h, a, b, c, d, e, w3_t, k_sha512[i + 3]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, e, f, g, h, a, b, c, d, w4_t, k_sha512[i + 4]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, d, e, f, g, h, a, b, c, w5_t, k_sha512[i + 5]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, c, d, e, f, g, h, a, b, w6_t, k_sha512[i + 6]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, b, c, d, e, f, g, h, a, w7_t, k_sha512[i + 7]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, a, b, c, d, e, f, g, h, w8_t, k_sha512[i + 8]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, h, a, b, c, d, e, f, g, w9_t, k_sha512[i + 9]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, g, h, a, b, c, d, e, f, wa_t, k_sha512[i + 10]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, f, g, h, a, b, c, d, e, wb_t, k_sha512[i + 11]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, e, f, g, h, a, b, c, d, wc_t, k_sha512[i + 12]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, d, e, f, g, h, a, b, c, wd_t, k_sha512[i + 13]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, c, d, e, f, g, h, a, b, we_t, k_sha512[i + 14]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, b, c, d, e, f, g, h, a, wf_t, k_sha512[i + 15]); \ + } + + ROUND_STEP (0); + + //#pragma unroll + for (int i = 16; i < 80; i += 16) + { + ROUND_EXPAND (); ROUND_STEP (i); + } + + dgst[0] += a; + dgst[1] += b; + dgst[2] += c; + dgst[3] += d; + dgst[4] += e; + dgst[5] += f; + dgst[6] += g; + dgst[7] += h; +} + +static void hmac_run (const u64 w1[16], const u64 ipad[8], const u64 opad[8], u64 dgst[8]) +{ + dgst[0] = ipad[0]; + dgst[1] = ipad[1]; + dgst[2] = ipad[2]; + dgst[3] = ipad[3]; + dgst[4] = ipad[4]; + dgst[5] = ipad[5]; + dgst[6] = ipad[6]; + dgst[7] = ipad[7]; + + sha512_transform (w1, dgst); + + u64 w[16]; + + w[ 0] = dgst[0]; + w[ 1] = dgst[1]; + w[ 2] = dgst[2]; + w[ 3] = dgst[3]; + w[ 4] = dgst[4]; + w[ 5] = dgst[5]; + w[ 6] = dgst[6]; + w[ 7] = dgst[7]; + w[ 8] = 0x8000000000000000; + w[ 9] = 0; + w[10] = 0; + w[11] = 0; + w[12] = 0; + w[13] = 0; + w[14] = 0; + w[15] = (128 + 64) * 8; + + dgst[0] = opad[0]; + dgst[1] = opad[1]; + dgst[2] = opad[2]; + dgst[3] = opad[3]; + dgst[4] = opad[4]; + dgst[5] = opad[5]; + dgst[6] = opad[6]; + dgst[7] = opad[7]; + + sha512_transform (w, dgst); +} + +static void hmac_init (u64 w[16], u64 ipad[8], u64 opad[8]) +{ + w[ 0] ^= 0x3636363636363636; + w[ 1] ^= 0x3636363636363636; + w[ 2] ^= 0x3636363636363636; + w[ 3] ^= 0x3636363636363636; + w[ 4] ^= 0x3636363636363636; + w[ 5] ^= 0x3636363636363636; + w[ 6] ^= 0x3636363636363636; + w[ 7] ^= 0x3636363636363636; + w[ 8] ^= 0x3636363636363636; + w[ 9] ^= 0x3636363636363636; + w[10] ^= 0x3636363636363636; + w[11] ^= 0x3636363636363636; + w[12] ^= 0x3636363636363636; + w[13] ^= 0x3636363636363636; + w[14] ^= 0x3636363636363636; + w[15] ^= 0x3636363636363636; + + ipad[0] = SHA512M_A; + ipad[1] = SHA512M_B; + ipad[2] = SHA512M_C; + ipad[3] = SHA512M_D; + ipad[4] = SHA512M_E; + ipad[5] = SHA512M_F; + ipad[6] = SHA512M_G; + ipad[7] = SHA512M_H; + + sha512_transform (w, ipad); + + w[ 0] ^= 0x6a6a6a6a6a6a6a6a; + w[ 1] ^= 0x6a6a6a6a6a6a6a6a; + w[ 2] ^= 0x6a6a6a6a6a6a6a6a; + w[ 3] ^= 0x6a6a6a6a6a6a6a6a; + w[ 4] ^= 0x6a6a6a6a6a6a6a6a; + w[ 5] ^= 0x6a6a6a6a6a6a6a6a; + w[ 6] ^= 0x6a6a6a6a6a6a6a6a; + w[ 7] ^= 0x6a6a6a6a6a6a6a6a; + w[ 8] ^= 0x6a6a6a6a6a6a6a6a; + w[ 9] ^= 0x6a6a6a6a6a6a6a6a; + w[10] ^= 0x6a6a6a6a6a6a6a6a; + w[11] ^= 0x6a6a6a6a6a6a6a6a; + w[12] ^= 0x6a6a6a6a6a6a6a6a; + w[13] ^= 0x6a6a6a6a6a6a6a6a; + w[14] ^= 0x6a6a6a6a6a6a6a6a; + w[15] ^= 0x6a6a6a6a6a6a6a6a; + + opad[0] = SHA512M_A; + opad[1] = SHA512M_B; + opad[2] = SHA512M_C; + opad[3] = SHA512M_D; + opad[4] = SHA512M_E; + opad[5] = SHA512M_F; + opad[6] = SHA512M_G; + opad[7] = SHA512M_H; + + sha512_transform (w, opad); +} + +static u32 u8add (const u32 a, const u32 b) +{ + const u32 a1 = (a >> 0) & 0xff; + const u32 a2 = (a >> 8) & 0xff; + const u32 a3 = (a >> 16) & 0xff; + const u32 a4 = (a >> 24) & 0xff; + + const u32 b1 = (b >> 0) & 0xff; + const u32 b2 = (b >> 8) & 0xff; + const u32 b3 = (b >> 16) & 0xff; + const u32 b4 = (b >> 24) & 0xff; + + const u32 r1 = (a1 + b1) & 0xff; + const u32 r2 = (a2 + b2) & 0xff; + const u32 r3 = (a3 + b3) & 0xff; + const u32 r4 = (a4 + b4) & 0xff; + + const u32 r = r1 << 0 + | r2 << 8 + | r3 << 16 + | r4 << 24; + + return r; +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m06222_init (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global tc64_tmp_t *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global tc_t *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = pws[gid].i[ 8]; + w2[1] = pws[gid].i[ 9]; + w2[2] = pws[gid].i[10]; + w2[3] = pws[gid].i[11]; + + u32x w3[4]; + + w3[0] = pws[gid].i[12]; + w3[1] = pws[gid].i[13]; + w3[2] = pws[gid].i[14]; + w3[3] = pws[gid].i[15]; + + /** + * keyfile + */ + + w0[0] = u8add (w0[0], esalt_bufs[salt_pos].keyfile_buf[ 0]); + w0[1] = u8add (w0[1], esalt_bufs[salt_pos].keyfile_buf[ 1]); + w0[2] = u8add (w0[2], esalt_bufs[salt_pos].keyfile_buf[ 2]); + w0[3] = u8add (w0[3], esalt_bufs[salt_pos].keyfile_buf[ 3]); + w1[0] = u8add (w1[0], esalt_bufs[salt_pos].keyfile_buf[ 4]); + w1[1] = u8add (w1[1], esalt_bufs[salt_pos].keyfile_buf[ 5]); + w1[2] = u8add (w1[2], esalt_bufs[salt_pos].keyfile_buf[ 6]); + w1[3] = u8add (w1[3], esalt_bufs[salt_pos].keyfile_buf[ 7]); + w2[0] = u8add (w2[0], esalt_bufs[salt_pos].keyfile_buf[ 8]); + w2[1] = u8add (w2[1], esalt_bufs[salt_pos].keyfile_buf[ 9]); + w2[2] = u8add (w2[2], esalt_bufs[salt_pos].keyfile_buf[10]); + w2[3] = u8add (w2[3], esalt_bufs[salt_pos].keyfile_buf[11]); + w3[0] = u8add (w3[0], esalt_bufs[salt_pos].keyfile_buf[12]); + w3[1] = u8add (w3[1], esalt_bufs[salt_pos].keyfile_buf[13]); + w3[2] = u8add (w3[2], esalt_bufs[salt_pos].keyfile_buf[14]); + w3[3] = u8add (w3[3], esalt_bufs[salt_pos].keyfile_buf[15]); + + /** + * salt + */ + + u64 salt_buf[16]; + + // swap fehlt + + salt_buf[ 0] = ((u64) swap_workaround (esalt_bufs[salt_pos].salt_buf[ 0])) << 32 | (u64) swap_workaround (esalt_bufs[salt_pos].salt_buf[ 1]); + salt_buf[ 1] = ((u64) swap_workaround (esalt_bufs[salt_pos].salt_buf[ 2])) << 32 | (u64) swap_workaround (esalt_bufs[salt_pos].salt_buf[ 3]); + salt_buf[ 2] = ((u64) swap_workaround (esalt_bufs[salt_pos].salt_buf[ 4])) << 32 | (u64) swap_workaround (esalt_bufs[salt_pos].salt_buf[ 5]); + salt_buf[ 3] = ((u64) swap_workaround (esalt_bufs[salt_pos].salt_buf[ 6])) << 32 | (u64) swap_workaround (esalt_bufs[salt_pos].salt_buf[ 7]); + salt_buf[ 4] = ((u64) swap_workaround (esalt_bufs[salt_pos].salt_buf[ 8])) << 32 | (u64) swap_workaround (esalt_bufs[salt_pos].salt_buf[ 9]); + salt_buf[ 5] = ((u64) swap_workaround (esalt_bufs[salt_pos].salt_buf[10])) << 32 | (u64) swap_workaround (esalt_bufs[salt_pos].salt_buf[11]); + salt_buf[ 6] = ((u64) swap_workaround (esalt_bufs[salt_pos].salt_buf[12])) << 32 | (u64) swap_workaround (esalt_bufs[salt_pos].salt_buf[13]); + salt_buf[ 7] = ((u64) swap_workaround (esalt_bufs[salt_pos].salt_buf[14])) << 32 | (u64) swap_workaround (esalt_bufs[salt_pos].salt_buf[15]); + salt_buf[ 8] = 0; + salt_buf[ 9] = 0; + salt_buf[10] = 0; + salt_buf[11] = 0; + salt_buf[12] = 0; + salt_buf[13] = 0; + salt_buf[14] = 0; + salt_buf[15] = (128 + 64 + 4) * 8; + + const u32 truecrypt_mdlen = salt_bufs[0].truecrypt_mdlen; + + u64 w[16]; + + w[ 0] = ((u64) swap_workaround (w0[0])) << 32 | (u64) swap_workaround (w0[1]); + w[ 1] = ((u64) swap_workaround (w0[2])) << 32 | (u64) swap_workaround (w0[3]); + w[ 2] = ((u64) swap_workaround (w1[0])) << 32 | (u64) swap_workaround (w1[1]); + w[ 3] = ((u64) swap_workaround (w1[2])) << 32 | (u64) swap_workaround (w1[3]); + w[ 4] = ((u64) swap_workaround (w2[0])) << 32 | (u64) swap_workaround (w2[1]); + w[ 5] = ((u64) swap_workaround (w2[2])) << 32 | (u64) swap_workaround (w2[3]); + w[ 6] = ((u64) swap_workaround (w3[0])) << 32 | (u64) swap_workaround (w3[1]); + w[ 7] = ((u64) swap_workaround (w3[2])) << 32 | (u64) swap_workaround (w3[3]); + w[ 8] = 0; + w[ 9] = 0; + w[10] = 0; + w[11] = 0; + w[12] = 0; + w[13] = 0; + w[14] = 0; + w[15] = 0; + + u64 ipad[8]; + u64 opad[8]; + + hmac_init (w, ipad, opad); + + tmps[gid].ipad[0] = ipad[0]; + tmps[gid].ipad[1] = ipad[1]; + tmps[gid].ipad[2] = ipad[2]; + tmps[gid].ipad[3] = ipad[3]; + tmps[gid].ipad[4] = ipad[4]; + tmps[gid].ipad[5] = ipad[5]; + tmps[gid].ipad[6] = ipad[6]; + tmps[gid].ipad[7] = ipad[7]; + + tmps[gid].opad[0] = opad[0]; + tmps[gid].opad[1] = opad[1]; + tmps[gid].opad[2] = opad[2]; + tmps[gid].opad[3] = opad[3]; + tmps[gid].opad[4] = opad[4]; + tmps[gid].opad[5] = opad[5]; + tmps[gid].opad[6] = opad[6]; + tmps[gid].opad[7] = opad[7]; + + for (u32 i = 0, j = 1; i < (truecrypt_mdlen / 8 / 8); i += 8, j += 1) + { + salt_buf[8] = (u64) j << 32 | (u64) 0x80000000; + + u64 dgst[8]; + + hmac_run (salt_buf, ipad, opad, dgst); + + tmps[gid].dgst[i + 0] = dgst[0]; + tmps[gid].dgst[i + 1] = dgst[1]; + tmps[gid].dgst[i + 2] = dgst[2]; + tmps[gid].dgst[i + 3] = dgst[3]; + tmps[gid].dgst[i + 4] = dgst[4]; + tmps[gid].dgst[i + 5] = dgst[5]; + tmps[gid].dgst[i + 6] = dgst[6]; + tmps[gid].dgst[i + 7] = dgst[7]; + + tmps[gid].out[i + 0] = dgst[0]; + tmps[gid].out[i + 1] = dgst[1]; + tmps[gid].out[i + 2] = dgst[2]; + tmps[gid].out[i + 3] = dgst[3]; + tmps[gid].out[i + 4] = dgst[4]; + tmps[gid].out[i + 5] = dgst[5]; + tmps[gid].out[i + 6] = dgst[6]; + tmps[gid].out[i + 7] = dgst[7]; + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m06222_loop (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global tc64_tmp_t *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global tc_t *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + const u32 truecrypt_mdlen = salt_bufs[0].truecrypt_mdlen; + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u64 ipad[8]; + + ipad[0] = tmps[gid].ipad[0]; + ipad[1] = tmps[gid].ipad[1]; + ipad[2] = tmps[gid].ipad[2]; + ipad[3] = tmps[gid].ipad[3]; + ipad[4] = tmps[gid].ipad[4]; + ipad[5] = tmps[gid].ipad[5]; + ipad[6] = tmps[gid].ipad[6]; + ipad[7] = tmps[gid].ipad[7]; + + u64 opad[8]; + + opad[0] = tmps[gid].opad[0]; + opad[1] = tmps[gid].opad[1]; + opad[2] = tmps[gid].opad[2]; + opad[3] = tmps[gid].opad[3]; + opad[4] = tmps[gid].opad[4]; + opad[5] = tmps[gid].opad[5]; + opad[6] = tmps[gid].opad[6]; + opad[7] = tmps[gid].opad[7]; + + for (u32 i = 0; i < (truecrypt_mdlen / 8 / 8); i += 8) + { + u64 dgst[8]; + + dgst[0] = tmps[gid].dgst[i + 0]; + dgst[1] = tmps[gid].dgst[i + 1]; + dgst[2] = tmps[gid].dgst[i + 2]; + dgst[3] = tmps[gid].dgst[i + 3]; + dgst[4] = tmps[gid].dgst[i + 4]; + dgst[5] = tmps[gid].dgst[i + 5]; + dgst[6] = tmps[gid].dgst[i + 6]; + dgst[7] = tmps[gid].dgst[i + 7]; + + u64 out[8]; + + out[0] = tmps[gid].out[i + 0]; + out[1] = tmps[gid].out[i + 1]; + out[2] = tmps[gid].out[i + 2]; + out[3] = tmps[gid].out[i + 3]; + out[4] = tmps[gid].out[i + 4]; + out[5] = tmps[gid].out[i + 5]; + out[6] = tmps[gid].out[i + 6]; + out[7] = tmps[gid].out[i + 7]; + + for (u32 j = 0; j < loop_cnt; j++) + { + u64 w[16]; + + w[ 0] = dgst[0]; + w[ 1] = dgst[1]; + w[ 2] = dgst[2]; + w[ 3] = dgst[3]; + w[ 4] = dgst[4]; + w[ 5] = dgst[5]; + w[ 6] = dgst[6]; + w[ 7] = dgst[7]; + w[ 8] = 0x8000000000000000; + w[ 9] = 0; + w[10] = 0; + w[11] = 0; + w[12] = 0; + w[13] = 0; + w[14] = 0; + w[15] = (128 + 64) * 8; + + hmac_run (w, ipad, opad, dgst); + + out[0] ^= dgst[0]; + out[1] ^= dgst[1]; + out[2] ^= dgst[2]; + out[3] ^= dgst[3]; + out[4] ^= dgst[4]; + out[5] ^= dgst[5]; + out[6] ^= dgst[6]; + out[7] ^= dgst[7]; + } + + tmps[gid].dgst[i + 0] = dgst[0]; + tmps[gid].dgst[i + 1] = dgst[1]; + tmps[gid].dgst[i + 2] = dgst[2]; + tmps[gid].dgst[i + 3] = dgst[3]; + tmps[gid].dgst[i + 4] = dgst[4]; + tmps[gid].dgst[i + 5] = dgst[5]; + tmps[gid].dgst[i + 6] = dgst[6]; + tmps[gid].dgst[i + 7] = dgst[7]; + + tmps[gid].out[i + 0] = out[0]; + tmps[gid].out[i + 1] = out[1]; + tmps[gid].out[i + 2] = out[2]; + tmps[gid].out[i + 3] = out[3]; + tmps[gid].out[i + 4] = out[4]; + tmps[gid].out[i + 5] = out[5]; + tmps[gid].out[i + 6] = out[6]; + tmps[gid].out[i + 7] = out[7]; + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m06222_comp (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global tc64_tmp_t *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global tc_t *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + const u32 lid = get_local_id (0); + + if (gid >= gid_max) return; + + u32 ukey1[8]; + + ukey1[0] = swap_workaround (h32_from_64 (tmps[gid].out[ 0])); + ukey1[1] = swap_workaround (l32_from_64 (tmps[gid].out[ 0])); + ukey1[2] = swap_workaround (h32_from_64 (tmps[gid].out[ 1])); + ukey1[3] = swap_workaround (l32_from_64 (tmps[gid].out[ 1])); + ukey1[4] = swap_workaround (h32_from_64 (tmps[gid].out[ 2])); + ukey1[5] = swap_workaround (l32_from_64 (tmps[gid].out[ 2])); + ukey1[6] = swap_workaround (h32_from_64 (tmps[gid].out[ 3])); + ukey1[7] = swap_workaround (l32_from_64 (tmps[gid].out[ 3])); + + u32 ukey2[8]; + + ukey2[0] = swap_workaround (h32_from_64 (tmps[gid].out[ 4])); + ukey2[1] = swap_workaround (l32_from_64 (tmps[gid].out[ 4])); + ukey2[2] = swap_workaround (h32_from_64 (tmps[gid].out[ 5])); + ukey2[3] = swap_workaround (l32_from_64 (tmps[gid].out[ 5])); + ukey2[4] = swap_workaround (h32_from_64 (tmps[gid].out[ 6])); + ukey2[5] = swap_workaround (l32_from_64 (tmps[gid].out[ 6])); + ukey2[6] = swap_workaround (h32_from_64 (tmps[gid].out[ 7])); + ukey2[7] = swap_workaround (l32_from_64 (tmps[gid].out[ 7])); + + u32 data[4]; + + data[0] = esalt_bufs[0].data_buf[0]; + data[1] = esalt_bufs[0].data_buf[1]; + data[2] = esalt_bufs[0].data_buf[2]; + data[3] = esalt_bufs[0].data_buf[3]; + + u32 tmp[4]; + + { + tmp[0] = data[0]; + tmp[1] = data[1]; + tmp[2] = data[2]; + tmp[3] = data[3]; + + aes256_decrypt_xts (ukey1, ukey2, tmp, tmp); + + if (((tmp[0] == 0x45555254) && (tmp[3] == 0)) || ((tmp[0] == 0x45555254) && ((tmp[1] >> 16) <= 5))) + { + mark_hash_s0 (plains_buf, hashes_shown, 0, gid, 0); + + d_return_buf[lid] = 1; + } + } + + { + tmp[0] = data[0]; + tmp[1] = data[1]; + tmp[2] = data[2]; + tmp[3] = data[3]; + + serpent256_decrypt_xts (ukey1, ukey2, tmp, tmp); + + if (((tmp[0] == 0x45555254) && (tmp[3] == 0)) || ((tmp[0] == 0x45555254) && ((tmp[1] >> 16) <= 5))) + { + mark_hash_s0 (plains_buf, hashes_shown, 0, gid, 0); + + d_return_buf[lid] = 1; + } + } + + { + tmp[0] = data[0]; + tmp[1] = data[1]; + tmp[2] = data[2]; + tmp[3] = data[3]; + + twofish256_decrypt_xts (ukey1, ukey2, tmp, tmp); + + if (((tmp[0] == 0x45555254) && (tmp[3] == 0)) || ((tmp[0] == 0x45555254) && ((tmp[1] >> 16) <= 5))) + { + mark_hash_s0 (plains_buf, hashes_shown, 0, gid, 0); + + d_return_buf[lid] = 1; + } + } + + u32 ukey3[8]; + + ukey3[0] = swap_workaround (h32_from_64 (tmps[gid].out[ 8])); + ukey3[1] = swap_workaround (l32_from_64 (tmps[gid].out[ 8])); + ukey3[2] = swap_workaround (h32_from_64 (tmps[gid].out[ 9])); + ukey3[3] = swap_workaround (l32_from_64 (tmps[gid].out[ 9])); + ukey3[4] = swap_workaround (h32_from_64 (tmps[gid].out[10])); + ukey3[5] = swap_workaround (l32_from_64 (tmps[gid].out[10])); + ukey3[6] = swap_workaround (h32_from_64 (tmps[gid].out[11])); + ukey3[7] = swap_workaround (l32_from_64 (tmps[gid].out[11])); + + u32 ukey4[8]; + + ukey4[0] = swap_workaround (h32_from_64 (tmps[gid].out[12])); + ukey4[1] = swap_workaround (l32_from_64 (tmps[gid].out[12])); + ukey4[2] = swap_workaround (h32_from_64 (tmps[gid].out[13])); + ukey4[3] = swap_workaround (l32_from_64 (tmps[gid].out[13])); + ukey4[4] = swap_workaround (h32_from_64 (tmps[gid].out[14])); + ukey4[5] = swap_workaround (l32_from_64 (tmps[gid].out[14])); + ukey4[6] = swap_workaround (h32_from_64 (tmps[gid].out[15])); + ukey4[7] = swap_workaround (l32_from_64 (tmps[gid].out[15])); + + { + tmp[0] = data[0]; + tmp[1] = data[1]; + tmp[2] = data[2]; + tmp[3] = data[3]; + + aes256_decrypt_xts (ukey2, ukey4, tmp, tmp); + twofish256_decrypt_xts (ukey1, ukey3, tmp, tmp); + + if (((tmp[0] == 0x45555254) && (tmp[3] == 0)) || ((tmp[0] == 0x45555254) && ((tmp[1] >> 16) <= 5))) + { + mark_hash_s0 (plains_buf, hashes_shown, 0, gid, 0); + + d_return_buf[lid] = 1; + } + } + + { + tmp[0] = data[0]; + tmp[1] = data[1]; + tmp[2] = data[2]; + tmp[3] = data[3]; + + serpent256_decrypt_xts (ukey2, ukey4, tmp, tmp); + aes256_decrypt_xts (ukey1, ukey3, tmp, tmp); + + if (((tmp[0] == 0x45555254) && (tmp[3] == 0)) || ((tmp[0] == 0x45555254) && ((tmp[1] >> 16) <= 5))) + { + mark_hash_s0 (plains_buf, hashes_shown, 0, gid, 0); + + d_return_buf[lid] = 1; + } + } + + { + tmp[0] = data[0]; + tmp[1] = data[1]; + tmp[2] = data[2]; + tmp[3] = data[3]; + + twofish256_decrypt_xts (ukey2, ukey4, tmp, tmp); + serpent256_decrypt_xts (ukey1, ukey3, tmp, tmp); + + if (((tmp[0] == 0x45555254) && (tmp[3] == 0)) || ((tmp[0] == 0x45555254) && ((tmp[1] >> 16) <= 5))) + { + mark_hash_s0 (plains_buf, hashes_shown, 0, gid, 0); + + d_return_buf[lid] = 1; + } + } +} + diff --git a/amd/m06223.cl b/amd/m06223.cl new file mode 100644 index 0000000000..91ff4e1c65 --- /dev/null +++ b/amd/m06223.cl @@ -0,0 +1,758 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _SHA512_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW4 +#define VECT_SIZE1 +#endif + +#ifdef VLIW5 +#define VECT_SIZE1 +#endif + +#define DGST_R0 0 +#define DGST_R1 1 +#define DGST_R2 2 +#define DGST_R3 3 + +#include "include/kernel_functions.c" +#include "types_amd.c" +#include "common_amd.c" + +#include "gpu_aes256_amd.c" +#include "gpu_twofish256_amd.c" +#include "gpu_serpent256_amd.c" + +__constant u64 k_sha512[80] = +{ + SHA512C00, SHA512C01, SHA512C02, SHA512C03, + SHA512C04, SHA512C05, SHA512C06, SHA512C07, + SHA512C08, SHA512C09, SHA512C0a, SHA512C0b, + SHA512C0c, SHA512C0d, SHA512C0e, SHA512C0f, + SHA512C10, SHA512C11, SHA512C12, SHA512C13, + SHA512C14, SHA512C15, SHA512C16, SHA512C17, + SHA512C18, SHA512C19, SHA512C1a, SHA512C1b, + SHA512C1c, SHA512C1d, SHA512C1e, SHA512C1f, + SHA512C20, SHA512C21, SHA512C22, SHA512C23, + SHA512C24, SHA512C25, SHA512C26, SHA512C27, + SHA512C28, SHA512C29, SHA512C2a, SHA512C2b, + SHA512C2c, SHA512C2d, SHA512C2e, SHA512C2f, + SHA512C30, SHA512C31, SHA512C32, SHA512C33, + SHA512C34, SHA512C35, SHA512C36, SHA512C37, + SHA512C38, SHA512C39, SHA512C3a, SHA512C3b, + SHA512C3c, SHA512C3d, SHA512C3e, SHA512C3f, + SHA512C40, SHA512C41, SHA512C42, SHA512C43, + SHA512C44, SHA512C45, SHA512C46, SHA512C47, + SHA512C48, SHA512C49, SHA512C4a, SHA512C4b, + SHA512C4c, SHA512C4d, SHA512C4e, SHA512C4f, +}; + +static void sha512_transform (const u64 w[16], u64 dgst[8]) +{ + u64 a = dgst[0]; + u64 b = dgst[1]; + u64 c = dgst[2]; + u64 d = dgst[3]; + u64 e = dgst[4]; + u64 f = dgst[5]; + u64 g = dgst[6]; + u64 h = dgst[7]; + + u64 w0_t = w[ 0]; + u64 w1_t = w[ 1]; + u64 w2_t = w[ 2]; + u64 w3_t = w[ 3]; + u64 w4_t = w[ 4]; + u64 w5_t = w[ 5]; + u64 w6_t = w[ 6]; + u64 w7_t = w[ 7]; + u64 w8_t = w[ 8]; + u64 w9_t = w[ 9]; + u64 wa_t = w[10]; + u64 wb_t = w[11]; + u64 wc_t = w[12]; + u64 wd_t = w[13]; + u64 we_t = w[14]; + u64 wf_t = w[15]; + + #define ROUND_EXPAND() \ + { \ + w0_t = SHA512_EXPAND (we_t, w9_t, w1_t, w0_t); \ + w1_t = SHA512_EXPAND (wf_t, wa_t, w2_t, w1_t); \ + w2_t = SHA512_EXPAND (w0_t, wb_t, w3_t, w2_t); \ + w3_t = SHA512_EXPAND (w1_t, wc_t, w4_t, w3_t); \ + w4_t = SHA512_EXPAND (w2_t, wd_t, w5_t, w4_t); \ + w5_t = SHA512_EXPAND (w3_t, we_t, w6_t, w5_t); \ + w6_t = SHA512_EXPAND (w4_t, wf_t, w7_t, w6_t); \ + w7_t = SHA512_EXPAND (w5_t, w0_t, w8_t, w7_t); \ + w8_t = SHA512_EXPAND (w6_t, w1_t, w9_t, w8_t); \ + w9_t = SHA512_EXPAND (w7_t, w2_t, wa_t, w9_t); \ + wa_t = SHA512_EXPAND (w8_t, w3_t, wb_t, wa_t); \ + wb_t = SHA512_EXPAND (w9_t, w4_t, wc_t, wb_t); \ + wc_t = SHA512_EXPAND (wa_t, w5_t, wd_t, wc_t); \ + wd_t = SHA512_EXPAND (wb_t, w6_t, we_t, wd_t); \ + we_t = SHA512_EXPAND (wc_t, w7_t, wf_t, we_t); \ + wf_t = SHA512_EXPAND (wd_t, w8_t, w0_t, wf_t); \ + } + + #define ROUND_STEP(i) \ + { \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, a, b, c, d, e, f, g, h, w0_t, k_sha512[i + 0]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, h, a, b, c, d, e, f, g, w1_t, k_sha512[i + 1]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, g, h, a, b, c, d, e, f, w2_t, k_sha512[i + 2]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, f, g, h, a, b, c, d, e, w3_t, k_sha512[i + 3]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, e, f, g, h, a, b, c, d, w4_t, k_sha512[i + 4]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, d, e, f, g, h, a, b, c, w5_t, k_sha512[i + 5]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, c, d, e, f, g, h, a, b, w6_t, k_sha512[i + 6]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, b, c, d, e, f, g, h, a, w7_t, k_sha512[i + 7]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, a, b, c, d, e, f, g, h, w8_t, k_sha512[i + 8]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, h, a, b, c, d, e, f, g, w9_t, k_sha512[i + 9]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, g, h, a, b, c, d, e, f, wa_t, k_sha512[i + 10]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, f, g, h, a, b, c, d, e, wb_t, k_sha512[i + 11]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, e, f, g, h, a, b, c, d, wc_t, k_sha512[i + 12]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, d, e, f, g, h, a, b, c, wd_t, k_sha512[i + 13]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, c, d, e, f, g, h, a, b, we_t, k_sha512[i + 14]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, b, c, d, e, f, g, h, a, wf_t, k_sha512[i + 15]); \ + } + + ROUND_STEP (0); + + //#pragma unroll + for (int i = 16; i < 80; i += 16) + { + ROUND_EXPAND (); ROUND_STEP (i); + } + + dgst[0] += a; + dgst[1] += b; + dgst[2] += c; + dgst[3] += d; + dgst[4] += e; + dgst[5] += f; + dgst[6] += g; + dgst[7] += h; +} + +static void hmac_run (const u64 w1[16], const u64 ipad[8], const u64 opad[8], u64 dgst[8]) +{ + dgst[0] = ipad[0]; + dgst[1] = ipad[1]; + dgst[2] = ipad[2]; + dgst[3] = ipad[3]; + dgst[4] = ipad[4]; + dgst[5] = ipad[5]; + dgst[6] = ipad[6]; + dgst[7] = ipad[7]; + + sha512_transform (w1, dgst); + + u64 w[16]; + + w[ 0] = dgst[0]; + w[ 1] = dgst[1]; + w[ 2] = dgst[2]; + w[ 3] = dgst[3]; + w[ 4] = dgst[4]; + w[ 5] = dgst[5]; + w[ 6] = dgst[6]; + w[ 7] = dgst[7]; + w[ 8] = 0x8000000000000000; + w[ 9] = 0; + w[10] = 0; + w[11] = 0; + w[12] = 0; + w[13] = 0; + w[14] = 0; + w[15] = (128 + 64) * 8; + + dgst[0] = opad[0]; + dgst[1] = opad[1]; + dgst[2] = opad[2]; + dgst[3] = opad[3]; + dgst[4] = opad[4]; + dgst[5] = opad[5]; + dgst[6] = opad[6]; + dgst[7] = opad[7]; + + sha512_transform (w, dgst); +} + +static void hmac_init (u64 w[16], u64 ipad[8], u64 opad[8]) +{ + w[ 0] ^= 0x3636363636363636; + w[ 1] ^= 0x3636363636363636; + w[ 2] ^= 0x3636363636363636; + w[ 3] ^= 0x3636363636363636; + w[ 4] ^= 0x3636363636363636; + w[ 5] ^= 0x3636363636363636; + w[ 6] ^= 0x3636363636363636; + w[ 7] ^= 0x3636363636363636; + w[ 8] ^= 0x3636363636363636; + w[ 9] ^= 0x3636363636363636; + w[10] ^= 0x3636363636363636; + w[11] ^= 0x3636363636363636; + w[12] ^= 0x3636363636363636; + w[13] ^= 0x3636363636363636; + w[14] ^= 0x3636363636363636; + w[15] ^= 0x3636363636363636; + + ipad[0] = SHA512M_A; + ipad[1] = SHA512M_B; + ipad[2] = SHA512M_C; + ipad[3] = SHA512M_D; + ipad[4] = SHA512M_E; + ipad[5] = SHA512M_F; + ipad[6] = SHA512M_G; + ipad[7] = SHA512M_H; + + sha512_transform (w, ipad); + + w[ 0] ^= 0x6a6a6a6a6a6a6a6a; + w[ 1] ^= 0x6a6a6a6a6a6a6a6a; + w[ 2] ^= 0x6a6a6a6a6a6a6a6a; + w[ 3] ^= 0x6a6a6a6a6a6a6a6a; + w[ 4] ^= 0x6a6a6a6a6a6a6a6a; + w[ 5] ^= 0x6a6a6a6a6a6a6a6a; + w[ 6] ^= 0x6a6a6a6a6a6a6a6a; + w[ 7] ^= 0x6a6a6a6a6a6a6a6a; + w[ 8] ^= 0x6a6a6a6a6a6a6a6a; + w[ 9] ^= 0x6a6a6a6a6a6a6a6a; + w[10] ^= 0x6a6a6a6a6a6a6a6a; + w[11] ^= 0x6a6a6a6a6a6a6a6a; + w[12] ^= 0x6a6a6a6a6a6a6a6a; + w[13] ^= 0x6a6a6a6a6a6a6a6a; + w[14] ^= 0x6a6a6a6a6a6a6a6a; + w[15] ^= 0x6a6a6a6a6a6a6a6a; + + opad[0] = SHA512M_A; + opad[1] = SHA512M_B; + opad[2] = SHA512M_C; + opad[3] = SHA512M_D; + opad[4] = SHA512M_E; + opad[5] = SHA512M_F; + opad[6] = SHA512M_G; + opad[7] = SHA512M_H; + + sha512_transform (w, opad); +} + +static u32 u8add (const u32 a, const u32 b) +{ + const u32 a1 = (a >> 0) & 0xff; + const u32 a2 = (a >> 8) & 0xff; + const u32 a3 = (a >> 16) & 0xff; + const u32 a4 = (a >> 24) & 0xff; + + const u32 b1 = (b >> 0) & 0xff; + const u32 b2 = (b >> 8) & 0xff; + const u32 b3 = (b >> 16) & 0xff; + const u32 b4 = (b >> 24) & 0xff; + + const u32 r1 = (a1 + b1) & 0xff; + const u32 r2 = (a2 + b2) & 0xff; + const u32 r3 = (a3 + b3) & 0xff; + const u32 r4 = (a4 + b4) & 0xff; + + const u32 r = r1 << 0 + | r2 << 8 + | r3 << 16 + | r4 << 24; + + return r; +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m06223_init (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global tc64_tmp_t *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global tc_t *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = pws[gid].i[ 8]; + w2[1] = pws[gid].i[ 9]; + w2[2] = pws[gid].i[10]; + w2[3] = pws[gid].i[11]; + + u32x w3[4]; + + w3[0] = pws[gid].i[12]; + w3[1] = pws[gid].i[13]; + w3[2] = pws[gid].i[14]; + w3[3] = pws[gid].i[15]; + + /** + * keyfile + */ + + w0[0] = u8add (w0[0], esalt_bufs[salt_pos].keyfile_buf[ 0]); + w0[1] = u8add (w0[1], esalt_bufs[salt_pos].keyfile_buf[ 1]); + w0[2] = u8add (w0[2], esalt_bufs[salt_pos].keyfile_buf[ 2]); + w0[3] = u8add (w0[3], esalt_bufs[salt_pos].keyfile_buf[ 3]); + w1[0] = u8add (w1[0], esalt_bufs[salt_pos].keyfile_buf[ 4]); + w1[1] = u8add (w1[1], esalt_bufs[salt_pos].keyfile_buf[ 5]); + w1[2] = u8add (w1[2], esalt_bufs[salt_pos].keyfile_buf[ 6]); + w1[3] = u8add (w1[3], esalt_bufs[salt_pos].keyfile_buf[ 7]); + w2[0] = u8add (w2[0], esalt_bufs[salt_pos].keyfile_buf[ 8]); + w2[1] = u8add (w2[1], esalt_bufs[salt_pos].keyfile_buf[ 9]); + w2[2] = u8add (w2[2], esalt_bufs[salt_pos].keyfile_buf[10]); + w2[3] = u8add (w2[3], esalt_bufs[salt_pos].keyfile_buf[11]); + w3[0] = u8add (w3[0], esalt_bufs[salt_pos].keyfile_buf[12]); + w3[1] = u8add (w3[1], esalt_bufs[salt_pos].keyfile_buf[13]); + w3[2] = u8add (w3[2], esalt_bufs[salt_pos].keyfile_buf[14]); + w3[3] = u8add (w3[3], esalt_bufs[salt_pos].keyfile_buf[15]); + + /** + * salt + */ + + u64 salt_buf[16]; + + // swap fehlt + + salt_buf[ 0] = ((u64) swap_workaround (esalt_bufs[salt_pos].salt_buf[ 0])) << 32 | (u64) swap_workaround (esalt_bufs[salt_pos].salt_buf[ 1]); + salt_buf[ 1] = ((u64) swap_workaround (esalt_bufs[salt_pos].salt_buf[ 2])) << 32 | (u64) swap_workaround (esalt_bufs[salt_pos].salt_buf[ 3]); + salt_buf[ 2] = ((u64) swap_workaround (esalt_bufs[salt_pos].salt_buf[ 4])) << 32 | (u64) swap_workaround (esalt_bufs[salt_pos].salt_buf[ 5]); + salt_buf[ 3] = ((u64) swap_workaround (esalt_bufs[salt_pos].salt_buf[ 6])) << 32 | (u64) swap_workaround (esalt_bufs[salt_pos].salt_buf[ 7]); + salt_buf[ 4] = ((u64) swap_workaround (esalt_bufs[salt_pos].salt_buf[ 8])) << 32 | (u64) swap_workaround (esalt_bufs[salt_pos].salt_buf[ 9]); + salt_buf[ 5] = ((u64) swap_workaround (esalt_bufs[salt_pos].salt_buf[10])) << 32 | (u64) swap_workaround (esalt_bufs[salt_pos].salt_buf[11]); + salt_buf[ 6] = ((u64) swap_workaround (esalt_bufs[salt_pos].salt_buf[12])) << 32 | (u64) swap_workaround (esalt_bufs[salt_pos].salt_buf[13]); + salt_buf[ 7] = ((u64) swap_workaround (esalt_bufs[salt_pos].salt_buf[14])) << 32 | (u64) swap_workaround (esalt_bufs[salt_pos].salt_buf[15]); + salt_buf[ 8] = 0; + salt_buf[ 9] = 0; + salt_buf[10] = 0; + salt_buf[11] = 0; + salt_buf[12] = 0; + salt_buf[13] = 0; + salt_buf[14] = 0; + salt_buf[15] = (128 + 64 + 4) * 8; + + const u32 truecrypt_mdlen = salt_bufs[0].truecrypt_mdlen; + + u64 w[16]; + + w[ 0] = ((u64) swap_workaround (w0[0])) << 32 | (u64) swap_workaround (w0[1]); + w[ 1] = ((u64) swap_workaround (w0[2])) << 32 | (u64) swap_workaround (w0[3]); + w[ 2] = ((u64) swap_workaround (w1[0])) << 32 | (u64) swap_workaround (w1[1]); + w[ 3] = ((u64) swap_workaround (w1[2])) << 32 | (u64) swap_workaround (w1[3]); + w[ 4] = ((u64) swap_workaround (w2[0])) << 32 | (u64) swap_workaround (w2[1]); + w[ 5] = ((u64) swap_workaround (w2[2])) << 32 | (u64) swap_workaround (w2[3]); + w[ 6] = ((u64) swap_workaround (w3[0])) << 32 | (u64) swap_workaround (w3[1]); + w[ 7] = ((u64) swap_workaround (w3[2])) << 32 | (u64) swap_workaround (w3[3]); + w[ 8] = 0; + w[ 9] = 0; + w[10] = 0; + w[11] = 0; + w[12] = 0; + w[13] = 0; + w[14] = 0; + w[15] = 0; + + u64 ipad[8]; + u64 opad[8]; + + hmac_init (w, ipad, opad); + + tmps[gid].ipad[0] = ipad[0]; + tmps[gid].ipad[1] = ipad[1]; + tmps[gid].ipad[2] = ipad[2]; + tmps[gid].ipad[3] = ipad[3]; + tmps[gid].ipad[4] = ipad[4]; + tmps[gid].ipad[5] = ipad[5]; + tmps[gid].ipad[6] = ipad[6]; + tmps[gid].ipad[7] = ipad[7]; + + tmps[gid].opad[0] = opad[0]; + tmps[gid].opad[1] = opad[1]; + tmps[gid].opad[2] = opad[2]; + tmps[gid].opad[3] = opad[3]; + tmps[gid].opad[4] = opad[4]; + tmps[gid].opad[5] = opad[5]; + tmps[gid].opad[6] = opad[6]; + tmps[gid].opad[7] = opad[7]; + + for (u32 i = 0, j = 1; i < (truecrypt_mdlen / 8 / 8); i += 8, j += 1) + { + salt_buf[8] = (u64) j << 32 | (u64) 0x80000000; + + u64 dgst[8]; + + hmac_run (salt_buf, ipad, opad, dgst); + + tmps[gid].dgst[i + 0] = dgst[0]; + tmps[gid].dgst[i + 1] = dgst[1]; + tmps[gid].dgst[i + 2] = dgst[2]; + tmps[gid].dgst[i + 3] = dgst[3]; + tmps[gid].dgst[i + 4] = dgst[4]; + tmps[gid].dgst[i + 5] = dgst[5]; + tmps[gid].dgst[i + 6] = dgst[6]; + tmps[gid].dgst[i + 7] = dgst[7]; + + tmps[gid].out[i + 0] = dgst[0]; + tmps[gid].out[i + 1] = dgst[1]; + tmps[gid].out[i + 2] = dgst[2]; + tmps[gid].out[i + 3] = dgst[3]; + tmps[gid].out[i + 4] = dgst[4]; + tmps[gid].out[i + 5] = dgst[5]; + tmps[gid].out[i + 6] = dgst[6]; + tmps[gid].out[i + 7] = dgst[7]; + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m06223_loop (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global tc64_tmp_t *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global tc_t *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + const u32 truecrypt_mdlen = salt_bufs[0].truecrypt_mdlen; + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u64 ipad[8]; + + ipad[0] = tmps[gid].ipad[0]; + ipad[1] = tmps[gid].ipad[1]; + ipad[2] = tmps[gid].ipad[2]; + ipad[3] = tmps[gid].ipad[3]; + ipad[4] = tmps[gid].ipad[4]; + ipad[5] = tmps[gid].ipad[5]; + ipad[6] = tmps[gid].ipad[6]; + ipad[7] = tmps[gid].ipad[7]; + + u64 opad[8]; + + opad[0] = tmps[gid].opad[0]; + opad[1] = tmps[gid].opad[1]; + opad[2] = tmps[gid].opad[2]; + opad[3] = tmps[gid].opad[3]; + opad[4] = tmps[gid].opad[4]; + opad[5] = tmps[gid].opad[5]; + opad[6] = tmps[gid].opad[6]; + opad[7] = tmps[gid].opad[7]; + + for (u32 i = 0; i < (truecrypt_mdlen / 8 / 8); i += 8) + { + u64 dgst[8]; + + dgst[0] = tmps[gid].dgst[i + 0]; + dgst[1] = tmps[gid].dgst[i + 1]; + dgst[2] = tmps[gid].dgst[i + 2]; + dgst[3] = tmps[gid].dgst[i + 3]; + dgst[4] = tmps[gid].dgst[i + 4]; + dgst[5] = tmps[gid].dgst[i + 5]; + dgst[6] = tmps[gid].dgst[i + 6]; + dgst[7] = tmps[gid].dgst[i + 7]; + + u64 out[8]; + + out[0] = tmps[gid].out[i + 0]; + out[1] = tmps[gid].out[i + 1]; + out[2] = tmps[gid].out[i + 2]; + out[3] = tmps[gid].out[i + 3]; + out[4] = tmps[gid].out[i + 4]; + out[5] = tmps[gid].out[i + 5]; + out[6] = tmps[gid].out[i + 6]; + out[7] = tmps[gid].out[i + 7]; + + for (u32 j = 0; j < loop_cnt; j++) + { + u64 w[16]; + + w[ 0] = dgst[0]; + w[ 1] = dgst[1]; + w[ 2] = dgst[2]; + w[ 3] = dgst[3]; + w[ 4] = dgst[4]; + w[ 5] = dgst[5]; + w[ 6] = dgst[6]; + w[ 7] = dgst[7]; + w[ 8] = 0x8000000000000000; + w[ 9] = 0; + w[10] = 0; + w[11] = 0; + w[12] = 0; + w[13] = 0; + w[14] = 0; + w[15] = (128 + 64) * 8; + + hmac_run (w, ipad, opad, dgst); + + out[0] ^= dgst[0]; + out[1] ^= dgst[1]; + out[2] ^= dgst[2]; + out[3] ^= dgst[3]; + out[4] ^= dgst[4]; + out[5] ^= dgst[5]; + out[6] ^= dgst[6]; + out[7] ^= dgst[7]; + } + + tmps[gid].dgst[i + 0] = dgst[0]; + tmps[gid].dgst[i + 1] = dgst[1]; + tmps[gid].dgst[i + 2] = dgst[2]; + tmps[gid].dgst[i + 3] = dgst[3]; + tmps[gid].dgst[i + 4] = dgst[4]; + tmps[gid].dgst[i + 5] = dgst[5]; + tmps[gid].dgst[i + 6] = dgst[6]; + tmps[gid].dgst[i + 7] = dgst[7]; + + tmps[gid].out[i + 0] = out[0]; + tmps[gid].out[i + 1] = out[1]; + tmps[gid].out[i + 2] = out[2]; + tmps[gid].out[i + 3] = out[3]; + tmps[gid].out[i + 4] = out[4]; + tmps[gid].out[i + 5] = out[5]; + tmps[gid].out[i + 6] = out[6]; + tmps[gid].out[i + 7] = out[7]; + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m06223_comp (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global tc64_tmp_t *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global tc_t *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + const u32 lid = get_local_id (0); + + if (gid >= gid_max) return; + + u32 ukey1[8]; + + ukey1[0] = swap_workaround (h32_from_64 (tmps[gid].out[ 0])); + ukey1[1] = swap_workaround (l32_from_64 (tmps[gid].out[ 0])); + ukey1[2] = swap_workaround (h32_from_64 (tmps[gid].out[ 1])); + ukey1[3] = swap_workaround (l32_from_64 (tmps[gid].out[ 1])); + ukey1[4] = swap_workaround (h32_from_64 (tmps[gid].out[ 2])); + ukey1[5] = swap_workaround (l32_from_64 (tmps[gid].out[ 2])); + ukey1[6] = swap_workaround (h32_from_64 (tmps[gid].out[ 3])); + ukey1[7] = swap_workaround (l32_from_64 (tmps[gid].out[ 3])); + + u32 ukey2[8]; + + ukey2[0] = swap_workaround (h32_from_64 (tmps[gid].out[ 4])); + ukey2[1] = swap_workaround (l32_from_64 (tmps[gid].out[ 4])); + ukey2[2] = swap_workaround (h32_from_64 (tmps[gid].out[ 5])); + ukey2[3] = swap_workaround (l32_from_64 (tmps[gid].out[ 5])); + ukey2[4] = swap_workaround (h32_from_64 (tmps[gid].out[ 6])); + ukey2[5] = swap_workaround (l32_from_64 (tmps[gid].out[ 6])); + ukey2[6] = swap_workaround (h32_from_64 (tmps[gid].out[ 7])); + ukey2[7] = swap_workaround (l32_from_64 (tmps[gid].out[ 7])); + + u32 data[4]; + + data[0] = esalt_bufs[0].data_buf[0]; + data[1] = esalt_bufs[0].data_buf[1]; + data[2] = esalt_bufs[0].data_buf[2]; + data[3] = esalt_bufs[0].data_buf[3]; + + u32 tmp[4]; + + { + tmp[0] = data[0]; + tmp[1] = data[1]; + tmp[2] = data[2]; + tmp[3] = data[3]; + + aes256_decrypt_xts (ukey1, ukey2, tmp, tmp); + + if (((tmp[0] == 0x45555254) && (tmp[3] == 0)) || ((tmp[0] == 0x45555254) && ((tmp[1] >> 16) <= 5))) + { + mark_hash_s0 (plains_buf, hashes_shown, 0, gid, 0); + + d_return_buf[lid] = 1; + } + } + + { + tmp[0] = data[0]; + tmp[1] = data[1]; + tmp[2] = data[2]; + tmp[3] = data[3]; + + serpent256_decrypt_xts (ukey1, ukey2, tmp, tmp); + + if (((tmp[0] == 0x45555254) && (tmp[3] == 0)) || ((tmp[0] == 0x45555254) && ((tmp[1] >> 16) <= 5))) + { + mark_hash_s0 (plains_buf, hashes_shown, 0, gid, 0); + + d_return_buf[lid] = 1; + } + } + + { + tmp[0] = data[0]; + tmp[1] = data[1]; + tmp[2] = data[2]; + tmp[3] = data[3]; + + twofish256_decrypt_xts (ukey1, ukey2, tmp, tmp); + + if (((tmp[0] == 0x45555254) && (tmp[3] == 0)) || ((tmp[0] == 0x45555254) && ((tmp[1] >> 16) <= 5))) + { + mark_hash_s0 (plains_buf, hashes_shown, 0, gid, 0); + + d_return_buf[lid] = 1; + } + } + + u32 ukey3[8]; + + ukey3[0] = swap_workaround (h32_from_64 (tmps[gid].out[ 8])); + ukey3[1] = swap_workaround (l32_from_64 (tmps[gid].out[ 8])); + ukey3[2] = swap_workaround (h32_from_64 (tmps[gid].out[ 9])); + ukey3[3] = swap_workaround (l32_from_64 (tmps[gid].out[ 9])); + ukey3[4] = swap_workaround (h32_from_64 (tmps[gid].out[10])); + ukey3[5] = swap_workaround (l32_from_64 (tmps[gid].out[10])); + ukey3[6] = swap_workaround (h32_from_64 (tmps[gid].out[11])); + ukey3[7] = swap_workaround (l32_from_64 (tmps[gid].out[11])); + + u32 ukey4[8]; + + ukey4[0] = swap_workaround (h32_from_64 (tmps[gid].out[12])); + ukey4[1] = swap_workaround (l32_from_64 (tmps[gid].out[12])); + ukey4[2] = swap_workaround (h32_from_64 (tmps[gid].out[13])); + ukey4[3] = swap_workaround (l32_from_64 (tmps[gid].out[13])); + ukey4[4] = swap_workaround (h32_from_64 (tmps[gid].out[14])); + ukey4[5] = swap_workaround (l32_from_64 (tmps[gid].out[14])); + ukey4[6] = swap_workaround (h32_from_64 (tmps[gid].out[15])); + ukey4[7] = swap_workaround (l32_from_64 (tmps[gid].out[15])); + + { + tmp[0] = data[0]; + tmp[1] = data[1]; + tmp[2] = data[2]; + tmp[3] = data[3]; + + aes256_decrypt_xts (ukey2, ukey4, tmp, tmp); + twofish256_decrypt_xts (ukey1, ukey3, tmp, tmp); + + if (((tmp[0] == 0x45555254) && (tmp[3] == 0)) || ((tmp[0] == 0x45555254) && ((tmp[1] >> 16) <= 5))) + { + mark_hash_s0 (plains_buf, hashes_shown, 0, gid, 0); + + d_return_buf[lid] = 1; + } + } + + { + tmp[0] = data[0]; + tmp[1] = data[1]; + tmp[2] = data[2]; + tmp[3] = data[3]; + + serpent256_decrypt_xts (ukey2, ukey4, tmp, tmp); + aes256_decrypt_xts (ukey1, ukey3, tmp, tmp); + + if (((tmp[0] == 0x45555254) && (tmp[3] == 0)) || ((tmp[0] == 0x45555254) && ((tmp[1] >> 16) <= 5))) + { + mark_hash_s0 (plains_buf, hashes_shown, 0, gid, 0); + + d_return_buf[lid] = 1; + } + } + + { + tmp[0] = data[0]; + tmp[1] = data[1]; + tmp[2] = data[2]; + tmp[3] = data[3]; + + twofish256_decrypt_xts (ukey2, ukey4, tmp, tmp); + serpent256_decrypt_xts (ukey1, ukey3, tmp, tmp); + + if (((tmp[0] == 0x45555254) && (tmp[3] == 0)) || ((tmp[0] == 0x45555254) && ((tmp[1] >> 16) <= 5))) + { + mark_hash_s0 (plains_buf, hashes_shown, 0, gid, 0); + + d_return_buf[lid] = 1; + } + } + + u32 ukey5[8]; + + ukey5[0] = swap_workaround (h32_from_64 (tmps[gid].out[16])); + ukey5[1] = swap_workaround (l32_from_64 (tmps[gid].out[16])); + ukey5[2] = swap_workaround (h32_from_64 (tmps[gid].out[17])); + ukey5[3] = swap_workaround (l32_from_64 (tmps[gid].out[17])); + ukey5[4] = swap_workaround (h32_from_64 (tmps[gid].out[18])); + ukey5[5] = swap_workaround (l32_from_64 (tmps[gid].out[18])); + ukey5[6] = swap_workaround (h32_from_64 (tmps[gid].out[19])); + ukey5[7] = swap_workaround (l32_from_64 (tmps[gid].out[19])); + + u32 ukey6[8]; + + ukey6[0] = swap_workaround (h32_from_64 (tmps[gid].out[20])); + ukey6[1] = swap_workaround (l32_from_64 (tmps[gid].out[20])); + ukey6[2] = swap_workaround (h32_from_64 (tmps[gid].out[21])); + ukey6[3] = swap_workaround (l32_from_64 (tmps[gid].out[21])); + ukey6[4] = swap_workaround (h32_from_64 (tmps[gid].out[22])); + ukey6[5] = swap_workaround (l32_from_64 (tmps[gid].out[22])); + ukey6[6] = swap_workaround (h32_from_64 (tmps[gid].out[23])); + ukey6[7] = swap_workaround (l32_from_64 (tmps[gid].out[23])); + + { + tmp[0] = data[0]; + tmp[1] = data[1]; + tmp[2] = data[2]; + tmp[3] = data[3]; + + aes256_decrypt_xts (ukey3, ukey6, tmp, tmp); + twofish256_decrypt_xts (ukey2, ukey5, tmp, tmp); + serpent256_decrypt_xts (ukey1, ukey4, tmp, tmp); + + if (((tmp[0] == 0x45555254) && (tmp[3] == 0)) || ((tmp[0] == 0x45555254) && ((tmp[1] >> 16) <= 5))) + { + mark_hash_s0 (plains_buf, hashes_shown, 0, gid, 0); + + d_return_buf[lid] = 1; + } + } + + { + tmp[0] = data[0]; + tmp[1] = data[1]; + tmp[2] = data[2]; + tmp[3] = data[3]; + + serpent256_decrypt_xts (ukey3, ukey6, tmp, tmp); + twofish256_decrypt_xts (ukey2, ukey5, tmp, tmp); + aes256_decrypt_xts (ukey1, ukey4, tmp, tmp); + + if (((tmp[0] == 0x45555254) && (tmp[3] == 0)) || ((tmp[0] == 0x45555254) && ((tmp[1] >> 16) <= 5))) + { + mark_hash_s0 (plains_buf, hashes_shown, 0, gid, 0); + + d_return_buf[lid] = 1; + } + } +} + diff --git a/amd/m06231.cl b/amd/m06231.cl new file mode 100644 index 0000000000..90f30f6495 --- /dev/null +++ b/amd/m06231.cl @@ -0,0 +1,2005 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _WHIRLPOOL_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW4 +#define VECT_SIZE1 +#endif + +#ifdef VLIW5 +#define VECT_SIZE1 +#endif + +#define DGST_R0 0 +#define DGST_R1 1 +#define DGST_R2 2 +#define DGST_R3 3 + +#include "include/kernel_functions.c" +#include "types_amd.c" +#include "common_amd.c" + +#include "gpu_aes256_amd.c" +#include "gpu_twofish256_amd.c" +#include "gpu_serpent256_amd.c" + +#define R 10 + +#define BOX(S,n,i) (u32) ((S)[(n)][(i)]) + +__constant u32 Ch[8][256] = +{ + { + 0x18186018, 0x23238c23, 0xc6c63fc6, 0xe8e887e8, + 0x87872687, 0xb8b8dab8, 0x01010401, 0x4f4f214f, + 0x3636d836, 0xa6a6a2a6, 0xd2d26fd2, 0xf5f5f3f5, + 0x7979f979, 0x6f6fa16f, 0x91917e91, 0x52525552, + 0x60609d60, 0xbcbccabc, 0x9b9b569b, 0x8e8e028e, + 0xa3a3b6a3, 0x0c0c300c, 0x7b7bf17b, 0x3535d435, + 0x1d1d741d, 0xe0e0a7e0, 0xd7d77bd7, 0xc2c22fc2, + 0x2e2eb82e, 0x4b4b314b, 0xfefedffe, 0x57574157, + 0x15155415, 0x7777c177, 0x3737dc37, 0xe5e5b3e5, + 0x9f9f469f, 0xf0f0e7f0, 0x4a4a354a, 0xdada4fda, + 0x58587d58, 0xc9c903c9, 0x2929a429, 0x0a0a280a, + 0xb1b1feb1, 0xa0a0baa0, 0x6b6bb16b, 0x85852e85, + 0xbdbdcebd, 0x5d5d695d, 0x10104010, 0xf4f4f7f4, + 0xcbcb0bcb, 0x3e3ef83e, 0x05051405, 0x67678167, + 0xe4e4b7e4, 0x27279c27, 0x41411941, 0x8b8b168b, + 0xa7a7a6a7, 0x7d7de97d, 0x95956e95, 0xd8d847d8, + 0xfbfbcbfb, 0xeeee9fee, 0x7c7ced7c, 0x66668566, + 0xdddd53dd, 0x17175c17, 0x47470147, 0x9e9e429e, + 0xcaca0fca, 0x2d2db42d, 0xbfbfc6bf, 0x07071c07, + 0xadad8ead, 0x5a5a755a, 0x83833683, 0x3333cc33, + 0x63639163, 0x02020802, 0xaaaa92aa, 0x7171d971, + 0xc8c807c8, 0x19196419, 0x49493949, 0xd9d943d9, + 0xf2f2eff2, 0xe3e3abe3, 0x5b5b715b, 0x88881a88, + 0x9a9a529a, 0x26269826, 0x3232c832, 0xb0b0fab0, + 0xe9e983e9, 0x0f0f3c0f, 0xd5d573d5, 0x80803a80, + 0xbebec2be, 0xcdcd13cd, 0x3434d034, 0x48483d48, + 0xffffdbff, 0x7a7af57a, 0x90907a90, 0x5f5f615f, + 0x20208020, 0x6868bd68, 0x1a1a681a, 0xaeae82ae, + 0xb4b4eab4, 0x54544d54, 0x93937693, 0x22228822, + 0x64648d64, 0xf1f1e3f1, 0x7373d173, 0x12124812, + 0x40401d40, 0x08082008, 0xc3c32bc3, 0xecec97ec, + 0xdbdb4bdb, 0xa1a1bea1, 0x8d8d0e8d, 0x3d3df43d, + 0x97976697, 0x00000000, 0xcfcf1bcf, 0x2b2bac2b, + 0x7676c576, 0x82823282, 0xd6d67fd6, 0x1b1b6c1b, + 0xb5b5eeb5, 0xafaf86af, 0x6a6ab56a, 0x50505d50, + 0x45450945, 0xf3f3ebf3, 0x3030c030, 0xefef9bef, + 0x3f3ffc3f, 0x55554955, 0xa2a2b2a2, 0xeaea8fea, + 0x65658965, 0xbabad2ba, 0x2f2fbc2f, 0xc0c027c0, + 0xdede5fde, 0x1c1c701c, 0xfdfdd3fd, 0x4d4d294d, + 0x92927292, 0x7575c975, 0x06061806, 0x8a8a128a, + 0xb2b2f2b2, 0xe6e6bfe6, 0x0e0e380e, 0x1f1f7c1f, + 0x62629562, 0xd4d477d4, 0xa8a89aa8, 0x96966296, + 0xf9f9c3f9, 0xc5c533c5, 0x25259425, 0x59597959, + 0x84842a84, 0x7272d572, 0x3939e439, 0x4c4c2d4c, + 0x5e5e655e, 0x7878fd78, 0x3838e038, 0x8c8c0a8c, + 0xd1d163d1, 0xa5a5aea5, 0xe2e2afe2, 0x61619961, + 0xb3b3f6b3, 0x21218421, 0x9c9c4a9c, 0x1e1e781e, + 0x43431143, 0xc7c73bc7, 0xfcfcd7fc, 0x04041004, + 0x51515951, 0x99995e99, 0x6d6da96d, 0x0d0d340d, + 0xfafacffa, 0xdfdf5bdf, 0x7e7ee57e, 0x24249024, + 0x3b3bec3b, 0xabab96ab, 0xcece1fce, 0x11114411, + 0x8f8f068f, 0x4e4e254e, 0xb7b7e6b7, 0xebeb8beb, + 0x3c3cf03c, 0x81813e81, 0x94946a94, 0xf7f7fbf7, + 0xb9b9deb9, 0x13134c13, 0x2c2cb02c, 0xd3d36bd3, + 0xe7e7bbe7, 0x6e6ea56e, 0xc4c437c4, 0x03030c03, + 0x56564556, 0x44440d44, 0x7f7fe17f, 0xa9a99ea9, + 0x2a2aa82a, 0xbbbbd6bb, 0xc1c123c1, 0x53535153, + 0xdcdc57dc, 0x0b0b2c0b, 0x9d9d4e9d, 0x6c6cad6c, + 0x3131c431, 0x7474cd74, 0xf6f6fff6, 0x46460546, + 0xacac8aac, 0x89891e89, 0x14145014, 0xe1e1a3e1, + 0x16165816, 0x3a3ae83a, 0x6969b969, 0x09092409, + 0x7070dd70, 0xb6b6e2b6, 0xd0d067d0, 0xeded93ed, + 0xcccc17cc, 0x42421542, 0x98985a98, 0xa4a4aaa4, + 0x2828a028, 0x5c5c6d5c, 0xf8f8c7f8, 0x86862286, + }, + { + 0xd8181860, 0x2623238c, 0xb8c6c63f, 0xfbe8e887, + 0xcb878726, 0x11b8b8da, 0x09010104, 0x0d4f4f21, + 0x9b3636d8, 0xffa6a6a2, 0x0cd2d26f, 0x0ef5f5f3, + 0x967979f9, 0x306f6fa1, 0x6d91917e, 0xf8525255, + 0x4760609d, 0x35bcbcca, 0x379b9b56, 0x8a8e8e02, + 0xd2a3a3b6, 0x6c0c0c30, 0x847b7bf1, 0x803535d4, + 0xf51d1d74, 0xb3e0e0a7, 0x21d7d77b, 0x9cc2c22f, + 0x432e2eb8, 0x294b4b31, 0x5dfefedf, 0xd5575741, + 0xbd151554, 0xe87777c1, 0x923737dc, 0x9ee5e5b3, + 0x139f9f46, 0x23f0f0e7, 0x204a4a35, 0x44dada4f, + 0xa258587d, 0xcfc9c903, 0x7c2929a4, 0x5a0a0a28, + 0x50b1b1fe, 0xc9a0a0ba, 0x146b6bb1, 0xd985852e, + 0x3cbdbdce, 0x8f5d5d69, 0x90101040, 0x07f4f4f7, + 0xddcbcb0b, 0xd33e3ef8, 0x2d050514, 0x78676781, + 0x97e4e4b7, 0x0227279c, 0x73414119, 0xa78b8b16, + 0xf6a7a7a6, 0xb27d7de9, 0x4995956e, 0x56d8d847, + 0x70fbfbcb, 0xcdeeee9f, 0xbb7c7ced, 0x71666685, + 0x7bdddd53, 0xaf17175c, 0x45474701, 0x1a9e9e42, + 0xd4caca0f, 0x582d2db4, 0x2ebfbfc6, 0x3f07071c, + 0xacadad8e, 0xb05a5a75, 0xef838336, 0xb63333cc, + 0x5c636391, 0x12020208, 0x93aaaa92, 0xde7171d9, + 0xc6c8c807, 0xd1191964, 0x3b494939, 0x5fd9d943, + 0x31f2f2ef, 0xa8e3e3ab, 0xb95b5b71, 0xbc88881a, + 0x3e9a9a52, 0x0b262698, 0xbf3232c8, 0x59b0b0fa, + 0xf2e9e983, 0x770f0f3c, 0x33d5d573, 0xf480803a, + 0x27bebec2, 0xebcdcd13, 0x893434d0, 0x3248483d, + 0x54ffffdb, 0x8d7a7af5, 0x6490907a, 0x9d5f5f61, + 0x3d202080, 0x0f6868bd, 0xca1a1a68, 0xb7aeae82, + 0x7db4b4ea, 0xce54544d, 0x7f939376, 0x2f222288, + 0x6364648d, 0x2af1f1e3, 0xcc7373d1, 0x82121248, + 0x7a40401d, 0x48080820, 0x95c3c32b, 0xdfecec97, + 0x4ddbdb4b, 0xc0a1a1be, 0x918d8d0e, 0xc83d3df4, + 0x5b979766, 0x00000000, 0xf9cfcf1b, 0x6e2b2bac, + 0xe17676c5, 0xe6828232, 0x28d6d67f, 0xc31b1b6c, + 0x74b5b5ee, 0xbeafaf86, 0x1d6a6ab5, 0xea50505d, + 0x57454509, 0x38f3f3eb, 0xad3030c0, 0xc4efef9b, + 0xda3f3ffc, 0xc7555549, 0xdba2a2b2, 0xe9eaea8f, + 0x6a656589, 0x03babad2, 0x4a2f2fbc, 0x8ec0c027, + 0x60dede5f, 0xfc1c1c70, 0x46fdfdd3, 0x1f4d4d29, + 0x76929272, 0xfa7575c9, 0x36060618, 0xae8a8a12, + 0x4bb2b2f2, 0x85e6e6bf, 0x7e0e0e38, 0xe71f1f7c, + 0x55626295, 0x3ad4d477, 0x81a8a89a, 0x52969662, + 0x62f9f9c3, 0xa3c5c533, 0x10252594, 0xab595979, + 0xd084842a, 0xc57272d5, 0xec3939e4, 0x164c4c2d, + 0x945e5e65, 0x9f7878fd, 0xe53838e0, 0x988c8c0a, + 0x17d1d163, 0xe4a5a5ae, 0xa1e2e2af, 0x4e616199, + 0x42b3b3f6, 0x34212184, 0x089c9c4a, 0xee1e1e78, + 0x61434311, 0xb1c7c73b, 0x4ffcfcd7, 0x24040410, + 0xe3515159, 0x2599995e, 0x226d6da9, 0x650d0d34, + 0x79fafacf, 0x69dfdf5b, 0xa97e7ee5, 0x19242490, + 0xfe3b3bec, 0x9aabab96, 0xf0cece1f, 0x99111144, + 0x838f8f06, 0x044e4e25, 0x66b7b7e6, 0xe0ebeb8b, + 0xc13c3cf0, 0xfd81813e, 0x4094946a, 0x1cf7f7fb, + 0x18b9b9de, 0x8b13134c, 0x512c2cb0, 0x05d3d36b, + 0x8ce7e7bb, 0x396e6ea5, 0xaac4c437, 0x1b03030c, + 0xdc565645, 0x5e44440d, 0xa07f7fe1, 0x88a9a99e, + 0x672a2aa8, 0x0abbbbd6, 0x87c1c123, 0xf1535351, + 0x72dcdc57, 0x530b0b2c, 0x019d9d4e, 0x2b6c6cad, + 0xa43131c4, 0xf37474cd, 0x15f6f6ff, 0x4c464605, + 0xa5acac8a, 0xb589891e, 0xb4141450, 0xbae1e1a3, + 0xa6161658, 0xf73a3ae8, 0x066969b9, 0x41090924, + 0xd77070dd, 0x6fb6b6e2, 0x1ed0d067, 0xd6eded93, + 0xe2cccc17, 0x68424215, 0x2c98985a, 0xeda4a4aa, + 0x752828a0, 0x865c5c6d, 0x6bf8f8c7, 0xc2868622, + }, + { + 0x30d81818, 0x46262323, 0x91b8c6c6, 0xcdfbe8e8, + 0x13cb8787, 0x6d11b8b8, 0x02090101, 0x9e0d4f4f, + 0x6c9b3636, 0x51ffa6a6, 0xb90cd2d2, 0xf70ef5f5, + 0xf2967979, 0xde306f6f, 0x3f6d9191, 0xa4f85252, + 0xc0476060, 0x6535bcbc, 0x2b379b9b, 0x018a8e8e, + 0x5bd2a3a3, 0x186c0c0c, 0xf6847b7b, 0x6a803535, + 0x3af51d1d, 0xddb3e0e0, 0xb321d7d7, 0x999cc2c2, + 0x5c432e2e, 0x96294b4b, 0xe15dfefe, 0xaed55757, + 0x2abd1515, 0xeee87777, 0x6e923737, 0xd79ee5e5, + 0x23139f9f, 0xfd23f0f0, 0x94204a4a, 0xa944dada, + 0xb0a25858, 0x8fcfc9c9, 0x527c2929, 0x145a0a0a, + 0x7f50b1b1, 0x5dc9a0a0, 0xd6146b6b, 0x17d98585, + 0x673cbdbd, 0xba8f5d5d, 0x20901010, 0xf507f4f4, + 0x8bddcbcb, 0x7cd33e3e, 0x0a2d0505, 0xce786767, + 0xd597e4e4, 0x4e022727, 0x82734141, 0x0ba78b8b, + 0x53f6a7a7, 0xfab27d7d, 0x37499595, 0xad56d8d8, + 0xeb70fbfb, 0xc1cdeeee, 0xf8bb7c7c, 0xcc716666, + 0xa77bdddd, 0x2eaf1717, 0x8e454747, 0x211a9e9e, + 0x89d4caca, 0x5a582d2d, 0x632ebfbf, 0x0e3f0707, + 0x47acadad, 0xb4b05a5a, 0x1bef8383, 0x66b63333, + 0xc65c6363, 0x04120202, 0x4993aaaa, 0xe2de7171, + 0x8dc6c8c8, 0x32d11919, 0x923b4949, 0xaf5fd9d9, + 0xf931f2f2, 0xdba8e3e3, 0xb6b95b5b, 0x0dbc8888, + 0x293e9a9a, 0x4c0b2626, 0x64bf3232, 0x7d59b0b0, + 0xcff2e9e9, 0x1e770f0f, 0xb733d5d5, 0x1df48080, + 0x6127bebe, 0x87ebcdcd, 0x68893434, 0x90324848, + 0xe354ffff, 0xf48d7a7a, 0x3d649090, 0xbe9d5f5f, + 0x403d2020, 0xd00f6868, 0x34ca1a1a, 0x41b7aeae, + 0x757db4b4, 0xa8ce5454, 0x3b7f9393, 0x442f2222, + 0xc8636464, 0xff2af1f1, 0xe6cc7373, 0x24821212, + 0x807a4040, 0x10480808, 0x9b95c3c3, 0xc5dfecec, + 0xab4ddbdb, 0x5fc0a1a1, 0x07918d8d, 0x7ac83d3d, + 0x335b9797, 0x00000000, 0x83f9cfcf, 0x566e2b2b, + 0xece17676, 0x19e68282, 0xb128d6d6, 0x36c31b1b, + 0x7774b5b5, 0x43beafaf, 0xd41d6a6a, 0xa0ea5050, + 0x8a574545, 0xfb38f3f3, 0x60ad3030, 0xc3c4efef, + 0x7eda3f3f, 0xaac75555, 0x59dba2a2, 0xc9e9eaea, + 0xca6a6565, 0x6903baba, 0x5e4a2f2f, 0x9d8ec0c0, + 0xa160dede, 0x38fc1c1c, 0xe746fdfd, 0x9a1f4d4d, + 0x39769292, 0xeafa7575, 0x0c360606, 0x09ae8a8a, + 0x794bb2b2, 0xd185e6e6, 0x1c7e0e0e, 0x3ee71f1f, + 0xc4556262, 0xb53ad4d4, 0x4d81a8a8, 0x31529696, + 0xef62f9f9, 0x97a3c5c5, 0x4a102525, 0xb2ab5959, + 0x15d08484, 0xe4c57272, 0x72ec3939, 0x98164c4c, + 0xbc945e5e, 0xf09f7878, 0x70e53838, 0x05988c8c, + 0xbf17d1d1, 0x57e4a5a5, 0xd9a1e2e2, 0xc24e6161, + 0x7b42b3b3, 0x42342121, 0x25089c9c, 0x3cee1e1e, + 0x86614343, 0x93b1c7c7, 0xe54ffcfc, 0x08240404, + 0xa2e35151, 0x2f259999, 0xda226d6d, 0x1a650d0d, + 0xe979fafa, 0xa369dfdf, 0xfca97e7e, 0x48192424, + 0x76fe3b3b, 0x4b9aabab, 0x81f0cece, 0x22991111, + 0x03838f8f, 0x9c044e4e, 0x7366b7b7, 0xcbe0ebeb, + 0x78c13c3c, 0x1ffd8181, 0x35409494, 0xf31cf7f7, + 0x6f18b9b9, 0x268b1313, 0x58512c2c, 0xbb05d3d3, + 0xd38ce7e7, 0xdc396e6e, 0x95aac4c4, 0x061b0303, + 0xacdc5656, 0x885e4444, 0xfea07f7f, 0x4f88a9a9, + 0x54672a2a, 0x6b0abbbb, 0x9f87c1c1, 0xa6f15353, + 0xa572dcdc, 0x16530b0b, 0x27019d9d, 0xd82b6c6c, + 0x62a43131, 0xe8f37474, 0xf115f6f6, 0x8c4c4646, + 0x45a5acac, 0x0fb58989, 0x28b41414, 0xdfbae1e1, + 0x2ca61616, 0x74f73a3a, 0xd2066969, 0x12410909, + 0xe0d77070, 0x716fb6b6, 0xbd1ed0d0, 0xc7d6eded, + 0x85e2cccc, 0x84684242, 0x2d2c9898, 0x55eda4a4, + 0x50752828, 0xb8865c5c, 0xed6bf8f8, 0x11c28686, + }, + { + 0x7830d818, 0xaf462623, 0xf991b8c6, 0x6fcdfbe8, + 0xa113cb87, 0x626d11b8, 0x05020901, 0x6e9e0d4f, + 0xee6c9b36, 0x0451ffa6, 0xbdb90cd2, 0x06f70ef5, + 0x80f29679, 0xcede306f, 0xef3f6d91, 0x07a4f852, + 0xfdc04760, 0x766535bc, 0xcd2b379b, 0x8c018a8e, + 0x155bd2a3, 0x3c186c0c, 0x8af6847b, 0xe16a8035, + 0x693af51d, 0x47ddb3e0, 0xacb321d7, 0xed999cc2, + 0x965c432e, 0x7a96294b, 0x21e15dfe, 0x16aed557, + 0x412abd15, 0xb6eee877, 0xeb6e9237, 0x56d79ee5, + 0xd923139f, 0x17fd23f0, 0x7f94204a, 0x95a944da, + 0x25b0a258, 0xca8fcfc9, 0x8d527c29, 0x22145a0a, + 0x4f7f50b1, 0x1a5dc9a0, 0xdad6146b, 0xab17d985, + 0x73673cbd, 0x34ba8f5d, 0x50209010, 0x03f507f4, + 0xc08bddcb, 0xc67cd33e, 0x110a2d05, 0xe6ce7867, + 0x53d597e4, 0xbb4e0227, 0x58827341, 0x9d0ba78b, + 0x0153f6a7, 0x94fab27d, 0xfb374995, 0x9fad56d8, + 0x30eb70fb, 0x71c1cdee, 0x91f8bb7c, 0xe3cc7166, + 0x8ea77bdd, 0x4b2eaf17, 0x468e4547, 0xdc211a9e, + 0xc589d4ca, 0x995a582d, 0x79632ebf, 0x1b0e3f07, + 0x2347acad, 0x2fb4b05a, 0xb51bef83, 0xff66b633, + 0xf2c65c63, 0x0a041202, 0x384993aa, 0xa8e2de71, + 0xcf8dc6c8, 0x7d32d119, 0x70923b49, 0x9aaf5fd9, + 0x1df931f2, 0x48dba8e3, 0x2ab6b95b, 0x920dbc88, + 0xc8293e9a, 0xbe4c0b26, 0xfa64bf32, 0x4a7d59b0, + 0x6acff2e9, 0x331e770f, 0xa6b733d5, 0xba1df480, + 0x7c6127be, 0xde87ebcd, 0xe4688934, 0x75903248, + 0x24e354ff, 0x8ff48d7a, 0xea3d6490, 0x3ebe9d5f, + 0xa0403d20, 0xd5d00f68, 0x7234ca1a, 0x2c41b7ae, + 0x5e757db4, 0x19a8ce54, 0xe53b7f93, 0xaa442f22, + 0xe9c86364, 0x12ff2af1, 0xa2e6cc73, 0x5a248212, + 0x5d807a40, 0x28104808, 0xe89b95c3, 0x7bc5dfec, + 0x90ab4ddb, 0x1f5fc0a1, 0x8307918d, 0xc97ac83d, + 0xf1335b97, 0x00000000, 0xd483f9cf, 0x87566e2b, + 0xb3ece176, 0xb019e682, 0xa9b128d6, 0x7736c31b, + 0x5b7774b5, 0x2943beaf, 0xdfd41d6a, 0x0da0ea50, + 0x4c8a5745, 0x18fb38f3, 0xf060ad30, 0x74c3c4ef, + 0xc37eda3f, 0x1caac755, 0x1059dba2, 0x65c9e9ea, + 0xecca6a65, 0x686903ba, 0x935e4a2f, 0xe79d8ec0, + 0x81a160de, 0x6c38fc1c, 0x2ee746fd, 0x649a1f4d, + 0xe0397692, 0xbceafa75, 0x1e0c3606, 0x9809ae8a, + 0x40794bb2, 0x59d185e6, 0x361c7e0e, 0x633ee71f, + 0xf7c45562, 0xa3b53ad4, 0x324d81a8, 0xf4315296, + 0x3aef62f9, 0xf697a3c5, 0xb14a1025, 0x20b2ab59, + 0xae15d084, 0xa7e4c572, 0xdd72ec39, 0x6198164c, + 0x3bbc945e, 0x85f09f78, 0xd870e538, 0x8605988c, + 0xb2bf17d1, 0x0b57e4a5, 0x4dd9a1e2, 0xf8c24e61, + 0x457b42b3, 0xa5423421, 0xd625089c, 0x663cee1e, + 0x52866143, 0xfc93b1c7, 0x2be54ffc, 0x14082404, + 0x08a2e351, 0xc72f2599, 0xc4da226d, 0x391a650d, + 0x35e979fa, 0x84a369df, 0x9bfca97e, 0xb4481924, + 0xd776fe3b, 0x3d4b9aab, 0xd181f0ce, 0x55229911, + 0x8903838f, 0x6b9c044e, 0x517366b7, 0x60cbe0eb, + 0xcc78c13c, 0xbf1ffd81, 0xfe354094, 0x0cf31cf7, + 0x676f18b9, 0x5f268b13, 0x9c58512c, 0xb8bb05d3, + 0x5cd38ce7, 0xcbdc396e, 0xf395aac4, 0x0f061b03, + 0x13acdc56, 0x49885e44, 0x9efea07f, 0x374f88a9, + 0x8254672a, 0x6d6b0abb, 0xe29f87c1, 0x02a6f153, + 0x8ba572dc, 0x2716530b, 0xd327019d, 0xc1d82b6c, + 0xf562a431, 0xb9e8f374, 0x09f115f6, 0x438c4c46, + 0x2645a5ac, 0x970fb589, 0x4428b414, 0x42dfbae1, + 0x4e2ca616, 0xd274f73a, 0xd0d20669, 0x2d124109, + 0xade0d770, 0x54716fb6, 0xb7bd1ed0, 0x7ec7d6ed, + 0xdb85e2cc, 0x57846842, 0xc22d2c98, 0x0e55eda4, + 0x88507528, 0x31b8865c, 0x3fed6bf8, 0xa411c286, + }, + { + 0xc07830d8, 0x05af4626, 0x7ef991b8, 0x136fcdfb, + 0x4ca113cb, 0xa9626d11, 0x08050209, 0x426e9e0d, + 0xadee6c9b, 0x590451ff, 0xdebdb90c, 0xfb06f70e, + 0xef80f296, 0x5fcede30, 0xfcef3f6d, 0xaa07a4f8, + 0x27fdc047, 0x89766535, 0xaccd2b37, 0x048c018a, + 0x71155bd2, 0x603c186c, 0xff8af684, 0xb5e16a80, + 0xe8693af5, 0x5347ddb3, 0xf6acb321, 0x5eed999c, + 0x6d965c43, 0x627a9629, 0xa321e15d, 0x8216aed5, + 0xa8412abd, 0x9fb6eee8, 0xa5eb6e92, 0x7b56d79e, + 0x8cd92313, 0xd317fd23, 0x6a7f9420, 0x9e95a944, + 0xfa25b0a2, 0x06ca8fcf, 0x558d527c, 0x5022145a, + 0xe14f7f50, 0x691a5dc9, 0x7fdad614, 0x5cab17d9, + 0x8173673c, 0xd234ba8f, 0x80502090, 0xf303f507, + 0x16c08bdd, 0xedc67cd3, 0x28110a2d, 0x1fe6ce78, + 0x7353d597, 0x25bb4e02, 0x32588273, 0x2c9d0ba7, + 0x510153f6, 0xcf94fab2, 0xdcfb3749, 0x8e9fad56, + 0x8b30eb70, 0x2371c1cd, 0xc791f8bb, 0x17e3cc71, + 0xa68ea77b, 0xb84b2eaf, 0x02468e45, 0x84dc211a, + 0x1ec589d4, 0x75995a58, 0x9179632e, 0x381b0e3f, + 0x012347ac, 0xea2fb4b0, 0x6cb51bef, 0x85ff66b6, + 0x3ff2c65c, 0x100a0412, 0x39384993, 0xafa8e2de, + 0x0ecf8dc6, 0xc87d32d1, 0x7270923b, 0x869aaf5f, + 0xc31df931, 0x4b48dba8, 0xe22ab6b9, 0x34920dbc, + 0xa4c8293e, 0x2dbe4c0b, 0x8dfa64bf, 0xe94a7d59, + 0x1b6acff2, 0x78331e77, 0xe6a6b733, 0x74ba1df4, + 0x997c6127, 0x26de87eb, 0xbde46889, 0x7a759032, + 0xab24e354, 0xf78ff48d, 0xf4ea3d64, 0xc23ebe9d, + 0x1da0403d, 0x67d5d00f, 0xd07234ca, 0x192c41b7, + 0xc95e757d, 0x9a19a8ce, 0xece53b7f, 0x0daa442f, + 0x07e9c863, 0xdb12ff2a, 0xbfa2e6cc, 0x905a2482, + 0x3a5d807a, 0x40281048, 0x56e89b95, 0x337bc5df, + 0x9690ab4d, 0x611f5fc0, 0x1c830791, 0xf5c97ac8, + 0xccf1335b, 0x00000000, 0x36d483f9, 0x4587566e, + 0x97b3ece1, 0x64b019e6, 0xfea9b128, 0xd87736c3, + 0xc15b7774, 0x112943be, 0x77dfd41d, 0xba0da0ea, + 0x124c8a57, 0xcb18fb38, 0x9df060ad, 0x2b74c3c4, + 0xe5c37eda, 0x921caac7, 0x791059db, 0x0365c9e9, + 0x0fecca6a, 0xb9686903, 0x65935e4a, 0x4ee79d8e, + 0xbe81a160, 0xe06c38fc, 0xbb2ee746, 0x52649a1f, + 0xe4e03976, 0x8fbceafa, 0x301e0c36, 0x249809ae, + 0xf940794b, 0x6359d185, 0x70361c7e, 0xf8633ee7, + 0x37f7c455, 0xeea3b53a, 0x29324d81, 0xc4f43152, + 0x9b3aef62, 0x66f697a3, 0x35b14a10, 0xf220b2ab, + 0x54ae15d0, 0xb7a7e4c5, 0xd5dd72ec, 0x5a619816, + 0xca3bbc94, 0xe785f09f, 0xddd870e5, 0x14860598, + 0xc6b2bf17, 0x410b57e4, 0x434dd9a1, 0x2ff8c24e, + 0xf1457b42, 0x15a54234, 0x94d62508, 0xf0663cee, + 0x22528661, 0x76fc93b1, 0xb32be54f, 0x20140824, + 0xb208a2e3, 0xbcc72f25, 0x4fc4da22, 0x68391a65, + 0x8335e979, 0xb684a369, 0xd79bfca9, 0x3db44819, + 0xc5d776fe, 0x313d4b9a, 0x3ed181f0, 0x88552299, + 0x0c890383, 0x4a6b9c04, 0xd1517366, 0x0b60cbe0, + 0xfdcc78c1, 0x7cbf1ffd, 0xd4fe3540, 0xeb0cf31c, + 0xa1676f18, 0x985f268b, 0x7d9c5851, 0xd6b8bb05, + 0x6b5cd38c, 0x57cbdc39, 0x6ef395aa, 0x180f061b, + 0x8a13acdc, 0x1a49885e, 0xdf9efea0, 0x21374f88, + 0x4d825467, 0xb16d6b0a, 0x46e29f87, 0xa202a6f1, + 0xae8ba572, 0x58271653, 0x9cd32701, 0x47c1d82b, + 0x95f562a4, 0x87b9e8f3, 0xe309f115, 0x0a438c4c, + 0x092645a5, 0x3c970fb5, 0xa04428b4, 0x5b42dfba, + 0xb04e2ca6, 0xcdd274f7, 0x6fd0d206, 0x482d1241, + 0xa7ade0d7, 0xd954716f, 0xceb7bd1e, 0x3b7ec7d6, + 0x2edb85e2, 0x2a578468, 0xb4c22d2c, 0x490e55ed, + 0x5d885075, 0xda31b886, 0x933fed6b, 0x44a411c2, + }, + { + 0x18c07830, 0x2305af46, 0xc67ef991, 0xe8136fcd, + 0x874ca113, 0xb8a9626d, 0x01080502, 0x4f426e9e, + 0x36adee6c, 0xa6590451, 0xd2debdb9, 0xf5fb06f7, + 0x79ef80f2, 0x6f5fcede, 0x91fcef3f, 0x52aa07a4, + 0x6027fdc0, 0xbc897665, 0x9baccd2b, 0x8e048c01, + 0xa371155b, 0x0c603c18, 0x7bff8af6, 0x35b5e16a, + 0x1de8693a, 0xe05347dd, 0xd7f6acb3, 0xc25eed99, + 0x2e6d965c, 0x4b627a96, 0xfea321e1, 0x578216ae, + 0x15a8412a, 0x779fb6ee, 0x37a5eb6e, 0xe57b56d7, + 0x9f8cd923, 0xf0d317fd, 0x4a6a7f94, 0xda9e95a9, + 0x58fa25b0, 0xc906ca8f, 0x29558d52, 0x0a502214, + 0xb1e14f7f, 0xa0691a5d, 0x6b7fdad6, 0x855cab17, + 0xbd817367, 0x5dd234ba, 0x10805020, 0xf4f303f5, + 0xcb16c08b, 0x3eedc67c, 0x0528110a, 0x671fe6ce, + 0xe47353d5, 0x2725bb4e, 0x41325882, 0x8b2c9d0b, + 0xa7510153, 0x7dcf94fa, 0x95dcfb37, 0xd88e9fad, + 0xfb8b30eb, 0xee2371c1, 0x7cc791f8, 0x6617e3cc, + 0xdda68ea7, 0x17b84b2e, 0x4702468e, 0x9e84dc21, + 0xca1ec589, 0x2d75995a, 0xbf917963, 0x07381b0e, + 0xad012347, 0x5aea2fb4, 0x836cb51b, 0x3385ff66, + 0x633ff2c6, 0x02100a04, 0xaa393849, 0x71afa8e2, + 0xc80ecf8d, 0x19c87d32, 0x49727092, 0xd9869aaf, + 0xf2c31df9, 0xe34b48db, 0x5be22ab6, 0x8834920d, + 0x9aa4c829, 0x262dbe4c, 0x328dfa64, 0xb0e94a7d, + 0xe91b6acf, 0x0f78331e, 0xd5e6a6b7, 0x8074ba1d, + 0xbe997c61, 0xcd26de87, 0x34bde468, 0x487a7590, + 0xffab24e3, 0x7af78ff4, 0x90f4ea3d, 0x5fc23ebe, + 0x201da040, 0x6867d5d0, 0x1ad07234, 0xae192c41, + 0xb4c95e75, 0x549a19a8, 0x93ece53b, 0x220daa44, + 0x6407e9c8, 0xf1db12ff, 0x73bfa2e6, 0x12905a24, + 0x403a5d80, 0x08402810, 0xc356e89b, 0xec337bc5, + 0xdb9690ab, 0xa1611f5f, 0x8d1c8307, 0x3df5c97a, + 0x97ccf133, 0x00000000, 0xcf36d483, 0x2b458756, + 0x7697b3ec, 0x8264b019, 0xd6fea9b1, 0x1bd87736, + 0xb5c15b77, 0xaf112943, 0x6a77dfd4, 0x50ba0da0, + 0x45124c8a, 0xf3cb18fb, 0x309df060, 0xef2b74c3, + 0x3fe5c37e, 0x55921caa, 0xa2791059, 0xea0365c9, + 0x650fecca, 0xbab96869, 0x2f65935e, 0xc04ee79d, + 0xdebe81a1, 0x1ce06c38, 0xfdbb2ee7, 0x4d52649a, + 0x92e4e039, 0x758fbcea, 0x06301e0c, 0x8a249809, + 0xb2f94079, 0xe66359d1, 0x0e70361c, 0x1ff8633e, + 0x6237f7c4, 0xd4eea3b5, 0xa829324d, 0x96c4f431, + 0xf99b3aef, 0xc566f697, 0x2535b14a, 0x59f220b2, + 0x8454ae15, 0x72b7a7e4, 0x39d5dd72, 0x4c5a6198, + 0x5eca3bbc, 0x78e785f0, 0x38ddd870, 0x8c148605, + 0xd1c6b2bf, 0xa5410b57, 0xe2434dd9, 0x612ff8c2, + 0xb3f1457b, 0x2115a542, 0x9c94d625, 0x1ef0663c, + 0x43225286, 0xc776fc93, 0xfcb32be5, 0x04201408, + 0x51b208a2, 0x99bcc72f, 0x6d4fc4da, 0x0d68391a, + 0xfa8335e9, 0xdfb684a3, 0x7ed79bfc, 0x243db448, + 0x3bc5d776, 0xab313d4b, 0xce3ed181, 0x11885522, + 0x8f0c8903, 0x4e4a6b9c, 0xb7d15173, 0xeb0b60cb, + 0x3cfdcc78, 0x817cbf1f, 0x94d4fe35, 0xf7eb0cf3, + 0xb9a1676f, 0x13985f26, 0x2c7d9c58, 0xd3d6b8bb, + 0xe76b5cd3, 0x6e57cbdc, 0xc46ef395, 0x03180f06, + 0x568a13ac, 0x441a4988, 0x7fdf9efe, 0xa921374f, + 0x2a4d8254, 0xbbb16d6b, 0xc146e29f, 0x53a202a6, + 0xdcae8ba5, 0x0b582716, 0x9d9cd327, 0x6c47c1d8, + 0x3195f562, 0x7487b9e8, 0xf6e309f1, 0x460a438c, + 0xac092645, 0x893c970f, 0x14a04428, 0xe15b42df, + 0x16b04e2c, 0x3acdd274, 0x696fd0d2, 0x09482d12, + 0x70a7ade0, 0xb6d95471, 0xd0ceb7bd, 0xed3b7ec7, + 0xcc2edb85, 0x422a5784, 0x98b4c22d, 0xa4490e55, + 0x285d8850, 0x5cda31b8, 0xf8933fed, 0x8644a411, + }, + { + 0x6018c078, 0x8c2305af, 0x3fc67ef9, 0x87e8136f, + 0x26874ca1, 0xdab8a962, 0x04010805, 0x214f426e, + 0xd836adee, 0xa2a65904, 0x6fd2debd, 0xf3f5fb06, + 0xf979ef80, 0xa16f5fce, 0x7e91fcef, 0x5552aa07, + 0x9d6027fd, 0xcabc8976, 0x569baccd, 0x028e048c, + 0xb6a37115, 0x300c603c, 0xf17bff8a, 0xd435b5e1, + 0x741de869, 0xa7e05347, 0x7bd7f6ac, 0x2fc25eed, + 0xb82e6d96, 0x314b627a, 0xdffea321, 0x41578216, + 0x5415a841, 0xc1779fb6, 0xdc37a5eb, 0xb3e57b56, + 0x469f8cd9, 0xe7f0d317, 0x354a6a7f, 0x4fda9e95, + 0x7d58fa25, 0x03c906ca, 0xa429558d, 0x280a5022, + 0xfeb1e14f, 0xbaa0691a, 0xb16b7fda, 0x2e855cab, + 0xcebd8173, 0x695dd234, 0x40108050, 0xf7f4f303, + 0x0bcb16c0, 0xf83eedc6, 0x14052811, 0x81671fe6, + 0xb7e47353, 0x9c2725bb, 0x19413258, 0x168b2c9d, + 0xa6a75101, 0xe97dcf94, 0x6e95dcfb, 0x47d88e9f, + 0xcbfb8b30, 0x9fee2371, 0xed7cc791, 0x856617e3, + 0x53dda68e, 0x5c17b84b, 0x01470246, 0x429e84dc, + 0x0fca1ec5, 0xb42d7599, 0xc6bf9179, 0x1c07381b, + 0x8ead0123, 0x755aea2f, 0x36836cb5, 0xcc3385ff, + 0x91633ff2, 0x0802100a, 0x92aa3938, 0xd971afa8, + 0x07c80ecf, 0x6419c87d, 0x39497270, 0x43d9869a, + 0xeff2c31d, 0xabe34b48, 0x715be22a, 0x1a883492, + 0x529aa4c8, 0x98262dbe, 0xc8328dfa, 0xfab0e94a, + 0x83e91b6a, 0x3c0f7833, 0x73d5e6a6, 0x3a8074ba, + 0xc2be997c, 0x13cd26de, 0xd034bde4, 0x3d487a75, + 0xdbffab24, 0xf57af78f, 0x7a90f4ea, 0x615fc23e, + 0x80201da0, 0xbd6867d5, 0x681ad072, 0x82ae192c, + 0xeab4c95e, 0x4d549a19, 0x7693ece5, 0x88220daa, + 0x8d6407e9, 0xe3f1db12, 0xd173bfa2, 0x4812905a, + 0x1d403a5d, 0x20084028, 0x2bc356e8, 0x97ec337b, + 0x4bdb9690, 0xbea1611f, 0x0e8d1c83, 0xf43df5c9, + 0x6697ccf1, 0x00000000, 0x1bcf36d4, 0xac2b4587, + 0xc57697b3, 0x328264b0, 0x7fd6fea9, 0x6c1bd877, + 0xeeb5c15b, 0x86af1129, 0xb56a77df, 0x5d50ba0d, + 0x0945124c, 0xebf3cb18, 0xc0309df0, 0x9bef2b74, + 0xfc3fe5c3, 0x4955921c, 0xb2a27910, 0x8fea0365, + 0x89650fec, 0xd2bab968, 0xbc2f6593, 0x27c04ee7, + 0x5fdebe81, 0x701ce06c, 0xd3fdbb2e, 0x294d5264, + 0x7292e4e0, 0xc9758fbc, 0x1806301e, 0x128a2498, + 0xf2b2f940, 0xbfe66359, 0x380e7036, 0x7c1ff863, + 0x956237f7, 0x77d4eea3, 0x9aa82932, 0x6296c4f4, + 0xc3f99b3a, 0x33c566f6, 0x942535b1, 0x7959f220, + 0x2a8454ae, 0xd572b7a7, 0xe439d5dd, 0x2d4c5a61, + 0x655eca3b, 0xfd78e785, 0xe038ddd8, 0x0a8c1486, + 0x63d1c6b2, 0xaea5410b, 0xafe2434d, 0x99612ff8, + 0xf6b3f145, 0x842115a5, 0x4a9c94d6, 0x781ef066, + 0x11432252, 0x3bc776fc, 0xd7fcb32b, 0x10042014, + 0x5951b208, 0x5e99bcc7, 0xa96d4fc4, 0x340d6839, + 0xcffa8335, 0x5bdfb684, 0xe57ed79b, 0x90243db4, + 0xec3bc5d7, 0x96ab313d, 0x1fce3ed1, 0x44118855, + 0x068f0c89, 0x254e4a6b, 0xe6b7d151, 0x8beb0b60, + 0xf03cfdcc, 0x3e817cbf, 0x6a94d4fe, 0xfbf7eb0c, + 0xdeb9a167, 0x4c13985f, 0xb02c7d9c, 0x6bd3d6b8, + 0xbbe76b5c, 0xa56e57cb, 0x37c46ef3, 0x0c03180f, + 0x45568a13, 0x0d441a49, 0xe17fdf9e, 0x9ea92137, + 0xa82a4d82, 0xd6bbb16d, 0x23c146e2, 0x5153a202, + 0x57dcae8b, 0x2c0b5827, 0x4e9d9cd3, 0xad6c47c1, + 0xc43195f5, 0xcd7487b9, 0xfff6e309, 0x05460a43, + 0x8aac0926, 0x1e893c97, 0x5014a044, 0xa3e15b42, + 0x5816b04e, 0xe83acdd2, 0xb9696fd0, 0x2409482d, + 0xdd70a7ad, 0xe2b6d954, 0x67d0ceb7, 0x93ed3b7e, + 0x17cc2edb, 0x15422a57, 0x5a98b4c2, 0xaaa4490e, + 0xa0285d88, 0x6d5cda31, 0xc7f8933f, 0x228644a4, + }, + { + 0x186018c0, 0x238c2305, 0xc63fc67e, 0xe887e813, + 0x8726874c, 0xb8dab8a9, 0x01040108, 0x4f214f42, + 0x36d836ad, 0xa6a2a659, 0xd26fd2de, 0xf5f3f5fb, + 0x79f979ef, 0x6fa16f5f, 0x917e91fc, 0x525552aa, + 0x609d6027, 0xbccabc89, 0x9b569bac, 0x8e028e04, + 0xa3b6a371, 0x0c300c60, 0x7bf17bff, 0x35d435b5, + 0x1d741de8, 0xe0a7e053, 0xd77bd7f6, 0xc22fc25e, + 0x2eb82e6d, 0x4b314b62, 0xfedffea3, 0x57415782, + 0x155415a8, 0x77c1779f, 0x37dc37a5, 0xe5b3e57b, + 0x9f469f8c, 0xf0e7f0d3, 0x4a354a6a, 0xda4fda9e, + 0x587d58fa, 0xc903c906, 0x29a42955, 0x0a280a50, + 0xb1feb1e1, 0xa0baa069, 0x6bb16b7f, 0x852e855c, + 0xbdcebd81, 0x5d695dd2, 0x10401080, 0xf4f7f4f3, + 0xcb0bcb16, 0x3ef83eed, 0x05140528, 0x6781671f, + 0xe4b7e473, 0x279c2725, 0x41194132, 0x8b168b2c, + 0xa7a6a751, 0x7de97dcf, 0x956e95dc, 0xd847d88e, + 0xfbcbfb8b, 0xee9fee23, 0x7ced7cc7, 0x66856617, + 0xdd53dda6, 0x175c17b8, 0x47014702, 0x9e429e84, + 0xca0fca1e, 0x2db42d75, 0xbfc6bf91, 0x071c0738, + 0xad8ead01, 0x5a755aea, 0x8336836c, 0x33cc3385, + 0x6391633f, 0x02080210, 0xaa92aa39, 0x71d971af, + 0xc807c80e, 0x196419c8, 0x49394972, 0xd943d986, + 0xf2eff2c3, 0xe3abe34b, 0x5b715be2, 0x881a8834, + 0x9a529aa4, 0x2698262d, 0x32c8328d, 0xb0fab0e9, + 0xe983e91b, 0x0f3c0f78, 0xd573d5e6, 0x803a8074, + 0xbec2be99, 0xcd13cd26, 0x34d034bd, 0x483d487a, + 0xffdbffab, 0x7af57af7, 0x907a90f4, 0x5f615fc2, + 0x2080201d, 0x68bd6867, 0x1a681ad0, 0xae82ae19, + 0xb4eab4c9, 0x544d549a, 0x937693ec, 0x2288220d, + 0x648d6407, 0xf1e3f1db, 0x73d173bf, 0x12481290, + 0x401d403a, 0x08200840, 0xc32bc356, 0xec97ec33, + 0xdb4bdb96, 0xa1bea161, 0x8d0e8d1c, 0x3df43df5, + 0x976697cc, 0x00000000, 0xcf1bcf36, 0x2bac2b45, + 0x76c57697, 0x82328264, 0xd67fd6fe, 0x1b6c1bd8, + 0xb5eeb5c1, 0xaf86af11, 0x6ab56a77, 0x505d50ba, + 0x45094512, 0xf3ebf3cb, 0x30c0309d, 0xef9bef2b, + 0x3ffc3fe5, 0x55495592, 0xa2b2a279, 0xea8fea03, + 0x6589650f, 0xbad2bab9, 0x2fbc2f65, 0xc027c04e, + 0xde5fdebe, 0x1c701ce0, 0xfdd3fdbb, 0x4d294d52, + 0x927292e4, 0x75c9758f, 0x06180630, 0x8a128a24, + 0xb2f2b2f9, 0xe6bfe663, 0x0e380e70, 0x1f7c1ff8, + 0x62956237, 0xd477d4ee, 0xa89aa829, 0x966296c4, + 0xf9c3f99b, 0xc533c566, 0x25942535, 0x597959f2, + 0x842a8454, 0x72d572b7, 0x39e439d5, 0x4c2d4c5a, + 0x5e655eca, 0x78fd78e7, 0x38e038dd, 0x8c0a8c14, + 0xd163d1c6, 0xa5aea541, 0xe2afe243, 0x6199612f, + 0xb3f6b3f1, 0x21842115, 0x9c4a9c94, 0x1e781ef0, + 0x43114322, 0xc73bc776, 0xfcd7fcb3, 0x04100420, + 0x515951b2, 0x995e99bc, 0x6da96d4f, 0x0d340d68, + 0xfacffa83, 0xdf5bdfb6, 0x7ee57ed7, 0x2490243d, + 0x3bec3bc5, 0xab96ab31, 0xce1fce3e, 0x11441188, + 0x8f068f0c, 0x4e254e4a, 0xb7e6b7d1, 0xeb8beb0b, + 0x3cf03cfd, 0x813e817c, 0x946a94d4, 0xf7fbf7eb, + 0xb9deb9a1, 0x134c1398, 0x2cb02c7d, 0xd36bd3d6, + 0xe7bbe76b, 0x6ea56e57, 0xc437c46e, 0x030c0318, + 0x5645568a, 0x440d441a, 0x7fe17fdf, 0xa99ea921, + 0x2aa82a4d, 0xbbd6bbb1, 0xc123c146, 0x535153a2, + 0xdc57dcae, 0x0b2c0b58, 0x9d4e9d9c, 0x6cad6c47, + 0x31c43195, 0x74cd7487, 0xf6fff6e3, 0x4605460a, + 0xac8aac09, 0x891e893c, 0x145014a0, 0xe1a3e15b, + 0x165816b0, 0x3ae83acd, 0x69b9696f, 0x09240948, + 0x70dd70a7, 0xb6e2b6d9, 0xd067d0ce, 0xed93ed3b, + 0xcc17cc2e, 0x4215422a, 0x985a98b4, 0xa4aaa449, + 0x28a0285d, 0x5c6d5cda, 0xf8c7f893, 0x86228644, + } +}; + +__constant u32 Cl[8][256] = +{ + { + 0xc07830d8, 0x05af4626, 0x7ef991b8, 0x136fcdfb, + 0x4ca113cb, 0xa9626d11, 0x08050209, 0x426e9e0d, + 0xadee6c9b, 0x590451ff, 0xdebdb90c, 0xfb06f70e, + 0xef80f296, 0x5fcede30, 0xfcef3f6d, 0xaa07a4f8, + 0x27fdc047, 0x89766535, 0xaccd2b37, 0x048c018a, + 0x71155bd2, 0x603c186c, 0xff8af684, 0xb5e16a80, + 0xe8693af5, 0x5347ddb3, 0xf6acb321, 0x5eed999c, + 0x6d965c43, 0x627a9629, 0xa321e15d, 0x8216aed5, + 0xa8412abd, 0x9fb6eee8, 0xa5eb6e92, 0x7b56d79e, + 0x8cd92313, 0xd317fd23, 0x6a7f9420, 0x9e95a944, + 0xfa25b0a2, 0x06ca8fcf, 0x558d527c, 0x5022145a, + 0xe14f7f50, 0x691a5dc9, 0x7fdad614, 0x5cab17d9, + 0x8173673c, 0xd234ba8f, 0x80502090, 0xf303f507, + 0x16c08bdd, 0xedc67cd3, 0x28110a2d, 0x1fe6ce78, + 0x7353d597, 0x25bb4e02, 0x32588273, 0x2c9d0ba7, + 0x510153f6, 0xcf94fab2, 0xdcfb3749, 0x8e9fad56, + 0x8b30eb70, 0x2371c1cd, 0xc791f8bb, 0x17e3cc71, + 0xa68ea77b, 0xb84b2eaf, 0x02468e45, 0x84dc211a, + 0x1ec589d4, 0x75995a58, 0x9179632e, 0x381b0e3f, + 0x012347ac, 0xea2fb4b0, 0x6cb51bef, 0x85ff66b6, + 0x3ff2c65c, 0x100a0412, 0x39384993, 0xafa8e2de, + 0x0ecf8dc6, 0xc87d32d1, 0x7270923b, 0x869aaf5f, + 0xc31df931, 0x4b48dba8, 0xe22ab6b9, 0x34920dbc, + 0xa4c8293e, 0x2dbe4c0b, 0x8dfa64bf, 0xe94a7d59, + 0x1b6acff2, 0x78331e77, 0xe6a6b733, 0x74ba1df4, + 0x997c6127, 0x26de87eb, 0xbde46889, 0x7a759032, + 0xab24e354, 0xf78ff48d, 0xf4ea3d64, 0xc23ebe9d, + 0x1da0403d, 0x67d5d00f, 0xd07234ca, 0x192c41b7, + 0xc95e757d, 0x9a19a8ce, 0xece53b7f, 0x0daa442f, + 0x07e9c863, 0xdb12ff2a, 0xbfa2e6cc, 0x905a2482, + 0x3a5d807a, 0x40281048, 0x56e89b95, 0x337bc5df, + 0x9690ab4d, 0x611f5fc0, 0x1c830791, 0xf5c97ac8, + 0xccf1335b, 0x00000000, 0x36d483f9, 0x4587566e, + 0x97b3ece1, 0x64b019e6, 0xfea9b128, 0xd87736c3, + 0xc15b7774, 0x112943be, 0x77dfd41d, 0xba0da0ea, + 0x124c8a57, 0xcb18fb38, 0x9df060ad, 0x2b74c3c4, + 0xe5c37eda, 0x921caac7, 0x791059db, 0x0365c9e9, + 0x0fecca6a, 0xb9686903, 0x65935e4a, 0x4ee79d8e, + 0xbe81a160, 0xe06c38fc, 0xbb2ee746, 0x52649a1f, + 0xe4e03976, 0x8fbceafa, 0x301e0c36, 0x249809ae, + 0xf940794b, 0x6359d185, 0x70361c7e, 0xf8633ee7, + 0x37f7c455, 0xeea3b53a, 0x29324d81, 0xc4f43152, + 0x9b3aef62, 0x66f697a3, 0x35b14a10, 0xf220b2ab, + 0x54ae15d0, 0xb7a7e4c5, 0xd5dd72ec, 0x5a619816, + 0xca3bbc94, 0xe785f09f, 0xddd870e5, 0x14860598, + 0xc6b2bf17, 0x410b57e4, 0x434dd9a1, 0x2ff8c24e, + 0xf1457b42, 0x15a54234, 0x94d62508, 0xf0663cee, + 0x22528661, 0x76fc93b1, 0xb32be54f, 0x20140824, + 0xb208a2e3, 0xbcc72f25, 0x4fc4da22, 0x68391a65, + 0x8335e979, 0xb684a369, 0xd79bfca9, 0x3db44819, + 0xc5d776fe, 0x313d4b9a, 0x3ed181f0, 0x88552299, + 0x0c890383, 0x4a6b9c04, 0xd1517366, 0x0b60cbe0, + 0xfdcc78c1, 0x7cbf1ffd, 0xd4fe3540, 0xeb0cf31c, + 0xa1676f18, 0x985f268b, 0x7d9c5851, 0xd6b8bb05, + 0x6b5cd38c, 0x57cbdc39, 0x6ef395aa, 0x180f061b, + 0x8a13acdc, 0x1a49885e, 0xdf9efea0, 0x21374f88, + 0x4d825467, 0xb16d6b0a, 0x46e29f87, 0xa202a6f1, + 0xae8ba572, 0x58271653, 0x9cd32701, 0x47c1d82b, + 0x95f562a4, 0x87b9e8f3, 0xe309f115, 0x0a438c4c, + 0x092645a5, 0x3c970fb5, 0xa04428b4, 0x5b42dfba, + 0xb04e2ca6, 0xcdd274f7, 0x6fd0d206, 0x482d1241, + 0xa7ade0d7, 0xd954716f, 0xceb7bd1e, 0x3b7ec7d6, + 0x2edb85e2, 0x2a578468, 0xb4c22d2c, 0x490e55ed, + 0x5d885075, 0xda31b886, 0x933fed6b, 0x44a411c2, + }, + { + 0x18c07830, 0x2305af46, 0xc67ef991, 0xe8136fcd, + 0x874ca113, 0xb8a9626d, 0x01080502, 0x4f426e9e, + 0x36adee6c, 0xa6590451, 0xd2debdb9, 0xf5fb06f7, + 0x79ef80f2, 0x6f5fcede, 0x91fcef3f, 0x52aa07a4, + 0x6027fdc0, 0xbc897665, 0x9baccd2b, 0x8e048c01, + 0xa371155b, 0x0c603c18, 0x7bff8af6, 0x35b5e16a, + 0x1de8693a, 0xe05347dd, 0xd7f6acb3, 0xc25eed99, + 0x2e6d965c, 0x4b627a96, 0xfea321e1, 0x578216ae, + 0x15a8412a, 0x779fb6ee, 0x37a5eb6e, 0xe57b56d7, + 0x9f8cd923, 0xf0d317fd, 0x4a6a7f94, 0xda9e95a9, + 0x58fa25b0, 0xc906ca8f, 0x29558d52, 0x0a502214, + 0xb1e14f7f, 0xa0691a5d, 0x6b7fdad6, 0x855cab17, + 0xbd817367, 0x5dd234ba, 0x10805020, 0xf4f303f5, + 0xcb16c08b, 0x3eedc67c, 0x0528110a, 0x671fe6ce, + 0xe47353d5, 0x2725bb4e, 0x41325882, 0x8b2c9d0b, + 0xa7510153, 0x7dcf94fa, 0x95dcfb37, 0xd88e9fad, + 0xfb8b30eb, 0xee2371c1, 0x7cc791f8, 0x6617e3cc, + 0xdda68ea7, 0x17b84b2e, 0x4702468e, 0x9e84dc21, + 0xca1ec589, 0x2d75995a, 0xbf917963, 0x07381b0e, + 0xad012347, 0x5aea2fb4, 0x836cb51b, 0x3385ff66, + 0x633ff2c6, 0x02100a04, 0xaa393849, 0x71afa8e2, + 0xc80ecf8d, 0x19c87d32, 0x49727092, 0xd9869aaf, + 0xf2c31df9, 0xe34b48db, 0x5be22ab6, 0x8834920d, + 0x9aa4c829, 0x262dbe4c, 0x328dfa64, 0xb0e94a7d, + 0xe91b6acf, 0x0f78331e, 0xd5e6a6b7, 0x8074ba1d, + 0xbe997c61, 0xcd26de87, 0x34bde468, 0x487a7590, + 0xffab24e3, 0x7af78ff4, 0x90f4ea3d, 0x5fc23ebe, + 0x201da040, 0x6867d5d0, 0x1ad07234, 0xae192c41, + 0xb4c95e75, 0x549a19a8, 0x93ece53b, 0x220daa44, + 0x6407e9c8, 0xf1db12ff, 0x73bfa2e6, 0x12905a24, + 0x403a5d80, 0x08402810, 0xc356e89b, 0xec337bc5, + 0xdb9690ab, 0xa1611f5f, 0x8d1c8307, 0x3df5c97a, + 0x97ccf133, 0x00000000, 0xcf36d483, 0x2b458756, + 0x7697b3ec, 0x8264b019, 0xd6fea9b1, 0x1bd87736, + 0xb5c15b77, 0xaf112943, 0x6a77dfd4, 0x50ba0da0, + 0x45124c8a, 0xf3cb18fb, 0x309df060, 0xef2b74c3, + 0x3fe5c37e, 0x55921caa, 0xa2791059, 0xea0365c9, + 0x650fecca, 0xbab96869, 0x2f65935e, 0xc04ee79d, + 0xdebe81a1, 0x1ce06c38, 0xfdbb2ee7, 0x4d52649a, + 0x92e4e039, 0x758fbcea, 0x06301e0c, 0x8a249809, + 0xb2f94079, 0xe66359d1, 0x0e70361c, 0x1ff8633e, + 0x6237f7c4, 0xd4eea3b5, 0xa829324d, 0x96c4f431, + 0xf99b3aef, 0xc566f697, 0x2535b14a, 0x59f220b2, + 0x8454ae15, 0x72b7a7e4, 0x39d5dd72, 0x4c5a6198, + 0x5eca3bbc, 0x78e785f0, 0x38ddd870, 0x8c148605, + 0xd1c6b2bf, 0xa5410b57, 0xe2434dd9, 0x612ff8c2, + 0xb3f1457b, 0x2115a542, 0x9c94d625, 0x1ef0663c, + 0x43225286, 0xc776fc93, 0xfcb32be5, 0x04201408, + 0x51b208a2, 0x99bcc72f, 0x6d4fc4da, 0x0d68391a, + 0xfa8335e9, 0xdfb684a3, 0x7ed79bfc, 0x243db448, + 0x3bc5d776, 0xab313d4b, 0xce3ed181, 0x11885522, + 0x8f0c8903, 0x4e4a6b9c, 0xb7d15173, 0xeb0b60cb, + 0x3cfdcc78, 0x817cbf1f, 0x94d4fe35, 0xf7eb0cf3, + 0xb9a1676f, 0x13985f26, 0x2c7d9c58, 0xd3d6b8bb, + 0xe76b5cd3, 0x6e57cbdc, 0xc46ef395, 0x03180f06, + 0x568a13ac, 0x441a4988, 0x7fdf9efe, 0xa921374f, + 0x2a4d8254, 0xbbb16d6b, 0xc146e29f, 0x53a202a6, + 0xdcae8ba5, 0x0b582716, 0x9d9cd327, 0x6c47c1d8, + 0x3195f562, 0x7487b9e8, 0xf6e309f1, 0x460a438c, + 0xac092645, 0x893c970f, 0x14a04428, 0xe15b42df, + 0x16b04e2c, 0x3acdd274, 0x696fd0d2, 0x09482d12, + 0x70a7ade0, 0xb6d95471, 0xd0ceb7bd, 0xed3b7ec7, + 0xcc2edb85, 0x422a5784, 0x98b4c22d, 0xa4490e55, + 0x285d8850, 0x5cda31b8, 0xf8933fed, 0x8644a411, + }, + { + 0x6018c078, 0x8c2305af, 0x3fc67ef9, 0x87e8136f, + 0x26874ca1, 0xdab8a962, 0x04010805, 0x214f426e, + 0xd836adee, 0xa2a65904, 0x6fd2debd, 0xf3f5fb06, + 0xf979ef80, 0xa16f5fce, 0x7e91fcef, 0x5552aa07, + 0x9d6027fd, 0xcabc8976, 0x569baccd, 0x028e048c, + 0xb6a37115, 0x300c603c, 0xf17bff8a, 0xd435b5e1, + 0x741de869, 0xa7e05347, 0x7bd7f6ac, 0x2fc25eed, + 0xb82e6d96, 0x314b627a, 0xdffea321, 0x41578216, + 0x5415a841, 0xc1779fb6, 0xdc37a5eb, 0xb3e57b56, + 0x469f8cd9, 0xe7f0d317, 0x354a6a7f, 0x4fda9e95, + 0x7d58fa25, 0x03c906ca, 0xa429558d, 0x280a5022, + 0xfeb1e14f, 0xbaa0691a, 0xb16b7fda, 0x2e855cab, + 0xcebd8173, 0x695dd234, 0x40108050, 0xf7f4f303, + 0x0bcb16c0, 0xf83eedc6, 0x14052811, 0x81671fe6, + 0xb7e47353, 0x9c2725bb, 0x19413258, 0x168b2c9d, + 0xa6a75101, 0xe97dcf94, 0x6e95dcfb, 0x47d88e9f, + 0xcbfb8b30, 0x9fee2371, 0xed7cc791, 0x856617e3, + 0x53dda68e, 0x5c17b84b, 0x01470246, 0x429e84dc, + 0x0fca1ec5, 0xb42d7599, 0xc6bf9179, 0x1c07381b, + 0x8ead0123, 0x755aea2f, 0x36836cb5, 0xcc3385ff, + 0x91633ff2, 0x0802100a, 0x92aa3938, 0xd971afa8, + 0x07c80ecf, 0x6419c87d, 0x39497270, 0x43d9869a, + 0xeff2c31d, 0xabe34b48, 0x715be22a, 0x1a883492, + 0x529aa4c8, 0x98262dbe, 0xc8328dfa, 0xfab0e94a, + 0x83e91b6a, 0x3c0f7833, 0x73d5e6a6, 0x3a8074ba, + 0xc2be997c, 0x13cd26de, 0xd034bde4, 0x3d487a75, + 0xdbffab24, 0xf57af78f, 0x7a90f4ea, 0x615fc23e, + 0x80201da0, 0xbd6867d5, 0x681ad072, 0x82ae192c, + 0xeab4c95e, 0x4d549a19, 0x7693ece5, 0x88220daa, + 0x8d6407e9, 0xe3f1db12, 0xd173bfa2, 0x4812905a, + 0x1d403a5d, 0x20084028, 0x2bc356e8, 0x97ec337b, + 0x4bdb9690, 0xbea1611f, 0x0e8d1c83, 0xf43df5c9, + 0x6697ccf1, 0x00000000, 0x1bcf36d4, 0xac2b4587, + 0xc57697b3, 0x328264b0, 0x7fd6fea9, 0x6c1bd877, + 0xeeb5c15b, 0x86af1129, 0xb56a77df, 0x5d50ba0d, + 0x0945124c, 0xebf3cb18, 0xc0309df0, 0x9bef2b74, + 0xfc3fe5c3, 0x4955921c, 0xb2a27910, 0x8fea0365, + 0x89650fec, 0xd2bab968, 0xbc2f6593, 0x27c04ee7, + 0x5fdebe81, 0x701ce06c, 0xd3fdbb2e, 0x294d5264, + 0x7292e4e0, 0xc9758fbc, 0x1806301e, 0x128a2498, + 0xf2b2f940, 0xbfe66359, 0x380e7036, 0x7c1ff863, + 0x956237f7, 0x77d4eea3, 0x9aa82932, 0x6296c4f4, + 0xc3f99b3a, 0x33c566f6, 0x942535b1, 0x7959f220, + 0x2a8454ae, 0xd572b7a7, 0xe439d5dd, 0x2d4c5a61, + 0x655eca3b, 0xfd78e785, 0xe038ddd8, 0x0a8c1486, + 0x63d1c6b2, 0xaea5410b, 0xafe2434d, 0x99612ff8, + 0xf6b3f145, 0x842115a5, 0x4a9c94d6, 0x781ef066, + 0x11432252, 0x3bc776fc, 0xd7fcb32b, 0x10042014, + 0x5951b208, 0x5e99bcc7, 0xa96d4fc4, 0x340d6839, + 0xcffa8335, 0x5bdfb684, 0xe57ed79b, 0x90243db4, + 0xec3bc5d7, 0x96ab313d, 0x1fce3ed1, 0x44118855, + 0x068f0c89, 0x254e4a6b, 0xe6b7d151, 0x8beb0b60, + 0xf03cfdcc, 0x3e817cbf, 0x6a94d4fe, 0xfbf7eb0c, + 0xdeb9a167, 0x4c13985f, 0xb02c7d9c, 0x6bd3d6b8, + 0xbbe76b5c, 0xa56e57cb, 0x37c46ef3, 0x0c03180f, + 0x45568a13, 0x0d441a49, 0xe17fdf9e, 0x9ea92137, + 0xa82a4d82, 0xd6bbb16d, 0x23c146e2, 0x5153a202, + 0x57dcae8b, 0x2c0b5827, 0x4e9d9cd3, 0xad6c47c1, + 0xc43195f5, 0xcd7487b9, 0xfff6e309, 0x05460a43, + 0x8aac0926, 0x1e893c97, 0x5014a044, 0xa3e15b42, + 0x5816b04e, 0xe83acdd2, 0xb9696fd0, 0x2409482d, + 0xdd70a7ad, 0xe2b6d954, 0x67d0ceb7, 0x93ed3b7e, + 0x17cc2edb, 0x15422a57, 0x5a98b4c2, 0xaaa4490e, + 0xa0285d88, 0x6d5cda31, 0xc7f8933f, 0x228644a4, + }, + { + 0x186018c0, 0x238c2305, 0xc63fc67e, 0xe887e813, + 0x8726874c, 0xb8dab8a9, 0x01040108, 0x4f214f42, + 0x36d836ad, 0xa6a2a659, 0xd26fd2de, 0xf5f3f5fb, + 0x79f979ef, 0x6fa16f5f, 0x917e91fc, 0x525552aa, + 0x609d6027, 0xbccabc89, 0x9b569bac, 0x8e028e04, + 0xa3b6a371, 0x0c300c60, 0x7bf17bff, 0x35d435b5, + 0x1d741de8, 0xe0a7e053, 0xd77bd7f6, 0xc22fc25e, + 0x2eb82e6d, 0x4b314b62, 0xfedffea3, 0x57415782, + 0x155415a8, 0x77c1779f, 0x37dc37a5, 0xe5b3e57b, + 0x9f469f8c, 0xf0e7f0d3, 0x4a354a6a, 0xda4fda9e, + 0x587d58fa, 0xc903c906, 0x29a42955, 0x0a280a50, + 0xb1feb1e1, 0xa0baa069, 0x6bb16b7f, 0x852e855c, + 0xbdcebd81, 0x5d695dd2, 0x10401080, 0xf4f7f4f3, + 0xcb0bcb16, 0x3ef83eed, 0x05140528, 0x6781671f, + 0xe4b7e473, 0x279c2725, 0x41194132, 0x8b168b2c, + 0xa7a6a751, 0x7de97dcf, 0x956e95dc, 0xd847d88e, + 0xfbcbfb8b, 0xee9fee23, 0x7ced7cc7, 0x66856617, + 0xdd53dda6, 0x175c17b8, 0x47014702, 0x9e429e84, + 0xca0fca1e, 0x2db42d75, 0xbfc6bf91, 0x071c0738, + 0xad8ead01, 0x5a755aea, 0x8336836c, 0x33cc3385, + 0x6391633f, 0x02080210, 0xaa92aa39, 0x71d971af, + 0xc807c80e, 0x196419c8, 0x49394972, 0xd943d986, + 0xf2eff2c3, 0xe3abe34b, 0x5b715be2, 0x881a8834, + 0x9a529aa4, 0x2698262d, 0x32c8328d, 0xb0fab0e9, + 0xe983e91b, 0x0f3c0f78, 0xd573d5e6, 0x803a8074, + 0xbec2be99, 0xcd13cd26, 0x34d034bd, 0x483d487a, + 0xffdbffab, 0x7af57af7, 0x907a90f4, 0x5f615fc2, + 0x2080201d, 0x68bd6867, 0x1a681ad0, 0xae82ae19, + 0xb4eab4c9, 0x544d549a, 0x937693ec, 0x2288220d, + 0x648d6407, 0xf1e3f1db, 0x73d173bf, 0x12481290, + 0x401d403a, 0x08200840, 0xc32bc356, 0xec97ec33, + 0xdb4bdb96, 0xa1bea161, 0x8d0e8d1c, 0x3df43df5, + 0x976697cc, 0x00000000, 0xcf1bcf36, 0x2bac2b45, + 0x76c57697, 0x82328264, 0xd67fd6fe, 0x1b6c1bd8, + 0xb5eeb5c1, 0xaf86af11, 0x6ab56a77, 0x505d50ba, + 0x45094512, 0xf3ebf3cb, 0x30c0309d, 0xef9bef2b, + 0x3ffc3fe5, 0x55495592, 0xa2b2a279, 0xea8fea03, + 0x6589650f, 0xbad2bab9, 0x2fbc2f65, 0xc027c04e, + 0xde5fdebe, 0x1c701ce0, 0xfdd3fdbb, 0x4d294d52, + 0x927292e4, 0x75c9758f, 0x06180630, 0x8a128a24, + 0xb2f2b2f9, 0xe6bfe663, 0x0e380e70, 0x1f7c1ff8, + 0x62956237, 0xd477d4ee, 0xa89aa829, 0x966296c4, + 0xf9c3f99b, 0xc533c566, 0x25942535, 0x597959f2, + 0x842a8454, 0x72d572b7, 0x39e439d5, 0x4c2d4c5a, + 0x5e655eca, 0x78fd78e7, 0x38e038dd, 0x8c0a8c14, + 0xd163d1c6, 0xa5aea541, 0xe2afe243, 0x6199612f, + 0xb3f6b3f1, 0x21842115, 0x9c4a9c94, 0x1e781ef0, + 0x43114322, 0xc73bc776, 0xfcd7fcb3, 0x04100420, + 0x515951b2, 0x995e99bc, 0x6da96d4f, 0x0d340d68, + 0xfacffa83, 0xdf5bdfb6, 0x7ee57ed7, 0x2490243d, + 0x3bec3bc5, 0xab96ab31, 0xce1fce3e, 0x11441188, + 0x8f068f0c, 0x4e254e4a, 0xb7e6b7d1, 0xeb8beb0b, + 0x3cf03cfd, 0x813e817c, 0x946a94d4, 0xf7fbf7eb, + 0xb9deb9a1, 0x134c1398, 0x2cb02c7d, 0xd36bd3d6, + 0xe7bbe76b, 0x6ea56e57, 0xc437c46e, 0x030c0318, + 0x5645568a, 0x440d441a, 0x7fe17fdf, 0xa99ea921, + 0x2aa82a4d, 0xbbd6bbb1, 0xc123c146, 0x535153a2, + 0xdc57dcae, 0x0b2c0b58, 0x9d4e9d9c, 0x6cad6c47, + 0x31c43195, 0x74cd7487, 0xf6fff6e3, 0x4605460a, + 0xac8aac09, 0x891e893c, 0x145014a0, 0xe1a3e15b, + 0x165816b0, 0x3ae83acd, 0x69b9696f, 0x09240948, + 0x70dd70a7, 0xb6e2b6d9, 0xd067d0ce, 0xed93ed3b, + 0xcc17cc2e, 0x4215422a, 0x985a98b4, 0xa4aaa449, + 0x28a0285d, 0x5c6d5cda, 0xf8c7f893, 0x86228644, + }, + { + 0x18186018, 0x23238c23, 0xc6c63fc6, 0xe8e887e8, + 0x87872687, 0xb8b8dab8, 0x01010401, 0x4f4f214f, + 0x3636d836, 0xa6a6a2a6, 0xd2d26fd2, 0xf5f5f3f5, + 0x7979f979, 0x6f6fa16f, 0x91917e91, 0x52525552, + 0x60609d60, 0xbcbccabc, 0x9b9b569b, 0x8e8e028e, + 0xa3a3b6a3, 0x0c0c300c, 0x7b7bf17b, 0x3535d435, + 0x1d1d741d, 0xe0e0a7e0, 0xd7d77bd7, 0xc2c22fc2, + 0x2e2eb82e, 0x4b4b314b, 0xfefedffe, 0x57574157, + 0x15155415, 0x7777c177, 0x3737dc37, 0xe5e5b3e5, + 0x9f9f469f, 0xf0f0e7f0, 0x4a4a354a, 0xdada4fda, + 0x58587d58, 0xc9c903c9, 0x2929a429, 0x0a0a280a, + 0xb1b1feb1, 0xa0a0baa0, 0x6b6bb16b, 0x85852e85, + 0xbdbdcebd, 0x5d5d695d, 0x10104010, 0xf4f4f7f4, + 0xcbcb0bcb, 0x3e3ef83e, 0x05051405, 0x67678167, + 0xe4e4b7e4, 0x27279c27, 0x41411941, 0x8b8b168b, + 0xa7a7a6a7, 0x7d7de97d, 0x95956e95, 0xd8d847d8, + 0xfbfbcbfb, 0xeeee9fee, 0x7c7ced7c, 0x66668566, + 0xdddd53dd, 0x17175c17, 0x47470147, 0x9e9e429e, + 0xcaca0fca, 0x2d2db42d, 0xbfbfc6bf, 0x07071c07, + 0xadad8ead, 0x5a5a755a, 0x83833683, 0x3333cc33, + 0x63639163, 0x02020802, 0xaaaa92aa, 0x7171d971, + 0xc8c807c8, 0x19196419, 0x49493949, 0xd9d943d9, + 0xf2f2eff2, 0xe3e3abe3, 0x5b5b715b, 0x88881a88, + 0x9a9a529a, 0x26269826, 0x3232c832, 0xb0b0fab0, + 0xe9e983e9, 0x0f0f3c0f, 0xd5d573d5, 0x80803a80, + 0xbebec2be, 0xcdcd13cd, 0x3434d034, 0x48483d48, + 0xffffdbff, 0x7a7af57a, 0x90907a90, 0x5f5f615f, + 0x20208020, 0x6868bd68, 0x1a1a681a, 0xaeae82ae, + 0xb4b4eab4, 0x54544d54, 0x93937693, 0x22228822, + 0x64648d64, 0xf1f1e3f1, 0x7373d173, 0x12124812, + 0x40401d40, 0x08082008, 0xc3c32bc3, 0xecec97ec, + 0xdbdb4bdb, 0xa1a1bea1, 0x8d8d0e8d, 0x3d3df43d, + 0x97976697, 0x00000000, 0xcfcf1bcf, 0x2b2bac2b, + 0x7676c576, 0x82823282, 0xd6d67fd6, 0x1b1b6c1b, + 0xb5b5eeb5, 0xafaf86af, 0x6a6ab56a, 0x50505d50, + 0x45450945, 0xf3f3ebf3, 0x3030c030, 0xefef9bef, + 0x3f3ffc3f, 0x55554955, 0xa2a2b2a2, 0xeaea8fea, + 0x65658965, 0xbabad2ba, 0x2f2fbc2f, 0xc0c027c0, + 0xdede5fde, 0x1c1c701c, 0xfdfdd3fd, 0x4d4d294d, + 0x92927292, 0x7575c975, 0x06061806, 0x8a8a128a, + 0xb2b2f2b2, 0xe6e6bfe6, 0x0e0e380e, 0x1f1f7c1f, + 0x62629562, 0xd4d477d4, 0xa8a89aa8, 0x96966296, + 0xf9f9c3f9, 0xc5c533c5, 0x25259425, 0x59597959, + 0x84842a84, 0x7272d572, 0x3939e439, 0x4c4c2d4c, + 0x5e5e655e, 0x7878fd78, 0x3838e038, 0x8c8c0a8c, + 0xd1d163d1, 0xa5a5aea5, 0xe2e2afe2, 0x61619961, + 0xb3b3f6b3, 0x21218421, 0x9c9c4a9c, 0x1e1e781e, + 0x43431143, 0xc7c73bc7, 0xfcfcd7fc, 0x04041004, + 0x51515951, 0x99995e99, 0x6d6da96d, 0x0d0d340d, + 0xfafacffa, 0xdfdf5bdf, 0x7e7ee57e, 0x24249024, + 0x3b3bec3b, 0xabab96ab, 0xcece1fce, 0x11114411, + 0x8f8f068f, 0x4e4e254e, 0xb7b7e6b7, 0xebeb8beb, + 0x3c3cf03c, 0x81813e81, 0x94946a94, 0xf7f7fbf7, + 0xb9b9deb9, 0x13134c13, 0x2c2cb02c, 0xd3d36bd3, + 0xe7e7bbe7, 0x6e6ea56e, 0xc4c437c4, 0x03030c03, + 0x56564556, 0x44440d44, 0x7f7fe17f, 0xa9a99ea9, + 0x2a2aa82a, 0xbbbbd6bb, 0xc1c123c1, 0x53535153, + 0xdcdc57dc, 0x0b0b2c0b, 0x9d9d4e9d, 0x6c6cad6c, + 0x3131c431, 0x7474cd74, 0xf6f6fff6, 0x46460546, + 0xacac8aac, 0x89891e89, 0x14145014, 0xe1e1a3e1, + 0x16165816, 0x3a3ae83a, 0x6969b969, 0x09092409, + 0x7070dd70, 0xb6b6e2b6, 0xd0d067d0, 0xeded93ed, + 0xcccc17cc, 0x42421542, 0x98985a98, 0xa4a4aaa4, + 0x2828a028, 0x5c5c6d5c, 0xf8f8c7f8, 0x86862286, + }, + { + 0xd8181860, 0x2623238c, 0xb8c6c63f, 0xfbe8e887, + 0xcb878726, 0x11b8b8da, 0x09010104, 0x0d4f4f21, + 0x9b3636d8, 0xffa6a6a2, 0x0cd2d26f, 0x0ef5f5f3, + 0x967979f9, 0x306f6fa1, 0x6d91917e, 0xf8525255, + 0x4760609d, 0x35bcbcca, 0x379b9b56, 0x8a8e8e02, + 0xd2a3a3b6, 0x6c0c0c30, 0x847b7bf1, 0x803535d4, + 0xf51d1d74, 0xb3e0e0a7, 0x21d7d77b, 0x9cc2c22f, + 0x432e2eb8, 0x294b4b31, 0x5dfefedf, 0xd5575741, + 0xbd151554, 0xe87777c1, 0x923737dc, 0x9ee5e5b3, + 0x139f9f46, 0x23f0f0e7, 0x204a4a35, 0x44dada4f, + 0xa258587d, 0xcfc9c903, 0x7c2929a4, 0x5a0a0a28, + 0x50b1b1fe, 0xc9a0a0ba, 0x146b6bb1, 0xd985852e, + 0x3cbdbdce, 0x8f5d5d69, 0x90101040, 0x07f4f4f7, + 0xddcbcb0b, 0xd33e3ef8, 0x2d050514, 0x78676781, + 0x97e4e4b7, 0x0227279c, 0x73414119, 0xa78b8b16, + 0xf6a7a7a6, 0xb27d7de9, 0x4995956e, 0x56d8d847, + 0x70fbfbcb, 0xcdeeee9f, 0xbb7c7ced, 0x71666685, + 0x7bdddd53, 0xaf17175c, 0x45474701, 0x1a9e9e42, + 0xd4caca0f, 0x582d2db4, 0x2ebfbfc6, 0x3f07071c, + 0xacadad8e, 0xb05a5a75, 0xef838336, 0xb63333cc, + 0x5c636391, 0x12020208, 0x93aaaa92, 0xde7171d9, + 0xc6c8c807, 0xd1191964, 0x3b494939, 0x5fd9d943, + 0x31f2f2ef, 0xa8e3e3ab, 0xb95b5b71, 0xbc88881a, + 0x3e9a9a52, 0x0b262698, 0xbf3232c8, 0x59b0b0fa, + 0xf2e9e983, 0x770f0f3c, 0x33d5d573, 0xf480803a, + 0x27bebec2, 0xebcdcd13, 0x893434d0, 0x3248483d, + 0x54ffffdb, 0x8d7a7af5, 0x6490907a, 0x9d5f5f61, + 0x3d202080, 0x0f6868bd, 0xca1a1a68, 0xb7aeae82, + 0x7db4b4ea, 0xce54544d, 0x7f939376, 0x2f222288, + 0x6364648d, 0x2af1f1e3, 0xcc7373d1, 0x82121248, + 0x7a40401d, 0x48080820, 0x95c3c32b, 0xdfecec97, + 0x4ddbdb4b, 0xc0a1a1be, 0x918d8d0e, 0xc83d3df4, + 0x5b979766, 0x00000000, 0xf9cfcf1b, 0x6e2b2bac, + 0xe17676c5, 0xe6828232, 0x28d6d67f, 0xc31b1b6c, + 0x74b5b5ee, 0xbeafaf86, 0x1d6a6ab5, 0xea50505d, + 0x57454509, 0x38f3f3eb, 0xad3030c0, 0xc4efef9b, + 0xda3f3ffc, 0xc7555549, 0xdba2a2b2, 0xe9eaea8f, + 0x6a656589, 0x03babad2, 0x4a2f2fbc, 0x8ec0c027, + 0x60dede5f, 0xfc1c1c70, 0x46fdfdd3, 0x1f4d4d29, + 0x76929272, 0xfa7575c9, 0x36060618, 0xae8a8a12, + 0x4bb2b2f2, 0x85e6e6bf, 0x7e0e0e38, 0xe71f1f7c, + 0x55626295, 0x3ad4d477, 0x81a8a89a, 0x52969662, + 0x62f9f9c3, 0xa3c5c533, 0x10252594, 0xab595979, + 0xd084842a, 0xc57272d5, 0xec3939e4, 0x164c4c2d, + 0x945e5e65, 0x9f7878fd, 0xe53838e0, 0x988c8c0a, + 0x17d1d163, 0xe4a5a5ae, 0xa1e2e2af, 0x4e616199, + 0x42b3b3f6, 0x34212184, 0x089c9c4a, 0xee1e1e78, + 0x61434311, 0xb1c7c73b, 0x4ffcfcd7, 0x24040410, + 0xe3515159, 0x2599995e, 0x226d6da9, 0x650d0d34, + 0x79fafacf, 0x69dfdf5b, 0xa97e7ee5, 0x19242490, + 0xfe3b3bec, 0x9aabab96, 0xf0cece1f, 0x99111144, + 0x838f8f06, 0x044e4e25, 0x66b7b7e6, 0xe0ebeb8b, + 0xc13c3cf0, 0xfd81813e, 0x4094946a, 0x1cf7f7fb, + 0x18b9b9de, 0x8b13134c, 0x512c2cb0, 0x05d3d36b, + 0x8ce7e7bb, 0x396e6ea5, 0xaac4c437, 0x1b03030c, + 0xdc565645, 0x5e44440d, 0xa07f7fe1, 0x88a9a99e, + 0x672a2aa8, 0x0abbbbd6, 0x87c1c123, 0xf1535351, + 0x72dcdc57, 0x530b0b2c, 0x019d9d4e, 0x2b6c6cad, + 0xa43131c4, 0xf37474cd, 0x15f6f6ff, 0x4c464605, + 0xa5acac8a, 0xb589891e, 0xb4141450, 0xbae1e1a3, + 0xa6161658, 0xf73a3ae8, 0x066969b9, 0x41090924, + 0xd77070dd, 0x6fb6b6e2, 0x1ed0d067, 0xd6eded93, + 0xe2cccc17, 0x68424215, 0x2c98985a, 0xeda4a4aa, + 0x752828a0, 0x865c5c6d, 0x6bf8f8c7, 0xc2868622, + }, + { + 0x30d81818, 0x46262323, 0x91b8c6c6, 0xcdfbe8e8, + 0x13cb8787, 0x6d11b8b8, 0x02090101, 0x9e0d4f4f, + 0x6c9b3636, 0x51ffa6a6, 0xb90cd2d2, 0xf70ef5f5, + 0xf2967979, 0xde306f6f, 0x3f6d9191, 0xa4f85252, + 0xc0476060, 0x6535bcbc, 0x2b379b9b, 0x018a8e8e, + 0x5bd2a3a3, 0x186c0c0c, 0xf6847b7b, 0x6a803535, + 0x3af51d1d, 0xddb3e0e0, 0xb321d7d7, 0x999cc2c2, + 0x5c432e2e, 0x96294b4b, 0xe15dfefe, 0xaed55757, + 0x2abd1515, 0xeee87777, 0x6e923737, 0xd79ee5e5, + 0x23139f9f, 0xfd23f0f0, 0x94204a4a, 0xa944dada, + 0xb0a25858, 0x8fcfc9c9, 0x527c2929, 0x145a0a0a, + 0x7f50b1b1, 0x5dc9a0a0, 0xd6146b6b, 0x17d98585, + 0x673cbdbd, 0xba8f5d5d, 0x20901010, 0xf507f4f4, + 0x8bddcbcb, 0x7cd33e3e, 0x0a2d0505, 0xce786767, + 0xd597e4e4, 0x4e022727, 0x82734141, 0x0ba78b8b, + 0x53f6a7a7, 0xfab27d7d, 0x37499595, 0xad56d8d8, + 0xeb70fbfb, 0xc1cdeeee, 0xf8bb7c7c, 0xcc716666, + 0xa77bdddd, 0x2eaf1717, 0x8e454747, 0x211a9e9e, + 0x89d4caca, 0x5a582d2d, 0x632ebfbf, 0x0e3f0707, + 0x47acadad, 0xb4b05a5a, 0x1bef8383, 0x66b63333, + 0xc65c6363, 0x04120202, 0x4993aaaa, 0xe2de7171, + 0x8dc6c8c8, 0x32d11919, 0x923b4949, 0xaf5fd9d9, + 0xf931f2f2, 0xdba8e3e3, 0xb6b95b5b, 0x0dbc8888, + 0x293e9a9a, 0x4c0b2626, 0x64bf3232, 0x7d59b0b0, + 0xcff2e9e9, 0x1e770f0f, 0xb733d5d5, 0x1df48080, + 0x6127bebe, 0x87ebcdcd, 0x68893434, 0x90324848, + 0xe354ffff, 0xf48d7a7a, 0x3d649090, 0xbe9d5f5f, + 0x403d2020, 0xd00f6868, 0x34ca1a1a, 0x41b7aeae, + 0x757db4b4, 0xa8ce5454, 0x3b7f9393, 0x442f2222, + 0xc8636464, 0xff2af1f1, 0xe6cc7373, 0x24821212, + 0x807a4040, 0x10480808, 0x9b95c3c3, 0xc5dfecec, + 0xab4ddbdb, 0x5fc0a1a1, 0x07918d8d, 0x7ac83d3d, + 0x335b9797, 0x00000000, 0x83f9cfcf, 0x566e2b2b, + 0xece17676, 0x19e68282, 0xb128d6d6, 0x36c31b1b, + 0x7774b5b5, 0x43beafaf, 0xd41d6a6a, 0xa0ea5050, + 0x8a574545, 0xfb38f3f3, 0x60ad3030, 0xc3c4efef, + 0x7eda3f3f, 0xaac75555, 0x59dba2a2, 0xc9e9eaea, + 0xca6a6565, 0x6903baba, 0x5e4a2f2f, 0x9d8ec0c0, + 0xa160dede, 0x38fc1c1c, 0xe746fdfd, 0x9a1f4d4d, + 0x39769292, 0xeafa7575, 0x0c360606, 0x09ae8a8a, + 0x794bb2b2, 0xd185e6e6, 0x1c7e0e0e, 0x3ee71f1f, + 0xc4556262, 0xb53ad4d4, 0x4d81a8a8, 0x31529696, + 0xef62f9f9, 0x97a3c5c5, 0x4a102525, 0xb2ab5959, + 0x15d08484, 0xe4c57272, 0x72ec3939, 0x98164c4c, + 0xbc945e5e, 0xf09f7878, 0x70e53838, 0x05988c8c, + 0xbf17d1d1, 0x57e4a5a5, 0xd9a1e2e2, 0xc24e6161, + 0x7b42b3b3, 0x42342121, 0x25089c9c, 0x3cee1e1e, + 0x86614343, 0x93b1c7c7, 0xe54ffcfc, 0x08240404, + 0xa2e35151, 0x2f259999, 0xda226d6d, 0x1a650d0d, + 0xe979fafa, 0xa369dfdf, 0xfca97e7e, 0x48192424, + 0x76fe3b3b, 0x4b9aabab, 0x81f0cece, 0x22991111, + 0x03838f8f, 0x9c044e4e, 0x7366b7b7, 0xcbe0ebeb, + 0x78c13c3c, 0x1ffd8181, 0x35409494, 0xf31cf7f7, + 0x6f18b9b9, 0x268b1313, 0x58512c2c, 0xbb05d3d3, + 0xd38ce7e7, 0xdc396e6e, 0x95aac4c4, 0x061b0303, + 0xacdc5656, 0x885e4444, 0xfea07f7f, 0x4f88a9a9, + 0x54672a2a, 0x6b0abbbb, 0x9f87c1c1, 0xa6f15353, + 0xa572dcdc, 0x16530b0b, 0x27019d9d, 0xd82b6c6c, + 0x62a43131, 0xe8f37474, 0xf115f6f6, 0x8c4c4646, + 0x45a5acac, 0x0fb58989, 0x28b41414, 0xdfbae1e1, + 0x2ca61616, 0x74f73a3a, 0xd2066969, 0x12410909, + 0xe0d77070, 0x716fb6b6, 0xbd1ed0d0, 0xc7d6eded, + 0x85e2cccc, 0x84684242, 0x2d2c9898, 0x55eda4a4, + 0x50752828, 0xb8865c5c, 0xed6bf8f8, 0x11c28686, + }, + { + 0x7830d818, 0xaf462623, 0xf991b8c6, 0x6fcdfbe8, + 0xa113cb87, 0x626d11b8, 0x05020901, 0x6e9e0d4f, + 0xee6c9b36, 0x0451ffa6, 0xbdb90cd2, 0x06f70ef5, + 0x80f29679, 0xcede306f, 0xef3f6d91, 0x07a4f852, + 0xfdc04760, 0x766535bc, 0xcd2b379b, 0x8c018a8e, + 0x155bd2a3, 0x3c186c0c, 0x8af6847b, 0xe16a8035, + 0x693af51d, 0x47ddb3e0, 0xacb321d7, 0xed999cc2, + 0x965c432e, 0x7a96294b, 0x21e15dfe, 0x16aed557, + 0x412abd15, 0xb6eee877, 0xeb6e9237, 0x56d79ee5, + 0xd923139f, 0x17fd23f0, 0x7f94204a, 0x95a944da, + 0x25b0a258, 0xca8fcfc9, 0x8d527c29, 0x22145a0a, + 0x4f7f50b1, 0x1a5dc9a0, 0xdad6146b, 0xab17d985, + 0x73673cbd, 0x34ba8f5d, 0x50209010, 0x03f507f4, + 0xc08bddcb, 0xc67cd33e, 0x110a2d05, 0xe6ce7867, + 0x53d597e4, 0xbb4e0227, 0x58827341, 0x9d0ba78b, + 0x0153f6a7, 0x94fab27d, 0xfb374995, 0x9fad56d8, + 0x30eb70fb, 0x71c1cdee, 0x91f8bb7c, 0xe3cc7166, + 0x8ea77bdd, 0x4b2eaf17, 0x468e4547, 0xdc211a9e, + 0xc589d4ca, 0x995a582d, 0x79632ebf, 0x1b0e3f07, + 0x2347acad, 0x2fb4b05a, 0xb51bef83, 0xff66b633, + 0xf2c65c63, 0x0a041202, 0x384993aa, 0xa8e2de71, + 0xcf8dc6c8, 0x7d32d119, 0x70923b49, 0x9aaf5fd9, + 0x1df931f2, 0x48dba8e3, 0x2ab6b95b, 0x920dbc88, + 0xc8293e9a, 0xbe4c0b26, 0xfa64bf32, 0x4a7d59b0, + 0x6acff2e9, 0x331e770f, 0xa6b733d5, 0xba1df480, + 0x7c6127be, 0xde87ebcd, 0xe4688934, 0x75903248, + 0x24e354ff, 0x8ff48d7a, 0xea3d6490, 0x3ebe9d5f, + 0xa0403d20, 0xd5d00f68, 0x7234ca1a, 0x2c41b7ae, + 0x5e757db4, 0x19a8ce54, 0xe53b7f93, 0xaa442f22, + 0xe9c86364, 0x12ff2af1, 0xa2e6cc73, 0x5a248212, + 0x5d807a40, 0x28104808, 0xe89b95c3, 0x7bc5dfec, + 0x90ab4ddb, 0x1f5fc0a1, 0x8307918d, 0xc97ac83d, + 0xf1335b97, 0x00000000, 0xd483f9cf, 0x87566e2b, + 0xb3ece176, 0xb019e682, 0xa9b128d6, 0x7736c31b, + 0x5b7774b5, 0x2943beaf, 0xdfd41d6a, 0x0da0ea50, + 0x4c8a5745, 0x18fb38f3, 0xf060ad30, 0x74c3c4ef, + 0xc37eda3f, 0x1caac755, 0x1059dba2, 0x65c9e9ea, + 0xecca6a65, 0x686903ba, 0x935e4a2f, 0xe79d8ec0, + 0x81a160de, 0x6c38fc1c, 0x2ee746fd, 0x649a1f4d, + 0xe0397692, 0xbceafa75, 0x1e0c3606, 0x9809ae8a, + 0x40794bb2, 0x59d185e6, 0x361c7e0e, 0x633ee71f, + 0xf7c45562, 0xa3b53ad4, 0x324d81a8, 0xf4315296, + 0x3aef62f9, 0xf697a3c5, 0xb14a1025, 0x20b2ab59, + 0xae15d084, 0xa7e4c572, 0xdd72ec39, 0x6198164c, + 0x3bbc945e, 0x85f09f78, 0xd870e538, 0x8605988c, + 0xb2bf17d1, 0x0b57e4a5, 0x4dd9a1e2, 0xf8c24e61, + 0x457b42b3, 0xa5423421, 0xd625089c, 0x663cee1e, + 0x52866143, 0xfc93b1c7, 0x2be54ffc, 0x14082404, + 0x08a2e351, 0xc72f2599, 0xc4da226d, 0x391a650d, + 0x35e979fa, 0x84a369df, 0x9bfca97e, 0xb4481924, + 0xd776fe3b, 0x3d4b9aab, 0xd181f0ce, 0x55229911, + 0x8903838f, 0x6b9c044e, 0x517366b7, 0x60cbe0eb, + 0xcc78c13c, 0xbf1ffd81, 0xfe354094, 0x0cf31cf7, + 0x676f18b9, 0x5f268b13, 0x9c58512c, 0xb8bb05d3, + 0x5cd38ce7, 0xcbdc396e, 0xf395aac4, 0x0f061b03, + 0x13acdc56, 0x49885e44, 0x9efea07f, 0x374f88a9, + 0x8254672a, 0x6d6b0abb, 0xe29f87c1, 0x02a6f153, + 0x8ba572dc, 0x2716530b, 0xd327019d, 0xc1d82b6c, + 0xf562a431, 0xb9e8f374, 0x09f115f6, 0x438c4c46, + 0x2645a5ac, 0x970fb589, 0x4428b414, 0x42dfbae1, + 0x4e2ca616, 0xd274f73a, 0xd0d20669, 0x2d124109, + 0xade0d770, 0x54716fb6, 0xb7bd1ed0, 0x7ec7d6ed, + 0xdb85e2cc, 0x57846842, 0xc22d2c98, 0x0e55eda4, + 0x88507528, 0x31b8865c, 0x3fed6bf8, 0xa411c286, + }, +}; + +#ifdef VECT_SIZE1 +#define BOX(S,n,i) (u32) ((S)[(n)][(i)]) +#endif + +static void whirlpool_transform (const u32 w[16], u32 dgst[16], __local u32 s_Ch[8][256], __local u32 s_Cl[8][256]) +{ + const u32 rch[R + 1] = + { + 0x00000000, + 0x1823c6e8, + 0x36a6d2f5, + 0x60bc9b8e, + 0x1de0d7c2, + 0x157737e5, + 0x58c9290a, + 0xbd5d10f4, + 0xe427418b, + 0xfbee7c66, + 0xca2dbf07, + }; + + const u32 rcl[R + 1] = + { + 0x00000000, + 0x87b8014f, + 0x796f9152, + 0xa30c7b35, + 0x2e4bfe57, + 0x9ff04ada, + 0xb1a06b85, + 0xcb3e0567, + 0xa77d95d8, + 0xdd17479e, + 0xad5a8333, + }; + + u32 Kh[8]; + u32 Kl[8]; + + Kh[0] = dgst[ 0]; + Kl[0] = dgst[ 1]; + Kh[1] = dgst[ 2]; + Kl[1] = dgst[ 3]; + Kh[2] = dgst[ 4]; + Kl[2] = dgst[ 5]; + Kh[3] = dgst[ 6]; + Kl[3] = dgst[ 7]; + Kh[4] = dgst[ 8]; + Kl[4] = dgst[ 9]; + Kh[5] = dgst[10]; + Kl[5] = dgst[11]; + Kh[6] = dgst[12]; + Kl[6] = dgst[13]; + Kh[7] = dgst[14]; + Kl[7] = dgst[15]; + + u32 stateh[8]; + u32 statel[8]; + + stateh[0] = w[ 0] ^ Kh[0]; + statel[0] = w[ 1] ^ Kl[0]; + stateh[1] = w[ 2] ^ Kh[1]; + statel[1] = w[ 3] ^ Kl[1]; + stateh[2] = w[ 4] ^ Kh[2]; + statel[2] = w[ 5] ^ Kl[2]; + stateh[3] = w[ 6] ^ Kh[3]; + statel[3] = w[ 7] ^ Kl[3]; + stateh[4] = w[ 8] ^ Kh[4]; + statel[4] = w[ 9] ^ Kl[4]; + stateh[5] = w[10] ^ Kh[5]; + statel[5] = w[11] ^ Kl[5]; + stateh[6] = w[12] ^ Kh[6]; + statel[6] = w[13] ^ Kl[6]; + stateh[7] = w[14] ^ Kh[7]; + statel[7] = w[15] ^ Kl[7]; + + u32 r; + + for (r = 1; r <= R; r++) + { + u32 Lh[8]; + u32 Ll[8]; + + u32 i; + + #pragma unroll 8 + for (i = 0; i < 8; i++) + { + const u8 Lp0 = Kh[(i + 8) & 7] >> 24; + const u8 Lp1 = Kh[(i + 7) & 7] >> 16; + const u8 Lp2 = Kh[(i + 6) & 7] >> 8; + const u8 Lp3 = Kh[(i + 5) & 7] >> 0; + const u8 Lp4 = Kl[(i + 4) & 7] >> 24; + const u8 Lp5 = Kl[(i + 3) & 7] >> 16; + const u8 Lp6 = Kl[(i + 2) & 7] >> 8; + const u8 Lp7 = Kl[(i + 1) & 7] >> 0; + + Lh[i] = BOX (s_Ch, 0, Lp0 & 0xff) + ^ BOX (s_Ch, 1, Lp1 & 0xff) + ^ BOX (s_Ch, 2, Lp2 & 0xff) + ^ BOX (s_Ch, 3, Lp3 & 0xff) + ^ BOX (s_Ch, 4, Lp4 & 0xff) + ^ BOX (s_Ch, 5, Lp5 & 0xff) + ^ BOX (s_Ch, 6, Lp6 & 0xff) + ^ BOX (s_Ch, 7, Lp7 & 0xff); + + Ll[i] = BOX (s_Cl, 0, Lp0 & 0xff) + ^ BOX (s_Cl, 1, Lp1 & 0xff) + ^ BOX (s_Cl, 2, Lp2 & 0xff) + ^ BOX (s_Cl, 3, Lp3 & 0xff) + ^ BOX (s_Cl, 4, Lp4 & 0xff) + ^ BOX (s_Cl, 5, Lp5 & 0xff) + ^ BOX (s_Cl, 6, Lp6 & 0xff) + ^ BOX (s_Cl, 7, Lp7 & 0xff); + } + + Kh[0] = Lh[0] ^ rch[r]; + Kl[0] = Ll[0] ^ rcl[r]; + Kh[1] = Lh[1]; + Kl[1] = Ll[1]; + Kh[2] = Lh[2]; + Kl[2] = Ll[2]; + Kh[3] = Lh[3]; + Kl[3] = Ll[3]; + Kh[4] = Lh[4]; + Kl[4] = Ll[4]; + Kh[5] = Lh[5]; + Kl[5] = Ll[5]; + Kh[6] = Lh[6]; + Kl[6] = Ll[6]; + Kh[7] = Lh[7]; + Kl[7] = Ll[7]; + + #pragma unroll 8 + for (i = 0; i < 8; i++) + { + const u8 Lp0 = stateh[(i + 8) & 7] >> 24; + const u8 Lp1 = stateh[(i + 7) & 7] >> 16; + const u8 Lp2 = stateh[(i + 6) & 7] >> 8; + const u8 Lp3 = stateh[(i + 5) & 7] >> 0; + const u8 Lp4 = statel[(i + 4) & 7] >> 24; + const u8 Lp5 = statel[(i + 3) & 7] >> 16; + const u8 Lp6 = statel[(i + 2) & 7] >> 8; + const u8 Lp7 = statel[(i + 1) & 7] >> 0; + + Lh[i] = BOX (s_Ch, 0, Lp0 & 0xff) + ^ BOX (s_Ch, 1, Lp1 & 0xff) + ^ BOX (s_Ch, 2, Lp2 & 0xff) + ^ BOX (s_Ch, 3, Lp3 & 0xff) + ^ BOX (s_Ch, 4, Lp4 & 0xff) + ^ BOX (s_Ch, 5, Lp5 & 0xff) + ^ BOX (s_Ch, 6, Lp6 & 0xff) + ^ BOX (s_Ch, 7, Lp7 & 0xff); + + Ll[i] = BOX (s_Cl, 0, Lp0 & 0xff) + ^ BOX (s_Cl, 1, Lp1 & 0xff) + ^ BOX (s_Cl, 2, Lp2 & 0xff) + ^ BOX (s_Cl, 3, Lp3 & 0xff) + ^ BOX (s_Cl, 4, Lp4 & 0xff) + ^ BOX (s_Cl, 5, Lp5 & 0xff) + ^ BOX (s_Cl, 6, Lp6 & 0xff) + ^ BOX (s_Cl, 7, Lp7 & 0xff); + } + + stateh[0] = Lh[0] ^ Kh[0]; + statel[0] = Ll[0] ^ Kl[0]; + stateh[1] = Lh[1] ^ Kh[1]; + statel[1] = Ll[1] ^ Kl[1]; + stateh[2] = Lh[2] ^ Kh[2]; + statel[2] = Ll[2] ^ Kl[2]; + stateh[3] = Lh[3] ^ Kh[3]; + statel[3] = Ll[3] ^ Kl[3]; + stateh[4] = Lh[4] ^ Kh[4]; + statel[4] = Ll[4] ^ Kl[4]; + stateh[5] = Lh[5] ^ Kh[5]; + statel[5] = Ll[5] ^ Kl[5]; + stateh[6] = Lh[6] ^ Kh[6]; + statel[6] = Ll[6] ^ Kl[6]; + stateh[7] = Lh[7] ^ Kh[7]; + statel[7] = Ll[7] ^ Kl[7]; + } + + dgst[ 0] ^= stateh[0] ^ w[ 0]; + dgst[ 1] ^= statel[0] ^ w[ 1]; + dgst[ 2] ^= stateh[1] ^ w[ 2]; + dgst[ 3] ^= statel[1] ^ w[ 3]; + dgst[ 4] ^= stateh[2] ^ w[ 4]; + dgst[ 5] ^= statel[2] ^ w[ 5]; + dgst[ 6] ^= stateh[3] ^ w[ 6]; + dgst[ 7] ^= statel[3] ^ w[ 7]; + dgst[ 8] ^= stateh[4] ^ w[ 8]; + dgst[ 9] ^= statel[4] ^ w[ 9]; + dgst[10] ^= stateh[5] ^ w[10]; + dgst[11] ^= statel[5] ^ w[11]; + dgst[12] ^= stateh[6] ^ w[12]; + dgst[13] ^= statel[6] ^ w[13]; + dgst[14] ^= stateh[7] ^ w[14]; + dgst[15] ^= statel[7] ^ w[15]; +} + +static void hmac_run2 (const u32 w1[16], const u32 w2[16], const u32 ipad[16], const u32 opad[16], u32 dgst[16], __local u32 s_Ch[8][256], __local u32 s_Cl[8][256]) +{ + dgst[ 0] = ipad[ 0]; + dgst[ 1] = ipad[ 1]; + dgst[ 2] = ipad[ 2]; + dgst[ 3] = ipad[ 3]; + dgst[ 4] = ipad[ 4]; + dgst[ 5] = ipad[ 5]; + dgst[ 6] = ipad[ 6]; + dgst[ 7] = ipad[ 7]; + dgst[ 8] = ipad[ 8]; + dgst[ 9] = ipad[ 9]; + dgst[10] = ipad[10]; + dgst[11] = ipad[11]; + dgst[12] = ipad[12]; + dgst[13] = ipad[13]; + dgst[14] = ipad[14]; + dgst[15] = ipad[15]; + + whirlpool_transform (w1, dgst, s_Ch, s_Cl); + whirlpool_transform (w2, dgst, s_Ch, s_Cl); + + u32 w[16]; + + w[ 0] = dgst[ 0]; + w[ 1] = dgst[ 1]; + w[ 2] = dgst[ 2]; + w[ 3] = dgst[ 3]; + w[ 4] = dgst[ 4]; + w[ 5] = dgst[ 5]; + w[ 6] = dgst[ 6]; + w[ 7] = dgst[ 7]; + w[ 8] = dgst[ 8]; + w[ 9] = dgst[ 9]; + w[10] = dgst[10]; + w[11] = dgst[11]; + w[12] = dgst[12]; + w[13] = dgst[13]; + w[14] = dgst[14]; + w[15] = dgst[15]; + + dgst[ 0] = opad[ 0]; + dgst[ 1] = opad[ 1]; + dgst[ 2] = opad[ 2]; + dgst[ 3] = opad[ 3]; + dgst[ 4] = opad[ 4]; + dgst[ 5] = opad[ 5]; + dgst[ 6] = opad[ 6]; + dgst[ 7] = opad[ 7]; + dgst[ 8] = opad[ 8]; + dgst[ 9] = opad[ 9]; + dgst[10] = opad[10]; + dgst[11] = opad[11]; + dgst[12] = opad[12]; + dgst[13] = opad[13]; + dgst[14] = opad[14]; + dgst[15] = opad[15]; + + whirlpool_transform (w, dgst, s_Ch, s_Cl); + + w[ 0] = 0x80000000; + w[ 1] = 0; + w[ 2] = 0; + w[ 3] = 0; + w[ 4] = 0; + w[ 5] = 0; + w[ 6] = 0; + w[ 7] = 0; + w[ 8] = 0; + w[ 9] = 0; + w[10] = 0; + w[11] = 0; + w[12] = 0; + w[13] = 0; + w[14] = 0; + w[15] = (64 + 64) * 8; + + whirlpool_transform (w, dgst, s_Ch, s_Cl); +} + +static void hmac_init (u32 w[16], u32 ipad[16], u32 opad[16], __local u32 s_Ch[8][256], __local u32 s_Cl[8][256]) +{ + w[ 0] ^= 0x36363636; + w[ 1] ^= 0x36363636; + w[ 2] ^= 0x36363636; + w[ 3] ^= 0x36363636; + w[ 4] ^= 0x36363636; + w[ 5] ^= 0x36363636; + w[ 6] ^= 0x36363636; + w[ 7] ^= 0x36363636; + w[ 8] ^= 0x36363636; + w[ 9] ^= 0x36363636; + w[10] ^= 0x36363636; + w[11] ^= 0x36363636; + w[12] ^= 0x36363636; + w[13] ^= 0x36363636; + w[14] ^= 0x36363636; + w[15] ^= 0x36363636; + + ipad[ 0] = 0; + ipad[ 1] = 0; + ipad[ 2] = 0; + ipad[ 3] = 0; + ipad[ 4] = 0; + ipad[ 5] = 0; + ipad[ 6] = 0; + ipad[ 7] = 0; + ipad[ 8] = 0; + ipad[ 9] = 0; + ipad[10] = 0; + ipad[11] = 0; + ipad[12] = 0; + ipad[13] = 0; + ipad[14] = 0; + ipad[15] = 0; + + whirlpool_transform (w, ipad, s_Ch, s_Cl); + + w[ 0] ^= 0x6a6a6a6a; + w[ 1] ^= 0x6a6a6a6a; + w[ 2] ^= 0x6a6a6a6a; + w[ 3] ^= 0x6a6a6a6a; + w[ 4] ^= 0x6a6a6a6a; + w[ 5] ^= 0x6a6a6a6a; + w[ 6] ^= 0x6a6a6a6a; + w[ 7] ^= 0x6a6a6a6a; + w[ 8] ^= 0x6a6a6a6a; + w[ 9] ^= 0x6a6a6a6a; + w[10] ^= 0x6a6a6a6a; + w[11] ^= 0x6a6a6a6a; + w[12] ^= 0x6a6a6a6a; + w[13] ^= 0x6a6a6a6a; + w[14] ^= 0x6a6a6a6a; + w[15] ^= 0x6a6a6a6a; + + opad[ 0] = 0; + opad[ 1] = 0; + opad[ 2] = 0; + opad[ 3] = 0; + opad[ 4] = 0; + opad[ 5] = 0; + opad[ 6] = 0; + opad[ 7] = 0; + opad[ 8] = 0; + opad[ 9] = 0; + opad[10] = 0; + opad[11] = 0; + opad[12] = 0; + opad[13] = 0; + opad[14] = 0; + opad[15] = 0; + + whirlpool_transform (w, opad, s_Ch, s_Cl); +} + +static u32 u8add (const u32 a, const u32 b) +{ + const u32 a1 = (a >> 0) & 0xff; + const u32 a2 = (a >> 8) & 0xff; + const u32 a3 = (a >> 16) & 0xff; + const u32 a4 = (a >> 24) & 0xff; + + const u32 b1 = (b >> 0) & 0xff; + const u32 b2 = (b >> 8) & 0xff; + const u32 b3 = (b >> 16) & 0xff; + const u32 b4 = (b >> 24) & 0xff; + + const u32 r1 = (a1 + b1) & 0xff; + const u32 r2 = (a2 + b2) & 0xff; + const u32 r3 = (a3 + b3) & 0xff; + const u32 r4 = (a4 + b4) & 0xff; + + const u32 r = r1 << 0 + | r2 << 8 + | r3 << 16 + | r4 << 24; + + return r; +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m06231_init (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global tc_tmp_t *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global tc_t *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = pws[gid].i[ 8]; + w2[1] = pws[gid].i[ 9]; + w2[2] = pws[gid].i[10]; + w2[3] = pws[gid].i[11]; + + u32x w3[4]; + + w3[0] = pws[gid].i[12]; + w3[1] = pws[gid].i[13]; + w3[2] = pws[gid].i[14]; + w3[3] = pws[gid].i[15]; + + /** + * keyfile + */ + + w0[0] = u8add (w0[0], esalt_bufs[salt_pos].keyfile_buf[ 0]); + w0[1] = u8add (w0[1], esalt_bufs[salt_pos].keyfile_buf[ 1]); + w0[2] = u8add (w0[2], esalt_bufs[salt_pos].keyfile_buf[ 2]); + w0[3] = u8add (w0[3], esalt_bufs[salt_pos].keyfile_buf[ 3]); + w1[0] = u8add (w1[0], esalt_bufs[salt_pos].keyfile_buf[ 4]); + w1[1] = u8add (w1[1], esalt_bufs[salt_pos].keyfile_buf[ 5]); + w1[2] = u8add (w1[2], esalt_bufs[salt_pos].keyfile_buf[ 6]); + w1[3] = u8add (w1[3], esalt_bufs[salt_pos].keyfile_buf[ 7]); + w2[0] = u8add (w2[0], esalt_bufs[salt_pos].keyfile_buf[ 8]); + w2[1] = u8add (w2[1], esalt_bufs[salt_pos].keyfile_buf[ 9]); + w2[2] = u8add (w2[2], esalt_bufs[salt_pos].keyfile_buf[10]); + w2[3] = u8add (w2[3], esalt_bufs[salt_pos].keyfile_buf[11]); + w3[0] = u8add (w3[0], esalt_bufs[salt_pos].keyfile_buf[12]); + w3[1] = u8add (w3[1], esalt_bufs[salt_pos].keyfile_buf[13]); + w3[2] = u8add (w3[2], esalt_bufs[salt_pos].keyfile_buf[14]); + w3[3] = u8add (w3[3], esalt_bufs[salt_pos].keyfile_buf[15]); + + /** + * shared mem + */ + + __local u32 s_Ch[8][256]; + __local u32 s_Cl[8][256]; + + const u32 lid = get_local_id (0); + + const u32 lid4 = lid * 4; + + for (u32 i = 0; i < 8; i++) + { + s_Ch[i][lid4 + 0] = Ch[i][lid4 + 0]; + s_Ch[i][lid4 + 1] = Ch[i][lid4 + 1]; + s_Ch[i][lid4 + 2] = Ch[i][lid4 + 2]; + s_Ch[i][lid4 + 3] = Ch[i][lid4 + 3]; + s_Cl[i][lid4 + 0] = Cl[i][lid4 + 0]; + s_Cl[i][lid4 + 1] = Cl[i][lid4 + 1]; + s_Cl[i][lid4 + 2] = Cl[i][lid4 + 2]; + s_Cl[i][lid4 + 3] = Cl[i][lid4 + 3]; + } + + barrier (CLK_LOCAL_MEM_FENCE); + + if (gid >= gid_max) return; + + /** + * salt + */ + + u32 salt_buf1[16]; + + salt_buf1[ 0] = swap_workaround (esalt_bufs[salt_pos].salt_buf[ 0]); + salt_buf1[ 1] = swap_workaround (esalt_bufs[salt_pos].salt_buf[ 1]); + salt_buf1[ 2] = swap_workaround (esalt_bufs[salt_pos].salt_buf[ 2]); + salt_buf1[ 3] = swap_workaround (esalt_bufs[salt_pos].salt_buf[ 3]); + salt_buf1[ 4] = swap_workaround (esalt_bufs[salt_pos].salt_buf[ 4]); + salt_buf1[ 5] = swap_workaround (esalt_bufs[salt_pos].salt_buf[ 5]); + salt_buf1[ 6] = swap_workaround (esalt_bufs[salt_pos].salt_buf[ 6]); + salt_buf1[ 7] = swap_workaround (esalt_bufs[salt_pos].salt_buf[ 7]); + salt_buf1[ 8] = swap_workaround (esalt_bufs[salt_pos].salt_buf[ 8]); + salt_buf1[ 9] = swap_workaround (esalt_bufs[salt_pos].salt_buf[ 9]); + salt_buf1[10] = swap_workaround (esalt_bufs[salt_pos].salt_buf[10]); + salt_buf1[11] = swap_workaround (esalt_bufs[salt_pos].salt_buf[11]); + salt_buf1[12] = swap_workaround (esalt_bufs[salt_pos].salt_buf[12]); + salt_buf1[13] = swap_workaround (esalt_bufs[salt_pos].salt_buf[13]); + salt_buf1[14] = swap_workaround (esalt_bufs[salt_pos].salt_buf[14]); + salt_buf1[15] = swap_workaround (esalt_bufs[salt_pos].salt_buf[15]); + + u32 salt_buf2[16]; + + salt_buf2[ 0] = 0; + salt_buf2[ 1] = 0x80000000; + salt_buf2[ 2] = 0; + salt_buf2[ 3] = 0; + salt_buf2[ 4] = 0; + salt_buf2[ 5] = 0; + salt_buf2[ 6] = 0; + salt_buf2[ 7] = 0; + salt_buf2[ 8] = 0; + salt_buf2[ 9] = 0; + salt_buf2[10] = 0; + salt_buf2[11] = 0; + salt_buf2[12] = 0; + salt_buf2[13] = 0; + salt_buf2[14] = 0; + salt_buf2[15] = (64 + 64 + 4) * 8; + + const u32 truecrypt_mdlen = salt_bufs[0].truecrypt_mdlen; + + u32 w[16]; + + w[ 0] = swap_workaround (w0[0]); + w[ 1] = swap_workaround (w0[1]); + w[ 2] = swap_workaround (w0[2]); + w[ 3] = swap_workaround (w0[3]); + w[ 4] = swap_workaround (w1[0]); + w[ 5] = swap_workaround (w1[1]); + w[ 6] = swap_workaround (w1[2]); + w[ 7] = swap_workaround (w1[3]); + w[ 8] = swap_workaround (w2[0]); + w[ 9] = swap_workaround (w2[1]); + w[10] = swap_workaround (w2[2]); + w[11] = swap_workaround (w2[3]); + w[12] = swap_workaround (w3[0]); + w[13] = swap_workaround (w3[1]); + w[14] = swap_workaround (w3[2]); + w[15] = swap_workaround (w3[3]); + + u32 ipad[16]; + u32 opad[16]; + + hmac_init (w, ipad, opad, s_Ch, s_Cl); + + tmps[gid].ipad[ 0] = ipad[ 0]; + tmps[gid].ipad[ 1] = ipad[ 1]; + tmps[gid].ipad[ 2] = ipad[ 2]; + tmps[gid].ipad[ 3] = ipad[ 3]; + tmps[gid].ipad[ 4] = ipad[ 4]; + tmps[gid].ipad[ 5] = ipad[ 5]; + tmps[gid].ipad[ 6] = ipad[ 6]; + tmps[gid].ipad[ 7] = ipad[ 7]; + tmps[gid].ipad[ 8] = ipad[ 8]; + tmps[gid].ipad[ 9] = ipad[ 9]; + tmps[gid].ipad[10] = ipad[10]; + tmps[gid].ipad[11] = ipad[11]; + tmps[gid].ipad[12] = ipad[12]; + tmps[gid].ipad[13] = ipad[13]; + tmps[gid].ipad[14] = ipad[14]; + tmps[gid].ipad[15] = ipad[15]; + + tmps[gid].opad[ 0] = opad[ 0]; + tmps[gid].opad[ 1] = opad[ 1]; + tmps[gid].opad[ 2] = opad[ 2]; + tmps[gid].opad[ 3] = opad[ 3]; + tmps[gid].opad[ 4] = opad[ 4]; + tmps[gid].opad[ 5] = opad[ 5]; + tmps[gid].opad[ 6] = opad[ 6]; + tmps[gid].opad[ 7] = opad[ 7]; + tmps[gid].opad[ 8] = opad[ 8]; + tmps[gid].opad[ 9] = opad[ 9]; + tmps[gid].opad[10] = opad[10]; + tmps[gid].opad[11] = opad[11]; + tmps[gid].opad[12] = opad[12]; + tmps[gid].opad[13] = opad[13]; + tmps[gid].opad[14] = opad[14]; + tmps[gid].opad[15] = opad[15]; + + for (u32 i = 0, j = 1; i < (truecrypt_mdlen / 8 / 4); i += 16, j += 1) + { + salt_buf2[0] = j; + + u32 dgst[16]; + + hmac_run2 (salt_buf1, salt_buf2, ipad, opad, dgst, s_Ch, s_Cl); + + tmps[gid].dgst[i + 0] = dgst[ 0]; + tmps[gid].dgst[i + 1] = dgst[ 1]; + tmps[gid].dgst[i + 2] = dgst[ 2]; + tmps[gid].dgst[i + 3] = dgst[ 3]; + tmps[gid].dgst[i + 4] = dgst[ 4]; + tmps[gid].dgst[i + 5] = dgst[ 5]; + tmps[gid].dgst[i + 6] = dgst[ 6]; + tmps[gid].dgst[i + 7] = dgst[ 7]; + tmps[gid].dgst[i + 8] = dgst[ 8]; + tmps[gid].dgst[i + 9] = dgst[ 9]; + tmps[gid].dgst[i + 10] = dgst[10]; + tmps[gid].dgst[i + 11] = dgst[11]; + tmps[gid].dgst[i + 12] = dgst[12]; + tmps[gid].dgst[i + 13] = dgst[13]; + tmps[gid].dgst[i + 14] = dgst[14]; + tmps[gid].dgst[i + 15] = dgst[15]; + + tmps[gid].out[i + 0] = dgst[ 0]; + tmps[gid].out[i + 1] = dgst[ 1]; + tmps[gid].out[i + 2] = dgst[ 2]; + tmps[gid].out[i + 3] = dgst[ 3]; + tmps[gid].out[i + 4] = dgst[ 4]; + tmps[gid].out[i + 5] = dgst[ 5]; + tmps[gid].out[i + 6] = dgst[ 6]; + tmps[gid].out[i + 7] = dgst[ 7]; + tmps[gid].out[i + 8] = dgst[ 8]; + tmps[gid].out[i + 9] = dgst[ 9]; + tmps[gid].out[i + 10] = dgst[10]; + tmps[gid].out[i + 11] = dgst[11]; + tmps[gid].out[i + 12] = dgst[12]; + tmps[gid].out[i + 13] = dgst[13]; + tmps[gid].out[i + 14] = dgst[14]; + tmps[gid].out[i + 15] = dgst[15]; + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m06231_loop (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global tc_tmp_t *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global tc_t *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + const u32 truecrypt_mdlen = salt_bufs[0].truecrypt_mdlen; + + __local u32 s_Ch[8][256]; + __local u32 s_Cl[8][256]; + + const u32 gid = get_global_id (0); + const u32 lid = get_local_id (0); + + const u32 lid4 = lid * 4; + + for (u32 i = 0; i < 8; i++) + { + s_Ch[i][lid4 + 0] = Ch[i][lid4 + 0]; + s_Ch[i][lid4 + 1] = Ch[i][lid4 + 1]; + s_Ch[i][lid4 + 2] = Ch[i][lid4 + 2]; + s_Ch[i][lid4 + 3] = Ch[i][lid4 + 3]; + s_Cl[i][lid4 + 0] = Cl[i][lid4 + 0]; + s_Cl[i][lid4 + 1] = Cl[i][lid4 + 1]; + s_Cl[i][lid4 + 2] = Cl[i][lid4 + 2]; + s_Cl[i][lid4 + 3] = Cl[i][lid4 + 3]; + } + + barrier (CLK_LOCAL_MEM_FENCE); + + if (gid >= gid_max) return; + + u32 ipad[16]; + + ipad[ 0] = tmps[gid].ipad[ 0]; + ipad[ 1] = tmps[gid].ipad[ 1], + ipad[ 2] = tmps[gid].ipad[ 2]; + ipad[ 3] = tmps[gid].ipad[ 3]; + ipad[ 4] = tmps[gid].ipad[ 4]; + ipad[ 5] = tmps[gid].ipad[ 5]; + ipad[ 6] = tmps[gid].ipad[ 6], + ipad[ 7] = tmps[gid].ipad[ 7]; + ipad[ 8] = tmps[gid].ipad[ 8]; + ipad[ 9] = tmps[gid].ipad[ 9]; + ipad[10] = tmps[gid].ipad[10]; + ipad[11] = tmps[gid].ipad[11], + ipad[12] = tmps[gid].ipad[12]; + ipad[13] = tmps[gid].ipad[13]; + ipad[14] = tmps[gid].ipad[14]; + ipad[15] = tmps[gid].ipad[15]; + + u32 opad[16]; + + opad[ 0] = tmps[gid].opad[ 0]; + opad[ 1] = tmps[gid].opad[ 1], + opad[ 2] = tmps[gid].opad[ 2]; + opad[ 3] = tmps[gid].opad[ 3]; + opad[ 4] = tmps[gid].opad[ 4]; + opad[ 5] = tmps[gid].opad[ 5]; + opad[ 6] = tmps[gid].opad[ 6], + opad[ 7] = tmps[gid].opad[ 7]; + opad[ 8] = tmps[gid].opad[ 8]; + opad[ 9] = tmps[gid].opad[ 9]; + opad[10] = tmps[gid].opad[10]; + opad[11] = tmps[gid].opad[11], + opad[12] = tmps[gid].opad[12]; + opad[13] = tmps[gid].opad[13]; + opad[14] = tmps[gid].opad[14]; + opad[15] = tmps[gid].opad[15]; + + for (u32 i = 0; i < (truecrypt_mdlen / 8 / 4); i += 16) + { + u32 dgst[16]; + + dgst[ 0] = tmps[gid].dgst[i + 0]; + dgst[ 1] = tmps[gid].dgst[i + 1]; + dgst[ 2] = tmps[gid].dgst[i + 2]; + dgst[ 3] = tmps[gid].dgst[i + 3]; + dgst[ 4] = tmps[gid].dgst[i + 4]; + dgst[ 5] = tmps[gid].dgst[i + 5]; + dgst[ 6] = tmps[gid].dgst[i + 6]; + dgst[ 7] = tmps[gid].dgst[i + 7]; + dgst[ 8] = tmps[gid].dgst[i + 8]; + dgst[ 9] = tmps[gid].dgst[i + 9]; + dgst[10] = tmps[gid].dgst[i + 10]; + dgst[11] = tmps[gid].dgst[i + 11]; + dgst[12] = tmps[gid].dgst[i + 12]; + dgst[13] = tmps[gid].dgst[i + 13]; + dgst[14] = tmps[gid].dgst[i + 14]; + dgst[15] = tmps[gid].dgst[i + 15]; + + u32 out[16]; + + out[ 0] = tmps[gid].out[i + 0]; + out[ 1] = tmps[gid].out[i + 1]; + out[ 2] = tmps[gid].out[i + 2]; + out[ 3] = tmps[gid].out[i + 3]; + out[ 4] = tmps[gid].out[i + 4]; + out[ 5] = tmps[gid].out[i + 5]; + out[ 6] = tmps[gid].out[i + 6]; + out[ 7] = tmps[gid].out[i + 7]; + out[ 8] = tmps[gid].out[i + 8]; + out[ 9] = tmps[gid].out[i + 9]; + out[10] = tmps[gid].out[i + 10]; + out[11] = tmps[gid].out[i + 11]; + out[12] = tmps[gid].out[i + 12]; + out[13] = tmps[gid].out[i + 13]; + out[14] = tmps[gid].out[i + 14]; + out[15] = tmps[gid].out[i + 15]; + + for (u32 j = 0; j < loop_cnt; j++) + { + u32 w1[16]; + + w1[ 0] = dgst[ 0]; + w1[ 1] = dgst[ 1]; + w1[ 2] = dgst[ 2]; + w1[ 3] = dgst[ 3]; + w1[ 4] = dgst[ 4]; + w1[ 5] = dgst[ 5]; + w1[ 6] = dgst[ 6]; + w1[ 7] = dgst[ 7]; + w1[ 8] = dgst[ 8]; + w1[ 9] = dgst[ 9]; + w1[10] = dgst[10]; + w1[11] = dgst[11]; + w1[12] = dgst[12]; + w1[13] = dgst[13]; + w1[14] = dgst[14]; + w1[15] = dgst[15]; + + u32 w2[16]; + + w2[ 0] = 0x80000000; + w2[ 1] = 0; + w2[ 2] = 0; + w2[ 3] = 0; + w2[ 4] = 0; + w2[ 5] = 0; + w2[ 6] = 0; + w2[ 7] = 0; + w2[ 8] = 0; + w2[ 9] = 0; + w2[10] = 0; + w2[11] = 0; + w2[12] = 0; + w2[13] = 0; + w2[14] = 0; + w2[15] = (64 + 64) * 8; + + hmac_run2 (w1, w2, ipad, opad, dgst, s_Ch, s_Cl); + + out[ 0] ^= dgst[ 0]; + out[ 1] ^= dgst[ 1]; + out[ 2] ^= dgst[ 2]; + out[ 3] ^= dgst[ 3]; + out[ 4] ^= dgst[ 4]; + out[ 5] ^= dgst[ 5]; + out[ 6] ^= dgst[ 6]; + out[ 7] ^= dgst[ 7]; + out[ 8] ^= dgst[ 8]; + out[ 9] ^= dgst[ 9]; + out[10] ^= dgst[10]; + out[11] ^= dgst[11]; + out[12] ^= dgst[12]; + out[13] ^= dgst[13]; + out[14] ^= dgst[14]; + out[15] ^= dgst[15]; + } + + tmps[gid].dgst[i + 0] = dgst[ 0]; + tmps[gid].dgst[i + 1] = dgst[ 1]; + tmps[gid].dgst[i + 2] = dgst[ 2]; + tmps[gid].dgst[i + 3] = dgst[ 3]; + tmps[gid].dgst[i + 4] = dgst[ 4]; + tmps[gid].dgst[i + 5] = dgst[ 5]; + tmps[gid].dgst[i + 6] = dgst[ 6]; + tmps[gid].dgst[i + 7] = dgst[ 7]; + tmps[gid].dgst[i + 8] = dgst[ 8]; + tmps[gid].dgst[i + 9] = dgst[ 9]; + tmps[gid].dgst[i + 10] = dgst[10]; + tmps[gid].dgst[i + 11] = dgst[11]; + tmps[gid].dgst[i + 12] = dgst[12]; + tmps[gid].dgst[i + 13] = dgst[13]; + tmps[gid].dgst[i + 14] = dgst[14]; + tmps[gid].dgst[i + 15] = dgst[15]; + + tmps[gid].out[i + 0] = out[ 0]; + tmps[gid].out[i + 1] = out[ 1]; + tmps[gid].out[i + 2] = out[ 2]; + tmps[gid].out[i + 3] = out[ 3]; + tmps[gid].out[i + 4] = out[ 4]; + tmps[gid].out[i + 5] = out[ 5]; + tmps[gid].out[i + 6] = out[ 6]; + tmps[gid].out[i + 7] = out[ 7]; + tmps[gid].out[i + 8] = out[ 8]; + tmps[gid].out[i + 9] = out[ 9]; + tmps[gid].out[i + 10] = out[10]; + tmps[gid].out[i + 11] = out[11]; + tmps[gid].out[i + 12] = out[12]; + tmps[gid].out[i + 13] = out[13]; + tmps[gid].out[i + 14] = out[14]; + tmps[gid].out[i + 15] = out[15]; + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m06231_comp (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global tc_tmp_t *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global tc_t *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + const u32 lid = get_local_id (0); + + if (gid >= gid_max) return; + + u32 ukey1[8]; + + ukey1[0] = swap_workaround (tmps[gid].out[ 0]); + ukey1[1] = swap_workaround (tmps[gid].out[ 1]); + ukey1[2] = swap_workaround (tmps[gid].out[ 2]); + ukey1[3] = swap_workaround (tmps[gid].out[ 3]); + ukey1[4] = swap_workaround (tmps[gid].out[ 4]); + ukey1[5] = swap_workaround (tmps[gid].out[ 5]); + ukey1[6] = swap_workaround (tmps[gid].out[ 6]); + ukey1[7] = swap_workaround (tmps[gid].out[ 7]); + + u32 ukey2[8]; + + ukey2[0] = swap_workaround (tmps[gid].out[ 8]); + ukey2[1] = swap_workaround (tmps[gid].out[ 9]); + ukey2[2] = swap_workaround (tmps[gid].out[10]); + ukey2[3] = swap_workaround (tmps[gid].out[11]); + ukey2[4] = swap_workaround (tmps[gid].out[12]); + ukey2[5] = swap_workaround (tmps[gid].out[13]); + ukey2[6] = swap_workaround (tmps[gid].out[14]); + ukey2[7] = swap_workaround (tmps[gid].out[15]); + + u32 data[4]; + + data[0] = esalt_bufs[0].data_buf[0]; + data[1] = esalt_bufs[0].data_buf[1]; + data[2] = esalt_bufs[0].data_buf[2]; + data[3] = esalt_bufs[0].data_buf[3]; + + u32 tmp[4]; + + { + tmp[0] = data[0]; + tmp[1] = data[1]; + tmp[2] = data[2]; + tmp[3] = data[3]; + + aes256_decrypt_xts (ukey1, ukey2, tmp, tmp); + + if (((tmp[0] == 0x45555254) && (tmp[3] == 0)) || ((tmp[0] == 0x45555254) && ((tmp[1] >> 16) <= 5))) + { + mark_hash_s0 (plains_buf, hashes_shown, 0, gid, 0); + + d_return_buf[lid] = 1; + } + } + + { + tmp[0] = data[0]; + tmp[1] = data[1]; + tmp[2] = data[2]; + tmp[3] = data[3]; + + serpent256_decrypt_xts (ukey1, ukey2, tmp, tmp); + + if (((tmp[0] == 0x45555254) && (tmp[3] == 0)) || ((tmp[0] == 0x45555254) && ((tmp[1] >> 16) <= 5))) + { + mark_hash_s0 (plains_buf, hashes_shown, 0, gid, 0); + + d_return_buf[lid] = 1; + } + } + + { + tmp[0] = data[0]; + tmp[1] = data[1]; + tmp[2] = data[2]; + tmp[3] = data[3]; + + twofish256_decrypt_xts (ukey1, ukey2, tmp, tmp); + + if (((tmp[0] == 0x45555254) && (tmp[3] == 0)) || ((tmp[0] == 0x45555254) && ((tmp[1] >> 16) <= 5))) + { + mark_hash_s0 (plains_buf, hashes_shown, 0, gid, 0); + + d_return_buf[lid] = 1; + } + } +} diff --git a/amd/m06232.cl b/amd/m06232.cl new file mode 100644 index 0000000000..0c22d6a884 --- /dev/null +++ b/amd/m06232.cl @@ -0,0 +1,2078 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _WHIRLPOOL_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW4 +#define VECT_SIZE1 +#endif + +#ifdef VLIW5 +#define VECT_SIZE1 +#endif + +#define DGST_R0 0 +#define DGST_R1 1 +#define DGST_R2 2 +#define DGST_R3 3 + +#include "include/kernel_functions.c" +#include "types_amd.c" +#include "common_amd.c" + +#include "gpu_aes256_amd.c" +#include "gpu_twofish256_amd.c" +#include "gpu_serpent256_amd.c" + +#define R 10 + +#define BOX(S,n,i) (u32) ((S)[(n)][(i)]) + +__constant u32 Ch[8][256] = +{ + { + 0x18186018, 0x23238c23, 0xc6c63fc6, 0xe8e887e8, + 0x87872687, 0xb8b8dab8, 0x01010401, 0x4f4f214f, + 0x3636d836, 0xa6a6a2a6, 0xd2d26fd2, 0xf5f5f3f5, + 0x7979f979, 0x6f6fa16f, 0x91917e91, 0x52525552, + 0x60609d60, 0xbcbccabc, 0x9b9b569b, 0x8e8e028e, + 0xa3a3b6a3, 0x0c0c300c, 0x7b7bf17b, 0x3535d435, + 0x1d1d741d, 0xe0e0a7e0, 0xd7d77bd7, 0xc2c22fc2, + 0x2e2eb82e, 0x4b4b314b, 0xfefedffe, 0x57574157, + 0x15155415, 0x7777c177, 0x3737dc37, 0xe5e5b3e5, + 0x9f9f469f, 0xf0f0e7f0, 0x4a4a354a, 0xdada4fda, + 0x58587d58, 0xc9c903c9, 0x2929a429, 0x0a0a280a, + 0xb1b1feb1, 0xa0a0baa0, 0x6b6bb16b, 0x85852e85, + 0xbdbdcebd, 0x5d5d695d, 0x10104010, 0xf4f4f7f4, + 0xcbcb0bcb, 0x3e3ef83e, 0x05051405, 0x67678167, + 0xe4e4b7e4, 0x27279c27, 0x41411941, 0x8b8b168b, + 0xa7a7a6a7, 0x7d7de97d, 0x95956e95, 0xd8d847d8, + 0xfbfbcbfb, 0xeeee9fee, 0x7c7ced7c, 0x66668566, + 0xdddd53dd, 0x17175c17, 0x47470147, 0x9e9e429e, + 0xcaca0fca, 0x2d2db42d, 0xbfbfc6bf, 0x07071c07, + 0xadad8ead, 0x5a5a755a, 0x83833683, 0x3333cc33, + 0x63639163, 0x02020802, 0xaaaa92aa, 0x7171d971, + 0xc8c807c8, 0x19196419, 0x49493949, 0xd9d943d9, + 0xf2f2eff2, 0xe3e3abe3, 0x5b5b715b, 0x88881a88, + 0x9a9a529a, 0x26269826, 0x3232c832, 0xb0b0fab0, + 0xe9e983e9, 0x0f0f3c0f, 0xd5d573d5, 0x80803a80, + 0xbebec2be, 0xcdcd13cd, 0x3434d034, 0x48483d48, + 0xffffdbff, 0x7a7af57a, 0x90907a90, 0x5f5f615f, + 0x20208020, 0x6868bd68, 0x1a1a681a, 0xaeae82ae, + 0xb4b4eab4, 0x54544d54, 0x93937693, 0x22228822, + 0x64648d64, 0xf1f1e3f1, 0x7373d173, 0x12124812, + 0x40401d40, 0x08082008, 0xc3c32bc3, 0xecec97ec, + 0xdbdb4bdb, 0xa1a1bea1, 0x8d8d0e8d, 0x3d3df43d, + 0x97976697, 0x00000000, 0xcfcf1bcf, 0x2b2bac2b, + 0x7676c576, 0x82823282, 0xd6d67fd6, 0x1b1b6c1b, + 0xb5b5eeb5, 0xafaf86af, 0x6a6ab56a, 0x50505d50, + 0x45450945, 0xf3f3ebf3, 0x3030c030, 0xefef9bef, + 0x3f3ffc3f, 0x55554955, 0xa2a2b2a2, 0xeaea8fea, + 0x65658965, 0xbabad2ba, 0x2f2fbc2f, 0xc0c027c0, + 0xdede5fde, 0x1c1c701c, 0xfdfdd3fd, 0x4d4d294d, + 0x92927292, 0x7575c975, 0x06061806, 0x8a8a128a, + 0xb2b2f2b2, 0xe6e6bfe6, 0x0e0e380e, 0x1f1f7c1f, + 0x62629562, 0xd4d477d4, 0xa8a89aa8, 0x96966296, + 0xf9f9c3f9, 0xc5c533c5, 0x25259425, 0x59597959, + 0x84842a84, 0x7272d572, 0x3939e439, 0x4c4c2d4c, + 0x5e5e655e, 0x7878fd78, 0x3838e038, 0x8c8c0a8c, + 0xd1d163d1, 0xa5a5aea5, 0xe2e2afe2, 0x61619961, + 0xb3b3f6b3, 0x21218421, 0x9c9c4a9c, 0x1e1e781e, + 0x43431143, 0xc7c73bc7, 0xfcfcd7fc, 0x04041004, + 0x51515951, 0x99995e99, 0x6d6da96d, 0x0d0d340d, + 0xfafacffa, 0xdfdf5bdf, 0x7e7ee57e, 0x24249024, + 0x3b3bec3b, 0xabab96ab, 0xcece1fce, 0x11114411, + 0x8f8f068f, 0x4e4e254e, 0xb7b7e6b7, 0xebeb8beb, + 0x3c3cf03c, 0x81813e81, 0x94946a94, 0xf7f7fbf7, + 0xb9b9deb9, 0x13134c13, 0x2c2cb02c, 0xd3d36bd3, + 0xe7e7bbe7, 0x6e6ea56e, 0xc4c437c4, 0x03030c03, + 0x56564556, 0x44440d44, 0x7f7fe17f, 0xa9a99ea9, + 0x2a2aa82a, 0xbbbbd6bb, 0xc1c123c1, 0x53535153, + 0xdcdc57dc, 0x0b0b2c0b, 0x9d9d4e9d, 0x6c6cad6c, + 0x3131c431, 0x7474cd74, 0xf6f6fff6, 0x46460546, + 0xacac8aac, 0x89891e89, 0x14145014, 0xe1e1a3e1, + 0x16165816, 0x3a3ae83a, 0x6969b969, 0x09092409, + 0x7070dd70, 0xb6b6e2b6, 0xd0d067d0, 0xeded93ed, + 0xcccc17cc, 0x42421542, 0x98985a98, 0xa4a4aaa4, + 0x2828a028, 0x5c5c6d5c, 0xf8f8c7f8, 0x86862286, + }, + { + 0xd8181860, 0x2623238c, 0xb8c6c63f, 0xfbe8e887, + 0xcb878726, 0x11b8b8da, 0x09010104, 0x0d4f4f21, + 0x9b3636d8, 0xffa6a6a2, 0x0cd2d26f, 0x0ef5f5f3, + 0x967979f9, 0x306f6fa1, 0x6d91917e, 0xf8525255, + 0x4760609d, 0x35bcbcca, 0x379b9b56, 0x8a8e8e02, + 0xd2a3a3b6, 0x6c0c0c30, 0x847b7bf1, 0x803535d4, + 0xf51d1d74, 0xb3e0e0a7, 0x21d7d77b, 0x9cc2c22f, + 0x432e2eb8, 0x294b4b31, 0x5dfefedf, 0xd5575741, + 0xbd151554, 0xe87777c1, 0x923737dc, 0x9ee5e5b3, + 0x139f9f46, 0x23f0f0e7, 0x204a4a35, 0x44dada4f, + 0xa258587d, 0xcfc9c903, 0x7c2929a4, 0x5a0a0a28, + 0x50b1b1fe, 0xc9a0a0ba, 0x146b6bb1, 0xd985852e, + 0x3cbdbdce, 0x8f5d5d69, 0x90101040, 0x07f4f4f7, + 0xddcbcb0b, 0xd33e3ef8, 0x2d050514, 0x78676781, + 0x97e4e4b7, 0x0227279c, 0x73414119, 0xa78b8b16, + 0xf6a7a7a6, 0xb27d7de9, 0x4995956e, 0x56d8d847, + 0x70fbfbcb, 0xcdeeee9f, 0xbb7c7ced, 0x71666685, + 0x7bdddd53, 0xaf17175c, 0x45474701, 0x1a9e9e42, + 0xd4caca0f, 0x582d2db4, 0x2ebfbfc6, 0x3f07071c, + 0xacadad8e, 0xb05a5a75, 0xef838336, 0xb63333cc, + 0x5c636391, 0x12020208, 0x93aaaa92, 0xde7171d9, + 0xc6c8c807, 0xd1191964, 0x3b494939, 0x5fd9d943, + 0x31f2f2ef, 0xa8e3e3ab, 0xb95b5b71, 0xbc88881a, + 0x3e9a9a52, 0x0b262698, 0xbf3232c8, 0x59b0b0fa, + 0xf2e9e983, 0x770f0f3c, 0x33d5d573, 0xf480803a, + 0x27bebec2, 0xebcdcd13, 0x893434d0, 0x3248483d, + 0x54ffffdb, 0x8d7a7af5, 0x6490907a, 0x9d5f5f61, + 0x3d202080, 0x0f6868bd, 0xca1a1a68, 0xb7aeae82, + 0x7db4b4ea, 0xce54544d, 0x7f939376, 0x2f222288, + 0x6364648d, 0x2af1f1e3, 0xcc7373d1, 0x82121248, + 0x7a40401d, 0x48080820, 0x95c3c32b, 0xdfecec97, + 0x4ddbdb4b, 0xc0a1a1be, 0x918d8d0e, 0xc83d3df4, + 0x5b979766, 0x00000000, 0xf9cfcf1b, 0x6e2b2bac, + 0xe17676c5, 0xe6828232, 0x28d6d67f, 0xc31b1b6c, + 0x74b5b5ee, 0xbeafaf86, 0x1d6a6ab5, 0xea50505d, + 0x57454509, 0x38f3f3eb, 0xad3030c0, 0xc4efef9b, + 0xda3f3ffc, 0xc7555549, 0xdba2a2b2, 0xe9eaea8f, + 0x6a656589, 0x03babad2, 0x4a2f2fbc, 0x8ec0c027, + 0x60dede5f, 0xfc1c1c70, 0x46fdfdd3, 0x1f4d4d29, + 0x76929272, 0xfa7575c9, 0x36060618, 0xae8a8a12, + 0x4bb2b2f2, 0x85e6e6bf, 0x7e0e0e38, 0xe71f1f7c, + 0x55626295, 0x3ad4d477, 0x81a8a89a, 0x52969662, + 0x62f9f9c3, 0xa3c5c533, 0x10252594, 0xab595979, + 0xd084842a, 0xc57272d5, 0xec3939e4, 0x164c4c2d, + 0x945e5e65, 0x9f7878fd, 0xe53838e0, 0x988c8c0a, + 0x17d1d163, 0xe4a5a5ae, 0xa1e2e2af, 0x4e616199, + 0x42b3b3f6, 0x34212184, 0x089c9c4a, 0xee1e1e78, + 0x61434311, 0xb1c7c73b, 0x4ffcfcd7, 0x24040410, + 0xe3515159, 0x2599995e, 0x226d6da9, 0x650d0d34, + 0x79fafacf, 0x69dfdf5b, 0xa97e7ee5, 0x19242490, + 0xfe3b3bec, 0x9aabab96, 0xf0cece1f, 0x99111144, + 0x838f8f06, 0x044e4e25, 0x66b7b7e6, 0xe0ebeb8b, + 0xc13c3cf0, 0xfd81813e, 0x4094946a, 0x1cf7f7fb, + 0x18b9b9de, 0x8b13134c, 0x512c2cb0, 0x05d3d36b, + 0x8ce7e7bb, 0x396e6ea5, 0xaac4c437, 0x1b03030c, + 0xdc565645, 0x5e44440d, 0xa07f7fe1, 0x88a9a99e, + 0x672a2aa8, 0x0abbbbd6, 0x87c1c123, 0xf1535351, + 0x72dcdc57, 0x530b0b2c, 0x019d9d4e, 0x2b6c6cad, + 0xa43131c4, 0xf37474cd, 0x15f6f6ff, 0x4c464605, + 0xa5acac8a, 0xb589891e, 0xb4141450, 0xbae1e1a3, + 0xa6161658, 0xf73a3ae8, 0x066969b9, 0x41090924, + 0xd77070dd, 0x6fb6b6e2, 0x1ed0d067, 0xd6eded93, + 0xe2cccc17, 0x68424215, 0x2c98985a, 0xeda4a4aa, + 0x752828a0, 0x865c5c6d, 0x6bf8f8c7, 0xc2868622, + }, + { + 0x30d81818, 0x46262323, 0x91b8c6c6, 0xcdfbe8e8, + 0x13cb8787, 0x6d11b8b8, 0x02090101, 0x9e0d4f4f, + 0x6c9b3636, 0x51ffa6a6, 0xb90cd2d2, 0xf70ef5f5, + 0xf2967979, 0xde306f6f, 0x3f6d9191, 0xa4f85252, + 0xc0476060, 0x6535bcbc, 0x2b379b9b, 0x018a8e8e, + 0x5bd2a3a3, 0x186c0c0c, 0xf6847b7b, 0x6a803535, + 0x3af51d1d, 0xddb3e0e0, 0xb321d7d7, 0x999cc2c2, + 0x5c432e2e, 0x96294b4b, 0xe15dfefe, 0xaed55757, + 0x2abd1515, 0xeee87777, 0x6e923737, 0xd79ee5e5, + 0x23139f9f, 0xfd23f0f0, 0x94204a4a, 0xa944dada, + 0xb0a25858, 0x8fcfc9c9, 0x527c2929, 0x145a0a0a, + 0x7f50b1b1, 0x5dc9a0a0, 0xd6146b6b, 0x17d98585, + 0x673cbdbd, 0xba8f5d5d, 0x20901010, 0xf507f4f4, + 0x8bddcbcb, 0x7cd33e3e, 0x0a2d0505, 0xce786767, + 0xd597e4e4, 0x4e022727, 0x82734141, 0x0ba78b8b, + 0x53f6a7a7, 0xfab27d7d, 0x37499595, 0xad56d8d8, + 0xeb70fbfb, 0xc1cdeeee, 0xf8bb7c7c, 0xcc716666, + 0xa77bdddd, 0x2eaf1717, 0x8e454747, 0x211a9e9e, + 0x89d4caca, 0x5a582d2d, 0x632ebfbf, 0x0e3f0707, + 0x47acadad, 0xb4b05a5a, 0x1bef8383, 0x66b63333, + 0xc65c6363, 0x04120202, 0x4993aaaa, 0xe2de7171, + 0x8dc6c8c8, 0x32d11919, 0x923b4949, 0xaf5fd9d9, + 0xf931f2f2, 0xdba8e3e3, 0xb6b95b5b, 0x0dbc8888, + 0x293e9a9a, 0x4c0b2626, 0x64bf3232, 0x7d59b0b0, + 0xcff2e9e9, 0x1e770f0f, 0xb733d5d5, 0x1df48080, + 0x6127bebe, 0x87ebcdcd, 0x68893434, 0x90324848, + 0xe354ffff, 0xf48d7a7a, 0x3d649090, 0xbe9d5f5f, + 0x403d2020, 0xd00f6868, 0x34ca1a1a, 0x41b7aeae, + 0x757db4b4, 0xa8ce5454, 0x3b7f9393, 0x442f2222, + 0xc8636464, 0xff2af1f1, 0xe6cc7373, 0x24821212, + 0x807a4040, 0x10480808, 0x9b95c3c3, 0xc5dfecec, + 0xab4ddbdb, 0x5fc0a1a1, 0x07918d8d, 0x7ac83d3d, + 0x335b9797, 0x00000000, 0x83f9cfcf, 0x566e2b2b, + 0xece17676, 0x19e68282, 0xb128d6d6, 0x36c31b1b, + 0x7774b5b5, 0x43beafaf, 0xd41d6a6a, 0xa0ea5050, + 0x8a574545, 0xfb38f3f3, 0x60ad3030, 0xc3c4efef, + 0x7eda3f3f, 0xaac75555, 0x59dba2a2, 0xc9e9eaea, + 0xca6a6565, 0x6903baba, 0x5e4a2f2f, 0x9d8ec0c0, + 0xa160dede, 0x38fc1c1c, 0xe746fdfd, 0x9a1f4d4d, + 0x39769292, 0xeafa7575, 0x0c360606, 0x09ae8a8a, + 0x794bb2b2, 0xd185e6e6, 0x1c7e0e0e, 0x3ee71f1f, + 0xc4556262, 0xb53ad4d4, 0x4d81a8a8, 0x31529696, + 0xef62f9f9, 0x97a3c5c5, 0x4a102525, 0xb2ab5959, + 0x15d08484, 0xe4c57272, 0x72ec3939, 0x98164c4c, + 0xbc945e5e, 0xf09f7878, 0x70e53838, 0x05988c8c, + 0xbf17d1d1, 0x57e4a5a5, 0xd9a1e2e2, 0xc24e6161, + 0x7b42b3b3, 0x42342121, 0x25089c9c, 0x3cee1e1e, + 0x86614343, 0x93b1c7c7, 0xe54ffcfc, 0x08240404, + 0xa2e35151, 0x2f259999, 0xda226d6d, 0x1a650d0d, + 0xe979fafa, 0xa369dfdf, 0xfca97e7e, 0x48192424, + 0x76fe3b3b, 0x4b9aabab, 0x81f0cece, 0x22991111, + 0x03838f8f, 0x9c044e4e, 0x7366b7b7, 0xcbe0ebeb, + 0x78c13c3c, 0x1ffd8181, 0x35409494, 0xf31cf7f7, + 0x6f18b9b9, 0x268b1313, 0x58512c2c, 0xbb05d3d3, + 0xd38ce7e7, 0xdc396e6e, 0x95aac4c4, 0x061b0303, + 0xacdc5656, 0x885e4444, 0xfea07f7f, 0x4f88a9a9, + 0x54672a2a, 0x6b0abbbb, 0x9f87c1c1, 0xa6f15353, + 0xa572dcdc, 0x16530b0b, 0x27019d9d, 0xd82b6c6c, + 0x62a43131, 0xe8f37474, 0xf115f6f6, 0x8c4c4646, + 0x45a5acac, 0x0fb58989, 0x28b41414, 0xdfbae1e1, + 0x2ca61616, 0x74f73a3a, 0xd2066969, 0x12410909, + 0xe0d77070, 0x716fb6b6, 0xbd1ed0d0, 0xc7d6eded, + 0x85e2cccc, 0x84684242, 0x2d2c9898, 0x55eda4a4, + 0x50752828, 0xb8865c5c, 0xed6bf8f8, 0x11c28686, + }, + { + 0x7830d818, 0xaf462623, 0xf991b8c6, 0x6fcdfbe8, + 0xa113cb87, 0x626d11b8, 0x05020901, 0x6e9e0d4f, + 0xee6c9b36, 0x0451ffa6, 0xbdb90cd2, 0x06f70ef5, + 0x80f29679, 0xcede306f, 0xef3f6d91, 0x07a4f852, + 0xfdc04760, 0x766535bc, 0xcd2b379b, 0x8c018a8e, + 0x155bd2a3, 0x3c186c0c, 0x8af6847b, 0xe16a8035, + 0x693af51d, 0x47ddb3e0, 0xacb321d7, 0xed999cc2, + 0x965c432e, 0x7a96294b, 0x21e15dfe, 0x16aed557, + 0x412abd15, 0xb6eee877, 0xeb6e9237, 0x56d79ee5, + 0xd923139f, 0x17fd23f0, 0x7f94204a, 0x95a944da, + 0x25b0a258, 0xca8fcfc9, 0x8d527c29, 0x22145a0a, + 0x4f7f50b1, 0x1a5dc9a0, 0xdad6146b, 0xab17d985, + 0x73673cbd, 0x34ba8f5d, 0x50209010, 0x03f507f4, + 0xc08bddcb, 0xc67cd33e, 0x110a2d05, 0xe6ce7867, + 0x53d597e4, 0xbb4e0227, 0x58827341, 0x9d0ba78b, + 0x0153f6a7, 0x94fab27d, 0xfb374995, 0x9fad56d8, + 0x30eb70fb, 0x71c1cdee, 0x91f8bb7c, 0xe3cc7166, + 0x8ea77bdd, 0x4b2eaf17, 0x468e4547, 0xdc211a9e, + 0xc589d4ca, 0x995a582d, 0x79632ebf, 0x1b0e3f07, + 0x2347acad, 0x2fb4b05a, 0xb51bef83, 0xff66b633, + 0xf2c65c63, 0x0a041202, 0x384993aa, 0xa8e2de71, + 0xcf8dc6c8, 0x7d32d119, 0x70923b49, 0x9aaf5fd9, + 0x1df931f2, 0x48dba8e3, 0x2ab6b95b, 0x920dbc88, + 0xc8293e9a, 0xbe4c0b26, 0xfa64bf32, 0x4a7d59b0, + 0x6acff2e9, 0x331e770f, 0xa6b733d5, 0xba1df480, + 0x7c6127be, 0xde87ebcd, 0xe4688934, 0x75903248, + 0x24e354ff, 0x8ff48d7a, 0xea3d6490, 0x3ebe9d5f, + 0xa0403d20, 0xd5d00f68, 0x7234ca1a, 0x2c41b7ae, + 0x5e757db4, 0x19a8ce54, 0xe53b7f93, 0xaa442f22, + 0xe9c86364, 0x12ff2af1, 0xa2e6cc73, 0x5a248212, + 0x5d807a40, 0x28104808, 0xe89b95c3, 0x7bc5dfec, + 0x90ab4ddb, 0x1f5fc0a1, 0x8307918d, 0xc97ac83d, + 0xf1335b97, 0x00000000, 0xd483f9cf, 0x87566e2b, + 0xb3ece176, 0xb019e682, 0xa9b128d6, 0x7736c31b, + 0x5b7774b5, 0x2943beaf, 0xdfd41d6a, 0x0da0ea50, + 0x4c8a5745, 0x18fb38f3, 0xf060ad30, 0x74c3c4ef, + 0xc37eda3f, 0x1caac755, 0x1059dba2, 0x65c9e9ea, + 0xecca6a65, 0x686903ba, 0x935e4a2f, 0xe79d8ec0, + 0x81a160de, 0x6c38fc1c, 0x2ee746fd, 0x649a1f4d, + 0xe0397692, 0xbceafa75, 0x1e0c3606, 0x9809ae8a, + 0x40794bb2, 0x59d185e6, 0x361c7e0e, 0x633ee71f, + 0xf7c45562, 0xa3b53ad4, 0x324d81a8, 0xf4315296, + 0x3aef62f9, 0xf697a3c5, 0xb14a1025, 0x20b2ab59, + 0xae15d084, 0xa7e4c572, 0xdd72ec39, 0x6198164c, + 0x3bbc945e, 0x85f09f78, 0xd870e538, 0x8605988c, + 0xb2bf17d1, 0x0b57e4a5, 0x4dd9a1e2, 0xf8c24e61, + 0x457b42b3, 0xa5423421, 0xd625089c, 0x663cee1e, + 0x52866143, 0xfc93b1c7, 0x2be54ffc, 0x14082404, + 0x08a2e351, 0xc72f2599, 0xc4da226d, 0x391a650d, + 0x35e979fa, 0x84a369df, 0x9bfca97e, 0xb4481924, + 0xd776fe3b, 0x3d4b9aab, 0xd181f0ce, 0x55229911, + 0x8903838f, 0x6b9c044e, 0x517366b7, 0x60cbe0eb, + 0xcc78c13c, 0xbf1ffd81, 0xfe354094, 0x0cf31cf7, + 0x676f18b9, 0x5f268b13, 0x9c58512c, 0xb8bb05d3, + 0x5cd38ce7, 0xcbdc396e, 0xf395aac4, 0x0f061b03, + 0x13acdc56, 0x49885e44, 0x9efea07f, 0x374f88a9, + 0x8254672a, 0x6d6b0abb, 0xe29f87c1, 0x02a6f153, + 0x8ba572dc, 0x2716530b, 0xd327019d, 0xc1d82b6c, + 0xf562a431, 0xb9e8f374, 0x09f115f6, 0x438c4c46, + 0x2645a5ac, 0x970fb589, 0x4428b414, 0x42dfbae1, + 0x4e2ca616, 0xd274f73a, 0xd0d20669, 0x2d124109, + 0xade0d770, 0x54716fb6, 0xb7bd1ed0, 0x7ec7d6ed, + 0xdb85e2cc, 0x57846842, 0xc22d2c98, 0x0e55eda4, + 0x88507528, 0x31b8865c, 0x3fed6bf8, 0xa411c286, + }, + { + 0xc07830d8, 0x05af4626, 0x7ef991b8, 0x136fcdfb, + 0x4ca113cb, 0xa9626d11, 0x08050209, 0x426e9e0d, + 0xadee6c9b, 0x590451ff, 0xdebdb90c, 0xfb06f70e, + 0xef80f296, 0x5fcede30, 0xfcef3f6d, 0xaa07a4f8, + 0x27fdc047, 0x89766535, 0xaccd2b37, 0x048c018a, + 0x71155bd2, 0x603c186c, 0xff8af684, 0xb5e16a80, + 0xe8693af5, 0x5347ddb3, 0xf6acb321, 0x5eed999c, + 0x6d965c43, 0x627a9629, 0xa321e15d, 0x8216aed5, + 0xa8412abd, 0x9fb6eee8, 0xa5eb6e92, 0x7b56d79e, + 0x8cd92313, 0xd317fd23, 0x6a7f9420, 0x9e95a944, + 0xfa25b0a2, 0x06ca8fcf, 0x558d527c, 0x5022145a, + 0xe14f7f50, 0x691a5dc9, 0x7fdad614, 0x5cab17d9, + 0x8173673c, 0xd234ba8f, 0x80502090, 0xf303f507, + 0x16c08bdd, 0xedc67cd3, 0x28110a2d, 0x1fe6ce78, + 0x7353d597, 0x25bb4e02, 0x32588273, 0x2c9d0ba7, + 0x510153f6, 0xcf94fab2, 0xdcfb3749, 0x8e9fad56, + 0x8b30eb70, 0x2371c1cd, 0xc791f8bb, 0x17e3cc71, + 0xa68ea77b, 0xb84b2eaf, 0x02468e45, 0x84dc211a, + 0x1ec589d4, 0x75995a58, 0x9179632e, 0x381b0e3f, + 0x012347ac, 0xea2fb4b0, 0x6cb51bef, 0x85ff66b6, + 0x3ff2c65c, 0x100a0412, 0x39384993, 0xafa8e2de, + 0x0ecf8dc6, 0xc87d32d1, 0x7270923b, 0x869aaf5f, + 0xc31df931, 0x4b48dba8, 0xe22ab6b9, 0x34920dbc, + 0xa4c8293e, 0x2dbe4c0b, 0x8dfa64bf, 0xe94a7d59, + 0x1b6acff2, 0x78331e77, 0xe6a6b733, 0x74ba1df4, + 0x997c6127, 0x26de87eb, 0xbde46889, 0x7a759032, + 0xab24e354, 0xf78ff48d, 0xf4ea3d64, 0xc23ebe9d, + 0x1da0403d, 0x67d5d00f, 0xd07234ca, 0x192c41b7, + 0xc95e757d, 0x9a19a8ce, 0xece53b7f, 0x0daa442f, + 0x07e9c863, 0xdb12ff2a, 0xbfa2e6cc, 0x905a2482, + 0x3a5d807a, 0x40281048, 0x56e89b95, 0x337bc5df, + 0x9690ab4d, 0x611f5fc0, 0x1c830791, 0xf5c97ac8, + 0xccf1335b, 0x00000000, 0x36d483f9, 0x4587566e, + 0x97b3ece1, 0x64b019e6, 0xfea9b128, 0xd87736c3, + 0xc15b7774, 0x112943be, 0x77dfd41d, 0xba0da0ea, + 0x124c8a57, 0xcb18fb38, 0x9df060ad, 0x2b74c3c4, + 0xe5c37eda, 0x921caac7, 0x791059db, 0x0365c9e9, + 0x0fecca6a, 0xb9686903, 0x65935e4a, 0x4ee79d8e, + 0xbe81a160, 0xe06c38fc, 0xbb2ee746, 0x52649a1f, + 0xe4e03976, 0x8fbceafa, 0x301e0c36, 0x249809ae, + 0xf940794b, 0x6359d185, 0x70361c7e, 0xf8633ee7, + 0x37f7c455, 0xeea3b53a, 0x29324d81, 0xc4f43152, + 0x9b3aef62, 0x66f697a3, 0x35b14a10, 0xf220b2ab, + 0x54ae15d0, 0xb7a7e4c5, 0xd5dd72ec, 0x5a619816, + 0xca3bbc94, 0xe785f09f, 0xddd870e5, 0x14860598, + 0xc6b2bf17, 0x410b57e4, 0x434dd9a1, 0x2ff8c24e, + 0xf1457b42, 0x15a54234, 0x94d62508, 0xf0663cee, + 0x22528661, 0x76fc93b1, 0xb32be54f, 0x20140824, + 0xb208a2e3, 0xbcc72f25, 0x4fc4da22, 0x68391a65, + 0x8335e979, 0xb684a369, 0xd79bfca9, 0x3db44819, + 0xc5d776fe, 0x313d4b9a, 0x3ed181f0, 0x88552299, + 0x0c890383, 0x4a6b9c04, 0xd1517366, 0x0b60cbe0, + 0xfdcc78c1, 0x7cbf1ffd, 0xd4fe3540, 0xeb0cf31c, + 0xa1676f18, 0x985f268b, 0x7d9c5851, 0xd6b8bb05, + 0x6b5cd38c, 0x57cbdc39, 0x6ef395aa, 0x180f061b, + 0x8a13acdc, 0x1a49885e, 0xdf9efea0, 0x21374f88, + 0x4d825467, 0xb16d6b0a, 0x46e29f87, 0xa202a6f1, + 0xae8ba572, 0x58271653, 0x9cd32701, 0x47c1d82b, + 0x95f562a4, 0x87b9e8f3, 0xe309f115, 0x0a438c4c, + 0x092645a5, 0x3c970fb5, 0xa04428b4, 0x5b42dfba, + 0xb04e2ca6, 0xcdd274f7, 0x6fd0d206, 0x482d1241, + 0xa7ade0d7, 0xd954716f, 0xceb7bd1e, 0x3b7ec7d6, + 0x2edb85e2, 0x2a578468, 0xb4c22d2c, 0x490e55ed, + 0x5d885075, 0xda31b886, 0x933fed6b, 0x44a411c2, + }, + { + 0x18c07830, 0x2305af46, 0xc67ef991, 0xe8136fcd, + 0x874ca113, 0xb8a9626d, 0x01080502, 0x4f426e9e, + 0x36adee6c, 0xa6590451, 0xd2debdb9, 0xf5fb06f7, + 0x79ef80f2, 0x6f5fcede, 0x91fcef3f, 0x52aa07a4, + 0x6027fdc0, 0xbc897665, 0x9baccd2b, 0x8e048c01, + 0xa371155b, 0x0c603c18, 0x7bff8af6, 0x35b5e16a, + 0x1de8693a, 0xe05347dd, 0xd7f6acb3, 0xc25eed99, + 0x2e6d965c, 0x4b627a96, 0xfea321e1, 0x578216ae, + 0x15a8412a, 0x779fb6ee, 0x37a5eb6e, 0xe57b56d7, + 0x9f8cd923, 0xf0d317fd, 0x4a6a7f94, 0xda9e95a9, + 0x58fa25b0, 0xc906ca8f, 0x29558d52, 0x0a502214, + 0xb1e14f7f, 0xa0691a5d, 0x6b7fdad6, 0x855cab17, + 0xbd817367, 0x5dd234ba, 0x10805020, 0xf4f303f5, + 0xcb16c08b, 0x3eedc67c, 0x0528110a, 0x671fe6ce, + 0xe47353d5, 0x2725bb4e, 0x41325882, 0x8b2c9d0b, + 0xa7510153, 0x7dcf94fa, 0x95dcfb37, 0xd88e9fad, + 0xfb8b30eb, 0xee2371c1, 0x7cc791f8, 0x6617e3cc, + 0xdda68ea7, 0x17b84b2e, 0x4702468e, 0x9e84dc21, + 0xca1ec589, 0x2d75995a, 0xbf917963, 0x07381b0e, + 0xad012347, 0x5aea2fb4, 0x836cb51b, 0x3385ff66, + 0x633ff2c6, 0x02100a04, 0xaa393849, 0x71afa8e2, + 0xc80ecf8d, 0x19c87d32, 0x49727092, 0xd9869aaf, + 0xf2c31df9, 0xe34b48db, 0x5be22ab6, 0x8834920d, + 0x9aa4c829, 0x262dbe4c, 0x328dfa64, 0xb0e94a7d, + 0xe91b6acf, 0x0f78331e, 0xd5e6a6b7, 0x8074ba1d, + 0xbe997c61, 0xcd26de87, 0x34bde468, 0x487a7590, + 0xffab24e3, 0x7af78ff4, 0x90f4ea3d, 0x5fc23ebe, + 0x201da040, 0x6867d5d0, 0x1ad07234, 0xae192c41, + 0xb4c95e75, 0x549a19a8, 0x93ece53b, 0x220daa44, + 0x6407e9c8, 0xf1db12ff, 0x73bfa2e6, 0x12905a24, + 0x403a5d80, 0x08402810, 0xc356e89b, 0xec337bc5, + 0xdb9690ab, 0xa1611f5f, 0x8d1c8307, 0x3df5c97a, + 0x97ccf133, 0x00000000, 0xcf36d483, 0x2b458756, + 0x7697b3ec, 0x8264b019, 0xd6fea9b1, 0x1bd87736, + 0xb5c15b77, 0xaf112943, 0x6a77dfd4, 0x50ba0da0, + 0x45124c8a, 0xf3cb18fb, 0x309df060, 0xef2b74c3, + 0x3fe5c37e, 0x55921caa, 0xa2791059, 0xea0365c9, + 0x650fecca, 0xbab96869, 0x2f65935e, 0xc04ee79d, + 0xdebe81a1, 0x1ce06c38, 0xfdbb2ee7, 0x4d52649a, + 0x92e4e039, 0x758fbcea, 0x06301e0c, 0x8a249809, + 0xb2f94079, 0xe66359d1, 0x0e70361c, 0x1ff8633e, + 0x6237f7c4, 0xd4eea3b5, 0xa829324d, 0x96c4f431, + 0xf99b3aef, 0xc566f697, 0x2535b14a, 0x59f220b2, + 0x8454ae15, 0x72b7a7e4, 0x39d5dd72, 0x4c5a6198, + 0x5eca3bbc, 0x78e785f0, 0x38ddd870, 0x8c148605, + 0xd1c6b2bf, 0xa5410b57, 0xe2434dd9, 0x612ff8c2, + 0xb3f1457b, 0x2115a542, 0x9c94d625, 0x1ef0663c, + 0x43225286, 0xc776fc93, 0xfcb32be5, 0x04201408, + 0x51b208a2, 0x99bcc72f, 0x6d4fc4da, 0x0d68391a, + 0xfa8335e9, 0xdfb684a3, 0x7ed79bfc, 0x243db448, + 0x3bc5d776, 0xab313d4b, 0xce3ed181, 0x11885522, + 0x8f0c8903, 0x4e4a6b9c, 0xb7d15173, 0xeb0b60cb, + 0x3cfdcc78, 0x817cbf1f, 0x94d4fe35, 0xf7eb0cf3, + 0xb9a1676f, 0x13985f26, 0x2c7d9c58, 0xd3d6b8bb, + 0xe76b5cd3, 0x6e57cbdc, 0xc46ef395, 0x03180f06, + 0x568a13ac, 0x441a4988, 0x7fdf9efe, 0xa921374f, + 0x2a4d8254, 0xbbb16d6b, 0xc146e29f, 0x53a202a6, + 0xdcae8ba5, 0x0b582716, 0x9d9cd327, 0x6c47c1d8, + 0x3195f562, 0x7487b9e8, 0xf6e309f1, 0x460a438c, + 0xac092645, 0x893c970f, 0x14a04428, 0xe15b42df, + 0x16b04e2c, 0x3acdd274, 0x696fd0d2, 0x09482d12, + 0x70a7ade0, 0xb6d95471, 0xd0ceb7bd, 0xed3b7ec7, + 0xcc2edb85, 0x422a5784, 0x98b4c22d, 0xa4490e55, + 0x285d8850, 0x5cda31b8, 0xf8933fed, 0x8644a411, + }, + { + 0x6018c078, 0x8c2305af, 0x3fc67ef9, 0x87e8136f, + 0x26874ca1, 0xdab8a962, 0x04010805, 0x214f426e, + 0xd836adee, 0xa2a65904, 0x6fd2debd, 0xf3f5fb06, + 0xf979ef80, 0xa16f5fce, 0x7e91fcef, 0x5552aa07, + 0x9d6027fd, 0xcabc8976, 0x569baccd, 0x028e048c, + 0xb6a37115, 0x300c603c, 0xf17bff8a, 0xd435b5e1, + 0x741de869, 0xa7e05347, 0x7bd7f6ac, 0x2fc25eed, + 0xb82e6d96, 0x314b627a, 0xdffea321, 0x41578216, + 0x5415a841, 0xc1779fb6, 0xdc37a5eb, 0xb3e57b56, + 0x469f8cd9, 0xe7f0d317, 0x354a6a7f, 0x4fda9e95, + 0x7d58fa25, 0x03c906ca, 0xa429558d, 0x280a5022, + 0xfeb1e14f, 0xbaa0691a, 0xb16b7fda, 0x2e855cab, + 0xcebd8173, 0x695dd234, 0x40108050, 0xf7f4f303, + 0x0bcb16c0, 0xf83eedc6, 0x14052811, 0x81671fe6, + 0xb7e47353, 0x9c2725bb, 0x19413258, 0x168b2c9d, + 0xa6a75101, 0xe97dcf94, 0x6e95dcfb, 0x47d88e9f, + 0xcbfb8b30, 0x9fee2371, 0xed7cc791, 0x856617e3, + 0x53dda68e, 0x5c17b84b, 0x01470246, 0x429e84dc, + 0x0fca1ec5, 0xb42d7599, 0xc6bf9179, 0x1c07381b, + 0x8ead0123, 0x755aea2f, 0x36836cb5, 0xcc3385ff, + 0x91633ff2, 0x0802100a, 0x92aa3938, 0xd971afa8, + 0x07c80ecf, 0x6419c87d, 0x39497270, 0x43d9869a, + 0xeff2c31d, 0xabe34b48, 0x715be22a, 0x1a883492, + 0x529aa4c8, 0x98262dbe, 0xc8328dfa, 0xfab0e94a, + 0x83e91b6a, 0x3c0f7833, 0x73d5e6a6, 0x3a8074ba, + 0xc2be997c, 0x13cd26de, 0xd034bde4, 0x3d487a75, + 0xdbffab24, 0xf57af78f, 0x7a90f4ea, 0x615fc23e, + 0x80201da0, 0xbd6867d5, 0x681ad072, 0x82ae192c, + 0xeab4c95e, 0x4d549a19, 0x7693ece5, 0x88220daa, + 0x8d6407e9, 0xe3f1db12, 0xd173bfa2, 0x4812905a, + 0x1d403a5d, 0x20084028, 0x2bc356e8, 0x97ec337b, + 0x4bdb9690, 0xbea1611f, 0x0e8d1c83, 0xf43df5c9, + 0x6697ccf1, 0x00000000, 0x1bcf36d4, 0xac2b4587, + 0xc57697b3, 0x328264b0, 0x7fd6fea9, 0x6c1bd877, + 0xeeb5c15b, 0x86af1129, 0xb56a77df, 0x5d50ba0d, + 0x0945124c, 0xebf3cb18, 0xc0309df0, 0x9bef2b74, + 0xfc3fe5c3, 0x4955921c, 0xb2a27910, 0x8fea0365, + 0x89650fec, 0xd2bab968, 0xbc2f6593, 0x27c04ee7, + 0x5fdebe81, 0x701ce06c, 0xd3fdbb2e, 0x294d5264, + 0x7292e4e0, 0xc9758fbc, 0x1806301e, 0x128a2498, + 0xf2b2f940, 0xbfe66359, 0x380e7036, 0x7c1ff863, + 0x956237f7, 0x77d4eea3, 0x9aa82932, 0x6296c4f4, + 0xc3f99b3a, 0x33c566f6, 0x942535b1, 0x7959f220, + 0x2a8454ae, 0xd572b7a7, 0xe439d5dd, 0x2d4c5a61, + 0x655eca3b, 0xfd78e785, 0xe038ddd8, 0x0a8c1486, + 0x63d1c6b2, 0xaea5410b, 0xafe2434d, 0x99612ff8, + 0xf6b3f145, 0x842115a5, 0x4a9c94d6, 0x781ef066, + 0x11432252, 0x3bc776fc, 0xd7fcb32b, 0x10042014, + 0x5951b208, 0x5e99bcc7, 0xa96d4fc4, 0x340d6839, + 0xcffa8335, 0x5bdfb684, 0xe57ed79b, 0x90243db4, + 0xec3bc5d7, 0x96ab313d, 0x1fce3ed1, 0x44118855, + 0x068f0c89, 0x254e4a6b, 0xe6b7d151, 0x8beb0b60, + 0xf03cfdcc, 0x3e817cbf, 0x6a94d4fe, 0xfbf7eb0c, + 0xdeb9a167, 0x4c13985f, 0xb02c7d9c, 0x6bd3d6b8, + 0xbbe76b5c, 0xa56e57cb, 0x37c46ef3, 0x0c03180f, + 0x45568a13, 0x0d441a49, 0xe17fdf9e, 0x9ea92137, + 0xa82a4d82, 0xd6bbb16d, 0x23c146e2, 0x5153a202, + 0x57dcae8b, 0x2c0b5827, 0x4e9d9cd3, 0xad6c47c1, + 0xc43195f5, 0xcd7487b9, 0xfff6e309, 0x05460a43, + 0x8aac0926, 0x1e893c97, 0x5014a044, 0xa3e15b42, + 0x5816b04e, 0xe83acdd2, 0xb9696fd0, 0x2409482d, + 0xdd70a7ad, 0xe2b6d954, 0x67d0ceb7, 0x93ed3b7e, + 0x17cc2edb, 0x15422a57, 0x5a98b4c2, 0xaaa4490e, + 0xa0285d88, 0x6d5cda31, 0xc7f8933f, 0x228644a4, + }, + { + 0x186018c0, 0x238c2305, 0xc63fc67e, 0xe887e813, + 0x8726874c, 0xb8dab8a9, 0x01040108, 0x4f214f42, + 0x36d836ad, 0xa6a2a659, 0xd26fd2de, 0xf5f3f5fb, + 0x79f979ef, 0x6fa16f5f, 0x917e91fc, 0x525552aa, + 0x609d6027, 0xbccabc89, 0x9b569bac, 0x8e028e04, + 0xa3b6a371, 0x0c300c60, 0x7bf17bff, 0x35d435b5, + 0x1d741de8, 0xe0a7e053, 0xd77bd7f6, 0xc22fc25e, + 0x2eb82e6d, 0x4b314b62, 0xfedffea3, 0x57415782, + 0x155415a8, 0x77c1779f, 0x37dc37a5, 0xe5b3e57b, + 0x9f469f8c, 0xf0e7f0d3, 0x4a354a6a, 0xda4fda9e, + 0x587d58fa, 0xc903c906, 0x29a42955, 0x0a280a50, + 0xb1feb1e1, 0xa0baa069, 0x6bb16b7f, 0x852e855c, + 0xbdcebd81, 0x5d695dd2, 0x10401080, 0xf4f7f4f3, + 0xcb0bcb16, 0x3ef83eed, 0x05140528, 0x6781671f, + 0xe4b7e473, 0x279c2725, 0x41194132, 0x8b168b2c, + 0xa7a6a751, 0x7de97dcf, 0x956e95dc, 0xd847d88e, + 0xfbcbfb8b, 0xee9fee23, 0x7ced7cc7, 0x66856617, + 0xdd53dda6, 0x175c17b8, 0x47014702, 0x9e429e84, + 0xca0fca1e, 0x2db42d75, 0xbfc6bf91, 0x071c0738, + 0xad8ead01, 0x5a755aea, 0x8336836c, 0x33cc3385, + 0x6391633f, 0x02080210, 0xaa92aa39, 0x71d971af, + 0xc807c80e, 0x196419c8, 0x49394972, 0xd943d986, + 0xf2eff2c3, 0xe3abe34b, 0x5b715be2, 0x881a8834, + 0x9a529aa4, 0x2698262d, 0x32c8328d, 0xb0fab0e9, + 0xe983e91b, 0x0f3c0f78, 0xd573d5e6, 0x803a8074, + 0xbec2be99, 0xcd13cd26, 0x34d034bd, 0x483d487a, + 0xffdbffab, 0x7af57af7, 0x907a90f4, 0x5f615fc2, + 0x2080201d, 0x68bd6867, 0x1a681ad0, 0xae82ae19, + 0xb4eab4c9, 0x544d549a, 0x937693ec, 0x2288220d, + 0x648d6407, 0xf1e3f1db, 0x73d173bf, 0x12481290, + 0x401d403a, 0x08200840, 0xc32bc356, 0xec97ec33, + 0xdb4bdb96, 0xa1bea161, 0x8d0e8d1c, 0x3df43df5, + 0x976697cc, 0x00000000, 0xcf1bcf36, 0x2bac2b45, + 0x76c57697, 0x82328264, 0xd67fd6fe, 0x1b6c1bd8, + 0xb5eeb5c1, 0xaf86af11, 0x6ab56a77, 0x505d50ba, + 0x45094512, 0xf3ebf3cb, 0x30c0309d, 0xef9bef2b, + 0x3ffc3fe5, 0x55495592, 0xa2b2a279, 0xea8fea03, + 0x6589650f, 0xbad2bab9, 0x2fbc2f65, 0xc027c04e, + 0xde5fdebe, 0x1c701ce0, 0xfdd3fdbb, 0x4d294d52, + 0x927292e4, 0x75c9758f, 0x06180630, 0x8a128a24, + 0xb2f2b2f9, 0xe6bfe663, 0x0e380e70, 0x1f7c1ff8, + 0x62956237, 0xd477d4ee, 0xa89aa829, 0x966296c4, + 0xf9c3f99b, 0xc533c566, 0x25942535, 0x597959f2, + 0x842a8454, 0x72d572b7, 0x39e439d5, 0x4c2d4c5a, + 0x5e655eca, 0x78fd78e7, 0x38e038dd, 0x8c0a8c14, + 0xd163d1c6, 0xa5aea541, 0xe2afe243, 0x6199612f, + 0xb3f6b3f1, 0x21842115, 0x9c4a9c94, 0x1e781ef0, + 0x43114322, 0xc73bc776, 0xfcd7fcb3, 0x04100420, + 0x515951b2, 0x995e99bc, 0x6da96d4f, 0x0d340d68, + 0xfacffa83, 0xdf5bdfb6, 0x7ee57ed7, 0x2490243d, + 0x3bec3bc5, 0xab96ab31, 0xce1fce3e, 0x11441188, + 0x8f068f0c, 0x4e254e4a, 0xb7e6b7d1, 0xeb8beb0b, + 0x3cf03cfd, 0x813e817c, 0x946a94d4, 0xf7fbf7eb, + 0xb9deb9a1, 0x134c1398, 0x2cb02c7d, 0xd36bd3d6, + 0xe7bbe76b, 0x6ea56e57, 0xc437c46e, 0x030c0318, + 0x5645568a, 0x440d441a, 0x7fe17fdf, 0xa99ea921, + 0x2aa82a4d, 0xbbd6bbb1, 0xc123c146, 0x535153a2, + 0xdc57dcae, 0x0b2c0b58, 0x9d4e9d9c, 0x6cad6c47, + 0x31c43195, 0x74cd7487, 0xf6fff6e3, 0x4605460a, + 0xac8aac09, 0x891e893c, 0x145014a0, 0xe1a3e15b, + 0x165816b0, 0x3ae83acd, 0x69b9696f, 0x09240948, + 0x70dd70a7, 0xb6e2b6d9, 0xd067d0ce, 0xed93ed3b, + 0xcc17cc2e, 0x4215422a, 0x985a98b4, 0xa4aaa449, + 0x28a0285d, 0x5c6d5cda, 0xf8c7f893, 0x86228644, + } +}; + +__constant u32 Cl[8][256] = +{ + { + 0xc07830d8, 0x05af4626, 0x7ef991b8, 0x136fcdfb, + 0x4ca113cb, 0xa9626d11, 0x08050209, 0x426e9e0d, + 0xadee6c9b, 0x590451ff, 0xdebdb90c, 0xfb06f70e, + 0xef80f296, 0x5fcede30, 0xfcef3f6d, 0xaa07a4f8, + 0x27fdc047, 0x89766535, 0xaccd2b37, 0x048c018a, + 0x71155bd2, 0x603c186c, 0xff8af684, 0xb5e16a80, + 0xe8693af5, 0x5347ddb3, 0xf6acb321, 0x5eed999c, + 0x6d965c43, 0x627a9629, 0xa321e15d, 0x8216aed5, + 0xa8412abd, 0x9fb6eee8, 0xa5eb6e92, 0x7b56d79e, + 0x8cd92313, 0xd317fd23, 0x6a7f9420, 0x9e95a944, + 0xfa25b0a2, 0x06ca8fcf, 0x558d527c, 0x5022145a, + 0xe14f7f50, 0x691a5dc9, 0x7fdad614, 0x5cab17d9, + 0x8173673c, 0xd234ba8f, 0x80502090, 0xf303f507, + 0x16c08bdd, 0xedc67cd3, 0x28110a2d, 0x1fe6ce78, + 0x7353d597, 0x25bb4e02, 0x32588273, 0x2c9d0ba7, + 0x510153f6, 0xcf94fab2, 0xdcfb3749, 0x8e9fad56, + 0x8b30eb70, 0x2371c1cd, 0xc791f8bb, 0x17e3cc71, + 0xa68ea77b, 0xb84b2eaf, 0x02468e45, 0x84dc211a, + 0x1ec589d4, 0x75995a58, 0x9179632e, 0x381b0e3f, + 0x012347ac, 0xea2fb4b0, 0x6cb51bef, 0x85ff66b6, + 0x3ff2c65c, 0x100a0412, 0x39384993, 0xafa8e2de, + 0x0ecf8dc6, 0xc87d32d1, 0x7270923b, 0x869aaf5f, + 0xc31df931, 0x4b48dba8, 0xe22ab6b9, 0x34920dbc, + 0xa4c8293e, 0x2dbe4c0b, 0x8dfa64bf, 0xe94a7d59, + 0x1b6acff2, 0x78331e77, 0xe6a6b733, 0x74ba1df4, + 0x997c6127, 0x26de87eb, 0xbde46889, 0x7a759032, + 0xab24e354, 0xf78ff48d, 0xf4ea3d64, 0xc23ebe9d, + 0x1da0403d, 0x67d5d00f, 0xd07234ca, 0x192c41b7, + 0xc95e757d, 0x9a19a8ce, 0xece53b7f, 0x0daa442f, + 0x07e9c863, 0xdb12ff2a, 0xbfa2e6cc, 0x905a2482, + 0x3a5d807a, 0x40281048, 0x56e89b95, 0x337bc5df, + 0x9690ab4d, 0x611f5fc0, 0x1c830791, 0xf5c97ac8, + 0xccf1335b, 0x00000000, 0x36d483f9, 0x4587566e, + 0x97b3ece1, 0x64b019e6, 0xfea9b128, 0xd87736c3, + 0xc15b7774, 0x112943be, 0x77dfd41d, 0xba0da0ea, + 0x124c8a57, 0xcb18fb38, 0x9df060ad, 0x2b74c3c4, + 0xe5c37eda, 0x921caac7, 0x791059db, 0x0365c9e9, + 0x0fecca6a, 0xb9686903, 0x65935e4a, 0x4ee79d8e, + 0xbe81a160, 0xe06c38fc, 0xbb2ee746, 0x52649a1f, + 0xe4e03976, 0x8fbceafa, 0x301e0c36, 0x249809ae, + 0xf940794b, 0x6359d185, 0x70361c7e, 0xf8633ee7, + 0x37f7c455, 0xeea3b53a, 0x29324d81, 0xc4f43152, + 0x9b3aef62, 0x66f697a3, 0x35b14a10, 0xf220b2ab, + 0x54ae15d0, 0xb7a7e4c5, 0xd5dd72ec, 0x5a619816, + 0xca3bbc94, 0xe785f09f, 0xddd870e5, 0x14860598, + 0xc6b2bf17, 0x410b57e4, 0x434dd9a1, 0x2ff8c24e, + 0xf1457b42, 0x15a54234, 0x94d62508, 0xf0663cee, + 0x22528661, 0x76fc93b1, 0xb32be54f, 0x20140824, + 0xb208a2e3, 0xbcc72f25, 0x4fc4da22, 0x68391a65, + 0x8335e979, 0xb684a369, 0xd79bfca9, 0x3db44819, + 0xc5d776fe, 0x313d4b9a, 0x3ed181f0, 0x88552299, + 0x0c890383, 0x4a6b9c04, 0xd1517366, 0x0b60cbe0, + 0xfdcc78c1, 0x7cbf1ffd, 0xd4fe3540, 0xeb0cf31c, + 0xa1676f18, 0x985f268b, 0x7d9c5851, 0xd6b8bb05, + 0x6b5cd38c, 0x57cbdc39, 0x6ef395aa, 0x180f061b, + 0x8a13acdc, 0x1a49885e, 0xdf9efea0, 0x21374f88, + 0x4d825467, 0xb16d6b0a, 0x46e29f87, 0xa202a6f1, + 0xae8ba572, 0x58271653, 0x9cd32701, 0x47c1d82b, + 0x95f562a4, 0x87b9e8f3, 0xe309f115, 0x0a438c4c, + 0x092645a5, 0x3c970fb5, 0xa04428b4, 0x5b42dfba, + 0xb04e2ca6, 0xcdd274f7, 0x6fd0d206, 0x482d1241, + 0xa7ade0d7, 0xd954716f, 0xceb7bd1e, 0x3b7ec7d6, + 0x2edb85e2, 0x2a578468, 0xb4c22d2c, 0x490e55ed, + 0x5d885075, 0xda31b886, 0x933fed6b, 0x44a411c2, + }, + { + 0x18c07830, 0x2305af46, 0xc67ef991, 0xe8136fcd, + 0x874ca113, 0xb8a9626d, 0x01080502, 0x4f426e9e, + 0x36adee6c, 0xa6590451, 0xd2debdb9, 0xf5fb06f7, + 0x79ef80f2, 0x6f5fcede, 0x91fcef3f, 0x52aa07a4, + 0x6027fdc0, 0xbc897665, 0x9baccd2b, 0x8e048c01, + 0xa371155b, 0x0c603c18, 0x7bff8af6, 0x35b5e16a, + 0x1de8693a, 0xe05347dd, 0xd7f6acb3, 0xc25eed99, + 0x2e6d965c, 0x4b627a96, 0xfea321e1, 0x578216ae, + 0x15a8412a, 0x779fb6ee, 0x37a5eb6e, 0xe57b56d7, + 0x9f8cd923, 0xf0d317fd, 0x4a6a7f94, 0xda9e95a9, + 0x58fa25b0, 0xc906ca8f, 0x29558d52, 0x0a502214, + 0xb1e14f7f, 0xa0691a5d, 0x6b7fdad6, 0x855cab17, + 0xbd817367, 0x5dd234ba, 0x10805020, 0xf4f303f5, + 0xcb16c08b, 0x3eedc67c, 0x0528110a, 0x671fe6ce, + 0xe47353d5, 0x2725bb4e, 0x41325882, 0x8b2c9d0b, + 0xa7510153, 0x7dcf94fa, 0x95dcfb37, 0xd88e9fad, + 0xfb8b30eb, 0xee2371c1, 0x7cc791f8, 0x6617e3cc, + 0xdda68ea7, 0x17b84b2e, 0x4702468e, 0x9e84dc21, + 0xca1ec589, 0x2d75995a, 0xbf917963, 0x07381b0e, + 0xad012347, 0x5aea2fb4, 0x836cb51b, 0x3385ff66, + 0x633ff2c6, 0x02100a04, 0xaa393849, 0x71afa8e2, + 0xc80ecf8d, 0x19c87d32, 0x49727092, 0xd9869aaf, + 0xf2c31df9, 0xe34b48db, 0x5be22ab6, 0x8834920d, + 0x9aa4c829, 0x262dbe4c, 0x328dfa64, 0xb0e94a7d, + 0xe91b6acf, 0x0f78331e, 0xd5e6a6b7, 0x8074ba1d, + 0xbe997c61, 0xcd26de87, 0x34bde468, 0x487a7590, + 0xffab24e3, 0x7af78ff4, 0x90f4ea3d, 0x5fc23ebe, + 0x201da040, 0x6867d5d0, 0x1ad07234, 0xae192c41, + 0xb4c95e75, 0x549a19a8, 0x93ece53b, 0x220daa44, + 0x6407e9c8, 0xf1db12ff, 0x73bfa2e6, 0x12905a24, + 0x403a5d80, 0x08402810, 0xc356e89b, 0xec337bc5, + 0xdb9690ab, 0xa1611f5f, 0x8d1c8307, 0x3df5c97a, + 0x97ccf133, 0x00000000, 0xcf36d483, 0x2b458756, + 0x7697b3ec, 0x8264b019, 0xd6fea9b1, 0x1bd87736, + 0xb5c15b77, 0xaf112943, 0x6a77dfd4, 0x50ba0da0, + 0x45124c8a, 0xf3cb18fb, 0x309df060, 0xef2b74c3, + 0x3fe5c37e, 0x55921caa, 0xa2791059, 0xea0365c9, + 0x650fecca, 0xbab96869, 0x2f65935e, 0xc04ee79d, + 0xdebe81a1, 0x1ce06c38, 0xfdbb2ee7, 0x4d52649a, + 0x92e4e039, 0x758fbcea, 0x06301e0c, 0x8a249809, + 0xb2f94079, 0xe66359d1, 0x0e70361c, 0x1ff8633e, + 0x6237f7c4, 0xd4eea3b5, 0xa829324d, 0x96c4f431, + 0xf99b3aef, 0xc566f697, 0x2535b14a, 0x59f220b2, + 0x8454ae15, 0x72b7a7e4, 0x39d5dd72, 0x4c5a6198, + 0x5eca3bbc, 0x78e785f0, 0x38ddd870, 0x8c148605, + 0xd1c6b2bf, 0xa5410b57, 0xe2434dd9, 0x612ff8c2, + 0xb3f1457b, 0x2115a542, 0x9c94d625, 0x1ef0663c, + 0x43225286, 0xc776fc93, 0xfcb32be5, 0x04201408, + 0x51b208a2, 0x99bcc72f, 0x6d4fc4da, 0x0d68391a, + 0xfa8335e9, 0xdfb684a3, 0x7ed79bfc, 0x243db448, + 0x3bc5d776, 0xab313d4b, 0xce3ed181, 0x11885522, + 0x8f0c8903, 0x4e4a6b9c, 0xb7d15173, 0xeb0b60cb, + 0x3cfdcc78, 0x817cbf1f, 0x94d4fe35, 0xf7eb0cf3, + 0xb9a1676f, 0x13985f26, 0x2c7d9c58, 0xd3d6b8bb, + 0xe76b5cd3, 0x6e57cbdc, 0xc46ef395, 0x03180f06, + 0x568a13ac, 0x441a4988, 0x7fdf9efe, 0xa921374f, + 0x2a4d8254, 0xbbb16d6b, 0xc146e29f, 0x53a202a6, + 0xdcae8ba5, 0x0b582716, 0x9d9cd327, 0x6c47c1d8, + 0x3195f562, 0x7487b9e8, 0xf6e309f1, 0x460a438c, + 0xac092645, 0x893c970f, 0x14a04428, 0xe15b42df, + 0x16b04e2c, 0x3acdd274, 0x696fd0d2, 0x09482d12, + 0x70a7ade0, 0xb6d95471, 0xd0ceb7bd, 0xed3b7ec7, + 0xcc2edb85, 0x422a5784, 0x98b4c22d, 0xa4490e55, + 0x285d8850, 0x5cda31b8, 0xf8933fed, 0x8644a411, + }, + { + 0x6018c078, 0x8c2305af, 0x3fc67ef9, 0x87e8136f, + 0x26874ca1, 0xdab8a962, 0x04010805, 0x214f426e, + 0xd836adee, 0xa2a65904, 0x6fd2debd, 0xf3f5fb06, + 0xf979ef80, 0xa16f5fce, 0x7e91fcef, 0x5552aa07, + 0x9d6027fd, 0xcabc8976, 0x569baccd, 0x028e048c, + 0xb6a37115, 0x300c603c, 0xf17bff8a, 0xd435b5e1, + 0x741de869, 0xa7e05347, 0x7bd7f6ac, 0x2fc25eed, + 0xb82e6d96, 0x314b627a, 0xdffea321, 0x41578216, + 0x5415a841, 0xc1779fb6, 0xdc37a5eb, 0xb3e57b56, + 0x469f8cd9, 0xe7f0d317, 0x354a6a7f, 0x4fda9e95, + 0x7d58fa25, 0x03c906ca, 0xa429558d, 0x280a5022, + 0xfeb1e14f, 0xbaa0691a, 0xb16b7fda, 0x2e855cab, + 0xcebd8173, 0x695dd234, 0x40108050, 0xf7f4f303, + 0x0bcb16c0, 0xf83eedc6, 0x14052811, 0x81671fe6, + 0xb7e47353, 0x9c2725bb, 0x19413258, 0x168b2c9d, + 0xa6a75101, 0xe97dcf94, 0x6e95dcfb, 0x47d88e9f, + 0xcbfb8b30, 0x9fee2371, 0xed7cc791, 0x856617e3, + 0x53dda68e, 0x5c17b84b, 0x01470246, 0x429e84dc, + 0x0fca1ec5, 0xb42d7599, 0xc6bf9179, 0x1c07381b, + 0x8ead0123, 0x755aea2f, 0x36836cb5, 0xcc3385ff, + 0x91633ff2, 0x0802100a, 0x92aa3938, 0xd971afa8, + 0x07c80ecf, 0x6419c87d, 0x39497270, 0x43d9869a, + 0xeff2c31d, 0xabe34b48, 0x715be22a, 0x1a883492, + 0x529aa4c8, 0x98262dbe, 0xc8328dfa, 0xfab0e94a, + 0x83e91b6a, 0x3c0f7833, 0x73d5e6a6, 0x3a8074ba, + 0xc2be997c, 0x13cd26de, 0xd034bde4, 0x3d487a75, + 0xdbffab24, 0xf57af78f, 0x7a90f4ea, 0x615fc23e, + 0x80201da0, 0xbd6867d5, 0x681ad072, 0x82ae192c, + 0xeab4c95e, 0x4d549a19, 0x7693ece5, 0x88220daa, + 0x8d6407e9, 0xe3f1db12, 0xd173bfa2, 0x4812905a, + 0x1d403a5d, 0x20084028, 0x2bc356e8, 0x97ec337b, + 0x4bdb9690, 0xbea1611f, 0x0e8d1c83, 0xf43df5c9, + 0x6697ccf1, 0x00000000, 0x1bcf36d4, 0xac2b4587, + 0xc57697b3, 0x328264b0, 0x7fd6fea9, 0x6c1bd877, + 0xeeb5c15b, 0x86af1129, 0xb56a77df, 0x5d50ba0d, + 0x0945124c, 0xebf3cb18, 0xc0309df0, 0x9bef2b74, + 0xfc3fe5c3, 0x4955921c, 0xb2a27910, 0x8fea0365, + 0x89650fec, 0xd2bab968, 0xbc2f6593, 0x27c04ee7, + 0x5fdebe81, 0x701ce06c, 0xd3fdbb2e, 0x294d5264, + 0x7292e4e0, 0xc9758fbc, 0x1806301e, 0x128a2498, + 0xf2b2f940, 0xbfe66359, 0x380e7036, 0x7c1ff863, + 0x956237f7, 0x77d4eea3, 0x9aa82932, 0x6296c4f4, + 0xc3f99b3a, 0x33c566f6, 0x942535b1, 0x7959f220, + 0x2a8454ae, 0xd572b7a7, 0xe439d5dd, 0x2d4c5a61, + 0x655eca3b, 0xfd78e785, 0xe038ddd8, 0x0a8c1486, + 0x63d1c6b2, 0xaea5410b, 0xafe2434d, 0x99612ff8, + 0xf6b3f145, 0x842115a5, 0x4a9c94d6, 0x781ef066, + 0x11432252, 0x3bc776fc, 0xd7fcb32b, 0x10042014, + 0x5951b208, 0x5e99bcc7, 0xa96d4fc4, 0x340d6839, + 0xcffa8335, 0x5bdfb684, 0xe57ed79b, 0x90243db4, + 0xec3bc5d7, 0x96ab313d, 0x1fce3ed1, 0x44118855, + 0x068f0c89, 0x254e4a6b, 0xe6b7d151, 0x8beb0b60, + 0xf03cfdcc, 0x3e817cbf, 0x6a94d4fe, 0xfbf7eb0c, + 0xdeb9a167, 0x4c13985f, 0xb02c7d9c, 0x6bd3d6b8, + 0xbbe76b5c, 0xa56e57cb, 0x37c46ef3, 0x0c03180f, + 0x45568a13, 0x0d441a49, 0xe17fdf9e, 0x9ea92137, + 0xa82a4d82, 0xd6bbb16d, 0x23c146e2, 0x5153a202, + 0x57dcae8b, 0x2c0b5827, 0x4e9d9cd3, 0xad6c47c1, + 0xc43195f5, 0xcd7487b9, 0xfff6e309, 0x05460a43, + 0x8aac0926, 0x1e893c97, 0x5014a044, 0xa3e15b42, + 0x5816b04e, 0xe83acdd2, 0xb9696fd0, 0x2409482d, + 0xdd70a7ad, 0xe2b6d954, 0x67d0ceb7, 0x93ed3b7e, + 0x17cc2edb, 0x15422a57, 0x5a98b4c2, 0xaaa4490e, + 0xa0285d88, 0x6d5cda31, 0xc7f8933f, 0x228644a4, + }, + { + 0x186018c0, 0x238c2305, 0xc63fc67e, 0xe887e813, + 0x8726874c, 0xb8dab8a9, 0x01040108, 0x4f214f42, + 0x36d836ad, 0xa6a2a659, 0xd26fd2de, 0xf5f3f5fb, + 0x79f979ef, 0x6fa16f5f, 0x917e91fc, 0x525552aa, + 0x609d6027, 0xbccabc89, 0x9b569bac, 0x8e028e04, + 0xa3b6a371, 0x0c300c60, 0x7bf17bff, 0x35d435b5, + 0x1d741de8, 0xe0a7e053, 0xd77bd7f6, 0xc22fc25e, + 0x2eb82e6d, 0x4b314b62, 0xfedffea3, 0x57415782, + 0x155415a8, 0x77c1779f, 0x37dc37a5, 0xe5b3e57b, + 0x9f469f8c, 0xf0e7f0d3, 0x4a354a6a, 0xda4fda9e, + 0x587d58fa, 0xc903c906, 0x29a42955, 0x0a280a50, + 0xb1feb1e1, 0xa0baa069, 0x6bb16b7f, 0x852e855c, + 0xbdcebd81, 0x5d695dd2, 0x10401080, 0xf4f7f4f3, + 0xcb0bcb16, 0x3ef83eed, 0x05140528, 0x6781671f, + 0xe4b7e473, 0x279c2725, 0x41194132, 0x8b168b2c, + 0xa7a6a751, 0x7de97dcf, 0x956e95dc, 0xd847d88e, + 0xfbcbfb8b, 0xee9fee23, 0x7ced7cc7, 0x66856617, + 0xdd53dda6, 0x175c17b8, 0x47014702, 0x9e429e84, + 0xca0fca1e, 0x2db42d75, 0xbfc6bf91, 0x071c0738, + 0xad8ead01, 0x5a755aea, 0x8336836c, 0x33cc3385, + 0x6391633f, 0x02080210, 0xaa92aa39, 0x71d971af, + 0xc807c80e, 0x196419c8, 0x49394972, 0xd943d986, + 0xf2eff2c3, 0xe3abe34b, 0x5b715be2, 0x881a8834, + 0x9a529aa4, 0x2698262d, 0x32c8328d, 0xb0fab0e9, + 0xe983e91b, 0x0f3c0f78, 0xd573d5e6, 0x803a8074, + 0xbec2be99, 0xcd13cd26, 0x34d034bd, 0x483d487a, + 0xffdbffab, 0x7af57af7, 0x907a90f4, 0x5f615fc2, + 0x2080201d, 0x68bd6867, 0x1a681ad0, 0xae82ae19, + 0xb4eab4c9, 0x544d549a, 0x937693ec, 0x2288220d, + 0x648d6407, 0xf1e3f1db, 0x73d173bf, 0x12481290, + 0x401d403a, 0x08200840, 0xc32bc356, 0xec97ec33, + 0xdb4bdb96, 0xa1bea161, 0x8d0e8d1c, 0x3df43df5, + 0x976697cc, 0x00000000, 0xcf1bcf36, 0x2bac2b45, + 0x76c57697, 0x82328264, 0xd67fd6fe, 0x1b6c1bd8, + 0xb5eeb5c1, 0xaf86af11, 0x6ab56a77, 0x505d50ba, + 0x45094512, 0xf3ebf3cb, 0x30c0309d, 0xef9bef2b, + 0x3ffc3fe5, 0x55495592, 0xa2b2a279, 0xea8fea03, + 0x6589650f, 0xbad2bab9, 0x2fbc2f65, 0xc027c04e, + 0xde5fdebe, 0x1c701ce0, 0xfdd3fdbb, 0x4d294d52, + 0x927292e4, 0x75c9758f, 0x06180630, 0x8a128a24, + 0xb2f2b2f9, 0xe6bfe663, 0x0e380e70, 0x1f7c1ff8, + 0x62956237, 0xd477d4ee, 0xa89aa829, 0x966296c4, + 0xf9c3f99b, 0xc533c566, 0x25942535, 0x597959f2, + 0x842a8454, 0x72d572b7, 0x39e439d5, 0x4c2d4c5a, + 0x5e655eca, 0x78fd78e7, 0x38e038dd, 0x8c0a8c14, + 0xd163d1c6, 0xa5aea541, 0xe2afe243, 0x6199612f, + 0xb3f6b3f1, 0x21842115, 0x9c4a9c94, 0x1e781ef0, + 0x43114322, 0xc73bc776, 0xfcd7fcb3, 0x04100420, + 0x515951b2, 0x995e99bc, 0x6da96d4f, 0x0d340d68, + 0xfacffa83, 0xdf5bdfb6, 0x7ee57ed7, 0x2490243d, + 0x3bec3bc5, 0xab96ab31, 0xce1fce3e, 0x11441188, + 0x8f068f0c, 0x4e254e4a, 0xb7e6b7d1, 0xeb8beb0b, + 0x3cf03cfd, 0x813e817c, 0x946a94d4, 0xf7fbf7eb, + 0xb9deb9a1, 0x134c1398, 0x2cb02c7d, 0xd36bd3d6, + 0xe7bbe76b, 0x6ea56e57, 0xc437c46e, 0x030c0318, + 0x5645568a, 0x440d441a, 0x7fe17fdf, 0xa99ea921, + 0x2aa82a4d, 0xbbd6bbb1, 0xc123c146, 0x535153a2, + 0xdc57dcae, 0x0b2c0b58, 0x9d4e9d9c, 0x6cad6c47, + 0x31c43195, 0x74cd7487, 0xf6fff6e3, 0x4605460a, + 0xac8aac09, 0x891e893c, 0x145014a0, 0xe1a3e15b, + 0x165816b0, 0x3ae83acd, 0x69b9696f, 0x09240948, + 0x70dd70a7, 0xb6e2b6d9, 0xd067d0ce, 0xed93ed3b, + 0xcc17cc2e, 0x4215422a, 0x985a98b4, 0xa4aaa449, + 0x28a0285d, 0x5c6d5cda, 0xf8c7f893, 0x86228644, + }, + { + 0x18186018, 0x23238c23, 0xc6c63fc6, 0xe8e887e8, + 0x87872687, 0xb8b8dab8, 0x01010401, 0x4f4f214f, + 0x3636d836, 0xa6a6a2a6, 0xd2d26fd2, 0xf5f5f3f5, + 0x7979f979, 0x6f6fa16f, 0x91917e91, 0x52525552, + 0x60609d60, 0xbcbccabc, 0x9b9b569b, 0x8e8e028e, + 0xa3a3b6a3, 0x0c0c300c, 0x7b7bf17b, 0x3535d435, + 0x1d1d741d, 0xe0e0a7e0, 0xd7d77bd7, 0xc2c22fc2, + 0x2e2eb82e, 0x4b4b314b, 0xfefedffe, 0x57574157, + 0x15155415, 0x7777c177, 0x3737dc37, 0xe5e5b3e5, + 0x9f9f469f, 0xf0f0e7f0, 0x4a4a354a, 0xdada4fda, + 0x58587d58, 0xc9c903c9, 0x2929a429, 0x0a0a280a, + 0xb1b1feb1, 0xa0a0baa0, 0x6b6bb16b, 0x85852e85, + 0xbdbdcebd, 0x5d5d695d, 0x10104010, 0xf4f4f7f4, + 0xcbcb0bcb, 0x3e3ef83e, 0x05051405, 0x67678167, + 0xe4e4b7e4, 0x27279c27, 0x41411941, 0x8b8b168b, + 0xa7a7a6a7, 0x7d7de97d, 0x95956e95, 0xd8d847d8, + 0xfbfbcbfb, 0xeeee9fee, 0x7c7ced7c, 0x66668566, + 0xdddd53dd, 0x17175c17, 0x47470147, 0x9e9e429e, + 0xcaca0fca, 0x2d2db42d, 0xbfbfc6bf, 0x07071c07, + 0xadad8ead, 0x5a5a755a, 0x83833683, 0x3333cc33, + 0x63639163, 0x02020802, 0xaaaa92aa, 0x7171d971, + 0xc8c807c8, 0x19196419, 0x49493949, 0xd9d943d9, + 0xf2f2eff2, 0xe3e3abe3, 0x5b5b715b, 0x88881a88, + 0x9a9a529a, 0x26269826, 0x3232c832, 0xb0b0fab0, + 0xe9e983e9, 0x0f0f3c0f, 0xd5d573d5, 0x80803a80, + 0xbebec2be, 0xcdcd13cd, 0x3434d034, 0x48483d48, + 0xffffdbff, 0x7a7af57a, 0x90907a90, 0x5f5f615f, + 0x20208020, 0x6868bd68, 0x1a1a681a, 0xaeae82ae, + 0xb4b4eab4, 0x54544d54, 0x93937693, 0x22228822, + 0x64648d64, 0xf1f1e3f1, 0x7373d173, 0x12124812, + 0x40401d40, 0x08082008, 0xc3c32bc3, 0xecec97ec, + 0xdbdb4bdb, 0xa1a1bea1, 0x8d8d0e8d, 0x3d3df43d, + 0x97976697, 0x00000000, 0xcfcf1bcf, 0x2b2bac2b, + 0x7676c576, 0x82823282, 0xd6d67fd6, 0x1b1b6c1b, + 0xb5b5eeb5, 0xafaf86af, 0x6a6ab56a, 0x50505d50, + 0x45450945, 0xf3f3ebf3, 0x3030c030, 0xefef9bef, + 0x3f3ffc3f, 0x55554955, 0xa2a2b2a2, 0xeaea8fea, + 0x65658965, 0xbabad2ba, 0x2f2fbc2f, 0xc0c027c0, + 0xdede5fde, 0x1c1c701c, 0xfdfdd3fd, 0x4d4d294d, + 0x92927292, 0x7575c975, 0x06061806, 0x8a8a128a, + 0xb2b2f2b2, 0xe6e6bfe6, 0x0e0e380e, 0x1f1f7c1f, + 0x62629562, 0xd4d477d4, 0xa8a89aa8, 0x96966296, + 0xf9f9c3f9, 0xc5c533c5, 0x25259425, 0x59597959, + 0x84842a84, 0x7272d572, 0x3939e439, 0x4c4c2d4c, + 0x5e5e655e, 0x7878fd78, 0x3838e038, 0x8c8c0a8c, + 0xd1d163d1, 0xa5a5aea5, 0xe2e2afe2, 0x61619961, + 0xb3b3f6b3, 0x21218421, 0x9c9c4a9c, 0x1e1e781e, + 0x43431143, 0xc7c73bc7, 0xfcfcd7fc, 0x04041004, + 0x51515951, 0x99995e99, 0x6d6da96d, 0x0d0d340d, + 0xfafacffa, 0xdfdf5bdf, 0x7e7ee57e, 0x24249024, + 0x3b3bec3b, 0xabab96ab, 0xcece1fce, 0x11114411, + 0x8f8f068f, 0x4e4e254e, 0xb7b7e6b7, 0xebeb8beb, + 0x3c3cf03c, 0x81813e81, 0x94946a94, 0xf7f7fbf7, + 0xb9b9deb9, 0x13134c13, 0x2c2cb02c, 0xd3d36bd3, + 0xe7e7bbe7, 0x6e6ea56e, 0xc4c437c4, 0x03030c03, + 0x56564556, 0x44440d44, 0x7f7fe17f, 0xa9a99ea9, + 0x2a2aa82a, 0xbbbbd6bb, 0xc1c123c1, 0x53535153, + 0xdcdc57dc, 0x0b0b2c0b, 0x9d9d4e9d, 0x6c6cad6c, + 0x3131c431, 0x7474cd74, 0xf6f6fff6, 0x46460546, + 0xacac8aac, 0x89891e89, 0x14145014, 0xe1e1a3e1, + 0x16165816, 0x3a3ae83a, 0x6969b969, 0x09092409, + 0x7070dd70, 0xb6b6e2b6, 0xd0d067d0, 0xeded93ed, + 0xcccc17cc, 0x42421542, 0x98985a98, 0xa4a4aaa4, + 0x2828a028, 0x5c5c6d5c, 0xf8f8c7f8, 0x86862286, + }, + { + 0xd8181860, 0x2623238c, 0xb8c6c63f, 0xfbe8e887, + 0xcb878726, 0x11b8b8da, 0x09010104, 0x0d4f4f21, + 0x9b3636d8, 0xffa6a6a2, 0x0cd2d26f, 0x0ef5f5f3, + 0x967979f9, 0x306f6fa1, 0x6d91917e, 0xf8525255, + 0x4760609d, 0x35bcbcca, 0x379b9b56, 0x8a8e8e02, + 0xd2a3a3b6, 0x6c0c0c30, 0x847b7bf1, 0x803535d4, + 0xf51d1d74, 0xb3e0e0a7, 0x21d7d77b, 0x9cc2c22f, + 0x432e2eb8, 0x294b4b31, 0x5dfefedf, 0xd5575741, + 0xbd151554, 0xe87777c1, 0x923737dc, 0x9ee5e5b3, + 0x139f9f46, 0x23f0f0e7, 0x204a4a35, 0x44dada4f, + 0xa258587d, 0xcfc9c903, 0x7c2929a4, 0x5a0a0a28, + 0x50b1b1fe, 0xc9a0a0ba, 0x146b6bb1, 0xd985852e, + 0x3cbdbdce, 0x8f5d5d69, 0x90101040, 0x07f4f4f7, + 0xddcbcb0b, 0xd33e3ef8, 0x2d050514, 0x78676781, + 0x97e4e4b7, 0x0227279c, 0x73414119, 0xa78b8b16, + 0xf6a7a7a6, 0xb27d7de9, 0x4995956e, 0x56d8d847, + 0x70fbfbcb, 0xcdeeee9f, 0xbb7c7ced, 0x71666685, + 0x7bdddd53, 0xaf17175c, 0x45474701, 0x1a9e9e42, + 0xd4caca0f, 0x582d2db4, 0x2ebfbfc6, 0x3f07071c, + 0xacadad8e, 0xb05a5a75, 0xef838336, 0xb63333cc, + 0x5c636391, 0x12020208, 0x93aaaa92, 0xde7171d9, + 0xc6c8c807, 0xd1191964, 0x3b494939, 0x5fd9d943, + 0x31f2f2ef, 0xa8e3e3ab, 0xb95b5b71, 0xbc88881a, + 0x3e9a9a52, 0x0b262698, 0xbf3232c8, 0x59b0b0fa, + 0xf2e9e983, 0x770f0f3c, 0x33d5d573, 0xf480803a, + 0x27bebec2, 0xebcdcd13, 0x893434d0, 0x3248483d, + 0x54ffffdb, 0x8d7a7af5, 0x6490907a, 0x9d5f5f61, + 0x3d202080, 0x0f6868bd, 0xca1a1a68, 0xb7aeae82, + 0x7db4b4ea, 0xce54544d, 0x7f939376, 0x2f222288, + 0x6364648d, 0x2af1f1e3, 0xcc7373d1, 0x82121248, + 0x7a40401d, 0x48080820, 0x95c3c32b, 0xdfecec97, + 0x4ddbdb4b, 0xc0a1a1be, 0x918d8d0e, 0xc83d3df4, + 0x5b979766, 0x00000000, 0xf9cfcf1b, 0x6e2b2bac, + 0xe17676c5, 0xe6828232, 0x28d6d67f, 0xc31b1b6c, + 0x74b5b5ee, 0xbeafaf86, 0x1d6a6ab5, 0xea50505d, + 0x57454509, 0x38f3f3eb, 0xad3030c0, 0xc4efef9b, + 0xda3f3ffc, 0xc7555549, 0xdba2a2b2, 0xe9eaea8f, + 0x6a656589, 0x03babad2, 0x4a2f2fbc, 0x8ec0c027, + 0x60dede5f, 0xfc1c1c70, 0x46fdfdd3, 0x1f4d4d29, + 0x76929272, 0xfa7575c9, 0x36060618, 0xae8a8a12, + 0x4bb2b2f2, 0x85e6e6bf, 0x7e0e0e38, 0xe71f1f7c, + 0x55626295, 0x3ad4d477, 0x81a8a89a, 0x52969662, + 0x62f9f9c3, 0xa3c5c533, 0x10252594, 0xab595979, + 0xd084842a, 0xc57272d5, 0xec3939e4, 0x164c4c2d, + 0x945e5e65, 0x9f7878fd, 0xe53838e0, 0x988c8c0a, + 0x17d1d163, 0xe4a5a5ae, 0xa1e2e2af, 0x4e616199, + 0x42b3b3f6, 0x34212184, 0x089c9c4a, 0xee1e1e78, + 0x61434311, 0xb1c7c73b, 0x4ffcfcd7, 0x24040410, + 0xe3515159, 0x2599995e, 0x226d6da9, 0x650d0d34, + 0x79fafacf, 0x69dfdf5b, 0xa97e7ee5, 0x19242490, + 0xfe3b3bec, 0x9aabab96, 0xf0cece1f, 0x99111144, + 0x838f8f06, 0x044e4e25, 0x66b7b7e6, 0xe0ebeb8b, + 0xc13c3cf0, 0xfd81813e, 0x4094946a, 0x1cf7f7fb, + 0x18b9b9de, 0x8b13134c, 0x512c2cb0, 0x05d3d36b, + 0x8ce7e7bb, 0x396e6ea5, 0xaac4c437, 0x1b03030c, + 0xdc565645, 0x5e44440d, 0xa07f7fe1, 0x88a9a99e, + 0x672a2aa8, 0x0abbbbd6, 0x87c1c123, 0xf1535351, + 0x72dcdc57, 0x530b0b2c, 0x019d9d4e, 0x2b6c6cad, + 0xa43131c4, 0xf37474cd, 0x15f6f6ff, 0x4c464605, + 0xa5acac8a, 0xb589891e, 0xb4141450, 0xbae1e1a3, + 0xa6161658, 0xf73a3ae8, 0x066969b9, 0x41090924, + 0xd77070dd, 0x6fb6b6e2, 0x1ed0d067, 0xd6eded93, + 0xe2cccc17, 0x68424215, 0x2c98985a, 0xeda4a4aa, + 0x752828a0, 0x865c5c6d, 0x6bf8f8c7, 0xc2868622, + }, + { + 0x30d81818, 0x46262323, 0x91b8c6c6, 0xcdfbe8e8, + 0x13cb8787, 0x6d11b8b8, 0x02090101, 0x9e0d4f4f, + 0x6c9b3636, 0x51ffa6a6, 0xb90cd2d2, 0xf70ef5f5, + 0xf2967979, 0xde306f6f, 0x3f6d9191, 0xa4f85252, + 0xc0476060, 0x6535bcbc, 0x2b379b9b, 0x018a8e8e, + 0x5bd2a3a3, 0x186c0c0c, 0xf6847b7b, 0x6a803535, + 0x3af51d1d, 0xddb3e0e0, 0xb321d7d7, 0x999cc2c2, + 0x5c432e2e, 0x96294b4b, 0xe15dfefe, 0xaed55757, + 0x2abd1515, 0xeee87777, 0x6e923737, 0xd79ee5e5, + 0x23139f9f, 0xfd23f0f0, 0x94204a4a, 0xa944dada, + 0xb0a25858, 0x8fcfc9c9, 0x527c2929, 0x145a0a0a, + 0x7f50b1b1, 0x5dc9a0a0, 0xd6146b6b, 0x17d98585, + 0x673cbdbd, 0xba8f5d5d, 0x20901010, 0xf507f4f4, + 0x8bddcbcb, 0x7cd33e3e, 0x0a2d0505, 0xce786767, + 0xd597e4e4, 0x4e022727, 0x82734141, 0x0ba78b8b, + 0x53f6a7a7, 0xfab27d7d, 0x37499595, 0xad56d8d8, + 0xeb70fbfb, 0xc1cdeeee, 0xf8bb7c7c, 0xcc716666, + 0xa77bdddd, 0x2eaf1717, 0x8e454747, 0x211a9e9e, + 0x89d4caca, 0x5a582d2d, 0x632ebfbf, 0x0e3f0707, + 0x47acadad, 0xb4b05a5a, 0x1bef8383, 0x66b63333, + 0xc65c6363, 0x04120202, 0x4993aaaa, 0xe2de7171, + 0x8dc6c8c8, 0x32d11919, 0x923b4949, 0xaf5fd9d9, + 0xf931f2f2, 0xdba8e3e3, 0xb6b95b5b, 0x0dbc8888, + 0x293e9a9a, 0x4c0b2626, 0x64bf3232, 0x7d59b0b0, + 0xcff2e9e9, 0x1e770f0f, 0xb733d5d5, 0x1df48080, + 0x6127bebe, 0x87ebcdcd, 0x68893434, 0x90324848, + 0xe354ffff, 0xf48d7a7a, 0x3d649090, 0xbe9d5f5f, + 0x403d2020, 0xd00f6868, 0x34ca1a1a, 0x41b7aeae, + 0x757db4b4, 0xa8ce5454, 0x3b7f9393, 0x442f2222, + 0xc8636464, 0xff2af1f1, 0xe6cc7373, 0x24821212, + 0x807a4040, 0x10480808, 0x9b95c3c3, 0xc5dfecec, + 0xab4ddbdb, 0x5fc0a1a1, 0x07918d8d, 0x7ac83d3d, + 0x335b9797, 0x00000000, 0x83f9cfcf, 0x566e2b2b, + 0xece17676, 0x19e68282, 0xb128d6d6, 0x36c31b1b, + 0x7774b5b5, 0x43beafaf, 0xd41d6a6a, 0xa0ea5050, + 0x8a574545, 0xfb38f3f3, 0x60ad3030, 0xc3c4efef, + 0x7eda3f3f, 0xaac75555, 0x59dba2a2, 0xc9e9eaea, + 0xca6a6565, 0x6903baba, 0x5e4a2f2f, 0x9d8ec0c0, + 0xa160dede, 0x38fc1c1c, 0xe746fdfd, 0x9a1f4d4d, + 0x39769292, 0xeafa7575, 0x0c360606, 0x09ae8a8a, + 0x794bb2b2, 0xd185e6e6, 0x1c7e0e0e, 0x3ee71f1f, + 0xc4556262, 0xb53ad4d4, 0x4d81a8a8, 0x31529696, + 0xef62f9f9, 0x97a3c5c5, 0x4a102525, 0xb2ab5959, + 0x15d08484, 0xe4c57272, 0x72ec3939, 0x98164c4c, + 0xbc945e5e, 0xf09f7878, 0x70e53838, 0x05988c8c, + 0xbf17d1d1, 0x57e4a5a5, 0xd9a1e2e2, 0xc24e6161, + 0x7b42b3b3, 0x42342121, 0x25089c9c, 0x3cee1e1e, + 0x86614343, 0x93b1c7c7, 0xe54ffcfc, 0x08240404, + 0xa2e35151, 0x2f259999, 0xda226d6d, 0x1a650d0d, + 0xe979fafa, 0xa369dfdf, 0xfca97e7e, 0x48192424, + 0x76fe3b3b, 0x4b9aabab, 0x81f0cece, 0x22991111, + 0x03838f8f, 0x9c044e4e, 0x7366b7b7, 0xcbe0ebeb, + 0x78c13c3c, 0x1ffd8181, 0x35409494, 0xf31cf7f7, + 0x6f18b9b9, 0x268b1313, 0x58512c2c, 0xbb05d3d3, + 0xd38ce7e7, 0xdc396e6e, 0x95aac4c4, 0x061b0303, + 0xacdc5656, 0x885e4444, 0xfea07f7f, 0x4f88a9a9, + 0x54672a2a, 0x6b0abbbb, 0x9f87c1c1, 0xa6f15353, + 0xa572dcdc, 0x16530b0b, 0x27019d9d, 0xd82b6c6c, + 0x62a43131, 0xe8f37474, 0xf115f6f6, 0x8c4c4646, + 0x45a5acac, 0x0fb58989, 0x28b41414, 0xdfbae1e1, + 0x2ca61616, 0x74f73a3a, 0xd2066969, 0x12410909, + 0xe0d77070, 0x716fb6b6, 0xbd1ed0d0, 0xc7d6eded, + 0x85e2cccc, 0x84684242, 0x2d2c9898, 0x55eda4a4, + 0x50752828, 0xb8865c5c, 0xed6bf8f8, 0x11c28686, + }, + { + 0x7830d818, 0xaf462623, 0xf991b8c6, 0x6fcdfbe8, + 0xa113cb87, 0x626d11b8, 0x05020901, 0x6e9e0d4f, + 0xee6c9b36, 0x0451ffa6, 0xbdb90cd2, 0x06f70ef5, + 0x80f29679, 0xcede306f, 0xef3f6d91, 0x07a4f852, + 0xfdc04760, 0x766535bc, 0xcd2b379b, 0x8c018a8e, + 0x155bd2a3, 0x3c186c0c, 0x8af6847b, 0xe16a8035, + 0x693af51d, 0x47ddb3e0, 0xacb321d7, 0xed999cc2, + 0x965c432e, 0x7a96294b, 0x21e15dfe, 0x16aed557, + 0x412abd15, 0xb6eee877, 0xeb6e9237, 0x56d79ee5, + 0xd923139f, 0x17fd23f0, 0x7f94204a, 0x95a944da, + 0x25b0a258, 0xca8fcfc9, 0x8d527c29, 0x22145a0a, + 0x4f7f50b1, 0x1a5dc9a0, 0xdad6146b, 0xab17d985, + 0x73673cbd, 0x34ba8f5d, 0x50209010, 0x03f507f4, + 0xc08bddcb, 0xc67cd33e, 0x110a2d05, 0xe6ce7867, + 0x53d597e4, 0xbb4e0227, 0x58827341, 0x9d0ba78b, + 0x0153f6a7, 0x94fab27d, 0xfb374995, 0x9fad56d8, + 0x30eb70fb, 0x71c1cdee, 0x91f8bb7c, 0xe3cc7166, + 0x8ea77bdd, 0x4b2eaf17, 0x468e4547, 0xdc211a9e, + 0xc589d4ca, 0x995a582d, 0x79632ebf, 0x1b0e3f07, + 0x2347acad, 0x2fb4b05a, 0xb51bef83, 0xff66b633, + 0xf2c65c63, 0x0a041202, 0x384993aa, 0xa8e2de71, + 0xcf8dc6c8, 0x7d32d119, 0x70923b49, 0x9aaf5fd9, + 0x1df931f2, 0x48dba8e3, 0x2ab6b95b, 0x920dbc88, + 0xc8293e9a, 0xbe4c0b26, 0xfa64bf32, 0x4a7d59b0, + 0x6acff2e9, 0x331e770f, 0xa6b733d5, 0xba1df480, + 0x7c6127be, 0xde87ebcd, 0xe4688934, 0x75903248, + 0x24e354ff, 0x8ff48d7a, 0xea3d6490, 0x3ebe9d5f, + 0xa0403d20, 0xd5d00f68, 0x7234ca1a, 0x2c41b7ae, + 0x5e757db4, 0x19a8ce54, 0xe53b7f93, 0xaa442f22, + 0xe9c86364, 0x12ff2af1, 0xa2e6cc73, 0x5a248212, + 0x5d807a40, 0x28104808, 0xe89b95c3, 0x7bc5dfec, + 0x90ab4ddb, 0x1f5fc0a1, 0x8307918d, 0xc97ac83d, + 0xf1335b97, 0x00000000, 0xd483f9cf, 0x87566e2b, + 0xb3ece176, 0xb019e682, 0xa9b128d6, 0x7736c31b, + 0x5b7774b5, 0x2943beaf, 0xdfd41d6a, 0x0da0ea50, + 0x4c8a5745, 0x18fb38f3, 0xf060ad30, 0x74c3c4ef, + 0xc37eda3f, 0x1caac755, 0x1059dba2, 0x65c9e9ea, + 0xecca6a65, 0x686903ba, 0x935e4a2f, 0xe79d8ec0, + 0x81a160de, 0x6c38fc1c, 0x2ee746fd, 0x649a1f4d, + 0xe0397692, 0xbceafa75, 0x1e0c3606, 0x9809ae8a, + 0x40794bb2, 0x59d185e6, 0x361c7e0e, 0x633ee71f, + 0xf7c45562, 0xa3b53ad4, 0x324d81a8, 0xf4315296, + 0x3aef62f9, 0xf697a3c5, 0xb14a1025, 0x20b2ab59, + 0xae15d084, 0xa7e4c572, 0xdd72ec39, 0x6198164c, + 0x3bbc945e, 0x85f09f78, 0xd870e538, 0x8605988c, + 0xb2bf17d1, 0x0b57e4a5, 0x4dd9a1e2, 0xf8c24e61, + 0x457b42b3, 0xa5423421, 0xd625089c, 0x663cee1e, + 0x52866143, 0xfc93b1c7, 0x2be54ffc, 0x14082404, + 0x08a2e351, 0xc72f2599, 0xc4da226d, 0x391a650d, + 0x35e979fa, 0x84a369df, 0x9bfca97e, 0xb4481924, + 0xd776fe3b, 0x3d4b9aab, 0xd181f0ce, 0x55229911, + 0x8903838f, 0x6b9c044e, 0x517366b7, 0x60cbe0eb, + 0xcc78c13c, 0xbf1ffd81, 0xfe354094, 0x0cf31cf7, + 0x676f18b9, 0x5f268b13, 0x9c58512c, 0xb8bb05d3, + 0x5cd38ce7, 0xcbdc396e, 0xf395aac4, 0x0f061b03, + 0x13acdc56, 0x49885e44, 0x9efea07f, 0x374f88a9, + 0x8254672a, 0x6d6b0abb, 0xe29f87c1, 0x02a6f153, + 0x8ba572dc, 0x2716530b, 0xd327019d, 0xc1d82b6c, + 0xf562a431, 0xb9e8f374, 0x09f115f6, 0x438c4c46, + 0x2645a5ac, 0x970fb589, 0x4428b414, 0x42dfbae1, + 0x4e2ca616, 0xd274f73a, 0xd0d20669, 0x2d124109, + 0xade0d770, 0x54716fb6, 0xb7bd1ed0, 0x7ec7d6ed, + 0xdb85e2cc, 0x57846842, 0xc22d2c98, 0x0e55eda4, + 0x88507528, 0x31b8865c, 0x3fed6bf8, 0xa411c286, + }, +}; + +#ifdef VECT_SIZE1 +#define BOX(S,n,i) (u32) ((S)[(n)][(i)]) +#endif + +static void whirlpool_transform (const u32 w[16], u32 dgst[16], __local u32 s_Ch[8][256], __local u32 s_Cl[8][256]) +{ + const u32 rch[R + 1] = + { + 0x00000000, + 0x1823c6e8, + 0x36a6d2f5, + 0x60bc9b8e, + 0x1de0d7c2, + 0x157737e5, + 0x58c9290a, + 0xbd5d10f4, + 0xe427418b, + 0xfbee7c66, + 0xca2dbf07, + }; + + const u32 rcl[R + 1] = + { + 0x00000000, + 0x87b8014f, + 0x796f9152, + 0xa30c7b35, + 0x2e4bfe57, + 0x9ff04ada, + 0xb1a06b85, + 0xcb3e0567, + 0xa77d95d8, + 0xdd17479e, + 0xad5a8333, + }; + + u32 Kh[8]; + u32 Kl[8]; + + Kh[0] = dgst[ 0]; + Kl[0] = dgst[ 1]; + Kh[1] = dgst[ 2]; + Kl[1] = dgst[ 3]; + Kh[2] = dgst[ 4]; + Kl[2] = dgst[ 5]; + Kh[3] = dgst[ 6]; + Kl[3] = dgst[ 7]; + Kh[4] = dgst[ 8]; + Kl[4] = dgst[ 9]; + Kh[5] = dgst[10]; + Kl[5] = dgst[11]; + Kh[6] = dgst[12]; + Kl[6] = dgst[13]; + Kh[7] = dgst[14]; + Kl[7] = dgst[15]; + + u32 stateh[8]; + u32 statel[8]; + + stateh[0] = w[ 0] ^ Kh[0]; + statel[0] = w[ 1] ^ Kl[0]; + stateh[1] = w[ 2] ^ Kh[1]; + statel[1] = w[ 3] ^ Kl[1]; + stateh[2] = w[ 4] ^ Kh[2]; + statel[2] = w[ 5] ^ Kl[2]; + stateh[3] = w[ 6] ^ Kh[3]; + statel[3] = w[ 7] ^ Kl[3]; + stateh[4] = w[ 8] ^ Kh[4]; + statel[4] = w[ 9] ^ Kl[4]; + stateh[5] = w[10] ^ Kh[5]; + statel[5] = w[11] ^ Kl[5]; + stateh[6] = w[12] ^ Kh[6]; + statel[6] = w[13] ^ Kl[6]; + stateh[7] = w[14] ^ Kh[7]; + statel[7] = w[15] ^ Kl[7]; + + u32 r; + + for (r = 1; r <= R; r++) + { + u32 Lh[8]; + u32 Ll[8]; + + u32 i; + + #pragma unroll 8 + for (i = 0; i < 8; i++) + { + const u8 Lp0 = Kh[(i + 8) & 7] >> 24; + const u8 Lp1 = Kh[(i + 7) & 7] >> 16; + const u8 Lp2 = Kh[(i + 6) & 7] >> 8; + const u8 Lp3 = Kh[(i + 5) & 7] >> 0; + const u8 Lp4 = Kl[(i + 4) & 7] >> 24; + const u8 Lp5 = Kl[(i + 3) & 7] >> 16; + const u8 Lp6 = Kl[(i + 2) & 7] >> 8; + const u8 Lp7 = Kl[(i + 1) & 7] >> 0; + + Lh[i] = BOX (s_Ch, 0, Lp0 & 0xff) + ^ BOX (s_Ch, 1, Lp1 & 0xff) + ^ BOX (s_Ch, 2, Lp2 & 0xff) + ^ BOX (s_Ch, 3, Lp3 & 0xff) + ^ BOX (s_Ch, 4, Lp4 & 0xff) + ^ BOX (s_Ch, 5, Lp5 & 0xff) + ^ BOX (s_Ch, 6, Lp6 & 0xff) + ^ BOX (s_Ch, 7, Lp7 & 0xff); + + Ll[i] = BOX (s_Cl, 0, Lp0 & 0xff) + ^ BOX (s_Cl, 1, Lp1 & 0xff) + ^ BOX (s_Cl, 2, Lp2 & 0xff) + ^ BOX (s_Cl, 3, Lp3 & 0xff) + ^ BOX (s_Cl, 4, Lp4 & 0xff) + ^ BOX (s_Cl, 5, Lp5 & 0xff) + ^ BOX (s_Cl, 6, Lp6 & 0xff) + ^ BOX (s_Cl, 7, Lp7 & 0xff); + } + + Kh[0] = Lh[0] ^ rch[r]; + Kl[0] = Ll[0] ^ rcl[r]; + Kh[1] = Lh[1]; + Kl[1] = Ll[1]; + Kh[2] = Lh[2]; + Kl[2] = Ll[2]; + Kh[3] = Lh[3]; + Kl[3] = Ll[3]; + Kh[4] = Lh[4]; + Kl[4] = Ll[4]; + Kh[5] = Lh[5]; + Kl[5] = Ll[5]; + Kh[6] = Lh[6]; + Kl[6] = Ll[6]; + Kh[7] = Lh[7]; + Kl[7] = Ll[7]; + + #pragma unroll 8 + for (i = 0; i < 8; i++) + { + const u8 Lp0 = stateh[(i + 8) & 7] >> 24; + const u8 Lp1 = stateh[(i + 7) & 7] >> 16; + const u8 Lp2 = stateh[(i + 6) & 7] >> 8; + const u8 Lp3 = stateh[(i + 5) & 7] >> 0; + const u8 Lp4 = statel[(i + 4) & 7] >> 24; + const u8 Lp5 = statel[(i + 3) & 7] >> 16; + const u8 Lp6 = statel[(i + 2) & 7] >> 8; + const u8 Lp7 = statel[(i + 1) & 7] >> 0; + + Lh[i] = BOX (s_Ch, 0, Lp0 & 0xff) + ^ BOX (s_Ch, 1, Lp1 & 0xff) + ^ BOX (s_Ch, 2, Lp2 & 0xff) + ^ BOX (s_Ch, 3, Lp3 & 0xff) + ^ BOX (s_Ch, 4, Lp4 & 0xff) + ^ BOX (s_Ch, 5, Lp5 & 0xff) + ^ BOX (s_Ch, 6, Lp6 & 0xff) + ^ BOX (s_Ch, 7, Lp7 & 0xff); + + Ll[i] = BOX (s_Cl, 0, Lp0 & 0xff) + ^ BOX (s_Cl, 1, Lp1 & 0xff) + ^ BOX (s_Cl, 2, Lp2 & 0xff) + ^ BOX (s_Cl, 3, Lp3 & 0xff) + ^ BOX (s_Cl, 4, Lp4 & 0xff) + ^ BOX (s_Cl, 5, Lp5 & 0xff) + ^ BOX (s_Cl, 6, Lp6 & 0xff) + ^ BOX (s_Cl, 7, Lp7 & 0xff); + } + + stateh[0] = Lh[0] ^ Kh[0]; + statel[0] = Ll[0] ^ Kl[0]; + stateh[1] = Lh[1] ^ Kh[1]; + statel[1] = Ll[1] ^ Kl[1]; + stateh[2] = Lh[2] ^ Kh[2]; + statel[2] = Ll[2] ^ Kl[2]; + stateh[3] = Lh[3] ^ Kh[3]; + statel[3] = Ll[3] ^ Kl[3]; + stateh[4] = Lh[4] ^ Kh[4]; + statel[4] = Ll[4] ^ Kl[4]; + stateh[5] = Lh[5] ^ Kh[5]; + statel[5] = Ll[5] ^ Kl[5]; + stateh[6] = Lh[6] ^ Kh[6]; + statel[6] = Ll[6] ^ Kl[6]; + stateh[7] = Lh[7] ^ Kh[7]; + statel[7] = Ll[7] ^ Kl[7]; + } + + dgst[ 0] ^= stateh[0] ^ w[ 0]; + dgst[ 1] ^= statel[0] ^ w[ 1]; + dgst[ 2] ^= stateh[1] ^ w[ 2]; + dgst[ 3] ^= statel[1] ^ w[ 3]; + dgst[ 4] ^= stateh[2] ^ w[ 4]; + dgst[ 5] ^= statel[2] ^ w[ 5]; + dgst[ 6] ^= stateh[3] ^ w[ 6]; + dgst[ 7] ^= statel[3] ^ w[ 7]; + dgst[ 8] ^= stateh[4] ^ w[ 8]; + dgst[ 9] ^= statel[4] ^ w[ 9]; + dgst[10] ^= stateh[5] ^ w[10]; + dgst[11] ^= statel[5] ^ w[11]; + dgst[12] ^= stateh[6] ^ w[12]; + dgst[13] ^= statel[6] ^ w[13]; + dgst[14] ^= stateh[7] ^ w[14]; + dgst[15] ^= statel[7] ^ w[15]; +} + +static void hmac_run2 (const u32 w1[16], const u32 w2[16], const u32 ipad[16], const u32 opad[16], u32 dgst[16], __local u32 s_Ch[8][256], __local u32 s_Cl[8][256]) +{ + dgst[ 0] = ipad[ 0]; + dgst[ 1] = ipad[ 1]; + dgst[ 2] = ipad[ 2]; + dgst[ 3] = ipad[ 3]; + dgst[ 4] = ipad[ 4]; + dgst[ 5] = ipad[ 5]; + dgst[ 6] = ipad[ 6]; + dgst[ 7] = ipad[ 7]; + dgst[ 8] = ipad[ 8]; + dgst[ 9] = ipad[ 9]; + dgst[10] = ipad[10]; + dgst[11] = ipad[11]; + dgst[12] = ipad[12]; + dgst[13] = ipad[13]; + dgst[14] = ipad[14]; + dgst[15] = ipad[15]; + + whirlpool_transform (w1, dgst, s_Ch, s_Cl); + whirlpool_transform (w2, dgst, s_Ch, s_Cl); + + u32 w[16]; + + w[ 0] = dgst[ 0]; + w[ 1] = dgst[ 1]; + w[ 2] = dgst[ 2]; + w[ 3] = dgst[ 3]; + w[ 4] = dgst[ 4]; + w[ 5] = dgst[ 5]; + w[ 6] = dgst[ 6]; + w[ 7] = dgst[ 7]; + w[ 8] = dgst[ 8]; + w[ 9] = dgst[ 9]; + w[10] = dgst[10]; + w[11] = dgst[11]; + w[12] = dgst[12]; + w[13] = dgst[13]; + w[14] = dgst[14]; + w[15] = dgst[15]; + + dgst[ 0] = opad[ 0]; + dgst[ 1] = opad[ 1]; + dgst[ 2] = opad[ 2]; + dgst[ 3] = opad[ 3]; + dgst[ 4] = opad[ 4]; + dgst[ 5] = opad[ 5]; + dgst[ 6] = opad[ 6]; + dgst[ 7] = opad[ 7]; + dgst[ 8] = opad[ 8]; + dgst[ 9] = opad[ 9]; + dgst[10] = opad[10]; + dgst[11] = opad[11]; + dgst[12] = opad[12]; + dgst[13] = opad[13]; + dgst[14] = opad[14]; + dgst[15] = opad[15]; + + whirlpool_transform (w, dgst, s_Ch, s_Cl); + + w[ 0] = 0x80000000; + w[ 1] = 0; + w[ 2] = 0; + w[ 3] = 0; + w[ 4] = 0; + w[ 5] = 0; + w[ 6] = 0; + w[ 7] = 0; + w[ 8] = 0; + w[ 9] = 0; + w[10] = 0; + w[11] = 0; + w[12] = 0; + w[13] = 0; + w[14] = 0; + w[15] = (64 + 64) * 8; + + whirlpool_transform (w, dgst, s_Ch, s_Cl); +} + +static void hmac_init (u32 w[16], u32 ipad[16], u32 opad[16], __local u32 s_Ch[8][256], __local u32 s_Cl[8][256]) +{ + w[ 0] ^= 0x36363636; + w[ 1] ^= 0x36363636; + w[ 2] ^= 0x36363636; + w[ 3] ^= 0x36363636; + w[ 4] ^= 0x36363636; + w[ 5] ^= 0x36363636; + w[ 6] ^= 0x36363636; + w[ 7] ^= 0x36363636; + w[ 8] ^= 0x36363636; + w[ 9] ^= 0x36363636; + w[10] ^= 0x36363636; + w[11] ^= 0x36363636; + w[12] ^= 0x36363636; + w[13] ^= 0x36363636; + w[14] ^= 0x36363636; + w[15] ^= 0x36363636; + + ipad[ 0] = 0; + ipad[ 1] = 0; + ipad[ 2] = 0; + ipad[ 3] = 0; + ipad[ 4] = 0; + ipad[ 5] = 0; + ipad[ 6] = 0; + ipad[ 7] = 0; + ipad[ 8] = 0; + ipad[ 9] = 0; + ipad[10] = 0; + ipad[11] = 0; + ipad[12] = 0; + ipad[13] = 0; + ipad[14] = 0; + ipad[15] = 0; + + whirlpool_transform (w, ipad, s_Ch, s_Cl); + + w[ 0] ^= 0x6a6a6a6a; + w[ 1] ^= 0x6a6a6a6a; + w[ 2] ^= 0x6a6a6a6a; + w[ 3] ^= 0x6a6a6a6a; + w[ 4] ^= 0x6a6a6a6a; + w[ 5] ^= 0x6a6a6a6a; + w[ 6] ^= 0x6a6a6a6a; + w[ 7] ^= 0x6a6a6a6a; + w[ 8] ^= 0x6a6a6a6a; + w[ 9] ^= 0x6a6a6a6a; + w[10] ^= 0x6a6a6a6a; + w[11] ^= 0x6a6a6a6a; + w[12] ^= 0x6a6a6a6a; + w[13] ^= 0x6a6a6a6a; + w[14] ^= 0x6a6a6a6a; + w[15] ^= 0x6a6a6a6a; + + opad[ 0] = 0; + opad[ 1] = 0; + opad[ 2] = 0; + opad[ 3] = 0; + opad[ 4] = 0; + opad[ 5] = 0; + opad[ 6] = 0; + opad[ 7] = 0; + opad[ 8] = 0; + opad[ 9] = 0; + opad[10] = 0; + opad[11] = 0; + opad[12] = 0; + opad[13] = 0; + opad[14] = 0; + opad[15] = 0; + + whirlpool_transform (w, opad, s_Ch, s_Cl); +} + +static u32 u8add (const u32 a, const u32 b) +{ + const u32 a1 = (a >> 0) & 0xff; + const u32 a2 = (a >> 8) & 0xff; + const u32 a3 = (a >> 16) & 0xff; + const u32 a4 = (a >> 24) & 0xff; + + const u32 b1 = (b >> 0) & 0xff; + const u32 b2 = (b >> 8) & 0xff; + const u32 b3 = (b >> 16) & 0xff; + const u32 b4 = (b >> 24) & 0xff; + + const u32 r1 = (a1 + b1) & 0xff; + const u32 r2 = (a2 + b2) & 0xff; + const u32 r3 = (a3 + b3) & 0xff; + const u32 r4 = (a4 + b4) & 0xff; + + const u32 r = r1 << 0 + | r2 << 8 + | r3 << 16 + | r4 << 24; + + return r; +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m06232_init (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global tc_tmp_t *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global tc_t *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = pws[gid].i[ 8]; + w2[1] = pws[gid].i[ 9]; + w2[2] = pws[gid].i[10]; + w2[3] = pws[gid].i[11]; + + u32x w3[4]; + + w3[0] = pws[gid].i[12]; + w3[1] = pws[gid].i[13]; + w3[2] = pws[gid].i[14]; + w3[3] = pws[gid].i[15]; + + /** + * keyfile + */ + + w0[0] = u8add (w0[0], esalt_bufs[salt_pos].keyfile_buf[ 0]); + w0[1] = u8add (w0[1], esalt_bufs[salt_pos].keyfile_buf[ 1]); + w0[2] = u8add (w0[2], esalt_bufs[salt_pos].keyfile_buf[ 2]); + w0[3] = u8add (w0[3], esalt_bufs[salt_pos].keyfile_buf[ 3]); + w1[0] = u8add (w1[0], esalt_bufs[salt_pos].keyfile_buf[ 4]); + w1[1] = u8add (w1[1], esalt_bufs[salt_pos].keyfile_buf[ 5]); + w1[2] = u8add (w1[2], esalt_bufs[salt_pos].keyfile_buf[ 6]); + w1[3] = u8add (w1[3], esalt_bufs[salt_pos].keyfile_buf[ 7]); + w2[0] = u8add (w2[0], esalt_bufs[salt_pos].keyfile_buf[ 8]); + w2[1] = u8add (w2[1], esalt_bufs[salt_pos].keyfile_buf[ 9]); + w2[2] = u8add (w2[2], esalt_bufs[salt_pos].keyfile_buf[10]); + w2[3] = u8add (w2[3], esalt_bufs[salt_pos].keyfile_buf[11]); + w3[0] = u8add (w3[0], esalt_bufs[salt_pos].keyfile_buf[12]); + w3[1] = u8add (w3[1], esalt_bufs[salt_pos].keyfile_buf[13]); + w3[2] = u8add (w3[2], esalt_bufs[salt_pos].keyfile_buf[14]); + w3[3] = u8add (w3[3], esalt_bufs[salt_pos].keyfile_buf[15]); + + /** + * shared mem + */ + + __local u32 s_Ch[8][256]; + __local u32 s_Cl[8][256]; + + const u32 lid = get_local_id (0); + + const u32 lid4 = lid * 4; + + for (u32 i = 0; i < 8; i++) + { + s_Ch[i][lid4 + 0] = Ch[i][lid4 + 0]; + s_Ch[i][lid4 + 1] = Ch[i][lid4 + 1]; + s_Ch[i][lid4 + 2] = Ch[i][lid4 + 2]; + s_Ch[i][lid4 + 3] = Ch[i][lid4 + 3]; + s_Cl[i][lid4 + 0] = Cl[i][lid4 + 0]; + s_Cl[i][lid4 + 1] = Cl[i][lid4 + 1]; + s_Cl[i][lid4 + 2] = Cl[i][lid4 + 2]; + s_Cl[i][lid4 + 3] = Cl[i][lid4 + 3]; + } + + barrier (CLK_LOCAL_MEM_FENCE); + + if (gid >= gid_max) return; + + /** + * salt + */ + + u32 salt_buf1[16]; + + salt_buf1[ 0] = swap_workaround (esalt_bufs[salt_pos].salt_buf[ 0]); + salt_buf1[ 1] = swap_workaround (esalt_bufs[salt_pos].salt_buf[ 1]); + salt_buf1[ 2] = swap_workaround (esalt_bufs[salt_pos].salt_buf[ 2]); + salt_buf1[ 3] = swap_workaround (esalt_bufs[salt_pos].salt_buf[ 3]); + salt_buf1[ 4] = swap_workaround (esalt_bufs[salt_pos].salt_buf[ 4]); + salt_buf1[ 5] = swap_workaround (esalt_bufs[salt_pos].salt_buf[ 5]); + salt_buf1[ 6] = swap_workaround (esalt_bufs[salt_pos].salt_buf[ 6]); + salt_buf1[ 7] = swap_workaround (esalt_bufs[salt_pos].salt_buf[ 7]); + salt_buf1[ 8] = swap_workaround (esalt_bufs[salt_pos].salt_buf[ 8]); + salt_buf1[ 9] = swap_workaround (esalt_bufs[salt_pos].salt_buf[ 9]); + salt_buf1[10] = swap_workaround (esalt_bufs[salt_pos].salt_buf[10]); + salt_buf1[11] = swap_workaround (esalt_bufs[salt_pos].salt_buf[11]); + salt_buf1[12] = swap_workaround (esalt_bufs[salt_pos].salt_buf[12]); + salt_buf1[13] = swap_workaround (esalt_bufs[salt_pos].salt_buf[13]); + salt_buf1[14] = swap_workaround (esalt_bufs[salt_pos].salt_buf[14]); + salt_buf1[15] = swap_workaround (esalt_bufs[salt_pos].salt_buf[15]); + + u32 salt_buf2[16]; + + salt_buf2[ 0] = 0; + salt_buf2[ 1] = 0x80000000; + salt_buf2[ 2] = 0; + salt_buf2[ 3] = 0; + salt_buf2[ 4] = 0; + salt_buf2[ 5] = 0; + salt_buf2[ 6] = 0; + salt_buf2[ 7] = 0; + salt_buf2[ 8] = 0; + salt_buf2[ 9] = 0; + salt_buf2[10] = 0; + salt_buf2[11] = 0; + salt_buf2[12] = 0; + salt_buf2[13] = 0; + salt_buf2[14] = 0; + salt_buf2[15] = (64 + 64 + 4) * 8; + + const u32 truecrypt_mdlen = salt_bufs[0].truecrypt_mdlen; + + u32 w[16]; + + w[ 0] = swap_workaround (w0[0]); + w[ 1] = swap_workaround (w0[1]); + w[ 2] = swap_workaround (w0[2]); + w[ 3] = swap_workaround (w0[3]); + w[ 4] = swap_workaround (w1[0]); + w[ 5] = swap_workaround (w1[1]); + w[ 6] = swap_workaround (w1[2]); + w[ 7] = swap_workaround (w1[3]); + w[ 8] = swap_workaround (w2[0]); + w[ 9] = swap_workaround (w2[1]); + w[10] = swap_workaround (w2[2]); + w[11] = swap_workaround (w2[3]); + w[12] = swap_workaround (w3[0]); + w[13] = swap_workaround (w3[1]); + w[14] = swap_workaround (w3[2]); + w[15] = swap_workaround (w3[3]); + + u32 ipad[16]; + u32 opad[16]; + + hmac_init (w, ipad, opad, s_Ch, s_Cl); + + tmps[gid].ipad[ 0] = ipad[ 0]; + tmps[gid].ipad[ 1] = ipad[ 1]; + tmps[gid].ipad[ 2] = ipad[ 2]; + tmps[gid].ipad[ 3] = ipad[ 3]; + tmps[gid].ipad[ 4] = ipad[ 4]; + tmps[gid].ipad[ 5] = ipad[ 5]; + tmps[gid].ipad[ 6] = ipad[ 6]; + tmps[gid].ipad[ 7] = ipad[ 7]; + tmps[gid].ipad[ 8] = ipad[ 8]; + tmps[gid].ipad[ 9] = ipad[ 9]; + tmps[gid].ipad[10] = ipad[10]; + tmps[gid].ipad[11] = ipad[11]; + tmps[gid].ipad[12] = ipad[12]; + tmps[gid].ipad[13] = ipad[13]; + tmps[gid].ipad[14] = ipad[14]; + tmps[gid].ipad[15] = ipad[15]; + + tmps[gid].opad[ 0] = opad[ 0]; + tmps[gid].opad[ 1] = opad[ 1]; + tmps[gid].opad[ 2] = opad[ 2]; + tmps[gid].opad[ 3] = opad[ 3]; + tmps[gid].opad[ 4] = opad[ 4]; + tmps[gid].opad[ 5] = opad[ 5]; + tmps[gid].opad[ 6] = opad[ 6]; + tmps[gid].opad[ 7] = opad[ 7]; + tmps[gid].opad[ 8] = opad[ 8]; + tmps[gid].opad[ 9] = opad[ 9]; + tmps[gid].opad[10] = opad[10]; + tmps[gid].opad[11] = opad[11]; + tmps[gid].opad[12] = opad[12]; + tmps[gid].opad[13] = opad[13]; + tmps[gid].opad[14] = opad[14]; + tmps[gid].opad[15] = opad[15]; + + for (u32 i = 0, j = 1; i < (truecrypt_mdlen / 8 / 4); i += 16, j += 1) + { + salt_buf2[0] = j; + + u32 dgst[16]; + + hmac_run2 (salt_buf1, salt_buf2, ipad, opad, dgst, s_Ch, s_Cl); + + tmps[gid].dgst[i + 0] = dgst[ 0]; + tmps[gid].dgst[i + 1] = dgst[ 1]; + tmps[gid].dgst[i + 2] = dgst[ 2]; + tmps[gid].dgst[i + 3] = dgst[ 3]; + tmps[gid].dgst[i + 4] = dgst[ 4]; + tmps[gid].dgst[i + 5] = dgst[ 5]; + tmps[gid].dgst[i + 6] = dgst[ 6]; + tmps[gid].dgst[i + 7] = dgst[ 7]; + tmps[gid].dgst[i + 8] = dgst[ 8]; + tmps[gid].dgst[i + 9] = dgst[ 9]; + tmps[gid].dgst[i + 10] = dgst[10]; + tmps[gid].dgst[i + 11] = dgst[11]; + tmps[gid].dgst[i + 12] = dgst[12]; + tmps[gid].dgst[i + 13] = dgst[13]; + tmps[gid].dgst[i + 14] = dgst[14]; + tmps[gid].dgst[i + 15] = dgst[15]; + + tmps[gid].out[i + 0] = dgst[ 0]; + tmps[gid].out[i + 1] = dgst[ 1]; + tmps[gid].out[i + 2] = dgst[ 2]; + tmps[gid].out[i + 3] = dgst[ 3]; + tmps[gid].out[i + 4] = dgst[ 4]; + tmps[gid].out[i + 5] = dgst[ 5]; + tmps[gid].out[i + 6] = dgst[ 6]; + tmps[gid].out[i + 7] = dgst[ 7]; + tmps[gid].out[i + 8] = dgst[ 8]; + tmps[gid].out[i + 9] = dgst[ 9]; + tmps[gid].out[i + 10] = dgst[10]; + tmps[gid].out[i + 11] = dgst[11]; + tmps[gid].out[i + 12] = dgst[12]; + tmps[gid].out[i + 13] = dgst[13]; + tmps[gid].out[i + 14] = dgst[14]; + tmps[gid].out[i + 15] = dgst[15]; + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m06232_loop (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global tc_tmp_t *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global tc_t *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + const u32 truecrypt_mdlen = salt_bufs[0].truecrypt_mdlen; + + __local u32 s_Ch[8][256]; + __local u32 s_Cl[8][256]; + + const u32 gid = get_global_id (0); + const u32 lid = get_local_id (0); + + const u32 lid4 = lid * 4; + + for (u32 i = 0; i < 8; i++) + { + s_Ch[i][lid4 + 0] = Ch[i][lid4 + 0]; + s_Ch[i][lid4 + 1] = Ch[i][lid4 + 1]; + s_Ch[i][lid4 + 2] = Ch[i][lid4 + 2]; + s_Ch[i][lid4 + 3] = Ch[i][lid4 + 3]; + s_Cl[i][lid4 + 0] = Cl[i][lid4 + 0]; + s_Cl[i][lid4 + 1] = Cl[i][lid4 + 1]; + s_Cl[i][lid4 + 2] = Cl[i][lid4 + 2]; + s_Cl[i][lid4 + 3] = Cl[i][lid4 + 3]; + } + + barrier (CLK_LOCAL_MEM_FENCE); + + if (gid >= gid_max) return; + + u32 ipad[16]; + + ipad[ 0] = tmps[gid].ipad[ 0]; + ipad[ 1] = tmps[gid].ipad[ 1], + ipad[ 2] = tmps[gid].ipad[ 2]; + ipad[ 3] = tmps[gid].ipad[ 3]; + ipad[ 4] = tmps[gid].ipad[ 4]; + ipad[ 5] = tmps[gid].ipad[ 5]; + ipad[ 6] = tmps[gid].ipad[ 6], + ipad[ 7] = tmps[gid].ipad[ 7]; + ipad[ 8] = tmps[gid].ipad[ 8]; + ipad[ 9] = tmps[gid].ipad[ 9]; + ipad[10] = tmps[gid].ipad[10]; + ipad[11] = tmps[gid].ipad[11], + ipad[12] = tmps[gid].ipad[12]; + ipad[13] = tmps[gid].ipad[13]; + ipad[14] = tmps[gid].ipad[14]; + ipad[15] = tmps[gid].ipad[15]; + + u32 opad[16]; + + opad[ 0] = tmps[gid].opad[ 0]; + opad[ 1] = tmps[gid].opad[ 1], + opad[ 2] = tmps[gid].opad[ 2]; + opad[ 3] = tmps[gid].opad[ 3]; + opad[ 4] = tmps[gid].opad[ 4]; + opad[ 5] = tmps[gid].opad[ 5]; + opad[ 6] = tmps[gid].opad[ 6], + opad[ 7] = tmps[gid].opad[ 7]; + opad[ 8] = tmps[gid].opad[ 8]; + opad[ 9] = tmps[gid].opad[ 9]; + opad[10] = tmps[gid].opad[10]; + opad[11] = tmps[gid].opad[11], + opad[12] = tmps[gid].opad[12]; + opad[13] = tmps[gid].opad[13]; + opad[14] = tmps[gid].opad[14]; + opad[15] = tmps[gid].opad[15]; + + for (u32 i = 0; i < (truecrypt_mdlen / 8 / 4); i += 16) + { + u32 dgst[16]; + + dgst[ 0] = tmps[gid].dgst[i + 0]; + dgst[ 1] = tmps[gid].dgst[i + 1]; + dgst[ 2] = tmps[gid].dgst[i + 2]; + dgst[ 3] = tmps[gid].dgst[i + 3]; + dgst[ 4] = tmps[gid].dgst[i + 4]; + dgst[ 5] = tmps[gid].dgst[i + 5]; + dgst[ 6] = tmps[gid].dgst[i + 6]; + dgst[ 7] = tmps[gid].dgst[i + 7]; + dgst[ 8] = tmps[gid].dgst[i + 8]; + dgst[ 9] = tmps[gid].dgst[i + 9]; + dgst[10] = tmps[gid].dgst[i + 10]; + dgst[11] = tmps[gid].dgst[i + 11]; + dgst[12] = tmps[gid].dgst[i + 12]; + dgst[13] = tmps[gid].dgst[i + 13]; + dgst[14] = tmps[gid].dgst[i + 14]; + dgst[15] = tmps[gid].dgst[i + 15]; + + u32 out[16]; + + out[ 0] = tmps[gid].out[i + 0]; + out[ 1] = tmps[gid].out[i + 1]; + out[ 2] = tmps[gid].out[i + 2]; + out[ 3] = tmps[gid].out[i + 3]; + out[ 4] = tmps[gid].out[i + 4]; + out[ 5] = tmps[gid].out[i + 5]; + out[ 6] = tmps[gid].out[i + 6]; + out[ 7] = tmps[gid].out[i + 7]; + out[ 8] = tmps[gid].out[i + 8]; + out[ 9] = tmps[gid].out[i + 9]; + out[10] = tmps[gid].out[i + 10]; + out[11] = tmps[gid].out[i + 11]; + out[12] = tmps[gid].out[i + 12]; + out[13] = tmps[gid].out[i + 13]; + out[14] = tmps[gid].out[i + 14]; + out[15] = tmps[gid].out[i + 15]; + + for (u32 j = 0; j < loop_cnt; j++) + { + u32 w1[16]; + + w1[ 0] = dgst[ 0]; + w1[ 1] = dgst[ 1]; + w1[ 2] = dgst[ 2]; + w1[ 3] = dgst[ 3]; + w1[ 4] = dgst[ 4]; + w1[ 5] = dgst[ 5]; + w1[ 6] = dgst[ 6]; + w1[ 7] = dgst[ 7]; + w1[ 8] = dgst[ 8]; + w1[ 9] = dgst[ 9]; + w1[10] = dgst[10]; + w1[11] = dgst[11]; + w1[12] = dgst[12]; + w1[13] = dgst[13]; + w1[14] = dgst[14]; + w1[15] = dgst[15]; + + u32 w2[16]; + + w2[ 0] = 0x80000000; + w2[ 1] = 0; + w2[ 2] = 0; + w2[ 3] = 0; + w2[ 4] = 0; + w2[ 5] = 0; + w2[ 6] = 0; + w2[ 7] = 0; + w2[ 8] = 0; + w2[ 9] = 0; + w2[10] = 0; + w2[11] = 0; + w2[12] = 0; + w2[13] = 0; + w2[14] = 0; + w2[15] = (64 + 64) * 8; + + hmac_run2 (w1, w2, ipad, opad, dgst, s_Ch, s_Cl); + + out[ 0] ^= dgst[ 0]; + out[ 1] ^= dgst[ 1]; + out[ 2] ^= dgst[ 2]; + out[ 3] ^= dgst[ 3]; + out[ 4] ^= dgst[ 4]; + out[ 5] ^= dgst[ 5]; + out[ 6] ^= dgst[ 6]; + out[ 7] ^= dgst[ 7]; + out[ 8] ^= dgst[ 8]; + out[ 9] ^= dgst[ 9]; + out[10] ^= dgst[10]; + out[11] ^= dgst[11]; + out[12] ^= dgst[12]; + out[13] ^= dgst[13]; + out[14] ^= dgst[14]; + out[15] ^= dgst[15]; + } + + tmps[gid].dgst[i + 0] = dgst[ 0]; + tmps[gid].dgst[i + 1] = dgst[ 1]; + tmps[gid].dgst[i + 2] = dgst[ 2]; + tmps[gid].dgst[i + 3] = dgst[ 3]; + tmps[gid].dgst[i + 4] = dgst[ 4]; + tmps[gid].dgst[i + 5] = dgst[ 5]; + tmps[gid].dgst[i + 6] = dgst[ 6]; + tmps[gid].dgst[i + 7] = dgst[ 7]; + tmps[gid].dgst[i + 8] = dgst[ 8]; + tmps[gid].dgst[i + 9] = dgst[ 9]; + tmps[gid].dgst[i + 10] = dgst[10]; + tmps[gid].dgst[i + 11] = dgst[11]; + tmps[gid].dgst[i + 12] = dgst[12]; + tmps[gid].dgst[i + 13] = dgst[13]; + tmps[gid].dgst[i + 14] = dgst[14]; + tmps[gid].dgst[i + 15] = dgst[15]; + + tmps[gid].out[i + 0] = out[ 0]; + tmps[gid].out[i + 1] = out[ 1]; + tmps[gid].out[i + 2] = out[ 2]; + tmps[gid].out[i + 3] = out[ 3]; + tmps[gid].out[i + 4] = out[ 4]; + tmps[gid].out[i + 5] = out[ 5]; + tmps[gid].out[i + 6] = out[ 6]; + tmps[gid].out[i + 7] = out[ 7]; + tmps[gid].out[i + 8] = out[ 8]; + tmps[gid].out[i + 9] = out[ 9]; + tmps[gid].out[i + 10] = out[10]; + tmps[gid].out[i + 11] = out[11]; + tmps[gid].out[i + 12] = out[12]; + tmps[gid].out[i + 13] = out[13]; + tmps[gid].out[i + 14] = out[14]; + tmps[gid].out[i + 15] = out[15]; + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m06232_comp (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global tc_tmp_t *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global tc_t *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + const u32 lid = get_local_id (0); + + if (gid >= gid_max) return; + + u32 ukey1[8]; + + ukey1[0] = swap_workaround (tmps[gid].out[ 0]); + ukey1[1] = swap_workaround (tmps[gid].out[ 1]); + ukey1[2] = swap_workaround (tmps[gid].out[ 2]); + ukey1[3] = swap_workaround (tmps[gid].out[ 3]); + ukey1[4] = swap_workaround (tmps[gid].out[ 4]); + ukey1[5] = swap_workaround (tmps[gid].out[ 5]); + ukey1[6] = swap_workaround (tmps[gid].out[ 6]); + ukey1[7] = swap_workaround (tmps[gid].out[ 7]); + + u32 ukey2[8]; + + ukey2[0] = swap_workaround (tmps[gid].out[ 8]); + ukey2[1] = swap_workaround (tmps[gid].out[ 9]); + ukey2[2] = swap_workaround (tmps[gid].out[10]); + ukey2[3] = swap_workaround (tmps[gid].out[11]); + ukey2[4] = swap_workaround (tmps[gid].out[12]); + ukey2[5] = swap_workaround (tmps[gid].out[13]); + ukey2[6] = swap_workaround (tmps[gid].out[14]); + ukey2[7] = swap_workaround (tmps[gid].out[15]); + + u32 data[4]; + + data[0] = esalt_bufs[0].data_buf[0]; + data[1] = esalt_bufs[0].data_buf[1]; + data[2] = esalt_bufs[0].data_buf[2]; + data[3] = esalt_bufs[0].data_buf[3]; + + u32 tmp[4]; + + { + tmp[0] = data[0]; + tmp[1] = data[1]; + tmp[2] = data[2]; + tmp[3] = data[3]; + + aes256_decrypt_xts (ukey1, ukey2, tmp, tmp); + + if (((tmp[0] == 0x45555254) && (tmp[3] == 0)) || ((tmp[0] == 0x45555254) && ((tmp[1] >> 16) <= 5))) + { + mark_hash_s0 (plains_buf, hashes_shown, 0, gid, 0); + + d_return_buf[lid] = 1; + } + } + + { + tmp[0] = data[0]; + tmp[1] = data[1]; + tmp[2] = data[2]; + tmp[3] = data[3]; + + serpent256_decrypt_xts (ukey1, ukey2, tmp, tmp); + + if (((tmp[0] == 0x45555254) && (tmp[3] == 0)) || ((tmp[0] == 0x45555254) && ((tmp[1] >> 16) <= 5))) + { + mark_hash_s0 (plains_buf, hashes_shown, 0, gid, 0); + + d_return_buf[lid] = 1; + } + } + + { + tmp[0] = data[0]; + tmp[1] = data[1]; + tmp[2] = data[2]; + tmp[3] = data[3]; + + twofish256_decrypt_xts (ukey1, ukey2, tmp, tmp); + + if (((tmp[0] == 0x45555254) && (tmp[3] == 0)) || ((tmp[0] == 0x45555254) && ((tmp[1] >> 16) <= 5))) + { + mark_hash_s0 (plains_buf, hashes_shown, 0, gid, 0); + + d_return_buf[lid] = 1; + } + } + + u32 ukey3[8]; + + ukey3[0] = swap_workaround (tmps[gid].out[16]); + ukey3[1] = swap_workaround (tmps[gid].out[17]); + ukey3[2] = swap_workaround (tmps[gid].out[18]); + ukey3[3] = swap_workaround (tmps[gid].out[19]); + ukey3[4] = swap_workaround (tmps[gid].out[20]); + ukey3[5] = swap_workaround (tmps[gid].out[21]); + ukey3[6] = swap_workaround (tmps[gid].out[22]); + ukey3[7] = swap_workaround (tmps[gid].out[23]); + + u32 ukey4[8]; + + ukey4[0] = swap_workaround (tmps[gid].out[24]); + ukey4[1] = swap_workaround (tmps[gid].out[25]); + ukey4[2] = swap_workaround (tmps[gid].out[26]); + ukey4[3] = swap_workaround (tmps[gid].out[27]); + ukey4[4] = swap_workaround (tmps[gid].out[28]); + ukey4[5] = swap_workaround (tmps[gid].out[29]); + ukey4[6] = swap_workaround (tmps[gid].out[30]); + ukey4[7] = swap_workaround (tmps[gid].out[31]); + + { + tmp[0] = data[0]; + tmp[1] = data[1]; + tmp[2] = data[2]; + tmp[3] = data[3]; + + aes256_decrypt_xts (ukey2, ukey4, tmp, tmp); + twofish256_decrypt_xts (ukey1, ukey3, tmp, tmp); + + if (((tmp[0] == 0x45555254) && (tmp[3] == 0)) || ((tmp[0] == 0x45555254) && ((tmp[1] >> 16) <= 5))) + { + mark_hash_s0 (plains_buf, hashes_shown, 0, gid, 0); + + d_return_buf[lid] = 1; + } + } + + { + tmp[0] = data[0]; + tmp[1] = data[1]; + tmp[2] = data[2]; + tmp[3] = data[3]; + + serpent256_decrypt_xts (ukey2, ukey4, tmp, tmp); + aes256_decrypt_xts (ukey1, ukey3, tmp, tmp); + + if (((tmp[0] == 0x45555254) && (tmp[3] == 0)) || ((tmp[0] == 0x45555254) && ((tmp[1] >> 16) <= 5))) + { + mark_hash_s0 (plains_buf, hashes_shown, 0, gid, 0); + + d_return_buf[lid] = 1; + } + } + + { + tmp[0] = data[0]; + tmp[1] = data[1]; + tmp[2] = data[2]; + tmp[3] = data[3]; + + twofish256_decrypt_xts (ukey2, ukey4, tmp, tmp); + serpent256_decrypt_xts (ukey1, ukey3, tmp, tmp); + + if (((tmp[0] == 0x45555254) && (tmp[3] == 0)) || ((tmp[0] == 0x45555254) && ((tmp[1] >> 16) <= 5))) + { + mark_hash_s0 (plains_buf, hashes_shown, 0, gid, 0); + + d_return_buf[lid] = 1; + } + } +} diff --git a/amd/m06233.cl b/amd/m06233.cl new file mode 100644 index 0000000000..87ea7e96cc --- /dev/null +++ b/amd/m06233.cl @@ -0,0 +1,2136 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _WHIRLPOOL_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW4 +#define VECT_SIZE1 +#endif + +#ifdef VLIW5 +#define VECT_SIZE1 +#endif + +#define DGST_R0 0 +#define DGST_R1 1 +#define DGST_R2 2 +#define DGST_R3 3 + +#include "include/kernel_functions.c" +#include "types_amd.c" +#include "common_amd.c" + +#include "gpu_aes256_amd.c" +#include "gpu_twofish256_amd.c" +#include "gpu_serpent256_amd.c" + +#define R 10 + +#define BOX(S,n,i) (u32) ((S)[(n)][(i)]) + +__constant u32 Ch[8][256] = +{ + { + 0x18186018, 0x23238c23, 0xc6c63fc6, 0xe8e887e8, + 0x87872687, 0xb8b8dab8, 0x01010401, 0x4f4f214f, + 0x3636d836, 0xa6a6a2a6, 0xd2d26fd2, 0xf5f5f3f5, + 0x7979f979, 0x6f6fa16f, 0x91917e91, 0x52525552, + 0x60609d60, 0xbcbccabc, 0x9b9b569b, 0x8e8e028e, + 0xa3a3b6a3, 0x0c0c300c, 0x7b7bf17b, 0x3535d435, + 0x1d1d741d, 0xe0e0a7e0, 0xd7d77bd7, 0xc2c22fc2, + 0x2e2eb82e, 0x4b4b314b, 0xfefedffe, 0x57574157, + 0x15155415, 0x7777c177, 0x3737dc37, 0xe5e5b3e5, + 0x9f9f469f, 0xf0f0e7f0, 0x4a4a354a, 0xdada4fda, + 0x58587d58, 0xc9c903c9, 0x2929a429, 0x0a0a280a, + 0xb1b1feb1, 0xa0a0baa0, 0x6b6bb16b, 0x85852e85, + 0xbdbdcebd, 0x5d5d695d, 0x10104010, 0xf4f4f7f4, + 0xcbcb0bcb, 0x3e3ef83e, 0x05051405, 0x67678167, + 0xe4e4b7e4, 0x27279c27, 0x41411941, 0x8b8b168b, + 0xa7a7a6a7, 0x7d7de97d, 0x95956e95, 0xd8d847d8, + 0xfbfbcbfb, 0xeeee9fee, 0x7c7ced7c, 0x66668566, + 0xdddd53dd, 0x17175c17, 0x47470147, 0x9e9e429e, + 0xcaca0fca, 0x2d2db42d, 0xbfbfc6bf, 0x07071c07, + 0xadad8ead, 0x5a5a755a, 0x83833683, 0x3333cc33, + 0x63639163, 0x02020802, 0xaaaa92aa, 0x7171d971, + 0xc8c807c8, 0x19196419, 0x49493949, 0xd9d943d9, + 0xf2f2eff2, 0xe3e3abe3, 0x5b5b715b, 0x88881a88, + 0x9a9a529a, 0x26269826, 0x3232c832, 0xb0b0fab0, + 0xe9e983e9, 0x0f0f3c0f, 0xd5d573d5, 0x80803a80, + 0xbebec2be, 0xcdcd13cd, 0x3434d034, 0x48483d48, + 0xffffdbff, 0x7a7af57a, 0x90907a90, 0x5f5f615f, + 0x20208020, 0x6868bd68, 0x1a1a681a, 0xaeae82ae, + 0xb4b4eab4, 0x54544d54, 0x93937693, 0x22228822, + 0x64648d64, 0xf1f1e3f1, 0x7373d173, 0x12124812, + 0x40401d40, 0x08082008, 0xc3c32bc3, 0xecec97ec, + 0xdbdb4bdb, 0xa1a1bea1, 0x8d8d0e8d, 0x3d3df43d, + 0x97976697, 0x00000000, 0xcfcf1bcf, 0x2b2bac2b, + 0x7676c576, 0x82823282, 0xd6d67fd6, 0x1b1b6c1b, + 0xb5b5eeb5, 0xafaf86af, 0x6a6ab56a, 0x50505d50, + 0x45450945, 0xf3f3ebf3, 0x3030c030, 0xefef9bef, + 0x3f3ffc3f, 0x55554955, 0xa2a2b2a2, 0xeaea8fea, + 0x65658965, 0xbabad2ba, 0x2f2fbc2f, 0xc0c027c0, + 0xdede5fde, 0x1c1c701c, 0xfdfdd3fd, 0x4d4d294d, + 0x92927292, 0x7575c975, 0x06061806, 0x8a8a128a, + 0xb2b2f2b2, 0xe6e6bfe6, 0x0e0e380e, 0x1f1f7c1f, + 0x62629562, 0xd4d477d4, 0xa8a89aa8, 0x96966296, + 0xf9f9c3f9, 0xc5c533c5, 0x25259425, 0x59597959, + 0x84842a84, 0x7272d572, 0x3939e439, 0x4c4c2d4c, + 0x5e5e655e, 0x7878fd78, 0x3838e038, 0x8c8c0a8c, + 0xd1d163d1, 0xa5a5aea5, 0xe2e2afe2, 0x61619961, + 0xb3b3f6b3, 0x21218421, 0x9c9c4a9c, 0x1e1e781e, + 0x43431143, 0xc7c73bc7, 0xfcfcd7fc, 0x04041004, + 0x51515951, 0x99995e99, 0x6d6da96d, 0x0d0d340d, + 0xfafacffa, 0xdfdf5bdf, 0x7e7ee57e, 0x24249024, + 0x3b3bec3b, 0xabab96ab, 0xcece1fce, 0x11114411, + 0x8f8f068f, 0x4e4e254e, 0xb7b7e6b7, 0xebeb8beb, + 0x3c3cf03c, 0x81813e81, 0x94946a94, 0xf7f7fbf7, + 0xb9b9deb9, 0x13134c13, 0x2c2cb02c, 0xd3d36bd3, + 0xe7e7bbe7, 0x6e6ea56e, 0xc4c437c4, 0x03030c03, + 0x56564556, 0x44440d44, 0x7f7fe17f, 0xa9a99ea9, + 0x2a2aa82a, 0xbbbbd6bb, 0xc1c123c1, 0x53535153, + 0xdcdc57dc, 0x0b0b2c0b, 0x9d9d4e9d, 0x6c6cad6c, + 0x3131c431, 0x7474cd74, 0xf6f6fff6, 0x46460546, + 0xacac8aac, 0x89891e89, 0x14145014, 0xe1e1a3e1, + 0x16165816, 0x3a3ae83a, 0x6969b969, 0x09092409, + 0x7070dd70, 0xb6b6e2b6, 0xd0d067d0, 0xeded93ed, + 0xcccc17cc, 0x42421542, 0x98985a98, 0xa4a4aaa4, + 0x2828a028, 0x5c5c6d5c, 0xf8f8c7f8, 0x86862286, + }, + { + 0xd8181860, 0x2623238c, 0xb8c6c63f, 0xfbe8e887, + 0xcb878726, 0x11b8b8da, 0x09010104, 0x0d4f4f21, + 0x9b3636d8, 0xffa6a6a2, 0x0cd2d26f, 0x0ef5f5f3, + 0x967979f9, 0x306f6fa1, 0x6d91917e, 0xf8525255, + 0x4760609d, 0x35bcbcca, 0x379b9b56, 0x8a8e8e02, + 0xd2a3a3b6, 0x6c0c0c30, 0x847b7bf1, 0x803535d4, + 0xf51d1d74, 0xb3e0e0a7, 0x21d7d77b, 0x9cc2c22f, + 0x432e2eb8, 0x294b4b31, 0x5dfefedf, 0xd5575741, + 0xbd151554, 0xe87777c1, 0x923737dc, 0x9ee5e5b3, + 0x139f9f46, 0x23f0f0e7, 0x204a4a35, 0x44dada4f, + 0xa258587d, 0xcfc9c903, 0x7c2929a4, 0x5a0a0a28, + 0x50b1b1fe, 0xc9a0a0ba, 0x146b6bb1, 0xd985852e, + 0x3cbdbdce, 0x8f5d5d69, 0x90101040, 0x07f4f4f7, + 0xddcbcb0b, 0xd33e3ef8, 0x2d050514, 0x78676781, + 0x97e4e4b7, 0x0227279c, 0x73414119, 0xa78b8b16, + 0xf6a7a7a6, 0xb27d7de9, 0x4995956e, 0x56d8d847, + 0x70fbfbcb, 0xcdeeee9f, 0xbb7c7ced, 0x71666685, + 0x7bdddd53, 0xaf17175c, 0x45474701, 0x1a9e9e42, + 0xd4caca0f, 0x582d2db4, 0x2ebfbfc6, 0x3f07071c, + 0xacadad8e, 0xb05a5a75, 0xef838336, 0xb63333cc, + 0x5c636391, 0x12020208, 0x93aaaa92, 0xde7171d9, + 0xc6c8c807, 0xd1191964, 0x3b494939, 0x5fd9d943, + 0x31f2f2ef, 0xa8e3e3ab, 0xb95b5b71, 0xbc88881a, + 0x3e9a9a52, 0x0b262698, 0xbf3232c8, 0x59b0b0fa, + 0xf2e9e983, 0x770f0f3c, 0x33d5d573, 0xf480803a, + 0x27bebec2, 0xebcdcd13, 0x893434d0, 0x3248483d, + 0x54ffffdb, 0x8d7a7af5, 0x6490907a, 0x9d5f5f61, + 0x3d202080, 0x0f6868bd, 0xca1a1a68, 0xb7aeae82, + 0x7db4b4ea, 0xce54544d, 0x7f939376, 0x2f222288, + 0x6364648d, 0x2af1f1e3, 0xcc7373d1, 0x82121248, + 0x7a40401d, 0x48080820, 0x95c3c32b, 0xdfecec97, + 0x4ddbdb4b, 0xc0a1a1be, 0x918d8d0e, 0xc83d3df4, + 0x5b979766, 0x00000000, 0xf9cfcf1b, 0x6e2b2bac, + 0xe17676c5, 0xe6828232, 0x28d6d67f, 0xc31b1b6c, + 0x74b5b5ee, 0xbeafaf86, 0x1d6a6ab5, 0xea50505d, + 0x57454509, 0x38f3f3eb, 0xad3030c0, 0xc4efef9b, + 0xda3f3ffc, 0xc7555549, 0xdba2a2b2, 0xe9eaea8f, + 0x6a656589, 0x03babad2, 0x4a2f2fbc, 0x8ec0c027, + 0x60dede5f, 0xfc1c1c70, 0x46fdfdd3, 0x1f4d4d29, + 0x76929272, 0xfa7575c9, 0x36060618, 0xae8a8a12, + 0x4bb2b2f2, 0x85e6e6bf, 0x7e0e0e38, 0xe71f1f7c, + 0x55626295, 0x3ad4d477, 0x81a8a89a, 0x52969662, + 0x62f9f9c3, 0xa3c5c533, 0x10252594, 0xab595979, + 0xd084842a, 0xc57272d5, 0xec3939e4, 0x164c4c2d, + 0x945e5e65, 0x9f7878fd, 0xe53838e0, 0x988c8c0a, + 0x17d1d163, 0xe4a5a5ae, 0xa1e2e2af, 0x4e616199, + 0x42b3b3f6, 0x34212184, 0x089c9c4a, 0xee1e1e78, + 0x61434311, 0xb1c7c73b, 0x4ffcfcd7, 0x24040410, + 0xe3515159, 0x2599995e, 0x226d6da9, 0x650d0d34, + 0x79fafacf, 0x69dfdf5b, 0xa97e7ee5, 0x19242490, + 0xfe3b3bec, 0x9aabab96, 0xf0cece1f, 0x99111144, + 0x838f8f06, 0x044e4e25, 0x66b7b7e6, 0xe0ebeb8b, + 0xc13c3cf0, 0xfd81813e, 0x4094946a, 0x1cf7f7fb, + 0x18b9b9de, 0x8b13134c, 0x512c2cb0, 0x05d3d36b, + 0x8ce7e7bb, 0x396e6ea5, 0xaac4c437, 0x1b03030c, + 0xdc565645, 0x5e44440d, 0xa07f7fe1, 0x88a9a99e, + 0x672a2aa8, 0x0abbbbd6, 0x87c1c123, 0xf1535351, + 0x72dcdc57, 0x530b0b2c, 0x019d9d4e, 0x2b6c6cad, + 0xa43131c4, 0xf37474cd, 0x15f6f6ff, 0x4c464605, + 0xa5acac8a, 0xb589891e, 0xb4141450, 0xbae1e1a3, + 0xa6161658, 0xf73a3ae8, 0x066969b9, 0x41090924, + 0xd77070dd, 0x6fb6b6e2, 0x1ed0d067, 0xd6eded93, + 0xe2cccc17, 0x68424215, 0x2c98985a, 0xeda4a4aa, + 0x752828a0, 0x865c5c6d, 0x6bf8f8c7, 0xc2868622, + }, + { + 0x30d81818, 0x46262323, 0x91b8c6c6, 0xcdfbe8e8, + 0x13cb8787, 0x6d11b8b8, 0x02090101, 0x9e0d4f4f, + 0x6c9b3636, 0x51ffa6a6, 0xb90cd2d2, 0xf70ef5f5, + 0xf2967979, 0xde306f6f, 0x3f6d9191, 0xa4f85252, + 0xc0476060, 0x6535bcbc, 0x2b379b9b, 0x018a8e8e, + 0x5bd2a3a3, 0x186c0c0c, 0xf6847b7b, 0x6a803535, + 0x3af51d1d, 0xddb3e0e0, 0xb321d7d7, 0x999cc2c2, + 0x5c432e2e, 0x96294b4b, 0xe15dfefe, 0xaed55757, + 0x2abd1515, 0xeee87777, 0x6e923737, 0xd79ee5e5, + 0x23139f9f, 0xfd23f0f0, 0x94204a4a, 0xa944dada, + 0xb0a25858, 0x8fcfc9c9, 0x527c2929, 0x145a0a0a, + 0x7f50b1b1, 0x5dc9a0a0, 0xd6146b6b, 0x17d98585, + 0x673cbdbd, 0xba8f5d5d, 0x20901010, 0xf507f4f4, + 0x8bddcbcb, 0x7cd33e3e, 0x0a2d0505, 0xce786767, + 0xd597e4e4, 0x4e022727, 0x82734141, 0x0ba78b8b, + 0x53f6a7a7, 0xfab27d7d, 0x37499595, 0xad56d8d8, + 0xeb70fbfb, 0xc1cdeeee, 0xf8bb7c7c, 0xcc716666, + 0xa77bdddd, 0x2eaf1717, 0x8e454747, 0x211a9e9e, + 0x89d4caca, 0x5a582d2d, 0x632ebfbf, 0x0e3f0707, + 0x47acadad, 0xb4b05a5a, 0x1bef8383, 0x66b63333, + 0xc65c6363, 0x04120202, 0x4993aaaa, 0xe2de7171, + 0x8dc6c8c8, 0x32d11919, 0x923b4949, 0xaf5fd9d9, + 0xf931f2f2, 0xdba8e3e3, 0xb6b95b5b, 0x0dbc8888, + 0x293e9a9a, 0x4c0b2626, 0x64bf3232, 0x7d59b0b0, + 0xcff2e9e9, 0x1e770f0f, 0xb733d5d5, 0x1df48080, + 0x6127bebe, 0x87ebcdcd, 0x68893434, 0x90324848, + 0xe354ffff, 0xf48d7a7a, 0x3d649090, 0xbe9d5f5f, + 0x403d2020, 0xd00f6868, 0x34ca1a1a, 0x41b7aeae, + 0x757db4b4, 0xa8ce5454, 0x3b7f9393, 0x442f2222, + 0xc8636464, 0xff2af1f1, 0xe6cc7373, 0x24821212, + 0x807a4040, 0x10480808, 0x9b95c3c3, 0xc5dfecec, + 0xab4ddbdb, 0x5fc0a1a1, 0x07918d8d, 0x7ac83d3d, + 0x335b9797, 0x00000000, 0x83f9cfcf, 0x566e2b2b, + 0xece17676, 0x19e68282, 0xb128d6d6, 0x36c31b1b, + 0x7774b5b5, 0x43beafaf, 0xd41d6a6a, 0xa0ea5050, + 0x8a574545, 0xfb38f3f3, 0x60ad3030, 0xc3c4efef, + 0x7eda3f3f, 0xaac75555, 0x59dba2a2, 0xc9e9eaea, + 0xca6a6565, 0x6903baba, 0x5e4a2f2f, 0x9d8ec0c0, + 0xa160dede, 0x38fc1c1c, 0xe746fdfd, 0x9a1f4d4d, + 0x39769292, 0xeafa7575, 0x0c360606, 0x09ae8a8a, + 0x794bb2b2, 0xd185e6e6, 0x1c7e0e0e, 0x3ee71f1f, + 0xc4556262, 0xb53ad4d4, 0x4d81a8a8, 0x31529696, + 0xef62f9f9, 0x97a3c5c5, 0x4a102525, 0xb2ab5959, + 0x15d08484, 0xe4c57272, 0x72ec3939, 0x98164c4c, + 0xbc945e5e, 0xf09f7878, 0x70e53838, 0x05988c8c, + 0xbf17d1d1, 0x57e4a5a5, 0xd9a1e2e2, 0xc24e6161, + 0x7b42b3b3, 0x42342121, 0x25089c9c, 0x3cee1e1e, + 0x86614343, 0x93b1c7c7, 0xe54ffcfc, 0x08240404, + 0xa2e35151, 0x2f259999, 0xda226d6d, 0x1a650d0d, + 0xe979fafa, 0xa369dfdf, 0xfca97e7e, 0x48192424, + 0x76fe3b3b, 0x4b9aabab, 0x81f0cece, 0x22991111, + 0x03838f8f, 0x9c044e4e, 0x7366b7b7, 0xcbe0ebeb, + 0x78c13c3c, 0x1ffd8181, 0x35409494, 0xf31cf7f7, + 0x6f18b9b9, 0x268b1313, 0x58512c2c, 0xbb05d3d3, + 0xd38ce7e7, 0xdc396e6e, 0x95aac4c4, 0x061b0303, + 0xacdc5656, 0x885e4444, 0xfea07f7f, 0x4f88a9a9, + 0x54672a2a, 0x6b0abbbb, 0x9f87c1c1, 0xa6f15353, + 0xa572dcdc, 0x16530b0b, 0x27019d9d, 0xd82b6c6c, + 0x62a43131, 0xe8f37474, 0xf115f6f6, 0x8c4c4646, + 0x45a5acac, 0x0fb58989, 0x28b41414, 0xdfbae1e1, + 0x2ca61616, 0x74f73a3a, 0xd2066969, 0x12410909, + 0xe0d77070, 0x716fb6b6, 0xbd1ed0d0, 0xc7d6eded, + 0x85e2cccc, 0x84684242, 0x2d2c9898, 0x55eda4a4, + 0x50752828, 0xb8865c5c, 0xed6bf8f8, 0x11c28686, + }, + { + 0x7830d818, 0xaf462623, 0xf991b8c6, 0x6fcdfbe8, + 0xa113cb87, 0x626d11b8, 0x05020901, 0x6e9e0d4f, + 0xee6c9b36, 0x0451ffa6, 0xbdb90cd2, 0x06f70ef5, + 0x80f29679, 0xcede306f, 0xef3f6d91, 0x07a4f852, + 0xfdc04760, 0x766535bc, 0xcd2b379b, 0x8c018a8e, + 0x155bd2a3, 0x3c186c0c, 0x8af6847b, 0xe16a8035, + 0x693af51d, 0x47ddb3e0, 0xacb321d7, 0xed999cc2, + 0x965c432e, 0x7a96294b, 0x21e15dfe, 0x16aed557, + 0x412abd15, 0xb6eee877, 0xeb6e9237, 0x56d79ee5, + 0xd923139f, 0x17fd23f0, 0x7f94204a, 0x95a944da, + 0x25b0a258, 0xca8fcfc9, 0x8d527c29, 0x22145a0a, + 0x4f7f50b1, 0x1a5dc9a0, 0xdad6146b, 0xab17d985, + 0x73673cbd, 0x34ba8f5d, 0x50209010, 0x03f507f4, + 0xc08bddcb, 0xc67cd33e, 0x110a2d05, 0xe6ce7867, + 0x53d597e4, 0xbb4e0227, 0x58827341, 0x9d0ba78b, + 0x0153f6a7, 0x94fab27d, 0xfb374995, 0x9fad56d8, + 0x30eb70fb, 0x71c1cdee, 0x91f8bb7c, 0xe3cc7166, + 0x8ea77bdd, 0x4b2eaf17, 0x468e4547, 0xdc211a9e, + 0xc589d4ca, 0x995a582d, 0x79632ebf, 0x1b0e3f07, + 0x2347acad, 0x2fb4b05a, 0xb51bef83, 0xff66b633, + 0xf2c65c63, 0x0a041202, 0x384993aa, 0xa8e2de71, + 0xcf8dc6c8, 0x7d32d119, 0x70923b49, 0x9aaf5fd9, + 0x1df931f2, 0x48dba8e3, 0x2ab6b95b, 0x920dbc88, + 0xc8293e9a, 0xbe4c0b26, 0xfa64bf32, 0x4a7d59b0, + 0x6acff2e9, 0x331e770f, 0xa6b733d5, 0xba1df480, + 0x7c6127be, 0xde87ebcd, 0xe4688934, 0x75903248, + 0x24e354ff, 0x8ff48d7a, 0xea3d6490, 0x3ebe9d5f, + 0xa0403d20, 0xd5d00f68, 0x7234ca1a, 0x2c41b7ae, + 0x5e757db4, 0x19a8ce54, 0xe53b7f93, 0xaa442f22, + 0xe9c86364, 0x12ff2af1, 0xa2e6cc73, 0x5a248212, + 0x5d807a40, 0x28104808, 0xe89b95c3, 0x7bc5dfec, + 0x90ab4ddb, 0x1f5fc0a1, 0x8307918d, 0xc97ac83d, + 0xf1335b97, 0x00000000, 0xd483f9cf, 0x87566e2b, + 0xb3ece176, 0xb019e682, 0xa9b128d6, 0x7736c31b, + 0x5b7774b5, 0x2943beaf, 0xdfd41d6a, 0x0da0ea50, + 0x4c8a5745, 0x18fb38f3, 0xf060ad30, 0x74c3c4ef, + 0xc37eda3f, 0x1caac755, 0x1059dba2, 0x65c9e9ea, + 0xecca6a65, 0x686903ba, 0x935e4a2f, 0xe79d8ec0, + 0x81a160de, 0x6c38fc1c, 0x2ee746fd, 0x649a1f4d, + 0xe0397692, 0xbceafa75, 0x1e0c3606, 0x9809ae8a, + 0x40794bb2, 0x59d185e6, 0x361c7e0e, 0x633ee71f, + 0xf7c45562, 0xa3b53ad4, 0x324d81a8, 0xf4315296, + 0x3aef62f9, 0xf697a3c5, 0xb14a1025, 0x20b2ab59, + 0xae15d084, 0xa7e4c572, 0xdd72ec39, 0x6198164c, + 0x3bbc945e, 0x85f09f78, 0xd870e538, 0x8605988c, + 0xb2bf17d1, 0x0b57e4a5, 0x4dd9a1e2, 0xf8c24e61, + 0x457b42b3, 0xa5423421, 0xd625089c, 0x663cee1e, + 0x52866143, 0xfc93b1c7, 0x2be54ffc, 0x14082404, + 0x08a2e351, 0xc72f2599, 0xc4da226d, 0x391a650d, + 0x35e979fa, 0x84a369df, 0x9bfca97e, 0xb4481924, + 0xd776fe3b, 0x3d4b9aab, 0xd181f0ce, 0x55229911, + 0x8903838f, 0x6b9c044e, 0x517366b7, 0x60cbe0eb, + 0xcc78c13c, 0xbf1ffd81, 0xfe354094, 0x0cf31cf7, + 0x676f18b9, 0x5f268b13, 0x9c58512c, 0xb8bb05d3, + 0x5cd38ce7, 0xcbdc396e, 0xf395aac4, 0x0f061b03, + 0x13acdc56, 0x49885e44, 0x9efea07f, 0x374f88a9, + 0x8254672a, 0x6d6b0abb, 0xe29f87c1, 0x02a6f153, + 0x8ba572dc, 0x2716530b, 0xd327019d, 0xc1d82b6c, + 0xf562a431, 0xb9e8f374, 0x09f115f6, 0x438c4c46, + 0x2645a5ac, 0x970fb589, 0x4428b414, 0x42dfbae1, + 0x4e2ca616, 0xd274f73a, 0xd0d20669, 0x2d124109, + 0xade0d770, 0x54716fb6, 0xb7bd1ed0, 0x7ec7d6ed, + 0xdb85e2cc, 0x57846842, 0xc22d2c98, 0x0e55eda4, + 0x88507528, 0x31b8865c, 0x3fed6bf8, 0xa411c286, + }, + { + 0xc07830d8, 0x05af4626, 0x7ef991b8, 0x136fcdfb, + 0x4ca113cb, 0xa9626d11, 0x08050209, 0x426e9e0d, + 0xadee6c9b, 0x590451ff, 0xdebdb90c, 0xfb06f70e, + 0xef80f296, 0x5fcede30, 0xfcef3f6d, 0xaa07a4f8, + 0x27fdc047, 0x89766535, 0xaccd2b37, 0x048c018a, + 0x71155bd2, 0x603c186c, 0xff8af684, 0xb5e16a80, + 0xe8693af5, 0x5347ddb3, 0xf6acb321, 0x5eed999c, + 0x6d965c43, 0x627a9629, 0xa321e15d, 0x8216aed5, + 0xa8412abd, 0x9fb6eee8, 0xa5eb6e92, 0x7b56d79e, + 0x8cd92313, 0xd317fd23, 0x6a7f9420, 0x9e95a944, + 0xfa25b0a2, 0x06ca8fcf, 0x558d527c, 0x5022145a, + 0xe14f7f50, 0x691a5dc9, 0x7fdad614, 0x5cab17d9, + 0x8173673c, 0xd234ba8f, 0x80502090, 0xf303f507, + 0x16c08bdd, 0xedc67cd3, 0x28110a2d, 0x1fe6ce78, + 0x7353d597, 0x25bb4e02, 0x32588273, 0x2c9d0ba7, + 0x510153f6, 0xcf94fab2, 0xdcfb3749, 0x8e9fad56, + 0x8b30eb70, 0x2371c1cd, 0xc791f8bb, 0x17e3cc71, + 0xa68ea77b, 0xb84b2eaf, 0x02468e45, 0x84dc211a, + 0x1ec589d4, 0x75995a58, 0x9179632e, 0x381b0e3f, + 0x012347ac, 0xea2fb4b0, 0x6cb51bef, 0x85ff66b6, + 0x3ff2c65c, 0x100a0412, 0x39384993, 0xafa8e2de, + 0x0ecf8dc6, 0xc87d32d1, 0x7270923b, 0x869aaf5f, + 0xc31df931, 0x4b48dba8, 0xe22ab6b9, 0x34920dbc, + 0xa4c8293e, 0x2dbe4c0b, 0x8dfa64bf, 0xe94a7d59, + 0x1b6acff2, 0x78331e77, 0xe6a6b733, 0x74ba1df4, + 0x997c6127, 0x26de87eb, 0xbde46889, 0x7a759032, + 0xab24e354, 0xf78ff48d, 0xf4ea3d64, 0xc23ebe9d, + 0x1da0403d, 0x67d5d00f, 0xd07234ca, 0x192c41b7, + 0xc95e757d, 0x9a19a8ce, 0xece53b7f, 0x0daa442f, + 0x07e9c863, 0xdb12ff2a, 0xbfa2e6cc, 0x905a2482, + 0x3a5d807a, 0x40281048, 0x56e89b95, 0x337bc5df, + 0x9690ab4d, 0x611f5fc0, 0x1c830791, 0xf5c97ac8, + 0xccf1335b, 0x00000000, 0x36d483f9, 0x4587566e, + 0x97b3ece1, 0x64b019e6, 0xfea9b128, 0xd87736c3, + 0xc15b7774, 0x112943be, 0x77dfd41d, 0xba0da0ea, + 0x124c8a57, 0xcb18fb38, 0x9df060ad, 0x2b74c3c4, + 0xe5c37eda, 0x921caac7, 0x791059db, 0x0365c9e9, + 0x0fecca6a, 0xb9686903, 0x65935e4a, 0x4ee79d8e, + 0xbe81a160, 0xe06c38fc, 0xbb2ee746, 0x52649a1f, + 0xe4e03976, 0x8fbceafa, 0x301e0c36, 0x249809ae, + 0xf940794b, 0x6359d185, 0x70361c7e, 0xf8633ee7, + 0x37f7c455, 0xeea3b53a, 0x29324d81, 0xc4f43152, + 0x9b3aef62, 0x66f697a3, 0x35b14a10, 0xf220b2ab, + 0x54ae15d0, 0xb7a7e4c5, 0xd5dd72ec, 0x5a619816, + 0xca3bbc94, 0xe785f09f, 0xddd870e5, 0x14860598, + 0xc6b2bf17, 0x410b57e4, 0x434dd9a1, 0x2ff8c24e, + 0xf1457b42, 0x15a54234, 0x94d62508, 0xf0663cee, + 0x22528661, 0x76fc93b1, 0xb32be54f, 0x20140824, + 0xb208a2e3, 0xbcc72f25, 0x4fc4da22, 0x68391a65, + 0x8335e979, 0xb684a369, 0xd79bfca9, 0x3db44819, + 0xc5d776fe, 0x313d4b9a, 0x3ed181f0, 0x88552299, + 0x0c890383, 0x4a6b9c04, 0xd1517366, 0x0b60cbe0, + 0xfdcc78c1, 0x7cbf1ffd, 0xd4fe3540, 0xeb0cf31c, + 0xa1676f18, 0x985f268b, 0x7d9c5851, 0xd6b8bb05, + 0x6b5cd38c, 0x57cbdc39, 0x6ef395aa, 0x180f061b, + 0x8a13acdc, 0x1a49885e, 0xdf9efea0, 0x21374f88, + 0x4d825467, 0xb16d6b0a, 0x46e29f87, 0xa202a6f1, + 0xae8ba572, 0x58271653, 0x9cd32701, 0x47c1d82b, + 0x95f562a4, 0x87b9e8f3, 0xe309f115, 0x0a438c4c, + 0x092645a5, 0x3c970fb5, 0xa04428b4, 0x5b42dfba, + 0xb04e2ca6, 0xcdd274f7, 0x6fd0d206, 0x482d1241, + 0xa7ade0d7, 0xd954716f, 0xceb7bd1e, 0x3b7ec7d6, + 0x2edb85e2, 0x2a578468, 0xb4c22d2c, 0x490e55ed, + 0x5d885075, 0xda31b886, 0x933fed6b, 0x44a411c2, + }, + { + 0x18c07830, 0x2305af46, 0xc67ef991, 0xe8136fcd, + 0x874ca113, 0xb8a9626d, 0x01080502, 0x4f426e9e, + 0x36adee6c, 0xa6590451, 0xd2debdb9, 0xf5fb06f7, + 0x79ef80f2, 0x6f5fcede, 0x91fcef3f, 0x52aa07a4, + 0x6027fdc0, 0xbc897665, 0x9baccd2b, 0x8e048c01, + 0xa371155b, 0x0c603c18, 0x7bff8af6, 0x35b5e16a, + 0x1de8693a, 0xe05347dd, 0xd7f6acb3, 0xc25eed99, + 0x2e6d965c, 0x4b627a96, 0xfea321e1, 0x578216ae, + 0x15a8412a, 0x779fb6ee, 0x37a5eb6e, 0xe57b56d7, + 0x9f8cd923, 0xf0d317fd, 0x4a6a7f94, 0xda9e95a9, + 0x58fa25b0, 0xc906ca8f, 0x29558d52, 0x0a502214, + 0xb1e14f7f, 0xa0691a5d, 0x6b7fdad6, 0x855cab17, + 0xbd817367, 0x5dd234ba, 0x10805020, 0xf4f303f5, + 0xcb16c08b, 0x3eedc67c, 0x0528110a, 0x671fe6ce, + 0xe47353d5, 0x2725bb4e, 0x41325882, 0x8b2c9d0b, + 0xa7510153, 0x7dcf94fa, 0x95dcfb37, 0xd88e9fad, + 0xfb8b30eb, 0xee2371c1, 0x7cc791f8, 0x6617e3cc, + 0xdda68ea7, 0x17b84b2e, 0x4702468e, 0x9e84dc21, + 0xca1ec589, 0x2d75995a, 0xbf917963, 0x07381b0e, + 0xad012347, 0x5aea2fb4, 0x836cb51b, 0x3385ff66, + 0x633ff2c6, 0x02100a04, 0xaa393849, 0x71afa8e2, + 0xc80ecf8d, 0x19c87d32, 0x49727092, 0xd9869aaf, + 0xf2c31df9, 0xe34b48db, 0x5be22ab6, 0x8834920d, + 0x9aa4c829, 0x262dbe4c, 0x328dfa64, 0xb0e94a7d, + 0xe91b6acf, 0x0f78331e, 0xd5e6a6b7, 0x8074ba1d, + 0xbe997c61, 0xcd26de87, 0x34bde468, 0x487a7590, + 0xffab24e3, 0x7af78ff4, 0x90f4ea3d, 0x5fc23ebe, + 0x201da040, 0x6867d5d0, 0x1ad07234, 0xae192c41, + 0xb4c95e75, 0x549a19a8, 0x93ece53b, 0x220daa44, + 0x6407e9c8, 0xf1db12ff, 0x73bfa2e6, 0x12905a24, + 0x403a5d80, 0x08402810, 0xc356e89b, 0xec337bc5, + 0xdb9690ab, 0xa1611f5f, 0x8d1c8307, 0x3df5c97a, + 0x97ccf133, 0x00000000, 0xcf36d483, 0x2b458756, + 0x7697b3ec, 0x8264b019, 0xd6fea9b1, 0x1bd87736, + 0xb5c15b77, 0xaf112943, 0x6a77dfd4, 0x50ba0da0, + 0x45124c8a, 0xf3cb18fb, 0x309df060, 0xef2b74c3, + 0x3fe5c37e, 0x55921caa, 0xa2791059, 0xea0365c9, + 0x650fecca, 0xbab96869, 0x2f65935e, 0xc04ee79d, + 0xdebe81a1, 0x1ce06c38, 0xfdbb2ee7, 0x4d52649a, + 0x92e4e039, 0x758fbcea, 0x06301e0c, 0x8a249809, + 0xb2f94079, 0xe66359d1, 0x0e70361c, 0x1ff8633e, + 0x6237f7c4, 0xd4eea3b5, 0xa829324d, 0x96c4f431, + 0xf99b3aef, 0xc566f697, 0x2535b14a, 0x59f220b2, + 0x8454ae15, 0x72b7a7e4, 0x39d5dd72, 0x4c5a6198, + 0x5eca3bbc, 0x78e785f0, 0x38ddd870, 0x8c148605, + 0xd1c6b2bf, 0xa5410b57, 0xe2434dd9, 0x612ff8c2, + 0xb3f1457b, 0x2115a542, 0x9c94d625, 0x1ef0663c, + 0x43225286, 0xc776fc93, 0xfcb32be5, 0x04201408, + 0x51b208a2, 0x99bcc72f, 0x6d4fc4da, 0x0d68391a, + 0xfa8335e9, 0xdfb684a3, 0x7ed79bfc, 0x243db448, + 0x3bc5d776, 0xab313d4b, 0xce3ed181, 0x11885522, + 0x8f0c8903, 0x4e4a6b9c, 0xb7d15173, 0xeb0b60cb, + 0x3cfdcc78, 0x817cbf1f, 0x94d4fe35, 0xf7eb0cf3, + 0xb9a1676f, 0x13985f26, 0x2c7d9c58, 0xd3d6b8bb, + 0xe76b5cd3, 0x6e57cbdc, 0xc46ef395, 0x03180f06, + 0x568a13ac, 0x441a4988, 0x7fdf9efe, 0xa921374f, + 0x2a4d8254, 0xbbb16d6b, 0xc146e29f, 0x53a202a6, + 0xdcae8ba5, 0x0b582716, 0x9d9cd327, 0x6c47c1d8, + 0x3195f562, 0x7487b9e8, 0xf6e309f1, 0x460a438c, + 0xac092645, 0x893c970f, 0x14a04428, 0xe15b42df, + 0x16b04e2c, 0x3acdd274, 0x696fd0d2, 0x09482d12, + 0x70a7ade0, 0xb6d95471, 0xd0ceb7bd, 0xed3b7ec7, + 0xcc2edb85, 0x422a5784, 0x98b4c22d, 0xa4490e55, + 0x285d8850, 0x5cda31b8, 0xf8933fed, 0x8644a411, + }, + { + 0x6018c078, 0x8c2305af, 0x3fc67ef9, 0x87e8136f, + 0x26874ca1, 0xdab8a962, 0x04010805, 0x214f426e, + 0xd836adee, 0xa2a65904, 0x6fd2debd, 0xf3f5fb06, + 0xf979ef80, 0xa16f5fce, 0x7e91fcef, 0x5552aa07, + 0x9d6027fd, 0xcabc8976, 0x569baccd, 0x028e048c, + 0xb6a37115, 0x300c603c, 0xf17bff8a, 0xd435b5e1, + 0x741de869, 0xa7e05347, 0x7bd7f6ac, 0x2fc25eed, + 0xb82e6d96, 0x314b627a, 0xdffea321, 0x41578216, + 0x5415a841, 0xc1779fb6, 0xdc37a5eb, 0xb3e57b56, + 0x469f8cd9, 0xe7f0d317, 0x354a6a7f, 0x4fda9e95, + 0x7d58fa25, 0x03c906ca, 0xa429558d, 0x280a5022, + 0xfeb1e14f, 0xbaa0691a, 0xb16b7fda, 0x2e855cab, + 0xcebd8173, 0x695dd234, 0x40108050, 0xf7f4f303, + 0x0bcb16c0, 0xf83eedc6, 0x14052811, 0x81671fe6, + 0xb7e47353, 0x9c2725bb, 0x19413258, 0x168b2c9d, + 0xa6a75101, 0xe97dcf94, 0x6e95dcfb, 0x47d88e9f, + 0xcbfb8b30, 0x9fee2371, 0xed7cc791, 0x856617e3, + 0x53dda68e, 0x5c17b84b, 0x01470246, 0x429e84dc, + 0x0fca1ec5, 0xb42d7599, 0xc6bf9179, 0x1c07381b, + 0x8ead0123, 0x755aea2f, 0x36836cb5, 0xcc3385ff, + 0x91633ff2, 0x0802100a, 0x92aa3938, 0xd971afa8, + 0x07c80ecf, 0x6419c87d, 0x39497270, 0x43d9869a, + 0xeff2c31d, 0xabe34b48, 0x715be22a, 0x1a883492, + 0x529aa4c8, 0x98262dbe, 0xc8328dfa, 0xfab0e94a, + 0x83e91b6a, 0x3c0f7833, 0x73d5e6a6, 0x3a8074ba, + 0xc2be997c, 0x13cd26de, 0xd034bde4, 0x3d487a75, + 0xdbffab24, 0xf57af78f, 0x7a90f4ea, 0x615fc23e, + 0x80201da0, 0xbd6867d5, 0x681ad072, 0x82ae192c, + 0xeab4c95e, 0x4d549a19, 0x7693ece5, 0x88220daa, + 0x8d6407e9, 0xe3f1db12, 0xd173bfa2, 0x4812905a, + 0x1d403a5d, 0x20084028, 0x2bc356e8, 0x97ec337b, + 0x4bdb9690, 0xbea1611f, 0x0e8d1c83, 0xf43df5c9, + 0x6697ccf1, 0x00000000, 0x1bcf36d4, 0xac2b4587, + 0xc57697b3, 0x328264b0, 0x7fd6fea9, 0x6c1bd877, + 0xeeb5c15b, 0x86af1129, 0xb56a77df, 0x5d50ba0d, + 0x0945124c, 0xebf3cb18, 0xc0309df0, 0x9bef2b74, + 0xfc3fe5c3, 0x4955921c, 0xb2a27910, 0x8fea0365, + 0x89650fec, 0xd2bab968, 0xbc2f6593, 0x27c04ee7, + 0x5fdebe81, 0x701ce06c, 0xd3fdbb2e, 0x294d5264, + 0x7292e4e0, 0xc9758fbc, 0x1806301e, 0x128a2498, + 0xf2b2f940, 0xbfe66359, 0x380e7036, 0x7c1ff863, + 0x956237f7, 0x77d4eea3, 0x9aa82932, 0x6296c4f4, + 0xc3f99b3a, 0x33c566f6, 0x942535b1, 0x7959f220, + 0x2a8454ae, 0xd572b7a7, 0xe439d5dd, 0x2d4c5a61, + 0x655eca3b, 0xfd78e785, 0xe038ddd8, 0x0a8c1486, + 0x63d1c6b2, 0xaea5410b, 0xafe2434d, 0x99612ff8, + 0xf6b3f145, 0x842115a5, 0x4a9c94d6, 0x781ef066, + 0x11432252, 0x3bc776fc, 0xd7fcb32b, 0x10042014, + 0x5951b208, 0x5e99bcc7, 0xa96d4fc4, 0x340d6839, + 0xcffa8335, 0x5bdfb684, 0xe57ed79b, 0x90243db4, + 0xec3bc5d7, 0x96ab313d, 0x1fce3ed1, 0x44118855, + 0x068f0c89, 0x254e4a6b, 0xe6b7d151, 0x8beb0b60, + 0xf03cfdcc, 0x3e817cbf, 0x6a94d4fe, 0xfbf7eb0c, + 0xdeb9a167, 0x4c13985f, 0xb02c7d9c, 0x6bd3d6b8, + 0xbbe76b5c, 0xa56e57cb, 0x37c46ef3, 0x0c03180f, + 0x45568a13, 0x0d441a49, 0xe17fdf9e, 0x9ea92137, + 0xa82a4d82, 0xd6bbb16d, 0x23c146e2, 0x5153a202, + 0x57dcae8b, 0x2c0b5827, 0x4e9d9cd3, 0xad6c47c1, + 0xc43195f5, 0xcd7487b9, 0xfff6e309, 0x05460a43, + 0x8aac0926, 0x1e893c97, 0x5014a044, 0xa3e15b42, + 0x5816b04e, 0xe83acdd2, 0xb9696fd0, 0x2409482d, + 0xdd70a7ad, 0xe2b6d954, 0x67d0ceb7, 0x93ed3b7e, + 0x17cc2edb, 0x15422a57, 0x5a98b4c2, 0xaaa4490e, + 0xa0285d88, 0x6d5cda31, 0xc7f8933f, 0x228644a4, + }, + { + 0x186018c0, 0x238c2305, 0xc63fc67e, 0xe887e813, + 0x8726874c, 0xb8dab8a9, 0x01040108, 0x4f214f42, + 0x36d836ad, 0xa6a2a659, 0xd26fd2de, 0xf5f3f5fb, + 0x79f979ef, 0x6fa16f5f, 0x917e91fc, 0x525552aa, + 0x609d6027, 0xbccabc89, 0x9b569bac, 0x8e028e04, + 0xa3b6a371, 0x0c300c60, 0x7bf17bff, 0x35d435b5, + 0x1d741de8, 0xe0a7e053, 0xd77bd7f6, 0xc22fc25e, + 0x2eb82e6d, 0x4b314b62, 0xfedffea3, 0x57415782, + 0x155415a8, 0x77c1779f, 0x37dc37a5, 0xe5b3e57b, + 0x9f469f8c, 0xf0e7f0d3, 0x4a354a6a, 0xda4fda9e, + 0x587d58fa, 0xc903c906, 0x29a42955, 0x0a280a50, + 0xb1feb1e1, 0xa0baa069, 0x6bb16b7f, 0x852e855c, + 0xbdcebd81, 0x5d695dd2, 0x10401080, 0xf4f7f4f3, + 0xcb0bcb16, 0x3ef83eed, 0x05140528, 0x6781671f, + 0xe4b7e473, 0x279c2725, 0x41194132, 0x8b168b2c, + 0xa7a6a751, 0x7de97dcf, 0x956e95dc, 0xd847d88e, + 0xfbcbfb8b, 0xee9fee23, 0x7ced7cc7, 0x66856617, + 0xdd53dda6, 0x175c17b8, 0x47014702, 0x9e429e84, + 0xca0fca1e, 0x2db42d75, 0xbfc6bf91, 0x071c0738, + 0xad8ead01, 0x5a755aea, 0x8336836c, 0x33cc3385, + 0x6391633f, 0x02080210, 0xaa92aa39, 0x71d971af, + 0xc807c80e, 0x196419c8, 0x49394972, 0xd943d986, + 0xf2eff2c3, 0xe3abe34b, 0x5b715be2, 0x881a8834, + 0x9a529aa4, 0x2698262d, 0x32c8328d, 0xb0fab0e9, + 0xe983e91b, 0x0f3c0f78, 0xd573d5e6, 0x803a8074, + 0xbec2be99, 0xcd13cd26, 0x34d034bd, 0x483d487a, + 0xffdbffab, 0x7af57af7, 0x907a90f4, 0x5f615fc2, + 0x2080201d, 0x68bd6867, 0x1a681ad0, 0xae82ae19, + 0xb4eab4c9, 0x544d549a, 0x937693ec, 0x2288220d, + 0x648d6407, 0xf1e3f1db, 0x73d173bf, 0x12481290, + 0x401d403a, 0x08200840, 0xc32bc356, 0xec97ec33, + 0xdb4bdb96, 0xa1bea161, 0x8d0e8d1c, 0x3df43df5, + 0x976697cc, 0x00000000, 0xcf1bcf36, 0x2bac2b45, + 0x76c57697, 0x82328264, 0xd67fd6fe, 0x1b6c1bd8, + 0xb5eeb5c1, 0xaf86af11, 0x6ab56a77, 0x505d50ba, + 0x45094512, 0xf3ebf3cb, 0x30c0309d, 0xef9bef2b, + 0x3ffc3fe5, 0x55495592, 0xa2b2a279, 0xea8fea03, + 0x6589650f, 0xbad2bab9, 0x2fbc2f65, 0xc027c04e, + 0xde5fdebe, 0x1c701ce0, 0xfdd3fdbb, 0x4d294d52, + 0x927292e4, 0x75c9758f, 0x06180630, 0x8a128a24, + 0xb2f2b2f9, 0xe6bfe663, 0x0e380e70, 0x1f7c1ff8, + 0x62956237, 0xd477d4ee, 0xa89aa829, 0x966296c4, + 0xf9c3f99b, 0xc533c566, 0x25942535, 0x597959f2, + 0x842a8454, 0x72d572b7, 0x39e439d5, 0x4c2d4c5a, + 0x5e655eca, 0x78fd78e7, 0x38e038dd, 0x8c0a8c14, + 0xd163d1c6, 0xa5aea541, 0xe2afe243, 0x6199612f, + 0xb3f6b3f1, 0x21842115, 0x9c4a9c94, 0x1e781ef0, + 0x43114322, 0xc73bc776, 0xfcd7fcb3, 0x04100420, + 0x515951b2, 0x995e99bc, 0x6da96d4f, 0x0d340d68, + 0xfacffa83, 0xdf5bdfb6, 0x7ee57ed7, 0x2490243d, + 0x3bec3bc5, 0xab96ab31, 0xce1fce3e, 0x11441188, + 0x8f068f0c, 0x4e254e4a, 0xb7e6b7d1, 0xeb8beb0b, + 0x3cf03cfd, 0x813e817c, 0x946a94d4, 0xf7fbf7eb, + 0xb9deb9a1, 0x134c1398, 0x2cb02c7d, 0xd36bd3d6, + 0xe7bbe76b, 0x6ea56e57, 0xc437c46e, 0x030c0318, + 0x5645568a, 0x440d441a, 0x7fe17fdf, 0xa99ea921, + 0x2aa82a4d, 0xbbd6bbb1, 0xc123c146, 0x535153a2, + 0xdc57dcae, 0x0b2c0b58, 0x9d4e9d9c, 0x6cad6c47, + 0x31c43195, 0x74cd7487, 0xf6fff6e3, 0x4605460a, + 0xac8aac09, 0x891e893c, 0x145014a0, 0xe1a3e15b, + 0x165816b0, 0x3ae83acd, 0x69b9696f, 0x09240948, + 0x70dd70a7, 0xb6e2b6d9, 0xd067d0ce, 0xed93ed3b, + 0xcc17cc2e, 0x4215422a, 0x985a98b4, 0xa4aaa449, + 0x28a0285d, 0x5c6d5cda, 0xf8c7f893, 0x86228644, + } +}; + +__constant u32 Cl[8][256] = +{ + { + 0xc07830d8, 0x05af4626, 0x7ef991b8, 0x136fcdfb, + 0x4ca113cb, 0xa9626d11, 0x08050209, 0x426e9e0d, + 0xadee6c9b, 0x590451ff, 0xdebdb90c, 0xfb06f70e, + 0xef80f296, 0x5fcede30, 0xfcef3f6d, 0xaa07a4f8, + 0x27fdc047, 0x89766535, 0xaccd2b37, 0x048c018a, + 0x71155bd2, 0x603c186c, 0xff8af684, 0xb5e16a80, + 0xe8693af5, 0x5347ddb3, 0xf6acb321, 0x5eed999c, + 0x6d965c43, 0x627a9629, 0xa321e15d, 0x8216aed5, + 0xa8412abd, 0x9fb6eee8, 0xa5eb6e92, 0x7b56d79e, + 0x8cd92313, 0xd317fd23, 0x6a7f9420, 0x9e95a944, + 0xfa25b0a2, 0x06ca8fcf, 0x558d527c, 0x5022145a, + 0xe14f7f50, 0x691a5dc9, 0x7fdad614, 0x5cab17d9, + 0x8173673c, 0xd234ba8f, 0x80502090, 0xf303f507, + 0x16c08bdd, 0xedc67cd3, 0x28110a2d, 0x1fe6ce78, + 0x7353d597, 0x25bb4e02, 0x32588273, 0x2c9d0ba7, + 0x510153f6, 0xcf94fab2, 0xdcfb3749, 0x8e9fad56, + 0x8b30eb70, 0x2371c1cd, 0xc791f8bb, 0x17e3cc71, + 0xa68ea77b, 0xb84b2eaf, 0x02468e45, 0x84dc211a, + 0x1ec589d4, 0x75995a58, 0x9179632e, 0x381b0e3f, + 0x012347ac, 0xea2fb4b0, 0x6cb51bef, 0x85ff66b6, + 0x3ff2c65c, 0x100a0412, 0x39384993, 0xafa8e2de, + 0x0ecf8dc6, 0xc87d32d1, 0x7270923b, 0x869aaf5f, + 0xc31df931, 0x4b48dba8, 0xe22ab6b9, 0x34920dbc, + 0xa4c8293e, 0x2dbe4c0b, 0x8dfa64bf, 0xe94a7d59, + 0x1b6acff2, 0x78331e77, 0xe6a6b733, 0x74ba1df4, + 0x997c6127, 0x26de87eb, 0xbde46889, 0x7a759032, + 0xab24e354, 0xf78ff48d, 0xf4ea3d64, 0xc23ebe9d, + 0x1da0403d, 0x67d5d00f, 0xd07234ca, 0x192c41b7, + 0xc95e757d, 0x9a19a8ce, 0xece53b7f, 0x0daa442f, + 0x07e9c863, 0xdb12ff2a, 0xbfa2e6cc, 0x905a2482, + 0x3a5d807a, 0x40281048, 0x56e89b95, 0x337bc5df, + 0x9690ab4d, 0x611f5fc0, 0x1c830791, 0xf5c97ac8, + 0xccf1335b, 0x00000000, 0x36d483f9, 0x4587566e, + 0x97b3ece1, 0x64b019e6, 0xfea9b128, 0xd87736c3, + 0xc15b7774, 0x112943be, 0x77dfd41d, 0xba0da0ea, + 0x124c8a57, 0xcb18fb38, 0x9df060ad, 0x2b74c3c4, + 0xe5c37eda, 0x921caac7, 0x791059db, 0x0365c9e9, + 0x0fecca6a, 0xb9686903, 0x65935e4a, 0x4ee79d8e, + 0xbe81a160, 0xe06c38fc, 0xbb2ee746, 0x52649a1f, + 0xe4e03976, 0x8fbceafa, 0x301e0c36, 0x249809ae, + 0xf940794b, 0x6359d185, 0x70361c7e, 0xf8633ee7, + 0x37f7c455, 0xeea3b53a, 0x29324d81, 0xc4f43152, + 0x9b3aef62, 0x66f697a3, 0x35b14a10, 0xf220b2ab, + 0x54ae15d0, 0xb7a7e4c5, 0xd5dd72ec, 0x5a619816, + 0xca3bbc94, 0xe785f09f, 0xddd870e5, 0x14860598, + 0xc6b2bf17, 0x410b57e4, 0x434dd9a1, 0x2ff8c24e, + 0xf1457b42, 0x15a54234, 0x94d62508, 0xf0663cee, + 0x22528661, 0x76fc93b1, 0xb32be54f, 0x20140824, + 0xb208a2e3, 0xbcc72f25, 0x4fc4da22, 0x68391a65, + 0x8335e979, 0xb684a369, 0xd79bfca9, 0x3db44819, + 0xc5d776fe, 0x313d4b9a, 0x3ed181f0, 0x88552299, + 0x0c890383, 0x4a6b9c04, 0xd1517366, 0x0b60cbe0, + 0xfdcc78c1, 0x7cbf1ffd, 0xd4fe3540, 0xeb0cf31c, + 0xa1676f18, 0x985f268b, 0x7d9c5851, 0xd6b8bb05, + 0x6b5cd38c, 0x57cbdc39, 0x6ef395aa, 0x180f061b, + 0x8a13acdc, 0x1a49885e, 0xdf9efea0, 0x21374f88, + 0x4d825467, 0xb16d6b0a, 0x46e29f87, 0xa202a6f1, + 0xae8ba572, 0x58271653, 0x9cd32701, 0x47c1d82b, + 0x95f562a4, 0x87b9e8f3, 0xe309f115, 0x0a438c4c, + 0x092645a5, 0x3c970fb5, 0xa04428b4, 0x5b42dfba, + 0xb04e2ca6, 0xcdd274f7, 0x6fd0d206, 0x482d1241, + 0xa7ade0d7, 0xd954716f, 0xceb7bd1e, 0x3b7ec7d6, + 0x2edb85e2, 0x2a578468, 0xb4c22d2c, 0x490e55ed, + 0x5d885075, 0xda31b886, 0x933fed6b, 0x44a411c2, + }, + { + 0x18c07830, 0x2305af46, 0xc67ef991, 0xe8136fcd, + 0x874ca113, 0xb8a9626d, 0x01080502, 0x4f426e9e, + 0x36adee6c, 0xa6590451, 0xd2debdb9, 0xf5fb06f7, + 0x79ef80f2, 0x6f5fcede, 0x91fcef3f, 0x52aa07a4, + 0x6027fdc0, 0xbc897665, 0x9baccd2b, 0x8e048c01, + 0xa371155b, 0x0c603c18, 0x7bff8af6, 0x35b5e16a, + 0x1de8693a, 0xe05347dd, 0xd7f6acb3, 0xc25eed99, + 0x2e6d965c, 0x4b627a96, 0xfea321e1, 0x578216ae, + 0x15a8412a, 0x779fb6ee, 0x37a5eb6e, 0xe57b56d7, + 0x9f8cd923, 0xf0d317fd, 0x4a6a7f94, 0xda9e95a9, + 0x58fa25b0, 0xc906ca8f, 0x29558d52, 0x0a502214, + 0xb1e14f7f, 0xa0691a5d, 0x6b7fdad6, 0x855cab17, + 0xbd817367, 0x5dd234ba, 0x10805020, 0xf4f303f5, + 0xcb16c08b, 0x3eedc67c, 0x0528110a, 0x671fe6ce, + 0xe47353d5, 0x2725bb4e, 0x41325882, 0x8b2c9d0b, + 0xa7510153, 0x7dcf94fa, 0x95dcfb37, 0xd88e9fad, + 0xfb8b30eb, 0xee2371c1, 0x7cc791f8, 0x6617e3cc, + 0xdda68ea7, 0x17b84b2e, 0x4702468e, 0x9e84dc21, + 0xca1ec589, 0x2d75995a, 0xbf917963, 0x07381b0e, + 0xad012347, 0x5aea2fb4, 0x836cb51b, 0x3385ff66, + 0x633ff2c6, 0x02100a04, 0xaa393849, 0x71afa8e2, + 0xc80ecf8d, 0x19c87d32, 0x49727092, 0xd9869aaf, + 0xf2c31df9, 0xe34b48db, 0x5be22ab6, 0x8834920d, + 0x9aa4c829, 0x262dbe4c, 0x328dfa64, 0xb0e94a7d, + 0xe91b6acf, 0x0f78331e, 0xd5e6a6b7, 0x8074ba1d, + 0xbe997c61, 0xcd26de87, 0x34bde468, 0x487a7590, + 0xffab24e3, 0x7af78ff4, 0x90f4ea3d, 0x5fc23ebe, + 0x201da040, 0x6867d5d0, 0x1ad07234, 0xae192c41, + 0xb4c95e75, 0x549a19a8, 0x93ece53b, 0x220daa44, + 0x6407e9c8, 0xf1db12ff, 0x73bfa2e6, 0x12905a24, + 0x403a5d80, 0x08402810, 0xc356e89b, 0xec337bc5, + 0xdb9690ab, 0xa1611f5f, 0x8d1c8307, 0x3df5c97a, + 0x97ccf133, 0x00000000, 0xcf36d483, 0x2b458756, + 0x7697b3ec, 0x8264b019, 0xd6fea9b1, 0x1bd87736, + 0xb5c15b77, 0xaf112943, 0x6a77dfd4, 0x50ba0da0, + 0x45124c8a, 0xf3cb18fb, 0x309df060, 0xef2b74c3, + 0x3fe5c37e, 0x55921caa, 0xa2791059, 0xea0365c9, + 0x650fecca, 0xbab96869, 0x2f65935e, 0xc04ee79d, + 0xdebe81a1, 0x1ce06c38, 0xfdbb2ee7, 0x4d52649a, + 0x92e4e039, 0x758fbcea, 0x06301e0c, 0x8a249809, + 0xb2f94079, 0xe66359d1, 0x0e70361c, 0x1ff8633e, + 0x6237f7c4, 0xd4eea3b5, 0xa829324d, 0x96c4f431, + 0xf99b3aef, 0xc566f697, 0x2535b14a, 0x59f220b2, + 0x8454ae15, 0x72b7a7e4, 0x39d5dd72, 0x4c5a6198, + 0x5eca3bbc, 0x78e785f0, 0x38ddd870, 0x8c148605, + 0xd1c6b2bf, 0xa5410b57, 0xe2434dd9, 0x612ff8c2, + 0xb3f1457b, 0x2115a542, 0x9c94d625, 0x1ef0663c, + 0x43225286, 0xc776fc93, 0xfcb32be5, 0x04201408, + 0x51b208a2, 0x99bcc72f, 0x6d4fc4da, 0x0d68391a, + 0xfa8335e9, 0xdfb684a3, 0x7ed79bfc, 0x243db448, + 0x3bc5d776, 0xab313d4b, 0xce3ed181, 0x11885522, + 0x8f0c8903, 0x4e4a6b9c, 0xb7d15173, 0xeb0b60cb, + 0x3cfdcc78, 0x817cbf1f, 0x94d4fe35, 0xf7eb0cf3, + 0xb9a1676f, 0x13985f26, 0x2c7d9c58, 0xd3d6b8bb, + 0xe76b5cd3, 0x6e57cbdc, 0xc46ef395, 0x03180f06, + 0x568a13ac, 0x441a4988, 0x7fdf9efe, 0xa921374f, + 0x2a4d8254, 0xbbb16d6b, 0xc146e29f, 0x53a202a6, + 0xdcae8ba5, 0x0b582716, 0x9d9cd327, 0x6c47c1d8, + 0x3195f562, 0x7487b9e8, 0xf6e309f1, 0x460a438c, + 0xac092645, 0x893c970f, 0x14a04428, 0xe15b42df, + 0x16b04e2c, 0x3acdd274, 0x696fd0d2, 0x09482d12, + 0x70a7ade0, 0xb6d95471, 0xd0ceb7bd, 0xed3b7ec7, + 0xcc2edb85, 0x422a5784, 0x98b4c22d, 0xa4490e55, + 0x285d8850, 0x5cda31b8, 0xf8933fed, 0x8644a411, + }, + { + 0x6018c078, 0x8c2305af, 0x3fc67ef9, 0x87e8136f, + 0x26874ca1, 0xdab8a962, 0x04010805, 0x214f426e, + 0xd836adee, 0xa2a65904, 0x6fd2debd, 0xf3f5fb06, + 0xf979ef80, 0xa16f5fce, 0x7e91fcef, 0x5552aa07, + 0x9d6027fd, 0xcabc8976, 0x569baccd, 0x028e048c, + 0xb6a37115, 0x300c603c, 0xf17bff8a, 0xd435b5e1, + 0x741de869, 0xa7e05347, 0x7bd7f6ac, 0x2fc25eed, + 0xb82e6d96, 0x314b627a, 0xdffea321, 0x41578216, + 0x5415a841, 0xc1779fb6, 0xdc37a5eb, 0xb3e57b56, + 0x469f8cd9, 0xe7f0d317, 0x354a6a7f, 0x4fda9e95, + 0x7d58fa25, 0x03c906ca, 0xa429558d, 0x280a5022, + 0xfeb1e14f, 0xbaa0691a, 0xb16b7fda, 0x2e855cab, + 0xcebd8173, 0x695dd234, 0x40108050, 0xf7f4f303, + 0x0bcb16c0, 0xf83eedc6, 0x14052811, 0x81671fe6, + 0xb7e47353, 0x9c2725bb, 0x19413258, 0x168b2c9d, + 0xa6a75101, 0xe97dcf94, 0x6e95dcfb, 0x47d88e9f, + 0xcbfb8b30, 0x9fee2371, 0xed7cc791, 0x856617e3, + 0x53dda68e, 0x5c17b84b, 0x01470246, 0x429e84dc, + 0x0fca1ec5, 0xb42d7599, 0xc6bf9179, 0x1c07381b, + 0x8ead0123, 0x755aea2f, 0x36836cb5, 0xcc3385ff, + 0x91633ff2, 0x0802100a, 0x92aa3938, 0xd971afa8, + 0x07c80ecf, 0x6419c87d, 0x39497270, 0x43d9869a, + 0xeff2c31d, 0xabe34b48, 0x715be22a, 0x1a883492, + 0x529aa4c8, 0x98262dbe, 0xc8328dfa, 0xfab0e94a, + 0x83e91b6a, 0x3c0f7833, 0x73d5e6a6, 0x3a8074ba, + 0xc2be997c, 0x13cd26de, 0xd034bde4, 0x3d487a75, + 0xdbffab24, 0xf57af78f, 0x7a90f4ea, 0x615fc23e, + 0x80201da0, 0xbd6867d5, 0x681ad072, 0x82ae192c, + 0xeab4c95e, 0x4d549a19, 0x7693ece5, 0x88220daa, + 0x8d6407e9, 0xe3f1db12, 0xd173bfa2, 0x4812905a, + 0x1d403a5d, 0x20084028, 0x2bc356e8, 0x97ec337b, + 0x4bdb9690, 0xbea1611f, 0x0e8d1c83, 0xf43df5c9, + 0x6697ccf1, 0x00000000, 0x1bcf36d4, 0xac2b4587, + 0xc57697b3, 0x328264b0, 0x7fd6fea9, 0x6c1bd877, + 0xeeb5c15b, 0x86af1129, 0xb56a77df, 0x5d50ba0d, + 0x0945124c, 0xebf3cb18, 0xc0309df0, 0x9bef2b74, + 0xfc3fe5c3, 0x4955921c, 0xb2a27910, 0x8fea0365, + 0x89650fec, 0xd2bab968, 0xbc2f6593, 0x27c04ee7, + 0x5fdebe81, 0x701ce06c, 0xd3fdbb2e, 0x294d5264, + 0x7292e4e0, 0xc9758fbc, 0x1806301e, 0x128a2498, + 0xf2b2f940, 0xbfe66359, 0x380e7036, 0x7c1ff863, + 0x956237f7, 0x77d4eea3, 0x9aa82932, 0x6296c4f4, + 0xc3f99b3a, 0x33c566f6, 0x942535b1, 0x7959f220, + 0x2a8454ae, 0xd572b7a7, 0xe439d5dd, 0x2d4c5a61, + 0x655eca3b, 0xfd78e785, 0xe038ddd8, 0x0a8c1486, + 0x63d1c6b2, 0xaea5410b, 0xafe2434d, 0x99612ff8, + 0xf6b3f145, 0x842115a5, 0x4a9c94d6, 0x781ef066, + 0x11432252, 0x3bc776fc, 0xd7fcb32b, 0x10042014, + 0x5951b208, 0x5e99bcc7, 0xa96d4fc4, 0x340d6839, + 0xcffa8335, 0x5bdfb684, 0xe57ed79b, 0x90243db4, + 0xec3bc5d7, 0x96ab313d, 0x1fce3ed1, 0x44118855, + 0x068f0c89, 0x254e4a6b, 0xe6b7d151, 0x8beb0b60, + 0xf03cfdcc, 0x3e817cbf, 0x6a94d4fe, 0xfbf7eb0c, + 0xdeb9a167, 0x4c13985f, 0xb02c7d9c, 0x6bd3d6b8, + 0xbbe76b5c, 0xa56e57cb, 0x37c46ef3, 0x0c03180f, + 0x45568a13, 0x0d441a49, 0xe17fdf9e, 0x9ea92137, + 0xa82a4d82, 0xd6bbb16d, 0x23c146e2, 0x5153a202, + 0x57dcae8b, 0x2c0b5827, 0x4e9d9cd3, 0xad6c47c1, + 0xc43195f5, 0xcd7487b9, 0xfff6e309, 0x05460a43, + 0x8aac0926, 0x1e893c97, 0x5014a044, 0xa3e15b42, + 0x5816b04e, 0xe83acdd2, 0xb9696fd0, 0x2409482d, + 0xdd70a7ad, 0xe2b6d954, 0x67d0ceb7, 0x93ed3b7e, + 0x17cc2edb, 0x15422a57, 0x5a98b4c2, 0xaaa4490e, + 0xa0285d88, 0x6d5cda31, 0xc7f8933f, 0x228644a4, + }, + { + 0x186018c0, 0x238c2305, 0xc63fc67e, 0xe887e813, + 0x8726874c, 0xb8dab8a9, 0x01040108, 0x4f214f42, + 0x36d836ad, 0xa6a2a659, 0xd26fd2de, 0xf5f3f5fb, + 0x79f979ef, 0x6fa16f5f, 0x917e91fc, 0x525552aa, + 0x609d6027, 0xbccabc89, 0x9b569bac, 0x8e028e04, + 0xa3b6a371, 0x0c300c60, 0x7bf17bff, 0x35d435b5, + 0x1d741de8, 0xe0a7e053, 0xd77bd7f6, 0xc22fc25e, + 0x2eb82e6d, 0x4b314b62, 0xfedffea3, 0x57415782, + 0x155415a8, 0x77c1779f, 0x37dc37a5, 0xe5b3e57b, + 0x9f469f8c, 0xf0e7f0d3, 0x4a354a6a, 0xda4fda9e, + 0x587d58fa, 0xc903c906, 0x29a42955, 0x0a280a50, + 0xb1feb1e1, 0xa0baa069, 0x6bb16b7f, 0x852e855c, + 0xbdcebd81, 0x5d695dd2, 0x10401080, 0xf4f7f4f3, + 0xcb0bcb16, 0x3ef83eed, 0x05140528, 0x6781671f, + 0xe4b7e473, 0x279c2725, 0x41194132, 0x8b168b2c, + 0xa7a6a751, 0x7de97dcf, 0x956e95dc, 0xd847d88e, + 0xfbcbfb8b, 0xee9fee23, 0x7ced7cc7, 0x66856617, + 0xdd53dda6, 0x175c17b8, 0x47014702, 0x9e429e84, + 0xca0fca1e, 0x2db42d75, 0xbfc6bf91, 0x071c0738, + 0xad8ead01, 0x5a755aea, 0x8336836c, 0x33cc3385, + 0x6391633f, 0x02080210, 0xaa92aa39, 0x71d971af, + 0xc807c80e, 0x196419c8, 0x49394972, 0xd943d986, + 0xf2eff2c3, 0xe3abe34b, 0x5b715be2, 0x881a8834, + 0x9a529aa4, 0x2698262d, 0x32c8328d, 0xb0fab0e9, + 0xe983e91b, 0x0f3c0f78, 0xd573d5e6, 0x803a8074, + 0xbec2be99, 0xcd13cd26, 0x34d034bd, 0x483d487a, + 0xffdbffab, 0x7af57af7, 0x907a90f4, 0x5f615fc2, + 0x2080201d, 0x68bd6867, 0x1a681ad0, 0xae82ae19, + 0xb4eab4c9, 0x544d549a, 0x937693ec, 0x2288220d, + 0x648d6407, 0xf1e3f1db, 0x73d173bf, 0x12481290, + 0x401d403a, 0x08200840, 0xc32bc356, 0xec97ec33, + 0xdb4bdb96, 0xa1bea161, 0x8d0e8d1c, 0x3df43df5, + 0x976697cc, 0x00000000, 0xcf1bcf36, 0x2bac2b45, + 0x76c57697, 0x82328264, 0xd67fd6fe, 0x1b6c1bd8, + 0xb5eeb5c1, 0xaf86af11, 0x6ab56a77, 0x505d50ba, + 0x45094512, 0xf3ebf3cb, 0x30c0309d, 0xef9bef2b, + 0x3ffc3fe5, 0x55495592, 0xa2b2a279, 0xea8fea03, + 0x6589650f, 0xbad2bab9, 0x2fbc2f65, 0xc027c04e, + 0xde5fdebe, 0x1c701ce0, 0xfdd3fdbb, 0x4d294d52, + 0x927292e4, 0x75c9758f, 0x06180630, 0x8a128a24, + 0xb2f2b2f9, 0xe6bfe663, 0x0e380e70, 0x1f7c1ff8, + 0x62956237, 0xd477d4ee, 0xa89aa829, 0x966296c4, + 0xf9c3f99b, 0xc533c566, 0x25942535, 0x597959f2, + 0x842a8454, 0x72d572b7, 0x39e439d5, 0x4c2d4c5a, + 0x5e655eca, 0x78fd78e7, 0x38e038dd, 0x8c0a8c14, + 0xd163d1c6, 0xa5aea541, 0xe2afe243, 0x6199612f, + 0xb3f6b3f1, 0x21842115, 0x9c4a9c94, 0x1e781ef0, + 0x43114322, 0xc73bc776, 0xfcd7fcb3, 0x04100420, + 0x515951b2, 0x995e99bc, 0x6da96d4f, 0x0d340d68, + 0xfacffa83, 0xdf5bdfb6, 0x7ee57ed7, 0x2490243d, + 0x3bec3bc5, 0xab96ab31, 0xce1fce3e, 0x11441188, + 0x8f068f0c, 0x4e254e4a, 0xb7e6b7d1, 0xeb8beb0b, + 0x3cf03cfd, 0x813e817c, 0x946a94d4, 0xf7fbf7eb, + 0xb9deb9a1, 0x134c1398, 0x2cb02c7d, 0xd36bd3d6, + 0xe7bbe76b, 0x6ea56e57, 0xc437c46e, 0x030c0318, + 0x5645568a, 0x440d441a, 0x7fe17fdf, 0xa99ea921, + 0x2aa82a4d, 0xbbd6bbb1, 0xc123c146, 0x535153a2, + 0xdc57dcae, 0x0b2c0b58, 0x9d4e9d9c, 0x6cad6c47, + 0x31c43195, 0x74cd7487, 0xf6fff6e3, 0x4605460a, + 0xac8aac09, 0x891e893c, 0x145014a0, 0xe1a3e15b, + 0x165816b0, 0x3ae83acd, 0x69b9696f, 0x09240948, + 0x70dd70a7, 0xb6e2b6d9, 0xd067d0ce, 0xed93ed3b, + 0xcc17cc2e, 0x4215422a, 0x985a98b4, 0xa4aaa449, + 0x28a0285d, 0x5c6d5cda, 0xf8c7f893, 0x86228644, + }, + { + 0x18186018, 0x23238c23, 0xc6c63fc6, 0xe8e887e8, + 0x87872687, 0xb8b8dab8, 0x01010401, 0x4f4f214f, + 0x3636d836, 0xa6a6a2a6, 0xd2d26fd2, 0xf5f5f3f5, + 0x7979f979, 0x6f6fa16f, 0x91917e91, 0x52525552, + 0x60609d60, 0xbcbccabc, 0x9b9b569b, 0x8e8e028e, + 0xa3a3b6a3, 0x0c0c300c, 0x7b7bf17b, 0x3535d435, + 0x1d1d741d, 0xe0e0a7e0, 0xd7d77bd7, 0xc2c22fc2, + 0x2e2eb82e, 0x4b4b314b, 0xfefedffe, 0x57574157, + 0x15155415, 0x7777c177, 0x3737dc37, 0xe5e5b3e5, + 0x9f9f469f, 0xf0f0e7f0, 0x4a4a354a, 0xdada4fda, + 0x58587d58, 0xc9c903c9, 0x2929a429, 0x0a0a280a, + 0xb1b1feb1, 0xa0a0baa0, 0x6b6bb16b, 0x85852e85, + 0xbdbdcebd, 0x5d5d695d, 0x10104010, 0xf4f4f7f4, + 0xcbcb0bcb, 0x3e3ef83e, 0x05051405, 0x67678167, + 0xe4e4b7e4, 0x27279c27, 0x41411941, 0x8b8b168b, + 0xa7a7a6a7, 0x7d7de97d, 0x95956e95, 0xd8d847d8, + 0xfbfbcbfb, 0xeeee9fee, 0x7c7ced7c, 0x66668566, + 0xdddd53dd, 0x17175c17, 0x47470147, 0x9e9e429e, + 0xcaca0fca, 0x2d2db42d, 0xbfbfc6bf, 0x07071c07, + 0xadad8ead, 0x5a5a755a, 0x83833683, 0x3333cc33, + 0x63639163, 0x02020802, 0xaaaa92aa, 0x7171d971, + 0xc8c807c8, 0x19196419, 0x49493949, 0xd9d943d9, + 0xf2f2eff2, 0xe3e3abe3, 0x5b5b715b, 0x88881a88, + 0x9a9a529a, 0x26269826, 0x3232c832, 0xb0b0fab0, + 0xe9e983e9, 0x0f0f3c0f, 0xd5d573d5, 0x80803a80, + 0xbebec2be, 0xcdcd13cd, 0x3434d034, 0x48483d48, + 0xffffdbff, 0x7a7af57a, 0x90907a90, 0x5f5f615f, + 0x20208020, 0x6868bd68, 0x1a1a681a, 0xaeae82ae, + 0xb4b4eab4, 0x54544d54, 0x93937693, 0x22228822, + 0x64648d64, 0xf1f1e3f1, 0x7373d173, 0x12124812, + 0x40401d40, 0x08082008, 0xc3c32bc3, 0xecec97ec, + 0xdbdb4bdb, 0xa1a1bea1, 0x8d8d0e8d, 0x3d3df43d, + 0x97976697, 0x00000000, 0xcfcf1bcf, 0x2b2bac2b, + 0x7676c576, 0x82823282, 0xd6d67fd6, 0x1b1b6c1b, + 0xb5b5eeb5, 0xafaf86af, 0x6a6ab56a, 0x50505d50, + 0x45450945, 0xf3f3ebf3, 0x3030c030, 0xefef9bef, + 0x3f3ffc3f, 0x55554955, 0xa2a2b2a2, 0xeaea8fea, + 0x65658965, 0xbabad2ba, 0x2f2fbc2f, 0xc0c027c0, + 0xdede5fde, 0x1c1c701c, 0xfdfdd3fd, 0x4d4d294d, + 0x92927292, 0x7575c975, 0x06061806, 0x8a8a128a, + 0xb2b2f2b2, 0xe6e6bfe6, 0x0e0e380e, 0x1f1f7c1f, + 0x62629562, 0xd4d477d4, 0xa8a89aa8, 0x96966296, + 0xf9f9c3f9, 0xc5c533c5, 0x25259425, 0x59597959, + 0x84842a84, 0x7272d572, 0x3939e439, 0x4c4c2d4c, + 0x5e5e655e, 0x7878fd78, 0x3838e038, 0x8c8c0a8c, + 0xd1d163d1, 0xa5a5aea5, 0xe2e2afe2, 0x61619961, + 0xb3b3f6b3, 0x21218421, 0x9c9c4a9c, 0x1e1e781e, + 0x43431143, 0xc7c73bc7, 0xfcfcd7fc, 0x04041004, + 0x51515951, 0x99995e99, 0x6d6da96d, 0x0d0d340d, + 0xfafacffa, 0xdfdf5bdf, 0x7e7ee57e, 0x24249024, + 0x3b3bec3b, 0xabab96ab, 0xcece1fce, 0x11114411, + 0x8f8f068f, 0x4e4e254e, 0xb7b7e6b7, 0xebeb8beb, + 0x3c3cf03c, 0x81813e81, 0x94946a94, 0xf7f7fbf7, + 0xb9b9deb9, 0x13134c13, 0x2c2cb02c, 0xd3d36bd3, + 0xe7e7bbe7, 0x6e6ea56e, 0xc4c437c4, 0x03030c03, + 0x56564556, 0x44440d44, 0x7f7fe17f, 0xa9a99ea9, + 0x2a2aa82a, 0xbbbbd6bb, 0xc1c123c1, 0x53535153, + 0xdcdc57dc, 0x0b0b2c0b, 0x9d9d4e9d, 0x6c6cad6c, + 0x3131c431, 0x7474cd74, 0xf6f6fff6, 0x46460546, + 0xacac8aac, 0x89891e89, 0x14145014, 0xe1e1a3e1, + 0x16165816, 0x3a3ae83a, 0x6969b969, 0x09092409, + 0x7070dd70, 0xb6b6e2b6, 0xd0d067d0, 0xeded93ed, + 0xcccc17cc, 0x42421542, 0x98985a98, 0xa4a4aaa4, + 0x2828a028, 0x5c5c6d5c, 0xf8f8c7f8, 0x86862286, + }, + { + 0xd8181860, 0x2623238c, 0xb8c6c63f, 0xfbe8e887, + 0xcb878726, 0x11b8b8da, 0x09010104, 0x0d4f4f21, + 0x9b3636d8, 0xffa6a6a2, 0x0cd2d26f, 0x0ef5f5f3, + 0x967979f9, 0x306f6fa1, 0x6d91917e, 0xf8525255, + 0x4760609d, 0x35bcbcca, 0x379b9b56, 0x8a8e8e02, + 0xd2a3a3b6, 0x6c0c0c30, 0x847b7bf1, 0x803535d4, + 0xf51d1d74, 0xb3e0e0a7, 0x21d7d77b, 0x9cc2c22f, + 0x432e2eb8, 0x294b4b31, 0x5dfefedf, 0xd5575741, + 0xbd151554, 0xe87777c1, 0x923737dc, 0x9ee5e5b3, + 0x139f9f46, 0x23f0f0e7, 0x204a4a35, 0x44dada4f, + 0xa258587d, 0xcfc9c903, 0x7c2929a4, 0x5a0a0a28, + 0x50b1b1fe, 0xc9a0a0ba, 0x146b6bb1, 0xd985852e, + 0x3cbdbdce, 0x8f5d5d69, 0x90101040, 0x07f4f4f7, + 0xddcbcb0b, 0xd33e3ef8, 0x2d050514, 0x78676781, + 0x97e4e4b7, 0x0227279c, 0x73414119, 0xa78b8b16, + 0xf6a7a7a6, 0xb27d7de9, 0x4995956e, 0x56d8d847, + 0x70fbfbcb, 0xcdeeee9f, 0xbb7c7ced, 0x71666685, + 0x7bdddd53, 0xaf17175c, 0x45474701, 0x1a9e9e42, + 0xd4caca0f, 0x582d2db4, 0x2ebfbfc6, 0x3f07071c, + 0xacadad8e, 0xb05a5a75, 0xef838336, 0xb63333cc, + 0x5c636391, 0x12020208, 0x93aaaa92, 0xde7171d9, + 0xc6c8c807, 0xd1191964, 0x3b494939, 0x5fd9d943, + 0x31f2f2ef, 0xa8e3e3ab, 0xb95b5b71, 0xbc88881a, + 0x3e9a9a52, 0x0b262698, 0xbf3232c8, 0x59b0b0fa, + 0xf2e9e983, 0x770f0f3c, 0x33d5d573, 0xf480803a, + 0x27bebec2, 0xebcdcd13, 0x893434d0, 0x3248483d, + 0x54ffffdb, 0x8d7a7af5, 0x6490907a, 0x9d5f5f61, + 0x3d202080, 0x0f6868bd, 0xca1a1a68, 0xb7aeae82, + 0x7db4b4ea, 0xce54544d, 0x7f939376, 0x2f222288, + 0x6364648d, 0x2af1f1e3, 0xcc7373d1, 0x82121248, + 0x7a40401d, 0x48080820, 0x95c3c32b, 0xdfecec97, + 0x4ddbdb4b, 0xc0a1a1be, 0x918d8d0e, 0xc83d3df4, + 0x5b979766, 0x00000000, 0xf9cfcf1b, 0x6e2b2bac, + 0xe17676c5, 0xe6828232, 0x28d6d67f, 0xc31b1b6c, + 0x74b5b5ee, 0xbeafaf86, 0x1d6a6ab5, 0xea50505d, + 0x57454509, 0x38f3f3eb, 0xad3030c0, 0xc4efef9b, + 0xda3f3ffc, 0xc7555549, 0xdba2a2b2, 0xe9eaea8f, + 0x6a656589, 0x03babad2, 0x4a2f2fbc, 0x8ec0c027, + 0x60dede5f, 0xfc1c1c70, 0x46fdfdd3, 0x1f4d4d29, + 0x76929272, 0xfa7575c9, 0x36060618, 0xae8a8a12, + 0x4bb2b2f2, 0x85e6e6bf, 0x7e0e0e38, 0xe71f1f7c, + 0x55626295, 0x3ad4d477, 0x81a8a89a, 0x52969662, + 0x62f9f9c3, 0xa3c5c533, 0x10252594, 0xab595979, + 0xd084842a, 0xc57272d5, 0xec3939e4, 0x164c4c2d, + 0x945e5e65, 0x9f7878fd, 0xe53838e0, 0x988c8c0a, + 0x17d1d163, 0xe4a5a5ae, 0xa1e2e2af, 0x4e616199, + 0x42b3b3f6, 0x34212184, 0x089c9c4a, 0xee1e1e78, + 0x61434311, 0xb1c7c73b, 0x4ffcfcd7, 0x24040410, + 0xe3515159, 0x2599995e, 0x226d6da9, 0x650d0d34, + 0x79fafacf, 0x69dfdf5b, 0xa97e7ee5, 0x19242490, + 0xfe3b3bec, 0x9aabab96, 0xf0cece1f, 0x99111144, + 0x838f8f06, 0x044e4e25, 0x66b7b7e6, 0xe0ebeb8b, + 0xc13c3cf0, 0xfd81813e, 0x4094946a, 0x1cf7f7fb, + 0x18b9b9de, 0x8b13134c, 0x512c2cb0, 0x05d3d36b, + 0x8ce7e7bb, 0x396e6ea5, 0xaac4c437, 0x1b03030c, + 0xdc565645, 0x5e44440d, 0xa07f7fe1, 0x88a9a99e, + 0x672a2aa8, 0x0abbbbd6, 0x87c1c123, 0xf1535351, + 0x72dcdc57, 0x530b0b2c, 0x019d9d4e, 0x2b6c6cad, + 0xa43131c4, 0xf37474cd, 0x15f6f6ff, 0x4c464605, + 0xa5acac8a, 0xb589891e, 0xb4141450, 0xbae1e1a3, + 0xa6161658, 0xf73a3ae8, 0x066969b9, 0x41090924, + 0xd77070dd, 0x6fb6b6e2, 0x1ed0d067, 0xd6eded93, + 0xe2cccc17, 0x68424215, 0x2c98985a, 0xeda4a4aa, + 0x752828a0, 0x865c5c6d, 0x6bf8f8c7, 0xc2868622, + }, + { + 0x30d81818, 0x46262323, 0x91b8c6c6, 0xcdfbe8e8, + 0x13cb8787, 0x6d11b8b8, 0x02090101, 0x9e0d4f4f, + 0x6c9b3636, 0x51ffa6a6, 0xb90cd2d2, 0xf70ef5f5, + 0xf2967979, 0xde306f6f, 0x3f6d9191, 0xa4f85252, + 0xc0476060, 0x6535bcbc, 0x2b379b9b, 0x018a8e8e, + 0x5bd2a3a3, 0x186c0c0c, 0xf6847b7b, 0x6a803535, + 0x3af51d1d, 0xddb3e0e0, 0xb321d7d7, 0x999cc2c2, + 0x5c432e2e, 0x96294b4b, 0xe15dfefe, 0xaed55757, + 0x2abd1515, 0xeee87777, 0x6e923737, 0xd79ee5e5, + 0x23139f9f, 0xfd23f0f0, 0x94204a4a, 0xa944dada, + 0xb0a25858, 0x8fcfc9c9, 0x527c2929, 0x145a0a0a, + 0x7f50b1b1, 0x5dc9a0a0, 0xd6146b6b, 0x17d98585, + 0x673cbdbd, 0xba8f5d5d, 0x20901010, 0xf507f4f4, + 0x8bddcbcb, 0x7cd33e3e, 0x0a2d0505, 0xce786767, + 0xd597e4e4, 0x4e022727, 0x82734141, 0x0ba78b8b, + 0x53f6a7a7, 0xfab27d7d, 0x37499595, 0xad56d8d8, + 0xeb70fbfb, 0xc1cdeeee, 0xf8bb7c7c, 0xcc716666, + 0xa77bdddd, 0x2eaf1717, 0x8e454747, 0x211a9e9e, + 0x89d4caca, 0x5a582d2d, 0x632ebfbf, 0x0e3f0707, + 0x47acadad, 0xb4b05a5a, 0x1bef8383, 0x66b63333, + 0xc65c6363, 0x04120202, 0x4993aaaa, 0xe2de7171, + 0x8dc6c8c8, 0x32d11919, 0x923b4949, 0xaf5fd9d9, + 0xf931f2f2, 0xdba8e3e3, 0xb6b95b5b, 0x0dbc8888, + 0x293e9a9a, 0x4c0b2626, 0x64bf3232, 0x7d59b0b0, + 0xcff2e9e9, 0x1e770f0f, 0xb733d5d5, 0x1df48080, + 0x6127bebe, 0x87ebcdcd, 0x68893434, 0x90324848, + 0xe354ffff, 0xf48d7a7a, 0x3d649090, 0xbe9d5f5f, + 0x403d2020, 0xd00f6868, 0x34ca1a1a, 0x41b7aeae, + 0x757db4b4, 0xa8ce5454, 0x3b7f9393, 0x442f2222, + 0xc8636464, 0xff2af1f1, 0xe6cc7373, 0x24821212, + 0x807a4040, 0x10480808, 0x9b95c3c3, 0xc5dfecec, + 0xab4ddbdb, 0x5fc0a1a1, 0x07918d8d, 0x7ac83d3d, + 0x335b9797, 0x00000000, 0x83f9cfcf, 0x566e2b2b, + 0xece17676, 0x19e68282, 0xb128d6d6, 0x36c31b1b, + 0x7774b5b5, 0x43beafaf, 0xd41d6a6a, 0xa0ea5050, + 0x8a574545, 0xfb38f3f3, 0x60ad3030, 0xc3c4efef, + 0x7eda3f3f, 0xaac75555, 0x59dba2a2, 0xc9e9eaea, + 0xca6a6565, 0x6903baba, 0x5e4a2f2f, 0x9d8ec0c0, + 0xa160dede, 0x38fc1c1c, 0xe746fdfd, 0x9a1f4d4d, + 0x39769292, 0xeafa7575, 0x0c360606, 0x09ae8a8a, + 0x794bb2b2, 0xd185e6e6, 0x1c7e0e0e, 0x3ee71f1f, + 0xc4556262, 0xb53ad4d4, 0x4d81a8a8, 0x31529696, + 0xef62f9f9, 0x97a3c5c5, 0x4a102525, 0xb2ab5959, + 0x15d08484, 0xe4c57272, 0x72ec3939, 0x98164c4c, + 0xbc945e5e, 0xf09f7878, 0x70e53838, 0x05988c8c, + 0xbf17d1d1, 0x57e4a5a5, 0xd9a1e2e2, 0xc24e6161, + 0x7b42b3b3, 0x42342121, 0x25089c9c, 0x3cee1e1e, + 0x86614343, 0x93b1c7c7, 0xe54ffcfc, 0x08240404, + 0xa2e35151, 0x2f259999, 0xda226d6d, 0x1a650d0d, + 0xe979fafa, 0xa369dfdf, 0xfca97e7e, 0x48192424, + 0x76fe3b3b, 0x4b9aabab, 0x81f0cece, 0x22991111, + 0x03838f8f, 0x9c044e4e, 0x7366b7b7, 0xcbe0ebeb, + 0x78c13c3c, 0x1ffd8181, 0x35409494, 0xf31cf7f7, + 0x6f18b9b9, 0x268b1313, 0x58512c2c, 0xbb05d3d3, + 0xd38ce7e7, 0xdc396e6e, 0x95aac4c4, 0x061b0303, + 0xacdc5656, 0x885e4444, 0xfea07f7f, 0x4f88a9a9, + 0x54672a2a, 0x6b0abbbb, 0x9f87c1c1, 0xa6f15353, + 0xa572dcdc, 0x16530b0b, 0x27019d9d, 0xd82b6c6c, + 0x62a43131, 0xe8f37474, 0xf115f6f6, 0x8c4c4646, + 0x45a5acac, 0x0fb58989, 0x28b41414, 0xdfbae1e1, + 0x2ca61616, 0x74f73a3a, 0xd2066969, 0x12410909, + 0xe0d77070, 0x716fb6b6, 0xbd1ed0d0, 0xc7d6eded, + 0x85e2cccc, 0x84684242, 0x2d2c9898, 0x55eda4a4, + 0x50752828, 0xb8865c5c, 0xed6bf8f8, 0x11c28686, + }, + { + 0x7830d818, 0xaf462623, 0xf991b8c6, 0x6fcdfbe8, + 0xa113cb87, 0x626d11b8, 0x05020901, 0x6e9e0d4f, + 0xee6c9b36, 0x0451ffa6, 0xbdb90cd2, 0x06f70ef5, + 0x80f29679, 0xcede306f, 0xef3f6d91, 0x07a4f852, + 0xfdc04760, 0x766535bc, 0xcd2b379b, 0x8c018a8e, + 0x155bd2a3, 0x3c186c0c, 0x8af6847b, 0xe16a8035, + 0x693af51d, 0x47ddb3e0, 0xacb321d7, 0xed999cc2, + 0x965c432e, 0x7a96294b, 0x21e15dfe, 0x16aed557, + 0x412abd15, 0xb6eee877, 0xeb6e9237, 0x56d79ee5, + 0xd923139f, 0x17fd23f0, 0x7f94204a, 0x95a944da, + 0x25b0a258, 0xca8fcfc9, 0x8d527c29, 0x22145a0a, + 0x4f7f50b1, 0x1a5dc9a0, 0xdad6146b, 0xab17d985, + 0x73673cbd, 0x34ba8f5d, 0x50209010, 0x03f507f4, + 0xc08bddcb, 0xc67cd33e, 0x110a2d05, 0xe6ce7867, + 0x53d597e4, 0xbb4e0227, 0x58827341, 0x9d0ba78b, + 0x0153f6a7, 0x94fab27d, 0xfb374995, 0x9fad56d8, + 0x30eb70fb, 0x71c1cdee, 0x91f8bb7c, 0xe3cc7166, + 0x8ea77bdd, 0x4b2eaf17, 0x468e4547, 0xdc211a9e, + 0xc589d4ca, 0x995a582d, 0x79632ebf, 0x1b0e3f07, + 0x2347acad, 0x2fb4b05a, 0xb51bef83, 0xff66b633, + 0xf2c65c63, 0x0a041202, 0x384993aa, 0xa8e2de71, + 0xcf8dc6c8, 0x7d32d119, 0x70923b49, 0x9aaf5fd9, + 0x1df931f2, 0x48dba8e3, 0x2ab6b95b, 0x920dbc88, + 0xc8293e9a, 0xbe4c0b26, 0xfa64bf32, 0x4a7d59b0, + 0x6acff2e9, 0x331e770f, 0xa6b733d5, 0xba1df480, + 0x7c6127be, 0xde87ebcd, 0xe4688934, 0x75903248, + 0x24e354ff, 0x8ff48d7a, 0xea3d6490, 0x3ebe9d5f, + 0xa0403d20, 0xd5d00f68, 0x7234ca1a, 0x2c41b7ae, + 0x5e757db4, 0x19a8ce54, 0xe53b7f93, 0xaa442f22, + 0xe9c86364, 0x12ff2af1, 0xa2e6cc73, 0x5a248212, + 0x5d807a40, 0x28104808, 0xe89b95c3, 0x7bc5dfec, + 0x90ab4ddb, 0x1f5fc0a1, 0x8307918d, 0xc97ac83d, + 0xf1335b97, 0x00000000, 0xd483f9cf, 0x87566e2b, + 0xb3ece176, 0xb019e682, 0xa9b128d6, 0x7736c31b, + 0x5b7774b5, 0x2943beaf, 0xdfd41d6a, 0x0da0ea50, + 0x4c8a5745, 0x18fb38f3, 0xf060ad30, 0x74c3c4ef, + 0xc37eda3f, 0x1caac755, 0x1059dba2, 0x65c9e9ea, + 0xecca6a65, 0x686903ba, 0x935e4a2f, 0xe79d8ec0, + 0x81a160de, 0x6c38fc1c, 0x2ee746fd, 0x649a1f4d, + 0xe0397692, 0xbceafa75, 0x1e0c3606, 0x9809ae8a, + 0x40794bb2, 0x59d185e6, 0x361c7e0e, 0x633ee71f, + 0xf7c45562, 0xa3b53ad4, 0x324d81a8, 0xf4315296, + 0x3aef62f9, 0xf697a3c5, 0xb14a1025, 0x20b2ab59, + 0xae15d084, 0xa7e4c572, 0xdd72ec39, 0x6198164c, + 0x3bbc945e, 0x85f09f78, 0xd870e538, 0x8605988c, + 0xb2bf17d1, 0x0b57e4a5, 0x4dd9a1e2, 0xf8c24e61, + 0x457b42b3, 0xa5423421, 0xd625089c, 0x663cee1e, + 0x52866143, 0xfc93b1c7, 0x2be54ffc, 0x14082404, + 0x08a2e351, 0xc72f2599, 0xc4da226d, 0x391a650d, + 0x35e979fa, 0x84a369df, 0x9bfca97e, 0xb4481924, + 0xd776fe3b, 0x3d4b9aab, 0xd181f0ce, 0x55229911, + 0x8903838f, 0x6b9c044e, 0x517366b7, 0x60cbe0eb, + 0xcc78c13c, 0xbf1ffd81, 0xfe354094, 0x0cf31cf7, + 0x676f18b9, 0x5f268b13, 0x9c58512c, 0xb8bb05d3, + 0x5cd38ce7, 0xcbdc396e, 0xf395aac4, 0x0f061b03, + 0x13acdc56, 0x49885e44, 0x9efea07f, 0x374f88a9, + 0x8254672a, 0x6d6b0abb, 0xe29f87c1, 0x02a6f153, + 0x8ba572dc, 0x2716530b, 0xd327019d, 0xc1d82b6c, + 0xf562a431, 0xb9e8f374, 0x09f115f6, 0x438c4c46, + 0x2645a5ac, 0x970fb589, 0x4428b414, 0x42dfbae1, + 0x4e2ca616, 0xd274f73a, 0xd0d20669, 0x2d124109, + 0xade0d770, 0x54716fb6, 0xb7bd1ed0, 0x7ec7d6ed, + 0xdb85e2cc, 0x57846842, 0xc22d2c98, 0x0e55eda4, + 0x88507528, 0x31b8865c, 0x3fed6bf8, 0xa411c286, + }, +}; + +#ifdef VECT_SIZE1 +#define BOX(S,n,i) (u32) ((S)[(n)][(i)]) +#endif + +static void whirlpool_transform (const u32 w[16], u32 dgst[16], __local u32 s_Ch[8][256], __local u32 s_Cl[8][256]) +{ + const u32 rch[R + 1] = + { + 0x00000000, + 0x1823c6e8, + 0x36a6d2f5, + 0x60bc9b8e, + 0x1de0d7c2, + 0x157737e5, + 0x58c9290a, + 0xbd5d10f4, + 0xe427418b, + 0xfbee7c66, + 0xca2dbf07, + }; + + const u32 rcl[R + 1] = + { + 0x00000000, + 0x87b8014f, + 0x796f9152, + 0xa30c7b35, + 0x2e4bfe57, + 0x9ff04ada, + 0xb1a06b85, + 0xcb3e0567, + 0xa77d95d8, + 0xdd17479e, + 0xad5a8333, + }; + + u32 Kh[8]; + u32 Kl[8]; + + Kh[0] = dgst[ 0]; + Kl[0] = dgst[ 1]; + Kh[1] = dgst[ 2]; + Kl[1] = dgst[ 3]; + Kh[2] = dgst[ 4]; + Kl[2] = dgst[ 5]; + Kh[3] = dgst[ 6]; + Kl[3] = dgst[ 7]; + Kh[4] = dgst[ 8]; + Kl[4] = dgst[ 9]; + Kh[5] = dgst[10]; + Kl[5] = dgst[11]; + Kh[6] = dgst[12]; + Kl[6] = dgst[13]; + Kh[7] = dgst[14]; + Kl[7] = dgst[15]; + + u32 stateh[8]; + u32 statel[8]; + + stateh[0] = w[ 0] ^ Kh[0]; + statel[0] = w[ 1] ^ Kl[0]; + stateh[1] = w[ 2] ^ Kh[1]; + statel[1] = w[ 3] ^ Kl[1]; + stateh[2] = w[ 4] ^ Kh[2]; + statel[2] = w[ 5] ^ Kl[2]; + stateh[3] = w[ 6] ^ Kh[3]; + statel[3] = w[ 7] ^ Kl[3]; + stateh[4] = w[ 8] ^ Kh[4]; + statel[4] = w[ 9] ^ Kl[4]; + stateh[5] = w[10] ^ Kh[5]; + statel[5] = w[11] ^ Kl[5]; + stateh[6] = w[12] ^ Kh[6]; + statel[6] = w[13] ^ Kl[6]; + stateh[7] = w[14] ^ Kh[7]; + statel[7] = w[15] ^ Kl[7]; + + u32 r; + + for (r = 1; r <= R; r++) + { + u32 Lh[8]; + u32 Ll[8]; + + u32 i; + + #pragma unroll 8 + for (i = 0; i < 8; i++) + { + const u8 Lp0 = Kh[(i + 8) & 7] >> 24; + const u8 Lp1 = Kh[(i + 7) & 7] >> 16; + const u8 Lp2 = Kh[(i + 6) & 7] >> 8; + const u8 Lp3 = Kh[(i + 5) & 7] >> 0; + const u8 Lp4 = Kl[(i + 4) & 7] >> 24; + const u8 Lp5 = Kl[(i + 3) & 7] >> 16; + const u8 Lp6 = Kl[(i + 2) & 7] >> 8; + const u8 Lp7 = Kl[(i + 1) & 7] >> 0; + + Lh[i] = BOX (s_Ch, 0, Lp0 & 0xff) + ^ BOX (s_Ch, 1, Lp1 & 0xff) + ^ BOX (s_Ch, 2, Lp2 & 0xff) + ^ BOX (s_Ch, 3, Lp3 & 0xff) + ^ BOX (s_Ch, 4, Lp4 & 0xff) + ^ BOX (s_Ch, 5, Lp5 & 0xff) + ^ BOX (s_Ch, 6, Lp6 & 0xff) + ^ BOX (s_Ch, 7, Lp7 & 0xff); + + Ll[i] = BOX (s_Cl, 0, Lp0 & 0xff) + ^ BOX (s_Cl, 1, Lp1 & 0xff) + ^ BOX (s_Cl, 2, Lp2 & 0xff) + ^ BOX (s_Cl, 3, Lp3 & 0xff) + ^ BOX (s_Cl, 4, Lp4 & 0xff) + ^ BOX (s_Cl, 5, Lp5 & 0xff) + ^ BOX (s_Cl, 6, Lp6 & 0xff) + ^ BOX (s_Cl, 7, Lp7 & 0xff); + } + + Kh[0] = Lh[0] ^ rch[r]; + Kl[0] = Ll[0] ^ rcl[r]; + Kh[1] = Lh[1]; + Kl[1] = Ll[1]; + Kh[2] = Lh[2]; + Kl[2] = Ll[2]; + Kh[3] = Lh[3]; + Kl[3] = Ll[3]; + Kh[4] = Lh[4]; + Kl[4] = Ll[4]; + Kh[5] = Lh[5]; + Kl[5] = Ll[5]; + Kh[6] = Lh[6]; + Kl[6] = Ll[6]; + Kh[7] = Lh[7]; + Kl[7] = Ll[7]; + + #pragma unroll 8 + for (i = 0; i < 8; i++) + { + const u8 Lp0 = stateh[(i + 8) & 7] >> 24; + const u8 Lp1 = stateh[(i + 7) & 7] >> 16; + const u8 Lp2 = stateh[(i + 6) & 7] >> 8; + const u8 Lp3 = stateh[(i + 5) & 7] >> 0; + const u8 Lp4 = statel[(i + 4) & 7] >> 24; + const u8 Lp5 = statel[(i + 3) & 7] >> 16; + const u8 Lp6 = statel[(i + 2) & 7] >> 8; + const u8 Lp7 = statel[(i + 1) & 7] >> 0; + + Lh[i] = BOX (s_Ch, 0, Lp0 & 0xff) + ^ BOX (s_Ch, 1, Lp1 & 0xff) + ^ BOX (s_Ch, 2, Lp2 & 0xff) + ^ BOX (s_Ch, 3, Lp3 & 0xff) + ^ BOX (s_Ch, 4, Lp4 & 0xff) + ^ BOX (s_Ch, 5, Lp5 & 0xff) + ^ BOX (s_Ch, 6, Lp6 & 0xff) + ^ BOX (s_Ch, 7, Lp7 & 0xff); + + Ll[i] = BOX (s_Cl, 0, Lp0 & 0xff) + ^ BOX (s_Cl, 1, Lp1 & 0xff) + ^ BOX (s_Cl, 2, Lp2 & 0xff) + ^ BOX (s_Cl, 3, Lp3 & 0xff) + ^ BOX (s_Cl, 4, Lp4 & 0xff) + ^ BOX (s_Cl, 5, Lp5 & 0xff) + ^ BOX (s_Cl, 6, Lp6 & 0xff) + ^ BOX (s_Cl, 7, Lp7 & 0xff); + } + + stateh[0] = Lh[0] ^ Kh[0]; + statel[0] = Ll[0] ^ Kl[0]; + stateh[1] = Lh[1] ^ Kh[1]; + statel[1] = Ll[1] ^ Kl[1]; + stateh[2] = Lh[2] ^ Kh[2]; + statel[2] = Ll[2] ^ Kl[2]; + stateh[3] = Lh[3] ^ Kh[3]; + statel[3] = Ll[3] ^ Kl[3]; + stateh[4] = Lh[4] ^ Kh[4]; + statel[4] = Ll[4] ^ Kl[4]; + stateh[5] = Lh[5] ^ Kh[5]; + statel[5] = Ll[5] ^ Kl[5]; + stateh[6] = Lh[6] ^ Kh[6]; + statel[6] = Ll[6] ^ Kl[6]; + stateh[7] = Lh[7] ^ Kh[7]; + statel[7] = Ll[7] ^ Kl[7]; + } + + dgst[ 0] ^= stateh[0] ^ w[ 0]; + dgst[ 1] ^= statel[0] ^ w[ 1]; + dgst[ 2] ^= stateh[1] ^ w[ 2]; + dgst[ 3] ^= statel[1] ^ w[ 3]; + dgst[ 4] ^= stateh[2] ^ w[ 4]; + dgst[ 5] ^= statel[2] ^ w[ 5]; + dgst[ 6] ^= stateh[3] ^ w[ 6]; + dgst[ 7] ^= statel[3] ^ w[ 7]; + dgst[ 8] ^= stateh[4] ^ w[ 8]; + dgst[ 9] ^= statel[4] ^ w[ 9]; + dgst[10] ^= stateh[5] ^ w[10]; + dgst[11] ^= statel[5] ^ w[11]; + dgst[12] ^= stateh[6] ^ w[12]; + dgst[13] ^= statel[6] ^ w[13]; + dgst[14] ^= stateh[7] ^ w[14]; + dgst[15] ^= statel[7] ^ w[15]; +} + +static void hmac_run2 (const u32 w1[16], const u32 w2[16], const u32 ipad[16], const u32 opad[16], u32 dgst[16], __local u32 s_Ch[8][256], __local u32 s_Cl[8][256]) +{ + dgst[ 0] = ipad[ 0]; + dgst[ 1] = ipad[ 1]; + dgst[ 2] = ipad[ 2]; + dgst[ 3] = ipad[ 3]; + dgst[ 4] = ipad[ 4]; + dgst[ 5] = ipad[ 5]; + dgst[ 6] = ipad[ 6]; + dgst[ 7] = ipad[ 7]; + dgst[ 8] = ipad[ 8]; + dgst[ 9] = ipad[ 9]; + dgst[10] = ipad[10]; + dgst[11] = ipad[11]; + dgst[12] = ipad[12]; + dgst[13] = ipad[13]; + dgst[14] = ipad[14]; + dgst[15] = ipad[15]; + + whirlpool_transform (w1, dgst, s_Ch, s_Cl); + whirlpool_transform (w2, dgst, s_Ch, s_Cl); + + u32 w[16]; + + w[ 0] = dgst[ 0]; + w[ 1] = dgst[ 1]; + w[ 2] = dgst[ 2]; + w[ 3] = dgst[ 3]; + w[ 4] = dgst[ 4]; + w[ 5] = dgst[ 5]; + w[ 6] = dgst[ 6]; + w[ 7] = dgst[ 7]; + w[ 8] = dgst[ 8]; + w[ 9] = dgst[ 9]; + w[10] = dgst[10]; + w[11] = dgst[11]; + w[12] = dgst[12]; + w[13] = dgst[13]; + w[14] = dgst[14]; + w[15] = dgst[15]; + + dgst[ 0] = opad[ 0]; + dgst[ 1] = opad[ 1]; + dgst[ 2] = opad[ 2]; + dgst[ 3] = opad[ 3]; + dgst[ 4] = opad[ 4]; + dgst[ 5] = opad[ 5]; + dgst[ 6] = opad[ 6]; + dgst[ 7] = opad[ 7]; + dgst[ 8] = opad[ 8]; + dgst[ 9] = opad[ 9]; + dgst[10] = opad[10]; + dgst[11] = opad[11]; + dgst[12] = opad[12]; + dgst[13] = opad[13]; + dgst[14] = opad[14]; + dgst[15] = opad[15]; + + whirlpool_transform (w, dgst, s_Ch, s_Cl); + + w[ 0] = 0x80000000; + w[ 1] = 0; + w[ 2] = 0; + w[ 3] = 0; + w[ 4] = 0; + w[ 5] = 0; + w[ 6] = 0; + w[ 7] = 0; + w[ 8] = 0; + w[ 9] = 0; + w[10] = 0; + w[11] = 0; + w[12] = 0; + w[13] = 0; + w[14] = 0; + w[15] = (64 + 64) * 8; + + whirlpool_transform (w, dgst, s_Ch, s_Cl); +} + +static void hmac_init (u32 w[16], u32 ipad[16], u32 opad[16], __local u32 s_Ch[8][256], __local u32 s_Cl[8][256]) +{ + w[ 0] ^= 0x36363636; + w[ 1] ^= 0x36363636; + w[ 2] ^= 0x36363636; + w[ 3] ^= 0x36363636; + w[ 4] ^= 0x36363636; + w[ 5] ^= 0x36363636; + w[ 6] ^= 0x36363636; + w[ 7] ^= 0x36363636; + w[ 8] ^= 0x36363636; + w[ 9] ^= 0x36363636; + w[10] ^= 0x36363636; + w[11] ^= 0x36363636; + w[12] ^= 0x36363636; + w[13] ^= 0x36363636; + w[14] ^= 0x36363636; + w[15] ^= 0x36363636; + + ipad[ 0] = 0; + ipad[ 1] = 0; + ipad[ 2] = 0; + ipad[ 3] = 0; + ipad[ 4] = 0; + ipad[ 5] = 0; + ipad[ 6] = 0; + ipad[ 7] = 0; + ipad[ 8] = 0; + ipad[ 9] = 0; + ipad[10] = 0; + ipad[11] = 0; + ipad[12] = 0; + ipad[13] = 0; + ipad[14] = 0; + ipad[15] = 0; + + whirlpool_transform (w, ipad, s_Ch, s_Cl); + + w[ 0] ^= 0x6a6a6a6a; + w[ 1] ^= 0x6a6a6a6a; + w[ 2] ^= 0x6a6a6a6a; + w[ 3] ^= 0x6a6a6a6a; + w[ 4] ^= 0x6a6a6a6a; + w[ 5] ^= 0x6a6a6a6a; + w[ 6] ^= 0x6a6a6a6a; + w[ 7] ^= 0x6a6a6a6a; + w[ 8] ^= 0x6a6a6a6a; + w[ 9] ^= 0x6a6a6a6a; + w[10] ^= 0x6a6a6a6a; + w[11] ^= 0x6a6a6a6a; + w[12] ^= 0x6a6a6a6a; + w[13] ^= 0x6a6a6a6a; + w[14] ^= 0x6a6a6a6a; + w[15] ^= 0x6a6a6a6a; + + opad[ 0] = 0; + opad[ 1] = 0; + opad[ 2] = 0; + opad[ 3] = 0; + opad[ 4] = 0; + opad[ 5] = 0; + opad[ 6] = 0; + opad[ 7] = 0; + opad[ 8] = 0; + opad[ 9] = 0; + opad[10] = 0; + opad[11] = 0; + opad[12] = 0; + opad[13] = 0; + opad[14] = 0; + opad[15] = 0; + + whirlpool_transform (w, opad, s_Ch, s_Cl); +} + +static u32 u8add (const u32 a, const u32 b) +{ + const u32 a1 = (a >> 0) & 0xff; + const u32 a2 = (a >> 8) & 0xff; + const u32 a3 = (a >> 16) & 0xff; + const u32 a4 = (a >> 24) & 0xff; + + const u32 b1 = (b >> 0) & 0xff; + const u32 b2 = (b >> 8) & 0xff; + const u32 b3 = (b >> 16) & 0xff; + const u32 b4 = (b >> 24) & 0xff; + + const u32 r1 = (a1 + b1) & 0xff; + const u32 r2 = (a2 + b2) & 0xff; + const u32 r3 = (a3 + b3) & 0xff; + const u32 r4 = (a4 + b4) & 0xff; + + const u32 r = r1 << 0 + | r2 << 8 + | r3 << 16 + | r4 << 24; + + return r; +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m06233_init (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global tc_tmp_t *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global tc_t *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = pws[gid].i[ 8]; + w2[1] = pws[gid].i[ 9]; + w2[2] = pws[gid].i[10]; + w2[3] = pws[gid].i[11]; + + u32x w3[4]; + + w3[0] = pws[gid].i[12]; + w3[1] = pws[gid].i[13]; + w3[2] = pws[gid].i[14]; + w3[3] = pws[gid].i[15]; + + /** + * keyfile + */ + + w0[0] = u8add (w0[0], esalt_bufs[salt_pos].keyfile_buf[ 0]); + w0[1] = u8add (w0[1], esalt_bufs[salt_pos].keyfile_buf[ 1]); + w0[2] = u8add (w0[2], esalt_bufs[salt_pos].keyfile_buf[ 2]); + w0[3] = u8add (w0[3], esalt_bufs[salt_pos].keyfile_buf[ 3]); + w1[0] = u8add (w1[0], esalt_bufs[salt_pos].keyfile_buf[ 4]); + w1[1] = u8add (w1[1], esalt_bufs[salt_pos].keyfile_buf[ 5]); + w1[2] = u8add (w1[2], esalt_bufs[salt_pos].keyfile_buf[ 6]); + w1[3] = u8add (w1[3], esalt_bufs[salt_pos].keyfile_buf[ 7]); + w2[0] = u8add (w2[0], esalt_bufs[salt_pos].keyfile_buf[ 8]); + w2[1] = u8add (w2[1], esalt_bufs[salt_pos].keyfile_buf[ 9]); + w2[2] = u8add (w2[2], esalt_bufs[salt_pos].keyfile_buf[10]); + w2[3] = u8add (w2[3], esalt_bufs[salt_pos].keyfile_buf[11]); + w3[0] = u8add (w3[0], esalt_bufs[salt_pos].keyfile_buf[12]); + w3[1] = u8add (w3[1], esalt_bufs[salt_pos].keyfile_buf[13]); + w3[2] = u8add (w3[2], esalt_bufs[salt_pos].keyfile_buf[14]); + w3[3] = u8add (w3[3], esalt_bufs[salt_pos].keyfile_buf[15]); + + /** + * shared mem + */ + + __local u32 s_Ch[8][256]; + __local u32 s_Cl[8][256]; + + const u32 lid = get_local_id (0); + + const u32 lid4 = lid * 4; + + for (u32 i = 0; i < 8; i++) + { + s_Ch[i][lid4 + 0] = Ch[i][lid4 + 0]; + s_Ch[i][lid4 + 1] = Ch[i][lid4 + 1]; + s_Ch[i][lid4 + 2] = Ch[i][lid4 + 2]; + s_Ch[i][lid4 + 3] = Ch[i][lid4 + 3]; + s_Cl[i][lid4 + 0] = Cl[i][lid4 + 0]; + s_Cl[i][lid4 + 1] = Cl[i][lid4 + 1]; + s_Cl[i][lid4 + 2] = Cl[i][lid4 + 2]; + s_Cl[i][lid4 + 3] = Cl[i][lid4 + 3]; + } + + barrier (CLK_LOCAL_MEM_FENCE); + + if (gid >= gid_max) return; + + /** + * salt + */ + + u32 salt_buf1[16]; + + salt_buf1[ 0] = swap_workaround (esalt_bufs[salt_pos].salt_buf[ 0]); + salt_buf1[ 1] = swap_workaround (esalt_bufs[salt_pos].salt_buf[ 1]); + salt_buf1[ 2] = swap_workaround (esalt_bufs[salt_pos].salt_buf[ 2]); + salt_buf1[ 3] = swap_workaround (esalt_bufs[salt_pos].salt_buf[ 3]); + salt_buf1[ 4] = swap_workaround (esalt_bufs[salt_pos].salt_buf[ 4]); + salt_buf1[ 5] = swap_workaround (esalt_bufs[salt_pos].salt_buf[ 5]); + salt_buf1[ 6] = swap_workaround (esalt_bufs[salt_pos].salt_buf[ 6]); + salt_buf1[ 7] = swap_workaround (esalt_bufs[salt_pos].salt_buf[ 7]); + salt_buf1[ 8] = swap_workaround (esalt_bufs[salt_pos].salt_buf[ 8]); + salt_buf1[ 9] = swap_workaround (esalt_bufs[salt_pos].salt_buf[ 9]); + salt_buf1[10] = swap_workaround (esalt_bufs[salt_pos].salt_buf[10]); + salt_buf1[11] = swap_workaround (esalt_bufs[salt_pos].salt_buf[11]); + salt_buf1[12] = swap_workaround (esalt_bufs[salt_pos].salt_buf[12]); + salt_buf1[13] = swap_workaround (esalt_bufs[salt_pos].salt_buf[13]); + salt_buf1[14] = swap_workaround (esalt_bufs[salt_pos].salt_buf[14]); + salt_buf1[15] = swap_workaround (esalt_bufs[salt_pos].salt_buf[15]); + + u32 salt_buf2[16]; + + salt_buf2[ 0] = 0; + salt_buf2[ 1] = 0x80000000; + salt_buf2[ 2] = 0; + salt_buf2[ 3] = 0; + salt_buf2[ 4] = 0; + salt_buf2[ 5] = 0; + salt_buf2[ 6] = 0; + salt_buf2[ 7] = 0; + salt_buf2[ 8] = 0; + salt_buf2[ 9] = 0; + salt_buf2[10] = 0; + salt_buf2[11] = 0; + salt_buf2[12] = 0; + salt_buf2[13] = 0; + salt_buf2[14] = 0; + salt_buf2[15] = (64 + 64 + 4) * 8; + + const u32 truecrypt_mdlen = salt_bufs[0].truecrypt_mdlen; + + u32 w[16]; + + w[ 0] = swap_workaround (w0[0]); + w[ 1] = swap_workaround (w0[1]); + w[ 2] = swap_workaround (w0[2]); + w[ 3] = swap_workaround (w0[3]); + w[ 4] = swap_workaround (w1[0]); + w[ 5] = swap_workaround (w1[1]); + w[ 6] = swap_workaround (w1[2]); + w[ 7] = swap_workaround (w1[3]); + w[ 8] = swap_workaround (w2[0]); + w[ 9] = swap_workaround (w2[1]); + w[10] = swap_workaround (w2[2]); + w[11] = swap_workaround (w2[3]); + w[12] = swap_workaround (w3[0]); + w[13] = swap_workaround (w3[1]); + w[14] = swap_workaround (w3[2]); + w[15] = swap_workaround (w3[3]); + + u32 ipad[16]; + u32 opad[16]; + + hmac_init (w, ipad, opad, s_Ch, s_Cl); + + tmps[gid].ipad[ 0] = ipad[ 0]; + tmps[gid].ipad[ 1] = ipad[ 1]; + tmps[gid].ipad[ 2] = ipad[ 2]; + tmps[gid].ipad[ 3] = ipad[ 3]; + tmps[gid].ipad[ 4] = ipad[ 4]; + tmps[gid].ipad[ 5] = ipad[ 5]; + tmps[gid].ipad[ 6] = ipad[ 6]; + tmps[gid].ipad[ 7] = ipad[ 7]; + tmps[gid].ipad[ 8] = ipad[ 8]; + tmps[gid].ipad[ 9] = ipad[ 9]; + tmps[gid].ipad[10] = ipad[10]; + tmps[gid].ipad[11] = ipad[11]; + tmps[gid].ipad[12] = ipad[12]; + tmps[gid].ipad[13] = ipad[13]; + tmps[gid].ipad[14] = ipad[14]; + tmps[gid].ipad[15] = ipad[15]; + + tmps[gid].opad[ 0] = opad[ 0]; + tmps[gid].opad[ 1] = opad[ 1]; + tmps[gid].opad[ 2] = opad[ 2]; + tmps[gid].opad[ 3] = opad[ 3]; + tmps[gid].opad[ 4] = opad[ 4]; + tmps[gid].opad[ 5] = opad[ 5]; + tmps[gid].opad[ 6] = opad[ 6]; + tmps[gid].opad[ 7] = opad[ 7]; + tmps[gid].opad[ 8] = opad[ 8]; + tmps[gid].opad[ 9] = opad[ 9]; + tmps[gid].opad[10] = opad[10]; + tmps[gid].opad[11] = opad[11]; + tmps[gid].opad[12] = opad[12]; + tmps[gid].opad[13] = opad[13]; + tmps[gid].opad[14] = opad[14]; + tmps[gid].opad[15] = opad[15]; + + for (u32 i = 0, j = 1; i < (truecrypt_mdlen / 8 / 4); i += 16, j += 1) + { + salt_buf2[0] = j; + + u32 dgst[16]; + + hmac_run2 (salt_buf1, salt_buf2, ipad, opad, dgst, s_Ch, s_Cl); + + tmps[gid].dgst[i + 0] = dgst[ 0]; + tmps[gid].dgst[i + 1] = dgst[ 1]; + tmps[gid].dgst[i + 2] = dgst[ 2]; + tmps[gid].dgst[i + 3] = dgst[ 3]; + tmps[gid].dgst[i + 4] = dgst[ 4]; + tmps[gid].dgst[i + 5] = dgst[ 5]; + tmps[gid].dgst[i + 6] = dgst[ 6]; + tmps[gid].dgst[i + 7] = dgst[ 7]; + tmps[gid].dgst[i + 8] = dgst[ 8]; + tmps[gid].dgst[i + 9] = dgst[ 9]; + tmps[gid].dgst[i + 10] = dgst[10]; + tmps[gid].dgst[i + 11] = dgst[11]; + tmps[gid].dgst[i + 12] = dgst[12]; + tmps[gid].dgst[i + 13] = dgst[13]; + tmps[gid].dgst[i + 14] = dgst[14]; + tmps[gid].dgst[i + 15] = dgst[15]; + + tmps[gid].out[i + 0] = dgst[ 0]; + tmps[gid].out[i + 1] = dgst[ 1]; + tmps[gid].out[i + 2] = dgst[ 2]; + tmps[gid].out[i + 3] = dgst[ 3]; + tmps[gid].out[i + 4] = dgst[ 4]; + tmps[gid].out[i + 5] = dgst[ 5]; + tmps[gid].out[i + 6] = dgst[ 6]; + tmps[gid].out[i + 7] = dgst[ 7]; + tmps[gid].out[i + 8] = dgst[ 8]; + tmps[gid].out[i + 9] = dgst[ 9]; + tmps[gid].out[i + 10] = dgst[10]; + tmps[gid].out[i + 11] = dgst[11]; + tmps[gid].out[i + 12] = dgst[12]; + tmps[gid].out[i + 13] = dgst[13]; + tmps[gid].out[i + 14] = dgst[14]; + tmps[gid].out[i + 15] = dgst[15]; + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m06233_loop (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global tc_tmp_t *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global tc_t *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + const u32 truecrypt_mdlen = salt_bufs[0].truecrypt_mdlen; + + __local u32 s_Ch[8][256]; + __local u32 s_Cl[8][256]; + + const u32 gid = get_global_id (0); + const u32 lid = get_local_id (0); + + const u32 lid4 = lid * 4; + + for (u32 i = 0; i < 8; i++) + { + s_Ch[i][lid4 + 0] = Ch[i][lid4 + 0]; + s_Ch[i][lid4 + 1] = Ch[i][lid4 + 1]; + s_Ch[i][lid4 + 2] = Ch[i][lid4 + 2]; + s_Ch[i][lid4 + 3] = Ch[i][lid4 + 3]; + s_Cl[i][lid4 + 0] = Cl[i][lid4 + 0]; + s_Cl[i][lid4 + 1] = Cl[i][lid4 + 1]; + s_Cl[i][lid4 + 2] = Cl[i][lid4 + 2]; + s_Cl[i][lid4 + 3] = Cl[i][lid4 + 3]; + } + + barrier (CLK_LOCAL_MEM_FENCE); + + if (gid >= gid_max) return; + + u32 ipad[16]; + + ipad[ 0] = tmps[gid].ipad[ 0]; + ipad[ 1] = tmps[gid].ipad[ 1], + ipad[ 2] = tmps[gid].ipad[ 2]; + ipad[ 3] = tmps[gid].ipad[ 3]; + ipad[ 4] = tmps[gid].ipad[ 4]; + ipad[ 5] = tmps[gid].ipad[ 5]; + ipad[ 6] = tmps[gid].ipad[ 6], + ipad[ 7] = tmps[gid].ipad[ 7]; + ipad[ 8] = tmps[gid].ipad[ 8]; + ipad[ 9] = tmps[gid].ipad[ 9]; + ipad[10] = tmps[gid].ipad[10]; + ipad[11] = tmps[gid].ipad[11], + ipad[12] = tmps[gid].ipad[12]; + ipad[13] = tmps[gid].ipad[13]; + ipad[14] = tmps[gid].ipad[14]; + ipad[15] = tmps[gid].ipad[15]; + + u32 opad[16]; + + opad[ 0] = tmps[gid].opad[ 0]; + opad[ 1] = tmps[gid].opad[ 1], + opad[ 2] = tmps[gid].opad[ 2]; + opad[ 3] = tmps[gid].opad[ 3]; + opad[ 4] = tmps[gid].opad[ 4]; + opad[ 5] = tmps[gid].opad[ 5]; + opad[ 6] = tmps[gid].opad[ 6], + opad[ 7] = tmps[gid].opad[ 7]; + opad[ 8] = tmps[gid].opad[ 8]; + opad[ 9] = tmps[gid].opad[ 9]; + opad[10] = tmps[gid].opad[10]; + opad[11] = tmps[gid].opad[11], + opad[12] = tmps[gid].opad[12]; + opad[13] = tmps[gid].opad[13]; + opad[14] = tmps[gid].opad[14]; + opad[15] = tmps[gid].opad[15]; + + for (u32 i = 0; i < (truecrypt_mdlen / 8 / 4); i += 16) + { + u32 dgst[16]; + + dgst[ 0] = tmps[gid].dgst[i + 0]; + dgst[ 1] = tmps[gid].dgst[i + 1]; + dgst[ 2] = tmps[gid].dgst[i + 2]; + dgst[ 3] = tmps[gid].dgst[i + 3]; + dgst[ 4] = tmps[gid].dgst[i + 4]; + dgst[ 5] = tmps[gid].dgst[i + 5]; + dgst[ 6] = tmps[gid].dgst[i + 6]; + dgst[ 7] = tmps[gid].dgst[i + 7]; + dgst[ 8] = tmps[gid].dgst[i + 8]; + dgst[ 9] = tmps[gid].dgst[i + 9]; + dgst[10] = tmps[gid].dgst[i + 10]; + dgst[11] = tmps[gid].dgst[i + 11]; + dgst[12] = tmps[gid].dgst[i + 12]; + dgst[13] = tmps[gid].dgst[i + 13]; + dgst[14] = tmps[gid].dgst[i + 14]; + dgst[15] = tmps[gid].dgst[i + 15]; + + u32 out[16]; + + out[ 0] = tmps[gid].out[i + 0]; + out[ 1] = tmps[gid].out[i + 1]; + out[ 2] = tmps[gid].out[i + 2]; + out[ 3] = tmps[gid].out[i + 3]; + out[ 4] = tmps[gid].out[i + 4]; + out[ 5] = tmps[gid].out[i + 5]; + out[ 6] = tmps[gid].out[i + 6]; + out[ 7] = tmps[gid].out[i + 7]; + out[ 8] = tmps[gid].out[i + 8]; + out[ 9] = tmps[gid].out[i + 9]; + out[10] = tmps[gid].out[i + 10]; + out[11] = tmps[gid].out[i + 11]; + out[12] = tmps[gid].out[i + 12]; + out[13] = tmps[gid].out[i + 13]; + out[14] = tmps[gid].out[i + 14]; + out[15] = tmps[gid].out[i + 15]; + + for (u32 j = 0; j < loop_cnt; j++) + { + u32 w1[16]; + + w1[ 0] = dgst[ 0]; + w1[ 1] = dgst[ 1]; + w1[ 2] = dgst[ 2]; + w1[ 3] = dgst[ 3]; + w1[ 4] = dgst[ 4]; + w1[ 5] = dgst[ 5]; + w1[ 6] = dgst[ 6]; + w1[ 7] = dgst[ 7]; + w1[ 8] = dgst[ 8]; + w1[ 9] = dgst[ 9]; + w1[10] = dgst[10]; + w1[11] = dgst[11]; + w1[12] = dgst[12]; + w1[13] = dgst[13]; + w1[14] = dgst[14]; + w1[15] = dgst[15]; + + u32 w2[16]; + + w2[ 0] = 0x80000000; + w2[ 1] = 0; + w2[ 2] = 0; + w2[ 3] = 0; + w2[ 4] = 0; + w2[ 5] = 0; + w2[ 6] = 0; + w2[ 7] = 0; + w2[ 8] = 0; + w2[ 9] = 0; + w2[10] = 0; + w2[11] = 0; + w2[12] = 0; + w2[13] = 0; + w2[14] = 0; + w2[15] = (64 + 64) * 8; + + hmac_run2 (w1, w2, ipad, opad, dgst, s_Ch, s_Cl); + + out[ 0] ^= dgst[ 0]; + out[ 1] ^= dgst[ 1]; + out[ 2] ^= dgst[ 2]; + out[ 3] ^= dgst[ 3]; + out[ 4] ^= dgst[ 4]; + out[ 5] ^= dgst[ 5]; + out[ 6] ^= dgst[ 6]; + out[ 7] ^= dgst[ 7]; + out[ 8] ^= dgst[ 8]; + out[ 9] ^= dgst[ 9]; + out[10] ^= dgst[10]; + out[11] ^= dgst[11]; + out[12] ^= dgst[12]; + out[13] ^= dgst[13]; + out[14] ^= dgst[14]; + out[15] ^= dgst[15]; + } + + tmps[gid].dgst[i + 0] = dgst[ 0]; + tmps[gid].dgst[i + 1] = dgst[ 1]; + tmps[gid].dgst[i + 2] = dgst[ 2]; + tmps[gid].dgst[i + 3] = dgst[ 3]; + tmps[gid].dgst[i + 4] = dgst[ 4]; + tmps[gid].dgst[i + 5] = dgst[ 5]; + tmps[gid].dgst[i + 6] = dgst[ 6]; + tmps[gid].dgst[i + 7] = dgst[ 7]; + tmps[gid].dgst[i + 8] = dgst[ 8]; + tmps[gid].dgst[i + 9] = dgst[ 9]; + tmps[gid].dgst[i + 10] = dgst[10]; + tmps[gid].dgst[i + 11] = dgst[11]; + tmps[gid].dgst[i + 12] = dgst[12]; + tmps[gid].dgst[i + 13] = dgst[13]; + tmps[gid].dgst[i + 14] = dgst[14]; + tmps[gid].dgst[i + 15] = dgst[15]; + + tmps[gid].out[i + 0] = out[ 0]; + tmps[gid].out[i + 1] = out[ 1]; + tmps[gid].out[i + 2] = out[ 2]; + tmps[gid].out[i + 3] = out[ 3]; + tmps[gid].out[i + 4] = out[ 4]; + tmps[gid].out[i + 5] = out[ 5]; + tmps[gid].out[i + 6] = out[ 6]; + tmps[gid].out[i + 7] = out[ 7]; + tmps[gid].out[i + 8] = out[ 8]; + tmps[gid].out[i + 9] = out[ 9]; + tmps[gid].out[i + 10] = out[10]; + tmps[gid].out[i + 11] = out[11]; + tmps[gid].out[i + 12] = out[12]; + tmps[gid].out[i + 13] = out[13]; + tmps[gid].out[i + 14] = out[14]; + tmps[gid].out[i + 15] = out[15]; + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m06233_comp (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global tc_tmp_t *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global tc_t *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + const u32 lid = get_local_id (0); + + if (gid >= gid_max) return; + + u32 ukey1[8]; + + ukey1[0] = swap_workaround (tmps[gid].out[ 0]); + ukey1[1] = swap_workaround (tmps[gid].out[ 1]); + ukey1[2] = swap_workaround (tmps[gid].out[ 2]); + ukey1[3] = swap_workaround (tmps[gid].out[ 3]); + ukey1[4] = swap_workaround (tmps[gid].out[ 4]); + ukey1[5] = swap_workaround (tmps[gid].out[ 5]); + ukey1[6] = swap_workaround (tmps[gid].out[ 6]); + ukey1[7] = swap_workaround (tmps[gid].out[ 7]); + + u32 ukey2[8]; + + ukey2[0] = swap_workaround (tmps[gid].out[ 8]); + ukey2[1] = swap_workaround (tmps[gid].out[ 9]); + ukey2[2] = swap_workaround (tmps[gid].out[10]); + ukey2[3] = swap_workaround (tmps[gid].out[11]); + ukey2[4] = swap_workaround (tmps[gid].out[12]); + ukey2[5] = swap_workaround (tmps[gid].out[13]); + ukey2[6] = swap_workaround (tmps[gid].out[14]); + ukey2[7] = swap_workaround (tmps[gid].out[15]); + + u32 data[4]; + + data[0] = esalt_bufs[0].data_buf[0]; + data[1] = esalt_bufs[0].data_buf[1]; + data[2] = esalt_bufs[0].data_buf[2]; + data[3] = esalt_bufs[0].data_buf[3]; + + u32 tmp[4]; + + { + tmp[0] = data[0]; + tmp[1] = data[1]; + tmp[2] = data[2]; + tmp[3] = data[3]; + + aes256_decrypt_xts (ukey1, ukey2, tmp, tmp); + + if (((tmp[0] == 0x45555254) && (tmp[3] == 0)) || ((tmp[0] == 0x45555254) && ((tmp[1] >> 16) <= 5))) + { + mark_hash_s0 (plains_buf, hashes_shown, 0, gid, 0); + + d_return_buf[lid] = 1; + } + } + + { + tmp[0] = data[0]; + tmp[1] = data[1]; + tmp[2] = data[2]; + tmp[3] = data[3]; + + serpent256_decrypt_xts (ukey1, ukey2, tmp, tmp); + + if (((tmp[0] == 0x45555254) && (tmp[3] == 0)) || ((tmp[0] == 0x45555254) && ((tmp[1] >> 16) <= 5))) + { + mark_hash_s0 (plains_buf, hashes_shown, 0, gid, 0); + + d_return_buf[lid] = 1; + } + } + + { + tmp[0] = data[0]; + tmp[1] = data[1]; + tmp[2] = data[2]; + tmp[3] = data[3]; + + twofish256_decrypt_xts (ukey1, ukey2, tmp, tmp); + + if (((tmp[0] == 0x45555254) && (tmp[3] == 0)) || ((tmp[0] == 0x45555254) && ((tmp[1] >> 16) <= 5))) + { + mark_hash_s0 (plains_buf, hashes_shown, 0, gid, 0); + + d_return_buf[lid] = 1; + } + } + + u32 ukey3[8]; + + ukey3[0] = swap_workaround (tmps[gid].out[16]); + ukey3[1] = swap_workaround (tmps[gid].out[17]); + ukey3[2] = swap_workaround (tmps[gid].out[18]); + ukey3[3] = swap_workaround (tmps[gid].out[19]); + ukey3[4] = swap_workaround (tmps[gid].out[20]); + ukey3[5] = swap_workaround (tmps[gid].out[21]); + ukey3[6] = swap_workaround (tmps[gid].out[22]); + ukey3[7] = swap_workaround (tmps[gid].out[23]); + + u32 ukey4[8]; + + ukey4[0] = swap_workaround (tmps[gid].out[24]); + ukey4[1] = swap_workaround (tmps[gid].out[25]); + ukey4[2] = swap_workaround (tmps[gid].out[26]); + ukey4[3] = swap_workaround (tmps[gid].out[27]); + ukey4[4] = swap_workaround (tmps[gid].out[28]); + ukey4[5] = swap_workaround (tmps[gid].out[29]); + ukey4[6] = swap_workaround (tmps[gid].out[30]); + ukey4[7] = swap_workaround (tmps[gid].out[31]); + + { + tmp[0] = data[0]; + tmp[1] = data[1]; + tmp[2] = data[2]; + tmp[3] = data[3]; + + aes256_decrypt_xts (ukey2, ukey4, tmp, tmp); + twofish256_decrypt_xts (ukey1, ukey3, tmp, tmp); + + if (((tmp[0] == 0x45555254) && (tmp[3] == 0)) || ((tmp[0] == 0x45555254) && ((tmp[1] >> 16) <= 5))) + { + mark_hash_s0 (plains_buf, hashes_shown, 0, gid, 0); + + d_return_buf[lid] = 1; + } + } + + { + tmp[0] = data[0]; + tmp[1] = data[1]; + tmp[2] = data[2]; + tmp[3] = data[3]; + + serpent256_decrypt_xts (ukey2, ukey4, tmp, tmp); + aes256_decrypt_xts (ukey1, ukey3, tmp, tmp); + + if (((tmp[0] == 0x45555254) && (tmp[3] == 0)) || ((tmp[0] == 0x45555254) && ((tmp[1] >> 16) <= 5))) + { + mark_hash_s0 (plains_buf, hashes_shown, 0, gid, 0); + + d_return_buf[lid] = 1; + } + } + + { + tmp[0] = data[0]; + tmp[1] = data[1]; + tmp[2] = data[2]; + tmp[3] = data[3]; + + twofish256_decrypt_xts (ukey2, ukey4, tmp, tmp); + serpent256_decrypt_xts (ukey1, ukey3, tmp, tmp); + + if (((tmp[0] == 0x45555254) && (tmp[3] == 0)) || ((tmp[0] == 0x45555254) && ((tmp[1] >> 16) <= 5))) + { + mark_hash_s0 (plains_buf, hashes_shown, 0, gid, 0); + + d_return_buf[lid] = 1; + } + } + + u32 ukey5[8]; + + ukey5[0] = swap_workaround (tmps[gid].out[32]); + ukey5[1] = swap_workaround (tmps[gid].out[33]); + ukey5[2] = swap_workaround (tmps[gid].out[34]); + ukey5[3] = swap_workaround (tmps[gid].out[35]); + ukey5[4] = swap_workaround (tmps[gid].out[36]); + ukey5[5] = swap_workaround (tmps[gid].out[37]); + ukey5[6] = swap_workaround (tmps[gid].out[38]); + ukey5[7] = swap_workaround (tmps[gid].out[39]); + + u32 ukey6[8]; + + ukey6[0] = swap_workaround (tmps[gid].out[40]); + ukey6[1] = swap_workaround (tmps[gid].out[41]); + ukey6[2] = swap_workaround (tmps[gid].out[42]); + ukey6[3] = swap_workaround (tmps[gid].out[43]); + ukey6[4] = swap_workaround (tmps[gid].out[44]); + ukey6[5] = swap_workaround (tmps[gid].out[45]); + ukey6[6] = swap_workaround (tmps[gid].out[46]); + ukey6[7] = swap_workaround (tmps[gid].out[47]); + + { + tmp[0] = data[0]; + tmp[1] = data[1]; + tmp[2] = data[2]; + tmp[3] = data[3]; + + aes256_decrypt_xts (ukey3, ukey6, tmp, tmp); + twofish256_decrypt_xts (ukey2, ukey5, tmp, tmp); + serpent256_decrypt_xts (ukey1, ukey4, tmp, tmp); + + if (((tmp[0] == 0x45555254) && (tmp[3] == 0)) || ((tmp[0] == 0x45555254) && ((tmp[1] >> 16) <= 5))) + { + mark_hash_s0 (plains_buf, hashes_shown, 0, gid, 0); + + d_return_buf[lid] = 1; + } + } + + { + tmp[0] = data[0]; + tmp[1] = data[1]; + tmp[2] = data[2]; + tmp[3] = data[3]; + + serpent256_decrypt_xts (ukey3, ukey6, tmp, tmp); + twofish256_decrypt_xts (ukey2, ukey5, tmp, tmp); + aes256_decrypt_xts (ukey1, ukey4, tmp, tmp); + + if (((tmp[0] == 0x45555254) && (tmp[3] == 0)) || ((tmp[0] == 0x45555254) && ((tmp[1] >> 16) <= 5))) + { + mark_hash_s0 (plains_buf, hashes_shown, 0, gid, 0); + + d_return_buf[lid] = 1; + } + } +} diff --git a/amd/m06300.cl b/amd/m06300.cl new file mode 100644 index 0000000000..8ca2f629d3 --- /dev/null +++ b/amd/m06300.cl @@ -0,0 +1,1959 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _MD5_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW4 +#define VECT_SIZE4 +#endif + +#ifdef VLIW5 +#define VECT_SIZE4 +#endif + +#define DGST_R0 0 +#define DGST_R1 1 +#define DGST_R2 2 +#define DGST_R3 3 + +#include "include/kernel_functions.c" +#include "types_amd.c" +#include "common_amd.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +static void md5_transform (const u32x w0[4], const u32x w1[4], const u32x w2[4], const u32x w3[4], u32x digest[4]) +{ + u32x a = digest[0]; + u32x b = digest[1]; + u32x c = digest[2]; + u32x d = digest[3]; + + u32x w0_t = w0[0]; + u32x w1_t = w0[1]; + u32x w2_t = w0[2]; + u32x w3_t = w0[3]; + u32x w4_t = w1[0]; + u32x w5_t = w1[1]; + u32x w6_t = w1[2]; + u32x w7_t = w1[3]; + u32x w8_t = w2[0]; + u32x w9_t = w2[1]; + u32x wa_t = w2[2]; + u32x wb_t = w2[3]; + u32x wc_t = w3[0]; + u32x wd_t = w3[1]; + u32x we_t = w3[2]; + u32x wf_t = 0; + + u32x tmp2; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t, MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t, MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t, MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t, MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w4_t, MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w5_t, MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w6_t, MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w7_t, MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w8_t, MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w9_t, MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, wa_t, MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, wb_t, MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, wc_t, MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, wd_t, MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, we_t, MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, wf_t, MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w1_t, MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w6_t, MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, wb_t, MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t, MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w5_t, MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, wa_t, MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, wf_t, MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w4_t, MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w9_t, MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, we_t, MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t, MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w8_t, MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, wd_t, MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t, MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w7_t, MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, wc_t, MD5C1f, MD5S13); + + MD5_STEP (MD5_H1, a, b, c, d, w5_t, MD5C20, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w8_t, MD5C21, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, wb_t, MD5C22, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, we_t, MD5C23, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w1_t, MD5C24, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w4_t, MD5C25, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w7_t, MD5C26, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, wa_t, MD5C27, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, wd_t, MD5C28, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w0_t, MD5C29, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w3_t, MD5C2a, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w6_t, MD5C2b, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w9_t, MD5C2c, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, wc_t, MD5C2d, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, wf_t, MD5C2e, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w2_t, MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t, MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w7_t, MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, we_t, MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w5_t, MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, wc_t, MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t, MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, wa_t, MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t, MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w8_t, MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, wf_t, MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w6_t, MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, wd_t, MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w4_t, MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, wb_t, MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t, MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w9_t, MD5C3f, MD5S33); + + digest[0] += a; + digest[1] += b; + digest[2] += c; + digest[3] += d; +} + +static void memcat16 (u32x block0[4], u32x block1[4], u32x block2[4], u32x block3[4], const u32 block_len, const u32x append[4]) +{ + switch (block_len) + { + case 0: + block0[0] = append[0]; + block0[1] = append[1]; + block0[2] = append[2]; + block0[3] = append[3]; + break; + + case 1: + block0[0] = block0[0] | append[0] << 8; + block0[1] = append[0] >> 24 | append[1] << 8; + block0[2] = append[1] >> 24 | append[2] << 8; + block0[3] = append[2] >> 24 | append[3] << 8; + block1[0] = append[3] >> 24; + break; + + case 2: + block0[0] = block0[0] | append[0] << 16; + block0[1] = append[0] >> 16 | append[1] << 16; + block0[2] = append[1] >> 16 | append[2] << 16; + block0[3] = append[2] >> 16 | append[3] << 16; + block1[0] = append[3] >> 16; + break; + + case 3: + block0[0] = block0[0] | append[0] << 24; + block0[1] = append[0] >> 8 | append[1] << 24; + block0[2] = append[1] >> 8 | append[2] << 24; + block0[3] = append[2] >> 8 | append[3] << 24; + block1[0] = append[3] >> 8; + break; + + case 4: + block0[1] = append[0]; + block0[2] = append[1]; + block0[3] = append[2]; + block1[0] = append[3]; + break; + + case 5: + block0[1] = block0[1] | append[0] << 8; + block0[2] = append[0] >> 24 | append[1] << 8; + block0[3] = append[1] >> 24 | append[2] << 8; + block1[0] = append[2] >> 24 | append[3] << 8; + block1[1] = append[3] >> 24; + break; + + case 6: + block0[1] = block0[1] | append[0] << 16; + block0[2] = append[0] >> 16 | append[1] << 16; + block0[3] = append[1] >> 16 | append[2] << 16; + block1[0] = append[2] >> 16 | append[3] << 16; + block1[1] = append[3] >> 16; + break; + + case 7: + block0[1] = block0[1] | append[0] << 24; + block0[2] = append[0] >> 8 | append[1] << 24; + block0[3] = append[1] >> 8 | append[2] << 24; + block1[0] = append[2] >> 8 | append[3] << 24; + block1[1] = append[3] >> 8; + break; + + case 8: + block0[2] = append[0]; + block0[3] = append[1]; + block1[0] = append[2]; + block1[1] = append[3]; + break; + + case 9: + block0[2] = block0[2] | append[0] << 8; + block0[3] = append[0] >> 24 | append[1] << 8; + block1[0] = append[1] >> 24 | append[2] << 8; + block1[1] = append[2] >> 24 | append[3] << 8; + block1[2] = append[3] >> 24; + break; + + case 10: + block0[2] = block0[2] | append[0] << 16; + block0[3] = append[0] >> 16 | append[1] << 16; + block1[0] = append[1] >> 16 | append[2] << 16; + block1[1] = append[2] >> 16 | append[3] << 16; + block1[2] = append[3] >> 16; + break; + + case 11: + block0[2] = block0[2] | append[0] << 24; + block0[3] = append[0] >> 8 | append[1] << 24; + block1[0] = append[1] >> 8 | append[2] << 24; + block1[1] = append[2] >> 8 | append[3] << 24; + block1[2] = append[3] >> 8; + break; + + case 12: + block0[3] = append[0]; + block1[0] = append[1]; + block1[1] = append[2]; + block1[2] = append[3]; + break; + + case 13: + block0[3] = block0[3] | append[0] << 8; + block1[0] = append[0] >> 24 | append[1] << 8; + block1[1] = append[1] >> 24 | append[2] << 8; + block1[2] = append[2] >> 24 | append[3] << 8; + block1[3] = append[3] >> 24; + break; + + case 14: + block0[3] = block0[3] | append[0] << 16; + block1[0] = append[0] >> 16 | append[1] << 16; + block1[1] = append[1] >> 16 | append[2] << 16; + block1[2] = append[2] >> 16 | append[3] << 16; + block1[3] = append[3] >> 16; + break; + + case 15: + block0[3] = block0[3] | append[0] << 24; + block1[0] = append[0] >> 8 | append[1] << 24; + block1[1] = append[1] >> 8 | append[2] << 24; + block1[2] = append[2] >> 8 | append[3] << 24; + block1[3] = append[3] >> 8; + break; + + case 16: + block1[0] = append[0]; + block1[1] = append[1]; + block1[2] = append[2]; + block1[3] = append[3]; + break; + + case 17: + block1[0] = block1[0] | append[0] << 8; + block1[1] = append[0] >> 24 | append[1] << 8; + block1[2] = append[1] >> 24 | append[2] << 8; + block1[3] = append[2] >> 24 | append[3] << 8; + block2[0] = append[3] >> 24; + break; + + case 18: + block1[0] = block1[0] | append[0] << 16; + block1[1] = append[0] >> 16 | append[1] << 16; + block1[2] = append[1] >> 16 | append[2] << 16; + block1[3] = append[2] >> 16 | append[3] << 16; + block2[0] = append[3] >> 16; + break; + + case 19: + block1[0] = block1[0] | append[0] << 24; + block1[1] = append[0] >> 8 | append[1] << 24; + block1[2] = append[1] >> 8 | append[2] << 24; + block1[3] = append[2] >> 8 | append[3] << 24; + block2[0] = append[3] >> 8; + break; + + case 20: + block1[1] = append[0]; + block1[2] = append[1]; + block1[3] = append[2]; + block2[0] = append[3]; + break; + + case 21: + block1[1] = block1[1] | append[0] << 8; + block1[2] = append[0] >> 24 | append[1] << 8; + block1[3] = append[1] >> 24 | append[2] << 8; + block2[0] = append[2] >> 24 | append[3] << 8; + block2[1] = append[3] >> 24; + break; + + case 22: + block1[1] = block1[1] | append[0] << 16; + block1[2] = append[0] >> 16 | append[1] << 16; + block1[3] = append[1] >> 16 | append[2] << 16; + block2[0] = append[2] >> 16 | append[3] << 16; + block2[1] = append[3] >> 16; + break; + + case 23: + block1[1] = block1[1] | append[0] << 24; + block1[2] = append[0] >> 8 | append[1] << 24; + block1[3] = append[1] >> 8 | append[2] << 24; + block2[0] = append[2] >> 8 | append[3] << 24; + block2[1] = append[3] >> 8; + break; + + case 24: + block1[2] = append[0]; + block1[3] = append[1]; + block2[0] = append[2]; + block2[1] = append[3]; + break; + + case 25: + block1[2] = block1[2] | append[0] << 8; + block1[3] = append[0] >> 24 | append[1] << 8; + block2[0] = append[1] >> 24 | append[2] << 8; + block2[1] = append[2] >> 24 | append[3] << 8; + block2[2] = append[3] >> 24; + break; + + case 26: + block1[2] = block1[2] | append[0] << 16; + block1[3] = append[0] >> 16 | append[1] << 16; + block2[0] = append[1] >> 16 | append[2] << 16; + block2[1] = append[2] >> 16 | append[3] << 16; + block2[2] = append[3] >> 16; + break; + + case 27: + block1[2] = block1[2] | append[0] << 24; + block1[3] = append[0] >> 8 | append[1] << 24; + block2[0] = append[1] >> 8 | append[2] << 24; + block2[1] = append[2] >> 8 | append[3] << 24; + block2[2] = append[3] >> 8; + break; + + case 28: + block1[3] = append[0]; + block2[0] = append[1]; + block2[1] = append[2]; + block2[2] = append[3]; + break; + + case 29: + block1[3] = block1[3] | append[0] << 8; + block2[0] = append[0] >> 24 | append[1] << 8; + block2[1] = append[1] >> 24 | append[2] << 8; + block2[2] = append[2] >> 24 | append[3] << 8; + block2[3] = append[3] >> 24; + break; + + case 30: + block1[3] = block1[3] | append[0] << 16; + block2[0] = append[0] >> 16 | append[1] << 16; + block2[1] = append[1] >> 16 | append[2] << 16; + block2[2] = append[2] >> 16 | append[3] << 16; + block2[3] = append[3] >> 16; + break; + + case 31: + block1[3] = block1[3] | append[0] << 24; + block2[0] = append[0] >> 8 | append[1] << 24; + block2[1] = append[1] >> 8 | append[2] << 24; + block2[2] = append[2] >> 8 | append[3] << 24; + block2[3] = append[3] >> 8; + break; + + case 32: + block2[0] = append[0]; + block2[1] = append[1]; + block2[2] = append[2]; + block2[3] = append[3]; + break; + + case 33: + block2[0] = block2[0] | append[0] << 8; + block2[1] = append[0] >> 24 | append[1] << 8; + block2[2] = append[1] >> 24 | append[2] << 8; + block2[3] = append[2] >> 24 | append[3] << 8; + block3[0] = append[3] >> 24; + break; + + case 34: + block2[0] = block2[0] | append[0] << 16; + block2[1] = append[0] >> 16 | append[1] << 16; + block2[2] = append[1] >> 16 | append[2] << 16; + block2[3] = append[2] >> 16 | append[3] << 16; + block3[0] = append[3] >> 16; + break; + + case 35: + block2[0] = block2[0] | append[0] << 24; + block2[1] = append[0] >> 8 | append[1] << 24; + block2[2] = append[1] >> 8 | append[2] << 24; + block2[3] = append[2] >> 8 | append[3] << 24; + block3[0] = append[3] >> 8; + break; + + case 36: + block2[1] = append[0]; + block2[2] = append[1]; + block2[3] = append[2]; + block3[0] = append[3]; + break; + + case 37: + block2[1] = block2[1] | append[0] << 8; + block2[2] = append[0] >> 24 | append[1] << 8; + block2[3] = append[1] >> 24 | append[2] << 8; + block3[0] = append[2] >> 24 | append[3] << 8; + block3[1] = append[3] >> 24; + break; + + case 38: + block2[1] = block2[1] | append[0] << 16; + block2[2] = append[0] >> 16 | append[1] << 16; + block2[3] = append[1] >> 16 | append[2] << 16; + block3[0] = append[2] >> 16 | append[3] << 16; + block3[1] = append[3] >> 16; + break; + + case 39: + block2[1] = block2[1] | append[0] << 24; + block2[2] = append[0] >> 8 | append[1] << 24; + block2[3] = append[1] >> 8 | append[2] << 24; + block3[0] = append[2] >> 8 | append[3] << 24; + block3[1] = append[3] >> 8; + break; + + case 40: + block2[2] = append[0]; + block2[3] = append[1]; + block3[0] = append[2]; + block3[1] = append[3]; + break; + + case 41: + block2[2] = block2[2] | append[0] << 8; + block2[3] = append[0] >> 24 | append[1] << 8; + block3[0] = append[1] >> 24 | append[2] << 8; + block3[1] = append[2] >> 24 | append[3] << 8; + block3[2] = append[3] >> 24; + break; + + case 42: + block2[2] = block2[2] | append[0] << 16; + block2[3] = append[0] >> 16 | append[1] << 16; + block3[0] = append[1] >> 16 | append[2] << 16; + block3[1] = append[2] >> 16 | append[3] << 16; + block3[2] = append[3] >> 16; + break; + + case 43: + block2[2] = block2[2] | append[0] << 24; + block2[3] = append[0] >> 8 | append[1] << 24; + block3[0] = append[1] >> 8 | append[2] << 24; + block3[1] = append[2] >> 8 | append[3] << 24; + block3[2] = append[3] >> 8; + break; + + case 44: + block2[3] = append[0]; + block3[0] = append[1]; + block3[1] = append[2]; + block3[2] = append[3]; + break; + + case 45: + block2[3] = block2[3] | append[0] << 8; + block3[0] = append[0] >> 24 | append[1] << 8; + block3[1] = append[1] >> 24 | append[2] << 8; + block3[2] = append[2] >> 24 | append[3] << 8; + block3[3] = append[3] >> 24; + break; + + case 46: + block2[3] = block2[3] | append[0] << 16; + block3[0] = append[0] >> 16 | append[1] << 16; + block3[1] = append[1] >> 16 | append[2] << 16; + block3[2] = append[2] >> 16 | append[3] << 16; + block3[3] = append[3] >> 16; + break; + + case 47: + block2[3] = block2[3] | append[0] << 24; + block3[0] = append[0] >> 8 | append[1] << 24; + block3[1] = append[1] >> 8 | append[2] << 24; + block3[2] = append[2] >> 8 | append[3] << 24; + block3[3] = append[3] >> 8; + break; + + case 48: + block3[0] = append[0]; + block3[1] = append[1]; + block3[2] = append[2]; + block3[3] = append[3]; + break; + + case 49: + block3[0] = block3[0] | append[0] << 8; + block3[1] = append[0] >> 24 | append[1] << 8; + block3[2] = append[1] >> 24 | append[2] << 8; + block3[3] = append[2] >> 24 | append[3] << 8; + break; + + case 50: + block3[0] = block3[0] | append[0] << 16; + block3[1] = append[0] >> 16 | append[1] << 16; + block3[2] = append[1] >> 16 | append[2] << 16; + block3[3] = append[2] >> 16 | append[3] << 16; + break; + + case 51: + block3[0] = block3[0] | append[0] << 24; + block3[1] = append[0] >> 8 | append[1] << 24; + block3[2] = append[1] >> 8 | append[2] << 24; + block3[3] = append[2] >> 8 | append[3] << 24; + break; + + case 52: + block3[1] = append[0]; + block3[2] = append[1]; + block3[3] = append[2]; + break; + + case 53: + block3[1] = block3[1] | append[0] << 8; + block3[2] = append[0] >> 24 | append[1] << 8; + block3[3] = append[1] >> 24 | append[2] << 8; + break; + + case 54: + block3[1] = block3[1] | append[0] << 16; + block3[2] = append[0] >> 16 | append[1] << 16; + block3[3] = append[1] >> 16 | append[2] << 16; + break; + + case 55: + block3[1] = block3[1] | append[0] << 24; + block3[2] = append[0] >> 8 | append[1] << 24; + block3[3] = append[1] >> 8 | append[2] << 24; + break; + + case 56: + block3[2] = append[0]; + block3[3] = append[1]; + break; + } +} + +static void memcat16_x80 (u32x block0[4], u32x block1[4], u32x block2[4], u32x block3[4], const u32 block_len, const u32x append[4]) +{ + switch (block_len) + { + case 0: + block0[0] = append[0]; + block0[1] = append[1]; + block0[2] = append[2]; + block0[3] = append[3]; + block1[0] = 0x80; + break; + + case 1: + block0[0] = block0[0] | append[0] << 8; + block0[1] = append[0] >> 24 | append[1] << 8; + block0[2] = append[1] >> 24 | append[2] << 8; + block0[3] = append[2] >> 24 | append[3] << 8; + block1[0] = append[3] >> 24 | 0x80u << 8; + break; + + case 2: + block0[0] = block0[0] | append[0] << 16; + block0[1] = append[0] >> 16 | append[1] << 16; + block0[2] = append[1] >> 16 | append[2] << 16; + block0[3] = append[2] >> 16 | append[3] << 16; + block1[0] = append[3] >> 16 | 0x80u << 16; + break; + + case 3: + block0[0] = block0[0] | append[0] << 24; + block0[1] = append[0] >> 8 | append[1] << 24; + block0[2] = append[1] >> 8 | append[2] << 24; + block0[3] = append[2] >> 8 | append[3] << 24; + block1[0] = append[3] >> 8 | 0x80u << 24; + break; + + case 4: + block0[1] = append[0]; + block0[2] = append[1]; + block0[3] = append[2]; + block1[0] = append[3]; + block1[1] = 0x80; + break; + + case 5: + block0[1] = block0[1] | append[0] << 8; + block0[2] = append[0] >> 24 | append[1] << 8; + block0[3] = append[1] >> 24 | append[2] << 8; + block1[0] = append[2] >> 24 | append[3] << 8; + block1[1] = append[3] >> 24 | 0x80u << 8; + break; + + case 6: + block0[1] = block0[1] | append[0] << 16; + block0[2] = append[0] >> 16 | append[1] << 16; + block0[3] = append[1] >> 16 | append[2] << 16; + block1[0] = append[2] >> 16 | append[3] << 16; + block1[1] = append[3] >> 16 | 0x80u << 16; + break; + + case 7: + block0[1] = block0[1] | append[0] << 24; + block0[2] = append[0] >> 8 | append[1] << 24; + block0[3] = append[1] >> 8 | append[2] << 24; + block1[0] = append[2] >> 8 | append[3] << 24; + block1[1] = append[3] >> 8 | 0x80u << 24; + break; + + case 8: + block0[2] = append[0]; + block0[3] = append[1]; + block1[0] = append[2]; + block1[1] = append[3]; + block1[2] = 0x80; + break; + + case 9: + block0[2] = block0[2] | append[0] << 8; + block0[3] = append[0] >> 24 | append[1] << 8; + block1[0] = append[1] >> 24 | append[2] << 8; + block1[1] = append[2] >> 24 | append[3] << 8; + block1[2] = append[3] >> 24 | 0x80u << 8; + break; + + case 10: + block0[2] = block0[2] | append[0] << 16; + block0[3] = append[0] >> 16 | append[1] << 16; + block1[0] = append[1] >> 16 | append[2] << 16; + block1[1] = append[2] >> 16 | append[3] << 16; + block1[2] = append[3] >> 16 | 0x80u << 16; + break; + + case 11: + block0[2] = block0[2] | append[0] << 24; + block0[3] = append[0] >> 8 | append[1] << 24; + block1[0] = append[1] >> 8 | append[2] << 24; + block1[1] = append[2] >> 8 | append[3] << 24; + block1[2] = append[3] >> 8 | 0x80u << 24; + break; + + case 12: + block0[3] = append[0]; + block1[0] = append[1]; + block1[1] = append[2]; + block1[2] = append[3]; + block1[3] = 0x80; + break; + + case 13: + block0[3] = block0[3] | append[0] << 8; + block1[0] = append[0] >> 24 | append[1] << 8; + block1[1] = append[1] >> 24 | append[2] << 8; + block1[2] = append[2] >> 24 | append[3] << 8; + block1[3] = append[3] >> 24 | 0x80u << 8; + break; + + case 14: + block0[3] = block0[3] | append[0] << 16; + block1[0] = append[0] >> 16 | append[1] << 16; + block1[1] = append[1] >> 16 | append[2] << 16; + block1[2] = append[2] >> 16 | append[3] << 16; + block1[3] = append[3] >> 16 | 0x80u << 16; + break; + + case 15: + block0[3] = block0[3] | append[0] << 24; + block1[0] = append[0] >> 8 | append[1] << 24; + block1[1] = append[1] >> 8 | append[2] << 24; + block1[2] = append[2] >> 8 | append[3] << 24; + block1[3] = append[3] >> 8 | 0x80u << 24; + break; + + case 16: + block1[0] = append[0]; + block1[1] = append[1]; + block1[2] = append[2]; + block1[3] = append[3]; + block2[0] = 0x80; + break; + + case 17: + block1[0] = block1[0] | append[0] << 8; + block1[1] = append[0] >> 24 | append[1] << 8; + block1[2] = append[1] >> 24 | append[2] << 8; + block1[3] = append[2] >> 24 | append[3] << 8; + block2[0] = append[3] >> 24 | 0x80u << 8; + break; + + case 18: + block1[0] = block1[0] | append[0] << 16; + block1[1] = append[0] >> 16 | append[1] << 16; + block1[2] = append[1] >> 16 | append[2] << 16; + block1[3] = append[2] >> 16 | append[3] << 16; + block2[0] = append[3] >> 16 | 0x80u << 16; + break; + + case 19: + block1[0] = block1[0] | append[0] << 24; + block1[1] = append[0] >> 8 | append[1] << 24; + block1[2] = append[1] >> 8 | append[2] << 24; + block1[3] = append[2] >> 8 | append[3] << 24; + block2[0] = append[3] >> 8 | 0x80u << 24; + break; + + case 20: + block1[1] = append[0]; + block1[2] = append[1]; + block1[3] = append[2]; + block2[0] = append[3]; + block2[1] = 0x80; + break; + + case 21: + block1[1] = block1[1] | append[0] << 8; + block1[2] = append[0] >> 24 | append[1] << 8; + block1[3] = append[1] >> 24 | append[2] << 8; + block2[0] = append[2] >> 24 | append[3] << 8; + block2[1] = append[3] >> 24 | 0x80u << 8; + break; + + case 22: + block1[1] = block1[1] | append[0] << 16; + block1[2] = append[0] >> 16 | append[1] << 16; + block1[3] = append[1] >> 16 | append[2] << 16; + block2[0] = append[2] >> 16 | append[3] << 16; + block2[1] = append[3] >> 16 | 0x80u << 16; + break; + + case 23: + block1[1] = block1[1] | append[0] << 24; + block1[2] = append[0] >> 8 | append[1] << 24; + block1[3] = append[1] >> 8 | append[2] << 24; + block2[0] = append[2] >> 8 | append[3] << 24; + block2[1] = append[3] >> 8 | 0x80u << 24; + break; + + case 24: + block1[2] = append[0]; + block1[3] = append[1]; + block2[0] = append[2]; + block2[1] = append[3]; + block2[2] = 0x80; + break; + + case 25: + block1[2] = block1[2] | append[0] << 8; + block1[3] = append[0] >> 24 | append[1] << 8; + block2[0] = append[1] >> 24 | append[2] << 8; + block2[1] = append[2] >> 24 | append[3] << 8; + block2[2] = append[3] >> 24 | 0x80u << 8; + break; + + case 26: + block1[2] = block1[2] | append[0] << 16; + block1[3] = append[0] >> 16 | append[1] << 16; + block2[0] = append[1] >> 16 | append[2] << 16; + block2[1] = append[2] >> 16 | append[3] << 16; + block2[2] = append[3] >> 16 | 0x80u << 16; + break; + + case 27: + block1[2] = block1[2] | append[0] << 24; + block1[3] = append[0] >> 8 | append[1] << 24; + block2[0] = append[1] >> 8 | append[2] << 24; + block2[1] = append[2] >> 8 | append[3] << 24; + block2[2] = append[3] >> 8 | 0x80u << 24; + break; + + case 28: + block1[3] = append[0]; + block2[0] = append[1]; + block2[1] = append[2]; + block2[2] = append[3]; + block2[3] = 0x80; + break; + + case 29: + block1[3] = block1[3] | append[0] << 8; + block2[0] = append[0] >> 24 | append[1] << 8; + block2[1] = append[1] >> 24 | append[2] << 8; + block2[2] = append[2] >> 24 | append[3] << 8; + block2[3] = append[3] >> 24 | 0x80u << 8; + break; + + case 30: + block1[3] = block1[3] | append[0] << 16; + block2[0] = append[0] >> 16 | append[1] << 16; + block2[1] = append[1] >> 16 | append[2] << 16; + block2[2] = append[2] >> 16 | append[3] << 16; + block2[3] = append[3] >> 16 | 0x80u << 16; + break; + + case 31: + block1[3] = block1[3] | append[0] << 24; + block2[0] = append[0] >> 8 | append[1] << 24; + block2[1] = append[1] >> 8 | append[2] << 24; + block2[2] = append[2] >> 8 | append[3] << 24; + block2[3] = append[3] >> 8 | 0x80u << 24; + break; + + case 32: + block2[0] = append[0]; + block2[1] = append[1]; + block2[2] = append[2]; + block2[3] = append[3]; + block3[0] = 0x80; + break; + + case 33: + block2[0] = block2[0] | append[0] << 8; + block2[1] = append[0] >> 24 | append[1] << 8; + block2[2] = append[1] >> 24 | append[2] << 8; + block2[3] = append[2] >> 24 | append[3] << 8; + block3[0] = append[3] >> 24 | 0x80u << 8; + break; + + case 34: + block2[0] = block2[0] | append[0] << 16; + block2[1] = append[0] >> 16 | append[1] << 16; + block2[2] = append[1] >> 16 | append[2] << 16; + block2[3] = append[2] >> 16 | append[3] << 16; + block3[0] = append[3] >> 16 | 0x80u << 16; + break; + + case 35: + block2[0] = block2[0] | append[0] << 24; + block2[1] = append[0] >> 8 | append[1] << 24; + block2[2] = append[1] >> 8 | append[2] << 24; + block2[3] = append[2] >> 8 | append[3] << 24; + block3[0] = append[3] >> 8 | 0x80u << 24; + break; + + case 36: + block2[1] = append[0]; + block2[2] = append[1]; + block2[3] = append[2]; + block3[0] = append[3]; + block3[1] = 0x80; + break; + + case 37: + block2[1] = block2[1] | append[0] << 8; + block2[2] = append[0] >> 24 | append[1] << 8; + block2[3] = append[1] >> 24 | append[2] << 8; + block3[0] = append[2] >> 24 | append[3] << 8; + block3[1] = append[3] >> 24 | 0x80u << 8; + break; + + case 38: + block2[1] = block2[1] | append[0] << 16; + block2[2] = append[0] >> 16 | append[1] << 16; + block2[3] = append[1] >> 16 | append[2] << 16; + block3[0] = append[2] >> 16 | append[3] << 16; + block3[1] = append[3] >> 16 | 0x80u << 16; + break; + + case 39: + block2[1] = block2[1] | append[0] << 24; + block2[2] = append[0] >> 8 | append[1] << 24; + block2[3] = append[1] >> 8 | append[2] << 24; + block3[0] = append[2] >> 8 | append[3] << 24; + block3[1] = append[3] >> 8 | 0x80u << 24; + break; + + case 40: + block2[2] = append[0]; + block2[3] = append[1]; + block3[0] = append[2]; + block3[1] = append[3]; + block3[2] = 0x80; + break; + + case 41: + block2[2] = block2[2] | append[0] << 8; + block2[3] = append[0] >> 24 | append[1] << 8; + block3[0] = append[1] >> 24 | append[2] << 8; + block3[1] = append[2] >> 24 | append[3] << 8; + block3[2] = append[3] >> 24 | 0x80u << 8; + break; + + case 42: + block2[2] = block2[2] | append[0] << 16; + block2[3] = append[0] >> 16 | append[1] << 16; + block3[0] = append[1] >> 16 | append[2] << 16; + block3[1] = append[2] >> 16 | append[3] << 16; + block3[2] = append[3] >> 16 | 0x80u << 16; + break; + + case 43: + block2[2] = block2[2] | append[0] << 24; + block2[3] = append[0] >> 8 | append[1] << 24; + block3[0] = append[1] >> 8 | append[2] << 24; + block3[1] = append[2] >> 8 | append[3] << 24; + block3[2] = append[3] >> 8 | 0x80u << 24; + break; + + case 44: + block2[3] = append[0]; + block3[0] = append[1]; + block3[1] = append[2]; + block3[2] = append[3]; + block3[3] = 0x80; + break; + + case 45: + block2[3] = block2[3] | append[0] << 8; + block3[0] = append[0] >> 24 | append[1] << 8; + block3[1] = append[1] >> 24 | append[2] << 8; + block3[2] = append[2] >> 24 | append[3] << 8; + block3[3] = append[3] >> 24 | 0x80u << 8; + break; + + case 46: + block2[3] = block2[3] | append[0] << 16; + block3[0] = append[0] >> 16 | append[1] << 16; + block3[1] = append[1] >> 16 | append[2] << 16; + block3[2] = append[2] >> 16 | append[3] << 16; + block3[3] = append[3] >> 16 | 0x80u << 16; + break; + + case 47: + block2[3] = block2[3] | append[0] << 24; + block3[0] = append[0] >> 8 | append[1] << 24; + block3[1] = append[1] >> 8 | append[2] << 24; + block3[2] = append[2] >> 8 | append[3] << 24; + block3[3] = append[3] >> 8 | 0x80u << 24; + break; + + case 48: + block3[0] = append[0]; + block3[1] = append[1]; + block3[2] = append[2]; + block3[3] = append[3]; + break; + + case 49: + block3[0] = block3[0] | append[0] << 8; + block3[1] = append[0] >> 24 | append[1] << 8; + block3[2] = append[1] >> 24 | append[2] << 8; + block3[3] = append[2] >> 24 | append[3] << 8; + break; + + case 50: + block3[0] = block3[0] | append[0] << 16; + block3[1] = append[0] >> 16 | append[1] << 16; + block3[2] = append[1] >> 16 | append[2] << 16; + block3[3] = append[2] >> 16 | append[3] << 16; + break; + + case 51: + block3[0] = block3[0] | append[0] << 24; + block3[1] = append[0] >> 8 | append[1] << 24; + block3[2] = append[1] >> 8 | append[2] << 24; + block3[3] = append[2] >> 8 | append[3] << 24; + break; + + case 52: + block3[1] = append[0]; + block3[2] = append[1]; + block3[3] = append[2]; + break; + + case 53: + block3[1] = block3[1] | append[0] << 8; + block3[2] = append[0] >> 24 | append[1] << 8; + block3[3] = append[1] >> 24 | append[2] << 8; + break; + + case 54: + block3[1] = block3[1] | append[0] << 16; + block3[2] = append[0] >> 16 | append[1] << 16; + block3[3] = append[1] >> 16 | append[2] << 16; + break; + + case 55: + block3[1] = block3[1] | append[0] << 24; + block3[2] = append[0] >> 8 | append[1] << 24; + block3[3] = append[1] >> 8 | append[2] << 24; + break; + + case 56: + block3[2] = append[0]; + block3[3] = append[1]; + break; + } +} + +static void memcat8 (u32x block0[4], u32x block1[4], u32x block2[4], u32x block3[4], const u32 block_len, const u32 append[2]) +{ + switch (block_len) + { + case 0: + block0[0] = append[0]; + block0[1] = append[1]; + break; + + case 1: + block0[0] = block0[0] | append[0] << 8; + block0[1] = append[0] >> 24 | append[1] << 8; + block0[2] = append[1] >> 24; + break; + + case 2: + block0[0] = block0[0] | append[0] << 16; + block0[1] = append[0] >> 16 | append[1] << 16; + block0[2] = append[1] >> 16; + break; + + case 3: + block0[0] = block0[0] | append[0] << 24; + block0[1] = append[0] >> 8 | append[1] << 24; + block0[2] = append[1] >> 8; + break; + + case 4: + block0[1] = append[0]; + block0[2] = append[1]; + break; + + case 5: + block0[1] = block0[1] | append[0] << 8; + block0[2] = append[0] >> 24 | append[1] << 8; + block0[3] = append[1] >> 24; + break; + + case 6: + block0[1] = block0[1] | append[0] << 16; + block0[2] = append[0] >> 16 | append[1] << 16; + block0[3] = append[1] >> 16; + break; + + case 7: + block0[1] = block0[1] | append[0] << 24; + block0[2] = append[0] >> 8 | append[1] << 24; + block0[3] = append[1] >> 8; + break; + + case 8: + block0[2] = append[0]; + block0[3] = append[1]; + break; + + case 9: + block0[2] = block0[2] | append[0] << 8; + block0[3] = append[0] >> 24 | append[1] << 8; + block1[0] = append[1] >> 24; + break; + + case 10: + block0[2] = block0[2] | append[0] << 16; + block0[3] = append[0] >> 16 | append[1] << 16; + block1[0] = append[1] >> 16; + break; + + case 11: + block0[2] = block0[2] | append[0] << 24; + block0[3] = append[0] >> 8 | append[1] << 24; + block1[0] = append[1] >> 8; + break; + + case 12: + block0[3] = append[0]; + block1[0] = append[1]; + break; + + case 13: + block0[3] = block0[3] | append[0] << 8; + block1[0] = append[0] >> 24 | append[1] << 8; + block1[1] = append[1] >> 24; + break; + + case 14: + block0[3] = block0[3] | append[0] << 16; + block1[0] = append[0] >> 16 | append[1] << 16; + block1[1] = append[1] >> 16; + break; + + case 15: + block0[3] = block0[3] | append[0] << 24; + block1[0] = append[0] >> 8 | append[1] << 24; + block1[1] = append[1] >> 8; + break; + + case 16: + block1[0] = append[0]; + block1[1] = append[1]; + break; + + case 17: + block1[0] = block1[0] | append[0] << 8; + block1[1] = append[0] >> 24 | append[1] << 8; + block1[2] = append[1] >> 24; + break; + + case 18: + block1[0] = block1[0] | append[0] << 16; + block1[1] = append[0] >> 16 | append[1] << 16; + block1[2] = append[1] >> 16; + break; + + case 19: + block1[0] = block1[0] | append[0] << 24; + block1[1] = append[0] >> 8 | append[1] << 24; + block1[2] = append[1] >> 8; + break; + + case 20: + block1[1] = append[0]; + block1[2] = append[1]; + break; + + case 21: + block1[1] = block1[1] | append[0] << 8; + block1[2] = append[0] >> 24 | append[1] << 8; + block1[3] = append[1] >> 24; + break; + + case 22: + block1[1] = block1[1] | append[0] << 16; + block1[2] = append[0] >> 16 | append[1] << 16; + block1[3] = append[1] >> 16; + break; + + case 23: + block1[1] = block1[1] | append[0] << 24; + block1[2] = append[0] >> 8 | append[1] << 24; + block1[3] = append[1] >> 8; + break; + + case 24: + block1[2] = append[0]; + block1[3] = append[1]; + break; + + case 25: + block1[2] = block1[2] | append[0] << 8; + block1[3] = append[0] >> 24 | append[1] << 8; + block2[0] = append[1] >> 24; + break; + + case 26: + block1[2] = block1[2] | append[0] << 16; + block1[3] = append[0] >> 16 | append[1] << 16; + block2[0] = append[1] >> 16; + break; + + case 27: + block1[2] = block1[2] | append[0] << 24; + block1[3] = append[0] >> 8 | append[1] << 24; + block2[0] = append[1] >> 8; + break; + + case 28: + block1[3] = append[0]; + block2[0] = append[1]; + break; + + case 29: + block1[3] = block1[3] | append[0] << 8; + block2[0] = append[0] >> 24 | append[1] << 8; + block2[1] = append[1] >> 24; + break; + + case 30: + block1[3] = block1[3] | append[0] << 16; + block2[0] = append[0] >> 16 | append[1] << 16; + block2[1] = append[1] >> 16; + break; + + case 31: + block1[3] = block1[3] | append[0] << 24; + block2[0] = append[0] >> 8 | append[1] << 24; + block2[1] = append[1] >> 8; + break; + + case 32: + block2[0] = append[0]; + block2[1] = append[1]; + break; + + case 33: + block2[0] = block2[0] | append[0] << 8; + block2[1] = append[0] >> 24 | append[1] << 8; + block2[2] = append[1] >> 24; + break; + + case 34: + block2[0] = block2[0] | append[0] << 16; + block2[1] = append[0] >> 16 | append[1] << 16; + block2[2] = append[1] >> 16; + break; + + case 35: + block2[0] = block2[0] | append[0] << 24; + block2[1] = append[0] >> 8 | append[1] << 24; + block2[2] = append[1] >> 8; + break; + + case 36: + block2[1] = append[0]; + block2[2] = append[1]; + break; + + case 37: + block2[1] = block2[1] | append[0] << 8; + block2[2] = append[0] >> 24 | append[1] << 8; + block2[3] = append[1] >> 24; + break; + + case 38: + block2[1] = block2[1] | append[0] << 16; + block2[2] = append[0] >> 16 | append[1] << 16; + block2[3] = append[1] >> 16; + break; + + case 39: + block2[1] = block2[1] | append[0] << 24; + block2[2] = append[0] >> 8 | append[1] << 24; + block2[3] = append[1] >> 8; + break; + + case 40: + block2[2] = append[0]; + block2[3] = append[1]; + break; + + case 41: + block2[2] = block2[2] | append[0] << 8; + block2[3] = append[0] >> 24 | append[1] << 8; + block3[0] = append[1] >> 24; + break; + + case 42: + block2[2] = block2[2] | append[0] << 16; + block2[3] = append[0] >> 16 | append[1] << 16; + block3[0] = append[1] >> 16; + break; + + case 43: + block2[2] = block2[2] | append[0] << 24; + block2[3] = append[0] >> 8 | append[1] << 24; + block3[0] = append[1] >> 8; + break; + + case 44: + block2[3] = append[0]; + block3[0] = append[1]; + break; + + case 45: + block2[3] = block2[3] | append[0] << 8; + block3[0] = append[0] >> 24 | append[1] << 8; + block3[1] = append[1] >> 24; + break; + + case 46: + block2[3] = block2[3] | append[0] << 16; + block3[0] = append[0] >> 16 | append[1] << 16; + block3[1] = append[1] >> 16; + break; + + case 47: + block2[3] = block2[3] | append[0] << 24; + block3[0] = append[0] >> 8 | append[1] << 24; + block3[1] = append[1] >> 8; + break; + + case 48: + block3[0] = append[0]; + block3[1] = append[1]; + break; + + case 49: + block3[0] = block3[0] | append[0] << 8; + block3[1] = append[0] >> 24 | append[1] << 8; + block3[2] = append[1] >> 24; + break; + + case 50: + block3[0] = block3[0] | append[0] << 16; + block3[1] = append[0] >> 16 | append[1] << 16; + block3[2] = append[1] >> 16; + break; + + case 51: + block3[0] = block3[0] | append[0] << 24; + block3[1] = append[0] >> 8 | append[1] << 24; + block3[2] = append[1] >> 8; + break; + + case 52: + block3[1] = append[0]; + block3[2] = append[1]; + break; + + case 53: + block3[1] = block3[1] | append[0] << 8; + block3[2] = append[0] >> 24 | append[1] << 8; + block3[3] = append[1] >> 24; + break; + + case 54: + block3[1] = block3[1] | append[0] << 16; + block3[2] = append[0] >> 16 | append[1] << 16; + block3[3] = append[1] >> 16; + break; + + case 55: + block3[1] = block3[1] | append[0] << 24; + block3[2] = append[0] >> 8 | append[1] << 24; + block3[3] = append[1] >> 8; + break; + + case 56: + block3[2] = append[0]; + block3[3] = append[1]; + break; + } +} + +static void append_1st (u32x block0[4], u32x block1[4], u32x block2[4], u32x block3[4], const u32 block_len, const u32x append) +{ + switch (block_len) + { + case 0: + block0[0] = append; + break; + + case 1: + block0[0] = block0[0] | append << 8; + break; + + case 2: + block0[0] = block0[0] | append << 16; + break; + + case 3: + block0[0] = block0[0] | append << 24; + break; + + case 4: + block0[1] = append; + break; + + case 5: + block0[1] = block0[1] | append << 8; + break; + + case 6: + block0[1] = block0[1] | append << 16; + break; + + case 7: + block0[1] = block0[1] | append << 24; + break; + + case 8: + block0[2] = append; + break; + + case 9: + block0[2] = block0[2] | append << 8; + break; + + case 10: + block0[2] = block0[2] | append << 16; + break; + + case 11: + block0[2] = block0[2] | append << 24; + break; + + case 12: + block0[3] = append; + break; + + case 13: + block0[3] = block0[3] | append << 8; + break; + + case 14: + block0[3] = block0[3] | append << 16; + break; + + case 15: + block0[3] = block0[3] | append << 24; + break; + + case 16: + block1[0] = append; + break; + + case 17: + block1[0] = block1[0] | append << 8; + break; + + case 18: + block1[0] = block1[0] | append << 16; + break; + + case 19: + block1[0] = block1[0] | append << 24; + break; + + case 20: + block1[1] = append; + break; + + case 21: + block1[1] = block1[1] | append << 8; + break; + + case 22: + block1[1] = block1[1] | append << 16; + break; + + case 23: + block1[1] = block1[1] | append << 24; + break; + + case 24: + block1[2] = append; + break; + + case 25: + block1[2] = block1[2] | append << 8; + break; + + case 26: + block1[2] = block1[2] | append << 16; + break; + + case 27: + block1[2] = block1[2] | append << 24; + break; + + case 28: + block1[3] = append; + break; + + case 29: + block1[3] = block1[3] | append << 8; + break; + + case 30: + block1[3] = block1[3] | append << 16; + break; + + case 31: + block1[3] = block1[3] | append << 24; + break; + + case 32: + block2[0] = append; + break; + + case 33: + block2[0] = block2[0] | append << 8; + break; + + case 34: + block2[0] = block2[0] | append << 16; + break; + + case 35: + block2[0] = block2[0] | append << 24; + break; + + case 36: + block2[1] = append; + break; + + case 37: + block2[1] = block2[1] | append << 8; + break; + + case 38: + block2[1] = block2[1] | append << 16; + break; + + case 39: + block2[1] = block2[1] | append << 24; + break; + + case 40: + block2[2] = append; + break; + + case 41: + block2[2] = block2[2] | append << 8; + break; + + case 42: + block2[2] = block2[2] | append << 16; + break; + + case 43: + block2[2] = block2[2] | append << 24; + break; + + case 44: + block2[3] = append; + break; + + case 45: + block2[3] = block2[3] | append << 8; + break; + + case 46: + block2[3] = block2[3] | append << 16; + break; + + case 47: + block2[3] = block2[3] | append << 24; + break; + + case 48: + block3[0] = append; + break; + + case 49: + block3[0] = block3[0] | append << 8; + break; + + case 50: + block3[0] = block3[0] | append << 16; + break; + + case 51: + block3[0] = block3[0] | append << 24; + break; + + case 52: + block3[1] = append; + break; + + case 53: + block3[1] = block3[1] | append << 8; + break; + + case 54: + block3[1] = block3[1] | append << 16; + break; + + case 55: + block3[1] = block3[1] | append << 24; + break; + + case 56: + block3[2] = append; + break; + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m06300_init (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global md5crypt_tmp_t *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[0]; + w0[1] = pws[gid].i[1]; + w0[2] = pws[gid].i[2]; + w0[3] = pws[gid].i[3]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * salt + */ + + u32 salt_buf[2]; + + salt_buf[0] = salt_bufs[salt_pos].salt_buf[0]; + salt_buf[1] = salt_bufs[salt_pos].salt_buf[1]; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + /** + * init + */ + + //memcat16 (block0, block1, block2, block3, block_len, w0); + //block_len += pw_len; + + u32 block_len = pw_len; + + u32x block0[4]; + + block0[0] = w0[0]; + block0[1] = w0[1]; + block0[2] = w0[2]; + block0[3] = w0[3]; + + u32x block1[4]; + + block1[0] = 0; + block1[1] = 0; + block1[2] = 0; + block1[3] = 0; + + u32x block2[4]; + + block2[0] = 0; + block2[1] = 0; + block2[2] = 0; + block2[3] = 0; + + u32x block3[4]; + + block3[0] = 0; + block3[1] = 0; + block3[2] = 0; + block3[3] = 0; + + memcat8 (block0, block1, block2, block3, block_len, salt_buf); + + block_len += salt_len; + + memcat16 (block0, block1, block2, block3, block_len, w0); + + block_len += pw_len; + + append_0x80_4 (block0, block1, block2, block3, block_len); + + block3[2] = block_len * 8; + + u32x digest[4]; + + digest[0] = MD5M_A; + digest[1] = MD5M_B; + digest[2] = MD5M_C; + digest[3] = MD5M_D; + + md5_transform (block0, block1, block2, block3, digest); + + /* The password first, since that is what is most unknown */ + /* Then the raw salt */ + /* Then just as many characters of the MD5(pw,salt,pw) */ + + //memcat16 (block0, block1, block2, block3, block_len, w); + //block_len += pw_len; + + block_len = pw_len; + + block0[0] = w0[0]; + block0[1] = w0[1]; + block0[2] = w0[2]; + block0[3] = w0[3]; + + block1[0] = 0; + block1[1] = 0; + block1[2] = 0; + block1[3] = 0; + + block2[0] = 0; + block2[1] = 0; + block2[2] = 0; + block2[3] = 0; + + block3[0] = 0; + block3[1] = 0; + block3[2] = 0; + block3[3] = 0; + + memcat8 (block0, block1, block2, block3, block_len, salt_buf); + + block_len += salt_len; + + truncate_block (digest, pw_len); + + memcat16 (block0, block1, block2, block3, block_len, digest); + + block_len += pw_len; + + /* Then something really weird... */ + + u32x append = block0[0] & 0xFF; + + for (u32 j = pw_len; j; j >>= 1) + { + if ((j & 1) == 0) + { + append_1st (block0, block1, block2, block3, block_len, append); + } + + block_len++; + } + + append_0x80_4 (block0, block1, block2, block3, block_len); + + block3[2] = block_len * 8; + + digest[0] = MD5M_A; + digest[1] = MD5M_B; + digest[2] = MD5M_C; + digest[3] = MD5M_D; + + md5_transform (block0, block1, block2, block3, digest); + + tmps[gid].digest_buf[0] = digest[0]; + tmps[gid].digest_buf[1] = digest[1]; + tmps[gid].digest_buf[2] = digest[2]; + tmps[gid].digest_buf[3] = digest[3]; +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m06300_loop (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global md5crypt_tmp_t *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[0]; + w0[1] = pws[gid].i[1]; + w0[2] = pws[gid].i[2]; + w0[3] = pws[gid].i[3]; + + const u32 pw_len = pws[gid].pw_len; + + u32x w0_x80[4]; + + w0_x80[0] = w0[0]; + w0_x80[1] = w0[1]; + w0_x80[2] = w0[2]; + w0_x80[3] = w0[3]; + + append_0x80_1 (w0_x80, pw_len); + + /** + * salt + */ + + u32 salt_buf[2]; + + salt_buf[0] = salt_bufs[salt_pos].salt_buf[0]; + salt_buf[1] = salt_bufs[salt_pos].salt_buf[1]; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + /** + * digest + */ + + u32x digest[4]; + + digest[0] = tmps[gid].digest_buf[0]; + digest[1] = tmps[gid].digest_buf[1]; + digest[2] = tmps[gid].digest_buf[2]; + digest[3] = tmps[gid].digest_buf[3]; + + /** + * loop + */ + + /* and now, just to make sure things don't run too fast */ + + u32 block_len; + + u32x block0[4]; + + block0[0] = 0; + block0[1] = 0; + block0[2] = 0; + block0[3] = 0; + + u32x block1[4]; + + block1[0] = 0; + block1[1] = 0; + block1[2] = 0; + block1[3] = 0; + + u32x block2[4]; + + block2[0] = 0; + block2[1] = 0; + block2[2] = 0; + block2[3] = 0; + + u32x block3[4]; + + block3[0] = 0; + block3[1] = 0; + block3[2] = 0; + block3[3] = 0; + + for (u32 i = 0, j = loop_pos; i < loop_cnt; i++, j++) + { + block1[0] = 0; + block1[1] = 0; + block1[2] = 0; + block1[3] = 0; + block2[0] = 0; + block2[1] = 0; + block2[2] = 0; + block2[3] = 0; + block3[0] = 0; + block3[1] = 0; + + const u32 j1 = (j & 1) ? 1 : 0; + const u32 j3 = (j % 3) ? 1 : 0; + const u32 j7 = (j % 7) ? 1 : 0; + + if (j1) + { + block0[0] = w0[0]; + block0[1] = w0[1]; + block0[2] = w0[2]; + block0[3] = w0[3]; + + block_len = pw_len; + + if (j3) + { + memcat8 (block0, block1, block2, block3, block_len, salt_buf); + + block_len += salt_len; + } + + if (j7) + { + memcat16 (block0, block1, block2, block3, block_len, w0); + + block_len += pw_len; + } + + memcat16_x80 (block0, block1, block2, block3, block_len, digest); + + block_len += 16; + } + else + { + block0[0] = digest[0]; + block0[1] = digest[1]; + block0[2] = digest[2]; + block0[3] = digest[3]; + + block_len = 16; + + if (j3 && j7) + { + block1[0] = salt_buf[0]; + block1[1] = salt_buf[1]; + + block_len += salt_len; + + memcat16 (block0, block1, block2, block3, block_len, w0); + + block_len += pw_len; + } + else if (j3) + { + block1[0] = salt_buf[0]; + block1[1] = salt_buf[1]; + + block_len += salt_len; + } + else if (j7) + { + block1[0] = w0[0]; + block1[1] = w0[1]; + block1[2] = w0[2]; + block1[3] = w0[3]; + + block_len += pw_len; + } + + memcat16 (block0, block1, block2, block3, block_len, w0_x80); + + block_len += pw_len; + } + + block3[2] = block_len * 8; + + digest[0] = MD5M_A; + digest[1] = MD5M_B; + digest[2] = MD5M_C; + digest[3] = MD5M_D; + + md5_transform (block0, block1, block2, block3, digest); + } + + tmps[gid].digest_buf[0] = digest[0]; + tmps[gid].digest_buf[1] = digest[1]; + tmps[gid].digest_buf[2] = digest[2]; + tmps[gid].digest_buf[3] = digest[3]; +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m06300_comp (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global md5crypt_tmp_t *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + const u32 lid = get_local_id (0); + + /** + * digest + */ + + const u32x r0 = tmps[gid].digest_buf[DGST_R0]; + const u32x r1 = tmps[gid].digest_buf[DGST_R1]; + const u32x r2 = tmps[gid].digest_buf[DGST_R2]; + const u32x r3 = tmps[gid].digest_buf[DGST_R3]; + + #define il_pos 0 + + #include VECT_COMPARE_M +} diff --git a/amd/m06400.cl b/amd/m06400.cl new file mode 100644 index 0000000000..7c1d2afc19 --- /dev/null +++ b/amd/m06400.cl @@ -0,0 +1,566 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _SHA256_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW4 +#define VECT_SIZE1 +#endif + +#ifdef VLIW5 +#define VECT_SIZE1 +#endif + +#define DGST_R0 0 +#define DGST_R1 1 +#define DGST_R2 2 +#define DGST_R3 3 + +#include "include/kernel_functions.c" +#include "types_amd.c" +#include "common_amd.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +__constant u32 k_sha256[64] = +{ + SHA256C00, SHA256C01, SHA256C02, SHA256C03, + SHA256C04, SHA256C05, SHA256C06, SHA256C07, + SHA256C08, SHA256C09, SHA256C0a, SHA256C0b, + SHA256C0c, SHA256C0d, SHA256C0e, SHA256C0f, + SHA256C10, SHA256C11, SHA256C12, SHA256C13, + SHA256C14, SHA256C15, SHA256C16, SHA256C17, + SHA256C18, SHA256C19, SHA256C1a, SHA256C1b, + SHA256C1c, SHA256C1d, SHA256C1e, SHA256C1f, + SHA256C20, SHA256C21, SHA256C22, SHA256C23, + SHA256C24, SHA256C25, SHA256C26, SHA256C27, + SHA256C28, SHA256C29, SHA256C2a, SHA256C2b, + SHA256C2c, SHA256C2d, SHA256C2e, SHA256C2f, + SHA256C30, SHA256C31, SHA256C32, SHA256C33, + SHA256C34, SHA256C35, SHA256C36, SHA256C37, + SHA256C38, SHA256C39, SHA256C3a, SHA256C3b, + SHA256C3c, SHA256C3d, SHA256C3e, SHA256C3f, +}; + +static void sha256_transform (const u32x w0[4], const u32x w1[4], const u32x w2[4], const u32x w3[4], u32x digest[8]) +{ + u32x a = digest[0]; + u32x b = digest[1]; + u32x c = digest[2]; + u32x d = digest[3]; + u32x e = digest[4]; + u32x f = digest[5]; + u32x g = digest[6]; + u32x h = digest[7]; + + u32x w0_t = w0[0]; + u32x w1_t = w0[1]; + u32x w2_t = w0[2]; + u32x w3_t = w0[3]; + u32x w4_t = w1[0]; + u32x w5_t = w1[1]; + u32x w6_t = w1[2]; + u32x w7_t = w1[3]; + u32x w8_t = w2[0]; + u32x w9_t = w2[1]; + u32x wa_t = w2[2]; + u32x wb_t = w2[3]; + u32x wc_t = w3[0]; + u32x wd_t = w3[1]; + u32x we_t = w3[2]; + u32x wf_t = w3[3]; + + #define ROUND_EXPAND() \ + { \ + w0_t = SHA256_EXPAND (we_t, w9_t, w1_t, w0_t); \ + w1_t = SHA256_EXPAND (wf_t, wa_t, w2_t, w1_t); \ + w2_t = SHA256_EXPAND (w0_t, wb_t, w3_t, w2_t); \ + w3_t = SHA256_EXPAND (w1_t, wc_t, w4_t, w3_t); \ + w4_t = SHA256_EXPAND (w2_t, wd_t, w5_t, w4_t); \ + w5_t = SHA256_EXPAND (w3_t, we_t, w6_t, w5_t); \ + w6_t = SHA256_EXPAND (w4_t, wf_t, w7_t, w6_t); \ + w7_t = SHA256_EXPAND (w5_t, w0_t, w8_t, w7_t); \ + w8_t = SHA256_EXPAND (w6_t, w1_t, w9_t, w8_t); \ + w9_t = SHA256_EXPAND (w7_t, w2_t, wa_t, w9_t); \ + wa_t = SHA256_EXPAND (w8_t, w3_t, wb_t, wa_t); \ + wb_t = SHA256_EXPAND (w9_t, w4_t, wc_t, wb_t); \ + wc_t = SHA256_EXPAND (wa_t, w5_t, wd_t, wc_t); \ + wd_t = SHA256_EXPAND (wb_t, w6_t, we_t, wd_t); \ + we_t = SHA256_EXPAND (wc_t, w7_t, wf_t, we_t); \ + wf_t = SHA256_EXPAND (wd_t, w8_t, w0_t, wf_t); \ + } + + #define ROUND_STEP(i) \ + { \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, k_sha256[i + 0]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, k_sha256[i + 1]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, k_sha256[i + 2]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, k_sha256[i + 3]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, k_sha256[i + 4]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, k_sha256[i + 5]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, k_sha256[i + 6]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, k_sha256[i + 7]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, k_sha256[i + 8]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, k_sha256[i + 9]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, k_sha256[i + 10]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, k_sha256[i + 11]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, k_sha256[i + 12]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, k_sha256[i + 13]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, k_sha256[i + 14]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, k_sha256[i + 15]); \ + } + + ROUND_STEP (0); + + #pragma unroll + for (int i = 16; i < 64; i += 16) + { + ROUND_EXPAND (); ROUND_STEP (i); + } + + digest[0] += a; + digest[1] += b; + digest[2] += c; + digest[3] += d; + digest[4] += e; + digest[5] += f; + digest[6] += g; + digest[7] += h; +} + +static void hmac_sha256_pad (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], u32x ipad[8], u32x opad[8]) +{ + w0[0] = w0[0] ^ 0x36363636; + w0[1] = w0[1] ^ 0x36363636; + w0[2] = w0[2] ^ 0x36363636; + w0[3] = w0[3] ^ 0x36363636; + w1[0] = w1[0] ^ 0x36363636; + w1[1] = w1[1] ^ 0x36363636; + w1[2] = w1[2] ^ 0x36363636; + w1[3] = w1[3] ^ 0x36363636; + w2[0] = w2[0] ^ 0x36363636; + w2[1] = w2[1] ^ 0x36363636; + w2[2] = w2[2] ^ 0x36363636; + w2[3] = w2[3] ^ 0x36363636; + w3[0] = w3[0] ^ 0x36363636; + w3[1] = w3[1] ^ 0x36363636; + w3[2] = w3[2] ^ 0x36363636; + w3[3] = w3[3] ^ 0x36363636; + + ipad[0] = SHA256M_A; + ipad[1] = SHA256M_B; + ipad[2] = SHA256M_C; + ipad[3] = SHA256M_D; + ipad[4] = SHA256M_E; + ipad[5] = SHA256M_F; + ipad[6] = SHA256M_G; + ipad[7] = SHA256M_H; + + sha256_transform (w0, w1, w2, w3, ipad); + + w0[0] = w0[0] ^ 0x6a6a6a6a; + w0[1] = w0[1] ^ 0x6a6a6a6a; + w0[2] = w0[2] ^ 0x6a6a6a6a; + w0[3] = w0[3] ^ 0x6a6a6a6a; + w1[0] = w1[0] ^ 0x6a6a6a6a; + w1[1] = w1[1] ^ 0x6a6a6a6a; + w1[2] = w1[2] ^ 0x6a6a6a6a; + w1[3] = w1[3] ^ 0x6a6a6a6a; + w2[0] = w2[0] ^ 0x6a6a6a6a; + w2[1] = w2[1] ^ 0x6a6a6a6a; + w2[2] = w2[2] ^ 0x6a6a6a6a; + w2[3] = w2[3] ^ 0x6a6a6a6a; + w3[0] = w3[0] ^ 0x6a6a6a6a; + w3[1] = w3[1] ^ 0x6a6a6a6a; + w3[2] = w3[2] ^ 0x6a6a6a6a; + w3[3] = w3[3] ^ 0x6a6a6a6a; + + opad[0] = SHA256M_A; + opad[1] = SHA256M_B; + opad[2] = SHA256M_C; + opad[3] = SHA256M_D; + opad[4] = SHA256M_E; + opad[5] = SHA256M_F; + opad[6] = SHA256M_G; + opad[7] = SHA256M_H; + + sha256_transform (w0, w1, w2, w3, opad); +} + +static void hmac_sha256_run (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], u32x ipad[8], u32x opad[8], u32x digest[8]) +{ + digest[0] = ipad[0]; + digest[1] = ipad[1]; + digest[2] = ipad[2]; + digest[3] = ipad[3]; + digest[4] = ipad[4]; + digest[5] = ipad[5]; + digest[6] = ipad[6]; + digest[7] = ipad[7]; + + sha256_transform (w0, w1, w2, w3, digest); + + w0[0] = digest[0]; + w0[1] = digest[1]; + w0[2] = digest[2]; + w0[3] = digest[3]; + w1[0] = digest[4]; + w1[1] = digest[5]; + w1[2] = digest[6]; + w1[3] = digest[7]; + w2[0] = 0x80000000; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = (64 + 32) * 8; + + digest[0] = opad[0]; + digest[1] = opad[1]; + digest[2] = opad[2]; + digest[3] = opad[3]; + digest[4] = opad[4]; + digest[5] = opad[5]; + digest[6] = opad[6]; + digest[7] = opad[7]; + + sha256_transform (w0, w1, w2, w3, digest); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m06400_init (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global sha256aix_tmp_t *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global wpa_t *wpa_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = pws[gid].i[ 8]; + w2[1] = pws[gid].i[ 9]; + w2[2] = pws[gid].i[10]; + w2[3] = pws[gid].i[11]; + + u32x w3[4]; + + w3[0] = pws[gid].i[12]; + w3[1] = pws[gid].i[13]; + w3[2] = pws[gid].i[14]; + w3[3] = pws[gid].i[15]; + + /** + * salt + */ + + u32 salt_len = salt_bufs[salt_pos].salt_len; + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[ 1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[ 2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[ 3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[ 4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[ 5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[ 6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[ 7]; + + u32 salt_buf2[4]; + + salt_buf2[0] = salt_bufs[salt_pos].salt_buf[ 8]; + salt_buf2[1] = salt_bufs[salt_pos].salt_buf[ 9]; + salt_buf2[2] = salt_bufs[salt_pos].salt_buf[10]; + salt_buf2[3] = salt_bufs[salt_pos].salt_buf[11]; + + u32 salt_buf3[4]; + + salt_buf3[0] = 0; + salt_buf3[1] = 0; + salt_buf3[2] = 0; + salt_buf3[3] = 0; + + append_0x01_4 (salt_buf0, salt_buf1, salt_buf2, salt_buf3, salt_len + 3); + + append_0x80_4 (salt_buf0, salt_buf1, salt_buf2, salt_buf3, salt_len + 4); + + /** + * pads + */ + + w0[0] = swap_workaround (w0[0]); + w0[1] = swap_workaround (w0[1]); + w0[2] = swap_workaround (w0[2]); + w0[3] = swap_workaround (w0[3]); + w1[0] = swap_workaround (w1[0]); + w1[1] = swap_workaround (w1[1]); + w1[2] = swap_workaround (w1[2]); + w1[3] = swap_workaround (w1[3]); + w2[0] = swap_workaround (w2[0]); + w2[1] = swap_workaround (w2[1]); + w2[2] = swap_workaround (w2[2]); + w2[3] = swap_workaround (w2[3]); + w3[0] = swap_workaround (w3[0]); + w3[1] = swap_workaround (w3[1]); + w3[2] = swap_workaround (w3[2]); + w3[3] = swap_workaround (w3[3]); + + u32x ipad[8]; + u32x opad[8]; + + hmac_sha256_pad (w0, w1, w2, w3, ipad, opad); + + tmps[gid].ipad[0] = ipad[0]; + tmps[gid].ipad[1] = ipad[1]; + tmps[gid].ipad[2] = ipad[2]; + tmps[gid].ipad[3] = ipad[3]; + tmps[gid].ipad[4] = ipad[4]; + tmps[gid].ipad[5] = ipad[5]; + tmps[gid].ipad[6] = ipad[6]; + tmps[gid].ipad[7] = ipad[7]; + + tmps[gid].opad[0] = opad[0]; + tmps[gid].opad[1] = opad[1]; + tmps[gid].opad[2] = opad[2]; + tmps[gid].opad[3] = opad[3]; + tmps[gid].opad[4] = opad[4]; + tmps[gid].opad[5] = opad[5]; + tmps[gid].opad[6] = opad[6]; + tmps[gid].opad[7] = opad[7]; + + w0[0] = salt_buf0[0]; + w0[1] = salt_buf0[1]; + w0[2] = salt_buf0[2]; + w0[3] = salt_buf0[3]; + w1[0] = salt_buf1[0]; + w1[1] = salt_buf1[1]; + w1[2] = salt_buf1[2]; + w1[3] = salt_buf1[3]; + w2[0] = salt_buf2[0]; + w2[1] = salt_buf2[1]; + w2[2] = salt_buf2[2]; + w2[3] = salt_buf2[3]; + w3[0] = salt_buf3[0]; + w3[1] = salt_buf3[1]; + w3[2] = salt_buf3[2]; + // w3[3] = salt_buf3[3]; + + w0[0] = swap_workaround (w0[0]); + w0[1] = swap_workaround (w0[1]); + w0[2] = swap_workaround (w0[2]); + w0[3] = swap_workaround (w0[3]); + w1[0] = swap_workaround (w1[0]); + w1[1] = swap_workaround (w1[1]); + w1[2] = swap_workaround (w1[2]); + w1[3] = swap_workaround (w1[3]); + w2[0] = swap_workaround (w2[0]); + w2[1] = swap_workaround (w2[1]); + w2[2] = swap_workaround (w2[2]); + w2[3] = swap_workaround (w2[3]); + w3[0] = swap_workaround (w3[0]); + w3[1] = swap_workaround (w3[1]); + w3[2] = swap_workaround (w3[2]); + w3[3] = (64 + salt_len + 4) * 8; + + u32x dgst[8]; + + hmac_sha256_run (w0, w1, w2, w3, ipad, opad, dgst); + + tmps[gid].dgst[0] = dgst[0]; + tmps[gid].dgst[1] = dgst[1]; + tmps[gid].dgst[2] = dgst[2]; + tmps[gid].dgst[3] = dgst[3]; + tmps[gid].dgst[4] = dgst[4]; + tmps[gid].dgst[5] = dgst[5]; + tmps[gid].dgst[6] = dgst[6]; + tmps[gid].dgst[7] = dgst[7]; + + tmps[gid].out[0] = dgst[0]; + tmps[gid].out[1] = dgst[1]; + tmps[gid].out[2] = dgst[2]; + tmps[gid].out[3] = dgst[3]; + tmps[gid].out[4] = dgst[4]; + tmps[gid].out[5] = dgst[5]; + tmps[gid].out[6] = dgst[6]; + tmps[gid].out[7] = dgst[7]; +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m06400_loop (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global sha256aix_tmp_t *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global wpa_t *wpa_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x ipad[8]; + u32x opad[8]; + + ipad[0] = tmps[gid].ipad[0]; + ipad[1] = tmps[gid].ipad[1]; + ipad[2] = tmps[gid].ipad[2]; + ipad[3] = tmps[gid].ipad[3]; + ipad[4] = tmps[gid].ipad[4]; + ipad[5] = tmps[gid].ipad[5]; + ipad[6] = tmps[gid].ipad[6]; + ipad[7] = tmps[gid].ipad[7]; + + opad[0] = tmps[gid].opad[0]; + opad[1] = tmps[gid].opad[1]; + opad[2] = tmps[gid].opad[2]; + opad[3] = tmps[gid].opad[3]; + opad[4] = tmps[gid].opad[4]; + opad[5] = tmps[gid].opad[5]; + opad[6] = tmps[gid].opad[6]; + opad[7] = tmps[gid].opad[7]; + + u32x dgst[8]; + u32x out[8]; + + dgst[0] = tmps[gid].dgst[0]; + dgst[1] = tmps[gid].dgst[1]; + dgst[2] = tmps[gid].dgst[2]; + dgst[3] = tmps[gid].dgst[3]; + dgst[4] = tmps[gid].dgst[4]; + dgst[5] = tmps[gid].dgst[5]; + dgst[6] = tmps[gid].dgst[6]; + dgst[7] = tmps[gid].dgst[7]; + + out[0] = tmps[gid].out[0]; + out[1] = tmps[gid].out[1]; + out[2] = tmps[gid].out[2]; + out[3] = tmps[gid].out[3]; + out[4] = tmps[gid].out[4]; + out[5] = tmps[gid].out[5]; + out[6] = tmps[gid].out[6]; + out[7] = tmps[gid].out[7]; + + for (u32 j = 0; j < loop_cnt; j++) + { + u32x w0[4]; + u32x w1[4]; + u32x w2[4]; + u32x w3[4]; + + w0[0] = dgst[0]; + w0[1] = dgst[1]; + w0[2] = dgst[2]; + w0[3] = dgst[3]; + w1[0] = dgst[4]; + w1[1] = dgst[5]; + w1[2] = dgst[6]; + w1[3] = dgst[7]; + w2[0] = 0x80000000; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = (64 + 32) * 8; + + hmac_sha256_run (w0, w1, w2, w3, ipad, opad, dgst); + + out[0] ^= dgst[0]; + out[1] ^= dgst[1]; + out[2] ^= dgst[2]; + out[3] ^= dgst[3]; + out[4] ^= dgst[4]; + out[5] ^= dgst[5]; + out[6] ^= dgst[6]; + out[7] ^= dgst[7]; + } + + tmps[gid].dgst[0] = dgst[0]; + tmps[gid].dgst[1] = dgst[1]; + tmps[gid].dgst[2] = dgst[2]; + tmps[gid].dgst[3] = dgst[3]; + tmps[gid].dgst[4] = dgst[4]; + tmps[gid].dgst[5] = dgst[5]; + tmps[gid].dgst[6] = dgst[6]; + tmps[gid].dgst[7] = dgst[7]; + + tmps[gid].out[0] = out[0]; + tmps[gid].out[1] = out[1]; + tmps[gid].out[2] = out[2]; + tmps[gid].out[3] = out[3]; + tmps[gid].out[4] = out[4]; + tmps[gid].out[5] = out[5]; + tmps[gid].out[6] = out[6]; + tmps[gid].out[7] = out[7]; +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m06400_comp (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global sha256aix_tmp_t *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global wpa_t *wpa_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + const u32 lid = get_local_id (0); + + /** + * digest + */ + + const u32x r0 = tmps[gid].out[DGST_R0]; + const u32x r1 = tmps[gid].out[DGST_R1]; + const u32x r2 = tmps[gid].out[DGST_R2]; + const u32x r3 = tmps[gid].out[DGST_R3]; + + /* + u32x a = tmps[gid].out[0]; + u32x b = tmps[gid].out[1]; + u32x c = tmps[gid].out[2]; + u32x d = tmps[gid].out[3]; + u32x e = tmps[gid].out[4]; + u32x f = tmps[gid].out[5]; + u32x g = tmps[gid].out[6]; + u32x h = tmps[gid].out[7] & 0xffff03ff; + */ + + #define il_pos 0 + + #include VECT_COMPARE_M +} diff --git a/amd/m06500.cl b/amd/m06500.cl new file mode 100644 index 0000000000..d0dad00321 --- /dev/null +++ b/amd/m06500.cl @@ -0,0 +1,592 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _SHA512_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW4 +#define VECT_SIZE1 +#endif + +#ifdef VLIW5 +#define VECT_SIZE1 +#endif + +#define DGST_R0 0 +#define DGST_R1 1 +#define DGST_R2 2 +#define DGST_R3 3 + +#include "include/kernel_functions.c" +#include "types_amd.c" +#include "common_amd.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +__constant u64 k_sha512[80] = +{ + SHA512C00, SHA512C01, SHA512C02, SHA512C03, + SHA512C04, SHA512C05, SHA512C06, SHA512C07, + SHA512C08, SHA512C09, SHA512C0a, SHA512C0b, + SHA512C0c, SHA512C0d, SHA512C0e, SHA512C0f, + SHA512C10, SHA512C11, SHA512C12, SHA512C13, + SHA512C14, SHA512C15, SHA512C16, SHA512C17, + SHA512C18, SHA512C19, SHA512C1a, SHA512C1b, + SHA512C1c, SHA512C1d, SHA512C1e, SHA512C1f, + SHA512C20, SHA512C21, SHA512C22, SHA512C23, + SHA512C24, SHA512C25, SHA512C26, SHA512C27, + SHA512C28, SHA512C29, SHA512C2a, SHA512C2b, + SHA512C2c, SHA512C2d, SHA512C2e, SHA512C2f, + SHA512C30, SHA512C31, SHA512C32, SHA512C33, + SHA512C34, SHA512C35, SHA512C36, SHA512C37, + SHA512C38, SHA512C39, SHA512C3a, SHA512C3b, + SHA512C3c, SHA512C3d, SHA512C3e, SHA512C3f, + SHA512C40, SHA512C41, SHA512C42, SHA512C43, + SHA512C44, SHA512C45, SHA512C46, SHA512C47, + SHA512C48, SHA512C49, SHA512C4a, SHA512C4b, + SHA512C4c, SHA512C4d, SHA512C4e, SHA512C4f, +}; + +static void sha512_transform (const u64x w0[4], const u64x w1[4], const u64x w2[4], const u64x w3[4], u64x digest[8]) +{ + u64x a = digest[0]; + u64x b = digest[1]; + u64x c = digest[2]; + u64x d = digest[3]; + u64x e = digest[4]; + u64x f = digest[5]; + u64x g = digest[6]; + u64x h = digest[7]; + + u64x w0_t = w0[0]; + u64x w1_t = w0[1]; + u64x w2_t = w0[2]; + u64x w3_t = w0[3]; + u64x w4_t = w1[0]; + u64x w5_t = w1[1]; + u64x w6_t = w1[2]; + u64x w7_t = w1[3]; + u64x w8_t = w2[0]; + u64x w9_t = w2[1]; + u64x wa_t = w2[2]; + u64x wb_t = w2[3]; + u64x wc_t = w3[0]; + u64x wd_t = w3[1]; + u64x we_t = w3[2]; + u64x wf_t = w3[3]; + + #define ROUND_EXPAND() \ + { \ + w0_t = SHA512_EXPAND (we_t, w9_t, w1_t, w0_t); \ + w1_t = SHA512_EXPAND (wf_t, wa_t, w2_t, w1_t); \ + w2_t = SHA512_EXPAND (w0_t, wb_t, w3_t, w2_t); \ + w3_t = SHA512_EXPAND (w1_t, wc_t, w4_t, w3_t); \ + w4_t = SHA512_EXPAND (w2_t, wd_t, w5_t, w4_t); \ + w5_t = SHA512_EXPAND (w3_t, we_t, w6_t, w5_t); \ + w6_t = SHA512_EXPAND (w4_t, wf_t, w7_t, w6_t); \ + w7_t = SHA512_EXPAND (w5_t, w0_t, w8_t, w7_t); \ + w8_t = SHA512_EXPAND (w6_t, w1_t, w9_t, w8_t); \ + w9_t = SHA512_EXPAND (w7_t, w2_t, wa_t, w9_t); \ + wa_t = SHA512_EXPAND (w8_t, w3_t, wb_t, wa_t); \ + wb_t = SHA512_EXPAND (w9_t, w4_t, wc_t, wb_t); \ + wc_t = SHA512_EXPAND (wa_t, w5_t, wd_t, wc_t); \ + wd_t = SHA512_EXPAND (wb_t, w6_t, we_t, wd_t); \ + we_t = SHA512_EXPAND (wc_t, w7_t, wf_t, we_t); \ + wf_t = SHA512_EXPAND (wd_t, w8_t, w0_t, wf_t); \ + } + + #define ROUND_STEP(i) \ + { \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, a, b, c, d, e, f, g, h, w0_t, k_sha512[i + 0]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, h, a, b, c, d, e, f, g, w1_t, k_sha512[i + 1]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, g, h, a, b, c, d, e, f, w2_t, k_sha512[i + 2]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, f, g, h, a, b, c, d, e, w3_t, k_sha512[i + 3]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, e, f, g, h, a, b, c, d, w4_t, k_sha512[i + 4]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, d, e, f, g, h, a, b, c, w5_t, k_sha512[i + 5]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, c, d, e, f, g, h, a, b, w6_t, k_sha512[i + 6]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, b, c, d, e, f, g, h, a, w7_t, k_sha512[i + 7]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, a, b, c, d, e, f, g, h, w8_t, k_sha512[i + 8]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, h, a, b, c, d, e, f, g, w9_t, k_sha512[i + 9]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, g, h, a, b, c, d, e, f, wa_t, k_sha512[i + 10]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, f, g, h, a, b, c, d, e, wb_t, k_sha512[i + 11]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, e, f, g, h, a, b, c, d, wc_t, k_sha512[i + 12]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, d, e, f, g, h, a, b, c, wd_t, k_sha512[i + 13]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, c, d, e, f, g, h, a, b, we_t, k_sha512[i + 14]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, b, c, d, e, f, g, h, a, wf_t, k_sha512[i + 15]); \ + } + + ROUND_STEP (0); + + //#pragma unroll // kernel fails if used + for (int i = 16; i < 80; i += 16) + { + ROUND_EXPAND (); ROUND_STEP (i); + } + + digest[0] += a; + digest[1] += b; + digest[2] += c; + digest[3] += d; + digest[4] += e; + digest[5] += f; + digest[6] += g; + digest[7] += h; +} + +static void hmac_sha512_pad (u64x w0[4], u64x w1[4], u64x w2[4], u64x w3[4], u64x ipad[8], u64x opad[8]) +{ + w0[0] = w0[0] ^ 0x3636363636363636; + w0[1] = w0[1] ^ 0x3636363636363636; + w0[2] = w0[2] ^ 0x3636363636363636; + w0[3] = w0[3] ^ 0x3636363636363636; + w1[0] = w1[0] ^ 0x3636363636363636; + w1[1] = w1[1] ^ 0x3636363636363636; + w1[2] = w1[2] ^ 0x3636363636363636; + w1[3] = w1[3] ^ 0x3636363636363636; + w2[0] = w2[0] ^ 0x3636363636363636; + w2[1] = w2[1] ^ 0x3636363636363636; + w2[2] = w2[2] ^ 0x3636363636363636; + w2[3] = w2[3] ^ 0x3636363636363636; + w3[0] = w3[0] ^ 0x3636363636363636; + w3[1] = w3[1] ^ 0x3636363636363636; + w3[2] = w3[2] ^ 0x3636363636363636; + w3[3] = w3[3] ^ 0x3636363636363636; + + ipad[0] = SHA512M_A; + ipad[1] = SHA512M_B; + ipad[2] = SHA512M_C; + ipad[3] = SHA512M_D; + ipad[4] = SHA512M_E; + ipad[5] = SHA512M_F; + ipad[6] = SHA512M_G; + ipad[7] = SHA512M_H; + + sha512_transform (w0, w1, w2, w3, ipad); + + w0[0] = w0[0] ^ 0x6a6a6a6a6a6a6a6a; + w0[1] = w0[1] ^ 0x6a6a6a6a6a6a6a6a; + w0[2] = w0[2] ^ 0x6a6a6a6a6a6a6a6a; + w0[3] = w0[3] ^ 0x6a6a6a6a6a6a6a6a; + w1[0] = w1[0] ^ 0x6a6a6a6a6a6a6a6a; + w1[1] = w1[1] ^ 0x6a6a6a6a6a6a6a6a; + w1[2] = w1[2] ^ 0x6a6a6a6a6a6a6a6a; + w1[3] = w1[3] ^ 0x6a6a6a6a6a6a6a6a; + w2[0] = w2[0] ^ 0x6a6a6a6a6a6a6a6a; + w2[1] = w2[1] ^ 0x6a6a6a6a6a6a6a6a; + w2[2] = w2[2] ^ 0x6a6a6a6a6a6a6a6a; + w2[3] = w2[3] ^ 0x6a6a6a6a6a6a6a6a; + w3[0] = w3[0] ^ 0x6a6a6a6a6a6a6a6a; + w3[1] = w3[1] ^ 0x6a6a6a6a6a6a6a6a; + w3[2] = w3[2] ^ 0x6a6a6a6a6a6a6a6a; + w3[3] = w3[3] ^ 0x6a6a6a6a6a6a6a6a; + + opad[0] = SHA512M_A; + opad[1] = SHA512M_B; + opad[2] = SHA512M_C; + opad[3] = SHA512M_D; + opad[4] = SHA512M_E; + opad[5] = SHA512M_F; + opad[6] = SHA512M_G; + opad[7] = SHA512M_H; + + sha512_transform (w0, w1, w2, w3, opad); +} + +static void hmac_sha512_run (u64x w0[4], u64x w1[4], u64x w2[4], u64x w3[4], u64x ipad[8], u64x opad[8], u64x digest[8]) +{ + digest[0] = ipad[0]; + digest[1] = ipad[1]; + digest[2] = ipad[2]; + digest[3] = ipad[3]; + digest[4] = ipad[4]; + digest[5] = ipad[5]; + digest[6] = ipad[6]; + digest[7] = ipad[7]; + + sha512_transform (w0, w1, w2, w3, digest); + + w0[0] = digest[0]; + w0[1] = digest[1]; + w0[2] = digest[2]; + w0[3] = digest[3]; + w1[0] = digest[4]; + w1[1] = digest[5]; + w1[2] = digest[6]; + w1[3] = digest[7]; + w2[0] = 0x8000000000000000; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = (128 + 64) * 8; + + digest[0] = opad[0]; + digest[1] = opad[1]; + digest[2] = opad[2]; + digest[3] = opad[3]; + digest[4] = opad[4]; + digest[5] = opad[5]; + digest[6] = opad[6]; + digest[7] = opad[7]; + + sha512_transform (w0, w1, w2, w3, digest); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m06500_init (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global sha512aix_tmp_t *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global wpa_t *wpa_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = pws[gid].i[ 8]; + w2[1] = pws[gid].i[ 9]; + w2[2] = pws[gid].i[10]; + w2[3] = pws[gid].i[11]; + + u32x w3[4]; + + w3[0] = pws[gid].i[12]; + w3[1] = pws[gid].i[13]; + w3[2] = pws[gid].i[14]; + w3[3] = pws[gid].i[15]; + + /** + * salt + */ + + u32 salt_len = salt_bufs[salt_pos].salt_len; + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[ 1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[ 2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[ 3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[ 4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[ 5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[ 6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[ 7]; + + u32 salt_buf2[4]; + + salt_buf2[0] = salt_bufs[salt_pos].salt_buf[ 8]; + salt_buf2[1] = salt_bufs[salt_pos].salt_buf[ 9]; + salt_buf2[2] = salt_bufs[salt_pos].salt_buf[10]; + salt_buf2[3] = salt_bufs[salt_pos].salt_buf[11]; + + u32 salt_buf3[4]; + + salt_buf3[0] = 0; + salt_buf3[1] = 0; + salt_buf3[2] = 0; + salt_buf3[3] = 0; + + append_0x01_4 (salt_buf0, salt_buf1, salt_buf2, salt_buf3, salt_len + 3); + + append_0x80_4 (salt_buf0, salt_buf1, salt_buf2, salt_buf3, salt_len + 4); + + /** + * pads + */ + + w0[0] = swap_workaround (w0[0]); + w0[1] = swap_workaround (w0[1]); + w0[2] = swap_workaround (w0[2]); + w0[3] = swap_workaround (w0[3]); + w1[0] = swap_workaround (w1[0]); + w1[1] = swap_workaround (w1[1]); + w1[2] = swap_workaround (w1[2]); + w1[3] = swap_workaround (w1[3]); + w2[0] = swap_workaround (w2[0]); + w2[1] = swap_workaround (w2[1]); + w2[2] = swap_workaround (w2[2]); + w2[3] = swap_workaround (w2[3]); + w3[0] = swap_workaround (w3[0]); + w3[1] = swap_workaround (w3[1]); + w3[2] = swap_workaround (w3[2]); + w3[3] = swap_workaround (w3[3]); + + u64x w0l[4]; + u64x w1l[4]; + u64x w2l[4]; + u64x w3l[4]; + + w0l[0] = (u64x) (w0[0]) << 32 | (u64x) (w0[1]); + w0l[1] = (u64x) (w0[2]) << 32 | (u64x) (w0[3]); + w0l[2] = (u64x) (w1[0]) << 32 | (u64x) (w1[1]); + w0l[3] = (u64x) (w1[2]) << 32 | (u64x) (w1[3]); + w1l[0] = (u64x) (w2[0]) << 32 | (u64x) (w2[1]); + w1l[1] = (u64x) (w2[2]) << 32 | (u64x) (w2[3]); + w1l[2] = (u64x) (w3[0]) << 32 | (u64x) (w3[1]); + w1l[3] = (u64x) (w3[2]) << 32 | (u64x) (w3[3]); + w2l[0] = 0; + w2l[1] = 0; + w2l[2] = 0; + w2l[3] = 0; + w3l[0] = 0; + w3l[1] = 0; + w3l[2] = 0; + w3l[3] = 0; + + u64x ipad[8]; + u64x opad[8]; + + hmac_sha512_pad (w0l, w1l, w2l, w3l, ipad, opad); + + tmps[gid].ipad[0] = ipad[0]; + tmps[gid].ipad[1] = ipad[1]; + tmps[gid].ipad[2] = ipad[2]; + tmps[gid].ipad[3] = ipad[3]; + tmps[gid].ipad[4] = ipad[4]; + tmps[gid].ipad[5] = ipad[5]; + tmps[gid].ipad[6] = ipad[6]; + tmps[gid].ipad[7] = ipad[7]; + + tmps[gid].opad[0] = opad[0]; + tmps[gid].opad[1] = opad[1]; + tmps[gid].opad[2] = opad[2]; + tmps[gid].opad[3] = opad[3]; + tmps[gid].opad[4] = opad[4]; + tmps[gid].opad[5] = opad[5]; + tmps[gid].opad[6] = opad[6]; + tmps[gid].opad[7] = opad[7]; + + w0l[0] = (u64x) salt_buf0[1] << 32 | (u64x) salt_buf0[0]; + w0l[1] = (u64x) salt_buf0[3] << 32 | (u64x) salt_buf0[2]; + w0l[2] = (u64x) salt_buf1[1] << 32 | (u64x) salt_buf1[0]; + w0l[3] = (u64x) salt_buf1[3] << 32 | (u64x) salt_buf1[2]; + w1l[0] = (u64x) salt_buf2[1] << 32 | (u64x) salt_buf2[0]; + w1l[1] = (u64x) salt_buf2[3] << 32 | (u64x) salt_buf2[2]; + w1l[2] = (u64x) salt_buf3[1] << 32 | (u64x) salt_buf3[0]; + w1l[3] = (u64x) salt_buf3[3] << 32 | (u64x) salt_buf3[2]; + w2l[0] = 0; + w2l[1] = 0; + w2l[2] = 0; + w2l[3] = 0; + w3l[0] = 0; + w3l[1] = 0; + w3l[2] = 0; + w3l[3] = 0; + + w0l[0] = swap_workaround (w0l[0]); + w0l[1] = swap_workaround (w0l[1]); + w0l[2] = swap_workaround (w0l[2]); + w0l[3] = swap_workaround (w0l[3]); + w1l[0] = swap_workaround (w1l[0]); + w1l[1] = swap_workaround (w1l[1]); + w1l[2] = swap_workaround (w1l[2]); + w1l[3] = swap_workaround (w1l[3]); + w2l[0] = 0; + w2l[1] = 0; + w2l[2] = 0; + w2l[3] = 0; + w3l[0] = 0; + w3l[1] = 0; + w3l[2] = 0; + w3l[3] = (128 + salt_len + 4) * 8; + + u64x dgst[8]; + + hmac_sha512_run (w0l, w1l, w2l, w3l, ipad, opad, dgst); + + tmps[gid].dgst[0] = dgst[0]; + tmps[gid].dgst[1] = dgst[1]; + tmps[gid].dgst[2] = dgst[2]; + tmps[gid].dgst[3] = dgst[3]; + tmps[gid].dgst[4] = dgst[4]; + tmps[gid].dgst[5] = dgst[5]; + tmps[gid].dgst[6] = dgst[6]; + tmps[gid].dgst[7] = dgst[7]; + + tmps[gid].out[0] = dgst[0]; + tmps[gid].out[1] = dgst[1]; + tmps[gid].out[2] = dgst[2]; + tmps[gid].out[3] = dgst[3]; + tmps[gid].out[4] = dgst[4]; + tmps[gid].out[5] = dgst[5]; + tmps[gid].out[6] = dgst[6]; + tmps[gid].out[7] = dgst[7]; +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m06500_loop (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global sha512aix_tmp_t *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global wpa_t *wpa_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u64x ipad[8]; + u64x opad[8]; + + ipad[0] = tmps[gid].ipad[0]; + ipad[1] = tmps[gid].ipad[1]; + ipad[2] = tmps[gid].ipad[2]; + ipad[3] = tmps[gid].ipad[3]; + ipad[4] = tmps[gid].ipad[4]; + ipad[5] = tmps[gid].ipad[5]; + ipad[6] = tmps[gid].ipad[6]; + ipad[7] = tmps[gid].ipad[7]; + + opad[0] = tmps[gid].opad[0]; + opad[1] = tmps[gid].opad[1]; + opad[2] = tmps[gid].opad[2]; + opad[3] = tmps[gid].opad[3]; + opad[4] = tmps[gid].opad[4]; + opad[5] = tmps[gid].opad[5]; + opad[6] = tmps[gid].opad[6]; + opad[7] = tmps[gid].opad[7]; + + u64x dgst[8]; + u64x out[8]; + + dgst[0] = tmps[gid].dgst[0]; + dgst[1] = tmps[gid].dgst[1]; + dgst[2] = tmps[gid].dgst[2]; + dgst[3] = tmps[gid].dgst[3]; + dgst[4] = tmps[gid].dgst[4]; + dgst[5] = tmps[gid].dgst[5]; + dgst[6] = tmps[gid].dgst[6]; + dgst[7] = tmps[gid].dgst[7]; + + out[0] = tmps[gid].out[0]; + out[1] = tmps[gid].out[1]; + out[2] = tmps[gid].out[2]; + out[3] = tmps[gid].out[3]; + out[4] = tmps[gid].out[4]; + out[5] = tmps[gid].out[5]; + out[6] = tmps[gid].out[6]; + out[7] = tmps[gid].out[7]; + + for (u32 j = 0; j < loop_cnt; j++) + { + u64x w0[4]; + u64x w1[4]; + u64x w2[4]; + u64x w3[4]; + + w0[0] = dgst[0]; + w0[1] = dgst[1]; + w0[2] = dgst[2]; + w0[3] = dgst[3]; + w1[0] = dgst[4]; + w1[1] = dgst[5]; + w1[2] = dgst[6]; + w1[3] = dgst[7]; + w2[0] = 0x8000000000000000; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = (128 + 64) * 8; + + hmac_sha512_run (w0, w1, w2, w3, ipad, opad, dgst); + + out[0] ^= dgst[0]; + out[1] ^= dgst[1]; + out[2] ^= dgst[2]; + out[3] ^= dgst[3]; + out[4] ^= dgst[4]; + out[5] ^= dgst[5]; + out[6] ^= dgst[6]; + out[7] ^= dgst[7]; + } + + tmps[gid].dgst[0] = dgst[0]; + tmps[gid].dgst[1] = dgst[1]; + tmps[gid].dgst[2] = dgst[2]; + tmps[gid].dgst[3] = dgst[3]; + tmps[gid].dgst[4] = dgst[4]; + tmps[gid].dgst[5] = dgst[5]; + tmps[gid].dgst[6] = dgst[6]; + tmps[gid].dgst[7] = dgst[7]; + + tmps[gid].out[0] = out[0]; + tmps[gid].out[1] = out[1]; + tmps[gid].out[2] = out[2]; + tmps[gid].out[3] = out[3]; + tmps[gid].out[4] = out[4]; + tmps[gid].out[5] = out[5]; + tmps[gid].out[6] = out[6]; + tmps[gid].out[7] = out[7]; +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m06500_comp (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global sha512aix_tmp_t *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global wpa_t *wpa_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + const u32 lid = get_local_id (0); + + /** + * digest + */ + + /* + u64x a = tmps[gid].out[0]; + u64x b = tmps[gid].out[1]; + u64x c = tmps[gid].out[2]; + u64x d = tmps[gid].out[3]; + u64x e = tmps[gid].out[4]; + u64x f = tmps[gid].out[5]; + u64x g = tmps[gid].out[6]; + u64x h = tmps[gid].out[7] & 0xffffffffffffff00; + */ + + const u32x r0 = l32_from_64 (tmps[gid].out[0]); + const u32x r1 = h32_from_64 (tmps[gid].out[0]); + const u32x r2 = l32_from_64 (tmps[gid].out[1]); + const u32x r3 = h32_from_64 (tmps[gid].out[1]); + + #define il_pos 0 + + #include VECT_COMPARE_M +} diff --git a/amd/m06600.cl b/amd/m06600.cl new file mode 100644 index 0000000000..27194cd129 --- /dev/null +++ b/amd/m06600.cl @@ -0,0 +1,1465 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _SHA1_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW4 +#define VECT_SIZE1 +#endif + +#ifdef VLIW5 +#define VECT_SIZE1 +#endif + +#define DGST_R0 0 +#define DGST_R1 1 +#define DGST_R2 2 +#define DGST_R3 3 + +#include "include/kernel_functions.c" +#include "types_amd.c" +#include "common_amd.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +__constant u32 te0[256] = +{ + 0xc66363a5, 0xf87c7c84, 0xee777799, 0xf67b7b8d, + 0xfff2f20d, 0xd66b6bbd, 0xde6f6fb1, 0x91c5c554, + 0x60303050, 0x02010103, 0xce6767a9, 0x562b2b7d, + 0xe7fefe19, 0xb5d7d762, 0x4dababe6, 0xec76769a, + 0x8fcaca45, 0x1f82829d, 0x89c9c940, 0xfa7d7d87, + 0xeffafa15, 0xb25959eb, 0x8e4747c9, 0xfbf0f00b, + 0x41adadec, 0xb3d4d467, 0x5fa2a2fd, 0x45afafea, + 0x239c9cbf, 0x53a4a4f7, 0xe4727296, 0x9bc0c05b, + 0x75b7b7c2, 0xe1fdfd1c, 0x3d9393ae, 0x4c26266a, + 0x6c36365a, 0x7e3f3f41, 0xf5f7f702, 0x83cccc4f, + 0x6834345c, 0x51a5a5f4, 0xd1e5e534, 0xf9f1f108, + 0xe2717193, 0xabd8d873, 0x62313153, 0x2a15153f, + 0x0804040c, 0x95c7c752, 0x46232365, 0x9dc3c35e, + 0x30181828, 0x379696a1, 0x0a05050f, 0x2f9a9ab5, + 0x0e070709, 0x24121236, 0x1b80809b, 0xdfe2e23d, + 0xcdebeb26, 0x4e272769, 0x7fb2b2cd, 0xea75759f, + 0x1209091b, 0x1d83839e, 0x582c2c74, 0x341a1a2e, + 0x361b1b2d, 0xdc6e6eb2, 0xb45a5aee, 0x5ba0a0fb, + 0xa45252f6, 0x763b3b4d, 0xb7d6d661, 0x7db3b3ce, + 0x5229297b, 0xdde3e33e, 0x5e2f2f71, 0x13848497, + 0xa65353f5, 0xb9d1d168, 0x00000000, 0xc1eded2c, + 0x40202060, 0xe3fcfc1f, 0x79b1b1c8, 0xb65b5bed, + 0xd46a6abe, 0x8dcbcb46, 0x67bebed9, 0x7239394b, + 0x944a4ade, 0x984c4cd4, 0xb05858e8, 0x85cfcf4a, + 0xbbd0d06b, 0xc5efef2a, 0x4faaaae5, 0xedfbfb16, + 0x864343c5, 0x9a4d4dd7, 0x66333355, 0x11858594, + 0x8a4545cf, 0xe9f9f910, 0x04020206, 0xfe7f7f81, + 0xa05050f0, 0x783c3c44, 0x259f9fba, 0x4ba8a8e3, + 0xa25151f3, 0x5da3a3fe, 0x804040c0, 0x058f8f8a, + 0x3f9292ad, 0x219d9dbc, 0x70383848, 0xf1f5f504, + 0x63bcbcdf, 0x77b6b6c1, 0xafdada75, 0x42212163, + 0x20101030, 0xe5ffff1a, 0xfdf3f30e, 0xbfd2d26d, + 0x81cdcd4c, 0x180c0c14, 0x26131335, 0xc3ecec2f, + 0xbe5f5fe1, 0x359797a2, 0x884444cc, 0x2e171739, + 0x93c4c457, 0x55a7a7f2, 0xfc7e7e82, 0x7a3d3d47, + 0xc86464ac, 0xba5d5de7, 0x3219192b, 0xe6737395, + 0xc06060a0, 0x19818198, 0x9e4f4fd1, 0xa3dcdc7f, + 0x44222266, 0x542a2a7e, 0x3b9090ab, 0x0b888883, + 0x8c4646ca, 0xc7eeee29, 0x6bb8b8d3, 0x2814143c, + 0xa7dede79, 0xbc5e5ee2, 0x160b0b1d, 0xaddbdb76, + 0xdbe0e03b, 0x64323256, 0x743a3a4e, 0x140a0a1e, + 0x924949db, 0x0c06060a, 0x4824246c, 0xb85c5ce4, + 0x9fc2c25d, 0xbdd3d36e, 0x43acacef, 0xc46262a6, + 0x399191a8, 0x319595a4, 0xd3e4e437, 0xf279798b, + 0xd5e7e732, 0x8bc8c843, 0x6e373759, 0xda6d6db7, + 0x018d8d8c, 0xb1d5d564, 0x9c4e4ed2, 0x49a9a9e0, + 0xd86c6cb4, 0xac5656fa, 0xf3f4f407, 0xcfeaea25, + 0xca6565af, 0xf47a7a8e, 0x47aeaee9, 0x10080818, + 0x6fbabad5, 0xf0787888, 0x4a25256f, 0x5c2e2e72, + 0x381c1c24, 0x57a6a6f1, 0x73b4b4c7, 0x97c6c651, + 0xcbe8e823, 0xa1dddd7c, 0xe874749c, 0x3e1f1f21, + 0x964b4bdd, 0x61bdbddc, 0x0d8b8b86, 0x0f8a8a85, + 0xe0707090, 0x7c3e3e42, 0x71b5b5c4, 0xcc6666aa, + 0x904848d8, 0x06030305, 0xf7f6f601, 0x1c0e0e12, + 0xc26161a3, 0x6a35355f, 0xae5757f9, 0x69b9b9d0, + 0x17868691, 0x99c1c158, 0x3a1d1d27, 0x279e9eb9, + 0xd9e1e138, 0xebf8f813, 0x2b9898b3, 0x22111133, + 0xd26969bb, 0xa9d9d970, 0x078e8e89, 0x339494a7, + 0x2d9b9bb6, 0x3c1e1e22, 0x15878792, 0xc9e9e920, + 0x87cece49, 0xaa5555ff, 0x50282878, 0xa5dfdf7a, + 0x038c8c8f, 0x59a1a1f8, 0x09898980, 0x1a0d0d17, + 0x65bfbfda, 0xd7e6e631, 0x844242c6, 0xd06868b8, + 0x824141c3, 0x299999b0, 0x5a2d2d77, 0x1e0f0f11, + 0x7bb0b0cb, 0xa85454fc, 0x6dbbbbd6, 0x2c16163a, +}; + +__constant u32 te1[256] = +{ + 0xa5c66363, 0x84f87c7c, 0x99ee7777, 0x8df67b7b, + 0x0dfff2f2, 0xbdd66b6b, 0xb1de6f6f, 0x5491c5c5, + 0x50603030, 0x03020101, 0xa9ce6767, 0x7d562b2b, + 0x19e7fefe, 0x62b5d7d7, 0xe64dabab, 0x9aec7676, + 0x458fcaca, 0x9d1f8282, 0x4089c9c9, 0x87fa7d7d, + 0x15effafa, 0xebb25959, 0xc98e4747, 0x0bfbf0f0, + 0xec41adad, 0x67b3d4d4, 0xfd5fa2a2, 0xea45afaf, + 0xbf239c9c, 0xf753a4a4, 0x96e47272, 0x5b9bc0c0, + 0xc275b7b7, 0x1ce1fdfd, 0xae3d9393, 0x6a4c2626, + 0x5a6c3636, 0x417e3f3f, 0x02f5f7f7, 0x4f83cccc, + 0x5c683434, 0xf451a5a5, 0x34d1e5e5, 0x08f9f1f1, + 0x93e27171, 0x73abd8d8, 0x53623131, 0x3f2a1515, + 0x0c080404, 0x5295c7c7, 0x65462323, 0x5e9dc3c3, + 0x28301818, 0xa1379696, 0x0f0a0505, 0xb52f9a9a, + 0x090e0707, 0x36241212, 0x9b1b8080, 0x3ddfe2e2, + 0x26cdebeb, 0x694e2727, 0xcd7fb2b2, 0x9fea7575, + 0x1b120909, 0x9e1d8383, 0x74582c2c, 0x2e341a1a, + 0x2d361b1b, 0xb2dc6e6e, 0xeeb45a5a, 0xfb5ba0a0, + 0xf6a45252, 0x4d763b3b, 0x61b7d6d6, 0xce7db3b3, + 0x7b522929, 0x3edde3e3, 0x715e2f2f, 0x97138484, + 0xf5a65353, 0x68b9d1d1, 0x00000000, 0x2cc1eded, + 0x60402020, 0x1fe3fcfc, 0xc879b1b1, 0xedb65b5b, + 0xbed46a6a, 0x468dcbcb, 0xd967bebe, 0x4b723939, + 0xde944a4a, 0xd4984c4c, 0xe8b05858, 0x4a85cfcf, + 0x6bbbd0d0, 0x2ac5efef, 0xe54faaaa, 0x16edfbfb, + 0xc5864343, 0xd79a4d4d, 0x55663333, 0x94118585, + 0xcf8a4545, 0x10e9f9f9, 0x06040202, 0x81fe7f7f, + 0xf0a05050, 0x44783c3c, 0xba259f9f, 0xe34ba8a8, + 0xf3a25151, 0xfe5da3a3, 0xc0804040, 0x8a058f8f, + 0xad3f9292, 0xbc219d9d, 0x48703838, 0x04f1f5f5, + 0xdf63bcbc, 0xc177b6b6, 0x75afdada, 0x63422121, + 0x30201010, 0x1ae5ffff, 0x0efdf3f3, 0x6dbfd2d2, + 0x4c81cdcd, 0x14180c0c, 0x35261313, 0x2fc3ecec, + 0xe1be5f5f, 0xa2359797, 0xcc884444, 0x392e1717, + 0x5793c4c4, 0xf255a7a7, 0x82fc7e7e, 0x477a3d3d, + 0xacc86464, 0xe7ba5d5d, 0x2b321919, 0x95e67373, + 0xa0c06060, 0x98198181, 0xd19e4f4f, 0x7fa3dcdc, + 0x66442222, 0x7e542a2a, 0xab3b9090, 0x830b8888, + 0xca8c4646, 0x29c7eeee, 0xd36bb8b8, 0x3c281414, + 0x79a7dede, 0xe2bc5e5e, 0x1d160b0b, 0x76addbdb, + 0x3bdbe0e0, 0x56643232, 0x4e743a3a, 0x1e140a0a, + 0xdb924949, 0x0a0c0606, 0x6c482424, 0xe4b85c5c, + 0x5d9fc2c2, 0x6ebdd3d3, 0xef43acac, 0xa6c46262, + 0xa8399191, 0xa4319595, 0x37d3e4e4, 0x8bf27979, + 0x32d5e7e7, 0x438bc8c8, 0x596e3737, 0xb7da6d6d, + 0x8c018d8d, 0x64b1d5d5, 0xd29c4e4e, 0xe049a9a9, + 0xb4d86c6c, 0xfaac5656, 0x07f3f4f4, 0x25cfeaea, + 0xafca6565, 0x8ef47a7a, 0xe947aeae, 0x18100808, + 0xd56fbaba, 0x88f07878, 0x6f4a2525, 0x725c2e2e, + 0x24381c1c, 0xf157a6a6, 0xc773b4b4, 0x5197c6c6, + 0x23cbe8e8, 0x7ca1dddd, 0x9ce87474, 0x213e1f1f, + 0xdd964b4b, 0xdc61bdbd, 0x860d8b8b, 0x850f8a8a, + 0x90e07070, 0x427c3e3e, 0xc471b5b5, 0xaacc6666, + 0xd8904848, 0x05060303, 0x01f7f6f6, 0x121c0e0e, + 0xa3c26161, 0x5f6a3535, 0xf9ae5757, 0xd069b9b9, + 0x91178686, 0x5899c1c1, 0x273a1d1d, 0xb9279e9e, + 0x38d9e1e1, 0x13ebf8f8, 0xb32b9898, 0x33221111, + 0xbbd26969, 0x70a9d9d9, 0x89078e8e, 0xa7339494, + 0xb62d9b9b, 0x223c1e1e, 0x92158787, 0x20c9e9e9, + 0x4987cece, 0xffaa5555, 0x78502828, 0x7aa5dfdf, + 0x8f038c8c, 0xf859a1a1, 0x80098989, 0x171a0d0d, + 0xda65bfbf, 0x31d7e6e6, 0xc6844242, 0xb8d06868, + 0xc3824141, 0xb0299999, 0x775a2d2d, 0x111e0f0f, + 0xcb7bb0b0, 0xfca85454, 0xd66dbbbb, 0x3a2c1616, +}; + +__constant u32 te2[256] = +{ + 0x63a5c663, 0x7c84f87c, 0x7799ee77, 0x7b8df67b, + 0xf20dfff2, 0x6bbdd66b, 0x6fb1de6f, 0xc55491c5, + 0x30506030, 0x01030201, 0x67a9ce67, 0x2b7d562b, + 0xfe19e7fe, 0xd762b5d7, 0xabe64dab, 0x769aec76, + 0xca458fca, 0x829d1f82, 0xc94089c9, 0x7d87fa7d, + 0xfa15effa, 0x59ebb259, 0x47c98e47, 0xf00bfbf0, + 0xadec41ad, 0xd467b3d4, 0xa2fd5fa2, 0xafea45af, + 0x9cbf239c, 0xa4f753a4, 0x7296e472, 0xc05b9bc0, + 0xb7c275b7, 0xfd1ce1fd, 0x93ae3d93, 0x266a4c26, + 0x365a6c36, 0x3f417e3f, 0xf702f5f7, 0xcc4f83cc, + 0x345c6834, 0xa5f451a5, 0xe534d1e5, 0xf108f9f1, + 0x7193e271, 0xd873abd8, 0x31536231, 0x153f2a15, + 0x040c0804, 0xc75295c7, 0x23654623, 0xc35e9dc3, + 0x18283018, 0x96a13796, 0x050f0a05, 0x9ab52f9a, + 0x07090e07, 0x12362412, 0x809b1b80, 0xe23ddfe2, + 0xeb26cdeb, 0x27694e27, 0xb2cd7fb2, 0x759fea75, + 0x091b1209, 0x839e1d83, 0x2c74582c, 0x1a2e341a, + 0x1b2d361b, 0x6eb2dc6e, 0x5aeeb45a, 0xa0fb5ba0, + 0x52f6a452, 0x3b4d763b, 0xd661b7d6, 0xb3ce7db3, + 0x297b5229, 0xe33edde3, 0x2f715e2f, 0x84971384, + 0x53f5a653, 0xd168b9d1, 0x00000000, 0xed2cc1ed, + 0x20604020, 0xfc1fe3fc, 0xb1c879b1, 0x5bedb65b, + 0x6abed46a, 0xcb468dcb, 0xbed967be, 0x394b7239, + 0x4ade944a, 0x4cd4984c, 0x58e8b058, 0xcf4a85cf, + 0xd06bbbd0, 0xef2ac5ef, 0xaae54faa, 0xfb16edfb, + 0x43c58643, 0x4dd79a4d, 0x33556633, 0x85941185, + 0x45cf8a45, 0xf910e9f9, 0x02060402, 0x7f81fe7f, + 0x50f0a050, 0x3c44783c, 0x9fba259f, 0xa8e34ba8, + 0x51f3a251, 0xa3fe5da3, 0x40c08040, 0x8f8a058f, + 0x92ad3f92, 0x9dbc219d, 0x38487038, 0xf504f1f5, + 0xbcdf63bc, 0xb6c177b6, 0xda75afda, 0x21634221, + 0x10302010, 0xff1ae5ff, 0xf30efdf3, 0xd26dbfd2, + 0xcd4c81cd, 0x0c14180c, 0x13352613, 0xec2fc3ec, + 0x5fe1be5f, 0x97a23597, 0x44cc8844, 0x17392e17, + 0xc45793c4, 0xa7f255a7, 0x7e82fc7e, 0x3d477a3d, + 0x64acc864, 0x5de7ba5d, 0x192b3219, 0x7395e673, + 0x60a0c060, 0x81981981, 0x4fd19e4f, 0xdc7fa3dc, + 0x22664422, 0x2a7e542a, 0x90ab3b90, 0x88830b88, + 0x46ca8c46, 0xee29c7ee, 0xb8d36bb8, 0x143c2814, + 0xde79a7de, 0x5ee2bc5e, 0x0b1d160b, 0xdb76addb, + 0xe03bdbe0, 0x32566432, 0x3a4e743a, 0x0a1e140a, + 0x49db9249, 0x060a0c06, 0x246c4824, 0x5ce4b85c, + 0xc25d9fc2, 0xd36ebdd3, 0xacef43ac, 0x62a6c462, + 0x91a83991, 0x95a43195, 0xe437d3e4, 0x798bf279, + 0xe732d5e7, 0xc8438bc8, 0x37596e37, 0x6db7da6d, + 0x8d8c018d, 0xd564b1d5, 0x4ed29c4e, 0xa9e049a9, + 0x6cb4d86c, 0x56faac56, 0xf407f3f4, 0xea25cfea, + 0x65afca65, 0x7a8ef47a, 0xaee947ae, 0x08181008, + 0xbad56fba, 0x7888f078, 0x256f4a25, 0x2e725c2e, + 0x1c24381c, 0xa6f157a6, 0xb4c773b4, 0xc65197c6, + 0xe823cbe8, 0xdd7ca1dd, 0x749ce874, 0x1f213e1f, + 0x4bdd964b, 0xbddc61bd, 0x8b860d8b, 0x8a850f8a, + 0x7090e070, 0x3e427c3e, 0xb5c471b5, 0x66aacc66, + 0x48d89048, 0x03050603, 0xf601f7f6, 0x0e121c0e, + 0x61a3c261, 0x355f6a35, 0x57f9ae57, 0xb9d069b9, + 0x86911786, 0xc15899c1, 0x1d273a1d, 0x9eb9279e, + 0xe138d9e1, 0xf813ebf8, 0x98b32b98, 0x11332211, + 0x69bbd269, 0xd970a9d9, 0x8e89078e, 0x94a73394, + 0x9bb62d9b, 0x1e223c1e, 0x87921587, 0xe920c9e9, + 0xce4987ce, 0x55ffaa55, 0x28785028, 0xdf7aa5df, + 0x8c8f038c, 0xa1f859a1, 0x89800989, 0x0d171a0d, + 0xbfda65bf, 0xe631d7e6, 0x42c68442, 0x68b8d068, + 0x41c38241, 0x99b02999, 0x2d775a2d, 0x0f111e0f, + 0xb0cb7bb0, 0x54fca854, 0xbbd66dbb, 0x163a2c16, +}; + +__constant u32 te3[256] = +{ + 0x6363a5c6, 0x7c7c84f8, 0x777799ee, 0x7b7b8df6, + 0xf2f20dff, 0x6b6bbdd6, 0x6f6fb1de, 0xc5c55491, + 0x30305060, 0x01010302, 0x6767a9ce, 0x2b2b7d56, + 0xfefe19e7, 0xd7d762b5, 0xababe64d, 0x76769aec, + 0xcaca458f, 0x82829d1f, 0xc9c94089, 0x7d7d87fa, + 0xfafa15ef, 0x5959ebb2, 0x4747c98e, 0xf0f00bfb, + 0xadadec41, 0xd4d467b3, 0xa2a2fd5f, 0xafafea45, + 0x9c9cbf23, 0xa4a4f753, 0x727296e4, 0xc0c05b9b, + 0xb7b7c275, 0xfdfd1ce1, 0x9393ae3d, 0x26266a4c, + 0x36365a6c, 0x3f3f417e, 0xf7f702f5, 0xcccc4f83, + 0x34345c68, 0xa5a5f451, 0xe5e534d1, 0xf1f108f9, + 0x717193e2, 0xd8d873ab, 0x31315362, 0x15153f2a, + 0x04040c08, 0xc7c75295, 0x23236546, 0xc3c35e9d, + 0x18182830, 0x9696a137, 0x05050f0a, 0x9a9ab52f, + 0x0707090e, 0x12123624, 0x80809b1b, 0xe2e23ddf, + 0xebeb26cd, 0x2727694e, 0xb2b2cd7f, 0x75759fea, + 0x09091b12, 0x83839e1d, 0x2c2c7458, 0x1a1a2e34, + 0x1b1b2d36, 0x6e6eb2dc, 0x5a5aeeb4, 0xa0a0fb5b, + 0x5252f6a4, 0x3b3b4d76, 0xd6d661b7, 0xb3b3ce7d, + 0x29297b52, 0xe3e33edd, 0x2f2f715e, 0x84849713, + 0x5353f5a6, 0xd1d168b9, 0x00000000, 0xeded2cc1, + 0x20206040, 0xfcfc1fe3, 0xb1b1c879, 0x5b5bedb6, + 0x6a6abed4, 0xcbcb468d, 0xbebed967, 0x39394b72, + 0x4a4ade94, 0x4c4cd498, 0x5858e8b0, 0xcfcf4a85, + 0xd0d06bbb, 0xefef2ac5, 0xaaaae54f, 0xfbfb16ed, + 0x4343c586, 0x4d4dd79a, 0x33335566, 0x85859411, + 0x4545cf8a, 0xf9f910e9, 0x02020604, 0x7f7f81fe, + 0x5050f0a0, 0x3c3c4478, 0x9f9fba25, 0xa8a8e34b, + 0x5151f3a2, 0xa3a3fe5d, 0x4040c080, 0x8f8f8a05, + 0x9292ad3f, 0x9d9dbc21, 0x38384870, 0xf5f504f1, + 0xbcbcdf63, 0xb6b6c177, 0xdada75af, 0x21216342, + 0x10103020, 0xffff1ae5, 0xf3f30efd, 0xd2d26dbf, + 0xcdcd4c81, 0x0c0c1418, 0x13133526, 0xecec2fc3, + 0x5f5fe1be, 0x9797a235, 0x4444cc88, 0x1717392e, + 0xc4c45793, 0xa7a7f255, 0x7e7e82fc, 0x3d3d477a, + 0x6464acc8, 0x5d5de7ba, 0x19192b32, 0x737395e6, + 0x6060a0c0, 0x81819819, 0x4f4fd19e, 0xdcdc7fa3, + 0x22226644, 0x2a2a7e54, 0x9090ab3b, 0x8888830b, + 0x4646ca8c, 0xeeee29c7, 0xb8b8d36b, 0x14143c28, + 0xdede79a7, 0x5e5ee2bc, 0x0b0b1d16, 0xdbdb76ad, + 0xe0e03bdb, 0x32325664, 0x3a3a4e74, 0x0a0a1e14, + 0x4949db92, 0x06060a0c, 0x24246c48, 0x5c5ce4b8, + 0xc2c25d9f, 0xd3d36ebd, 0xacacef43, 0x6262a6c4, + 0x9191a839, 0x9595a431, 0xe4e437d3, 0x79798bf2, + 0xe7e732d5, 0xc8c8438b, 0x3737596e, 0x6d6db7da, + 0x8d8d8c01, 0xd5d564b1, 0x4e4ed29c, 0xa9a9e049, + 0x6c6cb4d8, 0x5656faac, 0xf4f407f3, 0xeaea25cf, + 0x6565afca, 0x7a7a8ef4, 0xaeaee947, 0x08081810, + 0xbabad56f, 0x787888f0, 0x25256f4a, 0x2e2e725c, + 0x1c1c2438, 0xa6a6f157, 0xb4b4c773, 0xc6c65197, + 0xe8e823cb, 0xdddd7ca1, 0x74749ce8, 0x1f1f213e, + 0x4b4bdd96, 0xbdbddc61, 0x8b8b860d, 0x8a8a850f, + 0x707090e0, 0x3e3e427c, 0xb5b5c471, 0x6666aacc, + 0x4848d890, 0x03030506, 0xf6f601f7, 0x0e0e121c, + 0x6161a3c2, 0x35355f6a, 0x5757f9ae, 0xb9b9d069, + 0x86869117, 0xc1c15899, 0x1d1d273a, 0x9e9eb927, + 0xe1e138d9, 0xf8f813eb, 0x9898b32b, 0x11113322, + 0x6969bbd2, 0xd9d970a9, 0x8e8e8907, 0x9494a733, + 0x9b9bb62d, 0x1e1e223c, 0x87879215, 0xe9e920c9, + 0xcece4987, 0x5555ffaa, 0x28287850, 0xdfdf7aa5, + 0x8c8c8f03, 0xa1a1f859, 0x89898009, 0x0d0d171a, + 0xbfbfda65, 0xe6e631d7, 0x4242c684, 0x6868b8d0, + 0x4141c382, 0x9999b029, 0x2d2d775a, 0x0f0f111e, + 0xb0b0cb7b, 0x5454fca8, 0xbbbbd66d, 0x16163a2c, +}; + +__constant u32 te4[256] = +{ + 0x63636363, 0x7c7c7c7c, 0x77777777, 0x7b7b7b7b, + 0xf2f2f2f2, 0x6b6b6b6b, 0x6f6f6f6f, 0xc5c5c5c5, + 0x30303030, 0x01010101, 0x67676767, 0x2b2b2b2b, + 0xfefefefe, 0xd7d7d7d7, 0xabababab, 0x76767676, + 0xcacacaca, 0x82828282, 0xc9c9c9c9, 0x7d7d7d7d, + 0xfafafafa, 0x59595959, 0x47474747, 0xf0f0f0f0, + 0xadadadad, 0xd4d4d4d4, 0xa2a2a2a2, 0xafafafaf, + 0x9c9c9c9c, 0xa4a4a4a4, 0x72727272, 0xc0c0c0c0, + 0xb7b7b7b7, 0xfdfdfdfd, 0x93939393, 0x26262626, + 0x36363636, 0x3f3f3f3f, 0xf7f7f7f7, 0xcccccccc, + 0x34343434, 0xa5a5a5a5, 0xe5e5e5e5, 0xf1f1f1f1, + 0x71717171, 0xd8d8d8d8, 0x31313131, 0x15151515, + 0x04040404, 0xc7c7c7c7, 0x23232323, 0xc3c3c3c3, + 0x18181818, 0x96969696, 0x05050505, 0x9a9a9a9a, + 0x07070707, 0x12121212, 0x80808080, 0xe2e2e2e2, + 0xebebebeb, 0x27272727, 0xb2b2b2b2, 0x75757575, + 0x09090909, 0x83838383, 0x2c2c2c2c, 0x1a1a1a1a, + 0x1b1b1b1b, 0x6e6e6e6e, 0x5a5a5a5a, 0xa0a0a0a0, + 0x52525252, 0x3b3b3b3b, 0xd6d6d6d6, 0xb3b3b3b3, + 0x29292929, 0xe3e3e3e3, 0x2f2f2f2f, 0x84848484, + 0x53535353, 0xd1d1d1d1, 0x00000000, 0xedededed, + 0x20202020, 0xfcfcfcfc, 0xb1b1b1b1, 0x5b5b5b5b, + 0x6a6a6a6a, 0xcbcbcbcb, 0xbebebebe, 0x39393939, + 0x4a4a4a4a, 0x4c4c4c4c, 0x58585858, 0xcfcfcfcf, + 0xd0d0d0d0, 0xefefefef, 0xaaaaaaaa, 0xfbfbfbfb, + 0x43434343, 0x4d4d4d4d, 0x33333333, 0x85858585, + 0x45454545, 0xf9f9f9f9, 0x02020202, 0x7f7f7f7f, + 0x50505050, 0x3c3c3c3c, 0x9f9f9f9f, 0xa8a8a8a8, + 0x51515151, 0xa3a3a3a3, 0x40404040, 0x8f8f8f8f, + 0x92929292, 0x9d9d9d9d, 0x38383838, 0xf5f5f5f5, + 0xbcbcbcbc, 0xb6b6b6b6, 0xdadadada, 0x21212121, + 0x10101010, 0xffffffff, 0xf3f3f3f3, 0xd2d2d2d2, + 0xcdcdcdcd, 0x0c0c0c0c, 0x13131313, 0xecececec, + 0x5f5f5f5f, 0x97979797, 0x44444444, 0x17171717, + 0xc4c4c4c4, 0xa7a7a7a7, 0x7e7e7e7e, 0x3d3d3d3d, + 0x64646464, 0x5d5d5d5d, 0x19191919, 0x73737373, + 0x60606060, 0x81818181, 0x4f4f4f4f, 0xdcdcdcdc, + 0x22222222, 0x2a2a2a2a, 0x90909090, 0x88888888, + 0x46464646, 0xeeeeeeee, 0xb8b8b8b8, 0x14141414, + 0xdededede, 0x5e5e5e5e, 0x0b0b0b0b, 0xdbdbdbdb, + 0xe0e0e0e0, 0x32323232, 0x3a3a3a3a, 0x0a0a0a0a, + 0x49494949, 0x06060606, 0x24242424, 0x5c5c5c5c, + 0xc2c2c2c2, 0xd3d3d3d3, 0xacacacac, 0x62626262, + 0x91919191, 0x95959595, 0xe4e4e4e4, 0x79797979, + 0xe7e7e7e7, 0xc8c8c8c8, 0x37373737, 0x6d6d6d6d, + 0x8d8d8d8d, 0xd5d5d5d5, 0x4e4e4e4e, 0xa9a9a9a9, + 0x6c6c6c6c, 0x56565656, 0xf4f4f4f4, 0xeaeaeaea, + 0x65656565, 0x7a7a7a7a, 0xaeaeaeae, 0x08080808, + 0xbabababa, 0x78787878, 0x25252525, 0x2e2e2e2e, + 0x1c1c1c1c, 0xa6a6a6a6, 0xb4b4b4b4, 0xc6c6c6c6, + 0xe8e8e8e8, 0xdddddddd, 0x74747474, 0x1f1f1f1f, + 0x4b4b4b4b, 0xbdbdbdbd, 0x8b8b8b8b, 0x8a8a8a8a, + 0x70707070, 0x3e3e3e3e, 0xb5b5b5b5, 0x66666666, + 0x48484848, 0x03030303, 0xf6f6f6f6, 0x0e0e0e0e, + 0x61616161, 0x35353535, 0x57575757, 0xb9b9b9b9, + 0x86868686, 0xc1c1c1c1, 0x1d1d1d1d, 0x9e9e9e9e, + 0xe1e1e1e1, 0xf8f8f8f8, 0x98989898, 0x11111111, + 0x69696969, 0xd9d9d9d9, 0x8e8e8e8e, 0x94949494, + 0x9b9b9b9b, 0x1e1e1e1e, 0x87878787, 0xe9e9e9e9, + 0xcececece, 0x55555555, 0x28282828, 0xdfdfdfdf, + 0x8c8c8c8c, 0xa1a1a1a1, 0x89898989, 0x0d0d0d0d, + 0xbfbfbfbf, 0xe6e6e6e6, 0x42424242, 0x68686868, + 0x41414141, 0x99999999, 0x2d2d2d2d, 0x0f0f0f0f, + 0xb0b0b0b0, 0x54545454, 0xbbbbbbbb, 0x16161616, +}; + +__constant u32 td0[256] = +{ + 0x51f4a750, 0x7e416553, 0x1a17a4c3, 0x3a275e96, + 0x3bab6bcb, 0x1f9d45f1, 0xacfa58ab, 0x4be30393, + 0x2030fa55, 0xad766df6, 0x88cc7691, 0xf5024c25, + 0x4fe5d7fc, 0xc52acbd7, 0x26354480, 0xb562a38f, + 0xdeb15a49, 0x25ba1b67, 0x45ea0e98, 0x5dfec0e1, + 0xc32f7502, 0x814cf012, 0x8d4697a3, 0x6bd3f9c6, + 0x038f5fe7, 0x15929c95, 0xbf6d7aeb, 0x955259da, + 0xd4be832d, 0x587421d3, 0x49e06929, 0x8ec9c844, + 0x75c2896a, 0xf48e7978, 0x99583e6b, 0x27b971dd, + 0xbee14fb6, 0xf088ad17, 0xc920ac66, 0x7dce3ab4, + 0x63df4a18, 0xe51a3182, 0x97513360, 0x62537f45, + 0xb16477e0, 0xbb6bae84, 0xfe81a01c, 0xf9082b94, + 0x70486858, 0x8f45fd19, 0x94de6c87, 0x527bf8b7, + 0xab73d323, 0x724b02e2, 0xe31f8f57, 0x6655ab2a, + 0xb2eb2807, 0x2fb5c203, 0x86c57b9a, 0xd33708a5, + 0x302887f2, 0x23bfa5b2, 0x02036aba, 0xed16825c, + 0x8acf1c2b, 0xa779b492, 0xf307f2f0, 0x4e69e2a1, + 0x65daf4cd, 0x0605bed5, 0xd134621f, 0xc4a6fe8a, + 0x342e539d, 0xa2f355a0, 0x058ae132, 0xa4f6eb75, + 0x0b83ec39, 0x4060efaa, 0x5e719f06, 0xbd6e1051, + 0x3e218af9, 0x96dd063d, 0xdd3e05ae, 0x4de6bd46, + 0x91548db5, 0x71c45d05, 0x0406d46f, 0x605015ff, + 0x1998fb24, 0xd6bde997, 0x894043cc, 0x67d99e77, + 0xb0e842bd, 0x07898b88, 0xe7195b38, 0x79c8eedb, + 0xa17c0a47, 0x7c420fe9, 0xf8841ec9, 0x00000000, + 0x09808683, 0x322bed48, 0x1e1170ac, 0x6c5a724e, + 0xfd0efffb, 0x0f853856, 0x3daed51e, 0x362d3927, + 0x0a0fd964, 0x685ca621, 0x9b5b54d1, 0x24362e3a, + 0x0c0a67b1, 0x9357e70f, 0xb4ee96d2, 0x1b9b919e, + 0x80c0c54f, 0x61dc20a2, 0x5a774b69, 0x1c121a16, + 0xe293ba0a, 0xc0a02ae5, 0x3c22e043, 0x121b171d, + 0x0e090d0b, 0xf28bc7ad, 0x2db6a8b9, 0x141ea9c8, + 0x57f11985, 0xaf75074c, 0xee99ddbb, 0xa37f60fd, + 0xf701269f, 0x5c72f5bc, 0x44663bc5, 0x5bfb7e34, + 0x8b432976, 0xcb23c6dc, 0xb6edfc68, 0xb8e4f163, + 0xd731dcca, 0x42638510, 0x13972240, 0x84c61120, + 0x854a247d, 0xd2bb3df8, 0xaef93211, 0xc729a16d, + 0x1d9e2f4b, 0xdcb230f3, 0x0d8652ec, 0x77c1e3d0, + 0x2bb3166c, 0xa970b999, 0x119448fa, 0x47e96422, + 0xa8fc8cc4, 0xa0f03f1a, 0x567d2cd8, 0x223390ef, + 0x87494ec7, 0xd938d1c1, 0x8ccaa2fe, 0x98d40b36, + 0xa6f581cf, 0xa57ade28, 0xdab78e26, 0x3fadbfa4, + 0x2c3a9de4, 0x5078920d, 0x6a5fcc9b, 0x547e4662, + 0xf68d13c2, 0x90d8b8e8, 0x2e39f75e, 0x82c3aff5, + 0x9f5d80be, 0x69d0937c, 0x6fd52da9, 0xcf2512b3, + 0xc8ac993b, 0x10187da7, 0xe89c636e, 0xdb3bbb7b, + 0xcd267809, 0x6e5918f4, 0xec9ab701, 0x834f9aa8, + 0xe6956e65, 0xaaffe67e, 0x21bccf08, 0xef15e8e6, + 0xbae79bd9, 0x4a6f36ce, 0xea9f09d4, 0x29b07cd6, + 0x31a4b2af, 0x2a3f2331, 0xc6a59430, 0x35a266c0, + 0x744ebc37, 0xfc82caa6, 0xe090d0b0, 0x33a7d815, + 0xf104984a, 0x41ecdaf7, 0x7fcd500e, 0x1791f62f, + 0x764dd68d, 0x43efb04d, 0xccaa4d54, 0xe49604df, + 0x9ed1b5e3, 0x4c6a881b, 0xc12c1fb8, 0x4665517f, + 0x9d5eea04, 0x018c355d, 0xfa877473, 0xfb0b412e, + 0xb3671d5a, 0x92dbd252, 0xe9105633, 0x6dd64713, + 0x9ad7618c, 0x37a10c7a, 0x59f8148e, 0xeb133c89, + 0xcea927ee, 0xb761c935, 0xe11ce5ed, 0x7a47b13c, + 0x9cd2df59, 0x55f2733f, 0x1814ce79, 0x73c737bf, + 0x53f7cdea, 0x5ffdaa5b, 0xdf3d6f14, 0x7844db86, + 0xcaaff381, 0xb968c43e, 0x3824342c, 0xc2a3405f, + 0x161dc372, 0xbce2250c, 0x283c498b, 0xff0d9541, + 0x39a80171, 0x080cb3de, 0xd8b4e49c, 0x6456c190, + 0x7bcb8461, 0xd532b670, 0x486c5c74, 0xd0b85742, +}; + +__constant u32 td1[256] = +{ + 0x5051f4a7, 0x537e4165, 0xc31a17a4, 0x963a275e, + 0xcb3bab6b, 0xf11f9d45, 0xabacfa58, 0x934be303, + 0x552030fa, 0xf6ad766d, 0x9188cc76, 0x25f5024c, + 0xfc4fe5d7, 0xd7c52acb, 0x80263544, 0x8fb562a3, + 0x49deb15a, 0x6725ba1b, 0x9845ea0e, 0xe15dfec0, + 0x02c32f75, 0x12814cf0, 0xa38d4697, 0xc66bd3f9, + 0xe7038f5f, 0x9515929c, 0xebbf6d7a, 0xda955259, + 0x2dd4be83, 0xd3587421, 0x2949e069, 0x448ec9c8, + 0x6a75c289, 0x78f48e79, 0x6b99583e, 0xdd27b971, + 0xb6bee14f, 0x17f088ad, 0x66c920ac, 0xb47dce3a, + 0x1863df4a, 0x82e51a31, 0x60975133, 0x4562537f, + 0xe0b16477, 0x84bb6bae, 0x1cfe81a0, 0x94f9082b, + 0x58704868, 0x198f45fd, 0x8794de6c, 0xb7527bf8, + 0x23ab73d3, 0xe2724b02, 0x57e31f8f, 0x2a6655ab, + 0x07b2eb28, 0x032fb5c2, 0x9a86c57b, 0xa5d33708, + 0xf2302887, 0xb223bfa5, 0xba02036a, 0x5ced1682, + 0x2b8acf1c, 0x92a779b4, 0xf0f307f2, 0xa14e69e2, + 0xcd65daf4, 0xd50605be, 0x1fd13462, 0x8ac4a6fe, + 0x9d342e53, 0xa0a2f355, 0x32058ae1, 0x75a4f6eb, + 0x390b83ec, 0xaa4060ef, 0x065e719f, 0x51bd6e10, + 0xf93e218a, 0x3d96dd06, 0xaedd3e05, 0x464de6bd, + 0xb591548d, 0x0571c45d, 0x6f0406d4, 0xff605015, + 0x241998fb, 0x97d6bde9, 0xcc894043, 0x7767d99e, + 0xbdb0e842, 0x8807898b, 0x38e7195b, 0xdb79c8ee, + 0x47a17c0a, 0xe97c420f, 0xc9f8841e, 0x00000000, + 0x83098086, 0x48322bed, 0xac1e1170, 0x4e6c5a72, + 0xfbfd0eff, 0x560f8538, 0x1e3daed5, 0x27362d39, + 0x640a0fd9, 0x21685ca6, 0xd19b5b54, 0x3a24362e, + 0xb10c0a67, 0x0f9357e7, 0xd2b4ee96, 0x9e1b9b91, + 0x4f80c0c5, 0xa261dc20, 0x695a774b, 0x161c121a, + 0x0ae293ba, 0xe5c0a02a, 0x433c22e0, 0x1d121b17, + 0x0b0e090d, 0xadf28bc7, 0xb92db6a8, 0xc8141ea9, + 0x8557f119, 0x4caf7507, 0xbbee99dd, 0xfda37f60, + 0x9ff70126, 0xbc5c72f5, 0xc544663b, 0x345bfb7e, + 0x768b4329, 0xdccb23c6, 0x68b6edfc, 0x63b8e4f1, + 0xcad731dc, 0x10426385, 0x40139722, 0x2084c611, + 0x7d854a24, 0xf8d2bb3d, 0x11aef932, 0x6dc729a1, + 0x4b1d9e2f, 0xf3dcb230, 0xec0d8652, 0xd077c1e3, + 0x6c2bb316, 0x99a970b9, 0xfa119448, 0x2247e964, + 0xc4a8fc8c, 0x1aa0f03f, 0xd8567d2c, 0xef223390, + 0xc787494e, 0xc1d938d1, 0xfe8ccaa2, 0x3698d40b, + 0xcfa6f581, 0x28a57ade, 0x26dab78e, 0xa43fadbf, + 0xe42c3a9d, 0x0d507892, 0x9b6a5fcc, 0x62547e46, + 0xc2f68d13, 0xe890d8b8, 0x5e2e39f7, 0xf582c3af, + 0xbe9f5d80, 0x7c69d093, 0xa96fd52d, 0xb3cf2512, + 0x3bc8ac99, 0xa710187d, 0x6ee89c63, 0x7bdb3bbb, + 0x09cd2678, 0xf46e5918, 0x01ec9ab7, 0xa8834f9a, + 0x65e6956e, 0x7eaaffe6, 0x0821bccf, 0xe6ef15e8, + 0xd9bae79b, 0xce4a6f36, 0xd4ea9f09, 0xd629b07c, + 0xaf31a4b2, 0x312a3f23, 0x30c6a594, 0xc035a266, + 0x37744ebc, 0xa6fc82ca, 0xb0e090d0, 0x1533a7d8, + 0x4af10498, 0xf741ecda, 0x0e7fcd50, 0x2f1791f6, + 0x8d764dd6, 0x4d43efb0, 0x54ccaa4d, 0xdfe49604, + 0xe39ed1b5, 0x1b4c6a88, 0xb8c12c1f, 0x7f466551, + 0x049d5eea, 0x5d018c35, 0x73fa8774, 0x2efb0b41, + 0x5ab3671d, 0x5292dbd2, 0x33e91056, 0x136dd647, + 0x8c9ad761, 0x7a37a10c, 0x8e59f814, 0x89eb133c, + 0xeecea927, 0x35b761c9, 0xede11ce5, 0x3c7a47b1, + 0x599cd2df, 0x3f55f273, 0x791814ce, 0xbf73c737, + 0xea53f7cd, 0x5b5ffdaa, 0x14df3d6f, 0x867844db, + 0x81caaff3, 0x3eb968c4, 0x2c382434, 0x5fc2a340, + 0x72161dc3, 0x0cbce225, 0x8b283c49, 0x41ff0d95, + 0x7139a801, 0xde080cb3, 0x9cd8b4e4, 0x906456c1, + 0x617bcb84, 0x70d532b6, 0x74486c5c, 0x42d0b857, +}; + +__constant u32 td2[256] = +{ + 0xa75051f4, 0x65537e41, 0xa4c31a17, 0x5e963a27, + 0x6bcb3bab, 0x45f11f9d, 0x58abacfa, 0x03934be3, + 0xfa552030, 0x6df6ad76, 0x769188cc, 0x4c25f502, + 0xd7fc4fe5, 0xcbd7c52a, 0x44802635, 0xa38fb562, + 0x5a49deb1, 0x1b6725ba, 0x0e9845ea, 0xc0e15dfe, + 0x7502c32f, 0xf012814c, 0x97a38d46, 0xf9c66bd3, + 0x5fe7038f, 0x9c951592, 0x7aebbf6d, 0x59da9552, + 0x832dd4be, 0x21d35874, 0x692949e0, 0xc8448ec9, + 0x896a75c2, 0x7978f48e, 0x3e6b9958, 0x71dd27b9, + 0x4fb6bee1, 0xad17f088, 0xac66c920, 0x3ab47dce, + 0x4a1863df, 0x3182e51a, 0x33609751, 0x7f456253, + 0x77e0b164, 0xae84bb6b, 0xa01cfe81, 0x2b94f908, + 0x68587048, 0xfd198f45, 0x6c8794de, 0xf8b7527b, + 0xd323ab73, 0x02e2724b, 0x8f57e31f, 0xab2a6655, + 0x2807b2eb, 0xc2032fb5, 0x7b9a86c5, 0x08a5d337, + 0x87f23028, 0xa5b223bf, 0x6aba0203, 0x825ced16, + 0x1c2b8acf, 0xb492a779, 0xf2f0f307, 0xe2a14e69, + 0xf4cd65da, 0xbed50605, 0x621fd134, 0xfe8ac4a6, + 0x539d342e, 0x55a0a2f3, 0xe132058a, 0xeb75a4f6, + 0xec390b83, 0xefaa4060, 0x9f065e71, 0x1051bd6e, + 0x8af93e21, 0x063d96dd, 0x05aedd3e, 0xbd464de6, + 0x8db59154, 0x5d0571c4, 0xd46f0406, 0x15ff6050, + 0xfb241998, 0xe997d6bd, 0x43cc8940, 0x9e7767d9, + 0x42bdb0e8, 0x8b880789, 0x5b38e719, 0xeedb79c8, + 0x0a47a17c, 0x0fe97c42, 0x1ec9f884, 0x00000000, + 0x86830980, 0xed48322b, 0x70ac1e11, 0x724e6c5a, + 0xfffbfd0e, 0x38560f85, 0xd51e3dae, 0x3927362d, + 0xd9640a0f, 0xa621685c, 0x54d19b5b, 0x2e3a2436, + 0x67b10c0a, 0xe70f9357, 0x96d2b4ee, 0x919e1b9b, + 0xc54f80c0, 0x20a261dc, 0x4b695a77, 0x1a161c12, + 0xba0ae293, 0x2ae5c0a0, 0xe0433c22, 0x171d121b, + 0x0d0b0e09, 0xc7adf28b, 0xa8b92db6, 0xa9c8141e, + 0x198557f1, 0x074caf75, 0xddbbee99, 0x60fda37f, + 0x269ff701, 0xf5bc5c72, 0x3bc54466, 0x7e345bfb, + 0x29768b43, 0xc6dccb23, 0xfc68b6ed, 0xf163b8e4, + 0xdccad731, 0x85104263, 0x22401397, 0x112084c6, + 0x247d854a, 0x3df8d2bb, 0x3211aef9, 0xa16dc729, + 0x2f4b1d9e, 0x30f3dcb2, 0x52ec0d86, 0xe3d077c1, + 0x166c2bb3, 0xb999a970, 0x48fa1194, 0x642247e9, + 0x8cc4a8fc, 0x3f1aa0f0, 0x2cd8567d, 0x90ef2233, + 0x4ec78749, 0xd1c1d938, 0xa2fe8cca, 0x0b3698d4, + 0x81cfa6f5, 0xde28a57a, 0x8e26dab7, 0xbfa43fad, + 0x9de42c3a, 0x920d5078, 0xcc9b6a5f, 0x4662547e, + 0x13c2f68d, 0xb8e890d8, 0xf75e2e39, 0xaff582c3, + 0x80be9f5d, 0x937c69d0, 0x2da96fd5, 0x12b3cf25, + 0x993bc8ac, 0x7da71018, 0x636ee89c, 0xbb7bdb3b, + 0x7809cd26, 0x18f46e59, 0xb701ec9a, 0x9aa8834f, + 0x6e65e695, 0xe67eaaff, 0xcf0821bc, 0xe8e6ef15, + 0x9bd9bae7, 0x36ce4a6f, 0x09d4ea9f, 0x7cd629b0, + 0xb2af31a4, 0x23312a3f, 0x9430c6a5, 0x66c035a2, + 0xbc37744e, 0xcaa6fc82, 0xd0b0e090, 0xd81533a7, + 0x984af104, 0xdaf741ec, 0x500e7fcd, 0xf62f1791, + 0xd68d764d, 0xb04d43ef, 0x4d54ccaa, 0x04dfe496, + 0xb5e39ed1, 0x881b4c6a, 0x1fb8c12c, 0x517f4665, + 0xea049d5e, 0x355d018c, 0x7473fa87, 0x412efb0b, + 0x1d5ab367, 0xd25292db, 0x5633e910, 0x47136dd6, + 0x618c9ad7, 0x0c7a37a1, 0x148e59f8, 0x3c89eb13, + 0x27eecea9, 0xc935b761, 0xe5ede11c, 0xb13c7a47, + 0xdf599cd2, 0x733f55f2, 0xce791814, 0x37bf73c7, + 0xcdea53f7, 0xaa5b5ffd, 0x6f14df3d, 0xdb867844, + 0xf381caaf, 0xc43eb968, 0x342c3824, 0x405fc2a3, + 0xc372161d, 0x250cbce2, 0x498b283c, 0x9541ff0d, + 0x017139a8, 0xb3de080c, 0xe49cd8b4, 0xc1906456, + 0x84617bcb, 0xb670d532, 0x5c74486c, 0x5742d0b8, +}; + +__constant u32 td3[256] = +{ + 0xf4a75051, 0x4165537e, 0x17a4c31a, 0x275e963a, + 0xab6bcb3b, 0x9d45f11f, 0xfa58abac, 0xe303934b, + 0x30fa5520, 0x766df6ad, 0xcc769188, 0x024c25f5, + 0xe5d7fc4f, 0x2acbd7c5, 0x35448026, 0x62a38fb5, + 0xb15a49de, 0xba1b6725, 0xea0e9845, 0xfec0e15d, + 0x2f7502c3, 0x4cf01281, 0x4697a38d, 0xd3f9c66b, + 0x8f5fe703, 0x929c9515, 0x6d7aebbf, 0x5259da95, + 0xbe832dd4, 0x7421d358, 0xe0692949, 0xc9c8448e, + 0xc2896a75, 0x8e7978f4, 0x583e6b99, 0xb971dd27, + 0xe14fb6be, 0x88ad17f0, 0x20ac66c9, 0xce3ab47d, + 0xdf4a1863, 0x1a3182e5, 0x51336097, 0x537f4562, + 0x6477e0b1, 0x6bae84bb, 0x81a01cfe, 0x082b94f9, + 0x48685870, 0x45fd198f, 0xde6c8794, 0x7bf8b752, + 0x73d323ab, 0x4b02e272, 0x1f8f57e3, 0x55ab2a66, + 0xeb2807b2, 0xb5c2032f, 0xc57b9a86, 0x3708a5d3, + 0x2887f230, 0xbfa5b223, 0x036aba02, 0x16825ced, + 0xcf1c2b8a, 0x79b492a7, 0x07f2f0f3, 0x69e2a14e, + 0xdaf4cd65, 0x05bed506, 0x34621fd1, 0xa6fe8ac4, + 0x2e539d34, 0xf355a0a2, 0x8ae13205, 0xf6eb75a4, + 0x83ec390b, 0x60efaa40, 0x719f065e, 0x6e1051bd, + 0x218af93e, 0xdd063d96, 0x3e05aedd, 0xe6bd464d, + 0x548db591, 0xc45d0571, 0x06d46f04, 0x5015ff60, + 0x98fb2419, 0xbde997d6, 0x4043cc89, 0xd99e7767, + 0xe842bdb0, 0x898b8807, 0x195b38e7, 0xc8eedb79, + 0x7c0a47a1, 0x420fe97c, 0x841ec9f8, 0x00000000, + 0x80868309, 0x2bed4832, 0x1170ac1e, 0x5a724e6c, + 0x0efffbfd, 0x8538560f, 0xaed51e3d, 0x2d392736, + 0x0fd9640a, 0x5ca62168, 0x5b54d19b, 0x362e3a24, + 0x0a67b10c, 0x57e70f93, 0xee96d2b4, 0x9b919e1b, + 0xc0c54f80, 0xdc20a261, 0x774b695a, 0x121a161c, + 0x93ba0ae2, 0xa02ae5c0, 0x22e0433c, 0x1b171d12, + 0x090d0b0e, 0x8bc7adf2, 0xb6a8b92d, 0x1ea9c814, + 0xf1198557, 0x75074caf, 0x99ddbbee, 0x7f60fda3, + 0x01269ff7, 0x72f5bc5c, 0x663bc544, 0xfb7e345b, + 0x4329768b, 0x23c6dccb, 0xedfc68b6, 0xe4f163b8, + 0x31dccad7, 0x63851042, 0x97224013, 0xc6112084, + 0x4a247d85, 0xbb3df8d2, 0xf93211ae, 0x29a16dc7, + 0x9e2f4b1d, 0xb230f3dc, 0x8652ec0d, 0xc1e3d077, + 0xb3166c2b, 0x70b999a9, 0x9448fa11, 0xe9642247, + 0xfc8cc4a8, 0xf03f1aa0, 0x7d2cd856, 0x3390ef22, + 0x494ec787, 0x38d1c1d9, 0xcaa2fe8c, 0xd40b3698, + 0xf581cfa6, 0x7ade28a5, 0xb78e26da, 0xadbfa43f, + 0x3a9de42c, 0x78920d50, 0x5fcc9b6a, 0x7e466254, + 0x8d13c2f6, 0xd8b8e890, 0x39f75e2e, 0xc3aff582, + 0x5d80be9f, 0xd0937c69, 0xd52da96f, 0x2512b3cf, + 0xac993bc8, 0x187da710, 0x9c636ee8, 0x3bbb7bdb, + 0x267809cd, 0x5918f46e, 0x9ab701ec, 0x4f9aa883, + 0x956e65e6, 0xffe67eaa, 0xbccf0821, 0x15e8e6ef, + 0xe79bd9ba, 0x6f36ce4a, 0x9f09d4ea, 0xb07cd629, + 0xa4b2af31, 0x3f23312a, 0xa59430c6, 0xa266c035, + 0x4ebc3774, 0x82caa6fc, 0x90d0b0e0, 0xa7d81533, + 0x04984af1, 0xecdaf741, 0xcd500e7f, 0x91f62f17, + 0x4dd68d76, 0xefb04d43, 0xaa4d54cc, 0x9604dfe4, + 0xd1b5e39e, 0x6a881b4c, 0x2c1fb8c1, 0x65517f46, + 0x5eea049d, 0x8c355d01, 0x877473fa, 0x0b412efb, + 0x671d5ab3, 0xdbd25292, 0x105633e9, 0xd647136d, + 0xd7618c9a, 0xa10c7a37, 0xf8148e59, 0x133c89eb, + 0xa927eece, 0x61c935b7, 0x1ce5ede1, 0x47b13c7a, + 0xd2df599c, 0xf2733f55, 0x14ce7918, 0xc737bf73, + 0xf7cdea53, 0xfdaa5b5f, 0x3d6f14df, 0x44db8678, + 0xaff381ca, 0x68c43eb9, 0x24342c38, 0xa3405fc2, + 0x1dc37216, 0xe2250cbc, 0x3c498b28, 0x0d9541ff, + 0xa8017139, 0x0cb3de08, 0xb4e49cd8, 0x56c19064, + 0xcb84617b, 0x32b670d5, 0x6c5c7448, 0xb85742d0, +}; + +__constant u32 td4[256] = +{ + 0x52525252, 0x09090909, 0x6a6a6a6a, 0xd5d5d5d5, + 0x30303030, 0x36363636, 0xa5a5a5a5, 0x38383838, + 0xbfbfbfbf, 0x40404040, 0xa3a3a3a3, 0x9e9e9e9e, + 0x81818181, 0xf3f3f3f3, 0xd7d7d7d7, 0xfbfbfbfb, + 0x7c7c7c7c, 0xe3e3e3e3, 0x39393939, 0x82828282, + 0x9b9b9b9b, 0x2f2f2f2f, 0xffffffff, 0x87878787, + 0x34343434, 0x8e8e8e8e, 0x43434343, 0x44444444, + 0xc4c4c4c4, 0xdededede, 0xe9e9e9e9, 0xcbcbcbcb, + 0x54545454, 0x7b7b7b7b, 0x94949494, 0x32323232, + 0xa6a6a6a6, 0xc2c2c2c2, 0x23232323, 0x3d3d3d3d, + 0xeeeeeeee, 0x4c4c4c4c, 0x95959595, 0x0b0b0b0b, + 0x42424242, 0xfafafafa, 0xc3c3c3c3, 0x4e4e4e4e, + 0x08080808, 0x2e2e2e2e, 0xa1a1a1a1, 0x66666666, + 0x28282828, 0xd9d9d9d9, 0x24242424, 0xb2b2b2b2, + 0x76767676, 0x5b5b5b5b, 0xa2a2a2a2, 0x49494949, + 0x6d6d6d6d, 0x8b8b8b8b, 0xd1d1d1d1, 0x25252525, + 0x72727272, 0xf8f8f8f8, 0xf6f6f6f6, 0x64646464, + 0x86868686, 0x68686868, 0x98989898, 0x16161616, + 0xd4d4d4d4, 0xa4a4a4a4, 0x5c5c5c5c, 0xcccccccc, + 0x5d5d5d5d, 0x65656565, 0xb6b6b6b6, 0x92929292, + 0x6c6c6c6c, 0x70707070, 0x48484848, 0x50505050, + 0xfdfdfdfd, 0xedededed, 0xb9b9b9b9, 0xdadadada, + 0x5e5e5e5e, 0x15151515, 0x46464646, 0x57575757, + 0xa7a7a7a7, 0x8d8d8d8d, 0x9d9d9d9d, 0x84848484, + 0x90909090, 0xd8d8d8d8, 0xabababab, 0x00000000, + 0x8c8c8c8c, 0xbcbcbcbc, 0xd3d3d3d3, 0x0a0a0a0a, + 0xf7f7f7f7, 0xe4e4e4e4, 0x58585858, 0x05050505, + 0xb8b8b8b8, 0xb3b3b3b3, 0x45454545, 0x06060606, + 0xd0d0d0d0, 0x2c2c2c2c, 0x1e1e1e1e, 0x8f8f8f8f, + 0xcacacaca, 0x3f3f3f3f, 0x0f0f0f0f, 0x02020202, + 0xc1c1c1c1, 0xafafafaf, 0xbdbdbdbd, 0x03030303, + 0x01010101, 0x13131313, 0x8a8a8a8a, 0x6b6b6b6b, + 0x3a3a3a3a, 0x91919191, 0x11111111, 0x41414141, + 0x4f4f4f4f, 0x67676767, 0xdcdcdcdc, 0xeaeaeaea, + 0x97979797, 0xf2f2f2f2, 0xcfcfcfcf, 0xcececece, + 0xf0f0f0f0, 0xb4b4b4b4, 0xe6e6e6e6, 0x73737373, + 0x96969696, 0xacacacac, 0x74747474, 0x22222222, + 0xe7e7e7e7, 0xadadadad, 0x35353535, 0x85858585, + 0xe2e2e2e2, 0xf9f9f9f9, 0x37373737, 0xe8e8e8e8, + 0x1c1c1c1c, 0x75757575, 0xdfdfdfdf, 0x6e6e6e6e, + 0x47474747, 0xf1f1f1f1, 0x1a1a1a1a, 0x71717171, + 0x1d1d1d1d, 0x29292929, 0xc5c5c5c5, 0x89898989, + 0x6f6f6f6f, 0xb7b7b7b7, 0x62626262, 0x0e0e0e0e, + 0xaaaaaaaa, 0x18181818, 0xbebebebe, 0x1b1b1b1b, + 0xfcfcfcfc, 0x56565656, 0x3e3e3e3e, 0x4b4b4b4b, + 0xc6c6c6c6, 0xd2d2d2d2, 0x79797979, 0x20202020, + 0x9a9a9a9a, 0xdbdbdbdb, 0xc0c0c0c0, 0xfefefefe, + 0x78787878, 0xcdcdcdcd, 0x5a5a5a5a, 0xf4f4f4f4, + 0x1f1f1f1f, 0xdddddddd, 0xa8a8a8a8, 0x33333333, + 0x88888888, 0x07070707, 0xc7c7c7c7, 0x31313131, + 0xb1b1b1b1, 0x12121212, 0x10101010, 0x59595959, + 0x27272727, 0x80808080, 0xecececec, 0x5f5f5f5f, + 0x60606060, 0x51515151, 0x7f7f7f7f, 0xa9a9a9a9, + 0x19191919, 0xb5b5b5b5, 0x4a4a4a4a, 0x0d0d0d0d, + 0x2d2d2d2d, 0xe5e5e5e5, 0x7a7a7a7a, 0x9f9f9f9f, + 0x93939393, 0xc9c9c9c9, 0x9c9c9c9c, 0xefefefef, + 0xa0a0a0a0, 0xe0e0e0e0, 0x3b3b3b3b, 0x4d4d4d4d, + 0xaeaeaeae, 0x2a2a2a2a, 0xf5f5f5f5, 0xb0b0b0b0, + 0xc8c8c8c8, 0xebebebeb, 0xbbbbbbbb, 0x3c3c3c3c, + 0x83838383, 0x53535353, 0x99999999, 0x61616161, + 0x17171717, 0x2b2b2b2b, 0x04040404, 0x7e7e7e7e, + 0xbabababa, 0x77777777, 0xd6d6d6d6, 0x26262626, + 0xe1e1e1e1, 0x69696969, 0x14141414, 0x63636363, + 0x55555555, 0x21212121, 0x0c0c0c0c, 0x7d7d7d7d, +}; + +__constant u32 rcon[] = +{ + 0x01000000, 0x02000000, 0x04000000, 0x08000000, + 0x10000000, 0x20000000, 0x40000000, 0x80000000, + 0x1b000000, 0x36000000, +}; + +static void AES128_ExpandKey (u32 *userkey, u32 *rek, __local u32 s_te0[256], __local u32 s_te1[256], __local u32 s_te2[256], __local u32 s_te3[256], __local u32 s_te4[256]) +{ + rek[0] = userkey[0]; + rek[1] = userkey[1]; + rek[2] = userkey[2]; + rek[3] = userkey[3]; + + #pragma unroll 10 + for (u32 i = 0, j = 0; i < 10; i += 1, j += 4) + { + u32 temp = rek[j + 3]; + + temp = (s_te2[(temp >> 16) & 0xff] & 0xff000000) + ^ (s_te3[(temp >> 8) & 0xff] & 0x00ff0000) + ^ (s_te0[(temp >> 0) & 0xff] & 0x0000ff00) + ^ (s_te1[(temp >> 24) & 0xff] & 0x000000ff); + + rek[j + 4] = rek[j + 0] + ^ temp + ^ rcon[i]; + + rek[j + 5] = rek[j + 1] ^ rek[j + 4]; + rek[j + 6] = rek[j + 2] ^ rek[j + 5]; + rek[j + 7] = rek[j + 3] ^ rek[j + 6]; + } +} + +static void AES128_InvertKey (u32 *rdk, __local u32 s_td0[256], __local u32 s_td1[256], __local u32 s_td2[256], __local u32 s_td3[256], __local u32 s_td4[256], __local u32 s_te0[256], __local u32 s_te1[256], __local u32 s_te2[256], __local u32 s_te3[256], __local u32 s_te4[256]) +{ + for (u32 i = 0, j = 40; i < j; i += 4, j -= 4) + { + u32 temp; + + temp = rdk[i + 0]; rdk[i + 0] = rdk[j + 0]; rdk[j + 0] = temp; + temp = rdk[i + 1]; rdk[i + 1] = rdk[j + 1]; rdk[j + 1] = temp; + temp = rdk[i + 2]; rdk[i + 2] = rdk[j + 2]; rdk[j + 2] = temp; + temp = rdk[i + 3]; rdk[i + 3] = rdk[j + 3]; rdk[j + 3] = temp; + } + + for (u32 i = 1, j = 4; i < 10; i += 1, j += 4) + { + rdk[j + 0] = + s_td0[s_te1[(rdk[j + 0] >> 24) & 0xff] & 0xff] ^ + s_td1[s_te1[(rdk[j + 0] >> 16) & 0xff] & 0xff] ^ + s_td2[s_te1[(rdk[j + 0] >> 8) & 0xff] & 0xff] ^ + s_td3[s_te1[(rdk[j + 0] >> 0) & 0xff] & 0xff]; + + rdk[j + 1] = + s_td0[s_te1[(rdk[j + 1] >> 24) & 0xff] & 0xff] ^ + s_td1[s_te1[(rdk[j + 1] >> 16) & 0xff] & 0xff] ^ + s_td2[s_te1[(rdk[j + 1] >> 8) & 0xff] & 0xff] ^ + s_td3[s_te1[(rdk[j + 1] >> 0) & 0xff] & 0xff]; + + rdk[j + 2] = + s_td0[s_te1[(rdk[j + 2] >> 24) & 0xff] & 0xff] ^ + s_td1[s_te1[(rdk[j + 2] >> 16) & 0xff] & 0xff] ^ + s_td2[s_te1[(rdk[j + 2] >> 8) & 0xff] & 0xff] ^ + s_td3[s_te1[(rdk[j + 2] >> 0) & 0xff] & 0xff]; + + rdk[j + 3] = + s_td0[s_te1[(rdk[j + 3] >> 24) & 0xff] & 0xff] ^ + s_td1[s_te1[(rdk[j + 3] >> 16) & 0xff] & 0xff] ^ + s_td2[s_te1[(rdk[j + 3] >> 8) & 0xff] & 0xff] ^ + s_td3[s_te1[(rdk[j + 3] >> 0) & 0xff] & 0xff]; + } +} + +static void AES128_decrypt (const u32 *in, u32 *out, const u32 *rdk, __local u32 s_td0[256], __local u32 s_td1[256], __local u32 s_td2[256], __local u32 s_td3[256], __local u32 s_td4[256]) +{ + u32 s0 = in[0] ^ rdk[0]; + u32 s1 = in[1] ^ rdk[1]; + u32 s2 = in[2] ^ rdk[2]; + u32 s3 = in[3] ^ rdk[3]; + + u32 t0; + u32 t1; + u32 t2; + u32 t3; + + t0 = s_td0[s0 >> 24] ^ s_td1[(s3 >> 16) & 0xff] ^ s_td2[(s2 >> 8) & 0xff] ^ s_td3[s1 & 0xff] ^ rdk[ 4]; + t1 = s_td0[s1 >> 24] ^ s_td1[(s0 >> 16) & 0xff] ^ s_td2[(s3 >> 8) & 0xff] ^ s_td3[s2 & 0xff] ^ rdk[ 5]; + t2 = s_td0[s2 >> 24] ^ s_td1[(s1 >> 16) & 0xff] ^ s_td2[(s0 >> 8) & 0xff] ^ s_td3[s3 & 0xff] ^ rdk[ 6]; + t3 = s_td0[s3 >> 24] ^ s_td1[(s2 >> 16) & 0xff] ^ s_td2[(s1 >> 8) & 0xff] ^ s_td3[s0 & 0xff] ^ rdk[ 7]; + s0 = s_td0[t0 >> 24] ^ s_td1[(t3 >> 16) & 0xff] ^ s_td2[(t2 >> 8) & 0xff] ^ s_td3[t1 & 0xff] ^ rdk[ 8]; + s1 = s_td0[t1 >> 24] ^ s_td1[(t0 >> 16) & 0xff] ^ s_td2[(t3 >> 8) & 0xff] ^ s_td3[t2 & 0xff] ^ rdk[ 9]; + s2 = s_td0[t2 >> 24] ^ s_td1[(t1 >> 16) & 0xff] ^ s_td2[(t0 >> 8) & 0xff] ^ s_td3[t3 & 0xff] ^ rdk[10]; + s3 = s_td0[t3 >> 24] ^ s_td1[(t2 >> 16) & 0xff] ^ s_td2[(t1 >> 8) & 0xff] ^ s_td3[t0 & 0xff] ^ rdk[11]; + t0 = s_td0[s0 >> 24] ^ s_td1[(s3 >> 16) & 0xff] ^ s_td2[(s2 >> 8) & 0xff] ^ s_td3[s1 & 0xff] ^ rdk[12]; + t1 = s_td0[s1 >> 24] ^ s_td1[(s0 >> 16) & 0xff] ^ s_td2[(s3 >> 8) & 0xff] ^ s_td3[s2 & 0xff] ^ rdk[13]; + t2 = s_td0[s2 >> 24] ^ s_td1[(s1 >> 16) & 0xff] ^ s_td2[(s0 >> 8) & 0xff] ^ s_td3[s3 & 0xff] ^ rdk[14]; + t3 = s_td0[s3 >> 24] ^ s_td1[(s2 >> 16) & 0xff] ^ s_td2[(s1 >> 8) & 0xff] ^ s_td3[s0 & 0xff] ^ rdk[15]; + s0 = s_td0[t0 >> 24] ^ s_td1[(t3 >> 16) & 0xff] ^ s_td2[(t2 >> 8) & 0xff] ^ s_td3[t1 & 0xff] ^ rdk[16]; + s1 = s_td0[t1 >> 24] ^ s_td1[(t0 >> 16) & 0xff] ^ s_td2[(t3 >> 8) & 0xff] ^ s_td3[t2 & 0xff] ^ rdk[17]; + s2 = s_td0[t2 >> 24] ^ s_td1[(t1 >> 16) & 0xff] ^ s_td2[(t0 >> 8) & 0xff] ^ s_td3[t3 & 0xff] ^ rdk[18]; + s3 = s_td0[t3 >> 24] ^ s_td1[(t2 >> 16) & 0xff] ^ s_td2[(t1 >> 8) & 0xff] ^ s_td3[t0 & 0xff] ^ rdk[19]; + t0 = s_td0[s0 >> 24] ^ s_td1[(s3 >> 16) & 0xff] ^ s_td2[(s2 >> 8) & 0xff] ^ s_td3[s1 & 0xff] ^ rdk[20]; + t1 = s_td0[s1 >> 24] ^ s_td1[(s0 >> 16) & 0xff] ^ s_td2[(s3 >> 8) & 0xff] ^ s_td3[s2 & 0xff] ^ rdk[21]; + t2 = s_td0[s2 >> 24] ^ s_td1[(s1 >> 16) & 0xff] ^ s_td2[(s0 >> 8) & 0xff] ^ s_td3[s3 & 0xff] ^ rdk[22]; + t3 = s_td0[s3 >> 24] ^ s_td1[(s2 >> 16) & 0xff] ^ s_td2[(s1 >> 8) & 0xff] ^ s_td3[s0 & 0xff] ^ rdk[23]; + s0 = s_td0[t0 >> 24] ^ s_td1[(t3 >> 16) & 0xff] ^ s_td2[(t2 >> 8) & 0xff] ^ s_td3[t1 & 0xff] ^ rdk[24]; + s1 = s_td0[t1 >> 24] ^ s_td1[(t0 >> 16) & 0xff] ^ s_td2[(t3 >> 8) & 0xff] ^ s_td3[t2 & 0xff] ^ rdk[25]; + s2 = s_td0[t2 >> 24] ^ s_td1[(t1 >> 16) & 0xff] ^ s_td2[(t0 >> 8) & 0xff] ^ s_td3[t3 & 0xff] ^ rdk[26]; + s3 = s_td0[t3 >> 24] ^ s_td1[(t2 >> 16) & 0xff] ^ s_td2[(t1 >> 8) & 0xff] ^ s_td3[t0 & 0xff] ^ rdk[27]; + t0 = s_td0[s0 >> 24] ^ s_td1[(s3 >> 16) & 0xff] ^ s_td2[(s2 >> 8) & 0xff] ^ s_td3[s1 & 0xff] ^ rdk[28]; + t1 = s_td0[s1 >> 24] ^ s_td1[(s0 >> 16) & 0xff] ^ s_td2[(s3 >> 8) & 0xff] ^ s_td3[s2 & 0xff] ^ rdk[29]; + t2 = s_td0[s2 >> 24] ^ s_td1[(s1 >> 16) & 0xff] ^ s_td2[(s0 >> 8) & 0xff] ^ s_td3[s3 & 0xff] ^ rdk[30]; + t3 = s_td0[s3 >> 24] ^ s_td1[(s2 >> 16) & 0xff] ^ s_td2[(s1 >> 8) & 0xff] ^ s_td3[s0 & 0xff] ^ rdk[31]; + s0 = s_td0[t0 >> 24] ^ s_td1[(t3 >> 16) & 0xff] ^ s_td2[(t2 >> 8) & 0xff] ^ s_td3[t1 & 0xff] ^ rdk[32]; + s1 = s_td0[t1 >> 24] ^ s_td1[(t0 >> 16) & 0xff] ^ s_td2[(t3 >> 8) & 0xff] ^ s_td3[t2 & 0xff] ^ rdk[33]; + s2 = s_td0[t2 >> 24] ^ s_td1[(t1 >> 16) & 0xff] ^ s_td2[(t0 >> 8) & 0xff] ^ s_td3[t3 & 0xff] ^ rdk[34]; + s3 = s_td0[t3 >> 24] ^ s_td1[(t2 >> 16) & 0xff] ^ s_td2[(t1 >> 8) & 0xff] ^ s_td3[t0 & 0xff] ^ rdk[35]; + t0 = s_td0[s0 >> 24] ^ s_td1[(s3 >> 16) & 0xff] ^ s_td2[(s2 >> 8) & 0xff] ^ s_td3[s1 & 0xff] ^ rdk[36]; + t1 = s_td0[s1 >> 24] ^ s_td1[(s0 >> 16) & 0xff] ^ s_td2[(s3 >> 8) & 0xff] ^ s_td3[s2 & 0xff] ^ rdk[37]; + t2 = s_td0[s2 >> 24] ^ s_td1[(s1 >> 16) & 0xff] ^ s_td2[(s0 >> 8) & 0xff] ^ s_td3[s3 & 0xff] ^ rdk[38]; + t3 = s_td0[s3 >> 24] ^ s_td1[(s2 >> 16) & 0xff] ^ s_td2[(s1 >> 8) & 0xff] ^ s_td3[s0 & 0xff] ^ rdk[39]; + + out[0] = (s_td4[(t0 >> 24) & 0xff] & 0xff000000) + ^ (s_td4[(t3 >> 16) & 0xff] & 0x00ff0000) + ^ (s_td4[(t2 >> 8) & 0xff] & 0x0000ff00) + ^ (s_td4[(t1 >> 0) & 0xff] & 0x000000ff) + ^ rdk[40]; + + out[1] = (s_td4[(t1 >> 24) & 0xff] & 0xff000000) + ^ (s_td4[(t0 >> 16) & 0xff] & 0x00ff0000) + ^ (s_td4[(t3 >> 8) & 0xff] & 0x0000ff00) + ^ (s_td4[(t2 >> 0) & 0xff] & 0x000000ff) + ^ rdk[41]; + + out[2] = (s_td4[(t2 >> 24) & 0xff] & 0xff000000) + ^ (s_td4[(t1 >> 16) & 0xff] & 0x00ff0000) + ^ (s_td4[(t0 >> 8) & 0xff] & 0x0000ff00) + ^ (s_td4[(t3 >> 0) & 0xff] & 0x000000ff) + ^ rdk[42]; + + out[3] = (s_td4[(t3 >> 24) & 0xff] & 0xff000000) + ^ (s_td4[(t2 >> 16) & 0xff] & 0x00ff0000) + ^ (s_td4[(t1 >> 8) & 0xff] & 0x0000ff00) + ^ (s_td4[(t0 >> 0) & 0xff] & 0x000000ff) + ^ rdk[43]; +} + +static void sha1_transform (const u32x w0[4], const u32x w1[4], const u32x w2[4], const u32x w3[4], u32x digest[5]) +{ + u32x A = digest[0]; + u32x B = digest[1]; + u32x C = digest[2]; + u32x D = digest[3]; + u32x E = digest[4]; + + u32x w0_t = w0[0]; + u32x w1_t = w0[1]; + u32x w2_t = w0[2]; + u32x w3_t = w0[3]; + u32x w4_t = w1[0]; + u32x w5_t = w1[1]; + u32x w6_t = w1[2]; + u32x w7_t = w1[3]; + u32x w8_t = w2[0]; + u32x w9_t = w2[1]; + u32x wa_t = w2[2]; + u32x wb_t = w2[3]; + u32x wc_t = w3[0]; + u32x wd_t = w3[1]; + u32x we_t = w3[2]; + u32x wf_t = w3[3]; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, A, B, C, D, E, w0_t); + SHA1_STEP (SHA1_F0o, E, A, B, C, D, w1_t); + SHA1_STEP (SHA1_F0o, D, E, A, B, C, w2_t); + SHA1_STEP (SHA1_F0o, C, D, E, A, B, w3_t); + SHA1_STEP (SHA1_F0o, B, C, D, E, A, w4_t); + SHA1_STEP (SHA1_F0o, A, B, C, D, E, w5_t); + SHA1_STEP (SHA1_F0o, E, A, B, C, D, w6_t); + SHA1_STEP (SHA1_F0o, D, E, A, B, C, w7_t); + SHA1_STEP (SHA1_F0o, C, D, E, A, B, w8_t); + SHA1_STEP (SHA1_F0o, B, C, D, E, A, w9_t); + SHA1_STEP (SHA1_F0o, A, B, C, D, E, wa_t); + SHA1_STEP (SHA1_F0o, E, A, B, C, D, wb_t); + SHA1_STEP (SHA1_F0o, D, E, A, B, C, wc_t); + SHA1_STEP (SHA1_F0o, C, D, E, A, B, wd_t); + SHA1_STEP (SHA1_F0o, B, C, D, E, A, we_t); + SHA1_STEP (SHA1_F0o, A, B, C, D, E, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F0o, E, A, B, C, D, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F0o, D, E, A, B, C, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F0o, C, D, E, A, B, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F0o, B, C, D, E, A, w3_t); + + #undef K + #define K SHA1C01 + + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w7_t); + + #undef K + #define K SHA1C02 + + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, wb_t); + + #undef K + #define K SHA1C03 + + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, wf_t); + + digest[0] += A; + digest[1] += B; + digest[2] += C; + digest[3] += D; + digest[4] += E; +} + +static void hmac_sha1_pad (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], u32x ipad[5], u32x opad[5]) +{ + w0[0] = w0[0] ^ 0x36363636; + w0[1] = w0[1] ^ 0x36363636; + w0[2] = w0[2] ^ 0x36363636; + w0[3] = w0[3] ^ 0x36363636; + w1[0] = w1[0] ^ 0x36363636; + w1[1] = w1[1] ^ 0x36363636; + w1[2] = w1[2] ^ 0x36363636; + w1[3] = w1[3] ^ 0x36363636; + w2[0] = w2[0] ^ 0x36363636; + w2[1] = w2[1] ^ 0x36363636; + w2[2] = w2[2] ^ 0x36363636; + w2[3] = w2[3] ^ 0x36363636; + w3[0] = w3[0] ^ 0x36363636; + w3[1] = w3[1] ^ 0x36363636; + w3[2] = w3[2] ^ 0x36363636; + w3[3] = w3[3] ^ 0x36363636; + + ipad[0] = SHA1M_A; + ipad[1] = SHA1M_B; + ipad[2] = SHA1M_C; + ipad[3] = SHA1M_D; + ipad[4] = SHA1M_E; + + sha1_transform (w0, w1, w2, w3, ipad); + + w0[0] = w0[0] ^ 0x6a6a6a6a; + w0[1] = w0[1] ^ 0x6a6a6a6a; + w0[2] = w0[2] ^ 0x6a6a6a6a; + w0[3] = w0[3] ^ 0x6a6a6a6a; + w1[0] = w1[0] ^ 0x6a6a6a6a; + w1[1] = w1[1] ^ 0x6a6a6a6a; + w1[2] = w1[2] ^ 0x6a6a6a6a; + w1[3] = w1[3] ^ 0x6a6a6a6a; + w2[0] = w2[0] ^ 0x6a6a6a6a; + w2[1] = w2[1] ^ 0x6a6a6a6a; + w2[2] = w2[2] ^ 0x6a6a6a6a; + w2[3] = w2[3] ^ 0x6a6a6a6a; + w3[0] = w3[0] ^ 0x6a6a6a6a; + w3[1] = w3[1] ^ 0x6a6a6a6a; + w3[2] = w3[2] ^ 0x6a6a6a6a; + w3[3] = w3[3] ^ 0x6a6a6a6a; + + opad[0] = SHA1M_A; + opad[1] = SHA1M_B; + opad[2] = SHA1M_C; + opad[3] = SHA1M_D; + opad[4] = SHA1M_E; + + sha1_transform (w0, w1, w2, w3, opad); +} + +static void hmac_sha1_run (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], u32x ipad[5], u32x opad[5], u32x digest[5]) +{ + digest[0] = ipad[0]; + digest[1] = ipad[1]; + digest[2] = ipad[2]; + digest[3] = ipad[3]; + digest[4] = ipad[4]; + + sha1_transform (w0, w1, w2, w3, digest); + + w0[0] = digest[0]; + w0[1] = digest[1]; + w0[2] = digest[2]; + w0[3] = digest[3]; + w1[0] = digest[4]; + w1[1] = 0x80000000; + w1[2] = 0; + w1[3] = 0; + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = (64 + 20) * 8; + + digest[0] = opad[0]; + digest[1] = opad[1]; + digest[2] = opad[2]; + digest[3] = opad[3]; + digest[4] = opad[4]; + + sha1_transform (w0, w1, w2, w3, digest); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m06600_init (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global agilekey_tmp_t *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = pws[gid].i[ 8]; + w2[1] = pws[gid].i[ 9]; + w2[2] = pws[gid].i[10]; + w2[3] = pws[gid].i[11]; + + u32x w3[4]; + + w3[0] = pws[gid].i[12]; + w3[1] = pws[gid].i[13]; + w3[2] = pws[gid].i[14]; + w3[3] = pws[gid].i[15]; + + /** + * salt + */ + + u32 salt_len = 8; + + u32 salt_buf[2]; + + salt_buf[0] = salt_bufs[salt_pos].salt_buf[0]; + salt_buf[1] = salt_bufs[salt_pos].salt_buf[1]; + + /** + * pads + */ + + w0[0] = swap_workaround (w0[0]); + w0[1] = swap_workaround (w0[1]); + w0[2] = swap_workaround (w0[2]); + w0[3] = swap_workaround (w0[3]); + w1[0] = swap_workaround (w1[0]); + w1[1] = swap_workaround (w1[1]); + w1[2] = swap_workaround (w1[2]); + w1[3] = swap_workaround (w1[3]); + w2[0] = swap_workaround (w2[0]); + w2[1] = swap_workaround (w2[1]); + w2[2] = swap_workaround (w2[2]); + w2[3] = swap_workaround (w2[3]); + w3[0] = swap_workaround (w3[0]); + w3[1] = swap_workaround (w3[1]); + w3[2] = swap_workaround (w3[2]); + w3[3] = swap_workaround (w3[3]); + + u32x ipad[5]; + u32x opad[5]; + + hmac_sha1_pad (w0, w1, w2, w3, ipad, opad); + + tmps[gid].ipad[0] = ipad[0]; + tmps[gid].ipad[1] = ipad[1]; + tmps[gid].ipad[2] = ipad[2]; + tmps[gid].ipad[3] = ipad[3]; + tmps[gid].ipad[4] = ipad[4]; + + tmps[gid].opad[0] = opad[0]; + tmps[gid].opad[1] = opad[1]; + tmps[gid].opad[2] = opad[2]; + tmps[gid].opad[3] = opad[3]; + tmps[gid].opad[4] = opad[4]; + + w0[0] = salt_buf[0]; + w0[1] = salt_buf[1]; + w0[2] = 0; + w0[3] = 0; + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + append_0x01_1 (w0, salt_len + 3); + append_0x80_1 (w0, salt_len + 4); + + w0[0] = swap_workaround (w0[0]); + w0[1] = swap_workaround (w0[1]); + w0[2] = swap_workaround (w0[2]); + w0[3] = swap_workaround (w0[3]); + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = (64 + salt_len + 4) * 8; + + u32x dgst[5]; + + hmac_sha1_run (w0, w1, w2, w3, ipad, opad, dgst); + + tmps[gid].dgst[0] = dgst[0]; + tmps[gid].dgst[1] = dgst[1]; + tmps[gid].dgst[2] = dgst[2]; + tmps[gid].dgst[3] = dgst[3]; + tmps[gid].dgst[4] = dgst[4]; + + tmps[gid].out[0] = dgst[0]; + tmps[gid].out[1] = dgst[1]; + tmps[gid].out[2] = dgst[2]; + tmps[gid].out[3] = dgst[3]; + tmps[gid].out[4] = dgst[4]; +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m06600_loop (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global agilekey_tmp_t *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x ipad[5]; + u32x opad[5]; + + ipad[0] = tmps[gid].ipad[0]; + ipad[1] = tmps[gid].ipad[1]; + ipad[2] = tmps[gid].ipad[2]; + ipad[3] = tmps[gid].ipad[3]; + ipad[4] = tmps[gid].ipad[4]; + + opad[0] = tmps[gid].opad[0]; + opad[1] = tmps[gid].opad[1]; + opad[2] = tmps[gid].opad[2]; + opad[3] = tmps[gid].opad[3]; + opad[4] = tmps[gid].opad[4]; + + u32x dgst[5]; + u32x out[5]; + + dgst[0] = tmps[gid].dgst[0]; + dgst[1] = tmps[gid].dgst[1]; + dgst[2] = tmps[gid].dgst[2]; + dgst[3] = tmps[gid].dgst[3]; + dgst[4] = tmps[gid].dgst[4]; + + out[0] = tmps[gid].out[0]; + out[1] = tmps[gid].out[1]; + out[2] = tmps[gid].out[2]; + out[3] = tmps[gid].out[3]; + out[4] = tmps[gid].out[4]; + + for (u32 j = 0; j < loop_cnt; j++) + { + u32x w0[4]; + u32x w1[4]; + u32x w2[4]; + u32x w3[4]; + + w0[0] = dgst[0]; + w0[1] = dgst[1]; + w0[2] = dgst[2]; + w0[3] = dgst[3]; + w1[0] = dgst[4]; + w1[1] = 0x80000000; + w1[2] = 0; + w1[3] = 0; + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = (64 + 20) * 8; + + hmac_sha1_run (w0, w1, w2, w3, ipad, opad, dgst); + + out[0] ^= dgst[0]; + out[1] ^= dgst[1]; + out[2] ^= dgst[2]; + out[3] ^= dgst[3]; + out[4] ^= dgst[4]; + } + + tmps[gid].dgst[0] = dgst[0]; + tmps[gid].dgst[1] = dgst[1]; + tmps[gid].dgst[2] = dgst[2]; + tmps[gid].dgst[3] = dgst[3]; + tmps[gid].dgst[4] = dgst[4]; + + tmps[gid].out[0] = out[0]; + tmps[gid].out[1] = out[1]; + tmps[gid].out[2] = out[2]; + tmps[gid].out[3] = out[3]; + tmps[gid].out[4] = out[4]; +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m06600_comp (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global agilekey_tmp_t *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + const u32 lid = get_local_id (0); + + /** + * salt + */ + + const u32 iv[4] = + { + salt_bufs[salt_pos].salt_buf[ 4], + salt_bufs[salt_pos].salt_buf[ 5], + salt_bufs[salt_pos].salt_buf[ 6], + salt_bufs[salt_pos].salt_buf[ 7] + }; + + const u32 data[4] = + { + salt_bufs[salt_pos].salt_buf[ 8], + salt_bufs[salt_pos].salt_buf[ 9], + salt_bufs[salt_pos].salt_buf[10], + salt_bufs[salt_pos].salt_buf[11] + }; + + /** + * aes shared + */ + + const u32 lid4 = lid * 4; + + __local u32 s_td0[256]; + __local u32 s_td1[256]; + __local u32 s_td2[256]; + __local u32 s_td3[256]; + __local u32 s_td4[256]; + + __local u32 s_te0[256]; + __local u32 s_te1[256]; + __local u32 s_te2[256]; + __local u32 s_te3[256]; + __local u32 s_te4[256]; + + s_td0[lid4 + 0] = td0[lid4 + 0]; + s_td0[lid4 + 1] = td0[lid4 + 1]; + s_td0[lid4 + 2] = td0[lid4 + 2]; + s_td0[lid4 + 3] = td0[lid4 + 3]; + + s_td1[lid4 + 0] = td1[lid4 + 0]; + s_td1[lid4 + 1] = td1[lid4 + 1]; + s_td1[lid4 + 2] = td1[lid4 + 2]; + s_td1[lid4 + 3] = td1[lid4 + 3]; + + s_td2[lid4 + 0] = td2[lid4 + 0]; + s_td2[lid4 + 1] = td2[lid4 + 1]; + s_td2[lid4 + 2] = td2[lid4 + 2]; + s_td2[lid4 + 3] = td2[lid4 + 3]; + + s_td3[lid4 + 0] = td3[lid4 + 0]; + s_td3[lid4 + 1] = td3[lid4 + 1]; + s_td3[lid4 + 2] = td3[lid4 + 2]; + s_td3[lid4 + 3] = td3[lid4 + 3]; + + s_td4[lid4 + 0] = td4[lid4 + 0]; + s_td4[lid4 + 1] = td4[lid4 + 1]; + s_td4[lid4 + 2] = td4[lid4 + 2]; + s_td4[lid4 + 3] = td4[lid4 + 3]; + + s_te0[lid4 + 0] = te0[lid4 + 0]; + s_te0[lid4 + 1] = te0[lid4 + 1]; + s_te0[lid4 + 2] = te0[lid4 + 2]; + s_te0[lid4 + 3] = te0[lid4 + 3]; + + s_te1[lid4 + 0] = te1[lid4 + 0]; + s_te1[lid4 + 1] = te1[lid4 + 1]; + s_te1[lid4 + 2] = te1[lid4 + 2]; + s_te1[lid4 + 3] = te1[lid4 + 3]; + + s_te2[lid4 + 0] = te2[lid4 + 0]; + s_te2[lid4 + 1] = te2[lid4 + 1]; + s_te2[lid4 + 2] = te2[lid4 + 2]; + s_te2[lid4 + 3] = te2[lid4 + 3]; + + s_te3[lid4 + 0] = te3[lid4 + 0]; + s_te3[lid4 + 1] = te3[lid4 + 1]; + s_te3[lid4 + 2] = te3[lid4 + 2]; + s_te3[lid4 + 3] = te3[lid4 + 3]; + + s_te4[lid4 + 0] = te4[lid4 + 0]; + s_te4[lid4 + 1] = te4[lid4 + 1]; + s_te4[lid4 + 2] = te4[lid4 + 2]; + s_te4[lid4 + 3] = te4[lid4 + 3]; + + barrier (CLK_LOCAL_MEM_FENCE); + + if (gid >= gid_max) return; + + /** + * aes init + */ + + u32x ukeyx[4]; + + ukeyx[0] = tmps[gid].out[0]; + ukeyx[1] = tmps[gid].out[1]; + ukeyx[2] = tmps[gid].out[2]; + ukeyx[3] = tmps[gid].out[3]; + + u32x a; + u32x b; + u32x c; + u32x d; + + #define KEYLEN 44 + + u32 rek[KEYLEN]; + u32 rdk[KEYLEN]; + + u32 ukey[4]; + + u32 out[4]; + + /** + * aes decrypt key + */ + + ukey[0] = ukeyx[0]; + ukey[1] = ukeyx[1]; + ukey[2] = ukeyx[2]; + ukey[3] = ukeyx[3]; + + AES128_ExpandKey (ukey, rek, s_te0, s_te1, s_te2, s_te3, s_te4); + + #pragma unroll KEYLEN + for (u32 i = 0; i < KEYLEN; i++) rdk[i] = rek[i]; + + AES128_InvertKey (rdk, s_td0, s_td1, s_td2, s_td3, s_td4, s_te0, s_te1, s_te2, s_te3, s_te4); + + AES128_decrypt (data, out, rdk, s_td0, s_td1, s_td2, s_td3, s_td4); + + a = out[0] ^ iv[0]; + b = out[1] ^ iv[1]; + c = out[2] ^ iv[2]; + d = out[3] ^ iv[3]; + + const u32x r0 = a; + const u32x r1 = b; + const u32x r2 = c; + const u32x r3 = d; + + #define il_pos 0 + + #include VECT_COMPARE_M +} diff --git a/amd/m06700.cl b/amd/m06700.cl new file mode 100644 index 0000000000..40ed05a8b3 --- /dev/null +++ b/amd/m06700.cl @@ -0,0 +1,540 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _SHA1_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW4 +#define VECT_SIZE2 +#endif + +#ifdef VLIW5 +#define VECT_SIZE2 +#endif + +#define DGST_R0 0 +#define DGST_R1 1 +#define DGST_R2 2 +#define DGST_R3 3 + +#include "include/kernel_functions.c" +#include "types_amd.c" +#include "common_amd.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +static void sha1_transform (const u32x w0[4], const u32x w1[4], const u32x w2[4], const u32x w3[4], u32x digest[5]) +{ + u32x A = digest[0]; + u32x B = digest[1]; + u32x C = digest[2]; + u32x D = digest[3]; + u32x E = digest[4]; + + u32x w0_t = w0[0]; + u32x w1_t = w0[1]; + u32x w2_t = w0[2]; + u32x w3_t = w0[3]; + u32x w4_t = w1[0]; + u32x w5_t = w1[1]; + u32x w6_t = w1[2]; + u32x w7_t = w1[3]; + u32x w8_t = w2[0]; + u32x w9_t = w2[1]; + u32x wa_t = w2[2]; + u32x wb_t = w2[3]; + u32x wc_t = w3[0]; + u32x wd_t = w3[1]; + u32x we_t = w3[2]; + u32x wf_t = w3[3]; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, A, B, C, D, E, w0_t); + SHA1_STEP (SHA1_F0o, E, A, B, C, D, w1_t); + SHA1_STEP (SHA1_F0o, D, E, A, B, C, w2_t); + SHA1_STEP (SHA1_F0o, C, D, E, A, B, w3_t); + SHA1_STEP (SHA1_F0o, B, C, D, E, A, w4_t); + SHA1_STEP (SHA1_F0o, A, B, C, D, E, w5_t); + SHA1_STEP (SHA1_F0o, E, A, B, C, D, w6_t); + SHA1_STEP (SHA1_F0o, D, E, A, B, C, w7_t); + SHA1_STEP (SHA1_F0o, C, D, E, A, B, w8_t); + SHA1_STEP (SHA1_F0o, B, C, D, E, A, w9_t); + SHA1_STEP (SHA1_F0o, A, B, C, D, E, wa_t); + SHA1_STEP (SHA1_F0o, E, A, B, C, D, wb_t); + SHA1_STEP (SHA1_F0o, D, E, A, B, C, wc_t); + SHA1_STEP (SHA1_F0o, C, D, E, A, B, wd_t); + SHA1_STEP (SHA1_F0o, B, C, D, E, A, we_t); + SHA1_STEP (SHA1_F0o, A, B, C, D, E, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F0o, E, A, B, C, D, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F0o, D, E, A, B, C, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F0o, C, D, E, A, B, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F0o, B, C, D, E, A, w3_t); + + #undef K + #define K SHA1C01 + + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w7_t); + + #undef K + #define K SHA1C02 + + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, wb_t); + + #undef K + #define K SHA1C03 + + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, wf_t); + + digest[0] += A; + digest[1] += B; + digest[2] += C; + digest[3] += D; + digest[4] += E; +} + +static void hmac_sha1_pad (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], u32x ipad[5], u32x opad[5]) +{ + w0[0] = w0[0] ^ 0x36363636; + w0[1] = w0[1] ^ 0x36363636; + w0[2] = w0[2] ^ 0x36363636; + w0[3] = w0[3] ^ 0x36363636; + w1[0] = w1[0] ^ 0x36363636; + w1[1] = w1[1] ^ 0x36363636; + w1[2] = w1[2] ^ 0x36363636; + w1[3] = w1[3] ^ 0x36363636; + w2[0] = w2[0] ^ 0x36363636; + w2[1] = w2[1] ^ 0x36363636; + w2[2] = w2[2] ^ 0x36363636; + w2[3] = w2[3] ^ 0x36363636; + w3[0] = w3[0] ^ 0x36363636; + w3[1] = w3[1] ^ 0x36363636; + w3[2] = w3[2] ^ 0x36363636; + w3[3] = w3[3] ^ 0x36363636; + + ipad[0] = SHA1M_A; + ipad[1] = SHA1M_B; + ipad[2] = SHA1M_C; + ipad[3] = SHA1M_D; + ipad[4] = SHA1M_E; + + sha1_transform (w0, w1, w2, w3, ipad); + + w0[0] = w0[0] ^ 0x6a6a6a6a; + w0[1] = w0[1] ^ 0x6a6a6a6a; + w0[2] = w0[2] ^ 0x6a6a6a6a; + w0[3] = w0[3] ^ 0x6a6a6a6a; + w1[0] = w1[0] ^ 0x6a6a6a6a; + w1[1] = w1[1] ^ 0x6a6a6a6a; + w1[2] = w1[2] ^ 0x6a6a6a6a; + w1[3] = w1[3] ^ 0x6a6a6a6a; + w2[0] = w2[0] ^ 0x6a6a6a6a; + w2[1] = w2[1] ^ 0x6a6a6a6a; + w2[2] = w2[2] ^ 0x6a6a6a6a; + w2[3] = w2[3] ^ 0x6a6a6a6a; + w3[0] = w3[0] ^ 0x6a6a6a6a; + w3[1] = w3[1] ^ 0x6a6a6a6a; + w3[2] = w3[2] ^ 0x6a6a6a6a; + w3[3] = w3[3] ^ 0x6a6a6a6a; + + opad[0] = SHA1M_A; + opad[1] = SHA1M_B; + opad[2] = SHA1M_C; + opad[3] = SHA1M_D; + opad[4] = SHA1M_E; + + sha1_transform (w0, w1, w2, w3, opad); +} + +static void hmac_sha1_run (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], u32x ipad[5], u32x opad[5], u32x digest[5]) +{ + digest[0] = ipad[0]; + digest[1] = ipad[1]; + digest[2] = ipad[2]; + digest[3] = ipad[3]; + digest[4] = ipad[4]; + + sha1_transform (w0, w1, w2, w3, digest); + + w0[0] = digest[0]; + w0[1] = digest[1]; + w0[2] = digest[2]; + w0[3] = digest[3]; + w1[0] = digest[4]; + w1[1] = 0x80000000; + w1[2] = 0; + w1[3] = 0; + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = (64 + 20) * 8; + + digest[0] = opad[0]; + digest[1] = opad[1]; + digest[2] = opad[2]; + digest[3] = opad[3]; + digest[4] = opad[4]; + + sha1_transform (w0, w1, w2, w3, digest); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m06700_init (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global sha1aix_tmp_t *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global wpa_t *wpa_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = pws[gid].i[ 8]; + w2[1] = pws[gid].i[ 9]; + w2[2] = pws[gid].i[10]; + w2[3] = pws[gid].i[11]; + + u32x w3[4]; + + w3[0] = pws[gid].i[12]; + w3[1] = pws[gid].i[13]; + w3[2] = pws[gid].i[14]; + w3[3] = pws[gid].i[15]; + + /** + * salt + */ + + u32 salt_len = salt_bufs[salt_pos].salt_len; + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[ 1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[ 2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[ 3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[ 4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[ 5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[ 6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[ 7]; + + u32 salt_buf2[4]; + + salt_buf2[0] = salt_bufs[salt_pos].salt_buf[ 8]; + salt_buf2[1] = salt_bufs[salt_pos].salt_buf[ 9]; + salt_buf2[2] = salt_bufs[salt_pos].salt_buf[10]; + salt_buf2[3] = salt_bufs[salt_pos].salt_buf[11]; + + u32 salt_buf3[4]; + + salt_buf3[0] = 0; + salt_buf3[1] = 0; + salt_buf3[2] = 0; + salt_buf3[3] = 0; + + append_0x01_4 (salt_buf0, salt_buf1, salt_buf2, salt_buf3, salt_len + 3); + + append_0x80_4 (salt_buf0, salt_buf1, salt_buf2, salt_buf3, salt_len + 4); + + /** + * pads + */ + + w0[0] = swap_workaround (w0[0]); + w0[1] = swap_workaround (w0[1]); + w0[2] = swap_workaround (w0[2]); + w0[3] = swap_workaround (w0[3]); + w1[0] = swap_workaround (w1[0]); + w1[1] = swap_workaround (w1[1]); + w1[2] = swap_workaround (w1[2]); + w1[3] = swap_workaround (w1[3]); + w2[0] = swap_workaround (w2[0]); + w2[1] = swap_workaround (w2[1]); + w2[2] = swap_workaround (w2[2]); + w2[3] = swap_workaround (w2[3]); + w3[0] = swap_workaround (w3[0]); + w3[1] = swap_workaround (w3[1]); + w3[2] = swap_workaround (w3[2]); + w3[3] = swap_workaround (w3[3]); + + u32x ipad[5]; + u32x opad[5]; + + hmac_sha1_pad (w0, w1, w2, w3, ipad, opad); + + tmps[gid].ipad[0] = ipad[0]; + tmps[gid].ipad[1] = ipad[1]; + tmps[gid].ipad[2] = ipad[2]; + tmps[gid].ipad[3] = ipad[3]; + tmps[gid].ipad[4] = ipad[4]; + + tmps[gid].opad[0] = opad[0]; + tmps[gid].opad[1] = opad[1]; + tmps[gid].opad[2] = opad[2]; + tmps[gid].opad[3] = opad[3]; + tmps[gid].opad[4] = opad[4]; + + w0[0] = salt_buf0[0]; + w0[1] = salt_buf0[1]; + w0[2] = salt_buf0[2]; + w0[3] = salt_buf0[3]; + w1[0] = salt_buf1[0]; + w1[1] = salt_buf1[1]; + w1[2] = salt_buf1[2]; + w1[3] = salt_buf1[3]; + w2[0] = salt_buf2[0]; + w2[1] = salt_buf2[1]; + w2[2] = salt_buf2[2]; + w2[3] = salt_buf2[3]; + w3[0] = salt_buf3[0]; + w3[1] = salt_buf3[1]; + w3[2] = salt_buf3[2]; + //w3[3] = salt_buf3[3]; + + w0[0] = swap_workaround (w0[0]); + w0[1] = swap_workaround (w0[1]); + w0[2] = swap_workaround (w0[2]); + w0[3] = swap_workaround (w0[3]); + w1[0] = swap_workaround (w1[0]); + w1[1] = swap_workaround (w1[1]); + w1[2] = swap_workaround (w1[2]); + w1[3] = swap_workaround (w1[3]); + w2[0] = swap_workaround (w2[0]); + w2[1] = swap_workaround (w2[1]); + w2[2] = swap_workaround (w2[2]); + w2[3] = swap_workaround (w2[3]); + w3[0] = swap_workaround (w3[0]); + w3[1] = swap_workaround (w3[1]); + w3[2] = swap_workaround (w3[2]); + w3[3] = (64 + salt_len + 4) * 8; + + u32x dgst[5]; + + hmac_sha1_run (w0, w1, w2, w3, ipad, opad, dgst); + + tmps[gid].dgst[0] = dgst[0]; + tmps[gid].dgst[1] = dgst[1]; + tmps[gid].dgst[2] = dgst[2]; + tmps[gid].dgst[3] = dgst[3]; + tmps[gid].dgst[4] = dgst[4]; + + tmps[gid].out[0] = dgst[0]; + tmps[gid].out[1] = dgst[1]; + tmps[gid].out[2] = dgst[2]; + tmps[gid].out[3] = dgst[3]; + tmps[gid].out[4] = dgst[4]; +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m06700_loop (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global sha1aix_tmp_t *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global wpa_t *wpa_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x ipad[5]; + u32x opad[5]; + + ipad[0] = tmps[gid].ipad[0]; + ipad[1] = tmps[gid].ipad[1]; + ipad[2] = tmps[gid].ipad[2]; + ipad[3] = tmps[gid].ipad[3]; + ipad[4] = tmps[gid].ipad[4]; + + opad[0] = tmps[gid].opad[0]; + opad[1] = tmps[gid].opad[1]; + opad[2] = tmps[gid].opad[2]; + opad[3] = tmps[gid].opad[3]; + opad[4] = tmps[gid].opad[4]; + + u32x dgst[5]; + u32x out[5]; + + dgst[0] = tmps[gid].dgst[0]; + dgst[1] = tmps[gid].dgst[1]; + dgst[2] = tmps[gid].dgst[2]; + dgst[3] = tmps[gid].dgst[3]; + dgst[4] = tmps[gid].dgst[4]; + + out[0] = tmps[gid].out[0]; + out[1] = tmps[gid].out[1]; + out[2] = tmps[gid].out[2]; + out[3] = tmps[gid].out[3]; + out[4] = tmps[gid].out[4]; + + for (u32 j = 0; j < loop_cnt; j++) + { + u32x w0[4]; + u32x w1[4]; + u32x w2[4]; + u32x w3[4]; + + w0[0] = dgst[0]; + w0[1] = dgst[1]; + w0[2] = dgst[2]; + w0[3] = dgst[3]; + w1[0] = dgst[4]; + w1[1] = 0x80000000; + w1[2] = 0; + w1[3] = 0; + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = (64 + 20) * 8; + + hmac_sha1_run (w0, w1, w2, w3, ipad, opad, dgst); + + out[0] ^= dgst[0]; + out[1] ^= dgst[1]; + out[2] ^= dgst[2]; + out[3] ^= dgst[3]; + out[4] ^= dgst[4]; + } + + tmps[gid].dgst[0] = dgst[0]; + tmps[gid].dgst[1] = dgst[1]; + tmps[gid].dgst[2] = dgst[2]; + tmps[gid].dgst[3] = dgst[3]; + tmps[gid].dgst[4] = dgst[4]; + + tmps[gid].out[0] = out[0]; + tmps[gid].out[1] = out[1]; + tmps[gid].out[2] = out[2]; + tmps[gid].out[3] = out[3]; + tmps[gid].out[4] = out[4]; +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m06700_comp (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global sha1aix_tmp_t *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global wpa_t *wpa_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + const u32 lid = get_local_id (0); + + /** + * digest + */ + + /* + u32x a = tmps[gid].out[0]; + u32x b = tmps[gid].out[1]; + u32x c = tmps[gid].out[2]; + u32x d = tmps[gid].out[3]; + u32x e = tmps[gid].out[4] & 0xffff03ff; + */ + + const u32x r0 = tmps[gid].out[DGST_R0]; + const u32x r1 = tmps[gid].out[DGST_R1]; + const u32x r2 = tmps[gid].out[DGST_R2]; + const u32x r3 = tmps[gid].out[DGST_R3]; + + #define il_pos 0 + + #include VECT_COMPARE_M +} diff --git a/amd/m06800.cl b/amd/m06800.cl new file mode 100644 index 0000000000..7f74bcdadc --- /dev/null +++ b/amd/m06800.cl @@ -0,0 +1,1650 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _SHA256_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW4 +#define VECT_SIZE1 +#endif + +#ifdef VLIW5 +#define VECT_SIZE1 +#endif + +#define DGST_R0 0 +#define DGST_R1 1 +#define DGST_R2 2 +#define DGST_R3 3 + +#include "include/kernel_functions.c" +#include "types_amd.c" +#include "common_amd.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +__constant u32 te0[256] = +{ + 0xc66363a5, 0xf87c7c84, 0xee777799, 0xf67b7b8d, + 0xfff2f20d, 0xd66b6bbd, 0xde6f6fb1, 0x91c5c554, + 0x60303050, 0x02010103, 0xce6767a9, 0x562b2b7d, + 0xe7fefe19, 0xb5d7d762, 0x4dababe6, 0xec76769a, + 0x8fcaca45, 0x1f82829d, 0x89c9c940, 0xfa7d7d87, + 0xeffafa15, 0xb25959eb, 0x8e4747c9, 0xfbf0f00b, + 0x41adadec, 0xb3d4d467, 0x5fa2a2fd, 0x45afafea, + 0x239c9cbf, 0x53a4a4f7, 0xe4727296, 0x9bc0c05b, + 0x75b7b7c2, 0xe1fdfd1c, 0x3d9393ae, 0x4c26266a, + 0x6c36365a, 0x7e3f3f41, 0xf5f7f702, 0x83cccc4f, + 0x6834345c, 0x51a5a5f4, 0xd1e5e534, 0xf9f1f108, + 0xe2717193, 0xabd8d873, 0x62313153, 0x2a15153f, + 0x0804040c, 0x95c7c752, 0x46232365, 0x9dc3c35e, + 0x30181828, 0x379696a1, 0x0a05050f, 0x2f9a9ab5, + 0x0e070709, 0x24121236, 0x1b80809b, 0xdfe2e23d, + 0xcdebeb26, 0x4e272769, 0x7fb2b2cd, 0xea75759f, + 0x1209091b, 0x1d83839e, 0x582c2c74, 0x341a1a2e, + 0x361b1b2d, 0xdc6e6eb2, 0xb45a5aee, 0x5ba0a0fb, + 0xa45252f6, 0x763b3b4d, 0xb7d6d661, 0x7db3b3ce, + 0x5229297b, 0xdde3e33e, 0x5e2f2f71, 0x13848497, + 0xa65353f5, 0xb9d1d168, 0x00000000, 0xc1eded2c, + 0x40202060, 0xe3fcfc1f, 0x79b1b1c8, 0xb65b5bed, + 0xd46a6abe, 0x8dcbcb46, 0x67bebed9, 0x7239394b, + 0x944a4ade, 0x984c4cd4, 0xb05858e8, 0x85cfcf4a, + 0xbbd0d06b, 0xc5efef2a, 0x4faaaae5, 0xedfbfb16, + 0x864343c5, 0x9a4d4dd7, 0x66333355, 0x11858594, + 0x8a4545cf, 0xe9f9f910, 0x04020206, 0xfe7f7f81, + 0xa05050f0, 0x783c3c44, 0x259f9fba, 0x4ba8a8e3, + 0xa25151f3, 0x5da3a3fe, 0x804040c0, 0x058f8f8a, + 0x3f9292ad, 0x219d9dbc, 0x70383848, 0xf1f5f504, + 0x63bcbcdf, 0x77b6b6c1, 0xafdada75, 0x42212163, + 0x20101030, 0xe5ffff1a, 0xfdf3f30e, 0xbfd2d26d, + 0x81cdcd4c, 0x180c0c14, 0x26131335, 0xc3ecec2f, + 0xbe5f5fe1, 0x359797a2, 0x884444cc, 0x2e171739, + 0x93c4c457, 0x55a7a7f2, 0xfc7e7e82, 0x7a3d3d47, + 0xc86464ac, 0xba5d5de7, 0x3219192b, 0xe6737395, + 0xc06060a0, 0x19818198, 0x9e4f4fd1, 0xa3dcdc7f, + 0x44222266, 0x542a2a7e, 0x3b9090ab, 0x0b888883, + 0x8c4646ca, 0xc7eeee29, 0x6bb8b8d3, 0x2814143c, + 0xa7dede79, 0xbc5e5ee2, 0x160b0b1d, 0xaddbdb76, + 0xdbe0e03b, 0x64323256, 0x743a3a4e, 0x140a0a1e, + 0x924949db, 0x0c06060a, 0x4824246c, 0xb85c5ce4, + 0x9fc2c25d, 0xbdd3d36e, 0x43acacef, 0xc46262a6, + 0x399191a8, 0x319595a4, 0xd3e4e437, 0xf279798b, + 0xd5e7e732, 0x8bc8c843, 0x6e373759, 0xda6d6db7, + 0x018d8d8c, 0xb1d5d564, 0x9c4e4ed2, 0x49a9a9e0, + 0xd86c6cb4, 0xac5656fa, 0xf3f4f407, 0xcfeaea25, + 0xca6565af, 0xf47a7a8e, 0x47aeaee9, 0x10080818, + 0x6fbabad5, 0xf0787888, 0x4a25256f, 0x5c2e2e72, + 0x381c1c24, 0x57a6a6f1, 0x73b4b4c7, 0x97c6c651, + 0xcbe8e823, 0xa1dddd7c, 0xe874749c, 0x3e1f1f21, + 0x964b4bdd, 0x61bdbddc, 0x0d8b8b86, 0x0f8a8a85, + 0xe0707090, 0x7c3e3e42, 0x71b5b5c4, 0xcc6666aa, + 0x904848d8, 0x06030305, 0xf7f6f601, 0x1c0e0e12, + 0xc26161a3, 0x6a35355f, 0xae5757f9, 0x69b9b9d0, + 0x17868691, 0x99c1c158, 0x3a1d1d27, 0x279e9eb9, + 0xd9e1e138, 0xebf8f813, 0x2b9898b3, 0x22111133, + 0xd26969bb, 0xa9d9d970, 0x078e8e89, 0x339494a7, + 0x2d9b9bb6, 0x3c1e1e22, 0x15878792, 0xc9e9e920, + 0x87cece49, 0xaa5555ff, 0x50282878, 0xa5dfdf7a, + 0x038c8c8f, 0x59a1a1f8, 0x09898980, 0x1a0d0d17, + 0x65bfbfda, 0xd7e6e631, 0x844242c6, 0xd06868b8, + 0x824141c3, 0x299999b0, 0x5a2d2d77, 0x1e0f0f11, + 0x7bb0b0cb, 0xa85454fc, 0x6dbbbbd6, 0x2c16163a, +}; + +__constant u32 te1[256] = +{ + 0xa5c66363, 0x84f87c7c, 0x99ee7777, 0x8df67b7b, + 0x0dfff2f2, 0xbdd66b6b, 0xb1de6f6f, 0x5491c5c5, + 0x50603030, 0x03020101, 0xa9ce6767, 0x7d562b2b, + 0x19e7fefe, 0x62b5d7d7, 0xe64dabab, 0x9aec7676, + 0x458fcaca, 0x9d1f8282, 0x4089c9c9, 0x87fa7d7d, + 0x15effafa, 0xebb25959, 0xc98e4747, 0x0bfbf0f0, + 0xec41adad, 0x67b3d4d4, 0xfd5fa2a2, 0xea45afaf, + 0xbf239c9c, 0xf753a4a4, 0x96e47272, 0x5b9bc0c0, + 0xc275b7b7, 0x1ce1fdfd, 0xae3d9393, 0x6a4c2626, + 0x5a6c3636, 0x417e3f3f, 0x02f5f7f7, 0x4f83cccc, + 0x5c683434, 0xf451a5a5, 0x34d1e5e5, 0x08f9f1f1, + 0x93e27171, 0x73abd8d8, 0x53623131, 0x3f2a1515, + 0x0c080404, 0x5295c7c7, 0x65462323, 0x5e9dc3c3, + 0x28301818, 0xa1379696, 0x0f0a0505, 0xb52f9a9a, + 0x090e0707, 0x36241212, 0x9b1b8080, 0x3ddfe2e2, + 0x26cdebeb, 0x694e2727, 0xcd7fb2b2, 0x9fea7575, + 0x1b120909, 0x9e1d8383, 0x74582c2c, 0x2e341a1a, + 0x2d361b1b, 0xb2dc6e6e, 0xeeb45a5a, 0xfb5ba0a0, + 0xf6a45252, 0x4d763b3b, 0x61b7d6d6, 0xce7db3b3, + 0x7b522929, 0x3edde3e3, 0x715e2f2f, 0x97138484, + 0xf5a65353, 0x68b9d1d1, 0x00000000, 0x2cc1eded, + 0x60402020, 0x1fe3fcfc, 0xc879b1b1, 0xedb65b5b, + 0xbed46a6a, 0x468dcbcb, 0xd967bebe, 0x4b723939, + 0xde944a4a, 0xd4984c4c, 0xe8b05858, 0x4a85cfcf, + 0x6bbbd0d0, 0x2ac5efef, 0xe54faaaa, 0x16edfbfb, + 0xc5864343, 0xd79a4d4d, 0x55663333, 0x94118585, + 0xcf8a4545, 0x10e9f9f9, 0x06040202, 0x81fe7f7f, + 0xf0a05050, 0x44783c3c, 0xba259f9f, 0xe34ba8a8, + 0xf3a25151, 0xfe5da3a3, 0xc0804040, 0x8a058f8f, + 0xad3f9292, 0xbc219d9d, 0x48703838, 0x04f1f5f5, + 0xdf63bcbc, 0xc177b6b6, 0x75afdada, 0x63422121, + 0x30201010, 0x1ae5ffff, 0x0efdf3f3, 0x6dbfd2d2, + 0x4c81cdcd, 0x14180c0c, 0x35261313, 0x2fc3ecec, + 0xe1be5f5f, 0xa2359797, 0xcc884444, 0x392e1717, + 0x5793c4c4, 0xf255a7a7, 0x82fc7e7e, 0x477a3d3d, + 0xacc86464, 0xe7ba5d5d, 0x2b321919, 0x95e67373, + 0xa0c06060, 0x98198181, 0xd19e4f4f, 0x7fa3dcdc, + 0x66442222, 0x7e542a2a, 0xab3b9090, 0x830b8888, + 0xca8c4646, 0x29c7eeee, 0xd36bb8b8, 0x3c281414, + 0x79a7dede, 0xe2bc5e5e, 0x1d160b0b, 0x76addbdb, + 0x3bdbe0e0, 0x56643232, 0x4e743a3a, 0x1e140a0a, + 0xdb924949, 0x0a0c0606, 0x6c482424, 0xe4b85c5c, + 0x5d9fc2c2, 0x6ebdd3d3, 0xef43acac, 0xa6c46262, + 0xa8399191, 0xa4319595, 0x37d3e4e4, 0x8bf27979, + 0x32d5e7e7, 0x438bc8c8, 0x596e3737, 0xb7da6d6d, + 0x8c018d8d, 0x64b1d5d5, 0xd29c4e4e, 0xe049a9a9, + 0xb4d86c6c, 0xfaac5656, 0x07f3f4f4, 0x25cfeaea, + 0xafca6565, 0x8ef47a7a, 0xe947aeae, 0x18100808, + 0xd56fbaba, 0x88f07878, 0x6f4a2525, 0x725c2e2e, + 0x24381c1c, 0xf157a6a6, 0xc773b4b4, 0x5197c6c6, + 0x23cbe8e8, 0x7ca1dddd, 0x9ce87474, 0x213e1f1f, + 0xdd964b4b, 0xdc61bdbd, 0x860d8b8b, 0x850f8a8a, + 0x90e07070, 0x427c3e3e, 0xc471b5b5, 0xaacc6666, + 0xd8904848, 0x05060303, 0x01f7f6f6, 0x121c0e0e, + 0xa3c26161, 0x5f6a3535, 0xf9ae5757, 0xd069b9b9, + 0x91178686, 0x5899c1c1, 0x273a1d1d, 0xb9279e9e, + 0x38d9e1e1, 0x13ebf8f8, 0xb32b9898, 0x33221111, + 0xbbd26969, 0x70a9d9d9, 0x89078e8e, 0xa7339494, + 0xb62d9b9b, 0x223c1e1e, 0x92158787, 0x20c9e9e9, + 0x4987cece, 0xffaa5555, 0x78502828, 0x7aa5dfdf, + 0x8f038c8c, 0xf859a1a1, 0x80098989, 0x171a0d0d, + 0xda65bfbf, 0x31d7e6e6, 0xc6844242, 0xb8d06868, + 0xc3824141, 0xb0299999, 0x775a2d2d, 0x111e0f0f, + 0xcb7bb0b0, 0xfca85454, 0xd66dbbbb, 0x3a2c1616, +}; + +__constant u32 te2[256] = +{ + 0x63a5c663, 0x7c84f87c, 0x7799ee77, 0x7b8df67b, + 0xf20dfff2, 0x6bbdd66b, 0x6fb1de6f, 0xc55491c5, + 0x30506030, 0x01030201, 0x67a9ce67, 0x2b7d562b, + 0xfe19e7fe, 0xd762b5d7, 0xabe64dab, 0x769aec76, + 0xca458fca, 0x829d1f82, 0xc94089c9, 0x7d87fa7d, + 0xfa15effa, 0x59ebb259, 0x47c98e47, 0xf00bfbf0, + 0xadec41ad, 0xd467b3d4, 0xa2fd5fa2, 0xafea45af, + 0x9cbf239c, 0xa4f753a4, 0x7296e472, 0xc05b9bc0, + 0xb7c275b7, 0xfd1ce1fd, 0x93ae3d93, 0x266a4c26, + 0x365a6c36, 0x3f417e3f, 0xf702f5f7, 0xcc4f83cc, + 0x345c6834, 0xa5f451a5, 0xe534d1e5, 0xf108f9f1, + 0x7193e271, 0xd873abd8, 0x31536231, 0x153f2a15, + 0x040c0804, 0xc75295c7, 0x23654623, 0xc35e9dc3, + 0x18283018, 0x96a13796, 0x050f0a05, 0x9ab52f9a, + 0x07090e07, 0x12362412, 0x809b1b80, 0xe23ddfe2, + 0xeb26cdeb, 0x27694e27, 0xb2cd7fb2, 0x759fea75, + 0x091b1209, 0x839e1d83, 0x2c74582c, 0x1a2e341a, + 0x1b2d361b, 0x6eb2dc6e, 0x5aeeb45a, 0xa0fb5ba0, + 0x52f6a452, 0x3b4d763b, 0xd661b7d6, 0xb3ce7db3, + 0x297b5229, 0xe33edde3, 0x2f715e2f, 0x84971384, + 0x53f5a653, 0xd168b9d1, 0x00000000, 0xed2cc1ed, + 0x20604020, 0xfc1fe3fc, 0xb1c879b1, 0x5bedb65b, + 0x6abed46a, 0xcb468dcb, 0xbed967be, 0x394b7239, + 0x4ade944a, 0x4cd4984c, 0x58e8b058, 0xcf4a85cf, + 0xd06bbbd0, 0xef2ac5ef, 0xaae54faa, 0xfb16edfb, + 0x43c58643, 0x4dd79a4d, 0x33556633, 0x85941185, + 0x45cf8a45, 0xf910e9f9, 0x02060402, 0x7f81fe7f, + 0x50f0a050, 0x3c44783c, 0x9fba259f, 0xa8e34ba8, + 0x51f3a251, 0xa3fe5da3, 0x40c08040, 0x8f8a058f, + 0x92ad3f92, 0x9dbc219d, 0x38487038, 0xf504f1f5, + 0xbcdf63bc, 0xb6c177b6, 0xda75afda, 0x21634221, + 0x10302010, 0xff1ae5ff, 0xf30efdf3, 0xd26dbfd2, + 0xcd4c81cd, 0x0c14180c, 0x13352613, 0xec2fc3ec, + 0x5fe1be5f, 0x97a23597, 0x44cc8844, 0x17392e17, + 0xc45793c4, 0xa7f255a7, 0x7e82fc7e, 0x3d477a3d, + 0x64acc864, 0x5de7ba5d, 0x192b3219, 0x7395e673, + 0x60a0c060, 0x81981981, 0x4fd19e4f, 0xdc7fa3dc, + 0x22664422, 0x2a7e542a, 0x90ab3b90, 0x88830b88, + 0x46ca8c46, 0xee29c7ee, 0xb8d36bb8, 0x143c2814, + 0xde79a7de, 0x5ee2bc5e, 0x0b1d160b, 0xdb76addb, + 0xe03bdbe0, 0x32566432, 0x3a4e743a, 0x0a1e140a, + 0x49db9249, 0x060a0c06, 0x246c4824, 0x5ce4b85c, + 0xc25d9fc2, 0xd36ebdd3, 0xacef43ac, 0x62a6c462, + 0x91a83991, 0x95a43195, 0xe437d3e4, 0x798bf279, + 0xe732d5e7, 0xc8438bc8, 0x37596e37, 0x6db7da6d, + 0x8d8c018d, 0xd564b1d5, 0x4ed29c4e, 0xa9e049a9, + 0x6cb4d86c, 0x56faac56, 0xf407f3f4, 0xea25cfea, + 0x65afca65, 0x7a8ef47a, 0xaee947ae, 0x08181008, + 0xbad56fba, 0x7888f078, 0x256f4a25, 0x2e725c2e, + 0x1c24381c, 0xa6f157a6, 0xb4c773b4, 0xc65197c6, + 0xe823cbe8, 0xdd7ca1dd, 0x749ce874, 0x1f213e1f, + 0x4bdd964b, 0xbddc61bd, 0x8b860d8b, 0x8a850f8a, + 0x7090e070, 0x3e427c3e, 0xb5c471b5, 0x66aacc66, + 0x48d89048, 0x03050603, 0xf601f7f6, 0x0e121c0e, + 0x61a3c261, 0x355f6a35, 0x57f9ae57, 0xb9d069b9, + 0x86911786, 0xc15899c1, 0x1d273a1d, 0x9eb9279e, + 0xe138d9e1, 0xf813ebf8, 0x98b32b98, 0x11332211, + 0x69bbd269, 0xd970a9d9, 0x8e89078e, 0x94a73394, + 0x9bb62d9b, 0x1e223c1e, 0x87921587, 0xe920c9e9, + 0xce4987ce, 0x55ffaa55, 0x28785028, 0xdf7aa5df, + 0x8c8f038c, 0xa1f859a1, 0x89800989, 0x0d171a0d, + 0xbfda65bf, 0xe631d7e6, 0x42c68442, 0x68b8d068, + 0x41c38241, 0x99b02999, 0x2d775a2d, 0x0f111e0f, + 0xb0cb7bb0, 0x54fca854, 0xbbd66dbb, 0x163a2c16, +}; + +__constant u32 te3[256] = +{ + 0x6363a5c6, 0x7c7c84f8, 0x777799ee, 0x7b7b8df6, + 0xf2f20dff, 0x6b6bbdd6, 0x6f6fb1de, 0xc5c55491, + 0x30305060, 0x01010302, 0x6767a9ce, 0x2b2b7d56, + 0xfefe19e7, 0xd7d762b5, 0xababe64d, 0x76769aec, + 0xcaca458f, 0x82829d1f, 0xc9c94089, 0x7d7d87fa, + 0xfafa15ef, 0x5959ebb2, 0x4747c98e, 0xf0f00bfb, + 0xadadec41, 0xd4d467b3, 0xa2a2fd5f, 0xafafea45, + 0x9c9cbf23, 0xa4a4f753, 0x727296e4, 0xc0c05b9b, + 0xb7b7c275, 0xfdfd1ce1, 0x9393ae3d, 0x26266a4c, + 0x36365a6c, 0x3f3f417e, 0xf7f702f5, 0xcccc4f83, + 0x34345c68, 0xa5a5f451, 0xe5e534d1, 0xf1f108f9, + 0x717193e2, 0xd8d873ab, 0x31315362, 0x15153f2a, + 0x04040c08, 0xc7c75295, 0x23236546, 0xc3c35e9d, + 0x18182830, 0x9696a137, 0x05050f0a, 0x9a9ab52f, + 0x0707090e, 0x12123624, 0x80809b1b, 0xe2e23ddf, + 0xebeb26cd, 0x2727694e, 0xb2b2cd7f, 0x75759fea, + 0x09091b12, 0x83839e1d, 0x2c2c7458, 0x1a1a2e34, + 0x1b1b2d36, 0x6e6eb2dc, 0x5a5aeeb4, 0xa0a0fb5b, + 0x5252f6a4, 0x3b3b4d76, 0xd6d661b7, 0xb3b3ce7d, + 0x29297b52, 0xe3e33edd, 0x2f2f715e, 0x84849713, + 0x5353f5a6, 0xd1d168b9, 0x00000000, 0xeded2cc1, + 0x20206040, 0xfcfc1fe3, 0xb1b1c879, 0x5b5bedb6, + 0x6a6abed4, 0xcbcb468d, 0xbebed967, 0x39394b72, + 0x4a4ade94, 0x4c4cd498, 0x5858e8b0, 0xcfcf4a85, + 0xd0d06bbb, 0xefef2ac5, 0xaaaae54f, 0xfbfb16ed, + 0x4343c586, 0x4d4dd79a, 0x33335566, 0x85859411, + 0x4545cf8a, 0xf9f910e9, 0x02020604, 0x7f7f81fe, + 0x5050f0a0, 0x3c3c4478, 0x9f9fba25, 0xa8a8e34b, + 0x5151f3a2, 0xa3a3fe5d, 0x4040c080, 0x8f8f8a05, + 0x9292ad3f, 0x9d9dbc21, 0x38384870, 0xf5f504f1, + 0xbcbcdf63, 0xb6b6c177, 0xdada75af, 0x21216342, + 0x10103020, 0xffff1ae5, 0xf3f30efd, 0xd2d26dbf, + 0xcdcd4c81, 0x0c0c1418, 0x13133526, 0xecec2fc3, + 0x5f5fe1be, 0x9797a235, 0x4444cc88, 0x1717392e, + 0xc4c45793, 0xa7a7f255, 0x7e7e82fc, 0x3d3d477a, + 0x6464acc8, 0x5d5de7ba, 0x19192b32, 0x737395e6, + 0x6060a0c0, 0x81819819, 0x4f4fd19e, 0xdcdc7fa3, + 0x22226644, 0x2a2a7e54, 0x9090ab3b, 0x8888830b, + 0x4646ca8c, 0xeeee29c7, 0xb8b8d36b, 0x14143c28, + 0xdede79a7, 0x5e5ee2bc, 0x0b0b1d16, 0xdbdb76ad, + 0xe0e03bdb, 0x32325664, 0x3a3a4e74, 0x0a0a1e14, + 0x4949db92, 0x06060a0c, 0x24246c48, 0x5c5ce4b8, + 0xc2c25d9f, 0xd3d36ebd, 0xacacef43, 0x6262a6c4, + 0x9191a839, 0x9595a431, 0xe4e437d3, 0x79798bf2, + 0xe7e732d5, 0xc8c8438b, 0x3737596e, 0x6d6db7da, + 0x8d8d8c01, 0xd5d564b1, 0x4e4ed29c, 0xa9a9e049, + 0x6c6cb4d8, 0x5656faac, 0xf4f407f3, 0xeaea25cf, + 0x6565afca, 0x7a7a8ef4, 0xaeaee947, 0x08081810, + 0xbabad56f, 0x787888f0, 0x25256f4a, 0x2e2e725c, + 0x1c1c2438, 0xa6a6f157, 0xb4b4c773, 0xc6c65197, + 0xe8e823cb, 0xdddd7ca1, 0x74749ce8, 0x1f1f213e, + 0x4b4bdd96, 0xbdbddc61, 0x8b8b860d, 0x8a8a850f, + 0x707090e0, 0x3e3e427c, 0xb5b5c471, 0x6666aacc, + 0x4848d890, 0x03030506, 0xf6f601f7, 0x0e0e121c, + 0x6161a3c2, 0x35355f6a, 0x5757f9ae, 0xb9b9d069, + 0x86869117, 0xc1c15899, 0x1d1d273a, 0x9e9eb927, + 0xe1e138d9, 0xf8f813eb, 0x9898b32b, 0x11113322, + 0x6969bbd2, 0xd9d970a9, 0x8e8e8907, 0x9494a733, + 0x9b9bb62d, 0x1e1e223c, 0x87879215, 0xe9e920c9, + 0xcece4987, 0x5555ffaa, 0x28287850, 0xdfdf7aa5, + 0x8c8c8f03, 0xa1a1f859, 0x89898009, 0x0d0d171a, + 0xbfbfda65, 0xe6e631d7, 0x4242c684, 0x6868b8d0, + 0x4141c382, 0x9999b029, 0x2d2d775a, 0x0f0f111e, + 0xb0b0cb7b, 0x5454fca8, 0xbbbbd66d, 0x16163a2c, +}; + +__constant u32 te4[256] = +{ + 0x63636363, 0x7c7c7c7c, 0x77777777, 0x7b7b7b7b, + 0xf2f2f2f2, 0x6b6b6b6b, 0x6f6f6f6f, 0xc5c5c5c5, + 0x30303030, 0x01010101, 0x67676767, 0x2b2b2b2b, + 0xfefefefe, 0xd7d7d7d7, 0xabababab, 0x76767676, + 0xcacacaca, 0x82828282, 0xc9c9c9c9, 0x7d7d7d7d, + 0xfafafafa, 0x59595959, 0x47474747, 0xf0f0f0f0, + 0xadadadad, 0xd4d4d4d4, 0xa2a2a2a2, 0xafafafaf, + 0x9c9c9c9c, 0xa4a4a4a4, 0x72727272, 0xc0c0c0c0, + 0xb7b7b7b7, 0xfdfdfdfd, 0x93939393, 0x26262626, + 0x36363636, 0x3f3f3f3f, 0xf7f7f7f7, 0xcccccccc, + 0x34343434, 0xa5a5a5a5, 0xe5e5e5e5, 0xf1f1f1f1, + 0x71717171, 0xd8d8d8d8, 0x31313131, 0x15151515, + 0x04040404, 0xc7c7c7c7, 0x23232323, 0xc3c3c3c3, + 0x18181818, 0x96969696, 0x05050505, 0x9a9a9a9a, + 0x07070707, 0x12121212, 0x80808080, 0xe2e2e2e2, + 0xebebebeb, 0x27272727, 0xb2b2b2b2, 0x75757575, + 0x09090909, 0x83838383, 0x2c2c2c2c, 0x1a1a1a1a, + 0x1b1b1b1b, 0x6e6e6e6e, 0x5a5a5a5a, 0xa0a0a0a0, + 0x52525252, 0x3b3b3b3b, 0xd6d6d6d6, 0xb3b3b3b3, + 0x29292929, 0xe3e3e3e3, 0x2f2f2f2f, 0x84848484, + 0x53535353, 0xd1d1d1d1, 0x00000000, 0xedededed, + 0x20202020, 0xfcfcfcfc, 0xb1b1b1b1, 0x5b5b5b5b, + 0x6a6a6a6a, 0xcbcbcbcb, 0xbebebebe, 0x39393939, + 0x4a4a4a4a, 0x4c4c4c4c, 0x58585858, 0xcfcfcfcf, + 0xd0d0d0d0, 0xefefefef, 0xaaaaaaaa, 0xfbfbfbfb, + 0x43434343, 0x4d4d4d4d, 0x33333333, 0x85858585, + 0x45454545, 0xf9f9f9f9, 0x02020202, 0x7f7f7f7f, + 0x50505050, 0x3c3c3c3c, 0x9f9f9f9f, 0xa8a8a8a8, + 0x51515151, 0xa3a3a3a3, 0x40404040, 0x8f8f8f8f, + 0x92929292, 0x9d9d9d9d, 0x38383838, 0xf5f5f5f5, + 0xbcbcbcbc, 0xb6b6b6b6, 0xdadadada, 0x21212121, + 0x10101010, 0xffffffff, 0xf3f3f3f3, 0xd2d2d2d2, + 0xcdcdcdcd, 0x0c0c0c0c, 0x13131313, 0xecececec, + 0x5f5f5f5f, 0x97979797, 0x44444444, 0x17171717, + 0xc4c4c4c4, 0xa7a7a7a7, 0x7e7e7e7e, 0x3d3d3d3d, + 0x64646464, 0x5d5d5d5d, 0x19191919, 0x73737373, + 0x60606060, 0x81818181, 0x4f4f4f4f, 0xdcdcdcdc, + 0x22222222, 0x2a2a2a2a, 0x90909090, 0x88888888, + 0x46464646, 0xeeeeeeee, 0xb8b8b8b8, 0x14141414, + 0xdededede, 0x5e5e5e5e, 0x0b0b0b0b, 0xdbdbdbdb, + 0xe0e0e0e0, 0x32323232, 0x3a3a3a3a, 0x0a0a0a0a, + 0x49494949, 0x06060606, 0x24242424, 0x5c5c5c5c, + 0xc2c2c2c2, 0xd3d3d3d3, 0xacacacac, 0x62626262, + 0x91919191, 0x95959595, 0xe4e4e4e4, 0x79797979, + 0xe7e7e7e7, 0xc8c8c8c8, 0x37373737, 0x6d6d6d6d, + 0x8d8d8d8d, 0xd5d5d5d5, 0x4e4e4e4e, 0xa9a9a9a9, + 0x6c6c6c6c, 0x56565656, 0xf4f4f4f4, 0xeaeaeaea, + 0x65656565, 0x7a7a7a7a, 0xaeaeaeae, 0x08080808, + 0xbabababa, 0x78787878, 0x25252525, 0x2e2e2e2e, + 0x1c1c1c1c, 0xa6a6a6a6, 0xb4b4b4b4, 0xc6c6c6c6, + 0xe8e8e8e8, 0xdddddddd, 0x74747474, 0x1f1f1f1f, + 0x4b4b4b4b, 0xbdbdbdbd, 0x8b8b8b8b, 0x8a8a8a8a, + 0x70707070, 0x3e3e3e3e, 0xb5b5b5b5, 0x66666666, + 0x48484848, 0x03030303, 0xf6f6f6f6, 0x0e0e0e0e, + 0x61616161, 0x35353535, 0x57575757, 0xb9b9b9b9, + 0x86868686, 0xc1c1c1c1, 0x1d1d1d1d, 0x9e9e9e9e, + 0xe1e1e1e1, 0xf8f8f8f8, 0x98989898, 0x11111111, + 0x69696969, 0xd9d9d9d9, 0x8e8e8e8e, 0x94949494, + 0x9b9b9b9b, 0x1e1e1e1e, 0x87878787, 0xe9e9e9e9, + 0xcececece, 0x55555555, 0x28282828, 0xdfdfdfdf, + 0x8c8c8c8c, 0xa1a1a1a1, 0x89898989, 0x0d0d0d0d, + 0xbfbfbfbf, 0xe6e6e6e6, 0x42424242, 0x68686868, + 0x41414141, 0x99999999, 0x2d2d2d2d, 0x0f0f0f0f, + 0xb0b0b0b0, 0x54545454, 0xbbbbbbbb, 0x16161616, +}; + +__constant u32 td0[256] = +{ + 0x51f4a750, 0x7e416553, 0x1a17a4c3, 0x3a275e96, + 0x3bab6bcb, 0x1f9d45f1, 0xacfa58ab, 0x4be30393, + 0x2030fa55, 0xad766df6, 0x88cc7691, 0xf5024c25, + 0x4fe5d7fc, 0xc52acbd7, 0x26354480, 0xb562a38f, + 0xdeb15a49, 0x25ba1b67, 0x45ea0e98, 0x5dfec0e1, + 0xc32f7502, 0x814cf012, 0x8d4697a3, 0x6bd3f9c6, + 0x038f5fe7, 0x15929c95, 0xbf6d7aeb, 0x955259da, + 0xd4be832d, 0x587421d3, 0x49e06929, 0x8ec9c844, + 0x75c2896a, 0xf48e7978, 0x99583e6b, 0x27b971dd, + 0xbee14fb6, 0xf088ad17, 0xc920ac66, 0x7dce3ab4, + 0x63df4a18, 0xe51a3182, 0x97513360, 0x62537f45, + 0xb16477e0, 0xbb6bae84, 0xfe81a01c, 0xf9082b94, + 0x70486858, 0x8f45fd19, 0x94de6c87, 0x527bf8b7, + 0xab73d323, 0x724b02e2, 0xe31f8f57, 0x6655ab2a, + 0xb2eb2807, 0x2fb5c203, 0x86c57b9a, 0xd33708a5, + 0x302887f2, 0x23bfa5b2, 0x02036aba, 0xed16825c, + 0x8acf1c2b, 0xa779b492, 0xf307f2f0, 0x4e69e2a1, + 0x65daf4cd, 0x0605bed5, 0xd134621f, 0xc4a6fe8a, + 0x342e539d, 0xa2f355a0, 0x058ae132, 0xa4f6eb75, + 0x0b83ec39, 0x4060efaa, 0x5e719f06, 0xbd6e1051, + 0x3e218af9, 0x96dd063d, 0xdd3e05ae, 0x4de6bd46, + 0x91548db5, 0x71c45d05, 0x0406d46f, 0x605015ff, + 0x1998fb24, 0xd6bde997, 0x894043cc, 0x67d99e77, + 0xb0e842bd, 0x07898b88, 0xe7195b38, 0x79c8eedb, + 0xa17c0a47, 0x7c420fe9, 0xf8841ec9, 0x00000000, + 0x09808683, 0x322bed48, 0x1e1170ac, 0x6c5a724e, + 0xfd0efffb, 0x0f853856, 0x3daed51e, 0x362d3927, + 0x0a0fd964, 0x685ca621, 0x9b5b54d1, 0x24362e3a, + 0x0c0a67b1, 0x9357e70f, 0xb4ee96d2, 0x1b9b919e, + 0x80c0c54f, 0x61dc20a2, 0x5a774b69, 0x1c121a16, + 0xe293ba0a, 0xc0a02ae5, 0x3c22e043, 0x121b171d, + 0x0e090d0b, 0xf28bc7ad, 0x2db6a8b9, 0x141ea9c8, + 0x57f11985, 0xaf75074c, 0xee99ddbb, 0xa37f60fd, + 0xf701269f, 0x5c72f5bc, 0x44663bc5, 0x5bfb7e34, + 0x8b432976, 0xcb23c6dc, 0xb6edfc68, 0xb8e4f163, + 0xd731dcca, 0x42638510, 0x13972240, 0x84c61120, + 0x854a247d, 0xd2bb3df8, 0xaef93211, 0xc729a16d, + 0x1d9e2f4b, 0xdcb230f3, 0x0d8652ec, 0x77c1e3d0, + 0x2bb3166c, 0xa970b999, 0x119448fa, 0x47e96422, + 0xa8fc8cc4, 0xa0f03f1a, 0x567d2cd8, 0x223390ef, + 0x87494ec7, 0xd938d1c1, 0x8ccaa2fe, 0x98d40b36, + 0xa6f581cf, 0xa57ade28, 0xdab78e26, 0x3fadbfa4, + 0x2c3a9de4, 0x5078920d, 0x6a5fcc9b, 0x547e4662, + 0xf68d13c2, 0x90d8b8e8, 0x2e39f75e, 0x82c3aff5, + 0x9f5d80be, 0x69d0937c, 0x6fd52da9, 0xcf2512b3, + 0xc8ac993b, 0x10187da7, 0xe89c636e, 0xdb3bbb7b, + 0xcd267809, 0x6e5918f4, 0xec9ab701, 0x834f9aa8, + 0xe6956e65, 0xaaffe67e, 0x21bccf08, 0xef15e8e6, + 0xbae79bd9, 0x4a6f36ce, 0xea9f09d4, 0x29b07cd6, + 0x31a4b2af, 0x2a3f2331, 0xc6a59430, 0x35a266c0, + 0x744ebc37, 0xfc82caa6, 0xe090d0b0, 0x33a7d815, + 0xf104984a, 0x41ecdaf7, 0x7fcd500e, 0x1791f62f, + 0x764dd68d, 0x43efb04d, 0xccaa4d54, 0xe49604df, + 0x9ed1b5e3, 0x4c6a881b, 0xc12c1fb8, 0x4665517f, + 0x9d5eea04, 0x018c355d, 0xfa877473, 0xfb0b412e, + 0xb3671d5a, 0x92dbd252, 0xe9105633, 0x6dd64713, + 0x9ad7618c, 0x37a10c7a, 0x59f8148e, 0xeb133c89, + 0xcea927ee, 0xb761c935, 0xe11ce5ed, 0x7a47b13c, + 0x9cd2df59, 0x55f2733f, 0x1814ce79, 0x73c737bf, + 0x53f7cdea, 0x5ffdaa5b, 0xdf3d6f14, 0x7844db86, + 0xcaaff381, 0xb968c43e, 0x3824342c, 0xc2a3405f, + 0x161dc372, 0xbce2250c, 0x283c498b, 0xff0d9541, + 0x39a80171, 0x080cb3de, 0xd8b4e49c, 0x6456c190, + 0x7bcb8461, 0xd532b670, 0x486c5c74, 0xd0b85742, +}; + +__constant u32 td1[256] = +{ + 0x5051f4a7, 0x537e4165, 0xc31a17a4, 0x963a275e, + 0xcb3bab6b, 0xf11f9d45, 0xabacfa58, 0x934be303, + 0x552030fa, 0xf6ad766d, 0x9188cc76, 0x25f5024c, + 0xfc4fe5d7, 0xd7c52acb, 0x80263544, 0x8fb562a3, + 0x49deb15a, 0x6725ba1b, 0x9845ea0e, 0xe15dfec0, + 0x02c32f75, 0x12814cf0, 0xa38d4697, 0xc66bd3f9, + 0xe7038f5f, 0x9515929c, 0xebbf6d7a, 0xda955259, + 0x2dd4be83, 0xd3587421, 0x2949e069, 0x448ec9c8, + 0x6a75c289, 0x78f48e79, 0x6b99583e, 0xdd27b971, + 0xb6bee14f, 0x17f088ad, 0x66c920ac, 0xb47dce3a, + 0x1863df4a, 0x82e51a31, 0x60975133, 0x4562537f, + 0xe0b16477, 0x84bb6bae, 0x1cfe81a0, 0x94f9082b, + 0x58704868, 0x198f45fd, 0x8794de6c, 0xb7527bf8, + 0x23ab73d3, 0xe2724b02, 0x57e31f8f, 0x2a6655ab, + 0x07b2eb28, 0x032fb5c2, 0x9a86c57b, 0xa5d33708, + 0xf2302887, 0xb223bfa5, 0xba02036a, 0x5ced1682, + 0x2b8acf1c, 0x92a779b4, 0xf0f307f2, 0xa14e69e2, + 0xcd65daf4, 0xd50605be, 0x1fd13462, 0x8ac4a6fe, + 0x9d342e53, 0xa0a2f355, 0x32058ae1, 0x75a4f6eb, + 0x390b83ec, 0xaa4060ef, 0x065e719f, 0x51bd6e10, + 0xf93e218a, 0x3d96dd06, 0xaedd3e05, 0x464de6bd, + 0xb591548d, 0x0571c45d, 0x6f0406d4, 0xff605015, + 0x241998fb, 0x97d6bde9, 0xcc894043, 0x7767d99e, + 0xbdb0e842, 0x8807898b, 0x38e7195b, 0xdb79c8ee, + 0x47a17c0a, 0xe97c420f, 0xc9f8841e, 0x00000000, + 0x83098086, 0x48322bed, 0xac1e1170, 0x4e6c5a72, + 0xfbfd0eff, 0x560f8538, 0x1e3daed5, 0x27362d39, + 0x640a0fd9, 0x21685ca6, 0xd19b5b54, 0x3a24362e, + 0xb10c0a67, 0x0f9357e7, 0xd2b4ee96, 0x9e1b9b91, + 0x4f80c0c5, 0xa261dc20, 0x695a774b, 0x161c121a, + 0x0ae293ba, 0xe5c0a02a, 0x433c22e0, 0x1d121b17, + 0x0b0e090d, 0xadf28bc7, 0xb92db6a8, 0xc8141ea9, + 0x8557f119, 0x4caf7507, 0xbbee99dd, 0xfda37f60, + 0x9ff70126, 0xbc5c72f5, 0xc544663b, 0x345bfb7e, + 0x768b4329, 0xdccb23c6, 0x68b6edfc, 0x63b8e4f1, + 0xcad731dc, 0x10426385, 0x40139722, 0x2084c611, + 0x7d854a24, 0xf8d2bb3d, 0x11aef932, 0x6dc729a1, + 0x4b1d9e2f, 0xf3dcb230, 0xec0d8652, 0xd077c1e3, + 0x6c2bb316, 0x99a970b9, 0xfa119448, 0x2247e964, + 0xc4a8fc8c, 0x1aa0f03f, 0xd8567d2c, 0xef223390, + 0xc787494e, 0xc1d938d1, 0xfe8ccaa2, 0x3698d40b, + 0xcfa6f581, 0x28a57ade, 0x26dab78e, 0xa43fadbf, + 0xe42c3a9d, 0x0d507892, 0x9b6a5fcc, 0x62547e46, + 0xc2f68d13, 0xe890d8b8, 0x5e2e39f7, 0xf582c3af, + 0xbe9f5d80, 0x7c69d093, 0xa96fd52d, 0xb3cf2512, + 0x3bc8ac99, 0xa710187d, 0x6ee89c63, 0x7bdb3bbb, + 0x09cd2678, 0xf46e5918, 0x01ec9ab7, 0xa8834f9a, + 0x65e6956e, 0x7eaaffe6, 0x0821bccf, 0xe6ef15e8, + 0xd9bae79b, 0xce4a6f36, 0xd4ea9f09, 0xd629b07c, + 0xaf31a4b2, 0x312a3f23, 0x30c6a594, 0xc035a266, + 0x37744ebc, 0xa6fc82ca, 0xb0e090d0, 0x1533a7d8, + 0x4af10498, 0xf741ecda, 0x0e7fcd50, 0x2f1791f6, + 0x8d764dd6, 0x4d43efb0, 0x54ccaa4d, 0xdfe49604, + 0xe39ed1b5, 0x1b4c6a88, 0xb8c12c1f, 0x7f466551, + 0x049d5eea, 0x5d018c35, 0x73fa8774, 0x2efb0b41, + 0x5ab3671d, 0x5292dbd2, 0x33e91056, 0x136dd647, + 0x8c9ad761, 0x7a37a10c, 0x8e59f814, 0x89eb133c, + 0xeecea927, 0x35b761c9, 0xede11ce5, 0x3c7a47b1, + 0x599cd2df, 0x3f55f273, 0x791814ce, 0xbf73c737, + 0xea53f7cd, 0x5b5ffdaa, 0x14df3d6f, 0x867844db, + 0x81caaff3, 0x3eb968c4, 0x2c382434, 0x5fc2a340, + 0x72161dc3, 0x0cbce225, 0x8b283c49, 0x41ff0d95, + 0x7139a801, 0xde080cb3, 0x9cd8b4e4, 0x906456c1, + 0x617bcb84, 0x70d532b6, 0x74486c5c, 0x42d0b857, +}; + +__constant u32 td2[256] = +{ + 0xa75051f4, 0x65537e41, 0xa4c31a17, 0x5e963a27, + 0x6bcb3bab, 0x45f11f9d, 0x58abacfa, 0x03934be3, + 0xfa552030, 0x6df6ad76, 0x769188cc, 0x4c25f502, + 0xd7fc4fe5, 0xcbd7c52a, 0x44802635, 0xa38fb562, + 0x5a49deb1, 0x1b6725ba, 0x0e9845ea, 0xc0e15dfe, + 0x7502c32f, 0xf012814c, 0x97a38d46, 0xf9c66bd3, + 0x5fe7038f, 0x9c951592, 0x7aebbf6d, 0x59da9552, + 0x832dd4be, 0x21d35874, 0x692949e0, 0xc8448ec9, + 0x896a75c2, 0x7978f48e, 0x3e6b9958, 0x71dd27b9, + 0x4fb6bee1, 0xad17f088, 0xac66c920, 0x3ab47dce, + 0x4a1863df, 0x3182e51a, 0x33609751, 0x7f456253, + 0x77e0b164, 0xae84bb6b, 0xa01cfe81, 0x2b94f908, + 0x68587048, 0xfd198f45, 0x6c8794de, 0xf8b7527b, + 0xd323ab73, 0x02e2724b, 0x8f57e31f, 0xab2a6655, + 0x2807b2eb, 0xc2032fb5, 0x7b9a86c5, 0x08a5d337, + 0x87f23028, 0xa5b223bf, 0x6aba0203, 0x825ced16, + 0x1c2b8acf, 0xb492a779, 0xf2f0f307, 0xe2a14e69, + 0xf4cd65da, 0xbed50605, 0x621fd134, 0xfe8ac4a6, + 0x539d342e, 0x55a0a2f3, 0xe132058a, 0xeb75a4f6, + 0xec390b83, 0xefaa4060, 0x9f065e71, 0x1051bd6e, + 0x8af93e21, 0x063d96dd, 0x05aedd3e, 0xbd464de6, + 0x8db59154, 0x5d0571c4, 0xd46f0406, 0x15ff6050, + 0xfb241998, 0xe997d6bd, 0x43cc8940, 0x9e7767d9, + 0x42bdb0e8, 0x8b880789, 0x5b38e719, 0xeedb79c8, + 0x0a47a17c, 0x0fe97c42, 0x1ec9f884, 0x00000000, + 0x86830980, 0xed48322b, 0x70ac1e11, 0x724e6c5a, + 0xfffbfd0e, 0x38560f85, 0xd51e3dae, 0x3927362d, + 0xd9640a0f, 0xa621685c, 0x54d19b5b, 0x2e3a2436, + 0x67b10c0a, 0xe70f9357, 0x96d2b4ee, 0x919e1b9b, + 0xc54f80c0, 0x20a261dc, 0x4b695a77, 0x1a161c12, + 0xba0ae293, 0x2ae5c0a0, 0xe0433c22, 0x171d121b, + 0x0d0b0e09, 0xc7adf28b, 0xa8b92db6, 0xa9c8141e, + 0x198557f1, 0x074caf75, 0xddbbee99, 0x60fda37f, + 0x269ff701, 0xf5bc5c72, 0x3bc54466, 0x7e345bfb, + 0x29768b43, 0xc6dccb23, 0xfc68b6ed, 0xf163b8e4, + 0xdccad731, 0x85104263, 0x22401397, 0x112084c6, + 0x247d854a, 0x3df8d2bb, 0x3211aef9, 0xa16dc729, + 0x2f4b1d9e, 0x30f3dcb2, 0x52ec0d86, 0xe3d077c1, + 0x166c2bb3, 0xb999a970, 0x48fa1194, 0x642247e9, + 0x8cc4a8fc, 0x3f1aa0f0, 0x2cd8567d, 0x90ef2233, + 0x4ec78749, 0xd1c1d938, 0xa2fe8cca, 0x0b3698d4, + 0x81cfa6f5, 0xde28a57a, 0x8e26dab7, 0xbfa43fad, + 0x9de42c3a, 0x920d5078, 0xcc9b6a5f, 0x4662547e, + 0x13c2f68d, 0xb8e890d8, 0xf75e2e39, 0xaff582c3, + 0x80be9f5d, 0x937c69d0, 0x2da96fd5, 0x12b3cf25, + 0x993bc8ac, 0x7da71018, 0x636ee89c, 0xbb7bdb3b, + 0x7809cd26, 0x18f46e59, 0xb701ec9a, 0x9aa8834f, + 0x6e65e695, 0xe67eaaff, 0xcf0821bc, 0xe8e6ef15, + 0x9bd9bae7, 0x36ce4a6f, 0x09d4ea9f, 0x7cd629b0, + 0xb2af31a4, 0x23312a3f, 0x9430c6a5, 0x66c035a2, + 0xbc37744e, 0xcaa6fc82, 0xd0b0e090, 0xd81533a7, + 0x984af104, 0xdaf741ec, 0x500e7fcd, 0xf62f1791, + 0xd68d764d, 0xb04d43ef, 0x4d54ccaa, 0x04dfe496, + 0xb5e39ed1, 0x881b4c6a, 0x1fb8c12c, 0x517f4665, + 0xea049d5e, 0x355d018c, 0x7473fa87, 0x412efb0b, + 0x1d5ab367, 0xd25292db, 0x5633e910, 0x47136dd6, + 0x618c9ad7, 0x0c7a37a1, 0x148e59f8, 0x3c89eb13, + 0x27eecea9, 0xc935b761, 0xe5ede11c, 0xb13c7a47, + 0xdf599cd2, 0x733f55f2, 0xce791814, 0x37bf73c7, + 0xcdea53f7, 0xaa5b5ffd, 0x6f14df3d, 0xdb867844, + 0xf381caaf, 0xc43eb968, 0x342c3824, 0x405fc2a3, + 0xc372161d, 0x250cbce2, 0x498b283c, 0x9541ff0d, + 0x017139a8, 0xb3de080c, 0xe49cd8b4, 0xc1906456, + 0x84617bcb, 0xb670d532, 0x5c74486c, 0x5742d0b8, +}; + +__constant u32 td3[256] = +{ + 0xf4a75051, 0x4165537e, 0x17a4c31a, 0x275e963a, + 0xab6bcb3b, 0x9d45f11f, 0xfa58abac, 0xe303934b, + 0x30fa5520, 0x766df6ad, 0xcc769188, 0x024c25f5, + 0xe5d7fc4f, 0x2acbd7c5, 0x35448026, 0x62a38fb5, + 0xb15a49de, 0xba1b6725, 0xea0e9845, 0xfec0e15d, + 0x2f7502c3, 0x4cf01281, 0x4697a38d, 0xd3f9c66b, + 0x8f5fe703, 0x929c9515, 0x6d7aebbf, 0x5259da95, + 0xbe832dd4, 0x7421d358, 0xe0692949, 0xc9c8448e, + 0xc2896a75, 0x8e7978f4, 0x583e6b99, 0xb971dd27, + 0xe14fb6be, 0x88ad17f0, 0x20ac66c9, 0xce3ab47d, + 0xdf4a1863, 0x1a3182e5, 0x51336097, 0x537f4562, + 0x6477e0b1, 0x6bae84bb, 0x81a01cfe, 0x082b94f9, + 0x48685870, 0x45fd198f, 0xde6c8794, 0x7bf8b752, + 0x73d323ab, 0x4b02e272, 0x1f8f57e3, 0x55ab2a66, + 0xeb2807b2, 0xb5c2032f, 0xc57b9a86, 0x3708a5d3, + 0x2887f230, 0xbfa5b223, 0x036aba02, 0x16825ced, + 0xcf1c2b8a, 0x79b492a7, 0x07f2f0f3, 0x69e2a14e, + 0xdaf4cd65, 0x05bed506, 0x34621fd1, 0xa6fe8ac4, + 0x2e539d34, 0xf355a0a2, 0x8ae13205, 0xf6eb75a4, + 0x83ec390b, 0x60efaa40, 0x719f065e, 0x6e1051bd, + 0x218af93e, 0xdd063d96, 0x3e05aedd, 0xe6bd464d, + 0x548db591, 0xc45d0571, 0x06d46f04, 0x5015ff60, + 0x98fb2419, 0xbde997d6, 0x4043cc89, 0xd99e7767, + 0xe842bdb0, 0x898b8807, 0x195b38e7, 0xc8eedb79, + 0x7c0a47a1, 0x420fe97c, 0x841ec9f8, 0x00000000, + 0x80868309, 0x2bed4832, 0x1170ac1e, 0x5a724e6c, + 0x0efffbfd, 0x8538560f, 0xaed51e3d, 0x2d392736, + 0x0fd9640a, 0x5ca62168, 0x5b54d19b, 0x362e3a24, + 0x0a67b10c, 0x57e70f93, 0xee96d2b4, 0x9b919e1b, + 0xc0c54f80, 0xdc20a261, 0x774b695a, 0x121a161c, + 0x93ba0ae2, 0xa02ae5c0, 0x22e0433c, 0x1b171d12, + 0x090d0b0e, 0x8bc7adf2, 0xb6a8b92d, 0x1ea9c814, + 0xf1198557, 0x75074caf, 0x99ddbbee, 0x7f60fda3, + 0x01269ff7, 0x72f5bc5c, 0x663bc544, 0xfb7e345b, + 0x4329768b, 0x23c6dccb, 0xedfc68b6, 0xe4f163b8, + 0x31dccad7, 0x63851042, 0x97224013, 0xc6112084, + 0x4a247d85, 0xbb3df8d2, 0xf93211ae, 0x29a16dc7, + 0x9e2f4b1d, 0xb230f3dc, 0x8652ec0d, 0xc1e3d077, + 0xb3166c2b, 0x70b999a9, 0x9448fa11, 0xe9642247, + 0xfc8cc4a8, 0xf03f1aa0, 0x7d2cd856, 0x3390ef22, + 0x494ec787, 0x38d1c1d9, 0xcaa2fe8c, 0xd40b3698, + 0xf581cfa6, 0x7ade28a5, 0xb78e26da, 0xadbfa43f, + 0x3a9de42c, 0x78920d50, 0x5fcc9b6a, 0x7e466254, + 0x8d13c2f6, 0xd8b8e890, 0x39f75e2e, 0xc3aff582, + 0x5d80be9f, 0xd0937c69, 0xd52da96f, 0x2512b3cf, + 0xac993bc8, 0x187da710, 0x9c636ee8, 0x3bbb7bdb, + 0x267809cd, 0x5918f46e, 0x9ab701ec, 0x4f9aa883, + 0x956e65e6, 0xffe67eaa, 0xbccf0821, 0x15e8e6ef, + 0xe79bd9ba, 0x6f36ce4a, 0x9f09d4ea, 0xb07cd629, + 0xa4b2af31, 0x3f23312a, 0xa59430c6, 0xa266c035, + 0x4ebc3774, 0x82caa6fc, 0x90d0b0e0, 0xa7d81533, + 0x04984af1, 0xecdaf741, 0xcd500e7f, 0x91f62f17, + 0x4dd68d76, 0xefb04d43, 0xaa4d54cc, 0x9604dfe4, + 0xd1b5e39e, 0x6a881b4c, 0x2c1fb8c1, 0x65517f46, + 0x5eea049d, 0x8c355d01, 0x877473fa, 0x0b412efb, + 0x671d5ab3, 0xdbd25292, 0x105633e9, 0xd647136d, + 0xd7618c9a, 0xa10c7a37, 0xf8148e59, 0x133c89eb, + 0xa927eece, 0x61c935b7, 0x1ce5ede1, 0x47b13c7a, + 0xd2df599c, 0xf2733f55, 0x14ce7918, 0xc737bf73, + 0xf7cdea53, 0xfdaa5b5f, 0x3d6f14df, 0x44db8678, + 0xaff381ca, 0x68c43eb9, 0x24342c38, 0xa3405fc2, + 0x1dc37216, 0xe2250cbc, 0x3c498b28, 0x0d9541ff, + 0xa8017139, 0x0cb3de08, 0xb4e49cd8, 0x56c19064, + 0xcb84617b, 0x32b670d5, 0x6c5c7448, 0xb85742d0, +}; + +__constant u32 td4[256] = +{ + 0x52525252, 0x09090909, 0x6a6a6a6a, 0xd5d5d5d5, + 0x30303030, 0x36363636, 0xa5a5a5a5, 0x38383838, + 0xbfbfbfbf, 0x40404040, 0xa3a3a3a3, 0x9e9e9e9e, + 0x81818181, 0xf3f3f3f3, 0xd7d7d7d7, 0xfbfbfbfb, + 0x7c7c7c7c, 0xe3e3e3e3, 0x39393939, 0x82828282, + 0x9b9b9b9b, 0x2f2f2f2f, 0xffffffff, 0x87878787, + 0x34343434, 0x8e8e8e8e, 0x43434343, 0x44444444, + 0xc4c4c4c4, 0xdededede, 0xe9e9e9e9, 0xcbcbcbcb, + 0x54545454, 0x7b7b7b7b, 0x94949494, 0x32323232, + 0xa6a6a6a6, 0xc2c2c2c2, 0x23232323, 0x3d3d3d3d, + 0xeeeeeeee, 0x4c4c4c4c, 0x95959595, 0x0b0b0b0b, + 0x42424242, 0xfafafafa, 0xc3c3c3c3, 0x4e4e4e4e, + 0x08080808, 0x2e2e2e2e, 0xa1a1a1a1, 0x66666666, + 0x28282828, 0xd9d9d9d9, 0x24242424, 0xb2b2b2b2, + 0x76767676, 0x5b5b5b5b, 0xa2a2a2a2, 0x49494949, + 0x6d6d6d6d, 0x8b8b8b8b, 0xd1d1d1d1, 0x25252525, + 0x72727272, 0xf8f8f8f8, 0xf6f6f6f6, 0x64646464, + 0x86868686, 0x68686868, 0x98989898, 0x16161616, + 0xd4d4d4d4, 0xa4a4a4a4, 0x5c5c5c5c, 0xcccccccc, + 0x5d5d5d5d, 0x65656565, 0xb6b6b6b6, 0x92929292, + 0x6c6c6c6c, 0x70707070, 0x48484848, 0x50505050, + 0xfdfdfdfd, 0xedededed, 0xb9b9b9b9, 0xdadadada, + 0x5e5e5e5e, 0x15151515, 0x46464646, 0x57575757, + 0xa7a7a7a7, 0x8d8d8d8d, 0x9d9d9d9d, 0x84848484, + 0x90909090, 0xd8d8d8d8, 0xabababab, 0x00000000, + 0x8c8c8c8c, 0xbcbcbcbc, 0xd3d3d3d3, 0x0a0a0a0a, + 0xf7f7f7f7, 0xe4e4e4e4, 0x58585858, 0x05050505, + 0xb8b8b8b8, 0xb3b3b3b3, 0x45454545, 0x06060606, + 0xd0d0d0d0, 0x2c2c2c2c, 0x1e1e1e1e, 0x8f8f8f8f, + 0xcacacaca, 0x3f3f3f3f, 0x0f0f0f0f, 0x02020202, + 0xc1c1c1c1, 0xafafafaf, 0xbdbdbdbd, 0x03030303, + 0x01010101, 0x13131313, 0x8a8a8a8a, 0x6b6b6b6b, + 0x3a3a3a3a, 0x91919191, 0x11111111, 0x41414141, + 0x4f4f4f4f, 0x67676767, 0xdcdcdcdc, 0xeaeaeaea, + 0x97979797, 0xf2f2f2f2, 0xcfcfcfcf, 0xcececece, + 0xf0f0f0f0, 0xb4b4b4b4, 0xe6e6e6e6, 0x73737373, + 0x96969696, 0xacacacac, 0x74747474, 0x22222222, + 0xe7e7e7e7, 0xadadadad, 0x35353535, 0x85858585, + 0xe2e2e2e2, 0xf9f9f9f9, 0x37373737, 0xe8e8e8e8, + 0x1c1c1c1c, 0x75757575, 0xdfdfdfdf, 0x6e6e6e6e, + 0x47474747, 0xf1f1f1f1, 0x1a1a1a1a, 0x71717171, + 0x1d1d1d1d, 0x29292929, 0xc5c5c5c5, 0x89898989, + 0x6f6f6f6f, 0xb7b7b7b7, 0x62626262, 0x0e0e0e0e, + 0xaaaaaaaa, 0x18181818, 0xbebebebe, 0x1b1b1b1b, + 0xfcfcfcfc, 0x56565656, 0x3e3e3e3e, 0x4b4b4b4b, + 0xc6c6c6c6, 0xd2d2d2d2, 0x79797979, 0x20202020, + 0x9a9a9a9a, 0xdbdbdbdb, 0xc0c0c0c0, 0xfefefefe, + 0x78787878, 0xcdcdcdcd, 0x5a5a5a5a, 0xf4f4f4f4, + 0x1f1f1f1f, 0xdddddddd, 0xa8a8a8a8, 0x33333333, + 0x88888888, 0x07070707, 0xc7c7c7c7, 0x31313131, + 0xb1b1b1b1, 0x12121212, 0x10101010, 0x59595959, + 0x27272727, 0x80808080, 0xecececec, 0x5f5f5f5f, + 0x60606060, 0x51515151, 0x7f7f7f7f, 0xa9a9a9a9, + 0x19191919, 0xb5b5b5b5, 0x4a4a4a4a, 0x0d0d0d0d, + 0x2d2d2d2d, 0xe5e5e5e5, 0x7a7a7a7a, 0x9f9f9f9f, + 0x93939393, 0xc9c9c9c9, 0x9c9c9c9c, 0xefefefef, + 0xa0a0a0a0, 0xe0e0e0e0, 0x3b3b3b3b, 0x4d4d4d4d, + 0xaeaeaeae, 0x2a2a2a2a, 0xf5f5f5f5, 0xb0b0b0b0, + 0xc8c8c8c8, 0xebebebeb, 0xbbbbbbbb, 0x3c3c3c3c, + 0x83838383, 0x53535353, 0x99999999, 0x61616161, + 0x17171717, 0x2b2b2b2b, 0x04040404, 0x7e7e7e7e, + 0xbabababa, 0x77777777, 0xd6d6d6d6, 0x26262626, + 0xe1e1e1e1, 0x69696969, 0x14141414, 0x63636363, + 0x55555555, 0x21212121, 0x0c0c0c0c, 0x7d7d7d7d, +}; + +__constant u32 rcon[] = +{ + 0x01000000, 0x02000000, 0x04000000, 0x08000000, + 0x10000000, 0x20000000, 0x40000000, 0x80000000, + 0x1b000000, 0x36000000, +}; + +static void AES256_ExpandKey (u32 *userkey, u32 *rek, __local u32 s_te0[256], __local u32 s_te1[256], __local u32 s_te2[256], __local u32 s_te3[256], __local u32 s_te4[256]) +{ + rek[0] = userkey[0]; + rek[1] = userkey[1]; + rek[2] = userkey[2]; + rek[3] = userkey[3]; + rek[4] = userkey[4]; + rek[5] = userkey[5]; + rek[6] = userkey[6]; + rek[7] = userkey[7]; + + int i; + int j; + + i = 0; + j = 0; + + u32 run = 1; + + while (run) + { + u32 temp = rek[j + 7]; + + rek[j + 8] = rek[j + 0] + ^ (s_te2[(temp >> 16) & 0xff] & 0xff000000) + ^ (s_te3[(temp >> 8) & 0xff] & 0x00ff0000) + ^ (s_te0[(temp >> 0) & 0xff] & 0x0000ff00) + ^ (s_te1[(temp >> 24) & 0xff] & 0x000000ff) + ^ rcon[i]; + + rek[j + 9] = rek[j + 1] ^ rek[j + 8]; + rek[j + 10] = rek[j + 2] ^ rek[j + 9]; + rek[j + 11] = rek[j + 3] ^ rek[j + 10]; + + if (++i == 7) + { + run = 0; + continue; + } + + temp = rek[j + 11]; + + rek[j + 12] = rek[j + 4] + ^ (s_te2[(temp >> 24) & 0xff] & 0xff000000) + ^ (s_te3[(temp >> 16) & 0xff] & 0x00ff0000) + ^ (s_te0[(temp >> 8) & 0xff] & 0x0000ff00) + ^ (s_te1[(temp >> 0) & 0xff] & 0x000000ff); + + rek[j + 13] = rek[j + 5] ^ rek[j + 12]; + rek[j + 14] = rek[j + 6] ^ rek[j + 13]; + rek[j + 15] = rek[j + 7] ^ rek[j + 14]; + + j += 8; + } +} + +static void AES256_InvertKey (u32 *rdk, __local u32 s_td0[256], __local u32 s_td1[256], __local u32 s_td2[256], __local u32 s_td3[256], __local u32 s_td4[256], __local u32 s_te0[256], __local u32 s_te1[256], __local u32 s_te2[256], __local u32 s_te3[256], __local u32 s_te4[256]) +{ + for (u32 i = 0, j = 56; i < j; i += 4, j -= 4) + { + u32 temp; + + temp = rdk[i + 0]; rdk[i + 0] = rdk[j + 0]; rdk[j + 0] = temp; + temp = rdk[i + 1]; rdk[i + 1] = rdk[j + 1]; rdk[j + 1] = temp; + temp = rdk[i + 2]; rdk[i + 2] = rdk[j + 2]; rdk[j + 2] = temp; + temp = rdk[i + 3]; rdk[i + 3] = rdk[j + 3]; rdk[j + 3] = temp; + } + + for (u32 i = 1, j = 4; i < 14; i += 1, j += 4) + { + rdk[j + 0] = + s_td0[s_te1[(rdk[j + 0] >> 24) & 0xff] & 0xff] ^ + s_td1[s_te1[(rdk[j + 0] >> 16) & 0xff] & 0xff] ^ + s_td2[s_te1[(rdk[j + 0] >> 8) & 0xff] & 0xff] ^ + s_td3[s_te1[(rdk[j + 0] >> 0) & 0xff] & 0xff]; + + rdk[j + 1] = + s_td0[s_te1[(rdk[j + 1] >> 24) & 0xff] & 0xff] ^ + s_td1[s_te1[(rdk[j + 1] >> 16) & 0xff] & 0xff] ^ + s_td2[s_te1[(rdk[j + 1] >> 8) & 0xff] & 0xff] ^ + s_td3[s_te1[(rdk[j + 1] >> 0) & 0xff] & 0xff]; + + rdk[j + 2] = + s_td0[s_te1[(rdk[j + 2] >> 24) & 0xff] & 0xff] ^ + s_td1[s_te1[(rdk[j + 2] >> 16) & 0xff] & 0xff] ^ + s_td2[s_te1[(rdk[j + 2] >> 8) & 0xff] & 0xff] ^ + s_td3[s_te1[(rdk[j + 2] >> 0) & 0xff] & 0xff]; + + rdk[j + 3] = + s_td0[s_te1[(rdk[j + 3] >> 24) & 0xff] & 0xff] ^ + s_td1[s_te1[(rdk[j + 3] >> 16) & 0xff] & 0xff] ^ + s_td2[s_te1[(rdk[j + 3] >> 8) & 0xff] & 0xff] ^ + s_td3[s_te1[(rdk[j + 3] >> 0) & 0xff] & 0xff]; + } +} + +static void AES256_decrypt (const u32 *in, u32 *out, const u32 *rdk, __local u32 s_td0[256], __local u32 s_td1[256], __local u32 s_td2[256], __local u32 s_td3[256], __local u32 s_td4[256]) +{ + u32 s0 = in[0] ^ rdk[0]; + u32 s1 = in[1] ^ rdk[1]; + u32 s2 = in[2] ^ rdk[2]; + u32 s3 = in[3] ^ rdk[3]; + + u32 t0; + u32 t1; + u32 t2; + u32 t3; + + t0 = s_td0[s0 >> 24] ^ s_td1[(s3 >> 16) & 0xff] ^ s_td2[(s2 >> 8) & 0xff] ^ s_td3[s1 & 0xff] ^ rdk[ 4]; + t1 = s_td0[s1 >> 24] ^ s_td1[(s0 >> 16) & 0xff] ^ s_td2[(s3 >> 8) & 0xff] ^ s_td3[s2 & 0xff] ^ rdk[ 5]; + t2 = s_td0[s2 >> 24] ^ s_td1[(s1 >> 16) & 0xff] ^ s_td2[(s0 >> 8) & 0xff] ^ s_td3[s3 & 0xff] ^ rdk[ 6]; + t3 = s_td0[s3 >> 24] ^ s_td1[(s2 >> 16) & 0xff] ^ s_td2[(s1 >> 8) & 0xff] ^ s_td3[s0 & 0xff] ^ rdk[ 7]; + s0 = s_td0[t0 >> 24] ^ s_td1[(t3 >> 16) & 0xff] ^ s_td2[(t2 >> 8) & 0xff] ^ s_td3[t1 & 0xff] ^ rdk[ 8]; + s1 = s_td0[t1 >> 24] ^ s_td1[(t0 >> 16) & 0xff] ^ s_td2[(t3 >> 8) & 0xff] ^ s_td3[t2 & 0xff] ^ rdk[ 9]; + s2 = s_td0[t2 >> 24] ^ s_td1[(t1 >> 16) & 0xff] ^ s_td2[(t0 >> 8) & 0xff] ^ s_td3[t3 & 0xff] ^ rdk[10]; + s3 = s_td0[t3 >> 24] ^ s_td1[(t2 >> 16) & 0xff] ^ s_td2[(t1 >> 8) & 0xff] ^ s_td3[t0 & 0xff] ^ rdk[11]; + t0 = s_td0[s0 >> 24] ^ s_td1[(s3 >> 16) & 0xff] ^ s_td2[(s2 >> 8) & 0xff] ^ s_td3[s1 & 0xff] ^ rdk[12]; + t1 = s_td0[s1 >> 24] ^ s_td1[(s0 >> 16) & 0xff] ^ s_td2[(s3 >> 8) & 0xff] ^ s_td3[s2 & 0xff] ^ rdk[13]; + t2 = s_td0[s2 >> 24] ^ s_td1[(s1 >> 16) & 0xff] ^ s_td2[(s0 >> 8) & 0xff] ^ s_td3[s3 & 0xff] ^ rdk[14]; + t3 = s_td0[s3 >> 24] ^ s_td1[(s2 >> 16) & 0xff] ^ s_td2[(s1 >> 8) & 0xff] ^ s_td3[s0 & 0xff] ^ rdk[15]; + s0 = s_td0[t0 >> 24] ^ s_td1[(t3 >> 16) & 0xff] ^ s_td2[(t2 >> 8) & 0xff] ^ s_td3[t1 & 0xff] ^ rdk[16]; + s1 = s_td0[t1 >> 24] ^ s_td1[(t0 >> 16) & 0xff] ^ s_td2[(t3 >> 8) & 0xff] ^ s_td3[t2 & 0xff] ^ rdk[17]; + s2 = s_td0[t2 >> 24] ^ s_td1[(t1 >> 16) & 0xff] ^ s_td2[(t0 >> 8) & 0xff] ^ s_td3[t3 & 0xff] ^ rdk[18]; + s3 = s_td0[t3 >> 24] ^ s_td1[(t2 >> 16) & 0xff] ^ s_td2[(t1 >> 8) & 0xff] ^ s_td3[t0 & 0xff] ^ rdk[19]; + t0 = s_td0[s0 >> 24] ^ s_td1[(s3 >> 16) & 0xff] ^ s_td2[(s2 >> 8) & 0xff] ^ s_td3[s1 & 0xff] ^ rdk[20]; + t1 = s_td0[s1 >> 24] ^ s_td1[(s0 >> 16) & 0xff] ^ s_td2[(s3 >> 8) & 0xff] ^ s_td3[s2 & 0xff] ^ rdk[21]; + t2 = s_td0[s2 >> 24] ^ s_td1[(s1 >> 16) & 0xff] ^ s_td2[(s0 >> 8) & 0xff] ^ s_td3[s3 & 0xff] ^ rdk[22]; + t3 = s_td0[s3 >> 24] ^ s_td1[(s2 >> 16) & 0xff] ^ s_td2[(s1 >> 8) & 0xff] ^ s_td3[s0 & 0xff] ^ rdk[23]; + s0 = s_td0[t0 >> 24] ^ s_td1[(t3 >> 16) & 0xff] ^ s_td2[(t2 >> 8) & 0xff] ^ s_td3[t1 & 0xff] ^ rdk[24]; + s1 = s_td0[t1 >> 24] ^ s_td1[(t0 >> 16) & 0xff] ^ s_td2[(t3 >> 8) & 0xff] ^ s_td3[t2 & 0xff] ^ rdk[25]; + s2 = s_td0[t2 >> 24] ^ s_td1[(t1 >> 16) & 0xff] ^ s_td2[(t0 >> 8) & 0xff] ^ s_td3[t3 & 0xff] ^ rdk[26]; + s3 = s_td0[t3 >> 24] ^ s_td1[(t2 >> 16) & 0xff] ^ s_td2[(t1 >> 8) & 0xff] ^ s_td3[t0 & 0xff] ^ rdk[27]; + t0 = s_td0[s0 >> 24] ^ s_td1[(s3 >> 16) & 0xff] ^ s_td2[(s2 >> 8) & 0xff] ^ s_td3[s1 & 0xff] ^ rdk[28]; + t1 = s_td0[s1 >> 24] ^ s_td1[(s0 >> 16) & 0xff] ^ s_td2[(s3 >> 8) & 0xff] ^ s_td3[s2 & 0xff] ^ rdk[29]; + t2 = s_td0[s2 >> 24] ^ s_td1[(s1 >> 16) & 0xff] ^ s_td2[(s0 >> 8) & 0xff] ^ s_td3[s3 & 0xff] ^ rdk[30]; + t3 = s_td0[s3 >> 24] ^ s_td1[(s2 >> 16) & 0xff] ^ s_td2[(s1 >> 8) & 0xff] ^ s_td3[s0 & 0xff] ^ rdk[31]; + s0 = s_td0[t0 >> 24] ^ s_td1[(t3 >> 16) & 0xff] ^ s_td2[(t2 >> 8) & 0xff] ^ s_td3[t1 & 0xff] ^ rdk[32]; + s1 = s_td0[t1 >> 24] ^ s_td1[(t0 >> 16) & 0xff] ^ s_td2[(t3 >> 8) & 0xff] ^ s_td3[t2 & 0xff] ^ rdk[33]; + s2 = s_td0[t2 >> 24] ^ s_td1[(t1 >> 16) & 0xff] ^ s_td2[(t0 >> 8) & 0xff] ^ s_td3[t3 & 0xff] ^ rdk[34]; + s3 = s_td0[t3 >> 24] ^ s_td1[(t2 >> 16) & 0xff] ^ s_td2[(t1 >> 8) & 0xff] ^ s_td3[t0 & 0xff] ^ rdk[35]; + t0 = s_td0[s0 >> 24] ^ s_td1[(s3 >> 16) & 0xff] ^ s_td2[(s2 >> 8) & 0xff] ^ s_td3[s1 & 0xff] ^ rdk[36]; + t1 = s_td0[s1 >> 24] ^ s_td1[(s0 >> 16) & 0xff] ^ s_td2[(s3 >> 8) & 0xff] ^ s_td3[s2 & 0xff] ^ rdk[37]; + t2 = s_td0[s2 >> 24] ^ s_td1[(s1 >> 16) & 0xff] ^ s_td2[(s0 >> 8) & 0xff] ^ s_td3[s3 & 0xff] ^ rdk[38]; + t3 = s_td0[s3 >> 24] ^ s_td1[(s2 >> 16) & 0xff] ^ s_td2[(s1 >> 8) & 0xff] ^ s_td3[s0 & 0xff] ^ rdk[39]; + s0 = s_td0[t0 >> 24] ^ s_td1[(t3 >> 16) & 0xff] ^ s_td2[(t2 >> 8) & 0xff] ^ s_td3[t1 & 0xff] ^ rdk[40]; + s1 = s_td0[t1 >> 24] ^ s_td1[(t0 >> 16) & 0xff] ^ s_td2[(t3 >> 8) & 0xff] ^ s_td3[t2 & 0xff] ^ rdk[41]; + s2 = s_td0[t2 >> 24] ^ s_td1[(t1 >> 16) & 0xff] ^ s_td2[(t0 >> 8) & 0xff] ^ s_td3[t3 & 0xff] ^ rdk[42]; + s3 = s_td0[t3 >> 24] ^ s_td1[(t2 >> 16) & 0xff] ^ s_td2[(t1 >> 8) & 0xff] ^ s_td3[t0 & 0xff] ^ rdk[43]; + t0 = s_td0[s0 >> 24] ^ s_td1[(s3 >> 16) & 0xff] ^ s_td2[(s2 >> 8) & 0xff] ^ s_td3[s1 & 0xff] ^ rdk[44]; + t1 = s_td0[s1 >> 24] ^ s_td1[(s0 >> 16) & 0xff] ^ s_td2[(s3 >> 8) & 0xff] ^ s_td3[s2 & 0xff] ^ rdk[45]; + t2 = s_td0[s2 >> 24] ^ s_td1[(s1 >> 16) & 0xff] ^ s_td2[(s0 >> 8) & 0xff] ^ s_td3[s3 & 0xff] ^ rdk[46]; + t3 = s_td0[s3 >> 24] ^ s_td1[(s2 >> 16) & 0xff] ^ s_td2[(s1 >> 8) & 0xff] ^ s_td3[s0 & 0xff] ^ rdk[47]; + s0 = s_td0[t0 >> 24] ^ s_td1[(t3 >> 16) & 0xff] ^ s_td2[(t2 >> 8) & 0xff] ^ s_td3[t1 & 0xff] ^ rdk[48]; + s1 = s_td0[t1 >> 24] ^ s_td1[(t0 >> 16) & 0xff] ^ s_td2[(t3 >> 8) & 0xff] ^ s_td3[t2 & 0xff] ^ rdk[49]; + s2 = s_td0[t2 >> 24] ^ s_td1[(t1 >> 16) & 0xff] ^ s_td2[(t0 >> 8) & 0xff] ^ s_td3[t3 & 0xff] ^ rdk[50]; + s3 = s_td0[t3 >> 24] ^ s_td1[(t2 >> 16) & 0xff] ^ s_td2[(t1 >> 8) & 0xff] ^ s_td3[t0 & 0xff] ^ rdk[51]; + t0 = s_td0[s0 >> 24] ^ s_td1[(s3 >> 16) & 0xff] ^ s_td2[(s2 >> 8) & 0xff] ^ s_td3[s1 & 0xff] ^ rdk[52]; + t1 = s_td0[s1 >> 24] ^ s_td1[(s0 >> 16) & 0xff] ^ s_td2[(s3 >> 8) & 0xff] ^ s_td3[s2 & 0xff] ^ rdk[53]; + t2 = s_td0[s2 >> 24] ^ s_td1[(s1 >> 16) & 0xff] ^ s_td2[(s0 >> 8) & 0xff] ^ s_td3[s3 & 0xff] ^ rdk[54]; + t3 = s_td0[s3 >> 24] ^ s_td1[(s2 >> 16) & 0xff] ^ s_td2[(s1 >> 8) & 0xff] ^ s_td3[s0 & 0xff] ^ rdk[55]; + + out[0] = (s_td4[(t0 >> 24) & 0xff] & 0xff000000) + ^ (s_td4[(t3 >> 16) & 0xff] & 0x00ff0000) + ^ (s_td4[(t2 >> 8) & 0xff] & 0x0000ff00) + ^ (s_td4[(t1 >> 0) & 0xff] & 0x000000ff) + ^ rdk[56]; + + out[1] = (s_td4[(t1 >> 24) & 0xff] & 0xff000000) + ^ (s_td4[(t0 >> 16) & 0xff] & 0x00ff0000) + ^ (s_td4[(t3 >> 8) & 0xff] & 0x0000ff00) + ^ (s_td4[(t2 >> 0) & 0xff] & 0x000000ff) + ^ rdk[57]; + + out[2] = (s_td4[(t2 >> 24) & 0xff] & 0xff000000) + ^ (s_td4[(t1 >> 16) & 0xff] & 0x00ff0000) + ^ (s_td4[(t0 >> 8) & 0xff] & 0x0000ff00) + ^ (s_td4[(t3 >> 0) & 0xff] & 0x000000ff) + ^ rdk[58]; + + out[3] = (s_td4[(t3 >> 24) & 0xff] & 0xff000000) + ^ (s_td4[(t2 >> 16) & 0xff] & 0x00ff0000) + ^ (s_td4[(t1 >> 8) & 0xff] & 0x0000ff00) + ^ (s_td4[(t0 >> 0) & 0xff] & 0x000000ff) + ^ rdk[59]; +} + +static void AES256_encrypt (const u32 *in, u32 *out, const u32 *rek, __local u32 s_te0[256], __local u32 s_te1[256], __local u32 s_te2[256], __local u32 s_te3[256], __local u32 s_te4[256]) +{ + u32 s0 = in[0] ^ rek[0]; + u32 s1 = in[1] ^ rek[1]; + u32 s2 = in[2] ^ rek[2]; + u32 s3 = in[3] ^ rek[3]; + + u32 t0; + u32 t1; + u32 t2; + u32 t3; + + t0 = s_te0[s0 >> 24] ^ s_te1[(s1 >> 16) & 0xff] ^ s_te2[(s2 >> 8) & 0xff] ^ s_te3[s3 & 0xff] ^ rek[ 4]; + t1 = s_te0[s1 >> 24] ^ s_te1[(s2 >> 16) & 0xff] ^ s_te2[(s3 >> 8) & 0xff] ^ s_te3[s0 & 0xff] ^ rek[ 5]; + t2 = s_te0[s2 >> 24] ^ s_te1[(s3 >> 16) & 0xff] ^ s_te2[(s0 >> 8) & 0xff] ^ s_te3[s1 & 0xff] ^ rek[ 6]; + t3 = s_te0[s3 >> 24] ^ s_te1[(s0 >> 16) & 0xff] ^ s_te2[(s1 >> 8) & 0xff] ^ s_te3[s2 & 0xff] ^ rek[ 7]; + s0 = s_te0[t0 >> 24] ^ s_te1[(t1 >> 16) & 0xff] ^ s_te2[(t2 >> 8) & 0xff] ^ s_te3[t3 & 0xff] ^ rek[ 8]; + s1 = s_te0[t1 >> 24] ^ s_te1[(t2 >> 16) & 0xff] ^ s_te2[(t3 >> 8) & 0xff] ^ s_te3[t0 & 0xff] ^ rek[ 9]; + s2 = s_te0[t2 >> 24] ^ s_te1[(t3 >> 16) & 0xff] ^ s_te2[(t0 >> 8) & 0xff] ^ s_te3[t1 & 0xff] ^ rek[10]; + s3 = s_te0[t3 >> 24] ^ s_te1[(t0 >> 16) & 0xff] ^ s_te2[(t1 >> 8) & 0xff] ^ s_te3[t2 & 0xff] ^ rek[11]; + t0 = s_te0[s0 >> 24] ^ s_te1[(s1 >> 16) & 0xff] ^ s_te2[(s2 >> 8) & 0xff] ^ s_te3[s3 & 0xff] ^ rek[12]; + t1 = s_te0[s1 >> 24] ^ s_te1[(s2 >> 16) & 0xff] ^ s_te2[(s3 >> 8) & 0xff] ^ s_te3[s0 & 0xff] ^ rek[13]; + t2 = s_te0[s2 >> 24] ^ s_te1[(s3 >> 16) & 0xff] ^ s_te2[(s0 >> 8) & 0xff] ^ s_te3[s1 & 0xff] ^ rek[14]; + t3 = s_te0[s3 >> 24] ^ s_te1[(s0 >> 16) & 0xff] ^ s_te2[(s1 >> 8) & 0xff] ^ s_te3[s2 & 0xff] ^ rek[15]; + s0 = s_te0[t0 >> 24] ^ s_te1[(t1 >> 16) & 0xff] ^ s_te2[(t2 >> 8) & 0xff] ^ s_te3[t3 & 0xff] ^ rek[16]; + s1 = s_te0[t1 >> 24] ^ s_te1[(t2 >> 16) & 0xff] ^ s_te2[(t3 >> 8) & 0xff] ^ s_te3[t0 & 0xff] ^ rek[17]; + s2 = s_te0[t2 >> 24] ^ s_te1[(t3 >> 16) & 0xff] ^ s_te2[(t0 >> 8) & 0xff] ^ s_te3[t1 & 0xff] ^ rek[18]; + s3 = s_te0[t3 >> 24] ^ s_te1[(t0 >> 16) & 0xff] ^ s_te2[(t1 >> 8) & 0xff] ^ s_te3[t2 & 0xff] ^ rek[19]; + t0 = s_te0[s0 >> 24] ^ s_te1[(s1 >> 16) & 0xff] ^ s_te2[(s2 >> 8) & 0xff] ^ s_te3[s3 & 0xff] ^ rek[20]; + t1 = s_te0[s1 >> 24] ^ s_te1[(s2 >> 16) & 0xff] ^ s_te2[(s3 >> 8) & 0xff] ^ s_te3[s0 & 0xff] ^ rek[21]; + t2 = s_te0[s2 >> 24] ^ s_te1[(s3 >> 16) & 0xff] ^ s_te2[(s0 >> 8) & 0xff] ^ s_te3[s1 & 0xff] ^ rek[22]; + t3 = s_te0[s3 >> 24] ^ s_te1[(s0 >> 16) & 0xff] ^ s_te2[(s1 >> 8) & 0xff] ^ s_te3[s2 & 0xff] ^ rek[23]; + s0 = s_te0[t0 >> 24] ^ s_te1[(t1 >> 16) & 0xff] ^ s_te2[(t2 >> 8) & 0xff] ^ s_te3[t3 & 0xff] ^ rek[24]; + s1 = s_te0[t1 >> 24] ^ s_te1[(t2 >> 16) & 0xff] ^ s_te2[(t3 >> 8) & 0xff] ^ s_te3[t0 & 0xff] ^ rek[25]; + s2 = s_te0[t2 >> 24] ^ s_te1[(t3 >> 16) & 0xff] ^ s_te2[(t0 >> 8) & 0xff] ^ s_te3[t1 & 0xff] ^ rek[26]; + s3 = s_te0[t3 >> 24] ^ s_te1[(t0 >> 16) & 0xff] ^ s_te2[(t1 >> 8) & 0xff] ^ s_te3[t2 & 0xff] ^ rek[27]; + t0 = s_te0[s0 >> 24] ^ s_te1[(s1 >> 16) & 0xff] ^ s_te2[(s2 >> 8) & 0xff] ^ s_te3[s3 & 0xff] ^ rek[28]; + t1 = s_te0[s1 >> 24] ^ s_te1[(s2 >> 16) & 0xff] ^ s_te2[(s3 >> 8) & 0xff] ^ s_te3[s0 & 0xff] ^ rek[29]; + t2 = s_te0[s2 >> 24] ^ s_te1[(s3 >> 16) & 0xff] ^ s_te2[(s0 >> 8) & 0xff] ^ s_te3[s1 & 0xff] ^ rek[30]; + t3 = s_te0[s3 >> 24] ^ s_te1[(s0 >> 16) & 0xff] ^ s_te2[(s1 >> 8) & 0xff] ^ s_te3[s2 & 0xff] ^ rek[31]; + s0 = s_te0[t0 >> 24] ^ s_te1[(t1 >> 16) & 0xff] ^ s_te2[(t2 >> 8) & 0xff] ^ s_te3[t3 & 0xff] ^ rek[32]; + s1 = s_te0[t1 >> 24] ^ s_te1[(t2 >> 16) & 0xff] ^ s_te2[(t3 >> 8) & 0xff] ^ s_te3[t0 & 0xff] ^ rek[33]; + s2 = s_te0[t2 >> 24] ^ s_te1[(t3 >> 16) & 0xff] ^ s_te2[(t0 >> 8) & 0xff] ^ s_te3[t1 & 0xff] ^ rek[34]; + s3 = s_te0[t3 >> 24] ^ s_te1[(t0 >> 16) & 0xff] ^ s_te2[(t1 >> 8) & 0xff] ^ s_te3[t2 & 0xff] ^ rek[35]; + t0 = s_te0[s0 >> 24] ^ s_te1[(s1 >> 16) & 0xff] ^ s_te2[(s2 >> 8) & 0xff] ^ s_te3[s3 & 0xff] ^ rek[36]; + t1 = s_te0[s1 >> 24] ^ s_te1[(s2 >> 16) & 0xff] ^ s_te2[(s3 >> 8) & 0xff] ^ s_te3[s0 & 0xff] ^ rek[37]; + t2 = s_te0[s2 >> 24] ^ s_te1[(s3 >> 16) & 0xff] ^ s_te2[(s0 >> 8) & 0xff] ^ s_te3[s1 & 0xff] ^ rek[38]; + t3 = s_te0[s3 >> 24] ^ s_te1[(s0 >> 16) & 0xff] ^ s_te2[(s1 >> 8) & 0xff] ^ s_te3[s2 & 0xff] ^ rek[39]; + s0 = s_te0[t0 >> 24] ^ s_te1[(t1 >> 16) & 0xff] ^ s_te2[(t2 >> 8) & 0xff] ^ s_te3[t3 & 0xff] ^ rek[40]; + s1 = s_te0[t1 >> 24] ^ s_te1[(t2 >> 16) & 0xff] ^ s_te2[(t3 >> 8) & 0xff] ^ s_te3[t0 & 0xff] ^ rek[41]; + s2 = s_te0[t2 >> 24] ^ s_te1[(t3 >> 16) & 0xff] ^ s_te2[(t0 >> 8) & 0xff] ^ s_te3[t1 & 0xff] ^ rek[42]; + s3 = s_te0[t3 >> 24] ^ s_te1[(t0 >> 16) & 0xff] ^ s_te2[(t1 >> 8) & 0xff] ^ s_te3[t2 & 0xff] ^ rek[43]; + t0 = s_te0[s0 >> 24] ^ s_te1[(s1 >> 16) & 0xff] ^ s_te2[(s2 >> 8) & 0xff] ^ s_te3[s3 & 0xff] ^ rek[44]; + t1 = s_te0[s1 >> 24] ^ s_te1[(s2 >> 16) & 0xff] ^ s_te2[(s3 >> 8) & 0xff] ^ s_te3[s0 & 0xff] ^ rek[45]; + t2 = s_te0[s2 >> 24] ^ s_te1[(s3 >> 16) & 0xff] ^ s_te2[(s0 >> 8) & 0xff] ^ s_te3[s1 & 0xff] ^ rek[46]; + t3 = s_te0[s3 >> 24] ^ s_te1[(s0 >> 16) & 0xff] ^ s_te2[(s1 >> 8) & 0xff] ^ s_te3[s2 & 0xff] ^ rek[47]; + s0 = s_te0[t0 >> 24] ^ s_te1[(t1 >> 16) & 0xff] ^ s_te2[(t2 >> 8) & 0xff] ^ s_te3[t3 & 0xff] ^ rek[48]; + s1 = s_te0[t1 >> 24] ^ s_te1[(t2 >> 16) & 0xff] ^ s_te2[(t3 >> 8) & 0xff] ^ s_te3[t0 & 0xff] ^ rek[49]; + s2 = s_te0[t2 >> 24] ^ s_te1[(t3 >> 16) & 0xff] ^ s_te2[(t0 >> 8) & 0xff] ^ s_te3[t1 & 0xff] ^ rek[50]; + s3 = s_te0[t3 >> 24] ^ s_te1[(t0 >> 16) & 0xff] ^ s_te2[(t1 >> 8) & 0xff] ^ s_te3[t2 & 0xff] ^ rek[51]; + t0 = s_te0[s0 >> 24] ^ s_te1[(s1 >> 16) & 0xff] ^ s_te2[(s2 >> 8) & 0xff] ^ s_te3[s3 & 0xff] ^ rek[52]; + t1 = s_te0[s1 >> 24] ^ s_te1[(s2 >> 16) & 0xff] ^ s_te2[(s3 >> 8) & 0xff] ^ s_te3[s0 & 0xff] ^ rek[53]; + t2 = s_te0[s2 >> 24] ^ s_te1[(s3 >> 16) & 0xff] ^ s_te2[(s0 >> 8) & 0xff] ^ s_te3[s1 & 0xff] ^ rek[54]; + t3 = s_te0[s3 >> 24] ^ s_te1[(s0 >> 16) & 0xff] ^ s_te2[(s1 >> 8) & 0xff] ^ s_te3[s2 & 0xff] ^ rek[55]; + + out[0] = (s_te4[(t0 >> 24) & 0xff] & 0xff000000) + ^ (s_te4[(t1 >> 16) & 0xff] & 0x00ff0000) + ^ (s_te4[(t2 >> 8) & 0xff] & 0x0000ff00) + ^ (s_te4[(t3 >> 0) & 0xff] & 0x000000ff) + ^ rek[56]; + + out[1] = (s_te4[(t1 >> 24) & 0xff] & 0xff000000) + ^ (s_te4[(t2 >> 16) & 0xff] & 0x00ff0000) + ^ (s_te4[(t3 >> 8) & 0xff] & 0x0000ff00) + ^ (s_te4[(t0 >> 0) & 0xff] & 0x000000ff) + ^ rek[57]; + + out[2] = (s_te4[(t2 >> 24) & 0xff] & 0xff000000) + ^ (s_te4[(t3 >> 16) & 0xff] & 0x00ff0000) + ^ (s_te4[(t0 >> 8) & 0xff] & 0x0000ff00) + ^ (s_te4[(t1 >> 0) & 0xff] & 0x000000ff) + ^ rek[58]; + + out[3] = (s_te4[(t3 >> 24) & 0xff] & 0xff000000) + ^ (s_te4[(t0 >> 16) & 0xff] & 0x00ff0000) + ^ (s_te4[(t1 >> 8) & 0xff] & 0x0000ff00) + ^ (s_te4[(t2 >> 0) & 0xff] & 0x000000ff) + ^ rek[59]; +} + +__constant u32 k_sha256[64] = +{ + SHA256C00, SHA256C01, SHA256C02, SHA256C03, + SHA256C04, SHA256C05, SHA256C06, SHA256C07, + SHA256C08, SHA256C09, SHA256C0a, SHA256C0b, + SHA256C0c, SHA256C0d, SHA256C0e, SHA256C0f, + SHA256C10, SHA256C11, SHA256C12, SHA256C13, + SHA256C14, SHA256C15, SHA256C16, SHA256C17, + SHA256C18, SHA256C19, SHA256C1a, SHA256C1b, + SHA256C1c, SHA256C1d, SHA256C1e, SHA256C1f, + SHA256C20, SHA256C21, SHA256C22, SHA256C23, + SHA256C24, SHA256C25, SHA256C26, SHA256C27, + SHA256C28, SHA256C29, SHA256C2a, SHA256C2b, + SHA256C2c, SHA256C2d, SHA256C2e, SHA256C2f, + SHA256C30, SHA256C31, SHA256C32, SHA256C33, + SHA256C34, SHA256C35, SHA256C36, SHA256C37, + SHA256C38, SHA256C39, SHA256C3a, SHA256C3b, + SHA256C3c, SHA256C3d, SHA256C3e, SHA256C3f, +}; + +static void sha256_transform (const u32x w0[4], const u32x w1[4], const u32x w2[4], const u32x w3[4], u32x digest[8]) +{ + u32x a = digest[0]; + u32x b = digest[1]; + u32x c = digest[2]; + u32x d = digest[3]; + u32x e = digest[4]; + u32x f = digest[5]; + u32x g = digest[6]; + u32x h = digest[7]; + + u32x w0_t = w0[0]; + u32x w1_t = w0[1]; + u32x w2_t = w0[2]; + u32x w3_t = w0[3]; + u32x w4_t = w1[0]; + u32x w5_t = w1[1]; + u32x w6_t = w1[2]; + u32x w7_t = w1[3]; + u32x w8_t = w2[0]; + u32x w9_t = w2[1]; + u32x wa_t = w2[2]; + u32x wb_t = w2[3]; + u32x wc_t = w3[0]; + u32x wd_t = w3[1]; + u32x we_t = w3[2]; + u32x wf_t = w3[3]; + + #define ROUND_EXPAND() \ + { \ + w0_t = SHA256_EXPAND (we_t, w9_t, w1_t, w0_t); \ + w1_t = SHA256_EXPAND (wf_t, wa_t, w2_t, w1_t); \ + w2_t = SHA256_EXPAND (w0_t, wb_t, w3_t, w2_t); \ + w3_t = SHA256_EXPAND (w1_t, wc_t, w4_t, w3_t); \ + w4_t = SHA256_EXPAND (w2_t, wd_t, w5_t, w4_t); \ + w5_t = SHA256_EXPAND (w3_t, we_t, w6_t, w5_t); \ + w6_t = SHA256_EXPAND (w4_t, wf_t, w7_t, w6_t); \ + w7_t = SHA256_EXPAND (w5_t, w0_t, w8_t, w7_t); \ + w8_t = SHA256_EXPAND (w6_t, w1_t, w9_t, w8_t); \ + w9_t = SHA256_EXPAND (w7_t, w2_t, wa_t, w9_t); \ + wa_t = SHA256_EXPAND (w8_t, w3_t, wb_t, wa_t); \ + wb_t = SHA256_EXPAND (w9_t, w4_t, wc_t, wb_t); \ + wc_t = SHA256_EXPAND (wa_t, w5_t, wd_t, wc_t); \ + wd_t = SHA256_EXPAND (wb_t, w6_t, we_t, wd_t); \ + we_t = SHA256_EXPAND (wc_t, w7_t, wf_t, we_t); \ + wf_t = SHA256_EXPAND (wd_t, w8_t, w0_t, wf_t); \ + } + + #define ROUND_STEP(i) \ + { \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, k_sha256[i + 0]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, k_sha256[i + 1]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, k_sha256[i + 2]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, k_sha256[i + 3]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, k_sha256[i + 4]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, k_sha256[i + 5]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, k_sha256[i + 6]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, k_sha256[i + 7]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, k_sha256[i + 8]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, k_sha256[i + 9]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, k_sha256[i + 10]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, k_sha256[i + 11]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, k_sha256[i + 12]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, k_sha256[i + 13]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, k_sha256[i + 14]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, k_sha256[i + 15]); \ + } + + ROUND_STEP (0); + + #pragma unroll + for (int i = 16; i < 64; i += 16) + { + ROUND_EXPAND (); ROUND_STEP (i); + } + + digest[0] += a; + digest[1] += b; + digest[2] += c; + digest[3] += d; + digest[4] += e; + digest[5] += f; + digest[6] += g; + digest[7] += h; +} + +static void hmac_sha256_pad (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], u32x ipad[8], u32x opad[8]) +{ + w0[0] = w0[0] ^ 0x36363636; + w0[1] = w0[1] ^ 0x36363636; + w0[2] = w0[2] ^ 0x36363636; + w0[3] = w0[3] ^ 0x36363636; + w1[0] = w1[0] ^ 0x36363636; + w1[1] = w1[1] ^ 0x36363636; + w1[2] = w1[2] ^ 0x36363636; + w1[3] = w1[3] ^ 0x36363636; + w2[0] = w2[0] ^ 0x36363636; + w2[1] = w2[1] ^ 0x36363636; + w2[2] = w2[2] ^ 0x36363636; + w2[3] = w2[3] ^ 0x36363636; + w3[0] = w3[0] ^ 0x36363636; + w3[1] = w3[1] ^ 0x36363636; + w3[2] = w3[2] ^ 0x36363636; + w3[3] = w3[3] ^ 0x36363636; + + ipad[0] = SHA256M_A; + ipad[1] = SHA256M_B; + ipad[2] = SHA256M_C; + ipad[3] = SHA256M_D; + ipad[4] = SHA256M_E; + ipad[5] = SHA256M_F; + ipad[6] = SHA256M_G; + ipad[7] = SHA256M_H; + + sha256_transform (w0, w1, w2, w3, ipad); + + w0[0] = w0[0] ^ 0x6a6a6a6a; + w0[1] = w0[1] ^ 0x6a6a6a6a; + w0[2] = w0[2] ^ 0x6a6a6a6a; + w0[3] = w0[3] ^ 0x6a6a6a6a; + w1[0] = w1[0] ^ 0x6a6a6a6a; + w1[1] = w1[1] ^ 0x6a6a6a6a; + w1[2] = w1[2] ^ 0x6a6a6a6a; + w1[3] = w1[3] ^ 0x6a6a6a6a; + w2[0] = w2[0] ^ 0x6a6a6a6a; + w2[1] = w2[1] ^ 0x6a6a6a6a; + w2[2] = w2[2] ^ 0x6a6a6a6a; + w2[3] = w2[3] ^ 0x6a6a6a6a; + w3[0] = w3[0] ^ 0x6a6a6a6a; + w3[1] = w3[1] ^ 0x6a6a6a6a; + w3[2] = w3[2] ^ 0x6a6a6a6a; + w3[3] = w3[3] ^ 0x6a6a6a6a; + + opad[0] = SHA256M_A; + opad[1] = SHA256M_B; + opad[2] = SHA256M_C; + opad[3] = SHA256M_D; + opad[4] = SHA256M_E; + opad[5] = SHA256M_F; + opad[6] = SHA256M_G; + opad[7] = SHA256M_H; + + sha256_transform (w0, w1, w2, w3, opad); +} + +static void hmac_sha256_run (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], u32x ipad[8], u32x opad[8], u32x digest[8]) +{ + digest[0] = ipad[0]; + digest[1] = ipad[1]; + digest[2] = ipad[2]; + digest[3] = ipad[3]; + digest[4] = ipad[4]; + digest[5] = ipad[5]; + digest[6] = ipad[6]; + digest[7] = ipad[7]; + + sha256_transform (w0, w1, w2, w3, digest); + + w0[0] = digest[0]; + w0[1] = digest[1]; + w0[2] = digest[2]; + w0[3] = digest[3]; + w1[0] = digest[4]; + w1[1] = digest[5]; + w1[2] = digest[6]; + w1[3] = digest[7]; + w2[0] = 0x80000000; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = (64 + 32) * 8; + + digest[0] = opad[0]; + digest[1] = opad[1]; + digest[2] = opad[2]; + digest[3] = opad[3]; + digest[4] = opad[4]; + digest[5] = opad[5]; + digest[6] = opad[6]; + digest[7] = opad[7]; + + sha256_transform (w0, w1, w2, w3, digest); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m06800_init (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global lastpass_tmp_t *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = pws[gid].i[ 8]; + w2[1] = pws[gid].i[ 9]; + w2[2] = pws[gid].i[10]; + w2[3] = pws[gid].i[11]; + + u32x w3[4]; + + w3[0] = pws[gid].i[12]; + w3[1] = pws[gid].i[13]; + w3[2] = pws[gid].i[14]; + w3[3] = pws[gid].i[15]; + + /** + * salt + */ + + u32 salt_len = salt_bufs[salt_pos].salt_len; + + u32 salt_buf0[4]; + u32 salt_buf1[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[3]; + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[7]; + + /** + * pads + */ + + w0[0] = swap_workaround (w0[0]); + w0[1] = swap_workaround (w0[1]); + w0[2] = swap_workaround (w0[2]); + w0[3] = swap_workaround (w0[3]); + w1[0] = swap_workaround (w1[0]); + w1[1] = swap_workaround (w1[1]); + w1[2] = swap_workaround (w1[2]); + w1[3] = swap_workaround (w1[3]); + w2[0] = swap_workaround (w2[0]); + w2[1] = swap_workaround (w2[1]); + w2[2] = swap_workaround (w2[2]); + w2[3] = swap_workaround (w2[3]); + w3[0] = swap_workaround (w3[0]); + w3[1] = swap_workaround (w3[1]); + w3[2] = swap_workaround (w3[2]); + w3[3] = swap_workaround (w3[3]); + + u32x ipad[8]; + u32x opad[8]; + + hmac_sha256_pad (w0, w1, w2, w3, ipad, opad); + + tmps[gid].ipad[0] = ipad[0]; + tmps[gid].ipad[1] = ipad[1]; + tmps[gid].ipad[2] = ipad[2]; + tmps[gid].ipad[3] = ipad[3]; + tmps[gid].ipad[4] = ipad[4]; + tmps[gid].ipad[5] = ipad[5]; + tmps[gid].ipad[6] = ipad[6]; + tmps[gid].ipad[7] = ipad[7]; + + tmps[gid].opad[0] = opad[0]; + tmps[gid].opad[1] = opad[1]; + tmps[gid].opad[2] = opad[2]; + tmps[gid].opad[3] = opad[3]; + tmps[gid].opad[4] = opad[4]; + tmps[gid].opad[5] = opad[5]; + tmps[gid].opad[6] = opad[6]; + tmps[gid].opad[7] = opad[7]; + + w0[0] = salt_buf0[0]; + w0[1] = salt_buf0[1]; + w0[2] = salt_buf0[2]; + w0[3] = salt_buf0[3]; + w1[0] = salt_buf1[0]; + w1[1] = salt_buf1[1]; + w1[2] = salt_buf1[2]; + w1[3] = salt_buf1[3]; + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + append_0x01_3 (w0, w1, w2, salt_len + 3); + append_0x80_3 (w0, w1, w2, salt_len + 4); + + w0[0] = swap_workaround (w0[0]); + w0[1] = swap_workaround (w0[1]); + w0[2] = swap_workaround (w0[2]); + w0[3] = swap_workaround (w0[3]); + w1[0] = swap_workaround (w1[0]); + w1[1] = swap_workaround (w1[1]); + w1[2] = swap_workaround (w1[2]); + w1[3] = swap_workaround (w1[3]); + w2[0] = swap_workaround (w2[0]); + w2[1] = swap_workaround (w2[1]); + w2[2] = 0; + w2[3] = 0; + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = (64 + salt_len + 4) * 8; + + u32x dgst[8]; + + hmac_sha256_run (w0, w1, w2, w3, ipad, opad, dgst); + + tmps[gid].dgst[0] = dgst[0]; + tmps[gid].dgst[1] = dgst[1]; + tmps[gid].dgst[2] = dgst[2]; + tmps[gid].dgst[3] = dgst[3]; + tmps[gid].dgst[4] = dgst[4]; + tmps[gid].dgst[5] = dgst[5]; + tmps[gid].dgst[6] = dgst[6]; + tmps[gid].dgst[7] = dgst[7]; + + tmps[gid].out[0] = dgst[0]; + tmps[gid].out[1] = dgst[1]; + tmps[gid].out[2] = dgst[2]; + tmps[gid].out[3] = dgst[3]; + tmps[gid].out[4] = dgst[4]; + tmps[gid].out[5] = dgst[5]; + tmps[gid].out[6] = dgst[6]; + tmps[gid].out[7] = dgst[7]; +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m06800_loop (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global lastpass_tmp_t *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x ipad[8]; + u32x opad[8]; + + ipad[0] = tmps[gid].ipad[0]; + ipad[1] = tmps[gid].ipad[1]; + ipad[2] = tmps[gid].ipad[2]; + ipad[3] = tmps[gid].ipad[3]; + ipad[4] = tmps[gid].ipad[4]; + ipad[5] = tmps[gid].ipad[5]; + ipad[6] = tmps[gid].ipad[6]; + ipad[7] = tmps[gid].ipad[7]; + + opad[0] = tmps[gid].opad[0]; + opad[1] = tmps[gid].opad[1]; + opad[2] = tmps[gid].opad[2]; + opad[3] = tmps[gid].opad[3]; + opad[4] = tmps[gid].opad[4]; + opad[5] = tmps[gid].opad[5]; + opad[6] = tmps[gid].opad[6]; + opad[7] = tmps[gid].opad[7]; + + u32x dgst[8]; + u32x out[8]; + + dgst[0] = tmps[gid].dgst[0]; + dgst[1] = tmps[gid].dgst[1]; + dgst[2] = tmps[gid].dgst[2]; + dgst[3] = tmps[gid].dgst[3]; + dgst[4] = tmps[gid].dgst[4]; + dgst[5] = tmps[gid].dgst[5]; + dgst[6] = tmps[gid].dgst[6]; + dgst[7] = tmps[gid].dgst[7]; + + out[0] = tmps[gid].out[0]; + out[1] = tmps[gid].out[1]; + out[2] = tmps[gid].out[2]; + out[3] = tmps[gid].out[3]; + out[4] = tmps[gid].out[4]; + out[5] = tmps[gid].out[5]; + out[6] = tmps[gid].out[6]; + out[7] = tmps[gid].out[7]; + + for (u32 j = 0; j < loop_cnt; j++) + { + u32x w0[4]; + u32x w1[4]; + u32x w2[4]; + u32x w3[4]; + + w0[0] = dgst[0]; + w0[1] = dgst[1]; + w0[2] = dgst[2]; + w0[3] = dgst[3]; + w1[0] = dgst[4]; + w1[1] = dgst[5]; + w1[2] = dgst[6]; + w1[3] = dgst[7]; + w2[0] = 0x80000000; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = (64 + 32) * 8; + + hmac_sha256_run (w0, w1, w2, w3, ipad, opad, dgst); + + out[0] ^= dgst[0]; + out[1] ^= dgst[1]; + out[2] ^= dgst[2]; + out[3] ^= dgst[3]; + out[4] ^= dgst[4]; + out[5] ^= dgst[5]; + out[6] ^= dgst[6]; + out[7] ^= dgst[7]; + } + + tmps[gid].dgst[0] = dgst[0]; + tmps[gid].dgst[1] = dgst[1]; + tmps[gid].dgst[2] = dgst[2]; + tmps[gid].dgst[3] = dgst[3]; + tmps[gid].dgst[4] = dgst[4]; + tmps[gid].dgst[5] = dgst[5]; + tmps[gid].dgst[6] = dgst[6]; + tmps[gid].dgst[7] = dgst[7]; + + tmps[gid].out[0] = out[0]; + tmps[gid].out[1] = out[1]; + tmps[gid].out[2] = out[2]; + tmps[gid].out[3] = out[3]; + tmps[gid].out[4] = out[4]; + tmps[gid].out[5] = out[5]; + tmps[gid].out[6] = out[6]; + tmps[gid].out[7] = out[7]; +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m06800_comp (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global lastpass_tmp_t *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + const u32 lid = get_local_id (0); + + /** + * salt + */ + + const u32 data[4] = + { + digests_buf[digests_offset].digest_buf[0], + digests_buf[digests_offset].digest_buf[1], + digests_buf[digests_offset].digest_buf[2], + digests_buf[digests_offset].digest_buf[3], + }; + + /** + * aes shared + */ + + const u32 lid4 = lid * 4; + + __local u32 s_td0[256]; + __local u32 s_td1[256]; + __local u32 s_td2[256]; + __local u32 s_td3[256]; + __local u32 s_td4[256]; + + __local u32 s_te0[256]; + __local u32 s_te1[256]; + __local u32 s_te2[256]; + __local u32 s_te3[256]; + __local u32 s_te4[256]; + + s_td0[lid4 + 0] = td0[lid4 + 0]; + s_td0[lid4 + 1] = td0[lid4 + 1]; + s_td0[lid4 + 2] = td0[lid4 + 2]; + s_td0[lid4 + 3] = td0[lid4 + 3]; + + s_td1[lid4 + 0] = td1[lid4 + 0]; + s_td1[lid4 + 1] = td1[lid4 + 1]; + s_td1[lid4 + 2] = td1[lid4 + 2]; + s_td1[lid4 + 3] = td1[lid4 + 3]; + + s_td2[lid4 + 0] = td2[lid4 + 0]; + s_td2[lid4 + 1] = td2[lid4 + 1]; + s_td2[lid4 + 2] = td2[lid4 + 2]; + s_td2[lid4 + 3] = td2[lid4 + 3]; + + s_td3[lid4 + 0] = td3[lid4 + 0]; + s_td3[lid4 + 1] = td3[lid4 + 1]; + s_td3[lid4 + 2] = td3[lid4 + 2]; + s_td3[lid4 + 3] = td3[lid4 + 3]; + + s_td4[lid4 + 0] = td4[lid4 + 0]; + s_td4[lid4 + 1] = td4[lid4 + 1]; + s_td4[lid4 + 2] = td4[lid4 + 2]; + s_td4[lid4 + 3] = td4[lid4 + 3]; + + s_te0[lid4 + 0] = te0[lid4 + 0]; + s_te0[lid4 + 1] = te0[lid4 + 1]; + s_te0[lid4 + 2] = te0[lid4 + 2]; + s_te0[lid4 + 3] = te0[lid4 + 3]; + + s_te1[lid4 + 0] = te1[lid4 + 0]; + s_te1[lid4 + 1] = te1[lid4 + 1]; + s_te1[lid4 + 2] = te1[lid4 + 2]; + s_te1[lid4 + 3] = te1[lid4 + 3]; + + s_te2[lid4 + 0] = te2[lid4 + 0]; + s_te2[lid4 + 1] = te2[lid4 + 1]; + s_te2[lid4 + 2] = te2[lid4 + 2]; + s_te2[lid4 + 3] = te2[lid4 + 3]; + + s_te3[lid4 + 0] = te3[lid4 + 0]; + s_te3[lid4 + 1] = te3[lid4 + 1]; + s_te3[lid4 + 2] = te3[lid4 + 2]; + s_te3[lid4 + 3] = te3[lid4 + 3]; + + s_te4[lid4 + 0] = te4[lid4 + 0]; + s_te4[lid4 + 1] = te4[lid4 + 1]; + s_te4[lid4 + 2] = te4[lid4 + 2]; + s_te4[lid4 + 3] = te4[lid4 + 3]; + + barrier (CLK_LOCAL_MEM_FENCE); + + if (gid >= gid_max) return; + + /** + * aes init + */ + + u32 ukey[8]; + + ukey[0] = tmps[gid].out[0]; + ukey[1] = tmps[gid].out[1]; + ukey[2] = tmps[gid].out[2]; + ukey[3] = tmps[gid].out[3]; + ukey[4] = tmps[gid].out[4]; + ukey[5] = tmps[gid].out[5]; + ukey[6] = tmps[gid].out[6]; + ukey[7] = tmps[gid].out[7]; + + #define KEYLEN 60 + + u32 rek[KEYLEN]; + + AES256_ExpandKey (ukey, rek, s_te0, s_te1, s_te2, s_te3, s_te4); + + u32 out[4]; + + /** + * sniffed mode + */ + + u32 rdk[KEYLEN]; + + #pragma unroll 60 + for (u32 i = 0; i < KEYLEN; i++) rdk[i] = rek[i]; + + AES256_InvertKey (rdk, s_td0, s_td1, s_td2, s_td3, s_td4, s_te0, s_te1, s_te2, s_te3, s_te4); + + AES256_decrypt (data, out, rdk, s_td0, s_td1, s_td2, s_td3, s_td4); + + u32 salt_len = salt_bufs[salt_pos].salt_len; + + u32 salt_buf[4]; + + salt_buf[0] = salt_bufs[salt_pos].salt_buf[0]; + salt_buf[1] = salt_bufs[salt_pos].salt_buf[1]; + salt_buf[2] = salt_bufs[salt_pos].salt_buf[2]; + salt_buf[3] = salt_bufs[salt_pos].salt_buf[3]; + + out[0] = swap_workaround (out[0]); + out[1] = swap_workaround (out[1]); + out[2] = swap_workaround (out[2]); + out[3] = swap_workaround (out[3]); + + truncate_block (out, salt_len); + + if ((out[0] == salt_buf[0]) + && (out[1] == salt_buf[1]) + && (out[2] == salt_buf[2]) + && (out[3] == salt_buf[3])) + { + mark_hash_s0 (plains_buf, hashes_shown, digests_offset + 0, gid, 0); + + d_return_buf[lid] = 1; + } + + /** + * offline mode + */ + + const u32 lastpass_magic[4] = + { + 0x6c617374, + 0x70617373, + 0x20726f63, + 0x6b730202, + }; + + AES256_encrypt (lastpass_magic, out, rek, s_te0, s_te1, s_te2, s_te3, s_te4); + + const u32x r0 = out[DGST_R0]; + const u32x r1 = out[DGST_R1]; + const u32x r2 = out[DGST_R2]; + const u32x r3 = out[DGST_R3]; + + #define il_pos 0 + + #include VECT_COMPARE_M +} diff --git a/amd/m06900_a0.cl b/amd/m06900_a0.cl new file mode 100644 index 0000000000..508bf1ccf5 --- /dev/null +++ b/amd/m06900_a0.cl @@ -0,0 +1,1251 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _GOST_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW4 +#define VECT_SIZE1 +#endif + +#ifdef VLIW5 +#define VECT_SIZE1 +#endif + +#define DGST_R0 0 +#define DGST_R1 1 +#define DGST_R2 2 +#define DGST_R3 3 + +#include "include/kernel_functions.c" +#include "types_amd.c" +#include "common_amd.c" +#include "include/rp_gpu.h" +#include "rp_amd.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +__constant u32 c_tables[4][256] = +{ + { + 0x00072000, 0x00075000, 0x00074800, 0x00071000, + 0x00076800, 0x00074000, 0x00070000, 0x00077000, + 0x00073000, 0x00075800, 0x00070800, 0x00076000, + 0x00073800, 0x00077800, 0x00072800, 0x00071800, + 0x0005a000, 0x0005d000, 0x0005c800, 0x00059000, + 0x0005e800, 0x0005c000, 0x00058000, 0x0005f000, + 0x0005b000, 0x0005d800, 0x00058800, 0x0005e000, + 0x0005b800, 0x0005f800, 0x0005a800, 0x00059800, + 0x00022000, 0x00025000, 0x00024800, 0x00021000, + 0x00026800, 0x00024000, 0x00020000, 0x00027000, + 0x00023000, 0x00025800, 0x00020800, 0x00026000, + 0x00023800, 0x00027800, 0x00022800, 0x00021800, + 0x00062000, 0x00065000, 0x00064800, 0x00061000, + 0x00066800, 0x00064000, 0x00060000, 0x00067000, + 0x00063000, 0x00065800, 0x00060800, 0x00066000, + 0x00063800, 0x00067800, 0x00062800, 0x00061800, + 0x00032000, 0x00035000, 0x00034800, 0x00031000, + 0x00036800, 0x00034000, 0x00030000, 0x00037000, + 0x00033000, 0x00035800, 0x00030800, 0x00036000, + 0x00033800, 0x00037800, 0x00032800, 0x00031800, + 0x0006a000, 0x0006d000, 0x0006c800, 0x00069000, + 0x0006e800, 0x0006c000, 0x00068000, 0x0006f000, + 0x0006b000, 0x0006d800, 0x00068800, 0x0006e000, + 0x0006b800, 0x0006f800, 0x0006a800, 0x00069800, + 0x0007a000, 0x0007d000, 0x0007c800, 0x00079000, + 0x0007e800, 0x0007c000, 0x00078000, 0x0007f000, + 0x0007b000, 0x0007d800, 0x00078800, 0x0007e000, + 0x0007b800, 0x0007f800, 0x0007a800, 0x00079800, + 0x00052000, 0x00055000, 0x00054800, 0x00051000, + 0x00056800, 0x00054000, 0x00050000, 0x00057000, + 0x00053000, 0x00055800, 0x00050800, 0x00056000, + 0x00053800, 0x00057800, 0x00052800, 0x00051800, + 0x00012000, 0x00015000, 0x00014800, 0x00011000, + 0x00016800, 0x00014000, 0x00010000, 0x00017000, + 0x00013000, 0x00015800, 0x00010800, 0x00016000, + 0x00013800, 0x00017800, 0x00012800, 0x00011800, + 0x0001a000, 0x0001d000, 0x0001c800, 0x00019000, + 0x0001e800, 0x0001c000, 0x00018000, 0x0001f000, + 0x0001b000, 0x0001d800, 0x00018800, 0x0001e000, + 0x0001b800, 0x0001f800, 0x0001a800, 0x00019800, + 0x00042000, 0x00045000, 0x00044800, 0x00041000, + 0x00046800, 0x00044000, 0x00040000, 0x00047000, + 0x00043000, 0x00045800, 0x00040800, 0x00046000, + 0x00043800, 0x00047800, 0x00042800, 0x00041800, + 0x0000a000, 0x0000d000, 0x0000c800, 0x00009000, + 0x0000e800, 0x0000c000, 0x00008000, 0x0000f000, + 0x0000b000, 0x0000d800, 0x00008800, 0x0000e000, + 0x0000b800, 0x0000f800, 0x0000a800, 0x00009800, + 0x00002000, 0x00005000, 0x00004800, 0x00001000, + 0x00006800, 0x00004000, 0x00000000, 0x00007000, + 0x00003000, 0x00005800, 0x00000800, 0x00006000, + 0x00003800, 0x00007800, 0x00002800, 0x00001800, + 0x0003a000, 0x0003d000, 0x0003c800, 0x00039000, + 0x0003e800, 0x0003c000, 0x00038000, 0x0003f000, + 0x0003b000, 0x0003d800, 0x00038800, 0x0003e000, + 0x0003b800, 0x0003f800, 0x0003a800, 0x00039800, + 0x0002a000, 0x0002d000, 0x0002c800, 0x00029000, + 0x0002e800, 0x0002c000, 0x00028000, 0x0002f000, + 0x0002b000, 0x0002d800, 0x00028800, 0x0002e000, + 0x0002b800, 0x0002f800, 0x0002a800, 0x00029800, + 0x0004a000, 0x0004d000, 0x0004c800, 0x00049000, + 0x0004e800, 0x0004c000, 0x00048000, 0x0004f000, + 0x0004b000, 0x0004d800, 0x00048800, 0x0004e000, + 0x0004b800, 0x0004f800, 0x0004a800, 0x00049800, + }, + { + 0x03a80000, 0x03c00000, 0x03880000, 0x03e80000, + 0x03d00000, 0x03980000, 0x03a00000, 0x03900000, + 0x03f00000, 0x03f80000, 0x03e00000, 0x03b80000, + 0x03b00000, 0x03800000, 0x03c80000, 0x03d80000, + 0x06a80000, 0x06c00000, 0x06880000, 0x06e80000, + 0x06d00000, 0x06980000, 0x06a00000, 0x06900000, + 0x06f00000, 0x06f80000, 0x06e00000, 0x06b80000, + 0x06b00000, 0x06800000, 0x06c80000, 0x06d80000, + 0x05280000, 0x05400000, 0x05080000, 0x05680000, + 0x05500000, 0x05180000, 0x05200000, 0x05100000, + 0x05700000, 0x05780000, 0x05600000, 0x05380000, + 0x05300000, 0x05000000, 0x05480000, 0x05580000, + 0x00a80000, 0x00c00000, 0x00880000, 0x00e80000, + 0x00d00000, 0x00980000, 0x00a00000, 0x00900000, + 0x00f00000, 0x00f80000, 0x00e00000, 0x00b80000, + 0x00b00000, 0x00800000, 0x00c80000, 0x00d80000, + 0x00280000, 0x00400000, 0x00080000, 0x00680000, + 0x00500000, 0x00180000, 0x00200000, 0x00100000, + 0x00700000, 0x00780000, 0x00600000, 0x00380000, + 0x00300000, 0x00000000, 0x00480000, 0x00580000, + 0x04280000, 0x04400000, 0x04080000, 0x04680000, + 0x04500000, 0x04180000, 0x04200000, 0x04100000, + 0x04700000, 0x04780000, 0x04600000, 0x04380000, + 0x04300000, 0x04000000, 0x04480000, 0x04580000, + 0x04a80000, 0x04c00000, 0x04880000, 0x04e80000, + 0x04d00000, 0x04980000, 0x04a00000, 0x04900000, + 0x04f00000, 0x04f80000, 0x04e00000, 0x04b80000, + 0x04b00000, 0x04800000, 0x04c80000, 0x04d80000, + 0x07a80000, 0x07c00000, 0x07880000, 0x07e80000, + 0x07d00000, 0x07980000, 0x07a00000, 0x07900000, + 0x07f00000, 0x07f80000, 0x07e00000, 0x07b80000, + 0x07b00000, 0x07800000, 0x07c80000, 0x07d80000, + 0x07280000, 0x07400000, 0x07080000, 0x07680000, + 0x07500000, 0x07180000, 0x07200000, 0x07100000, + 0x07700000, 0x07780000, 0x07600000, 0x07380000, + 0x07300000, 0x07000000, 0x07480000, 0x07580000, + 0x02280000, 0x02400000, 0x02080000, 0x02680000, + 0x02500000, 0x02180000, 0x02200000, 0x02100000, + 0x02700000, 0x02780000, 0x02600000, 0x02380000, + 0x02300000, 0x02000000, 0x02480000, 0x02580000, + 0x03280000, 0x03400000, 0x03080000, 0x03680000, + 0x03500000, 0x03180000, 0x03200000, 0x03100000, + 0x03700000, 0x03780000, 0x03600000, 0x03380000, + 0x03300000, 0x03000000, 0x03480000, 0x03580000, + 0x06280000, 0x06400000, 0x06080000, 0x06680000, + 0x06500000, 0x06180000, 0x06200000, 0x06100000, + 0x06700000, 0x06780000, 0x06600000, 0x06380000, + 0x06300000, 0x06000000, 0x06480000, 0x06580000, + 0x05a80000, 0x05c00000, 0x05880000, 0x05e80000, + 0x05d00000, 0x05980000, 0x05a00000, 0x05900000, + 0x05f00000, 0x05f80000, 0x05e00000, 0x05b80000, + 0x05b00000, 0x05800000, 0x05c80000, 0x05d80000, + 0x01280000, 0x01400000, 0x01080000, 0x01680000, + 0x01500000, 0x01180000, 0x01200000, 0x01100000, + 0x01700000, 0x01780000, 0x01600000, 0x01380000, + 0x01300000, 0x01000000, 0x01480000, 0x01580000, + 0x02a80000, 0x02c00000, 0x02880000, 0x02e80000, + 0x02d00000, 0x02980000, 0x02a00000, 0x02900000, + 0x02f00000, 0x02f80000, 0x02e00000, 0x02b80000, + 0x02b00000, 0x02800000, 0x02c80000, 0x02d80000, + 0x01a80000, 0x01c00000, 0x01880000, 0x01e80000, + 0x01d00000, 0x01980000, 0x01a00000, 0x01900000, + 0x01f00000, 0x01f80000, 0x01e00000, 0x01b80000, + 0x01b00000, 0x01800000, 0x01c80000, 0x01d80000, + }, + { + 0x30000002, 0x60000002, 0x38000002, 0x08000002, + 0x28000002, 0x78000002, 0x68000002, 0x40000002, + 0x20000002, 0x50000002, 0x48000002, 0x70000002, + 0x00000002, 0x18000002, 0x58000002, 0x10000002, + 0xb0000005, 0xe0000005, 0xb8000005, 0x88000005, + 0xa8000005, 0xf8000005, 0xe8000005, 0xc0000005, + 0xa0000005, 0xd0000005, 0xc8000005, 0xf0000005, + 0x80000005, 0x98000005, 0xd8000005, 0x90000005, + 0x30000005, 0x60000005, 0x38000005, 0x08000005, + 0x28000005, 0x78000005, 0x68000005, 0x40000005, + 0x20000005, 0x50000005, 0x48000005, 0x70000005, + 0x00000005, 0x18000005, 0x58000005, 0x10000005, + 0x30000000, 0x60000000, 0x38000000, 0x08000000, + 0x28000000, 0x78000000, 0x68000000, 0x40000000, + 0x20000000, 0x50000000, 0x48000000, 0x70000000, + 0x00000000, 0x18000000, 0x58000000, 0x10000000, + 0xb0000003, 0xe0000003, 0xb8000003, 0x88000003, + 0xa8000003, 0xf8000003, 0xe8000003, 0xc0000003, + 0xa0000003, 0xd0000003, 0xc8000003, 0xf0000003, + 0x80000003, 0x98000003, 0xd8000003, 0x90000003, + 0x30000001, 0x60000001, 0x38000001, 0x08000001, + 0x28000001, 0x78000001, 0x68000001, 0x40000001, + 0x20000001, 0x50000001, 0x48000001, 0x70000001, + 0x00000001, 0x18000001, 0x58000001, 0x10000001, + 0xb0000000, 0xe0000000, 0xb8000000, 0x88000000, + 0xa8000000, 0xf8000000, 0xe8000000, 0xc0000000, + 0xa0000000, 0xd0000000, 0xc8000000, 0xf0000000, + 0x80000000, 0x98000000, 0xd8000000, 0x90000000, + 0xb0000006, 0xe0000006, 0xb8000006, 0x88000006, + 0xa8000006, 0xf8000006, 0xe8000006, 0xc0000006, + 0xa0000006, 0xd0000006, 0xc8000006, 0xf0000006, + 0x80000006, 0x98000006, 0xd8000006, 0x90000006, + 0xb0000001, 0xe0000001, 0xb8000001, 0x88000001, + 0xa8000001, 0xf8000001, 0xe8000001, 0xc0000001, + 0xa0000001, 0xd0000001, 0xc8000001, 0xf0000001, + 0x80000001, 0x98000001, 0xd8000001, 0x90000001, + 0x30000003, 0x60000003, 0x38000003, 0x08000003, + 0x28000003, 0x78000003, 0x68000003, 0x40000003, + 0x20000003, 0x50000003, 0x48000003, 0x70000003, + 0x00000003, 0x18000003, 0x58000003, 0x10000003, + 0x30000004, 0x60000004, 0x38000004, 0x08000004, + 0x28000004, 0x78000004, 0x68000004, 0x40000004, + 0x20000004, 0x50000004, 0x48000004, 0x70000004, + 0x00000004, 0x18000004, 0x58000004, 0x10000004, + 0xb0000002, 0xe0000002, 0xb8000002, 0x88000002, + 0xa8000002, 0xf8000002, 0xe8000002, 0xc0000002, + 0xa0000002, 0xd0000002, 0xc8000002, 0xf0000002, + 0x80000002, 0x98000002, 0xd8000002, 0x90000002, + 0xb0000004, 0xe0000004, 0xb8000004, 0x88000004, + 0xa8000004, 0xf8000004, 0xe8000004, 0xc0000004, + 0xa0000004, 0xd0000004, 0xc8000004, 0xf0000004, + 0x80000004, 0x98000004, 0xd8000004, 0x90000004, + 0x30000006, 0x60000006, 0x38000006, 0x08000006, + 0x28000006, 0x78000006, 0x68000006, 0x40000006, + 0x20000006, 0x50000006, 0x48000006, 0x70000006, + 0x00000006, 0x18000006, 0x58000006, 0x10000006, + 0xb0000007, 0xe0000007, 0xb8000007, 0x88000007, + 0xa8000007, 0xf8000007, 0xe8000007, 0xc0000007, + 0xa0000007, 0xd0000007, 0xc8000007, 0xf0000007, + 0x80000007, 0x98000007, 0xd8000007, 0x90000007, + 0x30000007, 0x60000007, 0x38000007, 0x08000007, + 0x28000007, 0x78000007, 0x68000007, 0x40000007, + 0x20000007, 0x50000007, 0x48000007, 0x70000007, + 0x00000007, 0x18000007, 0x58000007, 0x10000007, + }, + { + 0x000000e8, 0x000000d8, 0x000000a0, 0x00000088, + 0x00000098, 0x000000f8, 0x000000a8, 0x000000c8, + 0x00000080, 0x000000d0, 0x000000f0, 0x000000b8, + 0x000000b0, 0x000000c0, 0x00000090, 0x000000e0, + 0x000007e8, 0x000007d8, 0x000007a0, 0x00000788, + 0x00000798, 0x000007f8, 0x000007a8, 0x000007c8, + 0x00000780, 0x000007d0, 0x000007f0, 0x000007b8, + 0x000007b0, 0x000007c0, 0x00000790, 0x000007e0, + 0x000006e8, 0x000006d8, 0x000006a0, 0x00000688, + 0x00000698, 0x000006f8, 0x000006a8, 0x000006c8, + 0x00000680, 0x000006d0, 0x000006f0, 0x000006b8, + 0x000006b0, 0x000006c0, 0x00000690, 0x000006e0, + 0x00000068, 0x00000058, 0x00000020, 0x00000008, + 0x00000018, 0x00000078, 0x00000028, 0x00000048, + 0x00000000, 0x00000050, 0x00000070, 0x00000038, + 0x00000030, 0x00000040, 0x00000010, 0x00000060, + 0x000002e8, 0x000002d8, 0x000002a0, 0x00000288, + 0x00000298, 0x000002f8, 0x000002a8, 0x000002c8, + 0x00000280, 0x000002d0, 0x000002f0, 0x000002b8, + 0x000002b0, 0x000002c0, 0x00000290, 0x000002e0, + 0x000003e8, 0x000003d8, 0x000003a0, 0x00000388, + 0x00000398, 0x000003f8, 0x000003a8, 0x000003c8, + 0x00000380, 0x000003d0, 0x000003f0, 0x000003b8, + 0x000003b0, 0x000003c0, 0x00000390, 0x000003e0, + 0x00000568, 0x00000558, 0x00000520, 0x00000508, + 0x00000518, 0x00000578, 0x00000528, 0x00000548, + 0x00000500, 0x00000550, 0x00000570, 0x00000538, + 0x00000530, 0x00000540, 0x00000510, 0x00000560, + 0x00000268, 0x00000258, 0x00000220, 0x00000208, + 0x00000218, 0x00000278, 0x00000228, 0x00000248, + 0x00000200, 0x00000250, 0x00000270, 0x00000238, + 0x00000230, 0x00000240, 0x00000210, 0x00000260, + 0x000004e8, 0x000004d8, 0x000004a0, 0x00000488, + 0x00000498, 0x000004f8, 0x000004a8, 0x000004c8, + 0x00000480, 0x000004d0, 0x000004f0, 0x000004b8, + 0x000004b0, 0x000004c0, 0x00000490, 0x000004e0, + 0x00000168, 0x00000158, 0x00000120, 0x00000108, + 0x00000118, 0x00000178, 0x00000128, 0x00000148, + 0x00000100, 0x00000150, 0x00000170, 0x00000138, + 0x00000130, 0x00000140, 0x00000110, 0x00000160, + 0x000001e8, 0x000001d8, 0x000001a0, 0x00000188, + 0x00000198, 0x000001f8, 0x000001a8, 0x000001c8, + 0x00000180, 0x000001d0, 0x000001f0, 0x000001b8, + 0x000001b0, 0x000001c0, 0x00000190, 0x000001e0, + 0x00000768, 0x00000758, 0x00000720, 0x00000708, + 0x00000718, 0x00000778, 0x00000728, 0x00000748, + 0x00000700, 0x00000750, 0x00000770, 0x00000738, + 0x00000730, 0x00000740, 0x00000710, 0x00000760, + 0x00000368, 0x00000358, 0x00000320, 0x00000308, + 0x00000318, 0x00000378, 0x00000328, 0x00000348, + 0x00000300, 0x00000350, 0x00000370, 0x00000338, + 0x00000330, 0x00000340, 0x00000310, 0x00000360, + 0x000005e8, 0x000005d8, 0x000005a0, 0x00000588, + 0x00000598, 0x000005f8, 0x000005a8, 0x000005c8, + 0x00000580, 0x000005d0, 0x000005f0, 0x000005b8, + 0x000005b0, 0x000005c0, 0x00000590, 0x000005e0, + 0x00000468, 0x00000458, 0x00000420, 0x00000408, + 0x00000418, 0x00000478, 0x00000428, 0x00000448, + 0x00000400, 0x00000450, 0x00000470, 0x00000438, + 0x00000430, 0x00000440, 0x00000410, 0x00000460, + 0x00000668, 0x00000658, 0x00000620, 0x00000608, + 0x00000618, 0x00000678, 0x00000628, 0x00000648, + 0x00000600, 0x00000650, 0x00000670, 0x00000638, + 0x00000630, 0x00000640, 0x00000610, 0x00000660, + } +}; + +#ifdef VECT_SIZE1 +#define BOX(i,n,S) (u32x) ((S)[(n)][(i)]) +#endif + +#ifdef VECT_SIZE2 +#define BOX(i,n,S) (u32x) ((S)[(n)][(i).s0], (S)[(n)][(i).s1]) +#endif + +#define round(k1,k2,tbl) \ +{ \ + u32x t; \ + t = (k1) + r; \ + l ^= BOX (amd_bfe (t, 0, 8), 0, tbl) ^ \ + BOX (amd_bfe (t, 8, 8), 1, tbl) ^ \ + BOX (amd_bfe (t, 16, 8), 2, tbl) ^ \ + BOX (amd_bfe (t, 24, 8), 3, tbl); \ + t = (k2) + l; \ + r ^= BOX (amd_bfe (t, 0, 8), 0, tbl) ^ \ + BOX (amd_bfe (t, 8, 8), 1, tbl) ^ \ + BOX (amd_bfe (t, 16, 8), 2, tbl) ^ \ + BOX (amd_bfe (t, 24, 8), 3, tbl); \ +} + +#define R(k,h,s,i,t) \ +{ \ + u32x r; \ + u32x l; \ + r = h[i + 0]; \ + l = h[i + 1]; \ + round (k[0], k[1], t); \ + round (k[2], k[3], t); \ + round (k[4], k[5], t); \ + round (k[6], k[7], t); \ + round (k[0], k[1], t); \ + round (k[2], k[3], t); \ + round (k[4], k[5], t); \ + round (k[6], k[7], t); \ + round (k[0], k[1], t); \ + round (k[2], k[3], t); \ + round (k[4], k[5], t); \ + round (k[6], k[7], t); \ + round (k[7], k[6], t); \ + round (k[5], k[4], t); \ + round (k[3], k[2], t); \ + round (k[1], k[0], t); \ + s[i + 0] = l; \ + s[i + 1] = r; \ +} + +#define X(w,u,v) \ + w[0] = u[0] ^ v[0]; \ + w[1] = u[1] ^ v[1]; \ + w[2] = u[2] ^ v[2]; \ + w[3] = u[3] ^ v[3]; \ + w[4] = u[4] ^ v[4]; \ + w[5] = u[5] ^ v[5]; \ + w[6] = u[6] ^ v[6]; \ + w[7] = u[7] ^ v[7]; + +#define P(k,w) \ + k[0] = ((w[0] & 0x000000ff) << 0) \ + | ((w[2] & 0x000000ff) << 8) \ + | ((w[4] & 0x000000ff) << 16) \ + | ((w[6] & 0x000000ff) << 24); \ + k[1] = ((w[0] & 0x0000ff00) >> 8) \ + | ((w[2] & 0x0000ff00) >> 0) \ + | ((w[4] & 0x0000ff00) << 8) \ + | ((w[6] & 0x0000ff00) << 16); \ + k[2] = ((w[0] & 0x00ff0000) >> 16) \ + | ((w[2] & 0x00ff0000) >> 8) \ + | ((w[4] & 0x00ff0000) << 0) \ + | ((w[6] & 0x00ff0000) << 8); \ + k[3] = ((w[0] & 0xff000000) >> 24) \ + | ((w[2] & 0xff000000) >> 16) \ + | ((w[4] & 0xff000000) >> 8) \ + | ((w[6] & 0xff000000) >> 0); \ + k[4] = ((w[1] & 0x000000ff) << 0) \ + | ((w[3] & 0x000000ff) << 8) \ + | ((w[5] & 0x000000ff) << 16) \ + | ((w[7] & 0x000000ff) << 24); \ + k[5] = ((w[1] & 0x0000ff00) >> 8) \ + | ((w[3] & 0x0000ff00) >> 0) \ + | ((w[5] & 0x0000ff00) << 8) \ + | ((w[7] & 0x0000ff00) << 16); \ + k[6] = ((w[1] & 0x00ff0000) >> 16) \ + | ((w[3] & 0x00ff0000) >> 8) \ + | ((w[5] & 0x00ff0000) << 0) \ + | ((w[7] & 0x00ff0000) << 8); \ + k[7] = ((w[1] & 0xff000000) >> 24) \ + | ((w[3] & 0xff000000) >> 16) \ + | ((w[5] & 0xff000000) >> 8) \ + | ((w[7] & 0xff000000) >> 0); + +#define A(x) \ +{ \ + u32x l; \ + u32x r; \ + l = x[0] ^ x[2]; \ + r = x[1] ^ x[3]; \ + x[0] = x[2]; \ + x[1] = x[3]; \ + x[2] = x[4]; \ + x[3] = x[5]; \ + x[4] = x[6]; \ + x[5] = x[7]; \ + x[6] = l; \ + x[7] = r; \ +} + +#define AA(x) \ +{ \ + u32x l; \ + u32x r; \ + l = x[0]; \ + r = x[2]; \ + x[0] = x[4]; \ + x[2] = x[6]; \ + x[4] = l ^ r; \ + x[6] = x[0] ^ r; \ + l = x[1]; \ + r = x[3]; \ + x[1] = x[5]; \ + x[3] = x[7]; \ + x[5] = l ^ r; \ + x[7] = x[1] ^ r; \ +} + +#define C(x) \ + x[0] ^= 0xff00ff00; \ + x[1] ^= 0xff00ff00; \ + x[2] ^= 0x00ff00ff; \ + x[3] ^= 0x00ff00ff; \ + x[4] ^= 0x00ffff00; \ + x[5] ^= 0xff0000ff; \ + x[6] ^= 0x000000ff; \ + x[7] ^= 0xff00ffff; + +#define SHIFT12(u,m,s) \ + u[0] = m[0] ^ s[6]; \ + u[1] = m[1] ^ s[7]; \ + u[2] = m[2] ^ (s[0] << 16) \ + ^ (s[0] >> 16) \ + ^ (s[0] & 0x0000ffff) \ + ^ (s[1] & 0x0000ffff) \ + ^ (s[1] >> 16) \ + ^ (s[2] << 16) \ + ^ s[6] \ + ^ (s[6] << 16) \ + ^ (s[7] & 0xffff0000) \ + ^ (s[7] >> 16); \ + u[3] = m[3] ^ (s[0] & 0x0000ffff) \ + ^ (s[0] << 16) \ + ^ (s[1] & 0x0000ffff) \ + ^ (s[1] << 16) \ + ^ (s[1] >> 16) \ + ^ (s[2] << 16) \ + ^ (s[2] >> 16) \ + ^ (s[3] << 16) \ + ^ s[6] \ + ^ (s[6] << 16) \ + ^ (s[6] >> 16) \ + ^ (s[7] & 0x0000ffff) \ + ^ (s[7] << 16) \ + ^ (s[7] >> 16); \ + u[4] = m[4] ^ (s[0] & 0xffff0000) \ + ^ (s[0] << 16) \ + ^ (s[0] >> 16) \ + ^ (s[1] & 0xffff0000) \ + ^ (s[1] >> 16) \ + ^ (s[2] << 16) \ + ^ (s[2] >> 16) \ + ^ (s[3] << 16) \ + ^ (s[3] >> 16) \ + ^ (s[4] << 16) \ + ^ (s[6] << 16) \ + ^ (s[6] >> 16) \ + ^ (s[7] & 0x0000ffff) \ + ^ (s[7] << 16) \ + ^ (s[7] >> 16); \ + u[5] = m[5] ^ (s[0] << 16) \ + ^ (s[0] >> 16) \ + ^ (s[0] & 0xffff0000) \ + ^ (s[1] & 0x0000ffff) \ + ^ s[2] \ + ^ (s[2] >> 16) \ + ^ (s[3] << 16) \ + ^ (s[3] >> 16) \ + ^ (s[4] << 16) \ + ^ (s[4] >> 16) \ + ^ (s[5] << 16) \ + ^ (s[6] << 16) \ + ^ (s[6] >> 16) \ + ^ (s[7] & 0xffff0000) \ + ^ (s[7] << 16) \ + ^ (s[7] >> 16); \ + u[6] = m[6] ^ s[0] \ + ^ (s[1] >> 16) \ + ^ (s[2] << 16) \ + ^ s[3] \ + ^ (s[3] >> 16) \ + ^ (s[4] << 16) \ + ^ (s[4] >> 16) \ + ^ (s[5] << 16) \ + ^ (s[5] >> 16) \ + ^ s[6] \ + ^ (s[6] << 16) \ + ^ (s[6] >> 16) \ + ^ (s[7] << 16); \ + u[7] = m[7] ^ (s[0] & 0xffff0000) \ + ^ (s[0] << 16) \ + ^ (s[1] & 0x0000ffff) \ + ^ (s[1] << 16) \ + ^ (s[2] >> 16) \ + ^ (s[3] << 16) \ + ^ s[4] \ + ^ (s[4] >> 16) \ + ^ (s[5] << 16) \ + ^ (s[5] >> 16) \ + ^ (s[6] >> 16) \ + ^ (s[7] & 0x0000ffff) \ + ^ (s[7] << 16) \ + ^ (s[7] >> 16); + +#define SHIFT16(h,v,u) \ + v[0] = h[0] ^ (u[1] << 16) \ + ^ (u[0] >> 16); \ + v[1] = h[1] ^ (u[2] << 16) \ + ^ (u[1] >> 16); \ + v[2] = h[2] ^ (u[3] << 16) \ + ^ (u[2] >> 16); \ + v[3] = h[3] ^ (u[4] << 16) \ + ^ (u[3] >> 16); \ + v[4] = h[4] ^ (u[5] << 16) \ + ^ (u[4] >> 16); \ + v[5] = h[5] ^ (u[6] << 16) \ + ^ (u[5] >> 16); \ + v[6] = h[6] ^ (u[7] << 16) \ + ^ (u[6] >> 16); \ + v[7] = h[7] ^ (u[0] & 0xffff0000) \ + ^ (u[0] << 16) \ + ^ (u[7] >> 16) \ + ^ (u[1] & 0xffff0000) \ + ^ (u[1] << 16) \ + ^ (u[6] << 16) \ + ^ (u[7] & 0xffff0000); + +#define SHIFT61(h,v) \ + h[0] = (v[0] & 0xffff0000) \ + ^ (v[0] << 16) \ + ^ (v[0] >> 16) \ + ^ (v[1] >> 16) \ + ^ (v[1] & 0xffff0000) \ + ^ (v[2] << 16) \ + ^ (v[3] >> 16) \ + ^ (v[4] << 16) \ + ^ (v[5] >> 16) \ + ^ v[5] \ + ^ (v[6] >> 16) \ + ^ (v[7] << 16) \ + ^ (v[7] >> 16) \ + ^ (v[7] & 0x0000ffff); \ + h[1] = (v[0] << 16) \ + ^ (v[0] >> 16) \ + ^ (v[0] & 0xffff0000) \ + ^ (v[1] & 0x0000ffff) \ + ^ v[2] \ + ^ (v[2] >> 16) \ + ^ (v[3] << 16) \ + ^ (v[4] >> 16) \ + ^ (v[5] << 16) \ + ^ (v[6] << 16) \ + ^ v[6] \ + ^ (v[7] & 0xffff0000) \ + ^ (v[7] >> 16); \ + h[2] = (v[0] & 0x0000ffff) \ + ^ (v[0] << 16) \ + ^ (v[1] << 16) \ + ^ (v[1] >> 16) \ + ^ (v[1] & 0xffff0000) \ + ^ (v[2] << 16) \ + ^ (v[3] >> 16) \ + ^ v[3] \ + ^ (v[4] << 16) \ + ^ (v[5] >> 16) \ + ^ v[6] \ + ^ (v[6] >> 16) \ + ^ (v[7] & 0x0000ffff) \ + ^ (v[7] << 16) \ + ^ (v[7] >> 16); \ + h[3] = (v[0] << 16) \ + ^ (v[0] >> 16) \ + ^ (v[0] & 0xffff0000) \ + ^ (v[1] & 0xffff0000) \ + ^ (v[1] >> 16) \ + ^ (v[2] << 16) \ + ^ (v[2] >> 16) \ + ^ v[2] \ + ^ (v[3] << 16) \ + ^ (v[4] >> 16) \ + ^ v[4] \ + ^ (v[5] << 16) \ + ^ (v[6] << 16) \ + ^ (v[7] & 0x0000ffff) \ + ^ (v[7] >> 16); \ + h[4] = (v[0] >> 16) \ + ^ (v[1] << 16) \ + ^ v[1] \ + ^ (v[2] >> 16) \ + ^ v[2] \ + ^ (v[3] << 16) \ + ^ (v[3] >> 16) \ + ^ v[3] \ + ^ (v[4] << 16) \ + ^ (v[5] >> 16) \ + ^ v[5] \ + ^ (v[6] << 16) \ + ^ (v[6] >> 16) \ + ^ (v[7] << 16); \ + h[5] = (v[0] << 16) \ + ^ (v[0] & 0xffff0000) \ + ^ (v[1] << 16) \ + ^ (v[1] >> 16) \ + ^ (v[1] & 0xffff0000) \ + ^ (v[2] << 16) \ + ^ v[2] \ + ^ (v[3] >> 16) \ + ^ v[3] \ + ^ (v[4] << 16) \ + ^ (v[4] >> 16) \ + ^ v[4] \ + ^ (v[5] << 16) \ + ^ (v[6] << 16) \ + ^ (v[6] >> 16) \ + ^ v[6] \ + ^ (v[7] << 16) \ + ^ (v[7] >> 16) \ + ^ (v[7] & 0xffff0000); \ + h[6] = v[0] \ + ^ v[2] \ + ^ (v[2] >> 16) \ + ^ v[3] \ + ^ (v[3] << 16) \ + ^ v[4] \ + ^ (v[4] >> 16) \ + ^ (v[5] << 16) \ + ^ (v[5] >> 16) \ + ^ v[5] \ + ^ (v[6] << 16) \ + ^ (v[6] >> 16) \ + ^ v[6] \ + ^ (v[7] << 16) \ + ^ v[7]; \ + h[7] = v[0] \ + ^ (v[0] >> 16) \ + ^ (v[1] << 16) \ + ^ (v[1] >> 16) \ + ^ (v[2] << 16) \ + ^ (v[3] >> 16) \ + ^ v[3] \ + ^ (v[4] << 16) \ + ^ v[4] \ + ^ (v[5] >> 16) \ + ^ v[5] \ + ^ (v[6] << 16) \ + ^ (v[6] >> 16) \ + ^ (v[7] << 16) \ + ^ v[7]; + +#define PASS0(h,s,u,v,t) \ +{ \ + u32x k[8]; \ + u32x w[8]; \ + X (w, u, v); \ + P (k, w); \ + R (k, h, s, 0, t); \ + A (u); \ + AA (v); \ +} + +#define PASS2(h,s,u,v,t) \ +{ \ + u32x k[8]; \ + u32x w[8]; \ + X (w, u, v); \ + P (k, w); \ + R (k, h, s, 2, t); \ + A (u); \ + C (u); \ + AA (v); \ +} + +#define PASS4(h,s,u,v,t) \ +{ \ + u32x k[8]; \ + u32x w[8]; \ + X (w, u, v); \ + P (k, w); \ + R (k, h, s, 4, t); \ + A (u); \ + AA (v); \ +} + +#define PASS6(h,s,u,v,t) \ +{ \ + u32x k[8]; \ + u32x w[8]; \ + X (w, u, v); \ + P (k, w); \ + R (k, h, s, 6, t); \ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m06900_m04 (__global pw_t *pws, __global gpu_rule_t * rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + u32x pw_buf1[4]; + + pw_buf1[0] = pws[gid].i[ 4]; + pw_buf1[1] = pws[gid].i[ 5]; + pw_buf1[2] = pws[gid].i[ 6]; + pw_buf1[3] = pws[gid].i[ 7]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * sbox + */ + + __local u32 s_tables[4][256]; + + const u32 lid4 = lid * 4; + + s_tables[0][lid4 + 0] = c_tables[0][lid4 + 0]; + s_tables[0][lid4 + 1] = c_tables[0][lid4 + 1]; + s_tables[0][lid4 + 2] = c_tables[0][lid4 + 2]; + s_tables[0][lid4 + 3] = c_tables[0][lid4 + 3]; + + s_tables[1][lid4 + 0] = c_tables[1][lid4 + 0]; + s_tables[1][lid4 + 1] = c_tables[1][lid4 + 1]; + s_tables[1][lid4 + 2] = c_tables[1][lid4 + 2]; + s_tables[1][lid4 + 3] = c_tables[1][lid4 + 3]; + + s_tables[2][lid4 + 0] = c_tables[2][lid4 + 0]; + s_tables[2][lid4 + 1] = c_tables[2][lid4 + 1]; + s_tables[2][lid4 + 2] = c_tables[2][lid4 + 2]; + s_tables[2][lid4 + 3] = c_tables[2][lid4 + 3]; + + s_tables[3][lid4 + 0] = c_tables[3][lid4 + 0]; + s_tables[3][lid4 + 1] = c_tables[3][lid4 + 1]; + s_tables[3][lid4 + 2] = c_tables[3][lid4 + 2]; + s_tables[3][lid4 + 3] = c_tables[3][lid4 + 3]; + + barrier (CLK_LOCAL_MEM_FENCE); + + if (gid >= gid_max) return; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + + w0[0] = pw_buf0[0]; + w0[1] = pw_buf0[1]; + w0[2] = pw_buf0[2]; + w0[3] = pw_buf0[3]; + + u32x w1[4]; + + w1[0] = pw_buf1[0]; + w1[1] = pw_buf1[1]; + w1[2] = pw_buf1[2]; + w1[3] = pw_buf1[3]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 out_len = apply_rules (rules_buf[il_pos].cmds, w0, w1, pw_len); + + u32 w14 = out_len * 8; + + u32x data[8]; + + data[0] = w0[0]; + data[1] = w0[1]; + data[2] = w0[2]; + data[3] = w0[3]; + data[4] = w1[0]; + data[5] = w1[1]; + data[6] = w1[2]; + data[7] = w1[3]; + + u32x state[16]; + + state[ 0] = 0; + state[ 1] = 0; + state[ 2] = 0; + state[ 3] = 0; + state[ 4] = 0; + state[ 5] = 0; + state[ 6] = 0; + state[ 7] = 0; + state[ 8] = data[0]; + state[ 9] = data[1]; + state[10] = data[2]; + state[11] = data[3]; + state[12] = data[4]; + state[13] = data[5]; + state[14] = data[6]; + state[15] = data[7]; + + u32x state_m[8]; + u32x data_m[8]; + + /* gost1 */ + + state_m[0] = state[0]; + state_m[1] = state[1]; + state_m[2] = state[2]; + state_m[3] = state[3]; + state_m[4] = state[4]; + state_m[5] = state[5]; + state_m[6] = state[6]; + state_m[7] = state[7]; + + data_m[0] = data[0]; + data_m[1] = data[1]; + data_m[2] = data[2]; + data_m[3] = data[3]; + data_m[4] = data[4]; + data_m[5] = data[5]; + data_m[6] = data[6]; + data_m[7] = data[7]; + + u32x tmp[8]; + + PASS0 (state, tmp, state_m, data_m, s_tables); + PASS2 (state, tmp, state_m, data_m, s_tables); + PASS4 (state, tmp, state_m, data_m, s_tables); + PASS6 (state, tmp, state_m, data_m, s_tables); + + SHIFT12 (state_m, data, tmp); + SHIFT16 (state, data_m, state_m); + SHIFT61 (state, data_m); + + data[0] = w14; + data[1] = 0; + data[2] = 0; + data[3] = 0; + data[4] = 0; + data[5] = 0; + data[6] = 0; + data[7] = 0; + + /* gost2 */ + + state_m[0] = state[0]; + state_m[1] = state[1]; + state_m[2] = state[2]; + state_m[3] = state[3]; + state_m[4] = state[4]; + state_m[5] = state[5]; + state_m[6] = state[6]; + state_m[7] = state[7]; + + data_m[0] = data[0]; + data_m[1] = data[1]; + data_m[2] = data[2]; + data_m[3] = data[3]; + data_m[4] = data[4]; + data_m[5] = data[5]; + data_m[6] = data[6]; + data_m[7] = data[7]; + + PASS0 (state, tmp, state_m, data_m, s_tables); + PASS2 (state, tmp, state_m, data_m, s_tables); + PASS4 (state, tmp, state_m, data_m, s_tables); + PASS6 (state, tmp, state_m, data_m, s_tables); + + SHIFT12 (state_m, data, tmp); + SHIFT16 (state, data_m, state_m); + SHIFT61 (state, data_m); + + /* gost3 */ + + data[0] = state[ 8]; + data[1] = state[ 9]; + data[2] = state[10]; + data[3] = state[11]; + data[4] = state[12]; + data[5] = state[13]; + data[6] = state[14]; + data[7] = state[15]; + + state_m[0] = state[0]; + state_m[1] = state[1]; + state_m[2] = state[2]; + state_m[3] = state[3]; + state_m[4] = state[4]; + state_m[5] = state[5]; + state_m[6] = state[6]; + state_m[7] = state[7]; + + data_m[0] = data[0]; + data_m[1] = data[1]; + data_m[2] = data[2]; + data_m[3] = data[3]; + data_m[4] = data[4]; + data_m[5] = data[5]; + data_m[6] = data[6]; + data_m[7] = data[7]; + + PASS0 (state, tmp, state_m, data_m, s_tables); + PASS2 (state, tmp, state_m, data_m, s_tables); + PASS4 (state, tmp, state_m, data_m, s_tables); + PASS6 (state, tmp, state_m, data_m, s_tables); + + SHIFT12 (state_m, data, tmp); + SHIFT16 (state, data_m, state_m); + SHIFT61 (state, data_m); + + /* store */ + + const u32x r0 = state[0]; + const u32x r1 = state[1]; + const u32x r2 = state[2]; + const u32x r3 = state[3]; + + #include VECT_COMPARE_M + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m06900_m08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m06900_m16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m06900_s04 (__global pw_t *pws, __global gpu_rule_t * rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + u32x pw_buf1[4]; + + pw_buf1[0] = pws[gid].i[ 4]; + pw_buf1[1] = pws[gid].i[ 5]; + pw_buf1[2] = pws[gid].i[ 6]; + pw_buf1[3] = pws[gid].i[ 7]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * sbox + */ + + __local u32 s_tables[4][256]; + + const u32 lid4 = lid * 4; + + s_tables[0][lid4 + 0] = c_tables[0][lid4 + 0]; + s_tables[0][lid4 + 1] = c_tables[0][lid4 + 1]; + s_tables[0][lid4 + 2] = c_tables[0][lid4 + 2]; + s_tables[0][lid4 + 3] = c_tables[0][lid4 + 3]; + + s_tables[1][lid4 + 0] = c_tables[1][lid4 + 0]; + s_tables[1][lid4 + 1] = c_tables[1][lid4 + 1]; + s_tables[1][lid4 + 2] = c_tables[1][lid4 + 2]; + s_tables[1][lid4 + 3] = c_tables[1][lid4 + 3]; + + s_tables[2][lid4 + 0] = c_tables[2][lid4 + 0]; + s_tables[2][lid4 + 1] = c_tables[2][lid4 + 1]; + s_tables[2][lid4 + 2] = c_tables[2][lid4 + 2]; + s_tables[2][lid4 + 3] = c_tables[2][lid4 + 3]; + + s_tables[3][lid4 + 0] = c_tables[3][lid4 + 0]; + s_tables[3][lid4 + 1] = c_tables[3][lid4 + 1]; + s_tables[3][lid4 + 2] = c_tables[3][lid4 + 2]; + s_tables[3][lid4 + 3] = c_tables[3][lid4 + 3]; + + barrier (CLK_LOCAL_MEM_FENCE); + + if (gid >= gid_max) return; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + + w0[0] = pw_buf0[0]; + w0[1] = pw_buf0[1]; + w0[2] = pw_buf0[2]; + w0[3] = pw_buf0[3]; + + u32x w1[4]; + + w1[0] = pw_buf1[0]; + w1[1] = pw_buf1[1]; + w1[2] = pw_buf1[2]; + w1[3] = pw_buf1[3]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 out_len = apply_rules (rules_buf[il_pos].cmds, w0, w1, pw_len); + + u32 w14 = out_len * 8; + + u32x data[8]; + + data[0] = w0[0]; + data[1] = w0[1]; + data[2] = w0[2]; + data[3] = w0[3]; + data[4] = w1[0]; + data[5] = w1[1]; + data[6] = w1[2]; + data[7] = w1[3]; + + u32x state[16]; + + state[ 0] = 0; + state[ 1] = 0; + state[ 2] = 0; + state[ 3] = 0; + state[ 4] = 0; + state[ 5] = 0; + state[ 6] = 0; + state[ 7] = 0; + state[ 8] = data[0]; + state[ 9] = data[1]; + state[10] = data[2]; + state[11] = data[3]; + state[12] = data[4]; + state[13] = data[5]; + state[14] = data[6]; + state[15] = data[7]; + + u32x state_m[8]; + u32x data_m[8]; + + /* gost1 */ + + state_m[0] = state[0]; + state_m[1] = state[1]; + state_m[2] = state[2]; + state_m[3] = state[3]; + state_m[4] = state[4]; + state_m[5] = state[5]; + state_m[6] = state[6]; + state_m[7] = state[7]; + + data_m[0] = data[0]; + data_m[1] = data[1]; + data_m[2] = data[2]; + data_m[3] = data[3]; + data_m[4] = data[4]; + data_m[5] = data[5]; + data_m[6] = data[6]; + data_m[7] = data[7]; + + u32x tmp[8]; + + PASS0 (state, tmp, state_m, data_m, s_tables); + PASS2 (state, tmp, state_m, data_m, s_tables); + PASS4 (state, tmp, state_m, data_m, s_tables); + PASS6 (state, tmp, state_m, data_m, s_tables); + + SHIFT12 (state_m, data, tmp); + SHIFT16 (state, data_m, state_m); + SHIFT61 (state, data_m); + + data[0] = w14; + data[1] = 0; + data[2] = 0; + data[3] = 0; + data[4] = 0; + data[5] = 0; + data[6] = 0; + data[7] = 0; + + /* gost2 */ + + state_m[0] = state[0]; + state_m[1] = state[1]; + state_m[2] = state[2]; + state_m[3] = state[3]; + state_m[4] = state[4]; + state_m[5] = state[5]; + state_m[6] = state[6]; + state_m[7] = state[7]; + + data_m[0] = data[0]; + data_m[1] = data[1]; + data_m[2] = data[2]; + data_m[3] = data[3]; + data_m[4] = data[4]; + data_m[5] = data[5]; + data_m[6] = data[6]; + data_m[7] = data[7]; + + PASS0 (state, tmp, state_m, data_m, s_tables); + PASS2 (state, tmp, state_m, data_m, s_tables); + PASS4 (state, tmp, state_m, data_m, s_tables); + PASS6 (state, tmp, state_m, data_m, s_tables); + + SHIFT12 (state_m, data, tmp); + SHIFT16 (state, data_m, state_m); + SHIFT61 (state, data_m); + + /* gost3 */ + + data[0] = state[ 8]; + data[1] = state[ 9]; + data[2] = state[10]; + data[3] = state[11]; + data[4] = state[12]; + data[5] = state[13]; + data[6] = state[14]; + data[7] = state[15]; + + state_m[0] = state[0]; + state_m[1] = state[1]; + state_m[2] = state[2]; + state_m[3] = state[3]; + state_m[4] = state[4]; + state_m[5] = state[5]; + state_m[6] = state[6]; + state_m[7] = state[7]; + + data_m[0] = data[0]; + data_m[1] = data[1]; + data_m[2] = data[2]; + data_m[3] = data[3]; + data_m[4] = data[4]; + data_m[5] = data[5]; + data_m[6] = data[6]; + data_m[7] = data[7]; + + PASS0 (state, tmp, state_m, data_m, s_tables); + PASS2 (state, tmp, state_m, data_m, s_tables); + PASS4 (state, tmp, state_m, data_m, s_tables); + PASS6 (state, tmp, state_m, data_m, s_tables); + + SHIFT12 (state_m, data, tmp); + SHIFT16 (state, data_m, state_m); + SHIFT61 (state, data_m); + + /* store */ + + const u32x r0 = state[0]; + const u32x r1 = state[1]; + const u32x r2 = state[2]; + const u32x r3 = state[3]; + + #include VECT_COMPARE_S + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m06900_s08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m06900_s16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/amd/m06900_a1.cl b/amd/m06900_a1.cl new file mode 100644 index 0000000000..c8bfe6bb16 --- /dev/null +++ b/amd/m06900_a1.cl @@ -0,0 +1,1357 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _GOST_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW4 +#define VECT_SIZE1 +#endif + +#ifdef VLIW5 +#define VECT_SIZE1 +#endif + +#define DGST_R0 0 +#define DGST_R1 1 +#define DGST_R2 2 +#define DGST_R3 3 + +#include "include/kernel_functions.c" +#include "types_amd.c" +#include "common_amd.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +__constant u32 c_tables[4][256] = +{ + { + 0x00072000, 0x00075000, 0x00074800, 0x00071000, + 0x00076800, 0x00074000, 0x00070000, 0x00077000, + 0x00073000, 0x00075800, 0x00070800, 0x00076000, + 0x00073800, 0x00077800, 0x00072800, 0x00071800, + 0x0005a000, 0x0005d000, 0x0005c800, 0x00059000, + 0x0005e800, 0x0005c000, 0x00058000, 0x0005f000, + 0x0005b000, 0x0005d800, 0x00058800, 0x0005e000, + 0x0005b800, 0x0005f800, 0x0005a800, 0x00059800, + 0x00022000, 0x00025000, 0x00024800, 0x00021000, + 0x00026800, 0x00024000, 0x00020000, 0x00027000, + 0x00023000, 0x00025800, 0x00020800, 0x00026000, + 0x00023800, 0x00027800, 0x00022800, 0x00021800, + 0x00062000, 0x00065000, 0x00064800, 0x00061000, + 0x00066800, 0x00064000, 0x00060000, 0x00067000, + 0x00063000, 0x00065800, 0x00060800, 0x00066000, + 0x00063800, 0x00067800, 0x00062800, 0x00061800, + 0x00032000, 0x00035000, 0x00034800, 0x00031000, + 0x00036800, 0x00034000, 0x00030000, 0x00037000, + 0x00033000, 0x00035800, 0x00030800, 0x00036000, + 0x00033800, 0x00037800, 0x00032800, 0x00031800, + 0x0006a000, 0x0006d000, 0x0006c800, 0x00069000, + 0x0006e800, 0x0006c000, 0x00068000, 0x0006f000, + 0x0006b000, 0x0006d800, 0x00068800, 0x0006e000, + 0x0006b800, 0x0006f800, 0x0006a800, 0x00069800, + 0x0007a000, 0x0007d000, 0x0007c800, 0x00079000, + 0x0007e800, 0x0007c000, 0x00078000, 0x0007f000, + 0x0007b000, 0x0007d800, 0x00078800, 0x0007e000, + 0x0007b800, 0x0007f800, 0x0007a800, 0x00079800, + 0x00052000, 0x00055000, 0x00054800, 0x00051000, + 0x00056800, 0x00054000, 0x00050000, 0x00057000, + 0x00053000, 0x00055800, 0x00050800, 0x00056000, + 0x00053800, 0x00057800, 0x00052800, 0x00051800, + 0x00012000, 0x00015000, 0x00014800, 0x00011000, + 0x00016800, 0x00014000, 0x00010000, 0x00017000, + 0x00013000, 0x00015800, 0x00010800, 0x00016000, + 0x00013800, 0x00017800, 0x00012800, 0x00011800, + 0x0001a000, 0x0001d000, 0x0001c800, 0x00019000, + 0x0001e800, 0x0001c000, 0x00018000, 0x0001f000, + 0x0001b000, 0x0001d800, 0x00018800, 0x0001e000, + 0x0001b800, 0x0001f800, 0x0001a800, 0x00019800, + 0x00042000, 0x00045000, 0x00044800, 0x00041000, + 0x00046800, 0x00044000, 0x00040000, 0x00047000, + 0x00043000, 0x00045800, 0x00040800, 0x00046000, + 0x00043800, 0x00047800, 0x00042800, 0x00041800, + 0x0000a000, 0x0000d000, 0x0000c800, 0x00009000, + 0x0000e800, 0x0000c000, 0x00008000, 0x0000f000, + 0x0000b000, 0x0000d800, 0x00008800, 0x0000e000, + 0x0000b800, 0x0000f800, 0x0000a800, 0x00009800, + 0x00002000, 0x00005000, 0x00004800, 0x00001000, + 0x00006800, 0x00004000, 0x00000000, 0x00007000, + 0x00003000, 0x00005800, 0x00000800, 0x00006000, + 0x00003800, 0x00007800, 0x00002800, 0x00001800, + 0x0003a000, 0x0003d000, 0x0003c800, 0x00039000, + 0x0003e800, 0x0003c000, 0x00038000, 0x0003f000, + 0x0003b000, 0x0003d800, 0x00038800, 0x0003e000, + 0x0003b800, 0x0003f800, 0x0003a800, 0x00039800, + 0x0002a000, 0x0002d000, 0x0002c800, 0x00029000, + 0x0002e800, 0x0002c000, 0x00028000, 0x0002f000, + 0x0002b000, 0x0002d800, 0x00028800, 0x0002e000, + 0x0002b800, 0x0002f800, 0x0002a800, 0x00029800, + 0x0004a000, 0x0004d000, 0x0004c800, 0x00049000, + 0x0004e800, 0x0004c000, 0x00048000, 0x0004f000, + 0x0004b000, 0x0004d800, 0x00048800, 0x0004e000, + 0x0004b800, 0x0004f800, 0x0004a800, 0x00049800, + }, + { + 0x03a80000, 0x03c00000, 0x03880000, 0x03e80000, + 0x03d00000, 0x03980000, 0x03a00000, 0x03900000, + 0x03f00000, 0x03f80000, 0x03e00000, 0x03b80000, + 0x03b00000, 0x03800000, 0x03c80000, 0x03d80000, + 0x06a80000, 0x06c00000, 0x06880000, 0x06e80000, + 0x06d00000, 0x06980000, 0x06a00000, 0x06900000, + 0x06f00000, 0x06f80000, 0x06e00000, 0x06b80000, + 0x06b00000, 0x06800000, 0x06c80000, 0x06d80000, + 0x05280000, 0x05400000, 0x05080000, 0x05680000, + 0x05500000, 0x05180000, 0x05200000, 0x05100000, + 0x05700000, 0x05780000, 0x05600000, 0x05380000, + 0x05300000, 0x05000000, 0x05480000, 0x05580000, + 0x00a80000, 0x00c00000, 0x00880000, 0x00e80000, + 0x00d00000, 0x00980000, 0x00a00000, 0x00900000, + 0x00f00000, 0x00f80000, 0x00e00000, 0x00b80000, + 0x00b00000, 0x00800000, 0x00c80000, 0x00d80000, + 0x00280000, 0x00400000, 0x00080000, 0x00680000, + 0x00500000, 0x00180000, 0x00200000, 0x00100000, + 0x00700000, 0x00780000, 0x00600000, 0x00380000, + 0x00300000, 0x00000000, 0x00480000, 0x00580000, + 0x04280000, 0x04400000, 0x04080000, 0x04680000, + 0x04500000, 0x04180000, 0x04200000, 0x04100000, + 0x04700000, 0x04780000, 0x04600000, 0x04380000, + 0x04300000, 0x04000000, 0x04480000, 0x04580000, + 0x04a80000, 0x04c00000, 0x04880000, 0x04e80000, + 0x04d00000, 0x04980000, 0x04a00000, 0x04900000, + 0x04f00000, 0x04f80000, 0x04e00000, 0x04b80000, + 0x04b00000, 0x04800000, 0x04c80000, 0x04d80000, + 0x07a80000, 0x07c00000, 0x07880000, 0x07e80000, + 0x07d00000, 0x07980000, 0x07a00000, 0x07900000, + 0x07f00000, 0x07f80000, 0x07e00000, 0x07b80000, + 0x07b00000, 0x07800000, 0x07c80000, 0x07d80000, + 0x07280000, 0x07400000, 0x07080000, 0x07680000, + 0x07500000, 0x07180000, 0x07200000, 0x07100000, + 0x07700000, 0x07780000, 0x07600000, 0x07380000, + 0x07300000, 0x07000000, 0x07480000, 0x07580000, + 0x02280000, 0x02400000, 0x02080000, 0x02680000, + 0x02500000, 0x02180000, 0x02200000, 0x02100000, + 0x02700000, 0x02780000, 0x02600000, 0x02380000, + 0x02300000, 0x02000000, 0x02480000, 0x02580000, + 0x03280000, 0x03400000, 0x03080000, 0x03680000, + 0x03500000, 0x03180000, 0x03200000, 0x03100000, + 0x03700000, 0x03780000, 0x03600000, 0x03380000, + 0x03300000, 0x03000000, 0x03480000, 0x03580000, + 0x06280000, 0x06400000, 0x06080000, 0x06680000, + 0x06500000, 0x06180000, 0x06200000, 0x06100000, + 0x06700000, 0x06780000, 0x06600000, 0x06380000, + 0x06300000, 0x06000000, 0x06480000, 0x06580000, + 0x05a80000, 0x05c00000, 0x05880000, 0x05e80000, + 0x05d00000, 0x05980000, 0x05a00000, 0x05900000, + 0x05f00000, 0x05f80000, 0x05e00000, 0x05b80000, + 0x05b00000, 0x05800000, 0x05c80000, 0x05d80000, + 0x01280000, 0x01400000, 0x01080000, 0x01680000, + 0x01500000, 0x01180000, 0x01200000, 0x01100000, + 0x01700000, 0x01780000, 0x01600000, 0x01380000, + 0x01300000, 0x01000000, 0x01480000, 0x01580000, + 0x02a80000, 0x02c00000, 0x02880000, 0x02e80000, + 0x02d00000, 0x02980000, 0x02a00000, 0x02900000, + 0x02f00000, 0x02f80000, 0x02e00000, 0x02b80000, + 0x02b00000, 0x02800000, 0x02c80000, 0x02d80000, + 0x01a80000, 0x01c00000, 0x01880000, 0x01e80000, + 0x01d00000, 0x01980000, 0x01a00000, 0x01900000, + 0x01f00000, 0x01f80000, 0x01e00000, 0x01b80000, + 0x01b00000, 0x01800000, 0x01c80000, 0x01d80000, + }, + { + 0x30000002, 0x60000002, 0x38000002, 0x08000002, + 0x28000002, 0x78000002, 0x68000002, 0x40000002, + 0x20000002, 0x50000002, 0x48000002, 0x70000002, + 0x00000002, 0x18000002, 0x58000002, 0x10000002, + 0xb0000005, 0xe0000005, 0xb8000005, 0x88000005, + 0xa8000005, 0xf8000005, 0xe8000005, 0xc0000005, + 0xa0000005, 0xd0000005, 0xc8000005, 0xf0000005, + 0x80000005, 0x98000005, 0xd8000005, 0x90000005, + 0x30000005, 0x60000005, 0x38000005, 0x08000005, + 0x28000005, 0x78000005, 0x68000005, 0x40000005, + 0x20000005, 0x50000005, 0x48000005, 0x70000005, + 0x00000005, 0x18000005, 0x58000005, 0x10000005, + 0x30000000, 0x60000000, 0x38000000, 0x08000000, + 0x28000000, 0x78000000, 0x68000000, 0x40000000, + 0x20000000, 0x50000000, 0x48000000, 0x70000000, + 0x00000000, 0x18000000, 0x58000000, 0x10000000, + 0xb0000003, 0xe0000003, 0xb8000003, 0x88000003, + 0xa8000003, 0xf8000003, 0xe8000003, 0xc0000003, + 0xa0000003, 0xd0000003, 0xc8000003, 0xf0000003, + 0x80000003, 0x98000003, 0xd8000003, 0x90000003, + 0x30000001, 0x60000001, 0x38000001, 0x08000001, + 0x28000001, 0x78000001, 0x68000001, 0x40000001, + 0x20000001, 0x50000001, 0x48000001, 0x70000001, + 0x00000001, 0x18000001, 0x58000001, 0x10000001, + 0xb0000000, 0xe0000000, 0xb8000000, 0x88000000, + 0xa8000000, 0xf8000000, 0xe8000000, 0xc0000000, + 0xa0000000, 0xd0000000, 0xc8000000, 0xf0000000, + 0x80000000, 0x98000000, 0xd8000000, 0x90000000, + 0xb0000006, 0xe0000006, 0xb8000006, 0x88000006, + 0xa8000006, 0xf8000006, 0xe8000006, 0xc0000006, + 0xa0000006, 0xd0000006, 0xc8000006, 0xf0000006, + 0x80000006, 0x98000006, 0xd8000006, 0x90000006, + 0xb0000001, 0xe0000001, 0xb8000001, 0x88000001, + 0xa8000001, 0xf8000001, 0xe8000001, 0xc0000001, + 0xa0000001, 0xd0000001, 0xc8000001, 0xf0000001, + 0x80000001, 0x98000001, 0xd8000001, 0x90000001, + 0x30000003, 0x60000003, 0x38000003, 0x08000003, + 0x28000003, 0x78000003, 0x68000003, 0x40000003, + 0x20000003, 0x50000003, 0x48000003, 0x70000003, + 0x00000003, 0x18000003, 0x58000003, 0x10000003, + 0x30000004, 0x60000004, 0x38000004, 0x08000004, + 0x28000004, 0x78000004, 0x68000004, 0x40000004, + 0x20000004, 0x50000004, 0x48000004, 0x70000004, + 0x00000004, 0x18000004, 0x58000004, 0x10000004, + 0xb0000002, 0xe0000002, 0xb8000002, 0x88000002, + 0xa8000002, 0xf8000002, 0xe8000002, 0xc0000002, + 0xa0000002, 0xd0000002, 0xc8000002, 0xf0000002, + 0x80000002, 0x98000002, 0xd8000002, 0x90000002, + 0xb0000004, 0xe0000004, 0xb8000004, 0x88000004, + 0xa8000004, 0xf8000004, 0xe8000004, 0xc0000004, + 0xa0000004, 0xd0000004, 0xc8000004, 0xf0000004, + 0x80000004, 0x98000004, 0xd8000004, 0x90000004, + 0x30000006, 0x60000006, 0x38000006, 0x08000006, + 0x28000006, 0x78000006, 0x68000006, 0x40000006, + 0x20000006, 0x50000006, 0x48000006, 0x70000006, + 0x00000006, 0x18000006, 0x58000006, 0x10000006, + 0xb0000007, 0xe0000007, 0xb8000007, 0x88000007, + 0xa8000007, 0xf8000007, 0xe8000007, 0xc0000007, + 0xa0000007, 0xd0000007, 0xc8000007, 0xf0000007, + 0x80000007, 0x98000007, 0xd8000007, 0x90000007, + 0x30000007, 0x60000007, 0x38000007, 0x08000007, + 0x28000007, 0x78000007, 0x68000007, 0x40000007, + 0x20000007, 0x50000007, 0x48000007, 0x70000007, + 0x00000007, 0x18000007, 0x58000007, 0x10000007, + }, + { + 0x000000e8, 0x000000d8, 0x000000a0, 0x00000088, + 0x00000098, 0x000000f8, 0x000000a8, 0x000000c8, + 0x00000080, 0x000000d0, 0x000000f0, 0x000000b8, + 0x000000b0, 0x000000c0, 0x00000090, 0x000000e0, + 0x000007e8, 0x000007d8, 0x000007a0, 0x00000788, + 0x00000798, 0x000007f8, 0x000007a8, 0x000007c8, + 0x00000780, 0x000007d0, 0x000007f0, 0x000007b8, + 0x000007b0, 0x000007c0, 0x00000790, 0x000007e0, + 0x000006e8, 0x000006d8, 0x000006a0, 0x00000688, + 0x00000698, 0x000006f8, 0x000006a8, 0x000006c8, + 0x00000680, 0x000006d0, 0x000006f0, 0x000006b8, + 0x000006b0, 0x000006c0, 0x00000690, 0x000006e0, + 0x00000068, 0x00000058, 0x00000020, 0x00000008, + 0x00000018, 0x00000078, 0x00000028, 0x00000048, + 0x00000000, 0x00000050, 0x00000070, 0x00000038, + 0x00000030, 0x00000040, 0x00000010, 0x00000060, + 0x000002e8, 0x000002d8, 0x000002a0, 0x00000288, + 0x00000298, 0x000002f8, 0x000002a8, 0x000002c8, + 0x00000280, 0x000002d0, 0x000002f0, 0x000002b8, + 0x000002b0, 0x000002c0, 0x00000290, 0x000002e0, + 0x000003e8, 0x000003d8, 0x000003a0, 0x00000388, + 0x00000398, 0x000003f8, 0x000003a8, 0x000003c8, + 0x00000380, 0x000003d0, 0x000003f0, 0x000003b8, + 0x000003b0, 0x000003c0, 0x00000390, 0x000003e0, + 0x00000568, 0x00000558, 0x00000520, 0x00000508, + 0x00000518, 0x00000578, 0x00000528, 0x00000548, + 0x00000500, 0x00000550, 0x00000570, 0x00000538, + 0x00000530, 0x00000540, 0x00000510, 0x00000560, + 0x00000268, 0x00000258, 0x00000220, 0x00000208, + 0x00000218, 0x00000278, 0x00000228, 0x00000248, + 0x00000200, 0x00000250, 0x00000270, 0x00000238, + 0x00000230, 0x00000240, 0x00000210, 0x00000260, + 0x000004e8, 0x000004d8, 0x000004a0, 0x00000488, + 0x00000498, 0x000004f8, 0x000004a8, 0x000004c8, + 0x00000480, 0x000004d0, 0x000004f0, 0x000004b8, + 0x000004b0, 0x000004c0, 0x00000490, 0x000004e0, + 0x00000168, 0x00000158, 0x00000120, 0x00000108, + 0x00000118, 0x00000178, 0x00000128, 0x00000148, + 0x00000100, 0x00000150, 0x00000170, 0x00000138, + 0x00000130, 0x00000140, 0x00000110, 0x00000160, + 0x000001e8, 0x000001d8, 0x000001a0, 0x00000188, + 0x00000198, 0x000001f8, 0x000001a8, 0x000001c8, + 0x00000180, 0x000001d0, 0x000001f0, 0x000001b8, + 0x000001b0, 0x000001c0, 0x00000190, 0x000001e0, + 0x00000768, 0x00000758, 0x00000720, 0x00000708, + 0x00000718, 0x00000778, 0x00000728, 0x00000748, + 0x00000700, 0x00000750, 0x00000770, 0x00000738, + 0x00000730, 0x00000740, 0x00000710, 0x00000760, + 0x00000368, 0x00000358, 0x00000320, 0x00000308, + 0x00000318, 0x00000378, 0x00000328, 0x00000348, + 0x00000300, 0x00000350, 0x00000370, 0x00000338, + 0x00000330, 0x00000340, 0x00000310, 0x00000360, + 0x000005e8, 0x000005d8, 0x000005a0, 0x00000588, + 0x00000598, 0x000005f8, 0x000005a8, 0x000005c8, + 0x00000580, 0x000005d0, 0x000005f0, 0x000005b8, + 0x000005b0, 0x000005c0, 0x00000590, 0x000005e0, + 0x00000468, 0x00000458, 0x00000420, 0x00000408, + 0x00000418, 0x00000478, 0x00000428, 0x00000448, + 0x00000400, 0x00000450, 0x00000470, 0x00000438, + 0x00000430, 0x00000440, 0x00000410, 0x00000460, + 0x00000668, 0x00000658, 0x00000620, 0x00000608, + 0x00000618, 0x00000678, 0x00000628, 0x00000648, + 0x00000600, 0x00000650, 0x00000670, 0x00000638, + 0x00000630, 0x00000640, 0x00000610, 0x00000660, + } +}; + +#ifdef VECT_SIZE1 +#define BOX(i,n,S) (u32x) ((S)[(n)][(i)]) +#endif + +#ifdef VECT_SIZE2 +#define BOX(i,n,S) (u32x) ((S)[(n)][(i).s0], (S)[(n)][(i).s1]) +#endif + +#define round(k1,k2,tbl) \ +{ \ + u32x t; \ + t = (k1) + r; \ + l ^= BOX (amd_bfe (t, 0, 8), 0, tbl) ^ \ + BOX (amd_bfe (t, 8, 8), 1, tbl) ^ \ + BOX (amd_bfe (t, 16, 8), 2, tbl) ^ \ + BOX (amd_bfe (t, 24, 8), 3, tbl); \ + t = (k2) + l; \ + r ^= BOX (amd_bfe (t, 0, 8), 0, tbl) ^ \ + BOX (amd_bfe (t, 8, 8), 1, tbl) ^ \ + BOX (amd_bfe (t, 16, 8), 2, tbl) ^ \ + BOX (amd_bfe (t, 24, 8), 3, tbl); \ +} + +#define R(k,h,s,i,t) \ +{ \ + u32x r; \ + u32x l; \ + r = h[i + 0]; \ + l = h[i + 1]; \ + round (k[0], k[1], t); \ + round (k[2], k[3], t); \ + round (k[4], k[5], t); \ + round (k[6], k[7], t); \ + round (k[0], k[1], t); \ + round (k[2], k[3], t); \ + round (k[4], k[5], t); \ + round (k[6], k[7], t); \ + round (k[0], k[1], t); \ + round (k[2], k[3], t); \ + round (k[4], k[5], t); \ + round (k[6], k[7], t); \ + round (k[7], k[6], t); \ + round (k[5], k[4], t); \ + round (k[3], k[2], t); \ + round (k[1], k[0], t); \ + s[i + 0] = l; \ + s[i + 1] = r; \ +} + +#define X(w,u,v) \ + w[0] = u[0] ^ v[0]; \ + w[1] = u[1] ^ v[1]; \ + w[2] = u[2] ^ v[2]; \ + w[3] = u[3] ^ v[3]; \ + w[4] = u[4] ^ v[4]; \ + w[5] = u[5] ^ v[5]; \ + w[6] = u[6] ^ v[6]; \ + w[7] = u[7] ^ v[7]; + +#define P(k,w) \ + k[0] = ((w[0] & 0x000000ff) << 0) \ + | ((w[2] & 0x000000ff) << 8) \ + | ((w[4] & 0x000000ff) << 16) \ + | ((w[6] & 0x000000ff) << 24); \ + k[1] = ((w[0] & 0x0000ff00) >> 8) \ + | ((w[2] & 0x0000ff00) >> 0) \ + | ((w[4] & 0x0000ff00) << 8) \ + | ((w[6] & 0x0000ff00) << 16); \ + k[2] = ((w[0] & 0x00ff0000) >> 16) \ + | ((w[2] & 0x00ff0000) >> 8) \ + | ((w[4] & 0x00ff0000) << 0) \ + | ((w[6] & 0x00ff0000) << 8); \ + k[3] = ((w[0] & 0xff000000) >> 24) \ + | ((w[2] & 0xff000000) >> 16) \ + | ((w[4] & 0xff000000) >> 8) \ + | ((w[6] & 0xff000000) >> 0); \ + k[4] = ((w[1] & 0x000000ff) << 0) \ + | ((w[3] & 0x000000ff) << 8) \ + | ((w[5] & 0x000000ff) << 16) \ + | ((w[7] & 0x000000ff) << 24); \ + k[5] = ((w[1] & 0x0000ff00) >> 8) \ + | ((w[3] & 0x0000ff00) >> 0) \ + | ((w[5] & 0x0000ff00) << 8) \ + | ((w[7] & 0x0000ff00) << 16); \ + k[6] = ((w[1] & 0x00ff0000) >> 16) \ + | ((w[3] & 0x00ff0000) >> 8) \ + | ((w[5] & 0x00ff0000) << 0) \ + | ((w[7] & 0x00ff0000) << 8); \ + k[7] = ((w[1] & 0xff000000) >> 24) \ + | ((w[3] & 0xff000000) >> 16) \ + | ((w[5] & 0xff000000) >> 8) \ + | ((w[7] & 0xff000000) >> 0); + +#define A(x) \ +{ \ + u32x l; \ + u32x r; \ + l = x[0] ^ x[2]; \ + r = x[1] ^ x[3]; \ + x[0] = x[2]; \ + x[1] = x[3]; \ + x[2] = x[4]; \ + x[3] = x[5]; \ + x[4] = x[6]; \ + x[5] = x[7]; \ + x[6] = l; \ + x[7] = r; \ +} + +#define AA(x) \ +{ \ + u32x l; \ + u32x r; \ + l = x[0]; \ + r = x[2]; \ + x[0] = x[4]; \ + x[2] = x[6]; \ + x[4] = l ^ r; \ + x[6] = x[0] ^ r; \ + l = x[1]; \ + r = x[3]; \ + x[1] = x[5]; \ + x[3] = x[7]; \ + x[5] = l ^ r; \ + x[7] = x[1] ^ r; \ +} + +#define C(x) \ + x[0] ^= 0xff00ff00; \ + x[1] ^= 0xff00ff00; \ + x[2] ^= 0x00ff00ff; \ + x[3] ^= 0x00ff00ff; \ + x[4] ^= 0x00ffff00; \ + x[5] ^= 0xff0000ff; \ + x[6] ^= 0x000000ff; \ + x[7] ^= 0xff00ffff; + +#define SHIFT12(u,m,s) \ + u[0] = m[0] ^ s[6]; \ + u[1] = m[1] ^ s[7]; \ + u[2] = m[2] ^ (s[0] << 16) \ + ^ (s[0] >> 16) \ + ^ (s[0] & 0x0000ffff) \ + ^ (s[1] & 0x0000ffff) \ + ^ (s[1] >> 16) \ + ^ (s[2] << 16) \ + ^ s[6] \ + ^ (s[6] << 16) \ + ^ (s[7] & 0xffff0000) \ + ^ (s[7] >> 16); \ + u[3] = m[3] ^ (s[0] & 0x0000ffff) \ + ^ (s[0] << 16) \ + ^ (s[1] & 0x0000ffff) \ + ^ (s[1] << 16) \ + ^ (s[1] >> 16) \ + ^ (s[2] << 16) \ + ^ (s[2] >> 16) \ + ^ (s[3] << 16) \ + ^ s[6] \ + ^ (s[6] << 16) \ + ^ (s[6] >> 16) \ + ^ (s[7] & 0x0000ffff) \ + ^ (s[7] << 16) \ + ^ (s[7] >> 16); \ + u[4] = m[4] ^ (s[0] & 0xffff0000) \ + ^ (s[0] << 16) \ + ^ (s[0] >> 16) \ + ^ (s[1] & 0xffff0000) \ + ^ (s[1] >> 16) \ + ^ (s[2] << 16) \ + ^ (s[2] >> 16) \ + ^ (s[3] << 16) \ + ^ (s[3] >> 16) \ + ^ (s[4] << 16) \ + ^ (s[6] << 16) \ + ^ (s[6] >> 16) \ + ^ (s[7] & 0x0000ffff) \ + ^ (s[7] << 16) \ + ^ (s[7] >> 16); \ + u[5] = m[5] ^ (s[0] << 16) \ + ^ (s[0] >> 16) \ + ^ (s[0] & 0xffff0000) \ + ^ (s[1] & 0x0000ffff) \ + ^ s[2] \ + ^ (s[2] >> 16) \ + ^ (s[3] << 16) \ + ^ (s[3] >> 16) \ + ^ (s[4] << 16) \ + ^ (s[4] >> 16) \ + ^ (s[5] << 16) \ + ^ (s[6] << 16) \ + ^ (s[6] >> 16) \ + ^ (s[7] & 0xffff0000) \ + ^ (s[7] << 16) \ + ^ (s[7] >> 16); \ + u[6] = m[6] ^ s[0] \ + ^ (s[1] >> 16) \ + ^ (s[2] << 16) \ + ^ s[3] \ + ^ (s[3] >> 16) \ + ^ (s[4] << 16) \ + ^ (s[4] >> 16) \ + ^ (s[5] << 16) \ + ^ (s[5] >> 16) \ + ^ s[6] \ + ^ (s[6] << 16) \ + ^ (s[6] >> 16) \ + ^ (s[7] << 16); \ + u[7] = m[7] ^ (s[0] & 0xffff0000) \ + ^ (s[0] << 16) \ + ^ (s[1] & 0x0000ffff) \ + ^ (s[1] << 16) \ + ^ (s[2] >> 16) \ + ^ (s[3] << 16) \ + ^ s[4] \ + ^ (s[4] >> 16) \ + ^ (s[5] << 16) \ + ^ (s[5] >> 16) \ + ^ (s[6] >> 16) \ + ^ (s[7] & 0x0000ffff) \ + ^ (s[7] << 16) \ + ^ (s[7] >> 16); + +#define SHIFT16(h,v,u) \ + v[0] = h[0] ^ (u[1] << 16) \ + ^ (u[0] >> 16); \ + v[1] = h[1] ^ (u[2] << 16) \ + ^ (u[1] >> 16); \ + v[2] = h[2] ^ (u[3] << 16) \ + ^ (u[2] >> 16); \ + v[3] = h[3] ^ (u[4] << 16) \ + ^ (u[3] >> 16); \ + v[4] = h[4] ^ (u[5] << 16) \ + ^ (u[4] >> 16); \ + v[5] = h[5] ^ (u[6] << 16) \ + ^ (u[5] >> 16); \ + v[6] = h[6] ^ (u[7] << 16) \ + ^ (u[6] >> 16); \ + v[7] = h[7] ^ (u[0] & 0xffff0000) \ + ^ (u[0] << 16) \ + ^ (u[7] >> 16) \ + ^ (u[1] & 0xffff0000) \ + ^ (u[1] << 16) \ + ^ (u[6] << 16) \ + ^ (u[7] & 0xffff0000); + +#define SHIFT61(h,v) \ + h[0] = (v[0] & 0xffff0000) \ + ^ (v[0] << 16) \ + ^ (v[0] >> 16) \ + ^ (v[1] >> 16) \ + ^ (v[1] & 0xffff0000) \ + ^ (v[2] << 16) \ + ^ (v[3] >> 16) \ + ^ (v[4] << 16) \ + ^ (v[5] >> 16) \ + ^ v[5] \ + ^ (v[6] >> 16) \ + ^ (v[7] << 16) \ + ^ (v[7] >> 16) \ + ^ (v[7] & 0x0000ffff); \ + h[1] = (v[0] << 16) \ + ^ (v[0] >> 16) \ + ^ (v[0] & 0xffff0000) \ + ^ (v[1] & 0x0000ffff) \ + ^ v[2] \ + ^ (v[2] >> 16) \ + ^ (v[3] << 16) \ + ^ (v[4] >> 16) \ + ^ (v[5] << 16) \ + ^ (v[6] << 16) \ + ^ v[6] \ + ^ (v[7] & 0xffff0000) \ + ^ (v[7] >> 16); \ + h[2] = (v[0] & 0x0000ffff) \ + ^ (v[0] << 16) \ + ^ (v[1] << 16) \ + ^ (v[1] >> 16) \ + ^ (v[1] & 0xffff0000) \ + ^ (v[2] << 16) \ + ^ (v[3] >> 16) \ + ^ v[3] \ + ^ (v[4] << 16) \ + ^ (v[5] >> 16) \ + ^ v[6] \ + ^ (v[6] >> 16) \ + ^ (v[7] & 0x0000ffff) \ + ^ (v[7] << 16) \ + ^ (v[7] >> 16); \ + h[3] = (v[0] << 16) \ + ^ (v[0] >> 16) \ + ^ (v[0] & 0xffff0000) \ + ^ (v[1] & 0xffff0000) \ + ^ (v[1] >> 16) \ + ^ (v[2] << 16) \ + ^ (v[2] >> 16) \ + ^ v[2] \ + ^ (v[3] << 16) \ + ^ (v[4] >> 16) \ + ^ v[4] \ + ^ (v[5] << 16) \ + ^ (v[6] << 16) \ + ^ (v[7] & 0x0000ffff) \ + ^ (v[7] >> 16); \ + h[4] = (v[0] >> 16) \ + ^ (v[1] << 16) \ + ^ v[1] \ + ^ (v[2] >> 16) \ + ^ v[2] \ + ^ (v[3] << 16) \ + ^ (v[3] >> 16) \ + ^ v[3] \ + ^ (v[4] << 16) \ + ^ (v[5] >> 16) \ + ^ v[5] \ + ^ (v[6] << 16) \ + ^ (v[6] >> 16) \ + ^ (v[7] << 16); \ + h[5] = (v[0] << 16) \ + ^ (v[0] & 0xffff0000) \ + ^ (v[1] << 16) \ + ^ (v[1] >> 16) \ + ^ (v[1] & 0xffff0000) \ + ^ (v[2] << 16) \ + ^ v[2] \ + ^ (v[3] >> 16) \ + ^ v[3] \ + ^ (v[4] << 16) \ + ^ (v[4] >> 16) \ + ^ v[4] \ + ^ (v[5] << 16) \ + ^ (v[6] << 16) \ + ^ (v[6] >> 16) \ + ^ v[6] \ + ^ (v[7] << 16) \ + ^ (v[7] >> 16) \ + ^ (v[7] & 0xffff0000); \ + h[6] = v[0] \ + ^ v[2] \ + ^ (v[2] >> 16) \ + ^ v[3] \ + ^ (v[3] << 16) \ + ^ v[4] \ + ^ (v[4] >> 16) \ + ^ (v[5] << 16) \ + ^ (v[5] >> 16) \ + ^ v[5] \ + ^ (v[6] << 16) \ + ^ (v[6] >> 16) \ + ^ v[6] \ + ^ (v[7] << 16) \ + ^ v[7]; \ + h[7] = v[0] \ + ^ (v[0] >> 16) \ + ^ (v[1] << 16) \ + ^ (v[1] >> 16) \ + ^ (v[2] << 16) \ + ^ (v[3] >> 16) \ + ^ v[3] \ + ^ (v[4] << 16) \ + ^ v[4] \ + ^ (v[5] >> 16) \ + ^ v[5] \ + ^ (v[6] << 16) \ + ^ (v[6] >> 16) \ + ^ (v[7] << 16) \ + ^ v[7]; + +#define PASS0(h,s,u,v,t) \ +{ \ + u32x k[8]; \ + u32x w[8]; \ + X (w, u, v); \ + P (k, w); \ + R (k, h, s, 0, t); \ + A (u); \ + AA (v); \ +} + +#define PASS2(h,s,u,v,t) \ +{ \ + u32x k[8]; \ + u32x w[8]; \ + X (w, u, v); \ + P (k, w); \ + R (k, h, s, 2, t); \ + A (u); \ + C (u); \ + AA (v); \ +} + +#define PASS4(h,s,u,v,t) \ +{ \ + u32x k[8]; \ + u32x w[8]; \ + X (w, u, v); \ + P (k, w); \ + R (k, h, s, 4, t); \ + A (u); \ + AA (v); \ +} + +#define PASS6(h,s,u,v,t) \ +{ \ + u32x k[8]; \ + u32x w[8]; \ + X (w, u, v); \ + P (k, w); \ + R (k, h, s, 6, t); \ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m06900_m04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, combs_buf[0].pw_len); + } + + /** + * sbox + */ + + __local u32 s_tables[4][256]; + + const u32 lid4 = lid * 4; + + s_tables[0][lid4 + 0] = c_tables[0][lid4 + 0]; + s_tables[0][lid4 + 1] = c_tables[0][lid4 + 1]; + s_tables[0][lid4 + 2] = c_tables[0][lid4 + 2]; + s_tables[0][lid4 + 3] = c_tables[0][lid4 + 3]; + + s_tables[1][lid4 + 0] = c_tables[1][lid4 + 0]; + s_tables[1][lid4 + 1] = c_tables[1][lid4 + 1]; + s_tables[1][lid4 + 2] = c_tables[1][lid4 + 2]; + s_tables[1][lid4 + 3] = c_tables[1][lid4 + 3]; + + s_tables[2][lid4 + 0] = c_tables[2][lid4 + 0]; + s_tables[2][lid4 + 1] = c_tables[2][lid4 + 1]; + s_tables[2][lid4 + 2] = c_tables[2][lid4 + 2]; + s_tables[2][lid4 + 3] = c_tables[2][lid4 + 3]; + + s_tables[3][lid4 + 0] = c_tables[3][lid4 + 0]; + s_tables[3][lid4 + 1] = c_tables[3][lid4 + 1]; + s_tables[3][lid4 + 2] = c_tables[3][lid4 + 2]; + s_tables[3][lid4 + 3] = c_tables[3][lid4 + 3]; + + barrier (CLK_LOCAL_MEM_FENCE); + + if (gid >= gid_max) return; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = combs_buf[il_pos].pw_len; + + const u32 pw_len = pw_l_len + pw_r_len; + + u32 wordr0[4]; + + wordr0[0] = combs_buf[il_pos].i[0]; + wordr0[1] = combs_buf[il_pos].i[1]; + wordr0[2] = combs_buf[il_pos].i[2]; + wordr0[3] = combs_buf[il_pos].i[3]; + + u32 wordr1[4]; + + wordr1[0] = combs_buf[il_pos].i[4]; + wordr1[1] = combs_buf[il_pos].i[5]; + wordr1[2] = combs_buf[il_pos].i[6]; + wordr1[3] = combs_buf[il_pos].i[7]; + + u32 wordr2[4]; + + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + + u32 wordr3[4]; + + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + u32x w0[4]; + + w0[0] = wordl0[0] | wordr0[0]; + w0[1] = wordl0[1] | wordr0[1]; + w0[2] = wordl0[2] | wordr0[2]; + w0[3] = wordl0[3] | wordr0[3]; + + u32x w1[4]; + + w1[0] = wordl1[0] | wordr1[0]; + w1[1] = wordl1[1] | wordr1[1]; + w1[2] = wordl1[2] | wordr1[2]; + w1[3] = wordl1[3] | wordr1[3]; + + u32x w2[4]; + + w2[0] = wordl2[0] | wordr2[0]; + w2[1] = wordl2[1] | wordr2[1]; + w2[2] = wordl2[2] | wordr2[2]; + w2[3] = wordl2[3] | wordr2[3]; + + u32x w3[4]; + + w3[0] = wordl3[0] | wordr3[0]; + w3[1] = wordl3[1] | wordr3[1]; + w3[2] = pw_len * 8; + w3[3] = 0; + + const u32 w14 = pw_len * 8; + + u32x data[8]; + + data[0] = w0[0]; + data[1] = w0[1]; + data[2] = w0[2]; + data[3] = w0[3]; + data[4] = w1[0]; + data[5] = w1[1]; + data[6] = w1[2]; + data[7] = w1[3]; + + u32x state[16]; + + state[ 0] = 0; + state[ 1] = 0; + state[ 2] = 0; + state[ 3] = 0; + state[ 4] = 0; + state[ 5] = 0; + state[ 6] = 0; + state[ 7] = 0; + state[ 8] = data[0]; + state[ 9] = data[1]; + state[10] = data[2]; + state[11] = data[3]; + state[12] = data[4]; + state[13] = data[5]; + state[14] = data[6]; + state[15] = data[7]; + + u32x state_m[8]; + u32x data_m[8]; + + /* gost1 */ + + state_m[0] = state[0]; + state_m[1] = state[1]; + state_m[2] = state[2]; + state_m[3] = state[3]; + state_m[4] = state[4]; + state_m[5] = state[5]; + state_m[6] = state[6]; + state_m[7] = state[7]; + + data_m[0] = data[0]; + data_m[1] = data[1]; + data_m[2] = data[2]; + data_m[3] = data[3]; + data_m[4] = data[4]; + data_m[5] = data[5]; + data_m[6] = data[6]; + data_m[7] = data[7]; + + u32x tmp[8]; + + PASS0 (state, tmp, state_m, data_m, s_tables); + PASS2 (state, tmp, state_m, data_m, s_tables); + PASS4 (state, tmp, state_m, data_m, s_tables); + PASS6 (state, tmp, state_m, data_m, s_tables); + + SHIFT12 (state_m, data, tmp); + SHIFT16 (state, data_m, state_m); + SHIFT61 (state, data_m); + + data[0] = w14; + data[1] = 0; + data[2] = 0; + data[3] = 0; + data[4] = 0; + data[5] = 0; + data[6] = 0; + data[7] = 0; + + /* gost2 */ + + state_m[0] = state[0]; + state_m[1] = state[1]; + state_m[2] = state[2]; + state_m[3] = state[3]; + state_m[4] = state[4]; + state_m[5] = state[5]; + state_m[6] = state[6]; + state_m[7] = state[7]; + + data_m[0] = data[0]; + data_m[1] = data[1]; + data_m[2] = data[2]; + data_m[3] = data[3]; + data_m[4] = data[4]; + data_m[5] = data[5]; + data_m[6] = data[6]; + data_m[7] = data[7]; + + PASS0 (state, tmp, state_m, data_m, s_tables); + PASS2 (state, tmp, state_m, data_m, s_tables); + PASS4 (state, tmp, state_m, data_m, s_tables); + PASS6 (state, tmp, state_m, data_m, s_tables); + + SHIFT12 (state_m, data, tmp); + SHIFT16 (state, data_m, state_m); + SHIFT61 (state, data_m); + + /* gost3 */ + + data[0] = state[ 8]; + data[1] = state[ 9]; + data[2] = state[10]; + data[3] = state[11]; + data[4] = state[12]; + data[5] = state[13]; + data[6] = state[14]; + data[7] = state[15]; + + state_m[0] = state[0]; + state_m[1] = state[1]; + state_m[2] = state[2]; + state_m[3] = state[3]; + state_m[4] = state[4]; + state_m[5] = state[5]; + state_m[6] = state[6]; + state_m[7] = state[7]; + + data_m[0] = data[0]; + data_m[1] = data[1]; + data_m[2] = data[2]; + data_m[3] = data[3]; + data_m[4] = data[4]; + data_m[5] = data[5]; + data_m[6] = data[6]; + data_m[7] = data[7]; + + PASS0 (state, tmp, state_m, data_m, s_tables); + PASS2 (state, tmp, state_m, data_m, s_tables); + PASS4 (state, tmp, state_m, data_m, s_tables); + PASS6 (state, tmp, state_m, data_m, s_tables); + + SHIFT12 (state_m, data, tmp); + SHIFT16 (state, data_m, state_m); + SHIFT61 (state, data_m); + + /* store */ + + const u32x r0 = state[0]; + const u32x r1 = state[1]; + const u32x r2 = state[2]; + const u32x r3 = state[3]; + + #include VECT_COMPARE_M + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m06900_m08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m06900_m16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m06900_s04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, combs_buf[0].pw_len); + } + + /** + * sbox + */ + + __local u32 s_tables[4][256]; + + const u32 lid4 = lid * 4; + + s_tables[0][lid4 + 0] = c_tables[0][lid4 + 0]; + s_tables[0][lid4 + 1] = c_tables[0][lid4 + 1]; + s_tables[0][lid4 + 2] = c_tables[0][lid4 + 2]; + s_tables[0][lid4 + 3] = c_tables[0][lid4 + 3]; + + s_tables[1][lid4 + 0] = c_tables[1][lid4 + 0]; + s_tables[1][lid4 + 1] = c_tables[1][lid4 + 1]; + s_tables[1][lid4 + 2] = c_tables[1][lid4 + 2]; + s_tables[1][lid4 + 3] = c_tables[1][lid4 + 3]; + + s_tables[2][lid4 + 0] = c_tables[2][lid4 + 0]; + s_tables[2][lid4 + 1] = c_tables[2][lid4 + 1]; + s_tables[2][lid4 + 2] = c_tables[2][lid4 + 2]; + s_tables[2][lid4 + 3] = c_tables[2][lid4 + 3]; + + s_tables[3][lid4 + 0] = c_tables[3][lid4 + 0]; + s_tables[3][lid4 + 1] = c_tables[3][lid4 + 1]; + s_tables[3][lid4 + 2] = c_tables[3][lid4 + 2]; + s_tables[3][lid4 + 3] = c_tables[3][lid4 + 3]; + + barrier (CLK_LOCAL_MEM_FENCE); + + if (gid >= gid_max) return; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = combs_buf[il_pos].pw_len; + + const u32 pw_len = pw_l_len + pw_r_len; + + u32 wordr0[4]; + + wordr0[0] = combs_buf[il_pos].i[0]; + wordr0[1] = combs_buf[il_pos].i[1]; + wordr0[2] = combs_buf[il_pos].i[2]; + wordr0[3] = combs_buf[il_pos].i[3]; + + u32 wordr1[4]; + + wordr1[0] = combs_buf[il_pos].i[4]; + wordr1[1] = combs_buf[il_pos].i[5]; + wordr1[2] = combs_buf[il_pos].i[6]; + wordr1[3] = combs_buf[il_pos].i[7]; + + u32 wordr2[4]; + + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + + u32 wordr3[4]; + + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + u32x w0[4]; + + w0[0] = wordl0[0] | wordr0[0]; + w0[1] = wordl0[1] | wordr0[1]; + w0[2] = wordl0[2] | wordr0[2]; + w0[3] = wordl0[3] | wordr0[3]; + + u32x w1[4]; + + w1[0] = wordl1[0] | wordr1[0]; + w1[1] = wordl1[1] | wordr1[1]; + w1[2] = wordl1[2] | wordr1[2]; + w1[3] = wordl1[3] | wordr1[3]; + + u32x w2[4]; + + w2[0] = wordl2[0] | wordr2[0]; + w2[1] = wordl2[1] | wordr2[1]; + w2[2] = wordl2[2] | wordr2[2]; + w2[3] = wordl2[3] | wordr2[3]; + + u32x w3[4]; + + w3[0] = wordl3[0] | wordr3[0]; + w3[1] = wordl3[1] | wordr3[1]; + w3[2] = pw_len * 8; + w3[3] = 0; + + const u32 w14 = pw_len * 8; + + u32x data[8]; + + data[0] = w0[0]; + data[1] = w0[1]; + data[2] = w0[2]; + data[3] = w0[3]; + data[4] = w1[0]; + data[5] = w1[1]; + data[6] = w1[2]; + data[7] = w1[3]; + + u32x state[16]; + + state[ 0] = 0; + state[ 1] = 0; + state[ 2] = 0; + state[ 3] = 0; + state[ 4] = 0; + state[ 5] = 0; + state[ 6] = 0; + state[ 7] = 0; + state[ 8] = data[0]; + state[ 9] = data[1]; + state[10] = data[2]; + state[11] = data[3]; + state[12] = data[4]; + state[13] = data[5]; + state[14] = data[6]; + state[15] = data[7]; + + u32x state_m[8]; + u32x data_m[8]; + + /* gost1 */ + + state_m[0] = state[0]; + state_m[1] = state[1]; + state_m[2] = state[2]; + state_m[3] = state[3]; + state_m[4] = state[4]; + state_m[5] = state[5]; + state_m[6] = state[6]; + state_m[7] = state[7]; + + data_m[0] = data[0]; + data_m[1] = data[1]; + data_m[2] = data[2]; + data_m[3] = data[3]; + data_m[4] = data[4]; + data_m[5] = data[5]; + data_m[6] = data[6]; + data_m[7] = data[7]; + + u32x tmp[8]; + + PASS0 (state, tmp, state_m, data_m, s_tables); + PASS2 (state, tmp, state_m, data_m, s_tables); + PASS4 (state, tmp, state_m, data_m, s_tables); + PASS6 (state, tmp, state_m, data_m, s_tables); + + SHIFT12 (state_m, data, tmp); + SHIFT16 (state, data_m, state_m); + SHIFT61 (state, data_m); + + data[0] = w14; + data[1] = 0; + data[2] = 0; + data[3] = 0; + data[4] = 0; + data[5] = 0; + data[6] = 0; + data[7] = 0; + + /* gost2 */ + + state_m[0] = state[0]; + state_m[1] = state[1]; + state_m[2] = state[2]; + state_m[3] = state[3]; + state_m[4] = state[4]; + state_m[5] = state[5]; + state_m[6] = state[6]; + state_m[7] = state[7]; + + data_m[0] = data[0]; + data_m[1] = data[1]; + data_m[2] = data[2]; + data_m[3] = data[3]; + data_m[4] = data[4]; + data_m[5] = data[5]; + data_m[6] = data[6]; + data_m[7] = data[7]; + + PASS0 (state, tmp, state_m, data_m, s_tables); + PASS2 (state, tmp, state_m, data_m, s_tables); + PASS4 (state, tmp, state_m, data_m, s_tables); + PASS6 (state, tmp, state_m, data_m, s_tables); + + SHIFT12 (state_m, data, tmp); + SHIFT16 (state, data_m, state_m); + SHIFT61 (state, data_m); + + /* gost3 */ + + data[0] = state[ 8]; + data[1] = state[ 9]; + data[2] = state[10]; + data[3] = state[11]; + data[4] = state[12]; + data[5] = state[13]; + data[6] = state[14]; + data[7] = state[15]; + + state_m[0] = state[0]; + state_m[1] = state[1]; + state_m[2] = state[2]; + state_m[3] = state[3]; + state_m[4] = state[4]; + state_m[5] = state[5]; + state_m[6] = state[6]; + state_m[7] = state[7]; + + data_m[0] = data[0]; + data_m[1] = data[1]; + data_m[2] = data[2]; + data_m[3] = data[3]; + data_m[4] = data[4]; + data_m[5] = data[5]; + data_m[6] = data[6]; + data_m[7] = data[7]; + + PASS0 (state, tmp, state_m, data_m, s_tables); + PASS2 (state, tmp, state_m, data_m, s_tables); + PASS4 (state, tmp, state_m, data_m, s_tables); + PASS6 (state, tmp, state_m, data_m, s_tables); + + SHIFT12 (state_m, data, tmp); + SHIFT16 (state, data_m, state_m); + SHIFT61 (state, data_m); + + /* store */ + + const u32x r0 = state[0]; + const u32x r1 = state[1]; + const u32x r2 = state[2]; + const u32x r3 = state[3]; + + #include VECT_COMPARE_S + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m06900_s08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m06900_s16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/amd/m06900_a3.cl b/amd/m06900_a3.cl new file mode 100644 index 0000000000..6166900b4e --- /dev/null +++ b/amd/m06900_a3.cl @@ -0,0 +1,1426 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _GOST_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW4 +#define VECT_SIZE1 +#endif + +#ifdef VLIW5 +#define VECT_SIZE1 +#endif + +#define DGST_R0 0 +#define DGST_R1 1 +#define DGST_R2 2 +#define DGST_R3 3 + +#include "include/kernel_functions.c" +#include "types_amd.c" +#include "common_amd.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +__constant u32 c_tables[4][256] = +{ + { + 0x00072000, 0x00075000, 0x00074800, 0x00071000, + 0x00076800, 0x00074000, 0x00070000, 0x00077000, + 0x00073000, 0x00075800, 0x00070800, 0x00076000, + 0x00073800, 0x00077800, 0x00072800, 0x00071800, + 0x0005a000, 0x0005d000, 0x0005c800, 0x00059000, + 0x0005e800, 0x0005c000, 0x00058000, 0x0005f000, + 0x0005b000, 0x0005d800, 0x00058800, 0x0005e000, + 0x0005b800, 0x0005f800, 0x0005a800, 0x00059800, + 0x00022000, 0x00025000, 0x00024800, 0x00021000, + 0x00026800, 0x00024000, 0x00020000, 0x00027000, + 0x00023000, 0x00025800, 0x00020800, 0x00026000, + 0x00023800, 0x00027800, 0x00022800, 0x00021800, + 0x00062000, 0x00065000, 0x00064800, 0x00061000, + 0x00066800, 0x00064000, 0x00060000, 0x00067000, + 0x00063000, 0x00065800, 0x00060800, 0x00066000, + 0x00063800, 0x00067800, 0x00062800, 0x00061800, + 0x00032000, 0x00035000, 0x00034800, 0x00031000, + 0x00036800, 0x00034000, 0x00030000, 0x00037000, + 0x00033000, 0x00035800, 0x00030800, 0x00036000, + 0x00033800, 0x00037800, 0x00032800, 0x00031800, + 0x0006a000, 0x0006d000, 0x0006c800, 0x00069000, + 0x0006e800, 0x0006c000, 0x00068000, 0x0006f000, + 0x0006b000, 0x0006d800, 0x00068800, 0x0006e000, + 0x0006b800, 0x0006f800, 0x0006a800, 0x00069800, + 0x0007a000, 0x0007d000, 0x0007c800, 0x00079000, + 0x0007e800, 0x0007c000, 0x00078000, 0x0007f000, + 0x0007b000, 0x0007d800, 0x00078800, 0x0007e000, + 0x0007b800, 0x0007f800, 0x0007a800, 0x00079800, + 0x00052000, 0x00055000, 0x00054800, 0x00051000, + 0x00056800, 0x00054000, 0x00050000, 0x00057000, + 0x00053000, 0x00055800, 0x00050800, 0x00056000, + 0x00053800, 0x00057800, 0x00052800, 0x00051800, + 0x00012000, 0x00015000, 0x00014800, 0x00011000, + 0x00016800, 0x00014000, 0x00010000, 0x00017000, + 0x00013000, 0x00015800, 0x00010800, 0x00016000, + 0x00013800, 0x00017800, 0x00012800, 0x00011800, + 0x0001a000, 0x0001d000, 0x0001c800, 0x00019000, + 0x0001e800, 0x0001c000, 0x00018000, 0x0001f000, + 0x0001b000, 0x0001d800, 0x00018800, 0x0001e000, + 0x0001b800, 0x0001f800, 0x0001a800, 0x00019800, + 0x00042000, 0x00045000, 0x00044800, 0x00041000, + 0x00046800, 0x00044000, 0x00040000, 0x00047000, + 0x00043000, 0x00045800, 0x00040800, 0x00046000, + 0x00043800, 0x00047800, 0x00042800, 0x00041800, + 0x0000a000, 0x0000d000, 0x0000c800, 0x00009000, + 0x0000e800, 0x0000c000, 0x00008000, 0x0000f000, + 0x0000b000, 0x0000d800, 0x00008800, 0x0000e000, + 0x0000b800, 0x0000f800, 0x0000a800, 0x00009800, + 0x00002000, 0x00005000, 0x00004800, 0x00001000, + 0x00006800, 0x00004000, 0x00000000, 0x00007000, + 0x00003000, 0x00005800, 0x00000800, 0x00006000, + 0x00003800, 0x00007800, 0x00002800, 0x00001800, + 0x0003a000, 0x0003d000, 0x0003c800, 0x00039000, + 0x0003e800, 0x0003c000, 0x00038000, 0x0003f000, + 0x0003b000, 0x0003d800, 0x00038800, 0x0003e000, + 0x0003b800, 0x0003f800, 0x0003a800, 0x00039800, + 0x0002a000, 0x0002d000, 0x0002c800, 0x00029000, + 0x0002e800, 0x0002c000, 0x00028000, 0x0002f000, + 0x0002b000, 0x0002d800, 0x00028800, 0x0002e000, + 0x0002b800, 0x0002f800, 0x0002a800, 0x00029800, + 0x0004a000, 0x0004d000, 0x0004c800, 0x00049000, + 0x0004e800, 0x0004c000, 0x00048000, 0x0004f000, + 0x0004b000, 0x0004d800, 0x00048800, 0x0004e000, + 0x0004b800, 0x0004f800, 0x0004a800, 0x00049800, + }, + { + 0x03a80000, 0x03c00000, 0x03880000, 0x03e80000, + 0x03d00000, 0x03980000, 0x03a00000, 0x03900000, + 0x03f00000, 0x03f80000, 0x03e00000, 0x03b80000, + 0x03b00000, 0x03800000, 0x03c80000, 0x03d80000, + 0x06a80000, 0x06c00000, 0x06880000, 0x06e80000, + 0x06d00000, 0x06980000, 0x06a00000, 0x06900000, + 0x06f00000, 0x06f80000, 0x06e00000, 0x06b80000, + 0x06b00000, 0x06800000, 0x06c80000, 0x06d80000, + 0x05280000, 0x05400000, 0x05080000, 0x05680000, + 0x05500000, 0x05180000, 0x05200000, 0x05100000, + 0x05700000, 0x05780000, 0x05600000, 0x05380000, + 0x05300000, 0x05000000, 0x05480000, 0x05580000, + 0x00a80000, 0x00c00000, 0x00880000, 0x00e80000, + 0x00d00000, 0x00980000, 0x00a00000, 0x00900000, + 0x00f00000, 0x00f80000, 0x00e00000, 0x00b80000, + 0x00b00000, 0x00800000, 0x00c80000, 0x00d80000, + 0x00280000, 0x00400000, 0x00080000, 0x00680000, + 0x00500000, 0x00180000, 0x00200000, 0x00100000, + 0x00700000, 0x00780000, 0x00600000, 0x00380000, + 0x00300000, 0x00000000, 0x00480000, 0x00580000, + 0x04280000, 0x04400000, 0x04080000, 0x04680000, + 0x04500000, 0x04180000, 0x04200000, 0x04100000, + 0x04700000, 0x04780000, 0x04600000, 0x04380000, + 0x04300000, 0x04000000, 0x04480000, 0x04580000, + 0x04a80000, 0x04c00000, 0x04880000, 0x04e80000, + 0x04d00000, 0x04980000, 0x04a00000, 0x04900000, + 0x04f00000, 0x04f80000, 0x04e00000, 0x04b80000, + 0x04b00000, 0x04800000, 0x04c80000, 0x04d80000, + 0x07a80000, 0x07c00000, 0x07880000, 0x07e80000, + 0x07d00000, 0x07980000, 0x07a00000, 0x07900000, + 0x07f00000, 0x07f80000, 0x07e00000, 0x07b80000, + 0x07b00000, 0x07800000, 0x07c80000, 0x07d80000, + 0x07280000, 0x07400000, 0x07080000, 0x07680000, + 0x07500000, 0x07180000, 0x07200000, 0x07100000, + 0x07700000, 0x07780000, 0x07600000, 0x07380000, + 0x07300000, 0x07000000, 0x07480000, 0x07580000, + 0x02280000, 0x02400000, 0x02080000, 0x02680000, + 0x02500000, 0x02180000, 0x02200000, 0x02100000, + 0x02700000, 0x02780000, 0x02600000, 0x02380000, + 0x02300000, 0x02000000, 0x02480000, 0x02580000, + 0x03280000, 0x03400000, 0x03080000, 0x03680000, + 0x03500000, 0x03180000, 0x03200000, 0x03100000, + 0x03700000, 0x03780000, 0x03600000, 0x03380000, + 0x03300000, 0x03000000, 0x03480000, 0x03580000, + 0x06280000, 0x06400000, 0x06080000, 0x06680000, + 0x06500000, 0x06180000, 0x06200000, 0x06100000, + 0x06700000, 0x06780000, 0x06600000, 0x06380000, + 0x06300000, 0x06000000, 0x06480000, 0x06580000, + 0x05a80000, 0x05c00000, 0x05880000, 0x05e80000, + 0x05d00000, 0x05980000, 0x05a00000, 0x05900000, + 0x05f00000, 0x05f80000, 0x05e00000, 0x05b80000, + 0x05b00000, 0x05800000, 0x05c80000, 0x05d80000, + 0x01280000, 0x01400000, 0x01080000, 0x01680000, + 0x01500000, 0x01180000, 0x01200000, 0x01100000, + 0x01700000, 0x01780000, 0x01600000, 0x01380000, + 0x01300000, 0x01000000, 0x01480000, 0x01580000, + 0x02a80000, 0x02c00000, 0x02880000, 0x02e80000, + 0x02d00000, 0x02980000, 0x02a00000, 0x02900000, + 0x02f00000, 0x02f80000, 0x02e00000, 0x02b80000, + 0x02b00000, 0x02800000, 0x02c80000, 0x02d80000, + 0x01a80000, 0x01c00000, 0x01880000, 0x01e80000, + 0x01d00000, 0x01980000, 0x01a00000, 0x01900000, + 0x01f00000, 0x01f80000, 0x01e00000, 0x01b80000, + 0x01b00000, 0x01800000, 0x01c80000, 0x01d80000, + }, + { + 0x30000002, 0x60000002, 0x38000002, 0x08000002, + 0x28000002, 0x78000002, 0x68000002, 0x40000002, + 0x20000002, 0x50000002, 0x48000002, 0x70000002, + 0x00000002, 0x18000002, 0x58000002, 0x10000002, + 0xb0000005, 0xe0000005, 0xb8000005, 0x88000005, + 0xa8000005, 0xf8000005, 0xe8000005, 0xc0000005, + 0xa0000005, 0xd0000005, 0xc8000005, 0xf0000005, + 0x80000005, 0x98000005, 0xd8000005, 0x90000005, + 0x30000005, 0x60000005, 0x38000005, 0x08000005, + 0x28000005, 0x78000005, 0x68000005, 0x40000005, + 0x20000005, 0x50000005, 0x48000005, 0x70000005, + 0x00000005, 0x18000005, 0x58000005, 0x10000005, + 0x30000000, 0x60000000, 0x38000000, 0x08000000, + 0x28000000, 0x78000000, 0x68000000, 0x40000000, + 0x20000000, 0x50000000, 0x48000000, 0x70000000, + 0x00000000, 0x18000000, 0x58000000, 0x10000000, + 0xb0000003, 0xe0000003, 0xb8000003, 0x88000003, + 0xa8000003, 0xf8000003, 0xe8000003, 0xc0000003, + 0xa0000003, 0xd0000003, 0xc8000003, 0xf0000003, + 0x80000003, 0x98000003, 0xd8000003, 0x90000003, + 0x30000001, 0x60000001, 0x38000001, 0x08000001, + 0x28000001, 0x78000001, 0x68000001, 0x40000001, + 0x20000001, 0x50000001, 0x48000001, 0x70000001, + 0x00000001, 0x18000001, 0x58000001, 0x10000001, + 0xb0000000, 0xe0000000, 0xb8000000, 0x88000000, + 0xa8000000, 0xf8000000, 0xe8000000, 0xc0000000, + 0xa0000000, 0xd0000000, 0xc8000000, 0xf0000000, + 0x80000000, 0x98000000, 0xd8000000, 0x90000000, + 0xb0000006, 0xe0000006, 0xb8000006, 0x88000006, + 0xa8000006, 0xf8000006, 0xe8000006, 0xc0000006, + 0xa0000006, 0xd0000006, 0xc8000006, 0xf0000006, + 0x80000006, 0x98000006, 0xd8000006, 0x90000006, + 0xb0000001, 0xe0000001, 0xb8000001, 0x88000001, + 0xa8000001, 0xf8000001, 0xe8000001, 0xc0000001, + 0xa0000001, 0xd0000001, 0xc8000001, 0xf0000001, + 0x80000001, 0x98000001, 0xd8000001, 0x90000001, + 0x30000003, 0x60000003, 0x38000003, 0x08000003, + 0x28000003, 0x78000003, 0x68000003, 0x40000003, + 0x20000003, 0x50000003, 0x48000003, 0x70000003, + 0x00000003, 0x18000003, 0x58000003, 0x10000003, + 0x30000004, 0x60000004, 0x38000004, 0x08000004, + 0x28000004, 0x78000004, 0x68000004, 0x40000004, + 0x20000004, 0x50000004, 0x48000004, 0x70000004, + 0x00000004, 0x18000004, 0x58000004, 0x10000004, + 0xb0000002, 0xe0000002, 0xb8000002, 0x88000002, + 0xa8000002, 0xf8000002, 0xe8000002, 0xc0000002, + 0xa0000002, 0xd0000002, 0xc8000002, 0xf0000002, + 0x80000002, 0x98000002, 0xd8000002, 0x90000002, + 0xb0000004, 0xe0000004, 0xb8000004, 0x88000004, + 0xa8000004, 0xf8000004, 0xe8000004, 0xc0000004, + 0xa0000004, 0xd0000004, 0xc8000004, 0xf0000004, + 0x80000004, 0x98000004, 0xd8000004, 0x90000004, + 0x30000006, 0x60000006, 0x38000006, 0x08000006, + 0x28000006, 0x78000006, 0x68000006, 0x40000006, + 0x20000006, 0x50000006, 0x48000006, 0x70000006, + 0x00000006, 0x18000006, 0x58000006, 0x10000006, + 0xb0000007, 0xe0000007, 0xb8000007, 0x88000007, + 0xa8000007, 0xf8000007, 0xe8000007, 0xc0000007, + 0xa0000007, 0xd0000007, 0xc8000007, 0xf0000007, + 0x80000007, 0x98000007, 0xd8000007, 0x90000007, + 0x30000007, 0x60000007, 0x38000007, 0x08000007, + 0x28000007, 0x78000007, 0x68000007, 0x40000007, + 0x20000007, 0x50000007, 0x48000007, 0x70000007, + 0x00000007, 0x18000007, 0x58000007, 0x10000007, + }, + { + 0x000000e8, 0x000000d8, 0x000000a0, 0x00000088, + 0x00000098, 0x000000f8, 0x000000a8, 0x000000c8, + 0x00000080, 0x000000d0, 0x000000f0, 0x000000b8, + 0x000000b0, 0x000000c0, 0x00000090, 0x000000e0, + 0x000007e8, 0x000007d8, 0x000007a0, 0x00000788, + 0x00000798, 0x000007f8, 0x000007a8, 0x000007c8, + 0x00000780, 0x000007d0, 0x000007f0, 0x000007b8, + 0x000007b0, 0x000007c0, 0x00000790, 0x000007e0, + 0x000006e8, 0x000006d8, 0x000006a0, 0x00000688, + 0x00000698, 0x000006f8, 0x000006a8, 0x000006c8, + 0x00000680, 0x000006d0, 0x000006f0, 0x000006b8, + 0x000006b0, 0x000006c0, 0x00000690, 0x000006e0, + 0x00000068, 0x00000058, 0x00000020, 0x00000008, + 0x00000018, 0x00000078, 0x00000028, 0x00000048, + 0x00000000, 0x00000050, 0x00000070, 0x00000038, + 0x00000030, 0x00000040, 0x00000010, 0x00000060, + 0x000002e8, 0x000002d8, 0x000002a0, 0x00000288, + 0x00000298, 0x000002f8, 0x000002a8, 0x000002c8, + 0x00000280, 0x000002d0, 0x000002f0, 0x000002b8, + 0x000002b0, 0x000002c0, 0x00000290, 0x000002e0, + 0x000003e8, 0x000003d8, 0x000003a0, 0x00000388, + 0x00000398, 0x000003f8, 0x000003a8, 0x000003c8, + 0x00000380, 0x000003d0, 0x000003f0, 0x000003b8, + 0x000003b0, 0x000003c0, 0x00000390, 0x000003e0, + 0x00000568, 0x00000558, 0x00000520, 0x00000508, + 0x00000518, 0x00000578, 0x00000528, 0x00000548, + 0x00000500, 0x00000550, 0x00000570, 0x00000538, + 0x00000530, 0x00000540, 0x00000510, 0x00000560, + 0x00000268, 0x00000258, 0x00000220, 0x00000208, + 0x00000218, 0x00000278, 0x00000228, 0x00000248, + 0x00000200, 0x00000250, 0x00000270, 0x00000238, + 0x00000230, 0x00000240, 0x00000210, 0x00000260, + 0x000004e8, 0x000004d8, 0x000004a0, 0x00000488, + 0x00000498, 0x000004f8, 0x000004a8, 0x000004c8, + 0x00000480, 0x000004d0, 0x000004f0, 0x000004b8, + 0x000004b0, 0x000004c0, 0x00000490, 0x000004e0, + 0x00000168, 0x00000158, 0x00000120, 0x00000108, + 0x00000118, 0x00000178, 0x00000128, 0x00000148, + 0x00000100, 0x00000150, 0x00000170, 0x00000138, + 0x00000130, 0x00000140, 0x00000110, 0x00000160, + 0x000001e8, 0x000001d8, 0x000001a0, 0x00000188, + 0x00000198, 0x000001f8, 0x000001a8, 0x000001c8, + 0x00000180, 0x000001d0, 0x000001f0, 0x000001b8, + 0x000001b0, 0x000001c0, 0x00000190, 0x000001e0, + 0x00000768, 0x00000758, 0x00000720, 0x00000708, + 0x00000718, 0x00000778, 0x00000728, 0x00000748, + 0x00000700, 0x00000750, 0x00000770, 0x00000738, + 0x00000730, 0x00000740, 0x00000710, 0x00000760, + 0x00000368, 0x00000358, 0x00000320, 0x00000308, + 0x00000318, 0x00000378, 0x00000328, 0x00000348, + 0x00000300, 0x00000350, 0x00000370, 0x00000338, + 0x00000330, 0x00000340, 0x00000310, 0x00000360, + 0x000005e8, 0x000005d8, 0x000005a0, 0x00000588, + 0x00000598, 0x000005f8, 0x000005a8, 0x000005c8, + 0x00000580, 0x000005d0, 0x000005f0, 0x000005b8, + 0x000005b0, 0x000005c0, 0x00000590, 0x000005e0, + 0x00000468, 0x00000458, 0x00000420, 0x00000408, + 0x00000418, 0x00000478, 0x00000428, 0x00000448, + 0x00000400, 0x00000450, 0x00000470, 0x00000438, + 0x00000430, 0x00000440, 0x00000410, 0x00000460, + 0x00000668, 0x00000658, 0x00000620, 0x00000608, + 0x00000618, 0x00000678, 0x00000628, 0x00000648, + 0x00000600, 0x00000650, 0x00000670, 0x00000638, + 0x00000630, 0x00000640, 0x00000610, 0x00000660, + } +}; + +#ifdef VECT_SIZE1 +#define BOX(i,n,S) (u32x) ((S)[(n)][(i)]) +#endif + +#ifdef VECT_SIZE2 +#define BOX(i,n,S) (u32x) ((S)[(n)][(i).s0], (S)[(n)][(i).s1]) +#endif + +#define round(k1,k2,tbl) \ +{ \ + u32x t; \ + t = (k1) + r; \ + l ^= BOX (amd_bfe (t, 0, 8), 0, tbl) ^ \ + BOX (amd_bfe (t, 8, 8), 1, tbl) ^ \ + BOX (amd_bfe (t, 16, 8), 2, tbl) ^ \ + BOX (amd_bfe (t, 24, 8), 3, tbl); \ + t = (k2) + l; \ + r ^= BOX (amd_bfe (t, 0, 8), 0, tbl) ^ \ + BOX (amd_bfe (t, 8, 8), 1, tbl) ^ \ + BOX (amd_bfe (t, 16, 8), 2, tbl) ^ \ + BOX (amd_bfe (t, 24, 8), 3, tbl); \ +} + +#define R(k,h,s,i,t) \ +{ \ + u32x r; \ + u32x l; \ + r = h[i + 0]; \ + l = h[i + 1]; \ + round (k[0], k[1], t); \ + round (k[2], k[3], t); \ + round (k[4], k[5], t); \ + round (k[6], k[7], t); \ + round (k[0], k[1], t); \ + round (k[2], k[3], t); \ + round (k[4], k[5], t); \ + round (k[6], k[7], t); \ + round (k[0], k[1], t); \ + round (k[2], k[3], t); \ + round (k[4], k[5], t); \ + round (k[6], k[7], t); \ + round (k[7], k[6], t); \ + round (k[5], k[4], t); \ + round (k[3], k[2], t); \ + round (k[1], k[0], t); \ + s[i + 0] = l; \ + s[i + 1] = r; \ +} + +#define X(w,u,v) \ + w[0] = u[0] ^ v[0]; \ + w[1] = u[1] ^ v[1]; \ + w[2] = u[2] ^ v[2]; \ + w[3] = u[3] ^ v[3]; \ + w[4] = u[4] ^ v[4]; \ + w[5] = u[5] ^ v[5]; \ + w[6] = u[6] ^ v[6]; \ + w[7] = u[7] ^ v[7]; + +#define P(k,w) \ + k[0] = ((w[0] & 0x000000ff) << 0) \ + | ((w[2] & 0x000000ff) << 8) \ + | ((w[4] & 0x000000ff) << 16) \ + | ((w[6] & 0x000000ff) << 24); \ + k[1] = ((w[0] & 0x0000ff00) >> 8) \ + | ((w[2] & 0x0000ff00) >> 0) \ + | ((w[4] & 0x0000ff00) << 8) \ + | ((w[6] & 0x0000ff00) << 16); \ + k[2] = ((w[0] & 0x00ff0000) >> 16) \ + | ((w[2] & 0x00ff0000) >> 8) \ + | ((w[4] & 0x00ff0000) << 0) \ + | ((w[6] & 0x00ff0000) << 8); \ + k[3] = ((w[0] & 0xff000000) >> 24) \ + | ((w[2] & 0xff000000) >> 16) \ + | ((w[4] & 0xff000000) >> 8) \ + | ((w[6] & 0xff000000) >> 0); \ + k[4] = ((w[1] & 0x000000ff) << 0) \ + | ((w[3] & 0x000000ff) << 8) \ + | ((w[5] & 0x000000ff) << 16) \ + | ((w[7] & 0x000000ff) << 24); \ + k[5] = ((w[1] & 0x0000ff00) >> 8) \ + | ((w[3] & 0x0000ff00) >> 0) \ + | ((w[5] & 0x0000ff00) << 8) \ + | ((w[7] & 0x0000ff00) << 16); \ + k[6] = ((w[1] & 0x00ff0000) >> 16) \ + | ((w[3] & 0x00ff0000) >> 8) \ + | ((w[5] & 0x00ff0000) << 0) \ + | ((w[7] & 0x00ff0000) << 8); \ + k[7] = ((w[1] & 0xff000000) >> 24) \ + | ((w[3] & 0xff000000) >> 16) \ + | ((w[5] & 0xff000000) >> 8) \ + | ((w[7] & 0xff000000) >> 0); + +#define A(x) \ +{ \ + u32x l; \ + u32x r; \ + l = x[0] ^ x[2]; \ + r = x[1] ^ x[3]; \ + x[0] = x[2]; \ + x[1] = x[3]; \ + x[2] = x[4]; \ + x[3] = x[5]; \ + x[4] = x[6]; \ + x[5] = x[7]; \ + x[6] = l; \ + x[7] = r; \ +} + +#define AA(x) \ +{ \ + u32x l; \ + u32x r; \ + l = x[0]; \ + r = x[2]; \ + x[0] = x[4]; \ + x[2] = x[6]; \ + x[4] = l ^ r; \ + x[6] = x[0] ^ r; \ + l = x[1]; \ + r = x[3]; \ + x[1] = x[5]; \ + x[3] = x[7]; \ + x[5] = l ^ r; \ + x[7] = x[1] ^ r; \ +} + +#define C(x) \ + x[0] ^= 0xff00ff00; \ + x[1] ^= 0xff00ff00; \ + x[2] ^= 0x00ff00ff; \ + x[3] ^= 0x00ff00ff; \ + x[4] ^= 0x00ffff00; \ + x[5] ^= 0xff0000ff; \ + x[6] ^= 0x000000ff; \ + x[7] ^= 0xff00ffff; + +#define SHIFT12(u,m,s) \ + u[0] = m[0] ^ s[6]; \ + u[1] = m[1] ^ s[7]; \ + u[2] = m[2] ^ (s[0] << 16) \ + ^ (s[0] >> 16) \ + ^ (s[0] & 0x0000ffff) \ + ^ (s[1] & 0x0000ffff) \ + ^ (s[1] >> 16) \ + ^ (s[2] << 16) \ + ^ s[6] \ + ^ (s[6] << 16) \ + ^ (s[7] & 0xffff0000) \ + ^ (s[7] >> 16); \ + u[3] = m[3] ^ (s[0] & 0x0000ffff) \ + ^ (s[0] << 16) \ + ^ (s[1] & 0x0000ffff) \ + ^ (s[1] << 16) \ + ^ (s[1] >> 16) \ + ^ (s[2] << 16) \ + ^ (s[2] >> 16) \ + ^ (s[3] << 16) \ + ^ s[6] \ + ^ (s[6] << 16) \ + ^ (s[6] >> 16) \ + ^ (s[7] & 0x0000ffff) \ + ^ (s[7] << 16) \ + ^ (s[7] >> 16); \ + u[4] = m[4] ^ (s[0] & 0xffff0000) \ + ^ (s[0] << 16) \ + ^ (s[0] >> 16) \ + ^ (s[1] & 0xffff0000) \ + ^ (s[1] >> 16) \ + ^ (s[2] << 16) \ + ^ (s[2] >> 16) \ + ^ (s[3] << 16) \ + ^ (s[3] >> 16) \ + ^ (s[4] << 16) \ + ^ (s[6] << 16) \ + ^ (s[6] >> 16) \ + ^ (s[7] & 0x0000ffff) \ + ^ (s[7] << 16) \ + ^ (s[7] >> 16); \ + u[5] = m[5] ^ (s[0] << 16) \ + ^ (s[0] >> 16) \ + ^ (s[0] & 0xffff0000) \ + ^ (s[1] & 0x0000ffff) \ + ^ s[2] \ + ^ (s[2] >> 16) \ + ^ (s[3] << 16) \ + ^ (s[3] >> 16) \ + ^ (s[4] << 16) \ + ^ (s[4] >> 16) \ + ^ (s[5] << 16) \ + ^ (s[6] << 16) \ + ^ (s[6] >> 16) \ + ^ (s[7] & 0xffff0000) \ + ^ (s[7] << 16) \ + ^ (s[7] >> 16); \ + u[6] = m[6] ^ s[0] \ + ^ (s[1] >> 16) \ + ^ (s[2] << 16) \ + ^ s[3] \ + ^ (s[3] >> 16) \ + ^ (s[4] << 16) \ + ^ (s[4] >> 16) \ + ^ (s[5] << 16) \ + ^ (s[5] >> 16) \ + ^ s[6] \ + ^ (s[6] << 16) \ + ^ (s[6] >> 16) \ + ^ (s[7] << 16); \ + u[7] = m[7] ^ (s[0] & 0xffff0000) \ + ^ (s[0] << 16) \ + ^ (s[1] & 0x0000ffff) \ + ^ (s[1] << 16) \ + ^ (s[2] >> 16) \ + ^ (s[3] << 16) \ + ^ s[4] \ + ^ (s[4] >> 16) \ + ^ (s[5] << 16) \ + ^ (s[5] >> 16) \ + ^ (s[6] >> 16) \ + ^ (s[7] & 0x0000ffff) \ + ^ (s[7] << 16) \ + ^ (s[7] >> 16); + +#define SHIFT16(h,v,u) \ + v[0] = h[0] ^ (u[1] << 16) \ + ^ (u[0] >> 16); \ + v[1] = h[1] ^ (u[2] << 16) \ + ^ (u[1] >> 16); \ + v[2] = h[2] ^ (u[3] << 16) \ + ^ (u[2] >> 16); \ + v[3] = h[3] ^ (u[4] << 16) \ + ^ (u[3] >> 16); \ + v[4] = h[4] ^ (u[5] << 16) \ + ^ (u[4] >> 16); \ + v[5] = h[5] ^ (u[6] << 16) \ + ^ (u[5] >> 16); \ + v[6] = h[6] ^ (u[7] << 16) \ + ^ (u[6] >> 16); \ + v[7] = h[7] ^ (u[0] & 0xffff0000) \ + ^ (u[0] << 16) \ + ^ (u[7] >> 16) \ + ^ (u[1] & 0xffff0000) \ + ^ (u[1] << 16) \ + ^ (u[6] << 16) \ + ^ (u[7] & 0xffff0000); + +#define SHIFT61(h,v) \ + h[0] = (v[0] & 0xffff0000) \ + ^ (v[0] << 16) \ + ^ (v[0] >> 16) \ + ^ (v[1] >> 16) \ + ^ (v[1] & 0xffff0000) \ + ^ (v[2] << 16) \ + ^ (v[3] >> 16) \ + ^ (v[4] << 16) \ + ^ (v[5] >> 16) \ + ^ v[5] \ + ^ (v[6] >> 16) \ + ^ (v[7] << 16) \ + ^ (v[7] >> 16) \ + ^ (v[7] & 0x0000ffff); \ + h[1] = (v[0] << 16) \ + ^ (v[0] >> 16) \ + ^ (v[0] & 0xffff0000) \ + ^ (v[1] & 0x0000ffff) \ + ^ v[2] \ + ^ (v[2] >> 16) \ + ^ (v[3] << 16) \ + ^ (v[4] >> 16) \ + ^ (v[5] << 16) \ + ^ (v[6] << 16) \ + ^ v[6] \ + ^ (v[7] & 0xffff0000) \ + ^ (v[7] >> 16); \ + h[2] = (v[0] & 0x0000ffff) \ + ^ (v[0] << 16) \ + ^ (v[1] << 16) \ + ^ (v[1] >> 16) \ + ^ (v[1] & 0xffff0000) \ + ^ (v[2] << 16) \ + ^ (v[3] >> 16) \ + ^ v[3] \ + ^ (v[4] << 16) \ + ^ (v[5] >> 16) \ + ^ v[6] \ + ^ (v[6] >> 16) \ + ^ (v[7] & 0x0000ffff) \ + ^ (v[7] << 16) \ + ^ (v[7] >> 16); \ + h[3] = (v[0] << 16) \ + ^ (v[0] >> 16) \ + ^ (v[0] & 0xffff0000) \ + ^ (v[1] & 0xffff0000) \ + ^ (v[1] >> 16) \ + ^ (v[2] << 16) \ + ^ (v[2] >> 16) \ + ^ v[2] \ + ^ (v[3] << 16) \ + ^ (v[4] >> 16) \ + ^ v[4] \ + ^ (v[5] << 16) \ + ^ (v[6] << 16) \ + ^ (v[7] & 0x0000ffff) \ + ^ (v[7] >> 16); \ + h[4] = (v[0] >> 16) \ + ^ (v[1] << 16) \ + ^ v[1] \ + ^ (v[2] >> 16) \ + ^ v[2] \ + ^ (v[3] << 16) \ + ^ (v[3] >> 16) \ + ^ v[3] \ + ^ (v[4] << 16) \ + ^ (v[5] >> 16) \ + ^ v[5] \ + ^ (v[6] << 16) \ + ^ (v[6] >> 16) \ + ^ (v[7] << 16); \ + h[5] = (v[0] << 16) \ + ^ (v[0] & 0xffff0000) \ + ^ (v[1] << 16) \ + ^ (v[1] >> 16) \ + ^ (v[1] & 0xffff0000) \ + ^ (v[2] << 16) \ + ^ v[2] \ + ^ (v[3] >> 16) \ + ^ v[3] \ + ^ (v[4] << 16) \ + ^ (v[4] >> 16) \ + ^ v[4] \ + ^ (v[5] << 16) \ + ^ (v[6] << 16) \ + ^ (v[6] >> 16) \ + ^ v[6] \ + ^ (v[7] << 16) \ + ^ (v[7] >> 16) \ + ^ (v[7] & 0xffff0000); \ + h[6] = v[0] \ + ^ v[2] \ + ^ (v[2] >> 16) \ + ^ v[3] \ + ^ (v[3] << 16) \ + ^ v[4] \ + ^ (v[4] >> 16) \ + ^ (v[5] << 16) \ + ^ (v[5] >> 16) \ + ^ v[5] \ + ^ (v[6] << 16) \ + ^ (v[6] >> 16) \ + ^ v[6] \ + ^ (v[7] << 16) \ + ^ v[7]; \ + h[7] = v[0] \ + ^ (v[0] >> 16) \ + ^ (v[1] << 16) \ + ^ (v[1] >> 16) \ + ^ (v[2] << 16) \ + ^ (v[3] >> 16) \ + ^ v[3] \ + ^ (v[4] << 16) \ + ^ v[4] \ + ^ (v[5] >> 16) \ + ^ v[5] \ + ^ (v[6] << 16) \ + ^ (v[6] >> 16) \ + ^ (v[7] << 16) \ + ^ v[7]; + +#define PASS0(h,s,u,v,t) \ +{ \ + u32x k[8]; \ + u32x w[8]; \ + X (w, u, v); \ + P (k, w); \ + R (k, h, s, 0, t); \ + A (u); \ + AA (v); \ +} + +#define PASS2(h,s,u,v,t) \ +{ \ + u32x k[8]; \ + u32x w[8]; \ + X (w, u, v); \ + P (k, w); \ + R (k, h, s, 2, t); \ + A (u); \ + C (u); \ + AA (v); \ +} + +#define PASS4(h,s,u,v,t) \ +{ \ + u32x k[8]; \ + u32x w[8]; \ + X (w, u, v); \ + P (k, w); \ + R (k, h, s, 4, t); \ + A (u); \ + AA (v); \ +} + +#define PASS6(h,s,u,v,t) \ +{ \ + u32x k[8]; \ + u32x w[8]; \ + X (w, u, v); \ + P (k, w); \ + R (k, h, s, 6, t); \ +} + +static void m06900m (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], const u32 pw_len, __global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, __local u32 s_tables[4][256]) +{ + /** + * modifier + */ + + const u32 gid = get_global_id (0); + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 w14 = pw_len * 8; + + /** + * loop + */ + + u32x w0l = w0[0]; + + for (u32 il_pos = 0; il_pos < bfs_cnt; il_pos++) + { + const u32 w0r = bfs_buf[il_pos].i; + + w0[0] = w0l | w0r; + + u32x data[8]; + + data[0] = w0[0]; + data[1] = w0[1]; + data[2] = w0[2]; + data[3] = w0[3]; + data[4] = w1[0]; + data[5] = w1[1]; + data[6] = w1[2]; + data[7] = w1[3]; + + u32x state[16]; + + state[ 0] = 0; + state[ 1] = 0; + state[ 2] = 0; + state[ 3] = 0; + state[ 4] = 0; + state[ 5] = 0; + state[ 6] = 0; + state[ 7] = 0; + state[ 8] = data[0]; + state[ 9] = data[1]; + state[10] = data[2]; + state[11] = data[3]; + state[12] = data[4]; + state[13] = data[5]; + state[14] = data[6]; + state[15] = data[7]; + + u32x state_m[8]; + u32x data_m[8]; + + /* gost1 */ + + state_m[0] = state[0]; + state_m[1] = state[1]; + state_m[2] = state[2]; + state_m[3] = state[3]; + state_m[4] = state[4]; + state_m[5] = state[5]; + state_m[6] = state[6]; + state_m[7] = state[7]; + + data_m[0] = data[0]; + data_m[1] = data[1]; + data_m[2] = data[2]; + data_m[3] = data[3]; + data_m[4] = data[4]; + data_m[5] = data[5]; + data_m[6] = data[6]; + data_m[7] = data[7]; + + u32x tmp[8]; + + PASS0 (state, tmp, state_m, data_m, s_tables); + PASS2 (state, tmp, state_m, data_m, s_tables); + PASS4 (state, tmp, state_m, data_m, s_tables); + PASS6 (state, tmp, state_m, data_m, s_tables); + + SHIFT12 (state_m, data, tmp); + SHIFT16 (state, data_m, state_m); + SHIFT61 (state, data_m); + + data[0] = w14; + data[1] = 0; + data[2] = 0; + data[3] = 0; + data[4] = 0; + data[5] = 0; + data[6] = 0; + data[7] = 0; + + /* gost2 */ + + state_m[0] = state[0]; + state_m[1] = state[1]; + state_m[2] = state[2]; + state_m[3] = state[3]; + state_m[4] = state[4]; + state_m[5] = state[5]; + state_m[6] = state[6]; + state_m[7] = state[7]; + + data_m[0] = data[0]; + data_m[1] = data[1]; + data_m[2] = data[2]; + data_m[3] = data[3]; + data_m[4] = data[4]; + data_m[5] = data[5]; + data_m[6] = data[6]; + data_m[7] = data[7]; + + PASS0 (state, tmp, state_m, data_m, s_tables); + PASS2 (state, tmp, state_m, data_m, s_tables); + PASS4 (state, tmp, state_m, data_m, s_tables); + PASS6 (state, tmp, state_m, data_m, s_tables); + + SHIFT12 (state_m, data, tmp); + SHIFT16 (state, data_m, state_m); + SHIFT61 (state, data_m); + + /* gost3 */ + + data[0] = state[ 8]; + data[1] = state[ 9]; + data[2] = state[10]; + data[3] = state[11]; + data[4] = state[12]; + data[5] = state[13]; + data[6] = state[14]; + data[7] = state[15]; + + state_m[0] = state[0]; + state_m[1] = state[1]; + state_m[2] = state[2]; + state_m[3] = state[3]; + state_m[4] = state[4]; + state_m[5] = state[5]; + state_m[6] = state[6]; + state_m[7] = state[7]; + + data_m[0] = data[0]; + data_m[1] = data[1]; + data_m[2] = data[2]; + data_m[3] = data[3]; + data_m[4] = data[4]; + data_m[5] = data[5]; + data_m[6] = data[6]; + data_m[7] = data[7]; + + PASS0 (state, tmp, state_m, data_m, s_tables); + PASS2 (state, tmp, state_m, data_m, s_tables); + PASS4 (state, tmp, state_m, data_m, s_tables); + PASS6 (state, tmp, state_m, data_m, s_tables); + + SHIFT12 (state_m, data, tmp); + SHIFT16 (state, data_m, state_m); + SHIFT61 (state, data_m); + + /* store */ + + const u32x r0 = state[0]; + const u32x r1 = state[1]; + const u32x r2 = state[2]; + const u32x r3 = state[3]; + + #include VECT_COMPARE_M + } +} +static void m06900s (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], const u32 pw_len, __global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, __local u32 s_tables[4][256]) +{ + /** + * modifier + */ + + const u32 gid = get_global_id (0); + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 w14 = pw_len * 8; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * loop + */ + + u32x w0l = w0[0]; + + for (u32 il_pos = 0; il_pos < bfs_cnt; il_pos++) + { + const u32 w0r = bfs_buf[il_pos].i; + + w0[0] = w0l | w0r; + + u32x data[8]; + + data[0] = w0[0]; + data[1] = w0[1]; + data[2] = w0[2]; + data[3] = w0[3]; + data[4] = w1[0]; + data[5] = w1[1]; + data[6] = w1[2]; + data[7] = w1[3]; + + u32x state[16]; + + state[ 0] = 0; + state[ 1] = 0; + state[ 2] = 0; + state[ 3] = 0; + state[ 4] = 0; + state[ 5] = 0; + state[ 6] = 0; + state[ 7] = 0; + state[ 8] = data[0]; + state[ 9] = data[1]; + state[10] = data[2]; + state[11] = data[3]; + state[12] = data[4]; + state[13] = data[5]; + state[14] = data[6]; + state[15] = data[7]; + + u32x state_m[8]; + u32x data_m[8]; + + /* gost1 */ + + state_m[0] = state[0]; + state_m[1] = state[1]; + state_m[2] = state[2]; + state_m[3] = state[3]; + state_m[4] = state[4]; + state_m[5] = state[5]; + state_m[6] = state[6]; + state_m[7] = state[7]; + + data_m[0] = data[0]; + data_m[1] = data[1]; + data_m[2] = data[2]; + data_m[3] = data[3]; + data_m[4] = data[4]; + data_m[5] = data[5]; + data_m[6] = data[6]; + data_m[7] = data[7]; + + u32x tmp[8]; + + PASS0 (state, tmp, state_m, data_m, s_tables); + PASS2 (state, tmp, state_m, data_m, s_tables); + PASS4 (state, tmp, state_m, data_m, s_tables); + PASS6 (state, tmp, state_m, data_m, s_tables); + + SHIFT12 (state_m, data, tmp); + SHIFT16 (state, data_m, state_m); + SHIFT61 (state, data_m); + + data[0] = w14; + data[1] = 0; + data[2] = 0; + data[3] = 0; + data[4] = 0; + data[5] = 0; + data[6] = 0; + data[7] = 0; + + /* gost2 */ + + state_m[0] = state[0]; + state_m[1] = state[1]; + state_m[2] = state[2]; + state_m[3] = state[3]; + state_m[4] = state[4]; + state_m[5] = state[5]; + state_m[6] = state[6]; + state_m[7] = state[7]; + + data_m[0] = data[0]; + data_m[1] = data[1]; + data_m[2] = data[2]; + data_m[3] = data[3]; + data_m[4] = data[4]; + data_m[5] = data[5]; + data_m[6] = data[6]; + data_m[7] = data[7]; + + PASS0 (state, tmp, state_m, data_m, s_tables); + PASS2 (state, tmp, state_m, data_m, s_tables); + PASS4 (state, tmp, state_m, data_m, s_tables); + PASS6 (state, tmp, state_m, data_m, s_tables); + + SHIFT12 (state_m, data, tmp); + SHIFT16 (state, data_m, state_m); + SHIFT61 (state, data_m); + + /* gost3 */ + + data[0] = state[ 8]; + data[1] = state[ 9]; + data[2] = state[10]; + data[3] = state[11]; + data[4] = state[12]; + data[5] = state[13]; + data[6] = state[14]; + data[7] = state[15]; + + state_m[0] = state[0]; + state_m[1] = state[1]; + state_m[2] = state[2]; + state_m[3] = state[3]; + state_m[4] = state[4]; + state_m[5] = state[5]; + state_m[6] = state[6]; + state_m[7] = state[7]; + + data_m[0] = data[0]; + data_m[1] = data[1]; + data_m[2] = data[2]; + data_m[3] = data[3]; + data_m[4] = data[4]; + data_m[5] = data[5]; + data_m[6] = data[6]; + data_m[7] = data[7]; + + PASS0 (state, tmp, state_m, data_m, s_tables); + PASS2 (state, tmp, state_m, data_m, s_tables); + PASS4 (state, tmp, state_m, data_m, s_tables); + PASS6 (state, tmp, state_m, data_m, s_tables); + + SHIFT12 (state_m, data, tmp); + SHIFT16 (state, data_m, state_m); + SHIFT61 (state, data_m); + + /* store */ + + const u32x r0 = state[0]; + const u32x r1 = state[1]; + const u32x r2 = state[2]; + const u32x r3 = state[3]; + + #include VECT_COMPARE_S + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m06900_m04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * sbox + */ + + __local u32 s_tables[4][256]; + + const u32 lid4 = lid * 4; + + s_tables[0][lid4 + 0] = c_tables[0][lid4 + 0]; + s_tables[0][lid4 + 1] = c_tables[0][lid4 + 1]; + s_tables[0][lid4 + 2] = c_tables[0][lid4 + 2]; + s_tables[0][lid4 + 3] = c_tables[0][lid4 + 3]; + + s_tables[1][lid4 + 0] = c_tables[1][lid4 + 0]; + s_tables[1][lid4 + 1] = c_tables[1][lid4 + 1]; + s_tables[1][lid4 + 2] = c_tables[1][lid4 + 2]; + s_tables[1][lid4 + 3] = c_tables[1][lid4 + 3]; + + s_tables[2][lid4 + 0] = c_tables[2][lid4 + 0]; + s_tables[2][lid4 + 1] = c_tables[2][lid4 + 1]; + s_tables[2][lid4 + 2] = c_tables[2][lid4 + 2]; + s_tables[2][lid4 + 3] = c_tables[2][lid4 + 3]; + + s_tables[3][lid4 + 0] = c_tables[3][lid4 + 0]; + s_tables[3][lid4 + 1] = c_tables[3][lid4 + 1]; + s_tables[3][lid4 + 2] = c_tables[3][lid4 + 2]; + s_tables[3][lid4 + 3] = c_tables[3][lid4 + 3]; + + barrier (CLK_LOCAL_MEM_FENCE); + + if (gid >= gid_max) return; + + /** + * main + */ + + m06900m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset, s_tables); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m06900_m08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * sbox + */ + + __local u32 s_tables[4][256]; + + const u32 lid4 = lid * 4; + + s_tables[0][lid4 + 0] = c_tables[0][lid4 + 0]; + s_tables[0][lid4 + 1] = c_tables[0][lid4 + 1]; + s_tables[0][lid4 + 2] = c_tables[0][lid4 + 2]; + s_tables[0][lid4 + 3] = c_tables[0][lid4 + 3]; + + s_tables[1][lid4 + 0] = c_tables[1][lid4 + 0]; + s_tables[1][lid4 + 1] = c_tables[1][lid4 + 1]; + s_tables[1][lid4 + 2] = c_tables[1][lid4 + 2]; + s_tables[1][lid4 + 3] = c_tables[1][lid4 + 3]; + + s_tables[2][lid4 + 0] = c_tables[2][lid4 + 0]; + s_tables[2][lid4 + 1] = c_tables[2][lid4 + 1]; + s_tables[2][lid4 + 2] = c_tables[2][lid4 + 2]; + s_tables[2][lid4 + 3] = c_tables[2][lid4 + 3]; + + s_tables[3][lid4 + 0] = c_tables[3][lid4 + 0]; + s_tables[3][lid4 + 1] = c_tables[3][lid4 + 1]; + s_tables[3][lid4 + 2] = c_tables[3][lid4 + 2]; + s_tables[3][lid4 + 3] = c_tables[3][lid4 + 3]; + + barrier (CLK_LOCAL_MEM_FENCE); + + if (gid >= gid_max) return; + + /** + * main + */ + + m06900m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset, s_tables); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m06900_m16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m06900_s04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * sbox + */ + + __local u32 s_tables[4][256]; + + const u32 lid4 = lid * 4; + + s_tables[0][lid4 + 0] = c_tables[0][lid4 + 0]; + s_tables[0][lid4 + 1] = c_tables[0][lid4 + 1]; + s_tables[0][lid4 + 2] = c_tables[0][lid4 + 2]; + s_tables[0][lid4 + 3] = c_tables[0][lid4 + 3]; + + s_tables[1][lid4 + 0] = c_tables[1][lid4 + 0]; + s_tables[1][lid4 + 1] = c_tables[1][lid4 + 1]; + s_tables[1][lid4 + 2] = c_tables[1][lid4 + 2]; + s_tables[1][lid4 + 3] = c_tables[1][lid4 + 3]; + + s_tables[2][lid4 + 0] = c_tables[2][lid4 + 0]; + s_tables[2][lid4 + 1] = c_tables[2][lid4 + 1]; + s_tables[2][lid4 + 2] = c_tables[2][lid4 + 2]; + s_tables[2][lid4 + 3] = c_tables[2][lid4 + 3]; + + s_tables[3][lid4 + 0] = c_tables[3][lid4 + 0]; + s_tables[3][lid4 + 1] = c_tables[3][lid4 + 1]; + s_tables[3][lid4 + 2] = c_tables[3][lid4 + 2]; + s_tables[3][lid4 + 3] = c_tables[3][lid4 + 3]; + + barrier (CLK_LOCAL_MEM_FENCE); + + if (gid >= gid_max) return; + + /** + * main + */ + + m06900s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset, s_tables); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m06900_s08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * sbox + */ + + __local u32 s_tables[4][256]; + + const u32 lid4 = lid * 4; + + s_tables[0][lid4 + 0] = c_tables[0][lid4 + 0]; + s_tables[0][lid4 + 1] = c_tables[0][lid4 + 1]; + s_tables[0][lid4 + 2] = c_tables[0][lid4 + 2]; + s_tables[0][lid4 + 3] = c_tables[0][lid4 + 3]; + + s_tables[1][lid4 + 0] = c_tables[1][lid4 + 0]; + s_tables[1][lid4 + 1] = c_tables[1][lid4 + 1]; + s_tables[1][lid4 + 2] = c_tables[1][lid4 + 2]; + s_tables[1][lid4 + 3] = c_tables[1][lid4 + 3]; + + s_tables[2][lid4 + 0] = c_tables[2][lid4 + 0]; + s_tables[2][lid4 + 1] = c_tables[2][lid4 + 1]; + s_tables[2][lid4 + 2] = c_tables[2][lid4 + 2]; + s_tables[2][lid4 + 3] = c_tables[2][lid4 + 3]; + + s_tables[3][lid4 + 0] = c_tables[3][lid4 + 0]; + s_tables[3][lid4 + 1] = c_tables[3][lid4 + 1]; + s_tables[3][lid4 + 2] = c_tables[3][lid4 + 2]; + s_tables[3][lid4 + 3] = c_tables[3][lid4 + 3]; + + barrier (CLK_LOCAL_MEM_FENCE); + + if (gid >= gid_max) return; + + /** + * main + */ + + m06900s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset, s_tables); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m06900_s16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/amd/m07100.cl b/amd/m07100.cl new file mode 100644 index 0000000000..25e108f491 --- /dev/null +++ b/amd/m07100.cl @@ -0,0 +1,508 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _PBKDF2_SHA512_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW4 +#define VECT_SIZE1 +#endif + +#ifdef VLIW5 +#define VECT_SIZE1 +#endif + +#define DGST_R0 0 +#define DGST_R1 1 +#define DGST_R2 2 +#define DGST_R3 3 + +#include "include/kernel_functions.c" +#include "types_amd.c" +#include "common_amd.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +__constant u64 k_sha512[80] = +{ + SHA512C00, SHA512C01, SHA512C02, SHA512C03, + SHA512C04, SHA512C05, SHA512C06, SHA512C07, + SHA512C08, SHA512C09, SHA512C0a, SHA512C0b, + SHA512C0c, SHA512C0d, SHA512C0e, SHA512C0f, + SHA512C10, SHA512C11, SHA512C12, SHA512C13, + SHA512C14, SHA512C15, SHA512C16, SHA512C17, + SHA512C18, SHA512C19, SHA512C1a, SHA512C1b, + SHA512C1c, SHA512C1d, SHA512C1e, SHA512C1f, + SHA512C20, SHA512C21, SHA512C22, SHA512C23, + SHA512C24, SHA512C25, SHA512C26, SHA512C27, + SHA512C28, SHA512C29, SHA512C2a, SHA512C2b, + SHA512C2c, SHA512C2d, SHA512C2e, SHA512C2f, + SHA512C30, SHA512C31, SHA512C32, SHA512C33, + SHA512C34, SHA512C35, SHA512C36, SHA512C37, + SHA512C38, SHA512C39, SHA512C3a, SHA512C3b, + SHA512C3c, SHA512C3d, SHA512C3e, SHA512C3f, + SHA512C40, SHA512C41, SHA512C42, SHA512C43, + SHA512C44, SHA512C45, SHA512C46, SHA512C47, + SHA512C48, SHA512C49, SHA512C4a, SHA512C4b, + SHA512C4c, SHA512C4d, SHA512C4e, SHA512C4f, +}; + +static void sha512_transform (const u64 w[16], u64 dgst[8]) +{ + u64 a = dgst[0]; + u64 b = dgst[1]; + u64 c = dgst[2]; + u64 d = dgst[3]; + u64 e = dgst[4]; + u64 f = dgst[5]; + u64 g = dgst[6]; + u64 h = dgst[7]; + + u64 w0_t = w[ 0]; + u64 w1_t = w[ 1]; + u64 w2_t = w[ 2]; + u64 w3_t = w[ 3]; + u64 w4_t = w[ 4]; + u64 w5_t = w[ 5]; + u64 w6_t = w[ 6]; + u64 w7_t = w[ 7]; + u64 w8_t = w[ 8]; + u64 w9_t = w[ 9]; + u64 wa_t = w[10]; + u64 wb_t = w[11]; + u64 wc_t = w[12]; + u64 wd_t = w[13]; + u64 we_t = w[14]; + u64 wf_t = w[15]; + + #define ROUND_EXPAND() \ + { \ + w0_t = SHA512_EXPAND (we_t, w9_t, w1_t, w0_t); \ + w1_t = SHA512_EXPAND (wf_t, wa_t, w2_t, w1_t); \ + w2_t = SHA512_EXPAND (w0_t, wb_t, w3_t, w2_t); \ + w3_t = SHA512_EXPAND (w1_t, wc_t, w4_t, w3_t); \ + w4_t = SHA512_EXPAND (w2_t, wd_t, w5_t, w4_t); \ + w5_t = SHA512_EXPAND (w3_t, we_t, w6_t, w5_t); \ + w6_t = SHA512_EXPAND (w4_t, wf_t, w7_t, w6_t); \ + w7_t = SHA512_EXPAND (w5_t, w0_t, w8_t, w7_t); \ + w8_t = SHA512_EXPAND (w6_t, w1_t, w9_t, w8_t); \ + w9_t = SHA512_EXPAND (w7_t, w2_t, wa_t, w9_t); \ + wa_t = SHA512_EXPAND (w8_t, w3_t, wb_t, wa_t); \ + wb_t = SHA512_EXPAND (w9_t, w4_t, wc_t, wb_t); \ + wc_t = SHA512_EXPAND (wa_t, w5_t, wd_t, wc_t); \ + wd_t = SHA512_EXPAND (wb_t, w6_t, we_t, wd_t); \ + we_t = SHA512_EXPAND (wc_t, w7_t, wf_t, we_t); \ + wf_t = SHA512_EXPAND (wd_t, w8_t, w0_t, wf_t); \ + } + + #define ROUND_STEP(i) \ + { \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, a, b, c, d, e, f, g, h, w0_t, k_sha512[i + 0]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, h, a, b, c, d, e, f, g, w1_t, k_sha512[i + 1]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, g, h, a, b, c, d, e, f, w2_t, k_sha512[i + 2]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, f, g, h, a, b, c, d, e, w3_t, k_sha512[i + 3]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, e, f, g, h, a, b, c, d, w4_t, k_sha512[i + 4]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, d, e, f, g, h, a, b, c, w5_t, k_sha512[i + 5]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, c, d, e, f, g, h, a, b, w6_t, k_sha512[i + 6]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, b, c, d, e, f, g, h, a, w7_t, k_sha512[i + 7]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, a, b, c, d, e, f, g, h, w8_t, k_sha512[i + 8]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, h, a, b, c, d, e, f, g, w9_t, k_sha512[i + 9]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, g, h, a, b, c, d, e, f, wa_t, k_sha512[i + 10]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, f, g, h, a, b, c, d, e, wb_t, k_sha512[i + 11]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, e, f, g, h, a, b, c, d, wc_t, k_sha512[i + 12]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, d, e, f, g, h, a, b, c, wd_t, k_sha512[i + 13]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, c, d, e, f, g, h, a, b, we_t, k_sha512[i + 14]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, b, c, d, e, f, g, h, a, wf_t, k_sha512[i + 15]); \ + } + + ROUND_STEP (0); + + //#pragma unroll // kernel fails if used + for (int i = 16; i < 80; i += 16) + { + ROUND_EXPAND (); ROUND_STEP (i); + } + + dgst[0] += a; + dgst[1] += b; + dgst[2] += c; + dgst[3] += d; + dgst[4] += e; + dgst[5] += f; + dgst[6] += g; + dgst[7] += h; +} + +static void hmac_run (const u64 w1[16], const u64 ipad[8], const u64 opad[8], u64 dgst[8]) +{ + dgst[0] = ipad[0]; + dgst[1] = ipad[1]; + dgst[2] = ipad[2]; + dgst[3] = ipad[3]; + dgst[4] = ipad[4]; + dgst[5] = ipad[5]; + dgst[6] = ipad[6]; + dgst[7] = ipad[7]; + + sha512_transform (w1, dgst); + + u64 w[16]; + + w[ 0] = dgst[0]; + w[ 1] = dgst[1]; + w[ 2] = dgst[2]; + w[ 3] = dgst[3]; + w[ 4] = dgst[4]; + w[ 5] = dgst[5]; + w[ 6] = dgst[6]; + w[ 7] = dgst[7]; + w[ 8] = 0x8000000000000000; + w[ 9] = 0; + w[10] = 0; + w[11] = 0; + w[12] = 0; + w[13] = 0; + w[14] = 0; + w[15] = (128 + 64) * 8; + + dgst[0] = opad[0]; + dgst[1] = opad[1]; + dgst[2] = opad[2]; + dgst[3] = opad[3]; + dgst[4] = opad[4]; + dgst[5] = opad[5]; + dgst[6] = opad[6]; + dgst[7] = opad[7]; + + sha512_transform (w, dgst); +} + +static void hmac_init (u64 w[16], u64 ipad[8], u64 opad[8]) +{ + w[ 0] ^= 0x3636363636363636; + w[ 1] ^= 0x3636363636363636; + w[ 2] ^= 0x3636363636363636; + w[ 3] ^= 0x3636363636363636; + w[ 4] ^= 0x3636363636363636; + w[ 5] ^= 0x3636363636363636; + w[ 6] ^= 0x3636363636363636; + w[ 7] ^= 0x3636363636363636; + w[ 8] ^= 0x3636363636363636; + w[ 9] ^= 0x3636363636363636; + w[10] ^= 0x3636363636363636; + w[11] ^= 0x3636363636363636; + w[12] ^= 0x3636363636363636; + w[13] ^= 0x3636363636363636; + w[14] ^= 0x3636363636363636; + w[15] ^= 0x3636363636363636; + + ipad[0] = SHA512M_A; + ipad[1] = SHA512M_B; + ipad[2] = SHA512M_C; + ipad[3] = SHA512M_D; + ipad[4] = SHA512M_E; + ipad[5] = SHA512M_F; + ipad[6] = SHA512M_G; + ipad[7] = SHA512M_H; + + sha512_transform (w, ipad); + + w[ 0] ^= 0x6a6a6a6a6a6a6a6a; + w[ 1] ^= 0x6a6a6a6a6a6a6a6a; + w[ 2] ^= 0x6a6a6a6a6a6a6a6a; + w[ 3] ^= 0x6a6a6a6a6a6a6a6a; + w[ 4] ^= 0x6a6a6a6a6a6a6a6a; + w[ 5] ^= 0x6a6a6a6a6a6a6a6a; + w[ 6] ^= 0x6a6a6a6a6a6a6a6a; + w[ 7] ^= 0x6a6a6a6a6a6a6a6a; + w[ 8] ^= 0x6a6a6a6a6a6a6a6a; + w[ 9] ^= 0x6a6a6a6a6a6a6a6a; + w[10] ^= 0x6a6a6a6a6a6a6a6a; + w[11] ^= 0x6a6a6a6a6a6a6a6a; + w[12] ^= 0x6a6a6a6a6a6a6a6a; + w[13] ^= 0x6a6a6a6a6a6a6a6a; + w[14] ^= 0x6a6a6a6a6a6a6a6a; + w[15] ^= 0x6a6a6a6a6a6a6a6a; + + opad[0] = SHA512M_A; + opad[1] = SHA512M_B; + opad[2] = SHA512M_C; + opad[3] = SHA512M_D; + opad[4] = SHA512M_E; + opad[5] = SHA512M_F; + opad[6] = SHA512M_G; + opad[7] = SHA512M_H; + + sha512_transform (w, opad); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m07100_init (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global pbkdf2_sha512_tmp_t *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global pbkdf2_sha512_t *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = swap_workaround (pws[gid].i[ 0]); + w0[1] = swap_workaround (pws[gid].i[ 1]); + w0[2] = swap_workaround (pws[gid].i[ 2]); + w0[3] = swap_workaround (pws[gid].i[ 3]); + + u32x w1[4]; + + w1[0] = swap_workaround (pws[gid].i[ 4]); + w1[1] = swap_workaround (pws[gid].i[ 5]); + w1[2] = swap_workaround (pws[gid].i[ 6]); + w1[3] = swap_workaround (pws[gid].i[ 7]); + + u32x w2[4]; + + w2[0] = swap_workaround (pws[gid].i[ 8]); + w2[1] = swap_workaround (pws[gid].i[ 9]); + w2[2] = swap_workaround (pws[gid].i[10]); + w2[3] = swap_workaround (pws[gid].i[11]); + + u32x w3[4]; + + w3[0] = swap_workaround (pws[gid].i[12]); + w3[1] = swap_workaround (pws[gid].i[13]); + w3[2] = swap_workaround (pws[gid].i[14]); + w3[3] = swap_workaround (pws[gid].i[15]); + + /** + * salt + */ + + u64 esalt_buf[16]; + + u32 salt_len = salt_bufs[salt_pos].salt_len; + + esalt_buf[ 0] = hl32_to_64 (swap_workaround (esalt_bufs[salt_pos].salt_buf[ 0]), swap_workaround (esalt_bufs[salt_pos].salt_buf[ 1])); + esalt_buf[ 1] = hl32_to_64 (swap_workaround (esalt_bufs[salt_pos].salt_buf[ 2]), swap_workaround (esalt_bufs[salt_pos].salt_buf[ 3])); + esalt_buf[ 2] = hl32_to_64 (swap_workaround (esalt_bufs[salt_pos].salt_buf[ 4]), swap_workaround (esalt_bufs[salt_pos].salt_buf[ 5])); + esalt_buf[ 3] = hl32_to_64 (swap_workaround (esalt_bufs[salt_pos].salt_buf[ 6]), swap_workaround (esalt_bufs[salt_pos].salt_buf[ 7])); + esalt_buf[ 4] = hl32_to_64 (swap_workaround (esalt_bufs[salt_pos].salt_buf[ 8]), swap_workaround (esalt_bufs[salt_pos].salt_buf[ 9])); + esalt_buf[ 5] = hl32_to_64 (swap_workaround (esalt_bufs[salt_pos].salt_buf[10]), swap_workaround (esalt_bufs[salt_pos].salt_buf[11])); + esalt_buf[ 6] = hl32_to_64 (swap_workaround (esalt_bufs[salt_pos].salt_buf[12]), swap_workaround (esalt_bufs[salt_pos].salt_buf[13])); + esalt_buf[ 7] = hl32_to_64 (swap_workaround (esalt_bufs[salt_pos].salt_buf[14]), swap_workaround (esalt_bufs[salt_pos].salt_buf[15])); + esalt_buf[ 8] = hl32_to_64 (swap_workaround (esalt_bufs[salt_pos].salt_buf[16]), swap_workaround (esalt_bufs[salt_pos].salt_buf[17])); + esalt_buf[ 9] = hl32_to_64 (swap_workaround (esalt_bufs[salt_pos].salt_buf[18]), swap_workaround (esalt_bufs[salt_pos].salt_buf[19])); + esalt_buf[10] = hl32_to_64 (swap_workaround (esalt_bufs[salt_pos].salt_buf[20]), swap_workaround (esalt_bufs[salt_pos].salt_buf[21])); + esalt_buf[11] = hl32_to_64 (swap_workaround (esalt_bufs[salt_pos].salt_buf[22]), swap_workaround (esalt_bufs[salt_pos].salt_buf[23])); + esalt_buf[12] = hl32_to_64 (swap_workaround (esalt_bufs[salt_pos].salt_buf[24]), swap_workaround (esalt_bufs[salt_pos].salt_buf[25])); + esalt_buf[13] = hl32_to_64 (swap_workaround (esalt_bufs[salt_pos].salt_buf[26]), swap_workaround (esalt_bufs[salt_pos].salt_buf[27])); + esalt_buf[14] = 0; + esalt_buf[15] = (128 + salt_len + 4) * 8; + + u64 w[16]; + + w[ 0] = hl32_to_64 (w0[0], w0[1]); + w[ 1] = hl32_to_64 (w0[2], w0[3]); + w[ 2] = hl32_to_64 (w1[0], w1[1]); + w[ 3] = hl32_to_64 (w1[2], w1[3]); + w[ 4] = hl32_to_64 (w2[0], w2[1]); + w[ 5] = hl32_to_64 (w2[2], w2[3]); + w[ 6] = hl32_to_64 (w3[0], w3[1]); + w[ 7] = hl32_to_64 (w3[2], w3[3]); + w[ 8] = 0; + w[ 9] = 0; + w[10] = 0; + w[11] = 0; + w[12] = 0; + w[13] = 0; + w[14] = 0; + w[15] = 0; + + u64 ipad[8]; + u64 opad[8]; + + hmac_init (w, ipad, opad); + + tmps[gid].ipad[0] = ipad[0]; + tmps[gid].ipad[1] = ipad[1]; + tmps[gid].ipad[2] = ipad[2]; + tmps[gid].ipad[3] = ipad[3]; + tmps[gid].ipad[4] = ipad[4]; + tmps[gid].ipad[5] = ipad[5]; + tmps[gid].ipad[6] = ipad[6]; + tmps[gid].ipad[7] = ipad[7]; + + tmps[gid].opad[0] = opad[0]; + tmps[gid].opad[1] = opad[1]; + tmps[gid].opad[2] = opad[2]; + tmps[gid].opad[3] = opad[3]; + tmps[gid].opad[4] = opad[4]; + tmps[gid].opad[5] = opad[5]; + tmps[gid].opad[6] = opad[6]; + tmps[gid].opad[7] = opad[7]; + + for (u32 i = 0, j = 1; i < 8; i += 8, j += 1) + { + u64 dgst[8]; + + hmac_run (esalt_buf, ipad, opad, dgst); + + tmps[gid].dgst[i + 0] = dgst[0]; + tmps[gid].dgst[i + 1] = dgst[1]; + tmps[gid].dgst[i + 2] = dgst[2]; + tmps[gid].dgst[i + 3] = dgst[3]; + tmps[gid].dgst[i + 4] = dgst[4]; + tmps[gid].dgst[i + 5] = dgst[5]; + tmps[gid].dgst[i + 6] = dgst[6]; + tmps[gid].dgst[i + 7] = dgst[7]; + + tmps[gid].out[i + 0] = dgst[0]; + tmps[gid].out[i + 1] = dgst[1]; + tmps[gid].out[i + 2] = dgst[2]; + tmps[gid].out[i + 3] = dgst[3]; + tmps[gid].out[i + 4] = dgst[4]; + tmps[gid].out[i + 5] = dgst[5]; + tmps[gid].out[i + 6] = dgst[6]; + tmps[gid].out[i + 7] = dgst[7]; + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m07100_loop (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global pbkdf2_sha512_tmp_t *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global pbkdf2_sha512_t *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u64 ipad[8]; + + ipad[0] = tmps[gid].ipad[0]; + ipad[1] = tmps[gid].ipad[1]; + ipad[2] = tmps[gid].ipad[2]; + ipad[3] = tmps[gid].ipad[3]; + ipad[4] = tmps[gid].ipad[4]; + ipad[5] = tmps[gid].ipad[5]; + ipad[6] = tmps[gid].ipad[6]; + ipad[7] = tmps[gid].ipad[7]; + + u64 opad[8]; + + opad[0] = tmps[gid].opad[0]; + opad[1] = tmps[gid].opad[1]; + opad[2] = tmps[gid].opad[2]; + opad[3] = tmps[gid].opad[3]; + opad[4] = tmps[gid].opad[4]; + opad[5] = tmps[gid].opad[5]; + opad[6] = tmps[gid].opad[6]; + opad[7] = tmps[gid].opad[7]; + + for (u32 i = 0; i < 8; i += 8) + { + u64 dgst[8]; + + dgst[0] = tmps[gid].dgst[i + 0]; + dgst[1] = tmps[gid].dgst[i + 1]; + dgst[2] = tmps[gid].dgst[i + 2]; + dgst[3] = tmps[gid].dgst[i + 3]; + dgst[4] = tmps[gid].dgst[i + 4]; + dgst[5] = tmps[gid].dgst[i + 5]; + dgst[6] = tmps[gid].dgst[i + 6]; + dgst[7] = tmps[gid].dgst[i + 7]; + + u64 out[8]; + + out[0] = tmps[gid].out[i + 0]; + out[1] = tmps[gid].out[i + 1]; + out[2] = tmps[gid].out[i + 2]; + out[3] = tmps[gid].out[i + 3]; + out[4] = tmps[gid].out[i + 4]; + out[5] = tmps[gid].out[i + 5]; + out[6] = tmps[gid].out[i + 6]; + out[7] = tmps[gid].out[i + 7]; + + for (u32 j = 0; j < loop_cnt; j++) + { + u64 w[16]; + + w[ 0] = dgst[0]; + w[ 1] = dgst[1]; + w[ 2] = dgst[2]; + w[ 3] = dgst[3]; + w[ 4] = dgst[4]; + w[ 5] = dgst[5]; + w[ 6] = dgst[6]; + w[ 7] = dgst[7]; + w[ 8] = 0x8000000000000000; + w[ 9] = 0; + w[10] = 0; + w[11] = 0; + w[12] = 0; + w[13] = 0; + w[14] = 0; + w[15] = (128 + 64) * 8; + + hmac_run (w, ipad, opad, dgst); + + out[0] ^= dgst[0]; + out[1] ^= dgst[1]; + out[2] ^= dgst[2]; + out[3] ^= dgst[3]; + out[4] ^= dgst[4]; + out[5] ^= dgst[5]; + out[6] ^= dgst[6]; + out[7] ^= dgst[7]; + } + + tmps[gid].dgst[i + 0] = dgst[0]; + tmps[gid].dgst[i + 1] = dgst[1]; + tmps[gid].dgst[i + 2] = dgst[2]; + tmps[gid].dgst[i + 3] = dgst[3]; + tmps[gid].dgst[i + 4] = dgst[4]; + tmps[gid].dgst[i + 5] = dgst[5]; + tmps[gid].dgst[i + 6] = dgst[6]; + tmps[gid].dgst[i + 7] = dgst[7]; + + tmps[gid].out[i + 0] = out[0]; + tmps[gid].out[i + 1] = out[1]; + tmps[gid].out[i + 2] = out[2]; + tmps[gid].out[i + 3] = out[3]; + tmps[gid].out[i + 4] = out[4]; + tmps[gid].out[i + 5] = out[5]; + tmps[gid].out[i + 6] = out[6]; + tmps[gid].out[i + 7] = out[7]; + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m07100_comp (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global pbkdf2_sha512_tmp_t *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global pbkdf2_sha512_t *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + const u32 lid = get_local_id (0); + + const u64x a = tmps[gid].out[0]; + const u64x b = tmps[gid].out[1]; + + const u32x r0 = l32_from_64 (a); + const u32x r1 = h32_from_64 (a); + const u32x r2 = l32_from_64 (b); + const u32x r3 = h32_from_64 (b); + + #define il_pos 0 + + #include VECT_COMPARE_M +} diff --git a/amd/m07300_a0.cl b/amd/m07300_a0.cl new file mode 100644 index 0000000000..a4dd48409a --- /dev/null +++ b/amd/m07300_a0.cl @@ -0,0 +1,628 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _SHA1_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW4 +#define VECT_SIZE1 +#endif + +#ifdef VLIW5 +#define VECT_SIZE1 +#endif + +#define DGST_R0 3 +#define DGST_R1 4 +#define DGST_R2 2 +#define DGST_R3 1 + +#include "include/kernel_functions.c" +#include "types_amd.c" +#include "common_amd.c" +#include "include/rp_gpu.h" +#include "rp_amd.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +static void sha1_transform (const u32x w0[4], const u32x w1[4], const u32x w2[4], const u32x w3[4], u32x digest[5]) +{ + u32x A = digest[0]; + u32x B = digest[1]; + u32x C = digest[2]; + u32x D = digest[3]; + u32x E = digest[4]; + + u32x w0_t = w0[0]; + u32x w1_t = w0[1]; + u32x w2_t = w0[2]; + u32x w3_t = w0[3]; + u32x w4_t = w1[0]; + u32x w5_t = w1[1]; + u32x w6_t = w1[2]; + u32x w7_t = w1[3]; + u32x w8_t = w2[0]; + u32x w9_t = w2[1]; + u32x wa_t = w2[2]; + u32x wb_t = w2[3]; + u32x wc_t = w3[0]; + u32x wd_t = w3[1]; + u32x we_t = w3[2]; + u32x wf_t = w3[3]; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, A, B, C, D, E, w0_t); + SHA1_STEP (SHA1_F0o, E, A, B, C, D, w1_t); + SHA1_STEP (SHA1_F0o, D, E, A, B, C, w2_t); + SHA1_STEP (SHA1_F0o, C, D, E, A, B, w3_t); + SHA1_STEP (SHA1_F0o, B, C, D, E, A, w4_t); + SHA1_STEP (SHA1_F0o, A, B, C, D, E, w5_t); + SHA1_STEP (SHA1_F0o, E, A, B, C, D, w6_t); + SHA1_STEP (SHA1_F0o, D, E, A, B, C, w7_t); + SHA1_STEP (SHA1_F0o, C, D, E, A, B, w8_t); + SHA1_STEP (SHA1_F0o, B, C, D, E, A, w9_t); + SHA1_STEP (SHA1_F0o, A, B, C, D, E, wa_t); + SHA1_STEP (SHA1_F0o, E, A, B, C, D, wb_t); + SHA1_STEP (SHA1_F0o, D, E, A, B, C, wc_t); + SHA1_STEP (SHA1_F0o, C, D, E, A, B, wd_t); + SHA1_STEP (SHA1_F0o, B, C, D, E, A, we_t); + SHA1_STEP (SHA1_F0o, A, B, C, D, E, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F0o, E, A, B, C, D, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F0o, D, E, A, B, C, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F0o, C, D, E, A, B, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F0o, B, C, D, E, A, w3_t); + + #undef K + #define K SHA1C01 + + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w7_t); + + #undef K + #define K SHA1C02 + + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, wb_t); + + #undef K + #define K SHA1C03 + + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, wf_t); + + digest[0] += A; + digest[1] += B; + digest[2] += C; + digest[3] += D; + digest[4] += E; +} + +static void hmac_sha1_pad (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], u32x ipad[5], u32x opad[5]) +{ + w0[0] = w0[0] ^ 0x36363636; + w0[1] = w0[1] ^ 0x36363636; + w0[2] = w0[2] ^ 0x36363636; + w0[3] = w0[3] ^ 0x36363636; + w1[0] = w1[0] ^ 0x36363636; + w1[1] = w1[1] ^ 0x36363636; + w1[2] = w1[2] ^ 0x36363636; + w1[3] = w1[3] ^ 0x36363636; + w2[0] = w2[0] ^ 0x36363636; + w2[1] = w2[1] ^ 0x36363636; + w2[2] = w2[2] ^ 0x36363636; + w2[3] = w2[3] ^ 0x36363636; + w3[0] = w3[0] ^ 0x36363636; + w3[1] = w3[1] ^ 0x36363636; + w3[2] = w3[2] ^ 0x36363636; + w3[3] = w3[3] ^ 0x36363636; + + ipad[0] = SHA1M_A; + ipad[1] = SHA1M_B; + ipad[2] = SHA1M_C; + ipad[3] = SHA1M_D; + ipad[4] = SHA1M_E; + + sha1_transform (w0, w1, w2, w3, ipad); + + w0[0] = w0[0] ^ 0x6a6a6a6a; + w0[1] = w0[1] ^ 0x6a6a6a6a; + w0[2] = w0[2] ^ 0x6a6a6a6a; + w0[3] = w0[3] ^ 0x6a6a6a6a; + w1[0] = w1[0] ^ 0x6a6a6a6a; + w1[1] = w1[1] ^ 0x6a6a6a6a; + w1[2] = w1[2] ^ 0x6a6a6a6a; + w1[3] = w1[3] ^ 0x6a6a6a6a; + w2[0] = w2[0] ^ 0x6a6a6a6a; + w2[1] = w2[1] ^ 0x6a6a6a6a; + w2[2] = w2[2] ^ 0x6a6a6a6a; + w2[3] = w2[3] ^ 0x6a6a6a6a; + w3[0] = w3[0] ^ 0x6a6a6a6a; + w3[1] = w3[1] ^ 0x6a6a6a6a; + w3[2] = w3[2] ^ 0x6a6a6a6a; + w3[3] = w3[3] ^ 0x6a6a6a6a; + + opad[0] = SHA1M_A; + opad[1] = SHA1M_B; + opad[2] = SHA1M_C; + opad[3] = SHA1M_D; + opad[4] = SHA1M_E; + + sha1_transform (w0, w1, w2, w3, opad); +} + +static void hmac_sha1_run (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], u32x ipad[5], u32x opad[5], u32x digest[5]) +{ + digest[0] = ipad[0]; + digest[1] = ipad[1]; + digest[2] = ipad[2]; + digest[3] = ipad[3]; + digest[4] = ipad[4]; + + sha1_transform (w0, w1, w2, w3, digest); + + w0[0] = digest[0]; + w0[1] = digest[1]; + w0[2] = digest[2]; + w0[3] = digest[3]; + w1[0] = digest[4]; + w1[1] = 0x80000000; + w1[2] = 0; + w1[3] = 0; + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = (64 + 20) * 8; + + digest[0] = opad[0]; + digest[1] = opad[1]; + digest[2] = opad[2]; + digest[3] = opad[3]; + digest[4] = opad[4]; + + sha1_transform (w0, w1, w2, w3, digest); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m07300_m04 (__global pw_t *pws, __global gpu_rule_t * rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global rakp_t *rakp_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + u32x pw_buf1[4]; + + pw_buf1[0] = pws[gid].i[ 4]; + pw_buf1[1] = pws[gid].i[ 5]; + pw_buf1[2] = pws[gid].i[ 6]; + pw_buf1[3] = pws[gid].i[ 7]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * salt + */ + + const u32 esalt_len = rakp_bufs[salt_pos].salt_len; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + + w0[0] = pw_buf0[0]; + w0[1] = pw_buf0[1]; + w0[2] = pw_buf0[2]; + w0[3] = pw_buf0[3]; + + u32x w1[4]; + + w1[0] = pw_buf1[0]; + w1[1] = pw_buf1[1]; + w1[2] = pw_buf1[2]; + w1[3] = pw_buf1[3]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 out_len = apply_rules (rules_buf[il_pos].cmds, w0, w1, pw_len); + + /** + * pads + */ + + u32x w0_t[4]; + + w0_t[0] = swap_workaround (w0[0]); + w0_t[1] = swap_workaround (w0[1]); + w0_t[2] = swap_workaround (w0[2]); + w0_t[3] = swap_workaround (w0[3]); + + u32x w1_t[4]; + + w1_t[0] = swap_workaround (w1[0]); + w1_t[1] = swap_workaround (w1[1]); + w1_t[2] = swap_workaround (w1[2]); + w1_t[3] = swap_workaround (w1[3]); + + u32x w2_t[4]; + + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + + u32x w3_t[4]; + + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = 0; + + u32x ipad[5]; + u32x opad[5]; + + hmac_sha1_pad (w0_t, w1_t, w2_t, w3_t, ipad, opad); + + int esalt_size = esalt_len; + + int esalt_left; + int esalt_off; + + for (esalt_left = esalt_size, esalt_off = 0; esalt_left >= 56; esalt_left -= 64, esalt_off += 16) + { + w0_t[0] = rakp_bufs[salt_pos].salt_buf[esalt_off + 0]; + w0_t[1] = rakp_bufs[salt_pos].salt_buf[esalt_off + 1]; + w0_t[2] = rakp_bufs[salt_pos].salt_buf[esalt_off + 2]; + w0_t[3] = rakp_bufs[salt_pos].salt_buf[esalt_off + 3]; + w1_t[0] = rakp_bufs[salt_pos].salt_buf[esalt_off + 4]; + w1_t[1] = rakp_bufs[salt_pos].salt_buf[esalt_off + 5]; + w1_t[2] = rakp_bufs[salt_pos].salt_buf[esalt_off + 6]; + w1_t[3] = rakp_bufs[salt_pos].salt_buf[esalt_off + 7]; + w2_t[0] = rakp_bufs[salt_pos].salt_buf[esalt_off + 8]; + w2_t[1] = rakp_bufs[salt_pos].salt_buf[esalt_off + 9]; + w2_t[2] = rakp_bufs[salt_pos].salt_buf[esalt_off + 10]; + w2_t[3] = rakp_bufs[salt_pos].salt_buf[esalt_off + 11]; + w3_t[0] = rakp_bufs[salt_pos].salt_buf[esalt_off + 12]; + w3_t[1] = rakp_bufs[salt_pos].salt_buf[esalt_off + 13]; + w3_t[2] = rakp_bufs[salt_pos].salt_buf[esalt_off + 14]; + w3_t[3] = rakp_bufs[salt_pos].salt_buf[esalt_off + 15]; + + sha1_transform (w0_t, w1_t, w2_t, w3_t, ipad); + } + + w0_t[0] = rakp_bufs[salt_pos].salt_buf[esalt_off + 0]; + w0_t[1] = rakp_bufs[salt_pos].salt_buf[esalt_off + 1]; + w0_t[2] = rakp_bufs[salt_pos].salt_buf[esalt_off + 2]; + w0_t[3] = rakp_bufs[salt_pos].salt_buf[esalt_off + 3]; + w1_t[0] = rakp_bufs[salt_pos].salt_buf[esalt_off + 4]; + w1_t[1] = rakp_bufs[salt_pos].salt_buf[esalt_off + 5]; + w1_t[2] = rakp_bufs[salt_pos].salt_buf[esalt_off + 6]; + w1_t[3] = rakp_bufs[salt_pos].salt_buf[esalt_off + 7]; + w2_t[0] = rakp_bufs[salt_pos].salt_buf[esalt_off + 8]; + w2_t[1] = rakp_bufs[salt_pos].salt_buf[esalt_off + 9]; + w2_t[2] = rakp_bufs[salt_pos].salt_buf[esalt_off + 10]; + w2_t[3] = rakp_bufs[salt_pos].salt_buf[esalt_off + 11]; + w3_t[0] = rakp_bufs[salt_pos].salt_buf[esalt_off + 12]; + w3_t[1] = rakp_bufs[salt_pos].salt_buf[esalt_off + 13]; + w3_t[2] = 0; + w3_t[3] = (64 + esalt_size) * 8; + + u32x digest[5]; + + hmac_sha1_run (w0_t, w1_t, w2_t, w3_t, ipad, opad, digest); + + const u32x r0 = digest[3]; + const u32x r1 = digest[4]; + const u32x r2 = digest[2]; + const u32x r3 = digest[1]; + + #include VECT_COMPARE_M + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m07300_m08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global rakp_t *rakp_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m07300_m16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global rakp_t *rakp_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m07300_s04 (__global pw_t *pws, __global gpu_rule_t * rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global rakp_t *rakp_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + u32x pw_buf1[4]; + + pw_buf1[0] = pws[gid].i[ 4]; + pw_buf1[1] = pws[gid].i[ 5]; + pw_buf1[2] = pws[gid].i[ 6]; + pw_buf1[3] = pws[gid].i[ 7]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * salt + */ + + const u32 esalt_len = rakp_bufs[salt_pos].salt_len; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + + w0[0] = pw_buf0[0]; + w0[1] = pw_buf0[1]; + w0[2] = pw_buf0[2]; + w0[3] = pw_buf0[3]; + + u32x w1[4]; + + w1[0] = pw_buf1[0]; + w1[1] = pw_buf1[1]; + w1[2] = pw_buf1[2]; + w1[3] = pw_buf1[3]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 out_len = apply_rules (rules_buf[il_pos].cmds, w0, w1, pw_len); + + /** + * pads + */ + + u32x w0_t[4]; + + w0_t[0] = swap_workaround (w0[0]); + w0_t[1] = swap_workaround (w0[1]); + w0_t[2] = swap_workaround (w0[2]); + w0_t[3] = swap_workaround (w0[3]); + + u32x w1_t[4]; + + w1_t[0] = swap_workaround (w1[0]); + w1_t[1] = swap_workaround (w1[1]); + w1_t[2] = swap_workaround (w1[2]); + w1_t[3] = swap_workaround (w1[3]); + + u32x w2_t[4]; + + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + + u32x w3_t[4]; + + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = 0; + + u32x ipad[5]; + u32x opad[5]; + + hmac_sha1_pad (w0_t, w1_t, w2_t, w3_t, ipad, opad); + + int esalt_size = esalt_len; + + int esalt_left; + int esalt_off; + + for (esalt_left = esalt_size, esalt_off = 0; esalt_left >= 56; esalt_left -= 64, esalt_off += 16) + { + w0_t[0] = rakp_bufs[salt_pos].salt_buf[esalt_off + 0]; + w0_t[1] = rakp_bufs[salt_pos].salt_buf[esalt_off + 1]; + w0_t[2] = rakp_bufs[salt_pos].salt_buf[esalt_off + 2]; + w0_t[3] = rakp_bufs[salt_pos].salt_buf[esalt_off + 3]; + w1_t[0] = rakp_bufs[salt_pos].salt_buf[esalt_off + 4]; + w1_t[1] = rakp_bufs[salt_pos].salt_buf[esalt_off + 5]; + w1_t[2] = rakp_bufs[salt_pos].salt_buf[esalt_off + 6]; + w1_t[3] = rakp_bufs[salt_pos].salt_buf[esalt_off + 7]; + w2_t[0] = rakp_bufs[salt_pos].salt_buf[esalt_off + 8]; + w2_t[1] = rakp_bufs[salt_pos].salt_buf[esalt_off + 9]; + w2_t[2] = rakp_bufs[salt_pos].salt_buf[esalt_off + 10]; + w2_t[3] = rakp_bufs[salt_pos].salt_buf[esalt_off + 11]; + w3_t[0] = rakp_bufs[salt_pos].salt_buf[esalt_off + 12]; + w3_t[1] = rakp_bufs[salt_pos].salt_buf[esalt_off + 13]; + w3_t[2] = rakp_bufs[salt_pos].salt_buf[esalt_off + 14]; + w3_t[3] = rakp_bufs[salt_pos].salt_buf[esalt_off + 15]; + + sha1_transform (w0_t, w1_t, w2_t, w3_t, ipad); + } + + w0_t[0] = rakp_bufs[salt_pos].salt_buf[esalt_off + 0]; + w0_t[1] = rakp_bufs[salt_pos].salt_buf[esalt_off + 1]; + w0_t[2] = rakp_bufs[salt_pos].salt_buf[esalt_off + 2]; + w0_t[3] = rakp_bufs[salt_pos].salt_buf[esalt_off + 3]; + w1_t[0] = rakp_bufs[salt_pos].salt_buf[esalt_off + 4]; + w1_t[1] = rakp_bufs[salt_pos].salt_buf[esalt_off + 5]; + w1_t[2] = rakp_bufs[salt_pos].salt_buf[esalt_off + 6]; + w1_t[3] = rakp_bufs[salt_pos].salt_buf[esalt_off + 7]; + w2_t[0] = rakp_bufs[salt_pos].salt_buf[esalt_off + 8]; + w2_t[1] = rakp_bufs[salt_pos].salt_buf[esalt_off + 9]; + w2_t[2] = rakp_bufs[salt_pos].salt_buf[esalt_off + 10]; + w2_t[3] = rakp_bufs[salt_pos].salt_buf[esalt_off + 11]; + w3_t[0] = rakp_bufs[salt_pos].salt_buf[esalt_off + 12]; + w3_t[1] = rakp_bufs[salt_pos].salt_buf[esalt_off + 13]; + w3_t[2] = 0; + w3_t[3] = (64 + esalt_size) * 8; + + u32x digest[5]; + + hmac_sha1_run (w0_t, w1_t, w2_t, w3_t, ipad, opad, digest); + + const u32x r0 = digest[3]; + const u32x r1 = digest[4]; + const u32x r2 = digest[2]; + const u32x r3 = digest[1]; + + #include VECT_COMPARE_S + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m07300_s08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global rakp_t *rakp_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m07300_s16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global rakp_t *rakp_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/amd/m07300_a1.cl b/amd/m07300_a1.cl new file mode 100644 index 0000000000..f7a6501b07 --- /dev/null +++ b/amd/m07300_a1.cl @@ -0,0 +1,734 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _SHA1_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW4 +#define VECT_SIZE1 +#endif + +#ifdef VLIW5 +#define VECT_SIZE1 +#endif + +#define DGST_R0 3 +#define DGST_R1 4 +#define DGST_R2 2 +#define DGST_R3 1 + +#include "include/kernel_functions.c" +#include "types_amd.c" +#include "common_amd.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +static void sha1_transform (const u32x w0[4], const u32x w1[4], const u32x w2[4], const u32x w3[4], u32x digest[5]) +{ + u32x A = digest[0]; + u32x B = digest[1]; + u32x C = digest[2]; + u32x D = digest[3]; + u32x E = digest[4]; + + u32x w0_t = w0[0]; + u32x w1_t = w0[1]; + u32x w2_t = w0[2]; + u32x w3_t = w0[3]; + u32x w4_t = w1[0]; + u32x w5_t = w1[1]; + u32x w6_t = w1[2]; + u32x w7_t = w1[3]; + u32x w8_t = w2[0]; + u32x w9_t = w2[1]; + u32x wa_t = w2[2]; + u32x wb_t = w2[3]; + u32x wc_t = w3[0]; + u32x wd_t = w3[1]; + u32x we_t = w3[2]; + u32x wf_t = w3[3]; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, A, B, C, D, E, w0_t); + SHA1_STEP (SHA1_F0o, E, A, B, C, D, w1_t); + SHA1_STEP (SHA1_F0o, D, E, A, B, C, w2_t); + SHA1_STEP (SHA1_F0o, C, D, E, A, B, w3_t); + SHA1_STEP (SHA1_F0o, B, C, D, E, A, w4_t); + SHA1_STEP (SHA1_F0o, A, B, C, D, E, w5_t); + SHA1_STEP (SHA1_F0o, E, A, B, C, D, w6_t); + SHA1_STEP (SHA1_F0o, D, E, A, B, C, w7_t); + SHA1_STEP (SHA1_F0o, C, D, E, A, B, w8_t); + SHA1_STEP (SHA1_F0o, B, C, D, E, A, w9_t); + SHA1_STEP (SHA1_F0o, A, B, C, D, E, wa_t); + SHA1_STEP (SHA1_F0o, E, A, B, C, D, wb_t); + SHA1_STEP (SHA1_F0o, D, E, A, B, C, wc_t); + SHA1_STEP (SHA1_F0o, C, D, E, A, B, wd_t); + SHA1_STEP (SHA1_F0o, B, C, D, E, A, we_t); + SHA1_STEP (SHA1_F0o, A, B, C, D, E, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F0o, E, A, B, C, D, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F0o, D, E, A, B, C, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F0o, C, D, E, A, B, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F0o, B, C, D, E, A, w3_t); + + #undef K + #define K SHA1C01 + + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w7_t); + + #undef K + #define K SHA1C02 + + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, wb_t); + + #undef K + #define K SHA1C03 + + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, wf_t); + + digest[0] += A; + digest[1] += B; + digest[2] += C; + digest[3] += D; + digest[4] += E; +} + +static void hmac_sha1_pad (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], u32x ipad[5], u32x opad[5]) +{ + w0[0] = w0[0] ^ 0x36363636; + w0[1] = w0[1] ^ 0x36363636; + w0[2] = w0[2] ^ 0x36363636; + w0[3] = w0[3] ^ 0x36363636; + w1[0] = w1[0] ^ 0x36363636; + w1[1] = w1[1] ^ 0x36363636; + w1[2] = w1[2] ^ 0x36363636; + w1[3] = w1[3] ^ 0x36363636; + w2[0] = w2[0] ^ 0x36363636; + w2[1] = w2[1] ^ 0x36363636; + w2[2] = w2[2] ^ 0x36363636; + w2[3] = w2[3] ^ 0x36363636; + w3[0] = w3[0] ^ 0x36363636; + w3[1] = w3[1] ^ 0x36363636; + w3[2] = w3[2] ^ 0x36363636; + w3[3] = w3[3] ^ 0x36363636; + + ipad[0] = SHA1M_A; + ipad[1] = SHA1M_B; + ipad[2] = SHA1M_C; + ipad[3] = SHA1M_D; + ipad[4] = SHA1M_E; + + sha1_transform (w0, w1, w2, w3, ipad); + + w0[0] = w0[0] ^ 0x6a6a6a6a; + w0[1] = w0[1] ^ 0x6a6a6a6a; + w0[2] = w0[2] ^ 0x6a6a6a6a; + w0[3] = w0[3] ^ 0x6a6a6a6a; + w1[0] = w1[0] ^ 0x6a6a6a6a; + w1[1] = w1[1] ^ 0x6a6a6a6a; + w1[2] = w1[2] ^ 0x6a6a6a6a; + w1[3] = w1[3] ^ 0x6a6a6a6a; + w2[0] = w2[0] ^ 0x6a6a6a6a; + w2[1] = w2[1] ^ 0x6a6a6a6a; + w2[2] = w2[2] ^ 0x6a6a6a6a; + w2[3] = w2[3] ^ 0x6a6a6a6a; + w3[0] = w3[0] ^ 0x6a6a6a6a; + w3[1] = w3[1] ^ 0x6a6a6a6a; + w3[2] = w3[2] ^ 0x6a6a6a6a; + w3[3] = w3[3] ^ 0x6a6a6a6a; + + opad[0] = SHA1M_A; + opad[1] = SHA1M_B; + opad[2] = SHA1M_C; + opad[3] = SHA1M_D; + opad[4] = SHA1M_E; + + sha1_transform (w0, w1, w2, w3, opad); +} + +static void hmac_sha1_run (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], u32x ipad[5], u32x opad[5], u32x digest[5]) +{ + digest[0] = ipad[0]; + digest[1] = ipad[1]; + digest[2] = ipad[2]; + digest[3] = ipad[3]; + digest[4] = ipad[4]; + + sha1_transform (w0, w1, w2, w3, digest); + + w0[0] = digest[0]; + w0[1] = digest[1]; + w0[2] = digest[2]; + w0[3] = digest[3]; + w1[0] = digest[4]; + w1[1] = 0x80000000; + w1[2] = 0; + w1[3] = 0; + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = (64 + 20) * 8; + + digest[0] = opad[0]; + digest[1] = opad[1]; + digest[2] = opad[2]; + digest[3] = opad[3]; + digest[4] = opad[4]; + + sha1_transform (w0, w1, w2, w3, digest); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m07300_m04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global rakp_t *rakp_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, combs_buf[0].pw_len); + } + + /** + * salt + */ + + const u32 esalt_len = rakp_bufs[salt_pos].salt_len; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = combs_buf[il_pos].pw_len; + + const u32 pw_len = pw_l_len + pw_r_len; + + u32 wordr0[4]; + + wordr0[0] = combs_buf[il_pos].i[0]; + wordr0[1] = combs_buf[il_pos].i[1]; + wordr0[2] = combs_buf[il_pos].i[2]; + wordr0[3] = combs_buf[il_pos].i[3]; + + u32 wordr1[4]; + + wordr1[0] = combs_buf[il_pos].i[4]; + wordr1[1] = combs_buf[il_pos].i[5]; + wordr1[2] = combs_buf[il_pos].i[6]; + wordr1[3] = combs_buf[il_pos].i[7]; + + u32 wordr2[4]; + + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + + u32 wordr3[4]; + + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + u32x w0[4]; + + w0[0] = wordl0[0] | wordr0[0]; + w0[1] = wordl0[1] | wordr0[1]; + w0[2] = wordl0[2] | wordr0[2]; + w0[3] = wordl0[3] | wordr0[3]; + + u32x w1[4]; + + w1[0] = wordl1[0] | wordr1[0]; + w1[1] = wordl1[1] | wordr1[1]; + w1[2] = wordl1[2] | wordr1[2]; + w1[3] = wordl1[3] | wordr1[3]; + + u32x w2[4]; + + w2[0] = wordl2[0] | wordr2[0]; + w2[1] = wordl2[1] | wordr2[1]; + w2[2] = wordl2[2] | wordr2[2]; + w2[3] = wordl2[3] | wordr2[3]; + + u32x w3[4]; + + w3[0] = wordl3[0] | wordr3[0]; + w3[1] = wordl3[1] | wordr3[1]; + w3[2] = wordl3[2] | wordr3[2]; + w3[3] = wordl3[3] | wordr3[3]; + + /** + * pads + */ + + u32x w0_t[4]; + + w0_t[0] = swap_workaround (w0[0]); + w0_t[1] = swap_workaround (w0[1]); + w0_t[2] = swap_workaround (w0[2]); + w0_t[3] = swap_workaround (w0[3]); + + u32x w1_t[4]; + + w1_t[0] = swap_workaround (w1[0]); + w1_t[1] = swap_workaround (w1[1]); + w1_t[2] = swap_workaround (w1[2]); + w1_t[3] = swap_workaround (w1[3]); + + u32x w2_t[4]; + + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + + u32x w3_t[4]; + + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = 0; + + u32x ipad[5]; + u32x opad[5]; + + hmac_sha1_pad (w0_t, w1_t, w2_t, w3_t, ipad, opad); + + int esalt_size = esalt_len; + + int esalt_left; + int esalt_off; + + for (esalt_left = esalt_size, esalt_off = 0; esalt_left >= 56; esalt_left -= 64, esalt_off += 16) + { + w0_t[0] = rakp_bufs[salt_pos].salt_buf[esalt_off + 0]; + w0_t[1] = rakp_bufs[salt_pos].salt_buf[esalt_off + 1]; + w0_t[2] = rakp_bufs[salt_pos].salt_buf[esalt_off + 2]; + w0_t[3] = rakp_bufs[salt_pos].salt_buf[esalt_off + 3]; + w1_t[0] = rakp_bufs[salt_pos].salt_buf[esalt_off + 4]; + w1_t[1] = rakp_bufs[salt_pos].salt_buf[esalt_off + 5]; + w1_t[2] = rakp_bufs[salt_pos].salt_buf[esalt_off + 6]; + w1_t[3] = rakp_bufs[salt_pos].salt_buf[esalt_off + 7]; + w2_t[0] = rakp_bufs[salt_pos].salt_buf[esalt_off + 8]; + w2_t[1] = rakp_bufs[salt_pos].salt_buf[esalt_off + 9]; + w2_t[2] = rakp_bufs[salt_pos].salt_buf[esalt_off + 10]; + w2_t[3] = rakp_bufs[salt_pos].salt_buf[esalt_off + 11]; + w3_t[0] = rakp_bufs[salt_pos].salt_buf[esalt_off + 12]; + w3_t[1] = rakp_bufs[salt_pos].salt_buf[esalt_off + 13]; + w3_t[2] = rakp_bufs[salt_pos].salt_buf[esalt_off + 14]; + w3_t[3] = rakp_bufs[salt_pos].salt_buf[esalt_off + 15]; + + sha1_transform (w0_t, w1_t, w2_t, w3_t, ipad); + } + + w0_t[0] = rakp_bufs[salt_pos].salt_buf[esalt_off + 0]; + w0_t[1] = rakp_bufs[salt_pos].salt_buf[esalt_off + 1]; + w0_t[2] = rakp_bufs[salt_pos].salt_buf[esalt_off + 2]; + w0_t[3] = rakp_bufs[salt_pos].salt_buf[esalt_off + 3]; + w1_t[0] = rakp_bufs[salt_pos].salt_buf[esalt_off + 4]; + w1_t[1] = rakp_bufs[salt_pos].salt_buf[esalt_off + 5]; + w1_t[2] = rakp_bufs[salt_pos].salt_buf[esalt_off + 6]; + w1_t[3] = rakp_bufs[salt_pos].salt_buf[esalt_off + 7]; + w2_t[0] = rakp_bufs[salt_pos].salt_buf[esalt_off + 8]; + w2_t[1] = rakp_bufs[salt_pos].salt_buf[esalt_off + 9]; + w2_t[2] = rakp_bufs[salt_pos].salt_buf[esalt_off + 10]; + w2_t[3] = rakp_bufs[salt_pos].salt_buf[esalt_off + 11]; + w3_t[0] = rakp_bufs[salt_pos].salt_buf[esalt_off + 12]; + w3_t[1] = rakp_bufs[salt_pos].salt_buf[esalt_off + 13]; + w3_t[2] = 0; + w3_t[3] = (64 + esalt_size) * 8; + + u32x digest[5]; + + hmac_sha1_run (w0_t, w1_t, w2_t, w3_t, ipad, opad, digest); + + const u32x r0 = digest[3]; + const u32x r1 = digest[4]; + const u32x r2 = digest[2]; + const u32x r3 = digest[1]; + + #include VECT_COMPARE_M + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m07300_m08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global rakp_t *rakp_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m07300_m16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global rakp_t *rakp_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m07300_s04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global rakp_t *rakp_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, combs_buf[0].pw_len); + } + + /** + * salt + */ + + const u32 esalt_len = rakp_bufs[salt_pos].salt_len; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = combs_buf[il_pos].pw_len; + + const u32 pw_len = pw_l_len + pw_r_len; + + u32 wordr0[4]; + + wordr0[0] = combs_buf[il_pos].i[0]; + wordr0[1] = combs_buf[il_pos].i[1]; + wordr0[2] = combs_buf[il_pos].i[2]; + wordr0[3] = combs_buf[il_pos].i[3]; + + u32 wordr1[4]; + + wordr1[0] = combs_buf[il_pos].i[4]; + wordr1[1] = combs_buf[il_pos].i[5]; + wordr1[2] = combs_buf[il_pos].i[6]; + wordr1[3] = combs_buf[il_pos].i[7]; + + u32 wordr2[4]; + + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + + u32 wordr3[4]; + + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + u32x w0[4]; + + w0[0] = wordl0[0] | wordr0[0]; + w0[1] = wordl0[1] | wordr0[1]; + w0[2] = wordl0[2] | wordr0[2]; + w0[3] = wordl0[3] | wordr0[3]; + + u32x w1[4]; + + w1[0] = wordl1[0] | wordr1[0]; + w1[1] = wordl1[1] | wordr1[1]; + w1[2] = wordl1[2] | wordr1[2]; + w1[3] = wordl1[3] | wordr1[3]; + + u32x w2[4]; + + w2[0] = wordl2[0] | wordr2[0]; + w2[1] = wordl2[1] | wordr2[1]; + w2[2] = wordl2[2] | wordr2[2]; + w2[3] = wordl2[3] | wordr2[3]; + + u32x w3[4]; + + w3[0] = wordl3[0] | wordr3[0]; + w3[1] = wordl3[1] | wordr3[1]; + w3[2] = wordl3[2] | wordr3[2]; + w3[3] = wordl3[3] | wordr3[3]; + + /** + * pads + */ + + u32x w0_t[4]; + + w0_t[0] = swap_workaround (w0[0]); + w0_t[1] = swap_workaround (w0[1]); + w0_t[2] = swap_workaround (w0[2]); + w0_t[3] = swap_workaround (w0[3]); + + u32x w1_t[4]; + + w1_t[0] = swap_workaround (w1[0]); + w1_t[1] = swap_workaround (w1[1]); + w1_t[2] = swap_workaround (w1[2]); + w1_t[3] = swap_workaround (w1[3]); + + u32x w2_t[4]; + + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + + u32x w3_t[4]; + + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = 0; + + u32x ipad[5]; + u32x opad[5]; + + hmac_sha1_pad (w0_t, w1_t, w2_t, w3_t, ipad, opad); + + int esalt_size = esalt_len; + + int esalt_left; + int esalt_off; + + for (esalt_left = esalt_size, esalt_off = 0; esalt_left >= 56; esalt_left -= 64, esalt_off += 16) + { + w0_t[0] = rakp_bufs[salt_pos].salt_buf[esalt_off + 0]; + w0_t[1] = rakp_bufs[salt_pos].salt_buf[esalt_off + 1]; + w0_t[2] = rakp_bufs[salt_pos].salt_buf[esalt_off + 2]; + w0_t[3] = rakp_bufs[salt_pos].salt_buf[esalt_off + 3]; + w1_t[0] = rakp_bufs[salt_pos].salt_buf[esalt_off + 4]; + w1_t[1] = rakp_bufs[salt_pos].salt_buf[esalt_off + 5]; + w1_t[2] = rakp_bufs[salt_pos].salt_buf[esalt_off + 6]; + w1_t[3] = rakp_bufs[salt_pos].salt_buf[esalt_off + 7]; + w2_t[0] = rakp_bufs[salt_pos].salt_buf[esalt_off + 8]; + w2_t[1] = rakp_bufs[salt_pos].salt_buf[esalt_off + 9]; + w2_t[2] = rakp_bufs[salt_pos].salt_buf[esalt_off + 10]; + w2_t[3] = rakp_bufs[salt_pos].salt_buf[esalt_off + 11]; + w3_t[0] = rakp_bufs[salt_pos].salt_buf[esalt_off + 12]; + w3_t[1] = rakp_bufs[salt_pos].salt_buf[esalt_off + 13]; + w3_t[2] = rakp_bufs[salt_pos].salt_buf[esalt_off + 14]; + w3_t[3] = rakp_bufs[salt_pos].salt_buf[esalt_off + 15]; + + sha1_transform (w0_t, w1_t, w2_t, w3_t, ipad); + } + + w0_t[0] = rakp_bufs[salt_pos].salt_buf[esalt_off + 0]; + w0_t[1] = rakp_bufs[salt_pos].salt_buf[esalt_off + 1]; + w0_t[2] = rakp_bufs[salt_pos].salt_buf[esalt_off + 2]; + w0_t[3] = rakp_bufs[salt_pos].salt_buf[esalt_off + 3]; + w1_t[0] = rakp_bufs[salt_pos].salt_buf[esalt_off + 4]; + w1_t[1] = rakp_bufs[salt_pos].salt_buf[esalt_off + 5]; + w1_t[2] = rakp_bufs[salt_pos].salt_buf[esalt_off + 6]; + w1_t[3] = rakp_bufs[salt_pos].salt_buf[esalt_off + 7]; + w2_t[0] = rakp_bufs[salt_pos].salt_buf[esalt_off + 8]; + w2_t[1] = rakp_bufs[salt_pos].salt_buf[esalt_off + 9]; + w2_t[2] = rakp_bufs[salt_pos].salt_buf[esalt_off + 10]; + w2_t[3] = rakp_bufs[salt_pos].salt_buf[esalt_off + 11]; + w3_t[0] = rakp_bufs[salt_pos].salt_buf[esalt_off + 12]; + w3_t[1] = rakp_bufs[salt_pos].salt_buf[esalt_off + 13]; + w3_t[2] = 0; + w3_t[3] = (64 + esalt_size) * 8; + + u32x digest[5]; + + hmac_sha1_run (w0_t, w1_t, w2_t, w3_t, ipad, opad, digest); + + const u32x r0 = digest[3]; + const u32x r1 = digest[4]; + const u32x r2 = digest[2]; + const u32x r3 = digest[1]; + + #include VECT_COMPARE_S + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m07300_s08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global rakp_t *rakp_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m07300_s16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global rakp_t *rakp_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/amd/m07300_a3.cl b/amd/m07300_a3.cl new file mode 100644 index 0000000000..6b408b27fb --- /dev/null +++ b/amd/m07300_a3.cl @@ -0,0 +1,790 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _SHA1_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW4 +#define VECT_SIZE1 +#endif + +#ifdef VLIW5 +#define VECT_SIZE1 +#endif + +#define DGST_R0 3 +#define DGST_R1 4 +#define DGST_R2 2 +#define DGST_R3 1 + +#include "include/kernel_functions.c" +#include "types_amd.c" +#include "common_amd.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +static void sha1_transform (const u32x w0[4], const u32x w1[4], const u32x w2[4], const u32x w3[4], u32x digest[5]) +{ + u32x A = digest[0]; + u32x B = digest[1]; + u32x C = digest[2]; + u32x D = digest[3]; + u32x E = digest[4]; + + u32x w0_t = w0[0]; + u32x w1_t = w0[1]; + u32x w2_t = w0[2]; + u32x w3_t = w0[3]; + u32x w4_t = w1[0]; + u32x w5_t = w1[1]; + u32x w6_t = w1[2]; + u32x w7_t = w1[3]; + u32x w8_t = w2[0]; + u32x w9_t = w2[1]; + u32x wa_t = w2[2]; + u32x wb_t = w2[3]; + u32x wc_t = w3[0]; + u32x wd_t = w3[1]; + u32x we_t = w3[2]; + u32x wf_t = w3[3]; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, A, B, C, D, E, w0_t); + SHA1_STEP (SHA1_F0o, E, A, B, C, D, w1_t); + SHA1_STEP (SHA1_F0o, D, E, A, B, C, w2_t); + SHA1_STEP (SHA1_F0o, C, D, E, A, B, w3_t); + SHA1_STEP (SHA1_F0o, B, C, D, E, A, w4_t); + SHA1_STEP (SHA1_F0o, A, B, C, D, E, w5_t); + SHA1_STEP (SHA1_F0o, E, A, B, C, D, w6_t); + SHA1_STEP (SHA1_F0o, D, E, A, B, C, w7_t); + SHA1_STEP (SHA1_F0o, C, D, E, A, B, w8_t); + SHA1_STEP (SHA1_F0o, B, C, D, E, A, w9_t); + SHA1_STEP (SHA1_F0o, A, B, C, D, E, wa_t); + SHA1_STEP (SHA1_F0o, E, A, B, C, D, wb_t); + SHA1_STEP (SHA1_F0o, D, E, A, B, C, wc_t); + SHA1_STEP (SHA1_F0o, C, D, E, A, B, wd_t); + SHA1_STEP (SHA1_F0o, B, C, D, E, A, we_t); + SHA1_STEP (SHA1_F0o, A, B, C, D, E, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F0o, E, A, B, C, D, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F0o, D, E, A, B, C, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F0o, C, D, E, A, B, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F0o, B, C, D, E, A, w3_t); + + #undef K + #define K SHA1C01 + + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w7_t); + + #undef K + #define K SHA1C02 + + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, wb_t); + + #undef K + #define K SHA1C03 + + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, wf_t); + + digest[0] += A; + digest[1] += B; + digest[2] += C; + digest[3] += D; + digest[4] += E; +} + +static void hmac_sha1_pad (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], u32x ipad[5], u32x opad[5]) +{ + w0[0] = w0[0] ^ 0x36363636; + w0[1] = w0[1] ^ 0x36363636; + w0[2] = w0[2] ^ 0x36363636; + w0[3] = w0[3] ^ 0x36363636; + w1[0] = w1[0] ^ 0x36363636; + w1[1] = w1[1] ^ 0x36363636; + w1[2] = w1[2] ^ 0x36363636; + w1[3] = w1[3] ^ 0x36363636; + w2[0] = w2[0] ^ 0x36363636; + w2[1] = w2[1] ^ 0x36363636; + w2[2] = w2[2] ^ 0x36363636; + w2[3] = w2[3] ^ 0x36363636; + w3[0] = w3[0] ^ 0x36363636; + w3[1] = w3[1] ^ 0x36363636; + w3[2] = w3[2] ^ 0x36363636; + w3[3] = w3[3] ^ 0x36363636; + + ipad[0] = SHA1M_A; + ipad[1] = SHA1M_B; + ipad[2] = SHA1M_C; + ipad[3] = SHA1M_D; + ipad[4] = SHA1M_E; + + sha1_transform (w0, w1, w2, w3, ipad); + + w0[0] = w0[0] ^ 0x6a6a6a6a; + w0[1] = w0[1] ^ 0x6a6a6a6a; + w0[2] = w0[2] ^ 0x6a6a6a6a; + w0[3] = w0[3] ^ 0x6a6a6a6a; + w1[0] = w1[0] ^ 0x6a6a6a6a; + w1[1] = w1[1] ^ 0x6a6a6a6a; + w1[2] = w1[2] ^ 0x6a6a6a6a; + w1[3] = w1[3] ^ 0x6a6a6a6a; + w2[0] = w2[0] ^ 0x6a6a6a6a; + w2[1] = w2[1] ^ 0x6a6a6a6a; + w2[2] = w2[2] ^ 0x6a6a6a6a; + w2[3] = w2[3] ^ 0x6a6a6a6a; + w3[0] = w3[0] ^ 0x6a6a6a6a; + w3[1] = w3[1] ^ 0x6a6a6a6a; + w3[2] = w3[2] ^ 0x6a6a6a6a; + w3[3] = w3[3] ^ 0x6a6a6a6a; + + opad[0] = SHA1M_A; + opad[1] = SHA1M_B; + opad[2] = SHA1M_C; + opad[3] = SHA1M_D; + opad[4] = SHA1M_E; + + sha1_transform (w0, w1, w2, w3, opad); +} + +static void hmac_sha1_run (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], u32x ipad[5], u32x opad[5], u32x digest[5]) +{ + digest[0] = ipad[0]; + digest[1] = ipad[1]; + digest[2] = ipad[2]; + digest[3] = ipad[3]; + digest[4] = ipad[4]; + + sha1_transform (w0, w1, w2, w3, digest); + + w0[0] = digest[0]; + w0[1] = digest[1]; + w0[2] = digest[2]; + w0[3] = digest[3]; + w1[0] = digest[4]; + w1[1] = 0x80000000; + w1[2] = 0; + w1[3] = 0; + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = (64 + 20) * 8; + + digest[0] = opad[0]; + digest[1] = opad[1]; + digest[2] = opad[2]; + digest[3] = opad[3]; + digest[4] = opad[4]; + + sha1_transform (w0, w1, w2, w3, digest); +} + +static void m07300m (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], const u32 pw_len, __global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global rakp_t *rakp_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset) +{ + /** + * modifier + */ + + const u32 gid = get_global_id (0); + const u32 lid = get_local_id (0); + + const u32 esalt_len = rakp_bufs[salt_pos].salt_len; + + /** + * loop + */ + + u32x w0l = w0[0]; + + for (u32 il_pos = 0; il_pos < bfs_cnt; il_pos++) + { + const u32 w0r = bfs_buf[il_pos].i; + + w0[0] = w0l | w0r; + + /** + * pads + */ + + u32x w0_t[4]; + + w0_t[0] = w0[0]; + w0_t[1] = w0[1]; + w0_t[2] = w0[2]; + w0_t[3] = w0[3]; + + u32x w1_t[4]; + + w1_t[0] = w1[0]; + w1_t[1] = w1[1]; + w1_t[2] = w1[2]; + w1_t[3] = w1[3]; + + u32x w2_t[4]; + + w2_t[0] = w2[0]; + w2_t[1] = w2[1]; + w2_t[2] = w2[2]; + w2_t[3] = w2[3]; + + u32x w3_t[4]; + + w3_t[0] = w3[0]; + w3_t[1] = w3[1]; + w3_t[2] = 0; + w3_t[3] = 0; + + u32x ipad[5]; + u32x opad[5]; + + hmac_sha1_pad (w0_t, w1_t, w2_t, w3_t, ipad, opad); + + int esalt_size = esalt_len; + + int esalt_left; + int esalt_off; + + for (esalt_left = esalt_size, esalt_off = 0; esalt_left >= 56; esalt_left -= 64, esalt_off += 16) + { + w0_t[0] = rakp_bufs[salt_pos].salt_buf[esalt_off + 0]; + w0_t[1] = rakp_bufs[salt_pos].salt_buf[esalt_off + 1]; + w0_t[2] = rakp_bufs[salt_pos].salt_buf[esalt_off + 2]; + w0_t[3] = rakp_bufs[salt_pos].salt_buf[esalt_off + 3]; + w1_t[0] = rakp_bufs[salt_pos].salt_buf[esalt_off + 4]; + w1_t[1] = rakp_bufs[salt_pos].salt_buf[esalt_off + 5]; + w1_t[2] = rakp_bufs[salt_pos].salt_buf[esalt_off + 6]; + w1_t[3] = rakp_bufs[salt_pos].salt_buf[esalt_off + 7]; + w2_t[0] = rakp_bufs[salt_pos].salt_buf[esalt_off + 8]; + w2_t[1] = rakp_bufs[salt_pos].salt_buf[esalt_off + 9]; + w2_t[2] = rakp_bufs[salt_pos].salt_buf[esalt_off + 10]; + w2_t[3] = rakp_bufs[salt_pos].salt_buf[esalt_off + 11]; + w3_t[0] = rakp_bufs[salt_pos].salt_buf[esalt_off + 12]; + w3_t[1] = rakp_bufs[salt_pos].salt_buf[esalt_off + 13]; + w3_t[2] = rakp_bufs[salt_pos].salt_buf[esalt_off + 14]; + w3_t[3] = rakp_bufs[salt_pos].salt_buf[esalt_off + 15]; + + sha1_transform (w0_t, w1_t, w2_t, w3_t, ipad); + } + + w0_t[0] = rakp_bufs[salt_pos].salt_buf[esalt_off + 0]; + w0_t[1] = rakp_bufs[salt_pos].salt_buf[esalt_off + 1]; + w0_t[2] = rakp_bufs[salt_pos].salt_buf[esalt_off + 2]; + w0_t[3] = rakp_bufs[salt_pos].salt_buf[esalt_off + 3]; + w1_t[0] = rakp_bufs[salt_pos].salt_buf[esalt_off + 4]; + w1_t[1] = rakp_bufs[salt_pos].salt_buf[esalt_off + 5]; + w1_t[2] = rakp_bufs[salt_pos].salt_buf[esalt_off + 6]; + w1_t[3] = rakp_bufs[salt_pos].salt_buf[esalt_off + 7]; + w2_t[0] = rakp_bufs[salt_pos].salt_buf[esalt_off + 8]; + w2_t[1] = rakp_bufs[salt_pos].salt_buf[esalt_off + 9]; + w2_t[2] = rakp_bufs[salt_pos].salt_buf[esalt_off + 10]; + w2_t[3] = rakp_bufs[salt_pos].salt_buf[esalt_off + 11]; + w3_t[0] = rakp_bufs[salt_pos].salt_buf[esalt_off + 12]; + w3_t[1] = rakp_bufs[salt_pos].salt_buf[esalt_off + 13]; + w3_t[2] = 0; + w3_t[3] = (64 + esalt_size) * 8; + + u32x digest[5]; + + hmac_sha1_run (w0_t, w1_t, w2_t, w3_t, ipad, opad, digest); + + const u32x r0 = digest[3]; + const u32x r1 = digest[4]; + const u32x r2 = digest[2]; + const u32x r3 = digest[1]; + + #include VECT_COMPARE_M + } +} + +static void m07300s (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], const u32 pw_len, __global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global rakp_t *rakp_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset) +{ + /** + * modifier + */ + + const u32 gid = get_global_id (0); + const u32 lid = get_local_id (0); + + const u32 esalt_len = rakp_bufs[salt_pos].salt_len; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * loop + */ + + u32x w0l = w0[0]; + + for (u32 il_pos = 0; il_pos < bfs_cnt; il_pos++) + { + const u32 w0r = bfs_buf[il_pos].i; + + w0[0] = w0l | w0r; + + /** + * pads + */ + + u32x w0_t[4]; + + w0_t[0] = w0[0]; + w0_t[1] = w0[1]; + w0_t[2] = w0[2]; + w0_t[3] = w0[3]; + + u32x w1_t[4]; + + w1_t[0] = w1[0]; + w1_t[1] = w1[1]; + w1_t[2] = w1[2]; + w1_t[3] = w1[3]; + + u32x w2_t[4]; + + w2_t[0] = w2[0]; + w2_t[1] = w2[1]; + w2_t[2] = w2[2]; + w2_t[3] = w2[3]; + + u32x w3_t[4]; + + w3_t[0] = w3[0]; + w3_t[1] = w3[1]; + w3_t[2] = 0; + w3_t[3] = 0; + + u32x ipad[5]; + u32x opad[5]; + + hmac_sha1_pad (w0_t, w1_t, w2_t, w3_t, ipad, opad); + + int esalt_size = esalt_len; + + int esalt_left; + int esalt_off; + + for (esalt_left = esalt_size, esalt_off = 0; esalt_left >= 56; esalt_left -= 64, esalt_off += 16) + { + w0_t[0] = rakp_bufs[salt_pos].salt_buf[esalt_off + 0]; + w0_t[1] = rakp_bufs[salt_pos].salt_buf[esalt_off + 1]; + w0_t[2] = rakp_bufs[salt_pos].salt_buf[esalt_off + 2]; + w0_t[3] = rakp_bufs[salt_pos].salt_buf[esalt_off + 3]; + w1_t[0] = rakp_bufs[salt_pos].salt_buf[esalt_off + 4]; + w1_t[1] = rakp_bufs[salt_pos].salt_buf[esalt_off + 5]; + w1_t[2] = rakp_bufs[salt_pos].salt_buf[esalt_off + 6]; + w1_t[3] = rakp_bufs[salt_pos].salt_buf[esalt_off + 7]; + w2_t[0] = rakp_bufs[salt_pos].salt_buf[esalt_off + 8]; + w2_t[1] = rakp_bufs[salt_pos].salt_buf[esalt_off + 9]; + w2_t[2] = rakp_bufs[salt_pos].salt_buf[esalt_off + 10]; + w2_t[3] = rakp_bufs[salt_pos].salt_buf[esalt_off + 11]; + w3_t[0] = rakp_bufs[salt_pos].salt_buf[esalt_off + 12]; + w3_t[1] = rakp_bufs[salt_pos].salt_buf[esalt_off + 13]; + w3_t[2] = rakp_bufs[salt_pos].salt_buf[esalt_off + 14]; + w3_t[3] = rakp_bufs[salt_pos].salt_buf[esalt_off + 15]; + + sha1_transform (w0_t, w1_t, w2_t, w3_t, ipad); + } + + w0_t[0] = rakp_bufs[salt_pos].salt_buf[esalt_off + 0]; + w0_t[1] = rakp_bufs[salt_pos].salt_buf[esalt_off + 1]; + w0_t[2] = rakp_bufs[salt_pos].salt_buf[esalt_off + 2]; + w0_t[3] = rakp_bufs[salt_pos].salt_buf[esalt_off + 3]; + w1_t[0] = rakp_bufs[salt_pos].salt_buf[esalt_off + 4]; + w1_t[1] = rakp_bufs[salt_pos].salt_buf[esalt_off + 5]; + w1_t[2] = rakp_bufs[salt_pos].salt_buf[esalt_off + 6]; + w1_t[3] = rakp_bufs[salt_pos].salt_buf[esalt_off + 7]; + w2_t[0] = rakp_bufs[salt_pos].salt_buf[esalt_off + 8]; + w2_t[1] = rakp_bufs[salt_pos].salt_buf[esalt_off + 9]; + w2_t[2] = rakp_bufs[salt_pos].salt_buf[esalt_off + 10]; + w2_t[3] = rakp_bufs[salt_pos].salt_buf[esalt_off + 11]; + w3_t[0] = rakp_bufs[salt_pos].salt_buf[esalt_off + 12]; + w3_t[1] = rakp_bufs[salt_pos].salt_buf[esalt_off + 13]; + w3_t[2] = 0; + w3_t[3] = (64 + esalt_size) * 8; + + u32x digest[5]; + + hmac_sha1_run (w0_t, w1_t, w2_t, w3_t, ipad, opad, digest); + + const u32x r0 = digest[3]; + const u32x r1 = digest[4]; + const u32x r2 = digest[2]; + const u32x r3 = digest[1]; + + #include VECT_COMPARE_S + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m07300_m04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salts, __global rakp_t *rakp_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m07300m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salts, rakp_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m07300_m08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salts, __global rakp_t *rakp_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m07300m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salts, rakp_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m07300_m16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salts, __global rakp_t *rakp_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = pws[gid].i[ 8]; + w2[1] = pws[gid].i[ 9]; + w2[2] = pws[gid].i[10]; + w2[3] = pws[gid].i[11]; + + u32x w3[4]; + + w3[0] = pws[gid].i[12]; + w3[1] = pws[gid].i[13]; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m07300m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salts, rakp_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m07300_s04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salts, __global rakp_t *rakp_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m07300s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salts, rakp_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m07300_s08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salts, __global rakp_t *rakp_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m07300s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salts, rakp_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m07300_s16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salts, __global rakp_t *rakp_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = pws[gid].i[ 8]; + w2[1] = pws[gid].i[ 9]; + w2[2] = pws[gid].i[10]; + w2[3] = pws[gid].i[11]; + + u32x w3[4]; + + w3[0] = pws[gid].i[12]; + w3[1] = pws[gid].i[13]; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m07300s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salts, rakp_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} diff --git a/amd/m07400.cl b/amd/m07400.cl new file mode 100644 index 0000000000..9a338a14bb --- /dev/null +++ b/amd/m07400.cl @@ -0,0 +1,1176 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _SHA256_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW4 +#define VECT_SIZE1 +#endif + +#ifdef VLIW5 +#define VECT_SIZE1 +#endif + +#define DGST_R0 0 +#define DGST_R1 1 +#define DGST_R2 2 +#define DGST_R3 3 + +#include "include/kernel_functions.c" +#include "types_amd.c" +#include "common_amd.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +__constant u32 k_sha256[64] = +{ + SHA256C00, SHA256C01, SHA256C02, SHA256C03, + SHA256C04, SHA256C05, SHA256C06, SHA256C07, + SHA256C08, SHA256C09, SHA256C0a, SHA256C0b, + SHA256C0c, SHA256C0d, SHA256C0e, SHA256C0f, + SHA256C10, SHA256C11, SHA256C12, SHA256C13, + SHA256C14, SHA256C15, SHA256C16, SHA256C17, + SHA256C18, SHA256C19, SHA256C1a, SHA256C1b, + SHA256C1c, SHA256C1d, SHA256C1e, SHA256C1f, + SHA256C20, SHA256C21, SHA256C22, SHA256C23, + SHA256C24, SHA256C25, SHA256C26, SHA256C27, + SHA256C28, SHA256C29, SHA256C2a, SHA256C2b, + SHA256C2c, SHA256C2d, SHA256C2e, SHA256C2f, + SHA256C30, SHA256C31, SHA256C32, SHA256C33, + SHA256C34, SHA256C35, SHA256C36, SHA256C37, + SHA256C38, SHA256C39, SHA256C3a, SHA256C3b, + SHA256C3c, SHA256C3d, SHA256C3e, SHA256C3f, +}; + +static void sha256_transform (const u32x w[16], u32x digest[8]) +{ + u32x a = digest[0]; + u32x b = digest[1]; + u32x c = digest[2]; + u32x d = digest[3]; + u32x e = digest[4]; + u32x f = digest[5]; + u32x g = digest[6]; + u32x h = digest[7]; + + u32x w0_t = swap_workaround (w[ 0]); + u32x w1_t = swap_workaround (w[ 1]); + u32x w2_t = swap_workaround (w[ 2]); + u32x w3_t = swap_workaround (w[ 3]); + u32x w4_t = swap_workaround (w[ 4]); + u32x w5_t = swap_workaround (w[ 5]); + u32x w6_t = swap_workaround (w[ 6]); + u32x w7_t = swap_workaround (w[ 7]); + u32x w8_t = swap_workaround (w[ 8]); + u32x w9_t = swap_workaround (w[ 9]); + u32x wa_t = swap_workaround (w[10]); + u32x wb_t = swap_workaround (w[11]); + u32x wc_t = swap_workaround (w[12]); + u32x wd_t = swap_workaround (w[13]); + u32x we_t = swap_workaround (w[14]); + u32x wf_t = swap_workaround (w[15]); + + #define ROUND_EXPAND() \ + { \ + w0_t = SHA256_EXPAND (we_t, w9_t, w1_t, w0_t); \ + w1_t = SHA256_EXPAND (wf_t, wa_t, w2_t, w1_t); \ + w2_t = SHA256_EXPAND (w0_t, wb_t, w3_t, w2_t); \ + w3_t = SHA256_EXPAND (w1_t, wc_t, w4_t, w3_t); \ + w4_t = SHA256_EXPAND (w2_t, wd_t, w5_t, w4_t); \ + w5_t = SHA256_EXPAND (w3_t, we_t, w6_t, w5_t); \ + w6_t = SHA256_EXPAND (w4_t, wf_t, w7_t, w6_t); \ + w7_t = SHA256_EXPAND (w5_t, w0_t, w8_t, w7_t); \ + w8_t = SHA256_EXPAND (w6_t, w1_t, w9_t, w8_t); \ + w9_t = SHA256_EXPAND (w7_t, w2_t, wa_t, w9_t); \ + wa_t = SHA256_EXPAND (w8_t, w3_t, wb_t, wa_t); \ + wb_t = SHA256_EXPAND (w9_t, w4_t, wc_t, wb_t); \ + wc_t = SHA256_EXPAND (wa_t, w5_t, wd_t, wc_t); \ + wd_t = SHA256_EXPAND (wb_t, w6_t, we_t, wd_t); \ + we_t = SHA256_EXPAND (wc_t, w7_t, wf_t, we_t); \ + wf_t = SHA256_EXPAND (wd_t, w8_t, w0_t, wf_t); \ + } + + #define ROUND_STEP(i) \ + { \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, k_sha256[i + 0]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, k_sha256[i + 1]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, k_sha256[i + 2]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, k_sha256[i + 3]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, k_sha256[i + 4]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, k_sha256[i + 5]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, k_sha256[i + 6]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, k_sha256[i + 7]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, k_sha256[i + 8]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, k_sha256[i + 9]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, k_sha256[i + 10]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, k_sha256[i + 11]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, k_sha256[i + 12]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, k_sha256[i + 13]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, k_sha256[i + 14]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, k_sha256[i + 15]); \ + } + + ROUND_STEP (0); + + #pragma unroll + for (int i = 16; i < 64; i += 16) + { + ROUND_EXPAND (); ROUND_STEP (i); + } + + digest[0] += a; + digest[1] += b; + digest[2] += c; + digest[3] += d; + digest[4] += e; + digest[5] += f; + digest[6] += g; + digest[7] += h; +} + +static void sha256_transform_no14 (const u32x w[16], u32x digest[8]) +{ + u32x w_t[16]; + + w_t[ 0] = w[ 0]; + w_t[ 1] = w[ 1]; + w_t[ 2] = w[ 2]; + w_t[ 3] = w[ 3]; + w_t[ 4] = w[ 4]; + w_t[ 5] = w[ 5]; + w_t[ 6] = w[ 6]; + w_t[ 7] = w[ 7]; + w_t[ 8] = w[ 8]; + w_t[ 9] = w[ 9]; + w_t[10] = w[10]; + w_t[11] = w[11]; + w_t[12] = w[12]; + w_t[13] = w[13]; + w_t[14] = 0; + w_t[15] = w[15]; + + sha256_transform (w_t, digest); +} + +static void init_ctx (u32x digest[8]) +{ + digest[0] = SHA256M_A; + digest[1] = SHA256M_B; + digest[2] = SHA256M_C; + digest[3] = SHA256M_D; + digest[4] = SHA256M_E; + digest[5] = SHA256M_F; + digest[6] = SHA256M_G; + digest[7] = SHA256M_H; +} + +static void bzero16 (u32x block[16]) +{ + block[ 0] = 0; + block[ 1] = 0; + block[ 2] = 0; + block[ 3] = 0; + block[ 4] = 0; + block[ 5] = 0; + block[ 6] = 0; + block[ 7] = 0; + block[ 8] = 0; + block[ 9] = 0; + block[10] = 0; + block[11] = 0; + block[12] = 0; + block[13] = 0; + block[14] = 0; + block[15] = 0; +} + +static void bswap8 (u32x block[16]) +{ + block[ 0] = swap_workaround (block[ 0]); + block[ 1] = swap_workaround (block[ 1]); + block[ 2] = swap_workaround (block[ 2]); + block[ 3] = swap_workaround (block[ 3]); + block[ 4] = swap_workaround (block[ 4]); + block[ 5] = swap_workaround (block[ 5]); + block[ 6] = swap_workaround (block[ 6]); + block[ 7] = swap_workaround (block[ 7]); +} + +static u32 memcat16 (u32x block[16], const u32 block_len, const u32x append[4], const u32 append_len) +{ + const u32 mod = block_len & 3; + const u32 div = block_len / 4; + + u32x tmp0; + u32x tmp1; + u32x tmp2; + u32x tmp3; + u32x tmp4; + + const int offset_minus_4 = 4 - block_len; + + tmp0 = amd_bytealign (append[0], 0, offset_minus_4); + tmp1 = amd_bytealign (append[1], append[0], offset_minus_4); + tmp2 = amd_bytealign (append[2], append[1], offset_minus_4); + tmp3 = amd_bytealign (append[3], append[2], offset_minus_4); + tmp4 = amd_bytealign ( 0, append[3], offset_minus_4); + + if (mod == 0) + { + tmp0 = tmp1; + tmp1 = tmp2; + tmp2 = tmp3; + tmp3 = tmp4; + tmp4 = 0; + } + + switch (div) + { + case 0: block[ 0] |= tmp0; + block[ 1] = tmp1; + block[ 2] = tmp2; + block[ 3] = tmp3; + block[ 4] = tmp4; + break; + case 1: block[ 1] |= tmp0; + block[ 2] = tmp1; + block[ 3] = tmp2; + block[ 4] = tmp3; + block[ 5] = tmp4; + break; + case 2: block[ 2] |= tmp0; + block[ 3] = tmp1; + block[ 4] = tmp2; + block[ 5] = tmp3; + block[ 6] = tmp4; + break; + case 3: block[ 3] |= tmp0; + block[ 4] = tmp1; + block[ 5] = tmp2; + block[ 6] = tmp3; + block[ 7] = tmp4; + break; + case 4: block[ 4] |= tmp0; + block[ 5] = tmp1; + block[ 6] = tmp2; + block[ 7] = tmp3; + block[ 8] = tmp4; + break; + case 5: block[ 5] |= tmp0; + block[ 6] = tmp1; + block[ 7] = tmp2; + block[ 8] = tmp3; + block[ 9] = tmp4; + break; + case 6: block[ 6] |= tmp0; + block[ 7] = tmp1; + block[ 8] = tmp2; + block[ 9] = tmp3; + block[10] = tmp4; + break; + case 7: block[ 7] |= tmp0; + block[ 8] = tmp1; + block[ 9] = tmp2; + block[10] = tmp3; + block[11] = tmp4; + break; + case 8: block[ 8] |= tmp0; + block[ 9] = tmp1; + block[10] = tmp2; + block[11] = tmp3; + block[12] = tmp4; + break; + case 9: block[ 9] |= tmp0; + block[10] = tmp1; + block[11] = tmp2; + block[12] = tmp3; + block[13] = tmp4; + break; + case 10: block[10] |= tmp0; + block[11] = tmp1; + block[12] = tmp2; + block[13] = tmp3; + block[14] = tmp4; + break; + case 11: block[11] |= tmp0; + block[12] = tmp1; + block[13] = tmp2; + block[14] = tmp3; + block[15] = tmp4; + break; + case 12: block[12] |= tmp0; + block[13] = tmp1; + block[14] = tmp2; + block[15] = tmp3; + break; + case 13: block[13] |= tmp0; + block[14] = tmp1; + block[15] = tmp2; + break; + case 14: block[14] |= tmp0; + block[15] = tmp1; + break; + case 15: block[15] |= tmp0; + break; + } + + u32 new_len = block_len + append_len; + + return new_len; +} + +static u32 memcat16c (u32x block[16], const u32 block_len, const u32x append[4], const u32 append_len, u32x digest[8]) +{ + const u32 mod = block_len & 3; + const u32 div = block_len / 4; + + u32x tmp0; + u32x tmp1; + u32x tmp2; + u32x tmp3; + u32x tmp4; + + const int offset_minus_4 = 4 - block_len; + + tmp0 = amd_bytealign (append[0], 0, offset_minus_4); + tmp1 = amd_bytealign (append[1], append[0], offset_minus_4); + tmp2 = amd_bytealign (append[2], append[1], offset_minus_4); + tmp3 = amd_bytealign (append[3], append[2], offset_minus_4); + tmp4 = amd_bytealign ( 0, append[3], offset_minus_4); + + if (mod == 0) + { + tmp0 = tmp1; + tmp1 = tmp2; + tmp2 = tmp3; + tmp3 = tmp4; + tmp4 = 0; + } + + u32x carry[4] = { 0, 0, 0, 0 }; + + switch (div) + { + case 0: block[ 0] |= tmp0; + block[ 1] = tmp1; + block[ 2] = tmp2; + block[ 3] = tmp3; + block[ 4] = tmp4; + break; + case 1: block[ 1] |= tmp0; + block[ 2] = tmp1; + block[ 3] = tmp2; + block[ 4] = tmp3; + block[ 5] = tmp4; + break; + case 2: block[ 2] |= tmp0; + block[ 3] = tmp1; + block[ 4] = tmp2; + block[ 5] = tmp3; + block[ 6] = tmp4; + break; + case 3: block[ 3] |= tmp0; + block[ 4] = tmp1; + block[ 5] = tmp2; + block[ 6] = tmp3; + block[ 7] = tmp4; + break; + case 4: block[ 4] |= tmp0; + block[ 5] = tmp1; + block[ 6] = tmp2; + block[ 7] = tmp3; + block[ 8] = tmp4; + break; + case 5: block[ 5] |= tmp0; + block[ 6] = tmp1; + block[ 7] = tmp2; + block[ 8] = tmp3; + block[ 9] = tmp4; + break; + case 6: block[ 6] |= tmp0; + block[ 7] = tmp1; + block[ 8] = tmp2; + block[ 9] = tmp3; + block[10] = tmp4; + break; + case 7: block[ 7] |= tmp0; + block[ 8] = tmp1; + block[ 9] = tmp2; + block[10] = tmp3; + block[11] = tmp4; + break; + case 8: block[ 8] |= tmp0; + block[ 9] = tmp1; + block[10] = tmp2; + block[11] = tmp3; + block[12] = tmp4; + break; + case 9: block[ 9] |= tmp0; + block[10] = tmp1; + block[11] = tmp2; + block[12] = tmp3; + block[13] = tmp4; + break; + case 10: block[10] |= tmp0; + block[11] = tmp1; + block[12] = tmp2; + block[13] = tmp3; + block[14] = tmp4; + break; + case 11: block[11] |= tmp0; + block[12] = tmp1; + block[13] = tmp2; + block[14] = tmp3; + block[15] = tmp4; + break; + case 12: block[12] |= tmp0; + block[13] = tmp1; + block[14] = tmp2; + block[15] = tmp3; + carry[ 0] = tmp4; + break; + case 13: block[13] |= tmp0; + block[14] = tmp1; + block[15] = tmp2; + carry[ 0] = tmp3; + carry[ 1] = tmp4; + break; + case 14: block[14] |= tmp0; + block[15] = tmp1; + carry[ 0] = tmp2; + carry[ 1] = tmp3; + carry[ 2] = tmp4; + break; + case 15: block[15] |= tmp0; + carry[ 0] = tmp1; + carry[ 1] = tmp2; + carry[ 2] = tmp3; + carry[ 3] = tmp4; + break; + } + + u32 new_len = block_len + append_len; + + if (new_len >= 64) + { + new_len -= 64; + + sha256_transform (block, digest); + + bzero16 (block); + + block[0] = carry[0]; + block[1] = carry[1]; + block[2] = carry[2]; + block[3] = carry[3]; + } + + return new_len; +} + +static u32 memcat20 (u32x block[20], const u32 block_len, const u32x append[4], const u32 append_len) +{ + const u32 mod = block_len & 3; + const u32 div = block_len / 4; + + u32x tmp0; + u32x tmp1; + u32x tmp2; + u32x tmp3; + u32x tmp4; + + const int offset_minus_4 = 4 - block_len; + + tmp0 = amd_bytealign (append[0], 0, offset_minus_4); + tmp1 = amd_bytealign (append[1], append[0], offset_minus_4); + tmp2 = amd_bytealign (append[2], append[1], offset_minus_4); + tmp3 = amd_bytealign (append[3], append[2], offset_minus_4); + tmp4 = amd_bytealign ( 0, append[3], offset_minus_4); + + if (mod == 0) + { + tmp0 = tmp1; + tmp1 = tmp2; + tmp2 = tmp3; + tmp3 = tmp4; + tmp4 = 0; + } + + switch (div) + { + case 0: block[ 0] |= tmp0; + block[ 1] = tmp1; + block[ 2] = tmp2; + block[ 3] = tmp3; + block[ 4] = tmp4; + break; + case 1: block[ 1] |= tmp0; + block[ 2] = tmp1; + block[ 3] = tmp2; + block[ 4] = tmp3; + block[ 5] = tmp4; + break; + case 2: block[ 2] |= tmp0; + block[ 3] = tmp1; + block[ 4] = tmp2; + block[ 5] = tmp3; + block[ 6] = tmp4; + break; + case 3: block[ 3] |= tmp0; + block[ 4] = tmp1; + block[ 5] = tmp2; + block[ 6] = tmp3; + block[ 7] = tmp4; + break; + case 4: block[ 4] |= tmp0; + block[ 5] = tmp1; + block[ 6] = tmp2; + block[ 7] = tmp3; + block[ 8] = tmp4; + break; + case 5: block[ 5] |= tmp0; + block[ 6] = tmp1; + block[ 7] = tmp2; + block[ 8] = tmp3; + block[ 9] = tmp4; + break; + case 6: block[ 6] |= tmp0; + block[ 7] = tmp1; + block[ 8] = tmp2; + block[ 9] = tmp3; + block[10] = tmp4; + break; + case 7: block[ 7] |= tmp0; + block[ 8] = tmp1; + block[ 9] = tmp2; + block[10] = tmp3; + block[11] = tmp4; + break; + case 8: block[ 8] |= tmp0; + block[ 9] = tmp1; + block[10] = tmp2; + block[11] = tmp3; + block[12] = tmp4; + break; + case 9: block[ 9] |= tmp0; + block[10] = tmp1; + block[11] = tmp2; + block[12] = tmp3; + block[13] = tmp4; + break; + case 10: block[10] |= tmp0; + block[11] = tmp1; + block[12] = tmp2; + block[13] = tmp3; + block[14] = tmp4; + break; + case 11: block[11] |= tmp0; + block[12] = tmp1; + block[13] = tmp2; + block[14] = tmp3; + block[15] = tmp4; + break; + case 12: block[12] |= tmp0; + block[13] = tmp1; + block[14] = tmp2; + block[15] = tmp3; + block[16] = tmp4; + break; + case 13: block[13] |= tmp0; + block[14] = tmp1; + block[15] = tmp2; + block[16] = tmp3; + block[17] = tmp4; + break; + case 14: block[14] |= tmp0; + block[15] = tmp1; + block[16] = tmp2; + block[17] = tmp3; + block[18] = tmp4; + break; + case 15: block[15] |= tmp0; + block[16] = tmp1; + block[17] = tmp2; + block[18] = tmp3; + block[19] = tmp4; + break; + } + + return block_len + append_len; +} + +static u32 memcat20_x80 (u32x block[20], const u32 block_len, const u32x append[4], const u32 append_len) +{ + const u32 mod = block_len & 3; + const u32 div = block_len / 4; + + u32x tmp0; + u32x tmp1; + u32x tmp2; + u32x tmp3; + u32x tmp4; + + const int offset_minus_4 = 4 - block_len; + + tmp0 = amd_bytealign (append[0], 0, offset_minus_4); + tmp1 = amd_bytealign (append[1], append[0], offset_minus_4); + tmp2 = amd_bytealign (append[2], append[1], offset_minus_4); + tmp3 = amd_bytealign (append[3], append[2], offset_minus_4); + tmp4 = amd_bytealign ( 0x80, append[3], offset_minus_4); + + if (mod == 0) + { + tmp0 = tmp1; + tmp1 = tmp2; + tmp2 = tmp3; + tmp3 = tmp4; + tmp4 = 0x80; + } + + switch (div) + { + case 0: block[ 0] |= tmp0; + block[ 1] = tmp1; + block[ 2] = tmp2; + block[ 3] = tmp3; + block[ 4] = tmp4; + break; + case 1: block[ 1] |= tmp0; + block[ 2] = tmp1; + block[ 3] = tmp2; + block[ 4] = tmp3; + block[ 5] = tmp4; + break; + case 2: block[ 2] |= tmp0; + block[ 3] = tmp1; + block[ 4] = tmp2; + block[ 5] = tmp3; + block[ 6] = tmp4; + break; + case 3: block[ 3] |= tmp0; + block[ 4] = tmp1; + block[ 5] = tmp2; + block[ 6] = tmp3; + block[ 7] = tmp4; + break; + case 4: block[ 4] |= tmp0; + block[ 5] = tmp1; + block[ 6] = tmp2; + block[ 7] = tmp3; + block[ 8] = tmp4; + break; + case 5: block[ 5] |= tmp0; + block[ 6] = tmp1; + block[ 7] = tmp2; + block[ 8] = tmp3; + block[ 9] = tmp4; + break; + case 6: block[ 6] |= tmp0; + block[ 7] = tmp1; + block[ 8] = tmp2; + block[ 9] = tmp3; + block[10] = tmp4; + break; + case 7: block[ 7] |= tmp0; + block[ 8] = tmp1; + block[ 9] = tmp2; + block[10] = tmp3; + block[11] = tmp4; + break; + case 8: block[ 8] |= tmp0; + block[ 9] = tmp1; + block[10] = tmp2; + block[11] = tmp3; + block[12] = tmp4; + break; + case 9: block[ 9] |= tmp0; + block[10] = tmp1; + block[11] = tmp2; + block[12] = tmp3; + block[13] = tmp4; + break; + case 10: block[10] |= tmp0; + block[11] = tmp1; + block[12] = tmp2; + block[13] = tmp3; + block[14] = tmp4; + break; + case 11: block[11] |= tmp0; + block[12] = tmp1; + block[13] = tmp2; + block[14] = tmp3; + block[15] = tmp4; + break; + case 12: block[12] |= tmp0; + block[13] = tmp1; + block[14] = tmp2; + block[15] = tmp3; + block[16] = tmp4; + break; + case 13: block[13] |= tmp0; + block[14] = tmp1; + block[15] = tmp2; + block[16] = tmp3; + block[17] = tmp4; + break; + case 14: block[14] |= tmp0; + block[15] = tmp1; + block[16] = tmp2; + block[17] = tmp3; + block[18] = tmp4; + break; + case 15: block[15] |= tmp0; + block[16] = tmp1; + block[17] = tmp2; + block[18] = tmp3; + block[19] = tmp4; + break; + } + + return block_len + append_len; +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m07400_init (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global sha256crypt_tmp_t *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[0]; + w0[1] = pws[gid].i[1]; + w0[2] = pws[gid].i[2]; + w0[3] = pws[gid].i[3]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * salt + */ + + u32 salt_buf[4]; + + salt_buf[0] = salt_bufs[salt_pos].salt_buf[0]; + salt_buf[1] = salt_bufs[salt_pos].salt_buf[1]; + salt_buf[2] = salt_bufs[salt_pos].salt_buf[2]; + salt_buf[3] = salt_bufs[salt_pos].salt_buf[3]; + + u32 salt_len = salt_bufs[salt_pos].salt_len; + + /** + * buffers + */ + + u32 block_len; // never reaches > 64 + u32 transform_len; // required for w[15] = len * 8 + + u32x block[16]; + + u32x alt_result[8]; + u32x p_bytes[8]; + u32x s_bytes[8]; + + /* Prepare for the real work. */ + + block_len = 0; + + bzero16 (block); + + /* Add key. */ + + block_len = memcat16 (block, block_len, w0, pw_len); + + /* Add salt. */ + + block_len = memcat16 (block, block_len, salt_buf, salt_len); + + /* Add key again. */ + + block_len = memcat16 (block, block_len, w0, pw_len); + + append_0x80_4 (block, block_len); + + block[15] = swap_workaround (block_len * 8); + + init_ctx (alt_result); + + sha256_transform (block, alt_result); + + bswap8 (alt_result); + + block_len = 0; + + bzero16 (block); + + u32x alt_result_tmp[8]; + + alt_result_tmp[0] = alt_result[0]; + alt_result_tmp[1] = alt_result[1]; + alt_result_tmp[2] = alt_result[2]; + alt_result_tmp[3] = alt_result[3]; + alt_result_tmp[4] = 0; + alt_result_tmp[5] = 0; + alt_result_tmp[6] = 0; + alt_result_tmp[7] = 0; + + truncate_block (alt_result_tmp, pw_len); + + /* Add the key string. */ + + block_len = memcat16 (block, block_len, w0, pw_len); + + /* The last part is the salt string. This must be at most 8 + characters and it ends at the first `$' character (for + compatibility with existing implementations). */ + + block_len = memcat16 (block, block_len, salt_buf, salt_len); + + /* Now get result of this (32 bytes) and add it to the other + context. */ + + block_len = memcat16 (block, block_len, alt_result_tmp, pw_len); + + transform_len = block_len; + + /* Take the binary representation of the length of the key and for every + 1 add the alternate sum, for every 0 the key. */ + + alt_result_tmp[0] = alt_result[0]; + alt_result_tmp[1] = alt_result[1]; + alt_result_tmp[2] = alt_result[2]; + alt_result_tmp[3] = alt_result[3]; + alt_result_tmp[4] = alt_result[4]; + alt_result_tmp[5] = alt_result[5]; + alt_result_tmp[6] = alt_result[6]; + alt_result_tmp[7] = alt_result[7]; + + init_ctx (alt_result); + + for (u32 j = pw_len; j; j >>= 1) + { + if (j & 1) + { + block_len = memcat16c (block, block_len, &alt_result_tmp[0], 16, alt_result); + block_len = memcat16c (block, block_len, &alt_result_tmp[4], 16, alt_result); + + transform_len += 32; + } + else + { + block_len = memcat16c (block, block_len, w0, pw_len, alt_result); + + transform_len += pw_len; + } + } + + append_0x80_4 (block, block_len); + + if (block_len >= 56) + { + sha256_transform (block, alt_result); + + bzero16 (block); + } + + block[15] = swap_workaround (transform_len * 8); + + sha256_transform (block, alt_result); + + bswap8 (alt_result); + + tmps[gid].alt_result[0] = alt_result[0]; + tmps[gid].alt_result[1] = alt_result[1]; + tmps[gid].alt_result[2] = alt_result[2]; + tmps[gid].alt_result[3] = alt_result[3]; + tmps[gid].alt_result[4] = alt_result[4]; + tmps[gid].alt_result[5] = alt_result[5]; + tmps[gid].alt_result[6] = alt_result[6]; + tmps[gid].alt_result[7] = alt_result[7]; + + /* Start computation of P byte sequence. */ + + block_len = 0; + + transform_len = 0; + + bzero16 (block); + + /* For every character in the password add the entire password. */ + + init_ctx (p_bytes); + + for (u32 j = 0; j < pw_len; j++) + { + block_len = memcat16c (block, block_len, w0, pw_len, p_bytes); + + transform_len += pw_len; + } + + /* Finish the digest. */ + + append_0x80_4 (block, block_len); + + if (block_len >= 56) + { + sha256_transform (block, p_bytes); + + bzero16 (block); + } + + block[15] = swap_workaround (transform_len * 8); + + sha256_transform (block, p_bytes); + + bswap8 (p_bytes); + + truncate_block (p_bytes, pw_len); + + tmps[gid].p_bytes[0] = p_bytes[0]; + tmps[gid].p_bytes[1] = p_bytes[1]; + tmps[gid].p_bytes[2] = p_bytes[2]; + tmps[gid].p_bytes[3] = p_bytes[3]; + + /* Start computation of S byte sequence. */ + + block_len = 0; + + transform_len = 0; + + bzero16 (block); + + /* For every character in the password add the entire password. */ + + init_ctx (s_bytes); + + for (u32 j = 0; j < 16 + (alt_result[0] & 0xff); j++) + { + block_len = memcat16c (block, block_len, salt_buf, salt_len, s_bytes); + + transform_len += salt_len; + } + + /* Finish the digest. */ + + append_0x80_4 (block, block_len); + + if (block_len >= 56) + { + sha256_transform (block, s_bytes); + + bzero16 (block); + } + + block[15] = swap_workaround (transform_len * 8); + + sha256_transform (block, s_bytes); + + bswap8 (s_bytes); + + truncate_block (s_bytes, salt_len); + + tmps[gid].s_bytes[0] = s_bytes[0]; + tmps[gid].s_bytes[1] = s_bytes[1]; + tmps[gid].s_bytes[2] = s_bytes[2]; + tmps[gid].s_bytes[3] = s_bytes[3]; +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m07400_loop (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global sha256crypt_tmp_t *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + const u32 pw_len = pws[gid].pw_len; + + /** + * base + */ + + u32x p_bytes[4]; + + p_bytes[0] = tmps[gid].p_bytes[0]; + p_bytes[1] = tmps[gid].p_bytes[1]; + p_bytes[2] = tmps[gid].p_bytes[2]; + p_bytes[3] = tmps[gid].p_bytes[3]; + + u32x p_bytes_x80[4]; + + p_bytes_x80[0] = tmps[gid].p_bytes[0]; + p_bytes_x80[1] = tmps[gid].p_bytes[1]; + p_bytes_x80[2] = tmps[gid].p_bytes[2]; + p_bytes_x80[3] = tmps[gid].p_bytes[3]; + + append_0x80_1 (p_bytes_x80, pw_len); + + u32x s_bytes[4]; + + s_bytes[0] = tmps[gid].s_bytes[0]; + s_bytes[1] = tmps[gid].s_bytes[1]; + s_bytes[2] = tmps[gid].s_bytes[2]; + s_bytes[3] = tmps[gid].s_bytes[3]; + + u32x alt_result[8]; + + alt_result[0] = tmps[gid].alt_result[0]; + alt_result[1] = tmps[gid].alt_result[1]; + alt_result[2] = tmps[gid].alt_result[2]; + alt_result[3] = tmps[gid].alt_result[3]; + alt_result[4] = tmps[gid].alt_result[4]; + alt_result[5] = tmps[gid].alt_result[5]; + alt_result[6] = tmps[gid].alt_result[6]; + alt_result[7] = tmps[gid].alt_result[7]; + + u32 salt_len = salt_bufs[salt_pos].salt_len; + + /* Repeatedly run the collected hash value through SHA256 to burn + CPU cycles. */ + + for (u32 i = 0, j = loop_pos; i < loop_cnt; i++, j++) + { + u32x tmp[8]; + + init_ctx (tmp); + + u32x block[32]; + + bzero16 (&block[ 0]); + bzero16 (&block[16]); + + u32 block_len = 0; + + const u32 j1 = (j & 1) ? 1 : 0; + const u32 j3 = (j % 3) ? 1 : 0; + const u32 j7 = (j % 7) ? 1 : 0; + + if (j1) + { + block[0] = p_bytes[0]; + block[1] = p_bytes[1]; + block[2] = p_bytes[2]; + block[3] = p_bytes[3]; + + block_len = pw_len; + } + else + { + block[0] = alt_result[0]; + block[1] = alt_result[1]; + block[2] = alt_result[2]; + block[3] = alt_result[3]; + block[4] = alt_result[4]; + block[5] = alt_result[5]; + block[6] = alt_result[6]; + block[7] = alt_result[7]; + + block_len = 32; + } + + if (j3) + { + block_len = memcat20 (block, block_len, s_bytes, salt_len); + } + + if (j7) + { + block_len = memcat20 (block, block_len, p_bytes, pw_len); + } + + if (j1) + { + block_len = memcat20 (block, block_len, &alt_result[0], 16); + block_len = memcat20_x80 (block, block_len, &alt_result[4], 16); + } + else + { + block_len = memcat20 (block, block_len, p_bytes_x80, pw_len); + } + + if (block_len >= 56) + { + sha256_transform (block, tmp); + + block[ 0] = block[16]; + block[ 1] = block[17]; + block[ 2] = block[18]; + block[ 3] = block[19]; + block[ 4] = 0; + block[ 5] = 0; + block[ 6] = 0; + block[ 7] = 0; + block[ 8] = 0; + block[ 9] = 0; + block[10] = 0; + block[11] = 0; + block[12] = 0; + block[13] = 0; + block[14] = 0; + block[15] = 0; + } + + block[15] = swap_workaround (block_len * 8); + + sha256_transform_no14 (block, tmp); + + bswap8 (tmp); + + alt_result[0] = tmp[0]; + alt_result[1] = tmp[1]; + alt_result[2] = tmp[2]; + alt_result[3] = tmp[3]; + alt_result[4] = tmp[4]; + alt_result[5] = tmp[5]; + alt_result[6] = tmp[6]; + alt_result[7] = tmp[7]; + } + + tmps[gid].alt_result[0] = alt_result[0]; + tmps[gid].alt_result[1] = alt_result[1]; + tmps[gid].alt_result[2] = alt_result[2]; + tmps[gid].alt_result[3] = alt_result[3]; + tmps[gid].alt_result[4] = alt_result[4]; + tmps[gid].alt_result[5] = alt_result[5]; + tmps[gid].alt_result[6] = alt_result[6]; + tmps[gid].alt_result[7] = alt_result[7]; +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m07400_comp (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global sha256crypt_tmp_t *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + const u32 lid = get_local_id (0); + + const u32x r0 = tmps[gid].alt_result[0]; + const u32x r1 = tmps[gid].alt_result[1]; + const u32x r2 = tmps[gid].alt_result[2]; + const u32x r3 = tmps[gid].alt_result[3]; + + #define il_pos 0 + + #include VECT_COMPARE_M +} diff --git a/amd/m07500_a0.cl b/amd/m07500_a0.cl new file mode 100644 index 0000000000..102c98c9a9 --- /dev/null +++ b/amd/m07500_a0.cl @@ -0,0 +1,817 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _KRB5PA_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW4 +#define VECT_SIZE1 +#endif + +#ifdef VLIW5 +#define VECT_SIZE1 +#endif + +#define DGST_R0 3 +#define DGST_R1 7 +#define DGST_R2 2 +#define DGST_R3 6 + +#include "include/kernel_functions.c" +#include "types_amd.c" +#include "common_amd.c" +#include "include/rp_gpu.h" +#include "rp_amd.c" + +typedef struct +{ + u8 S[256]; + + u8 i; + u8 j; + +} RC4_KEY; + +static void swap (__local RC4_KEY *rc4_key, const u8 i, const u8 j) +{ + u8 tmp; + + tmp = rc4_key->S[i]; + rc4_key->S[i] = rc4_key->S[j]; + rc4_key->S[j] = tmp; +} + +static void rc4_init_16 (__local RC4_KEY *rc4_key, const u32 data[4]) +{ + u32 i; + + #pragma unroll 256 + for (i = 0; i < 256; i += 1) rc4_key->S[i] = i; + + u8 j = 0; + + #pragma unroll 16 + for (i = 0; i < 256; i += 16) + { + u32 idx = i; + + u32 v; + + v = data[0]; + + j += rc4_key->S[idx] + (v >> 0); swap (rc4_key, idx, j); idx++; + j += rc4_key->S[idx] + (v >> 8); swap (rc4_key, idx, j); idx++; + j += rc4_key->S[idx] + (v >> 16); swap (rc4_key, idx, j); idx++; + j += rc4_key->S[idx] + (v >> 24); swap (rc4_key, idx, j); idx++; + + v = data[1]; + + j += rc4_key->S[idx] + (v >> 0); swap (rc4_key, idx, j); idx++; + j += rc4_key->S[idx] + (v >> 8); swap (rc4_key, idx, j); idx++; + j += rc4_key->S[idx] + (v >> 16); swap (rc4_key, idx, j); idx++; + j += rc4_key->S[idx] + (v >> 24); swap (rc4_key, idx, j); idx++; + + v = data[2]; + + j += rc4_key->S[idx] + (v >> 0); swap (rc4_key, idx, j); idx++; + j += rc4_key->S[idx] + (v >> 8); swap (rc4_key, idx, j); idx++; + j += rc4_key->S[idx] + (v >> 16); swap (rc4_key, idx, j); idx++; + j += rc4_key->S[idx] + (v >> 24); swap (rc4_key, idx, j); idx++; + + v = data[3]; + + j += rc4_key->S[idx] + (v >> 0); swap (rc4_key, idx, j); idx++; + j += rc4_key->S[idx] + (v >> 8); swap (rc4_key, idx, j); idx++; + j += rc4_key->S[idx] + (v >> 16); swap (rc4_key, idx, j); idx++; + j += rc4_key->S[idx] + (v >> 24); swap (rc4_key, idx, j); idx++; + } + + rc4_key->i = 0; + rc4_key->j = 0; +} + +static u32 rc4_next_4 (__local RC4_KEY *rc4_key, const u32 ct) +{ + u8 idx; + + u32 xor4 = 0; + + u8 i = rc4_key->i; + u8 j = rc4_key->j; + + i += 1; + j += rc4_key->S[i]; + + swap (rc4_key, i, j); + + idx = rc4_key->S[i] + rc4_key->S[j]; + + xor4 |= rc4_key->S[idx] << 0; + + i += 1; + j += rc4_key->S[i]; + + swap (rc4_key, i, j); + + idx = rc4_key->S[i] + rc4_key->S[j]; + + xor4 |= rc4_key->S[idx] << 8; + + i += 1; + j += rc4_key->S[i]; + + swap (rc4_key, i, j); + + idx = rc4_key->S[i] + rc4_key->S[j]; + + xor4 |= rc4_key->S[idx] << 16; + + i += 1; + j += rc4_key->S[i]; + + swap (rc4_key, i, j); + + idx = rc4_key->S[i] + rc4_key->S[j]; + + xor4 |= rc4_key->S[idx] << 24; + + rc4_key->i = i; + rc4_key->j = j; + + return ct ^ xor4; +} + +static int decrypt_and_check (__local RC4_KEY *rc4_key, u32 data[4], u32 timestamp_ct[8]) +{ + u32 pt; + + rc4_init_16 (rc4_key, data); + + pt = rc4_next_4 (rc4_key, timestamp_ct[0]); + pt = rc4_next_4 (rc4_key, timestamp_ct[1]); + pt = rc4_next_4 (rc4_key, timestamp_ct[2]); + pt = rc4_next_4 (rc4_key, timestamp_ct[3]); + + if ((pt & 0xffff0000) != 0x30320000) return 0; + + pt = rc4_next_4 (rc4_key, timestamp_ct[4]); + + if (((pt & 0xff) < '0') || ((pt & 0xff) > '9')) return 0; pt >>= 8; + if (((pt & 0xff) < '0') || ((pt & 0xff) > '9')) return 0; pt >>= 8; + if (((pt & 0xff) < '0') || ((pt & 0xff) > '9')) return 0; pt >>= 8; + if (((pt & 0xff) < '0') || ((pt & 0xff) > '9')) return 0; + + pt = rc4_next_4 (rc4_key, timestamp_ct[5]); + + if (((pt & 0xff) < '0') || ((pt & 0xff) > '9')) return 0; pt >>= 8; + if (((pt & 0xff) < '0') || ((pt & 0xff) > '9')) return 0; pt >>= 8; + if (((pt & 0xff) < '0') || ((pt & 0xff) > '9')) return 0; pt >>= 8; + if (((pt & 0xff) < '0') || ((pt & 0xff) > '9')) return 0; + + pt = rc4_next_4 (rc4_key, timestamp_ct[6]); + + if (((pt & 0xff) < '0') || ((pt & 0xff) > '9')) return 0; pt >>= 8; + if (((pt & 0xff) < '0') || ((pt & 0xff) > '9')) return 0; pt >>= 8; + if (((pt & 0xff) < '0') || ((pt & 0xff) > '9')) return 0; pt >>= 8; + if (((pt & 0xff) < '0') || ((pt & 0xff) > '9')) return 0; + + return 1; +} + +static void md4_transform (const u32x w0[4], const u32x w1[4], const u32x w2[4], const u32x w3[4], u32x digest[4]) +{ + u32x a = digest[0]; + u32x b = digest[1]; + u32x c = digest[2]; + u32x d = digest[3]; + + MD4_STEP (MD4_Fo, a, b, c, d, w0[0], MD4C00, MD4S00); + MD4_STEP (MD4_Fo, d, a, b, c, w0[1], MD4C00, MD4S01); + MD4_STEP (MD4_Fo, c, d, a, b, w0[2], MD4C00, MD4S02); + MD4_STEP (MD4_Fo, b, c, d, a, w0[3], MD4C00, MD4S03); + MD4_STEP (MD4_Fo, a, b, c, d, w1[0], MD4C00, MD4S00); + MD4_STEP (MD4_Fo, d, a, b, c, w1[1], MD4C00, MD4S01); + MD4_STEP (MD4_Fo, c, d, a, b, w1[2], MD4C00, MD4S02); + MD4_STEP (MD4_Fo, b, c, d, a, w1[3], MD4C00, MD4S03); + MD4_STEP (MD4_Fo, a, b, c, d, w2[0], MD4C00, MD4S00); + MD4_STEP (MD4_Fo, d, a, b, c, w2[1], MD4C00, MD4S01); + MD4_STEP (MD4_Fo, c, d, a, b, w2[2], MD4C00, MD4S02); + MD4_STEP (MD4_Fo, b, c, d, a, w2[3], MD4C00, MD4S03); + MD4_STEP (MD4_Fo, a, b, c, d, w3[0], MD4C00, MD4S00); + MD4_STEP (MD4_Fo, d, a, b, c, w3[1], MD4C00, MD4S01); + MD4_STEP (MD4_Fo, c, d, a, b, w3[2], MD4C00, MD4S02); + MD4_STEP (MD4_Fo, b, c, d, a, w3[3], MD4C00, MD4S03); + + MD4_STEP (MD4_Go, a, b, c, d, w0[0], MD4C01, MD4S10); + MD4_STEP (MD4_Go, d, a, b, c, w1[0], MD4C01, MD4S11); + MD4_STEP (MD4_Go, c, d, a, b, w2[0], MD4C01, MD4S12); + MD4_STEP (MD4_Go, b, c, d, a, w3[0], MD4C01, MD4S13); + MD4_STEP (MD4_Go, a, b, c, d, w0[1], MD4C01, MD4S10); + MD4_STEP (MD4_Go, d, a, b, c, w1[1], MD4C01, MD4S11); + MD4_STEP (MD4_Go, c, d, a, b, w2[1], MD4C01, MD4S12); + MD4_STEP (MD4_Go, b, c, d, a, w3[1], MD4C01, MD4S13); + MD4_STEP (MD4_Go, a, b, c, d, w0[2], MD4C01, MD4S10); + MD4_STEP (MD4_Go, d, a, b, c, w1[2], MD4C01, MD4S11); + MD4_STEP (MD4_Go, c, d, a, b, w2[2], MD4C01, MD4S12); + MD4_STEP (MD4_Go, b, c, d, a, w3[2], MD4C01, MD4S13); + MD4_STEP (MD4_Go, a, b, c, d, w0[3], MD4C01, MD4S10); + MD4_STEP (MD4_Go, d, a, b, c, w1[3], MD4C01, MD4S11); + MD4_STEP (MD4_Go, c, d, a, b, w2[3], MD4C01, MD4S12); + MD4_STEP (MD4_Go, b, c, d, a, w3[3], MD4C01, MD4S13); + + MD4_STEP (MD4_H , a, b, c, d, w0[0], MD4C02, MD4S20); + MD4_STEP (MD4_H , d, a, b, c, w2[0], MD4C02, MD4S21); + MD4_STEP (MD4_H , c, d, a, b, w1[0], MD4C02, MD4S22); + MD4_STEP (MD4_H , b, c, d, a, w3[0], MD4C02, MD4S23); + MD4_STEP (MD4_H , a, b, c, d, w0[2], MD4C02, MD4S20); + MD4_STEP (MD4_H , d, a, b, c, w2[2], MD4C02, MD4S21); + MD4_STEP (MD4_H , c, d, a, b, w1[2], MD4C02, MD4S22); + MD4_STEP (MD4_H , b, c, d, a, w3[2], MD4C02, MD4S23); + MD4_STEP (MD4_H , a, b, c, d, w0[1], MD4C02, MD4S20); + MD4_STEP (MD4_H , d, a, b, c, w2[1], MD4C02, MD4S21); + MD4_STEP (MD4_H , c, d, a, b, w1[1], MD4C02, MD4S22); + MD4_STEP (MD4_H , b, c, d, a, w3[1], MD4C02, MD4S23); + MD4_STEP (MD4_H , a, b, c, d, w0[3], MD4C02, MD4S20); + MD4_STEP (MD4_H , d, a, b, c, w2[3], MD4C02, MD4S21); + MD4_STEP (MD4_H , c, d, a, b, w1[3], MD4C02, MD4S22); + MD4_STEP (MD4_H , b, c, d, a, w3[3], MD4C02, MD4S23); + + digest[0] += a; + digest[1] += b; + digest[2] += c; + digest[3] += d; +} + +static void md5_transform (const u32x w0[4], const u32x w1[4], const u32x w2[4], const u32x w3[4], u32x digest[4]) +{ + u32x a = digest[0]; + u32x b = digest[1]; + u32x c = digest[2]; + u32x d = digest[3]; + + u32x w0_t = w0[0]; + u32x w1_t = w0[1]; + u32x w2_t = w0[2]; + u32x w3_t = w0[3]; + u32x w4_t = w1[0]; + u32x w5_t = w1[1]; + u32x w6_t = w1[2]; + u32x w7_t = w1[3]; + u32x w8_t = w2[0]; + u32x w9_t = w2[1]; + u32x wa_t = w2[2]; + u32x wb_t = w2[3]; + u32x wc_t = w3[0]; + u32x wd_t = w3[1]; + u32x we_t = w3[2]; + u32x wf_t = w3[3]; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t, MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t, MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t, MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t, MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w4_t, MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w5_t, MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w6_t, MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w7_t, MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w8_t, MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w9_t, MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, wa_t, MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, wb_t, MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, wc_t, MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, wd_t, MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, we_t, MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, wf_t, MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w1_t, MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w6_t, MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, wb_t, MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t, MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w5_t, MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, wa_t, MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, wf_t, MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w4_t, MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w9_t, MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, we_t, MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t, MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w8_t, MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, wd_t, MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t, MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w7_t, MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, wc_t, MD5C1f, MD5S13); + + MD5_STEP (MD5_H , a, b, c, d, w5_t, MD5C20, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w8_t, MD5C21, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, wb_t, MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, we_t, MD5C23, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w1_t, MD5C24, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w4_t, MD5C25, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w7_t, MD5C26, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, wa_t, MD5C27, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, wd_t, MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w0_t, MD5C29, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w3_t, MD5C2a, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w6_t, MD5C2b, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w9_t, MD5C2c, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, wc_t, MD5C2d, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, wf_t, MD5C2e, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w2_t, MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t, MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w7_t, MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, we_t, MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w5_t, MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, wc_t, MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t, MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, wa_t, MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t, MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w8_t, MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, wf_t, MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w6_t, MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, wd_t, MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w4_t, MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, wb_t, MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t, MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w9_t, MD5C3f, MD5S33); + + digest[0] += a; + digest[1] += b; + digest[2] += c; + digest[3] += d; +} + +static void hmac_md5_pad (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], u32x ipad[4], u32x opad[4]) +{ + w0[0] = w0[0] ^ 0x36363636; + w0[1] = w0[1] ^ 0x36363636; + w0[2] = w0[2] ^ 0x36363636; + w0[3] = w0[3] ^ 0x36363636; + w1[0] = w1[0] ^ 0x36363636; + w1[1] = w1[1] ^ 0x36363636; + w1[2] = w1[2] ^ 0x36363636; + w1[3] = w1[3] ^ 0x36363636; + w2[0] = w2[0] ^ 0x36363636; + w2[1] = w2[1] ^ 0x36363636; + w2[2] = w2[2] ^ 0x36363636; + w2[3] = w2[3] ^ 0x36363636; + w3[0] = w3[0] ^ 0x36363636; + w3[1] = w3[1] ^ 0x36363636; + w3[2] = w3[2] ^ 0x36363636; + w3[3] = w3[3] ^ 0x36363636; + + ipad[0] = MD5M_A; + ipad[1] = MD5M_B; + ipad[2] = MD5M_C; + ipad[3] = MD5M_D; + + md5_transform (w0, w1, w2, w3, ipad); + + w0[0] = w0[0] ^ 0x6a6a6a6a; + w0[1] = w0[1] ^ 0x6a6a6a6a; + w0[2] = w0[2] ^ 0x6a6a6a6a; + w0[3] = w0[3] ^ 0x6a6a6a6a; + w1[0] = w1[0] ^ 0x6a6a6a6a; + w1[1] = w1[1] ^ 0x6a6a6a6a; + w1[2] = w1[2] ^ 0x6a6a6a6a; + w1[3] = w1[3] ^ 0x6a6a6a6a; + w2[0] = w2[0] ^ 0x6a6a6a6a; + w2[1] = w2[1] ^ 0x6a6a6a6a; + w2[2] = w2[2] ^ 0x6a6a6a6a; + w2[3] = w2[3] ^ 0x6a6a6a6a; + w3[0] = w3[0] ^ 0x6a6a6a6a; + w3[1] = w3[1] ^ 0x6a6a6a6a; + w3[2] = w3[2] ^ 0x6a6a6a6a; + w3[3] = w3[3] ^ 0x6a6a6a6a; + + opad[0] = MD5M_A; + opad[1] = MD5M_B; + opad[2] = MD5M_C; + opad[3] = MD5M_D; + + md5_transform (w0, w1, w2, w3, opad); +} + +static void hmac_md5_run (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], u32x ipad[4], u32x opad[4], u32x digest[4]) +{ + digest[0] = ipad[0]; + digest[1] = ipad[1]; + digest[2] = ipad[2]; + digest[3] = ipad[3]; + + md5_transform (w0, w1, w2, w3, digest); + + w0[0] = digest[0]; + w0[1] = digest[1]; + w0[2] = digest[2]; + w0[3] = digest[3]; + w1[0] = 0x80; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + w3[0] = 0; + w3[1] = 0; + w3[2] = (64 + 16) * 8; + w3[3] = 0; + + digest[0] = opad[0]; + digest[1] = opad[1]; + digest[2] = opad[2]; + digest[3] = opad[3]; + + md5_transform (w0, w1, w2, w3, digest); +} + +static void kerb_prepare (const u32x w0[4], const u32x w1[4], const u32 pw_len, const u32 checksum[4], u32x digest[4]) +{ + /** + * pads + */ + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + w0_t[0] = w0[0]; + w0_t[1] = w0[1]; + w0_t[2] = w0[2]; + w0_t[3] = w0[3]; + w1_t[0] = w1[0]; + w1_t[1] = w1[1]; + w1_t[2] = w1[2]; + w1_t[3] = w1[3]; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = 0; + + // K=MD4(Little_indian(UNICODE(pwd)) + + append_0x80_2 (w0_t, w1_t, pw_len); + + make_unicode (w1_t, w2_t, w3_t); + make_unicode (w0_t, w0_t, w1_t); + + w3_t[2] = pw_len * 8 * 2; + w3_t[3] = 0; + + digest[0] = MD4M_A; + digest[1] = MD4M_B; + digest[2] = MD4M_C; + digest[3] = MD4M_D; + + md4_transform (w0_t, w1_t, w2_t, w3_t, digest); + + // K1=MD5_HMAC(K,1); with 1 encoded as little indian on 4 bytes (01000000 in hexa); + + w0_t[0] = digest[0]; + w0_t[1] = digest[1]; + w0_t[2] = digest[2]; + w0_t[3] = digest[3]; + w1_t[0] = 0; + w1_t[1] = 0; + w1_t[2] = 0; + w1_t[3] = 0; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = 0; + + u32x ipad[4]; + u32x opad[4]; + + hmac_md5_pad (w0_t, w1_t, w2_t, w3_t, ipad, opad); + + w0_t[0] = 1; + w0_t[1] = 0x80; + w0_t[2] = 0; + w0_t[3] = 0; + w1_t[0] = 0; + w1_t[1] = 0; + w1_t[2] = 0; + w1_t[3] = 0; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = (64 + 4) * 8; + w3_t[3] = 0; + + hmac_md5_run (w0_t, w1_t, w2_t, w3_t, ipad, opad, digest); + + // K3=MD5_HMAC(K1,checksum); + + w0_t[0] = digest[0]; + w0_t[1] = digest[1]; + w0_t[2] = digest[2]; + w0_t[3] = digest[3]; + w1_t[0] = 0; + w1_t[1] = 0; + w1_t[2] = 0; + w1_t[3] = 0; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = 0; + + hmac_md5_pad (w0_t, w1_t, w2_t, w3_t, ipad, opad); + + w0_t[0] = checksum[0]; + w0_t[1] = checksum[1]; + w0_t[2] = checksum[2]; + w0_t[3] = checksum[3]; + w1_t[0] = 0x80; + w1_t[1] = 0; + w1_t[2] = 0; + w1_t[3] = 0; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = (64 + 16) * 8; + w3_t[3] = 0; + + hmac_md5_run (w0_t, w1_t, w2_t, w3_t, ipad, opad, digest); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m07500_m04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global krb5pa_t *krb5pa_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + __local RC4_KEY rc4_keys[64]; + + const u32 lid = get_local_id (0); + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + /** + * base + */ + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + u32x pw_buf1[4]; + + pw_buf1[0] = pws[gid].i[ 4]; + pw_buf1[1] = pws[gid].i[ 5]; + pw_buf1[2] = pws[gid].i[ 6]; + pw_buf1[3] = pws[gid].i[ 7]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * salt + */ + + u32 checksum[4]; + + checksum[0] = krb5pa_bufs[salt_pos].checksum[0]; + checksum[1] = krb5pa_bufs[salt_pos].checksum[1]; + checksum[2] = krb5pa_bufs[salt_pos].checksum[2]; + checksum[3] = krb5pa_bufs[salt_pos].checksum[3]; + + u32 timestamp_ct[8]; + + timestamp_ct[0] = krb5pa_bufs[salt_pos].timestamp[0]; + timestamp_ct[1] = krb5pa_bufs[salt_pos].timestamp[1]; + timestamp_ct[2] = krb5pa_bufs[salt_pos].timestamp[2]; + timestamp_ct[3] = krb5pa_bufs[salt_pos].timestamp[3]; + timestamp_ct[4] = krb5pa_bufs[salt_pos].timestamp[4]; + timestamp_ct[5] = krb5pa_bufs[salt_pos].timestamp[5]; + timestamp_ct[6] = krb5pa_bufs[salt_pos].timestamp[6]; + timestamp_ct[7] = krb5pa_bufs[salt_pos].timestamp[7]; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + + w0[0] = pw_buf0[0]; + w0[1] = pw_buf0[1]; + w0[2] = pw_buf0[2]; + w0[3] = pw_buf0[3]; + + u32x w1[4]; + + w1[0] = pw_buf1[0]; + w1[1] = pw_buf1[1]; + w1[2] = pw_buf1[2]; + w1[3] = pw_buf1[3]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 out_len = apply_rules (rules_buf[il_pos].cmds, w0, w1, pw_len); + + /** + * kerberos + */ + + u32x digest[4]; + + kerb_prepare (w0, w1, out_len, checksum, digest); + + u32 tmp[4]; + + #ifdef VECT_SIZE1 + + tmp[0] = digest[0]; + tmp[1] = digest[1]; + tmp[2] = digest[2]; + tmp[3] = digest[3]; + + if (decrypt_and_check (&rc4_keys[lid], tmp, timestamp_ct) == 1) + { + mark_hash_s0 (plains_buf, hashes_shown, digests_offset, gid, il_pos); + + d_return_buf[lid] = 1; + } + + #endif + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m07500_m08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global krb5pa_t *krb5pa_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m07500_m16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global krb5pa_t *krb5pa_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m07500_s04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global krb5pa_t *krb5pa_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + __local RC4_KEY rc4_keys[64]; + + const u32 lid = get_local_id (0); + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + /** + * base + */ + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + u32x pw_buf1[4]; + + pw_buf1[0] = pws[gid].i[ 4]; + pw_buf1[1] = pws[gid].i[ 5]; + pw_buf1[2] = pws[gid].i[ 6]; + pw_buf1[3] = pws[gid].i[ 7]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * salt + */ + + u32 checksum[4]; + + checksum[0] = krb5pa_bufs[salt_pos].checksum[0]; + checksum[1] = krb5pa_bufs[salt_pos].checksum[1]; + checksum[2] = krb5pa_bufs[salt_pos].checksum[2]; + checksum[3] = krb5pa_bufs[salt_pos].checksum[3]; + + u32 timestamp_ct[8]; + + timestamp_ct[0] = krb5pa_bufs[salt_pos].timestamp[0]; + timestamp_ct[1] = krb5pa_bufs[salt_pos].timestamp[1]; + timestamp_ct[2] = krb5pa_bufs[salt_pos].timestamp[2]; + timestamp_ct[3] = krb5pa_bufs[salt_pos].timestamp[3]; + timestamp_ct[4] = krb5pa_bufs[salt_pos].timestamp[4]; + timestamp_ct[5] = krb5pa_bufs[salt_pos].timestamp[5]; + timestamp_ct[6] = krb5pa_bufs[salt_pos].timestamp[6]; + timestamp_ct[7] = krb5pa_bufs[salt_pos].timestamp[7]; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + + w0[0] = pw_buf0[0]; + w0[1] = pw_buf0[1]; + w0[2] = pw_buf0[2]; + w0[3] = pw_buf0[3]; + + u32x w1[4]; + + w1[0] = pw_buf1[0]; + w1[1] = pw_buf1[1]; + w1[2] = pw_buf1[2]; + w1[3] = pw_buf1[3]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 out_len = apply_rules (rules_buf[il_pos].cmds, w0, w1, pw_len); + + /** + * kerberos + */ + + u32x digest[4]; + + kerb_prepare (w0, w1, out_len, checksum, digest); + + u32 tmp[4]; + + #ifdef VECT_SIZE1 + + tmp[0] = digest[0]; + tmp[1] = digest[1]; + tmp[2] = digest[2]; + tmp[3] = digest[3]; + + if (decrypt_and_check (&rc4_keys[lid], tmp, timestamp_ct) == 1) + { + mark_hash_s0 (plains_buf, hashes_shown, digests_offset, gid, il_pos); + + d_return_buf[lid] = 1; + } + + #endif + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m07500_s08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global krb5pa_t *krb5pa_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m07500_s16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global krb5pa_t *krb5pa_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/amd/m07500_a1.cl b/amd/m07500_a1.cl new file mode 100644 index 0000000000..ebbfb7446f --- /dev/null +++ b/amd/m07500_a1.cl @@ -0,0 +1,923 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _KRB5PA_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW4 +#define VECT_SIZE1 +#endif + +#ifdef VLIW5 +#define VECT_SIZE1 +#endif + +#define DGST_R0 3 +#define DGST_R1 7 +#define DGST_R2 2 +#define DGST_R3 6 + +#include "include/kernel_functions.c" +#include "types_amd.c" +#include "common_amd.c" + +typedef struct +{ + u8 S[256]; + + u8 i; + u8 j; + +} RC4_KEY; + +static void swap (__local RC4_KEY *rc4_key, const u8 i, const u8 j) +{ + u8 tmp; + + tmp = rc4_key->S[i]; + rc4_key->S[i] = rc4_key->S[j]; + rc4_key->S[j] = tmp; +} + +static void rc4_init_16 (__local RC4_KEY *rc4_key, const u32 data[4]) +{ + u32 i; + + #pragma unroll 256 + for (i = 0; i < 256; i += 1) rc4_key->S[i] = i; + + u8 j = 0; + + #pragma unroll 16 + for (i = 0; i < 256; i += 16) + { + u32 idx = i; + + u32 v; + + v = data[0]; + + j += rc4_key->S[idx] + (v >> 0); swap (rc4_key, idx, j); idx++; + j += rc4_key->S[idx] + (v >> 8); swap (rc4_key, idx, j); idx++; + j += rc4_key->S[idx] + (v >> 16); swap (rc4_key, idx, j); idx++; + j += rc4_key->S[idx] + (v >> 24); swap (rc4_key, idx, j); idx++; + + v = data[1]; + + j += rc4_key->S[idx] + (v >> 0); swap (rc4_key, idx, j); idx++; + j += rc4_key->S[idx] + (v >> 8); swap (rc4_key, idx, j); idx++; + j += rc4_key->S[idx] + (v >> 16); swap (rc4_key, idx, j); idx++; + j += rc4_key->S[idx] + (v >> 24); swap (rc4_key, idx, j); idx++; + + v = data[2]; + + j += rc4_key->S[idx] + (v >> 0); swap (rc4_key, idx, j); idx++; + j += rc4_key->S[idx] + (v >> 8); swap (rc4_key, idx, j); idx++; + j += rc4_key->S[idx] + (v >> 16); swap (rc4_key, idx, j); idx++; + j += rc4_key->S[idx] + (v >> 24); swap (rc4_key, idx, j); idx++; + + v = data[3]; + + j += rc4_key->S[idx] + (v >> 0); swap (rc4_key, idx, j); idx++; + j += rc4_key->S[idx] + (v >> 8); swap (rc4_key, idx, j); idx++; + j += rc4_key->S[idx] + (v >> 16); swap (rc4_key, idx, j); idx++; + j += rc4_key->S[idx] + (v >> 24); swap (rc4_key, idx, j); idx++; + } + + rc4_key->i = 0; + rc4_key->j = 0; +} + +static u32 rc4_next_4 (__local RC4_KEY *rc4_key, const u32 ct) +{ + u8 idx; + + u32 xor4 = 0; + + u8 i = rc4_key->i; + u8 j = rc4_key->j; + + i += 1; + j += rc4_key->S[i]; + + swap (rc4_key, i, j); + + idx = rc4_key->S[i] + rc4_key->S[j]; + + xor4 |= rc4_key->S[idx] << 0; + + i += 1; + j += rc4_key->S[i]; + + swap (rc4_key, i, j); + + idx = rc4_key->S[i] + rc4_key->S[j]; + + xor4 |= rc4_key->S[idx] << 8; + + i += 1; + j += rc4_key->S[i]; + + swap (rc4_key, i, j); + + idx = rc4_key->S[i] + rc4_key->S[j]; + + xor4 |= rc4_key->S[idx] << 16; + + i += 1; + j += rc4_key->S[i]; + + swap (rc4_key, i, j); + + idx = rc4_key->S[i] + rc4_key->S[j]; + + xor4 |= rc4_key->S[idx] << 24; + + rc4_key->i = i; + rc4_key->j = j; + + return ct ^ xor4; +} + +static int decrypt_and_check (__local RC4_KEY *rc4_key, u32 data[4], u32 timestamp_ct[8]) +{ + u32 pt; + + rc4_init_16 (rc4_key, data); + + pt = rc4_next_4 (rc4_key, timestamp_ct[0]); + pt = rc4_next_4 (rc4_key, timestamp_ct[1]); + pt = rc4_next_4 (rc4_key, timestamp_ct[2]); + pt = rc4_next_4 (rc4_key, timestamp_ct[3]); + + if ((pt & 0xffff0000) != 0x30320000) return 0; + + pt = rc4_next_4 (rc4_key, timestamp_ct[4]); + + if (((pt & 0xff) < '0') || ((pt & 0xff) > '9')) return 0; pt >>= 8; + if (((pt & 0xff) < '0') || ((pt & 0xff) > '9')) return 0; pt >>= 8; + if (((pt & 0xff) < '0') || ((pt & 0xff) > '9')) return 0; pt >>= 8; + if (((pt & 0xff) < '0') || ((pt & 0xff) > '9')) return 0; + + pt = rc4_next_4 (rc4_key, timestamp_ct[5]); + + if (((pt & 0xff) < '0') || ((pt & 0xff) > '9')) return 0; pt >>= 8; + if (((pt & 0xff) < '0') || ((pt & 0xff) > '9')) return 0; pt >>= 8; + if (((pt & 0xff) < '0') || ((pt & 0xff) > '9')) return 0; pt >>= 8; + if (((pt & 0xff) < '0') || ((pt & 0xff) > '9')) return 0; + + pt = rc4_next_4 (rc4_key, timestamp_ct[6]); + + if (((pt & 0xff) < '0') || ((pt & 0xff) > '9')) return 0; pt >>= 8; + if (((pt & 0xff) < '0') || ((pt & 0xff) > '9')) return 0; pt >>= 8; + if (((pt & 0xff) < '0') || ((pt & 0xff) > '9')) return 0; pt >>= 8; + if (((pt & 0xff) < '0') || ((pt & 0xff) > '9')) return 0; + + return 1; +} + +static void md4_transform (const u32x w0[4], const u32x w1[4], const u32x w2[4], const u32x w3[4], u32x digest[4]) +{ + u32x a = digest[0]; + u32x b = digest[1]; + u32x c = digest[2]; + u32x d = digest[3]; + + MD4_STEP (MD4_Fo, a, b, c, d, w0[0], MD4C00, MD4S00); + MD4_STEP (MD4_Fo, d, a, b, c, w0[1], MD4C00, MD4S01); + MD4_STEP (MD4_Fo, c, d, a, b, w0[2], MD4C00, MD4S02); + MD4_STEP (MD4_Fo, b, c, d, a, w0[3], MD4C00, MD4S03); + MD4_STEP (MD4_Fo, a, b, c, d, w1[0], MD4C00, MD4S00); + MD4_STEP (MD4_Fo, d, a, b, c, w1[1], MD4C00, MD4S01); + MD4_STEP (MD4_Fo, c, d, a, b, w1[2], MD4C00, MD4S02); + MD4_STEP (MD4_Fo, b, c, d, a, w1[3], MD4C00, MD4S03); + MD4_STEP (MD4_Fo, a, b, c, d, w2[0], MD4C00, MD4S00); + MD4_STEP (MD4_Fo, d, a, b, c, w2[1], MD4C00, MD4S01); + MD4_STEP (MD4_Fo, c, d, a, b, w2[2], MD4C00, MD4S02); + MD4_STEP (MD4_Fo, b, c, d, a, w2[3], MD4C00, MD4S03); + MD4_STEP (MD4_Fo, a, b, c, d, w3[0], MD4C00, MD4S00); + MD4_STEP (MD4_Fo, d, a, b, c, w3[1], MD4C00, MD4S01); + MD4_STEP (MD4_Fo, c, d, a, b, w3[2], MD4C00, MD4S02); + MD4_STEP (MD4_Fo, b, c, d, a, w3[3], MD4C00, MD4S03); + + MD4_STEP (MD4_Go, a, b, c, d, w0[0], MD4C01, MD4S10); + MD4_STEP (MD4_Go, d, a, b, c, w1[0], MD4C01, MD4S11); + MD4_STEP (MD4_Go, c, d, a, b, w2[0], MD4C01, MD4S12); + MD4_STEP (MD4_Go, b, c, d, a, w3[0], MD4C01, MD4S13); + MD4_STEP (MD4_Go, a, b, c, d, w0[1], MD4C01, MD4S10); + MD4_STEP (MD4_Go, d, a, b, c, w1[1], MD4C01, MD4S11); + MD4_STEP (MD4_Go, c, d, a, b, w2[1], MD4C01, MD4S12); + MD4_STEP (MD4_Go, b, c, d, a, w3[1], MD4C01, MD4S13); + MD4_STEP (MD4_Go, a, b, c, d, w0[2], MD4C01, MD4S10); + MD4_STEP (MD4_Go, d, a, b, c, w1[2], MD4C01, MD4S11); + MD4_STEP (MD4_Go, c, d, a, b, w2[2], MD4C01, MD4S12); + MD4_STEP (MD4_Go, b, c, d, a, w3[2], MD4C01, MD4S13); + MD4_STEP (MD4_Go, a, b, c, d, w0[3], MD4C01, MD4S10); + MD4_STEP (MD4_Go, d, a, b, c, w1[3], MD4C01, MD4S11); + MD4_STEP (MD4_Go, c, d, a, b, w2[3], MD4C01, MD4S12); + MD4_STEP (MD4_Go, b, c, d, a, w3[3], MD4C01, MD4S13); + + MD4_STEP (MD4_H , a, b, c, d, w0[0], MD4C02, MD4S20); + MD4_STEP (MD4_H , d, a, b, c, w2[0], MD4C02, MD4S21); + MD4_STEP (MD4_H , c, d, a, b, w1[0], MD4C02, MD4S22); + MD4_STEP (MD4_H , b, c, d, a, w3[0], MD4C02, MD4S23); + MD4_STEP (MD4_H , a, b, c, d, w0[2], MD4C02, MD4S20); + MD4_STEP (MD4_H , d, a, b, c, w2[2], MD4C02, MD4S21); + MD4_STEP (MD4_H , c, d, a, b, w1[2], MD4C02, MD4S22); + MD4_STEP (MD4_H , b, c, d, a, w3[2], MD4C02, MD4S23); + MD4_STEP (MD4_H , a, b, c, d, w0[1], MD4C02, MD4S20); + MD4_STEP (MD4_H , d, a, b, c, w2[1], MD4C02, MD4S21); + MD4_STEP (MD4_H , c, d, a, b, w1[1], MD4C02, MD4S22); + MD4_STEP (MD4_H , b, c, d, a, w3[1], MD4C02, MD4S23); + MD4_STEP (MD4_H , a, b, c, d, w0[3], MD4C02, MD4S20); + MD4_STEP (MD4_H , d, a, b, c, w2[3], MD4C02, MD4S21); + MD4_STEP (MD4_H , c, d, a, b, w1[3], MD4C02, MD4S22); + MD4_STEP (MD4_H , b, c, d, a, w3[3], MD4C02, MD4S23); + + digest[0] += a; + digest[1] += b; + digest[2] += c; + digest[3] += d; +} + +static void md5_transform (const u32x w0[4], const u32x w1[4], const u32x w2[4], const u32x w3[4], u32x digest[4]) +{ + u32x a = digest[0]; + u32x b = digest[1]; + u32x c = digest[2]; + u32x d = digest[3]; + + u32x w0_t = w0[0]; + u32x w1_t = w0[1]; + u32x w2_t = w0[2]; + u32x w3_t = w0[3]; + u32x w4_t = w1[0]; + u32x w5_t = w1[1]; + u32x w6_t = w1[2]; + u32x w7_t = w1[3]; + u32x w8_t = w2[0]; + u32x w9_t = w2[1]; + u32x wa_t = w2[2]; + u32x wb_t = w2[3]; + u32x wc_t = w3[0]; + u32x wd_t = w3[1]; + u32x we_t = w3[2]; + u32x wf_t = w3[3]; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t, MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t, MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t, MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t, MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w4_t, MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w5_t, MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w6_t, MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w7_t, MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w8_t, MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w9_t, MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, wa_t, MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, wb_t, MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, wc_t, MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, wd_t, MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, we_t, MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, wf_t, MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w1_t, MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w6_t, MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, wb_t, MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t, MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w5_t, MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, wa_t, MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, wf_t, MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w4_t, MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w9_t, MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, we_t, MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t, MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w8_t, MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, wd_t, MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t, MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w7_t, MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, wc_t, MD5C1f, MD5S13); + + MD5_STEP (MD5_H , a, b, c, d, w5_t, MD5C20, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w8_t, MD5C21, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, wb_t, MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, we_t, MD5C23, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w1_t, MD5C24, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w4_t, MD5C25, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w7_t, MD5C26, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, wa_t, MD5C27, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, wd_t, MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w0_t, MD5C29, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w3_t, MD5C2a, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w6_t, MD5C2b, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w9_t, MD5C2c, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, wc_t, MD5C2d, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, wf_t, MD5C2e, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w2_t, MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t, MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w7_t, MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, we_t, MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w5_t, MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, wc_t, MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t, MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, wa_t, MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t, MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w8_t, MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, wf_t, MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w6_t, MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, wd_t, MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w4_t, MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, wb_t, MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t, MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w9_t, MD5C3f, MD5S33); + + digest[0] += a; + digest[1] += b; + digest[2] += c; + digest[3] += d; +} + +static void hmac_md5_pad (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], u32x ipad[4], u32x opad[4]) +{ + w0[0] = w0[0] ^ 0x36363636; + w0[1] = w0[1] ^ 0x36363636; + w0[2] = w0[2] ^ 0x36363636; + w0[3] = w0[3] ^ 0x36363636; + w1[0] = w1[0] ^ 0x36363636; + w1[1] = w1[1] ^ 0x36363636; + w1[2] = w1[2] ^ 0x36363636; + w1[3] = w1[3] ^ 0x36363636; + w2[0] = w2[0] ^ 0x36363636; + w2[1] = w2[1] ^ 0x36363636; + w2[2] = w2[2] ^ 0x36363636; + w2[3] = w2[3] ^ 0x36363636; + w3[0] = w3[0] ^ 0x36363636; + w3[1] = w3[1] ^ 0x36363636; + w3[2] = w3[2] ^ 0x36363636; + w3[3] = w3[3] ^ 0x36363636; + + ipad[0] = MD5M_A; + ipad[1] = MD5M_B; + ipad[2] = MD5M_C; + ipad[3] = MD5M_D; + + md5_transform (w0, w1, w2, w3, ipad); + + w0[0] = w0[0] ^ 0x6a6a6a6a; + w0[1] = w0[1] ^ 0x6a6a6a6a; + w0[2] = w0[2] ^ 0x6a6a6a6a; + w0[3] = w0[3] ^ 0x6a6a6a6a; + w1[0] = w1[0] ^ 0x6a6a6a6a; + w1[1] = w1[1] ^ 0x6a6a6a6a; + w1[2] = w1[2] ^ 0x6a6a6a6a; + w1[3] = w1[3] ^ 0x6a6a6a6a; + w2[0] = w2[0] ^ 0x6a6a6a6a; + w2[1] = w2[1] ^ 0x6a6a6a6a; + w2[2] = w2[2] ^ 0x6a6a6a6a; + w2[3] = w2[3] ^ 0x6a6a6a6a; + w3[0] = w3[0] ^ 0x6a6a6a6a; + w3[1] = w3[1] ^ 0x6a6a6a6a; + w3[2] = w3[2] ^ 0x6a6a6a6a; + w3[3] = w3[3] ^ 0x6a6a6a6a; + + opad[0] = MD5M_A; + opad[1] = MD5M_B; + opad[2] = MD5M_C; + opad[3] = MD5M_D; + + md5_transform (w0, w1, w2, w3, opad); +} + +static void hmac_md5_run (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], u32x ipad[4], u32x opad[4], u32x digest[4]) +{ + digest[0] = ipad[0]; + digest[1] = ipad[1]; + digest[2] = ipad[2]; + digest[3] = ipad[3]; + + md5_transform (w0, w1, w2, w3, digest); + + w0[0] = digest[0]; + w0[1] = digest[1]; + w0[2] = digest[2]; + w0[3] = digest[3]; + w1[0] = 0x80; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + w3[0] = 0; + w3[1] = 0; + w3[2] = (64 + 16) * 8; + w3[3] = 0; + + digest[0] = opad[0]; + digest[1] = opad[1]; + digest[2] = opad[2]; + digest[3] = opad[3]; + + md5_transform (w0, w1, w2, w3, digest); +} + +static void kerb_prepare (const u32x w0[4], const u32x w1[4], const u32 pw_len, const u32 checksum[4], u32x digest[4]) +{ + /** + * pads + */ + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + w0_t[0] = w0[0]; + w0_t[1] = w0[1]; + w0_t[2] = w0[2]; + w0_t[3] = w0[3]; + w1_t[0] = w1[0]; + w1_t[1] = w1[1]; + w1_t[2] = w1[2]; + w1_t[3] = w1[3]; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = 0; + + // K=MD4(Little_indian(UNICODE(pwd)) + + append_0x80_2 (w0_t, w1_t, pw_len); + + make_unicode (w1_t, w2_t, w3_t); + make_unicode (w0_t, w0_t, w1_t); + + w3_t[2] = pw_len * 8 * 2; + w3_t[3] = 0; + + digest[0] = MD4M_A; + digest[1] = MD4M_B; + digest[2] = MD4M_C; + digest[3] = MD4M_D; + + md4_transform (w0_t, w1_t, w2_t, w3_t, digest); + + // K1=MD5_HMAC(K,1); with 1 encoded as little indian on 4 bytes (01000000 in hexa); + + w0_t[0] = digest[0]; + w0_t[1] = digest[1]; + w0_t[2] = digest[2]; + w0_t[3] = digest[3]; + w1_t[0] = 0; + w1_t[1] = 0; + w1_t[2] = 0; + w1_t[3] = 0; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = 0; + + u32x ipad[4]; + u32x opad[4]; + + hmac_md5_pad (w0_t, w1_t, w2_t, w3_t, ipad, opad); + + w0_t[0] = 1; + w0_t[1] = 0x80; + w0_t[2] = 0; + w0_t[3] = 0; + w1_t[0] = 0; + w1_t[1] = 0; + w1_t[2] = 0; + w1_t[3] = 0; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = (64 + 4) * 8; + w3_t[3] = 0; + + hmac_md5_run (w0_t, w1_t, w2_t, w3_t, ipad, opad, digest); + + // K3=MD5_HMAC(K1,checksum); + + w0_t[0] = digest[0]; + w0_t[1] = digest[1]; + w0_t[2] = digest[2]; + w0_t[3] = digest[3]; + w1_t[0] = 0; + w1_t[1] = 0; + w1_t[2] = 0; + w1_t[3] = 0; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = 0; + + hmac_md5_pad (w0_t, w1_t, w2_t, w3_t, ipad, opad); + + w0_t[0] = checksum[0]; + w0_t[1] = checksum[1]; + w0_t[2] = checksum[2]; + w0_t[3] = checksum[3]; + w1_t[0] = 0x80; + w1_t[1] = 0; + w1_t[2] = 0; + w1_t[3] = 0; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = (64 + 16) * 8; + w3_t[3] = 0; + + hmac_md5_run (w0_t, w1_t, w2_t, w3_t, ipad, opad, digest); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m07500_m04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global krb5pa_t *krb5pa_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + __local RC4_KEY rc4_keys[64]; + + const u32 gid = get_global_id (0); + const u32 lid = get_local_id (0); + + if (gid >= gid_max) return; + + /** + * base + */ + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, combs_buf[0].pw_len); + } + + /** + * salt + */ + + u32 checksum[4]; + + checksum[0] = krb5pa_bufs[salt_pos].checksum[0]; + checksum[1] = krb5pa_bufs[salt_pos].checksum[1]; + checksum[2] = krb5pa_bufs[salt_pos].checksum[2]; + checksum[3] = krb5pa_bufs[salt_pos].checksum[3]; + + u32 timestamp_ct[8]; + + timestamp_ct[0] = krb5pa_bufs[salt_pos].timestamp[0]; + timestamp_ct[1] = krb5pa_bufs[salt_pos].timestamp[1]; + timestamp_ct[2] = krb5pa_bufs[salt_pos].timestamp[2]; + timestamp_ct[3] = krb5pa_bufs[salt_pos].timestamp[3]; + timestamp_ct[4] = krb5pa_bufs[salt_pos].timestamp[4]; + timestamp_ct[5] = krb5pa_bufs[salt_pos].timestamp[5]; + timestamp_ct[6] = krb5pa_bufs[salt_pos].timestamp[6]; + timestamp_ct[7] = krb5pa_bufs[salt_pos].timestamp[7]; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = combs_buf[il_pos].pw_len; + + const u32 pw_len = pw_l_len + pw_r_len; + + u32 wordr0[4]; + + wordr0[0] = combs_buf[il_pos].i[0]; + wordr0[1] = combs_buf[il_pos].i[1]; + wordr0[2] = combs_buf[il_pos].i[2]; + wordr0[3] = combs_buf[il_pos].i[3]; + + u32 wordr1[4]; + + wordr1[0] = combs_buf[il_pos].i[4]; + wordr1[1] = combs_buf[il_pos].i[5]; + wordr1[2] = combs_buf[il_pos].i[6]; + wordr1[3] = combs_buf[il_pos].i[7]; + + u32 wordr2[4]; + + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + + u32 wordr3[4]; + + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + u32x w0[4]; + + w0[0] = wordl0[0] | wordr0[0]; + w0[1] = wordl0[1] | wordr0[1]; + w0[2] = wordl0[2] | wordr0[2]; + w0[3] = wordl0[3] | wordr0[3]; + + u32x w1[4]; + + w1[0] = wordl1[0] | wordr1[0]; + w1[1] = wordl1[1] | wordr1[1]; + w1[2] = wordl1[2] | wordr1[2]; + w1[3] = wordl1[3] | wordr1[3]; + + u32x w2[4]; + + w2[0] = wordl2[0] | wordr2[0]; + w2[1] = wordl2[1] | wordr2[1]; + w2[2] = wordl2[2] | wordr2[2]; + w2[3] = wordl2[3] | wordr2[3]; + + u32x w3[4]; + + w3[0] = wordl3[0] | wordr3[0]; + w3[1] = wordl3[1] | wordr3[1]; + w3[2] = 0; + w3[3] = 0; + + /** + * kerberos + */ + + u32x digest[4]; + + kerb_prepare (w0, w1, pw_len, checksum, digest); + + u32 tmp[4]; + + #ifdef VECT_SIZE1 + + tmp[0] = digest[0]; + tmp[1] = digest[1]; + tmp[2] = digest[2]; + tmp[3] = digest[3]; + + if (decrypt_and_check (&rc4_keys[lid], tmp, timestamp_ct) == 1) + { + mark_hash_s0 (plains_buf, hashes_shown, digests_offset, gid, il_pos); + + d_return_buf[lid] = 1; + } + + #endif + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m07500_m08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global krb5pa_t *krb5pa_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m07500_m16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global krb5pa_t *krb5pa_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m07500_s04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global krb5pa_t *krb5pa_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + __local RC4_KEY rc4_keys[64]; + + const u32 gid = get_global_id (0); + const u32 lid = get_local_id (0); + + if (gid >= gid_max) return; + + /** + * base + */ + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, combs_buf[0].pw_len); + } + + /** + * salt + */ + + u32 checksum[4]; + + checksum[0] = krb5pa_bufs[salt_pos].checksum[0]; + checksum[1] = krb5pa_bufs[salt_pos].checksum[1]; + checksum[2] = krb5pa_bufs[salt_pos].checksum[2]; + checksum[3] = krb5pa_bufs[salt_pos].checksum[3]; + + u32 timestamp_ct[8]; + + timestamp_ct[0] = krb5pa_bufs[salt_pos].timestamp[0]; + timestamp_ct[1] = krb5pa_bufs[salt_pos].timestamp[1]; + timestamp_ct[2] = krb5pa_bufs[salt_pos].timestamp[2]; + timestamp_ct[3] = krb5pa_bufs[salt_pos].timestamp[3]; + timestamp_ct[4] = krb5pa_bufs[salt_pos].timestamp[4]; + timestamp_ct[5] = krb5pa_bufs[salt_pos].timestamp[5]; + timestamp_ct[6] = krb5pa_bufs[salt_pos].timestamp[6]; + timestamp_ct[7] = krb5pa_bufs[salt_pos].timestamp[7]; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = combs_buf[il_pos].pw_len; + + const u32 pw_len = pw_l_len + pw_r_len; + + u32 wordr0[4]; + + wordr0[0] = combs_buf[il_pos].i[0]; + wordr0[1] = combs_buf[il_pos].i[1]; + wordr0[2] = combs_buf[il_pos].i[2]; + wordr0[3] = combs_buf[il_pos].i[3]; + + u32 wordr1[4]; + + wordr1[0] = combs_buf[il_pos].i[4]; + wordr1[1] = combs_buf[il_pos].i[5]; + wordr1[2] = combs_buf[il_pos].i[6]; + wordr1[3] = combs_buf[il_pos].i[7]; + + u32 wordr2[4]; + + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + + u32 wordr3[4]; + + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + u32x w0[4]; + + w0[0] = wordl0[0] | wordr0[0]; + w0[1] = wordl0[1] | wordr0[1]; + w0[2] = wordl0[2] | wordr0[2]; + w0[3] = wordl0[3] | wordr0[3]; + + u32x w1[4]; + + w1[0] = wordl1[0] | wordr1[0]; + w1[1] = wordl1[1] | wordr1[1]; + w1[2] = wordl1[2] | wordr1[2]; + w1[3] = wordl1[3] | wordr1[3]; + + u32x w2[4]; + + w2[0] = wordl2[0] | wordr2[0]; + w2[1] = wordl2[1] | wordr2[1]; + w2[2] = wordl2[2] | wordr2[2]; + w2[3] = wordl2[3] | wordr2[3]; + + u32x w3[4]; + + w3[0] = wordl3[0] | wordr3[0]; + w3[1] = wordl3[1] | wordr3[1]; + w3[2] = 0; + w3[3] = 0; + + /** + * kerberos + */ + + u32x digest[4]; + + kerb_prepare (w0, w1, pw_len, checksum, digest); + + u32 tmp[4]; + + #ifdef VECT_SIZE1 + + tmp[0] = digest[0]; + tmp[1] = digest[1]; + tmp[2] = digest[2]; + tmp[3] = digest[3]; + + if (decrypt_and_check (&rc4_keys[lid], tmp, timestamp_ct) == 1) + { + mark_hash_s0 (plains_buf, hashes_shown, digests_offset, gid, il_pos); + + d_return_buf[lid] = 1; + } + + #endif + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m07500_s08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global krb5pa_t *krb5pa_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m07500_s16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global krb5pa_t *krb5pa_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/amd/m07500_a3.cl b/amd/m07500_a3.cl new file mode 100644 index 0000000000..fc2c83db03 --- /dev/null +++ b/amd/m07500_a3.cl @@ -0,0 +1,836 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _KRB5PA_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW4 +#define VECT_SIZE1 +#endif + +#ifdef VLIW5 +#define VECT_SIZE1 +#endif + +#define DGST_R0 3 +#define DGST_R1 7 +#define DGST_R2 2 +#define DGST_R3 6 + +#include "include/kernel_functions.c" +#include "types_amd.c" +#include "common_amd.c" + +typedef struct +{ + u8 S[256]; + + u8 i; + u8 j; + +} RC4_KEY; + +static void swap (__local RC4_KEY *rc4_key, const u8 i, const u8 j) +{ + u8 tmp; + + tmp = rc4_key->S[i]; + rc4_key->S[i] = rc4_key->S[j]; + rc4_key->S[j] = tmp; +} + +static void rc4_init_16 (__local RC4_KEY *rc4_key, const u32 data[4]) +{ + u32 i; + + #pragma unroll 256 + for (i = 0; i < 256; i += 1) rc4_key->S[i] = i; + + u8 j = 0; + + #pragma unroll 16 + for (i = 0; i < 256; i += 16) + { + u32 idx = i; + + u32 v; + + v = data[0]; + + j += rc4_key->S[idx] + (v >> 0); swap (rc4_key, idx, j); idx++; + j += rc4_key->S[idx] + (v >> 8); swap (rc4_key, idx, j); idx++; + j += rc4_key->S[idx] + (v >> 16); swap (rc4_key, idx, j); idx++; + j += rc4_key->S[idx] + (v >> 24); swap (rc4_key, idx, j); idx++; + + v = data[1]; + + j += rc4_key->S[idx] + (v >> 0); swap (rc4_key, idx, j); idx++; + j += rc4_key->S[idx] + (v >> 8); swap (rc4_key, idx, j); idx++; + j += rc4_key->S[idx] + (v >> 16); swap (rc4_key, idx, j); idx++; + j += rc4_key->S[idx] + (v >> 24); swap (rc4_key, idx, j); idx++; + + v = data[2]; + + j += rc4_key->S[idx] + (v >> 0); swap (rc4_key, idx, j); idx++; + j += rc4_key->S[idx] + (v >> 8); swap (rc4_key, idx, j); idx++; + j += rc4_key->S[idx] + (v >> 16); swap (rc4_key, idx, j); idx++; + j += rc4_key->S[idx] + (v >> 24); swap (rc4_key, idx, j); idx++; + + v = data[3]; + + j += rc4_key->S[idx] + (v >> 0); swap (rc4_key, idx, j); idx++; + j += rc4_key->S[idx] + (v >> 8); swap (rc4_key, idx, j); idx++; + j += rc4_key->S[idx] + (v >> 16); swap (rc4_key, idx, j); idx++; + j += rc4_key->S[idx] + (v >> 24); swap (rc4_key, idx, j); idx++; + } + + rc4_key->i = 0; + rc4_key->j = 0; +} + +static u32 rc4_next_4 (__local RC4_KEY *rc4_key, const u32 ct) +{ + u8 idx; + + u32 xor4 = 0; + + u8 i = rc4_key->i; + u8 j = rc4_key->j; + + i += 1; + j += rc4_key->S[i]; + + swap (rc4_key, i, j); + + idx = rc4_key->S[i] + rc4_key->S[j]; + + xor4 |= rc4_key->S[idx] << 0; + + i += 1; + j += rc4_key->S[i]; + + swap (rc4_key, i, j); + + idx = rc4_key->S[i] + rc4_key->S[j]; + + xor4 |= rc4_key->S[idx] << 8; + + i += 1; + j += rc4_key->S[i]; + + swap (rc4_key, i, j); + + idx = rc4_key->S[i] + rc4_key->S[j]; + + xor4 |= rc4_key->S[idx] << 16; + + i += 1; + j += rc4_key->S[i]; + + swap (rc4_key, i, j); + + idx = rc4_key->S[i] + rc4_key->S[j]; + + xor4 |= rc4_key->S[idx] << 24; + + rc4_key->i = i; + rc4_key->j = j; + + return ct ^ xor4; +} + +static int decrypt_and_check (__local RC4_KEY *rc4_key, u32 data[4], u32 timestamp_ct[8]) +{ + u32 pt; + + rc4_init_16 (rc4_key, data); + + pt = rc4_next_4 (rc4_key, timestamp_ct[0]); + pt = rc4_next_4 (rc4_key, timestamp_ct[1]); + pt = rc4_next_4 (rc4_key, timestamp_ct[2]); + pt = rc4_next_4 (rc4_key, timestamp_ct[3]); + + if ((pt & 0xffff0000) != 0x30320000) return 0; + + pt = rc4_next_4 (rc4_key, timestamp_ct[4]); + + if (((pt & 0xff) < '0') || ((pt & 0xff) > '9')) return 0; pt >>= 8; + if (((pt & 0xff) < '0') || ((pt & 0xff) > '9')) return 0; pt >>= 8; + if (((pt & 0xff) < '0') || ((pt & 0xff) > '9')) return 0; pt >>= 8; + if (((pt & 0xff) < '0') || ((pt & 0xff) > '9')) return 0; + + pt = rc4_next_4 (rc4_key, timestamp_ct[5]); + + if (((pt & 0xff) < '0') || ((pt & 0xff) > '9')) return 0; pt >>= 8; + if (((pt & 0xff) < '0') || ((pt & 0xff) > '9')) return 0; pt >>= 8; + if (((pt & 0xff) < '0') || ((pt & 0xff) > '9')) return 0; pt >>= 8; + if (((pt & 0xff) < '0') || ((pt & 0xff) > '9')) return 0; + + pt = rc4_next_4 (rc4_key, timestamp_ct[6]); + + if (((pt & 0xff) < '0') || ((pt & 0xff) > '9')) return 0; pt >>= 8; + if (((pt & 0xff) < '0') || ((pt & 0xff) > '9')) return 0; pt >>= 8; + if (((pt & 0xff) < '0') || ((pt & 0xff) > '9')) return 0; pt >>= 8; + if (((pt & 0xff) < '0') || ((pt & 0xff) > '9')) return 0; + + return 1; +} + +static void md4_transform (const u32x w0[4], const u32x w1[4], const u32x w2[4], const u32x w3[4], u32x digest[4]) +{ + u32x a = digest[0]; + u32x b = digest[1]; + u32x c = digest[2]; + u32x d = digest[3]; + + MD4_STEP (MD4_Fo, a, b, c, d, w0[0], MD4C00, MD4S00); + MD4_STEP (MD4_Fo, d, a, b, c, w0[1], MD4C00, MD4S01); + MD4_STEP (MD4_Fo, c, d, a, b, w0[2], MD4C00, MD4S02); + MD4_STEP (MD4_Fo, b, c, d, a, w0[3], MD4C00, MD4S03); + MD4_STEP (MD4_Fo, a, b, c, d, w1[0], MD4C00, MD4S00); + MD4_STEP (MD4_Fo, d, a, b, c, w1[1], MD4C00, MD4S01); + MD4_STEP (MD4_Fo, c, d, a, b, w1[2], MD4C00, MD4S02); + MD4_STEP (MD4_Fo, b, c, d, a, w1[3], MD4C00, MD4S03); + MD4_STEP (MD4_Fo, a, b, c, d, w2[0], MD4C00, MD4S00); + MD4_STEP (MD4_Fo, d, a, b, c, w2[1], MD4C00, MD4S01); + MD4_STEP (MD4_Fo, c, d, a, b, w2[2], MD4C00, MD4S02); + MD4_STEP (MD4_Fo, b, c, d, a, w2[3], MD4C00, MD4S03); + MD4_STEP (MD4_Fo, a, b, c, d, w3[0], MD4C00, MD4S00); + MD4_STEP (MD4_Fo, d, a, b, c, w3[1], MD4C00, MD4S01); + MD4_STEP (MD4_Fo, c, d, a, b, w3[2], MD4C00, MD4S02); + MD4_STEP (MD4_Fo, b, c, d, a, w3[3], MD4C00, MD4S03); + + MD4_STEP (MD4_Go, a, b, c, d, w0[0], MD4C01, MD4S10); + MD4_STEP (MD4_Go, d, a, b, c, w1[0], MD4C01, MD4S11); + MD4_STEP (MD4_Go, c, d, a, b, w2[0], MD4C01, MD4S12); + MD4_STEP (MD4_Go, b, c, d, a, w3[0], MD4C01, MD4S13); + MD4_STEP (MD4_Go, a, b, c, d, w0[1], MD4C01, MD4S10); + MD4_STEP (MD4_Go, d, a, b, c, w1[1], MD4C01, MD4S11); + MD4_STEP (MD4_Go, c, d, a, b, w2[1], MD4C01, MD4S12); + MD4_STEP (MD4_Go, b, c, d, a, w3[1], MD4C01, MD4S13); + MD4_STEP (MD4_Go, a, b, c, d, w0[2], MD4C01, MD4S10); + MD4_STEP (MD4_Go, d, a, b, c, w1[2], MD4C01, MD4S11); + MD4_STEP (MD4_Go, c, d, a, b, w2[2], MD4C01, MD4S12); + MD4_STEP (MD4_Go, b, c, d, a, w3[2], MD4C01, MD4S13); + MD4_STEP (MD4_Go, a, b, c, d, w0[3], MD4C01, MD4S10); + MD4_STEP (MD4_Go, d, a, b, c, w1[3], MD4C01, MD4S11); + MD4_STEP (MD4_Go, c, d, a, b, w2[3], MD4C01, MD4S12); + MD4_STEP (MD4_Go, b, c, d, a, w3[3], MD4C01, MD4S13); + + MD4_STEP (MD4_H , a, b, c, d, w0[0], MD4C02, MD4S20); + MD4_STEP (MD4_H , d, a, b, c, w2[0], MD4C02, MD4S21); + MD4_STEP (MD4_H , c, d, a, b, w1[0], MD4C02, MD4S22); + MD4_STEP (MD4_H , b, c, d, a, w3[0], MD4C02, MD4S23); + MD4_STEP (MD4_H , a, b, c, d, w0[2], MD4C02, MD4S20); + MD4_STEP (MD4_H , d, a, b, c, w2[2], MD4C02, MD4S21); + MD4_STEP (MD4_H , c, d, a, b, w1[2], MD4C02, MD4S22); + MD4_STEP (MD4_H , b, c, d, a, w3[2], MD4C02, MD4S23); + MD4_STEP (MD4_H , a, b, c, d, w0[1], MD4C02, MD4S20); + MD4_STEP (MD4_H , d, a, b, c, w2[1], MD4C02, MD4S21); + MD4_STEP (MD4_H , c, d, a, b, w1[1], MD4C02, MD4S22); + MD4_STEP (MD4_H , b, c, d, a, w3[1], MD4C02, MD4S23); + MD4_STEP (MD4_H , a, b, c, d, w0[3], MD4C02, MD4S20); + MD4_STEP (MD4_H , d, a, b, c, w2[3], MD4C02, MD4S21); + MD4_STEP (MD4_H , c, d, a, b, w1[3], MD4C02, MD4S22); + MD4_STEP (MD4_H , b, c, d, a, w3[3], MD4C02, MD4S23); + + digest[0] += a; + digest[1] += b; + digest[2] += c; + digest[3] += d; +} + +static void md5_transform (const u32x w0[4], const u32x w1[4], const u32x w2[4], const u32x w3[4], u32x digest[4]) +{ + u32x a = digest[0]; + u32x b = digest[1]; + u32x c = digest[2]; + u32x d = digest[3]; + + u32x w0_t = w0[0]; + u32x w1_t = w0[1]; + u32x w2_t = w0[2]; + u32x w3_t = w0[3]; + u32x w4_t = w1[0]; + u32x w5_t = w1[1]; + u32x w6_t = w1[2]; + u32x w7_t = w1[3]; + u32x w8_t = w2[0]; + u32x w9_t = w2[1]; + u32x wa_t = w2[2]; + u32x wb_t = w2[3]; + u32x wc_t = w3[0]; + u32x wd_t = w3[1]; + u32x we_t = w3[2]; + u32x wf_t = w3[3]; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t, MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t, MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t, MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t, MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w4_t, MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w5_t, MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w6_t, MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w7_t, MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w8_t, MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w9_t, MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, wa_t, MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, wb_t, MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, wc_t, MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, wd_t, MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, we_t, MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, wf_t, MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w1_t, MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w6_t, MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, wb_t, MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t, MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w5_t, MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, wa_t, MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, wf_t, MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w4_t, MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w9_t, MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, we_t, MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t, MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w8_t, MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, wd_t, MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t, MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w7_t, MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, wc_t, MD5C1f, MD5S13); + + MD5_STEP (MD5_H , a, b, c, d, w5_t, MD5C20, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w8_t, MD5C21, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, wb_t, MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, we_t, MD5C23, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w1_t, MD5C24, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w4_t, MD5C25, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w7_t, MD5C26, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, wa_t, MD5C27, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, wd_t, MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w0_t, MD5C29, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w3_t, MD5C2a, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w6_t, MD5C2b, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w9_t, MD5C2c, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, wc_t, MD5C2d, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, wf_t, MD5C2e, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w2_t, MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t, MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w7_t, MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, we_t, MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w5_t, MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, wc_t, MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t, MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, wa_t, MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t, MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w8_t, MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, wf_t, MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w6_t, MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, wd_t, MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w4_t, MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, wb_t, MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t, MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w9_t, MD5C3f, MD5S33); + + digest[0] += a; + digest[1] += b; + digest[2] += c; + digest[3] += d; +} + +static void hmac_md5_pad (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], u32x ipad[4], u32x opad[4]) +{ + w0[0] = w0[0] ^ 0x36363636; + w0[1] = w0[1] ^ 0x36363636; + w0[2] = w0[2] ^ 0x36363636; + w0[3] = w0[3] ^ 0x36363636; + w1[0] = w1[0] ^ 0x36363636; + w1[1] = w1[1] ^ 0x36363636; + w1[2] = w1[2] ^ 0x36363636; + w1[3] = w1[3] ^ 0x36363636; + w2[0] = w2[0] ^ 0x36363636; + w2[1] = w2[1] ^ 0x36363636; + w2[2] = w2[2] ^ 0x36363636; + w2[3] = w2[3] ^ 0x36363636; + w3[0] = w3[0] ^ 0x36363636; + w3[1] = w3[1] ^ 0x36363636; + w3[2] = w3[2] ^ 0x36363636; + w3[3] = w3[3] ^ 0x36363636; + + ipad[0] = MD5M_A; + ipad[1] = MD5M_B; + ipad[2] = MD5M_C; + ipad[3] = MD5M_D; + + md5_transform (w0, w1, w2, w3, ipad); + + w0[0] = w0[0] ^ 0x6a6a6a6a; + w0[1] = w0[1] ^ 0x6a6a6a6a; + w0[2] = w0[2] ^ 0x6a6a6a6a; + w0[3] = w0[3] ^ 0x6a6a6a6a; + w1[0] = w1[0] ^ 0x6a6a6a6a; + w1[1] = w1[1] ^ 0x6a6a6a6a; + w1[2] = w1[2] ^ 0x6a6a6a6a; + w1[3] = w1[3] ^ 0x6a6a6a6a; + w2[0] = w2[0] ^ 0x6a6a6a6a; + w2[1] = w2[1] ^ 0x6a6a6a6a; + w2[2] = w2[2] ^ 0x6a6a6a6a; + w2[3] = w2[3] ^ 0x6a6a6a6a; + w3[0] = w3[0] ^ 0x6a6a6a6a; + w3[1] = w3[1] ^ 0x6a6a6a6a; + w3[2] = w3[2] ^ 0x6a6a6a6a; + w3[3] = w3[3] ^ 0x6a6a6a6a; + + opad[0] = MD5M_A; + opad[1] = MD5M_B; + opad[2] = MD5M_C; + opad[3] = MD5M_D; + + md5_transform (w0, w1, w2, w3, opad); +} + +static void hmac_md5_run (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], u32x ipad[4], u32x opad[4], u32x digest[4]) +{ + digest[0] = ipad[0]; + digest[1] = ipad[1]; + digest[2] = ipad[2]; + digest[3] = ipad[3]; + + md5_transform (w0, w1, w2, w3, digest); + + w0[0] = digest[0]; + w0[1] = digest[1]; + w0[2] = digest[2]; + w0[3] = digest[3]; + w1[0] = 0x80; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + w3[0] = 0; + w3[1] = 0; + w3[2] = (64 + 16) * 8; + w3[3] = 0; + + digest[0] = opad[0]; + digest[1] = opad[1]; + digest[2] = opad[2]; + digest[3] = opad[3]; + + md5_transform (w0, w1, w2, w3, digest); +} + +static void kerb_prepare (const u32x w0[4], const u32x w1[4], const u32 pw_len, const u32 checksum[4], u32x digest[4]) +{ + /** + * pads + */ + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + w0_t[0] = w0[0]; + w0_t[1] = w0[1]; + w0_t[2] = w0[2]; + w0_t[3] = w0[3]; + w1_t[0] = w1[0]; + w1_t[1] = w1[1]; + w1_t[2] = w1[2]; + w1_t[3] = w1[3]; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = 0; + + // K=MD4(Little_indian(UNICODE(pwd)) + + append_0x80_2 (w0_t, w1_t, pw_len); + + make_unicode (w1_t, w2_t, w3_t); + make_unicode (w0_t, w0_t, w1_t); + + w3_t[2] = pw_len * 8 * 2; + w3_t[3] = 0; + + digest[0] = MD4M_A; + digest[1] = MD4M_B; + digest[2] = MD4M_C; + digest[3] = MD4M_D; + + md4_transform (w0_t, w1_t, w2_t, w3_t, digest); + + // K1=MD5_HMAC(K,1); with 1 encoded as little indian on 4 bytes (01000000 in hexa); + + w0_t[0] = digest[0]; + w0_t[1] = digest[1]; + w0_t[2] = digest[2]; + w0_t[3] = digest[3]; + w1_t[0] = 0; + w1_t[1] = 0; + w1_t[2] = 0; + w1_t[3] = 0; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = 0; + + u32x ipad[4]; + u32x opad[4]; + + hmac_md5_pad (w0_t, w1_t, w2_t, w3_t, ipad, opad); + + w0_t[0] = 1; + w0_t[1] = 0x80; + w0_t[2] = 0; + w0_t[3] = 0; + w1_t[0] = 0; + w1_t[1] = 0; + w1_t[2] = 0; + w1_t[3] = 0; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = (64 + 4) * 8; + w3_t[3] = 0; + + hmac_md5_run (w0_t, w1_t, w2_t, w3_t, ipad, opad, digest); + + // K3=MD5_HMAC(K1,checksum); + + w0_t[0] = digest[0]; + w0_t[1] = digest[1]; + w0_t[2] = digest[2]; + w0_t[3] = digest[3]; + w1_t[0] = 0; + w1_t[1] = 0; + w1_t[2] = 0; + w1_t[3] = 0; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = 0; + + hmac_md5_pad (w0_t, w1_t, w2_t, w3_t, ipad, opad); + + w0_t[0] = checksum[0]; + w0_t[1] = checksum[1]; + w0_t[2] = checksum[2]; + w0_t[3] = checksum[3]; + w1_t[0] = 0x80; + w1_t[1] = 0; + w1_t[2] = 0; + w1_t[3] = 0; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = (64 + 16) * 8; + w3_t[3] = 0; + + hmac_md5_run (w0_t, w1_t, w2_t, w3_t, ipad, opad, digest); +} + +static void m07500 (__local RC4_KEY rc4_keys[64], u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], const u32 pw_len, __global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global krb5pa_t *krb5pa_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset) +{ + /** + * modifier + */ + + const u32 gid = get_global_id (0); + const u32 lid = get_local_id (0); + + /** + * salt + */ + + u32 checksum[4]; + + checksum[0] = krb5pa_bufs[salt_pos].checksum[0]; + checksum[1] = krb5pa_bufs[salt_pos].checksum[1]; + checksum[2] = krb5pa_bufs[salt_pos].checksum[2]; + checksum[3] = krb5pa_bufs[salt_pos].checksum[3]; + + u32 timestamp_ct[8]; + + timestamp_ct[0] = krb5pa_bufs[salt_pos].timestamp[0]; + timestamp_ct[1] = krb5pa_bufs[salt_pos].timestamp[1]; + timestamp_ct[2] = krb5pa_bufs[salt_pos].timestamp[2]; + timestamp_ct[3] = krb5pa_bufs[salt_pos].timestamp[3]; + timestamp_ct[4] = krb5pa_bufs[salt_pos].timestamp[4]; + timestamp_ct[5] = krb5pa_bufs[salt_pos].timestamp[5]; + timestamp_ct[6] = krb5pa_bufs[salt_pos].timestamp[6]; + timestamp_ct[7] = krb5pa_bufs[salt_pos].timestamp[7]; + + /** + * loop + */ + + u32x w0l = w0[0]; + + for (u32 il_pos = 0; il_pos < bfs_cnt; il_pos++) + { + const u32 w0r = bfs_buf[il_pos].i; + + w0[0] = w0l | w0r; + + u32x digest[4]; + + kerb_prepare (w0, w1, pw_len, checksum, digest); + + u32 tmp[4]; + + #ifdef VECT_SIZE1 + + tmp[0] = digest[0]; + tmp[1] = digest[1]; + tmp[2] = digest[2]; + tmp[3] = digest[3]; + + if (decrypt_and_check (&rc4_keys[lid], tmp, timestamp_ct) == 1) + { + mark_hash_s0 (plains_buf, hashes_shown, digests_offset, gid, il_pos); + + d_return_buf[lid] = 1; + } + + #endif + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m07500_m04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global krb5pa_t *krb5pa_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + const u32 lid = get_local_id (0); + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + __local RC4_KEY rc4_keys[64]; + + m07500 (rc4_keys, w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, krb5pa_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m07500_m08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global krb5pa_t *krb5pa_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + const u32 lid = get_local_id (0); + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + __local RC4_KEY rc4_keys[64]; + + m07500 (rc4_keys, w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, krb5pa_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m07500_m16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global krb5pa_t *krb5pa_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m07500_s04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global krb5pa_t *krb5pa_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + const u32 lid = get_local_id (0); + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + __local RC4_KEY rc4_keys[64]; + + m07500 (rc4_keys, w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, krb5pa_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m07500_s08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global krb5pa_t *krb5pa_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + const u32 lid = get_local_id (0); + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + __local RC4_KEY rc4_keys[64]; + + m07500 (rc4_keys, w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, krb5pa_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m07500_s16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global krb5pa_t *krb5pa_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/amd/m07600_a0.cl b/amd/m07600_a0.cl new file mode 100644 index 0000000000..4e63f0cecd --- /dev/null +++ b/amd/m07600_a0.cl @@ -0,0 +1,1263 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _SHA1_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW4 +#define VECT_SIZE4 +#endif + +#ifdef VLIW5 +#define VECT_SIZE4 +#endif + +#define DGST_R0 3 +#define DGST_R1 4 +#define DGST_R2 2 +#define DGST_R3 1 + +#include "include/kernel_functions.c" +#include "types_amd.c" +#include "common_amd.c" +#include "include/rp_gpu.h" +#include "rp_amd.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +#ifdef VECT_SIZE1 +#define uint_to_hex_lower8(i) l_bin2asc[(i)] +#endif + +#ifdef VECT_SIZE2 +#define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1]) +#endif + +#ifdef VECT_SIZE4 +#define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3]) +#endif + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m07600_m04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + u32x pw_buf1[4]; + + pw_buf1[0] = pws[gid].i[ 4]; + pw_buf1[1] = pws[gid].i[ 5]; + pw_buf1[2] = pws[gid].i[ 6]; + pw_buf1[3] = pws[gid].i[ 7]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[ 1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[ 2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[ 3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[ 4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[ 5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[ 6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[ 7]; + + u32 salt_buf2[4]; + + salt_buf2[0] = 0; + salt_buf2[1] = 0; + salt_buf2[2] = 0; + salt_buf2[3] = 0; + + u32 salt_buf3[4]; + + salt_buf3[0] = 0; + salt_buf3[1] = 0; + salt_buf3[2] = 0; + salt_buf3[3] = 0; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + const u32 total_len = (salt_len + 40) * 8; + + /** + * bin2asc table + */ + + __local u32 l_bin2asc[256]; + + const u32 lid4 = lid * 4; + + const u32 lid40 = lid4 + 0; + const u32 lid41 = lid4 + 1; + const u32 lid42 = lid4 + 2; + const u32 lid43 = lid4 + 3; + + const u32 v400 = (lid40 >> 0) & 15; + const u32 v401 = (lid40 >> 4) & 15; + const u32 v410 = (lid41 >> 0) & 15; + const u32 v411 = (lid41 >> 4) & 15; + const u32 v420 = (lid42 >> 0) & 15; + const u32 v421 = (lid42 >> 4) & 15; + const u32 v430 = (lid43 >> 0) & 15; + const u32 v431 = (lid43 >> 4) & 15; + + l_bin2asc[lid40] = ((v400 < 10) ? '0' + v400 : 'a' - 10 + v400) << 8 + | ((v401 < 10) ? '0' + v401 : 'a' - 10 + v401) << 0; + l_bin2asc[lid41] = ((v410 < 10) ? '0' + v410 : 'a' - 10 + v410) << 8 + | ((v411 < 10) ? '0' + v411 : 'a' - 10 + v411) << 0; + l_bin2asc[lid42] = ((v420 < 10) ? '0' + v420 : 'a' - 10 + v420) << 8 + | ((v421 < 10) ? '0' + v421 : 'a' - 10 + v421) << 0; + l_bin2asc[lid43] = ((v430 < 10) ? '0' + v430 : 'a' - 10 + v430) << 8 + | ((v431 < 10) ? '0' + v431 : 'a' - 10 + v431) << 0; + + barrier (CLK_LOCAL_MEM_FENCE); + + if (gid >= gid_max) return; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + + w0[0] = pw_buf0[0]; + w0[1] = pw_buf0[1]; + w0[2] = pw_buf0[2]; + w0[3] = pw_buf0[3]; + + u32x w1[4]; + + w1[0] = pw_buf1[0]; + w1[1] = pw_buf1[1]; + w1[2] = pw_buf1[2]; + w1[3] = pw_buf1[3]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 out_len = apply_rules (rules_buf[il_pos].cmds, w0, w1, pw_len); + + append_0x80_2 (w0, w1, out_len); + + /** + * sha1 + */ + + u32x w0_t = swap_workaround (w0[0]); + u32x w1_t = swap_workaround (w0[1]); + u32x w2_t = swap_workaround (w0[2]); + u32x w3_t = swap_workaround (w0[3]); + u32x w4_t = swap_workaround (w1[0]); + u32x w5_t = swap_workaround (w1[1]); + u32x w6_t = swap_workaround (w1[2]); + u32x w7_t = swap_workaround (w1[3]); + u32x w8_t = swap_workaround (w2[0]); + u32x w9_t = swap_workaround (w2[1]); + u32x wa_t = swap_workaround (w2[2]); + u32x wb_t = swap_workaround (w2[3]); + u32x wc_t = swap_workaround (w3[0]); + u32x wd_t = swap_workaround (w3[1]); + u32x we_t = 0; + u32x wf_t = pw_len * 8; + + u32x a = SHA1M_A; + u32x b = SHA1M_B; + u32x c = SHA1M_C; + u32x d = SHA1M_D; + u32x e = SHA1M_E; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w0_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w1_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w2_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w3_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w4_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w5_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w6_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w7_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w8_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w9_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wa_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, wb_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, wc_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, wd_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, we_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F0o, e, a, b, c, d, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F0o, d, e, a, b, c, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F0o, c, d, e, a, b, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F0o, b, c, d, e, a, w3_t); + + #undef K + #define K SHA1C01 + + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w7_t); + + #undef K + #define K SHA1C02 + + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wb_t); + + #undef K + #define K SHA1C03 + + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wf_t); + + a += SHA1M_A; + b += SHA1M_B; + c += SHA1M_C; + d += SHA1M_D; + e += SHA1M_E; + + /** + * Prepend salt + */ + + u32x w0t[4]; + + w0t[0] = uint_to_hex_lower8 ((a >> 24) & 255) << 0 + | uint_to_hex_lower8 ((a >> 16) & 255) << 16; + w0t[1] = uint_to_hex_lower8 ((a >> 8) & 255) << 0 + | uint_to_hex_lower8 ((a >> 0) & 255) << 16; + w0t[2] = uint_to_hex_lower8 ((b >> 24) & 255) << 0 + | uint_to_hex_lower8 ((b >> 16) & 255) << 16; + w0t[3] = uint_to_hex_lower8 ((b >> 8) & 255) << 0 + | uint_to_hex_lower8 ((b >> 0) & 255) << 16; + + u32x w1t[4]; + + w1t[0] = uint_to_hex_lower8 ((c >> 24) & 255) << 0 + | uint_to_hex_lower8 ((c >> 16) & 255) << 16; + w1t[1] = uint_to_hex_lower8 ((c >> 8) & 255) << 0 + | uint_to_hex_lower8 ((c >> 0) & 255) << 16; + w1t[2] = uint_to_hex_lower8 ((d >> 24) & 255) << 0 + | uint_to_hex_lower8 ((d >> 16) & 255) << 16; + w1t[3] = uint_to_hex_lower8 ((d >> 8) & 255) << 0 + | uint_to_hex_lower8 ((d >> 0) & 255) << 16; + + u32x w2t[2]; + + w2t[0] = uint_to_hex_lower8 ((e >> 24) & 255) << 0 + | uint_to_hex_lower8 ((e >> 16) & 255) << 16; + w2t[1] = uint_to_hex_lower8 ((e >> 8) & 255) << 0 + | uint_to_hex_lower8 ((e >> 0) & 255) << 16; + + w0_t = salt_buf0[0]; + w1_t = salt_buf0[1]; + w2_t = salt_buf0[2]; + w3_t = salt_buf0[3]; + w4_t = salt_buf1[0]; + w5_t = salt_buf1[1]; + w6_t = salt_buf1[2]; + w7_t = salt_buf1[3]; + w8_t = w0t[0]; + w9_t = w0t[1]; + wa_t = w0t[2]; + wb_t = w0t[3]; + wc_t = w1t[0]; + wd_t = w1t[1]; + we_t = w1t[2]; + wf_t = w1t[3]; + + /** + * 2nd SHA1 + */ + + // 1st transform + + w0_t = swap_workaround (w0_t); + w1_t = swap_workaround (w1_t); + w2_t = swap_workaround (w2_t); + w3_t = swap_workaround (w3_t); + w4_t = swap_workaround (w4_t); + w5_t = swap_workaround (w5_t); + w6_t = swap_workaround (w6_t); + w7_t = swap_workaround (w7_t); + w8_t = swap_workaround (w8_t); + w9_t = swap_workaround (w9_t); + wa_t = swap_workaround (wa_t); + wb_t = swap_workaround (wb_t); + wc_t = swap_workaround (wc_t); + wd_t = swap_workaround (wd_t); + we_t = swap_workaround (we_t); + wf_t = swap_workaround (wf_t); + + a = SHA1M_A; + b = SHA1M_B; + c = SHA1M_C; + d = SHA1M_D; + e = SHA1M_E; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w0_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w1_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w2_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w3_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w4_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w5_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w6_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w7_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w8_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w9_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wa_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, wb_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, wc_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, wd_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, we_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F0o, e, a, b, c, d, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F0o, d, e, a, b, c, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F0o, c, d, e, a, b, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F0o, b, c, d, e, a, w3_t); + + #undef K + #define K SHA1C01 + + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w7_t); + + #undef K + #define K SHA1C02 + + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wb_t); + + #undef K + #define K SHA1C03 + + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wf_t); + + a += SHA1M_A; + b += SHA1M_B; + c += SHA1M_C; + d += SHA1M_D; + e += SHA1M_E; + + u32x r_a = a; + u32x r_b = b; + u32x r_c = c; + u32x r_d = d; + u32x r_e = e; + + // 2nd transform + + w0_t = swap_workaround (w2t[0]); + w1_t = swap_workaround (w2t[1]); + w2_t = 0x80000000; + w3_t = 0; + w4_t = 0; + w5_t = 0; + w6_t = 0; + w7_t = 0; + w8_t = 0; + w9_t = 0; + wa_t = 0; + wb_t = 0; + wc_t = 0; + wd_t = 0; + we_t = 0; + wf_t = total_len; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w0_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w1_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w2_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w3_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w4_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w5_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w6_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w7_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w8_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w9_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wa_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, wb_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, wc_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, wd_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, we_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F0o, e, a, b, c, d, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F0o, d, e, a, b, c, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F0o, c, d, e, a, b, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F0o, b, c, d, e, a, w3_t); + + #undef K + #define K SHA1C01 + + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w7_t); + + #undef K + #define K SHA1C02 + + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wb_t); + + #undef K + #define K SHA1C03 + + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wf_t); + + a += r_a; + b += r_b; + c += r_c; + d += r_d; + e += r_e; + + const u32x r0 = d; + const u32x r1 = e; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_M + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m07600_m08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m07600_m16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m07600_s04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + u32x pw_buf1[4]; + + pw_buf1[0] = pws[gid].i[ 4]; + pw_buf1[1] = pws[gid].i[ 5]; + pw_buf1[2] = pws[gid].i[ 6]; + pw_buf1[3] = pws[gid].i[ 7]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[ 1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[ 2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[ 3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[ 4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[ 5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[ 6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[ 7]; + + u32 salt_buf2[4]; + + salt_buf2[0] = 0; + salt_buf2[1] = 0; + salt_buf2[2] = 0; + salt_buf2[3] = 0; + + u32 salt_buf3[4]; + + salt_buf3[0] = 0; + salt_buf3[1] = 0; + salt_buf3[2] = 0; + salt_buf3[3] = 0; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + const u32 total_len = (salt_len + 40) * 8; + + /** + * bin2asc table + */ + + __local u32 l_bin2asc[256]; + + const u32 lid4 = lid * 4; + + const u32 lid40 = lid4 + 0; + const u32 lid41 = lid4 + 1; + const u32 lid42 = lid4 + 2; + const u32 lid43 = lid4 + 3; + + const u32 v400 = (lid40 >> 0) & 15; + const u32 v401 = (lid40 >> 4) & 15; + const u32 v410 = (lid41 >> 0) & 15; + const u32 v411 = (lid41 >> 4) & 15; + const u32 v420 = (lid42 >> 0) & 15; + const u32 v421 = (lid42 >> 4) & 15; + const u32 v430 = (lid43 >> 0) & 15; + const u32 v431 = (lid43 >> 4) & 15; + + l_bin2asc[lid40] = ((v400 < 10) ? '0' + v400 : 'a' - 10 + v400) << 8 + | ((v401 < 10) ? '0' + v401 : 'a' - 10 + v401) << 0; + l_bin2asc[lid41] = ((v410 < 10) ? '0' + v410 : 'a' - 10 + v410) << 8 + | ((v411 < 10) ? '0' + v411 : 'a' - 10 + v411) << 0; + l_bin2asc[lid42] = ((v420 < 10) ? '0' + v420 : 'a' - 10 + v420) << 8 + | ((v421 < 10) ? '0' + v421 : 'a' - 10 + v421) << 0; + l_bin2asc[lid43] = ((v430 < 10) ? '0' + v430 : 'a' - 10 + v430) << 8 + | ((v431 < 10) ? '0' + v431 : 'a' - 10 + v431) << 0; + + barrier (CLK_LOCAL_MEM_FENCE); + + if (gid >= gid_max) return; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * reverse + */ + + const u32 e_rev = rotl32 (search[1], 2u); + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + + w0[0] = pw_buf0[0]; + w0[1] = pw_buf0[1]; + w0[2] = pw_buf0[2]; + w0[3] = pw_buf0[3]; + + u32x w1[4]; + + w1[0] = pw_buf1[0]; + w1[1] = pw_buf1[1]; + w1[2] = pw_buf1[2]; + w1[3] = pw_buf1[3]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 out_len = apply_rules (rules_buf[il_pos].cmds, w0, w1, pw_len); + + append_0x80_2 (w0, w1, out_len); + + /** + * sha1 + */ + + u32x w0_t = swap_workaround (w0[0]); + u32x w1_t = swap_workaround (w0[1]); + u32x w2_t = swap_workaround (w0[2]); + u32x w3_t = swap_workaround (w0[3]); + u32x w4_t = swap_workaround (w1[0]); + u32x w5_t = swap_workaround (w1[1]); + u32x w6_t = swap_workaround (w1[2]); + u32x w7_t = swap_workaround (w1[3]); + u32x w8_t = swap_workaround (w2[0]); + u32x w9_t = swap_workaround (w2[1]); + u32x wa_t = swap_workaround (w2[2]); + u32x wb_t = swap_workaround (w2[3]); + u32x wc_t = swap_workaround (w3[0]); + u32x wd_t = swap_workaround (w3[1]); + u32x we_t = 0; + u32x wf_t = pw_len * 8; + + u32x a = SHA1M_A; + u32x b = SHA1M_B; + u32x c = SHA1M_C; + u32x d = SHA1M_D; + u32x e = SHA1M_E; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w0_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w1_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w2_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w3_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w4_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w5_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w6_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w7_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w8_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w9_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wa_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, wb_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, wc_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, wd_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, we_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F0o, e, a, b, c, d, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F0o, d, e, a, b, c, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F0o, c, d, e, a, b, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F0o, b, c, d, e, a, w3_t); + + #undef K + #define K SHA1C01 + + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w7_t); + + #undef K + #define K SHA1C02 + + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wb_t); + + #undef K + #define K SHA1C03 + + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wf_t); + + a += SHA1M_A; + b += SHA1M_B; + c += SHA1M_C; + d += SHA1M_D; + e += SHA1M_E; + + /** + * Prepend salt + */ + + u32x w0t[4]; + + w0t[0] = uint_to_hex_lower8 ((a >> 24) & 255) << 0 + | uint_to_hex_lower8 ((a >> 16) & 255) << 16; + w0t[1] = uint_to_hex_lower8 ((a >> 8) & 255) << 0 + | uint_to_hex_lower8 ((a >> 0) & 255) << 16; + w0t[2] = uint_to_hex_lower8 ((b >> 24) & 255) << 0 + | uint_to_hex_lower8 ((b >> 16) & 255) << 16; + w0t[3] = uint_to_hex_lower8 ((b >> 8) & 255) << 0 + | uint_to_hex_lower8 ((b >> 0) & 255) << 16; + + u32x w1t[4]; + + w1t[0] = uint_to_hex_lower8 ((c >> 24) & 255) << 0 + | uint_to_hex_lower8 ((c >> 16) & 255) << 16; + w1t[1] = uint_to_hex_lower8 ((c >> 8) & 255) << 0 + | uint_to_hex_lower8 ((c >> 0) & 255) << 16; + w1t[2] = uint_to_hex_lower8 ((d >> 24) & 255) << 0 + | uint_to_hex_lower8 ((d >> 16) & 255) << 16; + w1t[3] = uint_to_hex_lower8 ((d >> 8) & 255) << 0 + | uint_to_hex_lower8 ((d >> 0) & 255) << 16; + + u32x w2t[2]; + + w2t[0] = uint_to_hex_lower8 ((e >> 24) & 255) << 0 + | uint_to_hex_lower8 ((e >> 16) & 255) << 16; + w2t[1] = uint_to_hex_lower8 ((e >> 8) & 255) << 0 + | uint_to_hex_lower8 ((e >> 0) & 255) << 16; + + w0_t = salt_buf0[0]; + w1_t = salt_buf0[1]; + w2_t = salt_buf0[2]; + w3_t = salt_buf0[3]; + w4_t = salt_buf1[0]; + w5_t = salt_buf1[1]; + w6_t = salt_buf1[2]; + w7_t = salt_buf1[3]; + w8_t = w0t[0]; + w9_t = w0t[1]; + wa_t = w0t[2]; + wb_t = w0t[3]; + wc_t = w1t[0]; + wd_t = w1t[1]; + we_t = w1t[2]; + wf_t = w1t[3]; + + /** + * 2nd SHA1 + */ + + // 1st transform + + w0_t = swap_workaround (w0_t); + w1_t = swap_workaround (w1_t); + w2_t = swap_workaround (w2_t); + w3_t = swap_workaround (w3_t); + w4_t = swap_workaround (w4_t); + w5_t = swap_workaround (w5_t); + w6_t = swap_workaround (w6_t); + w7_t = swap_workaround (w7_t); + w8_t = swap_workaround (w8_t); + w9_t = swap_workaround (w9_t); + wa_t = swap_workaround (wa_t); + wb_t = swap_workaround (wb_t); + wc_t = swap_workaround (wc_t); + wd_t = swap_workaround (wd_t); + we_t = swap_workaround (we_t); + wf_t = swap_workaround (wf_t); + + a = SHA1M_A; + b = SHA1M_B; + c = SHA1M_C; + d = SHA1M_D; + e = SHA1M_E; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w0_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w1_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w2_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w3_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w4_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w5_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w6_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w7_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w8_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w9_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wa_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, wb_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, wc_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, wd_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, we_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F0o, e, a, b, c, d, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F0o, d, e, a, b, c, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F0o, c, d, e, a, b, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F0o, b, c, d, e, a, w3_t); + + #undef K + #define K SHA1C01 + + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w7_t); + + #undef K + #define K SHA1C02 + + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wb_t); + + #undef K + #define K SHA1C03 + + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wf_t); + + a += SHA1M_A; + b += SHA1M_B; + c += SHA1M_C; + d += SHA1M_D; + e += SHA1M_E; + + u32x r_a = a; + u32x r_b = b; + u32x r_c = c; + u32x r_d = d; + u32x r_e = e; + + // 2nd transform + + w0_t = swap_workaround (w2t[0]); + w1_t = swap_workaround (w2t[1]); + w2_t = 0x80000000; + w3_t = 0; + w4_t = 0; + w5_t = 0; + w6_t = 0; + w7_t = 0; + w8_t = 0; + w9_t = 0; + wa_t = 0; + wb_t = 0; + wc_t = 0; + wd_t = 0; + we_t = 0; + wf_t = total_len; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w0_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w1_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w2_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w3_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w4_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w5_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w6_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w7_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w8_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w9_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wa_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, wb_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, wc_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, wd_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, we_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F0o, e, a, b, c, d, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F0o, d, e, a, b, c, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F0o, c, d, e, a, b, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F0o, b, c, d, e, a, w3_t); + + #undef K + #define K SHA1C01 + + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w7_t); + + #undef K + #define K SHA1C02 + + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wb_t); + + #undef K + #define K SHA1C03 + + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wf_t); + + a += r_a; + b += r_b; + c += r_c; + d += r_d; + e += r_e; + + const u32x r0 = d; + const u32x r1 = e; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_S + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m07600_s08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m07600_s16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/amd/m07600_a1.cl b/amd/m07600_a1.cl new file mode 100644 index 0000000000..376c05e232 --- /dev/null +++ b/amd/m07600_a1.cl @@ -0,0 +1,1373 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _SHA1_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW4 +#define VECT_SIZE4 +#endif + +#ifdef VLIW5 +#define VECT_SIZE4 +#endif + +#define DGST_R0 3 +#define DGST_R1 4 +#define DGST_R2 2 +#define DGST_R3 1 + +#include "include/kernel_functions.c" +#include "types_amd.c" +#include "common_amd.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +#ifdef VECT_SIZE1 +#define uint_to_hex_lower8(i) l_bin2asc[(i)] +#endif + +#ifdef VECT_SIZE2 +#define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1]) +#endif + +#ifdef VECT_SIZE4 +#define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3]) +#endif + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m07600_m04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + append_0x80_2 (wordl0, wordl1, pw_l_len); + + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, combs_buf[0].pw_len); + } + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[ 1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[ 2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[ 3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[ 4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[ 5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[ 6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[ 7]; + + u32 salt_buf2[4]; + + salt_buf2[0] = 0; + salt_buf2[1] = 0; + salt_buf2[2] = 0; + salt_buf2[3] = 0; + + u32 salt_buf3[4]; + + salt_buf3[0] = 0; + salt_buf3[1] = 0; + salt_buf3[2] = 0; + salt_buf3[3] = 0; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + const u32 total_len = (salt_len + 40) * 8; + + /** + * bin2asc table + */ + + __local u32 l_bin2asc[256]; + + const u32 lid4 = lid * 4; + + const u32 lid40 = lid4 + 0; + const u32 lid41 = lid4 + 1; + const u32 lid42 = lid4 + 2; + const u32 lid43 = lid4 + 3; + + const u32 v400 = (lid40 >> 0) & 15; + const u32 v401 = (lid40 >> 4) & 15; + const u32 v410 = (lid41 >> 0) & 15; + const u32 v411 = (lid41 >> 4) & 15; + const u32 v420 = (lid42 >> 0) & 15; + const u32 v421 = (lid42 >> 4) & 15; + const u32 v430 = (lid43 >> 0) & 15; + const u32 v431 = (lid43 >> 4) & 15; + + l_bin2asc[lid40] = ((v400 < 10) ? '0' + v400 : 'a' - 10 + v400) << 8 + | ((v401 < 10) ? '0' + v401 : 'a' - 10 + v401) << 0; + l_bin2asc[lid41] = ((v410 < 10) ? '0' + v410 : 'a' - 10 + v410) << 8 + | ((v411 < 10) ? '0' + v411 : 'a' - 10 + v411) << 0; + l_bin2asc[lid42] = ((v420 < 10) ? '0' + v420 : 'a' - 10 + v420) << 8 + | ((v421 < 10) ? '0' + v421 : 'a' - 10 + v421) << 0; + l_bin2asc[lid43] = ((v430 < 10) ? '0' + v430 : 'a' - 10 + v430) << 8 + | ((v431 < 10) ? '0' + v431 : 'a' - 10 + v431) << 0; + + barrier (CLK_LOCAL_MEM_FENCE); + + if (gid >= gid_max) return; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = combs_buf[il_pos].pw_len; + + const u32 pw_len = pw_l_len + pw_r_len; + + u32 wordr0[4]; + + wordr0[0] = combs_buf[il_pos].i[0]; + wordr0[1] = combs_buf[il_pos].i[1]; + wordr0[2] = combs_buf[il_pos].i[2]; + wordr0[3] = combs_buf[il_pos].i[3]; + + u32 wordr1[4]; + + wordr1[0] = combs_buf[il_pos].i[4]; + wordr1[1] = combs_buf[il_pos].i[5]; + wordr1[2] = combs_buf[il_pos].i[6]; + wordr1[3] = combs_buf[il_pos].i[7]; + + u32 wordr2[4]; + + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + + u32 wordr3[4]; + + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + append_0x80_2 (wordr0, wordr1, pw_r_len); + + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + u32x w0[4]; + + w0[0] = wordl0[0] | wordr0[0]; + w0[1] = wordl0[1] | wordr0[1]; + w0[2] = wordl0[2] | wordr0[2]; + w0[3] = wordl0[3] | wordr0[3]; + + u32x w1[4]; + + w1[0] = wordl1[0] | wordr1[0]; + w1[1] = wordl1[1] | wordr1[1]; + w1[2] = wordl1[2] | wordr1[2]; + w1[3] = wordl1[3] | wordr1[3]; + + u32x w2[4]; + + w2[0] = wordl2[0] | wordr2[0]; + w2[1] = wordl2[1] | wordr2[1]; + w2[2] = wordl2[2] | wordr2[2]; + w2[3] = wordl2[3] | wordr2[3]; + + u32x w3[4]; + + w3[0] = wordl3[0] | wordr3[0]; + w3[1] = wordl3[1] | wordr3[1]; + w3[2] = 0; + w3[3] = 0; + + /** + * sha1 + */ + + u32x w0_t = swap_workaround (w0[0]); + u32x w1_t = swap_workaround (w0[1]); + u32x w2_t = swap_workaround (w0[2]); + u32x w3_t = swap_workaround (w0[3]); + u32x w4_t = swap_workaround (w1[0]); + u32x w5_t = swap_workaround (w1[1]); + u32x w6_t = swap_workaround (w1[2]); + u32x w7_t = swap_workaround (w1[3]); + u32x w8_t = swap_workaround (w2[0]); + u32x w9_t = swap_workaround (w2[1]); + u32x wa_t = swap_workaround (w2[2]); + u32x wb_t = swap_workaround (w2[3]); + u32x wc_t = swap_workaround (w3[0]); + u32x wd_t = swap_workaround (w3[1]); + u32x we_t = 0; + u32x wf_t = pw_len * 8; + + u32x a = SHA1M_A; + u32x b = SHA1M_B; + u32x c = SHA1M_C; + u32x d = SHA1M_D; + u32x e = SHA1M_E; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w0_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w1_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w2_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w3_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w4_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w5_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w6_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w7_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w8_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w9_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wa_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, wb_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, wc_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, wd_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, we_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F0o, e, a, b, c, d, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F0o, d, e, a, b, c, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F0o, c, d, e, a, b, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F0o, b, c, d, e, a, w3_t); + + #undef K + #define K SHA1C01 + + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w7_t); + + #undef K + #define K SHA1C02 + + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wb_t); + + #undef K + #define K SHA1C03 + + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wf_t); + + a += SHA1M_A; + b += SHA1M_B; + c += SHA1M_C; + d += SHA1M_D; + e += SHA1M_E; + + /** + * Prepend salt + */ + + u32x w0t[4]; + + w0t[0] = uint_to_hex_lower8 ((a >> 24) & 255) << 0 + | uint_to_hex_lower8 ((a >> 16) & 255) << 16; + w0t[1] = uint_to_hex_lower8 ((a >> 8) & 255) << 0 + | uint_to_hex_lower8 ((a >> 0) & 255) << 16; + w0t[2] = uint_to_hex_lower8 ((b >> 24) & 255) << 0 + | uint_to_hex_lower8 ((b >> 16) & 255) << 16; + w0t[3] = uint_to_hex_lower8 ((b >> 8) & 255) << 0 + | uint_to_hex_lower8 ((b >> 0) & 255) << 16; + + u32x w1t[4]; + + w1t[0] = uint_to_hex_lower8 ((c >> 24) & 255) << 0 + | uint_to_hex_lower8 ((c >> 16) & 255) << 16; + w1t[1] = uint_to_hex_lower8 ((c >> 8) & 255) << 0 + | uint_to_hex_lower8 ((c >> 0) & 255) << 16; + w1t[2] = uint_to_hex_lower8 ((d >> 24) & 255) << 0 + | uint_to_hex_lower8 ((d >> 16) & 255) << 16; + w1t[3] = uint_to_hex_lower8 ((d >> 8) & 255) << 0 + | uint_to_hex_lower8 ((d >> 0) & 255) << 16; + + u32x w2t[2]; + + w2t[0] = uint_to_hex_lower8 ((e >> 24) & 255) << 0 + | uint_to_hex_lower8 ((e >> 16) & 255) << 16; + w2t[1] = uint_to_hex_lower8 ((e >> 8) & 255) << 0 + | uint_to_hex_lower8 ((e >> 0) & 255) << 16; + + w0_t = salt_buf0[0]; + w1_t = salt_buf0[1]; + w2_t = salt_buf0[2]; + w3_t = salt_buf0[3]; + w4_t = salt_buf1[0]; + w5_t = salt_buf1[1]; + w6_t = salt_buf1[2]; + w7_t = salt_buf1[3]; + w8_t = w0t[0]; + w9_t = w0t[1]; + wa_t = w0t[2]; + wb_t = w0t[3]; + wc_t = w1t[0]; + wd_t = w1t[1]; + we_t = w1t[2]; + wf_t = w1t[3]; + + /** + * 2nd SHA1 + */ + + // 1st transform + + w0_t = swap_workaround (w0_t); + w1_t = swap_workaround (w1_t); + w2_t = swap_workaround (w2_t); + w3_t = swap_workaround (w3_t); + w4_t = swap_workaround (w4_t); + w5_t = swap_workaround (w5_t); + w6_t = swap_workaround (w6_t); + w7_t = swap_workaround (w7_t); + w8_t = swap_workaround (w8_t); + w9_t = swap_workaround (w9_t); + wa_t = swap_workaround (wa_t); + wb_t = swap_workaround (wb_t); + wc_t = swap_workaround (wc_t); + wd_t = swap_workaround (wd_t); + we_t = swap_workaround (we_t); + wf_t = swap_workaround (wf_t); + + a = SHA1M_A; + b = SHA1M_B; + c = SHA1M_C; + d = SHA1M_D; + e = SHA1M_E; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w0_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w1_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w2_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w3_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w4_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w5_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w6_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w7_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w8_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w9_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wa_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, wb_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, wc_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, wd_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, we_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F0o, e, a, b, c, d, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F0o, d, e, a, b, c, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F0o, c, d, e, a, b, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F0o, b, c, d, e, a, w3_t); + + #undef K + #define K SHA1C01 + + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w7_t); + + #undef K + #define K SHA1C02 + + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wb_t); + + #undef K + #define K SHA1C03 + + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wf_t); + + a += SHA1M_A; + b += SHA1M_B; + c += SHA1M_C; + d += SHA1M_D; + e += SHA1M_E; + + u32x r_a = a; + u32x r_b = b; + u32x r_c = c; + u32x r_d = d; + u32x r_e = e; + + // 2nd transform + + w0_t = swap_workaround (w2t[0]); + w1_t = swap_workaround (w2t[1]); + w2_t = 0x80000000; + w3_t = 0; + w4_t = 0; + w5_t = 0; + w6_t = 0; + w7_t = 0; + w8_t = 0; + w9_t = 0; + wa_t = 0; + wb_t = 0; + wc_t = 0; + wd_t = 0; + we_t = 0; + wf_t = total_len; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w0_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w1_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w2_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w3_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w4_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w5_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w6_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w7_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w8_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w9_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wa_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, wb_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, wc_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, wd_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, we_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F0o, e, a, b, c, d, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F0o, d, e, a, b, c, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F0o, c, d, e, a, b, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F0o, b, c, d, e, a, w3_t); + + #undef K + #define K SHA1C01 + + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w7_t); + + #undef K + #define K SHA1C02 + + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wb_t); + + #undef K + #define K SHA1C03 + + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wf_t); + + a += r_a; + b += r_b; + c += r_c; + d += r_d; + e += r_e; + + const u32x r0 = d; + const u32x r1 = e; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_M + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m07600_m08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m07600_m16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m07600_s04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + append_0x80_2 (wordl0, wordl1, pw_l_len); + + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, combs_buf[0].pw_len); + } + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[ 1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[ 2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[ 3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[ 4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[ 5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[ 6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[ 7]; + + u32 salt_buf2[4]; + + salt_buf2[0] = 0; + salt_buf2[1] = 0; + salt_buf2[2] = 0; + salt_buf2[3] = 0; + + u32 salt_buf3[4]; + + salt_buf3[0] = 0; + salt_buf3[1] = 0; + salt_buf3[2] = 0; + salt_buf3[3] = 0; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + const u32 total_len = (salt_len + 40) * 8; + + /** + * bin2asc table + */ + + __local u32 l_bin2asc[256]; + + const u32 lid4 = lid * 4; + + const u32 lid40 = lid4 + 0; + const u32 lid41 = lid4 + 1; + const u32 lid42 = lid4 + 2; + const u32 lid43 = lid4 + 3; + + const u32 v400 = (lid40 >> 0) & 15; + const u32 v401 = (lid40 >> 4) & 15; + const u32 v410 = (lid41 >> 0) & 15; + const u32 v411 = (lid41 >> 4) & 15; + const u32 v420 = (lid42 >> 0) & 15; + const u32 v421 = (lid42 >> 4) & 15; + const u32 v430 = (lid43 >> 0) & 15; + const u32 v431 = (lid43 >> 4) & 15; + + l_bin2asc[lid40] = ((v400 < 10) ? '0' + v400 : 'a' - 10 + v400) << 8 + | ((v401 < 10) ? '0' + v401 : 'a' - 10 + v401) << 0; + l_bin2asc[lid41] = ((v410 < 10) ? '0' + v410 : 'a' - 10 + v410) << 8 + | ((v411 < 10) ? '0' + v411 : 'a' - 10 + v411) << 0; + l_bin2asc[lid42] = ((v420 < 10) ? '0' + v420 : 'a' - 10 + v420) << 8 + | ((v421 < 10) ? '0' + v421 : 'a' - 10 + v421) << 0; + l_bin2asc[lid43] = ((v430 < 10) ? '0' + v430 : 'a' - 10 + v430) << 8 + | ((v431 < 10) ? '0' + v431 : 'a' - 10 + v431) << 0; + + barrier (CLK_LOCAL_MEM_FENCE); + + if (gid >= gid_max) return; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * reverse + */ + + const u32 e_rev = rotl32 (search[1], 2u); + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = combs_buf[il_pos].pw_len; + + const u32 pw_len = pw_l_len + pw_r_len; + + u32 wordr0[4]; + + wordr0[0] = combs_buf[il_pos].i[0]; + wordr0[1] = combs_buf[il_pos].i[1]; + wordr0[2] = combs_buf[il_pos].i[2]; + wordr0[3] = combs_buf[il_pos].i[3]; + + u32 wordr1[4]; + + wordr1[0] = combs_buf[il_pos].i[4]; + wordr1[1] = combs_buf[il_pos].i[5]; + wordr1[2] = combs_buf[il_pos].i[6]; + wordr1[3] = combs_buf[il_pos].i[7]; + + u32 wordr2[4]; + + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + + u32 wordr3[4]; + + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + append_0x80_2 (wordr0, wordr1, pw_r_len); + + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + u32x w0[4]; + + w0[0] = wordl0[0] | wordr0[0]; + w0[1] = wordl0[1] | wordr0[1]; + w0[2] = wordl0[2] | wordr0[2]; + w0[3] = wordl0[3] | wordr0[3]; + + u32x w1[4]; + + w1[0] = wordl1[0] | wordr1[0]; + w1[1] = wordl1[1] | wordr1[1]; + w1[2] = wordl1[2] | wordr1[2]; + w1[3] = wordl1[3] | wordr1[3]; + + u32x w2[4]; + + w2[0] = wordl2[0] | wordr2[0]; + w2[1] = wordl2[1] | wordr2[1]; + w2[2] = wordl2[2] | wordr2[2]; + w2[3] = wordl2[3] | wordr2[3]; + + u32x w3[4]; + + w3[0] = wordl3[0] | wordr3[0]; + w3[1] = wordl3[1] | wordr3[1]; + w3[2] = 0; + w3[3] = 0; + + /** + * sha1 + */ + + u32x w0_t = swap_workaround (w0[0]); + u32x w1_t = swap_workaround (w0[1]); + u32x w2_t = swap_workaround (w0[2]); + u32x w3_t = swap_workaround (w0[3]); + u32x w4_t = swap_workaround (w1[0]); + u32x w5_t = swap_workaround (w1[1]); + u32x w6_t = swap_workaround (w1[2]); + u32x w7_t = swap_workaround (w1[3]); + u32x w8_t = swap_workaround (w2[0]); + u32x w9_t = swap_workaround (w2[1]); + u32x wa_t = swap_workaround (w2[2]); + u32x wb_t = swap_workaround (w2[3]); + u32x wc_t = swap_workaround (w3[0]); + u32x wd_t = swap_workaround (w3[1]); + u32x we_t = 0; + u32x wf_t = pw_len * 8; + + u32x a = SHA1M_A; + u32x b = SHA1M_B; + u32x c = SHA1M_C; + u32x d = SHA1M_D; + u32x e = SHA1M_E; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w0_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w1_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w2_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w3_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w4_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w5_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w6_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w7_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w8_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w9_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wa_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, wb_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, wc_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, wd_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, we_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F0o, e, a, b, c, d, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F0o, d, e, a, b, c, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F0o, c, d, e, a, b, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F0o, b, c, d, e, a, w3_t); + + #undef K + #define K SHA1C01 + + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w7_t); + + #undef K + #define K SHA1C02 + + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wb_t); + + #undef K + #define K SHA1C03 + + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wf_t); + + a += SHA1M_A; + b += SHA1M_B; + c += SHA1M_C; + d += SHA1M_D; + e += SHA1M_E; + + /** + * Prepend salt + */ + + u32x w0t[4]; + + w0t[0] = uint_to_hex_lower8 ((a >> 24) & 255) << 0 + | uint_to_hex_lower8 ((a >> 16) & 255) << 16; + w0t[1] = uint_to_hex_lower8 ((a >> 8) & 255) << 0 + | uint_to_hex_lower8 ((a >> 0) & 255) << 16; + w0t[2] = uint_to_hex_lower8 ((b >> 24) & 255) << 0 + | uint_to_hex_lower8 ((b >> 16) & 255) << 16; + w0t[3] = uint_to_hex_lower8 ((b >> 8) & 255) << 0 + | uint_to_hex_lower8 ((b >> 0) & 255) << 16; + + u32x w1t[4]; + + w1t[0] = uint_to_hex_lower8 ((c >> 24) & 255) << 0 + | uint_to_hex_lower8 ((c >> 16) & 255) << 16; + w1t[1] = uint_to_hex_lower8 ((c >> 8) & 255) << 0 + | uint_to_hex_lower8 ((c >> 0) & 255) << 16; + w1t[2] = uint_to_hex_lower8 ((d >> 24) & 255) << 0 + | uint_to_hex_lower8 ((d >> 16) & 255) << 16; + w1t[3] = uint_to_hex_lower8 ((d >> 8) & 255) << 0 + | uint_to_hex_lower8 ((d >> 0) & 255) << 16; + + u32x w2t[2]; + + w2t[0] = uint_to_hex_lower8 ((e >> 24) & 255) << 0 + | uint_to_hex_lower8 ((e >> 16) & 255) << 16; + w2t[1] = uint_to_hex_lower8 ((e >> 8) & 255) << 0 + | uint_to_hex_lower8 ((e >> 0) & 255) << 16; + + w0_t = salt_buf0[0]; + w1_t = salt_buf0[1]; + w2_t = salt_buf0[2]; + w3_t = salt_buf0[3]; + w4_t = salt_buf1[0]; + w5_t = salt_buf1[1]; + w6_t = salt_buf1[2]; + w7_t = salt_buf1[3]; + w8_t = w0t[0]; + w9_t = w0t[1]; + wa_t = w0t[2]; + wb_t = w0t[3]; + wc_t = w1t[0]; + wd_t = w1t[1]; + we_t = w1t[2]; + wf_t = w1t[3]; + + /** + * 2nd SHA1 + */ + + // 1st transform + + w0_t = swap_workaround (w0_t); + w1_t = swap_workaround (w1_t); + w2_t = swap_workaround (w2_t); + w3_t = swap_workaround (w3_t); + w4_t = swap_workaround (w4_t); + w5_t = swap_workaround (w5_t); + w6_t = swap_workaround (w6_t); + w7_t = swap_workaround (w7_t); + w8_t = swap_workaround (w8_t); + w9_t = swap_workaround (w9_t); + wa_t = swap_workaround (wa_t); + wb_t = swap_workaround (wb_t); + wc_t = swap_workaround (wc_t); + wd_t = swap_workaround (wd_t); + we_t = swap_workaround (we_t); + wf_t = swap_workaround (wf_t); + + a = SHA1M_A; + b = SHA1M_B; + c = SHA1M_C; + d = SHA1M_D; + e = SHA1M_E; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w0_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w1_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w2_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w3_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w4_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w5_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w6_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w7_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w8_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w9_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wa_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, wb_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, wc_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, wd_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, we_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F0o, e, a, b, c, d, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F0o, d, e, a, b, c, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F0o, c, d, e, a, b, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F0o, b, c, d, e, a, w3_t); + + #undef K + #define K SHA1C01 + + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w7_t); + + #undef K + #define K SHA1C02 + + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wb_t); + + #undef K + #define K SHA1C03 + + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wf_t); + + a += SHA1M_A; + b += SHA1M_B; + c += SHA1M_C; + d += SHA1M_D; + e += SHA1M_E; + + u32x r_a = a; + u32x r_b = b; + u32x r_c = c; + u32x r_d = d; + u32x r_e = e; + + // 2nd transform + + w0_t = swap_workaround (w2t[0]); + w1_t = swap_workaround (w2t[1]); + w2_t = 0x80000000; + w3_t = 0; + w4_t = 0; + w5_t = 0; + w6_t = 0; + w7_t = 0; + w8_t = 0; + w9_t = 0; + wa_t = 0; + wb_t = 0; + wc_t = 0; + wd_t = 0; + we_t = 0; + wf_t = total_len; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w0_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w1_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w2_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w3_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w4_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w5_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w6_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w7_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w8_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w9_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wa_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, wb_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, wc_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, wd_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, we_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F0o, e, a, b, c, d, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F0o, d, e, a, b, c, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F0o, c, d, e, a, b, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F0o, b, c, d, e, a, w3_t); + + #undef K + #define K SHA1C01 + + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w7_t); + + #undef K + #define K SHA1C02 + + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wb_t); + + #undef K + #define K SHA1C03 + + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wf_t); + + a += r_a; + b += r_b; + c += r_c; + d += r_d; + e += r_e; + + const u32x r0 = d; + const u32x r1 = e; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_S + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m07600_s08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m07600_s16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/amd/m07600_a3.cl b/amd/m07600_a3.cl new file mode 100644 index 0000000000..e198455daf --- /dev/null +++ b/amd/m07600_a3.cl @@ -0,0 +1,1588 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _SHA1_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW4 +#define VECT_SIZE4 +#endif + +#ifdef VLIW5 +#define VECT_SIZE4 +#endif + +#define DGST_R0 3 +#define DGST_R1 4 +#define DGST_R2 2 +#define DGST_R3 1 + +#include "include/kernel_functions.c" +#include "types_amd.c" +#include "common_amd.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +#ifdef VECT_SIZE1 +#define uint_to_hex_lower8(i) l_bin2asc[(i)] +#endif + +#ifdef VECT_SIZE2 +#define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1]) +#endif + +#ifdef VECT_SIZE4 +#define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3]) +#endif + +static void m07600m (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], const u32 pw_len, __global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, __local u32 l_bin2asc[256]) +{ + /** + * modifier + */ + + const u32 gid = get_global_id (0); + const u32 lid = get_local_id (0); + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[ 1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[ 2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[ 3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[ 4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[ 5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[ 6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[ 7]; + + u32 salt_buf2[4]; + + salt_buf2[0] = 0; + salt_buf2[1] = 0; + salt_buf2[2] = 0; + salt_buf2[3] = 0; + + u32 salt_buf3[4]; + + salt_buf3[0] = 0; + salt_buf3[1] = 0; + salt_buf3[2] = 0; + salt_buf3[3] = 0; + + const u32 total_len = (32 + 40) * 8; + + /** + * loop + */ + + u32x w0l = w0[0]; + + for (u32 il_pos = 0; il_pos < bfs_cnt; il_pos++) + { + const u32 w0r = bfs_buf[il_pos].i; + + w0[0] = w0l | w0r; + + /** + * sha1 + */ + + u32x w0_t = w0[0]; + u32x w1_t = w0[1]; + u32x w2_t = w0[2]; + u32x w3_t = w0[3]; + u32x w4_t = w1[0]; + u32x w5_t = w1[1]; + u32x w6_t = w1[2]; + u32x w7_t = w1[3]; + u32x w8_t = w2[0]; + u32x w9_t = w2[1]; + u32x wa_t = w2[2]; + u32x wb_t = w2[3]; + u32x wc_t = w3[0]; + u32x wd_t = w3[1]; + u32x we_t = 0; + u32x wf_t = pw_len * 8; + + u32x a = SHA1M_A; + u32x b = SHA1M_B; + u32x c = SHA1M_C; + u32x d = SHA1M_D; + u32x e = SHA1M_E; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w0_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w1_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w2_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w3_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w4_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w5_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w6_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w7_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w8_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w9_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wa_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, wb_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, wc_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, wd_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, we_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F0o, e, a, b, c, d, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F0o, d, e, a, b, c, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F0o, c, d, e, a, b, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F0o, b, c, d, e, a, w3_t); + + #undef K + #define K SHA1C01 + + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w7_t); + + #undef K + #define K SHA1C02 + + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wb_t); + + #undef K + #define K SHA1C03 + + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wf_t); + + a += SHA1M_A; + b += SHA1M_B; + c += SHA1M_C; + d += SHA1M_D; + e += SHA1M_E; + + /** + * Prepend salt + */ + + u32x w0t[4]; + + w0t[0] = uint_to_hex_lower8 ((a >> 24) & 255) << 0 + | uint_to_hex_lower8 ((a >> 16) & 255) << 16; + w0t[1] = uint_to_hex_lower8 ((a >> 8) & 255) << 0 + | uint_to_hex_lower8 ((a >> 0) & 255) << 16; + w0t[2] = uint_to_hex_lower8 ((b >> 24) & 255) << 0 + | uint_to_hex_lower8 ((b >> 16) & 255) << 16; + w0t[3] = uint_to_hex_lower8 ((b >> 8) & 255) << 0 + | uint_to_hex_lower8 ((b >> 0) & 255) << 16; + + u32x w1t[4]; + + w1t[0] = uint_to_hex_lower8 ((c >> 24) & 255) << 0 + | uint_to_hex_lower8 ((c >> 16) & 255) << 16; + w1t[1] = uint_to_hex_lower8 ((c >> 8) & 255) << 0 + | uint_to_hex_lower8 ((c >> 0) & 255) << 16; + w1t[2] = uint_to_hex_lower8 ((d >> 24) & 255) << 0 + | uint_to_hex_lower8 ((d >> 16) & 255) << 16; + w1t[3] = uint_to_hex_lower8 ((d >> 8) & 255) << 0 + | uint_to_hex_lower8 ((d >> 0) & 255) << 16; + + u32x w2t[2]; + + w2t[0] = uint_to_hex_lower8 ((e >> 24) & 255) << 0 + | uint_to_hex_lower8 ((e >> 16) & 255) << 16; + w2t[1] = uint_to_hex_lower8 ((e >> 8) & 255) << 0 + | uint_to_hex_lower8 ((e >> 0) & 255) << 16; + + w0_t = salt_buf0[0]; + w1_t = salt_buf0[1]; + w2_t = salt_buf0[2]; + w3_t = salt_buf0[3]; + w4_t = salt_buf1[0]; + w5_t = salt_buf1[1]; + w6_t = salt_buf1[2]; + w7_t = salt_buf1[3]; + w8_t = w0t[0]; + w9_t = w0t[1]; + wa_t = w0t[2]; + wb_t = w0t[3]; + wc_t = w1t[0]; + wd_t = w1t[1]; + we_t = w1t[2]; + wf_t = w1t[3]; + + /** + * 2nd SHA1 + */ + + // 1st transform + + w0_t = swap_workaround (w0_t); + w1_t = swap_workaround (w1_t); + w2_t = swap_workaround (w2_t); + w3_t = swap_workaround (w3_t); + w4_t = swap_workaround (w4_t); + w5_t = swap_workaround (w5_t); + w6_t = swap_workaround (w6_t); + w7_t = swap_workaround (w7_t); + w8_t = swap_workaround (w8_t); + w9_t = swap_workaround (w9_t); + wa_t = swap_workaround (wa_t); + wb_t = swap_workaround (wb_t); + wc_t = swap_workaround (wc_t); + wd_t = swap_workaround (wd_t); + we_t = swap_workaround (we_t); + wf_t = swap_workaround (wf_t); + + a = SHA1M_A; + b = SHA1M_B; + c = SHA1M_C; + d = SHA1M_D; + e = SHA1M_E; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w0_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w1_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w2_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w3_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w4_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w5_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w6_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w7_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w8_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w9_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wa_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, wb_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, wc_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, wd_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, we_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F0o, e, a, b, c, d, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F0o, d, e, a, b, c, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F0o, c, d, e, a, b, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F0o, b, c, d, e, a, w3_t); + + #undef K + #define K SHA1C01 + + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w7_t); + + #undef K + #define K SHA1C02 + + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wb_t); + + #undef K + #define K SHA1C03 + + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wf_t); + + a += SHA1M_A; + b += SHA1M_B; + c += SHA1M_C; + d += SHA1M_D; + e += SHA1M_E; + + u32x r_a = a; + u32x r_b = b; + u32x r_c = c; + u32x r_d = d; + u32x r_e = e; + + // 2nd transform + + w0_t = swap_workaround (w2t[0]); + w1_t = swap_workaround (w2t[1]); + w2_t = 0x80000000; + w3_t = 0; + w4_t = 0; + w5_t = 0; + w6_t = 0; + w7_t = 0; + w8_t = 0; + w9_t = 0; + wa_t = 0; + wb_t = 0; + wc_t = 0; + wd_t = 0; + we_t = 0; + wf_t = total_len; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w0_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w1_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w2_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w3_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w4_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w5_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w6_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w7_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w8_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w9_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wa_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, wb_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, wc_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, wd_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, we_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F0o, e, a, b, c, d, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F0o, d, e, a, b, c, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F0o, c, d, e, a, b, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F0o, b, c, d, e, a, w3_t); + + #undef K + #define K SHA1C01 + + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w7_t); + + #undef K + #define K SHA1C02 + + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wb_t); + + #undef K + #define K SHA1C03 + + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wf_t); + + a += r_a; + b += r_b; + c += r_c; + d += r_d; + e += r_e; + + const u32x r0 = d; + const u32x r1 = e; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_M + } +} + +static void m07600s (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], const u32 pw_len, __global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, __local u32 l_bin2asc[256]) +{ + /** + * modifier + */ + + const u32 gid = get_global_id (0); + const u32 lid = get_local_id (0); + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[ 1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[ 2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[ 3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[ 4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[ 5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[ 6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[ 7]; + + u32 salt_buf2[4]; + + salt_buf2[0] = 0; + salt_buf2[1] = 0; + salt_buf2[2] = 0; + salt_buf2[3] = 0; + + u32 salt_buf3[4]; + + salt_buf3[0] = 0; + salt_buf3[1] = 0; + salt_buf3[2] = 0; + salt_buf3[3] = 0; + + const u32 total_len = (32 + 40) * 8; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * loop + */ + + u32x w0l = w0[0]; + + for (u32 il_pos = 0; il_pos < bfs_cnt; il_pos++) + { + const u32 w0r = bfs_buf[il_pos].i; + + w0[0] = w0l | w0r; + + /** + * sha1 + */ + + u32x w0_t = w0[0]; + u32x w1_t = w0[1]; + u32x w2_t = w0[2]; + u32x w3_t = w0[3]; + u32x w4_t = w1[0]; + u32x w5_t = w1[1]; + u32x w6_t = w1[2]; + u32x w7_t = w1[3]; + u32x w8_t = w2[0]; + u32x w9_t = w2[1]; + u32x wa_t = w2[2]; + u32x wb_t = w2[3]; + u32x wc_t = w3[0]; + u32x wd_t = w3[1]; + u32x we_t = 0; + u32x wf_t = pw_len * 8; + + u32x a = SHA1M_A; + u32x b = SHA1M_B; + u32x c = SHA1M_C; + u32x d = SHA1M_D; + u32x e = SHA1M_E; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w0_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w1_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w2_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w3_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w4_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w5_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w6_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w7_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w8_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w9_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wa_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, wb_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, wc_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, wd_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, we_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F0o, e, a, b, c, d, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F0o, d, e, a, b, c, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F0o, c, d, e, a, b, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F0o, b, c, d, e, a, w3_t); + + #undef K + #define K SHA1C01 + + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w7_t); + + #undef K + #define K SHA1C02 + + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wb_t); + + #undef K + #define K SHA1C03 + + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wf_t); + + a += SHA1M_A; + b += SHA1M_B; + c += SHA1M_C; + d += SHA1M_D; + e += SHA1M_E; + + /** + * Prepend salt + */ + + u32x w0t[4]; + + w0t[0] = uint_to_hex_lower8 ((a >> 24) & 255) << 0 + | uint_to_hex_lower8 ((a >> 16) & 255) << 16; + w0t[1] = uint_to_hex_lower8 ((a >> 8) & 255) << 0 + | uint_to_hex_lower8 ((a >> 0) & 255) << 16; + w0t[2] = uint_to_hex_lower8 ((b >> 24) & 255) << 0 + | uint_to_hex_lower8 ((b >> 16) & 255) << 16; + w0t[3] = uint_to_hex_lower8 ((b >> 8) & 255) << 0 + | uint_to_hex_lower8 ((b >> 0) & 255) << 16; + + u32x w1t[4]; + + w1t[0] = uint_to_hex_lower8 ((c >> 24) & 255) << 0 + | uint_to_hex_lower8 ((c >> 16) & 255) << 16; + w1t[1] = uint_to_hex_lower8 ((c >> 8) & 255) << 0 + | uint_to_hex_lower8 ((c >> 0) & 255) << 16; + w1t[2] = uint_to_hex_lower8 ((d >> 24) & 255) << 0 + | uint_to_hex_lower8 ((d >> 16) & 255) << 16; + w1t[3] = uint_to_hex_lower8 ((d >> 8) & 255) << 0 + | uint_to_hex_lower8 ((d >> 0) & 255) << 16; + + u32x w2t[2]; + + w2t[0] = uint_to_hex_lower8 ((e >> 24) & 255) << 0 + | uint_to_hex_lower8 ((e >> 16) & 255) << 16; + w2t[1] = uint_to_hex_lower8 ((e >> 8) & 255) << 0 + | uint_to_hex_lower8 ((e >> 0) & 255) << 16; + + w0_t = salt_buf0[0]; + w1_t = salt_buf0[1]; + w2_t = salt_buf0[2]; + w3_t = salt_buf0[3]; + w4_t = salt_buf1[0]; + w5_t = salt_buf1[1]; + w6_t = salt_buf1[2]; + w7_t = salt_buf1[3]; + w8_t = w0t[0]; + w9_t = w0t[1]; + wa_t = w0t[2]; + wb_t = w0t[3]; + wc_t = w1t[0]; + wd_t = w1t[1]; + we_t = w1t[2]; + wf_t = w1t[3]; + + /** + * 2nd SHA1 + */ + + // 1st transform + + w0_t = swap_workaround (w0_t); + w1_t = swap_workaround (w1_t); + w2_t = swap_workaround (w2_t); + w3_t = swap_workaround (w3_t); + w4_t = swap_workaround (w4_t); + w5_t = swap_workaround (w5_t); + w6_t = swap_workaround (w6_t); + w7_t = swap_workaround (w7_t); + w8_t = swap_workaround (w8_t); + w9_t = swap_workaround (w9_t); + wa_t = swap_workaround (wa_t); + wb_t = swap_workaround (wb_t); + wc_t = swap_workaround (wc_t); + wd_t = swap_workaround (wd_t); + we_t = swap_workaround (we_t); + wf_t = swap_workaround (wf_t); + + a = SHA1M_A; + b = SHA1M_B; + c = SHA1M_C; + d = SHA1M_D; + e = SHA1M_E; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w0_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w1_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w2_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w3_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w4_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w5_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w6_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w7_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w8_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w9_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wa_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, wb_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, wc_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, wd_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, we_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F0o, e, a, b, c, d, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F0o, d, e, a, b, c, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F0o, c, d, e, a, b, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F0o, b, c, d, e, a, w3_t); + + #undef K + #define K SHA1C01 + + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w7_t); + + #undef K + #define K SHA1C02 + + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wb_t); + + #undef K + #define K SHA1C03 + + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wf_t); + + a += SHA1M_A; + b += SHA1M_B; + c += SHA1M_C; + d += SHA1M_D; + e += SHA1M_E; + + u32x r_a = a; + u32x r_b = b; + u32x r_c = c; + u32x r_d = d; + u32x r_e = e; + + // 2nd transform + + w0_t = swap_workaround (w2t[0]); + w1_t = swap_workaround (w2t[1]); + w2_t = 0x80000000; + w3_t = 0; + w4_t = 0; + w5_t = 0; + w6_t = 0; + w7_t = 0; + w8_t = 0; + w9_t = 0; + wa_t = 0; + wb_t = 0; + wc_t = 0; + wd_t = 0; + we_t = 0; + wf_t = total_len; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w0_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w1_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w2_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w3_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w4_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w5_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w6_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w7_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w8_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w9_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wa_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, wb_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, wc_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, wd_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, we_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F0o, e, a, b, c, d, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F0o, d, e, a, b, c, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F0o, c, d, e, a, b, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F0o, b, c, d, e, a, w3_t); + + #undef K + #define K SHA1C01 + + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w7_t); + + #undef K + #define K SHA1C02 + + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wb_t); + + #undef K + #define K SHA1C03 + + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wf_t); + + a += r_a; + b += r_b; + c += r_c; + d += r_d; + e += r_e; + + const u32x r0 = d; + const u32x r1 = e; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_S + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m07600_m04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = pws[gid].i[15]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * bin2asc table + */ + + __local u32 l_bin2asc[256]; + + const u32 lid4 = lid * 4; + + const u32 lid40 = lid4 + 0; + const u32 lid41 = lid4 + 1; + const u32 lid42 = lid4 + 2; + const u32 lid43 = lid4 + 3; + + const u32 v400 = (lid40 >> 0) & 15; + const u32 v401 = (lid40 >> 4) & 15; + const u32 v410 = (lid41 >> 0) & 15; + const u32 v411 = (lid41 >> 4) & 15; + const u32 v420 = (lid42 >> 0) & 15; + const u32 v421 = (lid42 >> 4) & 15; + const u32 v430 = (lid43 >> 0) & 15; + const u32 v431 = (lid43 >> 4) & 15; + + l_bin2asc[lid40] = ((v400 < 10) ? '0' + v400 : 'a' - 10 + v400) << 8 + | ((v401 < 10) ? '0' + v401 : 'a' - 10 + v401) << 0; + l_bin2asc[lid41] = ((v410 < 10) ? '0' + v410 : 'a' - 10 + v410) << 8 + | ((v411 < 10) ? '0' + v411 : 'a' - 10 + v411) << 0; + l_bin2asc[lid42] = ((v420 < 10) ? '0' + v420 : 'a' - 10 + v420) << 8 + | ((v421 < 10) ? '0' + v421 : 'a' - 10 + v421) << 0; + l_bin2asc[lid43] = ((v430 < 10) ? '0' + v430 : 'a' - 10 + v430) << 8 + | ((v431 < 10) ? '0' + v431 : 'a' - 10 + v431) << 0; + + barrier (CLK_LOCAL_MEM_FENCE); + + if (gid >= gid_max) return; + + /** + * main + */ + + m07600m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset, l_bin2asc); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m07600_m08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = pws[gid].i[15]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * bin2asc table + */ + + __local u32 l_bin2asc[256]; + + const u32 lid4 = lid * 4; + + const u32 lid40 = lid4 + 0; + const u32 lid41 = lid4 + 1; + const u32 lid42 = lid4 + 2; + const u32 lid43 = lid4 + 3; + + const u32 v400 = (lid40 >> 0) & 15; + const u32 v401 = (lid40 >> 4) & 15; + const u32 v410 = (lid41 >> 0) & 15; + const u32 v411 = (lid41 >> 4) & 15; + const u32 v420 = (lid42 >> 0) & 15; + const u32 v421 = (lid42 >> 4) & 15; + const u32 v430 = (lid43 >> 0) & 15; + const u32 v431 = (lid43 >> 4) & 15; + + l_bin2asc[lid40] = ((v400 < 10) ? '0' + v400 : 'a' - 10 + v400) << 8 + | ((v401 < 10) ? '0' + v401 : 'a' - 10 + v401) << 0; + l_bin2asc[lid41] = ((v410 < 10) ? '0' + v410 : 'a' - 10 + v410) << 8 + | ((v411 < 10) ? '0' + v411 : 'a' - 10 + v411) << 0; + l_bin2asc[lid42] = ((v420 < 10) ? '0' + v420 : 'a' - 10 + v420) << 8 + | ((v421 < 10) ? '0' + v421 : 'a' - 10 + v421) << 0; + l_bin2asc[lid43] = ((v430 < 10) ? '0' + v430 : 'a' - 10 + v430) << 8 + | ((v431 < 10) ? '0' + v431 : 'a' - 10 + v431) << 0; + + barrier (CLK_LOCAL_MEM_FENCE); + + if (gid >= gid_max) return; + + /** + * main + */ + + m07600m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset, l_bin2asc); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m07600_m16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = pws[gid].i[ 8]; + w2[1] = pws[gid].i[ 9]; + w2[2] = pws[gid].i[10]; + w2[3] = pws[gid].i[11]; + + u32x w3[4]; + + w3[0] = pws[gid].i[12]; + w3[1] = pws[gid].i[13]; + w3[2] = pws[gid].i[14]; + w3[3] = pws[gid].i[15]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * bin2asc table + */ + + __local u32 l_bin2asc[256]; + + const u32 lid4 = lid * 4; + + const u32 lid40 = lid4 + 0; + const u32 lid41 = lid4 + 1; + const u32 lid42 = lid4 + 2; + const u32 lid43 = lid4 + 3; + + const u32 v400 = (lid40 >> 0) & 15; + const u32 v401 = (lid40 >> 4) & 15; + const u32 v410 = (lid41 >> 0) & 15; + const u32 v411 = (lid41 >> 4) & 15; + const u32 v420 = (lid42 >> 0) & 15; + const u32 v421 = (lid42 >> 4) & 15; + const u32 v430 = (lid43 >> 0) & 15; + const u32 v431 = (lid43 >> 4) & 15; + + l_bin2asc[lid40] = ((v400 < 10) ? '0' + v400 : 'a' - 10 + v400) << 8 + | ((v401 < 10) ? '0' + v401 : 'a' - 10 + v401) << 0; + l_bin2asc[lid41] = ((v410 < 10) ? '0' + v410 : 'a' - 10 + v410) << 8 + | ((v411 < 10) ? '0' + v411 : 'a' - 10 + v411) << 0; + l_bin2asc[lid42] = ((v420 < 10) ? '0' + v420 : 'a' - 10 + v420) << 8 + | ((v421 < 10) ? '0' + v421 : 'a' - 10 + v421) << 0; + l_bin2asc[lid43] = ((v430 < 10) ? '0' + v430 : 'a' - 10 + v430) << 8 + | ((v431 < 10) ? '0' + v431 : 'a' - 10 + v431) << 0; + + barrier (CLK_LOCAL_MEM_FENCE); + + if (gid >= gid_max) return; + + /** + * main + */ + + m07600m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset, l_bin2asc); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m07600_s04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = pws[gid].i[15]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * bin2asc table + */ + + __local u32 l_bin2asc[256]; + + const u32 lid4 = lid * 4; + + const u32 lid40 = lid4 + 0; + const u32 lid41 = lid4 + 1; + const u32 lid42 = lid4 + 2; + const u32 lid43 = lid4 + 3; + + const u32 v400 = (lid40 >> 0) & 15; + const u32 v401 = (lid40 >> 4) & 15; + const u32 v410 = (lid41 >> 0) & 15; + const u32 v411 = (lid41 >> 4) & 15; + const u32 v420 = (lid42 >> 0) & 15; + const u32 v421 = (lid42 >> 4) & 15; + const u32 v430 = (lid43 >> 0) & 15; + const u32 v431 = (lid43 >> 4) & 15; + + l_bin2asc[lid40] = ((v400 < 10) ? '0' + v400 : 'a' - 10 + v400) << 8 + | ((v401 < 10) ? '0' + v401 : 'a' - 10 + v401) << 0; + l_bin2asc[lid41] = ((v410 < 10) ? '0' + v410 : 'a' - 10 + v410) << 8 + | ((v411 < 10) ? '0' + v411 : 'a' - 10 + v411) << 0; + l_bin2asc[lid42] = ((v420 < 10) ? '0' + v420 : 'a' - 10 + v420) << 8 + | ((v421 < 10) ? '0' + v421 : 'a' - 10 + v421) << 0; + l_bin2asc[lid43] = ((v430 < 10) ? '0' + v430 : 'a' - 10 + v430) << 8 + | ((v431 < 10) ? '0' + v431 : 'a' - 10 + v431) << 0; + + barrier (CLK_LOCAL_MEM_FENCE); + + if (gid >= gid_max) return; + + /** + * main + */ + + m07600s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset, l_bin2asc); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m07600_s08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = pws[gid].i[15]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * bin2asc table + */ + + __local u32 l_bin2asc[256]; + + const u32 lid4 = lid * 4; + + const u32 lid40 = lid4 + 0; + const u32 lid41 = lid4 + 1; + const u32 lid42 = lid4 + 2; + const u32 lid43 = lid4 + 3; + + const u32 v400 = (lid40 >> 0) & 15; + const u32 v401 = (lid40 >> 4) & 15; + const u32 v410 = (lid41 >> 0) & 15; + const u32 v411 = (lid41 >> 4) & 15; + const u32 v420 = (lid42 >> 0) & 15; + const u32 v421 = (lid42 >> 4) & 15; + const u32 v430 = (lid43 >> 0) & 15; + const u32 v431 = (lid43 >> 4) & 15; + + l_bin2asc[lid40] = ((v400 < 10) ? '0' + v400 : 'a' - 10 + v400) << 8 + | ((v401 < 10) ? '0' + v401 : 'a' - 10 + v401) << 0; + l_bin2asc[lid41] = ((v410 < 10) ? '0' + v410 : 'a' - 10 + v410) << 8 + | ((v411 < 10) ? '0' + v411 : 'a' - 10 + v411) << 0; + l_bin2asc[lid42] = ((v420 < 10) ? '0' + v420 : 'a' - 10 + v420) << 8 + | ((v421 < 10) ? '0' + v421 : 'a' - 10 + v421) << 0; + l_bin2asc[lid43] = ((v430 < 10) ? '0' + v430 : 'a' - 10 + v430) << 8 + | ((v431 < 10) ? '0' + v431 : 'a' - 10 + v431) << 0; + + barrier (CLK_LOCAL_MEM_FENCE); + + if (gid >= gid_max) return; + + /** + * main + */ + + m07600s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset, l_bin2asc); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m07600_s16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = pws[gid].i[ 8]; + w2[1] = pws[gid].i[ 9]; + w2[2] = pws[gid].i[10]; + w2[3] = pws[gid].i[11]; + + u32x w3[4]; + + w3[0] = pws[gid].i[12]; + w3[1] = pws[gid].i[13]; + w3[2] = pws[gid].i[14]; + w3[3] = pws[gid].i[15]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * bin2asc table + */ + + __local u32 l_bin2asc[256]; + + const u32 lid4 = lid * 4; + + const u32 lid40 = lid4 + 0; + const u32 lid41 = lid4 + 1; + const u32 lid42 = lid4 + 2; + const u32 lid43 = lid4 + 3; + + const u32 v400 = (lid40 >> 0) & 15; + const u32 v401 = (lid40 >> 4) & 15; + const u32 v410 = (lid41 >> 0) & 15; + const u32 v411 = (lid41 >> 4) & 15; + const u32 v420 = (lid42 >> 0) & 15; + const u32 v421 = (lid42 >> 4) & 15; + const u32 v430 = (lid43 >> 0) & 15; + const u32 v431 = (lid43 >> 4) & 15; + + l_bin2asc[lid40] = ((v400 < 10) ? '0' + v400 : 'a' - 10 + v400) << 8 + | ((v401 < 10) ? '0' + v401 : 'a' - 10 + v401) << 0; + l_bin2asc[lid41] = ((v410 < 10) ? '0' + v410 : 'a' - 10 + v410) << 8 + | ((v411 < 10) ? '0' + v411 : 'a' - 10 + v411) << 0; + l_bin2asc[lid42] = ((v420 < 10) ? '0' + v420 : 'a' - 10 + v420) << 8 + | ((v421 < 10) ? '0' + v421 : 'a' - 10 + v421) << 0; + l_bin2asc[lid43] = ((v430 < 10) ? '0' + v430 : 'a' - 10 + v430) << 8 + | ((v431 < 10) ? '0' + v431 : 'a' - 10 + v431) << 0; + + barrier (CLK_LOCAL_MEM_FENCE); + + if (gid >= gid_max) return; + + /** + * main + */ + + m07600s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset, l_bin2asc); +} diff --git a/amd/m07700_a0.cl b/amd/m07700_a0.cl new file mode 100644 index 0000000000..de695d149e --- /dev/null +++ b/amd/m07700_a0.cl @@ -0,0 +1,913 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _SAPB_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW4 +#define VECT_SIZE1 +#endif + +#ifdef VLIW5 +#define VECT_SIZE1 +#endif + +#define DGST_R0 0 +#define DGST_R1 1 +#define DGST_R2 2 +#define DGST_R3 3 + +#include "include/kernel_functions.c" +#include "types_amd.c" +#include "common_amd.c" +#include "include/rp_gpu.h" +#include "rp_amd.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#define GETCHAR(a,p) (((a)[(p) / 4] >> (((p) & 3) * 8)) & 0xff) +#define PUTCHAR(a,p,c) ((a)[(p) / 4] = (((a)[(p) / 4] & ~(0xff << (((p) & 3) * 8))) | ((c) << (((p) & 3) * 8)))) + +#define SETSHIFTEDINT(a,n,v) \ +{ \ + const u32 s = ((n) & 3) * 8; \ + const u64 x = (u64) (v) << s; \ + (a)[((n)/4)+0] &= ~(0xff << ((n & 3) * 8)); \ + (a)[((n)/4)+0] |= x; \ + (a)[((n)/4)+1] = x >> 32; \ +} + +__constant u32 sapb_trans_tbl[256] = +{ + // first value hack for 0 byte as part of an optimization + 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x3f, 0x40, 0x41, 0x50, 0x43, 0x44, 0x45, 0x4b, 0x47, 0x48, 0x4d, 0x4e, 0x54, 0x51, 0x53, 0x46, + 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x56, 0x55, 0x5c, 0x49, 0x5d, 0x4a, + 0x42, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, + 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x58, 0x5b, 0x59, 0xff, 0x52, + 0x4c, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, + 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x57, 0x5e, 0x5a, 0x4f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff +}; + +__constant u32 bcodeArray[48] = +{ + 0x14, 0x77, 0xf3, 0xd4, 0xbb, 0x71, 0x23, 0xd0, 0x03, 0xff, 0x47, 0x93, 0x55, 0xaa, 0x66, 0x91, + 0xf2, 0x88, 0x6b, 0x99, 0xbf, 0xcb, 0x32, 0x1a, 0x19, 0xd9, 0xa7, 0x82, 0x22, 0x49, 0xa2, 0x51, + 0xe2, 0xb7, 0x33, 0x71, 0x8b, 0x9f, 0x5d, 0x01, 0x44, 0x70, 0xae, 0x11, 0xef, 0x28, 0xf0, 0x0d +}; + +static u32x sapb_trans (const u32x in) +{ + u32x out = 0; + + #ifdef VECT_SIZE1 + out |= (sapb_trans_tbl[(in >> 0) & 0xff]) << 0; + out |= (sapb_trans_tbl[(in >> 8) & 0xff]) << 8; + out |= (sapb_trans_tbl[(in >> 16) & 0xff]) << 16; + out |= (sapb_trans_tbl[(in >> 24) & 0xff]) << 24; + #endif + + return out; +} + +static u32x walld0rf_magic (const u32x w0[4], const u32 pw_len, const u32x salt_buf0[4], const u32 salt_len, const u32x a, const u32x b, const u32x c, const u32x d, u32x t[16]) +{ + t[ 0] = 0; + t[ 1] = 0; + t[ 2] = 0; + t[ 3] = 0; + t[ 4] = 0; + t[ 5] = 0; + t[ 6] = 0; + t[ 7] = 0; + t[ 8] = 0; + t[ 9] = 0; + t[10] = 0; + t[11] = 0; + t[12] = 0; + t[13] = 0; + t[14] = 0; + t[15] = 0; + + u32 sum20 = ((a >> 24) & 3) + + ((a >> 16) & 3) + + ((a >> 8) & 3) + + ((a >> 0) & 3) + + ((b >> 8) & 3); + + sum20 |= 0x20; + + const u32 w[2] = { w0[0], w0[1] }; + + const u32 s[3] = { salt_buf0[0], salt_buf0[1], salt_buf0[2] }; + + u32 saved_key[4] = { a, b, c, d }; + + u32 i1 = 0; + u32 i2 = 0; + u32 i3 = 0; + + // we can assume this because the password must be at least 3 + // and the username must be at least 1 so we can save the if () + + u32 t0 = 0; + + if ((d >> 24) & 1) + { + t0 |= bcodeArray[47] << 0; + t0 |= (w[0] & 0xff) << 8; + t0 |= (s[0] & 0xff) << 16; + t0 |= bcodeArray[ 1] << 24; + + i1 = 1; + i2 = 5; + i3 = 1; + } + else + { + t0 |= (w[0] & 0xff) << 0; + t0 |= (s[0] & 0xff) << 8; + t0 |= bcodeArray[ 0] << 16; + + i1 = 1; + i2 = 4; + i3 = 1; + } + + t[0] = t0; + + // because the following code can increase i2 by a maximum of 5, + // there is an overflow potential of 4 before it comes to the next test for i2 >= sum20 + // we need to truncate in that case + + while ((i1 < pw_len) && (i3 < salt_len)) + { + u32 x0 = 0; + + u32 i2_sav = i2; + + if (GETCHAR (saved_key, 15 - i1) & 1) + { + x0 |= bcodeArray[48 - 1 - i1] << 0; i2++; + x0 |= GETCHAR (w, i1) << 8; i2++; i1++; + x0 |= GETCHAR (s, i3) << 16; i2++; i3++; + x0 |= bcodeArray[i2 - i1 - i3] << 24; i2++; i2++; + } + else + { + x0 |= GETCHAR (w, i1) << 0; i2++; i1++; + x0 |= GETCHAR (s, i3) << 8; i2++; i3++; + x0 |= bcodeArray[i2 - i1 - i3] << 16; i2++; i2++; + } + + SETSHIFTEDINT (t, i2_sav, x0); + + if (i2 >= sum20) + { + return sum20; + } + } + + while ((i1 < pw_len) || (i3 < salt_len)) + { + if (i1 < pw_len) // max 8 + { + if (GETCHAR (saved_key, 15 - i1) & 1) + { + PUTCHAR (t, i2, bcodeArray[48 - 1 - i1]); + + i2++; + } + + PUTCHAR (t, i2, GETCHAR (w, i1)); + + i1++; + i2++; + } + else + { + PUTCHAR (t, i2, GETCHAR (s, i3)); + + i2++; + i3++; + } + + PUTCHAR (t, i2, bcodeArray[i2 - i1 - i3]); + + i2++; + i2++; + + if (i2 >= sum20) + { + return sum20; + } + } + + while (i2 < sum20) + { + PUTCHAR (t, i2, bcodeArray[i2 - i1 - i3]); + + i2++; + i2++; + } + + return sum20; +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m07700_m04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = 0; + pw_buf0[3] = 0; + + u32x pw_buf1[4]; + + pw_buf1[0] = 0; + pw_buf1[1] = 0; + pw_buf1[2] = 0; + pw_buf1[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[2]; + salt_buf0[3] = 0; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + salt_buf0[0] = sapb_trans (salt_buf0[0]); + salt_buf0[1] = sapb_trans (salt_buf0[1]); + salt_buf0[2] = sapb_trans (salt_buf0[2]); + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + + w0[0] = pw_buf0[0]; + w0[1] = pw_buf0[1]; + w0[2] = 0; + w0[3] = 0; + + u32x w1[4]; + + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 out_len = apply_rules (rules_buf[il_pos].cmds, w0, w1, pw_len); + + if (out_len > 8) continue; // otherwise it overflows in waldorf function + + w0[0] = sapb_trans (w0[0]); + w0[1] = sapb_trans (w0[1]); + + /** + * append salt + */ + + u32 s0[4]; + + s0[0] = salt_buf0[0]; + s0[1] = salt_buf0[1]; + s0[2] = salt_buf0[2]; + s0[3] = 0; + + u32 s1[4]; + + s1[0] = 0; + s1[1] = 0; + s1[2] = 0; + s1[3] = 0; + + u32 s2[4]; + + s2[0] = 0; + s2[1] = 0; + s2[2] = 0; + s2[3] = 0; + + u32 s3[4]; + + s3[0] = 0; + s3[1] = 0; + s3[2] = 0; + s3[3] = 0; + + switch_buffer_by_offset (s0, s1, s2, s3, out_len); + + const u32 pw_salt_len = out_len + salt_len; + + u32x t[16]; + + t[ 0] = s0[0] | w0[0]; + t[ 1] = s0[1] | w0[1]; + t[ 2] = s0[2]; + t[ 3] = s0[3]; + t[ 4] = s1[0]; + t[ 5] = 0; + t[ 6] = 0; + t[ 7] = 0; + t[ 8] = 0; + t[ 9] = 0; + t[10] = 0; + t[11] = 0; + t[12] = 0; + t[13] = 0; + t[14] = pw_salt_len * 8; + t[15] = 0; + + PUTCHAR (t, pw_salt_len, 0x80); + + /** + * md5 + */ + + u32x a = MD5M_A; + u32x b = MD5M_B; + u32x c = MD5M_C; + u32x d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, t[ 0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, t[ 1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, t[ 2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, t[ 3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, t[ 4], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, t[ 5], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, t[ 6], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, t[ 7], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, t[ 8], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, t[ 9], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, t[10], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, t[11], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, t[12], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, t[13], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, t[14], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, t[15], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, t[ 1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, t[ 6], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, t[11], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, t[ 0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, t[ 5], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, t[10], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, t[15], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, t[ 4], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, t[ 9], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, t[14], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, t[ 3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, t[ 8], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, t[13], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, t[ 2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, t[ 7], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, t[12], MD5C1f, MD5S13); + + MD5_STEP (MD5_H , a, b, c, d, t[ 5], MD5C20, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, t[ 8], MD5C21, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, t[11], MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, t[14], MD5C23, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, t[ 1], MD5C24, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, t[ 4], MD5C25, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, t[ 7], MD5C26, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, t[10], MD5C27, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, t[13], MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, t[ 0], MD5C29, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, t[ 3], MD5C2a, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, t[ 6], MD5C2b, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, t[ 9], MD5C2c, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, t[12], MD5C2d, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, t[15], MD5C2e, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, t[ 2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, t[ 0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, t[ 7], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, t[14], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, t[ 5], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, t[12], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, t[ 3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, t[10], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, t[ 1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, t[ 8], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, t[15], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, t[ 6], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, t[13], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, t[ 4], MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, t[11], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, t[ 2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, t[ 9], MD5C3f, MD5S33); + + a += MD5M_A; + b += MD5M_B; + c += MD5M_C; + d += MD5M_D; + + const u32x sum20 = walld0rf_magic (w0, out_len, salt_buf0, salt_len, a, b, c, d, t); + + SETSHIFTEDINT (t, sum20, 0x80); + + t[14] = sum20 * 8; + + a = MD5M_A; + b = MD5M_B; + c = MD5M_C; + d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, t[ 0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, t[ 1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, t[ 2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, t[ 3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, t[ 4], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, t[ 5], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, t[ 6], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, t[ 7], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, t[ 8], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, t[ 9], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, t[10], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, t[11], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, t[12], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, t[13], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, t[14], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, t[15], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, t[ 1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, t[ 6], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, t[11], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, t[ 0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, t[ 5], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, t[10], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, t[15], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, t[ 4], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, t[ 9], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, t[14], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, t[ 3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, t[ 8], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, t[13], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, t[ 2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, t[ 7], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, t[12], MD5C1f, MD5S13); + + MD5_STEP (MD5_H , a, b, c, d, t[ 5], MD5C20, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, t[ 8], MD5C21, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, t[11], MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, t[14], MD5C23, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, t[ 1], MD5C24, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, t[ 4], MD5C25, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, t[ 7], MD5C26, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, t[10], MD5C27, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, t[13], MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, t[ 0], MD5C29, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, t[ 3], MD5C2a, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, t[ 6], MD5C2b, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, t[ 9], MD5C2c, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, t[12], MD5C2d, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, t[15], MD5C2e, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, t[ 2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, t[ 0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, t[ 7], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, t[14], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, t[ 5], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, t[12], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, t[ 3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, t[10], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, t[ 1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, t[ 8], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, t[15], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, t[ 6], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, t[13], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, t[ 4], MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, t[11], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, t[ 2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, t[ 9], MD5C3f, MD5S33); + + a += MD5M_A; + b += MD5M_B; + c += MD5M_C; + d += MD5M_D; + + a ^= c; + b ^= d; + + const u32x r0 = a; + const u32x r1 = b; + const u32x r2 = 0; + const u32x r3 = 0; + + #include VECT_COMPARE_M + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m07700_m08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m07700_m16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m07700_s04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = 0; + pw_buf0[3] = 0; + + u32x pw_buf1[4]; + + pw_buf1[0] = 0; + pw_buf1[1] = 0; + pw_buf1[2] = 0; + pw_buf1[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[2]; + salt_buf0[3] = 0; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + salt_buf0[0] = sapb_trans (salt_buf0[0]); + salt_buf0[1] = sapb_trans (salt_buf0[1]); + salt_buf0[2] = sapb_trans (salt_buf0[2]); + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + + w0[0] = pw_buf0[0]; + w0[1] = pw_buf0[1]; + w0[2] = 0; + w0[3] = 0; + + u32x w1[4]; + + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 out_len = apply_rules (rules_buf[il_pos].cmds, w0, w1, pw_len); + + if (out_len > 8) continue; // otherwise it overflows in waldorf function + + w0[0] = sapb_trans (w0[0]); + w0[1] = sapb_trans (w0[1]); + + /** + * append salt + */ + + u32 s0[4]; + + s0[0] = salt_buf0[0]; + s0[1] = salt_buf0[1]; + s0[2] = salt_buf0[2]; + s0[3] = 0; + + u32 s1[4]; + + s1[0] = 0; + s1[1] = 0; + s1[2] = 0; + s1[3] = 0; + + u32 s2[4]; + + s2[0] = 0; + s2[1] = 0; + s2[2] = 0; + s2[3] = 0; + + u32 s3[4]; + + s3[0] = 0; + s3[1] = 0; + s3[2] = 0; + s3[3] = 0; + + switch_buffer_by_offset (s0, s1, s2, s3, out_len); + + const u32 pw_salt_len = out_len + salt_len; + + u32x t[16]; + + t[ 0] = s0[0] | w0[0]; + t[ 1] = s0[1] | w0[1]; + t[ 2] = s0[2]; + t[ 3] = s0[3]; + t[ 4] = s1[0]; + t[ 5] = 0; + t[ 6] = 0; + t[ 7] = 0; + t[ 8] = 0; + t[ 9] = 0; + t[10] = 0; + t[11] = 0; + t[12] = 0; + t[13] = 0; + t[14] = pw_salt_len * 8; + t[15] = 0; + + PUTCHAR (t, pw_salt_len, 0x80); + + /** + * md5 + */ + + u32x a = MD5M_A; + u32x b = MD5M_B; + u32x c = MD5M_C; + u32x d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, t[ 0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, t[ 1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, t[ 2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, t[ 3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, t[ 4], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, t[ 5], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, t[ 6], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, t[ 7], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, t[ 8], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, t[ 9], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, t[10], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, t[11], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, t[12], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, t[13], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, t[14], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, t[15], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, t[ 1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, t[ 6], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, t[11], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, t[ 0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, t[ 5], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, t[10], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, t[15], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, t[ 4], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, t[ 9], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, t[14], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, t[ 3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, t[ 8], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, t[13], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, t[ 2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, t[ 7], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, t[12], MD5C1f, MD5S13); + + MD5_STEP (MD5_H , a, b, c, d, t[ 5], MD5C20, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, t[ 8], MD5C21, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, t[11], MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, t[14], MD5C23, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, t[ 1], MD5C24, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, t[ 4], MD5C25, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, t[ 7], MD5C26, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, t[10], MD5C27, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, t[13], MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, t[ 0], MD5C29, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, t[ 3], MD5C2a, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, t[ 6], MD5C2b, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, t[ 9], MD5C2c, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, t[12], MD5C2d, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, t[15], MD5C2e, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, t[ 2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, t[ 0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, t[ 7], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, t[14], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, t[ 5], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, t[12], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, t[ 3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, t[10], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, t[ 1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, t[ 8], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, t[15], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, t[ 6], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, t[13], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, t[ 4], MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, t[11], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, t[ 2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, t[ 9], MD5C3f, MD5S33); + + a += MD5M_A; + b += MD5M_B; + c += MD5M_C; + d += MD5M_D; + + const u32x sum20 = walld0rf_magic (w0, out_len, salt_buf0, salt_len, a, b, c, d, t); + + SETSHIFTEDINT (t, sum20, 0x80); + + t[14] = sum20 * 8; + + a = MD5M_A; + b = MD5M_B; + c = MD5M_C; + d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, t[ 0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, t[ 1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, t[ 2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, t[ 3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, t[ 4], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, t[ 5], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, t[ 6], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, t[ 7], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, t[ 8], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, t[ 9], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, t[10], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, t[11], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, t[12], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, t[13], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, t[14], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, t[15], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, t[ 1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, t[ 6], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, t[11], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, t[ 0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, t[ 5], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, t[10], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, t[15], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, t[ 4], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, t[ 9], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, t[14], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, t[ 3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, t[ 8], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, t[13], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, t[ 2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, t[ 7], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, t[12], MD5C1f, MD5S13); + + MD5_STEP (MD5_H , a, b, c, d, t[ 5], MD5C20, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, t[ 8], MD5C21, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, t[11], MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, t[14], MD5C23, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, t[ 1], MD5C24, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, t[ 4], MD5C25, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, t[ 7], MD5C26, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, t[10], MD5C27, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, t[13], MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, t[ 0], MD5C29, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, t[ 3], MD5C2a, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, t[ 6], MD5C2b, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, t[ 9], MD5C2c, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, t[12], MD5C2d, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, t[15], MD5C2e, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, t[ 2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, t[ 0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, t[ 7], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, t[14], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, t[ 5], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, t[12], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, t[ 3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, t[10], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, t[ 1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, t[ 8], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, t[15], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, t[ 6], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, t[13], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, t[ 4], MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, t[11], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, t[ 2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, t[ 9], MD5C3f, MD5S33); + + a += MD5M_A; + b += MD5M_B; + c += MD5M_C; + d += MD5M_D; + + a ^= c; + b ^= d; + + const u32x r0 = a; + const u32x r1 = b; + const u32x r2 = 0; + const u32x r3 = 0; + + #include VECT_COMPARE_S + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m07700_s08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m07700_s16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/amd/m07700_a1.cl b/amd/m07700_a1.cl new file mode 100644 index 0000000000..222781fc0e --- /dev/null +++ b/amd/m07700_a1.cl @@ -0,0 +1,971 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _SAPB_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW4 +#define VECT_SIZE1 +#endif + +#ifdef VLIW5 +#define VECT_SIZE1 +#endif + +#define DGST_R0 0 +#define DGST_R1 1 +#define DGST_R2 2 +#define DGST_R3 3 + +#include "include/kernel_functions.c" +#include "types_amd.c" +#include "common_amd.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#define GETCHAR(a,p) (((a)[(p) / 4] >> (((p) & 3) * 8)) & 0xff) +#define PUTCHAR(a,p,c) ((a)[(p) / 4] = (((a)[(p) / 4] & ~(0xff << (((p) & 3) * 8))) | ((c) << (((p) & 3) * 8)))) + +#define SETSHIFTEDINT(a,n,v) \ +{ \ + const u32 s = ((n) & 3) * 8; \ + const u64 x = (u64) (v) << s; \ + (a)[((n)/4)+0] &= ~(0xff << ((n & 3) * 8)); \ + (a)[((n)/4)+0] |= x; \ + (a)[((n)/4)+1] = x >> 32; \ +} + +__constant u32 sapb_trans_tbl[256] = +{ + // first value hack for 0 byte as part of an optimization + 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x3f, 0x40, 0x41, 0x50, 0x43, 0x44, 0x45, 0x4b, 0x47, 0x48, 0x4d, 0x4e, 0x54, 0x51, 0x53, 0x46, + 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x56, 0x55, 0x5c, 0x49, 0x5d, 0x4a, + 0x42, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, + 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x58, 0x5b, 0x59, 0xff, 0x52, + 0x4c, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, + 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x57, 0x5e, 0x5a, 0x4f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff +}; + +__constant u32 bcodeArray[48] = +{ + 0x14, 0x77, 0xf3, 0xd4, 0xbb, 0x71, 0x23, 0xd0, 0x03, 0xff, 0x47, 0x93, 0x55, 0xaa, 0x66, 0x91, + 0xf2, 0x88, 0x6b, 0x99, 0xbf, 0xcb, 0x32, 0x1a, 0x19, 0xd9, 0xa7, 0x82, 0x22, 0x49, 0xa2, 0x51, + 0xe2, 0xb7, 0x33, 0x71, 0x8b, 0x9f, 0x5d, 0x01, 0x44, 0x70, 0xae, 0x11, 0xef, 0x28, 0xf0, 0x0d +}; + +static u32x sapb_trans (const u32x in) +{ + u32x out = 0; + + #ifdef VECT_SIZE1 + out |= (sapb_trans_tbl[(in >> 0) & 0xff]) << 0; + out |= (sapb_trans_tbl[(in >> 8) & 0xff]) << 8; + out |= (sapb_trans_tbl[(in >> 16) & 0xff]) << 16; + out |= (sapb_trans_tbl[(in >> 24) & 0xff]) << 24; + #endif + + return out; +} + +static u32x walld0rf_magic (const u32x w0[4], const u32 pw_len, const u32x salt_buf0[4], const u32 salt_len, const u32x a, const u32x b, const u32x c, const u32x d, u32x t[16]) +{ + t[ 0] = 0; + t[ 1] = 0; + t[ 2] = 0; + t[ 3] = 0; + t[ 4] = 0; + t[ 5] = 0; + t[ 6] = 0; + t[ 7] = 0; + t[ 8] = 0; + t[ 9] = 0; + t[10] = 0; + t[11] = 0; + t[12] = 0; + t[13] = 0; + t[14] = 0; + t[15] = 0; + + u32 sum20 = ((a >> 24) & 3) + + ((a >> 16) & 3) + + ((a >> 8) & 3) + + ((a >> 0) & 3) + + ((b >> 8) & 3); + + sum20 |= 0x20; + + const u32 w[2] = { w0[0], w0[1] }; + + const u32 s[3] = { salt_buf0[0], salt_buf0[1], salt_buf0[2] }; + + u32 saved_key[4] = { a, b, c, d }; + + u32 i1 = 0; + u32 i2 = 0; + u32 i3 = 0; + + // we can assume this because the password must be at least 3 + // and the username must be at least 1 so we can save the if () + + u32 t0 = 0; + + if ((d >> 24) & 1) + { + t0 |= bcodeArray[47] << 0; + t0 |= (w[0] & 0xff) << 8; + t0 |= (s[0] & 0xff) << 16; + t0 |= bcodeArray[ 1] << 24; + + i1 = 1; + i2 = 5; + i3 = 1; + } + else + { + t0 |= (w[0] & 0xff) << 0; + t0 |= (s[0] & 0xff) << 8; + t0 |= bcodeArray[ 0] << 16; + + i1 = 1; + i2 = 4; + i3 = 1; + } + + t[0] = t0; + + // because the following code can increase i2 by a maximum of 5, + // there is an overflow potential of 4 before it comes to the next test for i2 >= sum20 + // we need to truncate in that case + + while ((i1 < pw_len) && (i3 < salt_len)) + { + u32 x0 = 0; + + u32 i2_sav = i2; + + if (GETCHAR (saved_key, 15 - i1) & 1) + { + x0 |= bcodeArray[48 - 1 - i1] << 0; i2++; + x0 |= GETCHAR (w, i1) << 8; i2++; i1++; + x0 |= GETCHAR (s, i3) << 16; i2++; i3++; + x0 |= bcodeArray[i2 - i1 - i3] << 24; i2++; i2++; + } + else + { + x0 |= GETCHAR (w, i1) << 0; i2++; i1++; + x0 |= GETCHAR (s, i3) << 8; i2++; i3++; + x0 |= bcodeArray[i2 - i1 - i3] << 16; i2++; i2++; + } + + SETSHIFTEDINT (t, i2_sav, x0); + + if (i2 >= sum20) + { + return sum20; + } + } + + while ((i1 < pw_len) || (i3 < salt_len)) + { + if (i1 < pw_len) // max 8 + { + if (GETCHAR (saved_key, 15 - i1) & 1) + { + PUTCHAR (t, i2, bcodeArray[48 - 1 - i1]); + + i2++; + } + + PUTCHAR (t, i2, GETCHAR (w, i1)); + + i1++; + i2++; + } + else + { + PUTCHAR (t, i2, GETCHAR (s, i3)); + + i2++; + i3++; + } + + PUTCHAR (t, i2, bcodeArray[i2 - i1 - i3]); + + i2++; + i2++; + + if (i2 >= sum20) + { + return sum20; + } + } + + while (i2 < sum20) + { + PUTCHAR (t, i2, bcodeArray[i2 - i1 - i3]); + + i2++; + i2++; + } + + return sum20; +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m07700_m04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = 0; + wordl0[3] = 0; + + u32x wordl1[4]; + + wordl1[0] = 0; + wordl1[1] = 0; + wordl1[2] = 0; + wordl1[3] = 0; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, combs_buf[0].pw_len); + } + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[2]; + salt_buf0[3] = 0; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + salt_buf0[0] = sapb_trans (salt_buf0[0]); + salt_buf0[1] = sapb_trans (salt_buf0[1]); + salt_buf0[2] = sapb_trans (salt_buf0[2]); + + /** + * digest + */ + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = combs_buf[il_pos].pw_len; + + const u32 pw_len = pw_l_len + pw_r_len; + + u32 wordr0[4]; + + wordr0[0] = combs_buf[il_pos].i[0]; + wordr0[1] = combs_buf[il_pos].i[1]; + wordr0[2] = 0; + wordr0[3] = 0; + + u32 wordr1[4]; + + wordr1[0] = 0; + wordr1[1] = 0; + wordr1[2] = 0; + wordr1[3] = 0; + + u32 wordr2[4]; + + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + + u32 wordr3[4]; + + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + u32x w0[4]; + + w0[0] = sapb_trans (wordl0[0] | wordr0[0]); + w0[1] = sapb_trans (wordl0[1] | wordr0[1]); + w0[2] = 0; + w0[3] = 0; + + /** + * append salt + */ + + u32 s0[4]; + + s0[0] = salt_buf0[0]; + s0[1] = salt_buf0[1]; + s0[2] = salt_buf0[2]; + s0[3] = 0; + + u32 s1[4]; + + s1[0] = 0; + s1[1] = 0; + s1[2] = 0; + s1[3] = 0; + + u32 s2[4]; + + s2[0] = 0; + s2[1] = 0; + s2[2] = 0; + s2[3] = 0; + + u32 s3[4]; + + s3[0] = 0; + s3[1] = 0; + s3[2] = 0; + s3[3] = 0; + + switch_buffer_by_offset (s0, s1, s2, s3, pw_len); + + const u32 pw_salt_len = pw_len + salt_len; + + u32x t[16]; + + t[ 0] = s0[0] | w0[0]; + t[ 1] = s0[1] | w0[1]; + t[ 2] = s0[2]; + t[ 3] = s0[3]; + t[ 4] = s1[0]; + t[ 5] = 0; + t[ 6] = 0; + t[ 7] = 0; + t[ 8] = 0; + t[ 9] = 0; + t[10] = 0; + t[11] = 0; + t[12] = 0; + t[13] = 0; + t[14] = pw_salt_len * 8; + t[15] = 0; + + PUTCHAR (t, pw_salt_len, 0x80); + + /** + * md5 + */ + + u32x a = MD5M_A; + u32x b = MD5M_B; + u32x c = MD5M_C; + u32x d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, t[ 0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, t[ 1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, t[ 2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, t[ 3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, t[ 4], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, t[ 5], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, t[ 6], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, t[ 7], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, t[ 8], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, t[ 9], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, t[10], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, t[11], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, t[12], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, t[13], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, t[14], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, t[15], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, t[ 1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, t[ 6], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, t[11], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, t[ 0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, t[ 5], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, t[10], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, t[15], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, t[ 4], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, t[ 9], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, t[14], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, t[ 3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, t[ 8], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, t[13], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, t[ 2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, t[ 7], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, t[12], MD5C1f, MD5S13); + + MD5_STEP (MD5_H , a, b, c, d, t[ 5], MD5C20, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, t[ 8], MD5C21, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, t[11], MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, t[14], MD5C23, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, t[ 1], MD5C24, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, t[ 4], MD5C25, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, t[ 7], MD5C26, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, t[10], MD5C27, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, t[13], MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, t[ 0], MD5C29, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, t[ 3], MD5C2a, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, t[ 6], MD5C2b, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, t[ 9], MD5C2c, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, t[12], MD5C2d, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, t[15], MD5C2e, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, t[ 2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, t[ 0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, t[ 7], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, t[14], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, t[ 5], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, t[12], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, t[ 3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, t[10], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, t[ 1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, t[ 8], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, t[15], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, t[ 6], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, t[13], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, t[ 4], MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, t[11], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, t[ 2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, t[ 9], MD5C3f, MD5S33); + + a += MD5M_A; + b += MD5M_B; + c += MD5M_C; + d += MD5M_D; + + const u32x sum20 = walld0rf_magic (w0, pw_len, salt_buf0, salt_len, a, b, c, d, t); + + SETSHIFTEDINT (t, sum20, 0x80); + + t[14] = sum20 * 8; + + a = MD5M_A; + b = MD5M_B; + c = MD5M_C; + d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, t[ 0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, t[ 1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, t[ 2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, t[ 3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, t[ 4], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, t[ 5], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, t[ 6], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, t[ 7], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, t[ 8], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, t[ 9], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, t[10], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, t[11], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, t[12], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, t[13], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, t[14], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, t[15], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, t[ 1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, t[ 6], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, t[11], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, t[ 0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, t[ 5], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, t[10], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, t[15], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, t[ 4], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, t[ 9], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, t[14], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, t[ 3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, t[ 8], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, t[13], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, t[ 2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, t[ 7], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, t[12], MD5C1f, MD5S13); + + MD5_STEP (MD5_H , a, b, c, d, t[ 5], MD5C20, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, t[ 8], MD5C21, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, t[11], MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, t[14], MD5C23, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, t[ 1], MD5C24, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, t[ 4], MD5C25, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, t[ 7], MD5C26, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, t[10], MD5C27, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, t[13], MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, t[ 0], MD5C29, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, t[ 3], MD5C2a, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, t[ 6], MD5C2b, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, t[ 9], MD5C2c, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, t[12], MD5C2d, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, t[15], MD5C2e, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, t[ 2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, t[ 0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, t[ 7], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, t[14], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, t[ 5], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, t[12], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, t[ 3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, t[10], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, t[ 1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, t[ 8], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, t[15], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, t[ 6], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, t[13], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, t[ 4], MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, t[11], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, t[ 2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, t[ 9], MD5C3f, MD5S33); + + a += MD5M_A; + b += MD5M_B; + c += MD5M_C; + d += MD5M_D; + + a ^= c; + b ^= d; + + const u32x r0 = a; + const u32x r1 = b; + const u32x r2 = 0; + const u32x r3 = 0; + + #include VECT_COMPARE_M + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m07700_m08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m07700_m16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m07700_s04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = 0; + wordl0[3] = 0; + + u32x wordl1[4]; + + wordl1[0] = 0; + wordl1[1] = 0; + wordl1[2] = 0; + wordl1[3] = 0; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, combs_buf[0].pw_len); + } + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[2]; + salt_buf0[3] = 0; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + salt_buf0[0] = sapb_trans (salt_buf0[0]); + salt_buf0[1] = sapb_trans (salt_buf0[1]); + salt_buf0[2] = sapb_trans (salt_buf0[2]); + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = combs_buf[il_pos].pw_len; + + const u32 pw_len = pw_l_len + pw_r_len; + + u32 wordr0[4]; + + wordr0[0] = combs_buf[il_pos].i[0]; + wordr0[1] = combs_buf[il_pos].i[1]; + wordr0[2] = 0; + wordr0[3] = 0; + + u32 wordr1[4]; + + wordr1[0] = 0; + wordr1[1] = 0; + wordr1[2] = 0; + wordr1[3] = 0; + + u32 wordr2[4]; + + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + + u32 wordr3[4]; + + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + u32x w0[4]; + + w0[0] = sapb_trans (wordl0[0] | wordr0[0]); + w0[1] = sapb_trans (wordl0[1] | wordr0[1]); + w0[2] = 0; + w0[3] = 0; + + /** + * append salt + */ + + u32 s0[4]; + + s0[0] = salt_buf0[0]; + s0[1] = salt_buf0[1]; + s0[2] = salt_buf0[2]; + s0[3] = 0; + + u32 s1[4]; + + s1[0] = 0; + s1[1] = 0; + s1[2] = 0; + s1[3] = 0; + + u32 s2[4]; + + s2[0] = 0; + s2[1] = 0; + s2[2] = 0; + s2[3] = 0; + + u32 s3[4]; + + s3[0] = 0; + s3[1] = 0; + s3[2] = 0; + s3[3] = 0; + + switch_buffer_by_offset (s0, s1, s2, s3, pw_len); + + const u32 pw_salt_len = pw_len + salt_len; + + u32x t[16]; + + t[ 0] = s0[0] | w0[0]; + t[ 1] = s0[1] | w0[1]; + t[ 2] = s0[2]; + t[ 3] = s0[3]; + t[ 4] = s1[0]; + t[ 5] = 0; + t[ 6] = 0; + t[ 7] = 0; + t[ 8] = 0; + t[ 9] = 0; + t[10] = 0; + t[11] = 0; + t[12] = 0; + t[13] = 0; + t[14] = pw_salt_len * 8; + t[15] = 0; + + PUTCHAR (t, pw_salt_len, 0x80); + + /** + * md5 + */ + + u32x a = MD5M_A; + u32x b = MD5M_B; + u32x c = MD5M_C; + u32x d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, t[ 0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, t[ 1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, t[ 2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, t[ 3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, t[ 4], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, t[ 5], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, t[ 6], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, t[ 7], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, t[ 8], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, t[ 9], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, t[10], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, t[11], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, t[12], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, t[13], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, t[14], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, t[15], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, t[ 1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, t[ 6], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, t[11], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, t[ 0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, t[ 5], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, t[10], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, t[15], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, t[ 4], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, t[ 9], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, t[14], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, t[ 3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, t[ 8], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, t[13], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, t[ 2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, t[ 7], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, t[12], MD5C1f, MD5S13); + + MD5_STEP (MD5_H , a, b, c, d, t[ 5], MD5C20, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, t[ 8], MD5C21, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, t[11], MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, t[14], MD5C23, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, t[ 1], MD5C24, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, t[ 4], MD5C25, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, t[ 7], MD5C26, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, t[10], MD5C27, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, t[13], MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, t[ 0], MD5C29, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, t[ 3], MD5C2a, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, t[ 6], MD5C2b, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, t[ 9], MD5C2c, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, t[12], MD5C2d, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, t[15], MD5C2e, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, t[ 2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, t[ 0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, t[ 7], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, t[14], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, t[ 5], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, t[12], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, t[ 3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, t[10], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, t[ 1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, t[ 8], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, t[15], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, t[ 6], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, t[13], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, t[ 4], MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, t[11], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, t[ 2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, t[ 9], MD5C3f, MD5S33); + + a += MD5M_A; + b += MD5M_B; + c += MD5M_C; + d += MD5M_D; + + const u32x sum20 = walld0rf_magic (w0, pw_len, salt_buf0, salt_len, a, b, c, d, t); + + SETSHIFTEDINT (t, sum20, 0x80); + + t[14] = sum20 * 8; + + a = MD5M_A; + b = MD5M_B; + c = MD5M_C; + d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, t[ 0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, t[ 1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, t[ 2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, t[ 3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, t[ 4], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, t[ 5], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, t[ 6], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, t[ 7], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, t[ 8], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, t[ 9], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, t[10], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, t[11], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, t[12], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, t[13], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, t[14], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, t[15], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, t[ 1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, t[ 6], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, t[11], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, t[ 0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, t[ 5], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, t[10], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, t[15], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, t[ 4], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, t[ 9], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, t[14], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, t[ 3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, t[ 8], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, t[13], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, t[ 2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, t[ 7], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, t[12], MD5C1f, MD5S13); + + MD5_STEP (MD5_H , a, b, c, d, t[ 5], MD5C20, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, t[ 8], MD5C21, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, t[11], MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, t[14], MD5C23, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, t[ 1], MD5C24, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, t[ 4], MD5C25, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, t[ 7], MD5C26, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, t[10], MD5C27, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, t[13], MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, t[ 0], MD5C29, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, t[ 3], MD5C2a, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, t[ 6], MD5C2b, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, t[ 9], MD5C2c, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, t[12], MD5C2d, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, t[15], MD5C2e, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, t[ 2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, t[ 0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, t[ 7], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, t[14], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, t[ 5], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, t[12], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, t[ 3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, t[10], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, t[ 1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, t[ 8], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, t[15], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, t[ 6], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, t[13], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, t[ 4], MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, t[11], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, t[ 2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, t[ 9], MD5C3f, MD5S33); + + a += MD5M_A; + b += MD5M_B; + c += MD5M_C; + d += MD5M_D; + + a ^= c; + b ^= d; + + const u32x r0 = a; + const u32x r1 = b; + const u32x r2 = 0; + const u32x r3 = 0; + + #include VECT_COMPARE_S + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m07700_s08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m07700_s16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/amd/m07700_a3.cl b/amd/m07700_a3.cl new file mode 100644 index 0000000000..b7cb02df6b --- /dev/null +++ b/amd/m07700_a3.cl @@ -0,0 +1,1007 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _SAPB_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW4 +#define VECT_SIZE1 +#endif + +#ifdef VLIW5 +#define VECT_SIZE1 +#endif + +#define DGST_R0 0 +#define DGST_R1 1 +#define DGST_R2 2 +#define DGST_R3 3 + +#include "include/kernel_functions.c" +#include "types_amd.c" +#include "common_amd.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#define GETCHAR(a,p) (((a)[(p) / 4] >> (((p) & 3) * 8)) & 0xff) +#define PUTCHAR(a,p,c) ((a)[(p) / 4] = (((a)[(p) / 4] & ~(0xff << (((p) & 3) * 8))) | ((c) << (((p) & 3) * 8)))) + +#define SETSHIFTEDINT(a,n,v) \ +{ \ + const u32 s = ((n) & 3) * 8; \ + const u64 x = (u64) (v) << s; \ + (a)[((n)/4)+0] &= ~(0xff << ((n & 3) * 8)); \ + (a)[((n)/4)+0] |= x; \ + (a)[((n)/4)+1] = x >> 32; \ +} + +__constant u32 sapb_trans_tbl[256] = +{ + // first value hack for 0 byte as part of an optimization + 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x3f, 0x40, 0x41, 0x50, 0x43, 0x44, 0x45, 0x4b, 0x47, 0x48, 0x4d, 0x4e, 0x54, 0x51, 0x53, 0x46, + 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x56, 0x55, 0x5c, 0x49, 0x5d, 0x4a, + 0x42, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, + 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x58, 0x5b, 0x59, 0xff, 0x52, + 0x4c, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, + 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x57, 0x5e, 0x5a, 0x4f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff +}; + +__constant u32 bcodeArray[48] = +{ + 0x14, 0x77, 0xf3, 0xd4, 0xbb, 0x71, 0x23, 0xd0, 0x03, 0xff, 0x47, 0x93, 0x55, 0xaa, 0x66, 0x91, + 0xf2, 0x88, 0x6b, 0x99, 0xbf, 0xcb, 0x32, 0x1a, 0x19, 0xd9, 0xa7, 0x82, 0x22, 0x49, 0xa2, 0x51, + 0xe2, 0xb7, 0x33, 0x71, 0x8b, 0x9f, 0x5d, 0x01, 0x44, 0x70, 0xae, 0x11, 0xef, 0x28, 0xf0, 0x0d +}; + +static u32x sapb_trans (const u32x in) +{ + u32x out = 0; + + #ifdef VECT_SIZE1 + out |= (sapb_trans_tbl[(in >> 0) & 0xff]) << 0; + out |= (sapb_trans_tbl[(in >> 8) & 0xff]) << 8; + out |= (sapb_trans_tbl[(in >> 16) & 0xff]) << 16; + out |= (sapb_trans_tbl[(in >> 24) & 0xff]) << 24; + #endif + + return out; +} + +static u32x walld0rf_magic (const u32x w0[4], const u32 pw_len, const u32x salt_buf0[4], const u32 salt_len, const u32x a, const u32x b, const u32x c, const u32x d, u32x t[16]) +{ + t[ 0] = 0; + t[ 1] = 0; + t[ 2] = 0; + t[ 3] = 0; + t[ 4] = 0; + t[ 5] = 0; + t[ 6] = 0; + t[ 7] = 0; + t[ 8] = 0; + t[ 9] = 0; + t[10] = 0; + t[11] = 0; + t[12] = 0; + t[13] = 0; + t[14] = 0; + t[15] = 0; + + u32 sum20 = ((a >> 24) & 3) + + ((a >> 16) & 3) + + ((a >> 8) & 3) + + ((a >> 0) & 3) + + ((b >> 8) & 3); + + sum20 |= 0x20; + + const u32 w[2] = { w0[0], w0[1] }; + + const u32 s[3] = { salt_buf0[0], salt_buf0[1], salt_buf0[2] }; + + u32 saved_key[4] = { a, b, c, d }; + + u32 i1 = 0; + u32 i2 = 0; + u32 i3 = 0; + + // we can assume this because the password must be at least 3 + // and the username must be at least 1 so we can save the if () + + u32 t0 = 0; + + if ((d >> 24) & 1) + { + t0 |= bcodeArray[47] << 0; + t0 |= (w[0] & 0xff) << 8; + t0 |= (s[0] & 0xff) << 16; + t0 |= bcodeArray[ 1] << 24; + + i1 = 1; + i2 = 5; + i3 = 1; + } + else + { + t0 |= (w[0] & 0xff) << 0; + t0 |= (s[0] & 0xff) << 8; + t0 |= bcodeArray[ 0] << 16; + + i1 = 1; + i2 = 4; + i3 = 1; + } + + t[0] = t0; + + // because the following code can increase i2 by a maximum of 5, + // there is an overflow potential of 4 before it comes to the next test for i2 >= sum20 + // we need to truncate in that case + + while ((i1 < pw_len) && (i3 < salt_len)) + { + u32 x0 = 0; + + u32 i2_sav = i2; + + if (GETCHAR (saved_key, 15 - i1) & 1) + { + x0 |= bcodeArray[48 - 1 - i1] << 0; i2++; + x0 |= GETCHAR (w, i1) << 8; i2++; i1++; + x0 |= GETCHAR (s, i3) << 16; i2++; i3++; + x0 |= bcodeArray[i2 - i1 - i3] << 24; i2++; i2++; + } + else + { + x0 |= GETCHAR (w, i1) << 0; i2++; i1++; + x0 |= GETCHAR (s, i3) << 8; i2++; i3++; + x0 |= bcodeArray[i2 - i1 - i3] << 16; i2++; i2++; + } + + SETSHIFTEDINT (t, i2_sav, x0); + + if (i2 >= sum20) + { + return sum20; + } + } + + while ((i1 < pw_len) || (i3 < salt_len)) + { + if (i1 < pw_len) // max 8 + { + if (GETCHAR (saved_key, 15 - i1) & 1) + { + PUTCHAR (t, i2, bcodeArray[48 - 1 - i1]); + + i2++; + } + + PUTCHAR (t, i2, GETCHAR (w, i1)); + + i1++; + i2++; + } + else + { + PUTCHAR (t, i2, GETCHAR (s, i3)); + + i2++; + i3++; + } + + PUTCHAR (t, i2, bcodeArray[i2 - i1 - i3]); + + i2++; + i2++; + + if (i2 >= sum20) + { + return sum20; + } + } + + while (i2 < sum20) + { + PUTCHAR (t, i2, bcodeArray[i2 - i1 - i3]); + + i2++; + i2++; + } + + return sum20; +} + +static void m07700m (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], const u32 pw_len, __global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset) +{ + /** + * modifier + */ + + const u32 gid = get_global_id (0); + const u32 lid = get_local_id (0); + + w0[0] = sapb_trans (w0[0]); + w0[1] = sapb_trans (w0[1]); + + /** + * salt + */ + + u32 salt_buf0[3]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[2]; + + salt_buf0[0] = sapb_trans (salt_buf0[0]); + salt_buf0[1] = sapb_trans (salt_buf0[1]); + salt_buf0[2] = sapb_trans (salt_buf0[2]); + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + u32 s0[4]; + + s0[0] = salt_buf0[0]; + s0[1] = salt_buf0[1]; + s0[2] = salt_buf0[2]; + s0[3] = 0; + + u32 s1[4]; + + s1[0] = 0; + s1[1] = 0; + s1[2] = 0; + s1[3] = 0; + + u32 s2[4]; + + s2[0] = 0; + s2[1] = 0; + s2[2] = 0; + s2[3] = 0; + + u32 s3[4]; + + s3[0] = 0; + s3[1] = 0; + s3[2] = 0; + s3[3] = 0; + + switch_buffer_by_offset (s0, s1, s2, s3, pw_len); + + const u32 pw_salt_len = pw_len + salt_len; + + /** + * loop + */ + + u32x w0l = w0[0]; + + for (u32 il_pos = 0; il_pos < bfs_cnt; il_pos++) + { + const u32 w0r = sapb_trans (bfs_buf[il_pos].i); + + w0[0] = w0l | w0r; + + u32x t[16]; + + t[ 0] = s0[0] | w0[0]; + t[ 1] = s0[1] | w0[1]; + t[ 2] = s0[2]; + t[ 3] = s0[3]; + t[ 4] = s1[0]; + t[ 5] = 0; + t[ 6] = 0; + t[ 7] = 0; + t[ 8] = 0; + t[ 9] = 0; + t[10] = 0; + t[11] = 0; + t[12] = 0; + t[13] = 0; + t[14] = pw_salt_len * 8; + t[15] = 0; + + PUTCHAR (t, pw_salt_len, 0x80); + + /** + * md5 + */ + + u32x a = MD5M_A; + u32x b = MD5M_B; + u32x c = MD5M_C; + u32x d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, t[ 0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, t[ 1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, t[ 2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, t[ 3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, t[ 4], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, t[ 5], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, t[ 6], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, t[ 7], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, t[ 8], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, t[ 9], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, t[10], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, t[11], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, t[12], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, t[13], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, t[14], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, t[15], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, t[ 1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, t[ 6], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, t[11], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, t[ 0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, t[ 5], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, t[10], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, t[15], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, t[ 4], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, t[ 9], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, t[14], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, t[ 3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, t[ 8], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, t[13], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, t[ 2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, t[ 7], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, t[12], MD5C1f, MD5S13); + + MD5_STEP (MD5_H , a, b, c, d, t[ 5], MD5C20, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, t[ 8], MD5C21, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, t[11], MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, t[14], MD5C23, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, t[ 1], MD5C24, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, t[ 4], MD5C25, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, t[ 7], MD5C26, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, t[10], MD5C27, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, t[13], MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, t[ 0], MD5C29, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, t[ 3], MD5C2a, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, t[ 6], MD5C2b, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, t[ 9], MD5C2c, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, t[12], MD5C2d, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, t[15], MD5C2e, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, t[ 2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, t[ 0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, t[ 7], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, t[14], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, t[ 5], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, t[12], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, t[ 3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, t[10], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, t[ 1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, t[ 8], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, t[15], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, t[ 6], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, t[13], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, t[ 4], MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, t[11], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, t[ 2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, t[ 9], MD5C3f, MD5S33); + + a += MD5M_A; + b += MD5M_B; + c += MD5M_C; + d += MD5M_D; + + const u32x sum20 = walld0rf_magic (w0, pw_len, salt_buf0, salt_len, a, b, c, d, t); + + SETSHIFTEDINT (t, sum20, 0x80); + + t[14] = sum20 * 8; + + a = MD5M_A; + b = MD5M_B; + c = MD5M_C; + d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, t[ 0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, t[ 1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, t[ 2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, t[ 3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, t[ 4], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, t[ 5], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, t[ 6], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, t[ 7], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, t[ 8], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, t[ 9], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, t[10], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, t[11], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, t[12], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, t[13], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, t[14], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, t[15], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, t[ 1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, t[ 6], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, t[11], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, t[ 0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, t[ 5], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, t[10], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, t[15], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, t[ 4], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, t[ 9], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, t[14], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, t[ 3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, t[ 8], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, t[13], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, t[ 2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, t[ 7], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, t[12], MD5C1f, MD5S13); + + MD5_STEP (MD5_H , a, b, c, d, t[ 5], MD5C20, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, t[ 8], MD5C21, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, t[11], MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, t[14], MD5C23, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, t[ 1], MD5C24, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, t[ 4], MD5C25, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, t[ 7], MD5C26, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, t[10], MD5C27, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, t[13], MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, t[ 0], MD5C29, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, t[ 3], MD5C2a, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, t[ 6], MD5C2b, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, t[ 9], MD5C2c, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, t[12], MD5C2d, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, t[15], MD5C2e, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, t[ 2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, t[ 0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, t[ 7], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, t[14], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, t[ 5], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, t[12], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, t[ 3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, t[10], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, t[ 1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, t[ 8], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, t[15], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, t[ 6], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, t[13], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, t[ 4], MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, t[11], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, t[ 2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, t[ 9], MD5C3f, MD5S33); + + a += MD5M_A; + b += MD5M_B; + c += MD5M_C; + d += MD5M_D; + + a ^= c; + b ^= d; + + const u32x r0 = a; + const u32x r1 = b; + const u32x r2 = 0; + const u32x r3 = 0; + + #include VECT_COMPARE_M + } +} + +static void m07700s (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], const u32 pw_len, __global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset) +{ + /** + * modifier + */ + + const u32 gid = get_global_id (0); + const u32 lid = get_local_id (0); + + w0[0] = sapb_trans (w0[0]); + w0[1] = sapb_trans (w0[1]); + + /** + * salt + */ + + u32 salt_buf0[3]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[2]; + + salt_buf0[0] = sapb_trans (salt_buf0[0]); + salt_buf0[1] = sapb_trans (salt_buf0[1]); + salt_buf0[2] = sapb_trans (salt_buf0[2]); + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + u32 s0[4]; + + s0[0] = salt_buf0[0]; + s0[1] = salt_buf0[1]; + s0[2] = salt_buf0[2]; + s0[3] = 0; + + u32 s1[4]; + + s1[0] = 0; + s1[1] = 0; + s1[2] = 0; + s1[3] = 0; + + u32 s2[4]; + + s2[0] = 0; + s2[1] = 0; + s2[2] = 0; + s2[3] = 0; + + u32 s3[4]; + + s3[0] = 0; + s3[1] = 0; + s3[2] = 0; + s3[3] = 0; + + switch_buffer_by_offset (s0, s1, s2, s3, pw_len); + + const u32 pw_salt_len = pw_len + salt_len; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * loop + */ + + u32x w0l = w0[0]; + + for (u32 il_pos = 0; il_pos < bfs_cnt; il_pos++) + { + const u32 w0r = sapb_trans (bfs_buf[il_pos].i); + + w0[0] = w0l | w0r; + + u32x t[16]; + + t[ 0] = s0[0] | w0[0]; + t[ 1] = s0[1] | w0[1]; + t[ 2] = s0[2]; + t[ 3] = s0[3]; + t[ 4] = s1[0]; + t[ 5] = 0; + t[ 6] = 0; + t[ 7] = 0; + t[ 8] = 0; + t[ 9] = 0; + t[10] = 0; + t[11] = 0; + t[12] = 0; + t[13] = 0; + t[14] = pw_salt_len * 8; + t[15] = 0; + + PUTCHAR (t, pw_salt_len, 0x80); + + /** + * md5 + */ + + u32x a = MD5M_A; + u32x b = MD5M_B; + u32x c = MD5M_C; + u32x d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, t[ 0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, t[ 1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, t[ 2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, t[ 3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, t[ 4], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, t[ 5], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, t[ 6], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, t[ 7], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, t[ 8], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, t[ 9], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, t[10], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, t[11], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, t[12], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, t[13], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, t[14], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, t[15], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, t[ 1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, t[ 6], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, t[11], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, t[ 0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, t[ 5], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, t[10], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, t[15], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, t[ 4], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, t[ 9], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, t[14], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, t[ 3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, t[ 8], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, t[13], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, t[ 2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, t[ 7], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, t[12], MD5C1f, MD5S13); + + MD5_STEP (MD5_H , a, b, c, d, t[ 5], MD5C20, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, t[ 8], MD5C21, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, t[11], MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, t[14], MD5C23, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, t[ 1], MD5C24, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, t[ 4], MD5C25, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, t[ 7], MD5C26, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, t[10], MD5C27, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, t[13], MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, t[ 0], MD5C29, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, t[ 3], MD5C2a, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, t[ 6], MD5C2b, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, t[ 9], MD5C2c, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, t[12], MD5C2d, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, t[15], MD5C2e, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, t[ 2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, t[ 0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, t[ 7], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, t[14], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, t[ 5], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, t[12], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, t[ 3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, t[10], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, t[ 1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, t[ 8], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, t[15], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, t[ 6], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, t[13], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, t[ 4], MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, t[11], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, t[ 2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, t[ 9], MD5C3f, MD5S33); + + a += MD5M_A; + b += MD5M_B; + c += MD5M_C; + d += MD5M_D; + + const u32x sum20 = walld0rf_magic (w0, pw_len, salt_buf0, salt_len, a, b, c, d, t); + + SETSHIFTEDINT (t, sum20, 0x80); + + t[14] = sum20 * 8; + + a = MD5M_A; + b = MD5M_B; + c = MD5M_C; + d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, t[ 0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, t[ 1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, t[ 2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, t[ 3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, t[ 4], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, t[ 5], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, t[ 6], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, t[ 7], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, t[ 8], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, t[ 9], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, t[10], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, t[11], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, t[12], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, t[13], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, t[14], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, t[15], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, t[ 1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, t[ 6], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, t[11], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, t[ 0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, t[ 5], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, t[10], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, t[15], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, t[ 4], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, t[ 9], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, t[14], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, t[ 3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, t[ 8], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, t[13], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, t[ 2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, t[ 7], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, t[12], MD5C1f, MD5S13); + + MD5_STEP (MD5_H , a, b, c, d, t[ 5], MD5C20, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, t[ 8], MD5C21, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, t[11], MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, t[14], MD5C23, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, t[ 1], MD5C24, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, t[ 4], MD5C25, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, t[ 7], MD5C26, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, t[10], MD5C27, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, t[13], MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, t[ 0], MD5C29, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, t[ 3], MD5C2a, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, t[ 6], MD5C2b, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, t[ 9], MD5C2c, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, t[12], MD5C2d, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, t[15], MD5C2e, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, t[ 2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, t[ 0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, t[ 7], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, t[14], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, t[ 5], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, t[12], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, t[ 3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, t[10], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, t[ 1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, t[ 8], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, t[15], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, t[ 6], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, t[13], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, t[ 4], MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, t[11], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, t[ 2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, t[ 9], MD5C3f, MD5S33); + + a += MD5M_A; + b += MD5M_B; + c += MD5M_C; + d += MD5M_D; + + a ^= c; + b ^= d; + + const u32x r0 = a; + const u32x r1 = b; + const u32x r2 = 0; + const u32x r3 = 0; + + #include VECT_COMPARE_S + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m07700_m04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m07700m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m07700_m08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m07700m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m07700_m16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m07700_s04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m07700s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m07700_s08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m07700s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m07700_s16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/amd/m07800_a0.cl b/amd/m07800_a0.cl new file mode 100644 index 0000000000..65e373e125 --- /dev/null +++ b/amd/m07800_a0.cl @@ -0,0 +1,755 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _SAPG_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW4 +#define VECT_SIZE1 +#endif + +#ifdef VLIW5 +#define VECT_SIZE1 +#endif + +#define DGST_R0 3 +#define DGST_R1 4 +#define DGST_R2 2 +#define DGST_R3 1 + +#include "include/kernel_functions.c" +#include "types_amd.c" +#include "common_amd.c" +#include "include/rp_gpu.h" +#include "rp_amd.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#define GETSHIFTEDINT(a,n) amd_bytealign ((a)[((n)/4)+1], (a)[((n)/4)+0], (n)) + +#define SETSHIFTEDINT(a,n,v) \ +{ \ + const u32 s = ((n) & 3) * 8; \ + const u64 x = (u64) (v) << s; \ + (a)[((n)/4)+0] |= x; \ + (a)[((n)/4)+1] = x >> 32; \ +} + +__constant u32 theMagicArray[64] = +{ + 0x1451ac91,0x4354679f,0xe03be724,0xc27b7428,0xeb133386,0x5ccb4f5a,0x37730a08,0x2f1c5d0e, + 0xe5e68f33,0xddae9bf8,0x8d4bf216,0xdcd4e12c,0x9ddfcbb0,0x176d70d4,0x3f424df9,0x94111b9b, + 0x9bc15b9f,0x039d0506,0x8a135e9d,0xe86a9a1e,0x17147cd9,0xf62ac758,0x0a6399a1,0xc370fdd7, + 0x13745ef6,0x040bc903,0x26f79826,0x2593928a,0x230da2b0,0x6d7963ed,0x3cfa3213,0xa39a0235, + 0x0a8eddb3,0xc351bf24,0x9f55cd7c,0x4c94af37,0x82520829,0x374e3bb2,0x9107179f,0xcdfd3b11, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0 +}; + +static void swap_buffer (u32x final[16]) +{ + final[ 0] = swap_workaround (final[ 0]); + final[ 1] = swap_workaround (final[ 1]); + final[ 2] = swap_workaround (final[ 2]); + final[ 3] = swap_workaround (final[ 3]); + final[ 4] = swap_workaround (final[ 4]); + final[ 5] = swap_workaround (final[ 5]); + final[ 6] = swap_workaround (final[ 6]); + final[ 7] = swap_workaround (final[ 7]); + final[ 8] = swap_workaround (final[ 8]); + final[ 9] = swap_workaround (final[ 9]); + final[10] = swap_workaround (final[10]); + final[11] = swap_workaround (final[11]); + final[12] = swap_workaround (final[12]); + final[13] = swap_workaround (final[13]); + final[14] = swap_workaround (final[14]); + final[15] = swap_workaround (final[15]); +} + +static void sha1_transform (const u32x w0[4], const u32x w1[4], const u32x w2[4], const u32x w3[4], u32x digest[5]) +{ + u32x A = digest[0]; + u32x B = digest[1]; + u32x C = digest[2]; + u32x D = digest[3]; + u32x E = digest[4]; + + u32x w0_t = w0[0]; + u32x w1_t = w0[1]; + u32x w2_t = w0[2]; + u32x w3_t = w0[3]; + u32x w4_t = w1[0]; + u32x w5_t = w1[1]; + u32x w6_t = w1[2]; + u32x w7_t = w1[3]; + u32x w8_t = w2[0]; + u32x w9_t = w2[1]; + u32x wa_t = w2[2]; + u32x wb_t = w2[3]; + u32x wc_t = w3[0]; + u32x wd_t = w3[1]; + u32x we_t = w3[2]; + u32x wf_t = w3[3]; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, A, B, C, D, E, w0_t); + SHA1_STEP (SHA1_F0o, E, A, B, C, D, w1_t); + SHA1_STEP (SHA1_F0o, D, E, A, B, C, w2_t); + SHA1_STEP (SHA1_F0o, C, D, E, A, B, w3_t); + SHA1_STEP (SHA1_F0o, B, C, D, E, A, w4_t); + SHA1_STEP (SHA1_F0o, A, B, C, D, E, w5_t); + SHA1_STEP (SHA1_F0o, E, A, B, C, D, w6_t); + SHA1_STEP (SHA1_F0o, D, E, A, B, C, w7_t); + SHA1_STEP (SHA1_F0o, C, D, E, A, B, w8_t); + SHA1_STEP (SHA1_F0o, B, C, D, E, A, w9_t); + SHA1_STEP (SHA1_F0o, A, B, C, D, E, wa_t); + SHA1_STEP (SHA1_F0o, E, A, B, C, D, wb_t); + SHA1_STEP (SHA1_F0o, D, E, A, B, C, wc_t); + SHA1_STEP (SHA1_F0o, C, D, E, A, B, wd_t); + SHA1_STEP (SHA1_F0o, B, C, D, E, A, we_t); + SHA1_STEP (SHA1_F0o, A, B, C, D, E, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F0o, E, A, B, C, D, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F0o, D, E, A, B, C, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F0o, C, D, E, A, B, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F0o, B, C, D, E, A, w3_t); + + #undef K + #define K SHA1C01 + + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w7_t); + + #undef K + #define K SHA1C02 + + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, wb_t); + + #undef K + #define K SHA1C03 + + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, wf_t); + + digest[0] += A; + digest[1] += B; + digest[2] += C; + digest[3] += D; + digest[4] += E; +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m07800_m04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + u32x pw_buf1[4]; + + pw_buf1[0] = pws[gid].i[ 4]; + pw_buf1[1] = pws[gid].i[ 5]; + pw_buf1[2] = pws[gid].i[ 6]; + pw_buf1[3] = pws[gid].i[ 7]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * salt + */ + + u32 salt_buf[8]; + + salt_buf[0] = salt_bufs[salt_pos].salt_buf[0]; + salt_buf[1] = salt_bufs[salt_pos].salt_buf[1]; + salt_buf[2] = salt_bufs[salt_pos].salt_buf[2]; + salt_buf[3] = salt_bufs[salt_pos].salt_buf[3]; + salt_buf[4] = salt_bufs[salt_pos].salt_buf[4]; + salt_buf[5] = salt_bufs[salt_pos].salt_buf[5]; + salt_buf[6] = salt_bufs[salt_pos].salt_buf[6]; + salt_buf[7] = salt_bufs[salt_pos].salt_buf[7]; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + + w0[0] = pw_buf0[0]; + w0[1] = pw_buf0[1]; + w0[2] = pw_buf0[2]; + w0[3] = pw_buf0[3]; + + u32x w1[4]; + + w1[0] = pw_buf1[0]; + w1[1] = pw_buf1[1]; + w1[2] = pw_buf1[2]; + w1[3] = pw_buf1[3]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 out_len = apply_rules (rules_buf[il_pos].cmds, w0, w1, pw_len); + + /** + * append salt + */ + + u32 s0[4]; + + s0[0] = salt_buf[0]; + s0[1] = salt_buf[1]; + s0[2] = salt_buf[2]; + s0[3] = salt_buf[3]; + + u32 s1[4]; + + s1[0] = salt_buf[4]; + s1[1] = salt_buf[5]; + s1[2] = salt_buf[6]; + s1[3] = salt_buf[7]; + + u32 s2[4]; + + s2[0] = 0; + s2[1] = 0; + s2[2] = 0; + s2[3] = 0; + + u32 s3[4]; + + s3[0] = 0; + s3[1] = 0; + s3[2] = 0; + s3[3] = 0; + + switch_buffer_by_offset (s0, s1, s2, s3, out_len); + + const u32 pw_salt_len = out_len + salt_len; + + /** + * sha1 + */ + + u32x final[256]; + + final[ 0] = swap_workaround (w0[0] | s0[0]); + final[ 1] = swap_workaround (w0[1] | s0[1]); + final[ 2] = swap_workaround (w0[2] | s0[2]); + final[ 3] = swap_workaround (w0[3] | s0[3]); + final[ 4] = swap_workaround (w1[0] | s1[0]); + final[ 5] = swap_workaround (w1[1] | s1[1]); + final[ 6] = swap_workaround (w1[2] | s1[2]); + final[ 7] = swap_workaround (w1[3] | s1[3]); + final[ 8] = swap_workaround (w2[0] | s2[0]); + final[ 9] = swap_workaround (w2[1] | s2[1]); + final[10] = swap_workaround (w2[2] | s2[2]); + final[11] = swap_workaround (w2[3] | s2[3]); + final[12] = swap_workaround (w3[0] | s3[0]); + final[13] = swap_workaround (w3[1] | s3[1]); + final[14] = 0; + final[15] = pw_salt_len * 8; + + u32x digest[5]; + + digest[0] = SHA1M_A; + digest[1] = SHA1M_B; + digest[2] = SHA1M_C; + digest[3] = SHA1M_D; + digest[4] = SHA1M_E; + + sha1_transform (&final[0], &final[4], &final[8], &final[12], digest); + + // prepare magic array range + + u32x lengthMagicArray = 0x20; + u32x offsetMagicArray = 0; + + lengthMagicArray += ((digest[0] >> 24) & 0xff) % 6; + lengthMagicArray += ((digest[0] >> 16) & 0xff) % 6; + lengthMagicArray += ((digest[0] >> 8) & 0xff) % 6; + lengthMagicArray += ((digest[0] >> 0) & 0xff) % 6; + lengthMagicArray += ((digest[1] >> 24) & 0xff) % 6; + lengthMagicArray += ((digest[1] >> 16) & 0xff) % 6; + lengthMagicArray += ((digest[1] >> 8) & 0xff) % 6; + lengthMagicArray += ((digest[1] >> 0) & 0xff) % 6; + lengthMagicArray += ((digest[2] >> 24) & 0xff) % 6; + lengthMagicArray += ((digest[2] >> 16) & 0xff) % 6; + offsetMagicArray += ((digest[2] >> 8) & 0xff) % 8; + offsetMagicArray += ((digest[2] >> 0) & 0xff) % 8; + offsetMagicArray += ((digest[3] >> 24) & 0xff) % 8; + offsetMagicArray += ((digest[3] >> 16) & 0xff) % 8; + offsetMagicArray += ((digest[3] >> 8) & 0xff) % 8; + offsetMagicArray += ((digest[3] >> 0) & 0xff) % 8; + offsetMagicArray += ((digest[4] >> 24) & 0xff) % 8; + offsetMagicArray += ((digest[4] >> 16) & 0xff) % 8; + offsetMagicArray += ((digest[4] >> 8) & 0xff) % 8; + offsetMagicArray += ((digest[4] >> 0) & 0xff) % 8; + + // final + + digest[0] = SHA1M_A; + digest[1] = SHA1M_B; + digest[2] = SHA1M_C; + digest[3] = SHA1M_D; + digest[4] = SHA1M_E; + + #pragma unroll 64 + for (int i = 0; i < 64; i++) final[i] = 0; + + final[0] = w0[0]; + final[1] = w0[1]; + final[2] = w0[2]; + final[3] = w0[3]; + final[4] = w1[0]; + final[5] = w1[1]; + final[6] = w1[2]; + final[7] = w1[3]; + + u32 final_len = out_len; + + int i; + + // append MagicArray + + for (i = 0; i < lengthMagicArray - 4; i += 4) + { + const u32 tmp = GETSHIFTEDINT (theMagicArray, offsetMagicArray + i); + + SETSHIFTEDINT (final, final_len + i, tmp); + } + + const u32 mask = 0xffffffff >> (((i - lengthMagicArray) & 3) * 8); + + const u32 tmp = GETSHIFTEDINT (theMagicArray, offsetMagicArray + i) & mask; + + SETSHIFTEDINT (final, final_len + i, tmp); + + final_len += lengthMagicArray; + + // append Salt + + for (i = 0; i < salt_len + 1; i += 4) // +1 for the 0x80 + { + const u32 tmp = salt_buf[i / 4]; // attention, int[] not char[] + + SETSHIFTEDINT (final, final_len + i, tmp); + } + + final_len += salt_len; + + // calculate + + int left; + int off; + + for (left = final_len, off = 0; left >= 56; left -= 64, off += 16) + { + swap_buffer (&final[off]); + + sha1_transform (&final[off + 0], &final[off + 4], &final[off + 8], &final[off + 12], digest); + } + + swap_buffer (&final[off]); + + final[off + 14] = 0; + final[off + 15] = final_len * 8; + + sha1_transform (&final[off + 0], &final[off + 4], &final[off + 8], &final[off + 12], digest); + + const u32x r0 = digest[3]; + const u32x r1 = digest[4]; + const u32x r2 = digest[2]; + const u32x r3 = digest[1]; + + #include VECT_COMPARE_M + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m07800_m08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m07800_m16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m07800_s04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + u32x pw_buf1[4]; + + pw_buf1[0] = pws[gid].i[ 4]; + pw_buf1[1] = pws[gid].i[ 5]; + pw_buf1[2] = pws[gid].i[ 6]; + pw_buf1[3] = pws[gid].i[ 7]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * salt + */ + + u32 salt_buf[8]; + + salt_buf[0] = salt_bufs[salt_pos].salt_buf[0]; + salt_buf[1] = salt_bufs[salt_pos].salt_buf[1]; + salt_buf[2] = salt_bufs[salt_pos].salt_buf[2]; + salt_buf[3] = salt_bufs[salt_pos].salt_buf[3]; + salt_buf[4] = salt_bufs[salt_pos].salt_buf[4]; + salt_buf[5] = salt_bufs[salt_pos].salt_buf[5]; + salt_buf[6] = salt_bufs[salt_pos].salt_buf[6]; + salt_buf[7] = salt_bufs[salt_pos].salt_buf[7]; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + + w0[0] = pw_buf0[0]; + w0[1] = pw_buf0[1]; + w0[2] = pw_buf0[2]; + w0[3] = pw_buf0[3]; + + u32x w1[4]; + + w1[0] = pw_buf1[0]; + w1[1] = pw_buf1[1]; + w1[2] = pw_buf1[2]; + w1[3] = pw_buf1[3]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 out_len = apply_rules (rules_buf[il_pos].cmds, w0, w1, pw_len); + + /** + * append salt + */ + + u32 s0[4]; + + s0[0] = salt_buf[0]; + s0[1] = salt_buf[1]; + s0[2] = salt_buf[2]; + s0[3] = salt_buf[3]; + + u32 s1[4]; + + s1[0] = salt_buf[4]; + s1[1] = salt_buf[5]; + s1[2] = salt_buf[6]; + s1[3] = salt_buf[7]; + + u32 s2[4]; + + s2[0] = 0; + s2[1] = 0; + s2[2] = 0; + s2[3] = 0; + + u32 s3[4]; + + s3[0] = 0; + s3[1] = 0; + s3[2] = 0; + s3[3] = 0; + + switch_buffer_by_offset (s0, s1, s2, s3, out_len); + + const u32 pw_salt_len = out_len + salt_len; + + /** + * sha1 + */ + + u32x final[256]; + + final[ 0] = swap_workaround (w0[0] | s0[0]); + final[ 1] = swap_workaround (w0[1] | s0[1]); + final[ 2] = swap_workaround (w0[2] | s0[2]); + final[ 3] = swap_workaround (w0[3] | s0[3]); + final[ 4] = swap_workaround (w1[0] | s1[0]); + final[ 5] = swap_workaround (w1[1] | s1[1]); + final[ 6] = swap_workaround (w1[2] | s1[2]); + final[ 7] = swap_workaround (w1[3] | s1[3]); + final[ 8] = swap_workaround (w2[0] | s2[0]); + final[ 9] = swap_workaround (w2[1] | s2[1]); + final[10] = swap_workaround (w2[2] | s2[2]); + final[11] = swap_workaround (w2[3] | s2[3]); + final[12] = swap_workaround (w3[0] | s3[0]); + final[13] = swap_workaround (w3[1] | s3[1]); + final[14] = 0; + final[15] = pw_salt_len * 8; + + u32x digest[5]; + + digest[0] = SHA1M_A; + digest[1] = SHA1M_B; + digest[2] = SHA1M_C; + digest[3] = SHA1M_D; + digest[4] = SHA1M_E; + + sha1_transform (&final[0], &final[4], &final[8], &final[12], digest); + + // prepare magic array range + + u32x lengthMagicArray = 0x20; + u32x offsetMagicArray = 0; + + lengthMagicArray += ((digest[0] >> 24) & 0xff) % 6; + lengthMagicArray += ((digest[0] >> 16) & 0xff) % 6; + lengthMagicArray += ((digest[0] >> 8) & 0xff) % 6; + lengthMagicArray += ((digest[0] >> 0) & 0xff) % 6; + lengthMagicArray += ((digest[1] >> 24) & 0xff) % 6; + lengthMagicArray += ((digest[1] >> 16) & 0xff) % 6; + lengthMagicArray += ((digest[1] >> 8) & 0xff) % 6; + lengthMagicArray += ((digest[1] >> 0) & 0xff) % 6; + lengthMagicArray += ((digest[2] >> 24) & 0xff) % 6; + lengthMagicArray += ((digest[2] >> 16) & 0xff) % 6; + offsetMagicArray += ((digest[2] >> 8) & 0xff) % 8; + offsetMagicArray += ((digest[2] >> 0) & 0xff) % 8; + offsetMagicArray += ((digest[3] >> 24) & 0xff) % 8; + offsetMagicArray += ((digest[3] >> 16) & 0xff) % 8; + offsetMagicArray += ((digest[3] >> 8) & 0xff) % 8; + offsetMagicArray += ((digest[3] >> 0) & 0xff) % 8; + offsetMagicArray += ((digest[4] >> 24) & 0xff) % 8; + offsetMagicArray += ((digest[4] >> 16) & 0xff) % 8; + offsetMagicArray += ((digest[4] >> 8) & 0xff) % 8; + offsetMagicArray += ((digest[4] >> 0) & 0xff) % 8; + + // final + + digest[0] = SHA1M_A; + digest[1] = SHA1M_B; + digest[2] = SHA1M_C; + digest[3] = SHA1M_D; + digest[4] = SHA1M_E; + + #pragma unroll 64 + for (int i = 0; i < 64; i++) final[i] = 0; + + final[0] = w0[0]; + final[1] = w0[1]; + final[2] = w0[2]; + final[3] = w0[3]; + final[4] = w1[0]; + final[5] = w1[1]; + final[6] = w1[2]; + final[7] = w1[3]; + + u32 final_len = out_len; + + int i; + + // append MagicArray + + for (i = 0; i < lengthMagicArray - 4; i += 4) + { + const u32 tmp = GETSHIFTEDINT (theMagicArray, offsetMagicArray + i); + + SETSHIFTEDINT (final, final_len + i, tmp); + } + + const u32 mask = 0xffffffff >> (((i - lengthMagicArray) & 3) * 8); + + const u32 tmp = GETSHIFTEDINT (theMagicArray, offsetMagicArray + i) & mask; + + SETSHIFTEDINT (final, final_len + i, tmp); + + final_len += lengthMagicArray; + + // append Salt + + for (i = 0; i < salt_len + 1; i += 4) // +1 for the 0x80 + { + const u32 tmp = salt_buf[i / 4]; // attention, int[] not char[] + + SETSHIFTEDINT (final, final_len + i, tmp); + } + + final_len += salt_len; + + // calculate + + int left; + int off; + + for (left = final_len, off = 0; left >= 56; left -= 64, off += 16) + { + swap_buffer (&final[off]); + + sha1_transform (&final[off + 0], &final[off + 4], &final[off + 8], &final[off + 12], digest); + } + + swap_buffer (&final[off]); + + final[off + 14] = 0; + final[off + 15] = final_len * 8; + + sha1_transform (&final[off + 0], &final[off + 4], &final[off + 8], &final[off + 12], digest); + + const u32x r0 = digest[3]; + const u32x r1 = digest[4]; + const u32x r2 = digest[2]; + const u32x r3 = digest[1]; + + #include VECT_COMPARE_S + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m07800_s08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m07800_s16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/amd/m07800_a1.cl b/amd/m07800_a1.cl new file mode 100644 index 0000000000..265500be13 --- /dev/null +++ b/amd/m07800_a1.cl @@ -0,0 +1,857 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _SAPG_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW4 +#define VECT_SIZE1 +#endif + +#ifdef VLIW5 +#define VECT_SIZE1 +#endif + +#define DGST_R0 3 +#define DGST_R1 4 +#define DGST_R2 2 +#define DGST_R3 1 + +#include "include/kernel_functions.c" +#include "types_amd.c" +#include "common_amd.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#define GETSHIFTEDINT(a,n) amd_bytealign ((a)[((n)/4)+1], (a)[((n)/4)+0], (n)) + +#define SETSHIFTEDINT(a,n,v) \ +{ \ + const u32 s = ((n) & 3) * 8; \ + const u64 x = (u64) (v) << s; \ + (a)[((n)/4)+0] |= x; \ + (a)[((n)/4)+1] = x >> 32; \ +} + +__constant u32 theMagicArray[64] = +{ + 0x1451ac91,0x4354679f,0xe03be724,0xc27b7428,0xeb133386,0x5ccb4f5a,0x37730a08,0x2f1c5d0e, + 0xe5e68f33,0xddae9bf8,0x8d4bf216,0xdcd4e12c,0x9ddfcbb0,0x176d70d4,0x3f424df9,0x94111b9b, + 0x9bc15b9f,0x039d0506,0x8a135e9d,0xe86a9a1e,0x17147cd9,0xf62ac758,0x0a6399a1,0xc370fdd7, + 0x13745ef6,0x040bc903,0x26f79826,0x2593928a,0x230da2b0,0x6d7963ed,0x3cfa3213,0xa39a0235, + 0x0a8eddb3,0xc351bf24,0x9f55cd7c,0x4c94af37,0x82520829,0x374e3bb2,0x9107179f,0xcdfd3b11, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0 +}; + +static void swap_buffer (u32x final[16]) +{ + final[ 0] = swap_workaround (final[ 0]); + final[ 1] = swap_workaround (final[ 1]); + final[ 2] = swap_workaround (final[ 2]); + final[ 3] = swap_workaround (final[ 3]); + final[ 4] = swap_workaround (final[ 4]); + final[ 5] = swap_workaround (final[ 5]); + final[ 6] = swap_workaround (final[ 6]); + final[ 7] = swap_workaround (final[ 7]); + final[ 8] = swap_workaround (final[ 8]); + final[ 9] = swap_workaround (final[ 9]); + final[10] = swap_workaround (final[10]); + final[11] = swap_workaround (final[11]); + final[12] = swap_workaround (final[12]); + final[13] = swap_workaround (final[13]); + final[14] = swap_workaround (final[14]); + final[15] = swap_workaround (final[15]); +} + +static void sha1_transform (const u32x w0[4], const u32x w1[4], const u32x w2[4], const u32x w3[4], u32x digest[5]) +{ + u32x A = digest[0]; + u32x B = digest[1]; + u32x C = digest[2]; + u32x D = digest[3]; + u32x E = digest[4]; + + u32x w0_t = w0[0]; + u32x w1_t = w0[1]; + u32x w2_t = w0[2]; + u32x w3_t = w0[3]; + u32x w4_t = w1[0]; + u32x w5_t = w1[1]; + u32x w6_t = w1[2]; + u32x w7_t = w1[3]; + u32x w8_t = w2[0]; + u32x w9_t = w2[1]; + u32x wa_t = w2[2]; + u32x wb_t = w2[3]; + u32x wc_t = w3[0]; + u32x wd_t = w3[1]; + u32x we_t = w3[2]; + u32x wf_t = w3[3]; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, A, B, C, D, E, w0_t); + SHA1_STEP (SHA1_F0o, E, A, B, C, D, w1_t); + SHA1_STEP (SHA1_F0o, D, E, A, B, C, w2_t); + SHA1_STEP (SHA1_F0o, C, D, E, A, B, w3_t); + SHA1_STEP (SHA1_F0o, B, C, D, E, A, w4_t); + SHA1_STEP (SHA1_F0o, A, B, C, D, E, w5_t); + SHA1_STEP (SHA1_F0o, E, A, B, C, D, w6_t); + SHA1_STEP (SHA1_F0o, D, E, A, B, C, w7_t); + SHA1_STEP (SHA1_F0o, C, D, E, A, B, w8_t); + SHA1_STEP (SHA1_F0o, B, C, D, E, A, w9_t); + SHA1_STEP (SHA1_F0o, A, B, C, D, E, wa_t); + SHA1_STEP (SHA1_F0o, E, A, B, C, D, wb_t); + SHA1_STEP (SHA1_F0o, D, E, A, B, C, wc_t); + SHA1_STEP (SHA1_F0o, C, D, E, A, B, wd_t); + SHA1_STEP (SHA1_F0o, B, C, D, E, A, we_t); + SHA1_STEP (SHA1_F0o, A, B, C, D, E, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F0o, E, A, B, C, D, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F0o, D, E, A, B, C, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F0o, C, D, E, A, B, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F0o, B, C, D, E, A, w3_t); + + #undef K + #define K SHA1C01 + + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w7_t); + + #undef K + #define K SHA1C02 + + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, wb_t); + + #undef K + #define K SHA1C03 + + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, wf_t); + + digest[0] += A; + digest[1] += B; + digest[2] += C; + digest[3] += D; + digest[4] += E; +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m07800_m04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, combs_buf[0].pw_len); + } + + /** + * salt + */ + + u32 salt_buf[8]; + + salt_buf[0] = salt_bufs[salt_pos].salt_buf[0]; + salt_buf[1] = salt_bufs[salt_pos].salt_buf[1]; + salt_buf[2] = salt_bufs[salt_pos].salt_buf[2]; + salt_buf[3] = salt_bufs[salt_pos].salt_buf[3]; + salt_buf[4] = salt_bufs[salt_pos].salt_buf[4]; + salt_buf[5] = salt_bufs[salt_pos].salt_buf[5]; + salt_buf[6] = salt_bufs[salt_pos].salt_buf[6]; + salt_buf[7] = salt_bufs[salt_pos].salt_buf[7]; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = combs_buf[il_pos].pw_len; + + const u32 pw_len = pw_l_len + pw_r_len; + + u32 wordr0[4]; + + wordr0[0] = combs_buf[il_pos].i[0]; + wordr0[1] = combs_buf[il_pos].i[1]; + wordr0[2] = combs_buf[il_pos].i[2]; + wordr0[3] = combs_buf[il_pos].i[3]; + + u32 wordr1[4]; + + wordr1[0] = combs_buf[il_pos].i[4]; + wordr1[1] = combs_buf[il_pos].i[5]; + wordr1[2] = combs_buf[il_pos].i[6]; + wordr1[3] = combs_buf[il_pos].i[7]; + + u32 wordr2[4]; + + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + + u32 wordr3[4]; + + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + /** + * append salt + */ + + u32 s0[4]; + + s0[0] = salt_buf[0]; + s0[1] = salt_buf[1]; + s0[2] = salt_buf[2]; + s0[3] = salt_buf[3]; + + u32 s1[4]; + + s1[0] = salt_buf[4]; + s1[1] = salt_buf[5]; + s1[2] = salt_buf[6]; + s1[3] = salt_buf[7]; + + u32 s2[4]; + + s2[0] = 0; + s2[1] = 0; + s2[2] = 0; + s2[3] = 0; + + u32 s3[4]; + + s3[0] = 0; + s3[1] = 0; + s3[2] = 0; + s3[3] = 0; + + switch_buffer_by_offset (s0, s1, s2, s3, pw_len); + + const u32 pw_salt_len = pw_len + salt_len; + + u32x w0[4]; + + w0[0] = wordl0[0] | wordr0[0]; + w0[1] = wordl0[1] | wordr0[1]; + w0[2] = wordl0[2] | wordr0[2]; + w0[3] = wordl0[3] | wordr0[3]; + + u32x w1[4]; + + w1[0] = wordl1[0] | wordr1[0]; + w1[1] = wordl1[1] | wordr1[1]; + w1[2] = wordl1[2] | wordr1[2]; + w1[3] = wordl1[3] | wordr1[3]; + + u32x w2[4]; + + w2[0] = wordl2[0] | wordr2[0]; + w2[1] = wordl2[1] | wordr2[1]; + w2[2] = wordl2[2] | wordr2[2]; + w2[3] = wordl2[3] | wordr2[3]; + + u32x w3[4]; + + w3[0] = wordl3[0] | wordr3[0]; + w3[1] = wordl3[1] | wordr3[1]; + w3[2] = 0; + w3[3] = 0; + + /** + * sha1 + */ + + u32x final[256]; + + final[ 0] = swap_workaround (w0[0] | s0[0]); + final[ 1] = swap_workaround (w0[1] | s0[1]); + final[ 2] = swap_workaround (w0[2] | s0[2]); + final[ 3] = swap_workaround (w0[3] | s0[3]); + final[ 4] = swap_workaround (w1[0] | s1[0]); + final[ 5] = swap_workaround (w1[1] | s1[1]); + final[ 6] = swap_workaround (w1[2] | s1[2]); + final[ 7] = swap_workaround (w1[3] | s1[3]); + final[ 8] = swap_workaround (w2[0] | s2[0]); + final[ 9] = swap_workaround (w2[1] | s2[1]); + final[10] = swap_workaround (w2[2] | s2[2]); + final[11] = swap_workaround (w2[3] | s2[3]); + final[12] = swap_workaround (w3[0] | s3[0]); + final[13] = swap_workaround (w3[1] | s3[1]); + final[14] = 0; + final[15] = pw_salt_len * 8; + + u32x digest[5]; + + digest[0] = SHA1M_A; + digest[1] = SHA1M_B; + digest[2] = SHA1M_C; + digest[3] = SHA1M_D; + digest[4] = SHA1M_E; + + sha1_transform (&final[0], &final[4], &final[8], &final[12], digest); + + // prepare magic array range + + u32x lengthMagicArray = 0x20; + u32x offsetMagicArray = 0; + + lengthMagicArray += ((digest[0] >> 24) & 0xff) % 6; + lengthMagicArray += ((digest[0] >> 16) & 0xff) % 6; + lengthMagicArray += ((digest[0] >> 8) & 0xff) % 6; + lengthMagicArray += ((digest[0] >> 0) & 0xff) % 6; + lengthMagicArray += ((digest[1] >> 24) & 0xff) % 6; + lengthMagicArray += ((digest[1] >> 16) & 0xff) % 6; + lengthMagicArray += ((digest[1] >> 8) & 0xff) % 6; + lengthMagicArray += ((digest[1] >> 0) & 0xff) % 6; + lengthMagicArray += ((digest[2] >> 24) & 0xff) % 6; + lengthMagicArray += ((digest[2] >> 16) & 0xff) % 6; + offsetMagicArray += ((digest[2] >> 8) & 0xff) % 8; + offsetMagicArray += ((digest[2] >> 0) & 0xff) % 8; + offsetMagicArray += ((digest[3] >> 24) & 0xff) % 8; + offsetMagicArray += ((digest[3] >> 16) & 0xff) % 8; + offsetMagicArray += ((digest[3] >> 8) & 0xff) % 8; + offsetMagicArray += ((digest[3] >> 0) & 0xff) % 8; + offsetMagicArray += ((digest[4] >> 24) & 0xff) % 8; + offsetMagicArray += ((digest[4] >> 16) & 0xff) % 8; + offsetMagicArray += ((digest[4] >> 8) & 0xff) % 8; + offsetMagicArray += ((digest[4] >> 0) & 0xff) % 8; + + // final + + digest[0] = SHA1M_A; + digest[1] = SHA1M_B; + digest[2] = SHA1M_C; + digest[3] = SHA1M_D; + digest[4] = SHA1M_E; + + #pragma unroll 64 + for (int i = 0; i < 64; i++) final[i] = 0; + + final[0] = w0[0]; + final[1] = w0[1]; + final[2] = w0[2]; + final[3] = w0[3]; + final[4] = w1[0]; + final[5] = w1[1]; + final[6] = w1[2]; + final[7] = w1[3]; + + u32 final_len = pw_len; + + int i; + + // append MagicArray + + for (i = 0; i < lengthMagicArray - 4; i += 4) + { + const u32 tmp = GETSHIFTEDINT (theMagicArray, offsetMagicArray + i); + + SETSHIFTEDINT (final, final_len + i, tmp); + } + + const u32 mask = 0xffffffff >> (((i - lengthMagicArray) & 3) * 8); + + const u32 tmp = GETSHIFTEDINT (theMagicArray, offsetMagicArray + i) & mask; + + SETSHIFTEDINT (final, final_len + i, tmp); + + final_len += lengthMagicArray; + + // append Salt + + for (i = 0; i < salt_len + 1; i += 4) // +1 for the 0x80 + { + const u32 tmp = salt_buf[i / 4]; // attention, int[] not char[] + + SETSHIFTEDINT (final, final_len + i, tmp); + } + + final_len += salt_len; + + // calculate + + int left; + int off; + + for (left = final_len, off = 0; left >= 56; left -= 64, off += 16) + { + swap_buffer (&final[off]); + + sha1_transform (&final[off + 0], &final[off + 4], &final[off + 8], &final[off + 12], digest); + } + + swap_buffer (&final[off]); + + final[off + 14] = 0; + final[off + 15] = final_len * 8; + + sha1_transform (&final[off + 0], &final[off + 4], &final[off + 8], &final[off + 12], digest); + + const u32x r0 = digest[3]; + const u32x r1 = digest[4]; + const u32x r2 = digest[2]; + const u32x r3 = digest[1]; + + #include VECT_COMPARE_M + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m07800_m08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m07800_m16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m07800_s04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, combs_buf[0].pw_len); + } + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * salt + */ + + u32 salt_buf[8]; + + salt_buf[0] = salt_bufs[salt_pos].salt_buf[0]; + salt_buf[1] = salt_bufs[salt_pos].salt_buf[1]; + salt_buf[2] = salt_bufs[salt_pos].salt_buf[2]; + salt_buf[3] = salt_bufs[salt_pos].salt_buf[3]; + salt_buf[4] = salt_bufs[salt_pos].salt_buf[4]; + salt_buf[5] = salt_bufs[salt_pos].salt_buf[5]; + salt_buf[6] = salt_bufs[salt_pos].salt_buf[6]; + salt_buf[7] = salt_bufs[salt_pos].salt_buf[7]; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = combs_buf[il_pos].pw_len; + + const u32 pw_len = pw_l_len + pw_r_len; + + u32 wordr0[4]; + + wordr0[0] = combs_buf[il_pos].i[0]; + wordr0[1] = combs_buf[il_pos].i[1]; + wordr0[2] = combs_buf[il_pos].i[2]; + wordr0[3] = combs_buf[il_pos].i[3]; + + u32 wordr1[4]; + + wordr1[0] = combs_buf[il_pos].i[4]; + wordr1[1] = combs_buf[il_pos].i[5]; + wordr1[2] = combs_buf[il_pos].i[6]; + wordr1[3] = combs_buf[il_pos].i[7]; + + u32 wordr2[4]; + + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + + u32 wordr3[4]; + + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + /** + * append salt + */ + + u32 s0[4]; + + s0[0] = salt_buf[0]; + s0[1] = salt_buf[1]; + s0[2] = salt_buf[2]; + s0[3] = salt_buf[3]; + + u32 s1[4]; + + s1[0] = salt_buf[4]; + s1[1] = salt_buf[5]; + s1[2] = salt_buf[6]; + s1[3] = salt_buf[7]; + + u32 s2[4]; + + s2[0] = 0; + s2[1] = 0; + s2[2] = 0; + s2[3] = 0; + + u32 s3[4]; + + s3[0] = 0; + s3[1] = 0; + s3[2] = 0; + s3[3] = 0; + + switch_buffer_by_offset (s0, s1, s2, s3, pw_len); + + const u32 pw_salt_len = pw_len + salt_len; + + u32x w0[4]; + + w0[0] = wordl0[0] | wordr0[0]; + w0[1] = wordl0[1] | wordr0[1]; + w0[2] = wordl0[2] | wordr0[2]; + w0[3] = wordl0[3] | wordr0[3]; + + u32x w1[4]; + + w1[0] = wordl1[0] | wordr1[0]; + w1[1] = wordl1[1] | wordr1[1]; + w1[2] = wordl1[2] | wordr1[2]; + w1[3] = wordl1[3] | wordr1[3]; + + u32x w2[4]; + + w2[0] = wordl2[0] | wordr2[0]; + w2[1] = wordl2[1] | wordr2[1]; + w2[2] = wordl2[2] | wordr2[2]; + w2[3] = wordl2[3] | wordr2[3]; + + u32x w3[4]; + + w3[0] = wordl3[0] | wordr3[0]; + w3[1] = wordl3[1] | wordr3[1]; + w3[2] = 0; + w3[3] = 0; + + /** + * sha1 + */ + + u32x final[256]; + + final[ 0] = swap_workaround (w0[0] | s0[0]); + final[ 1] = swap_workaround (w0[1] | s0[1]); + final[ 2] = swap_workaround (w0[2] | s0[2]); + final[ 3] = swap_workaround (w0[3] | s0[3]); + final[ 4] = swap_workaround (w1[0] | s1[0]); + final[ 5] = swap_workaround (w1[1] | s1[1]); + final[ 6] = swap_workaround (w1[2] | s1[2]); + final[ 7] = swap_workaround (w1[3] | s1[3]); + final[ 8] = swap_workaround (w2[0] | s2[0]); + final[ 9] = swap_workaround (w2[1] | s2[1]); + final[10] = swap_workaround (w2[2] | s2[2]); + final[11] = swap_workaround (w2[3] | s2[3]); + final[12] = swap_workaround (w3[0] | s3[0]); + final[13] = swap_workaround (w3[1] | s3[1]); + final[14] = 0; + final[15] = pw_salt_len * 8; + + u32x digest[5]; + + digest[0] = SHA1M_A; + digest[1] = SHA1M_B; + digest[2] = SHA1M_C; + digest[3] = SHA1M_D; + digest[4] = SHA1M_E; + + sha1_transform (&final[0], &final[4], &final[8], &final[12], digest); + + // prepare magic array range + + u32x lengthMagicArray = 0x20; + u32x offsetMagicArray = 0; + + lengthMagicArray += ((digest[0] >> 24) & 0xff) % 6; + lengthMagicArray += ((digest[0] >> 16) & 0xff) % 6; + lengthMagicArray += ((digest[0] >> 8) & 0xff) % 6; + lengthMagicArray += ((digest[0] >> 0) & 0xff) % 6; + lengthMagicArray += ((digest[1] >> 24) & 0xff) % 6; + lengthMagicArray += ((digest[1] >> 16) & 0xff) % 6; + lengthMagicArray += ((digest[1] >> 8) & 0xff) % 6; + lengthMagicArray += ((digest[1] >> 0) & 0xff) % 6; + lengthMagicArray += ((digest[2] >> 24) & 0xff) % 6; + lengthMagicArray += ((digest[2] >> 16) & 0xff) % 6; + offsetMagicArray += ((digest[2] >> 8) & 0xff) % 8; + offsetMagicArray += ((digest[2] >> 0) & 0xff) % 8; + offsetMagicArray += ((digest[3] >> 24) & 0xff) % 8; + offsetMagicArray += ((digest[3] >> 16) & 0xff) % 8; + offsetMagicArray += ((digest[3] >> 8) & 0xff) % 8; + offsetMagicArray += ((digest[3] >> 0) & 0xff) % 8; + offsetMagicArray += ((digest[4] >> 24) & 0xff) % 8; + offsetMagicArray += ((digest[4] >> 16) & 0xff) % 8; + offsetMagicArray += ((digest[4] >> 8) & 0xff) % 8; + offsetMagicArray += ((digest[4] >> 0) & 0xff) % 8; + + // final + + digest[0] = SHA1M_A; + digest[1] = SHA1M_B; + digest[2] = SHA1M_C; + digest[3] = SHA1M_D; + digest[4] = SHA1M_E; + + #pragma unroll 64 + for (int i = 0; i < 64; i++) final[i] = 0; + + final[0] = w0[0]; + final[1] = w0[1]; + final[2] = w0[2]; + final[3] = w0[3]; + final[4] = w1[0]; + final[5] = w1[1]; + final[6] = w1[2]; + final[7] = w1[3]; + + u32 final_len = pw_len; + + int i; + + // append MagicArray + + for (i = 0; i < lengthMagicArray - 4; i += 4) + { + const u32 tmp = GETSHIFTEDINT (theMagicArray, offsetMagicArray + i); + + SETSHIFTEDINT (final, final_len + i, tmp); + } + + const u32 mask = 0xffffffff >> (((i - lengthMagicArray) & 3) * 8); + + const u32 tmp = GETSHIFTEDINT (theMagicArray, offsetMagicArray + i) & mask; + + SETSHIFTEDINT (final, final_len + i, tmp); + + final_len += lengthMagicArray; + + // append Salt + + for (i = 0; i < salt_len + 1; i += 4) // +1 for the 0x80 + { + const u32 tmp = salt_buf[i / 4]; // attention, int[] not char[] + + SETSHIFTEDINT (final, final_len + i, tmp); + } + + final_len += salt_len; + + // calculate + + int left; + int off; + + for (left = final_len, off = 0; left >= 56; left -= 64, off += 16) + { + swap_buffer (&final[off]); + + sha1_transform (&final[off + 0], &final[off + 4], &final[off + 8], &final[off + 12], digest); + } + + swap_buffer (&final[off]); + + final[off + 14] = 0; + final[off + 15] = final_len * 8; + + sha1_transform (&final[off + 0], &final[off + 4], &final[off + 8], &final[off + 12], digest); + + const u32x r0 = digest[3]; + const u32x r1 = digest[4]; + const u32x r2 = digest[2]; + const u32x r3 = digest[1]; + + #include VECT_COMPARE_S + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m07800_s08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m07800_s16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/amd/m07800_a3.cl b/amd/m07800_a3.cl new file mode 100644 index 0000000000..5bf3932df1 --- /dev/null +++ b/amd/m07800_a3.cl @@ -0,0 +1,875 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _SAPG_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW4 +#define VECT_SIZE1 +#endif + +#ifdef VLIW5 +#define VECT_SIZE1 +#endif + +#define DGST_R0 3 +#define DGST_R1 4 +#define DGST_R2 2 +#define DGST_R3 1 + +#include "include/kernel_functions.c" +#include "types_amd.c" +#include "common_amd.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#define GETSHIFTEDINT(a,n) amd_bytealign ((a)[((n)/4)+1], (a)[((n)/4)+0], (n)) + +#define SETSHIFTEDINT(a,n,v) \ +{ \ + const u32 s = ((n) & 3) * 8; \ + const u64 x = (u64) (v) << s; \ + (a)[((n)/4)+0] |= x; \ + (a)[((n)/4)+1] = x >> 32; \ +} + +__constant u32 theMagicArray[64] = +{ + 0x1451ac91,0x4354679f,0xe03be724,0xc27b7428,0xeb133386,0x5ccb4f5a,0x37730a08,0x2f1c5d0e, + 0xe5e68f33,0xddae9bf8,0x8d4bf216,0xdcd4e12c,0x9ddfcbb0,0x176d70d4,0x3f424df9,0x94111b9b, + 0x9bc15b9f,0x039d0506,0x8a135e9d,0xe86a9a1e,0x17147cd9,0xf62ac758,0x0a6399a1,0xc370fdd7, + 0x13745ef6,0x040bc903,0x26f79826,0x2593928a,0x230da2b0,0x6d7963ed,0x3cfa3213,0xa39a0235, + 0x0a8eddb3,0xc351bf24,0x9f55cd7c,0x4c94af37,0x82520829,0x374e3bb2,0x9107179f,0xcdfd3b11, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0 +}; + +static void swap_buffer (u32x final[16]) +{ + final[ 0] = swap_workaround (final[ 0]); + final[ 1] = swap_workaround (final[ 1]); + final[ 2] = swap_workaround (final[ 2]); + final[ 3] = swap_workaround (final[ 3]); + final[ 4] = swap_workaround (final[ 4]); + final[ 5] = swap_workaround (final[ 5]); + final[ 6] = swap_workaround (final[ 6]); + final[ 7] = swap_workaround (final[ 7]); + final[ 8] = swap_workaround (final[ 8]); + final[ 9] = swap_workaround (final[ 9]); + final[10] = swap_workaround (final[10]); + final[11] = swap_workaround (final[11]); + final[12] = swap_workaround (final[12]); + final[13] = swap_workaround (final[13]); + final[14] = swap_workaround (final[14]); + final[15] = swap_workaround (final[15]); +} + +static void sha1_transform (const u32x w0[4], const u32x w1[4], const u32x w2[4], const u32x w3[4], u32x digest[5]) +{ + u32x A = digest[0]; + u32x B = digest[1]; + u32x C = digest[2]; + u32x D = digest[3]; + u32x E = digest[4]; + + u32x w0_t = w0[0]; + u32x w1_t = w0[1]; + u32x w2_t = w0[2]; + u32x w3_t = w0[3]; + u32x w4_t = w1[0]; + u32x w5_t = w1[1]; + u32x w6_t = w1[2]; + u32x w7_t = w1[3]; + u32x w8_t = w2[0]; + u32x w9_t = w2[1]; + u32x wa_t = w2[2]; + u32x wb_t = w2[3]; + u32x wc_t = w3[0]; + u32x wd_t = w3[1]; + u32x we_t = w3[2]; + u32x wf_t = w3[3]; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, A, B, C, D, E, w0_t); + SHA1_STEP (SHA1_F0o, E, A, B, C, D, w1_t); + SHA1_STEP (SHA1_F0o, D, E, A, B, C, w2_t); + SHA1_STEP (SHA1_F0o, C, D, E, A, B, w3_t); + SHA1_STEP (SHA1_F0o, B, C, D, E, A, w4_t); + SHA1_STEP (SHA1_F0o, A, B, C, D, E, w5_t); + SHA1_STEP (SHA1_F0o, E, A, B, C, D, w6_t); + SHA1_STEP (SHA1_F0o, D, E, A, B, C, w7_t); + SHA1_STEP (SHA1_F0o, C, D, E, A, B, w8_t); + SHA1_STEP (SHA1_F0o, B, C, D, E, A, w9_t); + SHA1_STEP (SHA1_F0o, A, B, C, D, E, wa_t); + SHA1_STEP (SHA1_F0o, E, A, B, C, D, wb_t); + SHA1_STEP (SHA1_F0o, D, E, A, B, C, wc_t); + SHA1_STEP (SHA1_F0o, C, D, E, A, B, wd_t); + SHA1_STEP (SHA1_F0o, B, C, D, E, A, we_t); + SHA1_STEP (SHA1_F0o, A, B, C, D, E, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F0o, E, A, B, C, D, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F0o, D, E, A, B, C, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F0o, C, D, E, A, B, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F0o, B, C, D, E, A, w3_t); + + #undef K + #define K SHA1C01 + + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w7_t); + + #undef K + #define K SHA1C02 + + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, wb_t); + + #undef K + #define K SHA1C03 + + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, wf_t); + + digest[0] += A; + digest[1] += B; + digest[2] += C; + digest[3] += D; + digest[4] += E; +} + +static void m07800m (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], const u32 pw_len, __global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset) +{ + /** + * modifier + */ + + const u32 gid = get_global_id (0); + const u32 lid = get_local_id (0); + + w0[0] = swap_workaround (w0[0]); + w0[1] = swap_workaround (w0[1]); + w0[2] = swap_workaround (w0[2]); + w0[3] = swap_workaround (w0[3]); + + w1[0] = swap_workaround (w1[0]); + w1[1] = swap_workaround (w1[1]); + w1[2] = swap_workaround (w1[2]); + w1[3] = swap_workaround (w1[3]); + + /** + * salt + */ + + u32 salt_buf[8]; + + salt_buf[0] = salt_bufs[salt_pos].salt_buf[0]; + salt_buf[1] = salt_bufs[salt_pos].salt_buf[1]; + salt_buf[2] = salt_bufs[salt_pos].salt_buf[2]; + salt_buf[3] = salt_bufs[salt_pos].salt_buf[3]; + salt_buf[4] = salt_bufs[salt_pos].salt_buf[4]; + salt_buf[5] = salt_bufs[salt_pos].salt_buf[5]; + salt_buf[6] = salt_bufs[salt_pos].salt_buf[6]; + salt_buf[7] = salt_bufs[salt_pos].salt_buf[7]; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + u32 s0[4]; + + s0[0] = salt_buf[0]; + s0[1] = salt_buf[1]; + s0[2] = salt_buf[2]; + s0[3] = salt_buf[3]; + + u32 s1[4]; + + s1[0] = salt_buf[4]; + s1[1] = salt_buf[5]; + s1[2] = salt_buf[6]; + s1[3] = salt_buf[7]; + + u32 s2[4]; + + s2[0] = 0; + s2[1] = 0; + s2[2] = 0; + s2[3] = 0; + + u32 s3[4]; + + s3[0] = 0; + s3[1] = 0; + s3[2] = 0; + s3[3] = 0; + + switch_buffer_by_offset (s0, s1, s2, s3, pw_len); + + const u32 pw_salt_len = pw_len + salt_len; + + /** + * loop + */ + + u32x w0l = w0[0]; + + for (u32 il_pos = 0; il_pos < bfs_cnt; il_pos++) + { + const u32 w0r = swap_workaround (bfs_buf[il_pos].i); + + w0[0] = w0l | w0r; + + /** + * sha1 + */ + + u32x final[256]; + + final[ 0] = swap_workaround (w0[0] | s0[0]); + final[ 1] = swap_workaround (w0[1] | s0[1]); + final[ 2] = swap_workaround (w0[2] | s0[2]); + final[ 3] = swap_workaround (w0[3] | s0[3]); + final[ 4] = swap_workaround (w1[0] | s1[0]); + final[ 5] = swap_workaround (w1[1] | s1[1]); + final[ 6] = swap_workaround (w1[2] | s1[2]); + final[ 7] = swap_workaround (w1[3] | s1[3]); + final[ 8] = swap_workaround (w2[0] | s2[0]); + final[ 9] = swap_workaround (w2[1] | s2[1]); + final[10] = swap_workaround (w2[2] | s2[2]); + final[11] = swap_workaround (w2[3] | s2[3]); + final[12] = swap_workaround (w3[0] | s3[0]); + final[13] = swap_workaround (w3[1] | s3[1]); + final[14] = 0; + final[15] = pw_salt_len * 8; + + u32x digest[5]; + + digest[0] = SHA1M_A; + digest[1] = SHA1M_B; + digest[2] = SHA1M_C; + digest[3] = SHA1M_D; + digest[4] = SHA1M_E; + + sha1_transform (&final[0], &final[4], &final[8], &final[12], digest); + + // prepare magic array range + + u32x lengthMagicArray = 0x20; + u32x offsetMagicArray = 0; + + lengthMagicArray += ((digest[0] >> 24) & 0xff) % 6; + lengthMagicArray += ((digest[0] >> 16) & 0xff) % 6; + lengthMagicArray += ((digest[0] >> 8) & 0xff) % 6; + lengthMagicArray += ((digest[0] >> 0) & 0xff) % 6; + lengthMagicArray += ((digest[1] >> 24) & 0xff) % 6; + lengthMagicArray += ((digest[1] >> 16) & 0xff) % 6; + lengthMagicArray += ((digest[1] >> 8) & 0xff) % 6; + lengthMagicArray += ((digest[1] >> 0) & 0xff) % 6; + lengthMagicArray += ((digest[2] >> 24) & 0xff) % 6; + lengthMagicArray += ((digest[2] >> 16) & 0xff) % 6; + offsetMagicArray += ((digest[2] >> 8) & 0xff) % 8; + offsetMagicArray += ((digest[2] >> 0) & 0xff) % 8; + offsetMagicArray += ((digest[3] >> 24) & 0xff) % 8; + offsetMagicArray += ((digest[3] >> 16) & 0xff) % 8; + offsetMagicArray += ((digest[3] >> 8) & 0xff) % 8; + offsetMagicArray += ((digest[3] >> 0) & 0xff) % 8; + offsetMagicArray += ((digest[4] >> 24) & 0xff) % 8; + offsetMagicArray += ((digest[4] >> 16) & 0xff) % 8; + offsetMagicArray += ((digest[4] >> 8) & 0xff) % 8; + offsetMagicArray += ((digest[4] >> 0) & 0xff) % 8; + + // final + + digest[0] = SHA1M_A; + digest[1] = SHA1M_B; + digest[2] = SHA1M_C; + digest[3] = SHA1M_D; + digest[4] = SHA1M_E; + + #pragma unroll 64 + for (int i = 0; i < 64; i++) final[i] = 0; + + final[0] = w0[0]; + final[1] = w0[1]; + final[2] = w0[2]; + final[3] = w0[3]; + final[4] = w1[0]; + final[5] = w1[1]; + final[6] = w1[2]; + final[7] = w1[3]; + + u32 final_len = pw_len; + + int i; + + // append MagicArray + + for (i = 0; i < lengthMagicArray - 4; i += 4) + { + const u32 tmp = GETSHIFTEDINT (theMagicArray, offsetMagicArray + i); + + SETSHIFTEDINT (final, final_len + i, tmp); + } + + const u32 mask = 0xffffffff >> (((i - lengthMagicArray) & 3) * 8); + + const u32 tmp = GETSHIFTEDINT (theMagicArray, offsetMagicArray + i) & mask; + + SETSHIFTEDINT (final, final_len + i, tmp); + + final_len += lengthMagicArray; + + // append Salt + + for (i = 0; i < salt_len + 1; i += 4) // +1 for the 0x80 + { + const u32 tmp = salt_buf[i / 4]; // attention, int[] not char[] + + SETSHIFTEDINT (final, final_len + i, tmp); + } + + final_len += salt_len; + + // calculate + + int left; + int off; + + for (left = final_len, off = 0; left >= 56; left -= 64, off += 16) + { + swap_buffer (&final[off]); + + sha1_transform (&final[off + 0], &final[off + 4], &final[off + 8], &final[off + 12], digest); + } + + swap_buffer (&final[off]); + + final[off + 14] = 0; + final[off + 15] = final_len * 8; + + sha1_transform (&final[off + 0], &final[off + 4], &final[off + 8], &final[off + 12], digest); + + const u32x r0 = digest[3]; + const u32x r1 = digest[4]; + const u32x r2 = digest[2]; + const u32x r3 = digest[1]; + + #include VECT_COMPARE_M + } +} + +static void m07800s (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], const u32 pw_len, __global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset) +{ + /** + * modifier + */ + + const u32 gid = get_global_id (0); + const u32 lid = get_local_id (0); + + w0[0] = swap_workaround (w0[0]); + w0[1] = swap_workaround (w0[1]); + w0[2] = swap_workaround (w0[2]); + w0[3] = swap_workaround (w0[3]); + + w1[0] = swap_workaround (w1[0]); + w1[1] = swap_workaround (w1[1]); + w1[2] = swap_workaround (w1[2]); + w1[3] = swap_workaround (w1[3]); + + /** + * salt + */ + + u32 salt_buf[8]; + + salt_buf[0] = salt_bufs[salt_pos].salt_buf[0]; + salt_buf[1] = salt_bufs[salt_pos].salt_buf[1]; + salt_buf[2] = salt_bufs[salt_pos].salt_buf[2]; + salt_buf[3] = salt_bufs[salt_pos].salt_buf[3]; + salt_buf[4] = salt_bufs[salt_pos].salt_buf[4]; + salt_buf[5] = salt_bufs[salt_pos].salt_buf[5]; + salt_buf[6] = salt_bufs[salt_pos].salt_buf[6]; + salt_buf[7] = salt_bufs[salt_pos].salt_buf[7]; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + u32 s0[4]; + + s0[0] = salt_buf[0]; + s0[1] = salt_buf[1]; + s0[2] = salt_buf[2]; + s0[3] = salt_buf[3]; + + u32 s1[4]; + + s1[0] = salt_buf[4]; + s1[1] = salt_buf[5]; + s1[2] = salt_buf[6]; + s1[3] = salt_buf[7]; + + u32 s2[4]; + + s2[0] = 0; + s2[1] = 0; + s2[2] = 0; + s2[3] = 0; + + u32 s3[4]; + + s3[0] = 0; + s3[1] = 0; + s3[2] = 0; + s3[3] = 0; + + switch_buffer_by_offset (s0, s1, s2, s3, pw_len); + + const u32 pw_salt_len = pw_len + salt_len; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * loop + */ + + u32x w0l = w0[0]; + + for (u32 il_pos = 0; il_pos < bfs_cnt; il_pos++) + { + const u32 w0r = swap_workaround (bfs_buf[il_pos].i); + + w0[0] = w0l | w0r; + + /** + * sha1 + */ + + u32x final[256]; + + final[ 0] = swap_workaround (w0[0] | s0[0]); + final[ 1] = swap_workaround (w0[1] | s0[1]); + final[ 2] = swap_workaround (w0[2] | s0[2]); + final[ 3] = swap_workaround (w0[3] | s0[3]); + final[ 4] = swap_workaround (w1[0] | s1[0]); + final[ 5] = swap_workaround (w1[1] | s1[1]); + final[ 6] = swap_workaround (w1[2] | s1[2]); + final[ 7] = swap_workaround (w1[3] | s1[3]); + final[ 8] = swap_workaround (w2[0] | s2[0]); + final[ 9] = swap_workaround (w2[1] | s2[1]); + final[10] = swap_workaround (w2[2] | s2[2]); + final[11] = swap_workaround (w2[3] | s2[3]); + final[12] = swap_workaround (w3[0] | s3[0]); + final[13] = swap_workaround (w3[1] | s3[1]); + final[14] = 0; + final[15] = pw_salt_len * 8; + + u32x digest[5]; + + digest[0] = SHA1M_A; + digest[1] = SHA1M_B; + digest[2] = SHA1M_C; + digest[3] = SHA1M_D; + digest[4] = SHA1M_E; + + sha1_transform (&final[0], &final[4], &final[8], &final[12], digest); + + // prepare magic array range + + u32x lengthMagicArray = 0x20; + u32x offsetMagicArray = 0; + + lengthMagicArray += ((digest[0] >> 24) & 0xff) % 6; + lengthMagicArray += ((digest[0] >> 16) & 0xff) % 6; + lengthMagicArray += ((digest[0] >> 8) & 0xff) % 6; + lengthMagicArray += ((digest[0] >> 0) & 0xff) % 6; + lengthMagicArray += ((digest[1] >> 24) & 0xff) % 6; + lengthMagicArray += ((digest[1] >> 16) & 0xff) % 6; + lengthMagicArray += ((digest[1] >> 8) & 0xff) % 6; + lengthMagicArray += ((digest[1] >> 0) & 0xff) % 6; + lengthMagicArray += ((digest[2] >> 24) & 0xff) % 6; + lengthMagicArray += ((digest[2] >> 16) & 0xff) % 6; + offsetMagicArray += ((digest[2] >> 8) & 0xff) % 8; + offsetMagicArray += ((digest[2] >> 0) & 0xff) % 8; + offsetMagicArray += ((digest[3] >> 24) & 0xff) % 8; + offsetMagicArray += ((digest[3] >> 16) & 0xff) % 8; + offsetMagicArray += ((digest[3] >> 8) & 0xff) % 8; + offsetMagicArray += ((digest[3] >> 0) & 0xff) % 8; + offsetMagicArray += ((digest[4] >> 24) & 0xff) % 8; + offsetMagicArray += ((digest[4] >> 16) & 0xff) % 8; + offsetMagicArray += ((digest[4] >> 8) & 0xff) % 8; + offsetMagicArray += ((digest[4] >> 0) & 0xff) % 8; + + // final + + digest[0] = SHA1M_A; + digest[1] = SHA1M_B; + digest[2] = SHA1M_C; + digest[3] = SHA1M_D; + digest[4] = SHA1M_E; + + #pragma unroll 64 + for (int i = 0; i < 64; i++) final[i] = 0; + + final[0] = w0[0]; + final[1] = w0[1]; + final[2] = w0[2]; + final[3] = w0[3]; + final[4] = w1[0]; + final[5] = w1[1]; + final[6] = w1[2]; + final[7] = w1[3]; + + u32 final_len = pw_len; + + int i; + + // append MagicArray + + for (i = 0; i < lengthMagicArray - 4; i += 4) + { + const u32 tmp = GETSHIFTEDINT (theMagicArray, offsetMagicArray + i); + + SETSHIFTEDINT (final, final_len + i, tmp); + } + + const u32 mask = 0xffffffff >> (((i - lengthMagicArray) & 3) * 8); + + const u32 tmp = GETSHIFTEDINT (theMagicArray, offsetMagicArray + i) & mask; + + SETSHIFTEDINT (final, final_len + i, tmp); + + final_len += lengthMagicArray; + + // append Salt + + for (i = 0; i < salt_len + 1; i += 4) // +1 for the 0x80 + { + const u32 tmp = salt_buf[i / 4]; // attention, int[] not char[] + + SETSHIFTEDINT (final, final_len + i, tmp); + } + + final_len += salt_len; + + // calculate + + int left; + int off; + + for (left = final_len, off = 0; left >= 56; left -= 64, off += 16) + { + swap_buffer (&final[off]); + + sha1_transform (&final[off + 0], &final[off + 4], &final[off + 8], &final[off + 12], digest); + } + + swap_buffer (&final[off]); + + final[off + 14] = 0; + final[off + 15] = final_len * 8; + + sha1_transform (&final[off + 0], &final[off + 4], &final[off + 8], &final[off + 12], digest); + + const u32x r0 = digest[3]; + const u32x r1 = digest[4]; + const u32x r2 = digest[2]; + const u32x r3 = digest[1]; + + #include VECT_COMPARE_S + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m07800_m04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m07800m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m07800_m08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m07800m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m07800_m16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m07800_s04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m07800s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m07800_s08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m07800s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m07800_s16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/amd/m07900.cl b/amd/m07900.cl new file mode 100644 index 0000000000..a2146837ca --- /dev/null +++ b/amd/m07900.cl @@ -0,0 +1,392 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _SHA512_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW4 +#define VECT_SIZE1 +#endif + +#ifdef VLIW5 +#define VECT_SIZE1 +#endif + +#define DGST_R0 0 +#define DGST_R1 1 +#define DGST_R2 2 +#define DGST_R3 3 + +#include "include/kernel_functions.c" +#include "types_amd.c" +#include "common_amd.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +__constant u64 k_sha512[80] = +{ + SHA512C00, SHA512C01, SHA512C02, SHA512C03, + SHA512C04, SHA512C05, SHA512C06, SHA512C07, + SHA512C08, SHA512C09, SHA512C0a, SHA512C0b, + SHA512C0c, SHA512C0d, SHA512C0e, SHA512C0f, + SHA512C10, SHA512C11, SHA512C12, SHA512C13, + SHA512C14, SHA512C15, SHA512C16, SHA512C17, + SHA512C18, SHA512C19, SHA512C1a, SHA512C1b, + SHA512C1c, SHA512C1d, SHA512C1e, SHA512C1f, + SHA512C20, SHA512C21, SHA512C22, SHA512C23, + SHA512C24, SHA512C25, SHA512C26, SHA512C27, + SHA512C28, SHA512C29, SHA512C2a, SHA512C2b, + SHA512C2c, SHA512C2d, SHA512C2e, SHA512C2f, + SHA512C30, SHA512C31, SHA512C32, SHA512C33, + SHA512C34, SHA512C35, SHA512C36, SHA512C37, + SHA512C38, SHA512C39, SHA512C3a, SHA512C3b, + SHA512C3c, SHA512C3d, SHA512C3e, SHA512C3f, + SHA512C40, SHA512C41, SHA512C42, SHA512C43, + SHA512C44, SHA512C45, SHA512C46, SHA512C47, + SHA512C48, SHA512C49, SHA512C4a, SHA512C4b, + SHA512C4c, SHA512C4d, SHA512C4e, SHA512C4f, +}; + +static void sha512_transform (const u64 w[16], u64 dgst[8]) +{ + u64 a = dgst[0]; + u64 b = dgst[1]; + u64 c = dgst[2]; + u64 d = dgst[3]; + u64 e = dgst[4]; + u64 f = dgst[5]; + u64 g = dgst[6]; + u64 h = dgst[7]; + + u64 w0_t = w[ 0]; + u64 w1_t = w[ 1]; + u64 w2_t = w[ 2]; + u64 w3_t = w[ 3]; + u64 w4_t = w[ 4]; + u64 w5_t = w[ 5]; + u64 w6_t = w[ 6]; + u64 w7_t = w[ 7]; + u64 w8_t = w[ 8]; + u64 w9_t = w[ 9]; + u64 wa_t = w[10]; + u64 wb_t = w[11]; + u64 wc_t = w[12]; + u64 wd_t = w[13]; + u64 we_t = w[14]; + u64 wf_t = w[15]; + + #define ROUND_EXPAND() \ + { \ + w0_t = SHA512_EXPAND (we_t, w9_t, w1_t, w0_t); \ + w1_t = SHA512_EXPAND (wf_t, wa_t, w2_t, w1_t); \ + w2_t = SHA512_EXPAND (w0_t, wb_t, w3_t, w2_t); \ + w3_t = SHA512_EXPAND (w1_t, wc_t, w4_t, w3_t); \ + w4_t = SHA512_EXPAND (w2_t, wd_t, w5_t, w4_t); \ + w5_t = SHA512_EXPAND (w3_t, we_t, w6_t, w5_t); \ + w6_t = SHA512_EXPAND (w4_t, wf_t, w7_t, w6_t); \ + w7_t = SHA512_EXPAND (w5_t, w0_t, w8_t, w7_t); \ + w8_t = SHA512_EXPAND (w6_t, w1_t, w9_t, w8_t); \ + w9_t = SHA512_EXPAND (w7_t, w2_t, wa_t, w9_t); \ + wa_t = SHA512_EXPAND (w8_t, w3_t, wb_t, wa_t); \ + wb_t = SHA512_EXPAND (w9_t, w4_t, wc_t, wb_t); \ + wc_t = SHA512_EXPAND (wa_t, w5_t, wd_t, wc_t); \ + wd_t = SHA512_EXPAND (wb_t, w6_t, we_t, wd_t); \ + we_t = SHA512_EXPAND (wc_t, w7_t, wf_t, we_t); \ + wf_t = SHA512_EXPAND (wd_t, w8_t, w0_t, wf_t); \ + } + + #define ROUND_STEP(i) \ + { \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, a, b, c, d, e, f, g, h, w0_t, k_sha512[i + 0]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, h, a, b, c, d, e, f, g, w1_t, k_sha512[i + 1]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, g, h, a, b, c, d, e, f, w2_t, k_sha512[i + 2]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, f, g, h, a, b, c, d, e, w3_t, k_sha512[i + 3]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, e, f, g, h, a, b, c, d, w4_t, k_sha512[i + 4]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, d, e, f, g, h, a, b, c, w5_t, k_sha512[i + 5]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, c, d, e, f, g, h, a, b, w6_t, k_sha512[i + 6]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, b, c, d, e, f, g, h, a, w7_t, k_sha512[i + 7]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, a, b, c, d, e, f, g, h, w8_t, k_sha512[i + 8]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, h, a, b, c, d, e, f, g, w9_t, k_sha512[i + 9]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, g, h, a, b, c, d, e, f, wa_t, k_sha512[i + 10]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, f, g, h, a, b, c, d, e, wb_t, k_sha512[i + 11]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, e, f, g, h, a, b, c, d, wc_t, k_sha512[i + 12]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, d, e, f, g, h, a, b, c, wd_t, k_sha512[i + 13]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, c, d, e, f, g, h, a, b, we_t, k_sha512[i + 14]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, b, c, d, e, f, g, h, a, wf_t, k_sha512[i + 15]); \ + } + + ROUND_STEP (0); + + #pragma unroll + for (int i = 16; i < 80; i += 16) + { + ROUND_EXPAND (); ROUND_STEP (i); + } + + dgst[0] += a; + dgst[1] += b; + dgst[2] += c; + dgst[3] += d; + dgst[4] += e; + dgst[5] += f; + dgst[6] += g; + dgst[7] += h; +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m07900_init (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global drupal7_tmp_t *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = pws[gid].i[ 8]; + w2[1] = pws[gid].i[ 9]; + w2[2] = pws[gid].i[10]; + w2[3] = pws[gid].i[11]; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + append_0x80_4 (w0, w1, w2, w3, pw_len); + + /** + * salt + */ + + u32 salt_buf[2]; + + salt_buf[0] = salt_bufs[salt_pos].salt_buf[0]; + salt_buf[1] = salt_bufs[salt_pos].salt_buf[1]; + + /** + * init + */ + + u32 block_len = 8 + pw_len; + + u64 w[16]; + + w[ 0] = ((u64) swap_workaround (salt_buf[0])) << 32 | (u64) swap_workaround (salt_buf[1]); + w[ 1] = ((u64) swap_workaround (w0[0])) << 32 | (u64) swap_workaround (w0[1]); + w[ 2] = ((u64) swap_workaround (w0[2])) << 32 | (u64) swap_workaround (w0[3]); + w[ 3] = ((u64) swap_workaround (w1[0])) << 32 | (u64) swap_workaround (w1[1]); + w[ 4] = ((u64) swap_workaround (w1[2])) << 32 | (u64) swap_workaround (w1[3]); + w[ 5] = ((u64) swap_workaround (w2[0])) << 32 | (u64) swap_workaround (w2[1]); + w[ 6] = ((u64) swap_workaround (w2[2])) << 32 | (u64) swap_workaround (w2[3]); + w[ 7] = ((u64) swap_workaround (w3[0])) << 32 | (u64) swap_workaround (w3[1]); + w[ 8] = ((u64) swap_workaround (w3[2])) << 32 | (u64) swap_workaround (w3[3]); + w[ 9] = 0; + w[10] = 0; + w[11] = 0; + w[12] = 0; + w[13] = 0; + w[14] = 0; + w[15] = block_len * 8; + + /** + * init + */ + + u64 digest[8]; + + digest[0] = SHA512M_A; + digest[1] = SHA512M_B; + digest[2] = SHA512M_C; + digest[3] = SHA512M_D; + digest[4] = SHA512M_E; + digest[5] = SHA512M_F; + digest[6] = SHA512M_G; + digest[7] = SHA512M_H; + + sha512_transform (w, digest); + + tmps[gid].digest_buf[0] = digest[0]; + tmps[gid].digest_buf[1] = digest[1]; + tmps[gid].digest_buf[2] = digest[2]; + tmps[gid].digest_buf[3] = digest[3]; + tmps[gid].digest_buf[4] = digest[4]; + tmps[gid].digest_buf[5] = digest[5]; + tmps[gid].digest_buf[6] = digest[6]; + tmps[gid].digest_buf[7] = digest[7]; +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m07900_loop (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global drupal7_tmp_t *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = pws[gid].i[ 8]; + w2[1] = pws[gid].i[ 9]; + w2[2] = pws[gid].i[10]; + w2[3] = pws[gid].i[11]; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + append_0x80_4 (w0, w1, w2, w3, pw_len); + + /** + * digest + */ + + u64 digest[8]; + + digest[0] = tmps[gid].digest_buf[0]; + digest[1] = tmps[gid].digest_buf[1]; + digest[2] = tmps[gid].digest_buf[2]; + digest[3] = tmps[gid].digest_buf[3]; + digest[4] = tmps[gid].digest_buf[4]; + digest[5] = tmps[gid].digest_buf[5]; + digest[6] = tmps[gid].digest_buf[6]; + digest[7] = tmps[gid].digest_buf[7]; + + /** + * loop + */ + + u32 block_len = (64 + pw_len); + + u64 w[16]; + + w[ 0] = 0; + w[ 1] = 0; + w[ 2] = 0; + w[ 3] = 0; + w[ 4] = 0; + w[ 5] = 0; + w[ 6] = 0; + w[ 7] = 0; + w[ 8] = ((u64) swap_workaround (w0[0])) << 32 | (u64) swap_workaround (w0[1]); + w[ 9] = ((u64) swap_workaround (w0[2])) << 32 | (u64) swap_workaround (w0[3]); + w[10] = ((u64) swap_workaround (w1[0])) << 32 | (u64) swap_workaround (w1[1]); + w[11] = ((u64) swap_workaround (w1[2])) << 32 | (u64) swap_workaround (w1[3]); + w[12] = ((u64) swap_workaround (w2[0])) << 32 | (u64) swap_workaround (w2[1]); + w[13] = ((u64) swap_workaround (w2[2])) << 32 | (u64) swap_workaround (w2[3]); + w[14] = 0; + w[15] = block_len * 8; + + /** + * init + */ + + for (u32 i = 0; i < loop_cnt; i++) + { + w[ 0] = digest[0]; + w[ 1] = digest[1]; + w[ 2] = digest[2]; + w[ 3] = digest[3]; + w[ 4] = digest[4]; + w[ 5] = digest[5]; + w[ 6] = digest[6]; + w[ 7] = digest[7]; + + digest[0] = SHA512M_A; + digest[1] = SHA512M_B; + digest[2] = SHA512M_C; + digest[3] = SHA512M_D; + digest[4] = SHA512M_E; + digest[5] = SHA512M_F; + digest[6] = SHA512M_G; + digest[7] = SHA512M_H; + + sha512_transform (w, digest); + } + + tmps[gid].digest_buf[0] = digest[0]; + tmps[gid].digest_buf[1] = digest[1]; + tmps[gid].digest_buf[2] = digest[2]; + tmps[gid].digest_buf[3] = digest[3]; + tmps[gid].digest_buf[4] = digest[4]; + tmps[gid].digest_buf[5] = digest[5]; + tmps[gid].digest_buf[6] = digest[6]; + tmps[gid].digest_buf[7] = digest[7]; +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m07900_comp (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global drupal7_tmp_t *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + const u32 lid = get_local_id (0); + + /** + * digest + */ + + const u32x r0 = l32_from_64 (tmps[gid].digest_buf[0]); + const u32x r1 = h32_from_64 (tmps[gid].digest_buf[0]); + const u32x r2 = l32_from_64 (tmps[gid].digest_buf[1]); + const u32x r3 = h32_from_64 (tmps[gid].digest_buf[1]); + + #define il_pos 0 + + #include VECT_COMPARE_M +} diff --git a/amd/m08000_a0.cl b/amd/m08000_a0.cl new file mode 100644 index 0000000000..ceddde560e --- /dev/null +++ b/amd/m08000_a0.cl @@ -0,0 +1,525 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _SHA256_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW4 +#define VECT_SIZE2 +#endif + +#ifdef VLIW5 +#define VECT_SIZE2 +#endif + +#define DGST_R0 3 +#define DGST_R1 7 +#define DGST_R2 2 +#define DGST_R3 6 + +#include "include/kernel_functions.c" +#include "types_amd.c" +#include "common_amd.c" +#include "include/rp_gpu.h" +#include "rp_amd.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +__constant u32 k_sha256[64] = +{ + SHA256C00, SHA256C01, SHA256C02, SHA256C03, + SHA256C04, SHA256C05, SHA256C06, SHA256C07, + SHA256C08, SHA256C09, SHA256C0a, SHA256C0b, + SHA256C0c, SHA256C0d, SHA256C0e, SHA256C0f, + SHA256C10, SHA256C11, SHA256C12, SHA256C13, + SHA256C14, SHA256C15, SHA256C16, SHA256C17, + SHA256C18, SHA256C19, SHA256C1a, SHA256C1b, + SHA256C1c, SHA256C1d, SHA256C1e, SHA256C1f, + SHA256C20, SHA256C21, SHA256C22, SHA256C23, + SHA256C24, SHA256C25, SHA256C26, SHA256C27, + SHA256C28, SHA256C29, SHA256C2a, SHA256C2b, + SHA256C2c, SHA256C2d, SHA256C2e, SHA256C2f, + SHA256C30, SHA256C31, SHA256C32, SHA256C33, + SHA256C34, SHA256C35, SHA256C36, SHA256C37, + SHA256C38, SHA256C39, SHA256C3a, SHA256C3b, + SHA256C3c, SHA256C3d, SHA256C3e, SHA256C3f, +}; + +static void sha256_transform (u32x digest[8], const u32x w[16]) +{ + u32x a = digest[0]; + u32x b = digest[1]; + u32x c = digest[2]; + u32x d = digest[3]; + u32x e = digest[4]; + u32x f = digest[5]; + u32x g = digest[6]; + u32x h = digest[7]; + + u32x w0_t = w[ 0]; + u32x w1_t = w[ 1]; + u32x w2_t = w[ 2]; + u32x w3_t = w[ 3]; + u32x w4_t = w[ 4]; + u32x w5_t = w[ 5]; + u32x w6_t = w[ 6]; + u32x w7_t = w[ 7]; + u32x w8_t = w[ 8]; + u32x w9_t = w[ 9]; + u32x wa_t = w[10]; + u32x wb_t = w[11]; + u32x wc_t = w[12]; + u32x wd_t = w[13]; + u32x we_t = w[14]; + u32x wf_t = w[15]; + + #define ROUND_EXPAND() \ + { \ + w0_t = SHA256_EXPAND (we_t, w9_t, w1_t, w0_t); \ + w1_t = SHA256_EXPAND (wf_t, wa_t, w2_t, w1_t); \ + w2_t = SHA256_EXPAND (w0_t, wb_t, w3_t, w2_t); \ + w3_t = SHA256_EXPAND (w1_t, wc_t, w4_t, w3_t); \ + w4_t = SHA256_EXPAND (w2_t, wd_t, w5_t, w4_t); \ + w5_t = SHA256_EXPAND (w3_t, we_t, w6_t, w5_t); \ + w6_t = SHA256_EXPAND (w4_t, wf_t, w7_t, w6_t); \ + w7_t = SHA256_EXPAND (w5_t, w0_t, w8_t, w7_t); \ + w8_t = SHA256_EXPAND (w6_t, w1_t, w9_t, w8_t); \ + w9_t = SHA256_EXPAND (w7_t, w2_t, wa_t, w9_t); \ + wa_t = SHA256_EXPAND (w8_t, w3_t, wb_t, wa_t); \ + wb_t = SHA256_EXPAND (w9_t, w4_t, wc_t, wb_t); \ + wc_t = SHA256_EXPAND (wa_t, w5_t, wd_t, wc_t); \ + wd_t = SHA256_EXPAND (wb_t, w6_t, we_t, wd_t); \ + we_t = SHA256_EXPAND (wc_t, w7_t, wf_t, we_t); \ + wf_t = SHA256_EXPAND (wd_t, w8_t, w0_t, wf_t); \ + } + + #define ROUND_STEP(i) \ + { \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, k_sha256[i + 0]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, k_sha256[i + 1]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, k_sha256[i + 2]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, k_sha256[i + 3]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, k_sha256[i + 4]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, k_sha256[i + 5]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, k_sha256[i + 6]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, k_sha256[i + 7]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, k_sha256[i + 8]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, k_sha256[i + 9]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, k_sha256[i + 10]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, k_sha256[i + 11]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, k_sha256[i + 12]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, k_sha256[i + 13]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, k_sha256[i + 14]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, k_sha256[i + 15]); \ + } + + ROUND_STEP (0); + + #pragma unroll + for (int i = 16; i < 64; i += 16) + { + ROUND_EXPAND (); ROUND_STEP (i); + } + + digest[0] += a; + digest[1] += b; + digest[2] += c; + digest[3] += d; + digest[4] += e; + digest[5] += f; + digest[6] += g; + digest[7] += h; +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m08000_m04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + u32x pw_buf1[4]; + + pw_buf1[0] = pws[gid].i[ 4]; + pw_buf1[1] = pws[gid].i[ 5]; + pw_buf1[2] = pws[gid].i[ 6]; + pw_buf1[3] = pws[gid].i[ 7]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * salt + */ + + const u32 salt_buf0 = swap_workaround (salt_bufs[salt_pos].salt_buf[ 0]); + const u32 salt_buf1 = swap_workaround (salt_bufs[salt_pos].salt_buf[ 1]); + const u32 salt_buf2 = swap_workaround (salt_bufs[salt_pos].salt_buf[ 2]); // 0x80 + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + u32x w1[4]; + u32x w2[4]; + u32x w3[4]; + + w0[0] = pw_buf0[0]; + w0[1] = pw_buf0[1]; + w0[2] = pw_buf0[2]; + w0[3] = pw_buf0[3]; + w1[0] = pw_buf1[0]; + w1[1] = pw_buf1[1]; + w1[2] = pw_buf1[2]; + w1[3] = pw_buf1[3]; + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 out_len = apply_rules (rules_buf[il_pos].cmds, w0, w1, pw_len); + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + make_unicode (w0, w0_t, w1_t); + + make_unicode (w1, w2_t, w3_t); + + u32x w_t[16]; + + w_t[ 0] = swap_workaround (w0_t[0]); + w_t[ 1] = swap_workaround (w0_t[1]); + w_t[ 2] = swap_workaround (w0_t[2]); + w_t[ 3] = swap_workaround (w0_t[3]); + w_t[ 4] = swap_workaround (w1_t[0]); + w_t[ 5] = swap_workaround (w1_t[1]); + w_t[ 6] = swap_workaround (w1_t[2]); + w_t[ 7] = swap_workaround (w1_t[3]); + w_t[ 8] = swap_workaround (w2_t[0]); + w_t[ 9] = swap_workaround (w2_t[1]); + w_t[10] = swap_workaround (w2_t[2]); + w_t[11] = swap_workaround (w2_t[3]); + w_t[12] = swap_workaround (w3_t[0]); + w_t[13] = swap_workaround (w3_t[1]); + w_t[14] = swap_workaround (w3_t[2]); + w_t[15] = swap_workaround (w3_t[3]); + + w_t[ 0] = w_t[ 0] >> 8; + w_t[ 1] = w_t[ 1] >> 8; + w_t[ 2] = w_t[ 2] >> 8; + w_t[ 3] = w_t[ 3] >> 8; + w_t[ 4] = w_t[ 4] >> 8; + w_t[ 5] = w_t[ 5] >> 8; + w_t[ 6] = w_t[ 6] >> 8; + w_t[ 7] = w_t[ 7] >> 8; + w_t[ 8] = w_t[ 8] >> 8; + w_t[ 9] = w_t[ 9] >> 8; + w_t[10] = w_t[10] >> 8; + w_t[11] = w_t[11] >> 8; + w_t[12] = w_t[12] >> 8; + w_t[13] = w_t[13] >> 8; + w_t[14] = w_t[14] >> 8; + w_t[15] = w_t[15] >> 8; + + u32x digest[8]; + + digest[0] = SHA256M_A; + digest[1] = SHA256M_B; + digest[2] = SHA256M_C; + digest[3] = SHA256M_D; + digest[4] = SHA256M_E; + digest[5] = SHA256M_F; + digest[6] = SHA256M_G; + digest[7] = SHA256M_H; + + sha256_transform (digest, w_t); // 0 - 64 + + w_t[ 0] = 0; + w_t[ 1] = 0; + w_t[ 2] = 0; + w_t[ 3] = 0; + w_t[ 4] = 0; + w_t[ 5] = 0; + w_t[ 6] = 0; + w_t[ 7] = 0; + w_t[ 8] = 0; + w_t[ 9] = 0; + w_t[10] = 0; + w_t[11] = 0; + w_t[12] = 0; + w_t[13] = 0; + w_t[14] = 0; + w_t[15] = 0; + + sha256_transform (digest, w_t); // 64 - 128 + sha256_transform (digest, w_t); // 128 - 192 + sha256_transform (digest, w_t); // 192 - 256 + sha256_transform (digest, w_t); // 256 - 320 + sha256_transform (digest, w_t); // 320 - 384 + sha256_transform (digest, w_t); // 384 - 448 + + w_t[15] = 0 | salt_buf0 >> 16; + + sha256_transform (digest, w_t); // 448 - 512 + + w_t[ 0] = salt_buf0 << 16 | salt_buf1 >> 16; + w_t[ 1] = salt_buf1 << 16 | salt_buf2 >> 16; + w_t[ 2] = salt_buf2 << 16 | 0; + w_t[15] = (510 + 8) * 8; + + sha256_transform (digest, w_t); // 512 - 576 + + const u32x r0 = digest[3]; + const u32x r1 = digest[7]; + const u32x r2 = digest[2]; + const u32x r3 = digest[6]; + + #include VECT_COMPARE_M + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m08000_m08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m08000_m16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m08000_s04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + u32x pw_buf1[4]; + + pw_buf1[0] = pws[gid].i[ 4]; + pw_buf1[1] = pws[gid].i[ 5]; + pw_buf1[2] = pws[gid].i[ 6]; + pw_buf1[3] = pws[gid].i[ 7]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * salt + */ + + const u32 salt_buf0 = swap_workaround (salt_bufs[salt_pos].salt_buf[ 0]); + const u32 salt_buf1 = swap_workaround (salt_bufs[salt_pos].salt_buf[ 1]); + const u32 salt_buf2 = swap_workaround (salt_bufs[salt_pos].salt_buf[ 2]); // 0x80 + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + u32x w1[4]; + u32x w2[4]; + u32x w3[4]; + + w0[0] = pw_buf0[0]; + w0[1] = pw_buf0[1]; + w0[2] = pw_buf0[2]; + w0[3] = pw_buf0[3]; + w1[0] = pw_buf1[0]; + w1[1] = pw_buf1[1]; + w1[2] = pw_buf1[2]; + w1[3] = pw_buf1[3]; + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 out_len = apply_rules (rules_buf[il_pos].cmds, w0, w1, pw_len); + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + make_unicode (w0, w0_t, w1_t); + + make_unicode (w1, w2_t, w3_t); + + u32x w_t[16]; + + w_t[ 0] = swap_workaround (w0_t[0]); + w_t[ 1] = swap_workaround (w0_t[1]); + w_t[ 2] = swap_workaround (w0_t[2]); + w_t[ 3] = swap_workaround (w0_t[3]); + w_t[ 4] = swap_workaround (w1_t[0]); + w_t[ 5] = swap_workaround (w1_t[1]); + w_t[ 6] = swap_workaround (w1_t[2]); + w_t[ 7] = swap_workaround (w1_t[3]); + w_t[ 8] = swap_workaround (w2_t[0]); + w_t[ 9] = swap_workaround (w2_t[1]); + w_t[10] = swap_workaround (w2_t[2]); + w_t[11] = swap_workaround (w2_t[3]); + w_t[12] = swap_workaround (w3_t[0]); + w_t[13] = swap_workaround (w3_t[1]); + w_t[14] = swap_workaround (w3_t[2]); + w_t[15] = swap_workaround (w3_t[3]); + + w_t[ 0] = w_t[ 0] >> 8; + w_t[ 1] = w_t[ 1] >> 8; + w_t[ 2] = w_t[ 2] >> 8; + w_t[ 3] = w_t[ 3] >> 8; + w_t[ 4] = w_t[ 4] >> 8; + w_t[ 5] = w_t[ 5] >> 8; + w_t[ 6] = w_t[ 6] >> 8; + w_t[ 7] = w_t[ 7] >> 8; + w_t[ 8] = w_t[ 8] >> 8; + w_t[ 9] = w_t[ 9] >> 8; + w_t[10] = w_t[10] >> 8; + w_t[11] = w_t[11] >> 8; + w_t[12] = w_t[12] >> 8; + w_t[13] = w_t[13] >> 8; + w_t[14] = w_t[14] >> 8; + w_t[15] = w_t[15] >> 8; + + u32x digest[8]; + + digest[0] = SHA256M_A; + digest[1] = SHA256M_B; + digest[2] = SHA256M_C; + digest[3] = SHA256M_D; + digest[4] = SHA256M_E; + digest[5] = SHA256M_F; + digest[6] = SHA256M_G; + digest[7] = SHA256M_H; + + sha256_transform (digest, w_t); // 0 - 64 + + w_t[ 0] = 0; + w_t[ 1] = 0; + w_t[ 2] = 0; + w_t[ 3] = 0; + w_t[ 4] = 0; + w_t[ 5] = 0; + w_t[ 6] = 0; + w_t[ 7] = 0; + w_t[ 8] = 0; + w_t[ 9] = 0; + w_t[10] = 0; + w_t[11] = 0; + w_t[12] = 0; + w_t[13] = 0; + w_t[14] = 0; + w_t[15] = 0; + + sha256_transform (digest, w_t); // 64 - 128 + sha256_transform (digest, w_t); // 128 - 192 + sha256_transform (digest, w_t); // 192 - 256 + sha256_transform (digest, w_t); // 256 - 320 + sha256_transform (digest, w_t); // 320 - 384 + sha256_transform (digest, w_t); // 384 - 448 + + w_t[15] = 0 | salt_buf0 >> 16; + + sha256_transform (digest, w_t); // 448 - 512 + + w_t[ 0] = salt_buf0 << 16 | salt_buf1 >> 16; + w_t[ 1] = salt_buf1 << 16 | salt_buf2 >> 16; + w_t[ 2] = salt_buf2 << 16 | 0; + w_t[15] = (510 + 8) * 8; + + sha256_transform (digest, w_t); // 512 - 576 + + const u32x r0 = digest[3]; + const u32x r1 = digest[7]; + const u32x r2 = digest[2]; + const u32x r3 = digest[6]; + + #include VECT_COMPARE_S + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m08000_s08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m08000_s16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/amd/m08000_a1.cl b/amd/m08000_a1.cl new file mode 100644 index 0000000000..dc210ef853 --- /dev/null +++ b/amd/m08000_a1.cl @@ -0,0 +1,611 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _SHA256_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW4 +#define VECT_SIZE2 +#endif + +#ifdef VLIW5 +#define VECT_SIZE2 +#endif + +#define DGST_R0 3 +#define DGST_R1 7 +#define DGST_R2 2 +#define DGST_R3 6 + +#include "include/kernel_functions.c" +#include "types_amd.c" +#include "common_amd.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +__constant u32 k_sha256[64] = +{ + SHA256C00, SHA256C01, SHA256C02, SHA256C03, + SHA256C04, SHA256C05, SHA256C06, SHA256C07, + SHA256C08, SHA256C09, SHA256C0a, SHA256C0b, + SHA256C0c, SHA256C0d, SHA256C0e, SHA256C0f, + SHA256C10, SHA256C11, SHA256C12, SHA256C13, + SHA256C14, SHA256C15, SHA256C16, SHA256C17, + SHA256C18, SHA256C19, SHA256C1a, SHA256C1b, + SHA256C1c, SHA256C1d, SHA256C1e, SHA256C1f, + SHA256C20, SHA256C21, SHA256C22, SHA256C23, + SHA256C24, SHA256C25, SHA256C26, SHA256C27, + SHA256C28, SHA256C29, SHA256C2a, SHA256C2b, + SHA256C2c, SHA256C2d, SHA256C2e, SHA256C2f, + SHA256C30, SHA256C31, SHA256C32, SHA256C33, + SHA256C34, SHA256C35, SHA256C36, SHA256C37, + SHA256C38, SHA256C39, SHA256C3a, SHA256C3b, + SHA256C3c, SHA256C3d, SHA256C3e, SHA256C3f, +}; + +static void sha256_transform (u32x digest[8], const u32x w[16]) +{ + u32x a = digest[0]; + u32x b = digest[1]; + u32x c = digest[2]; + u32x d = digest[3]; + u32x e = digest[4]; + u32x f = digest[5]; + u32x g = digest[6]; + u32x h = digest[7]; + + u32x w0_t = w[ 0]; + u32x w1_t = w[ 1]; + u32x w2_t = w[ 2]; + u32x w3_t = w[ 3]; + u32x w4_t = w[ 4]; + u32x w5_t = w[ 5]; + u32x w6_t = w[ 6]; + u32x w7_t = w[ 7]; + u32x w8_t = w[ 8]; + u32x w9_t = w[ 9]; + u32x wa_t = w[10]; + u32x wb_t = w[11]; + u32x wc_t = w[12]; + u32x wd_t = w[13]; + u32x we_t = w[14]; + u32x wf_t = w[15]; + + #define ROUND_EXPAND() \ + { \ + w0_t = SHA256_EXPAND (we_t, w9_t, w1_t, w0_t); \ + w1_t = SHA256_EXPAND (wf_t, wa_t, w2_t, w1_t); \ + w2_t = SHA256_EXPAND (w0_t, wb_t, w3_t, w2_t); \ + w3_t = SHA256_EXPAND (w1_t, wc_t, w4_t, w3_t); \ + w4_t = SHA256_EXPAND (w2_t, wd_t, w5_t, w4_t); \ + w5_t = SHA256_EXPAND (w3_t, we_t, w6_t, w5_t); \ + w6_t = SHA256_EXPAND (w4_t, wf_t, w7_t, w6_t); \ + w7_t = SHA256_EXPAND (w5_t, w0_t, w8_t, w7_t); \ + w8_t = SHA256_EXPAND (w6_t, w1_t, w9_t, w8_t); \ + w9_t = SHA256_EXPAND (w7_t, w2_t, wa_t, w9_t); \ + wa_t = SHA256_EXPAND (w8_t, w3_t, wb_t, wa_t); \ + wb_t = SHA256_EXPAND (w9_t, w4_t, wc_t, wb_t); \ + wc_t = SHA256_EXPAND (wa_t, w5_t, wd_t, wc_t); \ + wd_t = SHA256_EXPAND (wb_t, w6_t, we_t, wd_t); \ + we_t = SHA256_EXPAND (wc_t, w7_t, wf_t, we_t); \ + wf_t = SHA256_EXPAND (wd_t, w8_t, w0_t, wf_t); \ + } + + #define ROUND_STEP(i) \ + { \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, k_sha256[i + 0]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, k_sha256[i + 1]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, k_sha256[i + 2]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, k_sha256[i + 3]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, k_sha256[i + 4]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, k_sha256[i + 5]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, k_sha256[i + 6]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, k_sha256[i + 7]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, k_sha256[i + 8]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, k_sha256[i + 9]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, k_sha256[i + 10]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, k_sha256[i + 11]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, k_sha256[i + 12]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, k_sha256[i + 13]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, k_sha256[i + 14]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, k_sha256[i + 15]); \ + } + + ROUND_STEP (0); + + #pragma unroll + for (int i = 16; i < 64; i += 16) + { + ROUND_EXPAND (); ROUND_STEP (i); + } + + digest[0] += a; + digest[1] += b; + digest[2] += c; + digest[3] += d; + digest[4] += e; + digest[5] += f; + digest[6] += g; + digest[7] += h; +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m08000_m04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, combs_buf[0].pw_len); + } + + /** + * salt + */ + + const u32 salt_buf0 = swap_workaround (salt_bufs[salt_pos].salt_buf[ 0]); + const u32 salt_buf1 = swap_workaround (salt_bufs[salt_pos].salt_buf[ 1]); + const u32 salt_buf2 = swap_workaround (salt_bufs[salt_pos].salt_buf[ 2]); // 0x80 + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + u32 wordr0[4]; + u32 wordr1[4]; + u32 wordr2[4]; + u32 wordr3[4]; + + wordr0[0] = combs_buf[il_pos].i[0]; + wordr0[1] = combs_buf[il_pos].i[1]; + wordr0[2] = combs_buf[il_pos].i[2]; + wordr0[3] = combs_buf[il_pos].i[3]; + wordr1[0] = combs_buf[il_pos].i[4]; + wordr1[1] = combs_buf[il_pos].i[5]; + wordr1[2] = combs_buf[il_pos].i[6]; + wordr1[3] = combs_buf[il_pos].i[7]; + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + u32x w0[4]; + u32x w1[4]; + u32x w2[4]; + u32x w3[4]; + + w0[0] = wordl0[0] | wordr0[0]; + w0[1] = wordl0[1] | wordr0[1]; + w0[2] = wordl0[2] | wordr0[2]; + w0[3] = wordl0[3] | wordr0[3]; + w1[0] = wordl1[0] | wordr1[0]; + w1[1] = wordl1[1] | wordr1[1]; + w1[2] = wordl1[2] | wordr1[2]; + w1[3] = wordl1[3] | wordr1[3]; + w2[0] = wordl2[0] | wordr2[0]; + w2[1] = wordl2[1] | wordr2[1]; + w2[2] = wordl2[2] | wordr2[2]; + w2[3] = wordl2[3] | wordr2[3]; + w3[0] = wordl3[0] | wordr3[0]; + w3[1] = wordl3[1] | wordr3[1]; + w3[2] = wordl3[2] | wordr3[2]; + w3[3] = wordl3[3] | wordr3[3]; + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + make_unicode (w0, w0_t, w1_t); + + make_unicode (w1, w2_t, w3_t); + + u32x w_t[16]; + + w_t[ 0] = swap_workaround (w0_t[0]); + w_t[ 1] = swap_workaround (w0_t[1]); + w_t[ 2] = swap_workaround (w0_t[2]); + w_t[ 3] = swap_workaround (w0_t[3]); + w_t[ 4] = swap_workaround (w1_t[0]); + w_t[ 5] = swap_workaround (w1_t[1]); + w_t[ 6] = swap_workaround (w1_t[2]); + w_t[ 7] = swap_workaround (w1_t[3]); + w_t[ 8] = swap_workaround (w2_t[0]); + w_t[ 9] = swap_workaround (w2_t[1]); + w_t[10] = swap_workaround (w2_t[2]); + w_t[11] = swap_workaround (w2_t[3]); + w_t[12] = swap_workaround (w3_t[0]); + w_t[13] = swap_workaround (w3_t[1]); + w_t[14] = swap_workaround (w3_t[2]); + w_t[15] = swap_workaround (w3_t[3]); + + w_t[ 0] = w_t[ 0] >> 8; + w_t[ 1] = w_t[ 1] >> 8; + w_t[ 2] = w_t[ 2] >> 8; + w_t[ 3] = w_t[ 3] >> 8; + w_t[ 4] = w_t[ 4] >> 8; + w_t[ 5] = w_t[ 5] >> 8; + w_t[ 6] = w_t[ 6] >> 8; + w_t[ 7] = w_t[ 7] >> 8; + w_t[ 8] = w_t[ 8] >> 8; + w_t[ 9] = w_t[ 9] >> 8; + w_t[10] = w_t[10] >> 8; + w_t[11] = w_t[11] >> 8; + w_t[12] = w_t[12] >> 8; + w_t[13] = w_t[13] >> 8; + w_t[14] = w_t[14] >> 8; + w_t[15] = w_t[15] >> 8; + + u32x digest[8]; + + digest[0] = SHA256M_A; + digest[1] = SHA256M_B; + digest[2] = SHA256M_C; + digest[3] = SHA256M_D; + digest[4] = SHA256M_E; + digest[5] = SHA256M_F; + digest[6] = SHA256M_G; + digest[7] = SHA256M_H; + + sha256_transform (digest, w_t); // 0 - 64 + + w_t[ 0] = 0; + w_t[ 1] = 0; + w_t[ 2] = 0; + w_t[ 3] = 0; + w_t[ 4] = 0; + w_t[ 5] = 0; + w_t[ 6] = 0; + w_t[ 7] = 0; + w_t[ 8] = 0; + w_t[ 9] = 0; + w_t[10] = 0; + w_t[11] = 0; + w_t[12] = 0; + w_t[13] = 0; + w_t[14] = 0; + w_t[15] = 0; + + sha256_transform (digest, w_t); // 64 - 128 + sha256_transform (digest, w_t); // 128 - 192 + sha256_transform (digest, w_t); // 192 - 256 + sha256_transform (digest, w_t); // 256 - 320 + sha256_transform (digest, w_t); // 320 - 384 + sha256_transform (digest, w_t); // 384 - 448 + + w_t[15] = 0 | salt_buf0 >> 16; + + sha256_transform (digest, w_t); // 448 - 512 + + w_t[ 0] = salt_buf0 << 16 | salt_buf1 >> 16; + w_t[ 1] = salt_buf1 << 16 | salt_buf2 >> 16; + w_t[ 2] = salt_buf2 << 16 | 0; + w_t[15] = (510 + 8) * 8; + + sha256_transform (digest, w_t); // 512 - 576 + + const u32x r0 = digest[3]; + const u32x r1 = digest[7]; + const u32x r2 = digest[2]; + const u32x r3 = digest[6]; + + #include VECT_COMPARE_M + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m08000_m08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m08000_m16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m08000_s04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, combs_buf[0].pw_len); + } + + /** + * salt + */ + + const u32 salt_buf0 = swap_workaround (salt_bufs[salt_pos].salt_buf[ 0]); + const u32 salt_buf1 = swap_workaround (salt_bufs[salt_pos].salt_buf[ 1]); + const u32 salt_buf2 = swap_workaround (salt_bufs[salt_pos].salt_buf[ 2]); // 0x80 + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + u32 wordr0[4]; + u32 wordr1[4]; + u32 wordr2[4]; + u32 wordr3[4]; + + wordr0[0] = combs_buf[il_pos].i[0]; + wordr0[1] = combs_buf[il_pos].i[1]; + wordr0[2] = combs_buf[il_pos].i[2]; + wordr0[3] = combs_buf[il_pos].i[3]; + wordr1[0] = combs_buf[il_pos].i[4]; + wordr1[1] = combs_buf[il_pos].i[5]; + wordr1[2] = combs_buf[il_pos].i[6]; + wordr1[3] = combs_buf[il_pos].i[7]; + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + u32x w0[4]; + u32x w1[4]; + u32x w2[4]; + u32x w3[4]; + + w0[0] = wordl0[0] | wordr0[0]; + w0[1] = wordl0[1] | wordr0[1]; + w0[2] = wordl0[2] | wordr0[2]; + w0[3] = wordl0[3] | wordr0[3]; + w1[0] = wordl1[0] | wordr1[0]; + w1[1] = wordl1[1] | wordr1[1]; + w1[2] = wordl1[2] | wordr1[2]; + w1[3] = wordl1[3] | wordr1[3]; + w2[0] = wordl2[0] | wordr2[0]; + w2[1] = wordl2[1] | wordr2[1]; + w2[2] = wordl2[2] | wordr2[2]; + w2[3] = wordl2[3] | wordr2[3]; + w3[0] = wordl3[0] | wordr3[0]; + w3[1] = wordl3[1] | wordr3[1]; + w3[2] = wordl3[2] | wordr3[2]; + w3[3] = wordl3[3] | wordr3[3]; + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + make_unicode (w0, w0_t, w1_t); + + make_unicode (w1, w2_t, w3_t); + + u32x w_t[16]; + + w_t[ 0] = swap_workaround (w0_t[0]); + w_t[ 1] = swap_workaround (w0_t[1]); + w_t[ 2] = swap_workaround (w0_t[2]); + w_t[ 3] = swap_workaround (w0_t[3]); + w_t[ 4] = swap_workaround (w1_t[0]); + w_t[ 5] = swap_workaround (w1_t[1]); + w_t[ 6] = swap_workaround (w1_t[2]); + w_t[ 7] = swap_workaround (w1_t[3]); + w_t[ 8] = swap_workaround (w2_t[0]); + w_t[ 9] = swap_workaround (w2_t[1]); + w_t[10] = swap_workaround (w2_t[2]); + w_t[11] = swap_workaround (w2_t[3]); + w_t[12] = swap_workaround (w3_t[0]); + w_t[13] = swap_workaround (w3_t[1]); + w_t[14] = swap_workaround (w3_t[2]); + w_t[15] = swap_workaround (w3_t[3]); + + w_t[ 0] = w_t[ 0] >> 8; + w_t[ 1] = w_t[ 1] >> 8; + w_t[ 2] = w_t[ 2] >> 8; + w_t[ 3] = w_t[ 3] >> 8; + w_t[ 4] = w_t[ 4] >> 8; + w_t[ 5] = w_t[ 5] >> 8; + w_t[ 6] = w_t[ 6] >> 8; + w_t[ 7] = w_t[ 7] >> 8; + w_t[ 8] = w_t[ 8] >> 8; + w_t[ 9] = w_t[ 9] >> 8; + w_t[10] = w_t[10] >> 8; + w_t[11] = w_t[11] >> 8; + w_t[12] = w_t[12] >> 8; + w_t[13] = w_t[13] >> 8; + w_t[14] = w_t[14] >> 8; + w_t[15] = w_t[15] >> 8; + + u32x digest[8]; + + digest[0] = SHA256M_A; + digest[1] = SHA256M_B; + digest[2] = SHA256M_C; + digest[3] = SHA256M_D; + digest[4] = SHA256M_E; + digest[5] = SHA256M_F; + digest[6] = SHA256M_G; + digest[7] = SHA256M_H; + + sha256_transform (digest, w_t); // 0 - 64 + + w_t[ 0] = 0; + w_t[ 1] = 0; + w_t[ 2] = 0; + w_t[ 3] = 0; + w_t[ 4] = 0; + w_t[ 5] = 0; + w_t[ 6] = 0; + w_t[ 7] = 0; + w_t[ 8] = 0; + w_t[ 9] = 0; + w_t[10] = 0; + w_t[11] = 0; + w_t[12] = 0; + w_t[13] = 0; + w_t[14] = 0; + w_t[15] = 0; + + sha256_transform (digest, w_t); // 64 - 128 + sha256_transform (digest, w_t); // 128 - 192 + sha256_transform (digest, w_t); // 192 - 256 + sha256_transform (digest, w_t); // 256 - 320 + sha256_transform (digest, w_t); // 320 - 384 + sha256_transform (digest, w_t); // 384 - 448 + + w_t[15] = 0 | salt_buf0 >> 16; + + sha256_transform (digest, w_t); // 448 - 512 + + w_t[ 0] = salt_buf0 << 16 | salt_buf1 >> 16; + w_t[ 1] = salt_buf1 << 16 | salt_buf2 >> 16; + w_t[ 2] = salt_buf2 << 16 | 0; + w_t[15] = (510 + 8) * 8; + + sha256_transform (digest, w_t); // 512 - 576 + + const u32x r0 = digest[3]; + const u32x r1 = digest[7]; + const u32x r2 = digest[2]; + const u32x r3 = digest[6]; + + #include VECT_COMPARE_S + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m08000_s08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m08000_s16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/amd/m08000_a3.cl b/amd/m08000_a3.cl new file mode 100644 index 0000000000..488947a316 --- /dev/null +++ b/amd/m08000_a3.cl @@ -0,0 +1,606 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _SHA256_ +#define _SCALAR_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW4 +#define VECT_SIZE2 +#endif + +#ifdef VLIW5 +#define VECT_SIZE2 +#endif + +#define DGST_R0 3 +#define DGST_R1 7 +#define DGST_R2 2 +#define DGST_R3 6 + +#include "include/kernel_functions.c" +#include "types_amd.c" +#include "common_amd.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4_warp.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4_warp.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4_warp.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4_warp.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4_warp.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4_warp.c" +#endif + +__constant u32 k_sha256[64] = +{ + SHA256C00, SHA256C01, SHA256C02, SHA256C03, + SHA256C04, SHA256C05, SHA256C06, SHA256C07, + SHA256C08, SHA256C09, SHA256C0a, SHA256C0b, + SHA256C0c, SHA256C0d, SHA256C0e, SHA256C0f, + SHA256C10, SHA256C11, SHA256C12, SHA256C13, + SHA256C14, SHA256C15, SHA256C16, SHA256C17, + SHA256C18, SHA256C19, SHA256C1a, SHA256C1b, + SHA256C1c, SHA256C1d, SHA256C1e, SHA256C1f, + SHA256C20, SHA256C21, SHA256C22, SHA256C23, + SHA256C24, SHA256C25, SHA256C26, SHA256C27, + SHA256C28, SHA256C29, SHA256C2a, SHA256C2b, + SHA256C2c, SHA256C2d, SHA256C2e, SHA256C2f, + SHA256C30, SHA256C31, SHA256C32, SHA256C33, + SHA256C34, SHA256C35, SHA256C36, SHA256C37, + SHA256C38, SHA256C39, SHA256C3a, SHA256C3b, + SHA256C3c, SHA256C3d, SHA256C3e, SHA256C3f, +}; + +static void sha256_transform (u32x digest[8], const u32x w[16]) +{ + u32x a = digest[0]; + u32x b = digest[1]; + u32x c = digest[2]; + u32x d = digest[3]; + u32x e = digest[4]; + u32x f = digest[5]; + u32x g = digest[6]; + u32x h = digest[7]; + + u32x w0_t = w[ 0]; + u32x w1_t = w[ 1]; + u32x w2_t = w[ 2]; + u32x w3_t = w[ 3]; + u32x w4_t = w[ 4]; + u32x w5_t = w[ 5]; + u32x w6_t = w[ 6]; + u32x w7_t = w[ 7]; + u32x w8_t = w[ 8]; + u32x w9_t = w[ 9]; + u32x wa_t = w[10]; + u32x wb_t = w[11]; + u32x wc_t = w[12]; + u32x wd_t = w[13]; + u32x we_t = w[14]; + u32x wf_t = w[15]; + + #define ROUND_EXPAND() \ + { \ + w0_t = SHA256_EXPAND (we_t, w9_t, w1_t, w0_t); \ + w1_t = SHA256_EXPAND (wf_t, wa_t, w2_t, w1_t); \ + w2_t = SHA256_EXPAND (w0_t, wb_t, w3_t, w2_t); \ + w3_t = SHA256_EXPAND (w1_t, wc_t, w4_t, w3_t); \ + w4_t = SHA256_EXPAND (w2_t, wd_t, w5_t, w4_t); \ + w5_t = SHA256_EXPAND (w3_t, we_t, w6_t, w5_t); \ + w6_t = SHA256_EXPAND (w4_t, wf_t, w7_t, w6_t); \ + w7_t = SHA256_EXPAND (w5_t, w0_t, w8_t, w7_t); \ + w8_t = SHA256_EXPAND (w6_t, w1_t, w9_t, w8_t); \ + w9_t = SHA256_EXPAND (w7_t, w2_t, wa_t, w9_t); \ + wa_t = SHA256_EXPAND (w8_t, w3_t, wb_t, wa_t); \ + wb_t = SHA256_EXPAND (w9_t, w4_t, wc_t, wb_t); \ + wc_t = SHA256_EXPAND (wa_t, w5_t, wd_t, wc_t); \ + wd_t = SHA256_EXPAND (wb_t, w6_t, we_t, wd_t); \ + we_t = SHA256_EXPAND (wc_t, w7_t, wf_t, we_t); \ + wf_t = SHA256_EXPAND (wd_t, w8_t, w0_t, wf_t); \ + } + + #define ROUND_STEP(i) \ + { \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, k_sha256[i + 0]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, k_sha256[i + 1]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, k_sha256[i + 2]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, k_sha256[i + 3]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, k_sha256[i + 4]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, k_sha256[i + 5]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, k_sha256[i + 6]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, k_sha256[i + 7]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, k_sha256[i + 8]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, k_sha256[i + 9]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, k_sha256[i + 10]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, k_sha256[i + 11]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, k_sha256[i + 12]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, k_sha256[i + 13]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, k_sha256[i + 14]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, k_sha256[i + 15]); \ + } + + ROUND_STEP (0); + + #pragma unroll + for (int i = 16; i < 64; i += 16) + { + ROUND_EXPAND (); ROUND_STEP (i); + } + + digest[0] += a; + digest[1] += b; + digest[2] += c; + digest[3] += d; + digest[4] += e; + digest[5] += f; + digest[6] += g; + digest[7] += h; +} + +static void m08000m (u32 w[16], const u32 pw_len, __global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global u32x * words_buf_r, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset) +{ + /** + * modifier + */ + + const u32 gid = get_global_id (0); + const u32 lid = get_local_id (0); + + /** + * salt + */ + + const u32 salt_buf0 = swap_workaround (salt_bufs[salt_pos].salt_buf[ 0]); + const u32 salt_buf1 = swap_workaround (salt_bufs[salt_pos].salt_buf[ 1]); + const u32 salt_buf2 = swap_workaround (salt_bufs[salt_pos].salt_buf[ 2]); // 0x80 + + /** + * loop + */ + + const u32 bf_loops = ceil ((float) bfs_cnt / VECT_DIV); + + u32x w0l = w[0]; + + for (u32 il_pos = 0; il_pos < bf_loops; il_pos++) + { + const u32x w0r = words_buf_r[il_pos]; + + const u32x w0 = w0l | w0r; + + u32x w_t[16]; + + w_t[ 0] = w0 >> 8; + w_t[ 1] = w[ 1] >> 8; + w_t[ 2] = w[ 2] >> 8; + w_t[ 3] = w[ 3] >> 8; + w_t[ 4] = w[ 4] >> 8; + w_t[ 5] = w[ 5] >> 8; + w_t[ 6] = w[ 6] >> 8; + w_t[ 7] = w[ 7] >> 8; + w_t[ 8] = w[ 8] >> 8; + w_t[ 9] = w[ 9] >> 8; + w_t[10] = w[10] >> 8; + w_t[11] = w[11] >> 8; + w_t[12] = w[12] >> 8; + w_t[13] = w[13] >> 8; + w_t[14] = w[14] >> 8; + w_t[15] = w[15] >> 8; + + u32x digest[8]; + + digest[0] = SHA256M_A; + digest[1] = SHA256M_B; + digest[2] = SHA256M_C; + digest[3] = SHA256M_D; + digest[4] = SHA256M_E; + digest[5] = SHA256M_F; + digest[6] = SHA256M_G; + digest[7] = SHA256M_H; + + sha256_transform (digest, w_t); // 0 - 64 + + w_t[ 0] = 0; + w_t[ 1] = 0; + w_t[ 2] = 0; + w_t[ 3] = 0; + w_t[ 4] = 0; + w_t[ 5] = 0; + w_t[ 6] = 0; + w_t[ 7] = 0; + w_t[ 8] = 0; + w_t[ 9] = 0; + w_t[10] = 0; + w_t[11] = 0; + w_t[12] = 0; + w_t[13] = 0; + w_t[14] = 0; + w_t[15] = 0; + + sha256_transform (digest, w_t); // 64 - 128 + sha256_transform (digest, w_t); // 128 - 192 + sha256_transform (digest, w_t); // 192 - 256 + sha256_transform (digest, w_t); // 256 - 320 + sha256_transform (digest, w_t); // 320 - 384 + sha256_transform (digest, w_t); // 384 - 448 + + w_t[15] = 0 | salt_buf0 >> 16; + + sha256_transform (digest, w_t); // 448 - 512 + + w_t[ 0] = salt_buf0 << 16 | salt_buf1 >> 16; + w_t[ 1] = salt_buf1 << 16 | salt_buf2 >> 16; + w_t[ 2] = salt_buf2 << 16 | 0; + w_t[15] = (510 + 8) * 8; + + sha256_transform (digest, w_t); // 512 - 576 + + const u32x r0 = digest[3]; + const u32x r1 = digest[7]; + const u32x r2 = digest[2]; + const u32x r3 = digest[6]; + + #include VECT_COMPARE_M + } +} + +static void m08000s (u32 w[16], const u32 pw_len, __global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global u32x * words_buf_r, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset) +{ + /** + * modifier + */ + + const u32 gid = get_global_id (0); + const u32 lid = get_local_id (0); + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * salt + */ + + const u32 salt_buf0 = swap_workaround (salt_bufs[salt_pos].salt_buf[ 0]); + const u32 salt_buf1 = swap_workaround (salt_bufs[salt_pos].salt_buf[ 1]); + const u32 salt_buf2 = swap_workaround (salt_bufs[salt_pos].salt_buf[ 2]); // 0x80 + + /** + * loop + */ + + const u32 bf_loops = ceil ((float) bfs_cnt / VECT_DIV); + + u32x w0l = w[0]; + + for (u32 il_pos = 0; il_pos < bf_loops; il_pos++) + { + const u32x w0r = words_buf_r[il_pos]; + + const u32x w0 = w0l | w0r; + + u32x w_t[16]; + + w_t[ 0] = w0 >> 8; + w_t[ 1] = w[ 1] >> 8; + w_t[ 2] = w[ 2] >> 8; + w_t[ 3] = w[ 3] >> 8; + w_t[ 4] = w[ 4] >> 8; + w_t[ 5] = w[ 5] >> 8; + w_t[ 6] = w[ 6] >> 8; + w_t[ 7] = w[ 7] >> 8; + w_t[ 8] = w[ 8] >> 8; + w_t[ 9] = w[ 9] >> 8; + w_t[10] = w[10] >> 8; + w_t[11] = w[11] >> 8; + w_t[12] = w[12] >> 8; + w_t[13] = w[13] >> 8; + w_t[14] = w[14] >> 8; + w_t[15] = w[15] >> 8; + + u32x digest[8]; + + digest[0] = SHA256M_A; + digest[1] = SHA256M_B; + digest[2] = SHA256M_C; + digest[3] = SHA256M_D; + digest[4] = SHA256M_E; + digest[5] = SHA256M_F; + digest[6] = SHA256M_G; + digest[7] = SHA256M_H; + + sha256_transform (digest, w_t); // 0 - 64 + + w_t[ 0] = 0; + w_t[ 1] = 0; + w_t[ 2] = 0; + w_t[ 3] = 0; + w_t[ 4] = 0; + w_t[ 5] = 0; + w_t[ 6] = 0; + w_t[ 7] = 0; + w_t[ 8] = 0; + w_t[ 9] = 0; + w_t[10] = 0; + w_t[11] = 0; + w_t[12] = 0; + w_t[13] = 0; + w_t[14] = 0; + w_t[15] = 0; + + sha256_transform (digest, w_t); // 64 - 128 + sha256_transform (digest, w_t); // 128 - 192 + sha256_transform (digest, w_t); // 192 - 256 + sha256_transform (digest, w_t); // 256 - 320 + sha256_transform (digest, w_t); // 320 - 384 + sha256_transform (digest, w_t); // 384 - 448 + + w_t[15] = 0 | salt_buf0 >> 16; + + sha256_transform (digest, w_t); // 448 - 512 + + w_t[ 0] = salt_buf0 << 16 | salt_buf1 >> 16; + w_t[ 1] = salt_buf1 << 16 | salt_buf2 >> 16; + w_t[ 2] = salt_buf2 << 16 | 0; + w_t[15] = (510 + 8) * 8; + + sha256_transform (digest, w_t); // 512 - 576 + + const u32x r0 = digest[3]; + const u32x r1 = digest[7]; + const u32x r2 = digest[2]; + const u32x r3 = digest[6]; + + #include VECT_COMPARE_S + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m08000_m04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global u32x * words_buf_r, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32 w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = 0; + w[ 5] = 0; + w[ 6] = 0; + w[ 7] = 0; + w[ 8] = 0; + w[ 9] = 0; + w[10] = 0; + w[11] = 0; + w[12] = 0; + w[13] = 0; + w[14] = 0; + w[15] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m08000m (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m08000_m08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global u32x * words_buf_r, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32 w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = pws[gid].i[ 4]; + w[ 5] = pws[gid].i[ 5]; + w[ 6] = pws[gid].i[ 6]; + w[ 7] = pws[gid].i[ 7]; + w[ 8] = 0; + w[ 9] = 0; + w[10] = 0; + w[11] = 0; + w[12] = 0; + w[13] = 0; + w[14] = 0; + w[15] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m08000m (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m08000_m16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global u32x * words_buf_r, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32 w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = pws[gid].i[ 4]; + w[ 5] = pws[gid].i[ 5]; + w[ 6] = pws[gid].i[ 6]; + w[ 7] = pws[gid].i[ 7]; + w[ 8] = pws[gid].i[ 8]; + w[ 9] = pws[gid].i[ 9]; + w[10] = pws[gid].i[10]; + w[11] = pws[gid].i[11]; + w[12] = pws[gid].i[12]; + w[13] = pws[gid].i[13]; + w[14] = pws[gid].i[14]; + w[15] = pws[gid].i[15]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m08000m (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m08000_s04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global u32x * words_buf_r, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32 w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = 0; + w[ 5] = 0; + w[ 6] = 0; + w[ 7] = 0; + w[ 8] = 0; + w[ 9] = 0; + w[10] = 0; + w[11] = 0; + w[12] = 0; + w[13] = 0; + w[14] = 0; + w[15] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m08000s (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m08000_s08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global u32x * words_buf_r, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32 w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = pws[gid].i[ 4]; + w[ 5] = pws[gid].i[ 5]; + w[ 6] = pws[gid].i[ 6]; + w[ 7] = pws[gid].i[ 7]; + w[ 8] = 0; + w[ 9] = 0; + w[10] = 0; + w[11] = 0; + w[12] = 0; + w[13] = 0; + w[14] = 0; + w[15] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m08000s (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m08000_s16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global u32x * words_buf_r, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32 w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = pws[gid].i[ 4]; + w[ 5] = pws[gid].i[ 5]; + w[ 6] = pws[gid].i[ 6]; + w[ 7] = pws[gid].i[ 7]; + w[ 8] = pws[gid].i[ 8]; + w[ 9] = pws[gid].i[ 9]; + w[10] = pws[gid].i[10]; + w[11] = pws[gid].i[11]; + w[12] = pws[gid].i[12]; + w[13] = pws[gid].i[13]; + w[14] = pws[gid].i[14]; + w[15] = pws[gid].i[15]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m08000s (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} diff --git a/amd/m08100_a0.cl b/amd/m08100_a0.cl new file mode 100644 index 0000000000..4fba8dd033 --- /dev/null +++ b/amd/m08100_a0.cl @@ -0,0 +1,549 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _SHA1_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW4 +#define VECT_SIZE4 +#endif + +#ifdef VLIW5 +#define VECT_SIZE4 +#endif + +#define DGST_R0 3 +#define DGST_R1 4 +#define DGST_R2 2 +#define DGST_R3 1 + +#include "include/kernel_functions.c" +#include "types_amd.c" +#include "common_amd.c" +#include "include/rp_gpu.h" +#include "rp_amd.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m08100_m04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + u32x pw_buf1[4]; + + pw_buf1[0] = pws[gid].i[ 4]; + pw_buf1[1] = pws[gid].i[ 5]; + pw_buf1[2] = pws[gid].i[ 6]; + pw_buf1[3] = pws[gid].i[ 7]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * salt + */ + + u32 salt_buf0[2]; + + salt_buf0[0] = swap_workaround (salt_bufs[salt_pos].salt_buf[0]); + salt_buf0[1] = swap_workaround (salt_bufs[salt_pos].salt_buf[1]); + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + u32x w1[4]; + u32x w2[4]; + u32x w3[4]; + + w0[0] = pw_buf0[0]; + w0[1] = pw_buf0[1]; + w0[2] = pw_buf0[2]; + w0[3] = pw_buf0[3]; + w1[0] = pw_buf1[0]; + w1[1] = pw_buf1[1]; + w1[2] = pw_buf1[2]; + w1[3] = pw_buf1[3]; + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 out_len = apply_rules (rules_buf[il_pos].cmds, w0, w1, pw_len); + + /** + * prepend salt + */ + + const u32 out_salt_len = out_len + salt_len; + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + w0_t[0] = salt_buf0[0]; + w0_t[1] = salt_buf0[1]; + w0_t[2] = w0[0]; + w0_t[3] = w0[1]; + w1_t[0] = w0[2]; + w1_t[1] = w0[3]; + w1_t[2] = w1[0]; + w1_t[3] = w1[1]; + w2_t[0] = w1[2]; + w2_t[1] = w1[3]; + w2_t[2] = w2[0]; + w2_t[3] = w2[1]; + w3_t[0] = w2[2]; + w3_t[1] = w2[3]; + w3_t[2] = 0; + w3_t[3] = (out_salt_len + 1) * 8; + + append_0x80_4 (w0_t, w1_t, w2_t, w3_t, out_salt_len + 1); + + /** + * sha1 + */ + + w0_t[0] = swap_workaround (w0_t[0]); + w0_t[1] = swap_workaround (w0_t[1]); + w0_t[2] = swap_workaround (w0_t[2]); + w0_t[3] = swap_workaround (w0_t[3]); + w1_t[0] = swap_workaround (w1_t[0]); + w1_t[1] = swap_workaround (w1_t[1]); + w1_t[2] = swap_workaround (w1_t[2]); + w1_t[3] = swap_workaround (w1_t[3]); + w2_t[0] = swap_workaround (w2_t[0]); + w2_t[1] = swap_workaround (w2_t[1]); + w2_t[2] = swap_workaround (w2_t[2]); + w2_t[3] = swap_workaround (w2_t[3]); + w3_t[0] = swap_workaround (w3_t[0]); + w3_t[1] = swap_workaround (w3_t[1]); + //w3_t[2] = swap_workaround (w3_t[2]); + //w3_t[3] = swap_workaround (w3_t[3]); + + u32x a = SHA1M_A; + u32x b = SHA1M_B; + u32x c = SHA1M_C; + u32x d = SHA1M_D; + u32x e = SHA1M_E; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w0_t[0]); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w0_t[1]); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w0_t[2]); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w0_t[3]); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w1_t[0]); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w1_t[1]); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w1_t[2]); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w1_t[3]); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w2_t[0]); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w2_t[1]); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w2_t[2]); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w2_t[3]); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w3_t[0]); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w3_t[1]); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w3_t[2]); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w3_t[3]); + w0_t[0] = rotl32 ((w3_t[1] ^ w2_t[0] ^ w0_t[2] ^ w0_t[0]), 1u); SHA1_STEP (SHA1_F0o, e, a, b, c, d, w0_t[0]); + w0_t[1] = rotl32 ((w3_t[2] ^ w2_t[1] ^ w0_t[3] ^ w0_t[1]), 1u); SHA1_STEP (SHA1_F0o, d, e, a, b, c, w0_t[1]); + w0_t[2] = rotl32 ((w3_t[3] ^ w2_t[2] ^ w1_t[0] ^ w0_t[2]), 1u); SHA1_STEP (SHA1_F0o, c, d, e, a, b, w0_t[2]); + w0_t[3] = rotl32 ((w0_t[0] ^ w2_t[3] ^ w1_t[1] ^ w0_t[3]), 1u); SHA1_STEP (SHA1_F0o, b, c, d, e, a, w0_t[3]); + + #undef K + #define K SHA1C01 + + w1_t[0] = rotl32 ((w0_t[1] ^ w3_t[0] ^ w1_t[2] ^ w1_t[0]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w1_t[0]); + w1_t[1] = rotl32 ((w0_t[2] ^ w3_t[1] ^ w1_t[3] ^ w1_t[1]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w1_t[1]); + w1_t[2] = rotl32 ((w0_t[3] ^ w3_t[2] ^ w2_t[0] ^ w1_t[2]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w1_t[2]); + w1_t[3] = rotl32 ((w1_t[0] ^ w3_t[3] ^ w2_t[1] ^ w1_t[3]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1_t[3]); + w2_t[0] = rotl32 ((w1_t[1] ^ w0_t[0] ^ w2_t[2] ^ w2_t[0]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w2_t[0]); + w2_t[1] = rotl32 ((w1_t[2] ^ w0_t[1] ^ w2_t[3] ^ w2_t[1]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w2_t[1]); + w2_t[2] = rotl32 ((w1_t[3] ^ w0_t[2] ^ w3_t[0] ^ w2_t[2]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w2_t[2]); + w2_t[3] = rotl32 ((w2_t[0] ^ w0_t[3] ^ w3_t[1] ^ w2_t[3]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w2_t[3]); + w3_t[0] = rotl32 ((w2_t[1] ^ w1_t[0] ^ w3_t[2] ^ w3_t[0]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w3_t[0]); + w3_t[1] = rotl32 ((w2_t[2] ^ w1_t[1] ^ w3_t[3] ^ w3_t[1]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w3_t[1]); + w3_t[2] = rotl32 ((w2_t[3] ^ w1_t[2] ^ w0_t[0] ^ w3_t[2]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w3_t[2]); + w3_t[3] = rotl32 ((w3_t[0] ^ w1_t[3] ^ w0_t[1] ^ w3_t[3]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w3_t[3]); + w0_t[0] = rotl32 ((w3_t[1] ^ w2_t[0] ^ w0_t[2] ^ w0_t[0]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w0_t[0]); + w0_t[1] = rotl32 ((w3_t[2] ^ w2_t[1] ^ w0_t[3] ^ w0_t[1]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w0_t[1]); + w0_t[2] = rotl32 ((w3_t[3] ^ w2_t[2] ^ w1_t[0] ^ w0_t[2]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w0_t[2]); + w0_t[3] = rotl32 ((w0_t[0] ^ w2_t[3] ^ w1_t[1] ^ w0_t[3]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w0_t[3]); + w1_t[0] = rotl32 ((w0_t[1] ^ w3_t[0] ^ w1_t[2] ^ w1_t[0]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w1_t[0]); + w1_t[1] = rotl32 ((w0_t[2] ^ w3_t[1] ^ w1_t[3] ^ w1_t[1]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w1_t[1]); + w1_t[2] = rotl32 ((w0_t[3] ^ w3_t[2] ^ w2_t[0] ^ w1_t[2]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1_t[2]); + w1_t[3] = rotl32 ((w1_t[0] ^ w3_t[3] ^ w2_t[1] ^ w1_t[3]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w1_t[3]); + + #undef K + #define K SHA1C02 + + w2_t[0] = rotl32 ((w1_t[1] ^ w0_t[0] ^ w2_t[2] ^ w2_t[0]), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w2_t[0]); + w2_t[1] = rotl32 ((w1_t[2] ^ w0_t[1] ^ w2_t[3] ^ w2_t[1]), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w2_t[1]); + w2_t[2] = rotl32 ((w1_t[3] ^ w0_t[2] ^ w3_t[0] ^ w2_t[2]), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w2_t[2]); + w2_t[3] = rotl32 ((w2_t[0] ^ w0_t[3] ^ w3_t[1] ^ w2_t[3]), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w2_t[3]); + w3_t[0] = rotl32 ((w2_t[1] ^ w1_t[0] ^ w3_t[2] ^ w3_t[0]), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w3_t[0]); + w3_t[1] = rotl32 ((w2_t[2] ^ w1_t[1] ^ w3_t[3] ^ w3_t[1]), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w3_t[1]); + w3_t[2] = rotl32 ((w2_t[3] ^ w1_t[2] ^ w0_t[0] ^ w3_t[2]), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w3_t[2]); + w3_t[3] = rotl32 ((w3_t[0] ^ w1_t[3] ^ w0_t[1] ^ w3_t[3]), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w3_t[3]); + w0_t[0] = rotl32 ((w3_t[1] ^ w2_t[0] ^ w0_t[2] ^ w0_t[0]), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w0_t[0]); + w0_t[1] = rotl32 ((w3_t[2] ^ w2_t[1] ^ w0_t[3] ^ w0_t[1]), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w0_t[1]); + w0_t[2] = rotl32 ((w3_t[3] ^ w2_t[2] ^ w1_t[0] ^ w0_t[2]), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w0_t[2]); + w0_t[3] = rotl32 ((w0_t[0] ^ w2_t[3] ^ w1_t[1] ^ w0_t[3]), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w0_t[3]); + w1_t[0] = rotl32 ((w0_t[1] ^ w3_t[0] ^ w1_t[2] ^ w1_t[0]), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w1_t[0]); + w1_t[1] = rotl32 ((w0_t[2] ^ w3_t[1] ^ w1_t[3] ^ w1_t[1]), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w1_t[1]); + w1_t[2] = rotl32 ((w0_t[3] ^ w3_t[2] ^ w2_t[0] ^ w1_t[2]), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w1_t[2]); + w1_t[3] = rotl32 ((w1_t[0] ^ w3_t[3] ^ w2_t[1] ^ w1_t[3]), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w1_t[3]); + w2_t[0] = rotl32 ((w1_t[1] ^ w0_t[0] ^ w2_t[2] ^ w2_t[0]), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w2_t[0]); + w2_t[1] = rotl32 ((w1_t[2] ^ w0_t[1] ^ w2_t[3] ^ w2_t[1]), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w2_t[1]); + w2_t[2] = rotl32 ((w1_t[3] ^ w0_t[2] ^ w3_t[0] ^ w2_t[2]), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w2_t[2]); + w2_t[3] = rotl32 ((w2_t[0] ^ w0_t[3] ^ w3_t[1] ^ w2_t[3]), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w2_t[3]); + + #undef K + #define K SHA1C03 + + w3_t[0] = rotl32 ((w2_t[1] ^ w1_t[0] ^ w3_t[2] ^ w3_t[0]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w3_t[0]); + w3_t[1] = rotl32 ((w2_t[2] ^ w1_t[1] ^ w3_t[3] ^ w3_t[1]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w3_t[1]); + w3_t[2] = rotl32 ((w2_t[3] ^ w1_t[2] ^ w0_t[0] ^ w3_t[2]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w3_t[2]); + w3_t[3] = rotl32 ((w3_t[0] ^ w1_t[3] ^ w0_t[1] ^ w3_t[3]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w3_t[3]); + w0_t[0] = rotl32 ((w3_t[1] ^ w2_t[0] ^ w0_t[2] ^ w0_t[0]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w0_t[0]); + w0_t[1] = rotl32 ((w3_t[2] ^ w2_t[1] ^ w0_t[3] ^ w0_t[1]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w0_t[1]); + w0_t[2] = rotl32 ((w3_t[3] ^ w2_t[2] ^ w1_t[0] ^ w0_t[2]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w0_t[2]); + w0_t[3] = rotl32 ((w0_t[0] ^ w2_t[3] ^ w1_t[1] ^ w0_t[3]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w0_t[3]); + w1_t[0] = rotl32 ((w0_t[1] ^ w3_t[0] ^ w1_t[2] ^ w1_t[0]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1_t[0]); + w1_t[1] = rotl32 ((w0_t[2] ^ w3_t[1] ^ w1_t[3] ^ w1_t[1]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w1_t[1]); + w1_t[2] = rotl32 ((w0_t[3] ^ w3_t[2] ^ w2_t[0] ^ w1_t[2]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w1_t[2]); + w1_t[3] = rotl32 ((w1_t[0] ^ w3_t[3] ^ w2_t[1] ^ w1_t[3]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w1_t[3]); + w2_t[0] = rotl32 ((w1_t[1] ^ w0_t[0] ^ w2_t[2] ^ w2_t[0]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w2_t[0]); + w2_t[1] = rotl32 ((w1_t[2] ^ w0_t[1] ^ w2_t[3] ^ w2_t[1]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w2_t[1]); + w2_t[2] = rotl32 ((w1_t[3] ^ w0_t[2] ^ w3_t[0] ^ w2_t[2]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w2_t[2]); + w2_t[3] = rotl32 ((w2_t[0] ^ w0_t[3] ^ w3_t[1] ^ w2_t[3]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w2_t[3]); + w3_t[0] = rotl32 ((w2_t[1] ^ w1_t[0] ^ w3_t[2] ^ w3_t[0]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w3_t[0]); + w3_t[1] = rotl32 ((w2_t[2] ^ w1_t[1] ^ w3_t[3] ^ w3_t[1]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w3_t[1]); + w3_t[2] = rotl32 ((w2_t[3] ^ w1_t[2] ^ w0_t[0] ^ w3_t[2]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w3_t[2]); + w3_t[3] = rotl32 ((w3_t[0] ^ w1_t[3] ^ w0_t[1] ^ w3_t[3]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w3_t[3]); + + const u32x r0 = d; + const u32x r1 = e; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_M + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m08100_m08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m08100_m16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m08100_s04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + u32x pw_buf1[4]; + + pw_buf1[0] = pws[gid].i[ 4]; + pw_buf1[1] = pws[gid].i[ 5]; + pw_buf1[2] = pws[gid].i[ 6]; + pw_buf1[3] = pws[gid].i[ 7]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * salt + */ + + u32 salt_buf0[2]; + + salt_buf0[0] = swap_workaround (salt_bufs[salt_pos].salt_buf[0]); + salt_buf0[1] = swap_workaround (salt_bufs[salt_pos].salt_buf[1]); + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * reverse + */ + + const u32 e_rev = rotl32 (search[1], 2u); + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + u32x w1[4]; + u32x w2[4]; + u32x w3[4]; + + w0[0] = pw_buf0[0]; + w0[1] = pw_buf0[1]; + w0[2] = pw_buf0[2]; + w0[3] = pw_buf0[3]; + w1[0] = pw_buf1[0]; + w1[1] = pw_buf1[1]; + w1[2] = pw_buf1[2]; + w1[3] = pw_buf1[3]; + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 out_len = apply_rules (rules_buf[il_pos].cmds, w0, w1, pw_len); + + /** + * prepend salt + */ + + const u32 out_salt_len = out_len + salt_len; + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + w0_t[0] = salt_buf0[0]; + w0_t[1] = salt_buf0[1]; + w0_t[2] = w0[0]; + w0_t[3] = w0[1]; + w1_t[0] = w0[2]; + w1_t[1] = w0[3]; + w1_t[2] = w1[0]; + w1_t[3] = w1[1]; + w2_t[0] = w1[2]; + w2_t[1] = w1[3]; + w2_t[2] = w2[0]; + w2_t[3] = w2[1]; + w3_t[0] = w2[2]; + w3_t[1] = w2[3]; + w3_t[2] = 0; + w3_t[3] = (out_salt_len + 1) * 8; + + append_0x80_4 (w0_t, w1_t, w2_t, w3_t, out_salt_len + 1); + + /** + * sha1 + */ + + w0_t[0] = swap_workaround (w0_t[0]); + w0_t[1] = swap_workaround (w0_t[1]); + w0_t[2] = swap_workaround (w0_t[2]); + w0_t[3] = swap_workaround (w0_t[3]); + w1_t[0] = swap_workaround (w1_t[0]); + w1_t[1] = swap_workaround (w1_t[1]); + w1_t[2] = swap_workaround (w1_t[2]); + w1_t[3] = swap_workaround (w1_t[3]); + w2_t[0] = swap_workaround (w2_t[0]); + w2_t[1] = swap_workaround (w2_t[1]); + w2_t[2] = swap_workaround (w2_t[2]); + w2_t[3] = swap_workaround (w2_t[3]); + w3_t[0] = swap_workaround (w3_t[0]); + w3_t[1] = swap_workaround (w3_t[1]); + //w3_t[2] = swap_workaround (w3_t[2]); + //w3_t[3] = swap_workaround (w3_t[3]); + + u32x a = SHA1M_A; + u32x b = SHA1M_B; + u32x c = SHA1M_C; + u32x d = SHA1M_D; + u32x e = SHA1M_E; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w0_t[0]); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w0_t[1]); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w0_t[2]); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w0_t[3]); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w1_t[0]); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w1_t[1]); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w1_t[2]); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w1_t[3]); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w2_t[0]); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w2_t[1]); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w2_t[2]); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w2_t[3]); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w3_t[0]); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w3_t[1]); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w3_t[2]); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w3_t[3]); + w0_t[0] = rotl32 ((w3_t[1] ^ w2_t[0] ^ w0_t[2] ^ w0_t[0]), 1u); SHA1_STEP (SHA1_F0o, e, a, b, c, d, w0_t[0]); + w0_t[1] = rotl32 ((w3_t[2] ^ w2_t[1] ^ w0_t[3] ^ w0_t[1]), 1u); SHA1_STEP (SHA1_F0o, d, e, a, b, c, w0_t[1]); + w0_t[2] = rotl32 ((w3_t[3] ^ w2_t[2] ^ w1_t[0] ^ w0_t[2]), 1u); SHA1_STEP (SHA1_F0o, c, d, e, a, b, w0_t[2]); + w0_t[3] = rotl32 ((w0_t[0] ^ w2_t[3] ^ w1_t[1] ^ w0_t[3]), 1u); SHA1_STEP (SHA1_F0o, b, c, d, e, a, w0_t[3]); + + #undef K + #define K SHA1C01 + + w1_t[0] = rotl32 ((w0_t[1] ^ w3_t[0] ^ w1_t[2] ^ w1_t[0]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w1_t[0]); + w1_t[1] = rotl32 ((w0_t[2] ^ w3_t[1] ^ w1_t[3] ^ w1_t[1]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w1_t[1]); + w1_t[2] = rotl32 ((w0_t[3] ^ w3_t[2] ^ w2_t[0] ^ w1_t[2]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w1_t[2]); + w1_t[3] = rotl32 ((w1_t[0] ^ w3_t[3] ^ w2_t[1] ^ w1_t[3]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1_t[3]); + w2_t[0] = rotl32 ((w1_t[1] ^ w0_t[0] ^ w2_t[2] ^ w2_t[0]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w2_t[0]); + w2_t[1] = rotl32 ((w1_t[2] ^ w0_t[1] ^ w2_t[3] ^ w2_t[1]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w2_t[1]); + w2_t[2] = rotl32 ((w1_t[3] ^ w0_t[2] ^ w3_t[0] ^ w2_t[2]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w2_t[2]); + w2_t[3] = rotl32 ((w2_t[0] ^ w0_t[3] ^ w3_t[1] ^ w2_t[3]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w2_t[3]); + w3_t[0] = rotl32 ((w2_t[1] ^ w1_t[0] ^ w3_t[2] ^ w3_t[0]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w3_t[0]); + w3_t[1] = rotl32 ((w2_t[2] ^ w1_t[1] ^ w3_t[3] ^ w3_t[1]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w3_t[1]); + w3_t[2] = rotl32 ((w2_t[3] ^ w1_t[2] ^ w0_t[0] ^ w3_t[2]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w3_t[2]); + w3_t[3] = rotl32 ((w3_t[0] ^ w1_t[3] ^ w0_t[1] ^ w3_t[3]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w3_t[3]); + w0_t[0] = rotl32 ((w3_t[1] ^ w2_t[0] ^ w0_t[2] ^ w0_t[0]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w0_t[0]); + w0_t[1] = rotl32 ((w3_t[2] ^ w2_t[1] ^ w0_t[3] ^ w0_t[1]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w0_t[1]); + w0_t[2] = rotl32 ((w3_t[3] ^ w2_t[2] ^ w1_t[0] ^ w0_t[2]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w0_t[2]); + w0_t[3] = rotl32 ((w0_t[0] ^ w2_t[3] ^ w1_t[1] ^ w0_t[3]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w0_t[3]); + w1_t[0] = rotl32 ((w0_t[1] ^ w3_t[0] ^ w1_t[2] ^ w1_t[0]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w1_t[0]); + w1_t[1] = rotl32 ((w0_t[2] ^ w3_t[1] ^ w1_t[3] ^ w1_t[1]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w1_t[1]); + w1_t[2] = rotl32 ((w0_t[3] ^ w3_t[2] ^ w2_t[0] ^ w1_t[2]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1_t[2]); + w1_t[3] = rotl32 ((w1_t[0] ^ w3_t[3] ^ w2_t[1] ^ w1_t[3]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w1_t[3]); + + #undef K + #define K SHA1C02 + + w2_t[0] = rotl32 ((w1_t[1] ^ w0_t[0] ^ w2_t[2] ^ w2_t[0]), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w2_t[0]); + w2_t[1] = rotl32 ((w1_t[2] ^ w0_t[1] ^ w2_t[3] ^ w2_t[1]), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w2_t[1]); + w2_t[2] = rotl32 ((w1_t[3] ^ w0_t[2] ^ w3_t[0] ^ w2_t[2]), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w2_t[2]); + w2_t[3] = rotl32 ((w2_t[0] ^ w0_t[3] ^ w3_t[1] ^ w2_t[3]), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w2_t[3]); + w3_t[0] = rotl32 ((w2_t[1] ^ w1_t[0] ^ w3_t[2] ^ w3_t[0]), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w3_t[0]); + w3_t[1] = rotl32 ((w2_t[2] ^ w1_t[1] ^ w3_t[3] ^ w3_t[1]), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w3_t[1]); + w3_t[2] = rotl32 ((w2_t[3] ^ w1_t[2] ^ w0_t[0] ^ w3_t[2]), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w3_t[2]); + w3_t[3] = rotl32 ((w3_t[0] ^ w1_t[3] ^ w0_t[1] ^ w3_t[3]), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w3_t[3]); + w0_t[0] = rotl32 ((w3_t[1] ^ w2_t[0] ^ w0_t[2] ^ w0_t[0]), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w0_t[0]); + w0_t[1] = rotl32 ((w3_t[2] ^ w2_t[1] ^ w0_t[3] ^ w0_t[1]), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w0_t[1]); + w0_t[2] = rotl32 ((w3_t[3] ^ w2_t[2] ^ w1_t[0] ^ w0_t[2]), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w0_t[2]); + w0_t[3] = rotl32 ((w0_t[0] ^ w2_t[3] ^ w1_t[1] ^ w0_t[3]), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w0_t[3]); + w1_t[0] = rotl32 ((w0_t[1] ^ w3_t[0] ^ w1_t[2] ^ w1_t[0]), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w1_t[0]); + w1_t[1] = rotl32 ((w0_t[2] ^ w3_t[1] ^ w1_t[3] ^ w1_t[1]), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w1_t[1]); + w1_t[2] = rotl32 ((w0_t[3] ^ w3_t[2] ^ w2_t[0] ^ w1_t[2]), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w1_t[2]); + w1_t[3] = rotl32 ((w1_t[0] ^ w3_t[3] ^ w2_t[1] ^ w1_t[3]), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w1_t[3]); + w2_t[0] = rotl32 ((w1_t[1] ^ w0_t[0] ^ w2_t[2] ^ w2_t[0]), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w2_t[0]); + w2_t[1] = rotl32 ((w1_t[2] ^ w0_t[1] ^ w2_t[3] ^ w2_t[1]), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w2_t[1]); + w2_t[2] = rotl32 ((w1_t[3] ^ w0_t[2] ^ w3_t[0] ^ w2_t[2]), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w2_t[2]); + w2_t[3] = rotl32 ((w2_t[0] ^ w0_t[3] ^ w3_t[1] ^ w2_t[3]), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w2_t[3]); + + #undef K + #define K SHA1C03 + + w3_t[0] = rotl32 ((w2_t[1] ^ w1_t[0] ^ w3_t[2] ^ w3_t[0]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w3_t[0]); + w3_t[1] = rotl32 ((w2_t[2] ^ w1_t[1] ^ w3_t[3] ^ w3_t[1]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w3_t[1]); + w3_t[2] = rotl32 ((w2_t[3] ^ w1_t[2] ^ w0_t[0] ^ w3_t[2]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w3_t[2]); + w3_t[3] = rotl32 ((w3_t[0] ^ w1_t[3] ^ w0_t[1] ^ w3_t[3]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w3_t[3]); + w0_t[0] = rotl32 ((w3_t[1] ^ w2_t[0] ^ w0_t[2] ^ w0_t[0]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w0_t[0]); + w0_t[1] = rotl32 ((w3_t[2] ^ w2_t[1] ^ w0_t[3] ^ w0_t[1]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w0_t[1]); + w0_t[2] = rotl32 ((w3_t[3] ^ w2_t[2] ^ w1_t[0] ^ w0_t[2]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w0_t[2]); + w0_t[3] = rotl32 ((w0_t[0] ^ w2_t[3] ^ w1_t[1] ^ w0_t[3]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w0_t[3]); + w1_t[0] = rotl32 ((w0_t[1] ^ w3_t[0] ^ w1_t[2] ^ w1_t[0]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1_t[0]); + w1_t[1] = rotl32 ((w0_t[2] ^ w3_t[1] ^ w1_t[3] ^ w1_t[1]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w1_t[1]); + w1_t[2] = rotl32 ((w0_t[3] ^ w3_t[2] ^ w2_t[0] ^ w1_t[2]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w1_t[2]); + w1_t[3] = rotl32 ((w1_t[0] ^ w3_t[3] ^ w2_t[1] ^ w1_t[3]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w1_t[3]); + w2_t[0] = rotl32 ((w1_t[1] ^ w0_t[0] ^ w2_t[2] ^ w2_t[0]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w2_t[0]); + w2_t[1] = rotl32 ((w1_t[2] ^ w0_t[1] ^ w2_t[3] ^ w2_t[1]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w2_t[1]); + w2_t[2] = rotl32 ((w1_t[3] ^ w0_t[2] ^ w3_t[0] ^ w2_t[2]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w2_t[2]); + w2_t[3] = rotl32 ((w2_t[0] ^ w0_t[3] ^ w3_t[1] ^ w2_t[3]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w2_t[3]); + w3_t[0] = rotl32 ((w2_t[1] ^ w1_t[0] ^ w3_t[2] ^ w3_t[0]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w3_t[0]); + + if (allx (e != e_rev)) continue; + + w3_t[1] = rotl32 ((w2_t[2] ^ w1_t[1] ^ w3_t[3] ^ w3_t[1]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w3_t[1]); + w3_t[2] = rotl32 ((w2_t[3] ^ w1_t[2] ^ w0_t[0] ^ w3_t[2]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w3_t[2]); + w3_t[3] = rotl32 ((w3_t[0] ^ w1_t[3] ^ w0_t[1] ^ w3_t[3]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w3_t[3]); + + const u32x r0 = d; + const u32x r1 = e; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_S + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m08100_s08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m08100_s16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/amd/m08100_a1.cl b/amd/m08100_a1.cl new file mode 100644 index 0000000000..cfb1622399 --- /dev/null +++ b/amd/m08100_a1.cl @@ -0,0 +1,643 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _SHA1_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW4 +#define VECT_SIZE4 +#endif + +#ifdef VLIW5 +#define VECT_SIZE4 +#endif + +#define DGST_R0 3 +#define DGST_R1 4 +#define DGST_R2 2 +#define DGST_R3 1 + +#include "include/kernel_functions.c" +#include "types_amd.c" +#include "common_amd.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m08100_m04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, combs_buf[0].pw_len); + } + + /** + * salt + */ + + u32 salt_buf0[2]; + + salt_buf0[0] = swap_workaround (salt_bufs[salt_pos].salt_buf[0]); + salt_buf0[1] = swap_workaround (salt_bufs[salt_pos].salt_buf[1]); + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = combs_buf[il_pos].pw_len; + + const u32 pw_len = pw_l_len + pw_r_len; + + u32 wordr0[4]; + u32 wordr1[4]; + u32 wordr2[4]; + u32 wordr3[4]; + + wordr0[0] = combs_buf[il_pos].i[0]; + wordr0[1] = combs_buf[il_pos].i[1]; + wordr0[2] = combs_buf[il_pos].i[2]; + wordr0[3] = combs_buf[il_pos].i[3]; + wordr1[0] = combs_buf[il_pos].i[4]; + wordr1[1] = combs_buf[il_pos].i[5]; + wordr1[2] = combs_buf[il_pos].i[6]; + wordr1[3] = combs_buf[il_pos].i[7]; + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + u32x w0[4]; + u32x w1[4]; + u32x w2[4]; + u32x w3[4]; + + w0[0] = wordl0[0] | wordr0[0]; + w0[1] = wordl0[1] | wordr0[1]; + w0[2] = wordl0[2] | wordr0[2]; + w0[3] = wordl0[3] | wordr0[3]; + w1[0] = wordl1[0] | wordr1[0]; + w1[1] = wordl1[1] | wordr1[1]; + w1[2] = wordl1[2] | wordr1[2]; + w1[3] = wordl1[3] | wordr1[3]; + w2[0] = wordl2[0] | wordr2[0]; + w2[1] = wordl2[1] | wordr2[1]; + w2[2] = wordl2[2] | wordr2[2]; + w2[3] = wordl2[3] | wordr2[3]; + w3[0] = wordl3[0] | wordr3[0]; + w3[1] = wordl3[1] | wordr3[1]; + w3[2] = wordl3[2] | wordr3[2]; + w3[3] = wordl3[3] | wordr3[3]; + + /** + * prepend salt + */ + + const u32 pw_salt_len = pw_len + salt_len; + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + w0_t[0] = salt_buf0[0]; + w0_t[1] = salt_buf0[1]; + w0_t[2] = w0[0]; + w0_t[3] = w0[1]; + w1_t[0] = w0[2]; + w1_t[1] = w0[3]; + w1_t[2] = w1[0]; + w1_t[3] = w1[1]; + w2_t[0] = w1[2]; + w2_t[1] = w1[3]; + w2_t[2] = w2[0]; + w2_t[3] = w2[1]; + w3_t[0] = w2[2]; + w3_t[1] = w2[3]; + w3_t[2] = 0; + w3_t[3] = (pw_salt_len + 1) * 8; + + append_0x80_4 (w0_t, w1_t, w2_t, w3_t, pw_salt_len + 1); + + /** + * sha1 + */ + + w0_t[0] = swap_workaround (w0_t[0]); + w0_t[1] = swap_workaround (w0_t[1]); + w0_t[2] = swap_workaround (w0_t[2]); + w0_t[3] = swap_workaround (w0_t[3]); + w1_t[0] = swap_workaround (w1_t[0]); + w1_t[1] = swap_workaround (w1_t[1]); + w1_t[2] = swap_workaround (w1_t[2]); + w1_t[3] = swap_workaround (w1_t[3]); + w2_t[0] = swap_workaround (w2_t[0]); + w2_t[1] = swap_workaround (w2_t[1]); + w2_t[2] = swap_workaround (w2_t[2]); + w2_t[3] = swap_workaround (w2_t[3]); + w3_t[0] = swap_workaround (w3_t[0]); + w3_t[1] = swap_workaround (w3_t[1]); + //w3_t[2] = swap_workaround (w3_t[2]); + //w3_t[3] = swap_workaround (w3_t[3]); + + u32x a = SHA1M_A; + u32x b = SHA1M_B; + u32x c = SHA1M_C; + u32x d = SHA1M_D; + u32x e = SHA1M_E; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w0_t[0]); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w0_t[1]); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w0_t[2]); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w0_t[3]); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w1_t[0]); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w1_t[1]); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w1_t[2]); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w1_t[3]); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w2_t[0]); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w2_t[1]); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w2_t[2]); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w2_t[3]); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w3_t[0]); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w3_t[1]); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w3_t[2]); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w3_t[3]); + w0_t[0] = rotl32 ((w3_t[1] ^ w2_t[0] ^ w0_t[2] ^ w0_t[0]), 1u); SHA1_STEP (SHA1_F0o, e, a, b, c, d, w0_t[0]); + w0_t[1] = rotl32 ((w3_t[2] ^ w2_t[1] ^ w0_t[3] ^ w0_t[1]), 1u); SHA1_STEP (SHA1_F0o, d, e, a, b, c, w0_t[1]); + w0_t[2] = rotl32 ((w3_t[3] ^ w2_t[2] ^ w1_t[0] ^ w0_t[2]), 1u); SHA1_STEP (SHA1_F0o, c, d, e, a, b, w0_t[2]); + w0_t[3] = rotl32 ((w0_t[0] ^ w2_t[3] ^ w1_t[1] ^ w0_t[3]), 1u); SHA1_STEP (SHA1_F0o, b, c, d, e, a, w0_t[3]); + + #undef K + #define K SHA1C01 + + w1_t[0] = rotl32 ((w0_t[1] ^ w3_t[0] ^ w1_t[2] ^ w1_t[0]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w1_t[0]); + w1_t[1] = rotl32 ((w0_t[2] ^ w3_t[1] ^ w1_t[3] ^ w1_t[1]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w1_t[1]); + w1_t[2] = rotl32 ((w0_t[3] ^ w3_t[2] ^ w2_t[0] ^ w1_t[2]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w1_t[2]); + w1_t[3] = rotl32 ((w1_t[0] ^ w3_t[3] ^ w2_t[1] ^ w1_t[3]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1_t[3]); + w2_t[0] = rotl32 ((w1_t[1] ^ w0_t[0] ^ w2_t[2] ^ w2_t[0]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w2_t[0]); + w2_t[1] = rotl32 ((w1_t[2] ^ w0_t[1] ^ w2_t[3] ^ w2_t[1]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w2_t[1]); + w2_t[2] = rotl32 ((w1_t[3] ^ w0_t[2] ^ w3_t[0] ^ w2_t[2]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w2_t[2]); + w2_t[3] = rotl32 ((w2_t[0] ^ w0_t[3] ^ w3_t[1] ^ w2_t[3]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w2_t[3]); + w3_t[0] = rotl32 ((w2_t[1] ^ w1_t[0] ^ w3_t[2] ^ w3_t[0]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w3_t[0]); + w3_t[1] = rotl32 ((w2_t[2] ^ w1_t[1] ^ w3_t[3] ^ w3_t[1]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w3_t[1]); + w3_t[2] = rotl32 ((w2_t[3] ^ w1_t[2] ^ w0_t[0] ^ w3_t[2]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w3_t[2]); + w3_t[3] = rotl32 ((w3_t[0] ^ w1_t[3] ^ w0_t[1] ^ w3_t[3]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w3_t[3]); + w0_t[0] = rotl32 ((w3_t[1] ^ w2_t[0] ^ w0_t[2] ^ w0_t[0]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w0_t[0]); + w0_t[1] = rotl32 ((w3_t[2] ^ w2_t[1] ^ w0_t[3] ^ w0_t[1]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w0_t[1]); + w0_t[2] = rotl32 ((w3_t[3] ^ w2_t[2] ^ w1_t[0] ^ w0_t[2]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w0_t[2]); + w0_t[3] = rotl32 ((w0_t[0] ^ w2_t[3] ^ w1_t[1] ^ w0_t[3]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w0_t[3]); + w1_t[0] = rotl32 ((w0_t[1] ^ w3_t[0] ^ w1_t[2] ^ w1_t[0]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w1_t[0]); + w1_t[1] = rotl32 ((w0_t[2] ^ w3_t[1] ^ w1_t[3] ^ w1_t[1]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w1_t[1]); + w1_t[2] = rotl32 ((w0_t[3] ^ w3_t[2] ^ w2_t[0] ^ w1_t[2]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1_t[2]); + w1_t[3] = rotl32 ((w1_t[0] ^ w3_t[3] ^ w2_t[1] ^ w1_t[3]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w1_t[3]); + + #undef K + #define K SHA1C02 + + w2_t[0] = rotl32 ((w1_t[1] ^ w0_t[0] ^ w2_t[2] ^ w2_t[0]), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w2_t[0]); + w2_t[1] = rotl32 ((w1_t[2] ^ w0_t[1] ^ w2_t[3] ^ w2_t[1]), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w2_t[1]); + w2_t[2] = rotl32 ((w1_t[3] ^ w0_t[2] ^ w3_t[0] ^ w2_t[2]), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w2_t[2]); + w2_t[3] = rotl32 ((w2_t[0] ^ w0_t[3] ^ w3_t[1] ^ w2_t[3]), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w2_t[3]); + w3_t[0] = rotl32 ((w2_t[1] ^ w1_t[0] ^ w3_t[2] ^ w3_t[0]), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w3_t[0]); + w3_t[1] = rotl32 ((w2_t[2] ^ w1_t[1] ^ w3_t[3] ^ w3_t[1]), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w3_t[1]); + w3_t[2] = rotl32 ((w2_t[3] ^ w1_t[2] ^ w0_t[0] ^ w3_t[2]), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w3_t[2]); + w3_t[3] = rotl32 ((w3_t[0] ^ w1_t[3] ^ w0_t[1] ^ w3_t[3]), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w3_t[3]); + w0_t[0] = rotl32 ((w3_t[1] ^ w2_t[0] ^ w0_t[2] ^ w0_t[0]), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w0_t[0]); + w0_t[1] = rotl32 ((w3_t[2] ^ w2_t[1] ^ w0_t[3] ^ w0_t[1]), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w0_t[1]); + w0_t[2] = rotl32 ((w3_t[3] ^ w2_t[2] ^ w1_t[0] ^ w0_t[2]), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w0_t[2]); + w0_t[3] = rotl32 ((w0_t[0] ^ w2_t[3] ^ w1_t[1] ^ w0_t[3]), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w0_t[3]); + w1_t[0] = rotl32 ((w0_t[1] ^ w3_t[0] ^ w1_t[2] ^ w1_t[0]), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w1_t[0]); + w1_t[1] = rotl32 ((w0_t[2] ^ w3_t[1] ^ w1_t[3] ^ w1_t[1]), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w1_t[1]); + w1_t[2] = rotl32 ((w0_t[3] ^ w3_t[2] ^ w2_t[0] ^ w1_t[2]), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w1_t[2]); + w1_t[3] = rotl32 ((w1_t[0] ^ w3_t[3] ^ w2_t[1] ^ w1_t[3]), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w1_t[3]); + w2_t[0] = rotl32 ((w1_t[1] ^ w0_t[0] ^ w2_t[2] ^ w2_t[0]), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w2_t[0]); + w2_t[1] = rotl32 ((w1_t[2] ^ w0_t[1] ^ w2_t[3] ^ w2_t[1]), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w2_t[1]); + w2_t[2] = rotl32 ((w1_t[3] ^ w0_t[2] ^ w3_t[0] ^ w2_t[2]), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w2_t[2]); + w2_t[3] = rotl32 ((w2_t[0] ^ w0_t[3] ^ w3_t[1] ^ w2_t[3]), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w2_t[3]); + + #undef K + #define K SHA1C03 + + w3_t[0] = rotl32 ((w2_t[1] ^ w1_t[0] ^ w3_t[2] ^ w3_t[0]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w3_t[0]); + w3_t[1] = rotl32 ((w2_t[2] ^ w1_t[1] ^ w3_t[3] ^ w3_t[1]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w3_t[1]); + w3_t[2] = rotl32 ((w2_t[3] ^ w1_t[2] ^ w0_t[0] ^ w3_t[2]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w3_t[2]); + w3_t[3] = rotl32 ((w3_t[0] ^ w1_t[3] ^ w0_t[1] ^ w3_t[3]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w3_t[3]); + w0_t[0] = rotl32 ((w3_t[1] ^ w2_t[0] ^ w0_t[2] ^ w0_t[0]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w0_t[0]); + w0_t[1] = rotl32 ((w3_t[2] ^ w2_t[1] ^ w0_t[3] ^ w0_t[1]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w0_t[1]); + w0_t[2] = rotl32 ((w3_t[3] ^ w2_t[2] ^ w1_t[0] ^ w0_t[2]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w0_t[2]); + w0_t[3] = rotl32 ((w0_t[0] ^ w2_t[3] ^ w1_t[1] ^ w0_t[3]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w0_t[3]); + w1_t[0] = rotl32 ((w0_t[1] ^ w3_t[0] ^ w1_t[2] ^ w1_t[0]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1_t[0]); + w1_t[1] = rotl32 ((w0_t[2] ^ w3_t[1] ^ w1_t[3] ^ w1_t[1]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w1_t[1]); + w1_t[2] = rotl32 ((w0_t[3] ^ w3_t[2] ^ w2_t[0] ^ w1_t[2]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w1_t[2]); + w1_t[3] = rotl32 ((w1_t[0] ^ w3_t[3] ^ w2_t[1] ^ w1_t[3]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w1_t[3]); + w2_t[0] = rotl32 ((w1_t[1] ^ w0_t[0] ^ w2_t[2] ^ w2_t[0]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w2_t[0]); + w2_t[1] = rotl32 ((w1_t[2] ^ w0_t[1] ^ w2_t[3] ^ w2_t[1]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w2_t[1]); + w2_t[2] = rotl32 ((w1_t[3] ^ w0_t[2] ^ w3_t[0] ^ w2_t[2]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w2_t[2]); + w2_t[3] = rotl32 ((w2_t[0] ^ w0_t[3] ^ w3_t[1] ^ w2_t[3]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w2_t[3]); + w3_t[0] = rotl32 ((w2_t[1] ^ w1_t[0] ^ w3_t[2] ^ w3_t[0]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w3_t[0]); + w3_t[1] = rotl32 ((w2_t[2] ^ w1_t[1] ^ w3_t[3] ^ w3_t[1]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w3_t[1]); + w3_t[2] = rotl32 ((w2_t[3] ^ w1_t[2] ^ w0_t[0] ^ w3_t[2]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w3_t[2]); + w3_t[3] = rotl32 ((w3_t[0] ^ w1_t[3] ^ w0_t[1] ^ w3_t[3]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w3_t[3]); + + const u32x r0 = d; + const u32x r1 = e; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_M + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m08100_m08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m08100_m16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m08100_s04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, combs_buf[0].pw_len); + } + + /** + * salt + */ + + u32 salt_buf0[2]; + + salt_buf0[0] = swap_workaround (salt_bufs[salt_pos].salt_buf[0]); + salt_buf0[1] = swap_workaround (salt_bufs[salt_pos].salt_buf[1]); + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * reverse + */ + + const u32 e_rev = rotl32 (search[1], 2u); + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = combs_buf[il_pos].pw_len; + + const u32 pw_len = pw_l_len + pw_r_len; + + u32 wordr0[4]; + u32 wordr1[4]; + u32 wordr2[4]; + u32 wordr3[4]; + + wordr0[0] = combs_buf[il_pos].i[0]; + wordr0[1] = combs_buf[il_pos].i[1]; + wordr0[2] = combs_buf[il_pos].i[2]; + wordr0[3] = combs_buf[il_pos].i[3]; + wordr1[0] = combs_buf[il_pos].i[4]; + wordr1[1] = combs_buf[il_pos].i[5]; + wordr1[2] = combs_buf[il_pos].i[6]; + wordr1[3] = combs_buf[il_pos].i[7]; + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + u32x w0[4]; + u32x w1[4]; + u32x w2[4]; + u32x w3[4]; + + w0[0] = wordl0[0] | wordr0[0]; + w0[1] = wordl0[1] | wordr0[1]; + w0[2] = wordl0[2] | wordr0[2]; + w0[3] = wordl0[3] | wordr0[3]; + w1[0] = wordl1[0] | wordr1[0]; + w1[1] = wordl1[1] | wordr1[1]; + w1[2] = wordl1[2] | wordr1[2]; + w1[3] = wordl1[3] | wordr1[3]; + w2[0] = wordl2[0] | wordr2[0]; + w2[1] = wordl2[1] | wordr2[1]; + w2[2] = wordl2[2] | wordr2[2]; + w2[3] = wordl2[3] | wordr2[3]; + w3[0] = wordl3[0] | wordr3[0]; + w3[1] = wordl3[1] | wordr3[1]; + w3[2] = wordl3[2] | wordr3[2]; + w3[3] = wordl3[3] | wordr3[3]; + + /** + * prepend salt + */ + + const u32 pw_salt_len = pw_len + salt_len; + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + w0_t[0] = salt_buf0[0]; + w0_t[1] = salt_buf0[1]; + w0_t[2] = w0[0]; + w0_t[3] = w0[1]; + w1_t[0] = w0[2]; + w1_t[1] = w0[3]; + w1_t[2] = w1[0]; + w1_t[3] = w1[1]; + w2_t[0] = w1[2]; + w2_t[1] = w1[3]; + w2_t[2] = w2[0]; + w2_t[3] = w2[1]; + w3_t[0] = w2[2]; + w3_t[1] = w2[3]; + w3_t[2] = 0; + w3_t[3] = (pw_salt_len + 1) * 8; + + append_0x80_4 (w0_t, w1_t, w2_t, w3_t, pw_salt_len + 1); + + /** + * sha1 + */ + + w0_t[0] = swap_workaround (w0_t[0]); + w0_t[1] = swap_workaround (w0_t[1]); + w0_t[2] = swap_workaround (w0_t[2]); + w0_t[3] = swap_workaround (w0_t[3]); + w1_t[0] = swap_workaround (w1_t[0]); + w1_t[1] = swap_workaround (w1_t[1]); + w1_t[2] = swap_workaround (w1_t[2]); + w1_t[3] = swap_workaround (w1_t[3]); + w2_t[0] = swap_workaround (w2_t[0]); + w2_t[1] = swap_workaround (w2_t[1]); + w2_t[2] = swap_workaround (w2_t[2]); + w2_t[3] = swap_workaround (w2_t[3]); + w3_t[0] = swap_workaround (w3_t[0]); + w3_t[1] = swap_workaround (w3_t[1]); + //w3_t[2] = swap_workaround (w3_t[2]); + //w3_t[3] = swap_workaround (w3_t[3]); + + u32x a = SHA1M_A; + u32x b = SHA1M_B; + u32x c = SHA1M_C; + u32x d = SHA1M_D; + u32x e = SHA1M_E; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w0_t[0]); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w0_t[1]); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w0_t[2]); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w0_t[3]); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w1_t[0]); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w1_t[1]); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w1_t[2]); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w1_t[3]); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w2_t[0]); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w2_t[1]); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w2_t[2]); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w2_t[3]); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w3_t[0]); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w3_t[1]); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w3_t[2]); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w3_t[3]); + w0_t[0] = rotl32 ((w3_t[1] ^ w2_t[0] ^ w0_t[2] ^ w0_t[0]), 1u); SHA1_STEP (SHA1_F0o, e, a, b, c, d, w0_t[0]); + w0_t[1] = rotl32 ((w3_t[2] ^ w2_t[1] ^ w0_t[3] ^ w0_t[1]), 1u); SHA1_STEP (SHA1_F0o, d, e, a, b, c, w0_t[1]); + w0_t[2] = rotl32 ((w3_t[3] ^ w2_t[2] ^ w1_t[0] ^ w0_t[2]), 1u); SHA1_STEP (SHA1_F0o, c, d, e, a, b, w0_t[2]); + w0_t[3] = rotl32 ((w0_t[0] ^ w2_t[3] ^ w1_t[1] ^ w0_t[3]), 1u); SHA1_STEP (SHA1_F0o, b, c, d, e, a, w0_t[3]); + + #undef K + #define K SHA1C01 + + w1_t[0] = rotl32 ((w0_t[1] ^ w3_t[0] ^ w1_t[2] ^ w1_t[0]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w1_t[0]); + w1_t[1] = rotl32 ((w0_t[2] ^ w3_t[1] ^ w1_t[3] ^ w1_t[1]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w1_t[1]); + w1_t[2] = rotl32 ((w0_t[3] ^ w3_t[2] ^ w2_t[0] ^ w1_t[2]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w1_t[2]); + w1_t[3] = rotl32 ((w1_t[0] ^ w3_t[3] ^ w2_t[1] ^ w1_t[3]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1_t[3]); + w2_t[0] = rotl32 ((w1_t[1] ^ w0_t[0] ^ w2_t[2] ^ w2_t[0]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w2_t[0]); + w2_t[1] = rotl32 ((w1_t[2] ^ w0_t[1] ^ w2_t[3] ^ w2_t[1]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w2_t[1]); + w2_t[2] = rotl32 ((w1_t[3] ^ w0_t[2] ^ w3_t[0] ^ w2_t[2]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w2_t[2]); + w2_t[3] = rotl32 ((w2_t[0] ^ w0_t[3] ^ w3_t[1] ^ w2_t[3]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w2_t[3]); + w3_t[0] = rotl32 ((w2_t[1] ^ w1_t[0] ^ w3_t[2] ^ w3_t[0]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w3_t[0]); + w3_t[1] = rotl32 ((w2_t[2] ^ w1_t[1] ^ w3_t[3] ^ w3_t[1]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w3_t[1]); + w3_t[2] = rotl32 ((w2_t[3] ^ w1_t[2] ^ w0_t[0] ^ w3_t[2]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w3_t[2]); + w3_t[3] = rotl32 ((w3_t[0] ^ w1_t[3] ^ w0_t[1] ^ w3_t[3]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w3_t[3]); + w0_t[0] = rotl32 ((w3_t[1] ^ w2_t[0] ^ w0_t[2] ^ w0_t[0]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w0_t[0]); + w0_t[1] = rotl32 ((w3_t[2] ^ w2_t[1] ^ w0_t[3] ^ w0_t[1]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w0_t[1]); + w0_t[2] = rotl32 ((w3_t[3] ^ w2_t[2] ^ w1_t[0] ^ w0_t[2]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w0_t[2]); + w0_t[3] = rotl32 ((w0_t[0] ^ w2_t[3] ^ w1_t[1] ^ w0_t[3]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w0_t[3]); + w1_t[0] = rotl32 ((w0_t[1] ^ w3_t[0] ^ w1_t[2] ^ w1_t[0]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w1_t[0]); + w1_t[1] = rotl32 ((w0_t[2] ^ w3_t[1] ^ w1_t[3] ^ w1_t[1]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w1_t[1]); + w1_t[2] = rotl32 ((w0_t[3] ^ w3_t[2] ^ w2_t[0] ^ w1_t[2]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1_t[2]); + w1_t[3] = rotl32 ((w1_t[0] ^ w3_t[3] ^ w2_t[1] ^ w1_t[3]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w1_t[3]); + + #undef K + #define K SHA1C02 + + w2_t[0] = rotl32 ((w1_t[1] ^ w0_t[0] ^ w2_t[2] ^ w2_t[0]), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w2_t[0]); + w2_t[1] = rotl32 ((w1_t[2] ^ w0_t[1] ^ w2_t[3] ^ w2_t[1]), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w2_t[1]); + w2_t[2] = rotl32 ((w1_t[3] ^ w0_t[2] ^ w3_t[0] ^ w2_t[2]), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w2_t[2]); + w2_t[3] = rotl32 ((w2_t[0] ^ w0_t[3] ^ w3_t[1] ^ w2_t[3]), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w2_t[3]); + w3_t[0] = rotl32 ((w2_t[1] ^ w1_t[0] ^ w3_t[2] ^ w3_t[0]), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w3_t[0]); + w3_t[1] = rotl32 ((w2_t[2] ^ w1_t[1] ^ w3_t[3] ^ w3_t[1]), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w3_t[1]); + w3_t[2] = rotl32 ((w2_t[3] ^ w1_t[2] ^ w0_t[0] ^ w3_t[2]), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w3_t[2]); + w3_t[3] = rotl32 ((w3_t[0] ^ w1_t[3] ^ w0_t[1] ^ w3_t[3]), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w3_t[3]); + w0_t[0] = rotl32 ((w3_t[1] ^ w2_t[0] ^ w0_t[2] ^ w0_t[0]), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w0_t[0]); + w0_t[1] = rotl32 ((w3_t[2] ^ w2_t[1] ^ w0_t[3] ^ w0_t[1]), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w0_t[1]); + w0_t[2] = rotl32 ((w3_t[3] ^ w2_t[2] ^ w1_t[0] ^ w0_t[2]), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w0_t[2]); + w0_t[3] = rotl32 ((w0_t[0] ^ w2_t[3] ^ w1_t[1] ^ w0_t[3]), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w0_t[3]); + w1_t[0] = rotl32 ((w0_t[1] ^ w3_t[0] ^ w1_t[2] ^ w1_t[0]), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w1_t[0]); + w1_t[1] = rotl32 ((w0_t[2] ^ w3_t[1] ^ w1_t[3] ^ w1_t[1]), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w1_t[1]); + w1_t[2] = rotl32 ((w0_t[3] ^ w3_t[2] ^ w2_t[0] ^ w1_t[2]), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w1_t[2]); + w1_t[3] = rotl32 ((w1_t[0] ^ w3_t[3] ^ w2_t[1] ^ w1_t[3]), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w1_t[3]); + w2_t[0] = rotl32 ((w1_t[1] ^ w0_t[0] ^ w2_t[2] ^ w2_t[0]), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w2_t[0]); + w2_t[1] = rotl32 ((w1_t[2] ^ w0_t[1] ^ w2_t[3] ^ w2_t[1]), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w2_t[1]); + w2_t[2] = rotl32 ((w1_t[3] ^ w0_t[2] ^ w3_t[0] ^ w2_t[2]), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w2_t[2]); + w2_t[3] = rotl32 ((w2_t[0] ^ w0_t[3] ^ w3_t[1] ^ w2_t[3]), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w2_t[3]); + + #undef K + #define K SHA1C03 + + w3_t[0] = rotl32 ((w2_t[1] ^ w1_t[0] ^ w3_t[2] ^ w3_t[0]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w3_t[0]); + w3_t[1] = rotl32 ((w2_t[2] ^ w1_t[1] ^ w3_t[3] ^ w3_t[1]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w3_t[1]); + w3_t[2] = rotl32 ((w2_t[3] ^ w1_t[2] ^ w0_t[0] ^ w3_t[2]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w3_t[2]); + w3_t[3] = rotl32 ((w3_t[0] ^ w1_t[3] ^ w0_t[1] ^ w3_t[3]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w3_t[3]); + w0_t[0] = rotl32 ((w3_t[1] ^ w2_t[0] ^ w0_t[2] ^ w0_t[0]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w0_t[0]); + w0_t[1] = rotl32 ((w3_t[2] ^ w2_t[1] ^ w0_t[3] ^ w0_t[1]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w0_t[1]); + w0_t[2] = rotl32 ((w3_t[3] ^ w2_t[2] ^ w1_t[0] ^ w0_t[2]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w0_t[2]); + w0_t[3] = rotl32 ((w0_t[0] ^ w2_t[3] ^ w1_t[1] ^ w0_t[3]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w0_t[3]); + w1_t[0] = rotl32 ((w0_t[1] ^ w3_t[0] ^ w1_t[2] ^ w1_t[0]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1_t[0]); + w1_t[1] = rotl32 ((w0_t[2] ^ w3_t[1] ^ w1_t[3] ^ w1_t[1]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w1_t[1]); + w1_t[2] = rotl32 ((w0_t[3] ^ w3_t[2] ^ w2_t[0] ^ w1_t[2]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w1_t[2]); + w1_t[3] = rotl32 ((w1_t[0] ^ w3_t[3] ^ w2_t[1] ^ w1_t[3]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w1_t[3]); + w2_t[0] = rotl32 ((w1_t[1] ^ w0_t[0] ^ w2_t[2] ^ w2_t[0]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w2_t[0]); + w2_t[1] = rotl32 ((w1_t[2] ^ w0_t[1] ^ w2_t[3] ^ w2_t[1]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w2_t[1]); + w2_t[2] = rotl32 ((w1_t[3] ^ w0_t[2] ^ w3_t[0] ^ w2_t[2]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w2_t[2]); + w2_t[3] = rotl32 ((w2_t[0] ^ w0_t[3] ^ w3_t[1] ^ w2_t[3]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w2_t[3]); + w3_t[0] = rotl32 ((w2_t[1] ^ w1_t[0] ^ w3_t[2] ^ w3_t[0]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w3_t[0]); + + if (allx (e != e_rev)) continue; + + w3_t[1] = rotl32 ((w2_t[2] ^ w1_t[1] ^ w3_t[3] ^ w3_t[1]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w3_t[1]); + w3_t[2] = rotl32 ((w2_t[3] ^ w1_t[2] ^ w0_t[0] ^ w3_t[2]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w3_t[2]); + w3_t[3] = rotl32 ((w3_t[0] ^ w1_t[3] ^ w0_t[1] ^ w3_t[3]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w3_t[3]); + + const u32x r0 = d; + const u32x r1 = e; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_S + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m08100_s08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m08100_s16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/amd/m08100_a3.cl b/amd/m08100_a3.cl new file mode 100644 index 0000000000..9e74a0b7cc --- /dev/null +++ b/amd/m08100_a3.cl @@ -0,0 +1,857 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _SHA1_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW4 +#define VECT_SIZE4 +#endif + +#ifdef VLIW5 +#define VECT_SIZE4 +#endif + +#define DGST_R0 3 +#define DGST_R1 4 +#define DGST_R2 2 +#define DGST_R3 1 + +#include "include/kernel_functions.c" +#include "types_amd.c" +#include "common_amd.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +static void m08100m (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], const u32 pw_len, __global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset) +{ + /** + * modifier + */ + + const u32 gid = get_global_id (0); + const u32 lid = get_local_id (0); + + /** + * salt + */ + + u32 salt_buf0[2]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[1]; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + const u32 pw_salt_len = pw_len + salt_len; + + /** + * loop + */ + + u32x w0l = w0[0]; + + for (u32 il_pos = 0; il_pos < bfs_cnt; il_pos++) + { + const u32 w0r = bfs_buf[il_pos].i; + + w0[0] = w0l | w0r; + + /** + * prepend salt + */ + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + w0_t[0] = salt_buf0[0]; + w0_t[1] = salt_buf0[1]; + w0_t[2] = w0[0]; + w0_t[3] = w0[1]; + w1_t[0] = w0[2]; + w1_t[1] = w0[3]; + w1_t[2] = w1[0]; + w1_t[3] = w1[1]; + w2_t[0] = w1[2]; + w2_t[1] = w1[3]; + w2_t[2] = w2[0]; + w2_t[3] = w2[1]; + w3_t[0] = w2[2]; + w3_t[1] = w2[3]; + w3_t[2] = 0; + w3_t[3] = (pw_salt_len + 1) * 8; + + /** + * sha1 + */ + + u32x a = SHA1M_A; + u32x b = SHA1M_B; + u32x c = SHA1M_C; + u32x d = SHA1M_D; + u32x e = SHA1M_E; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w0_t[0]); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w0_t[1]); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w0_t[2]); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w0_t[3]); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w1_t[0]); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w1_t[1]); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w1_t[2]); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w1_t[3]); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w2_t[0]); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w2_t[1]); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w2_t[2]); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w2_t[3]); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w3_t[0]); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w3_t[1]); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w3_t[2]); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w3_t[3]); + w0_t[0] = rotl32 ((w3_t[1] ^ w2_t[0] ^ w0_t[2] ^ w0_t[0]), 1u); SHA1_STEP (SHA1_F0o, e, a, b, c, d, w0_t[0]); + w0_t[1] = rotl32 ((w3_t[2] ^ w2_t[1] ^ w0_t[3] ^ w0_t[1]), 1u); SHA1_STEP (SHA1_F0o, d, e, a, b, c, w0_t[1]); + w0_t[2] = rotl32 ((w3_t[3] ^ w2_t[2] ^ w1_t[0] ^ w0_t[2]), 1u); SHA1_STEP (SHA1_F0o, c, d, e, a, b, w0_t[2]); + w0_t[3] = rotl32 ((w0_t[0] ^ w2_t[3] ^ w1_t[1] ^ w0_t[3]), 1u); SHA1_STEP (SHA1_F0o, b, c, d, e, a, w0_t[3]); + + #undef K + #define K SHA1C01 + + w1_t[0] = rotl32 ((w0_t[1] ^ w3_t[0] ^ w1_t[2] ^ w1_t[0]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w1_t[0]); + w1_t[1] = rotl32 ((w0_t[2] ^ w3_t[1] ^ w1_t[3] ^ w1_t[1]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w1_t[1]); + w1_t[2] = rotl32 ((w0_t[3] ^ w3_t[2] ^ w2_t[0] ^ w1_t[2]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w1_t[2]); + w1_t[3] = rotl32 ((w1_t[0] ^ w3_t[3] ^ w2_t[1] ^ w1_t[3]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1_t[3]); + w2_t[0] = rotl32 ((w1_t[1] ^ w0_t[0] ^ w2_t[2] ^ w2_t[0]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w2_t[0]); + w2_t[1] = rotl32 ((w1_t[2] ^ w0_t[1] ^ w2_t[3] ^ w2_t[1]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w2_t[1]); + w2_t[2] = rotl32 ((w1_t[3] ^ w0_t[2] ^ w3_t[0] ^ w2_t[2]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w2_t[2]); + w2_t[3] = rotl32 ((w2_t[0] ^ w0_t[3] ^ w3_t[1] ^ w2_t[3]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w2_t[3]); + w3_t[0] = rotl32 ((w2_t[1] ^ w1_t[0] ^ w3_t[2] ^ w3_t[0]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w3_t[0]); + w3_t[1] = rotl32 ((w2_t[2] ^ w1_t[1] ^ w3_t[3] ^ w3_t[1]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w3_t[1]); + w3_t[2] = rotl32 ((w2_t[3] ^ w1_t[2] ^ w0_t[0] ^ w3_t[2]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w3_t[2]); + w3_t[3] = rotl32 ((w3_t[0] ^ w1_t[3] ^ w0_t[1] ^ w3_t[3]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w3_t[3]); + w0_t[0] = rotl32 ((w3_t[1] ^ w2_t[0] ^ w0_t[2] ^ w0_t[0]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w0_t[0]); + w0_t[1] = rotl32 ((w3_t[2] ^ w2_t[1] ^ w0_t[3] ^ w0_t[1]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w0_t[1]); + w0_t[2] = rotl32 ((w3_t[3] ^ w2_t[2] ^ w1_t[0] ^ w0_t[2]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w0_t[2]); + w0_t[3] = rotl32 ((w0_t[0] ^ w2_t[3] ^ w1_t[1] ^ w0_t[3]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w0_t[3]); + w1_t[0] = rotl32 ((w0_t[1] ^ w3_t[0] ^ w1_t[2] ^ w1_t[0]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w1_t[0]); + w1_t[1] = rotl32 ((w0_t[2] ^ w3_t[1] ^ w1_t[3] ^ w1_t[1]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w1_t[1]); + w1_t[2] = rotl32 ((w0_t[3] ^ w3_t[2] ^ w2_t[0] ^ w1_t[2]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1_t[2]); + w1_t[3] = rotl32 ((w1_t[0] ^ w3_t[3] ^ w2_t[1] ^ w1_t[3]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w1_t[3]); + + #undef K + #define K SHA1C02 + + w2_t[0] = rotl32 ((w1_t[1] ^ w0_t[0] ^ w2_t[2] ^ w2_t[0]), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w2_t[0]); + w2_t[1] = rotl32 ((w1_t[2] ^ w0_t[1] ^ w2_t[3] ^ w2_t[1]), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w2_t[1]); + w2_t[2] = rotl32 ((w1_t[3] ^ w0_t[2] ^ w3_t[0] ^ w2_t[2]), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w2_t[2]); + w2_t[3] = rotl32 ((w2_t[0] ^ w0_t[3] ^ w3_t[1] ^ w2_t[3]), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w2_t[3]); + w3_t[0] = rotl32 ((w2_t[1] ^ w1_t[0] ^ w3_t[2] ^ w3_t[0]), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w3_t[0]); + w3_t[1] = rotl32 ((w2_t[2] ^ w1_t[1] ^ w3_t[3] ^ w3_t[1]), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w3_t[1]); + w3_t[2] = rotl32 ((w2_t[3] ^ w1_t[2] ^ w0_t[0] ^ w3_t[2]), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w3_t[2]); + w3_t[3] = rotl32 ((w3_t[0] ^ w1_t[3] ^ w0_t[1] ^ w3_t[3]), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w3_t[3]); + w0_t[0] = rotl32 ((w3_t[1] ^ w2_t[0] ^ w0_t[2] ^ w0_t[0]), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w0_t[0]); + w0_t[1] = rotl32 ((w3_t[2] ^ w2_t[1] ^ w0_t[3] ^ w0_t[1]), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w0_t[1]); + w0_t[2] = rotl32 ((w3_t[3] ^ w2_t[2] ^ w1_t[0] ^ w0_t[2]), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w0_t[2]); + w0_t[3] = rotl32 ((w0_t[0] ^ w2_t[3] ^ w1_t[1] ^ w0_t[3]), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w0_t[3]); + w1_t[0] = rotl32 ((w0_t[1] ^ w3_t[0] ^ w1_t[2] ^ w1_t[0]), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w1_t[0]); + w1_t[1] = rotl32 ((w0_t[2] ^ w3_t[1] ^ w1_t[3] ^ w1_t[1]), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w1_t[1]); + w1_t[2] = rotl32 ((w0_t[3] ^ w3_t[2] ^ w2_t[0] ^ w1_t[2]), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w1_t[2]); + w1_t[3] = rotl32 ((w1_t[0] ^ w3_t[3] ^ w2_t[1] ^ w1_t[3]), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w1_t[3]); + w2_t[0] = rotl32 ((w1_t[1] ^ w0_t[0] ^ w2_t[2] ^ w2_t[0]), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w2_t[0]); + w2_t[1] = rotl32 ((w1_t[2] ^ w0_t[1] ^ w2_t[3] ^ w2_t[1]), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w2_t[1]); + w2_t[2] = rotl32 ((w1_t[3] ^ w0_t[2] ^ w3_t[0] ^ w2_t[2]), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w2_t[2]); + w2_t[3] = rotl32 ((w2_t[0] ^ w0_t[3] ^ w3_t[1] ^ w2_t[3]), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w2_t[3]); + + #undef K + #define K SHA1C03 + + w3_t[0] = rotl32 ((w2_t[1] ^ w1_t[0] ^ w3_t[2] ^ w3_t[0]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w3_t[0]); + w3_t[1] = rotl32 ((w2_t[2] ^ w1_t[1] ^ w3_t[3] ^ w3_t[1]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w3_t[1]); + w3_t[2] = rotl32 ((w2_t[3] ^ w1_t[2] ^ w0_t[0] ^ w3_t[2]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w3_t[2]); + w3_t[3] = rotl32 ((w3_t[0] ^ w1_t[3] ^ w0_t[1] ^ w3_t[3]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w3_t[3]); + w0_t[0] = rotl32 ((w3_t[1] ^ w2_t[0] ^ w0_t[2] ^ w0_t[0]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w0_t[0]); + w0_t[1] = rotl32 ((w3_t[2] ^ w2_t[1] ^ w0_t[3] ^ w0_t[1]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w0_t[1]); + w0_t[2] = rotl32 ((w3_t[3] ^ w2_t[2] ^ w1_t[0] ^ w0_t[2]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w0_t[2]); + w0_t[3] = rotl32 ((w0_t[0] ^ w2_t[3] ^ w1_t[1] ^ w0_t[3]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w0_t[3]); + w1_t[0] = rotl32 ((w0_t[1] ^ w3_t[0] ^ w1_t[2] ^ w1_t[0]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1_t[0]); + w1_t[1] = rotl32 ((w0_t[2] ^ w3_t[1] ^ w1_t[3] ^ w1_t[1]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w1_t[1]); + w1_t[2] = rotl32 ((w0_t[3] ^ w3_t[2] ^ w2_t[0] ^ w1_t[2]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w1_t[2]); + w1_t[3] = rotl32 ((w1_t[0] ^ w3_t[3] ^ w2_t[1] ^ w1_t[3]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w1_t[3]); + w2_t[0] = rotl32 ((w1_t[1] ^ w0_t[0] ^ w2_t[2] ^ w2_t[0]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w2_t[0]); + w2_t[1] = rotl32 ((w1_t[2] ^ w0_t[1] ^ w2_t[3] ^ w2_t[1]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w2_t[1]); + w2_t[2] = rotl32 ((w1_t[3] ^ w0_t[2] ^ w3_t[0] ^ w2_t[2]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w2_t[2]); + w2_t[3] = rotl32 ((w2_t[0] ^ w0_t[3] ^ w3_t[1] ^ w2_t[3]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w2_t[3]); + w3_t[0] = rotl32 ((w2_t[1] ^ w1_t[0] ^ w3_t[2] ^ w3_t[0]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w3_t[0]); + w3_t[1] = rotl32 ((w2_t[2] ^ w1_t[1] ^ w3_t[3] ^ w3_t[1]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w3_t[1]); + w3_t[2] = rotl32 ((w2_t[3] ^ w1_t[2] ^ w0_t[0] ^ w3_t[2]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w3_t[2]); + w3_t[3] = rotl32 ((w3_t[0] ^ w1_t[3] ^ w0_t[1] ^ w3_t[3]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w3_t[3]); + + const u32x r0 = d; + const u32x r1 = e; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_M + } +} + +static void m08100s (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], const u32 pw_len, __global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset) +{ + /** + * modifier + */ + + const u32 gid = get_global_id (0); + const u32 lid = get_local_id (0); + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * reverse + */ + + const u32 e_rev = rotl32 (search[1], 2u); + + /** + * salt + */ + + u32 salt_buf0[2]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[1]; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + const u32 pw_salt_len = pw_len + salt_len; + + /** + * loop + */ + + u32x w0l = w0[0]; + + for (u32 il_pos = 0; il_pos < bfs_cnt; il_pos++) + { + const u32 w0r = bfs_buf[il_pos].i; + + w0[0] = w0l | w0r; + + /** + * prepend salt + */ + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + w0_t[0] = salt_buf0[0]; + w0_t[1] = salt_buf0[1]; + w0_t[2] = w0[0]; + w0_t[3] = w0[1]; + w1_t[0] = w0[2]; + w1_t[1] = w0[3]; + w1_t[2] = w1[0]; + w1_t[3] = w1[1]; + w2_t[0] = w1[2]; + w2_t[1] = w1[3]; + w2_t[2] = w2[0]; + w2_t[3] = w2[1]; + w3_t[0] = w2[2]; + w3_t[1] = w2[3]; + w3_t[2] = 0; + w3_t[3] = (pw_salt_len + 1) * 8; + + /** + * sha1 + */ + + u32x a = SHA1M_A; + u32x b = SHA1M_B; + u32x c = SHA1M_C; + u32x d = SHA1M_D; + u32x e = SHA1M_E; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w0_t[0]); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w0_t[1]); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w0_t[2]); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w0_t[3]); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w1_t[0]); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w1_t[1]); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w1_t[2]); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w1_t[3]); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w2_t[0]); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w2_t[1]); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w2_t[2]); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w2_t[3]); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w3_t[0]); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w3_t[1]); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w3_t[2]); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w3_t[3]); + w0_t[0] = rotl32 ((w3_t[1] ^ w2_t[0] ^ w0_t[2] ^ w0_t[0]), 1u); SHA1_STEP (SHA1_F0o, e, a, b, c, d, w0_t[0]); + w0_t[1] = rotl32 ((w3_t[2] ^ w2_t[1] ^ w0_t[3] ^ w0_t[1]), 1u); SHA1_STEP (SHA1_F0o, d, e, a, b, c, w0_t[1]); + w0_t[2] = rotl32 ((w3_t[3] ^ w2_t[2] ^ w1_t[0] ^ w0_t[2]), 1u); SHA1_STEP (SHA1_F0o, c, d, e, a, b, w0_t[2]); + w0_t[3] = rotl32 ((w0_t[0] ^ w2_t[3] ^ w1_t[1] ^ w0_t[3]), 1u); SHA1_STEP (SHA1_F0o, b, c, d, e, a, w0_t[3]); + + #undef K + #define K SHA1C01 + + w1_t[0] = rotl32 ((w0_t[1] ^ w3_t[0] ^ w1_t[2] ^ w1_t[0]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w1_t[0]); + w1_t[1] = rotl32 ((w0_t[2] ^ w3_t[1] ^ w1_t[3] ^ w1_t[1]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w1_t[1]); + w1_t[2] = rotl32 ((w0_t[3] ^ w3_t[2] ^ w2_t[0] ^ w1_t[2]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w1_t[2]); + w1_t[3] = rotl32 ((w1_t[0] ^ w3_t[3] ^ w2_t[1] ^ w1_t[3]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1_t[3]); + w2_t[0] = rotl32 ((w1_t[1] ^ w0_t[0] ^ w2_t[2] ^ w2_t[0]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w2_t[0]); + w2_t[1] = rotl32 ((w1_t[2] ^ w0_t[1] ^ w2_t[3] ^ w2_t[1]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w2_t[1]); + w2_t[2] = rotl32 ((w1_t[3] ^ w0_t[2] ^ w3_t[0] ^ w2_t[2]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w2_t[2]); + w2_t[3] = rotl32 ((w2_t[0] ^ w0_t[3] ^ w3_t[1] ^ w2_t[3]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w2_t[3]); + w3_t[0] = rotl32 ((w2_t[1] ^ w1_t[0] ^ w3_t[2] ^ w3_t[0]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w3_t[0]); + w3_t[1] = rotl32 ((w2_t[2] ^ w1_t[1] ^ w3_t[3] ^ w3_t[1]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w3_t[1]); + w3_t[2] = rotl32 ((w2_t[3] ^ w1_t[2] ^ w0_t[0] ^ w3_t[2]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w3_t[2]); + w3_t[3] = rotl32 ((w3_t[0] ^ w1_t[3] ^ w0_t[1] ^ w3_t[3]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w3_t[3]); + w0_t[0] = rotl32 ((w3_t[1] ^ w2_t[0] ^ w0_t[2] ^ w0_t[0]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w0_t[0]); + w0_t[1] = rotl32 ((w3_t[2] ^ w2_t[1] ^ w0_t[3] ^ w0_t[1]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w0_t[1]); + w0_t[2] = rotl32 ((w3_t[3] ^ w2_t[2] ^ w1_t[0] ^ w0_t[2]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w0_t[2]); + w0_t[3] = rotl32 ((w0_t[0] ^ w2_t[3] ^ w1_t[1] ^ w0_t[3]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w0_t[3]); + w1_t[0] = rotl32 ((w0_t[1] ^ w3_t[0] ^ w1_t[2] ^ w1_t[0]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w1_t[0]); + w1_t[1] = rotl32 ((w0_t[2] ^ w3_t[1] ^ w1_t[3] ^ w1_t[1]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w1_t[1]); + w1_t[2] = rotl32 ((w0_t[3] ^ w3_t[2] ^ w2_t[0] ^ w1_t[2]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1_t[2]); + w1_t[3] = rotl32 ((w1_t[0] ^ w3_t[3] ^ w2_t[1] ^ w1_t[3]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w1_t[3]); + + #undef K + #define K SHA1C02 + + w2_t[0] = rotl32 ((w1_t[1] ^ w0_t[0] ^ w2_t[2] ^ w2_t[0]), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w2_t[0]); + w2_t[1] = rotl32 ((w1_t[2] ^ w0_t[1] ^ w2_t[3] ^ w2_t[1]), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w2_t[1]); + w2_t[2] = rotl32 ((w1_t[3] ^ w0_t[2] ^ w3_t[0] ^ w2_t[2]), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w2_t[2]); + w2_t[3] = rotl32 ((w2_t[0] ^ w0_t[3] ^ w3_t[1] ^ w2_t[3]), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w2_t[3]); + w3_t[0] = rotl32 ((w2_t[1] ^ w1_t[0] ^ w3_t[2] ^ w3_t[0]), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w3_t[0]); + w3_t[1] = rotl32 ((w2_t[2] ^ w1_t[1] ^ w3_t[3] ^ w3_t[1]), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w3_t[1]); + w3_t[2] = rotl32 ((w2_t[3] ^ w1_t[2] ^ w0_t[0] ^ w3_t[2]), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w3_t[2]); + w3_t[3] = rotl32 ((w3_t[0] ^ w1_t[3] ^ w0_t[1] ^ w3_t[3]), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w3_t[3]); + w0_t[0] = rotl32 ((w3_t[1] ^ w2_t[0] ^ w0_t[2] ^ w0_t[0]), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w0_t[0]); + w0_t[1] = rotl32 ((w3_t[2] ^ w2_t[1] ^ w0_t[3] ^ w0_t[1]), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w0_t[1]); + w0_t[2] = rotl32 ((w3_t[3] ^ w2_t[2] ^ w1_t[0] ^ w0_t[2]), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w0_t[2]); + w0_t[3] = rotl32 ((w0_t[0] ^ w2_t[3] ^ w1_t[1] ^ w0_t[3]), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w0_t[3]); + w1_t[0] = rotl32 ((w0_t[1] ^ w3_t[0] ^ w1_t[2] ^ w1_t[0]), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w1_t[0]); + w1_t[1] = rotl32 ((w0_t[2] ^ w3_t[1] ^ w1_t[3] ^ w1_t[1]), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w1_t[1]); + w1_t[2] = rotl32 ((w0_t[3] ^ w3_t[2] ^ w2_t[0] ^ w1_t[2]), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w1_t[2]); + w1_t[3] = rotl32 ((w1_t[0] ^ w3_t[3] ^ w2_t[1] ^ w1_t[3]), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w1_t[3]); + w2_t[0] = rotl32 ((w1_t[1] ^ w0_t[0] ^ w2_t[2] ^ w2_t[0]), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w2_t[0]); + w2_t[1] = rotl32 ((w1_t[2] ^ w0_t[1] ^ w2_t[3] ^ w2_t[1]), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w2_t[1]); + w2_t[2] = rotl32 ((w1_t[3] ^ w0_t[2] ^ w3_t[0] ^ w2_t[2]), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w2_t[2]); + w2_t[3] = rotl32 ((w2_t[0] ^ w0_t[3] ^ w3_t[1] ^ w2_t[3]), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w2_t[3]); + + #undef K + #define K SHA1C03 + + w3_t[0] = rotl32 ((w2_t[1] ^ w1_t[0] ^ w3_t[2] ^ w3_t[0]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w3_t[0]); + w3_t[1] = rotl32 ((w2_t[2] ^ w1_t[1] ^ w3_t[3] ^ w3_t[1]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w3_t[1]); + w3_t[2] = rotl32 ((w2_t[3] ^ w1_t[2] ^ w0_t[0] ^ w3_t[2]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w3_t[2]); + w3_t[3] = rotl32 ((w3_t[0] ^ w1_t[3] ^ w0_t[1] ^ w3_t[3]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w3_t[3]); + w0_t[0] = rotl32 ((w3_t[1] ^ w2_t[0] ^ w0_t[2] ^ w0_t[0]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w0_t[0]); + w0_t[1] = rotl32 ((w3_t[2] ^ w2_t[1] ^ w0_t[3] ^ w0_t[1]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w0_t[1]); + w0_t[2] = rotl32 ((w3_t[3] ^ w2_t[2] ^ w1_t[0] ^ w0_t[2]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w0_t[2]); + w0_t[3] = rotl32 ((w0_t[0] ^ w2_t[3] ^ w1_t[1] ^ w0_t[3]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w0_t[3]); + w1_t[0] = rotl32 ((w0_t[1] ^ w3_t[0] ^ w1_t[2] ^ w1_t[0]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1_t[0]); + w1_t[1] = rotl32 ((w0_t[2] ^ w3_t[1] ^ w1_t[3] ^ w1_t[1]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w1_t[1]); + w1_t[2] = rotl32 ((w0_t[3] ^ w3_t[2] ^ w2_t[0] ^ w1_t[2]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w1_t[2]); + w1_t[3] = rotl32 ((w1_t[0] ^ w3_t[3] ^ w2_t[1] ^ w1_t[3]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w1_t[3]); + w2_t[0] = rotl32 ((w1_t[1] ^ w0_t[0] ^ w2_t[2] ^ w2_t[0]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w2_t[0]); + w2_t[1] = rotl32 ((w1_t[2] ^ w0_t[1] ^ w2_t[3] ^ w2_t[1]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w2_t[1]); + w2_t[2] = rotl32 ((w1_t[3] ^ w0_t[2] ^ w3_t[0] ^ w2_t[2]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w2_t[2]); + w2_t[3] = rotl32 ((w2_t[0] ^ w0_t[3] ^ w3_t[1] ^ w2_t[3]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w2_t[3]); + w3_t[0] = rotl32 ((w2_t[1] ^ w1_t[0] ^ w3_t[2] ^ w3_t[0]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w3_t[0]); + + if (allx (e != e_rev)) continue; + + w3_t[1] = rotl32 ((w2_t[2] ^ w1_t[1] ^ w3_t[3] ^ w3_t[1]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w3_t[1]); + w3_t[2] = rotl32 ((w2_t[3] ^ w1_t[2] ^ w0_t[0] ^ w3_t[2]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w3_t[2]); + w3_t[3] = rotl32 ((w3_t[0] ^ w1_t[3] ^ w0_t[1] ^ w3_t[3]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w3_t[3]); + + const u32x r0 = d; + const u32x r1 = e; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_S + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m08100_m04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * base + */ + + w0[0] = swap_workaround (w0[0]); + w0[1] = swap_workaround (w0[1]); + w0[2] = swap_workaround (w0[2]); + w0[3] = swap_workaround (w0[3]); + + append_0x80_2 (w0, w1, pw_len + 1); + + w0[0] = swap_workaround (w0[0]); + w0[1] = swap_workaround (w0[1]); + w0[2] = swap_workaround (w0[2]); + w0[3] = swap_workaround (w0[3]); + w1[0] = swap_workaround (w1[0]); + + /** + * main + */ + + m08100m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m08100_m08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * base + */ + + w0[0] = swap_workaround (w0[0]); + w0[1] = swap_workaround (w0[1]); + w0[2] = swap_workaround (w0[2]); + w0[3] = swap_workaround (w0[3]); + w1[0] = swap_workaround (w1[0]); + w1[1] = swap_workaround (w1[1]); + w1[2] = swap_workaround (w1[2]); + w1[3] = swap_workaround (w1[3]); + + append_0x80_3 (w0, w1, w2, pw_len + 1); + + w0[0] = swap_workaround (w0[0]); + w0[1] = swap_workaround (w0[1]); + w0[2] = swap_workaround (w0[2]); + w0[3] = swap_workaround (w0[3]); + w1[0] = swap_workaround (w1[0]); + w1[1] = swap_workaround (w1[1]); + w1[2] = swap_workaround (w1[2]); + w1[3] = swap_workaround (w1[3]); + w2[0] = swap_workaround (w2[0]); + + /** + * main + */ + + m08100m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m08100_m16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = pws[gid].i[ 8]; + w2[1] = pws[gid].i[ 9]; + w2[2] = pws[gid].i[10]; + w2[3] = pws[gid].i[11]; + + u32x w3[4]; + + w3[0] = pws[gid].i[12]; + w3[1] = pws[gid].i[13]; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * base + */ + + w0[0] = swap_workaround (w0[0]); + w0[1] = swap_workaround (w0[1]); + w0[2] = swap_workaround (w0[2]); + w0[3] = swap_workaround (w0[3]); + w1[0] = swap_workaround (w1[0]); + w1[1] = swap_workaround (w1[1]); + w1[2] = swap_workaround (w1[2]); + w1[3] = swap_workaround (w1[3]); + w2[0] = swap_workaround (w2[0]); + w2[1] = swap_workaround (w2[1]); + w2[2] = swap_workaround (w2[2]); + w2[3] = swap_workaround (w2[3]); + w3[0] = swap_workaround (w3[0]); + w3[1] = swap_workaround (w3[1]); + w3[2] = 0; + w3[3] = 0; + + append_0x80_4 (w0, w1, w2, w3, pw_len + 1); + + w0[0] = swap_workaround (w0[0]); + w0[1] = swap_workaround (w0[1]); + w0[2] = swap_workaround (w0[2]); + w0[3] = swap_workaround (w0[3]); + w1[0] = swap_workaround (w1[0]); + w1[1] = swap_workaround (w1[1]); + w1[2] = swap_workaround (w1[2]); + w1[3] = swap_workaround (w1[3]); + w2[0] = swap_workaround (w2[0]); + w2[1] = swap_workaround (w2[1]); + w2[2] = swap_workaround (w2[2]); + w2[3] = swap_workaround (w2[3]); + w3[0] = swap_workaround (w3[0]); + w3[1] = swap_workaround (w3[1]); + w3[2] = 0; + w3[3] = 0; + + /** + * main + */ + + m08100m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m08100_s04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * base + */ + + w0[0] = swap_workaround (w0[0]); + w0[1] = swap_workaround (w0[1]); + w0[2] = swap_workaround (w0[2]); + w0[3] = swap_workaround (w0[3]); + + append_0x80_2 (w0, w1, pw_len + 1); + + w0[0] = swap_workaround (w0[0]); + w0[1] = swap_workaround (w0[1]); + w0[2] = swap_workaround (w0[2]); + w0[3] = swap_workaround (w0[3]); + w1[0] = swap_workaround (w1[0]); + + /** + * main + */ + + m08100s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m08100_s08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * base + */ + + w0[0] = swap_workaround (w0[0]); + w0[1] = swap_workaround (w0[1]); + w0[2] = swap_workaround (w0[2]); + w0[3] = swap_workaround (w0[3]); + w1[0] = swap_workaround (w1[0]); + w1[1] = swap_workaround (w1[1]); + w1[2] = swap_workaround (w1[2]); + w1[3] = swap_workaround (w1[3]); + + append_0x80_3 (w0, w1, w2, pw_len + 1); + + w0[0] = swap_workaround (w0[0]); + w0[1] = swap_workaround (w0[1]); + w0[2] = swap_workaround (w0[2]); + w0[3] = swap_workaround (w0[3]); + w1[0] = swap_workaround (w1[0]); + w1[1] = swap_workaround (w1[1]); + w1[2] = swap_workaround (w1[2]); + w1[3] = swap_workaround (w1[3]); + w2[0] = swap_workaround (w2[0]); + + /** + * main + */ + + m08100s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m08100_s16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = pws[gid].i[ 8]; + w2[1] = pws[gid].i[ 9]; + w2[2] = pws[gid].i[10]; + w2[3] = pws[gid].i[11]; + + u32x w3[4]; + + w3[0] = pws[gid].i[12]; + w3[1] = pws[gid].i[13]; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * base + */ + + w0[0] = swap_workaround (w0[0]); + w0[1] = swap_workaround (w0[1]); + w0[2] = swap_workaround (w0[2]); + w0[3] = swap_workaround (w0[3]); + w1[0] = swap_workaround (w1[0]); + w1[1] = swap_workaround (w1[1]); + w1[2] = swap_workaround (w1[2]); + w1[3] = swap_workaround (w1[3]); + w2[0] = swap_workaround (w2[0]); + w2[1] = swap_workaround (w2[1]); + w2[2] = swap_workaround (w2[2]); + w2[3] = swap_workaround (w2[3]); + w3[0] = swap_workaround (w3[0]); + w3[1] = swap_workaround (w3[1]); + w3[2] = 0; + w3[3] = 0; + + append_0x80_4 (w0, w1, w2, w3, pw_len + 1); + + w0[0] = swap_workaround (w0[0]); + w0[1] = swap_workaround (w0[1]); + w0[2] = swap_workaround (w0[2]); + w0[3] = swap_workaround (w0[3]); + w1[0] = swap_workaround (w1[0]); + w1[1] = swap_workaround (w1[1]); + w1[2] = swap_workaround (w1[2]); + w1[3] = swap_workaround (w1[3]); + w2[0] = swap_workaround (w2[0]); + w2[1] = swap_workaround (w2[1]); + w2[2] = swap_workaround (w2[2]); + w2[3] = swap_workaround (w2[3]); + w3[0] = swap_workaround (w3[0]); + w3[1] = swap_workaround (w3[1]); + w3[2] = 0; + w3[3] = 0; + + /** + * main + */ + + m08100s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} diff --git a/amd/m08200.cl b/amd/m08200.cl new file mode 100644 index 0000000000..b3682048e8 --- /dev/null +++ b/amd/m08200.cl @@ -0,0 +1,801 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _CLOUDKEY_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW4 +#define VECT_SIZE1 +#endif + +#ifdef VLIW5 +#define VECT_SIZE1 +#endif + +#define DGST_R0 0 +#define DGST_R1 1 +#define DGST_R2 2 +#define DGST_R3 3 + +#include "include/kernel_functions.c" +#include "types_amd.c" +#include "common_amd.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +__constant u32 k_sha256[64] = +{ + SHA256C00, SHA256C01, SHA256C02, SHA256C03, + SHA256C04, SHA256C05, SHA256C06, SHA256C07, + SHA256C08, SHA256C09, SHA256C0a, SHA256C0b, + SHA256C0c, SHA256C0d, SHA256C0e, SHA256C0f, + SHA256C10, SHA256C11, SHA256C12, SHA256C13, + SHA256C14, SHA256C15, SHA256C16, SHA256C17, + SHA256C18, SHA256C19, SHA256C1a, SHA256C1b, + SHA256C1c, SHA256C1d, SHA256C1e, SHA256C1f, + SHA256C20, SHA256C21, SHA256C22, SHA256C23, + SHA256C24, SHA256C25, SHA256C26, SHA256C27, + SHA256C28, SHA256C29, SHA256C2a, SHA256C2b, + SHA256C2c, SHA256C2d, SHA256C2e, SHA256C2f, + SHA256C30, SHA256C31, SHA256C32, SHA256C33, + SHA256C34, SHA256C35, SHA256C36, SHA256C37, + SHA256C38, SHA256C39, SHA256C3a, SHA256C3b, + SHA256C3c, SHA256C3d, SHA256C3e, SHA256C3f, +}; + +__constant u64 k_sha512[80] = +{ + SHA512C00, SHA512C01, SHA512C02, SHA512C03, + SHA512C04, SHA512C05, SHA512C06, SHA512C07, + SHA512C08, SHA512C09, SHA512C0a, SHA512C0b, + SHA512C0c, SHA512C0d, SHA512C0e, SHA512C0f, + SHA512C10, SHA512C11, SHA512C12, SHA512C13, + SHA512C14, SHA512C15, SHA512C16, SHA512C17, + SHA512C18, SHA512C19, SHA512C1a, SHA512C1b, + SHA512C1c, SHA512C1d, SHA512C1e, SHA512C1f, + SHA512C20, SHA512C21, SHA512C22, SHA512C23, + SHA512C24, SHA512C25, SHA512C26, SHA512C27, + SHA512C28, SHA512C29, SHA512C2a, SHA512C2b, + SHA512C2c, SHA512C2d, SHA512C2e, SHA512C2f, + SHA512C30, SHA512C31, SHA512C32, SHA512C33, + SHA512C34, SHA512C35, SHA512C36, SHA512C37, + SHA512C38, SHA512C39, SHA512C3a, SHA512C3b, + SHA512C3c, SHA512C3d, SHA512C3e, SHA512C3f, + SHA512C40, SHA512C41, SHA512C42, SHA512C43, + SHA512C44, SHA512C45, SHA512C46, SHA512C47, + SHA512C48, SHA512C49, SHA512C4a, SHA512C4b, + SHA512C4c, SHA512C4d, SHA512C4e, SHA512C4f, +}; + +static void sha256_transform (const u32x w0[4], const u32x w1[4], const u32x w2[4], const u32x w3[4], u32x digest[8]) +{ + u32x a = digest[0]; + u32x b = digest[1]; + u32x c = digest[2]; + u32x d = digest[3]; + u32x e = digest[4]; + u32x f = digest[5]; + u32x g = digest[6]; + u32x h = digest[7]; + + u32x w0_t = w0[0]; + u32x w1_t = w0[1]; + u32x w2_t = w0[2]; + u32x w3_t = w0[3]; + u32x w4_t = w1[0]; + u32x w5_t = w1[1]; + u32x w6_t = w1[2]; + u32x w7_t = w1[3]; + u32x w8_t = w2[0]; + u32x w9_t = w2[1]; + u32x wa_t = w2[2]; + u32x wb_t = w2[3]; + u32x wc_t = w3[0]; + u32x wd_t = w3[1]; + u32x we_t = w3[2]; + u32x wf_t = w3[3]; + + #define ROUND_EXPAND() \ + { \ + w0_t = SHA256_EXPAND (we_t, w9_t, w1_t, w0_t); \ + w1_t = SHA256_EXPAND (wf_t, wa_t, w2_t, w1_t); \ + w2_t = SHA256_EXPAND (w0_t, wb_t, w3_t, w2_t); \ + w3_t = SHA256_EXPAND (w1_t, wc_t, w4_t, w3_t); \ + w4_t = SHA256_EXPAND (w2_t, wd_t, w5_t, w4_t); \ + w5_t = SHA256_EXPAND (w3_t, we_t, w6_t, w5_t); \ + w6_t = SHA256_EXPAND (w4_t, wf_t, w7_t, w6_t); \ + w7_t = SHA256_EXPAND (w5_t, w0_t, w8_t, w7_t); \ + w8_t = SHA256_EXPAND (w6_t, w1_t, w9_t, w8_t); \ + w9_t = SHA256_EXPAND (w7_t, w2_t, wa_t, w9_t); \ + wa_t = SHA256_EXPAND (w8_t, w3_t, wb_t, wa_t); \ + wb_t = SHA256_EXPAND (w9_t, w4_t, wc_t, wb_t); \ + wc_t = SHA256_EXPAND (wa_t, w5_t, wd_t, wc_t); \ + wd_t = SHA256_EXPAND (wb_t, w6_t, we_t, wd_t); \ + we_t = SHA256_EXPAND (wc_t, w7_t, wf_t, we_t); \ + wf_t = SHA256_EXPAND (wd_t, w8_t, w0_t, wf_t); \ + } + + #define ROUND_STEP(i) \ + { \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, k_sha256[i + 0]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, k_sha256[i + 1]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, k_sha256[i + 2]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, k_sha256[i + 3]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, k_sha256[i + 4]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, k_sha256[i + 5]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, k_sha256[i + 6]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, k_sha256[i + 7]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, k_sha256[i + 8]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, k_sha256[i + 9]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, k_sha256[i + 10]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, k_sha256[i + 11]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, k_sha256[i + 12]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, k_sha256[i + 13]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, k_sha256[i + 14]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, k_sha256[i + 15]); \ + } + + ROUND_STEP (0); + + #pragma unroll + for (int i = 16; i < 64; i += 16) + { + ROUND_EXPAND (); ROUND_STEP (i); + } + + digest[0] += a; + digest[1] += b; + digest[2] += c; + digest[3] += d; + digest[4] += e; + digest[5] += f; + digest[6] += g; + digest[7] += h; +} + +static void hmac_sha256_pad (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], u32x ipad[8], u32x opad[8]) +{ + w0[0] = w0[0] ^ 0x36363636; + w0[1] = w0[1] ^ 0x36363636; + w0[2] = w0[2] ^ 0x36363636; + w0[3] = w0[3] ^ 0x36363636; + w1[0] = w1[0] ^ 0x36363636; + w1[1] = w1[1] ^ 0x36363636; + w1[2] = w1[2] ^ 0x36363636; + w1[3] = w1[3] ^ 0x36363636; + w2[0] = w2[0] ^ 0x36363636; + w2[1] = w2[1] ^ 0x36363636; + w2[2] = w2[2] ^ 0x36363636; + w2[3] = w2[3] ^ 0x36363636; + w3[0] = w3[0] ^ 0x36363636; + w3[1] = w3[1] ^ 0x36363636; + w3[2] = w3[2] ^ 0x36363636; + w3[3] = w3[3] ^ 0x36363636; + + ipad[0] = SHA256M_A; + ipad[1] = SHA256M_B; + ipad[2] = SHA256M_C; + ipad[3] = SHA256M_D; + ipad[4] = SHA256M_E; + ipad[5] = SHA256M_F; + ipad[6] = SHA256M_G; + ipad[7] = SHA256M_H; + + sha256_transform (w0, w1, w2, w3, ipad); + + w0[0] = w0[0] ^ 0x6a6a6a6a; + w0[1] = w0[1] ^ 0x6a6a6a6a; + w0[2] = w0[2] ^ 0x6a6a6a6a; + w0[3] = w0[3] ^ 0x6a6a6a6a; + w1[0] = w1[0] ^ 0x6a6a6a6a; + w1[1] = w1[1] ^ 0x6a6a6a6a; + w1[2] = w1[2] ^ 0x6a6a6a6a; + w1[3] = w1[3] ^ 0x6a6a6a6a; + w2[0] = w2[0] ^ 0x6a6a6a6a; + w2[1] = w2[1] ^ 0x6a6a6a6a; + w2[2] = w2[2] ^ 0x6a6a6a6a; + w2[3] = w2[3] ^ 0x6a6a6a6a; + w3[0] = w3[0] ^ 0x6a6a6a6a; + w3[1] = w3[1] ^ 0x6a6a6a6a; + w3[2] = w3[2] ^ 0x6a6a6a6a; + w3[3] = w3[3] ^ 0x6a6a6a6a; + + opad[0] = SHA256M_A; + opad[1] = SHA256M_B; + opad[2] = SHA256M_C; + opad[3] = SHA256M_D; + opad[4] = SHA256M_E; + opad[5] = SHA256M_F; + opad[6] = SHA256M_G; + opad[7] = SHA256M_H; + + sha256_transform (w0, w1, w2, w3, opad); +} + +static void hmac_sha256_run (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], u32x ipad[8], u32x opad[8], u32x digest[8]) +{ + digest[0] = ipad[0]; + digest[1] = ipad[1]; + digest[2] = ipad[2]; + digest[3] = ipad[3]; + digest[4] = ipad[4]; + digest[5] = ipad[5]; + digest[6] = ipad[6]; + digest[7] = ipad[7]; + + sha256_transform (w0, w1, w2, w3, digest); + + w0[0] = digest[0]; + w0[1] = digest[1]; + w0[2] = digest[2]; + w0[3] = digest[3]; + w1[0] = digest[4]; + w1[1] = digest[5]; + w1[2] = digest[6]; + w1[3] = digest[7]; + w2[0] = 0x80000000; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = (64 + 32) * 8; + + digest[0] = opad[0]; + digest[1] = opad[1]; + digest[2] = opad[2]; + digest[3] = opad[3]; + digest[4] = opad[4]; + digest[5] = opad[5]; + digest[6] = opad[6]; + digest[7] = opad[7]; + + sha256_transform (w0, w1, w2, w3, digest); +} + +static void sha512_transform (const u64 w[16], u64 dgst[8]) +{ + u64 a = dgst[0]; + u64 b = dgst[1]; + u64 c = dgst[2]; + u64 d = dgst[3]; + u64 e = dgst[4]; + u64 f = dgst[5]; + u64 g = dgst[6]; + u64 h = dgst[7]; + + u64 w0_t = w[ 0]; + u64 w1_t = w[ 1]; + u64 w2_t = w[ 2]; + u64 w3_t = w[ 3]; + u64 w4_t = w[ 4]; + u64 w5_t = w[ 5]; + u64 w6_t = w[ 6]; + u64 w7_t = w[ 7]; + u64 w8_t = w[ 8]; + u64 w9_t = w[ 9]; + u64 wa_t = w[10]; + u64 wb_t = w[11]; + u64 wc_t = w[12]; + u64 wd_t = w[13]; + u64 we_t = w[14]; + u64 wf_t = w[15]; + + #define ROUND512_EXPAND() \ + { \ + w0_t = SHA512_EXPAND (we_t, w9_t, w1_t, w0_t); \ + w1_t = SHA512_EXPAND (wf_t, wa_t, w2_t, w1_t); \ + w2_t = SHA512_EXPAND (w0_t, wb_t, w3_t, w2_t); \ + w3_t = SHA512_EXPAND (w1_t, wc_t, w4_t, w3_t); \ + w4_t = SHA512_EXPAND (w2_t, wd_t, w5_t, w4_t); \ + w5_t = SHA512_EXPAND (w3_t, we_t, w6_t, w5_t); \ + w6_t = SHA512_EXPAND (w4_t, wf_t, w7_t, w6_t); \ + w7_t = SHA512_EXPAND (w5_t, w0_t, w8_t, w7_t); \ + w8_t = SHA512_EXPAND (w6_t, w1_t, w9_t, w8_t); \ + w9_t = SHA512_EXPAND (w7_t, w2_t, wa_t, w9_t); \ + wa_t = SHA512_EXPAND (w8_t, w3_t, wb_t, wa_t); \ + wb_t = SHA512_EXPAND (w9_t, w4_t, wc_t, wb_t); \ + wc_t = SHA512_EXPAND (wa_t, w5_t, wd_t, wc_t); \ + wd_t = SHA512_EXPAND (wb_t, w6_t, we_t, wd_t); \ + we_t = SHA512_EXPAND (wc_t, w7_t, wf_t, we_t); \ + wf_t = SHA512_EXPAND (wd_t, w8_t, w0_t, wf_t); \ + } + + #define ROUND512_STEP(i) \ + { \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, a, b, c, d, e, f, g, h, w0_t, k_sha512[i + 0]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, h, a, b, c, d, e, f, g, w1_t, k_sha512[i + 1]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, g, h, a, b, c, d, e, f, w2_t, k_sha512[i + 2]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, f, g, h, a, b, c, d, e, w3_t, k_sha512[i + 3]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, e, f, g, h, a, b, c, d, w4_t, k_sha512[i + 4]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, d, e, f, g, h, a, b, c, w5_t, k_sha512[i + 5]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, c, d, e, f, g, h, a, b, w6_t, k_sha512[i + 6]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, b, c, d, e, f, g, h, a, w7_t, k_sha512[i + 7]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, a, b, c, d, e, f, g, h, w8_t, k_sha512[i + 8]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, h, a, b, c, d, e, f, g, w9_t, k_sha512[i + 9]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, g, h, a, b, c, d, e, f, wa_t, k_sha512[i + 10]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, f, g, h, a, b, c, d, e, wb_t, k_sha512[i + 11]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, e, f, g, h, a, b, c, d, wc_t, k_sha512[i + 12]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, d, e, f, g, h, a, b, c, wd_t, k_sha512[i + 13]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, c, d, e, f, g, h, a, b, we_t, k_sha512[i + 14]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, b, c, d, e, f, g, h, a, wf_t, k_sha512[i + 15]); \ + } + + ROUND512_STEP (0); + + //#pragma unroll // kernel fails if used + for (int i = 16; i < 80; i += 16) + { + ROUND512_EXPAND (); ROUND512_STEP (i); + } + + dgst[0] += a; + dgst[1] += b; + dgst[2] += c; + dgst[3] += d; + dgst[4] += e; + dgst[5] += f; + dgst[6] += g; + dgst[7] += h; +} + +static void hmac_sha512_run (const u64 w1[16], const u64 ipad[8], const u64 opad[8], u64 dgst[8]) +{ + dgst[0] = ipad[0]; + dgst[1] = ipad[1]; + dgst[2] = ipad[2]; + dgst[3] = ipad[3]; + dgst[4] = ipad[4]; + dgst[5] = ipad[5]; + dgst[6] = ipad[6]; + dgst[7] = ipad[7]; + + sha512_transform (w1, dgst); + + u64 w[16]; + + w[ 0] = dgst[0]; + w[ 1] = dgst[1]; + w[ 2] = dgst[2]; + w[ 3] = dgst[3]; + w[ 4] = dgst[4]; + w[ 5] = dgst[5]; + w[ 6] = dgst[6]; + w[ 7] = dgst[7]; + w[ 8] = 0x8000000000000000; + w[ 9] = 0; + w[10] = 0; + w[11] = 0; + w[12] = 0; + w[13] = 0; + w[14] = 0; + w[15] = (128 + 64) * 8; + + dgst[0] = opad[0]; + dgst[1] = opad[1]; + dgst[2] = opad[2]; + dgst[3] = opad[3]; + dgst[4] = opad[4]; + dgst[5] = opad[5]; + dgst[6] = opad[6]; + dgst[7] = opad[7]; + + sha512_transform (w, dgst); +} + +static void hmac_sha512_init (u64 w[16], u64 ipad[8], u64 opad[8]) +{ + w[ 0] ^= 0x3636363636363636; + w[ 1] ^= 0x3636363636363636; + w[ 2] ^= 0x3636363636363636; + w[ 3] ^= 0x3636363636363636; + w[ 4] ^= 0x3636363636363636; + w[ 5] ^= 0x3636363636363636; + w[ 6] ^= 0x3636363636363636; + w[ 7] ^= 0x3636363636363636; + w[ 8] ^= 0x3636363636363636; + w[ 9] ^= 0x3636363636363636; + w[10] ^= 0x3636363636363636; + w[11] ^= 0x3636363636363636; + w[12] ^= 0x3636363636363636; + w[13] ^= 0x3636363636363636; + w[14] ^= 0x3636363636363636; + w[15] ^= 0x3636363636363636; + + ipad[0] = SHA512M_A; + ipad[1] = SHA512M_B; + ipad[2] = SHA512M_C; + ipad[3] = SHA512M_D; + ipad[4] = SHA512M_E; + ipad[5] = SHA512M_F; + ipad[6] = SHA512M_G; + ipad[7] = SHA512M_H; + + sha512_transform (w, ipad); + + w[ 0] ^= 0x6a6a6a6a6a6a6a6a; + w[ 1] ^= 0x6a6a6a6a6a6a6a6a; + w[ 2] ^= 0x6a6a6a6a6a6a6a6a; + w[ 3] ^= 0x6a6a6a6a6a6a6a6a; + w[ 4] ^= 0x6a6a6a6a6a6a6a6a; + w[ 5] ^= 0x6a6a6a6a6a6a6a6a; + w[ 6] ^= 0x6a6a6a6a6a6a6a6a; + w[ 7] ^= 0x6a6a6a6a6a6a6a6a; + w[ 8] ^= 0x6a6a6a6a6a6a6a6a; + w[ 9] ^= 0x6a6a6a6a6a6a6a6a; + w[10] ^= 0x6a6a6a6a6a6a6a6a; + w[11] ^= 0x6a6a6a6a6a6a6a6a; + w[12] ^= 0x6a6a6a6a6a6a6a6a; + w[13] ^= 0x6a6a6a6a6a6a6a6a; + w[14] ^= 0x6a6a6a6a6a6a6a6a; + w[15] ^= 0x6a6a6a6a6a6a6a6a; + + opad[0] = SHA512M_A; + opad[1] = SHA512M_B; + opad[2] = SHA512M_C; + opad[3] = SHA512M_D; + opad[4] = SHA512M_E; + opad[5] = SHA512M_F; + opad[6] = SHA512M_G; + opad[7] = SHA512M_H; + + sha512_transform (w, opad); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m08200_init (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global pbkdf2_sha512_tmp_t *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global cloudkey_t *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = pws[gid].i[ 8]; + w2[1] = pws[gid].i[ 9]; + w2[2] = pws[gid].i[10]; + w2[3] = pws[gid].i[11]; + + u32x w3[4]; + + w3[0] = pws[gid].i[12]; + w3[1] = pws[gid].i[13]; + w3[2] = pws[gid].i[14]; + w3[3] = pws[gid].i[15]; + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[ 1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[ 2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[ 3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[ 4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[ 5]; + salt_buf1[2] = 0; + salt_buf1[3] = 0; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + u64 data_buf[16]; + + data_buf[ 0] = ((u64) swap_workaround (salt_buf0[ 0])) << 32 | (u64) swap_workaround (salt_buf0[ 1]); + data_buf[ 1] = ((u64) swap_workaround (salt_buf0[ 2])) << 32 | (u64) swap_workaround (salt_buf0[ 3]); + data_buf[ 2] = ((u64) swap_workaround (salt_buf1[ 0])) << 32 | (u64) swap_workaround (salt_buf1[ 1]); + data_buf[ 3] = 0; + data_buf[ 4] = 0; + data_buf[ 5] = 0; + data_buf[ 6] = 0; + data_buf[ 7] = 0; + data_buf[ 8] = 0; + data_buf[ 9] = 0; + data_buf[10] = 0; + data_buf[11] = 0; + data_buf[12] = 0; + data_buf[13] = 0; + data_buf[14] = 0; + data_buf[15] = (128 + salt_len + 4) * 8; + + u64 w[16]; + + w[ 0] = ((u64) swap_workaround (w0[0])) << 32 | (u64) swap_workaround (w0[1]); + w[ 1] = ((u64) swap_workaround (w0[2])) << 32 | (u64) swap_workaround (w0[3]); + w[ 2] = ((u64) swap_workaround (w1[0])) << 32 | (u64) swap_workaround (w1[1]); + w[ 3] = ((u64) swap_workaround (w1[2])) << 32 | (u64) swap_workaround (w1[3]); + w[ 4] = ((u64) swap_workaround (w2[0])) << 32 | (u64) swap_workaround (w2[1]); + w[ 5] = ((u64) swap_workaround (w2[2])) << 32 | (u64) swap_workaround (w2[3]); + w[ 6] = ((u64) swap_workaround (w3[0])) << 32 | (u64) swap_workaround (w3[1]); + w[ 7] = ((u64) swap_workaround (w3[2])) << 32 | (u64) swap_workaround (w3[3]); + w[ 8] = 0; + w[ 9] = 0; + w[10] = 0; + w[11] = 0; + w[12] = 0; + w[13] = 0; + w[14] = 0; + w[15] = 0; + + u64 ipad[8]; + u64 opad[8]; + + hmac_sha512_init (w, ipad, opad); + + tmps[gid].ipad[0] = ipad[0]; + tmps[gid].ipad[1] = ipad[1]; + tmps[gid].ipad[2] = ipad[2]; + tmps[gid].ipad[3] = ipad[3]; + tmps[gid].ipad[4] = ipad[4]; + tmps[gid].ipad[5] = ipad[5]; + tmps[gid].ipad[6] = ipad[6]; + tmps[gid].ipad[7] = ipad[7]; + + tmps[gid].opad[0] = opad[0]; + tmps[gid].opad[1] = opad[1]; + tmps[gid].opad[2] = opad[2]; + tmps[gid].opad[3] = opad[3]; + tmps[gid].opad[4] = opad[4]; + tmps[gid].opad[5] = opad[5]; + tmps[gid].opad[6] = opad[6]; + tmps[gid].opad[7] = opad[7]; + + for (u32 i = 0, j = 1; i < 8; i += 8, j += 1) + { + u64 dgst[8]; + + hmac_sha512_run (data_buf, ipad, opad, dgst); + + tmps[gid].dgst[i + 0] = dgst[0]; + tmps[gid].dgst[i + 1] = dgst[1]; + tmps[gid].dgst[i + 2] = dgst[2]; + tmps[gid].dgst[i + 3] = dgst[3]; + tmps[gid].dgst[i + 4] = dgst[4]; + tmps[gid].dgst[i + 5] = dgst[5]; + tmps[gid].dgst[i + 6] = dgst[6]; + tmps[gid].dgst[i + 7] = dgst[7]; + + tmps[gid].out[i + 0] = dgst[0]; + tmps[gid].out[i + 1] = dgst[1]; + tmps[gid].out[i + 2] = dgst[2]; + tmps[gid].out[i + 3] = dgst[3]; + tmps[gid].out[i + 4] = dgst[4]; + tmps[gid].out[i + 5] = dgst[5]; + tmps[gid].out[i + 6] = dgst[6]; + tmps[gid].out[i + 7] = dgst[7]; + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m08200_loop (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global pbkdf2_sha512_tmp_t *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global cloudkey_t *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u64 ipad[8]; + + ipad[0] = tmps[gid].ipad[0]; + ipad[1] = tmps[gid].ipad[1]; + ipad[2] = tmps[gid].ipad[2]; + ipad[3] = tmps[gid].ipad[3]; + ipad[4] = tmps[gid].ipad[4]; + ipad[5] = tmps[gid].ipad[5]; + ipad[6] = tmps[gid].ipad[6]; + ipad[7] = tmps[gid].ipad[7]; + + u64 opad[8]; + + opad[0] = tmps[gid].opad[0]; + opad[1] = tmps[gid].opad[1]; + opad[2] = tmps[gid].opad[2]; + opad[3] = tmps[gid].opad[3]; + opad[4] = tmps[gid].opad[4]; + opad[5] = tmps[gid].opad[5]; + opad[6] = tmps[gid].opad[6]; + opad[7] = tmps[gid].opad[7]; + + for (u32 i = 0; i < 8; i += 8) + { + u64 dgst[8]; + + dgst[0] = tmps[gid].dgst[i + 0]; + dgst[1] = tmps[gid].dgst[i + 1]; + dgst[2] = tmps[gid].dgst[i + 2]; + dgst[3] = tmps[gid].dgst[i + 3]; + dgst[4] = tmps[gid].dgst[i + 4]; + dgst[5] = tmps[gid].dgst[i + 5]; + dgst[6] = tmps[gid].dgst[i + 6]; + dgst[7] = tmps[gid].dgst[i + 7]; + + u64 out[8]; + + out[0] = tmps[gid].out[i + 0]; + out[1] = tmps[gid].out[i + 1]; + out[2] = tmps[gid].out[i + 2]; + out[3] = tmps[gid].out[i + 3]; + out[4] = tmps[gid].out[i + 4]; + out[5] = tmps[gid].out[i + 5]; + out[6] = tmps[gid].out[i + 6]; + out[7] = tmps[gid].out[i + 7]; + + for (u32 j = 0; j < loop_cnt; j++) + { + u64 w[16]; + + w[ 0] = dgst[0]; + w[ 1] = dgst[1]; + w[ 2] = dgst[2]; + w[ 3] = dgst[3]; + w[ 4] = dgst[4]; + w[ 5] = dgst[5]; + w[ 6] = dgst[6]; + w[ 7] = dgst[7]; + w[ 8] = 0x8000000000000000; + w[ 9] = 0; + w[10] = 0; + w[11] = 0; + w[12] = 0; + w[13] = 0; + w[14] = 0; + w[15] = (128 + 64) * 8; + + hmac_sha512_run (w, ipad, opad, dgst); + + out[0] ^= dgst[0]; + out[1] ^= dgst[1]; + out[2] ^= dgst[2]; + out[3] ^= dgst[3]; + out[4] ^= dgst[4]; + out[5] ^= dgst[5]; + out[6] ^= dgst[6]; + out[7] ^= dgst[7]; + } + + tmps[gid].dgst[i + 0] = dgst[0]; + tmps[gid].dgst[i + 1] = dgst[1]; + tmps[gid].dgst[i + 2] = dgst[2]; + tmps[gid].dgst[i + 3] = dgst[3]; + tmps[gid].dgst[i + 4] = dgst[4]; + tmps[gid].dgst[i + 5] = dgst[5]; + tmps[gid].dgst[i + 6] = dgst[6]; + tmps[gid].dgst[i + 7] = dgst[7]; + + tmps[gid].out[i + 0] = out[0]; + tmps[gid].out[i + 1] = out[1]; + tmps[gid].out[i + 2] = out[2]; + tmps[gid].out[i + 3] = out[3]; + tmps[gid].out[i + 4] = out[4]; + tmps[gid].out[i + 5] = out[5]; + tmps[gid].out[i + 6] = out[6]; + tmps[gid].out[i + 7] = out[7]; + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m08200_comp (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global pbkdf2_sha512_tmp_t *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global cloudkey_t *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + const u32 lid = get_local_id (0); + + u32 w0[4]; + u32 w1[4]; + u32 w2[4]; + u32 w3[4]; + + w0[0] = tmps[gid].out[4] >> 32; + w0[1] = tmps[gid].out[4] & 0xffffffff; + w0[2] = tmps[gid].out[5] >> 32; + w0[3] = tmps[gid].out[5] & 0xffffffff; + w1[0] = tmps[gid].out[6] >> 32; + w1[1] = tmps[gid].out[6] & 0xffffffff; + w1[2] = tmps[gid].out[7] >> 32; + w1[3] = tmps[gid].out[7] & 0xffffffff; + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + u32 ipad[8]; + u32 opad[8]; + + hmac_sha256_pad (w0, w1, w2, w3, ipad, opad); + + int size = esalt_bufs[salt_pos].data_len; + + int left; + int off; + + for (left = size, off = 0; left >= 56; left -= 64, off += 16) + { + w0[0] = esalt_bufs[salt_pos].data_buf[off + 0]; + w0[1] = esalt_bufs[salt_pos].data_buf[off + 1]; + w0[2] = esalt_bufs[salt_pos].data_buf[off + 2]; + w0[3] = esalt_bufs[salt_pos].data_buf[off + 3]; + w1[0] = esalt_bufs[salt_pos].data_buf[off + 4]; + w1[1] = esalt_bufs[salt_pos].data_buf[off + 5]; + w1[2] = esalt_bufs[salt_pos].data_buf[off + 6]; + w1[3] = esalt_bufs[salt_pos].data_buf[off + 7]; + w2[0] = esalt_bufs[salt_pos].data_buf[off + 8]; + w2[1] = esalt_bufs[salt_pos].data_buf[off + 9]; + w2[2] = esalt_bufs[salt_pos].data_buf[off + 10]; + w2[3] = esalt_bufs[salt_pos].data_buf[off + 11]; + w3[0] = esalt_bufs[salt_pos].data_buf[off + 12]; + w3[1] = esalt_bufs[salt_pos].data_buf[off + 13]; + w3[2] = esalt_bufs[salt_pos].data_buf[off + 14]; + w3[3] = esalt_bufs[salt_pos].data_buf[off + 15]; + + sha256_transform (w0, w1, w2, w3, ipad); + } + + w0[0] = esalt_bufs[salt_pos].data_buf[off + 0]; + w0[1] = esalt_bufs[salt_pos].data_buf[off + 1]; + w0[2] = esalt_bufs[salt_pos].data_buf[off + 2]; + w0[3] = esalt_bufs[salt_pos].data_buf[off + 3]; + w1[0] = esalt_bufs[salt_pos].data_buf[off + 4]; + w1[1] = esalt_bufs[salt_pos].data_buf[off + 5]; + w1[2] = esalt_bufs[salt_pos].data_buf[off + 6]; + w1[3] = esalt_bufs[salt_pos].data_buf[off + 7]; + w2[0] = esalt_bufs[salt_pos].data_buf[off + 8]; + w2[1] = esalt_bufs[salt_pos].data_buf[off + 9]; + w2[2] = esalt_bufs[salt_pos].data_buf[off + 10]; + w2[3] = esalt_bufs[salt_pos].data_buf[off + 11]; + w3[0] = esalt_bufs[salt_pos].data_buf[off + 12]; + w3[1] = esalt_bufs[salt_pos].data_buf[off + 13]; + w3[2] = 0; + w3[3] = (64 + size) * 8; + + u32x digest[8]; + + hmac_sha256_run (w0, w1, w2, w3, ipad, opad, digest); + + const u32x r0 = digest[0]; + const u32x r1 = digest[1]; + const u32x r2 = digest[2]; + const u32x r3 = digest[3]; + + #define il_pos 0 + + #include VECT_COMPARE_M +} diff --git a/amd/m08300_a0.cl b/amd/m08300_a0.cl new file mode 100644 index 0000000000..bf7979eefb --- /dev/null +++ b/amd/m08300_a0.cl @@ -0,0 +1,779 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _SHA1_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW4 +#define VECT_SIZE4 +#endif + +#ifdef VLIW5 +#define VECT_SIZE2 +#endif + +#define DGST_R0 3 +#define DGST_R1 4 +#define DGST_R2 2 +#define DGST_R3 1 + +#include "include/kernel_functions.c" +#include "types_amd.c" +#include "common_amd.c" +#include "include/rp_gpu.h" +#include "rp_amd.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +static void sha1_transform (const u32x w0[4], const u32x w1[4], const u32x w2[4], const u32x w3[4], u32x digest[5]) +{ + u32x A = digest[0]; + u32x B = digest[1]; + u32x C = digest[2]; + u32x D = digest[3]; + u32x E = digest[4]; + + u32x w0_t = w0[0]; + u32x w1_t = w0[1]; + u32x w2_t = w0[2]; + u32x w3_t = w0[3]; + u32x w4_t = w1[0]; + u32x w5_t = w1[1]; + u32x w6_t = w1[2]; + u32x w7_t = w1[3]; + u32x w8_t = w2[0]; + u32x w9_t = w2[1]; + u32x wa_t = w2[2]; + u32x wb_t = w2[3]; + u32x wc_t = w3[0]; + u32x wd_t = w3[1]; + u32x we_t = w3[2]; + u32x wf_t = w3[3]; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, A, B, C, D, E, w0_t); + SHA1_STEP (SHA1_F0o, E, A, B, C, D, w1_t); + SHA1_STEP (SHA1_F0o, D, E, A, B, C, w2_t); + SHA1_STEP (SHA1_F0o, C, D, E, A, B, w3_t); + SHA1_STEP (SHA1_F0o, B, C, D, E, A, w4_t); + SHA1_STEP (SHA1_F0o, A, B, C, D, E, w5_t); + SHA1_STEP (SHA1_F0o, E, A, B, C, D, w6_t); + SHA1_STEP (SHA1_F0o, D, E, A, B, C, w7_t); + SHA1_STEP (SHA1_F0o, C, D, E, A, B, w8_t); + SHA1_STEP (SHA1_F0o, B, C, D, E, A, w9_t); + SHA1_STEP (SHA1_F0o, A, B, C, D, E, wa_t); + SHA1_STEP (SHA1_F0o, E, A, B, C, D, wb_t); + SHA1_STEP (SHA1_F0o, D, E, A, B, C, wc_t); + SHA1_STEP (SHA1_F0o, C, D, E, A, B, wd_t); + SHA1_STEP (SHA1_F0o, B, C, D, E, A, we_t); + SHA1_STEP (SHA1_F0o, A, B, C, D, E, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F0o, E, A, B, C, D, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F0o, D, E, A, B, C, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F0o, C, D, E, A, B, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F0o, B, C, D, E, A, w3_t); + + #undef K + #define K SHA1C01 + + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w7_t); + + #undef K + #define K SHA1C02 + + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, wb_t); + + #undef K + #define K SHA1C03 + + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, wf_t); + + digest[0] += A; + digest[1] += B; + digest[2] += C; + digest[3] += D; + digest[4] += E; +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m08300_m04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + u32x pw_buf1[4]; + + pw_buf1[0] = pws[gid].i[ 4]; + pw_buf1[1] = pws[gid].i[ 5]; + pw_buf1[2] = pws[gid].i[ 6]; + pw_buf1[3] = pws[gid].i[ 7]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * salt + */ + + const u32 salt_iter = salt_bufs[salt_pos].salt_iter; + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[ 1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[ 2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[ 3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[ 4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[ 5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[ 6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[ 7]; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + u32 domain_buf0[4]; + + domain_buf0[0] = salt_bufs[salt_pos].salt_buf_pc[ 0]; + domain_buf0[1] = salt_bufs[salt_pos].salt_buf_pc[ 1]; + domain_buf0[2] = salt_bufs[salt_pos].salt_buf_pc[ 2]; + domain_buf0[3] = salt_bufs[salt_pos].salt_buf_pc[ 3]; + + u32 domain_buf1[4]; + + domain_buf1[0] = salt_bufs[salt_pos].salt_buf_pc[ 4]; + domain_buf1[1] = salt_bufs[salt_pos].salt_buf_pc[ 5]; + domain_buf1[2] = salt_bufs[salt_pos].salt_buf_pc[ 6]; + domain_buf1[3] = 0; + + const u32 domain_len = salt_bufs[salt_pos].salt_buf_pc[ 7]; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + u32x w1[4]; + u32x w2[4]; + u32x w3[4]; + + w0[0] = pw_buf0[0]; + w0[1] = pw_buf0[1]; + w0[2] = pw_buf0[2]; + w0[3] = pw_buf0[3]; + w1[0] = pw_buf1[0]; + w1[1] = pw_buf1[1]; + w1[2] = pw_buf1[2]; + w1[3] = pw_buf1[3]; + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 out_len = apply_rules (rules_buf[il_pos].cmds, w0, w1, pw_len); + + u32x w0_t[4]; + + w0_t[0] = w0[0]; + w0_t[1] = w0[1]; + w0_t[2] = w0[2]; + w0_t[3] = w0[3]; + + u32x w1_t[4]; + + w1_t[0] = w1[0]; + w1_t[1] = w1[1]; + w1_t[2] = w1[2]; + w1_t[3] = w1[3]; + + u32x w2_t[4]; + + w2_t[0] = w2[0]; + w2_t[1] = w2[1]; + w2_t[2] = w2[2]; + w2_t[3] = w2[3]; + + u32x w3_t[4]; + + w3_t[0] = w3[0]; + w3_t[1] = w3[1]; + w3_t[2] = w3[2]; + w3_t[3] = w3[3]; + + switch_buffer_by_offset (w0_t, w1_t, w2_t, w3_t, 1); + + w0_t[0] |= pw_len & 0xff; + + /** + * salt + */ + + u32 s0[4]; + + s0[0] = salt_buf0[0]; + s0[1] = salt_buf0[1]; + s0[2] = salt_buf0[2]; + s0[3] = salt_buf0[3]; + + u32 s1[4]; + + s1[0] = salt_buf1[0]; + s1[1] = salt_buf1[1]; + s1[2] = salt_buf1[2]; + s1[3] = salt_buf1[3]; + + u32 s2[4]; + + s2[0] = 0; + s2[1] = 0; + s2[2] = 0; + s2[3] = 0; + + u32 s3[4]; + + s3[0] = 0; + s3[1] = 0; + s3[2] = 0; + s3[3] = 0; + + switch_buffer_by_offset (s0, s1, s2, s3, 1 + out_len + domain_len + 1); + + u32 d0[4]; + + d0[0] = domain_buf0[0]; + d0[1] = domain_buf0[1]; + d0[2] = domain_buf0[2]; + d0[3] = domain_buf0[3]; + + u32 d1[4]; + + d1[0] = domain_buf1[0]; + d1[1] = domain_buf1[1]; + d1[2] = domain_buf1[2]; + d1[3] = 0; + + u32 d2[4]; + + d2[0] = 0; + d2[1] = 0; + d2[2] = 0; + d2[3] = 0; + + u32 d3[4]; + + d3[0] = 0; + d3[1] = 0; + d3[2] = 0; + d3[3] = 0; + + switch_buffer_by_offset (d0, d1, d2, d3, 1 + out_len); + + /** + * sha1 + */ + + u32x w0_t2[4]; + + w0_t2[0] = swap_workaround (w0_t[0] | d0[0] | s0[0]); + w0_t2[1] = swap_workaround (w0_t[1] | d0[1] | s0[1]); + w0_t2[2] = swap_workaround (w0_t[2] | d0[2] | s0[2]); + w0_t2[3] = swap_workaround (w0_t[3] | d0[3] | s0[3]); + + u32x w1_t2[4]; + + w1_t2[0] = swap_workaround (w1_t[0] | d1[0] | s1[0]); + w1_t2[1] = swap_workaround (w1_t[1] | d1[1] | s1[1]); + w1_t2[2] = swap_workaround (w1_t[2] | d1[2] | s1[2]); + w1_t2[3] = swap_workaround (w1_t[3] | d1[3] | s1[3]); + + u32x w2_t2[4]; + + w2_t2[0] = swap_workaround (w2_t[0] | d2[0] | s2[0]); + w2_t2[1] = swap_workaround (w2_t[1] | d2[1] | s2[1]); + w2_t2[2] = swap_workaround (w2_t[2] | d2[2] | s2[2]); + w2_t2[3] = swap_workaround (w2_t[3] | d2[3] | s2[3]); + + u32x w3_t2[4]; + + w3_t2[0] = swap_workaround (w3_t[0] | d3[0] | s3[0]); + w3_t2[1] = swap_workaround (w3_t[1] | d3[1] | s3[1]); + w3_t2[2] = 0; + w3_t2[3] = (1 + out_len + domain_len + 1 + salt_len) * 8; + + u32x digest[5]; + + digest[0] = SHA1M_A; + digest[1] = SHA1M_B; + digest[2] = SHA1M_C; + digest[3] = SHA1M_D; + digest[4] = SHA1M_E; + + sha1_transform (w0_t2, w1_t2, w2_t2, w3_t2, digest); + + // iterations + + for (u32 i = 0; i < salt_iter; i++) + { + u32x w0_t3[4]; + + w0_t3[0] = digest[0]; + w0_t3[1] = digest[1]; + w0_t3[2] = digest[2]; + w0_t3[3] = digest[3]; + + u32x w1_t3[4]; + + w1_t3[0] = digest[4]; + w1_t3[1] = swap_workaround (salt_buf0[0]); + w1_t3[2] = swap_workaround (salt_buf0[1]); + w1_t3[3] = swap_workaround (salt_buf0[2]); + + u32x w2_t3[4]; + + w2_t3[0] = swap_workaround (salt_buf0[3]); + w2_t3[1] = swap_workaround (salt_buf1[0]); + w2_t3[2] = swap_workaround (salt_buf1[1]); + w2_t3[3] = swap_workaround (salt_buf1[2]); + + u32x w3_t3[4]; + + w3_t3[0] = swap_workaround (salt_buf1[3]); + w3_t3[1] = 0; + w3_t3[2] = 0; + w3_t3[3] = (20 + salt_len) * 8; + + digest[0] = SHA1M_A; + digest[1] = SHA1M_B; + digest[2] = SHA1M_C; + digest[3] = SHA1M_D; + digest[4] = SHA1M_E; + + sha1_transform (w0_t3, w1_t3, w2_t3, w3_t3, digest); + } + + const u32x r0 = digest[3]; + const u32x r1 = digest[4]; + const u32x r2 = digest[2]; + const u32x r3 = digest[1]; + + #include VECT_COMPARE_M + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m08300_m08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m08300_m16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m08300_s04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + u32x pw_buf1[4]; + + pw_buf1[0] = pws[gid].i[ 4]; + pw_buf1[1] = pws[gid].i[ 5]; + pw_buf1[2] = pws[gid].i[ 6]; + pw_buf1[3] = pws[gid].i[ 7]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * salt + */ + + const u32 salt_iter = salt_bufs[salt_pos].salt_iter; + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[ 1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[ 2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[ 3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[ 4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[ 5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[ 6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[ 7]; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + u32 domain_buf0[4]; + + domain_buf0[0] = salt_bufs[salt_pos].salt_buf_pc[ 0]; + domain_buf0[1] = salt_bufs[salt_pos].salt_buf_pc[ 1]; + domain_buf0[2] = salt_bufs[salt_pos].salt_buf_pc[ 2]; + domain_buf0[3] = salt_bufs[salt_pos].salt_buf_pc[ 3]; + + u32 domain_buf1[4]; + + domain_buf1[0] = salt_bufs[salt_pos].salt_buf_pc[ 4]; + domain_buf1[1] = salt_bufs[salt_pos].salt_buf_pc[ 5]; + domain_buf1[2] = salt_bufs[salt_pos].salt_buf_pc[ 6]; + domain_buf1[3] = 0; + + const u32 domain_len = salt_bufs[salt_pos].salt_buf_pc[ 7]; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + u32x w1[4]; + u32x w2[4]; + u32x w3[4]; + + w0[0] = pw_buf0[0]; + w0[1] = pw_buf0[1]; + w0[2] = pw_buf0[2]; + w0[3] = pw_buf0[3]; + w1[0] = pw_buf1[0]; + w1[1] = pw_buf1[1]; + w1[2] = pw_buf1[2]; + w1[3] = pw_buf1[3]; + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 out_len = apply_rules (rules_buf[il_pos].cmds, w0, w1, pw_len); + + u32x w0_t[4]; + + w0_t[0] = w0[0]; + w0_t[1] = w0[1]; + w0_t[2] = w0[2]; + w0_t[3] = w0[3]; + + u32x w1_t[4]; + + w1_t[0] = w1[0]; + w1_t[1] = w1[1]; + w1_t[2] = w1[2]; + w1_t[3] = w1[3]; + + u32x w2_t[4]; + + w2_t[0] = w2[0]; + w2_t[1] = w2[1]; + w2_t[2] = w2[2]; + w2_t[3] = w2[3]; + + u32x w3_t[4]; + + w3_t[0] = w3[0]; + w3_t[1] = w3[1]; + w3_t[2] = w3[2]; + w3_t[3] = w3[3]; + + switch_buffer_by_offset (w0_t, w1_t, w2_t, w3_t, 1); + + w0_t[0] |= pw_len & 0xff; + + /** + * salt + */ + + u32 s0[4]; + + s0[0] = salt_buf0[0]; + s0[1] = salt_buf0[1]; + s0[2] = salt_buf0[2]; + s0[3] = salt_buf0[3]; + + u32 s1[4]; + + s1[0] = salt_buf1[0]; + s1[1] = salt_buf1[1]; + s1[2] = salt_buf1[2]; + s1[3] = salt_buf1[3]; + + u32 s2[4]; + + s2[0] = 0; + s2[1] = 0; + s2[2] = 0; + s2[3] = 0; + + u32 s3[4]; + + s3[0] = 0; + s3[1] = 0; + s3[2] = 0; + s3[3] = 0; + + switch_buffer_by_offset (s0, s1, s2, s3, 1 + out_len + domain_len + 1); + + u32 d0[4]; + + d0[0] = domain_buf0[0]; + d0[1] = domain_buf0[1]; + d0[2] = domain_buf0[2]; + d0[3] = domain_buf0[3]; + + u32 d1[4]; + + d1[0] = domain_buf1[0]; + d1[1] = domain_buf1[1]; + d1[2] = domain_buf1[2]; + d1[3] = 0; + + u32 d2[4]; + + d2[0] = 0; + d2[1] = 0; + d2[2] = 0; + d2[3] = 0; + + u32 d3[4]; + + d3[0] = 0; + d3[1] = 0; + d3[2] = 0; + d3[3] = 0; + + switch_buffer_by_offset (d0, d1, d2, d3, 1 + out_len); + + /** + * sha1 + */ + + u32x w0_t2[4]; + + w0_t2[0] = swap_workaround (w0_t[0] | d0[0] | s0[0]); + w0_t2[1] = swap_workaround (w0_t[1] | d0[1] | s0[1]); + w0_t2[2] = swap_workaround (w0_t[2] | d0[2] | s0[2]); + w0_t2[3] = swap_workaround (w0_t[3] | d0[3] | s0[3]); + + u32x w1_t2[4]; + + w1_t2[0] = swap_workaround (w1_t[0] | d1[0] | s1[0]); + w1_t2[1] = swap_workaround (w1_t[1] | d1[1] | s1[1]); + w1_t2[2] = swap_workaround (w1_t[2] | d1[2] | s1[2]); + w1_t2[3] = swap_workaround (w1_t[3] | d1[3] | s1[3]); + + u32x w2_t2[4]; + + w2_t2[0] = swap_workaround (w2_t[0] | d2[0] | s2[0]); + w2_t2[1] = swap_workaround (w2_t[1] | d2[1] | s2[1]); + w2_t2[2] = swap_workaround (w2_t[2] | d2[2] | s2[2]); + w2_t2[3] = swap_workaround (w2_t[3] | d2[3] | s2[3]); + + u32x w3_t2[4]; + + w3_t2[0] = swap_workaround (w3_t[0] | d3[0] | s3[0]); + w3_t2[1] = swap_workaround (w3_t[1] | d3[1] | s3[1]); + w3_t2[2] = 0; + w3_t2[3] = (1 + out_len + domain_len + 1 + salt_len) * 8; + + u32x digest[5]; + + digest[0] = SHA1M_A; + digest[1] = SHA1M_B; + digest[2] = SHA1M_C; + digest[3] = SHA1M_D; + digest[4] = SHA1M_E; + + sha1_transform (w0_t2, w1_t2, w2_t2, w3_t2, digest); + + // iterations + + for (u32 i = 0; i < salt_iter; i++) + { + u32x w0_t3[4]; + + w0_t3[0] = digest[0]; + w0_t3[1] = digest[1]; + w0_t3[2] = digest[2]; + w0_t3[3] = digest[3]; + + u32x w1_t3[4]; + + w1_t3[0] = digest[4]; + w1_t3[1] = swap_workaround (salt_buf0[0]); + w1_t3[2] = swap_workaround (salt_buf0[1]); + w1_t3[3] = swap_workaround (salt_buf0[2]); + + u32x w2_t3[4]; + + w2_t3[0] = swap_workaround (salt_buf0[3]); + w2_t3[1] = swap_workaround (salt_buf1[0]); + w2_t3[2] = swap_workaround (salt_buf1[1]); + w2_t3[3] = swap_workaround (salt_buf1[2]); + + u32x w3_t3[4]; + + w3_t3[0] = swap_workaround (salt_buf1[3]); + w3_t3[1] = 0; + w3_t3[2] = 0; + w3_t3[3] = (20 + salt_len) * 8; + + digest[0] = SHA1M_A; + digest[1] = SHA1M_B; + digest[2] = SHA1M_C; + digest[3] = SHA1M_D; + digest[4] = SHA1M_E; + + sha1_transform (w0_t3, w1_t3, w2_t3, w3_t3, digest); + } + + const u32x r0 = digest[3]; + const u32x r1 = digest[4]; + const u32x r2 = digest[2]; + const u32x r3 = digest[1]; + + #include VECT_COMPARE_S + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m08300_s08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m08300_s16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/amd/m08300_a1.cl b/amd/m08300_a1.cl new file mode 100644 index 0000000000..0c400c84a6 --- /dev/null +++ b/amd/m08300_a1.cl @@ -0,0 +1,873 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _SHA1_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW4 +#define VECT_SIZE4 +#endif + +#ifdef VLIW5 +#define VECT_SIZE2 +#endif + +#define DGST_R0 3 +#define DGST_R1 4 +#define DGST_R2 2 +#define DGST_R3 1 + +#include "include/kernel_functions.c" +#include "types_amd.c" +#include "common_amd.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +static void sha1_transform (const u32x w0[4], const u32x w1[4], const u32x w2[4], const u32x w3[4], u32x digest[5]) +{ + u32x A = digest[0]; + u32x B = digest[1]; + u32x C = digest[2]; + u32x D = digest[3]; + u32x E = digest[4]; + + u32x w0_t = w0[0]; + u32x w1_t = w0[1]; + u32x w2_t = w0[2]; + u32x w3_t = w0[3]; + u32x w4_t = w1[0]; + u32x w5_t = w1[1]; + u32x w6_t = w1[2]; + u32x w7_t = w1[3]; + u32x w8_t = w2[0]; + u32x w9_t = w2[1]; + u32x wa_t = w2[2]; + u32x wb_t = w2[3]; + u32x wc_t = w3[0]; + u32x wd_t = w3[1]; + u32x we_t = w3[2]; + u32x wf_t = w3[3]; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, A, B, C, D, E, w0_t); + SHA1_STEP (SHA1_F0o, E, A, B, C, D, w1_t); + SHA1_STEP (SHA1_F0o, D, E, A, B, C, w2_t); + SHA1_STEP (SHA1_F0o, C, D, E, A, B, w3_t); + SHA1_STEP (SHA1_F0o, B, C, D, E, A, w4_t); + SHA1_STEP (SHA1_F0o, A, B, C, D, E, w5_t); + SHA1_STEP (SHA1_F0o, E, A, B, C, D, w6_t); + SHA1_STEP (SHA1_F0o, D, E, A, B, C, w7_t); + SHA1_STEP (SHA1_F0o, C, D, E, A, B, w8_t); + SHA1_STEP (SHA1_F0o, B, C, D, E, A, w9_t); + SHA1_STEP (SHA1_F0o, A, B, C, D, E, wa_t); + SHA1_STEP (SHA1_F0o, E, A, B, C, D, wb_t); + SHA1_STEP (SHA1_F0o, D, E, A, B, C, wc_t); + SHA1_STEP (SHA1_F0o, C, D, E, A, B, wd_t); + SHA1_STEP (SHA1_F0o, B, C, D, E, A, we_t); + SHA1_STEP (SHA1_F0o, A, B, C, D, E, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F0o, E, A, B, C, D, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F0o, D, E, A, B, C, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F0o, C, D, E, A, B, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F0o, B, C, D, E, A, w3_t); + + #undef K + #define K SHA1C01 + + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w7_t); + + #undef K + #define K SHA1C02 + + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, wb_t); + + #undef K + #define K SHA1C03 + + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, wf_t); + + digest[0] += A; + digest[1] += B; + digest[2] += C; + digest[3] += D; + digest[4] += E; +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m08300_m04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, combs_buf[0].pw_len); + } + + /** + * salt + */ + + const u32 salt_iter = salt_bufs[salt_pos].salt_iter; + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[ 1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[ 2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[ 3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[ 4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[ 5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[ 6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[ 7]; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + u32 domain_buf0[4]; + + domain_buf0[0] = salt_bufs[salt_pos].salt_buf_pc[ 0]; + domain_buf0[1] = salt_bufs[salt_pos].salt_buf_pc[ 1]; + domain_buf0[2] = salt_bufs[salt_pos].salt_buf_pc[ 2]; + domain_buf0[3] = salt_bufs[salt_pos].salt_buf_pc[ 3]; + + u32 domain_buf1[4]; + + domain_buf1[0] = salt_bufs[salt_pos].salt_buf_pc[ 4]; + domain_buf1[1] = salt_bufs[salt_pos].salt_buf_pc[ 5]; + domain_buf1[2] = salt_bufs[salt_pos].salt_buf_pc[ 6]; + domain_buf1[3] = 0; + + const u32 domain_len = salt_bufs[salt_pos].salt_buf_pc[ 7]; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = combs_buf[il_pos].pw_len; + + const u32 pw_len = pw_l_len + pw_r_len; + + u32 wordr0[4]; + u32 wordr1[4]; + u32 wordr2[4]; + u32 wordr3[4]; + + wordr0[0] = combs_buf[il_pos].i[0]; + wordr0[1] = combs_buf[il_pos].i[1]; + wordr0[2] = combs_buf[il_pos].i[2]; + wordr0[3] = combs_buf[il_pos].i[3]; + wordr1[0] = combs_buf[il_pos].i[4]; + wordr1[1] = combs_buf[il_pos].i[5]; + wordr1[2] = combs_buf[il_pos].i[6]; + wordr1[3] = combs_buf[il_pos].i[7]; + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + u32x w0[4]; + u32x w1[4]; + u32x w2[4]; + u32x w3[4]; + + w0[0] = wordl0[0] | wordr0[0]; + w0[1] = wordl0[1] | wordr0[1]; + w0[2] = wordl0[2] | wordr0[2]; + w0[3] = wordl0[3] | wordr0[3]; + w1[0] = wordl1[0] | wordr1[0]; + w1[1] = wordl1[1] | wordr1[1]; + w1[2] = wordl1[2] | wordr1[2]; + w1[3] = wordl1[3] | wordr1[3]; + w2[0] = wordl2[0] | wordr2[0]; + w2[1] = wordl2[1] | wordr2[1]; + w2[2] = wordl2[2] | wordr2[2]; + w2[3] = wordl2[3] | wordr2[3]; + w3[0] = wordl3[0] | wordr3[0]; + w3[1] = wordl3[1] | wordr3[1]; + w3[2] = wordl3[2] | wordr3[2]; + w3[3] = wordl3[3] | wordr3[3]; + + u32x w0_t[4]; + + w0_t[0] = w0[0]; + w0_t[1] = w0[1]; + w0_t[2] = w0[2]; + w0_t[3] = w0[3]; + + u32x w1_t[4]; + + w1_t[0] = w1[0]; + w1_t[1] = w1[1]; + w1_t[2] = w1[2]; + w1_t[3] = w1[3]; + + u32x w2_t[4]; + + w2_t[0] = w2[0]; + w2_t[1] = w2[1]; + w2_t[2] = w2[2]; + w2_t[3] = w2[3]; + + u32x w3_t[4]; + + w3_t[0] = w3[0]; + w3_t[1] = w3[1]; + w3_t[2] = w3[2]; + w3_t[3] = w3[3]; + + switch_buffer_by_offset (w0_t, w1_t, w2_t, w3_t, 1); + + w0_t[0] |= pw_len & 0xff; + + /** + * salt + */ + + u32 s0[4]; + + s0[0] = salt_buf0[0]; + s0[1] = salt_buf0[1]; + s0[2] = salt_buf0[2]; + s0[3] = salt_buf0[3]; + + u32 s1[4]; + + s1[0] = salt_buf1[0]; + s1[1] = salt_buf1[1]; + s1[2] = salt_buf1[2]; + s1[3] = salt_buf1[3]; + + u32 s2[4]; + + s2[0] = 0; + s2[1] = 0; + s2[2] = 0; + s2[3] = 0; + + u32 s3[4]; + + s3[0] = 0; + s3[1] = 0; + s3[2] = 0; + s3[3] = 0; + + switch_buffer_by_offset (s0, s1, s2, s3, 1 + pw_len + domain_len + 1); + + u32 d0[4]; + + d0[0] = domain_buf0[0]; + d0[1] = domain_buf0[1]; + d0[2] = domain_buf0[2]; + d0[3] = domain_buf0[3]; + + u32 d1[4]; + + d1[0] = domain_buf1[0]; + d1[1] = domain_buf1[1]; + d1[2] = domain_buf1[2]; + d1[3] = 0; + + u32 d2[4]; + + d2[0] = 0; + d2[1] = 0; + d2[2] = 0; + d2[3] = 0; + + u32 d3[4]; + + d3[0] = 0; + d3[1] = 0; + d3[2] = 0; + d3[3] = 0; + + switch_buffer_by_offset (d0, d1, d2, d3, 1 + pw_len); + + /** + * sha1 + */ + + u32x w0_t2[4]; + + w0_t2[0] = swap_workaround (w0_t[0] | d0[0] | s0[0]); + w0_t2[1] = swap_workaround (w0_t[1] | d0[1] | s0[1]); + w0_t2[2] = swap_workaround (w0_t[2] | d0[2] | s0[2]); + w0_t2[3] = swap_workaround (w0_t[3] | d0[3] | s0[3]); + + u32x w1_t2[4]; + + w1_t2[0] = swap_workaround (w1_t[0] | d1[0] | s1[0]); + w1_t2[1] = swap_workaround (w1_t[1] | d1[1] | s1[1]); + w1_t2[2] = swap_workaround (w1_t[2] | d1[2] | s1[2]); + w1_t2[3] = swap_workaround (w1_t[3] | d1[3] | s1[3]); + + u32x w2_t2[4]; + + w2_t2[0] = swap_workaround (w2_t[0] | d2[0] | s2[0]); + w2_t2[1] = swap_workaround (w2_t[1] | d2[1] | s2[1]); + w2_t2[2] = swap_workaround (w2_t[2] | d2[2] | s2[2]); + w2_t2[3] = swap_workaround (w2_t[3] | d2[3] | s2[3]); + + u32x w3_t2[4]; + + w3_t2[0] = swap_workaround (w3_t[0] | d3[0] | s3[0]); + w3_t2[1] = swap_workaround (w3_t[1] | d3[1] | s3[1]); + w3_t2[2] = 0; + w3_t2[3] = (1 + pw_len + domain_len + 1 + salt_len) * 8; + + u32x digest[5]; + + digest[0] = SHA1M_A; + digest[1] = SHA1M_B; + digest[2] = SHA1M_C; + digest[3] = SHA1M_D; + digest[4] = SHA1M_E; + + sha1_transform (w0_t2, w1_t2, w2_t2, w3_t2, digest); + + // iterations + + for (u32 i = 0; i < salt_iter; i++) + { + u32x w0_t3[4]; + + w0_t3[0] = digest[0]; + w0_t3[1] = digest[1]; + w0_t3[2] = digest[2]; + w0_t3[3] = digest[3]; + + u32x w1_t3[4]; + + w1_t3[0] = digest[4]; + w1_t3[1] = swap_workaround (salt_buf0[0]); + w1_t3[2] = swap_workaround (salt_buf0[1]); + w1_t3[3] = swap_workaround (salt_buf0[2]); + + u32x w2_t3[4]; + + w2_t3[0] = swap_workaround (salt_buf0[3]); + w2_t3[1] = swap_workaround (salt_buf1[0]); + w2_t3[2] = swap_workaround (salt_buf1[1]); + w2_t3[3] = swap_workaround (salt_buf1[2]); + + u32x w3_t3[4]; + + w3_t3[0] = swap_workaround (salt_buf1[3]); + w3_t3[1] = 0; + w3_t3[2] = 0; + w3_t3[3] = (20 + salt_len) * 8; + + digest[0] = SHA1M_A; + digest[1] = SHA1M_B; + digest[2] = SHA1M_C; + digest[3] = SHA1M_D; + digest[4] = SHA1M_E; + + sha1_transform (w0_t3, w1_t3, w2_t3, w3_t3, digest); + } + + const u32x r0 = digest[3]; + const u32x r1 = digest[4]; + const u32x r2 = digest[2]; + const u32x r3 = digest[1]; + + #include VECT_COMPARE_M + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m08300_m08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m08300_m16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m08300_s04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, combs_buf[0].pw_len); + } + + /** + * salt + */ + + const u32 salt_iter = salt_bufs[salt_pos].salt_iter; + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[ 1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[ 2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[ 3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[ 4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[ 5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[ 6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[ 7]; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + u32 domain_buf0[4]; + + domain_buf0[0] = salt_bufs[salt_pos].salt_buf_pc[ 0]; + domain_buf0[1] = salt_bufs[salt_pos].salt_buf_pc[ 1]; + domain_buf0[2] = salt_bufs[salt_pos].salt_buf_pc[ 2]; + domain_buf0[3] = salt_bufs[salt_pos].salt_buf_pc[ 3]; + + u32 domain_buf1[4]; + + domain_buf1[0] = salt_bufs[salt_pos].salt_buf_pc[ 4]; + domain_buf1[1] = salt_bufs[salt_pos].salt_buf_pc[ 5]; + domain_buf1[2] = salt_bufs[salt_pos].salt_buf_pc[ 6]; + domain_buf1[3] = 0; + + const u32 domain_len = salt_bufs[salt_pos].salt_buf_pc[ 7]; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = combs_buf[il_pos].pw_len; + + const u32 pw_len = pw_l_len + pw_r_len; + + u32 wordr0[4]; + u32 wordr1[4]; + u32 wordr2[4]; + u32 wordr3[4]; + + wordr0[0] = combs_buf[il_pos].i[0]; + wordr0[1] = combs_buf[il_pos].i[1]; + wordr0[2] = combs_buf[il_pos].i[2]; + wordr0[3] = combs_buf[il_pos].i[3]; + wordr1[0] = combs_buf[il_pos].i[4]; + wordr1[1] = combs_buf[il_pos].i[5]; + wordr1[2] = combs_buf[il_pos].i[6]; + wordr1[3] = combs_buf[il_pos].i[7]; + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + u32x w0[4]; + u32x w1[4]; + u32x w2[4]; + u32x w3[4]; + + w0[0] = wordl0[0] | wordr0[0]; + w0[1] = wordl0[1] | wordr0[1]; + w0[2] = wordl0[2] | wordr0[2]; + w0[3] = wordl0[3] | wordr0[3]; + w1[0] = wordl1[0] | wordr1[0]; + w1[1] = wordl1[1] | wordr1[1]; + w1[2] = wordl1[2] | wordr1[2]; + w1[3] = wordl1[3] | wordr1[3]; + w2[0] = wordl2[0] | wordr2[0]; + w2[1] = wordl2[1] | wordr2[1]; + w2[2] = wordl2[2] | wordr2[2]; + w2[3] = wordl2[3] | wordr2[3]; + w3[0] = wordl3[0] | wordr3[0]; + w3[1] = wordl3[1] | wordr3[1]; + w3[2] = wordl3[2] | wordr3[2]; + w3[3] = wordl3[3] | wordr3[3]; + + u32x w0_t[4]; + + w0_t[0] = w0[0]; + w0_t[1] = w0[1]; + w0_t[2] = w0[2]; + w0_t[3] = w0[3]; + + u32x w1_t[4]; + + w1_t[0] = w1[0]; + w1_t[1] = w1[1]; + w1_t[2] = w1[2]; + w1_t[3] = w1[3]; + + u32x w2_t[4]; + + w2_t[0] = w2[0]; + w2_t[1] = w2[1]; + w2_t[2] = w2[2]; + w2_t[3] = w2[3]; + + u32x w3_t[4]; + + w3_t[0] = w3[0]; + w3_t[1] = w3[1]; + w3_t[2] = w3[2]; + w3_t[3] = w3[3]; + + switch_buffer_by_offset (w0_t, w1_t, w2_t, w3_t, 1); + + w0_t[0] |= pw_len & 0xff; + + /** + * salt + */ + + u32 s0[4]; + + s0[0] = salt_buf0[0]; + s0[1] = salt_buf0[1]; + s0[2] = salt_buf0[2]; + s0[3] = salt_buf0[3]; + + u32 s1[4]; + + s1[0] = salt_buf1[0]; + s1[1] = salt_buf1[1]; + s1[2] = salt_buf1[2]; + s1[3] = salt_buf1[3]; + + u32 s2[4]; + + s2[0] = 0; + s2[1] = 0; + s2[2] = 0; + s2[3] = 0; + + u32 s3[4]; + + s3[0] = 0; + s3[1] = 0; + s3[2] = 0; + s3[3] = 0; + + switch_buffer_by_offset (s0, s1, s2, s3, 1 + pw_len + domain_len + 1); + + u32 d0[4]; + + d0[0] = domain_buf0[0]; + d0[1] = domain_buf0[1]; + d0[2] = domain_buf0[2]; + d0[3] = domain_buf0[3]; + + u32 d1[4]; + + d1[0] = domain_buf1[0]; + d1[1] = domain_buf1[1]; + d1[2] = domain_buf1[2]; + d1[3] = 0; + + u32 d2[4]; + + d2[0] = 0; + d2[1] = 0; + d2[2] = 0; + d2[3] = 0; + + u32 d3[4]; + + d3[0] = 0; + d3[1] = 0; + d3[2] = 0; + d3[3] = 0; + + switch_buffer_by_offset (d0, d1, d2, d3, 1 + pw_len); + + /** + * sha1 + */ + + u32x w0_t2[4]; + + w0_t2[0] = swap_workaround (w0_t[0] | d0[0] | s0[0]); + w0_t2[1] = swap_workaround (w0_t[1] | d0[1] | s0[1]); + w0_t2[2] = swap_workaround (w0_t[2] | d0[2] | s0[2]); + w0_t2[3] = swap_workaround (w0_t[3] | d0[3] | s0[3]); + + u32x w1_t2[4]; + + w1_t2[0] = swap_workaround (w1_t[0] | d1[0] | s1[0]); + w1_t2[1] = swap_workaround (w1_t[1] | d1[1] | s1[1]); + w1_t2[2] = swap_workaround (w1_t[2] | d1[2] | s1[2]); + w1_t2[3] = swap_workaround (w1_t[3] | d1[3] | s1[3]); + + u32x w2_t2[4]; + + w2_t2[0] = swap_workaround (w2_t[0] | d2[0] | s2[0]); + w2_t2[1] = swap_workaround (w2_t[1] | d2[1] | s2[1]); + w2_t2[2] = swap_workaround (w2_t[2] | d2[2] | s2[2]); + w2_t2[3] = swap_workaround (w2_t[3] | d2[3] | s2[3]); + + u32x w3_t2[4]; + + w3_t2[0] = swap_workaround (w3_t[0] | d3[0] | s3[0]); + w3_t2[1] = swap_workaround (w3_t[1] | d3[1] | s3[1]); + w3_t2[2] = 0; + w3_t2[3] = (1 + pw_len + domain_len + 1 + salt_len) * 8; + + u32x digest[5]; + + digest[0] = SHA1M_A; + digest[1] = SHA1M_B; + digest[2] = SHA1M_C; + digest[3] = SHA1M_D; + digest[4] = SHA1M_E; + + sha1_transform (w0_t2, w1_t2, w2_t2, w3_t2, digest); + + // iterations + + for (u32 i = 0; i < salt_iter; i++) + { + u32x w0_t3[4]; + + w0_t3[0] = digest[0]; + w0_t3[1] = digest[1]; + w0_t3[2] = digest[2]; + w0_t3[3] = digest[3]; + + u32x w1_t3[4]; + + w1_t3[0] = digest[4]; + w1_t3[1] = swap_workaround (salt_buf0[0]); + w1_t3[2] = swap_workaround (salt_buf0[1]); + w1_t3[3] = swap_workaround (salt_buf0[2]); + + u32x w2_t3[4]; + + w2_t3[0] = swap_workaround (salt_buf0[3]); + w2_t3[1] = swap_workaround (salt_buf1[0]); + w2_t3[2] = swap_workaround (salt_buf1[1]); + w2_t3[3] = swap_workaround (salt_buf1[2]); + + u32x w3_t3[4]; + + w3_t3[0] = swap_workaround (salt_buf1[3]); + w3_t3[1] = 0; + w3_t3[2] = 0; + w3_t3[3] = (20 + salt_len) * 8; + + digest[0] = SHA1M_A; + digest[1] = SHA1M_B; + digest[2] = SHA1M_C; + digest[3] = SHA1M_D; + digest[4] = SHA1M_E; + + sha1_transform (w0_t3, w1_t3, w2_t3, w3_t3, digest); + } + + const u32x r0 = digest[3]; + const u32x r1 = digest[4]; + const u32x r2 = digest[2]; + const u32x r3 = digest[1]; + + #include VECT_COMPARE_S + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m08300_s08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m08300_s16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/amd/m08300_a3.cl b/amd/m08300_a3.cl new file mode 100644 index 0000000000..be35d7c7d5 --- /dev/null +++ b/amd/m08300_a3.cl @@ -0,0 +1,961 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _SHA1_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW4 +#define VECT_SIZE4 +#endif + +#ifdef VLIW5 +#define VECT_SIZE2 +#endif + +#define DGST_R0 3 +#define DGST_R1 4 +#define DGST_R2 2 +#define DGST_R3 1 + +#include "include/kernel_functions.c" +#include "types_amd.c" +#include "common_amd.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +static void sha1_transform (const u32x w0[4], const u32x w1[4], const u32x w2[4], const u32x w3[4], u32x digest[5]) +{ + u32x A = digest[0]; + u32x B = digest[1]; + u32x C = digest[2]; + u32x D = digest[3]; + u32x E = digest[4]; + + u32x w0_t = w0[0]; + u32x w1_t = w0[1]; + u32x w2_t = w0[2]; + u32x w3_t = w0[3]; + u32x w4_t = w1[0]; + u32x w5_t = w1[1]; + u32x w6_t = w1[2]; + u32x w7_t = w1[3]; + u32x w8_t = w2[0]; + u32x w9_t = w2[1]; + u32x wa_t = w2[2]; + u32x wb_t = w2[3]; + u32x wc_t = w3[0]; + u32x wd_t = w3[1]; + u32x we_t = w3[2]; + u32x wf_t = w3[3]; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, A, B, C, D, E, w0_t); + SHA1_STEP (SHA1_F0o, E, A, B, C, D, w1_t); + SHA1_STEP (SHA1_F0o, D, E, A, B, C, w2_t); + SHA1_STEP (SHA1_F0o, C, D, E, A, B, w3_t); + SHA1_STEP (SHA1_F0o, B, C, D, E, A, w4_t); + SHA1_STEP (SHA1_F0o, A, B, C, D, E, w5_t); + SHA1_STEP (SHA1_F0o, E, A, B, C, D, w6_t); + SHA1_STEP (SHA1_F0o, D, E, A, B, C, w7_t); + SHA1_STEP (SHA1_F0o, C, D, E, A, B, w8_t); + SHA1_STEP (SHA1_F0o, B, C, D, E, A, w9_t); + SHA1_STEP (SHA1_F0o, A, B, C, D, E, wa_t); + SHA1_STEP (SHA1_F0o, E, A, B, C, D, wb_t); + SHA1_STEP (SHA1_F0o, D, E, A, B, C, wc_t); + SHA1_STEP (SHA1_F0o, C, D, E, A, B, wd_t); + SHA1_STEP (SHA1_F0o, B, C, D, E, A, we_t); + SHA1_STEP (SHA1_F0o, A, B, C, D, E, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F0o, E, A, B, C, D, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F0o, D, E, A, B, C, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F0o, C, D, E, A, B, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F0o, B, C, D, E, A, w3_t); + + #undef K + #define K SHA1C01 + + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w7_t); + + #undef K + #define K SHA1C02 + + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, wb_t); + + #undef K + #define K SHA1C03 + + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, wf_t); + + digest[0] += A; + digest[1] += B; + digest[2] += C; + digest[3] += D; + digest[4] += E; +} + +static void m08300m (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], const u32 pw_len, __global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset) +{ + /** + * modifier + */ + + const u32 gid = get_global_id (0); + const u32 lid = get_local_id (0); + + /** + * salt + */ + + const u32 salt_iter = salt_bufs[salt_pos].salt_iter; + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[ 1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[ 2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[ 3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[ 4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[ 5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[ 6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[ 7]; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + u32 domain_buf0[4]; + + domain_buf0[0] = salt_bufs[salt_pos].salt_buf_pc[ 0]; + domain_buf0[1] = salt_bufs[salt_pos].salt_buf_pc[ 1]; + domain_buf0[2] = salt_bufs[salt_pos].salt_buf_pc[ 2]; + domain_buf0[3] = salt_bufs[salt_pos].salt_buf_pc[ 3]; + + u32 domain_buf1[4]; + + domain_buf1[0] = salt_bufs[salt_pos].salt_buf_pc[ 4]; + domain_buf1[1] = salt_bufs[salt_pos].salt_buf_pc[ 5]; + domain_buf1[2] = salt_bufs[salt_pos].salt_buf_pc[ 6]; + domain_buf1[3] = 0; + + const u32 domain_len = salt_bufs[salt_pos].salt_buf_pc[ 7]; + + /** + * base + */ + + u32 s0[4]; + + s0[0] = salt_buf0[0]; + s0[1] = salt_buf0[1]; + s0[2] = salt_buf0[2]; + s0[3] = salt_buf0[3]; + + u32 s1[4]; + + s1[0] = salt_buf1[0]; + s1[1] = salt_buf1[1]; + s1[2] = salt_buf1[2]; + s1[3] = salt_buf1[3]; + + u32 s2[4]; + + s2[0] = 0; + s2[1] = 0; + s2[2] = 0; + s2[3] = 0; + + u32 s3[4]; + + s3[0] = 0; + s3[1] = 0; + s3[2] = 0; + s3[3] = 0; + + switch_buffer_by_offset (s0, s1, s2, s3, 1 + pw_len + domain_len + 1); + + u32 d0[4]; + + d0[0] = domain_buf0[0]; + d0[1] = domain_buf0[1]; + d0[2] = domain_buf0[2]; + d0[3] = domain_buf0[3]; + + u32 d1[4]; + + d1[0] = domain_buf1[0]; + d1[1] = domain_buf1[1]; + d1[2] = domain_buf1[2]; + d1[3] = 0; + + u32 d2[4]; + + d2[0] = 0; + d2[1] = 0; + d2[2] = 0; + d2[3] = 0; + + u32 d3[4]; + + d3[0] = 0; + d3[1] = 0; + d3[2] = 0; + d3[3] = 0; + + switch_buffer_by_offset (d0, d1, d2, d3, 1 + pw_len); + + /** + * loop + */ + + u32x w0l = w0[0]; + + for (u32 il_pos = 0; il_pos < bfs_cnt; il_pos++) + { + const u32 w0r = bfs_buf[il_pos].i; + + w0[0] = w0l | w0r; + + u32x w0_t[4]; + + w0_t[0] = w0[0]; + w0_t[1] = w0[1]; + w0_t[2] = w0[2]; + w0_t[3] = w0[3]; + + u32x w1_t[4]; + + w1_t[0] = w1[0]; + w1_t[1] = w1[1]; + w1_t[2] = w1[2]; + w1_t[3] = w1[3]; + + u32x w2_t[4]; + + w2_t[0] = w2[0]; + w2_t[1] = w2[1]; + w2_t[2] = w2[2]; + w2_t[3] = w2[3]; + + u32x w3_t[4]; + + w3_t[0] = w3[0]; + w3_t[1] = w3[1]; + w3_t[2] = w3[2]; + w3_t[3] = w3[3]; + + switch_buffer_by_offset (w0_t, w1_t, w2_t, w3_t, 1); + + w0_t[0] |= pw_len & 0xff; + + /** + * sha1 + */ + + u32x w0_t2[4]; + + w0_t2[0] = swap_workaround (w0_t[0] | d0[0] | s0[0]); + w0_t2[1] = swap_workaround (w0_t[1] | d0[1] | s0[1]); + w0_t2[2] = swap_workaround (w0_t[2] | d0[2] | s0[2]); + w0_t2[3] = swap_workaround (w0_t[3] | d0[3] | s0[3]); + + u32x w1_t2[4]; + + w1_t2[0] = swap_workaround (w1_t[0] | d1[0] | s1[0]); + w1_t2[1] = swap_workaround (w1_t[1] | d1[1] | s1[1]); + w1_t2[2] = swap_workaround (w1_t[2] | d1[2] | s1[2]); + w1_t2[3] = swap_workaround (w1_t[3] | d1[3] | s1[3]); + + u32x w2_t2[4]; + + w2_t2[0] = swap_workaround (w2_t[0] | d2[0] | s2[0]); + w2_t2[1] = swap_workaround (w2_t[1] | d2[1] | s2[1]); + w2_t2[2] = swap_workaround (w2_t[2] | d2[2] | s2[2]); + w2_t2[3] = swap_workaround (w2_t[3] | d2[3] | s2[3]); + + u32x w3_t2[4]; + + w3_t2[0] = swap_workaround (w3_t[0] | d3[0] | s3[0]); + w3_t2[1] = swap_workaround (w3_t[1] | d3[1] | s3[1]); + w3_t2[2] = 0; + w3_t2[3] = (1 + pw_len + domain_len + 1 + salt_len) * 8; + + u32x digest[5]; + + digest[0] = SHA1M_A; + digest[1] = SHA1M_B; + digest[2] = SHA1M_C; + digest[3] = SHA1M_D; + digest[4] = SHA1M_E; + + sha1_transform (w0_t2, w1_t2, w2_t2, w3_t2, digest); + + // iterations + + for (u32 i = 0; i < salt_iter; i++) + { + u32x w0_t3[4]; + + w0_t3[0] = digest[0]; + w0_t3[1] = digest[1]; + w0_t3[2] = digest[2]; + w0_t3[3] = digest[3]; + + u32x w1_t3[4]; + + w1_t3[0] = digest[4]; + w1_t3[1] = swap_workaround (salt_buf0[0]); + w1_t3[2] = swap_workaround (salt_buf0[1]); + w1_t3[3] = swap_workaround (salt_buf0[2]); + + u32x w2_t3[4]; + + w2_t3[0] = swap_workaround (salt_buf0[3]); + w2_t3[1] = swap_workaround (salt_buf1[0]); + w2_t3[2] = swap_workaround (salt_buf1[1]); + w2_t3[3] = swap_workaround (salt_buf1[2]); + + u32x w3_t3[4]; + + w3_t3[0] = swap_workaround (salt_buf1[3]); + w3_t3[1] = 0; + w3_t3[2] = 0; + w3_t3[3] = (20 + salt_len) * 8; + + digest[0] = SHA1M_A; + digest[1] = SHA1M_B; + digest[2] = SHA1M_C; + digest[3] = SHA1M_D; + digest[4] = SHA1M_E; + + sha1_transform (w0_t3, w1_t3, w2_t3, w3_t3, digest); + } + + const u32x r0 = digest[3]; + const u32x r1 = digest[4]; + const u32x r2 = digest[2]; + const u32x r3 = digest[1]; + + #include VECT_COMPARE_M + } +} + +static void m08300s (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], const u32 pw_len, __global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset) +{ + /** + * modifier + */ + + const u32 gid = get_global_id (0); + const u32 lid = get_local_id (0); + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * salt + */ + + const u32 salt_iter = salt_bufs[salt_pos].salt_iter; + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[ 1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[ 2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[ 3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[ 4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[ 5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[ 6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[ 7]; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + u32 domain_buf0[4]; + + domain_buf0[0] = salt_bufs[salt_pos].salt_buf_pc[ 0]; + domain_buf0[1] = salt_bufs[salt_pos].salt_buf_pc[ 1]; + domain_buf0[2] = salt_bufs[salt_pos].salt_buf_pc[ 2]; + domain_buf0[3] = salt_bufs[salt_pos].salt_buf_pc[ 3]; + + u32 domain_buf1[4]; + + domain_buf1[0] = salt_bufs[salt_pos].salt_buf_pc[ 4]; + domain_buf1[1] = salt_bufs[salt_pos].salt_buf_pc[ 5]; + domain_buf1[2] = salt_bufs[salt_pos].salt_buf_pc[ 6]; + domain_buf1[3] = 0; + + const u32 domain_len = salt_bufs[salt_pos].salt_buf_pc[ 7]; + + /** + * base + */ + + u32 s0[4]; + + s0[0] = salt_buf0[0]; + s0[1] = salt_buf0[1]; + s0[2] = salt_buf0[2]; + s0[3] = salt_buf0[3]; + + u32 s1[4]; + + s1[0] = salt_buf1[0]; + s1[1] = salt_buf1[1]; + s1[2] = salt_buf1[2]; + s1[3] = salt_buf1[3]; + + u32 s2[4]; + + s2[0] = 0; + s2[1] = 0; + s2[2] = 0; + s2[3] = 0; + + u32 s3[4]; + + s3[0] = 0; + s3[1] = 0; + s3[2] = 0; + s3[3] = 0; + + switch_buffer_by_offset (s0, s1, s2, s3, 1 + pw_len + domain_len + 1); + + u32 d0[4]; + + d0[0] = domain_buf0[0]; + d0[1] = domain_buf0[1]; + d0[2] = domain_buf0[2]; + d0[3] = domain_buf0[3]; + + u32 d1[4]; + + d1[0] = domain_buf1[0]; + d1[1] = domain_buf1[1]; + d1[2] = domain_buf1[2]; + d1[3] = 0; + + u32 d2[4]; + + d2[0] = 0; + d2[1] = 0; + d2[2] = 0; + d2[3] = 0; + + u32 d3[4]; + + d3[0] = 0; + d3[1] = 0; + d3[2] = 0; + d3[3] = 0; + + switch_buffer_by_offset (d0, d1, d2, d3, 1 + pw_len); + + /** + * loop + */ + + u32x w0l = w0[0]; + + for (u32 il_pos = 0; il_pos < bfs_cnt; il_pos++) + { + const u32 w0r = bfs_buf[il_pos].i; + + w0[0] = w0l | w0r; + + u32x w0_t[4]; + + w0_t[0] = w0[0]; + w0_t[1] = w0[1]; + w0_t[2] = w0[2]; + w0_t[3] = w0[3]; + + u32x w1_t[4]; + + w1_t[0] = w1[0]; + w1_t[1] = w1[1]; + w1_t[2] = w1[2]; + w1_t[3] = w1[3]; + + u32x w2_t[4]; + + w2_t[0] = w2[0]; + w2_t[1] = w2[1]; + w2_t[2] = w2[2]; + w2_t[3] = w2[3]; + + u32x w3_t[4]; + + w3_t[0] = w3[0]; + w3_t[1] = w3[1]; + w3_t[2] = w3[2]; + w3_t[3] = w3[3]; + + switch_buffer_by_offset (w0_t, w1_t, w2_t, w3_t, 1); + + w0_t[0] |= pw_len & 0xff; + + /** + * sha1 + */ + + u32x w0_t2[4]; + + w0_t2[0] = swap_workaround (w0_t[0] | d0[0] | s0[0]); + w0_t2[1] = swap_workaround (w0_t[1] | d0[1] | s0[1]); + w0_t2[2] = swap_workaround (w0_t[2] | d0[2] | s0[2]); + w0_t2[3] = swap_workaround (w0_t[3] | d0[3] | s0[3]); + + u32x w1_t2[4]; + + w1_t2[0] = swap_workaround (w1_t[0] | d1[0] | s1[0]); + w1_t2[1] = swap_workaround (w1_t[1] | d1[1] | s1[1]); + w1_t2[2] = swap_workaround (w1_t[2] | d1[2] | s1[2]); + w1_t2[3] = swap_workaround (w1_t[3] | d1[3] | s1[3]); + + u32x w2_t2[4]; + + w2_t2[0] = swap_workaround (w2_t[0] | d2[0] | s2[0]); + w2_t2[1] = swap_workaround (w2_t[1] | d2[1] | s2[1]); + w2_t2[2] = swap_workaround (w2_t[2] | d2[2] | s2[2]); + w2_t2[3] = swap_workaround (w2_t[3] | d2[3] | s2[3]); + + u32x w3_t2[4]; + + w3_t2[0] = swap_workaround (w3_t[0] | d3[0] | s3[0]); + w3_t2[1] = swap_workaround (w3_t[1] | d3[1] | s3[1]); + w3_t2[2] = 0; + w3_t2[3] = (1 + pw_len + domain_len + 1 + salt_len) * 8; + + u32x digest[5]; + + digest[0] = SHA1M_A; + digest[1] = SHA1M_B; + digest[2] = SHA1M_C; + digest[3] = SHA1M_D; + digest[4] = SHA1M_E; + + sha1_transform (w0_t2, w1_t2, w2_t2, w3_t2, digest); + + // iterations + + for (u32 i = 0; i < salt_iter; i++) + { + u32x w0_t3[4]; + + w0_t3[0] = digest[0]; + w0_t3[1] = digest[1]; + w0_t3[2] = digest[2]; + w0_t3[3] = digest[3]; + + u32x w1_t3[4]; + + w1_t3[0] = digest[4]; + w1_t3[1] = swap_workaround (salt_buf0[0]); + w1_t3[2] = swap_workaround (salt_buf0[1]); + w1_t3[3] = swap_workaround (salt_buf0[2]); + + u32x w2_t3[4]; + + w2_t3[0] = swap_workaround (salt_buf0[3]); + w2_t3[1] = swap_workaround (salt_buf1[0]); + w2_t3[2] = swap_workaround (salt_buf1[1]); + w2_t3[3] = swap_workaround (salt_buf1[2]); + + u32x w3_t3[4]; + + w3_t3[0] = swap_workaround (salt_buf1[3]); + w3_t3[1] = 0; + w3_t3[2] = 0; + w3_t3[3] = (20 + salt_len) * 8; + + digest[0] = SHA1M_A; + digest[1] = SHA1M_B; + digest[2] = SHA1M_C; + digest[3] = SHA1M_D; + digest[4] = SHA1M_E; + + sha1_transform (w0_t3, w1_t3, w2_t3, w3_t3, digest); + } + + const u32x r0 = digest[3]; + const u32x r1 = digest[4]; + const u32x r2 = digest[2]; + const u32x r3 = digest[1]; + + #include VECT_COMPARE_S + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m08300_m04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *ss, __global void *ess, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m08300m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, ss, ess, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m08300_m08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *ss, __global void *ess, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m08300m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, ss, ess, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m08300_m16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *ss, __global void *ess, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = pws[gid].i[ 8]; + w2[1] = pws[gid].i[ 9]; + w2[2] = pws[gid].i[10]; + w2[3] = pws[gid].i[11]; + + u32x w3[4]; + + w3[0] = pws[gid].i[12]; + w3[1] = pws[gid].i[13]; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m08300m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, ss, ess, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m08300_s04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *ss, __global void *ess, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m08300s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, ss, ess, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m08300_s08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *ss, __global void *ess, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m08300s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, ss, ess, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m08300_s16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *ss, __global void *ess, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = pws[gid].i[ 8]; + w2[1] = pws[gid].i[ 9]; + w2[2] = pws[gid].i[10]; + w2[3] = pws[gid].i[11]; + + u32x w3[4]; + + w3[0] = pws[gid].i[12]; + w3[1] = pws[gid].i[13]; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m08300s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, ss, ess, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} diff --git a/amd/m08400_a0.cl b/amd/m08400_a0.cl new file mode 100644 index 0000000000..0eee2437d4 --- /dev/null +++ b/amd/m08400_a0.cl @@ -0,0 +1,821 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _SHA1_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW4 +#define VECT_SIZE4 +#endif + +#ifdef VLIW5 +#define VECT_SIZE2 +#endif + +#define DGST_R0 3 +#define DGST_R1 4 +#define DGST_R2 2 +#define DGST_R3 1 + +#include "include/kernel_functions.c" +#include "types_amd.c" +#include "common_amd.c" +#include "include/rp_gpu.h" +#include "rp_amd.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +#ifdef VECT_SIZE1 +#define uint_to_hex_lower8_le(i) l_bin2asc[(i)] +#endif + +#ifdef VECT_SIZE2 +#define uint_to_hex_lower8_le(i) u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1]) +#endif + +#ifdef VECT_SIZE4 +#define uint_to_hex_lower8_le(i) u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3]) +#endif + +static void sha1_transform (const u32x w0[4], const u32x w1[4], const u32x w2[4], const u32x w3[4], u32x digest[5]) +{ + u32x A = digest[0]; + u32x B = digest[1]; + u32x C = digest[2]; + u32x D = digest[3]; + u32x E = digest[4]; + + u32x w0_t = w0[0]; + u32x w1_t = w0[1]; + u32x w2_t = w0[2]; + u32x w3_t = w0[3]; + u32x w4_t = w1[0]; + u32x w5_t = w1[1]; + u32x w6_t = w1[2]; + u32x w7_t = w1[3]; + u32x w8_t = w2[0]; + u32x w9_t = w2[1]; + u32x wa_t = w2[2]; + u32x wb_t = w2[3]; + u32x wc_t = w3[0]; + u32x wd_t = w3[1]; + u32x we_t = w3[2]; + u32x wf_t = w3[3]; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, A, B, C, D, E, w0_t); + SHA1_STEP (SHA1_F0o, E, A, B, C, D, w1_t); + SHA1_STEP (SHA1_F0o, D, E, A, B, C, w2_t); + SHA1_STEP (SHA1_F0o, C, D, E, A, B, w3_t); + SHA1_STEP (SHA1_F0o, B, C, D, E, A, w4_t); + SHA1_STEP (SHA1_F0o, A, B, C, D, E, w5_t); + SHA1_STEP (SHA1_F0o, E, A, B, C, D, w6_t); + SHA1_STEP (SHA1_F0o, D, E, A, B, C, w7_t); + SHA1_STEP (SHA1_F0o, C, D, E, A, B, w8_t); + SHA1_STEP (SHA1_F0o, B, C, D, E, A, w9_t); + SHA1_STEP (SHA1_F0o, A, B, C, D, E, wa_t); + SHA1_STEP (SHA1_F0o, E, A, B, C, D, wb_t); + SHA1_STEP (SHA1_F0o, D, E, A, B, C, wc_t); + SHA1_STEP (SHA1_F0o, C, D, E, A, B, wd_t); + SHA1_STEP (SHA1_F0o, B, C, D, E, A, we_t); + SHA1_STEP (SHA1_F0o, A, B, C, D, E, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F0o, E, A, B, C, D, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F0o, D, E, A, B, C, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F0o, C, D, E, A, B, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F0o, B, C, D, E, A, w3_t); + + #undef K + #define K SHA1C01 + + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w7_t); + + #undef K + #define K SHA1C02 + + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, wb_t); + + #undef K + #define K SHA1C03 + + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, wf_t); + + digest[0] += A; + digest[1] += B; + digest[2] += C; + digest[3] += D; + digest[4] += E; +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m08400_m04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + u32x pw_buf1[4]; + + pw_buf1[0] = pws[gid].i[ 4]; + pw_buf1[1] = pws[gid].i[ 5]; + pw_buf1[2] = pws[gid].i[ 6]; + pw_buf1[3] = pws[gid].i[ 7]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * bin2asc table + */ + + __local u32 l_bin2asc[256]; + + const u32 lid4 = lid * 4; + + const u32 lid40 = lid4 + 0; + const u32 lid41 = lid4 + 1; + const u32 lid42 = lid4 + 2; + const u32 lid43 = lid4 + 3; + + const u32 v400 = (lid40 >> 0) & 15; + const u32 v401 = (lid40 >> 4) & 15; + const u32 v410 = (lid41 >> 0) & 15; + const u32 v411 = (lid41 >> 4) & 15; + const u32 v420 = (lid42 >> 0) & 15; + const u32 v421 = (lid42 >> 4) & 15; + const u32 v430 = (lid43 >> 0) & 15; + const u32 v431 = (lid43 >> 4) & 15; + + l_bin2asc[lid40] = ((v400 < 10) ? '0' + v400 : 'a' - 10 + v400) << 0 + | ((v401 < 10) ? '0' + v401 : 'a' - 10 + v401) << 8; + l_bin2asc[lid41] = ((v410 < 10) ? '0' + v410 : 'a' - 10 + v410) << 0 + | ((v411 < 10) ? '0' + v411 : 'a' - 10 + v411) << 8; + l_bin2asc[lid42] = ((v420 < 10) ? '0' + v420 : 'a' - 10 + v420) << 0 + | ((v421 < 10) ? '0' + v421 : 'a' - 10 + v421) << 8; + l_bin2asc[lid43] = ((v430 < 10) ? '0' + v430 : 'a' - 10 + v430) << 0 + | ((v431 < 10) ? '0' + v431 : 'a' - 10 + v431) << 8; + + barrier (CLK_LOCAL_MEM_FENCE); + + if (gid >= gid_max) return; + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = swap_workaround (salt_bufs[salt_pos].salt_buf[ 0]); + salt_buf0[1] = swap_workaround (salt_bufs[salt_pos].salt_buf[ 1]); + salt_buf0[2] = swap_workaround (salt_bufs[salt_pos].salt_buf[ 2]); + salt_buf0[3] = swap_workaround (salt_bufs[salt_pos].salt_buf[ 3]); + + u32 salt_buf1[4]; + + salt_buf1[0] = swap_workaround (salt_bufs[salt_pos].salt_buf[ 4]); + salt_buf1[1] = swap_workaround (salt_bufs[salt_pos].salt_buf[ 5]); + salt_buf1[2] = swap_workaround (salt_bufs[salt_pos].salt_buf[ 6]); + salt_buf1[3] = swap_workaround (salt_bufs[salt_pos].salt_buf[ 7]); + + u32 salt_buf2[4]; + + salt_buf2[0] = swap_workaround (salt_bufs[salt_pos].salt_buf[ 8]); + salt_buf2[1] = swap_workaround (salt_bufs[salt_pos].salt_buf[ 9]); + salt_buf2[2] = 0; + salt_buf2[3] = 0; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + + w0[0] = pw_buf0[0]; + w0[1] = pw_buf0[1]; + w0[2] = pw_buf0[2]; + w0[3] = pw_buf0[3]; + + u32x w1[4]; + + w1[0] = pw_buf1[0]; + w1[1] = pw_buf1[1]; + w1[2] = pw_buf1[2]; + w1[3] = pw_buf1[3]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 out_len = apply_rules (rules_buf[il_pos].cmds, w0, w1, pw_len); + + append_0x80_2 (w0, w1, out_len); + + u32x w0_t[4]; + + w0_t[0] = swap_workaround (w0[0]); + w0_t[1] = swap_workaround (w0[1]); + w0_t[2] = swap_workaround (w0[2]); + w0_t[3] = swap_workaround (w0[3]); + + u32x w1_t[4]; + + w1_t[0] = swap_workaround (w1[0]); + w1_t[1] = swap_workaround (w1[1]); + w1_t[2] = swap_workaround (w1[2]); + w1_t[3] = swap_workaround (w1[3]); + + u32x w2_t[4]; + + w2_t[0] = swap_workaround (w2[0]); + w2_t[1] = swap_workaround (w2[1]); + w2_t[2] = swap_workaround (w2[2]); + w2_t[3] = swap_workaround (w2[3]); + + u32x w3_t[4]; + + w3_t[0] = swap_workaround (w3[0]); + w3_t[1] = swap_workaround (w3[1]); + w3_t[2] = 0; + w3_t[3] = pw_len * 8; + + u32x digest[5]; + + digest[0] = SHA1M_A; + digest[1] = SHA1M_B; + digest[2] = SHA1M_C; + digest[3] = SHA1M_D; + digest[4] = SHA1M_E; + + sha1_transform (w0_t, w1_t, w2_t, w3_t, digest); + + u32x a; + u32x b; + u32x c; + u32x d; + u32x e; + + a = digest[0]; + b = digest[1]; + c = digest[2]; + d = digest[3]; + e = digest[4]; + + w0_t[0] = salt_buf0[0]; + w0_t[1] = salt_buf0[1]; + w0_t[2] = salt_buf0[2]; + w0_t[3] = salt_buf0[3]; + w1_t[0] = salt_buf1[0]; + w1_t[1] = salt_buf1[1]; + w1_t[2] = salt_buf1[2]; + w1_t[3] = salt_buf1[3]; + w2_t[0] = salt_buf2[0]; + w2_t[1] = salt_buf2[1]; + w2_t[2] = uint_to_hex_lower8_le ((a >> 16) & 255) << 0 + | uint_to_hex_lower8_le ((a >> 24) & 255) << 16; + w2_t[3] = uint_to_hex_lower8_le ((a >> 0) & 255) << 0 + | uint_to_hex_lower8_le ((a >> 8) & 255) << 16; + w3_t[0] = uint_to_hex_lower8_le ((b >> 16) & 255) << 0 + | uint_to_hex_lower8_le ((b >> 24) & 255) << 16; + w3_t[1] = uint_to_hex_lower8_le ((b >> 0) & 255) << 0 + | uint_to_hex_lower8_le ((b >> 8) & 255) << 16; + w3_t[2] = uint_to_hex_lower8_le ((c >> 16) & 255) << 0 + | uint_to_hex_lower8_le ((c >> 24) & 255) << 16; + w3_t[3] = uint_to_hex_lower8_le ((c >> 0) & 255) << 0 + | uint_to_hex_lower8_le ((c >> 8) & 255) << 16; + + digest[0] = SHA1M_A; + digest[1] = SHA1M_B; + digest[2] = SHA1M_C; + digest[3] = SHA1M_D; + digest[4] = SHA1M_E; + + sha1_transform (w0_t, w1_t, w2_t, w3_t, digest); + + w0_t[0] = uint_to_hex_lower8_le ((d >> 16) & 255) << 0 + | uint_to_hex_lower8_le ((d >> 24) & 255) << 16; + w0_t[1] = uint_to_hex_lower8_le ((d >> 0) & 255) << 0 + | uint_to_hex_lower8_le ((d >> 8) & 255) << 16; + w0_t[2] = uint_to_hex_lower8_le ((e >> 16) & 255) << 0 + | uint_to_hex_lower8_le ((e >> 24) & 255) << 16; + w0_t[3] = uint_to_hex_lower8_le ((e >> 0) & 255) << 0 + | uint_to_hex_lower8_le ((e >> 8) & 255) << 16; + w1_t[0] = 0x80000000; + w1_t[1] = 0; + w1_t[2] = 0; + w1_t[3] = 0; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = 80 * 8; + + sha1_transform (w0_t, w1_t, w2_t, w3_t, digest); + + a = digest[0]; + b = digest[1]; + c = digest[2]; + d = digest[3]; + e = digest[4]; + + w0_t[0] = salt_buf0[0]; + w0_t[1] = salt_buf0[1]; + w0_t[2] = salt_buf0[2]; + w0_t[3] = salt_buf0[3]; + w1_t[0] = salt_buf1[0]; + w1_t[1] = salt_buf1[1]; + w1_t[2] = salt_buf1[2]; + w1_t[3] = salt_buf1[3]; + w2_t[0] = salt_buf2[0]; + w2_t[1] = salt_buf2[1]; + w2_t[2] = uint_to_hex_lower8_le ((a >> 16) & 255) << 0 + | uint_to_hex_lower8_le ((a >> 24) & 255) << 16; + w2_t[3] = uint_to_hex_lower8_le ((a >> 0) & 255) << 0 + | uint_to_hex_lower8_le ((a >> 8) & 255) << 16; + w3_t[0] = uint_to_hex_lower8_le ((b >> 16) & 255) << 0 + | uint_to_hex_lower8_le ((b >> 24) & 255) << 16; + w3_t[1] = uint_to_hex_lower8_le ((b >> 0) & 255) << 0 + | uint_to_hex_lower8_le ((b >> 8) & 255) << 16; + w3_t[2] = uint_to_hex_lower8_le ((c >> 16) & 255) << 0 + | uint_to_hex_lower8_le ((c >> 24) & 255) << 16; + w3_t[3] = uint_to_hex_lower8_le ((c >> 0) & 255) << 0 + | uint_to_hex_lower8_le ((c >> 8) & 255) << 16; + + digest[0] = SHA1M_A; + digest[1] = SHA1M_B; + digest[2] = SHA1M_C; + digest[3] = SHA1M_D; + digest[4] = SHA1M_E; + + sha1_transform (w0_t, w1_t, w2_t, w3_t, digest); + + w0_t[0] = uint_to_hex_lower8_le ((d >> 16) & 255) << 0 + | uint_to_hex_lower8_le ((d >> 24) & 255) << 16; + w0_t[1] = uint_to_hex_lower8_le ((d >> 0) & 255) << 0 + | uint_to_hex_lower8_le ((d >> 8) & 255) << 16; + w0_t[2] = uint_to_hex_lower8_le ((e >> 16) & 255) << 0 + | uint_to_hex_lower8_le ((e >> 24) & 255) << 16; + w0_t[3] = uint_to_hex_lower8_le ((e >> 0) & 255) << 0 + | uint_to_hex_lower8_le ((e >> 8) & 255) << 16; + w1_t[0] = 0x80000000; + w1_t[1] = 0; + w1_t[2] = 0; + w1_t[3] = 0; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = 80 * 8; + + sha1_transform (w0_t, w1_t, w2_t, w3_t, digest); + + const u32x r0 = digest[3]; + const u32x r1 = digest[4]; + const u32x r2 = digest[2]; + const u32x r3 = digest[1]; + + #include VECT_COMPARE_M + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m08400_m08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m08400_m16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m08400_s04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + u32x pw_buf1[4]; + + pw_buf1[0] = pws[gid].i[ 4]; + pw_buf1[1] = pws[gid].i[ 5]; + pw_buf1[2] = pws[gid].i[ 6]; + pw_buf1[3] = pws[gid].i[ 7]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * bin2asc table + */ + + __local u32 l_bin2asc[256]; + + const u32 lid4 = lid * 4; + + const u32 lid40 = lid4 + 0; + const u32 lid41 = lid4 + 1; + const u32 lid42 = lid4 + 2; + const u32 lid43 = lid4 + 3; + + const u32 v400 = (lid40 >> 0) & 15; + const u32 v401 = (lid40 >> 4) & 15; + const u32 v410 = (lid41 >> 0) & 15; + const u32 v411 = (lid41 >> 4) & 15; + const u32 v420 = (lid42 >> 0) & 15; + const u32 v421 = (lid42 >> 4) & 15; + const u32 v430 = (lid43 >> 0) & 15; + const u32 v431 = (lid43 >> 4) & 15; + + l_bin2asc[lid40] = ((v400 < 10) ? '0' + v400 : 'a' - 10 + v400) << 0 + | ((v401 < 10) ? '0' + v401 : 'a' - 10 + v401) << 8; + l_bin2asc[lid41] = ((v410 < 10) ? '0' + v410 : 'a' - 10 + v410) << 0 + | ((v411 < 10) ? '0' + v411 : 'a' - 10 + v411) << 8; + l_bin2asc[lid42] = ((v420 < 10) ? '0' + v420 : 'a' - 10 + v420) << 0 + | ((v421 < 10) ? '0' + v421 : 'a' - 10 + v421) << 8; + l_bin2asc[lid43] = ((v430 < 10) ? '0' + v430 : 'a' - 10 + v430) << 0 + | ((v431 < 10) ? '0' + v431 : 'a' - 10 + v431) << 8; + + barrier (CLK_LOCAL_MEM_FENCE); + + if (gid >= gid_max) return; + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = swap_workaround (salt_bufs[salt_pos].salt_buf[ 0]); + salt_buf0[1] = swap_workaround (salt_bufs[salt_pos].salt_buf[ 1]); + salt_buf0[2] = swap_workaround (salt_bufs[salt_pos].salt_buf[ 2]); + salt_buf0[3] = swap_workaround (salt_bufs[salt_pos].salt_buf[ 3]); + + u32 salt_buf1[4]; + + salt_buf1[0] = swap_workaround (salt_bufs[salt_pos].salt_buf[ 4]); + salt_buf1[1] = swap_workaround (salt_bufs[salt_pos].salt_buf[ 5]); + salt_buf1[2] = swap_workaround (salt_bufs[salt_pos].salt_buf[ 6]); + salt_buf1[3] = swap_workaround (salt_bufs[salt_pos].salt_buf[ 7]); + + u32 salt_buf2[4]; + + salt_buf2[0] = swap_workaround (salt_bufs[salt_pos].salt_buf[ 8]); + salt_buf2[1] = swap_workaround (salt_bufs[salt_pos].salt_buf[ 9]); + salt_buf2[2] = 0; + salt_buf2[3] = 0; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + + w0[0] = pw_buf0[0]; + w0[1] = pw_buf0[1]; + w0[2] = pw_buf0[2]; + w0[3] = pw_buf0[3]; + + u32x w1[4]; + + w1[0] = pw_buf1[0]; + w1[1] = pw_buf1[1]; + w1[2] = pw_buf1[2]; + w1[3] = pw_buf1[3]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 out_len = apply_rules (rules_buf[il_pos].cmds, w0, w1, pw_len); + + append_0x80_2 (w0, w1, out_len); + + u32x w0_t[4]; + + w0_t[0] = swap_workaround (w0[0]); + w0_t[1] = swap_workaround (w0[1]); + w0_t[2] = swap_workaround (w0[2]); + w0_t[3] = swap_workaround (w0[3]); + + u32x w1_t[4]; + + w1_t[0] = swap_workaround (w1[0]); + w1_t[1] = swap_workaround (w1[1]); + w1_t[2] = swap_workaround (w1[2]); + w1_t[3] = swap_workaround (w1[3]); + + u32x w2_t[4]; + + w2_t[0] = swap_workaround (w2[0]); + w2_t[1] = swap_workaround (w2[1]); + w2_t[2] = swap_workaround (w2[2]); + w2_t[3] = swap_workaround (w2[3]); + + u32x w3_t[4]; + + w3_t[0] = swap_workaround (w3[0]); + w3_t[1] = swap_workaround (w3[1]); + w3_t[2] = 0; + w3_t[3] = pw_len * 8; + + u32x digest[5]; + + digest[0] = SHA1M_A; + digest[1] = SHA1M_B; + digest[2] = SHA1M_C; + digest[3] = SHA1M_D; + digest[4] = SHA1M_E; + + sha1_transform (w0_t, w1_t, w2_t, w3_t, digest); + + u32x a; + u32x b; + u32x c; + u32x d; + u32x e; + + a = digest[0]; + b = digest[1]; + c = digest[2]; + d = digest[3]; + e = digest[4]; + + w0_t[0] = salt_buf0[0]; + w0_t[1] = salt_buf0[1]; + w0_t[2] = salt_buf0[2]; + w0_t[3] = salt_buf0[3]; + w1_t[0] = salt_buf1[0]; + w1_t[1] = salt_buf1[1]; + w1_t[2] = salt_buf1[2]; + w1_t[3] = salt_buf1[3]; + w2_t[0] = salt_buf2[0]; + w2_t[1] = salt_buf2[1]; + w2_t[2] = uint_to_hex_lower8_le ((a >> 16) & 255) << 0 + | uint_to_hex_lower8_le ((a >> 24) & 255) << 16; + w2_t[3] = uint_to_hex_lower8_le ((a >> 0) & 255) << 0 + | uint_to_hex_lower8_le ((a >> 8) & 255) << 16; + w3_t[0] = uint_to_hex_lower8_le ((b >> 16) & 255) << 0 + | uint_to_hex_lower8_le ((b >> 24) & 255) << 16; + w3_t[1] = uint_to_hex_lower8_le ((b >> 0) & 255) << 0 + | uint_to_hex_lower8_le ((b >> 8) & 255) << 16; + w3_t[2] = uint_to_hex_lower8_le ((c >> 16) & 255) << 0 + | uint_to_hex_lower8_le ((c >> 24) & 255) << 16; + w3_t[3] = uint_to_hex_lower8_le ((c >> 0) & 255) << 0 + | uint_to_hex_lower8_le ((c >> 8) & 255) << 16; + + digest[0] = SHA1M_A; + digest[1] = SHA1M_B; + digest[2] = SHA1M_C; + digest[3] = SHA1M_D; + digest[4] = SHA1M_E; + + sha1_transform (w0_t, w1_t, w2_t, w3_t, digest); + + w0_t[0] = uint_to_hex_lower8_le ((d >> 16) & 255) << 0 + | uint_to_hex_lower8_le ((d >> 24) & 255) << 16; + w0_t[1] = uint_to_hex_lower8_le ((d >> 0) & 255) << 0 + | uint_to_hex_lower8_le ((d >> 8) & 255) << 16; + w0_t[2] = uint_to_hex_lower8_le ((e >> 16) & 255) << 0 + | uint_to_hex_lower8_le ((e >> 24) & 255) << 16; + w0_t[3] = uint_to_hex_lower8_le ((e >> 0) & 255) << 0 + | uint_to_hex_lower8_le ((e >> 8) & 255) << 16; + w1_t[0] = 0x80000000; + w1_t[1] = 0; + w1_t[2] = 0; + w1_t[3] = 0; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = (salt_len + 40) * 8; + + sha1_transform (w0_t, w1_t, w2_t, w3_t, digest); + + a = digest[0]; + b = digest[1]; + c = digest[2]; + d = digest[3]; + e = digest[4]; + + w0_t[0] = salt_buf0[0]; + w0_t[1] = salt_buf0[1]; + w0_t[2] = salt_buf0[2]; + w0_t[3] = salt_buf0[3]; + w1_t[0] = salt_buf1[0]; + w1_t[1] = salt_buf1[1]; + w1_t[2] = salt_buf1[2]; + w1_t[3] = salt_buf1[3]; + w2_t[0] = salt_buf2[0]; + w2_t[1] = salt_buf2[1]; + w2_t[2] = uint_to_hex_lower8_le ((a >> 16) & 255) << 0 + | uint_to_hex_lower8_le ((a >> 24) & 255) << 16; + w2_t[3] = uint_to_hex_lower8_le ((a >> 0) & 255) << 0 + | uint_to_hex_lower8_le ((a >> 8) & 255) << 16; + w3_t[0] = uint_to_hex_lower8_le ((b >> 16) & 255) << 0 + | uint_to_hex_lower8_le ((b >> 24) & 255) << 16; + w3_t[1] = uint_to_hex_lower8_le ((b >> 0) & 255) << 0 + | uint_to_hex_lower8_le ((b >> 8) & 255) << 16; + w3_t[2] = uint_to_hex_lower8_le ((c >> 16) & 255) << 0 + | uint_to_hex_lower8_le ((c >> 24) & 255) << 16; + w3_t[3] = uint_to_hex_lower8_le ((c >> 0) & 255) << 0 + | uint_to_hex_lower8_le ((c >> 8) & 255) << 16; + + digest[0] = SHA1M_A; + digest[1] = SHA1M_B; + digest[2] = SHA1M_C; + digest[3] = SHA1M_D; + digest[4] = SHA1M_E; + + sha1_transform (w0_t, w1_t, w2_t, w3_t, digest); + + w0_t[0] = uint_to_hex_lower8_le ((d >> 16) & 255) << 0 + | uint_to_hex_lower8_le ((d >> 24) & 255) << 16; + w0_t[1] = uint_to_hex_lower8_le ((d >> 0) & 255) << 0 + | uint_to_hex_lower8_le ((d >> 8) & 255) << 16; + w0_t[2] = uint_to_hex_lower8_le ((e >> 16) & 255) << 0 + | uint_to_hex_lower8_le ((e >> 24) & 255) << 16; + w0_t[3] = uint_to_hex_lower8_le ((e >> 0) & 255) << 0 + | uint_to_hex_lower8_le ((e >> 8) & 255) << 16; + w1_t[0] = 0x80000000; + w1_t[1] = 0; + w1_t[2] = 0; + w1_t[3] = 0; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = (salt_len + 40) * 8; + + sha1_transform (w0_t, w1_t, w2_t, w3_t, digest); + + const u32x r0 = digest[3]; + const u32x r1 = digest[4]; + const u32x r2 = digest[2]; + const u32x r3 = digest[1]; + + #include VECT_COMPARE_S + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m08400_s08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m08400_s16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/amd/m08400_a1.cl b/amd/m08400_a1.cl new file mode 100644 index 0000000000..88dd037c41 --- /dev/null +++ b/amd/m08400_a1.cl @@ -0,0 +1,931 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _SHA1_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW4 +#define VECT_SIZE4 +#endif + +#ifdef VLIW5 +#define VECT_SIZE2 +#endif + +#define DGST_R0 3 +#define DGST_R1 4 +#define DGST_R2 2 +#define DGST_R3 1 + +#include "include/kernel_functions.c" +#include "types_amd.c" +#include "common_amd.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +#ifdef VECT_SIZE1 +#define uint_to_hex_lower8_le(i) l_bin2asc[(i)] +#endif + +#ifdef VECT_SIZE2 +#define uint_to_hex_lower8_le(i) u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1]) +#endif + +#ifdef VECT_SIZE4 +#define uint_to_hex_lower8_le(i) u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3]) +#endif + +static void sha1_transform (const u32x w0[4], const u32x w1[4], const u32x w2[4], const u32x w3[4], u32x digest[5]) +{ + u32x A = digest[0]; + u32x B = digest[1]; + u32x C = digest[2]; + u32x D = digest[3]; + u32x E = digest[4]; + + u32x w0_t = w0[0]; + u32x w1_t = w0[1]; + u32x w2_t = w0[2]; + u32x w3_t = w0[3]; + u32x w4_t = w1[0]; + u32x w5_t = w1[1]; + u32x w6_t = w1[2]; + u32x w7_t = w1[3]; + u32x w8_t = w2[0]; + u32x w9_t = w2[1]; + u32x wa_t = w2[2]; + u32x wb_t = w2[3]; + u32x wc_t = w3[0]; + u32x wd_t = w3[1]; + u32x we_t = w3[2]; + u32x wf_t = w3[3]; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, A, B, C, D, E, w0_t); + SHA1_STEP (SHA1_F0o, E, A, B, C, D, w1_t); + SHA1_STEP (SHA1_F0o, D, E, A, B, C, w2_t); + SHA1_STEP (SHA1_F0o, C, D, E, A, B, w3_t); + SHA1_STEP (SHA1_F0o, B, C, D, E, A, w4_t); + SHA1_STEP (SHA1_F0o, A, B, C, D, E, w5_t); + SHA1_STEP (SHA1_F0o, E, A, B, C, D, w6_t); + SHA1_STEP (SHA1_F0o, D, E, A, B, C, w7_t); + SHA1_STEP (SHA1_F0o, C, D, E, A, B, w8_t); + SHA1_STEP (SHA1_F0o, B, C, D, E, A, w9_t); + SHA1_STEP (SHA1_F0o, A, B, C, D, E, wa_t); + SHA1_STEP (SHA1_F0o, E, A, B, C, D, wb_t); + SHA1_STEP (SHA1_F0o, D, E, A, B, C, wc_t); + SHA1_STEP (SHA1_F0o, C, D, E, A, B, wd_t); + SHA1_STEP (SHA1_F0o, B, C, D, E, A, we_t); + SHA1_STEP (SHA1_F0o, A, B, C, D, E, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F0o, E, A, B, C, D, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F0o, D, E, A, B, C, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F0o, C, D, E, A, B, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F0o, B, C, D, E, A, w3_t); + + #undef K + #define K SHA1C01 + + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w7_t); + + #undef K + #define K SHA1C02 + + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, wb_t); + + #undef K + #define K SHA1C03 + + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, wf_t); + + digest[0] += A; + digest[1] += B; + digest[2] += C; + digest[3] += D; + digest[4] += E; +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m08400_m04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + append_0x80_2 (wordl0, wordl1, pw_l_len); + + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, combs_buf[0].pw_len); + } + + /** + * bin2asc table + */ + + __local u32 l_bin2asc[256]; + + const u32 lid4 = lid * 4; + + const u32 lid40 = lid4 + 0; + const u32 lid41 = lid4 + 1; + const u32 lid42 = lid4 + 2; + const u32 lid43 = lid4 + 3; + + const u32 v400 = (lid40 >> 0) & 15; + const u32 v401 = (lid40 >> 4) & 15; + const u32 v410 = (lid41 >> 0) & 15; + const u32 v411 = (lid41 >> 4) & 15; + const u32 v420 = (lid42 >> 0) & 15; + const u32 v421 = (lid42 >> 4) & 15; + const u32 v430 = (lid43 >> 0) & 15; + const u32 v431 = (lid43 >> 4) & 15; + + l_bin2asc[lid40] = ((v400 < 10) ? '0' + v400 : 'a' - 10 + v400) << 0 + | ((v401 < 10) ? '0' + v401 : 'a' - 10 + v401) << 8; + l_bin2asc[lid41] = ((v410 < 10) ? '0' + v410 : 'a' - 10 + v410) << 0 + | ((v411 < 10) ? '0' + v411 : 'a' - 10 + v411) << 8; + l_bin2asc[lid42] = ((v420 < 10) ? '0' + v420 : 'a' - 10 + v420) << 0 + | ((v421 < 10) ? '0' + v421 : 'a' - 10 + v421) << 8; + l_bin2asc[lid43] = ((v430 < 10) ? '0' + v430 : 'a' - 10 + v430) << 0 + | ((v431 < 10) ? '0' + v431 : 'a' - 10 + v431) << 8; + + barrier (CLK_LOCAL_MEM_FENCE); + + if (gid >= gid_max) return; + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = swap_workaround (salt_bufs[salt_pos].salt_buf[ 0]); + salt_buf0[1] = swap_workaround (salt_bufs[salt_pos].salt_buf[ 1]); + salt_buf0[2] = swap_workaround (salt_bufs[salt_pos].salt_buf[ 2]); + salt_buf0[3] = swap_workaround (salt_bufs[salt_pos].salt_buf[ 3]); + + u32 salt_buf1[4]; + + salt_buf1[0] = swap_workaround (salt_bufs[salt_pos].salt_buf[ 4]); + salt_buf1[1] = swap_workaround (salt_bufs[salt_pos].salt_buf[ 5]); + salt_buf1[2] = swap_workaround (salt_bufs[salt_pos].salt_buf[ 6]); + salt_buf1[3] = swap_workaround (salt_bufs[salt_pos].salt_buf[ 7]); + + u32 salt_buf2[4]; + + salt_buf2[0] = swap_workaround (salt_bufs[salt_pos].salt_buf[ 8]); + salt_buf2[1] = swap_workaround (salt_bufs[salt_pos].salt_buf[ 9]); + salt_buf2[2] = 0; + salt_buf2[3] = 0; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = combs_buf[il_pos].pw_len; + + const u32 pw_len = pw_l_len + pw_r_len; + + u32 wordr0[4]; + + wordr0[0] = combs_buf[il_pos].i[0]; + wordr0[1] = combs_buf[il_pos].i[1]; + wordr0[2] = combs_buf[il_pos].i[2]; + wordr0[3] = combs_buf[il_pos].i[3]; + + u32 wordr1[4]; + + wordr1[0] = combs_buf[il_pos].i[4]; + wordr1[1] = combs_buf[il_pos].i[5]; + wordr1[2] = combs_buf[il_pos].i[6]; + wordr1[3] = combs_buf[il_pos].i[7]; + + u32 wordr2[4]; + + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + + u32 wordr3[4]; + + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + append_0x80_2 (wordr0, wordr1, pw_r_len); + + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + u32x w0[4]; + + w0[0] = wordl0[0] | wordr0[0]; + w0[1] = wordl0[1] | wordr0[1]; + w0[2] = wordl0[2] | wordr0[2]; + w0[3] = wordl0[3] | wordr0[3]; + + u32x w1[4]; + + w1[0] = wordl1[0] | wordr1[0]; + w1[1] = wordl1[1] | wordr1[1]; + w1[2] = wordl1[2] | wordr1[2]; + w1[3] = wordl1[3] | wordr1[3]; + + u32x w2[4]; + + w2[0] = wordl2[0] | wordr2[0]; + w2[1] = wordl2[1] | wordr2[1]; + w2[2] = wordl2[2] | wordr2[2]; + w2[3] = wordl2[3] | wordr2[3]; + + u32x w3[4]; + + w3[0] = wordl3[0] | wordr3[0]; + w3[1] = wordl3[1] | wordr3[1]; + w3[2] = wordl3[2] | wordr3[2]; + w3[3] = wordl3[3] | wordr3[3]; + + u32x w0_t[4]; + + w0_t[0] = swap_workaround (w0[0]); + w0_t[1] = swap_workaround (w0[1]); + w0_t[2] = swap_workaround (w0[2]); + w0_t[3] = swap_workaround (w0[3]); + + u32x w1_t[4]; + + w1_t[0] = swap_workaround (w1[0]); + w1_t[1] = swap_workaround (w1[1]); + w1_t[2] = swap_workaround (w1[2]); + w1_t[3] = swap_workaround (w1[3]); + + u32x w2_t[4]; + + w2_t[0] = swap_workaround (w2[0]); + w2_t[1] = swap_workaround (w2[1]); + w2_t[2] = swap_workaround (w2[2]); + w2_t[3] = swap_workaround (w2[3]); + + u32x w3_t[4]; + + w3_t[0] = swap_workaround (w3[0]); + w3_t[1] = swap_workaround (w3[1]); + w3_t[2] = 0; + w3_t[3] = pw_len * 8; + + u32x digest[5]; + + digest[0] = SHA1M_A; + digest[1] = SHA1M_B; + digest[2] = SHA1M_C; + digest[3] = SHA1M_D; + digest[4] = SHA1M_E; + + sha1_transform (w0_t, w1_t, w2_t, w3_t, digest); + + u32x a; + u32x b; + u32x c; + u32x d; + u32x e; + + a = digest[0]; + b = digest[1]; + c = digest[2]; + d = digest[3]; + e = digest[4]; + + w0_t[0] = salt_buf0[0]; + w0_t[1] = salt_buf0[1]; + w0_t[2] = salt_buf0[2]; + w0_t[3] = salt_buf0[3]; + w1_t[0] = salt_buf1[0]; + w1_t[1] = salt_buf1[1]; + w1_t[2] = salt_buf1[2]; + w1_t[3] = salt_buf1[3]; + w2_t[0] = salt_buf2[0]; + w2_t[1] = salt_buf2[1]; + w2_t[2] = uint_to_hex_lower8_le ((a >> 16) & 255) << 0 + | uint_to_hex_lower8_le ((a >> 24) & 255) << 16; + w2_t[3] = uint_to_hex_lower8_le ((a >> 0) & 255) << 0 + | uint_to_hex_lower8_le ((a >> 8) & 255) << 16; + w3_t[0] = uint_to_hex_lower8_le ((b >> 16) & 255) << 0 + | uint_to_hex_lower8_le ((b >> 24) & 255) << 16; + w3_t[1] = uint_to_hex_lower8_le ((b >> 0) & 255) << 0 + | uint_to_hex_lower8_le ((b >> 8) & 255) << 16; + w3_t[2] = uint_to_hex_lower8_le ((c >> 16) & 255) << 0 + | uint_to_hex_lower8_le ((c >> 24) & 255) << 16; + w3_t[3] = uint_to_hex_lower8_le ((c >> 0) & 255) << 0 + | uint_to_hex_lower8_le ((c >> 8) & 255) << 16; + + digest[0] = SHA1M_A; + digest[1] = SHA1M_B; + digest[2] = SHA1M_C; + digest[3] = SHA1M_D; + digest[4] = SHA1M_E; + + sha1_transform (w0_t, w1_t, w2_t, w3_t, digest); + + w0_t[0] = uint_to_hex_lower8_le ((d >> 16) & 255) << 0 + | uint_to_hex_lower8_le ((d >> 24) & 255) << 16; + w0_t[1] = uint_to_hex_lower8_le ((d >> 0) & 255) << 0 + | uint_to_hex_lower8_le ((d >> 8) & 255) << 16; + w0_t[2] = uint_to_hex_lower8_le ((e >> 16) & 255) << 0 + | uint_to_hex_lower8_le ((e >> 24) & 255) << 16; + w0_t[3] = uint_to_hex_lower8_le ((e >> 0) & 255) << 0 + | uint_to_hex_lower8_le ((e >> 8) & 255) << 16; + w1_t[0] = 0x80000000; + w1_t[1] = 0; + w1_t[2] = 0; + w1_t[3] = 0; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = 80 * 8; + + sha1_transform (w0_t, w1_t, w2_t, w3_t, digest); + + a = digest[0]; + b = digest[1]; + c = digest[2]; + d = digest[3]; + e = digest[4]; + + w0_t[0] = salt_buf0[0]; + w0_t[1] = salt_buf0[1]; + w0_t[2] = salt_buf0[2]; + w0_t[3] = salt_buf0[3]; + w1_t[0] = salt_buf1[0]; + w1_t[1] = salt_buf1[1]; + w1_t[2] = salt_buf1[2]; + w1_t[3] = salt_buf1[3]; + w2_t[0] = salt_buf2[0]; + w2_t[1] = salt_buf2[1]; + w2_t[2] = uint_to_hex_lower8_le ((a >> 16) & 255) << 0 + | uint_to_hex_lower8_le ((a >> 24) & 255) << 16; + w2_t[3] = uint_to_hex_lower8_le ((a >> 0) & 255) << 0 + | uint_to_hex_lower8_le ((a >> 8) & 255) << 16; + w3_t[0] = uint_to_hex_lower8_le ((b >> 16) & 255) << 0 + | uint_to_hex_lower8_le ((b >> 24) & 255) << 16; + w3_t[1] = uint_to_hex_lower8_le ((b >> 0) & 255) << 0 + | uint_to_hex_lower8_le ((b >> 8) & 255) << 16; + w3_t[2] = uint_to_hex_lower8_le ((c >> 16) & 255) << 0 + | uint_to_hex_lower8_le ((c >> 24) & 255) << 16; + w3_t[3] = uint_to_hex_lower8_le ((c >> 0) & 255) << 0 + | uint_to_hex_lower8_le ((c >> 8) & 255) << 16; + + digest[0] = SHA1M_A; + digest[1] = SHA1M_B; + digest[2] = SHA1M_C; + digest[3] = SHA1M_D; + digest[4] = SHA1M_E; + + sha1_transform (w0_t, w1_t, w2_t, w3_t, digest); + + w0_t[0] = uint_to_hex_lower8_le ((d >> 16) & 255) << 0 + | uint_to_hex_lower8_le ((d >> 24) & 255) << 16; + w0_t[1] = uint_to_hex_lower8_le ((d >> 0) & 255) << 0 + | uint_to_hex_lower8_le ((d >> 8) & 255) << 16; + w0_t[2] = uint_to_hex_lower8_le ((e >> 16) & 255) << 0 + | uint_to_hex_lower8_le ((e >> 24) & 255) << 16; + w0_t[3] = uint_to_hex_lower8_le ((e >> 0) & 255) << 0 + | uint_to_hex_lower8_le ((e >> 8) & 255) << 16; + w1_t[0] = 0x80000000; + w1_t[1] = 0; + w1_t[2] = 0; + w1_t[3] = 0; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = 80 * 8; + + sha1_transform (w0_t, w1_t, w2_t, w3_t, digest); + + const u32x r0 = digest[3]; + const u32x r1 = digest[4]; + const u32x r2 = digest[2]; + const u32x r3 = digest[1]; + + #include VECT_COMPARE_M + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m08400_m08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m08400_m16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m08400_s04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + append_0x80_2 (wordl0, wordl1, pw_l_len); + + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, combs_buf[0].pw_len); + } + + /** + * bin2asc table + */ + + __local u32 l_bin2asc[256]; + + const u32 lid4 = lid * 4; + + const u32 lid40 = lid4 + 0; + const u32 lid41 = lid4 + 1; + const u32 lid42 = lid4 + 2; + const u32 lid43 = lid4 + 3; + + const u32 v400 = (lid40 >> 0) & 15; + const u32 v401 = (lid40 >> 4) & 15; + const u32 v410 = (lid41 >> 0) & 15; + const u32 v411 = (lid41 >> 4) & 15; + const u32 v420 = (lid42 >> 0) & 15; + const u32 v421 = (lid42 >> 4) & 15; + const u32 v430 = (lid43 >> 0) & 15; + const u32 v431 = (lid43 >> 4) & 15; + + l_bin2asc[lid40] = ((v400 < 10) ? '0' + v400 : 'a' - 10 + v400) << 0 + | ((v401 < 10) ? '0' + v401 : 'a' - 10 + v401) << 8; + l_bin2asc[lid41] = ((v410 < 10) ? '0' + v410 : 'a' - 10 + v410) << 0 + | ((v411 < 10) ? '0' + v411 : 'a' - 10 + v411) << 8; + l_bin2asc[lid42] = ((v420 < 10) ? '0' + v420 : 'a' - 10 + v420) << 0 + | ((v421 < 10) ? '0' + v421 : 'a' - 10 + v421) << 8; + l_bin2asc[lid43] = ((v430 < 10) ? '0' + v430 : 'a' - 10 + v430) << 0 + | ((v431 < 10) ? '0' + v431 : 'a' - 10 + v431) << 8; + + barrier (CLK_LOCAL_MEM_FENCE); + + if (gid >= gid_max) return; + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = swap_workaround (salt_bufs[salt_pos].salt_buf[ 0]); + salt_buf0[1] = swap_workaround (salt_bufs[salt_pos].salt_buf[ 1]); + salt_buf0[2] = swap_workaround (salt_bufs[salt_pos].salt_buf[ 2]); + salt_buf0[3] = swap_workaround (salt_bufs[salt_pos].salt_buf[ 3]); + + u32 salt_buf1[4]; + + salt_buf1[0] = swap_workaround (salt_bufs[salt_pos].salt_buf[ 4]); + salt_buf1[1] = swap_workaround (salt_bufs[salt_pos].salt_buf[ 5]); + salt_buf1[2] = swap_workaround (salt_bufs[salt_pos].salt_buf[ 6]); + salt_buf1[3] = swap_workaround (salt_bufs[salt_pos].salt_buf[ 7]); + + u32 salt_buf2[4]; + + salt_buf2[0] = swap_workaround (salt_bufs[salt_pos].salt_buf[ 8]); + salt_buf2[1] = swap_workaround (salt_bufs[salt_pos].salt_buf[ 9]); + salt_buf2[2] = 0; + salt_buf2[3] = 0; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = combs_buf[il_pos].pw_len; + + const u32 pw_len = pw_l_len + pw_r_len; + + u32 wordr0[4]; + + wordr0[0] = combs_buf[il_pos].i[0]; + wordr0[1] = combs_buf[il_pos].i[1]; + wordr0[2] = combs_buf[il_pos].i[2]; + wordr0[3] = combs_buf[il_pos].i[3]; + + u32 wordr1[4]; + + wordr1[0] = combs_buf[il_pos].i[4]; + wordr1[1] = combs_buf[il_pos].i[5]; + wordr1[2] = combs_buf[il_pos].i[6]; + wordr1[3] = combs_buf[il_pos].i[7]; + + u32 wordr2[4]; + + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + + u32 wordr3[4]; + + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + append_0x80_2 (wordr0, wordr1, pw_r_len); + + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + u32x w0[4]; + + w0[0] = wordl0[0] | wordr0[0]; + w0[1] = wordl0[1] | wordr0[1]; + w0[2] = wordl0[2] | wordr0[2]; + w0[3] = wordl0[3] | wordr0[3]; + + u32x w1[4]; + + w1[0] = wordl1[0] | wordr1[0]; + w1[1] = wordl1[1] | wordr1[1]; + w1[2] = wordl1[2] | wordr1[2]; + w1[3] = wordl1[3] | wordr1[3]; + + u32x w2[4]; + + w2[0] = wordl2[0] | wordr2[0]; + w2[1] = wordl2[1] | wordr2[1]; + w2[2] = wordl2[2] | wordr2[2]; + w2[3] = wordl2[3] | wordr2[3]; + + u32x w3[4]; + + w3[0] = wordl3[0] | wordr3[0]; + w3[1] = wordl3[1] | wordr3[1]; + w3[2] = wordl3[2] | wordr3[2]; + w3[3] = wordl3[3] | wordr3[3]; + + u32x w0_t[4]; + + w0_t[0] = swap_workaround (w0[0]); + w0_t[1] = swap_workaround (w0[1]); + w0_t[2] = swap_workaround (w0[2]); + w0_t[3] = swap_workaround (w0[3]); + + u32x w1_t[4]; + + w1_t[0] = swap_workaround (w1[0]); + w1_t[1] = swap_workaround (w1[1]); + w1_t[2] = swap_workaround (w1[2]); + w1_t[3] = swap_workaround (w1[3]); + + u32x w2_t[4]; + + w2_t[0] = swap_workaround (w2[0]); + w2_t[1] = swap_workaround (w2[1]); + w2_t[2] = swap_workaround (w2[2]); + w2_t[3] = swap_workaround (w2[3]); + + u32x w3_t[4]; + + w3_t[0] = swap_workaround (w3[0]); + w3_t[1] = swap_workaround (w3[1]); + w3_t[2] = 0; + w3_t[3] = pw_len * 8; + + u32x digest[5]; + + digest[0] = SHA1M_A; + digest[1] = SHA1M_B; + digest[2] = SHA1M_C; + digest[3] = SHA1M_D; + digest[4] = SHA1M_E; + + sha1_transform (w0_t, w1_t, w2_t, w3_t, digest); + + u32x a; + u32x b; + u32x c; + u32x d; + u32x e; + + a = digest[0]; + b = digest[1]; + c = digest[2]; + d = digest[3]; + e = digest[4]; + + w0_t[0] = salt_buf0[0]; + w0_t[1] = salt_buf0[1]; + w0_t[2] = salt_buf0[2]; + w0_t[3] = salt_buf0[3]; + w1_t[0] = salt_buf1[0]; + w1_t[1] = salt_buf1[1]; + w1_t[2] = salt_buf1[2]; + w1_t[3] = salt_buf1[3]; + w2_t[0] = salt_buf2[0]; + w2_t[1] = salt_buf2[1]; + w2_t[2] = uint_to_hex_lower8_le ((a >> 16) & 255) << 0 + | uint_to_hex_lower8_le ((a >> 24) & 255) << 16; + w2_t[3] = uint_to_hex_lower8_le ((a >> 0) & 255) << 0 + | uint_to_hex_lower8_le ((a >> 8) & 255) << 16; + w3_t[0] = uint_to_hex_lower8_le ((b >> 16) & 255) << 0 + | uint_to_hex_lower8_le ((b >> 24) & 255) << 16; + w3_t[1] = uint_to_hex_lower8_le ((b >> 0) & 255) << 0 + | uint_to_hex_lower8_le ((b >> 8) & 255) << 16; + w3_t[2] = uint_to_hex_lower8_le ((c >> 16) & 255) << 0 + | uint_to_hex_lower8_le ((c >> 24) & 255) << 16; + w3_t[3] = uint_to_hex_lower8_le ((c >> 0) & 255) << 0 + | uint_to_hex_lower8_le ((c >> 8) & 255) << 16; + + digest[0] = SHA1M_A; + digest[1] = SHA1M_B; + digest[2] = SHA1M_C; + digest[3] = SHA1M_D; + digest[4] = SHA1M_E; + + sha1_transform (w0_t, w1_t, w2_t, w3_t, digest); + + w0_t[0] = uint_to_hex_lower8_le ((d >> 16) & 255) << 0 + | uint_to_hex_lower8_le ((d >> 24) & 255) << 16; + w0_t[1] = uint_to_hex_lower8_le ((d >> 0) & 255) << 0 + | uint_to_hex_lower8_le ((d >> 8) & 255) << 16; + w0_t[2] = uint_to_hex_lower8_le ((e >> 16) & 255) << 0 + | uint_to_hex_lower8_le ((e >> 24) & 255) << 16; + w0_t[3] = uint_to_hex_lower8_le ((e >> 0) & 255) << 0 + | uint_to_hex_lower8_le ((e >> 8) & 255) << 16; + w1_t[0] = 0x80000000; + w1_t[1] = 0; + w1_t[2] = 0; + w1_t[3] = 0; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = (salt_len + 40) * 8; + + sha1_transform (w0_t, w1_t, w2_t, w3_t, digest); + + a = digest[0]; + b = digest[1]; + c = digest[2]; + d = digest[3]; + e = digest[4]; + + w0_t[0] = salt_buf0[0]; + w0_t[1] = salt_buf0[1]; + w0_t[2] = salt_buf0[2]; + w0_t[3] = salt_buf0[3]; + w1_t[0] = salt_buf1[0]; + w1_t[1] = salt_buf1[1]; + w1_t[2] = salt_buf1[2]; + w1_t[3] = salt_buf1[3]; + w2_t[0] = salt_buf2[0]; + w2_t[1] = salt_buf2[1]; + w2_t[2] = uint_to_hex_lower8_le ((a >> 16) & 255) << 0 + | uint_to_hex_lower8_le ((a >> 24) & 255) << 16; + w2_t[3] = uint_to_hex_lower8_le ((a >> 0) & 255) << 0 + | uint_to_hex_lower8_le ((a >> 8) & 255) << 16; + w3_t[0] = uint_to_hex_lower8_le ((b >> 16) & 255) << 0 + | uint_to_hex_lower8_le ((b >> 24) & 255) << 16; + w3_t[1] = uint_to_hex_lower8_le ((b >> 0) & 255) << 0 + | uint_to_hex_lower8_le ((b >> 8) & 255) << 16; + w3_t[2] = uint_to_hex_lower8_le ((c >> 16) & 255) << 0 + | uint_to_hex_lower8_le ((c >> 24) & 255) << 16; + w3_t[3] = uint_to_hex_lower8_le ((c >> 0) & 255) << 0 + | uint_to_hex_lower8_le ((c >> 8) & 255) << 16; + + digest[0] = SHA1M_A; + digest[1] = SHA1M_B; + digest[2] = SHA1M_C; + digest[3] = SHA1M_D; + digest[4] = SHA1M_E; + + sha1_transform (w0_t, w1_t, w2_t, w3_t, digest); + + w0_t[0] = uint_to_hex_lower8_le ((d >> 16) & 255) << 0 + | uint_to_hex_lower8_le ((d >> 24) & 255) << 16; + w0_t[1] = uint_to_hex_lower8_le ((d >> 0) & 255) << 0 + | uint_to_hex_lower8_le ((d >> 8) & 255) << 16; + w0_t[2] = uint_to_hex_lower8_le ((e >> 16) & 255) << 0 + | uint_to_hex_lower8_le ((e >> 24) & 255) << 16; + w0_t[3] = uint_to_hex_lower8_le ((e >> 0) & 255) << 0 + | uint_to_hex_lower8_le ((e >> 8) & 255) << 16; + w1_t[0] = 0x80000000; + w1_t[1] = 0; + w1_t[2] = 0; + w1_t[3] = 0; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = (salt_len + 40) * 8; + + sha1_transform (w0_t, w1_t, w2_t, w3_t, digest); + + const u32x r0 = digest[3]; + const u32x r1 = digest[4]; + const u32x r2 = digest[2]; + const u32x r3 = digest[1]; + + #include VECT_COMPARE_S + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m08400_s08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m08400_s16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/amd/m08400_a3.cl b/amd/m08400_a3.cl new file mode 100644 index 0000000000..7a97f84787 --- /dev/null +++ b/amd/m08400_a3.cl @@ -0,0 +1,1125 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _SHA1_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW4 +#define VECT_SIZE4 +#endif + +#ifdef VLIW5 +#define VECT_SIZE2 +#endif + +#define DGST_R0 3 +#define DGST_R1 4 +#define DGST_R2 2 +#define DGST_R3 1 + +#include "include/kernel_functions.c" +#include "types_amd.c" +#include "common_amd.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +#ifdef VECT_SIZE1 +#define uint_to_hex_lower8_le(i) l_bin2asc[(i)] +#endif + +#ifdef VECT_SIZE2 +#define uint_to_hex_lower8_le(i) u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1]) +#endif + +#ifdef VECT_SIZE4 +#define uint_to_hex_lower8_le(i) u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3]) +#endif + +static void sha1_transform (const u32x w0[4], const u32x w1[4], const u32x w2[4], const u32x w3[4], u32x digest[5]) +{ + u32x A = digest[0]; + u32x B = digest[1]; + u32x C = digest[2]; + u32x D = digest[3]; + u32x E = digest[4]; + + u32x w0_t = w0[0]; + u32x w1_t = w0[1]; + u32x w2_t = w0[2]; + u32x w3_t = w0[3]; + u32x w4_t = w1[0]; + u32x w5_t = w1[1]; + u32x w6_t = w1[2]; + u32x w7_t = w1[3]; + u32x w8_t = w2[0]; + u32x w9_t = w2[1]; + u32x wa_t = w2[2]; + u32x wb_t = w2[3]; + u32x wc_t = w3[0]; + u32x wd_t = w3[1]; + u32x we_t = w3[2]; + u32x wf_t = w3[3]; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, A, B, C, D, E, w0_t); + SHA1_STEP (SHA1_F0o, E, A, B, C, D, w1_t); + SHA1_STEP (SHA1_F0o, D, E, A, B, C, w2_t); + SHA1_STEP (SHA1_F0o, C, D, E, A, B, w3_t); + SHA1_STEP (SHA1_F0o, B, C, D, E, A, w4_t); + SHA1_STEP (SHA1_F0o, A, B, C, D, E, w5_t); + SHA1_STEP (SHA1_F0o, E, A, B, C, D, w6_t); + SHA1_STEP (SHA1_F0o, D, E, A, B, C, w7_t); + SHA1_STEP (SHA1_F0o, C, D, E, A, B, w8_t); + SHA1_STEP (SHA1_F0o, B, C, D, E, A, w9_t); + SHA1_STEP (SHA1_F0o, A, B, C, D, E, wa_t); + SHA1_STEP (SHA1_F0o, E, A, B, C, D, wb_t); + SHA1_STEP (SHA1_F0o, D, E, A, B, C, wc_t); + SHA1_STEP (SHA1_F0o, C, D, E, A, B, wd_t); + SHA1_STEP (SHA1_F0o, B, C, D, E, A, we_t); + SHA1_STEP (SHA1_F0o, A, B, C, D, E, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F0o, E, A, B, C, D, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F0o, D, E, A, B, C, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F0o, C, D, E, A, B, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F0o, B, C, D, E, A, w3_t); + + #undef K + #define K SHA1C01 + + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w7_t); + + #undef K + #define K SHA1C02 + + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, wb_t); + + #undef K + #define K SHA1C03 + + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, wf_t); + + digest[0] += A; + digest[1] += B; + digest[2] += C; + digest[3] += D; + digest[4] += E; +} + +static void m08400m (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], const u32 pw_len, __global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, __local u32 l_bin2asc[256]) +{ + /** + * modifier + */ + + const u32 gid = get_global_id (0); + const u32 lid = get_local_id (0); + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = swap_workaround (salt_bufs[salt_pos].salt_buf[ 0]); + salt_buf0[1] = swap_workaround (salt_bufs[salt_pos].salt_buf[ 1]); + salt_buf0[2] = swap_workaround (salt_bufs[salt_pos].salt_buf[ 2]); + salt_buf0[3] = swap_workaround (salt_bufs[salt_pos].salt_buf[ 3]); + + u32 salt_buf1[4]; + + salt_buf1[0] = swap_workaround (salt_bufs[salt_pos].salt_buf[ 4]); + salt_buf1[1] = swap_workaround (salt_bufs[salt_pos].salt_buf[ 5]); + salt_buf1[2] = swap_workaround (salt_bufs[salt_pos].salt_buf[ 6]); + salt_buf1[3] = swap_workaround (salt_bufs[salt_pos].salt_buf[ 7]); + + u32 salt_buf2[4]; + + salt_buf2[0] = swap_workaround (salt_bufs[salt_pos].salt_buf[ 8]); + salt_buf2[1] = swap_workaround (salt_bufs[salt_pos].salt_buf[ 9]); + salt_buf2[2] = 0; + salt_buf2[3] = 0; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + /** + * loop + */ + + u32x w0l = w0[0]; + + for (u32 il_pos = 0; il_pos < bfs_cnt; il_pos++) + { + const u32 w0r = bfs_buf[il_pos].i; + + w0[0] = w0l | w0r; + + u32x w0_t[4]; + + w0_t[0] = w0[0]; + w0_t[1] = w0[1]; + w0_t[2] = w0[2]; + w0_t[3] = w0[3]; + + u32x w1_t[4]; + + w1_t[0] = w1[0]; + w1_t[1] = w1[1]; + w1_t[2] = w1[2]; + w1_t[3] = w1[3]; + + u32x w2_t[4]; + + w2_t[0] = w2[0]; + w2_t[1] = w2[1]; + w2_t[2] = w2[2]; + w2_t[3] = w2[3]; + + u32x w3_t[4]; + + w3_t[0] = w3[0]; + w3_t[1] = w3[1]; + w3_t[2] = 0; + w3_t[3] = pw_len * 8; + + u32x digest[5]; + + digest[0] = SHA1M_A; + digest[1] = SHA1M_B; + digest[2] = SHA1M_C; + digest[3] = SHA1M_D; + digest[4] = SHA1M_E; + + sha1_transform (w0_t, w1_t, w2_t, w3_t, digest); + + u32x a; + u32x b; + u32x c; + u32x d; + u32x e; + + a = digest[0]; + b = digest[1]; + c = digest[2]; + d = digest[3]; + e = digest[4]; + + w0_t[0] = salt_buf0[0]; + w0_t[1] = salt_buf0[1]; + w0_t[2] = salt_buf0[2]; + w0_t[3] = salt_buf0[3]; + w1_t[0] = salt_buf1[0]; + w1_t[1] = salt_buf1[1]; + w1_t[2] = salt_buf1[2]; + w1_t[3] = salt_buf1[3]; + w2_t[0] = salt_buf2[0]; + w2_t[1] = salt_buf2[1]; + w2_t[2] = uint_to_hex_lower8_le ((a >> 16) & 255) << 0 + | uint_to_hex_lower8_le ((a >> 24) & 255) << 16; + w2_t[3] = uint_to_hex_lower8_le ((a >> 0) & 255) << 0 + | uint_to_hex_lower8_le ((a >> 8) & 255) << 16; + w3_t[0] = uint_to_hex_lower8_le ((b >> 16) & 255) << 0 + | uint_to_hex_lower8_le ((b >> 24) & 255) << 16; + w3_t[1] = uint_to_hex_lower8_le ((b >> 0) & 255) << 0 + | uint_to_hex_lower8_le ((b >> 8) & 255) << 16; + w3_t[2] = uint_to_hex_lower8_le ((c >> 16) & 255) << 0 + | uint_to_hex_lower8_le ((c >> 24) & 255) << 16; + w3_t[3] = uint_to_hex_lower8_le ((c >> 0) & 255) << 0 + | uint_to_hex_lower8_le ((c >> 8) & 255) << 16; + + digest[0] = SHA1M_A; + digest[1] = SHA1M_B; + digest[2] = SHA1M_C; + digest[3] = SHA1M_D; + digest[4] = SHA1M_E; + + sha1_transform (w0_t, w1_t, w2_t, w3_t, digest); + + w0_t[0] = uint_to_hex_lower8_le ((d >> 16) & 255) << 0 + | uint_to_hex_lower8_le ((d >> 24) & 255) << 16; + w0_t[1] = uint_to_hex_lower8_le ((d >> 0) & 255) << 0 + | uint_to_hex_lower8_le ((d >> 8) & 255) << 16; + w0_t[2] = uint_to_hex_lower8_le ((e >> 16) & 255) << 0 + | uint_to_hex_lower8_le ((e >> 24) & 255) << 16; + w0_t[3] = uint_to_hex_lower8_le ((e >> 0) & 255) << 0 + | uint_to_hex_lower8_le ((e >> 8) & 255) << 16; + w1_t[0] = 0x80000000; + w1_t[1] = 0; + w1_t[2] = 0; + w1_t[3] = 0; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = 80 * 8; + + sha1_transform (w0_t, w1_t, w2_t, w3_t, digest); + + a = digest[0]; + b = digest[1]; + c = digest[2]; + d = digest[3]; + e = digest[4]; + + w0_t[0] = salt_buf0[0]; + w0_t[1] = salt_buf0[1]; + w0_t[2] = salt_buf0[2]; + w0_t[3] = salt_buf0[3]; + w1_t[0] = salt_buf1[0]; + w1_t[1] = salt_buf1[1]; + w1_t[2] = salt_buf1[2]; + w1_t[3] = salt_buf1[3]; + w2_t[0] = salt_buf2[0]; + w2_t[1] = salt_buf2[1]; + w2_t[2] = uint_to_hex_lower8_le ((a >> 16) & 255) << 0 + | uint_to_hex_lower8_le ((a >> 24) & 255) << 16; + w2_t[3] = uint_to_hex_lower8_le ((a >> 0) & 255) << 0 + | uint_to_hex_lower8_le ((a >> 8) & 255) << 16; + w3_t[0] = uint_to_hex_lower8_le ((b >> 16) & 255) << 0 + | uint_to_hex_lower8_le ((b >> 24) & 255) << 16; + w3_t[1] = uint_to_hex_lower8_le ((b >> 0) & 255) << 0 + | uint_to_hex_lower8_le ((b >> 8) & 255) << 16; + w3_t[2] = uint_to_hex_lower8_le ((c >> 16) & 255) << 0 + | uint_to_hex_lower8_le ((c >> 24) & 255) << 16; + w3_t[3] = uint_to_hex_lower8_le ((c >> 0) & 255) << 0 + | uint_to_hex_lower8_le ((c >> 8) & 255) << 16; + + digest[0] = SHA1M_A; + digest[1] = SHA1M_B; + digest[2] = SHA1M_C; + digest[3] = SHA1M_D; + digest[4] = SHA1M_E; + + sha1_transform (w0_t, w1_t, w2_t, w3_t, digest); + + w0_t[0] = uint_to_hex_lower8_le ((d >> 16) & 255) << 0 + | uint_to_hex_lower8_le ((d >> 24) & 255) << 16; + w0_t[1] = uint_to_hex_lower8_le ((d >> 0) & 255) << 0 + | uint_to_hex_lower8_le ((d >> 8) & 255) << 16; + w0_t[2] = uint_to_hex_lower8_le ((e >> 16) & 255) << 0 + | uint_to_hex_lower8_le ((e >> 24) & 255) << 16; + w0_t[3] = uint_to_hex_lower8_le ((e >> 0) & 255) << 0 + | uint_to_hex_lower8_le ((e >> 8) & 255) << 16; + w1_t[0] = 0x80000000; + w1_t[1] = 0; + w1_t[2] = 0; + w1_t[3] = 0; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = 80 * 8; + + sha1_transform (w0_t, w1_t, w2_t, w3_t, digest); + + const u32x r0 = digest[3]; + const u32x r1 = digest[4]; + const u32x r2 = digest[2]; + const u32x r3 = digest[1]; + + #include VECT_COMPARE_M + } +} + +static void m08400s (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], const u32 pw_len, __global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, __local u32 l_bin2asc[256]) +{ + /** + * modifier + */ + + const u32 gid = get_global_id (0); + const u32 lid = get_local_id (0); + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = swap_workaround (salt_bufs[salt_pos].salt_buf[ 0]); + salt_buf0[1] = swap_workaround (salt_bufs[salt_pos].salt_buf[ 1]); + salt_buf0[2] = swap_workaround (salt_bufs[salt_pos].salt_buf[ 2]); + salt_buf0[3] = swap_workaround (salt_bufs[salt_pos].salt_buf[ 3]); + + u32 salt_buf1[4]; + + salt_buf1[0] = swap_workaround (salt_bufs[salt_pos].salt_buf[ 4]); + salt_buf1[1] = swap_workaround (salt_bufs[salt_pos].salt_buf[ 5]); + salt_buf1[2] = swap_workaround (salt_bufs[salt_pos].salt_buf[ 6]); + salt_buf1[3] = swap_workaround (salt_bufs[salt_pos].salt_buf[ 7]); + + u32 salt_buf2[4]; + + salt_buf2[0] = swap_workaround (salt_bufs[salt_pos].salt_buf[ 8]); + salt_buf2[1] = swap_workaround (salt_bufs[salt_pos].salt_buf[ 9]); + salt_buf2[2] = 0; + salt_buf2[3] = 0; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + /** + * loop + */ + + u32x w0l = w0[0]; + + for (u32 il_pos = 0; il_pos < bfs_cnt; il_pos++) + { + const u32 w0r = bfs_buf[il_pos].i; + + w0[0] = w0l | w0r; + + u32x w0_t[4]; + + w0_t[0] = w0[0]; + w0_t[1] = w0[1]; + w0_t[2] = w0[2]; + w0_t[3] = w0[3]; + + u32x w1_t[4]; + + w1_t[0] = w1[0]; + w1_t[1] = w1[1]; + w1_t[2] = w1[2]; + w1_t[3] = w1[3]; + + u32x w2_t[4]; + + w2_t[0] = w2[0]; + w2_t[1] = w2[1]; + w2_t[2] = w2[2]; + w2_t[3] = w2[3]; + + u32x w3_t[4]; + + w3_t[0] = w3[0]; + w3_t[1] = w3[1]; + w3_t[2] = 0; + w3_t[3] = pw_len * 8; + + u32x digest[5]; + + digest[0] = SHA1M_A; + digest[1] = SHA1M_B; + digest[2] = SHA1M_C; + digest[3] = SHA1M_D; + digest[4] = SHA1M_E; + + sha1_transform (w0_t, w1_t, w2_t, w3_t, digest); + + u32x a; + u32x b; + u32x c; + u32x d; + u32x e; + + a = digest[0]; + b = digest[1]; + c = digest[2]; + d = digest[3]; + e = digest[4]; + + w0_t[0] = salt_buf0[0]; + w0_t[1] = salt_buf0[1]; + w0_t[2] = salt_buf0[2]; + w0_t[3] = salt_buf0[3]; + w1_t[0] = salt_buf1[0]; + w1_t[1] = salt_buf1[1]; + w1_t[2] = salt_buf1[2]; + w1_t[3] = salt_buf1[3]; + w2_t[0] = salt_buf2[0]; + w2_t[1] = salt_buf2[1]; + w2_t[2] = uint_to_hex_lower8_le ((a >> 16) & 255) << 0 + | uint_to_hex_lower8_le ((a >> 24) & 255) << 16; + w2_t[3] = uint_to_hex_lower8_le ((a >> 0) & 255) << 0 + | uint_to_hex_lower8_le ((a >> 8) & 255) << 16; + w3_t[0] = uint_to_hex_lower8_le ((b >> 16) & 255) << 0 + | uint_to_hex_lower8_le ((b >> 24) & 255) << 16; + w3_t[1] = uint_to_hex_lower8_le ((b >> 0) & 255) << 0 + | uint_to_hex_lower8_le ((b >> 8) & 255) << 16; + w3_t[2] = uint_to_hex_lower8_le ((c >> 16) & 255) << 0 + | uint_to_hex_lower8_le ((c >> 24) & 255) << 16; + w3_t[3] = uint_to_hex_lower8_le ((c >> 0) & 255) << 0 + | uint_to_hex_lower8_le ((c >> 8) & 255) << 16; + + digest[0] = SHA1M_A; + digest[1] = SHA1M_B; + digest[2] = SHA1M_C; + digest[3] = SHA1M_D; + digest[4] = SHA1M_E; + + sha1_transform (w0_t, w1_t, w2_t, w3_t, digest); + + w0_t[0] = uint_to_hex_lower8_le ((d >> 16) & 255) << 0 + | uint_to_hex_lower8_le ((d >> 24) & 255) << 16; + w0_t[1] = uint_to_hex_lower8_le ((d >> 0) & 255) << 0 + | uint_to_hex_lower8_le ((d >> 8) & 255) << 16; + w0_t[2] = uint_to_hex_lower8_le ((e >> 16) & 255) << 0 + | uint_to_hex_lower8_le ((e >> 24) & 255) << 16; + w0_t[3] = uint_to_hex_lower8_le ((e >> 0) & 255) << 0 + | uint_to_hex_lower8_le ((e >> 8) & 255) << 16; + w1_t[0] = 0x80000000; + w1_t[1] = 0; + w1_t[2] = 0; + w1_t[3] = 0; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = (salt_len + 40) * 8; + + sha1_transform (w0_t, w1_t, w2_t, w3_t, digest); + + a = digest[0]; + b = digest[1]; + c = digest[2]; + d = digest[3]; + e = digest[4]; + + w0_t[0] = salt_buf0[0]; + w0_t[1] = salt_buf0[1]; + w0_t[2] = salt_buf0[2]; + w0_t[3] = salt_buf0[3]; + w1_t[0] = salt_buf1[0]; + w1_t[1] = salt_buf1[1]; + w1_t[2] = salt_buf1[2]; + w1_t[3] = salt_buf1[3]; + w2_t[0] = salt_buf2[0]; + w2_t[1] = salt_buf2[1]; + w2_t[2] = uint_to_hex_lower8_le ((a >> 16) & 255) << 0 + | uint_to_hex_lower8_le ((a >> 24) & 255) << 16; + w2_t[3] = uint_to_hex_lower8_le ((a >> 0) & 255) << 0 + | uint_to_hex_lower8_le ((a >> 8) & 255) << 16; + w3_t[0] = uint_to_hex_lower8_le ((b >> 16) & 255) << 0 + | uint_to_hex_lower8_le ((b >> 24) & 255) << 16; + w3_t[1] = uint_to_hex_lower8_le ((b >> 0) & 255) << 0 + | uint_to_hex_lower8_le ((b >> 8) & 255) << 16; + w3_t[2] = uint_to_hex_lower8_le ((c >> 16) & 255) << 0 + | uint_to_hex_lower8_le ((c >> 24) & 255) << 16; + w3_t[3] = uint_to_hex_lower8_le ((c >> 0) & 255) << 0 + | uint_to_hex_lower8_le ((c >> 8) & 255) << 16; + + digest[0] = SHA1M_A; + digest[1] = SHA1M_B; + digest[2] = SHA1M_C; + digest[3] = SHA1M_D; + digest[4] = SHA1M_E; + + sha1_transform (w0_t, w1_t, w2_t, w3_t, digest); + + w0_t[0] = uint_to_hex_lower8_le ((d >> 16) & 255) << 0 + | uint_to_hex_lower8_le ((d >> 24) & 255) << 16; + w0_t[1] = uint_to_hex_lower8_le ((d >> 0) & 255) << 0 + | uint_to_hex_lower8_le ((d >> 8) & 255) << 16; + w0_t[2] = uint_to_hex_lower8_le ((e >> 16) & 255) << 0 + | uint_to_hex_lower8_le ((e >> 24) & 255) << 16; + w0_t[3] = uint_to_hex_lower8_le ((e >> 0) & 255) << 0 + | uint_to_hex_lower8_le ((e >> 8) & 255) << 16; + w1_t[0] = 0x80000000; + w1_t[1] = 0; + w1_t[2] = 0; + w1_t[3] = 0; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = (salt_len + 40) * 8; + + sha1_transform (w0_t, w1_t, w2_t, w3_t, digest); + + const u32x r0 = digest[3]; + const u32x r1 = digest[4]; + const u32x r2 = digest[2]; + const u32x r3 = digest[1]; + + #include VECT_COMPARE_S + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m08400_m04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *ss, __global void *ess, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + const u32 lid = get_local_id (0); + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * bin2asc table + */ + + __local u32 l_bin2asc[256]; + + const u32 lid4 = lid * 4; + + const u32 lid40 = lid4 + 0; + const u32 lid41 = lid4 + 1; + const u32 lid42 = lid4 + 2; + const u32 lid43 = lid4 + 3; + + const u32 v400 = (lid40 >> 0) & 15; + const u32 v401 = (lid40 >> 4) & 15; + const u32 v410 = (lid41 >> 0) & 15; + const u32 v411 = (lid41 >> 4) & 15; + const u32 v420 = (lid42 >> 0) & 15; + const u32 v421 = (lid42 >> 4) & 15; + const u32 v430 = (lid43 >> 0) & 15; + const u32 v431 = (lid43 >> 4) & 15; + + l_bin2asc[lid40] = ((v400 < 10) ? '0' + v400 : 'a' - 10 + v400) << 0 + | ((v401 < 10) ? '0' + v401 : 'a' - 10 + v401) << 8; + l_bin2asc[lid41] = ((v410 < 10) ? '0' + v410 : 'a' - 10 + v410) << 0 + | ((v411 < 10) ? '0' + v411 : 'a' - 10 + v411) << 8; + l_bin2asc[lid42] = ((v420 < 10) ? '0' + v420 : 'a' - 10 + v420) << 0 + | ((v421 < 10) ? '0' + v421 : 'a' - 10 + v421) << 8; + l_bin2asc[lid43] = ((v430 < 10) ? '0' + v430 : 'a' - 10 + v430) << 0 + | ((v431 < 10) ? '0' + v431 : 'a' - 10 + v431) << 8; + + barrier (CLK_LOCAL_MEM_FENCE); + + if (gid >= gid_max) return; + + /** + * main + */ + + m08400m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, ss, ess, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset, l_bin2asc); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m08400_m08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *ss, __global void *ess, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + const u32 lid = get_local_id (0); + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * bin2asc table + */ + + __local u32 l_bin2asc[256]; + + const u32 lid4 = lid * 4; + + const u32 lid40 = lid4 + 0; + const u32 lid41 = lid4 + 1; + const u32 lid42 = lid4 + 2; + const u32 lid43 = lid4 + 3; + + const u32 v400 = (lid40 >> 0) & 15; + const u32 v401 = (lid40 >> 4) & 15; + const u32 v410 = (lid41 >> 0) & 15; + const u32 v411 = (lid41 >> 4) & 15; + const u32 v420 = (lid42 >> 0) & 15; + const u32 v421 = (lid42 >> 4) & 15; + const u32 v430 = (lid43 >> 0) & 15; + const u32 v431 = (lid43 >> 4) & 15; + + l_bin2asc[lid40] = ((v400 < 10) ? '0' + v400 : 'a' - 10 + v400) << 0 + | ((v401 < 10) ? '0' + v401 : 'a' - 10 + v401) << 8; + l_bin2asc[lid41] = ((v410 < 10) ? '0' + v410 : 'a' - 10 + v410) << 0 + | ((v411 < 10) ? '0' + v411 : 'a' - 10 + v411) << 8; + l_bin2asc[lid42] = ((v420 < 10) ? '0' + v420 : 'a' - 10 + v420) << 0 + | ((v421 < 10) ? '0' + v421 : 'a' - 10 + v421) << 8; + l_bin2asc[lid43] = ((v430 < 10) ? '0' + v430 : 'a' - 10 + v430) << 0 + | ((v431 < 10) ? '0' + v431 : 'a' - 10 + v431) << 8; + + barrier (CLK_LOCAL_MEM_FENCE); + + if (gid >= gid_max) return; + + /** + * main + */ + + m08400m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, ss, ess, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset, l_bin2asc); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m08400_m16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *ss, __global void *ess, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + const u32 lid = get_local_id (0); + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = pws[gid].i[ 8]; + w2[1] = pws[gid].i[ 9]; + w2[2] = pws[gid].i[10]; + w2[3] = pws[gid].i[11]; + + u32x w3[4]; + + w3[0] = pws[gid].i[12]; + w3[1] = pws[gid].i[13]; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * bin2asc table + */ + + __local u32 l_bin2asc[256]; + + const u32 lid4 = lid * 4; + + const u32 lid40 = lid4 + 0; + const u32 lid41 = lid4 + 1; + const u32 lid42 = lid4 + 2; + const u32 lid43 = lid4 + 3; + + const u32 v400 = (lid40 >> 0) & 15; + const u32 v401 = (lid40 >> 4) & 15; + const u32 v410 = (lid41 >> 0) & 15; + const u32 v411 = (lid41 >> 4) & 15; + const u32 v420 = (lid42 >> 0) & 15; + const u32 v421 = (lid42 >> 4) & 15; + const u32 v430 = (lid43 >> 0) & 15; + const u32 v431 = (lid43 >> 4) & 15; + + l_bin2asc[lid40] = ((v400 < 10) ? '0' + v400 : 'a' - 10 + v400) << 0 + | ((v401 < 10) ? '0' + v401 : 'a' - 10 + v401) << 8; + l_bin2asc[lid41] = ((v410 < 10) ? '0' + v410 : 'a' - 10 + v410) << 0 + | ((v411 < 10) ? '0' + v411 : 'a' - 10 + v411) << 8; + l_bin2asc[lid42] = ((v420 < 10) ? '0' + v420 : 'a' - 10 + v420) << 0 + | ((v421 < 10) ? '0' + v421 : 'a' - 10 + v421) << 8; + l_bin2asc[lid43] = ((v430 < 10) ? '0' + v430 : 'a' - 10 + v430) << 0 + | ((v431 < 10) ? '0' + v431 : 'a' - 10 + v431) << 8; + + barrier (CLK_LOCAL_MEM_FENCE); + + if (gid >= gid_max) return; + + /** + * main + */ + + m08400m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, ss, ess, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset, l_bin2asc); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m08400_s04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *ss, __global void *ess, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + const u32 lid = get_local_id (0); + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * bin2asc table + */ + + __local u32 l_bin2asc[256]; + + const u32 lid4 = lid * 4; + + const u32 lid40 = lid4 + 0; + const u32 lid41 = lid4 + 1; + const u32 lid42 = lid4 + 2; + const u32 lid43 = lid4 + 3; + + const u32 v400 = (lid40 >> 0) & 15; + const u32 v401 = (lid40 >> 4) & 15; + const u32 v410 = (lid41 >> 0) & 15; + const u32 v411 = (lid41 >> 4) & 15; + const u32 v420 = (lid42 >> 0) & 15; + const u32 v421 = (lid42 >> 4) & 15; + const u32 v430 = (lid43 >> 0) & 15; + const u32 v431 = (lid43 >> 4) & 15; + + l_bin2asc[lid40] = ((v400 < 10) ? '0' + v400 : 'a' - 10 + v400) << 0 + | ((v401 < 10) ? '0' + v401 : 'a' - 10 + v401) << 8; + l_bin2asc[lid41] = ((v410 < 10) ? '0' + v410 : 'a' - 10 + v410) << 0 + | ((v411 < 10) ? '0' + v411 : 'a' - 10 + v411) << 8; + l_bin2asc[lid42] = ((v420 < 10) ? '0' + v420 : 'a' - 10 + v420) << 0 + | ((v421 < 10) ? '0' + v421 : 'a' - 10 + v421) << 8; + l_bin2asc[lid43] = ((v430 < 10) ? '0' + v430 : 'a' - 10 + v430) << 0 + | ((v431 < 10) ? '0' + v431 : 'a' - 10 + v431) << 8; + + barrier (CLK_LOCAL_MEM_FENCE); + + if (gid >= gid_max) return; + + /** + * main + */ + + m08400s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, ss, ess, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset, l_bin2asc); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m08400_s08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *ss, __global void *ess, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + const u32 lid = get_local_id (0); + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * bin2asc table + */ + + __local u32 l_bin2asc[256]; + + const u32 lid4 = lid * 4; + + const u32 lid40 = lid4 + 0; + const u32 lid41 = lid4 + 1; + const u32 lid42 = lid4 + 2; + const u32 lid43 = lid4 + 3; + + const u32 v400 = (lid40 >> 0) & 15; + const u32 v401 = (lid40 >> 4) & 15; + const u32 v410 = (lid41 >> 0) & 15; + const u32 v411 = (lid41 >> 4) & 15; + const u32 v420 = (lid42 >> 0) & 15; + const u32 v421 = (lid42 >> 4) & 15; + const u32 v430 = (lid43 >> 0) & 15; + const u32 v431 = (lid43 >> 4) & 15; + + l_bin2asc[lid40] = ((v400 < 10) ? '0' + v400 : 'a' - 10 + v400) << 0 + | ((v401 < 10) ? '0' + v401 : 'a' - 10 + v401) << 8; + l_bin2asc[lid41] = ((v410 < 10) ? '0' + v410 : 'a' - 10 + v410) << 0 + | ((v411 < 10) ? '0' + v411 : 'a' - 10 + v411) << 8; + l_bin2asc[lid42] = ((v420 < 10) ? '0' + v420 : 'a' - 10 + v420) << 0 + | ((v421 < 10) ? '0' + v421 : 'a' - 10 + v421) << 8; + l_bin2asc[lid43] = ((v430 < 10) ? '0' + v430 : 'a' - 10 + v430) << 0 + | ((v431 < 10) ? '0' + v431 : 'a' - 10 + v431) << 8; + + barrier (CLK_LOCAL_MEM_FENCE); + + if (gid >= gid_max) return; + + /** + * main + */ + + m08400s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, ss, ess, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset, l_bin2asc); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m08400_s16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *ss, __global void *ess, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + const u32 lid = get_local_id (0); + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = pws[gid].i[ 8]; + w2[1] = pws[gid].i[ 9]; + w2[2] = pws[gid].i[10]; + w2[3] = pws[gid].i[11]; + + u32x w3[4]; + + w3[0] = pws[gid].i[12]; + w3[1] = pws[gid].i[13]; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * bin2asc table + */ + + __local u32 l_bin2asc[256]; + + const u32 lid4 = lid * 4; + + const u32 lid40 = lid4 + 0; + const u32 lid41 = lid4 + 1; + const u32 lid42 = lid4 + 2; + const u32 lid43 = lid4 + 3; + + const u32 v400 = (lid40 >> 0) & 15; + const u32 v401 = (lid40 >> 4) & 15; + const u32 v410 = (lid41 >> 0) & 15; + const u32 v411 = (lid41 >> 4) & 15; + const u32 v420 = (lid42 >> 0) & 15; + const u32 v421 = (lid42 >> 4) & 15; + const u32 v430 = (lid43 >> 0) & 15; + const u32 v431 = (lid43 >> 4) & 15; + + l_bin2asc[lid40] = ((v400 < 10) ? '0' + v400 : 'a' - 10 + v400) << 0 + | ((v401 < 10) ? '0' + v401 : 'a' - 10 + v401) << 8; + l_bin2asc[lid41] = ((v410 < 10) ? '0' + v410 : 'a' - 10 + v410) << 0 + | ((v411 < 10) ? '0' + v411 : 'a' - 10 + v411) << 8; + l_bin2asc[lid42] = ((v420 < 10) ? '0' + v420 : 'a' - 10 + v420) << 0 + | ((v421 < 10) ? '0' + v421 : 'a' - 10 + v421) << 8; + l_bin2asc[lid43] = ((v430 < 10) ? '0' + v430 : 'a' - 10 + v430) << 0 + | ((v431 < 10) ? '0' + v431 : 'a' - 10 + v431) << 8; + + barrier (CLK_LOCAL_MEM_FENCE); + + if (gid >= gid_max) return; + + /** + * main + */ + + m08400s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, ss, ess, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset, l_bin2asc); +} diff --git a/amd/m08500_a0.cl b/amd/m08500_a0.cl new file mode 100644 index 0000000000..0d0ed4d7da --- /dev/null +++ b/amd/m08500_a0.cl @@ -0,0 +1,1011 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _DES_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW4 +#define VECT_SIZE2 +#endif + +#ifdef VLIW5 +#define VECT_SIZE2 +#endif + +#define DGST_R0 0 +#define DGST_R1 1 +#define DGST_R2 2 +#define DGST_R3 3 + +#include "include/kernel_functions.c" +#include "types_amd.c" +#include "common_amd.c" +#include "include/rp_gpu.h" +#include "rp_amd.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +#define PERM_OP(a,b,tt,n,m) \ +{ \ + tt = a >> n; \ + tt = tt ^ b; \ + tt = tt & m; \ + b = b ^ tt; \ + tt = tt << n; \ + a = a ^ tt; \ +} + +#define HPERM_OP(a,tt,n,m) \ +{ \ + tt = a << (16 + n); \ + tt = tt ^ a; \ + tt = tt & m; \ + a = a ^ tt; \ + tt = tt >> (16 + n); \ + a = a ^ tt; \ +} + +#define IP(l,r,tt) \ +{ \ + PERM_OP (r, l, tt, 4, 0x0f0f0f0f); \ + PERM_OP (l, r, tt, 16, 0x0000ffff); \ + PERM_OP (r, l, tt, 2, 0x33333333); \ + PERM_OP (l, r, tt, 8, 0x00ff00ff); \ + PERM_OP (r, l, tt, 1, 0x55555555); \ +} + +#define FP(l,r,tt) \ +{ \ + PERM_OP (l, r, tt, 1, 0x55555555); \ + PERM_OP (r, l, tt, 8, 0x00ff00ff); \ + PERM_OP (l, r, tt, 2, 0x33333333); \ + PERM_OP (r, l, tt, 16, 0x0000ffff); \ + PERM_OP (l, r, tt, 4, 0x0f0f0f0f); \ +} + +__constant u8 ascii_to_ebcdic_pc[256] = +{ + // little hack, can't crack 0-bytes in password, but who cares + // 0xab, 0xa8, 0xae, 0xad, 0xc4, 0xf1, 0xf7, 0xf4, 0x86, 0xa1, 0xe0, 0xbc, 0xb3, 0xb0, 0xb6, 0xb5, + 0x2a, 0xa8, 0xae, 0xad, 0xc4, 0xf1, 0xf7, 0xf4, 0x86, 0xa1, 0xe0, 0xbc, 0xb3, 0xb0, 0xb6, 0xb5, + 0x8a, 0x89, 0x8f, 0x8c, 0xd3, 0xd0, 0xce, 0xe6, 0x9b, 0x98, 0xd5, 0xe5, 0x92, 0x91, 0x97, 0x94, + 0x2a, 0x34, 0x54, 0x5d, 0x1c, 0x73, 0x0b, 0x51, 0x31, 0x10, 0x13, 0x37, 0x7c, 0x6b, 0x3d, 0x68, + 0x4a, 0x49, 0x4f, 0x4c, 0x43, 0x40, 0x46, 0x45, 0x5b, 0x58, 0x5e, 0x16, 0x32, 0x57, 0x76, 0x75, + 0x52, 0x29, 0x2f, 0x2c, 0x23, 0x20, 0x26, 0x25, 0x3b, 0x38, 0x08, 0x0e, 0x0d, 0x02, 0x01, 0x07, + 0x04, 0x1a, 0x19, 0x6e, 0x6d, 0x62, 0x61, 0x67, 0x64, 0x7a, 0x79, 0x3e, 0x6b, 0x1f, 0x15, 0x70, + 0x58, 0xa8, 0xae, 0xad, 0xa2, 0xa1, 0xa7, 0xa4, 0xba, 0xb9, 0x89, 0x8f, 0x8c, 0x83, 0x80, 0x86, + 0x85, 0x9b, 0x98, 0xef, 0xec, 0xe3, 0xe0, 0xe6, 0xe5, 0xfb, 0xf8, 0x2a, 0x7f, 0x0b, 0xe9, 0xa4, + 0xea, 0xe9, 0xef, 0xec, 0xe3, 0x80, 0xa7, 0x85, 0xfb, 0xf8, 0xfe, 0xfd, 0xf2, 0xb9, 0xbf, 0x9d, + 0xcb, 0xc8, 0x9e, 0xcd, 0xc2, 0xc1, 0xc7, 0xba, 0xda, 0xd9, 0xdf, 0xdc, 0xa2, 0x83, 0xd6, 0x68, + 0x29, 0x2f, 0x2c, 0x23, 0x20, 0x26, 0x25, 0x3b, 0x38, 0x08, 0x0e, 0x0d, 0x02, 0x01, 0x07, 0x04, + 0x1a, 0x19, 0x6e, 0x6d, 0x62, 0x61, 0x67, 0x64, 0x7a, 0x79, 0x4a, 0x49, 0x4f, 0x4c, 0x43, 0x40, + 0x46, 0x45, 0x5b, 0xab, 0xbf, 0xbc, 0xb3, 0xb0, 0xb6, 0xb5, 0x8a, 0x9e, 0x9d, 0x92, 0x91, 0x97, + 0x94, 0xea, 0xfe, 0xfd, 0xf2, 0xf1, 0xf7, 0xf4, 0xcb, 0xc8, 0xce, 0xcd, 0xc2, 0xc1, 0xc7, 0xc4, + 0xda, 0xd9, 0xdf, 0xdc, 0xd3, 0xd0, 0xd6, 0xd5, 0x3e, 0x3d, 0x32, 0x31, 0x37, 0x34, 0x1f, 0x1c, + 0x13, 0x10, 0x16, 0x15, 0x7f, 0x7c, 0x73, 0x70, 0x76, 0x75, 0x5e, 0x5d, 0x52, 0x51, 0x57, 0x54, +}; + +__constant u32 c_SPtrans[8][64] = +{ + /* nibble 0 */ + 0x02080800, 0x00080000, 0x02000002, 0x02080802, + 0x02000000, 0x00080802, 0x00080002, 0x02000002, + 0x00080802, 0x02080800, 0x02080000, 0x00000802, + 0x02000802, 0x02000000, 0x00000000, 0x00080002, + 0x00080000, 0x00000002, 0x02000800, 0x00080800, + 0x02080802, 0x02080000, 0x00000802, 0x02000800, + 0x00000002, 0x00000800, 0x00080800, 0x02080002, + 0x00000800, 0x02000802, 0x02080002, 0x00000000, + 0x00000000, 0x02080802, 0x02000800, 0x00080002, + 0x02080800, 0x00080000, 0x00000802, 0x02000800, + 0x02080002, 0x00000800, 0x00080800, 0x02000002, + 0x00080802, 0x00000002, 0x02000002, 0x02080000, + 0x02080802, 0x00080800, 0x02080000, 0x02000802, + 0x02000000, 0x00000802, 0x00080002, 0x00000000, + 0x00080000, 0x02000000, 0x02000802, 0x02080800, + 0x00000002, 0x02080002, 0x00000800, 0x00080802, + /* nibble 1 */ + 0x40108010, 0x00000000, 0x00108000, 0x40100000, + 0x40000010, 0x00008010, 0x40008000, 0x00108000, + 0x00008000, 0x40100010, 0x00000010, 0x40008000, + 0x00100010, 0x40108000, 0x40100000, 0x00000010, + 0x00100000, 0x40008010, 0x40100010, 0x00008000, + 0x00108010, 0x40000000, 0x00000000, 0x00100010, + 0x40008010, 0x00108010, 0x40108000, 0x40000010, + 0x40000000, 0x00100000, 0x00008010, 0x40108010, + 0x00100010, 0x40108000, 0x40008000, 0x00108010, + 0x40108010, 0x00100010, 0x40000010, 0x00000000, + 0x40000000, 0x00008010, 0x00100000, 0x40100010, + 0x00008000, 0x40000000, 0x00108010, 0x40008010, + 0x40108000, 0x00008000, 0x00000000, 0x40000010, + 0x00000010, 0x40108010, 0x00108000, 0x40100000, + 0x40100010, 0x00100000, 0x00008010, 0x40008000, + 0x40008010, 0x00000010, 0x40100000, 0x00108000, + /* nibble 2 */ + 0x04000001, 0x04040100, 0x00000100, 0x04000101, + 0x00040001, 0x04000000, 0x04000101, 0x00040100, + 0x04000100, 0x00040000, 0x04040000, 0x00000001, + 0x04040101, 0x00000101, 0x00000001, 0x04040001, + 0x00000000, 0x00040001, 0x04040100, 0x00000100, + 0x00000101, 0x04040101, 0x00040000, 0x04000001, + 0x04040001, 0x04000100, 0x00040101, 0x04040000, + 0x00040100, 0x00000000, 0x04000000, 0x00040101, + 0x04040100, 0x00000100, 0x00000001, 0x00040000, + 0x00000101, 0x00040001, 0x04040000, 0x04000101, + 0x00000000, 0x04040100, 0x00040100, 0x04040001, + 0x00040001, 0x04000000, 0x04040101, 0x00000001, + 0x00040101, 0x04000001, 0x04000000, 0x04040101, + 0x00040000, 0x04000100, 0x04000101, 0x00040100, + 0x04000100, 0x00000000, 0x04040001, 0x00000101, + 0x04000001, 0x00040101, 0x00000100, 0x04040000, + /* nibble 3 */ + 0x00401008, 0x10001000, 0x00000008, 0x10401008, + 0x00000000, 0x10400000, 0x10001008, 0x00400008, + 0x10401000, 0x10000008, 0x10000000, 0x00001008, + 0x10000008, 0x00401008, 0x00400000, 0x10000000, + 0x10400008, 0x00401000, 0x00001000, 0x00000008, + 0x00401000, 0x10001008, 0x10400000, 0x00001000, + 0x00001008, 0x00000000, 0x00400008, 0x10401000, + 0x10001000, 0x10400008, 0x10401008, 0x00400000, + 0x10400008, 0x00001008, 0x00400000, 0x10000008, + 0x00401000, 0x10001000, 0x00000008, 0x10400000, + 0x10001008, 0x00000000, 0x00001000, 0x00400008, + 0x00000000, 0x10400008, 0x10401000, 0x00001000, + 0x10000000, 0x10401008, 0x00401008, 0x00400000, + 0x10401008, 0x00000008, 0x10001000, 0x00401008, + 0x00400008, 0x00401000, 0x10400000, 0x10001008, + 0x00001008, 0x10000000, 0x10000008, 0x10401000, + /* nibble 4 */ + 0x08000000, 0x00010000, 0x00000400, 0x08010420, + 0x08010020, 0x08000400, 0x00010420, 0x08010000, + 0x00010000, 0x00000020, 0x08000020, 0x00010400, + 0x08000420, 0x08010020, 0x08010400, 0x00000000, + 0x00010400, 0x08000000, 0x00010020, 0x00000420, + 0x08000400, 0x00010420, 0x00000000, 0x08000020, + 0x00000020, 0x08000420, 0x08010420, 0x00010020, + 0x08010000, 0x00000400, 0x00000420, 0x08010400, + 0x08010400, 0x08000420, 0x00010020, 0x08010000, + 0x00010000, 0x00000020, 0x08000020, 0x08000400, + 0x08000000, 0x00010400, 0x08010420, 0x00000000, + 0x00010420, 0x08000000, 0x00000400, 0x00010020, + 0x08000420, 0x00000400, 0x00000000, 0x08010420, + 0x08010020, 0x08010400, 0x00000420, 0x00010000, + 0x00010400, 0x08010020, 0x08000400, 0x00000420, + 0x00000020, 0x00010420, 0x08010000, 0x08000020, + /* nibble 5 */ + 0x80000040, 0x00200040, 0x00000000, 0x80202000, + 0x00200040, 0x00002000, 0x80002040, 0x00200000, + 0x00002040, 0x80202040, 0x00202000, 0x80000000, + 0x80002000, 0x80000040, 0x80200000, 0x00202040, + 0x00200000, 0x80002040, 0x80200040, 0x00000000, + 0x00002000, 0x00000040, 0x80202000, 0x80200040, + 0x80202040, 0x80200000, 0x80000000, 0x00002040, + 0x00000040, 0x00202000, 0x00202040, 0x80002000, + 0x00002040, 0x80000000, 0x80002000, 0x00202040, + 0x80202000, 0x00200040, 0x00000000, 0x80002000, + 0x80000000, 0x00002000, 0x80200040, 0x00200000, + 0x00200040, 0x80202040, 0x00202000, 0x00000040, + 0x80202040, 0x00202000, 0x00200000, 0x80002040, + 0x80000040, 0x80200000, 0x00202040, 0x00000000, + 0x00002000, 0x80000040, 0x80002040, 0x80202000, + 0x80200000, 0x00002040, 0x00000040, 0x80200040, + /* nibble 6 */ + 0x00004000, 0x00000200, 0x01000200, 0x01000004, + 0x01004204, 0x00004004, 0x00004200, 0x00000000, + 0x01000000, 0x01000204, 0x00000204, 0x01004000, + 0x00000004, 0x01004200, 0x01004000, 0x00000204, + 0x01000204, 0x00004000, 0x00004004, 0x01004204, + 0x00000000, 0x01000200, 0x01000004, 0x00004200, + 0x01004004, 0x00004204, 0x01004200, 0x00000004, + 0x00004204, 0x01004004, 0x00000200, 0x01000000, + 0x00004204, 0x01004000, 0x01004004, 0x00000204, + 0x00004000, 0x00000200, 0x01000000, 0x01004004, + 0x01000204, 0x00004204, 0x00004200, 0x00000000, + 0x00000200, 0x01000004, 0x00000004, 0x01000200, + 0x00000000, 0x01000204, 0x01000200, 0x00004200, + 0x00000204, 0x00004000, 0x01004204, 0x01000000, + 0x01004200, 0x00000004, 0x00004004, 0x01004204, + 0x01000004, 0x01004200, 0x01004000, 0x00004004, + /* nibble 7 */ + 0x20800080, 0x20820000, 0x00020080, 0x00000000, + 0x20020000, 0x00800080, 0x20800000, 0x20820080, + 0x00000080, 0x20000000, 0x00820000, 0x00020080, + 0x00820080, 0x20020080, 0x20000080, 0x20800000, + 0x00020000, 0x00820080, 0x00800080, 0x20020000, + 0x20820080, 0x20000080, 0x00000000, 0x00820000, + 0x20000000, 0x00800000, 0x20020080, 0x20800080, + 0x00800000, 0x00020000, 0x20820000, 0x00000080, + 0x00800000, 0x00020000, 0x20000080, 0x20820080, + 0x00020080, 0x20000000, 0x00000000, 0x00820000, + 0x20800080, 0x20020080, 0x20020000, 0x00800080, + 0x20820000, 0x00000080, 0x00800080, 0x20020000, + 0x20820080, 0x00800000, 0x20800000, 0x20000080, + 0x00820000, 0x00020080, 0x20020080, 0x20800000, + 0x00000080, 0x20820000, 0x00820080, 0x00000000, + 0x20000000, 0x20800080, 0x00020000, 0x00820080, +}; + +__constant u32 c_skb[8][64] = +{ + /* for C bits (numbered as per FIPS 46) 1 2 3 4 5 6 */ + 0x00000000, 0x00000010, 0x20000000, 0x20000010, + 0x00010000, 0x00010010, 0x20010000, 0x20010010, + 0x00000800, 0x00000810, 0x20000800, 0x20000810, + 0x00010800, 0x00010810, 0x20010800, 0x20010810, + 0x00000020, 0x00000030, 0x20000020, 0x20000030, + 0x00010020, 0x00010030, 0x20010020, 0x20010030, + 0x00000820, 0x00000830, 0x20000820, 0x20000830, + 0x00010820, 0x00010830, 0x20010820, 0x20010830, + 0x00080000, 0x00080010, 0x20080000, 0x20080010, + 0x00090000, 0x00090010, 0x20090000, 0x20090010, + 0x00080800, 0x00080810, 0x20080800, 0x20080810, + 0x00090800, 0x00090810, 0x20090800, 0x20090810, + 0x00080020, 0x00080030, 0x20080020, 0x20080030, + 0x00090020, 0x00090030, 0x20090020, 0x20090030, + 0x00080820, 0x00080830, 0x20080820, 0x20080830, + 0x00090820, 0x00090830, 0x20090820, 0x20090830, + /* for C bits (numbered as per FIPS 46) 7 8 10 11 12 13 */ + 0x00000000, 0x02000000, 0x00002000, 0x02002000, + 0x00200000, 0x02200000, 0x00202000, 0x02202000, + 0x00000004, 0x02000004, 0x00002004, 0x02002004, + 0x00200004, 0x02200004, 0x00202004, 0x02202004, + 0x00000400, 0x02000400, 0x00002400, 0x02002400, + 0x00200400, 0x02200400, 0x00202400, 0x02202400, + 0x00000404, 0x02000404, 0x00002404, 0x02002404, + 0x00200404, 0x02200404, 0x00202404, 0x02202404, + 0x10000000, 0x12000000, 0x10002000, 0x12002000, + 0x10200000, 0x12200000, 0x10202000, 0x12202000, + 0x10000004, 0x12000004, 0x10002004, 0x12002004, + 0x10200004, 0x12200004, 0x10202004, 0x12202004, + 0x10000400, 0x12000400, 0x10002400, 0x12002400, + 0x10200400, 0x12200400, 0x10202400, 0x12202400, + 0x10000404, 0x12000404, 0x10002404, 0x12002404, + 0x10200404, 0x12200404, 0x10202404, 0x12202404, + /* for C bits (numbered as per FIPS 46) 14 15 16 17 19 20 */ + 0x00000000, 0x00000001, 0x00040000, 0x00040001, + 0x01000000, 0x01000001, 0x01040000, 0x01040001, + 0x00000002, 0x00000003, 0x00040002, 0x00040003, + 0x01000002, 0x01000003, 0x01040002, 0x01040003, + 0x00000200, 0x00000201, 0x00040200, 0x00040201, + 0x01000200, 0x01000201, 0x01040200, 0x01040201, + 0x00000202, 0x00000203, 0x00040202, 0x00040203, + 0x01000202, 0x01000203, 0x01040202, 0x01040203, + 0x08000000, 0x08000001, 0x08040000, 0x08040001, + 0x09000000, 0x09000001, 0x09040000, 0x09040001, + 0x08000002, 0x08000003, 0x08040002, 0x08040003, + 0x09000002, 0x09000003, 0x09040002, 0x09040003, + 0x08000200, 0x08000201, 0x08040200, 0x08040201, + 0x09000200, 0x09000201, 0x09040200, 0x09040201, + 0x08000202, 0x08000203, 0x08040202, 0x08040203, + 0x09000202, 0x09000203, 0x09040202, 0x09040203, + /* for C bits (numbered as per FIPS 46) 21 23 24 26 27 28 */ + 0x00000000, 0x00100000, 0x00000100, 0x00100100, + 0x00000008, 0x00100008, 0x00000108, 0x00100108, + 0x00001000, 0x00101000, 0x00001100, 0x00101100, + 0x00001008, 0x00101008, 0x00001108, 0x00101108, + 0x04000000, 0x04100000, 0x04000100, 0x04100100, + 0x04000008, 0x04100008, 0x04000108, 0x04100108, + 0x04001000, 0x04101000, 0x04001100, 0x04101100, + 0x04001008, 0x04101008, 0x04001108, 0x04101108, + 0x00020000, 0x00120000, 0x00020100, 0x00120100, + 0x00020008, 0x00120008, 0x00020108, 0x00120108, + 0x00021000, 0x00121000, 0x00021100, 0x00121100, + 0x00021008, 0x00121008, 0x00021108, 0x00121108, + 0x04020000, 0x04120000, 0x04020100, 0x04120100, + 0x04020008, 0x04120008, 0x04020108, 0x04120108, + 0x04021000, 0x04121000, 0x04021100, 0x04121100, + 0x04021008, 0x04121008, 0x04021108, 0x04121108, + /* for D bits (numbered as per FIPS 46) 1 2 3 4 5 6 */ + 0x00000000, 0x10000000, 0x00010000, 0x10010000, + 0x00000004, 0x10000004, 0x00010004, 0x10010004, + 0x20000000, 0x30000000, 0x20010000, 0x30010000, + 0x20000004, 0x30000004, 0x20010004, 0x30010004, + 0x00100000, 0x10100000, 0x00110000, 0x10110000, + 0x00100004, 0x10100004, 0x00110004, 0x10110004, + 0x20100000, 0x30100000, 0x20110000, 0x30110000, + 0x20100004, 0x30100004, 0x20110004, 0x30110004, + 0x00001000, 0x10001000, 0x00011000, 0x10011000, + 0x00001004, 0x10001004, 0x00011004, 0x10011004, + 0x20001000, 0x30001000, 0x20011000, 0x30011000, + 0x20001004, 0x30001004, 0x20011004, 0x30011004, + 0x00101000, 0x10101000, 0x00111000, 0x10111000, + 0x00101004, 0x10101004, 0x00111004, 0x10111004, + 0x20101000, 0x30101000, 0x20111000, 0x30111000, + 0x20101004, 0x30101004, 0x20111004, 0x30111004, + /* for D bits (numbered as per FIPS 46) 8 9 11 12 13 14 */ + 0x00000000, 0x08000000, 0x00000008, 0x08000008, + 0x00000400, 0x08000400, 0x00000408, 0x08000408, + 0x00020000, 0x08020000, 0x00020008, 0x08020008, + 0x00020400, 0x08020400, 0x00020408, 0x08020408, + 0x00000001, 0x08000001, 0x00000009, 0x08000009, + 0x00000401, 0x08000401, 0x00000409, 0x08000409, + 0x00020001, 0x08020001, 0x00020009, 0x08020009, + 0x00020401, 0x08020401, 0x00020409, 0x08020409, + 0x02000000, 0x0A000000, 0x02000008, 0x0A000008, + 0x02000400, 0x0A000400, 0x02000408, 0x0A000408, + 0x02020000, 0x0A020000, 0x02020008, 0x0A020008, + 0x02020400, 0x0A020400, 0x02020408, 0x0A020408, + 0x02000001, 0x0A000001, 0x02000009, 0x0A000009, + 0x02000401, 0x0A000401, 0x02000409, 0x0A000409, + 0x02020001, 0x0A020001, 0x02020009, 0x0A020009, + 0x02020401, 0x0A020401, 0x02020409, 0x0A020409, + /* for D bits (numbered as per FIPS 46) 16 17 18 19 20 21 */ + 0x00000000, 0x00000100, 0x00080000, 0x00080100, + 0x01000000, 0x01000100, 0x01080000, 0x01080100, + 0x00000010, 0x00000110, 0x00080010, 0x00080110, + 0x01000010, 0x01000110, 0x01080010, 0x01080110, + 0x00200000, 0x00200100, 0x00280000, 0x00280100, + 0x01200000, 0x01200100, 0x01280000, 0x01280100, + 0x00200010, 0x00200110, 0x00280010, 0x00280110, + 0x01200010, 0x01200110, 0x01280010, 0x01280110, + 0x00000200, 0x00000300, 0x00080200, 0x00080300, + 0x01000200, 0x01000300, 0x01080200, 0x01080300, + 0x00000210, 0x00000310, 0x00080210, 0x00080310, + 0x01000210, 0x01000310, 0x01080210, 0x01080310, + 0x00200200, 0x00200300, 0x00280200, 0x00280300, + 0x01200200, 0x01200300, 0x01280200, 0x01280300, + 0x00200210, 0x00200310, 0x00280210, 0x00280310, + 0x01200210, 0x01200310, 0x01280210, 0x01280310, + /* for D bits (numbered as per FIPS 46) 22 23 24 25 27 28 */ + 0x00000000, 0x04000000, 0x00040000, 0x04040000, + 0x00000002, 0x04000002, 0x00040002, 0x04040002, + 0x00002000, 0x04002000, 0x00042000, 0x04042000, + 0x00002002, 0x04002002, 0x00042002, 0x04042002, + 0x00000020, 0x04000020, 0x00040020, 0x04040020, + 0x00000022, 0x04000022, 0x00040022, 0x04040022, + 0x00002020, 0x04002020, 0x00042020, 0x04042020, + 0x00002022, 0x04002022, 0x00042022, 0x04042022, + 0x00000800, 0x04000800, 0x00040800, 0x04040800, + 0x00000802, 0x04000802, 0x00040802, 0x04040802, + 0x00002800, 0x04002800, 0x00042800, 0x04042800, + 0x00002802, 0x04002802, 0x00042802, 0x04042802, + 0x00000820, 0x04000820, 0x00040820, 0x04040820, + 0x00000822, 0x04000822, 0x00040822, 0x04040822, + 0x00002820, 0x04002820, 0x00042820, 0x04042820, + 0x00002822, 0x04002822, 0x00042822, 0x04042822, +}; + +#define NBOX(i,n,S) (S)[(n)][(i)] + +static void _des_crypt_encrypt (u32x iv[2], u32x data[2], u32x Kc[16], u32x Kd[16], __local u32 s_SPtrans[8][64]) +{ + u32x tt; + + u32x r = data[0]; + u32x l = data[1]; + + #pragma unroll 16 + for (u32 i = 0; i < 16; i++) + { + u32x u = Kc[i] ^ r; + u32x t = Kd[i] ^ rotl32 (r, 28u); + + #ifdef VECT_SIZE1 + l ^= NBOX (((u >> 2) & 0x3f), 0, s_SPtrans) + | NBOX (((u >> 10) & 0x3f), 2, s_SPtrans) + | NBOX (((u >> 18) & 0x3f), 4, s_SPtrans) + | NBOX (((u >> 26) & 0x3f), 6, s_SPtrans) + | NBOX (((t >> 2) & 0x3f), 1, s_SPtrans) + | NBOX (((t >> 10) & 0x3f), 3, s_SPtrans) + | NBOX (((t >> 18) & 0x3f), 5, s_SPtrans) + | NBOX (((t >> 26) & 0x3f), 7, s_SPtrans); + #endif + + #ifdef VECT_SIZE2 + l.s0 ^= NBOX (((u.s0 >> 2) & 0x3f), 0, s_SPtrans) + | NBOX (((u.s0 >> 10) & 0x3f), 2, s_SPtrans) + | NBOX (((u.s0 >> 18) & 0x3f), 4, s_SPtrans) + | NBOX (((u.s0 >> 26) & 0x3f), 6, s_SPtrans) + | NBOX (((t.s0 >> 2) & 0x3f), 1, s_SPtrans) + | NBOX (((t.s0 >> 10) & 0x3f), 3, s_SPtrans) + | NBOX (((t.s0 >> 18) & 0x3f), 5, s_SPtrans) + | NBOX (((t.s0 >> 26) & 0x3f), 7, s_SPtrans); + + l.s1 ^= NBOX (((u.s1 >> 2) & 0x3f), 0, s_SPtrans) + | NBOX (((u.s1 >> 10) & 0x3f), 2, s_SPtrans) + | NBOX (((u.s1 >> 18) & 0x3f), 4, s_SPtrans) + | NBOX (((u.s1 >> 26) & 0x3f), 6, s_SPtrans) + | NBOX (((t.s1 >> 2) & 0x3f), 1, s_SPtrans) + | NBOX (((t.s1 >> 10) & 0x3f), 3, s_SPtrans) + | NBOX (((t.s1 >> 18) & 0x3f), 5, s_SPtrans) + | NBOX (((t.s1 >> 26) & 0x3f), 7, s_SPtrans); + #endif + + #ifdef VECT_SIZE4 + l.s0 ^= NBOX (((u.s0 >> 2) & 0x3f), 0, s_SPtrans) + | NBOX (((u.s0 >> 10) & 0x3f), 2, s_SPtrans) + | NBOX (((u.s0 >> 18) & 0x3f), 4, s_SPtrans) + | NBOX (((u.s0 >> 26) & 0x3f), 6, s_SPtrans) + | NBOX (((t.s0 >> 2) & 0x3f), 1, s_SPtrans) + | NBOX (((t.s0 >> 10) & 0x3f), 3, s_SPtrans) + | NBOX (((t.s0 >> 18) & 0x3f), 5, s_SPtrans) + | NBOX (((t.s0 >> 26) & 0x3f), 7, s_SPtrans); + + l.s1 ^= NBOX (((u.s1 >> 2) & 0x3f), 0, s_SPtrans) + | NBOX (((u.s1 >> 10) & 0x3f), 2, s_SPtrans) + | NBOX (((u.s1 >> 18) & 0x3f), 4, s_SPtrans) + | NBOX (((u.s1 >> 26) & 0x3f), 6, s_SPtrans) + | NBOX (((t.s1 >> 2) & 0x3f), 1, s_SPtrans) + | NBOX (((t.s1 >> 10) & 0x3f), 3, s_SPtrans) + | NBOX (((t.s1 >> 18) & 0x3f), 5, s_SPtrans) + | NBOX (((t.s1 >> 26) & 0x3f), 7, s_SPtrans); + + l.s2 ^= NBOX (((u.s2 >> 2) & 0x3f), 0, s_SPtrans) + | NBOX (((u.s2 >> 10) & 0x3f), 2, s_SPtrans) + | NBOX (((u.s2 >> 18) & 0x3f), 4, s_SPtrans) + | NBOX (((u.s2 >> 26) & 0x3f), 6, s_SPtrans) + | NBOX (((t.s2 >> 2) & 0x3f), 1, s_SPtrans) + | NBOX (((t.s2 >> 10) & 0x3f), 3, s_SPtrans) + | NBOX (((t.s2 >> 18) & 0x3f), 5, s_SPtrans) + | NBOX (((t.s2 >> 26) & 0x3f), 7, s_SPtrans); + + l.s3 ^= NBOX (((u.s3 >> 2) & 0x3f), 0, s_SPtrans) + | NBOX (((u.s3 >> 10) & 0x3f), 2, s_SPtrans) + | NBOX (((u.s3 >> 18) & 0x3f), 4, s_SPtrans) + | NBOX (((u.s3 >> 26) & 0x3f), 6, s_SPtrans) + | NBOX (((t.s3 >> 2) & 0x3f), 1, s_SPtrans) + | NBOX (((t.s3 >> 10) & 0x3f), 3, s_SPtrans) + | NBOX (((t.s3 >> 18) & 0x3f), 5, s_SPtrans) + | NBOX (((t.s3 >> 26) & 0x3f), 7, s_SPtrans); + #endif + + tt = l; + l = r; + r = tt; + } + + iv[0] = l; + iv[1] = r; +} + +static void _des_crypt_keysetup (u32x c, u32x d, u32x Kc[16], u32x Kd[16], __local u32 s_skb[8][64]) +{ + u32x tt; + + PERM_OP (d, c, tt, 4, 0x0f0f0f0f); + HPERM_OP (c, tt, 2, 0xcccc0000); + HPERM_OP (d, tt, 2, 0xcccc0000); + PERM_OP (d, c, tt, 1, 0x55555555); + PERM_OP (c, d, tt, 8, 0x00ff00ff); + PERM_OP (d, c, tt, 1, 0x55555555); + + d = ((d & 0x000000ff) << 16) + | ((d & 0x0000ff00) << 0) + | ((d & 0x00ff0000) >> 16) + | ((c & 0xf0000000) >> 4); + + c = c & 0x0fffffff; + + #pragma unroll 16 + for (u32 i = 0; i < 16; i++) + { + const u32 shifts3s0[16] = { 1, 1, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 1 }; + const u32 shifts3s1[16] = { 27, 27, 26, 26, 26, 26, 26, 26, 27, 26, 26, 26, 26, 26, 26, 27 }; + + c = c >> shifts3s0[i] | c << shifts3s1[i]; + d = d >> shifts3s0[i] | d << shifts3s1[i]; + + c = c & 0x0fffffff; + d = d & 0x0fffffff; + + u32x s; + u32x t; + + #ifdef VECT_SIZE1 + s = NBOX ((( c >> 0) & 0x3f), 0, s_skb) + | NBOX ((((c >> 6) & 0x03) + | ((c >> 7) & 0x3c)), 1, s_skb) + | NBOX ((((c >> 13) & 0x0f) + | ((c >> 14) & 0x30)), 2, s_skb) + | NBOX ((((c >> 20) & 0x01) + | ((c >> 21) & 0x06) + | ((c >> 22) & 0x38)), 3, s_skb); + + t = NBOX ((( d >> 0) & 0x3f), 4, s_skb) + | NBOX ((((d >> 7) & 0x03) + | ((d >> 8) & 0x3c)), 5, s_skb) + | NBOX ((((d >> 15) & 0x3f)), 6, s_skb) + | NBOX ((((d >> 21) & 0x0f) + | ((d >> 22) & 0x30)), 7, s_skb); + #endif + + #ifdef VECT_SIZE2 + s.s0 = NBOX ((( c.s0 >> 0) & 0x3f), 0, s_skb) + | NBOX ((((c.s0 >> 6) & 0x03) + | ((c.s0 >> 7) & 0x3c)), 1, s_skb) + | NBOX ((((c.s0 >> 13) & 0x0f) + | ((c.s0 >> 14) & 0x30)), 2, s_skb) + | NBOX ((((c.s0 >> 20) & 0x01) + | ((c.s0 >> 21) & 0x06) + | ((c.s0 >> 22) & 0x38)), 3, s_skb); + + t.s0 = NBOX ((( d.s0 >> 0) & 0x3f), 4, s_skb) + | NBOX ((((d.s0 >> 7) & 0x03) + | ((d.s0 >> 8) & 0x3c)), 5, s_skb) + | NBOX ((((d.s0 >> 15) & 0x3f)), 6, s_skb) + | NBOX ((((d.s0 >> 21) & 0x0f) + | ((d.s0 >> 22) & 0x30)), 7, s_skb); + + s.s1 = NBOX ((( c.s1 >> 0) & 0x3f), 0, s_skb) + | NBOX ((((c.s1 >> 6) & 0x03) + | ((c.s1 >> 7) & 0x3c)), 1, s_skb) + | NBOX ((((c.s1 >> 13) & 0x0f) + | ((c.s1 >> 14) & 0x30)), 2, s_skb) + | NBOX ((((c.s1 >> 20) & 0x01) + | ((c.s1 >> 21) & 0x06) + | ((c.s1 >> 22) & 0x38)), 3, s_skb); + + t.s1 = NBOX ((( d.s1 >> 0) & 0x3f), 4, s_skb) + | NBOX ((((d.s1 >> 7) & 0x03) + | ((d.s1 >> 8) & 0x3c)), 5, s_skb) + | NBOX ((((d.s1 >> 15) & 0x3f)), 6, s_skb) + | NBOX ((((d.s1 >> 21) & 0x0f) + | ((d.s1 >> 22) & 0x30)), 7, s_skb); + #endif + + #ifdef VECT_SIZE4 + s.s0 = NBOX ((( c.s0 >> 0) & 0x3f), 0, s_skb) + | NBOX ((((c.s0 >> 6) & 0x03) + | ((c.s0 >> 7) & 0x3c)), 1, s_skb) + | NBOX ((((c.s0 >> 13) & 0x0f) + | ((c.s0 >> 14) & 0x30)), 2, s_skb) + | NBOX ((((c.s0 >> 20) & 0x01) + | ((c.s0 >> 21) & 0x06) + | ((c.s0 >> 22) & 0x38)), 3, s_skb); + + t.s0 = NBOX ((( d.s0 >> 0) & 0x3f), 4, s_skb) + | NBOX ((((d.s0 >> 7) & 0x03) + | ((d.s0 >> 8) & 0x3c)), 5, s_skb) + | NBOX ((((d.s0 >> 15) & 0x3f)), 6, s_skb) + | NBOX ((((d.s0 >> 21) & 0x0f) + | ((d.s0 >> 22) & 0x30)), 7, s_skb); + + s.s1 = NBOX ((( c.s1 >> 0) & 0x3f), 0, s_skb) + | NBOX ((((c.s1 >> 6) & 0x03) + | ((c.s1 >> 7) & 0x3c)), 1, s_skb) + | NBOX ((((c.s1 >> 13) & 0x0f) + | ((c.s1 >> 14) & 0x30)), 2, s_skb) + | NBOX ((((c.s1 >> 20) & 0x01) + | ((c.s1 >> 21) & 0x06) + | ((c.s1 >> 22) & 0x38)), 3, s_skb); + + t.s1 = NBOX ((( d.s1 >> 0) & 0x3f), 4, s_skb) + | NBOX ((((d.s1 >> 7) & 0x03) + | ((d.s1 >> 8) & 0x3c)), 5, s_skb) + | NBOX ((((d.s1 >> 15) & 0x3f)), 6, s_skb) + | NBOX ((((d.s1 >> 21) & 0x0f) + | ((d.s1 >> 22) & 0x30)), 7, s_skb); + + s.s2 = NBOX ((( c.s2 >> 0) & 0x3f), 0, s_skb) + | NBOX ((((c.s2 >> 6) & 0x03) + | ((c.s2 >> 7) & 0x3c)), 1, s_skb) + | NBOX ((((c.s2 >> 13) & 0x0f) + | ((c.s2 >> 14) & 0x30)), 2, s_skb) + | NBOX ((((c.s2 >> 20) & 0x01) + | ((c.s2 >> 21) & 0x06) + | ((c.s2 >> 22) & 0x38)), 3, s_skb); + + t.s2 = NBOX ((( d.s2 >> 0) & 0x3f), 4, s_skb) + | NBOX ((((d.s2 >> 7) & 0x03) + | ((d.s2 >> 8) & 0x3c)), 5, s_skb) + | NBOX ((((d.s2 >> 15) & 0x3f)), 6, s_skb) + | NBOX ((((d.s2 >> 21) & 0x0f) + | ((d.s2 >> 22) & 0x30)), 7, s_skb); + + s.s3 = NBOX ((( c.s3 >> 0) & 0x3f), 0, s_skb) + | NBOX ((((c.s3 >> 6) & 0x03) + | ((c.s3 >> 7) & 0x3c)), 1, s_skb) + | NBOX ((((c.s3 >> 13) & 0x0f) + | ((c.s3 >> 14) & 0x30)), 2, s_skb) + | NBOX ((((c.s3 >> 20) & 0x01) + | ((c.s3 >> 21) & 0x06) + | ((c.s3 >> 22) & 0x38)), 3, s_skb); + + t.s3 = NBOX ((( d.s3 >> 0) & 0x3f), 4, s_skb) + | NBOX ((((d.s3 >> 7) & 0x03) + | ((d.s3 >> 8) & 0x3c)), 5, s_skb) + | NBOX ((((d.s3 >> 15) & 0x3f)), 6, s_skb) + | NBOX ((((d.s3 >> 21) & 0x0f) + | ((d.s3 >> 22) & 0x30)), 7, s_skb); + #endif + + #if defined cl_amd_media_ops + Kc[i] = amd_bytealign (t, s << 16, 2); + Kd[i] = amd_bytealign (t >> 16, s, 2); + #else + Kc[i] = ((t << 16) | (s & 0x0000ffff)); + Kd[i] = ((s >> 16) | (t & 0xffff0000)); + #endif + + Kc[i] = rotl32 (Kc[i], 2u); + Kd[i] = rotl32 (Kd[i], 2u); + } +} + +static void transform_racf_key (const u32x w0, const u32x w1, u32x key[2]) +{ + #ifdef VECT_SIZE1 + + key[0] = (ascii_to_ebcdic_pc[(w0 >> 0) & 0xff]) << 0 + | (ascii_to_ebcdic_pc[(w0 >> 8) & 0xff]) << 8 + | (ascii_to_ebcdic_pc[(w0 >> 16) & 0xff]) << 16 + | (ascii_to_ebcdic_pc[(w0 >> 24) & 0xff]) << 24; + + key[1] = (ascii_to_ebcdic_pc[(w1 >> 0) & 0xff]) << 0 + | (ascii_to_ebcdic_pc[(w1 >> 8) & 0xff]) << 8 + | (ascii_to_ebcdic_pc[(w1 >> 16) & 0xff]) << 16 + | (ascii_to_ebcdic_pc[(w1 >> 24) & 0xff]) << 24; + #endif + + #ifdef VECT_SIZE2 + + key[0].s0 = (ascii_to_ebcdic_pc[(w0.s0 >> 0) & 0xff]) << 0 + | (ascii_to_ebcdic_pc[(w0.s0 >> 8) & 0xff]) << 8 + | (ascii_to_ebcdic_pc[(w0.s0 >> 16) & 0xff]) << 16 + | (ascii_to_ebcdic_pc[(w0.s0 >> 24) & 0xff]) << 24; + + key[0].s1 = (ascii_to_ebcdic_pc[(w0.s1 >> 0) & 0xff]) << 0 + | (ascii_to_ebcdic_pc[(w0.s1 >> 8) & 0xff]) << 8 + | (ascii_to_ebcdic_pc[(w0.s1 >> 16) & 0xff]) << 16 + | (ascii_to_ebcdic_pc[(w0.s1 >> 24) & 0xff]) << 24; + + key[1].s0 = (ascii_to_ebcdic_pc[(w1.s0 >> 0) & 0xff]) << 0 + | (ascii_to_ebcdic_pc[(w1.s0 >> 8) & 0xff]) << 8 + | (ascii_to_ebcdic_pc[(w1.s0 >> 16) & 0xff]) << 16 + | (ascii_to_ebcdic_pc[(w1.s0 >> 24) & 0xff]) << 24; + + key[1].s1 = (ascii_to_ebcdic_pc[(w1.s1 >> 0) & 0xff]) << 0 + | (ascii_to_ebcdic_pc[(w1.s1 >> 8) & 0xff]) << 8 + | (ascii_to_ebcdic_pc[(w1.s1 >> 16) & 0xff]) << 16 + | (ascii_to_ebcdic_pc[(w1.s1 >> 24) & 0xff]) << 24; + #endif + + #ifdef VECT_SIZE4 + key[0].s0 = (ascii_to_ebcdic_pc[(w0.s0 >> 0) & 0xff]) << 0 + | (ascii_to_ebcdic_pc[(w0.s0 >> 8) & 0xff]) << 8 + | (ascii_to_ebcdic_pc[(w0.s0 >> 16) & 0xff]) << 16 + | (ascii_to_ebcdic_pc[(w0.s0 >> 24) & 0xff]) << 24; + + key[0].s1 = (ascii_to_ebcdic_pc[(w0.s1 >> 0) & 0xff]) << 0 + | (ascii_to_ebcdic_pc[(w0.s1 >> 8) & 0xff]) << 8 + | (ascii_to_ebcdic_pc[(w0.s1 >> 16) & 0xff]) << 16 + | (ascii_to_ebcdic_pc[(w0.s1 >> 24) & 0xff]) << 24; + + key[0].s2 = (ascii_to_ebcdic_pc[(w0.s2 >> 0) & 0xff]) << 0 + | (ascii_to_ebcdic_pc[(w0.s2 >> 8) & 0xff]) << 8 + | (ascii_to_ebcdic_pc[(w0.s2 >> 16) & 0xff]) << 16 + | (ascii_to_ebcdic_pc[(w0.s2 >> 24) & 0xff]) << 24; + + key[0].s3 = (ascii_to_ebcdic_pc[(w0.s3 >> 0) & 0xff]) << 0 + | (ascii_to_ebcdic_pc[(w0.s3 >> 8) & 0xff]) << 8 + | (ascii_to_ebcdic_pc[(w0.s3 >> 16) & 0xff]) << 16 + | (ascii_to_ebcdic_pc[(w0.s3 >> 24) & 0xff]) << 24; + + key[1].s0 = (ascii_to_ebcdic_pc[(w1.s0 >> 0) & 0xff]) << 0 + | (ascii_to_ebcdic_pc[(w1.s0 >> 8) & 0xff]) << 8 + | (ascii_to_ebcdic_pc[(w1.s0 >> 16) & 0xff]) << 16 + | (ascii_to_ebcdic_pc[(w1.s0 >> 24) & 0xff]) << 24; + + key[1].s1 = (ascii_to_ebcdic_pc[(w1.s1 >> 0) & 0xff]) << 0 + | (ascii_to_ebcdic_pc[(w1.s1 >> 8) & 0xff]) << 8 + | (ascii_to_ebcdic_pc[(w1.s1 >> 16) & 0xff]) << 16 + | (ascii_to_ebcdic_pc[(w1.s1 >> 24) & 0xff]) << 24; + + key[1].s2 = (ascii_to_ebcdic_pc[(w1.s2 >> 0) & 0xff]) << 0 + | (ascii_to_ebcdic_pc[(w1.s2 >> 8) & 0xff]) << 8 + | (ascii_to_ebcdic_pc[(w1.s2 >> 16) & 0xff]) << 16 + | (ascii_to_ebcdic_pc[(w1.s2 >> 24) & 0xff]) << 24; + + key[1].s3 = (ascii_to_ebcdic_pc[(w1.s3 >> 0) & 0xff]) << 0 + | (ascii_to_ebcdic_pc[(w1.s3 >> 8) & 0xff]) << 8 + | (ascii_to_ebcdic_pc[(w1.s3 >> 16) & 0xff]) << 16 + | (ascii_to_ebcdic_pc[(w1.s3 >> 24) & 0xff]) << 24; + #endif +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m08500_m04 (__global pw_t *pws, __global gpu_rule_t * rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + u32x pw_buf[4]; + + pw_buf[0] = pws[gid].i[ 0]; + pw_buf[1] = pws[gid].i[ 1]; + pw_buf[2] = 0; + pw_buf[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * salt + */ + + u32 salt_buf0[2]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf_pc[0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf_pc[1]; + + /** + * sbox, kbox + */ + + __local u32 s_SPtrans[8][64]; + __local u32 s_skb[8][64]; + + s_SPtrans[0][lid] = c_SPtrans[0][lid]; + s_SPtrans[1][lid] = c_SPtrans[1][lid]; + s_SPtrans[2][lid] = c_SPtrans[2][lid]; + s_SPtrans[3][lid] = c_SPtrans[3][lid]; + s_SPtrans[4][lid] = c_SPtrans[4][lid]; + s_SPtrans[5][lid] = c_SPtrans[5][lid]; + s_SPtrans[6][lid] = c_SPtrans[6][lid]; + s_SPtrans[7][lid] = c_SPtrans[7][lid]; + + s_skb[0][lid] = c_skb[0][lid]; + s_skb[1][lid] = c_skb[1][lid]; + s_skb[2][lid] = c_skb[2][lid]; + s_skb[3][lid] = c_skb[3][lid]; + s_skb[4][lid] = c_skb[4][lid]; + s_skb[5][lid] = c_skb[5][lid]; + s_skb[6][lid] = c_skb[6][lid]; + s_skb[7][lid] = c_skb[7][lid]; + + barrier (CLK_LOCAL_MEM_FENCE); + + if (gid >= gid_max) return; + + /** + * main + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + + w0[0] = pw_buf[0]; + w0[1] = pw_buf[1]; + w0[2] = pw_buf[2]; + w0[3] = pw_buf[3]; + + u32x w1[4]; + + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + u32 out_len = apply_rules (rules_buf[il_pos].cmds, w0, w1, pw_len); + + out_len = (out_len >= 8) ? 8 : out_len; + + u32x key[2]; + + transform_racf_key (w0[0], w0[1], key); + + const u32x c = key[0]; + const u32x d = key[1]; + + u32x Kc[16]; + u32x Kd[16]; + + _des_crypt_keysetup (c, d, Kc, Kd, s_skb); + + u32x data[2]; + + data[0] = salt_buf0[0]; + data[1] = salt_buf0[1]; + + u32x iv[2]; + + _des_crypt_encrypt (iv, data, Kc, Kd, s_SPtrans); + + const u32x r0 = iv[0]; + const u32x r1 = iv[1]; + const u32x r2 = 0; + const u32x r3 = 0; + + #include VECT_COMPARE_M + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m08500_m08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m08500_m16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m08500_s04 (__global pw_t *pws, __global gpu_rule_t * rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + u32x pw_buf[4]; + + pw_buf[0] = pws[gid].i[ 0]; + pw_buf[1] = pws[gid].i[ 1]; + pw_buf[2] = 0; + pw_buf[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * salt + */ + + u32 salt_buf0[2]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf_pc[0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf_pc[1]; + + /** + * sbox, kbox + */ + + __local u32 s_SPtrans[8][64]; + __local u32 s_skb[8][64]; + + s_SPtrans[0][lid] = c_SPtrans[0][lid]; + s_SPtrans[1][lid] = c_SPtrans[1][lid]; + s_SPtrans[2][lid] = c_SPtrans[2][lid]; + s_SPtrans[3][lid] = c_SPtrans[3][lid]; + s_SPtrans[4][lid] = c_SPtrans[4][lid]; + s_SPtrans[5][lid] = c_SPtrans[5][lid]; + s_SPtrans[6][lid] = c_SPtrans[6][lid]; + s_SPtrans[7][lid] = c_SPtrans[7][lid]; + + s_skb[0][lid] = c_skb[0][lid]; + s_skb[1][lid] = c_skb[1][lid]; + s_skb[2][lid] = c_skb[2][lid]; + s_skb[3][lid] = c_skb[3][lid]; + s_skb[4][lid] = c_skb[4][lid]; + s_skb[5][lid] = c_skb[5][lid]; + s_skb[6][lid] = c_skb[6][lid]; + s_skb[7][lid] = c_skb[7][lid]; + + barrier (CLK_LOCAL_MEM_FENCE); + + if (gid >= gid_max) return; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * main + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + + w0[0] = pw_buf[0]; + w0[1] = pw_buf[1]; + w0[2] = pw_buf[2]; + w0[3] = pw_buf[3]; + + u32x w1[4]; + + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + u32 out_len = apply_rules (rules_buf[il_pos].cmds, w0, w1, pw_len); + + out_len = (out_len >= 8) ? 8 : out_len; + + u32x key[2]; + + transform_racf_key (w0[0], w0[1], key); + + const u32x c = key[0]; + const u32x d = key[1]; + + u32x Kc[16]; + u32x Kd[16]; + + _des_crypt_keysetup (c, d, Kc, Kd, s_skb); + + u32x data[2]; + + data[0] = salt_buf0[0]; + data[1] = salt_buf0[1]; + + u32x iv[2]; + + _des_crypt_encrypt (iv, data, Kc, Kd, s_SPtrans); + + const u32x r0 = iv[0]; + const u32x r1 = iv[1]; + const u32x r2 = 0; + const u32x r3 = 0; + + #include VECT_COMPARE_S + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m08500_s08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m08500_s16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/amd/m08500_a1.cl b/amd/m08500_a1.cl new file mode 100644 index 0000000000..9e2714ff8b --- /dev/null +++ b/amd/m08500_a1.cl @@ -0,0 +1,1133 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _DES_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW4 +#define VECT_SIZE2 +#endif + +#ifdef VLIW5 +#define VECT_SIZE2 +#endif + +#define DGST_R0 0 +#define DGST_R1 1 +#define DGST_R2 2 +#define DGST_R3 3 + +#include "include/kernel_functions.c" +#include "types_amd.c" +#include "common_amd.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +#define PERM_OP(a,b,tt,n,m) \ +{ \ + tt = a >> n; \ + tt = tt ^ b; \ + tt = tt & m; \ + b = b ^ tt; \ + tt = tt << n; \ + a = a ^ tt; \ +} + +#define HPERM_OP(a,tt,n,m) \ +{ \ + tt = a << (16 + n); \ + tt = tt ^ a; \ + tt = tt & m; \ + a = a ^ tt; \ + tt = tt >> (16 + n); \ + a = a ^ tt; \ +} + +#define IP(l,r,tt) \ +{ \ + PERM_OP (r, l, tt, 4, 0x0f0f0f0f); \ + PERM_OP (l, r, tt, 16, 0x0000ffff); \ + PERM_OP (r, l, tt, 2, 0x33333333); \ + PERM_OP (l, r, tt, 8, 0x00ff00ff); \ + PERM_OP (r, l, tt, 1, 0x55555555); \ +} + +#define FP(l,r,tt) \ +{ \ + PERM_OP (l, r, tt, 1, 0x55555555); \ + PERM_OP (r, l, tt, 8, 0x00ff00ff); \ + PERM_OP (l, r, tt, 2, 0x33333333); \ + PERM_OP (r, l, tt, 16, 0x0000ffff); \ + PERM_OP (l, r, tt, 4, 0x0f0f0f0f); \ +} + +__constant u8 ascii_to_ebcdic_pc[256] = +{ + // little hack, can't crack 0-bytes in password, but who cares + // 0xab, 0xa8, 0xae, 0xad, 0xc4, 0xf1, 0xf7, 0xf4, 0x86, 0xa1, 0xe0, 0xbc, 0xb3, 0xb0, 0xb6, 0xb5, + 0x2a, 0xa8, 0xae, 0xad, 0xc4, 0xf1, 0xf7, 0xf4, 0x86, 0xa1, 0xe0, 0xbc, 0xb3, 0xb0, 0xb6, 0xb5, + 0x8a, 0x89, 0x8f, 0x8c, 0xd3, 0xd0, 0xce, 0xe6, 0x9b, 0x98, 0xd5, 0xe5, 0x92, 0x91, 0x97, 0x94, + 0x2a, 0x34, 0x54, 0x5d, 0x1c, 0x73, 0x0b, 0x51, 0x31, 0x10, 0x13, 0x37, 0x7c, 0x6b, 0x3d, 0x68, + 0x4a, 0x49, 0x4f, 0x4c, 0x43, 0x40, 0x46, 0x45, 0x5b, 0x58, 0x5e, 0x16, 0x32, 0x57, 0x76, 0x75, + 0x52, 0x29, 0x2f, 0x2c, 0x23, 0x20, 0x26, 0x25, 0x3b, 0x38, 0x08, 0x0e, 0x0d, 0x02, 0x01, 0x07, + 0x04, 0x1a, 0x19, 0x6e, 0x6d, 0x62, 0x61, 0x67, 0x64, 0x7a, 0x79, 0x3e, 0x6b, 0x1f, 0x15, 0x70, + 0x58, 0xa8, 0xae, 0xad, 0xa2, 0xa1, 0xa7, 0xa4, 0xba, 0xb9, 0x89, 0x8f, 0x8c, 0x83, 0x80, 0x86, + 0x85, 0x9b, 0x98, 0xef, 0xec, 0xe3, 0xe0, 0xe6, 0xe5, 0xfb, 0xf8, 0x2a, 0x7f, 0x0b, 0xe9, 0xa4, + 0xea, 0xe9, 0xef, 0xec, 0xe3, 0x80, 0xa7, 0x85, 0xfb, 0xf8, 0xfe, 0xfd, 0xf2, 0xb9, 0xbf, 0x9d, + 0xcb, 0xc8, 0x9e, 0xcd, 0xc2, 0xc1, 0xc7, 0xba, 0xda, 0xd9, 0xdf, 0xdc, 0xa2, 0x83, 0xd6, 0x68, + 0x29, 0x2f, 0x2c, 0x23, 0x20, 0x26, 0x25, 0x3b, 0x38, 0x08, 0x0e, 0x0d, 0x02, 0x01, 0x07, 0x04, + 0x1a, 0x19, 0x6e, 0x6d, 0x62, 0x61, 0x67, 0x64, 0x7a, 0x79, 0x4a, 0x49, 0x4f, 0x4c, 0x43, 0x40, + 0x46, 0x45, 0x5b, 0xab, 0xbf, 0xbc, 0xb3, 0xb0, 0xb6, 0xb5, 0x8a, 0x9e, 0x9d, 0x92, 0x91, 0x97, + 0x94, 0xea, 0xfe, 0xfd, 0xf2, 0xf1, 0xf7, 0xf4, 0xcb, 0xc8, 0xce, 0xcd, 0xc2, 0xc1, 0xc7, 0xc4, + 0xda, 0xd9, 0xdf, 0xdc, 0xd3, 0xd0, 0xd6, 0xd5, 0x3e, 0x3d, 0x32, 0x31, 0x37, 0x34, 0x1f, 0x1c, + 0x13, 0x10, 0x16, 0x15, 0x7f, 0x7c, 0x73, 0x70, 0x76, 0x75, 0x5e, 0x5d, 0x52, 0x51, 0x57, 0x54, +}; + +__constant u32 c_SPtrans[8][64] = +{ + /* nibble 0 */ + 0x02080800, 0x00080000, 0x02000002, 0x02080802, + 0x02000000, 0x00080802, 0x00080002, 0x02000002, + 0x00080802, 0x02080800, 0x02080000, 0x00000802, + 0x02000802, 0x02000000, 0x00000000, 0x00080002, + 0x00080000, 0x00000002, 0x02000800, 0x00080800, + 0x02080802, 0x02080000, 0x00000802, 0x02000800, + 0x00000002, 0x00000800, 0x00080800, 0x02080002, + 0x00000800, 0x02000802, 0x02080002, 0x00000000, + 0x00000000, 0x02080802, 0x02000800, 0x00080002, + 0x02080800, 0x00080000, 0x00000802, 0x02000800, + 0x02080002, 0x00000800, 0x00080800, 0x02000002, + 0x00080802, 0x00000002, 0x02000002, 0x02080000, + 0x02080802, 0x00080800, 0x02080000, 0x02000802, + 0x02000000, 0x00000802, 0x00080002, 0x00000000, + 0x00080000, 0x02000000, 0x02000802, 0x02080800, + 0x00000002, 0x02080002, 0x00000800, 0x00080802, + /* nibble 1 */ + 0x40108010, 0x00000000, 0x00108000, 0x40100000, + 0x40000010, 0x00008010, 0x40008000, 0x00108000, + 0x00008000, 0x40100010, 0x00000010, 0x40008000, + 0x00100010, 0x40108000, 0x40100000, 0x00000010, + 0x00100000, 0x40008010, 0x40100010, 0x00008000, + 0x00108010, 0x40000000, 0x00000000, 0x00100010, + 0x40008010, 0x00108010, 0x40108000, 0x40000010, + 0x40000000, 0x00100000, 0x00008010, 0x40108010, + 0x00100010, 0x40108000, 0x40008000, 0x00108010, + 0x40108010, 0x00100010, 0x40000010, 0x00000000, + 0x40000000, 0x00008010, 0x00100000, 0x40100010, + 0x00008000, 0x40000000, 0x00108010, 0x40008010, + 0x40108000, 0x00008000, 0x00000000, 0x40000010, + 0x00000010, 0x40108010, 0x00108000, 0x40100000, + 0x40100010, 0x00100000, 0x00008010, 0x40008000, + 0x40008010, 0x00000010, 0x40100000, 0x00108000, + /* nibble 2 */ + 0x04000001, 0x04040100, 0x00000100, 0x04000101, + 0x00040001, 0x04000000, 0x04000101, 0x00040100, + 0x04000100, 0x00040000, 0x04040000, 0x00000001, + 0x04040101, 0x00000101, 0x00000001, 0x04040001, + 0x00000000, 0x00040001, 0x04040100, 0x00000100, + 0x00000101, 0x04040101, 0x00040000, 0x04000001, + 0x04040001, 0x04000100, 0x00040101, 0x04040000, + 0x00040100, 0x00000000, 0x04000000, 0x00040101, + 0x04040100, 0x00000100, 0x00000001, 0x00040000, + 0x00000101, 0x00040001, 0x04040000, 0x04000101, + 0x00000000, 0x04040100, 0x00040100, 0x04040001, + 0x00040001, 0x04000000, 0x04040101, 0x00000001, + 0x00040101, 0x04000001, 0x04000000, 0x04040101, + 0x00040000, 0x04000100, 0x04000101, 0x00040100, + 0x04000100, 0x00000000, 0x04040001, 0x00000101, + 0x04000001, 0x00040101, 0x00000100, 0x04040000, + /* nibble 3 */ + 0x00401008, 0x10001000, 0x00000008, 0x10401008, + 0x00000000, 0x10400000, 0x10001008, 0x00400008, + 0x10401000, 0x10000008, 0x10000000, 0x00001008, + 0x10000008, 0x00401008, 0x00400000, 0x10000000, + 0x10400008, 0x00401000, 0x00001000, 0x00000008, + 0x00401000, 0x10001008, 0x10400000, 0x00001000, + 0x00001008, 0x00000000, 0x00400008, 0x10401000, + 0x10001000, 0x10400008, 0x10401008, 0x00400000, + 0x10400008, 0x00001008, 0x00400000, 0x10000008, + 0x00401000, 0x10001000, 0x00000008, 0x10400000, + 0x10001008, 0x00000000, 0x00001000, 0x00400008, + 0x00000000, 0x10400008, 0x10401000, 0x00001000, + 0x10000000, 0x10401008, 0x00401008, 0x00400000, + 0x10401008, 0x00000008, 0x10001000, 0x00401008, + 0x00400008, 0x00401000, 0x10400000, 0x10001008, + 0x00001008, 0x10000000, 0x10000008, 0x10401000, + /* nibble 4 */ + 0x08000000, 0x00010000, 0x00000400, 0x08010420, + 0x08010020, 0x08000400, 0x00010420, 0x08010000, + 0x00010000, 0x00000020, 0x08000020, 0x00010400, + 0x08000420, 0x08010020, 0x08010400, 0x00000000, + 0x00010400, 0x08000000, 0x00010020, 0x00000420, + 0x08000400, 0x00010420, 0x00000000, 0x08000020, + 0x00000020, 0x08000420, 0x08010420, 0x00010020, + 0x08010000, 0x00000400, 0x00000420, 0x08010400, + 0x08010400, 0x08000420, 0x00010020, 0x08010000, + 0x00010000, 0x00000020, 0x08000020, 0x08000400, + 0x08000000, 0x00010400, 0x08010420, 0x00000000, + 0x00010420, 0x08000000, 0x00000400, 0x00010020, + 0x08000420, 0x00000400, 0x00000000, 0x08010420, + 0x08010020, 0x08010400, 0x00000420, 0x00010000, + 0x00010400, 0x08010020, 0x08000400, 0x00000420, + 0x00000020, 0x00010420, 0x08010000, 0x08000020, + /* nibble 5 */ + 0x80000040, 0x00200040, 0x00000000, 0x80202000, + 0x00200040, 0x00002000, 0x80002040, 0x00200000, + 0x00002040, 0x80202040, 0x00202000, 0x80000000, + 0x80002000, 0x80000040, 0x80200000, 0x00202040, + 0x00200000, 0x80002040, 0x80200040, 0x00000000, + 0x00002000, 0x00000040, 0x80202000, 0x80200040, + 0x80202040, 0x80200000, 0x80000000, 0x00002040, + 0x00000040, 0x00202000, 0x00202040, 0x80002000, + 0x00002040, 0x80000000, 0x80002000, 0x00202040, + 0x80202000, 0x00200040, 0x00000000, 0x80002000, + 0x80000000, 0x00002000, 0x80200040, 0x00200000, + 0x00200040, 0x80202040, 0x00202000, 0x00000040, + 0x80202040, 0x00202000, 0x00200000, 0x80002040, + 0x80000040, 0x80200000, 0x00202040, 0x00000000, + 0x00002000, 0x80000040, 0x80002040, 0x80202000, + 0x80200000, 0x00002040, 0x00000040, 0x80200040, + /* nibble 6 */ + 0x00004000, 0x00000200, 0x01000200, 0x01000004, + 0x01004204, 0x00004004, 0x00004200, 0x00000000, + 0x01000000, 0x01000204, 0x00000204, 0x01004000, + 0x00000004, 0x01004200, 0x01004000, 0x00000204, + 0x01000204, 0x00004000, 0x00004004, 0x01004204, + 0x00000000, 0x01000200, 0x01000004, 0x00004200, + 0x01004004, 0x00004204, 0x01004200, 0x00000004, + 0x00004204, 0x01004004, 0x00000200, 0x01000000, + 0x00004204, 0x01004000, 0x01004004, 0x00000204, + 0x00004000, 0x00000200, 0x01000000, 0x01004004, + 0x01000204, 0x00004204, 0x00004200, 0x00000000, + 0x00000200, 0x01000004, 0x00000004, 0x01000200, + 0x00000000, 0x01000204, 0x01000200, 0x00004200, + 0x00000204, 0x00004000, 0x01004204, 0x01000000, + 0x01004200, 0x00000004, 0x00004004, 0x01004204, + 0x01000004, 0x01004200, 0x01004000, 0x00004004, + /* nibble 7 */ + 0x20800080, 0x20820000, 0x00020080, 0x00000000, + 0x20020000, 0x00800080, 0x20800000, 0x20820080, + 0x00000080, 0x20000000, 0x00820000, 0x00020080, + 0x00820080, 0x20020080, 0x20000080, 0x20800000, + 0x00020000, 0x00820080, 0x00800080, 0x20020000, + 0x20820080, 0x20000080, 0x00000000, 0x00820000, + 0x20000000, 0x00800000, 0x20020080, 0x20800080, + 0x00800000, 0x00020000, 0x20820000, 0x00000080, + 0x00800000, 0x00020000, 0x20000080, 0x20820080, + 0x00020080, 0x20000000, 0x00000000, 0x00820000, + 0x20800080, 0x20020080, 0x20020000, 0x00800080, + 0x20820000, 0x00000080, 0x00800080, 0x20020000, + 0x20820080, 0x00800000, 0x20800000, 0x20000080, + 0x00820000, 0x00020080, 0x20020080, 0x20800000, + 0x00000080, 0x20820000, 0x00820080, 0x00000000, + 0x20000000, 0x20800080, 0x00020000, 0x00820080, +}; + +__constant u32 c_skb[8][64] = +{ + /* for C bits (numbered as per FIPS 46) 1 2 3 4 5 6 */ + 0x00000000, 0x00000010, 0x20000000, 0x20000010, + 0x00010000, 0x00010010, 0x20010000, 0x20010010, + 0x00000800, 0x00000810, 0x20000800, 0x20000810, + 0x00010800, 0x00010810, 0x20010800, 0x20010810, + 0x00000020, 0x00000030, 0x20000020, 0x20000030, + 0x00010020, 0x00010030, 0x20010020, 0x20010030, + 0x00000820, 0x00000830, 0x20000820, 0x20000830, + 0x00010820, 0x00010830, 0x20010820, 0x20010830, + 0x00080000, 0x00080010, 0x20080000, 0x20080010, + 0x00090000, 0x00090010, 0x20090000, 0x20090010, + 0x00080800, 0x00080810, 0x20080800, 0x20080810, + 0x00090800, 0x00090810, 0x20090800, 0x20090810, + 0x00080020, 0x00080030, 0x20080020, 0x20080030, + 0x00090020, 0x00090030, 0x20090020, 0x20090030, + 0x00080820, 0x00080830, 0x20080820, 0x20080830, + 0x00090820, 0x00090830, 0x20090820, 0x20090830, + /* for C bits (numbered as per FIPS 46) 7 8 10 11 12 13 */ + 0x00000000, 0x02000000, 0x00002000, 0x02002000, + 0x00200000, 0x02200000, 0x00202000, 0x02202000, + 0x00000004, 0x02000004, 0x00002004, 0x02002004, + 0x00200004, 0x02200004, 0x00202004, 0x02202004, + 0x00000400, 0x02000400, 0x00002400, 0x02002400, + 0x00200400, 0x02200400, 0x00202400, 0x02202400, + 0x00000404, 0x02000404, 0x00002404, 0x02002404, + 0x00200404, 0x02200404, 0x00202404, 0x02202404, + 0x10000000, 0x12000000, 0x10002000, 0x12002000, + 0x10200000, 0x12200000, 0x10202000, 0x12202000, + 0x10000004, 0x12000004, 0x10002004, 0x12002004, + 0x10200004, 0x12200004, 0x10202004, 0x12202004, + 0x10000400, 0x12000400, 0x10002400, 0x12002400, + 0x10200400, 0x12200400, 0x10202400, 0x12202400, + 0x10000404, 0x12000404, 0x10002404, 0x12002404, + 0x10200404, 0x12200404, 0x10202404, 0x12202404, + /* for C bits (numbered as per FIPS 46) 14 15 16 17 19 20 */ + 0x00000000, 0x00000001, 0x00040000, 0x00040001, + 0x01000000, 0x01000001, 0x01040000, 0x01040001, + 0x00000002, 0x00000003, 0x00040002, 0x00040003, + 0x01000002, 0x01000003, 0x01040002, 0x01040003, + 0x00000200, 0x00000201, 0x00040200, 0x00040201, + 0x01000200, 0x01000201, 0x01040200, 0x01040201, + 0x00000202, 0x00000203, 0x00040202, 0x00040203, + 0x01000202, 0x01000203, 0x01040202, 0x01040203, + 0x08000000, 0x08000001, 0x08040000, 0x08040001, + 0x09000000, 0x09000001, 0x09040000, 0x09040001, + 0x08000002, 0x08000003, 0x08040002, 0x08040003, + 0x09000002, 0x09000003, 0x09040002, 0x09040003, + 0x08000200, 0x08000201, 0x08040200, 0x08040201, + 0x09000200, 0x09000201, 0x09040200, 0x09040201, + 0x08000202, 0x08000203, 0x08040202, 0x08040203, + 0x09000202, 0x09000203, 0x09040202, 0x09040203, + /* for C bits (numbered as per FIPS 46) 21 23 24 26 27 28 */ + 0x00000000, 0x00100000, 0x00000100, 0x00100100, + 0x00000008, 0x00100008, 0x00000108, 0x00100108, + 0x00001000, 0x00101000, 0x00001100, 0x00101100, + 0x00001008, 0x00101008, 0x00001108, 0x00101108, + 0x04000000, 0x04100000, 0x04000100, 0x04100100, + 0x04000008, 0x04100008, 0x04000108, 0x04100108, + 0x04001000, 0x04101000, 0x04001100, 0x04101100, + 0x04001008, 0x04101008, 0x04001108, 0x04101108, + 0x00020000, 0x00120000, 0x00020100, 0x00120100, + 0x00020008, 0x00120008, 0x00020108, 0x00120108, + 0x00021000, 0x00121000, 0x00021100, 0x00121100, + 0x00021008, 0x00121008, 0x00021108, 0x00121108, + 0x04020000, 0x04120000, 0x04020100, 0x04120100, + 0x04020008, 0x04120008, 0x04020108, 0x04120108, + 0x04021000, 0x04121000, 0x04021100, 0x04121100, + 0x04021008, 0x04121008, 0x04021108, 0x04121108, + /* for D bits (numbered as per FIPS 46) 1 2 3 4 5 6 */ + 0x00000000, 0x10000000, 0x00010000, 0x10010000, + 0x00000004, 0x10000004, 0x00010004, 0x10010004, + 0x20000000, 0x30000000, 0x20010000, 0x30010000, + 0x20000004, 0x30000004, 0x20010004, 0x30010004, + 0x00100000, 0x10100000, 0x00110000, 0x10110000, + 0x00100004, 0x10100004, 0x00110004, 0x10110004, + 0x20100000, 0x30100000, 0x20110000, 0x30110000, + 0x20100004, 0x30100004, 0x20110004, 0x30110004, + 0x00001000, 0x10001000, 0x00011000, 0x10011000, + 0x00001004, 0x10001004, 0x00011004, 0x10011004, + 0x20001000, 0x30001000, 0x20011000, 0x30011000, + 0x20001004, 0x30001004, 0x20011004, 0x30011004, + 0x00101000, 0x10101000, 0x00111000, 0x10111000, + 0x00101004, 0x10101004, 0x00111004, 0x10111004, + 0x20101000, 0x30101000, 0x20111000, 0x30111000, + 0x20101004, 0x30101004, 0x20111004, 0x30111004, + /* for D bits (numbered as per FIPS 46) 8 9 11 12 13 14 */ + 0x00000000, 0x08000000, 0x00000008, 0x08000008, + 0x00000400, 0x08000400, 0x00000408, 0x08000408, + 0x00020000, 0x08020000, 0x00020008, 0x08020008, + 0x00020400, 0x08020400, 0x00020408, 0x08020408, + 0x00000001, 0x08000001, 0x00000009, 0x08000009, + 0x00000401, 0x08000401, 0x00000409, 0x08000409, + 0x00020001, 0x08020001, 0x00020009, 0x08020009, + 0x00020401, 0x08020401, 0x00020409, 0x08020409, + 0x02000000, 0x0A000000, 0x02000008, 0x0A000008, + 0x02000400, 0x0A000400, 0x02000408, 0x0A000408, + 0x02020000, 0x0A020000, 0x02020008, 0x0A020008, + 0x02020400, 0x0A020400, 0x02020408, 0x0A020408, + 0x02000001, 0x0A000001, 0x02000009, 0x0A000009, + 0x02000401, 0x0A000401, 0x02000409, 0x0A000409, + 0x02020001, 0x0A020001, 0x02020009, 0x0A020009, + 0x02020401, 0x0A020401, 0x02020409, 0x0A020409, + /* for D bits (numbered as per FIPS 46) 16 17 18 19 20 21 */ + 0x00000000, 0x00000100, 0x00080000, 0x00080100, + 0x01000000, 0x01000100, 0x01080000, 0x01080100, + 0x00000010, 0x00000110, 0x00080010, 0x00080110, + 0x01000010, 0x01000110, 0x01080010, 0x01080110, + 0x00200000, 0x00200100, 0x00280000, 0x00280100, + 0x01200000, 0x01200100, 0x01280000, 0x01280100, + 0x00200010, 0x00200110, 0x00280010, 0x00280110, + 0x01200010, 0x01200110, 0x01280010, 0x01280110, + 0x00000200, 0x00000300, 0x00080200, 0x00080300, + 0x01000200, 0x01000300, 0x01080200, 0x01080300, + 0x00000210, 0x00000310, 0x00080210, 0x00080310, + 0x01000210, 0x01000310, 0x01080210, 0x01080310, + 0x00200200, 0x00200300, 0x00280200, 0x00280300, + 0x01200200, 0x01200300, 0x01280200, 0x01280300, + 0x00200210, 0x00200310, 0x00280210, 0x00280310, + 0x01200210, 0x01200310, 0x01280210, 0x01280310, + /* for D bits (numbered as per FIPS 46) 22 23 24 25 27 28 */ + 0x00000000, 0x04000000, 0x00040000, 0x04040000, + 0x00000002, 0x04000002, 0x00040002, 0x04040002, + 0x00002000, 0x04002000, 0x00042000, 0x04042000, + 0x00002002, 0x04002002, 0x00042002, 0x04042002, + 0x00000020, 0x04000020, 0x00040020, 0x04040020, + 0x00000022, 0x04000022, 0x00040022, 0x04040022, + 0x00002020, 0x04002020, 0x00042020, 0x04042020, + 0x00002022, 0x04002022, 0x00042022, 0x04042022, + 0x00000800, 0x04000800, 0x00040800, 0x04040800, + 0x00000802, 0x04000802, 0x00040802, 0x04040802, + 0x00002800, 0x04002800, 0x00042800, 0x04042800, + 0x00002802, 0x04002802, 0x00042802, 0x04042802, + 0x00000820, 0x04000820, 0x00040820, 0x04040820, + 0x00000822, 0x04000822, 0x00040822, 0x04040822, + 0x00002820, 0x04002820, 0x00042820, 0x04042820, + 0x00002822, 0x04002822, 0x00042822, 0x04042822, +}; + +#define NBOX(i,n,S) (S)[(n)][(i)] + +static void _des_crypt_encrypt (u32x iv[2], u32x data[2], u32x Kc[16], u32x Kd[16], __local u32 s_SPtrans[8][64]) +{ + u32x tt; + + u32x r = data[0]; + u32x l = data[1]; + + #pragma unroll 16 + for (u32 i = 0; i < 16; i++) + { + u32x u = Kc[i] ^ r; + u32x t = Kd[i] ^ rotl32 (r, 28u); + + #ifdef VECT_SIZE1 + l ^= NBOX (((u >> 2) & 0x3f), 0, s_SPtrans) + | NBOX (((u >> 10) & 0x3f), 2, s_SPtrans) + | NBOX (((u >> 18) & 0x3f), 4, s_SPtrans) + | NBOX (((u >> 26) & 0x3f), 6, s_SPtrans) + | NBOX (((t >> 2) & 0x3f), 1, s_SPtrans) + | NBOX (((t >> 10) & 0x3f), 3, s_SPtrans) + | NBOX (((t >> 18) & 0x3f), 5, s_SPtrans) + | NBOX (((t >> 26) & 0x3f), 7, s_SPtrans); + #endif + + #ifdef VECT_SIZE2 + l.s0 ^= NBOX (((u.s0 >> 2) & 0x3f), 0, s_SPtrans) + | NBOX (((u.s0 >> 10) & 0x3f), 2, s_SPtrans) + | NBOX (((u.s0 >> 18) & 0x3f), 4, s_SPtrans) + | NBOX (((u.s0 >> 26) & 0x3f), 6, s_SPtrans) + | NBOX (((t.s0 >> 2) & 0x3f), 1, s_SPtrans) + | NBOX (((t.s0 >> 10) & 0x3f), 3, s_SPtrans) + | NBOX (((t.s0 >> 18) & 0x3f), 5, s_SPtrans) + | NBOX (((t.s0 >> 26) & 0x3f), 7, s_SPtrans); + + l.s1 ^= NBOX (((u.s1 >> 2) & 0x3f), 0, s_SPtrans) + | NBOX (((u.s1 >> 10) & 0x3f), 2, s_SPtrans) + | NBOX (((u.s1 >> 18) & 0x3f), 4, s_SPtrans) + | NBOX (((u.s1 >> 26) & 0x3f), 6, s_SPtrans) + | NBOX (((t.s1 >> 2) & 0x3f), 1, s_SPtrans) + | NBOX (((t.s1 >> 10) & 0x3f), 3, s_SPtrans) + | NBOX (((t.s1 >> 18) & 0x3f), 5, s_SPtrans) + | NBOX (((t.s1 >> 26) & 0x3f), 7, s_SPtrans); + #endif + + #ifdef VECT_SIZE4 + l.s0 ^= NBOX (((u.s0 >> 2) & 0x3f), 0, s_SPtrans) + | NBOX (((u.s0 >> 10) & 0x3f), 2, s_SPtrans) + | NBOX (((u.s0 >> 18) & 0x3f), 4, s_SPtrans) + | NBOX (((u.s0 >> 26) & 0x3f), 6, s_SPtrans) + | NBOX (((t.s0 >> 2) & 0x3f), 1, s_SPtrans) + | NBOX (((t.s0 >> 10) & 0x3f), 3, s_SPtrans) + | NBOX (((t.s0 >> 18) & 0x3f), 5, s_SPtrans) + | NBOX (((t.s0 >> 26) & 0x3f), 7, s_SPtrans); + + l.s1 ^= NBOX (((u.s1 >> 2) & 0x3f), 0, s_SPtrans) + | NBOX (((u.s1 >> 10) & 0x3f), 2, s_SPtrans) + | NBOX (((u.s1 >> 18) & 0x3f), 4, s_SPtrans) + | NBOX (((u.s1 >> 26) & 0x3f), 6, s_SPtrans) + | NBOX (((t.s1 >> 2) & 0x3f), 1, s_SPtrans) + | NBOX (((t.s1 >> 10) & 0x3f), 3, s_SPtrans) + | NBOX (((t.s1 >> 18) & 0x3f), 5, s_SPtrans) + | NBOX (((t.s1 >> 26) & 0x3f), 7, s_SPtrans); + + l.s2 ^= NBOX (((u.s2 >> 2) & 0x3f), 0, s_SPtrans) + | NBOX (((u.s2 >> 10) & 0x3f), 2, s_SPtrans) + | NBOX (((u.s2 >> 18) & 0x3f), 4, s_SPtrans) + | NBOX (((u.s2 >> 26) & 0x3f), 6, s_SPtrans) + | NBOX (((t.s2 >> 2) & 0x3f), 1, s_SPtrans) + | NBOX (((t.s2 >> 10) & 0x3f), 3, s_SPtrans) + | NBOX (((t.s2 >> 18) & 0x3f), 5, s_SPtrans) + | NBOX (((t.s2 >> 26) & 0x3f), 7, s_SPtrans); + + l.s3 ^= NBOX (((u.s3 >> 2) & 0x3f), 0, s_SPtrans) + | NBOX (((u.s3 >> 10) & 0x3f), 2, s_SPtrans) + | NBOX (((u.s3 >> 18) & 0x3f), 4, s_SPtrans) + | NBOX (((u.s3 >> 26) & 0x3f), 6, s_SPtrans) + | NBOX (((t.s3 >> 2) & 0x3f), 1, s_SPtrans) + | NBOX (((t.s3 >> 10) & 0x3f), 3, s_SPtrans) + | NBOX (((t.s3 >> 18) & 0x3f), 5, s_SPtrans) + | NBOX (((t.s3 >> 26) & 0x3f), 7, s_SPtrans); + #endif + + tt = l; + l = r; + r = tt; + } + + iv[0] = l; + iv[1] = r; +} + +static void _des_crypt_keysetup (u32x c, u32x d, u32x Kc[16], u32x Kd[16], __local u32 s_skb[8][64]) +{ + u32x tt; + + PERM_OP (d, c, tt, 4, 0x0f0f0f0f); + HPERM_OP (c, tt, 2, 0xcccc0000); + HPERM_OP (d, tt, 2, 0xcccc0000); + PERM_OP (d, c, tt, 1, 0x55555555); + PERM_OP (c, d, tt, 8, 0x00ff00ff); + PERM_OP (d, c, tt, 1, 0x55555555); + + d = ((d & 0x000000ff) << 16) + | ((d & 0x0000ff00) << 0) + | ((d & 0x00ff0000) >> 16) + | ((c & 0xf0000000) >> 4); + + c = c & 0x0fffffff; + + #pragma unroll 16 + for (u32 i = 0; i < 16; i++) + { + const u32 shifts3s0[16] = { 1, 1, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 1 }; + const u32 shifts3s1[16] = { 27, 27, 26, 26, 26, 26, 26, 26, 27, 26, 26, 26, 26, 26, 26, 27 }; + + c = c >> shifts3s0[i] | c << shifts3s1[i]; + d = d >> shifts3s0[i] | d << shifts3s1[i]; + + c = c & 0x0fffffff; + d = d & 0x0fffffff; + + u32x s; + u32x t; + + #ifdef VECT_SIZE1 + s = NBOX ((( c >> 0) & 0x3f), 0, s_skb) + | NBOX ((((c >> 6) & 0x03) + | ((c >> 7) & 0x3c)), 1, s_skb) + | NBOX ((((c >> 13) & 0x0f) + | ((c >> 14) & 0x30)), 2, s_skb) + | NBOX ((((c >> 20) & 0x01) + | ((c >> 21) & 0x06) + | ((c >> 22) & 0x38)), 3, s_skb); + + t = NBOX ((( d >> 0) & 0x3f), 4, s_skb) + | NBOX ((((d >> 7) & 0x03) + | ((d >> 8) & 0x3c)), 5, s_skb) + | NBOX ((((d >> 15) & 0x3f)), 6, s_skb) + | NBOX ((((d >> 21) & 0x0f) + | ((d >> 22) & 0x30)), 7, s_skb); + #endif + + #ifdef VECT_SIZE2 + s.s0 = NBOX ((( c.s0 >> 0) & 0x3f), 0, s_skb) + | NBOX ((((c.s0 >> 6) & 0x03) + | ((c.s0 >> 7) & 0x3c)), 1, s_skb) + | NBOX ((((c.s0 >> 13) & 0x0f) + | ((c.s0 >> 14) & 0x30)), 2, s_skb) + | NBOX ((((c.s0 >> 20) & 0x01) + | ((c.s0 >> 21) & 0x06) + | ((c.s0 >> 22) & 0x38)), 3, s_skb); + + t.s0 = NBOX ((( d.s0 >> 0) & 0x3f), 4, s_skb) + | NBOX ((((d.s0 >> 7) & 0x03) + | ((d.s0 >> 8) & 0x3c)), 5, s_skb) + | NBOX ((((d.s0 >> 15) & 0x3f)), 6, s_skb) + | NBOX ((((d.s0 >> 21) & 0x0f) + | ((d.s0 >> 22) & 0x30)), 7, s_skb); + + s.s1 = NBOX ((( c.s1 >> 0) & 0x3f), 0, s_skb) + | NBOX ((((c.s1 >> 6) & 0x03) + | ((c.s1 >> 7) & 0x3c)), 1, s_skb) + | NBOX ((((c.s1 >> 13) & 0x0f) + | ((c.s1 >> 14) & 0x30)), 2, s_skb) + | NBOX ((((c.s1 >> 20) & 0x01) + | ((c.s1 >> 21) & 0x06) + | ((c.s1 >> 22) & 0x38)), 3, s_skb); + + t.s1 = NBOX ((( d.s1 >> 0) & 0x3f), 4, s_skb) + | NBOX ((((d.s1 >> 7) & 0x03) + | ((d.s1 >> 8) & 0x3c)), 5, s_skb) + | NBOX ((((d.s1 >> 15) & 0x3f)), 6, s_skb) + | NBOX ((((d.s1 >> 21) & 0x0f) + | ((d.s1 >> 22) & 0x30)), 7, s_skb); + #endif + + #ifdef VECT_SIZE4 + s.s0 = NBOX ((( c.s0 >> 0) & 0x3f), 0, s_skb) + | NBOX ((((c.s0 >> 6) & 0x03) + | ((c.s0 >> 7) & 0x3c)), 1, s_skb) + | NBOX ((((c.s0 >> 13) & 0x0f) + | ((c.s0 >> 14) & 0x30)), 2, s_skb) + | NBOX ((((c.s0 >> 20) & 0x01) + | ((c.s0 >> 21) & 0x06) + | ((c.s0 >> 22) & 0x38)), 3, s_skb); + + t.s0 = NBOX ((( d.s0 >> 0) & 0x3f), 4, s_skb) + | NBOX ((((d.s0 >> 7) & 0x03) + | ((d.s0 >> 8) & 0x3c)), 5, s_skb) + | NBOX ((((d.s0 >> 15) & 0x3f)), 6, s_skb) + | NBOX ((((d.s0 >> 21) & 0x0f) + | ((d.s0 >> 22) & 0x30)), 7, s_skb); + + s.s1 = NBOX ((( c.s1 >> 0) & 0x3f), 0, s_skb) + | NBOX ((((c.s1 >> 6) & 0x03) + | ((c.s1 >> 7) & 0x3c)), 1, s_skb) + | NBOX ((((c.s1 >> 13) & 0x0f) + | ((c.s1 >> 14) & 0x30)), 2, s_skb) + | NBOX ((((c.s1 >> 20) & 0x01) + | ((c.s1 >> 21) & 0x06) + | ((c.s1 >> 22) & 0x38)), 3, s_skb); + + t.s1 = NBOX ((( d.s1 >> 0) & 0x3f), 4, s_skb) + | NBOX ((((d.s1 >> 7) & 0x03) + | ((d.s1 >> 8) & 0x3c)), 5, s_skb) + | NBOX ((((d.s1 >> 15) & 0x3f)), 6, s_skb) + | NBOX ((((d.s1 >> 21) & 0x0f) + | ((d.s1 >> 22) & 0x30)), 7, s_skb); + + s.s2 = NBOX ((( c.s2 >> 0) & 0x3f), 0, s_skb) + | NBOX ((((c.s2 >> 6) & 0x03) + | ((c.s2 >> 7) & 0x3c)), 1, s_skb) + | NBOX ((((c.s2 >> 13) & 0x0f) + | ((c.s2 >> 14) & 0x30)), 2, s_skb) + | NBOX ((((c.s2 >> 20) & 0x01) + | ((c.s2 >> 21) & 0x06) + | ((c.s2 >> 22) & 0x38)), 3, s_skb); + + t.s2 = NBOX ((( d.s2 >> 0) & 0x3f), 4, s_skb) + | NBOX ((((d.s2 >> 7) & 0x03) + | ((d.s2 >> 8) & 0x3c)), 5, s_skb) + | NBOX ((((d.s2 >> 15) & 0x3f)), 6, s_skb) + | NBOX ((((d.s2 >> 21) & 0x0f) + | ((d.s2 >> 22) & 0x30)), 7, s_skb); + + s.s3 = NBOX ((( c.s3 >> 0) & 0x3f), 0, s_skb) + | NBOX ((((c.s3 >> 6) & 0x03) + | ((c.s3 >> 7) & 0x3c)), 1, s_skb) + | NBOX ((((c.s3 >> 13) & 0x0f) + | ((c.s3 >> 14) & 0x30)), 2, s_skb) + | NBOX ((((c.s3 >> 20) & 0x01) + | ((c.s3 >> 21) & 0x06) + | ((c.s3 >> 22) & 0x38)), 3, s_skb); + + t.s3 = NBOX ((( d.s3 >> 0) & 0x3f), 4, s_skb) + | NBOX ((((d.s3 >> 7) & 0x03) + | ((d.s3 >> 8) & 0x3c)), 5, s_skb) + | NBOX ((((d.s3 >> 15) & 0x3f)), 6, s_skb) + | NBOX ((((d.s3 >> 21) & 0x0f) + | ((d.s3 >> 22) & 0x30)), 7, s_skb); + #endif + + #if defined cl_amd_media_ops + Kc[i] = amd_bytealign (t, s << 16, 2); + Kd[i] = amd_bytealign (t >> 16, s, 2); + #else + Kc[i] = ((t << 16) | (s & 0x0000ffff)); + Kd[i] = ((s >> 16) | (t & 0xffff0000)); + #endif + + Kc[i] = rotl32 (Kc[i], 2u); + Kd[i] = rotl32 (Kd[i], 2u); + } +} + +static void transform_racf_key (const u32x w0, const u32x w1, u32x key[2]) +{ + #ifdef VECT_SIZE1 + + key[0] = (ascii_to_ebcdic_pc[(w0 >> 0) & 0xff]) << 0 + | (ascii_to_ebcdic_pc[(w0 >> 8) & 0xff]) << 8 + | (ascii_to_ebcdic_pc[(w0 >> 16) & 0xff]) << 16 + | (ascii_to_ebcdic_pc[(w0 >> 24) & 0xff]) << 24; + + key[1] = (ascii_to_ebcdic_pc[(w1 >> 0) & 0xff]) << 0 + | (ascii_to_ebcdic_pc[(w1 >> 8) & 0xff]) << 8 + | (ascii_to_ebcdic_pc[(w1 >> 16) & 0xff]) << 16 + | (ascii_to_ebcdic_pc[(w1 >> 24) & 0xff]) << 24; + #endif + + #ifdef VECT_SIZE2 + + key[0].s0 = (ascii_to_ebcdic_pc[(w0.s0 >> 0) & 0xff]) << 0 + | (ascii_to_ebcdic_pc[(w0.s0 >> 8) & 0xff]) << 8 + | (ascii_to_ebcdic_pc[(w0.s0 >> 16) & 0xff]) << 16 + | (ascii_to_ebcdic_pc[(w0.s0 >> 24) & 0xff]) << 24; + + key[0].s1 = (ascii_to_ebcdic_pc[(w0.s1 >> 0) & 0xff]) << 0 + | (ascii_to_ebcdic_pc[(w0.s1 >> 8) & 0xff]) << 8 + | (ascii_to_ebcdic_pc[(w0.s1 >> 16) & 0xff]) << 16 + | (ascii_to_ebcdic_pc[(w0.s1 >> 24) & 0xff]) << 24; + + key[1].s0 = (ascii_to_ebcdic_pc[(w1.s0 >> 0) & 0xff]) << 0 + | (ascii_to_ebcdic_pc[(w1.s0 >> 8) & 0xff]) << 8 + | (ascii_to_ebcdic_pc[(w1.s0 >> 16) & 0xff]) << 16 + | (ascii_to_ebcdic_pc[(w1.s0 >> 24) & 0xff]) << 24; + + key[1].s1 = (ascii_to_ebcdic_pc[(w1.s1 >> 0) & 0xff]) << 0 + | (ascii_to_ebcdic_pc[(w1.s1 >> 8) & 0xff]) << 8 + | (ascii_to_ebcdic_pc[(w1.s1 >> 16) & 0xff]) << 16 + | (ascii_to_ebcdic_pc[(w1.s1 >> 24) & 0xff]) << 24; + #endif + + #ifdef VECT_SIZE4 + key[0].s0 = (ascii_to_ebcdic_pc[(w0.s0 >> 0) & 0xff]) << 0 + | (ascii_to_ebcdic_pc[(w0.s0 >> 8) & 0xff]) << 8 + | (ascii_to_ebcdic_pc[(w0.s0 >> 16) & 0xff]) << 16 + | (ascii_to_ebcdic_pc[(w0.s0 >> 24) & 0xff]) << 24; + + key[0].s1 = (ascii_to_ebcdic_pc[(w0.s1 >> 0) & 0xff]) << 0 + | (ascii_to_ebcdic_pc[(w0.s1 >> 8) & 0xff]) << 8 + | (ascii_to_ebcdic_pc[(w0.s1 >> 16) & 0xff]) << 16 + | (ascii_to_ebcdic_pc[(w0.s1 >> 24) & 0xff]) << 24; + + key[0].s2 = (ascii_to_ebcdic_pc[(w0.s2 >> 0) & 0xff]) << 0 + | (ascii_to_ebcdic_pc[(w0.s2 >> 8) & 0xff]) << 8 + | (ascii_to_ebcdic_pc[(w0.s2 >> 16) & 0xff]) << 16 + | (ascii_to_ebcdic_pc[(w0.s2 >> 24) & 0xff]) << 24; + + key[0].s3 = (ascii_to_ebcdic_pc[(w0.s3 >> 0) & 0xff]) << 0 + | (ascii_to_ebcdic_pc[(w0.s3 >> 8) & 0xff]) << 8 + | (ascii_to_ebcdic_pc[(w0.s3 >> 16) & 0xff]) << 16 + | (ascii_to_ebcdic_pc[(w0.s3 >> 24) & 0xff]) << 24; + + key[1].s0 = (ascii_to_ebcdic_pc[(w1.s0 >> 0) & 0xff]) << 0 + | (ascii_to_ebcdic_pc[(w1.s0 >> 8) & 0xff]) << 8 + | (ascii_to_ebcdic_pc[(w1.s0 >> 16) & 0xff]) << 16 + | (ascii_to_ebcdic_pc[(w1.s0 >> 24) & 0xff]) << 24; + + key[1].s1 = (ascii_to_ebcdic_pc[(w1.s1 >> 0) & 0xff]) << 0 + | (ascii_to_ebcdic_pc[(w1.s1 >> 8) & 0xff]) << 8 + | (ascii_to_ebcdic_pc[(w1.s1 >> 16) & 0xff]) << 16 + | (ascii_to_ebcdic_pc[(w1.s1 >> 24) & 0xff]) << 24; + + key[1].s2 = (ascii_to_ebcdic_pc[(w1.s2 >> 0) & 0xff]) << 0 + | (ascii_to_ebcdic_pc[(w1.s2 >> 8) & 0xff]) << 8 + | (ascii_to_ebcdic_pc[(w1.s2 >> 16) & 0xff]) << 16 + | (ascii_to_ebcdic_pc[(w1.s2 >> 24) & 0xff]) << 24; + + key[1].s3 = (ascii_to_ebcdic_pc[(w1.s3 >> 0) & 0xff]) << 0 + | (ascii_to_ebcdic_pc[(w1.s3 >> 8) & 0xff]) << 8 + | (ascii_to_ebcdic_pc[(w1.s3 >> 16) & 0xff]) << 16 + | (ascii_to_ebcdic_pc[(w1.s3 >> 24) & 0xff]) << 24; + #endif +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m08500_m04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = 0; + wordl0[3] = 0; + + u32x wordl1[4]; + + wordl1[0] = 0; + wordl1[1] = 0; + wordl1[2] = 0; + wordl1[3] = 0; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, combs_buf[0].pw_len); + } + + /** + * salt + */ + + u32 salt_buf0[2]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf_pc[0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf_pc[1]; + + /** + * sbox, kbox + */ + + __local u32 s_SPtrans[8][64]; + + __local u32 s_skb[8][64]; + + s_SPtrans[0][lid] = c_SPtrans[0][lid]; + s_SPtrans[1][lid] = c_SPtrans[1][lid]; + s_SPtrans[2][lid] = c_SPtrans[2][lid]; + s_SPtrans[3][lid] = c_SPtrans[3][lid]; + s_SPtrans[4][lid] = c_SPtrans[4][lid]; + s_SPtrans[5][lid] = c_SPtrans[5][lid]; + s_SPtrans[6][lid] = c_SPtrans[6][lid]; + s_SPtrans[7][lid] = c_SPtrans[7][lid]; + + s_skb[0][lid] = c_skb[0][lid]; + s_skb[1][lid] = c_skb[1][lid]; + s_skb[2][lid] = c_skb[2][lid]; + s_skb[3][lid] = c_skb[3][lid]; + s_skb[4][lid] = c_skb[4][lid]; + s_skb[5][lid] = c_skb[5][lid]; + s_skb[6][lid] = c_skb[6][lid]; + s_skb[7][lid] = c_skb[7][lid]; + + barrier (CLK_LOCAL_MEM_FENCE); + + if (gid >= gid_max) return; + + /** + * main + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = combs_buf[il_pos].pw_len; + + u32 pw_len = pw_l_len + pw_r_len; + + pw_len = (pw_len >= 8) ? 8 : pw_len; + + u32 wordr0[4]; + + wordr0[0] = combs_buf[il_pos].i[0]; + wordr0[1] = combs_buf[il_pos].i[1]; + wordr0[2] = 0; + wordr0[3] = 0; + + u32 wordr1[4]; + + wordr1[0] = 0; + wordr1[1] = 0; + wordr1[2] = 0; + wordr1[3] = 0; + + u32 wordr2[4]; + + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + + u32 wordr3[4]; + + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + u32x w0[4]; + + w0[0] = wordl0[0] | wordr0[0]; + w0[1] = wordl0[1] | wordr0[1]; + w0[2] = 0; + w0[3] = 0; + + u32x w1[4]; + + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + u32x key[2]; + + transform_racf_key (w0[0], w0[1], key); + + const u32x c = key[0]; + const u32x d = key[1]; + + u32x Kc[16]; + u32x Kd[16]; + + _des_crypt_keysetup (c, d, Kc, Kd, s_skb); + + u32x data[2]; + + data[0] = salt_buf0[0]; + data[1] = salt_buf0[1]; + + u32x iv[2]; + + _des_crypt_encrypt (iv, data, Kc, Kd, s_SPtrans); + + const u32x r0 = iv[0]; + const u32x r1 = iv[1]; + const u32x r2 = 0; + const u32x r3 = 0; + + #include VECT_COMPARE_M + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m08500_m08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m08500_m16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m08500_s04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = 0; + wordl0[3] = 0; + + u32x wordl1[4]; + + wordl1[0] = 0; + wordl1[1] = 0; + wordl1[2] = 0; + wordl1[3] = 0; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, combs_buf[0].pw_len); + } + + /** + * salt + */ + + u32 salt_buf0[2]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf_pc[0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf_pc[1]; + + /** + * sbox, kbox + */ + + __local u32 s_SPtrans[8][64]; + + __local u32 s_skb[8][64]; + + s_SPtrans[0][lid] = c_SPtrans[0][lid]; + s_SPtrans[1][lid] = c_SPtrans[1][lid]; + s_SPtrans[2][lid] = c_SPtrans[2][lid]; + s_SPtrans[3][lid] = c_SPtrans[3][lid]; + s_SPtrans[4][lid] = c_SPtrans[4][lid]; + s_SPtrans[5][lid] = c_SPtrans[5][lid]; + s_SPtrans[6][lid] = c_SPtrans[6][lid]; + s_SPtrans[7][lid] = c_SPtrans[7][lid]; + + s_skb[0][lid] = c_skb[0][lid]; + s_skb[1][lid] = c_skb[1][lid]; + s_skb[2][lid] = c_skb[2][lid]; + s_skb[3][lid] = c_skb[3][lid]; + s_skb[4][lid] = c_skb[4][lid]; + s_skb[5][lid] = c_skb[5][lid]; + s_skb[6][lid] = c_skb[6][lid]; + s_skb[7][lid] = c_skb[7][lid]; + + barrier (CLK_LOCAL_MEM_FENCE); + + if (gid >= gid_max) return; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * main + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = combs_buf[il_pos].pw_len; + + u32 pw_len = pw_l_len + pw_r_len; + + pw_len = (pw_len >= 8) ? 8 : pw_len; + + u32 wordr0[4]; + + wordr0[0] = combs_buf[il_pos].i[0]; + wordr0[1] = combs_buf[il_pos].i[1]; + wordr0[2] = 0; + wordr0[3] = 0; + + u32 wordr1[4]; + + wordr1[0] = 0; + wordr1[1] = 0; + wordr1[2] = 0; + wordr1[3] = 0; + + u32 wordr2[4]; + + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + + u32 wordr3[4]; + + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + u32x w0[4]; + + w0[0] = wordl0[0] | wordr0[0]; + w0[1] = wordl0[1] | wordr0[1]; + w0[2] = 0; + w0[3] = 0; + + u32x w1[4]; + + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + u32x key[2]; + + transform_racf_key (w0[0], w0[1], key); + + const u32x c = key[0]; + const u32x d = key[1]; + + u32x Kc[16]; + u32x Kd[16]; + + _des_crypt_keysetup (c, d, Kc, Kd, s_skb); + + u32x data[2]; + + data[0] = salt_buf0[0]; + data[1] = salt_buf0[1]; + + u32x iv[2]; + + _des_crypt_encrypt (iv, data, Kc, Kd, s_SPtrans); + + const u32x r0 = iv[0]; + const u32x r1 = iv[1]; + const u32x r2 = 0; + const u32x r3 = 0; + + #include VECT_COMPARE_S + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m08500_s08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m08500_s16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/amd/m08500_a3.cl b/amd/m08500_a3.cl new file mode 100644 index 0000000000..d84a67a68c --- /dev/null +++ b/amd/m08500_a3.cl @@ -0,0 +1,1014 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _DES_ +#define _SCALAR_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW4 +#define VECT_SIZE2 +#endif + +#ifdef VLIW5 +#define VECT_SIZE2 +#endif + +#define DGST_R0 0 +#define DGST_R1 1 +#define DGST_R2 2 +#define DGST_R3 3 + +#include "include/kernel_functions.c" +#include "types_amd.c" +#include "common_amd.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4_warp.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4_warp.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4_warp.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4_warp.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4_warp.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4_warp.c" +#endif + +#define PERM_OP(a,b,tt,n,m) \ +{ \ + tt = a >> n; \ + tt = tt ^ b; \ + tt = tt & m; \ + b = b ^ tt; \ + tt = tt << n; \ + a = a ^ tt; \ +} + +#define HPERM_OP(a,tt,n,m) \ +{ \ + tt = a << (16 + n); \ + tt = tt ^ a; \ + tt = tt & m; \ + a = a ^ tt; \ + tt = tt >> (16 + n); \ + a = a ^ tt; \ +} + +#define IP(l,r,tt) \ +{ \ + PERM_OP (r, l, tt, 4, 0x0f0f0f0f); \ + PERM_OP (l, r, tt, 16, 0x0000ffff); \ + PERM_OP (r, l, tt, 2, 0x33333333); \ + PERM_OP (l, r, tt, 8, 0x00ff00ff); \ + PERM_OP (r, l, tt, 1, 0x55555555); \ +} + +#define FP(l,r,tt) \ +{ \ + PERM_OP (l, r, tt, 1, 0x55555555); \ + PERM_OP (r, l, tt, 8, 0x00ff00ff); \ + PERM_OP (l, r, tt, 2, 0x33333333); \ + PERM_OP (r, l, tt, 16, 0x0000ffff); \ + PERM_OP (l, r, tt, 4, 0x0f0f0f0f); \ +} + +__constant u8 ascii_to_ebcdic_pc[256] = +{ + // little hack, can't crack 0-bytes in password, but who cares + // 0xab, 0xa8, 0xae, 0xad, 0xc4, 0xf1, 0xf7, 0xf4, 0x86, 0xa1, 0xe0, 0xbc, 0xb3, 0xb0, 0xb6, 0xb5, + 0x2a, 0xa8, 0xae, 0xad, 0xc4, 0xf1, 0xf7, 0xf4, 0x86, 0xa1, 0xe0, 0xbc, 0xb3, 0xb0, 0xb6, 0xb5, + 0x8a, 0x89, 0x8f, 0x8c, 0xd3, 0xd0, 0xce, 0xe6, 0x9b, 0x98, 0xd5, 0xe5, 0x92, 0x91, 0x97, 0x94, + 0x2a, 0x34, 0x54, 0x5d, 0x1c, 0x73, 0x0b, 0x51, 0x31, 0x10, 0x13, 0x37, 0x7c, 0x6b, 0x3d, 0x68, + 0x4a, 0x49, 0x4f, 0x4c, 0x43, 0x40, 0x46, 0x45, 0x5b, 0x58, 0x5e, 0x16, 0x32, 0x57, 0x76, 0x75, + 0x52, 0x29, 0x2f, 0x2c, 0x23, 0x20, 0x26, 0x25, 0x3b, 0x38, 0x08, 0x0e, 0x0d, 0x02, 0x01, 0x07, + 0x04, 0x1a, 0x19, 0x6e, 0x6d, 0x62, 0x61, 0x67, 0x64, 0x7a, 0x79, 0x3e, 0x6b, 0x1f, 0x15, 0x70, + 0x58, 0xa8, 0xae, 0xad, 0xa2, 0xa1, 0xa7, 0xa4, 0xba, 0xb9, 0x89, 0x8f, 0x8c, 0x83, 0x80, 0x86, + 0x85, 0x9b, 0x98, 0xef, 0xec, 0xe3, 0xe0, 0xe6, 0xe5, 0xfb, 0xf8, 0x2a, 0x7f, 0x0b, 0xe9, 0xa4, + 0xea, 0xe9, 0xef, 0xec, 0xe3, 0x80, 0xa7, 0x85, 0xfb, 0xf8, 0xfe, 0xfd, 0xf2, 0xb9, 0xbf, 0x9d, + 0xcb, 0xc8, 0x9e, 0xcd, 0xc2, 0xc1, 0xc7, 0xba, 0xda, 0xd9, 0xdf, 0xdc, 0xa2, 0x83, 0xd6, 0x68, + 0x29, 0x2f, 0x2c, 0x23, 0x20, 0x26, 0x25, 0x3b, 0x38, 0x08, 0x0e, 0x0d, 0x02, 0x01, 0x07, 0x04, + 0x1a, 0x19, 0x6e, 0x6d, 0x62, 0x61, 0x67, 0x64, 0x7a, 0x79, 0x4a, 0x49, 0x4f, 0x4c, 0x43, 0x40, + 0x46, 0x45, 0x5b, 0xab, 0xbf, 0xbc, 0xb3, 0xb0, 0xb6, 0xb5, 0x8a, 0x9e, 0x9d, 0x92, 0x91, 0x97, + 0x94, 0xea, 0xfe, 0xfd, 0xf2, 0xf1, 0xf7, 0xf4, 0xcb, 0xc8, 0xce, 0xcd, 0xc2, 0xc1, 0xc7, 0xc4, + 0xda, 0xd9, 0xdf, 0xdc, 0xd3, 0xd0, 0xd6, 0xd5, 0x3e, 0x3d, 0x32, 0x31, 0x37, 0x34, 0x1f, 0x1c, + 0x13, 0x10, 0x16, 0x15, 0x7f, 0x7c, 0x73, 0x70, 0x76, 0x75, 0x5e, 0x5d, 0x52, 0x51, 0x57, 0x54, +}; + +__constant u32 c_SPtrans[8][64] = +{ + /* nibble 0 */ + 0x02080800, 0x00080000, 0x02000002, 0x02080802, + 0x02000000, 0x00080802, 0x00080002, 0x02000002, + 0x00080802, 0x02080800, 0x02080000, 0x00000802, + 0x02000802, 0x02000000, 0x00000000, 0x00080002, + 0x00080000, 0x00000002, 0x02000800, 0x00080800, + 0x02080802, 0x02080000, 0x00000802, 0x02000800, + 0x00000002, 0x00000800, 0x00080800, 0x02080002, + 0x00000800, 0x02000802, 0x02080002, 0x00000000, + 0x00000000, 0x02080802, 0x02000800, 0x00080002, + 0x02080800, 0x00080000, 0x00000802, 0x02000800, + 0x02080002, 0x00000800, 0x00080800, 0x02000002, + 0x00080802, 0x00000002, 0x02000002, 0x02080000, + 0x02080802, 0x00080800, 0x02080000, 0x02000802, + 0x02000000, 0x00000802, 0x00080002, 0x00000000, + 0x00080000, 0x02000000, 0x02000802, 0x02080800, + 0x00000002, 0x02080002, 0x00000800, 0x00080802, + /* nibble 1 */ + 0x40108010, 0x00000000, 0x00108000, 0x40100000, + 0x40000010, 0x00008010, 0x40008000, 0x00108000, + 0x00008000, 0x40100010, 0x00000010, 0x40008000, + 0x00100010, 0x40108000, 0x40100000, 0x00000010, + 0x00100000, 0x40008010, 0x40100010, 0x00008000, + 0x00108010, 0x40000000, 0x00000000, 0x00100010, + 0x40008010, 0x00108010, 0x40108000, 0x40000010, + 0x40000000, 0x00100000, 0x00008010, 0x40108010, + 0x00100010, 0x40108000, 0x40008000, 0x00108010, + 0x40108010, 0x00100010, 0x40000010, 0x00000000, + 0x40000000, 0x00008010, 0x00100000, 0x40100010, + 0x00008000, 0x40000000, 0x00108010, 0x40008010, + 0x40108000, 0x00008000, 0x00000000, 0x40000010, + 0x00000010, 0x40108010, 0x00108000, 0x40100000, + 0x40100010, 0x00100000, 0x00008010, 0x40008000, + 0x40008010, 0x00000010, 0x40100000, 0x00108000, + /* nibble 2 */ + 0x04000001, 0x04040100, 0x00000100, 0x04000101, + 0x00040001, 0x04000000, 0x04000101, 0x00040100, + 0x04000100, 0x00040000, 0x04040000, 0x00000001, + 0x04040101, 0x00000101, 0x00000001, 0x04040001, + 0x00000000, 0x00040001, 0x04040100, 0x00000100, + 0x00000101, 0x04040101, 0x00040000, 0x04000001, + 0x04040001, 0x04000100, 0x00040101, 0x04040000, + 0x00040100, 0x00000000, 0x04000000, 0x00040101, + 0x04040100, 0x00000100, 0x00000001, 0x00040000, + 0x00000101, 0x00040001, 0x04040000, 0x04000101, + 0x00000000, 0x04040100, 0x00040100, 0x04040001, + 0x00040001, 0x04000000, 0x04040101, 0x00000001, + 0x00040101, 0x04000001, 0x04000000, 0x04040101, + 0x00040000, 0x04000100, 0x04000101, 0x00040100, + 0x04000100, 0x00000000, 0x04040001, 0x00000101, + 0x04000001, 0x00040101, 0x00000100, 0x04040000, + /* nibble 3 */ + 0x00401008, 0x10001000, 0x00000008, 0x10401008, + 0x00000000, 0x10400000, 0x10001008, 0x00400008, + 0x10401000, 0x10000008, 0x10000000, 0x00001008, + 0x10000008, 0x00401008, 0x00400000, 0x10000000, + 0x10400008, 0x00401000, 0x00001000, 0x00000008, + 0x00401000, 0x10001008, 0x10400000, 0x00001000, + 0x00001008, 0x00000000, 0x00400008, 0x10401000, + 0x10001000, 0x10400008, 0x10401008, 0x00400000, + 0x10400008, 0x00001008, 0x00400000, 0x10000008, + 0x00401000, 0x10001000, 0x00000008, 0x10400000, + 0x10001008, 0x00000000, 0x00001000, 0x00400008, + 0x00000000, 0x10400008, 0x10401000, 0x00001000, + 0x10000000, 0x10401008, 0x00401008, 0x00400000, + 0x10401008, 0x00000008, 0x10001000, 0x00401008, + 0x00400008, 0x00401000, 0x10400000, 0x10001008, + 0x00001008, 0x10000000, 0x10000008, 0x10401000, + /* nibble 4 */ + 0x08000000, 0x00010000, 0x00000400, 0x08010420, + 0x08010020, 0x08000400, 0x00010420, 0x08010000, + 0x00010000, 0x00000020, 0x08000020, 0x00010400, + 0x08000420, 0x08010020, 0x08010400, 0x00000000, + 0x00010400, 0x08000000, 0x00010020, 0x00000420, + 0x08000400, 0x00010420, 0x00000000, 0x08000020, + 0x00000020, 0x08000420, 0x08010420, 0x00010020, + 0x08010000, 0x00000400, 0x00000420, 0x08010400, + 0x08010400, 0x08000420, 0x00010020, 0x08010000, + 0x00010000, 0x00000020, 0x08000020, 0x08000400, + 0x08000000, 0x00010400, 0x08010420, 0x00000000, + 0x00010420, 0x08000000, 0x00000400, 0x00010020, + 0x08000420, 0x00000400, 0x00000000, 0x08010420, + 0x08010020, 0x08010400, 0x00000420, 0x00010000, + 0x00010400, 0x08010020, 0x08000400, 0x00000420, + 0x00000020, 0x00010420, 0x08010000, 0x08000020, + /* nibble 5 */ + 0x80000040, 0x00200040, 0x00000000, 0x80202000, + 0x00200040, 0x00002000, 0x80002040, 0x00200000, + 0x00002040, 0x80202040, 0x00202000, 0x80000000, + 0x80002000, 0x80000040, 0x80200000, 0x00202040, + 0x00200000, 0x80002040, 0x80200040, 0x00000000, + 0x00002000, 0x00000040, 0x80202000, 0x80200040, + 0x80202040, 0x80200000, 0x80000000, 0x00002040, + 0x00000040, 0x00202000, 0x00202040, 0x80002000, + 0x00002040, 0x80000000, 0x80002000, 0x00202040, + 0x80202000, 0x00200040, 0x00000000, 0x80002000, + 0x80000000, 0x00002000, 0x80200040, 0x00200000, + 0x00200040, 0x80202040, 0x00202000, 0x00000040, + 0x80202040, 0x00202000, 0x00200000, 0x80002040, + 0x80000040, 0x80200000, 0x00202040, 0x00000000, + 0x00002000, 0x80000040, 0x80002040, 0x80202000, + 0x80200000, 0x00002040, 0x00000040, 0x80200040, + /* nibble 6 */ + 0x00004000, 0x00000200, 0x01000200, 0x01000004, + 0x01004204, 0x00004004, 0x00004200, 0x00000000, + 0x01000000, 0x01000204, 0x00000204, 0x01004000, + 0x00000004, 0x01004200, 0x01004000, 0x00000204, + 0x01000204, 0x00004000, 0x00004004, 0x01004204, + 0x00000000, 0x01000200, 0x01000004, 0x00004200, + 0x01004004, 0x00004204, 0x01004200, 0x00000004, + 0x00004204, 0x01004004, 0x00000200, 0x01000000, + 0x00004204, 0x01004000, 0x01004004, 0x00000204, + 0x00004000, 0x00000200, 0x01000000, 0x01004004, + 0x01000204, 0x00004204, 0x00004200, 0x00000000, + 0x00000200, 0x01000004, 0x00000004, 0x01000200, + 0x00000000, 0x01000204, 0x01000200, 0x00004200, + 0x00000204, 0x00004000, 0x01004204, 0x01000000, + 0x01004200, 0x00000004, 0x00004004, 0x01004204, + 0x01000004, 0x01004200, 0x01004000, 0x00004004, + /* nibble 7 */ + 0x20800080, 0x20820000, 0x00020080, 0x00000000, + 0x20020000, 0x00800080, 0x20800000, 0x20820080, + 0x00000080, 0x20000000, 0x00820000, 0x00020080, + 0x00820080, 0x20020080, 0x20000080, 0x20800000, + 0x00020000, 0x00820080, 0x00800080, 0x20020000, + 0x20820080, 0x20000080, 0x00000000, 0x00820000, + 0x20000000, 0x00800000, 0x20020080, 0x20800080, + 0x00800000, 0x00020000, 0x20820000, 0x00000080, + 0x00800000, 0x00020000, 0x20000080, 0x20820080, + 0x00020080, 0x20000000, 0x00000000, 0x00820000, + 0x20800080, 0x20020080, 0x20020000, 0x00800080, + 0x20820000, 0x00000080, 0x00800080, 0x20020000, + 0x20820080, 0x00800000, 0x20800000, 0x20000080, + 0x00820000, 0x00020080, 0x20020080, 0x20800000, + 0x00000080, 0x20820000, 0x00820080, 0x00000000, + 0x20000000, 0x20800080, 0x00020000, 0x00820080, +}; + +__constant u32 c_skb[8][64] = +{ + /* for C bits (numbered as per FIPS 46) 1 2 3 4 5 6 */ + 0x00000000, 0x00000010, 0x20000000, 0x20000010, + 0x00010000, 0x00010010, 0x20010000, 0x20010010, + 0x00000800, 0x00000810, 0x20000800, 0x20000810, + 0x00010800, 0x00010810, 0x20010800, 0x20010810, + 0x00000020, 0x00000030, 0x20000020, 0x20000030, + 0x00010020, 0x00010030, 0x20010020, 0x20010030, + 0x00000820, 0x00000830, 0x20000820, 0x20000830, + 0x00010820, 0x00010830, 0x20010820, 0x20010830, + 0x00080000, 0x00080010, 0x20080000, 0x20080010, + 0x00090000, 0x00090010, 0x20090000, 0x20090010, + 0x00080800, 0x00080810, 0x20080800, 0x20080810, + 0x00090800, 0x00090810, 0x20090800, 0x20090810, + 0x00080020, 0x00080030, 0x20080020, 0x20080030, + 0x00090020, 0x00090030, 0x20090020, 0x20090030, + 0x00080820, 0x00080830, 0x20080820, 0x20080830, + 0x00090820, 0x00090830, 0x20090820, 0x20090830, + /* for C bits (numbered as per FIPS 46) 7 8 10 11 12 13 */ + 0x00000000, 0x02000000, 0x00002000, 0x02002000, + 0x00200000, 0x02200000, 0x00202000, 0x02202000, + 0x00000004, 0x02000004, 0x00002004, 0x02002004, + 0x00200004, 0x02200004, 0x00202004, 0x02202004, + 0x00000400, 0x02000400, 0x00002400, 0x02002400, + 0x00200400, 0x02200400, 0x00202400, 0x02202400, + 0x00000404, 0x02000404, 0x00002404, 0x02002404, + 0x00200404, 0x02200404, 0x00202404, 0x02202404, + 0x10000000, 0x12000000, 0x10002000, 0x12002000, + 0x10200000, 0x12200000, 0x10202000, 0x12202000, + 0x10000004, 0x12000004, 0x10002004, 0x12002004, + 0x10200004, 0x12200004, 0x10202004, 0x12202004, + 0x10000400, 0x12000400, 0x10002400, 0x12002400, + 0x10200400, 0x12200400, 0x10202400, 0x12202400, + 0x10000404, 0x12000404, 0x10002404, 0x12002404, + 0x10200404, 0x12200404, 0x10202404, 0x12202404, + /* for C bits (numbered as per FIPS 46) 14 15 16 17 19 20 */ + 0x00000000, 0x00000001, 0x00040000, 0x00040001, + 0x01000000, 0x01000001, 0x01040000, 0x01040001, + 0x00000002, 0x00000003, 0x00040002, 0x00040003, + 0x01000002, 0x01000003, 0x01040002, 0x01040003, + 0x00000200, 0x00000201, 0x00040200, 0x00040201, + 0x01000200, 0x01000201, 0x01040200, 0x01040201, + 0x00000202, 0x00000203, 0x00040202, 0x00040203, + 0x01000202, 0x01000203, 0x01040202, 0x01040203, + 0x08000000, 0x08000001, 0x08040000, 0x08040001, + 0x09000000, 0x09000001, 0x09040000, 0x09040001, + 0x08000002, 0x08000003, 0x08040002, 0x08040003, + 0x09000002, 0x09000003, 0x09040002, 0x09040003, + 0x08000200, 0x08000201, 0x08040200, 0x08040201, + 0x09000200, 0x09000201, 0x09040200, 0x09040201, + 0x08000202, 0x08000203, 0x08040202, 0x08040203, + 0x09000202, 0x09000203, 0x09040202, 0x09040203, + /* for C bits (numbered as per FIPS 46) 21 23 24 26 27 28 */ + 0x00000000, 0x00100000, 0x00000100, 0x00100100, + 0x00000008, 0x00100008, 0x00000108, 0x00100108, + 0x00001000, 0x00101000, 0x00001100, 0x00101100, + 0x00001008, 0x00101008, 0x00001108, 0x00101108, + 0x04000000, 0x04100000, 0x04000100, 0x04100100, + 0x04000008, 0x04100008, 0x04000108, 0x04100108, + 0x04001000, 0x04101000, 0x04001100, 0x04101100, + 0x04001008, 0x04101008, 0x04001108, 0x04101108, + 0x00020000, 0x00120000, 0x00020100, 0x00120100, + 0x00020008, 0x00120008, 0x00020108, 0x00120108, + 0x00021000, 0x00121000, 0x00021100, 0x00121100, + 0x00021008, 0x00121008, 0x00021108, 0x00121108, + 0x04020000, 0x04120000, 0x04020100, 0x04120100, + 0x04020008, 0x04120008, 0x04020108, 0x04120108, + 0x04021000, 0x04121000, 0x04021100, 0x04121100, + 0x04021008, 0x04121008, 0x04021108, 0x04121108, + /* for D bits (numbered as per FIPS 46) 1 2 3 4 5 6 */ + 0x00000000, 0x10000000, 0x00010000, 0x10010000, + 0x00000004, 0x10000004, 0x00010004, 0x10010004, + 0x20000000, 0x30000000, 0x20010000, 0x30010000, + 0x20000004, 0x30000004, 0x20010004, 0x30010004, + 0x00100000, 0x10100000, 0x00110000, 0x10110000, + 0x00100004, 0x10100004, 0x00110004, 0x10110004, + 0x20100000, 0x30100000, 0x20110000, 0x30110000, + 0x20100004, 0x30100004, 0x20110004, 0x30110004, + 0x00001000, 0x10001000, 0x00011000, 0x10011000, + 0x00001004, 0x10001004, 0x00011004, 0x10011004, + 0x20001000, 0x30001000, 0x20011000, 0x30011000, + 0x20001004, 0x30001004, 0x20011004, 0x30011004, + 0x00101000, 0x10101000, 0x00111000, 0x10111000, + 0x00101004, 0x10101004, 0x00111004, 0x10111004, + 0x20101000, 0x30101000, 0x20111000, 0x30111000, + 0x20101004, 0x30101004, 0x20111004, 0x30111004, + /* for D bits (numbered as per FIPS 46) 8 9 11 12 13 14 */ + 0x00000000, 0x08000000, 0x00000008, 0x08000008, + 0x00000400, 0x08000400, 0x00000408, 0x08000408, + 0x00020000, 0x08020000, 0x00020008, 0x08020008, + 0x00020400, 0x08020400, 0x00020408, 0x08020408, + 0x00000001, 0x08000001, 0x00000009, 0x08000009, + 0x00000401, 0x08000401, 0x00000409, 0x08000409, + 0x00020001, 0x08020001, 0x00020009, 0x08020009, + 0x00020401, 0x08020401, 0x00020409, 0x08020409, + 0x02000000, 0x0A000000, 0x02000008, 0x0A000008, + 0x02000400, 0x0A000400, 0x02000408, 0x0A000408, + 0x02020000, 0x0A020000, 0x02020008, 0x0A020008, + 0x02020400, 0x0A020400, 0x02020408, 0x0A020408, + 0x02000001, 0x0A000001, 0x02000009, 0x0A000009, + 0x02000401, 0x0A000401, 0x02000409, 0x0A000409, + 0x02020001, 0x0A020001, 0x02020009, 0x0A020009, + 0x02020401, 0x0A020401, 0x02020409, 0x0A020409, + /* for D bits (numbered as per FIPS 46) 16 17 18 19 20 21 */ + 0x00000000, 0x00000100, 0x00080000, 0x00080100, + 0x01000000, 0x01000100, 0x01080000, 0x01080100, + 0x00000010, 0x00000110, 0x00080010, 0x00080110, + 0x01000010, 0x01000110, 0x01080010, 0x01080110, + 0x00200000, 0x00200100, 0x00280000, 0x00280100, + 0x01200000, 0x01200100, 0x01280000, 0x01280100, + 0x00200010, 0x00200110, 0x00280010, 0x00280110, + 0x01200010, 0x01200110, 0x01280010, 0x01280110, + 0x00000200, 0x00000300, 0x00080200, 0x00080300, + 0x01000200, 0x01000300, 0x01080200, 0x01080300, + 0x00000210, 0x00000310, 0x00080210, 0x00080310, + 0x01000210, 0x01000310, 0x01080210, 0x01080310, + 0x00200200, 0x00200300, 0x00280200, 0x00280300, + 0x01200200, 0x01200300, 0x01280200, 0x01280300, + 0x00200210, 0x00200310, 0x00280210, 0x00280310, + 0x01200210, 0x01200310, 0x01280210, 0x01280310, + /* for D bits (numbered as per FIPS 46) 22 23 24 25 27 28 */ + 0x00000000, 0x04000000, 0x00040000, 0x04040000, + 0x00000002, 0x04000002, 0x00040002, 0x04040002, + 0x00002000, 0x04002000, 0x00042000, 0x04042000, + 0x00002002, 0x04002002, 0x00042002, 0x04042002, + 0x00000020, 0x04000020, 0x00040020, 0x04040020, + 0x00000022, 0x04000022, 0x00040022, 0x04040022, + 0x00002020, 0x04002020, 0x00042020, 0x04042020, + 0x00002022, 0x04002022, 0x00042022, 0x04042022, + 0x00000800, 0x04000800, 0x00040800, 0x04040800, + 0x00000802, 0x04000802, 0x00040802, 0x04040802, + 0x00002800, 0x04002800, 0x00042800, 0x04042800, + 0x00002802, 0x04002802, 0x00042802, 0x04042802, + 0x00000820, 0x04000820, 0x00040820, 0x04040820, + 0x00000822, 0x04000822, 0x00040822, 0x04040822, + 0x00002820, 0x04002820, 0x00042820, 0x04042820, + 0x00002822, 0x04002822, 0x00042822, 0x04042822, +}; + +#define NBOX(i,n,S) (S)[(n)][(i)] + +static void _des_crypt_encrypt (u32x iv[2], u32x data[2], u32x Kc[16], u32x Kd[16], __local u32 s_SPtrans[8][64]) +{ + u32x tt; + + u32x r = data[0]; + u32x l = data[1]; + + #pragma unroll 16 + for (u32 i = 0; i < 16; i++) + { + u32x u = Kc[i] ^ r; + u32x t = Kd[i] ^ rotl32 (r, 28u); + + #ifdef VECT_SIZE1 + l ^= NBOX (((u >> 2) & 0x3f), 0, s_SPtrans) + | NBOX (((u >> 10) & 0x3f), 2, s_SPtrans) + | NBOX (((u >> 18) & 0x3f), 4, s_SPtrans) + | NBOX (((u >> 26) & 0x3f), 6, s_SPtrans) + | NBOX (((t >> 2) & 0x3f), 1, s_SPtrans) + | NBOX (((t >> 10) & 0x3f), 3, s_SPtrans) + | NBOX (((t >> 18) & 0x3f), 5, s_SPtrans) + | NBOX (((t >> 26) & 0x3f), 7, s_SPtrans); + #endif + + #ifdef VECT_SIZE2 + l.s0 ^= NBOX (((u.s0 >> 2) & 0x3f), 0, s_SPtrans) + | NBOX (((u.s0 >> 10) & 0x3f), 2, s_SPtrans) + | NBOX (((u.s0 >> 18) & 0x3f), 4, s_SPtrans) + | NBOX (((u.s0 >> 26) & 0x3f), 6, s_SPtrans) + | NBOX (((t.s0 >> 2) & 0x3f), 1, s_SPtrans) + | NBOX (((t.s0 >> 10) & 0x3f), 3, s_SPtrans) + | NBOX (((t.s0 >> 18) & 0x3f), 5, s_SPtrans) + | NBOX (((t.s0 >> 26) & 0x3f), 7, s_SPtrans); + + l.s1 ^= NBOX (((u.s1 >> 2) & 0x3f), 0, s_SPtrans) + | NBOX (((u.s1 >> 10) & 0x3f), 2, s_SPtrans) + | NBOX (((u.s1 >> 18) & 0x3f), 4, s_SPtrans) + | NBOX (((u.s1 >> 26) & 0x3f), 6, s_SPtrans) + | NBOX (((t.s1 >> 2) & 0x3f), 1, s_SPtrans) + | NBOX (((t.s1 >> 10) & 0x3f), 3, s_SPtrans) + | NBOX (((t.s1 >> 18) & 0x3f), 5, s_SPtrans) + | NBOX (((t.s1 >> 26) & 0x3f), 7, s_SPtrans); + #endif + + #ifdef VECT_SIZE4 + l.s0 ^= NBOX (((u.s0 >> 2) & 0x3f), 0, s_SPtrans) + | NBOX (((u.s0 >> 10) & 0x3f), 2, s_SPtrans) + | NBOX (((u.s0 >> 18) & 0x3f), 4, s_SPtrans) + | NBOX (((u.s0 >> 26) & 0x3f), 6, s_SPtrans) + | NBOX (((t.s0 >> 2) & 0x3f), 1, s_SPtrans) + | NBOX (((t.s0 >> 10) & 0x3f), 3, s_SPtrans) + | NBOX (((t.s0 >> 18) & 0x3f), 5, s_SPtrans) + | NBOX (((t.s0 >> 26) & 0x3f), 7, s_SPtrans); + + l.s1 ^= NBOX (((u.s1 >> 2) & 0x3f), 0, s_SPtrans) + | NBOX (((u.s1 >> 10) & 0x3f), 2, s_SPtrans) + | NBOX (((u.s1 >> 18) & 0x3f), 4, s_SPtrans) + | NBOX (((u.s1 >> 26) & 0x3f), 6, s_SPtrans) + | NBOX (((t.s1 >> 2) & 0x3f), 1, s_SPtrans) + | NBOX (((t.s1 >> 10) & 0x3f), 3, s_SPtrans) + | NBOX (((t.s1 >> 18) & 0x3f), 5, s_SPtrans) + | NBOX (((t.s1 >> 26) & 0x3f), 7, s_SPtrans); + + l.s2 ^= NBOX (((u.s2 >> 2) & 0x3f), 0, s_SPtrans) + | NBOX (((u.s2 >> 10) & 0x3f), 2, s_SPtrans) + | NBOX (((u.s2 >> 18) & 0x3f), 4, s_SPtrans) + | NBOX (((u.s2 >> 26) & 0x3f), 6, s_SPtrans) + | NBOX (((t.s2 >> 2) & 0x3f), 1, s_SPtrans) + | NBOX (((t.s2 >> 10) & 0x3f), 3, s_SPtrans) + | NBOX (((t.s2 >> 18) & 0x3f), 5, s_SPtrans) + | NBOX (((t.s2 >> 26) & 0x3f), 7, s_SPtrans); + + l.s3 ^= NBOX (((u.s3 >> 2) & 0x3f), 0, s_SPtrans) + | NBOX (((u.s3 >> 10) & 0x3f), 2, s_SPtrans) + | NBOX (((u.s3 >> 18) & 0x3f), 4, s_SPtrans) + | NBOX (((u.s3 >> 26) & 0x3f), 6, s_SPtrans) + | NBOX (((t.s3 >> 2) & 0x3f), 1, s_SPtrans) + | NBOX (((t.s3 >> 10) & 0x3f), 3, s_SPtrans) + | NBOX (((t.s3 >> 18) & 0x3f), 5, s_SPtrans) + | NBOX (((t.s3 >> 26) & 0x3f), 7, s_SPtrans); + #endif + + tt = l; + l = r; + r = tt; + } + + iv[0] = l; + iv[1] = r; +} + +static void _des_crypt_keysetup (u32x c, u32x d, u32x Kc[16], u32x Kd[16], __local u32 s_skb[8][64]) +{ + u32x tt; + + PERM_OP (d, c, tt, 4, 0x0f0f0f0f); + HPERM_OP (c, tt, 2, 0xcccc0000); + HPERM_OP (d, tt, 2, 0xcccc0000); + PERM_OP (d, c, tt, 1, 0x55555555); + PERM_OP (c, d, tt, 8, 0x00ff00ff); + PERM_OP (d, c, tt, 1, 0x55555555); + + d = ((d & 0x000000ff) << 16) + | ((d & 0x0000ff00) << 0) + | ((d & 0x00ff0000) >> 16) + | ((c & 0xf0000000) >> 4); + + c = c & 0x0fffffff; + + #pragma unroll 16 + for (u32 i = 0; i < 16; i++) + { + const u32 shifts3s0[16] = { 1, 1, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 1 }; + const u32 shifts3s1[16] = { 27, 27, 26, 26, 26, 26, 26, 26, 27, 26, 26, 26, 26, 26, 26, 27 }; + + c = c >> shifts3s0[i] | c << shifts3s1[i]; + d = d >> shifts3s0[i] | d << shifts3s1[i]; + + c = c & 0x0fffffff; + d = d & 0x0fffffff; + + u32x s; + u32x t; + + #ifdef VECT_SIZE1 + s = NBOX ((( c >> 0) & 0x3f), 0, s_skb) + | NBOX ((((c >> 6) & 0x03) + | ((c >> 7) & 0x3c)), 1, s_skb) + | NBOX ((((c >> 13) & 0x0f) + | ((c >> 14) & 0x30)), 2, s_skb) + | NBOX ((((c >> 20) & 0x01) + | ((c >> 21) & 0x06) + | ((c >> 22) & 0x38)), 3, s_skb); + + t = NBOX ((( d >> 0) & 0x3f), 4, s_skb) + | NBOX ((((d >> 7) & 0x03) + | ((d >> 8) & 0x3c)), 5, s_skb) + | NBOX ((((d >> 15) & 0x3f)), 6, s_skb) + | NBOX ((((d >> 21) & 0x0f) + | ((d >> 22) & 0x30)), 7, s_skb); + #endif + + #ifdef VECT_SIZE2 + s.s0 = NBOX ((( c.s0 >> 0) & 0x3f), 0, s_skb) + | NBOX ((((c.s0 >> 6) & 0x03) + | ((c.s0 >> 7) & 0x3c)), 1, s_skb) + | NBOX ((((c.s0 >> 13) & 0x0f) + | ((c.s0 >> 14) & 0x30)), 2, s_skb) + | NBOX ((((c.s0 >> 20) & 0x01) + | ((c.s0 >> 21) & 0x06) + | ((c.s0 >> 22) & 0x38)), 3, s_skb); + + t.s0 = NBOX ((( d.s0 >> 0) & 0x3f), 4, s_skb) + | NBOX ((((d.s0 >> 7) & 0x03) + | ((d.s0 >> 8) & 0x3c)), 5, s_skb) + | NBOX ((((d.s0 >> 15) & 0x3f)), 6, s_skb) + | NBOX ((((d.s0 >> 21) & 0x0f) + | ((d.s0 >> 22) & 0x30)), 7, s_skb); + + s.s1 = NBOX ((( c.s1 >> 0) & 0x3f), 0, s_skb) + | NBOX ((((c.s1 >> 6) & 0x03) + | ((c.s1 >> 7) & 0x3c)), 1, s_skb) + | NBOX ((((c.s1 >> 13) & 0x0f) + | ((c.s1 >> 14) & 0x30)), 2, s_skb) + | NBOX ((((c.s1 >> 20) & 0x01) + | ((c.s1 >> 21) & 0x06) + | ((c.s1 >> 22) & 0x38)), 3, s_skb); + + t.s1 = NBOX ((( d.s1 >> 0) & 0x3f), 4, s_skb) + | NBOX ((((d.s1 >> 7) & 0x03) + | ((d.s1 >> 8) & 0x3c)), 5, s_skb) + | NBOX ((((d.s1 >> 15) & 0x3f)), 6, s_skb) + | NBOX ((((d.s1 >> 21) & 0x0f) + | ((d.s1 >> 22) & 0x30)), 7, s_skb); + #endif + + #ifdef VECT_SIZE4 + s.s0 = NBOX ((( c.s0 >> 0) & 0x3f), 0, s_skb) + | NBOX ((((c.s0 >> 6) & 0x03) + | ((c.s0 >> 7) & 0x3c)), 1, s_skb) + | NBOX ((((c.s0 >> 13) & 0x0f) + | ((c.s0 >> 14) & 0x30)), 2, s_skb) + | NBOX ((((c.s0 >> 20) & 0x01) + | ((c.s0 >> 21) & 0x06) + | ((c.s0 >> 22) & 0x38)), 3, s_skb); + + t.s0 = NBOX ((( d.s0 >> 0) & 0x3f), 4, s_skb) + | NBOX ((((d.s0 >> 7) & 0x03) + | ((d.s0 >> 8) & 0x3c)), 5, s_skb) + | NBOX ((((d.s0 >> 15) & 0x3f)), 6, s_skb) + | NBOX ((((d.s0 >> 21) & 0x0f) + | ((d.s0 >> 22) & 0x30)), 7, s_skb); + + s.s1 = NBOX ((( c.s1 >> 0) & 0x3f), 0, s_skb) + | NBOX ((((c.s1 >> 6) & 0x03) + | ((c.s1 >> 7) & 0x3c)), 1, s_skb) + | NBOX ((((c.s1 >> 13) & 0x0f) + | ((c.s1 >> 14) & 0x30)), 2, s_skb) + | NBOX ((((c.s1 >> 20) & 0x01) + | ((c.s1 >> 21) & 0x06) + | ((c.s1 >> 22) & 0x38)), 3, s_skb); + + t.s1 = NBOX ((( d.s1 >> 0) & 0x3f), 4, s_skb) + | NBOX ((((d.s1 >> 7) & 0x03) + | ((d.s1 >> 8) & 0x3c)), 5, s_skb) + | NBOX ((((d.s1 >> 15) & 0x3f)), 6, s_skb) + | NBOX ((((d.s1 >> 21) & 0x0f) + | ((d.s1 >> 22) & 0x30)), 7, s_skb); + + s.s2 = NBOX ((( c.s2 >> 0) & 0x3f), 0, s_skb) + | NBOX ((((c.s2 >> 6) & 0x03) + | ((c.s2 >> 7) & 0x3c)), 1, s_skb) + | NBOX ((((c.s2 >> 13) & 0x0f) + | ((c.s2 >> 14) & 0x30)), 2, s_skb) + | NBOX ((((c.s2 >> 20) & 0x01) + | ((c.s2 >> 21) & 0x06) + | ((c.s2 >> 22) & 0x38)), 3, s_skb); + + t.s2 = NBOX ((( d.s2 >> 0) & 0x3f), 4, s_skb) + | NBOX ((((d.s2 >> 7) & 0x03) + | ((d.s2 >> 8) & 0x3c)), 5, s_skb) + | NBOX ((((d.s2 >> 15) & 0x3f)), 6, s_skb) + | NBOX ((((d.s2 >> 21) & 0x0f) + | ((d.s2 >> 22) & 0x30)), 7, s_skb); + + s.s3 = NBOX ((( c.s3 >> 0) & 0x3f), 0, s_skb) + | NBOX ((((c.s3 >> 6) & 0x03) + | ((c.s3 >> 7) & 0x3c)), 1, s_skb) + | NBOX ((((c.s3 >> 13) & 0x0f) + | ((c.s3 >> 14) & 0x30)), 2, s_skb) + | NBOX ((((c.s3 >> 20) & 0x01) + | ((c.s3 >> 21) & 0x06) + | ((c.s3 >> 22) & 0x38)), 3, s_skb); + + t.s3 = NBOX ((( d.s3 >> 0) & 0x3f), 4, s_skb) + | NBOX ((((d.s3 >> 7) & 0x03) + | ((d.s3 >> 8) & 0x3c)), 5, s_skb) + | NBOX ((((d.s3 >> 15) & 0x3f)), 6, s_skb) + | NBOX ((((d.s3 >> 21) & 0x0f) + | ((d.s3 >> 22) & 0x30)), 7, s_skb); + #endif + + #if defined cl_amd_media_ops + Kc[i] = amd_bytealign (t, s << 16, 2); + Kd[i] = amd_bytealign (t >> 16, s, 2); + #else + Kc[i] = ((t << 16) | (s & 0x0000ffff)); + Kd[i] = ((s >> 16) | (t & 0xffff0000)); + #endif + + Kc[i] = rotl32 (Kc[i], 2u); + Kd[i] = rotl32 (Kd[i], 2u); + } +} + +static void transform_racf_key (const u32x w0, const u32x w1, u32x key[2]) +{ + #ifdef VECT_SIZE1 + + key[0] = (ascii_to_ebcdic_pc[(w0 >> 0) & 0xff]) << 0 + | (ascii_to_ebcdic_pc[(w0 >> 8) & 0xff]) << 8 + | (ascii_to_ebcdic_pc[(w0 >> 16) & 0xff]) << 16 + | (ascii_to_ebcdic_pc[(w0 >> 24) & 0xff]) << 24; + + key[1] = (ascii_to_ebcdic_pc[(w1 >> 0) & 0xff]) << 0 + | (ascii_to_ebcdic_pc[(w1 >> 8) & 0xff]) << 8 + | (ascii_to_ebcdic_pc[(w1 >> 16) & 0xff]) << 16 + | (ascii_to_ebcdic_pc[(w1 >> 24) & 0xff]) << 24; + #endif + + #ifdef VECT_SIZE2 + + key[0].s0 = (ascii_to_ebcdic_pc[(w0.s0 >> 0) & 0xff]) << 0 + | (ascii_to_ebcdic_pc[(w0.s0 >> 8) & 0xff]) << 8 + | (ascii_to_ebcdic_pc[(w0.s0 >> 16) & 0xff]) << 16 + | (ascii_to_ebcdic_pc[(w0.s0 >> 24) & 0xff]) << 24; + + key[0].s1 = (ascii_to_ebcdic_pc[(w0.s1 >> 0) & 0xff]) << 0 + | (ascii_to_ebcdic_pc[(w0.s1 >> 8) & 0xff]) << 8 + | (ascii_to_ebcdic_pc[(w0.s1 >> 16) & 0xff]) << 16 + | (ascii_to_ebcdic_pc[(w0.s1 >> 24) & 0xff]) << 24; + + key[1].s0 = (ascii_to_ebcdic_pc[(w1.s0 >> 0) & 0xff]) << 0 + | (ascii_to_ebcdic_pc[(w1.s0 >> 8) & 0xff]) << 8 + | (ascii_to_ebcdic_pc[(w1.s0 >> 16) & 0xff]) << 16 + | (ascii_to_ebcdic_pc[(w1.s0 >> 24) & 0xff]) << 24; + + key[1].s1 = (ascii_to_ebcdic_pc[(w1.s1 >> 0) & 0xff]) << 0 + | (ascii_to_ebcdic_pc[(w1.s1 >> 8) & 0xff]) << 8 + | (ascii_to_ebcdic_pc[(w1.s1 >> 16) & 0xff]) << 16 + | (ascii_to_ebcdic_pc[(w1.s1 >> 24) & 0xff]) << 24; + #endif + + #ifdef VECT_SIZE4 + key[0].s0 = (ascii_to_ebcdic_pc[(w0.s0 >> 0) & 0xff]) << 0 + | (ascii_to_ebcdic_pc[(w0.s0 >> 8) & 0xff]) << 8 + | (ascii_to_ebcdic_pc[(w0.s0 >> 16) & 0xff]) << 16 + | (ascii_to_ebcdic_pc[(w0.s0 >> 24) & 0xff]) << 24; + + key[0].s1 = (ascii_to_ebcdic_pc[(w0.s1 >> 0) & 0xff]) << 0 + | (ascii_to_ebcdic_pc[(w0.s1 >> 8) & 0xff]) << 8 + | (ascii_to_ebcdic_pc[(w0.s1 >> 16) & 0xff]) << 16 + | (ascii_to_ebcdic_pc[(w0.s1 >> 24) & 0xff]) << 24; + + key[0].s2 = (ascii_to_ebcdic_pc[(w0.s2 >> 0) & 0xff]) << 0 + | (ascii_to_ebcdic_pc[(w0.s2 >> 8) & 0xff]) << 8 + | (ascii_to_ebcdic_pc[(w0.s2 >> 16) & 0xff]) << 16 + | (ascii_to_ebcdic_pc[(w0.s2 >> 24) & 0xff]) << 24; + + key[0].s3 = (ascii_to_ebcdic_pc[(w0.s3 >> 0) & 0xff]) << 0 + | (ascii_to_ebcdic_pc[(w0.s3 >> 8) & 0xff]) << 8 + | (ascii_to_ebcdic_pc[(w0.s3 >> 16) & 0xff]) << 16 + | (ascii_to_ebcdic_pc[(w0.s3 >> 24) & 0xff]) << 24; + + key[1].s0 = (ascii_to_ebcdic_pc[(w1.s0 >> 0) & 0xff]) << 0 + | (ascii_to_ebcdic_pc[(w1.s0 >> 8) & 0xff]) << 8 + | (ascii_to_ebcdic_pc[(w1.s0 >> 16) & 0xff]) << 16 + | (ascii_to_ebcdic_pc[(w1.s0 >> 24) & 0xff]) << 24; + + key[1].s1 = (ascii_to_ebcdic_pc[(w1.s1 >> 0) & 0xff]) << 0 + | (ascii_to_ebcdic_pc[(w1.s1 >> 8) & 0xff]) << 8 + | (ascii_to_ebcdic_pc[(w1.s1 >> 16) & 0xff]) << 16 + | (ascii_to_ebcdic_pc[(w1.s1 >> 24) & 0xff]) << 24; + + key[1].s2 = (ascii_to_ebcdic_pc[(w1.s2 >> 0) & 0xff]) << 0 + | (ascii_to_ebcdic_pc[(w1.s2 >> 8) & 0xff]) << 8 + | (ascii_to_ebcdic_pc[(w1.s2 >> 16) & 0xff]) << 16 + | (ascii_to_ebcdic_pc[(w1.s2 >> 24) & 0xff]) << 24; + + key[1].s3 = (ascii_to_ebcdic_pc[(w1.s3 >> 0) & 0xff]) << 0 + | (ascii_to_ebcdic_pc[(w1.s3 >> 8) & 0xff]) << 8 + | (ascii_to_ebcdic_pc[(w1.s3 >> 16) & 0xff]) << 16 + | (ascii_to_ebcdic_pc[(w1.s3 >> 24) & 0xff]) << 24; + #endif +} + +static void m08500m (__local u32 s_SPtrans[8][64], __local u32 s_skb[8][64], u32 w[16], const u32 pw_len, __global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global u32x * words_buf_r, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset) +{ + /** + * modifier + */ + + const u32 gid = get_global_id (0); + const u32 lid = get_local_id (0); + + /** + * salt + */ + + u32 salt_buf0[2]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf_pc[0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf_pc[1]; + + /** + * loop + */ + + const u32 bf_loops = ceil ((float) bfs_cnt / VECT_DIV); + + u32x w0l = w[0]; + + u32x w1 = w[1]; + + for (u32 il_pos = 0; il_pos < bf_loops; il_pos++) + { + const u32x w0r = words_buf_r[il_pos]; + + const u32x w0 = w0l | w0r; + + u32x key[2]; + + transform_racf_key (w0, w1, key); + + const u32x c = key[0]; + const u32x d = key[1]; + + u32x Kc[16]; + u32x Kd[16]; + + _des_crypt_keysetup (c, d, Kc, Kd, s_skb); + + u32x data[2]; + + data[0] = salt_buf0[0]; + data[1] = salt_buf0[1]; + + u32x iv[2]; + + _des_crypt_encrypt (iv, data, Kc, Kd, s_SPtrans); + + const u32x r0 = iv[0]; + const u32x r1 = iv[1]; + const u32x r2 = 0; + const u32x r3 = 0; + + #include VECT_COMPARE_M + } +} + +static void m08500s (__local u32 s_SPtrans[8][64], __local u32 s_skb[8][64], u32 w[16], const u32 pw_len, __global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global u32x * words_buf_r, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset) +{ + /** + * modifier + */ + + const u32 gid = get_global_id (0); + const u32 lid = get_local_id (0); + + /** + * salt + */ + + u32 salt_buf0[2]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf_pc[0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf_pc[1]; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * loop + */ + + const u32 bf_loops = ceil ((float) bfs_cnt / VECT_DIV); + + u32x w0l = w[0]; + + u32x w1 = w[1]; + + for (u32 il_pos = 0; il_pos < bf_loops; il_pos++) + { + const u32x w0r = words_buf_r[il_pos]; + + const u32x w0 = w0l | w0r; + + u32x key[2]; + + transform_racf_key (w0, w1, key); + + const u32x c = key[0]; + const u32x d = key[1]; + + u32x Kc[16]; + u32x Kd[16]; + + _des_crypt_keysetup (c, d, Kc, Kd, s_skb); + + u32x data[2]; + + data[0] = salt_buf0[0]; + data[1] = salt_buf0[1]; + + u32x iv[2]; + + _des_crypt_encrypt (iv, data, Kc, Kd, s_SPtrans); + + const u32x r0 = iv[0]; + const u32x r1 = iv[1]; + const u32x r2 = 0; + const u32x r3 = 0; + + #include VECT_COMPARE_S + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m08500_m04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global u32x * words_buf_r, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + __local u32 s_SPtrans[8][64]; + + __local u32 s_skb[8][64]; + + /** + * base + */ + + const u32 gid = get_global_id (0); + const u32 lid = get_local_id (0); + + u32 w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = 0; + w[ 3] = 0; + w[ 4] = 0; + w[ 5] = 0; + w[ 6] = 0; + w[ 7] = 0; + w[ 8] = 0; + w[ 9] = 0; + w[10] = 0; + w[11] = 0; + w[12] = 0; + w[13] = 0; + w[14] = 0; + w[15] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * sbox, kbox + */ + + s_SPtrans[0][lid] = c_SPtrans[0][lid]; + s_SPtrans[1][lid] = c_SPtrans[1][lid]; + s_SPtrans[2][lid] = c_SPtrans[2][lid]; + s_SPtrans[3][lid] = c_SPtrans[3][lid]; + s_SPtrans[4][lid] = c_SPtrans[4][lid]; + s_SPtrans[5][lid] = c_SPtrans[5][lid]; + s_SPtrans[6][lid] = c_SPtrans[6][lid]; + s_SPtrans[7][lid] = c_SPtrans[7][lid]; + + s_skb[0][lid] = c_skb[0][lid]; + s_skb[1][lid] = c_skb[1][lid]; + s_skb[2][lid] = c_skb[2][lid]; + s_skb[3][lid] = c_skb[3][lid]; + s_skb[4][lid] = c_skb[4][lid]; + s_skb[5][lid] = c_skb[5][lid]; + s_skb[6][lid] = c_skb[6][lid]; + s_skb[7][lid] = c_skb[7][lid]; + + barrier (CLK_LOCAL_MEM_FENCE); + + if (gid >= gid_max) return; + + /** + * main + */ + + m08500m (s_SPtrans, s_skb, w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m08500_m08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global u32x * words_buf_r, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m08500_m16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global u32x * words_buf_r, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m08500_s04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global u32x * words_buf_r, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + __local u32 s_SPtrans[8][64]; + + __local u32 s_skb[8][64]; + + /** + * base + */ + + const u32 gid = get_global_id (0); + const u32 lid = get_local_id (0); + + u32 w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = 0; + w[ 3] = 0; + w[ 4] = 0; + w[ 5] = 0; + w[ 6] = 0; + w[ 7] = 0; + w[ 8] = 0; + w[ 9] = 0; + w[10] = 0; + w[11] = 0; + w[12] = 0; + w[13] = 0; + w[14] = 0; + w[15] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * sbox, kbox + */ + + s_SPtrans[0][lid] = c_SPtrans[0][lid]; + s_SPtrans[1][lid] = c_SPtrans[1][lid]; + s_SPtrans[2][lid] = c_SPtrans[2][lid]; + s_SPtrans[3][lid] = c_SPtrans[3][lid]; + s_SPtrans[4][lid] = c_SPtrans[4][lid]; + s_SPtrans[5][lid] = c_SPtrans[5][lid]; + s_SPtrans[6][lid] = c_SPtrans[6][lid]; + s_SPtrans[7][lid] = c_SPtrans[7][lid]; + + s_skb[0][lid] = c_skb[0][lid]; + s_skb[1][lid] = c_skb[1][lid]; + s_skb[2][lid] = c_skb[2][lid]; + s_skb[3][lid] = c_skb[3][lid]; + s_skb[4][lid] = c_skb[4][lid]; + s_skb[5][lid] = c_skb[5][lid]; + s_skb[6][lid] = c_skb[6][lid]; + s_skb[7][lid] = c_skb[7][lid]; + + barrier (CLK_LOCAL_MEM_FENCE); + + if (gid >= gid_max) return; + + /** + * main + */ + + m08500s (s_SPtrans, s_skb, w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m08500_s08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global u32x * words_buf_r, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m08500_s16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global u32x * words_buf_r, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/amd/m08600_a0.cl b/amd/m08600_a0.cl new file mode 100644 index 0000000000..581b22eb1e --- /dev/null +++ b/amd/m08600_a0.cl @@ -0,0 +1,577 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _LOTUS5_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW4 +#define VECT_SIZE4 +#endif + +#ifdef VLIW5 +#define VECT_SIZE4 +#endif + +#define DGST_R0 0 +#define DGST_R1 1 +#define DGST_R2 2 +#define DGST_R3 3 + +#include "include/kernel_functions.c" +#include "types_amd.c" +#include "common_amd.c" +#include "include/rp_gpu.h" +#include "rp_amd.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +__constant u32 lotus_magic_table[256] = +{ + 0xbd, 0x56, 0xea, 0xf2, 0xa2, 0xf1, 0xac, 0x2a, + 0xb0, 0x93, 0xd1, 0x9c, 0x1b, 0x33, 0xfd, 0xd0, + 0x30, 0x04, 0xb6, 0xdc, 0x7d, 0xdf, 0x32, 0x4b, + 0xf7, 0xcb, 0x45, 0x9b, 0x31, 0xbb, 0x21, 0x5a, + 0x41, 0x9f, 0xe1, 0xd9, 0x4a, 0x4d, 0x9e, 0xda, + 0xa0, 0x68, 0x2c, 0xc3, 0x27, 0x5f, 0x80, 0x36, + 0x3e, 0xee, 0xfb, 0x95, 0x1a, 0xfe, 0xce, 0xa8, + 0x34, 0xa9, 0x13, 0xf0, 0xa6, 0x3f, 0xd8, 0x0c, + 0x78, 0x24, 0xaf, 0x23, 0x52, 0xc1, 0x67, 0x17, + 0xf5, 0x66, 0x90, 0xe7, 0xe8, 0x07, 0xb8, 0x60, + 0x48, 0xe6, 0x1e, 0x53, 0xf3, 0x92, 0xa4, 0x72, + 0x8c, 0x08, 0x15, 0x6e, 0x86, 0x00, 0x84, 0xfa, + 0xf4, 0x7f, 0x8a, 0x42, 0x19, 0xf6, 0xdb, 0xcd, + 0x14, 0x8d, 0x50, 0x12, 0xba, 0x3c, 0x06, 0x4e, + 0xec, 0xb3, 0x35, 0x11, 0xa1, 0x88, 0x8e, 0x2b, + 0x94, 0x99, 0xb7, 0x71, 0x74, 0xd3, 0xe4, 0xbf, + 0x3a, 0xde, 0x96, 0x0e, 0xbc, 0x0a, 0xed, 0x77, + 0xfc, 0x37, 0x6b, 0x03, 0x79, 0x89, 0x62, 0xc6, + 0xd7, 0xc0, 0xd2, 0x7c, 0x6a, 0x8b, 0x22, 0xa3, + 0x5b, 0x05, 0x5d, 0x02, 0x75, 0xd5, 0x61, 0xe3, + 0x18, 0x8f, 0x55, 0x51, 0xad, 0x1f, 0x0b, 0x5e, + 0x85, 0xe5, 0xc2, 0x57, 0x63, 0xca, 0x3d, 0x6c, + 0xb4, 0xc5, 0xcc, 0x70, 0xb2, 0x91, 0x59, 0x0d, + 0x47, 0x20, 0xc8, 0x4f, 0x58, 0xe0, 0x01, 0xe2, + 0x16, 0x38, 0xc4, 0x6f, 0x3b, 0x0f, 0x65, 0x46, + 0xbe, 0x7e, 0x2d, 0x7b, 0x82, 0xf9, 0x40, 0xb5, + 0x1d, 0x73, 0xf8, 0xeb, 0x26, 0xc7, 0x87, 0x97, + 0x25, 0x54, 0xb1, 0x28, 0xaa, 0x98, 0x9d, 0xa5, + 0x64, 0x6d, 0x7a, 0xd4, 0x10, 0x81, 0x44, 0xef, + 0x49, 0xd6, 0xae, 0x2e, 0xdd, 0x76, 0x5c, 0x2f, + 0xa7, 0x1c, 0xc9, 0x09, 0x69, 0x9a, 0x83, 0xcf, + 0x29, 0x39, 0xb9, 0xe9, 0x4c, 0xff, 0x43, 0xab, +}; + +#ifdef VECT_SIZE1 +#define BOX(S,i) u32x ((S)[(i)]) +#endif + +#ifdef VECT_SIZE2 +#define BOX(S,i) u32x ((S)[(i).s0], (S)[(i).s1]) +#endif + +#ifdef VECT_SIZE4 +#define BOX(S,i) u32x ((S)[(i).s0], (S)[(i).s1], (S)[(i).s2], (S)[(i).s3]) +#endif + +static void lotus_mix (u32x *in, __local u32 s_lotus_magic_table[256]) +{ + u32x p = 0; + + for (int i = 0; i < 18; i++) + { + u32 s = 48; + + #pragma unroll 12 + for (int j = 0; j < 12; j++) + { + u32x tmp_in = in[j]; + u32x tmp_out = 0; + + p = (p + s--) & 0xff; p = ((tmp_in >> 0) & 0xff) ^ BOX (s_lotus_magic_table, p); tmp_out |= p << 0; + p = (p + s--) & 0xff; p = ((tmp_in >> 8) & 0xff) ^ BOX (s_lotus_magic_table, p); tmp_out |= p << 8; + p = (p + s--) & 0xff; p = ((tmp_in >> 16) & 0xff) ^ BOX (s_lotus_magic_table, p); tmp_out |= p << 16; + p = (p + s--) & 0xff; p = ((tmp_in >> 24) & 0xff) ^ BOX (s_lotus_magic_table, p); tmp_out |= p << 24; + + in[j] = tmp_out; + } + } +} + +static void lotus_transform_password (u32x *in, u32x *out, __local u32 s_lotus_magic_table[256]) +{ + u32x t = out[3] >> 24; + + u32x c; + + #pragma unroll 4 + for (int i = 0; i < 4; i++) + { + t ^= (in[i] >> 0) & 0xff; c = BOX (s_lotus_magic_table, t); out[i] ^= c << 0; t = ((out[i] >> 0) & 0xff); + t ^= (in[i] >> 8) & 0xff; c = BOX (s_lotus_magic_table, t); out[i] ^= c << 8; t = ((out[i] >> 8) & 0xff); + t ^= (in[i] >> 16) & 0xff; c = BOX (s_lotus_magic_table, t); out[i] ^= c << 16; t = ((out[i] >> 16) & 0xff); + t ^= (in[i] >> 24) & 0xff; c = BOX (s_lotus_magic_table, t); out[i] ^= c << 24; t = ((out[i] >> 24) & 0xff); + } +} + +static void pad (u32x w[4], const u32 len) +{ + const u32 val = 16 - len; + + const u32 mask1 = val << 24; + + const u32 mask2 = val << 16 + | val << 24; + + const u32 mask3 = val << 8 + | val << 16 + | val << 24; + + const u32 mask4 = val << 0 + | val << 8 + | val << 16 + | val << 24; + + switch (len) + { + case 0: w[0] = mask4; + w[1] = mask4; + w[2] = mask4; + w[3] = mask4; + break; + case 1: w[0] |= mask3; + w[1] = mask4; + w[2] = mask4; + w[3] = mask4; + break; + case 2: w[0] |= mask2; + w[1] = mask4; + w[2] = mask4; + w[3] = mask4; + break; + case 3: w[0] |= mask1; + w[1] = mask4; + w[2] = mask4; + w[3] = mask4; + break; + case 4: w[1] = mask4; + w[2] = mask4; + w[3] = mask4; + break; + case 5: w[1] |= mask3; + w[2] = mask4; + w[3] = mask4; + break; + case 6: w[1] |= mask2; + w[2] = mask4; + w[3] = mask4; + break; + case 7: w[1] |= mask1; + w[2] = mask4; + w[3] = mask4; + break; + case 8: w[2] = mask4; + w[3] = mask4; + break; + case 9: w[2] |= mask3; + w[3] = mask4; + break; + case 10: w[2] |= mask2; + w[3] = mask4; + break; + case 11: w[2] |= mask1; + w[3] = mask4; + break; + case 12: w[3] = mask4; + break; + case 13: w[3] |= mask3; + break; + case 14: w[3] |= mask2; + break; + case 15: w[3] |= mask1; + break; + } +} + +static void mdtransform_norecalc (u32x state[4], u32x block[4], __local u32 s_lotus_magic_table[256]) +{ + u32x x[12]; + + x[ 0] = state[0]; + x[ 1] = state[1]; + x[ 2] = state[2]; + x[ 3] = state[3]; + x[ 4] = block[0]; + x[ 5] = block[1]; + x[ 6] = block[2]; + x[ 7] = block[3]; + x[ 8] = state[0] ^ block[0]; + x[ 9] = state[1] ^ block[1]; + x[10] = state[2] ^ block[2]; + x[11] = state[3] ^ block[3]; + + lotus_mix (x, s_lotus_magic_table); + + state[0] = x[0]; + state[1] = x[1]; + state[2] = x[2]; + state[3] = x[3]; +} + +static void mdtransform (u32x state[4], u32x checksum[4], u32x block[4], __local u32 s_lotus_magic_table[256]) +{ + mdtransform_norecalc (state, block, s_lotus_magic_table); + + lotus_transform_password (block, checksum, s_lotus_magic_table); +} + +static void domino_big_md (const u32x saved_key[16], const u32 size, u32x state[4], __local u32 s_lotus_magic_table[256]) +{ + u32x checksum[4]; + + checksum[0] = 0; + checksum[1] = 0; + checksum[2] = 0; + checksum[3] = 0; + + u32x block[4]; + + block[0] = saved_key[0]; + block[1] = saved_key[1]; + block[2] = saved_key[2]; + block[3] = saved_key[3]; + + mdtransform (state, checksum, block, s_lotus_magic_table); + + mdtransform_norecalc (state, checksum, s_lotus_magic_table); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m08600_m04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + /** + * sbox + */ + + const u32 lid4 = lid * 4; + + __local u32 s_lotus_magic_table[256]; + + s_lotus_magic_table[lid4 + 0] = lotus_magic_table[lid4 + 0]; + s_lotus_magic_table[lid4 + 1] = lotus_magic_table[lid4 + 1]; + s_lotus_magic_table[lid4 + 2] = lotus_magic_table[lid4 + 2]; + s_lotus_magic_table[lid4 + 3] = lotus_magic_table[lid4 + 3]; + + barrier (CLK_LOCAL_MEM_FENCE); + + if (gid >= gid_max) return; + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + u32x pw_buf1[4]; + + pw_buf1[0] = pws[gid].i[ 4]; + pw_buf1[1] = pws[gid].i[ 5]; + pw_buf1[2] = pws[gid].i[ 6]; + pw_buf1[3] = pws[gid].i[ 7]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + + w0[0] = pw_buf0[0]; + w0[1] = pw_buf0[1]; + w0[2] = pw_buf0[2]; + w0[3] = pw_buf0[3]; + + u32x w1[4]; + + w1[0] = pw_buf1[0]; + w1[1] = pw_buf1[1]; + w1[2] = pw_buf1[2]; + w1[3] = pw_buf1[3]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 out_len = apply_rules (rules_buf[il_pos].cmds, w0, w1, pw_len); + + u32x w[16]; + + w[ 0] = w0[0]; + w[ 1] = w0[1]; + w[ 2] = w0[2]; + w[ 3] = w0[3]; + w[ 4] = w1[0]; + w[ 5] = w1[1]; + w[ 6] = w1[2]; + w[ 7] = w1[3]; + w[ 8] = 0; + w[ 9] = 0; + w[10] = 0; + w[11] = 0; + w[12] = 0; + w[13] = 0; + w[14] = 0; + w[15] = 0; + + u32x state[4]; + + state[0] = 0; + state[1] = 0; + state[2] = 0; + state[3] = 0; + + /** + * padding + */ + + if (pw_len < 16) + { + pad (&w[ 0], pw_len & 0xf); + } + else if (pw_len < 32) + { + pad (&w[ 4], pw_len & 0xf); + } + else if (pw_len < 48) + { + pad (&w[ 8], pw_len & 0xf); + } + else if (pw_len < 64) + { + pad (&w[12], pw_len & 0xf); + } + + domino_big_md (w, pw_len, state, s_lotus_magic_table); + + const u32x r0 = state[0]; + const u32x r1 = state[1]; + const u32x r2 = state[2]; + const u32x r3 = state[3]; + + #include VECT_COMPARE_M + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m08600_m08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m08600_m16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m08600_s04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + /** + * sbox + */ + + const u32 lid4 = lid * 4; + + __local u32 s_lotus_magic_table[256]; + + s_lotus_magic_table[lid4 + 0] = lotus_magic_table[lid4 + 0]; + s_lotus_magic_table[lid4 + 1] = lotus_magic_table[lid4 + 1]; + s_lotus_magic_table[lid4 + 2] = lotus_magic_table[lid4 + 2]; + s_lotus_magic_table[lid4 + 3] = lotus_magic_table[lid4 + 3]; + + barrier (CLK_LOCAL_MEM_FENCE); + + if (gid >= gid_max) return; + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + u32x pw_buf1[4]; + + pw_buf1[0] = pws[gid].i[ 4]; + pw_buf1[1] = pws[gid].i[ 5]; + pw_buf1[2] = pws[gid].i[ 6]; + pw_buf1[3] = pws[gid].i[ 7]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + + w0[0] = pw_buf0[0]; + w0[1] = pw_buf0[1]; + w0[2] = pw_buf0[2]; + w0[3] = pw_buf0[3]; + + u32x w1[4]; + + w1[0] = pw_buf1[0]; + w1[1] = pw_buf1[1]; + w1[2] = pw_buf1[2]; + w1[3] = pw_buf1[3]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 out_len = apply_rules (rules_buf[il_pos].cmds, w0, w1, pw_len); + + u32x w[16]; + + w[ 0] = w0[0]; + w[ 1] = w0[1]; + w[ 2] = w0[2]; + w[ 3] = w0[3]; + w[ 4] = w1[0]; + w[ 5] = w1[1]; + w[ 6] = w1[2]; + w[ 7] = w1[3]; + w[ 8] = 0; + w[ 9] = 0; + w[10] = 0; + w[11] = 0; + w[12] = 0; + w[13] = 0; + w[14] = 0; + w[15] = 0; + + u32x state[4]; + + state[0] = 0; + state[1] = 0; + state[2] = 0; + state[3] = 0; + + /** + * padding + */ + + if (pw_len < 16) + { + pad (&w[ 0], pw_len & 0xf); + } + else if (pw_len < 32) + { + pad (&w[ 4], pw_len & 0xf); + } + else if (pw_len < 48) + { + pad (&w[ 8], pw_len & 0xf); + } + else if (pw_len < 64) + { + pad (&w[12], pw_len & 0xf); + } + + domino_big_md (w, pw_len, state, s_lotus_magic_table); + + const u32x r0 = state[0]; + const u32x r1 = state[1]; + const u32x r2 = state[2]; + const u32x r3 = state[3]; + + #include VECT_COMPARE_S + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m08600_s08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m08600_s16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/amd/m08600_a1.cl b/amd/m08600_a1.cl new file mode 100644 index 0000000000..0f80755a3b --- /dev/null +++ b/amd/m08600_a1.cl @@ -0,0 +1,627 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _LOTUS5_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW4 +#define VECT_SIZE4 +#endif + +#ifdef VLIW5 +#define VECT_SIZE4 +#endif + +#define DGST_R0 0 +#define DGST_R1 1 +#define DGST_R2 2 +#define DGST_R3 3 + +#include "include/kernel_functions.c" +#include "types_amd.c" +#include "common_amd.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +__constant u32 lotus_magic_table[256] = +{ + 0xbd, 0x56, 0xea, 0xf2, 0xa2, 0xf1, 0xac, 0x2a, + 0xb0, 0x93, 0xd1, 0x9c, 0x1b, 0x33, 0xfd, 0xd0, + 0x30, 0x04, 0xb6, 0xdc, 0x7d, 0xdf, 0x32, 0x4b, + 0xf7, 0xcb, 0x45, 0x9b, 0x31, 0xbb, 0x21, 0x5a, + 0x41, 0x9f, 0xe1, 0xd9, 0x4a, 0x4d, 0x9e, 0xda, + 0xa0, 0x68, 0x2c, 0xc3, 0x27, 0x5f, 0x80, 0x36, + 0x3e, 0xee, 0xfb, 0x95, 0x1a, 0xfe, 0xce, 0xa8, + 0x34, 0xa9, 0x13, 0xf0, 0xa6, 0x3f, 0xd8, 0x0c, + 0x78, 0x24, 0xaf, 0x23, 0x52, 0xc1, 0x67, 0x17, + 0xf5, 0x66, 0x90, 0xe7, 0xe8, 0x07, 0xb8, 0x60, + 0x48, 0xe6, 0x1e, 0x53, 0xf3, 0x92, 0xa4, 0x72, + 0x8c, 0x08, 0x15, 0x6e, 0x86, 0x00, 0x84, 0xfa, + 0xf4, 0x7f, 0x8a, 0x42, 0x19, 0xf6, 0xdb, 0xcd, + 0x14, 0x8d, 0x50, 0x12, 0xba, 0x3c, 0x06, 0x4e, + 0xec, 0xb3, 0x35, 0x11, 0xa1, 0x88, 0x8e, 0x2b, + 0x94, 0x99, 0xb7, 0x71, 0x74, 0xd3, 0xe4, 0xbf, + 0x3a, 0xde, 0x96, 0x0e, 0xbc, 0x0a, 0xed, 0x77, + 0xfc, 0x37, 0x6b, 0x03, 0x79, 0x89, 0x62, 0xc6, + 0xd7, 0xc0, 0xd2, 0x7c, 0x6a, 0x8b, 0x22, 0xa3, + 0x5b, 0x05, 0x5d, 0x02, 0x75, 0xd5, 0x61, 0xe3, + 0x18, 0x8f, 0x55, 0x51, 0xad, 0x1f, 0x0b, 0x5e, + 0x85, 0xe5, 0xc2, 0x57, 0x63, 0xca, 0x3d, 0x6c, + 0xb4, 0xc5, 0xcc, 0x70, 0xb2, 0x91, 0x59, 0x0d, + 0x47, 0x20, 0xc8, 0x4f, 0x58, 0xe0, 0x01, 0xe2, + 0x16, 0x38, 0xc4, 0x6f, 0x3b, 0x0f, 0x65, 0x46, + 0xbe, 0x7e, 0x2d, 0x7b, 0x82, 0xf9, 0x40, 0xb5, + 0x1d, 0x73, 0xf8, 0xeb, 0x26, 0xc7, 0x87, 0x97, + 0x25, 0x54, 0xb1, 0x28, 0xaa, 0x98, 0x9d, 0xa5, + 0x64, 0x6d, 0x7a, 0xd4, 0x10, 0x81, 0x44, 0xef, + 0x49, 0xd6, 0xae, 0x2e, 0xdd, 0x76, 0x5c, 0x2f, + 0xa7, 0x1c, 0xc9, 0x09, 0x69, 0x9a, 0x83, 0xcf, + 0x29, 0x39, 0xb9, 0xe9, 0x4c, 0xff, 0x43, 0xab, +}; + +#ifdef VECT_SIZE1 +#define BOX(S,i) u32x ((S)[(i)]) +#endif + +#ifdef VECT_SIZE2 +#define BOX(S,i) u32x ((S)[(i).s0], (S)[(i).s1]) +#endif + +#ifdef VECT_SIZE4 +#define BOX(S,i) u32x ((S)[(i).s0], (S)[(i).s1], (S)[(i).s2], (S)[(i).s3]) +#endif + +static void lotus_mix (u32x *in, __local u32 s_lotus_magic_table[256]) +{ + u32x p = 0; + + for (int i = 0; i < 18; i++) + { + u32 s = 48; + + #pragma unroll 12 + for (int j = 0; j < 12; j++) + { + u32x tmp_in = in[j]; + u32x tmp_out = 0; + + p = (p + s--) & 0xff; p = ((tmp_in >> 0) & 0xff) ^ BOX (s_lotus_magic_table, p); tmp_out |= p << 0; + p = (p + s--) & 0xff; p = ((tmp_in >> 8) & 0xff) ^ BOX (s_lotus_magic_table, p); tmp_out |= p << 8; + p = (p + s--) & 0xff; p = ((tmp_in >> 16) & 0xff) ^ BOX (s_lotus_magic_table, p); tmp_out |= p << 16; + p = (p + s--) & 0xff; p = ((tmp_in >> 24) & 0xff) ^ BOX (s_lotus_magic_table, p); tmp_out |= p << 24; + + in[j] = tmp_out; + } + } +} + +static void lotus_transform_password (u32x *in, u32x *out, __local u32 s_lotus_magic_table[256]) +{ + u32x t = out[3] >> 24; + + u32x c; + + #pragma unroll 4 + for (int i = 0; i < 4; i++) + { + t ^= (in[i] >> 0) & 0xff; c = BOX (s_lotus_magic_table, t); out[i] ^= c << 0; t = ((out[i] >> 0) & 0xff); + t ^= (in[i] >> 8) & 0xff; c = BOX (s_lotus_magic_table, t); out[i] ^= c << 8; t = ((out[i] >> 8) & 0xff); + t ^= (in[i] >> 16) & 0xff; c = BOX (s_lotus_magic_table, t); out[i] ^= c << 16; t = ((out[i] >> 16) & 0xff); + t ^= (in[i] >> 24) & 0xff; c = BOX (s_lotus_magic_table, t); out[i] ^= c << 24; t = ((out[i] >> 24) & 0xff); + } +} + +static void pad (u32x w[4], const u32 len) +{ + const u32 val = 16 - len; + + const u32 mask1 = val << 24; + + const u32 mask2 = val << 16 + | val << 24; + + const u32 mask3 = val << 8 + | val << 16 + | val << 24; + + const u32 mask4 = val << 0 + | val << 8 + | val << 16 + | val << 24; + + switch (len) + { + case 0: w[0] = mask4; + w[1] = mask4; + w[2] = mask4; + w[3] = mask4; + break; + case 1: w[0] |= mask3; + w[1] = mask4; + w[2] = mask4; + w[3] = mask4; + break; + case 2: w[0] |= mask2; + w[1] = mask4; + w[2] = mask4; + w[3] = mask4; + break; + case 3: w[0] |= mask1; + w[1] = mask4; + w[2] = mask4; + w[3] = mask4; + break; + case 4: w[1] = mask4; + w[2] = mask4; + w[3] = mask4; + break; + case 5: w[1] |= mask3; + w[2] = mask4; + w[3] = mask4; + break; + case 6: w[1] |= mask2; + w[2] = mask4; + w[3] = mask4; + break; + case 7: w[1] |= mask1; + w[2] = mask4; + w[3] = mask4; + break; + case 8: w[2] = mask4; + w[3] = mask4; + break; + case 9: w[2] |= mask3; + w[3] = mask4; + break; + case 10: w[2] |= mask2; + w[3] = mask4; + break; + case 11: w[2] |= mask1; + w[3] = mask4; + break; + case 12: w[3] = mask4; + break; + case 13: w[3] |= mask3; + break; + case 14: w[3] |= mask2; + break; + case 15: w[3] |= mask1; + break; + } +} + +static void mdtransform_norecalc (u32x state[4], u32x block[4], __local u32 s_lotus_magic_table[256]) +{ + u32x x[12]; + + x[ 0] = state[0]; + x[ 1] = state[1]; + x[ 2] = state[2]; + x[ 3] = state[3]; + x[ 4] = block[0]; + x[ 5] = block[1]; + x[ 6] = block[2]; + x[ 7] = block[3]; + x[ 8] = state[0] ^ block[0]; + x[ 9] = state[1] ^ block[1]; + x[10] = state[2] ^ block[2]; + x[11] = state[3] ^ block[3]; + + lotus_mix (x, s_lotus_magic_table); + + state[0] = x[0]; + state[1] = x[1]; + state[2] = x[2]; + state[3] = x[3]; +} + +static void mdtransform (u32x state[4], u32x checksum[4], u32x block[4], __local u32 s_lotus_magic_table[256]) +{ + mdtransform_norecalc (state, block, s_lotus_magic_table); + + lotus_transform_password (block, checksum, s_lotus_magic_table); +} + +static void domino_big_md (const u32x saved_key[16], const u32 size, u32x state[4], __local u32 s_lotus_magic_table[256]) +{ + u32x checksum[4]; + + checksum[0] = 0; + checksum[1] = 0; + checksum[2] = 0; + checksum[3] = 0; + + u32x block[4]; + + block[0] = saved_key[0]; + block[1] = saved_key[1]; + block[2] = saved_key[2]; + block[3] = saved_key[3]; + + mdtransform (state, checksum, block, s_lotus_magic_table); + + mdtransform_norecalc (state, checksum, s_lotus_magic_table); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m08600_m04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + /** + * sbox + */ + + const u32 lid4 = lid * 4; + + __local u32 s_lotus_magic_table[256]; + + s_lotus_magic_table[lid4 + 0] = lotus_magic_table[lid4 + 0]; + s_lotus_magic_table[lid4 + 1] = lotus_magic_table[lid4 + 1]; + s_lotus_magic_table[lid4 + 2] = lotus_magic_table[lid4 + 2]; + s_lotus_magic_table[lid4 + 3] = lotus_magic_table[lid4 + 3]; + + barrier (CLK_LOCAL_MEM_FENCE); + + if (gid >= gid_max) return; + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, combs_buf[0].pw_len); + } + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = combs_buf[il_pos].pw_len; + + u32 pw_len = pw_l_len + pw_r_len; + + u32 wordr0[4]; + + wordr0[0] = combs_buf[il_pos].i[0]; + wordr0[1] = combs_buf[il_pos].i[1]; + wordr0[2] = combs_buf[il_pos].i[2]; + wordr0[3] = combs_buf[il_pos].i[3]; + + u32 wordr1[4]; + + wordr1[0] = combs_buf[il_pos].i[4]; + wordr1[1] = combs_buf[il_pos].i[5]; + wordr1[2] = combs_buf[il_pos].i[6]; + wordr1[3] = combs_buf[il_pos].i[7]; + + u32 wordr2[4]; + + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + + u32 wordr3[4]; + + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + u32x w[16]; + + w[ 0] = wordl0[0] | wordr0[0]; + w[ 1] = wordl0[1] | wordr0[1]; + w[ 2] = wordl0[2] | wordr0[2]; + w[ 3] = wordl0[3] | wordr0[3]; + w[ 4] = wordl1[0] | wordr1[0]; + w[ 5] = wordl1[1] | wordr1[1]; + w[ 6] = wordl1[2] | wordr1[2]; + w[ 7] = wordl1[3] | wordr1[3]; + w[ 8] = wordl2[0] | wordr2[0]; + w[ 9] = wordl2[1] | wordr2[1]; + w[10] = wordl2[2] | wordr2[2]; + w[11] = wordl2[3] | wordr2[3]; + w[12] = wordl3[0] | wordr3[0]; + w[13] = wordl3[1] | wordr3[1]; + w[14] = wordl3[2] | wordr3[2]; + w[15] = wordl3[3] | wordr3[3]; + + u32x state[4]; + + state[0] = 0; + state[1] = 0; + state[2] = 0; + state[3] = 0; + + /** + * padding + */ + + if (pw_len < 16) + { + pad (&w[ 0], pw_len & 0xf); + } + else if (pw_len < 32) + { + pad (&w[ 4], pw_len & 0xf); + } + else if (pw_len < 48) + { + pad (&w[ 8], pw_len & 0xf); + } + else if (pw_len < 64) + { + pad (&w[12], pw_len & 0xf); + } + + domino_big_md (w, pw_len, state, s_lotus_magic_table); + + const u32x r0 = state[0]; + const u32x r1 = state[1]; + const u32x r2 = state[2]; + const u32x r3 = state[3]; + + #include VECT_COMPARE_M + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m08600_m08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m08600_m16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m08600_s04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + /** + * sbox + */ + + const u32 lid4 = lid * 4; + + __local u32 s_lotus_magic_table[256]; + + s_lotus_magic_table[lid4 + 0] = lotus_magic_table[lid4 + 0]; + s_lotus_magic_table[lid4 + 1] = lotus_magic_table[lid4 + 1]; + s_lotus_magic_table[lid4 + 2] = lotus_magic_table[lid4 + 2]; + s_lotus_magic_table[lid4 + 3] = lotus_magic_table[lid4 + 3]; + + barrier (CLK_LOCAL_MEM_FENCE); + + if (gid >= gid_max) return; + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, combs_buf[0].pw_len); + } + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = combs_buf[il_pos].pw_len; + + u32 pw_len = pw_l_len + pw_r_len; + + u32 wordr0[4]; + + wordr0[0] = combs_buf[il_pos].i[0]; + wordr0[1] = combs_buf[il_pos].i[1]; + wordr0[2] = combs_buf[il_pos].i[2]; + wordr0[3] = combs_buf[il_pos].i[3]; + + u32 wordr1[4]; + + wordr1[0] = combs_buf[il_pos].i[4]; + wordr1[1] = combs_buf[il_pos].i[5]; + wordr1[2] = combs_buf[il_pos].i[6]; + wordr1[3] = combs_buf[il_pos].i[7]; + + u32 wordr2[4]; + + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + + u32 wordr3[4]; + + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + u32x w[16]; + + w[ 0] = wordl0[0] | wordr0[0]; + w[ 1] = wordl0[1] | wordr0[1]; + w[ 2] = wordl0[2] | wordr0[2]; + w[ 3] = wordl0[3] | wordr0[3]; + w[ 4] = wordl1[0] | wordr1[0]; + w[ 5] = wordl1[1] | wordr1[1]; + w[ 6] = wordl1[2] | wordr1[2]; + w[ 7] = wordl1[3] | wordr1[3]; + w[ 8] = wordl2[0] | wordr2[0]; + w[ 9] = wordl2[1] | wordr2[1]; + w[10] = wordl2[2] | wordr2[2]; + w[11] = wordl2[3] | wordr2[3]; + w[12] = wordl3[0] | wordr3[0]; + w[13] = wordl3[1] | wordr3[1]; + w[14] = wordl3[2] | wordr3[2]; + w[15] = wordl3[3] | wordr3[3]; + + u32x state[4]; + + state[0] = 0; + state[1] = 0; + state[2] = 0; + state[3] = 0; + + /** + * padding + */ + + if (pw_len < 16) + { + pad (&w[ 0], pw_len & 0xf); + } + else if (pw_len < 32) + { + pad (&w[ 4], pw_len & 0xf); + } + else if (pw_len < 48) + { + pad (&w[ 8], pw_len & 0xf); + } + else if (pw_len < 64) + { + pad (&w[12], pw_len & 0xf); + } + + domino_big_md (w, pw_len, state, s_lotus_magic_table); + + const u32x r0 = state[0]; + const u32x r1 = state[1]; + const u32x r2 = state[2]; + const u32x r3 = state[3]; + + #include VECT_COMPARE_S + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m08600_s08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m08600_s16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/amd/m08600_a3.cl b/amd/m08600_a3.cl new file mode 100644 index 0000000000..e25e884737 --- /dev/null +++ b/amd/m08600_a3.cl @@ -0,0 +1,764 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _LOTUS5_ +#define _SCALAR_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW4 +#define VECT_SIZE4 +#endif + +#ifdef VLIW5 +#define VECT_SIZE4 +#endif + +#define DGST_R0 0 +#define DGST_R1 1 +#define DGST_R2 2 +#define DGST_R3 3 + +#include "include/kernel_functions.c" +#include "types_amd.c" +#include "common_amd.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4_warp.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4_warp.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4_warp.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4_warp.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4_warp.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4_warp.c" +#endif + +__constant u32 lotus_magic_table[256] = +{ + 0xbd, 0x56, 0xea, 0xf2, 0xa2, 0xf1, 0xac, 0x2a, + 0xb0, 0x93, 0xd1, 0x9c, 0x1b, 0x33, 0xfd, 0xd0, + 0x30, 0x04, 0xb6, 0xdc, 0x7d, 0xdf, 0x32, 0x4b, + 0xf7, 0xcb, 0x45, 0x9b, 0x31, 0xbb, 0x21, 0x5a, + 0x41, 0x9f, 0xe1, 0xd9, 0x4a, 0x4d, 0x9e, 0xda, + 0xa0, 0x68, 0x2c, 0xc3, 0x27, 0x5f, 0x80, 0x36, + 0x3e, 0xee, 0xfb, 0x95, 0x1a, 0xfe, 0xce, 0xa8, + 0x34, 0xa9, 0x13, 0xf0, 0xa6, 0x3f, 0xd8, 0x0c, + 0x78, 0x24, 0xaf, 0x23, 0x52, 0xc1, 0x67, 0x17, + 0xf5, 0x66, 0x90, 0xe7, 0xe8, 0x07, 0xb8, 0x60, + 0x48, 0xe6, 0x1e, 0x53, 0xf3, 0x92, 0xa4, 0x72, + 0x8c, 0x08, 0x15, 0x6e, 0x86, 0x00, 0x84, 0xfa, + 0xf4, 0x7f, 0x8a, 0x42, 0x19, 0xf6, 0xdb, 0xcd, + 0x14, 0x8d, 0x50, 0x12, 0xba, 0x3c, 0x06, 0x4e, + 0xec, 0xb3, 0x35, 0x11, 0xa1, 0x88, 0x8e, 0x2b, + 0x94, 0x99, 0xb7, 0x71, 0x74, 0xd3, 0xe4, 0xbf, + 0x3a, 0xde, 0x96, 0x0e, 0xbc, 0x0a, 0xed, 0x77, + 0xfc, 0x37, 0x6b, 0x03, 0x79, 0x89, 0x62, 0xc6, + 0xd7, 0xc0, 0xd2, 0x7c, 0x6a, 0x8b, 0x22, 0xa3, + 0x5b, 0x05, 0x5d, 0x02, 0x75, 0xd5, 0x61, 0xe3, + 0x18, 0x8f, 0x55, 0x51, 0xad, 0x1f, 0x0b, 0x5e, + 0x85, 0xe5, 0xc2, 0x57, 0x63, 0xca, 0x3d, 0x6c, + 0xb4, 0xc5, 0xcc, 0x70, 0xb2, 0x91, 0x59, 0x0d, + 0x47, 0x20, 0xc8, 0x4f, 0x58, 0xe0, 0x01, 0xe2, + 0x16, 0x38, 0xc4, 0x6f, 0x3b, 0x0f, 0x65, 0x46, + 0xbe, 0x7e, 0x2d, 0x7b, 0x82, 0xf9, 0x40, 0xb5, + 0x1d, 0x73, 0xf8, 0xeb, 0x26, 0xc7, 0x87, 0x97, + 0x25, 0x54, 0xb1, 0x28, 0xaa, 0x98, 0x9d, 0xa5, + 0x64, 0x6d, 0x7a, 0xd4, 0x10, 0x81, 0x44, 0xef, + 0x49, 0xd6, 0xae, 0x2e, 0xdd, 0x76, 0x5c, 0x2f, + 0xa7, 0x1c, 0xc9, 0x09, 0x69, 0x9a, 0x83, 0xcf, + 0x29, 0x39, 0xb9, 0xe9, 0x4c, 0xff, 0x43, 0xab, +}; + +#ifdef VECT_SIZE1 +#define BOX(S,i) u32x ((S)[(i)]) +#endif + +#ifdef VECT_SIZE2 +#define BOX(S,i) u32x ((S)[(i).s0], (S)[(i).s1]) +#endif + +#ifdef VECT_SIZE4 +#define BOX(S,i) u32x ((S)[(i).s0], (S)[(i).s1], (S)[(i).s2], (S)[(i).s3]) +#endif + +static void lotus_mix (u32x *in, __local u32 s_lotus_magic_table[256]) +{ + u32x p = 0; + + for (int i = 0; i < 18; i++) + { + u32 s = 48; + + #pragma unroll 12 + for (int j = 0; j < 12; j++) + { + u32x tmp_in = in[j]; + u32x tmp_out = 0; + + p = (p + s--) & 0xff; p = ((tmp_in >> 0) & 0xff) ^ BOX (s_lotus_magic_table, p); tmp_out |= p << 0; + p = (p + s--) & 0xff; p = ((tmp_in >> 8) & 0xff) ^ BOX (s_lotus_magic_table, p); tmp_out |= p << 8; + p = (p + s--) & 0xff; p = ((tmp_in >> 16) & 0xff) ^ BOX (s_lotus_magic_table, p); tmp_out |= p << 16; + p = (p + s--) & 0xff; p = ((tmp_in >> 24) & 0xff) ^ BOX (s_lotus_magic_table, p); tmp_out |= p << 24; + + in[j] = tmp_out; + } + } +} + +static void lotus_transform_password (u32x *in, u32x *out, __local u32 s_lotus_magic_table[256]) +{ + u32x t = out[3] >> 24; + + u32x c; + + #pragma unroll 4 + for (int i = 0; i < 4; i++) + { + t ^= (in[i] >> 0) & 0xff; c = BOX (s_lotus_magic_table, t); out[i] ^= c << 0; t = ((out[i] >> 0) & 0xff); + t ^= (in[i] >> 8) & 0xff; c = BOX (s_lotus_magic_table, t); out[i] ^= c << 8; t = ((out[i] >> 8) & 0xff); + t ^= (in[i] >> 16) & 0xff; c = BOX (s_lotus_magic_table, t); out[i] ^= c << 16; t = ((out[i] >> 16) & 0xff); + t ^= (in[i] >> 24) & 0xff; c = BOX (s_lotus_magic_table, t); out[i] ^= c << 24; t = ((out[i] >> 24) & 0xff); + } +} + +static void pad (u32 w[4], const u32 len) +{ + const u32 val = 16 - len; + + const u32 mask1 = val << 24; + + const u32 mask2 = val << 16 + | val << 24; + + const u32 mask3 = val << 8 + | val << 16 + | val << 24; + + const u32 mask4 = val << 0 + | val << 8 + | val << 16 + | val << 24; + + switch (len) + { + case 0: w[0] = mask4; + w[1] = mask4; + w[2] = mask4; + w[3] = mask4; + break; + case 1: w[0] |= mask3; + w[1] = mask4; + w[2] = mask4; + w[3] = mask4; + break; + case 2: w[0] |= mask2; + w[1] = mask4; + w[2] = mask4; + w[3] = mask4; + break; + case 3: w[0] |= mask1; + w[1] = mask4; + w[2] = mask4; + w[3] = mask4; + break; + case 4: w[1] = mask4; + w[2] = mask4; + w[3] = mask4; + break; + case 5: w[1] |= mask3; + w[2] = mask4; + w[3] = mask4; + break; + case 6: w[1] |= mask2; + w[2] = mask4; + w[3] = mask4; + break; + case 7: w[1] |= mask1; + w[2] = mask4; + w[3] = mask4; + break; + case 8: w[2] = mask4; + w[3] = mask4; + break; + case 9: w[2] |= mask3; + w[3] = mask4; + break; + case 10: w[2] |= mask2; + w[3] = mask4; + break; + case 11: w[2] |= mask1; + w[3] = mask4; + break; + case 12: w[3] = mask4; + break; + case 13: w[3] |= mask3; + break; + case 14: w[3] |= mask2; + break; + case 15: w[3] |= mask1; + break; + } +} + +static void mdtransform_norecalc (u32x state[4], u32x block[4], __local u32 s_lotus_magic_table[256]) +{ + u32x x[12]; + + x[ 0] = state[0]; + x[ 1] = state[1]; + x[ 2] = state[2]; + x[ 3] = state[3]; + x[ 4] = block[0]; + x[ 5] = block[1]; + x[ 6] = block[2]; + x[ 7] = block[3]; + x[ 8] = state[0] ^ block[0]; + x[ 9] = state[1] ^ block[1]; + x[10] = state[2] ^ block[2]; + x[11] = state[3] ^ block[3]; + + lotus_mix (x, s_lotus_magic_table); + + state[0] = x[0]; + state[1] = x[1]; + state[2] = x[2]; + state[3] = x[3]; +} + +static void mdtransform (u32x state[4], u32x checksum[4], u32x block[4], __local u32 s_lotus_magic_table[256]) +{ + mdtransform_norecalc (state, block, s_lotus_magic_table); + + lotus_transform_password (block, checksum, s_lotus_magic_table); +} + +static void domino_big_md (const u32x saved_key[16], const u32 size, u32x state[4], __local u32 s_lotus_magic_table[256]) +{ + u32x checksum[4]; + + checksum[0] = 0; + checksum[1] = 0; + checksum[2] = 0; + checksum[3] = 0; + + u32x block[4]; + + block[0] = saved_key[0]; + block[1] = saved_key[1]; + block[2] = saved_key[2]; + block[3] = saved_key[3]; + + mdtransform (state, checksum, block, s_lotus_magic_table); + + mdtransform_norecalc (state, checksum, s_lotus_magic_table); +} + +static void m08600m (__local u32 s_lotus_magic_table[256], u32 w[16], const u32 pw_len, __global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global u32x * words_buf_r, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset) +{ + /** + * modifier + */ + + const u32 gid = get_global_id (0); + const u32 lid = get_local_id (0); + + /** + * padding + */ + + if (pw_len < 16) + { + pad (&w[ 0], pw_len & 0xf); + } + else if (pw_len < 32) + { + pad (&w[ 4], pw_len & 0xf); + } + else if (pw_len < 48) + { + pad (&w[ 8], pw_len & 0xf); + } + else if (pw_len < 64) + { + pad (&w[12], pw_len & 0xf); + } + + /** + * loop + */ + + const u32 bf_loops = ceil ((float) bfs_cnt / VECT_DIV); + + u32x w0l = w[0]; + + for (u32 il_pos = 0; il_pos < bf_loops; il_pos++) + { + const u32x w0r = words_buf_r[il_pos]; + + const u32x w0 = w0l | w0r; + + u32x w_tmp[16]; + + w_tmp[ 0] = w0; + w_tmp[ 1] = w[ 1]; + w_tmp[ 2] = w[ 2]; + w_tmp[ 3] = w[ 3]; + w_tmp[ 4] = w[ 4]; + w_tmp[ 5] = w[ 5]; + w_tmp[ 6] = w[ 6]; + w_tmp[ 7] = w[ 7]; + w_tmp[ 8] = w[ 8]; + w_tmp[ 9] = w[ 9]; + w_tmp[10] = w[10]; + w_tmp[11] = w[11]; + w_tmp[12] = w[12]; + w_tmp[13] = w[13]; + w_tmp[14] = w[14]; + w_tmp[15] = w[15]; + + u32x state[4]; + + state[0] = 0; + state[1] = 0; + state[2] = 0; + state[3] = 0; + + domino_big_md (w_tmp, pw_len, state, s_lotus_magic_table); + + const u32x r0 = state[0]; + const u32x r1 = state[1]; + const u32x r2 = state[2]; + const u32x r3 = state[3]; + + #include VECT_COMPARE_M + } +} + +static void m08600s (__local u32 s_lotus_magic_table[256], u32 w[16], const u32 pw_len, __global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global u32x * words_buf_r, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset) +{ + /** + * modifier + */ + + const u32 gid = get_global_id (0); + const u32 lid = get_local_id (0); + + /** + * base + */ + + if (pw_len < 16) + { + pad (&w[ 0], pw_len & 0xf); + } + else if (pw_len < 32) + { + pad (&w[ 4], pw_len & 0xf); + } + else if (pw_len < 48) + { + pad (&w[ 8], pw_len & 0xf); + } + else if (pw_len < 64) + { + pad (&w[12], pw_len & 0xf); + } + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * loop + */ + + const u32 bf_loops = ceil ((float) bfs_cnt / VECT_DIV); + + u32x w0l = w[0]; + + for (u32 il_pos = 0; il_pos < bf_loops; il_pos++) + { + const u32x w0r = words_buf_r[il_pos]; + + const u32x w0 = w0l | w0r; + + u32x w_tmp[16]; + + w_tmp[ 0] = w0; + w_tmp[ 1] = w[ 1]; + w_tmp[ 2] = w[ 2]; + w_tmp[ 3] = w[ 3]; + w_tmp[ 4] = w[ 4]; + w_tmp[ 5] = w[ 5]; + w_tmp[ 6] = w[ 6]; + w_tmp[ 7] = w[ 7]; + w_tmp[ 8] = w[ 8]; + w_tmp[ 9] = w[ 9]; + w_tmp[10] = w[10]; + w_tmp[11] = w[11]; + w_tmp[12] = w[12]; + w_tmp[13] = w[13]; + w_tmp[14] = w[14]; + w_tmp[15] = w[15]; + + u32x state[4]; + + state[0] = 0; + state[1] = 0; + state[2] = 0; + state[3] = 0; + + domino_big_md (w_tmp, pw_len, state, s_lotus_magic_table); + + const u32x r0 = state[0]; + const u32x r1 = state[1]; + const u32x r2 = state[2]; + const u32x r3 = state[3]; + + #include VECT_COMPARE_S + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m08600_m04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global u32x * words_buf_r, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + const u32 lid = get_local_id (0); + + u32 w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = 0; + w[ 5] = 0; + w[ 6] = 0; + w[ 7] = 0; + w[ 8] = 0; + w[ 9] = 0; + w[10] = 0; + w[11] = 0; + w[12] = 0; + w[13] = 0; + w[14] = 0; + w[15] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * sbox + */ + + const u32 lid4 = lid * 4; + + __local u32 s_lotus_magic_table[256]; + + s_lotus_magic_table[lid4 + 0] = lotus_magic_table[lid4 + 0]; + s_lotus_magic_table[lid4 + 1] = lotus_magic_table[lid4 + 1]; + s_lotus_magic_table[lid4 + 2] = lotus_magic_table[lid4 + 2]; + s_lotus_magic_table[lid4 + 3] = lotus_magic_table[lid4 + 3]; + + barrier (CLK_LOCAL_MEM_FENCE); + + if (gid >= gid_max) return; + + /** + * main + */ + + m08600m (s_lotus_magic_table, w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m08600_m08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global u32x * words_buf_r, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + const u32 lid = get_local_id (0); + + u32 w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = pws[gid].i[ 4]; + w[ 5] = pws[gid].i[ 5]; + w[ 6] = pws[gid].i[ 6]; + w[ 7] = pws[gid].i[ 7]; + w[ 8] = 0; + w[ 9] = 0; + w[10] = 0; + w[11] = 0; + w[12] = 0; + w[13] = 0; + w[14] = 0; + w[15] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * sbox + */ + + const u32 lid4 = lid * 4; + + __local u32 s_lotus_magic_table[256]; + + s_lotus_magic_table[lid4 + 0] = lotus_magic_table[lid4 + 0]; + s_lotus_magic_table[lid4 + 1] = lotus_magic_table[lid4 + 1]; + s_lotus_magic_table[lid4 + 2] = lotus_magic_table[lid4 + 2]; + s_lotus_magic_table[lid4 + 3] = lotus_magic_table[lid4 + 3]; + + barrier (CLK_LOCAL_MEM_FENCE); + + if (gid >= gid_max) return; + + /** + * main + */ + + m08600m (s_lotus_magic_table, w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m08600_m16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global u32x * words_buf_r, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + const u32 lid = get_local_id (0); + + u32 w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = pws[gid].i[ 4]; + w[ 5] = pws[gid].i[ 5]; + w[ 6] = pws[gid].i[ 6]; + w[ 7] = pws[gid].i[ 7]; + w[ 8] = pws[gid].i[ 8]; + w[ 9] = pws[gid].i[ 9]; + w[10] = pws[gid].i[10]; + w[11] = pws[gid].i[11]; + w[12] = pws[gid].i[12]; + w[13] = pws[gid].i[13]; + w[14] = pws[gid].i[14]; + w[15] = pws[gid].i[15]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * sbox + */ + + const u32 lid4 = lid * 4; + + __local u32 s_lotus_magic_table[256]; + + s_lotus_magic_table[lid4 + 0] = lotus_magic_table[lid4 + 0]; + s_lotus_magic_table[lid4 + 1] = lotus_magic_table[lid4 + 1]; + s_lotus_magic_table[lid4 + 2] = lotus_magic_table[lid4 + 2]; + s_lotus_magic_table[lid4 + 3] = lotus_magic_table[lid4 + 3]; + + barrier (CLK_LOCAL_MEM_FENCE); + + if (gid >= gid_max) return; + + /** + * main + */ + + m08600m (s_lotus_magic_table, w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m08600_s04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global u32x * words_buf_r, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + const u32 lid = get_local_id (0); + + u32 w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = 0; + w[ 5] = 0; + w[ 6] = 0; + w[ 7] = 0; + w[ 8] = 0; + w[ 9] = 0; + w[10] = 0; + w[11] = 0; + w[12] = 0; + w[13] = 0; + w[14] = 0; + w[15] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * sbox + */ + + const u32 lid4 = lid * 4; + + __local u32 s_lotus_magic_table[256]; + + s_lotus_magic_table[lid4 + 0] = lotus_magic_table[lid4 + 0]; + s_lotus_magic_table[lid4 + 1] = lotus_magic_table[lid4 + 1]; + s_lotus_magic_table[lid4 + 2] = lotus_magic_table[lid4 + 2]; + s_lotus_magic_table[lid4 + 3] = lotus_magic_table[lid4 + 3]; + + barrier (CLK_LOCAL_MEM_FENCE); + + if (gid >= gid_max) return; + + /** + * main + */ + + m08600s (s_lotus_magic_table, w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m08600_s08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global u32x * words_buf_r, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + const u32 lid = get_local_id (0); + + u32 w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = pws[gid].i[ 4]; + w[ 5] = pws[gid].i[ 5]; + w[ 6] = pws[gid].i[ 6]; + w[ 7] = pws[gid].i[ 7]; + w[ 8] = 0; + w[ 9] = 0; + w[10] = 0; + w[11] = 0; + w[12] = 0; + w[13] = 0; + w[14] = 0; + w[15] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * sbox + */ + + const u32 lid4 = lid * 4; + + __local u32 s_lotus_magic_table[256]; + + s_lotus_magic_table[lid4 + 0] = lotus_magic_table[lid4 + 0]; + s_lotus_magic_table[lid4 + 1] = lotus_magic_table[lid4 + 1]; + s_lotus_magic_table[lid4 + 2] = lotus_magic_table[lid4 + 2]; + s_lotus_magic_table[lid4 + 3] = lotus_magic_table[lid4 + 3]; + + barrier (CLK_LOCAL_MEM_FENCE); + + if (gid >= gid_max) return; + + /** + * main + */ + + m08600s (s_lotus_magic_table, w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m08600_s16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global u32x * words_buf_r, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + const u32 lid = get_local_id (0); + + u32 w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = pws[gid].i[ 4]; + w[ 5] = pws[gid].i[ 5]; + w[ 6] = pws[gid].i[ 6]; + w[ 7] = pws[gid].i[ 7]; + w[ 8] = pws[gid].i[ 8]; + w[ 9] = pws[gid].i[ 9]; + w[10] = pws[gid].i[10]; + w[11] = pws[gid].i[11]; + w[12] = pws[gid].i[12]; + w[13] = pws[gid].i[13]; + w[14] = pws[gid].i[14]; + w[15] = pws[gid].i[15]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * sbox + */ + + const u32 lid4 = lid * 4; + + __local u32 s_lotus_magic_table[256]; + + s_lotus_magic_table[lid4 + 0] = lotus_magic_table[lid4 + 0]; + s_lotus_magic_table[lid4 + 1] = lotus_magic_table[lid4 + 1]; + s_lotus_magic_table[lid4 + 2] = lotus_magic_table[lid4 + 2]; + s_lotus_magic_table[lid4 + 3] = lotus_magic_table[lid4 + 3]; + + barrier (CLK_LOCAL_MEM_FENCE); + + if (gid >= gid_max) return; + + /** + * main + */ + + m08600s (s_lotus_magic_table, w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} diff --git a/amd/m08700_a0.cl b/amd/m08700_a0.cl new file mode 100644 index 0000000000..3810b8bd67 --- /dev/null +++ b/amd/m08700_a0.cl @@ -0,0 +1,779 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _LOTUS6_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW4 +#define VECT_SIZE2 +#endif + +#ifdef VLIW5 +#define VECT_SIZE2 +#endif + +#define DGST_R0 0 +#define DGST_R1 1 +#define DGST_R2 2 +#define DGST_R3 3 + +#include "include/kernel_functions.c" +#include "types_amd.c" +#include "common_amd.c" +#include "include/rp_gpu.h" +#include "rp_amd.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +__constant u32 lotus_magic_table[256] = +{ + 0xbd, 0x56, 0xea, 0xf2, 0xa2, 0xf1, 0xac, 0x2a, + 0xb0, 0x93, 0xd1, 0x9c, 0x1b, 0x33, 0xfd, 0xd0, + 0x30, 0x04, 0xb6, 0xdc, 0x7d, 0xdf, 0x32, 0x4b, + 0xf7, 0xcb, 0x45, 0x9b, 0x31, 0xbb, 0x21, 0x5a, + 0x41, 0x9f, 0xe1, 0xd9, 0x4a, 0x4d, 0x9e, 0xda, + 0xa0, 0x68, 0x2c, 0xc3, 0x27, 0x5f, 0x80, 0x36, + 0x3e, 0xee, 0xfb, 0x95, 0x1a, 0xfe, 0xce, 0xa8, + 0x34, 0xa9, 0x13, 0xf0, 0xa6, 0x3f, 0xd8, 0x0c, + 0x78, 0x24, 0xaf, 0x23, 0x52, 0xc1, 0x67, 0x17, + 0xf5, 0x66, 0x90, 0xe7, 0xe8, 0x07, 0xb8, 0x60, + 0x48, 0xe6, 0x1e, 0x53, 0xf3, 0x92, 0xa4, 0x72, + 0x8c, 0x08, 0x15, 0x6e, 0x86, 0x00, 0x84, 0xfa, + 0xf4, 0x7f, 0x8a, 0x42, 0x19, 0xf6, 0xdb, 0xcd, + 0x14, 0x8d, 0x50, 0x12, 0xba, 0x3c, 0x06, 0x4e, + 0xec, 0xb3, 0x35, 0x11, 0xa1, 0x88, 0x8e, 0x2b, + 0x94, 0x99, 0xb7, 0x71, 0x74, 0xd3, 0xe4, 0xbf, + 0x3a, 0xde, 0x96, 0x0e, 0xbc, 0x0a, 0xed, 0x77, + 0xfc, 0x37, 0x6b, 0x03, 0x79, 0x89, 0x62, 0xc6, + 0xd7, 0xc0, 0xd2, 0x7c, 0x6a, 0x8b, 0x22, 0xa3, + 0x5b, 0x05, 0x5d, 0x02, 0x75, 0xd5, 0x61, 0xe3, + 0x18, 0x8f, 0x55, 0x51, 0xad, 0x1f, 0x0b, 0x5e, + 0x85, 0xe5, 0xc2, 0x57, 0x63, 0xca, 0x3d, 0x6c, + 0xb4, 0xc5, 0xcc, 0x70, 0xb2, 0x91, 0x59, 0x0d, + 0x47, 0x20, 0xc8, 0x4f, 0x58, 0xe0, 0x01, 0xe2, + 0x16, 0x38, 0xc4, 0x6f, 0x3b, 0x0f, 0x65, 0x46, + 0xbe, 0x7e, 0x2d, 0x7b, 0x82, 0xf9, 0x40, 0xb5, + 0x1d, 0x73, 0xf8, 0xeb, 0x26, 0xc7, 0x87, 0x97, + 0x25, 0x54, 0xb1, 0x28, 0xaa, 0x98, 0x9d, 0xa5, + 0x64, 0x6d, 0x7a, 0xd4, 0x10, 0x81, 0x44, 0xef, + 0x49, 0xd6, 0xae, 0x2e, 0xdd, 0x76, 0x5c, 0x2f, + 0xa7, 0x1c, 0xc9, 0x09, 0x69, 0x9a, 0x83, 0xcf, + 0x29, 0x39, 0xb9, 0xe9, 0x4c, 0xff, 0x43, 0xab, +}; + +#ifdef VECT_SIZE1 +#define BOX(S,i) (u32x) ((S)[(i)]) +#endif + +#ifdef VECT_SIZE2 +#define BOX(S,i) (u32x) ((S)[(i).s0], (S)[(i).s1]) +#endif + +#ifdef VECT_SIZE4 +#define BOX(S,i) (u32x) ((S)[(i).s0], (S)[(i).s1], (S)[(i).s2], (S)[(i).s3]) +#endif + +#ifdef VECT_SIZE1 +#define uint_to_hex_upper8(i) (u32x) (l_bin2asc[(i)]) +#endif + +#ifdef VECT_SIZE2 +#define uint_to_hex_upper8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1]) +#endif + +#ifdef VECT_SIZE4 +#define uint_to_hex_upper8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3]) +#endif + +static void lotus_mix (u32x *in, __local u32 s_lotus_magic_table[256]) +{ + u32x p = 0; + + for (int i = 0; i < 18; i++) + { + u32 s = 48; + + #pragma unroll + for (int j = 0; j < 12; j++) + { + u32x tmp_in = in[j]; + u32x tmp_out = 0; + + p = (p + s--) & 0xff; p = ((tmp_in >> 0) & 0xff) ^ BOX (s_lotus_magic_table, p); tmp_out |= p << 0; + p = (p + s--) & 0xff; p = ((tmp_in >> 8) & 0xff) ^ BOX (s_lotus_magic_table, p); tmp_out |= p << 8; + p = (p + s--) & 0xff; p = ((tmp_in >> 16) & 0xff) ^ BOX (s_lotus_magic_table, p); tmp_out |= p << 16; + p = (p + s--) & 0xff; p = ((tmp_in >> 24) & 0xff) ^ BOX (s_lotus_magic_table, p); tmp_out |= p << 24; + + in[j] = tmp_out; + } + } +} + +static void lotus_transform_password (u32x *in, u32x *out, __local u32 s_lotus_magic_table[256]) +{ + u32x t = out[3] >> 24; + + u32x c; + + //#pragma unroll // kernel fails if used + for (int i = 0; i < 4; i++) + { + t ^= (in[i] >> 0) & 0xff; c = BOX (s_lotus_magic_table, t); out[i] ^= c << 0; t = ((out[i] >> 0) & 0xff); + t ^= (in[i] >> 8) & 0xff; c = BOX (s_lotus_magic_table, t); out[i] ^= c << 8; t = ((out[i] >> 8) & 0xff); + t ^= (in[i] >> 16) & 0xff; c = BOX (s_lotus_magic_table, t); out[i] ^= c << 16; t = ((out[i] >> 16) & 0xff); + t ^= (in[i] >> 24) & 0xff; c = BOX (s_lotus_magic_table, t); out[i] ^= c << 24; t = ((out[i] >> 24) & 0xff); + } +} + +static void pad (u32x w[4], const u32 len) +{ + const u32 val = 16 - len; + + const u32 mask1 = val << 24; + + const u32 mask2 = val << 16 + | val << 24; + + const u32 mask3 = val << 8 + | val << 16 + | val << 24; + + const u32 mask4 = val << 0 + | val << 8 + | val << 16 + | val << 24; + + switch (len) + { + case 0: w[0] = mask4; + w[1] = mask4; + w[2] = mask4; + w[3] = mask4; + break; + case 1: w[0] |= mask3; + w[1] = mask4; + w[2] = mask4; + w[3] = mask4; + break; + case 2: w[0] |= mask2; + w[1] = mask4; + w[2] = mask4; + w[3] = mask4; + break; + case 3: w[0] |= mask1; + w[1] = mask4; + w[2] = mask4; + w[3] = mask4; + break; + case 4: w[1] = mask4; + w[2] = mask4; + w[3] = mask4; + break; + case 5: w[1] |= mask3; + w[2] = mask4; + w[3] = mask4; + break; + case 6: w[1] |= mask2; + w[2] = mask4; + w[3] = mask4; + break; + case 7: w[1] |= mask1; + w[2] = mask4; + w[3] = mask4; + break; + case 8: w[2] = mask4; + w[3] = mask4; + break; + case 9: w[2] |= mask3; + w[3] = mask4; + break; + case 10: w[2] |= mask2; + w[3] = mask4; + break; + case 11: w[2] |= mask1; + w[3] = mask4; + break; + case 12: w[3] = mask4; + break; + case 13: w[3] |= mask3; + break; + case 14: w[3] |= mask2; + break; + case 15: w[3] |= mask1; + break; + } +} + +static void mdtransform_norecalc (u32x state[4], u32x block[4], __local u32 s_lotus_magic_table[256]) +{ + u32x x[12]; + + x[ 0] = state[0]; + x[ 1] = state[1]; + x[ 2] = state[2]; + x[ 3] = state[3]; + x[ 4] = block[0]; + x[ 5] = block[1]; + x[ 6] = block[2]; + x[ 7] = block[3]; + x[ 8] = state[0] ^ block[0]; + x[ 9] = state[1] ^ block[1]; + x[10] = state[2] ^ block[2]; + x[11] = state[3] ^ block[3]; + + lotus_mix (x, s_lotus_magic_table); + + state[0] = x[0]; + state[1] = x[1]; + state[2] = x[2]; + state[3] = x[3]; +} + +static void mdtransform (u32x state[4], u32x checksum[4], u32x block[4], __local u32 s_lotus_magic_table[256]) +{ + mdtransform_norecalc (state, block, s_lotus_magic_table); + + lotus_transform_password (block, checksum, s_lotus_magic_table); +} + +static void domino_big_md (const u32x saved_key[16], const u32 size, u32x state[4], __local u32 s_lotus_magic_table[256]) +{ + u32x checksum[4]; + + checksum[0] = 0; + checksum[1] = 0; + checksum[2] = 0; + checksum[3] = 0; + + u32x block[4]; + + block[0] = 0; + block[1] = 0; + block[2] = 0; + block[3] = 0; + + u32 curpos; + u32 idx; + + for (curpos = 0, idx = 0; curpos + 16 < size; curpos += 16, idx += 4) + { + block[0] = saved_key[idx + 0]; + block[1] = saved_key[idx + 1]; + block[2] = saved_key[idx + 2]; + block[3] = saved_key[idx + 3]; + + mdtransform (state, checksum, block, s_lotus_magic_table); + } + + block[0] = saved_key[idx + 0]; + block[1] = saved_key[idx + 1]; + block[2] = saved_key[idx + 2]; + block[3] = saved_key[idx + 3]; + + mdtransform (state, checksum, block, s_lotus_magic_table); + + mdtransform_norecalc (state, checksum, s_lotus_magic_table); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m08700_m04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + /** + * bin2asc table + */ + + __local u32 l_bin2asc[256]; + + const u32 lid4 = lid * 4; + + const u32 lid40 = lid4 + 0; + const u32 lid41 = lid4 + 1; + const u32 lid42 = lid4 + 2; + const u32 lid43 = lid4 + 3; + + const u32 v400 = (lid40 >> 0) & 15; + const u32 v401 = (lid40 >> 4) & 15; + const u32 v410 = (lid41 >> 0) & 15; + const u32 v411 = (lid41 >> 4) & 15; + const u32 v420 = (lid42 >> 0) & 15; + const u32 v421 = (lid42 >> 4) & 15; + const u32 v430 = (lid43 >> 0) & 15; + const u32 v431 = (lid43 >> 4) & 15; + + l_bin2asc[lid40] = ((v400 < 10) ? '0' + v400 : 'A' - 10 + v400) << 8 + | ((v401 < 10) ? '0' + v401 : 'A' - 10 + v401) << 0; + l_bin2asc[lid41] = ((v410 < 10) ? '0' + v410 : 'A' - 10 + v410) << 8 + | ((v411 < 10) ? '0' + v411 : 'A' - 10 + v411) << 0; + l_bin2asc[lid42] = ((v420 < 10) ? '0' + v420 : 'A' - 10 + v420) << 8 + | ((v421 < 10) ? '0' + v421 : 'A' - 10 + v421) << 0; + l_bin2asc[lid43] = ((v430 < 10) ? '0' + v430 : 'A' - 10 + v430) << 8 + | ((v431 < 10) ? '0' + v431 : 'A' - 10 + v431) << 0; + + barrier (CLK_LOCAL_MEM_FENCE); + + /** + * sbox + */ + + __local u32 s_lotus_magic_table[256]; + + s_lotus_magic_table[lid4 + 0] = lotus_magic_table[lid4 + 0]; + s_lotus_magic_table[lid4 + 1] = lotus_magic_table[lid4 + 1]; + s_lotus_magic_table[lid4 + 2] = lotus_magic_table[lid4 + 2]; + s_lotus_magic_table[lid4 + 3] = lotus_magic_table[lid4 + 3]; + + barrier (CLK_LOCAL_MEM_FENCE); + + if (gid >= gid_max) return; + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + u32x pw_buf1[4]; + + pw_buf1[0] = pws[gid].i[ 4]; + pw_buf1[1] = pws[gid].i[ 5]; + pw_buf1[2] = pws[gid].i[ 6]; + pw_buf1[3] = pws[gid].i[ 7]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * salt + */ + + const u32 salt0 = salt_bufs[salt_pos].salt_buf[0]; + const u32 salt1 = salt_bufs[salt_pos].salt_buf[1] & 0xff | '(' << 8; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + + w0[0] = pw_buf0[0]; + w0[1] = pw_buf0[1]; + w0[2] = pw_buf0[2]; + w0[3] = pw_buf0[3]; + + u32x w1[4]; + + w1[0] = pw_buf1[0]; + w1[1] = pw_buf1[1]; + w1[2] = pw_buf1[2]; + w1[3] = pw_buf1[3]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 out_len = apply_rules (rules_buf[il_pos].cmds, w0, w1, pw_len); + + u32x w[16]; + + w[ 0] = w0[0]; + w[ 1] = w0[1]; + w[ 2] = w0[2]; + w[ 3] = w0[3]; + w[ 4] = w1[0]; + w[ 5] = w1[1]; + w[ 6] = w1[2]; + w[ 7] = w1[3]; + w[ 8] = w2[0]; + w[ 9] = w2[1]; + w[10] = w2[2]; + w[11] = w2[3]; + w[12] = w3[0]; + w[13] = w3[1]; + w[14] = w3[2]; + w[15] = w3[3]; + + u32x state[4]; + + state[0] = 0; + state[1] = 0; + state[2] = 0; + state[3] = 0; + + /** + * padding + */ + + if (pw_len < 16) + { + pad (&w[ 0], pw_len & 0xf); + } + else if (pw_len < 32) + { + pad (&w[ 4], pw_len & 0xf); + } + else if (pw_len < 48) + { + pad (&w[ 8], pw_len & 0xf); + } + else if (pw_len < 64) + { + pad (&w[12], pw_len & 0xf); + } + + domino_big_md (w, pw_len, state, s_lotus_magic_table); + + const u32x w0_t = uint_to_hex_upper8 ((state[0] >> 0) & 255) << 0 + | uint_to_hex_upper8 ((state[0] >> 8) & 255) << 16; + const u32x w1_t = uint_to_hex_upper8 ((state[0] >> 16) & 255) << 0 + | uint_to_hex_upper8 ((state[0] >> 24) & 255) << 16; + const u32x w2_t = uint_to_hex_upper8 ((state[1] >> 0) & 255) << 0 + | uint_to_hex_upper8 ((state[1] >> 8) & 255) << 16; + const u32x w3_t = uint_to_hex_upper8 ((state[1] >> 16) & 255) << 0 + | uint_to_hex_upper8 ((state[1] >> 24) & 255) << 16; + const u32x w4_t = uint_to_hex_upper8 ((state[2] >> 0) & 255) << 0 + | uint_to_hex_upper8 ((state[2] >> 8) & 255) << 16; + const u32x w5_t = uint_to_hex_upper8 ((state[2] >> 16) & 255) << 0 + | uint_to_hex_upper8 ((state[2] >> 24) & 255) << 16; + const u32x w6_t = uint_to_hex_upper8 ((state[3] >> 0) & 255) << 0 + | uint_to_hex_upper8 ((state[3] >> 8) & 255) << 16; + //const u32x w7_t = uint_to_hex_upper8 ((state[3] >> 16) & 255) << 0 + // | uint_to_hex_upper8 ((state[3] >> 24) & 255) << 16; + + const u32 pade = 0x0e0e0e0e; + + w[ 0] = salt0; + w[ 1] = salt1 | w0_t << 16; + w[ 2] = w0_t >> 16 | w1_t << 16; + w[ 3] = w1_t >> 16 | w2_t << 16; + w[ 4] = w2_t >> 16 | w3_t << 16; + w[ 5] = w3_t >> 16 | w4_t << 16; + w[ 6] = w4_t >> 16 | w5_t << 16; + w[ 7] = w5_t >> 16 | w6_t << 16; + w[ 8] = w6_t >> 16 | pade << 16; // | w7_t << 8; + w[ 9] = pade; + w[10] = pade; + w[11] = pade; + w[12] = 0; + w[13] = 0; + w[14] = 0; + w[15] = 0; + + state[0] = 0; + state[1] = 0; + state[2] = 0; + state[3] = 0; + + domino_big_md (w, 34, state, s_lotus_magic_table); + + u32x a = state[0] & 0xffffffff; + u32x b = state[1] & 0xffffffff; + u32x c = state[2] & 0x000000ff; + u32x d = state[3] & 0x00000000; + + const u32x r0 = a; + const u32x r1 = b; + const u32x r2 = c; + const u32x r3 = d; + + #include VECT_COMPARE_M + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m08700_m08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m08700_m16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m08700_s04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + /** + * bin2asc table + */ + + __local u32 l_bin2asc[256]; + + const u32 lid4 = lid * 4; + + const u32 lid40 = lid4 + 0; + const u32 lid41 = lid4 + 1; + const u32 lid42 = lid4 + 2; + const u32 lid43 = lid4 + 3; + + const u32 v400 = (lid40 >> 0) & 15; + const u32 v401 = (lid40 >> 4) & 15; + const u32 v410 = (lid41 >> 0) & 15; + const u32 v411 = (lid41 >> 4) & 15; + const u32 v420 = (lid42 >> 0) & 15; + const u32 v421 = (lid42 >> 4) & 15; + const u32 v430 = (lid43 >> 0) & 15; + const u32 v431 = (lid43 >> 4) & 15; + + l_bin2asc[lid40] = ((v400 < 10) ? '0' + v400 : 'A' - 10 + v400) << 8 + | ((v401 < 10) ? '0' + v401 : 'A' - 10 + v401) << 0; + l_bin2asc[lid41] = ((v410 < 10) ? '0' + v410 : 'A' - 10 + v410) << 8 + | ((v411 < 10) ? '0' + v411 : 'A' - 10 + v411) << 0; + l_bin2asc[lid42] = ((v420 < 10) ? '0' + v420 : 'A' - 10 + v420) << 8 + | ((v421 < 10) ? '0' + v421 : 'A' - 10 + v421) << 0; + l_bin2asc[lid43] = ((v430 < 10) ? '0' + v430 : 'A' - 10 + v430) << 8 + | ((v431 < 10) ? '0' + v431 : 'A' - 10 + v431) << 0; + + barrier (CLK_LOCAL_MEM_FENCE); + + /** + * sbox + */ + + __local u32 s_lotus_magic_table[256]; + + s_lotus_magic_table[lid4 + 0] = lotus_magic_table[lid4 + 0]; + s_lotus_magic_table[lid4 + 1] = lotus_magic_table[lid4 + 1]; + s_lotus_magic_table[lid4 + 2] = lotus_magic_table[lid4 + 2]; + s_lotus_magic_table[lid4 + 3] = lotus_magic_table[lid4 + 3]; + + barrier (CLK_LOCAL_MEM_FENCE); + + if (gid >= gid_max) return; + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + u32x pw_buf1[4]; + + pw_buf1[0] = pws[gid].i[ 4]; + pw_buf1[1] = pws[gid].i[ 5]; + pw_buf1[2] = pws[gid].i[ 6]; + pw_buf1[3] = pws[gid].i[ 7]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * salt + */ + + const u32 salt0 = salt_bufs[salt_pos].salt_buf[0]; + const u32 salt1 = salt_bufs[salt_pos].salt_buf[1] & 0xff | '(' << 8; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + + w0[0] = pw_buf0[0]; + w0[1] = pw_buf0[1]; + w0[2] = pw_buf0[2]; + w0[3] = pw_buf0[3]; + + u32x w1[4]; + + w1[0] = pw_buf1[0]; + w1[1] = pw_buf1[1]; + w1[2] = pw_buf1[2]; + w1[3] = pw_buf1[3]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 out_len = apply_rules (rules_buf[il_pos].cmds, w0, w1, pw_len); + + u32x w[16]; + + w[ 0] = w0[0]; + w[ 1] = w0[1]; + w[ 2] = w0[2]; + w[ 3] = w0[3]; + w[ 4] = w1[0]; + w[ 5] = w1[1]; + w[ 6] = w1[2]; + w[ 7] = w1[3]; + w[ 8] = w2[0]; + w[ 9] = w2[1]; + w[10] = w2[2]; + w[11] = w2[3]; + w[12] = w3[0]; + w[13] = w3[1]; + w[14] = w3[2]; + w[15] = w3[3]; + + u32x state[4]; + + state[0] = 0; + state[1] = 0; + state[2] = 0; + state[3] = 0; + + /** + * padding + */ + + if (pw_len < 16) + { + pad (&w[ 0], pw_len & 0xf); + } + else if (pw_len < 32) + { + pad (&w[ 4], pw_len & 0xf); + } + else if (pw_len < 48) + { + pad (&w[ 8], pw_len & 0xf); + } + else if (pw_len < 64) + { + pad (&w[12], pw_len & 0xf); + } + + domino_big_md (w, pw_len, state, s_lotus_magic_table); + + const u32x w0_t = uint_to_hex_upper8 ((state[0] >> 0) & 255) << 0 + | uint_to_hex_upper8 ((state[0] >> 8) & 255) << 16; + const u32x w1_t = uint_to_hex_upper8 ((state[0] >> 16) & 255) << 0 + | uint_to_hex_upper8 ((state[0] >> 24) & 255) << 16; + const u32x w2_t = uint_to_hex_upper8 ((state[1] >> 0) & 255) << 0 + | uint_to_hex_upper8 ((state[1] >> 8) & 255) << 16; + const u32x w3_t = uint_to_hex_upper8 ((state[1] >> 16) & 255) << 0 + | uint_to_hex_upper8 ((state[1] >> 24) & 255) << 16; + const u32x w4_t = uint_to_hex_upper8 ((state[2] >> 0) & 255) << 0 + | uint_to_hex_upper8 ((state[2] >> 8) & 255) << 16; + const u32x w5_t = uint_to_hex_upper8 ((state[2] >> 16) & 255) << 0 + | uint_to_hex_upper8 ((state[2] >> 24) & 255) << 16; + const u32x w6_t = uint_to_hex_upper8 ((state[3] >> 0) & 255) << 0 + | uint_to_hex_upper8 ((state[3] >> 8) & 255) << 16; + //const u32x w7_t = uint_to_hex_upper8 ((state[3] >> 16) & 255) << 0 + // | uint_to_hex_upper8 ((state[3] >> 24) & 255) << 16; + + const u32 pade = 0x0e0e0e0e; + + w[ 0] = salt0; + w[ 1] = salt1 | w0_t << 16; + w[ 2] = w0_t >> 16 | w1_t << 16; + w[ 3] = w1_t >> 16 | w2_t << 16; + w[ 4] = w2_t >> 16 | w3_t << 16; + w[ 5] = w3_t >> 16 | w4_t << 16; + w[ 6] = w4_t >> 16 | w5_t << 16; + w[ 7] = w5_t >> 16 | w6_t << 16; + w[ 8] = w6_t >> 16 | pade << 16; // | w7_t << 8; + w[ 9] = pade; + w[10] = pade; + w[11] = pade; + w[12] = 0; + w[13] = 0; + w[14] = 0; + w[15] = 0; + + state[0] = 0; + state[1] = 0; + state[2] = 0; + state[3] = 0; + + domino_big_md (w, 34, state, s_lotus_magic_table); + + u32x a = state[0] & 0xffffffff; + u32x b = state[1] & 0xffffffff; + u32x c = state[2] & 0x000000ff; + u32x d = state[3] & 0x00000000; + + const u32x r0 = a; + const u32x r1 = b; + const u32x r2 = c; + const u32x r3 = d; + + #include VECT_COMPARE_S + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m08700_s08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m08700_s16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/amd/m08700_a1.cl b/amd/m08700_a1.cl new file mode 100644 index 0000000000..7b1060a9d3 --- /dev/null +++ b/amd/m08700_a1.cl @@ -0,0 +1,831 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _LOTUS6_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW4 +#define VECT_SIZE2 +#endif + +#ifdef VLIW5 +#define VECT_SIZE2 +#endif + +#define DGST_R0 0 +#define DGST_R1 1 +#define DGST_R2 2 +#define DGST_R3 3 + +#include "include/kernel_functions.c" +#include "types_amd.c" +#include "common_amd.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +__constant u32 lotus_magic_table[256] = +{ + 0xbd, 0x56, 0xea, 0xf2, 0xa2, 0xf1, 0xac, 0x2a, + 0xb0, 0x93, 0xd1, 0x9c, 0x1b, 0x33, 0xfd, 0xd0, + 0x30, 0x04, 0xb6, 0xdc, 0x7d, 0xdf, 0x32, 0x4b, + 0xf7, 0xcb, 0x45, 0x9b, 0x31, 0xbb, 0x21, 0x5a, + 0x41, 0x9f, 0xe1, 0xd9, 0x4a, 0x4d, 0x9e, 0xda, + 0xa0, 0x68, 0x2c, 0xc3, 0x27, 0x5f, 0x80, 0x36, + 0x3e, 0xee, 0xfb, 0x95, 0x1a, 0xfe, 0xce, 0xa8, + 0x34, 0xa9, 0x13, 0xf0, 0xa6, 0x3f, 0xd8, 0x0c, + 0x78, 0x24, 0xaf, 0x23, 0x52, 0xc1, 0x67, 0x17, + 0xf5, 0x66, 0x90, 0xe7, 0xe8, 0x07, 0xb8, 0x60, + 0x48, 0xe6, 0x1e, 0x53, 0xf3, 0x92, 0xa4, 0x72, + 0x8c, 0x08, 0x15, 0x6e, 0x86, 0x00, 0x84, 0xfa, + 0xf4, 0x7f, 0x8a, 0x42, 0x19, 0xf6, 0xdb, 0xcd, + 0x14, 0x8d, 0x50, 0x12, 0xba, 0x3c, 0x06, 0x4e, + 0xec, 0xb3, 0x35, 0x11, 0xa1, 0x88, 0x8e, 0x2b, + 0x94, 0x99, 0xb7, 0x71, 0x74, 0xd3, 0xe4, 0xbf, + 0x3a, 0xde, 0x96, 0x0e, 0xbc, 0x0a, 0xed, 0x77, + 0xfc, 0x37, 0x6b, 0x03, 0x79, 0x89, 0x62, 0xc6, + 0xd7, 0xc0, 0xd2, 0x7c, 0x6a, 0x8b, 0x22, 0xa3, + 0x5b, 0x05, 0x5d, 0x02, 0x75, 0xd5, 0x61, 0xe3, + 0x18, 0x8f, 0x55, 0x51, 0xad, 0x1f, 0x0b, 0x5e, + 0x85, 0xe5, 0xc2, 0x57, 0x63, 0xca, 0x3d, 0x6c, + 0xb4, 0xc5, 0xcc, 0x70, 0xb2, 0x91, 0x59, 0x0d, + 0x47, 0x20, 0xc8, 0x4f, 0x58, 0xe0, 0x01, 0xe2, + 0x16, 0x38, 0xc4, 0x6f, 0x3b, 0x0f, 0x65, 0x46, + 0xbe, 0x7e, 0x2d, 0x7b, 0x82, 0xf9, 0x40, 0xb5, + 0x1d, 0x73, 0xf8, 0xeb, 0x26, 0xc7, 0x87, 0x97, + 0x25, 0x54, 0xb1, 0x28, 0xaa, 0x98, 0x9d, 0xa5, + 0x64, 0x6d, 0x7a, 0xd4, 0x10, 0x81, 0x44, 0xef, + 0x49, 0xd6, 0xae, 0x2e, 0xdd, 0x76, 0x5c, 0x2f, + 0xa7, 0x1c, 0xc9, 0x09, 0x69, 0x9a, 0x83, 0xcf, + 0x29, 0x39, 0xb9, 0xe9, 0x4c, 0xff, 0x43, 0xab, +}; + +#ifdef VECT_SIZE1 +#define BOX(S,i) (u32x) ((S)[(i)]) +#endif + +#ifdef VECT_SIZE2 +#define BOX(S,i) (u32x) ((S)[(i).s0], (S)[(i).s1]) +#endif + +#ifdef VECT_SIZE4 +#define BOX(S,i) (u32x) ((S)[(i).s0], (S)[(i).s1], (S)[(i).s2], (S)[(i).s3]) +#endif + +#ifdef VECT_SIZE1 +#define uint_to_hex_upper8(i) (u32x) (l_bin2asc[(i)]) +#endif + +#ifdef VECT_SIZE2 +#define uint_to_hex_upper8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1]) +#endif + +#ifdef VECT_SIZE4 +#define uint_to_hex_upper8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3]) +#endif + +static void lotus_mix (u32x *in, __local u32 s_lotus_magic_table[256]) +{ + u32x p = 0; + + for (int i = 0; i < 18; i++) + { + u32 s = 48; + + #pragma unroll + for (int j = 0; j < 12; j++) + { + u32x tmp_in = in[j]; + u32x tmp_out = 0; + + p = (p + s--) & 0xff; p = ((tmp_in >> 0) & 0xff) ^ BOX (s_lotus_magic_table, p); tmp_out |= p << 0; + p = (p + s--) & 0xff; p = ((tmp_in >> 8) & 0xff) ^ BOX (s_lotus_magic_table, p); tmp_out |= p << 8; + p = (p + s--) & 0xff; p = ((tmp_in >> 16) & 0xff) ^ BOX (s_lotus_magic_table, p); tmp_out |= p << 16; + p = (p + s--) & 0xff; p = ((tmp_in >> 24) & 0xff) ^ BOX (s_lotus_magic_table, p); tmp_out |= p << 24; + + in[j] = tmp_out; + } + } +} + +static void lotus_transform_password (u32x *in, u32x *out, __local u32 s_lotus_magic_table[256]) +{ + u32x t = out[3] >> 24; + + u32x c; + + //#pragma unroll // kernel fails if used + for (int i = 0; i < 4; i++) + { + t ^= (in[i] >> 0) & 0xff; c = BOX (s_lotus_magic_table, t); out[i] ^= c << 0; t = ((out[i] >> 0) & 0xff); + t ^= (in[i] >> 8) & 0xff; c = BOX (s_lotus_magic_table, t); out[i] ^= c << 8; t = ((out[i] >> 8) & 0xff); + t ^= (in[i] >> 16) & 0xff; c = BOX (s_lotus_magic_table, t); out[i] ^= c << 16; t = ((out[i] >> 16) & 0xff); + t ^= (in[i] >> 24) & 0xff; c = BOX (s_lotus_magic_table, t); out[i] ^= c << 24; t = ((out[i] >> 24) & 0xff); + } +} + +static void pad (u32x w[4], const u32 len) +{ + const u32 val = 16 - len; + + const u32 mask1 = val << 24; + + const u32 mask2 = val << 16 + | val << 24; + + const u32 mask3 = val << 8 + | val << 16 + | val << 24; + + const u32 mask4 = val << 0 + | val << 8 + | val << 16 + | val << 24; + + switch (len) + { + case 0: w[0] = mask4; + w[1] = mask4; + w[2] = mask4; + w[3] = mask4; + break; + case 1: w[0] |= mask3; + w[1] = mask4; + w[2] = mask4; + w[3] = mask4; + break; + case 2: w[0] |= mask2; + w[1] = mask4; + w[2] = mask4; + w[3] = mask4; + break; + case 3: w[0] |= mask1; + w[1] = mask4; + w[2] = mask4; + w[3] = mask4; + break; + case 4: w[1] = mask4; + w[2] = mask4; + w[3] = mask4; + break; + case 5: w[1] |= mask3; + w[2] = mask4; + w[3] = mask4; + break; + case 6: w[1] |= mask2; + w[2] = mask4; + w[3] = mask4; + break; + case 7: w[1] |= mask1; + w[2] = mask4; + w[3] = mask4; + break; + case 8: w[2] = mask4; + w[3] = mask4; + break; + case 9: w[2] |= mask3; + w[3] = mask4; + break; + case 10: w[2] |= mask2; + w[3] = mask4; + break; + case 11: w[2] |= mask1; + w[3] = mask4; + break; + case 12: w[3] = mask4; + break; + case 13: w[3] |= mask3; + break; + case 14: w[3] |= mask2; + break; + case 15: w[3] |= mask1; + break; + } +} + +static void mdtransform_norecalc (u32x state[4], u32x block[4], __local u32 s_lotus_magic_table[256]) +{ + u32x x[12]; + + x[ 0] = state[0]; + x[ 1] = state[1]; + x[ 2] = state[2]; + x[ 3] = state[3]; + x[ 4] = block[0]; + x[ 5] = block[1]; + x[ 6] = block[2]; + x[ 7] = block[3]; + x[ 8] = state[0] ^ block[0]; + x[ 9] = state[1] ^ block[1]; + x[10] = state[2] ^ block[2]; + x[11] = state[3] ^ block[3]; + + lotus_mix (x, s_lotus_magic_table); + + state[0] = x[0]; + state[1] = x[1]; + state[2] = x[2]; + state[3] = x[3]; +} + +static void mdtransform (u32x state[4], u32x checksum[4], u32x block[4], __local u32 s_lotus_magic_table[256]) +{ + mdtransform_norecalc (state, block, s_lotus_magic_table); + + lotus_transform_password (block, checksum, s_lotus_magic_table); +} + +static void domino_big_md (const u32x saved_key[16], const u32 size, u32x state[4], __local u32 s_lotus_magic_table[256]) +{ + u32x checksum[4]; + + checksum[0] = 0; + checksum[1] = 0; + checksum[2] = 0; + checksum[3] = 0; + + u32x block[4]; + + block[0] = 0; + block[1] = 0; + block[2] = 0; + block[3] = 0; + + u32 curpos; + u32 idx; + + for (curpos = 0, idx = 0; curpos + 16 < size; curpos += 16, idx += 4) + { + block[0] = saved_key[idx + 0]; + block[1] = saved_key[idx + 1]; + block[2] = saved_key[idx + 2]; + block[3] = saved_key[idx + 3]; + + mdtransform (state, checksum, block, s_lotus_magic_table); + } + + block[0] = saved_key[idx + 0]; + block[1] = saved_key[idx + 1]; + block[2] = saved_key[idx + 2]; + block[3] = saved_key[idx + 3]; + + mdtransform (state, checksum, block, s_lotus_magic_table); + + mdtransform_norecalc (state, checksum, s_lotus_magic_table); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m08700_m04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + /** + * bin2asc table + */ + + __local u32 l_bin2asc[256]; + + const u32 lid4 = lid * 4; + + const u32 lid40 = lid4 + 0; + const u32 lid41 = lid4 + 1; + const u32 lid42 = lid4 + 2; + const u32 lid43 = lid4 + 3; + + const u32 v400 = (lid40 >> 0) & 15; + const u32 v401 = (lid40 >> 4) & 15; + const u32 v410 = (lid41 >> 0) & 15; + const u32 v411 = (lid41 >> 4) & 15; + const u32 v420 = (lid42 >> 0) & 15; + const u32 v421 = (lid42 >> 4) & 15; + const u32 v430 = (lid43 >> 0) & 15; + const u32 v431 = (lid43 >> 4) & 15; + + l_bin2asc[lid40] = ((v400 < 10) ? '0' + v400 : 'A' - 10 + v400) << 8 + | ((v401 < 10) ? '0' + v401 : 'A' - 10 + v401) << 0; + l_bin2asc[lid41] = ((v410 < 10) ? '0' + v410 : 'A' - 10 + v410) << 8 + | ((v411 < 10) ? '0' + v411 : 'A' - 10 + v411) << 0; + l_bin2asc[lid42] = ((v420 < 10) ? '0' + v420 : 'A' - 10 + v420) << 8 + | ((v421 < 10) ? '0' + v421 : 'A' - 10 + v421) << 0; + l_bin2asc[lid43] = ((v430 < 10) ? '0' + v430 : 'A' - 10 + v430) << 8 + | ((v431 < 10) ? '0' + v431 : 'A' - 10 + v431) << 0; + + barrier (CLK_LOCAL_MEM_FENCE); + + /** + * sbox + */ + + __local u32 s_lotus_magic_table[256]; + + s_lotus_magic_table[lid4 + 0] = lotus_magic_table[lid4 + 0]; + s_lotus_magic_table[lid4 + 1] = lotus_magic_table[lid4 + 1]; + s_lotus_magic_table[lid4 + 2] = lotus_magic_table[lid4 + 2]; + s_lotus_magic_table[lid4 + 3] = lotus_magic_table[lid4 + 3]; + + barrier (CLK_LOCAL_MEM_FENCE); + + if (gid >= gid_max) return; + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, combs_buf[0].pw_len); + } + + /** + * salt + */ + + const u32 salt0 = salt_bufs[salt_pos].salt_buf[0]; + const u32 salt1 = salt_bufs[salt_pos].salt_buf[1] & 0xff | '(' << 8; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = combs_buf[il_pos].pw_len; + + const u32 pw_len = pw_l_len + pw_r_len; + + u32 wordr0[4]; + + wordr0[0] = combs_buf[il_pos].i[0]; + wordr0[1] = combs_buf[il_pos].i[1]; + wordr0[2] = combs_buf[il_pos].i[2]; + wordr0[3] = combs_buf[il_pos].i[3]; + + u32 wordr1[4]; + + wordr1[0] = combs_buf[il_pos].i[4]; + wordr1[1] = combs_buf[il_pos].i[5]; + wordr1[2] = combs_buf[il_pos].i[6]; + wordr1[3] = combs_buf[il_pos].i[7]; + + u32 wordr2[4]; + + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + + u32 wordr3[4]; + + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + u32x w[16]; + + w[ 0] = wordl0[0] | wordr0[0]; + w[ 1] = wordl0[1] | wordr0[1]; + w[ 2] = wordl0[2] | wordr0[2]; + w[ 3] = wordl0[3] | wordr0[3]; + w[ 4] = wordl1[0] | wordr1[0]; + w[ 5] = wordl1[1] | wordr1[1]; + w[ 6] = wordl1[2] | wordr1[2]; + w[ 7] = wordl1[3] | wordr1[3]; + w[ 8] = wordl2[0] | wordr2[0]; + w[ 9] = wordl2[1] | wordr2[1]; + w[10] = wordl2[2] | wordr2[2]; + w[11] = wordl2[3] | wordr2[3]; + w[12] = wordl3[0] | wordr3[0]; + w[13] = wordl3[1] | wordr3[1]; + w[14] = wordl3[2] | wordr3[2]; + w[15] = wordl3[3] | wordr3[3]; + + u32x state[4]; + + state[0] = 0; + state[1] = 0; + state[2] = 0; + state[3] = 0; + + /** + * padding + */ + + if (pw_len < 16) + { + pad (&w[ 0], pw_len & 0xf); + } + else if (pw_len < 32) + { + pad (&w[ 4], pw_len & 0xf); + } + else if (pw_len < 48) + { + pad (&w[ 8], pw_len & 0xf); + } + else if (pw_len < 64) + { + pad (&w[12], pw_len & 0xf); + } + + domino_big_md (w, pw_len, state, s_lotus_magic_table); + + const u32x w0_t = uint_to_hex_upper8 ((state[0] >> 0) & 255) << 0 + | uint_to_hex_upper8 ((state[0] >> 8) & 255) << 16; + const u32x w1_t = uint_to_hex_upper8 ((state[0] >> 16) & 255) << 0 + | uint_to_hex_upper8 ((state[0] >> 24) & 255) << 16; + const u32x w2_t = uint_to_hex_upper8 ((state[1] >> 0) & 255) << 0 + | uint_to_hex_upper8 ((state[1] >> 8) & 255) << 16; + const u32x w3_t = uint_to_hex_upper8 ((state[1] >> 16) & 255) << 0 + | uint_to_hex_upper8 ((state[1] >> 24) & 255) << 16; + const u32x w4_t = uint_to_hex_upper8 ((state[2] >> 0) & 255) << 0 + | uint_to_hex_upper8 ((state[2] >> 8) & 255) << 16; + const u32x w5_t = uint_to_hex_upper8 ((state[2] >> 16) & 255) << 0 + | uint_to_hex_upper8 ((state[2] >> 24) & 255) << 16; + const u32x w6_t = uint_to_hex_upper8 ((state[3] >> 0) & 255) << 0 + | uint_to_hex_upper8 ((state[3] >> 8) & 255) << 16; + //const u32x w7_t = uint_to_hex_upper8 ((state[3] >> 16) & 255) << 0 + // | uint_to_hex_upper8 ((state[3] >> 24) & 255) << 16; + + const u32 pade = 0x0e0e0e0e; + + w[ 0] = salt0; + w[ 1] = salt1 | w0_t << 16; + w[ 2] = w0_t >> 16 | w1_t << 16; + w[ 3] = w1_t >> 16 | w2_t << 16; + w[ 4] = w2_t >> 16 | w3_t << 16; + w[ 5] = w3_t >> 16 | w4_t << 16; + w[ 6] = w4_t >> 16 | w5_t << 16; + w[ 7] = w5_t >> 16 | w6_t << 16; + w[ 8] = w6_t >> 16 | pade << 16; // | w7_t << 8; + w[ 9] = pade; + w[10] = pade; + w[11] = pade; + w[12] = 0; + w[13] = 0; + w[14] = 0; + w[15] = 0; + + state[0] = 0; + state[1] = 0; + state[2] = 0; + state[3] = 0; + + domino_big_md (w, 34, state, s_lotus_magic_table); + + u32x a = state[0] & 0xffffffff; + u32x b = state[1] & 0xffffffff; + u32x c = state[2] & 0x000000ff; + u32x d = state[3] & 0x00000000; + + const u32x r0 = a; + const u32x r1 = b; + const u32x r2 = c; + const u32x r3 = d; + + #include VECT_COMPARE_M + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m08700_m08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m08700_m16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m08700_s04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + /** + * bin2asc table + */ + + __local u32 l_bin2asc[256]; + + const u32 lid4 = lid * 4; + + const u32 lid40 = lid4 + 0; + const u32 lid41 = lid4 + 1; + const u32 lid42 = lid4 + 2; + const u32 lid43 = lid4 + 3; + + const u32 v400 = (lid40 >> 0) & 15; + const u32 v401 = (lid40 >> 4) & 15; + const u32 v410 = (lid41 >> 0) & 15; + const u32 v411 = (lid41 >> 4) & 15; + const u32 v420 = (lid42 >> 0) & 15; + const u32 v421 = (lid42 >> 4) & 15; + const u32 v430 = (lid43 >> 0) & 15; + const u32 v431 = (lid43 >> 4) & 15; + + l_bin2asc[lid40] = ((v400 < 10) ? '0' + v400 : 'A' - 10 + v400) << 8 + | ((v401 < 10) ? '0' + v401 : 'A' - 10 + v401) << 0; + l_bin2asc[lid41] = ((v410 < 10) ? '0' + v410 : 'A' - 10 + v410) << 8 + | ((v411 < 10) ? '0' + v411 : 'A' - 10 + v411) << 0; + l_bin2asc[lid42] = ((v420 < 10) ? '0' + v420 : 'A' - 10 + v420) << 8 + | ((v421 < 10) ? '0' + v421 : 'A' - 10 + v421) << 0; + l_bin2asc[lid43] = ((v430 < 10) ? '0' + v430 : 'A' - 10 + v430) << 8 + | ((v431 < 10) ? '0' + v431 : 'A' - 10 + v431) << 0; + + barrier (CLK_LOCAL_MEM_FENCE); + + /** + * sbox + */ + + __local u32 s_lotus_magic_table[256]; + + s_lotus_magic_table[lid4 + 0] = lotus_magic_table[lid4 + 0]; + s_lotus_magic_table[lid4 + 1] = lotus_magic_table[lid4 + 1]; + s_lotus_magic_table[lid4 + 2] = lotus_magic_table[lid4 + 2]; + s_lotus_magic_table[lid4 + 3] = lotus_magic_table[lid4 + 3]; + + barrier (CLK_LOCAL_MEM_FENCE); + + if (gid >= gid_max) return; + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, combs_buf[0].pw_len); + } + + /** + * salt + */ + + const u32 salt0 = salt_bufs[salt_pos].salt_buf[0]; + const u32 salt1 = salt_bufs[salt_pos].salt_buf[1] & 0xff | '(' << 8; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = combs_buf[il_pos].pw_len; + + const u32 pw_len = pw_l_len + pw_r_len; + + u32 wordr0[4]; + + wordr0[0] = combs_buf[il_pos].i[0]; + wordr0[1] = combs_buf[il_pos].i[1]; + wordr0[2] = combs_buf[il_pos].i[2]; + wordr0[3] = combs_buf[il_pos].i[3]; + + u32 wordr1[4]; + + wordr1[0] = combs_buf[il_pos].i[4]; + wordr1[1] = combs_buf[il_pos].i[5]; + wordr1[2] = combs_buf[il_pos].i[6]; + wordr1[3] = combs_buf[il_pos].i[7]; + + u32 wordr2[4]; + + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + + u32 wordr3[4]; + + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + u32x w[16]; + + w[ 0] = wordl0[0] | wordr0[0]; + w[ 1] = wordl0[1] | wordr0[1]; + w[ 2] = wordl0[2] | wordr0[2]; + w[ 3] = wordl0[3] | wordr0[3]; + w[ 4] = wordl1[0] | wordr1[0]; + w[ 5] = wordl1[1] | wordr1[1]; + w[ 6] = wordl1[2] | wordr1[2]; + w[ 7] = wordl1[3] | wordr1[3]; + w[ 8] = wordl2[0] | wordr2[0]; + w[ 9] = wordl2[1] | wordr2[1]; + w[10] = wordl2[2] | wordr2[2]; + w[11] = wordl2[3] | wordr2[3]; + w[12] = wordl3[0] | wordr3[0]; + w[13] = wordl3[1] | wordr3[1]; + w[14] = wordl3[2] | wordr3[2]; + w[15] = wordl3[3] | wordr3[3]; + + u32x state[4]; + + state[0] = 0; + state[1] = 0; + state[2] = 0; + state[3] = 0; + + /** + * padding + */ + + if (pw_len < 16) + { + pad (&w[ 0], pw_len & 0xf); + } + else if (pw_len < 32) + { + pad (&w[ 4], pw_len & 0xf); + } + else if (pw_len < 48) + { + pad (&w[ 8], pw_len & 0xf); + } + else if (pw_len < 64) + { + pad (&w[12], pw_len & 0xf); + } + + domino_big_md (w, pw_len, state, s_lotus_magic_table); + + const u32x w0_t = uint_to_hex_upper8 ((state[0] >> 0) & 255) << 0 + | uint_to_hex_upper8 ((state[0] >> 8) & 255) << 16; + const u32x w1_t = uint_to_hex_upper8 ((state[0] >> 16) & 255) << 0 + | uint_to_hex_upper8 ((state[0] >> 24) & 255) << 16; + const u32x w2_t = uint_to_hex_upper8 ((state[1] >> 0) & 255) << 0 + | uint_to_hex_upper8 ((state[1] >> 8) & 255) << 16; + const u32x w3_t = uint_to_hex_upper8 ((state[1] >> 16) & 255) << 0 + | uint_to_hex_upper8 ((state[1] >> 24) & 255) << 16; + const u32x w4_t = uint_to_hex_upper8 ((state[2] >> 0) & 255) << 0 + | uint_to_hex_upper8 ((state[2] >> 8) & 255) << 16; + const u32x w5_t = uint_to_hex_upper8 ((state[2] >> 16) & 255) << 0 + | uint_to_hex_upper8 ((state[2] >> 24) & 255) << 16; + const u32x w6_t = uint_to_hex_upper8 ((state[3] >> 0) & 255) << 0 + | uint_to_hex_upper8 ((state[3] >> 8) & 255) << 16; + //const u32x w7_t = uint_to_hex_upper8 ((state[3] >> 16) & 255) << 0 + // | uint_to_hex_upper8 ((state[3] >> 24) & 255) << 16; + + const u32 pade = 0x0e0e0e0e; + + w[ 0] = salt0; + w[ 1] = salt1 | w0_t << 16; + w[ 2] = w0_t >> 16 | w1_t << 16; + w[ 3] = w1_t >> 16 | w2_t << 16; + w[ 4] = w2_t >> 16 | w3_t << 16; + w[ 5] = w3_t >> 16 | w4_t << 16; + w[ 6] = w4_t >> 16 | w5_t << 16; + w[ 7] = w5_t >> 16 | w6_t << 16; + w[ 8] = w6_t >> 16 | pade << 16; // | w7_t << 8; + w[ 9] = pade; + w[10] = pade; + w[11] = pade; + w[12] = 0; + w[13] = 0; + w[14] = 0; + w[15] = 0; + + state[0] = 0; + state[1] = 0; + state[2] = 0; + state[3] = 0; + + domino_big_md (w, 34, state, s_lotus_magic_table); + + u32x a = state[0] & 0xffffffff; + u32x b = state[1] & 0xffffffff; + u32x c = state[2] & 0x000000ff; + u32x d = state[3] & 0x00000000; + + const u32x r0 = a; + const u32x r1 = b; + const u32x r2 = c; + const u32x r3 = d; + + #include VECT_COMPARE_S + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m08700_s08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m08700_s16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/amd/m08700_a3.cl b/amd/m08700_a3.cl new file mode 100644 index 0000000000..e2b66d6e67 --- /dev/null +++ b/amd/m08700_a3.cl @@ -0,0 +1,1090 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _LOTUS6_ +#define _SCALAR_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW4 +#define VECT_SIZE2 +#endif + +#ifdef VLIW5 +#define VECT_SIZE2 +#endif + +#define DGST_R0 0 +#define DGST_R1 1 +#define DGST_R2 2 +#define DGST_R3 3 + +#include "include/kernel_functions.c" +#include "types_amd.c" +#include "common_amd.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4_warp.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4_warp.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4_warp.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4_warp.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4_warp.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4_warp.c" +#endif + +__constant u32 lotus_magic_table[256] = +{ + 0xbd, 0x56, 0xea, 0xf2, 0xa2, 0xf1, 0xac, 0x2a, + 0xb0, 0x93, 0xd1, 0x9c, 0x1b, 0x33, 0xfd, 0xd0, + 0x30, 0x04, 0xb6, 0xdc, 0x7d, 0xdf, 0x32, 0x4b, + 0xf7, 0xcb, 0x45, 0x9b, 0x31, 0xbb, 0x21, 0x5a, + 0x41, 0x9f, 0xe1, 0xd9, 0x4a, 0x4d, 0x9e, 0xda, + 0xa0, 0x68, 0x2c, 0xc3, 0x27, 0x5f, 0x80, 0x36, + 0x3e, 0xee, 0xfb, 0x95, 0x1a, 0xfe, 0xce, 0xa8, + 0x34, 0xa9, 0x13, 0xf0, 0xa6, 0x3f, 0xd8, 0x0c, + 0x78, 0x24, 0xaf, 0x23, 0x52, 0xc1, 0x67, 0x17, + 0xf5, 0x66, 0x90, 0xe7, 0xe8, 0x07, 0xb8, 0x60, + 0x48, 0xe6, 0x1e, 0x53, 0xf3, 0x92, 0xa4, 0x72, + 0x8c, 0x08, 0x15, 0x6e, 0x86, 0x00, 0x84, 0xfa, + 0xf4, 0x7f, 0x8a, 0x42, 0x19, 0xf6, 0xdb, 0xcd, + 0x14, 0x8d, 0x50, 0x12, 0xba, 0x3c, 0x06, 0x4e, + 0xec, 0xb3, 0x35, 0x11, 0xa1, 0x88, 0x8e, 0x2b, + 0x94, 0x99, 0xb7, 0x71, 0x74, 0xd3, 0xe4, 0xbf, + 0x3a, 0xde, 0x96, 0x0e, 0xbc, 0x0a, 0xed, 0x77, + 0xfc, 0x37, 0x6b, 0x03, 0x79, 0x89, 0x62, 0xc6, + 0xd7, 0xc0, 0xd2, 0x7c, 0x6a, 0x8b, 0x22, 0xa3, + 0x5b, 0x05, 0x5d, 0x02, 0x75, 0xd5, 0x61, 0xe3, + 0x18, 0x8f, 0x55, 0x51, 0xad, 0x1f, 0x0b, 0x5e, + 0x85, 0xe5, 0xc2, 0x57, 0x63, 0xca, 0x3d, 0x6c, + 0xb4, 0xc5, 0xcc, 0x70, 0xb2, 0x91, 0x59, 0x0d, + 0x47, 0x20, 0xc8, 0x4f, 0x58, 0xe0, 0x01, 0xe2, + 0x16, 0x38, 0xc4, 0x6f, 0x3b, 0x0f, 0x65, 0x46, + 0xbe, 0x7e, 0x2d, 0x7b, 0x82, 0xf9, 0x40, 0xb5, + 0x1d, 0x73, 0xf8, 0xeb, 0x26, 0xc7, 0x87, 0x97, + 0x25, 0x54, 0xb1, 0x28, 0xaa, 0x98, 0x9d, 0xa5, + 0x64, 0x6d, 0x7a, 0xd4, 0x10, 0x81, 0x44, 0xef, + 0x49, 0xd6, 0xae, 0x2e, 0xdd, 0x76, 0x5c, 0x2f, + 0xa7, 0x1c, 0xc9, 0x09, 0x69, 0x9a, 0x83, 0xcf, + 0x29, 0x39, 0xb9, 0xe9, 0x4c, 0xff, 0x43, 0xab, +}; + +#ifdef VECT_SIZE1 +#define BOX(S,i) (u32x) ((S)[(i)]) +#endif + +#ifdef VECT_SIZE2 +#define BOX(S,i) (u32x) ((S)[(i).s0], (S)[(i).s1]) +#endif + +#ifdef VECT_SIZE4 +#define BOX(S,i) (u32x) ((S)[(i).s0], (S)[(i).s1], (S)[(i).s2], (S)[(i).s3]) +#endif + +#ifdef VECT_SIZE1 +#define uint_to_hex_upper8(i) (u32x) (l_bin2asc[(i)]) +#endif + +#ifdef VECT_SIZE2 +#define uint_to_hex_upper8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1]) +#endif + +#ifdef VECT_SIZE4 +#define uint_to_hex_upper8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3]) +#endif + +static void lotus_mix (u32x *in, __local u32 s_lotus_magic_table[256]) +{ + u32x p = 0; + + for (int i = 0; i < 18; i++) + { + u32 s = 48; + + #pragma unroll + for (int j = 0; j < 12; j++) + { + u32x tmp_in = in[j]; + u32x tmp_out = 0; + + p = (p + s--) & 0xff; p = ((tmp_in >> 0) & 0xff) ^ BOX (s_lotus_magic_table, p); tmp_out |= p << 0; + p = (p + s--) & 0xff; p = ((tmp_in >> 8) & 0xff) ^ BOX (s_lotus_magic_table, p); tmp_out |= p << 8; + p = (p + s--) & 0xff; p = ((tmp_in >> 16) & 0xff) ^ BOX (s_lotus_magic_table, p); tmp_out |= p << 16; + p = (p + s--) & 0xff; p = ((tmp_in >> 24) & 0xff) ^ BOX (s_lotus_magic_table, p); tmp_out |= p << 24; + + in[j] = tmp_out; + } + } +} + +static void lotus_transform_password (u32x *in, u32x *out, __local u32 s_lotus_magic_table[256]) +{ + u32x t = out[3] >> 24; + + u32x c; + + //#pragma unroll // kernel fails if used + for (int i = 0; i < 4; i++) + { + t ^= (in[i] >> 0) & 0xff; c = BOX (s_lotus_magic_table, t); out[i] ^= c << 0; t = ((out[i] >> 0) & 0xff); + t ^= (in[i] >> 8) & 0xff; c = BOX (s_lotus_magic_table, t); out[i] ^= c << 8; t = ((out[i] >> 8) & 0xff); + t ^= (in[i] >> 16) & 0xff; c = BOX (s_lotus_magic_table, t); out[i] ^= c << 16; t = ((out[i] >> 16) & 0xff); + t ^= (in[i] >> 24) & 0xff; c = BOX (s_lotus_magic_table, t); out[i] ^= c << 24; t = ((out[i] >> 24) & 0xff); + } +} + +static void pad (u32 w[4], const u32 len) +{ + const u32 val = 16 - len; + + const u32 mask1 = val << 24; + + const u32 mask2 = val << 16 + | val << 24; + + const u32 mask3 = val << 8 + | val << 16 + | val << 24; + + const u32 mask4 = val << 0 + | val << 8 + | val << 16 + | val << 24; + + switch (len) + { + case 0: w[0] = mask4; + w[1] = mask4; + w[2] = mask4; + w[3] = mask4; + break; + case 1: w[0] |= mask3; + w[1] = mask4; + w[2] = mask4; + w[3] = mask4; + break; + case 2: w[0] |= mask2; + w[1] = mask4; + w[2] = mask4; + w[3] = mask4; + break; + case 3: w[0] |= mask1; + w[1] = mask4; + w[2] = mask4; + w[3] = mask4; + break; + case 4: w[1] = mask4; + w[2] = mask4; + w[3] = mask4; + break; + case 5: w[1] |= mask3; + w[2] = mask4; + w[3] = mask4; + break; + case 6: w[1] |= mask2; + w[2] = mask4; + w[3] = mask4; + break; + case 7: w[1] |= mask1; + w[2] = mask4; + w[3] = mask4; + break; + case 8: w[2] = mask4; + w[3] = mask4; + break; + case 9: w[2] |= mask3; + w[3] = mask4; + break; + case 10: w[2] |= mask2; + w[3] = mask4; + break; + case 11: w[2] |= mask1; + w[3] = mask4; + break; + case 12: w[3] = mask4; + break; + case 13: w[3] |= mask3; + break; + case 14: w[3] |= mask2; + break; + case 15: w[3] |= mask1; + break; + } +} + +static void mdtransform_norecalc (u32x state[4], u32x block[4], __local u32 s_lotus_magic_table[256]) +{ + u32x x[12]; + + x[ 0] = state[0]; + x[ 1] = state[1]; + x[ 2] = state[2]; + x[ 3] = state[3]; + x[ 4] = block[0]; + x[ 5] = block[1]; + x[ 6] = block[2]; + x[ 7] = block[3]; + x[ 8] = state[0] ^ block[0]; + x[ 9] = state[1] ^ block[1]; + x[10] = state[2] ^ block[2]; + x[11] = state[3] ^ block[3]; + + lotus_mix (x, s_lotus_magic_table); + + state[0] = x[0]; + state[1] = x[1]; + state[2] = x[2]; + state[3] = x[3]; +} + +static void mdtransform (u32x state[4], u32x checksum[4], u32x block[4], __local u32 s_lotus_magic_table[256]) +{ + mdtransform_norecalc (state, block, s_lotus_magic_table); + + lotus_transform_password (block, checksum, s_lotus_magic_table); +} + +static void domino_big_md (const u32x saved_key[16], const u32 size, u32x state[4], __local u32 s_lotus_magic_table[256]) +{ + u32x checksum[4]; + + checksum[0] = 0; + checksum[1] = 0; + checksum[2] = 0; + checksum[3] = 0; + + u32x block[4]; + + block[0] = 0; + block[1] = 0; + block[2] = 0; + block[3] = 0; + + u32 curpos; + u32 idx; + + for (curpos = 0, idx = 0; curpos + 16 < size; curpos += 16, idx += 4) + { + block[0] = saved_key[idx + 0]; + block[1] = saved_key[idx + 1]; + block[2] = saved_key[idx + 2]; + block[3] = saved_key[idx + 3]; + + mdtransform (state, checksum, block, s_lotus_magic_table); + } + + block[0] = saved_key[idx + 0]; + block[1] = saved_key[idx + 1]; + block[2] = saved_key[idx + 2]; + block[3] = saved_key[idx + 3]; + + mdtransform (state, checksum, block, s_lotus_magic_table); + + mdtransform_norecalc (state, checksum, s_lotus_magic_table); +} + +static void m08700m (__local u32 s_lotus_magic_table[256], __local u32 l_bin2asc[256], u32 w[16], const u32 pw_len, __global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global u32x * words_buf_r, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset) +{ + /** + * modifier + */ + + const u32 gid = get_global_id (0); + const u32 lid = get_local_id (0); + + /** + * padding + */ + + if (pw_len < 16) + { + pad (&w[ 0], pw_len & 0xf); + } + else if (pw_len < 32) + { + pad (&w[ 4], pw_len & 0xf); + } + else if (pw_len < 48) + { + pad (&w[ 8], pw_len & 0xf); + } + else if (pw_len < 64) + { + pad (&w[12], pw_len & 0xf); + } + + /** + * salt + */ + + const u32 salt0 = salt_bufs[salt_pos].salt_buf[0]; + const u32 salt1 = salt_bufs[salt_pos].salt_buf[1] & 0xff | '(' << 8; + + /** + * loop + */ + + const u32 bf_loops = ceil ((float) bfs_cnt / VECT_DIV); + + u32x w0l = w[0]; + + for (u32 il_pos = 0; il_pos < bf_loops; il_pos++) + { + const u32x w0r = words_buf_r[il_pos]; + + const u32x w0 = w0l | w0r; + + u32x w_tmp[16]; + + w_tmp[ 0] = w0; + w_tmp[ 1] = w[ 1]; + w_tmp[ 2] = w[ 2]; + w_tmp[ 3] = w[ 3]; + w_tmp[ 4] = w[ 4]; + w_tmp[ 5] = w[ 5]; + w_tmp[ 6] = w[ 6]; + w_tmp[ 7] = w[ 7]; + w_tmp[ 8] = w[ 8]; + w_tmp[ 9] = w[ 9]; + w_tmp[10] = w[10]; + w_tmp[11] = w[11]; + w_tmp[12] = w[12]; + w_tmp[13] = w[13]; + w_tmp[14] = w[14]; + w_tmp[15] = w[15]; + + u32x state[4]; + + state[0] = 0; + state[1] = 0; + state[2] = 0; + state[3] = 0; + + domino_big_md (w_tmp, pw_len, state, s_lotus_magic_table); + + const u32x w0_t = uint_to_hex_upper8 ((state[0] >> 0) & 255) << 0 + | uint_to_hex_upper8 ((state[0] >> 8) & 255) << 16; + const u32x w1_t = uint_to_hex_upper8 ((state[0] >> 16) & 255) << 0 + | uint_to_hex_upper8 ((state[0] >> 24) & 255) << 16; + const u32x w2_t = uint_to_hex_upper8 ((state[1] >> 0) & 255) << 0 + | uint_to_hex_upper8 ((state[1] >> 8) & 255) << 16; + const u32x w3_t = uint_to_hex_upper8 ((state[1] >> 16) & 255) << 0 + | uint_to_hex_upper8 ((state[1] >> 24) & 255) << 16; + const u32x w4_t = uint_to_hex_upper8 ((state[2] >> 0) & 255) << 0 + | uint_to_hex_upper8 ((state[2] >> 8) & 255) << 16; + const u32x w5_t = uint_to_hex_upper8 ((state[2] >> 16) & 255) << 0 + | uint_to_hex_upper8 ((state[2] >> 24) & 255) << 16; + const u32x w6_t = uint_to_hex_upper8 ((state[3] >> 0) & 255) << 0 + | uint_to_hex_upper8 ((state[3] >> 8) & 255) << 16; + //const u32x w7_t = uint_to_hex_upper8 ((state[3] >> 16) & 255) << 0 + // | uint_to_hex_upper8 ((state[3] >> 24) & 255) << 16; + + const u32 pade = 0x0e0e0e0e; + + w_tmp[ 0] = salt0; + w_tmp[ 1] = salt1 | w0_t << 16; + w_tmp[ 2] = w0_t >> 16 | w1_t << 16; + w_tmp[ 3] = w1_t >> 16 | w2_t << 16; + w_tmp[ 4] = w2_t >> 16 | w3_t << 16; + w_tmp[ 5] = w3_t >> 16 | w4_t << 16; + w_tmp[ 6] = w4_t >> 16 | w5_t << 16; + w_tmp[ 7] = w5_t >> 16 | w6_t << 16; + w_tmp[ 8] = w6_t >> 16 | pade << 16; // | w7_t << 8; + w_tmp[ 9] = pade; + w_tmp[10] = pade; + w_tmp[11] = pade; + w_tmp[12] = 0; + w_tmp[13] = 0; + w_tmp[14] = 0; + w_tmp[15] = 0; + + state[0] = 0; + state[1] = 0; + state[2] = 0; + state[3] = 0; + + domino_big_md (w_tmp, 34, state, s_lotus_magic_table); + + u32x a = state[0] & 0xffffffff; + u32x b = state[1] & 0xffffffff; + u32x c = state[2] & 0x000000ff; + u32x d = state[3] & 0x00000000; + + const u32x r0 = a; + const u32x r1 = b; + const u32x r2 = c; + const u32x r3 = d; + + #include VECT_COMPARE_M + } +} + +static void m08700s (__local u32 s_lotus_magic_table[256], __local u32 l_bin2asc[256], u32 w[16], const u32 pw_len, __global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global u32x * words_buf_r, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset) +{ + /** + * modifier + */ + + const u32 gid = get_global_id (0); + const u32 lid = get_local_id (0); + + /** + * base + */ + + if (pw_len < 16) + { + pad (&w[ 0], pw_len & 0xf); + } + else if (pw_len < 32) + { + pad (&w[ 4], pw_len & 0xf); + } + else if (pw_len < 48) + { + pad (&w[ 8], pw_len & 0xf); + } + else if (pw_len < 64) + { + pad (&w[12], pw_len & 0xf); + } + + /** + * salt + */ + + const u32 salt0 = salt_bufs[salt_pos].salt_buf[0]; + const u32 salt1 = salt_bufs[salt_pos].salt_buf[1] & 0xff | '(' << 8; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * loop + */ + + const u32 bf_loops = ceil ((float) bfs_cnt / VECT_DIV); + + u32x w0l = w[0]; + + for (u32 il_pos = 0; il_pos < bf_loops; il_pos++) + { + const u32x w0r = words_buf_r[il_pos]; + + const u32x w0 = w0l | w0r; + + u32x w_tmp[16]; + + w_tmp[ 0] = w0; + w_tmp[ 1] = w[ 1]; + w_tmp[ 2] = w[ 2]; + w_tmp[ 3] = w[ 3]; + w_tmp[ 4] = w[ 4]; + w_tmp[ 5] = w[ 5]; + w_tmp[ 6] = w[ 6]; + w_tmp[ 7] = w[ 7]; + w_tmp[ 8] = w[ 8]; + w_tmp[ 9] = w[ 9]; + w_tmp[10] = w[10]; + w_tmp[11] = w[11]; + w_tmp[12] = w[12]; + w_tmp[13] = w[13]; + w_tmp[14] = w[14]; + w_tmp[15] = w[15]; + + u32x state[4]; + + state[0] = 0; + state[1] = 0; + state[2] = 0; + state[3] = 0; + + domino_big_md (w_tmp, pw_len, state, s_lotus_magic_table); + + const u32x w0_t = uint_to_hex_upper8 ((state[0] >> 0) & 255) << 0 + | uint_to_hex_upper8 ((state[0] >> 8) & 255) << 16; + const u32x w1_t = uint_to_hex_upper8 ((state[0] >> 16) & 255) << 0 + | uint_to_hex_upper8 ((state[0] >> 24) & 255) << 16; + const u32x w2_t = uint_to_hex_upper8 ((state[1] >> 0) & 255) << 0 + | uint_to_hex_upper8 ((state[1] >> 8) & 255) << 16; + const u32x w3_t = uint_to_hex_upper8 ((state[1] >> 16) & 255) << 0 + | uint_to_hex_upper8 ((state[1] >> 24) & 255) << 16; + const u32x w4_t = uint_to_hex_upper8 ((state[2] >> 0) & 255) << 0 + | uint_to_hex_upper8 ((state[2] >> 8) & 255) << 16; + const u32x w5_t = uint_to_hex_upper8 ((state[2] >> 16) & 255) << 0 + | uint_to_hex_upper8 ((state[2] >> 24) & 255) << 16; + const u32x w6_t = uint_to_hex_upper8 ((state[3] >> 0) & 255) << 0 + | uint_to_hex_upper8 ((state[3] >> 8) & 255) << 16; + //const u32x w7_t = uint_to_hex_upper8 ((state[3] >> 16) & 255) << 0 + // | uint_to_hex_upper8 ((state[3] >> 24) & 255) << 16; + + const u32 pade = 0x0e0e0e0e; + + w_tmp[ 0] = salt0; + w_tmp[ 1] = salt1 | w0_t << 16; + w_tmp[ 2] = w0_t >> 16 | w1_t << 16; + w_tmp[ 3] = w1_t >> 16 | w2_t << 16; + w_tmp[ 4] = w2_t >> 16 | w3_t << 16; + w_tmp[ 5] = w3_t >> 16 | w4_t << 16; + w_tmp[ 6] = w4_t >> 16 | w5_t << 16; + w_tmp[ 7] = w5_t >> 16 | w6_t << 16; + w_tmp[ 8] = w6_t >> 16 | pade << 16; // | w7_t << 8; + w_tmp[ 9] = pade; + w_tmp[10] = pade; + w_tmp[11] = pade; + w_tmp[12] = 0; + w_tmp[13] = 0; + w_tmp[14] = 0; + w_tmp[15] = 0; + + state[0] = 0; + state[1] = 0; + state[2] = 0; + state[3] = 0; + + domino_big_md (w_tmp, 34, state, s_lotus_magic_table); + + u32x a = state[0] & 0xffffffff; + u32x b = state[1] & 0xffffffff; + u32x c = state[2] & 0x000000ff; + u32x d = state[3] & 0x00000000; + + const u32x r0 = a; + const u32x r1 = b; + const u32x r2 = c; + const u32x r3 = d; + + #include VECT_COMPARE_S + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m08700_m04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global u32x * words_buf_r, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + const u32 lid = get_local_id (0); + + u32 w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = 0; + w[ 5] = 0; + w[ 6] = 0; + w[ 7] = 0; + w[ 8] = 0; + w[ 9] = 0; + w[10] = 0; + w[11] = 0; + w[12] = 0; + w[13] = 0; + w[14] = 0; + w[15] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * bin2asc table + */ + + __local u32 l_bin2asc[256]; + + const u32 lid4 = lid * 4; + + const u32 lid40 = lid4 + 0; + const u32 lid41 = lid4 + 1; + const u32 lid42 = lid4 + 2; + const u32 lid43 = lid4 + 3; + + const u32 v400 = (lid40 >> 0) & 15; + const u32 v401 = (lid40 >> 4) & 15; + const u32 v410 = (lid41 >> 0) & 15; + const u32 v411 = (lid41 >> 4) & 15; + const u32 v420 = (lid42 >> 0) & 15; + const u32 v421 = (lid42 >> 4) & 15; + const u32 v430 = (lid43 >> 0) & 15; + const u32 v431 = (lid43 >> 4) & 15; + + l_bin2asc[lid40] = ((v400 < 10) ? '0' + v400 : 'A' - 10 + v400) << 8 + | ((v401 < 10) ? '0' + v401 : 'A' - 10 + v401) << 0; + l_bin2asc[lid41] = ((v410 < 10) ? '0' + v410 : 'A' - 10 + v410) << 8 + | ((v411 < 10) ? '0' + v411 : 'A' - 10 + v411) << 0; + l_bin2asc[lid42] = ((v420 < 10) ? '0' + v420 : 'A' - 10 + v420) << 8 + | ((v421 < 10) ? '0' + v421 : 'A' - 10 + v421) << 0; + l_bin2asc[lid43] = ((v430 < 10) ? '0' + v430 : 'A' - 10 + v430) << 8 + | ((v431 < 10) ? '0' + v431 : 'A' - 10 + v431) << 0; + + barrier (CLK_LOCAL_MEM_FENCE); + + /** + * sbox + */ + + __local u32 s_lotus_magic_table[256]; + + s_lotus_magic_table[lid4 + 0] = lotus_magic_table[lid4 + 0]; + s_lotus_magic_table[lid4 + 1] = lotus_magic_table[lid4 + 1]; + s_lotus_magic_table[lid4 + 2] = lotus_magic_table[lid4 + 2]; + s_lotus_magic_table[lid4 + 3] = lotus_magic_table[lid4 + 3]; + + barrier (CLK_LOCAL_MEM_FENCE); + + if (gid >= gid_max) return; + + /** + * main + */ + + m08700m (s_lotus_magic_table, l_bin2asc, w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m08700_m08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global u32x * words_buf_r, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + const u32 lid = get_local_id (0); + + u32 w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = pws[gid].i[ 4]; + w[ 5] = pws[gid].i[ 5]; + w[ 6] = pws[gid].i[ 6]; + w[ 7] = pws[gid].i[ 7]; + w[ 8] = 0; + w[ 9] = 0; + w[10] = 0; + w[11] = 0; + w[12] = 0; + w[13] = 0; + w[14] = 0; + w[15] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * bin2asc table + */ + + __local u32 l_bin2asc[256]; + + const u32 lid4 = lid * 4; + + const u32 lid40 = lid4 + 0; + const u32 lid41 = lid4 + 1; + const u32 lid42 = lid4 + 2; + const u32 lid43 = lid4 + 3; + + const u32 v400 = (lid40 >> 0) & 15; + const u32 v401 = (lid40 >> 4) & 15; + const u32 v410 = (lid41 >> 0) & 15; + const u32 v411 = (lid41 >> 4) & 15; + const u32 v420 = (lid42 >> 0) & 15; + const u32 v421 = (lid42 >> 4) & 15; + const u32 v430 = (lid43 >> 0) & 15; + const u32 v431 = (lid43 >> 4) & 15; + + l_bin2asc[lid40] = ((v400 < 10) ? '0' + v400 : 'A' - 10 + v400) << 8 + | ((v401 < 10) ? '0' + v401 : 'A' - 10 + v401) << 0; + l_bin2asc[lid41] = ((v410 < 10) ? '0' + v410 : 'A' - 10 + v410) << 8 + | ((v411 < 10) ? '0' + v411 : 'A' - 10 + v411) << 0; + l_bin2asc[lid42] = ((v420 < 10) ? '0' + v420 : 'A' - 10 + v420) << 8 + | ((v421 < 10) ? '0' + v421 : 'A' - 10 + v421) << 0; + l_bin2asc[lid43] = ((v430 < 10) ? '0' + v430 : 'A' - 10 + v430) << 8 + | ((v431 < 10) ? '0' + v431 : 'A' - 10 + v431) << 0; + + barrier (CLK_LOCAL_MEM_FENCE); + + /** + * sbox + */ + + __local u32 s_lotus_magic_table[256]; + + s_lotus_magic_table[lid4 + 0] = lotus_magic_table[lid4 + 0]; + s_lotus_magic_table[lid4 + 1] = lotus_magic_table[lid4 + 1]; + s_lotus_magic_table[lid4 + 2] = lotus_magic_table[lid4 + 2]; + s_lotus_magic_table[lid4 + 3] = lotus_magic_table[lid4 + 3]; + + barrier (CLK_LOCAL_MEM_FENCE); + + if (gid >= gid_max) return; + + /** + * main + */ + + m08700m (s_lotus_magic_table, l_bin2asc, w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m08700_m16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global u32x * words_buf_r, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + const u32 lid = get_local_id (0); + + u32 w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = pws[gid].i[ 4]; + w[ 5] = pws[gid].i[ 5]; + w[ 6] = pws[gid].i[ 6]; + w[ 7] = pws[gid].i[ 7]; + w[ 8] = pws[gid].i[ 8]; + w[ 9] = pws[gid].i[ 9]; + w[10] = pws[gid].i[10]; + w[11] = pws[gid].i[11]; + w[12] = pws[gid].i[12]; + w[13] = pws[gid].i[13]; + w[14] = pws[gid].i[14]; + w[15] = pws[gid].i[15]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * bin2asc table + */ + + __local u32 l_bin2asc[256]; + + const u32 lid4 = lid * 4; + + const u32 lid40 = lid4 + 0; + const u32 lid41 = lid4 + 1; + const u32 lid42 = lid4 + 2; + const u32 lid43 = lid4 + 3; + + const u32 v400 = (lid40 >> 0) & 15; + const u32 v401 = (lid40 >> 4) & 15; + const u32 v410 = (lid41 >> 0) & 15; + const u32 v411 = (lid41 >> 4) & 15; + const u32 v420 = (lid42 >> 0) & 15; + const u32 v421 = (lid42 >> 4) & 15; + const u32 v430 = (lid43 >> 0) & 15; + const u32 v431 = (lid43 >> 4) & 15; + + l_bin2asc[lid40] = ((v400 < 10) ? '0' + v400 : 'A' - 10 + v400) << 8 + | ((v401 < 10) ? '0' + v401 : 'A' - 10 + v401) << 0; + l_bin2asc[lid41] = ((v410 < 10) ? '0' + v410 : 'A' - 10 + v410) << 8 + | ((v411 < 10) ? '0' + v411 : 'A' - 10 + v411) << 0; + l_bin2asc[lid42] = ((v420 < 10) ? '0' + v420 : 'A' - 10 + v420) << 8 + | ((v421 < 10) ? '0' + v421 : 'A' - 10 + v421) << 0; + l_bin2asc[lid43] = ((v430 < 10) ? '0' + v430 : 'A' - 10 + v430) << 8 + | ((v431 < 10) ? '0' + v431 : 'A' - 10 + v431) << 0; + + barrier (CLK_LOCAL_MEM_FENCE); + + /** + * sbox + */ + + __local u32 s_lotus_magic_table[256]; + + s_lotus_magic_table[lid4 + 0] = lotus_magic_table[lid4 + 0]; + s_lotus_magic_table[lid4 + 1] = lotus_magic_table[lid4 + 1]; + s_lotus_magic_table[lid4 + 2] = lotus_magic_table[lid4 + 2]; + s_lotus_magic_table[lid4 + 3] = lotus_magic_table[lid4 + 3]; + + barrier (CLK_LOCAL_MEM_FENCE); + + if (gid >= gid_max) return; + + /** + * main + */ + + m08700m (s_lotus_magic_table, l_bin2asc, w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m08700_s04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global u32x * words_buf_r, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + const u32 lid = get_local_id (0); + + u32 w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = 0; + w[ 5] = 0; + w[ 6] = 0; + w[ 7] = 0; + w[ 8] = 0; + w[ 9] = 0; + w[10] = 0; + w[11] = 0; + w[12] = 0; + w[13] = 0; + w[14] = 0; + w[15] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * bin2asc table + */ + + __local u32 l_bin2asc[256]; + + const u32 lid4 = lid * 4; + + const u32 lid40 = lid4 + 0; + const u32 lid41 = lid4 + 1; + const u32 lid42 = lid4 + 2; + const u32 lid43 = lid4 + 3; + + const u32 v400 = (lid40 >> 0) & 15; + const u32 v401 = (lid40 >> 4) & 15; + const u32 v410 = (lid41 >> 0) & 15; + const u32 v411 = (lid41 >> 4) & 15; + const u32 v420 = (lid42 >> 0) & 15; + const u32 v421 = (lid42 >> 4) & 15; + const u32 v430 = (lid43 >> 0) & 15; + const u32 v431 = (lid43 >> 4) & 15; + + l_bin2asc[lid40] = ((v400 < 10) ? '0' + v400 : 'A' - 10 + v400) << 8 + | ((v401 < 10) ? '0' + v401 : 'A' - 10 + v401) << 0; + l_bin2asc[lid41] = ((v410 < 10) ? '0' + v410 : 'A' - 10 + v410) << 8 + | ((v411 < 10) ? '0' + v411 : 'A' - 10 + v411) << 0; + l_bin2asc[lid42] = ((v420 < 10) ? '0' + v420 : 'A' - 10 + v420) << 8 + | ((v421 < 10) ? '0' + v421 : 'A' - 10 + v421) << 0; + l_bin2asc[lid43] = ((v430 < 10) ? '0' + v430 : 'A' - 10 + v430) << 8 + | ((v431 < 10) ? '0' + v431 : 'A' - 10 + v431) << 0; + + barrier (CLK_LOCAL_MEM_FENCE); + + /** + * sbox + */ + + __local u32 s_lotus_magic_table[256]; + + s_lotus_magic_table[lid4 + 0] = lotus_magic_table[lid4 + 0]; + s_lotus_magic_table[lid4 + 1] = lotus_magic_table[lid4 + 1]; + s_lotus_magic_table[lid4 + 2] = lotus_magic_table[lid4 + 2]; + s_lotus_magic_table[lid4 + 3] = lotus_magic_table[lid4 + 3]; + + barrier (CLK_LOCAL_MEM_FENCE); + + if (gid >= gid_max) return; + + /** + * main + */ + + m08700s (s_lotus_magic_table, l_bin2asc, w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m08700_s08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global u32x * words_buf_r, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + const u32 lid = get_local_id (0); + + u32 w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = pws[gid].i[ 4]; + w[ 5] = pws[gid].i[ 5]; + w[ 6] = pws[gid].i[ 6]; + w[ 7] = pws[gid].i[ 7]; + w[ 8] = 0; + w[ 9] = 0; + w[10] = 0; + w[11] = 0; + w[12] = 0; + w[13] = 0; + w[14] = 0; + w[15] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * bin2asc table + */ + + __local u32 l_bin2asc[256]; + + const u32 lid4 = lid * 4; + + const u32 lid40 = lid4 + 0; + const u32 lid41 = lid4 + 1; + const u32 lid42 = lid4 + 2; + const u32 lid43 = lid4 + 3; + + const u32 v400 = (lid40 >> 0) & 15; + const u32 v401 = (lid40 >> 4) & 15; + const u32 v410 = (lid41 >> 0) & 15; + const u32 v411 = (lid41 >> 4) & 15; + const u32 v420 = (lid42 >> 0) & 15; + const u32 v421 = (lid42 >> 4) & 15; + const u32 v430 = (lid43 >> 0) & 15; + const u32 v431 = (lid43 >> 4) & 15; + + l_bin2asc[lid40] = ((v400 < 10) ? '0' + v400 : 'A' - 10 + v400) << 8 + | ((v401 < 10) ? '0' + v401 : 'A' - 10 + v401) << 0; + l_bin2asc[lid41] = ((v410 < 10) ? '0' + v410 : 'A' - 10 + v410) << 8 + | ((v411 < 10) ? '0' + v411 : 'A' - 10 + v411) << 0; + l_bin2asc[lid42] = ((v420 < 10) ? '0' + v420 : 'A' - 10 + v420) << 8 + | ((v421 < 10) ? '0' + v421 : 'A' - 10 + v421) << 0; + l_bin2asc[lid43] = ((v430 < 10) ? '0' + v430 : 'A' - 10 + v430) << 8 + | ((v431 < 10) ? '0' + v431 : 'A' - 10 + v431) << 0; + + barrier (CLK_LOCAL_MEM_FENCE); + + /** + * sbox + */ + + __local u32 s_lotus_magic_table[256]; + + s_lotus_magic_table[lid4 + 0] = lotus_magic_table[lid4 + 0]; + s_lotus_magic_table[lid4 + 1] = lotus_magic_table[lid4 + 1]; + s_lotus_magic_table[lid4 + 2] = lotus_magic_table[lid4 + 2]; + s_lotus_magic_table[lid4 + 3] = lotus_magic_table[lid4 + 3]; + + barrier (CLK_LOCAL_MEM_FENCE); + + if (gid >= gid_max) return; + + /** + * main + */ + + m08700s (s_lotus_magic_table, l_bin2asc, w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m08700_s16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global u32x * words_buf_r, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + const u32 lid = get_local_id (0); + + u32 w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = pws[gid].i[ 4]; + w[ 5] = pws[gid].i[ 5]; + w[ 6] = pws[gid].i[ 6]; + w[ 7] = pws[gid].i[ 7]; + w[ 8] = pws[gid].i[ 8]; + w[ 9] = pws[gid].i[ 9]; + w[10] = pws[gid].i[10]; + w[11] = pws[gid].i[11]; + w[12] = pws[gid].i[12]; + w[13] = pws[gid].i[13]; + w[14] = pws[gid].i[14]; + w[15] = pws[gid].i[15]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * bin2asc table + */ + + __local u32 l_bin2asc[256]; + + const u32 lid4 = lid * 4; + + const u32 lid40 = lid4 + 0; + const u32 lid41 = lid4 + 1; + const u32 lid42 = lid4 + 2; + const u32 lid43 = lid4 + 3; + + const u32 v400 = (lid40 >> 0) & 15; + const u32 v401 = (lid40 >> 4) & 15; + const u32 v410 = (lid41 >> 0) & 15; + const u32 v411 = (lid41 >> 4) & 15; + const u32 v420 = (lid42 >> 0) & 15; + const u32 v421 = (lid42 >> 4) & 15; + const u32 v430 = (lid43 >> 0) & 15; + const u32 v431 = (lid43 >> 4) & 15; + + l_bin2asc[lid40] = ((v400 < 10) ? '0' + v400 : 'A' - 10 + v400) << 8 + | ((v401 < 10) ? '0' + v401 : 'A' - 10 + v401) << 0; + l_bin2asc[lid41] = ((v410 < 10) ? '0' + v410 : 'A' - 10 + v410) << 8 + | ((v411 < 10) ? '0' + v411 : 'A' - 10 + v411) << 0; + l_bin2asc[lid42] = ((v420 < 10) ? '0' + v420 : 'A' - 10 + v420) << 8 + | ((v421 < 10) ? '0' + v421 : 'A' - 10 + v421) << 0; + l_bin2asc[lid43] = ((v430 < 10) ? '0' + v430 : 'A' - 10 + v430) << 8 + | ((v431 < 10) ? '0' + v431 : 'A' - 10 + v431) << 0; + + barrier (CLK_LOCAL_MEM_FENCE); + + /** + * sbox + */ + + __local u32 s_lotus_magic_table[256]; + + s_lotus_magic_table[lid4 + 0] = lotus_magic_table[lid4 + 0]; + s_lotus_magic_table[lid4 + 1] = lotus_magic_table[lid4 + 1]; + s_lotus_magic_table[lid4 + 2] = lotus_magic_table[lid4 + 2]; + s_lotus_magic_table[lid4 + 3] = lotus_magic_table[lid4 + 3]; + + barrier (CLK_LOCAL_MEM_FENCE); + + if (gid >= gid_max) return; + + /** + * main + */ + + m08700s (s_lotus_magic_table, l_bin2asc, w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} diff --git a/amd/m08800.cl b/amd/m08800.cl new file mode 100644 index 0000000000..577f8fb5ec --- /dev/null +++ b/amd/m08800.cl @@ -0,0 +1,2009 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _ANDROIDFDE_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW4 +#define VECT_SIZE1 +#endif + +#ifdef VLIW5 +#define VECT_SIZE1 +#endif + +#define DGST_R0 0 +#define DGST_R1 1 +#define DGST_R2 2 +#define DGST_R3 3 + +#include "include/kernel_functions.c" +#include "types_amd.c" +#include "common_amd.c" + +__constant u32 te0[256] = +{ + 0xc66363a5, 0xf87c7c84, 0xee777799, 0xf67b7b8d, + 0xfff2f20d, 0xd66b6bbd, 0xde6f6fb1, 0x91c5c554, + 0x60303050, 0x02010103, 0xce6767a9, 0x562b2b7d, + 0xe7fefe19, 0xb5d7d762, 0x4dababe6, 0xec76769a, + 0x8fcaca45, 0x1f82829d, 0x89c9c940, 0xfa7d7d87, + 0xeffafa15, 0xb25959eb, 0x8e4747c9, 0xfbf0f00b, + 0x41adadec, 0xb3d4d467, 0x5fa2a2fd, 0x45afafea, + 0x239c9cbf, 0x53a4a4f7, 0xe4727296, 0x9bc0c05b, + 0x75b7b7c2, 0xe1fdfd1c, 0x3d9393ae, 0x4c26266a, + 0x6c36365a, 0x7e3f3f41, 0xf5f7f702, 0x83cccc4f, + 0x6834345c, 0x51a5a5f4, 0xd1e5e534, 0xf9f1f108, + 0xe2717193, 0xabd8d873, 0x62313153, 0x2a15153f, + 0x0804040c, 0x95c7c752, 0x46232365, 0x9dc3c35e, + 0x30181828, 0x379696a1, 0x0a05050f, 0x2f9a9ab5, + 0x0e070709, 0x24121236, 0x1b80809b, 0xdfe2e23d, + 0xcdebeb26, 0x4e272769, 0x7fb2b2cd, 0xea75759f, + 0x1209091b, 0x1d83839e, 0x582c2c74, 0x341a1a2e, + 0x361b1b2d, 0xdc6e6eb2, 0xb45a5aee, 0x5ba0a0fb, + 0xa45252f6, 0x763b3b4d, 0xb7d6d661, 0x7db3b3ce, + 0x5229297b, 0xdde3e33e, 0x5e2f2f71, 0x13848497, + 0xa65353f5, 0xb9d1d168, 0x00000000, 0xc1eded2c, + 0x40202060, 0xe3fcfc1f, 0x79b1b1c8, 0xb65b5bed, + 0xd46a6abe, 0x8dcbcb46, 0x67bebed9, 0x7239394b, + 0x944a4ade, 0x984c4cd4, 0xb05858e8, 0x85cfcf4a, + 0xbbd0d06b, 0xc5efef2a, 0x4faaaae5, 0xedfbfb16, + 0x864343c5, 0x9a4d4dd7, 0x66333355, 0x11858594, + 0x8a4545cf, 0xe9f9f910, 0x04020206, 0xfe7f7f81, + 0xa05050f0, 0x783c3c44, 0x259f9fba, 0x4ba8a8e3, + 0xa25151f3, 0x5da3a3fe, 0x804040c0, 0x058f8f8a, + 0x3f9292ad, 0x219d9dbc, 0x70383848, 0xf1f5f504, + 0x63bcbcdf, 0x77b6b6c1, 0xafdada75, 0x42212163, + 0x20101030, 0xe5ffff1a, 0xfdf3f30e, 0xbfd2d26d, + 0x81cdcd4c, 0x180c0c14, 0x26131335, 0xc3ecec2f, + 0xbe5f5fe1, 0x359797a2, 0x884444cc, 0x2e171739, + 0x93c4c457, 0x55a7a7f2, 0xfc7e7e82, 0x7a3d3d47, + 0xc86464ac, 0xba5d5de7, 0x3219192b, 0xe6737395, + 0xc06060a0, 0x19818198, 0x9e4f4fd1, 0xa3dcdc7f, + 0x44222266, 0x542a2a7e, 0x3b9090ab, 0x0b888883, + 0x8c4646ca, 0xc7eeee29, 0x6bb8b8d3, 0x2814143c, + 0xa7dede79, 0xbc5e5ee2, 0x160b0b1d, 0xaddbdb76, + 0xdbe0e03b, 0x64323256, 0x743a3a4e, 0x140a0a1e, + 0x924949db, 0x0c06060a, 0x4824246c, 0xb85c5ce4, + 0x9fc2c25d, 0xbdd3d36e, 0x43acacef, 0xc46262a6, + 0x399191a8, 0x319595a4, 0xd3e4e437, 0xf279798b, + 0xd5e7e732, 0x8bc8c843, 0x6e373759, 0xda6d6db7, + 0x018d8d8c, 0xb1d5d564, 0x9c4e4ed2, 0x49a9a9e0, + 0xd86c6cb4, 0xac5656fa, 0xf3f4f407, 0xcfeaea25, + 0xca6565af, 0xf47a7a8e, 0x47aeaee9, 0x10080818, + 0x6fbabad5, 0xf0787888, 0x4a25256f, 0x5c2e2e72, + 0x381c1c24, 0x57a6a6f1, 0x73b4b4c7, 0x97c6c651, + 0xcbe8e823, 0xa1dddd7c, 0xe874749c, 0x3e1f1f21, + 0x964b4bdd, 0x61bdbddc, 0x0d8b8b86, 0x0f8a8a85, + 0xe0707090, 0x7c3e3e42, 0x71b5b5c4, 0xcc6666aa, + 0x904848d8, 0x06030305, 0xf7f6f601, 0x1c0e0e12, + 0xc26161a3, 0x6a35355f, 0xae5757f9, 0x69b9b9d0, + 0x17868691, 0x99c1c158, 0x3a1d1d27, 0x279e9eb9, + 0xd9e1e138, 0xebf8f813, 0x2b9898b3, 0x22111133, + 0xd26969bb, 0xa9d9d970, 0x078e8e89, 0x339494a7, + 0x2d9b9bb6, 0x3c1e1e22, 0x15878792, 0xc9e9e920, + 0x87cece49, 0xaa5555ff, 0x50282878, 0xa5dfdf7a, + 0x038c8c8f, 0x59a1a1f8, 0x09898980, 0x1a0d0d17, + 0x65bfbfda, 0xd7e6e631, 0x844242c6, 0xd06868b8, + 0x824141c3, 0x299999b0, 0x5a2d2d77, 0x1e0f0f11, + 0x7bb0b0cb, 0xa85454fc, 0x6dbbbbd6, 0x2c16163a, +}; + +__constant u32 te1[256] = +{ + 0xa5c66363, 0x84f87c7c, 0x99ee7777, 0x8df67b7b, + 0x0dfff2f2, 0xbdd66b6b, 0xb1de6f6f, 0x5491c5c5, + 0x50603030, 0x03020101, 0xa9ce6767, 0x7d562b2b, + 0x19e7fefe, 0x62b5d7d7, 0xe64dabab, 0x9aec7676, + 0x458fcaca, 0x9d1f8282, 0x4089c9c9, 0x87fa7d7d, + 0x15effafa, 0xebb25959, 0xc98e4747, 0x0bfbf0f0, + 0xec41adad, 0x67b3d4d4, 0xfd5fa2a2, 0xea45afaf, + 0xbf239c9c, 0xf753a4a4, 0x96e47272, 0x5b9bc0c0, + 0xc275b7b7, 0x1ce1fdfd, 0xae3d9393, 0x6a4c2626, + 0x5a6c3636, 0x417e3f3f, 0x02f5f7f7, 0x4f83cccc, + 0x5c683434, 0xf451a5a5, 0x34d1e5e5, 0x08f9f1f1, + 0x93e27171, 0x73abd8d8, 0x53623131, 0x3f2a1515, + 0x0c080404, 0x5295c7c7, 0x65462323, 0x5e9dc3c3, + 0x28301818, 0xa1379696, 0x0f0a0505, 0xb52f9a9a, + 0x090e0707, 0x36241212, 0x9b1b8080, 0x3ddfe2e2, + 0x26cdebeb, 0x694e2727, 0xcd7fb2b2, 0x9fea7575, + 0x1b120909, 0x9e1d8383, 0x74582c2c, 0x2e341a1a, + 0x2d361b1b, 0xb2dc6e6e, 0xeeb45a5a, 0xfb5ba0a0, + 0xf6a45252, 0x4d763b3b, 0x61b7d6d6, 0xce7db3b3, + 0x7b522929, 0x3edde3e3, 0x715e2f2f, 0x97138484, + 0xf5a65353, 0x68b9d1d1, 0x00000000, 0x2cc1eded, + 0x60402020, 0x1fe3fcfc, 0xc879b1b1, 0xedb65b5b, + 0xbed46a6a, 0x468dcbcb, 0xd967bebe, 0x4b723939, + 0xde944a4a, 0xd4984c4c, 0xe8b05858, 0x4a85cfcf, + 0x6bbbd0d0, 0x2ac5efef, 0xe54faaaa, 0x16edfbfb, + 0xc5864343, 0xd79a4d4d, 0x55663333, 0x94118585, + 0xcf8a4545, 0x10e9f9f9, 0x06040202, 0x81fe7f7f, + 0xf0a05050, 0x44783c3c, 0xba259f9f, 0xe34ba8a8, + 0xf3a25151, 0xfe5da3a3, 0xc0804040, 0x8a058f8f, + 0xad3f9292, 0xbc219d9d, 0x48703838, 0x04f1f5f5, + 0xdf63bcbc, 0xc177b6b6, 0x75afdada, 0x63422121, + 0x30201010, 0x1ae5ffff, 0x0efdf3f3, 0x6dbfd2d2, + 0x4c81cdcd, 0x14180c0c, 0x35261313, 0x2fc3ecec, + 0xe1be5f5f, 0xa2359797, 0xcc884444, 0x392e1717, + 0x5793c4c4, 0xf255a7a7, 0x82fc7e7e, 0x477a3d3d, + 0xacc86464, 0xe7ba5d5d, 0x2b321919, 0x95e67373, + 0xa0c06060, 0x98198181, 0xd19e4f4f, 0x7fa3dcdc, + 0x66442222, 0x7e542a2a, 0xab3b9090, 0x830b8888, + 0xca8c4646, 0x29c7eeee, 0xd36bb8b8, 0x3c281414, + 0x79a7dede, 0xe2bc5e5e, 0x1d160b0b, 0x76addbdb, + 0x3bdbe0e0, 0x56643232, 0x4e743a3a, 0x1e140a0a, + 0xdb924949, 0x0a0c0606, 0x6c482424, 0xe4b85c5c, + 0x5d9fc2c2, 0x6ebdd3d3, 0xef43acac, 0xa6c46262, + 0xa8399191, 0xa4319595, 0x37d3e4e4, 0x8bf27979, + 0x32d5e7e7, 0x438bc8c8, 0x596e3737, 0xb7da6d6d, + 0x8c018d8d, 0x64b1d5d5, 0xd29c4e4e, 0xe049a9a9, + 0xb4d86c6c, 0xfaac5656, 0x07f3f4f4, 0x25cfeaea, + 0xafca6565, 0x8ef47a7a, 0xe947aeae, 0x18100808, + 0xd56fbaba, 0x88f07878, 0x6f4a2525, 0x725c2e2e, + 0x24381c1c, 0xf157a6a6, 0xc773b4b4, 0x5197c6c6, + 0x23cbe8e8, 0x7ca1dddd, 0x9ce87474, 0x213e1f1f, + 0xdd964b4b, 0xdc61bdbd, 0x860d8b8b, 0x850f8a8a, + 0x90e07070, 0x427c3e3e, 0xc471b5b5, 0xaacc6666, + 0xd8904848, 0x05060303, 0x01f7f6f6, 0x121c0e0e, + 0xa3c26161, 0x5f6a3535, 0xf9ae5757, 0xd069b9b9, + 0x91178686, 0x5899c1c1, 0x273a1d1d, 0xb9279e9e, + 0x38d9e1e1, 0x13ebf8f8, 0xb32b9898, 0x33221111, + 0xbbd26969, 0x70a9d9d9, 0x89078e8e, 0xa7339494, + 0xb62d9b9b, 0x223c1e1e, 0x92158787, 0x20c9e9e9, + 0x4987cece, 0xffaa5555, 0x78502828, 0x7aa5dfdf, + 0x8f038c8c, 0xf859a1a1, 0x80098989, 0x171a0d0d, + 0xda65bfbf, 0x31d7e6e6, 0xc6844242, 0xb8d06868, + 0xc3824141, 0xb0299999, 0x775a2d2d, 0x111e0f0f, + 0xcb7bb0b0, 0xfca85454, 0xd66dbbbb, 0x3a2c1616, +}; + +__constant u32 te2[256] = +{ + 0x63a5c663, 0x7c84f87c, 0x7799ee77, 0x7b8df67b, + 0xf20dfff2, 0x6bbdd66b, 0x6fb1de6f, 0xc55491c5, + 0x30506030, 0x01030201, 0x67a9ce67, 0x2b7d562b, + 0xfe19e7fe, 0xd762b5d7, 0xabe64dab, 0x769aec76, + 0xca458fca, 0x829d1f82, 0xc94089c9, 0x7d87fa7d, + 0xfa15effa, 0x59ebb259, 0x47c98e47, 0xf00bfbf0, + 0xadec41ad, 0xd467b3d4, 0xa2fd5fa2, 0xafea45af, + 0x9cbf239c, 0xa4f753a4, 0x7296e472, 0xc05b9bc0, + 0xb7c275b7, 0xfd1ce1fd, 0x93ae3d93, 0x266a4c26, + 0x365a6c36, 0x3f417e3f, 0xf702f5f7, 0xcc4f83cc, + 0x345c6834, 0xa5f451a5, 0xe534d1e5, 0xf108f9f1, + 0x7193e271, 0xd873abd8, 0x31536231, 0x153f2a15, + 0x040c0804, 0xc75295c7, 0x23654623, 0xc35e9dc3, + 0x18283018, 0x96a13796, 0x050f0a05, 0x9ab52f9a, + 0x07090e07, 0x12362412, 0x809b1b80, 0xe23ddfe2, + 0xeb26cdeb, 0x27694e27, 0xb2cd7fb2, 0x759fea75, + 0x091b1209, 0x839e1d83, 0x2c74582c, 0x1a2e341a, + 0x1b2d361b, 0x6eb2dc6e, 0x5aeeb45a, 0xa0fb5ba0, + 0x52f6a452, 0x3b4d763b, 0xd661b7d6, 0xb3ce7db3, + 0x297b5229, 0xe33edde3, 0x2f715e2f, 0x84971384, + 0x53f5a653, 0xd168b9d1, 0x00000000, 0xed2cc1ed, + 0x20604020, 0xfc1fe3fc, 0xb1c879b1, 0x5bedb65b, + 0x6abed46a, 0xcb468dcb, 0xbed967be, 0x394b7239, + 0x4ade944a, 0x4cd4984c, 0x58e8b058, 0xcf4a85cf, + 0xd06bbbd0, 0xef2ac5ef, 0xaae54faa, 0xfb16edfb, + 0x43c58643, 0x4dd79a4d, 0x33556633, 0x85941185, + 0x45cf8a45, 0xf910e9f9, 0x02060402, 0x7f81fe7f, + 0x50f0a050, 0x3c44783c, 0x9fba259f, 0xa8e34ba8, + 0x51f3a251, 0xa3fe5da3, 0x40c08040, 0x8f8a058f, + 0x92ad3f92, 0x9dbc219d, 0x38487038, 0xf504f1f5, + 0xbcdf63bc, 0xb6c177b6, 0xda75afda, 0x21634221, + 0x10302010, 0xff1ae5ff, 0xf30efdf3, 0xd26dbfd2, + 0xcd4c81cd, 0x0c14180c, 0x13352613, 0xec2fc3ec, + 0x5fe1be5f, 0x97a23597, 0x44cc8844, 0x17392e17, + 0xc45793c4, 0xa7f255a7, 0x7e82fc7e, 0x3d477a3d, + 0x64acc864, 0x5de7ba5d, 0x192b3219, 0x7395e673, + 0x60a0c060, 0x81981981, 0x4fd19e4f, 0xdc7fa3dc, + 0x22664422, 0x2a7e542a, 0x90ab3b90, 0x88830b88, + 0x46ca8c46, 0xee29c7ee, 0xb8d36bb8, 0x143c2814, + 0xde79a7de, 0x5ee2bc5e, 0x0b1d160b, 0xdb76addb, + 0xe03bdbe0, 0x32566432, 0x3a4e743a, 0x0a1e140a, + 0x49db9249, 0x060a0c06, 0x246c4824, 0x5ce4b85c, + 0xc25d9fc2, 0xd36ebdd3, 0xacef43ac, 0x62a6c462, + 0x91a83991, 0x95a43195, 0xe437d3e4, 0x798bf279, + 0xe732d5e7, 0xc8438bc8, 0x37596e37, 0x6db7da6d, + 0x8d8c018d, 0xd564b1d5, 0x4ed29c4e, 0xa9e049a9, + 0x6cb4d86c, 0x56faac56, 0xf407f3f4, 0xea25cfea, + 0x65afca65, 0x7a8ef47a, 0xaee947ae, 0x08181008, + 0xbad56fba, 0x7888f078, 0x256f4a25, 0x2e725c2e, + 0x1c24381c, 0xa6f157a6, 0xb4c773b4, 0xc65197c6, + 0xe823cbe8, 0xdd7ca1dd, 0x749ce874, 0x1f213e1f, + 0x4bdd964b, 0xbddc61bd, 0x8b860d8b, 0x8a850f8a, + 0x7090e070, 0x3e427c3e, 0xb5c471b5, 0x66aacc66, + 0x48d89048, 0x03050603, 0xf601f7f6, 0x0e121c0e, + 0x61a3c261, 0x355f6a35, 0x57f9ae57, 0xb9d069b9, + 0x86911786, 0xc15899c1, 0x1d273a1d, 0x9eb9279e, + 0xe138d9e1, 0xf813ebf8, 0x98b32b98, 0x11332211, + 0x69bbd269, 0xd970a9d9, 0x8e89078e, 0x94a73394, + 0x9bb62d9b, 0x1e223c1e, 0x87921587, 0xe920c9e9, + 0xce4987ce, 0x55ffaa55, 0x28785028, 0xdf7aa5df, + 0x8c8f038c, 0xa1f859a1, 0x89800989, 0x0d171a0d, + 0xbfda65bf, 0xe631d7e6, 0x42c68442, 0x68b8d068, + 0x41c38241, 0x99b02999, 0x2d775a2d, 0x0f111e0f, + 0xb0cb7bb0, 0x54fca854, 0xbbd66dbb, 0x163a2c16, +}; + +__constant u32 te3[256] = +{ + 0x6363a5c6, 0x7c7c84f8, 0x777799ee, 0x7b7b8df6, + 0xf2f20dff, 0x6b6bbdd6, 0x6f6fb1de, 0xc5c55491, + 0x30305060, 0x01010302, 0x6767a9ce, 0x2b2b7d56, + 0xfefe19e7, 0xd7d762b5, 0xababe64d, 0x76769aec, + 0xcaca458f, 0x82829d1f, 0xc9c94089, 0x7d7d87fa, + 0xfafa15ef, 0x5959ebb2, 0x4747c98e, 0xf0f00bfb, + 0xadadec41, 0xd4d467b3, 0xa2a2fd5f, 0xafafea45, + 0x9c9cbf23, 0xa4a4f753, 0x727296e4, 0xc0c05b9b, + 0xb7b7c275, 0xfdfd1ce1, 0x9393ae3d, 0x26266a4c, + 0x36365a6c, 0x3f3f417e, 0xf7f702f5, 0xcccc4f83, + 0x34345c68, 0xa5a5f451, 0xe5e534d1, 0xf1f108f9, + 0x717193e2, 0xd8d873ab, 0x31315362, 0x15153f2a, + 0x04040c08, 0xc7c75295, 0x23236546, 0xc3c35e9d, + 0x18182830, 0x9696a137, 0x05050f0a, 0x9a9ab52f, + 0x0707090e, 0x12123624, 0x80809b1b, 0xe2e23ddf, + 0xebeb26cd, 0x2727694e, 0xb2b2cd7f, 0x75759fea, + 0x09091b12, 0x83839e1d, 0x2c2c7458, 0x1a1a2e34, + 0x1b1b2d36, 0x6e6eb2dc, 0x5a5aeeb4, 0xa0a0fb5b, + 0x5252f6a4, 0x3b3b4d76, 0xd6d661b7, 0xb3b3ce7d, + 0x29297b52, 0xe3e33edd, 0x2f2f715e, 0x84849713, + 0x5353f5a6, 0xd1d168b9, 0x00000000, 0xeded2cc1, + 0x20206040, 0xfcfc1fe3, 0xb1b1c879, 0x5b5bedb6, + 0x6a6abed4, 0xcbcb468d, 0xbebed967, 0x39394b72, + 0x4a4ade94, 0x4c4cd498, 0x5858e8b0, 0xcfcf4a85, + 0xd0d06bbb, 0xefef2ac5, 0xaaaae54f, 0xfbfb16ed, + 0x4343c586, 0x4d4dd79a, 0x33335566, 0x85859411, + 0x4545cf8a, 0xf9f910e9, 0x02020604, 0x7f7f81fe, + 0x5050f0a0, 0x3c3c4478, 0x9f9fba25, 0xa8a8e34b, + 0x5151f3a2, 0xa3a3fe5d, 0x4040c080, 0x8f8f8a05, + 0x9292ad3f, 0x9d9dbc21, 0x38384870, 0xf5f504f1, + 0xbcbcdf63, 0xb6b6c177, 0xdada75af, 0x21216342, + 0x10103020, 0xffff1ae5, 0xf3f30efd, 0xd2d26dbf, + 0xcdcd4c81, 0x0c0c1418, 0x13133526, 0xecec2fc3, + 0x5f5fe1be, 0x9797a235, 0x4444cc88, 0x1717392e, + 0xc4c45793, 0xa7a7f255, 0x7e7e82fc, 0x3d3d477a, + 0x6464acc8, 0x5d5de7ba, 0x19192b32, 0x737395e6, + 0x6060a0c0, 0x81819819, 0x4f4fd19e, 0xdcdc7fa3, + 0x22226644, 0x2a2a7e54, 0x9090ab3b, 0x8888830b, + 0x4646ca8c, 0xeeee29c7, 0xb8b8d36b, 0x14143c28, + 0xdede79a7, 0x5e5ee2bc, 0x0b0b1d16, 0xdbdb76ad, + 0xe0e03bdb, 0x32325664, 0x3a3a4e74, 0x0a0a1e14, + 0x4949db92, 0x06060a0c, 0x24246c48, 0x5c5ce4b8, + 0xc2c25d9f, 0xd3d36ebd, 0xacacef43, 0x6262a6c4, + 0x9191a839, 0x9595a431, 0xe4e437d3, 0x79798bf2, + 0xe7e732d5, 0xc8c8438b, 0x3737596e, 0x6d6db7da, + 0x8d8d8c01, 0xd5d564b1, 0x4e4ed29c, 0xa9a9e049, + 0x6c6cb4d8, 0x5656faac, 0xf4f407f3, 0xeaea25cf, + 0x6565afca, 0x7a7a8ef4, 0xaeaee947, 0x08081810, + 0xbabad56f, 0x787888f0, 0x25256f4a, 0x2e2e725c, + 0x1c1c2438, 0xa6a6f157, 0xb4b4c773, 0xc6c65197, + 0xe8e823cb, 0xdddd7ca1, 0x74749ce8, 0x1f1f213e, + 0x4b4bdd96, 0xbdbddc61, 0x8b8b860d, 0x8a8a850f, + 0x707090e0, 0x3e3e427c, 0xb5b5c471, 0x6666aacc, + 0x4848d890, 0x03030506, 0xf6f601f7, 0x0e0e121c, + 0x6161a3c2, 0x35355f6a, 0x5757f9ae, 0xb9b9d069, + 0x86869117, 0xc1c15899, 0x1d1d273a, 0x9e9eb927, + 0xe1e138d9, 0xf8f813eb, 0x9898b32b, 0x11113322, + 0x6969bbd2, 0xd9d970a9, 0x8e8e8907, 0x9494a733, + 0x9b9bb62d, 0x1e1e223c, 0x87879215, 0xe9e920c9, + 0xcece4987, 0x5555ffaa, 0x28287850, 0xdfdf7aa5, + 0x8c8c8f03, 0xa1a1f859, 0x89898009, 0x0d0d171a, + 0xbfbfda65, 0xe6e631d7, 0x4242c684, 0x6868b8d0, + 0x4141c382, 0x9999b029, 0x2d2d775a, 0x0f0f111e, + 0xb0b0cb7b, 0x5454fca8, 0xbbbbd66d, 0x16163a2c, +}; + +__constant u32 te4[256] = +{ + 0x63636363, 0x7c7c7c7c, 0x77777777, 0x7b7b7b7b, + 0xf2f2f2f2, 0x6b6b6b6b, 0x6f6f6f6f, 0xc5c5c5c5, + 0x30303030, 0x01010101, 0x67676767, 0x2b2b2b2b, + 0xfefefefe, 0xd7d7d7d7, 0xabababab, 0x76767676, + 0xcacacaca, 0x82828282, 0xc9c9c9c9, 0x7d7d7d7d, + 0xfafafafa, 0x59595959, 0x47474747, 0xf0f0f0f0, + 0xadadadad, 0xd4d4d4d4, 0xa2a2a2a2, 0xafafafaf, + 0x9c9c9c9c, 0xa4a4a4a4, 0x72727272, 0xc0c0c0c0, + 0xb7b7b7b7, 0xfdfdfdfd, 0x93939393, 0x26262626, + 0x36363636, 0x3f3f3f3f, 0xf7f7f7f7, 0xcccccccc, + 0x34343434, 0xa5a5a5a5, 0xe5e5e5e5, 0xf1f1f1f1, + 0x71717171, 0xd8d8d8d8, 0x31313131, 0x15151515, + 0x04040404, 0xc7c7c7c7, 0x23232323, 0xc3c3c3c3, + 0x18181818, 0x96969696, 0x05050505, 0x9a9a9a9a, + 0x07070707, 0x12121212, 0x80808080, 0xe2e2e2e2, + 0xebebebeb, 0x27272727, 0xb2b2b2b2, 0x75757575, + 0x09090909, 0x83838383, 0x2c2c2c2c, 0x1a1a1a1a, + 0x1b1b1b1b, 0x6e6e6e6e, 0x5a5a5a5a, 0xa0a0a0a0, + 0x52525252, 0x3b3b3b3b, 0xd6d6d6d6, 0xb3b3b3b3, + 0x29292929, 0xe3e3e3e3, 0x2f2f2f2f, 0x84848484, + 0x53535353, 0xd1d1d1d1, 0x00000000, 0xedededed, + 0x20202020, 0xfcfcfcfc, 0xb1b1b1b1, 0x5b5b5b5b, + 0x6a6a6a6a, 0xcbcbcbcb, 0xbebebebe, 0x39393939, + 0x4a4a4a4a, 0x4c4c4c4c, 0x58585858, 0xcfcfcfcf, + 0xd0d0d0d0, 0xefefefef, 0xaaaaaaaa, 0xfbfbfbfb, + 0x43434343, 0x4d4d4d4d, 0x33333333, 0x85858585, + 0x45454545, 0xf9f9f9f9, 0x02020202, 0x7f7f7f7f, + 0x50505050, 0x3c3c3c3c, 0x9f9f9f9f, 0xa8a8a8a8, + 0x51515151, 0xa3a3a3a3, 0x40404040, 0x8f8f8f8f, + 0x92929292, 0x9d9d9d9d, 0x38383838, 0xf5f5f5f5, + 0xbcbcbcbc, 0xb6b6b6b6, 0xdadadada, 0x21212121, + 0x10101010, 0xffffffff, 0xf3f3f3f3, 0xd2d2d2d2, + 0xcdcdcdcd, 0x0c0c0c0c, 0x13131313, 0xecececec, + 0x5f5f5f5f, 0x97979797, 0x44444444, 0x17171717, + 0xc4c4c4c4, 0xa7a7a7a7, 0x7e7e7e7e, 0x3d3d3d3d, + 0x64646464, 0x5d5d5d5d, 0x19191919, 0x73737373, + 0x60606060, 0x81818181, 0x4f4f4f4f, 0xdcdcdcdc, + 0x22222222, 0x2a2a2a2a, 0x90909090, 0x88888888, + 0x46464646, 0xeeeeeeee, 0xb8b8b8b8, 0x14141414, + 0xdededede, 0x5e5e5e5e, 0x0b0b0b0b, 0xdbdbdbdb, + 0xe0e0e0e0, 0x32323232, 0x3a3a3a3a, 0x0a0a0a0a, + 0x49494949, 0x06060606, 0x24242424, 0x5c5c5c5c, + 0xc2c2c2c2, 0xd3d3d3d3, 0xacacacac, 0x62626262, + 0x91919191, 0x95959595, 0xe4e4e4e4, 0x79797979, + 0xe7e7e7e7, 0xc8c8c8c8, 0x37373737, 0x6d6d6d6d, + 0x8d8d8d8d, 0xd5d5d5d5, 0x4e4e4e4e, 0xa9a9a9a9, + 0x6c6c6c6c, 0x56565656, 0xf4f4f4f4, 0xeaeaeaea, + 0x65656565, 0x7a7a7a7a, 0xaeaeaeae, 0x08080808, + 0xbabababa, 0x78787878, 0x25252525, 0x2e2e2e2e, + 0x1c1c1c1c, 0xa6a6a6a6, 0xb4b4b4b4, 0xc6c6c6c6, + 0xe8e8e8e8, 0xdddddddd, 0x74747474, 0x1f1f1f1f, + 0x4b4b4b4b, 0xbdbdbdbd, 0x8b8b8b8b, 0x8a8a8a8a, + 0x70707070, 0x3e3e3e3e, 0xb5b5b5b5, 0x66666666, + 0x48484848, 0x03030303, 0xf6f6f6f6, 0x0e0e0e0e, + 0x61616161, 0x35353535, 0x57575757, 0xb9b9b9b9, + 0x86868686, 0xc1c1c1c1, 0x1d1d1d1d, 0x9e9e9e9e, + 0xe1e1e1e1, 0xf8f8f8f8, 0x98989898, 0x11111111, + 0x69696969, 0xd9d9d9d9, 0x8e8e8e8e, 0x94949494, + 0x9b9b9b9b, 0x1e1e1e1e, 0x87878787, 0xe9e9e9e9, + 0xcececece, 0x55555555, 0x28282828, 0xdfdfdfdf, + 0x8c8c8c8c, 0xa1a1a1a1, 0x89898989, 0x0d0d0d0d, + 0xbfbfbfbf, 0xe6e6e6e6, 0x42424242, 0x68686868, + 0x41414141, 0x99999999, 0x2d2d2d2d, 0x0f0f0f0f, + 0xb0b0b0b0, 0x54545454, 0xbbbbbbbb, 0x16161616, +}; + +__constant u32 td0[256] = +{ + 0x51f4a750, 0x7e416553, 0x1a17a4c3, 0x3a275e96, + 0x3bab6bcb, 0x1f9d45f1, 0xacfa58ab, 0x4be30393, + 0x2030fa55, 0xad766df6, 0x88cc7691, 0xf5024c25, + 0x4fe5d7fc, 0xc52acbd7, 0x26354480, 0xb562a38f, + 0xdeb15a49, 0x25ba1b67, 0x45ea0e98, 0x5dfec0e1, + 0xc32f7502, 0x814cf012, 0x8d4697a3, 0x6bd3f9c6, + 0x038f5fe7, 0x15929c95, 0xbf6d7aeb, 0x955259da, + 0xd4be832d, 0x587421d3, 0x49e06929, 0x8ec9c844, + 0x75c2896a, 0xf48e7978, 0x99583e6b, 0x27b971dd, + 0xbee14fb6, 0xf088ad17, 0xc920ac66, 0x7dce3ab4, + 0x63df4a18, 0xe51a3182, 0x97513360, 0x62537f45, + 0xb16477e0, 0xbb6bae84, 0xfe81a01c, 0xf9082b94, + 0x70486858, 0x8f45fd19, 0x94de6c87, 0x527bf8b7, + 0xab73d323, 0x724b02e2, 0xe31f8f57, 0x6655ab2a, + 0xb2eb2807, 0x2fb5c203, 0x86c57b9a, 0xd33708a5, + 0x302887f2, 0x23bfa5b2, 0x02036aba, 0xed16825c, + 0x8acf1c2b, 0xa779b492, 0xf307f2f0, 0x4e69e2a1, + 0x65daf4cd, 0x0605bed5, 0xd134621f, 0xc4a6fe8a, + 0x342e539d, 0xa2f355a0, 0x058ae132, 0xa4f6eb75, + 0x0b83ec39, 0x4060efaa, 0x5e719f06, 0xbd6e1051, + 0x3e218af9, 0x96dd063d, 0xdd3e05ae, 0x4de6bd46, + 0x91548db5, 0x71c45d05, 0x0406d46f, 0x605015ff, + 0x1998fb24, 0xd6bde997, 0x894043cc, 0x67d99e77, + 0xb0e842bd, 0x07898b88, 0xe7195b38, 0x79c8eedb, + 0xa17c0a47, 0x7c420fe9, 0xf8841ec9, 0x00000000, + 0x09808683, 0x322bed48, 0x1e1170ac, 0x6c5a724e, + 0xfd0efffb, 0x0f853856, 0x3daed51e, 0x362d3927, + 0x0a0fd964, 0x685ca621, 0x9b5b54d1, 0x24362e3a, + 0x0c0a67b1, 0x9357e70f, 0xb4ee96d2, 0x1b9b919e, + 0x80c0c54f, 0x61dc20a2, 0x5a774b69, 0x1c121a16, + 0xe293ba0a, 0xc0a02ae5, 0x3c22e043, 0x121b171d, + 0x0e090d0b, 0xf28bc7ad, 0x2db6a8b9, 0x141ea9c8, + 0x57f11985, 0xaf75074c, 0xee99ddbb, 0xa37f60fd, + 0xf701269f, 0x5c72f5bc, 0x44663bc5, 0x5bfb7e34, + 0x8b432976, 0xcb23c6dc, 0xb6edfc68, 0xb8e4f163, + 0xd731dcca, 0x42638510, 0x13972240, 0x84c61120, + 0x854a247d, 0xd2bb3df8, 0xaef93211, 0xc729a16d, + 0x1d9e2f4b, 0xdcb230f3, 0x0d8652ec, 0x77c1e3d0, + 0x2bb3166c, 0xa970b999, 0x119448fa, 0x47e96422, + 0xa8fc8cc4, 0xa0f03f1a, 0x567d2cd8, 0x223390ef, + 0x87494ec7, 0xd938d1c1, 0x8ccaa2fe, 0x98d40b36, + 0xa6f581cf, 0xa57ade28, 0xdab78e26, 0x3fadbfa4, + 0x2c3a9de4, 0x5078920d, 0x6a5fcc9b, 0x547e4662, + 0xf68d13c2, 0x90d8b8e8, 0x2e39f75e, 0x82c3aff5, + 0x9f5d80be, 0x69d0937c, 0x6fd52da9, 0xcf2512b3, + 0xc8ac993b, 0x10187da7, 0xe89c636e, 0xdb3bbb7b, + 0xcd267809, 0x6e5918f4, 0xec9ab701, 0x834f9aa8, + 0xe6956e65, 0xaaffe67e, 0x21bccf08, 0xef15e8e6, + 0xbae79bd9, 0x4a6f36ce, 0xea9f09d4, 0x29b07cd6, + 0x31a4b2af, 0x2a3f2331, 0xc6a59430, 0x35a266c0, + 0x744ebc37, 0xfc82caa6, 0xe090d0b0, 0x33a7d815, + 0xf104984a, 0x41ecdaf7, 0x7fcd500e, 0x1791f62f, + 0x764dd68d, 0x43efb04d, 0xccaa4d54, 0xe49604df, + 0x9ed1b5e3, 0x4c6a881b, 0xc12c1fb8, 0x4665517f, + 0x9d5eea04, 0x018c355d, 0xfa877473, 0xfb0b412e, + 0xb3671d5a, 0x92dbd252, 0xe9105633, 0x6dd64713, + 0x9ad7618c, 0x37a10c7a, 0x59f8148e, 0xeb133c89, + 0xcea927ee, 0xb761c935, 0xe11ce5ed, 0x7a47b13c, + 0x9cd2df59, 0x55f2733f, 0x1814ce79, 0x73c737bf, + 0x53f7cdea, 0x5ffdaa5b, 0xdf3d6f14, 0x7844db86, + 0xcaaff381, 0xb968c43e, 0x3824342c, 0xc2a3405f, + 0x161dc372, 0xbce2250c, 0x283c498b, 0xff0d9541, + 0x39a80171, 0x080cb3de, 0xd8b4e49c, 0x6456c190, + 0x7bcb8461, 0xd532b670, 0x486c5c74, 0xd0b85742, +}; + +__constant u32 td1[256] = +{ + 0x5051f4a7, 0x537e4165, 0xc31a17a4, 0x963a275e, + 0xcb3bab6b, 0xf11f9d45, 0xabacfa58, 0x934be303, + 0x552030fa, 0xf6ad766d, 0x9188cc76, 0x25f5024c, + 0xfc4fe5d7, 0xd7c52acb, 0x80263544, 0x8fb562a3, + 0x49deb15a, 0x6725ba1b, 0x9845ea0e, 0xe15dfec0, + 0x02c32f75, 0x12814cf0, 0xa38d4697, 0xc66bd3f9, + 0xe7038f5f, 0x9515929c, 0xebbf6d7a, 0xda955259, + 0x2dd4be83, 0xd3587421, 0x2949e069, 0x448ec9c8, + 0x6a75c289, 0x78f48e79, 0x6b99583e, 0xdd27b971, + 0xb6bee14f, 0x17f088ad, 0x66c920ac, 0xb47dce3a, + 0x1863df4a, 0x82e51a31, 0x60975133, 0x4562537f, + 0xe0b16477, 0x84bb6bae, 0x1cfe81a0, 0x94f9082b, + 0x58704868, 0x198f45fd, 0x8794de6c, 0xb7527bf8, + 0x23ab73d3, 0xe2724b02, 0x57e31f8f, 0x2a6655ab, + 0x07b2eb28, 0x032fb5c2, 0x9a86c57b, 0xa5d33708, + 0xf2302887, 0xb223bfa5, 0xba02036a, 0x5ced1682, + 0x2b8acf1c, 0x92a779b4, 0xf0f307f2, 0xa14e69e2, + 0xcd65daf4, 0xd50605be, 0x1fd13462, 0x8ac4a6fe, + 0x9d342e53, 0xa0a2f355, 0x32058ae1, 0x75a4f6eb, + 0x390b83ec, 0xaa4060ef, 0x065e719f, 0x51bd6e10, + 0xf93e218a, 0x3d96dd06, 0xaedd3e05, 0x464de6bd, + 0xb591548d, 0x0571c45d, 0x6f0406d4, 0xff605015, + 0x241998fb, 0x97d6bde9, 0xcc894043, 0x7767d99e, + 0xbdb0e842, 0x8807898b, 0x38e7195b, 0xdb79c8ee, + 0x47a17c0a, 0xe97c420f, 0xc9f8841e, 0x00000000, + 0x83098086, 0x48322bed, 0xac1e1170, 0x4e6c5a72, + 0xfbfd0eff, 0x560f8538, 0x1e3daed5, 0x27362d39, + 0x640a0fd9, 0x21685ca6, 0xd19b5b54, 0x3a24362e, + 0xb10c0a67, 0x0f9357e7, 0xd2b4ee96, 0x9e1b9b91, + 0x4f80c0c5, 0xa261dc20, 0x695a774b, 0x161c121a, + 0x0ae293ba, 0xe5c0a02a, 0x433c22e0, 0x1d121b17, + 0x0b0e090d, 0xadf28bc7, 0xb92db6a8, 0xc8141ea9, + 0x8557f119, 0x4caf7507, 0xbbee99dd, 0xfda37f60, + 0x9ff70126, 0xbc5c72f5, 0xc544663b, 0x345bfb7e, + 0x768b4329, 0xdccb23c6, 0x68b6edfc, 0x63b8e4f1, + 0xcad731dc, 0x10426385, 0x40139722, 0x2084c611, + 0x7d854a24, 0xf8d2bb3d, 0x11aef932, 0x6dc729a1, + 0x4b1d9e2f, 0xf3dcb230, 0xec0d8652, 0xd077c1e3, + 0x6c2bb316, 0x99a970b9, 0xfa119448, 0x2247e964, + 0xc4a8fc8c, 0x1aa0f03f, 0xd8567d2c, 0xef223390, + 0xc787494e, 0xc1d938d1, 0xfe8ccaa2, 0x3698d40b, + 0xcfa6f581, 0x28a57ade, 0x26dab78e, 0xa43fadbf, + 0xe42c3a9d, 0x0d507892, 0x9b6a5fcc, 0x62547e46, + 0xc2f68d13, 0xe890d8b8, 0x5e2e39f7, 0xf582c3af, + 0xbe9f5d80, 0x7c69d093, 0xa96fd52d, 0xb3cf2512, + 0x3bc8ac99, 0xa710187d, 0x6ee89c63, 0x7bdb3bbb, + 0x09cd2678, 0xf46e5918, 0x01ec9ab7, 0xa8834f9a, + 0x65e6956e, 0x7eaaffe6, 0x0821bccf, 0xe6ef15e8, + 0xd9bae79b, 0xce4a6f36, 0xd4ea9f09, 0xd629b07c, + 0xaf31a4b2, 0x312a3f23, 0x30c6a594, 0xc035a266, + 0x37744ebc, 0xa6fc82ca, 0xb0e090d0, 0x1533a7d8, + 0x4af10498, 0xf741ecda, 0x0e7fcd50, 0x2f1791f6, + 0x8d764dd6, 0x4d43efb0, 0x54ccaa4d, 0xdfe49604, + 0xe39ed1b5, 0x1b4c6a88, 0xb8c12c1f, 0x7f466551, + 0x049d5eea, 0x5d018c35, 0x73fa8774, 0x2efb0b41, + 0x5ab3671d, 0x5292dbd2, 0x33e91056, 0x136dd647, + 0x8c9ad761, 0x7a37a10c, 0x8e59f814, 0x89eb133c, + 0xeecea927, 0x35b761c9, 0xede11ce5, 0x3c7a47b1, + 0x599cd2df, 0x3f55f273, 0x791814ce, 0xbf73c737, + 0xea53f7cd, 0x5b5ffdaa, 0x14df3d6f, 0x867844db, + 0x81caaff3, 0x3eb968c4, 0x2c382434, 0x5fc2a340, + 0x72161dc3, 0x0cbce225, 0x8b283c49, 0x41ff0d95, + 0x7139a801, 0xde080cb3, 0x9cd8b4e4, 0x906456c1, + 0x617bcb84, 0x70d532b6, 0x74486c5c, 0x42d0b857, +}; + +__constant u32 td2[256] = +{ + 0xa75051f4, 0x65537e41, 0xa4c31a17, 0x5e963a27, + 0x6bcb3bab, 0x45f11f9d, 0x58abacfa, 0x03934be3, + 0xfa552030, 0x6df6ad76, 0x769188cc, 0x4c25f502, + 0xd7fc4fe5, 0xcbd7c52a, 0x44802635, 0xa38fb562, + 0x5a49deb1, 0x1b6725ba, 0x0e9845ea, 0xc0e15dfe, + 0x7502c32f, 0xf012814c, 0x97a38d46, 0xf9c66bd3, + 0x5fe7038f, 0x9c951592, 0x7aebbf6d, 0x59da9552, + 0x832dd4be, 0x21d35874, 0x692949e0, 0xc8448ec9, + 0x896a75c2, 0x7978f48e, 0x3e6b9958, 0x71dd27b9, + 0x4fb6bee1, 0xad17f088, 0xac66c920, 0x3ab47dce, + 0x4a1863df, 0x3182e51a, 0x33609751, 0x7f456253, + 0x77e0b164, 0xae84bb6b, 0xa01cfe81, 0x2b94f908, + 0x68587048, 0xfd198f45, 0x6c8794de, 0xf8b7527b, + 0xd323ab73, 0x02e2724b, 0x8f57e31f, 0xab2a6655, + 0x2807b2eb, 0xc2032fb5, 0x7b9a86c5, 0x08a5d337, + 0x87f23028, 0xa5b223bf, 0x6aba0203, 0x825ced16, + 0x1c2b8acf, 0xb492a779, 0xf2f0f307, 0xe2a14e69, + 0xf4cd65da, 0xbed50605, 0x621fd134, 0xfe8ac4a6, + 0x539d342e, 0x55a0a2f3, 0xe132058a, 0xeb75a4f6, + 0xec390b83, 0xefaa4060, 0x9f065e71, 0x1051bd6e, + 0x8af93e21, 0x063d96dd, 0x05aedd3e, 0xbd464de6, + 0x8db59154, 0x5d0571c4, 0xd46f0406, 0x15ff6050, + 0xfb241998, 0xe997d6bd, 0x43cc8940, 0x9e7767d9, + 0x42bdb0e8, 0x8b880789, 0x5b38e719, 0xeedb79c8, + 0x0a47a17c, 0x0fe97c42, 0x1ec9f884, 0x00000000, + 0x86830980, 0xed48322b, 0x70ac1e11, 0x724e6c5a, + 0xfffbfd0e, 0x38560f85, 0xd51e3dae, 0x3927362d, + 0xd9640a0f, 0xa621685c, 0x54d19b5b, 0x2e3a2436, + 0x67b10c0a, 0xe70f9357, 0x96d2b4ee, 0x919e1b9b, + 0xc54f80c0, 0x20a261dc, 0x4b695a77, 0x1a161c12, + 0xba0ae293, 0x2ae5c0a0, 0xe0433c22, 0x171d121b, + 0x0d0b0e09, 0xc7adf28b, 0xa8b92db6, 0xa9c8141e, + 0x198557f1, 0x074caf75, 0xddbbee99, 0x60fda37f, + 0x269ff701, 0xf5bc5c72, 0x3bc54466, 0x7e345bfb, + 0x29768b43, 0xc6dccb23, 0xfc68b6ed, 0xf163b8e4, + 0xdccad731, 0x85104263, 0x22401397, 0x112084c6, + 0x247d854a, 0x3df8d2bb, 0x3211aef9, 0xa16dc729, + 0x2f4b1d9e, 0x30f3dcb2, 0x52ec0d86, 0xe3d077c1, + 0x166c2bb3, 0xb999a970, 0x48fa1194, 0x642247e9, + 0x8cc4a8fc, 0x3f1aa0f0, 0x2cd8567d, 0x90ef2233, + 0x4ec78749, 0xd1c1d938, 0xa2fe8cca, 0x0b3698d4, + 0x81cfa6f5, 0xde28a57a, 0x8e26dab7, 0xbfa43fad, + 0x9de42c3a, 0x920d5078, 0xcc9b6a5f, 0x4662547e, + 0x13c2f68d, 0xb8e890d8, 0xf75e2e39, 0xaff582c3, + 0x80be9f5d, 0x937c69d0, 0x2da96fd5, 0x12b3cf25, + 0x993bc8ac, 0x7da71018, 0x636ee89c, 0xbb7bdb3b, + 0x7809cd26, 0x18f46e59, 0xb701ec9a, 0x9aa8834f, + 0x6e65e695, 0xe67eaaff, 0xcf0821bc, 0xe8e6ef15, + 0x9bd9bae7, 0x36ce4a6f, 0x09d4ea9f, 0x7cd629b0, + 0xb2af31a4, 0x23312a3f, 0x9430c6a5, 0x66c035a2, + 0xbc37744e, 0xcaa6fc82, 0xd0b0e090, 0xd81533a7, + 0x984af104, 0xdaf741ec, 0x500e7fcd, 0xf62f1791, + 0xd68d764d, 0xb04d43ef, 0x4d54ccaa, 0x04dfe496, + 0xb5e39ed1, 0x881b4c6a, 0x1fb8c12c, 0x517f4665, + 0xea049d5e, 0x355d018c, 0x7473fa87, 0x412efb0b, + 0x1d5ab367, 0xd25292db, 0x5633e910, 0x47136dd6, + 0x618c9ad7, 0x0c7a37a1, 0x148e59f8, 0x3c89eb13, + 0x27eecea9, 0xc935b761, 0xe5ede11c, 0xb13c7a47, + 0xdf599cd2, 0x733f55f2, 0xce791814, 0x37bf73c7, + 0xcdea53f7, 0xaa5b5ffd, 0x6f14df3d, 0xdb867844, + 0xf381caaf, 0xc43eb968, 0x342c3824, 0x405fc2a3, + 0xc372161d, 0x250cbce2, 0x498b283c, 0x9541ff0d, + 0x017139a8, 0xb3de080c, 0xe49cd8b4, 0xc1906456, + 0x84617bcb, 0xb670d532, 0x5c74486c, 0x5742d0b8, +}; + +__constant u32 td3[256] = +{ + 0xf4a75051, 0x4165537e, 0x17a4c31a, 0x275e963a, + 0xab6bcb3b, 0x9d45f11f, 0xfa58abac, 0xe303934b, + 0x30fa5520, 0x766df6ad, 0xcc769188, 0x024c25f5, + 0xe5d7fc4f, 0x2acbd7c5, 0x35448026, 0x62a38fb5, + 0xb15a49de, 0xba1b6725, 0xea0e9845, 0xfec0e15d, + 0x2f7502c3, 0x4cf01281, 0x4697a38d, 0xd3f9c66b, + 0x8f5fe703, 0x929c9515, 0x6d7aebbf, 0x5259da95, + 0xbe832dd4, 0x7421d358, 0xe0692949, 0xc9c8448e, + 0xc2896a75, 0x8e7978f4, 0x583e6b99, 0xb971dd27, + 0xe14fb6be, 0x88ad17f0, 0x20ac66c9, 0xce3ab47d, + 0xdf4a1863, 0x1a3182e5, 0x51336097, 0x537f4562, + 0x6477e0b1, 0x6bae84bb, 0x81a01cfe, 0x082b94f9, + 0x48685870, 0x45fd198f, 0xde6c8794, 0x7bf8b752, + 0x73d323ab, 0x4b02e272, 0x1f8f57e3, 0x55ab2a66, + 0xeb2807b2, 0xb5c2032f, 0xc57b9a86, 0x3708a5d3, + 0x2887f230, 0xbfa5b223, 0x036aba02, 0x16825ced, + 0xcf1c2b8a, 0x79b492a7, 0x07f2f0f3, 0x69e2a14e, + 0xdaf4cd65, 0x05bed506, 0x34621fd1, 0xa6fe8ac4, + 0x2e539d34, 0xf355a0a2, 0x8ae13205, 0xf6eb75a4, + 0x83ec390b, 0x60efaa40, 0x719f065e, 0x6e1051bd, + 0x218af93e, 0xdd063d96, 0x3e05aedd, 0xe6bd464d, + 0x548db591, 0xc45d0571, 0x06d46f04, 0x5015ff60, + 0x98fb2419, 0xbde997d6, 0x4043cc89, 0xd99e7767, + 0xe842bdb0, 0x898b8807, 0x195b38e7, 0xc8eedb79, + 0x7c0a47a1, 0x420fe97c, 0x841ec9f8, 0x00000000, + 0x80868309, 0x2bed4832, 0x1170ac1e, 0x5a724e6c, + 0x0efffbfd, 0x8538560f, 0xaed51e3d, 0x2d392736, + 0x0fd9640a, 0x5ca62168, 0x5b54d19b, 0x362e3a24, + 0x0a67b10c, 0x57e70f93, 0xee96d2b4, 0x9b919e1b, + 0xc0c54f80, 0xdc20a261, 0x774b695a, 0x121a161c, + 0x93ba0ae2, 0xa02ae5c0, 0x22e0433c, 0x1b171d12, + 0x090d0b0e, 0x8bc7adf2, 0xb6a8b92d, 0x1ea9c814, + 0xf1198557, 0x75074caf, 0x99ddbbee, 0x7f60fda3, + 0x01269ff7, 0x72f5bc5c, 0x663bc544, 0xfb7e345b, + 0x4329768b, 0x23c6dccb, 0xedfc68b6, 0xe4f163b8, + 0x31dccad7, 0x63851042, 0x97224013, 0xc6112084, + 0x4a247d85, 0xbb3df8d2, 0xf93211ae, 0x29a16dc7, + 0x9e2f4b1d, 0xb230f3dc, 0x8652ec0d, 0xc1e3d077, + 0xb3166c2b, 0x70b999a9, 0x9448fa11, 0xe9642247, + 0xfc8cc4a8, 0xf03f1aa0, 0x7d2cd856, 0x3390ef22, + 0x494ec787, 0x38d1c1d9, 0xcaa2fe8c, 0xd40b3698, + 0xf581cfa6, 0x7ade28a5, 0xb78e26da, 0xadbfa43f, + 0x3a9de42c, 0x78920d50, 0x5fcc9b6a, 0x7e466254, + 0x8d13c2f6, 0xd8b8e890, 0x39f75e2e, 0xc3aff582, + 0x5d80be9f, 0xd0937c69, 0xd52da96f, 0x2512b3cf, + 0xac993bc8, 0x187da710, 0x9c636ee8, 0x3bbb7bdb, + 0x267809cd, 0x5918f46e, 0x9ab701ec, 0x4f9aa883, + 0x956e65e6, 0xffe67eaa, 0xbccf0821, 0x15e8e6ef, + 0xe79bd9ba, 0x6f36ce4a, 0x9f09d4ea, 0xb07cd629, + 0xa4b2af31, 0x3f23312a, 0xa59430c6, 0xa266c035, + 0x4ebc3774, 0x82caa6fc, 0x90d0b0e0, 0xa7d81533, + 0x04984af1, 0xecdaf741, 0xcd500e7f, 0x91f62f17, + 0x4dd68d76, 0xefb04d43, 0xaa4d54cc, 0x9604dfe4, + 0xd1b5e39e, 0x6a881b4c, 0x2c1fb8c1, 0x65517f46, + 0x5eea049d, 0x8c355d01, 0x877473fa, 0x0b412efb, + 0x671d5ab3, 0xdbd25292, 0x105633e9, 0xd647136d, + 0xd7618c9a, 0xa10c7a37, 0xf8148e59, 0x133c89eb, + 0xa927eece, 0x61c935b7, 0x1ce5ede1, 0x47b13c7a, + 0xd2df599c, 0xf2733f55, 0x14ce7918, 0xc737bf73, + 0xf7cdea53, 0xfdaa5b5f, 0x3d6f14df, 0x44db8678, + 0xaff381ca, 0x68c43eb9, 0x24342c38, 0xa3405fc2, + 0x1dc37216, 0xe2250cbc, 0x3c498b28, 0x0d9541ff, + 0xa8017139, 0x0cb3de08, 0xb4e49cd8, 0x56c19064, + 0xcb84617b, 0x32b670d5, 0x6c5c7448, 0xb85742d0, +}; + +__constant u32 td4[256] = +{ + 0x52525252, 0x09090909, 0x6a6a6a6a, 0xd5d5d5d5, + 0x30303030, 0x36363636, 0xa5a5a5a5, 0x38383838, + 0xbfbfbfbf, 0x40404040, 0xa3a3a3a3, 0x9e9e9e9e, + 0x81818181, 0xf3f3f3f3, 0xd7d7d7d7, 0xfbfbfbfb, + 0x7c7c7c7c, 0xe3e3e3e3, 0x39393939, 0x82828282, + 0x9b9b9b9b, 0x2f2f2f2f, 0xffffffff, 0x87878787, + 0x34343434, 0x8e8e8e8e, 0x43434343, 0x44444444, + 0xc4c4c4c4, 0xdededede, 0xe9e9e9e9, 0xcbcbcbcb, + 0x54545454, 0x7b7b7b7b, 0x94949494, 0x32323232, + 0xa6a6a6a6, 0xc2c2c2c2, 0x23232323, 0x3d3d3d3d, + 0xeeeeeeee, 0x4c4c4c4c, 0x95959595, 0x0b0b0b0b, + 0x42424242, 0xfafafafa, 0xc3c3c3c3, 0x4e4e4e4e, + 0x08080808, 0x2e2e2e2e, 0xa1a1a1a1, 0x66666666, + 0x28282828, 0xd9d9d9d9, 0x24242424, 0xb2b2b2b2, + 0x76767676, 0x5b5b5b5b, 0xa2a2a2a2, 0x49494949, + 0x6d6d6d6d, 0x8b8b8b8b, 0xd1d1d1d1, 0x25252525, + 0x72727272, 0xf8f8f8f8, 0xf6f6f6f6, 0x64646464, + 0x86868686, 0x68686868, 0x98989898, 0x16161616, + 0xd4d4d4d4, 0xa4a4a4a4, 0x5c5c5c5c, 0xcccccccc, + 0x5d5d5d5d, 0x65656565, 0xb6b6b6b6, 0x92929292, + 0x6c6c6c6c, 0x70707070, 0x48484848, 0x50505050, + 0xfdfdfdfd, 0xedededed, 0xb9b9b9b9, 0xdadadada, + 0x5e5e5e5e, 0x15151515, 0x46464646, 0x57575757, + 0xa7a7a7a7, 0x8d8d8d8d, 0x9d9d9d9d, 0x84848484, + 0x90909090, 0xd8d8d8d8, 0xabababab, 0x00000000, + 0x8c8c8c8c, 0xbcbcbcbc, 0xd3d3d3d3, 0x0a0a0a0a, + 0xf7f7f7f7, 0xe4e4e4e4, 0x58585858, 0x05050505, + 0xb8b8b8b8, 0xb3b3b3b3, 0x45454545, 0x06060606, + 0xd0d0d0d0, 0x2c2c2c2c, 0x1e1e1e1e, 0x8f8f8f8f, + 0xcacacaca, 0x3f3f3f3f, 0x0f0f0f0f, 0x02020202, + 0xc1c1c1c1, 0xafafafaf, 0xbdbdbdbd, 0x03030303, + 0x01010101, 0x13131313, 0x8a8a8a8a, 0x6b6b6b6b, + 0x3a3a3a3a, 0x91919191, 0x11111111, 0x41414141, + 0x4f4f4f4f, 0x67676767, 0xdcdcdcdc, 0xeaeaeaea, + 0x97979797, 0xf2f2f2f2, 0xcfcfcfcf, 0xcececece, + 0xf0f0f0f0, 0xb4b4b4b4, 0xe6e6e6e6, 0x73737373, + 0x96969696, 0xacacacac, 0x74747474, 0x22222222, + 0xe7e7e7e7, 0xadadadad, 0x35353535, 0x85858585, + 0xe2e2e2e2, 0xf9f9f9f9, 0x37373737, 0xe8e8e8e8, + 0x1c1c1c1c, 0x75757575, 0xdfdfdfdf, 0x6e6e6e6e, + 0x47474747, 0xf1f1f1f1, 0x1a1a1a1a, 0x71717171, + 0x1d1d1d1d, 0x29292929, 0xc5c5c5c5, 0x89898989, + 0x6f6f6f6f, 0xb7b7b7b7, 0x62626262, 0x0e0e0e0e, + 0xaaaaaaaa, 0x18181818, 0xbebebebe, 0x1b1b1b1b, + 0xfcfcfcfc, 0x56565656, 0x3e3e3e3e, 0x4b4b4b4b, + 0xc6c6c6c6, 0xd2d2d2d2, 0x79797979, 0x20202020, + 0x9a9a9a9a, 0xdbdbdbdb, 0xc0c0c0c0, 0xfefefefe, + 0x78787878, 0xcdcdcdcd, 0x5a5a5a5a, 0xf4f4f4f4, + 0x1f1f1f1f, 0xdddddddd, 0xa8a8a8a8, 0x33333333, + 0x88888888, 0x07070707, 0xc7c7c7c7, 0x31313131, + 0xb1b1b1b1, 0x12121212, 0x10101010, 0x59595959, + 0x27272727, 0x80808080, 0xecececec, 0x5f5f5f5f, + 0x60606060, 0x51515151, 0x7f7f7f7f, 0xa9a9a9a9, + 0x19191919, 0xb5b5b5b5, 0x4a4a4a4a, 0x0d0d0d0d, + 0x2d2d2d2d, 0xe5e5e5e5, 0x7a7a7a7a, 0x9f9f9f9f, + 0x93939393, 0xc9c9c9c9, 0x9c9c9c9c, 0xefefefef, + 0xa0a0a0a0, 0xe0e0e0e0, 0x3b3b3b3b, 0x4d4d4d4d, + 0xaeaeaeae, 0x2a2a2a2a, 0xf5f5f5f5, 0xb0b0b0b0, + 0xc8c8c8c8, 0xebebebeb, 0xbbbbbbbb, 0x3c3c3c3c, + 0x83838383, 0x53535353, 0x99999999, 0x61616161, + 0x17171717, 0x2b2b2b2b, 0x04040404, 0x7e7e7e7e, + 0xbabababa, 0x77777777, 0xd6d6d6d6, 0x26262626, + 0xe1e1e1e1, 0x69696969, 0x14141414, 0x63636363, + 0x55555555, 0x21212121, 0x0c0c0c0c, 0x7d7d7d7d, +}; + +__constant u32 rcon[] = +{ + 0x01000000, 0x02000000, 0x04000000, 0x08000000, + 0x10000000, 0x20000000, 0x40000000, 0x80000000, + 0x1b000000, 0x36000000, +}; + +static void AES128_ExpandKey (u32 *userkey, u32 *rek, __local u32 s_te0[256], __local u32 s_te1[256], __local u32 s_te2[256], __local u32 s_te3[256], __local u32 s_te4[256]) +{ + rek[0] = userkey[0]; + rek[1] = userkey[1]; + rek[2] = userkey[2]; + rek[3] = userkey[3]; + + for (u32 i = 0, j = 0; i < 10; i += 1, j += 4) + { + u32 temp = rek[j + 3]; + + temp = (s_te2[(temp >> 16) & 0xff] & 0xff000000) + ^ (s_te3[(temp >> 8) & 0xff] & 0x00ff0000) + ^ (s_te0[(temp >> 0) & 0xff] & 0x0000ff00) + ^ (s_te1[(temp >> 24) & 0xff] & 0x000000ff); + + rek[j + 4] = rek[j + 0] + ^ temp + ^ rcon[i]; + + rek[j + 5] = rek[j + 1] ^ rek[j + 4]; + rek[j + 6] = rek[j + 2] ^ rek[j + 5]; + rek[j + 7] = rek[j + 3] ^ rek[j + 6]; + } +} + +static void AES128_InvertKey (u32 *rdk, __local u32 s_td0[256], __local u32 s_td1[256], __local u32 s_td2[256], __local u32 s_td3[256], __local u32 s_td4[256], __local u32 s_te0[256], __local u32 s_te1[256], __local u32 s_te2[256], __local u32 s_te3[256], __local u32 s_te4[256]) +{ + for (u32 i = 0, j = 40; i < j; i += 4, j -= 4) + { + u32 temp; + + temp = rdk[i + 0]; rdk[i + 0] = rdk[j + 0]; rdk[j + 0] = temp; + temp = rdk[i + 1]; rdk[i + 1] = rdk[j + 1]; rdk[j + 1] = temp; + temp = rdk[i + 2]; rdk[i + 2] = rdk[j + 2]; rdk[j + 2] = temp; + temp = rdk[i + 3]; rdk[i + 3] = rdk[j + 3]; rdk[j + 3] = temp; + } + + for (u32 i = 1, j = 4; i < 10; i += 1, j += 4) + { + rdk[j + 0] = + s_td0[s_te1[(rdk[j + 0] >> 24) & 0xff] & 0xff] ^ + s_td1[s_te1[(rdk[j + 0] >> 16) & 0xff] & 0xff] ^ + s_td2[s_te1[(rdk[j + 0] >> 8) & 0xff] & 0xff] ^ + s_td3[s_te1[(rdk[j + 0] >> 0) & 0xff] & 0xff]; + + rdk[j + 1] = + s_td0[s_te1[(rdk[j + 1] >> 24) & 0xff] & 0xff] ^ + s_td1[s_te1[(rdk[j + 1] >> 16) & 0xff] & 0xff] ^ + s_td2[s_te1[(rdk[j + 1] >> 8) & 0xff] & 0xff] ^ + s_td3[s_te1[(rdk[j + 1] >> 0) & 0xff] & 0xff]; + + rdk[j + 2] = + s_td0[s_te1[(rdk[j + 2] >> 24) & 0xff] & 0xff] ^ + s_td1[s_te1[(rdk[j + 2] >> 16) & 0xff] & 0xff] ^ + s_td2[s_te1[(rdk[j + 2] >> 8) & 0xff] & 0xff] ^ + s_td3[s_te1[(rdk[j + 2] >> 0) & 0xff] & 0xff]; + + rdk[j + 3] = + s_td0[s_te1[(rdk[j + 3] >> 24) & 0xff] & 0xff] ^ + s_td1[s_te1[(rdk[j + 3] >> 16) & 0xff] & 0xff] ^ + s_td2[s_te1[(rdk[j + 3] >> 8) & 0xff] & 0xff] ^ + s_td3[s_te1[(rdk[j + 3] >> 0) & 0xff] & 0xff]; + } +} + +static void AES128_decrypt (const u32 *in, u32 *out, const u32 *rdk, __local u32 s_td0[256], __local u32 s_td1[256], __local u32 s_td2[256], __local u32 s_td3[256], __local u32 s_td4[256]) +{ + u32 s0 = in[0] ^ rdk[0]; + u32 s1 = in[1] ^ rdk[1]; + u32 s2 = in[2] ^ rdk[2]; + u32 s3 = in[3] ^ rdk[3]; + + u32 t0; + u32 t1; + u32 t2; + u32 t3; + + t0 = s_td0[s0 >> 24] ^ s_td1[(s3 >> 16) & 0xff] ^ s_td2[(s2 >> 8) & 0xff] ^ s_td3[s1 & 0xff] ^ rdk[ 4]; + t1 = s_td0[s1 >> 24] ^ s_td1[(s0 >> 16) & 0xff] ^ s_td2[(s3 >> 8) & 0xff] ^ s_td3[s2 & 0xff] ^ rdk[ 5]; + t2 = s_td0[s2 >> 24] ^ s_td1[(s1 >> 16) & 0xff] ^ s_td2[(s0 >> 8) & 0xff] ^ s_td3[s3 & 0xff] ^ rdk[ 6]; + t3 = s_td0[s3 >> 24] ^ s_td1[(s2 >> 16) & 0xff] ^ s_td2[(s1 >> 8) & 0xff] ^ s_td3[s0 & 0xff] ^ rdk[ 7]; + s0 = s_td0[t0 >> 24] ^ s_td1[(t3 >> 16) & 0xff] ^ s_td2[(t2 >> 8) & 0xff] ^ s_td3[t1 & 0xff] ^ rdk[ 8]; + s1 = s_td0[t1 >> 24] ^ s_td1[(t0 >> 16) & 0xff] ^ s_td2[(t3 >> 8) & 0xff] ^ s_td3[t2 & 0xff] ^ rdk[ 9]; + s2 = s_td0[t2 >> 24] ^ s_td1[(t1 >> 16) & 0xff] ^ s_td2[(t0 >> 8) & 0xff] ^ s_td3[t3 & 0xff] ^ rdk[10]; + s3 = s_td0[t3 >> 24] ^ s_td1[(t2 >> 16) & 0xff] ^ s_td2[(t1 >> 8) & 0xff] ^ s_td3[t0 & 0xff] ^ rdk[11]; + t0 = s_td0[s0 >> 24] ^ s_td1[(s3 >> 16) & 0xff] ^ s_td2[(s2 >> 8) & 0xff] ^ s_td3[s1 & 0xff] ^ rdk[12]; + t1 = s_td0[s1 >> 24] ^ s_td1[(s0 >> 16) & 0xff] ^ s_td2[(s3 >> 8) & 0xff] ^ s_td3[s2 & 0xff] ^ rdk[13]; + t2 = s_td0[s2 >> 24] ^ s_td1[(s1 >> 16) & 0xff] ^ s_td2[(s0 >> 8) & 0xff] ^ s_td3[s3 & 0xff] ^ rdk[14]; + t3 = s_td0[s3 >> 24] ^ s_td1[(s2 >> 16) & 0xff] ^ s_td2[(s1 >> 8) & 0xff] ^ s_td3[s0 & 0xff] ^ rdk[15]; + s0 = s_td0[t0 >> 24] ^ s_td1[(t3 >> 16) & 0xff] ^ s_td2[(t2 >> 8) & 0xff] ^ s_td3[t1 & 0xff] ^ rdk[16]; + s1 = s_td0[t1 >> 24] ^ s_td1[(t0 >> 16) & 0xff] ^ s_td2[(t3 >> 8) & 0xff] ^ s_td3[t2 & 0xff] ^ rdk[17]; + s2 = s_td0[t2 >> 24] ^ s_td1[(t1 >> 16) & 0xff] ^ s_td2[(t0 >> 8) & 0xff] ^ s_td3[t3 & 0xff] ^ rdk[18]; + s3 = s_td0[t3 >> 24] ^ s_td1[(t2 >> 16) & 0xff] ^ s_td2[(t1 >> 8) & 0xff] ^ s_td3[t0 & 0xff] ^ rdk[19]; + t0 = s_td0[s0 >> 24] ^ s_td1[(s3 >> 16) & 0xff] ^ s_td2[(s2 >> 8) & 0xff] ^ s_td3[s1 & 0xff] ^ rdk[20]; + t1 = s_td0[s1 >> 24] ^ s_td1[(s0 >> 16) & 0xff] ^ s_td2[(s3 >> 8) & 0xff] ^ s_td3[s2 & 0xff] ^ rdk[21]; + t2 = s_td0[s2 >> 24] ^ s_td1[(s1 >> 16) & 0xff] ^ s_td2[(s0 >> 8) & 0xff] ^ s_td3[s3 & 0xff] ^ rdk[22]; + t3 = s_td0[s3 >> 24] ^ s_td1[(s2 >> 16) & 0xff] ^ s_td2[(s1 >> 8) & 0xff] ^ s_td3[s0 & 0xff] ^ rdk[23]; + s0 = s_td0[t0 >> 24] ^ s_td1[(t3 >> 16) & 0xff] ^ s_td2[(t2 >> 8) & 0xff] ^ s_td3[t1 & 0xff] ^ rdk[24]; + s1 = s_td0[t1 >> 24] ^ s_td1[(t0 >> 16) & 0xff] ^ s_td2[(t3 >> 8) & 0xff] ^ s_td3[t2 & 0xff] ^ rdk[25]; + s2 = s_td0[t2 >> 24] ^ s_td1[(t1 >> 16) & 0xff] ^ s_td2[(t0 >> 8) & 0xff] ^ s_td3[t3 & 0xff] ^ rdk[26]; + s3 = s_td0[t3 >> 24] ^ s_td1[(t2 >> 16) & 0xff] ^ s_td2[(t1 >> 8) & 0xff] ^ s_td3[t0 & 0xff] ^ rdk[27]; + t0 = s_td0[s0 >> 24] ^ s_td1[(s3 >> 16) & 0xff] ^ s_td2[(s2 >> 8) & 0xff] ^ s_td3[s1 & 0xff] ^ rdk[28]; + t1 = s_td0[s1 >> 24] ^ s_td1[(s0 >> 16) & 0xff] ^ s_td2[(s3 >> 8) & 0xff] ^ s_td3[s2 & 0xff] ^ rdk[29]; + t2 = s_td0[s2 >> 24] ^ s_td1[(s1 >> 16) & 0xff] ^ s_td2[(s0 >> 8) & 0xff] ^ s_td3[s3 & 0xff] ^ rdk[30]; + t3 = s_td0[s3 >> 24] ^ s_td1[(s2 >> 16) & 0xff] ^ s_td2[(s1 >> 8) & 0xff] ^ s_td3[s0 & 0xff] ^ rdk[31]; + s0 = s_td0[t0 >> 24] ^ s_td1[(t3 >> 16) & 0xff] ^ s_td2[(t2 >> 8) & 0xff] ^ s_td3[t1 & 0xff] ^ rdk[32]; + s1 = s_td0[t1 >> 24] ^ s_td1[(t0 >> 16) & 0xff] ^ s_td2[(t3 >> 8) & 0xff] ^ s_td3[t2 & 0xff] ^ rdk[33]; + s2 = s_td0[t2 >> 24] ^ s_td1[(t1 >> 16) & 0xff] ^ s_td2[(t0 >> 8) & 0xff] ^ s_td3[t3 & 0xff] ^ rdk[34]; + s3 = s_td0[t3 >> 24] ^ s_td1[(t2 >> 16) & 0xff] ^ s_td2[(t1 >> 8) & 0xff] ^ s_td3[t0 & 0xff] ^ rdk[35]; + t0 = s_td0[s0 >> 24] ^ s_td1[(s3 >> 16) & 0xff] ^ s_td2[(s2 >> 8) & 0xff] ^ s_td3[s1 & 0xff] ^ rdk[36]; + t1 = s_td0[s1 >> 24] ^ s_td1[(s0 >> 16) & 0xff] ^ s_td2[(s3 >> 8) & 0xff] ^ s_td3[s2 & 0xff] ^ rdk[37]; + t2 = s_td0[s2 >> 24] ^ s_td1[(s1 >> 16) & 0xff] ^ s_td2[(s0 >> 8) & 0xff] ^ s_td3[s3 & 0xff] ^ rdk[38]; + t3 = s_td0[s3 >> 24] ^ s_td1[(s2 >> 16) & 0xff] ^ s_td2[(s1 >> 8) & 0xff] ^ s_td3[s0 & 0xff] ^ rdk[39]; + + out[0] = (s_td4[(t0 >> 24) & 0xff] & 0xff000000) + ^ (s_td4[(t3 >> 16) & 0xff] & 0x00ff0000) + ^ (s_td4[(t2 >> 8) & 0xff] & 0x0000ff00) + ^ (s_td4[(t1 >> 0) & 0xff] & 0x000000ff) + ^ rdk[40]; + + out[1] = (s_td4[(t1 >> 24) & 0xff] & 0xff000000) + ^ (s_td4[(t0 >> 16) & 0xff] & 0x00ff0000) + ^ (s_td4[(t3 >> 8) & 0xff] & 0x0000ff00) + ^ (s_td4[(t2 >> 0) & 0xff] & 0x000000ff) + ^ rdk[41]; + + out[2] = (s_td4[(t2 >> 24) & 0xff] & 0xff000000) + ^ (s_td4[(t1 >> 16) & 0xff] & 0x00ff0000) + ^ (s_td4[(t0 >> 8) & 0xff] & 0x0000ff00) + ^ (s_td4[(t3 >> 0) & 0xff] & 0x000000ff) + ^ rdk[42]; + + out[3] = (s_td4[(t3 >> 24) & 0xff] & 0xff000000) + ^ (s_td4[(t2 >> 16) & 0xff] & 0x00ff0000) + ^ (s_td4[(t1 >> 8) & 0xff] & 0x0000ff00) + ^ (s_td4[(t0 >> 0) & 0xff] & 0x000000ff) + ^ rdk[43]; +} + +static void AES256_ExpandKey (u32 *userkey, u32 *rek, __local u32 s_te0[256], __local u32 s_te1[256], __local u32 s_te2[256], __local u32 s_te3[256], __local u32 s_te4[256]) +{ + rek[0] = userkey[0]; + rek[1] = userkey[1]; + rek[2] = userkey[2]; + rek[3] = userkey[3]; + rek[4] = userkey[4]; + rek[5] = userkey[5]; + rek[6] = userkey[6]; + rek[7] = userkey[7]; + + int i; + int j; + + i = 0; + j = 0; + + u32 run = 1; + + while (run) + { + u32 temp = rek[j + 7]; + + rek[j + 8] = rek[j + 0] + ^ (s_te2[(temp >> 16) & 0xff] & 0xff000000) + ^ (s_te3[(temp >> 8) & 0xff] & 0x00ff0000) + ^ (s_te0[(temp >> 0) & 0xff] & 0x0000ff00) + ^ (s_te1[(temp >> 24) & 0xff] & 0x000000ff) + ^ rcon[i]; + + rek[j + 9] = rek[j + 1] ^ rek[j + 8]; + rek[j + 10] = rek[j + 2] ^ rek[j + 9]; + rek[j + 11] = rek[j + 3] ^ rek[j + 10]; + + if (++i == 7) + { + run = 0; + continue; + } + + temp = rek[j + 11]; + + rek[j + 12] = rek[j + 4] + ^ (s_te2[(temp >> 24) & 0xff] & 0xff000000) + ^ (s_te3[(temp >> 16) & 0xff] & 0x00ff0000) + ^ (s_te0[(temp >> 8) & 0xff] & 0x0000ff00) + ^ (s_te1[(temp >> 0) & 0xff] & 0x000000ff); + + rek[j + 13] = rek[j + 5] ^ rek[j + 12]; + rek[j + 14] = rek[j + 6] ^ rek[j + 13]; + rek[j + 15] = rek[j + 7] ^ rek[j + 14]; + + j += 8; + } +} + +static void AES256_InvertKey (u32 *rdk, __local u32 s_td0[256], __local u32 s_td1[256], __local u32 s_td2[256], __local u32 s_td3[256], __local u32 s_td4[256], __local u32 s_te0[256], __local u32 s_te1[256], __local u32 s_te2[256], __local u32 s_te3[256], __local u32 s_te4[256]) +{ + for (u32 i = 0, j = 56; i < j; i += 4, j -= 4) + { + u32 temp; + + temp = rdk[i + 0]; rdk[i + 0] = rdk[j + 0]; rdk[j + 0] = temp; + temp = rdk[i + 1]; rdk[i + 1] = rdk[j + 1]; rdk[j + 1] = temp; + temp = rdk[i + 2]; rdk[i + 2] = rdk[j + 2]; rdk[j + 2] = temp; + temp = rdk[i + 3]; rdk[i + 3] = rdk[j + 3]; rdk[j + 3] = temp; + } + + for (u32 i = 1, j = 4; i < 14; i += 1, j += 4) + { + rdk[j + 0] = + s_td0[s_te1[(rdk[j + 0] >> 24) & 0xff] & 0xff] ^ + s_td1[s_te1[(rdk[j + 0] >> 16) & 0xff] & 0xff] ^ + s_td2[s_te1[(rdk[j + 0] >> 8) & 0xff] & 0xff] ^ + s_td3[s_te1[(rdk[j + 0] >> 0) & 0xff] & 0xff]; + + rdk[j + 1] = + s_td0[s_te1[(rdk[j + 1] >> 24) & 0xff] & 0xff] ^ + s_td1[s_te1[(rdk[j + 1] >> 16) & 0xff] & 0xff] ^ + s_td2[s_te1[(rdk[j + 1] >> 8) & 0xff] & 0xff] ^ + s_td3[s_te1[(rdk[j + 1] >> 0) & 0xff] & 0xff]; + + rdk[j + 2] = + s_td0[s_te1[(rdk[j + 2] >> 24) & 0xff] & 0xff] ^ + s_td1[s_te1[(rdk[j + 2] >> 16) & 0xff] & 0xff] ^ + s_td2[s_te1[(rdk[j + 2] >> 8) & 0xff] & 0xff] ^ + s_td3[s_te1[(rdk[j + 2] >> 0) & 0xff] & 0xff]; + + rdk[j + 3] = + s_td0[s_te1[(rdk[j + 3] >> 24) & 0xff] & 0xff] ^ + s_td1[s_te1[(rdk[j + 3] >> 16) & 0xff] & 0xff] ^ + s_td2[s_te1[(rdk[j + 3] >> 8) & 0xff] & 0xff] ^ + s_td3[s_te1[(rdk[j + 3] >> 0) & 0xff] & 0xff]; + } +} + +static void AES256_decrypt (const u32 *in, u32 *out, const u32 *rdk, __local u32 s_td0[256], __local u32 s_td1[256], __local u32 s_td2[256], __local u32 s_td3[256], __local u32 s_td4[256]) +{ + u32 s0 = in[0] ^ rdk[0]; + u32 s1 = in[1] ^ rdk[1]; + u32 s2 = in[2] ^ rdk[2]; + u32 s3 = in[3] ^ rdk[3]; + + u32 t0; + u32 t1; + u32 t2; + u32 t3; + + t0 = s_td0[s0 >> 24] ^ s_td1[(s3 >> 16) & 0xff] ^ s_td2[(s2 >> 8) & 0xff] ^ s_td3[s1 & 0xff] ^ rdk[ 4]; + t1 = s_td0[s1 >> 24] ^ s_td1[(s0 >> 16) & 0xff] ^ s_td2[(s3 >> 8) & 0xff] ^ s_td3[s2 & 0xff] ^ rdk[ 5]; + t2 = s_td0[s2 >> 24] ^ s_td1[(s1 >> 16) & 0xff] ^ s_td2[(s0 >> 8) & 0xff] ^ s_td3[s3 & 0xff] ^ rdk[ 6]; + t3 = s_td0[s3 >> 24] ^ s_td1[(s2 >> 16) & 0xff] ^ s_td2[(s1 >> 8) & 0xff] ^ s_td3[s0 & 0xff] ^ rdk[ 7]; + s0 = s_td0[t0 >> 24] ^ s_td1[(t3 >> 16) & 0xff] ^ s_td2[(t2 >> 8) & 0xff] ^ s_td3[t1 & 0xff] ^ rdk[ 8]; + s1 = s_td0[t1 >> 24] ^ s_td1[(t0 >> 16) & 0xff] ^ s_td2[(t3 >> 8) & 0xff] ^ s_td3[t2 & 0xff] ^ rdk[ 9]; + s2 = s_td0[t2 >> 24] ^ s_td1[(t1 >> 16) & 0xff] ^ s_td2[(t0 >> 8) & 0xff] ^ s_td3[t3 & 0xff] ^ rdk[10]; + s3 = s_td0[t3 >> 24] ^ s_td1[(t2 >> 16) & 0xff] ^ s_td2[(t1 >> 8) & 0xff] ^ s_td3[t0 & 0xff] ^ rdk[11]; + t0 = s_td0[s0 >> 24] ^ s_td1[(s3 >> 16) & 0xff] ^ s_td2[(s2 >> 8) & 0xff] ^ s_td3[s1 & 0xff] ^ rdk[12]; + t1 = s_td0[s1 >> 24] ^ s_td1[(s0 >> 16) & 0xff] ^ s_td2[(s3 >> 8) & 0xff] ^ s_td3[s2 & 0xff] ^ rdk[13]; + t2 = s_td0[s2 >> 24] ^ s_td1[(s1 >> 16) & 0xff] ^ s_td2[(s0 >> 8) & 0xff] ^ s_td3[s3 & 0xff] ^ rdk[14]; + t3 = s_td0[s3 >> 24] ^ s_td1[(s2 >> 16) & 0xff] ^ s_td2[(s1 >> 8) & 0xff] ^ s_td3[s0 & 0xff] ^ rdk[15]; + s0 = s_td0[t0 >> 24] ^ s_td1[(t3 >> 16) & 0xff] ^ s_td2[(t2 >> 8) & 0xff] ^ s_td3[t1 & 0xff] ^ rdk[16]; + s1 = s_td0[t1 >> 24] ^ s_td1[(t0 >> 16) & 0xff] ^ s_td2[(t3 >> 8) & 0xff] ^ s_td3[t2 & 0xff] ^ rdk[17]; + s2 = s_td0[t2 >> 24] ^ s_td1[(t1 >> 16) & 0xff] ^ s_td2[(t0 >> 8) & 0xff] ^ s_td3[t3 & 0xff] ^ rdk[18]; + s3 = s_td0[t3 >> 24] ^ s_td1[(t2 >> 16) & 0xff] ^ s_td2[(t1 >> 8) & 0xff] ^ s_td3[t0 & 0xff] ^ rdk[19]; + t0 = s_td0[s0 >> 24] ^ s_td1[(s3 >> 16) & 0xff] ^ s_td2[(s2 >> 8) & 0xff] ^ s_td3[s1 & 0xff] ^ rdk[20]; + t1 = s_td0[s1 >> 24] ^ s_td1[(s0 >> 16) & 0xff] ^ s_td2[(s3 >> 8) & 0xff] ^ s_td3[s2 & 0xff] ^ rdk[21]; + t2 = s_td0[s2 >> 24] ^ s_td1[(s1 >> 16) & 0xff] ^ s_td2[(s0 >> 8) & 0xff] ^ s_td3[s3 & 0xff] ^ rdk[22]; + t3 = s_td0[s3 >> 24] ^ s_td1[(s2 >> 16) & 0xff] ^ s_td2[(s1 >> 8) & 0xff] ^ s_td3[s0 & 0xff] ^ rdk[23]; + s0 = s_td0[t0 >> 24] ^ s_td1[(t3 >> 16) & 0xff] ^ s_td2[(t2 >> 8) & 0xff] ^ s_td3[t1 & 0xff] ^ rdk[24]; + s1 = s_td0[t1 >> 24] ^ s_td1[(t0 >> 16) & 0xff] ^ s_td2[(t3 >> 8) & 0xff] ^ s_td3[t2 & 0xff] ^ rdk[25]; + s2 = s_td0[t2 >> 24] ^ s_td1[(t1 >> 16) & 0xff] ^ s_td2[(t0 >> 8) & 0xff] ^ s_td3[t3 & 0xff] ^ rdk[26]; + s3 = s_td0[t3 >> 24] ^ s_td1[(t2 >> 16) & 0xff] ^ s_td2[(t1 >> 8) & 0xff] ^ s_td3[t0 & 0xff] ^ rdk[27]; + t0 = s_td0[s0 >> 24] ^ s_td1[(s3 >> 16) & 0xff] ^ s_td2[(s2 >> 8) & 0xff] ^ s_td3[s1 & 0xff] ^ rdk[28]; + t1 = s_td0[s1 >> 24] ^ s_td1[(s0 >> 16) & 0xff] ^ s_td2[(s3 >> 8) & 0xff] ^ s_td3[s2 & 0xff] ^ rdk[29]; + t2 = s_td0[s2 >> 24] ^ s_td1[(s1 >> 16) & 0xff] ^ s_td2[(s0 >> 8) & 0xff] ^ s_td3[s3 & 0xff] ^ rdk[30]; + t3 = s_td0[s3 >> 24] ^ s_td1[(s2 >> 16) & 0xff] ^ s_td2[(s1 >> 8) & 0xff] ^ s_td3[s0 & 0xff] ^ rdk[31]; + s0 = s_td0[t0 >> 24] ^ s_td1[(t3 >> 16) & 0xff] ^ s_td2[(t2 >> 8) & 0xff] ^ s_td3[t1 & 0xff] ^ rdk[32]; + s1 = s_td0[t1 >> 24] ^ s_td1[(t0 >> 16) & 0xff] ^ s_td2[(t3 >> 8) & 0xff] ^ s_td3[t2 & 0xff] ^ rdk[33]; + s2 = s_td0[t2 >> 24] ^ s_td1[(t1 >> 16) & 0xff] ^ s_td2[(t0 >> 8) & 0xff] ^ s_td3[t3 & 0xff] ^ rdk[34]; + s3 = s_td0[t3 >> 24] ^ s_td1[(t2 >> 16) & 0xff] ^ s_td2[(t1 >> 8) & 0xff] ^ s_td3[t0 & 0xff] ^ rdk[35]; + t0 = s_td0[s0 >> 24] ^ s_td1[(s3 >> 16) & 0xff] ^ s_td2[(s2 >> 8) & 0xff] ^ s_td3[s1 & 0xff] ^ rdk[36]; + t1 = s_td0[s1 >> 24] ^ s_td1[(s0 >> 16) & 0xff] ^ s_td2[(s3 >> 8) & 0xff] ^ s_td3[s2 & 0xff] ^ rdk[37]; + t2 = s_td0[s2 >> 24] ^ s_td1[(s1 >> 16) & 0xff] ^ s_td2[(s0 >> 8) & 0xff] ^ s_td3[s3 & 0xff] ^ rdk[38]; + t3 = s_td0[s3 >> 24] ^ s_td1[(s2 >> 16) & 0xff] ^ s_td2[(s1 >> 8) & 0xff] ^ s_td3[s0 & 0xff] ^ rdk[39]; + s0 = s_td0[t0 >> 24] ^ s_td1[(t3 >> 16) & 0xff] ^ s_td2[(t2 >> 8) & 0xff] ^ s_td3[t1 & 0xff] ^ rdk[40]; + s1 = s_td0[t1 >> 24] ^ s_td1[(t0 >> 16) & 0xff] ^ s_td2[(t3 >> 8) & 0xff] ^ s_td3[t2 & 0xff] ^ rdk[41]; + s2 = s_td0[t2 >> 24] ^ s_td1[(t1 >> 16) & 0xff] ^ s_td2[(t0 >> 8) & 0xff] ^ s_td3[t3 & 0xff] ^ rdk[42]; + s3 = s_td0[t3 >> 24] ^ s_td1[(t2 >> 16) & 0xff] ^ s_td2[(t1 >> 8) & 0xff] ^ s_td3[t0 & 0xff] ^ rdk[43]; + t0 = s_td0[s0 >> 24] ^ s_td1[(s3 >> 16) & 0xff] ^ s_td2[(s2 >> 8) & 0xff] ^ s_td3[s1 & 0xff] ^ rdk[44]; + t1 = s_td0[s1 >> 24] ^ s_td1[(s0 >> 16) & 0xff] ^ s_td2[(s3 >> 8) & 0xff] ^ s_td3[s2 & 0xff] ^ rdk[45]; + t2 = s_td0[s2 >> 24] ^ s_td1[(s1 >> 16) & 0xff] ^ s_td2[(s0 >> 8) & 0xff] ^ s_td3[s3 & 0xff] ^ rdk[46]; + t3 = s_td0[s3 >> 24] ^ s_td1[(s2 >> 16) & 0xff] ^ s_td2[(s1 >> 8) & 0xff] ^ s_td3[s0 & 0xff] ^ rdk[47]; + s0 = s_td0[t0 >> 24] ^ s_td1[(t3 >> 16) & 0xff] ^ s_td2[(t2 >> 8) & 0xff] ^ s_td3[t1 & 0xff] ^ rdk[48]; + s1 = s_td0[t1 >> 24] ^ s_td1[(t0 >> 16) & 0xff] ^ s_td2[(t3 >> 8) & 0xff] ^ s_td3[t2 & 0xff] ^ rdk[49]; + s2 = s_td0[t2 >> 24] ^ s_td1[(t1 >> 16) & 0xff] ^ s_td2[(t0 >> 8) & 0xff] ^ s_td3[t3 & 0xff] ^ rdk[50]; + s3 = s_td0[t3 >> 24] ^ s_td1[(t2 >> 16) & 0xff] ^ s_td2[(t1 >> 8) & 0xff] ^ s_td3[t0 & 0xff] ^ rdk[51]; + t0 = s_td0[s0 >> 24] ^ s_td1[(s3 >> 16) & 0xff] ^ s_td2[(s2 >> 8) & 0xff] ^ s_td3[s1 & 0xff] ^ rdk[52]; + t1 = s_td0[s1 >> 24] ^ s_td1[(s0 >> 16) & 0xff] ^ s_td2[(s3 >> 8) & 0xff] ^ s_td3[s2 & 0xff] ^ rdk[53]; + t2 = s_td0[s2 >> 24] ^ s_td1[(s1 >> 16) & 0xff] ^ s_td2[(s0 >> 8) & 0xff] ^ s_td3[s3 & 0xff] ^ rdk[54]; + t3 = s_td0[s3 >> 24] ^ s_td1[(s2 >> 16) & 0xff] ^ s_td2[(s1 >> 8) & 0xff] ^ s_td3[s0 & 0xff] ^ rdk[55]; + + out[0] = (s_td4[(t0 >> 24) & 0xff] & 0xff000000) + ^ (s_td4[(t3 >> 16) & 0xff] & 0x00ff0000) + ^ (s_td4[(t2 >> 8) & 0xff] & 0x0000ff00) + ^ (s_td4[(t1 >> 0) & 0xff] & 0x000000ff) + ^ rdk[56]; + + out[1] = (s_td4[(t1 >> 24) & 0xff] & 0xff000000) + ^ (s_td4[(t0 >> 16) & 0xff] & 0x00ff0000) + ^ (s_td4[(t3 >> 8) & 0xff] & 0x0000ff00) + ^ (s_td4[(t2 >> 0) & 0xff] & 0x000000ff) + ^ rdk[57]; + + out[2] = (s_td4[(t2 >> 24) & 0xff] & 0xff000000) + ^ (s_td4[(t1 >> 16) & 0xff] & 0x00ff0000) + ^ (s_td4[(t0 >> 8) & 0xff] & 0x0000ff00) + ^ (s_td4[(t3 >> 0) & 0xff] & 0x000000ff) + ^ rdk[58]; + + out[3] = (s_td4[(t3 >> 24) & 0xff] & 0xff000000) + ^ (s_td4[(t2 >> 16) & 0xff] & 0x00ff0000) + ^ (s_td4[(t1 >> 8) & 0xff] & 0x0000ff00) + ^ (s_td4[(t0 >> 0) & 0xff] & 0x000000ff) + ^ rdk[59]; +} + +static void AES256_encrypt (const u32 *in, u32 *out, const u32 *rek, __local u32 s_te0[256], __local u32 s_te1[256], __local u32 s_te2[256], __local u32 s_te3[256], __local u32 s_te4[256]) +{ + u32 s0 = in[0] ^ rek[0]; + u32 s1 = in[1] ^ rek[1]; + u32 s2 = in[2] ^ rek[2]; + u32 s3 = in[3] ^ rek[3]; + + u32 t0; + u32 t1; + u32 t2; + u32 t3; + + t0 = s_te0[s0 >> 24] ^ s_te1[(s1 >> 16) & 0xff] ^ s_te2[(s2 >> 8) & 0xff] ^ s_te3[s3 & 0xff] ^ rek[ 4]; + t1 = s_te0[s1 >> 24] ^ s_te1[(s2 >> 16) & 0xff] ^ s_te2[(s3 >> 8) & 0xff] ^ s_te3[s0 & 0xff] ^ rek[ 5]; + t2 = s_te0[s2 >> 24] ^ s_te1[(s3 >> 16) & 0xff] ^ s_te2[(s0 >> 8) & 0xff] ^ s_te3[s1 & 0xff] ^ rek[ 6]; + t3 = s_te0[s3 >> 24] ^ s_te1[(s0 >> 16) & 0xff] ^ s_te2[(s1 >> 8) & 0xff] ^ s_te3[s2 & 0xff] ^ rek[ 7]; + s0 = s_te0[t0 >> 24] ^ s_te1[(t1 >> 16) & 0xff] ^ s_te2[(t2 >> 8) & 0xff] ^ s_te3[t3 & 0xff] ^ rek[ 8]; + s1 = s_te0[t1 >> 24] ^ s_te1[(t2 >> 16) & 0xff] ^ s_te2[(t3 >> 8) & 0xff] ^ s_te3[t0 & 0xff] ^ rek[ 9]; + s2 = s_te0[t2 >> 24] ^ s_te1[(t3 >> 16) & 0xff] ^ s_te2[(t0 >> 8) & 0xff] ^ s_te3[t1 & 0xff] ^ rek[10]; + s3 = s_te0[t3 >> 24] ^ s_te1[(t0 >> 16) & 0xff] ^ s_te2[(t1 >> 8) & 0xff] ^ s_te3[t2 & 0xff] ^ rek[11]; + t0 = s_te0[s0 >> 24] ^ s_te1[(s1 >> 16) & 0xff] ^ s_te2[(s2 >> 8) & 0xff] ^ s_te3[s3 & 0xff] ^ rek[12]; + t1 = s_te0[s1 >> 24] ^ s_te1[(s2 >> 16) & 0xff] ^ s_te2[(s3 >> 8) & 0xff] ^ s_te3[s0 & 0xff] ^ rek[13]; + t2 = s_te0[s2 >> 24] ^ s_te1[(s3 >> 16) & 0xff] ^ s_te2[(s0 >> 8) & 0xff] ^ s_te3[s1 & 0xff] ^ rek[14]; + t3 = s_te0[s3 >> 24] ^ s_te1[(s0 >> 16) & 0xff] ^ s_te2[(s1 >> 8) & 0xff] ^ s_te3[s2 & 0xff] ^ rek[15]; + s0 = s_te0[t0 >> 24] ^ s_te1[(t1 >> 16) & 0xff] ^ s_te2[(t2 >> 8) & 0xff] ^ s_te3[t3 & 0xff] ^ rek[16]; + s1 = s_te0[t1 >> 24] ^ s_te1[(t2 >> 16) & 0xff] ^ s_te2[(t3 >> 8) & 0xff] ^ s_te3[t0 & 0xff] ^ rek[17]; + s2 = s_te0[t2 >> 24] ^ s_te1[(t3 >> 16) & 0xff] ^ s_te2[(t0 >> 8) & 0xff] ^ s_te3[t1 & 0xff] ^ rek[18]; + s3 = s_te0[t3 >> 24] ^ s_te1[(t0 >> 16) & 0xff] ^ s_te2[(t1 >> 8) & 0xff] ^ s_te3[t2 & 0xff] ^ rek[19]; + t0 = s_te0[s0 >> 24] ^ s_te1[(s1 >> 16) & 0xff] ^ s_te2[(s2 >> 8) & 0xff] ^ s_te3[s3 & 0xff] ^ rek[20]; + t1 = s_te0[s1 >> 24] ^ s_te1[(s2 >> 16) & 0xff] ^ s_te2[(s3 >> 8) & 0xff] ^ s_te3[s0 & 0xff] ^ rek[21]; + t2 = s_te0[s2 >> 24] ^ s_te1[(s3 >> 16) & 0xff] ^ s_te2[(s0 >> 8) & 0xff] ^ s_te3[s1 & 0xff] ^ rek[22]; + t3 = s_te0[s3 >> 24] ^ s_te1[(s0 >> 16) & 0xff] ^ s_te2[(s1 >> 8) & 0xff] ^ s_te3[s2 & 0xff] ^ rek[23]; + s0 = s_te0[t0 >> 24] ^ s_te1[(t1 >> 16) & 0xff] ^ s_te2[(t2 >> 8) & 0xff] ^ s_te3[t3 & 0xff] ^ rek[24]; + s1 = s_te0[t1 >> 24] ^ s_te1[(t2 >> 16) & 0xff] ^ s_te2[(t3 >> 8) & 0xff] ^ s_te3[t0 & 0xff] ^ rek[25]; + s2 = s_te0[t2 >> 24] ^ s_te1[(t3 >> 16) & 0xff] ^ s_te2[(t0 >> 8) & 0xff] ^ s_te3[t1 & 0xff] ^ rek[26]; + s3 = s_te0[t3 >> 24] ^ s_te1[(t0 >> 16) & 0xff] ^ s_te2[(t1 >> 8) & 0xff] ^ s_te3[t2 & 0xff] ^ rek[27]; + t0 = s_te0[s0 >> 24] ^ s_te1[(s1 >> 16) & 0xff] ^ s_te2[(s2 >> 8) & 0xff] ^ s_te3[s3 & 0xff] ^ rek[28]; + t1 = s_te0[s1 >> 24] ^ s_te1[(s2 >> 16) & 0xff] ^ s_te2[(s3 >> 8) & 0xff] ^ s_te3[s0 & 0xff] ^ rek[29]; + t2 = s_te0[s2 >> 24] ^ s_te1[(s3 >> 16) & 0xff] ^ s_te2[(s0 >> 8) & 0xff] ^ s_te3[s1 & 0xff] ^ rek[30]; + t3 = s_te0[s3 >> 24] ^ s_te1[(s0 >> 16) & 0xff] ^ s_te2[(s1 >> 8) & 0xff] ^ s_te3[s2 & 0xff] ^ rek[31]; + s0 = s_te0[t0 >> 24] ^ s_te1[(t1 >> 16) & 0xff] ^ s_te2[(t2 >> 8) & 0xff] ^ s_te3[t3 & 0xff] ^ rek[32]; + s1 = s_te0[t1 >> 24] ^ s_te1[(t2 >> 16) & 0xff] ^ s_te2[(t3 >> 8) & 0xff] ^ s_te3[t0 & 0xff] ^ rek[33]; + s2 = s_te0[t2 >> 24] ^ s_te1[(t3 >> 16) & 0xff] ^ s_te2[(t0 >> 8) & 0xff] ^ s_te3[t1 & 0xff] ^ rek[34]; + s3 = s_te0[t3 >> 24] ^ s_te1[(t0 >> 16) & 0xff] ^ s_te2[(t1 >> 8) & 0xff] ^ s_te3[t2 & 0xff] ^ rek[35]; + t0 = s_te0[s0 >> 24] ^ s_te1[(s1 >> 16) & 0xff] ^ s_te2[(s2 >> 8) & 0xff] ^ s_te3[s3 & 0xff] ^ rek[36]; + t1 = s_te0[s1 >> 24] ^ s_te1[(s2 >> 16) & 0xff] ^ s_te2[(s3 >> 8) & 0xff] ^ s_te3[s0 & 0xff] ^ rek[37]; + t2 = s_te0[s2 >> 24] ^ s_te1[(s3 >> 16) & 0xff] ^ s_te2[(s0 >> 8) & 0xff] ^ s_te3[s1 & 0xff] ^ rek[38]; + t3 = s_te0[s3 >> 24] ^ s_te1[(s0 >> 16) & 0xff] ^ s_te2[(s1 >> 8) & 0xff] ^ s_te3[s2 & 0xff] ^ rek[39]; + s0 = s_te0[t0 >> 24] ^ s_te1[(t1 >> 16) & 0xff] ^ s_te2[(t2 >> 8) & 0xff] ^ s_te3[t3 & 0xff] ^ rek[40]; + s1 = s_te0[t1 >> 24] ^ s_te1[(t2 >> 16) & 0xff] ^ s_te2[(t3 >> 8) & 0xff] ^ s_te3[t0 & 0xff] ^ rek[41]; + s2 = s_te0[t2 >> 24] ^ s_te1[(t3 >> 16) & 0xff] ^ s_te2[(t0 >> 8) & 0xff] ^ s_te3[t1 & 0xff] ^ rek[42]; + s3 = s_te0[t3 >> 24] ^ s_te1[(t0 >> 16) & 0xff] ^ s_te2[(t1 >> 8) & 0xff] ^ s_te3[t2 & 0xff] ^ rek[43]; + t0 = s_te0[s0 >> 24] ^ s_te1[(s1 >> 16) & 0xff] ^ s_te2[(s2 >> 8) & 0xff] ^ s_te3[s3 & 0xff] ^ rek[44]; + t1 = s_te0[s1 >> 24] ^ s_te1[(s2 >> 16) & 0xff] ^ s_te2[(s3 >> 8) & 0xff] ^ s_te3[s0 & 0xff] ^ rek[45]; + t2 = s_te0[s2 >> 24] ^ s_te1[(s3 >> 16) & 0xff] ^ s_te2[(s0 >> 8) & 0xff] ^ s_te3[s1 & 0xff] ^ rek[46]; + t3 = s_te0[s3 >> 24] ^ s_te1[(s0 >> 16) & 0xff] ^ s_te2[(s1 >> 8) & 0xff] ^ s_te3[s2 & 0xff] ^ rek[47]; + s0 = s_te0[t0 >> 24] ^ s_te1[(t1 >> 16) & 0xff] ^ s_te2[(t2 >> 8) & 0xff] ^ s_te3[t3 & 0xff] ^ rek[48]; + s1 = s_te0[t1 >> 24] ^ s_te1[(t2 >> 16) & 0xff] ^ s_te2[(t3 >> 8) & 0xff] ^ s_te3[t0 & 0xff] ^ rek[49]; + s2 = s_te0[t2 >> 24] ^ s_te1[(t3 >> 16) & 0xff] ^ s_te2[(t0 >> 8) & 0xff] ^ s_te3[t1 & 0xff] ^ rek[50]; + s3 = s_te0[t3 >> 24] ^ s_te1[(t0 >> 16) & 0xff] ^ s_te2[(t1 >> 8) & 0xff] ^ s_te3[t2 & 0xff] ^ rek[51]; + t0 = s_te0[s0 >> 24] ^ s_te1[(s1 >> 16) & 0xff] ^ s_te2[(s2 >> 8) & 0xff] ^ s_te3[s3 & 0xff] ^ rek[52]; + t1 = s_te0[s1 >> 24] ^ s_te1[(s2 >> 16) & 0xff] ^ s_te2[(s3 >> 8) & 0xff] ^ s_te3[s0 & 0xff] ^ rek[53]; + t2 = s_te0[s2 >> 24] ^ s_te1[(s3 >> 16) & 0xff] ^ s_te2[(s0 >> 8) & 0xff] ^ s_te3[s1 & 0xff] ^ rek[54]; + t3 = s_te0[s3 >> 24] ^ s_te1[(s0 >> 16) & 0xff] ^ s_te2[(s1 >> 8) & 0xff] ^ s_te3[s2 & 0xff] ^ rek[55]; + + out[0] = (s_te4[(t0 >> 24) & 0xff] & 0xff000000) + ^ (s_te4[(t1 >> 16) & 0xff] & 0x00ff0000) + ^ (s_te4[(t2 >> 8) & 0xff] & 0x0000ff00) + ^ (s_te4[(t3 >> 0) & 0xff] & 0x000000ff) + ^ rek[56]; + + out[1] = (s_te4[(t1 >> 24) & 0xff] & 0xff000000) + ^ (s_te4[(t2 >> 16) & 0xff] & 0x00ff0000) + ^ (s_te4[(t3 >> 8) & 0xff] & 0x0000ff00) + ^ (s_te4[(t0 >> 0) & 0xff] & 0x000000ff) + ^ rek[57]; + + out[2] = (s_te4[(t2 >> 24) & 0xff] & 0xff000000) + ^ (s_te4[(t3 >> 16) & 0xff] & 0x00ff0000) + ^ (s_te4[(t0 >> 8) & 0xff] & 0x0000ff00) + ^ (s_te4[(t1 >> 0) & 0xff] & 0x000000ff) + ^ rek[58]; + + out[3] = (s_te4[(t3 >> 24) & 0xff] & 0xff000000) + ^ (s_te4[(t0 >> 16) & 0xff] & 0x00ff0000) + ^ (s_te4[(t1 >> 8) & 0xff] & 0x0000ff00) + ^ (s_te4[(t2 >> 0) & 0xff] & 0x000000ff) + ^ rek[59]; +} + +__constant u32 k_sha256[64] = +{ + SHA256C00, SHA256C01, SHA256C02, SHA256C03, + SHA256C04, SHA256C05, SHA256C06, SHA256C07, + SHA256C08, SHA256C09, SHA256C0a, SHA256C0b, + SHA256C0c, SHA256C0d, SHA256C0e, SHA256C0f, + SHA256C10, SHA256C11, SHA256C12, SHA256C13, + SHA256C14, SHA256C15, SHA256C16, SHA256C17, + SHA256C18, SHA256C19, SHA256C1a, SHA256C1b, + SHA256C1c, SHA256C1d, SHA256C1e, SHA256C1f, + SHA256C20, SHA256C21, SHA256C22, SHA256C23, + SHA256C24, SHA256C25, SHA256C26, SHA256C27, + SHA256C28, SHA256C29, SHA256C2a, SHA256C2b, + SHA256C2c, SHA256C2d, SHA256C2e, SHA256C2f, + SHA256C30, SHA256C31, SHA256C32, SHA256C33, + SHA256C34, SHA256C35, SHA256C36, SHA256C37, + SHA256C38, SHA256C39, SHA256C3a, SHA256C3b, + SHA256C3c, SHA256C3d, SHA256C3e, SHA256C3f, +}; + +static void sha256_transform (const u32x w0[4], const u32x w1[4], const u32x w2[4], const u32x w3[4], u32x digest[8]) +{ + u32x a = digest[0]; + u32x b = digest[1]; + u32x c = digest[2]; + u32x d = digest[3]; + u32x e = digest[4]; + u32x f = digest[5]; + u32x g = digest[6]; + u32x h = digest[7]; + + u32x w0_t = w0[0]; + u32x w1_t = w0[1]; + u32x w2_t = w0[2]; + u32x w3_t = w0[3]; + u32x w4_t = w1[0]; + u32x w5_t = w1[1]; + u32x w6_t = w1[2]; + u32x w7_t = w1[3]; + u32x w8_t = w2[0]; + u32x w9_t = w2[1]; + u32x wa_t = w2[2]; + u32x wb_t = w2[3]; + u32x wc_t = w3[0]; + u32x wd_t = w3[1]; + u32x we_t = w3[2]; + u32x wf_t = w3[3]; + + #define ROUND_EXPAND() \ + { \ + w0_t = SHA256_EXPAND (we_t, w9_t, w1_t, w0_t); \ + w1_t = SHA256_EXPAND (wf_t, wa_t, w2_t, w1_t); \ + w2_t = SHA256_EXPAND (w0_t, wb_t, w3_t, w2_t); \ + w3_t = SHA256_EXPAND (w1_t, wc_t, w4_t, w3_t); \ + w4_t = SHA256_EXPAND (w2_t, wd_t, w5_t, w4_t); \ + w5_t = SHA256_EXPAND (w3_t, we_t, w6_t, w5_t); \ + w6_t = SHA256_EXPAND (w4_t, wf_t, w7_t, w6_t); \ + w7_t = SHA256_EXPAND (w5_t, w0_t, w8_t, w7_t); \ + w8_t = SHA256_EXPAND (w6_t, w1_t, w9_t, w8_t); \ + w9_t = SHA256_EXPAND (w7_t, w2_t, wa_t, w9_t); \ + wa_t = SHA256_EXPAND (w8_t, w3_t, wb_t, wa_t); \ + wb_t = SHA256_EXPAND (w9_t, w4_t, wc_t, wb_t); \ + wc_t = SHA256_EXPAND (wa_t, w5_t, wd_t, wc_t); \ + wd_t = SHA256_EXPAND (wb_t, w6_t, we_t, wd_t); \ + we_t = SHA256_EXPAND (wc_t, w7_t, wf_t, we_t); \ + wf_t = SHA256_EXPAND (wd_t, w8_t, w0_t, wf_t); \ + } + + #define ROUND_STEP(i) \ + { \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, k_sha256[i + 0]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, k_sha256[i + 1]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, k_sha256[i + 2]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, k_sha256[i + 3]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, k_sha256[i + 4]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, k_sha256[i + 5]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, k_sha256[i + 6]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, k_sha256[i + 7]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, k_sha256[i + 8]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, k_sha256[i + 9]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, k_sha256[i + 10]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, k_sha256[i + 11]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, k_sha256[i + 12]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, k_sha256[i + 13]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, k_sha256[i + 14]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, k_sha256[i + 15]); \ + } + + ROUND_STEP (0); + + #pragma unroll + for (int i = 16; i < 64; i += 16) + { + ROUND_EXPAND (); ROUND_STEP (i); + } + + digest[0] += a; + digest[1] += b; + digest[2] += c; + digest[3] += d; + digest[4] += e; + digest[5] += f; + digest[6] += g; + digest[7] += h; +} + +static void sha1_transform (const u32x w0[4], const u32x w1[4], const u32x w2[4], const u32x w3[4], u32x digest[5]) +{ + u32x A = digest[0]; + u32x B = digest[1]; + u32x C = digest[2]; + u32x D = digest[3]; + u32x E = digest[4]; + + u32x w0_t = w0[0]; + u32x w1_t = w0[1]; + u32x w2_t = w0[2]; + u32x w3_t = w0[3]; + u32x w4_t = w1[0]; + u32x w5_t = w1[1]; + u32x w6_t = w1[2]; + u32x w7_t = w1[3]; + u32x w8_t = w2[0]; + u32x w9_t = w2[1]; + u32x wa_t = w2[2]; + u32x wb_t = w2[3]; + u32x wc_t = w3[0]; + u32x wd_t = w3[1]; + u32x we_t = w3[2]; + u32x wf_t = w3[3]; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, A, B, C, D, E, w0_t); + SHA1_STEP (SHA1_F0o, E, A, B, C, D, w1_t); + SHA1_STEP (SHA1_F0o, D, E, A, B, C, w2_t); + SHA1_STEP (SHA1_F0o, C, D, E, A, B, w3_t); + SHA1_STEP (SHA1_F0o, B, C, D, E, A, w4_t); + SHA1_STEP (SHA1_F0o, A, B, C, D, E, w5_t); + SHA1_STEP (SHA1_F0o, E, A, B, C, D, w6_t); + SHA1_STEP (SHA1_F0o, D, E, A, B, C, w7_t); + SHA1_STEP (SHA1_F0o, C, D, E, A, B, w8_t); + SHA1_STEP (SHA1_F0o, B, C, D, E, A, w9_t); + SHA1_STEP (SHA1_F0o, A, B, C, D, E, wa_t); + SHA1_STEP (SHA1_F0o, E, A, B, C, D, wb_t); + SHA1_STEP (SHA1_F0o, D, E, A, B, C, wc_t); + SHA1_STEP (SHA1_F0o, C, D, E, A, B, wd_t); + SHA1_STEP (SHA1_F0o, B, C, D, E, A, we_t); + SHA1_STEP (SHA1_F0o, A, B, C, D, E, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F0o, E, A, B, C, D, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F0o, D, E, A, B, C, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F0o, C, D, E, A, B, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F0o, B, C, D, E, A, w3_t); + + #undef K + #define K SHA1C01 + + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w7_t); + + #undef K + #define K SHA1C02 + + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, wb_t); + + #undef K + #define K SHA1C03 + + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, wf_t); + + digest[0] += A; + digest[1] += B; + digest[2] += C; + digest[3] += D; + digest[4] += E; +} + +static void hmac_sha1_pad (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], u32x ipad[5], u32x opad[5]) +{ + w0[0] = w0[0] ^ 0x36363636; + w0[1] = w0[1] ^ 0x36363636; + w0[2] = w0[2] ^ 0x36363636; + w0[3] = w0[3] ^ 0x36363636; + w1[0] = w1[0] ^ 0x36363636; + w1[1] = w1[1] ^ 0x36363636; + w1[2] = w1[2] ^ 0x36363636; + w1[3] = w1[3] ^ 0x36363636; + w2[0] = w2[0] ^ 0x36363636; + w2[1] = w2[1] ^ 0x36363636; + w2[2] = w2[2] ^ 0x36363636; + w2[3] = w2[3] ^ 0x36363636; + w3[0] = w3[0] ^ 0x36363636; + w3[1] = w3[1] ^ 0x36363636; + w3[2] = w3[2] ^ 0x36363636; + w3[3] = w3[3] ^ 0x36363636; + + ipad[0] = SHA1M_A; + ipad[1] = SHA1M_B; + ipad[2] = SHA1M_C; + ipad[3] = SHA1M_D; + ipad[4] = SHA1M_E; + + sha1_transform (w0, w1, w2, w3, ipad); + + w0[0] = w0[0] ^ 0x6a6a6a6a; + w0[1] = w0[1] ^ 0x6a6a6a6a; + w0[2] = w0[2] ^ 0x6a6a6a6a; + w0[3] = w0[3] ^ 0x6a6a6a6a; + w1[0] = w1[0] ^ 0x6a6a6a6a; + w1[1] = w1[1] ^ 0x6a6a6a6a; + w1[2] = w1[2] ^ 0x6a6a6a6a; + w1[3] = w1[3] ^ 0x6a6a6a6a; + w2[0] = w2[0] ^ 0x6a6a6a6a; + w2[1] = w2[1] ^ 0x6a6a6a6a; + w2[2] = w2[2] ^ 0x6a6a6a6a; + w2[3] = w2[3] ^ 0x6a6a6a6a; + w3[0] = w3[0] ^ 0x6a6a6a6a; + w3[1] = w3[1] ^ 0x6a6a6a6a; + w3[2] = w3[2] ^ 0x6a6a6a6a; + w3[3] = w3[3] ^ 0x6a6a6a6a; + + opad[0] = SHA1M_A; + opad[1] = SHA1M_B; + opad[2] = SHA1M_C; + opad[3] = SHA1M_D; + opad[4] = SHA1M_E; + + sha1_transform (w0, w1, w2, w3, opad); +} + +static void hmac_sha1_run (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], u32x ipad[5], u32x opad[5], u32x digest[5]) +{ + digest[0] = ipad[0]; + digest[1] = ipad[1]; + digest[2] = ipad[2]; + digest[3] = ipad[3]; + digest[4] = ipad[4]; + + sha1_transform (w0, w1, w2, w3, digest); + + w0[0] = digest[0]; + w0[1] = digest[1]; + w0[2] = digest[2]; + w0[3] = digest[3]; + w1[0] = digest[4]; + w1[1] = 0x80000000; + w1[2] = 0; + w1[3] = 0; + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = (64 + 20) * 8; + + digest[0] = opad[0]; + digest[1] = opad[1]; + digest[2] = opad[2]; + digest[3] = opad[3]; + digest[4] = opad[4]; + + sha1_transform (w0, w1, w2, w3, digest); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m08800_init (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global androidfde_tmp_t *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global androidfde_t *androidfde_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = pws[gid].i[ 8]; + w2[1] = pws[gid].i[ 9]; + w2[2] = pws[gid].i[10]; + w2[3] = pws[gid].i[11]; + + u32x w3[4]; + + w3[0] = pws[gid].i[12]; + w3[1] = pws[gid].i[13]; + w3[2] = pws[gid].i[14]; + w3[3] = pws[gid].i[15]; + + /** + * salt + */ + + u32 salt_len = 16; + + u32 salt_buf[4]; + + salt_buf[0] = salt_bufs[salt_pos].salt_buf[0]; + salt_buf[1] = salt_bufs[salt_pos].salt_buf[1]; + salt_buf[2] = salt_bufs[salt_pos].salt_buf[2]; + salt_buf[3] = salt_bufs[salt_pos].salt_buf[3]; + + /** + * pads + */ + + w0[0] = swap_workaround (w0[0]); + w0[1] = swap_workaround (w0[1]); + w0[2] = swap_workaround (w0[2]); + w0[3] = swap_workaround (w0[3]); + w1[0] = swap_workaround (w1[0]); + w1[1] = swap_workaround (w1[1]); + w1[2] = swap_workaround (w1[2]); + w1[3] = swap_workaround (w1[3]); + w2[0] = swap_workaround (w2[0]); + w2[1] = swap_workaround (w2[1]); + w2[2] = swap_workaround (w2[2]); + w2[3] = swap_workaround (w2[3]); + w3[0] = swap_workaround (w3[0]); + w3[1] = swap_workaround (w3[1]); + w3[2] = swap_workaround (w3[2]); + w3[3] = swap_workaround (w3[3]); + + u32x ipad[5]; + u32x opad[5]; + + hmac_sha1_pad (w0, w1, w2, w3, ipad, opad); + + tmps[gid].ipad[0] = ipad[0]; + tmps[gid].ipad[1] = ipad[1]; + tmps[gid].ipad[2] = ipad[2]; + tmps[gid].ipad[3] = ipad[3]; + tmps[gid].ipad[4] = ipad[4]; + + tmps[gid].opad[0] = opad[0]; + tmps[gid].opad[1] = opad[1]; + tmps[gid].opad[2] = opad[2]; + tmps[gid].opad[3] = opad[3]; + tmps[gid].opad[4] = opad[4]; + + for (u32 i = 0, j = 1; i < 8; i += 5, j += 1) + { + w0[0] = salt_buf[0]; + w0[1] = salt_buf[1]; + w0[2] = salt_buf[2]; + w0[3] = salt_buf[3]; + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + if (j == 1) + append_0x01_3 (w0, w1, w2, salt_len + 3); + else + append_0x02_3 (w0, w1, w2, salt_len + 3); + + append_0x80_3 (w0, w1, w2, salt_len + 4); + + w0[0] = swap_workaround (w0[0]); + w0[1] = swap_workaround (w0[1]); + w0[2] = swap_workaround (w0[2]); + w0[3] = swap_workaround (w0[3]); + w1[0] = swap_workaround (w1[0]); + w1[1] = swap_workaround (w1[1]); + w1[2] = swap_workaround (w1[2]); + w1[3] = swap_workaround (w1[3]); + w2[0] = swap_workaround (w2[0]); + w2[1] = swap_workaround (w2[1]); + w2[2] = 0; + w2[3] = 0; + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = (64 + salt_len + 4) * 8; + + u32x dgst[5]; + + hmac_sha1_run (w0, w1, w2, w3, ipad, opad, dgst); + + tmps[gid].dgst[i + 0] = dgst[0]; + tmps[gid].dgst[i + 1] = dgst[1]; + tmps[gid].dgst[i + 2] = dgst[2]; + tmps[gid].dgst[i + 3] = dgst[3]; + tmps[gid].dgst[i + 4] = dgst[4]; + + tmps[gid].out[i + 0] = dgst[0]; + tmps[gid].out[i + 1] = dgst[1]; + tmps[gid].out[i + 2] = dgst[2]; + tmps[gid].out[i + 3] = dgst[3]; + tmps[gid].out[i + 4] = dgst[4]; + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m08800_loop (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global androidfde_tmp_t *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global androidfde_t *androidfde_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x ipad[5]; + u32x opad[5]; + + ipad[0] = tmps[gid].ipad[0]; + ipad[1] = tmps[gid].ipad[1]; + ipad[2] = tmps[gid].ipad[2]; + ipad[3] = tmps[gid].ipad[3]; + ipad[4] = tmps[gid].ipad[4]; + + opad[0] = tmps[gid].opad[0]; + opad[1] = tmps[gid].opad[1]; + opad[2] = tmps[gid].opad[2]; + opad[3] = tmps[gid].opad[3]; + opad[4] = tmps[gid].opad[4]; + + for (u32 i = 0; i < 8; i += 5) + { + u32x dgst[5]; + u32x out[5]; + + dgst[0] = tmps[gid].dgst[i + 0]; + dgst[1] = tmps[gid].dgst[i + 1]; + dgst[2] = tmps[gid].dgst[i + 2]; + dgst[3] = tmps[gid].dgst[i + 3]; + dgst[4] = tmps[gid].dgst[i + 4]; + + out[0] = tmps[gid].out[i + 0]; + out[1] = tmps[gid].out[i + 1]; + out[2] = tmps[gid].out[i + 2]; + out[3] = tmps[gid].out[i + 3]; + out[4] = tmps[gid].out[i + 4]; + + for (u32 j = 0; j < loop_cnt; j++) + { + u32x w0[4]; + u32x w1[4]; + u32x w2[4]; + u32x w3[4]; + + w0[0] = dgst[0]; + w0[1] = dgst[1]; + w0[2] = dgst[2]; + w0[3] = dgst[3]; + w1[0] = dgst[4]; + w1[1] = 0x80000000; + w1[2] = 0; + w1[3] = 0; + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = (64 + 20) * 8; + + hmac_sha1_run (w0, w1, w2, w3, ipad, opad, dgst); + + out[0] ^= dgst[0]; + out[1] ^= dgst[1]; + out[2] ^= dgst[2]; + out[3] ^= dgst[3]; + out[4] ^= dgst[4]; + } + + tmps[gid].dgst[i + 0] = dgst[0]; + tmps[gid].dgst[i + 1] = dgst[1]; + tmps[gid].dgst[i + 2] = dgst[2]; + tmps[gid].dgst[i + 3] = dgst[3]; + tmps[gid].dgst[i + 4] = dgst[4]; + + tmps[gid].out[i + 0] = out[0]; + tmps[gid].out[i + 1] = out[1]; + tmps[gid].out[i + 2] = out[2]; + tmps[gid].out[i + 3] = out[3]; + tmps[gid].out[i + 4] = out[4]; + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m08800_comp (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global androidfde_tmp_t *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global androidfde_t *androidfde_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + const u32 lid = get_local_id (0); + + u32 rek[60]; + u32 rdk[60]; + + u32 data[4]; + u32 iv[4]; + u32 out[4]; + + /** + * aes shared + */ + + const u32 lid4 = lid * 4; + + __local u32 s_td0[256]; + __local u32 s_td1[256]; + __local u32 s_td2[256]; + __local u32 s_td3[256]; + __local u32 s_td4[256]; + + __local u32 s_te0[256]; + __local u32 s_te1[256]; + __local u32 s_te2[256]; + __local u32 s_te3[256]; + __local u32 s_te4[256]; + + s_td0[lid4 + 0] = td0[lid4 + 0]; + s_td0[lid4 + 1] = td0[lid4 + 1]; + s_td0[lid4 + 2] = td0[lid4 + 2]; + s_td0[lid4 + 3] = td0[lid4 + 3]; + + s_td1[lid4 + 0] = td1[lid4 + 0]; + s_td1[lid4 + 1] = td1[lid4 + 1]; + s_td1[lid4 + 2] = td1[lid4 + 2]; + s_td1[lid4 + 3] = td1[lid4 + 3]; + + s_td2[lid4 + 0] = td2[lid4 + 0]; + s_td2[lid4 + 1] = td2[lid4 + 1]; + s_td2[lid4 + 2] = td2[lid4 + 2]; + s_td2[lid4 + 3] = td2[lid4 + 3]; + + s_td3[lid4 + 0] = td3[lid4 + 0]; + s_td3[lid4 + 1] = td3[lid4 + 1]; + s_td3[lid4 + 2] = td3[lid4 + 2]; + s_td3[lid4 + 3] = td3[lid4 + 3]; + + s_td4[lid4 + 0] = td4[lid4 + 0]; + s_td4[lid4 + 1] = td4[lid4 + 1]; + s_td4[lid4 + 2] = td4[lid4 + 2]; + s_td4[lid4 + 3] = td4[lid4 + 3]; + + s_te0[lid4 + 0] = te0[lid4 + 0]; + s_te0[lid4 + 1] = te0[lid4 + 1]; + s_te0[lid4 + 2] = te0[lid4 + 2]; + s_te0[lid4 + 3] = te0[lid4 + 3]; + + s_te1[lid4 + 0] = te1[lid4 + 0]; + s_te1[lid4 + 1] = te1[lid4 + 1]; + s_te1[lid4 + 2] = te1[lid4 + 2]; + s_te1[lid4 + 3] = te1[lid4 + 3]; + + s_te2[lid4 + 0] = te2[lid4 + 0]; + s_te2[lid4 + 1] = te2[lid4 + 1]; + s_te2[lid4 + 2] = te2[lid4 + 2]; + s_te2[lid4 + 3] = te2[lid4 + 3]; + + s_te3[lid4 + 0] = te3[lid4 + 0]; + s_te3[lid4 + 1] = te3[lid4 + 1]; + s_te3[lid4 + 2] = te3[lid4 + 2]; + s_te3[lid4 + 3] = te3[lid4 + 3]; + + s_te4[lid4 + 0] = te4[lid4 + 0]; + s_te4[lid4 + 1] = te4[lid4 + 1]; + s_te4[lid4 + 2] = te4[lid4 + 2]; + s_te4[lid4 + 3] = te4[lid4 + 3]; + + barrier (CLK_LOCAL_MEM_FENCE); + + if (gid >= gid_max) return; + + /** + * aes init + */ + + u32x ukeyx[8]; + + ukeyx[0] = tmps[gid].out[0]; + ukeyx[1] = tmps[gid].out[1]; + ukeyx[2] = tmps[gid].out[2]; + ukeyx[3] = tmps[gid].out[3]; + ukeyx[4] = 0; + ukeyx[5] = 0; + ukeyx[6] = 0; + ukeyx[7] = 0; + + u32x a; + u32x b; + u32x c; + u32x d; + + /** + * aes decrypt key + */ + + data[0] = digests_buf[digests_offset].digest_buf[0]; + data[1] = digests_buf[digests_offset].digest_buf[1]; + data[2] = digests_buf[digests_offset].digest_buf[2]; + data[3] = digests_buf[digests_offset].digest_buf[3]; + + iv[0] = tmps[gid].out[4]; + iv[1] = tmps[gid].out[5]; + iv[2] = tmps[gid].out[6]; + iv[3] = tmps[gid].out[7]; + + AES128_ExpandKey (ukeyx, rek, s_te0, s_te1, s_te2, s_te3, s_te4); + + for (u32 i = 0; i < 44; i++) rdk[i] = rek[i]; + + AES128_InvertKey (rdk, s_td0, s_td1, s_td2, s_td3, s_td4, s_te0, s_te1, s_te2, s_te3, s_te4); + + AES128_decrypt (data, out, rdk, s_td0, s_td1, s_td2, s_td3, s_td4); + + a = out[0] ^ iv[0]; + b = out[1] ^ iv[1]; + c = out[2] ^ iv[2]; + d = out[3] ^ iv[3]; + + /** + * section AES_cbc_essiv() starting + */ + + // 1. start with simple sha256_transform + + u32x essivhash[8]; + + essivhash[0] = SHA256M_A; + essivhash[1] = SHA256M_B; + essivhash[2] = SHA256M_C; + essivhash[3] = SHA256M_D; + essivhash[4] = SHA256M_E; + essivhash[5] = SHA256M_F; + essivhash[6] = SHA256M_G; + essivhash[7] = SHA256M_H; + + u32x w0[4]; + u32x w1[4]; + u32x w2[4]; + u32x w3[4]; + + w0[0] = a; + w0[1] = b; + w0[2] = c; + w0[3] = d; + w1[0] = 0x80000000; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 16 * 8; + + sha256_transform (w0, w1, w2, w3, essivhash); + + // check for FAT + + { + // 2. generate essiv based on startsector -- each 512 byte is one sector + + data[0] = 0; + data[1] = 0; + data[2] = 0; + data[3] = 0; + + ukeyx[0] = essivhash[0]; + ukeyx[1] = essivhash[1]; + ukeyx[2] = essivhash[2]; + ukeyx[3] = essivhash[3]; + ukeyx[4] = essivhash[4]; + ukeyx[5] = essivhash[5]; + ukeyx[6] = essivhash[6]; + ukeyx[7] = essivhash[7]; + + AES256_ExpandKey (ukeyx, rek, s_te0, s_te1, s_te2, s_te3, s_te4); + + u32 essiv[4]; + + AES256_encrypt (data, essiv, rek, s_te0, s_te1, s_te2, s_te3, s_te4); + + // 3. decrypt real data, xor essiv afterwards + + data[0] = androidfde_bufs[salt_pos].data[0]; + data[1] = androidfde_bufs[salt_pos].data[1]; + data[2] = androidfde_bufs[salt_pos].data[2]; + data[3] = androidfde_bufs[salt_pos].data[3]; + + iv[0] = essiv[0]; + iv[1] = essiv[1]; + iv[2] = essiv[2]; + iv[3] = essiv[3]; + + ukeyx[0] = a; + ukeyx[1] = b; + ukeyx[2] = c; + ukeyx[3] = d; + ukeyx[4] = 0; + ukeyx[5] = 0; + ukeyx[6] = 0; + ukeyx[7] = 0; + + AES128_ExpandKey (ukeyx, rek, s_te0, s_te1, s_te2, s_te3, s_te4); + + for (u32 i = 0; i < 44; i++) rdk[i] = rek[i]; + + AES128_InvertKey (rdk, s_td0, s_td1, s_td2, s_td3, s_td4, s_te0, s_te1, s_te2, s_te3, s_te4); + + AES128_decrypt (data, out, rdk, s_td0, s_td1, s_td2, s_td3, s_td4); + + u32x r0 = out[0] ^ iv[0]; + u32x r1 = out[1] ^ iv[1]; + u32x r2 = out[2] ^ iv[2]; + u32x r3 = out[3] ^ iv[3]; + + // rotate 3 byte (static in fat!) + + r0 = r1 << 8 | r0 >> 24; + r1 = r2 << 8 | r1 >> 24; + + // MSDOS5.0 + if ((r0 == 0x4f44534d) && (r1 == 0x302e3553)) + { + mark_hash_s0 (plains_buf, hashes_shown, digests_offset + 0, gid, 0); + + d_return_buf[lid] = 1; + } + } + + // check for extfs + + { + u32 r[16]; + + // 2. generate essiv based on startsector -- each 512 byte is one sector + + // not needed because of cbc mode -- implementation flaw !!. first 16 byte are not interessting + + r[0] = 0; + r[1] = 0; + r[2] = 0; + r[3] = 0; + + // 3. decrypt real data + + ukeyx[0] = a; + ukeyx[1] = b; + ukeyx[2] = c; + ukeyx[3] = d; + ukeyx[4] = 0; + ukeyx[5] = 0; + ukeyx[6] = 0; + ukeyx[7] = 0; + + AES128_ExpandKey (ukeyx, rek, s_te0, s_te1, s_te2, s_te3, s_te4); + + for (u32 i = 0; i < 44; i++) rdk[i] = rek[i]; + + AES128_InvertKey (rdk, s_td0, s_td1, s_td2, s_td3, s_td4, s_te0, s_te1, s_te2, s_te3, s_te4); + + for (u32 i = 4; i < 16; i += 4) + { + data[0] = androidfde_bufs[salt_pos].data[256 + i + 0]; + data[1] = androidfde_bufs[salt_pos].data[256 + i + 1]; + data[2] = androidfde_bufs[salt_pos].data[256 + i + 2]; + data[3] = androidfde_bufs[salt_pos].data[256 + i + 3]; + + iv[0] = androidfde_bufs[salt_pos].data[256 + i + 0 - 4]; + iv[1] = androidfde_bufs[salt_pos].data[256 + i + 1 - 4]; + iv[2] = androidfde_bufs[salt_pos].data[256 + i + 2 - 4]; + iv[3] = androidfde_bufs[salt_pos].data[256 + i + 3 - 4]; + + AES128_decrypt (data, out, rdk, s_td0, s_td1, s_td2, s_td3, s_td4); + + r[i + 0] = out[0] ^ iv[0]; + r[i + 1] = out[1] ^ iv[1]; + r[i + 2] = out[2] ^ iv[2]; + r[i + 3] = out[3] ^ iv[3]; + } + + // we need just a few swapped, because we do not access the others + r[ 5] = swap_workaround (r[ 5]); + r[ 6] = swap_workaround (r[ 6]); + r[14] = swap_workaround (r[14]); + + // superblock not on id 0 or 1 + // assumes max block size is 32MiB + // has EXT2_SUPER_MAGIC + + if ((r[5] < 2) && (r[6] < 16) && ((r[14] & 0xffff) == 0xEF53)) + { + mark_hash_s0 (plains_buf, hashes_shown, digests_offset + 0, gid, 0); + + d_return_buf[lid] = 1; + } + } +} diff --git a/amd/m08900.cl b/amd/m08900.cl new file mode 100644 index 0000000000..341578c475 --- /dev/null +++ b/amd/m08900.cl @@ -0,0 +1,1118 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _SCRYPT_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW4 +#define VECT_SIZE1 +#endif + +#ifdef VLIW5 +#define VECT_SIZE1 +#endif + +#define DGST_R0 0 +#define DGST_R1 1 +#define DGST_R2 2 +#define DGST_R3 3 + +#include "include/kernel_functions.c" +#include "types_amd.c" +#include "common_amd.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +__constant u32 k_sha256[64] = +{ + SHA256C00, SHA256C01, SHA256C02, SHA256C03, + SHA256C04, SHA256C05, SHA256C06, SHA256C07, + SHA256C08, SHA256C09, SHA256C0a, SHA256C0b, + SHA256C0c, SHA256C0d, SHA256C0e, SHA256C0f, + SHA256C10, SHA256C11, SHA256C12, SHA256C13, + SHA256C14, SHA256C15, SHA256C16, SHA256C17, + SHA256C18, SHA256C19, SHA256C1a, SHA256C1b, + SHA256C1c, SHA256C1d, SHA256C1e, SHA256C1f, + SHA256C20, SHA256C21, SHA256C22, SHA256C23, + SHA256C24, SHA256C25, SHA256C26, SHA256C27, + SHA256C28, SHA256C29, SHA256C2a, SHA256C2b, + SHA256C2c, SHA256C2d, SHA256C2e, SHA256C2f, + SHA256C30, SHA256C31, SHA256C32, SHA256C33, + SHA256C34, SHA256C35, SHA256C36, SHA256C37, + SHA256C38, SHA256C39, SHA256C3a, SHA256C3b, + SHA256C3c, SHA256C3d, SHA256C3e, SHA256C3f, +}; + +static void sha256_transform (const u32x w0[4], const u32x w1[4], const u32x w2[4], const u32x w3[4], u32x digest[8]) +{ + u32x a = digest[0]; + u32x b = digest[1]; + u32x c = digest[2]; + u32x d = digest[3]; + u32x e = digest[4]; + u32x f = digest[5]; + u32x g = digest[6]; + u32x h = digest[7]; + + u32x w0_t = w0[0]; + u32x w1_t = w0[1]; + u32x w2_t = w0[2]; + u32x w3_t = w0[3]; + u32x w4_t = w1[0]; + u32x w5_t = w1[1]; + u32x w6_t = w1[2]; + u32x w7_t = w1[3]; + u32x w8_t = w2[0]; + u32x w9_t = w2[1]; + u32x wa_t = w2[2]; + u32x wb_t = w2[3]; + u32x wc_t = w3[0]; + u32x wd_t = w3[1]; + u32x we_t = w3[2]; + u32x wf_t = w3[3]; + + #define ROUND_EXPAND() \ + { \ + w0_t = SHA256_EXPAND (we_t, w9_t, w1_t, w0_t); \ + w1_t = SHA256_EXPAND (wf_t, wa_t, w2_t, w1_t); \ + w2_t = SHA256_EXPAND (w0_t, wb_t, w3_t, w2_t); \ + w3_t = SHA256_EXPAND (w1_t, wc_t, w4_t, w3_t); \ + w4_t = SHA256_EXPAND (w2_t, wd_t, w5_t, w4_t); \ + w5_t = SHA256_EXPAND (w3_t, we_t, w6_t, w5_t); \ + w6_t = SHA256_EXPAND (w4_t, wf_t, w7_t, w6_t); \ + w7_t = SHA256_EXPAND (w5_t, w0_t, w8_t, w7_t); \ + w8_t = SHA256_EXPAND (w6_t, w1_t, w9_t, w8_t); \ + w9_t = SHA256_EXPAND (w7_t, w2_t, wa_t, w9_t); \ + wa_t = SHA256_EXPAND (w8_t, w3_t, wb_t, wa_t); \ + wb_t = SHA256_EXPAND (w9_t, w4_t, wc_t, wb_t); \ + wc_t = SHA256_EXPAND (wa_t, w5_t, wd_t, wc_t); \ + wd_t = SHA256_EXPAND (wb_t, w6_t, we_t, wd_t); \ + we_t = SHA256_EXPAND (wc_t, w7_t, wf_t, we_t); \ + wf_t = SHA256_EXPAND (wd_t, w8_t, w0_t, wf_t); \ + } + + #define ROUND_STEP(i) \ + { \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, k_sha256[i + 0]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, k_sha256[i + 1]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, k_sha256[i + 2]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, k_sha256[i + 3]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, k_sha256[i + 4]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, k_sha256[i + 5]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, k_sha256[i + 6]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, k_sha256[i + 7]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, k_sha256[i + 8]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, k_sha256[i + 9]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, k_sha256[i + 10]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, k_sha256[i + 11]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, k_sha256[i + 12]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, k_sha256[i + 13]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, k_sha256[i + 14]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, k_sha256[i + 15]); \ + } + + ROUND_STEP (0); + + #pragma unroll + for (int i = 16; i < 64; i += 16) + { + ROUND_EXPAND (); ROUND_STEP (i); + } + + digest[0] += a; + digest[1] += b; + digest[2] += c; + digest[3] += d; + digest[4] += e; + digest[5] += f; + digest[6] += g; + digest[7] += h; +} + +static void hmac_sha256_pad (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], u32x ipad[8], u32x opad[8]) +{ + w0[0] = w0[0] ^ 0x36363636; + w0[1] = w0[1] ^ 0x36363636; + w0[2] = w0[2] ^ 0x36363636; + w0[3] = w0[3] ^ 0x36363636; + w1[0] = w1[0] ^ 0x36363636; + w1[1] = w1[1] ^ 0x36363636; + w1[2] = w1[2] ^ 0x36363636; + w1[3] = w1[3] ^ 0x36363636; + w2[0] = w2[0] ^ 0x36363636; + w2[1] = w2[1] ^ 0x36363636; + w2[2] = w2[2] ^ 0x36363636; + w2[3] = w2[3] ^ 0x36363636; + w3[0] = w3[0] ^ 0x36363636; + w3[1] = w3[1] ^ 0x36363636; + w3[2] = w3[2] ^ 0x36363636; + w3[3] = w3[3] ^ 0x36363636; + + ipad[0] = SHA256M_A; + ipad[1] = SHA256M_B; + ipad[2] = SHA256M_C; + ipad[3] = SHA256M_D; + ipad[4] = SHA256M_E; + ipad[5] = SHA256M_F; + ipad[6] = SHA256M_G; + ipad[7] = SHA256M_H; + + sha256_transform (w0, w1, w2, w3, ipad); + + w0[0] = w0[0] ^ 0x6a6a6a6a; + w0[1] = w0[1] ^ 0x6a6a6a6a; + w0[2] = w0[2] ^ 0x6a6a6a6a; + w0[3] = w0[3] ^ 0x6a6a6a6a; + w1[0] = w1[0] ^ 0x6a6a6a6a; + w1[1] = w1[1] ^ 0x6a6a6a6a; + w1[2] = w1[2] ^ 0x6a6a6a6a; + w1[3] = w1[3] ^ 0x6a6a6a6a; + w2[0] = w2[0] ^ 0x6a6a6a6a; + w2[1] = w2[1] ^ 0x6a6a6a6a; + w2[2] = w2[2] ^ 0x6a6a6a6a; + w2[3] = w2[3] ^ 0x6a6a6a6a; + w3[0] = w3[0] ^ 0x6a6a6a6a; + w3[1] = w3[1] ^ 0x6a6a6a6a; + w3[2] = w3[2] ^ 0x6a6a6a6a; + w3[3] = w3[3] ^ 0x6a6a6a6a; + + opad[0] = SHA256M_A; + opad[1] = SHA256M_B; + opad[2] = SHA256M_C; + opad[3] = SHA256M_D; + opad[4] = SHA256M_E; + opad[5] = SHA256M_F; + opad[6] = SHA256M_G; + opad[7] = SHA256M_H; + + sha256_transform (w0, w1, w2, w3, opad); +} + +static void hmac_sha256_run (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], u32x ipad[8], u32x opad[8], u32x digest[8]) +{ + digest[0] = ipad[0]; + digest[1] = ipad[1]; + digest[2] = ipad[2]; + digest[3] = ipad[3]; + digest[4] = ipad[4]; + digest[5] = ipad[5]; + digest[6] = ipad[6]; + digest[7] = ipad[7]; + + sha256_transform (w0, w1, w2, w3, digest); + + w0[0] = digest[0]; + w0[1] = digest[1]; + w0[2] = digest[2]; + w0[3] = digest[3]; + w1[0] = digest[4]; + w1[1] = digest[5]; + w1[2] = digest[6]; + w1[3] = digest[7]; + w2[0] = 0x80000000; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = (64 + 32) * 8; + + digest[0] = opad[0]; + digest[1] = opad[1]; + digest[2] = opad[2]; + digest[3] = opad[3]; + digest[4] = opad[4]; + digest[5] = opad[5]; + digest[6] = opad[6]; + digest[7] = opad[7]; + + sha256_transform (w0, w1, w2, w3, digest); +} + +static void memcat8 (u32x block0[4], u32x block1[4], u32x block2[4], u32x block3[4], const u32 block_len, const u32 append[2]) +{ + switch (block_len) + { + case 0: + block0[0] = append[0]; + block0[1] = append[1]; + break; + + case 1: + block0[0] = block0[0] | append[0] << 8; + block0[1] = append[0] >> 24 | append[1] << 8; + block0[2] = append[1] >> 24; + break; + + case 2: + block0[0] = block0[0] | append[0] << 16; + block0[1] = append[0] >> 16 | append[1] << 16; + block0[2] = append[1] >> 16; + break; + + case 3: + block0[0] = block0[0] | append[0] << 24; + block0[1] = append[0] >> 8 | append[1] << 24; + block0[2] = append[1] >> 8; + break; + + case 4: + block0[1] = append[0]; + block0[2] = append[1]; + break; + + case 5: + block0[1] = block0[1] | append[0] << 8; + block0[2] = append[0] >> 24 | append[1] << 8; + block0[3] = append[1] >> 24; + break; + + case 6: + block0[1] = block0[1] | append[0] << 16; + block0[2] = append[0] >> 16 | append[1] << 16; + block0[3] = append[1] >> 16; + break; + + case 7: + block0[1] = block0[1] | append[0] << 24; + block0[2] = append[0] >> 8 | append[1] << 24; + block0[3] = append[1] >> 8; + break; + + case 8: + block0[2] = append[0]; + block0[3] = append[1]; + break; + + case 9: + block0[2] = block0[2] | append[0] << 8; + block0[3] = append[0] >> 24 | append[1] << 8; + block1[0] = append[1] >> 24; + break; + + case 10: + block0[2] = block0[2] | append[0] << 16; + block0[3] = append[0] >> 16 | append[1] << 16; + block1[0] = append[1] >> 16; + break; + + case 11: + block0[2] = block0[2] | append[0] << 24; + block0[3] = append[0] >> 8 | append[1] << 24; + block1[0] = append[1] >> 8; + break; + + case 12: + block0[3] = append[0]; + block1[0] = append[1]; + break; + + case 13: + block0[3] = block0[3] | append[0] << 8; + block1[0] = append[0] >> 24 | append[1] << 8; + block1[1] = append[1] >> 24; + break; + + case 14: + block0[3] = block0[3] | append[0] << 16; + block1[0] = append[0] >> 16 | append[1] << 16; + block1[1] = append[1] >> 16; + break; + + case 15: + block0[3] = block0[3] | append[0] << 24; + block1[0] = append[0] >> 8 | append[1] << 24; + block1[1] = append[1] >> 8; + break; + + case 16: + block1[0] = append[0]; + block1[1] = append[1]; + break; + + case 17: + block1[0] = block1[0] | append[0] << 8; + block1[1] = append[0] >> 24 | append[1] << 8; + block1[2] = append[1] >> 24; + break; + + case 18: + block1[0] = block1[0] | append[0] << 16; + block1[1] = append[0] >> 16 | append[1] << 16; + block1[2] = append[1] >> 16; + break; + + case 19: + block1[0] = block1[0] | append[0] << 24; + block1[1] = append[0] >> 8 | append[1] << 24; + block1[2] = append[1] >> 8; + break; + + case 20: + block1[1] = append[0]; + block1[2] = append[1]; + break; + + case 21: + block1[1] = block1[1] | append[0] << 8; + block1[2] = append[0] >> 24 | append[1] << 8; + block1[3] = append[1] >> 24; + break; + + case 22: + block1[1] = block1[1] | append[0] << 16; + block1[2] = append[0] >> 16 | append[1] << 16; + block1[3] = append[1] >> 16; + break; + + case 23: + block1[1] = block1[1] | append[0] << 24; + block1[2] = append[0] >> 8 | append[1] << 24; + block1[3] = append[1] >> 8; + break; + + case 24: + block1[2] = append[0]; + block1[3] = append[1]; + break; + + case 25: + block1[2] = block1[2] | append[0] << 8; + block1[3] = append[0] >> 24 | append[1] << 8; + block2[0] = append[1] >> 24; + break; + + case 26: + block1[2] = block1[2] | append[0] << 16; + block1[3] = append[0] >> 16 | append[1] << 16; + block2[0] = append[1] >> 16; + break; + + case 27: + block1[2] = block1[2] | append[0] << 24; + block1[3] = append[0] >> 8 | append[1] << 24; + block2[0] = append[1] >> 8; + break; + + case 28: + block1[3] = append[0]; + block2[0] = append[1]; + break; + + case 29: + block1[3] = block1[3] | append[0] << 8; + block2[0] = append[0] >> 24 | append[1] << 8; + block2[1] = append[1] >> 24; + break; + + case 30: + block1[3] = block1[3] | append[0] << 16; + block2[0] = append[0] >> 16 | append[1] << 16; + block2[1] = append[1] >> 16; + break; + + case 31: + block1[3] = block1[3] | append[0] << 24; + block2[0] = append[0] >> 8 | append[1] << 24; + block2[1] = append[1] >> 8; + break; + + case 32: + block2[0] = append[0]; + block2[1] = append[1]; + break; + + case 33: + block2[0] = block2[0] | append[0] << 8; + block2[1] = append[0] >> 24 | append[1] << 8; + block2[2] = append[1] >> 24; + break; + + case 34: + block2[0] = block2[0] | append[0] << 16; + block2[1] = append[0] >> 16 | append[1] << 16; + block2[2] = append[1] >> 16; + break; + + case 35: + block2[0] = block2[0] | append[0] << 24; + block2[1] = append[0] >> 8 | append[1] << 24; + block2[2] = append[1] >> 8; + break; + + case 36: + block2[1] = append[0]; + block2[2] = append[1]; + break; + + case 37: + block2[1] = block2[1] | append[0] << 8; + block2[2] = append[0] >> 24 | append[1] << 8; + block2[3] = append[1] >> 24; + break; + + case 38: + block2[1] = block2[1] | append[0] << 16; + block2[2] = append[0] >> 16 | append[1] << 16; + block2[3] = append[1] >> 16; + break; + + case 39: + block2[1] = block2[1] | append[0] << 24; + block2[2] = append[0] >> 8 | append[1] << 24; + block2[3] = append[1] >> 8; + break; + + case 40: + block2[2] = append[0]; + block2[3] = append[1]; + break; + + case 41: + block2[2] = block2[2] | append[0] << 8; + block2[3] = append[0] >> 24 | append[1] << 8; + block3[0] = append[1] >> 24; + break; + + case 42: + block2[2] = block2[2] | append[0] << 16; + block2[3] = append[0] >> 16 | append[1] << 16; + block3[0] = append[1] >> 16; + break; + + case 43: + block2[2] = block2[2] | append[0] << 24; + block2[3] = append[0] >> 8 | append[1] << 24; + block3[0] = append[1] >> 8; + break; + + case 44: + block2[3] = append[0]; + block3[0] = append[1]; + break; + + case 45: + block2[3] = block2[3] | append[0] << 8; + block3[0] = append[0] >> 24 | append[1] << 8; + block3[1] = append[1] >> 24; + break; + + case 46: + block2[3] = block2[3] | append[0] << 16; + block3[0] = append[0] >> 16 | append[1] << 16; + block3[1] = append[1] >> 16; + break; + + case 47: + block2[3] = block2[3] | append[0] << 24; + block3[0] = append[0] >> 8 | append[1] << 24; + block3[1] = append[1] >> 8; + break; + + case 48: + block3[0] = append[0]; + block3[1] = append[1]; + break; + + case 49: + block3[0] = block3[0] | append[0] << 8; + block3[1] = append[0] >> 24 | append[1] << 8; + block3[2] = append[1] >> 24; + break; + + case 50: + block3[0] = block3[0] | append[0] << 16; + block3[1] = append[0] >> 16 | append[1] << 16; + block3[2] = append[1] >> 16; + break; + + case 51: + block3[0] = block3[0] | append[0] << 24; + block3[1] = append[0] >> 8 | append[1] << 24; + block3[2] = append[1] >> 8; + break; + + case 52: + block3[1] = append[0]; + block3[2] = append[1]; + break; + + case 53: + block3[1] = block3[1] | append[0] << 8; + block3[2] = append[0] >> 24 | append[1] << 8; + block3[3] = append[1] >> 24; + break; + + case 54: + block3[1] = block3[1] | append[0] << 16; + block3[2] = append[0] >> 16 | append[1] << 16; + block3[3] = append[1] >> 16; + break; + + case 55: + block3[1] = block3[1] | append[0] << 24; + block3[2] = append[0] >> 8 | append[1] << 24; + block3[3] = append[1] >> 8; + break; + + case 56: + block3[2] = append[0]; + block3[3] = append[1]; + break; + } +} + +static uint4 swap_workaround (uint4 v) +{ + return (rotate ((v & 0x00FF00FF), 24u) | rotate ((v & 0xFF00FF00), 8u)); +} + +#define GET_SCRYPT_CNT(r,p) (2 * (r) * 16 * (p)) +#define GET_SMIX_CNT(r,N) (2 * (r) * 16 * (N)) +#define GET_STATE_CNT(r) (2 * (r) * 16) + +#define ADD_ROTATE_XOR(r,i1,i2,s) (r) ^= rotate ((i1) + (i2), (s)); + +#define SALSA20_2R() \ +{ \ + ADD_ROTATE_XOR (X1, X0, X3, 7); \ + ADD_ROTATE_XOR (X2, X1, X0, 9); \ + ADD_ROTATE_XOR (X3, X2, X1, 13); \ + ADD_ROTATE_XOR (X0, X3, X2, 18); \ + \ + X1 = X1.s3012; \ + X2 = X2.s2301; \ + X3 = X3.s1230; \ + \ + ADD_ROTATE_XOR (X3, X0, X1, 7); \ + ADD_ROTATE_XOR (X2, X3, X0, 9); \ + ADD_ROTATE_XOR (X1, X2, X3, 13); \ + ADD_ROTATE_XOR (X0, X1, X2, 18); \ + \ + X1 = X1.s1230; \ + X2 = X2.s2301; \ + X3 = X3.s3012; \ +} + +#define SALSA20_8_XOR() \ +{ \ + R0 = R0 ^ Y0; \ + R1 = R1 ^ Y1; \ + R2 = R2 ^ Y2; \ + R3 = R3 ^ Y3; \ + \ + uint4 X0 = R0; \ + uint4 X1 = R1; \ + uint4 X2 = R2; \ + uint4 X3 = R3; \ + \ + SALSA20_2R (); \ + SALSA20_2R (); \ + SALSA20_2R (); \ + SALSA20_2R (); \ + \ + R0 = R0 + X0; \ + R1 = R1 + X1; \ + R2 = R2 + X2; \ + R3 = R3 + X3; \ +} + +static void salsa_r (uint4 *T, const u32 r) +{ + const u32 state_cnt = GET_STATE_CNT (r); + + const u32 state_cnt4 = state_cnt / 4; + + uint4 R0 = T[state_cnt4 - 4]; + uint4 R1 = T[state_cnt4 - 3]; + uint4 R2 = T[state_cnt4 - 2]; + uint4 R3 = T[state_cnt4 - 1]; + + for (u32 i = 0; i < state_cnt4; i += 8) + { + uint4 Y0; + uint4 Y1; + uint4 Y2; + uint4 Y3; + + Y0 = T[i + 0]; + Y1 = T[i + 1]; + Y2 = T[i + 2]; + Y3 = T[i + 3]; + + SALSA20_8_XOR (); + + T[i + 0] = R0; + T[i + 1] = R1; + T[i + 2] = R2; + T[i + 3] = R3; + + Y0 = T[i + 4]; + Y1 = T[i + 5]; + Y2 = T[i + 6]; + Y3 = T[i + 7]; + + SALSA20_8_XOR (); + + T[i + 4] = R0; + T[i + 5] = R1; + T[i + 6] = R2; + T[i + 7] = R3; + } + + #define exchg(x,y) { const uint4 t = T[(x)]; T[(x)] = T[(y)]; T[(y)] = t; } + + #define exchg4(x,y) \ + { \ + const u32 x4 = (x) * 4; \ + const u32 y4 = (y) * 4; \ + \ + exchg (x4 + 0, y4 + 0); \ + exchg (x4 + 1, y4 + 1); \ + exchg (x4 + 2, y4 + 2); \ + exchg (x4 + 3, y4 + 3); \ + } + + for (u32 i = 1; i < r / 1; i++) + { + const u32 x = i * 1; + const u32 y = i * 2; + + exchg4 (x, y); + } + + for (u32 i = 1; i < r / 2; i++) + { + const u32 x = i * 1; + const u32 y = i * 2; + + const u32 xr1 = (r * 2) - 1 - x; + const u32 yr1 = (r * 2) - 1 - y; + + exchg4 (xr1, yr1); + } +} + +static void scrypt_smix (uint4 *X, uint4 *T, const u32 N, const u32 r, const u32 tmto, const u32 phy, __global uint4 *V) +{ + const u32 state_cnt = GET_STATE_CNT (r); + + const u32 state_cnt4 = state_cnt / 4; + + #define Coord(x,y,z) (((x) * zSIZE) + ((y) * zSIZE * xSIZE) + (z)) + #define CO Coord(x,y,z) + + const u32 xSIZE = phy; + const u32 ySIZE = N / tmto; + const u32 zSIZE = state_cnt4; + + const u32 gid = get_global_id (0); + + const u32 x = gid % xSIZE; + + #pragma unroll + for (u32 i = 0; i < state_cnt4; i += 4) + { + T[0] = (uint4) (X[i + 0].x, X[i + 1].y, X[i + 2].z, X[i + 3].w); + T[1] = (uint4) (X[i + 1].x, X[i + 2].y, X[i + 3].z, X[i + 0].w); + T[2] = (uint4) (X[i + 2].x, X[i + 3].y, X[i + 0].z, X[i + 1].w); + T[3] = (uint4) (X[i + 3].x, X[i + 0].y, X[i + 1].z, X[i + 2].w); + + X[i + 0] = T[0]; + X[i + 1] = T[1]; + X[i + 2] = T[2]; + X[i + 3] = T[3]; + } + + for (u32 y = 0; y < ySIZE; y++) + { + for (u32 z = 0; z < zSIZE; z++) V[CO] = X[z]; + + for (u32 i = 0; i < tmto; i++) salsa_r (X, r); + } + + for (u32 i = 0; i < N; i++) + { + const u32 k = X[zSIZE - 4].x & (N - 1); + + const u32 y = k / tmto; + + const u32 km = k - (y * tmto); + + for (u32 z = 0; z < zSIZE; z++) T[z] = V[CO]; + + for (u32 i = 0; i < km; i++) salsa_r (T, r); + + for (u32 z = 0; z < zSIZE; z++) X[z] ^= T[z]; + + salsa_r (X, r); + } + + #pragma unroll + for (u32 i = 0; i < state_cnt4; i += 4) + { + T[0] = (uint4) (X[i + 0].x, X[i + 3].y, X[i + 2].z, X[i + 1].w); + T[1] = (uint4) (X[i + 1].x, X[i + 0].y, X[i + 3].z, X[i + 2].w); + T[2] = (uint4) (X[i + 2].x, X[i + 1].y, X[i + 0].z, X[i + 3].w); + T[3] = (uint4) (X[i + 3].x, X[i + 2].y, X[i + 1].z, X[i + 0].w); + + X[i + 0] = T[0]; + X[i + 1] = T[1]; + X[i + 2] = T[2]; + X[i + 3] = T[3]; + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m08900_init (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global scrypt_tmp_t *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global uint4 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = pws[gid].i[ 8]; + w2[1] = pws[gid].i[ 9]; + w2[2] = pws[gid].i[10]; + w2[3] = pws[gid].i[11]; + + u32x w3[4]; + + w3[0] = pws[gid].i[12]; + w3[1] = pws[gid].i[13]; + w3[2] = pws[gid].i[14]; + w3[3] = pws[gid].i[15]; + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[7]; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + /** + * memory buffers + */ + + const u32 scrypt_r = SCRYPT_R; + const u32 scrypt_p = SCRYPT_P; + //const u32 scrypt_N = SCRYPT_N; + + //const u32 state_cnt = GET_STATE_CNT (scrypt_r); + const u32 scrypt_cnt = GET_SCRYPT_CNT (scrypt_r, scrypt_p); + //const u32 smix_cnt = GET_SMIX_CNT (scrypt_r, scrypt_N); + + /** + * 1st pbkdf2, creates B + */ + + w0[0] = swap_workaround (w0[0]); + w0[1] = swap_workaround (w0[1]); + w0[2] = swap_workaround (w0[2]); + w0[3] = swap_workaround (w0[3]); + w1[0] = swap_workaround (w1[0]); + w1[1] = swap_workaround (w1[1]); + w1[2] = swap_workaround (w1[2]); + w1[3] = swap_workaround (w1[3]); + w2[0] = swap_workaround (w2[0]); + w2[1] = swap_workaround (w2[1]); + w2[2] = swap_workaround (w2[2]); + w2[3] = swap_workaround (w2[3]); + w3[0] = swap_workaround (w3[0]); + w3[1] = swap_workaround (w3[1]); + w3[2] = swap_workaround (w3[2]); + w3[3] = swap_workaround (w3[3]); + + u32 ipad[8]; + u32 opad[8]; + + hmac_sha256_pad (w0, w1, w2, w3, ipad, opad); + + for (u32 i = 0, j = 0, k = 0; i < scrypt_cnt; i += 8, j += 1, k += 2) + { + w0[0] = salt_buf0[0]; + w0[1] = salt_buf0[1]; + w0[2] = salt_buf0[2]; + w0[3] = salt_buf0[3]; + w1[0] = salt_buf1[0]; + w1[1] = salt_buf1[1]; + w1[2] = salt_buf1[2]; + w1[3] = salt_buf1[3]; + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + u32 append[2]; + + append[0] = swap_workaround (j + 1); + append[1] = 0x80; + + memcat8 (w0, w1, w2, w3, salt_len, append); + + w0[0] = swap_workaround (w0[0]); + w0[1] = swap_workaround (w0[1]); + w0[2] = swap_workaround (w0[2]); + w0[3] = swap_workaround (w0[3]); + w1[0] = swap_workaround (w1[0]); + w1[1] = swap_workaround (w1[1]); + w1[2] = swap_workaround (w1[2]); + w1[3] = swap_workaround (w1[3]); + w2[0] = swap_workaround (w2[0]); + w2[1] = swap_workaround (w2[1]); + w2[2] = swap_workaround (w2[2]); + w2[3] = swap_workaround (w2[3]); + w3[0] = swap_workaround (w3[0]); + w3[1] = swap_workaround (w3[1]); + w3[2] = 0; + w3[3] = (64 + salt_len + 4) * 8; + + u32x digest[8]; + + hmac_sha256_run (w0, w1, w2, w3, ipad, opad, digest); + + const uint4 tmp0 = (uint4) (digest[0], digest[1], digest[2], digest[3]); + const uint4 tmp1 = (uint4) (digest[4], digest[5], digest[6], digest[7]); + + barrier (CLK_GLOBAL_MEM_FENCE); + + tmps[gid].P[k + 0] = tmp0; + tmps[gid].P[k + 1] = tmp1; + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m08900_loop (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global scrypt_tmp_t *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global uint4 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + const u32 scrypt_phy = salt_bufs[salt_pos].scrypt_phy; + + const u32 state_cnt = GET_STATE_CNT (SCRYPT_R); + const u32 scrypt_cnt = GET_SCRYPT_CNT (SCRYPT_R, SCRYPT_P); + + const u32 state_cnt4 = state_cnt / 4; + const u32 scrypt_cnt4 = scrypt_cnt / 4; + + uint4 X[state_cnt4]; + uint4 T[state_cnt4]; + + #pragma unroll + for (int z = 0; z < state_cnt4; z++) X[z] = swap_workaround (tmps[gid].P[z]); + + scrypt_smix (X, T, SCRYPT_N, SCRYPT_R, SCRYPT_TMTO, scrypt_phy, d_scryptV_buf); + + #pragma unroll + for (int z = 0; z < state_cnt4; z++) tmps[gid].P[z] = swap_workaround (X[z]); + + #if SCRYPT_P >= 1 + for (int i = state_cnt4; i < scrypt_cnt4; i += state_cnt4) + { + for (int z = 0; z < state_cnt4; z++) X[z] = swap_workaround (tmps[gid].P[i + z]); + + scrypt_smix (X, T, SCRYPT_N, SCRYPT_R, SCRYPT_TMTO, scrypt_phy, d_scryptV_buf); + + for (int z = 0; z < state_cnt4; z++) tmps[gid].P[i + z] = swap_workaround (X[z]); + } + #endif +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m08900_comp (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global scrypt_tmp_t *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global uint4 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + const u32 lid = get_local_id (0); + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = pws[gid].i[ 8]; + w2[1] = pws[gid].i[ 9]; + w2[2] = pws[gid].i[10]; + w2[3] = pws[gid].i[11]; + + u32x w3[4]; + + w3[0] = pws[gid].i[12]; + w3[1] = pws[gid].i[13]; + w3[2] = pws[gid].i[14]; + w3[3] = pws[gid].i[15]; + + /** + * memory buffers + */ + + const u32 scrypt_r = SCRYPT_R; + const u32 scrypt_p = SCRYPT_P; + //const u32 scrypt_N = SCRYPT_N; + + const u32 scrypt_cnt = GET_SCRYPT_CNT (scrypt_r, scrypt_p); + + const u32 scrypt_cnt4 = scrypt_cnt / 4; + + /** + * 2nd pbkdf2, creates B + */ + + w0[0] = swap_workaround (w0[0]); + w0[1] = swap_workaround (w0[1]); + w0[2] = swap_workaround (w0[2]); + w0[3] = swap_workaround (w0[3]); + w1[0] = swap_workaround (w1[0]); + w1[1] = swap_workaround (w1[1]); + w1[2] = swap_workaround (w1[2]); + w1[3] = swap_workaround (w1[3]); + w2[0] = swap_workaround (w2[0]); + w2[1] = swap_workaround (w2[1]); + w2[2] = swap_workaround (w2[2]); + w2[3] = swap_workaround (w2[3]); + w3[0] = swap_workaround (w3[0]); + w3[1] = swap_workaround (w3[1]); + w3[2] = swap_workaround (w3[2]); + w3[3] = swap_workaround (w3[3]); + + u32 ipad[8]; + u32 opad[8]; + + hmac_sha256_pad (w0, w1, w2, w3, ipad, opad); + + for (u32 l = 0; l < scrypt_cnt4; l += 4) + { + barrier (CLK_GLOBAL_MEM_FENCE); + + uint4 tmp; + + tmp = tmps[gid].P[l + 0]; + + w0[0] = tmp.s0; + w0[1] = tmp.s1; + w0[2] = tmp.s2; + w0[3] = tmp.s3; + + tmp = tmps[gid].P[l + 1]; + + w1[0] = tmp.s0; + w1[1] = tmp.s1; + w1[2] = tmp.s2; + w1[3] = tmp.s3; + + tmp = tmps[gid].P[l + 2]; + + w2[0] = tmp.s0; + w2[1] = tmp.s1; + w2[2] = tmp.s2; + w2[3] = tmp.s3; + + tmp = tmps[gid].P[l + 3]; + + w3[0] = tmp.s0; + w3[1] = tmp.s1; + w3[2] = tmp.s2; + w3[3] = tmp.s3; + + sha256_transform (w0, w1, w2, w3, ipad); + } + + w0[0] = 0x00000001; + w0[1] = 0x80000000; + w0[2] = 0; + w0[3] = 0; + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = (64 + (scrypt_cnt * 4) + 4) * 8; + + u32x digest[8]; + + hmac_sha256_run (w0, w1, w2, w3, ipad, opad, digest); + + const u32x r0 = swap_workaround (digest[DGST_R0]); + const u32x r1 = swap_workaround (digest[DGST_R1]); + const u32x r2 = swap_workaround (digest[DGST_R2]); + const u32x r3 = swap_workaround (digest[DGST_R3]); + + #define il_pos 0 + + #include VECT_COMPARE_M +} diff --git a/amd/m09000.cl b/amd/m09000.cl new file mode 100644 index 0000000000..81259e6a78 --- /dev/null +++ b/amd/m09000.cl @@ -0,0 +1,831 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _PSAFE2_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW4 +#define VECT_SIZE1 +#endif + +#ifdef VLIW5 +#define VECT_SIZE1 +#endif + +#define DGST_R0 0 +#define DGST_R1 1 +#define DGST_R2 2 +#define DGST_R3 3 + +#include "include/kernel_functions.c" +#include "types_amd.c" +#include "common_amd.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +// http://www.schneier.com/code/constants.txt + +__constant u32 c_sbox0[256] = +{ + 0xd1310ba6, 0x98dfb5ac, 0x2ffd72db, 0xd01adfb7, + 0xb8e1afed, 0x6a267e96, 0xba7c9045, 0xf12c7f99, + 0x24a19947, 0xb3916cf7, 0x0801f2e2, 0x858efc16, + 0x636920d8, 0x71574e69, 0xa458fea3, 0xf4933d7e, + 0x0d95748f, 0x728eb658, 0x718bcd58, 0x82154aee, + 0x7b54a41d, 0xc25a59b5, 0x9c30d539, 0x2af26013, + 0xc5d1b023, 0x286085f0, 0xca417918, 0xb8db38ef, + 0x8e79dcb0, 0x603a180e, 0x6c9e0e8b, 0xb01e8a3e, + 0xd71577c1, 0xbd314b27, 0x78af2fda, 0x55605c60, + 0xe65525f3, 0xaa55ab94, 0x57489862, 0x63e81440, + 0x55ca396a, 0x2aab10b6, 0xb4cc5c34, 0x1141e8ce, + 0xa15486af, 0x7c72e993, 0xb3ee1411, 0x636fbc2a, + 0x2ba9c55d, 0x741831f6, 0xce5c3e16, 0x9b87931e, + 0xafd6ba33, 0x6c24cf5c, 0x7a325381, 0x28958677, + 0x3b8f4898, 0x6b4bb9af, 0xc4bfe81b, 0x66282193, + 0x61d809cc, 0xfb21a991, 0x487cac60, 0x5dec8032, + 0xef845d5d, 0xe98575b1, 0xdc262302, 0xeb651b88, + 0x23893e81, 0xd396acc5, 0x0f6d6ff3, 0x83f44239, + 0x2e0b4482, 0xa4842004, 0x69c8f04a, 0x9e1f9b5e, + 0x21c66842, 0xf6e96c9a, 0x670c9c61, 0xabd388f0, + 0x6a51a0d2, 0xd8542f68, 0x960fa728, 0xab5133a3, + 0x6eef0b6c, 0x137a3be4, 0xba3bf050, 0x7efb2a98, + 0xa1f1651d, 0x39af0176, 0x66ca593e, 0x82430e88, + 0x8cee8619, 0x456f9fb4, 0x7d84a5c3, 0x3b8b5ebe, + 0xe06f75d8, 0x85c12073, 0x401a449f, 0x56c16aa6, + 0x4ed3aa62, 0x363f7706, 0x1bfedf72, 0x429b023d, + 0x37d0d724, 0xd00a1248, 0xdb0fead3, 0x49f1c09b, + 0x075372c9, 0x80991b7b, 0x25d479d8, 0xf6e8def7, + 0xe3fe501a, 0xb6794c3b, 0x976ce0bd, 0x04c006ba, + 0xc1a94fb6, 0x409f60c4, 0x5e5c9ec2, 0x196a2463, + 0x68fb6faf, 0x3e6c53b5, 0x1339b2eb, 0x3b52ec6f, + 0x6dfc511f, 0x9b30952c, 0xcc814544, 0xaf5ebd09, + 0xbee3d004, 0xde334afd, 0x660f2807, 0x192e4bb3, + 0xc0cba857, 0x45c8740f, 0xd20b5f39, 0xb9d3fbdb, + 0x5579c0bd, 0x1a60320a, 0xd6a100c6, 0x402c7279, + 0x679f25fe, 0xfb1fa3cc, 0x8ea5e9f8, 0xdb3222f8, + 0x3c7516df, 0xfd616b15, 0x2f501ec8, 0xad0552ab, + 0x323db5fa, 0xfd238760, 0x53317b48, 0x3e00df82, + 0x9e5c57bb, 0xca6f8ca0, 0x1a87562e, 0xdf1769db, + 0xd542a8f6, 0x287effc3, 0xac6732c6, 0x8c4f5573, + 0x695b27b0, 0xbbca58c8, 0xe1ffa35d, 0xb8f011a0, + 0x10fa3d98, 0xfd2183b8, 0x4afcb56c, 0x2dd1d35b, + 0x9a53e479, 0xb6f84565, 0xd28e49bc, 0x4bfb9790, + 0xe1ddf2da, 0xa4cb7e33, 0x62fb1341, 0xcee4c6e8, + 0xef20cada, 0x36774c01, 0xd07e9efe, 0x2bf11fb4, + 0x95dbda4d, 0xae909198, 0xeaad8e71, 0x6b93d5a0, + 0xd08ed1d0, 0xafc725e0, 0x8e3c5b2f, 0x8e7594b7, + 0x8ff6e2fb, 0xf2122b64, 0x8888b812, 0x900df01c, + 0x4fad5ea0, 0x688fc31c, 0xd1cff191, 0xb3a8c1ad, + 0x2f2f2218, 0xbe0e1777, 0xea752dfe, 0x8b021fa1, + 0xe5a0cc0f, 0xb56f74e8, 0x18acf3d6, 0xce89e299, + 0xb4a84fe0, 0xfd13e0b7, 0x7cc43b81, 0xd2ada8d9, + 0x165fa266, 0x80957705, 0x93cc7314, 0x211a1477, + 0xe6ad2065, 0x77b5fa86, 0xc75442f5, 0xfb9d35cf, + 0xebcdaf0c, 0x7b3e89a0, 0xd6411bd3, 0xae1e7e49, + 0x00250e2d, 0x2071b35e, 0x226800bb, 0x57b8e0af, + 0x2464369b, 0xf009b91e, 0x5563911d, 0x59dfa6aa, + 0x78c14389, 0xd95a537f, 0x207d5ba2, 0x02e5b9c5, + 0x83260376, 0x6295cfa9, 0x11c81968, 0x4e734a41, + 0xb3472dca, 0x7b14a94a, 0x1b510052, 0x9a532915, + 0xd60f573f, 0xbc9bc6e4, 0x2b60a476, 0x81e67400, + 0x08ba6fb5, 0x571be91f, 0xf296ec6b, 0x2a0dd915, + 0xb6636521, 0xe7b9f9b6, 0xff34052e, 0xc5855664, + 0x53b02d5d, 0xa99f8fa1, 0x08ba4799, 0x6e85076a +}; + +__constant u32 c_sbox1[256] = +{ + 0x4b7a70e9, 0xb5b32944, 0xdb75092e, 0xc4192623, + 0xad6ea6b0, 0x49a7df7d, 0x9cee60b8, 0x8fedb266, + 0xecaa8c71, 0x699a17ff, 0x5664526c, 0xc2b19ee1, + 0x193602a5, 0x75094c29, 0xa0591340, 0xe4183a3e, + 0x3f54989a, 0x5b429d65, 0x6b8fe4d6, 0x99f73fd6, + 0xa1d29c07, 0xefe830f5, 0x4d2d38e6, 0xf0255dc1, + 0x4cdd2086, 0x8470eb26, 0x6382e9c6, 0x021ecc5e, + 0x09686b3f, 0x3ebaefc9, 0x3c971814, 0x6b6a70a1, + 0x687f3584, 0x52a0e286, 0xb79c5305, 0xaa500737, + 0x3e07841c, 0x7fdeae5c, 0x8e7d44ec, 0x5716f2b8, + 0xb03ada37, 0xf0500c0d, 0xf01c1f04, 0x0200b3ff, + 0xae0cf51a, 0x3cb574b2, 0x25837a58, 0xdc0921bd, + 0xd19113f9, 0x7ca92ff6, 0x94324773, 0x22f54701, + 0x3ae5e581, 0x37c2dadc, 0xc8b57634, 0x9af3dda7, + 0xa9446146, 0x0fd0030e, 0xecc8c73e, 0xa4751e41, + 0xe238cd99, 0x3bea0e2f, 0x3280bba1, 0x183eb331, + 0x4e548b38, 0x4f6db908, 0x6f420d03, 0xf60a04bf, + 0x2cb81290, 0x24977c79, 0x5679b072, 0xbcaf89af, + 0xde9a771f, 0xd9930810, 0xb38bae12, 0xdccf3f2e, + 0x5512721f, 0x2e6b7124, 0x501adde6, 0x9f84cd87, + 0x7a584718, 0x7408da17, 0xbc9f9abc, 0xe94b7d8c, + 0xec7aec3a, 0xdb851dfa, 0x63094366, 0xc464c3d2, + 0xef1c1847, 0x3215d908, 0xdd433b37, 0x24c2ba16, + 0x12a14d43, 0x2a65c451, 0x50940002, 0x133ae4dd, + 0x71dff89e, 0x10314e55, 0x81ac77d6, 0x5f11199b, + 0x043556f1, 0xd7a3c76b, 0x3c11183b, 0x5924a509, + 0xf28fe6ed, 0x97f1fbfa, 0x9ebabf2c, 0x1e153c6e, + 0x86e34570, 0xeae96fb1, 0x860e5e0a, 0x5a3e2ab3, + 0x771fe71c, 0x4e3d06fa, 0x2965dcb9, 0x99e71d0f, + 0x803e89d6, 0x5266c825, 0x2e4cc978, 0x9c10b36a, + 0xc6150eba, 0x94e2ea78, 0xa5fc3c53, 0x1e0a2df4, + 0xf2f74ea7, 0x361d2b3d, 0x1939260f, 0x19c27960, + 0x5223a708, 0xf71312b6, 0xebadfe6e, 0xeac31f66, + 0xe3bc4595, 0xa67bc883, 0xb17f37d1, 0x018cff28, + 0xc332ddef, 0xbe6c5aa5, 0x65582185, 0x68ab9802, + 0xeecea50f, 0xdb2f953b, 0x2aef7dad, 0x5b6e2f84, + 0x1521b628, 0x29076170, 0xecdd4775, 0x619f1510, + 0x13cca830, 0xeb61bd96, 0x0334fe1e, 0xaa0363cf, + 0xb5735c90, 0x4c70a239, 0xd59e9e0b, 0xcbaade14, + 0xeecc86bc, 0x60622ca7, 0x9cab5cab, 0xb2f3846e, + 0x648b1eaf, 0x19bdf0ca, 0xa02369b9, 0x655abb50, + 0x40685a32, 0x3c2ab4b3, 0x319ee9d5, 0xc021b8f7, + 0x9b540b19, 0x875fa099, 0x95f7997e, 0x623d7da8, + 0xf837889a, 0x97e32d77, 0x11ed935f, 0x16681281, + 0x0e358829, 0xc7e61fd6, 0x96dedfa1, 0x7858ba99, + 0x57f584a5, 0x1b227263, 0x9b83c3ff, 0x1ac24696, + 0xcdb30aeb, 0x532e3054, 0x8fd948e4, 0x6dbc3128, + 0x58ebf2ef, 0x34c6ffea, 0xfe28ed61, 0xee7c3c73, + 0x5d4a14d9, 0xe864b7e3, 0x42105d14, 0x203e13e0, + 0x45eee2b6, 0xa3aaabea, 0xdb6c4f15, 0xfacb4fd0, + 0xc742f442, 0xef6abbb5, 0x654f3b1d, 0x41cd2105, + 0xd81e799e, 0x86854dc7, 0xe44b476a, 0x3d816250, + 0xcf62a1f2, 0x5b8d2646, 0xfc8883a0, 0xc1c7b6a3, + 0x7f1524c3, 0x69cb7492, 0x47848a0b, 0x5692b285, + 0x095bbf00, 0xad19489d, 0x1462b174, 0x23820e00, + 0x58428d2a, 0x0c55f5ea, 0x1dadf43e, 0x233f7061, + 0x3372f092, 0x8d937e41, 0xd65fecf1, 0x6c223bdb, + 0x7cde3759, 0xcbee7460, 0x4085f2a7, 0xce77326e, + 0xa6078084, 0x19f8509e, 0xe8efd855, 0x61d99735, + 0xa969a7aa, 0xc50c06c2, 0x5a04abfc, 0x800bcadc, + 0x9e447a2e, 0xc3453484, 0xfdd56705, 0x0e1e9ec9, + 0xdb73dbd3, 0x105588cd, 0x675fda79, 0xe3674340, + 0xc5c43465, 0x713e38d8, 0x3d28f89e, 0xf16dff20, + 0x153e21e7, 0x8fb03d4a, 0xe6e39f2b, 0xdb83adf7 +}; + +__constant u32 c_sbox2[256] = +{ + 0xe93d5a68, 0x948140f7, 0xf64c261c, 0x94692934, + 0x411520f7, 0x7602d4f7, 0xbcf46b2e, 0xd4a20068, + 0xd4082471, 0x3320f46a, 0x43b7d4b7, 0x500061af, + 0x1e39f62e, 0x97244546, 0x14214f74, 0xbf8b8840, + 0x4d95fc1d, 0x96b591af, 0x70f4ddd3, 0x66a02f45, + 0xbfbc09ec, 0x03bd9785, 0x7fac6dd0, 0x31cb8504, + 0x96eb27b3, 0x55fd3941, 0xda2547e6, 0xabca0a9a, + 0x28507825, 0x530429f4, 0x0a2c86da, 0xe9b66dfb, + 0x68dc1462, 0xd7486900, 0x680ec0a4, 0x27a18dee, + 0x4f3ffea2, 0xe887ad8c, 0xb58ce006, 0x7af4d6b6, + 0xaace1e7c, 0xd3375fec, 0xce78a399, 0x406b2a42, + 0x20fe9e35, 0xd9f385b9, 0xee39d7ab, 0x3b124e8b, + 0x1dc9faf7, 0x4b6d1856, 0x26a36631, 0xeae397b2, + 0x3a6efa74, 0xdd5b4332, 0x6841e7f7, 0xca7820fb, + 0xfb0af54e, 0xd8feb397, 0x454056ac, 0xba489527, + 0x55533a3a, 0x20838d87, 0xfe6ba9b7, 0xd096954b, + 0x55a867bc, 0xa1159a58, 0xcca92963, 0x99e1db33, + 0xa62a4a56, 0x3f3125f9, 0x5ef47e1c, 0x9029317c, + 0xfdf8e802, 0x04272f70, 0x80bb155c, 0x05282ce3, + 0x95c11548, 0xe4c66d22, 0x48c1133f, 0xc70f86dc, + 0x07f9c9ee, 0x41041f0f, 0x404779a4, 0x5d886e17, + 0x325f51eb, 0xd59bc0d1, 0xf2bcc18f, 0x41113564, + 0x257b7834, 0x602a9c60, 0xdff8e8a3, 0x1f636c1b, + 0x0e12b4c2, 0x02e1329e, 0xaf664fd1, 0xcad18115, + 0x6b2395e0, 0x333e92e1, 0x3b240b62, 0xeebeb922, + 0x85b2a20e, 0xe6ba0d99, 0xde720c8c, 0x2da2f728, + 0xd0127845, 0x95b794fd, 0x647d0862, 0xe7ccf5f0, + 0x5449a36f, 0x877d48fa, 0xc39dfd27, 0xf33e8d1e, + 0x0a476341, 0x992eff74, 0x3a6f6eab, 0xf4f8fd37, + 0xa812dc60, 0xa1ebddf8, 0x991be14c, 0xdb6e6b0d, + 0xc67b5510, 0x6d672c37, 0x2765d43b, 0xdcd0e804, + 0xf1290dc7, 0xcc00ffa3, 0xb5390f92, 0x690fed0b, + 0x667b9ffb, 0xcedb7d9c, 0xa091cf0b, 0xd9155ea3, + 0xbb132f88, 0x515bad24, 0x7b9479bf, 0x763bd6eb, + 0x37392eb3, 0xcc115979, 0x8026e297, 0xf42e312d, + 0x6842ada7, 0xc66a2b3b, 0x12754ccc, 0x782ef11c, + 0x6a124237, 0xb79251e7, 0x06a1bbe6, 0x4bfb6350, + 0x1a6b1018, 0x11caedfa, 0x3d25bdd8, 0xe2e1c3c9, + 0x44421659, 0x0a121386, 0xd90cec6e, 0xd5abea2a, + 0x64af674e, 0xda86a85f, 0xbebfe988, 0x64e4c3fe, + 0x9dbc8057, 0xf0f7c086, 0x60787bf8, 0x6003604d, + 0xd1fd8346, 0xf6381fb0, 0x7745ae04, 0xd736fccc, + 0x83426b33, 0xf01eab71, 0xb0804187, 0x3c005e5f, + 0x77a057be, 0xbde8ae24, 0x55464299, 0xbf582e61, + 0x4e58f48f, 0xf2ddfda2, 0xf474ef38, 0x8789bdc2, + 0x5366f9c3, 0xc8b38e74, 0xb475f255, 0x46fcd9b9, + 0x7aeb2661, 0x8b1ddf84, 0x846a0e79, 0x915f95e2, + 0x466e598e, 0x20b45770, 0x8cd55591, 0xc902de4c, + 0xb90bace1, 0xbb8205d0, 0x11a86248, 0x7574a99e, + 0xb77f19b6, 0xe0a9dc09, 0x662d09a1, 0xc4324633, + 0xe85a1f02, 0x09f0be8c, 0x4a99a025, 0x1d6efe10, + 0x1ab93d1d, 0x0ba5a4df, 0xa186f20f, 0x2868f169, + 0xdcb7da83, 0x573906fe, 0xa1e2ce9b, 0x4fcd7f52, + 0x50115e01, 0xa70683fa, 0xa002b5c4, 0x0de6d027, + 0x9af88c27, 0x773f8641, 0xc3604c06, 0x61a806b5, + 0xf0177a28, 0xc0f586e0, 0x006058aa, 0x30dc7d62, + 0x11e69ed7, 0x2338ea63, 0x53c2dd94, 0xc2c21634, + 0xbbcbee56, 0x90bcb6de, 0xebfc7da1, 0xce591d76, + 0x6f05e409, 0x4b7c0188, 0x39720a3d, 0x7c927c24, + 0x86e3725f, 0x724d9db9, 0x1ac15bb4, 0xd39eb8fc, + 0xed545578, 0x08fca5b5, 0xd83d7cd3, 0x4dad0fc4, + 0x1e50ef5e, 0xb161e6f8, 0xa28514d9, 0x6c51133c, + 0x6fd5c7e7, 0x56e14ec4, 0x362abfce, 0xddc6c837, + 0xd79a3234, 0x92638212, 0x670efa8e, 0x406000e0 +}; + +__constant u32 c_sbox3[256] = +{ + 0x3a39ce37, 0xd3faf5cf, 0xabc27737, 0x5ac52d1b, + 0x5cb0679e, 0x4fa33742, 0xd3822740, 0x99bc9bbe, + 0xd5118e9d, 0xbf0f7315, 0xd62d1c7e, 0xc700c47b, + 0xb78c1b6b, 0x21a19045, 0xb26eb1be, 0x6a366eb4, + 0x5748ab2f, 0xbc946e79, 0xc6a376d2, 0x6549c2c8, + 0x530ff8ee, 0x468dde7d, 0xd5730a1d, 0x4cd04dc6, + 0x2939bbdb, 0xa9ba4650, 0xac9526e8, 0xbe5ee304, + 0xa1fad5f0, 0x6a2d519a, 0x63ef8ce2, 0x9a86ee22, + 0xc089c2b8, 0x43242ef6, 0xa51e03aa, 0x9cf2d0a4, + 0x83c061ba, 0x9be96a4d, 0x8fe51550, 0xba645bd6, + 0x2826a2f9, 0xa73a3ae1, 0x4ba99586, 0xef5562e9, + 0xc72fefd3, 0xf752f7da, 0x3f046f69, 0x77fa0a59, + 0x80e4a915, 0x87b08601, 0x9b09e6ad, 0x3b3ee593, + 0xe990fd5a, 0x9e34d797, 0x2cf0b7d9, 0x022b8b51, + 0x96d5ac3a, 0x017da67d, 0xd1cf3ed6, 0x7c7d2d28, + 0x1f9f25cf, 0xadf2b89b, 0x5ad6b472, 0x5a88f54c, + 0xe029ac71, 0xe019a5e6, 0x47b0acfd, 0xed93fa9b, + 0xe8d3c48d, 0x283b57cc, 0xf8d56629, 0x79132e28, + 0x785f0191, 0xed756055, 0xf7960e44, 0xe3d35e8c, + 0x15056dd4, 0x88f46dba, 0x03a16125, 0x0564f0bd, + 0xc3eb9e15, 0x3c9057a2, 0x97271aec, 0xa93a072a, + 0x1b3f6d9b, 0x1e6321f5, 0xf59c66fb, 0x26dcf319, + 0x7533d928, 0xb155fdf5, 0x03563482, 0x8aba3cbb, + 0x28517711, 0xc20ad9f8, 0xabcc5167, 0xccad925f, + 0x4de81751, 0x3830dc8e, 0x379d5862, 0x9320f991, + 0xea7a90c2, 0xfb3e7bce, 0x5121ce64, 0x774fbe32, + 0xa8b6e37e, 0xc3293d46, 0x48de5369, 0x6413e680, + 0xa2ae0810, 0xdd6db224, 0x69852dfd, 0x09072166, + 0xb39a460a, 0x6445c0dd, 0x586cdecf, 0x1c20c8ae, + 0x5bbef7dd, 0x1b588d40, 0xccd2017f, 0x6bb4e3bb, + 0xdda26a7e, 0x3a59ff45, 0x3e350a44, 0xbcb4cdd5, + 0x72eacea8, 0xfa6484bb, 0x8d6612ae, 0xbf3c6f47, + 0xd29be463, 0x542f5d9e, 0xaec2771b, 0xf64e6370, + 0x740e0d8d, 0xe75b1357, 0xf8721671, 0xaf537d5d, + 0x4040cb08, 0x4eb4e2cc, 0x34d2466a, 0x0115af84, + 0xe1b00428, 0x95983a1d, 0x06b89fb4, 0xce6ea048, + 0x6f3f3b82, 0x3520ab82, 0x011a1d4b, 0x277227f8, + 0x611560b1, 0xe7933fdc, 0xbb3a792b, 0x344525bd, + 0xa08839e1, 0x51ce794b, 0x2f32c9b7, 0xa01fbac9, + 0xe01cc87e, 0xbcc7d1f6, 0xcf0111c3, 0xa1e8aac7, + 0x1a908749, 0xd44fbd9a, 0xd0dadecb, 0xd50ada38, + 0x0339c32a, 0xc6913667, 0x8df9317c, 0xe0b12b4f, + 0xf79e59b7, 0x43f5bb3a, 0xf2d519ff, 0x27d9459c, + 0xbf97222c, 0x15e6fc2a, 0x0f91fc71, 0x9b941525, + 0xfae59361, 0xceb69ceb, 0xc2a86459, 0x12baa8d1, + 0xb6c1075e, 0xe3056a0c, 0x10d25065, 0xcb03a442, + 0xe0ec6e0e, 0x1698db3b, 0x4c98a0be, 0x3278e964, + 0x9f1f9532, 0xe0d392df, 0xd3a0342b, 0x8971f21e, + 0x1b0a7441, 0x4ba3348c, 0xc5be7120, 0xc37632d8, + 0xdf359f8d, 0x9b992f2e, 0xe60b6f47, 0x0fe3f11d, + 0xe54cda54, 0x1edad891, 0xce6279cf, 0xcd3e7e6f, + 0x1618b166, 0xfd2c1d05, 0x848fd2c5, 0xf6fb2299, + 0xf523f357, 0xa6327623, 0x93a83531, 0x56cccd02, + 0xacf08162, 0x5a75ebb5, 0x6e163697, 0x88d273cc, + 0xde966292, 0x81b949d0, 0x4c50901b, 0x71c65614, + 0xe6c6c7bd, 0x327a140a, 0x45e1d006, 0xc3f27b9a, + 0xc9aa53fd, 0x62a80f00, 0xbb25bfe2, 0x35bdd2f6, + 0x71126905, 0xb2040222, 0xb6cbcf7c, 0xcd769c2b, + 0x53113ec0, 0x1640e3d3, 0x38abbd60, 0x2547adf0, + 0xba38209c, 0xf746ce76, 0x77afa1c5, 0x20756060, + 0x85cbfe4e, 0x8ae88dd8, 0x7aaaf9b0, 0x4cf9aa7e, + 0x1948c25c, 0x02fb8a8c, 0x01c36ae4, 0xd6ebe1f9, + 0x90d4f869, 0xa65cdea0, 0x3f09252d, 0xc208e69f, + 0xb74e6132, 0xce77e25b, 0x578fdfe3, 0x3ac372e6 +}; + +__constant u32 c_pbox[18] = +{ + 0x243f6a88, 0x85a308d3, 0x13198a2e, 0x03707344, + 0xa4093822, 0x299f31d0, 0x082efa98, 0xec4e6c89, + 0x452821e6, 0x38d01377, 0xbe5466cf, 0x34e90c6c, + 0xc0ac29b7, 0xc97c50dd, 0x3f84d5b5, 0xb5470917, + 0x9216d5d9, 0x8979fb1b +}; + +#define BF_ROUND(L,R,N) \ +{ \ + uchar4 c = as_uchar4 ((L)); \ + \ + u32x tmp; \ + \ + tmp = S0[c.s3]; \ + tmp += S1[c.s2]; \ + tmp ^= S2[c.s1]; \ + tmp += S3[c.s0]; \ + \ + (R) ^= tmp ^ P[(N)]; \ +} + +#define BF_ENCRYPT(L,R) \ +{ \ + L ^= P[0]; \ + \ + BF_ROUND (L, R, 1); \ + BF_ROUND (R, L, 2); \ + BF_ROUND (L, R, 3); \ + BF_ROUND (R, L, 4); \ + BF_ROUND (L, R, 5); \ + BF_ROUND (R, L, 6); \ + BF_ROUND (L, R, 7); \ + BF_ROUND (R, L, 8); \ + BF_ROUND (L, R, 9); \ + BF_ROUND (R, L, 10); \ + BF_ROUND (L, R, 11); \ + BF_ROUND (R, L, 12); \ + BF_ROUND (L, R, 13); \ + BF_ROUND (R, L, 14); \ + BF_ROUND (L, R, 15); \ + BF_ROUND (R, L, 16); \ + \ + u32x tmp; \ + \ + tmp = R; \ + R = L; \ + L = tmp; \ + \ + L ^= P[17]; \ +} + +static void sha1_transform (const u32x w0[4], const u32x w1[4], const u32x w2[4], const u32x w3[4], u32x digest[5]) +{ + u32x A = digest[0]; + u32x B = digest[1]; + u32x C = digest[2]; + u32x D = digest[3]; + u32x E = digest[4]; + + u32x w0_t = w0[0]; + u32x w1_t = w0[1]; + u32x w2_t = w0[2]; + u32x w3_t = w0[3]; + u32x w4_t = w1[0]; + u32x w5_t = w1[1]; + u32x w6_t = w1[2]; + u32x w7_t = w1[3]; + u32x w8_t = w2[0]; + u32x w9_t = w2[1]; + u32x wa_t = w2[2]; + u32x wb_t = w2[3]; + u32x wc_t = w3[0]; + u32x wd_t = w3[1]; + u32x we_t = w3[2]; + u32x wf_t = w3[3]; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, A, B, C, D, E, w0_t); + SHA1_STEP (SHA1_F0o, E, A, B, C, D, w1_t); + SHA1_STEP (SHA1_F0o, D, E, A, B, C, w2_t); + SHA1_STEP (SHA1_F0o, C, D, E, A, B, w3_t); + SHA1_STEP (SHA1_F0o, B, C, D, E, A, w4_t); + SHA1_STEP (SHA1_F0o, A, B, C, D, E, w5_t); + SHA1_STEP (SHA1_F0o, E, A, B, C, D, w6_t); + SHA1_STEP (SHA1_F0o, D, E, A, B, C, w7_t); + SHA1_STEP (SHA1_F0o, C, D, E, A, B, w8_t); + SHA1_STEP (SHA1_F0o, B, C, D, E, A, w9_t); + SHA1_STEP (SHA1_F0o, A, B, C, D, E, wa_t); + SHA1_STEP (SHA1_F0o, E, A, B, C, D, wb_t); + SHA1_STEP (SHA1_F0o, D, E, A, B, C, wc_t); + SHA1_STEP (SHA1_F0o, C, D, E, A, B, wd_t); + SHA1_STEP (SHA1_F0o, B, C, D, E, A, we_t); + SHA1_STEP (SHA1_F0o, A, B, C, D, E, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F0o, E, A, B, C, D, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F0o, D, E, A, B, C, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F0o, C, D, E, A, B, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F0o, B, C, D, E, A, w3_t); + + #undef K + #define K SHA1C01 + + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w7_t); + + #undef K + #define K SHA1C02 + + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, wb_t); + + #undef K + #define K SHA1C03 + + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, wf_t); + + digest[0] += A; + digest[1] += B; + digest[2] += C; + digest[3] += D; + digest[4] += E; +} + +__kernel void __attribute__((reqd_work_group_size (8, 1, 1))) m09000_init (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global pwsafe2_tmp_t *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 lid = get_local_id (0); + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = pws[gid].i[ 8]; + w2[1] = pws[gid].i[ 9]; + w2[2] = pws[gid].i[10]; + w2[3] = pws[gid].i[11]; + + u32x w3[4]; + + w3[0] = pws[gid].i[12]; + w3[1] = pws[gid].i[13]; + w3[2] = pws[gid].i[14]; + w3[3] = pws[gid].i[15]; + + const u32 pw_len = pws[gid].pw_len; + + append_0x80_4 (w0, w1, w2, w3, pw_len); + + /** + * salt + */ + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + u32 salt_buf[2]; + + salt_buf[0] = salt_bufs[salt_pos].salt_buf[0]; + salt_buf[1] = salt_bufs[salt_pos].salt_buf[1]; + + /** + * initial sha1 + */ + + w3[1] = w2[3] << 16 | w2[2] >> 16; + w3[0] = w2[2] << 16 | w2[1] >> 16; + w2[3] = w2[1] << 16 | w2[0] >> 16; + w2[2] = w2[0] << 16 | w1[3] >> 16; + w2[1] = w1[3] << 16 | w1[2] >> 16; + w2[0] = w1[2] << 16 | w1[1] >> 16; + w1[3] = w1[1] << 16 | w1[0] >> 16; + w1[2] = w1[0] << 16 | w0[3] >> 16; + w1[1] = w0[3] << 16 | w0[2] >> 16; + w1[0] = w0[2] << 16 | w0[1] >> 16; + w0[3] = w0[1] << 16 | w0[0] >> 16; + w0[2] = w0[0] << 16; + w0[1] = salt_buf[1]; + w0[0] = salt_buf[0]; + + w0[0] = swap_workaround (w0[0]); + w0[1] = swap_workaround (w0[1]); + w0[2] = swap_workaround (w0[2]); + w0[3] = swap_workaround (w0[3]); + w1[0] = swap_workaround (w1[0]); + w1[1] = swap_workaround (w1[1]); + w1[2] = swap_workaround (w1[2]); + w1[3] = swap_workaround (w1[3]); + w2[0] = swap_workaround (w2[0]); + w2[1] = swap_workaround (w2[1]); + w2[2] = swap_workaround (w2[2]); + w2[3] = swap_workaround (w2[3]); + w3[0] = swap_workaround (w3[0]); + w3[1] = swap_workaround (w3[1]); + + const u32 block_len = salt_len + 2 + pw_len; + + w3[2] = 0; + w3[3] = block_len * 8; + + u32x digest[5]; + + digest[0] = SHA1M_A; + digest[1] = SHA1M_B; + digest[2] = SHA1M_C; + digest[3] = SHA1M_D; + digest[4] = SHA1M_E; + + sha1_transform (w0, w1, w2, w3, digest); + + /** + * blowfish setkey + */ + + u32 P[18]; + + for (u32 i = 0; i < 18; i++) + { + P[i] = c_pbox[i]; + } + + __local u32x S0_all[8][256]; + __local u32x S1_all[8][256]; + __local u32x S2_all[8][256]; + __local u32x S3_all[8][256]; + + __local u32x *S0 = S0_all[lid]; + __local u32x *S1 = S1_all[lid]; + __local u32x *S2 = S2_all[lid]; + __local u32x *S3 = S3_all[lid]; + + for (u32 i = 0; i < 256; i++) + { + S0[i] = c_sbox0[i]; + S1[i] = c_sbox1[i]; + S2[i] = c_sbox2[i]; + S3[i] = c_sbox3[i]; + } + + for (u32 i = 0; i < 18; i++) + { + P[i] ^= digest[i % 5]; + } + + u32 L0 = 0; + u32 R0 = 0; + + for (u32 i = 0; i < 18; i += 2) + { + BF_ENCRYPT (L0, R0); + + P[i + 0] = L0; + P[i + 1] = R0; + } + + for (u32 i = 0; i < 256; i += 4) + { + BF_ENCRYPT (L0, R0); + + S0[i + 0] = L0; + S0[i + 1] = R0; + + BF_ENCRYPT (L0, R0); + + S0[i + 2] = L0; + S0[i + 3] = R0; + } + + for (u32 i = 0; i < 256; i += 4) + { + BF_ENCRYPT (L0, R0); + + S1[i + 0] = L0; + S1[i + 1] = R0; + + BF_ENCRYPT (L0, R0); + + S1[i + 2] = L0; + S1[i + 3] = R0; + } + + for (u32 i = 0; i < 256; i += 4) + { + BF_ENCRYPT (L0, R0); + + S2[i + 0] = L0; + S2[i + 1] = R0; + + BF_ENCRYPT (L0, R0); + + S2[i + 2] = L0; + S2[i + 3] = R0; + } + + for (u32 i = 0; i < 256; i += 4) + { + BF_ENCRYPT (L0, R0); + + S3[i + 0] = L0; + S3[i + 1] = R0; + + BF_ENCRYPT (L0, R0); + + S3[i + 2] = L0; + S3[i + 3] = R0; + } + + // store + + tmps[gid].digest[0] = salt_buf[0]; + tmps[gid].digest[1] = salt_buf[1]; + + for (u32 i = 0; i < 18; i++) + { + tmps[gid].P[i] = P[i]; + } + + for (u32 i = 0; i < 256; i++) + { + tmps[gid].S0[i] = S0[i]; + tmps[gid].S1[i] = S1[i]; + tmps[gid].S2[i] = S2[i]; + tmps[gid].S3[i] = S3[i]; + } +} + +__kernel void __attribute__((reqd_work_group_size (8, 1, 1))) m09000_loop (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global pwsafe2_tmp_t *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + const u32 lid = get_local_id (0); + + // load + + u32 digest[2]; + + digest[0] = tmps[gid].digest[0]; + digest[1] = tmps[gid].digest[1]; + + u32x P[18]; + + for (u32 i = 0; i < 18; i++) + { + P[i] = tmps[gid].P[i]; + } + + __local u32x S0_all[8][256]; + __local u32x S1_all[8][256]; + __local u32x S2_all[8][256]; + __local u32x S3_all[8][256]; + + __local u32x *S0 = S0_all[lid]; + __local u32x *S1 = S1_all[lid]; + __local u32x *S2 = S2_all[lid]; + __local u32x *S3 = S3_all[lid]; + + for (u32 i = 0; i < 256; i++) + { + S0[i] = tmps[gid].S0[i]; + S1[i] = tmps[gid].S1[i]; + S2[i] = tmps[gid].S2[i]; + S3[i] = tmps[gid].S3[i]; + } + + // loop + + u32x L0 = digest[0]; + u32x R0 = digest[1]; + + for (u32 i = 0; i < loop_cnt; i++) + { + BF_ENCRYPT (L0, R0); + } + + // store + + tmps[gid].digest[0] = L0; + tmps[gid].digest[1] = R0; +} + +__kernel void __attribute__((reqd_work_group_size (8, 1, 1))) m09000_comp (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global pwsafe2_tmp_t *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + const u32 lid = get_local_id (0); + + // load + + u32 digest[2]; + + digest[0] = tmps[gid].digest[0]; + digest[1] = tmps[gid].digest[1]; + + // final sha1 + + u32x w0[4]; + u32x w1[4]; + u32x w2[4]; + u32x w3[4]; + + w0[0] = swap_workaround (digest[0]); + w0[1] = swap_workaround (digest[1]); + w0[2] = 0x00008000; + w0[3] = 0; + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = (8 + 2) * 8; + + u32x out[5]; + + out[0] = 0; // yep, not a bug! context is zero here + out[1] = 0; + out[2] = 0; + out[3] = 0; + out[4] = 0; + + sha1_transform (w0, w1, w2, w3, out); + + const u32x r0 = out[0]; + const u32x r1 = out[1]; + const u32x r2 = out[2]; + const u32x r3 = out[3]; + + #define il_pos 0 + + #include VECT_COMPARE_M +} diff --git a/amd/m09100.cl b/amd/m09100.cl new file mode 100644 index 0000000000..f24ba90bde --- /dev/null +++ b/amd/m09100.cl @@ -0,0 +1,1182 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _LOTUS8_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW4 +#define VECT_SIZE1 +#endif + +#ifdef VLIW5 +#define VECT_SIZE1 +#endif + +#define DGST_R0 0 +#define DGST_R1 1 +#define DGST_R2 2 +#define DGST_R3 3 + +#include "include/kernel_functions.c" + +#undef _SHA1_ + +#include "types_amd.c" +#include "common_amd.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +__constant char lotus64_table[] = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz+/"; + +__constant u32 lotus_magic_table[256] = +{ + 0xbd, 0x56, 0xea, 0xf2, 0xa2, 0xf1, 0xac, 0x2a, + 0xb0, 0x93, 0xd1, 0x9c, 0x1b, 0x33, 0xfd, 0xd0, + 0x30, 0x04, 0xb6, 0xdc, 0x7d, 0xdf, 0x32, 0x4b, + 0xf7, 0xcb, 0x45, 0x9b, 0x31, 0xbb, 0x21, 0x5a, + 0x41, 0x9f, 0xe1, 0xd9, 0x4a, 0x4d, 0x9e, 0xda, + 0xa0, 0x68, 0x2c, 0xc3, 0x27, 0x5f, 0x80, 0x36, + 0x3e, 0xee, 0xfb, 0x95, 0x1a, 0xfe, 0xce, 0xa8, + 0x34, 0xa9, 0x13, 0xf0, 0xa6, 0x3f, 0xd8, 0x0c, + 0x78, 0x24, 0xaf, 0x23, 0x52, 0xc1, 0x67, 0x17, + 0xf5, 0x66, 0x90, 0xe7, 0xe8, 0x07, 0xb8, 0x60, + 0x48, 0xe6, 0x1e, 0x53, 0xf3, 0x92, 0xa4, 0x72, + 0x8c, 0x08, 0x15, 0x6e, 0x86, 0x00, 0x84, 0xfa, + 0xf4, 0x7f, 0x8a, 0x42, 0x19, 0xf6, 0xdb, 0xcd, + 0x14, 0x8d, 0x50, 0x12, 0xba, 0x3c, 0x06, 0x4e, + 0xec, 0xb3, 0x35, 0x11, 0xa1, 0x88, 0x8e, 0x2b, + 0x94, 0x99, 0xb7, 0x71, 0x74, 0xd3, 0xe4, 0xbf, + 0x3a, 0xde, 0x96, 0x0e, 0xbc, 0x0a, 0xed, 0x77, + 0xfc, 0x37, 0x6b, 0x03, 0x79, 0x89, 0x62, 0xc6, + 0xd7, 0xc0, 0xd2, 0x7c, 0x6a, 0x8b, 0x22, 0xa3, + 0x5b, 0x05, 0x5d, 0x02, 0x75, 0xd5, 0x61, 0xe3, + 0x18, 0x8f, 0x55, 0x51, 0xad, 0x1f, 0x0b, 0x5e, + 0x85, 0xe5, 0xc2, 0x57, 0x63, 0xca, 0x3d, 0x6c, + 0xb4, 0xc5, 0xcc, 0x70, 0xb2, 0x91, 0x59, 0x0d, + 0x47, 0x20, 0xc8, 0x4f, 0x58, 0xe0, 0x01, 0xe2, + 0x16, 0x38, 0xc4, 0x6f, 0x3b, 0x0f, 0x65, 0x46, + 0xbe, 0x7e, 0x2d, 0x7b, 0x82, 0xf9, 0x40, 0xb5, + 0x1d, 0x73, 0xf8, 0xeb, 0x26, 0xc7, 0x87, 0x97, + 0x25, 0x54, 0xb1, 0x28, 0xaa, 0x98, 0x9d, 0xa5, + 0x64, 0x6d, 0x7a, 0xd4, 0x10, 0x81, 0x44, 0xef, + 0x49, 0xd6, 0xae, 0x2e, 0xdd, 0x76, 0x5c, 0x2f, + 0xa7, 0x1c, 0xc9, 0x09, 0x69, 0x9a, 0x83, 0xcf, + 0x29, 0x39, 0xb9, 0xe9, 0x4c, 0xff, 0x43, 0xab, +}; + +#ifdef VECT_SIZE1 +#define BOX(S,i) u32x ((S)[(i)]) +#endif + +#ifdef VECT_SIZE2 +#define BOX(S,i) u32x ((S)[(i).s0], (S)[(i).s1]) +#endif + +#ifdef VECT_SIZE4 +#define BOX(S,i) u32x ((S)[(i).s0], (S)[(i).s1], (S)[(i).s2], (S)[(i).s3]) +#endif + +#ifdef VECT_SIZE1 +#define uint_to_hex_upper8(i) u32x (l_bin2asc[(i)]) +#endif + +#ifdef VECT_SIZE2 +#define uint_to_hex_upper8(i) u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1]) +#endif + +#ifdef VECT_SIZE4 +#define uint_to_hex_upper8(i) u32x (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3]) +#endif + +static void lotus_mix (u32x *in, __local u32 s_lotus_magic_table[256]) +{ + u32x p = 0; + + for (int i = 0; i < 18; i++) + { + u32 s = 48; + + #pragma unroll 12 + for (int j = 0; j < 12; j++) + { + u32x tmp_in = in[j]; + u32x tmp_out = 0; + + p = (p + s--) & 0xff; p = ((tmp_in >> 0) & 0xff) ^ BOX (s_lotus_magic_table, p); tmp_out |= p << 0; + p = (p + s--) & 0xff; p = ((tmp_in >> 8) & 0xff) ^ BOX (s_lotus_magic_table, p); tmp_out |= p << 8; + p = (p + s--) & 0xff; p = ((tmp_in >> 16) & 0xff) ^ BOX (s_lotus_magic_table, p); tmp_out |= p << 16; + p = (p + s--) & 0xff; p = ((tmp_in >> 24) & 0xff) ^ BOX (s_lotus_magic_table, p); tmp_out |= p << 24; + + in[j] = tmp_out; + } + } +} + +static void lotus_transform_password (u32x *in, u32x *out, __local u32 s_lotus_magic_table[256]) +{ + u32x t = out[3] >> 24; + + u32x c; + + #pragma unroll 4 + for (int i = 0; i < 4; i++) + { + t ^= (in[i] >> 0) & 0xff; c = BOX (s_lotus_magic_table, t); out[i] ^= c << 0; t = ((out[i] >> 0) & 0xff); + t ^= (in[i] >> 8) & 0xff; c = BOX (s_lotus_magic_table, t); out[i] ^= c << 8; t = ((out[i] >> 8) & 0xff); + t ^= (in[i] >> 16) & 0xff; c = BOX (s_lotus_magic_table, t); out[i] ^= c << 16; t = ((out[i] >> 16) & 0xff); + t ^= (in[i] >> 24) & 0xff; c = BOX (s_lotus_magic_table, t); out[i] ^= c << 24; t = ((out[i] >> 24) & 0xff); + } +} + +static void pad (u32x w[4], const u32 len) +{ + const u32 val = 16 - len; + + const u32 mask1 = val << 24; + + const u32 mask2 = val << 16 + | val << 24; + + const u32 mask3 = val << 8 + | val << 16 + | val << 24; + + const u32 mask4 = val << 0 + | val << 8 + | val << 16 + | val << 24; + + switch (len) + { + case 0: w[0] = mask4; + w[1] = mask4; + w[2] = mask4; + w[3] = mask4; + break; + case 1: w[0] |= mask3; + w[1] = mask4; + w[2] = mask4; + w[3] = mask4; + break; + case 2: w[0] |= mask2; + w[1] = mask4; + w[2] = mask4; + w[3] = mask4; + break; + case 3: w[0] |= mask1; + w[1] = mask4; + w[2] = mask4; + w[3] = mask4; + break; + case 4: w[1] = mask4; + w[2] = mask4; + w[3] = mask4; + break; + case 5: w[1] |= mask3; + w[2] = mask4; + w[3] = mask4; + break; + case 6: w[1] |= mask2; + w[2] = mask4; + w[3] = mask4; + break; + case 7: w[1] |= mask1; + w[2] = mask4; + w[3] = mask4; + break; + case 8: w[2] = mask4; + w[3] = mask4; + break; + case 9: w[2] |= mask3; + w[3] = mask4; + break; + case 10: w[2] |= mask2; + w[3] = mask4; + break; + case 11: w[2] |= mask1; + w[3] = mask4; + break; + case 12: w[3] = mask4; + break; + case 13: w[3] |= mask3; + break; + case 14: w[3] |= mask2; + break; + case 15: w[3] |= mask1; + break; + } +} + +static void mdtransform_norecalc (u32x state[4], u32x block[4], __local u32 s_lotus_magic_table[256]) +{ + u32x x[12]; + + x[ 0] = state[0]; + x[ 1] = state[1]; + x[ 2] = state[2]; + x[ 3] = state[3]; + x[ 4] = block[0]; + x[ 5] = block[1]; + x[ 6] = block[2]; + x[ 7] = block[3]; + x[ 8] = state[0] ^ block[0]; + x[ 9] = state[1] ^ block[1]; + x[10] = state[2] ^ block[2]; + x[11] = state[3] ^ block[3]; + + lotus_mix (x, s_lotus_magic_table); + + state[0] = x[0]; + state[1] = x[1]; + state[2] = x[2]; + state[3] = x[3]; +} + +static void mdtransform (u32x state[4], u32x checksum[4], u32x block[4], __local u32 s_lotus_magic_table[256]) +{ + mdtransform_norecalc (state, block, s_lotus_magic_table); + + lotus_transform_password (block, checksum, s_lotus_magic_table); +} + +static void domino_big_md (const u32x saved_key[16], const u32 size, u32x state[4], __local u32 s_lotus_magic_table[256]) +{ + u32x checksum[4]; + + checksum[0] = 0; + checksum[1] = 0; + checksum[2] = 0; + checksum[3] = 0; + + u32x block[4]; + + block[0] = 0; + block[1] = 0; + block[2] = 0; + block[3] = 0; + + u32 curpos; + u32 idx; + + for (curpos = 0, idx = 0; curpos + 16 < size; curpos += 16, idx += 4) + { + block[0] = saved_key[idx + 0]; + block[1] = saved_key[idx + 1]; + block[2] = saved_key[idx + 2]; + block[3] = saved_key[idx + 3]; + + mdtransform (state, checksum, block, s_lotus_magic_table); + } + + u32 left = size - curpos; + + block[0] = saved_key[idx + 0]; + block[1] = saved_key[idx + 1]; + block[2] = saved_key[idx + 2]; + block[3] = saved_key[idx + 3]; + + mdtransform (state, checksum, block, s_lotus_magic_table); + + mdtransform_norecalc (state, checksum, s_lotus_magic_table); +} + +static void sha1_transform (const u32x w0[4], const u32x w1[4], const u32x w2[4], const u32x w3[4], u32x digest[5]) +{ + u32x A = digest[0]; + u32x B = digest[1]; + u32x C = digest[2]; + u32x D = digest[3]; + u32x E = digest[4]; + + u32x w0_t = w0[0]; + u32x w1_t = w0[1]; + u32x w2_t = w0[2]; + u32x w3_t = w0[3]; + u32x w4_t = w1[0]; + u32x w5_t = w1[1]; + u32x w6_t = w1[2]; + u32x w7_t = w1[3]; + u32x w8_t = w2[0]; + u32x w9_t = w2[1]; + u32x wa_t = w2[2]; + u32x wb_t = w2[3]; + u32x wc_t = w3[0]; + u32x wd_t = w3[1]; + u32x we_t = w3[2]; + u32x wf_t = w3[3]; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, A, B, C, D, E, w0_t); + SHA1_STEP (SHA1_F0o, E, A, B, C, D, w1_t); + SHA1_STEP (SHA1_F0o, D, E, A, B, C, w2_t); + SHA1_STEP (SHA1_F0o, C, D, E, A, B, w3_t); + SHA1_STEP (SHA1_F0o, B, C, D, E, A, w4_t); + SHA1_STEP (SHA1_F0o, A, B, C, D, E, w5_t); + SHA1_STEP (SHA1_F0o, E, A, B, C, D, w6_t); + SHA1_STEP (SHA1_F0o, D, E, A, B, C, w7_t); + SHA1_STEP (SHA1_F0o, C, D, E, A, B, w8_t); + SHA1_STEP (SHA1_F0o, B, C, D, E, A, w9_t); + SHA1_STEP (SHA1_F0o, A, B, C, D, E, wa_t); + SHA1_STEP (SHA1_F0o, E, A, B, C, D, wb_t); + SHA1_STEP (SHA1_F0o, D, E, A, B, C, wc_t); + SHA1_STEP (SHA1_F0o, C, D, E, A, B, wd_t); + SHA1_STEP (SHA1_F0o, B, C, D, E, A, we_t); + SHA1_STEP (SHA1_F0o, A, B, C, D, E, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F0o, E, A, B, C, D, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F0o, D, E, A, B, C, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F0o, C, D, E, A, B, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F0o, B, C, D, E, A, w3_t); + + #undef K + #define K SHA1C01 + + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w7_t); + + #undef K + #define K SHA1C02 + + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, wb_t); + + #undef K + #define K SHA1C03 + + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, wf_t); + + digest[0] += A; + digest[1] += B; + digest[2] += C; + digest[3] += D; + digest[4] += E; +} + +static void hmac_sha1_pad (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], u32x ipad[5], u32x opad[5]) +{ + w0[0] = w0[0] ^ 0x36363636; + w0[1] = w0[1] ^ 0x36363636; + w0[2] = w0[2] ^ 0x36363636; + w0[3] = w0[3] ^ 0x36363636; + w1[0] = w1[0] ^ 0x36363636; + w1[1] = w1[1] ^ 0x36363636; + w1[2] = w1[2] ^ 0x36363636; + w1[3] = w1[3] ^ 0x36363636; + w2[0] = w2[0] ^ 0x36363636; + w2[1] = w2[1] ^ 0x36363636; + w2[2] = w2[2] ^ 0x36363636; + w2[3] = w2[3] ^ 0x36363636; + w3[0] = w3[0] ^ 0x36363636; + w3[1] = w3[1] ^ 0x36363636; + w3[2] = w3[2] ^ 0x36363636; + w3[3] = w3[3] ^ 0x36363636; + + ipad[0] = SHA1M_A; + ipad[1] = SHA1M_B; + ipad[2] = SHA1M_C; + ipad[3] = SHA1M_D; + ipad[4] = SHA1M_E; + + sha1_transform (w0, w1, w2, w3, ipad); + + w0[0] = w0[0] ^ 0x6a6a6a6a; + w0[1] = w0[1] ^ 0x6a6a6a6a; + w0[2] = w0[2] ^ 0x6a6a6a6a; + w0[3] = w0[3] ^ 0x6a6a6a6a; + w1[0] = w1[0] ^ 0x6a6a6a6a; + w1[1] = w1[1] ^ 0x6a6a6a6a; + w1[2] = w1[2] ^ 0x6a6a6a6a; + w1[3] = w1[3] ^ 0x6a6a6a6a; + w2[0] = w2[0] ^ 0x6a6a6a6a; + w2[1] = w2[1] ^ 0x6a6a6a6a; + w2[2] = w2[2] ^ 0x6a6a6a6a; + w2[3] = w2[3] ^ 0x6a6a6a6a; + w3[0] = w3[0] ^ 0x6a6a6a6a; + w3[1] = w3[1] ^ 0x6a6a6a6a; + w3[2] = w3[2] ^ 0x6a6a6a6a; + w3[3] = w3[3] ^ 0x6a6a6a6a; + + opad[0] = SHA1M_A; + opad[1] = SHA1M_B; + opad[2] = SHA1M_C; + opad[3] = SHA1M_D; + opad[4] = SHA1M_E; + + sha1_transform (w0, w1, w2, w3, opad); +} + +static void hmac_sha1_run (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], u32x ipad[5], u32x opad[5], u32x digest[5]) +{ + digest[0] = ipad[0]; + digest[1] = ipad[1]; + digest[2] = ipad[2]; + digest[3] = ipad[3]; + digest[4] = ipad[4]; + + sha1_transform (w0, w1, w2, w3, digest); + + w0[0] = digest[0]; + w0[1] = digest[1]; + w0[2] = digest[2]; + w0[3] = digest[3]; + w1[0] = digest[4]; + w1[1] = 0x80000000; + w1[2] = 0; + w1[3] = 0; + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = (64 + 20) * 8; + + digest[0] = opad[0]; + digest[1] = opad[1]; + digest[2] = opad[2]; + digest[3] = opad[3]; + digest[4] = opad[4]; + + sha1_transform (w0, w1, w2, w3, digest); +} + +static void base64_encode (u8 *base64_hash, const u32 len, const u8 *base64_plain) +{ + u8 *out_ptr = (u8 *) base64_hash; + u8 *in_ptr = (u8 *) base64_plain; + + u32 i; + + for (i = 0; i < len; i += 3) + { + char out_val0 = lotus64_table [ ((in_ptr[0] >> 2) & 0x3f)]; + char out_val1 = lotus64_table [((in_ptr[0] << 4) & 0x30) | ((in_ptr[1] >> 4) & 0x0f)]; + char out_val2 = lotus64_table [((in_ptr[1] << 2) & 0x3c) | ((in_ptr[2] >> 6) & 0x03)]; + char out_val3 = lotus64_table [ ((in_ptr[2] >> 0) & 0x3f)]; + + out_ptr[0] = out_val0 & 0x7f; + out_ptr[1] = out_val1 & 0x7f; + out_ptr[2] = out_val2 & 0x7f; + out_ptr[3] = out_val3 & 0x7f; + + in_ptr += 3; + out_ptr += 4; + } +} + +static void lotus6_base64_encode (u8x base64_hash[24], const u32 salt0, const u32 salt1, u32x a, u32x b, u32x c) +{ + uchar4 salt0c = as_uchar4 (salt0); + uchar4 salt1c = as_uchar4 (salt1); + + #ifdef VECT_SIZE1 + uchar4 ac; + uchar4 bc; + uchar4 cc; + + ac = as_uchar4 (a); + bc = as_uchar4 (b); + cc = as_uchar4 (c); + #endif + + #ifdef VECT_SIZE2 + uchar4 ac[2]; + uchar4 bc[2]; + uchar4 cc[2]; + + ac[0] = as_uchar4 (a.s0); + bc[0] = as_uchar4 (b.s0); + cc[0] = as_uchar4 (c.s0); + + ac[1] = as_uchar4 (a.s1); + bc[1] = as_uchar4 (b.s1); + cc[1] = as_uchar4 (c.s1); + #endif + + u8 tmp[24]; // size 22 (=pw_len) is needed but base64 needs size divisible by 4 + + /* + * Copy $salt.$digest to a tmp buffer + */ + + u8 base64_plain[16]; + + base64_plain[ 0] = salt0c.s0; + base64_plain[ 1] = salt0c.s1; + base64_plain[ 2] = salt0c.s2; + base64_plain[ 3] = salt0c.s3; + base64_plain[ 3] -= -4; // dont ask! + base64_plain[ 4] = salt1c.s0; + + #ifdef VECT_SIZE1 + base64_plain[ 5] = ac.s0; + base64_plain[ 6] = ac.s1; + base64_plain[ 7] = ac.s2; + base64_plain[ 8] = ac.s3; + base64_plain[ 9] = bc.s0; + base64_plain[10] = bc.s1; + base64_plain[11] = bc.s2; + base64_plain[12] = bc.s3; + base64_plain[13] = cc.s0; + base64_plain[14] = cc.s1; + base64_plain[15] = cc.s2; + + /* + * base64 encode the $salt.$digest string + */ + + base64_encode (tmp + 2, 14, base64_plain); + + base64_hash[ 0] = '('; + base64_hash[ 1] = 'G'; + base64_hash[ 2] = tmp[ 2]; + base64_hash[ 3] = tmp[ 3]; + base64_hash[ 4] = tmp[ 4]; + base64_hash[ 5] = tmp[ 5]; + base64_hash[ 6] = tmp[ 6]; + base64_hash[ 7] = tmp[ 7]; + base64_hash[ 8] = tmp[ 8]; + base64_hash[ 9] = tmp[ 9]; + base64_hash[10] = tmp[10]; + base64_hash[11] = tmp[11]; + base64_hash[12] = tmp[12]; + base64_hash[13] = tmp[13]; + base64_hash[14] = tmp[14]; + base64_hash[15] = tmp[15]; + base64_hash[16] = tmp[16]; + base64_hash[17] = tmp[17]; + base64_hash[18] = tmp[18]; + base64_hash[19] = tmp[19]; + base64_hash[20] = tmp[20]; + base64_hash[21] = ')'; + #endif + + #ifdef VECT_SIZE2 + base64_plain[ 5] = ac[0].s0; + base64_plain[ 6] = ac[0].s1; + base64_plain[ 7] = ac[0].s2; + base64_plain[ 8] = ac[0].s3; + base64_plain[ 9] = bc[0].s0; + base64_plain[10] = bc[0].s1; + base64_plain[11] = bc[0].s2; + base64_plain[12] = bc[0].s3; + base64_plain[13] = cc[0].s0; + base64_plain[14] = cc[0].s1; + base64_plain[15] = cc[0].s2; + + /* + * base64 encode the $salt.$digest string + */ + + base64_encode (tmp + 2, 14, base64_plain); + + base64_hash[ 0].s0 = '('; + base64_hash[ 1].s0 = 'G'; + base64_hash[ 2].s0 = tmp[ 2]; + base64_hash[ 3].s0 = tmp[ 3]; + base64_hash[ 4].s0 = tmp[ 4]; + base64_hash[ 5].s0 = tmp[ 5]; + base64_hash[ 6].s0 = tmp[ 6]; + base64_hash[ 7].s0 = tmp[ 7]; + base64_hash[ 8].s0 = tmp[ 8]; + base64_hash[ 9].s0 = tmp[ 9]; + base64_hash[10].s0 = tmp[10]; + base64_hash[11].s0 = tmp[11]; + base64_hash[12].s0 = tmp[12]; + base64_hash[13].s0 = tmp[13]; + base64_hash[14].s0 = tmp[14]; + base64_hash[15].s0 = tmp[15]; + base64_hash[16].s0 = tmp[16]; + base64_hash[17].s0 = tmp[17]; + base64_hash[18].s0 = tmp[18]; + base64_hash[19].s0 = tmp[19]; + base64_hash[20].s0 = tmp[20]; + base64_hash[21].s0 = ')'; + + base64_plain[ 5] = ac[1].s0; + base64_plain[ 6] = ac[1].s1; + base64_plain[ 7] = ac[1].s2; + base64_plain[ 8] = ac[1].s3; + base64_plain[ 9] = bc[1].s0; + base64_plain[10] = bc[1].s1; + base64_plain[11] = bc[1].s2; + base64_plain[12] = bc[1].s3; + base64_plain[13] = cc[1].s0; + base64_plain[14] = cc[1].s1; + base64_plain[15] = cc[1].s2; + + /* + * base64 encode the $salt.$digest string + */ + + base64_encode (tmp + 2, 14, base64_plain); + + base64_hash[ 0].s1 = '('; + base64_hash[ 1].s1 = 'G'; + base64_hash[ 2].s1 = tmp[ 2]; + base64_hash[ 3].s1 = tmp[ 3]; + base64_hash[ 4].s1 = tmp[ 4]; + base64_hash[ 5].s1 = tmp[ 5]; + base64_hash[ 6].s1 = tmp[ 6]; + base64_hash[ 7].s1 = tmp[ 7]; + base64_hash[ 8].s1 = tmp[ 8]; + base64_hash[ 9].s1 = tmp[ 9]; + base64_hash[10].s1 = tmp[10]; + base64_hash[11].s1 = tmp[11]; + base64_hash[12].s1 = tmp[12]; + base64_hash[13].s1 = tmp[13]; + base64_hash[14].s1 = tmp[14]; + base64_hash[15].s1 = tmp[15]; + base64_hash[16].s1 = tmp[16]; + base64_hash[17].s1 = tmp[17]; + base64_hash[18].s1 = tmp[18]; + base64_hash[19].s1 = tmp[19]; + base64_hash[20].s1 = tmp[20]; + base64_hash[21].s1 = ')'; + #endif + +} + + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m09100_init (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global lotus8_tmp_t *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global wpa_t *wpa_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + const u32 lid = get_local_id (0); + + /** + * bin2asc table + */ + + __local u32 l_bin2asc[256]; + + const u32 lid4 = lid * 4; + + const u32 lid40 = lid4 + 0; + const u32 lid41 = lid4 + 1; + const u32 lid42 = lid4 + 2; + const u32 lid43 = lid4 + 3; + + const u32 v400 = (lid40 >> 0) & 15; + const u32 v401 = (lid40 >> 4) & 15; + const u32 v410 = (lid41 >> 0) & 15; + const u32 v411 = (lid41 >> 4) & 15; + const u32 v420 = (lid42 >> 0) & 15; + const u32 v421 = (lid42 >> 4) & 15; + const u32 v430 = (lid43 >> 0) & 15; + const u32 v431 = (lid43 >> 4) & 15; + + l_bin2asc[lid40] = ((v400 < 10) ? '0' + v400 : 'A' - 10 + v400) << 8 + | ((v401 < 10) ? '0' + v401 : 'A' - 10 + v401) << 0; + l_bin2asc[lid41] = ((v410 < 10) ? '0' + v410 : 'A' - 10 + v410) << 8 + | ((v411 < 10) ? '0' + v411 : 'A' - 10 + v411) << 0; + l_bin2asc[lid42] = ((v420 < 10) ? '0' + v420 : 'A' - 10 + v420) << 8 + | ((v421 < 10) ? '0' + v421 : 'A' - 10 + v421) << 0; + l_bin2asc[lid43] = ((v430 < 10) ? '0' + v430 : 'A' - 10 + v430) << 8 + | ((v431 < 10) ? '0' + v431 : 'A' - 10 + v431) << 0; + + barrier (CLK_LOCAL_MEM_FENCE); + + /** + * sbox + */ + + __local u32 s_lotus_magic_table[256]; + + s_lotus_magic_table[lid4 + 0] = lotus_magic_table[lid4 + 0]; + s_lotus_magic_table[lid4 + 1] = lotus_magic_table[lid4 + 1]; + s_lotus_magic_table[lid4 + 2] = lotus_magic_table[lid4 + 2]; + s_lotus_magic_table[lid4 + 3] = lotus_magic_table[lid4 + 3]; + + barrier (CLK_LOCAL_MEM_FENCE); + + if (gid >= gid_max) return; + + + u32x w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + + w[ 4] = pws[gid].i[ 4]; + w[ 5] = pws[gid].i[ 5]; + w[ 6] = pws[gid].i[ 6]; + w[ 7] = pws[gid].i[ 7]; + + w[ 8] = pws[gid].i[ 8]; + w[ 9] = pws[gid].i[ 9]; + w[10] = pws[gid].i[10]; + w[11] = pws[gid].i[11]; + + w[12] = pws[gid].i[12]; + w[13] = pws[gid].i[13]; + w[14] = pws[gid].i[14]; + w[15] = pws[gid].i[15]; + + /** + * pad + */ + + u32 pw_len = pws[gid].pw_len; + + if (pw_len < 16) + { + pad (&w[ 0], pw_len & 0xf); + } + else if (pw_len < 32) + { + pad (&w[ 4], pw_len & 0xf); + } + else if (pw_len < 48) + { + pad (&w[ 8], pw_len & 0xf); + } + else if (pw_len < 64) + { + pad (&w[12], pw_len & 0xf); + } + + /** + * salt + */ + + u32 salt_len = salt_bufs[salt_pos].salt_len; + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[ 1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[ 2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[ 3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = 0x01000000; + salt_buf1[1] = 0x00000080; + salt_buf1[2] = 0; + salt_buf1[3] = 0; + + u32 salt_buf2[4]; + + salt_buf2[0] = 0; + salt_buf2[1] = 0; + salt_buf2[2] = 0; + salt_buf2[3] = 0; + + u32 salt_buf3[4]; + + salt_buf3[0] = 0; + salt_buf3[1] = 0; + salt_buf3[2] = 0; + salt_buf3[3] = 0; + + const u32 salt0 = salt_buf0[0]; + const u32 salt1 = salt_buf0[1] & 0xff | '(' << 8; + + /** + * Lotus 6 hash - SEC_pwddigest_V2 + */ + + u32x w_tmp[16]; + + w_tmp[ 0] = w[ 0]; + w_tmp[ 1] = w[ 1]; + w_tmp[ 2] = w[ 2]; + w_tmp[ 3] = w[ 3]; + w_tmp[ 4] = w[ 4]; + w_tmp[ 5] = w[ 5]; + w_tmp[ 6] = w[ 6]; + w_tmp[ 7] = w[ 7]; + w_tmp[ 8] = w[ 8]; + w_tmp[ 9] = w[ 9]; + w_tmp[10] = w[10]; + w_tmp[11] = w[11]; + w_tmp[12] = w[12]; + w_tmp[13] = w[13]; + w_tmp[14] = w[14]; + w_tmp[15] = w[15]; + + u32x state[4]; + + state[0] = 0; + state[1] = 0; + state[2] = 0; + state[3] = 0; + + domino_big_md (w_tmp, pw_len, state, s_lotus_magic_table); + + const u32x w0_t = uint_to_hex_upper8 ((state[0] >> 0) & 255) << 0 + | uint_to_hex_upper8 ((state[0] >> 8) & 255) << 16; + const u32x w1_t = uint_to_hex_upper8 ((state[0] >> 16) & 255) << 0 + | uint_to_hex_upper8 ((state[0] >> 24) & 255) << 16; + const u32x w2_t = uint_to_hex_upper8 ((state[1] >> 0) & 255) << 0 + | uint_to_hex_upper8 ((state[1] >> 8) & 255) << 16; + const u32x w3_t = uint_to_hex_upper8 ((state[1] >> 16) & 255) << 0 + | uint_to_hex_upper8 ((state[1] >> 24) & 255) << 16; + const u32x w4_t = uint_to_hex_upper8 ((state[2] >> 0) & 255) << 0 + | uint_to_hex_upper8 ((state[2] >> 8) & 255) << 16; + const u32x w5_t = uint_to_hex_upper8 ((state[2] >> 16) & 255) << 0 + | uint_to_hex_upper8 ((state[2] >> 24) & 255) << 16; + const u32x w6_t = uint_to_hex_upper8 ((state[3] >> 0) & 255) << 0 + | uint_to_hex_upper8 ((state[3] >> 8) & 255) << 16; + + const u32 pade = 0x0e0e0e0e; + + w_tmp[ 0] = salt0; + w_tmp[ 1] = salt1 | w0_t << 16; + w_tmp[ 2] = w0_t >> 16 | w1_t << 16; + w_tmp[ 3] = w1_t >> 16 | w2_t << 16; + w_tmp[ 4] = w2_t >> 16 | w3_t << 16; + w_tmp[ 5] = w3_t >> 16 | w4_t << 16; + w_tmp[ 6] = w4_t >> 16 | w5_t << 16; + w_tmp[ 7] = w5_t >> 16 | w6_t << 16; + w_tmp[ 8] = w6_t >> 16 | pade << 16; + w_tmp[ 9] = pade; + w_tmp[10] = pade; + w_tmp[11] = pade; + w_tmp[12] = 0; + w_tmp[13] = 0; + w_tmp[14] = 0; + w_tmp[15] = 0; + + state[0] = 0; + state[1] = 0; + state[2] = 0; + state[3] = 0; + + domino_big_md (w_tmp, 34, state, s_lotus_magic_table); + + u32x a = state[0]; + u32x b = state[1]; + u32x c = state[2]; + + /** + * Base64 encode + */ + + pw_len = 22; + + u8x base64_hash[22]; + + lotus6_base64_encode (base64_hash, salt_buf0[0], salt_buf0[1], a, b, c); + + + /** + * PBKDF2 - HMACSHA1 - 1st iteration + */ + + #ifdef VECT_SIZE1 + u32x w0[4]; + + w0[0] = (base64_hash[ 0] << 24) | (base64_hash[ 1] << 16) | (base64_hash[ 2] << 8) | base64_hash[ 3]; + w0[1] = (base64_hash[ 4] << 24) | (base64_hash[ 5] << 16) | (base64_hash[ 6] << 8) | base64_hash[ 7]; + w0[2] = (base64_hash[ 8] << 24) | (base64_hash[ 9] << 16) | (base64_hash[10] << 8) | base64_hash[11]; + w0[3] = (base64_hash[12] << 24) | (base64_hash[13] << 16) | (base64_hash[14] << 8) | base64_hash[15]; + + u32x w1[4]; + + w1[0] = (base64_hash[16] << 24) | (base64_hash[17] << 16) | (base64_hash[18] << 8) | base64_hash[19]; + w1[1] = (base64_hash[20] << 24) | (base64_hash[21] << 16); + w1[2] = 0; + w1[3] = 0; + #endif + + #ifdef VECT_SIZE2 + u32x w0[4]; + + w0[0].s0 = (base64_hash[ 0].s0 << 24) | (base64_hash[ 1].s0 << 16) | (base64_hash[ 2].s0 << 8) | base64_hash[ 3].s0; + w0[1].s0 = (base64_hash[ 4].s0 << 24) | (base64_hash[ 5].s0 << 16) | (base64_hash[ 6].s0 << 8) | base64_hash[ 7].s0; + w0[2].s0 = (base64_hash[ 8].s0 << 24) | (base64_hash[ 9].s0 << 16) | (base64_hash[10].s0 << 8) | base64_hash[11].s0; + w0[3].s0 = (base64_hash[12].s0 << 24) | (base64_hash[13].s0 << 16) | (base64_hash[14].s0 << 8) | base64_hash[15].s0; + + w0[0].s1 = (base64_hash[ 0].s1 << 24) | (base64_hash[ 1].s1 << 16) | (base64_hash[ 2].s1 << 8) | base64_hash[ 3].s1; + w0[1].s1 = (base64_hash[ 4].s1 << 24) | (base64_hash[ 5].s1 << 16) | (base64_hash[ 6].s1 << 8) | base64_hash[ 7].s1; + w0[2].s1 = (base64_hash[ 8].s1 << 24) | (base64_hash[ 9].s1 << 16) | (base64_hash[10].s1 << 8) | base64_hash[11].s1; + w0[3].s1 = (base64_hash[12].s1 << 24) | (base64_hash[13].s1 << 16) | (base64_hash[14].s1 << 8) | base64_hash[15].s1; + + u32x w1[4]; + + w1[0].s0 = (base64_hash[16].s0 << 24) | (base64_hash[17].s0 << 16) | (base64_hash[18].s0 << 8) | base64_hash[19].s0; + w1[1].s0 = (base64_hash[20].s0 << 24) | (base64_hash[21].s0 << 16); + w1[2].s0 = 0; + w1[3].s0 = 0; + + w1[0].s1 = (base64_hash[16].s1 << 24) | (base64_hash[17].s1 << 16) | (base64_hash[18].s1 << 8) | base64_hash[19].s1; + w1[1].s1 = (base64_hash[20].s1 << 24) | (base64_hash[21].s1 << 16); + w1[2].s1 = 0; + w1[3].s1 = 0; + #endif + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + /** + * pads + */ + + u32x ipad[5]; + u32x opad[5]; + + hmac_sha1_pad (w0, w1, w2, w3, ipad, opad); + + tmps[gid].ipad[0] = ipad[0]; + tmps[gid].ipad[1] = ipad[1]; + tmps[gid].ipad[2] = ipad[2]; + tmps[gid].ipad[3] = ipad[3]; + tmps[gid].ipad[4] = ipad[4]; + + tmps[gid].opad[0] = opad[0]; + tmps[gid].opad[1] = opad[1]; + tmps[gid].opad[2] = opad[2]; + tmps[gid].opad[3] = opad[3]; + tmps[gid].opad[4] = opad[4]; + + w0[0] = salt_buf0[0]; + w0[1] = salt_buf0[1]; + w0[2] = salt_buf0[2]; + w0[3] = salt_buf0[3]; + w1[0] = salt_buf1[0]; + w1[1] = salt_buf1[1]; + w1[2] = salt_buf1[2]; + w1[3] = salt_buf1[3]; + w2[0] = salt_buf2[0]; + w2[1] = salt_buf2[1]; + w2[2] = salt_buf2[2]; + w2[3] = salt_buf2[3]; + w3[0] = salt_buf3[0]; + w3[1] = salt_buf3[1]; + w3[2] = salt_buf3[2]; + //w3[3] = salt_buf3[3]; + + w0[0] = swap_workaround (w0[0]); + w0[1] = swap_workaround (w0[1]); + w0[2] = swap_workaround (w0[2]); + w0[3] = swap_workaround (w0[3]); + w1[0] = swap_workaround (w1[0]); + w1[1] = swap_workaround (w1[1]); + w1[2] = swap_workaround (w1[2]); + w1[3] = swap_workaround (w1[3]); + w2[0] = swap_workaround (w2[0]); + w2[1] = swap_workaround (w2[1]); + w2[2] = swap_workaround (w2[2]); + w2[3] = swap_workaround (w2[3]); + w3[0] = swap_workaround (w3[0]); + w3[1] = swap_workaround (w3[1]); + w3[2] = swap_workaround (w3[2]); + w3[3] = (64 + salt_len + 4) * 8; + + u32x dgst[5]; + + hmac_sha1_run (w0, w1, w2, w3, ipad, opad, dgst); + + tmps[gid].dgst[0] = dgst[0]; + tmps[gid].dgst[1] = dgst[1]; + tmps[gid].dgst[2] = dgst[2]; + tmps[gid].dgst[3] = dgst[3]; + tmps[gid].dgst[4] = dgst[4]; + + tmps[gid].out[0] = dgst[0]; + tmps[gid].out[1] = dgst[1]; + tmps[gid].out[2] = dgst[2]; + tmps[gid].out[3] = dgst[3]; + tmps[gid].out[4] = dgst[4]; +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m09100_loop (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global lotus8_tmp_t *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global wpa_t *wpa_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x ipad[5]; + u32x opad[5]; + + ipad[0] = tmps[gid].ipad[0]; + ipad[1] = tmps[gid].ipad[1]; + ipad[2] = tmps[gid].ipad[2]; + ipad[3] = tmps[gid].ipad[3]; + ipad[4] = tmps[gid].ipad[4]; + + opad[0] = tmps[gid].opad[0]; + opad[1] = tmps[gid].opad[1]; + opad[2] = tmps[gid].opad[2]; + opad[3] = tmps[gid].opad[3]; + opad[4] = tmps[gid].opad[4]; + + u32x dgst[5]; + u32x out[5]; + + dgst[0] = tmps[gid].dgst[0]; + dgst[1] = tmps[gid].dgst[1]; + dgst[2] = tmps[gid].dgst[2]; + dgst[3] = tmps[gid].dgst[3]; + dgst[4] = tmps[gid].dgst[4]; + + out[0] = tmps[gid].out[0]; + out[1] = tmps[gid].out[1]; + out[2] = tmps[gid].out[2]; + out[3] = tmps[gid].out[3]; + out[4] = tmps[gid].out[4]; + + for (u32 j = 0; j < loop_cnt; j++) + { + u32x w0[4]; + u32x w1[4]; + u32x w2[4]; + u32x w3[4]; + + w0[0] = dgst[0]; + w0[1] = dgst[1]; + w0[2] = dgst[2]; + w0[3] = dgst[3]; + w1[0] = dgst[4]; + w1[1] = 0x80000000; + w1[2] = 0; + w1[3] = 0; + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = (64 + 20) * 8; + + hmac_sha1_run (w0, w1, w2, w3, ipad, opad, dgst); + + out[0] ^= dgst[0]; + out[1] ^= dgst[1]; + out[2] ^= dgst[2]; + out[3] ^= dgst[3]; + out[4] ^= dgst[4]; + } + + tmps[gid].dgst[0] = dgst[0]; + tmps[gid].dgst[1] = dgst[1]; + tmps[gid].dgst[2] = dgst[2]; + tmps[gid].dgst[3] = dgst[3]; + tmps[gid].dgst[4] = dgst[4]; + + tmps[gid].out[0] = out[0]; + tmps[gid].out[1] = out[1]; + tmps[gid].out[2] = out[2]; + tmps[gid].out[3] = out[3]; + tmps[gid].out[4] = out[4]; +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m09100_comp (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global lotus8_tmp_t *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global wpa_t *wpa_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + const u32 lid = get_local_id (0); + + /** + * digest + */ + + const u32x r0 = tmps[gid].out[DGST_R0]; + const u32x r1 = tmps[gid].out[DGST_R1]; + const u32x r2 = 0; + const u32x r3 = 0; + + #define il_pos 0 + + #include VECT_COMPARE_M +} diff --git a/amd/m09400.cl b/amd/m09400.cl new file mode 100644 index 0000000000..a3314dc011 --- /dev/null +++ b/amd/m09400.cl @@ -0,0 +1,1891 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _OFFICE2007_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW4 +#define VECT_SIZE1 +#endif + +#ifdef VLIW5 +#define VECT_SIZE1 +#endif + +#define DGST_R0 0 +#define DGST_R1 1 +#define DGST_R2 2 +#define DGST_R3 3 + +#include "include/kernel_functions.c" +#include "types_amd.c" +#include "common_amd.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +__constant u32 te0[256] = +{ + 0xc66363a5, 0xf87c7c84, 0xee777799, 0xf67b7b8d, + 0xfff2f20d, 0xd66b6bbd, 0xde6f6fb1, 0x91c5c554, + 0x60303050, 0x02010103, 0xce6767a9, 0x562b2b7d, + 0xe7fefe19, 0xb5d7d762, 0x4dababe6, 0xec76769a, + 0x8fcaca45, 0x1f82829d, 0x89c9c940, 0xfa7d7d87, + 0xeffafa15, 0xb25959eb, 0x8e4747c9, 0xfbf0f00b, + 0x41adadec, 0xb3d4d467, 0x5fa2a2fd, 0x45afafea, + 0x239c9cbf, 0x53a4a4f7, 0xe4727296, 0x9bc0c05b, + 0x75b7b7c2, 0xe1fdfd1c, 0x3d9393ae, 0x4c26266a, + 0x6c36365a, 0x7e3f3f41, 0xf5f7f702, 0x83cccc4f, + 0x6834345c, 0x51a5a5f4, 0xd1e5e534, 0xf9f1f108, + 0xe2717193, 0xabd8d873, 0x62313153, 0x2a15153f, + 0x0804040c, 0x95c7c752, 0x46232365, 0x9dc3c35e, + 0x30181828, 0x379696a1, 0x0a05050f, 0x2f9a9ab5, + 0x0e070709, 0x24121236, 0x1b80809b, 0xdfe2e23d, + 0xcdebeb26, 0x4e272769, 0x7fb2b2cd, 0xea75759f, + 0x1209091b, 0x1d83839e, 0x582c2c74, 0x341a1a2e, + 0x361b1b2d, 0xdc6e6eb2, 0xb45a5aee, 0x5ba0a0fb, + 0xa45252f6, 0x763b3b4d, 0xb7d6d661, 0x7db3b3ce, + 0x5229297b, 0xdde3e33e, 0x5e2f2f71, 0x13848497, + 0xa65353f5, 0xb9d1d168, 0x00000000, 0xc1eded2c, + 0x40202060, 0xe3fcfc1f, 0x79b1b1c8, 0xb65b5bed, + 0xd46a6abe, 0x8dcbcb46, 0x67bebed9, 0x7239394b, + 0x944a4ade, 0x984c4cd4, 0xb05858e8, 0x85cfcf4a, + 0xbbd0d06b, 0xc5efef2a, 0x4faaaae5, 0xedfbfb16, + 0x864343c5, 0x9a4d4dd7, 0x66333355, 0x11858594, + 0x8a4545cf, 0xe9f9f910, 0x04020206, 0xfe7f7f81, + 0xa05050f0, 0x783c3c44, 0x259f9fba, 0x4ba8a8e3, + 0xa25151f3, 0x5da3a3fe, 0x804040c0, 0x058f8f8a, + 0x3f9292ad, 0x219d9dbc, 0x70383848, 0xf1f5f504, + 0x63bcbcdf, 0x77b6b6c1, 0xafdada75, 0x42212163, + 0x20101030, 0xe5ffff1a, 0xfdf3f30e, 0xbfd2d26d, + 0x81cdcd4c, 0x180c0c14, 0x26131335, 0xc3ecec2f, + 0xbe5f5fe1, 0x359797a2, 0x884444cc, 0x2e171739, + 0x93c4c457, 0x55a7a7f2, 0xfc7e7e82, 0x7a3d3d47, + 0xc86464ac, 0xba5d5de7, 0x3219192b, 0xe6737395, + 0xc06060a0, 0x19818198, 0x9e4f4fd1, 0xa3dcdc7f, + 0x44222266, 0x542a2a7e, 0x3b9090ab, 0x0b888883, + 0x8c4646ca, 0xc7eeee29, 0x6bb8b8d3, 0x2814143c, + 0xa7dede79, 0xbc5e5ee2, 0x160b0b1d, 0xaddbdb76, + 0xdbe0e03b, 0x64323256, 0x743a3a4e, 0x140a0a1e, + 0x924949db, 0x0c06060a, 0x4824246c, 0xb85c5ce4, + 0x9fc2c25d, 0xbdd3d36e, 0x43acacef, 0xc46262a6, + 0x399191a8, 0x319595a4, 0xd3e4e437, 0xf279798b, + 0xd5e7e732, 0x8bc8c843, 0x6e373759, 0xda6d6db7, + 0x018d8d8c, 0xb1d5d564, 0x9c4e4ed2, 0x49a9a9e0, + 0xd86c6cb4, 0xac5656fa, 0xf3f4f407, 0xcfeaea25, + 0xca6565af, 0xf47a7a8e, 0x47aeaee9, 0x10080818, + 0x6fbabad5, 0xf0787888, 0x4a25256f, 0x5c2e2e72, + 0x381c1c24, 0x57a6a6f1, 0x73b4b4c7, 0x97c6c651, + 0xcbe8e823, 0xa1dddd7c, 0xe874749c, 0x3e1f1f21, + 0x964b4bdd, 0x61bdbddc, 0x0d8b8b86, 0x0f8a8a85, + 0xe0707090, 0x7c3e3e42, 0x71b5b5c4, 0xcc6666aa, + 0x904848d8, 0x06030305, 0xf7f6f601, 0x1c0e0e12, + 0xc26161a3, 0x6a35355f, 0xae5757f9, 0x69b9b9d0, + 0x17868691, 0x99c1c158, 0x3a1d1d27, 0x279e9eb9, + 0xd9e1e138, 0xebf8f813, 0x2b9898b3, 0x22111133, + 0xd26969bb, 0xa9d9d970, 0x078e8e89, 0x339494a7, + 0x2d9b9bb6, 0x3c1e1e22, 0x15878792, 0xc9e9e920, + 0x87cece49, 0xaa5555ff, 0x50282878, 0xa5dfdf7a, + 0x038c8c8f, 0x59a1a1f8, 0x09898980, 0x1a0d0d17, + 0x65bfbfda, 0xd7e6e631, 0x844242c6, 0xd06868b8, + 0x824141c3, 0x299999b0, 0x5a2d2d77, 0x1e0f0f11, + 0x7bb0b0cb, 0xa85454fc, 0x6dbbbbd6, 0x2c16163a, +}; + +__constant u32 te1[256] = +{ + 0xa5c66363, 0x84f87c7c, 0x99ee7777, 0x8df67b7b, + 0x0dfff2f2, 0xbdd66b6b, 0xb1de6f6f, 0x5491c5c5, + 0x50603030, 0x03020101, 0xa9ce6767, 0x7d562b2b, + 0x19e7fefe, 0x62b5d7d7, 0xe64dabab, 0x9aec7676, + 0x458fcaca, 0x9d1f8282, 0x4089c9c9, 0x87fa7d7d, + 0x15effafa, 0xebb25959, 0xc98e4747, 0x0bfbf0f0, + 0xec41adad, 0x67b3d4d4, 0xfd5fa2a2, 0xea45afaf, + 0xbf239c9c, 0xf753a4a4, 0x96e47272, 0x5b9bc0c0, + 0xc275b7b7, 0x1ce1fdfd, 0xae3d9393, 0x6a4c2626, + 0x5a6c3636, 0x417e3f3f, 0x02f5f7f7, 0x4f83cccc, + 0x5c683434, 0xf451a5a5, 0x34d1e5e5, 0x08f9f1f1, + 0x93e27171, 0x73abd8d8, 0x53623131, 0x3f2a1515, + 0x0c080404, 0x5295c7c7, 0x65462323, 0x5e9dc3c3, + 0x28301818, 0xa1379696, 0x0f0a0505, 0xb52f9a9a, + 0x090e0707, 0x36241212, 0x9b1b8080, 0x3ddfe2e2, + 0x26cdebeb, 0x694e2727, 0xcd7fb2b2, 0x9fea7575, + 0x1b120909, 0x9e1d8383, 0x74582c2c, 0x2e341a1a, + 0x2d361b1b, 0xb2dc6e6e, 0xeeb45a5a, 0xfb5ba0a0, + 0xf6a45252, 0x4d763b3b, 0x61b7d6d6, 0xce7db3b3, + 0x7b522929, 0x3edde3e3, 0x715e2f2f, 0x97138484, + 0xf5a65353, 0x68b9d1d1, 0x00000000, 0x2cc1eded, + 0x60402020, 0x1fe3fcfc, 0xc879b1b1, 0xedb65b5b, + 0xbed46a6a, 0x468dcbcb, 0xd967bebe, 0x4b723939, + 0xde944a4a, 0xd4984c4c, 0xe8b05858, 0x4a85cfcf, + 0x6bbbd0d0, 0x2ac5efef, 0xe54faaaa, 0x16edfbfb, + 0xc5864343, 0xd79a4d4d, 0x55663333, 0x94118585, + 0xcf8a4545, 0x10e9f9f9, 0x06040202, 0x81fe7f7f, + 0xf0a05050, 0x44783c3c, 0xba259f9f, 0xe34ba8a8, + 0xf3a25151, 0xfe5da3a3, 0xc0804040, 0x8a058f8f, + 0xad3f9292, 0xbc219d9d, 0x48703838, 0x04f1f5f5, + 0xdf63bcbc, 0xc177b6b6, 0x75afdada, 0x63422121, + 0x30201010, 0x1ae5ffff, 0x0efdf3f3, 0x6dbfd2d2, + 0x4c81cdcd, 0x14180c0c, 0x35261313, 0x2fc3ecec, + 0xe1be5f5f, 0xa2359797, 0xcc884444, 0x392e1717, + 0x5793c4c4, 0xf255a7a7, 0x82fc7e7e, 0x477a3d3d, + 0xacc86464, 0xe7ba5d5d, 0x2b321919, 0x95e67373, + 0xa0c06060, 0x98198181, 0xd19e4f4f, 0x7fa3dcdc, + 0x66442222, 0x7e542a2a, 0xab3b9090, 0x830b8888, + 0xca8c4646, 0x29c7eeee, 0xd36bb8b8, 0x3c281414, + 0x79a7dede, 0xe2bc5e5e, 0x1d160b0b, 0x76addbdb, + 0x3bdbe0e0, 0x56643232, 0x4e743a3a, 0x1e140a0a, + 0xdb924949, 0x0a0c0606, 0x6c482424, 0xe4b85c5c, + 0x5d9fc2c2, 0x6ebdd3d3, 0xef43acac, 0xa6c46262, + 0xa8399191, 0xa4319595, 0x37d3e4e4, 0x8bf27979, + 0x32d5e7e7, 0x438bc8c8, 0x596e3737, 0xb7da6d6d, + 0x8c018d8d, 0x64b1d5d5, 0xd29c4e4e, 0xe049a9a9, + 0xb4d86c6c, 0xfaac5656, 0x07f3f4f4, 0x25cfeaea, + 0xafca6565, 0x8ef47a7a, 0xe947aeae, 0x18100808, + 0xd56fbaba, 0x88f07878, 0x6f4a2525, 0x725c2e2e, + 0x24381c1c, 0xf157a6a6, 0xc773b4b4, 0x5197c6c6, + 0x23cbe8e8, 0x7ca1dddd, 0x9ce87474, 0x213e1f1f, + 0xdd964b4b, 0xdc61bdbd, 0x860d8b8b, 0x850f8a8a, + 0x90e07070, 0x427c3e3e, 0xc471b5b5, 0xaacc6666, + 0xd8904848, 0x05060303, 0x01f7f6f6, 0x121c0e0e, + 0xa3c26161, 0x5f6a3535, 0xf9ae5757, 0xd069b9b9, + 0x91178686, 0x5899c1c1, 0x273a1d1d, 0xb9279e9e, + 0x38d9e1e1, 0x13ebf8f8, 0xb32b9898, 0x33221111, + 0xbbd26969, 0x70a9d9d9, 0x89078e8e, 0xa7339494, + 0xb62d9b9b, 0x223c1e1e, 0x92158787, 0x20c9e9e9, + 0x4987cece, 0xffaa5555, 0x78502828, 0x7aa5dfdf, + 0x8f038c8c, 0xf859a1a1, 0x80098989, 0x171a0d0d, + 0xda65bfbf, 0x31d7e6e6, 0xc6844242, 0xb8d06868, + 0xc3824141, 0xb0299999, 0x775a2d2d, 0x111e0f0f, + 0xcb7bb0b0, 0xfca85454, 0xd66dbbbb, 0x3a2c1616, +}; + +__constant u32 te2[256] = +{ + 0x63a5c663, 0x7c84f87c, 0x7799ee77, 0x7b8df67b, + 0xf20dfff2, 0x6bbdd66b, 0x6fb1de6f, 0xc55491c5, + 0x30506030, 0x01030201, 0x67a9ce67, 0x2b7d562b, + 0xfe19e7fe, 0xd762b5d7, 0xabe64dab, 0x769aec76, + 0xca458fca, 0x829d1f82, 0xc94089c9, 0x7d87fa7d, + 0xfa15effa, 0x59ebb259, 0x47c98e47, 0xf00bfbf0, + 0xadec41ad, 0xd467b3d4, 0xa2fd5fa2, 0xafea45af, + 0x9cbf239c, 0xa4f753a4, 0x7296e472, 0xc05b9bc0, + 0xb7c275b7, 0xfd1ce1fd, 0x93ae3d93, 0x266a4c26, + 0x365a6c36, 0x3f417e3f, 0xf702f5f7, 0xcc4f83cc, + 0x345c6834, 0xa5f451a5, 0xe534d1e5, 0xf108f9f1, + 0x7193e271, 0xd873abd8, 0x31536231, 0x153f2a15, + 0x040c0804, 0xc75295c7, 0x23654623, 0xc35e9dc3, + 0x18283018, 0x96a13796, 0x050f0a05, 0x9ab52f9a, + 0x07090e07, 0x12362412, 0x809b1b80, 0xe23ddfe2, + 0xeb26cdeb, 0x27694e27, 0xb2cd7fb2, 0x759fea75, + 0x091b1209, 0x839e1d83, 0x2c74582c, 0x1a2e341a, + 0x1b2d361b, 0x6eb2dc6e, 0x5aeeb45a, 0xa0fb5ba0, + 0x52f6a452, 0x3b4d763b, 0xd661b7d6, 0xb3ce7db3, + 0x297b5229, 0xe33edde3, 0x2f715e2f, 0x84971384, + 0x53f5a653, 0xd168b9d1, 0x00000000, 0xed2cc1ed, + 0x20604020, 0xfc1fe3fc, 0xb1c879b1, 0x5bedb65b, + 0x6abed46a, 0xcb468dcb, 0xbed967be, 0x394b7239, + 0x4ade944a, 0x4cd4984c, 0x58e8b058, 0xcf4a85cf, + 0xd06bbbd0, 0xef2ac5ef, 0xaae54faa, 0xfb16edfb, + 0x43c58643, 0x4dd79a4d, 0x33556633, 0x85941185, + 0x45cf8a45, 0xf910e9f9, 0x02060402, 0x7f81fe7f, + 0x50f0a050, 0x3c44783c, 0x9fba259f, 0xa8e34ba8, + 0x51f3a251, 0xa3fe5da3, 0x40c08040, 0x8f8a058f, + 0x92ad3f92, 0x9dbc219d, 0x38487038, 0xf504f1f5, + 0xbcdf63bc, 0xb6c177b6, 0xda75afda, 0x21634221, + 0x10302010, 0xff1ae5ff, 0xf30efdf3, 0xd26dbfd2, + 0xcd4c81cd, 0x0c14180c, 0x13352613, 0xec2fc3ec, + 0x5fe1be5f, 0x97a23597, 0x44cc8844, 0x17392e17, + 0xc45793c4, 0xa7f255a7, 0x7e82fc7e, 0x3d477a3d, + 0x64acc864, 0x5de7ba5d, 0x192b3219, 0x7395e673, + 0x60a0c060, 0x81981981, 0x4fd19e4f, 0xdc7fa3dc, + 0x22664422, 0x2a7e542a, 0x90ab3b90, 0x88830b88, + 0x46ca8c46, 0xee29c7ee, 0xb8d36bb8, 0x143c2814, + 0xde79a7de, 0x5ee2bc5e, 0x0b1d160b, 0xdb76addb, + 0xe03bdbe0, 0x32566432, 0x3a4e743a, 0x0a1e140a, + 0x49db9249, 0x060a0c06, 0x246c4824, 0x5ce4b85c, + 0xc25d9fc2, 0xd36ebdd3, 0xacef43ac, 0x62a6c462, + 0x91a83991, 0x95a43195, 0xe437d3e4, 0x798bf279, + 0xe732d5e7, 0xc8438bc8, 0x37596e37, 0x6db7da6d, + 0x8d8c018d, 0xd564b1d5, 0x4ed29c4e, 0xa9e049a9, + 0x6cb4d86c, 0x56faac56, 0xf407f3f4, 0xea25cfea, + 0x65afca65, 0x7a8ef47a, 0xaee947ae, 0x08181008, + 0xbad56fba, 0x7888f078, 0x256f4a25, 0x2e725c2e, + 0x1c24381c, 0xa6f157a6, 0xb4c773b4, 0xc65197c6, + 0xe823cbe8, 0xdd7ca1dd, 0x749ce874, 0x1f213e1f, + 0x4bdd964b, 0xbddc61bd, 0x8b860d8b, 0x8a850f8a, + 0x7090e070, 0x3e427c3e, 0xb5c471b5, 0x66aacc66, + 0x48d89048, 0x03050603, 0xf601f7f6, 0x0e121c0e, + 0x61a3c261, 0x355f6a35, 0x57f9ae57, 0xb9d069b9, + 0x86911786, 0xc15899c1, 0x1d273a1d, 0x9eb9279e, + 0xe138d9e1, 0xf813ebf8, 0x98b32b98, 0x11332211, + 0x69bbd269, 0xd970a9d9, 0x8e89078e, 0x94a73394, + 0x9bb62d9b, 0x1e223c1e, 0x87921587, 0xe920c9e9, + 0xce4987ce, 0x55ffaa55, 0x28785028, 0xdf7aa5df, + 0x8c8f038c, 0xa1f859a1, 0x89800989, 0x0d171a0d, + 0xbfda65bf, 0xe631d7e6, 0x42c68442, 0x68b8d068, + 0x41c38241, 0x99b02999, 0x2d775a2d, 0x0f111e0f, + 0xb0cb7bb0, 0x54fca854, 0xbbd66dbb, 0x163a2c16, +}; + +__constant u32 te3[256] = +{ + 0x6363a5c6, 0x7c7c84f8, 0x777799ee, 0x7b7b8df6, + 0xf2f20dff, 0x6b6bbdd6, 0x6f6fb1de, 0xc5c55491, + 0x30305060, 0x01010302, 0x6767a9ce, 0x2b2b7d56, + 0xfefe19e7, 0xd7d762b5, 0xababe64d, 0x76769aec, + 0xcaca458f, 0x82829d1f, 0xc9c94089, 0x7d7d87fa, + 0xfafa15ef, 0x5959ebb2, 0x4747c98e, 0xf0f00bfb, + 0xadadec41, 0xd4d467b3, 0xa2a2fd5f, 0xafafea45, + 0x9c9cbf23, 0xa4a4f753, 0x727296e4, 0xc0c05b9b, + 0xb7b7c275, 0xfdfd1ce1, 0x9393ae3d, 0x26266a4c, + 0x36365a6c, 0x3f3f417e, 0xf7f702f5, 0xcccc4f83, + 0x34345c68, 0xa5a5f451, 0xe5e534d1, 0xf1f108f9, + 0x717193e2, 0xd8d873ab, 0x31315362, 0x15153f2a, + 0x04040c08, 0xc7c75295, 0x23236546, 0xc3c35e9d, + 0x18182830, 0x9696a137, 0x05050f0a, 0x9a9ab52f, + 0x0707090e, 0x12123624, 0x80809b1b, 0xe2e23ddf, + 0xebeb26cd, 0x2727694e, 0xb2b2cd7f, 0x75759fea, + 0x09091b12, 0x83839e1d, 0x2c2c7458, 0x1a1a2e34, + 0x1b1b2d36, 0x6e6eb2dc, 0x5a5aeeb4, 0xa0a0fb5b, + 0x5252f6a4, 0x3b3b4d76, 0xd6d661b7, 0xb3b3ce7d, + 0x29297b52, 0xe3e33edd, 0x2f2f715e, 0x84849713, + 0x5353f5a6, 0xd1d168b9, 0x00000000, 0xeded2cc1, + 0x20206040, 0xfcfc1fe3, 0xb1b1c879, 0x5b5bedb6, + 0x6a6abed4, 0xcbcb468d, 0xbebed967, 0x39394b72, + 0x4a4ade94, 0x4c4cd498, 0x5858e8b0, 0xcfcf4a85, + 0xd0d06bbb, 0xefef2ac5, 0xaaaae54f, 0xfbfb16ed, + 0x4343c586, 0x4d4dd79a, 0x33335566, 0x85859411, + 0x4545cf8a, 0xf9f910e9, 0x02020604, 0x7f7f81fe, + 0x5050f0a0, 0x3c3c4478, 0x9f9fba25, 0xa8a8e34b, + 0x5151f3a2, 0xa3a3fe5d, 0x4040c080, 0x8f8f8a05, + 0x9292ad3f, 0x9d9dbc21, 0x38384870, 0xf5f504f1, + 0xbcbcdf63, 0xb6b6c177, 0xdada75af, 0x21216342, + 0x10103020, 0xffff1ae5, 0xf3f30efd, 0xd2d26dbf, + 0xcdcd4c81, 0x0c0c1418, 0x13133526, 0xecec2fc3, + 0x5f5fe1be, 0x9797a235, 0x4444cc88, 0x1717392e, + 0xc4c45793, 0xa7a7f255, 0x7e7e82fc, 0x3d3d477a, + 0x6464acc8, 0x5d5de7ba, 0x19192b32, 0x737395e6, + 0x6060a0c0, 0x81819819, 0x4f4fd19e, 0xdcdc7fa3, + 0x22226644, 0x2a2a7e54, 0x9090ab3b, 0x8888830b, + 0x4646ca8c, 0xeeee29c7, 0xb8b8d36b, 0x14143c28, + 0xdede79a7, 0x5e5ee2bc, 0x0b0b1d16, 0xdbdb76ad, + 0xe0e03bdb, 0x32325664, 0x3a3a4e74, 0x0a0a1e14, + 0x4949db92, 0x06060a0c, 0x24246c48, 0x5c5ce4b8, + 0xc2c25d9f, 0xd3d36ebd, 0xacacef43, 0x6262a6c4, + 0x9191a839, 0x9595a431, 0xe4e437d3, 0x79798bf2, + 0xe7e732d5, 0xc8c8438b, 0x3737596e, 0x6d6db7da, + 0x8d8d8c01, 0xd5d564b1, 0x4e4ed29c, 0xa9a9e049, + 0x6c6cb4d8, 0x5656faac, 0xf4f407f3, 0xeaea25cf, + 0x6565afca, 0x7a7a8ef4, 0xaeaee947, 0x08081810, + 0xbabad56f, 0x787888f0, 0x25256f4a, 0x2e2e725c, + 0x1c1c2438, 0xa6a6f157, 0xb4b4c773, 0xc6c65197, + 0xe8e823cb, 0xdddd7ca1, 0x74749ce8, 0x1f1f213e, + 0x4b4bdd96, 0xbdbddc61, 0x8b8b860d, 0x8a8a850f, + 0x707090e0, 0x3e3e427c, 0xb5b5c471, 0x6666aacc, + 0x4848d890, 0x03030506, 0xf6f601f7, 0x0e0e121c, + 0x6161a3c2, 0x35355f6a, 0x5757f9ae, 0xb9b9d069, + 0x86869117, 0xc1c15899, 0x1d1d273a, 0x9e9eb927, + 0xe1e138d9, 0xf8f813eb, 0x9898b32b, 0x11113322, + 0x6969bbd2, 0xd9d970a9, 0x8e8e8907, 0x9494a733, + 0x9b9bb62d, 0x1e1e223c, 0x87879215, 0xe9e920c9, + 0xcece4987, 0x5555ffaa, 0x28287850, 0xdfdf7aa5, + 0x8c8c8f03, 0xa1a1f859, 0x89898009, 0x0d0d171a, + 0xbfbfda65, 0xe6e631d7, 0x4242c684, 0x6868b8d0, + 0x4141c382, 0x9999b029, 0x2d2d775a, 0x0f0f111e, + 0xb0b0cb7b, 0x5454fca8, 0xbbbbd66d, 0x16163a2c, +}; + +__constant u32 te4[256] = +{ + 0x63636363, 0x7c7c7c7c, 0x77777777, 0x7b7b7b7b, + 0xf2f2f2f2, 0x6b6b6b6b, 0x6f6f6f6f, 0xc5c5c5c5, + 0x30303030, 0x01010101, 0x67676767, 0x2b2b2b2b, + 0xfefefefe, 0xd7d7d7d7, 0xabababab, 0x76767676, + 0xcacacaca, 0x82828282, 0xc9c9c9c9, 0x7d7d7d7d, + 0xfafafafa, 0x59595959, 0x47474747, 0xf0f0f0f0, + 0xadadadad, 0xd4d4d4d4, 0xa2a2a2a2, 0xafafafaf, + 0x9c9c9c9c, 0xa4a4a4a4, 0x72727272, 0xc0c0c0c0, + 0xb7b7b7b7, 0xfdfdfdfd, 0x93939393, 0x26262626, + 0x36363636, 0x3f3f3f3f, 0xf7f7f7f7, 0xcccccccc, + 0x34343434, 0xa5a5a5a5, 0xe5e5e5e5, 0xf1f1f1f1, + 0x71717171, 0xd8d8d8d8, 0x31313131, 0x15151515, + 0x04040404, 0xc7c7c7c7, 0x23232323, 0xc3c3c3c3, + 0x18181818, 0x96969696, 0x05050505, 0x9a9a9a9a, + 0x07070707, 0x12121212, 0x80808080, 0xe2e2e2e2, + 0xebebebeb, 0x27272727, 0xb2b2b2b2, 0x75757575, + 0x09090909, 0x83838383, 0x2c2c2c2c, 0x1a1a1a1a, + 0x1b1b1b1b, 0x6e6e6e6e, 0x5a5a5a5a, 0xa0a0a0a0, + 0x52525252, 0x3b3b3b3b, 0xd6d6d6d6, 0xb3b3b3b3, + 0x29292929, 0xe3e3e3e3, 0x2f2f2f2f, 0x84848484, + 0x53535353, 0xd1d1d1d1, 0x00000000, 0xedededed, + 0x20202020, 0xfcfcfcfc, 0xb1b1b1b1, 0x5b5b5b5b, + 0x6a6a6a6a, 0xcbcbcbcb, 0xbebebebe, 0x39393939, + 0x4a4a4a4a, 0x4c4c4c4c, 0x58585858, 0xcfcfcfcf, + 0xd0d0d0d0, 0xefefefef, 0xaaaaaaaa, 0xfbfbfbfb, + 0x43434343, 0x4d4d4d4d, 0x33333333, 0x85858585, + 0x45454545, 0xf9f9f9f9, 0x02020202, 0x7f7f7f7f, + 0x50505050, 0x3c3c3c3c, 0x9f9f9f9f, 0xa8a8a8a8, + 0x51515151, 0xa3a3a3a3, 0x40404040, 0x8f8f8f8f, + 0x92929292, 0x9d9d9d9d, 0x38383838, 0xf5f5f5f5, + 0xbcbcbcbc, 0xb6b6b6b6, 0xdadadada, 0x21212121, + 0x10101010, 0xffffffff, 0xf3f3f3f3, 0xd2d2d2d2, + 0xcdcdcdcd, 0x0c0c0c0c, 0x13131313, 0xecececec, + 0x5f5f5f5f, 0x97979797, 0x44444444, 0x17171717, + 0xc4c4c4c4, 0xa7a7a7a7, 0x7e7e7e7e, 0x3d3d3d3d, + 0x64646464, 0x5d5d5d5d, 0x19191919, 0x73737373, + 0x60606060, 0x81818181, 0x4f4f4f4f, 0xdcdcdcdc, + 0x22222222, 0x2a2a2a2a, 0x90909090, 0x88888888, + 0x46464646, 0xeeeeeeee, 0xb8b8b8b8, 0x14141414, + 0xdededede, 0x5e5e5e5e, 0x0b0b0b0b, 0xdbdbdbdb, + 0xe0e0e0e0, 0x32323232, 0x3a3a3a3a, 0x0a0a0a0a, + 0x49494949, 0x06060606, 0x24242424, 0x5c5c5c5c, + 0xc2c2c2c2, 0xd3d3d3d3, 0xacacacac, 0x62626262, + 0x91919191, 0x95959595, 0xe4e4e4e4, 0x79797979, + 0xe7e7e7e7, 0xc8c8c8c8, 0x37373737, 0x6d6d6d6d, + 0x8d8d8d8d, 0xd5d5d5d5, 0x4e4e4e4e, 0xa9a9a9a9, + 0x6c6c6c6c, 0x56565656, 0xf4f4f4f4, 0xeaeaeaea, + 0x65656565, 0x7a7a7a7a, 0xaeaeaeae, 0x08080808, + 0xbabababa, 0x78787878, 0x25252525, 0x2e2e2e2e, + 0x1c1c1c1c, 0xa6a6a6a6, 0xb4b4b4b4, 0xc6c6c6c6, + 0xe8e8e8e8, 0xdddddddd, 0x74747474, 0x1f1f1f1f, + 0x4b4b4b4b, 0xbdbdbdbd, 0x8b8b8b8b, 0x8a8a8a8a, + 0x70707070, 0x3e3e3e3e, 0xb5b5b5b5, 0x66666666, + 0x48484848, 0x03030303, 0xf6f6f6f6, 0x0e0e0e0e, + 0x61616161, 0x35353535, 0x57575757, 0xb9b9b9b9, + 0x86868686, 0xc1c1c1c1, 0x1d1d1d1d, 0x9e9e9e9e, + 0xe1e1e1e1, 0xf8f8f8f8, 0x98989898, 0x11111111, + 0x69696969, 0xd9d9d9d9, 0x8e8e8e8e, 0x94949494, + 0x9b9b9b9b, 0x1e1e1e1e, 0x87878787, 0xe9e9e9e9, + 0xcececece, 0x55555555, 0x28282828, 0xdfdfdfdf, + 0x8c8c8c8c, 0xa1a1a1a1, 0x89898989, 0x0d0d0d0d, + 0xbfbfbfbf, 0xe6e6e6e6, 0x42424242, 0x68686868, + 0x41414141, 0x99999999, 0x2d2d2d2d, 0x0f0f0f0f, + 0xb0b0b0b0, 0x54545454, 0xbbbbbbbb, 0x16161616, +}; + +__constant u32 td0[256] = +{ + 0x51f4a750, 0x7e416553, 0x1a17a4c3, 0x3a275e96, + 0x3bab6bcb, 0x1f9d45f1, 0xacfa58ab, 0x4be30393, + 0x2030fa55, 0xad766df6, 0x88cc7691, 0xf5024c25, + 0x4fe5d7fc, 0xc52acbd7, 0x26354480, 0xb562a38f, + 0xdeb15a49, 0x25ba1b67, 0x45ea0e98, 0x5dfec0e1, + 0xc32f7502, 0x814cf012, 0x8d4697a3, 0x6bd3f9c6, + 0x038f5fe7, 0x15929c95, 0xbf6d7aeb, 0x955259da, + 0xd4be832d, 0x587421d3, 0x49e06929, 0x8ec9c844, + 0x75c2896a, 0xf48e7978, 0x99583e6b, 0x27b971dd, + 0xbee14fb6, 0xf088ad17, 0xc920ac66, 0x7dce3ab4, + 0x63df4a18, 0xe51a3182, 0x97513360, 0x62537f45, + 0xb16477e0, 0xbb6bae84, 0xfe81a01c, 0xf9082b94, + 0x70486858, 0x8f45fd19, 0x94de6c87, 0x527bf8b7, + 0xab73d323, 0x724b02e2, 0xe31f8f57, 0x6655ab2a, + 0xb2eb2807, 0x2fb5c203, 0x86c57b9a, 0xd33708a5, + 0x302887f2, 0x23bfa5b2, 0x02036aba, 0xed16825c, + 0x8acf1c2b, 0xa779b492, 0xf307f2f0, 0x4e69e2a1, + 0x65daf4cd, 0x0605bed5, 0xd134621f, 0xc4a6fe8a, + 0x342e539d, 0xa2f355a0, 0x058ae132, 0xa4f6eb75, + 0x0b83ec39, 0x4060efaa, 0x5e719f06, 0xbd6e1051, + 0x3e218af9, 0x96dd063d, 0xdd3e05ae, 0x4de6bd46, + 0x91548db5, 0x71c45d05, 0x0406d46f, 0x605015ff, + 0x1998fb24, 0xd6bde997, 0x894043cc, 0x67d99e77, + 0xb0e842bd, 0x07898b88, 0xe7195b38, 0x79c8eedb, + 0xa17c0a47, 0x7c420fe9, 0xf8841ec9, 0x00000000, + 0x09808683, 0x322bed48, 0x1e1170ac, 0x6c5a724e, + 0xfd0efffb, 0x0f853856, 0x3daed51e, 0x362d3927, + 0x0a0fd964, 0x685ca621, 0x9b5b54d1, 0x24362e3a, + 0x0c0a67b1, 0x9357e70f, 0xb4ee96d2, 0x1b9b919e, + 0x80c0c54f, 0x61dc20a2, 0x5a774b69, 0x1c121a16, + 0xe293ba0a, 0xc0a02ae5, 0x3c22e043, 0x121b171d, + 0x0e090d0b, 0xf28bc7ad, 0x2db6a8b9, 0x141ea9c8, + 0x57f11985, 0xaf75074c, 0xee99ddbb, 0xa37f60fd, + 0xf701269f, 0x5c72f5bc, 0x44663bc5, 0x5bfb7e34, + 0x8b432976, 0xcb23c6dc, 0xb6edfc68, 0xb8e4f163, + 0xd731dcca, 0x42638510, 0x13972240, 0x84c61120, + 0x854a247d, 0xd2bb3df8, 0xaef93211, 0xc729a16d, + 0x1d9e2f4b, 0xdcb230f3, 0x0d8652ec, 0x77c1e3d0, + 0x2bb3166c, 0xa970b999, 0x119448fa, 0x47e96422, + 0xa8fc8cc4, 0xa0f03f1a, 0x567d2cd8, 0x223390ef, + 0x87494ec7, 0xd938d1c1, 0x8ccaa2fe, 0x98d40b36, + 0xa6f581cf, 0xa57ade28, 0xdab78e26, 0x3fadbfa4, + 0x2c3a9de4, 0x5078920d, 0x6a5fcc9b, 0x547e4662, + 0xf68d13c2, 0x90d8b8e8, 0x2e39f75e, 0x82c3aff5, + 0x9f5d80be, 0x69d0937c, 0x6fd52da9, 0xcf2512b3, + 0xc8ac993b, 0x10187da7, 0xe89c636e, 0xdb3bbb7b, + 0xcd267809, 0x6e5918f4, 0xec9ab701, 0x834f9aa8, + 0xe6956e65, 0xaaffe67e, 0x21bccf08, 0xef15e8e6, + 0xbae79bd9, 0x4a6f36ce, 0xea9f09d4, 0x29b07cd6, + 0x31a4b2af, 0x2a3f2331, 0xc6a59430, 0x35a266c0, + 0x744ebc37, 0xfc82caa6, 0xe090d0b0, 0x33a7d815, + 0xf104984a, 0x41ecdaf7, 0x7fcd500e, 0x1791f62f, + 0x764dd68d, 0x43efb04d, 0xccaa4d54, 0xe49604df, + 0x9ed1b5e3, 0x4c6a881b, 0xc12c1fb8, 0x4665517f, + 0x9d5eea04, 0x018c355d, 0xfa877473, 0xfb0b412e, + 0xb3671d5a, 0x92dbd252, 0xe9105633, 0x6dd64713, + 0x9ad7618c, 0x37a10c7a, 0x59f8148e, 0xeb133c89, + 0xcea927ee, 0xb761c935, 0xe11ce5ed, 0x7a47b13c, + 0x9cd2df59, 0x55f2733f, 0x1814ce79, 0x73c737bf, + 0x53f7cdea, 0x5ffdaa5b, 0xdf3d6f14, 0x7844db86, + 0xcaaff381, 0xb968c43e, 0x3824342c, 0xc2a3405f, + 0x161dc372, 0xbce2250c, 0x283c498b, 0xff0d9541, + 0x39a80171, 0x080cb3de, 0xd8b4e49c, 0x6456c190, + 0x7bcb8461, 0xd532b670, 0x486c5c74, 0xd0b85742, +}; + +__constant u32 td1[256] = +{ + 0x5051f4a7, 0x537e4165, 0xc31a17a4, 0x963a275e, + 0xcb3bab6b, 0xf11f9d45, 0xabacfa58, 0x934be303, + 0x552030fa, 0xf6ad766d, 0x9188cc76, 0x25f5024c, + 0xfc4fe5d7, 0xd7c52acb, 0x80263544, 0x8fb562a3, + 0x49deb15a, 0x6725ba1b, 0x9845ea0e, 0xe15dfec0, + 0x02c32f75, 0x12814cf0, 0xa38d4697, 0xc66bd3f9, + 0xe7038f5f, 0x9515929c, 0xebbf6d7a, 0xda955259, + 0x2dd4be83, 0xd3587421, 0x2949e069, 0x448ec9c8, + 0x6a75c289, 0x78f48e79, 0x6b99583e, 0xdd27b971, + 0xb6bee14f, 0x17f088ad, 0x66c920ac, 0xb47dce3a, + 0x1863df4a, 0x82e51a31, 0x60975133, 0x4562537f, + 0xe0b16477, 0x84bb6bae, 0x1cfe81a0, 0x94f9082b, + 0x58704868, 0x198f45fd, 0x8794de6c, 0xb7527bf8, + 0x23ab73d3, 0xe2724b02, 0x57e31f8f, 0x2a6655ab, + 0x07b2eb28, 0x032fb5c2, 0x9a86c57b, 0xa5d33708, + 0xf2302887, 0xb223bfa5, 0xba02036a, 0x5ced1682, + 0x2b8acf1c, 0x92a779b4, 0xf0f307f2, 0xa14e69e2, + 0xcd65daf4, 0xd50605be, 0x1fd13462, 0x8ac4a6fe, + 0x9d342e53, 0xa0a2f355, 0x32058ae1, 0x75a4f6eb, + 0x390b83ec, 0xaa4060ef, 0x065e719f, 0x51bd6e10, + 0xf93e218a, 0x3d96dd06, 0xaedd3e05, 0x464de6bd, + 0xb591548d, 0x0571c45d, 0x6f0406d4, 0xff605015, + 0x241998fb, 0x97d6bde9, 0xcc894043, 0x7767d99e, + 0xbdb0e842, 0x8807898b, 0x38e7195b, 0xdb79c8ee, + 0x47a17c0a, 0xe97c420f, 0xc9f8841e, 0x00000000, + 0x83098086, 0x48322bed, 0xac1e1170, 0x4e6c5a72, + 0xfbfd0eff, 0x560f8538, 0x1e3daed5, 0x27362d39, + 0x640a0fd9, 0x21685ca6, 0xd19b5b54, 0x3a24362e, + 0xb10c0a67, 0x0f9357e7, 0xd2b4ee96, 0x9e1b9b91, + 0x4f80c0c5, 0xa261dc20, 0x695a774b, 0x161c121a, + 0x0ae293ba, 0xe5c0a02a, 0x433c22e0, 0x1d121b17, + 0x0b0e090d, 0xadf28bc7, 0xb92db6a8, 0xc8141ea9, + 0x8557f119, 0x4caf7507, 0xbbee99dd, 0xfda37f60, + 0x9ff70126, 0xbc5c72f5, 0xc544663b, 0x345bfb7e, + 0x768b4329, 0xdccb23c6, 0x68b6edfc, 0x63b8e4f1, + 0xcad731dc, 0x10426385, 0x40139722, 0x2084c611, + 0x7d854a24, 0xf8d2bb3d, 0x11aef932, 0x6dc729a1, + 0x4b1d9e2f, 0xf3dcb230, 0xec0d8652, 0xd077c1e3, + 0x6c2bb316, 0x99a970b9, 0xfa119448, 0x2247e964, + 0xc4a8fc8c, 0x1aa0f03f, 0xd8567d2c, 0xef223390, + 0xc787494e, 0xc1d938d1, 0xfe8ccaa2, 0x3698d40b, + 0xcfa6f581, 0x28a57ade, 0x26dab78e, 0xa43fadbf, + 0xe42c3a9d, 0x0d507892, 0x9b6a5fcc, 0x62547e46, + 0xc2f68d13, 0xe890d8b8, 0x5e2e39f7, 0xf582c3af, + 0xbe9f5d80, 0x7c69d093, 0xa96fd52d, 0xb3cf2512, + 0x3bc8ac99, 0xa710187d, 0x6ee89c63, 0x7bdb3bbb, + 0x09cd2678, 0xf46e5918, 0x01ec9ab7, 0xa8834f9a, + 0x65e6956e, 0x7eaaffe6, 0x0821bccf, 0xe6ef15e8, + 0xd9bae79b, 0xce4a6f36, 0xd4ea9f09, 0xd629b07c, + 0xaf31a4b2, 0x312a3f23, 0x30c6a594, 0xc035a266, + 0x37744ebc, 0xa6fc82ca, 0xb0e090d0, 0x1533a7d8, + 0x4af10498, 0xf741ecda, 0x0e7fcd50, 0x2f1791f6, + 0x8d764dd6, 0x4d43efb0, 0x54ccaa4d, 0xdfe49604, + 0xe39ed1b5, 0x1b4c6a88, 0xb8c12c1f, 0x7f466551, + 0x049d5eea, 0x5d018c35, 0x73fa8774, 0x2efb0b41, + 0x5ab3671d, 0x5292dbd2, 0x33e91056, 0x136dd647, + 0x8c9ad761, 0x7a37a10c, 0x8e59f814, 0x89eb133c, + 0xeecea927, 0x35b761c9, 0xede11ce5, 0x3c7a47b1, + 0x599cd2df, 0x3f55f273, 0x791814ce, 0xbf73c737, + 0xea53f7cd, 0x5b5ffdaa, 0x14df3d6f, 0x867844db, + 0x81caaff3, 0x3eb968c4, 0x2c382434, 0x5fc2a340, + 0x72161dc3, 0x0cbce225, 0x8b283c49, 0x41ff0d95, + 0x7139a801, 0xde080cb3, 0x9cd8b4e4, 0x906456c1, + 0x617bcb84, 0x70d532b6, 0x74486c5c, 0x42d0b857, +}; + +__constant u32 td2[256] = +{ + 0xa75051f4, 0x65537e41, 0xa4c31a17, 0x5e963a27, + 0x6bcb3bab, 0x45f11f9d, 0x58abacfa, 0x03934be3, + 0xfa552030, 0x6df6ad76, 0x769188cc, 0x4c25f502, + 0xd7fc4fe5, 0xcbd7c52a, 0x44802635, 0xa38fb562, + 0x5a49deb1, 0x1b6725ba, 0x0e9845ea, 0xc0e15dfe, + 0x7502c32f, 0xf012814c, 0x97a38d46, 0xf9c66bd3, + 0x5fe7038f, 0x9c951592, 0x7aebbf6d, 0x59da9552, + 0x832dd4be, 0x21d35874, 0x692949e0, 0xc8448ec9, + 0x896a75c2, 0x7978f48e, 0x3e6b9958, 0x71dd27b9, + 0x4fb6bee1, 0xad17f088, 0xac66c920, 0x3ab47dce, + 0x4a1863df, 0x3182e51a, 0x33609751, 0x7f456253, + 0x77e0b164, 0xae84bb6b, 0xa01cfe81, 0x2b94f908, + 0x68587048, 0xfd198f45, 0x6c8794de, 0xf8b7527b, + 0xd323ab73, 0x02e2724b, 0x8f57e31f, 0xab2a6655, + 0x2807b2eb, 0xc2032fb5, 0x7b9a86c5, 0x08a5d337, + 0x87f23028, 0xa5b223bf, 0x6aba0203, 0x825ced16, + 0x1c2b8acf, 0xb492a779, 0xf2f0f307, 0xe2a14e69, + 0xf4cd65da, 0xbed50605, 0x621fd134, 0xfe8ac4a6, + 0x539d342e, 0x55a0a2f3, 0xe132058a, 0xeb75a4f6, + 0xec390b83, 0xefaa4060, 0x9f065e71, 0x1051bd6e, + 0x8af93e21, 0x063d96dd, 0x05aedd3e, 0xbd464de6, + 0x8db59154, 0x5d0571c4, 0xd46f0406, 0x15ff6050, + 0xfb241998, 0xe997d6bd, 0x43cc8940, 0x9e7767d9, + 0x42bdb0e8, 0x8b880789, 0x5b38e719, 0xeedb79c8, + 0x0a47a17c, 0x0fe97c42, 0x1ec9f884, 0x00000000, + 0x86830980, 0xed48322b, 0x70ac1e11, 0x724e6c5a, + 0xfffbfd0e, 0x38560f85, 0xd51e3dae, 0x3927362d, + 0xd9640a0f, 0xa621685c, 0x54d19b5b, 0x2e3a2436, + 0x67b10c0a, 0xe70f9357, 0x96d2b4ee, 0x919e1b9b, + 0xc54f80c0, 0x20a261dc, 0x4b695a77, 0x1a161c12, + 0xba0ae293, 0x2ae5c0a0, 0xe0433c22, 0x171d121b, + 0x0d0b0e09, 0xc7adf28b, 0xa8b92db6, 0xa9c8141e, + 0x198557f1, 0x074caf75, 0xddbbee99, 0x60fda37f, + 0x269ff701, 0xf5bc5c72, 0x3bc54466, 0x7e345bfb, + 0x29768b43, 0xc6dccb23, 0xfc68b6ed, 0xf163b8e4, + 0xdccad731, 0x85104263, 0x22401397, 0x112084c6, + 0x247d854a, 0x3df8d2bb, 0x3211aef9, 0xa16dc729, + 0x2f4b1d9e, 0x30f3dcb2, 0x52ec0d86, 0xe3d077c1, + 0x166c2bb3, 0xb999a970, 0x48fa1194, 0x642247e9, + 0x8cc4a8fc, 0x3f1aa0f0, 0x2cd8567d, 0x90ef2233, + 0x4ec78749, 0xd1c1d938, 0xa2fe8cca, 0x0b3698d4, + 0x81cfa6f5, 0xde28a57a, 0x8e26dab7, 0xbfa43fad, + 0x9de42c3a, 0x920d5078, 0xcc9b6a5f, 0x4662547e, + 0x13c2f68d, 0xb8e890d8, 0xf75e2e39, 0xaff582c3, + 0x80be9f5d, 0x937c69d0, 0x2da96fd5, 0x12b3cf25, + 0x993bc8ac, 0x7da71018, 0x636ee89c, 0xbb7bdb3b, + 0x7809cd26, 0x18f46e59, 0xb701ec9a, 0x9aa8834f, + 0x6e65e695, 0xe67eaaff, 0xcf0821bc, 0xe8e6ef15, + 0x9bd9bae7, 0x36ce4a6f, 0x09d4ea9f, 0x7cd629b0, + 0xb2af31a4, 0x23312a3f, 0x9430c6a5, 0x66c035a2, + 0xbc37744e, 0xcaa6fc82, 0xd0b0e090, 0xd81533a7, + 0x984af104, 0xdaf741ec, 0x500e7fcd, 0xf62f1791, + 0xd68d764d, 0xb04d43ef, 0x4d54ccaa, 0x04dfe496, + 0xb5e39ed1, 0x881b4c6a, 0x1fb8c12c, 0x517f4665, + 0xea049d5e, 0x355d018c, 0x7473fa87, 0x412efb0b, + 0x1d5ab367, 0xd25292db, 0x5633e910, 0x47136dd6, + 0x618c9ad7, 0x0c7a37a1, 0x148e59f8, 0x3c89eb13, + 0x27eecea9, 0xc935b761, 0xe5ede11c, 0xb13c7a47, + 0xdf599cd2, 0x733f55f2, 0xce791814, 0x37bf73c7, + 0xcdea53f7, 0xaa5b5ffd, 0x6f14df3d, 0xdb867844, + 0xf381caaf, 0xc43eb968, 0x342c3824, 0x405fc2a3, + 0xc372161d, 0x250cbce2, 0x498b283c, 0x9541ff0d, + 0x017139a8, 0xb3de080c, 0xe49cd8b4, 0xc1906456, + 0x84617bcb, 0xb670d532, 0x5c74486c, 0x5742d0b8, +}; + +__constant u32 td3[256] = +{ + 0xf4a75051, 0x4165537e, 0x17a4c31a, 0x275e963a, + 0xab6bcb3b, 0x9d45f11f, 0xfa58abac, 0xe303934b, + 0x30fa5520, 0x766df6ad, 0xcc769188, 0x024c25f5, + 0xe5d7fc4f, 0x2acbd7c5, 0x35448026, 0x62a38fb5, + 0xb15a49de, 0xba1b6725, 0xea0e9845, 0xfec0e15d, + 0x2f7502c3, 0x4cf01281, 0x4697a38d, 0xd3f9c66b, + 0x8f5fe703, 0x929c9515, 0x6d7aebbf, 0x5259da95, + 0xbe832dd4, 0x7421d358, 0xe0692949, 0xc9c8448e, + 0xc2896a75, 0x8e7978f4, 0x583e6b99, 0xb971dd27, + 0xe14fb6be, 0x88ad17f0, 0x20ac66c9, 0xce3ab47d, + 0xdf4a1863, 0x1a3182e5, 0x51336097, 0x537f4562, + 0x6477e0b1, 0x6bae84bb, 0x81a01cfe, 0x082b94f9, + 0x48685870, 0x45fd198f, 0xde6c8794, 0x7bf8b752, + 0x73d323ab, 0x4b02e272, 0x1f8f57e3, 0x55ab2a66, + 0xeb2807b2, 0xb5c2032f, 0xc57b9a86, 0x3708a5d3, + 0x2887f230, 0xbfa5b223, 0x036aba02, 0x16825ced, + 0xcf1c2b8a, 0x79b492a7, 0x07f2f0f3, 0x69e2a14e, + 0xdaf4cd65, 0x05bed506, 0x34621fd1, 0xa6fe8ac4, + 0x2e539d34, 0xf355a0a2, 0x8ae13205, 0xf6eb75a4, + 0x83ec390b, 0x60efaa40, 0x719f065e, 0x6e1051bd, + 0x218af93e, 0xdd063d96, 0x3e05aedd, 0xe6bd464d, + 0x548db591, 0xc45d0571, 0x06d46f04, 0x5015ff60, + 0x98fb2419, 0xbde997d6, 0x4043cc89, 0xd99e7767, + 0xe842bdb0, 0x898b8807, 0x195b38e7, 0xc8eedb79, + 0x7c0a47a1, 0x420fe97c, 0x841ec9f8, 0x00000000, + 0x80868309, 0x2bed4832, 0x1170ac1e, 0x5a724e6c, + 0x0efffbfd, 0x8538560f, 0xaed51e3d, 0x2d392736, + 0x0fd9640a, 0x5ca62168, 0x5b54d19b, 0x362e3a24, + 0x0a67b10c, 0x57e70f93, 0xee96d2b4, 0x9b919e1b, + 0xc0c54f80, 0xdc20a261, 0x774b695a, 0x121a161c, + 0x93ba0ae2, 0xa02ae5c0, 0x22e0433c, 0x1b171d12, + 0x090d0b0e, 0x8bc7adf2, 0xb6a8b92d, 0x1ea9c814, + 0xf1198557, 0x75074caf, 0x99ddbbee, 0x7f60fda3, + 0x01269ff7, 0x72f5bc5c, 0x663bc544, 0xfb7e345b, + 0x4329768b, 0x23c6dccb, 0xedfc68b6, 0xe4f163b8, + 0x31dccad7, 0x63851042, 0x97224013, 0xc6112084, + 0x4a247d85, 0xbb3df8d2, 0xf93211ae, 0x29a16dc7, + 0x9e2f4b1d, 0xb230f3dc, 0x8652ec0d, 0xc1e3d077, + 0xb3166c2b, 0x70b999a9, 0x9448fa11, 0xe9642247, + 0xfc8cc4a8, 0xf03f1aa0, 0x7d2cd856, 0x3390ef22, + 0x494ec787, 0x38d1c1d9, 0xcaa2fe8c, 0xd40b3698, + 0xf581cfa6, 0x7ade28a5, 0xb78e26da, 0xadbfa43f, + 0x3a9de42c, 0x78920d50, 0x5fcc9b6a, 0x7e466254, + 0x8d13c2f6, 0xd8b8e890, 0x39f75e2e, 0xc3aff582, + 0x5d80be9f, 0xd0937c69, 0xd52da96f, 0x2512b3cf, + 0xac993bc8, 0x187da710, 0x9c636ee8, 0x3bbb7bdb, + 0x267809cd, 0x5918f46e, 0x9ab701ec, 0x4f9aa883, + 0x956e65e6, 0xffe67eaa, 0xbccf0821, 0x15e8e6ef, + 0xe79bd9ba, 0x6f36ce4a, 0x9f09d4ea, 0xb07cd629, + 0xa4b2af31, 0x3f23312a, 0xa59430c6, 0xa266c035, + 0x4ebc3774, 0x82caa6fc, 0x90d0b0e0, 0xa7d81533, + 0x04984af1, 0xecdaf741, 0xcd500e7f, 0x91f62f17, + 0x4dd68d76, 0xefb04d43, 0xaa4d54cc, 0x9604dfe4, + 0xd1b5e39e, 0x6a881b4c, 0x2c1fb8c1, 0x65517f46, + 0x5eea049d, 0x8c355d01, 0x877473fa, 0x0b412efb, + 0x671d5ab3, 0xdbd25292, 0x105633e9, 0xd647136d, + 0xd7618c9a, 0xa10c7a37, 0xf8148e59, 0x133c89eb, + 0xa927eece, 0x61c935b7, 0x1ce5ede1, 0x47b13c7a, + 0xd2df599c, 0xf2733f55, 0x14ce7918, 0xc737bf73, + 0xf7cdea53, 0xfdaa5b5f, 0x3d6f14df, 0x44db8678, + 0xaff381ca, 0x68c43eb9, 0x24342c38, 0xa3405fc2, + 0x1dc37216, 0xe2250cbc, 0x3c498b28, 0x0d9541ff, + 0xa8017139, 0x0cb3de08, 0xb4e49cd8, 0x56c19064, + 0xcb84617b, 0x32b670d5, 0x6c5c7448, 0xb85742d0, +}; + +__constant u32 td4[256] = +{ + 0x52525252, 0x09090909, 0x6a6a6a6a, 0xd5d5d5d5, + 0x30303030, 0x36363636, 0xa5a5a5a5, 0x38383838, + 0xbfbfbfbf, 0x40404040, 0xa3a3a3a3, 0x9e9e9e9e, + 0x81818181, 0xf3f3f3f3, 0xd7d7d7d7, 0xfbfbfbfb, + 0x7c7c7c7c, 0xe3e3e3e3, 0x39393939, 0x82828282, + 0x9b9b9b9b, 0x2f2f2f2f, 0xffffffff, 0x87878787, + 0x34343434, 0x8e8e8e8e, 0x43434343, 0x44444444, + 0xc4c4c4c4, 0xdededede, 0xe9e9e9e9, 0xcbcbcbcb, + 0x54545454, 0x7b7b7b7b, 0x94949494, 0x32323232, + 0xa6a6a6a6, 0xc2c2c2c2, 0x23232323, 0x3d3d3d3d, + 0xeeeeeeee, 0x4c4c4c4c, 0x95959595, 0x0b0b0b0b, + 0x42424242, 0xfafafafa, 0xc3c3c3c3, 0x4e4e4e4e, + 0x08080808, 0x2e2e2e2e, 0xa1a1a1a1, 0x66666666, + 0x28282828, 0xd9d9d9d9, 0x24242424, 0xb2b2b2b2, + 0x76767676, 0x5b5b5b5b, 0xa2a2a2a2, 0x49494949, + 0x6d6d6d6d, 0x8b8b8b8b, 0xd1d1d1d1, 0x25252525, + 0x72727272, 0xf8f8f8f8, 0xf6f6f6f6, 0x64646464, + 0x86868686, 0x68686868, 0x98989898, 0x16161616, + 0xd4d4d4d4, 0xa4a4a4a4, 0x5c5c5c5c, 0xcccccccc, + 0x5d5d5d5d, 0x65656565, 0xb6b6b6b6, 0x92929292, + 0x6c6c6c6c, 0x70707070, 0x48484848, 0x50505050, + 0xfdfdfdfd, 0xedededed, 0xb9b9b9b9, 0xdadadada, + 0x5e5e5e5e, 0x15151515, 0x46464646, 0x57575757, + 0xa7a7a7a7, 0x8d8d8d8d, 0x9d9d9d9d, 0x84848484, + 0x90909090, 0xd8d8d8d8, 0xabababab, 0x00000000, + 0x8c8c8c8c, 0xbcbcbcbc, 0xd3d3d3d3, 0x0a0a0a0a, + 0xf7f7f7f7, 0xe4e4e4e4, 0x58585858, 0x05050505, + 0xb8b8b8b8, 0xb3b3b3b3, 0x45454545, 0x06060606, + 0xd0d0d0d0, 0x2c2c2c2c, 0x1e1e1e1e, 0x8f8f8f8f, + 0xcacacaca, 0x3f3f3f3f, 0x0f0f0f0f, 0x02020202, + 0xc1c1c1c1, 0xafafafaf, 0xbdbdbdbd, 0x03030303, + 0x01010101, 0x13131313, 0x8a8a8a8a, 0x6b6b6b6b, + 0x3a3a3a3a, 0x91919191, 0x11111111, 0x41414141, + 0x4f4f4f4f, 0x67676767, 0xdcdcdcdc, 0xeaeaeaea, + 0x97979797, 0xf2f2f2f2, 0xcfcfcfcf, 0xcececece, + 0xf0f0f0f0, 0xb4b4b4b4, 0xe6e6e6e6, 0x73737373, + 0x96969696, 0xacacacac, 0x74747474, 0x22222222, + 0xe7e7e7e7, 0xadadadad, 0x35353535, 0x85858585, + 0xe2e2e2e2, 0xf9f9f9f9, 0x37373737, 0xe8e8e8e8, + 0x1c1c1c1c, 0x75757575, 0xdfdfdfdf, 0x6e6e6e6e, + 0x47474747, 0xf1f1f1f1, 0x1a1a1a1a, 0x71717171, + 0x1d1d1d1d, 0x29292929, 0xc5c5c5c5, 0x89898989, + 0x6f6f6f6f, 0xb7b7b7b7, 0x62626262, 0x0e0e0e0e, + 0xaaaaaaaa, 0x18181818, 0xbebebebe, 0x1b1b1b1b, + 0xfcfcfcfc, 0x56565656, 0x3e3e3e3e, 0x4b4b4b4b, + 0xc6c6c6c6, 0xd2d2d2d2, 0x79797979, 0x20202020, + 0x9a9a9a9a, 0xdbdbdbdb, 0xc0c0c0c0, 0xfefefefe, + 0x78787878, 0xcdcdcdcd, 0x5a5a5a5a, 0xf4f4f4f4, + 0x1f1f1f1f, 0xdddddddd, 0xa8a8a8a8, 0x33333333, + 0x88888888, 0x07070707, 0xc7c7c7c7, 0x31313131, + 0xb1b1b1b1, 0x12121212, 0x10101010, 0x59595959, + 0x27272727, 0x80808080, 0xecececec, 0x5f5f5f5f, + 0x60606060, 0x51515151, 0x7f7f7f7f, 0xa9a9a9a9, + 0x19191919, 0xb5b5b5b5, 0x4a4a4a4a, 0x0d0d0d0d, + 0x2d2d2d2d, 0xe5e5e5e5, 0x7a7a7a7a, 0x9f9f9f9f, + 0x93939393, 0xc9c9c9c9, 0x9c9c9c9c, 0xefefefef, + 0xa0a0a0a0, 0xe0e0e0e0, 0x3b3b3b3b, 0x4d4d4d4d, + 0xaeaeaeae, 0x2a2a2a2a, 0xf5f5f5f5, 0xb0b0b0b0, + 0xc8c8c8c8, 0xebebebeb, 0xbbbbbbbb, 0x3c3c3c3c, + 0x83838383, 0x53535353, 0x99999999, 0x61616161, + 0x17171717, 0x2b2b2b2b, 0x04040404, 0x7e7e7e7e, + 0xbabababa, 0x77777777, 0xd6d6d6d6, 0x26262626, + 0xe1e1e1e1, 0x69696969, 0x14141414, 0x63636363, + 0x55555555, 0x21212121, 0x0c0c0c0c, 0x7d7d7d7d, +}; + +__constant u32 rcon[] = +{ + 0x01000000, 0x02000000, 0x04000000, 0x08000000, + 0x10000000, 0x20000000, 0x40000000, 0x80000000, + 0x1b000000, 0x36000000, +}; + +static void AES128_ExpandKey (u32 *userkey, u32 *rek, __local u32 s_te0[256], __local u32 s_te1[256], __local u32 s_te2[256], __local u32 s_te3[256], __local u32 s_te4[256]) +{ + rek[0] = userkey[0]; + rek[1] = userkey[1]; + rek[2] = userkey[2]; + rek[3] = userkey[3]; + + for (u32 i = 0, j = 0; i < 10; i += 1, j += 4) + { + u32 temp = rek[j + 3]; + + temp = (s_te2[(temp >> 16) & 0xff] & 0xff000000) + ^ (s_te3[(temp >> 8) & 0xff] & 0x00ff0000) + ^ (s_te0[(temp >> 0) & 0xff] & 0x0000ff00) + ^ (s_te1[(temp >> 24) & 0xff] & 0x000000ff); + + rek[j + 4] = rek[j + 0] + ^ temp + ^ rcon[i]; + + rek[j + 5] = rek[j + 1] ^ rek[j + 4]; + rek[j + 6] = rek[j + 2] ^ rek[j + 5]; + rek[j + 7] = rek[j + 3] ^ rek[j + 6]; + } +} + +static void AES128_InvertKey (u32 *rdk, __local u32 s_td0[256], __local u32 s_td1[256], __local u32 s_td2[256], __local u32 s_td3[256], __local u32 s_td4[256], __local u32 s_te0[256], __local u32 s_te1[256], __local u32 s_te2[256], __local u32 s_te3[256], __local u32 s_te4[256]) +{ + for (u32 i = 0, j = 40; i < j; i += 4, j -= 4) + { + u32 temp; + + temp = rdk[i + 0]; rdk[i + 0] = rdk[j + 0]; rdk[j + 0] = temp; + temp = rdk[i + 1]; rdk[i + 1] = rdk[j + 1]; rdk[j + 1] = temp; + temp = rdk[i + 2]; rdk[i + 2] = rdk[j + 2]; rdk[j + 2] = temp; + temp = rdk[i + 3]; rdk[i + 3] = rdk[j + 3]; rdk[j + 3] = temp; + } + + for (u32 i = 1, j = 4; i < 10; i += 1, j += 4) + { + rdk[j + 0] = + s_td0[s_te1[(rdk[j + 0] >> 24) & 0xff] & 0xff] ^ + s_td1[s_te1[(rdk[j + 0] >> 16) & 0xff] & 0xff] ^ + s_td2[s_te1[(rdk[j + 0] >> 8) & 0xff] & 0xff] ^ + s_td3[s_te1[(rdk[j + 0] >> 0) & 0xff] & 0xff]; + + rdk[j + 1] = + s_td0[s_te1[(rdk[j + 1] >> 24) & 0xff] & 0xff] ^ + s_td1[s_te1[(rdk[j + 1] >> 16) & 0xff] & 0xff] ^ + s_td2[s_te1[(rdk[j + 1] >> 8) & 0xff] & 0xff] ^ + s_td3[s_te1[(rdk[j + 1] >> 0) & 0xff] & 0xff]; + + rdk[j + 2] = + s_td0[s_te1[(rdk[j + 2] >> 24) & 0xff] & 0xff] ^ + s_td1[s_te1[(rdk[j + 2] >> 16) & 0xff] & 0xff] ^ + s_td2[s_te1[(rdk[j + 2] >> 8) & 0xff] & 0xff] ^ + s_td3[s_te1[(rdk[j + 2] >> 0) & 0xff] & 0xff]; + + rdk[j + 3] = + s_td0[s_te1[(rdk[j + 3] >> 24) & 0xff] & 0xff] ^ + s_td1[s_te1[(rdk[j + 3] >> 16) & 0xff] & 0xff] ^ + s_td2[s_te1[(rdk[j + 3] >> 8) & 0xff] & 0xff] ^ + s_td3[s_te1[(rdk[j + 3] >> 0) & 0xff] & 0xff]; + } +} + +static void AES128_encrypt (const u32 *in, u32 *out, const u32 *rek, __local u32 s_te0[256], __local u32 s_te1[256], __local u32 s_te2[256], __local u32 s_te3[256], __local u32 s_te4[256]) +{ + u32 s0 = in[0] ^ rek[0]; + u32 s1 = in[1] ^ rek[1]; + u32 s2 = in[2] ^ rek[2]; + u32 s3 = in[3] ^ rek[3]; + + u32 t0; + u32 t1; + u32 t2; + u32 t3; + + t0 = s_te0[s0 >> 24] ^ s_te1[(s1 >> 16) & 0xff] ^ s_te2[(s2 >> 8) & 0xff] ^ s_te3[s3 & 0xff] ^ rek[ 4]; + t1 = s_te0[s1 >> 24] ^ s_te1[(s2 >> 16) & 0xff] ^ s_te2[(s3 >> 8) & 0xff] ^ s_te3[s0 & 0xff] ^ rek[ 5]; + t2 = s_te0[s2 >> 24] ^ s_te1[(s3 >> 16) & 0xff] ^ s_te2[(s0 >> 8) & 0xff] ^ s_te3[s1 & 0xff] ^ rek[ 6]; + t3 = s_te0[s3 >> 24] ^ s_te1[(s0 >> 16) & 0xff] ^ s_te2[(s1 >> 8) & 0xff] ^ s_te3[s2 & 0xff] ^ rek[ 7]; + s0 = s_te0[t0 >> 24] ^ s_te1[(t1 >> 16) & 0xff] ^ s_te2[(t2 >> 8) & 0xff] ^ s_te3[t3 & 0xff] ^ rek[ 8]; + s1 = s_te0[t1 >> 24] ^ s_te1[(t2 >> 16) & 0xff] ^ s_te2[(t3 >> 8) & 0xff] ^ s_te3[t0 & 0xff] ^ rek[ 9]; + s2 = s_te0[t2 >> 24] ^ s_te1[(t3 >> 16) & 0xff] ^ s_te2[(t0 >> 8) & 0xff] ^ s_te3[t1 & 0xff] ^ rek[10]; + s3 = s_te0[t3 >> 24] ^ s_te1[(t0 >> 16) & 0xff] ^ s_te2[(t1 >> 8) & 0xff] ^ s_te3[t2 & 0xff] ^ rek[11]; + t0 = s_te0[s0 >> 24] ^ s_te1[(s1 >> 16) & 0xff] ^ s_te2[(s2 >> 8) & 0xff] ^ s_te3[s3 & 0xff] ^ rek[12]; + t1 = s_te0[s1 >> 24] ^ s_te1[(s2 >> 16) & 0xff] ^ s_te2[(s3 >> 8) & 0xff] ^ s_te3[s0 & 0xff] ^ rek[13]; + t2 = s_te0[s2 >> 24] ^ s_te1[(s3 >> 16) & 0xff] ^ s_te2[(s0 >> 8) & 0xff] ^ s_te3[s1 & 0xff] ^ rek[14]; + t3 = s_te0[s3 >> 24] ^ s_te1[(s0 >> 16) & 0xff] ^ s_te2[(s1 >> 8) & 0xff] ^ s_te3[s2 & 0xff] ^ rek[15]; + s0 = s_te0[t0 >> 24] ^ s_te1[(t1 >> 16) & 0xff] ^ s_te2[(t2 >> 8) & 0xff] ^ s_te3[t3 & 0xff] ^ rek[16]; + s1 = s_te0[t1 >> 24] ^ s_te1[(t2 >> 16) & 0xff] ^ s_te2[(t3 >> 8) & 0xff] ^ s_te3[t0 & 0xff] ^ rek[17]; + s2 = s_te0[t2 >> 24] ^ s_te1[(t3 >> 16) & 0xff] ^ s_te2[(t0 >> 8) & 0xff] ^ s_te3[t1 & 0xff] ^ rek[18]; + s3 = s_te0[t3 >> 24] ^ s_te1[(t0 >> 16) & 0xff] ^ s_te2[(t1 >> 8) & 0xff] ^ s_te3[t2 & 0xff] ^ rek[19]; + t0 = s_te0[s0 >> 24] ^ s_te1[(s1 >> 16) & 0xff] ^ s_te2[(s2 >> 8) & 0xff] ^ s_te3[s3 & 0xff] ^ rek[20]; + t1 = s_te0[s1 >> 24] ^ s_te1[(s2 >> 16) & 0xff] ^ s_te2[(s3 >> 8) & 0xff] ^ s_te3[s0 & 0xff] ^ rek[21]; + t2 = s_te0[s2 >> 24] ^ s_te1[(s3 >> 16) & 0xff] ^ s_te2[(s0 >> 8) & 0xff] ^ s_te3[s1 & 0xff] ^ rek[22]; + t3 = s_te0[s3 >> 24] ^ s_te1[(s0 >> 16) & 0xff] ^ s_te2[(s1 >> 8) & 0xff] ^ s_te3[s2 & 0xff] ^ rek[23]; + s0 = s_te0[t0 >> 24] ^ s_te1[(t1 >> 16) & 0xff] ^ s_te2[(t2 >> 8) & 0xff] ^ s_te3[t3 & 0xff] ^ rek[24]; + s1 = s_te0[t1 >> 24] ^ s_te1[(t2 >> 16) & 0xff] ^ s_te2[(t3 >> 8) & 0xff] ^ s_te3[t0 & 0xff] ^ rek[25]; + s2 = s_te0[t2 >> 24] ^ s_te1[(t3 >> 16) & 0xff] ^ s_te2[(t0 >> 8) & 0xff] ^ s_te3[t1 & 0xff] ^ rek[26]; + s3 = s_te0[t3 >> 24] ^ s_te1[(t0 >> 16) & 0xff] ^ s_te2[(t1 >> 8) & 0xff] ^ s_te3[t2 & 0xff] ^ rek[27]; + t0 = s_te0[s0 >> 24] ^ s_te1[(s1 >> 16) & 0xff] ^ s_te2[(s2 >> 8) & 0xff] ^ s_te3[s3 & 0xff] ^ rek[28]; + t1 = s_te0[s1 >> 24] ^ s_te1[(s2 >> 16) & 0xff] ^ s_te2[(s3 >> 8) & 0xff] ^ s_te3[s0 & 0xff] ^ rek[29]; + t2 = s_te0[s2 >> 24] ^ s_te1[(s3 >> 16) & 0xff] ^ s_te2[(s0 >> 8) & 0xff] ^ s_te3[s1 & 0xff] ^ rek[30]; + t3 = s_te0[s3 >> 24] ^ s_te1[(s0 >> 16) & 0xff] ^ s_te2[(s1 >> 8) & 0xff] ^ s_te3[s2 & 0xff] ^ rek[31]; + s0 = s_te0[t0 >> 24] ^ s_te1[(t1 >> 16) & 0xff] ^ s_te2[(t2 >> 8) & 0xff] ^ s_te3[t3 & 0xff] ^ rek[32]; + s1 = s_te0[t1 >> 24] ^ s_te1[(t2 >> 16) & 0xff] ^ s_te2[(t3 >> 8) & 0xff] ^ s_te3[t0 & 0xff] ^ rek[33]; + s2 = s_te0[t2 >> 24] ^ s_te1[(t3 >> 16) & 0xff] ^ s_te2[(t0 >> 8) & 0xff] ^ s_te3[t1 & 0xff] ^ rek[34]; + s3 = s_te0[t3 >> 24] ^ s_te1[(t0 >> 16) & 0xff] ^ s_te2[(t1 >> 8) & 0xff] ^ s_te3[t2 & 0xff] ^ rek[35]; + t0 = s_te0[s0 >> 24] ^ s_te1[(s1 >> 16) & 0xff] ^ s_te2[(s2 >> 8) & 0xff] ^ s_te3[s3 & 0xff] ^ rek[36]; + t1 = s_te0[s1 >> 24] ^ s_te1[(s2 >> 16) & 0xff] ^ s_te2[(s3 >> 8) & 0xff] ^ s_te3[s0 & 0xff] ^ rek[37]; + t2 = s_te0[s2 >> 24] ^ s_te1[(s3 >> 16) & 0xff] ^ s_te2[(s0 >> 8) & 0xff] ^ s_te3[s1 & 0xff] ^ rek[38]; + t3 = s_te0[s3 >> 24] ^ s_te1[(s0 >> 16) & 0xff] ^ s_te2[(s1 >> 8) & 0xff] ^ s_te3[s2 & 0xff] ^ rek[39]; + + out[0] = (s_te4[(t0 >> 24) & 0xff] & 0xff000000) + ^ (s_te4[(t1 >> 16) & 0xff] & 0x00ff0000) + ^ (s_te4[(t2 >> 8) & 0xff] & 0x0000ff00) + ^ (s_te4[(t3 >> 0) & 0xff] & 0x000000ff) + ^ rek[40]; + + out[1] = (s_te4[(t1 >> 24) & 0xff] & 0xff000000) + ^ (s_te4[(t2 >> 16) & 0xff] & 0x00ff0000) + ^ (s_te4[(t3 >> 8) & 0xff] & 0x0000ff00) + ^ (s_te4[(t0 >> 0) & 0xff] & 0x000000ff) + ^ rek[41]; + + out[2] = (s_te4[(t2 >> 24) & 0xff] & 0xff000000) + ^ (s_te4[(t3 >> 16) & 0xff] & 0x00ff0000) + ^ (s_te4[(t0 >> 8) & 0xff] & 0x0000ff00) + ^ (s_te4[(t1 >> 0) & 0xff] & 0x000000ff) + ^ rek[42]; + + out[3] = (s_te4[(t3 >> 24) & 0xff] & 0xff000000) + ^ (s_te4[(t0 >> 16) & 0xff] & 0x00ff0000) + ^ (s_te4[(t1 >> 8) & 0xff] & 0x0000ff00) + ^ (s_te4[(t2 >> 0) & 0xff] & 0x000000ff) + ^ rek[43]; +} + +static void AES128_decrypt (const u32 *in, u32 *out, const u32 *rdk, __local u32 s_td0[256], __local u32 s_td1[256], __local u32 s_td2[256], __local u32 s_td3[256], __local u32 s_td4[256]) +{ + u32 s0 = in[0] ^ rdk[0]; + u32 s1 = in[1] ^ rdk[1]; + u32 s2 = in[2] ^ rdk[2]; + u32 s3 = in[3] ^ rdk[3]; + + u32 t0; + u32 t1; + u32 t2; + u32 t3; + + t0 = s_td0[s0 >> 24] ^ s_td1[(s3 >> 16) & 0xff] ^ s_td2[(s2 >> 8) & 0xff] ^ s_td3[s1 & 0xff] ^ rdk[ 4]; + t1 = s_td0[s1 >> 24] ^ s_td1[(s0 >> 16) & 0xff] ^ s_td2[(s3 >> 8) & 0xff] ^ s_td3[s2 & 0xff] ^ rdk[ 5]; + t2 = s_td0[s2 >> 24] ^ s_td1[(s1 >> 16) & 0xff] ^ s_td2[(s0 >> 8) & 0xff] ^ s_td3[s3 & 0xff] ^ rdk[ 6]; + t3 = s_td0[s3 >> 24] ^ s_td1[(s2 >> 16) & 0xff] ^ s_td2[(s1 >> 8) & 0xff] ^ s_td3[s0 & 0xff] ^ rdk[ 7]; + s0 = s_td0[t0 >> 24] ^ s_td1[(t3 >> 16) & 0xff] ^ s_td2[(t2 >> 8) & 0xff] ^ s_td3[t1 & 0xff] ^ rdk[ 8]; + s1 = s_td0[t1 >> 24] ^ s_td1[(t0 >> 16) & 0xff] ^ s_td2[(t3 >> 8) & 0xff] ^ s_td3[t2 & 0xff] ^ rdk[ 9]; + s2 = s_td0[t2 >> 24] ^ s_td1[(t1 >> 16) & 0xff] ^ s_td2[(t0 >> 8) & 0xff] ^ s_td3[t3 & 0xff] ^ rdk[10]; + s3 = s_td0[t3 >> 24] ^ s_td1[(t2 >> 16) & 0xff] ^ s_td2[(t1 >> 8) & 0xff] ^ s_td3[t0 & 0xff] ^ rdk[11]; + t0 = s_td0[s0 >> 24] ^ s_td1[(s3 >> 16) & 0xff] ^ s_td2[(s2 >> 8) & 0xff] ^ s_td3[s1 & 0xff] ^ rdk[12]; + t1 = s_td0[s1 >> 24] ^ s_td1[(s0 >> 16) & 0xff] ^ s_td2[(s3 >> 8) & 0xff] ^ s_td3[s2 & 0xff] ^ rdk[13]; + t2 = s_td0[s2 >> 24] ^ s_td1[(s1 >> 16) & 0xff] ^ s_td2[(s0 >> 8) & 0xff] ^ s_td3[s3 & 0xff] ^ rdk[14]; + t3 = s_td0[s3 >> 24] ^ s_td1[(s2 >> 16) & 0xff] ^ s_td2[(s1 >> 8) & 0xff] ^ s_td3[s0 & 0xff] ^ rdk[15]; + s0 = s_td0[t0 >> 24] ^ s_td1[(t3 >> 16) & 0xff] ^ s_td2[(t2 >> 8) & 0xff] ^ s_td3[t1 & 0xff] ^ rdk[16]; + s1 = s_td0[t1 >> 24] ^ s_td1[(t0 >> 16) & 0xff] ^ s_td2[(t3 >> 8) & 0xff] ^ s_td3[t2 & 0xff] ^ rdk[17]; + s2 = s_td0[t2 >> 24] ^ s_td1[(t1 >> 16) & 0xff] ^ s_td2[(t0 >> 8) & 0xff] ^ s_td3[t3 & 0xff] ^ rdk[18]; + s3 = s_td0[t3 >> 24] ^ s_td1[(t2 >> 16) & 0xff] ^ s_td2[(t1 >> 8) & 0xff] ^ s_td3[t0 & 0xff] ^ rdk[19]; + t0 = s_td0[s0 >> 24] ^ s_td1[(s3 >> 16) & 0xff] ^ s_td2[(s2 >> 8) & 0xff] ^ s_td3[s1 & 0xff] ^ rdk[20]; + t1 = s_td0[s1 >> 24] ^ s_td1[(s0 >> 16) & 0xff] ^ s_td2[(s3 >> 8) & 0xff] ^ s_td3[s2 & 0xff] ^ rdk[21]; + t2 = s_td0[s2 >> 24] ^ s_td1[(s1 >> 16) & 0xff] ^ s_td2[(s0 >> 8) & 0xff] ^ s_td3[s3 & 0xff] ^ rdk[22]; + t3 = s_td0[s3 >> 24] ^ s_td1[(s2 >> 16) & 0xff] ^ s_td2[(s1 >> 8) & 0xff] ^ s_td3[s0 & 0xff] ^ rdk[23]; + s0 = s_td0[t0 >> 24] ^ s_td1[(t3 >> 16) & 0xff] ^ s_td2[(t2 >> 8) & 0xff] ^ s_td3[t1 & 0xff] ^ rdk[24]; + s1 = s_td0[t1 >> 24] ^ s_td1[(t0 >> 16) & 0xff] ^ s_td2[(t3 >> 8) & 0xff] ^ s_td3[t2 & 0xff] ^ rdk[25]; + s2 = s_td0[t2 >> 24] ^ s_td1[(t1 >> 16) & 0xff] ^ s_td2[(t0 >> 8) & 0xff] ^ s_td3[t3 & 0xff] ^ rdk[26]; + s3 = s_td0[t3 >> 24] ^ s_td1[(t2 >> 16) & 0xff] ^ s_td2[(t1 >> 8) & 0xff] ^ s_td3[t0 & 0xff] ^ rdk[27]; + t0 = s_td0[s0 >> 24] ^ s_td1[(s3 >> 16) & 0xff] ^ s_td2[(s2 >> 8) & 0xff] ^ s_td3[s1 & 0xff] ^ rdk[28]; + t1 = s_td0[s1 >> 24] ^ s_td1[(s0 >> 16) & 0xff] ^ s_td2[(s3 >> 8) & 0xff] ^ s_td3[s2 & 0xff] ^ rdk[29]; + t2 = s_td0[s2 >> 24] ^ s_td1[(s1 >> 16) & 0xff] ^ s_td2[(s0 >> 8) & 0xff] ^ s_td3[s3 & 0xff] ^ rdk[30]; + t3 = s_td0[s3 >> 24] ^ s_td1[(s2 >> 16) & 0xff] ^ s_td2[(s1 >> 8) & 0xff] ^ s_td3[s0 & 0xff] ^ rdk[31]; + s0 = s_td0[t0 >> 24] ^ s_td1[(t3 >> 16) & 0xff] ^ s_td2[(t2 >> 8) & 0xff] ^ s_td3[t1 & 0xff] ^ rdk[32]; + s1 = s_td0[t1 >> 24] ^ s_td1[(t0 >> 16) & 0xff] ^ s_td2[(t3 >> 8) & 0xff] ^ s_td3[t2 & 0xff] ^ rdk[33]; + s2 = s_td0[t2 >> 24] ^ s_td1[(t1 >> 16) & 0xff] ^ s_td2[(t0 >> 8) & 0xff] ^ s_td3[t3 & 0xff] ^ rdk[34]; + s3 = s_td0[t3 >> 24] ^ s_td1[(t2 >> 16) & 0xff] ^ s_td2[(t1 >> 8) & 0xff] ^ s_td3[t0 & 0xff] ^ rdk[35]; + t0 = s_td0[s0 >> 24] ^ s_td1[(s3 >> 16) & 0xff] ^ s_td2[(s2 >> 8) & 0xff] ^ s_td3[s1 & 0xff] ^ rdk[36]; + t1 = s_td0[s1 >> 24] ^ s_td1[(s0 >> 16) & 0xff] ^ s_td2[(s3 >> 8) & 0xff] ^ s_td3[s2 & 0xff] ^ rdk[37]; + t2 = s_td0[s2 >> 24] ^ s_td1[(s1 >> 16) & 0xff] ^ s_td2[(s0 >> 8) & 0xff] ^ s_td3[s3 & 0xff] ^ rdk[38]; + t3 = s_td0[s3 >> 24] ^ s_td1[(s2 >> 16) & 0xff] ^ s_td2[(s1 >> 8) & 0xff] ^ s_td3[s0 & 0xff] ^ rdk[39]; + + out[0] = (s_td4[(t0 >> 24) & 0xff] & 0xff000000) + ^ (s_td4[(t3 >> 16) & 0xff] & 0x00ff0000) + ^ (s_td4[(t2 >> 8) & 0xff] & 0x0000ff00) + ^ (s_td4[(t1 >> 0) & 0xff] & 0x000000ff) + ^ rdk[40]; + + out[1] = (s_td4[(t1 >> 24) & 0xff] & 0xff000000) + ^ (s_td4[(t0 >> 16) & 0xff] & 0x00ff0000) + ^ (s_td4[(t3 >> 8) & 0xff] & 0x0000ff00) + ^ (s_td4[(t2 >> 0) & 0xff] & 0x000000ff) + ^ rdk[41]; + + out[2] = (s_td4[(t2 >> 24) & 0xff] & 0xff000000) + ^ (s_td4[(t1 >> 16) & 0xff] & 0x00ff0000) + ^ (s_td4[(t0 >> 8) & 0xff] & 0x0000ff00) + ^ (s_td4[(t3 >> 0) & 0xff] & 0x000000ff) + ^ rdk[42]; + + out[3] = (s_td4[(t3 >> 24) & 0xff] & 0xff000000) + ^ (s_td4[(t2 >> 16) & 0xff] & 0x00ff0000) + ^ (s_td4[(t1 >> 8) & 0xff] & 0x0000ff00) + ^ (s_td4[(t0 >> 0) & 0xff] & 0x000000ff) + ^ rdk[43]; +} + +static void AES256_ExpandKey (u32 *userkey, u32 *rek, __local u32 s_te0[256], __local u32 s_te1[256], __local u32 s_te2[256], __local u32 s_te3[256], __local u32 s_te4[256]) +{ + rek[0] = userkey[0]; + rek[1] = userkey[1]; + rek[2] = userkey[2]; + rek[3] = userkey[3]; + rek[4] = userkey[4]; + rek[5] = userkey[5]; + rek[6] = userkey[6]; + rek[7] = userkey[7]; + + int i; + int j; + + i = 0; + j = 0; + + while (1) + { + u32 temp = rek[j + 7]; + + rek[j + 8] = rek[j + 0] + ^ (s_te2[(temp >> 16) & 0xff] & 0xff000000) + ^ (s_te3[(temp >> 8) & 0xff] & 0x00ff0000) + ^ (s_te0[(temp >> 0) & 0xff] & 0x0000ff00) + ^ (s_te1[(temp >> 24) & 0xff] & 0x000000ff) + ^ rcon[i]; + + rek[j + 9] = rek[j + 1] ^ rek[j + 8]; + rek[j + 10] = rek[j + 2] ^ rek[j + 9]; + rek[j + 11] = rek[j + 3] ^ rek[j + 10]; + + if (++i == 7) break; + + temp = rek[j + 11]; + + rek[j + 12] = rek[j + 4] + ^ (s_te2[(temp >> 24) & 0xff] & 0xff000000) + ^ (s_te3[(temp >> 16) & 0xff] & 0x00ff0000) + ^ (s_te0[(temp >> 8) & 0xff] & 0x0000ff00) + ^ (s_te1[(temp >> 0) & 0xff] & 0x000000ff); + + rek[j + 13] = rek[j + 5] ^ rek[j + 12]; + rek[j + 14] = rek[j + 6] ^ rek[j + 13]; + rek[j + 15] = rek[j + 7] ^ rek[j + 14]; + + j += 8; + } +} + +static void AES256_InvertKey (u32 *rdk, __local u32 s_td0[256], __local u32 s_td1[256], __local u32 s_td2[256], __local u32 s_td3[256], __local u32 s_td4[256], __local u32 s_te0[256], __local u32 s_te1[256], __local u32 s_te2[256], __local u32 s_te3[256], __local u32 s_te4[256]) +{ + for (u32 i = 0, j = 56; i < j; i += 4, j -= 4) + { + u32 temp; + + temp = rdk[i + 0]; rdk[i + 0] = rdk[j + 0]; rdk[j + 0] = temp; + temp = rdk[i + 1]; rdk[i + 1] = rdk[j + 1]; rdk[j + 1] = temp; + temp = rdk[i + 2]; rdk[i + 2] = rdk[j + 2]; rdk[j + 2] = temp; + temp = rdk[i + 3]; rdk[i + 3] = rdk[j + 3]; rdk[j + 3] = temp; + } + + for (u32 i = 1, j = 4; i < 14; i += 1, j += 4) + { + rdk[j + 0] = + s_td0[s_te1[(rdk[j + 0] >> 24) & 0xff] & 0xff] ^ + s_td1[s_te1[(rdk[j + 0] >> 16) & 0xff] & 0xff] ^ + s_td2[s_te1[(rdk[j + 0] >> 8) & 0xff] & 0xff] ^ + s_td3[s_te1[(rdk[j + 0] >> 0) & 0xff] & 0xff]; + + rdk[j + 1] = + s_td0[s_te1[(rdk[j + 1] >> 24) & 0xff] & 0xff] ^ + s_td1[s_te1[(rdk[j + 1] >> 16) & 0xff] & 0xff] ^ + s_td2[s_te1[(rdk[j + 1] >> 8) & 0xff] & 0xff] ^ + s_td3[s_te1[(rdk[j + 1] >> 0) & 0xff] & 0xff]; + + rdk[j + 2] = + s_td0[s_te1[(rdk[j + 2] >> 24) & 0xff] & 0xff] ^ + s_td1[s_te1[(rdk[j + 2] >> 16) & 0xff] & 0xff] ^ + s_td2[s_te1[(rdk[j + 2] >> 8) & 0xff] & 0xff] ^ + s_td3[s_te1[(rdk[j + 2] >> 0) & 0xff] & 0xff]; + + rdk[j + 3] = + s_td0[s_te1[(rdk[j + 3] >> 24) & 0xff] & 0xff] ^ + s_td1[s_te1[(rdk[j + 3] >> 16) & 0xff] & 0xff] ^ + s_td2[s_te1[(rdk[j + 3] >> 8) & 0xff] & 0xff] ^ + s_td3[s_te1[(rdk[j + 3] >> 0) & 0xff] & 0xff]; + } +} + +static void AES256_decrypt (const u32 *in, u32 *out, const u32 *rdk, __local u32 s_td0[256], __local u32 s_td1[256], __local u32 s_td2[256], __local u32 s_td3[256], __local u32 s_td4[256]) +{ + u32 s0 = in[0] ^ rdk[0]; + u32 s1 = in[1] ^ rdk[1]; + u32 s2 = in[2] ^ rdk[2]; + u32 s3 = in[3] ^ rdk[3]; + + u32 t0; + u32 t1; + u32 t2; + u32 t3; + + t0 = s_td0[s0 >> 24] ^ s_td1[(s3 >> 16) & 0xff] ^ s_td2[(s2 >> 8) & 0xff] ^ s_td3[s1 & 0xff] ^ rdk[ 4]; + t1 = s_td0[s1 >> 24] ^ s_td1[(s0 >> 16) & 0xff] ^ s_td2[(s3 >> 8) & 0xff] ^ s_td3[s2 & 0xff] ^ rdk[ 5]; + t2 = s_td0[s2 >> 24] ^ s_td1[(s1 >> 16) & 0xff] ^ s_td2[(s0 >> 8) & 0xff] ^ s_td3[s3 & 0xff] ^ rdk[ 6]; + t3 = s_td0[s3 >> 24] ^ s_td1[(s2 >> 16) & 0xff] ^ s_td2[(s1 >> 8) & 0xff] ^ s_td3[s0 & 0xff] ^ rdk[ 7]; + s0 = s_td0[t0 >> 24] ^ s_td1[(t3 >> 16) & 0xff] ^ s_td2[(t2 >> 8) & 0xff] ^ s_td3[t1 & 0xff] ^ rdk[ 8]; + s1 = s_td0[t1 >> 24] ^ s_td1[(t0 >> 16) & 0xff] ^ s_td2[(t3 >> 8) & 0xff] ^ s_td3[t2 & 0xff] ^ rdk[ 9]; + s2 = s_td0[t2 >> 24] ^ s_td1[(t1 >> 16) & 0xff] ^ s_td2[(t0 >> 8) & 0xff] ^ s_td3[t3 & 0xff] ^ rdk[10]; + s3 = s_td0[t3 >> 24] ^ s_td1[(t2 >> 16) & 0xff] ^ s_td2[(t1 >> 8) & 0xff] ^ s_td3[t0 & 0xff] ^ rdk[11]; + t0 = s_td0[s0 >> 24] ^ s_td1[(s3 >> 16) & 0xff] ^ s_td2[(s2 >> 8) & 0xff] ^ s_td3[s1 & 0xff] ^ rdk[12]; + t1 = s_td0[s1 >> 24] ^ s_td1[(s0 >> 16) & 0xff] ^ s_td2[(s3 >> 8) & 0xff] ^ s_td3[s2 & 0xff] ^ rdk[13]; + t2 = s_td0[s2 >> 24] ^ s_td1[(s1 >> 16) & 0xff] ^ s_td2[(s0 >> 8) & 0xff] ^ s_td3[s3 & 0xff] ^ rdk[14]; + t3 = s_td0[s3 >> 24] ^ s_td1[(s2 >> 16) & 0xff] ^ s_td2[(s1 >> 8) & 0xff] ^ s_td3[s0 & 0xff] ^ rdk[15]; + s0 = s_td0[t0 >> 24] ^ s_td1[(t3 >> 16) & 0xff] ^ s_td2[(t2 >> 8) & 0xff] ^ s_td3[t1 & 0xff] ^ rdk[16]; + s1 = s_td0[t1 >> 24] ^ s_td1[(t0 >> 16) & 0xff] ^ s_td2[(t3 >> 8) & 0xff] ^ s_td3[t2 & 0xff] ^ rdk[17]; + s2 = s_td0[t2 >> 24] ^ s_td1[(t1 >> 16) & 0xff] ^ s_td2[(t0 >> 8) & 0xff] ^ s_td3[t3 & 0xff] ^ rdk[18]; + s3 = s_td0[t3 >> 24] ^ s_td1[(t2 >> 16) & 0xff] ^ s_td2[(t1 >> 8) & 0xff] ^ s_td3[t0 & 0xff] ^ rdk[19]; + t0 = s_td0[s0 >> 24] ^ s_td1[(s3 >> 16) & 0xff] ^ s_td2[(s2 >> 8) & 0xff] ^ s_td3[s1 & 0xff] ^ rdk[20]; + t1 = s_td0[s1 >> 24] ^ s_td1[(s0 >> 16) & 0xff] ^ s_td2[(s3 >> 8) & 0xff] ^ s_td3[s2 & 0xff] ^ rdk[21]; + t2 = s_td0[s2 >> 24] ^ s_td1[(s1 >> 16) & 0xff] ^ s_td2[(s0 >> 8) & 0xff] ^ s_td3[s3 & 0xff] ^ rdk[22]; + t3 = s_td0[s3 >> 24] ^ s_td1[(s2 >> 16) & 0xff] ^ s_td2[(s1 >> 8) & 0xff] ^ s_td3[s0 & 0xff] ^ rdk[23]; + s0 = s_td0[t0 >> 24] ^ s_td1[(t3 >> 16) & 0xff] ^ s_td2[(t2 >> 8) & 0xff] ^ s_td3[t1 & 0xff] ^ rdk[24]; + s1 = s_td0[t1 >> 24] ^ s_td1[(t0 >> 16) & 0xff] ^ s_td2[(t3 >> 8) & 0xff] ^ s_td3[t2 & 0xff] ^ rdk[25]; + s2 = s_td0[t2 >> 24] ^ s_td1[(t1 >> 16) & 0xff] ^ s_td2[(t0 >> 8) & 0xff] ^ s_td3[t3 & 0xff] ^ rdk[26]; + s3 = s_td0[t3 >> 24] ^ s_td1[(t2 >> 16) & 0xff] ^ s_td2[(t1 >> 8) & 0xff] ^ s_td3[t0 & 0xff] ^ rdk[27]; + t0 = s_td0[s0 >> 24] ^ s_td1[(s3 >> 16) & 0xff] ^ s_td2[(s2 >> 8) & 0xff] ^ s_td3[s1 & 0xff] ^ rdk[28]; + t1 = s_td0[s1 >> 24] ^ s_td1[(s0 >> 16) & 0xff] ^ s_td2[(s3 >> 8) & 0xff] ^ s_td3[s2 & 0xff] ^ rdk[29]; + t2 = s_td0[s2 >> 24] ^ s_td1[(s1 >> 16) & 0xff] ^ s_td2[(s0 >> 8) & 0xff] ^ s_td3[s3 & 0xff] ^ rdk[30]; + t3 = s_td0[s3 >> 24] ^ s_td1[(s2 >> 16) & 0xff] ^ s_td2[(s1 >> 8) & 0xff] ^ s_td3[s0 & 0xff] ^ rdk[31]; + s0 = s_td0[t0 >> 24] ^ s_td1[(t3 >> 16) & 0xff] ^ s_td2[(t2 >> 8) & 0xff] ^ s_td3[t1 & 0xff] ^ rdk[32]; + s1 = s_td0[t1 >> 24] ^ s_td1[(t0 >> 16) & 0xff] ^ s_td2[(t3 >> 8) & 0xff] ^ s_td3[t2 & 0xff] ^ rdk[33]; + s2 = s_td0[t2 >> 24] ^ s_td1[(t1 >> 16) & 0xff] ^ s_td2[(t0 >> 8) & 0xff] ^ s_td3[t3 & 0xff] ^ rdk[34]; + s3 = s_td0[t3 >> 24] ^ s_td1[(t2 >> 16) & 0xff] ^ s_td2[(t1 >> 8) & 0xff] ^ s_td3[t0 & 0xff] ^ rdk[35]; + t0 = s_td0[s0 >> 24] ^ s_td1[(s3 >> 16) & 0xff] ^ s_td2[(s2 >> 8) & 0xff] ^ s_td3[s1 & 0xff] ^ rdk[36]; + t1 = s_td0[s1 >> 24] ^ s_td1[(s0 >> 16) & 0xff] ^ s_td2[(s3 >> 8) & 0xff] ^ s_td3[s2 & 0xff] ^ rdk[37]; + t2 = s_td0[s2 >> 24] ^ s_td1[(s1 >> 16) & 0xff] ^ s_td2[(s0 >> 8) & 0xff] ^ s_td3[s3 & 0xff] ^ rdk[38]; + t3 = s_td0[s3 >> 24] ^ s_td1[(s2 >> 16) & 0xff] ^ s_td2[(s1 >> 8) & 0xff] ^ s_td3[s0 & 0xff] ^ rdk[39]; + s0 = s_td0[t0 >> 24] ^ s_td1[(t3 >> 16) & 0xff] ^ s_td2[(t2 >> 8) & 0xff] ^ s_td3[t1 & 0xff] ^ rdk[40]; + s1 = s_td0[t1 >> 24] ^ s_td1[(t0 >> 16) & 0xff] ^ s_td2[(t3 >> 8) & 0xff] ^ s_td3[t2 & 0xff] ^ rdk[41]; + s2 = s_td0[t2 >> 24] ^ s_td1[(t1 >> 16) & 0xff] ^ s_td2[(t0 >> 8) & 0xff] ^ s_td3[t3 & 0xff] ^ rdk[42]; + s3 = s_td0[t3 >> 24] ^ s_td1[(t2 >> 16) & 0xff] ^ s_td2[(t1 >> 8) & 0xff] ^ s_td3[t0 & 0xff] ^ rdk[43]; + t0 = s_td0[s0 >> 24] ^ s_td1[(s3 >> 16) & 0xff] ^ s_td2[(s2 >> 8) & 0xff] ^ s_td3[s1 & 0xff] ^ rdk[44]; + t1 = s_td0[s1 >> 24] ^ s_td1[(s0 >> 16) & 0xff] ^ s_td2[(s3 >> 8) & 0xff] ^ s_td3[s2 & 0xff] ^ rdk[45]; + t2 = s_td0[s2 >> 24] ^ s_td1[(s1 >> 16) & 0xff] ^ s_td2[(s0 >> 8) & 0xff] ^ s_td3[s3 & 0xff] ^ rdk[46]; + t3 = s_td0[s3 >> 24] ^ s_td1[(s2 >> 16) & 0xff] ^ s_td2[(s1 >> 8) & 0xff] ^ s_td3[s0 & 0xff] ^ rdk[47]; + s0 = s_td0[t0 >> 24] ^ s_td1[(t3 >> 16) & 0xff] ^ s_td2[(t2 >> 8) & 0xff] ^ s_td3[t1 & 0xff] ^ rdk[48]; + s1 = s_td0[t1 >> 24] ^ s_td1[(t0 >> 16) & 0xff] ^ s_td2[(t3 >> 8) & 0xff] ^ s_td3[t2 & 0xff] ^ rdk[49]; + s2 = s_td0[t2 >> 24] ^ s_td1[(t1 >> 16) & 0xff] ^ s_td2[(t0 >> 8) & 0xff] ^ s_td3[t3 & 0xff] ^ rdk[50]; + s3 = s_td0[t3 >> 24] ^ s_td1[(t2 >> 16) & 0xff] ^ s_td2[(t1 >> 8) & 0xff] ^ s_td3[t0 & 0xff] ^ rdk[51]; + t0 = s_td0[s0 >> 24] ^ s_td1[(s3 >> 16) & 0xff] ^ s_td2[(s2 >> 8) & 0xff] ^ s_td3[s1 & 0xff] ^ rdk[52]; + t1 = s_td0[s1 >> 24] ^ s_td1[(s0 >> 16) & 0xff] ^ s_td2[(s3 >> 8) & 0xff] ^ s_td3[s2 & 0xff] ^ rdk[53]; + t2 = s_td0[s2 >> 24] ^ s_td1[(s1 >> 16) & 0xff] ^ s_td2[(s0 >> 8) & 0xff] ^ s_td3[s3 & 0xff] ^ rdk[54]; + t3 = s_td0[s3 >> 24] ^ s_td1[(s2 >> 16) & 0xff] ^ s_td2[(s1 >> 8) & 0xff] ^ s_td3[s0 & 0xff] ^ rdk[55]; + + out[0] = (s_td4[(t0 >> 24) & 0xff] & 0xff000000) + ^ (s_td4[(t3 >> 16) & 0xff] & 0x00ff0000) + ^ (s_td4[(t2 >> 8) & 0xff] & 0x0000ff00) + ^ (s_td4[(t1 >> 0) & 0xff] & 0x000000ff) + ^ rdk[56]; + + out[1] = (s_td4[(t1 >> 24) & 0xff] & 0xff000000) + ^ (s_td4[(t0 >> 16) & 0xff] & 0x00ff0000) + ^ (s_td4[(t3 >> 8) & 0xff] & 0x0000ff00) + ^ (s_td4[(t2 >> 0) & 0xff] & 0x000000ff) + ^ rdk[57]; + + out[2] = (s_td4[(t2 >> 24) & 0xff] & 0xff000000) + ^ (s_td4[(t1 >> 16) & 0xff] & 0x00ff0000) + ^ (s_td4[(t0 >> 8) & 0xff] & 0x0000ff00) + ^ (s_td4[(t3 >> 0) & 0xff] & 0x000000ff) + ^ rdk[58]; + + out[3] = (s_td4[(t3 >> 24) & 0xff] & 0xff000000) + ^ (s_td4[(t2 >> 16) & 0xff] & 0x00ff0000) + ^ (s_td4[(t1 >> 8) & 0xff] & 0x0000ff00) + ^ (s_td4[(t0 >> 0) & 0xff] & 0x000000ff) + ^ rdk[59]; +} + +static void AES256_encrypt (const u32 *in, u32 *out, const u32 *rek, __local u32 s_te0[256], __local u32 s_te1[256], __local u32 s_te2[256], __local u32 s_te3[256], __local u32 s_te4[256]) +{ + u32 s0 = in[0] ^ rek[0]; + u32 s1 = in[1] ^ rek[1]; + u32 s2 = in[2] ^ rek[2]; + u32 s3 = in[3] ^ rek[3]; + + u32 t0; + u32 t1; + u32 t2; + u32 t3; + + t0 = s_te0[s0 >> 24] ^ s_te1[(s1 >> 16) & 0xff] ^ s_te2[(s2 >> 8) & 0xff] ^ s_te3[s3 & 0xff] ^ rek[ 4]; + t1 = s_te0[s1 >> 24] ^ s_te1[(s2 >> 16) & 0xff] ^ s_te2[(s3 >> 8) & 0xff] ^ s_te3[s0 & 0xff] ^ rek[ 5]; + t2 = s_te0[s2 >> 24] ^ s_te1[(s3 >> 16) & 0xff] ^ s_te2[(s0 >> 8) & 0xff] ^ s_te3[s1 & 0xff] ^ rek[ 6]; + t3 = s_te0[s3 >> 24] ^ s_te1[(s0 >> 16) & 0xff] ^ s_te2[(s1 >> 8) & 0xff] ^ s_te3[s2 & 0xff] ^ rek[ 7]; + s0 = s_te0[t0 >> 24] ^ s_te1[(t1 >> 16) & 0xff] ^ s_te2[(t2 >> 8) & 0xff] ^ s_te3[t3 & 0xff] ^ rek[ 8]; + s1 = s_te0[t1 >> 24] ^ s_te1[(t2 >> 16) & 0xff] ^ s_te2[(t3 >> 8) & 0xff] ^ s_te3[t0 & 0xff] ^ rek[ 9]; + s2 = s_te0[t2 >> 24] ^ s_te1[(t3 >> 16) & 0xff] ^ s_te2[(t0 >> 8) & 0xff] ^ s_te3[t1 & 0xff] ^ rek[10]; + s3 = s_te0[t3 >> 24] ^ s_te1[(t0 >> 16) & 0xff] ^ s_te2[(t1 >> 8) & 0xff] ^ s_te3[t2 & 0xff] ^ rek[11]; + t0 = s_te0[s0 >> 24] ^ s_te1[(s1 >> 16) & 0xff] ^ s_te2[(s2 >> 8) & 0xff] ^ s_te3[s3 & 0xff] ^ rek[12]; + t1 = s_te0[s1 >> 24] ^ s_te1[(s2 >> 16) & 0xff] ^ s_te2[(s3 >> 8) & 0xff] ^ s_te3[s0 & 0xff] ^ rek[13]; + t2 = s_te0[s2 >> 24] ^ s_te1[(s3 >> 16) & 0xff] ^ s_te2[(s0 >> 8) & 0xff] ^ s_te3[s1 & 0xff] ^ rek[14]; + t3 = s_te0[s3 >> 24] ^ s_te1[(s0 >> 16) & 0xff] ^ s_te2[(s1 >> 8) & 0xff] ^ s_te3[s2 & 0xff] ^ rek[15]; + s0 = s_te0[t0 >> 24] ^ s_te1[(t1 >> 16) & 0xff] ^ s_te2[(t2 >> 8) & 0xff] ^ s_te3[t3 & 0xff] ^ rek[16]; + s1 = s_te0[t1 >> 24] ^ s_te1[(t2 >> 16) & 0xff] ^ s_te2[(t3 >> 8) & 0xff] ^ s_te3[t0 & 0xff] ^ rek[17]; + s2 = s_te0[t2 >> 24] ^ s_te1[(t3 >> 16) & 0xff] ^ s_te2[(t0 >> 8) & 0xff] ^ s_te3[t1 & 0xff] ^ rek[18]; + s3 = s_te0[t3 >> 24] ^ s_te1[(t0 >> 16) & 0xff] ^ s_te2[(t1 >> 8) & 0xff] ^ s_te3[t2 & 0xff] ^ rek[19]; + t0 = s_te0[s0 >> 24] ^ s_te1[(s1 >> 16) & 0xff] ^ s_te2[(s2 >> 8) & 0xff] ^ s_te3[s3 & 0xff] ^ rek[20]; + t1 = s_te0[s1 >> 24] ^ s_te1[(s2 >> 16) & 0xff] ^ s_te2[(s3 >> 8) & 0xff] ^ s_te3[s0 & 0xff] ^ rek[21]; + t2 = s_te0[s2 >> 24] ^ s_te1[(s3 >> 16) & 0xff] ^ s_te2[(s0 >> 8) & 0xff] ^ s_te3[s1 & 0xff] ^ rek[22]; + t3 = s_te0[s3 >> 24] ^ s_te1[(s0 >> 16) & 0xff] ^ s_te2[(s1 >> 8) & 0xff] ^ s_te3[s2 & 0xff] ^ rek[23]; + s0 = s_te0[t0 >> 24] ^ s_te1[(t1 >> 16) & 0xff] ^ s_te2[(t2 >> 8) & 0xff] ^ s_te3[t3 & 0xff] ^ rek[24]; + s1 = s_te0[t1 >> 24] ^ s_te1[(t2 >> 16) & 0xff] ^ s_te2[(t3 >> 8) & 0xff] ^ s_te3[t0 & 0xff] ^ rek[25]; + s2 = s_te0[t2 >> 24] ^ s_te1[(t3 >> 16) & 0xff] ^ s_te2[(t0 >> 8) & 0xff] ^ s_te3[t1 & 0xff] ^ rek[26]; + s3 = s_te0[t3 >> 24] ^ s_te1[(t0 >> 16) & 0xff] ^ s_te2[(t1 >> 8) & 0xff] ^ s_te3[t2 & 0xff] ^ rek[27]; + t0 = s_te0[s0 >> 24] ^ s_te1[(s1 >> 16) & 0xff] ^ s_te2[(s2 >> 8) & 0xff] ^ s_te3[s3 & 0xff] ^ rek[28]; + t1 = s_te0[s1 >> 24] ^ s_te1[(s2 >> 16) & 0xff] ^ s_te2[(s3 >> 8) & 0xff] ^ s_te3[s0 & 0xff] ^ rek[29]; + t2 = s_te0[s2 >> 24] ^ s_te1[(s3 >> 16) & 0xff] ^ s_te2[(s0 >> 8) & 0xff] ^ s_te3[s1 & 0xff] ^ rek[30]; + t3 = s_te0[s3 >> 24] ^ s_te1[(s0 >> 16) & 0xff] ^ s_te2[(s1 >> 8) & 0xff] ^ s_te3[s2 & 0xff] ^ rek[31]; + s0 = s_te0[t0 >> 24] ^ s_te1[(t1 >> 16) & 0xff] ^ s_te2[(t2 >> 8) & 0xff] ^ s_te3[t3 & 0xff] ^ rek[32]; + s1 = s_te0[t1 >> 24] ^ s_te1[(t2 >> 16) & 0xff] ^ s_te2[(t3 >> 8) & 0xff] ^ s_te3[t0 & 0xff] ^ rek[33]; + s2 = s_te0[t2 >> 24] ^ s_te1[(t3 >> 16) & 0xff] ^ s_te2[(t0 >> 8) & 0xff] ^ s_te3[t1 & 0xff] ^ rek[34]; + s3 = s_te0[t3 >> 24] ^ s_te1[(t0 >> 16) & 0xff] ^ s_te2[(t1 >> 8) & 0xff] ^ s_te3[t2 & 0xff] ^ rek[35]; + t0 = s_te0[s0 >> 24] ^ s_te1[(s1 >> 16) & 0xff] ^ s_te2[(s2 >> 8) & 0xff] ^ s_te3[s3 & 0xff] ^ rek[36]; + t1 = s_te0[s1 >> 24] ^ s_te1[(s2 >> 16) & 0xff] ^ s_te2[(s3 >> 8) & 0xff] ^ s_te3[s0 & 0xff] ^ rek[37]; + t2 = s_te0[s2 >> 24] ^ s_te1[(s3 >> 16) & 0xff] ^ s_te2[(s0 >> 8) & 0xff] ^ s_te3[s1 & 0xff] ^ rek[38]; + t3 = s_te0[s3 >> 24] ^ s_te1[(s0 >> 16) & 0xff] ^ s_te2[(s1 >> 8) & 0xff] ^ s_te3[s2 & 0xff] ^ rek[39]; + s0 = s_te0[t0 >> 24] ^ s_te1[(t1 >> 16) & 0xff] ^ s_te2[(t2 >> 8) & 0xff] ^ s_te3[t3 & 0xff] ^ rek[40]; + s1 = s_te0[t1 >> 24] ^ s_te1[(t2 >> 16) & 0xff] ^ s_te2[(t3 >> 8) & 0xff] ^ s_te3[t0 & 0xff] ^ rek[41]; + s2 = s_te0[t2 >> 24] ^ s_te1[(t3 >> 16) & 0xff] ^ s_te2[(t0 >> 8) & 0xff] ^ s_te3[t1 & 0xff] ^ rek[42]; + s3 = s_te0[t3 >> 24] ^ s_te1[(t0 >> 16) & 0xff] ^ s_te2[(t1 >> 8) & 0xff] ^ s_te3[t2 & 0xff] ^ rek[43]; + t0 = s_te0[s0 >> 24] ^ s_te1[(s1 >> 16) & 0xff] ^ s_te2[(s2 >> 8) & 0xff] ^ s_te3[s3 & 0xff] ^ rek[44]; + t1 = s_te0[s1 >> 24] ^ s_te1[(s2 >> 16) & 0xff] ^ s_te2[(s3 >> 8) & 0xff] ^ s_te3[s0 & 0xff] ^ rek[45]; + t2 = s_te0[s2 >> 24] ^ s_te1[(s3 >> 16) & 0xff] ^ s_te2[(s0 >> 8) & 0xff] ^ s_te3[s1 & 0xff] ^ rek[46]; + t3 = s_te0[s3 >> 24] ^ s_te1[(s0 >> 16) & 0xff] ^ s_te2[(s1 >> 8) & 0xff] ^ s_te3[s2 & 0xff] ^ rek[47]; + s0 = s_te0[t0 >> 24] ^ s_te1[(t1 >> 16) & 0xff] ^ s_te2[(t2 >> 8) & 0xff] ^ s_te3[t3 & 0xff] ^ rek[48]; + s1 = s_te0[t1 >> 24] ^ s_te1[(t2 >> 16) & 0xff] ^ s_te2[(t3 >> 8) & 0xff] ^ s_te3[t0 & 0xff] ^ rek[49]; + s2 = s_te0[t2 >> 24] ^ s_te1[(t3 >> 16) & 0xff] ^ s_te2[(t0 >> 8) & 0xff] ^ s_te3[t1 & 0xff] ^ rek[50]; + s3 = s_te0[t3 >> 24] ^ s_te1[(t0 >> 16) & 0xff] ^ s_te2[(t1 >> 8) & 0xff] ^ s_te3[t2 & 0xff] ^ rek[51]; + t0 = s_te0[s0 >> 24] ^ s_te1[(s1 >> 16) & 0xff] ^ s_te2[(s2 >> 8) & 0xff] ^ s_te3[s3 & 0xff] ^ rek[52]; + t1 = s_te0[s1 >> 24] ^ s_te1[(s2 >> 16) & 0xff] ^ s_te2[(s3 >> 8) & 0xff] ^ s_te3[s0 & 0xff] ^ rek[53]; + t2 = s_te0[s2 >> 24] ^ s_te1[(s3 >> 16) & 0xff] ^ s_te2[(s0 >> 8) & 0xff] ^ s_te3[s1 & 0xff] ^ rek[54]; + t3 = s_te0[s3 >> 24] ^ s_te1[(s0 >> 16) & 0xff] ^ s_te2[(s1 >> 8) & 0xff] ^ s_te3[s2 & 0xff] ^ rek[55]; + + out[0] = (s_te4[(t0 >> 24) & 0xff] & 0xff000000) + ^ (s_te4[(t1 >> 16) & 0xff] & 0x00ff0000) + ^ (s_te4[(t2 >> 8) & 0xff] & 0x0000ff00) + ^ (s_te4[(t3 >> 0) & 0xff] & 0x000000ff) + ^ rek[56]; + + out[1] = (s_te4[(t1 >> 24) & 0xff] & 0xff000000) + ^ (s_te4[(t2 >> 16) & 0xff] & 0x00ff0000) + ^ (s_te4[(t3 >> 8) & 0xff] & 0x0000ff00) + ^ (s_te4[(t0 >> 0) & 0xff] & 0x000000ff) + ^ rek[57]; + + out[2] = (s_te4[(t2 >> 24) & 0xff] & 0xff000000) + ^ (s_te4[(t3 >> 16) & 0xff] & 0x00ff0000) + ^ (s_te4[(t0 >> 8) & 0xff] & 0x0000ff00) + ^ (s_te4[(t1 >> 0) & 0xff] & 0x000000ff) + ^ rek[58]; + + out[3] = (s_te4[(t3 >> 24) & 0xff] & 0xff000000) + ^ (s_te4[(t0 >> 16) & 0xff] & 0x00ff0000) + ^ (s_te4[(t1 >> 8) & 0xff] & 0x0000ff00) + ^ (s_te4[(t2 >> 0) & 0xff] & 0x000000ff) + ^ rek[59]; +} + +static void sha1_transform (const u32x w0[4], const u32x w1[4], const u32x w2[4], const u32x w3[4], u32x digest[5]) +{ + u32x A = digest[0]; + u32x B = digest[1]; + u32x C = digest[2]; + u32x D = digest[3]; + u32x E = digest[4]; + + u32x w0_t = w0[0]; + u32x w1_t = w0[1]; + u32x w2_t = w0[2]; + u32x w3_t = w0[3]; + u32x w4_t = w1[0]; + u32x w5_t = w1[1]; + u32x w6_t = w1[2]; + u32x w7_t = w1[3]; + u32x w8_t = w2[0]; + u32x w9_t = w2[1]; + u32x wa_t = w2[2]; + u32x wb_t = w2[3]; + u32x wc_t = w3[0]; + u32x wd_t = w3[1]; + u32x we_t = w3[2]; + u32x wf_t = w3[3]; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, A, B, C, D, E, w0_t); + SHA1_STEP (SHA1_F0o, E, A, B, C, D, w1_t); + SHA1_STEP (SHA1_F0o, D, E, A, B, C, w2_t); + SHA1_STEP (SHA1_F0o, C, D, E, A, B, w3_t); + SHA1_STEP (SHA1_F0o, B, C, D, E, A, w4_t); + SHA1_STEP (SHA1_F0o, A, B, C, D, E, w5_t); + SHA1_STEP (SHA1_F0o, E, A, B, C, D, w6_t); + SHA1_STEP (SHA1_F0o, D, E, A, B, C, w7_t); + SHA1_STEP (SHA1_F0o, C, D, E, A, B, w8_t); + SHA1_STEP (SHA1_F0o, B, C, D, E, A, w9_t); + SHA1_STEP (SHA1_F0o, A, B, C, D, E, wa_t); + SHA1_STEP (SHA1_F0o, E, A, B, C, D, wb_t); + SHA1_STEP (SHA1_F0o, D, E, A, B, C, wc_t); + SHA1_STEP (SHA1_F0o, C, D, E, A, B, wd_t); + SHA1_STEP (SHA1_F0o, B, C, D, E, A, we_t); + SHA1_STEP (SHA1_F0o, A, B, C, D, E, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F0o, E, A, B, C, D, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F0o, D, E, A, B, C, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F0o, C, D, E, A, B, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F0o, B, C, D, E, A, w3_t); + + #undef K + #define K SHA1C01 + + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w7_t); + + #undef K + #define K SHA1C02 + + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, wb_t); + + #undef K + #define K SHA1C03 + + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, wf_t); + + digest[0] += A; + digest[1] += B; + digest[2] += C; + digest[3] += D; + digest[4] += E; +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m09400_init (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global office2007_tmp_t *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global office2007_t *office2007_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = pws[gid].i[ 8]; + w2[1] = pws[gid].i[ 9]; + w2[2] = pws[gid].i[10]; + w2[3] = pws[gid].i[11]; + + u32x w3[4]; + + w3[0] = pws[gid].i[12]; + w3[1] = pws[gid].i[13]; + w3[2] = pws[gid].i[14]; + w3[3] = pws[gid].i[15]; + + u32 pw_len = pws[gid].pw_len; + + append_0x80_4 (w0, w1, w2, w3, pw_len); + + make_unicode (w1, w2, w3); + make_unicode (w0, w0, w1); + + /** + * salt + */ + + u32 salt_len = salt_bufs[salt_pos].salt_len; + + u32 salt_buf[4]; + + salt_buf[0] = salt_bufs[salt_pos].salt_buf[0]; + salt_buf[1] = salt_bufs[salt_pos].salt_buf[1]; + salt_buf[2] = salt_bufs[salt_pos].salt_buf[2]; + salt_buf[3] = salt_bufs[salt_pos].salt_buf[3]; + + /** + * init + */ + + u32x t0[4]; + + t0[0] = salt_buf[0]; + t0[1] = salt_buf[1]; + t0[2] = salt_buf[2]; + t0[3] = salt_buf[3]; + + u32x t1[4]; + + t1[0] = swap_workaround (w0[0]); + t1[1] = swap_workaround (w0[1]); + t1[2] = swap_workaround (w0[2]); + t1[3] = swap_workaround (w0[3]); + + u32x t2[4]; + + t2[0] = swap_workaround (w1[0]); + t2[1] = swap_workaround (w1[1]); + t2[2] = swap_workaround (w1[2]); + t2[3] = swap_workaround (w1[3]); + + u32x t3[4]; + + t3[0] = swap_workaround (w2[0]); + t3[1] = swap_workaround (w2[1]); + t3[2] = 0; + t3[3] = (salt_len + (pw_len * 2)) * 8; + + u32x digest[5]; + + digest[0] = SHA1M_A; + digest[1] = SHA1M_B; + digest[2] = SHA1M_C; + digest[3] = SHA1M_D; + digest[4] = SHA1M_E; + + sha1_transform (t0, t1, t2, t3, digest); + + tmps[gid].out[0] = digest[0]; + tmps[gid].out[1] = digest[1]; + tmps[gid].out[2] = digest[2]; + tmps[gid].out[3] = digest[3]; + tmps[gid].out[4] = digest[4]; +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m09400_loop (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global office2007_tmp_t *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global office2007_t *office2007_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = 0; + w0[1] = tmps[gid].out[0]; + w0[2] = tmps[gid].out[1]; + w0[3] = tmps[gid].out[2]; + + u32x w1[4]; + + w1[0] = tmps[gid].out[3]; + w1[1] = tmps[gid].out[4]; + w1[2] = 0x80000000; + w1[3] = 0; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = (4 + 20) * 8; + + for (u32 i = 0, j = loop_pos; i < loop_cnt; i++, j++) + { + w0[0] = swap_workaround (j); + + u32x digest[5]; + + digest[0] = SHA1M_A; + digest[1] = SHA1M_B; + digest[2] = SHA1M_C; + digest[3] = SHA1M_D; + digest[4] = SHA1M_E; + + sha1_transform (w0, w1, w2, w3, digest); + + w0[1] = digest[0]; + w0[2] = digest[1]; + w0[3] = digest[2]; + w1[0] = digest[3]; + w1[1] = digest[4]; + } + + tmps[gid].out[0] = w0[1]; + tmps[gid].out[1] = w0[2]; + tmps[gid].out[2] = w0[3]; + tmps[gid].out[3] = w1[0]; + tmps[gid].out[4] = w1[1]; +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m09400_comp (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global office2007_tmp_t *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global office2007_t *office2007_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + const u32 gid = get_global_id (0); + const u32 lid = get_local_id (0); + + /** + * aes shared + */ + + const u32 lid4 = lid * 4; + + __local u32 s_td0[256]; + __local u32 s_td1[256]; + __local u32 s_td2[256]; + __local u32 s_td3[256]; + __local u32 s_td4[256]; + + __local u32 s_te0[256]; + __local u32 s_te1[256]; + __local u32 s_te2[256]; + __local u32 s_te3[256]; + __local u32 s_te4[256]; + + s_td0[lid4 + 0] = td0[lid4 + 0]; + s_td0[lid4 + 1] = td0[lid4 + 1]; + s_td0[lid4 + 2] = td0[lid4 + 2]; + s_td0[lid4 + 3] = td0[lid4 + 3]; + + s_td1[lid4 + 0] = td1[lid4 + 0]; + s_td1[lid4 + 1] = td1[lid4 + 1]; + s_td1[lid4 + 2] = td1[lid4 + 2]; + s_td1[lid4 + 3] = td1[lid4 + 3]; + + s_td2[lid4 + 0] = td2[lid4 + 0]; + s_td2[lid4 + 1] = td2[lid4 + 1]; + s_td2[lid4 + 2] = td2[lid4 + 2]; + s_td2[lid4 + 3] = td2[lid4 + 3]; + + s_td3[lid4 + 0] = td3[lid4 + 0]; + s_td3[lid4 + 1] = td3[lid4 + 1]; + s_td3[lid4 + 2] = td3[lid4 + 2]; + s_td3[lid4 + 3] = td3[lid4 + 3]; + + s_td4[lid4 + 0] = td4[lid4 + 0]; + s_td4[lid4 + 1] = td4[lid4 + 1]; + s_td4[lid4 + 2] = td4[lid4 + 2]; + s_td4[lid4 + 3] = td4[lid4 + 3]; + + s_te0[lid4 + 0] = te0[lid4 + 0]; + s_te0[lid4 + 1] = te0[lid4 + 1]; + s_te0[lid4 + 2] = te0[lid4 + 2]; + s_te0[lid4 + 3] = te0[lid4 + 3]; + + s_te1[lid4 + 0] = te1[lid4 + 0]; + s_te1[lid4 + 1] = te1[lid4 + 1]; + s_te1[lid4 + 2] = te1[lid4 + 2]; + s_te1[lid4 + 3] = te1[lid4 + 3]; + + s_te2[lid4 + 0] = te2[lid4 + 0]; + s_te2[lid4 + 1] = te2[lid4 + 1]; + s_te2[lid4 + 2] = te2[lid4 + 2]; + s_te2[lid4 + 3] = te2[lid4 + 3]; + + s_te3[lid4 + 0] = te3[lid4 + 0]; + s_te3[lid4 + 1] = te3[lid4 + 1]; + s_te3[lid4 + 2] = te3[lid4 + 2]; + s_te3[lid4 + 3] = te3[lid4 + 3]; + + s_te4[lid4 + 0] = te4[lid4 + 0]; + s_te4[lid4 + 1] = te4[lid4 + 1]; + s_te4[lid4 + 2] = te4[lid4 + 2]; + s_te4[lid4 + 3] = te4[lid4 + 3]; + + barrier (CLK_LOCAL_MEM_FENCE); + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = tmps[gid].out[0]; + w0[1] = tmps[gid].out[1]; + w0[2] = tmps[gid].out[2]; + w0[3] = tmps[gid].out[3]; + + u32x w1[4]; + + w1[0] = tmps[gid].out[4]; + w1[1] = 0; + w1[2] = 0x80000000; + w1[3] = 0; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = (20 + 4) * 8; + + u32 digest_common[5]; + + digest_common[0] = SHA1M_A; + digest_common[1] = SHA1M_B; + digest_common[2] = SHA1M_C; + digest_common[3] = SHA1M_D; + digest_common[4] = SHA1M_E; + + sha1_transform (w0, w1, w2, w3, digest_common); + + w0[0] = 0x36363636 ^ digest_common[0]; + w0[1] = 0x36363636 ^ digest_common[1]; + w0[2] = 0x36363636 ^ digest_common[2]; + w0[3] = 0x36363636 ^ digest_common[3]; + w1[0] = 0x36363636 ^ digest_common[4]; + w1[1] = 0x36363636; + w1[2] = 0x36363636; + w1[3] = 0x36363636; + w2[0] = 0x36363636; + w2[1] = 0x36363636; + w2[2] = 0x36363636; + w2[3] = 0x36363636; + w3[0] = 0x36363636; + w3[1] = 0x36363636; + w3[2] = 0x36363636; + w3[3] = 0x36363636; + + u32 digest[5]; + + digest[0] = SHA1M_A; + digest[1] = SHA1M_B; + digest[2] = SHA1M_C; + digest[3] = SHA1M_D; + digest[4] = SHA1M_E; + + sha1_transform (w0, w1, w2, w3, digest); + + w0[0] = 0x80000000; + w0[1] = 0; + w0[2] = 0; + w0[3] = 0; + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 64 * 8; + + sha1_transform (w0, w1, w2, w3, digest); + + // save digest for the AES-256 variant + + u32 digest_saved[5]; + + digest_saved[0] = digest[0]; + digest_saved[1] = digest[1]; + digest_saved[2] = digest[2]; + digest_saved[3] = digest[3]; + digest_saved[4] = digest[4]; + + // now we got the AES key, decrypt the verifier + + u32x rek[60]; + u32x rdk[60]; + + u32 verifier[4]; + + verifier[0] = office2007_bufs[salt_pos].encryptedVerifier[0]; + verifier[1] = office2007_bufs[salt_pos].encryptedVerifier[1]; + verifier[2] = office2007_bufs[salt_pos].encryptedVerifier[2]; + verifier[3] = office2007_bufs[salt_pos].encryptedVerifier[3]; + + u32 data[8]; + + data[0] = verifier[0]; + data[1] = verifier[1]; + data[2] = verifier[2]; + data[3] = verifier[3]; + + data[4] = 0; + data[5] = 0; + data[6] = 0; + data[7] = 0; + + u32x ukeyx[8]; + + ukeyx[0] = digest[0]; + ukeyx[1] = digest[1]; + ukeyx[2] = digest[2]; + ukeyx[3] = digest[3]; + + AES128_ExpandKey (ukeyx, rek, s_te0, s_te1, s_te2, s_te3, s_te4); + + for (u32 i = 0; i < 44; i++) rdk[i] = rek[i]; + + AES128_InvertKey (rdk, s_td0, s_td1, s_td2, s_td3, s_td4, s_te0, s_te1, s_te2, s_te3, s_te4); + + u32 out[4]; + + AES128_decrypt (data, out, rdk, s_td0, s_td1, s_td2, s_td3, s_td4); + + // do a sha1 of the result + + w0[0] = out[0]; + w0[1] = out[1]; + w0[2] = out[2]; + w0[3] = out[3]; + w1[0] = 0x80000000; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 16 * 8; + + digest[0] = SHA1M_A; + digest[1] = SHA1M_B; + digest[2] = SHA1M_C; + digest[3] = SHA1M_D; + digest[4] = SHA1M_E; + + sha1_transform (w0, w1, w2, w3, digest); + + // encrypt it again for verify + + data[0] = digest[0]; + data[1] = digest[1]; + data[2] = digest[2]; + data[3] = digest[3]; + + AES128_encrypt (data, out, rek, s_te0, s_te1, s_te2, s_te3, s_te4); + + { + const u32x r0 = out[0]; + const u32x r1 = out[1]; + const u32x r2 = out[2]; + const u32x r3 = out[3]; + + #define il_pos 0 + + #include VECT_COMPARE_M + } + + /* + * AES-256 test + */ + + // try same procedure but with AES-256 + + w0[0] = 0x5c5c5c5c ^ digest_common[0]; + w0[1] = 0x5c5c5c5c ^ digest_common[1]; + w0[2] = 0x5c5c5c5c ^ digest_common[2]; + w0[3] = 0x5c5c5c5c ^ digest_common[3]; + w1[0] = 0x5c5c5c5c ^ digest_common[4]; + w1[1] = 0x5c5c5c5c; + w1[2] = 0x5c5c5c5c; + w1[3] = 0x5c5c5c5c; + w2[0] = 0x5c5c5c5c; + w2[1] = 0x5c5c5c5c; + w2[2] = 0x5c5c5c5c; + w2[3] = 0x5c5c5c5c; + w3[0] = 0x5c5c5c5c; + w3[1] = 0x5c5c5c5c; + w3[2] = 0x5c5c5c5c; + w3[3] = 0x5c5c5c5c; + + digest[0] = SHA1M_A; + digest[1] = SHA1M_B; + digest[2] = SHA1M_C; + digest[3] = SHA1M_D; + digest[4] = SHA1M_E; + + sha1_transform (w0, w1, w2, w3, digest); + + w0[0] = 0x80000000; + w0[1] = 0; + w0[2] = 0; + w0[3] = 0; + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 64 * 8; + + sha1_transform (w0, w1, w2, w3, digest); + + // now we got the AES key, decrypt the verifier + + ukeyx[0] = digest_saved[0]; + ukeyx[1] = digest_saved[1]; + ukeyx[2] = digest_saved[2]; + ukeyx[3] = digest_saved[3]; + ukeyx[4] = digest_saved[4]; + ukeyx[5] = digest[0]; + ukeyx[6] = digest[1]; + ukeyx[7] = digest[2]; + + AES256_ExpandKey (ukeyx, rek, s_te0, s_te1, s_te2, s_te3, s_te4); + + for (u32 i = 0; i < 60; i++) rdk[i] = rek[i]; + + AES256_InvertKey (rdk, s_td0, s_td1, s_td2, s_td3, s_td4, s_te0, s_te1, s_te2, s_te3, s_te4); + + data[0] = verifier[0]; + data[1] = verifier[1]; + data[2] = verifier[2]; + data[3] = verifier[3]; + + AES256_decrypt (data, out, rdk, s_td0, s_td1, s_td2, s_td3, s_td4); + + // do a sha1 of the result + + w0[0] = out[0]; + w0[1] = out[1]; + w0[2] = out[2]; + w0[3] = out[3]; + w1[0] = 0x80000000; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 16 * 8; + + digest[0] = SHA1M_A; + digest[1] = SHA1M_B; + digest[2] = SHA1M_C; + digest[3] = SHA1M_D; + digest[4] = SHA1M_E; + + sha1_transform (w0, w1, w2, w3, digest); + + // encrypt it again for verify + + data[0] = digest[0]; + data[1] = digest[1]; + data[2] = digest[2]; + data[3] = digest[3]; + + AES256_encrypt (data, out, rek, s_te0, s_te1, s_te2, s_te3, s_te4); + + { + const u32x r0 = out[0]; + const u32x r1 = out[1]; + const u32x r2 = out[2]; + const u32x r3 = out[3]; + + #define il_pos 0 + + #include VECT_COMPARE_M + } +} diff --git a/amd/m09500.cl b/amd/m09500.cl new file mode 100644 index 0000000000..b974298b37 --- /dev/null +++ b/amd/m09500.cl @@ -0,0 +1,1468 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _OFFICE2010_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW4 +#define VECT_SIZE1 +#endif + +#ifdef VLIW5 +#define VECT_SIZE1 +#endif + +#define DGST_R0 0 +#define DGST_R1 1 +#define DGST_R2 2 +#define DGST_R3 3 + +#include "include/kernel_functions.c" +#include "types_amd.c" +#include "common_amd.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +__constant u32 te0[256] = +{ + 0xc66363a5, 0xf87c7c84, 0xee777799, 0xf67b7b8d, + 0xfff2f20d, 0xd66b6bbd, 0xde6f6fb1, 0x91c5c554, + 0x60303050, 0x02010103, 0xce6767a9, 0x562b2b7d, + 0xe7fefe19, 0xb5d7d762, 0x4dababe6, 0xec76769a, + 0x8fcaca45, 0x1f82829d, 0x89c9c940, 0xfa7d7d87, + 0xeffafa15, 0xb25959eb, 0x8e4747c9, 0xfbf0f00b, + 0x41adadec, 0xb3d4d467, 0x5fa2a2fd, 0x45afafea, + 0x239c9cbf, 0x53a4a4f7, 0xe4727296, 0x9bc0c05b, + 0x75b7b7c2, 0xe1fdfd1c, 0x3d9393ae, 0x4c26266a, + 0x6c36365a, 0x7e3f3f41, 0xf5f7f702, 0x83cccc4f, + 0x6834345c, 0x51a5a5f4, 0xd1e5e534, 0xf9f1f108, + 0xe2717193, 0xabd8d873, 0x62313153, 0x2a15153f, + 0x0804040c, 0x95c7c752, 0x46232365, 0x9dc3c35e, + 0x30181828, 0x379696a1, 0x0a05050f, 0x2f9a9ab5, + 0x0e070709, 0x24121236, 0x1b80809b, 0xdfe2e23d, + 0xcdebeb26, 0x4e272769, 0x7fb2b2cd, 0xea75759f, + 0x1209091b, 0x1d83839e, 0x582c2c74, 0x341a1a2e, + 0x361b1b2d, 0xdc6e6eb2, 0xb45a5aee, 0x5ba0a0fb, + 0xa45252f6, 0x763b3b4d, 0xb7d6d661, 0x7db3b3ce, + 0x5229297b, 0xdde3e33e, 0x5e2f2f71, 0x13848497, + 0xa65353f5, 0xb9d1d168, 0x00000000, 0xc1eded2c, + 0x40202060, 0xe3fcfc1f, 0x79b1b1c8, 0xb65b5bed, + 0xd46a6abe, 0x8dcbcb46, 0x67bebed9, 0x7239394b, + 0x944a4ade, 0x984c4cd4, 0xb05858e8, 0x85cfcf4a, + 0xbbd0d06b, 0xc5efef2a, 0x4faaaae5, 0xedfbfb16, + 0x864343c5, 0x9a4d4dd7, 0x66333355, 0x11858594, + 0x8a4545cf, 0xe9f9f910, 0x04020206, 0xfe7f7f81, + 0xa05050f0, 0x783c3c44, 0x259f9fba, 0x4ba8a8e3, + 0xa25151f3, 0x5da3a3fe, 0x804040c0, 0x058f8f8a, + 0x3f9292ad, 0x219d9dbc, 0x70383848, 0xf1f5f504, + 0x63bcbcdf, 0x77b6b6c1, 0xafdada75, 0x42212163, + 0x20101030, 0xe5ffff1a, 0xfdf3f30e, 0xbfd2d26d, + 0x81cdcd4c, 0x180c0c14, 0x26131335, 0xc3ecec2f, + 0xbe5f5fe1, 0x359797a2, 0x884444cc, 0x2e171739, + 0x93c4c457, 0x55a7a7f2, 0xfc7e7e82, 0x7a3d3d47, + 0xc86464ac, 0xba5d5de7, 0x3219192b, 0xe6737395, + 0xc06060a0, 0x19818198, 0x9e4f4fd1, 0xa3dcdc7f, + 0x44222266, 0x542a2a7e, 0x3b9090ab, 0x0b888883, + 0x8c4646ca, 0xc7eeee29, 0x6bb8b8d3, 0x2814143c, + 0xa7dede79, 0xbc5e5ee2, 0x160b0b1d, 0xaddbdb76, + 0xdbe0e03b, 0x64323256, 0x743a3a4e, 0x140a0a1e, + 0x924949db, 0x0c06060a, 0x4824246c, 0xb85c5ce4, + 0x9fc2c25d, 0xbdd3d36e, 0x43acacef, 0xc46262a6, + 0x399191a8, 0x319595a4, 0xd3e4e437, 0xf279798b, + 0xd5e7e732, 0x8bc8c843, 0x6e373759, 0xda6d6db7, + 0x018d8d8c, 0xb1d5d564, 0x9c4e4ed2, 0x49a9a9e0, + 0xd86c6cb4, 0xac5656fa, 0xf3f4f407, 0xcfeaea25, + 0xca6565af, 0xf47a7a8e, 0x47aeaee9, 0x10080818, + 0x6fbabad5, 0xf0787888, 0x4a25256f, 0x5c2e2e72, + 0x381c1c24, 0x57a6a6f1, 0x73b4b4c7, 0x97c6c651, + 0xcbe8e823, 0xa1dddd7c, 0xe874749c, 0x3e1f1f21, + 0x964b4bdd, 0x61bdbddc, 0x0d8b8b86, 0x0f8a8a85, + 0xe0707090, 0x7c3e3e42, 0x71b5b5c4, 0xcc6666aa, + 0x904848d8, 0x06030305, 0xf7f6f601, 0x1c0e0e12, + 0xc26161a3, 0x6a35355f, 0xae5757f9, 0x69b9b9d0, + 0x17868691, 0x99c1c158, 0x3a1d1d27, 0x279e9eb9, + 0xd9e1e138, 0xebf8f813, 0x2b9898b3, 0x22111133, + 0xd26969bb, 0xa9d9d970, 0x078e8e89, 0x339494a7, + 0x2d9b9bb6, 0x3c1e1e22, 0x15878792, 0xc9e9e920, + 0x87cece49, 0xaa5555ff, 0x50282878, 0xa5dfdf7a, + 0x038c8c8f, 0x59a1a1f8, 0x09898980, 0x1a0d0d17, + 0x65bfbfda, 0xd7e6e631, 0x844242c6, 0xd06868b8, + 0x824141c3, 0x299999b0, 0x5a2d2d77, 0x1e0f0f11, + 0x7bb0b0cb, 0xa85454fc, 0x6dbbbbd6, 0x2c16163a, +}; + +__constant u32 te1[256] = +{ + 0xa5c66363, 0x84f87c7c, 0x99ee7777, 0x8df67b7b, + 0x0dfff2f2, 0xbdd66b6b, 0xb1de6f6f, 0x5491c5c5, + 0x50603030, 0x03020101, 0xa9ce6767, 0x7d562b2b, + 0x19e7fefe, 0x62b5d7d7, 0xe64dabab, 0x9aec7676, + 0x458fcaca, 0x9d1f8282, 0x4089c9c9, 0x87fa7d7d, + 0x15effafa, 0xebb25959, 0xc98e4747, 0x0bfbf0f0, + 0xec41adad, 0x67b3d4d4, 0xfd5fa2a2, 0xea45afaf, + 0xbf239c9c, 0xf753a4a4, 0x96e47272, 0x5b9bc0c0, + 0xc275b7b7, 0x1ce1fdfd, 0xae3d9393, 0x6a4c2626, + 0x5a6c3636, 0x417e3f3f, 0x02f5f7f7, 0x4f83cccc, + 0x5c683434, 0xf451a5a5, 0x34d1e5e5, 0x08f9f1f1, + 0x93e27171, 0x73abd8d8, 0x53623131, 0x3f2a1515, + 0x0c080404, 0x5295c7c7, 0x65462323, 0x5e9dc3c3, + 0x28301818, 0xa1379696, 0x0f0a0505, 0xb52f9a9a, + 0x090e0707, 0x36241212, 0x9b1b8080, 0x3ddfe2e2, + 0x26cdebeb, 0x694e2727, 0xcd7fb2b2, 0x9fea7575, + 0x1b120909, 0x9e1d8383, 0x74582c2c, 0x2e341a1a, + 0x2d361b1b, 0xb2dc6e6e, 0xeeb45a5a, 0xfb5ba0a0, + 0xf6a45252, 0x4d763b3b, 0x61b7d6d6, 0xce7db3b3, + 0x7b522929, 0x3edde3e3, 0x715e2f2f, 0x97138484, + 0xf5a65353, 0x68b9d1d1, 0x00000000, 0x2cc1eded, + 0x60402020, 0x1fe3fcfc, 0xc879b1b1, 0xedb65b5b, + 0xbed46a6a, 0x468dcbcb, 0xd967bebe, 0x4b723939, + 0xde944a4a, 0xd4984c4c, 0xe8b05858, 0x4a85cfcf, + 0x6bbbd0d0, 0x2ac5efef, 0xe54faaaa, 0x16edfbfb, + 0xc5864343, 0xd79a4d4d, 0x55663333, 0x94118585, + 0xcf8a4545, 0x10e9f9f9, 0x06040202, 0x81fe7f7f, + 0xf0a05050, 0x44783c3c, 0xba259f9f, 0xe34ba8a8, + 0xf3a25151, 0xfe5da3a3, 0xc0804040, 0x8a058f8f, + 0xad3f9292, 0xbc219d9d, 0x48703838, 0x04f1f5f5, + 0xdf63bcbc, 0xc177b6b6, 0x75afdada, 0x63422121, + 0x30201010, 0x1ae5ffff, 0x0efdf3f3, 0x6dbfd2d2, + 0x4c81cdcd, 0x14180c0c, 0x35261313, 0x2fc3ecec, + 0xe1be5f5f, 0xa2359797, 0xcc884444, 0x392e1717, + 0x5793c4c4, 0xf255a7a7, 0x82fc7e7e, 0x477a3d3d, + 0xacc86464, 0xe7ba5d5d, 0x2b321919, 0x95e67373, + 0xa0c06060, 0x98198181, 0xd19e4f4f, 0x7fa3dcdc, + 0x66442222, 0x7e542a2a, 0xab3b9090, 0x830b8888, + 0xca8c4646, 0x29c7eeee, 0xd36bb8b8, 0x3c281414, + 0x79a7dede, 0xe2bc5e5e, 0x1d160b0b, 0x76addbdb, + 0x3bdbe0e0, 0x56643232, 0x4e743a3a, 0x1e140a0a, + 0xdb924949, 0x0a0c0606, 0x6c482424, 0xe4b85c5c, + 0x5d9fc2c2, 0x6ebdd3d3, 0xef43acac, 0xa6c46262, + 0xa8399191, 0xa4319595, 0x37d3e4e4, 0x8bf27979, + 0x32d5e7e7, 0x438bc8c8, 0x596e3737, 0xb7da6d6d, + 0x8c018d8d, 0x64b1d5d5, 0xd29c4e4e, 0xe049a9a9, + 0xb4d86c6c, 0xfaac5656, 0x07f3f4f4, 0x25cfeaea, + 0xafca6565, 0x8ef47a7a, 0xe947aeae, 0x18100808, + 0xd56fbaba, 0x88f07878, 0x6f4a2525, 0x725c2e2e, + 0x24381c1c, 0xf157a6a6, 0xc773b4b4, 0x5197c6c6, + 0x23cbe8e8, 0x7ca1dddd, 0x9ce87474, 0x213e1f1f, + 0xdd964b4b, 0xdc61bdbd, 0x860d8b8b, 0x850f8a8a, + 0x90e07070, 0x427c3e3e, 0xc471b5b5, 0xaacc6666, + 0xd8904848, 0x05060303, 0x01f7f6f6, 0x121c0e0e, + 0xa3c26161, 0x5f6a3535, 0xf9ae5757, 0xd069b9b9, + 0x91178686, 0x5899c1c1, 0x273a1d1d, 0xb9279e9e, + 0x38d9e1e1, 0x13ebf8f8, 0xb32b9898, 0x33221111, + 0xbbd26969, 0x70a9d9d9, 0x89078e8e, 0xa7339494, + 0xb62d9b9b, 0x223c1e1e, 0x92158787, 0x20c9e9e9, + 0x4987cece, 0xffaa5555, 0x78502828, 0x7aa5dfdf, + 0x8f038c8c, 0xf859a1a1, 0x80098989, 0x171a0d0d, + 0xda65bfbf, 0x31d7e6e6, 0xc6844242, 0xb8d06868, + 0xc3824141, 0xb0299999, 0x775a2d2d, 0x111e0f0f, + 0xcb7bb0b0, 0xfca85454, 0xd66dbbbb, 0x3a2c1616, +}; + +__constant u32 te2[256] = +{ + 0x63a5c663, 0x7c84f87c, 0x7799ee77, 0x7b8df67b, + 0xf20dfff2, 0x6bbdd66b, 0x6fb1de6f, 0xc55491c5, + 0x30506030, 0x01030201, 0x67a9ce67, 0x2b7d562b, + 0xfe19e7fe, 0xd762b5d7, 0xabe64dab, 0x769aec76, + 0xca458fca, 0x829d1f82, 0xc94089c9, 0x7d87fa7d, + 0xfa15effa, 0x59ebb259, 0x47c98e47, 0xf00bfbf0, + 0xadec41ad, 0xd467b3d4, 0xa2fd5fa2, 0xafea45af, + 0x9cbf239c, 0xa4f753a4, 0x7296e472, 0xc05b9bc0, + 0xb7c275b7, 0xfd1ce1fd, 0x93ae3d93, 0x266a4c26, + 0x365a6c36, 0x3f417e3f, 0xf702f5f7, 0xcc4f83cc, + 0x345c6834, 0xa5f451a5, 0xe534d1e5, 0xf108f9f1, + 0x7193e271, 0xd873abd8, 0x31536231, 0x153f2a15, + 0x040c0804, 0xc75295c7, 0x23654623, 0xc35e9dc3, + 0x18283018, 0x96a13796, 0x050f0a05, 0x9ab52f9a, + 0x07090e07, 0x12362412, 0x809b1b80, 0xe23ddfe2, + 0xeb26cdeb, 0x27694e27, 0xb2cd7fb2, 0x759fea75, + 0x091b1209, 0x839e1d83, 0x2c74582c, 0x1a2e341a, + 0x1b2d361b, 0x6eb2dc6e, 0x5aeeb45a, 0xa0fb5ba0, + 0x52f6a452, 0x3b4d763b, 0xd661b7d6, 0xb3ce7db3, + 0x297b5229, 0xe33edde3, 0x2f715e2f, 0x84971384, + 0x53f5a653, 0xd168b9d1, 0x00000000, 0xed2cc1ed, + 0x20604020, 0xfc1fe3fc, 0xb1c879b1, 0x5bedb65b, + 0x6abed46a, 0xcb468dcb, 0xbed967be, 0x394b7239, + 0x4ade944a, 0x4cd4984c, 0x58e8b058, 0xcf4a85cf, + 0xd06bbbd0, 0xef2ac5ef, 0xaae54faa, 0xfb16edfb, + 0x43c58643, 0x4dd79a4d, 0x33556633, 0x85941185, + 0x45cf8a45, 0xf910e9f9, 0x02060402, 0x7f81fe7f, + 0x50f0a050, 0x3c44783c, 0x9fba259f, 0xa8e34ba8, + 0x51f3a251, 0xa3fe5da3, 0x40c08040, 0x8f8a058f, + 0x92ad3f92, 0x9dbc219d, 0x38487038, 0xf504f1f5, + 0xbcdf63bc, 0xb6c177b6, 0xda75afda, 0x21634221, + 0x10302010, 0xff1ae5ff, 0xf30efdf3, 0xd26dbfd2, + 0xcd4c81cd, 0x0c14180c, 0x13352613, 0xec2fc3ec, + 0x5fe1be5f, 0x97a23597, 0x44cc8844, 0x17392e17, + 0xc45793c4, 0xa7f255a7, 0x7e82fc7e, 0x3d477a3d, + 0x64acc864, 0x5de7ba5d, 0x192b3219, 0x7395e673, + 0x60a0c060, 0x81981981, 0x4fd19e4f, 0xdc7fa3dc, + 0x22664422, 0x2a7e542a, 0x90ab3b90, 0x88830b88, + 0x46ca8c46, 0xee29c7ee, 0xb8d36bb8, 0x143c2814, + 0xde79a7de, 0x5ee2bc5e, 0x0b1d160b, 0xdb76addb, + 0xe03bdbe0, 0x32566432, 0x3a4e743a, 0x0a1e140a, + 0x49db9249, 0x060a0c06, 0x246c4824, 0x5ce4b85c, + 0xc25d9fc2, 0xd36ebdd3, 0xacef43ac, 0x62a6c462, + 0x91a83991, 0x95a43195, 0xe437d3e4, 0x798bf279, + 0xe732d5e7, 0xc8438bc8, 0x37596e37, 0x6db7da6d, + 0x8d8c018d, 0xd564b1d5, 0x4ed29c4e, 0xa9e049a9, + 0x6cb4d86c, 0x56faac56, 0xf407f3f4, 0xea25cfea, + 0x65afca65, 0x7a8ef47a, 0xaee947ae, 0x08181008, + 0xbad56fba, 0x7888f078, 0x256f4a25, 0x2e725c2e, + 0x1c24381c, 0xa6f157a6, 0xb4c773b4, 0xc65197c6, + 0xe823cbe8, 0xdd7ca1dd, 0x749ce874, 0x1f213e1f, + 0x4bdd964b, 0xbddc61bd, 0x8b860d8b, 0x8a850f8a, + 0x7090e070, 0x3e427c3e, 0xb5c471b5, 0x66aacc66, + 0x48d89048, 0x03050603, 0xf601f7f6, 0x0e121c0e, + 0x61a3c261, 0x355f6a35, 0x57f9ae57, 0xb9d069b9, + 0x86911786, 0xc15899c1, 0x1d273a1d, 0x9eb9279e, + 0xe138d9e1, 0xf813ebf8, 0x98b32b98, 0x11332211, + 0x69bbd269, 0xd970a9d9, 0x8e89078e, 0x94a73394, + 0x9bb62d9b, 0x1e223c1e, 0x87921587, 0xe920c9e9, + 0xce4987ce, 0x55ffaa55, 0x28785028, 0xdf7aa5df, + 0x8c8f038c, 0xa1f859a1, 0x89800989, 0x0d171a0d, + 0xbfda65bf, 0xe631d7e6, 0x42c68442, 0x68b8d068, + 0x41c38241, 0x99b02999, 0x2d775a2d, 0x0f111e0f, + 0xb0cb7bb0, 0x54fca854, 0xbbd66dbb, 0x163a2c16, +}; + +__constant u32 te3[256] = +{ + 0x6363a5c6, 0x7c7c84f8, 0x777799ee, 0x7b7b8df6, + 0xf2f20dff, 0x6b6bbdd6, 0x6f6fb1de, 0xc5c55491, + 0x30305060, 0x01010302, 0x6767a9ce, 0x2b2b7d56, + 0xfefe19e7, 0xd7d762b5, 0xababe64d, 0x76769aec, + 0xcaca458f, 0x82829d1f, 0xc9c94089, 0x7d7d87fa, + 0xfafa15ef, 0x5959ebb2, 0x4747c98e, 0xf0f00bfb, + 0xadadec41, 0xd4d467b3, 0xa2a2fd5f, 0xafafea45, + 0x9c9cbf23, 0xa4a4f753, 0x727296e4, 0xc0c05b9b, + 0xb7b7c275, 0xfdfd1ce1, 0x9393ae3d, 0x26266a4c, + 0x36365a6c, 0x3f3f417e, 0xf7f702f5, 0xcccc4f83, + 0x34345c68, 0xa5a5f451, 0xe5e534d1, 0xf1f108f9, + 0x717193e2, 0xd8d873ab, 0x31315362, 0x15153f2a, + 0x04040c08, 0xc7c75295, 0x23236546, 0xc3c35e9d, + 0x18182830, 0x9696a137, 0x05050f0a, 0x9a9ab52f, + 0x0707090e, 0x12123624, 0x80809b1b, 0xe2e23ddf, + 0xebeb26cd, 0x2727694e, 0xb2b2cd7f, 0x75759fea, + 0x09091b12, 0x83839e1d, 0x2c2c7458, 0x1a1a2e34, + 0x1b1b2d36, 0x6e6eb2dc, 0x5a5aeeb4, 0xa0a0fb5b, + 0x5252f6a4, 0x3b3b4d76, 0xd6d661b7, 0xb3b3ce7d, + 0x29297b52, 0xe3e33edd, 0x2f2f715e, 0x84849713, + 0x5353f5a6, 0xd1d168b9, 0x00000000, 0xeded2cc1, + 0x20206040, 0xfcfc1fe3, 0xb1b1c879, 0x5b5bedb6, + 0x6a6abed4, 0xcbcb468d, 0xbebed967, 0x39394b72, + 0x4a4ade94, 0x4c4cd498, 0x5858e8b0, 0xcfcf4a85, + 0xd0d06bbb, 0xefef2ac5, 0xaaaae54f, 0xfbfb16ed, + 0x4343c586, 0x4d4dd79a, 0x33335566, 0x85859411, + 0x4545cf8a, 0xf9f910e9, 0x02020604, 0x7f7f81fe, + 0x5050f0a0, 0x3c3c4478, 0x9f9fba25, 0xa8a8e34b, + 0x5151f3a2, 0xa3a3fe5d, 0x4040c080, 0x8f8f8a05, + 0x9292ad3f, 0x9d9dbc21, 0x38384870, 0xf5f504f1, + 0xbcbcdf63, 0xb6b6c177, 0xdada75af, 0x21216342, + 0x10103020, 0xffff1ae5, 0xf3f30efd, 0xd2d26dbf, + 0xcdcd4c81, 0x0c0c1418, 0x13133526, 0xecec2fc3, + 0x5f5fe1be, 0x9797a235, 0x4444cc88, 0x1717392e, + 0xc4c45793, 0xa7a7f255, 0x7e7e82fc, 0x3d3d477a, + 0x6464acc8, 0x5d5de7ba, 0x19192b32, 0x737395e6, + 0x6060a0c0, 0x81819819, 0x4f4fd19e, 0xdcdc7fa3, + 0x22226644, 0x2a2a7e54, 0x9090ab3b, 0x8888830b, + 0x4646ca8c, 0xeeee29c7, 0xb8b8d36b, 0x14143c28, + 0xdede79a7, 0x5e5ee2bc, 0x0b0b1d16, 0xdbdb76ad, + 0xe0e03bdb, 0x32325664, 0x3a3a4e74, 0x0a0a1e14, + 0x4949db92, 0x06060a0c, 0x24246c48, 0x5c5ce4b8, + 0xc2c25d9f, 0xd3d36ebd, 0xacacef43, 0x6262a6c4, + 0x9191a839, 0x9595a431, 0xe4e437d3, 0x79798bf2, + 0xe7e732d5, 0xc8c8438b, 0x3737596e, 0x6d6db7da, + 0x8d8d8c01, 0xd5d564b1, 0x4e4ed29c, 0xa9a9e049, + 0x6c6cb4d8, 0x5656faac, 0xf4f407f3, 0xeaea25cf, + 0x6565afca, 0x7a7a8ef4, 0xaeaee947, 0x08081810, + 0xbabad56f, 0x787888f0, 0x25256f4a, 0x2e2e725c, + 0x1c1c2438, 0xa6a6f157, 0xb4b4c773, 0xc6c65197, + 0xe8e823cb, 0xdddd7ca1, 0x74749ce8, 0x1f1f213e, + 0x4b4bdd96, 0xbdbddc61, 0x8b8b860d, 0x8a8a850f, + 0x707090e0, 0x3e3e427c, 0xb5b5c471, 0x6666aacc, + 0x4848d890, 0x03030506, 0xf6f601f7, 0x0e0e121c, + 0x6161a3c2, 0x35355f6a, 0x5757f9ae, 0xb9b9d069, + 0x86869117, 0xc1c15899, 0x1d1d273a, 0x9e9eb927, + 0xe1e138d9, 0xf8f813eb, 0x9898b32b, 0x11113322, + 0x6969bbd2, 0xd9d970a9, 0x8e8e8907, 0x9494a733, + 0x9b9bb62d, 0x1e1e223c, 0x87879215, 0xe9e920c9, + 0xcece4987, 0x5555ffaa, 0x28287850, 0xdfdf7aa5, + 0x8c8c8f03, 0xa1a1f859, 0x89898009, 0x0d0d171a, + 0xbfbfda65, 0xe6e631d7, 0x4242c684, 0x6868b8d0, + 0x4141c382, 0x9999b029, 0x2d2d775a, 0x0f0f111e, + 0xb0b0cb7b, 0x5454fca8, 0xbbbbd66d, 0x16163a2c, +}; + +__constant u32 te4[256] = +{ + 0x63636363, 0x7c7c7c7c, 0x77777777, 0x7b7b7b7b, + 0xf2f2f2f2, 0x6b6b6b6b, 0x6f6f6f6f, 0xc5c5c5c5, + 0x30303030, 0x01010101, 0x67676767, 0x2b2b2b2b, + 0xfefefefe, 0xd7d7d7d7, 0xabababab, 0x76767676, + 0xcacacaca, 0x82828282, 0xc9c9c9c9, 0x7d7d7d7d, + 0xfafafafa, 0x59595959, 0x47474747, 0xf0f0f0f0, + 0xadadadad, 0xd4d4d4d4, 0xa2a2a2a2, 0xafafafaf, + 0x9c9c9c9c, 0xa4a4a4a4, 0x72727272, 0xc0c0c0c0, + 0xb7b7b7b7, 0xfdfdfdfd, 0x93939393, 0x26262626, + 0x36363636, 0x3f3f3f3f, 0xf7f7f7f7, 0xcccccccc, + 0x34343434, 0xa5a5a5a5, 0xe5e5e5e5, 0xf1f1f1f1, + 0x71717171, 0xd8d8d8d8, 0x31313131, 0x15151515, + 0x04040404, 0xc7c7c7c7, 0x23232323, 0xc3c3c3c3, + 0x18181818, 0x96969696, 0x05050505, 0x9a9a9a9a, + 0x07070707, 0x12121212, 0x80808080, 0xe2e2e2e2, + 0xebebebeb, 0x27272727, 0xb2b2b2b2, 0x75757575, + 0x09090909, 0x83838383, 0x2c2c2c2c, 0x1a1a1a1a, + 0x1b1b1b1b, 0x6e6e6e6e, 0x5a5a5a5a, 0xa0a0a0a0, + 0x52525252, 0x3b3b3b3b, 0xd6d6d6d6, 0xb3b3b3b3, + 0x29292929, 0xe3e3e3e3, 0x2f2f2f2f, 0x84848484, + 0x53535353, 0xd1d1d1d1, 0x00000000, 0xedededed, + 0x20202020, 0xfcfcfcfc, 0xb1b1b1b1, 0x5b5b5b5b, + 0x6a6a6a6a, 0xcbcbcbcb, 0xbebebebe, 0x39393939, + 0x4a4a4a4a, 0x4c4c4c4c, 0x58585858, 0xcfcfcfcf, + 0xd0d0d0d0, 0xefefefef, 0xaaaaaaaa, 0xfbfbfbfb, + 0x43434343, 0x4d4d4d4d, 0x33333333, 0x85858585, + 0x45454545, 0xf9f9f9f9, 0x02020202, 0x7f7f7f7f, + 0x50505050, 0x3c3c3c3c, 0x9f9f9f9f, 0xa8a8a8a8, + 0x51515151, 0xa3a3a3a3, 0x40404040, 0x8f8f8f8f, + 0x92929292, 0x9d9d9d9d, 0x38383838, 0xf5f5f5f5, + 0xbcbcbcbc, 0xb6b6b6b6, 0xdadadada, 0x21212121, + 0x10101010, 0xffffffff, 0xf3f3f3f3, 0xd2d2d2d2, + 0xcdcdcdcd, 0x0c0c0c0c, 0x13131313, 0xecececec, + 0x5f5f5f5f, 0x97979797, 0x44444444, 0x17171717, + 0xc4c4c4c4, 0xa7a7a7a7, 0x7e7e7e7e, 0x3d3d3d3d, + 0x64646464, 0x5d5d5d5d, 0x19191919, 0x73737373, + 0x60606060, 0x81818181, 0x4f4f4f4f, 0xdcdcdcdc, + 0x22222222, 0x2a2a2a2a, 0x90909090, 0x88888888, + 0x46464646, 0xeeeeeeee, 0xb8b8b8b8, 0x14141414, + 0xdededede, 0x5e5e5e5e, 0x0b0b0b0b, 0xdbdbdbdb, + 0xe0e0e0e0, 0x32323232, 0x3a3a3a3a, 0x0a0a0a0a, + 0x49494949, 0x06060606, 0x24242424, 0x5c5c5c5c, + 0xc2c2c2c2, 0xd3d3d3d3, 0xacacacac, 0x62626262, + 0x91919191, 0x95959595, 0xe4e4e4e4, 0x79797979, + 0xe7e7e7e7, 0xc8c8c8c8, 0x37373737, 0x6d6d6d6d, + 0x8d8d8d8d, 0xd5d5d5d5, 0x4e4e4e4e, 0xa9a9a9a9, + 0x6c6c6c6c, 0x56565656, 0xf4f4f4f4, 0xeaeaeaea, + 0x65656565, 0x7a7a7a7a, 0xaeaeaeae, 0x08080808, + 0xbabababa, 0x78787878, 0x25252525, 0x2e2e2e2e, + 0x1c1c1c1c, 0xa6a6a6a6, 0xb4b4b4b4, 0xc6c6c6c6, + 0xe8e8e8e8, 0xdddddddd, 0x74747474, 0x1f1f1f1f, + 0x4b4b4b4b, 0xbdbdbdbd, 0x8b8b8b8b, 0x8a8a8a8a, + 0x70707070, 0x3e3e3e3e, 0xb5b5b5b5, 0x66666666, + 0x48484848, 0x03030303, 0xf6f6f6f6, 0x0e0e0e0e, + 0x61616161, 0x35353535, 0x57575757, 0xb9b9b9b9, + 0x86868686, 0xc1c1c1c1, 0x1d1d1d1d, 0x9e9e9e9e, + 0xe1e1e1e1, 0xf8f8f8f8, 0x98989898, 0x11111111, + 0x69696969, 0xd9d9d9d9, 0x8e8e8e8e, 0x94949494, + 0x9b9b9b9b, 0x1e1e1e1e, 0x87878787, 0xe9e9e9e9, + 0xcececece, 0x55555555, 0x28282828, 0xdfdfdfdf, + 0x8c8c8c8c, 0xa1a1a1a1, 0x89898989, 0x0d0d0d0d, + 0xbfbfbfbf, 0xe6e6e6e6, 0x42424242, 0x68686868, + 0x41414141, 0x99999999, 0x2d2d2d2d, 0x0f0f0f0f, + 0xb0b0b0b0, 0x54545454, 0xbbbbbbbb, 0x16161616, +}; + +__constant u32 td0[256] = +{ + 0x51f4a750, 0x7e416553, 0x1a17a4c3, 0x3a275e96, + 0x3bab6bcb, 0x1f9d45f1, 0xacfa58ab, 0x4be30393, + 0x2030fa55, 0xad766df6, 0x88cc7691, 0xf5024c25, + 0x4fe5d7fc, 0xc52acbd7, 0x26354480, 0xb562a38f, + 0xdeb15a49, 0x25ba1b67, 0x45ea0e98, 0x5dfec0e1, + 0xc32f7502, 0x814cf012, 0x8d4697a3, 0x6bd3f9c6, + 0x038f5fe7, 0x15929c95, 0xbf6d7aeb, 0x955259da, + 0xd4be832d, 0x587421d3, 0x49e06929, 0x8ec9c844, + 0x75c2896a, 0xf48e7978, 0x99583e6b, 0x27b971dd, + 0xbee14fb6, 0xf088ad17, 0xc920ac66, 0x7dce3ab4, + 0x63df4a18, 0xe51a3182, 0x97513360, 0x62537f45, + 0xb16477e0, 0xbb6bae84, 0xfe81a01c, 0xf9082b94, + 0x70486858, 0x8f45fd19, 0x94de6c87, 0x527bf8b7, + 0xab73d323, 0x724b02e2, 0xe31f8f57, 0x6655ab2a, + 0xb2eb2807, 0x2fb5c203, 0x86c57b9a, 0xd33708a5, + 0x302887f2, 0x23bfa5b2, 0x02036aba, 0xed16825c, + 0x8acf1c2b, 0xa779b492, 0xf307f2f0, 0x4e69e2a1, + 0x65daf4cd, 0x0605bed5, 0xd134621f, 0xc4a6fe8a, + 0x342e539d, 0xa2f355a0, 0x058ae132, 0xa4f6eb75, + 0x0b83ec39, 0x4060efaa, 0x5e719f06, 0xbd6e1051, + 0x3e218af9, 0x96dd063d, 0xdd3e05ae, 0x4de6bd46, + 0x91548db5, 0x71c45d05, 0x0406d46f, 0x605015ff, + 0x1998fb24, 0xd6bde997, 0x894043cc, 0x67d99e77, + 0xb0e842bd, 0x07898b88, 0xe7195b38, 0x79c8eedb, + 0xa17c0a47, 0x7c420fe9, 0xf8841ec9, 0x00000000, + 0x09808683, 0x322bed48, 0x1e1170ac, 0x6c5a724e, + 0xfd0efffb, 0x0f853856, 0x3daed51e, 0x362d3927, + 0x0a0fd964, 0x685ca621, 0x9b5b54d1, 0x24362e3a, + 0x0c0a67b1, 0x9357e70f, 0xb4ee96d2, 0x1b9b919e, + 0x80c0c54f, 0x61dc20a2, 0x5a774b69, 0x1c121a16, + 0xe293ba0a, 0xc0a02ae5, 0x3c22e043, 0x121b171d, + 0x0e090d0b, 0xf28bc7ad, 0x2db6a8b9, 0x141ea9c8, + 0x57f11985, 0xaf75074c, 0xee99ddbb, 0xa37f60fd, + 0xf701269f, 0x5c72f5bc, 0x44663bc5, 0x5bfb7e34, + 0x8b432976, 0xcb23c6dc, 0xb6edfc68, 0xb8e4f163, + 0xd731dcca, 0x42638510, 0x13972240, 0x84c61120, + 0x854a247d, 0xd2bb3df8, 0xaef93211, 0xc729a16d, + 0x1d9e2f4b, 0xdcb230f3, 0x0d8652ec, 0x77c1e3d0, + 0x2bb3166c, 0xa970b999, 0x119448fa, 0x47e96422, + 0xa8fc8cc4, 0xa0f03f1a, 0x567d2cd8, 0x223390ef, + 0x87494ec7, 0xd938d1c1, 0x8ccaa2fe, 0x98d40b36, + 0xa6f581cf, 0xa57ade28, 0xdab78e26, 0x3fadbfa4, + 0x2c3a9de4, 0x5078920d, 0x6a5fcc9b, 0x547e4662, + 0xf68d13c2, 0x90d8b8e8, 0x2e39f75e, 0x82c3aff5, + 0x9f5d80be, 0x69d0937c, 0x6fd52da9, 0xcf2512b3, + 0xc8ac993b, 0x10187da7, 0xe89c636e, 0xdb3bbb7b, + 0xcd267809, 0x6e5918f4, 0xec9ab701, 0x834f9aa8, + 0xe6956e65, 0xaaffe67e, 0x21bccf08, 0xef15e8e6, + 0xbae79bd9, 0x4a6f36ce, 0xea9f09d4, 0x29b07cd6, + 0x31a4b2af, 0x2a3f2331, 0xc6a59430, 0x35a266c0, + 0x744ebc37, 0xfc82caa6, 0xe090d0b0, 0x33a7d815, + 0xf104984a, 0x41ecdaf7, 0x7fcd500e, 0x1791f62f, + 0x764dd68d, 0x43efb04d, 0xccaa4d54, 0xe49604df, + 0x9ed1b5e3, 0x4c6a881b, 0xc12c1fb8, 0x4665517f, + 0x9d5eea04, 0x018c355d, 0xfa877473, 0xfb0b412e, + 0xb3671d5a, 0x92dbd252, 0xe9105633, 0x6dd64713, + 0x9ad7618c, 0x37a10c7a, 0x59f8148e, 0xeb133c89, + 0xcea927ee, 0xb761c935, 0xe11ce5ed, 0x7a47b13c, + 0x9cd2df59, 0x55f2733f, 0x1814ce79, 0x73c737bf, + 0x53f7cdea, 0x5ffdaa5b, 0xdf3d6f14, 0x7844db86, + 0xcaaff381, 0xb968c43e, 0x3824342c, 0xc2a3405f, + 0x161dc372, 0xbce2250c, 0x283c498b, 0xff0d9541, + 0x39a80171, 0x080cb3de, 0xd8b4e49c, 0x6456c190, + 0x7bcb8461, 0xd532b670, 0x486c5c74, 0xd0b85742, +}; + +__constant u32 td1[256] = +{ + 0x5051f4a7, 0x537e4165, 0xc31a17a4, 0x963a275e, + 0xcb3bab6b, 0xf11f9d45, 0xabacfa58, 0x934be303, + 0x552030fa, 0xf6ad766d, 0x9188cc76, 0x25f5024c, + 0xfc4fe5d7, 0xd7c52acb, 0x80263544, 0x8fb562a3, + 0x49deb15a, 0x6725ba1b, 0x9845ea0e, 0xe15dfec0, + 0x02c32f75, 0x12814cf0, 0xa38d4697, 0xc66bd3f9, + 0xe7038f5f, 0x9515929c, 0xebbf6d7a, 0xda955259, + 0x2dd4be83, 0xd3587421, 0x2949e069, 0x448ec9c8, + 0x6a75c289, 0x78f48e79, 0x6b99583e, 0xdd27b971, + 0xb6bee14f, 0x17f088ad, 0x66c920ac, 0xb47dce3a, + 0x1863df4a, 0x82e51a31, 0x60975133, 0x4562537f, + 0xe0b16477, 0x84bb6bae, 0x1cfe81a0, 0x94f9082b, + 0x58704868, 0x198f45fd, 0x8794de6c, 0xb7527bf8, + 0x23ab73d3, 0xe2724b02, 0x57e31f8f, 0x2a6655ab, + 0x07b2eb28, 0x032fb5c2, 0x9a86c57b, 0xa5d33708, + 0xf2302887, 0xb223bfa5, 0xba02036a, 0x5ced1682, + 0x2b8acf1c, 0x92a779b4, 0xf0f307f2, 0xa14e69e2, + 0xcd65daf4, 0xd50605be, 0x1fd13462, 0x8ac4a6fe, + 0x9d342e53, 0xa0a2f355, 0x32058ae1, 0x75a4f6eb, + 0x390b83ec, 0xaa4060ef, 0x065e719f, 0x51bd6e10, + 0xf93e218a, 0x3d96dd06, 0xaedd3e05, 0x464de6bd, + 0xb591548d, 0x0571c45d, 0x6f0406d4, 0xff605015, + 0x241998fb, 0x97d6bde9, 0xcc894043, 0x7767d99e, + 0xbdb0e842, 0x8807898b, 0x38e7195b, 0xdb79c8ee, + 0x47a17c0a, 0xe97c420f, 0xc9f8841e, 0x00000000, + 0x83098086, 0x48322bed, 0xac1e1170, 0x4e6c5a72, + 0xfbfd0eff, 0x560f8538, 0x1e3daed5, 0x27362d39, + 0x640a0fd9, 0x21685ca6, 0xd19b5b54, 0x3a24362e, + 0xb10c0a67, 0x0f9357e7, 0xd2b4ee96, 0x9e1b9b91, + 0x4f80c0c5, 0xa261dc20, 0x695a774b, 0x161c121a, + 0x0ae293ba, 0xe5c0a02a, 0x433c22e0, 0x1d121b17, + 0x0b0e090d, 0xadf28bc7, 0xb92db6a8, 0xc8141ea9, + 0x8557f119, 0x4caf7507, 0xbbee99dd, 0xfda37f60, + 0x9ff70126, 0xbc5c72f5, 0xc544663b, 0x345bfb7e, + 0x768b4329, 0xdccb23c6, 0x68b6edfc, 0x63b8e4f1, + 0xcad731dc, 0x10426385, 0x40139722, 0x2084c611, + 0x7d854a24, 0xf8d2bb3d, 0x11aef932, 0x6dc729a1, + 0x4b1d9e2f, 0xf3dcb230, 0xec0d8652, 0xd077c1e3, + 0x6c2bb316, 0x99a970b9, 0xfa119448, 0x2247e964, + 0xc4a8fc8c, 0x1aa0f03f, 0xd8567d2c, 0xef223390, + 0xc787494e, 0xc1d938d1, 0xfe8ccaa2, 0x3698d40b, + 0xcfa6f581, 0x28a57ade, 0x26dab78e, 0xa43fadbf, + 0xe42c3a9d, 0x0d507892, 0x9b6a5fcc, 0x62547e46, + 0xc2f68d13, 0xe890d8b8, 0x5e2e39f7, 0xf582c3af, + 0xbe9f5d80, 0x7c69d093, 0xa96fd52d, 0xb3cf2512, + 0x3bc8ac99, 0xa710187d, 0x6ee89c63, 0x7bdb3bbb, + 0x09cd2678, 0xf46e5918, 0x01ec9ab7, 0xa8834f9a, + 0x65e6956e, 0x7eaaffe6, 0x0821bccf, 0xe6ef15e8, + 0xd9bae79b, 0xce4a6f36, 0xd4ea9f09, 0xd629b07c, + 0xaf31a4b2, 0x312a3f23, 0x30c6a594, 0xc035a266, + 0x37744ebc, 0xa6fc82ca, 0xb0e090d0, 0x1533a7d8, + 0x4af10498, 0xf741ecda, 0x0e7fcd50, 0x2f1791f6, + 0x8d764dd6, 0x4d43efb0, 0x54ccaa4d, 0xdfe49604, + 0xe39ed1b5, 0x1b4c6a88, 0xb8c12c1f, 0x7f466551, + 0x049d5eea, 0x5d018c35, 0x73fa8774, 0x2efb0b41, + 0x5ab3671d, 0x5292dbd2, 0x33e91056, 0x136dd647, + 0x8c9ad761, 0x7a37a10c, 0x8e59f814, 0x89eb133c, + 0xeecea927, 0x35b761c9, 0xede11ce5, 0x3c7a47b1, + 0x599cd2df, 0x3f55f273, 0x791814ce, 0xbf73c737, + 0xea53f7cd, 0x5b5ffdaa, 0x14df3d6f, 0x867844db, + 0x81caaff3, 0x3eb968c4, 0x2c382434, 0x5fc2a340, + 0x72161dc3, 0x0cbce225, 0x8b283c49, 0x41ff0d95, + 0x7139a801, 0xde080cb3, 0x9cd8b4e4, 0x906456c1, + 0x617bcb84, 0x70d532b6, 0x74486c5c, 0x42d0b857, +}; + +__constant u32 td2[256] = +{ + 0xa75051f4, 0x65537e41, 0xa4c31a17, 0x5e963a27, + 0x6bcb3bab, 0x45f11f9d, 0x58abacfa, 0x03934be3, + 0xfa552030, 0x6df6ad76, 0x769188cc, 0x4c25f502, + 0xd7fc4fe5, 0xcbd7c52a, 0x44802635, 0xa38fb562, + 0x5a49deb1, 0x1b6725ba, 0x0e9845ea, 0xc0e15dfe, + 0x7502c32f, 0xf012814c, 0x97a38d46, 0xf9c66bd3, + 0x5fe7038f, 0x9c951592, 0x7aebbf6d, 0x59da9552, + 0x832dd4be, 0x21d35874, 0x692949e0, 0xc8448ec9, + 0x896a75c2, 0x7978f48e, 0x3e6b9958, 0x71dd27b9, + 0x4fb6bee1, 0xad17f088, 0xac66c920, 0x3ab47dce, + 0x4a1863df, 0x3182e51a, 0x33609751, 0x7f456253, + 0x77e0b164, 0xae84bb6b, 0xa01cfe81, 0x2b94f908, + 0x68587048, 0xfd198f45, 0x6c8794de, 0xf8b7527b, + 0xd323ab73, 0x02e2724b, 0x8f57e31f, 0xab2a6655, + 0x2807b2eb, 0xc2032fb5, 0x7b9a86c5, 0x08a5d337, + 0x87f23028, 0xa5b223bf, 0x6aba0203, 0x825ced16, + 0x1c2b8acf, 0xb492a779, 0xf2f0f307, 0xe2a14e69, + 0xf4cd65da, 0xbed50605, 0x621fd134, 0xfe8ac4a6, + 0x539d342e, 0x55a0a2f3, 0xe132058a, 0xeb75a4f6, + 0xec390b83, 0xefaa4060, 0x9f065e71, 0x1051bd6e, + 0x8af93e21, 0x063d96dd, 0x05aedd3e, 0xbd464de6, + 0x8db59154, 0x5d0571c4, 0xd46f0406, 0x15ff6050, + 0xfb241998, 0xe997d6bd, 0x43cc8940, 0x9e7767d9, + 0x42bdb0e8, 0x8b880789, 0x5b38e719, 0xeedb79c8, + 0x0a47a17c, 0x0fe97c42, 0x1ec9f884, 0x00000000, + 0x86830980, 0xed48322b, 0x70ac1e11, 0x724e6c5a, + 0xfffbfd0e, 0x38560f85, 0xd51e3dae, 0x3927362d, + 0xd9640a0f, 0xa621685c, 0x54d19b5b, 0x2e3a2436, + 0x67b10c0a, 0xe70f9357, 0x96d2b4ee, 0x919e1b9b, + 0xc54f80c0, 0x20a261dc, 0x4b695a77, 0x1a161c12, + 0xba0ae293, 0x2ae5c0a0, 0xe0433c22, 0x171d121b, + 0x0d0b0e09, 0xc7adf28b, 0xa8b92db6, 0xa9c8141e, + 0x198557f1, 0x074caf75, 0xddbbee99, 0x60fda37f, + 0x269ff701, 0xf5bc5c72, 0x3bc54466, 0x7e345bfb, + 0x29768b43, 0xc6dccb23, 0xfc68b6ed, 0xf163b8e4, + 0xdccad731, 0x85104263, 0x22401397, 0x112084c6, + 0x247d854a, 0x3df8d2bb, 0x3211aef9, 0xa16dc729, + 0x2f4b1d9e, 0x30f3dcb2, 0x52ec0d86, 0xe3d077c1, + 0x166c2bb3, 0xb999a970, 0x48fa1194, 0x642247e9, + 0x8cc4a8fc, 0x3f1aa0f0, 0x2cd8567d, 0x90ef2233, + 0x4ec78749, 0xd1c1d938, 0xa2fe8cca, 0x0b3698d4, + 0x81cfa6f5, 0xde28a57a, 0x8e26dab7, 0xbfa43fad, + 0x9de42c3a, 0x920d5078, 0xcc9b6a5f, 0x4662547e, + 0x13c2f68d, 0xb8e890d8, 0xf75e2e39, 0xaff582c3, + 0x80be9f5d, 0x937c69d0, 0x2da96fd5, 0x12b3cf25, + 0x993bc8ac, 0x7da71018, 0x636ee89c, 0xbb7bdb3b, + 0x7809cd26, 0x18f46e59, 0xb701ec9a, 0x9aa8834f, + 0x6e65e695, 0xe67eaaff, 0xcf0821bc, 0xe8e6ef15, + 0x9bd9bae7, 0x36ce4a6f, 0x09d4ea9f, 0x7cd629b0, + 0xb2af31a4, 0x23312a3f, 0x9430c6a5, 0x66c035a2, + 0xbc37744e, 0xcaa6fc82, 0xd0b0e090, 0xd81533a7, + 0x984af104, 0xdaf741ec, 0x500e7fcd, 0xf62f1791, + 0xd68d764d, 0xb04d43ef, 0x4d54ccaa, 0x04dfe496, + 0xb5e39ed1, 0x881b4c6a, 0x1fb8c12c, 0x517f4665, + 0xea049d5e, 0x355d018c, 0x7473fa87, 0x412efb0b, + 0x1d5ab367, 0xd25292db, 0x5633e910, 0x47136dd6, + 0x618c9ad7, 0x0c7a37a1, 0x148e59f8, 0x3c89eb13, + 0x27eecea9, 0xc935b761, 0xe5ede11c, 0xb13c7a47, + 0xdf599cd2, 0x733f55f2, 0xce791814, 0x37bf73c7, + 0xcdea53f7, 0xaa5b5ffd, 0x6f14df3d, 0xdb867844, + 0xf381caaf, 0xc43eb968, 0x342c3824, 0x405fc2a3, + 0xc372161d, 0x250cbce2, 0x498b283c, 0x9541ff0d, + 0x017139a8, 0xb3de080c, 0xe49cd8b4, 0xc1906456, + 0x84617bcb, 0xb670d532, 0x5c74486c, 0x5742d0b8, +}; + +__constant u32 td3[256] = +{ + 0xf4a75051, 0x4165537e, 0x17a4c31a, 0x275e963a, + 0xab6bcb3b, 0x9d45f11f, 0xfa58abac, 0xe303934b, + 0x30fa5520, 0x766df6ad, 0xcc769188, 0x024c25f5, + 0xe5d7fc4f, 0x2acbd7c5, 0x35448026, 0x62a38fb5, + 0xb15a49de, 0xba1b6725, 0xea0e9845, 0xfec0e15d, + 0x2f7502c3, 0x4cf01281, 0x4697a38d, 0xd3f9c66b, + 0x8f5fe703, 0x929c9515, 0x6d7aebbf, 0x5259da95, + 0xbe832dd4, 0x7421d358, 0xe0692949, 0xc9c8448e, + 0xc2896a75, 0x8e7978f4, 0x583e6b99, 0xb971dd27, + 0xe14fb6be, 0x88ad17f0, 0x20ac66c9, 0xce3ab47d, + 0xdf4a1863, 0x1a3182e5, 0x51336097, 0x537f4562, + 0x6477e0b1, 0x6bae84bb, 0x81a01cfe, 0x082b94f9, + 0x48685870, 0x45fd198f, 0xde6c8794, 0x7bf8b752, + 0x73d323ab, 0x4b02e272, 0x1f8f57e3, 0x55ab2a66, + 0xeb2807b2, 0xb5c2032f, 0xc57b9a86, 0x3708a5d3, + 0x2887f230, 0xbfa5b223, 0x036aba02, 0x16825ced, + 0xcf1c2b8a, 0x79b492a7, 0x07f2f0f3, 0x69e2a14e, + 0xdaf4cd65, 0x05bed506, 0x34621fd1, 0xa6fe8ac4, + 0x2e539d34, 0xf355a0a2, 0x8ae13205, 0xf6eb75a4, + 0x83ec390b, 0x60efaa40, 0x719f065e, 0x6e1051bd, + 0x218af93e, 0xdd063d96, 0x3e05aedd, 0xe6bd464d, + 0x548db591, 0xc45d0571, 0x06d46f04, 0x5015ff60, + 0x98fb2419, 0xbde997d6, 0x4043cc89, 0xd99e7767, + 0xe842bdb0, 0x898b8807, 0x195b38e7, 0xc8eedb79, + 0x7c0a47a1, 0x420fe97c, 0x841ec9f8, 0x00000000, + 0x80868309, 0x2bed4832, 0x1170ac1e, 0x5a724e6c, + 0x0efffbfd, 0x8538560f, 0xaed51e3d, 0x2d392736, + 0x0fd9640a, 0x5ca62168, 0x5b54d19b, 0x362e3a24, + 0x0a67b10c, 0x57e70f93, 0xee96d2b4, 0x9b919e1b, + 0xc0c54f80, 0xdc20a261, 0x774b695a, 0x121a161c, + 0x93ba0ae2, 0xa02ae5c0, 0x22e0433c, 0x1b171d12, + 0x090d0b0e, 0x8bc7adf2, 0xb6a8b92d, 0x1ea9c814, + 0xf1198557, 0x75074caf, 0x99ddbbee, 0x7f60fda3, + 0x01269ff7, 0x72f5bc5c, 0x663bc544, 0xfb7e345b, + 0x4329768b, 0x23c6dccb, 0xedfc68b6, 0xe4f163b8, + 0x31dccad7, 0x63851042, 0x97224013, 0xc6112084, + 0x4a247d85, 0xbb3df8d2, 0xf93211ae, 0x29a16dc7, + 0x9e2f4b1d, 0xb230f3dc, 0x8652ec0d, 0xc1e3d077, + 0xb3166c2b, 0x70b999a9, 0x9448fa11, 0xe9642247, + 0xfc8cc4a8, 0xf03f1aa0, 0x7d2cd856, 0x3390ef22, + 0x494ec787, 0x38d1c1d9, 0xcaa2fe8c, 0xd40b3698, + 0xf581cfa6, 0x7ade28a5, 0xb78e26da, 0xadbfa43f, + 0x3a9de42c, 0x78920d50, 0x5fcc9b6a, 0x7e466254, + 0x8d13c2f6, 0xd8b8e890, 0x39f75e2e, 0xc3aff582, + 0x5d80be9f, 0xd0937c69, 0xd52da96f, 0x2512b3cf, + 0xac993bc8, 0x187da710, 0x9c636ee8, 0x3bbb7bdb, + 0x267809cd, 0x5918f46e, 0x9ab701ec, 0x4f9aa883, + 0x956e65e6, 0xffe67eaa, 0xbccf0821, 0x15e8e6ef, + 0xe79bd9ba, 0x6f36ce4a, 0x9f09d4ea, 0xb07cd629, + 0xa4b2af31, 0x3f23312a, 0xa59430c6, 0xa266c035, + 0x4ebc3774, 0x82caa6fc, 0x90d0b0e0, 0xa7d81533, + 0x04984af1, 0xecdaf741, 0xcd500e7f, 0x91f62f17, + 0x4dd68d76, 0xefb04d43, 0xaa4d54cc, 0x9604dfe4, + 0xd1b5e39e, 0x6a881b4c, 0x2c1fb8c1, 0x65517f46, + 0x5eea049d, 0x8c355d01, 0x877473fa, 0x0b412efb, + 0x671d5ab3, 0xdbd25292, 0x105633e9, 0xd647136d, + 0xd7618c9a, 0xa10c7a37, 0xf8148e59, 0x133c89eb, + 0xa927eece, 0x61c935b7, 0x1ce5ede1, 0x47b13c7a, + 0xd2df599c, 0xf2733f55, 0x14ce7918, 0xc737bf73, + 0xf7cdea53, 0xfdaa5b5f, 0x3d6f14df, 0x44db8678, + 0xaff381ca, 0x68c43eb9, 0x24342c38, 0xa3405fc2, + 0x1dc37216, 0xe2250cbc, 0x3c498b28, 0x0d9541ff, + 0xa8017139, 0x0cb3de08, 0xb4e49cd8, 0x56c19064, + 0xcb84617b, 0x32b670d5, 0x6c5c7448, 0xb85742d0, +}; + +__constant u32 td4[256] = +{ + 0x52525252, 0x09090909, 0x6a6a6a6a, 0xd5d5d5d5, + 0x30303030, 0x36363636, 0xa5a5a5a5, 0x38383838, + 0xbfbfbfbf, 0x40404040, 0xa3a3a3a3, 0x9e9e9e9e, + 0x81818181, 0xf3f3f3f3, 0xd7d7d7d7, 0xfbfbfbfb, + 0x7c7c7c7c, 0xe3e3e3e3, 0x39393939, 0x82828282, + 0x9b9b9b9b, 0x2f2f2f2f, 0xffffffff, 0x87878787, + 0x34343434, 0x8e8e8e8e, 0x43434343, 0x44444444, + 0xc4c4c4c4, 0xdededede, 0xe9e9e9e9, 0xcbcbcbcb, + 0x54545454, 0x7b7b7b7b, 0x94949494, 0x32323232, + 0xa6a6a6a6, 0xc2c2c2c2, 0x23232323, 0x3d3d3d3d, + 0xeeeeeeee, 0x4c4c4c4c, 0x95959595, 0x0b0b0b0b, + 0x42424242, 0xfafafafa, 0xc3c3c3c3, 0x4e4e4e4e, + 0x08080808, 0x2e2e2e2e, 0xa1a1a1a1, 0x66666666, + 0x28282828, 0xd9d9d9d9, 0x24242424, 0xb2b2b2b2, + 0x76767676, 0x5b5b5b5b, 0xa2a2a2a2, 0x49494949, + 0x6d6d6d6d, 0x8b8b8b8b, 0xd1d1d1d1, 0x25252525, + 0x72727272, 0xf8f8f8f8, 0xf6f6f6f6, 0x64646464, + 0x86868686, 0x68686868, 0x98989898, 0x16161616, + 0xd4d4d4d4, 0xa4a4a4a4, 0x5c5c5c5c, 0xcccccccc, + 0x5d5d5d5d, 0x65656565, 0xb6b6b6b6, 0x92929292, + 0x6c6c6c6c, 0x70707070, 0x48484848, 0x50505050, + 0xfdfdfdfd, 0xedededed, 0xb9b9b9b9, 0xdadadada, + 0x5e5e5e5e, 0x15151515, 0x46464646, 0x57575757, + 0xa7a7a7a7, 0x8d8d8d8d, 0x9d9d9d9d, 0x84848484, + 0x90909090, 0xd8d8d8d8, 0xabababab, 0x00000000, + 0x8c8c8c8c, 0xbcbcbcbc, 0xd3d3d3d3, 0x0a0a0a0a, + 0xf7f7f7f7, 0xe4e4e4e4, 0x58585858, 0x05050505, + 0xb8b8b8b8, 0xb3b3b3b3, 0x45454545, 0x06060606, + 0xd0d0d0d0, 0x2c2c2c2c, 0x1e1e1e1e, 0x8f8f8f8f, + 0xcacacaca, 0x3f3f3f3f, 0x0f0f0f0f, 0x02020202, + 0xc1c1c1c1, 0xafafafaf, 0xbdbdbdbd, 0x03030303, + 0x01010101, 0x13131313, 0x8a8a8a8a, 0x6b6b6b6b, + 0x3a3a3a3a, 0x91919191, 0x11111111, 0x41414141, + 0x4f4f4f4f, 0x67676767, 0xdcdcdcdc, 0xeaeaeaea, + 0x97979797, 0xf2f2f2f2, 0xcfcfcfcf, 0xcececece, + 0xf0f0f0f0, 0xb4b4b4b4, 0xe6e6e6e6, 0x73737373, + 0x96969696, 0xacacacac, 0x74747474, 0x22222222, + 0xe7e7e7e7, 0xadadadad, 0x35353535, 0x85858585, + 0xe2e2e2e2, 0xf9f9f9f9, 0x37373737, 0xe8e8e8e8, + 0x1c1c1c1c, 0x75757575, 0xdfdfdfdf, 0x6e6e6e6e, + 0x47474747, 0xf1f1f1f1, 0x1a1a1a1a, 0x71717171, + 0x1d1d1d1d, 0x29292929, 0xc5c5c5c5, 0x89898989, + 0x6f6f6f6f, 0xb7b7b7b7, 0x62626262, 0x0e0e0e0e, + 0xaaaaaaaa, 0x18181818, 0xbebebebe, 0x1b1b1b1b, + 0xfcfcfcfc, 0x56565656, 0x3e3e3e3e, 0x4b4b4b4b, + 0xc6c6c6c6, 0xd2d2d2d2, 0x79797979, 0x20202020, + 0x9a9a9a9a, 0xdbdbdbdb, 0xc0c0c0c0, 0xfefefefe, + 0x78787878, 0xcdcdcdcd, 0x5a5a5a5a, 0xf4f4f4f4, + 0x1f1f1f1f, 0xdddddddd, 0xa8a8a8a8, 0x33333333, + 0x88888888, 0x07070707, 0xc7c7c7c7, 0x31313131, + 0xb1b1b1b1, 0x12121212, 0x10101010, 0x59595959, + 0x27272727, 0x80808080, 0xecececec, 0x5f5f5f5f, + 0x60606060, 0x51515151, 0x7f7f7f7f, 0xa9a9a9a9, + 0x19191919, 0xb5b5b5b5, 0x4a4a4a4a, 0x0d0d0d0d, + 0x2d2d2d2d, 0xe5e5e5e5, 0x7a7a7a7a, 0x9f9f9f9f, + 0x93939393, 0xc9c9c9c9, 0x9c9c9c9c, 0xefefefef, + 0xa0a0a0a0, 0xe0e0e0e0, 0x3b3b3b3b, 0x4d4d4d4d, + 0xaeaeaeae, 0x2a2a2a2a, 0xf5f5f5f5, 0xb0b0b0b0, + 0xc8c8c8c8, 0xebebebeb, 0xbbbbbbbb, 0x3c3c3c3c, + 0x83838383, 0x53535353, 0x99999999, 0x61616161, + 0x17171717, 0x2b2b2b2b, 0x04040404, 0x7e7e7e7e, + 0xbabababa, 0x77777777, 0xd6d6d6d6, 0x26262626, + 0xe1e1e1e1, 0x69696969, 0x14141414, 0x63636363, + 0x55555555, 0x21212121, 0x0c0c0c0c, 0x7d7d7d7d, +}; + +__constant u32 rcon[] = +{ + 0x01000000, 0x02000000, 0x04000000, 0x08000000, + 0x10000000, 0x20000000, 0x40000000, 0x80000000, + 0x1b000000, 0x36000000, +}; + +static void AES128_ExpandKey (u32 *userkey, u32 *rek, __local u32 s_te0[256], __local u32 s_te1[256], __local u32 s_te2[256], __local u32 s_te3[256], __local u32 s_te4[256]) +{ + rek[0] = userkey[0]; + rek[1] = userkey[1]; + rek[2] = userkey[2]; + rek[3] = userkey[3]; + + for (u32 i = 0, j = 0; i < 10; i += 1, j += 4) + { + u32 temp = rek[j + 3]; + + temp = (s_te2[(temp >> 16) & 0xff] & 0xff000000) + ^ (s_te3[(temp >> 8) & 0xff] & 0x00ff0000) + ^ (s_te0[(temp >> 0) & 0xff] & 0x0000ff00) + ^ (s_te1[(temp >> 24) & 0xff] & 0x000000ff); + + rek[j + 4] = rek[j + 0] + ^ temp + ^ rcon[i]; + + rek[j + 5] = rek[j + 1] ^ rek[j + 4]; + rek[j + 6] = rek[j + 2] ^ rek[j + 5]; + rek[j + 7] = rek[j + 3] ^ rek[j + 6]; + } +} + +static void AES128_InvertKey (u32 *rdk, __local u32 s_td0[256], __local u32 s_td1[256], __local u32 s_td2[256], __local u32 s_td3[256], __local u32 s_td4[256], __local u32 s_te0[256], __local u32 s_te1[256], __local u32 s_te2[256], __local u32 s_te3[256], __local u32 s_te4[256]) +{ + for (u32 i = 0, j = 40; i < j; i += 4, j -= 4) + { + u32 temp; + + temp = rdk[i + 0]; rdk[i + 0] = rdk[j + 0]; rdk[j + 0] = temp; + temp = rdk[i + 1]; rdk[i + 1] = rdk[j + 1]; rdk[j + 1] = temp; + temp = rdk[i + 2]; rdk[i + 2] = rdk[j + 2]; rdk[j + 2] = temp; + temp = rdk[i + 3]; rdk[i + 3] = rdk[j + 3]; rdk[j + 3] = temp; + } + + for (u32 i = 1, j = 4; i < 10; i += 1, j += 4) + { + rdk[j + 0] = + s_td0[s_te1[(rdk[j + 0] >> 24) & 0xff] & 0xff] ^ + s_td1[s_te1[(rdk[j + 0] >> 16) & 0xff] & 0xff] ^ + s_td2[s_te1[(rdk[j + 0] >> 8) & 0xff] & 0xff] ^ + s_td3[s_te1[(rdk[j + 0] >> 0) & 0xff] & 0xff]; + + rdk[j + 1] = + s_td0[s_te1[(rdk[j + 1] >> 24) & 0xff] & 0xff] ^ + s_td1[s_te1[(rdk[j + 1] >> 16) & 0xff] & 0xff] ^ + s_td2[s_te1[(rdk[j + 1] >> 8) & 0xff] & 0xff] ^ + s_td3[s_te1[(rdk[j + 1] >> 0) & 0xff] & 0xff]; + + rdk[j + 2] = + s_td0[s_te1[(rdk[j + 2] >> 24) & 0xff] & 0xff] ^ + s_td1[s_te1[(rdk[j + 2] >> 16) & 0xff] & 0xff] ^ + s_td2[s_te1[(rdk[j + 2] >> 8) & 0xff] & 0xff] ^ + s_td3[s_te1[(rdk[j + 2] >> 0) & 0xff] & 0xff]; + + rdk[j + 3] = + s_td0[s_te1[(rdk[j + 3] >> 24) & 0xff] & 0xff] ^ + s_td1[s_te1[(rdk[j + 3] >> 16) & 0xff] & 0xff] ^ + s_td2[s_te1[(rdk[j + 3] >> 8) & 0xff] & 0xff] ^ + s_td3[s_te1[(rdk[j + 3] >> 0) & 0xff] & 0xff]; + } +} + +static void AES128_encrypt (const u32 *in, u32 *out, const u32 *rek, __local u32 s_te0[256], __local u32 s_te1[256], __local u32 s_te2[256], __local u32 s_te3[256], __local u32 s_te4[256]) +{ + u32 s0 = in[0] ^ rek[0]; + u32 s1 = in[1] ^ rek[1]; + u32 s2 = in[2] ^ rek[2]; + u32 s3 = in[3] ^ rek[3]; + + u32 t0; + u32 t1; + u32 t2; + u32 t3; + + t0 = s_te0[s0 >> 24] ^ s_te1[(s1 >> 16) & 0xff] ^ s_te2[(s2 >> 8) & 0xff] ^ s_te3[s3 & 0xff] ^ rek[ 4]; + t1 = s_te0[s1 >> 24] ^ s_te1[(s2 >> 16) & 0xff] ^ s_te2[(s3 >> 8) & 0xff] ^ s_te3[s0 & 0xff] ^ rek[ 5]; + t2 = s_te0[s2 >> 24] ^ s_te1[(s3 >> 16) & 0xff] ^ s_te2[(s0 >> 8) & 0xff] ^ s_te3[s1 & 0xff] ^ rek[ 6]; + t3 = s_te0[s3 >> 24] ^ s_te1[(s0 >> 16) & 0xff] ^ s_te2[(s1 >> 8) & 0xff] ^ s_te3[s2 & 0xff] ^ rek[ 7]; + s0 = s_te0[t0 >> 24] ^ s_te1[(t1 >> 16) & 0xff] ^ s_te2[(t2 >> 8) & 0xff] ^ s_te3[t3 & 0xff] ^ rek[ 8]; + s1 = s_te0[t1 >> 24] ^ s_te1[(t2 >> 16) & 0xff] ^ s_te2[(t3 >> 8) & 0xff] ^ s_te3[t0 & 0xff] ^ rek[ 9]; + s2 = s_te0[t2 >> 24] ^ s_te1[(t3 >> 16) & 0xff] ^ s_te2[(t0 >> 8) & 0xff] ^ s_te3[t1 & 0xff] ^ rek[10]; + s3 = s_te0[t3 >> 24] ^ s_te1[(t0 >> 16) & 0xff] ^ s_te2[(t1 >> 8) & 0xff] ^ s_te3[t2 & 0xff] ^ rek[11]; + t0 = s_te0[s0 >> 24] ^ s_te1[(s1 >> 16) & 0xff] ^ s_te2[(s2 >> 8) & 0xff] ^ s_te3[s3 & 0xff] ^ rek[12]; + t1 = s_te0[s1 >> 24] ^ s_te1[(s2 >> 16) & 0xff] ^ s_te2[(s3 >> 8) & 0xff] ^ s_te3[s0 & 0xff] ^ rek[13]; + t2 = s_te0[s2 >> 24] ^ s_te1[(s3 >> 16) & 0xff] ^ s_te2[(s0 >> 8) & 0xff] ^ s_te3[s1 & 0xff] ^ rek[14]; + t3 = s_te0[s3 >> 24] ^ s_te1[(s0 >> 16) & 0xff] ^ s_te2[(s1 >> 8) & 0xff] ^ s_te3[s2 & 0xff] ^ rek[15]; + s0 = s_te0[t0 >> 24] ^ s_te1[(t1 >> 16) & 0xff] ^ s_te2[(t2 >> 8) & 0xff] ^ s_te3[t3 & 0xff] ^ rek[16]; + s1 = s_te0[t1 >> 24] ^ s_te1[(t2 >> 16) & 0xff] ^ s_te2[(t3 >> 8) & 0xff] ^ s_te3[t0 & 0xff] ^ rek[17]; + s2 = s_te0[t2 >> 24] ^ s_te1[(t3 >> 16) & 0xff] ^ s_te2[(t0 >> 8) & 0xff] ^ s_te3[t1 & 0xff] ^ rek[18]; + s3 = s_te0[t3 >> 24] ^ s_te1[(t0 >> 16) & 0xff] ^ s_te2[(t1 >> 8) & 0xff] ^ s_te3[t2 & 0xff] ^ rek[19]; + t0 = s_te0[s0 >> 24] ^ s_te1[(s1 >> 16) & 0xff] ^ s_te2[(s2 >> 8) & 0xff] ^ s_te3[s3 & 0xff] ^ rek[20]; + t1 = s_te0[s1 >> 24] ^ s_te1[(s2 >> 16) & 0xff] ^ s_te2[(s3 >> 8) & 0xff] ^ s_te3[s0 & 0xff] ^ rek[21]; + t2 = s_te0[s2 >> 24] ^ s_te1[(s3 >> 16) & 0xff] ^ s_te2[(s0 >> 8) & 0xff] ^ s_te3[s1 & 0xff] ^ rek[22]; + t3 = s_te0[s3 >> 24] ^ s_te1[(s0 >> 16) & 0xff] ^ s_te2[(s1 >> 8) & 0xff] ^ s_te3[s2 & 0xff] ^ rek[23]; + s0 = s_te0[t0 >> 24] ^ s_te1[(t1 >> 16) & 0xff] ^ s_te2[(t2 >> 8) & 0xff] ^ s_te3[t3 & 0xff] ^ rek[24]; + s1 = s_te0[t1 >> 24] ^ s_te1[(t2 >> 16) & 0xff] ^ s_te2[(t3 >> 8) & 0xff] ^ s_te3[t0 & 0xff] ^ rek[25]; + s2 = s_te0[t2 >> 24] ^ s_te1[(t3 >> 16) & 0xff] ^ s_te2[(t0 >> 8) & 0xff] ^ s_te3[t1 & 0xff] ^ rek[26]; + s3 = s_te0[t3 >> 24] ^ s_te1[(t0 >> 16) & 0xff] ^ s_te2[(t1 >> 8) & 0xff] ^ s_te3[t2 & 0xff] ^ rek[27]; + t0 = s_te0[s0 >> 24] ^ s_te1[(s1 >> 16) & 0xff] ^ s_te2[(s2 >> 8) & 0xff] ^ s_te3[s3 & 0xff] ^ rek[28]; + t1 = s_te0[s1 >> 24] ^ s_te1[(s2 >> 16) & 0xff] ^ s_te2[(s3 >> 8) & 0xff] ^ s_te3[s0 & 0xff] ^ rek[29]; + t2 = s_te0[s2 >> 24] ^ s_te1[(s3 >> 16) & 0xff] ^ s_te2[(s0 >> 8) & 0xff] ^ s_te3[s1 & 0xff] ^ rek[30]; + t3 = s_te0[s3 >> 24] ^ s_te1[(s0 >> 16) & 0xff] ^ s_te2[(s1 >> 8) & 0xff] ^ s_te3[s2 & 0xff] ^ rek[31]; + s0 = s_te0[t0 >> 24] ^ s_te1[(t1 >> 16) & 0xff] ^ s_te2[(t2 >> 8) & 0xff] ^ s_te3[t3 & 0xff] ^ rek[32]; + s1 = s_te0[t1 >> 24] ^ s_te1[(t2 >> 16) & 0xff] ^ s_te2[(t3 >> 8) & 0xff] ^ s_te3[t0 & 0xff] ^ rek[33]; + s2 = s_te0[t2 >> 24] ^ s_te1[(t3 >> 16) & 0xff] ^ s_te2[(t0 >> 8) & 0xff] ^ s_te3[t1 & 0xff] ^ rek[34]; + s3 = s_te0[t3 >> 24] ^ s_te1[(t0 >> 16) & 0xff] ^ s_te2[(t1 >> 8) & 0xff] ^ s_te3[t2 & 0xff] ^ rek[35]; + t0 = s_te0[s0 >> 24] ^ s_te1[(s1 >> 16) & 0xff] ^ s_te2[(s2 >> 8) & 0xff] ^ s_te3[s3 & 0xff] ^ rek[36]; + t1 = s_te0[s1 >> 24] ^ s_te1[(s2 >> 16) & 0xff] ^ s_te2[(s3 >> 8) & 0xff] ^ s_te3[s0 & 0xff] ^ rek[37]; + t2 = s_te0[s2 >> 24] ^ s_te1[(s3 >> 16) & 0xff] ^ s_te2[(s0 >> 8) & 0xff] ^ s_te3[s1 & 0xff] ^ rek[38]; + t3 = s_te0[s3 >> 24] ^ s_te1[(s0 >> 16) & 0xff] ^ s_te2[(s1 >> 8) & 0xff] ^ s_te3[s2 & 0xff] ^ rek[39]; + + out[0] = (s_te4[(t0 >> 24) & 0xff] & 0xff000000) + ^ (s_te4[(t1 >> 16) & 0xff] & 0x00ff0000) + ^ (s_te4[(t2 >> 8) & 0xff] & 0x0000ff00) + ^ (s_te4[(t3 >> 0) & 0xff] & 0x000000ff) + ^ rek[40]; + + out[1] = (s_te4[(t1 >> 24) & 0xff] & 0xff000000) + ^ (s_te4[(t2 >> 16) & 0xff] & 0x00ff0000) + ^ (s_te4[(t3 >> 8) & 0xff] & 0x0000ff00) + ^ (s_te4[(t0 >> 0) & 0xff] & 0x000000ff) + ^ rek[41]; + + out[2] = (s_te4[(t2 >> 24) & 0xff] & 0xff000000) + ^ (s_te4[(t3 >> 16) & 0xff] & 0x00ff0000) + ^ (s_te4[(t0 >> 8) & 0xff] & 0x0000ff00) + ^ (s_te4[(t1 >> 0) & 0xff] & 0x000000ff) + ^ rek[42]; + + out[3] = (s_te4[(t3 >> 24) & 0xff] & 0xff000000) + ^ (s_te4[(t0 >> 16) & 0xff] & 0x00ff0000) + ^ (s_te4[(t1 >> 8) & 0xff] & 0x0000ff00) + ^ (s_te4[(t2 >> 0) & 0xff] & 0x000000ff) + ^ rek[43]; +} + +static void AES128_decrypt (const u32 *in, u32 *out, const u32 *rdk, __local u32 s_td0[256], __local u32 s_td1[256], __local u32 s_td2[256], __local u32 s_td3[256], __local u32 s_td4[256]) +{ + u32 s0 = in[0] ^ rdk[0]; + u32 s1 = in[1] ^ rdk[1]; + u32 s2 = in[2] ^ rdk[2]; + u32 s3 = in[3] ^ rdk[3]; + + u32 t0; + u32 t1; + u32 t2; + u32 t3; + + t0 = s_td0[s0 >> 24] ^ s_td1[(s3 >> 16) & 0xff] ^ s_td2[(s2 >> 8) & 0xff] ^ s_td3[s1 & 0xff] ^ rdk[ 4]; + t1 = s_td0[s1 >> 24] ^ s_td1[(s0 >> 16) & 0xff] ^ s_td2[(s3 >> 8) & 0xff] ^ s_td3[s2 & 0xff] ^ rdk[ 5]; + t2 = s_td0[s2 >> 24] ^ s_td1[(s1 >> 16) & 0xff] ^ s_td2[(s0 >> 8) & 0xff] ^ s_td3[s3 & 0xff] ^ rdk[ 6]; + t3 = s_td0[s3 >> 24] ^ s_td1[(s2 >> 16) & 0xff] ^ s_td2[(s1 >> 8) & 0xff] ^ s_td3[s0 & 0xff] ^ rdk[ 7]; + s0 = s_td0[t0 >> 24] ^ s_td1[(t3 >> 16) & 0xff] ^ s_td2[(t2 >> 8) & 0xff] ^ s_td3[t1 & 0xff] ^ rdk[ 8]; + s1 = s_td0[t1 >> 24] ^ s_td1[(t0 >> 16) & 0xff] ^ s_td2[(t3 >> 8) & 0xff] ^ s_td3[t2 & 0xff] ^ rdk[ 9]; + s2 = s_td0[t2 >> 24] ^ s_td1[(t1 >> 16) & 0xff] ^ s_td2[(t0 >> 8) & 0xff] ^ s_td3[t3 & 0xff] ^ rdk[10]; + s3 = s_td0[t3 >> 24] ^ s_td1[(t2 >> 16) & 0xff] ^ s_td2[(t1 >> 8) & 0xff] ^ s_td3[t0 & 0xff] ^ rdk[11]; + t0 = s_td0[s0 >> 24] ^ s_td1[(s3 >> 16) & 0xff] ^ s_td2[(s2 >> 8) & 0xff] ^ s_td3[s1 & 0xff] ^ rdk[12]; + t1 = s_td0[s1 >> 24] ^ s_td1[(s0 >> 16) & 0xff] ^ s_td2[(s3 >> 8) & 0xff] ^ s_td3[s2 & 0xff] ^ rdk[13]; + t2 = s_td0[s2 >> 24] ^ s_td1[(s1 >> 16) & 0xff] ^ s_td2[(s0 >> 8) & 0xff] ^ s_td3[s3 & 0xff] ^ rdk[14]; + t3 = s_td0[s3 >> 24] ^ s_td1[(s2 >> 16) & 0xff] ^ s_td2[(s1 >> 8) & 0xff] ^ s_td3[s0 & 0xff] ^ rdk[15]; + s0 = s_td0[t0 >> 24] ^ s_td1[(t3 >> 16) & 0xff] ^ s_td2[(t2 >> 8) & 0xff] ^ s_td3[t1 & 0xff] ^ rdk[16]; + s1 = s_td0[t1 >> 24] ^ s_td1[(t0 >> 16) & 0xff] ^ s_td2[(t3 >> 8) & 0xff] ^ s_td3[t2 & 0xff] ^ rdk[17]; + s2 = s_td0[t2 >> 24] ^ s_td1[(t1 >> 16) & 0xff] ^ s_td2[(t0 >> 8) & 0xff] ^ s_td3[t3 & 0xff] ^ rdk[18]; + s3 = s_td0[t3 >> 24] ^ s_td1[(t2 >> 16) & 0xff] ^ s_td2[(t1 >> 8) & 0xff] ^ s_td3[t0 & 0xff] ^ rdk[19]; + t0 = s_td0[s0 >> 24] ^ s_td1[(s3 >> 16) & 0xff] ^ s_td2[(s2 >> 8) & 0xff] ^ s_td3[s1 & 0xff] ^ rdk[20]; + t1 = s_td0[s1 >> 24] ^ s_td1[(s0 >> 16) & 0xff] ^ s_td2[(s3 >> 8) & 0xff] ^ s_td3[s2 & 0xff] ^ rdk[21]; + t2 = s_td0[s2 >> 24] ^ s_td1[(s1 >> 16) & 0xff] ^ s_td2[(s0 >> 8) & 0xff] ^ s_td3[s3 & 0xff] ^ rdk[22]; + t3 = s_td0[s3 >> 24] ^ s_td1[(s2 >> 16) & 0xff] ^ s_td2[(s1 >> 8) & 0xff] ^ s_td3[s0 & 0xff] ^ rdk[23]; + s0 = s_td0[t0 >> 24] ^ s_td1[(t3 >> 16) & 0xff] ^ s_td2[(t2 >> 8) & 0xff] ^ s_td3[t1 & 0xff] ^ rdk[24]; + s1 = s_td0[t1 >> 24] ^ s_td1[(t0 >> 16) & 0xff] ^ s_td2[(t3 >> 8) & 0xff] ^ s_td3[t2 & 0xff] ^ rdk[25]; + s2 = s_td0[t2 >> 24] ^ s_td1[(t1 >> 16) & 0xff] ^ s_td2[(t0 >> 8) & 0xff] ^ s_td3[t3 & 0xff] ^ rdk[26]; + s3 = s_td0[t3 >> 24] ^ s_td1[(t2 >> 16) & 0xff] ^ s_td2[(t1 >> 8) & 0xff] ^ s_td3[t0 & 0xff] ^ rdk[27]; + t0 = s_td0[s0 >> 24] ^ s_td1[(s3 >> 16) & 0xff] ^ s_td2[(s2 >> 8) & 0xff] ^ s_td3[s1 & 0xff] ^ rdk[28]; + t1 = s_td0[s1 >> 24] ^ s_td1[(s0 >> 16) & 0xff] ^ s_td2[(s3 >> 8) & 0xff] ^ s_td3[s2 & 0xff] ^ rdk[29]; + t2 = s_td0[s2 >> 24] ^ s_td1[(s1 >> 16) & 0xff] ^ s_td2[(s0 >> 8) & 0xff] ^ s_td3[s3 & 0xff] ^ rdk[30]; + t3 = s_td0[s3 >> 24] ^ s_td1[(s2 >> 16) & 0xff] ^ s_td2[(s1 >> 8) & 0xff] ^ s_td3[s0 & 0xff] ^ rdk[31]; + s0 = s_td0[t0 >> 24] ^ s_td1[(t3 >> 16) & 0xff] ^ s_td2[(t2 >> 8) & 0xff] ^ s_td3[t1 & 0xff] ^ rdk[32]; + s1 = s_td0[t1 >> 24] ^ s_td1[(t0 >> 16) & 0xff] ^ s_td2[(t3 >> 8) & 0xff] ^ s_td3[t2 & 0xff] ^ rdk[33]; + s2 = s_td0[t2 >> 24] ^ s_td1[(t1 >> 16) & 0xff] ^ s_td2[(t0 >> 8) & 0xff] ^ s_td3[t3 & 0xff] ^ rdk[34]; + s3 = s_td0[t3 >> 24] ^ s_td1[(t2 >> 16) & 0xff] ^ s_td2[(t1 >> 8) & 0xff] ^ s_td3[t0 & 0xff] ^ rdk[35]; + t0 = s_td0[s0 >> 24] ^ s_td1[(s3 >> 16) & 0xff] ^ s_td2[(s2 >> 8) & 0xff] ^ s_td3[s1 & 0xff] ^ rdk[36]; + t1 = s_td0[s1 >> 24] ^ s_td1[(s0 >> 16) & 0xff] ^ s_td2[(s3 >> 8) & 0xff] ^ s_td3[s2 & 0xff] ^ rdk[37]; + t2 = s_td0[s2 >> 24] ^ s_td1[(s1 >> 16) & 0xff] ^ s_td2[(s0 >> 8) & 0xff] ^ s_td3[s3 & 0xff] ^ rdk[38]; + t3 = s_td0[s3 >> 24] ^ s_td1[(s2 >> 16) & 0xff] ^ s_td2[(s1 >> 8) & 0xff] ^ s_td3[s0 & 0xff] ^ rdk[39]; + + out[0] = (s_td4[(t0 >> 24) & 0xff] & 0xff000000) + ^ (s_td4[(t3 >> 16) & 0xff] & 0x00ff0000) + ^ (s_td4[(t2 >> 8) & 0xff] & 0x0000ff00) + ^ (s_td4[(t1 >> 0) & 0xff] & 0x000000ff) + ^ rdk[40]; + + out[1] = (s_td4[(t1 >> 24) & 0xff] & 0xff000000) + ^ (s_td4[(t0 >> 16) & 0xff] & 0x00ff0000) + ^ (s_td4[(t3 >> 8) & 0xff] & 0x0000ff00) + ^ (s_td4[(t2 >> 0) & 0xff] & 0x000000ff) + ^ rdk[41]; + + out[2] = (s_td4[(t2 >> 24) & 0xff] & 0xff000000) + ^ (s_td4[(t1 >> 16) & 0xff] & 0x00ff0000) + ^ (s_td4[(t0 >> 8) & 0xff] & 0x0000ff00) + ^ (s_td4[(t3 >> 0) & 0xff] & 0x000000ff) + ^ rdk[42]; + + out[3] = (s_td4[(t3 >> 24) & 0xff] & 0xff000000) + ^ (s_td4[(t2 >> 16) & 0xff] & 0x00ff0000) + ^ (s_td4[(t1 >> 8) & 0xff] & 0x0000ff00) + ^ (s_td4[(t0 >> 0) & 0xff] & 0x000000ff) + ^ rdk[43]; +} + +static void sha1_transform (const u32x w0[4], const u32x w1[4], const u32x w2[4], const u32x w3[4], u32x digest[5]) +{ + u32x A = digest[0]; + u32x B = digest[1]; + u32x C = digest[2]; + u32x D = digest[3]; + u32x E = digest[4]; + + u32x w0_t = w0[0]; + u32x w1_t = w0[1]; + u32x w2_t = w0[2]; + u32x w3_t = w0[3]; + u32x w4_t = w1[0]; + u32x w5_t = w1[1]; + u32x w6_t = w1[2]; + u32x w7_t = w1[3]; + u32x w8_t = w2[0]; + u32x w9_t = w2[1]; + u32x wa_t = w2[2]; + u32x wb_t = w2[3]; + u32x wc_t = w3[0]; + u32x wd_t = w3[1]; + u32x we_t = w3[2]; + u32x wf_t = w3[3]; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, A, B, C, D, E, w0_t); + SHA1_STEP (SHA1_F0o, E, A, B, C, D, w1_t); + SHA1_STEP (SHA1_F0o, D, E, A, B, C, w2_t); + SHA1_STEP (SHA1_F0o, C, D, E, A, B, w3_t); + SHA1_STEP (SHA1_F0o, B, C, D, E, A, w4_t); + SHA1_STEP (SHA1_F0o, A, B, C, D, E, w5_t); + SHA1_STEP (SHA1_F0o, E, A, B, C, D, w6_t); + SHA1_STEP (SHA1_F0o, D, E, A, B, C, w7_t); + SHA1_STEP (SHA1_F0o, C, D, E, A, B, w8_t); + SHA1_STEP (SHA1_F0o, B, C, D, E, A, w9_t); + SHA1_STEP (SHA1_F0o, A, B, C, D, E, wa_t); + SHA1_STEP (SHA1_F0o, E, A, B, C, D, wb_t); + SHA1_STEP (SHA1_F0o, D, E, A, B, C, wc_t); + SHA1_STEP (SHA1_F0o, C, D, E, A, B, wd_t); + SHA1_STEP (SHA1_F0o, B, C, D, E, A, we_t); + SHA1_STEP (SHA1_F0o, A, B, C, D, E, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F0o, E, A, B, C, D, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F0o, D, E, A, B, C, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F0o, C, D, E, A, B, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F0o, B, C, D, E, A, w3_t); + + #undef K + #define K SHA1C01 + + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w7_t); + + #undef K + #define K SHA1C02 + + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, wb_t); + + #undef K + #define K SHA1C03 + + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, wf_t); + + digest[0] += A; + digest[1] += B; + digest[2] += C; + digest[3] += D; + digest[4] += E; +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m09500_init (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global office2010_tmp_t *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global office2010_t *office2010_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = pws[gid].i[ 8]; + w2[1] = pws[gid].i[ 9]; + w2[2] = pws[gid].i[10]; + w2[3] = pws[gid].i[11]; + + u32x w3[4]; + + w3[0] = pws[gid].i[12]; + w3[1] = pws[gid].i[13]; + w3[2] = pws[gid].i[14]; + w3[3] = pws[gid].i[15]; + + u32 pw_len = pws[gid].pw_len; + + append_0x80_4 (w0, w1, w2, w3, pw_len); + + make_unicode (w1, w2, w3); + make_unicode (w0, w0, w1); + + /** + * salt + */ + + u32 salt_len = salt_bufs[salt_pos].salt_len; + + u32 salt_buf[4]; + + salt_buf[0] = salt_bufs[salt_pos].salt_buf[0]; + salt_buf[1] = salt_bufs[salt_pos].salt_buf[1]; + salt_buf[2] = salt_bufs[salt_pos].salt_buf[2]; + salt_buf[3] = salt_bufs[salt_pos].salt_buf[3]; + + /** + * init + */ + + u32x t0[4]; + + t0[0] = salt_buf[0]; + t0[1] = salt_buf[1]; + t0[2] = salt_buf[2]; + t0[3] = salt_buf[3]; + + u32x t1[4]; + + t1[0] = swap_workaround (w0[0]); + t1[1] = swap_workaround (w0[1]); + t1[2] = swap_workaround (w0[2]); + t1[3] = swap_workaround (w0[3]); + + u32x t2[4]; + + t2[0] = swap_workaround (w1[0]); + t2[1] = swap_workaround (w1[1]); + t2[2] = swap_workaround (w1[2]); + t2[3] = swap_workaround (w1[3]); + + u32x t3[4]; + + t3[0] = swap_workaround (w2[0]); + t3[1] = swap_workaround (w2[1]); + t3[2] = 0; + t3[3] = (salt_len + (pw_len * 2)) * 8; + + u32x digest[5]; + + digest[0] = SHA1M_A; + digest[1] = SHA1M_B; + digest[2] = SHA1M_C; + digest[3] = SHA1M_D; + digest[4] = SHA1M_E; + + sha1_transform (t0, t1, t2, t3, digest); + + tmps[gid].out[0] = digest[0]; + tmps[gid].out[1] = digest[1]; + tmps[gid].out[2] = digest[2]; + tmps[gid].out[3] = digest[3]; + tmps[gid].out[4] = digest[4]; +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m09500_loop (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global office2010_tmp_t *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global office2010_t *office2010_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = 0; + w0[1] = tmps[gid].out[0]; + w0[2] = tmps[gid].out[1]; + w0[3] = tmps[gid].out[2]; + + u32x w1[4]; + + w1[0] = tmps[gid].out[3]; + w1[1] = tmps[gid].out[4]; + w1[2] = 0x80000000; + w1[3] = 0; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = (4 + 20) * 8; + + for (u32 i = 0, j = loop_pos; i < loop_cnt; i++, j++) + { + w0[0] = swap_workaround (j); + + u32x digest[5]; + + digest[0] = SHA1M_A; + digest[1] = SHA1M_B; + digest[2] = SHA1M_C; + digest[3] = SHA1M_D; + digest[4] = SHA1M_E; + + sha1_transform (w0, w1, w2, w3, digest); + + w0[1] = digest[0]; + w0[2] = digest[1]; + w0[3] = digest[2]; + w1[0] = digest[3]; + w1[1] = digest[4]; + } + + tmps[gid].out[0] = w0[1]; + tmps[gid].out[1] = w0[2]; + tmps[gid].out[2] = w0[3]; + tmps[gid].out[3] = w1[0]; + tmps[gid].out[4] = w1[1]; +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m09500_comp (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global office2010_tmp_t *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global office2010_t *office2010_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + const u32 gid = get_global_id (0); + const u32 lid = get_local_id (0); + + /** + * aes shared + */ + + const u32 lid4 = lid * 4; + + __local u32 s_td0[256]; + __local u32 s_td1[256]; + __local u32 s_td2[256]; + __local u32 s_td3[256]; + __local u32 s_td4[256]; + + __local u32 s_te0[256]; + __local u32 s_te1[256]; + __local u32 s_te2[256]; + __local u32 s_te3[256]; + __local u32 s_te4[256]; + + s_td0[lid4 + 0] = td0[lid4 + 0]; + s_td0[lid4 + 1] = td0[lid4 + 1]; + s_td0[lid4 + 2] = td0[lid4 + 2]; + s_td0[lid4 + 3] = td0[lid4 + 3]; + + s_td1[lid4 + 0] = td1[lid4 + 0]; + s_td1[lid4 + 1] = td1[lid4 + 1]; + s_td1[lid4 + 2] = td1[lid4 + 2]; + s_td1[lid4 + 3] = td1[lid4 + 3]; + + s_td2[lid4 + 0] = td2[lid4 + 0]; + s_td2[lid4 + 1] = td2[lid4 + 1]; + s_td2[lid4 + 2] = td2[lid4 + 2]; + s_td2[lid4 + 3] = td2[lid4 + 3]; + + s_td3[lid4 + 0] = td3[lid4 + 0]; + s_td3[lid4 + 1] = td3[lid4 + 1]; + s_td3[lid4 + 2] = td3[lid4 + 2]; + s_td3[lid4 + 3] = td3[lid4 + 3]; + + s_td4[lid4 + 0] = td4[lid4 + 0]; + s_td4[lid4 + 1] = td4[lid4 + 1]; + s_td4[lid4 + 2] = td4[lid4 + 2]; + s_td4[lid4 + 3] = td4[lid4 + 3]; + + s_te0[lid4 + 0] = te0[lid4 + 0]; + s_te0[lid4 + 1] = te0[lid4 + 1]; + s_te0[lid4 + 2] = te0[lid4 + 2]; + s_te0[lid4 + 3] = te0[lid4 + 3]; + + s_te1[lid4 + 0] = te1[lid4 + 0]; + s_te1[lid4 + 1] = te1[lid4 + 1]; + s_te1[lid4 + 2] = te1[lid4 + 2]; + s_te1[lid4 + 3] = te1[lid4 + 3]; + + s_te2[lid4 + 0] = te2[lid4 + 0]; + s_te2[lid4 + 1] = te2[lid4 + 1]; + s_te2[lid4 + 2] = te2[lid4 + 2]; + s_te2[lid4 + 3] = te2[lid4 + 3]; + + s_te3[lid4 + 0] = te3[lid4 + 0]; + s_te3[lid4 + 1] = te3[lid4 + 1]; + s_te3[lid4 + 2] = te3[lid4 + 2]; + s_te3[lid4 + 3] = te3[lid4 + 3]; + + s_te4[lid4 + 0] = te4[lid4 + 0]; + s_te4[lid4 + 1] = te4[lid4 + 1]; + s_te4[lid4 + 2] = te4[lid4 + 2]; + s_te4[lid4 + 3] = te4[lid4 + 3]; + + barrier (CLK_LOCAL_MEM_FENCE); + + if (gid >= gid_max) return; + + u32x encryptedVerifierHashInputBlockKey[2] = { 0xfea7d276, 0x3b4b9e79 }; + u32x encryptedVerifierHashValueBlockKey[2] = { 0xd7aa0f6d, 0x3061344e }; + + u32x w0[4]; + u32x w1[4]; + u32x w2[4]; + u32x w3[4]; + + w0[0] = tmps[gid].out[0]; + w0[1] = tmps[gid].out[1]; + w0[2] = tmps[gid].out[2]; + w0[3] = tmps[gid].out[3]; + w1[0] = tmps[gid].out[4]; + w1[1] = encryptedVerifierHashInputBlockKey[0]; + w1[2] = encryptedVerifierHashInputBlockKey[1]; + w1[3] = 0x80000000; + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = (20 + 8) * 8; + + u32 digest0[5]; + + digest0[0] = SHA1M_A; + digest0[1] = SHA1M_B; + digest0[2] = SHA1M_C; + digest0[3] = SHA1M_D; + digest0[4] = SHA1M_E; + + sha1_transform (w0, w1, w2, w3, digest0); + + w0[0] = tmps[gid].out[0]; + w0[1] = tmps[gid].out[1]; + w0[2] = tmps[gid].out[2]; + w0[3] = tmps[gid].out[3]; + w1[0] = tmps[gid].out[4]; + w1[1] = encryptedVerifierHashValueBlockKey[0]; + w1[2] = encryptedVerifierHashValueBlockKey[1]; + w1[3] = 0x80000000; + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = (20 + 8) * 8; + + u32 digest1[5]; + + digest1[0] = SHA1M_A; + digest1[1] = SHA1M_B; + digest1[2] = SHA1M_C; + digest1[3] = SHA1M_D; + digest1[4] = SHA1M_E; + + sha1_transform (w0, w1, w2, w3, digest1); + + // now we got the AES key, decrypt the verifier + + u32x rek[60]; + u32x rdk[60]; + + u32 data[4]; + + data[0] = office2010_bufs[salt_pos].encryptedVerifier[0]; + data[1] = office2010_bufs[salt_pos].encryptedVerifier[1]; + data[2] = office2010_bufs[salt_pos].encryptedVerifier[2]; + data[3] = office2010_bufs[salt_pos].encryptedVerifier[3]; + + u32x ukeyx[4]; + + ukeyx[0] = digest0[0]; + ukeyx[1] = digest0[1]; + ukeyx[2] = digest0[2]; + ukeyx[3] = digest0[3]; + + AES128_ExpandKey (ukeyx, rek, s_te0, s_te1, s_te2, s_te3, s_te4); + + for (u32 i = 0; i < 44; i++) rdk[i] = rek[i]; + + AES128_InvertKey (rdk, s_td0, s_td1, s_td2, s_td3, s_td4, s_te0, s_te1, s_te2, s_te3, s_te4); + + u32 out[4]; + + AES128_decrypt (data, out, rdk, s_td0, s_td1, s_td2, s_td3, s_td4); + + out[0] ^= salt_bufs[salt_pos].salt_buf[0]; + out[1] ^= salt_bufs[salt_pos].salt_buf[1]; + out[2] ^= salt_bufs[salt_pos].salt_buf[2]; + out[3] ^= salt_bufs[salt_pos].salt_buf[3]; + + // do a sha1 of the result + + w0[0] = out[0]; + w0[1] = out[1]; + w0[2] = out[2]; + w0[3] = out[3]; + w1[0] = 0x80000000; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 16 * 8; + + u32x digest[5]; + + digest[0] = SHA1M_A; + digest[1] = SHA1M_B; + digest[2] = SHA1M_C; + digest[3] = SHA1M_D; + digest[4] = SHA1M_E; + + sha1_transform (w0, w1, w2, w3, digest); + + // encrypt it again for verify + + ukeyx[0] = digest1[0]; + ukeyx[1] = digest1[1]; + ukeyx[2] = digest1[2]; + ukeyx[3] = digest1[3]; + + AES128_ExpandKey (ukeyx, rek, s_te0, s_te1, s_te2, s_te3, s_te4); + + data[0] = digest[0] ^ salt_bufs[salt_pos].salt_buf[0]; + data[1] = digest[1] ^ salt_bufs[salt_pos].salt_buf[1]; + data[2] = digest[2] ^ salt_bufs[salt_pos].salt_buf[2]; + data[3] = digest[3] ^ salt_bufs[salt_pos].salt_buf[3]; + + AES128_encrypt (data, out, rek, s_te0, s_te1, s_te2, s_te3, s_te4); + + const u32x r0 = out[0]; + const u32x r1 = out[1]; + const u32x r2 = out[2]; + const u32x r3 = out[3]; + + #define il_pos 0 + + #include VECT_COMPARE_M +} diff --git a/amd/m09600.cl b/amd/m09600.cl new file mode 100644 index 0000000000..5d0eb10529 --- /dev/null +++ b/amd/m09600.cl @@ -0,0 +1,1539 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _OFFICE2013_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW4 +#define VECT_SIZE1 +#endif + +#ifdef VLIW5 +#define VECT_SIZE1 +#endif + +#define DGST_R0 0 +#define DGST_R1 1 +#define DGST_R2 2 +#define DGST_R3 3 + +#include "include/kernel_functions.c" +#include "types_amd.c" +#include "common_amd.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +__constant u32 te0[256] = +{ + 0xc66363a5, 0xf87c7c84, 0xee777799, 0xf67b7b8d, + 0xfff2f20d, 0xd66b6bbd, 0xde6f6fb1, 0x91c5c554, + 0x60303050, 0x02010103, 0xce6767a9, 0x562b2b7d, + 0xe7fefe19, 0xb5d7d762, 0x4dababe6, 0xec76769a, + 0x8fcaca45, 0x1f82829d, 0x89c9c940, 0xfa7d7d87, + 0xeffafa15, 0xb25959eb, 0x8e4747c9, 0xfbf0f00b, + 0x41adadec, 0xb3d4d467, 0x5fa2a2fd, 0x45afafea, + 0x239c9cbf, 0x53a4a4f7, 0xe4727296, 0x9bc0c05b, + 0x75b7b7c2, 0xe1fdfd1c, 0x3d9393ae, 0x4c26266a, + 0x6c36365a, 0x7e3f3f41, 0xf5f7f702, 0x83cccc4f, + 0x6834345c, 0x51a5a5f4, 0xd1e5e534, 0xf9f1f108, + 0xe2717193, 0xabd8d873, 0x62313153, 0x2a15153f, + 0x0804040c, 0x95c7c752, 0x46232365, 0x9dc3c35e, + 0x30181828, 0x379696a1, 0x0a05050f, 0x2f9a9ab5, + 0x0e070709, 0x24121236, 0x1b80809b, 0xdfe2e23d, + 0xcdebeb26, 0x4e272769, 0x7fb2b2cd, 0xea75759f, + 0x1209091b, 0x1d83839e, 0x582c2c74, 0x341a1a2e, + 0x361b1b2d, 0xdc6e6eb2, 0xb45a5aee, 0x5ba0a0fb, + 0xa45252f6, 0x763b3b4d, 0xb7d6d661, 0x7db3b3ce, + 0x5229297b, 0xdde3e33e, 0x5e2f2f71, 0x13848497, + 0xa65353f5, 0xb9d1d168, 0x00000000, 0xc1eded2c, + 0x40202060, 0xe3fcfc1f, 0x79b1b1c8, 0xb65b5bed, + 0xd46a6abe, 0x8dcbcb46, 0x67bebed9, 0x7239394b, + 0x944a4ade, 0x984c4cd4, 0xb05858e8, 0x85cfcf4a, + 0xbbd0d06b, 0xc5efef2a, 0x4faaaae5, 0xedfbfb16, + 0x864343c5, 0x9a4d4dd7, 0x66333355, 0x11858594, + 0x8a4545cf, 0xe9f9f910, 0x04020206, 0xfe7f7f81, + 0xa05050f0, 0x783c3c44, 0x259f9fba, 0x4ba8a8e3, + 0xa25151f3, 0x5da3a3fe, 0x804040c0, 0x058f8f8a, + 0x3f9292ad, 0x219d9dbc, 0x70383848, 0xf1f5f504, + 0x63bcbcdf, 0x77b6b6c1, 0xafdada75, 0x42212163, + 0x20101030, 0xe5ffff1a, 0xfdf3f30e, 0xbfd2d26d, + 0x81cdcd4c, 0x180c0c14, 0x26131335, 0xc3ecec2f, + 0xbe5f5fe1, 0x359797a2, 0x884444cc, 0x2e171739, + 0x93c4c457, 0x55a7a7f2, 0xfc7e7e82, 0x7a3d3d47, + 0xc86464ac, 0xba5d5de7, 0x3219192b, 0xe6737395, + 0xc06060a0, 0x19818198, 0x9e4f4fd1, 0xa3dcdc7f, + 0x44222266, 0x542a2a7e, 0x3b9090ab, 0x0b888883, + 0x8c4646ca, 0xc7eeee29, 0x6bb8b8d3, 0x2814143c, + 0xa7dede79, 0xbc5e5ee2, 0x160b0b1d, 0xaddbdb76, + 0xdbe0e03b, 0x64323256, 0x743a3a4e, 0x140a0a1e, + 0x924949db, 0x0c06060a, 0x4824246c, 0xb85c5ce4, + 0x9fc2c25d, 0xbdd3d36e, 0x43acacef, 0xc46262a6, + 0x399191a8, 0x319595a4, 0xd3e4e437, 0xf279798b, + 0xd5e7e732, 0x8bc8c843, 0x6e373759, 0xda6d6db7, + 0x018d8d8c, 0xb1d5d564, 0x9c4e4ed2, 0x49a9a9e0, + 0xd86c6cb4, 0xac5656fa, 0xf3f4f407, 0xcfeaea25, + 0xca6565af, 0xf47a7a8e, 0x47aeaee9, 0x10080818, + 0x6fbabad5, 0xf0787888, 0x4a25256f, 0x5c2e2e72, + 0x381c1c24, 0x57a6a6f1, 0x73b4b4c7, 0x97c6c651, + 0xcbe8e823, 0xa1dddd7c, 0xe874749c, 0x3e1f1f21, + 0x964b4bdd, 0x61bdbddc, 0x0d8b8b86, 0x0f8a8a85, + 0xe0707090, 0x7c3e3e42, 0x71b5b5c4, 0xcc6666aa, + 0x904848d8, 0x06030305, 0xf7f6f601, 0x1c0e0e12, + 0xc26161a3, 0x6a35355f, 0xae5757f9, 0x69b9b9d0, + 0x17868691, 0x99c1c158, 0x3a1d1d27, 0x279e9eb9, + 0xd9e1e138, 0xebf8f813, 0x2b9898b3, 0x22111133, + 0xd26969bb, 0xa9d9d970, 0x078e8e89, 0x339494a7, + 0x2d9b9bb6, 0x3c1e1e22, 0x15878792, 0xc9e9e920, + 0x87cece49, 0xaa5555ff, 0x50282878, 0xa5dfdf7a, + 0x038c8c8f, 0x59a1a1f8, 0x09898980, 0x1a0d0d17, + 0x65bfbfda, 0xd7e6e631, 0x844242c6, 0xd06868b8, + 0x824141c3, 0x299999b0, 0x5a2d2d77, 0x1e0f0f11, + 0x7bb0b0cb, 0xa85454fc, 0x6dbbbbd6, 0x2c16163a, +}; + +__constant u32 te1[256] = +{ + 0xa5c66363, 0x84f87c7c, 0x99ee7777, 0x8df67b7b, + 0x0dfff2f2, 0xbdd66b6b, 0xb1de6f6f, 0x5491c5c5, + 0x50603030, 0x03020101, 0xa9ce6767, 0x7d562b2b, + 0x19e7fefe, 0x62b5d7d7, 0xe64dabab, 0x9aec7676, + 0x458fcaca, 0x9d1f8282, 0x4089c9c9, 0x87fa7d7d, + 0x15effafa, 0xebb25959, 0xc98e4747, 0x0bfbf0f0, + 0xec41adad, 0x67b3d4d4, 0xfd5fa2a2, 0xea45afaf, + 0xbf239c9c, 0xf753a4a4, 0x96e47272, 0x5b9bc0c0, + 0xc275b7b7, 0x1ce1fdfd, 0xae3d9393, 0x6a4c2626, + 0x5a6c3636, 0x417e3f3f, 0x02f5f7f7, 0x4f83cccc, + 0x5c683434, 0xf451a5a5, 0x34d1e5e5, 0x08f9f1f1, + 0x93e27171, 0x73abd8d8, 0x53623131, 0x3f2a1515, + 0x0c080404, 0x5295c7c7, 0x65462323, 0x5e9dc3c3, + 0x28301818, 0xa1379696, 0x0f0a0505, 0xb52f9a9a, + 0x090e0707, 0x36241212, 0x9b1b8080, 0x3ddfe2e2, + 0x26cdebeb, 0x694e2727, 0xcd7fb2b2, 0x9fea7575, + 0x1b120909, 0x9e1d8383, 0x74582c2c, 0x2e341a1a, + 0x2d361b1b, 0xb2dc6e6e, 0xeeb45a5a, 0xfb5ba0a0, + 0xf6a45252, 0x4d763b3b, 0x61b7d6d6, 0xce7db3b3, + 0x7b522929, 0x3edde3e3, 0x715e2f2f, 0x97138484, + 0xf5a65353, 0x68b9d1d1, 0x00000000, 0x2cc1eded, + 0x60402020, 0x1fe3fcfc, 0xc879b1b1, 0xedb65b5b, + 0xbed46a6a, 0x468dcbcb, 0xd967bebe, 0x4b723939, + 0xde944a4a, 0xd4984c4c, 0xe8b05858, 0x4a85cfcf, + 0x6bbbd0d0, 0x2ac5efef, 0xe54faaaa, 0x16edfbfb, + 0xc5864343, 0xd79a4d4d, 0x55663333, 0x94118585, + 0xcf8a4545, 0x10e9f9f9, 0x06040202, 0x81fe7f7f, + 0xf0a05050, 0x44783c3c, 0xba259f9f, 0xe34ba8a8, + 0xf3a25151, 0xfe5da3a3, 0xc0804040, 0x8a058f8f, + 0xad3f9292, 0xbc219d9d, 0x48703838, 0x04f1f5f5, + 0xdf63bcbc, 0xc177b6b6, 0x75afdada, 0x63422121, + 0x30201010, 0x1ae5ffff, 0x0efdf3f3, 0x6dbfd2d2, + 0x4c81cdcd, 0x14180c0c, 0x35261313, 0x2fc3ecec, + 0xe1be5f5f, 0xa2359797, 0xcc884444, 0x392e1717, + 0x5793c4c4, 0xf255a7a7, 0x82fc7e7e, 0x477a3d3d, + 0xacc86464, 0xe7ba5d5d, 0x2b321919, 0x95e67373, + 0xa0c06060, 0x98198181, 0xd19e4f4f, 0x7fa3dcdc, + 0x66442222, 0x7e542a2a, 0xab3b9090, 0x830b8888, + 0xca8c4646, 0x29c7eeee, 0xd36bb8b8, 0x3c281414, + 0x79a7dede, 0xe2bc5e5e, 0x1d160b0b, 0x76addbdb, + 0x3bdbe0e0, 0x56643232, 0x4e743a3a, 0x1e140a0a, + 0xdb924949, 0x0a0c0606, 0x6c482424, 0xe4b85c5c, + 0x5d9fc2c2, 0x6ebdd3d3, 0xef43acac, 0xa6c46262, + 0xa8399191, 0xa4319595, 0x37d3e4e4, 0x8bf27979, + 0x32d5e7e7, 0x438bc8c8, 0x596e3737, 0xb7da6d6d, + 0x8c018d8d, 0x64b1d5d5, 0xd29c4e4e, 0xe049a9a9, + 0xb4d86c6c, 0xfaac5656, 0x07f3f4f4, 0x25cfeaea, + 0xafca6565, 0x8ef47a7a, 0xe947aeae, 0x18100808, + 0xd56fbaba, 0x88f07878, 0x6f4a2525, 0x725c2e2e, + 0x24381c1c, 0xf157a6a6, 0xc773b4b4, 0x5197c6c6, + 0x23cbe8e8, 0x7ca1dddd, 0x9ce87474, 0x213e1f1f, + 0xdd964b4b, 0xdc61bdbd, 0x860d8b8b, 0x850f8a8a, + 0x90e07070, 0x427c3e3e, 0xc471b5b5, 0xaacc6666, + 0xd8904848, 0x05060303, 0x01f7f6f6, 0x121c0e0e, + 0xa3c26161, 0x5f6a3535, 0xf9ae5757, 0xd069b9b9, + 0x91178686, 0x5899c1c1, 0x273a1d1d, 0xb9279e9e, + 0x38d9e1e1, 0x13ebf8f8, 0xb32b9898, 0x33221111, + 0xbbd26969, 0x70a9d9d9, 0x89078e8e, 0xa7339494, + 0xb62d9b9b, 0x223c1e1e, 0x92158787, 0x20c9e9e9, + 0x4987cece, 0xffaa5555, 0x78502828, 0x7aa5dfdf, + 0x8f038c8c, 0xf859a1a1, 0x80098989, 0x171a0d0d, + 0xda65bfbf, 0x31d7e6e6, 0xc6844242, 0xb8d06868, + 0xc3824141, 0xb0299999, 0x775a2d2d, 0x111e0f0f, + 0xcb7bb0b0, 0xfca85454, 0xd66dbbbb, 0x3a2c1616, +}; + +__constant u32 te2[256] = +{ + 0x63a5c663, 0x7c84f87c, 0x7799ee77, 0x7b8df67b, + 0xf20dfff2, 0x6bbdd66b, 0x6fb1de6f, 0xc55491c5, + 0x30506030, 0x01030201, 0x67a9ce67, 0x2b7d562b, + 0xfe19e7fe, 0xd762b5d7, 0xabe64dab, 0x769aec76, + 0xca458fca, 0x829d1f82, 0xc94089c9, 0x7d87fa7d, + 0xfa15effa, 0x59ebb259, 0x47c98e47, 0xf00bfbf0, + 0xadec41ad, 0xd467b3d4, 0xa2fd5fa2, 0xafea45af, + 0x9cbf239c, 0xa4f753a4, 0x7296e472, 0xc05b9bc0, + 0xb7c275b7, 0xfd1ce1fd, 0x93ae3d93, 0x266a4c26, + 0x365a6c36, 0x3f417e3f, 0xf702f5f7, 0xcc4f83cc, + 0x345c6834, 0xa5f451a5, 0xe534d1e5, 0xf108f9f1, + 0x7193e271, 0xd873abd8, 0x31536231, 0x153f2a15, + 0x040c0804, 0xc75295c7, 0x23654623, 0xc35e9dc3, + 0x18283018, 0x96a13796, 0x050f0a05, 0x9ab52f9a, + 0x07090e07, 0x12362412, 0x809b1b80, 0xe23ddfe2, + 0xeb26cdeb, 0x27694e27, 0xb2cd7fb2, 0x759fea75, + 0x091b1209, 0x839e1d83, 0x2c74582c, 0x1a2e341a, + 0x1b2d361b, 0x6eb2dc6e, 0x5aeeb45a, 0xa0fb5ba0, + 0x52f6a452, 0x3b4d763b, 0xd661b7d6, 0xb3ce7db3, + 0x297b5229, 0xe33edde3, 0x2f715e2f, 0x84971384, + 0x53f5a653, 0xd168b9d1, 0x00000000, 0xed2cc1ed, + 0x20604020, 0xfc1fe3fc, 0xb1c879b1, 0x5bedb65b, + 0x6abed46a, 0xcb468dcb, 0xbed967be, 0x394b7239, + 0x4ade944a, 0x4cd4984c, 0x58e8b058, 0xcf4a85cf, + 0xd06bbbd0, 0xef2ac5ef, 0xaae54faa, 0xfb16edfb, + 0x43c58643, 0x4dd79a4d, 0x33556633, 0x85941185, + 0x45cf8a45, 0xf910e9f9, 0x02060402, 0x7f81fe7f, + 0x50f0a050, 0x3c44783c, 0x9fba259f, 0xa8e34ba8, + 0x51f3a251, 0xa3fe5da3, 0x40c08040, 0x8f8a058f, + 0x92ad3f92, 0x9dbc219d, 0x38487038, 0xf504f1f5, + 0xbcdf63bc, 0xb6c177b6, 0xda75afda, 0x21634221, + 0x10302010, 0xff1ae5ff, 0xf30efdf3, 0xd26dbfd2, + 0xcd4c81cd, 0x0c14180c, 0x13352613, 0xec2fc3ec, + 0x5fe1be5f, 0x97a23597, 0x44cc8844, 0x17392e17, + 0xc45793c4, 0xa7f255a7, 0x7e82fc7e, 0x3d477a3d, + 0x64acc864, 0x5de7ba5d, 0x192b3219, 0x7395e673, + 0x60a0c060, 0x81981981, 0x4fd19e4f, 0xdc7fa3dc, + 0x22664422, 0x2a7e542a, 0x90ab3b90, 0x88830b88, + 0x46ca8c46, 0xee29c7ee, 0xb8d36bb8, 0x143c2814, + 0xde79a7de, 0x5ee2bc5e, 0x0b1d160b, 0xdb76addb, + 0xe03bdbe0, 0x32566432, 0x3a4e743a, 0x0a1e140a, + 0x49db9249, 0x060a0c06, 0x246c4824, 0x5ce4b85c, + 0xc25d9fc2, 0xd36ebdd3, 0xacef43ac, 0x62a6c462, + 0x91a83991, 0x95a43195, 0xe437d3e4, 0x798bf279, + 0xe732d5e7, 0xc8438bc8, 0x37596e37, 0x6db7da6d, + 0x8d8c018d, 0xd564b1d5, 0x4ed29c4e, 0xa9e049a9, + 0x6cb4d86c, 0x56faac56, 0xf407f3f4, 0xea25cfea, + 0x65afca65, 0x7a8ef47a, 0xaee947ae, 0x08181008, + 0xbad56fba, 0x7888f078, 0x256f4a25, 0x2e725c2e, + 0x1c24381c, 0xa6f157a6, 0xb4c773b4, 0xc65197c6, + 0xe823cbe8, 0xdd7ca1dd, 0x749ce874, 0x1f213e1f, + 0x4bdd964b, 0xbddc61bd, 0x8b860d8b, 0x8a850f8a, + 0x7090e070, 0x3e427c3e, 0xb5c471b5, 0x66aacc66, + 0x48d89048, 0x03050603, 0xf601f7f6, 0x0e121c0e, + 0x61a3c261, 0x355f6a35, 0x57f9ae57, 0xb9d069b9, + 0x86911786, 0xc15899c1, 0x1d273a1d, 0x9eb9279e, + 0xe138d9e1, 0xf813ebf8, 0x98b32b98, 0x11332211, + 0x69bbd269, 0xd970a9d9, 0x8e89078e, 0x94a73394, + 0x9bb62d9b, 0x1e223c1e, 0x87921587, 0xe920c9e9, + 0xce4987ce, 0x55ffaa55, 0x28785028, 0xdf7aa5df, + 0x8c8f038c, 0xa1f859a1, 0x89800989, 0x0d171a0d, + 0xbfda65bf, 0xe631d7e6, 0x42c68442, 0x68b8d068, + 0x41c38241, 0x99b02999, 0x2d775a2d, 0x0f111e0f, + 0xb0cb7bb0, 0x54fca854, 0xbbd66dbb, 0x163a2c16, +}; + +__constant u32 te3[256] = +{ + 0x6363a5c6, 0x7c7c84f8, 0x777799ee, 0x7b7b8df6, + 0xf2f20dff, 0x6b6bbdd6, 0x6f6fb1de, 0xc5c55491, + 0x30305060, 0x01010302, 0x6767a9ce, 0x2b2b7d56, + 0xfefe19e7, 0xd7d762b5, 0xababe64d, 0x76769aec, + 0xcaca458f, 0x82829d1f, 0xc9c94089, 0x7d7d87fa, + 0xfafa15ef, 0x5959ebb2, 0x4747c98e, 0xf0f00bfb, + 0xadadec41, 0xd4d467b3, 0xa2a2fd5f, 0xafafea45, + 0x9c9cbf23, 0xa4a4f753, 0x727296e4, 0xc0c05b9b, + 0xb7b7c275, 0xfdfd1ce1, 0x9393ae3d, 0x26266a4c, + 0x36365a6c, 0x3f3f417e, 0xf7f702f5, 0xcccc4f83, + 0x34345c68, 0xa5a5f451, 0xe5e534d1, 0xf1f108f9, + 0x717193e2, 0xd8d873ab, 0x31315362, 0x15153f2a, + 0x04040c08, 0xc7c75295, 0x23236546, 0xc3c35e9d, + 0x18182830, 0x9696a137, 0x05050f0a, 0x9a9ab52f, + 0x0707090e, 0x12123624, 0x80809b1b, 0xe2e23ddf, + 0xebeb26cd, 0x2727694e, 0xb2b2cd7f, 0x75759fea, + 0x09091b12, 0x83839e1d, 0x2c2c7458, 0x1a1a2e34, + 0x1b1b2d36, 0x6e6eb2dc, 0x5a5aeeb4, 0xa0a0fb5b, + 0x5252f6a4, 0x3b3b4d76, 0xd6d661b7, 0xb3b3ce7d, + 0x29297b52, 0xe3e33edd, 0x2f2f715e, 0x84849713, + 0x5353f5a6, 0xd1d168b9, 0x00000000, 0xeded2cc1, + 0x20206040, 0xfcfc1fe3, 0xb1b1c879, 0x5b5bedb6, + 0x6a6abed4, 0xcbcb468d, 0xbebed967, 0x39394b72, + 0x4a4ade94, 0x4c4cd498, 0x5858e8b0, 0xcfcf4a85, + 0xd0d06bbb, 0xefef2ac5, 0xaaaae54f, 0xfbfb16ed, + 0x4343c586, 0x4d4dd79a, 0x33335566, 0x85859411, + 0x4545cf8a, 0xf9f910e9, 0x02020604, 0x7f7f81fe, + 0x5050f0a0, 0x3c3c4478, 0x9f9fba25, 0xa8a8e34b, + 0x5151f3a2, 0xa3a3fe5d, 0x4040c080, 0x8f8f8a05, + 0x9292ad3f, 0x9d9dbc21, 0x38384870, 0xf5f504f1, + 0xbcbcdf63, 0xb6b6c177, 0xdada75af, 0x21216342, + 0x10103020, 0xffff1ae5, 0xf3f30efd, 0xd2d26dbf, + 0xcdcd4c81, 0x0c0c1418, 0x13133526, 0xecec2fc3, + 0x5f5fe1be, 0x9797a235, 0x4444cc88, 0x1717392e, + 0xc4c45793, 0xa7a7f255, 0x7e7e82fc, 0x3d3d477a, + 0x6464acc8, 0x5d5de7ba, 0x19192b32, 0x737395e6, + 0x6060a0c0, 0x81819819, 0x4f4fd19e, 0xdcdc7fa3, + 0x22226644, 0x2a2a7e54, 0x9090ab3b, 0x8888830b, + 0x4646ca8c, 0xeeee29c7, 0xb8b8d36b, 0x14143c28, + 0xdede79a7, 0x5e5ee2bc, 0x0b0b1d16, 0xdbdb76ad, + 0xe0e03bdb, 0x32325664, 0x3a3a4e74, 0x0a0a1e14, + 0x4949db92, 0x06060a0c, 0x24246c48, 0x5c5ce4b8, + 0xc2c25d9f, 0xd3d36ebd, 0xacacef43, 0x6262a6c4, + 0x9191a839, 0x9595a431, 0xe4e437d3, 0x79798bf2, + 0xe7e732d5, 0xc8c8438b, 0x3737596e, 0x6d6db7da, + 0x8d8d8c01, 0xd5d564b1, 0x4e4ed29c, 0xa9a9e049, + 0x6c6cb4d8, 0x5656faac, 0xf4f407f3, 0xeaea25cf, + 0x6565afca, 0x7a7a8ef4, 0xaeaee947, 0x08081810, + 0xbabad56f, 0x787888f0, 0x25256f4a, 0x2e2e725c, + 0x1c1c2438, 0xa6a6f157, 0xb4b4c773, 0xc6c65197, + 0xe8e823cb, 0xdddd7ca1, 0x74749ce8, 0x1f1f213e, + 0x4b4bdd96, 0xbdbddc61, 0x8b8b860d, 0x8a8a850f, + 0x707090e0, 0x3e3e427c, 0xb5b5c471, 0x6666aacc, + 0x4848d890, 0x03030506, 0xf6f601f7, 0x0e0e121c, + 0x6161a3c2, 0x35355f6a, 0x5757f9ae, 0xb9b9d069, + 0x86869117, 0xc1c15899, 0x1d1d273a, 0x9e9eb927, + 0xe1e138d9, 0xf8f813eb, 0x9898b32b, 0x11113322, + 0x6969bbd2, 0xd9d970a9, 0x8e8e8907, 0x9494a733, + 0x9b9bb62d, 0x1e1e223c, 0x87879215, 0xe9e920c9, + 0xcece4987, 0x5555ffaa, 0x28287850, 0xdfdf7aa5, + 0x8c8c8f03, 0xa1a1f859, 0x89898009, 0x0d0d171a, + 0xbfbfda65, 0xe6e631d7, 0x4242c684, 0x6868b8d0, + 0x4141c382, 0x9999b029, 0x2d2d775a, 0x0f0f111e, + 0xb0b0cb7b, 0x5454fca8, 0xbbbbd66d, 0x16163a2c, +}; + +__constant u32 te4[256] = +{ + 0x63636363, 0x7c7c7c7c, 0x77777777, 0x7b7b7b7b, + 0xf2f2f2f2, 0x6b6b6b6b, 0x6f6f6f6f, 0xc5c5c5c5, + 0x30303030, 0x01010101, 0x67676767, 0x2b2b2b2b, + 0xfefefefe, 0xd7d7d7d7, 0xabababab, 0x76767676, + 0xcacacaca, 0x82828282, 0xc9c9c9c9, 0x7d7d7d7d, + 0xfafafafa, 0x59595959, 0x47474747, 0xf0f0f0f0, + 0xadadadad, 0xd4d4d4d4, 0xa2a2a2a2, 0xafafafaf, + 0x9c9c9c9c, 0xa4a4a4a4, 0x72727272, 0xc0c0c0c0, + 0xb7b7b7b7, 0xfdfdfdfd, 0x93939393, 0x26262626, + 0x36363636, 0x3f3f3f3f, 0xf7f7f7f7, 0xcccccccc, + 0x34343434, 0xa5a5a5a5, 0xe5e5e5e5, 0xf1f1f1f1, + 0x71717171, 0xd8d8d8d8, 0x31313131, 0x15151515, + 0x04040404, 0xc7c7c7c7, 0x23232323, 0xc3c3c3c3, + 0x18181818, 0x96969696, 0x05050505, 0x9a9a9a9a, + 0x07070707, 0x12121212, 0x80808080, 0xe2e2e2e2, + 0xebebebeb, 0x27272727, 0xb2b2b2b2, 0x75757575, + 0x09090909, 0x83838383, 0x2c2c2c2c, 0x1a1a1a1a, + 0x1b1b1b1b, 0x6e6e6e6e, 0x5a5a5a5a, 0xa0a0a0a0, + 0x52525252, 0x3b3b3b3b, 0xd6d6d6d6, 0xb3b3b3b3, + 0x29292929, 0xe3e3e3e3, 0x2f2f2f2f, 0x84848484, + 0x53535353, 0xd1d1d1d1, 0x00000000, 0xedededed, + 0x20202020, 0xfcfcfcfc, 0xb1b1b1b1, 0x5b5b5b5b, + 0x6a6a6a6a, 0xcbcbcbcb, 0xbebebebe, 0x39393939, + 0x4a4a4a4a, 0x4c4c4c4c, 0x58585858, 0xcfcfcfcf, + 0xd0d0d0d0, 0xefefefef, 0xaaaaaaaa, 0xfbfbfbfb, + 0x43434343, 0x4d4d4d4d, 0x33333333, 0x85858585, + 0x45454545, 0xf9f9f9f9, 0x02020202, 0x7f7f7f7f, + 0x50505050, 0x3c3c3c3c, 0x9f9f9f9f, 0xa8a8a8a8, + 0x51515151, 0xa3a3a3a3, 0x40404040, 0x8f8f8f8f, + 0x92929292, 0x9d9d9d9d, 0x38383838, 0xf5f5f5f5, + 0xbcbcbcbc, 0xb6b6b6b6, 0xdadadada, 0x21212121, + 0x10101010, 0xffffffff, 0xf3f3f3f3, 0xd2d2d2d2, + 0xcdcdcdcd, 0x0c0c0c0c, 0x13131313, 0xecececec, + 0x5f5f5f5f, 0x97979797, 0x44444444, 0x17171717, + 0xc4c4c4c4, 0xa7a7a7a7, 0x7e7e7e7e, 0x3d3d3d3d, + 0x64646464, 0x5d5d5d5d, 0x19191919, 0x73737373, + 0x60606060, 0x81818181, 0x4f4f4f4f, 0xdcdcdcdc, + 0x22222222, 0x2a2a2a2a, 0x90909090, 0x88888888, + 0x46464646, 0xeeeeeeee, 0xb8b8b8b8, 0x14141414, + 0xdededede, 0x5e5e5e5e, 0x0b0b0b0b, 0xdbdbdbdb, + 0xe0e0e0e0, 0x32323232, 0x3a3a3a3a, 0x0a0a0a0a, + 0x49494949, 0x06060606, 0x24242424, 0x5c5c5c5c, + 0xc2c2c2c2, 0xd3d3d3d3, 0xacacacac, 0x62626262, + 0x91919191, 0x95959595, 0xe4e4e4e4, 0x79797979, + 0xe7e7e7e7, 0xc8c8c8c8, 0x37373737, 0x6d6d6d6d, + 0x8d8d8d8d, 0xd5d5d5d5, 0x4e4e4e4e, 0xa9a9a9a9, + 0x6c6c6c6c, 0x56565656, 0xf4f4f4f4, 0xeaeaeaea, + 0x65656565, 0x7a7a7a7a, 0xaeaeaeae, 0x08080808, + 0xbabababa, 0x78787878, 0x25252525, 0x2e2e2e2e, + 0x1c1c1c1c, 0xa6a6a6a6, 0xb4b4b4b4, 0xc6c6c6c6, + 0xe8e8e8e8, 0xdddddddd, 0x74747474, 0x1f1f1f1f, + 0x4b4b4b4b, 0xbdbdbdbd, 0x8b8b8b8b, 0x8a8a8a8a, + 0x70707070, 0x3e3e3e3e, 0xb5b5b5b5, 0x66666666, + 0x48484848, 0x03030303, 0xf6f6f6f6, 0x0e0e0e0e, + 0x61616161, 0x35353535, 0x57575757, 0xb9b9b9b9, + 0x86868686, 0xc1c1c1c1, 0x1d1d1d1d, 0x9e9e9e9e, + 0xe1e1e1e1, 0xf8f8f8f8, 0x98989898, 0x11111111, + 0x69696969, 0xd9d9d9d9, 0x8e8e8e8e, 0x94949494, + 0x9b9b9b9b, 0x1e1e1e1e, 0x87878787, 0xe9e9e9e9, + 0xcececece, 0x55555555, 0x28282828, 0xdfdfdfdf, + 0x8c8c8c8c, 0xa1a1a1a1, 0x89898989, 0x0d0d0d0d, + 0xbfbfbfbf, 0xe6e6e6e6, 0x42424242, 0x68686868, + 0x41414141, 0x99999999, 0x2d2d2d2d, 0x0f0f0f0f, + 0xb0b0b0b0, 0x54545454, 0xbbbbbbbb, 0x16161616, +}; + +__constant u32 td0[256] = +{ + 0x51f4a750, 0x7e416553, 0x1a17a4c3, 0x3a275e96, + 0x3bab6bcb, 0x1f9d45f1, 0xacfa58ab, 0x4be30393, + 0x2030fa55, 0xad766df6, 0x88cc7691, 0xf5024c25, + 0x4fe5d7fc, 0xc52acbd7, 0x26354480, 0xb562a38f, + 0xdeb15a49, 0x25ba1b67, 0x45ea0e98, 0x5dfec0e1, + 0xc32f7502, 0x814cf012, 0x8d4697a3, 0x6bd3f9c6, + 0x038f5fe7, 0x15929c95, 0xbf6d7aeb, 0x955259da, + 0xd4be832d, 0x587421d3, 0x49e06929, 0x8ec9c844, + 0x75c2896a, 0xf48e7978, 0x99583e6b, 0x27b971dd, + 0xbee14fb6, 0xf088ad17, 0xc920ac66, 0x7dce3ab4, + 0x63df4a18, 0xe51a3182, 0x97513360, 0x62537f45, + 0xb16477e0, 0xbb6bae84, 0xfe81a01c, 0xf9082b94, + 0x70486858, 0x8f45fd19, 0x94de6c87, 0x527bf8b7, + 0xab73d323, 0x724b02e2, 0xe31f8f57, 0x6655ab2a, + 0xb2eb2807, 0x2fb5c203, 0x86c57b9a, 0xd33708a5, + 0x302887f2, 0x23bfa5b2, 0x02036aba, 0xed16825c, + 0x8acf1c2b, 0xa779b492, 0xf307f2f0, 0x4e69e2a1, + 0x65daf4cd, 0x0605bed5, 0xd134621f, 0xc4a6fe8a, + 0x342e539d, 0xa2f355a0, 0x058ae132, 0xa4f6eb75, + 0x0b83ec39, 0x4060efaa, 0x5e719f06, 0xbd6e1051, + 0x3e218af9, 0x96dd063d, 0xdd3e05ae, 0x4de6bd46, + 0x91548db5, 0x71c45d05, 0x0406d46f, 0x605015ff, + 0x1998fb24, 0xd6bde997, 0x894043cc, 0x67d99e77, + 0xb0e842bd, 0x07898b88, 0xe7195b38, 0x79c8eedb, + 0xa17c0a47, 0x7c420fe9, 0xf8841ec9, 0x00000000, + 0x09808683, 0x322bed48, 0x1e1170ac, 0x6c5a724e, + 0xfd0efffb, 0x0f853856, 0x3daed51e, 0x362d3927, + 0x0a0fd964, 0x685ca621, 0x9b5b54d1, 0x24362e3a, + 0x0c0a67b1, 0x9357e70f, 0xb4ee96d2, 0x1b9b919e, + 0x80c0c54f, 0x61dc20a2, 0x5a774b69, 0x1c121a16, + 0xe293ba0a, 0xc0a02ae5, 0x3c22e043, 0x121b171d, + 0x0e090d0b, 0xf28bc7ad, 0x2db6a8b9, 0x141ea9c8, + 0x57f11985, 0xaf75074c, 0xee99ddbb, 0xa37f60fd, + 0xf701269f, 0x5c72f5bc, 0x44663bc5, 0x5bfb7e34, + 0x8b432976, 0xcb23c6dc, 0xb6edfc68, 0xb8e4f163, + 0xd731dcca, 0x42638510, 0x13972240, 0x84c61120, + 0x854a247d, 0xd2bb3df8, 0xaef93211, 0xc729a16d, + 0x1d9e2f4b, 0xdcb230f3, 0x0d8652ec, 0x77c1e3d0, + 0x2bb3166c, 0xa970b999, 0x119448fa, 0x47e96422, + 0xa8fc8cc4, 0xa0f03f1a, 0x567d2cd8, 0x223390ef, + 0x87494ec7, 0xd938d1c1, 0x8ccaa2fe, 0x98d40b36, + 0xa6f581cf, 0xa57ade28, 0xdab78e26, 0x3fadbfa4, + 0x2c3a9de4, 0x5078920d, 0x6a5fcc9b, 0x547e4662, + 0xf68d13c2, 0x90d8b8e8, 0x2e39f75e, 0x82c3aff5, + 0x9f5d80be, 0x69d0937c, 0x6fd52da9, 0xcf2512b3, + 0xc8ac993b, 0x10187da7, 0xe89c636e, 0xdb3bbb7b, + 0xcd267809, 0x6e5918f4, 0xec9ab701, 0x834f9aa8, + 0xe6956e65, 0xaaffe67e, 0x21bccf08, 0xef15e8e6, + 0xbae79bd9, 0x4a6f36ce, 0xea9f09d4, 0x29b07cd6, + 0x31a4b2af, 0x2a3f2331, 0xc6a59430, 0x35a266c0, + 0x744ebc37, 0xfc82caa6, 0xe090d0b0, 0x33a7d815, + 0xf104984a, 0x41ecdaf7, 0x7fcd500e, 0x1791f62f, + 0x764dd68d, 0x43efb04d, 0xccaa4d54, 0xe49604df, + 0x9ed1b5e3, 0x4c6a881b, 0xc12c1fb8, 0x4665517f, + 0x9d5eea04, 0x018c355d, 0xfa877473, 0xfb0b412e, + 0xb3671d5a, 0x92dbd252, 0xe9105633, 0x6dd64713, + 0x9ad7618c, 0x37a10c7a, 0x59f8148e, 0xeb133c89, + 0xcea927ee, 0xb761c935, 0xe11ce5ed, 0x7a47b13c, + 0x9cd2df59, 0x55f2733f, 0x1814ce79, 0x73c737bf, + 0x53f7cdea, 0x5ffdaa5b, 0xdf3d6f14, 0x7844db86, + 0xcaaff381, 0xb968c43e, 0x3824342c, 0xc2a3405f, + 0x161dc372, 0xbce2250c, 0x283c498b, 0xff0d9541, + 0x39a80171, 0x080cb3de, 0xd8b4e49c, 0x6456c190, + 0x7bcb8461, 0xd532b670, 0x486c5c74, 0xd0b85742, +}; + +__constant u32 td1[256] = +{ + 0x5051f4a7, 0x537e4165, 0xc31a17a4, 0x963a275e, + 0xcb3bab6b, 0xf11f9d45, 0xabacfa58, 0x934be303, + 0x552030fa, 0xf6ad766d, 0x9188cc76, 0x25f5024c, + 0xfc4fe5d7, 0xd7c52acb, 0x80263544, 0x8fb562a3, + 0x49deb15a, 0x6725ba1b, 0x9845ea0e, 0xe15dfec0, + 0x02c32f75, 0x12814cf0, 0xa38d4697, 0xc66bd3f9, + 0xe7038f5f, 0x9515929c, 0xebbf6d7a, 0xda955259, + 0x2dd4be83, 0xd3587421, 0x2949e069, 0x448ec9c8, + 0x6a75c289, 0x78f48e79, 0x6b99583e, 0xdd27b971, + 0xb6bee14f, 0x17f088ad, 0x66c920ac, 0xb47dce3a, + 0x1863df4a, 0x82e51a31, 0x60975133, 0x4562537f, + 0xe0b16477, 0x84bb6bae, 0x1cfe81a0, 0x94f9082b, + 0x58704868, 0x198f45fd, 0x8794de6c, 0xb7527bf8, + 0x23ab73d3, 0xe2724b02, 0x57e31f8f, 0x2a6655ab, + 0x07b2eb28, 0x032fb5c2, 0x9a86c57b, 0xa5d33708, + 0xf2302887, 0xb223bfa5, 0xba02036a, 0x5ced1682, + 0x2b8acf1c, 0x92a779b4, 0xf0f307f2, 0xa14e69e2, + 0xcd65daf4, 0xd50605be, 0x1fd13462, 0x8ac4a6fe, + 0x9d342e53, 0xa0a2f355, 0x32058ae1, 0x75a4f6eb, + 0x390b83ec, 0xaa4060ef, 0x065e719f, 0x51bd6e10, + 0xf93e218a, 0x3d96dd06, 0xaedd3e05, 0x464de6bd, + 0xb591548d, 0x0571c45d, 0x6f0406d4, 0xff605015, + 0x241998fb, 0x97d6bde9, 0xcc894043, 0x7767d99e, + 0xbdb0e842, 0x8807898b, 0x38e7195b, 0xdb79c8ee, + 0x47a17c0a, 0xe97c420f, 0xc9f8841e, 0x00000000, + 0x83098086, 0x48322bed, 0xac1e1170, 0x4e6c5a72, + 0xfbfd0eff, 0x560f8538, 0x1e3daed5, 0x27362d39, + 0x640a0fd9, 0x21685ca6, 0xd19b5b54, 0x3a24362e, + 0xb10c0a67, 0x0f9357e7, 0xd2b4ee96, 0x9e1b9b91, + 0x4f80c0c5, 0xa261dc20, 0x695a774b, 0x161c121a, + 0x0ae293ba, 0xe5c0a02a, 0x433c22e0, 0x1d121b17, + 0x0b0e090d, 0xadf28bc7, 0xb92db6a8, 0xc8141ea9, + 0x8557f119, 0x4caf7507, 0xbbee99dd, 0xfda37f60, + 0x9ff70126, 0xbc5c72f5, 0xc544663b, 0x345bfb7e, + 0x768b4329, 0xdccb23c6, 0x68b6edfc, 0x63b8e4f1, + 0xcad731dc, 0x10426385, 0x40139722, 0x2084c611, + 0x7d854a24, 0xf8d2bb3d, 0x11aef932, 0x6dc729a1, + 0x4b1d9e2f, 0xf3dcb230, 0xec0d8652, 0xd077c1e3, + 0x6c2bb316, 0x99a970b9, 0xfa119448, 0x2247e964, + 0xc4a8fc8c, 0x1aa0f03f, 0xd8567d2c, 0xef223390, + 0xc787494e, 0xc1d938d1, 0xfe8ccaa2, 0x3698d40b, + 0xcfa6f581, 0x28a57ade, 0x26dab78e, 0xa43fadbf, + 0xe42c3a9d, 0x0d507892, 0x9b6a5fcc, 0x62547e46, + 0xc2f68d13, 0xe890d8b8, 0x5e2e39f7, 0xf582c3af, + 0xbe9f5d80, 0x7c69d093, 0xa96fd52d, 0xb3cf2512, + 0x3bc8ac99, 0xa710187d, 0x6ee89c63, 0x7bdb3bbb, + 0x09cd2678, 0xf46e5918, 0x01ec9ab7, 0xa8834f9a, + 0x65e6956e, 0x7eaaffe6, 0x0821bccf, 0xe6ef15e8, + 0xd9bae79b, 0xce4a6f36, 0xd4ea9f09, 0xd629b07c, + 0xaf31a4b2, 0x312a3f23, 0x30c6a594, 0xc035a266, + 0x37744ebc, 0xa6fc82ca, 0xb0e090d0, 0x1533a7d8, + 0x4af10498, 0xf741ecda, 0x0e7fcd50, 0x2f1791f6, + 0x8d764dd6, 0x4d43efb0, 0x54ccaa4d, 0xdfe49604, + 0xe39ed1b5, 0x1b4c6a88, 0xb8c12c1f, 0x7f466551, + 0x049d5eea, 0x5d018c35, 0x73fa8774, 0x2efb0b41, + 0x5ab3671d, 0x5292dbd2, 0x33e91056, 0x136dd647, + 0x8c9ad761, 0x7a37a10c, 0x8e59f814, 0x89eb133c, + 0xeecea927, 0x35b761c9, 0xede11ce5, 0x3c7a47b1, + 0x599cd2df, 0x3f55f273, 0x791814ce, 0xbf73c737, + 0xea53f7cd, 0x5b5ffdaa, 0x14df3d6f, 0x867844db, + 0x81caaff3, 0x3eb968c4, 0x2c382434, 0x5fc2a340, + 0x72161dc3, 0x0cbce225, 0x8b283c49, 0x41ff0d95, + 0x7139a801, 0xde080cb3, 0x9cd8b4e4, 0x906456c1, + 0x617bcb84, 0x70d532b6, 0x74486c5c, 0x42d0b857, +}; + +__constant u32 td2[256] = +{ + 0xa75051f4, 0x65537e41, 0xa4c31a17, 0x5e963a27, + 0x6bcb3bab, 0x45f11f9d, 0x58abacfa, 0x03934be3, + 0xfa552030, 0x6df6ad76, 0x769188cc, 0x4c25f502, + 0xd7fc4fe5, 0xcbd7c52a, 0x44802635, 0xa38fb562, + 0x5a49deb1, 0x1b6725ba, 0x0e9845ea, 0xc0e15dfe, + 0x7502c32f, 0xf012814c, 0x97a38d46, 0xf9c66bd3, + 0x5fe7038f, 0x9c951592, 0x7aebbf6d, 0x59da9552, + 0x832dd4be, 0x21d35874, 0x692949e0, 0xc8448ec9, + 0x896a75c2, 0x7978f48e, 0x3e6b9958, 0x71dd27b9, + 0x4fb6bee1, 0xad17f088, 0xac66c920, 0x3ab47dce, + 0x4a1863df, 0x3182e51a, 0x33609751, 0x7f456253, + 0x77e0b164, 0xae84bb6b, 0xa01cfe81, 0x2b94f908, + 0x68587048, 0xfd198f45, 0x6c8794de, 0xf8b7527b, + 0xd323ab73, 0x02e2724b, 0x8f57e31f, 0xab2a6655, + 0x2807b2eb, 0xc2032fb5, 0x7b9a86c5, 0x08a5d337, + 0x87f23028, 0xa5b223bf, 0x6aba0203, 0x825ced16, + 0x1c2b8acf, 0xb492a779, 0xf2f0f307, 0xe2a14e69, + 0xf4cd65da, 0xbed50605, 0x621fd134, 0xfe8ac4a6, + 0x539d342e, 0x55a0a2f3, 0xe132058a, 0xeb75a4f6, + 0xec390b83, 0xefaa4060, 0x9f065e71, 0x1051bd6e, + 0x8af93e21, 0x063d96dd, 0x05aedd3e, 0xbd464de6, + 0x8db59154, 0x5d0571c4, 0xd46f0406, 0x15ff6050, + 0xfb241998, 0xe997d6bd, 0x43cc8940, 0x9e7767d9, + 0x42bdb0e8, 0x8b880789, 0x5b38e719, 0xeedb79c8, + 0x0a47a17c, 0x0fe97c42, 0x1ec9f884, 0x00000000, + 0x86830980, 0xed48322b, 0x70ac1e11, 0x724e6c5a, + 0xfffbfd0e, 0x38560f85, 0xd51e3dae, 0x3927362d, + 0xd9640a0f, 0xa621685c, 0x54d19b5b, 0x2e3a2436, + 0x67b10c0a, 0xe70f9357, 0x96d2b4ee, 0x919e1b9b, + 0xc54f80c0, 0x20a261dc, 0x4b695a77, 0x1a161c12, + 0xba0ae293, 0x2ae5c0a0, 0xe0433c22, 0x171d121b, + 0x0d0b0e09, 0xc7adf28b, 0xa8b92db6, 0xa9c8141e, + 0x198557f1, 0x074caf75, 0xddbbee99, 0x60fda37f, + 0x269ff701, 0xf5bc5c72, 0x3bc54466, 0x7e345bfb, + 0x29768b43, 0xc6dccb23, 0xfc68b6ed, 0xf163b8e4, + 0xdccad731, 0x85104263, 0x22401397, 0x112084c6, + 0x247d854a, 0x3df8d2bb, 0x3211aef9, 0xa16dc729, + 0x2f4b1d9e, 0x30f3dcb2, 0x52ec0d86, 0xe3d077c1, + 0x166c2bb3, 0xb999a970, 0x48fa1194, 0x642247e9, + 0x8cc4a8fc, 0x3f1aa0f0, 0x2cd8567d, 0x90ef2233, + 0x4ec78749, 0xd1c1d938, 0xa2fe8cca, 0x0b3698d4, + 0x81cfa6f5, 0xde28a57a, 0x8e26dab7, 0xbfa43fad, + 0x9de42c3a, 0x920d5078, 0xcc9b6a5f, 0x4662547e, + 0x13c2f68d, 0xb8e890d8, 0xf75e2e39, 0xaff582c3, + 0x80be9f5d, 0x937c69d0, 0x2da96fd5, 0x12b3cf25, + 0x993bc8ac, 0x7da71018, 0x636ee89c, 0xbb7bdb3b, + 0x7809cd26, 0x18f46e59, 0xb701ec9a, 0x9aa8834f, + 0x6e65e695, 0xe67eaaff, 0xcf0821bc, 0xe8e6ef15, + 0x9bd9bae7, 0x36ce4a6f, 0x09d4ea9f, 0x7cd629b0, + 0xb2af31a4, 0x23312a3f, 0x9430c6a5, 0x66c035a2, + 0xbc37744e, 0xcaa6fc82, 0xd0b0e090, 0xd81533a7, + 0x984af104, 0xdaf741ec, 0x500e7fcd, 0xf62f1791, + 0xd68d764d, 0xb04d43ef, 0x4d54ccaa, 0x04dfe496, + 0xb5e39ed1, 0x881b4c6a, 0x1fb8c12c, 0x517f4665, + 0xea049d5e, 0x355d018c, 0x7473fa87, 0x412efb0b, + 0x1d5ab367, 0xd25292db, 0x5633e910, 0x47136dd6, + 0x618c9ad7, 0x0c7a37a1, 0x148e59f8, 0x3c89eb13, + 0x27eecea9, 0xc935b761, 0xe5ede11c, 0xb13c7a47, + 0xdf599cd2, 0x733f55f2, 0xce791814, 0x37bf73c7, + 0xcdea53f7, 0xaa5b5ffd, 0x6f14df3d, 0xdb867844, + 0xf381caaf, 0xc43eb968, 0x342c3824, 0x405fc2a3, + 0xc372161d, 0x250cbce2, 0x498b283c, 0x9541ff0d, + 0x017139a8, 0xb3de080c, 0xe49cd8b4, 0xc1906456, + 0x84617bcb, 0xb670d532, 0x5c74486c, 0x5742d0b8, +}; + +__constant u32 td3[256] = +{ + 0xf4a75051, 0x4165537e, 0x17a4c31a, 0x275e963a, + 0xab6bcb3b, 0x9d45f11f, 0xfa58abac, 0xe303934b, + 0x30fa5520, 0x766df6ad, 0xcc769188, 0x024c25f5, + 0xe5d7fc4f, 0x2acbd7c5, 0x35448026, 0x62a38fb5, + 0xb15a49de, 0xba1b6725, 0xea0e9845, 0xfec0e15d, + 0x2f7502c3, 0x4cf01281, 0x4697a38d, 0xd3f9c66b, + 0x8f5fe703, 0x929c9515, 0x6d7aebbf, 0x5259da95, + 0xbe832dd4, 0x7421d358, 0xe0692949, 0xc9c8448e, + 0xc2896a75, 0x8e7978f4, 0x583e6b99, 0xb971dd27, + 0xe14fb6be, 0x88ad17f0, 0x20ac66c9, 0xce3ab47d, + 0xdf4a1863, 0x1a3182e5, 0x51336097, 0x537f4562, + 0x6477e0b1, 0x6bae84bb, 0x81a01cfe, 0x082b94f9, + 0x48685870, 0x45fd198f, 0xde6c8794, 0x7bf8b752, + 0x73d323ab, 0x4b02e272, 0x1f8f57e3, 0x55ab2a66, + 0xeb2807b2, 0xb5c2032f, 0xc57b9a86, 0x3708a5d3, + 0x2887f230, 0xbfa5b223, 0x036aba02, 0x16825ced, + 0xcf1c2b8a, 0x79b492a7, 0x07f2f0f3, 0x69e2a14e, + 0xdaf4cd65, 0x05bed506, 0x34621fd1, 0xa6fe8ac4, + 0x2e539d34, 0xf355a0a2, 0x8ae13205, 0xf6eb75a4, + 0x83ec390b, 0x60efaa40, 0x719f065e, 0x6e1051bd, + 0x218af93e, 0xdd063d96, 0x3e05aedd, 0xe6bd464d, + 0x548db591, 0xc45d0571, 0x06d46f04, 0x5015ff60, + 0x98fb2419, 0xbde997d6, 0x4043cc89, 0xd99e7767, + 0xe842bdb0, 0x898b8807, 0x195b38e7, 0xc8eedb79, + 0x7c0a47a1, 0x420fe97c, 0x841ec9f8, 0x00000000, + 0x80868309, 0x2bed4832, 0x1170ac1e, 0x5a724e6c, + 0x0efffbfd, 0x8538560f, 0xaed51e3d, 0x2d392736, + 0x0fd9640a, 0x5ca62168, 0x5b54d19b, 0x362e3a24, + 0x0a67b10c, 0x57e70f93, 0xee96d2b4, 0x9b919e1b, + 0xc0c54f80, 0xdc20a261, 0x774b695a, 0x121a161c, + 0x93ba0ae2, 0xa02ae5c0, 0x22e0433c, 0x1b171d12, + 0x090d0b0e, 0x8bc7adf2, 0xb6a8b92d, 0x1ea9c814, + 0xf1198557, 0x75074caf, 0x99ddbbee, 0x7f60fda3, + 0x01269ff7, 0x72f5bc5c, 0x663bc544, 0xfb7e345b, + 0x4329768b, 0x23c6dccb, 0xedfc68b6, 0xe4f163b8, + 0x31dccad7, 0x63851042, 0x97224013, 0xc6112084, + 0x4a247d85, 0xbb3df8d2, 0xf93211ae, 0x29a16dc7, + 0x9e2f4b1d, 0xb230f3dc, 0x8652ec0d, 0xc1e3d077, + 0xb3166c2b, 0x70b999a9, 0x9448fa11, 0xe9642247, + 0xfc8cc4a8, 0xf03f1aa0, 0x7d2cd856, 0x3390ef22, + 0x494ec787, 0x38d1c1d9, 0xcaa2fe8c, 0xd40b3698, + 0xf581cfa6, 0x7ade28a5, 0xb78e26da, 0xadbfa43f, + 0x3a9de42c, 0x78920d50, 0x5fcc9b6a, 0x7e466254, + 0x8d13c2f6, 0xd8b8e890, 0x39f75e2e, 0xc3aff582, + 0x5d80be9f, 0xd0937c69, 0xd52da96f, 0x2512b3cf, + 0xac993bc8, 0x187da710, 0x9c636ee8, 0x3bbb7bdb, + 0x267809cd, 0x5918f46e, 0x9ab701ec, 0x4f9aa883, + 0x956e65e6, 0xffe67eaa, 0xbccf0821, 0x15e8e6ef, + 0xe79bd9ba, 0x6f36ce4a, 0x9f09d4ea, 0xb07cd629, + 0xa4b2af31, 0x3f23312a, 0xa59430c6, 0xa266c035, + 0x4ebc3774, 0x82caa6fc, 0x90d0b0e0, 0xa7d81533, + 0x04984af1, 0xecdaf741, 0xcd500e7f, 0x91f62f17, + 0x4dd68d76, 0xefb04d43, 0xaa4d54cc, 0x9604dfe4, + 0xd1b5e39e, 0x6a881b4c, 0x2c1fb8c1, 0x65517f46, + 0x5eea049d, 0x8c355d01, 0x877473fa, 0x0b412efb, + 0x671d5ab3, 0xdbd25292, 0x105633e9, 0xd647136d, + 0xd7618c9a, 0xa10c7a37, 0xf8148e59, 0x133c89eb, + 0xa927eece, 0x61c935b7, 0x1ce5ede1, 0x47b13c7a, + 0xd2df599c, 0xf2733f55, 0x14ce7918, 0xc737bf73, + 0xf7cdea53, 0xfdaa5b5f, 0x3d6f14df, 0x44db8678, + 0xaff381ca, 0x68c43eb9, 0x24342c38, 0xa3405fc2, + 0x1dc37216, 0xe2250cbc, 0x3c498b28, 0x0d9541ff, + 0xa8017139, 0x0cb3de08, 0xb4e49cd8, 0x56c19064, + 0xcb84617b, 0x32b670d5, 0x6c5c7448, 0xb85742d0, +}; + +__constant u32 td4[256] = +{ + 0x52525252, 0x09090909, 0x6a6a6a6a, 0xd5d5d5d5, + 0x30303030, 0x36363636, 0xa5a5a5a5, 0x38383838, + 0xbfbfbfbf, 0x40404040, 0xa3a3a3a3, 0x9e9e9e9e, + 0x81818181, 0xf3f3f3f3, 0xd7d7d7d7, 0xfbfbfbfb, + 0x7c7c7c7c, 0xe3e3e3e3, 0x39393939, 0x82828282, + 0x9b9b9b9b, 0x2f2f2f2f, 0xffffffff, 0x87878787, + 0x34343434, 0x8e8e8e8e, 0x43434343, 0x44444444, + 0xc4c4c4c4, 0xdededede, 0xe9e9e9e9, 0xcbcbcbcb, + 0x54545454, 0x7b7b7b7b, 0x94949494, 0x32323232, + 0xa6a6a6a6, 0xc2c2c2c2, 0x23232323, 0x3d3d3d3d, + 0xeeeeeeee, 0x4c4c4c4c, 0x95959595, 0x0b0b0b0b, + 0x42424242, 0xfafafafa, 0xc3c3c3c3, 0x4e4e4e4e, + 0x08080808, 0x2e2e2e2e, 0xa1a1a1a1, 0x66666666, + 0x28282828, 0xd9d9d9d9, 0x24242424, 0xb2b2b2b2, + 0x76767676, 0x5b5b5b5b, 0xa2a2a2a2, 0x49494949, + 0x6d6d6d6d, 0x8b8b8b8b, 0xd1d1d1d1, 0x25252525, + 0x72727272, 0xf8f8f8f8, 0xf6f6f6f6, 0x64646464, + 0x86868686, 0x68686868, 0x98989898, 0x16161616, + 0xd4d4d4d4, 0xa4a4a4a4, 0x5c5c5c5c, 0xcccccccc, + 0x5d5d5d5d, 0x65656565, 0xb6b6b6b6, 0x92929292, + 0x6c6c6c6c, 0x70707070, 0x48484848, 0x50505050, + 0xfdfdfdfd, 0xedededed, 0xb9b9b9b9, 0xdadadada, + 0x5e5e5e5e, 0x15151515, 0x46464646, 0x57575757, + 0xa7a7a7a7, 0x8d8d8d8d, 0x9d9d9d9d, 0x84848484, + 0x90909090, 0xd8d8d8d8, 0xabababab, 0x00000000, + 0x8c8c8c8c, 0xbcbcbcbc, 0xd3d3d3d3, 0x0a0a0a0a, + 0xf7f7f7f7, 0xe4e4e4e4, 0x58585858, 0x05050505, + 0xb8b8b8b8, 0xb3b3b3b3, 0x45454545, 0x06060606, + 0xd0d0d0d0, 0x2c2c2c2c, 0x1e1e1e1e, 0x8f8f8f8f, + 0xcacacaca, 0x3f3f3f3f, 0x0f0f0f0f, 0x02020202, + 0xc1c1c1c1, 0xafafafaf, 0xbdbdbdbd, 0x03030303, + 0x01010101, 0x13131313, 0x8a8a8a8a, 0x6b6b6b6b, + 0x3a3a3a3a, 0x91919191, 0x11111111, 0x41414141, + 0x4f4f4f4f, 0x67676767, 0xdcdcdcdc, 0xeaeaeaea, + 0x97979797, 0xf2f2f2f2, 0xcfcfcfcf, 0xcececece, + 0xf0f0f0f0, 0xb4b4b4b4, 0xe6e6e6e6, 0x73737373, + 0x96969696, 0xacacacac, 0x74747474, 0x22222222, + 0xe7e7e7e7, 0xadadadad, 0x35353535, 0x85858585, + 0xe2e2e2e2, 0xf9f9f9f9, 0x37373737, 0xe8e8e8e8, + 0x1c1c1c1c, 0x75757575, 0xdfdfdfdf, 0x6e6e6e6e, + 0x47474747, 0xf1f1f1f1, 0x1a1a1a1a, 0x71717171, + 0x1d1d1d1d, 0x29292929, 0xc5c5c5c5, 0x89898989, + 0x6f6f6f6f, 0xb7b7b7b7, 0x62626262, 0x0e0e0e0e, + 0xaaaaaaaa, 0x18181818, 0xbebebebe, 0x1b1b1b1b, + 0xfcfcfcfc, 0x56565656, 0x3e3e3e3e, 0x4b4b4b4b, + 0xc6c6c6c6, 0xd2d2d2d2, 0x79797979, 0x20202020, + 0x9a9a9a9a, 0xdbdbdbdb, 0xc0c0c0c0, 0xfefefefe, + 0x78787878, 0xcdcdcdcd, 0x5a5a5a5a, 0xf4f4f4f4, + 0x1f1f1f1f, 0xdddddddd, 0xa8a8a8a8, 0x33333333, + 0x88888888, 0x07070707, 0xc7c7c7c7, 0x31313131, + 0xb1b1b1b1, 0x12121212, 0x10101010, 0x59595959, + 0x27272727, 0x80808080, 0xecececec, 0x5f5f5f5f, + 0x60606060, 0x51515151, 0x7f7f7f7f, 0xa9a9a9a9, + 0x19191919, 0xb5b5b5b5, 0x4a4a4a4a, 0x0d0d0d0d, + 0x2d2d2d2d, 0xe5e5e5e5, 0x7a7a7a7a, 0x9f9f9f9f, + 0x93939393, 0xc9c9c9c9, 0x9c9c9c9c, 0xefefefef, + 0xa0a0a0a0, 0xe0e0e0e0, 0x3b3b3b3b, 0x4d4d4d4d, + 0xaeaeaeae, 0x2a2a2a2a, 0xf5f5f5f5, 0xb0b0b0b0, + 0xc8c8c8c8, 0xebebebeb, 0xbbbbbbbb, 0x3c3c3c3c, + 0x83838383, 0x53535353, 0x99999999, 0x61616161, + 0x17171717, 0x2b2b2b2b, 0x04040404, 0x7e7e7e7e, + 0xbabababa, 0x77777777, 0xd6d6d6d6, 0x26262626, + 0xe1e1e1e1, 0x69696969, 0x14141414, 0x63636363, + 0x55555555, 0x21212121, 0x0c0c0c0c, 0x7d7d7d7d, +}; + +__constant u32 rcon[] = +{ + 0x01000000, 0x02000000, 0x04000000, 0x08000000, + 0x10000000, 0x20000000, 0x40000000, 0x80000000, + 0x1b000000, 0x36000000, +}; + +static void AES256_ExpandKey (u32 *userkey, u32 *rek, __local u32 s_te0[256], __local u32 s_te1[256], __local u32 s_te2[256], __local u32 s_te3[256], __local u32 s_te4[256]) +{ + rek[0] = userkey[0]; + rek[1] = userkey[1]; + rek[2] = userkey[2]; + rek[3] = userkey[3]; + rek[4] = userkey[4]; + rek[5] = userkey[5]; + rek[6] = userkey[6]; + rek[7] = userkey[7]; + + int i; + int j; + + i = 0; + j = 0; + + while (1) + { + u32 temp = rek[j + 7]; + + rek[j + 8] = rek[j + 0] + ^ (s_te2[(temp >> 16) & 0xff] & 0xff000000) + ^ (s_te3[(temp >> 8) & 0xff] & 0x00ff0000) + ^ (s_te0[(temp >> 0) & 0xff] & 0x0000ff00) + ^ (s_te1[(temp >> 24) & 0xff] & 0x000000ff) + ^ rcon[i]; + + rek[j + 9] = rek[j + 1] ^ rek[j + 8]; + rek[j + 10] = rek[j + 2] ^ rek[j + 9]; + rek[j + 11] = rek[j + 3] ^ rek[j + 10]; + + if (++i == 7) break; + + temp = rek[j + 11]; + + rek[j + 12] = rek[j + 4] + ^ (s_te2[(temp >> 24) & 0xff] & 0xff000000) + ^ (s_te3[(temp >> 16) & 0xff] & 0x00ff0000) + ^ (s_te0[(temp >> 8) & 0xff] & 0x0000ff00) + ^ (s_te1[(temp >> 0) & 0xff] & 0x000000ff); + + rek[j + 13] = rek[j + 5] ^ rek[j + 12]; + rek[j + 14] = rek[j + 6] ^ rek[j + 13]; + rek[j + 15] = rek[j + 7] ^ rek[j + 14]; + + j += 8; + } +} + +static void AES256_InvertKey (u32 *rdk, __local u32 s_td0[256], __local u32 s_td1[256], __local u32 s_td2[256], __local u32 s_td3[256], __local u32 s_td4[256], __local u32 s_te0[256], __local u32 s_te1[256], __local u32 s_te2[256], __local u32 s_te3[256], __local u32 s_te4[256]) +{ + for (u32 i = 0, j = 56; i < j; i += 4, j -= 4) + { + u32 temp; + + temp = rdk[i + 0]; rdk[i + 0] = rdk[j + 0]; rdk[j + 0] = temp; + temp = rdk[i + 1]; rdk[i + 1] = rdk[j + 1]; rdk[j + 1] = temp; + temp = rdk[i + 2]; rdk[i + 2] = rdk[j + 2]; rdk[j + 2] = temp; + temp = rdk[i + 3]; rdk[i + 3] = rdk[j + 3]; rdk[j + 3] = temp; + } + + for (u32 i = 1, j = 4; i < 14; i += 1, j += 4) + { + rdk[j + 0] = + s_td0[s_te1[(rdk[j + 0] >> 24) & 0xff] & 0xff] ^ + s_td1[s_te1[(rdk[j + 0] >> 16) & 0xff] & 0xff] ^ + s_td2[s_te1[(rdk[j + 0] >> 8) & 0xff] & 0xff] ^ + s_td3[s_te1[(rdk[j + 0] >> 0) & 0xff] & 0xff]; + + rdk[j + 1] = + s_td0[s_te1[(rdk[j + 1] >> 24) & 0xff] & 0xff] ^ + s_td1[s_te1[(rdk[j + 1] >> 16) & 0xff] & 0xff] ^ + s_td2[s_te1[(rdk[j + 1] >> 8) & 0xff] & 0xff] ^ + s_td3[s_te1[(rdk[j + 1] >> 0) & 0xff] & 0xff]; + + rdk[j + 2] = + s_td0[s_te1[(rdk[j + 2] >> 24) & 0xff] & 0xff] ^ + s_td1[s_te1[(rdk[j + 2] >> 16) & 0xff] & 0xff] ^ + s_td2[s_te1[(rdk[j + 2] >> 8) & 0xff] & 0xff] ^ + s_td3[s_te1[(rdk[j + 2] >> 0) & 0xff] & 0xff]; + + rdk[j + 3] = + s_td0[s_te1[(rdk[j + 3] >> 24) & 0xff] & 0xff] ^ + s_td1[s_te1[(rdk[j + 3] >> 16) & 0xff] & 0xff] ^ + s_td2[s_te1[(rdk[j + 3] >> 8) & 0xff] & 0xff] ^ + s_td3[s_te1[(rdk[j + 3] >> 0) & 0xff] & 0xff]; + } +} + +static void AES256_decrypt (const u32 *in, u32 *out, const u32 *rdk, __local u32 s_td0[256], __local u32 s_td1[256], __local u32 s_td2[256], __local u32 s_td3[256], __local u32 s_td4[256]) +{ + u32 s0 = in[0] ^ rdk[0]; + u32 s1 = in[1] ^ rdk[1]; + u32 s2 = in[2] ^ rdk[2]; + u32 s3 = in[3] ^ rdk[3]; + + u32 t0; + u32 t1; + u32 t2; + u32 t3; + + t0 = s_td0[s0 >> 24] ^ s_td1[(s3 >> 16) & 0xff] ^ s_td2[(s2 >> 8) & 0xff] ^ s_td3[s1 & 0xff] ^ rdk[ 4]; + t1 = s_td0[s1 >> 24] ^ s_td1[(s0 >> 16) & 0xff] ^ s_td2[(s3 >> 8) & 0xff] ^ s_td3[s2 & 0xff] ^ rdk[ 5]; + t2 = s_td0[s2 >> 24] ^ s_td1[(s1 >> 16) & 0xff] ^ s_td2[(s0 >> 8) & 0xff] ^ s_td3[s3 & 0xff] ^ rdk[ 6]; + t3 = s_td0[s3 >> 24] ^ s_td1[(s2 >> 16) & 0xff] ^ s_td2[(s1 >> 8) & 0xff] ^ s_td3[s0 & 0xff] ^ rdk[ 7]; + s0 = s_td0[t0 >> 24] ^ s_td1[(t3 >> 16) & 0xff] ^ s_td2[(t2 >> 8) & 0xff] ^ s_td3[t1 & 0xff] ^ rdk[ 8]; + s1 = s_td0[t1 >> 24] ^ s_td1[(t0 >> 16) & 0xff] ^ s_td2[(t3 >> 8) & 0xff] ^ s_td3[t2 & 0xff] ^ rdk[ 9]; + s2 = s_td0[t2 >> 24] ^ s_td1[(t1 >> 16) & 0xff] ^ s_td2[(t0 >> 8) & 0xff] ^ s_td3[t3 & 0xff] ^ rdk[10]; + s3 = s_td0[t3 >> 24] ^ s_td1[(t2 >> 16) & 0xff] ^ s_td2[(t1 >> 8) & 0xff] ^ s_td3[t0 & 0xff] ^ rdk[11]; + t0 = s_td0[s0 >> 24] ^ s_td1[(s3 >> 16) & 0xff] ^ s_td2[(s2 >> 8) & 0xff] ^ s_td3[s1 & 0xff] ^ rdk[12]; + t1 = s_td0[s1 >> 24] ^ s_td1[(s0 >> 16) & 0xff] ^ s_td2[(s3 >> 8) & 0xff] ^ s_td3[s2 & 0xff] ^ rdk[13]; + t2 = s_td0[s2 >> 24] ^ s_td1[(s1 >> 16) & 0xff] ^ s_td2[(s0 >> 8) & 0xff] ^ s_td3[s3 & 0xff] ^ rdk[14]; + t3 = s_td0[s3 >> 24] ^ s_td1[(s2 >> 16) & 0xff] ^ s_td2[(s1 >> 8) & 0xff] ^ s_td3[s0 & 0xff] ^ rdk[15]; + s0 = s_td0[t0 >> 24] ^ s_td1[(t3 >> 16) & 0xff] ^ s_td2[(t2 >> 8) & 0xff] ^ s_td3[t1 & 0xff] ^ rdk[16]; + s1 = s_td0[t1 >> 24] ^ s_td1[(t0 >> 16) & 0xff] ^ s_td2[(t3 >> 8) & 0xff] ^ s_td3[t2 & 0xff] ^ rdk[17]; + s2 = s_td0[t2 >> 24] ^ s_td1[(t1 >> 16) & 0xff] ^ s_td2[(t0 >> 8) & 0xff] ^ s_td3[t3 & 0xff] ^ rdk[18]; + s3 = s_td0[t3 >> 24] ^ s_td1[(t2 >> 16) & 0xff] ^ s_td2[(t1 >> 8) & 0xff] ^ s_td3[t0 & 0xff] ^ rdk[19]; + t0 = s_td0[s0 >> 24] ^ s_td1[(s3 >> 16) & 0xff] ^ s_td2[(s2 >> 8) & 0xff] ^ s_td3[s1 & 0xff] ^ rdk[20]; + t1 = s_td0[s1 >> 24] ^ s_td1[(s0 >> 16) & 0xff] ^ s_td2[(s3 >> 8) & 0xff] ^ s_td3[s2 & 0xff] ^ rdk[21]; + t2 = s_td0[s2 >> 24] ^ s_td1[(s1 >> 16) & 0xff] ^ s_td2[(s0 >> 8) & 0xff] ^ s_td3[s3 & 0xff] ^ rdk[22]; + t3 = s_td0[s3 >> 24] ^ s_td1[(s2 >> 16) & 0xff] ^ s_td2[(s1 >> 8) & 0xff] ^ s_td3[s0 & 0xff] ^ rdk[23]; + s0 = s_td0[t0 >> 24] ^ s_td1[(t3 >> 16) & 0xff] ^ s_td2[(t2 >> 8) & 0xff] ^ s_td3[t1 & 0xff] ^ rdk[24]; + s1 = s_td0[t1 >> 24] ^ s_td1[(t0 >> 16) & 0xff] ^ s_td2[(t3 >> 8) & 0xff] ^ s_td3[t2 & 0xff] ^ rdk[25]; + s2 = s_td0[t2 >> 24] ^ s_td1[(t1 >> 16) & 0xff] ^ s_td2[(t0 >> 8) & 0xff] ^ s_td3[t3 & 0xff] ^ rdk[26]; + s3 = s_td0[t3 >> 24] ^ s_td1[(t2 >> 16) & 0xff] ^ s_td2[(t1 >> 8) & 0xff] ^ s_td3[t0 & 0xff] ^ rdk[27]; + t0 = s_td0[s0 >> 24] ^ s_td1[(s3 >> 16) & 0xff] ^ s_td2[(s2 >> 8) & 0xff] ^ s_td3[s1 & 0xff] ^ rdk[28]; + t1 = s_td0[s1 >> 24] ^ s_td1[(s0 >> 16) & 0xff] ^ s_td2[(s3 >> 8) & 0xff] ^ s_td3[s2 & 0xff] ^ rdk[29]; + t2 = s_td0[s2 >> 24] ^ s_td1[(s1 >> 16) & 0xff] ^ s_td2[(s0 >> 8) & 0xff] ^ s_td3[s3 & 0xff] ^ rdk[30]; + t3 = s_td0[s3 >> 24] ^ s_td1[(s2 >> 16) & 0xff] ^ s_td2[(s1 >> 8) & 0xff] ^ s_td3[s0 & 0xff] ^ rdk[31]; + s0 = s_td0[t0 >> 24] ^ s_td1[(t3 >> 16) & 0xff] ^ s_td2[(t2 >> 8) & 0xff] ^ s_td3[t1 & 0xff] ^ rdk[32]; + s1 = s_td0[t1 >> 24] ^ s_td1[(t0 >> 16) & 0xff] ^ s_td2[(t3 >> 8) & 0xff] ^ s_td3[t2 & 0xff] ^ rdk[33]; + s2 = s_td0[t2 >> 24] ^ s_td1[(t1 >> 16) & 0xff] ^ s_td2[(t0 >> 8) & 0xff] ^ s_td3[t3 & 0xff] ^ rdk[34]; + s3 = s_td0[t3 >> 24] ^ s_td1[(t2 >> 16) & 0xff] ^ s_td2[(t1 >> 8) & 0xff] ^ s_td3[t0 & 0xff] ^ rdk[35]; + t0 = s_td0[s0 >> 24] ^ s_td1[(s3 >> 16) & 0xff] ^ s_td2[(s2 >> 8) & 0xff] ^ s_td3[s1 & 0xff] ^ rdk[36]; + t1 = s_td0[s1 >> 24] ^ s_td1[(s0 >> 16) & 0xff] ^ s_td2[(s3 >> 8) & 0xff] ^ s_td3[s2 & 0xff] ^ rdk[37]; + t2 = s_td0[s2 >> 24] ^ s_td1[(s1 >> 16) & 0xff] ^ s_td2[(s0 >> 8) & 0xff] ^ s_td3[s3 & 0xff] ^ rdk[38]; + t3 = s_td0[s3 >> 24] ^ s_td1[(s2 >> 16) & 0xff] ^ s_td2[(s1 >> 8) & 0xff] ^ s_td3[s0 & 0xff] ^ rdk[39]; + s0 = s_td0[t0 >> 24] ^ s_td1[(t3 >> 16) & 0xff] ^ s_td2[(t2 >> 8) & 0xff] ^ s_td3[t1 & 0xff] ^ rdk[40]; + s1 = s_td0[t1 >> 24] ^ s_td1[(t0 >> 16) & 0xff] ^ s_td2[(t3 >> 8) & 0xff] ^ s_td3[t2 & 0xff] ^ rdk[41]; + s2 = s_td0[t2 >> 24] ^ s_td1[(t1 >> 16) & 0xff] ^ s_td2[(t0 >> 8) & 0xff] ^ s_td3[t3 & 0xff] ^ rdk[42]; + s3 = s_td0[t3 >> 24] ^ s_td1[(t2 >> 16) & 0xff] ^ s_td2[(t1 >> 8) & 0xff] ^ s_td3[t0 & 0xff] ^ rdk[43]; + t0 = s_td0[s0 >> 24] ^ s_td1[(s3 >> 16) & 0xff] ^ s_td2[(s2 >> 8) & 0xff] ^ s_td3[s1 & 0xff] ^ rdk[44]; + t1 = s_td0[s1 >> 24] ^ s_td1[(s0 >> 16) & 0xff] ^ s_td2[(s3 >> 8) & 0xff] ^ s_td3[s2 & 0xff] ^ rdk[45]; + t2 = s_td0[s2 >> 24] ^ s_td1[(s1 >> 16) & 0xff] ^ s_td2[(s0 >> 8) & 0xff] ^ s_td3[s3 & 0xff] ^ rdk[46]; + t3 = s_td0[s3 >> 24] ^ s_td1[(s2 >> 16) & 0xff] ^ s_td2[(s1 >> 8) & 0xff] ^ s_td3[s0 & 0xff] ^ rdk[47]; + s0 = s_td0[t0 >> 24] ^ s_td1[(t3 >> 16) & 0xff] ^ s_td2[(t2 >> 8) & 0xff] ^ s_td3[t1 & 0xff] ^ rdk[48]; + s1 = s_td0[t1 >> 24] ^ s_td1[(t0 >> 16) & 0xff] ^ s_td2[(t3 >> 8) & 0xff] ^ s_td3[t2 & 0xff] ^ rdk[49]; + s2 = s_td0[t2 >> 24] ^ s_td1[(t1 >> 16) & 0xff] ^ s_td2[(t0 >> 8) & 0xff] ^ s_td3[t3 & 0xff] ^ rdk[50]; + s3 = s_td0[t3 >> 24] ^ s_td1[(t2 >> 16) & 0xff] ^ s_td2[(t1 >> 8) & 0xff] ^ s_td3[t0 & 0xff] ^ rdk[51]; + t0 = s_td0[s0 >> 24] ^ s_td1[(s3 >> 16) & 0xff] ^ s_td2[(s2 >> 8) & 0xff] ^ s_td3[s1 & 0xff] ^ rdk[52]; + t1 = s_td0[s1 >> 24] ^ s_td1[(s0 >> 16) & 0xff] ^ s_td2[(s3 >> 8) & 0xff] ^ s_td3[s2 & 0xff] ^ rdk[53]; + t2 = s_td0[s2 >> 24] ^ s_td1[(s1 >> 16) & 0xff] ^ s_td2[(s0 >> 8) & 0xff] ^ s_td3[s3 & 0xff] ^ rdk[54]; + t3 = s_td0[s3 >> 24] ^ s_td1[(s2 >> 16) & 0xff] ^ s_td2[(s1 >> 8) & 0xff] ^ s_td3[s0 & 0xff] ^ rdk[55]; + + out[0] = (s_td4[(t0 >> 24) & 0xff] & 0xff000000) + ^ (s_td4[(t3 >> 16) & 0xff] & 0x00ff0000) + ^ (s_td4[(t2 >> 8) & 0xff] & 0x0000ff00) + ^ (s_td4[(t1 >> 0) & 0xff] & 0x000000ff) + ^ rdk[56]; + + out[1] = (s_td4[(t1 >> 24) & 0xff] & 0xff000000) + ^ (s_td4[(t0 >> 16) & 0xff] & 0x00ff0000) + ^ (s_td4[(t3 >> 8) & 0xff] & 0x0000ff00) + ^ (s_td4[(t2 >> 0) & 0xff] & 0x000000ff) + ^ rdk[57]; + + out[2] = (s_td4[(t2 >> 24) & 0xff] & 0xff000000) + ^ (s_td4[(t1 >> 16) & 0xff] & 0x00ff0000) + ^ (s_td4[(t0 >> 8) & 0xff] & 0x0000ff00) + ^ (s_td4[(t3 >> 0) & 0xff] & 0x000000ff) + ^ rdk[58]; + + out[3] = (s_td4[(t3 >> 24) & 0xff] & 0xff000000) + ^ (s_td4[(t2 >> 16) & 0xff] & 0x00ff0000) + ^ (s_td4[(t1 >> 8) & 0xff] & 0x0000ff00) + ^ (s_td4[(t0 >> 0) & 0xff] & 0x000000ff) + ^ rdk[59]; +} + +static void AES256_encrypt (const u32 *in, u32 *out, const u32 *rek, __local u32 s_te0[256], __local u32 s_te1[256], __local u32 s_te2[256], __local u32 s_te3[256], __local u32 s_te4[256]) +{ + u32 s0 = in[0] ^ rek[0]; + u32 s1 = in[1] ^ rek[1]; + u32 s2 = in[2] ^ rek[2]; + u32 s3 = in[3] ^ rek[3]; + + u32 t0; + u32 t1; + u32 t2; + u32 t3; + + t0 = s_te0[s0 >> 24] ^ s_te1[(s1 >> 16) & 0xff] ^ s_te2[(s2 >> 8) & 0xff] ^ s_te3[s3 & 0xff] ^ rek[ 4]; + t1 = s_te0[s1 >> 24] ^ s_te1[(s2 >> 16) & 0xff] ^ s_te2[(s3 >> 8) & 0xff] ^ s_te3[s0 & 0xff] ^ rek[ 5]; + t2 = s_te0[s2 >> 24] ^ s_te1[(s3 >> 16) & 0xff] ^ s_te2[(s0 >> 8) & 0xff] ^ s_te3[s1 & 0xff] ^ rek[ 6]; + t3 = s_te0[s3 >> 24] ^ s_te1[(s0 >> 16) & 0xff] ^ s_te2[(s1 >> 8) & 0xff] ^ s_te3[s2 & 0xff] ^ rek[ 7]; + s0 = s_te0[t0 >> 24] ^ s_te1[(t1 >> 16) & 0xff] ^ s_te2[(t2 >> 8) & 0xff] ^ s_te3[t3 & 0xff] ^ rek[ 8]; + s1 = s_te0[t1 >> 24] ^ s_te1[(t2 >> 16) & 0xff] ^ s_te2[(t3 >> 8) & 0xff] ^ s_te3[t0 & 0xff] ^ rek[ 9]; + s2 = s_te0[t2 >> 24] ^ s_te1[(t3 >> 16) & 0xff] ^ s_te2[(t0 >> 8) & 0xff] ^ s_te3[t1 & 0xff] ^ rek[10]; + s3 = s_te0[t3 >> 24] ^ s_te1[(t0 >> 16) & 0xff] ^ s_te2[(t1 >> 8) & 0xff] ^ s_te3[t2 & 0xff] ^ rek[11]; + t0 = s_te0[s0 >> 24] ^ s_te1[(s1 >> 16) & 0xff] ^ s_te2[(s2 >> 8) & 0xff] ^ s_te3[s3 & 0xff] ^ rek[12]; + t1 = s_te0[s1 >> 24] ^ s_te1[(s2 >> 16) & 0xff] ^ s_te2[(s3 >> 8) & 0xff] ^ s_te3[s0 & 0xff] ^ rek[13]; + t2 = s_te0[s2 >> 24] ^ s_te1[(s3 >> 16) & 0xff] ^ s_te2[(s0 >> 8) & 0xff] ^ s_te3[s1 & 0xff] ^ rek[14]; + t3 = s_te0[s3 >> 24] ^ s_te1[(s0 >> 16) & 0xff] ^ s_te2[(s1 >> 8) & 0xff] ^ s_te3[s2 & 0xff] ^ rek[15]; + s0 = s_te0[t0 >> 24] ^ s_te1[(t1 >> 16) & 0xff] ^ s_te2[(t2 >> 8) & 0xff] ^ s_te3[t3 & 0xff] ^ rek[16]; + s1 = s_te0[t1 >> 24] ^ s_te1[(t2 >> 16) & 0xff] ^ s_te2[(t3 >> 8) & 0xff] ^ s_te3[t0 & 0xff] ^ rek[17]; + s2 = s_te0[t2 >> 24] ^ s_te1[(t3 >> 16) & 0xff] ^ s_te2[(t0 >> 8) & 0xff] ^ s_te3[t1 & 0xff] ^ rek[18]; + s3 = s_te0[t3 >> 24] ^ s_te1[(t0 >> 16) & 0xff] ^ s_te2[(t1 >> 8) & 0xff] ^ s_te3[t2 & 0xff] ^ rek[19]; + t0 = s_te0[s0 >> 24] ^ s_te1[(s1 >> 16) & 0xff] ^ s_te2[(s2 >> 8) & 0xff] ^ s_te3[s3 & 0xff] ^ rek[20]; + t1 = s_te0[s1 >> 24] ^ s_te1[(s2 >> 16) & 0xff] ^ s_te2[(s3 >> 8) & 0xff] ^ s_te3[s0 & 0xff] ^ rek[21]; + t2 = s_te0[s2 >> 24] ^ s_te1[(s3 >> 16) & 0xff] ^ s_te2[(s0 >> 8) & 0xff] ^ s_te3[s1 & 0xff] ^ rek[22]; + t3 = s_te0[s3 >> 24] ^ s_te1[(s0 >> 16) & 0xff] ^ s_te2[(s1 >> 8) & 0xff] ^ s_te3[s2 & 0xff] ^ rek[23]; + s0 = s_te0[t0 >> 24] ^ s_te1[(t1 >> 16) & 0xff] ^ s_te2[(t2 >> 8) & 0xff] ^ s_te3[t3 & 0xff] ^ rek[24]; + s1 = s_te0[t1 >> 24] ^ s_te1[(t2 >> 16) & 0xff] ^ s_te2[(t3 >> 8) & 0xff] ^ s_te3[t0 & 0xff] ^ rek[25]; + s2 = s_te0[t2 >> 24] ^ s_te1[(t3 >> 16) & 0xff] ^ s_te2[(t0 >> 8) & 0xff] ^ s_te3[t1 & 0xff] ^ rek[26]; + s3 = s_te0[t3 >> 24] ^ s_te1[(t0 >> 16) & 0xff] ^ s_te2[(t1 >> 8) & 0xff] ^ s_te3[t2 & 0xff] ^ rek[27]; + t0 = s_te0[s0 >> 24] ^ s_te1[(s1 >> 16) & 0xff] ^ s_te2[(s2 >> 8) & 0xff] ^ s_te3[s3 & 0xff] ^ rek[28]; + t1 = s_te0[s1 >> 24] ^ s_te1[(s2 >> 16) & 0xff] ^ s_te2[(s3 >> 8) & 0xff] ^ s_te3[s0 & 0xff] ^ rek[29]; + t2 = s_te0[s2 >> 24] ^ s_te1[(s3 >> 16) & 0xff] ^ s_te2[(s0 >> 8) & 0xff] ^ s_te3[s1 & 0xff] ^ rek[30]; + t3 = s_te0[s3 >> 24] ^ s_te1[(s0 >> 16) & 0xff] ^ s_te2[(s1 >> 8) & 0xff] ^ s_te3[s2 & 0xff] ^ rek[31]; + s0 = s_te0[t0 >> 24] ^ s_te1[(t1 >> 16) & 0xff] ^ s_te2[(t2 >> 8) & 0xff] ^ s_te3[t3 & 0xff] ^ rek[32]; + s1 = s_te0[t1 >> 24] ^ s_te1[(t2 >> 16) & 0xff] ^ s_te2[(t3 >> 8) & 0xff] ^ s_te3[t0 & 0xff] ^ rek[33]; + s2 = s_te0[t2 >> 24] ^ s_te1[(t3 >> 16) & 0xff] ^ s_te2[(t0 >> 8) & 0xff] ^ s_te3[t1 & 0xff] ^ rek[34]; + s3 = s_te0[t3 >> 24] ^ s_te1[(t0 >> 16) & 0xff] ^ s_te2[(t1 >> 8) & 0xff] ^ s_te3[t2 & 0xff] ^ rek[35]; + t0 = s_te0[s0 >> 24] ^ s_te1[(s1 >> 16) & 0xff] ^ s_te2[(s2 >> 8) & 0xff] ^ s_te3[s3 & 0xff] ^ rek[36]; + t1 = s_te0[s1 >> 24] ^ s_te1[(s2 >> 16) & 0xff] ^ s_te2[(s3 >> 8) & 0xff] ^ s_te3[s0 & 0xff] ^ rek[37]; + t2 = s_te0[s2 >> 24] ^ s_te1[(s3 >> 16) & 0xff] ^ s_te2[(s0 >> 8) & 0xff] ^ s_te3[s1 & 0xff] ^ rek[38]; + t3 = s_te0[s3 >> 24] ^ s_te1[(s0 >> 16) & 0xff] ^ s_te2[(s1 >> 8) & 0xff] ^ s_te3[s2 & 0xff] ^ rek[39]; + s0 = s_te0[t0 >> 24] ^ s_te1[(t1 >> 16) & 0xff] ^ s_te2[(t2 >> 8) & 0xff] ^ s_te3[t3 & 0xff] ^ rek[40]; + s1 = s_te0[t1 >> 24] ^ s_te1[(t2 >> 16) & 0xff] ^ s_te2[(t3 >> 8) & 0xff] ^ s_te3[t0 & 0xff] ^ rek[41]; + s2 = s_te0[t2 >> 24] ^ s_te1[(t3 >> 16) & 0xff] ^ s_te2[(t0 >> 8) & 0xff] ^ s_te3[t1 & 0xff] ^ rek[42]; + s3 = s_te0[t3 >> 24] ^ s_te1[(t0 >> 16) & 0xff] ^ s_te2[(t1 >> 8) & 0xff] ^ s_te3[t2 & 0xff] ^ rek[43]; + t0 = s_te0[s0 >> 24] ^ s_te1[(s1 >> 16) & 0xff] ^ s_te2[(s2 >> 8) & 0xff] ^ s_te3[s3 & 0xff] ^ rek[44]; + t1 = s_te0[s1 >> 24] ^ s_te1[(s2 >> 16) & 0xff] ^ s_te2[(s3 >> 8) & 0xff] ^ s_te3[s0 & 0xff] ^ rek[45]; + t2 = s_te0[s2 >> 24] ^ s_te1[(s3 >> 16) & 0xff] ^ s_te2[(s0 >> 8) & 0xff] ^ s_te3[s1 & 0xff] ^ rek[46]; + t3 = s_te0[s3 >> 24] ^ s_te1[(s0 >> 16) & 0xff] ^ s_te2[(s1 >> 8) & 0xff] ^ s_te3[s2 & 0xff] ^ rek[47]; + s0 = s_te0[t0 >> 24] ^ s_te1[(t1 >> 16) & 0xff] ^ s_te2[(t2 >> 8) & 0xff] ^ s_te3[t3 & 0xff] ^ rek[48]; + s1 = s_te0[t1 >> 24] ^ s_te1[(t2 >> 16) & 0xff] ^ s_te2[(t3 >> 8) & 0xff] ^ s_te3[t0 & 0xff] ^ rek[49]; + s2 = s_te0[t2 >> 24] ^ s_te1[(t3 >> 16) & 0xff] ^ s_te2[(t0 >> 8) & 0xff] ^ s_te3[t1 & 0xff] ^ rek[50]; + s3 = s_te0[t3 >> 24] ^ s_te1[(t0 >> 16) & 0xff] ^ s_te2[(t1 >> 8) & 0xff] ^ s_te3[t2 & 0xff] ^ rek[51]; + t0 = s_te0[s0 >> 24] ^ s_te1[(s1 >> 16) & 0xff] ^ s_te2[(s2 >> 8) & 0xff] ^ s_te3[s3 & 0xff] ^ rek[52]; + t1 = s_te0[s1 >> 24] ^ s_te1[(s2 >> 16) & 0xff] ^ s_te2[(s3 >> 8) & 0xff] ^ s_te3[s0 & 0xff] ^ rek[53]; + t2 = s_te0[s2 >> 24] ^ s_te1[(s3 >> 16) & 0xff] ^ s_te2[(s0 >> 8) & 0xff] ^ s_te3[s1 & 0xff] ^ rek[54]; + t3 = s_te0[s3 >> 24] ^ s_te1[(s0 >> 16) & 0xff] ^ s_te2[(s1 >> 8) & 0xff] ^ s_te3[s2 & 0xff] ^ rek[55]; + + out[0] = (s_te4[(t0 >> 24) & 0xff] & 0xff000000) + ^ (s_te4[(t1 >> 16) & 0xff] & 0x00ff0000) + ^ (s_te4[(t2 >> 8) & 0xff] & 0x0000ff00) + ^ (s_te4[(t3 >> 0) & 0xff] & 0x000000ff) + ^ rek[56]; + + out[1] = (s_te4[(t1 >> 24) & 0xff] & 0xff000000) + ^ (s_te4[(t2 >> 16) & 0xff] & 0x00ff0000) + ^ (s_te4[(t3 >> 8) & 0xff] & 0x0000ff00) + ^ (s_te4[(t0 >> 0) & 0xff] & 0x000000ff) + ^ rek[57]; + + out[2] = (s_te4[(t2 >> 24) & 0xff] & 0xff000000) + ^ (s_te4[(t3 >> 16) & 0xff] & 0x00ff0000) + ^ (s_te4[(t0 >> 8) & 0xff] & 0x0000ff00) + ^ (s_te4[(t1 >> 0) & 0xff] & 0x000000ff) + ^ rek[58]; + + out[3] = (s_te4[(t3 >> 24) & 0xff] & 0xff000000) + ^ (s_te4[(t0 >> 16) & 0xff] & 0x00ff0000) + ^ (s_te4[(t1 >> 8) & 0xff] & 0x0000ff00) + ^ (s_te4[(t2 >> 0) & 0xff] & 0x000000ff) + ^ rek[59]; +} + +__constant u64 k_sha512[80] = +{ + SHA512C00, SHA512C01, SHA512C02, SHA512C03, + SHA512C04, SHA512C05, SHA512C06, SHA512C07, + SHA512C08, SHA512C09, SHA512C0a, SHA512C0b, + SHA512C0c, SHA512C0d, SHA512C0e, SHA512C0f, + SHA512C10, SHA512C11, SHA512C12, SHA512C13, + SHA512C14, SHA512C15, SHA512C16, SHA512C17, + SHA512C18, SHA512C19, SHA512C1a, SHA512C1b, + SHA512C1c, SHA512C1d, SHA512C1e, SHA512C1f, + SHA512C20, SHA512C21, SHA512C22, SHA512C23, + SHA512C24, SHA512C25, SHA512C26, SHA512C27, + SHA512C28, SHA512C29, SHA512C2a, SHA512C2b, + SHA512C2c, SHA512C2d, SHA512C2e, SHA512C2f, + SHA512C30, SHA512C31, SHA512C32, SHA512C33, + SHA512C34, SHA512C35, SHA512C36, SHA512C37, + SHA512C38, SHA512C39, SHA512C3a, SHA512C3b, + SHA512C3c, SHA512C3d, SHA512C3e, SHA512C3f, + SHA512C40, SHA512C41, SHA512C42, SHA512C43, + SHA512C44, SHA512C45, SHA512C46, SHA512C47, + SHA512C48, SHA512C49, SHA512C4a, SHA512C4b, + SHA512C4c, SHA512C4d, SHA512C4e, SHA512C4f, +}; + +static void sha512_transform (volatile const u64 w0[4], volatile const u64 w1[4], volatile const u64 w2[4], volatile const u64 w3[4], volatile u64 dgst[8]) +{ + u64 a = dgst[0]; + u64 b = dgst[1]; + u64 c = dgst[2]; + u64 d = dgst[3]; + u64 e = dgst[4]; + u64 f = dgst[5]; + u64 g = dgst[6]; + u64 h = dgst[7]; + + u64 w0_t = w0[0]; + u64 w1_t = w0[1]; + u64 w2_t = w0[2]; + u64 w3_t = w0[3]; + u64 w4_t = w1[0]; + u64 w5_t = w1[1]; + u64 w6_t = w1[2]; + u64 w7_t = w1[3]; + u64 w8_t = w2[0]; + u64 w9_t = w2[1]; + u64 wa_t = w2[2]; + u64 wb_t = w2[3]; + u64 wc_t = w3[0]; + u64 wd_t = w3[1]; + u64 we_t = w3[2]; + u64 wf_t = w3[3]; + + #define ROUND_EXPAND() \ + { \ + w0_t = SHA512_EXPAND (we_t, w9_t, w1_t, w0_t); \ + w1_t = SHA512_EXPAND (wf_t, wa_t, w2_t, w1_t); \ + w2_t = SHA512_EXPAND (w0_t, wb_t, w3_t, w2_t); \ + w3_t = SHA512_EXPAND (w1_t, wc_t, w4_t, w3_t); \ + w4_t = SHA512_EXPAND (w2_t, wd_t, w5_t, w4_t); \ + w5_t = SHA512_EXPAND (w3_t, we_t, w6_t, w5_t); \ + w6_t = SHA512_EXPAND (w4_t, wf_t, w7_t, w6_t); \ + w7_t = SHA512_EXPAND (w5_t, w0_t, w8_t, w7_t); \ + w8_t = SHA512_EXPAND (w6_t, w1_t, w9_t, w8_t); \ + w9_t = SHA512_EXPAND (w7_t, w2_t, wa_t, w9_t); \ + wa_t = SHA512_EXPAND (w8_t, w3_t, wb_t, wa_t); \ + wb_t = SHA512_EXPAND (w9_t, w4_t, wc_t, wb_t); \ + wc_t = SHA512_EXPAND (wa_t, w5_t, wd_t, wc_t); \ + wd_t = SHA512_EXPAND (wb_t, w6_t, we_t, wd_t); \ + we_t = SHA512_EXPAND (wc_t, w7_t, wf_t, we_t); \ + wf_t = SHA512_EXPAND (wd_t, w8_t, w0_t, wf_t); \ + } + + #define ROUND_STEP(i) \ + { \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, a, b, c, d, e, f, g, h, w0_t, k_sha512[i + 0]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, h, a, b, c, d, e, f, g, w1_t, k_sha512[i + 1]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, g, h, a, b, c, d, e, f, w2_t, k_sha512[i + 2]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, f, g, h, a, b, c, d, e, w3_t, k_sha512[i + 3]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, e, f, g, h, a, b, c, d, w4_t, k_sha512[i + 4]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, d, e, f, g, h, a, b, c, w5_t, k_sha512[i + 5]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, c, d, e, f, g, h, a, b, w6_t, k_sha512[i + 6]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, b, c, d, e, f, g, h, a, w7_t, k_sha512[i + 7]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, a, b, c, d, e, f, g, h, w8_t, k_sha512[i + 8]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, h, a, b, c, d, e, f, g, w9_t, k_sha512[i + 9]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, g, h, a, b, c, d, e, f, wa_t, k_sha512[i + 10]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, f, g, h, a, b, c, d, e, wb_t, k_sha512[i + 11]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, e, f, g, h, a, b, c, d, wc_t, k_sha512[i + 12]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, d, e, f, g, h, a, b, c, wd_t, k_sha512[i + 13]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, c, d, e, f, g, h, a, b, we_t, k_sha512[i + 14]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, b, c, d, e, f, g, h, a, wf_t, k_sha512[i + 15]); \ + } + + ROUND_STEP (0); + + #pragma unroll + for (int i = 16; i < 80; i += 16) + { + ROUND_EXPAND (); ROUND_STEP (i); + } + + dgst[0] += a; + dgst[1] += b; + dgst[2] += c; + dgst[3] += d; + dgst[4] += e; + dgst[5] += f; + dgst[6] += g; + dgst[7] += h; +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m09600_init (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global office2013_tmp_t *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global office2013_t *office2013_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = pws[gid].i[ 8]; + w2[1] = pws[gid].i[ 9]; + w2[2] = pws[gid].i[10]; + w2[3] = pws[gid].i[11]; + + u32x w3[4]; + + w3[0] = pws[gid].i[12]; + w3[1] = pws[gid].i[13]; + w3[2] = pws[gid].i[14]; + w3[3] = pws[gid].i[15]; + + u32 pw_len = pws[gid].pw_len; + + append_0x80_4 (w0, w1, w2, w3, pw_len); + + make_unicode (w1, w2, w3); + make_unicode (w0, w0, w1); + + /** + * salt + */ + + u32 salt_len = salt_bufs[salt_pos].salt_len; + + u32 salt_buf[4]; + + salt_buf[0] = salt_bufs[salt_pos].salt_buf[0]; + salt_buf[1] = salt_bufs[salt_pos].salt_buf[1]; + salt_buf[2] = salt_bufs[salt_pos].salt_buf[2]; + salt_buf[3] = salt_bufs[salt_pos].salt_buf[3]; + + /** + * init + */ + + u64x t0[4]; + + t0[0] = (u64) salt_buf[0] << 32 | salt_buf[1]; + t0[1] = (u64) salt_buf[2] << 32 | salt_buf[3]; + t0[2] = (u64) swap_workaround (w0[0]) << 32 | swap_workaround (w0[1]); + t0[3] = (u64) swap_workaround (w0[2]) << 32 | swap_workaround (w0[3]); + + u64x t1[4]; + + t1[0] = (u64) swap_workaround (w1[0]) << 32 | swap_workaround (w1[1]); + t1[1] = (u64) swap_workaround (w1[2]) << 32 | swap_workaround (w1[3]); + t1[2] = (u64) swap_workaround (w2[0]) << 32 | swap_workaround (w2[1]); + t1[3] = (u64) swap_workaround (w2[2]) << 32 | swap_workaround (w2[3]); + + u64x t2[4]; + + t2[0] = (u64) swap_workaround (w3[0]) << 32 | swap_workaround (w3[1]); + t2[1] = (u64) swap_workaround (w3[2]) << 32 | swap_workaround (w3[3]); + t2[2] = 0; + t2[3] = 0; + + u64x t3[4]; + + t3[0] = 0; + t3[1] = 0; + t3[2] = 0; + t3[3] = (salt_len + (pw_len * 2)) * 8; + + u64x digest[8]; + + digest[0] = SHA512M_A; + digest[1] = SHA512M_B; + digest[2] = SHA512M_C; + digest[3] = SHA512M_D; + digest[4] = SHA512M_E; + digest[5] = SHA512M_F; + digest[6] = SHA512M_G; + digest[7] = SHA512M_H; + + sha512_transform (t0, t1, t2, t3, digest); + + tmps[gid].out[0] = digest[0]; + tmps[gid].out[1] = digest[1]; + tmps[gid].out[2] = digest[2]; + tmps[gid].out[3] = digest[3]; + tmps[gid].out[4] = digest[4]; + tmps[gid].out[5] = digest[5]; + tmps[gid].out[6] = digest[6]; + tmps[gid].out[7] = digest[7]; +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m09600_loop (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global office2013_tmp_t *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global office2013_t *office2013_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u64x w0[4]; + + w0[0] = tmps[gid].out[0] >> 32; + w0[1] = tmps[gid].out[0] << 32 | tmps[gid].out[1] >> 32; + w0[2] = tmps[gid].out[1] << 32 | tmps[gid].out[2] >> 32; + w0[3] = tmps[gid].out[2] << 32 | tmps[gid].out[3] >> 32; + + u64x w1[4]; + + w1[0] = tmps[gid].out[3] << 32 | tmps[gid].out[4] >> 32; + w1[1] = tmps[gid].out[4] << 32 | tmps[gid].out[5] >> 32; + w1[2] = tmps[gid].out[5] << 32 | tmps[gid].out[6] >> 32; + w1[3] = tmps[gid].out[6] << 32 | tmps[gid].out[7] >> 32; + + u64x w2[4]; + + w2[0] = tmps[gid].out[7] << 32 | 0x80000000; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u64x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = (4 + 64) * 8; + + for (u32 i = 0, j = loop_pos; i < loop_cnt; i++, j++) + { + w0[0] = (u64) swap_workaround (j) << 32 | w0[0] & 0xffffffff; + + u64x digest[8]; + + digest[0] = SHA512M_A; + digest[1] = SHA512M_B; + digest[2] = SHA512M_C; + digest[3] = SHA512M_D; + digest[4] = SHA512M_E; + digest[5] = SHA512M_F; + digest[6] = SHA512M_G; + digest[7] = SHA512M_H; + + sha512_transform (w0, w1, w2, w3, digest); + + w0[0] = digest[0] >> 32; + w0[1] = digest[0] << 32 | digest[1] >> 32; + w0[2] = digest[1] << 32 | digest[2] >> 32; + w0[3] = digest[2] << 32 | digest[3] >> 32; + w1[0] = digest[3] << 32 | digest[4] >> 32; + w1[1] = digest[4] << 32 | digest[5] >> 32; + w1[2] = digest[5] << 32 | digest[6] >> 32; + w1[3] = digest[6] << 32 | digest[7] >> 32; + w2[0] = digest[7] << 32 | 0x80000000; + } + + tmps[gid].out[0] = w0[0] << 32 | w0[1] >> 32; + tmps[gid].out[1] = w0[1] << 32 | w0[2] >> 32; + tmps[gid].out[2] = w0[2] << 32 | w0[3] >> 32; + tmps[gid].out[3] = w0[3] << 32 | w1[0] >> 32; + tmps[gid].out[4] = w1[0] << 32 | w1[1] >> 32; + tmps[gid].out[5] = w1[1] << 32 | w1[2] >> 32; + tmps[gid].out[6] = w1[2] << 32 | w1[3] >> 32; + tmps[gid].out[7] = w1[3] << 32 | w2[0] >> 32; +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m09600_comp (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global office2013_tmp_t *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global office2013_t *office2013_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + const u32 gid = get_global_id (0); + const u32 lid = get_local_id (0); + + /** + * aes shared + */ + + const u32 lid4 = lid * 4; + + __local u32 s_td0[256]; + __local u32 s_td1[256]; + __local u32 s_td2[256]; + __local u32 s_td3[256]; + __local u32 s_td4[256]; + + __local u32 s_te0[256]; + __local u32 s_te1[256]; + __local u32 s_te2[256]; + __local u32 s_te3[256]; + __local u32 s_te4[256]; + + s_td0[lid4 + 0] = td0[lid4 + 0]; + s_td0[lid4 + 1] = td0[lid4 + 1]; + s_td0[lid4 + 2] = td0[lid4 + 2]; + s_td0[lid4 + 3] = td0[lid4 + 3]; + + s_td1[lid4 + 0] = td1[lid4 + 0]; + s_td1[lid4 + 1] = td1[lid4 + 1]; + s_td1[lid4 + 2] = td1[lid4 + 2]; + s_td1[lid4 + 3] = td1[lid4 + 3]; + + s_td2[lid4 + 0] = td2[lid4 + 0]; + s_td2[lid4 + 1] = td2[lid4 + 1]; + s_td2[lid4 + 2] = td2[lid4 + 2]; + s_td2[lid4 + 3] = td2[lid4 + 3]; + + s_td3[lid4 + 0] = td3[lid4 + 0]; + s_td3[lid4 + 1] = td3[lid4 + 1]; + s_td3[lid4 + 2] = td3[lid4 + 2]; + s_td3[lid4 + 3] = td3[lid4 + 3]; + + s_td4[lid4 + 0] = td4[lid4 + 0]; + s_td4[lid4 + 1] = td4[lid4 + 1]; + s_td4[lid4 + 2] = td4[lid4 + 2]; + s_td4[lid4 + 3] = td4[lid4 + 3]; + + s_te0[lid4 + 0] = te0[lid4 + 0]; + s_te0[lid4 + 1] = te0[lid4 + 1]; + s_te0[lid4 + 2] = te0[lid4 + 2]; + s_te0[lid4 + 3] = te0[lid4 + 3]; + + s_te1[lid4 + 0] = te1[lid4 + 0]; + s_te1[lid4 + 1] = te1[lid4 + 1]; + s_te1[lid4 + 2] = te1[lid4 + 2]; + s_te1[lid4 + 3] = te1[lid4 + 3]; + + s_te2[lid4 + 0] = te2[lid4 + 0]; + s_te2[lid4 + 1] = te2[lid4 + 1]; + s_te2[lid4 + 2] = te2[lid4 + 2]; + s_te2[lid4 + 3] = te2[lid4 + 3]; + + s_te3[lid4 + 0] = te3[lid4 + 0]; + s_te3[lid4 + 1] = te3[lid4 + 1]; + s_te3[lid4 + 2] = te3[lid4 + 2]; + s_te3[lid4 + 3] = te3[lid4 + 3]; + + s_te4[lid4 + 0] = te4[lid4 + 0]; + s_te4[lid4 + 1] = te4[lid4 + 1]; + s_te4[lid4 + 2] = te4[lid4 + 2]; + s_te4[lid4 + 3] = te4[lid4 + 3]; + + barrier (CLK_LOCAL_MEM_FENCE); + + if (gid >= gid_max) return; + + u32x encryptedVerifierHashInputBlockKey[2] = { 0xfea7d276, 0x3b4b9e79 }; + u32x encryptedVerifierHashValueBlockKey[2] = { 0xd7aa0f6d, 0x3061344e }; + + u64x w0[4]; + u64x w1[4]; + u64x w2[4]; + u64x w3[4]; + + w0[0] = tmps[gid].out[0]; + w0[1] = tmps[gid].out[1]; + w0[2] = tmps[gid].out[2]; + w0[3] = tmps[gid].out[3]; + w1[0] = tmps[gid].out[4]; + w1[1] = tmps[gid].out[5]; + w1[2] = tmps[gid].out[6]; + w1[3] = tmps[gid].out[7]; + w2[0] = hl32_to_64 (encryptedVerifierHashInputBlockKey[0], encryptedVerifierHashInputBlockKey[1]); + w2[1] = 0x8000000000000000; + w2[2] = 0; + w2[3] = 0; + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = (64 + 8) * 8; + + u64x digest0[8]; + + digest0[0] = SHA512M_A; + digest0[1] = SHA512M_B; + digest0[2] = SHA512M_C; + digest0[3] = SHA512M_D; + digest0[4] = SHA512M_E; + digest0[5] = SHA512M_F; + digest0[6] = SHA512M_G; + digest0[7] = SHA512M_H; + + sha512_transform (w0, w1, w2, w3, digest0); + + w0[0] = tmps[gid].out[0]; + w0[1] = tmps[gid].out[1]; + w0[2] = tmps[gid].out[2]; + w0[3] = tmps[gid].out[3]; + w1[0] = tmps[gid].out[4]; + w1[1] = tmps[gid].out[5]; + w1[2] = tmps[gid].out[6]; + w1[3] = tmps[gid].out[7]; + w2[0] = hl32_to_64 (encryptedVerifierHashValueBlockKey[0], encryptedVerifierHashValueBlockKey[1]); + w2[1] = 0x8000000000000000; + w2[2] = 0; + w2[3] = 0; + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = (64 + 8) * 8; + + u64x digest1[8]; + + digest1[0] = SHA512M_A; + digest1[1] = SHA512M_B; + digest1[2] = SHA512M_C; + digest1[3] = SHA512M_D; + digest1[4] = SHA512M_E; + digest1[5] = SHA512M_F; + digest1[6] = SHA512M_G; + digest1[7] = SHA512M_H; + + sha512_transform (w0, w1, w2, w3, digest1); + + // now we got the AES key, decrypt the verifier + + u32x rek[60]; + u32x rdk[60]; + + u32 data[4]; + + data[0] = office2013_bufs[salt_pos].encryptedVerifier[0]; + data[1] = office2013_bufs[salt_pos].encryptedVerifier[1]; + data[2] = office2013_bufs[salt_pos].encryptedVerifier[2]; + data[3] = office2013_bufs[salt_pos].encryptedVerifier[3]; + + u32x ukeyx[8]; + + ukeyx[0] = h32_from_64 (digest0[0]); + ukeyx[1] = l32_from_64 (digest0[0]); + ukeyx[2] = h32_from_64 (digest0[1]); + ukeyx[3] = l32_from_64 (digest0[1]); + ukeyx[4] = h32_from_64 (digest0[2]); + ukeyx[5] = l32_from_64 (digest0[2]); + ukeyx[6] = h32_from_64 (digest0[3]); + ukeyx[7] = l32_from_64 (digest0[3]); + + AES256_ExpandKey (ukeyx, rek, s_te0, s_te1, s_te2, s_te3, s_te4); + + for (u32 i = 0; i < 60; i++) rdk[i] = rek[i]; + + AES256_InvertKey (rdk, s_td0, s_td1, s_td2, s_td3, s_td4, s_te0, s_te1, s_te2, s_te3, s_te4); + + u32 out[4]; + + AES256_decrypt (data, out, rdk, s_td0, s_td1, s_td2, s_td3, s_td4); + + out[0] ^= salt_bufs[salt_pos].salt_buf[0]; + out[1] ^= salt_bufs[salt_pos].salt_buf[1]; + out[2] ^= salt_bufs[salt_pos].salt_buf[2]; + out[3] ^= salt_bufs[salt_pos].salt_buf[3]; + + // final sha512 + + w0[0] = hl32_to_64 (out[0], out[1]); + w0[1] = hl32_to_64 (out[2], out[3]); + w0[2] = 0x8000000000000000; + w0[3] = 0; + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 16 * 8; + + u64x digest[8]; + + digest[0] = SHA512M_A; + digest[1] = SHA512M_B; + digest[2] = SHA512M_C; + digest[3] = SHA512M_D; + digest[4] = SHA512M_E; + digest[5] = SHA512M_F; + digest[6] = SHA512M_G; + digest[7] = SHA512M_H; + + sha512_transform (w0, w1, w2, w3, digest); + + // encrypt with 2nd key + + ukeyx[0] = h32_from_64 (digest1[0]); + ukeyx[1] = l32_from_64 (digest1[0]); + ukeyx[2] = h32_from_64 (digest1[1]); + ukeyx[3] = l32_from_64 (digest1[1]); + ukeyx[4] = h32_from_64 (digest1[2]); + ukeyx[5] = l32_from_64 (digest1[2]); + ukeyx[6] = h32_from_64 (digest1[3]); + ukeyx[7] = l32_from_64 (digest1[3]); + + AES256_ExpandKey (ukeyx, rek, s_te0, s_te1, s_te2, s_te3, s_te4); + + data[0] = h32_from_64 (digest[0]) ^ salt_bufs[salt_pos].salt_buf[0]; + data[1] = l32_from_64 (digest[0]) ^ salt_bufs[salt_pos].salt_buf[1]; + data[2] = h32_from_64 (digest[1]) ^ salt_bufs[salt_pos].salt_buf[2]; + data[3] = l32_from_64 (digest[1]) ^ salt_bufs[salt_pos].salt_buf[3]; + + AES256_encrypt (data, out, rek, s_te0, s_te1, s_te2, s_te3, s_te4); + + const u32x r0 = out[0]; + const u32x r1 = out[1]; + const u32x r2 = out[2]; + const u32x r3 = out[3]; + + #define il_pos 0 + + #include VECT_COMPARE_M +} diff --git a/amd/m09700_a0.cl b/amd/m09700_a0.cl new file mode 100644 index 0000000000..4a44ac2576 --- /dev/null +++ b/amd/m09700_a0.cl @@ -0,0 +1,1051 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _OLDOFFICE01_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW4 +#define VECT_SIZE1 +#endif + +#ifdef VLIW5 +#define VECT_SIZE1 +#endif + +#define DGST_R0 0 +#define DGST_R1 1 +#define DGST_R2 2 +#define DGST_R3 3 + +#include "include/kernel_functions.c" +#include "types_amd.c" +#include "common_amd.c" +#include "include/rp_gpu.h" +#include "rp_amd.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +typedef struct +{ + u8 S[256]; + + u32 wtf_its_faster; + +} RC4_KEY; + +static void swap (__local RC4_KEY *rc4_key, const u8 i, const u8 j) +{ + u8 tmp; + + tmp = rc4_key->S[i]; + rc4_key->S[i] = rc4_key->S[j]; + rc4_key->S[j] = tmp; +} + +static void rc4_init_16 (__local RC4_KEY *rc4_key, const u32 data[4]) +{ + u32 v = 0x03020100; + u32 a = 0x04040404; + + __local u32 *ptr = (__local u32 *) rc4_key->S; + + #pragma unroll + for (u32 i = 0; i < 64; i++) + { + *ptr++ = v; v += a; + } + + u32 j = 0; + + #pragma unroll + for (u32 i = 0; i < 16; i++) + { + u32 idx = i * 16; + + u32 v; + + v = data[0]; + + j += rc4_key->S[idx] + (v >> 0); swap (rc4_key, idx, j); idx++; + j += rc4_key->S[idx] + (v >> 8); swap (rc4_key, idx, j); idx++; + j += rc4_key->S[idx] + (v >> 16); swap (rc4_key, idx, j); idx++; + j += rc4_key->S[idx] + (v >> 24); swap (rc4_key, idx, j); idx++; + + v = data[1]; + + j += rc4_key->S[idx] + (v >> 0); swap (rc4_key, idx, j); idx++; + j += rc4_key->S[idx] + (v >> 8); swap (rc4_key, idx, j); idx++; + j += rc4_key->S[idx] + (v >> 16); swap (rc4_key, idx, j); idx++; + j += rc4_key->S[idx] + (v >> 24); swap (rc4_key, idx, j); idx++; + + v = data[2]; + + j += rc4_key->S[idx] + (v >> 0); swap (rc4_key, idx, j); idx++; + j += rc4_key->S[idx] + (v >> 8); swap (rc4_key, idx, j); idx++; + j += rc4_key->S[idx] + (v >> 16); swap (rc4_key, idx, j); idx++; + j += rc4_key->S[idx] + (v >> 24); swap (rc4_key, idx, j); idx++; + + v = data[3]; + + j += rc4_key->S[idx] + (v >> 0); swap (rc4_key, idx, j); idx++; + j += rc4_key->S[idx] + (v >> 8); swap (rc4_key, idx, j); idx++; + j += rc4_key->S[idx] + (v >> 16); swap (rc4_key, idx, j); idx++; + j += rc4_key->S[idx] + (v >> 24); swap (rc4_key, idx, j); idx++; + } +} + +static u8 rc4_next_16 (__local RC4_KEY *rc4_key, u8 i, u8 j, const u32 in[4], u32 out[4]) +{ + #pragma unroll + for (u32 k = 0; k < 4; k++) + { + u32 xor4 = 0; + + u8 idx; + + i += 1; + j += rc4_key->S[i]; + + swap (rc4_key, i, j); + + idx = rc4_key->S[i] + rc4_key->S[j]; + + xor4 |= rc4_key->S[idx] << 0; + + i += 1; + j += rc4_key->S[i]; + + swap (rc4_key, i, j); + + idx = rc4_key->S[i] + rc4_key->S[j]; + + xor4 |= rc4_key->S[idx] << 8; + + i += 1; + j += rc4_key->S[i]; + + swap (rc4_key, i, j); + + idx = rc4_key->S[i] + rc4_key->S[j]; + + xor4 |= rc4_key->S[idx] << 16; + + i += 1; + j += rc4_key->S[i]; + + swap (rc4_key, i, j); + + idx = rc4_key->S[i] + rc4_key->S[j]; + + xor4 |= rc4_key->S[idx] << 24; + + out[k] = in[k] ^ xor4; + } + + return j; +} + +static void md5_transform (const u32x w0[4], const u32x w1[4], const u32x w2[4], const u32x w3[4], u32x digest[4]) +{ + u32x a = digest[0]; + u32x b = digest[1]; + u32x c = digest[2]; + u32x d = digest[3]; + + u32x w0_t = w0[0]; + u32x w1_t = w0[1]; + u32x w2_t = w0[2]; + u32x w3_t = w0[3]; + u32x w4_t = w1[0]; + u32x w5_t = w1[1]; + u32x w6_t = w1[2]; + u32x w7_t = w1[3]; + u32x w8_t = w2[0]; + u32x w9_t = w2[1]; + u32x wa_t = w2[2]; + u32x wb_t = w2[3]; + u32x wc_t = w3[0]; + u32x wd_t = w3[1]; + u32x we_t = w3[2]; + u32x wf_t = w3[3]; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t, MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t, MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t, MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t, MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w4_t, MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w5_t, MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w6_t, MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w7_t, MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w8_t, MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w9_t, MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, wa_t, MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, wb_t, MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, wc_t, MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, wd_t, MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, we_t, MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, wf_t, MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w1_t, MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w6_t, MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, wb_t, MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t, MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w5_t, MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, wa_t, MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, wf_t, MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w4_t, MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w9_t, MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, we_t, MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t, MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w8_t, MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, wd_t, MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t, MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w7_t, MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, wc_t, MD5C1f, MD5S13); + + MD5_STEP (MD5_H , a, b, c, d, w5_t, MD5C20, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w8_t, MD5C21, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, wb_t, MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, we_t, MD5C23, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w1_t, MD5C24, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w4_t, MD5C25, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w7_t, MD5C26, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, wa_t, MD5C27, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, wd_t, MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w0_t, MD5C29, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w3_t, MD5C2a, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w6_t, MD5C2b, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w9_t, MD5C2c, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, wc_t, MD5C2d, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, wf_t, MD5C2e, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w2_t, MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t, MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w7_t, MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, we_t, MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w5_t, MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, wc_t, MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t, MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, wa_t, MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t, MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w8_t, MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, wf_t, MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w6_t, MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, wd_t, MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w4_t, MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, wb_t, MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t, MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w9_t, MD5C3f, MD5S33); + + digest[0] += a; + digest[1] += b; + digest[2] += c; + digest[3] += d; +} + +static void gen336 (u32x digest_pre[4], u32 salt_buf[4], u32x digest[4]) +{ + u32x digest_t0[2]; + u32x digest_t1[2]; + u32x digest_t2[2]; + u32x digest_t3[2]; + + digest_t0[0] = digest_pre[0]; + digest_t0[1] = digest_pre[1] & 0xff; + + digest_t1[0] = digest_pre[0] << 8; + digest_t1[1] = digest_pre[0] >> 24 | digest_pre[1] << 8; + + digest_t2[0] = digest_pre[0] << 16; + digest_t2[1] = digest_pre[0] >> 16 | digest_pre[1] << 16; + + digest_t3[0] = digest_pre[0] << 24; + digest_t3[1] = digest_pre[0] >> 8 | digest_pre[1] << 24; + + u32 salt_buf_t0[4]; + u32 salt_buf_t1[5]; + u32 salt_buf_t2[5]; + u32 salt_buf_t3[5]; + + salt_buf_t0[0] = salt_buf[0]; + salt_buf_t0[1] = salt_buf[1]; + salt_buf_t0[2] = salt_buf[2]; + salt_buf_t0[3] = salt_buf[3]; + + salt_buf_t1[0] = salt_buf[0] << 8; + salt_buf_t1[1] = salt_buf[0] >> 24 | salt_buf[1] << 8; + salt_buf_t1[2] = salt_buf[1] >> 24 | salt_buf[2] << 8; + salt_buf_t1[3] = salt_buf[2] >> 24 | salt_buf[3] << 8; + salt_buf_t1[4] = salt_buf[3] >> 24; + + salt_buf_t2[0] = salt_buf[0] << 16; + salt_buf_t2[1] = salt_buf[0] >> 16 | salt_buf[1] << 16; + salt_buf_t2[2] = salt_buf[1] >> 16 | salt_buf[2] << 16; + salt_buf_t2[3] = salt_buf[2] >> 16 | salt_buf[3] << 16; + salt_buf_t2[4] = salt_buf[3] >> 16; + + salt_buf_t3[0] = salt_buf[0] << 24; + salt_buf_t3[1] = salt_buf[0] >> 8 | salt_buf[1] << 24; + salt_buf_t3[2] = salt_buf[1] >> 8 | salt_buf[2] << 24; + salt_buf_t3[3] = salt_buf[2] >> 8 | salt_buf[3] << 24; + salt_buf_t3[4] = salt_buf[3] >> 8; + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + // generate the 16 * 21 buffer + + w0_t[0] = 0; + w0_t[1] = 0; + w0_t[2] = 0; + w0_t[3] = 0; + w1_t[0] = 0; + w1_t[1] = 0; + w1_t[2] = 0; + w1_t[3] = 0; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = 0; + + // 0..5 + w0_t[0] = digest_t0[0]; + w0_t[1] = digest_t0[1]; + + // 5..21 + w0_t[1] |= salt_buf_t1[0]; + w0_t[2] = salt_buf_t1[1]; + w0_t[3] = salt_buf_t1[2]; + w1_t[0] = salt_buf_t1[3]; + w1_t[1] = salt_buf_t1[4]; + + // 21..26 + w1_t[1] |= digest_t1[0]; + w1_t[2] = digest_t1[1]; + + // 26..42 + w1_t[2] |= salt_buf_t2[0]; + w1_t[3] = salt_buf_t2[1]; + w2_t[0] = salt_buf_t2[2]; + w2_t[1] = salt_buf_t2[3]; + w2_t[2] = salt_buf_t2[4]; + + // 42..47 + w2_t[2] |= digest_t2[0]; + w2_t[3] = digest_t2[1]; + + // 47..63 + w2_t[3] |= salt_buf_t3[0]; + w3_t[0] = salt_buf_t3[1]; + w3_t[1] = salt_buf_t3[2]; + w3_t[2] = salt_buf_t3[3]; + w3_t[3] = salt_buf_t3[4]; + + // 63.. + + w3_t[3] |= digest_t3[0]; + + md5_transform (w0_t, w1_t, w2_t, w3_t, digest); + + w0_t[0] = 0; + w0_t[1] = 0; + w0_t[2] = 0; + w0_t[3] = 0; + w1_t[0] = 0; + w1_t[1] = 0; + w1_t[2] = 0; + w1_t[3] = 0; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = 0; + + // 0..4 + w0_t[0] = digest_t3[1]; + + // 4..20 + w0_t[1] = salt_buf_t0[0]; + w0_t[2] = salt_buf_t0[1]; + w0_t[3] = salt_buf_t0[2]; + w1_t[0] = salt_buf_t0[3]; + + // 20..25 + w1_t[1] = digest_t0[0]; + w1_t[2] = digest_t0[1]; + + // 25..41 + w1_t[2] |= salt_buf_t1[0]; + w1_t[3] = salt_buf_t1[1]; + w2_t[0] = salt_buf_t1[2]; + w2_t[1] = salt_buf_t1[3]; + w2_t[2] = salt_buf_t1[4]; + + // 41..46 + w2_t[2] |= digest_t1[0]; + w2_t[3] = digest_t1[1]; + + // 46..62 + w2_t[3] |= salt_buf_t2[0]; + w3_t[0] = salt_buf_t2[1]; + w3_t[1] = salt_buf_t2[2]; + w3_t[2] = salt_buf_t2[3]; + w3_t[3] = salt_buf_t2[4]; + + // 62.. + w3_t[3] |= digest_t2[0]; + + md5_transform (w0_t, w1_t, w2_t, w3_t, digest); + + w0_t[0] = 0; + w0_t[1] = 0; + w0_t[2] = 0; + w0_t[3] = 0; + w1_t[0] = 0; + w1_t[1] = 0; + w1_t[2] = 0; + w1_t[3] = 0; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = 0; + + // 0..3 + w0_t[0] = digest_t2[1]; + + // 3..19 + w0_t[0] |= salt_buf_t3[0]; + w0_t[1] = salt_buf_t3[1]; + w0_t[2] = salt_buf_t3[2]; + w0_t[3] = salt_buf_t3[3]; + w1_t[0] = salt_buf_t3[4]; + + // 19..24 + w1_t[0] |= digest_t3[0]; + w1_t[1] = digest_t3[1]; + + // 24..40 + w1_t[2] = salt_buf_t0[0]; + w1_t[3] = salt_buf_t0[1]; + w2_t[0] = salt_buf_t0[2]; + w2_t[1] = salt_buf_t0[3]; + + // 40..45 + w2_t[2] = digest_t0[0]; + w2_t[3] = digest_t0[1]; + + // 45..61 + w2_t[3] |= salt_buf_t1[0]; + w3_t[0] = salt_buf_t1[1]; + w3_t[1] = salt_buf_t1[2]; + w3_t[2] = salt_buf_t1[3]; + w3_t[3] = salt_buf_t1[4]; + + // 61.. + w3_t[3] |= digest_t1[0]; + + md5_transform (w0_t, w1_t, w2_t, w3_t, digest); + + w0_t[0] = 0; + w0_t[1] = 0; + w0_t[2] = 0; + w0_t[3] = 0; + w1_t[0] = 0; + w1_t[1] = 0; + w1_t[2] = 0; + w1_t[3] = 0; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = 0; + + // 0..2 + w0_t[0] = digest_t1[1]; + + // 2..18 + w0_t[0] |= salt_buf_t2[0]; + w0_t[1] = salt_buf_t2[1]; + w0_t[2] = salt_buf_t2[2]; + w0_t[3] = salt_buf_t2[3]; + w1_t[0] = salt_buf_t2[4]; + + // 18..23 + w1_t[0] |= digest_t2[0]; + w1_t[1] = digest_t2[1]; + + // 23..39 + w1_t[1] |= salt_buf_t3[0]; + w1_t[2] = salt_buf_t3[1]; + w1_t[3] = salt_buf_t3[2]; + w2_t[0] = salt_buf_t3[3]; + w2_t[1] = salt_buf_t3[4]; + + // 39..44 + w2_t[1] |= digest_t3[0]; + w2_t[2] = digest_t3[1]; + + // 44..60 + w2_t[3] = salt_buf_t0[0]; + w3_t[0] = salt_buf_t0[1]; + w3_t[1] = salt_buf_t0[2]; + w3_t[2] = salt_buf_t0[3]; + + // 60.. + w3_t[3] = digest_t0[0]; + + md5_transform (w0_t, w1_t, w2_t, w3_t, digest); + + w0_t[0] = 0; + w0_t[1] = 0; + w0_t[2] = 0; + w0_t[3] = 0; + w1_t[0] = 0; + w1_t[1] = 0; + w1_t[2] = 0; + w1_t[3] = 0; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = 0; + + // 0..1 + w0_t[0] = digest_t0[1]; + + // 1..17 + w0_t[0] |= salt_buf_t1[0]; + w0_t[1] = salt_buf_t1[1]; + w0_t[2] = salt_buf_t1[2]; + w0_t[3] = salt_buf_t1[3]; + w1_t[0] = salt_buf_t1[4]; + + // 17..22 + w1_t[0] |= digest_t1[0]; + w1_t[1] = digest_t1[1]; + + // 22..38 + w1_t[1] |= salt_buf_t2[0]; + w1_t[2] = salt_buf_t2[1]; + w1_t[3] = salt_buf_t2[2]; + w2_t[0] = salt_buf_t2[3]; + w2_t[1] = salt_buf_t2[4]; + + // 38..43 + w2_t[1] |= digest_t2[0]; + w2_t[2] = digest_t2[1]; + + // 43..59 + w2_t[2] |= salt_buf_t3[0]; + w2_t[3] = salt_buf_t3[1]; + w3_t[0] = salt_buf_t3[2]; + w3_t[1] = salt_buf_t3[3]; + w3_t[2] = salt_buf_t3[4]; + + // 59.. + w3_t[2] |= digest_t3[0]; + w3_t[3] = digest_t3[1]; + + md5_transform (w0_t, w1_t, w2_t, w3_t, digest); + + w0_t[0] = salt_buf_t0[0]; + w0_t[1] = salt_buf_t0[1]; + w0_t[2] = salt_buf_t0[2]; + w0_t[3] = salt_buf_t0[3]; + w1_t[0] = 0x80; + w1_t[1] = 0; + w1_t[2] = 0; + w1_t[3] = 0; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 21 * 16 * 8; + w3_t[3] = 0; + + md5_transform (w0_t, w1_t, w2_t, w3_t, digest); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m09700_m04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global oldoffice01_t *oldoffice01_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + __local RC4_KEY rc4_keys[64]; + + __local RC4_KEY *rc4_key = &rc4_keys[lid]; + + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + u32x pw_buf1[4]; + + pw_buf1[0] = pws[gid].i[ 4]; + pw_buf1[1] = pws[gid].i[ 5]; + pw_buf1[2] = pws[gid].i[ 6]; + pw_buf1[3] = pws[gid].i[ 7]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * salt + */ + + u32 salt_buf[4]; + + salt_buf[0] = salt_bufs[salt_pos].salt_buf[0]; + salt_buf[1] = salt_bufs[salt_pos].salt_buf[1]; + salt_buf[2] = salt_bufs[salt_pos].salt_buf[2]; + salt_buf[3] = salt_bufs[salt_pos].salt_buf[3]; + + /** + * esalt + */ + + const u32 version = oldoffice01_bufs[salt_pos].version; + + u32 encryptedVerifier[4]; + + encryptedVerifier[0] = oldoffice01_bufs[salt_pos].encryptedVerifier[0]; + encryptedVerifier[1] = oldoffice01_bufs[salt_pos].encryptedVerifier[1]; + encryptedVerifier[2] = oldoffice01_bufs[salt_pos].encryptedVerifier[2]; + encryptedVerifier[3] = oldoffice01_bufs[salt_pos].encryptedVerifier[3]; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + + w0[0] = pw_buf0[0]; + w0[1] = pw_buf0[1]; + w0[2] = pw_buf0[2]; + w0[3] = pw_buf0[3]; + + u32x w1[4]; + + w1[0] = pw_buf1[0]; + w1[1] = pw_buf1[1]; + w1[2] = pw_buf1[2]; + w1[3] = pw_buf1[3]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 out_len = apply_rules (rules_buf[il_pos].cmds, w0, w1, pw_len); + + append_0x80_2 (w0, w1, out_len); + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + make_unicode (w0, w0_t, w1_t); + make_unicode (w1, w2_t, w3_t); + + w3_t[2] = out_len * 8 * 2; + + u32x digest_pre[4]; + + digest_pre[0] = MD5M_A; + digest_pre[1] = MD5M_B; + digest_pre[2] = MD5M_C; + digest_pre[3] = MD5M_D; + + md5_transform (w0_t, w1_t, w2_t, w3_t, digest_pre); + + digest_pre[0] &= 0xffffffff; + digest_pre[1] &= 0x000000ff; + digest_pre[2] &= 0x00000000; + digest_pre[3] &= 0x00000000; + + u32x digest[4]; + + digest[0] = MD5M_A; + digest[1] = MD5M_B; + digest[2] = MD5M_C; + digest[3] = MD5M_D; + + gen336 (digest_pre, salt_buf, digest); + + // now the 40 bit input for the MD5 which then will generate the RC4 key, so it's precomputable! + + w0_t[0] = digest[0]; + w0_t[1] = digest[1] & 0xff; + w0_t[2] = 0x8000; + w0_t[3] = 0; + w1_t[0] = 0; + w1_t[1] = 0; + w1_t[2] = 0; + w1_t[3] = 0; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 9 * 8; + w3_t[3] = 0; + + digest[0] = MD5M_A; + digest[1] = MD5M_B; + digest[2] = MD5M_C; + digest[3] = MD5M_D; + + md5_transform (w0_t, w1_t, w2_t, w3_t, digest); + + // now the RC4 part + + u32x key[4]; + + key[0] = digest[0]; + key[1] = digest[1]; + key[2] = digest[2]; + key[3] = digest[3]; + + rc4_init_16 (rc4_key, key); + + u32x out[4]; + + u8 j = rc4_next_16 (rc4_key, 0, 0, encryptedVerifier, out); + + w0_t[0] = out[0]; + w0_t[1] = out[1]; + w0_t[2] = out[2]; + w0_t[3] = out[3]; + w1_t[0] = 0x80; + w1_t[1] = 0; + w1_t[2] = 0; + w1_t[3] = 0; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 16 * 8; + w3_t[3] = 0; + + digest[0] = MD5M_A; + digest[1] = MD5M_B; + digest[2] = MD5M_C; + digest[3] = MD5M_D; + + md5_transform (w0_t, w1_t, w2_t, w3_t, digest); + + rc4_next_16 (rc4_key, 16, j, digest, out); + + const u32x r0 = out[0]; + const u32x r1 = out[1]; + const u32x r2 = out[2]; + const u32x r3 = out[3]; + + #include VECT_COMPARE_M + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m09700_m08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global oldoffice01_t *oldoffice01_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m09700_m16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global oldoffice01_t *oldoffice01_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m09700_s04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global oldoffice01_t *oldoffice01_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + __local RC4_KEY rc4_keys[64]; + + __local RC4_KEY *rc4_key = &rc4_keys[lid]; + + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + u32x pw_buf1[4]; + + pw_buf1[0] = pws[gid].i[ 4]; + pw_buf1[1] = pws[gid].i[ 5]; + pw_buf1[2] = pws[gid].i[ 6]; + pw_buf1[3] = pws[gid].i[ 7]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * salt + */ + + u32 salt_buf[4]; + + salt_buf[0] = salt_bufs[salt_pos].salt_buf[0]; + salt_buf[1] = salt_bufs[salt_pos].salt_buf[1]; + salt_buf[2] = salt_bufs[salt_pos].salt_buf[2]; + salt_buf[3] = salt_bufs[salt_pos].salt_buf[3]; + + /** + * esalt + */ + + const u32 version = oldoffice01_bufs[salt_pos].version; + + u32 encryptedVerifier[4]; + + encryptedVerifier[0] = oldoffice01_bufs[salt_pos].encryptedVerifier[0]; + encryptedVerifier[1] = oldoffice01_bufs[salt_pos].encryptedVerifier[1]; + encryptedVerifier[2] = oldoffice01_bufs[salt_pos].encryptedVerifier[2]; + encryptedVerifier[3] = oldoffice01_bufs[salt_pos].encryptedVerifier[3]; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + + w0[0] = pw_buf0[0]; + w0[1] = pw_buf0[1]; + w0[2] = pw_buf0[2]; + w0[3] = pw_buf0[3]; + + u32x w1[4]; + + w1[0] = pw_buf1[0]; + w1[1] = pw_buf1[1]; + w1[2] = pw_buf1[2]; + w1[3] = pw_buf1[3]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 out_len = apply_rules (rules_buf[il_pos].cmds, w0, w1, pw_len); + + append_0x80_2 (w0, w1, out_len); + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + make_unicode (w0, w0_t, w1_t); + make_unicode (w1, w2_t, w3_t); + + w3_t[2] = out_len * 8 * 2; + + u32x digest_pre[4]; + + digest_pre[0] = MD5M_A; + digest_pre[1] = MD5M_B; + digest_pre[2] = MD5M_C; + digest_pre[3] = MD5M_D; + + md5_transform (w0_t, w1_t, w2_t, w3_t, digest_pre); + + digest_pre[0] &= 0xffffffff; + digest_pre[1] &= 0x000000ff; + digest_pre[2] &= 0x00000000; + digest_pre[3] &= 0x00000000; + + u32x digest[4]; + + digest[0] = MD5M_A; + digest[1] = MD5M_B; + digest[2] = MD5M_C; + digest[3] = MD5M_D; + + gen336 (digest_pre, salt_buf, digest); + + // now the 40 bit input for the MD5 which then will generate the RC4 key, so it's precomputable! + + w0_t[0] = digest[0]; + w0_t[1] = digest[1] & 0xff; + w0_t[2] = 0x8000; + w0_t[3] = 0; + w1_t[0] = 0; + w1_t[1] = 0; + w1_t[2] = 0; + w1_t[3] = 0; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 9 * 8; + w3_t[3] = 0; + + digest[0] = MD5M_A; + digest[1] = MD5M_B; + digest[2] = MD5M_C; + digest[3] = MD5M_D; + + md5_transform (w0_t, w1_t, w2_t, w3_t, digest); + + // now the RC4 part + + u32x key[4]; + + key[0] = digest[0]; + key[1] = digest[1]; + key[2] = digest[2]; + key[3] = digest[3]; + + rc4_init_16 (rc4_key, key); + + u32x out[4]; + + u8 j = rc4_next_16 (rc4_key, 0, 0, encryptedVerifier, out); + + w0_t[0] = out[0]; + w0_t[1] = out[1]; + w0_t[2] = out[2]; + w0_t[3] = out[3]; + w1_t[0] = 0x80; + w1_t[1] = 0; + w1_t[2] = 0; + w1_t[3] = 0; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 16 * 8; + w3_t[3] = 0; + + digest[0] = MD5M_A; + digest[1] = MD5M_B; + digest[2] = MD5M_C; + digest[3] = MD5M_D; + + md5_transform (w0_t, w1_t, w2_t, w3_t, digest); + + rc4_next_16 (rc4_key, 16, j, digest, out); + + const u32x r0 = out[0]; + const u32x r1 = out[1]; + const u32x r2 = out[2]; + const u32x r3 = out[3]; + + #include VECT_COMPARE_S + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m09700_s08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global oldoffice01_t *oldoffice01_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m09700_s16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global oldoffice01_t *oldoffice01_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/amd/m09700_a1.cl b/amd/m09700_a1.cl new file mode 100644 index 0000000000..93430566d5 --- /dev/null +++ b/amd/m09700_a1.cl @@ -0,0 +1,1169 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _OLDOFFICE01_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW4 +#define VECT_SIZE1 +#endif + +#ifdef VLIW5 +#define VECT_SIZE1 +#endif + +#define DGST_R0 0 +#define DGST_R1 1 +#define DGST_R2 2 +#define DGST_R3 3 + +#include "include/kernel_functions.c" +#include "types_amd.c" +#include "common_amd.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +typedef struct +{ + u8 S[256]; + + u32 wtf_its_faster; + +} RC4_KEY; + +static void swap (__local RC4_KEY *rc4_key, const u8 i, const u8 j) +{ + u8 tmp; + + tmp = rc4_key->S[i]; + rc4_key->S[i] = rc4_key->S[j]; + rc4_key->S[j] = tmp; +} + +static void rc4_init_16 (__local RC4_KEY *rc4_key, const u32 data[4]) +{ + u32 v = 0x03020100; + u32 a = 0x04040404; + + __local u32 *ptr = (__local u32 *) rc4_key->S; + + #pragma unroll + for (u32 i = 0; i < 64; i++) + { + *ptr++ = v; v += a; + } + + u32 j = 0; + + #pragma unroll + for (u32 i = 0; i < 16; i++) + { + u32 idx = i * 16; + + u32 v; + + v = data[0]; + + j += rc4_key->S[idx] + (v >> 0); swap (rc4_key, idx, j); idx++; + j += rc4_key->S[idx] + (v >> 8); swap (rc4_key, idx, j); idx++; + j += rc4_key->S[idx] + (v >> 16); swap (rc4_key, idx, j); idx++; + j += rc4_key->S[idx] + (v >> 24); swap (rc4_key, idx, j); idx++; + + v = data[1]; + + j += rc4_key->S[idx] + (v >> 0); swap (rc4_key, idx, j); idx++; + j += rc4_key->S[idx] + (v >> 8); swap (rc4_key, idx, j); idx++; + j += rc4_key->S[idx] + (v >> 16); swap (rc4_key, idx, j); idx++; + j += rc4_key->S[idx] + (v >> 24); swap (rc4_key, idx, j); idx++; + + v = data[2]; + + j += rc4_key->S[idx] + (v >> 0); swap (rc4_key, idx, j); idx++; + j += rc4_key->S[idx] + (v >> 8); swap (rc4_key, idx, j); idx++; + j += rc4_key->S[idx] + (v >> 16); swap (rc4_key, idx, j); idx++; + j += rc4_key->S[idx] + (v >> 24); swap (rc4_key, idx, j); idx++; + + v = data[3]; + + j += rc4_key->S[idx] + (v >> 0); swap (rc4_key, idx, j); idx++; + j += rc4_key->S[idx] + (v >> 8); swap (rc4_key, idx, j); idx++; + j += rc4_key->S[idx] + (v >> 16); swap (rc4_key, idx, j); idx++; + j += rc4_key->S[idx] + (v >> 24); swap (rc4_key, idx, j); idx++; + } +} + +static u8 rc4_next_16 (__local RC4_KEY *rc4_key, u8 i, u8 j, const u32 in[4], u32 out[4]) +{ + #pragma unroll + for (u32 k = 0; k < 4; k++) + { + u32 xor4 = 0; + + u8 idx; + + i += 1; + j += rc4_key->S[i]; + + swap (rc4_key, i, j); + + idx = rc4_key->S[i] + rc4_key->S[j]; + + xor4 |= rc4_key->S[idx] << 0; + + i += 1; + j += rc4_key->S[i]; + + swap (rc4_key, i, j); + + idx = rc4_key->S[i] + rc4_key->S[j]; + + xor4 |= rc4_key->S[idx] << 8; + + i += 1; + j += rc4_key->S[i]; + + swap (rc4_key, i, j); + + idx = rc4_key->S[i] + rc4_key->S[j]; + + xor4 |= rc4_key->S[idx] << 16; + + i += 1; + j += rc4_key->S[i]; + + swap (rc4_key, i, j); + + idx = rc4_key->S[i] + rc4_key->S[j]; + + xor4 |= rc4_key->S[idx] << 24; + + out[k] = in[k] ^ xor4; + } + + return j; +} + +static void md5_transform (const u32x w0[4], const u32x w1[4], const u32x w2[4], const u32x w3[4], u32x digest[4]) +{ + u32x a = digest[0]; + u32x b = digest[1]; + u32x c = digest[2]; + u32x d = digest[3]; + + u32x w0_t = w0[0]; + u32x w1_t = w0[1]; + u32x w2_t = w0[2]; + u32x w3_t = w0[3]; + u32x w4_t = w1[0]; + u32x w5_t = w1[1]; + u32x w6_t = w1[2]; + u32x w7_t = w1[3]; + u32x w8_t = w2[0]; + u32x w9_t = w2[1]; + u32x wa_t = w2[2]; + u32x wb_t = w2[3]; + u32x wc_t = w3[0]; + u32x wd_t = w3[1]; + u32x we_t = w3[2]; + u32x wf_t = w3[3]; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t, MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t, MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t, MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t, MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w4_t, MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w5_t, MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w6_t, MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w7_t, MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w8_t, MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w9_t, MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, wa_t, MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, wb_t, MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, wc_t, MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, wd_t, MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, we_t, MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, wf_t, MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w1_t, MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w6_t, MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, wb_t, MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t, MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w5_t, MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, wa_t, MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, wf_t, MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w4_t, MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w9_t, MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, we_t, MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t, MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w8_t, MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, wd_t, MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t, MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w7_t, MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, wc_t, MD5C1f, MD5S13); + + MD5_STEP (MD5_H , a, b, c, d, w5_t, MD5C20, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w8_t, MD5C21, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, wb_t, MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, we_t, MD5C23, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w1_t, MD5C24, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w4_t, MD5C25, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w7_t, MD5C26, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, wa_t, MD5C27, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, wd_t, MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w0_t, MD5C29, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w3_t, MD5C2a, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w6_t, MD5C2b, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w9_t, MD5C2c, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, wc_t, MD5C2d, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, wf_t, MD5C2e, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w2_t, MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t, MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w7_t, MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, we_t, MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w5_t, MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, wc_t, MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t, MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, wa_t, MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t, MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w8_t, MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, wf_t, MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w6_t, MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, wd_t, MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w4_t, MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, wb_t, MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t, MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w9_t, MD5C3f, MD5S33); + + digest[0] += a; + digest[1] += b; + digest[2] += c; + digest[3] += d; +} + +static void gen336 (u32x digest_pre[4], u32 salt_buf[4], u32x digest[4]) +{ + u32x digest_t0[2]; + u32x digest_t1[2]; + u32x digest_t2[2]; + u32x digest_t3[2]; + + digest_t0[0] = digest_pre[0]; + digest_t0[1] = digest_pre[1] & 0xff; + + digest_t1[0] = digest_pre[0] << 8; + digest_t1[1] = digest_pre[0] >> 24 | digest_pre[1] << 8; + + digest_t2[0] = digest_pre[0] << 16; + digest_t2[1] = digest_pre[0] >> 16 | digest_pre[1] << 16; + + digest_t3[0] = digest_pre[0] << 24; + digest_t3[1] = digest_pre[0] >> 8 | digest_pre[1] << 24; + + u32 salt_buf_t0[4]; + u32 salt_buf_t1[5]; + u32 salt_buf_t2[5]; + u32 salt_buf_t3[5]; + + salt_buf_t0[0] = salt_buf[0]; + salt_buf_t0[1] = salt_buf[1]; + salt_buf_t0[2] = salt_buf[2]; + salt_buf_t0[3] = salt_buf[3]; + + salt_buf_t1[0] = salt_buf[0] << 8; + salt_buf_t1[1] = salt_buf[0] >> 24 | salt_buf[1] << 8; + salt_buf_t1[2] = salt_buf[1] >> 24 | salt_buf[2] << 8; + salt_buf_t1[3] = salt_buf[2] >> 24 | salt_buf[3] << 8; + salt_buf_t1[4] = salt_buf[3] >> 24; + + salt_buf_t2[0] = salt_buf[0] << 16; + salt_buf_t2[1] = salt_buf[0] >> 16 | salt_buf[1] << 16; + salt_buf_t2[2] = salt_buf[1] >> 16 | salt_buf[2] << 16; + salt_buf_t2[3] = salt_buf[2] >> 16 | salt_buf[3] << 16; + salt_buf_t2[4] = salt_buf[3] >> 16; + + salt_buf_t3[0] = salt_buf[0] << 24; + salt_buf_t3[1] = salt_buf[0] >> 8 | salt_buf[1] << 24; + salt_buf_t3[2] = salt_buf[1] >> 8 | salt_buf[2] << 24; + salt_buf_t3[3] = salt_buf[2] >> 8 | salt_buf[3] << 24; + salt_buf_t3[4] = salt_buf[3] >> 8; + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + // generate the 16 * 21 buffer + + w0_t[0] = 0; + w0_t[1] = 0; + w0_t[2] = 0; + w0_t[3] = 0; + w1_t[0] = 0; + w1_t[1] = 0; + w1_t[2] = 0; + w1_t[3] = 0; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = 0; + + // 0..5 + w0_t[0] = digest_t0[0]; + w0_t[1] = digest_t0[1]; + + // 5..21 + w0_t[1] |= salt_buf_t1[0]; + w0_t[2] = salt_buf_t1[1]; + w0_t[3] = salt_buf_t1[2]; + w1_t[0] = salt_buf_t1[3]; + w1_t[1] = salt_buf_t1[4]; + + // 21..26 + w1_t[1] |= digest_t1[0]; + w1_t[2] = digest_t1[1]; + + // 26..42 + w1_t[2] |= salt_buf_t2[0]; + w1_t[3] = salt_buf_t2[1]; + w2_t[0] = salt_buf_t2[2]; + w2_t[1] = salt_buf_t2[3]; + w2_t[2] = salt_buf_t2[4]; + + // 42..47 + w2_t[2] |= digest_t2[0]; + w2_t[3] = digest_t2[1]; + + // 47..63 + w2_t[3] |= salt_buf_t3[0]; + w3_t[0] = salt_buf_t3[1]; + w3_t[1] = salt_buf_t3[2]; + w3_t[2] = salt_buf_t3[3]; + w3_t[3] = salt_buf_t3[4]; + + // 63.. + + w3_t[3] |= digest_t3[0]; + + md5_transform (w0_t, w1_t, w2_t, w3_t, digest); + + w0_t[0] = 0; + w0_t[1] = 0; + w0_t[2] = 0; + w0_t[3] = 0; + w1_t[0] = 0; + w1_t[1] = 0; + w1_t[2] = 0; + w1_t[3] = 0; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = 0; + + // 0..4 + w0_t[0] = digest_t3[1]; + + // 4..20 + w0_t[1] = salt_buf_t0[0]; + w0_t[2] = salt_buf_t0[1]; + w0_t[3] = salt_buf_t0[2]; + w1_t[0] = salt_buf_t0[3]; + + // 20..25 + w1_t[1] = digest_t0[0]; + w1_t[2] = digest_t0[1]; + + // 25..41 + w1_t[2] |= salt_buf_t1[0]; + w1_t[3] = salt_buf_t1[1]; + w2_t[0] = salt_buf_t1[2]; + w2_t[1] = salt_buf_t1[3]; + w2_t[2] = salt_buf_t1[4]; + + // 41..46 + w2_t[2] |= digest_t1[0]; + w2_t[3] = digest_t1[1]; + + // 46..62 + w2_t[3] |= salt_buf_t2[0]; + w3_t[0] = salt_buf_t2[1]; + w3_t[1] = salt_buf_t2[2]; + w3_t[2] = salt_buf_t2[3]; + w3_t[3] = salt_buf_t2[4]; + + // 62.. + w3_t[3] |= digest_t2[0]; + + md5_transform (w0_t, w1_t, w2_t, w3_t, digest); + + w0_t[0] = 0; + w0_t[1] = 0; + w0_t[2] = 0; + w0_t[3] = 0; + w1_t[0] = 0; + w1_t[1] = 0; + w1_t[2] = 0; + w1_t[3] = 0; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = 0; + + // 0..3 + w0_t[0] = digest_t2[1]; + + // 3..19 + w0_t[0] |= salt_buf_t3[0]; + w0_t[1] = salt_buf_t3[1]; + w0_t[2] = salt_buf_t3[2]; + w0_t[3] = salt_buf_t3[3]; + w1_t[0] = salt_buf_t3[4]; + + // 19..24 + w1_t[0] |= digest_t3[0]; + w1_t[1] = digest_t3[1]; + + // 24..40 + w1_t[2] = salt_buf_t0[0]; + w1_t[3] = salt_buf_t0[1]; + w2_t[0] = salt_buf_t0[2]; + w2_t[1] = salt_buf_t0[3]; + + // 40..45 + w2_t[2] = digest_t0[0]; + w2_t[3] = digest_t0[1]; + + // 45..61 + w2_t[3] |= salt_buf_t1[0]; + w3_t[0] = salt_buf_t1[1]; + w3_t[1] = salt_buf_t1[2]; + w3_t[2] = salt_buf_t1[3]; + w3_t[3] = salt_buf_t1[4]; + + // 61.. + w3_t[3] |= digest_t1[0]; + + md5_transform (w0_t, w1_t, w2_t, w3_t, digest); + + w0_t[0] = 0; + w0_t[1] = 0; + w0_t[2] = 0; + w0_t[3] = 0; + w1_t[0] = 0; + w1_t[1] = 0; + w1_t[2] = 0; + w1_t[3] = 0; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = 0; + + // 0..2 + w0_t[0] = digest_t1[1]; + + // 2..18 + w0_t[0] |= salt_buf_t2[0]; + w0_t[1] = salt_buf_t2[1]; + w0_t[2] = salt_buf_t2[2]; + w0_t[3] = salt_buf_t2[3]; + w1_t[0] = salt_buf_t2[4]; + + // 18..23 + w1_t[0] |= digest_t2[0]; + w1_t[1] = digest_t2[1]; + + // 23..39 + w1_t[1] |= salt_buf_t3[0]; + w1_t[2] = salt_buf_t3[1]; + w1_t[3] = salt_buf_t3[2]; + w2_t[0] = salt_buf_t3[3]; + w2_t[1] = salt_buf_t3[4]; + + // 39..44 + w2_t[1] |= digest_t3[0]; + w2_t[2] = digest_t3[1]; + + // 44..60 + w2_t[3] = salt_buf_t0[0]; + w3_t[0] = salt_buf_t0[1]; + w3_t[1] = salt_buf_t0[2]; + w3_t[2] = salt_buf_t0[3]; + + // 60.. + w3_t[3] = digest_t0[0]; + + md5_transform (w0_t, w1_t, w2_t, w3_t, digest); + + w0_t[0] = 0; + w0_t[1] = 0; + w0_t[2] = 0; + w0_t[3] = 0; + w1_t[0] = 0; + w1_t[1] = 0; + w1_t[2] = 0; + w1_t[3] = 0; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = 0; + + // 0..1 + w0_t[0] = digest_t0[1]; + + // 1..17 + w0_t[0] |= salt_buf_t1[0]; + w0_t[1] = salt_buf_t1[1]; + w0_t[2] = salt_buf_t1[2]; + w0_t[3] = salt_buf_t1[3]; + w1_t[0] = salt_buf_t1[4]; + + // 17..22 + w1_t[0] |= digest_t1[0]; + w1_t[1] = digest_t1[1]; + + // 22..38 + w1_t[1] |= salt_buf_t2[0]; + w1_t[2] = salt_buf_t2[1]; + w1_t[3] = salt_buf_t2[2]; + w2_t[0] = salt_buf_t2[3]; + w2_t[1] = salt_buf_t2[4]; + + // 38..43 + w2_t[1] |= digest_t2[0]; + w2_t[2] = digest_t2[1]; + + // 43..59 + w2_t[2] |= salt_buf_t3[0]; + w2_t[3] = salt_buf_t3[1]; + w3_t[0] = salt_buf_t3[2]; + w3_t[1] = salt_buf_t3[3]; + w3_t[2] = salt_buf_t3[4]; + + // 59.. + w3_t[2] |= digest_t3[0]; + w3_t[3] = digest_t3[1]; + + md5_transform (w0_t, w1_t, w2_t, w3_t, digest); + + w0_t[0] = salt_buf_t0[0]; + w0_t[1] = salt_buf_t0[1]; + w0_t[2] = salt_buf_t0[2]; + w0_t[3] = salt_buf_t0[3]; + w1_t[0] = 0x80; + w1_t[1] = 0; + w1_t[2] = 0; + w1_t[3] = 0; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 21 * 16 * 8; + w3_t[3] = 0; + + md5_transform (w0_t, w1_t, w2_t, w3_t, digest); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m09700_m04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global oldoffice01_t *oldoffice01_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + __local RC4_KEY rc4_keys[64]; + + __local RC4_KEY *rc4_key = &rc4_keys[lid]; + + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, combs_buf[0].pw_len); + } + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * salt + */ + + u32 salt_buf[4]; + + salt_buf[0] = salt_bufs[salt_pos].salt_buf[0]; + salt_buf[1] = salt_bufs[salt_pos].salt_buf[1]; + salt_buf[2] = salt_bufs[salt_pos].salt_buf[2]; + salt_buf[3] = salt_bufs[salt_pos].salt_buf[3]; + + /** + * esalt + */ + + const u32 version = oldoffice01_bufs[salt_pos].version; + + u32 encryptedVerifier[4]; + + encryptedVerifier[0] = oldoffice01_bufs[salt_pos].encryptedVerifier[0]; + encryptedVerifier[1] = oldoffice01_bufs[salt_pos].encryptedVerifier[1]; + encryptedVerifier[2] = oldoffice01_bufs[salt_pos].encryptedVerifier[2]; + encryptedVerifier[3] = oldoffice01_bufs[salt_pos].encryptedVerifier[3]; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = combs_buf[il_pos].pw_len; + + const u32 pw_len = pw_l_len + pw_r_len; + + u32 wordr0[4]; + + wordr0[0] = combs_buf[il_pos].i[0]; + wordr0[1] = combs_buf[il_pos].i[1]; + wordr0[2] = combs_buf[il_pos].i[2]; + wordr0[3] = combs_buf[il_pos].i[3]; + + u32 wordr1[4]; + + wordr1[0] = combs_buf[il_pos].i[4]; + wordr1[1] = combs_buf[il_pos].i[5]; + wordr1[2] = combs_buf[il_pos].i[6]; + wordr1[3] = combs_buf[il_pos].i[7]; + + u32 wordr2[4]; + + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + + u32 wordr3[4]; + + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + u32x w0[4]; + + w0[0] = wordl0[0] | wordr0[0]; + w0[1] = wordl0[1] | wordr0[1]; + w0[2] = wordl0[2] | wordr0[2]; + w0[3] = wordl0[3] | wordr0[3]; + + u32x w1[4]; + + w1[0] = wordl1[0] | wordr1[0]; + w1[1] = wordl1[1] | wordr1[1]; + w1[2] = wordl1[2] | wordr1[2]; + w1[3] = wordl1[3] | wordr1[3]; + + u32x w2[4]; + + w2[0] = wordl2[0] | wordr2[0]; + w2[1] = wordl2[1] | wordr2[1]; + w2[2] = wordl2[2] | wordr2[2]; + w2[3] = wordl2[3] | wordr2[3]; + + u32x w3[4]; + + w3[0] = wordl3[0] | wordr3[0]; + w3[1] = wordl3[1] | wordr3[1]; + w3[2] = 0; + w3[3] = 0; + + append_0x80_2 (w0, w1, pw_len); + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + make_unicode (w0, w0_t, w1_t); + make_unicode (w1, w2_t, w3_t); + + w3_t[2] = pw_len * 8 * 2; + + u32x digest_pre[4]; + + digest_pre[0] = MD5M_A; + digest_pre[1] = MD5M_B; + digest_pre[2] = MD5M_C; + digest_pre[3] = MD5M_D; + + md5_transform (w0_t, w1_t, w2_t, w3_t, digest_pre); + + digest_pre[0] &= 0xffffffff; + digest_pre[1] &= 0x000000ff; + digest_pre[2] &= 0x00000000; + digest_pre[3] &= 0x00000000; + + u32x digest[4]; + + digest[0] = MD5M_A; + digest[1] = MD5M_B; + digest[2] = MD5M_C; + digest[3] = MD5M_D; + + gen336 (digest_pre, salt_buf, digest); + + // now the 40 bit input for the MD5 which then will generate the RC4 key, so it's precomputable! + + w0_t[0] = digest[0]; + w0_t[1] = digest[1] & 0xff; + w0_t[2] = 0x8000; + w0_t[3] = 0; + w1_t[0] = 0; + w1_t[1] = 0; + w1_t[2] = 0; + w1_t[3] = 0; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 9 * 8; + w3_t[3] = 0; + + digest[0] = MD5M_A; + digest[1] = MD5M_B; + digest[2] = MD5M_C; + digest[3] = MD5M_D; + + md5_transform (w0_t, w1_t, w2_t, w3_t, digest); + + // now the RC4 part + + u32x key[4]; + + key[0] = digest[0]; + key[1] = digest[1]; + key[2] = digest[2]; + key[3] = digest[3]; + + rc4_init_16 (rc4_key, key); + + u32x out[4]; + + u8 j = rc4_next_16 (rc4_key, 0, 0, encryptedVerifier, out); + + w0_t[0] = out[0]; + w0_t[1] = out[1]; + w0_t[2] = out[2]; + w0_t[3] = out[3]; + w1_t[0] = 0x80; + w1_t[1] = 0; + w1_t[2] = 0; + w1_t[3] = 0; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 16 * 8; + w3_t[3] = 0; + + digest[0] = MD5M_A; + digest[1] = MD5M_B; + digest[2] = MD5M_C; + digest[3] = MD5M_D; + + md5_transform (w0_t, w1_t, w2_t, w3_t, digest); + + rc4_next_16 (rc4_key, 16, j, digest, out); + + const u32x r0 = out[0]; + const u32x r1 = out[1]; + const u32x r2 = out[2]; + const u32x r3 = out[3]; + + #include VECT_COMPARE_M + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m09700_m08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global oldoffice01_t *oldoffice01_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m09700_m16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global oldoffice01_t *oldoffice01_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m09700_s04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global oldoffice01_t *oldoffice01_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + __local RC4_KEY rc4_keys[64]; + + __local RC4_KEY *rc4_key = &rc4_keys[lid]; + + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, combs_buf[0].pw_len); + } + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * salt + */ + + u32 salt_buf[4]; + + salt_buf[0] = salt_bufs[salt_pos].salt_buf[0]; + salt_buf[1] = salt_bufs[salt_pos].salt_buf[1]; + salt_buf[2] = salt_bufs[salt_pos].salt_buf[2]; + salt_buf[3] = salt_bufs[salt_pos].salt_buf[3]; + + /** + * esalt + */ + + const u32 version = oldoffice01_bufs[salt_pos].version; + + u32 encryptedVerifier[4]; + + encryptedVerifier[0] = oldoffice01_bufs[salt_pos].encryptedVerifier[0]; + encryptedVerifier[1] = oldoffice01_bufs[salt_pos].encryptedVerifier[1]; + encryptedVerifier[2] = oldoffice01_bufs[salt_pos].encryptedVerifier[2]; + encryptedVerifier[3] = oldoffice01_bufs[salt_pos].encryptedVerifier[3]; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = combs_buf[il_pos].pw_len; + + const u32 pw_len = pw_l_len + pw_r_len; + + u32 wordr0[4]; + + wordr0[0] = combs_buf[il_pos].i[0]; + wordr0[1] = combs_buf[il_pos].i[1]; + wordr0[2] = combs_buf[il_pos].i[2]; + wordr0[3] = combs_buf[il_pos].i[3]; + + u32 wordr1[4]; + + wordr1[0] = combs_buf[il_pos].i[4]; + wordr1[1] = combs_buf[il_pos].i[5]; + wordr1[2] = combs_buf[il_pos].i[6]; + wordr1[3] = combs_buf[il_pos].i[7]; + + u32 wordr2[4]; + + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + + u32 wordr3[4]; + + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + u32x w0[4]; + + w0[0] = wordl0[0] | wordr0[0]; + w0[1] = wordl0[1] | wordr0[1]; + w0[2] = wordl0[2] | wordr0[2]; + w0[3] = wordl0[3] | wordr0[3]; + + u32x w1[4]; + + w1[0] = wordl1[0] | wordr1[0]; + w1[1] = wordl1[1] | wordr1[1]; + w1[2] = wordl1[2] | wordr1[2]; + w1[3] = wordl1[3] | wordr1[3]; + + u32x w2[4]; + + w2[0] = wordl2[0] | wordr2[0]; + w2[1] = wordl2[1] | wordr2[1]; + w2[2] = wordl2[2] | wordr2[2]; + w2[3] = wordl2[3] | wordr2[3]; + + u32x w3[4]; + + w3[0] = wordl3[0] | wordr3[0]; + w3[1] = wordl3[1] | wordr3[1]; + w3[2] = 0; + w3[3] = 0; + + append_0x80_2 (w0, w1, pw_len); + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + make_unicode (w0, w0_t, w1_t); + make_unicode (w1, w2_t, w3_t); + + w3_t[2] = pw_len * 8 * 2; + + u32x digest_pre[4]; + + digest_pre[0] = MD5M_A; + digest_pre[1] = MD5M_B; + digest_pre[2] = MD5M_C; + digest_pre[3] = MD5M_D; + + md5_transform (w0_t, w1_t, w2_t, w3_t, digest_pre); + + digest_pre[0] &= 0xffffffff; + digest_pre[1] &= 0x000000ff; + digest_pre[2] &= 0x00000000; + digest_pre[3] &= 0x00000000; + + u32x digest[4]; + + digest[0] = MD5M_A; + digest[1] = MD5M_B; + digest[2] = MD5M_C; + digest[3] = MD5M_D; + + gen336 (digest_pre, salt_buf, digest); + + // now the 40 bit input for the MD5 which then will generate the RC4 key, so it's precomputable! + + w0_t[0] = digest[0]; + w0_t[1] = digest[1] & 0xff; + w0_t[2] = 0x8000; + w0_t[3] = 0; + w1_t[0] = 0; + w1_t[1] = 0; + w1_t[2] = 0; + w1_t[3] = 0; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 9 * 8; + w3_t[3] = 0; + + digest[0] = MD5M_A; + digest[1] = MD5M_B; + digest[2] = MD5M_C; + digest[3] = MD5M_D; + + md5_transform (w0_t, w1_t, w2_t, w3_t, digest); + + // now the RC4 part + + u32x key[4]; + + key[0] = digest[0]; + key[1] = digest[1]; + key[2] = digest[2]; + key[3] = digest[3]; + + rc4_init_16 (rc4_key, key); + + u32x out[4]; + + u8 j = rc4_next_16 (rc4_key, 0, 0, encryptedVerifier, out); + + w0_t[0] = out[0]; + w0_t[1] = out[1]; + w0_t[2] = out[2]; + w0_t[3] = out[3]; + w1_t[0] = 0x80; + w1_t[1] = 0; + w1_t[2] = 0; + w1_t[3] = 0; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 16 * 8; + w3_t[3] = 0; + + digest[0] = MD5M_A; + digest[1] = MD5M_B; + digest[2] = MD5M_C; + digest[3] = MD5M_D; + + md5_transform (w0_t, w1_t, w2_t, w3_t, digest); + + rc4_next_16 (rc4_key, 16, j, digest, out); + + const u32x r0 = out[0]; + const u32x r1 = out[1]; + const u32x r2 = out[2]; + const u32x r3 = out[3]; + + #include VECT_COMPARE_S + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m09700_s08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global oldoffice01_t *oldoffice01_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m09700_s16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global oldoffice01_t *oldoffice01_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/amd/m09700_a3.cl b/amd/m09700_a3.cl new file mode 100644 index 0000000000..fd0b10625e --- /dev/null +++ b/amd/m09700_a3.cl @@ -0,0 +1,1556 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _OLDOFFICE01_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW4 +#define VECT_SIZE1 +#endif + +#ifdef VLIW5 +#define VECT_SIZE1 +#endif + +#define DGST_R0 0 +#define DGST_R1 1 +#define DGST_R2 2 +#define DGST_R3 3 + +#include "include/kernel_functions.c" +#include "types_amd.c" +#include "common_amd.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +typedef struct +{ + u8 S[256]; + + u32 wtf_its_faster; + +} RC4_KEY; + +static void swap (__local RC4_KEY *rc4_key, const u8 i, const u8 j) +{ + u8 tmp; + + tmp = rc4_key->S[i]; + rc4_key->S[i] = rc4_key->S[j]; + rc4_key->S[j] = tmp; +} + +static void rc4_init_16 (__local RC4_KEY *rc4_key, const u32 data[4]) +{ + u32 v = 0x03020100; + u32 a = 0x04040404; + + __local u32 *ptr = (__local u32 *) rc4_key->S; + + #pragma unroll + for (u32 i = 0; i < 64; i++) + { + *ptr++ = v; v += a; + } + + u32 j = 0; + + #pragma unroll + for (u32 i = 0; i < 16; i++) + { + u32 idx = i * 16; + + u32 v; + + v = data[0]; + + j += rc4_key->S[idx] + (v >> 0); swap (rc4_key, idx, j); idx++; + j += rc4_key->S[idx] + (v >> 8); swap (rc4_key, idx, j); idx++; + j += rc4_key->S[idx] + (v >> 16); swap (rc4_key, idx, j); idx++; + j += rc4_key->S[idx] + (v >> 24); swap (rc4_key, idx, j); idx++; + + v = data[1]; + + j += rc4_key->S[idx] + (v >> 0); swap (rc4_key, idx, j); idx++; + j += rc4_key->S[idx] + (v >> 8); swap (rc4_key, idx, j); idx++; + j += rc4_key->S[idx] + (v >> 16); swap (rc4_key, idx, j); idx++; + j += rc4_key->S[idx] + (v >> 24); swap (rc4_key, idx, j); idx++; + + v = data[2]; + + j += rc4_key->S[idx] + (v >> 0); swap (rc4_key, idx, j); idx++; + j += rc4_key->S[idx] + (v >> 8); swap (rc4_key, idx, j); idx++; + j += rc4_key->S[idx] + (v >> 16); swap (rc4_key, idx, j); idx++; + j += rc4_key->S[idx] + (v >> 24); swap (rc4_key, idx, j); idx++; + + v = data[3]; + + j += rc4_key->S[idx] + (v >> 0); swap (rc4_key, idx, j); idx++; + j += rc4_key->S[idx] + (v >> 8); swap (rc4_key, idx, j); idx++; + j += rc4_key->S[idx] + (v >> 16); swap (rc4_key, idx, j); idx++; + j += rc4_key->S[idx] + (v >> 24); swap (rc4_key, idx, j); idx++; + } +} + +static u8 rc4_next_16 (__local RC4_KEY *rc4_key, u8 i, u8 j, const u32 in[4], u32 out[4]) +{ + #pragma unroll + for (u32 k = 0; k < 4; k++) + { + u32 xor4 = 0; + + u8 idx; + + i += 1; + j += rc4_key->S[i]; + + swap (rc4_key, i, j); + + idx = rc4_key->S[i] + rc4_key->S[j]; + + xor4 |= rc4_key->S[idx] << 0; + + i += 1; + j += rc4_key->S[i]; + + swap (rc4_key, i, j); + + idx = rc4_key->S[i] + rc4_key->S[j]; + + xor4 |= rc4_key->S[idx] << 8; + + i += 1; + j += rc4_key->S[i]; + + swap (rc4_key, i, j); + + idx = rc4_key->S[i] + rc4_key->S[j]; + + xor4 |= rc4_key->S[idx] << 16; + + i += 1; + j += rc4_key->S[i]; + + swap (rc4_key, i, j); + + idx = rc4_key->S[i] + rc4_key->S[j]; + + xor4 |= rc4_key->S[idx] << 24; + + out[k] = in[k] ^ xor4; + } + + return j; +} + +static void md5_transform (const u32x w0[4], const u32x w1[4], const u32x w2[4], const u32x w3[4], u32x digest[4]) +{ + u32x a = digest[0]; + u32x b = digest[1]; + u32x c = digest[2]; + u32x d = digest[3]; + + u32x w0_t = w0[0]; + u32x w1_t = w0[1]; + u32x w2_t = w0[2]; + u32x w3_t = w0[3]; + u32x w4_t = w1[0]; + u32x w5_t = w1[1]; + u32x w6_t = w1[2]; + u32x w7_t = w1[3]; + u32x w8_t = w2[0]; + u32x w9_t = w2[1]; + u32x wa_t = w2[2]; + u32x wb_t = w2[3]; + u32x wc_t = w3[0]; + u32x wd_t = w3[1]; + u32x we_t = w3[2]; + u32x wf_t = w3[3]; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t, MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t, MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t, MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t, MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w4_t, MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w5_t, MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w6_t, MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w7_t, MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w8_t, MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w9_t, MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, wa_t, MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, wb_t, MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, wc_t, MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, wd_t, MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, we_t, MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, wf_t, MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w1_t, MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w6_t, MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, wb_t, MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t, MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w5_t, MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, wa_t, MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, wf_t, MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w4_t, MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w9_t, MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, we_t, MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t, MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w8_t, MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, wd_t, MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t, MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w7_t, MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, wc_t, MD5C1f, MD5S13); + + MD5_STEP (MD5_H , a, b, c, d, w5_t, MD5C20, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w8_t, MD5C21, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, wb_t, MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, we_t, MD5C23, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w1_t, MD5C24, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w4_t, MD5C25, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w7_t, MD5C26, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, wa_t, MD5C27, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, wd_t, MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w0_t, MD5C29, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w3_t, MD5C2a, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w6_t, MD5C2b, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w9_t, MD5C2c, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, wc_t, MD5C2d, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, wf_t, MD5C2e, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w2_t, MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t, MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w7_t, MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, we_t, MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w5_t, MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, wc_t, MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t, MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, wa_t, MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t, MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w8_t, MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, wf_t, MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w6_t, MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, wd_t, MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w4_t, MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, wb_t, MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t, MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w9_t, MD5C3f, MD5S33); + + digest[0] += a; + digest[1] += b; + digest[2] += c; + digest[3] += d; +} + +static void m09700m (__local RC4_KEY rc4_keys[64], u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], const u32 pw_len, __global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global oldoffice01_t *oldoffice01_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset) +{ + /** + * modifier + */ + + const u32 gid = get_global_id (0); + const u32 lid = get_local_id (0); + + __local RC4_KEY *rc4_key = &rc4_keys[lid]; + + /** + * salt + */ + + u32 salt_buf_t0[4]; + u32 salt_buf_t1[5]; + u32 salt_buf_t2[5]; + u32 salt_buf_t3[5]; + + salt_buf_t0[0] = salt_bufs[salt_pos].salt_buf[0]; + salt_buf_t0[1] = salt_bufs[salt_pos].salt_buf[1]; + salt_buf_t0[2] = salt_bufs[salt_pos].salt_buf[2]; + salt_buf_t0[3] = salt_bufs[salt_pos].salt_buf[3]; + + salt_buf_t1[0] = salt_buf_t0[0] << 8; + salt_buf_t1[1] = salt_buf_t0[0] >> 24 | salt_buf_t0[1] << 8; + salt_buf_t1[2] = salt_buf_t0[1] >> 24 | salt_buf_t0[2] << 8; + salt_buf_t1[3] = salt_buf_t0[2] >> 24 | salt_buf_t0[3] << 8; + salt_buf_t1[4] = salt_buf_t0[3] >> 24; + + salt_buf_t2[0] = salt_buf_t0[0] << 16; + salt_buf_t2[1] = salt_buf_t0[0] >> 16 | salt_buf_t0[1] << 16; + salt_buf_t2[2] = salt_buf_t0[1] >> 16 | salt_buf_t0[2] << 16; + salt_buf_t2[3] = salt_buf_t0[2] >> 16 | salt_buf_t0[3] << 16; + salt_buf_t2[4] = salt_buf_t0[3] >> 16; + + salt_buf_t3[0] = salt_buf_t0[0] << 24; + salt_buf_t3[1] = salt_buf_t0[0] >> 8 | salt_buf_t0[1] << 24; + salt_buf_t3[2] = salt_buf_t0[1] >> 8 | salt_buf_t0[2] << 24; + salt_buf_t3[3] = salt_buf_t0[2] >> 8 | salt_buf_t0[3] << 24; + salt_buf_t3[4] = salt_buf_t0[3] >> 8; + + const u32 salt_len = 16; + + /** + * esalt + */ + + const u32 version = oldoffice01_bufs[salt_pos].version; + + u32 encryptedVerifier[4]; + + encryptedVerifier[0] = oldoffice01_bufs[salt_pos].encryptedVerifier[0]; + encryptedVerifier[1] = oldoffice01_bufs[salt_pos].encryptedVerifier[1]; + encryptedVerifier[2] = oldoffice01_bufs[salt_pos].encryptedVerifier[2]; + encryptedVerifier[3] = oldoffice01_bufs[salt_pos].encryptedVerifier[3]; + + /** + * loop + */ + + u32x w0l = w0[0]; + + for (u32 il_pos = 0; il_pos < bfs_cnt; il_pos++) + { + const u32 w0r = bfs_buf[il_pos].i; + + w0[0] = w0l | w0r; + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + w0_t[0] = w0[0]; + w0_t[1] = w0[1]; + w0_t[2] = w0[2]; + w0_t[3] = w0[3]; + w1_t[0] = w1[0]; + w1_t[1] = w1[1]; + w1_t[2] = w1[2]; + w1_t[3] = w1[3]; + w2_t[0] = w2[0]; + w2_t[1] = w2[1]; + w2_t[2] = w2[2]; + w2_t[3] = w2[3]; + w3_t[0] = w3[0]; + w3_t[1] = w3[1]; + w3_t[2] = pw_len * 8; + w3_t[3] = 0; + + u32x digest_t0[4]; + u32x digest_t1[2]; // need only first 5 byte + u32x digest_t2[2]; + u32x digest_t3[2]; + + digest_t0[0] = MD5M_A; + digest_t0[1] = MD5M_B; + digest_t0[2] = MD5M_C; + digest_t0[3] = MD5M_D; + + md5_transform (w0_t, w1_t, w2_t, w3_t, digest_t0); + + // prepare 16 * 21 buffer stuff + + u32x digest[4]; + + digest[0] = MD5M_A; + digest[1] = MD5M_B; + digest[2] = MD5M_C; + digest[3] = MD5M_D; + + // offsets + + digest_t0[0] &= 0xffffffff; + digest_t0[1] &= 0x000000ff; + digest_t0[2] &= 0x00000000; + digest_t0[3] &= 0x00000000; + + digest_t1[0] = digest_t0[0] << 8; + digest_t1[1] = digest_t0[0] >> 24 | digest_t0[1] << 8; + + digest_t2[0] = digest_t0[0] << 16; + digest_t2[1] = digest_t0[0] >> 16 | digest_t0[1] << 16; + + digest_t3[0] = digest_t0[0] << 24; + digest_t3[1] = digest_t0[0] >> 8 | digest_t0[1] << 24; + + // generate the 16 * 21 buffer + + w0_t[0] = 0; + w0_t[1] = 0; + w0_t[2] = 0; + w0_t[3] = 0; + w1_t[0] = 0; + w1_t[1] = 0; + w1_t[2] = 0; + w1_t[3] = 0; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = 0; + + // 0..5 + w0_t[0] = digest_t0[0]; + w0_t[1] = digest_t0[1]; + + // 5..21 + w0_t[1] |= salt_buf_t1[0]; + w0_t[2] = salt_buf_t1[1]; + w0_t[3] = salt_buf_t1[2]; + w1_t[0] = salt_buf_t1[3]; + w1_t[1] = salt_buf_t1[4]; + + // 21..26 + w1_t[1] |= digest_t1[0]; + w1_t[2] = digest_t1[1]; + + // 26..42 + w1_t[2] |= salt_buf_t2[0]; + w1_t[3] = salt_buf_t2[1]; + w2_t[0] = salt_buf_t2[2]; + w2_t[1] = salt_buf_t2[3]; + w2_t[2] = salt_buf_t2[4]; + + // 42..47 + w2_t[2] |= digest_t2[0]; + w2_t[3] = digest_t2[1]; + + // 47..63 + w2_t[3] |= salt_buf_t3[0]; + w3_t[0] = salt_buf_t3[1]; + w3_t[1] = salt_buf_t3[2]; + w3_t[2] = salt_buf_t3[3]; + w3_t[3] = salt_buf_t3[4]; + + // 63.. + + w3_t[3] |= digest_t3[0]; + + md5_transform (w0_t, w1_t, w2_t, w3_t, digest); + + w0_t[0] = 0; + w0_t[1] = 0; + w0_t[2] = 0; + w0_t[3] = 0; + w1_t[0] = 0; + w1_t[1] = 0; + w1_t[2] = 0; + w1_t[3] = 0; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = 0; + + // 0..4 + w0_t[0] = digest_t3[1]; + + // 4..20 + w0_t[1] = salt_buf_t0[0]; + w0_t[2] = salt_buf_t0[1]; + w0_t[3] = salt_buf_t0[2]; + w1_t[0] = salt_buf_t0[3]; + + // 20..25 + w1_t[1] = digest_t0[0]; + w1_t[2] = digest_t0[1]; + + // 25..41 + w1_t[2] |= salt_buf_t1[0]; + w1_t[3] = salt_buf_t1[1]; + w2_t[0] = salt_buf_t1[2]; + w2_t[1] = salt_buf_t1[3]; + w2_t[2] = salt_buf_t1[4]; + + // 41..46 + w2_t[2] |= digest_t1[0]; + w2_t[3] = digest_t1[1]; + + // 46..62 + w2_t[3] |= salt_buf_t2[0]; + w3_t[0] = salt_buf_t2[1]; + w3_t[1] = salt_buf_t2[2]; + w3_t[2] = salt_buf_t2[3]; + w3_t[3] = salt_buf_t2[4]; + + // 62.. + w3_t[3] |= digest_t2[0]; + + md5_transform (w0_t, w1_t, w2_t, w3_t, digest); + + w0_t[0] = 0; + w0_t[1] = 0; + w0_t[2] = 0; + w0_t[3] = 0; + w1_t[0] = 0; + w1_t[1] = 0; + w1_t[2] = 0; + w1_t[3] = 0; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = 0; + + // 0..3 + w0_t[0] = digest_t2[1]; + + // 3..19 + w0_t[0] |= salt_buf_t3[0]; + w0_t[1] = salt_buf_t3[1]; + w0_t[2] = salt_buf_t3[2]; + w0_t[3] = salt_buf_t3[3]; + w1_t[0] = salt_buf_t3[4]; + + // 19..24 + w1_t[0] |= digest_t3[0]; + w1_t[1] = digest_t3[1]; + + // 24..40 + w1_t[2] = salt_buf_t0[0]; + w1_t[3] = salt_buf_t0[1]; + w2_t[0] = salt_buf_t0[2]; + w2_t[1] = salt_buf_t0[3]; + + // 40..45 + w2_t[2] = digest_t0[0]; + w2_t[3] = digest_t0[1]; + + // 45..61 + w2_t[3] |= salt_buf_t1[0]; + w3_t[0] = salt_buf_t1[1]; + w3_t[1] = salt_buf_t1[2]; + w3_t[2] = salt_buf_t1[3]; + w3_t[3] = salt_buf_t1[4]; + + // 61.. + w3_t[3] |= digest_t1[0]; + + md5_transform (w0_t, w1_t, w2_t, w3_t, digest); + + w0_t[0] = 0; + w0_t[1] = 0; + w0_t[2] = 0; + w0_t[3] = 0; + w1_t[0] = 0; + w1_t[1] = 0; + w1_t[2] = 0; + w1_t[3] = 0; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = 0; + + // 0..2 + w0_t[0] = digest_t1[1]; + + // 2..18 + w0_t[0] |= salt_buf_t2[0]; + w0_t[1] = salt_buf_t2[1]; + w0_t[2] = salt_buf_t2[2]; + w0_t[3] = salt_buf_t2[3]; + w1_t[0] = salt_buf_t2[4]; + + // 18..23 + w1_t[0] |= digest_t2[0]; + w1_t[1] = digest_t2[1]; + + // 23..39 + w1_t[1] |= salt_buf_t3[0]; + w1_t[2] = salt_buf_t3[1]; + w1_t[3] = salt_buf_t3[2]; + w2_t[0] = salt_buf_t3[3]; + w2_t[1] = salt_buf_t3[4]; + + // 39..44 + w2_t[1] |= digest_t3[0]; + w2_t[2] = digest_t3[1]; + + // 44..60 + w2_t[3] = salt_buf_t0[0]; + w3_t[0] = salt_buf_t0[1]; + w3_t[1] = salt_buf_t0[2]; + w3_t[2] = salt_buf_t0[3]; + + // 60.. + w3_t[3] = digest_t0[0]; + + md5_transform (w0_t, w1_t, w2_t, w3_t, digest); + + w0_t[0] = 0; + w0_t[1] = 0; + w0_t[2] = 0; + w0_t[3] = 0; + w1_t[0] = 0; + w1_t[1] = 0; + w1_t[2] = 0; + w1_t[3] = 0; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = 0; + + // 0..1 + w0_t[0] = digest_t0[1]; + + // 1..17 + w0_t[0] |= salt_buf_t1[0]; + w0_t[1] = salt_buf_t1[1]; + w0_t[2] = salt_buf_t1[2]; + w0_t[3] = salt_buf_t1[3]; + w1_t[0] = salt_buf_t1[4]; + + // 17..22 + w1_t[0] |= digest_t1[0]; + w1_t[1] = digest_t1[1]; + + // 22..38 + w1_t[1] |= salt_buf_t2[0]; + w1_t[2] = salt_buf_t2[1]; + w1_t[3] = salt_buf_t2[2]; + w2_t[0] = salt_buf_t2[3]; + w2_t[1] = salt_buf_t2[4]; + + // 38..43 + w2_t[1] |= digest_t2[0]; + w2_t[2] = digest_t2[1]; + + // 43..59 + w2_t[2] |= salt_buf_t3[0]; + w2_t[3] = salt_buf_t3[1]; + w3_t[0] = salt_buf_t3[2]; + w3_t[1] = salt_buf_t3[3]; + w3_t[2] = salt_buf_t3[4]; + + // 59.. + w3_t[2] |= digest_t3[0]; + w3_t[3] = digest_t3[1]; + + md5_transform (w0_t, w1_t, w2_t, w3_t, digest); + + w0_t[0] = salt_buf_t0[0]; + w0_t[1] = salt_buf_t0[1]; + w0_t[2] = salt_buf_t0[2]; + w0_t[3] = salt_buf_t0[3]; + w1_t[0] = 0x80; + w1_t[1] = 0; + w1_t[2] = 0; + w1_t[3] = 0; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 21 * 16 * 8; + w3_t[3] = 0; + + md5_transform (w0_t, w1_t, w2_t, w3_t, digest); + + // now the 40 bit input for the MD5 which then will generate the RC4 key, so it's precomputable! + + w0_t[0] = digest[0]; + w0_t[1] = digest[1] & 0xff; + w0_t[2] = 0x8000; + w0_t[3] = 0; + w1_t[0] = 0; + w1_t[1] = 0; + w1_t[2] = 0; + w1_t[3] = 0; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 9 * 8; + w3_t[3] = 0; + + digest[0] = MD5M_A; + digest[1] = MD5M_B; + digest[2] = MD5M_C; + digest[3] = MD5M_D; + + md5_transform (w0_t, w1_t, w2_t, w3_t, digest); + + // now the RC4 part + + u32x key[4]; + + key[0] = digest[0]; + key[1] = digest[1]; + key[2] = digest[2]; + key[3] = digest[3]; + + rc4_init_16 (rc4_key, key); + + u32x out[4]; + + u8 j = rc4_next_16 (rc4_key, 0, 0, encryptedVerifier, out); + + w0_t[0] = out[0]; + w0_t[1] = out[1]; + w0_t[2] = out[2]; + w0_t[3] = out[3]; + w1_t[0] = 0x80; + w1_t[1] = 0; + w1_t[2] = 0; + w1_t[3] = 0; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 16 * 8; + w3_t[3] = 0; + + digest[0] = MD5M_A; + digest[1] = MD5M_B; + digest[2] = MD5M_C; + digest[3] = MD5M_D; + + md5_transform (w0_t, w1_t, w2_t, w3_t, digest); + + rc4_next_16 (rc4_key, 16, j, digest, out); + + const u32x r0 = out[0]; + const u32x r1 = out[1]; + const u32x r2 = out[2]; + const u32x r3 = out[3]; + + #include VECT_COMPARE_M + } +} + +static void m09700s (__local RC4_KEY rc4_keys[64], u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], const u32 pw_len, __global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global oldoffice01_t *oldoffice01_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset) +{ + /** + * modifier + */ + + const u32 gid = get_global_id (0); + const u32 lid = get_local_id (0); + + __local RC4_KEY *rc4_key = &rc4_keys[lid]; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * salt + */ + + u32 salt_buf_t0[4]; + u32 salt_buf_t1[5]; + u32 salt_buf_t2[5]; + u32 salt_buf_t3[5]; + + salt_buf_t0[0] = salt_bufs[salt_pos].salt_buf[0]; + salt_buf_t0[1] = salt_bufs[salt_pos].salt_buf[1]; + salt_buf_t0[2] = salt_bufs[salt_pos].salt_buf[2]; + salt_buf_t0[3] = salt_bufs[salt_pos].salt_buf[3]; + + salt_buf_t1[0] = salt_buf_t0[0] << 8; + salt_buf_t1[1] = salt_buf_t0[0] >> 24 | salt_buf_t0[1] << 8; + salt_buf_t1[2] = salt_buf_t0[1] >> 24 | salt_buf_t0[2] << 8; + salt_buf_t1[3] = salt_buf_t0[2] >> 24 | salt_buf_t0[3] << 8; + salt_buf_t1[4] = salt_buf_t0[3] >> 24; + + salt_buf_t2[0] = salt_buf_t0[0] << 16; + salt_buf_t2[1] = salt_buf_t0[0] >> 16 | salt_buf_t0[1] << 16; + salt_buf_t2[2] = salt_buf_t0[1] >> 16 | salt_buf_t0[2] << 16; + salt_buf_t2[3] = salt_buf_t0[2] >> 16 | salt_buf_t0[3] << 16; + salt_buf_t2[4] = salt_buf_t0[3] >> 16; + + salt_buf_t3[0] = salt_buf_t0[0] << 24; + salt_buf_t3[1] = salt_buf_t0[0] >> 8 | salt_buf_t0[1] << 24; + salt_buf_t3[2] = salt_buf_t0[1] >> 8 | salt_buf_t0[2] << 24; + salt_buf_t3[3] = salt_buf_t0[2] >> 8 | salt_buf_t0[3] << 24; + salt_buf_t3[4] = salt_buf_t0[3] >> 8; + + const u32 salt_len = 16; + + /** + * esalt + */ + + const u32 version = oldoffice01_bufs[salt_pos].version; + + u32 encryptedVerifier[4]; + + encryptedVerifier[0] = oldoffice01_bufs[salt_pos].encryptedVerifier[0]; + encryptedVerifier[1] = oldoffice01_bufs[salt_pos].encryptedVerifier[1]; + encryptedVerifier[2] = oldoffice01_bufs[salt_pos].encryptedVerifier[2]; + encryptedVerifier[3] = oldoffice01_bufs[salt_pos].encryptedVerifier[3]; + + /** + * loop + */ + + u32x w0l = w0[0]; + + for (u32 il_pos = 0; il_pos < bfs_cnt; il_pos++) + { + const u32 w0r = bfs_buf[il_pos].i; + + w0[0] = w0l | w0r; + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + w0_t[0] = w0[0]; + w0_t[1] = w0[1]; + w0_t[2] = w0[2]; + w0_t[3] = w0[3]; + w1_t[0] = w1[0]; + w1_t[1] = w1[1]; + w1_t[2] = w1[2]; + w1_t[3] = w1[3]; + w2_t[0] = w2[0]; + w2_t[1] = w2[1]; + w2_t[2] = w2[2]; + w2_t[3] = w2[3]; + w3_t[0] = w3[0]; + w3_t[1] = w3[1]; + w3_t[2] = pw_len * 8; + w3_t[3] = 0; + + u32x digest_t0[4]; + u32x digest_t1[2]; // need only first 5 byte + u32x digest_t2[2]; + u32x digest_t3[2]; + + digest_t0[0] = MD5M_A; + digest_t0[1] = MD5M_B; + digest_t0[2] = MD5M_C; + digest_t0[3] = MD5M_D; + + md5_transform (w0_t, w1_t, w2_t, w3_t, digest_t0); + + // prepare 16 * 21 buffer stuff + + u32x digest[4]; + + digest[0] = MD5M_A; + digest[1] = MD5M_B; + digest[2] = MD5M_C; + digest[3] = MD5M_D; + + // offsets + + digest_t0[0] &= 0xffffffff; + digest_t0[1] &= 0x000000ff; + digest_t0[2] &= 0x00000000; + digest_t0[3] &= 0x00000000; + + digest_t1[0] = digest_t0[0] << 8; + digest_t1[1] = digest_t0[0] >> 24 | digest_t0[1] << 8; + + digest_t2[0] = digest_t0[0] << 16; + digest_t2[1] = digest_t0[0] >> 16 | digest_t0[1] << 16; + + digest_t3[0] = digest_t0[0] << 24; + digest_t3[1] = digest_t0[0] >> 8 | digest_t0[1] << 24; + + // generate the 16 * 21 buffer + + w0_t[0] = 0; + w0_t[1] = 0; + w0_t[2] = 0; + w0_t[3] = 0; + w1_t[0] = 0; + w1_t[1] = 0; + w1_t[2] = 0; + w1_t[3] = 0; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = 0; + + // 0..5 + w0_t[0] = digest_t0[0]; + w0_t[1] = digest_t0[1]; + + // 5..21 + w0_t[1] |= salt_buf_t1[0]; + w0_t[2] = salt_buf_t1[1]; + w0_t[3] = salt_buf_t1[2]; + w1_t[0] = salt_buf_t1[3]; + w1_t[1] = salt_buf_t1[4]; + + // 21..26 + w1_t[1] |= digest_t1[0]; + w1_t[2] = digest_t1[1]; + + // 26..42 + w1_t[2] |= salt_buf_t2[0]; + w1_t[3] = salt_buf_t2[1]; + w2_t[0] = salt_buf_t2[2]; + w2_t[1] = salt_buf_t2[3]; + w2_t[2] = salt_buf_t2[4]; + + // 42..47 + w2_t[2] |= digest_t2[0]; + w2_t[3] = digest_t2[1]; + + // 47..63 + w2_t[3] |= salt_buf_t3[0]; + w3_t[0] = salt_buf_t3[1]; + w3_t[1] = salt_buf_t3[2]; + w3_t[2] = salt_buf_t3[3]; + w3_t[3] = salt_buf_t3[4]; + + // 63.. + + w3_t[3] |= digest_t3[0]; + + md5_transform (w0_t, w1_t, w2_t, w3_t, digest); + + w0_t[0] = 0; + w0_t[1] = 0; + w0_t[2] = 0; + w0_t[3] = 0; + w1_t[0] = 0; + w1_t[1] = 0; + w1_t[2] = 0; + w1_t[3] = 0; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = 0; + + // 0..4 + w0_t[0] = digest_t3[1]; + + // 4..20 + w0_t[1] = salt_buf_t0[0]; + w0_t[2] = salt_buf_t0[1]; + w0_t[3] = salt_buf_t0[2]; + w1_t[0] = salt_buf_t0[3]; + + // 20..25 + w1_t[1] = digest_t0[0]; + w1_t[2] = digest_t0[1]; + + // 25..41 + w1_t[2] |= salt_buf_t1[0]; + w1_t[3] = salt_buf_t1[1]; + w2_t[0] = salt_buf_t1[2]; + w2_t[1] = salt_buf_t1[3]; + w2_t[2] = salt_buf_t1[4]; + + // 41..46 + w2_t[2] |= digest_t1[0]; + w2_t[3] = digest_t1[1]; + + // 46..62 + w2_t[3] |= salt_buf_t2[0]; + w3_t[0] = salt_buf_t2[1]; + w3_t[1] = salt_buf_t2[2]; + w3_t[2] = salt_buf_t2[3]; + w3_t[3] = salt_buf_t2[4]; + + // 62.. + w3_t[3] |= digest_t2[0]; + + md5_transform (w0_t, w1_t, w2_t, w3_t, digest); + + w0_t[0] = 0; + w0_t[1] = 0; + w0_t[2] = 0; + w0_t[3] = 0; + w1_t[0] = 0; + w1_t[1] = 0; + w1_t[2] = 0; + w1_t[3] = 0; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = 0; + + // 0..3 + w0_t[0] = digest_t2[1]; + + // 3..19 + w0_t[0] |= salt_buf_t3[0]; + w0_t[1] = salt_buf_t3[1]; + w0_t[2] = salt_buf_t3[2]; + w0_t[3] = salt_buf_t3[3]; + w1_t[0] = salt_buf_t3[4]; + + // 19..24 + w1_t[0] |= digest_t3[0]; + w1_t[1] = digest_t3[1]; + + // 24..40 + w1_t[2] = salt_buf_t0[0]; + w1_t[3] = salt_buf_t0[1]; + w2_t[0] = salt_buf_t0[2]; + w2_t[1] = salt_buf_t0[3]; + + // 40..45 + w2_t[2] = digest_t0[0]; + w2_t[3] = digest_t0[1]; + + // 45..61 + w2_t[3] |= salt_buf_t1[0]; + w3_t[0] = salt_buf_t1[1]; + w3_t[1] = salt_buf_t1[2]; + w3_t[2] = salt_buf_t1[3]; + w3_t[3] = salt_buf_t1[4]; + + // 61.. + w3_t[3] |= digest_t1[0]; + + md5_transform (w0_t, w1_t, w2_t, w3_t, digest); + + w0_t[0] = 0; + w0_t[1] = 0; + w0_t[2] = 0; + w0_t[3] = 0; + w1_t[0] = 0; + w1_t[1] = 0; + w1_t[2] = 0; + w1_t[3] = 0; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = 0; + + // 0..2 + w0_t[0] = digest_t1[1]; + + // 2..18 + w0_t[0] |= salt_buf_t2[0]; + w0_t[1] = salt_buf_t2[1]; + w0_t[2] = salt_buf_t2[2]; + w0_t[3] = salt_buf_t2[3]; + w1_t[0] = salt_buf_t2[4]; + + // 18..23 + w1_t[0] |= digest_t2[0]; + w1_t[1] = digest_t2[1]; + + // 23..39 + w1_t[1] |= salt_buf_t3[0]; + w1_t[2] = salt_buf_t3[1]; + w1_t[3] = salt_buf_t3[2]; + w2_t[0] = salt_buf_t3[3]; + w2_t[1] = salt_buf_t3[4]; + + // 39..44 + w2_t[1] |= digest_t3[0]; + w2_t[2] = digest_t3[1]; + + // 44..60 + w2_t[3] = salt_buf_t0[0]; + w3_t[0] = salt_buf_t0[1]; + w3_t[1] = salt_buf_t0[2]; + w3_t[2] = salt_buf_t0[3]; + + // 60.. + w3_t[3] = digest_t0[0]; + + md5_transform (w0_t, w1_t, w2_t, w3_t, digest); + + w0_t[0] = 0; + w0_t[1] = 0; + w0_t[2] = 0; + w0_t[3] = 0; + w1_t[0] = 0; + w1_t[1] = 0; + w1_t[2] = 0; + w1_t[3] = 0; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = 0; + + // 0..1 + w0_t[0] = digest_t0[1]; + + // 1..17 + w0_t[0] |= salt_buf_t1[0]; + w0_t[1] = salt_buf_t1[1]; + w0_t[2] = salt_buf_t1[2]; + w0_t[3] = salt_buf_t1[3]; + w1_t[0] = salt_buf_t1[4]; + + // 17..22 + w1_t[0] |= digest_t1[0]; + w1_t[1] = digest_t1[1]; + + // 22..38 + w1_t[1] |= salt_buf_t2[0]; + w1_t[2] = salt_buf_t2[1]; + w1_t[3] = salt_buf_t2[2]; + w2_t[0] = salt_buf_t2[3]; + w2_t[1] = salt_buf_t2[4]; + + // 38..43 + w2_t[1] |= digest_t2[0]; + w2_t[2] = digest_t2[1]; + + // 43..59 + w2_t[2] |= salt_buf_t3[0]; + w2_t[3] = salt_buf_t3[1]; + w3_t[0] = salt_buf_t3[2]; + w3_t[1] = salt_buf_t3[3]; + w3_t[2] = salt_buf_t3[4]; + + // 59.. + w3_t[2] |= digest_t3[0]; + w3_t[3] = digest_t3[1]; + + md5_transform (w0_t, w1_t, w2_t, w3_t, digest); + + w0_t[0] = salt_buf_t0[0]; + w0_t[1] = salt_buf_t0[1]; + w0_t[2] = salt_buf_t0[2]; + w0_t[3] = salt_buf_t0[3]; + w1_t[0] = 0x80; + w1_t[1] = 0; + w1_t[2] = 0; + w1_t[3] = 0; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 21 * 16 * 8; + w3_t[3] = 0; + + md5_transform (w0_t, w1_t, w2_t, w3_t, digest); + + // now the 40 bit input for the MD5 which then will generate the RC4 key, so it's precomputable! + + w0_t[0] = digest[0]; + w0_t[1] = digest[1] & 0xff; + w0_t[2] = 0x8000; + w0_t[3] = 0; + w1_t[0] = 0; + w1_t[1] = 0; + w1_t[2] = 0; + w1_t[3] = 0; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 9 * 8; + w3_t[3] = 0; + + digest[0] = MD5M_A; + digest[1] = MD5M_B; + digest[2] = MD5M_C; + digest[3] = MD5M_D; + + md5_transform (w0_t, w1_t, w2_t, w3_t, digest); + + // now the RC4 part + + u32x key[4]; + + key[0] = digest[0]; + key[1] = digest[1]; + key[2] = digest[2]; + key[3] = digest[3]; + + rc4_init_16 (rc4_key, key); + + u32x out[4]; + + u8 j = rc4_next_16 (rc4_key, 0, 0, encryptedVerifier, out); + + w0_t[0] = out[0]; + w0_t[1] = out[1]; + w0_t[2] = out[2]; + w0_t[3] = out[3]; + w1_t[0] = 0x80; + w1_t[1] = 0; + w1_t[2] = 0; + w1_t[3] = 0; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 16 * 8; + w3_t[3] = 0; + + digest[0] = MD5M_A; + digest[1] = MD5M_B; + digest[2] = MD5M_C; + digest[3] = MD5M_D; + + md5_transform (w0_t, w1_t, w2_t, w3_t, digest); + + rc4_next_16 (rc4_key, 16, j, digest, out); + + const u32x r0 = out[0]; + const u32x r1 = out[1]; + const u32x r2 = out[2]; + const u32x r3 = out[3]; + + #include VECT_COMPARE_S + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m09700_m04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global oldoffice01_t *oldoffice01_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + __local RC4_KEY rc4_keys[64]; + + m09700m (rc4_keys, w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, oldoffice01_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m09700_m08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global oldoffice01_t *oldoffice01_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + __local RC4_KEY rc4_keys[64]; + + m09700m (rc4_keys, w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, oldoffice01_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m09700_m16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global oldoffice01_t *oldoffice01_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = pws[gid].i[ 8]; + w2[1] = pws[gid].i[ 9]; + w2[2] = pws[gid].i[10]; + w2[3] = pws[gid].i[11]; + + u32x w3[4]; + + w3[0] = pws[gid].i[12]; + w3[1] = pws[gid].i[13]; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + __local RC4_KEY rc4_keys[64]; + + m09700m (rc4_keys, w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, oldoffice01_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m09700_s04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global oldoffice01_t *oldoffice01_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + __local RC4_KEY rc4_keys[64]; + + m09700s (rc4_keys, w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, oldoffice01_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m09700_s08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global oldoffice01_t *oldoffice01_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + __local RC4_KEY rc4_keys[64]; + + m09700s (rc4_keys, w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, oldoffice01_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m09700_s16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global oldoffice01_t *oldoffice01_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = pws[gid].i[ 8]; + w2[1] = pws[gid].i[ 9]; + w2[2] = pws[gid].i[10]; + w2[3] = pws[gid].i[11]; + + u32x w3[4]; + + w3[0] = pws[gid].i[12]; + w3[1] = pws[gid].i[13]; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + __local RC4_KEY rc4_keys[64]; + + m09700s (rc4_keys, w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, oldoffice01_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} diff --git a/amd/m09710_a0.cl b/amd/m09710_a0.cl new file mode 100644 index 0000000000..448a62815b --- /dev/null +++ b/amd/m09710_a0.cl @@ -0,0 +1,629 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _OLDOFFICE01_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW4 +#define VECT_SIZE1 +#endif + +#ifdef VLIW5 +#define VECT_SIZE1 +#endif + +#define DGST_R0 0 +#define DGST_R1 1 +#define DGST_R2 2 +#define DGST_R3 3 + +#include "include/kernel_functions.c" +#include "types_amd.c" +#include "common_amd.c" +#include "include/rp_gpu.h" +#include "rp_amd.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +typedef struct +{ + u8 S[256]; + + u32 wtf_its_faster; + +} RC4_KEY; + +static void swap (__local RC4_KEY *rc4_key, const u8 i, const u8 j) +{ + u8 tmp; + + tmp = rc4_key->S[i]; + rc4_key->S[i] = rc4_key->S[j]; + rc4_key->S[j] = tmp; +} + +static void rc4_init_16 (__local RC4_KEY *rc4_key, const u32 data[4]) +{ + u32 v = 0x03020100; + u32 a = 0x04040404; + + __local u32 *ptr = (__local u32 *) rc4_key->S; + + #pragma unroll + for (u32 i = 0; i < 64; i++) + { + *ptr++ = v; v += a; + } + + u32 j = 0; + + #pragma unroll + for (u32 i = 0; i < 16; i++) + { + u32 idx = i * 16; + + u32 v; + + v = data[0]; + + j += rc4_key->S[idx] + (v >> 0); swap (rc4_key, idx, j); idx++; + j += rc4_key->S[idx] + (v >> 8); swap (rc4_key, idx, j); idx++; + j += rc4_key->S[idx] + (v >> 16); swap (rc4_key, idx, j); idx++; + j += rc4_key->S[idx] + (v >> 24); swap (rc4_key, idx, j); idx++; + + v = data[1]; + + j += rc4_key->S[idx] + (v >> 0); swap (rc4_key, idx, j); idx++; + j += rc4_key->S[idx] + (v >> 8); swap (rc4_key, idx, j); idx++; + j += rc4_key->S[idx] + (v >> 16); swap (rc4_key, idx, j); idx++; + j += rc4_key->S[idx] + (v >> 24); swap (rc4_key, idx, j); idx++; + + v = data[2]; + + j += rc4_key->S[idx] + (v >> 0); swap (rc4_key, idx, j); idx++; + j += rc4_key->S[idx] + (v >> 8); swap (rc4_key, idx, j); idx++; + j += rc4_key->S[idx] + (v >> 16); swap (rc4_key, idx, j); idx++; + j += rc4_key->S[idx] + (v >> 24); swap (rc4_key, idx, j); idx++; + + v = data[3]; + + j += rc4_key->S[idx] + (v >> 0); swap (rc4_key, idx, j); idx++; + j += rc4_key->S[idx] + (v >> 8); swap (rc4_key, idx, j); idx++; + j += rc4_key->S[idx] + (v >> 16); swap (rc4_key, idx, j); idx++; + j += rc4_key->S[idx] + (v >> 24); swap (rc4_key, idx, j); idx++; + } +} + +static u8 rc4_next_16 (__local RC4_KEY *rc4_key, u8 i, u8 j, const u32 in[4], u32 out[4]) +{ + #pragma unroll + for (u32 k = 0; k < 4; k++) + { + u32 xor4 = 0; + + u8 idx; + + i += 1; + j += rc4_key->S[i]; + + swap (rc4_key, i, j); + + idx = rc4_key->S[i] + rc4_key->S[j]; + + xor4 |= rc4_key->S[idx] << 0; + + i += 1; + j += rc4_key->S[i]; + + swap (rc4_key, i, j); + + idx = rc4_key->S[i] + rc4_key->S[j]; + + xor4 |= rc4_key->S[idx] << 8; + + i += 1; + j += rc4_key->S[i]; + + swap (rc4_key, i, j); + + idx = rc4_key->S[i] + rc4_key->S[j]; + + xor4 |= rc4_key->S[idx] << 16; + + i += 1; + j += rc4_key->S[i]; + + swap (rc4_key, i, j); + + idx = rc4_key->S[i] + rc4_key->S[j]; + + xor4 |= rc4_key->S[idx] << 24; + + out[k] = in[k] ^ xor4; + } + + return j; +} + +static void md5_transform (const u32x w0[4], const u32x w1[4], const u32x w2[4], const u32x w3[4], u32x digest[4]) +{ + u32x a = digest[0]; + u32x b = digest[1]; + u32x c = digest[2]; + u32x d = digest[3]; + + u32x w0_t = w0[0]; + u32x w1_t = w0[1]; + u32x w2_t = w0[2]; + u32x w3_t = w0[3]; + u32x w4_t = w1[0]; + u32x w5_t = w1[1]; + u32x w6_t = w1[2]; + u32x w7_t = w1[3]; + u32x w8_t = w2[0]; + u32x w9_t = w2[1]; + u32x wa_t = w2[2]; + u32x wb_t = w2[3]; + u32x wc_t = w3[0]; + u32x wd_t = w3[1]; + u32x we_t = w3[2]; + u32x wf_t = w3[3]; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t, MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t, MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t, MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t, MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w4_t, MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w5_t, MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w6_t, MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w7_t, MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w8_t, MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w9_t, MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, wa_t, MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, wb_t, MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, wc_t, MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, wd_t, MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, we_t, MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, wf_t, MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w1_t, MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w6_t, MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, wb_t, MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t, MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w5_t, MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, wa_t, MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, wf_t, MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w4_t, MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w9_t, MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, we_t, MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t, MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w8_t, MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, wd_t, MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t, MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w7_t, MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, wc_t, MD5C1f, MD5S13); + + MD5_STEP (MD5_H , a, b, c, d, w5_t, MD5C20, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w8_t, MD5C21, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, wb_t, MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, we_t, MD5C23, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w1_t, MD5C24, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w4_t, MD5C25, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w7_t, MD5C26, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, wa_t, MD5C27, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, wd_t, MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w0_t, MD5C29, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w3_t, MD5C2a, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w6_t, MD5C2b, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w9_t, MD5C2c, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, wc_t, MD5C2d, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, wf_t, MD5C2e, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w2_t, MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t, MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w7_t, MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, we_t, MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w5_t, MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, wc_t, MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t, MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, wa_t, MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t, MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w8_t, MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, wf_t, MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w6_t, MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, wd_t, MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w4_t, MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, wb_t, MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t, MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w9_t, MD5C3f, MD5S33); + + digest[0] += a; + digest[1] += b; + digest[2] += c; + digest[3] += d; +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m09710_m04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global oldoffice01_t *oldoffice01_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + __local RC4_KEY rc4_keys[64]; + + __local RC4_KEY *rc4_key = &rc4_keys[lid]; + + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + u32x pw_buf1[4]; + + pw_buf1[0] = pws[gid].i[ 4]; + pw_buf1[1] = pws[gid].i[ 5]; + pw_buf1[2] = pws[gid].i[ 6]; + pw_buf1[3] = pws[gid].i[ 7]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * esalt + */ + + const u32 version = oldoffice01_bufs[salt_pos].version; + + u32 encryptedVerifier[4]; + + encryptedVerifier[0] = oldoffice01_bufs[salt_pos].encryptedVerifier[0]; + encryptedVerifier[1] = oldoffice01_bufs[salt_pos].encryptedVerifier[1]; + encryptedVerifier[2] = oldoffice01_bufs[salt_pos].encryptedVerifier[2]; + encryptedVerifier[3] = oldoffice01_bufs[salt_pos].encryptedVerifier[3]; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + + w0[0] = pw_buf0[0]; + w0[1] = pw_buf0[1]; + w0[2] = pw_buf0[2]; + w0[3] = pw_buf0[3]; + + u32x w1[4]; + + w1[0] = pw_buf1[0]; + w1[1] = pw_buf1[1]; + w1[2] = pw_buf1[2]; + w1[3] = pw_buf1[3]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + apply_rules (rules_buf[il_pos].cmds, w0, w1, pw_len); + + // first md5 to generate RC4 128 bit key + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + w0_t[0] = w0[0]; + w0_t[1] = w0[1] & 0xff; + w0_t[2] = 0x8000; + w0_t[3] = 0; + w1_t[0] = 0; + w1_t[1] = 0; + w1_t[2] = 0; + w1_t[3] = 0; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 9 * 8; + w3_t[3] = 0; + + u32x digest[4]; + + digest[0] = MD5M_A; + digest[1] = MD5M_B; + digest[2] = MD5M_C; + digest[3] = MD5M_D; + + md5_transform (w0_t, w1_t, w2_t, w3_t, digest); + + // now the RC4 part + + u32x key[4]; + + key[0] = digest[0]; + key[1] = digest[1]; + key[2] = digest[2]; + key[3] = digest[3]; + + rc4_init_16 (rc4_key, key); + + u32x out[4]; + + u8 j = rc4_next_16 (rc4_key, 0, 0, encryptedVerifier, out); + + w0_t[0] = out[0]; + w0_t[1] = out[1]; + w0_t[2] = out[2]; + w0_t[3] = out[3]; + w1_t[0] = 0x80; + w1_t[1] = 0; + w1_t[2] = 0; + w1_t[3] = 0; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 16 * 8; + w3_t[3] = 0; + + digest[0] = MD5M_A; + digest[1] = MD5M_B; + digest[2] = MD5M_C; + digest[3] = MD5M_D; + + md5_transform (w0_t, w1_t, w2_t, w3_t, digest); + + rc4_next_16 (rc4_key, 16, j, digest, out); + + const u32x r0 = out[0]; + const u32x r1 = out[1]; + const u32x r2 = out[2]; + const u32x r3 = out[3]; + + #include VECT_COMPARE_M + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m09710_m08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global oldoffice01_t *oldoffice01_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m09710_m16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global oldoffice01_t *oldoffice01_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m09710_s04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global oldoffice01_t *oldoffice01_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + __local RC4_KEY rc4_keys[64]; + + __local RC4_KEY *rc4_key = &rc4_keys[lid]; + + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + u32x pw_buf1[4]; + + pw_buf1[0] = pws[gid].i[ 4]; + pw_buf1[1] = pws[gid].i[ 5]; + pw_buf1[2] = pws[gid].i[ 6]; + pw_buf1[3] = pws[gid].i[ 7]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * esalt + */ + + const u32 version = oldoffice01_bufs[salt_pos].version; + + u32 encryptedVerifier[4]; + + encryptedVerifier[0] = oldoffice01_bufs[salt_pos].encryptedVerifier[0]; + encryptedVerifier[1] = oldoffice01_bufs[salt_pos].encryptedVerifier[1]; + encryptedVerifier[2] = oldoffice01_bufs[salt_pos].encryptedVerifier[2]; + encryptedVerifier[3] = oldoffice01_bufs[salt_pos].encryptedVerifier[3]; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + + w0[0] = pw_buf0[0]; + w0[1] = pw_buf0[1]; + w0[2] = pw_buf0[2]; + w0[3] = pw_buf0[3]; + + u32x w1[4]; + + w1[0] = pw_buf1[0]; + w1[1] = pw_buf1[1]; + w1[2] = pw_buf1[2]; + w1[3] = pw_buf1[3]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + apply_rules (rules_buf[il_pos].cmds, w0, w1, pw_len); + + // first md5 to generate RC4 128 bit key + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + w0_t[0] = w0[0]; + w0_t[1] = w0[1] & 0xff; + w0_t[2] = 0x8000; + w0_t[3] = 0; + w1_t[0] = 0; + w1_t[1] = 0; + w1_t[2] = 0; + w1_t[3] = 0; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 9 * 8; + w3_t[3] = 0; + + u32x digest[4]; + + digest[0] = MD5M_A; + digest[1] = MD5M_B; + digest[2] = MD5M_C; + digest[3] = MD5M_D; + + md5_transform (w0_t, w1_t, w2_t, w3_t, digest); + + // now the RC4 part + + u32x key[4]; + + key[0] = digest[0]; + key[1] = digest[1]; + key[2] = digest[2]; + key[3] = digest[3]; + + rc4_init_16 (rc4_key, key); + + u32x out[4]; + + u8 j = rc4_next_16 (rc4_key, 0, 0, encryptedVerifier, out); + + w0_t[0] = out[0]; + w0_t[1] = out[1]; + w0_t[2] = out[2]; + w0_t[3] = out[3]; + w1_t[0] = 0x80; + w1_t[1] = 0; + w1_t[2] = 0; + w1_t[3] = 0; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 16 * 8; + w3_t[3] = 0; + + digest[0] = MD5M_A; + digest[1] = MD5M_B; + digest[2] = MD5M_C; + digest[3] = MD5M_D; + + md5_transform (w0_t, w1_t, w2_t, w3_t, digest); + + rc4_next_16 (rc4_key, 16, j, digest, out); + + const u32x r0 = out[0]; + const u32x r1 = out[1]; + const u32x r2 = out[2]; + const u32x r3 = out[3]; + + #include VECT_COMPARE_S + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m09710_s08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global oldoffice01_t *oldoffice01_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m09710_s16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global oldoffice01_t *oldoffice01_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/amd/m09710_a1.cl b/amd/m09710_a1.cl new file mode 100644 index 0000000000..87acd45be7 --- /dev/null +++ b/amd/m09710_a1.cl @@ -0,0 +1,679 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _OLDOFFICE01_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW4 +#define VECT_SIZE1 +#endif + +#ifdef VLIW5 +#define VECT_SIZE1 +#endif + +#define DGST_R0 0 +#define DGST_R1 1 +#define DGST_R2 2 +#define DGST_R3 3 + +#include "include/kernel_functions.c" +#include "types_amd.c" +#include "common_amd.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +typedef struct +{ + u8 S[256]; + + u32 wtf_its_faster; + +} RC4_KEY; + +static void swap (__local RC4_KEY *rc4_key, const u8 i, const u8 j) +{ + u8 tmp; + + tmp = rc4_key->S[i]; + rc4_key->S[i] = rc4_key->S[j]; + rc4_key->S[j] = tmp; +} + +static void rc4_init_16 (__local RC4_KEY *rc4_key, const u32 data[4]) +{ + u32 v = 0x03020100; + u32 a = 0x04040404; + + __local u32 *ptr = (__local u32 *) rc4_key->S; + + #pragma unroll + for (u32 i = 0; i < 64; i++) + { + *ptr++ = v; v += a; + } + + u32 j = 0; + + #pragma unroll + for (u32 i = 0; i < 16; i++) + { + u32 idx = i * 16; + + u32 v; + + v = data[0]; + + j += rc4_key->S[idx] + (v >> 0); swap (rc4_key, idx, j); idx++; + j += rc4_key->S[idx] + (v >> 8); swap (rc4_key, idx, j); idx++; + j += rc4_key->S[idx] + (v >> 16); swap (rc4_key, idx, j); idx++; + j += rc4_key->S[idx] + (v >> 24); swap (rc4_key, idx, j); idx++; + + v = data[1]; + + j += rc4_key->S[idx] + (v >> 0); swap (rc4_key, idx, j); idx++; + j += rc4_key->S[idx] + (v >> 8); swap (rc4_key, idx, j); idx++; + j += rc4_key->S[idx] + (v >> 16); swap (rc4_key, idx, j); idx++; + j += rc4_key->S[idx] + (v >> 24); swap (rc4_key, idx, j); idx++; + + v = data[2]; + + j += rc4_key->S[idx] + (v >> 0); swap (rc4_key, idx, j); idx++; + j += rc4_key->S[idx] + (v >> 8); swap (rc4_key, idx, j); idx++; + j += rc4_key->S[idx] + (v >> 16); swap (rc4_key, idx, j); idx++; + j += rc4_key->S[idx] + (v >> 24); swap (rc4_key, idx, j); idx++; + + v = data[3]; + + j += rc4_key->S[idx] + (v >> 0); swap (rc4_key, idx, j); idx++; + j += rc4_key->S[idx] + (v >> 8); swap (rc4_key, idx, j); idx++; + j += rc4_key->S[idx] + (v >> 16); swap (rc4_key, idx, j); idx++; + j += rc4_key->S[idx] + (v >> 24); swap (rc4_key, idx, j); idx++; + } +} + +static u8 rc4_next_16 (__local RC4_KEY *rc4_key, u8 i, u8 j, const u32 in[4], u32 out[4]) +{ + #pragma unroll + for (u32 k = 0; k < 4; k++) + { + u32 xor4 = 0; + + u8 idx; + + i += 1; + j += rc4_key->S[i]; + + swap (rc4_key, i, j); + + idx = rc4_key->S[i] + rc4_key->S[j]; + + xor4 |= rc4_key->S[idx] << 0; + + i += 1; + j += rc4_key->S[i]; + + swap (rc4_key, i, j); + + idx = rc4_key->S[i] + rc4_key->S[j]; + + xor4 |= rc4_key->S[idx] << 8; + + i += 1; + j += rc4_key->S[i]; + + swap (rc4_key, i, j); + + idx = rc4_key->S[i] + rc4_key->S[j]; + + xor4 |= rc4_key->S[idx] << 16; + + i += 1; + j += rc4_key->S[i]; + + swap (rc4_key, i, j); + + idx = rc4_key->S[i] + rc4_key->S[j]; + + xor4 |= rc4_key->S[idx] << 24; + + out[k] = in[k] ^ xor4; + } + + return j; +} + +static void md5_transform (const u32x w0[4], const u32x w1[4], const u32x w2[4], const u32x w3[4], u32x digest[4]) +{ + u32x a = digest[0]; + u32x b = digest[1]; + u32x c = digest[2]; + u32x d = digest[3]; + + u32x w0_t = w0[0]; + u32x w1_t = w0[1]; + u32x w2_t = w0[2]; + u32x w3_t = w0[3]; + u32x w4_t = w1[0]; + u32x w5_t = w1[1]; + u32x w6_t = w1[2]; + u32x w7_t = w1[3]; + u32x w8_t = w2[0]; + u32x w9_t = w2[1]; + u32x wa_t = w2[2]; + u32x wb_t = w2[3]; + u32x wc_t = w3[0]; + u32x wd_t = w3[1]; + u32x we_t = w3[2]; + u32x wf_t = w3[3]; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t, MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t, MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t, MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t, MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w4_t, MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w5_t, MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w6_t, MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w7_t, MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w8_t, MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w9_t, MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, wa_t, MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, wb_t, MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, wc_t, MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, wd_t, MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, we_t, MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, wf_t, MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w1_t, MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w6_t, MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, wb_t, MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t, MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w5_t, MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, wa_t, MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, wf_t, MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w4_t, MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w9_t, MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, we_t, MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t, MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w8_t, MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, wd_t, MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t, MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w7_t, MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, wc_t, MD5C1f, MD5S13); + + MD5_STEP (MD5_H , a, b, c, d, w5_t, MD5C20, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w8_t, MD5C21, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, wb_t, MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, we_t, MD5C23, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w1_t, MD5C24, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w4_t, MD5C25, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w7_t, MD5C26, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, wa_t, MD5C27, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, wd_t, MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w0_t, MD5C29, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w3_t, MD5C2a, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w6_t, MD5C2b, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w9_t, MD5C2c, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, wc_t, MD5C2d, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, wf_t, MD5C2e, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w2_t, MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t, MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w7_t, MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, we_t, MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w5_t, MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, wc_t, MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t, MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, wa_t, MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t, MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w8_t, MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, wf_t, MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w6_t, MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, wd_t, MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w4_t, MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, wb_t, MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t, MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w9_t, MD5C3f, MD5S33); + + digest[0] += a; + digest[1] += b; + digest[2] += c; + digest[3] += d; +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m09710_m04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global oldoffice01_t *oldoffice01_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + __local RC4_KEY rc4_keys[64]; + + __local RC4_KEY *rc4_key = &rc4_keys[lid]; + + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, combs_buf[0].pw_len); + } + + /** + * esalt + */ + + const u32 version = oldoffice01_bufs[salt_pos].version; + + u32 encryptedVerifier[4]; + + encryptedVerifier[0] = oldoffice01_bufs[salt_pos].encryptedVerifier[0]; + encryptedVerifier[1] = oldoffice01_bufs[salt_pos].encryptedVerifier[1]; + encryptedVerifier[2] = oldoffice01_bufs[salt_pos].encryptedVerifier[2]; + encryptedVerifier[3] = oldoffice01_bufs[salt_pos].encryptedVerifier[3]; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = combs_buf[il_pos].pw_len; + + const u32 pw_len = pw_l_len + pw_r_len; + + u32 wordr0[4]; + + wordr0[0] = combs_buf[il_pos].i[0]; + wordr0[1] = combs_buf[il_pos].i[1]; + wordr0[2] = combs_buf[il_pos].i[2]; + wordr0[3] = combs_buf[il_pos].i[3]; + + u32 wordr1[4]; + + wordr1[0] = combs_buf[il_pos].i[4]; + wordr1[1] = combs_buf[il_pos].i[5]; + wordr1[2] = combs_buf[il_pos].i[6]; + wordr1[3] = combs_buf[il_pos].i[7]; + + u32 wordr2[4]; + + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + + u32 wordr3[4]; + + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + // first md5 to generate RC4 128 bit key + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + w0_t[0] = wordl0[0] | wordr0[0]; + w0_t[1] = (wordl0[1] | wordr0[1]) & 0xff; + w0_t[2] = 0x8000; + w0_t[3] = 0; + w1_t[0] = 0; + w1_t[1] = 0; + w1_t[2] = 0; + w1_t[3] = 0; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 9 * 8; + w3_t[3] = 0; + + u32x digest[4]; + + digest[0] = MD5M_A; + digest[1] = MD5M_B; + digest[2] = MD5M_C; + digest[3] = MD5M_D; + + md5_transform (w0_t, w1_t, w2_t, w3_t, digest); + + // now the RC4 part + + u32x key[4]; + + key[0] = digest[0]; + key[1] = digest[1]; + key[2] = digest[2]; + key[3] = digest[3]; + + rc4_init_16 (rc4_key, key); + + u32x out[4]; + + u8 j = rc4_next_16 (rc4_key, 0, 0, encryptedVerifier, out); + + w0_t[0] = out[0]; + w0_t[1] = out[1]; + w0_t[2] = out[2]; + w0_t[3] = out[3]; + w1_t[0] = 0x80; + w1_t[1] = 0; + w1_t[2] = 0; + w1_t[3] = 0; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 16 * 8; + w3_t[3] = 0; + + digest[0] = MD5M_A; + digest[1] = MD5M_B; + digest[2] = MD5M_C; + digest[3] = MD5M_D; + + md5_transform (w0_t, w1_t, w2_t, w3_t, digest); + + rc4_next_16 (rc4_key, 16, j, digest, out); + + const u32x r0 = out[0]; + const u32x r1 = out[1]; + const u32x r2 = out[2]; + const u32x r3 = out[3]; + + #include VECT_COMPARE_M + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m09710_m08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global oldoffice01_t *oldoffice01_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m09710_m16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global oldoffice01_t *oldoffice01_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m09710_s04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global oldoffice01_t *oldoffice01_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + __local RC4_KEY rc4_keys[64]; + + __local RC4_KEY *rc4_key = &rc4_keys[lid]; + + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, combs_buf[0].pw_len); + } + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * esalt + */ + + const u32 version = oldoffice01_bufs[salt_pos].version; + + u32 encryptedVerifier[4]; + + encryptedVerifier[0] = oldoffice01_bufs[salt_pos].encryptedVerifier[0]; + encryptedVerifier[1] = oldoffice01_bufs[salt_pos].encryptedVerifier[1]; + encryptedVerifier[2] = oldoffice01_bufs[salt_pos].encryptedVerifier[2]; + encryptedVerifier[3] = oldoffice01_bufs[salt_pos].encryptedVerifier[3]; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = combs_buf[il_pos].pw_len; + + const u32 pw_len = pw_l_len + pw_r_len; + + u32 wordr0[4]; + + wordr0[0] = combs_buf[il_pos].i[0]; + wordr0[1] = combs_buf[il_pos].i[1]; + wordr0[2] = combs_buf[il_pos].i[2]; + wordr0[3] = combs_buf[il_pos].i[3]; + + u32 wordr1[4]; + + wordr1[0] = combs_buf[il_pos].i[4]; + wordr1[1] = combs_buf[il_pos].i[5]; + wordr1[2] = combs_buf[il_pos].i[6]; + wordr1[3] = combs_buf[il_pos].i[7]; + + u32 wordr2[4]; + + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + + u32 wordr3[4]; + + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + // first md5 to generate RC4 128 bit key + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + w0_t[0] = wordl0[0] | wordr0[0]; + w0_t[1] = (wordl0[1] | wordr0[1]) & 0xff; + w0_t[2] = 0x8000; + w0_t[3] = 0; + w1_t[0] = 0; + w1_t[1] = 0; + w1_t[2] = 0; + w1_t[3] = 0; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 9 * 8; + w3_t[3] = 0; + + u32x digest[4]; + + digest[0] = MD5M_A; + digest[1] = MD5M_B; + digest[2] = MD5M_C; + digest[3] = MD5M_D; + + md5_transform (w0_t, w1_t, w2_t, w3_t, digest); + + // now the RC4 part + + u32x key[4]; + + key[0] = digest[0]; + key[1] = digest[1]; + key[2] = digest[2]; + key[3] = digest[3]; + + rc4_init_16 (rc4_key, key); + + u32x out[4]; + + u8 j = rc4_next_16 (rc4_key, 0, 0, encryptedVerifier, out); + + w0_t[0] = out[0]; + w0_t[1] = out[1]; + w0_t[2] = out[2]; + w0_t[3] = out[3]; + w1_t[0] = 0x80; + w1_t[1] = 0; + w1_t[2] = 0; + w1_t[3] = 0; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 16 * 8; + w3_t[3] = 0; + + digest[0] = MD5M_A; + digest[1] = MD5M_B; + digest[2] = MD5M_C; + digest[3] = MD5M_D; + + md5_transform (w0_t, w1_t, w2_t, w3_t, digest); + + rc4_next_16 (rc4_key, 16, j, digest, out); + + const u32x r0 = out[0]; + const u32x r1 = out[1]; + const u32x r2 = out[2]; + const u32x r3 = out[3]; + + #include VECT_COMPARE_S + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m09710_s08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global oldoffice01_t *oldoffice01_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m09710_s16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global oldoffice01_t *oldoffice01_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/amd/m09710_a3.cl b/amd/m09710_a3.cl new file mode 100644 index 0000000000..326af7a37b --- /dev/null +++ b/amd/m09710_a3.cl @@ -0,0 +1,622 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _OLDOFFICE01_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW4 +#define VECT_SIZE1 +#endif + +#ifdef VLIW5 +#define VECT_SIZE1 +#endif + +#define DGST_R0 0 +#define DGST_R1 1 +#define DGST_R2 2 +#define DGST_R3 3 + +#include "include/kernel_functions.c" +#include "types_amd.c" +#include "common_amd.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +typedef struct +{ + u8 S[256]; + + u32 wtf_its_faster; + +} RC4_KEY; + +static void swap (__local RC4_KEY *rc4_key, const u8 i, const u8 j) +{ + u8 tmp; + + tmp = rc4_key->S[i]; + rc4_key->S[i] = rc4_key->S[j]; + rc4_key->S[j] = tmp; +} + +static void rc4_init_16 (__local RC4_KEY *rc4_key, const u32 data[4]) +{ + u32 v = 0x03020100; + u32 a = 0x04040404; + + __local u32 *ptr = (__local u32 *) rc4_key->S; + + #pragma unroll + for (u32 i = 0; i < 64; i++) + { + *ptr++ = v; v += a; + } + + u32 j = 0; + + #pragma unroll + for (u32 i = 0; i < 16; i++) + { + u32 idx = i * 16; + + u32 v; + + v = data[0]; + + j += rc4_key->S[idx] + (v >> 0); swap (rc4_key, idx, j); idx++; + j += rc4_key->S[idx] + (v >> 8); swap (rc4_key, idx, j); idx++; + j += rc4_key->S[idx] + (v >> 16); swap (rc4_key, idx, j); idx++; + j += rc4_key->S[idx] + (v >> 24); swap (rc4_key, idx, j); idx++; + + v = data[1]; + + j += rc4_key->S[idx] + (v >> 0); swap (rc4_key, idx, j); idx++; + j += rc4_key->S[idx] + (v >> 8); swap (rc4_key, idx, j); idx++; + j += rc4_key->S[idx] + (v >> 16); swap (rc4_key, idx, j); idx++; + j += rc4_key->S[idx] + (v >> 24); swap (rc4_key, idx, j); idx++; + + v = data[2]; + + j += rc4_key->S[idx] + (v >> 0); swap (rc4_key, idx, j); idx++; + j += rc4_key->S[idx] + (v >> 8); swap (rc4_key, idx, j); idx++; + j += rc4_key->S[idx] + (v >> 16); swap (rc4_key, idx, j); idx++; + j += rc4_key->S[idx] + (v >> 24); swap (rc4_key, idx, j); idx++; + + v = data[3]; + + j += rc4_key->S[idx] + (v >> 0); swap (rc4_key, idx, j); idx++; + j += rc4_key->S[idx] + (v >> 8); swap (rc4_key, idx, j); idx++; + j += rc4_key->S[idx] + (v >> 16); swap (rc4_key, idx, j); idx++; + j += rc4_key->S[idx] + (v >> 24); swap (rc4_key, idx, j); idx++; + } +} + +static u8 rc4_next_16 (__local RC4_KEY *rc4_key, u8 i, u8 j, const u32 in[4], u32 out[4]) +{ + #pragma unroll + for (u32 k = 0; k < 4; k++) + { + u32 xor4 = 0; + + u8 idx; + + i += 1; + j += rc4_key->S[i]; + + swap (rc4_key, i, j); + + idx = rc4_key->S[i] + rc4_key->S[j]; + + xor4 |= rc4_key->S[idx] << 0; + + i += 1; + j += rc4_key->S[i]; + + swap (rc4_key, i, j); + + idx = rc4_key->S[i] + rc4_key->S[j]; + + xor4 |= rc4_key->S[idx] << 8; + + i += 1; + j += rc4_key->S[i]; + + swap (rc4_key, i, j); + + idx = rc4_key->S[i] + rc4_key->S[j]; + + xor4 |= rc4_key->S[idx] << 16; + + i += 1; + j += rc4_key->S[i]; + + swap (rc4_key, i, j); + + idx = rc4_key->S[i] + rc4_key->S[j]; + + xor4 |= rc4_key->S[idx] << 24; + + out[k] = in[k] ^ xor4; + } + + return j; +} + +static void md5_transform (const u32x w0[4], const u32x w1[4], const u32x w2[4], const u32x w3[4], u32x digest[4]) +{ + u32x a = digest[0]; + u32x b = digest[1]; + u32x c = digest[2]; + u32x d = digest[3]; + + u32x w0_t = w0[0]; + u32x w1_t = w0[1]; + u32x w2_t = w0[2]; + u32x w3_t = w0[3]; + u32x w4_t = w1[0]; + u32x w5_t = w1[1]; + u32x w6_t = w1[2]; + u32x w7_t = w1[3]; + u32x w8_t = w2[0]; + u32x w9_t = w2[1]; + u32x wa_t = w2[2]; + u32x wb_t = w2[3]; + u32x wc_t = w3[0]; + u32x wd_t = w3[1]; + u32x we_t = w3[2]; + u32x wf_t = w3[3]; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t, MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t, MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t, MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t, MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w4_t, MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w5_t, MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w6_t, MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w7_t, MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w8_t, MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w9_t, MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, wa_t, MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, wb_t, MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, wc_t, MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, wd_t, MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, we_t, MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, wf_t, MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w1_t, MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w6_t, MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, wb_t, MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t, MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w5_t, MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, wa_t, MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, wf_t, MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w4_t, MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w9_t, MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, we_t, MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t, MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w8_t, MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, wd_t, MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t, MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w7_t, MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, wc_t, MD5C1f, MD5S13); + + MD5_STEP (MD5_H , a, b, c, d, w5_t, MD5C20, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w8_t, MD5C21, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, wb_t, MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, we_t, MD5C23, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w1_t, MD5C24, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w4_t, MD5C25, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w7_t, MD5C26, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, wa_t, MD5C27, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, wd_t, MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w0_t, MD5C29, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w3_t, MD5C2a, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w6_t, MD5C2b, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w9_t, MD5C2c, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, wc_t, MD5C2d, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, wf_t, MD5C2e, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w2_t, MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t, MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w7_t, MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, we_t, MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w5_t, MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, wc_t, MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t, MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, wa_t, MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t, MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w8_t, MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, wf_t, MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w6_t, MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, wd_t, MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w4_t, MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, wb_t, MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t, MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w9_t, MD5C3f, MD5S33); + + digest[0] += a; + digest[1] += b; + digest[2] += c; + digest[3] += d; +} + +static void m09710m (__local RC4_KEY rc4_keys[64], u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], const u32 pw_len, __global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global oldoffice01_t *oldoffice01_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset) +{ + /** + * modifier + */ + + const u32 gid = get_global_id (0); + const u32 lid = get_local_id (0); + + __local RC4_KEY *rc4_key = &rc4_keys[lid]; + + /** + * esalt + */ + + const u32 version = oldoffice01_bufs[salt_pos].version; + + u32 encryptedVerifier[4]; + + encryptedVerifier[0] = oldoffice01_bufs[salt_pos].encryptedVerifier[0]; + encryptedVerifier[1] = oldoffice01_bufs[salt_pos].encryptedVerifier[1]; + encryptedVerifier[2] = oldoffice01_bufs[salt_pos].encryptedVerifier[2]; + encryptedVerifier[3] = oldoffice01_bufs[salt_pos].encryptedVerifier[3]; + + /** + * loop + */ + + u32x w0l = w0[0]; + + for (u32 il_pos = 0; il_pos < bfs_cnt; il_pos++) + { + const u32 w0r = bfs_buf[il_pos].i; + + w0[0] = w0l | w0r; + + // first md5 to generate RC4 128 bit key + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + w0_t[0] = w0[0]; + w0_t[1] = w0[1] & 0xff; + w0_t[2] = 0x8000; + w0_t[3] = 0; + w1_t[0] = 0; + w1_t[1] = 0; + w1_t[2] = 0; + w1_t[3] = 0; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 9 * 8; + w3_t[3] = 0; + + u32x digest[4]; + + digest[0] = MD5M_A; + digest[1] = MD5M_B; + digest[2] = MD5M_C; + digest[3] = MD5M_D; + + md5_transform (w0_t, w1_t, w2_t, w3_t, digest); + + // now the RC4 part + + u32x key[4]; + + key[0] = digest[0]; + key[1] = digest[1]; + key[2] = digest[2]; + key[3] = digest[3]; + + rc4_init_16 (rc4_key, key); + + u32x out[4]; + + u8 j = rc4_next_16 (rc4_key, 0, 0, encryptedVerifier, out); + + w0_t[0] = out[0]; + w0_t[1] = out[1]; + w0_t[2] = out[2]; + w0_t[3] = out[3]; + w1_t[0] = 0x80; + w1_t[1] = 0; + w1_t[2] = 0; + w1_t[3] = 0; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 16 * 8; + w3_t[3] = 0; + + digest[0] = MD5M_A; + digest[1] = MD5M_B; + digest[2] = MD5M_C; + digest[3] = MD5M_D; + + md5_transform (w0_t, w1_t, w2_t, w3_t, digest); + + rc4_next_16 (rc4_key, 16, j, digest, out); + + const u32x r0 = out[0]; + const u32x r1 = out[1]; + const u32x r2 = out[2]; + const u32x r3 = out[3]; + + #include VECT_COMPARE_M + } +} + +static void m09710s (__local RC4_KEY rc4_keys[64], u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], const u32 pw_len, __global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global oldoffice01_t *oldoffice01_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset) +{ + /** + * modifier + */ + + const u32 gid = get_global_id (0); + const u32 lid = get_local_id (0); + + __local RC4_KEY *rc4_key = &rc4_keys[lid]; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * esalt + */ + + const u32 version = oldoffice01_bufs[salt_pos].version; + + u32 encryptedVerifier[4]; + + encryptedVerifier[0] = oldoffice01_bufs[salt_pos].encryptedVerifier[0]; + encryptedVerifier[1] = oldoffice01_bufs[salt_pos].encryptedVerifier[1]; + encryptedVerifier[2] = oldoffice01_bufs[salt_pos].encryptedVerifier[2]; + encryptedVerifier[3] = oldoffice01_bufs[salt_pos].encryptedVerifier[3]; + + /** + * loop + */ + + u32x w0l = w0[0]; + + for (u32 il_pos = 0; il_pos < bfs_cnt; il_pos++) + { + const u32 w0r = bfs_buf[il_pos].i; + + w0[0] = w0l | w0r; + + // first md5 to generate RC4 128 bit key + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + w0_t[0] = w0[0]; + w0_t[1] = w0[1] & 0xff; + w0_t[2] = 0x8000; + w0_t[3] = 0; + w1_t[0] = 0; + w1_t[1] = 0; + w1_t[2] = 0; + w1_t[3] = 0; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 9 * 8; + w3_t[3] = 0; + + u32x digest[4]; + + digest[0] = MD5M_A; + digest[1] = MD5M_B; + digest[2] = MD5M_C; + digest[3] = MD5M_D; + + md5_transform (w0_t, w1_t, w2_t, w3_t, digest); + + // now the RC4 part + + u32x key[4]; + + key[0] = digest[0]; + key[1] = digest[1]; + key[2] = digest[2]; + key[3] = digest[3]; + + rc4_init_16 (rc4_key, key); + + u32x out[4]; + + u8 j = rc4_next_16 (rc4_key, 0, 0, encryptedVerifier, out); + + w0_t[0] = out[0]; + w0_t[1] = out[1]; + w0_t[2] = out[2]; + w0_t[3] = out[3]; + w1_t[0] = 0x80; + w1_t[1] = 0; + w1_t[2] = 0; + w1_t[3] = 0; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 16 * 8; + w3_t[3] = 0; + + digest[0] = MD5M_A; + digest[1] = MD5M_B; + digest[2] = MD5M_C; + digest[3] = MD5M_D; + + md5_transform (w0_t, w1_t, w2_t, w3_t, digest); + + rc4_next_16 (rc4_key, 16, j, digest, out); + + const u32x r0 = out[0]; + const u32x r1 = out[1]; + const u32x r2 = out[2]; + const u32x r3 = out[3]; + + #include VECT_COMPARE_S + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m09710_m04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global oldoffice01_t *oldoffice01_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + __local RC4_KEY rc4_keys[64]; + + m09710m (rc4_keys, w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, oldoffice01_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m09710_m08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global oldoffice01_t *oldoffice01_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m09710_m16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global oldoffice01_t *oldoffice01_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m09710_s04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global oldoffice01_t *oldoffice01_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + __local RC4_KEY rc4_keys[64]; + + m09710s (rc4_keys, w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, oldoffice01_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m09710_s08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global oldoffice01_t *oldoffice01_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m09710_s16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global oldoffice01_t *oldoffice01_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/amd/m09720_a0.cl b/amd/m09720_a0.cl new file mode 100644 index 0000000000..43168f9432 --- /dev/null +++ b/amd/m09720_a0.cl @@ -0,0 +1,769 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _OLDOFFICE01_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW4 +#define VECT_SIZE2 +#endif + +#ifdef VLIW5 +#define VECT_SIZE2 +#endif + +#define DGST_R0 0 +#define DGST_R1 1 +#define DGST_R2 2 +#define DGST_R3 3 + +#include "include/kernel_functions.c" +#include "types_amd.c" +#include "common_amd.c" +#include "include/rp_gpu.h" +#include "rp_amd.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +static void md5_transform (const u32x w0[4], const u32x w1[4], const u32x w2[4], const u32x w3[4], u32x digest[4]) +{ + u32x a = digest[0]; + u32x b = digest[1]; + u32x c = digest[2]; + u32x d = digest[3]; + + u32x w0_t = w0[0]; + u32x w1_t = w0[1]; + u32x w2_t = w0[2]; + u32x w3_t = w0[3]; + u32x w4_t = w1[0]; + u32x w5_t = w1[1]; + u32x w6_t = w1[2]; + u32x w7_t = w1[3]; + u32x w8_t = w2[0]; + u32x w9_t = w2[1]; + u32x wa_t = w2[2]; + u32x wb_t = w2[3]; + u32x wc_t = w3[0]; + u32x wd_t = w3[1]; + u32x we_t = w3[2]; + u32x wf_t = w3[3]; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t, MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t, MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t, MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t, MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w4_t, MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w5_t, MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w6_t, MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w7_t, MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w8_t, MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w9_t, MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, wa_t, MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, wb_t, MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, wc_t, MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, wd_t, MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, we_t, MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, wf_t, MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w1_t, MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w6_t, MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, wb_t, MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t, MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w5_t, MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, wa_t, MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, wf_t, MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w4_t, MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w9_t, MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, we_t, MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t, MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w8_t, MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, wd_t, MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t, MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w7_t, MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, wc_t, MD5C1f, MD5S13); + + MD5_STEP (MD5_H , a, b, c, d, w5_t, MD5C20, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w8_t, MD5C21, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, wb_t, MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, we_t, MD5C23, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w1_t, MD5C24, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w4_t, MD5C25, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w7_t, MD5C26, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, wa_t, MD5C27, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, wd_t, MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w0_t, MD5C29, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w3_t, MD5C2a, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w6_t, MD5C2b, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w9_t, MD5C2c, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, wc_t, MD5C2d, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, wf_t, MD5C2e, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w2_t, MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t, MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w7_t, MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, we_t, MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w5_t, MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, wc_t, MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t, MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, wa_t, MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t, MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w8_t, MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, wf_t, MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w6_t, MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, wd_t, MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w4_t, MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, wb_t, MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t, MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w9_t, MD5C3f, MD5S33); + + digest[0] += a; + digest[1] += b; + digest[2] += c; + digest[3] += d; +} + +static void gen336 (u32x digest_pre[4], u32 salt_buf[4], u32x digest[4]) +{ + u32x digest_t0[2]; + u32x digest_t1[2]; + u32x digest_t2[2]; + u32x digest_t3[2]; + + digest_t0[0] = digest_pre[0]; + digest_t0[1] = digest_pre[1] & 0xff; + + digest_t1[0] = digest_pre[0] << 8; + digest_t1[1] = digest_pre[0] >> 24 | digest_pre[1] << 8; + + digest_t2[0] = digest_pre[0] << 16; + digest_t2[1] = digest_pre[0] >> 16 | digest_pre[1] << 16; + + digest_t3[0] = digest_pre[0] << 24; + digest_t3[1] = digest_pre[0] >> 8 | digest_pre[1] << 24; + + u32 salt_buf_t0[4]; + u32 salt_buf_t1[5]; + u32 salt_buf_t2[5]; + u32 salt_buf_t3[5]; + + salt_buf_t0[0] = salt_buf[0]; + salt_buf_t0[1] = salt_buf[1]; + salt_buf_t0[2] = salt_buf[2]; + salt_buf_t0[3] = salt_buf[3]; + + salt_buf_t1[0] = salt_buf[0] << 8; + salt_buf_t1[1] = salt_buf[0] >> 24 | salt_buf[1] << 8; + salt_buf_t1[2] = salt_buf[1] >> 24 | salt_buf[2] << 8; + salt_buf_t1[3] = salt_buf[2] >> 24 | salt_buf[3] << 8; + salt_buf_t1[4] = salt_buf[3] >> 24; + + salt_buf_t2[0] = salt_buf[0] << 16; + salt_buf_t2[1] = salt_buf[0] >> 16 | salt_buf[1] << 16; + salt_buf_t2[2] = salt_buf[1] >> 16 | salt_buf[2] << 16; + salt_buf_t2[3] = salt_buf[2] >> 16 | salt_buf[3] << 16; + salt_buf_t2[4] = salt_buf[3] >> 16; + + salt_buf_t3[0] = salt_buf[0] << 24; + salt_buf_t3[1] = salt_buf[0] >> 8 | salt_buf[1] << 24; + salt_buf_t3[2] = salt_buf[1] >> 8 | salt_buf[2] << 24; + salt_buf_t3[3] = salt_buf[2] >> 8 | salt_buf[3] << 24; + salt_buf_t3[4] = salt_buf[3] >> 8; + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + // generate the 16 * 21 buffer + + w0_t[0] = 0; + w0_t[1] = 0; + w0_t[2] = 0; + w0_t[3] = 0; + w1_t[0] = 0; + w1_t[1] = 0; + w1_t[2] = 0; + w1_t[3] = 0; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = 0; + + // 0..5 + w0_t[0] = digest_t0[0]; + w0_t[1] = digest_t0[1]; + + // 5..21 + w0_t[1] |= salt_buf_t1[0]; + w0_t[2] = salt_buf_t1[1]; + w0_t[3] = salt_buf_t1[2]; + w1_t[0] = salt_buf_t1[3]; + w1_t[1] = salt_buf_t1[4]; + + // 21..26 + w1_t[1] |= digest_t1[0]; + w1_t[2] = digest_t1[1]; + + // 26..42 + w1_t[2] |= salt_buf_t2[0]; + w1_t[3] = salt_buf_t2[1]; + w2_t[0] = salt_buf_t2[2]; + w2_t[1] = salt_buf_t2[3]; + w2_t[2] = salt_buf_t2[4]; + + // 42..47 + w2_t[2] |= digest_t2[0]; + w2_t[3] = digest_t2[1]; + + // 47..63 + w2_t[3] |= salt_buf_t3[0]; + w3_t[0] = salt_buf_t3[1]; + w3_t[1] = salt_buf_t3[2]; + w3_t[2] = salt_buf_t3[3]; + w3_t[3] = salt_buf_t3[4]; + + // 63.. + + w3_t[3] |= digest_t3[0]; + + md5_transform (w0_t, w1_t, w2_t, w3_t, digest); + + w0_t[0] = 0; + w0_t[1] = 0; + w0_t[2] = 0; + w0_t[3] = 0; + w1_t[0] = 0; + w1_t[1] = 0; + w1_t[2] = 0; + w1_t[3] = 0; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = 0; + + // 0..4 + w0_t[0] = digest_t3[1]; + + // 4..20 + w0_t[1] = salt_buf_t0[0]; + w0_t[2] = salt_buf_t0[1]; + w0_t[3] = salt_buf_t0[2]; + w1_t[0] = salt_buf_t0[3]; + + // 20..25 + w1_t[1] = digest_t0[0]; + w1_t[2] = digest_t0[1]; + + // 25..41 + w1_t[2] |= salt_buf_t1[0]; + w1_t[3] = salt_buf_t1[1]; + w2_t[0] = salt_buf_t1[2]; + w2_t[1] = salt_buf_t1[3]; + w2_t[2] = salt_buf_t1[4]; + + // 41..46 + w2_t[2] |= digest_t1[0]; + w2_t[3] = digest_t1[1]; + + // 46..62 + w2_t[3] |= salt_buf_t2[0]; + w3_t[0] = salt_buf_t2[1]; + w3_t[1] = salt_buf_t2[2]; + w3_t[2] = salt_buf_t2[3]; + w3_t[3] = salt_buf_t2[4]; + + // 62.. + w3_t[3] |= digest_t2[0]; + + md5_transform (w0_t, w1_t, w2_t, w3_t, digest); + + w0_t[0] = 0; + w0_t[1] = 0; + w0_t[2] = 0; + w0_t[3] = 0; + w1_t[0] = 0; + w1_t[1] = 0; + w1_t[2] = 0; + w1_t[3] = 0; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = 0; + + // 0..3 + w0_t[0] = digest_t2[1]; + + // 3..19 + w0_t[0] |= salt_buf_t3[0]; + w0_t[1] = salt_buf_t3[1]; + w0_t[2] = salt_buf_t3[2]; + w0_t[3] = salt_buf_t3[3]; + w1_t[0] = salt_buf_t3[4]; + + // 19..24 + w1_t[0] |= digest_t3[0]; + w1_t[1] = digest_t3[1]; + + // 24..40 + w1_t[2] = salt_buf_t0[0]; + w1_t[3] = salt_buf_t0[1]; + w2_t[0] = salt_buf_t0[2]; + w2_t[1] = salt_buf_t0[3]; + + // 40..45 + w2_t[2] = digest_t0[0]; + w2_t[3] = digest_t0[1]; + + // 45..61 + w2_t[3] |= salt_buf_t1[0]; + w3_t[0] = salt_buf_t1[1]; + w3_t[1] = salt_buf_t1[2]; + w3_t[2] = salt_buf_t1[3]; + w3_t[3] = salt_buf_t1[4]; + + // 61.. + w3_t[3] |= digest_t1[0]; + + md5_transform (w0_t, w1_t, w2_t, w3_t, digest); + + w0_t[0] = 0; + w0_t[1] = 0; + w0_t[2] = 0; + w0_t[3] = 0; + w1_t[0] = 0; + w1_t[1] = 0; + w1_t[2] = 0; + w1_t[3] = 0; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = 0; + + // 0..2 + w0_t[0] = digest_t1[1]; + + // 2..18 + w0_t[0] |= salt_buf_t2[0]; + w0_t[1] = salt_buf_t2[1]; + w0_t[2] = salt_buf_t2[2]; + w0_t[3] = salt_buf_t2[3]; + w1_t[0] = salt_buf_t2[4]; + + // 18..23 + w1_t[0] |= digest_t2[0]; + w1_t[1] = digest_t2[1]; + + // 23..39 + w1_t[1] |= salt_buf_t3[0]; + w1_t[2] = salt_buf_t3[1]; + w1_t[3] = salt_buf_t3[2]; + w2_t[0] = salt_buf_t3[3]; + w2_t[1] = salt_buf_t3[4]; + + // 39..44 + w2_t[1] |= digest_t3[0]; + w2_t[2] = digest_t3[1]; + + // 44..60 + w2_t[3] = salt_buf_t0[0]; + w3_t[0] = salt_buf_t0[1]; + w3_t[1] = salt_buf_t0[2]; + w3_t[2] = salt_buf_t0[3]; + + // 60.. + w3_t[3] = digest_t0[0]; + + md5_transform (w0_t, w1_t, w2_t, w3_t, digest); + + w0_t[0] = 0; + w0_t[1] = 0; + w0_t[2] = 0; + w0_t[3] = 0; + w1_t[0] = 0; + w1_t[1] = 0; + w1_t[2] = 0; + w1_t[3] = 0; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = 0; + + // 0..1 + w0_t[0] = digest_t0[1]; + + // 1..17 + w0_t[0] |= salt_buf_t1[0]; + w0_t[1] = salt_buf_t1[1]; + w0_t[2] = salt_buf_t1[2]; + w0_t[3] = salt_buf_t1[3]; + w1_t[0] = salt_buf_t1[4]; + + // 17..22 + w1_t[0] |= digest_t1[0]; + w1_t[1] = digest_t1[1]; + + // 22..38 + w1_t[1] |= salt_buf_t2[0]; + w1_t[2] = salt_buf_t2[1]; + w1_t[3] = salt_buf_t2[2]; + w2_t[0] = salt_buf_t2[3]; + w2_t[1] = salt_buf_t2[4]; + + // 38..43 + w2_t[1] |= digest_t2[0]; + w2_t[2] = digest_t2[1]; + + // 43..59 + w2_t[2] |= salt_buf_t3[0]; + w2_t[3] = salt_buf_t3[1]; + w3_t[0] = salt_buf_t3[2]; + w3_t[1] = salt_buf_t3[3]; + w3_t[2] = salt_buf_t3[4]; + + // 59.. + w3_t[2] |= digest_t3[0]; + w3_t[3] = digest_t3[1]; + + md5_transform (w0_t, w1_t, w2_t, w3_t, digest); + + w0_t[0] = salt_buf_t0[0]; + w0_t[1] = salt_buf_t0[1]; + w0_t[2] = salt_buf_t0[2]; + w0_t[3] = salt_buf_t0[3]; + w1_t[0] = 0x80; + w1_t[1] = 0; + w1_t[2] = 0; + w1_t[3] = 0; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 21 * 16 * 8; + w3_t[3] = 0; + + md5_transform (w0_t, w1_t, w2_t, w3_t, digest); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m09720_m04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global oldoffice01_t *oldoffice01_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + u32x pw_buf1[4]; + + pw_buf1[0] = pws[gid].i[ 4]; + pw_buf1[1] = pws[gid].i[ 5]; + pw_buf1[2] = pws[gid].i[ 6]; + pw_buf1[3] = pws[gid].i[ 7]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * salt + */ + + u32 salt_buf[4]; + + salt_buf[0] = salt_bufs[salt_pos].salt_buf[0]; + salt_buf[1] = salt_bufs[salt_pos].salt_buf[1]; + salt_buf[2] = salt_bufs[salt_pos].salt_buf[2]; + salt_buf[3] = salt_bufs[salt_pos].salt_buf[3]; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + + w0[0] = pw_buf0[0]; + w0[1] = pw_buf0[1]; + w0[2] = pw_buf0[2]; + w0[3] = pw_buf0[3]; + + u32x w1[4]; + + w1[0] = pw_buf1[0]; + w1[1] = pw_buf1[1]; + w1[2] = pw_buf1[2]; + w1[3] = pw_buf1[3]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 out_len = apply_rules (rules_buf[il_pos].cmds, w0, w1, pw_len); + + append_0x80_2 (w0, w1, out_len); + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + make_unicode (w0, w0_t, w1_t); + make_unicode (w1, w2_t, w3_t); + + w3_t[2] = out_len * 8 * 2; + + u32x digest_pre[4]; + + digest_pre[0] = MD5M_A; + digest_pre[1] = MD5M_B; + digest_pre[2] = MD5M_C; + digest_pre[3] = MD5M_D; + + md5_transform (w0_t, w1_t, w2_t, w3_t, digest_pre); + + digest_pre[0] &= 0xffffffff; + digest_pre[1] &= 0x000000ff; + digest_pre[2] &= 0x00000000; + digest_pre[3] &= 0x00000000; + + u32x digest[4]; + + digest[0] = MD5M_A; + digest[1] = MD5M_B; + digest[2] = MD5M_C; + digest[3] = MD5M_D; + + gen336 (digest_pre, salt_buf, digest); + + u32x a = digest[0]; + u32x b = digest[1] & 0xff; + + const u32x r0 = a; + const u32x r1 = b; + const u32x r2 = 0; + const u32x r3 = 0; + + #include VECT_COMPARE_M + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m09720_m08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global oldoffice01_t *oldoffice01_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m09720_m16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global oldoffice01_t *oldoffice01_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m09720_s04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global oldoffice01_t *oldoffice01_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + u32x pw_buf1[4]; + + pw_buf1[0] = pws[gid].i[ 4]; + pw_buf1[1] = pws[gid].i[ 5]; + pw_buf1[2] = pws[gid].i[ 6]; + pw_buf1[3] = pws[gid].i[ 7]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * salt + */ + + u32 salt_buf[4]; + + salt_buf[0] = salt_bufs[salt_pos].salt_buf[0]; + salt_buf[1] = salt_bufs[salt_pos].salt_buf[1]; + salt_buf[2] = salt_bufs[salt_pos].salt_buf[2]; + salt_buf[3] = salt_bufs[salt_pos].salt_buf[3]; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + + w0[0] = pw_buf0[0]; + w0[1] = pw_buf0[1]; + w0[2] = pw_buf0[2]; + w0[3] = pw_buf0[3]; + + u32x w1[4]; + + w1[0] = pw_buf1[0]; + w1[1] = pw_buf1[1]; + w1[2] = pw_buf1[2]; + w1[3] = pw_buf1[3]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 out_len = apply_rules (rules_buf[il_pos].cmds, w0, w1, pw_len); + + append_0x80_2 (w0, w1, out_len); + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + make_unicode (w0, w0_t, w1_t); + make_unicode (w1, w2_t, w3_t); + + w3_t[2] = out_len * 8 * 2; + + u32x digest_pre[4]; + + digest_pre[0] = MD5M_A; + digest_pre[1] = MD5M_B; + digest_pre[2] = MD5M_C; + digest_pre[3] = MD5M_D; + + md5_transform (w0_t, w1_t, w2_t, w3_t, digest_pre); + + digest_pre[0] &= 0xffffffff; + digest_pre[1] &= 0x000000ff; + digest_pre[2] &= 0x00000000; + digest_pre[3] &= 0x00000000; + + u32x digest[4]; + + digest[0] = MD5M_A; + digest[1] = MD5M_B; + digest[2] = MD5M_C; + digest[3] = MD5M_D; + + gen336 (digest_pre, salt_buf, digest); + + u32x a = digest[0]; + u32x b = digest[1] & 0xff; + + const u32x r0 = a; + const u32x r1 = b; + const u32x r2 = 0; + const u32x r3 = 0; + + #include VECT_COMPARE_S + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m09720_s08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global oldoffice01_t *oldoffice01_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m09720_s16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global oldoffice01_t *oldoffice01_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/amd/m09720_a1.cl b/amd/m09720_a1.cl new file mode 100644 index 0000000000..65fe0ff171 --- /dev/null +++ b/amd/m09720_a1.cl @@ -0,0 +1,875 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _OLDOFFICE01_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW4 +#define VECT_SIZE2 +#endif + +#ifdef VLIW5 +#define VECT_SIZE2 +#endif + +#define DGST_R0 0 +#define DGST_R1 1 +#define DGST_R2 2 +#define DGST_R3 3 + +#include "include/kernel_functions.c" +#include "types_amd.c" +#include "common_amd.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +static void md5_transform (const u32x w0[4], const u32x w1[4], const u32x w2[4], const u32x w3[4], u32x digest[4]) +{ + u32x a = digest[0]; + u32x b = digest[1]; + u32x c = digest[2]; + u32x d = digest[3]; + + u32x w0_t = w0[0]; + u32x w1_t = w0[1]; + u32x w2_t = w0[2]; + u32x w3_t = w0[3]; + u32x w4_t = w1[0]; + u32x w5_t = w1[1]; + u32x w6_t = w1[2]; + u32x w7_t = w1[3]; + u32x w8_t = w2[0]; + u32x w9_t = w2[1]; + u32x wa_t = w2[2]; + u32x wb_t = w2[3]; + u32x wc_t = w3[0]; + u32x wd_t = w3[1]; + u32x we_t = w3[2]; + u32x wf_t = w3[3]; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t, MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t, MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t, MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t, MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w4_t, MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w5_t, MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w6_t, MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w7_t, MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w8_t, MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w9_t, MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, wa_t, MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, wb_t, MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, wc_t, MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, wd_t, MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, we_t, MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, wf_t, MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w1_t, MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w6_t, MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, wb_t, MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t, MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w5_t, MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, wa_t, MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, wf_t, MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w4_t, MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w9_t, MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, we_t, MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t, MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w8_t, MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, wd_t, MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t, MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w7_t, MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, wc_t, MD5C1f, MD5S13); + + MD5_STEP (MD5_H , a, b, c, d, w5_t, MD5C20, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w8_t, MD5C21, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, wb_t, MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, we_t, MD5C23, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w1_t, MD5C24, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w4_t, MD5C25, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w7_t, MD5C26, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, wa_t, MD5C27, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, wd_t, MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w0_t, MD5C29, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w3_t, MD5C2a, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w6_t, MD5C2b, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w9_t, MD5C2c, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, wc_t, MD5C2d, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, wf_t, MD5C2e, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w2_t, MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t, MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w7_t, MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, we_t, MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w5_t, MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, wc_t, MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t, MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, wa_t, MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t, MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w8_t, MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, wf_t, MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w6_t, MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, wd_t, MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w4_t, MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, wb_t, MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t, MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w9_t, MD5C3f, MD5S33); + + digest[0] += a; + digest[1] += b; + digest[2] += c; + digest[3] += d; +} + +static void gen336 (u32x digest_pre[4], u32 salt_buf[4], u32x digest[4]) +{ + u32x digest_t0[2]; + u32x digest_t1[2]; + u32x digest_t2[2]; + u32x digest_t3[2]; + + digest_t0[0] = digest_pre[0]; + digest_t0[1] = digest_pre[1] & 0xff; + + digest_t1[0] = digest_pre[0] << 8; + digest_t1[1] = digest_pre[0] >> 24 | digest_pre[1] << 8; + + digest_t2[0] = digest_pre[0] << 16; + digest_t2[1] = digest_pre[0] >> 16 | digest_pre[1] << 16; + + digest_t3[0] = digest_pre[0] << 24; + digest_t3[1] = digest_pre[0] >> 8 | digest_pre[1] << 24; + + u32 salt_buf_t0[4]; + u32 salt_buf_t1[5]; + u32 salt_buf_t2[5]; + u32 salt_buf_t3[5]; + + salt_buf_t0[0] = salt_buf[0]; + salt_buf_t0[1] = salt_buf[1]; + salt_buf_t0[2] = salt_buf[2]; + salt_buf_t0[3] = salt_buf[3]; + + salt_buf_t1[0] = salt_buf[0] << 8; + salt_buf_t1[1] = salt_buf[0] >> 24 | salt_buf[1] << 8; + salt_buf_t1[2] = salt_buf[1] >> 24 | salt_buf[2] << 8; + salt_buf_t1[3] = salt_buf[2] >> 24 | salt_buf[3] << 8; + salt_buf_t1[4] = salt_buf[3] >> 24; + + salt_buf_t2[0] = salt_buf[0] << 16; + salt_buf_t2[1] = salt_buf[0] >> 16 | salt_buf[1] << 16; + salt_buf_t2[2] = salt_buf[1] >> 16 | salt_buf[2] << 16; + salt_buf_t2[3] = salt_buf[2] >> 16 | salt_buf[3] << 16; + salt_buf_t2[4] = salt_buf[3] >> 16; + + salt_buf_t3[0] = salt_buf[0] << 24; + salt_buf_t3[1] = salt_buf[0] >> 8 | salt_buf[1] << 24; + salt_buf_t3[2] = salt_buf[1] >> 8 | salt_buf[2] << 24; + salt_buf_t3[3] = salt_buf[2] >> 8 | salt_buf[3] << 24; + salt_buf_t3[4] = salt_buf[3] >> 8; + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + // generate the 16 * 21 buffer + + w0_t[0] = 0; + w0_t[1] = 0; + w0_t[2] = 0; + w0_t[3] = 0; + w1_t[0] = 0; + w1_t[1] = 0; + w1_t[2] = 0; + w1_t[3] = 0; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = 0; + + // 0..5 + w0_t[0] = digest_t0[0]; + w0_t[1] = digest_t0[1]; + + // 5..21 + w0_t[1] |= salt_buf_t1[0]; + w0_t[2] = salt_buf_t1[1]; + w0_t[3] = salt_buf_t1[2]; + w1_t[0] = salt_buf_t1[3]; + w1_t[1] = salt_buf_t1[4]; + + // 21..26 + w1_t[1] |= digest_t1[0]; + w1_t[2] = digest_t1[1]; + + // 26..42 + w1_t[2] |= salt_buf_t2[0]; + w1_t[3] = salt_buf_t2[1]; + w2_t[0] = salt_buf_t2[2]; + w2_t[1] = salt_buf_t2[3]; + w2_t[2] = salt_buf_t2[4]; + + // 42..47 + w2_t[2] |= digest_t2[0]; + w2_t[3] = digest_t2[1]; + + // 47..63 + w2_t[3] |= salt_buf_t3[0]; + w3_t[0] = salt_buf_t3[1]; + w3_t[1] = salt_buf_t3[2]; + w3_t[2] = salt_buf_t3[3]; + w3_t[3] = salt_buf_t3[4]; + + // 63.. + + w3_t[3] |= digest_t3[0]; + + md5_transform (w0_t, w1_t, w2_t, w3_t, digest); + + w0_t[0] = 0; + w0_t[1] = 0; + w0_t[2] = 0; + w0_t[3] = 0; + w1_t[0] = 0; + w1_t[1] = 0; + w1_t[2] = 0; + w1_t[3] = 0; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = 0; + + // 0..4 + w0_t[0] = digest_t3[1]; + + // 4..20 + w0_t[1] = salt_buf_t0[0]; + w0_t[2] = salt_buf_t0[1]; + w0_t[3] = salt_buf_t0[2]; + w1_t[0] = salt_buf_t0[3]; + + // 20..25 + w1_t[1] = digest_t0[0]; + w1_t[2] = digest_t0[1]; + + // 25..41 + w1_t[2] |= salt_buf_t1[0]; + w1_t[3] = salt_buf_t1[1]; + w2_t[0] = salt_buf_t1[2]; + w2_t[1] = salt_buf_t1[3]; + w2_t[2] = salt_buf_t1[4]; + + // 41..46 + w2_t[2] |= digest_t1[0]; + w2_t[3] = digest_t1[1]; + + // 46..62 + w2_t[3] |= salt_buf_t2[0]; + w3_t[0] = salt_buf_t2[1]; + w3_t[1] = salt_buf_t2[2]; + w3_t[2] = salt_buf_t2[3]; + w3_t[3] = salt_buf_t2[4]; + + // 62.. + w3_t[3] |= digest_t2[0]; + + md5_transform (w0_t, w1_t, w2_t, w3_t, digest); + + w0_t[0] = 0; + w0_t[1] = 0; + w0_t[2] = 0; + w0_t[3] = 0; + w1_t[0] = 0; + w1_t[1] = 0; + w1_t[2] = 0; + w1_t[3] = 0; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = 0; + + // 0..3 + w0_t[0] = digest_t2[1]; + + // 3..19 + w0_t[0] |= salt_buf_t3[0]; + w0_t[1] = salt_buf_t3[1]; + w0_t[2] = salt_buf_t3[2]; + w0_t[3] = salt_buf_t3[3]; + w1_t[0] = salt_buf_t3[4]; + + // 19..24 + w1_t[0] |= digest_t3[0]; + w1_t[1] = digest_t3[1]; + + // 24..40 + w1_t[2] = salt_buf_t0[0]; + w1_t[3] = salt_buf_t0[1]; + w2_t[0] = salt_buf_t0[2]; + w2_t[1] = salt_buf_t0[3]; + + // 40..45 + w2_t[2] = digest_t0[0]; + w2_t[3] = digest_t0[1]; + + // 45..61 + w2_t[3] |= salt_buf_t1[0]; + w3_t[0] = salt_buf_t1[1]; + w3_t[1] = salt_buf_t1[2]; + w3_t[2] = salt_buf_t1[3]; + w3_t[3] = salt_buf_t1[4]; + + // 61.. + w3_t[3] |= digest_t1[0]; + + md5_transform (w0_t, w1_t, w2_t, w3_t, digest); + + w0_t[0] = 0; + w0_t[1] = 0; + w0_t[2] = 0; + w0_t[3] = 0; + w1_t[0] = 0; + w1_t[1] = 0; + w1_t[2] = 0; + w1_t[3] = 0; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = 0; + + // 0..2 + w0_t[0] = digest_t1[1]; + + // 2..18 + w0_t[0] |= salt_buf_t2[0]; + w0_t[1] = salt_buf_t2[1]; + w0_t[2] = salt_buf_t2[2]; + w0_t[3] = salt_buf_t2[3]; + w1_t[0] = salt_buf_t2[4]; + + // 18..23 + w1_t[0] |= digest_t2[0]; + w1_t[1] = digest_t2[1]; + + // 23..39 + w1_t[1] |= salt_buf_t3[0]; + w1_t[2] = salt_buf_t3[1]; + w1_t[3] = salt_buf_t3[2]; + w2_t[0] = salt_buf_t3[3]; + w2_t[1] = salt_buf_t3[4]; + + // 39..44 + w2_t[1] |= digest_t3[0]; + w2_t[2] = digest_t3[1]; + + // 44..60 + w2_t[3] = salt_buf_t0[0]; + w3_t[0] = salt_buf_t0[1]; + w3_t[1] = salt_buf_t0[2]; + w3_t[2] = salt_buf_t0[3]; + + // 60.. + w3_t[3] = digest_t0[0]; + + md5_transform (w0_t, w1_t, w2_t, w3_t, digest); + + w0_t[0] = 0; + w0_t[1] = 0; + w0_t[2] = 0; + w0_t[3] = 0; + w1_t[0] = 0; + w1_t[1] = 0; + w1_t[2] = 0; + w1_t[3] = 0; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = 0; + + // 0..1 + w0_t[0] = digest_t0[1]; + + // 1..17 + w0_t[0] |= salt_buf_t1[0]; + w0_t[1] = salt_buf_t1[1]; + w0_t[2] = salt_buf_t1[2]; + w0_t[3] = salt_buf_t1[3]; + w1_t[0] = salt_buf_t1[4]; + + // 17..22 + w1_t[0] |= digest_t1[0]; + w1_t[1] = digest_t1[1]; + + // 22..38 + w1_t[1] |= salt_buf_t2[0]; + w1_t[2] = salt_buf_t2[1]; + w1_t[3] = salt_buf_t2[2]; + w2_t[0] = salt_buf_t2[3]; + w2_t[1] = salt_buf_t2[4]; + + // 38..43 + w2_t[1] |= digest_t2[0]; + w2_t[2] = digest_t2[1]; + + // 43..59 + w2_t[2] |= salt_buf_t3[0]; + w2_t[3] = salt_buf_t3[1]; + w3_t[0] = salt_buf_t3[2]; + w3_t[1] = salt_buf_t3[3]; + w3_t[2] = salt_buf_t3[4]; + + // 59.. + w3_t[2] |= digest_t3[0]; + w3_t[3] = digest_t3[1]; + + md5_transform (w0_t, w1_t, w2_t, w3_t, digest); + + w0_t[0] = salt_buf_t0[0]; + w0_t[1] = salt_buf_t0[1]; + w0_t[2] = salt_buf_t0[2]; + w0_t[3] = salt_buf_t0[3]; + w1_t[0] = 0x80; + w1_t[1] = 0; + w1_t[2] = 0; + w1_t[3] = 0; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 21 * 16 * 8; + w3_t[3] = 0; + + md5_transform (w0_t, w1_t, w2_t, w3_t, digest); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m09720_m04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global oldoffice01_t *oldoffice01_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, combs_buf[0].pw_len); + } + + /** + * salt + */ + + u32 salt_buf[4]; + + salt_buf[0] = salt_bufs[salt_pos].salt_buf[0]; + salt_buf[1] = salt_bufs[salt_pos].salt_buf[1]; + salt_buf[2] = salt_bufs[salt_pos].salt_buf[2]; + salt_buf[3] = salt_bufs[salt_pos].salt_buf[3]; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = combs_buf[il_pos].pw_len; + + const u32 pw_len = pw_l_len + pw_r_len; + + u32 wordr0[4]; + + wordr0[0] = combs_buf[il_pos].i[0]; + wordr0[1] = combs_buf[il_pos].i[1]; + wordr0[2] = combs_buf[il_pos].i[2]; + wordr0[3] = combs_buf[il_pos].i[3]; + + u32 wordr1[4]; + + wordr1[0] = combs_buf[il_pos].i[4]; + wordr1[1] = combs_buf[il_pos].i[5]; + wordr1[2] = combs_buf[il_pos].i[6]; + wordr1[3] = combs_buf[il_pos].i[7]; + + u32 wordr2[4]; + + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + + u32 wordr3[4]; + + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + u32x w0[4]; + + w0[0] = wordl0[0] | wordr0[0]; + w0[1] = wordl0[1] | wordr0[1]; + w0[2] = wordl0[2] | wordr0[2]; + w0[3] = wordl0[3] | wordr0[3]; + + u32x w1[4]; + + w1[0] = wordl1[0] | wordr1[0]; + w1[1] = wordl1[1] | wordr1[1]; + w1[2] = wordl1[2] | wordr1[2]; + w1[3] = wordl1[3] | wordr1[3]; + + u32x w2[4]; + + w2[0] = wordl2[0] | wordr2[0]; + w2[1] = wordl2[1] | wordr2[1]; + w2[2] = wordl2[2] | wordr2[2]; + w2[3] = wordl2[3] | wordr2[3]; + + u32x w3[4]; + + w3[0] = wordl3[0] | wordr3[0]; + w3[1] = wordl3[1] | wordr3[1]; + w3[2] = 0; + w3[3] = 0; + + append_0x80_2 (w0, w1, pw_len); + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + make_unicode (w0, w0_t, w1_t); + make_unicode (w1, w2_t, w3_t); + + w3_t[2] = pw_len * 8 * 2; + + u32x digest_pre[4]; + + digest_pre[0] = MD5M_A; + digest_pre[1] = MD5M_B; + digest_pre[2] = MD5M_C; + digest_pre[3] = MD5M_D; + + md5_transform (w0_t, w1_t, w2_t, w3_t, digest_pre); + + digest_pre[0] &= 0xffffffff; + digest_pre[1] &= 0x000000ff; + digest_pre[2] &= 0x00000000; + digest_pre[3] &= 0x00000000; + + u32x digest[4]; + + digest[0] = MD5M_A; + digest[1] = MD5M_B; + digest[2] = MD5M_C; + digest[3] = MD5M_D; + + gen336 (digest_pre, salt_buf, digest); + + u32x a = digest[0]; + u32x b = digest[1] & 0xff; + + const u32x r0 = a; + const u32x r1 = b; + const u32x r2 = 0; + const u32x r3 = 0; + + #include VECT_COMPARE_M + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m09720_m08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global oldoffice01_t *oldoffice01_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m09720_m16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global oldoffice01_t *oldoffice01_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m09720_s04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global oldoffice01_t *oldoffice01_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, combs_buf[0].pw_len); + } + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * salt + */ + + u32 salt_buf[4]; + + salt_buf[0] = salt_bufs[salt_pos].salt_buf[0]; + salt_buf[1] = salt_bufs[salt_pos].salt_buf[1]; + salt_buf[2] = salt_bufs[salt_pos].salt_buf[2]; + salt_buf[3] = salt_bufs[salt_pos].salt_buf[3]; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = combs_buf[il_pos].pw_len; + + const u32 pw_len = pw_l_len + pw_r_len; + + u32 wordr0[4]; + + wordr0[0] = combs_buf[il_pos].i[0]; + wordr0[1] = combs_buf[il_pos].i[1]; + wordr0[2] = combs_buf[il_pos].i[2]; + wordr0[3] = combs_buf[il_pos].i[3]; + + u32 wordr1[4]; + + wordr1[0] = combs_buf[il_pos].i[4]; + wordr1[1] = combs_buf[il_pos].i[5]; + wordr1[2] = combs_buf[il_pos].i[6]; + wordr1[3] = combs_buf[il_pos].i[7]; + + u32 wordr2[4]; + + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + + u32 wordr3[4]; + + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + u32x w0[4]; + + w0[0] = wordl0[0] | wordr0[0]; + w0[1] = wordl0[1] | wordr0[1]; + w0[2] = wordl0[2] | wordr0[2]; + w0[3] = wordl0[3] | wordr0[3]; + + u32x w1[4]; + + w1[0] = wordl1[0] | wordr1[0]; + w1[1] = wordl1[1] | wordr1[1]; + w1[2] = wordl1[2] | wordr1[2]; + w1[3] = wordl1[3] | wordr1[3]; + + u32x w2[4]; + + w2[0] = wordl2[0] | wordr2[0]; + w2[1] = wordl2[1] | wordr2[1]; + w2[2] = wordl2[2] | wordr2[2]; + w2[3] = wordl2[3] | wordr2[3]; + + u32x w3[4]; + + w3[0] = wordl3[0] | wordr3[0]; + w3[1] = wordl3[1] | wordr3[1]; + w3[2] = 0; + w3[3] = 0; + + append_0x80_2 (w0, w1, pw_len); + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + make_unicode (w0, w0_t, w1_t); + make_unicode (w1, w2_t, w3_t); + + w3_t[2] = pw_len * 8 * 2; + + u32x digest_pre[4]; + + digest_pre[0] = MD5M_A; + digest_pre[1] = MD5M_B; + digest_pre[2] = MD5M_C; + digest_pre[3] = MD5M_D; + + md5_transform (w0_t, w1_t, w2_t, w3_t, digest_pre); + + digest_pre[0] &= 0xffffffff; + digest_pre[1] &= 0x000000ff; + digest_pre[2] &= 0x00000000; + digest_pre[3] &= 0x00000000; + + u32x digest[4]; + + digest[0] = MD5M_A; + digest[1] = MD5M_B; + digest[2] = MD5M_C; + digest[3] = MD5M_D; + + gen336 (digest_pre, salt_buf, digest); + + u32x a = digest[0]; + u32x b = digest[1] & 0xff; + + const u32x r0 = a; + const u32x r1 = b; + const u32x r2 = 0; + const u32x r3 = 0; + + #include VECT_COMPARE_S + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m09720_s08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global oldoffice01_t *oldoffice01_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m09720_s16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global oldoffice01_t *oldoffice01_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/amd/m09720_a3.cl b/amd/m09720_a3.cl new file mode 100644 index 0000000000..491ef2839b --- /dev/null +++ b/amd/m09720_a3.cl @@ -0,0 +1,959 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _OLDOFFICE01_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW4 +#define VECT_SIZE2 +#endif + +#ifdef VLIW5 +#define VECT_SIZE2 +#endif + +#define DGST_R0 0 +#define DGST_R1 1 +#define DGST_R2 2 +#define DGST_R3 3 + +#include "include/kernel_functions.c" +#include "types_amd.c" +#include "common_amd.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +static void md5_transform (const u32x w0[4], const u32x w1[4], const u32x w2[4], const u32x w3[4], u32x digest[4]) +{ + u32x a = digest[0]; + u32x b = digest[1]; + u32x c = digest[2]; + u32x d = digest[3]; + + u32x w0_t = w0[0]; + u32x w1_t = w0[1]; + u32x w2_t = w0[2]; + u32x w3_t = w0[3]; + u32x w4_t = w1[0]; + u32x w5_t = w1[1]; + u32x w6_t = w1[2]; + u32x w7_t = w1[3]; + u32x w8_t = w2[0]; + u32x w9_t = w2[1]; + u32x wa_t = w2[2]; + u32x wb_t = w2[3]; + u32x wc_t = w3[0]; + u32x wd_t = w3[1]; + u32x we_t = w3[2]; + u32x wf_t = w3[3]; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t, MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t, MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t, MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t, MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w4_t, MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w5_t, MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w6_t, MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w7_t, MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w8_t, MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w9_t, MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, wa_t, MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, wb_t, MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, wc_t, MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, wd_t, MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, we_t, MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, wf_t, MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w1_t, MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w6_t, MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, wb_t, MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t, MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w5_t, MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, wa_t, MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, wf_t, MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w4_t, MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w9_t, MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, we_t, MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t, MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w8_t, MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, wd_t, MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t, MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w7_t, MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, wc_t, MD5C1f, MD5S13); + + MD5_STEP (MD5_H , a, b, c, d, w5_t, MD5C20, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w8_t, MD5C21, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, wb_t, MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, we_t, MD5C23, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w1_t, MD5C24, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w4_t, MD5C25, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w7_t, MD5C26, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, wa_t, MD5C27, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, wd_t, MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w0_t, MD5C29, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w3_t, MD5C2a, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w6_t, MD5C2b, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w9_t, MD5C2c, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, wc_t, MD5C2d, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, wf_t, MD5C2e, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w2_t, MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t, MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w7_t, MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, we_t, MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w5_t, MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, wc_t, MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t, MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, wa_t, MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t, MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w8_t, MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, wf_t, MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w6_t, MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, wd_t, MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w4_t, MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, wb_t, MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t, MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w9_t, MD5C3f, MD5S33); + + digest[0] += a; + digest[1] += b; + digest[2] += c; + digest[3] += d; +} + +static void gen336 (u32x digest_pre[4], u32 salt_buf[4], u32x digest[4]) +{ + u32x digest_t0[2]; + u32x digest_t1[2]; + u32x digest_t2[2]; + u32x digest_t3[2]; + + digest_t0[0] = digest_pre[0]; + digest_t0[1] = digest_pre[1] & 0xff; + + digest_t1[0] = digest_pre[0] << 8; + digest_t1[1] = digest_pre[0] >> 24 | digest_pre[1] << 8; + + digest_t2[0] = digest_pre[0] << 16; + digest_t2[1] = digest_pre[0] >> 16 | digest_pre[1] << 16; + + digest_t3[0] = digest_pre[0] << 24; + digest_t3[1] = digest_pre[0] >> 8 | digest_pre[1] << 24; + + u32 salt_buf_t0[4]; + u32 salt_buf_t1[5]; + u32 salt_buf_t2[5]; + u32 salt_buf_t3[5]; + + salt_buf_t0[0] = salt_buf[0]; + salt_buf_t0[1] = salt_buf[1]; + salt_buf_t0[2] = salt_buf[2]; + salt_buf_t0[3] = salt_buf[3]; + + salt_buf_t1[0] = salt_buf[0] << 8; + salt_buf_t1[1] = salt_buf[0] >> 24 | salt_buf[1] << 8; + salt_buf_t1[2] = salt_buf[1] >> 24 | salt_buf[2] << 8; + salt_buf_t1[3] = salt_buf[2] >> 24 | salt_buf[3] << 8; + salt_buf_t1[4] = salt_buf[3] >> 24; + + salt_buf_t2[0] = salt_buf[0] << 16; + salt_buf_t2[1] = salt_buf[0] >> 16 | salt_buf[1] << 16; + salt_buf_t2[2] = salt_buf[1] >> 16 | salt_buf[2] << 16; + salt_buf_t2[3] = salt_buf[2] >> 16 | salt_buf[3] << 16; + salt_buf_t2[4] = salt_buf[3] >> 16; + + salt_buf_t3[0] = salt_buf[0] << 24; + salt_buf_t3[1] = salt_buf[0] >> 8 | salt_buf[1] << 24; + salt_buf_t3[2] = salt_buf[1] >> 8 | salt_buf[2] << 24; + salt_buf_t3[3] = salt_buf[2] >> 8 | salt_buf[3] << 24; + salt_buf_t3[4] = salt_buf[3] >> 8; + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + // generate the 16 * 21 buffer + + w0_t[0] = 0; + w0_t[1] = 0; + w0_t[2] = 0; + w0_t[3] = 0; + w1_t[0] = 0; + w1_t[1] = 0; + w1_t[2] = 0; + w1_t[3] = 0; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = 0; + + // 0..5 + w0_t[0] = digest_t0[0]; + w0_t[1] = digest_t0[1]; + + // 5..21 + w0_t[1] |= salt_buf_t1[0]; + w0_t[2] = salt_buf_t1[1]; + w0_t[3] = salt_buf_t1[2]; + w1_t[0] = salt_buf_t1[3]; + w1_t[1] = salt_buf_t1[4]; + + // 21..26 + w1_t[1] |= digest_t1[0]; + w1_t[2] = digest_t1[1]; + + // 26..42 + w1_t[2] |= salt_buf_t2[0]; + w1_t[3] = salt_buf_t2[1]; + w2_t[0] = salt_buf_t2[2]; + w2_t[1] = salt_buf_t2[3]; + w2_t[2] = salt_buf_t2[4]; + + // 42..47 + w2_t[2] |= digest_t2[0]; + w2_t[3] = digest_t2[1]; + + // 47..63 + w2_t[3] |= salt_buf_t3[0]; + w3_t[0] = salt_buf_t3[1]; + w3_t[1] = salt_buf_t3[2]; + w3_t[2] = salt_buf_t3[3]; + w3_t[3] = salt_buf_t3[4]; + + // 63.. + + w3_t[3] |= digest_t3[0]; + + md5_transform (w0_t, w1_t, w2_t, w3_t, digest); + + w0_t[0] = 0; + w0_t[1] = 0; + w0_t[2] = 0; + w0_t[3] = 0; + w1_t[0] = 0; + w1_t[1] = 0; + w1_t[2] = 0; + w1_t[3] = 0; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = 0; + + // 0..4 + w0_t[0] = digest_t3[1]; + + // 4..20 + w0_t[1] = salt_buf_t0[0]; + w0_t[2] = salt_buf_t0[1]; + w0_t[3] = salt_buf_t0[2]; + w1_t[0] = salt_buf_t0[3]; + + // 20..25 + w1_t[1] = digest_t0[0]; + w1_t[2] = digest_t0[1]; + + // 25..41 + w1_t[2] |= salt_buf_t1[0]; + w1_t[3] = salt_buf_t1[1]; + w2_t[0] = salt_buf_t1[2]; + w2_t[1] = salt_buf_t1[3]; + w2_t[2] = salt_buf_t1[4]; + + // 41..46 + w2_t[2] |= digest_t1[0]; + w2_t[3] = digest_t1[1]; + + // 46..62 + w2_t[3] |= salt_buf_t2[0]; + w3_t[0] = salt_buf_t2[1]; + w3_t[1] = salt_buf_t2[2]; + w3_t[2] = salt_buf_t2[3]; + w3_t[3] = salt_buf_t2[4]; + + // 62.. + w3_t[3] |= digest_t2[0]; + + md5_transform (w0_t, w1_t, w2_t, w3_t, digest); + + w0_t[0] = 0; + w0_t[1] = 0; + w0_t[2] = 0; + w0_t[3] = 0; + w1_t[0] = 0; + w1_t[1] = 0; + w1_t[2] = 0; + w1_t[3] = 0; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = 0; + + // 0..3 + w0_t[0] = digest_t2[1]; + + // 3..19 + w0_t[0] |= salt_buf_t3[0]; + w0_t[1] = salt_buf_t3[1]; + w0_t[2] = salt_buf_t3[2]; + w0_t[3] = salt_buf_t3[3]; + w1_t[0] = salt_buf_t3[4]; + + // 19..24 + w1_t[0] |= digest_t3[0]; + w1_t[1] = digest_t3[1]; + + // 24..40 + w1_t[2] = salt_buf_t0[0]; + w1_t[3] = salt_buf_t0[1]; + w2_t[0] = salt_buf_t0[2]; + w2_t[1] = salt_buf_t0[3]; + + // 40..45 + w2_t[2] = digest_t0[0]; + w2_t[3] = digest_t0[1]; + + // 45..61 + w2_t[3] |= salt_buf_t1[0]; + w3_t[0] = salt_buf_t1[1]; + w3_t[1] = salt_buf_t1[2]; + w3_t[2] = salt_buf_t1[3]; + w3_t[3] = salt_buf_t1[4]; + + // 61.. + w3_t[3] |= digest_t1[0]; + + md5_transform (w0_t, w1_t, w2_t, w3_t, digest); + + w0_t[0] = 0; + w0_t[1] = 0; + w0_t[2] = 0; + w0_t[3] = 0; + w1_t[0] = 0; + w1_t[1] = 0; + w1_t[2] = 0; + w1_t[3] = 0; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = 0; + + // 0..2 + w0_t[0] = digest_t1[1]; + + // 2..18 + w0_t[0] |= salt_buf_t2[0]; + w0_t[1] = salt_buf_t2[1]; + w0_t[2] = salt_buf_t2[2]; + w0_t[3] = salt_buf_t2[3]; + w1_t[0] = salt_buf_t2[4]; + + // 18..23 + w1_t[0] |= digest_t2[0]; + w1_t[1] = digest_t2[1]; + + // 23..39 + w1_t[1] |= salt_buf_t3[0]; + w1_t[2] = salt_buf_t3[1]; + w1_t[3] = salt_buf_t3[2]; + w2_t[0] = salt_buf_t3[3]; + w2_t[1] = salt_buf_t3[4]; + + // 39..44 + w2_t[1] |= digest_t3[0]; + w2_t[2] = digest_t3[1]; + + // 44..60 + w2_t[3] = salt_buf_t0[0]; + w3_t[0] = salt_buf_t0[1]; + w3_t[1] = salt_buf_t0[2]; + w3_t[2] = salt_buf_t0[3]; + + // 60.. + w3_t[3] = digest_t0[0]; + + md5_transform (w0_t, w1_t, w2_t, w3_t, digest); + + w0_t[0] = 0; + w0_t[1] = 0; + w0_t[2] = 0; + w0_t[3] = 0; + w1_t[0] = 0; + w1_t[1] = 0; + w1_t[2] = 0; + w1_t[3] = 0; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = 0; + + // 0..1 + w0_t[0] = digest_t0[1]; + + // 1..17 + w0_t[0] |= salt_buf_t1[0]; + w0_t[1] = salt_buf_t1[1]; + w0_t[2] = salt_buf_t1[2]; + w0_t[3] = salt_buf_t1[3]; + w1_t[0] = salt_buf_t1[4]; + + // 17..22 + w1_t[0] |= digest_t1[0]; + w1_t[1] = digest_t1[1]; + + // 22..38 + w1_t[1] |= salt_buf_t2[0]; + w1_t[2] = salt_buf_t2[1]; + w1_t[3] = salt_buf_t2[2]; + w2_t[0] = salt_buf_t2[3]; + w2_t[1] = salt_buf_t2[4]; + + // 38..43 + w2_t[1] |= digest_t2[0]; + w2_t[2] = digest_t2[1]; + + // 43..59 + w2_t[2] |= salt_buf_t3[0]; + w2_t[3] = salt_buf_t3[1]; + w3_t[0] = salt_buf_t3[2]; + w3_t[1] = salt_buf_t3[3]; + w3_t[2] = salt_buf_t3[4]; + + // 59.. + w3_t[2] |= digest_t3[0]; + w3_t[3] = digest_t3[1]; + + md5_transform (w0_t, w1_t, w2_t, w3_t, digest); + + w0_t[0] = salt_buf_t0[0]; + w0_t[1] = salt_buf_t0[1]; + w0_t[2] = salt_buf_t0[2]; + w0_t[3] = salt_buf_t0[3]; + w1_t[0] = 0x80; + w1_t[1] = 0; + w1_t[2] = 0; + w1_t[3] = 0; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 21 * 16 * 8; + w3_t[3] = 0; + + md5_transform (w0_t, w1_t, w2_t, w3_t, digest); +} + +static void m09720m (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], const u32 pw_len, __global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global oldoffice01_t *oldoffice01_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset) +{ + /** + * modifier + */ + + const u32 gid = get_global_id (0); + const u32 lid = get_local_id (0); + + /** + * salt + */ + + u32 salt_buf[4]; + + salt_buf[0] = salt_bufs[salt_pos].salt_buf[0]; + salt_buf[1] = salt_bufs[salt_pos].salt_buf[1]; + salt_buf[2] = salt_bufs[salt_pos].salt_buf[2]; + salt_buf[3] = salt_bufs[salt_pos].salt_buf[3]; + + /** + * loop + */ + + u32x w0l = w0[0]; + + for (u32 il_pos = 0; il_pos < bfs_cnt; il_pos++) + { + const u32 w0r = bfs_buf[il_pos].i; + + w0[0] = w0l | w0r; + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + w0_t[0] = w0[0]; + w0_t[1] = w0[1]; + w0_t[2] = w0[2]; + w0_t[3] = w0[3]; + w1_t[0] = w1[0]; + w1_t[1] = w1[1]; + w1_t[2] = w1[2]; + w1_t[3] = w1[3]; + w2_t[0] = w2[0]; + w2_t[1] = w2[1]; + w2_t[2] = w2[2]; + w2_t[3] = w2[3]; + w3_t[0] = w3[0]; + w3_t[1] = w3[1]; + w3_t[2] = pw_len * 8; + w3_t[3] = 0; + + u32x digest_pre[4]; + + digest_pre[0] = MD5M_A; + digest_pre[1] = MD5M_B; + digest_pre[2] = MD5M_C; + digest_pre[3] = MD5M_D; + + md5_transform (w0_t, w1_t, w2_t, w3_t, digest_pre); + + digest_pre[0] &= 0xffffffff; + digest_pre[1] &= 0x000000ff; + digest_pre[2] &= 0x00000000; + digest_pre[3] &= 0x00000000; + + u32x digest[4]; + + digest[0] = MD5M_A; + digest[1] = MD5M_B; + digest[2] = MD5M_C; + digest[3] = MD5M_D; + + gen336 (digest_pre, salt_buf, digest); + + u32x a = digest[0]; + u32x b = digest[1] & 0xff; + + const u32x r0 = a; + const u32x r1 = b; + const u32x r2 = 0; + const u32x r3 = 0; + + #include VECT_COMPARE_M + } +} + +static void m09720s (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], const u32 pw_len, __global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global oldoffice01_t *oldoffice01_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset) +{ + /** + * modifier + */ + + const u32 gid = get_global_id (0); + const u32 lid = get_local_id (0); + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * salt + */ + + u32 salt_buf[4]; + + salt_buf[0] = salt_bufs[salt_pos].salt_buf[0]; + salt_buf[1] = salt_bufs[salt_pos].salt_buf[1]; + salt_buf[2] = salt_bufs[salt_pos].salt_buf[2]; + salt_buf[3] = salt_bufs[salt_pos].salt_buf[3]; + + /** + * loop + */ + + u32x w0l = w0[0]; + + for (u32 il_pos = 0; il_pos < bfs_cnt; il_pos++) + { + const u32 w0r = bfs_buf[il_pos].i; + + w0[0] = w0l | w0r; + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + w0_t[0] = w0[0]; + w0_t[1] = w0[1]; + w0_t[2] = w0[2]; + w0_t[3] = w0[3]; + w1_t[0] = w1[0]; + w1_t[1] = w1[1]; + w1_t[2] = w1[2]; + w1_t[3] = w1[3]; + w2_t[0] = w2[0]; + w2_t[1] = w2[1]; + w2_t[2] = w2[2]; + w2_t[3] = w2[3]; + w3_t[0] = w3[0]; + w3_t[1] = w3[1]; + w3_t[2] = pw_len * 8; + w3_t[3] = 0; + + u32x digest_pre[4]; + + digest_pre[0] = MD5M_A; + digest_pre[1] = MD5M_B; + digest_pre[2] = MD5M_C; + digest_pre[3] = MD5M_D; + + md5_transform (w0_t, w1_t, w2_t, w3_t, digest_pre); + + digest_pre[0] &= 0xffffffff; + digest_pre[1] &= 0x000000ff; + digest_pre[2] &= 0x00000000; + digest_pre[3] &= 0x00000000; + + u32x digest[4]; + + digest[0] = MD5M_A; + digest[1] = MD5M_B; + digest[2] = MD5M_C; + digest[3] = MD5M_D; + + gen336 (digest_pre, salt_buf, digest); + + u32x a = digest[0]; + u32x b = digest[1] & 0xff; + + const u32x r0 = a; + const u32x r1 = b; + const u32x r2 = 0; + const u32x r3 = 0; + + #include VECT_COMPARE_S + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m09720_m04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global oldoffice01_t *oldoffice01_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m09720m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, oldoffice01_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m09720_m08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global oldoffice01_t *oldoffice01_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m09720m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, oldoffice01_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m09720_m16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global oldoffice01_t *oldoffice01_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = pws[gid].i[ 8]; + w2[1] = pws[gid].i[ 9]; + w2[2] = pws[gid].i[10]; + w2[3] = pws[gid].i[11]; + + u32x w3[4]; + + w3[0] = pws[gid].i[12]; + w3[1] = pws[gid].i[13]; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m09720m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, oldoffice01_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m09720_s04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global oldoffice01_t *oldoffice01_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m09720s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, oldoffice01_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m09720_s08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global oldoffice01_t *oldoffice01_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m09720s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, oldoffice01_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m09720_s16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global oldoffice01_t *oldoffice01_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = pws[gid].i[ 8]; + w2[1] = pws[gid].i[ 9]; + w2[2] = pws[gid].i[10]; + w2[3] = pws[gid].i[11]; + + u32x w3[4]; + + w3[0] = pws[gid].i[12]; + w3[1] = pws[gid].i[13]; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m09720s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, oldoffice01_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} diff --git a/amd/m09800_a0.cl b/amd/m09800_a0.cl new file mode 100644 index 0000000000..63810b6e0f --- /dev/null +++ b/amd/m09800_a0.cl @@ -0,0 +1,773 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _OLDOFFICE34_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW4 +#define VECT_SIZE1 +#endif + +#ifdef VLIW5 +#define VECT_SIZE1 +#endif + +#define DGST_R0 0 +#define DGST_R1 1 +#define DGST_R2 2 +#define DGST_R3 3 + +#include "include/kernel_functions.c" +#include "types_amd.c" +#include "common_amd.c" +#include "include/rp_gpu.h" +#include "rp_amd.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +typedef struct +{ + u8 S[256]; + + u32 wtf_its_faster; + +} RC4_KEY; + +static void swap (__local RC4_KEY *rc4_key, const u8 i, const u8 j) +{ + u8 tmp; + + tmp = rc4_key->S[i]; + rc4_key->S[i] = rc4_key->S[j]; + rc4_key->S[j] = tmp; +} + +static void rc4_init_16 (__local RC4_KEY *rc4_key, const u32 data[4]) +{ + u32 v = 0x03020100; + u32 a = 0x04040404; + + __local u32 *ptr = (__local u32 *) rc4_key->S; + + #pragma unroll + for (u32 i = 0; i < 64; i++) + { + *ptr++ = v; v += a; + } + + u32 j = 0; + + #pragma unroll + for (u32 i = 0; i < 16; i++) + { + u32 idx = i * 16; + + u32 v; + + v = data[0]; + + j += rc4_key->S[idx] + (v >> 0); swap (rc4_key, idx, j); idx++; + j += rc4_key->S[idx] + (v >> 8); swap (rc4_key, idx, j); idx++; + j += rc4_key->S[idx] + (v >> 16); swap (rc4_key, idx, j); idx++; + j += rc4_key->S[idx] + (v >> 24); swap (rc4_key, idx, j); idx++; + + v = data[1]; + + j += rc4_key->S[idx] + (v >> 0); swap (rc4_key, idx, j); idx++; + j += rc4_key->S[idx] + (v >> 8); swap (rc4_key, idx, j); idx++; + j += rc4_key->S[idx] + (v >> 16); swap (rc4_key, idx, j); idx++; + j += rc4_key->S[idx] + (v >> 24); swap (rc4_key, idx, j); idx++; + + v = data[2]; + + j += rc4_key->S[idx] + (v >> 0); swap (rc4_key, idx, j); idx++; + j += rc4_key->S[idx] + (v >> 8); swap (rc4_key, idx, j); idx++; + j += rc4_key->S[idx] + (v >> 16); swap (rc4_key, idx, j); idx++; + j += rc4_key->S[idx] + (v >> 24); swap (rc4_key, idx, j); idx++; + + v = data[3]; + + j += rc4_key->S[idx] + (v >> 0); swap (rc4_key, idx, j); idx++; + j += rc4_key->S[idx] + (v >> 8); swap (rc4_key, idx, j); idx++; + j += rc4_key->S[idx] + (v >> 16); swap (rc4_key, idx, j); idx++; + j += rc4_key->S[idx] + (v >> 24); swap (rc4_key, idx, j); idx++; + } +} + +static u8 rc4_next_16 (__local RC4_KEY *rc4_key, u8 i, u8 j, const u32 in[4], u32 out[4]) +{ + #pragma unroll + for (u32 k = 0; k < 4; k++) + { + u32 xor4 = 0; + + u8 idx; + + i += 1; + j += rc4_key->S[i]; + + swap (rc4_key, i, j); + + idx = rc4_key->S[i] + rc4_key->S[j]; + + xor4 |= rc4_key->S[idx] << 0; + + i += 1; + j += rc4_key->S[i]; + + swap (rc4_key, i, j); + + idx = rc4_key->S[i] + rc4_key->S[j]; + + xor4 |= rc4_key->S[idx] << 8; + + i += 1; + j += rc4_key->S[i]; + + swap (rc4_key, i, j); + + idx = rc4_key->S[i] + rc4_key->S[j]; + + xor4 |= rc4_key->S[idx] << 16; + + i += 1; + j += rc4_key->S[i]; + + swap (rc4_key, i, j); + + idx = rc4_key->S[i] + rc4_key->S[j]; + + xor4 |= rc4_key->S[idx] << 24; + + out[k] = in[k] ^ xor4; + } + + return j; +} + +static void sha1_transform (const u32x w0[4], const u32x w1[4], const u32x w2[4], const u32x w3[4], u32x digest[5]) +{ + u32x A = digest[0]; + u32x B = digest[1]; + u32x C = digest[2]; + u32x D = digest[3]; + u32x E = digest[4]; + + u32x w0_t = w0[0]; + u32x w1_t = w0[1]; + u32x w2_t = w0[2]; + u32x w3_t = w0[3]; + u32x w4_t = w1[0]; + u32x w5_t = w1[1]; + u32x w6_t = w1[2]; + u32x w7_t = w1[3]; + u32x w8_t = w2[0]; + u32x w9_t = w2[1]; + u32x wa_t = w2[2]; + u32x wb_t = w2[3]; + u32x wc_t = w3[0]; + u32x wd_t = w3[1]; + u32x we_t = w3[2]; + u32x wf_t = w3[3]; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, A, B, C, D, E, w0_t); + SHA1_STEP (SHA1_F0o, E, A, B, C, D, w1_t); + SHA1_STEP (SHA1_F0o, D, E, A, B, C, w2_t); + SHA1_STEP (SHA1_F0o, C, D, E, A, B, w3_t); + SHA1_STEP (SHA1_F0o, B, C, D, E, A, w4_t); + SHA1_STEP (SHA1_F0o, A, B, C, D, E, w5_t); + SHA1_STEP (SHA1_F0o, E, A, B, C, D, w6_t); + SHA1_STEP (SHA1_F0o, D, E, A, B, C, w7_t); + SHA1_STEP (SHA1_F0o, C, D, E, A, B, w8_t); + SHA1_STEP (SHA1_F0o, B, C, D, E, A, w9_t); + SHA1_STEP (SHA1_F0o, A, B, C, D, E, wa_t); + SHA1_STEP (SHA1_F0o, E, A, B, C, D, wb_t); + SHA1_STEP (SHA1_F0o, D, E, A, B, C, wc_t); + SHA1_STEP (SHA1_F0o, C, D, E, A, B, wd_t); + SHA1_STEP (SHA1_F0o, B, C, D, E, A, we_t); + SHA1_STEP (SHA1_F0o, A, B, C, D, E, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F0o, E, A, B, C, D, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F0o, D, E, A, B, C, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F0o, C, D, E, A, B, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F0o, B, C, D, E, A, w3_t); + + #undef K + #define K SHA1C01 + + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w7_t); + + #undef K + #define K SHA1C02 + + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, wb_t); + + #undef K + #define K SHA1C03 + + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, wf_t); + + digest[0] += A; + digest[1] += B; + digest[2] += C; + digest[3] += D; + digest[4] += E; +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m09800_m04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global oldoffice34_t *oldoffice34_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + __local RC4_KEY rc4_keys[64]; + + __local RC4_KEY *rc4_key = &rc4_keys[lid]; + + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + u32x pw_buf1[4]; + + pw_buf1[0] = pws[gid].i[ 4]; + pw_buf1[1] = pws[gid].i[ 5]; + pw_buf1[2] = pws[gid].i[ 6]; + pw_buf1[3] = pws[gid].i[ 7]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * salt + */ + + u32 salt_buf[4]; + + salt_buf[0] = salt_bufs[salt_pos].salt_buf[0]; + salt_buf[1] = salt_bufs[salt_pos].salt_buf[1]; + salt_buf[2] = salt_bufs[salt_pos].salt_buf[2]; + salt_buf[3] = salt_bufs[salt_pos].salt_buf[3]; + + const u32 salt_len = 16; + + /** + * esalt + */ + + const u32 version = oldoffice34_bufs[salt_pos].version; + + u32 encryptedVerifier[4]; + + encryptedVerifier[0] = oldoffice34_bufs[salt_pos].encryptedVerifier[0]; + encryptedVerifier[1] = oldoffice34_bufs[salt_pos].encryptedVerifier[1]; + encryptedVerifier[2] = oldoffice34_bufs[salt_pos].encryptedVerifier[2]; + encryptedVerifier[3] = oldoffice34_bufs[salt_pos].encryptedVerifier[3]; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + + w0[0] = pw_buf0[0]; + w0[1] = pw_buf0[1]; + w0[2] = pw_buf0[2]; + w0[3] = pw_buf0[3]; + + u32x w1[4]; + + w1[0] = pw_buf1[0]; + w1[1] = pw_buf1[1]; + w1[2] = pw_buf1[2]; + w1[3] = pw_buf1[3]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 out_len = apply_rules (rules_buf[il_pos].cmds, w0, w1, pw_len); + + const u32 pw_salt_len = (out_len * 2) + salt_len; + + append_0x80_2 (w0, w1, out_len); + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + make_unicode (w0, w0_t, w1_t); + make_unicode (w1, w2_t, w3_t); + + switch_buffer_by_offset (w0_t, w1_t, w2_t, w3_t, salt_len); + + w0_t[0] = salt_buf[0]; + w0_t[1] = salt_buf[1]; + w0_t[2] = salt_buf[2]; + w0_t[3] = salt_buf[3]; + w1_t[0] = swap_workaround (w1_t[0]); + w1_t[1] = swap_workaround (w1_t[1]); + w1_t[2] = swap_workaround (w1_t[2]); + w1_t[3] = swap_workaround (w1_t[3]); + w2_t[0] = swap_workaround (w2_t[0]); + w2_t[1] = swap_workaround (w2_t[1]); + w2_t[2] = swap_workaround (w2_t[2]); + w2_t[3] = swap_workaround (w2_t[3]); + w3_t[0] = swap_workaround (w3_t[0]); + w3_t[1] = swap_workaround (w3_t[1]); + w3_t[2] = 0; + w3_t[3] = pw_salt_len * 8; + + u32x digest[5]; + + digest[0] = SHA1M_A; + digest[1] = SHA1M_B; + digest[2] = SHA1M_C; + digest[3] = SHA1M_D; + digest[4] = SHA1M_E; + + sha1_transform (w0_t, w1_t, w2_t, w3_t, digest); + + w0_t[0] = digest[0]; + w0_t[1] = digest[1]; + w0_t[2] = digest[2]; + w0_t[3] = digest[3]; + w1_t[0] = digest[4]; + w1_t[1] = 0; + w1_t[2] = 0x80000000; + w1_t[3] = 0; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = (20 + 4) * 8; + + digest[0] = SHA1M_A; + digest[1] = SHA1M_B; + digest[2] = SHA1M_C; + digest[3] = SHA1M_D; + digest[4] = SHA1M_E; + + sha1_transform (w0_t, w1_t, w2_t, w3_t, digest); + + u32x key[4]; + + key[0] = swap_workaround (digest[0]); + key[1] = swap_workaround (digest[1]); + key[2] = swap_workaround (digest[2]); + key[3] = swap_workaround (digest[3]); + + if (version == 3) + { + key[1] &= 0xff; + key[2] = 0; + key[3] = 0; + } + + rc4_init_16 (rc4_key, key); + + u32x out[4]; + + u8 j = rc4_next_16 (rc4_key, 0, 0, encryptedVerifier, out); + + w0_t[0] = swap_workaround (out[0]); + w0_t[1] = swap_workaround (out[1]); + w0_t[2] = swap_workaround (out[2]); + w0_t[3] = swap_workaround (out[3]); + w1_t[0] = 0x80000000; + w1_t[1] = 0; + w1_t[2] = 0; + w1_t[3] = 0; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = 16 * 8; + + digest[0] = SHA1M_A; + digest[1] = SHA1M_B; + digest[2] = SHA1M_C; + digest[3] = SHA1M_D; + digest[4] = SHA1M_E; + + sha1_transform (w0_t, w1_t, w2_t, w3_t, digest); + + digest[0] = swap_workaround (digest[0]); + digest[1] = swap_workaround (digest[1]); + digest[2] = swap_workaround (digest[2]); + digest[3] = swap_workaround (digest[3]); + + rc4_next_16 (rc4_key, 16, j, digest, out); + + const u32x r0 = out[0]; + const u32x r1 = out[1]; + const u32x r2 = out[2]; + const u32x r3 = out[3]; + + #include VECT_COMPARE_M + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m09800_m08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global oldoffice34_t *oldoffice34_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m09800_m16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global oldoffice34_t *oldoffice34_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m09800_s04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global oldoffice34_t *oldoffice34_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + __local RC4_KEY rc4_keys[64]; + + __local RC4_KEY *rc4_key = &rc4_keys[lid]; + + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + u32x pw_buf1[4]; + + pw_buf1[0] = pws[gid].i[ 4]; + pw_buf1[1] = pws[gid].i[ 5]; + pw_buf1[2] = pws[gid].i[ 6]; + pw_buf1[3] = pws[gid].i[ 7]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * salt + */ + + u32 salt_buf[4]; + + salt_buf[0] = salt_bufs[salt_pos].salt_buf[0]; + salt_buf[1] = salt_bufs[salt_pos].salt_buf[1]; + salt_buf[2] = salt_bufs[salt_pos].salt_buf[2]; + salt_buf[3] = salt_bufs[salt_pos].salt_buf[3]; + + const u32 salt_len = 16; + + /** + * esalt + */ + + const u32 version = oldoffice34_bufs[salt_pos].version; + + u32 encryptedVerifier[4]; + + encryptedVerifier[0] = oldoffice34_bufs[salt_pos].encryptedVerifier[0]; + encryptedVerifier[1] = oldoffice34_bufs[salt_pos].encryptedVerifier[1]; + encryptedVerifier[2] = oldoffice34_bufs[salt_pos].encryptedVerifier[2]; + encryptedVerifier[3] = oldoffice34_bufs[salt_pos].encryptedVerifier[3]; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + + w0[0] = pw_buf0[0]; + w0[1] = pw_buf0[1]; + w0[2] = pw_buf0[2]; + w0[3] = pw_buf0[3]; + + u32x w1[4]; + + w1[0] = pw_buf1[0]; + w1[1] = pw_buf1[1]; + w1[2] = pw_buf1[2]; + w1[3] = pw_buf1[3]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 out_len = apply_rules (rules_buf[il_pos].cmds, w0, w1, pw_len); + + const u32 pw_salt_len = (out_len * 2) + salt_len; + + append_0x80_2 (w0, w1, out_len); + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + make_unicode (w0, w0_t, w1_t); + make_unicode (w1, w2_t, w3_t); + + switch_buffer_by_offset (w0_t, w1_t, w2_t, w3_t, salt_len); + + w0_t[0] = salt_buf[0]; + w0_t[1] = salt_buf[1]; + w0_t[2] = salt_buf[2]; + w0_t[3] = salt_buf[3]; + w1_t[0] = swap_workaround (w1_t[0]); + w1_t[1] = swap_workaround (w1_t[1]); + w1_t[2] = swap_workaround (w1_t[2]); + w1_t[3] = swap_workaround (w1_t[3]); + w2_t[0] = swap_workaround (w2_t[0]); + w2_t[1] = swap_workaround (w2_t[1]); + w2_t[2] = swap_workaround (w2_t[2]); + w2_t[3] = swap_workaround (w2_t[3]); + w3_t[0] = swap_workaround (w3_t[0]); + w3_t[1] = swap_workaround (w3_t[1]); + w3_t[2] = 0; + w3_t[3] = pw_salt_len * 8; + + u32x digest[5]; + + digest[0] = SHA1M_A; + digest[1] = SHA1M_B; + digest[2] = SHA1M_C; + digest[3] = SHA1M_D; + digest[4] = SHA1M_E; + + sha1_transform (w0_t, w1_t, w2_t, w3_t, digest); + + w0_t[0] = digest[0]; + w0_t[1] = digest[1]; + w0_t[2] = digest[2]; + w0_t[3] = digest[3]; + w1_t[0] = digest[4]; + w1_t[1] = 0; + w1_t[2] = 0x80000000; + w1_t[3] = 0; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = (20 + 4) * 8; + + digest[0] = SHA1M_A; + digest[1] = SHA1M_B; + digest[2] = SHA1M_C; + digest[3] = SHA1M_D; + digest[4] = SHA1M_E; + + sha1_transform (w0_t, w1_t, w2_t, w3_t, digest); + + u32x key[4]; + + key[0] = swap_workaround (digest[0]); + key[1] = swap_workaround (digest[1]); + key[2] = swap_workaround (digest[2]); + key[3] = swap_workaround (digest[3]); + + if (version == 3) + { + key[1] &= 0xff; + key[2] = 0; + key[3] = 0; + } + + rc4_init_16 (rc4_key, key); + + u32x out[4]; + + u8 j = rc4_next_16 (rc4_key, 0, 0, encryptedVerifier, out); + + w0_t[0] = swap_workaround (out[0]); + w0_t[1] = swap_workaround (out[1]); + w0_t[2] = swap_workaround (out[2]); + w0_t[3] = swap_workaround (out[3]); + w1_t[0] = 0x80000000; + w1_t[1] = 0; + w1_t[2] = 0; + w1_t[3] = 0; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = 16 * 8; + + digest[0] = SHA1M_A; + digest[1] = SHA1M_B; + digest[2] = SHA1M_C; + digest[3] = SHA1M_D; + digest[4] = SHA1M_E; + + sha1_transform (w0_t, w1_t, w2_t, w3_t, digest); + + digest[0] = swap_workaround (digest[0]); + digest[1] = swap_workaround (digest[1]); + digest[2] = swap_workaround (digest[2]); + digest[3] = swap_workaround (digest[3]); + + rc4_next_16 (rc4_key, 16, j, digest, out); + + const u32x r0 = out[0]; + const u32x r1 = out[1]; + const u32x r2 = out[2]; + const u32x r3 = out[3]; + + #include VECT_COMPARE_S + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m09800_s08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global oldoffice34_t *oldoffice34_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m09800_s16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global oldoffice34_t *oldoffice34_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/amd/m09800_a1.cl b/amd/m09800_a1.cl new file mode 100644 index 0000000000..3544fea3f0 --- /dev/null +++ b/amd/m09800_a1.cl @@ -0,0 +1,879 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _OLDOFFICE34_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW4 +#define VECT_SIZE1 +#endif + +#ifdef VLIW5 +#define VECT_SIZE1 +#endif + +#define DGST_R0 0 +#define DGST_R1 1 +#define DGST_R2 2 +#define DGST_R3 3 + +#include "include/kernel_functions.c" +#include "types_amd.c" +#include "common_amd.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +typedef struct +{ + u8 S[256]; + + u32 wtf_its_faster; + +} RC4_KEY; + +static void swap (__local RC4_KEY *rc4_key, const u8 i, const u8 j) +{ + u8 tmp; + + tmp = rc4_key->S[i]; + rc4_key->S[i] = rc4_key->S[j]; + rc4_key->S[j] = tmp; +} + +static void rc4_init_16 (__local RC4_KEY *rc4_key, const u32 data[4]) +{ + u32 v = 0x03020100; + u32 a = 0x04040404; + + __local u32 *ptr = (__local u32 *) rc4_key->S; + + #pragma unroll + for (u32 i = 0; i < 64; i++) + { + *ptr++ = v; v += a; + } + + u32 j = 0; + + #pragma unroll + for (u32 i = 0; i < 16; i++) + { + u32 idx = i * 16; + + u32 v; + + v = data[0]; + + j += rc4_key->S[idx] + (v >> 0); swap (rc4_key, idx, j); idx++; + j += rc4_key->S[idx] + (v >> 8); swap (rc4_key, idx, j); idx++; + j += rc4_key->S[idx] + (v >> 16); swap (rc4_key, idx, j); idx++; + j += rc4_key->S[idx] + (v >> 24); swap (rc4_key, idx, j); idx++; + + v = data[1]; + + j += rc4_key->S[idx] + (v >> 0); swap (rc4_key, idx, j); idx++; + j += rc4_key->S[idx] + (v >> 8); swap (rc4_key, idx, j); idx++; + j += rc4_key->S[idx] + (v >> 16); swap (rc4_key, idx, j); idx++; + j += rc4_key->S[idx] + (v >> 24); swap (rc4_key, idx, j); idx++; + + v = data[2]; + + j += rc4_key->S[idx] + (v >> 0); swap (rc4_key, idx, j); idx++; + j += rc4_key->S[idx] + (v >> 8); swap (rc4_key, idx, j); idx++; + j += rc4_key->S[idx] + (v >> 16); swap (rc4_key, idx, j); idx++; + j += rc4_key->S[idx] + (v >> 24); swap (rc4_key, idx, j); idx++; + + v = data[3]; + + j += rc4_key->S[idx] + (v >> 0); swap (rc4_key, idx, j); idx++; + j += rc4_key->S[idx] + (v >> 8); swap (rc4_key, idx, j); idx++; + j += rc4_key->S[idx] + (v >> 16); swap (rc4_key, idx, j); idx++; + j += rc4_key->S[idx] + (v >> 24); swap (rc4_key, idx, j); idx++; + } +} + +static u8 rc4_next_16 (__local RC4_KEY *rc4_key, u8 i, u8 j, const u32 in[4], u32 out[4]) +{ + #pragma unroll + for (u32 k = 0; k < 4; k++) + { + u32 xor4 = 0; + + u8 idx; + + i += 1; + j += rc4_key->S[i]; + + swap (rc4_key, i, j); + + idx = rc4_key->S[i] + rc4_key->S[j]; + + xor4 |= rc4_key->S[idx] << 0; + + i += 1; + j += rc4_key->S[i]; + + swap (rc4_key, i, j); + + idx = rc4_key->S[i] + rc4_key->S[j]; + + xor4 |= rc4_key->S[idx] << 8; + + i += 1; + j += rc4_key->S[i]; + + swap (rc4_key, i, j); + + idx = rc4_key->S[i] + rc4_key->S[j]; + + xor4 |= rc4_key->S[idx] << 16; + + i += 1; + j += rc4_key->S[i]; + + swap (rc4_key, i, j); + + idx = rc4_key->S[i] + rc4_key->S[j]; + + xor4 |= rc4_key->S[idx] << 24; + + out[k] = in[k] ^ xor4; + } + + return j; +} + +static void sha1_transform (const u32x w0[4], const u32x w1[4], const u32x w2[4], const u32x w3[4], u32x digest[5]) +{ + u32x A = digest[0]; + u32x B = digest[1]; + u32x C = digest[2]; + u32x D = digest[3]; + u32x E = digest[4]; + + u32x w0_t = w0[0]; + u32x w1_t = w0[1]; + u32x w2_t = w0[2]; + u32x w3_t = w0[3]; + u32x w4_t = w1[0]; + u32x w5_t = w1[1]; + u32x w6_t = w1[2]; + u32x w7_t = w1[3]; + u32x w8_t = w2[0]; + u32x w9_t = w2[1]; + u32x wa_t = w2[2]; + u32x wb_t = w2[3]; + u32x wc_t = w3[0]; + u32x wd_t = w3[1]; + u32x we_t = w3[2]; + u32x wf_t = w3[3]; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, A, B, C, D, E, w0_t); + SHA1_STEP (SHA1_F0o, E, A, B, C, D, w1_t); + SHA1_STEP (SHA1_F0o, D, E, A, B, C, w2_t); + SHA1_STEP (SHA1_F0o, C, D, E, A, B, w3_t); + SHA1_STEP (SHA1_F0o, B, C, D, E, A, w4_t); + SHA1_STEP (SHA1_F0o, A, B, C, D, E, w5_t); + SHA1_STEP (SHA1_F0o, E, A, B, C, D, w6_t); + SHA1_STEP (SHA1_F0o, D, E, A, B, C, w7_t); + SHA1_STEP (SHA1_F0o, C, D, E, A, B, w8_t); + SHA1_STEP (SHA1_F0o, B, C, D, E, A, w9_t); + SHA1_STEP (SHA1_F0o, A, B, C, D, E, wa_t); + SHA1_STEP (SHA1_F0o, E, A, B, C, D, wb_t); + SHA1_STEP (SHA1_F0o, D, E, A, B, C, wc_t); + SHA1_STEP (SHA1_F0o, C, D, E, A, B, wd_t); + SHA1_STEP (SHA1_F0o, B, C, D, E, A, we_t); + SHA1_STEP (SHA1_F0o, A, B, C, D, E, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F0o, E, A, B, C, D, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F0o, D, E, A, B, C, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F0o, C, D, E, A, B, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F0o, B, C, D, E, A, w3_t); + + #undef K + #define K SHA1C01 + + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w7_t); + + #undef K + #define K SHA1C02 + + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, wb_t); + + #undef K + #define K SHA1C03 + + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, wf_t); + + digest[0] += A; + digest[1] += B; + digest[2] += C; + digest[3] += D; + digest[4] += E; +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m09800_m04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global oldoffice34_t *oldoffice34_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + __local RC4_KEY rc4_keys[64]; + + __local RC4_KEY *rc4_key = &rc4_keys[lid]; + + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, combs_buf[0].pw_len); + } + + /** + * salt + */ + + u32 salt_buf[4]; + + salt_buf[0] = salt_bufs[salt_pos].salt_buf[0]; + salt_buf[1] = salt_bufs[salt_pos].salt_buf[1]; + salt_buf[2] = salt_bufs[salt_pos].salt_buf[2]; + salt_buf[3] = salt_bufs[salt_pos].salt_buf[3]; + + const u32 salt_len = 16; + + /** + * esalt + */ + + const u32 version = oldoffice34_bufs[salt_pos].version; + + u32 encryptedVerifier[4]; + + encryptedVerifier[0] = oldoffice34_bufs[salt_pos].encryptedVerifier[0]; + encryptedVerifier[1] = oldoffice34_bufs[salt_pos].encryptedVerifier[1]; + encryptedVerifier[2] = oldoffice34_bufs[salt_pos].encryptedVerifier[2]; + encryptedVerifier[3] = oldoffice34_bufs[salt_pos].encryptedVerifier[3]; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = combs_buf[il_pos].pw_len; + + const u32 pw_len = pw_l_len + pw_r_len; + + const u32 pw_salt_len = (pw_len * 2) + salt_len; + + u32 wordr0[4]; + + wordr0[0] = combs_buf[il_pos].i[0]; + wordr0[1] = combs_buf[il_pos].i[1]; + wordr0[2] = combs_buf[il_pos].i[2]; + wordr0[3] = combs_buf[il_pos].i[3]; + + u32 wordr1[4]; + + wordr1[0] = combs_buf[il_pos].i[4]; + wordr1[1] = combs_buf[il_pos].i[5]; + wordr1[2] = combs_buf[il_pos].i[6]; + wordr1[3] = combs_buf[il_pos].i[7]; + + u32 wordr2[4]; + + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + + u32 wordr3[4]; + + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + u32x w0[4]; + + w0[0] = wordl0[0] | wordr0[0]; + w0[1] = wordl0[1] | wordr0[1]; + w0[2] = wordl0[2] | wordr0[2]; + w0[3] = wordl0[3] | wordr0[3]; + + u32x w1[4]; + + w1[0] = wordl1[0] | wordr1[0]; + w1[1] = wordl1[1] | wordr1[1]; + w1[2] = wordl1[2] | wordr1[2]; + w1[3] = wordl1[3] | wordr1[3]; + + u32x w2[4]; + + w2[0] = wordl2[0] | wordr2[0]; + w2[1] = wordl2[1] | wordr2[1]; + w2[2] = wordl2[2] | wordr2[2]; + w2[3] = wordl2[3] | wordr2[3]; + + u32x w3[4]; + + w3[0] = wordl3[0] | wordr3[0]; + w3[1] = wordl3[1] | wordr3[1]; + w3[2] = 0; + w3[3] = 0; + + append_0x80_2 (w0, w1, pw_len); + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + make_unicode (w0, w0_t, w1_t); + make_unicode (w1, w2_t, w3_t); + + switch_buffer_by_offset (w0_t, w1_t, w2_t, w3_t, salt_len); + + w0_t[0] = salt_buf[0]; + w0_t[1] = salt_buf[1]; + w0_t[2] = salt_buf[2]; + w0_t[3] = salt_buf[3]; + w1_t[0] = swap_workaround (w1_t[0]); + w1_t[1] = swap_workaround (w1_t[1]); + w1_t[2] = swap_workaround (w1_t[2]); + w1_t[3] = swap_workaround (w1_t[3]); + w2_t[0] = swap_workaround (w2_t[0]); + w2_t[1] = swap_workaround (w2_t[1]); + w2_t[2] = swap_workaround (w2_t[2]); + w2_t[3] = swap_workaround (w2_t[3]); + w3_t[0] = swap_workaround (w3_t[0]); + w3_t[1] = swap_workaround (w3_t[1]); + w3_t[2] = 0; + w3_t[3] = pw_salt_len * 8; + + u32x digest[5]; + + digest[0] = SHA1M_A; + digest[1] = SHA1M_B; + digest[2] = SHA1M_C; + digest[3] = SHA1M_D; + digest[4] = SHA1M_E; + + sha1_transform (w0_t, w1_t, w2_t, w3_t, digest); + + w0_t[0] = digest[0]; + w0_t[1] = digest[1]; + w0_t[2] = digest[2]; + w0_t[3] = digest[3]; + w1_t[0] = digest[4]; + w1_t[1] = 0; + w1_t[2] = 0x80000000; + w1_t[3] = 0; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = (20 + 4) * 8; + + digest[0] = SHA1M_A; + digest[1] = SHA1M_B; + digest[2] = SHA1M_C; + digest[3] = SHA1M_D; + digest[4] = SHA1M_E; + + sha1_transform (w0_t, w1_t, w2_t, w3_t, digest); + + u32x key[4]; + + key[0] = swap_workaround (digest[0]); + key[1] = swap_workaround (digest[1]); + key[2] = swap_workaround (digest[2]); + key[3] = swap_workaround (digest[3]); + + if (version == 3) + { + key[1] &= 0xff; + key[2] = 0; + key[3] = 0; + } + + rc4_init_16 (rc4_key, key); + + u32x out[4]; + + u8 j = rc4_next_16 (rc4_key, 0, 0, encryptedVerifier, out); + + w0_t[0] = swap_workaround (out[0]); + w0_t[1] = swap_workaround (out[1]); + w0_t[2] = swap_workaround (out[2]); + w0_t[3] = swap_workaround (out[3]); + w1_t[0] = 0x80000000; + w1_t[1] = 0; + w1_t[2] = 0; + w1_t[3] = 0; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = 16 * 8; + + digest[0] = SHA1M_A; + digest[1] = SHA1M_B; + digest[2] = SHA1M_C; + digest[3] = SHA1M_D; + digest[4] = SHA1M_E; + + sha1_transform (w0_t, w1_t, w2_t, w3_t, digest); + + digest[0] = swap_workaround (digest[0]); + digest[1] = swap_workaround (digest[1]); + digest[2] = swap_workaround (digest[2]); + digest[3] = swap_workaround (digest[3]); + + rc4_next_16 (rc4_key, 16, j, digest, out); + + const u32x r0 = out[0]; + const u32x r1 = out[1]; + const u32x r2 = out[2]; + const u32x r3 = out[3]; + + #include VECT_COMPARE_M + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m09800_m08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global oldoffice34_t *oldoffice34_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m09800_m16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global oldoffice34_t *oldoffice34_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m09800_s04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global oldoffice34_t *oldoffice34_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + __local RC4_KEY rc4_keys[64]; + + __local RC4_KEY *rc4_key = &rc4_keys[lid]; + + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, combs_buf[0].pw_len); + } + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * salt + */ + + u32 salt_buf[4]; + + salt_buf[0] = salt_bufs[salt_pos].salt_buf[0]; + salt_buf[1] = salt_bufs[salt_pos].salt_buf[1]; + salt_buf[2] = salt_bufs[salt_pos].salt_buf[2]; + salt_buf[3] = salt_bufs[salt_pos].salt_buf[3]; + + const u32 salt_len = 16; + + /** + * esalt + */ + + const u32 version = oldoffice34_bufs[salt_pos].version; + + u32 encryptedVerifier[4]; + + encryptedVerifier[0] = oldoffice34_bufs[salt_pos].encryptedVerifier[0]; + encryptedVerifier[1] = oldoffice34_bufs[salt_pos].encryptedVerifier[1]; + encryptedVerifier[2] = oldoffice34_bufs[salt_pos].encryptedVerifier[2]; + encryptedVerifier[3] = oldoffice34_bufs[salt_pos].encryptedVerifier[3]; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = combs_buf[il_pos].pw_len; + + const u32 pw_len = pw_l_len + pw_r_len; + + const u32 pw_salt_len = (pw_len * 2) + salt_len; + + u32 wordr0[4]; + + wordr0[0] = combs_buf[il_pos].i[0]; + wordr0[1] = combs_buf[il_pos].i[1]; + wordr0[2] = combs_buf[il_pos].i[2]; + wordr0[3] = combs_buf[il_pos].i[3]; + + u32 wordr1[4]; + + wordr1[0] = combs_buf[il_pos].i[4]; + wordr1[1] = combs_buf[il_pos].i[5]; + wordr1[2] = combs_buf[il_pos].i[6]; + wordr1[3] = combs_buf[il_pos].i[7]; + + u32 wordr2[4]; + + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + + u32 wordr3[4]; + + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + u32x w0[4]; + + w0[0] = wordl0[0] | wordr0[0]; + w0[1] = wordl0[1] | wordr0[1]; + w0[2] = wordl0[2] | wordr0[2]; + w0[3] = wordl0[3] | wordr0[3]; + + u32x w1[4]; + + w1[0] = wordl1[0] | wordr1[0]; + w1[1] = wordl1[1] | wordr1[1]; + w1[2] = wordl1[2] | wordr1[2]; + w1[3] = wordl1[3] | wordr1[3]; + + u32x w2[4]; + + w2[0] = wordl2[0] | wordr2[0]; + w2[1] = wordl2[1] | wordr2[1]; + w2[2] = wordl2[2] | wordr2[2]; + w2[3] = wordl2[3] | wordr2[3]; + + u32x w3[4]; + + w3[0] = wordl3[0] | wordr3[0]; + w3[1] = wordl3[1] | wordr3[1]; + w3[2] = 0; + w3[3] = 0; + + append_0x80_2 (w0, w1, pw_len); + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + make_unicode (w0, w0_t, w1_t); + make_unicode (w1, w2_t, w3_t); + + switch_buffer_by_offset (w0_t, w1_t, w2_t, w3_t, salt_len); + + w0_t[0] = salt_buf[0]; + w0_t[1] = salt_buf[1]; + w0_t[2] = salt_buf[2]; + w0_t[3] = salt_buf[3]; + w1_t[0] = swap_workaround (w1_t[0]); + w1_t[1] = swap_workaround (w1_t[1]); + w1_t[2] = swap_workaround (w1_t[2]); + w1_t[3] = swap_workaround (w1_t[3]); + w2_t[0] = swap_workaround (w2_t[0]); + w2_t[1] = swap_workaround (w2_t[1]); + w2_t[2] = swap_workaround (w2_t[2]); + w2_t[3] = swap_workaround (w2_t[3]); + w3_t[0] = swap_workaround (w3_t[0]); + w3_t[1] = swap_workaround (w3_t[1]); + w3_t[2] = 0; + w3_t[3] = pw_salt_len * 8; + + u32x digest[5]; + + digest[0] = SHA1M_A; + digest[1] = SHA1M_B; + digest[2] = SHA1M_C; + digest[3] = SHA1M_D; + digest[4] = SHA1M_E; + + sha1_transform (w0_t, w1_t, w2_t, w3_t, digest); + + w0_t[0] = digest[0]; + w0_t[1] = digest[1]; + w0_t[2] = digest[2]; + w0_t[3] = digest[3]; + w1_t[0] = digest[4]; + w1_t[1] = 0; + w1_t[2] = 0x80000000; + w1_t[3] = 0; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = (20 + 4) * 8; + + digest[0] = SHA1M_A; + digest[1] = SHA1M_B; + digest[2] = SHA1M_C; + digest[3] = SHA1M_D; + digest[4] = SHA1M_E; + + sha1_transform (w0_t, w1_t, w2_t, w3_t, digest); + + u32x key[4]; + + key[0] = swap_workaround (digest[0]); + key[1] = swap_workaround (digest[1]); + key[2] = swap_workaround (digest[2]); + key[3] = swap_workaround (digest[3]); + + if (version == 3) + { + key[1] &= 0xff; + key[2] = 0; + key[3] = 0; + } + + rc4_init_16 (rc4_key, key); + + u32x out[4]; + + u8 j = rc4_next_16 (rc4_key, 0, 0, encryptedVerifier, out); + + w0_t[0] = swap_workaround (out[0]); + w0_t[1] = swap_workaround (out[1]); + w0_t[2] = swap_workaround (out[2]); + w0_t[3] = swap_workaround (out[3]); + w1_t[0] = 0x80000000; + w1_t[1] = 0; + w1_t[2] = 0; + w1_t[3] = 0; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = 16 * 8; + + digest[0] = SHA1M_A; + digest[1] = SHA1M_B; + digest[2] = SHA1M_C; + digest[3] = SHA1M_D; + digest[4] = SHA1M_E; + + sha1_transform (w0_t, w1_t, w2_t, w3_t, digest); + + digest[0] = swap_workaround (digest[0]); + digest[1] = swap_workaround (digest[1]); + digest[2] = swap_workaround (digest[2]); + digest[3] = swap_workaround (digest[3]); + + rc4_next_16 (rc4_key, 16, j, digest, out); + + const u32x r0 = out[0]; + const u32x r1 = out[1]; + const u32x r2 = out[2]; + const u32x r3 = out[3]; + + #include VECT_COMPARE_S + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m09800_s08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global oldoffice34_t *oldoffice34_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m09800_s16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global oldoffice34_t *oldoffice34_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/amd/m09800_a3.cl b/amd/m09800_a3.cl new file mode 100644 index 0000000000..ee30da1e16 --- /dev/null +++ b/amd/m09800_a3.cl @@ -0,0 +1,932 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _OLDOFFICE34_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW4 +#define VECT_SIZE1 +#endif + +#ifdef VLIW5 +#define VECT_SIZE1 +#endif + +#define DGST_R0 0 +#define DGST_R1 1 +#define DGST_R2 2 +#define DGST_R3 3 + +#include "include/kernel_functions.c" +#include "types_amd.c" +#include "common_amd.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +typedef struct +{ + u8 S[256]; + + u32 wtf_its_faster; + +} RC4_KEY; + +static void swap (__local RC4_KEY *rc4_key, const u8 i, const u8 j) +{ + u8 tmp; + + tmp = rc4_key->S[i]; + rc4_key->S[i] = rc4_key->S[j]; + rc4_key->S[j] = tmp; +} + +static void rc4_init_16 (__local RC4_KEY *rc4_key, const u32 data[4]) +{ + u32 v = 0x03020100; + u32 a = 0x04040404; + + __local u32 *ptr = (__local u32 *) rc4_key->S; + + #pragma unroll + for (u32 i = 0; i < 64; i++) + { + *ptr++ = v; v += a; + } + + u32 j = 0; + + #pragma unroll + for (u32 i = 0; i < 16; i++) + { + u32 idx = i * 16; + + u32 v; + + v = data[0]; + + j += rc4_key->S[idx] + (v >> 0); swap (rc4_key, idx, j); idx++; + j += rc4_key->S[idx] + (v >> 8); swap (rc4_key, idx, j); idx++; + j += rc4_key->S[idx] + (v >> 16); swap (rc4_key, idx, j); idx++; + j += rc4_key->S[idx] + (v >> 24); swap (rc4_key, idx, j); idx++; + + v = data[1]; + + j += rc4_key->S[idx] + (v >> 0); swap (rc4_key, idx, j); idx++; + j += rc4_key->S[idx] + (v >> 8); swap (rc4_key, idx, j); idx++; + j += rc4_key->S[idx] + (v >> 16); swap (rc4_key, idx, j); idx++; + j += rc4_key->S[idx] + (v >> 24); swap (rc4_key, idx, j); idx++; + + v = data[2]; + + j += rc4_key->S[idx] + (v >> 0); swap (rc4_key, idx, j); idx++; + j += rc4_key->S[idx] + (v >> 8); swap (rc4_key, idx, j); idx++; + j += rc4_key->S[idx] + (v >> 16); swap (rc4_key, idx, j); idx++; + j += rc4_key->S[idx] + (v >> 24); swap (rc4_key, idx, j); idx++; + + v = data[3]; + + j += rc4_key->S[idx] + (v >> 0); swap (rc4_key, idx, j); idx++; + j += rc4_key->S[idx] + (v >> 8); swap (rc4_key, idx, j); idx++; + j += rc4_key->S[idx] + (v >> 16); swap (rc4_key, idx, j); idx++; + j += rc4_key->S[idx] + (v >> 24); swap (rc4_key, idx, j); idx++; + } +} + +static u8 rc4_next_16 (__local RC4_KEY *rc4_key, u8 i, u8 j, const u32 in[4], u32 out[4]) +{ + #pragma unroll + for (u32 k = 0; k < 4; k++) + { + u32 xor4 = 0; + + u8 idx; + + i += 1; + j += rc4_key->S[i]; + + swap (rc4_key, i, j); + + idx = rc4_key->S[i] + rc4_key->S[j]; + + xor4 |= rc4_key->S[idx] << 0; + + i += 1; + j += rc4_key->S[i]; + + swap (rc4_key, i, j); + + idx = rc4_key->S[i] + rc4_key->S[j]; + + xor4 |= rc4_key->S[idx] << 8; + + i += 1; + j += rc4_key->S[i]; + + swap (rc4_key, i, j); + + idx = rc4_key->S[i] + rc4_key->S[j]; + + xor4 |= rc4_key->S[idx] << 16; + + i += 1; + j += rc4_key->S[i]; + + swap (rc4_key, i, j); + + idx = rc4_key->S[i] + rc4_key->S[j]; + + xor4 |= rc4_key->S[idx] << 24; + + out[k] = in[k] ^ xor4; + } + + return j; +} + +static void sha1_transform (const u32x w0[4], const u32x w1[4], const u32x w2[4], const u32x w3[4], u32x digest[5]) +{ + u32x A = digest[0]; + u32x B = digest[1]; + u32x C = digest[2]; + u32x D = digest[3]; + u32x E = digest[4]; + + u32x w0_t = w0[0]; + u32x w1_t = w0[1]; + u32x w2_t = w0[2]; + u32x w3_t = w0[3]; + u32x w4_t = w1[0]; + u32x w5_t = w1[1]; + u32x w6_t = w1[2]; + u32x w7_t = w1[3]; + u32x w8_t = w2[0]; + u32x w9_t = w2[1]; + u32x wa_t = w2[2]; + u32x wb_t = w2[3]; + u32x wc_t = w3[0]; + u32x wd_t = w3[1]; + u32x we_t = w3[2]; + u32x wf_t = w3[3]; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, A, B, C, D, E, w0_t); + SHA1_STEP (SHA1_F0o, E, A, B, C, D, w1_t); + SHA1_STEP (SHA1_F0o, D, E, A, B, C, w2_t); + SHA1_STEP (SHA1_F0o, C, D, E, A, B, w3_t); + SHA1_STEP (SHA1_F0o, B, C, D, E, A, w4_t); + SHA1_STEP (SHA1_F0o, A, B, C, D, E, w5_t); + SHA1_STEP (SHA1_F0o, E, A, B, C, D, w6_t); + SHA1_STEP (SHA1_F0o, D, E, A, B, C, w7_t); + SHA1_STEP (SHA1_F0o, C, D, E, A, B, w8_t); + SHA1_STEP (SHA1_F0o, B, C, D, E, A, w9_t); + SHA1_STEP (SHA1_F0o, A, B, C, D, E, wa_t); + SHA1_STEP (SHA1_F0o, E, A, B, C, D, wb_t); + SHA1_STEP (SHA1_F0o, D, E, A, B, C, wc_t); + SHA1_STEP (SHA1_F0o, C, D, E, A, B, wd_t); + SHA1_STEP (SHA1_F0o, B, C, D, E, A, we_t); + SHA1_STEP (SHA1_F0o, A, B, C, D, E, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F0o, E, A, B, C, D, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F0o, D, E, A, B, C, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F0o, C, D, E, A, B, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F0o, B, C, D, E, A, w3_t); + + #undef K + #define K SHA1C01 + + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w7_t); + + #undef K + #define K SHA1C02 + + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, wb_t); + + #undef K + #define K SHA1C03 + + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, wf_t); + + digest[0] += A; + digest[1] += B; + digest[2] += C; + digest[3] += D; + digest[4] += E; +} + +static void m09800m (__local RC4_KEY rc4_keys[64], u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], const u32 pw_len, __global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global oldoffice34_t *oldoffice34_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset) +{ + /** + * modifier + */ + + const u32 gid = get_global_id (0); + const u32 lid = get_local_id (0); + + __local RC4_KEY *rc4_key = &rc4_keys[lid]; + + /** + * salt + */ + + u32 salt_buf[4]; + + salt_buf[0] = salt_bufs[salt_pos].salt_buf[0]; + salt_buf[1] = salt_bufs[salt_pos].salt_buf[1]; + salt_buf[2] = salt_bufs[salt_pos].salt_buf[2]; + salt_buf[3] = salt_bufs[salt_pos].salt_buf[3]; + + const u32 salt_len = 16; + + const u32 pw_salt_len = pw_len + salt_len; + + /** + * esalt + */ + + const u32 version = oldoffice34_bufs[salt_pos].version; + + u32 encryptedVerifier[4]; + + encryptedVerifier[0] = oldoffice34_bufs[salt_pos].encryptedVerifier[0]; + encryptedVerifier[1] = oldoffice34_bufs[salt_pos].encryptedVerifier[1]; + encryptedVerifier[2] = oldoffice34_bufs[salt_pos].encryptedVerifier[2]; + encryptedVerifier[3] = oldoffice34_bufs[salt_pos].encryptedVerifier[3]; + + /** + * loop + */ + + u32x w0l = w0[0]; + + for (u32 il_pos = 0; il_pos < bfs_cnt; il_pos++) + { + const u32 w0r = bfs_buf[il_pos].i; + + w0[0] = w0l | w0r; + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + w0_t[0] = salt_buf[0]; + w0_t[1] = salt_buf[1]; + w0_t[2] = salt_buf[2]; + w0_t[3] = salt_buf[3]; + w1_t[0] = w0[0]; + w1_t[1] = w0[1]; + w1_t[2] = w0[2]; + w1_t[3] = w0[3]; + w2_t[0] = w1[0]; + w2_t[1] = w1[1]; + w2_t[2] = w1[2]; + w2_t[3] = w1[3]; + w3_t[0] = w2[0]; + w3_t[1] = w2[1]; + w3_t[2] = 0; + w3_t[3] = pw_salt_len * 8; + + u32x digest[5]; + + digest[0] = SHA1M_A; + digest[1] = SHA1M_B; + digest[2] = SHA1M_C; + digest[3] = SHA1M_D; + digest[4] = SHA1M_E; + + sha1_transform (w0_t, w1_t, w2_t, w3_t, digest); + + w0_t[0] = digest[0]; + w0_t[1] = digest[1]; + w0_t[2] = digest[2]; + w0_t[3] = digest[3]; + w1_t[0] = digest[4]; + w1_t[1] = 0; + w1_t[2] = 0x80000000; + w1_t[3] = 0; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = (20 + 4) * 8; + + digest[0] = SHA1M_A; + digest[1] = SHA1M_B; + digest[2] = SHA1M_C; + digest[3] = SHA1M_D; + digest[4] = SHA1M_E; + + sha1_transform (w0_t, w1_t, w2_t, w3_t, digest); + + u32x key[4]; + + key[0] = swap_workaround (digest[0]); + key[1] = swap_workaround (digest[1]); + key[2] = swap_workaround (digest[2]); + key[3] = swap_workaround (digest[3]); + + if (version == 3) + { + key[1] &= 0xff; + key[2] = 0; + key[3] = 0; + } + + rc4_init_16 (rc4_key, key); + + u32x out[4]; + + u8 j = rc4_next_16 (rc4_key, 0, 0, encryptedVerifier, out); + + w0_t[0] = swap_workaround (out[0]); + w0_t[1] = swap_workaround (out[1]); + w0_t[2] = swap_workaround (out[2]); + w0_t[3] = swap_workaround (out[3]); + w1_t[0] = 0x80000000; + w1_t[1] = 0; + w1_t[2] = 0; + w1_t[3] = 0; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = 16 * 8; + + digest[0] = SHA1M_A; + digest[1] = SHA1M_B; + digest[2] = SHA1M_C; + digest[3] = SHA1M_D; + digest[4] = SHA1M_E; + + sha1_transform (w0_t, w1_t, w2_t, w3_t, digest); + + digest[0] = swap_workaround (digest[0]); + digest[1] = swap_workaround (digest[1]); + digest[2] = swap_workaround (digest[2]); + digest[3] = swap_workaround (digest[3]); + + rc4_next_16 (rc4_key, 16, j, digest, out); + + const u32x r0 = out[0]; + const u32x r1 = out[1]; + const u32x r2 = out[2]; + const u32x r3 = out[3]; + + #include VECT_COMPARE_M + } +} + +static void m09800s (__local RC4_KEY rc4_keys[64], u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], const u32 pw_len, __global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global oldoffice34_t *oldoffice34_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset) +{ + /** + * modifier + */ + + const u32 gid = get_global_id (0); + const u32 lid = get_local_id (0); + + __local RC4_KEY *rc4_key = &rc4_keys[lid]; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * salt + */ + + u32 salt_buf[4]; + + salt_buf[0] = salt_bufs[salt_pos].salt_buf[0]; + salt_buf[1] = salt_bufs[salt_pos].salt_buf[1]; + salt_buf[2] = salt_bufs[salt_pos].salt_buf[2]; + salt_buf[3] = salt_bufs[salt_pos].salt_buf[3]; + + const u32 salt_len = 16; + + const u32 pw_salt_len = pw_len + salt_len; + + /** + * esalt + */ + + const u32 version = oldoffice34_bufs[salt_pos].version; + + u32 encryptedVerifier[4]; + + encryptedVerifier[0] = oldoffice34_bufs[salt_pos].encryptedVerifier[0]; + encryptedVerifier[1] = oldoffice34_bufs[salt_pos].encryptedVerifier[1]; + encryptedVerifier[2] = oldoffice34_bufs[salt_pos].encryptedVerifier[2]; + encryptedVerifier[3] = oldoffice34_bufs[salt_pos].encryptedVerifier[3]; + + /** + * loop + */ + + u32x w0l = w0[0]; + + for (u32 il_pos = 0; il_pos < bfs_cnt; il_pos++) + { + const u32 w0r = bfs_buf[il_pos].i; + + w0[0] = w0l | w0r; + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + w0_t[0] = salt_buf[0]; + w0_t[1] = salt_buf[1]; + w0_t[2] = salt_buf[2]; + w0_t[3] = salt_buf[3]; + w1_t[0] = w0[0]; + w1_t[1] = w0[1]; + w1_t[2] = w0[2]; + w1_t[3] = w0[3]; + w2_t[0] = w1[0]; + w2_t[1] = w1[1]; + w2_t[2] = w1[2]; + w2_t[3] = w1[3]; + w3_t[0] = w2[0]; + w3_t[1] = w2[1]; + w3_t[2] = 0; + w3_t[3] = pw_salt_len * 8; + + u32x digest[5]; + + digest[0] = SHA1M_A; + digest[1] = SHA1M_B; + digest[2] = SHA1M_C; + digest[3] = SHA1M_D; + digest[4] = SHA1M_E; + + sha1_transform (w0_t, w1_t, w2_t, w3_t, digest); + + w0_t[0] = digest[0]; + w0_t[1] = digest[1]; + w0_t[2] = digest[2]; + w0_t[3] = digest[3]; + w1_t[0] = digest[4]; + w1_t[1] = 0; + w1_t[2] = 0x80000000; + w1_t[3] = 0; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = (20 + 4) * 8; + + digest[0] = SHA1M_A; + digest[1] = SHA1M_B; + digest[2] = SHA1M_C; + digest[3] = SHA1M_D; + digest[4] = SHA1M_E; + + sha1_transform (w0_t, w1_t, w2_t, w3_t, digest); + + u32x key[4]; + + key[0] = swap_workaround (digest[0]); + key[1] = swap_workaround (digest[1]); + key[2] = swap_workaround (digest[2]); + key[3] = swap_workaround (digest[3]); + + if (version == 3) + { + key[1] &= 0xff; + key[2] = 0; + key[3] = 0; + } + + rc4_init_16 (rc4_key, key); + + u32x out[4]; + + u8 j = rc4_next_16 (rc4_key, 0, 0, encryptedVerifier, out); + + w0_t[0] = swap_workaround (out[0]); + w0_t[1] = swap_workaround (out[1]); + w0_t[2] = swap_workaround (out[2]); + w0_t[3] = swap_workaround (out[3]); + w1_t[0] = 0x80000000; + w1_t[1] = 0; + w1_t[2] = 0; + w1_t[3] = 0; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = 16 * 8; + + digest[0] = SHA1M_A; + digest[1] = SHA1M_B; + digest[2] = SHA1M_C; + digest[3] = SHA1M_D; + digest[4] = SHA1M_E; + + sha1_transform (w0_t, w1_t, w2_t, w3_t, digest); + + digest[0] = swap_workaround (digest[0]); + digest[1] = swap_workaround (digest[1]); + digest[2] = swap_workaround (digest[2]); + digest[3] = swap_workaround (digest[3]); + + rc4_next_16 (rc4_key, 16, j, digest, out); + + const u32x r0 = out[0]; + const u32x r1 = out[1]; + const u32x r2 = out[2]; + const u32x r3 = out[3]; + + #include VECT_COMPARE_S + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m09800_m04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global oldoffice34_t *oldoffice34_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + __local RC4_KEY rc4_keys[64]; + + m09800m (rc4_keys, w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, oldoffice34_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m09800_m08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global oldoffice34_t *oldoffice34_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + __local RC4_KEY rc4_keys[64]; + + m09800m (rc4_keys, w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, oldoffice34_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m09800_m16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global oldoffice34_t *oldoffice34_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = pws[gid].i[ 8]; + w2[1] = pws[gid].i[ 9]; + w2[2] = pws[gid].i[10]; + w2[3] = pws[gid].i[11]; + + u32x w3[4]; + + w3[0] = pws[gid].i[12]; + w3[1] = pws[gid].i[13]; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + __local RC4_KEY rc4_keys[64]; + + m09800m (rc4_keys, w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, oldoffice34_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m09800_s04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global oldoffice34_t *oldoffice34_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + __local RC4_KEY rc4_keys[64]; + + m09800s (rc4_keys, w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, oldoffice34_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m09800_s08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global oldoffice34_t *oldoffice34_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + __local RC4_KEY rc4_keys[64]; + + m09800s (rc4_keys, w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, oldoffice34_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m09800_s16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global oldoffice34_t *oldoffice34_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = pws[gid].i[ 8]; + w2[1] = pws[gid].i[ 9]; + w2[2] = pws[gid].i[10]; + w2[3] = pws[gid].i[11]; + + u32x w3[4]; + + w3[0] = pws[gid].i[12]; + w3[1] = pws[gid].i[13]; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + __local RC4_KEY rc4_keys[64]; + + m09800s (rc4_keys, w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, oldoffice34_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} diff --git a/amd/m09810_a0.cl b/amd/m09810_a0.cl new file mode 100644 index 0000000000..c118734215 --- /dev/null +++ b/amd/m09810_a0.cl @@ -0,0 +1,615 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _OLDOFFICE34_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW4 +#define VECT_SIZE1 +#endif + +#ifdef VLIW5 +#define VECT_SIZE1 +#endif + +#define DGST_R0 0 +#define DGST_R1 1 +#define DGST_R2 2 +#define DGST_R3 3 + +#include "include/kernel_functions.c" +#include "types_amd.c" +#include "common_amd.c" +#include "include/rp_gpu.h" +#include "rp_amd.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +typedef struct +{ + u8 S[256]; + + u32 wtf_its_faster; + +} RC4_KEY; + +static void swap (__local RC4_KEY *rc4_key, const u8 i, const u8 j) +{ + u8 tmp; + + tmp = rc4_key->S[i]; + rc4_key->S[i] = rc4_key->S[j]; + rc4_key->S[j] = tmp; +} + +static void rc4_init_16 (__local RC4_KEY *rc4_key, const u32 data[4]) +{ + u32 v = 0x03020100; + u32 a = 0x04040404; + + __local u32 *ptr = (__local u32 *) rc4_key->S; + + #pragma unroll + for (u32 i = 0; i < 64; i++) + { + *ptr++ = v; v += a; + } + + u32 j = 0; + + #pragma unroll + for (u32 i = 0; i < 16; i++) + { + u32 idx = i * 16; + + u32 v; + + v = data[0]; + + j += rc4_key->S[idx] + (v >> 0); swap (rc4_key, idx, j); idx++; + j += rc4_key->S[idx] + (v >> 8); swap (rc4_key, idx, j); idx++; + j += rc4_key->S[idx] + (v >> 16); swap (rc4_key, idx, j); idx++; + j += rc4_key->S[idx] + (v >> 24); swap (rc4_key, idx, j); idx++; + + v = data[1]; + + j += rc4_key->S[idx] + (v >> 0); swap (rc4_key, idx, j); idx++; + j += rc4_key->S[idx] + (v >> 8); swap (rc4_key, idx, j); idx++; + j += rc4_key->S[idx] + (v >> 16); swap (rc4_key, idx, j); idx++; + j += rc4_key->S[idx] + (v >> 24); swap (rc4_key, idx, j); idx++; + + v = data[2]; + + j += rc4_key->S[idx] + (v >> 0); swap (rc4_key, idx, j); idx++; + j += rc4_key->S[idx] + (v >> 8); swap (rc4_key, idx, j); idx++; + j += rc4_key->S[idx] + (v >> 16); swap (rc4_key, idx, j); idx++; + j += rc4_key->S[idx] + (v >> 24); swap (rc4_key, idx, j); idx++; + + v = data[3]; + + j += rc4_key->S[idx] + (v >> 0); swap (rc4_key, idx, j); idx++; + j += rc4_key->S[idx] + (v >> 8); swap (rc4_key, idx, j); idx++; + j += rc4_key->S[idx] + (v >> 16); swap (rc4_key, idx, j); idx++; + j += rc4_key->S[idx] + (v >> 24); swap (rc4_key, idx, j); idx++; + } +} + +static u8 rc4_next_16 (__local RC4_KEY *rc4_key, u8 i, u8 j, const u32 in[4], u32 out[4]) +{ + #pragma unroll + for (u32 k = 0; k < 4; k++) + { + u32 xor4 = 0; + + u8 idx; + + i += 1; + j += rc4_key->S[i]; + + swap (rc4_key, i, j); + + idx = rc4_key->S[i] + rc4_key->S[j]; + + xor4 |= rc4_key->S[idx] << 0; + + i += 1; + j += rc4_key->S[i]; + + swap (rc4_key, i, j); + + idx = rc4_key->S[i] + rc4_key->S[j]; + + xor4 |= rc4_key->S[idx] << 8; + + i += 1; + j += rc4_key->S[i]; + + swap (rc4_key, i, j); + + idx = rc4_key->S[i] + rc4_key->S[j]; + + xor4 |= rc4_key->S[idx] << 16; + + i += 1; + j += rc4_key->S[i]; + + swap (rc4_key, i, j); + + idx = rc4_key->S[i] + rc4_key->S[j]; + + xor4 |= rc4_key->S[idx] << 24; + + out[k] = in[k] ^ xor4; + } + + return j; +} + +static void sha1_transform (const u32x w0[4], const u32x w1[4], const u32x w2[4], const u32x w3[4], u32x digest[5]) +{ + u32x A = digest[0]; + u32x B = digest[1]; + u32x C = digest[2]; + u32x D = digest[3]; + u32x E = digest[4]; + + u32x w0_t = w0[0]; + u32x w1_t = w0[1]; + u32x w2_t = w0[2]; + u32x w3_t = w0[3]; + u32x w4_t = w1[0]; + u32x w5_t = w1[1]; + u32x w6_t = w1[2]; + u32x w7_t = w1[3]; + u32x w8_t = w2[0]; + u32x w9_t = w2[1]; + u32x wa_t = w2[2]; + u32x wb_t = w2[3]; + u32x wc_t = w3[0]; + u32x wd_t = w3[1]; + u32x we_t = w3[2]; + u32x wf_t = w3[3]; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, A, B, C, D, E, w0_t); + SHA1_STEP (SHA1_F0o, E, A, B, C, D, w1_t); + SHA1_STEP (SHA1_F0o, D, E, A, B, C, w2_t); + SHA1_STEP (SHA1_F0o, C, D, E, A, B, w3_t); + SHA1_STEP (SHA1_F0o, B, C, D, E, A, w4_t); + SHA1_STEP (SHA1_F0o, A, B, C, D, E, w5_t); + SHA1_STEP (SHA1_F0o, E, A, B, C, D, w6_t); + SHA1_STEP (SHA1_F0o, D, E, A, B, C, w7_t); + SHA1_STEP (SHA1_F0o, C, D, E, A, B, w8_t); + SHA1_STEP (SHA1_F0o, B, C, D, E, A, w9_t); + SHA1_STEP (SHA1_F0o, A, B, C, D, E, wa_t); + SHA1_STEP (SHA1_F0o, E, A, B, C, D, wb_t); + SHA1_STEP (SHA1_F0o, D, E, A, B, C, wc_t); + SHA1_STEP (SHA1_F0o, C, D, E, A, B, wd_t); + SHA1_STEP (SHA1_F0o, B, C, D, E, A, we_t); + SHA1_STEP (SHA1_F0o, A, B, C, D, E, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F0o, E, A, B, C, D, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F0o, D, E, A, B, C, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F0o, C, D, E, A, B, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F0o, B, C, D, E, A, w3_t); + + #undef K + #define K SHA1C01 + + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w7_t); + + #undef K + #define K SHA1C02 + + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, wb_t); + + #undef K + #define K SHA1C03 + + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, wf_t); + + digest[0] += A; + digest[1] += B; + digest[2] += C; + digest[3] += D; + digest[4] += E; +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m09810_m04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global oldoffice34_t *oldoffice34_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + __local RC4_KEY rc4_keys[64]; + + __local RC4_KEY *rc4_key = &rc4_keys[lid]; + + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + u32x pw_buf1[4]; + + pw_buf1[0] = pws[gid].i[ 4]; + pw_buf1[1] = pws[gid].i[ 5]; + pw_buf1[2] = pws[gid].i[ 6]; + pw_buf1[3] = pws[gid].i[ 7]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * esalt + */ + + const u32 version = oldoffice34_bufs[salt_pos].version; + + u32 encryptedVerifier[4]; + + encryptedVerifier[0] = oldoffice34_bufs[salt_pos].encryptedVerifier[0]; + encryptedVerifier[1] = oldoffice34_bufs[salt_pos].encryptedVerifier[1]; + encryptedVerifier[2] = oldoffice34_bufs[salt_pos].encryptedVerifier[2]; + encryptedVerifier[3] = oldoffice34_bufs[salt_pos].encryptedVerifier[3]; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + + w0[0] = pw_buf0[0]; + w0[1] = pw_buf0[1]; + w0[2] = pw_buf0[2]; + w0[3] = pw_buf0[3]; + + u32x w1[4]; + + w1[0] = pw_buf1[0]; + w1[1] = pw_buf1[1]; + w1[2] = pw_buf1[2]; + w1[3] = pw_buf1[3]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + apply_rules (rules_buf[il_pos].cmds, w0, w1, pw_len); + + u32x key[4]; + + key[0] = w0[0]; + key[1] = w0[1] & 0xff; + key[2] = 0; + key[3] = 0; + + rc4_init_16 (rc4_key, key); + + u32x out[4]; + + u8 j = rc4_next_16 (rc4_key, 0, 0, encryptedVerifier, out); + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + w0_t[0] = swap_workaround (out[0]); + w0_t[1] = swap_workaround (out[1]); + w0_t[2] = swap_workaround (out[2]); + w0_t[3] = swap_workaround (out[3]); + w1_t[0] = 0x80000000; + w1_t[1] = 0; + w1_t[2] = 0; + w1_t[3] = 0; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = 16 * 8; + + u32x digest[5]; + + digest[0] = SHA1M_A; + digest[1] = SHA1M_B; + digest[2] = SHA1M_C; + digest[3] = SHA1M_D; + digest[4] = SHA1M_E; + + sha1_transform (w0_t, w1_t, w2_t, w3_t, digest); + + digest[0] = swap_workaround (digest[0]); + digest[1] = swap_workaround (digest[1]); + digest[2] = swap_workaround (digest[2]); + digest[3] = swap_workaround (digest[3]); + + rc4_next_16 (rc4_key, 16, j, digest, out); + + const u32x r0 = out[0]; + const u32x r1 = out[1]; + const u32x r2 = out[2]; + const u32x r3 = out[3]; + + #include VECT_COMPARE_M + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m09810_m08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global oldoffice34_t *oldoffice34_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m09810_m16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global oldoffice34_t *oldoffice34_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m09810_s04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global oldoffice34_t *oldoffice34_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + __local RC4_KEY rc4_keys[64]; + + __local RC4_KEY *rc4_key = &rc4_keys[lid]; + + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + u32x pw_buf1[4]; + + pw_buf1[0] = pws[gid].i[ 4]; + pw_buf1[1] = pws[gid].i[ 5]; + pw_buf1[2] = pws[gid].i[ 6]; + pw_buf1[3] = pws[gid].i[ 7]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * esalt + */ + + const u32 version = oldoffice34_bufs[salt_pos].version; + + u32 encryptedVerifier[4]; + + encryptedVerifier[0] = oldoffice34_bufs[salt_pos].encryptedVerifier[0]; + encryptedVerifier[1] = oldoffice34_bufs[salt_pos].encryptedVerifier[1]; + encryptedVerifier[2] = oldoffice34_bufs[salt_pos].encryptedVerifier[2]; + encryptedVerifier[3] = oldoffice34_bufs[salt_pos].encryptedVerifier[3]; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + + w0[0] = pw_buf0[0]; + w0[1] = pw_buf0[1]; + w0[2] = pw_buf0[2]; + w0[3] = pw_buf0[3]; + + u32x w1[4]; + + w1[0] = pw_buf1[0]; + w1[1] = pw_buf1[1]; + w1[2] = pw_buf1[2]; + w1[3] = pw_buf1[3]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + apply_rules (rules_buf[il_pos].cmds, w0, w1, pw_len); + + u32x key[4]; + + key[0] = w0[0]; + key[1] = w0[1] & 0xff; + key[2] = 0; + key[3] = 0; + + rc4_init_16 (rc4_key, key); + + u32x out[4]; + + u8 j = rc4_next_16 (rc4_key, 0, 0, encryptedVerifier, out); + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + w0_t[0] = swap_workaround (out[0]); + w0_t[1] = swap_workaround (out[1]); + w0_t[2] = swap_workaround (out[2]); + w0_t[3] = swap_workaround (out[3]); + w1_t[0] = 0x80000000; + w1_t[1] = 0; + w1_t[2] = 0; + w1_t[3] = 0; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = 16 * 8; + + u32x digest[5]; + + digest[0] = SHA1M_A; + digest[1] = SHA1M_B; + digest[2] = SHA1M_C; + digest[3] = SHA1M_D; + digest[4] = SHA1M_E; + + sha1_transform (w0_t, w1_t, w2_t, w3_t, digest); + + digest[0] = swap_workaround (digest[0]); + digest[1] = swap_workaround (digest[1]); + digest[2] = swap_workaround (digest[2]); + digest[3] = swap_workaround (digest[3]); + + rc4_next_16 (rc4_key, 16, j, digest, out); + + const u32x r0 = out[0]; + const u32x r1 = out[1]; + const u32x r2 = out[2]; + const u32x r3 = out[3]; + + #include VECT_COMPARE_S + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m09810_s08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global oldoffice34_t *oldoffice34_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m09810_s16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global oldoffice34_t *oldoffice34_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/amd/m09810_a1.cl b/amd/m09810_a1.cl new file mode 100644 index 0000000000..7d6a7ab413 --- /dev/null +++ b/amd/m09810_a1.cl @@ -0,0 +1,669 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _OLDOFFICE34_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW4 +#define VECT_SIZE1 +#endif + +#ifdef VLIW5 +#define VECT_SIZE1 +#endif + +#define DGST_R0 0 +#define DGST_R1 1 +#define DGST_R2 2 +#define DGST_R3 3 + +#include "include/kernel_functions.c" +#include "types_amd.c" +#include "common_amd.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +typedef struct +{ + u8 S[256]; + + u32 wtf_its_faster; + +} RC4_KEY; + +static void swap (__local RC4_KEY *rc4_key, const u8 i, const u8 j) +{ + u8 tmp; + + tmp = rc4_key->S[i]; + rc4_key->S[i] = rc4_key->S[j]; + rc4_key->S[j] = tmp; +} + +static void rc4_init_16 (__local RC4_KEY *rc4_key, const u32 data[4]) +{ + u32 v = 0x03020100; + u32 a = 0x04040404; + + __local u32 *ptr = (__local u32 *) rc4_key->S; + + #pragma unroll + for (u32 i = 0; i < 64; i++) + { + *ptr++ = v; v += a; + } + + u32 j = 0; + + #pragma unroll + for (u32 i = 0; i < 16; i++) + { + u32 idx = i * 16; + + u32 v; + + v = data[0]; + + j += rc4_key->S[idx] + (v >> 0); swap (rc4_key, idx, j); idx++; + j += rc4_key->S[idx] + (v >> 8); swap (rc4_key, idx, j); idx++; + j += rc4_key->S[idx] + (v >> 16); swap (rc4_key, idx, j); idx++; + j += rc4_key->S[idx] + (v >> 24); swap (rc4_key, idx, j); idx++; + + v = data[1]; + + j += rc4_key->S[idx] + (v >> 0); swap (rc4_key, idx, j); idx++; + j += rc4_key->S[idx] + (v >> 8); swap (rc4_key, idx, j); idx++; + j += rc4_key->S[idx] + (v >> 16); swap (rc4_key, idx, j); idx++; + j += rc4_key->S[idx] + (v >> 24); swap (rc4_key, idx, j); idx++; + + v = data[2]; + + j += rc4_key->S[idx] + (v >> 0); swap (rc4_key, idx, j); idx++; + j += rc4_key->S[idx] + (v >> 8); swap (rc4_key, idx, j); idx++; + j += rc4_key->S[idx] + (v >> 16); swap (rc4_key, idx, j); idx++; + j += rc4_key->S[idx] + (v >> 24); swap (rc4_key, idx, j); idx++; + + v = data[3]; + + j += rc4_key->S[idx] + (v >> 0); swap (rc4_key, idx, j); idx++; + j += rc4_key->S[idx] + (v >> 8); swap (rc4_key, idx, j); idx++; + j += rc4_key->S[idx] + (v >> 16); swap (rc4_key, idx, j); idx++; + j += rc4_key->S[idx] + (v >> 24); swap (rc4_key, idx, j); idx++; + } +} + +static u8 rc4_next_16 (__local RC4_KEY *rc4_key, u8 i, u8 j, const u32 in[4], u32 out[4]) +{ + #pragma unroll + for (u32 k = 0; k < 4; k++) + { + u32 xor4 = 0; + + u8 idx; + + i += 1; + j += rc4_key->S[i]; + + swap (rc4_key, i, j); + + idx = rc4_key->S[i] + rc4_key->S[j]; + + xor4 |= rc4_key->S[idx] << 0; + + i += 1; + j += rc4_key->S[i]; + + swap (rc4_key, i, j); + + idx = rc4_key->S[i] + rc4_key->S[j]; + + xor4 |= rc4_key->S[idx] << 8; + + i += 1; + j += rc4_key->S[i]; + + swap (rc4_key, i, j); + + idx = rc4_key->S[i] + rc4_key->S[j]; + + xor4 |= rc4_key->S[idx] << 16; + + i += 1; + j += rc4_key->S[i]; + + swap (rc4_key, i, j); + + idx = rc4_key->S[i] + rc4_key->S[j]; + + xor4 |= rc4_key->S[idx] << 24; + + out[k] = in[k] ^ xor4; + } + + return j; +} + +static void sha1_transform (const u32x w0[4], const u32x w1[4], const u32x w2[4], const u32x w3[4], u32x digest[5]) +{ + u32x A = digest[0]; + u32x B = digest[1]; + u32x C = digest[2]; + u32x D = digest[3]; + u32x E = digest[4]; + + u32x w0_t = w0[0]; + u32x w1_t = w0[1]; + u32x w2_t = w0[2]; + u32x w3_t = w0[3]; + u32x w4_t = w1[0]; + u32x w5_t = w1[1]; + u32x w6_t = w1[2]; + u32x w7_t = w1[3]; + u32x w8_t = w2[0]; + u32x w9_t = w2[1]; + u32x wa_t = w2[2]; + u32x wb_t = w2[3]; + u32x wc_t = w3[0]; + u32x wd_t = w3[1]; + u32x we_t = w3[2]; + u32x wf_t = w3[3]; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, A, B, C, D, E, w0_t); + SHA1_STEP (SHA1_F0o, E, A, B, C, D, w1_t); + SHA1_STEP (SHA1_F0o, D, E, A, B, C, w2_t); + SHA1_STEP (SHA1_F0o, C, D, E, A, B, w3_t); + SHA1_STEP (SHA1_F0o, B, C, D, E, A, w4_t); + SHA1_STEP (SHA1_F0o, A, B, C, D, E, w5_t); + SHA1_STEP (SHA1_F0o, E, A, B, C, D, w6_t); + SHA1_STEP (SHA1_F0o, D, E, A, B, C, w7_t); + SHA1_STEP (SHA1_F0o, C, D, E, A, B, w8_t); + SHA1_STEP (SHA1_F0o, B, C, D, E, A, w9_t); + SHA1_STEP (SHA1_F0o, A, B, C, D, E, wa_t); + SHA1_STEP (SHA1_F0o, E, A, B, C, D, wb_t); + SHA1_STEP (SHA1_F0o, D, E, A, B, C, wc_t); + SHA1_STEP (SHA1_F0o, C, D, E, A, B, wd_t); + SHA1_STEP (SHA1_F0o, B, C, D, E, A, we_t); + SHA1_STEP (SHA1_F0o, A, B, C, D, E, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F0o, E, A, B, C, D, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F0o, D, E, A, B, C, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F0o, C, D, E, A, B, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F0o, B, C, D, E, A, w3_t); + + #undef K + #define K SHA1C01 + + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w7_t); + + #undef K + #define K SHA1C02 + + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, wb_t); + + #undef K + #define K SHA1C03 + + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, wf_t); + + digest[0] += A; + digest[1] += B; + digest[2] += C; + digest[3] += D; + digest[4] += E; +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m09810_m04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global oldoffice34_t *oldoffice34_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + __local RC4_KEY rc4_keys[64]; + + __local RC4_KEY *rc4_key = &rc4_keys[lid]; + + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, combs_buf[0].pw_len); + } + + /** + * esalt + */ + + const u32 version = oldoffice34_bufs[salt_pos].version; + + u32 encryptedVerifier[4]; + + encryptedVerifier[0] = oldoffice34_bufs[salt_pos].encryptedVerifier[0]; + encryptedVerifier[1] = oldoffice34_bufs[salt_pos].encryptedVerifier[1]; + encryptedVerifier[2] = oldoffice34_bufs[salt_pos].encryptedVerifier[2]; + encryptedVerifier[3] = oldoffice34_bufs[salt_pos].encryptedVerifier[3]; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = combs_buf[il_pos].pw_len; + + const u32 pw_len = pw_l_len + pw_r_len; + + u32 wordr0[4]; + + wordr0[0] = combs_buf[il_pos].i[0]; + wordr0[1] = combs_buf[il_pos].i[1]; + wordr0[2] = combs_buf[il_pos].i[2]; + wordr0[3] = combs_buf[il_pos].i[3]; + + u32 wordr1[4]; + + wordr1[0] = combs_buf[il_pos].i[4]; + wordr1[1] = combs_buf[il_pos].i[5]; + wordr1[2] = combs_buf[il_pos].i[6]; + wordr1[3] = combs_buf[il_pos].i[7]; + + u32 wordr2[4]; + + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + + u32 wordr3[4]; + + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + u32x w0[4]; + + u32x key[4]; + + key[0] = wordl0[0] | wordr0[0]; + key[1] = (wordl0[1] | wordr0[1]) & 0xff; + key[2] = 0; + key[3] = 0; + + rc4_init_16 (rc4_key, key); + + u32x out[4]; + + u8 j = rc4_next_16 (rc4_key, 0, 0, encryptedVerifier, out); + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + w0_t[0] = swap_workaround (out[0]); + w0_t[1] = swap_workaround (out[1]); + w0_t[2] = swap_workaround (out[2]); + w0_t[3] = swap_workaround (out[3]); + w1_t[0] = 0x80000000; + w1_t[1] = 0; + w1_t[2] = 0; + w1_t[3] = 0; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = 16 * 8; + + u32x digest[5]; + + digest[0] = SHA1M_A; + digest[1] = SHA1M_B; + digest[2] = SHA1M_C; + digest[3] = SHA1M_D; + digest[4] = SHA1M_E; + + sha1_transform (w0_t, w1_t, w2_t, w3_t, digest); + + digest[0] = swap_workaround (digest[0]); + digest[1] = swap_workaround (digest[1]); + digest[2] = swap_workaround (digest[2]); + digest[3] = swap_workaround (digest[3]); + + rc4_next_16 (rc4_key, 16, j, digest, out); + + const u32x r0 = out[0]; + const u32x r1 = out[1]; + const u32x r2 = out[2]; + const u32x r3 = out[3]; + + #include VECT_COMPARE_M + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m09810_m08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global oldoffice34_t *oldoffice34_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m09810_m16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global oldoffice34_t *oldoffice34_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m09810_s04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global oldoffice34_t *oldoffice34_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + __local RC4_KEY rc4_keys[64]; + + __local RC4_KEY *rc4_key = &rc4_keys[lid]; + + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, combs_buf[0].pw_len); + } + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * esalt + */ + + const u32 version = oldoffice34_bufs[salt_pos].version; + + u32 encryptedVerifier[4]; + + encryptedVerifier[0] = oldoffice34_bufs[salt_pos].encryptedVerifier[0]; + encryptedVerifier[1] = oldoffice34_bufs[salt_pos].encryptedVerifier[1]; + encryptedVerifier[2] = oldoffice34_bufs[salt_pos].encryptedVerifier[2]; + encryptedVerifier[3] = oldoffice34_bufs[salt_pos].encryptedVerifier[3]; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = combs_buf[il_pos].pw_len; + + const u32 pw_len = pw_l_len + pw_r_len; + + u32 wordr0[4]; + + wordr0[0] = combs_buf[il_pos].i[0]; + wordr0[1] = combs_buf[il_pos].i[1]; + wordr0[2] = combs_buf[il_pos].i[2]; + wordr0[3] = combs_buf[il_pos].i[3]; + + u32 wordr1[4]; + + wordr1[0] = combs_buf[il_pos].i[4]; + wordr1[1] = combs_buf[il_pos].i[5]; + wordr1[2] = combs_buf[il_pos].i[6]; + wordr1[3] = combs_buf[il_pos].i[7]; + + u32 wordr2[4]; + + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + + u32 wordr3[4]; + + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + u32x w0[4]; + + u32x key[4]; + + key[0] = wordl0[0] | wordr0[0]; + key[1] = (wordl0[1] | wordr0[1]) & 0xff; + key[2] = 0; + key[3] = 0; + + rc4_init_16 (rc4_key, key); + + u32x out[4]; + + u8 j = rc4_next_16 (rc4_key, 0, 0, encryptedVerifier, out); + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + w0_t[0] = swap_workaround (out[0]); + w0_t[1] = swap_workaround (out[1]); + w0_t[2] = swap_workaround (out[2]); + w0_t[3] = swap_workaround (out[3]); + w1_t[0] = 0x80000000; + w1_t[1] = 0; + w1_t[2] = 0; + w1_t[3] = 0; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = 16 * 8; + + u32x digest[5]; + + digest[0] = SHA1M_A; + digest[1] = SHA1M_B; + digest[2] = SHA1M_C; + digest[3] = SHA1M_D; + digest[4] = SHA1M_E; + + sha1_transform (w0_t, w1_t, w2_t, w3_t, digest); + + digest[0] = swap_workaround (digest[0]); + digest[1] = swap_workaround (digest[1]); + digest[2] = swap_workaround (digest[2]); + digest[3] = swap_workaround (digest[3]); + + rc4_next_16 (rc4_key, 16, j, digest, out); + + const u32x r0 = out[0]; + const u32x r1 = out[1]; + const u32x r2 = out[2]; + const u32x r3 = out[3]; + + #include VECT_COMPARE_S + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m09810_s08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global oldoffice34_t *oldoffice34_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m09810_s16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global oldoffice34_t *oldoffice34_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/amd/m09810_a3.cl b/amd/m09810_a3.cl new file mode 100644 index 0000000000..4d0c5a5fa6 --- /dev/null +++ b/amd/m09810_a3.cl @@ -0,0 +1,788 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _OLDOFFICE34_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW4 +#define VECT_SIZE1 +#endif + +#ifdef VLIW5 +#define VECT_SIZE1 +#endif + +#define DGST_R0 0 +#define DGST_R1 1 +#define DGST_R2 2 +#define DGST_R3 3 + +#include "include/kernel_functions.c" +#include "types_amd.c" +#include "common_amd.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +typedef struct +{ + u8 S[256]; + + u32 wtf_its_faster; + +} RC4_KEY; + +static void swap (__local RC4_KEY *rc4_key, const u8 i, const u8 j) +{ + u8 tmp; + + tmp = rc4_key->S[i]; + rc4_key->S[i] = rc4_key->S[j]; + rc4_key->S[j] = tmp; +} + +static void rc4_init_16 (__local RC4_KEY *rc4_key, const u32 data[4]) +{ + u32 v = 0x03020100; + u32 a = 0x04040404; + + __local u32 *ptr = (__local u32 *) rc4_key->S; + + #pragma unroll + for (u32 i = 0; i < 64; i++) + { + *ptr++ = v; v += a; + } + + u32 j = 0; + + #pragma unroll + for (u32 i = 0; i < 16; i++) + { + u32 idx = i * 16; + + u32 v; + + v = data[0]; + + j += rc4_key->S[idx] + (v >> 0); swap (rc4_key, idx, j); idx++; + j += rc4_key->S[idx] + (v >> 8); swap (rc4_key, idx, j); idx++; + j += rc4_key->S[idx] + (v >> 16); swap (rc4_key, idx, j); idx++; + j += rc4_key->S[idx] + (v >> 24); swap (rc4_key, idx, j); idx++; + + v = data[1]; + + j += rc4_key->S[idx] + (v >> 0); swap (rc4_key, idx, j); idx++; + j += rc4_key->S[idx] + (v >> 8); swap (rc4_key, idx, j); idx++; + j += rc4_key->S[idx] + (v >> 16); swap (rc4_key, idx, j); idx++; + j += rc4_key->S[idx] + (v >> 24); swap (rc4_key, idx, j); idx++; + + v = data[2]; + + j += rc4_key->S[idx] + (v >> 0); swap (rc4_key, idx, j); idx++; + j += rc4_key->S[idx] + (v >> 8); swap (rc4_key, idx, j); idx++; + j += rc4_key->S[idx] + (v >> 16); swap (rc4_key, idx, j); idx++; + j += rc4_key->S[idx] + (v >> 24); swap (rc4_key, idx, j); idx++; + + v = data[3]; + + j += rc4_key->S[idx] + (v >> 0); swap (rc4_key, idx, j); idx++; + j += rc4_key->S[idx] + (v >> 8); swap (rc4_key, idx, j); idx++; + j += rc4_key->S[idx] + (v >> 16); swap (rc4_key, idx, j); idx++; + j += rc4_key->S[idx] + (v >> 24); swap (rc4_key, idx, j); idx++; + } +} + +static u8 rc4_next_16 (__local RC4_KEY *rc4_key, u8 i, u8 j, const u32 in[4], u32 out[4]) +{ + #pragma unroll + for (u32 k = 0; k < 4; k++) + { + u32 xor4 = 0; + + u8 idx; + + i += 1; + j += rc4_key->S[i]; + + swap (rc4_key, i, j); + + idx = rc4_key->S[i] + rc4_key->S[j]; + + xor4 |= rc4_key->S[idx] << 0; + + i += 1; + j += rc4_key->S[i]; + + swap (rc4_key, i, j); + + idx = rc4_key->S[i] + rc4_key->S[j]; + + xor4 |= rc4_key->S[idx] << 8; + + i += 1; + j += rc4_key->S[i]; + + swap (rc4_key, i, j); + + idx = rc4_key->S[i] + rc4_key->S[j]; + + xor4 |= rc4_key->S[idx] << 16; + + i += 1; + j += rc4_key->S[i]; + + swap (rc4_key, i, j); + + idx = rc4_key->S[i] + rc4_key->S[j]; + + xor4 |= rc4_key->S[idx] << 24; + + out[k] = in[k] ^ xor4; + } + + return j; +} + +static void sha1_transform (const u32x w0[4], const u32x w1[4], const u32x w2[4], const u32x w3[4], u32x digest[5]) +{ + u32x A = digest[0]; + u32x B = digest[1]; + u32x C = digest[2]; + u32x D = digest[3]; + u32x E = digest[4]; + + u32x w0_t = w0[0]; + u32x w1_t = w0[1]; + u32x w2_t = w0[2]; + u32x w3_t = w0[3]; + u32x w4_t = w1[0]; + u32x w5_t = w1[1]; + u32x w6_t = w1[2]; + u32x w7_t = w1[3]; + u32x w8_t = w2[0]; + u32x w9_t = w2[1]; + u32x wa_t = w2[2]; + u32x wb_t = w2[3]; + u32x wc_t = w3[0]; + u32x wd_t = w3[1]; + u32x we_t = w3[2]; + u32x wf_t = w3[3]; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, A, B, C, D, E, w0_t); + SHA1_STEP (SHA1_F0o, E, A, B, C, D, w1_t); + SHA1_STEP (SHA1_F0o, D, E, A, B, C, w2_t); + SHA1_STEP (SHA1_F0o, C, D, E, A, B, w3_t); + SHA1_STEP (SHA1_F0o, B, C, D, E, A, w4_t); + SHA1_STEP (SHA1_F0o, A, B, C, D, E, w5_t); + SHA1_STEP (SHA1_F0o, E, A, B, C, D, w6_t); + SHA1_STEP (SHA1_F0o, D, E, A, B, C, w7_t); + SHA1_STEP (SHA1_F0o, C, D, E, A, B, w8_t); + SHA1_STEP (SHA1_F0o, B, C, D, E, A, w9_t); + SHA1_STEP (SHA1_F0o, A, B, C, D, E, wa_t); + SHA1_STEP (SHA1_F0o, E, A, B, C, D, wb_t); + SHA1_STEP (SHA1_F0o, D, E, A, B, C, wc_t); + SHA1_STEP (SHA1_F0o, C, D, E, A, B, wd_t); + SHA1_STEP (SHA1_F0o, B, C, D, E, A, we_t); + SHA1_STEP (SHA1_F0o, A, B, C, D, E, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F0o, E, A, B, C, D, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F0o, D, E, A, B, C, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F0o, C, D, E, A, B, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F0o, B, C, D, E, A, w3_t); + + #undef K + #define K SHA1C01 + + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w7_t); + + #undef K + #define K SHA1C02 + + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, wb_t); + + #undef K + #define K SHA1C03 + + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, wf_t); + + digest[0] += A; + digest[1] += B; + digest[2] += C; + digest[3] += D; + digest[4] += E; +} + +static void m09810m (__local RC4_KEY rc4_keys[64], u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], const u32 pw_len, __global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global oldoffice34_t *oldoffice34_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset) +{ + /** + * modifier + */ + + const u32 gid = get_global_id (0); + const u32 lid = get_local_id (0); + + __local RC4_KEY *rc4_key = &rc4_keys[lid]; + + /** + * esalt + */ + + const u32 version = oldoffice34_bufs[salt_pos].version; + + u32 encryptedVerifier[4]; + + encryptedVerifier[0] = oldoffice34_bufs[salt_pos].encryptedVerifier[0]; + encryptedVerifier[1] = oldoffice34_bufs[salt_pos].encryptedVerifier[1]; + encryptedVerifier[2] = oldoffice34_bufs[salt_pos].encryptedVerifier[2]; + encryptedVerifier[3] = oldoffice34_bufs[salt_pos].encryptedVerifier[3]; + + /** + * loop + */ + + u32x w0l = w0[0]; + + for (u32 il_pos = 0; il_pos < bfs_cnt; il_pos++) + { + const u32 w0r = bfs_buf[il_pos].i; + + w0[0] = w0l | w0r; + + u32x key[4]; + + key[0] = w0[0]; + key[1] = w0[1] & 0xff; + key[2] = 0; + key[3] = 0; + + rc4_init_16 (rc4_key, key); + + u32x out[4]; + + u8 j = rc4_next_16 (rc4_key, 0, 0, encryptedVerifier, out); + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + w0_t[0] = swap_workaround (out[0]); + w0_t[1] = swap_workaround (out[1]); + w0_t[2] = swap_workaround (out[2]); + w0_t[3] = swap_workaround (out[3]); + w1_t[0] = 0x80000000; + w1_t[1] = 0; + w1_t[2] = 0; + w1_t[3] = 0; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = 16 * 8; + + u32x digest[5]; + + digest[0] = SHA1M_A; + digest[1] = SHA1M_B; + digest[2] = SHA1M_C; + digest[3] = SHA1M_D; + digest[4] = SHA1M_E; + + sha1_transform (w0_t, w1_t, w2_t, w3_t, digest); + + digest[0] = swap_workaround (digest[0]); + digest[1] = swap_workaround (digest[1]); + digest[2] = swap_workaround (digest[2]); + digest[3] = swap_workaround (digest[3]); + + rc4_next_16 (rc4_key, 16, j, digest, out); + + const u32x r0 = out[0]; + const u32x r1 = out[1]; + const u32x r2 = out[2]; + const u32x r3 = out[3]; + + #include VECT_COMPARE_M + } +} + +static void m09810s (__local RC4_KEY rc4_keys[64], u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], const u32 pw_len, __global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global oldoffice34_t *oldoffice34_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset) +{ + /** + * modifier + */ + + const u32 gid = get_global_id (0); + const u32 lid = get_local_id (0); + + __local RC4_KEY *rc4_key = &rc4_keys[lid]; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * esalt + */ + + const u32 version = oldoffice34_bufs[salt_pos].version; + + u32 encryptedVerifier[4]; + + encryptedVerifier[0] = oldoffice34_bufs[salt_pos].encryptedVerifier[0]; + encryptedVerifier[1] = oldoffice34_bufs[salt_pos].encryptedVerifier[1]; + encryptedVerifier[2] = oldoffice34_bufs[salt_pos].encryptedVerifier[2]; + encryptedVerifier[3] = oldoffice34_bufs[salt_pos].encryptedVerifier[3]; + + /** + * loop + */ + + u32x w0l = w0[0]; + + for (u32 il_pos = 0; il_pos < bfs_cnt; il_pos++) + { + const u32 w0r = bfs_buf[il_pos].i; + + w0[0] = w0l | w0r; + + u32x key[4]; + + key[0] = w0[0]; + key[1] = w0[1] & 0xff; + key[2] = 0; + key[3] = 0; + + rc4_init_16 (rc4_key, key); + + u32x out[4]; + + u8 j = rc4_next_16 (rc4_key, 0, 0, encryptedVerifier, out); + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + w0_t[0] = swap_workaround (out[0]); + w0_t[1] = swap_workaround (out[1]); + w0_t[2] = swap_workaround (out[2]); + w0_t[3] = swap_workaround (out[3]); + w1_t[0] = 0x80000000; + w1_t[1] = 0; + w1_t[2] = 0; + w1_t[3] = 0; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = 16 * 8; + + u32x digest[5]; + + digest[0] = SHA1M_A; + digest[1] = SHA1M_B; + digest[2] = SHA1M_C; + digest[3] = SHA1M_D; + digest[4] = SHA1M_E; + + sha1_transform (w0_t, w1_t, w2_t, w3_t, digest); + + digest[0] = swap_workaround (digest[0]); + digest[1] = swap_workaround (digest[1]); + digest[2] = swap_workaround (digest[2]); + digest[3] = swap_workaround (digest[3]); + + rc4_next_16 (rc4_key, 16, j, digest, out); + + const u32x r0 = out[0]; + const u32x r1 = out[1]; + const u32x r2 = out[2]; + const u32x r3 = out[3]; + + #include VECT_COMPARE_S + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m09810_m04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global oldoffice34_t *oldoffice34_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + __local RC4_KEY rc4_keys[64]; + + m09810m (rc4_keys, w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, oldoffice34_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m09810_m08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global oldoffice34_t *oldoffice34_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + __local RC4_KEY rc4_keys[64]; + + m09810m (rc4_keys, w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, oldoffice34_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m09810_m16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global oldoffice34_t *oldoffice34_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = pws[gid].i[ 8]; + w2[1] = pws[gid].i[ 9]; + w2[2] = pws[gid].i[10]; + w2[3] = pws[gid].i[11]; + + u32x w3[4]; + + w3[0] = pws[gid].i[12]; + w3[1] = pws[gid].i[13]; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + __local RC4_KEY rc4_keys[64]; + + m09810m (rc4_keys, w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, oldoffice34_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m09810_s04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global oldoffice34_t *oldoffice34_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + __local RC4_KEY rc4_keys[64]; + + m09810s (rc4_keys, w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, oldoffice34_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m09810_s08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global oldoffice34_t *oldoffice34_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + __local RC4_KEY rc4_keys[64]; + + m09810s (rc4_keys, w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, oldoffice34_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m09810_s16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global oldoffice34_t *oldoffice34_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = pws[gid].i[ 8]; + w2[1] = pws[gid].i[ 9]; + w2[2] = pws[gid].i[10]; + w2[3] = pws[gid].i[11]; + + u32x w3[4]; + + w3[0] = pws[gid].i[12]; + w3[1] = pws[gid].i[13]; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + __local RC4_KEY rc4_keys[64]; + + m09810s (rc4_keys, w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, oldoffice34_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} diff --git a/amd/m09820_a0.cl b/amd/m09820_a0.cl new file mode 100644 index 0000000000..122127965e --- /dev/null +++ b/amd/m09820_a0.cl @@ -0,0 +1,525 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _OLDOFFICE34_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW4 +#define VECT_SIZE2 +#endif + +#ifdef VLIW5 +#define VECT_SIZE2 +#endif + +#define DGST_R0 0 +#define DGST_R1 1 +#define DGST_R2 2 +#define DGST_R3 3 + +#include "include/kernel_functions.c" +#include "types_amd.c" +#include "common_amd.c" +#include "include/rp_gpu.h" +#include "rp_amd.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +static void sha1_transform (const u32x w0[4], const u32x w1[4], const u32x w2[4], const u32x w3[4], u32x digest[5]) +{ + u32x A = digest[0]; + u32x B = digest[1]; + u32x C = digest[2]; + u32x D = digest[3]; + u32x E = digest[4]; + + u32x w0_t = w0[0]; + u32x w1_t = w0[1]; + u32x w2_t = w0[2]; + u32x w3_t = w0[3]; + u32x w4_t = w1[0]; + u32x w5_t = w1[1]; + u32x w6_t = w1[2]; + u32x w7_t = w1[3]; + u32x w8_t = w2[0]; + u32x w9_t = w2[1]; + u32x wa_t = w2[2]; + u32x wb_t = w2[3]; + u32x wc_t = w3[0]; + u32x wd_t = w3[1]; + u32x we_t = w3[2]; + u32x wf_t = w3[3]; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, A, B, C, D, E, w0_t); + SHA1_STEP (SHA1_F0o, E, A, B, C, D, w1_t); + SHA1_STEP (SHA1_F0o, D, E, A, B, C, w2_t); + SHA1_STEP (SHA1_F0o, C, D, E, A, B, w3_t); + SHA1_STEP (SHA1_F0o, B, C, D, E, A, w4_t); + SHA1_STEP (SHA1_F0o, A, B, C, D, E, w5_t); + SHA1_STEP (SHA1_F0o, E, A, B, C, D, w6_t); + SHA1_STEP (SHA1_F0o, D, E, A, B, C, w7_t); + SHA1_STEP (SHA1_F0o, C, D, E, A, B, w8_t); + SHA1_STEP (SHA1_F0o, B, C, D, E, A, w9_t); + SHA1_STEP (SHA1_F0o, A, B, C, D, E, wa_t); + SHA1_STEP (SHA1_F0o, E, A, B, C, D, wb_t); + SHA1_STEP (SHA1_F0o, D, E, A, B, C, wc_t); + SHA1_STEP (SHA1_F0o, C, D, E, A, B, wd_t); + SHA1_STEP (SHA1_F0o, B, C, D, E, A, we_t); + SHA1_STEP (SHA1_F0o, A, B, C, D, E, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F0o, E, A, B, C, D, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F0o, D, E, A, B, C, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F0o, C, D, E, A, B, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F0o, B, C, D, E, A, w3_t); + + #undef K + #define K SHA1C01 + + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w7_t); + + #undef K + #define K SHA1C02 + + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, wb_t); + + #undef K + #define K SHA1C03 + + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, wf_t); + + digest[0] += A; + digest[1] += B; + digest[2] += C; + digest[3] += D; + digest[4] += E; +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m09820_m04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global oldoffice34_t *oldoffice34_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + u32x pw_buf1[4]; + + pw_buf1[0] = pws[gid].i[ 4]; + pw_buf1[1] = pws[gid].i[ 5]; + pw_buf1[2] = pws[gid].i[ 6]; + pw_buf1[3] = pws[gid].i[ 7]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * salt + */ + + u32 salt_buf[4]; + + salt_buf[0] = salt_bufs[salt_pos].salt_buf[0]; + salt_buf[1] = salt_bufs[salt_pos].salt_buf[1]; + salt_buf[2] = salt_bufs[salt_pos].salt_buf[2]; + salt_buf[3] = salt_bufs[salt_pos].salt_buf[3]; + + const u32 salt_len = 16; + + const u32 pw_salt_len = pw_len + salt_len; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + + w0[0] = pw_buf0[0]; + w0[1] = pw_buf0[1]; + w0[2] = pw_buf0[2]; + w0[3] = pw_buf0[3]; + + u32x w1[4]; + + w1[0] = pw_buf1[0]; + w1[1] = pw_buf1[1]; + w1[2] = pw_buf1[2]; + w1[3] = pw_buf1[3]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 out_len = apply_rules (rules_buf[il_pos].cmds, w0, w1, pw_len); + + const u32 pw_salt_len = (out_len * 2) + salt_len; + + append_0x80_2 (w0, w1, out_len); + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + make_unicode (w0, w0_t, w1_t); + make_unicode (w1, w2_t, w3_t); + + switch_buffer_by_offset (w0_t, w1_t, w2_t, w3_t, salt_len); + + w0_t[0] = salt_buf[0]; + w0_t[1] = salt_buf[1]; + w0_t[2] = salt_buf[2]; + w0_t[3] = salt_buf[3]; + w1_t[0] = swap_workaround (w1_t[0]); + w1_t[1] = swap_workaround (w1_t[1]); + w1_t[2] = swap_workaround (w1_t[2]); + w1_t[3] = swap_workaround (w1_t[3]); + w2_t[0] = swap_workaround (w2_t[0]); + w2_t[1] = swap_workaround (w2_t[1]); + w2_t[2] = swap_workaround (w2_t[2]); + w2_t[3] = swap_workaround (w2_t[3]); + w3_t[0] = swap_workaround (w3_t[0]); + w3_t[1] = swap_workaround (w3_t[1]); + w3_t[2] = 0; + w3_t[3] = pw_salt_len * 8; + + u32x digest[5]; + + digest[0] = SHA1M_A; + digest[1] = SHA1M_B; + digest[2] = SHA1M_C; + digest[3] = SHA1M_D; + digest[4] = SHA1M_E; + + sha1_transform (w0_t, w1_t, w2_t, w3_t, digest); + + w0_t[0] = digest[0]; + w0_t[1] = digest[1]; + w0_t[2] = digest[2]; + w0_t[3] = digest[3]; + w1_t[0] = digest[4]; + w1_t[1] = 0; + w1_t[2] = 0x80000000; + w1_t[3] = 0; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = (20 + 4) * 8; + + digest[0] = SHA1M_A; + digest[1] = SHA1M_B; + digest[2] = SHA1M_C; + digest[3] = SHA1M_D; + digest[4] = SHA1M_E; + + sha1_transform (w0_t, w1_t, w2_t, w3_t, digest); + + u32x a = swap_workaround (digest[0]); + u32x b = swap_workaround (digest[1]) & 0xff; + + const u32x r0 = a; + const u32x r1 = b; + const u32x r2 = 0; + const u32x r3 = 0; + + #include VECT_COMPARE_M + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m09820_m08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global oldoffice34_t *oldoffice34_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m09820_m16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global oldoffice34_t *oldoffice34_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m09820_s04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global oldoffice34_t *oldoffice34_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + u32x pw_buf1[4]; + + pw_buf1[0] = pws[gid].i[ 4]; + pw_buf1[1] = pws[gid].i[ 5]; + pw_buf1[2] = pws[gid].i[ 6]; + pw_buf1[3] = pws[gid].i[ 7]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * salt + */ + + u32 salt_buf[4]; + + salt_buf[0] = salt_bufs[salt_pos].salt_buf[0]; + salt_buf[1] = salt_bufs[salt_pos].salt_buf[1]; + salt_buf[2] = salt_bufs[salt_pos].salt_buf[2]; + salt_buf[3] = salt_bufs[salt_pos].salt_buf[3]; + + const u32 salt_len = 16; + + const u32 pw_salt_len = pw_len + salt_len; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + + w0[0] = pw_buf0[0]; + w0[1] = pw_buf0[1]; + w0[2] = pw_buf0[2]; + w0[3] = pw_buf0[3]; + + u32x w1[4]; + + w1[0] = pw_buf1[0]; + w1[1] = pw_buf1[1]; + w1[2] = pw_buf1[2]; + w1[3] = pw_buf1[3]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 out_len = apply_rules (rules_buf[il_pos].cmds, w0, w1, pw_len); + + const u32 pw_salt_len = (out_len * 2) + salt_len; + + append_0x80_2 (w0, w1, out_len); + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + make_unicode (w0, w0_t, w1_t); + make_unicode (w1, w2_t, w3_t); + + switch_buffer_by_offset (w0_t, w1_t, w2_t, w3_t, salt_len); + + w0_t[0] = salt_buf[0]; + w0_t[1] = salt_buf[1]; + w0_t[2] = salt_buf[2]; + w0_t[3] = salt_buf[3]; + w1_t[0] = swap_workaround (w1_t[0]); + w1_t[1] = swap_workaround (w1_t[1]); + w1_t[2] = swap_workaround (w1_t[2]); + w1_t[3] = swap_workaround (w1_t[3]); + w2_t[0] = swap_workaround (w2_t[0]); + w2_t[1] = swap_workaround (w2_t[1]); + w2_t[2] = swap_workaround (w2_t[2]); + w2_t[3] = swap_workaround (w2_t[3]); + w3_t[0] = swap_workaround (w3_t[0]); + w3_t[1] = swap_workaround (w3_t[1]); + w3_t[2] = 0; + w3_t[3] = pw_salt_len * 8; + + u32x digest[5]; + + digest[0] = SHA1M_A; + digest[1] = SHA1M_B; + digest[2] = SHA1M_C; + digest[3] = SHA1M_D; + digest[4] = SHA1M_E; + + sha1_transform (w0_t, w1_t, w2_t, w3_t, digest); + + w0_t[0] = digest[0]; + w0_t[1] = digest[1]; + w0_t[2] = digest[2]; + w0_t[3] = digest[3]; + w1_t[0] = digest[4]; + w1_t[1] = 0; + w1_t[2] = 0x80000000; + w1_t[3] = 0; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = (20 + 4) * 8; + + digest[0] = SHA1M_A; + digest[1] = SHA1M_B; + digest[2] = SHA1M_C; + digest[3] = SHA1M_D; + digest[4] = SHA1M_E; + + sha1_transform (w0_t, w1_t, w2_t, w3_t, digest); + + u32x a = swap_workaround (digest[0]); + u32x b = swap_workaround (digest[1]) & 0xff; + + const u32x r0 = a; + const u32x r1 = b; + const u32x r2 = 0; + const u32x r3 = 0; + + #include VECT_COMPARE_S + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m09820_s08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global oldoffice34_t *oldoffice34_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m09820_s16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global oldoffice34_t *oldoffice34_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/amd/m09820_a1.cl b/amd/m09820_a1.cl new file mode 100644 index 0000000000..f5c582696d --- /dev/null +++ b/amd/m09820_a1.cl @@ -0,0 +1,627 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _OLDOFFICE34_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW4 +#define VECT_SIZE2 +#endif + +#ifdef VLIW5 +#define VECT_SIZE2 +#endif + +#define DGST_R0 0 +#define DGST_R1 1 +#define DGST_R2 2 +#define DGST_R3 3 + +#include "include/kernel_functions.c" +#include "types_amd.c" +#include "common_amd.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +static void sha1_transform (const u32x w0[4], const u32x w1[4], const u32x w2[4], const u32x w3[4], u32x digest[5]) +{ + u32x A = digest[0]; + u32x B = digest[1]; + u32x C = digest[2]; + u32x D = digest[3]; + u32x E = digest[4]; + + u32x w0_t = w0[0]; + u32x w1_t = w0[1]; + u32x w2_t = w0[2]; + u32x w3_t = w0[3]; + u32x w4_t = w1[0]; + u32x w5_t = w1[1]; + u32x w6_t = w1[2]; + u32x w7_t = w1[3]; + u32x w8_t = w2[0]; + u32x w9_t = w2[1]; + u32x wa_t = w2[2]; + u32x wb_t = w2[3]; + u32x wc_t = w3[0]; + u32x wd_t = w3[1]; + u32x we_t = w3[2]; + u32x wf_t = w3[3]; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, A, B, C, D, E, w0_t); + SHA1_STEP (SHA1_F0o, E, A, B, C, D, w1_t); + SHA1_STEP (SHA1_F0o, D, E, A, B, C, w2_t); + SHA1_STEP (SHA1_F0o, C, D, E, A, B, w3_t); + SHA1_STEP (SHA1_F0o, B, C, D, E, A, w4_t); + SHA1_STEP (SHA1_F0o, A, B, C, D, E, w5_t); + SHA1_STEP (SHA1_F0o, E, A, B, C, D, w6_t); + SHA1_STEP (SHA1_F0o, D, E, A, B, C, w7_t); + SHA1_STEP (SHA1_F0o, C, D, E, A, B, w8_t); + SHA1_STEP (SHA1_F0o, B, C, D, E, A, w9_t); + SHA1_STEP (SHA1_F0o, A, B, C, D, E, wa_t); + SHA1_STEP (SHA1_F0o, E, A, B, C, D, wb_t); + SHA1_STEP (SHA1_F0o, D, E, A, B, C, wc_t); + SHA1_STEP (SHA1_F0o, C, D, E, A, B, wd_t); + SHA1_STEP (SHA1_F0o, B, C, D, E, A, we_t); + SHA1_STEP (SHA1_F0o, A, B, C, D, E, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F0o, E, A, B, C, D, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F0o, D, E, A, B, C, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F0o, C, D, E, A, B, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F0o, B, C, D, E, A, w3_t); + + #undef K + #define K SHA1C01 + + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w7_t); + + #undef K + #define K SHA1C02 + + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, wb_t); + + #undef K + #define K SHA1C03 + + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, wf_t); + + digest[0] += A; + digest[1] += B; + digest[2] += C; + digest[3] += D; + digest[4] += E; +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m09820_m04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global oldoffice34_t *oldoffice34_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, combs_buf[0].pw_len); + } + + /** + * salt + */ + + u32 salt_buf[4]; + + salt_buf[0] = salt_bufs[salt_pos].salt_buf[0]; + salt_buf[1] = salt_bufs[salt_pos].salt_buf[1]; + salt_buf[2] = salt_bufs[salt_pos].salt_buf[2]; + salt_buf[3] = salt_bufs[salt_pos].salt_buf[3]; + + const u32 salt_len = 16; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = combs_buf[il_pos].pw_len; + + const u32 pw_len = pw_l_len + pw_r_len; + + const u32 pw_salt_len = (pw_len * 2) + salt_len; + + u32 wordr0[4]; + + wordr0[0] = combs_buf[il_pos].i[0]; + wordr0[1] = combs_buf[il_pos].i[1]; + wordr0[2] = combs_buf[il_pos].i[2]; + wordr0[3] = combs_buf[il_pos].i[3]; + + u32 wordr1[4]; + + wordr1[0] = combs_buf[il_pos].i[4]; + wordr1[1] = combs_buf[il_pos].i[5]; + wordr1[2] = combs_buf[il_pos].i[6]; + wordr1[3] = combs_buf[il_pos].i[7]; + + u32 wordr2[4]; + + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + + u32 wordr3[4]; + + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + u32x w0[4]; + + w0[0] = wordl0[0] | wordr0[0]; + w0[1] = wordl0[1] | wordr0[1]; + w0[2] = wordl0[2] | wordr0[2]; + w0[3] = wordl0[3] | wordr0[3]; + + u32x w1[4]; + + w1[0] = wordl1[0] | wordr1[0]; + w1[1] = wordl1[1] | wordr1[1]; + w1[2] = wordl1[2] | wordr1[2]; + w1[3] = wordl1[3] | wordr1[3]; + + u32x w2[4]; + + w2[0] = wordl2[0] | wordr2[0]; + w2[1] = wordl2[1] | wordr2[1]; + w2[2] = wordl2[2] | wordr2[2]; + w2[3] = wordl2[3] | wordr2[3]; + + u32x w3[4]; + + w3[0] = wordl3[0] | wordr3[0]; + w3[1] = wordl3[1] | wordr3[1]; + w3[2] = 0; + w3[3] = 0; + + append_0x80_2 (w0, w1, pw_len); + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + make_unicode (w0, w0_t, w1_t); + make_unicode (w1, w2_t, w3_t); + + switch_buffer_by_offset (w0_t, w1_t, w2_t, w3_t, salt_len); + + w0_t[0] = salt_buf[0]; + w0_t[1] = salt_buf[1]; + w0_t[2] = salt_buf[2]; + w0_t[3] = salt_buf[3]; + w1_t[0] = swap_workaround (w1_t[0]); + w1_t[1] = swap_workaround (w1_t[1]); + w1_t[2] = swap_workaround (w1_t[2]); + w1_t[3] = swap_workaround (w1_t[3]); + w2_t[0] = swap_workaround (w2_t[0]); + w2_t[1] = swap_workaround (w2_t[1]); + w2_t[2] = swap_workaround (w2_t[2]); + w2_t[3] = swap_workaround (w2_t[3]); + w3_t[0] = swap_workaround (w3_t[0]); + w3_t[1] = swap_workaround (w3_t[1]); + w3_t[2] = 0; + w3_t[3] = pw_salt_len * 8; + + u32x digest[5]; + + digest[0] = SHA1M_A; + digest[1] = SHA1M_B; + digest[2] = SHA1M_C; + digest[3] = SHA1M_D; + digest[4] = SHA1M_E; + + sha1_transform (w0_t, w1_t, w2_t, w3_t, digest); + + w0_t[0] = digest[0]; + w0_t[1] = digest[1]; + w0_t[2] = digest[2]; + w0_t[3] = digest[3]; + w1_t[0] = digest[4]; + w1_t[1] = 0; + w1_t[2] = 0x80000000; + w1_t[3] = 0; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = (20 + 4) * 8; + + digest[0] = SHA1M_A; + digest[1] = SHA1M_B; + digest[2] = SHA1M_C; + digest[3] = SHA1M_D; + digest[4] = SHA1M_E; + + sha1_transform (w0_t, w1_t, w2_t, w3_t, digest); + + u32x a = swap_workaround (digest[0]); + u32x b = swap_workaround (digest[1]) & 0xff; + + const u32x r0 = a; + const u32x r1 = b; + const u32x r2 = 0; + const u32x r3 = 0; + + #include VECT_COMPARE_M + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m09820_m08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global oldoffice34_t *oldoffice34_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m09820_m16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global oldoffice34_t *oldoffice34_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m09820_s04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global oldoffice34_t *oldoffice34_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, combs_buf[0].pw_len); + } + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * salt + */ + + u32 salt_buf[4]; + + salt_buf[0] = salt_bufs[salt_pos].salt_buf[0]; + salt_buf[1] = salt_bufs[salt_pos].salt_buf[1]; + salt_buf[2] = salt_bufs[salt_pos].salt_buf[2]; + salt_buf[3] = salt_bufs[salt_pos].salt_buf[3]; + + const u32 salt_len = 16; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = combs_buf[il_pos].pw_len; + + const u32 pw_len = pw_l_len + pw_r_len; + + const u32 pw_salt_len = (pw_len * 2) + salt_len; + + u32 wordr0[4]; + + wordr0[0] = combs_buf[il_pos].i[0]; + wordr0[1] = combs_buf[il_pos].i[1]; + wordr0[2] = combs_buf[il_pos].i[2]; + wordr0[3] = combs_buf[il_pos].i[3]; + + u32 wordr1[4]; + + wordr1[0] = combs_buf[il_pos].i[4]; + wordr1[1] = combs_buf[il_pos].i[5]; + wordr1[2] = combs_buf[il_pos].i[6]; + wordr1[3] = combs_buf[il_pos].i[7]; + + u32 wordr2[4]; + + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + + u32 wordr3[4]; + + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + u32x w0[4]; + + w0[0] = wordl0[0] | wordr0[0]; + w0[1] = wordl0[1] | wordr0[1]; + w0[2] = wordl0[2] | wordr0[2]; + w0[3] = wordl0[3] | wordr0[3]; + + u32x w1[4]; + + w1[0] = wordl1[0] | wordr1[0]; + w1[1] = wordl1[1] | wordr1[1]; + w1[2] = wordl1[2] | wordr1[2]; + w1[3] = wordl1[3] | wordr1[3]; + + u32x w2[4]; + + w2[0] = wordl2[0] | wordr2[0]; + w2[1] = wordl2[1] | wordr2[1]; + w2[2] = wordl2[2] | wordr2[2]; + w2[3] = wordl2[3] | wordr2[3]; + + u32x w3[4]; + + w3[0] = wordl3[0] | wordr3[0]; + w3[1] = wordl3[1] | wordr3[1]; + w3[2] = 0; + w3[3] = 0; + + append_0x80_2 (w0, w1, pw_len); + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + make_unicode (w0, w0_t, w1_t); + make_unicode (w1, w2_t, w3_t); + + switch_buffer_by_offset (w0_t, w1_t, w2_t, w3_t, salt_len); + + w0_t[0] = salt_buf[0]; + w0_t[1] = salt_buf[1]; + w0_t[2] = salt_buf[2]; + w0_t[3] = salt_buf[3]; + w1_t[0] = swap_workaround (w1_t[0]); + w1_t[1] = swap_workaround (w1_t[1]); + w1_t[2] = swap_workaround (w1_t[2]); + w1_t[3] = swap_workaround (w1_t[3]); + w2_t[0] = swap_workaround (w2_t[0]); + w2_t[1] = swap_workaround (w2_t[1]); + w2_t[2] = swap_workaround (w2_t[2]); + w2_t[3] = swap_workaround (w2_t[3]); + w3_t[0] = swap_workaround (w3_t[0]); + w3_t[1] = swap_workaround (w3_t[1]); + w3_t[2] = 0; + w3_t[3] = pw_salt_len * 8; + + u32x digest[5]; + + digest[0] = SHA1M_A; + digest[1] = SHA1M_B; + digest[2] = SHA1M_C; + digest[3] = SHA1M_D; + digest[4] = SHA1M_E; + + sha1_transform (w0_t, w1_t, w2_t, w3_t, digest); + + w0_t[0] = digest[0]; + w0_t[1] = digest[1]; + w0_t[2] = digest[2]; + w0_t[3] = digest[3]; + w1_t[0] = digest[4]; + w1_t[1] = 0; + w1_t[2] = 0x80000000; + w1_t[3] = 0; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = (20 + 4) * 8; + + digest[0] = SHA1M_A; + digest[1] = SHA1M_B; + digest[2] = SHA1M_C; + digest[3] = SHA1M_D; + digest[4] = SHA1M_E; + + sha1_transform (w0_t, w1_t, w2_t, w3_t, digest); + + u32x a = swap_workaround (digest[0]); + u32x b = swap_workaround (digest[1]) & 0xff; + + const u32x r0 = a; + const u32x r1 = b; + const u32x r2 = 0; + const u32x r3 = 0; + + #include VECT_COMPARE_S + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m09820_s08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global oldoffice34_t *oldoffice34_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m09820_s16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global oldoffice34_t *oldoffice34_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/amd/m09820_a3.cl b/amd/m09820_a3.cl new file mode 100644 index 0000000000..0bddfcef5f --- /dev/null +++ b/amd/m09820_a3.cl @@ -0,0 +1,653 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _OLDOFFICE34_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW4 +#define VECT_SIZE2 +#endif + +#ifdef VLIW5 +#define VECT_SIZE2 +#endif + +#define DGST_R0 0 +#define DGST_R1 1 +#define DGST_R2 2 +#define DGST_R3 3 + +#include "include/kernel_functions.c" +#include "types_amd.c" +#include "common_amd.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +static void sha1_transform (const u32x w0[4], const u32x w1[4], const u32x w2[4], const u32x w3[4], u32x digest[5]) +{ + u32x A = digest[0]; + u32x B = digest[1]; + u32x C = digest[2]; + u32x D = digest[3]; + u32x E = digest[4]; + + u32x w0_t = w0[0]; + u32x w1_t = w0[1]; + u32x w2_t = w0[2]; + u32x w3_t = w0[3]; + u32x w4_t = w1[0]; + u32x w5_t = w1[1]; + u32x w6_t = w1[2]; + u32x w7_t = w1[3]; + u32x w8_t = w2[0]; + u32x w9_t = w2[1]; + u32x wa_t = w2[2]; + u32x wb_t = w2[3]; + u32x wc_t = w3[0]; + u32x wd_t = w3[1]; + u32x we_t = w3[2]; + u32x wf_t = w3[3]; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, A, B, C, D, E, w0_t); + SHA1_STEP (SHA1_F0o, E, A, B, C, D, w1_t); + SHA1_STEP (SHA1_F0o, D, E, A, B, C, w2_t); + SHA1_STEP (SHA1_F0o, C, D, E, A, B, w3_t); + SHA1_STEP (SHA1_F0o, B, C, D, E, A, w4_t); + SHA1_STEP (SHA1_F0o, A, B, C, D, E, w5_t); + SHA1_STEP (SHA1_F0o, E, A, B, C, D, w6_t); + SHA1_STEP (SHA1_F0o, D, E, A, B, C, w7_t); + SHA1_STEP (SHA1_F0o, C, D, E, A, B, w8_t); + SHA1_STEP (SHA1_F0o, B, C, D, E, A, w9_t); + SHA1_STEP (SHA1_F0o, A, B, C, D, E, wa_t); + SHA1_STEP (SHA1_F0o, E, A, B, C, D, wb_t); + SHA1_STEP (SHA1_F0o, D, E, A, B, C, wc_t); + SHA1_STEP (SHA1_F0o, C, D, E, A, B, wd_t); + SHA1_STEP (SHA1_F0o, B, C, D, E, A, we_t); + SHA1_STEP (SHA1_F0o, A, B, C, D, E, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F0o, E, A, B, C, D, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F0o, D, E, A, B, C, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F0o, C, D, E, A, B, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F0o, B, C, D, E, A, w3_t); + + #undef K + #define K SHA1C01 + + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w7_t); + + #undef K + #define K SHA1C02 + + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, wb_t); + + #undef K + #define K SHA1C03 + + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, wf_t); + + digest[0] += A; + digest[1] += B; + digest[2] += C; + digest[3] += D; + digest[4] += E; +} + +static void m09820m (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], const u32 pw_len, __global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global oldoffice34_t *oldoffice34_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset) +{ + /** + * modifier + */ + + const u32 gid = get_global_id (0); + const u32 lid = get_local_id (0); + + /** + * salt + */ + + u32 salt_buf[4]; + + salt_buf[0] = salt_bufs[salt_pos].salt_buf[0]; + salt_buf[1] = salt_bufs[salt_pos].salt_buf[1]; + salt_buf[2] = salt_bufs[salt_pos].salt_buf[2]; + salt_buf[3] = salt_bufs[salt_pos].salt_buf[3]; + + const u32 salt_len = 16; + + const u32 pw_salt_len = pw_len + salt_len; + + /** + * loop + */ + + u32x w0l = w0[0]; + + for (u32 il_pos = 0; il_pos < bfs_cnt; il_pos++) + { + const u32 w0r = bfs_buf[il_pos].i; + + w0[0] = w0l | w0r; + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + w0_t[0] = salt_buf[0]; + w0_t[1] = salt_buf[1]; + w0_t[2] = salt_buf[2]; + w0_t[3] = salt_buf[3]; + w1_t[0] = w0[0]; + w1_t[1] = w0[1]; + w1_t[2] = w0[2]; + w1_t[3] = w0[3]; + w2_t[0] = w1[0]; + w2_t[1] = w1[1]; + w2_t[2] = w1[2]; + w2_t[3] = w1[3]; + w3_t[0] = w2[0]; + w3_t[1] = w2[1]; + w3_t[2] = 0; + w3_t[3] = pw_salt_len * 8; + + u32x digest[5]; + + digest[0] = SHA1M_A; + digest[1] = SHA1M_B; + digest[2] = SHA1M_C; + digest[3] = SHA1M_D; + digest[4] = SHA1M_E; + + sha1_transform (w0_t, w1_t, w2_t, w3_t, digest); + + w0_t[0] = digest[0]; + w0_t[1] = digest[1]; + w0_t[2] = digest[2]; + w0_t[3] = digest[3]; + w1_t[0] = digest[4]; + w1_t[1] = 0; + w1_t[2] = 0x80000000; + w1_t[3] = 0; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = (20 + 4) * 8; + + digest[0] = SHA1M_A; + digest[1] = SHA1M_B; + digest[2] = SHA1M_C; + digest[3] = SHA1M_D; + digest[4] = SHA1M_E; + + sha1_transform (w0_t, w1_t, w2_t, w3_t, digest); + + u32x a = swap_workaround (digest[0]); + u32x b = swap_workaround (digest[1]) & 0xff; + + const u32x r0 = a; + const u32x r1 = b; + const u32x r2 = 0; + const u32x r3 = 0; + + #include VECT_COMPARE_M + } +} + +static void m09820s (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], const u32 pw_len, __global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global oldoffice34_t *oldoffice34_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset) +{ + /** + * modifier + */ + + const u32 gid = get_global_id (0); + const u32 lid = get_local_id (0); + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * salt + */ + + u32 salt_buf[4]; + + salt_buf[0] = salt_bufs[salt_pos].salt_buf[0]; + salt_buf[1] = salt_bufs[salt_pos].salt_buf[1]; + salt_buf[2] = salt_bufs[salt_pos].salt_buf[2]; + salt_buf[3] = salt_bufs[salt_pos].salt_buf[3]; + + const u32 salt_len = 16; + + const u32 pw_salt_len = pw_len + salt_len; + + /** + * loop + */ + + u32x w0l = w0[0]; + + for (u32 il_pos = 0; il_pos < bfs_cnt; il_pos++) + { + const u32 w0r = bfs_buf[il_pos].i; + + w0[0] = w0l | w0r; + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + w0_t[0] = salt_buf[0]; + w0_t[1] = salt_buf[1]; + w0_t[2] = salt_buf[2]; + w0_t[3] = salt_buf[3]; + w1_t[0] = w0[0]; + w1_t[1] = w0[1]; + w1_t[2] = w0[2]; + w1_t[3] = w0[3]; + w2_t[0] = w1[0]; + w2_t[1] = w1[1]; + w2_t[2] = w1[2]; + w2_t[3] = w1[3]; + w3_t[0] = w2[0]; + w3_t[1] = w2[1]; + w3_t[2] = 0; + w3_t[3] = pw_salt_len * 8; + + u32x digest[5]; + + digest[0] = SHA1M_A; + digest[1] = SHA1M_B; + digest[2] = SHA1M_C; + digest[3] = SHA1M_D; + digest[4] = SHA1M_E; + + sha1_transform (w0_t, w1_t, w2_t, w3_t, digest); + + w0_t[0] = digest[0]; + w0_t[1] = digest[1]; + w0_t[2] = digest[2]; + w0_t[3] = digest[3]; + w1_t[0] = digest[4]; + w1_t[1] = 0; + w1_t[2] = 0x80000000; + w1_t[3] = 0; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = (20 + 4) * 8; + + digest[0] = SHA1M_A; + digest[1] = SHA1M_B; + digest[2] = SHA1M_C; + digest[3] = SHA1M_D; + digest[4] = SHA1M_E; + + sha1_transform (w0_t, w1_t, w2_t, w3_t, digest); + + u32x a = swap_workaround (digest[0]); + u32x b = swap_workaround (digest[1]) & 0xff; + + const u32x r0 = a; + const u32x r1 = b; + const u32x r2 = 0; + const u32x r3 = 0; + + #include VECT_COMPARE_S + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m09820_m04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global oldoffice34_t *oldoffice34_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + m09820m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, oldoffice34_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m09820_m08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global oldoffice34_t *oldoffice34_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + m09820m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, oldoffice34_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m09820_m16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global oldoffice34_t *oldoffice34_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = pws[gid].i[ 8]; + w2[1] = pws[gid].i[ 9]; + w2[2] = pws[gid].i[10]; + w2[3] = pws[gid].i[11]; + + u32x w3[4]; + + w3[0] = pws[gid].i[12]; + w3[1] = pws[gid].i[13]; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + m09820m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, oldoffice34_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m09820_s04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global oldoffice34_t *oldoffice34_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + m09820s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, oldoffice34_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m09820_s08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global oldoffice34_t *oldoffice34_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + m09820s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, oldoffice34_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m09820_s16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global oldoffice34_t *oldoffice34_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = pws[gid].i[ 8]; + w2[1] = pws[gid].i[ 9]; + w2[2] = pws[gid].i[10]; + w2[3] = pws[gid].i[11]; + + u32x w3[4]; + + w3[0] = pws[gid].i[12]; + w3[1] = pws[gid].i[13]; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + m09820s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, oldoffice34_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} diff --git a/amd/m09900_a0.cl b/amd/m09900_a0.cl new file mode 100644 index 0000000000..8f3c7b1d40 --- /dev/null +++ b/amd/m09900_a0.cl @@ -0,0 +1,588 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _MD5_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW4 +#define VECT_SIZE4 +#endif + +#ifdef VLIW5 +#define VECT_SIZE4 +#endif + +#define DGST_R0 0 +#define DGST_R1 3 +#define DGST_R2 2 +#define DGST_R3 1 + +#include "include/kernel_functions.c" +#include "types_amd.c" +#include "common_amd.c" +#include "include/rp_gpu.h" +#include "rp_amd.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m09900_m04 (__global pw_t *pws, __global gpu_rule_t * rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + u32x pw_buf1[4]; + + pw_buf1[0] = pws[gid].i[ 4]; + pw_buf1[1] = pws[gid].i[ 5]; + pw_buf1[2] = pws[gid].i[ 6]; + pw_buf1[3] = pws[gid].i[ 7]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + + w0[0] = pw_buf0[0]; + w0[1] = pw_buf0[1]; + w0[2] = pw_buf0[2]; + w0[3] = pw_buf0[3]; + + u32x w1[4]; + + w1[0] = pw_buf1[0]; + w1[1] = pw_buf1[1]; + w1[2] = pw_buf1[2]; + w1[3] = pw_buf1[3]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + apply_rules (rules_buf[il_pos].cmds, w0, w1, pw_len); + + u32x a = MD5M_A; + u32x b = MD5M_B; + u32x c = MD5M_C; + u32x d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H , a, b, c, d, w1[1], MD5C20, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w2[0], MD5C21, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w2[3], MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w3[2], MD5C23, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w0[1], MD5C24, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w1[0], MD5C25, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w1[3], MD5C26, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w2[2], MD5C27, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w3[1], MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w0[0], MD5C29, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w0[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w1[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w2[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w3[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w3[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w0[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1[0], MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w2[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2[1], MD5C3f, MD5S33); + + a += MD5M_A; + b += MD5M_B; + c += MD5M_C; + d += MD5M_D; + + u32x r_a = a; + u32x r_b = b; + u32x r_c = c; + u32x r_d = d; + + u32x t0[4]; + u32x t1[4]; + u32x t2[4]; + u32x t3[4]; + + t0[0] = 0; + t0[1] = 0; + t0[2] = 0; + t0[3] = 0; + t1[0] = 0; + t1[1] = 0; + t1[2] = 0; + t1[3] = 0; + t2[0] = 0; + t2[1] = 0x80; + t2[2] = 0; + t2[3] = 0; + t3[0] = 0; + t3[1] = 0; + t3[2] = 100 * 8; + t3[3] = 0; + + MD5_STEP (MD5_Fo, a, b, c, d, t0[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, t0[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, t0[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, t0[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, t1[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, t1[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, t1[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, t1[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, t2[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, t2[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, t2[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, t2[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, t3[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, t3[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, t3[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, t3[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, t0[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, t1[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, t2[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, t0[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, t1[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, t2[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, t3[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, t1[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, t2[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, t3[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, t0[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, t2[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, t3[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, t0[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, t1[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, t3[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H , a, b, c, d, t1[1], MD5C20, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, t2[0], MD5C21, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, t2[3], MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, t3[2], MD5C23, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, t0[1], MD5C24, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, t1[0], MD5C25, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, t1[3], MD5C26, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, t2[2], MD5C27, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, t3[1], MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, t0[0], MD5C29, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, t0[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, t1[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, t2[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, t3[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, t3[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, t0[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, t0[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, t1[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, t3[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, t1[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, t3[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, t0[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, t2[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, t0[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, t2[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, t3[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, t1[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, t3[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, t1[0], MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, t2[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, t0[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, t2[1], MD5C3f, MD5S33); + + a += r_a; + b += r_b; + c += r_c; + d += r_d; + + const u32x r0 = a; + const u32x r1 = d; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_M + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m09900_m08 (__global pw_t *pws, __global gpu_rule_t * rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m09900_m16 (__global pw_t *pws, __global gpu_rule_t * rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m09900_s04 (__global pw_t *pws, __global gpu_rule_t * rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + u32x pw_buf1[4]; + + pw_buf1[0] = pws[gid].i[ 4]; + pw_buf1[1] = pws[gid].i[ 5]; + pw_buf1[2] = pws[gid].i[ 6]; + pw_buf1[3] = pws[gid].i[ 7]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + + w0[0] = pw_buf0[0]; + w0[1] = pw_buf0[1]; + w0[2] = pw_buf0[2]; + w0[3] = pw_buf0[3]; + + u32x w1[4]; + + w1[0] = pw_buf1[0]; + w1[1] = pw_buf1[1]; + w1[2] = pw_buf1[2]; + w1[3] = pw_buf1[3]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + apply_rules (rules_buf[il_pos].cmds, w0, w1, pw_len); + + u32x a = MD5M_A; + u32x b = MD5M_B; + u32x c = MD5M_C; + u32x d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H , a, b, c, d, w1[1], MD5C20, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w2[0], MD5C21, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w2[3], MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w3[2], MD5C23, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w0[1], MD5C24, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w1[0], MD5C25, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w1[3], MD5C26, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w2[2], MD5C27, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w3[1], MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w0[0], MD5C29, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w0[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w1[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w2[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w3[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w3[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w0[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1[0], MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w2[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2[1], MD5C3f, MD5S33); + + a += MD5M_A; + b += MD5M_B; + c += MD5M_C; + d += MD5M_D; + + u32x r_a = a; + u32x r_b = b; + u32x r_c = c; + u32x r_d = d; + + u32x t0[4]; + u32x t1[4]; + u32x t2[4]; + u32x t3[4]; + + t0[0] = 0; + t0[1] = 0; + t0[2] = 0; + t0[3] = 0; + t1[0] = 0; + t1[1] = 0; + t1[2] = 0; + t1[3] = 0; + t2[0] = 0; + t2[1] = 0x80; + t2[2] = 0; + t2[3] = 0; + t3[0] = 0; + t3[1] = 0; + t3[2] = 100 * 8; + t3[3] = 0; + + MD5_STEP (MD5_Fo, a, b, c, d, t0[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, t0[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, t0[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, t0[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, t1[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, t1[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, t1[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, t1[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, t2[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, t2[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, t2[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, t2[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, t3[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, t3[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, t3[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, t3[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, t0[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, t1[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, t2[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, t0[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, t1[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, t2[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, t3[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, t1[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, t2[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, t3[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, t0[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, t2[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, t3[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, t0[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, t1[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, t3[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H , a, b, c, d, t1[1], MD5C20, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, t2[0], MD5C21, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, t2[3], MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, t3[2], MD5C23, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, t0[1], MD5C24, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, t1[0], MD5C25, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, t1[3], MD5C26, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, t2[2], MD5C27, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, t3[1], MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, t0[0], MD5C29, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, t0[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, t1[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, t2[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, t3[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, t3[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, t0[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, t0[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, t1[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, t3[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, t1[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, t3[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, t0[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, t2[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, t0[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, t2[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, t3[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, t1[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, t3[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, t1[0], MD5C3c, MD5S30); + + if (allx ((a + r_a) != search[0])) continue; + + MD5_STEP (MD5_I , d, a, b, c, t2[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, t0[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, t2[1], MD5C3f, MD5S33); + + a += r_a; + b += r_b; + c += r_c; + d += r_d; + + const u32x r0 = a; + const u32x r1 = d; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_S + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m09900_s08 (__global pw_t *pws, __global gpu_rule_t * rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m09900_s16 (__global pw_t *pws, __global gpu_rule_t * rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/amd/m09900_a1.cl b/amd/m09900_a1.cl new file mode 100644 index 0000000000..7b6e6e217c --- /dev/null +++ b/amd/m09900_a1.cl @@ -0,0 +1,694 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _MD5_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW4 +#define VECT_SIZE4 +#endif + +#ifdef VLIW5 +#define VECT_SIZE4 +#endif + +#define DGST_R0 0 +#define DGST_R1 3 +#define DGST_R2 2 +#define DGST_R3 1 + +#include "include/kernel_functions.c" +#include "types_amd.c" +#include "common_amd.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m09900_m04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, combs_buf[0].pw_len); + } + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = combs_buf[il_pos].pw_len; + + const u32 pw_len = pw_l_len + pw_r_len; + + u32 wordr0[4]; + + wordr0[0] = combs_buf[il_pos].i[0]; + wordr0[1] = combs_buf[il_pos].i[1]; + wordr0[2] = combs_buf[il_pos].i[2]; + wordr0[3] = combs_buf[il_pos].i[3]; + + u32 wordr1[4]; + + wordr1[0] = combs_buf[il_pos].i[4]; + wordr1[1] = combs_buf[il_pos].i[5]; + wordr1[2] = combs_buf[il_pos].i[6]; + wordr1[3] = combs_buf[il_pos].i[7]; + + u32 wordr2[4]; + + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + + u32 wordr3[4]; + + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + u32x w0[4]; + + w0[0] = wordl0[0] | wordr0[0]; + w0[1] = wordl0[1] | wordr0[1]; + w0[2] = wordl0[2] | wordr0[2]; + w0[3] = wordl0[3] | wordr0[3]; + + u32x w1[4]; + + w1[0] = wordl1[0] | wordr1[0]; + w1[1] = wordl1[1] | wordr1[1]; + w1[2] = wordl1[2] | wordr1[2]; + w1[3] = wordl1[3] | wordr1[3]; + + u32x w2[4]; + + w2[0] = wordl2[0] | wordr2[0]; + w2[1] = wordl2[1] | wordr2[1]; + w2[2] = wordl2[2] | wordr2[2]; + w2[3] = wordl2[3] | wordr2[3]; + + u32x w3[4]; + + w3[0] = wordl3[0] | wordr3[0]; + w3[1] = wordl3[1] | wordr3[1]; + w3[2] = wordl3[2] | wordr3[2]; + w3[3] = wordl3[3] | wordr3[3]; + + u32x a = MD5M_A; + u32x b = MD5M_B; + u32x c = MD5M_C; + u32x d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H , a, b, c, d, w1[1], MD5C20, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w2[0], MD5C21, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w2[3], MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w3[2], MD5C23, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w0[1], MD5C24, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w1[0], MD5C25, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w1[3], MD5C26, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w2[2], MD5C27, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w3[1], MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w0[0], MD5C29, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w0[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w1[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w2[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w3[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w3[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w0[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1[0], MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w2[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2[1], MD5C3f, MD5S33); + + a += MD5M_A; + b += MD5M_B; + c += MD5M_C; + d += MD5M_D; + + u32x r_a = a; + u32x r_b = b; + u32x r_c = c; + u32x r_d = d; + + u32x t0[4]; + u32x t1[4]; + u32x t2[4]; + u32x t3[4]; + + t0[0] = 0; + t0[1] = 0; + t0[2] = 0; + t0[3] = 0; + t1[0] = 0; + t1[1] = 0; + t1[2] = 0; + t1[3] = 0; + t2[0] = 0; + t2[1] = 0x80; + t2[2] = 0; + t2[3] = 0; + t3[0] = 0; + t3[1] = 0; + t3[2] = 100 * 8; + t3[3] = 0; + + MD5_STEP (MD5_Fo, a, b, c, d, t0[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, t0[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, t0[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, t0[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, t1[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, t1[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, t1[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, t1[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, t2[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, t2[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, t2[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, t2[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, t3[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, t3[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, t3[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, t3[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, t0[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, t1[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, t2[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, t0[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, t1[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, t2[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, t3[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, t1[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, t2[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, t3[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, t0[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, t2[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, t3[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, t0[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, t1[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, t3[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H , a, b, c, d, t1[1], MD5C20, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, t2[0], MD5C21, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, t2[3], MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, t3[2], MD5C23, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, t0[1], MD5C24, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, t1[0], MD5C25, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, t1[3], MD5C26, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, t2[2], MD5C27, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, t3[1], MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, t0[0], MD5C29, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, t0[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, t1[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, t2[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, t3[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, t3[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, t0[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, t0[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, t1[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, t3[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, t1[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, t3[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, t0[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, t2[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, t0[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, t2[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, t3[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, t1[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, t3[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, t1[0], MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, t2[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, t0[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, t2[1], MD5C3f, MD5S33); + + a += r_a; + b += r_b; + c += r_c; + d += r_d; + + const u32x r0 = a; + const u32x r1 = d; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_M + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m09900_m08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m09900_m16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m09900_s04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, combs_buf[0].pw_len); + } + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = combs_buf[il_pos].pw_len; + + const u32 pw_len = pw_l_len + pw_r_len; + + u32 wordr0[4]; + + wordr0[0] = combs_buf[il_pos].i[0]; + wordr0[1] = combs_buf[il_pos].i[1]; + wordr0[2] = combs_buf[il_pos].i[2]; + wordr0[3] = combs_buf[il_pos].i[3]; + + u32 wordr1[4]; + + wordr1[0] = combs_buf[il_pos].i[4]; + wordr1[1] = combs_buf[il_pos].i[5]; + wordr1[2] = combs_buf[il_pos].i[6]; + wordr1[3] = combs_buf[il_pos].i[7]; + + u32 wordr2[4]; + + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + + u32 wordr3[4]; + + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + u32x w0[4]; + + w0[0] = wordl0[0] | wordr0[0]; + w0[1] = wordl0[1] | wordr0[1]; + w0[2] = wordl0[2] | wordr0[2]; + w0[3] = wordl0[3] | wordr0[3]; + + u32x w1[4]; + + w1[0] = wordl1[0] | wordr1[0]; + w1[1] = wordl1[1] | wordr1[1]; + w1[2] = wordl1[2] | wordr1[2]; + w1[3] = wordl1[3] | wordr1[3]; + + u32x w2[4]; + + w2[0] = wordl2[0] | wordr2[0]; + w2[1] = wordl2[1] | wordr2[1]; + w2[2] = wordl2[2] | wordr2[2]; + w2[3] = wordl2[3] | wordr2[3]; + + u32x w3[4]; + + w3[0] = wordl3[0] | wordr3[0]; + w3[1] = wordl3[1] | wordr3[1]; + w3[2] = wordl3[2] | wordr3[2]; + w3[3] = wordl3[3] | wordr3[3]; + + u32x a = MD5M_A; + u32x b = MD5M_B; + u32x c = MD5M_C; + u32x d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H , a, b, c, d, w1[1], MD5C20, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w2[0], MD5C21, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w2[3], MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w3[2], MD5C23, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w0[1], MD5C24, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w1[0], MD5C25, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w1[3], MD5C26, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w2[2], MD5C27, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w3[1], MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w0[0], MD5C29, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w0[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w1[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w2[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w3[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w3[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w0[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1[0], MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w2[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2[1], MD5C3f, MD5S33); + + a += MD5M_A; + b += MD5M_B; + c += MD5M_C; + d += MD5M_D; + + u32x r_a = a; + u32x r_b = b; + u32x r_c = c; + u32x r_d = d; + + u32x t0[4]; + u32x t1[4]; + u32x t2[4]; + u32x t3[4]; + + t0[0] = 0; + t0[1] = 0; + t0[2] = 0; + t0[3] = 0; + t1[0] = 0; + t1[1] = 0; + t1[2] = 0; + t1[3] = 0; + t2[0] = 0; + t2[1] = 0x80; + t2[2] = 0; + t2[3] = 0; + t3[0] = 0; + t3[1] = 0; + t3[2] = 100 * 8; + t3[3] = 0; + + MD5_STEP (MD5_Fo, a, b, c, d, t0[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, t0[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, t0[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, t0[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, t1[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, t1[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, t1[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, t1[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, t2[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, t2[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, t2[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, t2[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, t3[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, t3[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, t3[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, t3[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, t0[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, t1[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, t2[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, t0[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, t1[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, t2[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, t3[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, t1[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, t2[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, t3[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, t0[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, t2[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, t3[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, t0[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, t1[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, t3[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H , a, b, c, d, t1[1], MD5C20, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, t2[0], MD5C21, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, t2[3], MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, t3[2], MD5C23, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, t0[1], MD5C24, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, t1[0], MD5C25, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, t1[3], MD5C26, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, t2[2], MD5C27, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, t3[1], MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, t0[0], MD5C29, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, t0[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, t1[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, t2[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, t3[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, t3[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, t0[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, t0[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, t1[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, t3[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, t1[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, t3[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, t0[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, t2[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, t0[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, t2[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, t3[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, t1[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, t3[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, t1[0], MD5C3c, MD5S30); + + if (allx ((a + r_a) != search[0])) continue; + + MD5_STEP (MD5_I , d, a, b, c, t2[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, t0[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, t2[1], MD5C3f, MD5S33); + + a += r_a; + b += r_b; + c += r_c; + d += r_d; + + const u32x r0 = a; + const u32x r1 = d; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_S + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m09900_s08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m09900_s16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/amd/m09900_a3.cl b/amd/m09900_a3.cl new file mode 100644 index 0000000000..7002b990de --- /dev/null +++ b/amd/m09900_a3.cl @@ -0,0 +1,853 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _MD5_ +#define _SCALAR_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW4 +#define VECT_SIZE4 +#endif + +#ifdef VLIW5 +#define VECT_SIZE4 +#endif + +#define DGST_R0 0 +#define DGST_R1 3 +#define DGST_R2 2 +#define DGST_R3 1 + +#include "include/kernel_functions.c" +#include "types_amd.c" +#include "common_amd.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4_warp.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4_warp.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4_warp.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4_warp.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4_warp.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4_warp.c" +#endif + +static void m09900m (u32 w[16], const u32 pw_len, __global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global u32x * words_buf_r, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset) +{ + /** + * modifier + */ + + const u32 gid = get_global_id (0); + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 F_w0c00 = 0 + MD5C00; + const u32 F_w1c01 = w[ 1] + MD5C01; + const u32 F_w2c02 = w[ 2] + MD5C02; + const u32 F_w3c03 = w[ 3] + MD5C03; + const u32 F_w4c04 = w[ 4] + MD5C04; + const u32 F_w5c05 = w[ 5] + MD5C05; + const u32 F_w6c06 = w[ 6] + MD5C06; + const u32 F_w7c07 = w[ 7] + MD5C07; + const u32 F_w8c08 = w[ 8] + MD5C08; + const u32 F_w9c09 = w[ 9] + MD5C09; + const u32 F_wac0a = w[10] + MD5C0a; + const u32 F_wbc0b = w[11] + MD5C0b; + const u32 F_wcc0c = w[12] + MD5C0c; + const u32 F_wdc0d = w[13] + MD5C0d; + const u32 F_wec0e = w[14] + MD5C0e; + const u32 F_wfc0f = w[15] + MD5C0f; + + const u32 G_w1c10 = w[ 1] + MD5C10; + const u32 G_w6c11 = w[ 6] + MD5C11; + const u32 G_wbc12 = w[11] + MD5C12; + const u32 G_w0c13 = 0 + MD5C13; + const u32 G_w5c14 = w[ 5] + MD5C14; + const u32 G_wac15 = w[10] + MD5C15; + const u32 G_wfc16 = w[15] + MD5C16; + const u32 G_w4c17 = w[ 4] + MD5C17; + const u32 G_w9c18 = w[ 9] + MD5C18; + const u32 G_wec19 = w[14] + MD5C19; + const u32 G_w3c1a = w[ 3] + MD5C1a; + const u32 G_w8c1b = w[ 8] + MD5C1b; + const u32 G_wdc1c = w[13] + MD5C1c; + const u32 G_w2c1d = w[ 2] + MD5C1d; + const u32 G_w7c1e = w[ 7] + MD5C1e; + const u32 G_wcc1f = w[12] + MD5C1f; + + const u32 H_w5c20 = w[ 5] + MD5C20; + const u32 H_w8c21 = w[ 8] + MD5C21; + const u32 H_wbc22 = w[11] + MD5C22; + const u32 H_wec23 = w[14] + MD5C23; + const u32 H_w1c24 = w[ 1] + MD5C24; + const u32 H_w4c25 = w[ 4] + MD5C25; + const u32 H_w7c26 = w[ 7] + MD5C26; + const u32 H_wac27 = w[10] + MD5C27; + const u32 H_wdc28 = w[13] + MD5C28; + const u32 H_w0c29 = 0 + MD5C29; + const u32 H_w3c2a = w[ 3] + MD5C2a; + const u32 H_w6c2b = w[ 6] + MD5C2b; + const u32 H_w9c2c = w[ 9] + MD5C2c; + const u32 H_wcc2d = w[12] + MD5C2d; + const u32 H_wfc2e = w[15] + MD5C2e; + const u32 H_w2c2f = w[ 2] + MD5C2f; + + const u32 I_w0c30 = 0 + MD5C30; + const u32 I_w7c31 = w[ 7] + MD5C31; + const u32 I_wec32 = w[14] + MD5C32; + const u32 I_w5c33 = w[ 5] + MD5C33; + const u32 I_wcc34 = w[12] + MD5C34; + const u32 I_w3c35 = w[ 3] + MD5C35; + const u32 I_wac36 = w[10] + MD5C36; + const u32 I_w1c37 = w[ 1] + MD5C37; + const u32 I_w8c38 = w[ 8] + MD5C38; + const u32 I_wfc39 = w[15] + MD5C39; + const u32 I_w6c3a = w[ 6] + MD5C3a; + const u32 I_wdc3b = w[13] + MD5C3b; + const u32 I_w4c3c = w[ 4] + MD5C3c; + const u32 I_wbc3d = w[11] + MD5C3d; + const u32 I_w2c3e = w[ 2] + MD5C3e; + const u32 I_w9c3f = w[ 9] + MD5C3f; + + /** + * loop + */ + + const u32 bf_loops = ceil ((float) bfs_cnt / VECT_DIV); + + u32x w0l = w[0]; + + for (u32 il_pos = 0; il_pos < bf_loops; il_pos++) + { + const u32x w0r = words_buf_r[il_pos]; + + const u32x w0 = w0l | w0r; + + u32x a = MD5M_A; + u32x b = MD5M_B; + u32x c = MD5M_C; + u32x d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0, F_w0c00, MD5S00); + MD5_STEP0(MD5_Fo, d, a, b, c, F_w1c01, MD5S01); + MD5_STEP0(MD5_Fo, c, d, a, b, F_w2c02, MD5S02); + MD5_STEP0(MD5_Fo, b, c, d, a, F_w3c03, MD5S03); + MD5_STEP0(MD5_Fo, a, b, c, d, F_w4c04, MD5S00); + MD5_STEP0(MD5_Fo, d, a, b, c, F_w5c05, MD5S01); + MD5_STEP0(MD5_Fo, c, d, a, b, F_w6c06, MD5S02); + MD5_STEP0(MD5_Fo, b, c, d, a, F_w7c07, MD5S03); + MD5_STEP0(MD5_Fo, a, b, c, d, F_w8c08, MD5S00); + MD5_STEP0(MD5_Fo, d, a, b, c, F_w9c09, MD5S01); + MD5_STEP0(MD5_Fo, c, d, a, b, F_wac0a, MD5S02); + MD5_STEP0(MD5_Fo, b, c, d, a, F_wbc0b, MD5S03); + MD5_STEP0(MD5_Fo, a, b, c, d, F_wcc0c, MD5S00); + MD5_STEP0(MD5_Fo, d, a, b, c, F_wdc0d, MD5S01); + MD5_STEP0(MD5_Fo, c, d, a, b, F_wec0e, MD5S02); + MD5_STEP0(MD5_Fo, b, c, d, a, F_wfc0f, MD5S03); + + MD5_STEP0(MD5_Go, a, b, c, d, G_w1c10, MD5S10); + MD5_STEP0(MD5_Go, d, a, b, c, G_w6c11, MD5S11); + MD5_STEP0(MD5_Go, c, d, a, b, G_wbc12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0, G_w0c13, MD5S13); + MD5_STEP0(MD5_Go, a, b, c, d, G_w5c14, MD5S10); + MD5_STEP0(MD5_Go, d, a, b, c, G_wac15, MD5S11); + MD5_STEP0(MD5_Go, c, d, a, b, G_wfc16, MD5S12); + MD5_STEP0(MD5_Go, b, c, d, a, G_w4c17, MD5S13); + MD5_STEP0(MD5_Go, a, b, c, d, G_w9c18, MD5S10); + MD5_STEP0(MD5_Go, d, a, b, c, G_wec19, MD5S11); + MD5_STEP0(MD5_Go, c, d, a, b, G_w3c1a, MD5S12); + MD5_STEP0(MD5_Go, b, c, d, a, G_w8c1b, MD5S13); + MD5_STEP0(MD5_Go, a, b, c, d, G_wdc1c, MD5S10); + MD5_STEP0(MD5_Go, d, a, b, c, G_w2c1d, MD5S11); + MD5_STEP0(MD5_Go, c, d, a, b, G_w7c1e, MD5S12); + MD5_STEP0(MD5_Go, b, c, d, a, G_wcc1f, MD5S13); + + MD5_STEP0(MD5_H , a, b, c, d, H_w5c20, MD5S20); + MD5_STEP0(MD5_H , d, a, b, c, H_w8c21, MD5S21); + MD5_STEP0(MD5_H , c, d, a, b, H_wbc22, MD5S22); + MD5_STEP0(MD5_H , b, c, d, a, H_wec23, MD5S23); + MD5_STEP0(MD5_H , a, b, c, d, H_w1c24, MD5S20); + MD5_STEP0(MD5_H , d, a, b, c, H_w4c25, MD5S21); + MD5_STEP0(MD5_H , c, d, a, b, H_w7c26, MD5S22); + MD5_STEP0(MD5_H , b, c, d, a, H_wac27, MD5S23); + MD5_STEP0(MD5_H , a, b, c, d, H_wdc28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w0, H_w0c29, MD5S21); + MD5_STEP0(MD5_H , c, d, a, b, H_w3c2a, MD5S22); + MD5_STEP0(MD5_H , b, c, d, a, H_w6c2b, MD5S23); + MD5_STEP0(MD5_H , a, b, c, d, H_w9c2c, MD5S20); + MD5_STEP0(MD5_H , d, a, b, c, H_wcc2d, MD5S21); + MD5_STEP0(MD5_H , c, d, a, b, H_wfc2e, MD5S22); + MD5_STEP0(MD5_H , b, c, d, a, H_w2c2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0, I_w0c30, MD5S30); + MD5_STEP0(MD5_I , d, a, b, c, I_w7c31, MD5S31); + MD5_STEP0(MD5_I , c, d, a, b, I_wec32, MD5S32); + MD5_STEP0(MD5_I , b, c, d, a, I_w5c33, MD5S33); + MD5_STEP0(MD5_I , a, b, c, d, I_wcc34, MD5S30); + MD5_STEP0(MD5_I , d, a, b, c, I_w3c35, MD5S31); + MD5_STEP0(MD5_I , c, d, a, b, I_wac36, MD5S32); + MD5_STEP0(MD5_I , b, c, d, a, I_w1c37, MD5S33); + MD5_STEP0(MD5_I , a, b, c, d, I_w8c38, MD5S30); + MD5_STEP0(MD5_I , d, a, b, c, I_wfc39, MD5S31); + MD5_STEP0(MD5_I , c, d, a, b, I_w6c3a, MD5S32); + MD5_STEP0(MD5_I , b, c, d, a, I_wdc3b, MD5S33); + MD5_STEP0(MD5_I , a, b, c, d, I_w4c3c, MD5S30); + MD5_STEP0(MD5_I , d, a, b, c, I_wbc3d, MD5S31); + MD5_STEP0(MD5_I , c, d, a, b, I_w2c3e, MD5S32); + MD5_STEP0(MD5_I , b, c, d, a, I_w9c3f, MD5S33); + + a += MD5M_A; + b += MD5M_B; + c += MD5M_C; + d += MD5M_D; + + u32x r_a = a; + u32x r_b = b; + u32x r_c = c; + u32x r_d = d; + + u32x t0[4]; + u32x t1[4]; + u32x t2[4]; + u32x t3[4]; + + t0[0] = 0; + t0[1] = 0; + t0[2] = 0; + t0[3] = 0; + t1[0] = 0; + t1[1] = 0; + t1[2] = 0; + t1[3] = 0; + t2[0] = 0; + t2[1] = 0x80; + t2[2] = 0; + t2[3] = 0; + t3[0] = 0; + t3[1] = 0; + t3[2] = 100 * 8; + t3[3] = 0; + + MD5_STEP (MD5_Fo, a, b, c, d, t0[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, t0[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, t0[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, t0[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, t1[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, t1[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, t1[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, t1[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, t2[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, t2[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, t2[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, t2[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, t3[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, t3[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, t3[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, t3[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, t0[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, t1[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, t2[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, t0[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, t1[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, t2[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, t3[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, t1[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, t2[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, t3[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, t0[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, t2[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, t3[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, t0[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, t1[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, t3[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H , a, b, c, d, t1[1], MD5C20, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, t2[0], MD5C21, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, t2[3], MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, t3[2], MD5C23, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, t0[1], MD5C24, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, t1[0], MD5C25, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, t1[3], MD5C26, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, t2[2], MD5C27, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, t3[1], MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, t0[0], MD5C29, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, t0[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, t1[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, t2[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, t3[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, t3[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, t0[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, t0[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, t1[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, t3[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, t1[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, t3[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, t0[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, t2[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, t0[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, t2[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, t3[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, t1[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, t3[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, t1[0], MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, t2[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, t0[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, t2[1], MD5C3f, MD5S33); + + a += r_a; + b += r_b; + c += r_c; + d += r_d; + + const u32x r0 = a; + const u32x r1 = d; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_M + } +} + +static void m09900s (u32 w[16], const u32 pw_len, __global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global u32x * words_buf_r, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset) +{ + /** + * modifier + */ + + const u32 gid = get_global_id (0); + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 F_w0c00 = 0 + MD5C00; + const u32 F_w1c01 = w[ 1] + MD5C01; + const u32 F_w2c02 = w[ 2] + MD5C02; + const u32 F_w3c03 = w[ 3] + MD5C03; + const u32 F_w4c04 = w[ 4] + MD5C04; + const u32 F_w5c05 = w[ 5] + MD5C05; + const u32 F_w6c06 = w[ 6] + MD5C06; + const u32 F_w7c07 = w[ 7] + MD5C07; + const u32 F_w8c08 = w[ 8] + MD5C08; + const u32 F_w9c09 = w[ 9] + MD5C09; + const u32 F_wac0a = w[10] + MD5C0a; + const u32 F_wbc0b = w[11] + MD5C0b; + const u32 F_wcc0c = w[12] + MD5C0c; + const u32 F_wdc0d = w[13] + MD5C0d; + const u32 F_wec0e = w[14] + MD5C0e; + const u32 F_wfc0f = w[15] + MD5C0f; + + const u32 G_w1c10 = w[ 1] + MD5C10; + const u32 G_w6c11 = w[ 6] + MD5C11; + const u32 G_wbc12 = w[11] + MD5C12; + const u32 G_w0c13 = 0 + MD5C13; + const u32 G_w5c14 = w[ 5] + MD5C14; + const u32 G_wac15 = w[10] + MD5C15; + const u32 G_wfc16 = w[15] + MD5C16; + const u32 G_w4c17 = w[ 4] + MD5C17; + const u32 G_w9c18 = w[ 9] + MD5C18; + const u32 G_wec19 = w[14] + MD5C19; + const u32 G_w3c1a = w[ 3] + MD5C1a; + const u32 G_w8c1b = w[ 8] + MD5C1b; + const u32 G_wdc1c = w[13] + MD5C1c; + const u32 G_w2c1d = w[ 2] + MD5C1d; + const u32 G_w7c1e = w[ 7] + MD5C1e; + const u32 G_wcc1f = w[12] + MD5C1f; + + const u32 H_w5c20 = w[ 5] + MD5C20; + const u32 H_w8c21 = w[ 8] + MD5C21; + const u32 H_wbc22 = w[11] + MD5C22; + const u32 H_wec23 = w[14] + MD5C23; + const u32 H_w1c24 = w[ 1] + MD5C24; + const u32 H_w4c25 = w[ 4] + MD5C25; + const u32 H_w7c26 = w[ 7] + MD5C26; + const u32 H_wac27 = w[10] + MD5C27; + const u32 H_wdc28 = w[13] + MD5C28; + const u32 H_w0c29 = 0 + MD5C29; + const u32 H_w3c2a = w[ 3] + MD5C2a; + const u32 H_w6c2b = w[ 6] + MD5C2b; + const u32 H_w9c2c = w[ 9] + MD5C2c; + const u32 H_wcc2d = w[12] + MD5C2d; + const u32 H_wfc2e = w[15] + MD5C2e; + const u32 H_w2c2f = w[ 2] + MD5C2f; + + const u32 I_w0c30 = 0 + MD5C30; + const u32 I_w7c31 = w[ 7] + MD5C31; + const u32 I_wec32 = w[14] + MD5C32; + const u32 I_w5c33 = w[ 5] + MD5C33; + const u32 I_wcc34 = w[12] + MD5C34; + const u32 I_w3c35 = w[ 3] + MD5C35; + const u32 I_wac36 = w[10] + MD5C36; + const u32 I_w1c37 = w[ 1] + MD5C37; + const u32 I_w8c38 = w[ 8] + MD5C38; + const u32 I_wfc39 = w[15] + MD5C39; + const u32 I_w6c3a = w[ 6] + MD5C3a; + const u32 I_wdc3b = w[13] + MD5C3b; + const u32 I_w4c3c = w[ 4] + MD5C3c; + const u32 I_wbc3d = w[11] + MD5C3d; + const u32 I_w2c3e = w[ 2] + MD5C3e; + const u32 I_w9c3f = w[ 9] + MD5C3f; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * loop + */ + + const u32 bf_loops = ceil ((float) bfs_cnt / VECT_DIV); + + u32x w0l = w[0]; + + for (u32 il_pos = 0; il_pos < bf_loops; il_pos++) + { + const u32x w0r = words_buf_r[il_pos]; + + const u32x w0 = w0l | w0r; + + u32x a = MD5M_A; + u32x b = MD5M_B; + u32x c = MD5M_C; + u32x d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0, F_w0c00, MD5S00); + MD5_STEP0(MD5_Fo, d, a, b, c, F_w1c01, MD5S01); + MD5_STEP0(MD5_Fo, c, d, a, b, F_w2c02, MD5S02); + MD5_STEP0(MD5_Fo, b, c, d, a, F_w3c03, MD5S03); + MD5_STEP0(MD5_Fo, a, b, c, d, F_w4c04, MD5S00); + MD5_STEP0(MD5_Fo, d, a, b, c, F_w5c05, MD5S01); + MD5_STEP0(MD5_Fo, c, d, a, b, F_w6c06, MD5S02); + MD5_STEP0(MD5_Fo, b, c, d, a, F_w7c07, MD5S03); + MD5_STEP0(MD5_Fo, a, b, c, d, F_w8c08, MD5S00); + MD5_STEP0(MD5_Fo, d, a, b, c, F_w9c09, MD5S01); + MD5_STEP0(MD5_Fo, c, d, a, b, F_wac0a, MD5S02); + MD5_STEP0(MD5_Fo, b, c, d, a, F_wbc0b, MD5S03); + MD5_STEP0(MD5_Fo, a, b, c, d, F_wcc0c, MD5S00); + MD5_STEP0(MD5_Fo, d, a, b, c, F_wdc0d, MD5S01); + MD5_STEP0(MD5_Fo, c, d, a, b, F_wec0e, MD5S02); + MD5_STEP0(MD5_Fo, b, c, d, a, F_wfc0f, MD5S03); + + MD5_STEP0(MD5_Go, a, b, c, d, G_w1c10, MD5S10); + MD5_STEP0(MD5_Go, d, a, b, c, G_w6c11, MD5S11); + MD5_STEP0(MD5_Go, c, d, a, b, G_wbc12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0, G_w0c13, MD5S13); + MD5_STEP0(MD5_Go, a, b, c, d, G_w5c14, MD5S10); + MD5_STEP0(MD5_Go, d, a, b, c, G_wac15, MD5S11); + MD5_STEP0(MD5_Go, c, d, a, b, G_wfc16, MD5S12); + MD5_STEP0(MD5_Go, b, c, d, a, G_w4c17, MD5S13); + MD5_STEP0(MD5_Go, a, b, c, d, G_w9c18, MD5S10); + MD5_STEP0(MD5_Go, d, a, b, c, G_wec19, MD5S11); + MD5_STEP0(MD5_Go, c, d, a, b, G_w3c1a, MD5S12); + MD5_STEP0(MD5_Go, b, c, d, a, G_w8c1b, MD5S13); + MD5_STEP0(MD5_Go, a, b, c, d, G_wdc1c, MD5S10); + MD5_STEP0(MD5_Go, d, a, b, c, G_w2c1d, MD5S11); + MD5_STEP0(MD5_Go, c, d, a, b, G_w7c1e, MD5S12); + MD5_STEP0(MD5_Go, b, c, d, a, G_wcc1f, MD5S13); + + MD5_STEP0(MD5_H , a, b, c, d, H_w5c20, MD5S20); + MD5_STEP0(MD5_H , d, a, b, c, H_w8c21, MD5S21); + MD5_STEP0(MD5_H , c, d, a, b, H_wbc22, MD5S22); + MD5_STEP0(MD5_H , b, c, d, a, H_wec23, MD5S23); + MD5_STEP0(MD5_H , a, b, c, d, H_w1c24, MD5S20); + MD5_STEP0(MD5_H , d, a, b, c, H_w4c25, MD5S21); + MD5_STEP0(MD5_H , c, d, a, b, H_w7c26, MD5S22); + MD5_STEP0(MD5_H , b, c, d, a, H_wac27, MD5S23); + MD5_STEP0(MD5_H , a, b, c, d, H_wdc28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w0, H_w0c29, MD5S21); + MD5_STEP0(MD5_H , c, d, a, b, H_w3c2a, MD5S22); + MD5_STEP0(MD5_H , b, c, d, a, H_w6c2b, MD5S23); + MD5_STEP0(MD5_H , a, b, c, d, H_w9c2c, MD5S20); + MD5_STEP0(MD5_H , d, a, b, c, H_wcc2d, MD5S21); + MD5_STEP0(MD5_H , c, d, a, b, H_wfc2e, MD5S22); + MD5_STEP0(MD5_H , b, c, d, a, H_w2c2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0, I_w0c30, MD5S30); + MD5_STEP0(MD5_I , d, a, b, c, I_w7c31, MD5S31); + MD5_STEP0(MD5_I , c, d, a, b, I_wec32, MD5S32); + MD5_STEP0(MD5_I , b, c, d, a, I_w5c33, MD5S33); + MD5_STEP0(MD5_I , a, b, c, d, I_wcc34, MD5S30); + MD5_STEP0(MD5_I , d, a, b, c, I_w3c35, MD5S31); + MD5_STEP0(MD5_I , c, d, a, b, I_wac36, MD5S32); + MD5_STEP0(MD5_I , b, c, d, a, I_w1c37, MD5S33); + MD5_STEP0(MD5_I , a, b, c, d, I_w8c38, MD5S30); + MD5_STEP0(MD5_I , d, a, b, c, I_wfc39, MD5S31); + MD5_STEP0(MD5_I , c, d, a, b, I_w6c3a, MD5S32); + MD5_STEP0(MD5_I , b, c, d, a, I_wdc3b, MD5S33); + MD5_STEP0(MD5_I , a, b, c, d, I_w4c3c, MD5S30); + MD5_STEP0(MD5_I , d, a, b, c, I_wbc3d, MD5S31); + MD5_STEP0(MD5_I , c, d, a, b, I_w2c3e, MD5S32); + MD5_STEP0(MD5_I , b, c, d, a, I_w9c3f, MD5S33); + + a += MD5M_A; + b += MD5M_B; + c += MD5M_C; + d += MD5M_D; + + u32x r_a = a; + u32x r_b = b; + u32x r_c = c; + u32x r_d = d; + + u32x t0[4]; + u32x t1[4]; + u32x t2[4]; + u32x t3[4]; + + t0[0] = 0; + t0[1] = 0; + t0[2] = 0; + t0[3] = 0; + t1[0] = 0; + t1[1] = 0; + t1[2] = 0; + t1[3] = 0; + t2[0] = 0; + t2[1] = 0x80; + t2[2] = 0; + t2[3] = 0; + t3[0] = 0; + t3[1] = 0; + t3[2] = 100 * 8; + t3[3] = 0; + + MD5_STEP (MD5_Fo, a, b, c, d, t0[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, t0[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, t0[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, t0[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, t1[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, t1[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, t1[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, t1[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, t2[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, t2[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, t2[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, t2[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, t3[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, t3[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, t3[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, t3[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, t0[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, t1[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, t2[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, t0[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, t1[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, t2[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, t3[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, t1[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, t2[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, t3[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, t0[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, t2[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, t3[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, t0[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, t1[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, t3[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H , a, b, c, d, t1[1], MD5C20, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, t2[0], MD5C21, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, t2[3], MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, t3[2], MD5C23, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, t0[1], MD5C24, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, t1[0], MD5C25, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, t1[3], MD5C26, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, t2[2], MD5C27, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, t3[1], MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, t0[0], MD5C29, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, t0[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, t1[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, t2[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, t3[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, t3[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, t0[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, t0[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, t1[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, t3[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, t1[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, t3[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, t0[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, t2[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, t0[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, t2[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, t3[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, t1[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, t3[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, t1[0], MD5C3c, MD5S30); + + if (allx ((a + r_a) != search[0])) continue; + + MD5_STEP (MD5_I , d, a, b, c, t2[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, t0[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, t2[1], MD5C3f, MD5S33); + + a += r_a; + b += r_b; + c += r_c; + d += r_d; + + const u32x r0 = a; + const u32x r1 = d; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_S + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m09900_m04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global u32x * words_buf_r, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32 w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = 0; + w[ 5] = 0; + w[ 6] = 0; + w[ 7] = 0; + w[ 8] = 0; + w[ 9] = 0; + w[10] = 0; + w[11] = 0; + w[12] = 0; + w[13] = 0; + w[14] = 0; + w[15] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m09900m (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m09900_m08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global u32x * words_buf_r, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32 w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = pws[gid].i[ 4]; + w[ 5] = pws[gid].i[ 5]; + w[ 6] = pws[gid].i[ 6]; + w[ 7] = pws[gid].i[ 7]; + w[ 8] = 0; + w[ 9] = 0; + w[10] = 0; + w[11] = 0; + w[12] = 0; + w[13] = 0; + w[14] = 0; + w[15] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m09900m (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m09900_m16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global u32x * words_buf_r, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32 w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = pws[gid].i[ 4]; + w[ 5] = pws[gid].i[ 5]; + w[ 6] = pws[gid].i[ 6]; + w[ 7] = pws[gid].i[ 7]; + w[ 8] = pws[gid].i[ 8]; + w[ 9] = pws[gid].i[ 9]; + w[10] = pws[gid].i[10]; + w[11] = pws[gid].i[11]; + w[12] = pws[gid].i[12]; + w[13] = pws[gid].i[13]; + w[14] = pws[gid].i[14]; + w[15] = pws[gid].i[15]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m09900m (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m09900_s04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global u32x * words_buf_r, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32 w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = 0; + w[ 5] = 0; + w[ 6] = 0; + w[ 7] = 0; + w[ 8] = 0; + w[ 9] = 0; + w[10] = 0; + w[11] = 0; + w[12] = 0; + w[13] = 0; + w[14] = 0; + w[15] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m09900s (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m09900_s08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global u32x * words_buf_r, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32 w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = pws[gid].i[ 4]; + w[ 5] = pws[gid].i[ 5]; + w[ 6] = pws[gid].i[ 6]; + w[ 7] = pws[gid].i[ 7]; + w[ 8] = 0; + w[ 9] = 0; + w[10] = 0; + w[11] = 0; + w[12] = 0; + w[13] = 0; + w[14] = 0; + w[15] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m09900s (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m09900_s16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global u32x * words_buf_r, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32 w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = pws[gid].i[ 4]; + w[ 5] = pws[gid].i[ 5]; + w[ 6] = pws[gid].i[ 6]; + w[ 7] = pws[gid].i[ 7]; + w[ 8] = pws[gid].i[ 8]; + w[ 9] = pws[gid].i[ 9]; + w[10] = pws[gid].i[10]; + w[11] = pws[gid].i[11]; + w[12] = pws[gid].i[12]; + w[13] = pws[gid].i[13]; + w[14] = pws[gid].i[14]; + w[15] = pws[gid].i[15]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m09900s (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} diff --git a/amd/m10100_a0.cl b/amd/m10100_a0.cl new file mode 100644 index 0000000000..94b71023cb --- /dev/null +++ b/amd/m10100_a0.cl @@ -0,0 +1,345 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _SIPHASH_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW4 +#define VECT_SIZE1 +#endif + +#ifdef VLIW5 +#define VECT_SIZE1 +#endif + +#define DGST_R0 0 +#define DGST_R1 1 +#define DGST_R2 2 +#define DGST_R3 3 + +#include "include/kernel_functions.c" +#include "types_amd.c" +#include "common_amd.c" +#include "include/rp_gpu.h" +#include "rp_amd.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +#ifdef VECT_SIZE1 +#define SIPROUND(v0,v1,v2,v3) \ + (v0) += (v1); \ + (v1) = rotl64 ((v1), 13); \ + (v1) ^= (v0); \ + (v0) = as_ulong (as_uint2 ((v0)).s10); \ + (v2) += (v3); \ + (v3) = rotl64 ((v3), 16); \ + (v3) ^= (v2); \ + (v0) += (v3); \ + (v3) = rotl64 ((v3), 21); \ + (v3) ^= (v0); \ + (v2) += (v1); \ + (v1) = rotl64 ((v1), 17); \ + (v1) ^= (v2); \ + (v2) = as_ulong (as_uint2 ((v2)).s10); +#else +#define SIPROUND(v0,v1,v2,v3) \ + (v0) += (v1); \ + (v1) = rotl64 ((v1), 13); \ + (v1) ^= (v0); \ + (v0) = rotl64 ((v0), 32); \ + (v2) += (v3); \ + (v3) = rotl64 ((v3), 16); \ + (v3) ^= (v2); \ + (v0) += (v3); \ + (v3) = rotl64 ((v3), 21); \ + (v3) ^= (v0); \ + (v2) += (v1); \ + (v1) = rotl64 ((v1), 17); \ + (v1) ^= (v2); \ + (v2) = rotl64 ((v2), 32); +#endif + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m10100_m04 (__global pw_t *pws, __global gpu_rule_t * rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + u32x pw_buf1[4]; + + pw_buf1[0] = pws[gid].i[ 4]; + pw_buf1[1] = pws[gid].i[ 5]; + pw_buf1[2] = pws[gid].i[ 6]; + pw_buf1[3] = pws[gid].i[ 7]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * base + */ + + u64 v0p = SIPHASHM_0; + u64 v1p = SIPHASHM_1; + u64 v2p = SIPHASHM_2; + u64 v3p = SIPHASHM_3; + + v0p ^= hl32_to_64 (salt_bufs[salt_pos].salt_buf[1], salt_bufs[salt_pos].salt_buf[0]); + v1p ^= hl32_to_64 (salt_bufs[salt_pos].salt_buf[3], salt_bufs[salt_pos].salt_buf[2]); + v2p ^= hl32_to_64 (salt_bufs[salt_pos].salt_buf[1], salt_bufs[salt_pos].salt_buf[0]); + v3p ^= hl32_to_64 (salt_bufs[salt_pos].salt_buf[3], salt_bufs[salt_pos].salt_buf[2]); + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w[16]; + + w[ 0] = pw_buf0[0]; + w[ 1] = pw_buf0[1]; + w[ 2] = pw_buf0[2]; + w[ 3] = pw_buf0[3]; + w[ 4] = pw_buf1[0]; + w[ 5] = pw_buf1[1]; + w[ 6] = pw_buf1[2]; + w[ 7] = pw_buf1[3]; + w[ 8] = 0; + w[ 9] = 0; + w[10] = 0; + w[11] = 0; + w[12] = 0; + w[13] = 0; + w[14] = 0; + w[15] = 0; + + const u32x out_len = apply_rules (rules_buf[il_pos].cmds, &w[0], &w[4], pw_len); + + u64 *w_ptr = (u64 *) w; + + w_ptr[out_len / 8] |= (u64) out_len << 56; + + u64x v0 = v0p; + u64x v1 = v1p; + u64x v2 = v2p; + u64x v3 = v3p; + + int i; + int j; + + for (i = 0, j = 0; i <= pw_len; i += 8, j += 2) + { + u64x m = hl32_to_64 (w[j + 1], w[j + 0]); + + v3 ^= m; + + SIPROUND (v0, v1, v2, v3); + SIPROUND (v0, v1, v2, v3); + + v0 ^= m; + } + + v2 ^= 0xff; + + SIPROUND (v0, v1, v2, v3); + SIPROUND (v0, v1, v2, v3); + SIPROUND (v0, v1, v2, v3); + SIPROUND (v0, v1, v2, v3); + + const u64x v = v0 ^ v1 ^ v2 ^ v3; + + const u32x a = l32_from_64 (v); + const u32x b = h32_from_64 (v); + + const u32x r0 = a; + const u32x r1 = b; + const u32x r2 = 0; + const u32x r3 = 0; + + #include VECT_COMPARE_M + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m10100_m08 (__global pw_t *pws, __global gpu_rule_t * rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m10100_m16 (__global pw_t *pws, __global gpu_rule_t * rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m10100_s04 (__global pw_t *pws, __global gpu_rule_t * rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + u32x pw_buf1[4]; + + pw_buf1[0] = pws[gid].i[ 4]; + pw_buf1[1] = pws[gid].i[ 5]; + pw_buf1[2] = pws[gid].i[ 6]; + pw_buf1[3] = pws[gid].i[ 7]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * base + */ + + u64 v0p = SIPHASHM_0; + u64 v1p = SIPHASHM_1; + u64 v2p = SIPHASHM_2; + u64 v3p = SIPHASHM_3; + + v0p ^= hl32_to_64 (salt_bufs[salt_pos].salt_buf[1], salt_bufs[salt_pos].salt_buf[0]); + v1p ^= hl32_to_64 (salt_bufs[salt_pos].salt_buf[3], salt_bufs[salt_pos].salt_buf[2]); + v2p ^= hl32_to_64 (salt_bufs[salt_pos].salt_buf[1], salt_bufs[salt_pos].salt_buf[0]); + v3p ^= hl32_to_64 (salt_bufs[salt_pos].salt_buf[3], salt_bufs[salt_pos].salt_buf[2]); + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w[16]; + + w[ 0] = pw_buf0[0]; + w[ 1] = pw_buf0[1]; + w[ 2] = pw_buf0[2]; + w[ 3] = pw_buf0[3]; + w[ 4] = pw_buf1[0]; + w[ 5] = pw_buf1[1]; + w[ 6] = pw_buf1[2]; + w[ 7] = pw_buf1[3]; + w[ 8] = 0; + w[ 9] = 0; + w[10] = 0; + w[11] = 0; + w[12] = 0; + w[13] = 0; + w[14] = 0; + w[15] = 0; + + const u32x out_len = apply_rules (rules_buf[il_pos].cmds, &w[0], &w[4], pw_len); + + u64 *w_ptr = (u64 *) w; + + w_ptr[out_len / 8] |= (u64) out_len << 56; + + u64x v0 = v0p; + u64x v1 = v1p; + u64x v2 = v2p; + u64x v3 = v3p; + + int i; + int j; + + for (i = 0, j = 0; i <= pw_len; i += 8, j += 2) + { + u64x m = hl32_to_64 (w[j + 1], w[j + 0]); + + v3 ^= m; + + SIPROUND (v0, v1, v2, v3); + SIPROUND (v0, v1, v2, v3); + + v0 ^= m; + } + + v2 ^= 0xff; + + SIPROUND (v0, v1, v2, v3); + SIPROUND (v0, v1, v2, v3); + SIPROUND (v0, v1, v2, v3); + SIPROUND (v0, v1, v2, v3); + + const u64x v = v0 ^ v1 ^ v2 ^ v3; + + const u32x a = l32_from_64 (v); + const u32x b = h32_from_64 (v); + + const u32x r0 = a; + const u32x r1 = b; + const u32x r2 = 0; + const u32x r3 = 0; + + #include VECT_COMPARE_S + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m10100_s08 (__global pw_t *pws, __global gpu_rule_t * rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m10100_s16 (__global pw_t *pws, __global gpu_rule_t * rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/amd/m10100_a1.cl b/amd/m10100_a1.cl new file mode 100644 index 0000000000..4818202b67 --- /dev/null +++ b/amd/m10100_a1.cl @@ -0,0 +1,451 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _SIPHASH_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW4 +#define VECT_SIZE1 +#endif + +#ifdef VLIW5 +#define VECT_SIZE1 +#endif + +#define DGST_R0 0 +#define DGST_R1 1 +#define DGST_R2 2 +#define DGST_R3 3 + +#include "include/kernel_functions.c" +#include "types_amd.c" +#include "common_amd.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +#ifdef VECT_SIZE1 +#define SIPROUND(v0,v1,v2,v3) \ + (v0) += (v1); \ + (v1) = rotl64 ((v1), 13); \ + (v1) ^= (v0); \ + (v0) = as_ulong (as_uint2 ((v0)).s10); \ + (v2) += (v3); \ + (v3) = rotl64 ((v3), 16); \ + (v3) ^= (v2); \ + (v0) += (v3); \ + (v3) = rotl64 ((v3), 21); \ + (v3) ^= (v0); \ + (v2) += (v1); \ + (v1) = rotl64 ((v1), 17); \ + (v1) ^= (v2); \ + (v2) = as_ulong (as_uint2 ((v2)).s10); +#else +#define SIPROUND(v0,v1,v2,v3) \ + (v0) += (v1); \ + (v1) = rotl64 ((v1), 13); \ + (v1) ^= (v0); \ + (v0) = rotl64 ((v0), 32); \ + (v2) += (v3); \ + (v3) = rotl64 ((v3), 16); \ + (v3) ^= (v2); \ + (v0) += (v3); \ + (v3) = rotl64 ((v3), 21); \ + (v3) ^= (v0); \ + (v2) += (v1); \ + (v1) = rotl64 ((v1), 17); \ + (v1) ^= (v2); \ + (v2) = rotl64 ((v2), 32); +#endif + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m10100_m04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, combs_buf[0].pw_len); + } + + /** + * base + */ + + u64 v0p = SIPHASHM_0; + u64 v1p = SIPHASHM_1; + u64 v2p = SIPHASHM_2; + u64 v3p = SIPHASHM_3; + + v0p ^= hl32_to_64 (salt_bufs[salt_pos].salt_buf[1], salt_bufs[salt_pos].salt_buf[0]); + v1p ^= hl32_to_64 (salt_bufs[salt_pos].salt_buf[3], salt_bufs[salt_pos].salt_buf[2]); + v2p ^= hl32_to_64 (salt_bufs[salt_pos].salt_buf[1], salt_bufs[salt_pos].salt_buf[0]); + v3p ^= hl32_to_64 (salt_bufs[salt_pos].salt_buf[3], salt_bufs[salt_pos].salt_buf[2]); + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = combs_buf[il_pos].pw_len; + + const u32 pw_len = pw_l_len + pw_r_len; + + u32 wordr0[4]; + + wordr0[0] = combs_buf[il_pos].i[0]; + wordr0[1] = combs_buf[il_pos].i[1]; + wordr0[2] = combs_buf[il_pos].i[2]; + wordr0[3] = combs_buf[il_pos].i[3]; + + u32 wordr1[4]; + + wordr1[0] = combs_buf[il_pos].i[4]; + wordr1[1] = combs_buf[il_pos].i[5]; + wordr1[2] = combs_buf[il_pos].i[6]; + wordr1[3] = combs_buf[il_pos].i[7]; + + u32 wordr2[4]; + + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + + u32 wordr3[4]; + + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + u32x w[16]; + + w[ 0] = wordl0[0] | wordr0[0]; + w[ 1] = wordl0[1] | wordr0[1]; + w[ 2] = wordl0[2] | wordr0[2]; + w[ 3] = wordl0[3] | wordr0[3]; + w[ 4] = wordl1[0] | wordr1[0]; + w[ 5] = wordl1[1] | wordr1[1]; + w[ 6] = wordl1[2] | wordr1[2]; + w[ 7] = wordl1[3] | wordr1[3]; + w[ 8] = wordl2[0] | wordr2[0]; + w[ 9] = wordl2[1] | wordr2[1]; + w[10] = wordl2[2] | wordr2[2]; + w[11] = wordl2[3] | wordr2[3]; + w[12] = wordl3[0] | wordr3[0]; + w[13] = wordl3[1] | wordr3[1]; + w[14] = wordl3[2] | wordr3[2]; + w[15] = wordl3[3] | wordr3[3]; + + u64 *w_ptr = (u64 *) w; + + w_ptr[pw_len / 8] |= (u64) pw_len << 56; + + u64x v0 = v0p; + u64x v1 = v1p; + u64x v2 = v2p; + u64x v3 = v3p; + + int i; + int j; + + for (i = 0, j = 0; i <= pw_len; i += 8, j += 2) + { + u64x m = hl32_to_64 (w[j + 1], w[j + 0]); + + v3 ^= m; + + SIPROUND (v0, v1, v2, v3); + SIPROUND (v0, v1, v2, v3); + + v0 ^= m; + } + + v2 ^= 0xff; + + SIPROUND (v0, v1, v2, v3); + SIPROUND (v0, v1, v2, v3); + SIPROUND (v0, v1, v2, v3); + SIPROUND (v0, v1, v2, v3); + + const u64x v = v0 ^ v1 ^ v2 ^ v3; + + const u32x a = l32_from_64 (v); + const u32x b = h32_from_64 (v); + + const u32x r0 = a; + const u32x r1 = b; + const u32x r2 = 0; + const u32x r3 = 0; + + #include VECT_COMPARE_M + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m10100_m08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m10100_m16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m10100_s04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, combs_buf[0].pw_len); + } + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * base + */ + + u64 v0p = SIPHASHM_0; + u64 v1p = SIPHASHM_1; + u64 v2p = SIPHASHM_2; + u64 v3p = SIPHASHM_3; + + v0p ^= hl32_to_64 (salt_bufs[salt_pos].salt_buf[1], salt_bufs[salt_pos].salt_buf[0]); + v1p ^= hl32_to_64 (salt_bufs[salt_pos].salt_buf[3], salt_bufs[salt_pos].salt_buf[2]); + v2p ^= hl32_to_64 (salt_bufs[salt_pos].salt_buf[1], salt_bufs[salt_pos].salt_buf[0]); + v3p ^= hl32_to_64 (salt_bufs[salt_pos].salt_buf[3], salt_bufs[salt_pos].salt_buf[2]); + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = combs_buf[il_pos].pw_len; + + const u32 pw_len = pw_l_len + pw_r_len; + + u32 wordr0[4]; + + wordr0[0] = combs_buf[il_pos].i[0]; + wordr0[1] = combs_buf[il_pos].i[1]; + wordr0[2] = combs_buf[il_pos].i[2]; + wordr0[3] = combs_buf[il_pos].i[3]; + + u32 wordr1[4]; + + wordr1[0] = combs_buf[il_pos].i[4]; + wordr1[1] = combs_buf[il_pos].i[5]; + wordr1[2] = combs_buf[il_pos].i[6]; + wordr1[3] = combs_buf[il_pos].i[7]; + + u32 wordr2[4]; + + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + + u32 wordr3[4]; + + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + u32x w[16]; + + w[ 0] = wordl0[0] | wordr0[0]; + w[ 1] = wordl0[1] | wordr0[1]; + w[ 2] = wordl0[2] | wordr0[2]; + w[ 3] = wordl0[3] | wordr0[3]; + w[ 4] = wordl1[0] | wordr1[0]; + w[ 5] = wordl1[1] | wordr1[1]; + w[ 6] = wordl1[2] | wordr1[2]; + w[ 7] = wordl1[3] | wordr1[3]; + w[ 8] = wordl2[0] | wordr2[0]; + w[ 9] = wordl2[1] | wordr2[1]; + w[10] = wordl2[2] | wordr2[2]; + w[11] = wordl2[3] | wordr2[3]; + w[12] = wordl3[0] | wordr3[0]; + w[13] = wordl3[1] | wordr3[1]; + w[14] = wordl3[2] | wordr3[2]; + w[15] = wordl3[3] | wordr3[3]; + + u64 *w_ptr = (u64 *) w; + + w_ptr[pw_len / 8] |= (u64) pw_len << 56; + + u64x v0 = v0p; + u64x v1 = v1p; + u64x v2 = v2p; + u64x v3 = v3p; + + int i; + int j; + + for (i = 0, j = 0; i <= pw_len; i += 8, j += 2) + { + u64x m = hl32_to_64 (w[j + 1], w[j + 0]); + + v3 ^= m; + + SIPROUND (v0, v1, v2, v3); + SIPROUND (v0, v1, v2, v3); + + v0 ^= m; + } + + v2 ^= 0xff; + + SIPROUND (v0, v1, v2, v3); + SIPROUND (v0, v1, v2, v3); + SIPROUND (v0, v1, v2, v3); + SIPROUND (v0, v1, v2, v3); + + const u64x v = v0 ^ v1 ^ v2 ^ v3; + + const u32x a = l32_from_64 (v); + const u32x b = h32_from_64 (v); + + const u32x r0 = a; + const u32x r1 = b; + const u32x r2 = 0; + const u32x r3 = 0; + + #include VECT_COMPARE_S + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m10100_s08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m10100_s16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/amd/m10100_a3.cl b/amd/m10100_a3.cl new file mode 100644 index 0000000000..acbcc39ab3 --- /dev/null +++ b/amd/m10100_a3.cl @@ -0,0 +1,502 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _SIPHASH_ +#define _SCALAR_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW4 +#define VECT_SIZE4 +#endif + +#ifdef VLIW5 +#define VECT_SIZE4 +#endif + +#define DGST_R0 0 +#define DGST_R1 1 +#define DGST_R2 2 +#define DGST_R3 3 + +#include "include/kernel_functions.c" +#include "types_amd.c" +#include "common_amd.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4_warp.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4_warp.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4_warp.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4_warp.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4_warp.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4_warp.c" +#endif + +#ifdef VECT_SIZE1 +#define SIPROUND(v0,v1,v2,v3) \ + (v0) += (v1); \ + (v1) = rotl64 ((v1), 13); \ + (v1) ^= (v0); \ + (v0) = as_ulong (as_uint2 ((v0)).s10); \ + (v2) += (v3); \ + (v3) = rotl64 ((v3), 16); \ + (v3) ^= (v2); \ + (v0) += (v3); \ + (v3) = rotl64 ((v3), 21); \ + (v3) ^= (v0); \ + (v2) += (v1); \ + (v1) = rotl64 ((v1), 17); \ + (v1) ^= (v2); \ + (v2) = as_ulong (as_uint2 ((v2)).s10); +#else +#define SIPROUND(v0,v1,v2,v3) \ + (v0) += (v1); \ + (v1) = rotl64 ((v1), 13); \ + (v1) ^= (v0); \ + (v0) = rotl64 ((v0), 32); \ + (v2) += (v3); \ + (v3) = rotl64 ((v3), 16); \ + (v3) ^= (v2); \ + (v0) += (v3); \ + (v3) = rotl64 ((v3), 21); \ + (v3) ^= (v0); \ + (v2) += (v1); \ + (v1) = rotl64 ((v1), 17); \ + (v1) ^= (v2); \ + (v2) = rotl64 ((v2), 32); +#endif + +static void m10100m (u32 w[16], const u32 pw_len, __global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global u32x * words_buf_r, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset) +{ + /** + * modifier + */ + + const u32 gid = get_global_id (0); + const u32 lid = get_local_id (0); + + /** + * base + */ + + u64 v0p = SIPHASHM_0; + u64 v1p = SIPHASHM_1; + u64 v2p = SIPHASHM_2; + u64 v3p = SIPHASHM_3; + + v0p ^= hl32_to_64 (salt_bufs[salt_pos].salt_buf[1], salt_bufs[salt_pos].salt_buf[0]); + v1p ^= hl32_to_64 (salt_bufs[salt_pos].salt_buf[3], salt_bufs[salt_pos].salt_buf[2]); + v2p ^= hl32_to_64 (salt_bufs[salt_pos].salt_buf[1], salt_bufs[salt_pos].salt_buf[0]); + v3p ^= hl32_to_64 (salt_bufs[salt_pos].salt_buf[3], salt_bufs[salt_pos].salt_buf[2]); + + u64 *w_ptr = (u64 *) w; + + w_ptr[pw_len / 8] |= (u64) pw_len << 56; + + /** + * loop + */ + + const u32 bf_loops = ceil ((float) bfs_cnt / VECT_DIV); + + u32x w0l = w[0]; + + for (u32 il_pos = 0; il_pos < bf_loops; il_pos++) + { + const u32x w0r = words_buf_r[il_pos]; + + const u32x w0 = w0l | w0r; + + u64x v0 = v0p; + u64x v1 = v1p; + u64x v2 = v2p; + u64x v3 = v3p; + + u64x m = hl32_to_64 (w[1], w0); + + v3 ^= m; + + SIPROUND (v0, v1, v2, v3); + SIPROUND (v0, v1, v2, v3); + + v0 ^= m; + + int i; + int j; + + for (i = 8, j = 2; i <= pw_len; i += 8, j += 2) + { + m = hl32_to_64 (w[j + 1], w[j + 0]); + + v3 ^= m; + + SIPROUND (v0, v1, v2, v3); + SIPROUND (v0, v1, v2, v3); + + v0 ^= m; + } + + v2 ^= 0xff; + + SIPROUND (v0, v1, v2, v3); + SIPROUND (v0, v1, v2, v3); + SIPROUND (v0, v1, v2, v3); + SIPROUND (v0, v1, v2, v3); + + const u64x v = v0 ^ v1 ^ v2 ^ v3; + + const u32x a = l32_from_64 (v); + const u32x b = h32_from_64 (v); + + const u32x r0 = a; + const u32x r1 = b; + const u32x r2 = 0; + const u32x r3 = 0; + + #include VECT_COMPARE_M + } +} + +static void m10100s (u32 w[16], const u32 pw_len, __global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global u32x * words_buf_r, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset) +{ + /** + * modifier + */ + + const u32 gid = get_global_id (0); + const u32 lid = get_local_id (0); + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * base + */ + + u64 v0p = SIPHASHM_0; + u64 v1p = SIPHASHM_1; + u64 v2p = SIPHASHM_2; + u64 v3p = SIPHASHM_3; + + v0p ^= hl32_to_64 (salt_bufs[salt_pos].salt_buf[1], salt_bufs[salt_pos].salt_buf[0]); + v1p ^= hl32_to_64 (salt_bufs[salt_pos].salt_buf[3], salt_bufs[salt_pos].salt_buf[2]); + v2p ^= hl32_to_64 (salt_bufs[salt_pos].salt_buf[1], salt_bufs[salt_pos].salt_buf[0]); + v3p ^= hl32_to_64 (salt_bufs[salt_pos].salt_buf[3], salt_bufs[salt_pos].salt_buf[2]); + + u64 *w_ptr = (u64 *) w; + + w_ptr[pw_len / 8] |= (u64) pw_len << 56; + + /** + * loop + */ + + const u32 bf_loops = ceil ((float) bfs_cnt / VECT_DIV); + + u32x w0l = w[0]; + + for (u32 il_pos = 0; il_pos < bf_loops; il_pos++) + { + const u32x w0r = words_buf_r[il_pos]; + + const u32x w0 = w0l | w0r; + + u64x v0 = v0p; + u64x v1 = v1p; + u64x v2 = v2p; + u64x v3 = v3p; + + u64x m = hl32_to_64 (w[1], w0); + + v3 ^= m; + + SIPROUND (v0, v1, v2, v3); + SIPROUND (v0, v1, v2, v3); + + v0 ^= m; + + int i; + int j; + + for (i = 8, j = 2; i <= pw_len; i += 8, j += 2) + { + m = hl32_to_64 (w[j + 1], w[j + 0]); + + v3 ^= m; + + SIPROUND (v0, v1, v2, v3); + SIPROUND (v0, v1, v2, v3); + + v0 ^= m; + } + + v2 ^= 0xff; + + SIPROUND (v0, v1, v2, v3); + SIPROUND (v0, v1, v2, v3); + SIPROUND (v0, v1, v2, v3); + SIPROUND (v0, v1, v2, v3); + + const u64x v = v0 ^ v1 ^ v2 ^ v3; + + const u32x a = l32_from_64 (v); + const u32x b = h32_from_64 (v); + + const u32x r0 = a; + const u32x r1 = b; + const u32x r2 = 0; + const u32x r3 = 0; + + #include VECT_COMPARE_S + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m10100_m04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global u32x * words_buf_r, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32 w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = 0; + w[ 5] = 0; + w[ 6] = 0; + w[ 7] = 0; + w[ 8] = 0; + w[ 9] = 0; + w[10] = 0; + w[11] = 0; + w[12] = 0; + w[13] = 0; + w[14] = pws[gid].i[14]; + w[15] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m10100m (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m10100_m08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global u32x * words_buf_r, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32 w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = pws[gid].i[ 4]; + w[ 5] = pws[gid].i[ 5]; + w[ 6] = pws[gid].i[ 6]; + w[ 7] = pws[gid].i[ 7]; + w[ 8] = 0; + w[ 9] = 0; + w[10] = 0; + w[11] = 0; + w[12] = 0; + w[13] = 0; + w[14] = pws[gid].i[14]; + w[15] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m10100m (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m10100_m16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global u32x * words_buf_r, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32 w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = pws[gid].i[ 4]; + w[ 5] = pws[gid].i[ 5]; + w[ 6] = pws[gid].i[ 6]; + w[ 7] = pws[gid].i[ 7]; + w[ 8] = pws[gid].i[ 8]; + w[ 9] = pws[gid].i[ 9]; + w[10] = pws[gid].i[10]; + w[11] = pws[gid].i[11]; + w[12] = pws[gid].i[12]; + w[13] = pws[gid].i[13]; + w[14] = pws[gid].i[14]; + w[15] = pws[gid].i[15]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m10100m (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m10100_s04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global u32x * words_buf_r, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32 w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = 0; + w[ 5] = 0; + w[ 6] = 0; + w[ 7] = 0; + w[ 8] = 0; + w[ 9] = 0; + w[10] = 0; + w[11] = 0; + w[12] = 0; + w[13] = 0; + w[14] = pws[gid].i[14]; + w[15] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m10100s (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m10100_s08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global u32x * words_buf_r, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32 w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = pws[gid].i[ 4]; + w[ 5] = pws[gid].i[ 5]; + w[ 6] = pws[gid].i[ 6]; + w[ 7] = pws[gid].i[ 7]; + w[ 8] = 0; + w[ 9] = 0; + w[10] = 0; + w[11] = 0; + w[12] = 0; + w[13] = 0; + w[14] = pws[gid].i[14]; + w[15] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m10100s (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m10100_s16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global u32x * words_buf_r, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32 w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = pws[gid].i[ 4]; + w[ 5] = pws[gid].i[ 5]; + w[ 6] = pws[gid].i[ 6]; + w[ 7] = pws[gid].i[ 7]; + w[ 8] = pws[gid].i[ 8]; + w[ 9] = pws[gid].i[ 9]; + w[10] = pws[gid].i[10]; + w[11] = pws[gid].i[11]; + w[12] = pws[gid].i[12]; + w[13] = pws[gid].i[13]; + w[14] = pws[gid].i[14]; + w[15] = pws[gid].i[15]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m10100s (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} diff --git a/amd/m10300.cl b/amd/m10300.cl new file mode 100644 index 0000000000..ee5c2abc71 --- /dev/null +++ b/amd/m10300.cl @@ -0,0 +1,429 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _SHA1_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW4 +#define VECT_SIZE4 +#endif + +#ifdef VLIW5 +#define VECT_SIZE4 +#endif + +#define DGST_R0 0 +#define DGST_R1 1 +#define DGST_R2 2 +#define DGST_R3 3 + +#include "include/kernel_functions.c" +#include "types_amd.c" +#include "common_amd.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +static void sha1_transform (const u32x w0[4], const u32x w1[4], const u32x w2[4], const u32x w3[4], u32x digest[5]) +{ + u32x A = digest[0]; + u32x B = digest[1]; + u32x C = digest[2]; + u32x D = digest[3]; + u32x E = digest[4]; + + u32x w0_t = w0[0]; + u32x w1_t = w0[1]; + u32x w2_t = w0[2]; + u32x w3_t = w0[3]; + u32x w4_t = w1[0]; + u32x w5_t = w1[1]; + u32x w6_t = w1[2]; + u32x w7_t = w1[3]; + u32x w8_t = w2[0]; + u32x w9_t = w2[1]; + u32x wa_t = w2[2]; + u32x wb_t = w2[3]; + u32x wc_t = w3[0]; + u32x wd_t = w3[1]; + u32x we_t = w3[2]; + u32x wf_t = w3[3]; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, A, B, C, D, E, w0_t); + SHA1_STEP (SHA1_F0o, E, A, B, C, D, w1_t); + SHA1_STEP (SHA1_F0o, D, E, A, B, C, w2_t); + SHA1_STEP (SHA1_F0o, C, D, E, A, B, w3_t); + SHA1_STEP (SHA1_F0o, B, C, D, E, A, w4_t); + SHA1_STEP (SHA1_F0o, A, B, C, D, E, w5_t); + SHA1_STEP (SHA1_F0o, E, A, B, C, D, w6_t); + SHA1_STEP (SHA1_F0o, D, E, A, B, C, w7_t); + SHA1_STEP (SHA1_F0o, C, D, E, A, B, w8_t); + SHA1_STEP (SHA1_F0o, B, C, D, E, A, w9_t); + SHA1_STEP (SHA1_F0o, A, B, C, D, E, wa_t); + SHA1_STEP (SHA1_F0o, E, A, B, C, D, wb_t); + SHA1_STEP (SHA1_F0o, D, E, A, B, C, wc_t); + SHA1_STEP (SHA1_F0o, C, D, E, A, B, wd_t); + SHA1_STEP (SHA1_F0o, B, C, D, E, A, we_t); + SHA1_STEP (SHA1_F0o, A, B, C, D, E, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F0o, E, A, B, C, D, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F0o, D, E, A, B, C, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F0o, C, D, E, A, B, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F0o, B, C, D, E, A, w3_t); + + #undef K + #define K SHA1C01 + + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w7_t); + + #undef K + #define K SHA1C02 + + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, wb_t); + + #undef K + #define K SHA1C03 + + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, wf_t); + + digest[0] += A; + digest[1] += B; + digest[2] += C; + digest[3] += D; + digest[4] += E; +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m10300_init (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global saph_sha1_tmp_t *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x word_buf0[4]; + + word_buf0[0] = pws[gid].i[0]; + word_buf0[1] = pws[gid].i[1]; + word_buf0[2] = pws[gid].i[2]; + word_buf0[3] = pws[gid].i[3]; + + u32x word_buf1[4]; + + word_buf1[0] = pws[gid].i[4]; + word_buf1[1] = pws[gid].i[5]; + word_buf1[2] = pws[gid].i[6]; + word_buf1[3] = pws[gid].i[7]; + + u32x word_buf2[2]; + + word_buf2[0] = pws[gid].i[8]; + word_buf2[1] = pws[gid].i[9]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * salt + */ + + u32 salt_len = salt_bufs[salt_pos].salt_len; + + u32 salt_buf[4]; + + salt_buf[0] = salt_bufs[salt_pos].salt_buf[0]; + salt_buf[1] = salt_bufs[salt_pos].salt_buf[1]; + salt_buf[2] = salt_bufs[salt_pos].salt_buf[2]; + salt_buf[3] = salt_bufs[salt_pos].salt_buf[3]; + + /** + * init + */ + + u32x w0[4]; + + w0[0] = salt_buf[0]; + w0[1] = salt_buf[1]; + w0[2] = salt_buf[2]; + w0[3] = salt_buf[3]; + + u32x w1[4]; + + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + switch_buffer_by_offset (w0, w1, w2, w3, pw_len); + + w0[0] |= word_buf0[0]; + w0[1] |= word_buf0[1]; + w0[2] |= word_buf0[2]; + w0[3] |= word_buf0[3]; + + w1[0] |= word_buf1[0]; + w1[1] |= word_buf1[1]; + w1[2] |= word_buf1[2]; + w1[3] |= word_buf1[3]; + + w2[0] |= word_buf2[0]; + w2[1] |= word_buf2[1]; + + const u32 pw_salt_len = pw_len + salt_len; + + append_0x80_4 (w0, w1, w2, w3, pw_salt_len); + + // swaps needed + + w0[0] = swap_workaround (w0[0]); + w0[1] = swap_workaround (w0[1]); + w0[2] = swap_workaround (w0[2]); + w0[3] = swap_workaround (w0[3]); + + w1[0] = swap_workaround (w1[0]); + w1[1] = swap_workaround (w1[1]); + w1[2] = swap_workaround (w1[2]); + w1[3] = swap_workaround (w1[3]); + + w2[0] = swap_workaround (w2[0]); + w2[1] = swap_workaround (w2[1]); + w2[2] = swap_workaround (w2[2]); + w2[3] = swap_workaround (w2[3]); + + w3[0] = swap_workaround (w3[0]); + w3[1] = swap_workaround (w3[1]); + w3[2] = swap_workaround (w3[2]); + w3[3] = pw_salt_len * 8; + + u32x digest[5]; + + digest[0] = SHA1M_A; + digest[1] = SHA1M_B; + digest[2] = SHA1M_C; + digest[3] = SHA1M_D; + digest[4] = SHA1M_E; + + sha1_transform (w0, w1, w2, w3, digest); + + tmps[gid].digest_buf[0] = digest[0]; + tmps[gid].digest_buf[1] = digest[1]; + tmps[gid].digest_buf[2] = digest[2]; + tmps[gid].digest_buf[3] = digest[3]; + tmps[gid].digest_buf[4] = digest[4]; +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m10300_loop (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global saph_sha1_tmp_t *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + u32x word_buf0[4]; + + word_buf0[0] = swap_workaround (pws[gid].i[0]); + word_buf0[1] = swap_workaround (pws[gid].i[1]); + word_buf0[2] = swap_workaround (pws[gid].i[2]); + word_buf0[3] = swap_workaround (pws[gid].i[3]); + + u32x word_buf1[4]; + + word_buf1[0] = swap_workaround (pws[gid].i[4]); + word_buf1[1] = swap_workaround (pws[gid].i[5]); + word_buf1[2] = swap_workaround (pws[gid].i[6]); + word_buf1[3] = swap_workaround (pws[gid].i[7]); + + u32x word_buf2[2]; + + word_buf2[0] = swap_workaround (pws[gid].i[8]); + word_buf2[1] = swap_workaround (pws[gid].i[9]); + + const u32 pw_len = pws[gid].pw_len; + + u32x digest[5]; + + digest[0] = tmps[gid].digest_buf[0]; + digest[1] = tmps[gid].digest_buf[1]; + digest[2] = tmps[gid].digest_buf[2]; + digest[3] = tmps[gid].digest_buf[3]; + digest[4] = tmps[gid].digest_buf[4]; + + /** + * loop + */ + + for (u32 i = 0; i < loop_cnt; i++) + { + u32x w0[4]; + u32x w1[4]; + u32x w2[4]; + u32x w3[4]; + + w0[0] = digest[0]; + w0[1] = digest[1]; + w0[2] = digest[2]; + w0[3] = digest[3]; + w1[0] = digest[4]; + w1[1] = 0x80000000; + w1[2] = 0; + w1[3] = 0; + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + switch_buffer_by_offset_be (w0, w1, w2, w3, pw_len); + + w0[0] |= word_buf0[0]; + w0[1] |= word_buf0[1]; + w0[2] |= word_buf0[2]; + w0[3] |= word_buf0[3]; + w1[0] |= word_buf1[0]; + w1[1] |= word_buf1[1]; + w1[2] |= word_buf1[2]; + w1[3] |= word_buf1[3]; + w2[0] |= word_buf2[0]; + w2[1] |= word_buf2[1]; + + // not needed + + w3[2] = 0; + w3[3] = (pw_len + 20) * 8; + + digest[0] = SHA1M_A; + digest[1] = SHA1M_B; + digest[2] = SHA1M_C; + digest[3] = SHA1M_D; + digest[4] = SHA1M_E; + + sha1_transform (w0, w1, w2, w3, digest); + } + + tmps[gid].digest_buf[0] = digest[0]; + tmps[gid].digest_buf[1] = digest[1]; + tmps[gid].digest_buf[2] = digest[2]; + tmps[gid].digest_buf[3] = digest[3]; + tmps[gid].digest_buf[4] = digest[4]; +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m10300_comp (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global saph_sha1_tmp_t *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + const u32 lid = get_local_id (0); + + /** + * digest + */ + + const u32x r0 = tmps[gid].digest_buf[0]; + const u32x r1 = tmps[gid].digest_buf[1]; + const u32x r2 = tmps[gid].digest_buf[2]; + const u32x r3 = tmps[gid].digest_buf[3]; + + #define il_pos 0 + + #include VECT_COMPARE_M +} diff --git a/amd/m10400_a0.cl b/amd/m10400_a0.cl new file mode 100644 index 0000000000..3906a00dca --- /dev/null +++ b/amd/m10400_a0.cl @@ -0,0 +1,680 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _MD5_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW4 +#define VECT_SIZE1 +#endif + +#ifdef VLIW5 +#define VECT_SIZE1 +#endif + +#define DGST_R0 0 +#define DGST_R1 1 +#define DGST_R2 2 +#define DGST_R3 3 + +#include "include/kernel_functions.c" +#include "types_amd.c" +#include "common_amd.c" +#include "include/rp_gpu.h" +#include "rp_amd.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +__constant u32 padding[8] = +{ + 0x5e4ebf28, + 0x418a754e, + 0x564e0064, + 0x0801faff, + 0xb6002e2e, + 0x803e68d0, + 0xfea90c2f, + 0x7a695364 +}; + +typedef struct +{ + u8 S[256]; + + u32 wtf_its_faster; + +} RC4_KEY; + +static void swap (__local RC4_KEY *rc4_key, const u8 i, const u8 j) +{ + u8 tmp; + + tmp = rc4_key->S[i]; + rc4_key->S[i] = rc4_key->S[j]; + rc4_key->S[j] = tmp; +} + +static void rc4_init_16 (__local RC4_KEY *rc4_key, const u32 data[4]) +{ + u32 v = 0x03020100; + u32 a = 0x04040404; + + __local u32 *ptr = (__local u32 *) rc4_key->S; + + #pragma unroll + for (u32 i = 0; i < 64; i++) + { + ptr[i] = v; v += a; + } + + const u32 d0 = data[0] >> 0; + const u32 d1 = data[0] >> 8; + const u32 d2 = data[0] >> 16; + const u32 d3 = data[0] >> 24; + const u32 d4 = data[1] >> 0; + + u32 j = 0; + + #pragma unroll + for (u32 i = 0; i < 255; i += 5) + { + j += rc4_key->S[i + 0] + d0; swap (rc4_key, i + 0, j); + j += rc4_key->S[i + 1] + d1; swap (rc4_key, i + 1, j); + j += rc4_key->S[i + 2] + d2; swap (rc4_key, i + 2, j); + j += rc4_key->S[i + 3] + d3; swap (rc4_key, i + 3, j); + j += rc4_key->S[i + 4] + d4; swap (rc4_key, i + 4, j); + } + + j += rc4_key->S[255] + d0; swap (rc4_key, 255, j); +} + +static u8 rc4_next_16 (__local RC4_KEY *rc4_key, u8 i, u8 j, __constant u32 in[4], u32 out[4]) +{ + #pragma unroll 4 + for (u32 k = 0; k < 4; k++) + { + u32 xor4 = 0; + + u8 idx; + + i += 1; + j += rc4_key->S[i]; + + swap (rc4_key, i, j); + + idx = rc4_key->S[i] + rc4_key->S[j]; + + xor4 |= rc4_key->S[idx] << 0; + + i += 1; + j += rc4_key->S[i]; + + swap (rc4_key, i, j); + + idx = rc4_key->S[i] + rc4_key->S[j]; + + xor4 |= rc4_key->S[idx] << 8; + + i += 1; + j += rc4_key->S[i]; + + swap (rc4_key, i, j); + + idx = rc4_key->S[i] + rc4_key->S[j]; + + xor4 |= rc4_key->S[idx] << 16; + + i += 1; + j += rc4_key->S[i]; + + swap (rc4_key, i, j); + + idx = rc4_key->S[i] + rc4_key->S[j]; + + xor4 |= rc4_key->S[idx] << 24; + + out[k] = in[k] ^ xor4; + } + + return j; +} + +static void md5_transform (const u32x w0[4], const u32x w1[4], const u32x w2[4], const u32x w3[4], u32x digest[4]) +{ + u32x a = digest[0]; + u32x b = digest[1]; + u32x c = digest[2]; + u32x d = digest[3]; + + u32x w0_t = w0[0]; + u32x w1_t = w0[1]; + u32x w2_t = w0[2]; + u32x w3_t = w0[3]; + u32x w4_t = w1[0]; + u32x w5_t = w1[1]; + u32x w6_t = w1[2]; + u32x w7_t = w1[3]; + u32x w8_t = w2[0]; + u32x w9_t = w2[1]; + u32x wa_t = w2[2]; + u32x wb_t = w2[3]; + u32x wc_t = w3[0]; + u32x wd_t = w3[1]; + u32x we_t = w3[2]; + u32x wf_t = w3[3]; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t, MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t, MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t, MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t, MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w4_t, MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w5_t, MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w6_t, MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w7_t, MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w8_t, MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w9_t, MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, wa_t, MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, wb_t, MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, wc_t, MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, wd_t, MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, we_t, MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, wf_t, MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w1_t, MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w6_t, MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, wb_t, MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t, MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w5_t, MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, wa_t, MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, wf_t, MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w4_t, MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w9_t, MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, we_t, MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t, MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w8_t, MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, wd_t, MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t, MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w7_t, MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, wc_t, MD5C1f, MD5S13); + + MD5_STEP (MD5_H , a, b, c, d, w5_t, MD5C20, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w8_t, MD5C21, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, wb_t, MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, we_t, MD5C23, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w1_t, MD5C24, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w4_t, MD5C25, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w7_t, MD5C26, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, wa_t, MD5C27, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, wd_t, MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w0_t, MD5C29, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w3_t, MD5C2a, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w6_t, MD5C2b, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w9_t, MD5C2c, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, wc_t, MD5C2d, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, wf_t, MD5C2e, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w2_t, MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t, MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w7_t, MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, we_t, MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w5_t, MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, wc_t, MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t, MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, wa_t, MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t, MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w8_t, MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, wf_t, MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w6_t, MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, wd_t, MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w4_t, MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, wb_t, MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t, MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w9_t, MD5C3f, MD5S33); + + digest[0] += a; + digest[1] += b; + digest[2] += c; + digest[3] += d; +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m10400_m04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global pdf_t *pdf_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + u32x pw_buf1[4]; + + pw_buf1[0] = pws[gid].i[ 4]; + pw_buf1[1] = pws[gid].i[ 5]; + pw_buf1[2] = pws[gid].i[ 6]; + pw_buf1[3] = pws[gid].i[ 7]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * key + */ + + __local RC4_KEY rc4_keys[64]; + + __local RC4_KEY *rc4_key = &rc4_keys[lid]; + + /** + * U_buf + */ + + u32 o_buf[8]; + + o_buf[0] = pdf_bufs[salt_pos].o_buf[0]; + o_buf[1] = pdf_bufs[salt_pos].o_buf[1]; + o_buf[2] = pdf_bufs[salt_pos].o_buf[2]; + o_buf[3] = pdf_bufs[salt_pos].o_buf[3]; + o_buf[4] = pdf_bufs[salt_pos].o_buf[4]; + o_buf[5] = pdf_bufs[salt_pos].o_buf[5]; + o_buf[6] = pdf_bufs[salt_pos].o_buf[6]; + o_buf[7] = pdf_bufs[salt_pos].o_buf[7]; + + u32 P = pdf_bufs[salt_pos].P; + + u32 id_buf[4]; + + id_buf[0] = pdf_bufs[salt_pos].id_buf[0]; + id_buf[1] = pdf_bufs[salt_pos].id_buf[1]; + id_buf[2] = pdf_bufs[salt_pos].id_buf[2]; + id_buf[3] = pdf_bufs[salt_pos].id_buf[3]; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + + w0[0] = pw_buf0[0]; + w0[1] = pw_buf0[1]; + w0[2] = pw_buf0[2]; + w0[3] = pw_buf0[3]; + + u32x w1[4]; + + w1[0] = pw_buf1[0]; + w1[1] = pw_buf1[1]; + w1[2] = pw_buf1[2]; + w1[3] = pw_buf1[3]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 out_len = apply_rules (rules_buf[il_pos].cmds, w0, w1, pw_len); + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + // max length supported by pdf11 is 32 + + w0_t[0] = padding[0]; + w0_t[1] = padding[1]; + w0_t[2] = padding[2]; + w0_t[3] = padding[3]; + w1_t[0] = padding[4]; + w1_t[1] = padding[5]; + w1_t[2] = padding[6]; + w1_t[3] = padding[7]; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = 0; + + switch_buffer_by_offset (w0_t, w1_t, w2_t, w3_t, pw_len); + + // add password + // truncate at 32 is wanted, not a bug! + // add o_buf + + w0_t[0] |= w0[0]; + w0_t[1] |= w0[1]; + w0_t[2] |= w0[2]; + w0_t[3] |= w0[3]; + w1_t[0] |= w1[0]; + w1_t[1] |= w1[1]; + w1_t[2] |= w1[2]; + w1_t[3] |= w1[3]; + w2_t[0] = o_buf[0]; + w2_t[1] = o_buf[1]; + w2_t[2] = o_buf[2]; + w2_t[3] = o_buf[3]; + w3_t[0] = o_buf[4]; + w3_t[1] = o_buf[5]; + w3_t[2] = o_buf[6]; + w3_t[3] = o_buf[7]; + + u32x digest[4]; + + digest[0] = MD5M_A; + digest[1] = MD5M_B; + digest[2] = MD5M_C; + digest[3] = MD5M_D; + + md5_transform (w0_t, w1_t, w2_t, w3_t, digest); + + w0_t[0] = P; + w0_t[1] = id_buf[0]; + w0_t[2] = id_buf[1]; + w0_t[3] = id_buf[2]; + w1_t[0] = id_buf[3]; + w1_t[1] = 0x80; + w1_t[2] = 0; + w1_t[3] = 0; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 84 * 8; + w3_t[3] = 0; + + md5_transform (w0_t, w1_t, w2_t, w3_t, digest); + + // now the RC4 part + + u32x key[4]; + + key[0] = digest[0]; + key[1] = digest[1] & 0xff; + key[2] = 0; + key[3] = 0; + + rc4_init_16 (rc4_key, key); + + u32x out[4]; + + rc4_next_16 (rc4_key, 0, 0, padding, out); + + const u32x r0 = out[0]; + const u32x r1 = out[1]; + const u32x r2 = out[2]; + const u32x r3 = out[3]; + + #include VECT_COMPARE_M + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m10400_m08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global pdf_t *pdf_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m10400_m16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global pdf_t *pdf_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m10400_s04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global pdf_t *pdf_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + u32x pw_buf1[4]; + + pw_buf1[0] = pws[gid].i[ 4]; + pw_buf1[1] = pws[gid].i[ 5]; + pw_buf1[2] = pws[gid].i[ 6]; + pw_buf1[3] = pws[gid].i[ 7]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * key + */ + + __local RC4_KEY rc4_keys[64]; + + __local RC4_KEY *rc4_key = &rc4_keys[lid]; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * U_buf + */ + + u32 o_buf[8]; + + o_buf[0] = pdf_bufs[salt_pos].o_buf[0]; + o_buf[1] = pdf_bufs[salt_pos].o_buf[1]; + o_buf[2] = pdf_bufs[salt_pos].o_buf[2]; + o_buf[3] = pdf_bufs[salt_pos].o_buf[3]; + o_buf[4] = pdf_bufs[salt_pos].o_buf[4]; + o_buf[5] = pdf_bufs[salt_pos].o_buf[5]; + o_buf[6] = pdf_bufs[salt_pos].o_buf[6]; + o_buf[7] = pdf_bufs[salt_pos].o_buf[7]; + + u32 P = pdf_bufs[salt_pos].P; + + u32 id_buf[4]; + + id_buf[0] = pdf_bufs[salt_pos].id_buf[0]; + id_buf[1] = pdf_bufs[salt_pos].id_buf[1]; + id_buf[2] = pdf_bufs[salt_pos].id_buf[2]; + id_buf[3] = pdf_bufs[salt_pos].id_buf[3]; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + + w0[0] = pw_buf0[0]; + w0[1] = pw_buf0[1]; + w0[2] = pw_buf0[2]; + w0[3] = pw_buf0[3]; + + u32x w1[4]; + + w1[0] = pw_buf1[0]; + w1[1] = pw_buf1[1]; + w1[2] = pw_buf1[2]; + w1[3] = pw_buf1[3]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 out_len = apply_rules (rules_buf[il_pos].cmds, w0, w1, pw_len); + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + // max length supported by pdf11 is 32 + + w0_t[0] = padding[0]; + w0_t[1] = padding[1]; + w0_t[2] = padding[2]; + w0_t[3] = padding[3]; + w1_t[0] = padding[4]; + w1_t[1] = padding[5]; + w1_t[2] = padding[6]; + w1_t[3] = padding[7]; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = 0; + + switch_buffer_by_offset (w0_t, w1_t, w2_t, w3_t, pw_len); + + // add password + // truncate at 32 is wanted, not a bug! + // add o_buf + + w0_t[0] |= w0[0]; + w0_t[1] |= w0[1]; + w0_t[2] |= w0[2]; + w0_t[3] |= w0[3]; + w1_t[0] |= w1[0]; + w1_t[1] |= w1[1]; + w1_t[2] |= w1[2]; + w1_t[3] |= w1[3]; + w2_t[0] = o_buf[0]; + w2_t[1] = o_buf[1]; + w2_t[2] = o_buf[2]; + w2_t[3] = o_buf[3]; + w3_t[0] = o_buf[4]; + w3_t[1] = o_buf[5]; + w3_t[2] = o_buf[6]; + w3_t[3] = o_buf[7]; + + u32x digest[4]; + + digest[0] = MD5M_A; + digest[1] = MD5M_B; + digest[2] = MD5M_C; + digest[3] = MD5M_D; + + md5_transform (w0_t, w1_t, w2_t, w3_t, digest); + + w0_t[0] = P; + w0_t[1] = id_buf[0]; + w0_t[2] = id_buf[1]; + w0_t[3] = id_buf[2]; + w1_t[0] = id_buf[3]; + w1_t[1] = 0x80; + w1_t[2] = 0; + w1_t[3] = 0; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 84 * 8; + w3_t[3] = 0; + + md5_transform (w0_t, w1_t, w2_t, w3_t, digest); + + // now the RC4 part + + u32x key[4]; + + key[0] = digest[0]; + key[1] = digest[1] & 0xff; + key[2] = 0; + key[3] = 0; + + rc4_init_16 (rc4_key, key); + + u32x out[4]; + + rc4_next_16 (rc4_key, 0, 0, padding, out); + + const u32x r0 = out[0]; + const u32x r1 = out[1]; + const u32x r2 = out[2]; + const u32x r3 = out[3]; + + #include VECT_COMPARE_S + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m10400_s08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global pdf_t *pdf_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m10400_s16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global pdf_t *pdf_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/amd/m10400_a1.cl b/amd/m10400_a1.cl new file mode 100644 index 0000000000..7347f4bc81 --- /dev/null +++ b/amd/m10400_a1.cl @@ -0,0 +1,786 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _MD5_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW4 +#define VECT_SIZE1 +#endif + +#ifdef VLIW5 +#define VECT_SIZE1 +#endif + +#define DGST_R0 0 +#define DGST_R1 1 +#define DGST_R2 2 +#define DGST_R3 3 + +#include "include/kernel_functions.c" +#include "types_amd.c" +#include "common_amd.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +__constant u32 padding[8] = +{ + 0x5e4ebf28, + 0x418a754e, + 0x564e0064, + 0x0801faff, + 0xb6002e2e, + 0x803e68d0, + 0xfea90c2f, + 0x7a695364 +}; + +typedef struct +{ + u8 S[256]; + + u32 wtf_its_faster; + +} RC4_KEY; + +static void swap (__local RC4_KEY *rc4_key, const u8 i, const u8 j) +{ + u8 tmp; + + tmp = rc4_key->S[i]; + rc4_key->S[i] = rc4_key->S[j]; + rc4_key->S[j] = tmp; +} + +static void rc4_init_16 (__local RC4_KEY *rc4_key, const u32 data[4]) +{ + u32 v = 0x03020100; + u32 a = 0x04040404; + + __local u32 *ptr = (__local u32 *) rc4_key->S; + + #pragma unroll + for (u32 i = 0; i < 64; i++) + { + ptr[i] = v; v += a; + } + + const u32 d0 = data[0] >> 0; + const u32 d1 = data[0] >> 8; + const u32 d2 = data[0] >> 16; + const u32 d3 = data[0] >> 24; + const u32 d4 = data[1] >> 0; + + u32 j = 0; + + #pragma unroll + for (u32 i = 0; i < 255; i += 5) + { + j += rc4_key->S[i + 0] + d0; swap (rc4_key, i + 0, j); + j += rc4_key->S[i + 1] + d1; swap (rc4_key, i + 1, j); + j += rc4_key->S[i + 2] + d2; swap (rc4_key, i + 2, j); + j += rc4_key->S[i + 3] + d3; swap (rc4_key, i + 3, j); + j += rc4_key->S[i + 4] + d4; swap (rc4_key, i + 4, j); + } + + j += rc4_key->S[255] + d0; swap (rc4_key, 255, j); +} + +static u8 rc4_next_16 (__local RC4_KEY *rc4_key, u8 i, u8 j, __constant u32 in[4], u32 out[4]) +{ + #pragma unroll 4 + for (u32 k = 0; k < 4; k++) + { + u32 xor4 = 0; + + u8 idx; + + i += 1; + j += rc4_key->S[i]; + + swap (rc4_key, i, j); + + idx = rc4_key->S[i] + rc4_key->S[j]; + + xor4 |= rc4_key->S[idx] << 0; + + i += 1; + j += rc4_key->S[i]; + + swap (rc4_key, i, j); + + idx = rc4_key->S[i] + rc4_key->S[j]; + + xor4 |= rc4_key->S[idx] << 8; + + i += 1; + j += rc4_key->S[i]; + + swap (rc4_key, i, j); + + idx = rc4_key->S[i] + rc4_key->S[j]; + + xor4 |= rc4_key->S[idx] << 16; + + i += 1; + j += rc4_key->S[i]; + + swap (rc4_key, i, j); + + idx = rc4_key->S[i] + rc4_key->S[j]; + + xor4 |= rc4_key->S[idx] << 24; + + out[k] = in[k] ^ xor4; + } + + return j; +} + +static void md5_transform (const u32x w0[4], const u32x w1[4], const u32x w2[4], const u32x w3[4], u32x digest[4]) +{ + u32x a = digest[0]; + u32x b = digest[1]; + u32x c = digest[2]; + u32x d = digest[3]; + + u32x w0_t = w0[0]; + u32x w1_t = w0[1]; + u32x w2_t = w0[2]; + u32x w3_t = w0[3]; + u32x w4_t = w1[0]; + u32x w5_t = w1[1]; + u32x w6_t = w1[2]; + u32x w7_t = w1[3]; + u32x w8_t = w2[0]; + u32x w9_t = w2[1]; + u32x wa_t = w2[2]; + u32x wb_t = w2[3]; + u32x wc_t = w3[0]; + u32x wd_t = w3[1]; + u32x we_t = w3[2]; + u32x wf_t = w3[3]; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t, MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t, MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t, MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t, MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w4_t, MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w5_t, MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w6_t, MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w7_t, MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w8_t, MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w9_t, MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, wa_t, MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, wb_t, MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, wc_t, MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, wd_t, MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, we_t, MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, wf_t, MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w1_t, MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w6_t, MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, wb_t, MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t, MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w5_t, MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, wa_t, MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, wf_t, MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w4_t, MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w9_t, MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, we_t, MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t, MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w8_t, MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, wd_t, MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t, MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w7_t, MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, wc_t, MD5C1f, MD5S13); + + MD5_STEP (MD5_H , a, b, c, d, w5_t, MD5C20, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w8_t, MD5C21, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, wb_t, MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, we_t, MD5C23, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w1_t, MD5C24, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w4_t, MD5C25, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w7_t, MD5C26, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, wa_t, MD5C27, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, wd_t, MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w0_t, MD5C29, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w3_t, MD5C2a, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w6_t, MD5C2b, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w9_t, MD5C2c, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, wc_t, MD5C2d, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, wf_t, MD5C2e, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w2_t, MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t, MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w7_t, MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, we_t, MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w5_t, MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, wc_t, MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t, MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, wa_t, MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t, MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w8_t, MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, wf_t, MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w6_t, MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, wd_t, MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w4_t, MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, wb_t, MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t, MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w9_t, MD5C3f, MD5S33); + + digest[0] += a; + digest[1] += b; + digest[2] += c; + digest[3] += d; +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m10400_m04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global pdf_t *pdf_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, combs_buf[0].pw_len); + } + + /** + * key + */ + + __local RC4_KEY rc4_keys[64]; + + __local RC4_KEY *rc4_key = &rc4_keys[lid]; + + /** + * U_buf + */ + + u32 o_buf[8]; + + o_buf[0] = pdf_bufs[salt_pos].o_buf[0]; + o_buf[1] = pdf_bufs[salt_pos].o_buf[1]; + o_buf[2] = pdf_bufs[salt_pos].o_buf[2]; + o_buf[3] = pdf_bufs[salt_pos].o_buf[3]; + o_buf[4] = pdf_bufs[salt_pos].o_buf[4]; + o_buf[5] = pdf_bufs[salt_pos].o_buf[5]; + o_buf[6] = pdf_bufs[salt_pos].o_buf[6]; + o_buf[7] = pdf_bufs[salt_pos].o_buf[7]; + + u32 P = pdf_bufs[salt_pos].P; + + u32 id_buf[4]; + + id_buf[0] = pdf_bufs[salt_pos].id_buf[0]; + id_buf[1] = pdf_bufs[salt_pos].id_buf[1]; + id_buf[2] = pdf_bufs[salt_pos].id_buf[2]; + id_buf[3] = pdf_bufs[salt_pos].id_buf[3]; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = combs_buf[il_pos].pw_len; + + const u32 pw_len = pw_l_len + pw_r_len; + + u32 wordr0[4]; + + wordr0[0] = combs_buf[il_pos].i[0]; + wordr0[1] = combs_buf[il_pos].i[1]; + wordr0[2] = combs_buf[il_pos].i[2]; + wordr0[3] = combs_buf[il_pos].i[3]; + + u32 wordr1[4]; + + wordr1[0] = combs_buf[il_pos].i[4]; + wordr1[1] = combs_buf[il_pos].i[5]; + wordr1[2] = combs_buf[il_pos].i[6]; + wordr1[3] = combs_buf[il_pos].i[7]; + + u32 wordr2[4]; + + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + + u32 wordr3[4]; + + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + u32x w0[4]; + + w0[0] = wordl0[0] | wordr0[0]; + w0[1] = wordl0[1] | wordr0[1]; + w0[2] = wordl0[2] | wordr0[2]; + w0[3] = wordl0[3] | wordr0[3]; + + u32x w1[4]; + + w1[0] = wordl1[0] | wordr1[0]; + w1[1] = wordl1[1] | wordr1[1]; + w1[2] = wordl1[2] | wordr1[2]; + w1[3] = wordl1[3] | wordr1[3]; + + u32x w2[4]; + + w2[0] = wordl2[0] | wordr2[0]; + w2[1] = wordl2[1] | wordr2[1]; + w2[2] = wordl2[2] | wordr2[2]; + w2[3] = wordl2[3] | wordr2[3]; + + u32x w3[4]; + + w3[0] = wordl3[0] | wordr3[0]; + w3[1] = wordl3[1] | wordr3[1]; + w3[2] = wordl3[2] | wordr3[2]; + w3[3] = wordl3[3] | wordr3[3]; + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + // max length supported by pdf11 is 32 + + w0_t[0] = padding[0]; + w0_t[1] = padding[1]; + w0_t[2] = padding[2]; + w0_t[3] = padding[3]; + w1_t[0] = padding[4]; + w1_t[1] = padding[5]; + w1_t[2] = padding[6]; + w1_t[3] = padding[7]; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = 0; + + switch_buffer_by_offset (w0_t, w1_t, w2_t, w3_t, pw_len); + + // add password + // truncate at 32 is wanted, not a bug! + // add o_buf + + w0_t[0] |= w0[0]; + w0_t[1] |= w0[1]; + w0_t[2] |= w0[2]; + w0_t[3] |= w0[3]; + w1_t[0] |= w1[0]; + w1_t[1] |= w1[1]; + w1_t[2] |= w1[2]; + w1_t[3] |= w1[3]; + w2_t[0] = o_buf[0]; + w2_t[1] = o_buf[1]; + w2_t[2] = o_buf[2]; + w2_t[3] = o_buf[3]; + w3_t[0] = o_buf[4]; + w3_t[1] = o_buf[5]; + w3_t[2] = o_buf[6]; + w3_t[3] = o_buf[7]; + + u32x digest[4]; + + digest[0] = MD5M_A; + digest[1] = MD5M_B; + digest[2] = MD5M_C; + digest[3] = MD5M_D; + + md5_transform (w0_t, w1_t, w2_t, w3_t, digest); + + w0_t[0] = P; + w0_t[1] = id_buf[0]; + w0_t[2] = id_buf[1]; + w0_t[3] = id_buf[2]; + w1_t[0] = id_buf[3]; + w1_t[1] = 0x80; + w1_t[2] = 0; + w1_t[3] = 0; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 84 * 8; + w3_t[3] = 0; + + md5_transform (w0_t, w1_t, w2_t, w3_t, digest); + + // now the RC4 part + + u32x key[4]; + + key[0] = digest[0]; + key[1] = digest[1] & 0xff; + key[2] = 0; + key[3] = 0; + + rc4_init_16 (rc4_key, key); + + u32x out[4]; + + rc4_next_16 (rc4_key, 0, 0, padding, out); + + const u32x r0 = out[0]; + const u32x r1 = out[1]; + const u32x r2 = out[2]; + const u32x r3 = out[3]; + + #include VECT_COMPARE_M + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m10400_m08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global pdf_t *pdf_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m10400_m16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global pdf_t *pdf_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m10400_s04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global pdf_t *pdf_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, combs_buf[0].pw_len); + } + + /** + * key + */ + + __local RC4_KEY rc4_keys[64]; + + __local RC4_KEY *rc4_key = &rc4_keys[lid]; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * U_buf + */ + + u32 o_buf[8]; + + o_buf[0] = pdf_bufs[salt_pos].o_buf[0]; + o_buf[1] = pdf_bufs[salt_pos].o_buf[1]; + o_buf[2] = pdf_bufs[salt_pos].o_buf[2]; + o_buf[3] = pdf_bufs[salt_pos].o_buf[3]; + o_buf[4] = pdf_bufs[salt_pos].o_buf[4]; + o_buf[5] = pdf_bufs[salt_pos].o_buf[5]; + o_buf[6] = pdf_bufs[salt_pos].o_buf[6]; + o_buf[7] = pdf_bufs[salt_pos].o_buf[7]; + + u32 P = pdf_bufs[salt_pos].P; + + u32 id_buf[4]; + + id_buf[0] = pdf_bufs[salt_pos].id_buf[0]; + id_buf[1] = pdf_bufs[salt_pos].id_buf[1]; + id_buf[2] = pdf_bufs[salt_pos].id_buf[2]; + id_buf[3] = pdf_bufs[salt_pos].id_buf[3]; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = combs_buf[il_pos].pw_len; + + const u32 pw_len = pw_l_len + pw_r_len; + + u32 wordr0[4]; + + wordr0[0] = combs_buf[il_pos].i[0]; + wordr0[1] = combs_buf[il_pos].i[1]; + wordr0[2] = combs_buf[il_pos].i[2]; + wordr0[3] = combs_buf[il_pos].i[3]; + + u32 wordr1[4]; + + wordr1[0] = combs_buf[il_pos].i[4]; + wordr1[1] = combs_buf[il_pos].i[5]; + wordr1[2] = combs_buf[il_pos].i[6]; + wordr1[3] = combs_buf[il_pos].i[7]; + + u32 wordr2[4]; + + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + + u32 wordr3[4]; + + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + u32x w0[4]; + + w0[0] = wordl0[0] | wordr0[0]; + w0[1] = wordl0[1] | wordr0[1]; + w0[2] = wordl0[2] | wordr0[2]; + w0[3] = wordl0[3] | wordr0[3]; + + u32x w1[4]; + + w1[0] = wordl1[0] | wordr1[0]; + w1[1] = wordl1[1] | wordr1[1]; + w1[2] = wordl1[2] | wordr1[2]; + w1[3] = wordl1[3] | wordr1[3]; + + u32x w2[4]; + + w2[0] = wordl2[0] | wordr2[0]; + w2[1] = wordl2[1] | wordr2[1]; + w2[2] = wordl2[2] | wordr2[2]; + w2[3] = wordl2[3] | wordr2[3]; + + u32x w3[4]; + + w3[0] = wordl3[0] | wordr3[0]; + w3[1] = wordl3[1] | wordr3[1]; + w3[2] = wordl3[2] | wordr3[2]; + w3[3] = wordl3[3] | wordr3[3]; + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + // max length supported by pdf11 is 32 + + w0_t[0] = padding[0]; + w0_t[1] = padding[1]; + w0_t[2] = padding[2]; + w0_t[3] = padding[3]; + w1_t[0] = padding[4]; + w1_t[1] = padding[5]; + w1_t[2] = padding[6]; + w1_t[3] = padding[7]; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = 0; + + switch_buffer_by_offset (w0_t, w1_t, w2_t, w3_t, pw_len); + + // add password + // truncate at 32 is wanted, not a bug! + // add o_buf + + w0_t[0] |= w0[0]; + w0_t[1] |= w0[1]; + w0_t[2] |= w0[2]; + w0_t[3] |= w0[3]; + w1_t[0] |= w1[0]; + w1_t[1] |= w1[1]; + w1_t[2] |= w1[2]; + w1_t[3] |= w1[3]; + w2_t[0] = o_buf[0]; + w2_t[1] = o_buf[1]; + w2_t[2] = o_buf[2]; + w2_t[3] = o_buf[3]; + w3_t[0] = o_buf[4]; + w3_t[1] = o_buf[5]; + w3_t[2] = o_buf[6]; + w3_t[3] = o_buf[7]; + + u32x digest[4]; + + digest[0] = MD5M_A; + digest[1] = MD5M_B; + digest[2] = MD5M_C; + digest[3] = MD5M_D; + + md5_transform (w0_t, w1_t, w2_t, w3_t, digest); + + w0_t[0] = P; + w0_t[1] = id_buf[0]; + w0_t[2] = id_buf[1]; + w0_t[3] = id_buf[2]; + w1_t[0] = id_buf[3]; + w1_t[1] = 0x80; + w1_t[2] = 0; + w1_t[3] = 0; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 84 * 8; + w3_t[3] = 0; + + md5_transform (w0_t, w1_t, w2_t, w3_t, digest); + + // now the RC4 part + + u32x key[4]; + + key[0] = digest[0]; + key[1] = digest[1] & 0xff; + key[2] = 0; + key[3] = 0; + + rc4_init_16 (rc4_key, key); + + u32x out[4]; + + rc4_next_16 (rc4_key, 0, 0, padding, out); + + const u32x r0 = out[0]; + const u32x r1 = out[1]; + const u32x r2 = out[2]; + const u32x r3 = out[3]; + + #include VECT_COMPARE_S + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m10400_s08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global pdf_t *pdf_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m10400_s16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global pdf_t *pdf_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/amd/m10400_a3.cl b/amd/m10400_a3.cl new file mode 100644 index 0000000000..dffc738cd7 --- /dev/null +++ b/amd/m10400_a3.cl @@ -0,0 +1,850 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _MD5_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW4 +#define VECT_SIZE1 +#endif + +#ifdef VLIW5 +#define VECT_SIZE1 +#endif + +#define DGST_R0 0 +#define DGST_R1 1 +#define DGST_R2 2 +#define DGST_R3 3 + +#include "include/kernel_functions.c" +#include "types_amd.c" +#include "common_amd.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +__constant u32 padding[8] = +{ + 0x5e4ebf28, + 0x418a754e, + 0x564e0064, + 0x0801faff, + 0xb6002e2e, + 0x803e68d0, + 0xfea90c2f, + 0x7a695364 +}; + +typedef struct +{ + u8 S[256]; + + u32 wtf_its_faster; + +} RC4_KEY; + +static void swap (__local RC4_KEY *rc4_key, const u8 i, const u8 j) +{ + u8 tmp; + + tmp = rc4_key->S[i]; + rc4_key->S[i] = rc4_key->S[j]; + rc4_key->S[j] = tmp; +} + +static void rc4_init_16 (__local RC4_KEY *rc4_key, const u32 data[4]) +{ + u32 v = 0x03020100; + u32 a = 0x04040404; + + __local u32 *ptr = (__local u32 *) rc4_key->S; + + #pragma unroll + for (u32 i = 0; i < 64; i++) + { + ptr[i] = v; v += a; + } + + const u32 d0 = data[0] >> 0; + const u32 d1 = data[0] >> 8; + const u32 d2 = data[0] >> 16; + const u32 d3 = data[0] >> 24; + const u32 d4 = data[1] >> 0; + + u32 j = 0; + + #pragma unroll + for (u32 i = 0; i < 255; i += 5) + { + j += rc4_key->S[i + 0] + d0; swap (rc4_key, i + 0, j); + j += rc4_key->S[i + 1] + d1; swap (rc4_key, i + 1, j); + j += rc4_key->S[i + 2] + d2; swap (rc4_key, i + 2, j); + j += rc4_key->S[i + 3] + d3; swap (rc4_key, i + 3, j); + j += rc4_key->S[i + 4] + d4; swap (rc4_key, i + 4, j); + } + + j += rc4_key->S[255] + d0; swap (rc4_key, 255, j); +} + +static u8 rc4_next_16 (__local RC4_KEY *rc4_key, u8 i, u8 j, __constant u32 in[4], u32 out[4]) +{ + #pragma unroll 4 + for (u32 k = 0; k < 4; k++) + { + u32 xor4 = 0; + + u8 idx; + + i += 1; + j += rc4_key->S[i]; + + swap (rc4_key, i, j); + + idx = rc4_key->S[i] + rc4_key->S[j]; + + xor4 |= rc4_key->S[idx] << 0; + + i += 1; + j += rc4_key->S[i]; + + swap (rc4_key, i, j); + + idx = rc4_key->S[i] + rc4_key->S[j]; + + xor4 |= rc4_key->S[idx] << 8; + + i += 1; + j += rc4_key->S[i]; + + swap (rc4_key, i, j); + + idx = rc4_key->S[i] + rc4_key->S[j]; + + xor4 |= rc4_key->S[idx] << 16; + + i += 1; + j += rc4_key->S[i]; + + swap (rc4_key, i, j); + + idx = rc4_key->S[i] + rc4_key->S[j]; + + xor4 |= rc4_key->S[idx] << 24; + + out[k] = in[k] ^ xor4; + } + + return j; +} + +static void md5_transform (const u32x w0[4], const u32x w1[4], const u32x w2[4], const u32x w3[4], u32x digest[4]) +{ + u32x a = digest[0]; + u32x b = digest[1]; + u32x c = digest[2]; + u32x d = digest[3]; + + u32x w0_t = w0[0]; + u32x w1_t = w0[1]; + u32x w2_t = w0[2]; + u32x w3_t = w0[3]; + u32x w4_t = w1[0]; + u32x w5_t = w1[1]; + u32x w6_t = w1[2]; + u32x w7_t = w1[3]; + u32x w8_t = w2[0]; + u32x w9_t = w2[1]; + u32x wa_t = w2[2]; + u32x wb_t = w2[3]; + u32x wc_t = w3[0]; + u32x wd_t = w3[1]; + u32x we_t = w3[2]; + u32x wf_t = w3[3]; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t, MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t, MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t, MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t, MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w4_t, MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w5_t, MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w6_t, MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w7_t, MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w8_t, MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w9_t, MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, wa_t, MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, wb_t, MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, wc_t, MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, wd_t, MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, we_t, MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, wf_t, MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w1_t, MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w6_t, MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, wb_t, MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t, MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w5_t, MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, wa_t, MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, wf_t, MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w4_t, MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w9_t, MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, we_t, MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t, MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w8_t, MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, wd_t, MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t, MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w7_t, MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, wc_t, MD5C1f, MD5S13); + + MD5_STEP (MD5_H , a, b, c, d, w5_t, MD5C20, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w8_t, MD5C21, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, wb_t, MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, we_t, MD5C23, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w1_t, MD5C24, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w4_t, MD5C25, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w7_t, MD5C26, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, wa_t, MD5C27, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, wd_t, MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w0_t, MD5C29, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w3_t, MD5C2a, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w6_t, MD5C2b, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w9_t, MD5C2c, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, wc_t, MD5C2d, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, wf_t, MD5C2e, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w2_t, MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t, MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w7_t, MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, we_t, MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w5_t, MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, wc_t, MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t, MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, wa_t, MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t, MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w8_t, MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, wf_t, MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w6_t, MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, wd_t, MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w4_t, MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, wb_t, MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t, MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w9_t, MD5C3f, MD5S33); + + digest[0] += a; + digest[1] += b; + digest[2] += c; + digest[3] += d; +} + +static void m10400m (__local RC4_KEY rc4_keys[64], u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], const u32 pw_len, __global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global pdf_t *pdf_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset) +{ + /** + * modifier + */ + + const u32 gid = get_global_id (0); + const u32 lid = get_local_id (0); + + __local RC4_KEY *rc4_key = &rc4_keys[lid]; + + /** + * U_buf + */ + + u32 o_buf[8]; + + o_buf[0] = pdf_bufs[salt_pos].o_buf[0]; + o_buf[1] = pdf_bufs[salt_pos].o_buf[1]; + o_buf[2] = pdf_bufs[salt_pos].o_buf[2]; + o_buf[3] = pdf_bufs[salt_pos].o_buf[3]; + o_buf[4] = pdf_bufs[salt_pos].o_buf[4]; + o_buf[5] = pdf_bufs[salt_pos].o_buf[5]; + o_buf[6] = pdf_bufs[salt_pos].o_buf[6]; + o_buf[7] = pdf_bufs[salt_pos].o_buf[7]; + + u32 P = pdf_bufs[salt_pos].P; + + u32 id_buf[4]; + + id_buf[0] = pdf_bufs[salt_pos].id_buf[0]; + id_buf[1] = pdf_bufs[salt_pos].id_buf[1]; + id_buf[2] = pdf_bufs[salt_pos].id_buf[2]; + id_buf[3] = pdf_bufs[salt_pos].id_buf[3]; + + /** + * loop + */ + + u32x w0l = w0[0]; + + for (u32 il_pos = 0; il_pos < bfs_cnt; il_pos++) + { + const u32 w0r = bfs_buf[il_pos].i; + + w0[0] = w0l | w0r; + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + // max length supported by pdf11 is 32 + + w0_t[0] = padding[0]; + w0_t[1] = padding[1]; + w0_t[2] = padding[2]; + w0_t[3] = padding[3]; + w1_t[0] = padding[4]; + w1_t[1] = padding[5]; + w1_t[2] = padding[6]; + w1_t[3] = padding[7]; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = 0; + + switch_buffer_by_offset (w0_t, w1_t, w2_t, w3_t, pw_len); + + // add password + // truncate at 32 is wanted, not a bug! + // add o_buf + + w0_t[0] |= w0[0]; + w0_t[1] |= w0[1]; + w0_t[2] |= w0[2]; + w0_t[3] |= w0[3]; + w1_t[0] |= w1[0]; + w1_t[1] |= w1[1]; + w1_t[2] |= w1[2]; + w1_t[3] |= w1[3]; + w2_t[0] = o_buf[0]; + w2_t[1] = o_buf[1]; + w2_t[2] = o_buf[2]; + w2_t[3] = o_buf[3]; + w3_t[0] = o_buf[4]; + w3_t[1] = o_buf[5]; + w3_t[2] = o_buf[6]; + w3_t[3] = o_buf[7]; + + u32x digest[4]; + + digest[0] = MD5M_A; + digest[1] = MD5M_B; + digest[2] = MD5M_C; + digest[3] = MD5M_D; + + md5_transform (w0_t, w1_t, w2_t, w3_t, digest); + + w0_t[0] = P; + w0_t[1] = id_buf[0]; + w0_t[2] = id_buf[1]; + w0_t[3] = id_buf[2]; + w1_t[0] = id_buf[3]; + w1_t[1] = 0x80; + w1_t[2] = 0; + w1_t[3] = 0; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 84 * 8; + w3_t[3] = 0; + + md5_transform (w0_t, w1_t, w2_t, w3_t, digest); + + // now the RC4 part + + u32x key[4]; + + key[0] = digest[0]; + key[1] = digest[1] & 0xff; + key[2] = 0; + key[3] = 0; + + rc4_init_16 (rc4_key, key); + + u32x out[4]; + + rc4_next_16 (rc4_key, 0, 0, padding, out); + + const u32x r0 = out[0]; + const u32x r1 = out[1]; + const u32x r2 = out[2]; + const u32x r3 = out[3]; + + #include VECT_COMPARE_M + } +} + +static void m10400s (__local RC4_KEY rc4_keys[64], u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], const u32 pw_len, __global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global pdf_t *pdf_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset) +{ + /** + * modifier + */ + + const u32 gid = get_global_id (0); + const u32 lid = get_local_id (0); + + __local RC4_KEY *rc4_key = &rc4_keys[lid]; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * U_buf + */ + + u32 o_buf[8]; + + o_buf[0] = pdf_bufs[salt_pos].o_buf[0]; + o_buf[1] = pdf_bufs[salt_pos].o_buf[1]; + o_buf[2] = pdf_bufs[salt_pos].o_buf[2]; + o_buf[3] = pdf_bufs[salt_pos].o_buf[3]; + o_buf[4] = pdf_bufs[salt_pos].o_buf[4]; + o_buf[5] = pdf_bufs[salt_pos].o_buf[5]; + o_buf[6] = pdf_bufs[salt_pos].o_buf[6]; + o_buf[7] = pdf_bufs[salt_pos].o_buf[7]; + + u32 P = pdf_bufs[salt_pos].P; + + u32 id_buf[4]; + + id_buf[0] = pdf_bufs[salt_pos].id_buf[0]; + id_buf[1] = pdf_bufs[salt_pos].id_buf[1]; + id_buf[2] = pdf_bufs[salt_pos].id_buf[2]; + id_buf[3] = pdf_bufs[salt_pos].id_buf[3]; + + /** + * loop + */ + + u32x w0l = w0[0]; + + for (u32 il_pos = 0; il_pos < bfs_cnt; il_pos++) + { + const u32 w0r = bfs_buf[il_pos].i; + + w0[0] = w0l | w0r; + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + // max length supported by pdf11 is 32 + + w0_t[0] = padding[0]; + w0_t[1] = padding[1]; + w0_t[2] = padding[2]; + w0_t[3] = padding[3]; + w1_t[0] = padding[4]; + w1_t[1] = padding[5]; + w1_t[2] = padding[6]; + w1_t[3] = padding[7]; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = 0; + + switch_buffer_by_offset (w0_t, w1_t, w2_t, w3_t, pw_len); + + // add password + // truncate at 32 is wanted, not a bug! + // add o_buf + + w0_t[0] |= w0[0]; + w0_t[1] |= w0[1]; + w0_t[2] |= w0[2]; + w0_t[3] |= w0[3]; + w1_t[0] |= w1[0]; + w1_t[1] |= w1[1]; + w1_t[2] |= w1[2]; + w1_t[3] |= w1[3]; + w2_t[0] = o_buf[0]; + w2_t[1] = o_buf[1]; + w2_t[2] = o_buf[2]; + w2_t[3] = o_buf[3]; + w3_t[0] = o_buf[4]; + w3_t[1] = o_buf[5]; + w3_t[2] = o_buf[6]; + w3_t[3] = o_buf[7]; + + u32x digest[4]; + + digest[0] = MD5M_A; + digest[1] = MD5M_B; + digest[2] = MD5M_C; + digest[3] = MD5M_D; + + md5_transform (w0_t, w1_t, w2_t, w3_t, digest); + + w0_t[0] = P; + w0_t[1] = id_buf[0]; + w0_t[2] = id_buf[1]; + w0_t[3] = id_buf[2]; + w1_t[0] = id_buf[3]; + w1_t[1] = 0x80; + w1_t[2] = 0; + w1_t[3] = 0; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 84 * 8; + w3_t[3] = 0; + + md5_transform (w0_t, w1_t, w2_t, w3_t, digest); + + // now the RC4 part + + u32x key[4]; + + key[0] = digest[0]; + key[1] = digest[1] & 0xff; + key[2] = 0; + key[3] = 0; + + rc4_init_16 (rc4_key, key); + + u32x out[4]; + + rc4_next_16 (rc4_key, 0, 0, padding, out); + + const u32x r0 = out[0]; + const u32x r1 = out[1]; + const u32x r2 = out[2]; + const u32x r3 = out[3]; + + #include VECT_COMPARE_S + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m10400_m04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global pdf_t *pdf_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + __local RC4_KEY rc4_keys[64]; + + m10400m (rc4_keys, w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, pdf_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m10400_m08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global pdf_t *pdf_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + __local RC4_KEY rc4_keys[64]; + + m10400m (rc4_keys, w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, pdf_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m10400_m16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global pdf_t *pdf_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = pws[gid].i[ 8]; + w2[1] = pws[gid].i[ 9]; + w2[2] = pws[gid].i[10]; + w2[3] = pws[gid].i[11]; + + u32x w3[4]; + + w3[0] = pws[gid].i[12]; + w3[1] = pws[gid].i[13]; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + __local RC4_KEY rc4_keys[64]; + + m10400m (rc4_keys, w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, pdf_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m10400_s04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global pdf_t *pdf_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + __local RC4_KEY rc4_keys[64]; + + m10400s (rc4_keys, w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, pdf_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m10400_s08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global pdf_t *pdf_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + __local RC4_KEY rc4_keys[64]; + + m10400s (rc4_keys, w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, pdf_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m10400_s16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global pdf_t *pdf_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = pws[gid].i[ 8]; + w2[1] = pws[gid].i[ 9]; + w2[2] = pws[gid].i[10]; + w2[3] = pws[gid].i[11]; + + u32x w3[4]; + + w3[0] = pws[gid].i[12]; + w3[1] = pws[gid].i[13]; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + __local RC4_KEY rc4_keys[64]; + + m10400s (rc4_keys, w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, pdf_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} diff --git a/amd/m10410_a0.cl b/amd/m10410_a0.cl new file mode 100644 index 0000000000..3fa938601b --- /dev/null +++ b/amd/m10410_a0.cl @@ -0,0 +1,381 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _MD5_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW4 +#define VECT_SIZE1 +#endif + +#ifdef VLIW5 +#define VECT_SIZE1 +#endif + +#define DGST_R0 0 +#define DGST_R1 1 +#define DGST_R2 2 +#define DGST_R3 3 + +#include "include/kernel_functions.c" +#include "types_amd.c" +#include "common_amd.c" +#include "include/rp_gpu.h" +#include "rp_amd.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +__constant u32 padding[8] = +{ + 0x5e4ebf28, + 0x418a754e, + 0x564e0064, + 0x0801faff, + 0xb6002e2e, + 0x803e68d0, + 0xfea90c2f, + 0x7a695364 +}; + +typedef struct +{ + u8 S[256]; + + u32 wtf_its_faster; + +} RC4_KEY; + +static void swap (__local RC4_KEY *rc4_key, const u8 i, const u8 j) +{ + u8 tmp; + + tmp = rc4_key->S[i]; + rc4_key->S[i] = rc4_key->S[j]; + rc4_key->S[j] = tmp; +} + +static void rc4_init_16 (__local RC4_KEY *rc4_key, const u32 data[4]) +{ + u32 v = 0x03020100; + u32 a = 0x04040404; + + __local u32 *ptr = (__local u32 *) rc4_key->S; + + #pragma unroll + for (u32 i = 0; i < 64; i++) + { + ptr[i] = v; v += a; + } + + const u32 d0 = data[0] >> 0; + const u32 d1 = data[0] >> 8; + const u32 d2 = data[0] >> 16; + const u32 d3 = data[0] >> 24; + const u32 d4 = data[1] >> 0; + + u32 j = 0; + + #pragma unroll + for (u32 i = 0; i < 255; i += 5) + { + j += rc4_key->S[i + 0] + d0; swap (rc4_key, i + 0, j); + j += rc4_key->S[i + 1] + d1; swap (rc4_key, i + 1, j); + j += rc4_key->S[i + 2] + d2; swap (rc4_key, i + 2, j); + j += rc4_key->S[i + 3] + d3; swap (rc4_key, i + 3, j); + j += rc4_key->S[i + 4] + d4; swap (rc4_key, i + 4, j); + } + + j += rc4_key->S[255] + d0; swap (rc4_key, 255, j); +} + +static u8 rc4_next_16 (__local RC4_KEY *rc4_key, u8 i, u8 j, __constant u32 in[4], u32 out[4]) +{ + for (u32 k = 0; k < 4; k++) + { + u32 xor4 = 0; + + u8 idx; + + i += 1; + j += rc4_key->S[i]; + + swap (rc4_key, i, j); + + idx = rc4_key->S[i] + rc4_key->S[j]; + + xor4 |= rc4_key->S[idx] << 0; + + i += 1; + j += rc4_key->S[i]; + + swap (rc4_key, i, j); + + idx = rc4_key->S[i] + rc4_key->S[j]; + + xor4 |= rc4_key->S[idx] << 8; + + i += 1; + j += rc4_key->S[i]; + + swap (rc4_key, i, j); + + idx = rc4_key->S[i] + rc4_key->S[j]; + + xor4 |= rc4_key->S[idx] << 16; + + i += 1; + j += rc4_key->S[i]; + + swap (rc4_key, i, j); + + idx = rc4_key->S[i] + rc4_key->S[j]; + + xor4 |= rc4_key->S[idx] << 24; + + out[k] = in[k] ^ xor4; + } + + return j; +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m10410_m04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global pdf_t *pdf_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + u32x pw_buf1[4]; + + pw_buf1[0] = pws[gid].i[ 4]; + pw_buf1[1] = pws[gid].i[ 5]; + pw_buf1[2] = pws[gid].i[ 6]; + pw_buf1[3] = pws[gid].i[ 7]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * key + */ + + __local RC4_KEY rc4_keys[64]; + __local RC4_KEY *rc4_key = &rc4_keys[lid]; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + + w0[0] = pw_buf0[0]; + w0[1] = pw_buf0[1]; + w0[2] = pw_buf0[2]; + w0[3] = pw_buf0[3]; + + u32x w1[4]; + + w1[0] = pw_buf1[0]; + w1[1] = pw_buf1[1]; + w1[2] = pw_buf1[2]; + w1[3] = pw_buf1[3]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 out_len = apply_rules (rules_buf[il_pos].cmds, w0, w1, pw_len); + + // now the RC4 part + + u32x key[4]; + + key[0] = w0[0]; + key[1] = w0[1]; + key[2] = 0; + key[3] = 0; + + rc4_init_16 (rc4_key, key); + + u32x out[4]; + + rc4_next_16 (rc4_key, 0, 0, padding, out); + + const u32x r0 = out[0]; + const u32x r1 = out[1]; + const u32x r2 = out[2]; + const u32x r3 = out[3]; + + #include VECT_COMPARE_M + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m10410_m08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global pdf_t *pdf_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m10410_m16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global pdf_t *pdf_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m10410_s04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global pdf_t *pdf_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + u32x pw_buf1[4]; + + pw_buf1[0] = pws[gid].i[ 4]; + pw_buf1[1] = pws[gid].i[ 5]; + pw_buf1[2] = pws[gid].i[ 6]; + pw_buf1[3] = pws[gid].i[ 7]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * key + */ + + __local RC4_KEY rc4_keys[64]; + __local RC4_KEY *rc4_key = &rc4_keys[lid]; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + + w0[0] = pw_buf0[0]; + w0[1] = pw_buf0[1]; + w0[2] = pw_buf0[2]; + w0[3] = pw_buf0[3]; + + u32x w1[4]; + + w1[0] = pw_buf1[0]; + w1[1] = pw_buf1[1]; + w1[2] = pw_buf1[2]; + w1[3] = pw_buf1[3]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 out_len = apply_rules (rules_buf[il_pos].cmds, w0, w1, pw_len); + + // now the RC4 part + + u32x key[4]; + + key[0] = w0[0]; + key[1] = w0[1]; + key[2] = 0; + key[3] = 0; + + rc4_init_16 (rc4_key, key); + + u32x out[4]; + + rc4_next_16 (rc4_key, 0, 0, padding, out); + + const u32x r0 = out[0]; + const u32x r1 = out[1]; + const u32x r2 = out[2]; + const u32x r3 = out[3]; + + #include VECT_COMPARE_S + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m10410_s08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global pdf_t *pdf_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m10410_s16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global pdf_t *pdf_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/amd/m10410_a1.cl b/amd/m10410_a1.cl new file mode 100644 index 0000000000..daf9d9a828 --- /dev/null +++ b/amd/m10410_a1.cl @@ -0,0 +1,433 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _MD5_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW4 +#define VECT_SIZE1 +#endif + +#ifdef VLIW5 +#define VECT_SIZE1 +#endif + +#define DGST_R0 0 +#define DGST_R1 1 +#define DGST_R2 2 +#define DGST_R3 3 + +#include "include/kernel_functions.c" +#include "types_amd.c" +#include "common_amd.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +__constant u32 padding[8] = +{ + 0x5e4ebf28, + 0x418a754e, + 0x564e0064, + 0x0801faff, + 0xb6002e2e, + 0x803e68d0, + 0xfea90c2f, + 0x7a695364 +}; + +typedef struct +{ + u8 S[256]; + + u32 wtf_its_faster; + +} RC4_KEY; + +static void swap (__local RC4_KEY *rc4_key, const u8 i, const u8 j) +{ + u8 tmp; + + tmp = rc4_key->S[i]; + rc4_key->S[i] = rc4_key->S[j]; + rc4_key->S[j] = tmp; +} + +static void rc4_init_16 (__local RC4_KEY *rc4_key, const u32 data[4]) +{ + u32 v = 0x03020100; + u32 a = 0x04040404; + + __local u32 *ptr = (__local u32 *) rc4_key->S; + + #pragma unroll + for (u32 i = 0; i < 64; i++) + { + ptr[i] = v; v += a; + } + + const u32 d0 = data[0] >> 0; + const u32 d1 = data[0] >> 8; + const u32 d2 = data[0] >> 16; + const u32 d3 = data[0] >> 24; + const u32 d4 = data[1] >> 0; + + u32 j = 0; + + #pragma unroll + for (u32 i = 0; i < 255; i += 5) + { + j += rc4_key->S[i + 0] + d0; swap (rc4_key, i + 0, j); + j += rc4_key->S[i + 1] + d1; swap (rc4_key, i + 1, j); + j += rc4_key->S[i + 2] + d2; swap (rc4_key, i + 2, j); + j += rc4_key->S[i + 3] + d3; swap (rc4_key, i + 3, j); + j += rc4_key->S[i + 4] + d4; swap (rc4_key, i + 4, j); + } + + j += rc4_key->S[255] + d0; swap (rc4_key, 255, j); +} + +static u8 rc4_next_16 (__local RC4_KEY *rc4_key, u8 i, u8 j, __constant u32 in[4], u32 out[4]) +{ + for (u32 k = 0; k < 4; k++) + { + u32 xor4 = 0; + + u8 idx; + + i += 1; + j += rc4_key->S[i]; + + swap (rc4_key, i, j); + + idx = rc4_key->S[i] + rc4_key->S[j]; + + xor4 |= rc4_key->S[idx] << 0; + + i += 1; + j += rc4_key->S[i]; + + swap (rc4_key, i, j); + + idx = rc4_key->S[i] + rc4_key->S[j]; + + xor4 |= rc4_key->S[idx] << 8; + + i += 1; + j += rc4_key->S[i]; + + swap (rc4_key, i, j); + + idx = rc4_key->S[i] + rc4_key->S[j]; + + xor4 |= rc4_key->S[idx] << 16; + + i += 1; + j += rc4_key->S[i]; + + swap (rc4_key, i, j); + + idx = rc4_key->S[i] + rc4_key->S[j]; + + xor4 |= rc4_key->S[idx] << 24; + + out[k] = in[k] ^ xor4; + } + + return j; +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m10410_m04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global pdf_t *pdf_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, combs_buf[0].pw_len); + } + + /** + * key + */ + + __local RC4_KEY rc4_keys[64]; + __local RC4_KEY *rc4_key = &rc4_keys[lid]; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + u32 wordr0[4]; + + wordr0[0] = combs_buf[il_pos].i[0]; + wordr0[1] = combs_buf[il_pos].i[1]; + wordr0[2] = combs_buf[il_pos].i[2]; + wordr0[3] = combs_buf[il_pos].i[3]; + + u32 wordr1[4]; + + wordr1[0] = combs_buf[il_pos].i[4]; + wordr1[1] = combs_buf[il_pos].i[5]; + wordr1[2] = combs_buf[il_pos].i[6]; + wordr1[3] = combs_buf[il_pos].i[7]; + + u32 wordr2[4]; + + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + + u32 wordr3[4]; + + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + u32x w0[2]; + + w0[0] = wordl0[0] | wordr0[0]; + w0[1] = wordl0[1] | wordr0[1]; + + // now the RC4 part + + u32x key[4]; + + key[0] = w0[0]; + key[1] = w0[1]; + key[2] = 0; + key[3] = 0; + + rc4_init_16 (rc4_key, key); + + u32x out[4]; + + rc4_next_16 (rc4_key, 0, 0, padding, out); + + const u32x r0 = out[0]; + const u32x r1 = out[1]; + const u32x r2 = out[2]; + const u32x r3 = out[3]; + + #include VECT_COMPARE_M + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m10410_m08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global pdf_t *pdf_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m10410_m16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global pdf_t *pdf_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m10410_s04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global pdf_t *pdf_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, combs_buf[0].pw_len); + } + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * key + */ + + __local RC4_KEY rc4_keys[64]; + __local RC4_KEY *rc4_key = &rc4_keys[lid]; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + u32 wordr0[4]; + + wordr0[0] = combs_buf[il_pos].i[0]; + wordr0[1] = combs_buf[il_pos].i[1]; + wordr0[2] = combs_buf[il_pos].i[2]; + wordr0[3] = combs_buf[il_pos].i[3]; + + u32 wordr1[4]; + + wordr1[0] = combs_buf[il_pos].i[4]; + wordr1[1] = combs_buf[il_pos].i[5]; + wordr1[2] = combs_buf[il_pos].i[6]; + wordr1[3] = combs_buf[il_pos].i[7]; + + u32 wordr2[4]; + + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + + u32 wordr3[4]; + + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + u32x w0[2]; + + w0[0] = wordl0[0] | wordr0[0]; + w0[1] = wordl0[1] | wordr0[1]; + + // now the RC4 part + + u32x key[4]; + + key[0] = w0[0]; + key[1] = w0[1]; + key[2] = 0; + key[3] = 0; + + rc4_init_16 (rc4_key, key); + + u32x out[4]; + + rc4_next_16 (rc4_key, 0, 0, padding, out); + + const u32x r0 = out[0]; + const u32x r1 = out[1]; + const u32x r2 = out[2]; + const u32x r3 = out[3]; + + #include VECT_COMPARE_S + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m10410_s08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global pdf_t *pdf_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m10410_s16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global pdf_t *pdf_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/amd/m10410_a3.cl b/amd/m10410_a3.cl new file mode 100644 index 0000000000..a1346cd9b8 --- /dev/null +++ b/amd/m10410_a3.cl @@ -0,0 +1,553 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _MD5_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW4 +#define VECT_SIZE1 +#endif + +#ifdef VLIW5 +#define VECT_SIZE1 +#endif + +#define DGST_R0 0 +#define DGST_R1 1 +#define DGST_R2 2 +#define DGST_R3 3 + +#include "include/kernel_functions.c" +#include "types_amd.c" +#include "common_amd.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +__constant u32 padding[8] = +{ + 0x5e4ebf28, + 0x418a754e, + 0x564e0064, + 0x0801faff, + 0xb6002e2e, + 0x803e68d0, + 0xfea90c2f, + 0x7a695364 +}; + +typedef struct +{ + u8 S[256]; + + u32 wtf_its_faster; + +} RC4_KEY; + +static void swap (__local RC4_KEY *rc4_key, const u8 i, const u8 j) +{ + u8 tmp; + + tmp = rc4_key->S[i]; + rc4_key->S[i] = rc4_key->S[j]; + rc4_key->S[j] = tmp; +} + +static void rc4_init_16 (__local RC4_KEY *rc4_key, const u32 data[4]) +{ + u32 v = 0x03020100; + u32 a = 0x04040404; + + __local u32 *ptr = (__local u32 *) rc4_key->S; + + #pragma unroll + for (u32 i = 0; i < 64; i++) + { + ptr[i] = v; v += a; + } + + const u32 d0 = data[0] >> 0; + const u32 d1 = data[0] >> 8; + const u32 d2 = data[0] >> 16; + const u32 d3 = data[0] >> 24; + const u32 d4 = data[1] >> 0; + + u32 j = 0; + + #pragma unroll + for (u32 i = 0; i < 255; i += 5) + { + j += rc4_key->S[i + 0] + d0; swap (rc4_key, i + 0, j); + j += rc4_key->S[i + 1] + d1; swap (rc4_key, i + 1, j); + j += rc4_key->S[i + 2] + d2; swap (rc4_key, i + 2, j); + j += rc4_key->S[i + 3] + d3; swap (rc4_key, i + 3, j); + j += rc4_key->S[i + 4] + d4; swap (rc4_key, i + 4, j); + } + + j += rc4_key->S[255] + d0; swap (rc4_key, 255, j); +} + +static u8 rc4_next_16 (__local RC4_KEY *rc4_key, u8 i, u8 j, __constant u32 in[4], u32 out[4]) +{ + for (u32 k = 0; k < 4; k++) + { + u32 xor4 = 0; + + u8 idx; + + i += 1; + j += rc4_key->S[i]; + + swap (rc4_key, i, j); + + idx = rc4_key->S[i] + rc4_key->S[j]; + + xor4 |= rc4_key->S[idx] << 0; + + i += 1; + j += rc4_key->S[i]; + + swap (rc4_key, i, j); + + idx = rc4_key->S[i] + rc4_key->S[j]; + + xor4 |= rc4_key->S[idx] << 8; + + i += 1; + j += rc4_key->S[i]; + + swap (rc4_key, i, j); + + idx = rc4_key->S[i] + rc4_key->S[j]; + + xor4 |= rc4_key->S[idx] << 16; + + i += 1; + j += rc4_key->S[i]; + + swap (rc4_key, i, j); + + idx = rc4_key->S[i] + rc4_key->S[j]; + + xor4 |= rc4_key->S[idx] << 24; + + out[k] = in[k] ^ xor4; + } + + return j; +} + +static void m10410m (__local RC4_KEY rc4_keys[64], u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], const u32 pw_len, __global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global pdf_t *pdf_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset) +{ + /** + * modifier + */ + + const u32 gid = get_global_id (0); + const u32 lid = get_local_id (0); + + __local RC4_KEY *rc4_key = &rc4_keys[lid]; + + /** + * loop + */ + + u32x w0l = w0[0]; + + for (u32 il_pos = 0; il_pos < bfs_cnt; il_pos++) + { + const u32 w0r = bfs_buf[il_pos].i; + + w0[0] = w0l | w0r; + + // now the RC4 part + + u32x key[4]; + + key[0] = w0[0]; + key[1] = w0[1]; + key[2] = 0; + key[3] = 0; + + rc4_init_16 (rc4_key, key); + + u32x out[4]; + + rc4_next_16 (rc4_key, 0, 0, padding, out); + + const u32x r0 = out[0]; + const u32x r1 = out[1]; + const u32x r2 = out[2]; + const u32x r3 = out[3]; + + #include VECT_COMPARE_M + } +} + +static void m10410s (__local RC4_KEY rc4_keys[64], u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], const u32 pw_len, __global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global pdf_t *pdf_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset) +{ + /** + * modifier + */ + + const u32 gid = get_global_id (0); + const u32 lid = get_local_id (0); + + __local RC4_KEY *rc4_key = &rc4_keys[lid]; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * loop + */ + + u32x w0l = w0[0]; + + for (u32 il_pos = 0; il_pos < bfs_cnt; il_pos++) + { + const u32 w0r = bfs_buf[il_pos].i; + + w0[0] = w0l | w0r; + + // now the RC4 part + + u32x key[4]; + + key[0] = w0[0]; + key[1] = w0[1]; + key[2] = 0; + key[3] = 0; + + rc4_init_16 (rc4_key, key); + + u32x out[4]; + + rc4_next_16 (rc4_key, 0, 0, padding, out); + + const u32x r0 = out[0]; + const u32x r1 = out[1]; + const u32x r2 = out[2]; + const u32x r3 = out[3]; + + #include VECT_COMPARE_S + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m10410_m04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global pdf_t *pdf_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + __local RC4_KEY rc4_keys[64]; + + m10410m (rc4_keys, w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, pdf_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m10410_m08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global pdf_t *pdf_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + __local RC4_KEY rc4_keys[64]; + + m10410m (rc4_keys, w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, pdf_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m10410_m16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global pdf_t *pdf_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = pws[gid].i[ 8]; + w2[1] = pws[gid].i[ 9]; + w2[2] = pws[gid].i[10]; + w2[3] = pws[gid].i[11]; + + u32x w3[4]; + + w3[0] = pws[gid].i[12]; + w3[1] = pws[gid].i[13]; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + __local RC4_KEY rc4_keys[64]; + + m10410m (rc4_keys, w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, pdf_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m10410_s04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global pdf_t *pdf_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + __local RC4_KEY rc4_keys[64]; + + m10410s (rc4_keys, w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, pdf_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m10410_s08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global pdf_t *pdf_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + __local RC4_KEY rc4_keys[64]; + + m10410s (rc4_keys, w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, pdf_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m10410_s16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global pdf_t *pdf_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = pws[gid].i[ 8]; + w2[1] = pws[gid].i[ 9]; + w2[2] = pws[gid].i[10]; + w2[3] = pws[gid].i[11]; + + u32x w3[4]; + + w3[0] = pws[gid].i[12]; + w3[1] = pws[gid].i[13]; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + __local RC4_KEY rc4_keys[64]; + + m10410s (rc4_keys, w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, pdf_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} diff --git a/amd/m10420_a0.cl b/amd/m10420_a0.cl new file mode 100644 index 0000000000..cd10d8f06d --- /dev/null +++ b/amd/m10420_a0.cl @@ -0,0 +1,543 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _MD5_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW4 +#define VECT_SIZE2 +#endif + +#ifdef VLIW5 +#define VECT_SIZE2 +#endif + +#define DGST_R0 0 +#define DGST_R1 1 +#define DGST_R2 2 +#define DGST_R3 3 + +#include "include/kernel_functions.c" +#include "types_amd.c" +#include "common_amd.c" +#include "include/rp_gpu.h" +#include "rp_amd.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +__constant u32 padding[8] = +{ + 0x5e4ebf28, + 0x418a754e, + 0x564e0064, + 0x0801faff, + 0xb6002e2e, + 0x803e68d0, + 0xfea90c2f, + 0x7a695364 +}; + +static void md5_transform (const u32x w0[4], const u32x w1[4], const u32x w2[4], const u32x w3[4], u32x digest[4]) +{ + u32x a = digest[0]; + u32x b = digest[1]; + u32x c = digest[2]; + u32x d = digest[3]; + + u32x w0_t = w0[0]; + u32x w1_t = w0[1]; + u32x w2_t = w0[2]; + u32x w3_t = w0[3]; + u32x w4_t = w1[0]; + u32x w5_t = w1[1]; + u32x w6_t = w1[2]; + u32x w7_t = w1[3]; + u32x w8_t = w2[0]; + u32x w9_t = w2[1]; + u32x wa_t = w2[2]; + u32x wb_t = w2[3]; + u32x wc_t = w3[0]; + u32x wd_t = w3[1]; + u32x we_t = w3[2]; + u32x wf_t = w3[3]; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t, MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t, MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t, MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t, MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w4_t, MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w5_t, MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w6_t, MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w7_t, MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w8_t, MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w9_t, MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, wa_t, MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, wb_t, MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, wc_t, MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, wd_t, MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, we_t, MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, wf_t, MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w1_t, MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w6_t, MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, wb_t, MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t, MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w5_t, MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, wa_t, MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, wf_t, MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w4_t, MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w9_t, MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, we_t, MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t, MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w8_t, MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, wd_t, MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t, MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w7_t, MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, wc_t, MD5C1f, MD5S13); + + MD5_STEP (MD5_H , a, b, c, d, w5_t, MD5C20, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w8_t, MD5C21, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, wb_t, MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, we_t, MD5C23, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w1_t, MD5C24, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w4_t, MD5C25, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w7_t, MD5C26, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, wa_t, MD5C27, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, wd_t, MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w0_t, MD5C29, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w3_t, MD5C2a, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w6_t, MD5C2b, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w9_t, MD5C2c, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, wc_t, MD5C2d, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, wf_t, MD5C2e, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w2_t, MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t, MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w7_t, MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, we_t, MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w5_t, MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, wc_t, MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t, MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, wa_t, MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t, MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w8_t, MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, wf_t, MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w6_t, MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, wd_t, MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w4_t, MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, wb_t, MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t, MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w9_t, MD5C3f, MD5S33); + + digest[0] += a; + digest[1] += b; + digest[2] += c; + digest[3] += d; +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m10420_m04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global pdf_t *pdf_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + u32x pw_buf1[4]; + + pw_buf1[0] = pws[gid].i[ 4]; + pw_buf1[1] = pws[gid].i[ 5]; + pw_buf1[2] = pws[gid].i[ 6]; + pw_buf1[3] = pws[gid].i[ 7]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * U_buf + */ + + u32 o_buf[8]; + + o_buf[0] = pdf_bufs[salt_pos].o_buf[0]; + o_buf[1] = pdf_bufs[salt_pos].o_buf[1]; + o_buf[2] = pdf_bufs[salt_pos].o_buf[2]; + o_buf[3] = pdf_bufs[salt_pos].o_buf[3]; + o_buf[4] = pdf_bufs[salt_pos].o_buf[4]; + o_buf[5] = pdf_bufs[salt_pos].o_buf[5]; + o_buf[6] = pdf_bufs[salt_pos].o_buf[6]; + o_buf[7] = pdf_bufs[salt_pos].o_buf[7]; + + u32 P = pdf_bufs[salt_pos].P; + + u32 id_buf[4]; + + id_buf[0] = pdf_bufs[salt_pos].id_buf[0]; + id_buf[1] = pdf_bufs[salt_pos].id_buf[1]; + id_buf[2] = pdf_bufs[salt_pos].id_buf[2]; + id_buf[3] = pdf_bufs[salt_pos].id_buf[3]; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + + w0[0] = pw_buf0[0]; + w0[1] = pw_buf0[1]; + w0[2] = pw_buf0[2]; + w0[3] = pw_buf0[3]; + + u32x w1[4]; + + w1[0] = pw_buf1[0]; + w1[1] = pw_buf1[1]; + w1[2] = pw_buf1[2]; + w1[3] = pw_buf1[3]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 out_len = apply_rules (rules_buf[il_pos].cmds, w0, w1, pw_len); + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + // max length supported by pdf11 is 32 + + w0_t[0] = padding[0]; + w0_t[1] = padding[1]; + w0_t[2] = padding[2]; + w0_t[3] = padding[3]; + w1_t[0] = padding[4]; + w1_t[1] = padding[5]; + w1_t[2] = padding[6]; + w1_t[3] = padding[7]; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = 0; + + switch_buffer_by_offset (w0_t, w1_t, w2_t, w3_t, pw_len); + + // add password + // truncate at 32 is wanted, not a bug! + // add o_buf + + w0_t[0] |= w0[0]; + w0_t[1] |= w0[1]; + w0_t[2] |= w0[2]; + w0_t[3] |= w0[3]; + w1_t[0] |= w1[0]; + w1_t[1] |= w1[1]; + w1_t[2] |= w1[2]; + w1_t[3] |= w1[3]; + w2_t[0] = o_buf[0]; + w2_t[1] = o_buf[1]; + w2_t[2] = o_buf[2]; + w2_t[3] = o_buf[3]; + w3_t[0] = o_buf[4]; + w3_t[1] = o_buf[5]; + w3_t[2] = o_buf[6]; + w3_t[3] = o_buf[7]; + + u32x digest[4]; + + digest[0] = MD5M_A; + digest[1] = MD5M_B; + digest[2] = MD5M_C; + digest[3] = MD5M_D; + + md5_transform (w0_t, w1_t, w2_t, w3_t, digest); + + w0_t[0] = P; + w0_t[1] = id_buf[0]; + w0_t[2] = id_buf[1]; + w0_t[3] = id_buf[2]; + w1_t[0] = id_buf[3]; + w1_t[1] = 0x80; + w1_t[2] = 0; + w1_t[3] = 0; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 84 * 8; + w3_t[3] = 0; + + md5_transform (w0_t, w1_t, w2_t, w3_t, digest); + + u32x a = digest[0]; + u32x b = digest[1] & 0xff; + + const u32x r0 = a; + const u32x r1 = b; + const u32x r2 = 0; + const u32x r3 = 0; + + #include VECT_COMPARE_M + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m10420_m08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global pdf_t *pdf_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules__cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m10420_m16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global pdf_t *pdf_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m10420_s04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global pdf_t *pdf_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + u32x pw_buf1[4]; + + pw_buf1[0] = pws[gid].i[ 4]; + pw_buf1[1] = pws[gid].i[ 5]; + pw_buf1[2] = pws[gid].i[ 6]; + pw_buf1[3] = pws[gid].i[ 7]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * U_buf + */ + + u32 o_buf[8]; + + o_buf[0] = pdf_bufs[salt_pos].o_buf[0]; + o_buf[1] = pdf_bufs[salt_pos].o_buf[1]; + o_buf[2] = pdf_bufs[salt_pos].o_buf[2]; + o_buf[3] = pdf_bufs[salt_pos].o_buf[3]; + o_buf[4] = pdf_bufs[salt_pos].o_buf[4]; + o_buf[5] = pdf_bufs[salt_pos].o_buf[5]; + o_buf[6] = pdf_bufs[salt_pos].o_buf[6]; + o_buf[7] = pdf_bufs[salt_pos].o_buf[7]; + + u32 P = pdf_bufs[salt_pos].P; + + u32 id_buf[4]; + + id_buf[0] = pdf_bufs[salt_pos].id_buf[0]; + id_buf[1] = pdf_bufs[salt_pos].id_buf[1]; + id_buf[2] = pdf_bufs[salt_pos].id_buf[2]; + id_buf[3] = pdf_bufs[salt_pos].id_buf[3]; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + + w0[0] = pw_buf0[0]; + w0[1] = pw_buf0[1]; + w0[2] = pw_buf0[2]; + w0[3] = pw_buf0[3]; + + u32x w1[4]; + + w1[0] = pw_buf1[0]; + w1[1] = pw_buf1[1]; + w1[2] = pw_buf1[2]; + w1[3] = pw_buf1[3]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 out_len = apply_rules (rules_buf[il_pos].cmds, w0, w1, pw_len); + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + // max length supported by pdf11 is 32 + + w0_t[0] = padding[0]; + w0_t[1] = padding[1]; + w0_t[2] = padding[2]; + w0_t[3] = padding[3]; + w1_t[0] = padding[4]; + w1_t[1] = padding[5]; + w1_t[2] = padding[6]; + w1_t[3] = padding[7]; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = 0; + + switch_buffer_by_offset (w0_t, w1_t, w2_t, w3_t, pw_len); + + // add password + // truncate at 32 is wanted, not a bug! + // add o_buf + + w0_t[0] |= w0[0]; + w0_t[1] |= w0[1]; + w0_t[2] |= w0[2]; + w0_t[3] |= w0[3]; + w1_t[0] |= w1[0]; + w1_t[1] |= w1[1]; + w1_t[2] |= w1[2]; + w1_t[3] |= w1[3]; + w2_t[0] = o_buf[0]; + w2_t[1] = o_buf[1]; + w2_t[2] = o_buf[2]; + w2_t[3] = o_buf[3]; + w3_t[0] = o_buf[4]; + w3_t[1] = o_buf[5]; + w3_t[2] = o_buf[6]; + w3_t[3] = o_buf[7]; + + u32x digest[4]; + + digest[0] = MD5M_A; + digest[1] = MD5M_B; + digest[2] = MD5M_C; + digest[3] = MD5M_D; + + md5_transform (w0_t, w1_t, w2_t, w3_t, digest); + + w0_t[0] = P; + w0_t[1] = id_buf[0]; + w0_t[2] = id_buf[1]; + w0_t[3] = id_buf[2]; + w1_t[0] = id_buf[3]; + w1_t[1] = 0x80; + w1_t[2] = 0; + w1_t[3] = 0; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 84 * 8; + w3_t[3] = 0; + + md5_transform (w0_t, w1_t, w2_t, w3_t, digest); + + u32x a = digest[0]; + u32x b = digest[1] & 0xff; + + const u32x r0 = a; + const u32x r1 = b; + const u32x r2 = 0; + const u32x r3 = 0; + + #include VECT_COMPARE_S + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m10420_s08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global pdf_t *pdf_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m10420_s16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global pdf_t *pdf_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/amd/m10420_a1.cl b/amd/m10420_a1.cl new file mode 100644 index 0000000000..64d393267a --- /dev/null +++ b/amd/m10420_a1.cl @@ -0,0 +1,653 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _MD5_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW4 +#define VECT_SIZE2 +#endif + +#ifdef VLIW5 +#define VECT_SIZE2 +#endif + +#define DGST_R0 0 +#define DGST_R1 1 +#define DGST_R2 2 +#define DGST_R3 3 + +#include "include/kernel_functions.c" +#include "types_amd.c" +#include "common_amd.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +__constant u32 padding[8] = +{ + 0x5e4ebf28, + 0x418a754e, + 0x564e0064, + 0x0801faff, + 0xb6002e2e, + 0x803e68d0, + 0xfea90c2f, + 0x7a695364 +}; + +static void md5_transform (const u32x w0[4], const u32x w1[4], const u32x w2[4], const u32x w3[4], u32x digest[4]) +{ + u32x a = digest[0]; + u32x b = digest[1]; + u32x c = digest[2]; + u32x d = digest[3]; + + u32x w0_t = w0[0]; + u32x w1_t = w0[1]; + u32x w2_t = w0[2]; + u32x w3_t = w0[3]; + u32x w4_t = w1[0]; + u32x w5_t = w1[1]; + u32x w6_t = w1[2]; + u32x w7_t = w1[3]; + u32x w8_t = w2[0]; + u32x w9_t = w2[1]; + u32x wa_t = w2[2]; + u32x wb_t = w2[3]; + u32x wc_t = w3[0]; + u32x wd_t = w3[1]; + u32x we_t = w3[2]; + u32x wf_t = w3[3]; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t, MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t, MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t, MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t, MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w4_t, MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w5_t, MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w6_t, MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w7_t, MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w8_t, MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w9_t, MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, wa_t, MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, wb_t, MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, wc_t, MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, wd_t, MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, we_t, MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, wf_t, MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w1_t, MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w6_t, MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, wb_t, MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t, MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w5_t, MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, wa_t, MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, wf_t, MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w4_t, MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w9_t, MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, we_t, MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t, MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w8_t, MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, wd_t, MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t, MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w7_t, MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, wc_t, MD5C1f, MD5S13); + + MD5_STEP (MD5_H , a, b, c, d, w5_t, MD5C20, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w8_t, MD5C21, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, wb_t, MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, we_t, MD5C23, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w1_t, MD5C24, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w4_t, MD5C25, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w7_t, MD5C26, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, wa_t, MD5C27, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, wd_t, MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w0_t, MD5C29, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w3_t, MD5C2a, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w6_t, MD5C2b, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w9_t, MD5C2c, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, wc_t, MD5C2d, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, wf_t, MD5C2e, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w2_t, MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t, MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w7_t, MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, we_t, MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w5_t, MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, wc_t, MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t, MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, wa_t, MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t, MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w8_t, MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, wf_t, MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w6_t, MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, wd_t, MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w4_t, MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, wb_t, MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t, MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w9_t, MD5C3f, MD5S33); + + digest[0] += a; + digest[1] += b; + digest[2] += c; + digest[3] += d; +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m10420_m04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global pdf_t *pdf_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + append_0x80_2 (wordl0, wordl1, pw_l_len); + + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, combs_buf[0].pw_len); + } + + /** + * U_buf + */ + + u32 o_buf[8]; + + o_buf[0] = pdf_bufs[salt_pos].o_buf[0]; + o_buf[1] = pdf_bufs[salt_pos].o_buf[1]; + o_buf[2] = pdf_bufs[salt_pos].o_buf[2]; + o_buf[3] = pdf_bufs[salt_pos].o_buf[3]; + o_buf[4] = pdf_bufs[salt_pos].o_buf[4]; + o_buf[5] = pdf_bufs[salt_pos].o_buf[5]; + o_buf[6] = pdf_bufs[salt_pos].o_buf[6]; + o_buf[7] = pdf_bufs[salt_pos].o_buf[7]; + + u32 P = pdf_bufs[salt_pos].P; + + u32 id_buf[4]; + + id_buf[0] = pdf_bufs[salt_pos].id_buf[0]; + id_buf[1] = pdf_bufs[salt_pos].id_buf[1]; + id_buf[2] = pdf_bufs[salt_pos].id_buf[2]; + id_buf[3] = pdf_bufs[salt_pos].id_buf[3]; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = combs_buf[il_pos].pw_len; + + const u32 pw_len = pw_l_len + pw_r_len; + + u32 wordr0[4]; + + wordr0[0] = combs_buf[il_pos].i[0]; + wordr0[1] = combs_buf[il_pos].i[1]; + wordr0[2] = combs_buf[il_pos].i[2]; + wordr0[3] = combs_buf[il_pos].i[3]; + + u32 wordr1[4]; + + wordr1[0] = combs_buf[il_pos].i[4]; + wordr1[1] = combs_buf[il_pos].i[5]; + wordr1[2] = combs_buf[il_pos].i[6]; + wordr1[3] = combs_buf[il_pos].i[7]; + + u32 wordr2[4]; + + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + + u32 wordr3[4]; + + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + u32x w0[4]; + + w0[0] = wordl0[0] | wordr0[0]; + w0[1] = wordl0[1] | wordr0[1]; + w0[2] = wordl0[2] | wordr0[2]; + w0[3] = wordl0[3] | wordr0[3]; + + u32x w1[4]; + + w1[0] = wordl1[0] | wordr1[0]; + w1[1] = wordl1[1] | wordr1[1]; + w1[2] = wordl1[2] | wordr1[2]; + w1[3] = wordl1[3] | wordr1[3]; + + u32x w2[4]; + + w2[0] = wordl2[0] | wordr2[0]; + w2[1] = wordl2[1] | wordr2[1]; + w2[2] = wordl2[2] | wordr2[2]; + w2[3] = wordl2[3] | wordr2[3]; + + u32x w3[4]; + + w3[0] = wordl3[0] | wordr3[0]; + w3[1] = wordl3[1] | wordr3[1]; + w3[2] = wordl3[2] | wordr3[2]; + w3[3] = wordl3[3] | wordr3[3]; + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + // max length supported by pdf11 is 32 + + w0_t[0] = padding[0]; + w0_t[1] = padding[1]; + w0_t[2] = padding[2]; + w0_t[3] = padding[3]; + w1_t[0] = padding[4]; + w1_t[1] = padding[5]; + w1_t[2] = padding[6]; + w1_t[3] = padding[7]; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = 0; + + switch_buffer_by_offset (w0_t, w1_t, w2_t, w3_t, pw_len); + + // add password + // truncate at 32 is wanted, not a bug! + // add o_buf + + w0_t[0] |= w0[0]; + w0_t[1] |= w0[1]; + w0_t[2] |= w0[2]; + w0_t[3] |= w0[3]; + w1_t[0] |= w1[0]; + w1_t[1] |= w1[1]; + w1_t[2] |= w1[2]; + w1_t[3] |= w1[3]; + w2_t[0] = o_buf[0]; + w2_t[1] = o_buf[1]; + w2_t[2] = o_buf[2]; + w2_t[3] = o_buf[3]; + w3_t[0] = o_buf[4]; + w3_t[1] = o_buf[5]; + w3_t[2] = o_buf[6]; + w3_t[3] = o_buf[7]; + + u32x digest[4]; + + digest[0] = MD5M_A; + digest[1] = MD5M_B; + digest[2] = MD5M_C; + digest[3] = MD5M_D; + + md5_transform (w0_t, w1_t, w2_t, w3_t, digest); + + w0_t[0] = P; + w0_t[1] = id_buf[0]; + w0_t[2] = id_buf[1]; + w0_t[3] = id_buf[2]; + w1_t[0] = id_buf[3]; + w1_t[1] = 0x80; + w1_t[2] = 0; + w1_t[3] = 0; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 84 * 8; + w3_t[3] = 0; + + md5_transform (w0_t, w1_t, w2_t, w3_t, digest); + + u32x a = digest[0]; + u32x b = digest[1] & 0xff; + + const u32x r0 = a; + const u32x r1 = b; + const u32x r2 = 0; + const u32x r3 = 0; + + #include VECT_COMPARE_M + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m10420_m08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global pdf_t *pdf_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m10420_m16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global pdf_t *pdf_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m10420_s04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global pdf_t *pdf_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + append_0x80_2 (wordl0, wordl1, pw_l_len); + + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, combs_buf[0].pw_len); + } + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * U_buf + */ + + u32 o_buf[8]; + + o_buf[0] = pdf_bufs[salt_pos].o_buf[0]; + o_buf[1] = pdf_bufs[salt_pos].o_buf[1]; + o_buf[2] = pdf_bufs[salt_pos].o_buf[2]; + o_buf[3] = pdf_bufs[salt_pos].o_buf[3]; + o_buf[4] = pdf_bufs[salt_pos].o_buf[4]; + o_buf[5] = pdf_bufs[salt_pos].o_buf[5]; + o_buf[6] = pdf_bufs[salt_pos].o_buf[6]; + o_buf[7] = pdf_bufs[salt_pos].o_buf[7]; + + u32 P = pdf_bufs[salt_pos].P; + + u32 id_buf[4]; + + id_buf[0] = pdf_bufs[salt_pos].id_buf[0]; + id_buf[1] = pdf_bufs[salt_pos].id_buf[1]; + id_buf[2] = pdf_bufs[salt_pos].id_buf[2]; + id_buf[3] = pdf_bufs[salt_pos].id_buf[3]; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = combs_buf[il_pos].pw_len; + + const u32 pw_len = pw_l_len + pw_r_len; + + u32 wordr0[4]; + + wordr0[0] = combs_buf[il_pos].i[0]; + wordr0[1] = combs_buf[il_pos].i[1]; + wordr0[2] = combs_buf[il_pos].i[2]; + wordr0[3] = combs_buf[il_pos].i[3]; + + u32 wordr1[4]; + + wordr1[0] = combs_buf[il_pos].i[4]; + wordr1[1] = combs_buf[il_pos].i[5]; + wordr1[2] = combs_buf[il_pos].i[6]; + wordr1[3] = combs_buf[il_pos].i[7]; + + u32 wordr2[4]; + + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + + u32 wordr3[4]; + + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + u32x w0[4]; + + w0[0] = wordl0[0] | wordr0[0]; + w0[1] = wordl0[1] | wordr0[1]; + w0[2] = wordl0[2] | wordr0[2]; + w0[3] = wordl0[3] | wordr0[3]; + + u32x w1[4]; + + w1[0] = wordl1[0] | wordr1[0]; + w1[1] = wordl1[1] | wordr1[1]; + w1[2] = wordl1[2] | wordr1[2]; + w1[3] = wordl1[3] | wordr1[3]; + + u32x w2[4]; + + w2[0] = wordl2[0] | wordr2[0]; + w2[1] = wordl2[1] | wordr2[1]; + w2[2] = wordl2[2] | wordr2[2]; + w2[3] = wordl2[3] | wordr2[3]; + + u32x w3[4]; + + w3[0] = wordl3[0] | wordr3[0]; + w3[1] = wordl3[1] | wordr3[1]; + w3[2] = wordl3[2] | wordr3[2]; + w3[3] = wordl3[3] | wordr3[3]; + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + // max length supported by pdf11 is 32 + + w0_t[0] = padding[0]; + w0_t[1] = padding[1]; + w0_t[2] = padding[2]; + w0_t[3] = padding[3]; + w1_t[0] = padding[4]; + w1_t[1] = padding[5]; + w1_t[2] = padding[6]; + w1_t[3] = padding[7]; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = 0; + + switch_buffer_by_offset (w0_t, w1_t, w2_t, w3_t, pw_len); + + // add password + // truncate at 32 is wanted, not a bug! + // add o_buf + + w0_t[0] |= w0[0]; + w0_t[1] |= w0[1]; + w0_t[2] |= w0[2]; + w0_t[3] |= w0[3]; + w1_t[0] |= w1[0]; + w1_t[1] |= w1[1]; + w1_t[2] |= w1[2]; + w1_t[3] |= w1[3]; + w2_t[0] = o_buf[0]; + w2_t[1] = o_buf[1]; + w2_t[2] = o_buf[2]; + w2_t[3] = o_buf[3]; + w3_t[0] = o_buf[4]; + w3_t[1] = o_buf[5]; + w3_t[2] = o_buf[6]; + w3_t[3] = o_buf[7]; + + u32x digest[4]; + + digest[0] = MD5M_A; + digest[1] = MD5M_B; + digest[2] = MD5M_C; + digest[3] = MD5M_D; + + md5_transform (w0_t, w1_t, w2_t, w3_t, digest); + + w0_t[0] = P; + w0_t[1] = id_buf[0]; + w0_t[2] = id_buf[1]; + w0_t[3] = id_buf[2]; + w1_t[0] = id_buf[3]; + w1_t[1] = 0x80; + w1_t[2] = 0; + w1_t[3] = 0; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 84 * 8; + w3_t[3] = 0; + + md5_transform (w0_t, w1_t, w2_t, w3_t, digest); + + u32x a = digest[0]; + u32x b = digest[1] & 0xff; + + const u32x r0 = a; + const u32x r1 = b; + const u32x r2 = 0; + const u32x r3 = 0; + + #include VECT_COMPARE_S + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m10420_s08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global pdf_t *pdf_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m10420_s16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global pdf_t *pdf_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/amd/m10420_a3.cl b/amd/m10420_a3.cl new file mode 100644 index 0000000000..fabdabf613 --- /dev/null +++ b/amd/m10420_a3.cl @@ -0,0 +1,713 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _MD5_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW4 +#define VECT_SIZE2 +#endif + +#ifdef VLIW5 +#define VECT_SIZE2 +#endif + +#define DGST_R0 0 +#define DGST_R1 1 +#define DGST_R2 2 +#define DGST_R3 3 + +#include "include/kernel_functions.c" +#include "types_amd.c" +#include "common_amd.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +__constant u32 padding[8] = +{ + 0x5e4ebf28, + 0x418a754e, + 0x564e0064, + 0x0801faff, + 0xb6002e2e, + 0x803e68d0, + 0xfea90c2f, + 0x7a695364 +}; + +static void md5_transform (const u32x w0[4], const u32x w1[4], const u32x w2[4], const u32x w3[4], u32x digest[4]) +{ + u32x a = digest[0]; + u32x b = digest[1]; + u32x c = digest[2]; + u32x d = digest[3]; + + u32x w0_t = w0[0]; + u32x w1_t = w0[1]; + u32x w2_t = w0[2]; + u32x w3_t = w0[3]; + u32x w4_t = w1[0]; + u32x w5_t = w1[1]; + u32x w6_t = w1[2]; + u32x w7_t = w1[3]; + u32x w8_t = w2[0]; + u32x w9_t = w2[1]; + u32x wa_t = w2[2]; + u32x wb_t = w2[3]; + u32x wc_t = w3[0]; + u32x wd_t = w3[1]; + u32x we_t = w3[2]; + u32x wf_t = w3[3]; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t, MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t, MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t, MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t, MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w4_t, MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w5_t, MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w6_t, MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w7_t, MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w8_t, MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w9_t, MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, wa_t, MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, wb_t, MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, wc_t, MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, wd_t, MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, we_t, MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, wf_t, MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w1_t, MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w6_t, MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, wb_t, MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t, MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w5_t, MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, wa_t, MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, wf_t, MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w4_t, MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w9_t, MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, we_t, MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t, MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w8_t, MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, wd_t, MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t, MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w7_t, MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, wc_t, MD5C1f, MD5S13); + + MD5_STEP (MD5_H , a, b, c, d, w5_t, MD5C20, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w8_t, MD5C21, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, wb_t, MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, we_t, MD5C23, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w1_t, MD5C24, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w4_t, MD5C25, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w7_t, MD5C26, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, wa_t, MD5C27, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, wd_t, MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w0_t, MD5C29, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w3_t, MD5C2a, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w6_t, MD5C2b, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w9_t, MD5C2c, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, wc_t, MD5C2d, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, wf_t, MD5C2e, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w2_t, MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t, MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w7_t, MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, we_t, MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w5_t, MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, wc_t, MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t, MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, wa_t, MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t, MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w8_t, MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, wf_t, MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w6_t, MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, wd_t, MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w4_t, MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, wb_t, MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t, MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w9_t, MD5C3f, MD5S33); + + digest[0] += a; + digest[1] += b; + digest[2] += c; + digest[3] += d; +} + +static void m10420m (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], const u32 pw_len, __global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global pdf_t *pdf_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset) +{ + /** + * modifier + */ + + const u32 gid = get_global_id (0); + const u32 lid = get_local_id (0); + + /** + * U_buf + */ + + u32 o_buf[8]; + + o_buf[0] = pdf_bufs[salt_pos].o_buf[0]; + o_buf[1] = pdf_bufs[salt_pos].o_buf[1]; + o_buf[2] = pdf_bufs[salt_pos].o_buf[2]; + o_buf[3] = pdf_bufs[salt_pos].o_buf[3]; + o_buf[4] = pdf_bufs[salt_pos].o_buf[4]; + o_buf[5] = pdf_bufs[salt_pos].o_buf[5]; + o_buf[6] = pdf_bufs[salt_pos].o_buf[6]; + o_buf[7] = pdf_bufs[salt_pos].o_buf[7]; + + u32 P = pdf_bufs[salt_pos].P; + + u32 id_buf[4]; + + id_buf[0] = pdf_bufs[salt_pos].id_buf[0]; + id_buf[1] = pdf_bufs[salt_pos].id_buf[1]; + id_buf[2] = pdf_bufs[salt_pos].id_buf[2]; + id_buf[3] = pdf_bufs[salt_pos].id_buf[3]; + + /** + * loop + */ + + u32x w0l = w0[0]; + + for (u32 il_pos = 0; il_pos < bfs_cnt; il_pos++) + { + const u32 w0r = bfs_buf[il_pos].i; + + w0[0] = w0l | w0r; + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + // max length supported by pdf11 is 32 + + w0_t[0] = padding[0]; + w0_t[1] = padding[1]; + w0_t[2] = padding[2]; + w0_t[3] = padding[3]; + w1_t[0] = padding[4]; + w1_t[1] = padding[5]; + w1_t[2] = padding[6]; + w1_t[3] = padding[7]; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = 0; + + switch_buffer_by_offset (w0_t, w1_t, w2_t, w3_t, pw_len); + + // add password + // truncate at 32 is wanted, not a bug! + // add o_buf + + w0_t[0] |= w0[0]; + w0_t[1] |= w0[1]; + w0_t[2] |= w0[2]; + w0_t[3] |= w0[3]; + w1_t[0] |= w1[0]; + w1_t[1] |= w1[1]; + w1_t[2] |= w1[2]; + w1_t[3] |= w1[3]; + w2_t[0] = o_buf[0]; + w2_t[1] = o_buf[1]; + w2_t[2] = o_buf[2]; + w2_t[3] = o_buf[3]; + w3_t[0] = o_buf[4]; + w3_t[1] = o_buf[5]; + w3_t[2] = o_buf[6]; + w3_t[3] = o_buf[7]; + + u32x digest[4]; + + digest[0] = MD5M_A; + digest[1] = MD5M_B; + digest[2] = MD5M_C; + digest[3] = MD5M_D; + + md5_transform (w0_t, w1_t, w2_t, w3_t, digest); + + w0_t[0] = P; + w0_t[1] = id_buf[0]; + w0_t[2] = id_buf[1]; + w0_t[3] = id_buf[2]; + w1_t[0] = id_buf[3]; + w1_t[1] = 0x80; + w1_t[2] = 0; + w1_t[3] = 0; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 84 * 8; + w3_t[3] = 0; + + md5_transform (w0_t, w1_t, w2_t, w3_t, digest); + + u32x a = digest[0]; + u32x b = digest[1] & 0xff; + + const u32x r0 = a; + const u32x r1 = b; + const u32x r2 = 0; + const u32x r3 = 0; + + #include VECT_COMPARE_M + } +} + +static void m10420s (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], const u32 pw_len, __global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global pdf_t *pdf_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset) +{ + /** + * modifier + */ + + const u32 gid = get_global_id (0); + const u32 lid = get_local_id (0); + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * U_buf + */ + + u32 o_buf[8]; + + o_buf[0] = pdf_bufs[salt_pos].o_buf[0]; + o_buf[1] = pdf_bufs[salt_pos].o_buf[1]; + o_buf[2] = pdf_bufs[salt_pos].o_buf[2]; + o_buf[3] = pdf_bufs[salt_pos].o_buf[3]; + o_buf[4] = pdf_bufs[salt_pos].o_buf[4]; + o_buf[5] = pdf_bufs[salt_pos].o_buf[5]; + o_buf[6] = pdf_bufs[salt_pos].o_buf[6]; + o_buf[7] = pdf_bufs[salt_pos].o_buf[7]; + + u32 P = pdf_bufs[salt_pos].P; + + u32 id_buf[4]; + + id_buf[0] = pdf_bufs[salt_pos].id_buf[0]; + id_buf[1] = pdf_bufs[salt_pos].id_buf[1]; + id_buf[2] = pdf_bufs[salt_pos].id_buf[2]; + id_buf[3] = pdf_bufs[salt_pos].id_buf[3]; + + /** + * loop + */ + + u32x w0l = w0[0]; + + for (u32 il_pos = 0; il_pos < bfs_cnt; il_pos++) + { + const u32 w0r = bfs_buf[il_pos].i; + + w0[0] = w0l | w0r; + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + // max length supported by pdf11 is 32 + + w0_t[0] = padding[0]; + w0_t[1] = padding[1]; + w0_t[2] = padding[2]; + w0_t[3] = padding[3]; + w1_t[0] = padding[4]; + w1_t[1] = padding[5]; + w1_t[2] = padding[6]; + w1_t[3] = padding[7]; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = 0; + + switch_buffer_by_offset (w0_t, w1_t, w2_t, w3_t, pw_len); + + // add password + // truncate at 32 is wanted, not a bug! + // add o_buf + + w0_t[0] |= w0[0]; + w0_t[1] |= w0[1]; + w0_t[2] |= w0[2]; + w0_t[3] |= w0[3]; + w1_t[0] |= w1[0]; + w1_t[1] |= w1[1]; + w1_t[2] |= w1[2]; + w1_t[3] |= w1[3]; + w2_t[0] = o_buf[0]; + w2_t[1] = o_buf[1]; + w2_t[2] = o_buf[2]; + w2_t[3] = o_buf[3]; + w3_t[0] = o_buf[4]; + w3_t[1] = o_buf[5]; + w3_t[2] = o_buf[6]; + w3_t[3] = o_buf[7]; + + u32x digest[4]; + + digest[0] = MD5M_A; + digest[1] = MD5M_B; + digest[2] = MD5M_C; + digest[3] = MD5M_D; + + md5_transform (w0_t, w1_t, w2_t, w3_t, digest); + + w0_t[0] = P; + w0_t[1] = id_buf[0]; + w0_t[2] = id_buf[1]; + w0_t[3] = id_buf[2]; + w1_t[0] = id_buf[3]; + w1_t[1] = 0x80; + w1_t[2] = 0; + w1_t[3] = 0; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 84 * 8; + w3_t[3] = 0; + + md5_transform (w0_t, w1_t, w2_t, w3_t, digest); + + u32x a = digest[0]; + u32x b = digest[1] & 0xff; + + const u32x r0 = a; + const u32x r1 = b; + const u32x r2 = 0; + const u32x r3 = 0; + + #include VECT_COMPARE_S + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m10420_m04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global pdf_t *pdf_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m10420m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, pdf_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m10420_m08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global pdf_t *pdf_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m10420m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, pdf_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m10420_m16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global pdf_t *pdf_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = pws[gid].i[ 8]; + w2[1] = pws[gid].i[ 9]; + w2[2] = pws[gid].i[10]; + w2[3] = pws[gid].i[11]; + + u32x w3[4]; + + w3[0] = pws[gid].i[12]; + w3[1] = pws[gid].i[13]; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m10420m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, pdf_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m10420_s04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global pdf_t *pdf_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m10420s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, pdf_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m10420_s08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global pdf_t *pdf_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m10420s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, pdf_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m10420_s16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global pdf_t *pdf_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = pws[gid].i[ 8]; + w2[1] = pws[gid].i[ 9]; + w2[2] = pws[gid].i[10]; + w2[3] = pws[gid].i[11]; + + u32x w3[4]; + + w3[0] = pws[gid].i[12]; + w3[1] = pws[gid].i[13]; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m10420s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, pdf_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} diff --git a/amd/m10500.cl b/amd/m10500.cl new file mode 100644 index 0000000000..931b55df71 --- /dev/null +++ b/amd/m10500.cl @@ -0,0 +1,589 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _MD5_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW4 +#define VECT_SIZE1 +#endif + +#ifdef VLIW5 +#define VECT_SIZE1 +#endif + +#define DGST_R0 0 +#define DGST_R1 1 +#define DGST_R2 2 +#define DGST_R3 3 + +#include "include/kernel_functions.c" +#include "types_amd.c" +#include "common_amd.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +__constant u32 padding[8] = +{ + 0x5e4ebf28, + 0x418a754e, + 0x564e0064, + 0x0801faff, + 0xb6002e2e, + 0x803e68d0, + 0xfea90c2f, + 0x7a695364 +}; + +typedef struct +{ + u8 S[256]; + + u32 wtf_its_faster; + +} RC4_KEY; + +static void swap (__local RC4_KEY *rc4_key, const u8 i, const u8 j) +{ + u8 tmp; + + tmp = rc4_key->S[i]; + rc4_key->S[i] = rc4_key->S[j]; + rc4_key->S[j] = tmp; +} + +static void rc4_init_16 (__local RC4_KEY *rc4_key, const u32 data[4]) +{ + u32 v = 0x03020100; + u32 a = 0x04040404; + + __local u32 *ptr = (__local u32 *) rc4_key->S; + + #pragma unroll + for (u32 i = 0; i < 64; i++) + { + *ptr++ = v; v += a; + } + + u32 j = 0; + + #pragma unroll + for (u32 i = 0; i < 16; i++) + { + u32 idx = i * 16; + + u32 v; + + v = data[0]; + + j += rc4_key->S[idx] + (v >> 0); swap (rc4_key, idx, j); idx++; + j += rc4_key->S[idx] + (v >> 8); swap (rc4_key, idx, j); idx++; + j += rc4_key->S[idx] + (v >> 16); swap (rc4_key, idx, j); idx++; + j += rc4_key->S[idx] + (v >> 24); swap (rc4_key, idx, j); idx++; + + v = data[1]; + + j += rc4_key->S[idx] + (v >> 0); swap (rc4_key, idx, j); idx++; + j += rc4_key->S[idx] + (v >> 8); swap (rc4_key, idx, j); idx++; + j += rc4_key->S[idx] + (v >> 16); swap (rc4_key, idx, j); idx++; + j += rc4_key->S[idx] + (v >> 24); swap (rc4_key, idx, j); idx++; + + v = data[2]; + + j += rc4_key->S[idx] + (v >> 0); swap (rc4_key, idx, j); idx++; + j += rc4_key->S[idx] + (v >> 8); swap (rc4_key, idx, j); idx++; + j += rc4_key->S[idx] + (v >> 16); swap (rc4_key, idx, j); idx++; + j += rc4_key->S[idx] + (v >> 24); swap (rc4_key, idx, j); idx++; + + v = data[3]; + + j += rc4_key->S[idx] + (v >> 0); swap (rc4_key, idx, j); idx++; + j += rc4_key->S[idx] + (v >> 8); swap (rc4_key, idx, j); idx++; + j += rc4_key->S[idx] + (v >> 16); swap (rc4_key, idx, j); idx++; + j += rc4_key->S[idx] + (v >> 24); swap (rc4_key, idx, j); idx++; + } +} + +static u8 rc4_next_16 (__local RC4_KEY *rc4_key, u8 i, u8 j, const u32 in[4], u32 out[4]) +{ + #pragma unroll + for (u32 k = 0; k < 4; k++) + { + u32 xor4 = 0; + + u8 idx; + + i += 1; + j += rc4_key->S[i]; + + swap (rc4_key, i, j); + + idx = rc4_key->S[i] + rc4_key->S[j]; + + xor4 |= rc4_key->S[idx] << 0; + + i += 1; + j += rc4_key->S[i]; + + swap (rc4_key, i, j); + + idx = rc4_key->S[i] + rc4_key->S[j]; + + xor4 |= rc4_key->S[idx] << 8; + + i += 1; + j += rc4_key->S[i]; + + swap (rc4_key, i, j); + + idx = rc4_key->S[i] + rc4_key->S[j]; + + xor4 |= rc4_key->S[idx] << 16; + + i += 1; + j += rc4_key->S[i]; + + swap (rc4_key, i, j); + + idx = rc4_key->S[i] + rc4_key->S[j]; + + xor4 |= rc4_key->S[idx] << 24; + + out[k] = in[k] ^ xor4; + } + + return j; +} + +static void md5_transform (const u32x w0[4], const u32x w1[4], const u32x w2[4], const u32x w3[4], u32x digest[4]) +{ + u32x a = digest[0]; + u32x b = digest[1]; + u32x c = digest[2]; + u32x d = digest[3]; + + u32x w0_t = w0[0]; + u32x w1_t = w0[1]; + u32x w2_t = w0[2]; + u32x w3_t = w0[3]; + u32x w4_t = w1[0]; + u32x w5_t = w1[1]; + u32x w6_t = w1[2]; + u32x w7_t = w1[3]; + u32x w8_t = w2[0]; + u32x w9_t = w2[1]; + u32x wa_t = w2[2]; + u32x wb_t = w2[3]; + u32x wc_t = w3[0]; + u32x wd_t = w3[1]; + u32x we_t = w3[2]; + u32x wf_t = w3[3]; + + u32x tmp2; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t, MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t, MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t, MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t, MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w4_t, MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w5_t, MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w6_t, MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w7_t, MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w8_t, MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w9_t, MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, wa_t, MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, wb_t, MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, wc_t, MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, wd_t, MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, we_t, MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, wf_t, MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w1_t, MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w6_t, MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, wb_t, MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t, MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w5_t, MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, wa_t, MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, wf_t, MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w4_t, MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w9_t, MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, we_t, MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t, MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w8_t, MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, wd_t, MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t, MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w7_t, MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, wc_t, MD5C1f, MD5S13); + + MD5_STEP (MD5_H1, a, b, c, d, w5_t, MD5C20, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w8_t, MD5C21, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, wb_t, MD5C22, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, we_t, MD5C23, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w1_t, MD5C24, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w4_t, MD5C25, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w7_t, MD5C26, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, wa_t, MD5C27, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, wd_t, MD5C28, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w0_t, MD5C29, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w3_t, MD5C2a, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w6_t, MD5C2b, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w9_t, MD5C2c, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, wc_t, MD5C2d, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, wf_t, MD5C2e, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w2_t, MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t, MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w7_t, MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, we_t, MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w5_t, MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, wc_t, MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t, MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, wa_t, MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t, MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w8_t, MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, wf_t, MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w6_t, MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, wd_t, MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w4_t, MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, wb_t, MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t, MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w9_t, MD5C3f, MD5S33); + + digest[0] += a; + digest[1] += b; + digest[2] += c; + digest[3] += d; +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m10500_init (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global pdf14_tmp_t *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global pdf_t *pdf_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + const u32 lid = get_local_id (0); + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = pws[gid].i[ 8]; + w2[1] = pws[gid].i[ 9]; + w2[2] = 0; + w2[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * shared + */ + + __local RC4_KEY rc4_keys[64]; + + __local RC4_KEY *rc4_key = &rc4_keys[lid]; + + /** + * U_buf + */ + + u32 o_buf[8]; + + o_buf[0] = pdf_bufs[salt_pos].o_buf[0]; + o_buf[1] = pdf_bufs[salt_pos].o_buf[1]; + o_buf[2] = pdf_bufs[salt_pos].o_buf[2]; + o_buf[3] = pdf_bufs[salt_pos].o_buf[3]; + o_buf[4] = pdf_bufs[salt_pos].o_buf[4]; + o_buf[5] = pdf_bufs[salt_pos].o_buf[5]; + o_buf[6] = pdf_bufs[salt_pos].o_buf[6]; + o_buf[7] = pdf_bufs[salt_pos].o_buf[7]; + + u32 P = pdf_bufs[salt_pos].P; + + u32 id_buf[12]; + + id_buf[ 0] = pdf_bufs[salt_pos].id_buf[0]; + id_buf[ 1] = pdf_bufs[salt_pos].id_buf[1]; + id_buf[ 2] = pdf_bufs[salt_pos].id_buf[2]; + id_buf[ 3] = pdf_bufs[salt_pos].id_buf[3]; + + id_buf[ 4] = pdf_bufs[salt_pos].id_buf[4]; + id_buf[ 5] = pdf_bufs[salt_pos].id_buf[5]; + id_buf[ 6] = pdf_bufs[salt_pos].id_buf[6]; + id_buf[ 7] = pdf_bufs[salt_pos].id_buf[7]; + + id_buf[ 8] = 0; + id_buf[ 9] = 0; + id_buf[10] = 0; + id_buf[11] = 0; + + u32 id_len = pdf_bufs[salt_pos].id_len; + u32 id_len4 = id_len / 4; + + u32 rc4data[2]; + + rc4data[0] = pdf_bufs[salt_pos].rc4data[0]; + rc4data[1] = pdf_bufs[salt_pos].rc4data[1]; + + u32 final_length = 68 + id_len; + + u32x w11 = 0x80; + u32x w12 = 0; + + if (pdf_bufs[salt_pos].enc_md != 1) + { + w11 = 0xffffffff; + w12 = 0x80; + + final_length += 4; + } + + id_buf[id_len4 + 0] = w11; + id_buf[id_len4 + 1] = w12; + + /** + * main init + */ + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + // max length supported by pdf11 is 32 + + w0_t[0] = padding[0]; + w0_t[1] = padding[1]; + w0_t[2] = padding[2]; + w0_t[3] = padding[3]; + w1_t[0] = padding[4]; + w1_t[1] = padding[5]; + w1_t[2] = padding[6]; + w1_t[3] = padding[7]; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = 0; + + switch_buffer_by_offset (w0_t, w1_t, w2_t, w3_t, pw_len); + + // add password + // truncate at 32 is wanted, not a bug! + // add o_buf + + w0_t[0] |= w0[0]; + w0_t[1] |= w0[1]; + w0_t[2] |= w0[2]; + w0_t[3] |= w0[3]; + w1_t[0] |= w1[0]; + w1_t[1] |= w1[1]; + w1_t[2] |= w1[2]; + w1_t[3] |= w1[3]; + w2_t[0] = o_buf[0]; + w2_t[1] = o_buf[1]; + w2_t[2] = o_buf[2]; + w2_t[3] = o_buf[3]; + w3_t[0] = o_buf[4]; + w3_t[1] = o_buf[5]; + w3_t[2] = o_buf[6]; + w3_t[3] = o_buf[7]; + + u32x digest[4]; + + digest[0] = MD5M_A; + digest[1] = MD5M_B; + digest[2] = MD5M_C; + digest[3] = MD5M_D; + + md5_transform (w0_t, w1_t, w2_t, w3_t, digest); + + w0_t[0] = P; + w0_t[1] = id_buf[ 0]; + w0_t[2] = id_buf[ 1]; + w0_t[3] = id_buf[ 2]; + w1_t[0] = id_buf[ 3]; + w1_t[1] = id_buf[ 4]; + w1_t[2] = id_buf[ 5]; + w1_t[3] = id_buf[ 6]; + w2_t[0] = id_buf[ 7]; + w2_t[1] = id_buf[ 8]; + w2_t[2] = id_buf[ 9]; + w2_t[3] = id_buf[10]; + w3_t[0] = id_buf[11]; + w3_t[1] = 0; + w3_t[2] = final_length * 8; + w3_t[3] = 0; + + md5_transform (w0_t, w1_t, w2_t, w3_t, digest); + + tmps[gid].digest[0] = digest[0]; + tmps[gid].digest[1] = digest[1]; + tmps[gid].digest[2] = digest[2]; + tmps[gid].digest[3] = digest[3]; + + tmps[gid].out[0] = rc4data[0]; + tmps[gid].out[1] = rc4data[1]; + tmps[gid].out[2] = 0; + tmps[gid].out[3] = 0; +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m10500_loop (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global pdf14_tmp_t *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global pdf_t *pdf_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + const u32 lid = get_local_id (0); + + if (gid >= gid_max) return; + + /** + * shared + */ + + __local RC4_KEY rc4_keys[64]; + + __local RC4_KEY *rc4_key = &rc4_keys[lid]; + + /** + * loop + */ + + u32x digest[4]; + + digest[0] = tmps[gid].digest[0]; + digest[1] = tmps[gid].digest[1]; + digest[2] = tmps[gid].digest[2]; + digest[3] = tmps[gid].digest[3]; + + u32x out[4]; + + out[0] = tmps[gid].out[0]; + out[1] = tmps[gid].out[1]; + out[2] = tmps[gid].out[2]; + out[3] = tmps[gid].out[3]; + + for (u32 i = 0, j = loop_pos; i < loop_cnt; i++, j++) + { + if (j < 50) + { + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + w0_t[0] = digest[0]; + w0_t[1] = digest[1]; + w0_t[2] = digest[2]; + w0_t[3] = digest[3]; + w1_t[0] = 0x80; + w1_t[1] = 0; + w1_t[2] = 0; + w1_t[3] = 0; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 16 * 8; + w3_t[3] = 0; + + digest[0] = MD5M_A; + digest[1] = MD5M_B; + digest[2] = MD5M_C; + digest[3] = MD5M_D; + + md5_transform (w0_t, w1_t, w2_t, w3_t, digest); + } + else + { + const u32 x = j - 50; + + const u32 xv = x << 0 + | x << 8 + | x << 16 + | x << 24; + + u32x tmp[4]; + + tmp[0] = digest[0] ^ xv; + tmp[1] = digest[1] ^ xv; + tmp[2] = digest[2] ^ xv; + tmp[3] = digest[3] ^ xv; + + rc4_init_16 (rc4_key, tmp); + + rc4_next_16 (rc4_key, 0, 0, out, out); + } + } + + tmps[gid].digest[0] = digest[0]; + tmps[gid].digest[1] = digest[1]; + tmps[gid].digest[2] = digest[2]; + tmps[gid].digest[3] = digest[3]; + + tmps[gid].out[0] = out[0]; + tmps[gid].out[1] = out[1]; + tmps[gid].out[2] = out[2]; + tmps[gid].out[3] = out[3]; +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m10500_comp (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global pdf14_tmp_t *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global pdf_t *pdf_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + const u32 lid = get_local_id (0); + + /** + * digest + */ + + const u32x r0 = tmps[gid].out[0]; + const u32x r1 = tmps[gid].out[1]; + const u32x r2 = 0; + const u32x r3 = 0; + + #define il_pos 0 + + #include VECT_COMPARE_M +} diff --git a/amd/m10700.cl b/amd/m10700.cl new file mode 100644 index 0000000000..b38305c0e6 --- /dev/null +++ b/amd/m10700.cl @@ -0,0 +1,1744 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _PDF17L8_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW4 +#define VECT_SIZE1 +#endif + +#ifdef VLIW5 +#define VECT_SIZE1 +#endif + +#define DGST_R0 0 +#define DGST_R1 1 +#define DGST_R2 2 +#define DGST_R3 3 + +#include "include/kernel_functions.c" +#include "types_amd.c" +#include "common_amd.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +typedef struct +{ + union + { + u32 dgst32[16]; + u64 dgst64[8]; + }; + + u32 dgst_len; + + union + { + u32 W32[32]; + u64 W64[16]; + }; + + u32 W_len; + +} ctx_t; + +__constant u32 k_sha256[64] = +{ + SHA256C00, SHA256C01, SHA256C02, SHA256C03, + SHA256C04, SHA256C05, SHA256C06, SHA256C07, + SHA256C08, SHA256C09, SHA256C0a, SHA256C0b, + SHA256C0c, SHA256C0d, SHA256C0e, SHA256C0f, + SHA256C10, SHA256C11, SHA256C12, SHA256C13, + SHA256C14, SHA256C15, SHA256C16, SHA256C17, + SHA256C18, SHA256C19, SHA256C1a, SHA256C1b, + SHA256C1c, SHA256C1d, SHA256C1e, SHA256C1f, + SHA256C20, SHA256C21, SHA256C22, SHA256C23, + SHA256C24, SHA256C25, SHA256C26, SHA256C27, + SHA256C28, SHA256C29, SHA256C2a, SHA256C2b, + SHA256C2c, SHA256C2d, SHA256C2e, SHA256C2f, + SHA256C30, SHA256C31, SHA256C32, SHA256C33, + SHA256C34, SHA256C35, SHA256C36, SHA256C37, + SHA256C38, SHA256C39, SHA256C3a, SHA256C3b, + SHA256C3c, SHA256C3d, SHA256C3e, SHA256C3f, +}; + +static void sha256_transform (const u32x w0[4], const u32x w1[4], const u32x w2[4], const u32x w3[4], u32x digest[8]) +{ + u32x a = digest[0]; + u32x b = digest[1]; + u32x c = digest[2]; + u32x d = digest[3]; + u32x e = digest[4]; + u32x f = digest[5]; + u32x g = digest[6]; + u32x h = digest[7]; + + u32x w0_t = swap_workaround (w0[0]); + u32x w1_t = swap_workaround (w0[1]); + u32x w2_t = swap_workaround (w0[2]); + u32x w3_t = swap_workaround (w0[3]); + u32x w4_t = swap_workaround (w1[0]); + u32x w5_t = swap_workaround (w1[1]); + u32x w6_t = swap_workaround (w1[2]); + u32x w7_t = swap_workaround (w1[3]); + u32x w8_t = swap_workaround (w2[0]); + u32x w9_t = swap_workaround (w2[1]); + u32x wa_t = swap_workaround (w2[2]); + u32x wb_t = swap_workaround (w2[3]); + u32x wc_t = swap_workaround (w3[0]); + u32x wd_t = swap_workaround (w3[1]); + u32x we_t = swap_workaround (w3[2]); + u32x wf_t = swap_workaround (w3[3]); + + #define ROUND256_EXPAND() \ + { \ + w0_t = SHA256_EXPAND (we_t, w9_t, w1_t, w0_t); \ + w1_t = SHA256_EXPAND (wf_t, wa_t, w2_t, w1_t); \ + w2_t = SHA256_EXPAND (w0_t, wb_t, w3_t, w2_t); \ + w3_t = SHA256_EXPAND (w1_t, wc_t, w4_t, w3_t); \ + w4_t = SHA256_EXPAND (w2_t, wd_t, w5_t, w4_t); \ + w5_t = SHA256_EXPAND (w3_t, we_t, w6_t, w5_t); \ + w6_t = SHA256_EXPAND (w4_t, wf_t, w7_t, w6_t); \ + w7_t = SHA256_EXPAND (w5_t, w0_t, w8_t, w7_t); \ + w8_t = SHA256_EXPAND (w6_t, w1_t, w9_t, w8_t); \ + w9_t = SHA256_EXPAND (w7_t, w2_t, wa_t, w9_t); \ + wa_t = SHA256_EXPAND (w8_t, w3_t, wb_t, wa_t); \ + wb_t = SHA256_EXPAND (w9_t, w4_t, wc_t, wb_t); \ + wc_t = SHA256_EXPAND (wa_t, w5_t, wd_t, wc_t); \ + wd_t = SHA256_EXPAND (wb_t, w6_t, we_t, wd_t); \ + we_t = SHA256_EXPAND (wc_t, w7_t, wf_t, we_t); \ + wf_t = SHA256_EXPAND (wd_t, w8_t, w0_t, wf_t); \ + } + + #define ROUND256_STEP(i) \ + { \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, k_sha256[i + 0]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, k_sha256[i + 1]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, k_sha256[i + 2]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, k_sha256[i + 3]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, k_sha256[i + 4]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, k_sha256[i + 5]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, k_sha256[i + 6]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, k_sha256[i + 7]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, k_sha256[i + 8]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, k_sha256[i + 9]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, k_sha256[i + 10]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, k_sha256[i + 11]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, k_sha256[i + 12]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, k_sha256[i + 13]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, k_sha256[i + 14]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, k_sha256[i + 15]); \ + } + + ROUND256_STEP (0); + + #pragma unroll + for (int i = 16; i < 64; i += 16) + { + ROUND256_EXPAND (); ROUND256_STEP (i); + } + + digest[0] += a; + digest[1] += b; + digest[2] += c; + digest[3] += d; + digest[4] += e; + digest[5] += f; + digest[6] += g; + digest[7] += h; +} + +__constant u64 k_sha384[80] = +{ + SHA384C00, SHA384C01, SHA384C02, SHA384C03, + SHA384C04, SHA384C05, SHA384C06, SHA384C07, + SHA384C08, SHA384C09, SHA384C0a, SHA384C0b, + SHA384C0c, SHA384C0d, SHA384C0e, SHA384C0f, + SHA384C10, SHA384C11, SHA384C12, SHA384C13, + SHA384C14, SHA384C15, SHA384C16, SHA384C17, + SHA384C18, SHA384C19, SHA384C1a, SHA384C1b, + SHA384C1c, SHA384C1d, SHA384C1e, SHA384C1f, + SHA384C20, SHA384C21, SHA384C22, SHA384C23, + SHA384C24, SHA384C25, SHA384C26, SHA384C27, + SHA384C28, SHA384C29, SHA384C2a, SHA384C2b, + SHA384C2c, SHA384C2d, SHA384C2e, SHA384C2f, + SHA384C30, SHA384C31, SHA384C32, SHA384C33, + SHA384C34, SHA384C35, SHA384C36, SHA384C37, + SHA384C38, SHA384C39, SHA384C3a, SHA384C3b, + SHA384C3c, SHA384C3d, SHA384C3e, SHA384C3f, + SHA384C40, SHA384C41, SHA384C42, SHA384C43, + SHA384C44, SHA384C45, SHA384C46, SHA384C47, + SHA384C48, SHA384C49, SHA384C4a, SHA384C4b, + SHA384C4c, SHA384C4d, SHA384C4e, SHA384C4f, +}; + +static void sha384_transform (const u64 w0[4], const u64 w1[4], const u64 w2[4], const u64 w3[4], u64x digest[8]) +{ + u64x a = digest[0]; + u64x b = digest[1]; + u64x c = digest[2]; + u64x d = digest[3]; + u64x e = digest[4]; + u64x f = digest[5]; + u64x g = digest[6]; + u64x h = digest[7]; + + u64x w0_t = swap_workaround (w0[0]); + u64x w1_t = swap_workaround (w0[1]); + u64x w2_t = swap_workaround (w0[2]); + u64x w3_t = swap_workaround (w0[3]); + u64x w4_t = swap_workaround (w1[0]); + u64x w5_t = swap_workaround (w1[1]); + u64x w6_t = swap_workaround (w1[2]); + u64x w7_t = swap_workaround (w1[3]); + u64x w8_t = swap_workaround (w2[0]); + u64x w9_t = swap_workaround (w2[1]); + u64x wa_t = swap_workaround (w2[2]); + u64x wb_t = swap_workaround (w2[3]); + u64x wc_t = swap_workaround (w3[0]); + u64x wd_t = swap_workaround (w3[1]); + u64x we_t = swap_workaround (w3[2]); + u64x wf_t = swap_workaround (w3[3]); + + #define ROUND384_EXPAND() \ + { \ + w0_t = SHA384_EXPAND (we_t, w9_t, w1_t, w0_t); \ + w1_t = SHA384_EXPAND (wf_t, wa_t, w2_t, w1_t); \ + w2_t = SHA384_EXPAND (w0_t, wb_t, w3_t, w2_t); \ + w3_t = SHA384_EXPAND (w1_t, wc_t, w4_t, w3_t); \ + w4_t = SHA384_EXPAND (w2_t, wd_t, w5_t, w4_t); \ + w5_t = SHA384_EXPAND (w3_t, we_t, w6_t, w5_t); \ + w6_t = SHA384_EXPAND (w4_t, wf_t, w7_t, w6_t); \ + w7_t = SHA384_EXPAND (w5_t, w0_t, w8_t, w7_t); \ + w8_t = SHA384_EXPAND (w6_t, w1_t, w9_t, w8_t); \ + w9_t = SHA384_EXPAND (w7_t, w2_t, wa_t, w9_t); \ + wa_t = SHA384_EXPAND (w8_t, w3_t, wb_t, wa_t); \ + wb_t = SHA384_EXPAND (w9_t, w4_t, wc_t, wb_t); \ + wc_t = SHA384_EXPAND (wa_t, w5_t, wd_t, wc_t); \ + wd_t = SHA384_EXPAND (wb_t, w6_t, we_t, wd_t); \ + we_t = SHA384_EXPAND (wc_t, w7_t, wf_t, we_t); \ + wf_t = SHA384_EXPAND (wd_t, w8_t, w0_t, wf_t); \ + } + + #define ROUND384_STEP(i) \ + { \ + SHA384_STEP (SHA384_F0o, SHA384_F1o, a, b, c, d, e, f, g, h, w0_t, k_sha384[i + 0]); \ + SHA384_STEP (SHA384_F0o, SHA384_F1o, h, a, b, c, d, e, f, g, w1_t, k_sha384[i + 1]); \ + SHA384_STEP (SHA384_F0o, SHA384_F1o, g, h, a, b, c, d, e, f, w2_t, k_sha384[i + 2]); \ + SHA384_STEP (SHA384_F0o, SHA384_F1o, f, g, h, a, b, c, d, e, w3_t, k_sha384[i + 3]); \ + SHA384_STEP (SHA384_F0o, SHA384_F1o, e, f, g, h, a, b, c, d, w4_t, k_sha384[i + 4]); \ + SHA384_STEP (SHA384_F0o, SHA384_F1o, d, e, f, g, h, a, b, c, w5_t, k_sha384[i + 5]); \ + SHA384_STEP (SHA384_F0o, SHA384_F1o, c, d, e, f, g, h, a, b, w6_t, k_sha384[i + 6]); \ + SHA384_STEP (SHA384_F0o, SHA384_F1o, b, c, d, e, f, g, h, a, w7_t, k_sha384[i + 7]); \ + SHA384_STEP (SHA384_F0o, SHA384_F1o, a, b, c, d, e, f, g, h, w8_t, k_sha384[i + 8]); \ + SHA384_STEP (SHA384_F0o, SHA384_F1o, h, a, b, c, d, e, f, g, w9_t, k_sha384[i + 9]); \ + SHA384_STEP (SHA384_F0o, SHA384_F1o, g, h, a, b, c, d, e, f, wa_t, k_sha384[i + 10]); \ + SHA384_STEP (SHA384_F0o, SHA384_F1o, f, g, h, a, b, c, d, e, wb_t, k_sha384[i + 11]); \ + SHA384_STEP (SHA384_F0o, SHA384_F1o, e, f, g, h, a, b, c, d, wc_t, k_sha384[i + 12]); \ + SHA384_STEP (SHA384_F0o, SHA384_F1o, d, e, f, g, h, a, b, c, wd_t, k_sha384[i + 13]); \ + SHA384_STEP (SHA384_F0o, SHA384_F1o, c, d, e, f, g, h, a, b, we_t, k_sha384[i + 14]); \ + SHA384_STEP (SHA384_F0o, SHA384_F1o, b, c, d, e, f, g, h, a, wf_t, k_sha384[i + 15]); \ + } + + ROUND384_STEP (0); + + #pragma unroll + for (int i = 16; i < 80; i += 16) + { + ROUND384_EXPAND (); ROUND384_STEP (i); + } + + digest[0] += a; + digest[1] += b; + digest[2] += c; + digest[3] += d; + digest[4] += e; + digest[5] += f; + digest[6] += g; + digest[7] += h; +} + +__constant u64 k_sha512[80] = +{ + SHA384C00, SHA384C01, SHA384C02, SHA384C03, + SHA384C04, SHA384C05, SHA384C06, SHA384C07, + SHA384C08, SHA384C09, SHA384C0a, SHA384C0b, + SHA384C0c, SHA384C0d, SHA384C0e, SHA384C0f, + SHA384C10, SHA384C11, SHA384C12, SHA384C13, + SHA384C14, SHA384C15, SHA384C16, SHA384C17, + SHA384C18, SHA384C19, SHA384C1a, SHA384C1b, + SHA384C1c, SHA384C1d, SHA384C1e, SHA384C1f, + SHA384C20, SHA384C21, SHA384C22, SHA384C23, + SHA384C24, SHA384C25, SHA384C26, SHA384C27, + SHA384C28, SHA384C29, SHA384C2a, SHA384C2b, + SHA384C2c, SHA384C2d, SHA384C2e, SHA384C2f, + SHA384C30, SHA384C31, SHA384C32, SHA384C33, + SHA384C34, SHA384C35, SHA384C36, SHA384C37, + SHA384C38, SHA384C39, SHA384C3a, SHA384C3b, + SHA384C3c, SHA384C3d, SHA384C3e, SHA384C3f, + SHA384C40, SHA384C41, SHA384C42, SHA384C43, + SHA384C44, SHA384C45, SHA384C46, SHA384C47, + SHA384C48, SHA384C49, SHA384C4a, SHA384C4b, + SHA384C4c, SHA384C4d, SHA384C4e, SHA384C4f, +}; + +static void sha512_transform (const u64 w0[4], const u64 w1[4], const u64 w2[4], const u64 w3[4], u64 digest[8]) +{ + u64x a = digest[0]; + u64x b = digest[1]; + u64x c = digest[2]; + u64x d = digest[3]; + u64x e = digest[4]; + u64x f = digest[5]; + u64x g = digest[6]; + u64x h = digest[7]; + + u64x w0_t = swap_workaround (w0[0]); + u64x w1_t = swap_workaround (w0[1]); + u64x w2_t = swap_workaround (w0[2]); + u64x w3_t = swap_workaround (w0[3]); + u64x w4_t = swap_workaround (w1[0]); + u64x w5_t = swap_workaround (w1[1]); + u64x w6_t = swap_workaround (w1[2]); + u64x w7_t = swap_workaround (w1[3]); + u64x w8_t = swap_workaround (w2[0]); + u64x w9_t = swap_workaround (w2[1]); + u64x wa_t = swap_workaround (w2[2]); + u64x wb_t = swap_workaround (w2[3]); + u64x wc_t = swap_workaround (w3[0]); + u64x wd_t = swap_workaround (w3[1]); + u64x we_t = swap_workaround (w3[2]); + u64x wf_t = swap_workaround (w3[3]); + + #define ROUND512_EXPAND() \ + { \ + w0_t = SHA512_EXPAND (we_t, w9_t, w1_t, w0_t); \ + w1_t = SHA512_EXPAND (wf_t, wa_t, w2_t, w1_t); \ + w2_t = SHA512_EXPAND (w0_t, wb_t, w3_t, w2_t); \ + w3_t = SHA512_EXPAND (w1_t, wc_t, w4_t, w3_t); \ + w4_t = SHA512_EXPAND (w2_t, wd_t, w5_t, w4_t); \ + w5_t = SHA512_EXPAND (w3_t, we_t, w6_t, w5_t); \ + w6_t = SHA512_EXPAND (w4_t, wf_t, w7_t, w6_t); \ + w7_t = SHA512_EXPAND (w5_t, w0_t, w8_t, w7_t); \ + w8_t = SHA512_EXPAND (w6_t, w1_t, w9_t, w8_t); \ + w9_t = SHA512_EXPAND (w7_t, w2_t, wa_t, w9_t); \ + wa_t = SHA512_EXPAND (w8_t, w3_t, wb_t, wa_t); \ + wb_t = SHA512_EXPAND (w9_t, w4_t, wc_t, wb_t); \ + wc_t = SHA512_EXPAND (wa_t, w5_t, wd_t, wc_t); \ + wd_t = SHA512_EXPAND (wb_t, w6_t, we_t, wd_t); \ + we_t = SHA512_EXPAND (wc_t, w7_t, wf_t, we_t); \ + wf_t = SHA512_EXPAND (wd_t, w8_t, w0_t, wf_t); \ + } + + #define ROUND512_STEP(i) \ + { \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, a, b, c, d, e, f, g, h, w0_t, k_sha512[i + 0]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, h, a, b, c, d, e, f, g, w1_t, k_sha512[i + 1]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, g, h, a, b, c, d, e, f, w2_t, k_sha512[i + 2]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, f, g, h, a, b, c, d, e, w3_t, k_sha512[i + 3]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, e, f, g, h, a, b, c, d, w4_t, k_sha512[i + 4]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, d, e, f, g, h, a, b, c, w5_t, k_sha512[i + 5]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, c, d, e, f, g, h, a, b, w6_t, k_sha512[i + 6]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, b, c, d, e, f, g, h, a, w7_t, k_sha512[i + 7]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, a, b, c, d, e, f, g, h, w8_t, k_sha512[i + 8]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, h, a, b, c, d, e, f, g, w9_t, k_sha512[i + 9]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, g, h, a, b, c, d, e, f, wa_t, k_sha512[i + 10]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, f, g, h, a, b, c, d, e, wb_t, k_sha512[i + 11]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, e, f, g, h, a, b, c, d, wc_t, k_sha512[i + 12]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, d, e, f, g, h, a, b, c, wd_t, k_sha512[i + 13]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, c, d, e, f, g, h, a, b, we_t, k_sha512[i + 14]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, b, c, d, e, f, g, h, a, wf_t, k_sha512[i + 15]); \ + } + + ROUND512_STEP (0); + + #pragma unroll + for (int i = 16; i < 80; i += 16) + { + ROUND512_EXPAND (); ROUND512_STEP (i); + } + + digest[0] += a; + digest[1] += b; + digest[2] += c; + digest[3] += d; + digest[4] += e; + digest[5] += f; + digest[6] += g; + digest[7] += h; +} + +__constant u32 te0[256] = +{ + 0xc66363a5, 0xf87c7c84, 0xee777799, 0xf67b7b8d, + 0xfff2f20d, 0xd66b6bbd, 0xde6f6fb1, 0x91c5c554, + 0x60303050, 0x02010103, 0xce6767a9, 0x562b2b7d, + 0xe7fefe19, 0xb5d7d762, 0x4dababe6, 0xec76769a, + 0x8fcaca45, 0x1f82829d, 0x89c9c940, 0xfa7d7d87, + 0xeffafa15, 0xb25959eb, 0x8e4747c9, 0xfbf0f00b, + 0x41adadec, 0xb3d4d467, 0x5fa2a2fd, 0x45afafea, + 0x239c9cbf, 0x53a4a4f7, 0xe4727296, 0x9bc0c05b, + 0x75b7b7c2, 0xe1fdfd1c, 0x3d9393ae, 0x4c26266a, + 0x6c36365a, 0x7e3f3f41, 0xf5f7f702, 0x83cccc4f, + 0x6834345c, 0x51a5a5f4, 0xd1e5e534, 0xf9f1f108, + 0xe2717193, 0xabd8d873, 0x62313153, 0x2a15153f, + 0x0804040c, 0x95c7c752, 0x46232365, 0x9dc3c35e, + 0x30181828, 0x379696a1, 0x0a05050f, 0x2f9a9ab5, + 0x0e070709, 0x24121236, 0x1b80809b, 0xdfe2e23d, + 0xcdebeb26, 0x4e272769, 0x7fb2b2cd, 0xea75759f, + 0x1209091b, 0x1d83839e, 0x582c2c74, 0x341a1a2e, + 0x361b1b2d, 0xdc6e6eb2, 0xb45a5aee, 0x5ba0a0fb, + 0xa45252f6, 0x763b3b4d, 0xb7d6d661, 0x7db3b3ce, + 0x5229297b, 0xdde3e33e, 0x5e2f2f71, 0x13848497, + 0xa65353f5, 0xb9d1d168, 0x00000000, 0xc1eded2c, + 0x40202060, 0xe3fcfc1f, 0x79b1b1c8, 0xb65b5bed, + 0xd46a6abe, 0x8dcbcb46, 0x67bebed9, 0x7239394b, + 0x944a4ade, 0x984c4cd4, 0xb05858e8, 0x85cfcf4a, + 0xbbd0d06b, 0xc5efef2a, 0x4faaaae5, 0xedfbfb16, + 0x864343c5, 0x9a4d4dd7, 0x66333355, 0x11858594, + 0x8a4545cf, 0xe9f9f910, 0x04020206, 0xfe7f7f81, + 0xa05050f0, 0x783c3c44, 0x259f9fba, 0x4ba8a8e3, + 0xa25151f3, 0x5da3a3fe, 0x804040c0, 0x058f8f8a, + 0x3f9292ad, 0x219d9dbc, 0x70383848, 0xf1f5f504, + 0x63bcbcdf, 0x77b6b6c1, 0xafdada75, 0x42212163, + 0x20101030, 0xe5ffff1a, 0xfdf3f30e, 0xbfd2d26d, + 0x81cdcd4c, 0x180c0c14, 0x26131335, 0xc3ecec2f, + 0xbe5f5fe1, 0x359797a2, 0x884444cc, 0x2e171739, + 0x93c4c457, 0x55a7a7f2, 0xfc7e7e82, 0x7a3d3d47, + 0xc86464ac, 0xba5d5de7, 0x3219192b, 0xe6737395, + 0xc06060a0, 0x19818198, 0x9e4f4fd1, 0xa3dcdc7f, + 0x44222266, 0x542a2a7e, 0x3b9090ab, 0x0b888883, + 0x8c4646ca, 0xc7eeee29, 0x6bb8b8d3, 0x2814143c, + 0xa7dede79, 0xbc5e5ee2, 0x160b0b1d, 0xaddbdb76, + 0xdbe0e03b, 0x64323256, 0x743a3a4e, 0x140a0a1e, + 0x924949db, 0x0c06060a, 0x4824246c, 0xb85c5ce4, + 0x9fc2c25d, 0xbdd3d36e, 0x43acacef, 0xc46262a6, + 0x399191a8, 0x319595a4, 0xd3e4e437, 0xf279798b, + 0xd5e7e732, 0x8bc8c843, 0x6e373759, 0xda6d6db7, + 0x018d8d8c, 0xb1d5d564, 0x9c4e4ed2, 0x49a9a9e0, + 0xd86c6cb4, 0xac5656fa, 0xf3f4f407, 0xcfeaea25, + 0xca6565af, 0xf47a7a8e, 0x47aeaee9, 0x10080818, + 0x6fbabad5, 0xf0787888, 0x4a25256f, 0x5c2e2e72, + 0x381c1c24, 0x57a6a6f1, 0x73b4b4c7, 0x97c6c651, + 0xcbe8e823, 0xa1dddd7c, 0xe874749c, 0x3e1f1f21, + 0x964b4bdd, 0x61bdbddc, 0x0d8b8b86, 0x0f8a8a85, + 0xe0707090, 0x7c3e3e42, 0x71b5b5c4, 0xcc6666aa, + 0x904848d8, 0x06030305, 0xf7f6f601, 0x1c0e0e12, + 0xc26161a3, 0x6a35355f, 0xae5757f9, 0x69b9b9d0, + 0x17868691, 0x99c1c158, 0x3a1d1d27, 0x279e9eb9, + 0xd9e1e138, 0xebf8f813, 0x2b9898b3, 0x22111133, + 0xd26969bb, 0xa9d9d970, 0x078e8e89, 0x339494a7, + 0x2d9b9bb6, 0x3c1e1e22, 0x15878792, 0xc9e9e920, + 0x87cece49, 0xaa5555ff, 0x50282878, 0xa5dfdf7a, + 0x038c8c8f, 0x59a1a1f8, 0x09898980, 0x1a0d0d17, + 0x65bfbfda, 0xd7e6e631, 0x844242c6, 0xd06868b8, + 0x824141c3, 0x299999b0, 0x5a2d2d77, 0x1e0f0f11, + 0x7bb0b0cb, 0xa85454fc, 0x6dbbbbd6, 0x2c16163a, +}; + +__constant u32 te1[256] = +{ + 0xa5c66363, 0x84f87c7c, 0x99ee7777, 0x8df67b7b, + 0x0dfff2f2, 0xbdd66b6b, 0xb1de6f6f, 0x5491c5c5, + 0x50603030, 0x03020101, 0xa9ce6767, 0x7d562b2b, + 0x19e7fefe, 0x62b5d7d7, 0xe64dabab, 0x9aec7676, + 0x458fcaca, 0x9d1f8282, 0x4089c9c9, 0x87fa7d7d, + 0x15effafa, 0xebb25959, 0xc98e4747, 0x0bfbf0f0, + 0xec41adad, 0x67b3d4d4, 0xfd5fa2a2, 0xea45afaf, + 0xbf239c9c, 0xf753a4a4, 0x96e47272, 0x5b9bc0c0, + 0xc275b7b7, 0x1ce1fdfd, 0xae3d9393, 0x6a4c2626, + 0x5a6c3636, 0x417e3f3f, 0x02f5f7f7, 0x4f83cccc, + 0x5c683434, 0xf451a5a5, 0x34d1e5e5, 0x08f9f1f1, + 0x93e27171, 0x73abd8d8, 0x53623131, 0x3f2a1515, + 0x0c080404, 0x5295c7c7, 0x65462323, 0x5e9dc3c3, + 0x28301818, 0xa1379696, 0x0f0a0505, 0xb52f9a9a, + 0x090e0707, 0x36241212, 0x9b1b8080, 0x3ddfe2e2, + 0x26cdebeb, 0x694e2727, 0xcd7fb2b2, 0x9fea7575, + 0x1b120909, 0x9e1d8383, 0x74582c2c, 0x2e341a1a, + 0x2d361b1b, 0xb2dc6e6e, 0xeeb45a5a, 0xfb5ba0a0, + 0xf6a45252, 0x4d763b3b, 0x61b7d6d6, 0xce7db3b3, + 0x7b522929, 0x3edde3e3, 0x715e2f2f, 0x97138484, + 0xf5a65353, 0x68b9d1d1, 0x00000000, 0x2cc1eded, + 0x60402020, 0x1fe3fcfc, 0xc879b1b1, 0xedb65b5b, + 0xbed46a6a, 0x468dcbcb, 0xd967bebe, 0x4b723939, + 0xde944a4a, 0xd4984c4c, 0xe8b05858, 0x4a85cfcf, + 0x6bbbd0d0, 0x2ac5efef, 0xe54faaaa, 0x16edfbfb, + 0xc5864343, 0xd79a4d4d, 0x55663333, 0x94118585, + 0xcf8a4545, 0x10e9f9f9, 0x06040202, 0x81fe7f7f, + 0xf0a05050, 0x44783c3c, 0xba259f9f, 0xe34ba8a8, + 0xf3a25151, 0xfe5da3a3, 0xc0804040, 0x8a058f8f, + 0xad3f9292, 0xbc219d9d, 0x48703838, 0x04f1f5f5, + 0xdf63bcbc, 0xc177b6b6, 0x75afdada, 0x63422121, + 0x30201010, 0x1ae5ffff, 0x0efdf3f3, 0x6dbfd2d2, + 0x4c81cdcd, 0x14180c0c, 0x35261313, 0x2fc3ecec, + 0xe1be5f5f, 0xa2359797, 0xcc884444, 0x392e1717, + 0x5793c4c4, 0xf255a7a7, 0x82fc7e7e, 0x477a3d3d, + 0xacc86464, 0xe7ba5d5d, 0x2b321919, 0x95e67373, + 0xa0c06060, 0x98198181, 0xd19e4f4f, 0x7fa3dcdc, + 0x66442222, 0x7e542a2a, 0xab3b9090, 0x830b8888, + 0xca8c4646, 0x29c7eeee, 0xd36bb8b8, 0x3c281414, + 0x79a7dede, 0xe2bc5e5e, 0x1d160b0b, 0x76addbdb, + 0x3bdbe0e0, 0x56643232, 0x4e743a3a, 0x1e140a0a, + 0xdb924949, 0x0a0c0606, 0x6c482424, 0xe4b85c5c, + 0x5d9fc2c2, 0x6ebdd3d3, 0xef43acac, 0xa6c46262, + 0xa8399191, 0xa4319595, 0x37d3e4e4, 0x8bf27979, + 0x32d5e7e7, 0x438bc8c8, 0x596e3737, 0xb7da6d6d, + 0x8c018d8d, 0x64b1d5d5, 0xd29c4e4e, 0xe049a9a9, + 0xb4d86c6c, 0xfaac5656, 0x07f3f4f4, 0x25cfeaea, + 0xafca6565, 0x8ef47a7a, 0xe947aeae, 0x18100808, + 0xd56fbaba, 0x88f07878, 0x6f4a2525, 0x725c2e2e, + 0x24381c1c, 0xf157a6a6, 0xc773b4b4, 0x5197c6c6, + 0x23cbe8e8, 0x7ca1dddd, 0x9ce87474, 0x213e1f1f, + 0xdd964b4b, 0xdc61bdbd, 0x860d8b8b, 0x850f8a8a, + 0x90e07070, 0x427c3e3e, 0xc471b5b5, 0xaacc6666, + 0xd8904848, 0x05060303, 0x01f7f6f6, 0x121c0e0e, + 0xa3c26161, 0x5f6a3535, 0xf9ae5757, 0xd069b9b9, + 0x91178686, 0x5899c1c1, 0x273a1d1d, 0xb9279e9e, + 0x38d9e1e1, 0x13ebf8f8, 0xb32b9898, 0x33221111, + 0xbbd26969, 0x70a9d9d9, 0x89078e8e, 0xa7339494, + 0xb62d9b9b, 0x223c1e1e, 0x92158787, 0x20c9e9e9, + 0x4987cece, 0xffaa5555, 0x78502828, 0x7aa5dfdf, + 0x8f038c8c, 0xf859a1a1, 0x80098989, 0x171a0d0d, + 0xda65bfbf, 0x31d7e6e6, 0xc6844242, 0xb8d06868, + 0xc3824141, 0xb0299999, 0x775a2d2d, 0x111e0f0f, + 0xcb7bb0b0, 0xfca85454, 0xd66dbbbb, 0x3a2c1616, +}; + +__constant u32 te2[256] = +{ + 0x63a5c663, 0x7c84f87c, 0x7799ee77, 0x7b8df67b, + 0xf20dfff2, 0x6bbdd66b, 0x6fb1de6f, 0xc55491c5, + 0x30506030, 0x01030201, 0x67a9ce67, 0x2b7d562b, + 0xfe19e7fe, 0xd762b5d7, 0xabe64dab, 0x769aec76, + 0xca458fca, 0x829d1f82, 0xc94089c9, 0x7d87fa7d, + 0xfa15effa, 0x59ebb259, 0x47c98e47, 0xf00bfbf0, + 0xadec41ad, 0xd467b3d4, 0xa2fd5fa2, 0xafea45af, + 0x9cbf239c, 0xa4f753a4, 0x7296e472, 0xc05b9bc0, + 0xb7c275b7, 0xfd1ce1fd, 0x93ae3d93, 0x266a4c26, + 0x365a6c36, 0x3f417e3f, 0xf702f5f7, 0xcc4f83cc, + 0x345c6834, 0xa5f451a5, 0xe534d1e5, 0xf108f9f1, + 0x7193e271, 0xd873abd8, 0x31536231, 0x153f2a15, + 0x040c0804, 0xc75295c7, 0x23654623, 0xc35e9dc3, + 0x18283018, 0x96a13796, 0x050f0a05, 0x9ab52f9a, + 0x07090e07, 0x12362412, 0x809b1b80, 0xe23ddfe2, + 0xeb26cdeb, 0x27694e27, 0xb2cd7fb2, 0x759fea75, + 0x091b1209, 0x839e1d83, 0x2c74582c, 0x1a2e341a, + 0x1b2d361b, 0x6eb2dc6e, 0x5aeeb45a, 0xa0fb5ba0, + 0x52f6a452, 0x3b4d763b, 0xd661b7d6, 0xb3ce7db3, + 0x297b5229, 0xe33edde3, 0x2f715e2f, 0x84971384, + 0x53f5a653, 0xd168b9d1, 0x00000000, 0xed2cc1ed, + 0x20604020, 0xfc1fe3fc, 0xb1c879b1, 0x5bedb65b, + 0x6abed46a, 0xcb468dcb, 0xbed967be, 0x394b7239, + 0x4ade944a, 0x4cd4984c, 0x58e8b058, 0xcf4a85cf, + 0xd06bbbd0, 0xef2ac5ef, 0xaae54faa, 0xfb16edfb, + 0x43c58643, 0x4dd79a4d, 0x33556633, 0x85941185, + 0x45cf8a45, 0xf910e9f9, 0x02060402, 0x7f81fe7f, + 0x50f0a050, 0x3c44783c, 0x9fba259f, 0xa8e34ba8, + 0x51f3a251, 0xa3fe5da3, 0x40c08040, 0x8f8a058f, + 0x92ad3f92, 0x9dbc219d, 0x38487038, 0xf504f1f5, + 0xbcdf63bc, 0xb6c177b6, 0xda75afda, 0x21634221, + 0x10302010, 0xff1ae5ff, 0xf30efdf3, 0xd26dbfd2, + 0xcd4c81cd, 0x0c14180c, 0x13352613, 0xec2fc3ec, + 0x5fe1be5f, 0x97a23597, 0x44cc8844, 0x17392e17, + 0xc45793c4, 0xa7f255a7, 0x7e82fc7e, 0x3d477a3d, + 0x64acc864, 0x5de7ba5d, 0x192b3219, 0x7395e673, + 0x60a0c060, 0x81981981, 0x4fd19e4f, 0xdc7fa3dc, + 0x22664422, 0x2a7e542a, 0x90ab3b90, 0x88830b88, + 0x46ca8c46, 0xee29c7ee, 0xb8d36bb8, 0x143c2814, + 0xde79a7de, 0x5ee2bc5e, 0x0b1d160b, 0xdb76addb, + 0xe03bdbe0, 0x32566432, 0x3a4e743a, 0x0a1e140a, + 0x49db9249, 0x060a0c06, 0x246c4824, 0x5ce4b85c, + 0xc25d9fc2, 0xd36ebdd3, 0xacef43ac, 0x62a6c462, + 0x91a83991, 0x95a43195, 0xe437d3e4, 0x798bf279, + 0xe732d5e7, 0xc8438bc8, 0x37596e37, 0x6db7da6d, + 0x8d8c018d, 0xd564b1d5, 0x4ed29c4e, 0xa9e049a9, + 0x6cb4d86c, 0x56faac56, 0xf407f3f4, 0xea25cfea, + 0x65afca65, 0x7a8ef47a, 0xaee947ae, 0x08181008, + 0xbad56fba, 0x7888f078, 0x256f4a25, 0x2e725c2e, + 0x1c24381c, 0xa6f157a6, 0xb4c773b4, 0xc65197c6, + 0xe823cbe8, 0xdd7ca1dd, 0x749ce874, 0x1f213e1f, + 0x4bdd964b, 0xbddc61bd, 0x8b860d8b, 0x8a850f8a, + 0x7090e070, 0x3e427c3e, 0xb5c471b5, 0x66aacc66, + 0x48d89048, 0x03050603, 0xf601f7f6, 0x0e121c0e, + 0x61a3c261, 0x355f6a35, 0x57f9ae57, 0xb9d069b9, + 0x86911786, 0xc15899c1, 0x1d273a1d, 0x9eb9279e, + 0xe138d9e1, 0xf813ebf8, 0x98b32b98, 0x11332211, + 0x69bbd269, 0xd970a9d9, 0x8e89078e, 0x94a73394, + 0x9bb62d9b, 0x1e223c1e, 0x87921587, 0xe920c9e9, + 0xce4987ce, 0x55ffaa55, 0x28785028, 0xdf7aa5df, + 0x8c8f038c, 0xa1f859a1, 0x89800989, 0x0d171a0d, + 0xbfda65bf, 0xe631d7e6, 0x42c68442, 0x68b8d068, + 0x41c38241, 0x99b02999, 0x2d775a2d, 0x0f111e0f, + 0xb0cb7bb0, 0x54fca854, 0xbbd66dbb, 0x163a2c16, +}; + +__constant u32 te3[256] = +{ + 0x6363a5c6, 0x7c7c84f8, 0x777799ee, 0x7b7b8df6, + 0xf2f20dff, 0x6b6bbdd6, 0x6f6fb1de, 0xc5c55491, + 0x30305060, 0x01010302, 0x6767a9ce, 0x2b2b7d56, + 0xfefe19e7, 0xd7d762b5, 0xababe64d, 0x76769aec, + 0xcaca458f, 0x82829d1f, 0xc9c94089, 0x7d7d87fa, + 0xfafa15ef, 0x5959ebb2, 0x4747c98e, 0xf0f00bfb, + 0xadadec41, 0xd4d467b3, 0xa2a2fd5f, 0xafafea45, + 0x9c9cbf23, 0xa4a4f753, 0x727296e4, 0xc0c05b9b, + 0xb7b7c275, 0xfdfd1ce1, 0x9393ae3d, 0x26266a4c, + 0x36365a6c, 0x3f3f417e, 0xf7f702f5, 0xcccc4f83, + 0x34345c68, 0xa5a5f451, 0xe5e534d1, 0xf1f108f9, + 0x717193e2, 0xd8d873ab, 0x31315362, 0x15153f2a, + 0x04040c08, 0xc7c75295, 0x23236546, 0xc3c35e9d, + 0x18182830, 0x9696a137, 0x05050f0a, 0x9a9ab52f, + 0x0707090e, 0x12123624, 0x80809b1b, 0xe2e23ddf, + 0xebeb26cd, 0x2727694e, 0xb2b2cd7f, 0x75759fea, + 0x09091b12, 0x83839e1d, 0x2c2c7458, 0x1a1a2e34, + 0x1b1b2d36, 0x6e6eb2dc, 0x5a5aeeb4, 0xa0a0fb5b, + 0x5252f6a4, 0x3b3b4d76, 0xd6d661b7, 0xb3b3ce7d, + 0x29297b52, 0xe3e33edd, 0x2f2f715e, 0x84849713, + 0x5353f5a6, 0xd1d168b9, 0x00000000, 0xeded2cc1, + 0x20206040, 0xfcfc1fe3, 0xb1b1c879, 0x5b5bedb6, + 0x6a6abed4, 0xcbcb468d, 0xbebed967, 0x39394b72, + 0x4a4ade94, 0x4c4cd498, 0x5858e8b0, 0xcfcf4a85, + 0xd0d06bbb, 0xefef2ac5, 0xaaaae54f, 0xfbfb16ed, + 0x4343c586, 0x4d4dd79a, 0x33335566, 0x85859411, + 0x4545cf8a, 0xf9f910e9, 0x02020604, 0x7f7f81fe, + 0x5050f0a0, 0x3c3c4478, 0x9f9fba25, 0xa8a8e34b, + 0x5151f3a2, 0xa3a3fe5d, 0x4040c080, 0x8f8f8a05, + 0x9292ad3f, 0x9d9dbc21, 0x38384870, 0xf5f504f1, + 0xbcbcdf63, 0xb6b6c177, 0xdada75af, 0x21216342, + 0x10103020, 0xffff1ae5, 0xf3f30efd, 0xd2d26dbf, + 0xcdcd4c81, 0x0c0c1418, 0x13133526, 0xecec2fc3, + 0x5f5fe1be, 0x9797a235, 0x4444cc88, 0x1717392e, + 0xc4c45793, 0xa7a7f255, 0x7e7e82fc, 0x3d3d477a, + 0x6464acc8, 0x5d5de7ba, 0x19192b32, 0x737395e6, + 0x6060a0c0, 0x81819819, 0x4f4fd19e, 0xdcdc7fa3, + 0x22226644, 0x2a2a7e54, 0x9090ab3b, 0x8888830b, + 0x4646ca8c, 0xeeee29c7, 0xb8b8d36b, 0x14143c28, + 0xdede79a7, 0x5e5ee2bc, 0x0b0b1d16, 0xdbdb76ad, + 0xe0e03bdb, 0x32325664, 0x3a3a4e74, 0x0a0a1e14, + 0x4949db92, 0x06060a0c, 0x24246c48, 0x5c5ce4b8, + 0xc2c25d9f, 0xd3d36ebd, 0xacacef43, 0x6262a6c4, + 0x9191a839, 0x9595a431, 0xe4e437d3, 0x79798bf2, + 0xe7e732d5, 0xc8c8438b, 0x3737596e, 0x6d6db7da, + 0x8d8d8c01, 0xd5d564b1, 0x4e4ed29c, 0xa9a9e049, + 0x6c6cb4d8, 0x5656faac, 0xf4f407f3, 0xeaea25cf, + 0x6565afca, 0x7a7a8ef4, 0xaeaee947, 0x08081810, + 0xbabad56f, 0x787888f0, 0x25256f4a, 0x2e2e725c, + 0x1c1c2438, 0xa6a6f157, 0xb4b4c773, 0xc6c65197, + 0xe8e823cb, 0xdddd7ca1, 0x74749ce8, 0x1f1f213e, + 0x4b4bdd96, 0xbdbddc61, 0x8b8b860d, 0x8a8a850f, + 0x707090e0, 0x3e3e427c, 0xb5b5c471, 0x6666aacc, + 0x4848d890, 0x03030506, 0xf6f601f7, 0x0e0e121c, + 0x6161a3c2, 0x35355f6a, 0x5757f9ae, 0xb9b9d069, + 0x86869117, 0xc1c15899, 0x1d1d273a, 0x9e9eb927, + 0xe1e138d9, 0xf8f813eb, 0x9898b32b, 0x11113322, + 0x6969bbd2, 0xd9d970a9, 0x8e8e8907, 0x9494a733, + 0x9b9bb62d, 0x1e1e223c, 0x87879215, 0xe9e920c9, + 0xcece4987, 0x5555ffaa, 0x28287850, 0xdfdf7aa5, + 0x8c8c8f03, 0xa1a1f859, 0x89898009, 0x0d0d171a, + 0xbfbfda65, 0xe6e631d7, 0x4242c684, 0x6868b8d0, + 0x4141c382, 0x9999b029, 0x2d2d775a, 0x0f0f111e, + 0xb0b0cb7b, 0x5454fca8, 0xbbbbd66d, 0x16163a2c, +}; + +__constant u32 te4[256] = +{ + 0x63636363, 0x7c7c7c7c, 0x77777777, 0x7b7b7b7b, + 0xf2f2f2f2, 0x6b6b6b6b, 0x6f6f6f6f, 0xc5c5c5c5, + 0x30303030, 0x01010101, 0x67676767, 0x2b2b2b2b, + 0xfefefefe, 0xd7d7d7d7, 0xabababab, 0x76767676, + 0xcacacaca, 0x82828282, 0xc9c9c9c9, 0x7d7d7d7d, + 0xfafafafa, 0x59595959, 0x47474747, 0xf0f0f0f0, + 0xadadadad, 0xd4d4d4d4, 0xa2a2a2a2, 0xafafafaf, + 0x9c9c9c9c, 0xa4a4a4a4, 0x72727272, 0xc0c0c0c0, + 0xb7b7b7b7, 0xfdfdfdfd, 0x93939393, 0x26262626, + 0x36363636, 0x3f3f3f3f, 0xf7f7f7f7, 0xcccccccc, + 0x34343434, 0xa5a5a5a5, 0xe5e5e5e5, 0xf1f1f1f1, + 0x71717171, 0xd8d8d8d8, 0x31313131, 0x15151515, + 0x04040404, 0xc7c7c7c7, 0x23232323, 0xc3c3c3c3, + 0x18181818, 0x96969696, 0x05050505, 0x9a9a9a9a, + 0x07070707, 0x12121212, 0x80808080, 0xe2e2e2e2, + 0xebebebeb, 0x27272727, 0xb2b2b2b2, 0x75757575, + 0x09090909, 0x83838383, 0x2c2c2c2c, 0x1a1a1a1a, + 0x1b1b1b1b, 0x6e6e6e6e, 0x5a5a5a5a, 0xa0a0a0a0, + 0x52525252, 0x3b3b3b3b, 0xd6d6d6d6, 0xb3b3b3b3, + 0x29292929, 0xe3e3e3e3, 0x2f2f2f2f, 0x84848484, + 0x53535353, 0xd1d1d1d1, 0x00000000, 0xedededed, + 0x20202020, 0xfcfcfcfc, 0xb1b1b1b1, 0x5b5b5b5b, + 0x6a6a6a6a, 0xcbcbcbcb, 0xbebebebe, 0x39393939, + 0x4a4a4a4a, 0x4c4c4c4c, 0x58585858, 0xcfcfcfcf, + 0xd0d0d0d0, 0xefefefef, 0xaaaaaaaa, 0xfbfbfbfb, + 0x43434343, 0x4d4d4d4d, 0x33333333, 0x85858585, + 0x45454545, 0xf9f9f9f9, 0x02020202, 0x7f7f7f7f, + 0x50505050, 0x3c3c3c3c, 0x9f9f9f9f, 0xa8a8a8a8, + 0x51515151, 0xa3a3a3a3, 0x40404040, 0x8f8f8f8f, + 0x92929292, 0x9d9d9d9d, 0x38383838, 0xf5f5f5f5, + 0xbcbcbcbc, 0xb6b6b6b6, 0xdadadada, 0x21212121, + 0x10101010, 0xffffffff, 0xf3f3f3f3, 0xd2d2d2d2, + 0xcdcdcdcd, 0x0c0c0c0c, 0x13131313, 0xecececec, + 0x5f5f5f5f, 0x97979797, 0x44444444, 0x17171717, + 0xc4c4c4c4, 0xa7a7a7a7, 0x7e7e7e7e, 0x3d3d3d3d, + 0x64646464, 0x5d5d5d5d, 0x19191919, 0x73737373, + 0x60606060, 0x81818181, 0x4f4f4f4f, 0xdcdcdcdc, + 0x22222222, 0x2a2a2a2a, 0x90909090, 0x88888888, + 0x46464646, 0xeeeeeeee, 0xb8b8b8b8, 0x14141414, + 0xdededede, 0x5e5e5e5e, 0x0b0b0b0b, 0xdbdbdbdb, + 0xe0e0e0e0, 0x32323232, 0x3a3a3a3a, 0x0a0a0a0a, + 0x49494949, 0x06060606, 0x24242424, 0x5c5c5c5c, + 0xc2c2c2c2, 0xd3d3d3d3, 0xacacacac, 0x62626262, + 0x91919191, 0x95959595, 0xe4e4e4e4, 0x79797979, + 0xe7e7e7e7, 0xc8c8c8c8, 0x37373737, 0x6d6d6d6d, + 0x8d8d8d8d, 0xd5d5d5d5, 0x4e4e4e4e, 0xa9a9a9a9, + 0x6c6c6c6c, 0x56565656, 0xf4f4f4f4, 0xeaeaeaea, + 0x65656565, 0x7a7a7a7a, 0xaeaeaeae, 0x08080808, + 0xbabababa, 0x78787878, 0x25252525, 0x2e2e2e2e, + 0x1c1c1c1c, 0xa6a6a6a6, 0xb4b4b4b4, 0xc6c6c6c6, + 0xe8e8e8e8, 0xdddddddd, 0x74747474, 0x1f1f1f1f, + 0x4b4b4b4b, 0xbdbdbdbd, 0x8b8b8b8b, 0x8a8a8a8a, + 0x70707070, 0x3e3e3e3e, 0xb5b5b5b5, 0x66666666, + 0x48484848, 0x03030303, 0xf6f6f6f6, 0x0e0e0e0e, + 0x61616161, 0x35353535, 0x57575757, 0xb9b9b9b9, + 0x86868686, 0xc1c1c1c1, 0x1d1d1d1d, 0x9e9e9e9e, + 0xe1e1e1e1, 0xf8f8f8f8, 0x98989898, 0x11111111, + 0x69696969, 0xd9d9d9d9, 0x8e8e8e8e, 0x94949494, + 0x9b9b9b9b, 0x1e1e1e1e, 0x87878787, 0xe9e9e9e9, + 0xcececece, 0x55555555, 0x28282828, 0xdfdfdfdf, + 0x8c8c8c8c, 0xa1a1a1a1, 0x89898989, 0x0d0d0d0d, + 0xbfbfbfbf, 0xe6e6e6e6, 0x42424242, 0x68686868, + 0x41414141, 0x99999999, 0x2d2d2d2d, 0x0f0f0f0f, + 0xb0b0b0b0, 0x54545454, 0xbbbbbbbb, 0x16161616, +}; + +__constant u32 rcon[] = +{ + 0x01000000, 0x02000000, 0x04000000, 0x08000000, + 0x10000000, 0x20000000, 0x40000000, 0x80000000, + 0x1b000000, 0x36000000, +}; + +static void AES128_ExpandKey (u32 *userkey, u32 *rek, __local u32 s_te0[256], __local u32 s_te1[256], __local u32 s_te2[256], __local u32 s_te3[256], __local u32 s_te4[256]) +{ + rek[0] = swap_workaround (userkey[0]); + rek[1] = swap_workaround (userkey[1]); + rek[2] = swap_workaround (userkey[2]); + rek[3] = swap_workaround (userkey[3]); + + for (u32 i = 0, j = 0; i < 10; i += 1, j += 4) + { + u32 temp = rek[j + 3]; + + temp = (s_te2[(temp >> 16) & 0xff] & 0xff000000) + ^ (s_te3[(temp >> 8) & 0xff] & 0x00ff0000) + ^ (s_te0[(temp >> 0) & 0xff] & 0x0000ff00) + ^ (s_te1[(temp >> 24) & 0xff] & 0x000000ff); + + rek[j + 4] = rek[j + 0] + ^ temp + ^ rcon[i]; + + rek[j + 5] = rek[j + 1] ^ rek[j + 4]; + rek[j + 6] = rek[j + 2] ^ rek[j + 5]; + rek[j + 7] = rek[j + 3] ^ rek[j + 6]; + } +} + +static void AES128_encrypt (const u32 *in, u32 *out, const u32 *rek, __local u32 s_te0[256], __local u32 s_te1[256], __local u32 s_te2[256], __local u32 s_te3[256], __local u32 s_te4[256]) +{ + u32 in_swap[4]; + + in_swap[0] = swap_workaround (in[0]); + in_swap[1] = swap_workaround (in[1]); + in_swap[2] = swap_workaround (in[2]); + in_swap[3] = swap_workaround (in[3]); + + u32 s0 = in_swap[0] ^ rek[0]; + u32 s1 = in_swap[1] ^ rek[1]; + u32 s2 = in_swap[2] ^ rek[2]; + u32 s3 = in_swap[3] ^ rek[3]; + + u32 t0; + u32 t1; + u32 t2; + u32 t3; + + t0 = s_te0[s0 >> 24] ^ s_te1[(s1 >> 16) & 0xff] ^ s_te2[(s2 >> 8) & 0xff] ^ s_te3[s3 & 0xff] ^ rek[ 4]; + t1 = s_te0[s1 >> 24] ^ s_te1[(s2 >> 16) & 0xff] ^ s_te2[(s3 >> 8) & 0xff] ^ s_te3[s0 & 0xff] ^ rek[ 5]; + t2 = s_te0[s2 >> 24] ^ s_te1[(s3 >> 16) & 0xff] ^ s_te2[(s0 >> 8) & 0xff] ^ s_te3[s1 & 0xff] ^ rek[ 6]; + t3 = s_te0[s3 >> 24] ^ s_te1[(s0 >> 16) & 0xff] ^ s_te2[(s1 >> 8) & 0xff] ^ s_te3[s2 & 0xff] ^ rek[ 7]; + s0 = s_te0[t0 >> 24] ^ s_te1[(t1 >> 16) & 0xff] ^ s_te2[(t2 >> 8) & 0xff] ^ s_te3[t3 & 0xff] ^ rek[ 8]; + s1 = s_te0[t1 >> 24] ^ s_te1[(t2 >> 16) & 0xff] ^ s_te2[(t3 >> 8) & 0xff] ^ s_te3[t0 & 0xff] ^ rek[ 9]; + s2 = s_te0[t2 >> 24] ^ s_te1[(t3 >> 16) & 0xff] ^ s_te2[(t0 >> 8) & 0xff] ^ s_te3[t1 & 0xff] ^ rek[10]; + s3 = s_te0[t3 >> 24] ^ s_te1[(t0 >> 16) & 0xff] ^ s_te2[(t1 >> 8) & 0xff] ^ s_te3[t2 & 0xff] ^ rek[11]; + t0 = s_te0[s0 >> 24] ^ s_te1[(s1 >> 16) & 0xff] ^ s_te2[(s2 >> 8) & 0xff] ^ s_te3[s3 & 0xff] ^ rek[12]; + t1 = s_te0[s1 >> 24] ^ s_te1[(s2 >> 16) & 0xff] ^ s_te2[(s3 >> 8) & 0xff] ^ s_te3[s0 & 0xff] ^ rek[13]; + t2 = s_te0[s2 >> 24] ^ s_te1[(s3 >> 16) & 0xff] ^ s_te2[(s0 >> 8) & 0xff] ^ s_te3[s1 & 0xff] ^ rek[14]; + t3 = s_te0[s3 >> 24] ^ s_te1[(s0 >> 16) & 0xff] ^ s_te2[(s1 >> 8) & 0xff] ^ s_te3[s2 & 0xff] ^ rek[15]; + s0 = s_te0[t0 >> 24] ^ s_te1[(t1 >> 16) & 0xff] ^ s_te2[(t2 >> 8) & 0xff] ^ s_te3[t3 & 0xff] ^ rek[16]; + s1 = s_te0[t1 >> 24] ^ s_te1[(t2 >> 16) & 0xff] ^ s_te2[(t3 >> 8) & 0xff] ^ s_te3[t0 & 0xff] ^ rek[17]; + s2 = s_te0[t2 >> 24] ^ s_te1[(t3 >> 16) & 0xff] ^ s_te2[(t0 >> 8) & 0xff] ^ s_te3[t1 & 0xff] ^ rek[18]; + s3 = s_te0[t3 >> 24] ^ s_te1[(t0 >> 16) & 0xff] ^ s_te2[(t1 >> 8) & 0xff] ^ s_te3[t2 & 0xff] ^ rek[19]; + t0 = s_te0[s0 >> 24] ^ s_te1[(s1 >> 16) & 0xff] ^ s_te2[(s2 >> 8) & 0xff] ^ s_te3[s3 & 0xff] ^ rek[20]; + t1 = s_te0[s1 >> 24] ^ s_te1[(s2 >> 16) & 0xff] ^ s_te2[(s3 >> 8) & 0xff] ^ s_te3[s0 & 0xff] ^ rek[21]; + t2 = s_te0[s2 >> 24] ^ s_te1[(s3 >> 16) & 0xff] ^ s_te2[(s0 >> 8) & 0xff] ^ s_te3[s1 & 0xff] ^ rek[22]; + t3 = s_te0[s3 >> 24] ^ s_te1[(s0 >> 16) & 0xff] ^ s_te2[(s1 >> 8) & 0xff] ^ s_te3[s2 & 0xff] ^ rek[23]; + s0 = s_te0[t0 >> 24] ^ s_te1[(t1 >> 16) & 0xff] ^ s_te2[(t2 >> 8) & 0xff] ^ s_te3[t3 & 0xff] ^ rek[24]; + s1 = s_te0[t1 >> 24] ^ s_te1[(t2 >> 16) & 0xff] ^ s_te2[(t3 >> 8) & 0xff] ^ s_te3[t0 & 0xff] ^ rek[25]; + s2 = s_te0[t2 >> 24] ^ s_te1[(t3 >> 16) & 0xff] ^ s_te2[(t0 >> 8) & 0xff] ^ s_te3[t1 & 0xff] ^ rek[26]; + s3 = s_te0[t3 >> 24] ^ s_te1[(t0 >> 16) & 0xff] ^ s_te2[(t1 >> 8) & 0xff] ^ s_te3[t2 & 0xff] ^ rek[27]; + t0 = s_te0[s0 >> 24] ^ s_te1[(s1 >> 16) & 0xff] ^ s_te2[(s2 >> 8) & 0xff] ^ s_te3[s3 & 0xff] ^ rek[28]; + t1 = s_te0[s1 >> 24] ^ s_te1[(s2 >> 16) & 0xff] ^ s_te2[(s3 >> 8) & 0xff] ^ s_te3[s0 & 0xff] ^ rek[29]; + t2 = s_te0[s2 >> 24] ^ s_te1[(s3 >> 16) & 0xff] ^ s_te2[(s0 >> 8) & 0xff] ^ s_te3[s1 & 0xff] ^ rek[30]; + t3 = s_te0[s3 >> 24] ^ s_te1[(s0 >> 16) & 0xff] ^ s_te2[(s1 >> 8) & 0xff] ^ s_te3[s2 & 0xff] ^ rek[31]; + s0 = s_te0[t0 >> 24] ^ s_te1[(t1 >> 16) & 0xff] ^ s_te2[(t2 >> 8) & 0xff] ^ s_te3[t3 & 0xff] ^ rek[32]; + s1 = s_te0[t1 >> 24] ^ s_te1[(t2 >> 16) & 0xff] ^ s_te2[(t3 >> 8) & 0xff] ^ s_te3[t0 & 0xff] ^ rek[33]; + s2 = s_te0[t2 >> 24] ^ s_te1[(t3 >> 16) & 0xff] ^ s_te2[(t0 >> 8) & 0xff] ^ s_te3[t1 & 0xff] ^ rek[34]; + s3 = s_te0[t3 >> 24] ^ s_te1[(t0 >> 16) & 0xff] ^ s_te2[(t1 >> 8) & 0xff] ^ s_te3[t2 & 0xff] ^ rek[35]; + t0 = s_te0[s0 >> 24] ^ s_te1[(s1 >> 16) & 0xff] ^ s_te2[(s2 >> 8) & 0xff] ^ s_te3[s3 & 0xff] ^ rek[36]; + t1 = s_te0[s1 >> 24] ^ s_te1[(s2 >> 16) & 0xff] ^ s_te2[(s3 >> 8) & 0xff] ^ s_te3[s0 & 0xff] ^ rek[37]; + t2 = s_te0[s2 >> 24] ^ s_te1[(s3 >> 16) & 0xff] ^ s_te2[(s0 >> 8) & 0xff] ^ s_te3[s1 & 0xff] ^ rek[38]; + t3 = s_te0[s3 >> 24] ^ s_te1[(s0 >> 16) & 0xff] ^ s_te2[(s1 >> 8) & 0xff] ^ s_te3[s2 & 0xff] ^ rek[39]; + + out[0] = (s_te4[(t0 >> 24) & 0xff] & 0xff000000) + ^ (s_te4[(t1 >> 16) & 0xff] & 0x00ff0000) + ^ (s_te4[(t2 >> 8) & 0xff] & 0x0000ff00) + ^ (s_te4[(t3 >> 0) & 0xff] & 0x000000ff) + ^ rek[40]; + + out[1] = (s_te4[(t1 >> 24) & 0xff] & 0xff000000) + ^ (s_te4[(t2 >> 16) & 0xff] & 0x00ff0000) + ^ (s_te4[(t3 >> 8) & 0xff] & 0x0000ff00) + ^ (s_te4[(t0 >> 0) & 0xff] & 0x000000ff) + ^ rek[41]; + + out[2] = (s_te4[(t2 >> 24) & 0xff] & 0xff000000) + ^ (s_te4[(t3 >> 16) & 0xff] & 0x00ff0000) + ^ (s_te4[(t0 >> 8) & 0xff] & 0x0000ff00) + ^ (s_te4[(t1 >> 0) & 0xff] & 0x000000ff) + ^ rek[42]; + + out[3] = (s_te4[(t3 >> 24) & 0xff] & 0xff000000) + ^ (s_te4[(t0 >> 16) & 0xff] & 0x00ff0000) + ^ (s_te4[(t1 >> 8) & 0xff] & 0x0000ff00) + ^ (s_te4[(t2 >> 0) & 0xff] & 0x000000ff) + ^ rek[43]; + + out[0] = swap_workaround (out[0]); + out[1] = swap_workaround (out[1]); + out[2] = swap_workaround (out[2]); + out[3] = swap_workaround (out[3]); +} + +static void memcat8 (u32x block0[4], u32x block1[4], u32x block2[4], u32x block3[4], const u32 block_len, const u32 append[2]) +{ + switch (block_len) + { + case 0: + block0[0] = append[0]; + block0[1] = append[1]; + break; + + case 1: + block0[0] = block0[0] | append[0] << 8; + block0[1] = append[0] >> 24 | append[1] << 8; + block0[2] = append[1] >> 24; + break; + + case 2: + block0[0] = block0[0] | append[0] << 16; + block0[1] = append[0] >> 16 | append[1] << 16; + block0[2] = append[1] >> 16; + break; + + case 3: + block0[0] = block0[0] | append[0] << 24; + block0[1] = append[0] >> 8 | append[1] << 24; + block0[2] = append[1] >> 8; + break; + + case 4: + block0[1] = append[0]; + block0[2] = append[1]; + break; + + case 5: + block0[1] = block0[1] | append[0] << 8; + block0[2] = append[0] >> 24 | append[1] << 8; + block0[3] = append[1] >> 24; + break; + + case 6: + block0[1] = block0[1] | append[0] << 16; + block0[2] = append[0] >> 16 | append[1] << 16; + block0[3] = append[1] >> 16; + break; + + case 7: + block0[1] = block0[1] | append[0] << 24; + block0[2] = append[0] >> 8 | append[1] << 24; + block0[3] = append[1] >> 8; + break; + + case 8: + block0[2] = append[0]; + block0[3] = append[1]; + break; + + case 9: + block0[2] = block0[2] | append[0] << 8; + block0[3] = append[0] >> 24 | append[1] << 8; + block1[0] = append[1] >> 24; + break; + + case 10: + block0[2] = block0[2] | append[0] << 16; + block0[3] = append[0] >> 16 | append[1] << 16; + block1[0] = append[1] >> 16; + break; + + case 11: + block0[2] = block0[2] | append[0] << 24; + block0[3] = append[0] >> 8 | append[1] << 24; + block1[0] = append[1] >> 8; + break; + + case 12: + block0[3] = append[0]; + block1[0] = append[1]; + break; + + case 13: + block0[3] = block0[3] | append[0] << 8; + block1[0] = append[0] >> 24 | append[1] << 8; + block1[1] = append[1] >> 24; + break; + + case 14: + block0[3] = block0[3] | append[0] << 16; + block1[0] = append[0] >> 16 | append[1] << 16; + block1[1] = append[1] >> 16; + break; + + case 15: + block0[3] = block0[3] | append[0] << 24; + block1[0] = append[0] >> 8 | append[1] << 24; + block1[1] = append[1] >> 8; + break; + + case 16: + block1[0] = append[0]; + block1[1] = append[1]; + break; + + case 17: + block1[0] = block1[0] | append[0] << 8; + block1[1] = append[0] >> 24 | append[1] << 8; + block1[2] = append[1] >> 24; + break; + + case 18: + block1[0] = block1[0] | append[0] << 16; + block1[1] = append[0] >> 16 | append[1] << 16; + block1[2] = append[1] >> 16; + break; + + case 19: + block1[0] = block1[0] | append[0] << 24; + block1[1] = append[0] >> 8 | append[1] << 24; + block1[2] = append[1] >> 8; + break; + + case 20: + block1[1] = append[0]; + block1[2] = append[1]; + break; + + case 21: + block1[1] = block1[1] | append[0] << 8; + block1[2] = append[0] >> 24 | append[1] << 8; + block1[3] = append[1] >> 24; + break; + + case 22: + block1[1] = block1[1] | append[0] << 16; + block1[2] = append[0] >> 16 | append[1] << 16; + block1[3] = append[1] >> 16; + break; + + case 23: + block1[1] = block1[1] | append[0] << 24; + block1[2] = append[0] >> 8 | append[1] << 24; + block1[3] = append[1] >> 8; + break; + + case 24: + block1[2] = append[0]; + block1[3] = append[1]; + break; + + case 25: + block1[2] = block1[2] | append[0] << 8; + block1[3] = append[0] >> 24 | append[1] << 8; + block2[0] = append[1] >> 24; + break; + + case 26: + block1[2] = block1[2] | append[0] << 16; + block1[3] = append[0] >> 16 | append[1] << 16; + block2[0] = append[1] >> 16; + break; + + case 27: + block1[2] = block1[2] | append[0] << 24; + block1[3] = append[0] >> 8 | append[1] << 24; + block2[0] = append[1] >> 8; + break; + + case 28: + block1[3] = append[0]; + block2[0] = append[1]; + break; + + case 29: + block1[3] = block1[3] | append[0] << 8; + block2[0] = append[0] >> 24 | append[1] << 8; + block2[1] = append[1] >> 24; + break; + + case 30: + block1[3] = block1[3] | append[0] << 16; + block2[0] = append[0] >> 16 | append[1] << 16; + block2[1] = append[1] >> 16; + break; + + case 31: + block1[3] = block1[3] | append[0] << 24; + block2[0] = append[0] >> 8 | append[1] << 24; + block2[1] = append[1] >> 8; + break; + + case 32: + block2[0] = append[0]; + block2[1] = append[1]; + break; + + case 33: + block2[0] = block2[0] | append[0] << 8; + block2[1] = append[0] >> 24 | append[1] << 8; + block2[2] = append[1] >> 24; + break; + + case 34: + block2[0] = block2[0] | append[0] << 16; + block2[1] = append[0] >> 16 | append[1] << 16; + block2[2] = append[1] >> 16; + break; + + case 35: + block2[0] = block2[0] | append[0] << 24; + block2[1] = append[0] >> 8 | append[1] << 24; + block2[2] = append[1] >> 8; + break; + + case 36: + block2[1] = append[0]; + block2[2] = append[1]; + break; + + case 37: + block2[1] = block2[1] | append[0] << 8; + block2[2] = append[0] >> 24 | append[1] << 8; + block2[3] = append[1] >> 24; + break; + + case 38: + block2[1] = block2[1] | append[0] << 16; + block2[2] = append[0] >> 16 | append[1] << 16; + block2[3] = append[1] >> 16; + break; + + case 39: + block2[1] = block2[1] | append[0] << 24; + block2[2] = append[0] >> 8 | append[1] << 24; + block2[3] = append[1] >> 8; + break; + + case 40: + block2[2] = append[0]; + block2[3] = append[1]; + break; + + case 41: + block2[2] = block2[2] | append[0] << 8; + block2[3] = append[0] >> 24 | append[1] << 8; + block3[0] = append[1] >> 24; + break; + + case 42: + block2[2] = block2[2] | append[0] << 16; + block2[3] = append[0] >> 16 | append[1] << 16; + block3[0] = append[1] >> 16; + break; + + case 43: + block2[2] = block2[2] | append[0] << 24; + block2[3] = append[0] >> 8 | append[1] << 24; + block3[0] = append[1] >> 8; + break; + + case 44: + block2[3] = append[0]; + block3[0] = append[1]; + break; + + case 45: + block2[3] = block2[3] | append[0] << 8; + block3[0] = append[0] >> 24 | append[1] << 8; + block3[1] = append[1] >> 24; + break; + + case 46: + block2[3] = block2[3] | append[0] << 16; + block3[0] = append[0] >> 16 | append[1] << 16; + block3[1] = append[1] >> 16; + break; + + case 47: + block2[3] = block2[3] | append[0] << 24; + block3[0] = append[0] >> 8 | append[1] << 24; + block3[1] = append[1] >> 8; + break; + + case 48: + block3[0] = append[0]; + block3[1] = append[1]; + break; + + case 49: + block3[0] = block3[0] | append[0] << 8; + block3[1] = append[0] >> 24 | append[1] << 8; + block3[2] = append[1] >> 24; + break; + + case 50: + block3[0] = block3[0] | append[0] << 16; + block3[1] = append[0] >> 16 | append[1] << 16; + block3[2] = append[1] >> 16; + break; + + case 51: + block3[0] = block3[0] | append[0] << 24; + block3[1] = append[0] >> 8 | append[1] << 24; + block3[2] = append[1] >> 8; + break; + + case 52: + block3[1] = append[0]; + block3[2] = append[1]; + break; + + case 53: + block3[1] = block3[1] | append[0] << 8; + block3[2] = append[0] >> 24 | append[1] << 8; + block3[3] = append[1] >> 24; + break; + + case 54: + block3[1] = block3[1] | append[0] << 16; + block3[2] = append[0] >> 16 | append[1] << 16; + block3[3] = append[1] >> 16; + break; + + case 55: + block3[1] = block3[1] | append[0] << 24; + block3[2] = append[0] >> 8 | append[1] << 24; + block3[3] = append[1] >> 8; + break; + + case 56: + block3[2] = append[0]; + block3[3] = append[1]; + break; + } +} + +#define AESSZ 16 // AES_BLOCK_SIZE + +#define BLSZ256 32 +#define BLSZ384 48 +#define BLSZ512 64 + +#define WORDSZ256 64 +#define WORDSZ384 128 +#define WORDSZ512 128 + +#define PWMAXSZ 32 // oclHashcat password length limit +#define BLMAXSZ BLSZ512 +#define WORDMAXSZ WORDSZ512 + +#define PWMAXSZ4 (PWMAXSZ / 4) +#define BLMAXSZ4 (BLMAXSZ / 4) +#define WORDMAXSZ4 (WORDMAXSZ / 4) +#define AESSZ4 (AESSZ / 4) + +static void make_sc (u32 *sc, const u32 *pw, const u32 pw_len, const u32 *bl, const u32 bl_len) +{ + const u32 bd = bl_len / 4; + + const u32 pm = pw_len % 4; + const u32 pd = pw_len / 4; + + u32 idx = 0; + + if (pm == 0) + { + for (u32 i = 0; i < pd; i++) sc[idx++] = pw[i]; + for (u32 i = 0; i < bd; i++) sc[idx++] = bl[i]; + for (u32 i = 0; i < 4; i++) sc[idx++] = sc[i]; + } + else + { + u32 pm4 = 4 - pm; + + u32 i; + + for (i = 0; i < pd; i++) sc[idx++] = pw[i]; + sc[idx++] = pw[i] + | amd_bytealign (bl[0], 0, pm4); + for (i = 1; i < bd; i++) sc[idx++] = amd_bytealign (bl[i], bl[i - 1], pm4); + sc[idx++] = amd_bytealign (sc[0], bl[i - 1], pm4); + for (i = 1; i < 4; i++) sc[idx++] = amd_bytealign (sc[i], sc[i - 1], pm4); + sc[idx++] = amd_bytealign ( 0, sc[i - 1], pm4); + } +} + +static void make_pt_with_offset (u32 *pt, const u32 offset, const u32 *sc, const u32 pwbl_len) +{ + const u32 m = offset % pwbl_len; + + const u32 om = m % 4; + const u32 od = m / 4; + + pt[0] = amd_bytealign (sc[od + 1], sc[od + 0], om); + pt[1] = amd_bytealign (sc[od + 2], sc[od + 1], om); + pt[2] = amd_bytealign (sc[od + 3], sc[od + 2], om); + pt[3] = amd_bytealign (sc[od + 4], sc[od + 3], om); +} + +static void make_w_with_offset (ctx_t *ctx, const u32 W_len, const u32 offset, const u32 *sc, const u32 pwbl_len, u32 *iv, const u32 *rek, __local u32 s_te0[256], __local u32 s_te1[256], __local u32 s_te2[256], __local u32 s_te3[256], __local u32 s_te4[256]) +{ + for (u32 k = 0, wk = 0; k < W_len; k += AESSZ, wk += AESSZ4) + { + u32 pt[AESSZ4]; + + make_pt_with_offset (pt, offset + k, sc, pwbl_len); + + pt[0] ^= iv[0]; + pt[1] ^= iv[1]; + pt[2] ^= iv[2]; + pt[3] ^= iv[3]; + + AES128_encrypt (pt, iv, rek, s_te0, s_te1, s_te2, s_te3, s_te4); + + ctx->W32[wk + 0] = iv[0]; + ctx->W32[wk + 1] = iv[1]; + ctx->W32[wk + 2] = iv[2]; + ctx->W32[wk + 3] = iv[3]; + } +} + +static u32 do_round (const u32 *pw, const u32 pw_len, ctx_t *ctx, __local u32 s_te0[256], __local u32 s_te1[256], __local u32 s_te2[256], __local u32 s_te3[256], __local u32 s_te4[256]) +{ + // make scratch buffer + + u32 sc[PWMAXSZ4 + BLMAXSZ4 + AESSZ4]; + + make_sc (sc, pw, pw_len, ctx->dgst32, ctx->dgst_len); + + // make sure pwbl_len is calculcated before it gets changed + + const u32 pwbl_len = pw_len + ctx->dgst_len; + + // init iv + + u32 iv[AESSZ4]; + + iv[0] = ctx->dgst32[4]; + iv[1] = ctx->dgst32[5]; + iv[2] = ctx->dgst32[6]; + iv[3] = ctx->dgst32[7]; + + // init aes + + u32 rek[60]; + + AES128_ExpandKey (ctx->dgst32, rek, s_te0, s_te1, s_te2, s_te3, s_te4); + + // first call is special as the hash depends on the result of it + // but since we do not know about the outcome at this time + // we must use the max + + make_w_with_offset (ctx, WORDMAXSZ, 0, sc, pwbl_len, iv, rek, s_te0, s_te1, s_te2, s_te3, s_te4); + + // now we can find out hash to use + + u32 sum = 0; + + for (u32 i = 0; i < 4; i++) + { + sum += (ctx->W32[i] >> 24) & 0xff; + sum += (ctx->W32[i] >> 16) & 0xff; + sum += (ctx->W32[i] >> 8) & 0xff; + sum += (ctx->W32[i] >> 0) & 0xff; + } + + // init hash + + switch (sum % 3) + { + case 0: ctx->dgst32[0] = SHA256M_A; + ctx->dgst32[1] = SHA256M_B; + ctx->dgst32[2] = SHA256M_C; + ctx->dgst32[3] = SHA256M_D; + ctx->dgst32[4] = SHA256M_E; + ctx->dgst32[5] = SHA256M_F; + ctx->dgst32[6] = SHA256M_G; + ctx->dgst32[7] = SHA256M_H; + ctx->dgst_len = BLSZ256; + ctx->W_len = WORDSZ256; + sha256_transform (&ctx->W32[ 0], &ctx->W32[ 4], &ctx->W32[ 8], &ctx->W32[12], ctx->dgst32); + sha256_transform (&ctx->W32[16], &ctx->W32[20], &ctx->W32[24], &ctx->W32[28], ctx->dgst32); + break; + case 1: ctx->dgst64[0] = SHA384M_A; + ctx->dgst64[1] = SHA384M_B; + ctx->dgst64[2] = SHA384M_C; + ctx->dgst64[3] = SHA384M_D; + ctx->dgst64[4] = SHA384M_E; + ctx->dgst64[5] = SHA384M_F; + ctx->dgst64[6] = SHA384M_G; + ctx->dgst64[7] = SHA384M_H; + ctx->dgst_len = BLSZ384; + ctx->W_len = WORDSZ384; + sha384_transform (&ctx->W64[ 0], &ctx->W64[ 4], &ctx->W64[ 8], &ctx->W64[12], ctx->dgst64); + break; + case 2: ctx->dgst64[0] = SHA512M_A; + ctx->dgst64[1] = SHA512M_B; + ctx->dgst64[2] = SHA512M_C; + ctx->dgst64[3] = SHA512M_D; + ctx->dgst64[4] = SHA512M_E; + ctx->dgst64[5] = SHA512M_F; + ctx->dgst64[6] = SHA512M_G; + ctx->dgst64[7] = SHA512M_H; + ctx->dgst_len = BLSZ512; + ctx->W_len = WORDSZ512; + sha512_transform (&ctx->W64[ 0], &ctx->W64[ 4], &ctx->W64[ 8], &ctx->W64[12], ctx->dgst64); + break; + } + + // main loop + + const u32 final_len = pwbl_len * 64; + + const u32 iter_max = ctx->W_len - (ctx->W_len / 8); + + u32 offset; + u32 left; + + for (offset = WORDMAXSZ, left = final_len - offset; left >= iter_max; offset += ctx->W_len, left -= ctx->W_len) + { + make_w_with_offset (ctx, ctx->W_len, offset, sc, pwbl_len, iv, rek, s_te0, s_te1, s_te2, s_te3, s_te4); + + switch (ctx->dgst_len) + { + case BLSZ256: sha256_transform (&ctx->W32[ 0], &ctx->W32[ 4], &ctx->W32[ 8], &ctx->W32[12], ctx->dgst32); + break; + case BLSZ384: sha384_transform (&ctx->W64[ 0], &ctx->W64[ 4], &ctx->W64[ 8], &ctx->W64[12], ctx->dgst64); + break; + case BLSZ512: sha512_transform (&ctx->W64[ 0], &ctx->W64[ 4], &ctx->W64[ 8], &ctx->W64[12], ctx->dgst64); + break; + } + } + + u32 ex = 0; + + if (left) + { + switch (ctx->dgst_len) + { + case BLSZ384: make_w_with_offset (ctx, 64, offset, sc, pwbl_len, iv, rek, s_te0, s_te1, s_te2, s_te3, s_te4); + ctx->W64[ 8] = 0x80; + ctx->W64[ 9] = 0; + ctx->W64[10] = 0; + ctx->W64[11] = 0; + ctx->W64[12] = 0; + ctx->W64[13] = 0; + ctx->W64[14] = 0; + ctx->W64[15] = swap_workaround ((u64) (final_len * 8)); + ex = ctx->W64[7] >> 56; + break; + case BLSZ512: make_w_with_offset (ctx, 64, offset, sc, pwbl_len, iv, rek, s_te0, s_te1, s_te2, s_te3, s_te4); + ctx->W64[ 8] = 0x80; + ctx->W64[ 9] = 0; + ctx->W64[10] = 0; + ctx->W64[11] = 0; + ctx->W64[12] = 0; + ctx->W64[13] = 0; + ctx->W64[14] = 0; + ctx->W64[15] = swap_workaround ((u64) (final_len * 8)); + ex = ctx->W64[7] >> 56; + break; + } + } + else + { + switch (ctx->dgst_len) + { + case BLSZ256: ex = ctx->W32[15] >> 24; + ctx->W32[ 0] = 0x80; + ctx->W32[ 1] = 0; + ctx->W32[ 2] = 0; + ctx->W32[ 3] = 0; + ctx->W32[ 4] = 0; + ctx->W32[ 5] = 0; + ctx->W32[ 6] = 0; + ctx->W32[ 7] = 0; + ctx->W32[ 8] = 0; + ctx->W32[ 9] = 0; + ctx->W32[10] = 0; + ctx->W32[11] = 0; + ctx->W32[12] = 0; + ctx->W32[13] = 0; + ctx->W32[14] = 0; + ctx->W32[15] = swap_workaround (final_len * 8); + break; + case BLSZ384: ex = ctx->W64[15] >> 56; + ctx->W64[ 0] = 0x80; + ctx->W64[ 1] = 0; + ctx->W64[ 2] = 0; + ctx->W64[ 3] = 0; + ctx->W64[ 4] = 0; + ctx->W64[ 5] = 0; + ctx->W64[ 6] = 0; + ctx->W64[ 7] = 0; + ctx->W64[ 8] = 0; + ctx->W64[ 9] = 0; + ctx->W64[10] = 0; + ctx->W64[11] = 0; + ctx->W64[12] = 0; + ctx->W64[13] = 0; + ctx->W64[14] = 0; + ctx->W64[15] = swap_workaround ((u64) (final_len * 8)); + break; + case BLSZ512: ex = ctx->W64[15] >> 56; + ctx->W64[ 0] = 0x80; + ctx->W64[ 1] = 0; + ctx->W64[ 2] = 0; + ctx->W64[ 3] = 0; + ctx->W64[ 4] = 0; + ctx->W64[ 5] = 0; + ctx->W64[ 6] = 0; + ctx->W64[ 7] = 0; + ctx->W64[ 8] = 0; + ctx->W64[ 9] = 0; + ctx->W64[10] = 0; + ctx->W64[11] = 0; + ctx->W64[12] = 0; + ctx->W64[13] = 0; + ctx->W64[14] = 0; + ctx->W64[15] = swap_workaround ((u64) (final_len * 8)); + break; + } + } + + switch (ctx->dgst_len) + { + case BLSZ256: sha256_transform (&ctx->W32[ 0], &ctx->W32[ 4], &ctx->W32[ 8], &ctx->W32[12], ctx->dgst32); + ctx->dgst32[ 0] = swap_workaround (ctx->dgst32[0]); + ctx->dgst32[ 1] = swap_workaround (ctx->dgst32[1]); + ctx->dgst32[ 2] = swap_workaround (ctx->dgst32[2]); + ctx->dgst32[ 3] = swap_workaround (ctx->dgst32[3]); + ctx->dgst32[ 4] = swap_workaround (ctx->dgst32[4]); + ctx->dgst32[ 5] = swap_workaround (ctx->dgst32[5]); + ctx->dgst32[ 6] = swap_workaround (ctx->dgst32[6]); + ctx->dgst32[ 7] = swap_workaround (ctx->dgst32[7]); + ctx->dgst32[ 8] = 0; + ctx->dgst32[ 9] = 0; + ctx->dgst32[10] = 0; + ctx->dgst32[11] = 0; + ctx->dgst32[12] = 0; + ctx->dgst32[13] = 0; + ctx->dgst32[14] = 0; + ctx->dgst32[15] = 0; + break; + case BLSZ384: sha384_transform (&ctx->W64[ 0], &ctx->W64[ 4], &ctx->W64[ 8], &ctx->W64[12], ctx->dgst64); + ctx->dgst64[0] = swap_workaround (ctx->dgst64[0]); + ctx->dgst64[1] = swap_workaround (ctx->dgst64[1]); + ctx->dgst64[2] = swap_workaround (ctx->dgst64[2]); + ctx->dgst64[3] = swap_workaround (ctx->dgst64[3]); + ctx->dgst64[4] = swap_workaround (ctx->dgst64[4]); + ctx->dgst64[5] = swap_workaround (ctx->dgst64[5]); + ctx->dgst64[6] = 0; + ctx->dgst64[7] = 0; + break; + case BLSZ512: sha512_transform (&ctx->W64[ 0], &ctx->W64[ 4], &ctx->W64[ 8], &ctx->W64[12], ctx->dgst64); + ctx->dgst64[0] = swap_workaround (ctx->dgst64[0]); + ctx->dgst64[1] = swap_workaround (ctx->dgst64[1]); + ctx->dgst64[2] = swap_workaround (ctx->dgst64[2]); + ctx->dgst64[3] = swap_workaround (ctx->dgst64[3]); + ctx->dgst64[4] = swap_workaround (ctx->dgst64[4]); + ctx->dgst64[5] = swap_workaround (ctx->dgst64[5]); + ctx->dgst64[6] = swap_workaround (ctx->dgst64[6]); + ctx->dgst64[7] = swap_workaround (ctx->dgst64[7]); + break; + } + + return ex; +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m10700_init (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global pdf17l8_tmp_t *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global pdf_t *pdf_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[0]; + w0[1] = pws[gid].i[1]; + w0[2] = pws[gid].i[2]; + w0[3] = pws[gid].i[3]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * salt + */ + + u32 salt_buf[2]; + + salt_buf[0] = salt_bufs[salt_pos].salt_buf[0]; + salt_buf[1] = salt_bufs[salt_pos].salt_buf[1]; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + /** + * init + */ + + u32 block_len = pw_len; + + u32x block0[4]; + + block0[0] = w0[0]; + block0[1] = w0[1]; + block0[2] = w0[2]; + block0[3] = w0[3]; + + u32x block1[4]; + + block1[0] = 0; + block1[1] = 0; + block1[2] = 0; + block1[3] = 0; + + u32x block2[4]; + + block2[0] = 0; + block2[1] = 0; + block2[2] = 0; + block2[3] = 0; + + u32x block3[4]; + + block3[0] = 0; + block3[1] = 0; + block3[2] = 0; + block3[3] = 0; + + memcat8 (block0, block1, block2, block3, block_len, salt_buf); + + block_len += salt_len; + + append_0x80_2 (block0, block1, block_len); + + block3[3] = swap_workaround (block_len * 8); + + u32x digest[8]; + + digest[0] = SHA256M_A; + digest[1] = SHA256M_B; + digest[2] = SHA256M_C; + digest[3] = SHA256M_D; + digest[4] = SHA256M_E; + digest[5] = SHA256M_F; + digest[6] = SHA256M_G; + digest[7] = SHA256M_H; + + sha256_transform (block0, block1, block2, block3, digest); + + digest[0] = swap_workaround (digest[0]); + digest[1] = swap_workaround (digest[1]); + digest[2] = swap_workaround (digest[2]); + digest[3] = swap_workaround (digest[3]); + digest[4] = swap_workaround (digest[4]); + digest[5] = swap_workaround (digest[5]); + digest[6] = swap_workaround (digest[6]); + digest[7] = swap_workaround (digest[7]); + + tmps[gid].dgst32[0] = digest[0]; + tmps[gid].dgst32[1] = digest[1]; + tmps[gid].dgst32[2] = digest[2]; + tmps[gid].dgst32[3] = digest[3]; + tmps[gid].dgst32[4] = digest[4]; + tmps[gid].dgst32[5] = digest[5]; + tmps[gid].dgst32[6] = digest[6]; + tmps[gid].dgst32[7] = digest[7]; + tmps[gid].dgst_len = BLSZ256; + tmps[gid].W_len = WORDSZ256; +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m10700_loop (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global pdf17l8_tmp_t *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global pdf_t *pdf_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + const u32 gid = get_global_id (0); + const u32 lid = get_local_id (0); + + /** + * aes shared + */ + + const u32 lid4 = lid * 4; + + __local u32 s_te0[256]; + __local u32 s_te1[256]; + __local u32 s_te2[256]; + __local u32 s_te3[256]; + __local u32 s_te4[256]; + + s_te0[lid4 + 0] = te0[lid4 + 0]; + s_te0[lid4 + 1] = te0[lid4 + 1]; + s_te0[lid4 + 2] = te0[lid4 + 2]; + s_te0[lid4 + 3] = te0[lid4 + 3]; + + s_te1[lid4 + 0] = te1[lid4 + 0]; + s_te1[lid4 + 1] = te1[lid4 + 1]; + s_te1[lid4 + 2] = te1[lid4 + 2]; + s_te1[lid4 + 3] = te1[lid4 + 3]; + + s_te2[lid4 + 0] = te2[lid4 + 0]; + s_te2[lid4 + 1] = te2[lid4 + 1]; + s_te2[lid4 + 2] = te2[lid4 + 2]; + s_te2[lid4 + 3] = te2[lid4 + 3]; + + s_te3[lid4 + 0] = te3[lid4 + 0]; + s_te3[lid4 + 1] = te3[lid4 + 1]; + s_te3[lid4 + 2] = te3[lid4 + 2]; + s_te3[lid4 + 3] = te3[lid4 + 3]; + + s_te4[lid4 + 0] = te4[lid4 + 0]; + s_te4[lid4 + 1] = te4[lid4 + 1]; + s_te4[lid4 + 2] = te4[lid4 + 2]; + s_te4[lid4 + 3] = te4[lid4 + 3]; + + barrier (CLK_LOCAL_MEM_FENCE); + + if (gid >= gid_max) return; + + /** + * base + */ + + u32x w0[4]; + + w0[0] = pws[gid].i[0]; + w0[1] = pws[gid].i[1]; + w0[2] = pws[gid].i[2]; + w0[3] = pws[gid].i[3]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * digest + */ + + ctx_t ctx; + + ctx.dgst64[0] = tmps[gid].dgst64[0]; + ctx.dgst64[1] = tmps[gid].dgst64[1]; + ctx.dgst64[2] = tmps[gid].dgst64[2]; + ctx.dgst64[3] = tmps[gid].dgst64[3]; + ctx.dgst64[4] = tmps[gid].dgst64[4]; + ctx.dgst64[5] = tmps[gid].dgst64[5]; + ctx.dgst64[6] = tmps[gid].dgst64[6]; + ctx.dgst64[7] = tmps[gid].dgst64[7]; + ctx.dgst_len = tmps[gid].dgst_len; + ctx.W_len = tmps[gid].W_len; + + u32 ex = 0; + + for (u32 i = 0, j = loop_pos; i < loop_cnt; i++, j++) + { + ex = do_round (w0, pw_len, &ctx, s_te0, s_te1, s_te2, s_te3, s_te4); + } + + if ((loop_pos + loop_cnt) == 64) + { + for (u32 i = 64; i < ex + 32; i++) + { + ex = do_round (w0, pw_len, &ctx, s_te0, s_te1, s_te2, s_te3, s_te4); + } + } + + tmps[gid].dgst64[0] = ctx.dgst64[0]; + tmps[gid].dgst64[1] = ctx.dgst64[1]; + tmps[gid].dgst64[2] = ctx.dgst64[2]; + tmps[gid].dgst64[3] = ctx.dgst64[3]; + tmps[gid].dgst64[4] = ctx.dgst64[4]; + tmps[gid].dgst64[5] = ctx.dgst64[5]; + tmps[gid].dgst64[6] = ctx.dgst64[6]; + tmps[gid].dgst64[7] = ctx.dgst64[7]; + tmps[gid].dgst_len = ctx.dgst_len; + tmps[gid].W_len = ctx.W_len; +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m10700_comp (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global pdf17l8_tmp_t *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global pdf_t *pdf_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + const u32 lid = get_local_id (0); + + /** + * digest + */ + + const u32x r0 = swap_workaround (tmps[gid].dgst32[DGST_R0]); + const u32x r1 = swap_workaround (tmps[gid].dgst32[DGST_R1]); + const u32x r2 = swap_workaround (tmps[gid].dgst32[DGST_R2]); + const u32x r3 = swap_workaround (tmps[gid].dgst32[DGST_R3]); + + #define il_pos 0 + + #include VECT_COMPARE_M +} diff --git a/amd/m10800_a0.cl b/amd/m10800_a0.cl new file mode 100644 index 0000000000..9de9af34e0 --- /dev/null +++ b/amd/m10800_a0.cl @@ -0,0 +1,431 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _SHA384_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW4 +#define VECT_SIZE1 +#endif + +#ifdef VLIW5 +#define VECT_SIZE1 +#endif + +#define DGST_R0 6 +#define DGST_R1 7 +#define DGST_R2 4 +#define DGST_R3 5 + +#include "include/kernel_functions.c" +#include "types_amd.c" +#include "common_amd.c" +#include "include/rp_gpu.h" +#include "rp_amd.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +__constant u64 k_sha384[80] = +{ + SHA384C00, SHA384C01, SHA384C02, SHA384C03, + SHA384C04, SHA384C05, SHA384C06, SHA384C07, + SHA384C08, SHA384C09, SHA384C0a, SHA384C0b, + SHA384C0c, SHA384C0d, SHA384C0e, SHA384C0f, + SHA384C10, SHA384C11, SHA384C12, SHA384C13, + SHA384C14, SHA384C15, SHA384C16, SHA384C17, + SHA384C18, SHA384C19, SHA384C1a, SHA384C1b, + SHA384C1c, SHA384C1d, SHA384C1e, SHA384C1f, + SHA384C20, SHA384C21, SHA384C22, SHA384C23, + SHA384C24, SHA384C25, SHA384C26, SHA384C27, + SHA384C28, SHA384C29, SHA384C2a, SHA384C2b, + SHA384C2c, SHA384C2d, SHA384C2e, SHA384C2f, + SHA384C30, SHA384C31, SHA384C32, SHA384C33, + SHA384C34, SHA384C35, SHA384C36, SHA384C37, + SHA384C38, SHA384C39, SHA384C3a, SHA384C3b, + SHA384C3c, SHA384C3d, SHA384C3e, SHA384C3f, + SHA384C40, SHA384C41, SHA384C42, SHA384C43, + SHA384C44, SHA384C45, SHA384C46, SHA384C47, + SHA384C48, SHA384C49, SHA384C4a, SHA384C4b, + SHA384C4c, SHA384C4d, SHA384C4e, SHA384C4f, +}; + +static void sha384_transform (const u32x w0[4], const u32x w1[4], const u32x w2[4], const u32x w3[4], u64x digest[8]) +{ + u64x w0_t = hl32_to_64 (w0[0], w0[1]); + u64x w1_t = hl32_to_64 (w0[2], w0[3]); + u64x w2_t = hl32_to_64 (w1[0], w1[1]); + u64x w3_t = hl32_to_64 (w1[2], w1[3]); + u64x w4_t = hl32_to_64 (w2[0], w2[1]); + u64x w5_t = hl32_to_64 (w2[2], w2[3]); + u64x w6_t = hl32_to_64 (w3[0], w3[1]); + u64x w7_t = 0; + u64x w8_t = 0; + u64x w9_t = 0; + u64x wa_t = 0; + u64x wb_t = 0; + u64x wc_t = 0; + u64x wd_t = 0; + u64x we_t = 0; + u64x wf_t = hl32_to_64 (w3[2], w3[3]); + + u64x a = digest[0]; + u64x b = digest[1]; + u64x c = digest[2]; + u64x d = digest[3]; + u64x e = digest[4]; + u64x f = digest[5]; + u64x g = digest[6]; + u64x h = digest[7]; + + #define ROUND_EXPAND() \ + { \ + w0_t = SHA384_EXPAND (we_t, w9_t, w1_t, w0_t); \ + w1_t = SHA384_EXPAND (wf_t, wa_t, w2_t, w1_t); \ + w2_t = SHA384_EXPAND (w0_t, wb_t, w3_t, w2_t); \ + w3_t = SHA384_EXPAND (w1_t, wc_t, w4_t, w3_t); \ + w4_t = SHA384_EXPAND (w2_t, wd_t, w5_t, w4_t); \ + w5_t = SHA384_EXPAND (w3_t, we_t, w6_t, w5_t); \ + w6_t = SHA384_EXPAND (w4_t, wf_t, w7_t, w6_t); \ + w7_t = SHA384_EXPAND (w5_t, w0_t, w8_t, w7_t); \ + w8_t = SHA384_EXPAND (w6_t, w1_t, w9_t, w8_t); \ + w9_t = SHA384_EXPAND (w7_t, w2_t, wa_t, w9_t); \ + wa_t = SHA384_EXPAND (w8_t, w3_t, wb_t, wa_t); \ + wb_t = SHA384_EXPAND (w9_t, w4_t, wc_t, wb_t); \ + wc_t = SHA384_EXPAND (wa_t, w5_t, wd_t, wc_t); \ + wd_t = SHA384_EXPAND (wb_t, w6_t, we_t, wd_t); \ + we_t = SHA384_EXPAND (wc_t, w7_t, wf_t, we_t); \ + wf_t = SHA384_EXPAND (wd_t, w8_t, w0_t, wf_t); \ + } + + #define ROUND_STEP(i) \ + { \ + SHA384_STEP (SHA384_F0o, SHA384_F1o, a, b, c, d, e, f, g, h, w0_t, k_sha384[i + 0]); \ + SHA384_STEP (SHA384_F0o, SHA384_F1o, h, a, b, c, d, e, f, g, w1_t, k_sha384[i + 1]); \ + SHA384_STEP (SHA384_F0o, SHA384_F1o, g, h, a, b, c, d, e, f, w2_t, k_sha384[i + 2]); \ + SHA384_STEP (SHA384_F0o, SHA384_F1o, f, g, h, a, b, c, d, e, w3_t, k_sha384[i + 3]); \ + SHA384_STEP (SHA384_F0o, SHA384_F1o, e, f, g, h, a, b, c, d, w4_t, k_sha384[i + 4]); \ + SHA384_STEP (SHA384_F0o, SHA384_F1o, d, e, f, g, h, a, b, c, w5_t, k_sha384[i + 5]); \ + SHA384_STEP (SHA384_F0o, SHA384_F1o, c, d, e, f, g, h, a, b, w6_t, k_sha384[i + 6]); \ + SHA384_STEP (SHA384_F0o, SHA384_F1o, b, c, d, e, f, g, h, a, w7_t, k_sha384[i + 7]); \ + SHA384_STEP (SHA384_F0o, SHA384_F1o, a, b, c, d, e, f, g, h, w8_t, k_sha384[i + 8]); \ + SHA384_STEP (SHA384_F0o, SHA384_F1o, h, a, b, c, d, e, f, g, w9_t, k_sha384[i + 9]); \ + SHA384_STEP (SHA384_F0o, SHA384_F1o, g, h, a, b, c, d, e, f, wa_t, k_sha384[i + 10]); \ + SHA384_STEP (SHA384_F0o, SHA384_F1o, f, g, h, a, b, c, d, e, wb_t, k_sha384[i + 11]); \ + SHA384_STEP (SHA384_F0o, SHA384_F1o, e, f, g, h, a, b, c, d, wc_t, k_sha384[i + 12]); \ + SHA384_STEP (SHA384_F0o, SHA384_F1o, d, e, f, g, h, a, b, c, wd_t, k_sha384[i + 13]); \ + SHA384_STEP (SHA384_F0o, SHA384_F1o, c, d, e, f, g, h, a, b, we_t, k_sha384[i + 14]); \ + SHA384_STEP (SHA384_F0o, SHA384_F1o, b, c, d, e, f, g, h, a, wf_t, k_sha384[i + 15]); \ + } + + ROUND_STEP (0); + + ROUND_EXPAND (); ROUND_STEP (16); + ROUND_EXPAND (); ROUND_STEP (32); + ROUND_EXPAND (); ROUND_STEP (48); + ROUND_EXPAND (); ROUND_STEP (64); + + /* rev + digest[0] += a; + digest[1] += b; + digest[2] += c; + digest[3] += d; + digest[4] += e; + digest[5] += f; + digest[6] += g; + digest[7] += h; + */ + + digest[0] = a; + digest[1] = b; + digest[2] = c; + digest[3] = d; + digest[4] = e; + digest[5] = f; + digest[6] = 0; + digest[7] = 0; +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m10800_m04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + u32x pw_buf1[4]; + + pw_buf1[0] = pws[gid].i[ 4]; + pw_buf1[1] = pws[gid].i[ 5]; + pw_buf1[2] = pws[gid].i[ 6]; + pw_buf1[3] = pws[gid].i[ 7]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + + w0[0] = pw_buf0[0]; + w0[1] = pw_buf0[1]; + w0[2] = pw_buf0[2]; + w0[3] = pw_buf0[3]; + + u32x w1[4]; + + w1[0] = pw_buf1[0]; + w1[1] = pw_buf1[1]; + w1[2] = pw_buf1[2]; + w1[3] = pw_buf1[3]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 out_len = apply_rules (rules_buf[il_pos].cmds, w0, w1, pw_len); + + append_0x80_2 (w0, w1, out_len); + + /** + * SHA384 + */ + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + w0_t[0] = swap_workaround (w0[0]); + w0_t[1] = swap_workaround (w0[1]); + w0_t[2] = swap_workaround (w0[2]); + w0_t[3] = swap_workaround (w0[3]); + w1_t[0] = swap_workaround (w1[0]); + w1_t[1] = swap_workaround (w1[1]); + w1_t[2] = swap_workaround (w1[2]); + w1_t[3] = swap_workaround (w1[3]); + w2_t[0] = swap_workaround (w2[0]); + w2_t[1] = swap_workaround (w2[1]); + w2_t[2] = swap_workaround (w2[2]); + w2_t[3] = swap_workaround (w2[3]); + w3_t[0] = swap_workaround (w3[0]); + w3_t[1] = swap_workaround (w3[1]); + w3_t[2] = 0; + w3_t[3] = out_len * 8; + + u64x digest[8]; + + digest[0] = SHA384M_A; + digest[1] = SHA384M_B; + digest[2] = SHA384M_C; + digest[3] = SHA384M_D; + digest[4] = SHA384M_E; + digest[5] = SHA384M_F; + digest[6] = SHA384M_G; + digest[7] = SHA384M_H; + + sha384_transform (w0_t, w1_t, w2_t, w3_t, digest); + + const u32x r0 = l32_from_64 (digest[3]); + const u32x r1 = h32_from_64 (digest[3]); + const u32x r2 = l32_from_64 (digest[2]); + const u32x r3 = h32_from_64 (digest[2]); + + #include VECT_COMPARE_M + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m10800_m08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m10800_m16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m10800_s04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + u32x pw_buf1[4]; + + pw_buf1[0] = pws[gid].i[ 4]; + pw_buf1[1] = pws[gid].i[ 5]; + pw_buf1[2] = pws[gid].i[ 6]; + pw_buf1[3] = pws[gid].i[ 7]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + + w0[0] = pw_buf0[0]; + w0[1] = pw_buf0[1]; + w0[2] = pw_buf0[2]; + w0[3] = pw_buf0[3]; + + u32x w1[4]; + + w1[0] = pw_buf1[0]; + w1[1] = pw_buf1[1]; + w1[2] = pw_buf1[2]; + w1[3] = pw_buf1[3]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 out_len = apply_rules (rules_buf[il_pos].cmds, w0, w1, pw_len); + + append_0x80_2 (w0, w1, out_len); + + /** + * SHA384 + */ + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + w0_t[0] = swap_workaround (w0[0]); + w0_t[1] = swap_workaround (w0[1]); + w0_t[2] = swap_workaround (w0[2]); + w0_t[3] = swap_workaround (w0[3]); + w1_t[0] = swap_workaround (w1[0]); + w1_t[1] = swap_workaround (w1[1]); + w1_t[2] = swap_workaround (w1[2]); + w1_t[3] = swap_workaround (w1[3]); + w2_t[0] = swap_workaround (w2[0]); + w2_t[1] = swap_workaround (w2[1]); + w2_t[2] = swap_workaround (w2[2]); + w2_t[3] = swap_workaround (w2[3]); + w3_t[0] = swap_workaround (w3[0]); + w3_t[1] = swap_workaround (w3[1]); + w3_t[2] = 0; + w3_t[3] = out_len * 8; + + u64x digest[8]; + + digest[0] = SHA384M_A; + digest[1] = SHA384M_B; + digest[2] = SHA384M_C; + digest[3] = SHA384M_D; + digest[4] = SHA384M_E; + digest[5] = SHA384M_F; + digest[6] = SHA384M_G; + digest[7] = SHA384M_H; + + sha384_transform (w0_t, w1_t, w2_t, w3_t, digest); + + const u32x r0 = l32_from_64 (digest[3]); + const u32x r1 = h32_from_64 (digest[3]); + const u32x r2 = l32_from_64 (digest[2]); + const u32x r3 = h32_from_64 (digest[2]); + + #include VECT_COMPARE_S + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m10800_s08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m10800_s16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/amd/m10800_a1.cl b/amd/m10800_a1.cl new file mode 100644 index 0000000000..75608e590f --- /dev/null +++ b/amd/m10800_a1.cl @@ -0,0 +1,529 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _SHA384_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW4 +#define VECT_SIZE1 +#endif + +#ifdef VLIW5 +#define VECT_SIZE1 +#endif + +#define DGST_R0 6 +#define DGST_R1 7 +#define DGST_R2 4 +#define DGST_R3 5 + +#include "include/kernel_functions.c" +#include "types_amd.c" +#include "common_amd.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +__constant u64 k_sha384[80] = +{ + SHA384C00, SHA384C01, SHA384C02, SHA384C03, + SHA384C04, SHA384C05, SHA384C06, SHA384C07, + SHA384C08, SHA384C09, SHA384C0a, SHA384C0b, + SHA384C0c, SHA384C0d, SHA384C0e, SHA384C0f, + SHA384C10, SHA384C11, SHA384C12, SHA384C13, + SHA384C14, SHA384C15, SHA384C16, SHA384C17, + SHA384C18, SHA384C19, SHA384C1a, SHA384C1b, + SHA384C1c, SHA384C1d, SHA384C1e, SHA384C1f, + SHA384C20, SHA384C21, SHA384C22, SHA384C23, + SHA384C24, SHA384C25, SHA384C26, SHA384C27, + SHA384C28, SHA384C29, SHA384C2a, SHA384C2b, + SHA384C2c, SHA384C2d, SHA384C2e, SHA384C2f, + SHA384C30, SHA384C31, SHA384C32, SHA384C33, + SHA384C34, SHA384C35, SHA384C36, SHA384C37, + SHA384C38, SHA384C39, SHA384C3a, SHA384C3b, + SHA384C3c, SHA384C3d, SHA384C3e, SHA384C3f, + SHA384C40, SHA384C41, SHA384C42, SHA384C43, + SHA384C44, SHA384C45, SHA384C46, SHA384C47, + SHA384C48, SHA384C49, SHA384C4a, SHA384C4b, + SHA384C4c, SHA384C4d, SHA384C4e, SHA384C4f, +}; + +static void sha384_transform (const u32x w0[4], const u32x w1[4], const u32x w2[4], const u32x w3[4], u64x digest[8]) +{ + u64x w0_t = hl32_to_64 (w0[0], w0[1]); + u64x w1_t = hl32_to_64 (w0[2], w0[3]); + u64x w2_t = hl32_to_64 (w1[0], w1[1]); + u64x w3_t = hl32_to_64 (w1[2], w1[3]); + u64x w4_t = hl32_to_64 (w2[0], w2[1]); + u64x w5_t = hl32_to_64 (w2[2], w2[3]); + u64x w6_t = hl32_to_64 (w3[0], w3[1]); + u64x w7_t = 0; + u64x w8_t = 0; + u64x w9_t = 0; + u64x wa_t = 0; + u64x wb_t = 0; + u64x wc_t = 0; + u64x wd_t = 0; + u64x we_t = 0; + u64x wf_t = hl32_to_64 (w3[2], w3[3]); + + u64x a = digest[0]; + u64x b = digest[1]; + u64x c = digest[2]; + u64x d = digest[3]; + u64x e = digest[4]; + u64x f = digest[5]; + u64x g = digest[6]; + u64x h = digest[7]; + + #define ROUND_EXPAND() \ + { \ + w0_t = SHA384_EXPAND (we_t, w9_t, w1_t, w0_t); \ + w1_t = SHA384_EXPAND (wf_t, wa_t, w2_t, w1_t); \ + w2_t = SHA384_EXPAND (w0_t, wb_t, w3_t, w2_t); \ + w3_t = SHA384_EXPAND (w1_t, wc_t, w4_t, w3_t); \ + w4_t = SHA384_EXPAND (w2_t, wd_t, w5_t, w4_t); \ + w5_t = SHA384_EXPAND (w3_t, we_t, w6_t, w5_t); \ + w6_t = SHA384_EXPAND (w4_t, wf_t, w7_t, w6_t); \ + w7_t = SHA384_EXPAND (w5_t, w0_t, w8_t, w7_t); \ + w8_t = SHA384_EXPAND (w6_t, w1_t, w9_t, w8_t); \ + w9_t = SHA384_EXPAND (w7_t, w2_t, wa_t, w9_t); \ + wa_t = SHA384_EXPAND (w8_t, w3_t, wb_t, wa_t); \ + wb_t = SHA384_EXPAND (w9_t, w4_t, wc_t, wb_t); \ + wc_t = SHA384_EXPAND (wa_t, w5_t, wd_t, wc_t); \ + wd_t = SHA384_EXPAND (wb_t, w6_t, we_t, wd_t); \ + we_t = SHA384_EXPAND (wc_t, w7_t, wf_t, we_t); \ + wf_t = SHA384_EXPAND (wd_t, w8_t, w0_t, wf_t); \ + } + + #define ROUND_STEP(i) \ + { \ + SHA384_STEP (SHA384_F0o, SHA384_F1o, a, b, c, d, e, f, g, h, w0_t, k_sha384[i + 0]); \ + SHA384_STEP (SHA384_F0o, SHA384_F1o, h, a, b, c, d, e, f, g, w1_t, k_sha384[i + 1]); \ + SHA384_STEP (SHA384_F0o, SHA384_F1o, g, h, a, b, c, d, e, f, w2_t, k_sha384[i + 2]); \ + SHA384_STEP (SHA384_F0o, SHA384_F1o, f, g, h, a, b, c, d, e, w3_t, k_sha384[i + 3]); \ + SHA384_STEP (SHA384_F0o, SHA384_F1o, e, f, g, h, a, b, c, d, w4_t, k_sha384[i + 4]); \ + SHA384_STEP (SHA384_F0o, SHA384_F1o, d, e, f, g, h, a, b, c, w5_t, k_sha384[i + 5]); \ + SHA384_STEP (SHA384_F0o, SHA384_F1o, c, d, e, f, g, h, a, b, w6_t, k_sha384[i + 6]); \ + SHA384_STEP (SHA384_F0o, SHA384_F1o, b, c, d, e, f, g, h, a, w7_t, k_sha384[i + 7]); \ + SHA384_STEP (SHA384_F0o, SHA384_F1o, a, b, c, d, e, f, g, h, w8_t, k_sha384[i + 8]); \ + SHA384_STEP (SHA384_F0o, SHA384_F1o, h, a, b, c, d, e, f, g, w9_t, k_sha384[i + 9]); \ + SHA384_STEP (SHA384_F0o, SHA384_F1o, g, h, a, b, c, d, e, f, wa_t, k_sha384[i + 10]); \ + SHA384_STEP (SHA384_F0o, SHA384_F1o, f, g, h, a, b, c, d, e, wb_t, k_sha384[i + 11]); \ + SHA384_STEP (SHA384_F0o, SHA384_F1o, e, f, g, h, a, b, c, d, wc_t, k_sha384[i + 12]); \ + SHA384_STEP (SHA384_F0o, SHA384_F1o, d, e, f, g, h, a, b, c, wd_t, k_sha384[i + 13]); \ + SHA384_STEP (SHA384_F0o, SHA384_F1o, c, d, e, f, g, h, a, b, we_t, k_sha384[i + 14]); \ + SHA384_STEP (SHA384_F0o, SHA384_F1o, b, c, d, e, f, g, h, a, wf_t, k_sha384[i + 15]); \ + } + + ROUND_STEP (0); + + ROUND_EXPAND (); ROUND_STEP (16); + ROUND_EXPAND (); ROUND_STEP (32); + ROUND_EXPAND (); ROUND_STEP (48); + ROUND_EXPAND (); ROUND_STEP (64); + + /* rev + digest[0] += a; + digest[1] += b; + digest[2] += c; + digest[3] += d; + digest[4] += e; + digest[5] += f; + digest[6] += g; + digest[7] += h; + */ + + digest[0] = a; + digest[1] = b; + digest[2] = c; + digest[3] = d; + digest[4] = e; + digest[5] = f; + digest[6] = 0; + digest[7] = 0; +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m10800_m04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + append_0x80_2 (wordl0, wordl1, pw_l_len); + + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, combs_buf[0].pw_len); + } + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = combs_buf[il_pos].pw_len; + + const u32 pw_len = pw_l_len + pw_r_len; + + u32 wordr0[4]; + + wordr0[0] = combs_buf[il_pos].i[0]; + wordr0[1] = combs_buf[il_pos].i[1]; + wordr0[2] = combs_buf[il_pos].i[2]; + wordr0[3] = combs_buf[il_pos].i[3]; + + u32 wordr1[4]; + + wordr1[0] = combs_buf[il_pos].i[4]; + wordr1[1] = combs_buf[il_pos].i[5]; + wordr1[2] = combs_buf[il_pos].i[6]; + wordr1[3] = combs_buf[il_pos].i[7]; + + u32 wordr2[4]; + + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + + u32 wordr3[4]; + + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + append_0x80_2 (wordr0, wordr1, pw_r_len); + + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + u32x w0[4]; + u32x w1[4]; + u32x w2[4]; + u32x w3[4]; + + w0[0] = wordl0[0] | wordr0[0]; + w0[1] = wordl0[1] | wordr0[1]; + w0[2] = wordl0[2] | wordr0[2]; + w0[3] = wordl0[3] | wordr0[3]; + w1[0] = wordl1[0] | wordr1[0]; + w1[1] = wordl1[1] | wordr1[1]; + w1[2] = wordl1[2] | wordr1[2]; + w1[3] = wordl1[3] | wordr1[3]; + w2[0] = wordl2[0] | wordr2[0]; + w2[1] = wordl2[1] | wordr2[1]; + w2[2] = wordl2[2] | wordr2[2]; + w2[3] = wordl2[3] | wordr2[3]; + w3[0] = wordl3[0] | wordr3[0]; + w3[1] = wordl3[1] | wordr3[1]; + w3[2] = wordl3[2] | wordr3[2]; + w3[3] = wordl3[3] | wordr3[3]; + + /** + * SHA384 + */ + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + w0_t[0] = swap_workaround (w0[0]); + w0_t[1] = swap_workaround (w0[1]); + w0_t[2] = swap_workaround (w0[2]); + w0_t[3] = swap_workaround (w0[3]); + w1_t[0] = swap_workaround (w1[0]); + w1_t[1] = swap_workaround (w1[1]); + w1_t[2] = swap_workaround (w1[2]); + w1_t[3] = swap_workaround (w1[3]); + w2_t[0] = swap_workaround (w2[0]); + w2_t[1] = swap_workaround (w2[1]); + w2_t[2] = swap_workaround (w2[2]); + w2_t[3] = swap_workaround (w2[3]); + w3_t[0] = swap_workaround (w3[0]); + w3_t[1] = swap_workaround (w3[1]); + w3_t[2] = 0; + w3_t[3] = pw_len * 8; + + u64x digest[8]; + + digest[0] = SHA384M_A; + digest[1] = SHA384M_B; + digest[2] = SHA384M_C; + digest[3] = SHA384M_D; + digest[4] = SHA384M_E; + digest[5] = SHA384M_F; + digest[6] = SHA384M_G; + digest[7] = SHA384M_H; + + sha384_transform (w0_t, w1_t, w2_t, w3_t, digest); + + const u32x r0 = l32_from_64 (digest[3]); + const u32x r1 = h32_from_64 (digest[3]); + const u32x r2 = l32_from_64 (digest[2]); + const u32x r3 = h32_from_64 (digest[2]); + + #include VECT_COMPARE_M + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m10800_m08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m10800_m16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m10800_s04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + append_0x80_2 (wordl0, wordl1, pw_l_len); + + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, combs_buf[0].pw_len); + } + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = combs_buf[il_pos].pw_len; + + const u32 pw_len = pw_l_len + pw_r_len; + + u32 wordr0[4]; + + wordr0[0] = combs_buf[il_pos].i[0]; + wordr0[1] = combs_buf[il_pos].i[1]; + wordr0[2] = combs_buf[il_pos].i[2]; + wordr0[3] = combs_buf[il_pos].i[3]; + + u32 wordr1[4]; + + wordr1[0] = combs_buf[il_pos].i[4]; + wordr1[1] = combs_buf[il_pos].i[5]; + wordr1[2] = combs_buf[il_pos].i[6]; + wordr1[3] = combs_buf[il_pos].i[7]; + + u32 wordr2[4]; + + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + + u32 wordr3[4]; + + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + append_0x80_2 (wordr0, wordr1, pw_r_len); + + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + u32x w0[4]; + u32x w1[4]; + u32x w2[4]; + u32x w3[4]; + + w0[0] = wordl0[0] | wordr0[0]; + w0[1] = wordl0[1] | wordr0[1]; + w0[2] = wordl0[2] | wordr0[2]; + w0[3] = wordl0[3] | wordr0[3]; + w1[0] = wordl1[0] | wordr1[0]; + w1[1] = wordl1[1] | wordr1[1]; + w1[2] = wordl1[2] | wordr1[2]; + w1[3] = wordl1[3] | wordr1[3]; + w2[0] = wordl2[0] | wordr2[0]; + w2[1] = wordl2[1] | wordr2[1]; + w2[2] = wordl2[2] | wordr2[2]; + w2[3] = wordl2[3] | wordr2[3]; + w3[0] = wordl3[0] | wordr3[0]; + w3[1] = wordl3[1] | wordr3[1]; + w3[2] = wordl3[2] | wordr3[2]; + w3[3] = wordl3[3] | wordr3[3]; + + /** + * SHA384 + */ + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + w0_t[0] = swap_workaround (w0[0]); + w0_t[1] = swap_workaround (w0[1]); + w0_t[2] = swap_workaround (w0[2]); + w0_t[3] = swap_workaround (w0[3]); + w1_t[0] = swap_workaround (w1[0]); + w1_t[1] = swap_workaround (w1[1]); + w1_t[2] = swap_workaround (w1[2]); + w1_t[3] = swap_workaround (w1[3]); + w2_t[0] = swap_workaround (w2[0]); + w2_t[1] = swap_workaround (w2[1]); + w2_t[2] = swap_workaround (w2[2]); + w2_t[3] = swap_workaround (w2[3]); + w3_t[0] = swap_workaround (w3[0]); + w3_t[1] = swap_workaround (w3[1]); + w3_t[2] = 0; + w3_t[3] = pw_len * 8; + + u64x digest[8]; + + digest[0] = SHA384M_A; + digest[1] = SHA384M_B; + digest[2] = SHA384M_C; + digest[3] = SHA384M_D; + digest[4] = SHA384M_E; + digest[5] = SHA384M_F; + digest[6] = SHA384M_G; + digest[7] = SHA384M_H; + + sha384_transform (w0_t, w1_t, w2_t, w3_t, digest); + + const u32x r0 = l32_from_64 (digest[3]); + const u32x r1 = h32_from_64 (digest[3]); + const u32x r2 = l32_from_64 (digest[2]); + const u32x r3 = h32_from_64 (digest[2]); + + #include VECT_COMPARE_S + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m10800_s08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m10800_s16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/amd/m10800_a3.cl b/amd/m10800_a3.cl new file mode 100644 index 0000000000..6a3835dca2 --- /dev/null +++ b/amd/m10800_a3.cl @@ -0,0 +1,540 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _SHA384_ +#define _SCALAR_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW4 +#define VECT_SIZE1 +#endif + +#ifdef VLIW5 +#define VECT_SIZE1 +#endif + +#define DGST_R0 6 +#define DGST_R1 7 +#define DGST_R2 4 +#define DGST_R3 5 + +#include "include/kernel_functions.c" +#include "types_amd.c" +#include "common_amd.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4_warp.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4_warp.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4_warp.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4_warp.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4_warp.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4_warp.c" +#endif + +__constant u64 k_sha384[80] = +{ + SHA384C00, SHA384C01, SHA384C02, SHA384C03, + SHA384C04, SHA384C05, SHA384C06, SHA384C07, + SHA384C08, SHA384C09, SHA384C0a, SHA384C0b, + SHA384C0c, SHA384C0d, SHA384C0e, SHA384C0f, + SHA384C10, SHA384C11, SHA384C12, SHA384C13, + SHA384C14, SHA384C15, SHA384C16, SHA384C17, + SHA384C18, SHA384C19, SHA384C1a, SHA384C1b, + SHA384C1c, SHA384C1d, SHA384C1e, SHA384C1f, + SHA384C20, SHA384C21, SHA384C22, SHA384C23, + SHA384C24, SHA384C25, SHA384C26, SHA384C27, + SHA384C28, SHA384C29, SHA384C2a, SHA384C2b, + SHA384C2c, SHA384C2d, SHA384C2e, SHA384C2f, + SHA384C30, SHA384C31, SHA384C32, SHA384C33, + SHA384C34, SHA384C35, SHA384C36, SHA384C37, + SHA384C38, SHA384C39, SHA384C3a, SHA384C3b, + SHA384C3c, SHA384C3d, SHA384C3e, SHA384C3f, + SHA384C40, SHA384C41, SHA384C42, SHA384C43, + SHA384C44, SHA384C45, SHA384C46, SHA384C47, + SHA384C48, SHA384C49, SHA384C4a, SHA384C4b, + SHA384C4c, SHA384C4d, SHA384C4e, SHA384C4f, +}; + +static void sha384_transform (const u32x w0[4], const u32x w1[4], const u32x w2[4], const u32x w3[4], u64x digest[8]) +{ + u64x w0_t = hl32_to_64 (w0[0], w0[1]); + u64x w1_t = hl32_to_64 (w0[2], w0[3]); + u64x w2_t = hl32_to_64 (w1[0], w1[1]); + u64x w3_t = hl32_to_64 (w1[2], w1[3]); + u64x w4_t = hl32_to_64 (w2[0], w2[1]); + u64x w5_t = hl32_to_64 (w2[2], w2[3]); + u64x w6_t = hl32_to_64 (w3[0], w3[1]); + u64x w7_t = 0; + u64x w8_t = 0; + u64x w9_t = 0; + u64x wa_t = 0; + u64x wb_t = 0; + u64x wc_t = 0; + u64x wd_t = 0; + u64x we_t = 0; + u64x wf_t = hl32_to_64 (w3[2], w3[3]); + + u64x a = digest[0]; + u64x b = digest[1]; + u64x c = digest[2]; + u64x d = digest[3]; + u64x e = digest[4]; + u64x f = digest[5]; + u64x g = digest[6]; + u64x h = digest[7]; + + #define ROUND_EXPAND() \ + { \ + w0_t = SHA384_EXPAND (we_t, w9_t, w1_t, w0_t); \ + w1_t = SHA384_EXPAND (wf_t, wa_t, w2_t, w1_t); \ + w2_t = SHA384_EXPAND (w0_t, wb_t, w3_t, w2_t); \ + w3_t = SHA384_EXPAND (w1_t, wc_t, w4_t, w3_t); \ + w4_t = SHA384_EXPAND (w2_t, wd_t, w5_t, w4_t); \ + w5_t = SHA384_EXPAND (w3_t, we_t, w6_t, w5_t); \ + w6_t = SHA384_EXPAND (w4_t, wf_t, w7_t, w6_t); \ + w7_t = SHA384_EXPAND (w5_t, w0_t, w8_t, w7_t); \ + w8_t = SHA384_EXPAND (w6_t, w1_t, w9_t, w8_t); \ + w9_t = SHA384_EXPAND (w7_t, w2_t, wa_t, w9_t); \ + wa_t = SHA384_EXPAND (w8_t, w3_t, wb_t, wa_t); \ + wb_t = SHA384_EXPAND (w9_t, w4_t, wc_t, wb_t); \ + wc_t = SHA384_EXPAND (wa_t, w5_t, wd_t, wc_t); \ + wd_t = SHA384_EXPAND (wb_t, w6_t, we_t, wd_t); \ + we_t = SHA384_EXPAND (wc_t, w7_t, wf_t, we_t); \ + wf_t = SHA384_EXPAND (wd_t, w8_t, w0_t, wf_t); \ + } + + #define ROUND_STEP(i) \ + { \ + SHA384_STEP (SHA384_F0o, SHA384_F1o, a, b, c, d, e, f, g, h, w0_t, k_sha384[i + 0]); \ + SHA384_STEP (SHA384_F0o, SHA384_F1o, h, a, b, c, d, e, f, g, w1_t, k_sha384[i + 1]); \ + SHA384_STEP (SHA384_F0o, SHA384_F1o, g, h, a, b, c, d, e, f, w2_t, k_sha384[i + 2]); \ + SHA384_STEP (SHA384_F0o, SHA384_F1o, f, g, h, a, b, c, d, e, w3_t, k_sha384[i + 3]); \ + SHA384_STEP (SHA384_F0o, SHA384_F1o, e, f, g, h, a, b, c, d, w4_t, k_sha384[i + 4]); \ + SHA384_STEP (SHA384_F0o, SHA384_F1o, d, e, f, g, h, a, b, c, w5_t, k_sha384[i + 5]); \ + SHA384_STEP (SHA384_F0o, SHA384_F1o, c, d, e, f, g, h, a, b, w6_t, k_sha384[i + 6]); \ + SHA384_STEP (SHA384_F0o, SHA384_F1o, b, c, d, e, f, g, h, a, w7_t, k_sha384[i + 7]); \ + SHA384_STEP (SHA384_F0o, SHA384_F1o, a, b, c, d, e, f, g, h, w8_t, k_sha384[i + 8]); \ + SHA384_STEP (SHA384_F0o, SHA384_F1o, h, a, b, c, d, e, f, g, w9_t, k_sha384[i + 9]); \ + SHA384_STEP (SHA384_F0o, SHA384_F1o, g, h, a, b, c, d, e, f, wa_t, k_sha384[i + 10]); \ + SHA384_STEP (SHA384_F0o, SHA384_F1o, f, g, h, a, b, c, d, e, wb_t, k_sha384[i + 11]); \ + SHA384_STEP (SHA384_F0o, SHA384_F1o, e, f, g, h, a, b, c, d, wc_t, k_sha384[i + 12]); \ + SHA384_STEP (SHA384_F0o, SHA384_F1o, d, e, f, g, h, a, b, c, wd_t, k_sha384[i + 13]); \ + SHA384_STEP (SHA384_F0o, SHA384_F1o, c, d, e, f, g, h, a, b, we_t, k_sha384[i + 14]); \ + SHA384_STEP (SHA384_F0o, SHA384_F1o, b, c, d, e, f, g, h, a, wf_t, k_sha384[i + 15]); \ + } + + ROUND_STEP (0); + + ROUND_EXPAND (); ROUND_STEP (16); + ROUND_EXPAND (); ROUND_STEP (32); + ROUND_EXPAND (); ROUND_STEP (48); + ROUND_EXPAND (); ROUND_STEP (64); + + /* rev + digest[0] += a; + digest[1] += b; + digest[2] += c; + digest[3] += d; + digest[4] += e; + digest[5] += f; + digest[6] += g; + digest[7] += h; + */ + + digest[0] = a; + digest[1] = b; + digest[2] = c; + digest[3] = d; + digest[4] = e; + digest[5] = f; + digest[6] = 0; + digest[7] = 0; +} + +static void m10800m (u32 w[16], const u32 pw_len, __global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global u32x * words_buf_r, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset) +{ + /** + * modifier + */ + + const u32 gid = get_global_id (0); + const u32 lid = get_local_id (0); + + /** + * loop + */ + + const u32 bf_loops = ceil ((float) bfs_cnt / VECT_DIV); + + u32x w0l = w[0]; + + for (u32 il_pos = 0; il_pos < bf_loops; il_pos++) + { + const u32x w0r = words_buf_r[il_pos]; + + const u32x w0 = w0l | w0r; + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + w0_t[0] = w0; + w0_t[1] = w[ 1]; + w0_t[2] = w[ 2]; + w0_t[3] = w[ 3]; + w1_t[0] = w[ 4]; + w1_t[1] = w[ 5]; + w1_t[2] = w[ 6]; + w1_t[3] = w[ 7]; + w2_t[0] = w[ 8]; + w2_t[1] = w[ 9]; + w2_t[2] = w[10]; + w2_t[3] = w[11]; + w3_t[0] = w[12]; + w3_t[1] = w[13]; + w3_t[2] = w[14]; + w3_t[3] = w[15]; + + u64x digest[8]; + + digest[0] = SHA384M_A; + digest[1] = SHA384M_B; + digest[2] = SHA384M_C; + digest[3] = SHA384M_D; + digest[4] = SHA384M_E; + digest[5] = SHA384M_F; + digest[6] = SHA384M_G; + digest[7] = SHA384M_H; + + sha384_transform (w0_t, w1_t, w2_t, w3_t, digest); + + const u32x r0 = l32_from_64 (digest[3]); + const u32x r1 = h32_from_64 (digest[3]); + const u32x r2 = l32_from_64 (digest[2]); + const u32x r3 = h32_from_64 (digest[2]); + + #include VECT_COMPARE_M + } +} + +static void m10800s (u32 w[16], const u32 pw_len, __global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global u32x * words_buf_r, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset) +{ + /** + * modifier + */ + + const u32 gid = get_global_id (0); + const u32 lid = get_local_id (0); + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * loop + */ + + const u32 bf_loops = ceil ((float) bfs_cnt / VECT_DIV); + + u32x w0l = w[0]; + + for (u32 il_pos = 0; il_pos < bf_loops; il_pos++) + { + const u32x w0r = words_buf_r[il_pos]; + + const u32x w0 = w0l | w0r; + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + w0_t[0] = w0; + w0_t[1] = w[ 1]; + w0_t[2] = w[ 2]; + w0_t[3] = w[ 3]; + w1_t[0] = w[ 4]; + w1_t[1] = w[ 5]; + w1_t[2] = w[ 6]; + w1_t[3] = w[ 7]; + w2_t[0] = w[ 8]; + w2_t[1] = w[ 9]; + w2_t[2] = w[10]; + w2_t[3] = w[11]; + w3_t[0] = w[12]; + w3_t[1] = w[13]; + w3_t[2] = w[14]; + w3_t[3] = w[15]; + + u64x digest[8]; + + digest[0] = SHA384M_A; + digest[1] = SHA384M_B; + digest[2] = SHA384M_C; + digest[3] = SHA384M_D; + digest[4] = SHA384M_E; + digest[5] = SHA384M_F; + digest[6] = SHA384M_G; + digest[7] = SHA384M_H; + + sha384_transform (w0_t, w1_t, w2_t, w3_t, digest); + + const u32x r0 = l32_from_64 (digest[3]); + const u32x r1 = h32_from_64 (digest[3]); + const u32x r2 = l32_from_64 (digest[2]); + const u32x r3 = h32_from_64 (digest[2]); + + #include VECT_COMPARE_S + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m10800_m04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global u32x * words_buf_r, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32 w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = 0; + w[ 5] = 0; + w[ 6] = 0; + w[ 7] = 0; + w[ 8] = 0; + w[ 9] = 0; + w[10] = 0; + w[11] = 0; + w[12] = 0; + w[13] = 0; + w[14] = 0; + w[15] = pws[gid].i[15]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m10800m (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m10800_m08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global u32x * words_buf_r, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32 w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = pws[gid].i[ 4]; + w[ 5] = pws[gid].i[ 5]; + w[ 6] = pws[gid].i[ 6]; + w[ 7] = pws[gid].i[ 7]; + w[ 8] = 0; + w[ 9] = 0; + w[10] = 0; + w[11] = 0; + w[12] = 0; + w[13] = 0; + w[14] = 0; + w[15] = pws[gid].i[15]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m10800m (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m10800_m16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global u32x * words_buf_r, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32 w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = pws[gid].i[ 4]; + w[ 5] = pws[gid].i[ 5]; + w[ 6] = pws[gid].i[ 6]; + w[ 7] = pws[gid].i[ 7]; + w[ 8] = pws[gid].i[ 8]; + w[ 9] = pws[gid].i[ 9]; + w[10] = pws[gid].i[10]; + w[11] = pws[gid].i[11]; + w[12] = pws[gid].i[12]; + w[13] = pws[gid].i[13]; + w[14] = pws[gid].i[14]; + w[15] = pws[gid].i[15]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m10800m (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m10800_s04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global u32x * words_buf_r, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32 w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = 0; + w[ 5] = 0; + w[ 6] = 0; + w[ 7] = 0; + w[ 8] = 0; + w[ 9] = 0; + w[10] = 0; + w[11] = 0; + w[12] = 0; + w[13] = 0; + w[14] = 0; + w[15] = pws[gid].i[15]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m10800s (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m10800_s08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global u32x * words_buf_r, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32 w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = pws[gid].i[ 4]; + w[ 5] = pws[gid].i[ 5]; + w[ 6] = pws[gid].i[ 6]; + w[ 7] = pws[gid].i[ 7]; + w[ 8] = 0; + w[ 9] = 0; + w[10] = 0; + w[11] = 0; + w[12] = 0; + w[13] = 0; + w[14] = 0; + w[15] = pws[gid].i[15]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m10800s (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m10800_s16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global u32x * words_buf_r, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32 w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = pws[gid].i[ 4]; + w[ 5] = pws[gid].i[ 5]; + w[ 6] = pws[gid].i[ 6]; + w[ 7] = pws[gid].i[ 7]; + w[ 8] = pws[gid].i[ 8]; + w[ 9] = pws[gid].i[ 9]; + w[10] = pws[gid].i[10]; + w[11] = pws[gid].i[11]; + w[12] = pws[gid].i[12]; + w[13] = pws[gid].i[13]; + w[14] = pws[gid].i[14]; + w[15] = pws[gid].i[15]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m10800s (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} diff --git a/amd/m10900.cl b/amd/m10900.cl new file mode 100644 index 0000000000..066fa0d307 --- /dev/null +++ b/amd/m10900.cl @@ -0,0 +1,487 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _PBKDF2_SHA256_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW4 +#define VECT_SIZE1 +#endif + +#ifdef VLIW5 +#define VECT_SIZE1 +#endif + +#define DGST_R0 0 +#define DGST_R1 1 +#define DGST_R2 2 +#define DGST_R3 3 + +#include "include/kernel_functions.c" + +#include "types_amd.c" +#include "common_amd.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +__constant u32 k_sha256[64] = +{ + SHA256C00, SHA256C01, SHA256C02, SHA256C03, + SHA256C04, SHA256C05, SHA256C06, SHA256C07, + SHA256C08, SHA256C09, SHA256C0a, SHA256C0b, + SHA256C0c, SHA256C0d, SHA256C0e, SHA256C0f, + SHA256C10, SHA256C11, SHA256C12, SHA256C13, + SHA256C14, SHA256C15, SHA256C16, SHA256C17, + SHA256C18, SHA256C19, SHA256C1a, SHA256C1b, + SHA256C1c, SHA256C1d, SHA256C1e, SHA256C1f, + SHA256C20, SHA256C21, SHA256C22, SHA256C23, + SHA256C24, SHA256C25, SHA256C26, SHA256C27, + SHA256C28, SHA256C29, SHA256C2a, SHA256C2b, + SHA256C2c, SHA256C2d, SHA256C2e, SHA256C2f, + SHA256C30, SHA256C31, SHA256C32, SHA256C33, + SHA256C34, SHA256C35, SHA256C36, SHA256C37, + SHA256C38, SHA256C39, SHA256C3a, SHA256C3b, + SHA256C3c, SHA256C3d, SHA256C3e, SHA256C3f, +}; + +static void sha256_transform (const u32x w0[4], const u32x w1[4], const u32x w2[4], const u32x w3[4], u32x digest[8]) +{ + u32x a = digest[0]; + u32x b = digest[1]; + u32x c = digest[2]; + u32x d = digest[3]; + u32x e = digest[4]; + u32x f = digest[5]; + u32x g = digest[6]; + u32x h = digest[7]; + + u32x w0_t = w0[0]; + u32x w1_t = w0[1]; + u32x w2_t = w0[2]; + u32x w3_t = w0[3]; + u32x w4_t = w1[0]; + u32x w5_t = w1[1]; + u32x w6_t = w1[2]; + u32x w7_t = w1[3]; + u32x w8_t = w2[0]; + u32x w9_t = w2[1]; + u32x wa_t = w2[2]; + u32x wb_t = w2[3]; + u32x wc_t = w3[0]; + u32x wd_t = w3[1]; + u32x we_t = w3[2]; + u32x wf_t = w3[3]; + + #define ROUND_EXPAND() \ + { \ + w0_t = SHA256_EXPAND (we_t, w9_t, w1_t, w0_t); \ + w1_t = SHA256_EXPAND (wf_t, wa_t, w2_t, w1_t); \ + w2_t = SHA256_EXPAND (w0_t, wb_t, w3_t, w2_t); \ + w3_t = SHA256_EXPAND (w1_t, wc_t, w4_t, w3_t); \ + w4_t = SHA256_EXPAND (w2_t, wd_t, w5_t, w4_t); \ + w5_t = SHA256_EXPAND (w3_t, we_t, w6_t, w5_t); \ + w6_t = SHA256_EXPAND (w4_t, wf_t, w7_t, w6_t); \ + w7_t = SHA256_EXPAND (w5_t, w0_t, w8_t, w7_t); \ + w8_t = SHA256_EXPAND (w6_t, w1_t, w9_t, w8_t); \ + w9_t = SHA256_EXPAND (w7_t, w2_t, wa_t, w9_t); \ + wa_t = SHA256_EXPAND (w8_t, w3_t, wb_t, wa_t); \ + wb_t = SHA256_EXPAND (w9_t, w4_t, wc_t, wb_t); \ + wc_t = SHA256_EXPAND (wa_t, w5_t, wd_t, wc_t); \ + wd_t = SHA256_EXPAND (wb_t, w6_t, we_t, wd_t); \ + we_t = SHA256_EXPAND (wc_t, w7_t, wf_t, we_t); \ + wf_t = SHA256_EXPAND (wd_t, w8_t, w0_t, wf_t); \ + } + + #define ROUND_STEP(i) \ + { \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, k_sha256[i + 0]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, k_sha256[i + 1]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, k_sha256[i + 2]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, k_sha256[i + 3]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, k_sha256[i + 4]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, k_sha256[i + 5]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, k_sha256[i + 6]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, k_sha256[i + 7]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, k_sha256[i + 8]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, k_sha256[i + 9]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, k_sha256[i + 10]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, k_sha256[i + 11]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, k_sha256[i + 12]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, k_sha256[i + 13]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, k_sha256[i + 14]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, k_sha256[i + 15]); \ + } + + ROUND_STEP (0); + + #pragma unroll + for (int i = 16; i < 64; i += 16) + { + ROUND_EXPAND (); ROUND_STEP (i); + } + + digest[0] += a; + digest[1] += b; + digest[2] += c; + digest[3] += d; + digest[4] += e; + digest[5] += f; + digest[6] += g; + digest[7] += h; +} + +static void hmac_sha256_pad (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], u32x ipad[8], u32x opad[8]) +{ + w0[0] = w0[0] ^ 0x36363636; + w0[1] = w0[1] ^ 0x36363636; + w0[2] = w0[2] ^ 0x36363636; + w0[3] = w0[3] ^ 0x36363636; + w1[0] = w1[0] ^ 0x36363636; + w1[1] = w1[1] ^ 0x36363636; + w1[2] = w1[2] ^ 0x36363636; + w1[3] = w1[3] ^ 0x36363636; + w2[0] = w2[0] ^ 0x36363636; + w2[1] = w2[1] ^ 0x36363636; + w2[2] = w2[2] ^ 0x36363636; + w2[3] = w2[3] ^ 0x36363636; + w3[0] = w3[0] ^ 0x36363636; + w3[1] = w3[1] ^ 0x36363636; + w3[2] = w3[2] ^ 0x36363636; + w3[3] = w3[3] ^ 0x36363636; + + ipad[0] = SHA256M_A; + ipad[1] = SHA256M_B; + ipad[2] = SHA256M_C; + ipad[3] = SHA256M_D; + ipad[4] = SHA256M_E; + ipad[5] = SHA256M_F; + ipad[6] = SHA256M_G; + ipad[7] = SHA256M_H; + + sha256_transform (w0, w1, w2, w3, ipad); + + w0[0] = w0[0] ^ 0x6a6a6a6a; + w0[1] = w0[1] ^ 0x6a6a6a6a; + w0[2] = w0[2] ^ 0x6a6a6a6a; + w0[3] = w0[3] ^ 0x6a6a6a6a; + w1[0] = w1[0] ^ 0x6a6a6a6a; + w1[1] = w1[1] ^ 0x6a6a6a6a; + w1[2] = w1[2] ^ 0x6a6a6a6a; + w1[3] = w1[3] ^ 0x6a6a6a6a; + w2[0] = w2[0] ^ 0x6a6a6a6a; + w2[1] = w2[1] ^ 0x6a6a6a6a; + w2[2] = w2[2] ^ 0x6a6a6a6a; + w2[3] = w2[3] ^ 0x6a6a6a6a; + w3[0] = w3[0] ^ 0x6a6a6a6a; + w3[1] = w3[1] ^ 0x6a6a6a6a; + w3[2] = w3[2] ^ 0x6a6a6a6a; + w3[3] = w3[3] ^ 0x6a6a6a6a; + + opad[0] = SHA256M_A; + opad[1] = SHA256M_B; + opad[2] = SHA256M_C; + opad[3] = SHA256M_D; + opad[4] = SHA256M_E; + opad[5] = SHA256M_F; + opad[6] = SHA256M_G; + opad[7] = SHA256M_H; + + sha256_transform (w0, w1, w2, w3, opad); +} + +static void hmac_sha256_run (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], u32x ipad[8], u32x opad[8], u32x digest[8]) +{ + digest[0] = ipad[0]; + digest[1] = ipad[1]; + digest[2] = ipad[2]; + digest[3] = ipad[3]; + digest[4] = ipad[4]; + digest[5] = ipad[5]; + digest[6] = ipad[6]; + digest[7] = ipad[7]; + + sha256_transform (w0, w1, w2, w3, digest); + + w0[0] = digest[0]; + w0[1] = digest[1]; + w0[2] = digest[2]; + w0[3] = digest[3]; + w1[0] = digest[4]; + w1[1] = digest[5]; + w1[2] = digest[6]; + w1[3] = digest[7]; + w2[0] = 0x80000000; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = (64 + 32) * 8; + + digest[0] = opad[0]; + digest[1] = opad[1]; + digest[2] = opad[2]; + digest[3] = opad[3]; + digest[4] = opad[4]; + digest[5] = opad[5]; + digest[6] = opad[6]; + digest[7] = opad[7]; + + sha256_transform (w0, w1, w2, w3, digest); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m10900_init (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global pbkdf2_sha256_tmp_t *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global pbkdf2_sha256_t *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = swap_workaround (pws[gid].i[ 0]); + w0[1] = swap_workaround (pws[gid].i[ 1]); + w0[2] = swap_workaround (pws[gid].i[ 2]); + w0[3] = swap_workaround (pws[gid].i[ 3]); + + u32x w1[4]; + + w1[0] = swap_workaround (pws[gid].i[ 4]); + w1[1] = swap_workaround (pws[gid].i[ 5]); + w1[2] = swap_workaround (pws[gid].i[ 6]); + w1[3] = swap_workaround (pws[gid].i[ 7]); + + u32x w2[4]; + + w2[0] = swap_workaround (pws[gid].i[ 8]); + w2[1] = swap_workaround (pws[gid].i[ 9]); + w2[2] = swap_workaround (pws[gid].i[10]); + w2[3] = swap_workaround (pws[gid].i[11]); + + u32x w3[4]; + + w3[0] = swap_workaround (pws[gid].i[12]); + w3[1] = swap_workaround (pws[gid].i[13]); + w3[2] = swap_workaround (pws[gid].i[14]); + w3[3] = swap_workaround (pws[gid].i[15]); + + /** + * salt + */ + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + u32 esalt_buf0[4]; + u32 esalt_buf1[4]; + u32 esalt_buf2[4]; + u32 esalt_buf3[4]; + + esalt_buf0[0] = swap_workaround (esalt_bufs[salt_pos].salt_buf[ 0]); + esalt_buf0[1] = swap_workaround (esalt_bufs[salt_pos].salt_buf[ 1]); + esalt_buf0[2] = swap_workaround (esalt_bufs[salt_pos].salt_buf[ 2]); + esalt_buf0[3] = swap_workaround (esalt_bufs[salt_pos].salt_buf[ 3]); + esalt_buf1[0] = swap_workaround (esalt_bufs[salt_pos].salt_buf[ 4]); + esalt_buf1[1] = swap_workaround (esalt_bufs[salt_pos].salt_buf[ 5]); + esalt_buf1[2] = swap_workaround (esalt_bufs[salt_pos].salt_buf[ 6]); + esalt_buf1[3] = swap_workaround (esalt_bufs[salt_pos].salt_buf[ 7]); + esalt_buf2[0] = swap_workaround (esalt_bufs[salt_pos].salt_buf[ 8]); + esalt_buf2[1] = swap_workaround (esalt_bufs[salt_pos].salt_buf[ 9]); + esalt_buf2[2] = swap_workaround (esalt_bufs[salt_pos].salt_buf[10]); + esalt_buf2[3] = swap_workaround (esalt_bufs[salt_pos].salt_buf[11]); + esalt_buf3[0] = swap_workaround (esalt_bufs[salt_pos].salt_buf[12]); + esalt_buf3[1] = swap_workaround (esalt_bufs[salt_pos].salt_buf[13]); + esalt_buf3[2] = 0; + esalt_buf3[3] = (64 + salt_len + 4) * 8; + + u32 ipad[8]; + u32 opad[8]; + + hmac_sha256_pad (w0, w1, w2, w3, ipad, opad); + + tmps[gid].ipad[0] = ipad[0]; + tmps[gid].ipad[1] = ipad[1]; + tmps[gid].ipad[2] = ipad[2]; + tmps[gid].ipad[3] = ipad[3]; + tmps[gid].ipad[4] = ipad[4]; + tmps[gid].ipad[5] = ipad[5]; + tmps[gid].ipad[6] = ipad[6]; + tmps[gid].ipad[7] = ipad[7]; + + tmps[gid].opad[0] = opad[0]; + tmps[gid].opad[1] = opad[1]; + tmps[gid].opad[2] = opad[2]; + tmps[gid].opad[3] = opad[3]; + tmps[gid].opad[4] = opad[4]; + tmps[gid].opad[5] = opad[5]; + tmps[gid].opad[6] = opad[6]; + tmps[gid].opad[7] = opad[7]; + + for (u32 i = 0, j = 1; i < 8; i += 8, j += 1) + { + u32 dgst[8]; + + hmac_sha256_run (esalt_buf0, esalt_buf1, esalt_buf2, esalt_buf3, ipad, opad, dgst); + + tmps[gid].dgst[i + 0] = dgst[0]; + tmps[gid].dgst[i + 1] = dgst[1]; + tmps[gid].dgst[i + 2] = dgst[2]; + tmps[gid].dgst[i + 3] = dgst[3]; + tmps[gid].dgst[i + 4] = dgst[4]; + tmps[gid].dgst[i + 5] = dgst[5]; + tmps[gid].dgst[i + 6] = dgst[6]; + tmps[gid].dgst[i + 7] = dgst[7]; + + tmps[gid].out[i + 0] = dgst[0]; + tmps[gid].out[i + 1] = dgst[1]; + tmps[gid].out[i + 2] = dgst[2]; + tmps[gid].out[i + 3] = dgst[3]; + tmps[gid].out[i + 4] = dgst[4]; + tmps[gid].out[i + 5] = dgst[5]; + tmps[gid].out[i + 6] = dgst[6]; + tmps[gid].out[i + 7] = dgst[7]; + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m10900_loop (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global pbkdf2_sha256_tmp_t *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global pbkdf2_sha256_t *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32 ipad[8]; + + ipad[0] = tmps[gid].ipad[0]; + ipad[1] = tmps[gid].ipad[1]; + ipad[2] = tmps[gid].ipad[2]; + ipad[3] = tmps[gid].ipad[3]; + ipad[4] = tmps[gid].ipad[4]; + ipad[5] = tmps[gid].ipad[5]; + ipad[6] = tmps[gid].ipad[6]; + ipad[7] = tmps[gid].ipad[7]; + + u32 opad[8]; + + opad[0] = tmps[gid].opad[0]; + opad[1] = tmps[gid].opad[1]; + opad[2] = tmps[gid].opad[2]; + opad[3] = tmps[gid].opad[3]; + opad[4] = tmps[gid].opad[4]; + opad[5] = tmps[gid].opad[5]; + opad[6] = tmps[gid].opad[6]; + opad[7] = tmps[gid].opad[7]; + + for (u32 i = 0; i < 8; i += 8) + { + u32 dgst[8]; + + dgst[0] = tmps[gid].dgst[i + 0]; + dgst[1] = tmps[gid].dgst[i + 1]; + dgst[2] = tmps[gid].dgst[i + 2]; + dgst[3] = tmps[gid].dgst[i + 3]; + dgst[4] = tmps[gid].dgst[i + 4]; + dgst[5] = tmps[gid].dgst[i + 5]; + dgst[6] = tmps[gid].dgst[i + 6]; + dgst[7] = tmps[gid].dgst[i + 7]; + + u32 out[8]; + + out[0] = tmps[gid].out[i + 0]; + out[1] = tmps[gid].out[i + 1]; + out[2] = tmps[gid].out[i + 2]; + out[3] = tmps[gid].out[i + 3]; + out[4] = tmps[gid].out[i + 4]; + out[5] = tmps[gid].out[i + 5]; + out[6] = tmps[gid].out[i + 6]; + out[7] = tmps[gid].out[i + 7]; + + for (u32 j = 0; j < loop_cnt; j++) + { + u32 w0[4]; + u32 w1[4]; + u32 w2[4]; + u32 w3[4]; + + w0[0] = dgst[0]; + w0[1] = dgst[1]; + w0[2] = dgst[2]; + w0[3] = dgst[3]; + w1[0] = dgst[4]; + w1[1] = dgst[5]; + w1[2] = dgst[6]; + w1[3] = dgst[7]; + w2[0] = 0x80000000; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = (64 + 32) * 8; + + hmac_sha256_run (w0, w1, w2, w3, ipad, opad, dgst); + + out[0] ^= dgst[0]; + out[1] ^= dgst[1]; + out[2] ^= dgst[2]; + out[3] ^= dgst[3]; + out[4] ^= dgst[4]; + out[5] ^= dgst[5]; + out[6] ^= dgst[6]; + out[7] ^= dgst[7]; + } + + tmps[gid].dgst[i + 0] = dgst[0]; + tmps[gid].dgst[i + 1] = dgst[1]; + tmps[gid].dgst[i + 2] = dgst[2]; + tmps[gid].dgst[i + 3] = dgst[3]; + tmps[gid].dgst[i + 4] = dgst[4]; + tmps[gid].dgst[i + 5] = dgst[5]; + tmps[gid].dgst[i + 6] = dgst[6]; + tmps[gid].dgst[i + 7] = dgst[7]; + + tmps[gid].out[i + 0] = out[0]; + tmps[gid].out[i + 1] = out[1]; + tmps[gid].out[i + 2] = out[2]; + tmps[gid].out[i + 3] = out[3]; + tmps[gid].out[i + 4] = out[4]; + tmps[gid].out[i + 5] = out[5]; + tmps[gid].out[i + 6] = out[6]; + tmps[gid].out[i + 7] = out[7]; + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m10900_comp (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global pbkdf2_sha256_tmp_t *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global pbkdf2_sha256_t *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + const u32 lid = get_local_id (0); + + const u32x r0 = tmps[gid].out[DGST_R0]; + const u32x r1 = tmps[gid].out[DGST_R1]; + const u32x r2 = tmps[gid].out[DGST_R2]; + const u32x r3 = tmps[gid].out[DGST_R3]; + + #define il_pos 0 + + #include VECT_COMPARE_M +} diff --git a/amd/m11000_a0.cl b/amd/m11000_a0.cl new file mode 100644 index 0000000000..785e07a912 --- /dev/null +++ b/amd/m11000_a0.cl @@ -0,0 +1,715 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _MD5_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW4 +#define VECT_SIZE4 +#endif + +#ifdef VLIW5 +#define VECT_SIZE4 +#endif + +#define DGST_R0 0 +#define DGST_R1 3 +#define DGST_R2 2 +#define DGST_R3 1 + +#include "include/kernel_functions.c" +#include "types_amd.c" +#include "common_amd.c" +#include "include/rp_gpu.h" +#include "rp_amd.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m11000_m04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + u32x pw_buf1[4]; + + pw_buf1[0] = pws[gid].i[ 4]; + pw_buf1[1] = pws[gid].i[ 5]; + pw_buf1[2] = pws[gid].i[ 6]; + pw_buf1[3] = pws[gid].i[ 7]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * salt + */ + + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[ 1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[ 2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[ 3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[ 4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[ 5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[ 6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[ 7]; + + u32 salt_buf2[4]; + + salt_buf2[0] = salt_bufs[salt_pos].salt_buf[ 8]; + salt_buf2[1] = salt_bufs[salt_pos].salt_buf[ 9]; + salt_buf2[2] = salt_bufs[salt_pos].salt_buf[10]; + salt_buf2[3] = salt_bufs[salt_pos].salt_buf[11]; + + u32 salt_buf3[2]; + + salt_buf3[0] = salt_bufs[salt_pos].salt_buf[12]; + salt_buf3[1] = salt_bufs[salt_pos].salt_buf[13]; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + u32x w1[4]; + u32x w2[4]; + u32x w3[4]; + + w0[0] = pw_buf0[0]; + w0[1] = pw_buf0[1]; + w0[2] = pw_buf0[2]; + w0[3] = pw_buf0[3]; + w1[0] = pw_buf1[0]; + w1[1] = pw_buf1[1]; + w1[2] = pw_buf1[2]; + w1[3] = pw_buf1[3]; + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 out_len = apply_rules (rules_buf[il_pos].cmds, w0, w1, pw_len); + + const u32 pw_salt_len = pw_len + salt_len; + + append_0x80_4 (w0, w1, w2, w3, out_len); + + /** + * prepend salt + */ + + // first step fixed 56 bytes of salt + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + w0_t[0] = salt_buf0[0]; + w0_t[1] = salt_buf0[1]; + w0_t[2] = salt_buf0[2]; + w0_t[3] = salt_buf0[3]; + w1_t[0] = salt_buf1[0]; + w1_t[1] = salt_buf1[1]; + w1_t[2] = salt_buf1[2]; + w1_t[3] = salt_buf1[3]; + w2_t[0] = salt_buf2[0]; + w2_t[1] = salt_buf2[1]; + w2_t[2] = salt_buf2[2]; + w2_t[3] = salt_buf2[3]; + w3_t[0] = salt_buf3[0]; + w3_t[1] = salt_buf3[1]; + + // after 56 byte salt, we have beginning of the password + + w3_t[2] = w0[0]; + w3_t[3] = w0[1]; + + /** + * md5 + */ + + // first transform + + u32x a = MD5M_A; + u32x b = MD5M_B; + u32x c = MD5M_C; + u32x d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0_t[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0_t[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0_t[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1_t[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1_t[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1_t[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2_t[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2_t[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2_t[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3_t[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3_t[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3_t[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0_t[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1_t[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2_t[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1_t[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1_t[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2_t[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3_t[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0_t[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2_t[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3_t[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0_t[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1_t[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3_t[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H , a, b, c, d, w1_t[1], MD5C20, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w2_t[0], MD5C21, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w2_t[3], MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w3_t[2], MD5C23, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w0_t[1], MD5C24, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w1_t[0], MD5C25, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w1_t[3], MD5C26, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w2_t[2], MD5C27, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w3_t[1], MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w0_t[0], MD5C29, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w0_t[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w1_t[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w2_t[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w3_t[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w3_t[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w0_t[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1_t[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3_t[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3_t[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0_t[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0_t[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2_t[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1_t[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3_t[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1_t[0], MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w2_t[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0_t[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2_t[1], MD5C3f, MD5S33); + + a += MD5M_A; + b += MD5M_B; + c += MD5M_C; + d += MD5M_D; + + u32x r_a = a; + u32x r_b = b; + u32x r_c = c; + u32x r_d = d; + + // 2nd transform + + w0_t[0] = w0[2]; + w0_t[1] = w0[3]; + w0_t[2] = w1[0]; + w0_t[3] = w1[1]; + w1_t[0] = w1[2]; + w1_t[1] = w1[3]; + w1_t[2] = w2[0]; + w1_t[3] = w2[1]; + w2_t[0] = w2[2]; + w2_t[1] = w2[3]; + w2_t[2] = w3[0]; + w2_t[3] = w3[1]; + w3_t[0] = w3[2]; + w3_t[1] = w3[3]; + w3_t[2] = pw_salt_len * 8; + w3_t[3] = 0; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0_t[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0_t[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0_t[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1_t[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1_t[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1_t[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2_t[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2_t[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2_t[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3_t[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3_t[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3_t[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0_t[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1_t[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2_t[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1_t[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1_t[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2_t[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3_t[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0_t[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2_t[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3_t[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0_t[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1_t[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3_t[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H , a, b, c, d, w1_t[1], MD5C20, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w2_t[0], MD5C21, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w2_t[3], MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w3_t[2], MD5C23, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w0_t[1], MD5C24, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w1_t[0], MD5C25, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w1_t[3], MD5C26, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w2_t[2], MD5C27, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w3_t[1], MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w0_t[0], MD5C29, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w0_t[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w1_t[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w2_t[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w3_t[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w3_t[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w0_t[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1_t[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3_t[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3_t[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0_t[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0_t[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2_t[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1_t[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3_t[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1_t[0], MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w2_t[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0_t[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2_t[1], MD5C3f, MD5S33); + + a += r_a; + b += r_b; + c += r_c; + d += r_d; + + const u32x r0 = a; + const u32x r1 = d; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_M + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m11000_m08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m11000_m16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m11000_s04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + u32x pw_buf1[4]; + + pw_buf1[0] = pws[gid].i[ 4]; + pw_buf1[1] = pws[gid].i[ 5]; + pw_buf1[2] = pws[gid].i[ 6]; + pw_buf1[3] = pws[gid].i[ 7]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * salt + */ + + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[ 1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[ 2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[ 3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[ 4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[ 5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[ 6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[ 7]; + + u32 salt_buf2[4]; + + salt_buf2[0] = salt_bufs[salt_pos].salt_buf[ 8]; + salt_buf2[1] = salt_bufs[salt_pos].salt_buf[ 9]; + salt_buf2[2] = salt_bufs[salt_pos].salt_buf[10]; + salt_buf2[3] = salt_bufs[salt_pos].salt_buf[11]; + + u32 salt_buf3[2]; + + salt_buf3[0] = salt_bufs[salt_pos].salt_buf[12]; + salt_buf3[1] = salt_bufs[salt_pos].salt_buf[13]; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + u32x w1[4]; + u32x w2[4]; + u32x w3[4]; + + w0[0] = pw_buf0[0]; + w0[1] = pw_buf0[1]; + w0[2] = pw_buf0[2]; + w0[3] = pw_buf0[3]; + w1[0] = pw_buf1[0]; + w1[1] = pw_buf1[1]; + w1[2] = pw_buf1[2]; + w1[3] = pw_buf1[3]; + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 out_len = apply_rules (rules_buf[il_pos].cmds, w0, w1, pw_len); + + const u32 pw_salt_len = pw_len + salt_len; + + append_0x80_4 (w0, w1, w2, w3, out_len); + + /** + * prepend salt + */ + + // first step fixed 56 bytes of salt + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + w0_t[0] = salt_buf0[0]; + w0_t[1] = salt_buf0[1]; + w0_t[2] = salt_buf0[2]; + w0_t[3] = salt_buf0[3]; + w1_t[0] = salt_buf1[0]; + w1_t[1] = salt_buf1[1]; + w1_t[2] = salt_buf1[2]; + w1_t[3] = salt_buf1[3]; + w2_t[0] = salt_buf2[0]; + w2_t[1] = salt_buf2[1]; + w2_t[2] = salt_buf2[2]; + w2_t[3] = salt_buf2[3]; + w3_t[0] = salt_buf3[0]; + w3_t[1] = salt_buf3[1]; + + // after 56 byte salt, we have beginning of the password + + w3_t[2] = w0[0]; + w3_t[3] = w0[1]; + + /** + * md5 + */ + + // first transform + + u32x a = MD5M_A; + u32x b = MD5M_B; + u32x c = MD5M_C; + u32x d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0_t[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0_t[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0_t[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1_t[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1_t[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1_t[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2_t[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2_t[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2_t[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3_t[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3_t[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3_t[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0_t[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1_t[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2_t[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1_t[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1_t[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2_t[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3_t[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0_t[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2_t[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3_t[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0_t[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1_t[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3_t[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H , a, b, c, d, w1_t[1], MD5C20, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w2_t[0], MD5C21, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w2_t[3], MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w3_t[2], MD5C23, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w0_t[1], MD5C24, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w1_t[0], MD5C25, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w1_t[3], MD5C26, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w2_t[2], MD5C27, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w3_t[1], MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w0_t[0], MD5C29, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w0_t[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w1_t[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w2_t[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w3_t[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w3_t[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w0_t[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1_t[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3_t[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3_t[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0_t[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0_t[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2_t[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1_t[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3_t[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1_t[0], MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w2_t[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0_t[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2_t[1], MD5C3f, MD5S33); + + a += MD5M_A; + b += MD5M_B; + c += MD5M_C; + d += MD5M_D; + + u32x r_a = a; + u32x r_b = b; + u32x r_c = c; + u32x r_d = d; + + // 2nd transform + + w0_t[0] = w0[2]; + w0_t[1] = w0[3]; + w0_t[2] = w1[0]; + w0_t[3] = w1[1]; + w1_t[0] = w1[2]; + w1_t[1] = w1[3]; + w1_t[2] = w2[0]; + w1_t[3] = w2[1]; + w2_t[0] = w2[2]; + w2_t[1] = w2[3]; + w2_t[2] = w3[0]; + w2_t[3] = w3[1]; + w3_t[0] = w3[2]; + w3_t[1] = w3[3]; + w3_t[2] = pw_salt_len * 8; + w3_t[3] = 0; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0_t[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0_t[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0_t[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1_t[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1_t[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1_t[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2_t[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2_t[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2_t[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3_t[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3_t[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3_t[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0_t[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1_t[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2_t[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1_t[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1_t[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2_t[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3_t[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0_t[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2_t[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3_t[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0_t[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1_t[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3_t[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H , a, b, c, d, w1_t[1], MD5C20, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w2_t[0], MD5C21, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w2_t[3], MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w3_t[2], MD5C23, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w0_t[1], MD5C24, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w1_t[0], MD5C25, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w1_t[3], MD5C26, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w2_t[2], MD5C27, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w3_t[1], MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w0_t[0], MD5C29, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w0_t[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w1_t[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w2_t[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w3_t[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w3_t[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w0_t[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1_t[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3_t[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3_t[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0_t[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0_t[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2_t[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1_t[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3_t[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1_t[0], MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w2_t[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0_t[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2_t[1], MD5C3f, MD5S33); + + a += r_a; + b += r_b; + c += r_c; + d += r_d; + + const u32x r0 = a; + const u32x r1 = d; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_S + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m11000_s08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m11000_s16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/amd/m11000_a1.cl b/amd/m11000_a1.cl new file mode 100644 index 0000000000..1b9ee78bba --- /dev/null +++ b/amd/m11000_a1.cl @@ -0,0 +1,807 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _MD5_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW4 +#define VECT_SIZE4 +#endif + +#ifdef VLIW5 +#define VECT_SIZE4 +#endif + +#define DGST_R0 0 +#define DGST_R1 3 +#define DGST_R2 2 +#define DGST_R3 1 + +#include "include/kernel_functions.c" +#include "types_amd.c" +#include "common_amd.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m11000_m04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, combs_buf[0].pw_len); + } + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[ 1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[ 2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[ 3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[ 4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[ 5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[ 6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[ 7]; + + u32 salt_buf2[4]; + + salt_buf2[0] = salt_bufs[salt_pos].salt_buf[ 8]; + salt_buf2[1] = salt_bufs[salt_pos].salt_buf[ 9]; + salt_buf2[2] = salt_bufs[salt_pos].salt_buf[10]; + salt_buf2[3] = salt_bufs[salt_pos].salt_buf[11]; + + u32 salt_buf3[2]; + + salt_buf3[0] = salt_bufs[salt_pos].salt_buf[12]; + salt_buf3[1] = salt_bufs[salt_pos].salt_buf[13]; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = combs_buf[il_pos].pw_len; + + const u32 pw_len = pw_l_len + pw_r_len; + + u32 wordr0[4]; + u32 wordr1[4]; + u32 wordr2[4]; + u32 wordr3[4]; + + wordr0[0] = combs_buf[il_pos].i[0]; + wordr0[1] = combs_buf[il_pos].i[1]; + wordr0[2] = combs_buf[il_pos].i[2]; + wordr0[3] = combs_buf[il_pos].i[3]; + wordr1[0] = combs_buf[il_pos].i[4]; + wordr1[1] = combs_buf[il_pos].i[5]; + wordr1[2] = combs_buf[il_pos].i[6]; + wordr1[3] = combs_buf[il_pos].i[7]; + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + u32x w0[4]; + u32x w1[4]; + u32x w2[4]; + u32x w3[4]; + + w0[0] = wordl0[0] | wordr0[0]; + w0[1] = wordl0[1] | wordr0[1]; + w0[2] = wordl0[2] | wordr0[2]; + w0[3] = wordl0[3] | wordr0[3]; + w1[0] = wordl1[0] | wordr1[0]; + w1[1] = wordl1[1] | wordr1[1]; + w1[2] = wordl1[2] | wordr1[2]; + w1[3] = wordl1[3] | wordr1[3]; + w2[0] = wordl2[0] | wordr2[0]; + w2[1] = wordl2[1] | wordr2[1]; + w2[2] = wordl2[2] | wordr2[2]; + w2[3] = wordl2[3] | wordr2[3]; + w3[0] = wordl3[0] | wordr3[0]; + w3[1] = wordl3[1] | wordr3[1]; + w3[2] = wordl3[2] | wordr3[2]; + w3[3] = wordl3[3] | wordr3[3]; + + append_0x80_4 (w0, w1, w2, w3, pw_len); + + const u32 pw_salt_len = pw_len + salt_len; + + /** + * prepend salt + */ + + // first step fixed 56 bytes of salt + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + w0_t[0] = salt_buf0[0]; + w0_t[1] = salt_buf0[1]; + w0_t[2] = salt_buf0[2]; + w0_t[3] = salt_buf0[3]; + w1_t[0] = salt_buf1[0]; + w1_t[1] = salt_buf1[1]; + w1_t[2] = salt_buf1[2]; + w1_t[3] = salt_buf1[3]; + w2_t[0] = salt_buf2[0]; + w2_t[1] = salt_buf2[1]; + w2_t[2] = salt_buf2[2]; + w2_t[3] = salt_buf2[3]; + w3_t[0] = salt_buf3[0]; + w3_t[1] = salt_buf3[1]; + + // after 56 byte salt, we have beginning of the password + + w3_t[2] = w0[0]; + w3_t[3] = w0[1]; + + /** + * md5 + */ + + // first transform + + u32x a = MD5M_A; + u32x b = MD5M_B; + u32x c = MD5M_C; + u32x d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0_t[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0_t[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0_t[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1_t[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1_t[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1_t[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2_t[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2_t[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2_t[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3_t[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3_t[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3_t[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0_t[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1_t[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2_t[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1_t[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1_t[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2_t[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3_t[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0_t[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2_t[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3_t[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0_t[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1_t[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3_t[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H , a, b, c, d, w1_t[1], MD5C20, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w2_t[0], MD5C21, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w2_t[3], MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w3_t[2], MD5C23, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w0_t[1], MD5C24, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w1_t[0], MD5C25, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w1_t[3], MD5C26, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w2_t[2], MD5C27, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w3_t[1], MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w0_t[0], MD5C29, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w0_t[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w1_t[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w2_t[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w3_t[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w3_t[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w0_t[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1_t[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3_t[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3_t[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0_t[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0_t[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2_t[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1_t[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3_t[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1_t[0], MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w2_t[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0_t[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2_t[1], MD5C3f, MD5S33); + + a += MD5M_A; + b += MD5M_B; + c += MD5M_C; + d += MD5M_D; + + u32x r_a = a; + u32x r_b = b; + u32x r_c = c; + u32x r_d = d; + + // 2nd transform + + w0_t[0] = w0[2]; + w0_t[1] = w0[3]; + w0_t[2] = w1[0]; + w0_t[3] = w1[1]; + w1_t[0] = w1[2]; + w1_t[1] = w1[3]; + w1_t[2] = w2[0]; + w1_t[3] = w2[1]; + w2_t[0] = w2[2]; + w2_t[1] = w2[3]; + w2_t[2] = w3[0]; + w2_t[3] = w3[1]; + w3_t[0] = w3[2]; + w3_t[1] = w3[3]; + w3_t[2] = pw_salt_len * 8; + w3_t[3] = 0; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0_t[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0_t[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0_t[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1_t[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1_t[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1_t[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2_t[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2_t[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2_t[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3_t[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3_t[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3_t[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0_t[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1_t[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2_t[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1_t[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1_t[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2_t[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3_t[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0_t[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2_t[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3_t[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0_t[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1_t[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3_t[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H , a, b, c, d, w1_t[1], MD5C20, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w2_t[0], MD5C21, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w2_t[3], MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w3_t[2], MD5C23, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w0_t[1], MD5C24, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w1_t[0], MD5C25, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w1_t[3], MD5C26, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w2_t[2], MD5C27, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w3_t[1], MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w0_t[0], MD5C29, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w0_t[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w1_t[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w2_t[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w3_t[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w3_t[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w0_t[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1_t[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3_t[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3_t[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0_t[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0_t[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2_t[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1_t[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3_t[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1_t[0], MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w2_t[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0_t[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2_t[1], MD5C3f, MD5S33); + + a += r_a; + b += r_b; + c += r_c; + d += r_d; + + const u32x r0 = a; + const u32x r1 = d; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_M + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m11000_m08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m11000_m16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m11000_s04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, combs_buf[0].pw_len); + } + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[ 1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[ 2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[ 3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[ 4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[ 5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[ 6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[ 7]; + + u32 salt_buf2[4]; + + salt_buf2[0] = salt_bufs[salt_pos].salt_buf[ 8]; + salt_buf2[1] = salt_bufs[salt_pos].salt_buf[ 9]; + salt_buf2[2] = salt_bufs[salt_pos].salt_buf[10]; + salt_buf2[3] = salt_bufs[salt_pos].salt_buf[11]; + + u32 salt_buf3[2]; + + salt_buf3[0] = salt_bufs[salt_pos].salt_buf[12]; + salt_buf3[1] = salt_bufs[salt_pos].salt_buf[13]; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = combs_buf[il_pos].pw_len; + + const u32 pw_len = pw_l_len + pw_r_len; + + u32 wordr0[4]; + u32 wordr1[4]; + u32 wordr2[4]; + u32 wordr3[4]; + + wordr0[0] = combs_buf[il_pos].i[0]; + wordr0[1] = combs_buf[il_pos].i[1]; + wordr0[2] = combs_buf[il_pos].i[2]; + wordr0[3] = combs_buf[il_pos].i[3]; + wordr1[0] = combs_buf[il_pos].i[4]; + wordr1[1] = combs_buf[il_pos].i[5]; + wordr1[2] = combs_buf[il_pos].i[6]; + wordr1[3] = combs_buf[il_pos].i[7]; + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + u32x w0[4]; + u32x w1[4]; + u32x w2[4]; + u32x w3[4]; + + w0[0] = wordl0[0] | wordr0[0]; + w0[1] = wordl0[1] | wordr0[1]; + w0[2] = wordl0[2] | wordr0[2]; + w0[3] = wordl0[3] | wordr0[3]; + w1[0] = wordl1[0] | wordr1[0]; + w1[1] = wordl1[1] | wordr1[1]; + w1[2] = wordl1[2] | wordr1[2]; + w1[3] = wordl1[3] | wordr1[3]; + w2[0] = wordl2[0] | wordr2[0]; + w2[1] = wordl2[1] | wordr2[1]; + w2[2] = wordl2[2] | wordr2[2]; + w2[3] = wordl2[3] | wordr2[3]; + w3[0] = wordl3[0] | wordr3[0]; + w3[1] = wordl3[1] | wordr3[1]; + w3[2] = wordl3[2] | wordr3[2]; + w3[3] = wordl3[3] | wordr3[3]; + + append_0x80_4 (w0, w1, w2, w3, pw_len); + + const u32 pw_salt_len = pw_len + salt_len; + + /** + * prepend salt + */ + + // first step fixed 56 bytes of salt + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + w0_t[0] = salt_buf0[0]; + w0_t[1] = salt_buf0[1]; + w0_t[2] = salt_buf0[2]; + w0_t[3] = salt_buf0[3]; + w1_t[0] = salt_buf1[0]; + w1_t[1] = salt_buf1[1]; + w1_t[2] = salt_buf1[2]; + w1_t[3] = salt_buf1[3]; + w2_t[0] = salt_buf2[0]; + w2_t[1] = salt_buf2[1]; + w2_t[2] = salt_buf2[2]; + w2_t[3] = salt_buf2[3]; + w3_t[0] = salt_buf3[0]; + w3_t[1] = salt_buf3[1]; + + // after 56 byte salt, we have beginning of the password + + w3_t[2] = w0[0]; + w3_t[3] = w0[1]; + + /** + * md5 + */ + + // first transform + + u32x a = MD5M_A; + u32x b = MD5M_B; + u32x c = MD5M_C; + u32x d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0_t[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0_t[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0_t[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1_t[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1_t[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1_t[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2_t[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2_t[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2_t[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3_t[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3_t[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3_t[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0_t[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1_t[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2_t[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1_t[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1_t[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2_t[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3_t[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0_t[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2_t[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3_t[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0_t[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1_t[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3_t[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H , a, b, c, d, w1_t[1], MD5C20, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w2_t[0], MD5C21, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w2_t[3], MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w3_t[2], MD5C23, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w0_t[1], MD5C24, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w1_t[0], MD5C25, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w1_t[3], MD5C26, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w2_t[2], MD5C27, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w3_t[1], MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w0_t[0], MD5C29, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w0_t[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w1_t[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w2_t[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w3_t[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w3_t[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w0_t[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1_t[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3_t[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3_t[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0_t[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0_t[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2_t[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1_t[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3_t[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1_t[0], MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w2_t[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0_t[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2_t[1], MD5C3f, MD5S33); + + a += MD5M_A; + b += MD5M_B; + c += MD5M_C; + d += MD5M_D; + + u32x r_a = a; + u32x r_b = b; + u32x r_c = c; + u32x r_d = d; + + // 2nd transform + + w0_t[0] = w0[2]; + w0_t[1] = w0[3]; + w0_t[2] = w1[0]; + w0_t[3] = w1[1]; + w1_t[0] = w1[2]; + w1_t[1] = w1[3]; + w1_t[2] = w2[0]; + w1_t[3] = w2[1]; + w2_t[0] = w2[2]; + w2_t[1] = w2[3]; + w2_t[2] = w3[0]; + w2_t[3] = w3[1]; + w3_t[0] = w3[2]; + w3_t[1] = w3[3]; + w3_t[2] = pw_salt_len * 8; + w3_t[3] = 0; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0_t[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0_t[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0_t[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1_t[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1_t[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1_t[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2_t[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2_t[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2_t[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3_t[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3_t[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3_t[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0_t[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1_t[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2_t[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1_t[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1_t[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2_t[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3_t[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0_t[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2_t[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3_t[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0_t[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1_t[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3_t[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H , a, b, c, d, w1_t[1], MD5C20, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w2_t[0], MD5C21, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w2_t[3], MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w3_t[2], MD5C23, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w0_t[1], MD5C24, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w1_t[0], MD5C25, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w1_t[3], MD5C26, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w2_t[2], MD5C27, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w3_t[1], MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w0_t[0], MD5C29, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w0_t[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w1_t[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w2_t[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w3_t[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w3_t[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w0_t[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1_t[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3_t[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3_t[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0_t[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0_t[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2_t[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1_t[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3_t[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1_t[0], MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w2_t[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0_t[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2_t[1], MD5C3f, MD5S33); + + a += r_a; + b += r_b; + c += r_c; + d += r_d; + + const u32x r0 = a; + const u32x r1 = d; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_S + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m11000_s08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m11000_s16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/amd/m11000_a3.cl b/amd/m11000_a3.cl new file mode 100644 index 0000000000..5407cd2879 --- /dev/null +++ b/amd/m11000_a3.cl @@ -0,0 +1,891 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _MD5_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW4 +#define VECT_SIZE4 +#endif + +#ifdef VLIW5 +#define VECT_SIZE4 +#endif + +#define DGST_R0 0 +#define DGST_R1 3 +#define DGST_R2 2 +#define DGST_R3 1 + +#include "include/kernel_functions.c" +#include "types_amd.c" +#include "common_amd.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +static void m11000m (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], const u32 pw_len, __global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset) +{ + /** + * modifier + */ + + const u32 gid = get_global_id (0); + const u32 lid = get_local_id (0); + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[ 1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[ 2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[ 3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[ 4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[ 5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[ 6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[ 7]; + + u32 salt_buf2[4]; + + salt_buf2[0] = salt_bufs[salt_pos].salt_buf[ 8]; + salt_buf2[1] = salt_bufs[salt_pos].salt_buf[ 9]; + salt_buf2[2] = salt_bufs[salt_pos].salt_buf[10]; + salt_buf2[3] = salt_bufs[salt_pos].salt_buf[11]; + + u32 salt_buf3[2]; + + salt_buf3[0] = salt_bufs[salt_pos].salt_buf[12]; + salt_buf3[1] = salt_bufs[salt_pos].salt_buf[13]; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + const u32 pw_salt_len = pw_len + salt_len; + + /** + * loop + */ + + u32x w0l = w0[0]; + + for (u32 il_pos = 0; il_pos < bfs_cnt; il_pos++) + { + const u32 w0r = bfs_buf[il_pos].i; + + w0[0] = w0l | w0r; + + /** + * prepend salt + */ + + // first step fixed 56 bytes of salt + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + w0_t[0] = salt_buf0[0]; + w0_t[1] = salt_buf0[1]; + w0_t[2] = salt_buf0[2]; + w0_t[3] = salt_buf0[3]; + w1_t[0] = salt_buf1[0]; + w1_t[1] = salt_buf1[1]; + w1_t[2] = salt_buf1[2]; + w1_t[3] = salt_buf1[3]; + w2_t[0] = salt_buf2[0]; + w2_t[1] = salt_buf2[1]; + w2_t[2] = salt_buf2[2]; + w2_t[3] = salt_buf2[3]; + w3_t[0] = salt_buf3[0]; + w3_t[1] = salt_buf3[1]; + + // after 56 byte salt, we have beginning of the password + + w3_t[2] = w0[0]; + w3_t[3] = w0[1]; + + /** + * md5 + */ + + // first transform + + u32x a = MD5M_A; + u32x b = MD5M_B; + u32x c = MD5M_C; + u32x d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0_t[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0_t[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0_t[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1_t[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1_t[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1_t[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2_t[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2_t[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2_t[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3_t[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3_t[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3_t[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0_t[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1_t[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2_t[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1_t[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1_t[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2_t[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3_t[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0_t[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2_t[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3_t[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0_t[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1_t[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3_t[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H , a, b, c, d, w1_t[1], MD5C20, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w2_t[0], MD5C21, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w2_t[3], MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w3_t[2], MD5C23, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w0_t[1], MD5C24, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w1_t[0], MD5C25, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w1_t[3], MD5C26, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w2_t[2], MD5C27, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w3_t[1], MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w0_t[0], MD5C29, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w0_t[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w1_t[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w2_t[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w3_t[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w3_t[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w0_t[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1_t[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3_t[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3_t[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0_t[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0_t[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2_t[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1_t[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3_t[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1_t[0], MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w2_t[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0_t[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2_t[1], MD5C3f, MD5S33); + + a += MD5M_A; + b += MD5M_B; + c += MD5M_C; + d += MD5M_D; + + u32x r_a = a; + u32x r_b = b; + u32x r_c = c; + u32x r_d = d; + + // 2nd transform + + w0_t[0] = w0[2]; + w0_t[1] = w0[3]; + w0_t[2] = w1[0]; + w0_t[3] = w1[1]; + w1_t[0] = w1[2]; + w1_t[1] = w1[3]; + w1_t[2] = w2[0]; + w1_t[3] = w2[1]; + w2_t[0] = w2[2]; + w2_t[1] = w2[3]; + w2_t[2] = w3[0]; + w2_t[3] = w3[1]; + w3_t[0] = w3[2]; + w3_t[1] = w3[3]; + w3_t[2] = pw_salt_len * 8; + w3_t[3] = 0; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0_t[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0_t[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0_t[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1_t[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1_t[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1_t[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2_t[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2_t[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2_t[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3_t[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3_t[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3_t[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0_t[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1_t[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2_t[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1_t[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1_t[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2_t[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3_t[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0_t[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2_t[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3_t[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0_t[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1_t[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3_t[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H , a, b, c, d, w1_t[1], MD5C20, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w2_t[0], MD5C21, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w2_t[3], MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w3_t[2], MD5C23, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w0_t[1], MD5C24, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w1_t[0], MD5C25, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w1_t[3], MD5C26, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w2_t[2], MD5C27, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w3_t[1], MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w0_t[0], MD5C29, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w0_t[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w1_t[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w2_t[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w3_t[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w3_t[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w0_t[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1_t[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3_t[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3_t[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0_t[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0_t[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2_t[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1_t[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3_t[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1_t[0], MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w2_t[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0_t[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2_t[1], MD5C3f, MD5S33); + + a += r_a; + b += r_b; + c += r_c; + d += r_d; + + const u32x r0 = a; + const u32x r1 = d; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_M + } +} + +static void m11000s (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], const u32 pw_len, __global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset) +{ + /** + * modifier + */ + + const u32 gid = get_global_id (0); + const u32 lid = get_local_id (0); + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[ 1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[ 2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[ 3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[ 4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[ 5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[ 6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[ 7]; + + u32 salt_buf2[4]; + + salt_buf2[0] = salt_bufs[salt_pos].salt_buf[ 8]; + salt_buf2[1] = salt_bufs[salt_pos].salt_buf[ 9]; + salt_buf2[2] = salt_bufs[salt_pos].salt_buf[10]; + salt_buf2[3] = salt_bufs[salt_pos].salt_buf[11]; + + u32 salt_buf3[2]; + + salt_buf3[0] = salt_bufs[salt_pos].salt_buf[12]; + salt_buf3[1] = salt_bufs[salt_pos].salt_buf[13]; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + const u32 pw_salt_len = pw_len + salt_len; + + /** + * loop + */ + + u32x w0l = w0[0]; + + for (u32 il_pos = 0; il_pos < bfs_cnt; il_pos++) + { + const u32 w0r = bfs_buf[il_pos].i; + + w0[0] = w0l | w0r; + + /** + * prepend salt + */ + + // first step fixed 56 bytes of salt + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + w0_t[0] = salt_buf0[0]; + w0_t[1] = salt_buf0[1]; + w0_t[2] = salt_buf0[2]; + w0_t[3] = salt_buf0[3]; + w1_t[0] = salt_buf1[0]; + w1_t[1] = salt_buf1[1]; + w1_t[2] = salt_buf1[2]; + w1_t[3] = salt_buf1[3]; + w2_t[0] = salt_buf2[0]; + w2_t[1] = salt_buf2[1]; + w2_t[2] = salt_buf2[2]; + w2_t[3] = salt_buf2[3]; + w3_t[0] = salt_buf3[0]; + w3_t[1] = salt_buf3[1]; + + // after 56 byte salt, we have beginning of the password + + w3_t[2] = w0[0]; + w3_t[3] = w0[1]; + + /** + * md5 + */ + + // first transform + + u32x a = MD5M_A; + u32x b = MD5M_B; + u32x c = MD5M_C; + u32x d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0_t[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0_t[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0_t[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1_t[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1_t[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1_t[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2_t[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2_t[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2_t[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3_t[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3_t[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3_t[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0_t[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1_t[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2_t[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1_t[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1_t[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2_t[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3_t[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0_t[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2_t[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3_t[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0_t[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1_t[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3_t[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H , a, b, c, d, w1_t[1], MD5C20, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w2_t[0], MD5C21, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w2_t[3], MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w3_t[2], MD5C23, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w0_t[1], MD5C24, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w1_t[0], MD5C25, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w1_t[3], MD5C26, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w2_t[2], MD5C27, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w3_t[1], MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w0_t[0], MD5C29, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w0_t[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w1_t[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w2_t[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w3_t[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w3_t[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w0_t[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1_t[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3_t[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3_t[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0_t[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0_t[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2_t[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1_t[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3_t[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1_t[0], MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w2_t[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0_t[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2_t[1], MD5C3f, MD5S33); + + a += MD5M_A; + b += MD5M_B; + c += MD5M_C; + d += MD5M_D; + + u32x r_a = a; + u32x r_b = b; + u32x r_c = c; + u32x r_d = d; + + // 2nd transform + + w0_t[0] = w0[2]; + w0_t[1] = w0[3]; + w0_t[2] = w1[0]; + w0_t[3] = w1[1]; + w1_t[0] = w1[2]; + w1_t[1] = w1[3]; + w1_t[2] = w2[0]; + w1_t[3] = w2[1]; + w2_t[0] = w2[2]; + w2_t[1] = w2[3]; + w2_t[2] = w3[0]; + w2_t[3] = w3[1]; + w3_t[0] = w3[2]; + w3_t[1] = w3[3]; + w3_t[2] = pw_salt_len * 8; + w3_t[3] = 0; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0_t[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0_t[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0_t[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1_t[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1_t[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1_t[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2_t[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2_t[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2_t[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3_t[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3_t[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3_t[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0_t[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1_t[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2_t[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1_t[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1_t[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2_t[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3_t[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0_t[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2_t[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3_t[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0_t[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1_t[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3_t[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H , a, b, c, d, w1_t[1], MD5C20, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w2_t[0], MD5C21, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w2_t[3], MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w3_t[2], MD5C23, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w0_t[1], MD5C24, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w1_t[0], MD5C25, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w1_t[3], MD5C26, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w2_t[2], MD5C27, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w3_t[1], MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w0_t[0], MD5C29, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w0_t[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w1_t[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w2_t[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w3_t[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w3_t[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w0_t[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1_t[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3_t[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3_t[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0_t[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0_t[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2_t[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1_t[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3_t[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1_t[0], MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w2_t[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0_t[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2_t[1], MD5C3f, MD5S33); + + a += r_a; + b += r_b; + c += r_c; + d += r_d; + + const u32x r0 = a; + const u32x r1 = d; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_S + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m11000_m04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m11000m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m11000_m08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m11000m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m11000_m16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = pws[gid].i[ 8]; + w2[1] = pws[gid].i[ 9]; + w2[2] = pws[gid].i[10]; + w2[3] = pws[gid].i[11]; + + u32x w3[4]; + + w3[0] = pws[gid].i[12]; + w3[1] = pws[gid].i[13]; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m11000m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m11000_s04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m11000s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m11000_s08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m11000s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m11000_s16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = pws[gid].i[ 8]; + w2[1] = pws[gid].i[ 9]; + w2[2] = pws[gid].i[10]; + w2[3] = pws[gid].i[11]; + + u32x w3[4]; + + w3[0] = pws[gid].i[12]; + w3[1] = pws[gid].i[13]; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m11000s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} diff --git a/amd/m11100_a0.cl b/amd/m11100_a0.cl new file mode 100644 index 0000000000..48a1145f4c --- /dev/null +++ b/amd/m11100_a0.cl @@ -0,0 +1,851 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _MD5_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW4 +#define VECT_SIZE2 +#endif + +#ifdef VLIW5 +#define VECT_SIZE2 +#endif + +#define DGST_R0 0 +#define DGST_R1 3 +#define DGST_R2 2 +#define DGST_R3 1 + +#include "include/kernel_functions.c" +#include "types_amd.c" +#include "common_amd.c" +#include "include/rp_gpu.h" +#include "rp_amd.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +#ifdef VECT_SIZE1 +#define uint_to_hex_lower8(i) l_bin2asc[(i)] +#endif + +#ifdef VECT_SIZE2 +#define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1]) +#endif + +#ifdef VECT_SIZE4 +#define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3]) +#endif + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m11100_m04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + u32x pw_buf1[4]; + + pw_buf1[0] = pws[gid].i[ 4]; + pw_buf1[1] = pws[gid].i[ 5]; + pw_buf1[2] = pws[gid].i[ 6]; + pw_buf1[3] = pws[gid].i[ 7]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * challenge + */ + + u32 challenge; + + challenge = salt_bufs[salt_pos].salt_buf[0]; + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 1]; // not a bug + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[ 2]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[ 3]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[ 4]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[ 5]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[ 6]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[ 7]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[ 8]; + + const u32 salt_len = salt_bufs[salt_pos].salt_len - 4; + + /** + * bin2asc table + */ + + __local u32 l_bin2asc[256]; + + const u32 lid4 = lid * 4; + + const u32 lid40 = lid4 + 0; + const u32 lid41 = lid4 + 1; + const u32 lid42 = lid4 + 2; + const u32 lid43 = lid4 + 3; + + const u32 v400 = (lid40 >> 0) & 15; + const u32 v401 = (lid40 >> 4) & 15; + const u32 v410 = (lid41 >> 0) & 15; + const u32 v411 = (lid41 >> 4) & 15; + const u32 v420 = (lid42 >> 0) & 15; + const u32 v421 = (lid42 >> 4) & 15; + const u32 v430 = (lid43 >> 0) & 15; + const u32 v431 = (lid43 >> 4) & 15; + + l_bin2asc[lid40] = ((v400 < 10) ? '0' + v400 : 'a' - 10 + v400) << 8 + | ((v401 < 10) ? '0' + v401 : 'a' - 10 + v401) << 0; + l_bin2asc[lid41] = ((v410 < 10) ? '0' + v410 : 'a' - 10 + v410) << 8 + | ((v411 < 10) ? '0' + v411 : 'a' - 10 + v411) << 0; + l_bin2asc[lid42] = ((v420 < 10) ? '0' + v420 : 'a' - 10 + v420) << 8 + | ((v421 < 10) ? '0' + v421 : 'a' - 10 + v421) << 0; + l_bin2asc[lid43] = ((v430 < 10) ? '0' + v430 : 'a' - 10 + v430) << 8 + | ((v431 < 10) ? '0' + v431 : 'a' - 10 + v431) << 0; + + barrier (CLK_LOCAL_MEM_FENCE); + + if (gid >= gid_max) return; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + + w0[0] = pw_buf0[0]; + w0[1] = pw_buf0[1]; + w0[2] = pw_buf0[2]; + w0[3] = pw_buf0[3]; + + u32x w1[4]; + + w1[0] = pw_buf1[0]; + w1[1] = pw_buf1[1]; + w1[2] = pw_buf1[2]; + w1[3] = pw_buf1[3]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 out_len = apply_rules (rules_buf[il_pos].cmds, w0, w1, pw_len); + + u32x w0_t[4]; + + w0_t[0] = salt_buf0[0]; + w0_t[1] = salt_buf0[1]; + w0_t[2] = salt_buf0[2]; + w0_t[3] = salt_buf0[3]; + + u32x w1_t[4]; + + w1_t[0] = salt_buf1[0]; + w1_t[1] = salt_buf1[1]; + w1_t[2] = salt_buf1[2]; + w1_t[3] = salt_buf1[3]; + + u32x w2_t[4]; + + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + + u32x w3_t[4]; + + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = 0; + + /* + * append the salt + */ + + switch_buffer_by_offset (w0_t, w1_t, w2_t, w3_t, pw_len); + + const u32 pw_salt_len = out_len + salt_len; + + w0_t[0] |= w0[0]; + w0_t[1] |= w0[1]; + w0_t[2] |= w0[2]; + w0_t[3] |= w0[3]; + + w1_t[0] |= w1[0]; + w1_t[1] |= w1[1]; + w1_t[2] |= w1[2]; + w1_t[3] |= w1[3]; + + w2_t[0] |= w2[0]; + w2_t[1] |= w2[1]; + w2_t[2] |= w2[2]; + w2_t[3] |= w2[3]; + + w3_t[0] |= w3[0]; + w3_t[1] |= w3[1]; + w3_t[2] = pw_salt_len * 8; + w3_t[3] = 0; + + /* + * md5 ($pass.$salt) + */ + + u32x a = MD5M_A; + u32x b = MD5M_B; + u32x c = MD5M_C; + u32x d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0_t[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0_t[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0_t[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1_t[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1_t[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1_t[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2_t[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2_t[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2_t[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3_t[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3_t[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3_t[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0_t[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1_t[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2_t[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1_t[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1_t[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2_t[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3_t[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0_t[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2_t[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3_t[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0_t[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1_t[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3_t[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H , a, b, c, d, w1_t[1], MD5C20, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w2_t[0], MD5C21, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w2_t[3], MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w3_t[2], MD5C23, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w0_t[1], MD5C24, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w1_t[0], MD5C25, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w1_t[3], MD5C26, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w2_t[2], MD5C27, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w3_t[1], MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w0_t[0], MD5C29, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w0_t[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w1_t[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w2_t[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w3_t[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w3_t[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w0_t[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1_t[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3_t[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3_t[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0_t[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0_t[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2_t[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1_t[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3_t[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1_t[0], MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w2_t[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0_t[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2_t[1], MD5C3f, MD5S33); + + a += MD5M_A; + b += MD5M_B; + c += MD5M_C; + d += MD5M_D; + + w0_t[0] = uint_to_hex_lower8 ((a >> 0) & 255) << 0 + | uint_to_hex_lower8 ((a >> 8) & 255) << 16; + w0_t[1] = uint_to_hex_lower8 ((a >> 16) & 255) << 0 + | uint_to_hex_lower8 ((a >> 24) & 255) << 16; + w0_t[2] = uint_to_hex_lower8 ((b >> 0) & 255) << 0 + | uint_to_hex_lower8 ((b >> 8) & 255) << 16; + w0_t[3] = uint_to_hex_lower8 ((b >> 16) & 255) << 0 + | uint_to_hex_lower8 ((b >> 24) & 255) << 16; + w1_t[0] = uint_to_hex_lower8 ((c >> 0) & 255) << 0 + | uint_to_hex_lower8 ((c >> 8) & 255) << 16; + w1_t[1] = uint_to_hex_lower8 ((c >> 16) & 255) << 0 + | uint_to_hex_lower8 ((c >> 24) & 255) << 16; + w1_t[2] = uint_to_hex_lower8 ((d >> 0) & 255) << 0 + | uint_to_hex_lower8 ((d >> 8) & 255) << 16; + w1_t[3] = uint_to_hex_lower8 ((d >> 16) & 255) << 0 + | uint_to_hex_lower8 ((d >> 24) & 255) << 16; + + // add the 4 byte challenge here + + w2_t[0] = challenge; + w2_t[1] = 0x00000080; + w2_t[2] = 0; + w2_t[3] = 0; + + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = (32 + 4) * 8; + w3_t[3] = 0; + + /** + * md5 ($hash.$challenge) + */ + + a = MD5M_A; + b = MD5M_B; + c = MD5M_C; + d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0_t[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0_t[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0_t[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1_t[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1_t[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1_t[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2_t[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2_t[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2_t[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3_t[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3_t[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3_t[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0_t[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1_t[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2_t[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1_t[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1_t[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2_t[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3_t[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0_t[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2_t[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3_t[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0_t[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1_t[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3_t[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H , a, b, c, d, w1_t[1], MD5C20, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w2_t[0], MD5C21, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w2_t[3], MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w3_t[2], MD5C23, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w0_t[1], MD5C24, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w1_t[0], MD5C25, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w1_t[3], MD5C26, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w2_t[2], MD5C27, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w3_t[1], MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w0_t[0], MD5C29, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w0_t[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w1_t[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w2_t[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w3_t[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w3_t[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w0_t[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1_t[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3_t[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3_t[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0_t[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0_t[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2_t[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1_t[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3_t[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1_t[0], MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w2_t[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0_t[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2_t[1], MD5C3f, MD5S33); + + const u32x r0 = a; + const u32x r1 = d; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_M + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m11100_m08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m11100_m16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m11100_s04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + u32x pw_buf1[4]; + + pw_buf1[0] = pws[gid].i[ 4]; + pw_buf1[1] = pws[gid].i[ 5]; + pw_buf1[2] = pws[gid].i[ 6]; + pw_buf1[3] = pws[gid].i[ 7]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * challenge + */ + + u32 challenge; + + challenge = salt_bufs[salt_pos].salt_buf[0]; + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 1]; // not a bug + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[ 2]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[ 3]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[ 4]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[ 5]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[ 6]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[ 7]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[ 8]; + + const u32 salt_len = salt_bufs[salt_pos].salt_len - 4; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * bin2asc table + */ + + __local u32 l_bin2asc[256]; + + const u32 lid4 = lid * 4; + + const u32 lid40 = lid4 + 0; + const u32 lid41 = lid4 + 1; + const u32 lid42 = lid4 + 2; + const u32 lid43 = lid4 + 3; + + const u32 v400 = (lid40 >> 0) & 15; + const u32 v401 = (lid40 >> 4) & 15; + const u32 v410 = (lid41 >> 0) & 15; + const u32 v411 = (lid41 >> 4) & 15; + const u32 v420 = (lid42 >> 0) & 15; + const u32 v421 = (lid42 >> 4) & 15; + const u32 v430 = (lid43 >> 0) & 15; + const u32 v431 = (lid43 >> 4) & 15; + + l_bin2asc[lid40] = ((v400 < 10) ? '0' + v400 : 'a' - 10 + v400) << 8 + | ((v401 < 10) ? '0' + v401 : 'a' - 10 + v401) << 0; + l_bin2asc[lid41] = ((v410 < 10) ? '0' + v410 : 'a' - 10 + v410) << 8 + | ((v411 < 10) ? '0' + v411 : 'a' - 10 + v411) << 0; + l_bin2asc[lid42] = ((v420 < 10) ? '0' + v420 : 'a' - 10 + v420) << 8 + | ((v421 < 10) ? '0' + v421 : 'a' - 10 + v421) << 0; + l_bin2asc[lid43] = ((v430 < 10) ? '0' + v430 : 'a' - 10 + v430) << 8 + | ((v431 < 10) ? '0' + v431 : 'a' - 10 + v431) << 0; + + barrier (CLK_LOCAL_MEM_FENCE); + + if (gid >= gid_max) return; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + + w0[0] = pw_buf0[0]; + w0[1] = pw_buf0[1]; + w0[2] = pw_buf0[2]; + w0[3] = pw_buf0[3]; + + u32x w1[4]; + + w1[0] = pw_buf1[0]; + w1[1] = pw_buf1[1]; + w1[2] = pw_buf1[2]; + w1[3] = pw_buf1[3]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 out_len = apply_rules (rules_buf[il_pos].cmds, w0, w1, pw_len); + + u32x w0_t[4]; + + w0_t[0] = salt_buf0[0]; + w0_t[1] = salt_buf0[1]; + w0_t[2] = salt_buf0[2]; + w0_t[3] = salt_buf0[3]; + + u32x w1_t[4]; + + w1_t[0] = salt_buf1[0]; + w1_t[1] = salt_buf1[1]; + w1_t[2] = salt_buf1[2]; + w1_t[3] = salt_buf1[3]; + + u32x w2_t[4]; + + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + + u32x w3_t[4]; + + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = 0; + + /* + * append the salt + */ + + switch_buffer_by_offset (w0_t, w1_t, w2_t, w3_t, pw_len); + + const u32 pw_salt_len = out_len + salt_len; + + w0_t[0] |= w0[0]; + w0_t[1] |= w0[1]; + w0_t[2] |= w0[2]; + w0_t[3] |= w0[3]; + + w1_t[0] |= w1[0]; + w1_t[1] |= w1[1]; + w1_t[2] |= w1[2]; + w1_t[3] |= w1[3]; + + w2_t[0] |= w2[0]; + w2_t[1] |= w2[1]; + w2_t[2] |= w2[2]; + w2_t[3] |= w2[3]; + + w3_t[0] |= w3[0]; + w3_t[1] |= w3[1]; + w3_t[2] = pw_salt_len * 8; + w3_t[3] = 0; + + /* + * md5 ($pass.$salt) + */ + + u32x a = MD5M_A; + u32x b = MD5M_B; + u32x c = MD5M_C; + u32x d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0_t[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0_t[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0_t[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1_t[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1_t[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1_t[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2_t[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2_t[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2_t[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3_t[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3_t[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3_t[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0_t[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1_t[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2_t[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1_t[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1_t[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2_t[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3_t[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0_t[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2_t[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3_t[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0_t[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1_t[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3_t[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H , a, b, c, d, w1_t[1], MD5C20, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w2_t[0], MD5C21, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w2_t[3], MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w3_t[2], MD5C23, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w0_t[1], MD5C24, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w1_t[0], MD5C25, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w1_t[3], MD5C26, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w2_t[2], MD5C27, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w3_t[1], MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w0_t[0], MD5C29, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w0_t[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w1_t[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w2_t[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w3_t[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w3_t[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w0_t[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1_t[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3_t[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3_t[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0_t[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0_t[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2_t[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1_t[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3_t[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1_t[0], MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w2_t[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0_t[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2_t[1], MD5C3f, MD5S33); + + a += MD5M_A; + b += MD5M_B; + c += MD5M_C; + d += MD5M_D; + + w0_t[0] = uint_to_hex_lower8 ((a >> 0) & 255) << 0 + | uint_to_hex_lower8 ((a >> 8) & 255) << 16; + w0_t[1] = uint_to_hex_lower8 ((a >> 16) & 255) << 0 + | uint_to_hex_lower8 ((a >> 24) & 255) << 16; + w0_t[2] = uint_to_hex_lower8 ((b >> 0) & 255) << 0 + | uint_to_hex_lower8 ((b >> 8) & 255) << 16; + w0_t[3] = uint_to_hex_lower8 ((b >> 16) & 255) << 0 + | uint_to_hex_lower8 ((b >> 24) & 255) << 16; + w1_t[0] = uint_to_hex_lower8 ((c >> 0) & 255) << 0 + | uint_to_hex_lower8 ((c >> 8) & 255) << 16; + w1_t[1] = uint_to_hex_lower8 ((c >> 16) & 255) << 0 + | uint_to_hex_lower8 ((c >> 24) & 255) << 16; + w1_t[2] = uint_to_hex_lower8 ((d >> 0) & 255) << 0 + | uint_to_hex_lower8 ((d >> 8) & 255) << 16; + w1_t[3] = uint_to_hex_lower8 ((d >> 16) & 255) << 0 + | uint_to_hex_lower8 ((d >> 24) & 255) << 16; + + // add the 4 byte challenge here + + w2_t[0] = challenge; + w2_t[1] = 0x00000080; + w2_t[2] = 0; + w2_t[3] = 0; + + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = (32 + 4) * 8; + w3_t[3] = 0; + + /** + * md5 ($hash.$challenge) + */ + + a = MD5M_A; + b = MD5M_B; + c = MD5M_C; + d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0_t[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0_t[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0_t[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1_t[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1_t[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1_t[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2_t[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2_t[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2_t[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3_t[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3_t[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3_t[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0_t[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1_t[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2_t[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1_t[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1_t[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2_t[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3_t[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0_t[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2_t[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3_t[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0_t[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1_t[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3_t[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H , a, b, c, d, w1_t[1], MD5C20, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w2_t[0], MD5C21, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w2_t[3], MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w3_t[2], MD5C23, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w0_t[1], MD5C24, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w1_t[0], MD5C25, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w1_t[3], MD5C26, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w2_t[2], MD5C27, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w3_t[1], MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w0_t[0], MD5C29, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w0_t[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w1_t[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w2_t[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w3_t[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w3_t[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w0_t[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1_t[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3_t[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3_t[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0_t[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0_t[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2_t[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1_t[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3_t[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1_t[0], MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w2_t[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0_t[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2_t[1], MD5C3f, MD5S33); + + const u32x r0 = a; + const u32x r1 = d; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_S + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m11100_s08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m11100_s16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/amd/m11100_a1.cl b/amd/m11100_a1.cl new file mode 100644 index 0000000000..9af3b42886 --- /dev/null +++ b/amd/m11100_a1.cl @@ -0,0 +1,901 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _MD5_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW4 +#define VECT_SIZE2 +#endif + +#ifdef VLIW5 +#define VECT_SIZE2 +#endif + +#define DGST_R0 0 +#define DGST_R1 3 +#define DGST_R2 2 +#define DGST_R3 1 + +#include "include/kernel_functions.c" +#include "types_amd.c" +#include "common_amd.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +#ifdef VECT_SIZE1 +#define uint_to_hex_lower8(i) l_bin2asc[(i)] +#endif + +#ifdef VECT_SIZE2 +#define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1]) +#endif + +#ifdef VECT_SIZE4 +#define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3]) +#endif + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m11100_m04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, combs_buf[0].pw_len); + } + + /** + * challenge + */ + + u32 challenge; + + challenge = salt_bufs[salt_pos].salt_buf[0]; + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 1]; // not a bug + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[ 2]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[ 3]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[ 4]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[ 5]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[ 6]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[ 7]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[ 8]; + + const u32 salt_len = salt_bufs[salt_pos].salt_len - 4; + + /** + * bin2asc table + */ + + __local u32 l_bin2asc[256]; + + const u32 lid4 = lid * 4; + + const u32 lid40 = lid4 + 0; + const u32 lid41 = lid4 + 1; + const u32 lid42 = lid4 + 2; + const u32 lid43 = lid4 + 3; + + const u32 v400 = (lid40 >> 0) & 15; + const u32 v401 = (lid40 >> 4) & 15; + const u32 v410 = (lid41 >> 0) & 15; + const u32 v411 = (lid41 >> 4) & 15; + const u32 v420 = (lid42 >> 0) & 15; + const u32 v421 = (lid42 >> 4) & 15; + const u32 v430 = (lid43 >> 0) & 15; + const u32 v431 = (lid43 >> 4) & 15; + + l_bin2asc[lid40] = ((v400 < 10) ? '0' + v400 : 'a' - 10 + v400) << 8 + | ((v401 < 10) ? '0' + v401 : 'a' - 10 + v401) << 0; + l_bin2asc[lid41] = ((v410 < 10) ? '0' + v410 : 'a' - 10 + v410) << 8 + | ((v411 < 10) ? '0' + v411 : 'a' - 10 + v411) << 0; + l_bin2asc[lid42] = ((v420 < 10) ? '0' + v420 : 'a' - 10 + v420) << 8 + | ((v421 < 10) ? '0' + v421 : 'a' - 10 + v421) << 0; + l_bin2asc[lid43] = ((v430 < 10) ? '0' + v430 : 'a' - 10 + v430) << 8 + | ((v431 < 10) ? '0' + v431 : 'a' - 10 + v431) << 0; + + barrier (CLK_LOCAL_MEM_FENCE); + + if (gid >= gid_max) return; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = combs_buf[il_pos].pw_len; + + const u32 pw_len = pw_l_len + pw_r_len; + + u32 wordr0[4]; + + wordr0[0] = combs_buf[il_pos].i[0]; + wordr0[1] = combs_buf[il_pos].i[1]; + wordr0[2] = combs_buf[il_pos].i[2]; + wordr0[3] = combs_buf[il_pos].i[3]; + + u32 wordr1[4]; + + wordr1[0] = combs_buf[il_pos].i[4]; + wordr1[1] = combs_buf[il_pos].i[5]; + wordr1[2] = combs_buf[il_pos].i[6]; + wordr1[3] = combs_buf[il_pos].i[7]; + + u32 wordr2[4]; + + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + + u32 wordr3[4]; + + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + u32x w0_t[4]; + + w0_t[0] = salt_buf0[0]; + w0_t[1] = salt_buf0[1]; + w0_t[2] = salt_buf0[2]; + w0_t[3] = salt_buf0[3]; + + u32x w1_t[4]; + + w1_t[0] = salt_buf1[0]; + w1_t[1] = salt_buf1[1]; + w1_t[2] = salt_buf1[2]; + w1_t[3] = salt_buf1[3]; + + u32x w2_t[4]; + + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + + u32x w3_t[4]; + + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = 0; + + /* + * append the salt + */ + + switch_buffer_by_offset (w0_t, w1_t, w2_t, w3_t, pw_len); + + const u32 pw_salt_len = pw_len + salt_len; + + w0_t[0] |= wordl0[0] | wordr0[0]; + w0_t[1] |= wordl0[1] | wordr0[1]; + w0_t[2] |= wordl0[2] | wordr0[2]; + w0_t[3] |= wordl0[3] | wordr0[3]; + + w1_t[0] |= wordl1[0] | wordr1[0]; + w1_t[1] |= wordl1[1] | wordr1[1]; + w1_t[2] |= wordl1[2] | wordr1[2]; + w1_t[3] |= wordl1[3] | wordr1[3]; + + w2_t[0] |= wordl2[0] | wordr2[0]; + w2_t[1] |= wordl2[1] | wordr2[1]; + w2_t[2] |= wordl2[2] | wordr2[2]; + w2_t[3] |= wordl2[3] | wordr2[3]; + + w3_t[0] |= wordl3[0] | wordr3[0]; + w3_t[1] |= wordl3[0] | wordr3[0]; + w3_t[2] = pw_salt_len * 8; + w3_t[3] = 0; + + /* + * md5 ($pass.$salt) + */ + + u32x a = MD5M_A; + u32x b = MD5M_B; + u32x c = MD5M_C; + u32x d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0_t[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0_t[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0_t[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1_t[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1_t[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1_t[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2_t[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2_t[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2_t[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3_t[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3_t[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3_t[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0_t[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1_t[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2_t[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1_t[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1_t[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2_t[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3_t[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0_t[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2_t[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3_t[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0_t[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1_t[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3_t[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H , a, b, c, d, w1_t[1], MD5C20, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w2_t[0], MD5C21, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w2_t[3], MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w3_t[2], MD5C23, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w0_t[1], MD5C24, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w1_t[0], MD5C25, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w1_t[3], MD5C26, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w2_t[2], MD5C27, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w3_t[1], MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w0_t[0], MD5C29, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w0_t[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w1_t[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w2_t[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w3_t[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w3_t[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w0_t[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1_t[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3_t[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3_t[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0_t[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0_t[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2_t[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1_t[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3_t[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1_t[0], MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w2_t[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0_t[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2_t[1], MD5C3f, MD5S33); + + a += MD5M_A; + b += MD5M_B; + c += MD5M_C; + d += MD5M_D; + + w0_t[0] = uint_to_hex_lower8 ((a >> 0) & 255) << 0 + | uint_to_hex_lower8 ((a >> 8) & 255) << 16; + w0_t[1] = uint_to_hex_lower8 ((a >> 16) & 255) << 0 + | uint_to_hex_lower8 ((a >> 24) & 255) << 16; + w0_t[2] = uint_to_hex_lower8 ((b >> 0) & 255) << 0 + | uint_to_hex_lower8 ((b >> 8) & 255) << 16; + w0_t[3] = uint_to_hex_lower8 ((b >> 16) & 255) << 0 + | uint_to_hex_lower8 ((b >> 24) & 255) << 16; + w1_t[0] = uint_to_hex_lower8 ((c >> 0) & 255) << 0 + | uint_to_hex_lower8 ((c >> 8) & 255) << 16; + w1_t[1] = uint_to_hex_lower8 ((c >> 16) & 255) << 0 + | uint_to_hex_lower8 ((c >> 24) & 255) << 16; + w1_t[2] = uint_to_hex_lower8 ((d >> 0) & 255) << 0 + | uint_to_hex_lower8 ((d >> 8) & 255) << 16; + w1_t[3] = uint_to_hex_lower8 ((d >> 16) & 255) << 0 + | uint_to_hex_lower8 ((d >> 24) & 255) << 16; + + // add the 4 byte challenge here + + w2_t[0] = challenge; + w2_t[1] = 0x00000080; + w2_t[2] = 0; + w2_t[3] = 0; + + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = (32 + 4) * 8; + w3_t[3] = 0; + + /** + * md5 ($hash.$challenge) + */ + + a = MD5M_A; + b = MD5M_B; + c = MD5M_C; + d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0_t[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0_t[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0_t[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1_t[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1_t[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1_t[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2_t[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2_t[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2_t[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3_t[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3_t[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3_t[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0_t[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1_t[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2_t[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1_t[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1_t[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2_t[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3_t[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0_t[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2_t[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3_t[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0_t[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1_t[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3_t[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H , a, b, c, d, w1_t[1], MD5C20, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w2_t[0], MD5C21, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w2_t[3], MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w3_t[2], MD5C23, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w0_t[1], MD5C24, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w1_t[0], MD5C25, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w1_t[3], MD5C26, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w2_t[2], MD5C27, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w3_t[1], MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w0_t[0], MD5C29, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w0_t[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w1_t[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w2_t[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w3_t[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w3_t[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w0_t[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1_t[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3_t[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3_t[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0_t[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0_t[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2_t[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1_t[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3_t[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1_t[0], MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w2_t[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0_t[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2_t[1], MD5C3f, MD5S33); + + const u32x r0 = a; + const u32x r1 = d; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_M + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m11100_m08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m11100_m16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m11100_s04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, combs_buf[0].pw_len); + } + + /** + * challenge + */ + + u32 challenge; + + challenge = salt_bufs[salt_pos].salt_buf[0]; + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 1]; // not a bug + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[ 2]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[ 3]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[ 4]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[ 5]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[ 6]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[ 7]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[ 8]; + + const u32 salt_len = salt_bufs[salt_pos].salt_len - 4; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * bin2asc table + */ + + __local u32 l_bin2asc[256]; + + const u32 lid4 = lid * 4; + + const u32 lid40 = lid4 + 0; + const u32 lid41 = lid4 + 1; + const u32 lid42 = lid4 + 2; + const u32 lid43 = lid4 + 3; + + const u32 v400 = (lid40 >> 0) & 15; + const u32 v401 = (lid40 >> 4) & 15; + const u32 v410 = (lid41 >> 0) & 15; + const u32 v411 = (lid41 >> 4) & 15; + const u32 v420 = (lid42 >> 0) & 15; + const u32 v421 = (lid42 >> 4) & 15; + const u32 v430 = (lid43 >> 0) & 15; + const u32 v431 = (lid43 >> 4) & 15; + + l_bin2asc[lid40] = ((v400 < 10) ? '0' + v400 : 'a' - 10 + v400) << 8 + | ((v401 < 10) ? '0' + v401 : 'a' - 10 + v401) << 0; + l_bin2asc[lid41] = ((v410 < 10) ? '0' + v410 : 'a' - 10 + v410) << 8 + | ((v411 < 10) ? '0' + v411 : 'a' - 10 + v411) << 0; + l_bin2asc[lid42] = ((v420 < 10) ? '0' + v420 : 'a' - 10 + v420) << 8 + | ((v421 < 10) ? '0' + v421 : 'a' - 10 + v421) << 0; + l_bin2asc[lid43] = ((v430 < 10) ? '0' + v430 : 'a' - 10 + v430) << 8 + | ((v431 < 10) ? '0' + v431 : 'a' - 10 + v431) << 0; + + barrier (CLK_LOCAL_MEM_FENCE); + + if (gid >= gid_max) return; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = combs_buf[il_pos].pw_len; + + const u32 pw_len = pw_l_len + pw_r_len; + + u32 wordr0[4]; + + wordr0[0] = combs_buf[il_pos].i[0]; + wordr0[1] = combs_buf[il_pos].i[1]; + wordr0[2] = combs_buf[il_pos].i[2]; + wordr0[3] = combs_buf[il_pos].i[3]; + + u32 wordr1[4]; + + wordr1[0] = combs_buf[il_pos].i[4]; + wordr1[1] = combs_buf[il_pos].i[5]; + wordr1[2] = combs_buf[il_pos].i[6]; + wordr1[3] = combs_buf[il_pos].i[7]; + + u32 wordr2[4]; + + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + + u32 wordr3[4]; + + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + u32x w0_t[4]; + + w0_t[0] = salt_buf0[0]; + w0_t[1] = salt_buf0[1]; + w0_t[2] = salt_buf0[2]; + w0_t[3] = salt_buf0[3]; + + u32x w1_t[4]; + + w1_t[0] = salt_buf1[0]; + w1_t[1] = salt_buf1[1]; + w1_t[2] = salt_buf1[2]; + w1_t[3] = salt_buf1[3]; + + u32x w2_t[4]; + + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + + u32x w3_t[4]; + + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = 0; + + /* + * append the salt + */ + + switch_buffer_by_offset (w0_t, w1_t, w2_t, w3_t, pw_len); + + const u32 pw_salt_len = pw_len + salt_len; + + w0_t[0] |= wordl0[0] | wordr0[0]; + w0_t[1] |= wordl0[1] | wordr0[1]; + w0_t[2] |= wordl0[2] | wordr0[2]; + w0_t[3] |= wordl0[3] | wordr0[3]; + + w1_t[0] |= wordl1[0] | wordr1[0]; + w1_t[1] |= wordl1[1] | wordr1[1]; + w1_t[2] |= wordl1[2] | wordr1[2]; + w1_t[3] |= wordl1[3] | wordr1[3]; + + w2_t[0] |= wordl2[0] | wordr2[0]; + w2_t[1] |= wordl2[1] | wordr2[1]; + w2_t[2] |= wordl2[2] | wordr2[2]; + w2_t[3] |= wordl2[3] | wordr2[3]; + + w3_t[0] |= wordl3[0] | wordr3[0]; + w3_t[1] |= wordl3[0] | wordr3[0]; + w3_t[2] = pw_salt_len * 8; + w3_t[3] = 0; + + /* + * md5 ($pass.$salt) + */ + + u32x a = MD5M_A; + u32x b = MD5M_B; + u32x c = MD5M_C; + u32x d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0_t[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0_t[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0_t[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1_t[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1_t[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1_t[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2_t[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2_t[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2_t[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3_t[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3_t[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3_t[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0_t[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1_t[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2_t[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1_t[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1_t[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2_t[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3_t[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0_t[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2_t[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3_t[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0_t[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1_t[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3_t[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H , a, b, c, d, w1_t[1], MD5C20, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w2_t[0], MD5C21, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w2_t[3], MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w3_t[2], MD5C23, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w0_t[1], MD5C24, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w1_t[0], MD5C25, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w1_t[3], MD5C26, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w2_t[2], MD5C27, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w3_t[1], MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w0_t[0], MD5C29, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w0_t[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w1_t[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w2_t[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w3_t[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w3_t[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w0_t[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1_t[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3_t[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3_t[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0_t[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0_t[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2_t[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1_t[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3_t[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1_t[0], MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w2_t[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0_t[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2_t[1], MD5C3f, MD5S33); + + a += MD5M_A; + b += MD5M_B; + c += MD5M_C; + d += MD5M_D; + + w0_t[0] = uint_to_hex_lower8 ((a >> 0) & 255) << 0 + | uint_to_hex_lower8 ((a >> 8) & 255) << 16; + w0_t[1] = uint_to_hex_lower8 ((a >> 16) & 255) << 0 + | uint_to_hex_lower8 ((a >> 24) & 255) << 16; + w0_t[2] = uint_to_hex_lower8 ((b >> 0) & 255) << 0 + | uint_to_hex_lower8 ((b >> 8) & 255) << 16; + w0_t[3] = uint_to_hex_lower8 ((b >> 16) & 255) << 0 + | uint_to_hex_lower8 ((b >> 24) & 255) << 16; + w1_t[0] = uint_to_hex_lower8 ((c >> 0) & 255) << 0 + | uint_to_hex_lower8 ((c >> 8) & 255) << 16; + w1_t[1] = uint_to_hex_lower8 ((c >> 16) & 255) << 0 + | uint_to_hex_lower8 ((c >> 24) & 255) << 16; + w1_t[2] = uint_to_hex_lower8 ((d >> 0) & 255) << 0 + | uint_to_hex_lower8 ((d >> 8) & 255) << 16; + w1_t[3] = uint_to_hex_lower8 ((d >> 16) & 255) << 0 + | uint_to_hex_lower8 ((d >> 24) & 255) << 16; + + // add the 4 byte challenge here + + w2_t[0] = challenge; + w2_t[1] = 0x00000080; + w2_t[2] = 0; + w2_t[3] = 0; + + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = (32 + 4) * 8; + w3_t[3] = 0; + + /** + * md5 ($hash.$challenge) + */ + + a = MD5M_A; + b = MD5M_B; + c = MD5M_C; + d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0_t[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0_t[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0_t[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1_t[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1_t[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1_t[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2_t[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2_t[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2_t[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3_t[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3_t[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3_t[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0_t[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1_t[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2_t[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1_t[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1_t[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2_t[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3_t[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0_t[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2_t[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3_t[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0_t[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1_t[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3_t[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H , a, b, c, d, w1_t[1], MD5C20, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w2_t[0], MD5C21, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w2_t[3], MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w3_t[2], MD5C23, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w0_t[1], MD5C24, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w1_t[0], MD5C25, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w1_t[3], MD5C26, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w2_t[2], MD5C27, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w3_t[1], MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w0_t[0], MD5C29, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w0_t[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w1_t[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w2_t[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w3_t[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w3_t[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w0_t[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1_t[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3_t[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3_t[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0_t[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0_t[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2_t[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1_t[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3_t[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1_t[0], MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w2_t[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0_t[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2_t[1], MD5C3f, MD5S33); + + const u32x r0 = a; + const u32x r1 = d; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_S + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m11100_s08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m11100_s16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/amd/m11100_a3.cl b/amd/m11100_a3.cl new file mode 100644 index 0000000000..bc5d217eee --- /dev/null +++ b/amd/m11100_a3.cl @@ -0,0 +1,1169 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _MD5_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW4 +#define VECT_SIZE2 +#endif + +#ifdef VLIW5 +#define VECT_SIZE2 +#endif + +#define DGST_R0 0 +#define DGST_R1 3 +#define DGST_R2 2 +#define DGST_R3 1 + +#include "include/kernel_functions.c" +#include "types_amd.c" +#include "common_amd.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +#ifdef VECT_SIZE1 +#define uint_to_hex_lower8(i) l_bin2asc[(i)] +#endif + +#ifdef VECT_SIZE2 +#define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1]) +#endif + +#ifdef VECT_SIZE4 +#define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3]) +#endif + +static void m11100m (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], const u32 pw_len, __global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, __local u32 l_bin2asc[256]) +{ + /** + * modifier + */ + + const u32 gid = get_global_id (0); + const u32 lid = get_local_id (0); + + /** + * challenge + */ + + u32 challenge; + + challenge = salt_bufs[salt_pos].salt_buf[0]; + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 1]; // not a bug + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[ 2]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[ 3]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[ 4]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[ 5]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[ 6]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[ 7]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[ 8]; + + u32 salt_buf2[4]; + + salt_buf2[0] = 0; + salt_buf2[1] = 0; + salt_buf2[2] = 0; + salt_buf2[3] = 0; + + u32 salt_buf3[4]; + + salt_buf3[0] = 0; + salt_buf3[1] = 0; + salt_buf3[2] = 0; + salt_buf3[3] = 0; + + const u32 salt_len = salt_bufs[salt_pos].salt_len - 4; + + switch_buffer_by_offset (salt_buf0, salt_buf1, salt_buf2, salt_buf3, pw_len); + + const u32 pw_salt_len = pw_len + salt_len; + + /** + * loop + */ + + u32x w0l = w0[0]; + + for (u32 il_pos = 0; il_pos < bfs_cnt; il_pos++) + { + const u32 w0r = bfs_buf[il_pos].i; + + w0[0] = w0l | w0r; + + u32x w0_t[4]; + + w0_t[0] = w0[0] | salt_buf0[0]; + w0_t[1] = w0[1] | salt_buf0[1]; + w0_t[2] = w0[2] | salt_buf0[2]; + w0_t[3] = w0[3] | salt_buf0[3]; + + u32x w1_t[4]; + + w1_t[0] = w1[0] | salt_buf1[0]; + w1_t[1] = w1[1] | salt_buf1[1]; + w1_t[2] = w1[2] | salt_buf1[2]; + w1_t[3] = w1[3] | salt_buf1[3]; + + u32x w2_t[4]; + + w2_t[0] = w2[0] | salt_buf2[0]; + w2_t[1] = w2[1] | salt_buf2[1]; + w2_t[2] = w2[2] | salt_buf2[2]; + w2_t[3] = w2[3] | salt_buf2[3]; + + u32x w3_t[4]; + + w3_t[0] = w3[0] | salt_buf3[0]; + w3_t[1] = w3[1] | salt_buf3[1]; + w3_t[2] = pw_salt_len * 8; + w3_t[3] = 0; + + /* + * md5 ($pass.$salt) + */ + + u32x a = MD5M_A; + u32x b = MD5M_B; + u32x c = MD5M_C; + u32x d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0_t[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0_t[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0_t[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1_t[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1_t[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1_t[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2_t[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2_t[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2_t[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3_t[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3_t[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3_t[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0_t[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1_t[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2_t[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1_t[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1_t[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2_t[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3_t[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0_t[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2_t[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3_t[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0_t[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1_t[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3_t[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H , a, b, c, d, w1_t[1], MD5C20, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w2_t[0], MD5C21, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w2_t[3], MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w3_t[2], MD5C23, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w0_t[1], MD5C24, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w1_t[0], MD5C25, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w1_t[3], MD5C26, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w2_t[2], MD5C27, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w3_t[1], MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w0_t[0], MD5C29, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w0_t[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w1_t[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w2_t[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w3_t[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w3_t[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w0_t[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1_t[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3_t[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3_t[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0_t[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0_t[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2_t[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1_t[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3_t[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1_t[0], MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w2_t[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0_t[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2_t[1], MD5C3f, MD5S33); + + a += MD5M_A; + b += MD5M_B; + c += MD5M_C; + d += MD5M_D; + + w0_t[0] = uint_to_hex_lower8 ((a >> 0) & 255) << 0 + | uint_to_hex_lower8 ((a >> 8) & 255) << 16; + w0_t[1] = uint_to_hex_lower8 ((a >> 16) & 255) << 0 + | uint_to_hex_lower8 ((a >> 24) & 255) << 16; + w0_t[2] = uint_to_hex_lower8 ((b >> 0) & 255) << 0 + | uint_to_hex_lower8 ((b >> 8) & 255) << 16; + w0_t[3] = uint_to_hex_lower8 ((b >> 16) & 255) << 0 + | uint_to_hex_lower8 ((b >> 24) & 255) << 16; + w1_t[0] = uint_to_hex_lower8 ((c >> 0) & 255) << 0 + | uint_to_hex_lower8 ((c >> 8) & 255) << 16; + w1_t[1] = uint_to_hex_lower8 ((c >> 16) & 255) << 0 + | uint_to_hex_lower8 ((c >> 24) & 255) << 16; + w1_t[2] = uint_to_hex_lower8 ((d >> 0) & 255) << 0 + | uint_to_hex_lower8 ((d >> 8) & 255) << 16; + w1_t[3] = uint_to_hex_lower8 ((d >> 16) & 255) << 0 + | uint_to_hex_lower8 ((d >> 24) & 255) << 16; + + // add the 4 byte challenge here + + w2_t[0] = challenge; + w2_t[1] = 0x00000080; + w2_t[2] = 0; + w2_t[3] = 0; + + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = (32 + 4) * 8; + w3_t[3] = 0; + + /** + * md5 ($hash.$challenge) + */ + + a = MD5M_A; + b = MD5M_B; + c = MD5M_C; + d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0_t[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0_t[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0_t[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1_t[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1_t[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1_t[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2_t[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2_t[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2_t[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3_t[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3_t[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3_t[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0_t[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1_t[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2_t[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1_t[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1_t[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2_t[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3_t[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0_t[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2_t[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3_t[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0_t[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1_t[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3_t[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H , a, b, c, d, w1_t[1], MD5C20, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w2_t[0], MD5C21, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w2_t[3], MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w3_t[2], MD5C23, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w0_t[1], MD5C24, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w1_t[0], MD5C25, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w1_t[3], MD5C26, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w2_t[2], MD5C27, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w3_t[1], MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w0_t[0], MD5C29, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w0_t[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w1_t[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w2_t[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w3_t[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w3_t[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w0_t[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1_t[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3_t[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3_t[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0_t[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0_t[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2_t[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1_t[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3_t[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1_t[0], MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w2_t[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0_t[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2_t[1], MD5C3f, MD5S33); + + const u32x r0 = a; + const u32x r1 = d; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_M + } +} + +static void m11100s (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], const u32 pw_len, __global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, __local u32 l_bin2asc[256]) +{ + /** + * modifier + */ + + const u32 gid = get_global_id (0); + const u32 lid = get_local_id (0); + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * challenge + */ + + u32 challenge; + + challenge = salt_bufs[salt_pos].salt_buf[0]; + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 1]; // not a bug + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[ 2]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[ 3]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[ 4]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[ 5]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[ 6]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[ 7]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[ 8]; + + u32 salt_buf2[4]; + + salt_buf2[0] = 0; + salt_buf2[1] = 0; + salt_buf2[2] = 0; + salt_buf2[3] = 0; + + u32 salt_buf3[4]; + + salt_buf3[0] = 0; + salt_buf3[1] = 0; + salt_buf3[2] = 0; + salt_buf3[3] = 0; + + const u32 salt_len = salt_bufs[salt_pos].salt_len - 4; + + switch_buffer_by_offset (salt_buf0, salt_buf1, salt_buf2, salt_buf3, pw_len); + + const u32 pw_salt_len = pw_len + salt_len; + + /** + * loop + */ + + u32x w0l = w0[0]; + + for (u32 il_pos = 0; il_pos < bfs_cnt; il_pos++) + { + const u32 w0r = bfs_buf[il_pos].i; + + w0[0] = w0l | w0r; + + u32x w0_t[4]; + + w0_t[0] = w0[0] | salt_buf0[0]; + w0_t[1] = w0[1] | salt_buf0[1]; + w0_t[2] = w0[2] | salt_buf0[2]; + w0_t[3] = w0[3] | salt_buf0[3]; + + u32x w1_t[4]; + + w1_t[0] = w1[0] | salt_buf1[0]; + w1_t[1] = w1[1] | salt_buf1[1]; + w1_t[2] = w1[2] | salt_buf1[2]; + w1_t[3] = w1[3] | salt_buf1[3]; + + u32x w2_t[4]; + + w2_t[0] = w2[0] | salt_buf2[0]; + w2_t[1] = w2[1] | salt_buf2[1]; + w2_t[2] = w2[2] | salt_buf2[2]; + w2_t[3] = w2[3] | salt_buf2[3]; + + u32x w3_t[4]; + + w3_t[0] = w3[0] | salt_buf3[0]; + w3_t[1] = w3[1] | salt_buf3[1]; + w3_t[2] = pw_salt_len * 8; + w3_t[3] = 0; + + /* + * md5 ($pass.$salt) + */ + + u32x a = MD5M_A; + u32x b = MD5M_B; + u32x c = MD5M_C; + u32x d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0_t[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0_t[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0_t[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1_t[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1_t[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1_t[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2_t[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2_t[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2_t[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3_t[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3_t[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3_t[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0_t[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1_t[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2_t[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1_t[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1_t[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2_t[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3_t[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0_t[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2_t[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3_t[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0_t[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1_t[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3_t[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H , a, b, c, d, w1_t[1], MD5C20, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w2_t[0], MD5C21, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w2_t[3], MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w3_t[2], MD5C23, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w0_t[1], MD5C24, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w1_t[0], MD5C25, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w1_t[3], MD5C26, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w2_t[2], MD5C27, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w3_t[1], MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w0_t[0], MD5C29, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w0_t[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w1_t[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w2_t[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w3_t[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w3_t[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w0_t[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1_t[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3_t[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3_t[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0_t[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0_t[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2_t[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1_t[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3_t[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1_t[0], MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w2_t[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0_t[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2_t[1], MD5C3f, MD5S33); + + a += MD5M_A; + b += MD5M_B; + c += MD5M_C; + d += MD5M_D; + + w0_t[0] = uint_to_hex_lower8 ((a >> 0) & 255) << 0 + | uint_to_hex_lower8 ((a >> 8) & 255) << 16; + w0_t[1] = uint_to_hex_lower8 ((a >> 16) & 255) << 0 + | uint_to_hex_lower8 ((a >> 24) & 255) << 16; + w0_t[2] = uint_to_hex_lower8 ((b >> 0) & 255) << 0 + | uint_to_hex_lower8 ((b >> 8) & 255) << 16; + w0_t[3] = uint_to_hex_lower8 ((b >> 16) & 255) << 0 + | uint_to_hex_lower8 ((b >> 24) & 255) << 16; + w1_t[0] = uint_to_hex_lower8 ((c >> 0) & 255) << 0 + | uint_to_hex_lower8 ((c >> 8) & 255) << 16; + w1_t[1] = uint_to_hex_lower8 ((c >> 16) & 255) << 0 + | uint_to_hex_lower8 ((c >> 24) & 255) << 16; + w1_t[2] = uint_to_hex_lower8 ((d >> 0) & 255) << 0 + | uint_to_hex_lower8 ((d >> 8) & 255) << 16; + w1_t[3] = uint_to_hex_lower8 ((d >> 16) & 255) << 0 + | uint_to_hex_lower8 ((d >> 24) & 255) << 16; + + // add the 4 byte challenge here + + w2_t[0] = challenge; + w2_t[1] = 0x00000080; + w2_t[2] = 0; + w2_t[3] = 0; + + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = (32 + 4) * 8; + w3_t[3] = 0; + + /** + * md5 ($hash.$challenge) + */ + + a = MD5M_A; + b = MD5M_B; + c = MD5M_C; + d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0_t[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0_t[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0_t[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1_t[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1_t[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1_t[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2_t[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2_t[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2_t[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3_t[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3_t[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3_t[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0_t[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1_t[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2_t[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1_t[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1_t[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2_t[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3_t[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0_t[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2_t[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3_t[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0_t[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1_t[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3_t[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H , a, b, c, d, w1_t[1], MD5C20, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w2_t[0], MD5C21, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w2_t[3], MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w3_t[2], MD5C23, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w0_t[1], MD5C24, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w1_t[0], MD5C25, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w1_t[3], MD5C26, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w2_t[2], MD5C27, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w3_t[1], MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w0_t[0], MD5C29, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w0_t[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w1_t[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w2_t[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w3_t[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w3_t[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w0_t[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1_t[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3_t[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3_t[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0_t[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0_t[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2_t[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1_t[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3_t[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1_t[0], MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w2_t[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0_t[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2_t[1], MD5C3f, MD5S33); + + const u32x r0 = a; + const u32x r1 = d; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_S + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m11100_m04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = pws[gid].i[14]; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * bin2asc table + */ + + __local u32 l_bin2asc[256]; + + const u32 lid4 = lid * 4; + + const u32 lid40 = lid4 + 0; + const u32 lid41 = lid4 + 1; + const u32 lid42 = lid4 + 2; + const u32 lid43 = lid4 + 3; + + const u32 v400 = (lid40 >> 0) & 15; + const u32 v401 = (lid40 >> 4) & 15; + const u32 v410 = (lid41 >> 0) & 15; + const u32 v411 = (lid41 >> 4) & 15; + const u32 v420 = (lid42 >> 0) & 15; + const u32 v421 = (lid42 >> 4) & 15; + const u32 v430 = (lid43 >> 0) & 15; + const u32 v431 = (lid43 >> 4) & 15; + + l_bin2asc[lid40] = ((v400 < 10) ? '0' + v400 : 'a' - 10 + v400) << 8 + | ((v401 < 10) ? '0' + v401 : 'a' - 10 + v401) << 0; + l_bin2asc[lid41] = ((v410 < 10) ? '0' + v410 : 'a' - 10 + v410) << 8 + | ((v411 < 10) ? '0' + v411 : 'a' - 10 + v411) << 0; + l_bin2asc[lid42] = ((v420 < 10) ? '0' + v420 : 'a' - 10 + v420) << 8 + | ((v421 < 10) ? '0' + v421 : 'a' - 10 + v421) << 0; + l_bin2asc[lid43] = ((v430 < 10) ? '0' + v430 : 'a' - 10 + v430) << 8 + | ((v431 < 10) ? '0' + v431 : 'a' - 10 + v431) << 0; + + barrier (CLK_LOCAL_MEM_FENCE); + + if (gid >= gid_max) return; + + /** + * main + */ + + m11100m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset, l_bin2asc); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m11100_m08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = pws[gid].i[14]; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * bin2asc table + */ + + __local u32 l_bin2asc[256]; + + const u32 lid4 = lid * 4; + + const u32 lid40 = lid4 + 0; + const u32 lid41 = lid4 + 1; + const u32 lid42 = lid4 + 2; + const u32 lid43 = lid4 + 3; + + const u32 v400 = (lid40 >> 0) & 15; + const u32 v401 = (lid40 >> 4) & 15; + const u32 v410 = (lid41 >> 0) & 15; + const u32 v411 = (lid41 >> 4) & 15; + const u32 v420 = (lid42 >> 0) & 15; + const u32 v421 = (lid42 >> 4) & 15; + const u32 v430 = (lid43 >> 0) & 15; + const u32 v431 = (lid43 >> 4) & 15; + + l_bin2asc[lid40] = ((v400 < 10) ? '0' + v400 : 'a' - 10 + v400) << 8 + | ((v401 < 10) ? '0' + v401 : 'a' - 10 + v401) << 0; + l_bin2asc[lid41] = ((v410 < 10) ? '0' + v410 : 'a' - 10 + v410) << 8 + | ((v411 < 10) ? '0' + v411 : 'a' - 10 + v411) << 0; + l_bin2asc[lid42] = ((v420 < 10) ? '0' + v420 : 'a' - 10 + v420) << 8 + | ((v421 < 10) ? '0' + v421 : 'a' - 10 + v421) << 0; + l_bin2asc[lid43] = ((v430 < 10) ? '0' + v430 : 'a' - 10 + v430) << 8 + | ((v431 < 10) ? '0' + v431 : 'a' - 10 + v431) << 0; + + barrier (CLK_LOCAL_MEM_FENCE); + + if (gid >= gid_max) return; + + /** + * main + */ + + m11100m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset, l_bin2asc); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m11100_m16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = pws[gid].i[ 8]; + w2[1] = pws[gid].i[ 9]; + w2[2] = pws[gid].i[10]; + w2[3] = pws[gid].i[11]; + + u32x w3[4]; + + w3[0] = pws[gid].i[12]; + w3[1] = pws[gid].i[13]; + w3[2] = pws[gid].i[14]; + w3[3] = pws[gid].i[15]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * bin2asc table + */ + + __local u32 l_bin2asc[256]; + + const u32 lid4 = lid * 4; + + const u32 lid40 = lid4 + 0; + const u32 lid41 = lid4 + 1; + const u32 lid42 = lid4 + 2; + const u32 lid43 = lid4 + 3; + + const u32 v400 = (lid40 >> 0) & 15; + const u32 v401 = (lid40 >> 4) & 15; + const u32 v410 = (lid41 >> 0) & 15; + const u32 v411 = (lid41 >> 4) & 15; + const u32 v420 = (lid42 >> 0) & 15; + const u32 v421 = (lid42 >> 4) & 15; + const u32 v430 = (lid43 >> 0) & 15; + const u32 v431 = (lid43 >> 4) & 15; + + l_bin2asc[lid40] = ((v400 < 10) ? '0' + v400 : 'a' - 10 + v400) << 8 + | ((v401 < 10) ? '0' + v401 : 'a' - 10 + v401) << 0; + l_bin2asc[lid41] = ((v410 < 10) ? '0' + v410 : 'a' - 10 + v410) << 8 + | ((v411 < 10) ? '0' + v411 : 'a' - 10 + v411) << 0; + l_bin2asc[lid42] = ((v420 < 10) ? '0' + v420 : 'a' - 10 + v420) << 8 + | ((v421 < 10) ? '0' + v421 : 'a' - 10 + v421) << 0; + l_bin2asc[lid43] = ((v430 < 10) ? '0' + v430 : 'a' - 10 + v430) << 8 + | ((v431 < 10) ? '0' + v431 : 'a' - 10 + v431) << 0; + + barrier (CLK_LOCAL_MEM_FENCE); + + if (gid >= gid_max) return; + + /** + * main + */ + + m11100m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset, l_bin2asc); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m11100_s04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = pws[gid].i[14]; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * bin2asc table + */ + + __local u32 l_bin2asc[256]; + + const u32 lid4 = lid * 4; + + const u32 lid40 = lid4 + 0; + const u32 lid41 = lid4 + 1; + const u32 lid42 = lid4 + 2; + const u32 lid43 = lid4 + 3; + + const u32 v400 = (lid40 >> 0) & 15; + const u32 v401 = (lid40 >> 4) & 15; + const u32 v410 = (lid41 >> 0) & 15; + const u32 v411 = (lid41 >> 4) & 15; + const u32 v420 = (lid42 >> 0) & 15; + const u32 v421 = (lid42 >> 4) & 15; + const u32 v430 = (lid43 >> 0) & 15; + const u32 v431 = (lid43 >> 4) & 15; + + l_bin2asc[lid40] = ((v400 < 10) ? '0' + v400 : 'a' - 10 + v400) << 8 + | ((v401 < 10) ? '0' + v401 : 'a' - 10 + v401) << 0; + l_bin2asc[lid41] = ((v410 < 10) ? '0' + v410 : 'a' - 10 + v410) << 8 + | ((v411 < 10) ? '0' + v411 : 'a' - 10 + v411) << 0; + l_bin2asc[lid42] = ((v420 < 10) ? '0' + v420 : 'a' - 10 + v420) << 8 + | ((v421 < 10) ? '0' + v421 : 'a' - 10 + v421) << 0; + l_bin2asc[lid43] = ((v430 < 10) ? '0' + v430 : 'a' - 10 + v430) << 8 + | ((v431 < 10) ? '0' + v431 : 'a' - 10 + v431) << 0; + + barrier (CLK_LOCAL_MEM_FENCE); + + if (gid >= gid_max) return; + + /** + * main + */ + + m11100s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset, l_bin2asc); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m11100_s08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = pws[gid].i[14]; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * bin2asc table + */ + + __local u32 l_bin2asc[256]; + + const u32 lid4 = lid * 4; + + const u32 lid40 = lid4 + 0; + const u32 lid41 = lid4 + 1; + const u32 lid42 = lid4 + 2; + const u32 lid43 = lid4 + 3; + + const u32 v400 = (lid40 >> 0) & 15; + const u32 v401 = (lid40 >> 4) & 15; + const u32 v410 = (lid41 >> 0) & 15; + const u32 v411 = (lid41 >> 4) & 15; + const u32 v420 = (lid42 >> 0) & 15; + const u32 v421 = (lid42 >> 4) & 15; + const u32 v430 = (lid43 >> 0) & 15; + const u32 v431 = (lid43 >> 4) & 15; + + l_bin2asc[lid40] = ((v400 < 10) ? '0' + v400 : 'a' - 10 + v400) << 8 + | ((v401 < 10) ? '0' + v401 : 'a' - 10 + v401) << 0; + l_bin2asc[lid41] = ((v410 < 10) ? '0' + v410 : 'a' - 10 + v410) << 8 + | ((v411 < 10) ? '0' + v411 : 'a' - 10 + v411) << 0; + l_bin2asc[lid42] = ((v420 < 10) ? '0' + v420 : 'a' - 10 + v420) << 8 + | ((v421 < 10) ? '0' + v421 : 'a' - 10 + v421) << 0; + l_bin2asc[lid43] = ((v430 < 10) ? '0' + v430 : 'a' - 10 + v430) << 8 + | ((v431 < 10) ? '0' + v431 : 'a' - 10 + v431) << 0; + + barrier (CLK_LOCAL_MEM_FENCE); + + if (gid >= gid_max) return; + + /** + * main + */ + + m11100s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset, l_bin2asc); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m11100_s16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = pws[gid].i[ 8]; + w2[1] = pws[gid].i[ 9]; + w2[2] = pws[gid].i[10]; + w2[3] = pws[gid].i[11]; + + u32x w3[4]; + + w3[0] = pws[gid].i[12]; + w3[1] = pws[gid].i[13]; + w3[2] = pws[gid].i[14]; + w3[3] = pws[gid].i[15]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * bin2asc table + */ + + __local u32 l_bin2asc[256]; + + const u32 lid4 = lid * 4; + + const u32 lid40 = lid4 + 0; + const u32 lid41 = lid4 + 1; + const u32 lid42 = lid4 + 2; + const u32 lid43 = lid4 + 3; + + const u32 v400 = (lid40 >> 0) & 15; + const u32 v401 = (lid40 >> 4) & 15; + const u32 v410 = (lid41 >> 0) & 15; + const u32 v411 = (lid41 >> 4) & 15; + const u32 v420 = (lid42 >> 0) & 15; + const u32 v421 = (lid42 >> 4) & 15; + const u32 v430 = (lid43 >> 0) & 15; + const u32 v431 = (lid43 >> 4) & 15; + + l_bin2asc[lid40] = ((v400 < 10) ? '0' + v400 : 'a' - 10 + v400) << 8 + | ((v401 < 10) ? '0' + v401 : 'a' - 10 + v401) << 0; + l_bin2asc[lid41] = ((v410 < 10) ? '0' + v410 : 'a' - 10 + v410) << 8 + | ((v411 < 10) ? '0' + v411 : 'a' - 10 + v411) << 0; + l_bin2asc[lid42] = ((v420 < 10) ? '0' + v420 : 'a' - 10 + v420) << 8 + | ((v421 < 10) ? '0' + v421 : 'a' - 10 + v421) << 0; + l_bin2asc[lid43] = ((v430 < 10) ? '0' + v430 : 'a' - 10 + v430) << 8 + | ((v431 < 10) ? '0' + v431 : 'a' - 10 + v431) << 0; + + barrier (CLK_LOCAL_MEM_FENCE); + + if (gid >= gid_max) return; + + /** + * main + */ + + m11100s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset, l_bin2asc); +} diff --git a/amd/m11200_a0.cl b/amd/m11200_a0.cl new file mode 100644 index 0000000000..29bcdc9384 --- /dev/null +++ b/amd/m11200_a0.cl @@ -0,0 +1,1045 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _SHA1_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW4 +#define VECT_SIZE2 +#endif + +#ifdef VLIW5 +#define VECT_SIZE2 +#endif + +#define DGST_R0 3 +#define DGST_R1 4 +#define DGST_R2 2 +#define DGST_R3 1 + +#include "include/kernel_functions.c" +#include "types_amd.c" +#include "common_amd.c" +#include "include/rp_gpu.h" +#include "rp_amd.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m11200_m04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + u32x pw_buf1[4]; + + pw_buf1[0] = pws[gid].i[ 4]; + pw_buf1[1] = pws[gid].i[ 5]; + pw_buf1[2] = pws[gid].i[ 6]; + pw_buf1[3] = pws[gid].i[ 7]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * salt + */ + + u32 salt_buf[5]; + + salt_buf[0] = swap_workaround (salt_bufs[salt_pos].salt_buf[0]); + salt_buf[1] = swap_workaround (salt_bufs[salt_pos].salt_buf[1]); + salt_buf[2] = swap_workaround (salt_bufs[salt_pos].salt_buf[2]); + salt_buf[3] = swap_workaround (salt_bufs[salt_pos].salt_buf[3]); + salt_buf[4] = swap_workaround (salt_bufs[salt_pos].salt_buf[4]); + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + + w0[0] = pw_buf0[0]; + w0[1] = pw_buf0[1]; + w0[2] = pw_buf0[2]; + w0[3] = pw_buf0[3]; + + u32x w1[4]; + + w1[0] = pw_buf1[0]; + w1[1] = pw_buf1[1]; + w1[2] = pw_buf1[2]; + w1[3] = pw_buf1[3]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 out_len = apply_rules (rules_buf[il_pos].cmds, w0, w1, pw_len); + + append_0x80_2 (w0, w1, out_len); + + /** + * sha1 ($pass) + */ + + u32x w0_t = swap_workaround (w0[0]); + u32x w1_t = swap_workaround (w0[1]); + u32x w2_t = swap_workaround (w0[2]); + u32x w3_t = swap_workaround (w0[3]); + u32x w4_t = swap_workaround (w1[0]); + u32x w5_t = swap_workaround (w1[1]); + u32x w6_t = swap_workaround (w1[2]); + u32x w7_t = swap_workaround (w1[3]); + u32x w8_t = swap_workaround (w2[0]); + u32x w9_t = swap_workaround (w2[1]); + u32x wa_t = swap_workaround (w2[2]); + u32x wb_t = swap_workaround (w2[3]); + u32x wc_t = swap_workaround (w3[0]); + u32x wd_t = swap_workaround (w3[1]); + u32x we_t = 0; + u32x wf_t = out_len * 8; + + u32x a = SHA1M_A; + u32x b = SHA1M_B; + u32x c = SHA1M_C; + u32x d = SHA1M_D; + u32x e = SHA1M_E; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w0_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w1_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w2_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w3_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w4_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w5_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w6_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w7_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w8_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w9_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wa_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, wb_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, wc_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, wd_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, we_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F0o, e, a, b, c, d, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F0o, d, e, a, b, c, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F0o, c, d, e, a, b, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F0o, b, c, d, e, a, w3_t); + + #undef K + #define K SHA1C01 + + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w7_t); + + #undef K + #define K SHA1C02 + + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wb_t); + + #undef K + #define K SHA1C03 + + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wf_t); + + u32x plain_sha1_a = a + SHA1M_A; + u32x plain_sha1_b = b + SHA1M_B; + u32x plain_sha1_c = c + SHA1M_C; + u32x plain_sha1_d = d + SHA1M_D; + u32x plain_sha1_e = e + SHA1M_E; + + /** + * sha1 (sha1 ($pass)) + */ + + w0_t = plain_sha1_a; + w1_t = plain_sha1_b; + w2_t = plain_sha1_c; + w3_t = plain_sha1_d; + w4_t = plain_sha1_e; + + w5_t = 0x80000000; + w6_t = 0; + w7_t = 0; + w8_t = 0; + w9_t = 0; + wa_t = 0; + wb_t = 0; + wc_t = 0; + wd_t = 0; + we_t = 0; + wf_t = 20 * 8; + + a = SHA1M_A; + b = SHA1M_B; + c = SHA1M_C; + d = SHA1M_D; + e = SHA1M_E; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w0_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w1_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w2_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w3_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w4_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w5_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w6_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w7_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w8_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w9_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wa_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, wb_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, wc_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, wd_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, we_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F0o, e, a, b, c, d, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F0o, d, e, a, b, c, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F0o, c, d, e, a, b, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F0o, b, c, d, e, a, w3_t); + + #undef K + #define K SHA1C01 + + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w7_t); + + #undef K + #define K SHA1C02 + + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wb_t); + + #undef K + #define K SHA1C03 + + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wf_t); + + a += SHA1M_A; + b += SHA1M_B; + c += SHA1M_C; + d += SHA1M_D; + e += SHA1M_E; + + /** + * sha1 ($salt . sha1 (sha1 ($pass))) + */ + + w0_t = salt_buf[0]; + w1_t = salt_buf[1]; + w2_t = salt_buf[2]; + w3_t = salt_buf[3]; + w4_t = salt_buf[4]; + w5_t = a; + w6_t = b; + w7_t = c; + w8_t = d; + w9_t = e; + wa_t = 0x80000000; + wb_t = 0; + wc_t = 0; + wd_t = 0; + we_t = 0; + wf_t = 40 * 8; + + a = SHA1M_A; + b = SHA1M_B; + c = SHA1M_C; + d = SHA1M_D; + e = SHA1M_E; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w0_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w1_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w2_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w3_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w4_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w5_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w6_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w7_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w8_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w9_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wa_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, wb_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, wc_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, wd_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, we_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F0o, e, a, b, c, d, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F0o, d, e, a, b, c, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F0o, c, d, e, a, b, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F0o, b, c, d, e, a, w3_t); + + #undef K + #define K SHA1C01 + + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w7_t); + + #undef K + #define K SHA1C02 + + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wb_t); + + #undef K + #define K SHA1C03 + + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wf_t); + + a += SHA1M_A; + b += SHA1M_B; + c += SHA1M_C; + d += SHA1M_D; + e += SHA1M_E; + + a ^= plain_sha1_a; + b ^= plain_sha1_b; + c ^= plain_sha1_c; + d ^= plain_sha1_d; + e ^= plain_sha1_e; + + const u32x r0 = d; + const u32x r1 = e; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_M + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m11200_m08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m11200_m16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m11200_s04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + u32x pw_buf1[4]; + + pw_buf1[0] = pws[gid].i[ 4]; + pw_buf1[1] = pws[gid].i[ 5]; + pw_buf1[2] = pws[gid].i[ 6]; + pw_buf1[3] = pws[gid].i[ 7]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * salt + */ + + u32 salt_buf[5]; + + salt_buf[0] = swap_workaround (salt_bufs[salt_pos].salt_buf[0]); + salt_buf[1] = swap_workaround (salt_bufs[salt_pos].salt_buf[1]); + salt_buf[2] = swap_workaround (salt_bufs[salt_pos].salt_buf[2]); + salt_buf[3] = swap_workaround (salt_bufs[salt_pos].salt_buf[3]); + salt_buf[4] = swap_workaround (salt_bufs[salt_pos].salt_buf[4]); + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + + w0[0] = pw_buf0[0]; + w0[1] = pw_buf0[1]; + w0[2] = pw_buf0[2]; + w0[3] = pw_buf0[3]; + + u32x w1[4]; + + w1[0] = pw_buf1[0]; + w1[1] = pw_buf1[1]; + w1[2] = pw_buf1[2]; + w1[3] = pw_buf1[3]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 out_len = apply_rules (rules_buf[il_pos].cmds, w0, w1, pw_len); + + append_0x80_2 (w0, w1, out_len); + + /** + * sha1 ($pass) + */ + + u32x w0_t = swap_workaround (w0[0]); + u32x w1_t = swap_workaround (w0[1]); + u32x w2_t = swap_workaround (w0[2]); + u32x w3_t = swap_workaround (w0[3]); + u32x w4_t = swap_workaround (w1[0]); + u32x w5_t = swap_workaround (w1[1]); + u32x w6_t = swap_workaround (w1[2]); + u32x w7_t = swap_workaround (w1[3]); + u32x w8_t = swap_workaround (w2[0]); + u32x w9_t = swap_workaround (w2[1]); + u32x wa_t = swap_workaround (w2[2]); + u32x wb_t = swap_workaround (w2[3]); + u32x wc_t = swap_workaround (w3[0]); + u32x wd_t = swap_workaround (w3[1]); + u32x we_t = 0; + u32x wf_t = out_len * 8; + + u32x a = SHA1M_A; + u32x b = SHA1M_B; + u32x c = SHA1M_C; + u32x d = SHA1M_D; + u32x e = SHA1M_E; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w0_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w1_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w2_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w3_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w4_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w5_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w6_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w7_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w8_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w9_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wa_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, wb_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, wc_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, wd_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, we_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F0o, e, a, b, c, d, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F0o, d, e, a, b, c, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F0o, c, d, e, a, b, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F0o, b, c, d, e, a, w3_t); + + #undef K + #define K SHA1C01 + + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w7_t); + + #undef K + #define K SHA1C02 + + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wb_t); + + #undef K + #define K SHA1C03 + + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wf_t); + + u32x plain_sha1_a = a + SHA1M_A; + u32x plain_sha1_b = b + SHA1M_B; + u32x plain_sha1_c = c + SHA1M_C; + u32x plain_sha1_d = d + SHA1M_D; + u32x plain_sha1_e = e + SHA1M_E; + + /** + * sha1 (sha1 ($pass)) + */ + + w0_t = plain_sha1_a; + w1_t = plain_sha1_b; + w2_t = plain_sha1_c; + w3_t = plain_sha1_d; + w4_t = plain_sha1_e; + + w5_t = 0x80000000; + w6_t = 0; + w7_t = 0; + w8_t = 0; + w9_t = 0; + wa_t = 0; + wb_t = 0; + wc_t = 0; + wd_t = 0; + we_t = 0; + wf_t = 20 * 8; + + a = SHA1M_A; + b = SHA1M_B; + c = SHA1M_C; + d = SHA1M_D; + e = SHA1M_E; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w0_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w1_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w2_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w3_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w4_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w5_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w6_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w7_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w8_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w9_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wa_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, wb_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, wc_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, wd_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, we_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F0o, e, a, b, c, d, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F0o, d, e, a, b, c, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F0o, c, d, e, a, b, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F0o, b, c, d, e, a, w3_t); + + #undef K + #define K SHA1C01 + + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w7_t); + + #undef K + #define K SHA1C02 + + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wb_t); + + #undef K + #define K SHA1C03 + + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wf_t); + + a += SHA1M_A; + b += SHA1M_B; + c += SHA1M_C; + d += SHA1M_D; + e += SHA1M_E; + + /** + * sha1 ($salt . sha1 (sha1 ($pass))) + */ + + w0_t = salt_buf[0]; + w1_t = salt_buf[1]; + w2_t = salt_buf[2]; + w3_t = salt_buf[3]; + w4_t = salt_buf[4]; + w5_t = a; + w6_t = b; + w7_t = c; + w8_t = d; + w9_t = e; + wa_t = 0x80000000; + wb_t = 0; + wc_t = 0; + wd_t = 0; + we_t = 0; + wf_t = 40 * 8; + + a = SHA1M_A; + b = SHA1M_B; + c = SHA1M_C; + d = SHA1M_D; + e = SHA1M_E; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w0_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w1_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w2_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w3_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w4_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w5_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w6_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w7_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w8_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w9_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wa_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, wb_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, wc_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, wd_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, we_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F0o, e, a, b, c, d, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F0o, d, e, a, b, c, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F0o, c, d, e, a, b, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F0o, b, c, d, e, a, w3_t); + + #undef K + #define K SHA1C01 + + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w7_t); + + #undef K + #define K SHA1C02 + + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wb_t); + + #undef K + #define K SHA1C03 + + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wf_t); + + a += SHA1M_A; + b += SHA1M_B; + c += SHA1M_C; + d += SHA1M_D; + e += SHA1M_E; + + a ^= plain_sha1_a; + b ^= plain_sha1_b; + c ^= plain_sha1_c; + d ^= plain_sha1_d; + e ^= plain_sha1_e; + + const u32x r0 = d; + const u32x r1 = e; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_S + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m11200_s08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m11200_s16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/amd/m11200_a1.cl b/amd/m11200_a1.cl new file mode 100644 index 0000000000..1afa39bf66 --- /dev/null +++ b/amd/m11200_a1.cl @@ -0,0 +1,1155 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _SHA1_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW4 +#define VECT_SIZE2 +#endif + +#ifdef VLIW5 +#define VECT_SIZE2 +#endif + +#define DGST_R0 3 +#define DGST_R1 4 +#define DGST_R2 2 +#define DGST_R3 1 + +#include "include/kernel_functions.c" +#include "types_amd.c" +#include "common_amd.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m11200_m04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + append_0x80_2 (wordl0, wordl1, pw_l_len); + + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, combs_buf[0].pw_len); + } + + /** + * salt + */ + + u32 salt_buf[5]; + + salt_buf[0] = swap_workaround (salt_bufs[salt_pos].salt_buf[0]); + salt_buf[1] = swap_workaround (salt_bufs[salt_pos].salt_buf[1]); + salt_buf[2] = swap_workaround (salt_bufs[salt_pos].salt_buf[2]); + salt_buf[3] = swap_workaround (salt_bufs[salt_pos].salt_buf[3]); + salt_buf[4] = swap_workaround (salt_bufs[salt_pos].salt_buf[4]); + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = combs_buf[il_pos].pw_len; + + const u32 pw_len = pw_l_len + pw_r_len; + + u32 wordr0[4]; + + wordr0[0] = combs_buf[il_pos].i[0]; + wordr0[1] = combs_buf[il_pos].i[1]; + wordr0[2] = combs_buf[il_pos].i[2]; + wordr0[3] = combs_buf[il_pos].i[3]; + + u32 wordr1[4]; + + wordr1[0] = combs_buf[il_pos].i[4]; + wordr1[1] = combs_buf[il_pos].i[5]; + wordr1[2] = combs_buf[il_pos].i[6]; + wordr1[3] = combs_buf[il_pos].i[7]; + + u32 wordr2[4]; + + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + + u32 wordr3[4]; + + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + append_0x80_2 (wordr0, wordr1, pw_r_len); + + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + u32x w0[4]; + + w0[0] = wordl0[0] | wordr0[0]; + w0[1] = wordl0[1] | wordr0[1]; + w0[2] = wordl0[2] | wordr0[2]; + w0[3] = wordl0[3] | wordr0[3]; + + u32x w1[4]; + + w1[0] = wordl1[0] | wordr1[0]; + w1[1] = wordl1[1] | wordr1[1]; + w1[2] = wordl1[2] | wordr1[2]; + w1[3] = wordl1[3] | wordr1[3]; + + u32x w2[4]; + + w2[0] = wordl2[0] | wordr2[0]; + w2[1] = wordl2[1] | wordr2[1]; + w2[2] = wordl2[2] | wordr2[2]; + w2[3] = wordl2[3] | wordr2[3]; + + u32x w3[4]; + + w3[0] = wordl3[0] | wordr3[0]; + w3[1] = wordl3[1] | wordr3[1]; + w3[2] = 0; + w3[3] = 0; + + /** + * sha1 ($pass) + */ + + u32x w0_t = swap_workaround (w0[0]); + u32x w1_t = swap_workaround (w0[1]); + u32x w2_t = swap_workaround (w0[2]); + u32x w3_t = swap_workaround (w0[3]); + u32x w4_t = swap_workaround (w1[0]); + u32x w5_t = swap_workaround (w1[1]); + u32x w6_t = swap_workaround (w1[2]); + u32x w7_t = swap_workaround (w1[3]); + u32x w8_t = swap_workaround (w2[0]); + u32x w9_t = swap_workaround (w2[1]); + u32x wa_t = swap_workaround (w2[2]); + u32x wb_t = swap_workaround (w2[3]); + u32x wc_t = swap_workaround (w3[0]); + u32x wd_t = swap_workaround (w3[1]); + u32x we_t = 0; + u32x wf_t = pw_len * 8; + + u32x a = SHA1M_A; + u32x b = SHA1M_B; + u32x c = SHA1M_C; + u32x d = SHA1M_D; + u32x e = SHA1M_E; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w0_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w1_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w2_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w3_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w4_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w5_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w6_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w7_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w8_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w9_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wa_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, wb_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, wc_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, wd_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, we_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F0o, e, a, b, c, d, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F0o, d, e, a, b, c, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F0o, c, d, e, a, b, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F0o, b, c, d, e, a, w3_t); + + #undef K + #define K SHA1C01 + + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w7_t); + + #undef K + #define K SHA1C02 + + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wb_t); + + #undef K + #define K SHA1C03 + + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wf_t); + + u32x plain_sha1_a = a + SHA1M_A; + u32x plain_sha1_b = b + SHA1M_B; + u32x plain_sha1_c = c + SHA1M_C; + u32x plain_sha1_d = d + SHA1M_D; + u32x plain_sha1_e = e + SHA1M_E; + + /** + * sha1 (sha1 ($pass)) + */ + + w0_t = plain_sha1_a; + w1_t = plain_sha1_b; + w2_t = plain_sha1_c; + w3_t = plain_sha1_d; + w4_t = plain_sha1_e; + + w5_t = 0x80000000; + w6_t = 0; + w7_t = 0; + w8_t = 0; + w9_t = 0; + wa_t = 0; + wb_t = 0; + wc_t = 0; + wd_t = 0; + we_t = 0; + wf_t = 20 * 8; + + a = SHA1M_A; + b = SHA1M_B; + c = SHA1M_C; + d = SHA1M_D; + e = SHA1M_E; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w0_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w1_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w2_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w3_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w4_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w5_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w6_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w7_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w8_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w9_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wa_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, wb_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, wc_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, wd_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, we_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F0o, e, a, b, c, d, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F0o, d, e, a, b, c, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F0o, c, d, e, a, b, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F0o, b, c, d, e, a, w3_t); + + #undef K + #define K SHA1C01 + + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w7_t); + + #undef K + #define K SHA1C02 + + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wb_t); + + #undef K + #define K SHA1C03 + + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wf_t); + + a += SHA1M_A; + b += SHA1M_B; + c += SHA1M_C; + d += SHA1M_D; + e += SHA1M_E; + + /** + * sha1 ($salt . sha1 (sha1 ($pass))) + */ + + w0_t = salt_buf[0]; + w1_t = salt_buf[1]; + w2_t = salt_buf[2]; + w3_t = salt_buf[3]; + w4_t = salt_buf[4]; + w5_t = a; + w6_t = b; + w7_t = c; + w8_t = d; + w9_t = e; + wa_t = 0x80000000; + wb_t = 0; + wc_t = 0; + wd_t = 0; + we_t = 0; + wf_t = 40 * 8; + + a = SHA1M_A; + b = SHA1M_B; + c = SHA1M_C; + d = SHA1M_D; + e = SHA1M_E; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w0_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w1_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w2_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w3_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w4_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w5_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w6_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w7_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w8_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w9_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wa_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, wb_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, wc_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, wd_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, we_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F0o, e, a, b, c, d, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F0o, d, e, a, b, c, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F0o, c, d, e, a, b, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F0o, b, c, d, e, a, w3_t); + + #undef K + #define K SHA1C01 + + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w7_t); + + #undef K + #define K SHA1C02 + + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wb_t); + + #undef K + #define K SHA1C03 + + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wf_t); + + a += SHA1M_A; + b += SHA1M_B; + c += SHA1M_C; + d += SHA1M_D; + e += SHA1M_E; + + a ^= plain_sha1_a; + b ^= plain_sha1_b; + c ^= plain_sha1_c; + d ^= plain_sha1_d; + e ^= plain_sha1_e; + + const u32x r0 = d; + const u32x r1 = e; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_M + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m11200_m08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m11200_m16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m11200_s04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + append_0x80_2 (wordl0, wordl1, pw_l_len); + + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, combs_buf[0].pw_len); + } + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * salt + */ + + u32 salt_buf[5]; + + salt_buf[0] = swap_workaround (salt_bufs[salt_pos].salt_buf[0]); + salt_buf[1] = swap_workaround (salt_bufs[salt_pos].salt_buf[1]); + salt_buf[2] = swap_workaround (salt_bufs[salt_pos].salt_buf[2]); + salt_buf[3] = swap_workaround (salt_bufs[salt_pos].salt_buf[3]); + salt_buf[4] = swap_workaround (salt_bufs[salt_pos].salt_buf[4]); + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = combs_buf[il_pos].pw_len; + + const u32 pw_len = pw_l_len + pw_r_len; + + u32 wordr0[4]; + + wordr0[0] = combs_buf[il_pos].i[0]; + wordr0[1] = combs_buf[il_pos].i[1]; + wordr0[2] = combs_buf[il_pos].i[2]; + wordr0[3] = combs_buf[il_pos].i[3]; + + u32 wordr1[4]; + + wordr1[0] = combs_buf[il_pos].i[4]; + wordr1[1] = combs_buf[il_pos].i[5]; + wordr1[2] = combs_buf[il_pos].i[6]; + wordr1[3] = combs_buf[il_pos].i[7]; + + u32 wordr2[4]; + + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + + u32 wordr3[4]; + + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + append_0x80_2 (wordr0, wordr1, pw_r_len); + + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + u32x w0[4]; + + w0[0] = wordl0[0] | wordr0[0]; + w0[1] = wordl0[1] | wordr0[1]; + w0[2] = wordl0[2] | wordr0[2]; + w0[3] = wordl0[3] | wordr0[3]; + + u32x w1[4]; + + w1[0] = wordl1[0] | wordr1[0]; + w1[1] = wordl1[1] | wordr1[1]; + w1[2] = wordl1[2] | wordr1[2]; + w1[3] = wordl1[3] | wordr1[3]; + + u32x w2[4]; + + w2[0] = wordl2[0] | wordr2[0]; + w2[1] = wordl2[1] | wordr2[1]; + w2[2] = wordl2[2] | wordr2[2]; + w2[3] = wordl2[3] | wordr2[3]; + + u32x w3[4]; + + w3[0] = wordl3[0] | wordr3[0]; + w3[1] = wordl3[1] | wordr3[1]; + w3[2] = 0; + w3[3] = 0; + + /** + * sha1 ($pass) + */ + + u32x w0_t = swap_workaround (w0[0]); + u32x w1_t = swap_workaround (w0[1]); + u32x w2_t = swap_workaround (w0[2]); + u32x w3_t = swap_workaround (w0[3]); + u32x w4_t = swap_workaround (w1[0]); + u32x w5_t = swap_workaround (w1[1]); + u32x w6_t = swap_workaround (w1[2]); + u32x w7_t = swap_workaround (w1[3]); + u32x w8_t = swap_workaround (w2[0]); + u32x w9_t = swap_workaround (w2[1]); + u32x wa_t = swap_workaround (w2[2]); + u32x wb_t = swap_workaround (w2[3]); + u32x wc_t = swap_workaround (w3[0]); + u32x wd_t = swap_workaround (w3[1]); + u32x we_t = 0; + u32x wf_t = pw_len * 8; + + u32x a = SHA1M_A; + u32x b = SHA1M_B; + u32x c = SHA1M_C; + u32x d = SHA1M_D; + u32x e = SHA1M_E; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w0_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w1_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w2_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w3_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w4_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w5_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w6_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w7_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w8_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w9_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wa_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, wb_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, wc_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, wd_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, we_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F0o, e, a, b, c, d, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F0o, d, e, a, b, c, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F0o, c, d, e, a, b, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F0o, b, c, d, e, a, w3_t); + + #undef K + #define K SHA1C01 + + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w7_t); + + #undef K + #define K SHA1C02 + + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wb_t); + + #undef K + #define K SHA1C03 + + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wf_t); + + u32x plain_sha1_a = a + SHA1M_A; + u32x plain_sha1_b = b + SHA1M_B; + u32x plain_sha1_c = c + SHA1M_C; + u32x plain_sha1_d = d + SHA1M_D; + u32x plain_sha1_e = e + SHA1M_E; + + /** + * sha1 (sha1 ($pass)) + */ + + w0_t = plain_sha1_a; + w1_t = plain_sha1_b; + w2_t = plain_sha1_c; + w3_t = plain_sha1_d; + w4_t = plain_sha1_e; + + w5_t = 0x80000000; + w6_t = 0; + w7_t = 0; + w8_t = 0; + w9_t = 0; + wa_t = 0; + wb_t = 0; + wc_t = 0; + wd_t = 0; + we_t = 0; + wf_t = 20 * 8; + + a = SHA1M_A; + b = SHA1M_B; + c = SHA1M_C; + d = SHA1M_D; + e = SHA1M_E; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w0_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w1_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w2_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w3_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w4_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w5_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w6_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w7_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w8_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w9_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wa_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, wb_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, wc_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, wd_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, we_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F0o, e, a, b, c, d, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F0o, d, e, a, b, c, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F0o, c, d, e, a, b, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F0o, b, c, d, e, a, w3_t); + + #undef K + #define K SHA1C01 + + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w7_t); + + #undef K + #define K SHA1C02 + + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wb_t); + + #undef K + #define K SHA1C03 + + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wf_t); + + a += SHA1M_A; + b += SHA1M_B; + c += SHA1M_C; + d += SHA1M_D; + e += SHA1M_E; + + /** + * sha1 ($salt . sha1 (sha1 ($pass))) + */ + + w0_t = salt_buf[0]; + w1_t = salt_buf[1]; + w2_t = salt_buf[2]; + w3_t = salt_buf[3]; + w4_t = salt_buf[4]; + w5_t = a; + w6_t = b; + w7_t = c; + w8_t = d; + w9_t = e; + wa_t = 0x80000000; + wb_t = 0; + wc_t = 0; + wd_t = 0; + we_t = 0; + wf_t = 40 * 8; + + a = SHA1M_A; + b = SHA1M_B; + c = SHA1M_C; + d = SHA1M_D; + e = SHA1M_E; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w0_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w1_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w2_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w3_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w4_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w5_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w6_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w7_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w8_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w9_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wa_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, wb_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, wc_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, wd_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, we_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F0o, e, a, b, c, d, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F0o, d, e, a, b, c, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F0o, c, d, e, a, b, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F0o, b, c, d, e, a, w3_t); + + #undef K + #define K SHA1C01 + + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w7_t); + + #undef K + #define K SHA1C02 + + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wb_t); + + #undef K + #define K SHA1C03 + + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wf_t); + + a += SHA1M_A; + b += SHA1M_B; + c += SHA1M_C; + d += SHA1M_D; + e += SHA1M_E; + + a ^= plain_sha1_a; + b ^= plain_sha1_b; + c ^= plain_sha1_c; + d ^= plain_sha1_d; + e ^= plain_sha1_e; + + const u32x r0 = d; + const u32x r1 = e; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_S + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m11200_s08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m11200_s16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/amd/m11200_a3.cl b/amd/m11200_a3.cl new file mode 100644 index 0000000000..c1a093d055 --- /dev/null +++ b/amd/m11200_a3.cl @@ -0,0 +1,1235 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _SHA1_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW4 +#define VECT_SIZE2 +#endif + +#ifdef VLIW5 +#define VECT_SIZE2 +#endif + +#define DGST_R0 3 +#define DGST_R1 4 +#define DGST_R2 2 +#define DGST_R3 1 + +#include "include/kernel_functions.c" +#include "types_amd.c" +#include "common_amd.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +static void m11200m (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], const u32 pw_len, __global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset) +{ + /** + * modifier + */ + + const u32 gid = get_global_id (0); + const u32 lid = get_local_id (0); + + /** + * salt + */ + + u32 salt_buf[5]; + + salt_buf[0] = swap_workaround (salt_bufs[salt_pos].salt_buf[0]); + salt_buf[1] = swap_workaround (salt_bufs[salt_pos].salt_buf[1]); + salt_buf[2] = swap_workaround (salt_bufs[salt_pos].salt_buf[2]); + salt_buf[3] = swap_workaround (salt_bufs[salt_pos].salt_buf[3]); + salt_buf[4] = swap_workaround (salt_bufs[salt_pos].salt_buf[4]); + + /** + * loop + */ + + u32x w0l = w0[0]; + + for (u32 il_pos = 0; il_pos < bfs_cnt; il_pos++) + { + const u32 w0r = bfs_buf[il_pos].i; + + w0[0] = w0l | w0r; + + /** + * sha1 ($pass) + */ + + u32x w0_t = w0[0]; + u32x w1_t = w0[1]; + u32x w2_t = w0[2]; + u32x w3_t = w0[3]; + u32x w4_t = w1[0]; + u32x w5_t = w1[1]; + u32x w6_t = w1[2]; + u32x w7_t = w1[3]; + u32x w8_t = w2[0]; + u32x w9_t = w2[1]; + u32x wa_t = w2[2]; + u32x wb_t = w2[3]; + u32x wc_t = w3[0]; + u32x wd_t = w3[1]; + u32x we_t = 0; + u32x wf_t = pw_len * 8; + + u32x a = SHA1M_A; + u32x b = SHA1M_B; + u32x c = SHA1M_C; + u32x d = SHA1M_D; + u32x e = SHA1M_E; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w0_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w1_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w2_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w3_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w4_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w5_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w6_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w7_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w8_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w9_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wa_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, wb_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, wc_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, wd_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, we_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F0o, e, a, b, c, d, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F0o, d, e, a, b, c, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F0o, c, d, e, a, b, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F0o, b, c, d, e, a, w3_t); + + #undef K + #define K SHA1C01 + + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w7_t); + + #undef K + #define K SHA1C02 + + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wb_t); + + #undef K + #define K SHA1C03 + + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wf_t); + + u32x plain_sha1_a = a + SHA1M_A; + u32x plain_sha1_b = b + SHA1M_B; + u32x plain_sha1_c = c + SHA1M_C; + u32x plain_sha1_d = d + SHA1M_D; + u32x plain_sha1_e = e + SHA1M_E; + + /** + * sha1 (sha1 ($pass)) + */ + + w0_t = plain_sha1_a; + w1_t = plain_sha1_b; + w2_t = plain_sha1_c; + w3_t = plain_sha1_d; + w4_t = plain_sha1_e; + + w5_t = 0x80000000; + w6_t = 0; + w7_t = 0; + w8_t = 0; + w9_t = 0; + wa_t = 0; + wb_t = 0; + wc_t = 0; + wd_t = 0; + we_t = 0; + wf_t = 20 * 8; + + a = SHA1M_A; + b = SHA1M_B; + c = SHA1M_C; + d = SHA1M_D; + e = SHA1M_E; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w0_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w1_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w2_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w3_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w4_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w5_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w6_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w7_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w8_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w9_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wa_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, wb_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, wc_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, wd_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, we_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F0o, e, a, b, c, d, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F0o, d, e, a, b, c, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F0o, c, d, e, a, b, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F0o, b, c, d, e, a, w3_t); + + #undef K + #define K SHA1C01 + + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w7_t); + + #undef K + #define K SHA1C02 + + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wb_t); + + #undef K + #define K SHA1C03 + + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wf_t); + + a += SHA1M_A; + b += SHA1M_B; + c += SHA1M_C; + d += SHA1M_D; + e += SHA1M_E; + + /** + * sha1 ($salt . sha1 (sha1 ($pass))) + */ + + w0_t = salt_buf[0]; + w1_t = salt_buf[1]; + w2_t = salt_buf[2]; + w3_t = salt_buf[3]; + w4_t = salt_buf[4]; + w5_t = a; + w6_t = b; + w7_t = c; + w8_t = d; + w9_t = e; + wa_t = 0x80000000; + wb_t = 0; + wc_t = 0; + wd_t = 0; + we_t = 0; + wf_t = 40 * 8; + + a = SHA1M_A; + b = SHA1M_B; + c = SHA1M_C; + d = SHA1M_D; + e = SHA1M_E; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w0_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w1_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w2_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w3_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w4_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w5_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w6_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w7_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w8_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w9_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wa_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, wb_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, wc_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, wd_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, we_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F0o, e, a, b, c, d, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F0o, d, e, a, b, c, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F0o, c, d, e, a, b, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F0o, b, c, d, e, a, w3_t); + + #undef K + #define K SHA1C01 + + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w7_t); + + #undef K + #define K SHA1C02 + + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wb_t); + + #undef K + #define K SHA1C03 + + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wf_t); + + a += SHA1M_A; + b += SHA1M_B; + c += SHA1M_C; + d += SHA1M_D; + e += SHA1M_E; + + a ^= plain_sha1_a; + b ^= plain_sha1_b; + c ^= plain_sha1_c; + d ^= plain_sha1_d; + e ^= plain_sha1_e; + + const u32x r0 = d; + const u32x r1 = e; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_M + } +} + +static void m11200s (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], const u32 pw_len, __global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset) +{ + /** + * modifier + */ + + const u32 gid = get_global_id (0); + const u32 lid = get_local_id (0); + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * salt + */ + + u32 salt_buf[5]; + + salt_buf[0] = swap_workaround (salt_bufs[salt_pos].salt_buf[0]); + salt_buf[1] = swap_workaround (salt_bufs[salt_pos].salt_buf[1]); + salt_buf[2] = swap_workaround (salt_bufs[salt_pos].salt_buf[2]); + salt_buf[3] = swap_workaround (salt_bufs[salt_pos].salt_buf[3]); + salt_buf[4] = swap_workaround (salt_bufs[salt_pos].salt_buf[4]); + + /** + * loop + */ + + u32x w0l = w0[0]; + + for (u32 il_pos = 0; il_pos < bfs_cnt; il_pos++) + { + const u32 w0r = bfs_buf[il_pos].i; + + w0[0] = w0l | w0r; + + /** + * sha1 ($pass) + */ + + u32x w0_t = w0[0]; + u32x w1_t = w0[1]; + u32x w2_t = w0[2]; + u32x w3_t = w0[3]; + u32x w4_t = w1[0]; + u32x w5_t = w1[1]; + u32x w6_t = w1[2]; + u32x w7_t = w1[3]; + u32x w8_t = w2[0]; + u32x w9_t = w2[1]; + u32x wa_t = w2[2]; + u32x wb_t = w2[3]; + u32x wc_t = w3[0]; + u32x wd_t = w3[1]; + u32x we_t = 0; + u32x wf_t = pw_len * 8; + + u32x a = SHA1M_A; + u32x b = SHA1M_B; + u32x c = SHA1M_C; + u32x d = SHA1M_D; + u32x e = SHA1M_E; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w0_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w1_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w2_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w3_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w4_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w5_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w6_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w7_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w8_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w9_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wa_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, wb_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, wc_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, wd_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, we_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F0o, e, a, b, c, d, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F0o, d, e, a, b, c, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F0o, c, d, e, a, b, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F0o, b, c, d, e, a, w3_t); + + #undef K + #define K SHA1C01 + + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w7_t); + + #undef K + #define K SHA1C02 + + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wb_t); + + #undef K + #define K SHA1C03 + + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wf_t); + + u32x plain_sha1_a = a + SHA1M_A; + u32x plain_sha1_b = b + SHA1M_B; + u32x plain_sha1_c = c + SHA1M_C; + u32x plain_sha1_d = d + SHA1M_D; + u32x plain_sha1_e = e + SHA1M_E; + + /** + * sha1 (sha1 ($pass)) + */ + + w0_t = plain_sha1_a; + w1_t = plain_sha1_b; + w2_t = plain_sha1_c; + w3_t = plain_sha1_d; + w4_t = plain_sha1_e; + + w5_t = 0x80000000; + w6_t = 0; + w7_t = 0; + w8_t = 0; + w9_t = 0; + wa_t = 0; + wb_t = 0; + wc_t = 0; + wd_t = 0; + we_t = 0; + wf_t = 20 * 8; + + a = SHA1M_A; + b = SHA1M_B; + c = SHA1M_C; + d = SHA1M_D; + e = SHA1M_E; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w0_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w1_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w2_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w3_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w4_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w5_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w6_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w7_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w8_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w9_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wa_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, wb_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, wc_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, wd_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, we_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F0o, e, a, b, c, d, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F0o, d, e, a, b, c, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F0o, c, d, e, a, b, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F0o, b, c, d, e, a, w3_t); + + #undef K + #define K SHA1C01 + + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w7_t); + + #undef K + #define K SHA1C02 + + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wb_t); + + #undef K + #define K SHA1C03 + + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wf_t); + + a += SHA1M_A; + b += SHA1M_B; + c += SHA1M_C; + d += SHA1M_D; + e += SHA1M_E; + + /** + * sha1 ($salt . sha1 (sha1 ($pass))) + */ + + w0_t = salt_buf[0]; + w1_t = salt_buf[1]; + w2_t = salt_buf[2]; + w3_t = salt_buf[3]; + w4_t = salt_buf[4]; + w5_t = a; + w6_t = b; + w7_t = c; + w8_t = d; + w9_t = e; + wa_t = 0x80000000; + wb_t = 0; + wc_t = 0; + wd_t = 0; + we_t = 0; + wf_t = 40 * 8; + + a = SHA1M_A; + b = SHA1M_B; + c = SHA1M_C; + d = SHA1M_D; + e = SHA1M_E; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w0_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w1_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w2_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w3_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w4_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w5_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w6_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w7_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w8_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w9_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wa_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, wb_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, wc_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, wd_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, we_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F0o, e, a, b, c, d, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F0o, d, e, a, b, c, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F0o, c, d, e, a, b, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F0o, b, c, d, e, a, w3_t); + + #undef K + #define K SHA1C01 + + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w7_t); + + #undef K + #define K SHA1C02 + + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wb_t); + + #undef K + #define K SHA1C03 + + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wf_t); + + a += SHA1M_A; + b += SHA1M_B; + c += SHA1M_C; + d += SHA1M_D; + e += SHA1M_E; + + a ^= plain_sha1_a; + b ^= plain_sha1_b; + c ^= plain_sha1_c; + d ^= plain_sha1_d; + e ^= plain_sha1_e; + + const u32x r0 = d; + const u32x r1 = e; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_S + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m11200_m04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + /** + * modifier + */ + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = pws[gid].i[15]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m11200m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m11200_m08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + /** + * modifier + */ + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = pws[gid].i[15]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m11200m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m11200_m16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + /** + * modifier + */ + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = pws[gid].i[ 8]; + w2[1] = pws[gid].i[ 9]; + w2[2] = pws[gid].i[10]; + w2[3] = pws[gid].i[11]; + + u32x w3[4]; + + w3[0] = pws[gid].i[12]; + w3[1] = pws[gid].i[13]; + w3[2] = pws[gid].i[14]; + w3[3] = pws[gid].i[15]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m11200m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m11200_s04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + /** + * modifier + */ + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = pws[gid].i[15]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m11200s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m11200_s08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + /** + * modifier + */ + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = pws[gid].i[15]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m11200s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m11200_s16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + /** + * modifier + */ + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = pws[gid].i[ 8]; + w2[1] = pws[gid].i[ 9]; + w2[2] = pws[gid].i[10]; + w2[3] = pws[gid].i[11]; + + u32x w3[4]; + + w3[0] = pws[gid].i[12]; + w3[1] = pws[gid].i[13]; + w3[2] = pws[gid].i[14]; + w3[3] = pws[gid].i[15]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m11200s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} diff --git a/amd/m11300.cl b/amd/m11300.cl new file mode 100644 index 0000000000..99ec1ef8e2 --- /dev/null +++ b/amd/m11300.cl @@ -0,0 +1,1400 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _SHA512_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW4 +#define VECT_SIZE1 +#endif + +#ifdef VLIW5 +#define VECT_SIZE1 +#endif + +#define DGST_R0 0 +#define DGST_R1 1 +#define DGST_R2 2 +#define DGST_R3 3 + +#include "include/kernel_functions.c" +#include "types_amd.c" +#include "common_amd.c" + +__constant u32 te0[256] = +{ + 0xc66363a5, 0xf87c7c84, 0xee777799, 0xf67b7b8d, + 0xfff2f20d, 0xd66b6bbd, 0xde6f6fb1, 0x91c5c554, + 0x60303050, 0x02010103, 0xce6767a9, 0x562b2b7d, + 0xe7fefe19, 0xb5d7d762, 0x4dababe6, 0xec76769a, + 0x8fcaca45, 0x1f82829d, 0x89c9c940, 0xfa7d7d87, + 0xeffafa15, 0xb25959eb, 0x8e4747c9, 0xfbf0f00b, + 0x41adadec, 0xb3d4d467, 0x5fa2a2fd, 0x45afafea, + 0x239c9cbf, 0x53a4a4f7, 0xe4727296, 0x9bc0c05b, + 0x75b7b7c2, 0xe1fdfd1c, 0x3d9393ae, 0x4c26266a, + 0x6c36365a, 0x7e3f3f41, 0xf5f7f702, 0x83cccc4f, + 0x6834345c, 0x51a5a5f4, 0xd1e5e534, 0xf9f1f108, + 0xe2717193, 0xabd8d873, 0x62313153, 0x2a15153f, + 0x0804040c, 0x95c7c752, 0x46232365, 0x9dc3c35e, + 0x30181828, 0x379696a1, 0x0a05050f, 0x2f9a9ab5, + 0x0e070709, 0x24121236, 0x1b80809b, 0xdfe2e23d, + 0xcdebeb26, 0x4e272769, 0x7fb2b2cd, 0xea75759f, + 0x1209091b, 0x1d83839e, 0x582c2c74, 0x341a1a2e, + 0x361b1b2d, 0xdc6e6eb2, 0xb45a5aee, 0x5ba0a0fb, + 0xa45252f6, 0x763b3b4d, 0xb7d6d661, 0x7db3b3ce, + 0x5229297b, 0xdde3e33e, 0x5e2f2f71, 0x13848497, + 0xa65353f5, 0xb9d1d168, 0x00000000, 0xc1eded2c, + 0x40202060, 0xe3fcfc1f, 0x79b1b1c8, 0xb65b5bed, + 0xd46a6abe, 0x8dcbcb46, 0x67bebed9, 0x7239394b, + 0x944a4ade, 0x984c4cd4, 0xb05858e8, 0x85cfcf4a, + 0xbbd0d06b, 0xc5efef2a, 0x4faaaae5, 0xedfbfb16, + 0x864343c5, 0x9a4d4dd7, 0x66333355, 0x11858594, + 0x8a4545cf, 0xe9f9f910, 0x04020206, 0xfe7f7f81, + 0xa05050f0, 0x783c3c44, 0x259f9fba, 0x4ba8a8e3, + 0xa25151f3, 0x5da3a3fe, 0x804040c0, 0x058f8f8a, + 0x3f9292ad, 0x219d9dbc, 0x70383848, 0xf1f5f504, + 0x63bcbcdf, 0x77b6b6c1, 0xafdada75, 0x42212163, + 0x20101030, 0xe5ffff1a, 0xfdf3f30e, 0xbfd2d26d, + 0x81cdcd4c, 0x180c0c14, 0x26131335, 0xc3ecec2f, + 0xbe5f5fe1, 0x359797a2, 0x884444cc, 0x2e171739, + 0x93c4c457, 0x55a7a7f2, 0xfc7e7e82, 0x7a3d3d47, + 0xc86464ac, 0xba5d5de7, 0x3219192b, 0xe6737395, + 0xc06060a0, 0x19818198, 0x9e4f4fd1, 0xa3dcdc7f, + 0x44222266, 0x542a2a7e, 0x3b9090ab, 0x0b888883, + 0x8c4646ca, 0xc7eeee29, 0x6bb8b8d3, 0x2814143c, + 0xa7dede79, 0xbc5e5ee2, 0x160b0b1d, 0xaddbdb76, + 0xdbe0e03b, 0x64323256, 0x743a3a4e, 0x140a0a1e, + 0x924949db, 0x0c06060a, 0x4824246c, 0xb85c5ce4, + 0x9fc2c25d, 0xbdd3d36e, 0x43acacef, 0xc46262a6, + 0x399191a8, 0x319595a4, 0xd3e4e437, 0xf279798b, + 0xd5e7e732, 0x8bc8c843, 0x6e373759, 0xda6d6db7, + 0x018d8d8c, 0xb1d5d564, 0x9c4e4ed2, 0x49a9a9e0, + 0xd86c6cb4, 0xac5656fa, 0xf3f4f407, 0xcfeaea25, + 0xca6565af, 0xf47a7a8e, 0x47aeaee9, 0x10080818, + 0x6fbabad5, 0xf0787888, 0x4a25256f, 0x5c2e2e72, + 0x381c1c24, 0x57a6a6f1, 0x73b4b4c7, 0x97c6c651, + 0xcbe8e823, 0xa1dddd7c, 0xe874749c, 0x3e1f1f21, + 0x964b4bdd, 0x61bdbddc, 0x0d8b8b86, 0x0f8a8a85, + 0xe0707090, 0x7c3e3e42, 0x71b5b5c4, 0xcc6666aa, + 0x904848d8, 0x06030305, 0xf7f6f601, 0x1c0e0e12, + 0xc26161a3, 0x6a35355f, 0xae5757f9, 0x69b9b9d0, + 0x17868691, 0x99c1c158, 0x3a1d1d27, 0x279e9eb9, + 0xd9e1e138, 0xebf8f813, 0x2b9898b3, 0x22111133, + 0xd26969bb, 0xa9d9d970, 0x078e8e89, 0x339494a7, + 0x2d9b9bb6, 0x3c1e1e22, 0x15878792, 0xc9e9e920, + 0x87cece49, 0xaa5555ff, 0x50282878, 0xa5dfdf7a, + 0x038c8c8f, 0x59a1a1f8, 0x09898980, 0x1a0d0d17, + 0x65bfbfda, 0xd7e6e631, 0x844242c6, 0xd06868b8, + 0x824141c3, 0x299999b0, 0x5a2d2d77, 0x1e0f0f11, + 0x7bb0b0cb, 0xa85454fc, 0x6dbbbbd6, 0x2c16163a, +}; + +__constant u32 te1[256] = +{ + 0xa5c66363, 0x84f87c7c, 0x99ee7777, 0x8df67b7b, + 0x0dfff2f2, 0xbdd66b6b, 0xb1de6f6f, 0x5491c5c5, + 0x50603030, 0x03020101, 0xa9ce6767, 0x7d562b2b, + 0x19e7fefe, 0x62b5d7d7, 0xe64dabab, 0x9aec7676, + 0x458fcaca, 0x9d1f8282, 0x4089c9c9, 0x87fa7d7d, + 0x15effafa, 0xebb25959, 0xc98e4747, 0x0bfbf0f0, + 0xec41adad, 0x67b3d4d4, 0xfd5fa2a2, 0xea45afaf, + 0xbf239c9c, 0xf753a4a4, 0x96e47272, 0x5b9bc0c0, + 0xc275b7b7, 0x1ce1fdfd, 0xae3d9393, 0x6a4c2626, + 0x5a6c3636, 0x417e3f3f, 0x02f5f7f7, 0x4f83cccc, + 0x5c683434, 0xf451a5a5, 0x34d1e5e5, 0x08f9f1f1, + 0x93e27171, 0x73abd8d8, 0x53623131, 0x3f2a1515, + 0x0c080404, 0x5295c7c7, 0x65462323, 0x5e9dc3c3, + 0x28301818, 0xa1379696, 0x0f0a0505, 0xb52f9a9a, + 0x090e0707, 0x36241212, 0x9b1b8080, 0x3ddfe2e2, + 0x26cdebeb, 0x694e2727, 0xcd7fb2b2, 0x9fea7575, + 0x1b120909, 0x9e1d8383, 0x74582c2c, 0x2e341a1a, + 0x2d361b1b, 0xb2dc6e6e, 0xeeb45a5a, 0xfb5ba0a0, + 0xf6a45252, 0x4d763b3b, 0x61b7d6d6, 0xce7db3b3, + 0x7b522929, 0x3edde3e3, 0x715e2f2f, 0x97138484, + 0xf5a65353, 0x68b9d1d1, 0x00000000, 0x2cc1eded, + 0x60402020, 0x1fe3fcfc, 0xc879b1b1, 0xedb65b5b, + 0xbed46a6a, 0x468dcbcb, 0xd967bebe, 0x4b723939, + 0xde944a4a, 0xd4984c4c, 0xe8b05858, 0x4a85cfcf, + 0x6bbbd0d0, 0x2ac5efef, 0xe54faaaa, 0x16edfbfb, + 0xc5864343, 0xd79a4d4d, 0x55663333, 0x94118585, + 0xcf8a4545, 0x10e9f9f9, 0x06040202, 0x81fe7f7f, + 0xf0a05050, 0x44783c3c, 0xba259f9f, 0xe34ba8a8, + 0xf3a25151, 0xfe5da3a3, 0xc0804040, 0x8a058f8f, + 0xad3f9292, 0xbc219d9d, 0x48703838, 0x04f1f5f5, + 0xdf63bcbc, 0xc177b6b6, 0x75afdada, 0x63422121, + 0x30201010, 0x1ae5ffff, 0x0efdf3f3, 0x6dbfd2d2, + 0x4c81cdcd, 0x14180c0c, 0x35261313, 0x2fc3ecec, + 0xe1be5f5f, 0xa2359797, 0xcc884444, 0x392e1717, + 0x5793c4c4, 0xf255a7a7, 0x82fc7e7e, 0x477a3d3d, + 0xacc86464, 0xe7ba5d5d, 0x2b321919, 0x95e67373, + 0xa0c06060, 0x98198181, 0xd19e4f4f, 0x7fa3dcdc, + 0x66442222, 0x7e542a2a, 0xab3b9090, 0x830b8888, + 0xca8c4646, 0x29c7eeee, 0xd36bb8b8, 0x3c281414, + 0x79a7dede, 0xe2bc5e5e, 0x1d160b0b, 0x76addbdb, + 0x3bdbe0e0, 0x56643232, 0x4e743a3a, 0x1e140a0a, + 0xdb924949, 0x0a0c0606, 0x6c482424, 0xe4b85c5c, + 0x5d9fc2c2, 0x6ebdd3d3, 0xef43acac, 0xa6c46262, + 0xa8399191, 0xa4319595, 0x37d3e4e4, 0x8bf27979, + 0x32d5e7e7, 0x438bc8c8, 0x596e3737, 0xb7da6d6d, + 0x8c018d8d, 0x64b1d5d5, 0xd29c4e4e, 0xe049a9a9, + 0xb4d86c6c, 0xfaac5656, 0x07f3f4f4, 0x25cfeaea, + 0xafca6565, 0x8ef47a7a, 0xe947aeae, 0x18100808, + 0xd56fbaba, 0x88f07878, 0x6f4a2525, 0x725c2e2e, + 0x24381c1c, 0xf157a6a6, 0xc773b4b4, 0x5197c6c6, + 0x23cbe8e8, 0x7ca1dddd, 0x9ce87474, 0x213e1f1f, + 0xdd964b4b, 0xdc61bdbd, 0x860d8b8b, 0x850f8a8a, + 0x90e07070, 0x427c3e3e, 0xc471b5b5, 0xaacc6666, + 0xd8904848, 0x05060303, 0x01f7f6f6, 0x121c0e0e, + 0xa3c26161, 0x5f6a3535, 0xf9ae5757, 0xd069b9b9, + 0x91178686, 0x5899c1c1, 0x273a1d1d, 0xb9279e9e, + 0x38d9e1e1, 0x13ebf8f8, 0xb32b9898, 0x33221111, + 0xbbd26969, 0x70a9d9d9, 0x89078e8e, 0xa7339494, + 0xb62d9b9b, 0x223c1e1e, 0x92158787, 0x20c9e9e9, + 0x4987cece, 0xffaa5555, 0x78502828, 0x7aa5dfdf, + 0x8f038c8c, 0xf859a1a1, 0x80098989, 0x171a0d0d, + 0xda65bfbf, 0x31d7e6e6, 0xc6844242, 0xb8d06868, + 0xc3824141, 0xb0299999, 0x775a2d2d, 0x111e0f0f, + 0xcb7bb0b0, 0xfca85454, 0xd66dbbbb, 0x3a2c1616, +}; + +__constant u32 te2[256] = +{ + 0x63a5c663, 0x7c84f87c, 0x7799ee77, 0x7b8df67b, + 0xf20dfff2, 0x6bbdd66b, 0x6fb1de6f, 0xc55491c5, + 0x30506030, 0x01030201, 0x67a9ce67, 0x2b7d562b, + 0xfe19e7fe, 0xd762b5d7, 0xabe64dab, 0x769aec76, + 0xca458fca, 0x829d1f82, 0xc94089c9, 0x7d87fa7d, + 0xfa15effa, 0x59ebb259, 0x47c98e47, 0xf00bfbf0, + 0xadec41ad, 0xd467b3d4, 0xa2fd5fa2, 0xafea45af, + 0x9cbf239c, 0xa4f753a4, 0x7296e472, 0xc05b9bc0, + 0xb7c275b7, 0xfd1ce1fd, 0x93ae3d93, 0x266a4c26, + 0x365a6c36, 0x3f417e3f, 0xf702f5f7, 0xcc4f83cc, + 0x345c6834, 0xa5f451a5, 0xe534d1e5, 0xf108f9f1, + 0x7193e271, 0xd873abd8, 0x31536231, 0x153f2a15, + 0x040c0804, 0xc75295c7, 0x23654623, 0xc35e9dc3, + 0x18283018, 0x96a13796, 0x050f0a05, 0x9ab52f9a, + 0x07090e07, 0x12362412, 0x809b1b80, 0xe23ddfe2, + 0xeb26cdeb, 0x27694e27, 0xb2cd7fb2, 0x759fea75, + 0x091b1209, 0x839e1d83, 0x2c74582c, 0x1a2e341a, + 0x1b2d361b, 0x6eb2dc6e, 0x5aeeb45a, 0xa0fb5ba0, + 0x52f6a452, 0x3b4d763b, 0xd661b7d6, 0xb3ce7db3, + 0x297b5229, 0xe33edde3, 0x2f715e2f, 0x84971384, + 0x53f5a653, 0xd168b9d1, 0x00000000, 0xed2cc1ed, + 0x20604020, 0xfc1fe3fc, 0xb1c879b1, 0x5bedb65b, + 0x6abed46a, 0xcb468dcb, 0xbed967be, 0x394b7239, + 0x4ade944a, 0x4cd4984c, 0x58e8b058, 0xcf4a85cf, + 0xd06bbbd0, 0xef2ac5ef, 0xaae54faa, 0xfb16edfb, + 0x43c58643, 0x4dd79a4d, 0x33556633, 0x85941185, + 0x45cf8a45, 0xf910e9f9, 0x02060402, 0x7f81fe7f, + 0x50f0a050, 0x3c44783c, 0x9fba259f, 0xa8e34ba8, + 0x51f3a251, 0xa3fe5da3, 0x40c08040, 0x8f8a058f, + 0x92ad3f92, 0x9dbc219d, 0x38487038, 0xf504f1f5, + 0xbcdf63bc, 0xb6c177b6, 0xda75afda, 0x21634221, + 0x10302010, 0xff1ae5ff, 0xf30efdf3, 0xd26dbfd2, + 0xcd4c81cd, 0x0c14180c, 0x13352613, 0xec2fc3ec, + 0x5fe1be5f, 0x97a23597, 0x44cc8844, 0x17392e17, + 0xc45793c4, 0xa7f255a7, 0x7e82fc7e, 0x3d477a3d, + 0x64acc864, 0x5de7ba5d, 0x192b3219, 0x7395e673, + 0x60a0c060, 0x81981981, 0x4fd19e4f, 0xdc7fa3dc, + 0x22664422, 0x2a7e542a, 0x90ab3b90, 0x88830b88, + 0x46ca8c46, 0xee29c7ee, 0xb8d36bb8, 0x143c2814, + 0xde79a7de, 0x5ee2bc5e, 0x0b1d160b, 0xdb76addb, + 0xe03bdbe0, 0x32566432, 0x3a4e743a, 0x0a1e140a, + 0x49db9249, 0x060a0c06, 0x246c4824, 0x5ce4b85c, + 0xc25d9fc2, 0xd36ebdd3, 0xacef43ac, 0x62a6c462, + 0x91a83991, 0x95a43195, 0xe437d3e4, 0x798bf279, + 0xe732d5e7, 0xc8438bc8, 0x37596e37, 0x6db7da6d, + 0x8d8c018d, 0xd564b1d5, 0x4ed29c4e, 0xa9e049a9, + 0x6cb4d86c, 0x56faac56, 0xf407f3f4, 0xea25cfea, + 0x65afca65, 0x7a8ef47a, 0xaee947ae, 0x08181008, + 0xbad56fba, 0x7888f078, 0x256f4a25, 0x2e725c2e, + 0x1c24381c, 0xa6f157a6, 0xb4c773b4, 0xc65197c6, + 0xe823cbe8, 0xdd7ca1dd, 0x749ce874, 0x1f213e1f, + 0x4bdd964b, 0xbddc61bd, 0x8b860d8b, 0x8a850f8a, + 0x7090e070, 0x3e427c3e, 0xb5c471b5, 0x66aacc66, + 0x48d89048, 0x03050603, 0xf601f7f6, 0x0e121c0e, + 0x61a3c261, 0x355f6a35, 0x57f9ae57, 0xb9d069b9, + 0x86911786, 0xc15899c1, 0x1d273a1d, 0x9eb9279e, + 0xe138d9e1, 0xf813ebf8, 0x98b32b98, 0x11332211, + 0x69bbd269, 0xd970a9d9, 0x8e89078e, 0x94a73394, + 0x9bb62d9b, 0x1e223c1e, 0x87921587, 0xe920c9e9, + 0xce4987ce, 0x55ffaa55, 0x28785028, 0xdf7aa5df, + 0x8c8f038c, 0xa1f859a1, 0x89800989, 0x0d171a0d, + 0xbfda65bf, 0xe631d7e6, 0x42c68442, 0x68b8d068, + 0x41c38241, 0x99b02999, 0x2d775a2d, 0x0f111e0f, + 0xb0cb7bb0, 0x54fca854, 0xbbd66dbb, 0x163a2c16, +}; + +__constant u32 te3[256] = +{ + 0x6363a5c6, 0x7c7c84f8, 0x777799ee, 0x7b7b8df6, + 0xf2f20dff, 0x6b6bbdd6, 0x6f6fb1de, 0xc5c55491, + 0x30305060, 0x01010302, 0x6767a9ce, 0x2b2b7d56, + 0xfefe19e7, 0xd7d762b5, 0xababe64d, 0x76769aec, + 0xcaca458f, 0x82829d1f, 0xc9c94089, 0x7d7d87fa, + 0xfafa15ef, 0x5959ebb2, 0x4747c98e, 0xf0f00bfb, + 0xadadec41, 0xd4d467b3, 0xa2a2fd5f, 0xafafea45, + 0x9c9cbf23, 0xa4a4f753, 0x727296e4, 0xc0c05b9b, + 0xb7b7c275, 0xfdfd1ce1, 0x9393ae3d, 0x26266a4c, + 0x36365a6c, 0x3f3f417e, 0xf7f702f5, 0xcccc4f83, + 0x34345c68, 0xa5a5f451, 0xe5e534d1, 0xf1f108f9, + 0x717193e2, 0xd8d873ab, 0x31315362, 0x15153f2a, + 0x04040c08, 0xc7c75295, 0x23236546, 0xc3c35e9d, + 0x18182830, 0x9696a137, 0x05050f0a, 0x9a9ab52f, + 0x0707090e, 0x12123624, 0x80809b1b, 0xe2e23ddf, + 0xebeb26cd, 0x2727694e, 0xb2b2cd7f, 0x75759fea, + 0x09091b12, 0x83839e1d, 0x2c2c7458, 0x1a1a2e34, + 0x1b1b2d36, 0x6e6eb2dc, 0x5a5aeeb4, 0xa0a0fb5b, + 0x5252f6a4, 0x3b3b4d76, 0xd6d661b7, 0xb3b3ce7d, + 0x29297b52, 0xe3e33edd, 0x2f2f715e, 0x84849713, + 0x5353f5a6, 0xd1d168b9, 0x00000000, 0xeded2cc1, + 0x20206040, 0xfcfc1fe3, 0xb1b1c879, 0x5b5bedb6, + 0x6a6abed4, 0xcbcb468d, 0xbebed967, 0x39394b72, + 0x4a4ade94, 0x4c4cd498, 0x5858e8b0, 0xcfcf4a85, + 0xd0d06bbb, 0xefef2ac5, 0xaaaae54f, 0xfbfb16ed, + 0x4343c586, 0x4d4dd79a, 0x33335566, 0x85859411, + 0x4545cf8a, 0xf9f910e9, 0x02020604, 0x7f7f81fe, + 0x5050f0a0, 0x3c3c4478, 0x9f9fba25, 0xa8a8e34b, + 0x5151f3a2, 0xa3a3fe5d, 0x4040c080, 0x8f8f8a05, + 0x9292ad3f, 0x9d9dbc21, 0x38384870, 0xf5f504f1, + 0xbcbcdf63, 0xb6b6c177, 0xdada75af, 0x21216342, + 0x10103020, 0xffff1ae5, 0xf3f30efd, 0xd2d26dbf, + 0xcdcd4c81, 0x0c0c1418, 0x13133526, 0xecec2fc3, + 0x5f5fe1be, 0x9797a235, 0x4444cc88, 0x1717392e, + 0xc4c45793, 0xa7a7f255, 0x7e7e82fc, 0x3d3d477a, + 0x6464acc8, 0x5d5de7ba, 0x19192b32, 0x737395e6, + 0x6060a0c0, 0x81819819, 0x4f4fd19e, 0xdcdc7fa3, + 0x22226644, 0x2a2a7e54, 0x9090ab3b, 0x8888830b, + 0x4646ca8c, 0xeeee29c7, 0xb8b8d36b, 0x14143c28, + 0xdede79a7, 0x5e5ee2bc, 0x0b0b1d16, 0xdbdb76ad, + 0xe0e03bdb, 0x32325664, 0x3a3a4e74, 0x0a0a1e14, + 0x4949db92, 0x06060a0c, 0x24246c48, 0x5c5ce4b8, + 0xc2c25d9f, 0xd3d36ebd, 0xacacef43, 0x6262a6c4, + 0x9191a839, 0x9595a431, 0xe4e437d3, 0x79798bf2, + 0xe7e732d5, 0xc8c8438b, 0x3737596e, 0x6d6db7da, + 0x8d8d8c01, 0xd5d564b1, 0x4e4ed29c, 0xa9a9e049, + 0x6c6cb4d8, 0x5656faac, 0xf4f407f3, 0xeaea25cf, + 0x6565afca, 0x7a7a8ef4, 0xaeaee947, 0x08081810, + 0xbabad56f, 0x787888f0, 0x25256f4a, 0x2e2e725c, + 0x1c1c2438, 0xa6a6f157, 0xb4b4c773, 0xc6c65197, + 0xe8e823cb, 0xdddd7ca1, 0x74749ce8, 0x1f1f213e, + 0x4b4bdd96, 0xbdbddc61, 0x8b8b860d, 0x8a8a850f, + 0x707090e0, 0x3e3e427c, 0xb5b5c471, 0x6666aacc, + 0x4848d890, 0x03030506, 0xf6f601f7, 0x0e0e121c, + 0x6161a3c2, 0x35355f6a, 0x5757f9ae, 0xb9b9d069, + 0x86869117, 0xc1c15899, 0x1d1d273a, 0x9e9eb927, + 0xe1e138d9, 0xf8f813eb, 0x9898b32b, 0x11113322, + 0x6969bbd2, 0xd9d970a9, 0x8e8e8907, 0x9494a733, + 0x9b9bb62d, 0x1e1e223c, 0x87879215, 0xe9e920c9, + 0xcece4987, 0x5555ffaa, 0x28287850, 0xdfdf7aa5, + 0x8c8c8f03, 0xa1a1f859, 0x89898009, 0x0d0d171a, + 0xbfbfda65, 0xe6e631d7, 0x4242c684, 0x6868b8d0, + 0x4141c382, 0x9999b029, 0x2d2d775a, 0x0f0f111e, + 0xb0b0cb7b, 0x5454fca8, 0xbbbbd66d, 0x16163a2c, +}; + +__constant u32 te4[256] = +{ + 0x63636363, 0x7c7c7c7c, 0x77777777, 0x7b7b7b7b, + 0xf2f2f2f2, 0x6b6b6b6b, 0x6f6f6f6f, 0xc5c5c5c5, + 0x30303030, 0x01010101, 0x67676767, 0x2b2b2b2b, + 0xfefefefe, 0xd7d7d7d7, 0xabababab, 0x76767676, + 0xcacacaca, 0x82828282, 0xc9c9c9c9, 0x7d7d7d7d, + 0xfafafafa, 0x59595959, 0x47474747, 0xf0f0f0f0, + 0xadadadad, 0xd4d4d4d4, 0xa2a2a2a2, 0xafafafaf, + 0x9c9c9c9c, 0xa4a4a4a4, 0x72727272, 0xc0c0c0c0, + 0xb7b7b7b7, 0xfdfdfdfd, 0x93939393, 0x26262626, + 0x36363636, 0x3f3f3f3f, 0xf7f7f7f7, 0xcccccccc, + 0x34343434, 0xa5a5a5a5, 0xe5e5e5e5, 0xf1f1f1f1, + 0x71717171, 0xd8d8d8d8, 0x31313131, 0x15151515, + 0x04040404, 0xc7c7c7c7, 0x23232323, 0xc3c3c3c3, + 0x18181818, 0x96969696, 0x05050505, 0x9a9a9a9a, + 0x07070707, 0x12121212, 0x80808080, 0xe2e2e2e2, + 0xebebebeb, 0x27272727, 0xb2b2b2b2, 0x75757575, + 0x09090909, 0x83838383, 0x2c2c2c2c, 0x1a1a1a1a, + 0x1b1b1b1b, 0x6e6e6e6e, 0x5a5a5a5a, 0xa0a0a0a0, + 0x52525252, 0x3b3b3b3b, 0xd6d6d6d6, 0xb3b3b3b3, + 0x29292929, 0xe3e3e3e3, 0x2f2f2f2f, 0x84848484, + 0x53535353, 0xd1d1d1d1, 0x00000000, 0xedededed, + 0x20202020, 0xfcfcfcfc, 0xb1b1b1b1, 0x5b5b5b5b, + 0x6a6a6a6a, 0xcbcbcbcb, 0xbebebebe, 0x39393939, + 0x4a4a4a4a, 0x4c4c4c4c, 0x58585858, 0xcfcfcfcf, + 0xd0d0d0d0, 0xefefefef, 0xaaaaaaaa, 0xfbfbfbfb, + 0x43434343, 0x4d4d4d4d, 0x33333333, 0x85858585, + 0x45454545, 0xf9f9f9f9, 0x02020202, 0x7f7f7f7f, + 0x50505050, 0x3c3c3c3c, 0x9f9f9f9f, 0xa8a8a8a8, + 0x51515151, 0xa3a3a3a3, 0x40404040, 0x8f8f8f8f, + 0x92929292, 0x9d9d9d9d, 0x38383838, 0xf5f5f5f5, + 0xbcbcbcbc, 0xb6b6b6b6, 0xdadadada, 0x21212121, + 0x10101010, 0xffffffff, 0xf3f3f3f3, 0xd2d2d2d2, + 0xcdcdcdcd, 0x0c0c0c0c, 0x13131313, 0xecececec, + 0x5f5f5f5f, 0x97979797, 0x44444444, 0x17171717, + 0xc4c4c4c4, 0xa7a7a7a7, 0x7e7e7e7e, 0x3d3d3d3d, + 0x64646464, 0x5d5d5d5d, 0x19191919, 0x73737373, + 0x60606060, 0x81818181, 0x4f4f4f4f, 0xdcdcdcdc, + 0x22222222, 0x2a2a2a2a, 0x90909090, 0x88888888, + 0x46464646, 0xeeeeeeee, 0xb8b8b8b8, 0x14141414, + 0xdededede, 0x5e5e5e5e, 0x0b0b0b0b, 0xdbdbdbdb, + 0xe0e0e0e0, 0x32323232, 0x3a3a3a3a, 0x0a0a0a0a, + 0x49494949, 0x06060606, 0x24242424, 0x5c5c5c5c, + 0xc2c2c2c2, 0xd3d3d3d3, 0xacacacac, 0x62626262, + 0x91919191, 0x95959595, 0xe4e4e4e4, 0x79797979, + 0xe7e7e7e7, 0xc8c8c8c8, 0x37373737, 0x6d6d6d6d, + 0x8d8d8d8d, 0xd5d5d5d5, 0x4e4e4e4e, 0xa9a9a9a9, + 0x6c6c6c6c, 0x56565656, 0xf4f4f4f4, 0xeaeaeaea, + 0x65656565, 0x7a7a7a7a, 0xaeaeaeae, 0x08080808, + 0xbabababa, 0x78787878, 0x25252525, 0x2e2e2e2e, + 0x1c1c1c1c, 0xa6a6a6a6, 0xb4b4b4b4, 0xc6c6c6c6, + 0xe8e8e8e8, 0xdddddddd, 0x74747474, 0x1f1f1f1f, + 0x4b4b4b4b, 0xbdbdbdbd, 0x8b8b8b8b, 0x8a8a8a8a, + 0x70707070, 0x3e3e3e3e, 0xb5b5b5b5, 0x66666666, + 0x48484848, 0x03030303, 0xf6f6f6f6, 0x0e0e0e0e, + 0x61616161, 0x35353535, 0x57575757, 0xb9b9b9b9, + 0x86868686, 0xc1c1c1c1, 0x1d1d1d1d, 0x9e9e9e9e, + 0xe1e1e1e1, 0xf8f8f8f8, 0x98989898, 0x11111111, + 0x69696969, 0xd9d9d9d9, 0x8e8e8e8e, 0x94949494, + 0x9b9b9b9b, 0x1e1e1e1e, 0x87878787, 0xe9e9e9e9, + 0xcececece, 0x55555555, 0x28282828, 0xdfdfdfdf, + 0x8c8c8c8c, 0xa1a1a1a1, 0x89898989, 0x0d0d0d0d, + 0xbfbfbfbf, 0xe6e6e6e6, 0x42424242, 0x68686868, + 0x41414141, 0x99999999, 0x2d2d2d2d, 0x0f0f0f0f, + 0xb0b0b0b0, 0x54545454, 0xbbbbbbbb, 0x16161616, +}; + +__constant u32 td0[256] = +{ + 0x51f4a750, 0x7e416553, 0x1a17a4c3, 0x3a275e96, + 0x3bab6bcb, 0x1f9d45f1, 0xacfa58ab, 0x4be30393, + 0x2030fa55, 0xad766df6, 0x88cc7691, 0xf5024c25, + 0x4fe5d7fc, 0xc52acbd7, 0x26354480, 0xb562a38f, + 0xdeb15a49, 0x25ba1b67, 0x45ea0e98, 0x5dfec0e1, + 0xc32f7502, 0x814cf012, 0x8d4697a3, 0x6bd3f9c6, + 0x038f5fe7, 0x15929c95, 0xbf6d7aeb, 0x955259da, + 0xd4be832d, 0x587421d3, 0x49e06929, 0x8ec9c844, + 0x75c2896a, 0xf48e7978, 0x99583e6b, 0x27b971dd, + 0xbee14fb6, 0xf088ad17, 0xc920ac66, 0x7dce3ab4, + 0x63df4a18, 0xe51a3182, 0x97513360, 0x62537f45, + 0xb16477e0, 0xbb6bae84, 0xfe81a01c, 0xf9082b94, + 0x70486858, 0x8f45fd19, 0x94de6c87, 0x527bf8b7, + 0xab73d323, 0x724b02e2, 0xe31f8f57, 0x6655ab2a, + 0xb2eb2807, 0x2fb5c203, 0x86c57b9a, 0xd33708a5, + 0x302887f2, 0x23bfa5b2, 0x02036aba, 0xed16825c, + 0x8acf1c2b, 0xa779b492, 0xf307f2f0, 0x4e69e2a1, + 0x65daf4cd, 0x0605bed5, 0xd134621f, 0xc4a6fe8a, + 0x342e539d, 0xa2f355a0, 0x058ae132, 0xa4f6eb75, + 0x0b83ec39, 0x4060efaa, 0x5e719f06, 0xbd6e1051, + 0x3e218af9, 0x96dd063d, 0xdd3e05ae, 0x4de6bd46, + 0x91548db5, 0x71c45d05, 0x0406d46f, 0x605015ff, + 0x1998fb24, 0xd6bde997, 0x894043cc, 0x67d99e77, + 0xb0e842bd, 0x07898b88, 0xe7195b38, 0x79c8eedb, + 0xa17c0a47, 0x7c420fe9, 0xf8841ec9, 0x00000000, + 0x09808683, 0x322bed48, 0x1e1170ac, 0x6c5a724e, + 0xfd0efffb, 0x0f853856, 0x3daed51e, 0x362d3927, + 0x0a0fd964, 0x685ca621, 0x9b5b54d1, 0x24362e3a, + 0x0c0a67b1, 0x9357e70f, 0xb4ee96d2, 0x1b9b919e, + 0x80c0c54f, 0x61dc20a2, 0x5a774b69, 0x1c121a16, + 0xe293ba0a, 0xc0a02ae5, 0x3c22e043, 0x121b171d, + 0x0e090d0b, 0xf28bc7ad, 0x2db6a8b9, 0x141ea9c8, + 0x57f11985, 0xaf75074c, 0xee99ddbb, 0xa37f60fd, + 0xf701269f, 0x5c72f5bc, 0x44663bc5, 0x5bfb7e34, + 0x8b432976, 0xcb23c6dc, 0xb6edfc68, 0xb8e4f163, + 0xd731dcca, 0x42638510, 0x13972240, 0x84c61120, + 0x854a247d, 0xd2bb3df8, 0xaef93211, 0xc729a16d, + 0x1d9e2f4b, 0xdcb230f3, 0x0d8652ec, 0x77c1e3d0, + 0x2bb3166c, 0xa970b999, 0x119448fa, 0x47e96422, + 0xa8fc8cc4, 0xa0f03f1a, 0x567d2cd8, 0x223390ef, + 0x87494ec7, 0xd938d1c1, 0x8ccaa2fe, 0x98d40b36, + 0xa6f581cf, 0xa57ade28, 0xdab78e26, 0x3fadbfa4, + 0x2c3a9de4, 0x5078920d, 0x6a5fcc9b, 0x547e4662, + 0xf68d13c2, 0x90d8b8e8, 0x2e39f75e, 0x82c3aff5, + 0x9f5d80be, 0x69d0937c, 0x6fd52da9, 0xcf2512b3, + 0xc8ac993b, 0x10187da7, 0xe89c636e, 0xdb3bbb7b, + 0xcd267809, 0x6e5918f4, 0xec9ab701, 0x834f9aa8, + 0xe6956e65, 0xaaffe67e, 0x21bccf08, 0xef15e8e6, + 0xbae79bd9, 0x4a6f36ce, 0xea9f09d4, 0x29b07cd6, + 0x31a4b2af, 0x2a3f2331, 0xc6a59430, 0x35a266c0, + 0x744ebc37, 0xfc82caa6, 0xe090d0b0, 0x33a7d815, + 0xf104984a, 0x41ecdaf7, 0x7fcd500e, 0x1791f62f, + 0x764dd68d, 0x43efb04d, 0xccaa4d54, 0xe49604df, + 0x9ed1b5e3, 0x4c6a881b, 0xc12c1fb8, 0x4665517f, + 0x9d5eea04, 0x018c355d, 0xfa877473, 0xfb0b412e, + 0xb3671d5a, 0x92dbd252, 0xe9105633, 0x6dd64713, + 0x9ad7618c, 0x37a10c7a, 0x59f8148e, 0xeb133c89, + 0xcea927ee, 0xb761c935, 0xe11ce5ed, 0x7a47b13c, + 0x9cd2df59, 0x55f2733f, 0x1814ce79, 0x73c737bf, + 0x53f7cdea, 0x5ffdaa5b, 0xdf3d6f14, 0x7844db86, + 0xcaaff381, 0xb968c43e, 0x3824342c, 0xc2a3405f, + 0x161dc372, 0xbce2250c, 0x283c498b, 0xff0d9541, + 0x39a80171, 0x080cb3de, 0xd8b4e49c, 0x6456c190, + 0x7bcb8461, 0xd532b670, 0x486c5c74, 0xd0b85742, +}; + +__constant u32 td1[256] = +{ + 0x5051f4a7, 0x537e4165, 0xc31a17a4, 0x963a275e, + 0xcb3bab6b, 0xf11f9d45, 0xabacfa58, 0x934be303, + 0x552030fa, 0xf6ad766d, 0x9188cc76, 0x25f5024c, + 0xfc4fe5d7, 0xd7c52acb, 0x80263544, 0x8fb562a3, + 0x49deb15a, 0x6725ba1b, 0x9845ea0e, 0xe15dfec0, + 0x02c32f75, 0x12814cf0, 0xa38d4697, 0xc66bd3f9, + 0xe7038f5f, 0x9515929c, 0xebbf6d7a, 0xda955259, + 0x2dd4be83, 0xd3587421, 0x2949e069, 0x448ec9c8, + 0x6a75c289, 0x78f48e79, 0x6b99583e, 0xdd27b971, + 0xb6bee14f, 0x17f088ad, 0x66c920ac, 0xb47dce3a, + 0x1863df4a, 0x82e51a31, 0x60975133, 0x4562537f, + 0xe0b16477, 0x84bb6bae, 0x1cfe81a0, 0x94f9082b, + 0x58704868, 0x198f45fd, 0x8794de6c, 0xb7527bf8, + 0x23ab73d3, 0xe2724b02, 0x57e31f8f, 0x2a6655ab, + 0x07b2eb28, 0x032fb5c2, 0x9a86c57b, 0xa5d33708, + 0xf2302887, 0xb223bfa5, 0xba02036a, 0x5ced1682, + 0x2b8acf1c, 0x92a779b4, 0xf0f307f2, 0xa14e69e2, + 0xcd65daf4, 0xd50605be, 0x1fd13462, 0x8ac4a6fe, + 0x9d342e53, 0xa0a2f355, 0x32058ae1, 0x75a4f6eb, + 0x390b83ec, 0xaa4060ef, 0x065e719f, 0x51bd6e10, + 0xf93e218a, 0x3d96dd06, 0xaedd3e05, 0x464de6bd, + 0xb591548d, 0x0571c45d, 0x6f0406d4, 0xff605015, + 0x241998fb, 0x97d6bde9, 0xcc894043, 0x7767d99e, + 0xbdb0e842, 0x8807898b, 0x38e7195b, 0xdb79c8ee, + 0x47a17c0a, 0xe97c420f, 0xc9f8841e, 0x00000000, + 0x83098086, 0x48322bed, 0xac1e1170, 0x4e6c5a72, + 0xfbfd0eff, 0x560f8538, 0x1e3daed5, 0x27362d39, + 0x640a0fd9, 0x21685ca6, 0xd19b5b54, 0x3a24362e, + 0xb10c0a67, 0x0f9357e7, 0xd2b4ee96, 0x9e1b9b91, + 0x4f80c0c5, 0xa261dc20, 0x695a774b, 0x161c121a, + 0x0ae293ba, 0xe5c0a02a, 0x433c22e0, 0x1d121b17, + 0x0b0e090d, 0xadf28bc7, 0xb92db6a8, 0xc8141ea9, + 0x8557f119, 0x4caf7507, 0xbbee99dd, 0xfda37f60, + 0x9ff70126, 0xbc5c72f5, 0xc544663b, 0x345bfb7e, + 0x768b4329, 0xdccb23c6, 0x68b6edfc, 0x63b8e4f1, + 0xcad731dc, 0x10426385, 0x40139722, 0x2084c611, + 0x7d854a24, 0xf8d2bb3d, 0x11aef932, 0x6dc729a1, + 0x4b1d9e2f, 0xf3dcb230, 0xec0d8652, 0xd077c1e3, + 0x6c2bb316, 0x99a970b9, 0xfa119448, 0x2247e964, + 0xc4a8fc8c, 0x1aa0f03f, 0xd8567d2c, 0xef223390, + 0xc787494e, 0xc1d938d1, 0xfe8ccaa2, 0x3698d40b, + 0xcfa6f581, 0x28a57ade, 0x26dab78e, 0xa43fadbf, + 0xe42c3a9d, 0x0d507892, 0x9b6a5fcc, 0x62547e46, + 0xc2f68d13, 0xe890d8b8, 0x5e2e39f7, 0xf582c3af, + 0xbe9f5d80, 0x7c69d093, 0xa96fd52d, 0xb3cf2512, + 0x3bc8ac99, 0xa710187d, 0x6ee89c63, 0x7bdb3bbb, + 0x09cd2678, 0xf46e5918, 0x01ec9ab7, 0xa8834f9a, + 0x65e6956e, 0x7eaaffe6, 0x0821bccf, 0xe6ef15e8, + 0xd9bae79b, 0xce4a6f36, 0xd4ea9f09, 0xd629b07c, + 0xaf31a4b2, 0x312a3f23, 0x30c6a594, 0xc035a266, + 0x37744ebc, 0xa6fc82ca, 0xb0e090d0, 0x1533a7d8, + 0x4af10498, 0xf741ecda, 0x0e7fcd50, 0x2f1791f6, + 0x8d764dd6, 0x4d43efb0, 0x54ccaa4d, 0xdfe49604, + 0xe39ed1b5, 0x1b4c6a88, 0xb8c12c1f, 0x7f466551, + 0x049d5eea, 0x5d018c35, 0x73fa8774, 0x2efb0b41, + 0x5ab3671d, 0x5292dbd2, 0x33e91056, 0x136dd647, + 0x8c9ad761, 0x7a37a10c, 0x8e59f814, 0x89eb133c, + 0xeecea927, 0x35b761c9, 0xede11ce5, 0x3c7a47b1, + 0x599cd2df, 0x3f55f273, 0x791814ce, 0xbf73c737, + 0xea53f7cd, 0x5b5ffdaa, 0x14df3d6f, 0x867844db, + 0x81caaff3, 0x3eb968c4, 0x2c382434, 0x5fc2a340, + 0x72161dc3, 0x0cbce225, 0x8b283c49, 0x41ff0d95, + 0x7139a801, 0xde080cb3, 0x9cd8b4e4, 0x906456c1, + 0x617bcb84, 0x70d532b6, 0x74486c5c, 0x42d0b857, +}; + +__constant u32 td2[256] = +{ + 0xa75051f4, 0x65537e41, 0xa4c31a17, 0x5e963a27, + 0x6bcb3bab, 0x45f11f9d, 0x58abacfa, 0x03934be3, + 0xfa552030, 0x6df6ad76, 0x769188cc, 0x4c25f502, + 0xd7fc4fe5, 0xcbd7c52a, 0x44802635, 0xa38fb562, + 0x5a49deb1, 0x1b6725ba, 0x0e9845ea, 0xc0e15dfe, + 0x7502c32f, 0xf012814c, 0x97a38d46, 0xf9c66bd3, + 0x5fe7038f, 0x9c951592, 0x7aebbf6d, 0x59da9552, + 0x832dd4be, 0x21d35874, 0x692949e0, 0xc8448ec9, + 0x896a75c2, 0x7978f48e, 0x3e6b9958, 0x71dd27b9, + 0x4fb6bee1, 0xad17f088, 0xac66c920, 0x3ab47dce, + 0x4a1863df, 0x3182e51a, 0x33609751, 0x7f456253, + 0x77e0b164, 0xae84bb6b, 0xa01cfe81, 0x2b94f908, + 0x68587048, 0xfd198f45, 0x6c8794de, 0xf8b7527b, + 0xd323ab73, 0x02e2724b, 0x8f57e31f, 0xab2a6655, + 0x2807b2eb, 0xc2032fb5, 0x7b9a86c5, 0x08a5d337, + 0x87f23028, 0xa5b223bf, 0x6aba0203, 0x825ced16, + 0x1c2b8acf, 0xb492a779, 0xf2f0f307, 0xe2a14e69, + 0xf4cd65da, 0xbed50605, 0x621fd134, 0xfe8ac4a6, + 0x539d342e, 0x55a0a2f3, 0xe132058a, 0xeb75a4f6, + 0xec390b83, 0xefaa4060, 0x9f065e71, 0x1051bd6e, + 0x8af93e21, 0x063d96dd, 0x05aedd3e, 0xbd464de6, + 0x8db59154, 0x5d0571c4, 0xd46f0406, 0x15ff6050, + 0xfb241998, 0xe997d6bd, 0x43cc8940, 0x9e7767d9, + 0x42bdb0e8, 0x8b880789, 0x5b38e719, 0xeedb79c8, + 0x0a47a17c, 0x0fe97c42, 0x1ec9f884, 0x00000000, + 0x86830980, 0xed48322b, 0x70ac1e11, 0x724e6c5a, + 0xfffbfd0e, 0x38560f85, 0xd51e3dae, 0x3927362d, + 0xd9640a0f, 0xa621685c, 0x54d19b5b, 0x2e3a2436, + 0x67b10c0a, 0xe70f9357, 0x96d2b4ee, 0x919e1b9b, + 0xc54f80c0, 0x20a261dc, 0x4b695a77, 0x1a161c12, + 0xba0ae293, 0x2ae5c0a0, 0xe0433c22, 0x171d121b, + 0x0d0b0e09, 0xc7adf28b, 0xa8b92db6, 0xa9c8141e, + 0x198557f1, 0x074caf75, 0xddbbee99, 0x60fda37f, + 0x269ff701, 0xf5bc5c72, 0x3bc54466, 0x7e345bfb, + 0x29768b43, 0xc6dccb23, 0xfc68b6ed, 0xf163b8e4, + 0xdccad731, 0x85104263, 0x22401397, 0x112084c6, + 0x247d854a, 0x3df8d2bb, 0x3211aef9, 0xa16dc729, + 0x2f4b1d9e, 0x30f3dcb2, 0x52ec0d86, 0xe3d077c1, + 0x166c2bb3, 0xb999a970, 0x48fa1194, 0x642247e9, + 0x8cc4a8fc, 0x3f1aa0f0, 0x2cd8567d, 0x90ef2233, + 0x4ec78749, 0xd1c1d938, 0xa2fe8cca, 0x0b3698d4, + 0x81cfa6f5, 0xde28a57a, 0x8e26dab7, 0xbfa43fad, + 0x9de42c3a, 0x920d5078, 0xcc9b6a5f, 0x4662547e, + 0x13c2f68d, 0xb8e890d8, 0xf75e2e39, 0xaff582c3, + 0x80be9f5d, 0x937c69d0, 0x2da96fd5, 0x12b3cf25, + 0x993bc8ac, 0x7da71018, 0x636ee89c, 0xbb7bdb3b, + 0x7809cd26, 0x18f46e59, 0xb701ec9a, 0x9aa8834f, + 0x6e65e695, 0xe67eaaff, 0xcf0821bc, 0xe8e6ef15, + 0x9bd9bae7, 0x36ce4a6f, 0x09d4ea9f, 0x7cd629b0, + 0xb2af31a4, 0x23312a3f, 0x9430c6a5, 0x66c035a2, + 0xbc37744e, 0xcaa6fc82, 0xd0b0e090, 0xd81533a7, + 0x984af104, 0xdaf741ec, 0x500e7fcd, 0xf62f1791, + 0xd68d764d, 0xb04d43ef, 0x4d54ccaa, 0x04dfe496, + 0xb5e39ed1, 0x881b4c6a, 0x1fb8c12c, 0x517f4665, + 0xea049d5e, 0x355d018c, 0x7473fa87, 0x412efb0b, + 0x1d5ab367, 0xd25292db, 0x5633e910, 0x47136dd6, + 0x618c9ad7, 0x0c7a37a1, 0x148e59f8, 0x3c89eb13, + 0x27eecea9, 0xc935b761, 0xe5ede11c, 0xb13c7a47, + 0xdf599cd2, 0x733f55f2, 0xce791814, 0x37bf73c7, + 0xcdea53f7, 0xaa5b5ffd, 0x6f14df3d, 0xdb867844, + 0xf381caaf, 0xc43eb968, 0x342c3824, 0x405fc2a3, + 0xc372161d, 0x250cbce2, 0x498b283c, 0x9541ff0d, + 0x017139a8, 0xb3de080c, 0xe49cd8b4, 0xc1906456, + 0x84617bcb, 0xb670d532, 0x5c74486c, 0x5742d0b8, +}; + +__constant u32 td3[256] = +{ + 0xf4a75051, 0x4165537e, 0x17a4c31a, 0x275e963a, + 0xab6bcb3b, 0x9d45f11f, 0xfa58abac, 0xe303934b, + 0x30fa5520, 0x766df6ad, 0xcc769188, 0x024c25f5, + 0xe5d7fc4f, 0x2acbd7c5, 0x35448026, 0x62a38fb5, + 0xb15a49de, 0xba1b6725, 0xea0e9845, 0xfec0e15d, + 0x2f7502c3, 0x4cf01281, 0x4697a38d, 0xd3f9c66b, + 0x8f5fe703, 0x929c9515, 0x6d7aebbf, 0x5259da95, + 0xbe832dd4, 0x7421d358, 0xe0692949, 0xc9c8448e, + 0xc2896a75, 0x8e7978f4, 0x583e6b99, 0xb971dd27, + 0xe14fb6be, 0x88ad17f0, 0x20ac66c9, 0xce3ab47d, + 0xdf4a1863, 0x1a3182e5, 0x51336097, 0x537f4562, + 0x6477e0b1, 0x6bae84bb, 0x81a01cfe, 0x082b94f9, + 0x48685870, 0x45fd198f, 0xde6c8794, 0x7bf8b752, + 0x73d323ab, 0x4b02e272, 0x1f8f57e3, 0x55ab2a66, + 0xeb2807b2, 0xb5c2032f, 0xc57b9a86, 0x3708a5d3, + 0x2887f230, 0xbfa5b223, 0x036aba02, 0x16825ced, + 0xcf1c2b8a, 0x79b492a7, 0x07f2f0f3, 0x69e2a14e, + 0xdaf4cd65, 0x05bed506, 0x34621fd1, 0xa6fe8ac4, + 0x2e539d34, 0xf355a0a2, 0x8ae13205, 0xf6eb75a4, + 0x83ec390b, 0x60efaa40, 0x719f065e, 0x6e1051bd, + 0x218af93e, 0xdd063d96, 0x3e05aedd, 0xe6bd464d, + 0x548db591, 0xc45d0571, 0x06d46f04, 0x5015ff60, + 0x98fb2419, 0xbde997d6, 0x4043cc89, 0xd99e7767, + 0xe842bdb0, 0x898b8807, 0x195b38e7, 0xc8eedb79, + 0x7c0a47a1, 0x420fe97c, 0x841ec9f8, 0x00000000, + 0x80868309, 0x2bed4832, 0x1170ac1e, 0x5a724e6c, + 0x0efffbfd, 0x8538560f, 0xaed51e3d, 0x2d392736, + 0x0fd9640a, 0x5ca62168, 0x5b54d19b, 0x362e3a24, + 0x0a67b10c, 0x57e70f93, 0xee96d2b4, 0x9b919e1b, + 0xc0c54f80, 0xdc20a261, 0x774b695a, 0x121a161c, + 0x93ba0ae2, 0xa02ae5c0, 0x22e0433c, 0x1b171d12, + 0x090d0b0e, 0x8bc7adf2, 0xb6a8b92d, 0x1ea9c814, + 0xf1198557, 0x75074caf, 0x99ddbbee, 0x7f60fda3, + 0x01269ff7, 0x72f5bc5c, 0x663bc544, 0xfb7e345b, + 0x4329768b, 0x23c6dccb, 0xedfc68b6, 0xe4f163b8, + 0x31dccad7, 0x63851042, 0x97224013, 0xc6112084, + 0x4a247d85, 0xbb3df8d2, 0xf93211ae, 0x29a16dc7, + 0x9e2f4b1d, 0xb230f3dc, 0x8652ec0d, 0xc1e3d077, + 0xb3166c2b, 0x70b999a9, 0x9448fa11, 0xe9642247, + 0xfc8cc4a8, 0xf03f1aa0, 0x7d2cd856, 0x3390ef22, + 0x494ec787, 0x38d1c1d9, 0xcaa2fe8c, 0xd40b3698, + 0xf581cfa6, 0x7ade28a5, 0xb78e26da, 0xadbfa43f, + 0x3a9de42c, 0x78920d50, 0x5fcc9b6a, 0x7e466254, + 0x8d13c2f6, 0xd8b8e890, 0x39f75e2e, 0xc3aff582, + 0x5d80be9f, 0xd0937c69, 0xd52da96f, 0x2512b3cf, + 0xac993bc8, 0x187da710, 0x9c636ee8, 0x3bbb7bdb, + 0x267809cd, 0x5918f46e, 0x9ab701ec, 0x4f9aa883, + 0x956e65e6, 0xffe67eaa, 0xbccf0821, 0x15e8e6ef, + 0xe79bd9ba, 0x6f36ce4a, 0x9f09d4ea, 0xb07cd629, + 0xa4b2af31, 0x3f23312a, 0xa59430c6, 0xa266c035, + 0x4ebc3774, 0x82caa6fc, 0x90d0b0e0, 0xa7d81533, + 0x04984af1, 0xecdaf741, 0xcd500e7f, 0x91f62f17, + 0x4dd68d76, 0xefb04d43, 0xaa4d54cc, 0x9604dfe4, + 0xd1b5e39e, 0x6a881b4c, 0x2c1fb8c1, 0x65517f46, + 0x5eea049d, 0x8c355d01, 0x877473fa, 0x0b412efb, + 0x671d5ab3, 0xdbd25292, 0x105633e9, 0xd647136d, + 0xd7618c9a, 0xa10c7a37, 0xf8148e59, 0x133c89eb, + 0xa927eece, 0x61c935b7, 0x1ce5ede1, 0x47b13c7a, + 0xd2df599c, 0xf2733f55, 0x14ce7918, 0xc737bf73, + 0xf7cdea53, 0xfdaa5b5f, 0x3d6f14df, 0x44db8678, + 0xaff381ca, 0x68c43eb9, 0x24342c38, 0xa3405fc2, + 0x1dc37216, 0xe2250cbc, 0x3c498b28, 0x0d9541ff, + 0xa8017139, 0x0cb3de08, 0xb4e49cd8, 0x56c19064, + 0xcb84617b, 0x32b670d5, 0x6c5c7448, 0xb85742d0, +}; + +__constant u32 td4[256] = +{ + 0x52525252, 0x09090909, 0x6a6a6a6a, 0xd5d5d5d5, + 0x30303030, 0x36363636, 0xa5a5a5a5, 0x38383838, + 0xbfbfbfbf, 0x40404040, 0xa3a3a3a3, 0x9e9e9e9e, + 0x81818181, 0xf3f3f3f3, 0xd7d7d7d7, 0xfbfbfbfb, + 0x7c7c7c7c, 0xe3e3e3e3, 0x39393939, 0x82828282, + 0x9b9b9b9b, 0x2f2f2f2f, 0xffffffff, 0x87878787, + 0x34343434, 0x8e8e8e8e, 0x43434343, 0x44444444, + 0xc4c4c4c4, 0xdededede, 0xe9e9e9e9, 0xcbcbcbcb, + 0x54545454, 0x7b7b7b7b, 0x94949494, 0x32323232, + 0xa6a6a6a6, 0xc2c2c2c2, 0x23232323, 0x3d3d3d3d, + 0xeeeeeeee, 0x4c4c4c4c, 0x95959595, 0x0b0b0b0b, + 0x42424242, 0xfafafafa, 0xc3c3c3c3, 0x4e4e4e4e, + 0x08080808, 0x2e2e2e2e, 0xa1a1a1a1, 0x66666666, + 0x28282828, 0xd9d9d9d9, 0x24242424, 0xb2b2b2b2, + 0x76767676, 0x5b5b5b5b, 0xa2a2a2a2, 0x49494949, + 0x6d6d6d6d, 0x8b8b8b8b, 0xd1d1d1d1, 0x25252525, + 0x72727272, 0xf8f8f8f8, 0xf6f6f6f6, 0x64646464, + 0x86868686, 0x68686868, 0x98989898, 0x16161616, + 0xd4d4d4d4, 0xa4a4a4a4, 0x5c5c5c5c, 0xcccccccc, + 0x5d5d5d5d, 0x65656565, 0xb6b6b6b6, 0x92929292, + 0x6c6c6c6c, 0x70707070, 0x48484848, 0x50505050, + 0xfdfdfdfd, 0xedededed, 0xb9b9b9b9, 0xdadadada, + 0x5e5e5e5e, 0x15151515, 0x46464646, 0x57575757, + 0xa7a7a7a7, 0x8d8d8d8d, 0x9d9d9d9d, 0x84848484, + 0x90909090, 0xd8d8d8d8, 0xabababab, 0x00000000, + 0x8c8c8c8c, 0xbcbcbcbc, 0xd3d3d3d3, 0x0a0a0a0a, + 0xf7f7f7f7, 0xe4e4e4e4, 0x58585858, 0x05050505, + 0xb8b8b8b8, 0xb3b3b3b3, 0x45454545, 0x06060606, + 0xd0d0d0d0, 0x2c2c2c2c, 0x1e1e1e1e, 0x8f8f8f8f, + 0xcacacaca, 0x3f3f3f3f, 0x0f0f0f0f, 0x02020202, + 0xc1c1c1c1, 0xafafafaf, 0xbdbdbdbd, 0x03030303, + 0x01010101, 0x13131313, 0x8a8a8a8a, 0x6b6b6b6b, + 0x3a3a3a3a, 0x91919191, 0x11111111, 0x41414141, + 0x4f4f4f4f, 0x67676767, 0xdcdcdcdc, 0xeaeaeaea, + 0x97979797, 0xf2f2f2f2, 0xcfcfcfcf, 0xcececece, + 0xf0f0f0f0, 0xb4b4b4b4, 0xe6e6e6e6, 0x73737373, + 0x96969696, 0xacacacac, 0x74747474, 0x22222222, + 0xe7e7e7e7, 0xadadadad, 0x35353535, 0x85858585, + 0xe2e2e2e2, 0xf9f9f9f9, 0x37373737, 0xe8e8e8e8, + 0x1c1c1c1c, 0x75757575, 0xdfdfdfdf, 0x6e6e6e6e, + 0x47474747, 0xf1f1f1f1, 0x1a1a1a1a, 0x71717171, + 0x1d1d1d1d, 0x29292929, 0xc5c5c5c5, 0x89898989, + 0x6f6f6f6f, 0xb7b7b7b7, 0x62626262, 0x0e0e0e0e, + 0xaaaaaaaa, 0x18181818, 0xbebebebe, 0x1b1b1b1b, + 0xfcfcfcfc, 0x56565656, 0x3e3e3e3e, 0x4b4b4b4b, + 0xc6c6c6c6, 0xd2d2d2d2, 0x79797979, 0x20202020, + 0x9a9a9a9a, 0xdbdbdbdb, 0xc0c0c0c0, 0xfefefefe, + 0x78787878, 0xcdcdcdcd, 0x5a5a5a5a, 0xf4f4f4f4, + 0x1f1f1f1f, 0xdddddddd, 0xa8a8a8a8, 0x33333333, + 0x88888888, 0x07070707, 0xc7c7c7c7, 0x31313131, + 0xb1b1b1b1, 0x12121212, 0x10101010, 0x59595959, + 0x27272727, 0x80808080, 0xecececec, 0x5f5f5f5f, + 0x60606060, 0x51515151, 0x7f7f7f7f, 0xa9a9a9a9, + 0x19191919, 0xb5b5b5b5, 0x4a4a4a4a, 0x0d0d0d0d, + 0x2d2d2d2d, 0xe5e5e5e5, 0x7a7a7a7a, 0x9f9f9f9f, + 0x93939393, 0xc9c9c9c9, 0x9c9c9c9c, 0xefefefef, + 0xa0a0a0a0, 0xe0e0e0e0, 0x3b3b3b3b, 0x4d4d4d4d, + 0xaeaeaeae, 0x2a2a2a2a, 0xf5f5f5f5, 0xb0b0b0b0, + 0xc8c8c8c8, 0xebebebeb, 0xbbbbbbbb, 0x3c3c3c3c, + 0x83838383, 0x53535353, 0x99999999, 0x61616161, + 0x17171717, 0x2b2b2b2b, 0x04040404, 0x7e7e7e7e, + 0xbabababa, 0x77777777, 0xd6d6d6d6, 0x26262626, + 0xe1e1e1e1, 0x69696969, 0x14141414, 0x63636363, + 0x55555555, 0x21212121, 0x0c0c0c0c, 0x7d7d7d7d, +}; + +__constant u32 rcon[] = +{ + 0x01000000, 0x02000000, 0x04000000, 0x08000000, + 0x10000000, 0x20000000, 0x40000000, 0x80000000, + 0x1b000000, 0x36000000, +}; + +static void AES256_ExpandKey (u32 *userkey, u32 *rek, __local u32 s_te0[256], __local u32 s_te1[256], __local u32 s_te2[256], __local u32 s_te3[256], __local u32 s_te4[256]) +{ + rek[0] = userkey[0]; + rek[1] = userkey[1]; + rek[2] = userkey[2]; + rek[3] = userkey[3]; + rek[4] = userkey[4]; + rek[5] = userkey[5]; + rek[6] = userkey[6]; + rek[7] = userkey[7]; + + int i; + int j; + + i = 0; + j = 0; + + u32 run = 1; + + while (run) + { + u32 temp = rek[j + 7]; + + rek[j + 8] = rek[j + 0] + ^ (s_te2[(temp >> 16) & 0xff] & 0xff000000) + ^ (s_te3[(temp >> 8) & 0xff] & 0x00ff0000) + ^ (s_te0[(temp >> 0) & 0xff] & 0x0000ff00) + ^ (s_te1[(temp >> 24) & 0xff] & 0x000000ff) + ^ rcon[i]; + + rek[j + 9] = rek[j + 1] ^ rek[j + 8]; + rek[j + 10] = rek[j + 2] ^ rek[j + 9]; + rek[j + 11] = rek[j + 3] ^ rek[j + 10]; + + if (++i == 7) + { + run = 0; + continue; + } + + temp = rek[j + 11]; + + rek[j + 12] = rek[j + 4] + ^ (s_te2[(temp >> 24) & 0xff] & 0xff000000) + ^ (s_te3[(temp >> 16) & 0xff] & 0x00ff0000) + ^ (s_te0[(temp >> 8) & 0xff] & 0x0000ff00) + ^ (s_te1[(temp >> 0) & 0xff] & 0x000000ff); + + rek[j + 13] = rek[j + 5] ^ rek[j + 12]; + rek[j + 14] = rek[j + 6] ^ rek[j + 13]; + rek[j + 15] = rek[j + 7] ^ rek[j + 14]; + + j += 8; + } +} + +static void AES256_InvertKey (u32 *rdk, __local u32 s_td0[256], __local u32 s_td1[256], __local u32 s_td2[256], __local u32 s_td3[256], __local u32 s_td4[256], __local u32 s_te0[256], __local u32 s_te1[256], __local u32 s_te2[256], __local u32 s_te3[256], __local u32 s_te4[256]) +{ + for (u32 i = 0, j = 56; i < j; i += 4, j -= 4) + { + u32 temp; + + temp = rdk[i + 0]; rdk[i + 0] = rdk[j + 0]; rdk[j + 0] = temp; + temp = rdk[i + 1]; rdk[i + 1] = rdk[j + 1]; rdk[j + 1] = temp; + temp = rdk[i + 2]; rdk[i + 2] = rdk[j + 2]; rdk[j + 2] = temp; + temp = rdk[i + 3]; rdk[i + 3] = rdk[j + 3]; rdk[j + 3] = temp; + } + + for (u32 i = 1, j = 4; i < 14; i += 1, j += 4) + { + rdk[j + 0] = + s_td0[s_te1[(rdk[j + 0] >> 24) & 0xff] & 0xff] ^ + s_td1[s_te1[(rdk[j + 0] >> 16) & 0xff] & 0xff] ^ + s_td2[s_te1[(rdk[j + 0] >> 8) & 0xff] & 0xff] ^ + s_td3[s_te1[(rdk[j + 0] >> 0) & 0xff] & 0xff]; + + rdk[j + 1] = + s_td0[s_te1[(rdk[j + 1] >> 24) & 0xff] & 0xff] ^ + s_td1[s_te1[(rdk[j + 1] >> 16) & 0xff] & 0xff] ^ + s_td2[s_te1[(rdk[j + 1] >> 8) & 0xff] & 0xff] ^ + s_td3[s_te1[(rdk[j + 1] >> 0) & 0xff] & 0xff]; + + rdk[j + 2] = + s_td0[s_te1[(rdk[j + 2] >> 24) & 0xff] & 0xff] ^ + s_td1[s_te1[(rdk[j + 2] >> 16) & 0xff] & 0xff] ^ + s_td2[s_te1[(rdk[j + 2] >> 8) & 0xff] & 0xff] ^ + s_td3[s_te1[(rdk[j + 2] >> 0) & 0xff] & 0xff]; + + rdk[j + 3] = + s_td0[s_te1[(rdk[j + 3] >> 24) & 0xff] & 0xff] ^ + s_td1[s_te1[(rdk[j + 3] >> 16) & 0xff] & 0xff] ^ + s_td2[s_te1[(rdk[j + 3] >> 8) & 0xff] & 0xff] ^ + s_td3[s_te1[(rdk[j + 3] >> 0) & 0xff] & 0xff]; + } +} + +static void AES256_decrypt (const u32 *in, u32 *out, const u32 *rdk, __local u32 s_td0[256], __local u32 s_td1[256], __local u32 s_td2[256], __local u32 s_td3[256], __local u32 s_td4[256]) +{ + u32 s0 = in[0] ^ rdk[0]; + u32 s1 = in[1] ^ rdk[1]; + u32 s2 = in[2] ^ rdk[2]; + u32 s3 = in[3] ^ rdk[3]; + + u32 t0; + u32 t1; + u32 t2; + u32 t3; + + t0 = s_td0[s0 >> 24] ^ s_td1[(s3 >> 16) & 0xff] ^ s_td2[(s2 >> 8) & 0xff] ^ s_td3[s1 & 0xff] ^ rdk[ 4]; + t1 = s_td0[s1 >> 24] ^ s_td1[(s0 >> 16) & 0xff] ^ s_td2[(s3 >> 8) & 0xff] ^ s_td3[s2 & 0xff] ^ rdk[ 5]; + t2 = s_td0[s2 >> 24] ^ s_td1[(s1 >> 16) & 0xff] ^ s_td2[(s0 >> 8) & 0xff] ^ s_td3[s3 & 0xff] ^ rdk[ 6]; + t3 = s_td0[s3 >> 24] ^ s_td1[(s2 >> 16) & 0xff] ^ s_td2[(s1 >> 8) & 0xff] ^ s_td3[s0 & 0xff] ^ rdk[ 7]; + s0 = s_td0[t0 >> 24] ^ s_td1[(t3 >> 16) & 0xff] ^ s_td2[(t2 >> 8) & 0xff] ^ s_td3[t1 & 0xff] ^ rdk[ 8]; + s1 = s_td0[t1 >> 24] ^ s_td1[(t0 >> 16) & 0xff] ^ s_td2[(t3 >> 8) & 0xff] ^ s_td3[t2 & 0xff] ^ rdk[ 9]; + s2 = s_td0[t2 >> 24] ^ s_td1[(t1 >> 16) & 0xff] ^ s_td2[(t0 >> 8) & 0xff] ^ s_td3[t3 & 0xff] ^ rdk[10]; + s3 = s_td0[t3 >> 24] ^ s_td1[(t2 >> 16) & 0xff] ^ s_td2[(t1 >> 8) & 0xff] ^ s_td3[t0 & 0xff] ^ rdk[11]; + t0 = s_td0[s0 >> 24] ^ s_td1[(s3 >> 16) & 0xff] ^ s_td2[(s2 >> 8) & 0xff] ^ s_td3[s1 & 0xff] ^ rdk[12]; + t1 = s_td0[s1 >> 24] ^ s_td1[(s0 >> 16) & 0xff] ^ s_td2[(s3 >> 8) & 0xff] ^ s_td3[s2 & 0xff] ^ rdk[13]; + t2 = s_td0[s2 >> 24] ^ s_td1[(s1 >> 16) & 0xff] ^ s_td2[(s0 >> 8) & 0xff] ^ s_td3[s3 & 0xff] ^ rdk[14]; + t3 = s_td0[s3 >> 24] ^ s_td1[(s2 >> 16) & 0xff] ^ s_td2[(s1 >> 8) & 0xff] ^ s_td3[s0 & 0xff] ^ rdk[15]; + s0 = s_td0[t0 >> 24] ^ s_td1[(t3 >> 16) & 0xff] ^ s_td2[(t2 >> 8) & 0xff] ^ s_td3[t1 & 0xff] ^ rdk[16]; + s1 = s_td0[t1 >> 24] ^ s_td1[(t0 >> 16) & 0xff] ^ s_td2[(t3 >> 8) & 0xff] ^ s_td3[t2 & 0xff] ^ rdk[17]; + s2 = s_td0[t2 >> 24] ^ s_td1[(t1 >> 16) & 0xff] ^ s_td2[(t0 >> 8) & 0xff] ^ s_td3[t3 & 0xff] ^ rdk[18]; + s3 = s_td0[t3 >> 24] ^ s_td1[(t2 >> 16) & 0xff] ^ s_td2[(t1 >> 8) & 0xff] ^ s_td3[t0 & 0xff] ^ rdk[19]; + t0 = s_td0[s0 >> 24] ^ s_td1[(s3 >> 16) & 0xff] ^ s_td2[(s2 >> 8) & 0xff] ^ s_td3[s1 & 0xff] ^ rdk[20]; + t1 = s_td0[s1 >> 24] ^ s_td1[(s0 >> 16) & 0xff] ^ s_td2[(s3 >> 8) & 0xff] ^ s_td3[s2 & 0xff] ^ rdk[21]; + t2 = s_td0[s2 >> 24] ^ s_td1[(s1 >> 16) & 0xff] ^ s_td2[(s0 >> 8) & 0xff] ^ s_td3[s3 & 0xff] ^ rdk[22]; + t3 = s_td0[s3 >> 24] ^ s_td1[(s2 >> 16) & 0xff] ^ s_td2[(s1 >> 8) & 0xff] ^ s_td3[s0 & 0xff] ^ rdk[23]; + s0 = s_td0[t0 >> 24] ^ s_td1[(t3 >> 16) & 0xff] ^ s_td2[(t2 >> 8) & 0xff] ^ s_td3[t1 & 0xff] ^ rdk[24]; + s1 = s_td0[t1 >> 24] ^ s_td1[(t0 >> 16) & 0xff] ^ s_td2[(t3 >> 8) & 0xff] ^ s_td3[t2 & 0xff] ^ rdk[25]; + s2 = s_td0[t2 >> 24] ^ s_td1[(t1 >> 16) & 0xff] ^ s_td2[(t0 >> 8) & 0xff] ^ s_td3[t3 & 0xff] ^ rdk[26]; + s3 = s_td0[t3 >> 24] ^ s_td1[(t2 >> 16) & 0xff] ^ s_td2[(t1 >> 8) & 0xff] ^ s_td3[t0 & 0xff] ^ rdk[27]; + t0 = s_td0[s0 >> 24] ^ s_td1[(s3 >> 16) & 0xff] ^ s_td2[(s2 >> 8) & 0xff] ^ s_td3[s1 & 0xff] ^ rdk[28]; + t1 = s_td0[s1 >> 24] ^ s_td1[(s0 >> 16) & 0xff] ^ s_td2[(s3 >> 8) & 0xff] ^ s_td3[s2 & 0xff] ^ rdk[29]; + t2 = s_td0[s2 >> 24] ^ s_td1[(s1 >> 16) & 0xff] ^ s_td2[(s0 >> 8) & 0xff] ^ s_td3[s3 & 0xff] ^ rdk[30]; + t3 = s_td0[s3 >> 24] ^ s_td1[(s2 >> 16) & 0xff] ^ s_td2[(s1 >> 8) & 0xff] ^ s_td3[s0 & 0xff] ^ rdk[31]; + s0 = s_td0[t0 >> 24] ^ s_td1[(t3 >> 16) & 0xff] ^ s_td2[(t2 >> 8) & 0xff] ^ s_td3[t1 & 0xff] ^ rdk[32]; + s1 = s_td0[t1 >> 24] ^ s_td1[(t0 >> 16) & 0xff] ^ s_td2[(t3 >> 8) & 0xff] ^ s_td3[t2 & 0xff] ^ rdk[33]; + s2 = s_td0[t2 >> 24] ^ s_td1[(t1 >> 16) & 0xff] ^ s_td2[(t0 >> 8) & 0xff] ^ s_td3[t3 & 0xff] ^ rdk[34]; + s3 = s_td0[t3 >> 24] ^ s_td1[(t2 >> 16) & 0xff] ^ s_td2[(t1 >> 8) & 0xff] ^ s_td3[t0 & 0xff] ^ rdk[35]; + t0 = s_td0[s0 >> 24] ^ s_td1[(s3 >> 16) & 0xff] ^ s_td2[(s2 >> 8) & 0xff] ^ s_td3[s1 & 0xff] ^ rdk[36]; + t1 = s_td0[s1 >> 24] ^ s_td1[(s0 >> 16) & 0xff] ^ s_td2[(s3 >> 8) & 0xff] ^ s_td3[s2 & 0xff] ^ rdk[37]; + t2 = s_td0[s2 >> 24] ^ s_td1[(s1 >> 16) & 0xff] ^ s_td2[(s0 >> 8) & 0xff] ^ s_td3[s3 & 0xff] ^ rdk[38]; + t3 = s_td0[s3 >> 24] ^ s_td1[(s2 >> 16) & 0xff] ^ s_td2[(s1 >> 8) & 0xff] ^ s_td3[s0 & 0xff] ^ rdk[39]; + s0 = s_td0[t0 >> 24] ^ s_td1[(t3 >> 16) & 0xff] ^ s_td2[(t2 >> 8) & 0xff] ^ s_td3[t1 & 0xff] ^ rdk[40]; + s1 = s_td0[t1 >> 24] ^ s_td1[(t0 >> 16) & 0xff] ^ s_td2[(t3 >> 8) & 0xff] ^ s_td3[t2 & 0xff] ^ rdk[41]; + s2 = s_td0[t2 >> 24] ^ s_td1[(t1 >> 16) & 0xff] ^ s_td2[(t0 >> 8) & 0xff] ^ s_td3[t3 & 0xff] ^ rdk[42]; + s3 = s_td0[t3 >> 24] ^ s_td1[(t2 >> 16) & 0xff] ^ s_td2[(t1 >> 8) & 0xff] ^ s_td3[t0 & 0xff] ^ rdk[43]; + t0 = s_td0[s0 >> 24] ^ s_td1[(s3 >> 16) & 0xff] ^ s_td2[(s2 >> 8) & 0xff] ^ s_td3[s1 & 0xff] ^ rdk[44]; + t1 = s_td0[s1 >> 24] ^ s_td1[(s0 >> 16) & 0xff] ^ s_td2[(s3 >> 8) & 0xff] ^ s_td3[s2 & 0xff] ^ rdk[45]; + t2 = s_td0[s2 >> 24] ^ s_td1[(s1 >> 16) & 0xff] ^ s_td2[(s0 >> 8) & 0xff] ^ s_td3[s3 & 0xff] ^ rdk[46]; + t3 = s_td0[s3 >> 24] ^ s_td1[(s2 >> 16) & 0xff] ^ s_td2[(s1 >> 8) & 0xff] ^ s_td3[s0 & 0xff] ^ rdk[47]; + s0 = s_td0[t0 >> 24] ^ s_td1[(t3 >> 16) & 0xff] ^ s_td2[(t2 >> 8) & 0xff] ^ s_td3[t1 & 0xff] ^ rdk[48]; + s1 = s_td0[t1 >> 24] ^ s_td1[(t0 >> 16) & 0xff] ^ s_td2[(t3 >> 8) & 0xff] ^ s_td3[t2 & 0xff] ^ rdk[49]; + s2 = s_td0[t2 >> 24] ^ s_td1[(t1 >> 16) & 0xff] ^ s_td2[(t0 >> 8) & 0xff] ^ s_td3[t3 & 0xff] ^ rdk[50]; + s3 = s_td0[t3 >> 24] ^ s_td1[(t2 >> 16) & 0xff] ^ s_td2[(t1 >> 8) & 0xff] ^ s_td3[t0 & 0xff] ^ rdk[51]; + t0 = s_td0[s0 >> 24] ^ s_td1[(s3 >> 16) & 0xff] ^ s_td2[(s2 >> 8) & 0xff] ^ s_td3[s1 & 0xff] ^ rdk[52]; + t1 = s_td0[s1 >> 24] ^ s_td1[(s0 >> 16) & 0xff] ^ s_td2[(s3 >> 8) & 0xff] ^ s_td3[s2 & 0xff] ^ rdk[53]; + t2 = s_td0[s2 >> 24] ^ s_td1[(s1 >> 16) & 0xff] ^ s_td2[(s0 >> 8) & 0xff] ^ s_td3[s3 & 0xff] ^ rdk[54]; + t3 = s_td0[s3 >> 24] ^ s_td1[(s2 >> 16) & 0xff] ^ s_td2[(s1 >> 8) & 0xff] ^ s_td3[s0 & 0xff] ^ rdk[55]; + + out[0] = (s_td4[(t0 >> 24) & 0xff] & 0xff000000) + ^ (s_td4[(t3 >> 16) & 0xff] & 0x00ff0000) + ^ (s_td4[(t2 >> 8) & 0xff] & 0x0000ff00) + ^ (s_td4[(t1 >> 0) & 0xff] & 0x000000ff) + ^ rdk[56]; + + out[1] = (s_td4[(t1 >> 24) & 0xff] & 0xff000000) + ^ (s_td4[(t0 >> 16) & 0xff] & 0x00ff0000) + ^ (s_td4[(t3 >> 8) & 0xff] & 0x0000ff00) + ^ (s_td4[(t2 >> 0) & 0xff] & 0x000000ff) + ^ rdk[57]; + + out[2] = (s_td4[(t2 >> 24) & 0xff] & 0xff000000) + ^ (s_td4[(t1 >> 16) & 0xff] & 0x00ff0000) + ^ (s_td4[(t0 >> 8) & 0xff] & 0x0000ff00) + ^ (s_td4[(t3 >> 0) & 0xff] & 0x000000ff) + ^ rdk[58]; + + out[3] = (s_td4[(t3 >> 24) & 0xff] & 0xff000000) + ^ (s_td4[(t2 >> 16) & 0xff] & 0x00ff0000) + ^ (s_td4[(t1 >> 8) & 0xff] & 0x0000ff00) + ^ (s_td4[(t0 >> 0) & 0xff] & 0x000000ff) + ^ rdk[59]; +} + +__constant u64 k_sha512[80] = +{ + SHA512C00, SHA512C01, SHA512C02, SHA512C03, + SHA512C04, SHA512C05, SHA512C06, SHA512C07, + SHA512C08, SHA512C09, SHA512C0a, SHA512C0b, + SHA512C0c, SHA512C0d, SHA512C0e, SHA512C0f, + SHA512C10, SHA512C11, SHA512C12, SHA512C13, + SHA512C14, SHA512C15, SHA512C16, SHA512C17, + SHA512C18, SHA512C19, SHA512C1a, SHA512C1b, + SHA512C1c, SHA512C1d, SHA512C1e, SHA512C1f, + SHA512C20, SHA512C21, SHA512C22, SHA512C23, + SHA512C24, SHA512C25, SHA512C26, SHA512C27, + SHA512C28, SHA512C29, SHA512C2a, SHA512C2b, + SHA512C2c, SHA512C2d, SHA512C2e, SHA512C2f, + SHA512C30, SHA512C31, SHA512C32, SHA512C33, + SHA512C34, SHA512C35, SHA512C36, SHA512C37, + SHA512C38, SHA512C39, SHA512C3a, SHA512C3b, + SHA512C3c, SHA512C3d, SHA512C3e, SHA512C3f, + SHA512C40, SHA512C41, SHA512C42, SHA512C43, + SHA512C44, SHA512C45, SHA512C46, SHA512C47, + SHA512C48, SHA512C49, SHA512C4a, SHA512C4b, + SHA512C4c, SHA512C4d, SHA512C4e, SHA512C4f, +}; + +static void sha512_transform (const u64x w[16], u64x dgst[8]) +{ + u64x a = dgst[0]; + u64x b = dgst[1]; + u64x c = dgst[2]; + u64x d = dgst[3]; + u64x e = dgst[4]; + u64x f = dgst[5]; + u64x g = dgst[6]; + u64x h = dgst[7]; + + volatile u64x w0_t = w[ 0]; + volatile u64x w1_t = w[ 1]; + volatile u64x w2_t = w[ 2]; + volatile u64x w3_t = w[ 3]; + volatile u64x w4_t = w[ 4]; + volatile u64x w5_t = w[ 5]; + volatile u64x w6_t = w[ 6]; + volatile u64x w7_t = w[ 7]; + volatile u64x w8_t = w[ 8]; + volatile u64x w9_t = w[ 9]; + volatile u64x wa_t = w[10]; + volatile u64x wb_t = w[11]; + volatile u64x wc_t = w[12]; + volatile u64x wd_t = w[13]; + volatile u64x we_t = w[14]; + volatile u64x wf_t = w[15]; + + #define ROUND_EXPAND() \ + { \ + w0_t = SHA512_EXPAND (we_t, w9_t, w1_t, w0_t); \ + w1_t = SHA512_EXPAND (wf_t, wa_t, w2_t, w1_t); \ + w2_t = SHA512_EXPAND (w0_t, wb_t, w3_t, w2_t); \ + w3_t = SHA512_EXPAND (w1_t, wc_t, w4_t, w3_t); \ + w4_t = SHA512_EXPAND (w2_t, wd_t, w5_t, w4_t); \ + w5_t = SHA512_EXPAND (w3_t, we_t, w6_t, w5_t); \ + w6_t = SHA512_EXPAND (w4_t, wf_t, w7_t, w6_t); \ + w7_t = SHA512_EXPAND (w5_t, w0_t, w8_t, w7_t); \ + w8_t = SHA512_EXPAND (w6_t, w1_t, w9_t, w8_t); \ + w9_t = SHA512_EXPAND (w7_t, w2_t, wa_t, w9_t); \ + wa_t = SHA512_EXPAND (w8_t, w3_t, wb_t, wa_t); \ + wb_t = SHA512_EXPAND (w9_t, w4_t, wc_t, wb_t); \ + wc_t = SHA512_EXPAND (wa_t, w5_t, wd_t, wc_t); \ + wd_t = SHA512_EXPAND (wb_t, w6_t, we_t, wd_t); \ + we_t = SHA512_EXPAND (wc_t, w7_t, wf_t, we_t); \ + wf_t = SHA512_EXPAND (wd_t, w8_t, w0_t, wf_t); \ + } + + #define ROUND_STEP(i) \ + { \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, a, b, c, d, e, f, g, h, w0_t, k_sha512[i + 0]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, h, a, b, c, d, e, f, g, w1_t, k_sha512[i + 1]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, g, h, a, b, c, d, e, f, w2_t, k_sha512[i + 2]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, f, g, h, a, b, c, d, e, w3_t, k_sha512[i + 3]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, e, f, g, h, a, b, c, d, w4_t, k_sha512[i + 4]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, d, e, f, g, h, a, b, c, w5_t, k_sha512[i + 5]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, c, d, e, f, g, h, a, b, w6_t, k_sha512[i + 6]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, b, c, d, e, f, g, h, a, w7_t, k_sha512[i + 7]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, a, b, c, d, e, f, g, h, w8_t, k_sha512[i + 8]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, h, a, b, c, d, e, f, g, w9_t, k_sha512[i + 9]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, g, h, a, b, c, d, e, f, wa_t, k_sha512[i + 10]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, f, g, h, a, b, c, d, e, wb_t, k_sha512[i + 11]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, e, f, g, h, a, b, c, d, wc_t, k_sha512[i + 12]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, d, e, f, g, h, a, b, c, wd_t, k_sha512[i + 13]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, c, d, e, f, g, h, a, b, we_t, k_sha512[i + 14]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, b, c, d, e, f, g, h, a, wf_t, k_sha512[i + 15]); \ + } + + ROUND_STEP (0); + + #pragma unroll + for (int i = 16; i < 80; i += 16) + { + ROUND_EXPAND (); ROUND_STEP (i); + } + + dgst[0] += a; + dgst[1] += b; + dgst[2] += c; + dgst[3] += d; + dgst[4] += e; + dgst[5] += f; + dgst[6] += g; + dgst[7] += h; +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m11300_init (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global bitcoin_wallet_tmp_t *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global bitcoin_wallet_t *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = pws[gid].i[ 8]; + w2[1] = pws[gid].i[ 9]; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[7]; + + u32 salt_buf2[4]; + + salt_buf2[0] = 0; + salt_buf2[1] = 0; + salt_buf2[2] = 0; + salt_buf2[3] = 0; + + u32 salt_buf3[4]; + + salt_buf3[0] = 0; + salt_buf3[1] = 0; + salt_buf3[2] = 0; + salt_buf3[3] = 0; + + u32 salt_len = salt_bufs[salt_pos].salt_len; + + switch_buffer_by_offset (salt_buf0, salt_buf1, salt_buf2, salt_buf3, pw_len); + + w0[0] |= salt_buf0[0]; + w0[1] |= salt_buf0[1]; + w0[2] |= salt_buf0[2]; + w0[3] |= salt_buf0[3]; + + w1[0] |= salt_buf1[0]; + w1[1] |= salt_buf1[1]; + w1[2] |= salt_buf1[2]; + w1[3] |= salt_buf1[3]; + + w2[0] |= salt_buf2[0]; + w2[1] |= salt_buf2[1]; + w2[2] |= salt_buf2[2]; + w2[3] |= salt_buf2[3]; + + w3[0] |= salt_buf3[0]; + w3[1] |= salt_buf3[1]; + w3[2] |= salt_buf3[2]; + w3[3] |= salt_buf3[3]; + + const u32 block_len = pw_len + salt_len; + + /** + * init + */ + + w0[0] = swap_workaround (w0[0]); + w0[1] = swap_workaround (w0[1]); + w0[2] = swap_workaround (w0[2]); + w0[3] = swap_workaround (w0[3]); + w1[0] = swap_workaround (w1[0]); + w1[1] = swap_workaround (w1[1]); + w1[2] = swap_workaround (w1[2]); + w1[3] = swap_workaround (w1[3]); + w2[0] = swap_workaround (w2[0]); + w2[1] = swap_workaround (w2[1]); + w2[2] = swap_workaround (w2[2]); + w2[3] = swap_workaround (w2[3]); + w3[0] = swap_workaround (w3[0]); + w3[1] = swap_workaround (w3[1]); + w3[2] = swap_workaround (w3[2]); + w3[3] = swap_workaround (w3[3]); + + u64x w[16]; + + w[ 0] = hl32_to_64 (w0[0], w0[1]); + w[ 1] = hl32_to_64 (w0[2], w0[3]); + w[ 2] = hl32_to_64 (w1[0], w1[1]); + w[ 3] = hl32_to_64 (w1[2], w1[3]); + w[ 4] = hl32_to_64 (w2[0], w2[1]); + w[ 5] = hl32_to_64 (w2[2], w2[3]); + w[ 6] = hl32_to_64 (w3[0], w3[1]); + w[ 7] = hl32_to_64 (w3[2], w3[3]); + w[ 8] = 0; + w[ 9] = 0; + w[10] = 0; + w[11] = 0; + w[12] = 0; + w[13] = 0; + w[14] = 0; + w[15] = block_len * 8; + + u64x dgst[8]; + + dgst[0] = SHA512M_A; + dgst[1] = SHA512M_B; + dgst[2] = SHA512M_C; + dgst[3] = SHA512M_D; + dgst[4] = SHA512M_E; + dgst[5] = SHA512M_F; + dgst[6] = SHA512M_G; + dgst[7] = SHA512M_H; + + sha512_transform (w, dgst); + + tmps[gid].dgst[0] = dgst[0]; + tmps[gid].dgst[1] = dgst[1]; + tmps[gid].dgst[2] = dgst[2]; + tmps[gid].dgst[3] = dgst[3]; + tmps[gid].dgst[4] = dgst[4]; + tmps[gid].dgst[5] = dgst[5]; + tmps[gid].dgst[6] = dgst[6]; + tmps[gid].dgst[7] = dgst[7]; +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m11300_loop (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global bitcoin_wallet_tmp_t *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global bitcoin_wallet_t *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u64x dgst[8]; + + dgst[0] = tmps[gid].dgst[0]; + dgst[1] = tmps[gid].dgst[1]; + dgst[2] = tmps[gid].dgst[2]; + dgst[3] = tmps[gid].dgst[3]; + dgst[4] = tmps[gid].dgst[4]; + dgst[5] = tmps[gid].dgst[5]; + dgst[6] = tmps[gid].dgst[6]; + dgst[7] = tmps[gid].dgst[7]; + + u64x w[16]; + + w[ 0] = dgst[0]; + w[ 1] = dgst[1]; + w[ 2] = dgst[2]; + w[ 3] = dgst[3]; + w[ 4] = dgst[4]; + w[ 5] = dgst[5]; + w[ 6] = dgst[6]; + w[ 7] = dgst[7]; + w[ 8] = 0x8000000000000000; + w[ 9] = 0; + w[10] = 0; + w[11] = 0; + w[12] = 0; + w[13] = 0; + w[14] = 0; + w[15] = 64 * 8; + + for (u32 i = 0; i < loop_cnt; i++) + { + w[0] = dgst[0]; + w[1] = dgst[1]; + w[2] = dgst[2]; + w[3] = dgst[3]; + w[4] = dgst[4]; + w[5] = dgst[5]; + w[6] = dgst[6]; + w[7] = dgst[7]; + + dgst[0] = SHA512M_A; + dgst[1] = SHA512M_B; + dgst[2] = SHA512M_C; + dgst[3] = SHA512M_D; + dgst[4] = SHA512M_E; + dgst[5] = SHA512M_F; + dgst[6] = SHA512M_G; + dgst[7] = SHA512M_H; + + sha512_transform (w, dgst); + } + + tmps[gid].dgst[0] = dgst[0]; + tmps[gid].dgst[1] = dgst[1]; + tmps[gid].dgst[2] = dgst[2]; + tmps[gid].dgst[3] = dgst[3]; + tmps[gid].dgst[4] = dgst[4]; + tmps[gid].dgst[5] = dgst[5]; + tmps[gid].dgst[6] = dgst[6]; + tmps[gid].dgst[7] = dgst[7]; +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m11300_comp (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global bitcoin_wallet_tmp_t *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global bitcoin_wallet_t *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + const u32 lid = get_local_id (0); + + /** + * aes shared + */ + + const u32 lid4 = lid * 4; + + __local u32 s_td0[256]; + __local u32 s_td1[256]; + __local u32 s_td2[256]; + __local u32 s_td3[256]; + __local u32 s_td4[256]; + + __local u32 s_te0[256]; + __local u32 s_te1[256]; + __local u32 s_te2[256]; + __local u32 s_te3[256]; + __local u32 s_te4[256]; + + s_td0[lid4 + 0] = td0[lid4 + 0]; + s_td0[lid4 + 1] = td0[lid4 + 1]; + s_td0[lid4 + 2] = td0[lid4 + 2]; + s_td0[lid4 + 3] = td0[lid4 + 3]; + + s_td1[lid4 + 0] = td1[lid4 + 0]; + s_td1[lid4 + 1] = td1[lid4 + 1]; + s_td1[lid4 + 2] = td1[lid4 + 2]; + s_td1[lid4 + 3] = td1[lid4 + 3]; + + s_td2[lid4 + 0] = td2[lid4 + 0]; + s_td2[lid4 + 1] = td2[lid4 + 1]; + s_td2[lid4 + 2] = td2[lid4 + 2]; + s_td2[lid4 + 3] = td2[lid4 + 3]; + + s_td3[lid4 + 0] = td3[lid4 + 0]; + s_td3[lid4 + 1] = td3[lid4 + 1]; + s_td3[lid4 + 2] = td3[lid4 + 2]; + s_td3[lid4 + 3] = td3[lid4 + 3]; + + s_td4[lid4 + 0] = td4[lid4 + 0]; + s_td4[lid4 + 1] = td4[lid4 + 1]; + s_td4[lid4 + 2] = td4[lid4 + 2]; + s_td4[lid4 + 3] = td4[lid4 + 3]; + + s_te0[lid4 + 0] = te0[lid4 + 0]; + s_te0[lid4 + 1] = te0[lid4 + 1]; + s_te0[lid4 + 2] = te0[lid4 + 2]; + s_te0[lid4 + 3] = te0[lid4 + 3]; + + s_te1[lid4 + 0] = te1[lid4 + 0]; + s_te1[lid4 + 1] = te1[lid4 + 1]; + s_te1[lid4 + 2] = te1[lid4 + 2]; + s_te1[lid4 + 3] = te1[lid4 + 3]; + + s_te2[lid4 + 0] = te2[lid4 + 0]; + s_te2[lid4 + 1] = te2[lid4 + 1]; + s_te2[lid4 + 2] = te2[lid4 + 2]; + s_te2[lid4 + 3] = te2[lid4 + 3]; + + s_te3[lid4 + 0] = te3[lid4 + 0]; + s_te3[lid4 + 1] = te3[lid4 + 1]; + s_te3[lid4 + 2] = te3[lid4 + 2]; + s_te3[lid4 + 3] = te3[lid4 + 3]; + + s_te4[lid4 + 0] = te4[lid4 + 0]; + s_te4[lid4 + 1] = te4[lid4 + 1]; + s_te4[lid4 + 2] = te4[lid4 + 2]; + s_te4[lid4 + 3] = te4[lid4 + 3]; + + barrier (CLK_LOCAL_MEM_FENCE); + + if (gid >= gid_max) return; + + /** + * real code + */ + + u64 dgst[8]; + + dgst[0] = tmps[gid].dgst[0]; + dgst[1] = tmps[gid].dgst[1]; + dgst[2] = tmps[gid].dgst[2]; + dgst[3] = tmps[gid].dgst[3]; + dgst[4] = tmps[gid].dgst[4]; + dgst[5] = tmps[gid].dgst[5]; + dgst[6] = tmps[gid].dgst[6]; + dgst[7] = tmps[gid].dgst[7]; + + u32x key[8]; + + key[0] = h32_from_64 (dgst[0]); + key[1] = l32_from_64 (dgst[0]); + key[2] = h32_from_64 (dgst[1]); + key[3] = l32_from_64 (dgst[1]); + key[4] = h32_from_64 (dgst[2]); + key[5] = l32_from_64 (dgst[2]); + key[6] = h32_from_64 (dgst[3]); + key[7] = l32_from_64 (dgst[3]); + + u32x iv[4]; + + iv[0] = h32_from_64 (dgst[4]); + iv[1] = l32_from_64 (dgst[4]); + iv[2] = h32_from_64 (dgst[5]); + iv[3] = l32_from_64 (dgst[5]); + + #define KEYLEN 60 + + u32 rk[KEYLEN]; + + AES256_ExpandKey (key, rk, s_te0, s_te1, s_te2, s_te3, s_te4); + + AES256_InvertKey (rk, s_td0, s_td1, s_td2, s_td3, s_td4, s_te0, s_te1, s_te2, s_te3, s_te4); + + u32x out[4]; + + for (u32 i = 0; i < esalt_bufs[salt_pos].cry_master_len; i += 16) + { + u32x data[4]; + + data[0] = swap_workaround (esalt_bufs[salt_pos].cry_master_buf[(i / 4) + 0]); + data[1] = swap_workaround (esalt_bufs[salt_pos].cry_master_buf[(i / 4) + 1]); + data[2] = swap_workaround (esalt_bufs[salt_pos].cry_master_buf[(i / 4) + 2]); + data[3] = swap_workaround (esalt_bufs[salt_pos].cry_master_buf[(i / 4) + 3]); + + AES256_decrypt (data, out, rk, s_td0, s_td1, s_td2, s_td3, s_td4); + + out[0] ^= iv[0]; + out[1] ^= iv[1]; + out[2] ^= iv[2]; + out[3] ^= iv[3]; + + iv[0] = data[0]; + iv[1] = data[1]; + iv[2] = data[2]; + iv[3] = data[3]; + } + + if ((out[0] == 0x10101010) + && (out[1] == 0x10101010) + && (out[2] == 0x10101010) + && (out[3] == 0x10101010)) + { + mark_hash_s0 (plains_buf, hashes_shown, digests_offset + 0, gid, 0); + + d_return_buf[lid] = 1; + } +} diff --git a/amd/m11400_a0.cl b/amd/m11400_a0.cl new file mode 100644 index 0000000000..08b28ae98d --- /dev/null +++ b/amd/m11400_a0.cl @@ -0,0 +1,2394 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _MD5_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW4 +#define VECT_SIZE4 +#endif + +#ifdef VLIW5 +#define VECT_SIZE4 +#endif + +#define DGST_R0 0 +#define DGST_R1 3 +#define DGST_R2 2 +#define DGST_R3 1 + +#include "include/kernel_functions.c" +#include "types_amd.c" +#include "common_amd.c" +#include "include/rp_gpu.h" +#include "rp_amd.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +#ifdef VECT_SIZE1 +#define uint_to_hex_lower8(i) l_bin2asc[(i)] +#endif + +#ifdef VECT_SIZE2 +#define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1]) +#endif + +#ifdef VECT_SIZE4 +#define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3]) +#endif + +static u32 memcat32 (u32x block0[16], u32x block1[16], const u32 block_len, const u32x append0[4], const u32x append1[4], const u32x append2[4], const u32x append3[4], const u32 append_len) +{ + const u32 mod = block_len & 3; + const u32 div = block_len / 4; + + const int offset_minus_4 = 4 - mod; + + u32x append0_t[4]; + + append0_t[0] = amd_bytealign (append0[0], 0, offset_minus_4); + append0_t[1] = amd_bytealign (append0[1], append0[0], offset_minus_4); + append0_t[2] = amd_bytealign (append0[2], append0[1], offset_minus_4); + append0_t[3] = amd_bytealign (append0[3], append0[2], offset_minus_4); + + u32x append1_t[4]; + + append1_t[0] = amd_bytealign (append1[0], append0[3], offset_minus_4); + append1_t[1] = amd_bytealign (append1[1], append1[0], offset_minus_4); + append1_t[2] = amd_bytealign (append1[2], append1[1], offset_minus_4); + append1_t[3] = amd_bytealign (append1[3], append1[2], offset_minus_4); + + u32x append2_t[4]; + + append2_t[0] = amd_bytealign (append2[0], append1[3], offset_minus_4); + append2_t[1] = amd_bytealign (append2[1], append2[0], offset_minus_4); + append2_t[2] = amd_bytealign (append2[2], append2[1], offset_minus_4); + append2_t[3] = amd_bytealign (append2[3], append2[2], offset_minus_4); + + u32x append3_t[4]; + + append3_t[0] = amd_bytealign (append3[0], append2[3], offset_minus_4); + append3_t[1] = amd_bytealign (append3[1], append3[0], offset_minus_4); + append3_t[2] = amd_bytealign (append3[2], append3[1], offset_minus_4); + append3_t[3] = amd_bytealign (append3[3], append3[2], offset_minus_4); + + u32x append4_t[4]; + + append4_t[0] = amd_bytealign ( 0, append3[3], offset_minus_4); + append4_t[1] = 0; + append4_t[2] = 0; + append4_t[3] = 0; + + if (mod == 0) + { + append0_t[0] = append0[0]; + append0_t[1] = append0[1]; + append0_t[2] = append0[2]; + append0_t[3] = append0[3]; + + append1_t[0] = append1[0]; + append1_t[1] = append1[1]; + append1_t[2] = append1[2]; + append1_t[3] = append1[3]; + + append2_t[0] = append2[0]; + append2_t[1] = append2[1]; + append2_t[2] = append2[2]; + append2_t[3] = append2[3]; + + append3_t[0] = append3[0]; + append3_t[1] = append3[1]; + append3_t[2] = append3[2]; + append3_t[3] = append3[3]; + + append4_t[0] = 0; + append4_t[1] = 0; + append4_t[2] = 0; + append4_t[3] = 0; + } + + switch (div) + { + case 0: block0[ 0] |= append0_t[0]; + block0[ 1] = append0_t[1]; + block0[ 2] = append0_t[2]; + block0[ 3] = append0_t[3]; + + block0[ 4] = append1_t[0]; + block0[ 5] = append1_t[1]; + block0[ 6] = append1_t[2]; + block0[ 7] = append1_t[3]; + + block0[ 8] = append2_t[0]; + block0[ 9] = append2_t[1]; + block0[10] = append2_t[2]; + block0[11] = append2_t[3]; + + block0[12] = append3_t[0]; + block0[13] = append3_t[1]; + block0[14] = append3_t[2]; + block0[15] = append3_t[3]; + + block1[ 0] = append4_t[0]; + block1[ 1] = append4_t[1]; + block1[ 2] = append4_t[2]; + block1[ 3] = append4_t[3]; + break; + + case 1: block0[ 1] |= append0_t[0]; + block0[ 2] = append0_t[1]; + block0[ 3] = append0_t[2]; + block0[ 4] = append0_t[3]; + + block0[ 5] = append1_t[0]; + block0[ 6] = append1_t[1]; + block0[ 7] = append1_t[2]; + block0[ 8] = append1_t[3]; + + block0[ 9] = append2_t[0]; + block0[10] = append2_t[1]; + block0[11] = append2_t[2]; + block0[12] = append2_t[3]; + + block0[13] = append3_t[0]; + block0[14] = append3_t[1]; + block0[15] = append3_t[2]; + block1[ 0] = append3_t[3]; + + block1[ 1] = append4_t[0]; + block1[ 2] = append4_t[1]; + block1[ 3] = append4_t[2]; + block1[ 4] = append4_t[3]; + break; + + case 2: block0[ 2] |= append0_t[0]; + block0[ 3] = append0_t[1]; + block0[ 4] = append0_t[2]; + block0[ 5] = append0_t[3]; + + block0[ 6] = append1_t[0]; + block0[ 7] = append1_t[1]; + block0[ 8] = append1_t[2]; + block0[ 9] = append1_t[3]; + + block0[10] = append2_t[0]; + block0[11] = append2_t[1]; + block0[12] = append2_t[2]; + block0[13] = append2_t[3]; + + block0[14] = append3_t[0]; + block0[15] = append3_t[1]; + block1[ 0] = append3_t[2]; + block1[ 1] = append3_t[3]; + + block1[ 2] = append4_t[0]; + block1[ 3] = append4_t[1]; + block1[ 4] = append4_t[2]; + block1[ 5] = append4_t[3]; + break; + + case 3: block0[ 3] |= append0_t[0]; + block0[ 4] = append0_t[1]; + block0[ 5] = append0_t[2]; + block0[ 6] = append0_t[3]; + + block0[ 7] = append1_t[0]; + block0[ 8] = append1_t[1]; + block0[ 9] = append1_t[2]; + block0[10] = append1_t[3]; + + block0[11] = append2_t[0]; + block0[12] = append2_t[1]; + block0[13] = append2_t[2]; + block0[14] = append2_t[3]; + + block0[15] = append3_t[0]; + block1[ 0] = append3_t[1]; + block1[ 1] = append3_t[2]; + block1[ 2] = append3_t[3]; + + block1[ 3] = append4_t[0]; + block1[ 4] = append4_t[1]; + block1[ 5] = append4_t[2]; + block1[ 6] = append4_t[3]; + break; + + case 4: block0[ 4] |= append0_t[0]; + block0[ 5] = append0_t[1]; + block0[ 6] = append0_t[2]; + block0[ 7] = append0_t[3]; + + block0[ 8] = append1_t[0]; + block0[ 9] = append1_t[1]; + block0[10] = append1_t[2]; + block0[11] = append1_t[3]; + + block0[12] = append2_t[0]; + block0[13] = append2_t[1]; + block0[14] = append2_t[2]; + block0[15] = append2_t[3]; + + block1[ 0] = append3_t[0]; + block1[ 1] = append3_t[1]; + block1[ 2] = append3_t[2]; + block1[ 3] = append3_t[3]; + + block1[ 4] = append4_t[0]; + block1[ 5] = append4_t[1]; + block1[ 6] = append4_t[2]; + block1[ 7] = append4_t[3]; + break; + + case 5: block0[ 5] |= append0_t[0]; + block0[ 6] = append0_t[1]; + block0[ 7] = append0_t[2]; + block0[ 8] = append0_t[3]; + + block0[ 9] = append1_t[0]; + block0[10] = append1_t[1]; + block0[11] = append1_t[2]; + block0[12] = append1_t[3]; + + block0[13] = append2_t[0]; + block0[14] = append2_t[1]; + block0[15] = append2_t[2]; + block1[ 0] = append2_t[3]; + + block1[ 1] = append3_t[0]; + block1[ 2] = append3_t[1]; + block1[ 3] = append3_t[2]; + block1[ 4] = append3_t[3]; + + block1[ 5] = append4_t[0]; + block1[ 6] = append4_t[1]; + block1[ 7] = append4_t[2]; + block1[ 8] = append4_t[3]; + break; + + case 6: block0[ 6] |= append0_t[0]; + block0[ 7] = append0_t[1]; + block0[ 8] = append0_t[2]; + block0[ 9] = append0_t[3]; + + block0[10] = append1_t[0]; + block0[11] = append1_t[1]; + block0[12] = append1_t[2]; + block0[13] = append1_t[3]; + + block0[14] = append2_t[0]; + block0[15] = append2_t[1]; + block1[ 0] = append2_t[2]; + block1[ 1] = append2_t[3]; + + block1[ 2] = append3_t[0]; + block1[ 3] = append3_t[1]; + block1[ 4] = append3_t[2]; + block1[ 5] = append3_t[3]; + + block1[ 6] = append4_t[0]; + block1[ 7] = append4_t[1]; + block1[ 8] = append4_t[2]; + block1[ 9] = append4_t[3]; + break; + + case 7: block0[ 7] |= append0_t[0]; + block0[ 8] = append0_t[1]; + block0[ 9] = append0_t[2]; + block0[10] = append0_t[3]; + + block0[11] = append1_t[0]; + block0[12] = append1_t[1]; + block0[13] = append1_t[2]; + block0[14] = append1_t[3]; + + block0[15] = append2_t[0]; + block1[ 0] = append2_t[1]; + block1[ 1] = append2_t[2]; + block1[ 2] = append2_t[3]; + + block1[ 3] = append3_t[0]; + block1[ 4] = append3_t[1]; + block1[ 5] = append3_t[2]; + block1[ 6] = append3_t[3]; + + block1[ 7] = append4_t[0]; + block1[ 8] = append4_t[1]; + block1[ 9] = append4_t[2]; + block1[10] = append4_t[3]; + break; + + case 8: block0[ 8] |= append0_t[0]; + block0[ 9] = append0_t[1]; + block0[10] = append0_t[2]; + block0[11] = append0_t[3]; + + block0[12] = append1_t[0]; + block0[13] = append1_t[1]; + block0[14] = append1_t[2]; + block0[15] = append1_t[3]; + + block1[ 0] = append2_t[0]; + block1[ 1] = append2_t[1]; + block1[ 2] = append2_t[2]; + block1[ 3] = append2_t[3]; + + block1[ 4] = append3_t[0]; + block1[ 5] = append3_t[1]; + block1[ 6] = append3_t[2]; + block1[ 7] = append3_t[3]; + + block1[ 8] = append4_t[0]; + block1[ 9] = append4_t[1]; + block1[10] = append4_t[2]; + block1[11] = append4_t[3]; + break; + + case 9: block0[ 9] |= append0_t[0]; + block0[10] = append0_t[1]; + block0[11] = append0_t[2]; + block0[12] = append0_t[3]; + + block0[13] = append1_t[0]; + block0[14] = append1_t[1]; + block0[15] = append1_t[2]; + block1[ 0] = append1_t[3]; + + block1[ 1] = append2_t[0]; + block1[ 2] = append2_t[1]; + block1[ 3] = append2_t[2]; + block1[ 4] = append2_t[3]; + + block1[ 5] = append3_t[0]; + block1[ 6] = append3_t[1]; + block1[ 7] = append3_t[2]; + block1[ 8] = append3_t[3]; + + block1[ 9] = append4_t[0]; + block1[10] = append4_t[1]; + block1[11] = append4_t[2]; + block1[12] = append4_t[3]; + break; + + case 10: block0[10] |= append0_t[0]; + block0[11] = append0_t[1]; + block0[12] = append0_t[2]; + block0[13] = append0_t[3]; + + block0[14] = append1_t[0]; + block0[15] = append1_t[1]; + block1[ 0] = append1_t[2]; + block1[ 1] = append1_t[3]; + + block1[ 2] = append2_t[0]; + block1[ 3] = append2_t[1]; + block1[ 4] = append2_t[2]; + block1[ 5] = append2_t[3]; + + block1[ 6] = append3_t[0]; + block1[ 7] = append3_t[1]; + block1[ 8] = append3_t[2]; + block1[ 9] = append3_t[3]; + + block1[10] = append4_t[0]; + block1[11] = append4_t[1]; + block1[12] = append4_t[2]; + block1[13] = append4_t[3]; + break; + + case 11: block0[11] |= append0_t[0]; + block0[12] = append0_t[1]; + block0[13] = append0_t[2]; + block0[14] = append0_t[3]; + + block0[15] = append1_t[0]; + block1[ 0] = append1_t[1]; + block1[ 1] = append1_t[2]; + block1[ 2] = append1_t[3]; + + block1[ 3] = append2_t[0]; + block1[ 4] = append2_t[1]; + block1[ 5] = append2_t[2]; + block1[ 6] = append2_t[3]; + + block1[ 7] = append3_t[0]; + block1[ 8] = append3_t[1]; + block1[ 9] = append3_t[2]; + block1[10] = append3_t[3]; + + block1[11] = append4_t[0]; + block1[12] = append4_t[1]; + block1[13] = append4_t[2]; + block1[14] = append4_t[3]; + break; + + case 12: block0[12] |= append0_t[0]; + block0[13] = append0_t[1]; + block0[14] = append0_t[2]; + block0[15] = append0_t[3]; + + block1[ 0] = append1_t[0]; + block1[ 1] = append1_t[1]; + block1[ 2] = append1_t[2]; + block1[ 3] = append1_t[3]; + + block1[ 4] = append2_t[0]; + block1[ 5] = append2_t[1]; + block1[ 6] = append2_t[2]; + block1[ 7] = append2_t[3]; + + block1[ 8] = append3_t[0]; + block1[ 9] = append3_t[1]; + block1[10] = append3_t[2]; + block1[11] = append3_t[3]; + + block1[12] = append4_t[0]; + block1[13] = append4_t[1]; + block1[14] = append4_t[2]; + block1[15] = append4_t[3]; + break; + + case 13: block0[13] |= append0_t[0]; + block0[14] = append0_t[1]; + block0[15] = append0_t[2]; + block1[ 0] = append0_t[3]; + + block1[ 1] = append1_t[0]; + block1[ 2] = append1_t[1]; + block1[ 3] = append1_t[2]; + block1[ 4] = append1_t[3]; + + block1[ 5] = append2_t[0]; + block1[ 6] = append2_t[1]; + block1[ 7] = append2_t[2]; + block1[ 8] = append2_t[3]; + + block1[ 9] = append3_t[0]; + block1[10] = append3_t[1]; + block1[11] = append3_t[2]; + block1[12] = append3_t[3]; + + block1[13] = append4_t[0]; + block1[14] = append4_t[1]; + block1[15] = append4_t[2]; + break; + + case 14: block0[14] |= append0_t[0]; + block0[15] = append0_t[1]; + block1[ 0] = append0_t[2]; + block1[ 1] = append0_t[3]; + + block1[ 2] = append1_t[0]; + block1[ 3] = append1_t[1]; + block1[ 4] = append1_t[2]; + block1[ 5] = append1_t[3]; + + block1[ 6] = append2_t[0]; + block1[ 7] = append2_t[1]; + block1[ 8] = append2_t[2]; + block1[ 9] = append2_t[3]; + + block1[10] = append3_t[0]; + block1[11] = append3_t[1]; + block1[12] = append3_t[2]; + block1[13] = append3_t[3]; + + block1[14] = append4_t[0]; + block1[15] = append4_t[1]; + break; + + case 15: block0[15] |= append0_t[0]; + block1[ 0] = append0_t[1]; + block1[ 1] = append0_t[2]; + block1[ 2] = append0_t[3]; + + block1[ 3] = append1_t[1]; + block1[ 4] = append1_t[2]; + block1[ 5] = append1_t[3]; + block1[ 6] = append1_t[0]; + + block1[ 7] = append2_t[0]; + block1[ 8] = append2_t[1]; + block1[ 9] = append2_t[2]; + block1[10] = append2_t[3]; + + block1[11] = append3_t[0]; + block1[12] = append3_t[1]; + block1[13] = append3_t[2]; + block1[14] = append3_t[3]; + + block1[15] = append4_t[0]; + break; + + case 16: block1[ 0] |= append0_t[0]; + block1[ 1] = append0_t[1]; + block1[ 2] = append0_t[2]; + block1[ 3] = append0_t[3]; + + block1[ 4] = append1_t[0]; + block1[ 5] = append1_t[1]; + block1[ 6] = append1_t[2]; + block1[ 7] = append1_t[3]; + + block1[ 8] = append2_t[0]; + block1[ 9] = append2_t[1]; + block1[10] = append2_t[2]; + block1[11] = append2_t[3]; + + block1[12] = append3_t[0]; + block1[13] = append3_t[1]; + block1[14] = append3_t[2]; + block1[15] = append3_t[3]; + break; + + case 17: block1[ 1] |= append0_t[0]; + block1[ 2] = append0_t[1]; + block1[ 3] = append0_t[2]; + block1[ 4] = append0_t[3]; + + block1[ 5] = append1_t[0]; + block1[ 6] = append1_t[1]; + block1[ 7] = append1_t[2]; + block1[ 8] = append1_t[3]; + + block1[ 9] = append2_t[0]; + block1[10] = append2_t[1]; + block1[11] = append2_t[2]; + block1[12] = append2_t[3]; + + block1[13] = append3_t[0]; + block1[14] = append3_t[1]; + block1[15] = append3_t[2]; + break; + + case 18: block1[ 2] |= append0_t[0]; + block1[ 3] = append0_t[1]; + block1[ 4] = append0_t[2]; + block1[ 5] = append0_t[3]; + + block1[ 6] = append1_t[0]; + block1[ 7] = append1_t[1]; + block1[ 8] = append1_t[2]; + block1[ 9] = append1_t[3]; + + block1[10] = append2_t[0]; + block1[11] = append2_t[1]; + block1[12] = append2_t[2]; + block1[13] = append2_t[3]; + + block1[14] = append3_t[0]; + block1[15] = append3_t[1]; + break; + + case 19: block1[ 3] |= append0_t[0]; + block1[ 4] = append0_t[1]; + block1[ 5] = append0_t[2]; + block1[ 6] = append0_t[3]; + + block1[ 7] = append1_t[0]; + block1[ 8] = append1_t[1]; + block1[ 9] = append1_t[2]; + block1[10] = append1_t[3]; + + block1[11] = append2_t[0]; + block1[12] = append2_t[1]; + block1[13] = append2_t[2]; + block1[14] = append2_t[3]; + + block1[15] = append3_t[0]; + break; + + case 20: block1[ 4] |= append0_t[0]; + block1[ 5] = append0_t[1]; + block1[ 6] = append0_t[2]; + block1[ 7] = append0_t[3]; + + block1[ 8] = append1_t[0]; + block1[ 9] = append1_t[1]; + block1[10] = append1_t[2]; + block1[11] = append1_t[3]; + + block1[12] = append2_t[0]; + block1[13] = append2_t[1]; + block1[14] = append2_t[2]; + block1[15] = append2_t[3]; + break; + + case 21: block1[ 5] |= append0_t[0]; + block1[ 6] = append0_t[1]; + block1[ 7] = append0_t[2]; + block1[ 8] = append0_t[3]; + + block1[ 9] = append1_t[0]; + block1[10] = append1_t[1]; + block1[11] = append1_t[2]; + block1[12] = append1_t[3]; + + block1[13] = append2_t[0]; + block1[14] = append2_t[1]; + block1[15] = append2_t[2]; + break; + + case 22: block1[ 6] |= append0_t[0]; + block1[ 7] = append0_t[1]; + block1[ 8] = append0_t[2]; + block1[ 9] = append0_t[3]; + + block1[10] = append1_t[0]; + block1[11] = append1_t[1]; + block1[12] = append1_t[2]; + block1[13] = append1_t[3]; + + block1[14] = append2_t[0]; + block1[15] = append2_t[1]; + break; + + case 23: block1[ 7] |= append0_t[0]; + block1[ 8] = append0_t[1]; + block1[ 9] = append0_t[2]; + block1[10] = append0_t[3]; + + block1[11] = append1_t[0]; + block1[12] = append1_t[1]; + block1[13] = append1_t[2]; + block1[14] = append1_t[3]; + + block1[15] = append2_t[0]; + break; + + case 24: block1[ 8] |= append0_t[0]; + block1[ 9] = append0_t[1]; + block1[10] = append0_t[2]; + block1[11] = append0_t[3]; + + block1[12] = append1_t[0]; + block1[13] = append1_t[1]; + block1[14] = append1_t[2]; + block1[15] = append1_t[3]; + break; + + case 25: block1[ 9] |= append0_t[0]; + block1[10] = append0_t[1]; + block1[11] = append0_t[2]; + block1[12] = append0_t[3]; + + block1[13] = append1_t[0]; + block1[14] = append1_t[1]; + block1[15] = append1_t[2]; + break; + + case 26: block1[10] |= append0_t[0]; + block1[11] = append0_t[1]; + block1[12] = append0_t[2]; + block1[13] = append0_t[3]; + + block1[14] = append1_t[0]; + block1[15] = append1_t[1]; + break; + + case 27: block1[11] |= append0_t[0]; + block1[12] = append0_t[1]; + block1[13] = append0_t[2]; + block1[14] = append0_t[3]; + + block1[15] = append1_t[0]; + break; + + case 28: block1[12] |= append0_t[0]; + block1[13] = append0_t[1]; + block1[14] = append0_t[2]; + block1[15] = append0_t[3]; + break; + + case 29: block1[13] |= append0_t[0]; + block1[14] = append0_t[1]; + block1[15] = append0_t[2]; + break; + + case 30: block1[14] |= append0_t[0]; + block1[15] = append0_t[1]; + break; + } + + u32 new_len = block_len + append_len; + + return new_len; +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m11400_m04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global sip_t *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + u32x pw_buf1[4]; + + pw_buf1[0] = pws[gid].i[ 4]; + pw_buf1[1] = pws[gid].i[ 5]; + pw_buf1[2] = pws[gid].i[ 6]; + pw_buf1[3] = pws[gid].i[ 7]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * bin2asc table + */ + + __local u32 l_bin2asc[256]; + + const u32 lid4 = lid * 4; + + const u32 lid40 = lid4 + 0; + const u32 lid41 = lid4 + 1; + const u32 lid42 = lid4 + 2; + const u32 lid43 = lid4 + 3; + + const u32 v400 = (lid40 >> 0) & 15; + const u32 v401 = (lid40 >> 4) & 15; + const u32 v410 = (lid41 >> 0) & 15; + const u32 v411 = (lid41 >> 4) & 15; + const u32 v420 = (lid42 >> 0) & 15; + const u32 v421 = (lid42 >> 4) & 15; + const u32 v430 = (lid43 >> 0) & 15; + const u32 v431 = (lid43 >> 4) & 15; + + l_bin2asc[lid40] = ((v400 < 10) ? '0' + v400 : 'a' - 10 + v400) << 8 + | ((v401 < 10) ? '0' + v401 : 'a' - 10 + v401) << 0; + l_bin2asc[lid41] = ((v410 < 10) ? '0' + v410 : 'a' - 10 + v410) << 8 + | ((v411 < 10) ? '0' + v411 : 'a' - 10 + v411) << 0; + l_bin2asc[lid42] = ((v420 < 10) ? '0' + v420 : 'a' - 10 + v420) << 8 + | ((v421 < 10) ? '0' + v421 : 'a' - 10 + v421) << 0; + l_bin2asc[lid43] = ((v430 < 10) ? '0' + v430 : 'a' - 10 + v430) << 8 + | ((v431 < 10) ? '0' + v431 : 'a' - 10 + v431) << 0; + + barrier (CLK_LOCAL_MEM_FENCE); + + if (gid >= gid_max) return; + + /** + * salt + */ + + const u32 salt_len = esalt_bufs[salt_pos].salt_len; // not a bug, we need to get it from the esalt + + u32 salt_buf0[16]; + + salt_buf0[ 0] = esalt_bufs[salt_pos].salt_buf[ 0]; + salt_buf0[ 1] = esalt_bufs[salt_pos].salt_buf[ 1]; + salt_buf0[ 2] = esalt_bufs[salt_pos].salt_buf[ 2]; + salt_buf0[ 3] = esalt_bufs[salt_pos].salt_buf[ 3]; + salt_buf0[ 4] = esalt_bufs[salt_pos].salt_buf[ 4]; + salt_buf0[ 5] = esalt_bufs[salt_pos].salt_buf[ 5]; + salt_buf0[ 6] = esalt_bufs[salt_pos].salt_buf[ 6]; + salt_buf0[ 7] = esalt_bufs[salt_pos].salt_buf[ 7]; + salt_buf0[ 8] = esalt_bufs[salt_pos].salt_buf[ 8]; + salt_buf0[ 9] = esalt_bufs[salt_pos].salt_buf[ 9]; + salt_buf0[10] = esalt_bufs[salt_pos].salt_buf[10]; + salt_buf0[11] = esalt_bufs[salt_pos].salt_buf[11]; + salt_buf0[12] = esalt_bufs[salt_pos].salt_buf[12]; + salt_buf0[13] = esalt_bufs[salt_pos].salt_buf[13]; + salt_buf0[14] = esalt_bufs[salt_pos].salt_buf[14]; + salt_buf0[15] = esalt_bufs[salt_pos].salt_buf[15]; + + u32 salt_buf1[16]; + + salt_buf1[ 0] = esalt_bufs[salt_pos].salt_buf[16]; + salt_buf1[ 1] = esalt_bufs[salt_pos].salt_buf[17]; + salt_buf1[ 2] = esalt_bufs[salt_pos].salt_buf[18]; + salt_buf1[ 3] = esalt_bufs[salt_pos].salt_buf[19]; + salt_buf1[ 4] = esalt_bufs[salt_pos].salt_buf[20]; + salt_buf1[ 5] = esalt_bufs[salt_pos].salt_buf[21]; + salt_buf1[ 6] = esalt_bufs[salt_pos].salt_buf[22]; + salt_buf1[ 7] = esalt_bufs[salt_pos].salt_buf[23]; + salt_buf1[ 8] = esalt_bufs[salt_pos].salt_buf[24]; + salt_buf1[ 9] = esalt_bufs[salt_pos].salt_buf[25]; + salt_buf1[10] = esalt_bufs[salt_pos].salt_buf[26]; + salt_buf1[11] = esalt_bufs[salt_pos].salt_buf[27]; + salt_buf1[12] = esalt_bufs[salt_pos].salt_buf[28]; + salt_buf1[13] = esalt_bufs[salt_pos].salt_buf[29]; + salt_buf1[14] = 0; + salt_buf1[15] = 0; + + /** + * esalt + */ + + const u32 esalt_len = esalt_bufs[salt_pos].esalt_len; + + u32 esalt_buf0[16]; + + esalt_buf0[ 0] = esalt_bufs[salt_pos].esalt_buf[ 0]; + esalt_buf0[ 1] = esalt_bufs[salt_pos].esalt_buf[ 1]; + esalt_buf0[ 2] = esalt_bufs[salt_pos].esalt_buf[ 2]; + esalt_buf0[ 3] = esalt_bufs[salt_pos].esalt_buf[ 3]; + esalt_buf0[ 4] = esalt_bufs[salt_pos].esalt_buf[ 4]; + esalt_buf0[ 5] = esalt_bufs[salt_pos].esalt_buf[ 5]; + esalt_buf0[ 6] = esalt_bufs[salt_pos].esalt_buf[ 6]; + esalt_buf0[ 7] = esalt_bufs[salt_pos].esalt_buf[ 7]; + esalt_buf0[ 8] = esalt_bufs[salt_pos].esalt_buf[ 8]; + esalt_buf0[ 9] = esalt_bufs[salt_pos].esalt_buf[ 9]; + esalt_buf0[10] = esalt_bufs[salt_pos].esalt_buf[10]; + esalt_buf0[11] = esalt_bufs[salt_pos].esalt_buf[11]; + esalt_buf0[12] = esalt_bufs[salt_pos].esalt_buf[12]; + esalt_buf0[13] = esalt_bufs[salt_pos].esalt_buf[13]; + esalt_buf0[14] = esalt_bufs[salt_pos].esalt_buf[14]; + esalt_buf0[15] = esalt_bufs[salt_pos].esalt_buf[15]; + + u32 esalt_buf1[16]; + + esalt_buf1[ 0] = esalt_bufs[salt_pos].esalt_buf[16]; + esalt_buf1[ 1] = esalt_bufs[salt_pos].esalt_buf[17]; + esalt_buf1[ 2] = esalt_bufs[salt_pos].esalt_buf[18]; + esalt_buf1[ 3] = esalt_bufs[salt_pos].esalt_buf[19]; + esalt_buf1[ 4] = esalt_bufs[salt_pos].esalt_buf[20]; + esalt_buf1[ 5] = esalt_bufs[salt_pos].esalt_buf[21]; + esalt_buf1[ 6] = esalt_bufs[salt_pos].esalt_buf[22]; + esalt_buf1[ 7] = esalt_bufs[salt_pos].esalt_buf[23]; + esalt_buf1[ 8] = esalt_bufs[salt_pos].esalt_buf[24]; + esalt_buf1[ 9] = esalt_bufs[salt_pos].esalt_buf[25]; + esalt_buf1[10] = esalt_bufs[salt_pos].esalt_buf[26]; + esalt_buf1[11] = esalt_bufs[salt_pos].esalt_buf[27]; + esalt_buf1[12] = esalt_bufs[salt_pos].esalt_buf[28]; + esalt_buf1[13] = esalt_bufs[salt_pos].esalt_buf[29]; + esalt_buf1[14] = esalt_bufs[salt_pos].esalt_buf[30]; + esalt_buf1[15] = esalt_bufs[salt_pos].esalt_buf[31]; + + u32 esalt_buf2[16]; + + esalt_buf2[ 0] = esalt_bufs[salt_pos].esalt_buf[32]; + esalt_buf2[ 1] = esalt_bufs[salt_pos].esalt_buf[33]; + esalt_buf2[ 2] = esalt_bufs[salt_pos].esalt_buf[34]; + esalt_buf2[ 3] = esalt_bufs[salt_pos].esalt_buf[35]; + esalt_buf2[ 4] = esalt_bufs[salt_pos].esalt_buf[36]; + esalt_buf2[ 5] = esalt_bufs[salt_pos].esalt_buf[37]; + esalt_buf2[ 6] = 0; + esalt_buf2[ 7] = 0; + esalt_buf2[ 8] = 0; + esalt_buf2[ 9] = 0; + esalt_buf2[10] = 0; + esalt_buf2[11] = 0; + esalt_buf2[12] = 0; + esalt_buf2[13] = 0; + esalt_buf2[14] = 0; + esalt_buf2[15] = 0; + + const u32 digest_esalt_len = 32 + esalt_len; + const u32 remaining_bytes = digest_esalt_len + 1 - 64; // substract previous block + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + + w0[0] = pw_buf0[0]; + w0[1] = pw_buf0[1]; + w0[2] = pw_buf0[2]; + w0[3] = pw_buf0[3]; + + u32x w1[4]; + + w1[0] = pw_buf1[0]; + w1[1] = pw_buf1[1]; + w1[2] = pw_buf1[2]; + w1[3] = pw_buf1[3]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 out_len = apply_rules (rules_buf[il_pos].cmds, w0, w1, pw_len); + + append_0x80_2 (w0, w1, out_len); + + const u32 pw_salt_len = salt_len + out_len; + + /* + * HA1 = md5 ($salt . $pass) + */ + + // append the pass to the salt + + u32x block0[16]; + + block0[ 0] = salt_buf0[ 0]; + block0[ 1] = salt_buf0[ 1]; + block0[ 2] = salt_buf0[ 2]; + block0[ 3] = salt_buf0[ 3]; + block0[ 4] = salt_buf0[ 4]; + block0[ 5] = salt_buf0[ 5]; + block0[ 6] = salt_buf0[ 6]; + block0[ 7] = salt_buf0[ 7]; + block0[ 8] = salt_buf0[ 8]; + block0[ 9] = salt_buf0[ 9]; + block0[10] = salt_buf0[10]; + block0[11] = salt_buf0[11]; + block0[12] = salt_buf0[12]; + block0[13] = salt_buf0[13]; + block0[14] = salt_buf0[14]; + block0[15] = salt_buf0[15]; + + u32x block1[16]; + + block1[ 0] = salt_buf1[ 0]; + block1[ 1] = salt_buf1[ 1]; + block1[ 2] = salt_buf1[ 2]; + block1[ 3] = salt_buf1[ 3]; + block1[ 4] = salt_buf1[ 4]; + block1[ 5] = salt_buf1[ 5]; + block1[ 6] = salt_buf1[ 6]; + block1[ 7] = salt_buf1[ 7]; + block1[ 8] = salt_buf1[ 8]; + block1[ 9] = salt_buf1[ 9]; + block1[10] = salt_buf1[10]; + block1[11] = salt_buf1[11]; + block1[12] = salt_buf1[12]; + block1[13] = salt_buf1[13]; + block1[14] = salt_buf1[14]; + block1[15] = salt_buf1[15]; + + u32 block_len = 0; + + block_len = memcat32 (block0, block1, salt_len, w0, w1, w2, w3, out_len); + + u32x w0_t[4]; + + w0_t[0] = block0[ 0]; + w0_t[1] = block0[ 1]; + w0_t[2] = block0[ 2]; + w0_t[3] = block0[ 3]; + + u32x w1_t[4]; + + w1_t[0] = block0[ 4]; + w1_t[1] = block0[ 5]; + w1_t[2] = block0[ 6]; + w1_t[3] = block0[ 7]; + + u32x w2_t[4]; + + w2_t[0] = block0[ 8]; + w2_t[1] = block0[ 9]; + w2_t[2] = block0[10]; + w2_t[3] = block0[11]; + + u32x w3_t[4]; + + w3_t[0] = block0[12]; + w3_t[1] = block0[13]; + w3_t[2] = block0[14]; + w3_t[3] = block0[15]; + + if (block_len < 56) + { + w3_t[2] = pw_salt_len * 8; + } + + // md5 + + u32x tmp2; + + u32x a = MD5M_A; + u32x b = MD5M_B; + u32x c = MD5M_C; + u32x d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0_t[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0_t[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0_t[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1_t[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1_t[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1_t[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2_t[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2_t[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2_t[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3_t[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3_t[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3_t[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0_t[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1_t[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2_t[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1_t[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1_t[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2_t[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3_t[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0_t[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2_t[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3_t[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0_t[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1_t[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3_t[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H1, a, b, c, d, w1_t[1], MD5C20, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w2_t[0], MD5C21, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w2_t[3], MD5C22, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w3_t[2], MD5C23, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w0_t[1], MD5C24, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w1_t[0], MD5C25, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w1_t[3], MD5C26, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w2_t[2], MD5C27, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w3_t[1], MD5C28, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w0_t[0], MD5C29, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w0_t[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w1_t[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w2_t[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w3_t[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w3_t[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w0_t[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1_t[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3_t[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3_t[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0_t[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0_t[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2_t[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1_t[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3_t[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1_t[0], MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w2_t[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0_t[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2_t[1], MD5C3f, MD5S33); + + a += MD5M_A; + b += MD5M_B; + c += MD5M_C; + d += MD5M_D; + + if (block_len > 55) + { + u32x r_a = a; + u32x r_b = b; + u32x r_c = c; + u32x r_d = d; + + w0_t[0] = block1[ 0]; + w0_t[1] = block1[ 1]; + w0_t[2] = block1[ 2]; + w0_t[3] = block1[ 3]; + + w1_t[0] = block1[ 4]; + w1_t[1] = block1[ 5]; + w1_t[2] = block1[ 6]; + w1_t[3] = block1[ 7]; + + w2_t[0] = block1[ 8]; + w2_t[1] = block1[ 9]; + w2_t[2] = block1[10]; + w2_t[3] = block1[11]; + + w3_t[0] = block1[12]; + w3_t[1] = block1[13]; + w3_t[2] = pw_salt_len * 8; + w3_t[3] = 0; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0_t[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0_t[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0_t[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1_t[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1_t[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1_t[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2_t[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2_t[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2_t[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3_t[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3_t[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3_t[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0_t[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1_t[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2_t[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1_t[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1_t[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2_t[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3_t[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0_t[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2_t[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3_t[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0_t[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1_t[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3_t[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H1, a, b, c, d, w1_t[1], MD5C20, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w2_t[0], MD5C21, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w2_t[3], MD5C22, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w3_t[2], MD5C23, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w0_t[1], MD5C24, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w1_t[0], MD5C25, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w1_t[3], MD5C26, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w2_t[2], MD5C27, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w3_t[1], MD5C28, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w0_t[0], MD5C29, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w0_t[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w1_t[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w2_t[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w3_t[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w3_t[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w0_t[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1_t[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3_t[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3_t[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0_t[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0_t[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2_t[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1_t[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3_t[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1_t[0], MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w2_t[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0_t[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2_t[1], MD5C3f, MD5S33); + + a += r_a; + b += r_b; + c += r_c; + d += r_d; + } + + /* + * final = md5 ($HA1 . $esalt) + * we have at least 2 MD5 blocks/transformations, but we might need 3 + */ + + w0_t[0] = uint_to_hex_lower8 ((a >> 0) & 255) << 0 + | uint_to_hex_lower8 ((a >> 8) & 255) << 16; + w0_t[1] = uint_to_hex_lower8 ((a >> 16) & 255) << 0 + | uint_to_hex_lower8 ((a >> 24) & 255) << 16; + w0_t[2] = uint_to_hex_lower8 ((b >> 0) & 255) << 0 + | uint_to_hex_lower8 ((b >> 8) & 255) << 16; + w0_t[3] = uint_to_hex_lower8 ((b >> 16) & 255) << 0 + | uint_to_hex_lower8 ((b >> 24) & 255) << 16; + w1_t[0] = uint_to_hex_lower8 ((c >> 0) & 255) << 0 + | uint_to_hex_lower8 ((c >> 8) & 255) << 16; + w1_t[1] = uint_to_hex_lower8 ((c >> 16) & 255) << 0 + | uint_to_hex_lower8 ((c >> 24) & 255) << 16; + w1_t[2] = uint_to_hex_lower8 ((d >> 0) & 255) << 0 + | uint_to_hex_lower8 ((d >> 8) & 255) << 16; + w1_t[3] = uint_to_hex_lower8 ((d >> 16) & 255) << 0 + | uint_to_hex_lower8 ((d >> 24) & 255) << 16; + + w2_t[0] = esalt_buf0[0]; + w2_t[1] = esalt_buf0[1]; + w2_t[2] = esalt_buf0[2]; + w2_t[3] = esalt_buf0[3]; + + w3_t[0] = esalt_buf0[4]; + w3_t[1] = esalt_buf0[5]; + w3_t[2] = esalt_buf0[6]; + w3_t[3] = esalt_buf0[7]; + + // md5 + // 1st transform + + a = MD5M_A; + b = MD5M_B; + c = MD5M_C; + d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0_t[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0_t[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0_t[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1_t[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1_t[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1_t[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2_t[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2_t[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2_t[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3_t[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3_t[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3_t[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0_t[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1_t[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2_t[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1_t[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1_t[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2_t[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3_t[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0_t[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2_t[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3_t[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0_t[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1_t[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3_t[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H1, a, b, c, d, w1_t[1], MD5C20, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w2_t[0], MD5C21, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w2_t[3], MD5C22, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w3_t[2], MD5C23, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w0_t[1], MD5C24, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w1_t[0], MD5C25, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w1_t[3], MD5C26, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w2_t[2], MD5C27, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w3_t[1], MD5C28, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w0_t[0], MD5C29, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w0_t[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w1_t[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w2_t[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w3_t[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w3_t[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w0_t[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1_t[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3_t[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3_t[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0_t[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0_t[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2_t[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1_t[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3_t[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1_t[0], MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w2_t[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0_t[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2_t[1], MD5C3f, MD5S33); + + a += MD5M_A; + b += MD5M_B; + c += MD5M_C; + d += MD5M_D; + + u32x r_a = a; + u32x r_b = b; + u32x r_c = c; + u32x r_d = d; + + // 2nd transform + + w0_t[0] = esalt_buf0[ 8]; + w0_t[1] = esalt_buf0[ 9]; + w0_t[2] = esalt_buf0[10]; + w0_t[3] = esalt_buf0[11]; + + w1_t[0] = esalt_buf0[12]; + w1_t[1] = esalt_buf0[13]; + w1_t[2] = esalt_buf0[14]; + w1_t[3] = esalt_buf0[15]; + + w2_t[0] = esalt_buf1[ 0]; + w2_t[1] = esalt_buf1[ 1]; + w2_t[2] = esalt_buf1[ 2]; + w2_t[3] = esalt_buf1[ 3]; + + w3_t[0] = esalt_buf1[ 4]; + w3_t[1] = esalt_buf1[ 5]; + w3_t[2] = esalt_buf1[ 6]; + w3_t[3] = esalt_buf1[ 7]; + + // it is the final block when no more than 55 bytes left + + if (remaining_bytes < 56) + { + // it is the last block ! + + w3_t[2] = digest_esalt_len * 8; + } + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0_t[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0_t[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0_t[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1_t[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1_t[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1_t[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2_t[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2_t[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2_t[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3_t[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3_t[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3_t[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0_t[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1_t[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2_t[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1_t[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1_t[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2_t[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3_t[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0_t[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2_t[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3_t[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0_t[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1_t[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3_t[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H1, a, b, c, d, w1_t[1], MD5C20, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w2_t[0], MD5C21, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w2_t[3], MD5C22, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w3_t[2], MD5C23, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w0_t[1], MD5C24, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w1_t[0], MD5C25, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w1_t[3], MD5C26, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w2_t[2], MD5C27, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w3_t[1], MD5C28, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w0_t[0], MD5C29, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w0_t[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w1_t[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w2_t[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w3_t[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w3_t[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w0_t[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1_t[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3_t[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3_t[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0_t[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0_t[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2_t[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1_t[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3_t[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1_t[0], MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w2_t[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0_t[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2_t[1], MD5C3f, MD5S33); + + // sometimes (not rare at all) we need a third block :( + + if (remaining_bytes > 55) + { + // this is for sure the final block + + a += r_a; + b += r_b; + c += r_c; + d += r_d; + + r_a = a; + r_b = b; + r_c = c; + r_d = d; + + w0_t[0] = esalt_buf1[ 8]; + w0_t[1] = esalt_buf1[ 9]; + w0_t[2] = esalt_buf1[10]; + w0_t[3] = esalt_buf1[11]; + + w1_t[0] = esalt_buf1[12]; + w1_t[1] = esalt_buf1[13]; + w1_t[2] = esalt_buf1[14]; + w1_t[3] = esalt_buf1[15]; + + w2_t[0] = esalt_buf2[ 0]; + w2_t[1] = esalt_buf2[ 1]; + w2_t[2] = esalt_buf2[ 2]; + w2_t[3] = esalt_buf2[ 3]; + + w3_t[0] = esalt_buf2[ 4]; + w3_t[1] = esalt_buf2[ 5]; + w3_t[2] = digest_esalt_len * 8; + w3_t[3] = 0; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0_t[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0_t[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0_t[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1_t[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1_t[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1_t[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2_t[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2_t[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2_t[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3_t[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3_t[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3_t[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0_t[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1_t[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2_t[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1_t[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1_t[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2_t[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3_t[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0_t[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2_t[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3_t[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0_t[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1_t[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3_t[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H1, a, b, c, d, w1_t[1], MD5C20, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w2_t[0], MD5C21, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w2_t[3], MD5C22, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w3_t[2], MD5C23, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w0_t[1], MD5C24, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w1_t[0], MD5C25, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w1_t[3], MD5C26, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w2_t[2], MD5C27, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w3_t[1], MD5C28, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w0_t[0], MD5C29, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w0_t[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w1_t[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w2_t[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w3_t[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w3_t[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w0_t[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1_t[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3_t[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3_t[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0_t[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0_t[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2_t[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1_t[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3_t[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1_t[0], MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w2_t[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0_t[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2_t[1], MD5C3f, MD5S33); + } + + a += r_a; + b += r_b; + c += r_c; + d += r_d; + + const u32x r0 = a; + const u32x r1 = d; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_M + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m11400_m08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global sip_t *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m11400_m16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global sip_t *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m11400_s04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global sip_t *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + u32x pw_buf1[4]; + + pw_buf1[0] = pws[gid].i[ 4]; + pw_buf1[1] = pws[gid].i[ 5]; + pw_buf1[2] = pws[gid].i[ 6]; + pw_buf1[3] = pws[gid].i[ 7]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * bin2asc table + */ + + __local u32 l_bin2asc[256]; + + const u32 lid4 = lid * 4; + + const u32 lid40 = lid4 + 0; + const u32 lid41 = lid4 + 1; + const u32 lid42 = lid4 + 2; + const u32 lid43 = lid4 + 3; + + const u32 v400 = (lid40 >> 0) & 15; + const u32 v401 = (lid40 >> 4) & 15; + const u32 v410 = (lid41 >> 0) & 15; + const u32 v411 = (lid41 >> 4) & 15; + const u32 v420 = (lid42 >> 0) & 15; + const u32 v421 = (lid42 >> 4) & 15; + const u32 v430 = (lid43 >> 0) & 15; + const u32 v431 = (lid43 >> 4) & 15; + + l_bin2asc[lid40] = ((v400 < 10) ? '0' + v400 : 'a' - 10 + v400) << 8 + | ((v401 < 10) ? '0' + v401 : 'a' - 10 + v401) << 0; + l_bin2asc[lid41] = ((v410 < 10) ? '0' + v410 : 'a' - 10 + v410) << 8 + | ((v411 < 10) ? '0' + v411 : 'a' - 10 + v411) << 0; + l_bin2asc[lid42] = ((v420 < 10) ? '0' + v420 : 'a' - 10 + v420) << 8 + | ((v421 < 10) ? '0' + v421 : 'a' - 10 + v421) << 0; + l_bin2asc[lid43] = ((v430 < 10) ? '0' + v430 : 'a' - 10 + v430) << 8 + | ((v431 < 10) ? '0' + v431 : 'a' - 10 + v431) << 0; + + barrier (CLK_LOCAL_MEM_FENCE); + + if (gid >= gid_max) return; + + /** + * salt + */ + + const u32 salt_len = esalt_bufs[salt_pos].salt_len; // not a bug, we need to get it from the esalt + + u32 salt_buf0[16]; + + salt_buf0[ 0] = esalt_bufs[salt_pos].salt_buf[ 0]; + salt_buf0[ 1] = esalt_bufs[salt_pos].salt_buf[ 1]; + salt_buf0[ 2] = esalt_bufs[salt_pos].salt_buf[ 2]; + salt_buf0[ 3] = esalt_bufs[salt_pos].salt_buf[ 3]; + salt_buf0[ 4] = esalt_bufs[salt_pos].salt_buf[ 4]; + salt_buf0[ 5] = esalt_bufs[salt_pos].salt_buf[ 5]; + salt_buf0[ 6] = esalt_bufs[salt_pos].salt_buf[ 6]; + salt_buf0[ 7] = esalt_bufs[salt_pos].salt_buf[ 7]; + salt_buf0[ 8] = esalt_bufs[salt_pos].salt_buf[ 8]; + salt_buf0[ 9] = esalt_bufs[salt_pos].salt_buf[ 9]; + salt_buf0[10] = esalt_bufs[salt_pos].salt_buf[10]; + salt_buf0[11] = esalt_bufs[salt_pos].salt_buf[11]; + salt_buf0[12] = esalt_bufs[salt_pos].salt_buf[12]; + salt_buf0[13] = esalt_bufs[salt_pos].salt_buf[13]; + salt_buf0[14] = esalt_bufs[salt_pos].salt_buf[14]; + salt_buf0[15] = esalt_bufs[salt_pos].salt_buf[15]; + + u32 salt_buf1[16]; + + salt_buf1[ 0] = esalt_bufs[salt_pos].salt_buf[16]; + salt_buf1[ 1] = esalt_bufs[salt_pos].salt_buf[17]; + salt_buf1[ 2] = esalt_bufs[salt_pos].salt_buf[18]; + salt_buf1[ 3] = esalt_bufs[salt_pos].salt_buf[19]; + salt_buf1[ 4] = esalt_bufs[salt_pos].salt_buf[20]; + salt_buf1[ 5] = esalt_bufs[salt_pos].salt_buf[21]; + salt_buf1[ 6] = esalt_bufs[salt_pos].salt_buf[22]; + salt_buf1[ 7] = esalt_bufs[salt_pos].salt_buf[23]; + salt_buf1[ 8] = esalt_bufs[salt_pos].salt_buf[24]; + salt_buf1[ 9] = esalt_bufs[salt_pos].salt_buf[25]; + salt_buf1[10] = esalt_bufs[salt_pos].salt_buf[26]; + salt_buf1[11] = esalt_bufs[salt_pos].salt_buf[27]; + salt_buf1[12] = esalt_bufs[salt_pos].salt_buf[28]; + salt_buf1[13] = esalt_bufs[salt_pos].salt_buf[29]; + salt_buf1[14] = 0; + salt_buf1[15] = 0; + + /** + * esalt + */ + + const u32 esalt_len = esalt_bufs[salt_pos].esalt_len; + + u32 esalt_buf0[16]; + + esalt_buf0[ 0] = esalt_bufs[salt_pos].esalt_buf[ 0]; + esalt_buf0[ 1] = esalt_bufs[salt_pos].esalt_buf[ 1]; + esalt_buf0[ 2] = esalt_bufs[salt_pos].esalt_buf[ 2]; + esalt_buf0[ 3] = esalt_bufs[salt_pos].esalt_buf[ 3]; + esalt_buf0[ 4] = esalt_bufs[salt_pos].esalt_buf[ 4]; + esalt_buf0[ 5] = esalt_bufs[salt_pos].esalt_buf[ 5]; + esalt_buf0[ 6] = esalt_bufs[salt_pos].esalt_buf[ 6]; + esalt_buf0[ 7] = esalt_bufs[salt_pos].esalt_buf[ 7]; + esalt_buf0[ 8] = esalt_bufs[salt_pos].esalt_buf[ 8]; + esalt_buf0[ 9] = esalt_bufs[salt_pos].esalt_buf[ 9]; + esalt_buf0[10] = esalt_bufs[salt_pos].esalt_buf[10]; + esalt_buf0[11] = esalt_bufs[salt_pos].esalt_buf[11]; + esalt_buf0[12] = esalt_bufs[salt_pos].esalt_buf[12]; + esalt_buf0[13] = esalt_bufs[salt_pos].esalt_buf[13]; + esalt_buf0[14] = esalt_bufs[salt_pos].esalt_buf[14]; + esalt_buf0[15] = esalt_bufs[salt_pos].esalt_buf[15]; + + u32 esalt_buf1[16]; + + esalt_buf1[ 0] = esalt_bufs[salt_pos].esalt_buf[16]; + esalt_buf1[ 1] = esalt_bufs[salt_pos].esalt_buf[17]; + esalt_buf1[ 2] = esalt_bufs[salt_pos].esalt_buf[18]; + esalt_buf1[ 3] = esalt_bufs[salt_pos].esalt_buf[19]; + esalt_buf1[ 4] = esalt_bufs[salt_pos].esalt_buf[20]; + esalt_buf1[ 5] = esalt_bufs[salt_pos].esalt_buf[21]; + esalt_buf1[ 6] = esalt_bufs[salt_pos].esalt_buf[22]; + esalt_buf1[ 7] = esalt_bufs[salt_pos].esalt_buf[23]; + esalt_buf1[ 8] = esalt_bufs[salt_pos].esalt_buf[24]; + esalt_buf1[ 9] = esalt_bufs[salt_pos].esalt_buf[25]; + esalt_buf1[10] = esalt_bufs[salt_pos].esalt_buf[26]; + esalt_buf1[11] = esalt_bufs[salt_pos].esalt_buf[27]; + esalt_buf1[12] = esalt_bufs[salt_pos].esalt_buf[28]; + esalt_buf1[13] = esalt_bufs[salt_pos].esalt_buf[29]; + esalt_buf1[14] = esalt_bufs[salt_pos].esalt_buf[30]; + esalt_buf1[15] = esalt_bufs[salt_pos].esalt_buf[31]; + + u32 esalt_buf2[16]; + + esalt_buf2[ 0] = esalt_bufs[salt_pos].esalt_buf[32]; + esalt_buf2[ 1] = esalt_bufs[salt_pos].esalt_buf[33]; + esalt_buf2[ 2] = esalt_bufs[salt_pos].esalt_buf[34]; + esalt_buf2[ 3] = esalt_bufs[salt_pos].esalt_buf[35]; + esalt_buf2[ 4] = esalt_bufs[salt_pos].esalt_buf[36]; + esalt_buf2[ 5] = esalt_bufs[salt_pos].esalt_buf[37]; + esalt_buf2[ 6] = 0; + esalt_buf2[ 7] = 0; + esalt_buf2[ 8] = 0; + esalt_buf2[ 9] = 0; + esalt_buf2[10] = 0; + esalt_buf2[11] = 0; + esalt_buf2[12] = 0; + esalt_buf2[13] = 0; + esalt_buf2[14] = 0; + esalt_buf2[15] = 0; + + const u32 digest_esalt_len = 32 + esalt_len; + const u32 remaining_bytes = digest_esalt_len + 1 - 64; // substract previous block + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + + w0[0] = pw_buf0[0]; + w0[1] = pw_buf0[1]; + w0[2] = pw_buf0[2]; + w0[3] = pw_buf0[3]; + + u32x w1[4]; + + w1[0] = pw_buf1[0]; + w1[1] = pw_buf1[1]; + w1[2] = pw_buf1[2]; + w1[3] = pw_buf1[3]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 out_len = apply_rules (rules_buf[il_pos].cmds, w0, w1, pw_len); + + append_0x80_2 (w0, w1, out_len); + + const u32 pw_salt_len = salt_len + out_len; + + /* + * HA1 = md5 ($salt . $pass) + */ + + // append the pass to the salt + + u32x block0[16]; + + block0[ 0] = salt_buf0[ 0]; + block0[ 1] = salt_buf0[ 1]; + block0[ 2] = salt_buf0[ 2]; + block0[ 3] = salt_buf0[ 3]; + block0[ 4] = salt_buf0[ 4]; + block0[ 5] = salt_buf0[ 5]; + block0[ 6] = salt_buf0[ 6]; + block0[ 7] = salt_buf0[ 7]; + block0[ 8] = salt_buf0[ 8]; + block0[ 9] = salt_buf0[ 9]; + block0[10] = salt_buf0[10]; + block0[11] = salt_buf0[11]; + block0[12] = salt_buf0[12]; + block0[13] = salt_buf0[13]; + block0[14] = salt_buf0[14]; + block0[15] = salt_buf0[15]; + + u32x block1[16]; + + block1[ 0] = salt_buf1[ 0]; + block1[ 1] = salt_buf1[ 1]; + block1[ 2] = salt_buf1[ 2]; + block1[ 3] = salt_buf1[ 3]; + block1[ 4] = salt_buf1[ 4]; + block1[ 5] = salt_buf1[ 5]; + block1[ 6] = salt_buf1[ 6]; + block1[ 7] = salt_buf1[ 7]; + block1[ 8] = salt_buf1[ 8]; + block1[ 9] = salt_buf1[ 9]; + block1[10] = salt_buf1[10]; + block1[11] = salt_buf1[11]; + block1[12] = salt_buf1[12]; + block1[13] = salt_buf1[13]; + block1[14] = salt_buf1[14]; + block1[15] = salt_buf1[15]; + + u32 block_len = 0; + + block_len = memcat32 (block0, block1, salt_len, w0, w1, w2, w3, out_len); + + u32x w0_t[4]; + + w0_t[0] = block0[ 0]; + w0_t[1] = block0[ 1]; + w0_t[2] = block0[ 2]; + w0_t[3] = block0[ 3]; + + u32x w1_t[4]; + + w1_t[0] = block0[ 4]; + w1_t[1] = block0[ 5]; + w1_t[2] = block0[ 6]; + w1_t[3] = block0[ 7]; + + u32x w2_t[4]; + + w2_t[0] = block0[ 8]; + w2_t[1] = block0[ 9]; + w2_t[2] = block0[10]; + w2_t[3] = block0[11]; + + u32x w3_t[4]; + + w3_t[0] = block0[12]; + w3_t[1] = block0[13]; + w3_t[2] = block0[14]; + w3_t[3] = block0[15]; + + if (block_len < 56) + { + w3_t[2] = pw_salt_len * 8; + } + + // md5 + + u32x tmp2; + + u32x a = MD5M_A; + u32x b = MD5M_B; + u32x c = MD5M_C; + u32x d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0_t[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0_t[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0_t[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1_t[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1_t[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1_t[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2_t[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2_t[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2_t[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3_t[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3_t[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3_t[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0_t[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1_t[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2_t[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1_t[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1_t[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2_t[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3_t[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0_t[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2_t[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3_t[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0_t[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1_t[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3_t[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H1, a, b, c, d, w1_t[1], MD5C20, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w2_t[0], MD5C21, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w2_t[3], MD5C22, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w3_t[2], MD5C23, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w0_t[1], MD5C24, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w1_t[0], MD5C25, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w1_t[3], MD5C26, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w2_t[2], MD5C27, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w3_t[1], MD5C28, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w0_t[0], MD5C29, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w0_t[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w1_t[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w2_t[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w3_t[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w3_t[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w0_t[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1_t[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3_t[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3_t[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0_t[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0_t[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2_t[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1_t[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3_t[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1_t[0], MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w2_t[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0_t[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2_t[1], MD5C3f, MD5S33); + + a += MD5M_A; + b += MD5M_B; + c += MD5M_C; + d += MD5M_D; + + if (block_len > 55) + { + u32x r_a = a; + u32x r_b = b; + u32x r_c = c; + u32x r_d = d; + + w0_t[0] = block1[ 0]; + w0_t[1] = block1[ 1]; + w0_t[2] = block1[ 2]; + w0_t[3] = block1[ 3]; + + w1_t[0] = block1[ 4]; + w1_t[1] = block1[ 5]; + w1_t[2] = block1[ 6]; + w1_t[3] = block1[ 7]; + + w2_t[0] = block1[ 8]; + w2_t[1] = block1[ 9]; + w2_t[2] = block1[10]; + w2_t[3] = block1[11]; + + w3_t[0] = block1[12]; + w3_t[1] = block1[13]; + w3_t[2] = pw_salt_len * 8; + w3_t[3] = 0; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0_t[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0_t[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0_t[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1_t[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1_t[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1_t[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2_t[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2_t[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2_t[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3_t[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3_t[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3_t[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0_t[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1_t[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2_t[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1_t[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1_t[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2_t[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3_t[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0_t[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2_t[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3_t[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0_t[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1_t[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3_t[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H1, a, b, c, d, w1_t[1], MD5C20, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w2_t[0], MD5C21, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w2_t[3], MD5C22, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w3_t[2], MD5C23, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w0_t[1], MD5C24, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w1_t[0], MD5C25, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w1_t[3], MD5C26, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w2_t[2], MD5C27, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w3_t[1], MD5C28, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w0_t[0], MD5C29, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w0_t[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w1_t[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w2_t[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w3_t[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w3_t[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w0_t[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1_t[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3_t[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3_t[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0_t[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0_t[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2_t[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1_t[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3_t[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1_t[0], MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w2_t[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0_t[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2_t[1], MD5C3f, MD5S33); + + a += r_a; + b += r_b; + c += r_c; + d += r_d; + } + + /* + * final = md5 ($HA1 . $esalt) + * we have at least 2 MD5 blocks/transformations, but we might need 3 + */ + + w0_t[0] = uint_to_hex_lower8 ((a >> 0) & 255) << 0 + | uint_to_hex_lower8 ((a >> 8) & 255) << 16; + w0_t[1] = uint_to_hex_lower8 ((a >> 16) & 255) << 0 + | uint_to_hex_lower8 ((a >> 24) & 255) << 16; + w0_t[2] = uint_to_hex_lower8 ((b >> 0) & 255) << 0 + | uint_to_hex_lower8 ((b >> 8) & 255) << 16; + w0_t[3] = uint_to_hex_lower8 ((b >> 16) & 255) << 0 + | uint_to_hex_lower8 ((b >> 24) & 255) << 16; + w1_t[0] = uint_to_hex_lower8 ((c >> 0) & 255) << 0 + | uint_to_hex_lower8 ((c >> 8) & 255) << 16; + w1_t[1] = uint_to_hex_lower8 ((c >> 16) & 255) << 0 + | uint_to_hex_lower8 ((c >> 24) & 255) << 16; + w1_t[2] = uint_to_hex_lower8 ((d >> 0) & 255) << 0 + | uint_to_hex_lower8 ((d >> 8) & 255) << 16; + w1_t[3] = uint_to_hex_lower8 ((d >> 16) & 255) << 0 + | uint_to_hex_lower8 ((d >> 24) & 255) << 16; + + w2_t[0] = esalt_buf0[0]; + w2_t[1] = esalt_buf0[1]; + w2_t[2] = esalt_buf0[2]; + w2_t[3] = esalt_buf0[3]; + + w3_t[0] = esalt_buf0[4]; + w3_t[1] = esalt_buf0[5]; + w3_t[2] = esalt_buf0[6]; + w3_t[3] = esalt_buf0[7]; + + // md5 + // 1st transform + + a = MD5M_A; + b = MD5M_B; + c = MD5M_C; + d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0_t[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0_t[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0_t[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1_t[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1_t[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1_t[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2_t[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2_t[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2_t[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3_t[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3_t[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3_t[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0_t[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1_t[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2_t[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1_t[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1_t[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2_t[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3_t[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0_t[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2_t[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3_t[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0_t[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1_t[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3_t[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H1, a, b, c, d, w1_t[1], MD5C20, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w2_t[0], MD5C21, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w2_t[3], MD5C22, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w3_t[2], MD5C23, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w0_t[1], MD5C24, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w1_t[0], MD5C25, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w1_t[3], MD5C26, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w2_t[2], MD5C27, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w3_t[1], MD5C28, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w0_t[0], MD5C29, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w0_t[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w1_t[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w2_t[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w3_t[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w3_t[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w0_t[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1_t[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3_t[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3_t[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0_t[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0_t[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2_t[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1_t[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3_t[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1_t[0], MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w2_t[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0_t[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2_t[1], MD5C3f, MD5S33); + + a += MD5M_A; + b += MD5M_B; + c += MD5M_C; + d += MD5M_D; + + u32x r_a = a; + u32x r_b = b; + u32x r_c = c; + u32x r_d = d; + + // 2nd transform + + w0_t[0] = esalt_buf0[ 8]; + w0_t[1] = esalt_buf0[ 9]; + w0_t[2] = esalt_buf0[10]; + w0_t[3] = esalt_buf0[11]; + + w1_t[0] = esalt_buf0[12]; + w1_t[1] = esalt_buf0[13]; + w1_t[2] = esalt_buf0[14]; + w1_t[3] = esalt_buf0[15]; + + w2_t[0] = esalt_buf1[ 0]; + w2_t[1] = esalt_buf1[ 1]; + w2_t[2] = esalt_buf1[ 2]; + w2_t[3] = esalt_buf1[ 3]; + + w3_t[0] = esalt_buf1[ 4]; + w3_t[1] = esalt_buf1[ 5]; + w3_t[2] = esalt_buf1[ 6]; + w3_t[3] = esalt_buf1[ 7]; + + // it is the final block when no more than 55 bytes left + + if (remaining_bytes < 56) + { + // it is the last block ! + + w3_t[2] = digest_esalt_len * 8; + } + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0_t[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0_t[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0_t[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1_t[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1_t[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1_t[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2_t[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2_t[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2_t[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3_t[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3_t[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3_t[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0_t[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1_t[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2_t[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1_t[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1_t[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2_t[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3_t[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0_t[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2_t[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3_t[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0_t[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1_t[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3_t[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H1, a, b, c, d, w1_t[1], MD5C20, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w2_t[0], MD5C21, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w2_t[3], MD5C22, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w3_t[2], MD5C23, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w0_t[1], MD5C24, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w1_t[0], MD5C25, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w1_t[3], MD5C26, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w2_t[2], MD5C27, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w3_t[1], MD5C28, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w0_t[0], MD5C29, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w0_t[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w1_t[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w2_t[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w3_t[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w3_t[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w0_t[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1_t[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3_t[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3_t[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0_t[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0_t[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2_t[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1_t[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3_t[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1_t[0], MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w2_t[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0_t[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2_t[1], MD5C3f, MD5S33); + + // sometimes (not rare at all) we need a third block :( + + if (remaining_bytes > 55) + { + // this is for sure the final block + + a += r_a; + b += r_b; + c += r_c; + d += r_d; + + r_a = a; + r_b = b; + r_c = c; + r_d = d; + + w0_t[0] = esalt_buf1[ 8]; + w0_t[1] = esalt_buf1[ 9]; + w0_t[2] = esalt_buf1[10]; + w0_t[3] = esalt_buf1[11]; + + w1_t[0] = esalt_buf1[12]; + w1_t[1] = esalt_buf1[13]; + w1_t[2] = esalt_buf1[14]; + w1_t[3] = esalt_buf1[15]; + + w2_t[0] = esalt_buf2[ 0]; + w2_t[1] = esalt_buf2[ 1]; + w2_t[2] = esalt_buf2[ 2]; + w2_t[3] = esalt_buf2[ 3]; + + w3_t[0] = esalt_buf2[ 4]; + w3_t[1] = esalt_buf2[ 5]; + w3_t[2] = digest_esalt_len * 8; + w3_t[3] = 0; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0_t[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0_t[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0_t[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1_t[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1_t[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1_t[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2_t[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2_t[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2_t[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3_t[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3_t[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3_t[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0_t[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1_t[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2_t[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1_t[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1_t[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2_t[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3_t[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0_t[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2_t[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3_t[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0_t[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1_t[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3_t[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H1, a, b, c, d, w1_t[1], MD5C20, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w2_t[0], MD5C21, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w2_t[3], MD5C22, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w3_t[2], MD5C23, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w0_t[1], MD5C24, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w1_t[0], MD5C25, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w1_t[3], MD5C26, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w2_t[2], MD5C27, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w3_t[1], MD5C28, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w0_t[0], MD5C29, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w0_t[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w1_t[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w2_t[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w3_t[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w3_t[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w0_t[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1_t[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3_t[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3_t[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0_t[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0_t[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2_t[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1_t[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3_t[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1_t[0], MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w2_t[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0_t[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2_t[1], MD5C3f, MD5S33); + } + + a += r_a; + b += r_b; + c += r_c; + d += r_d; + + const u32x r0 = a; + const u32x r1 = d; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_S + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m11400_s08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global sip_t *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m11400_s16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global sip_t *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/amd/m11400_a1.cl b/amd/m11400_a1.cl new file mode 100644 index 0000000000..22c6c4c25c --- /dev/null +++ b/amd/m11400_a1.cl @@ -0,0 +1,2500 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _MD5_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW4 +#define VECT_SIZE4 +#endif + +#ifdef VLIW5 +#define VECT_SIZE4 +#endif + +#define DGST_R0 0 +#define DGST_R1 3 +#define DGST_R2 2 +#define DGST_R3 1 + +#include "include/kernel_functions.c" +#include "types_amd.c" +#include "common_amd.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +#ifdef VECT_SIZE1 +#define uint_to_hex_lower8(i) l_bin2asc[(i)] +#endif + +#ifdef VECT_SIZE2 +#define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1]) +#endif + +#ifdef VECT_SIZE4 +#define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3]) +#endif + +static u32 memcat32 (u32x block0[16], u32x block1[16], const u32 block_len, const u32x append0[4], const u32x append1[4], const u32x append2[4], const u32x append3[4], const u32 append_len) +{ + const u32 mod = block_len & 3; + const u32 div = block_len / 4; + + const int offset_minus_4 = 4 - mod; + + u32x append0_t[4]; + + append0_t[0] = amd_bytealign (append0[0], 0, offset_minus_4); + append0_t[1] = amd_bytealign (append0[1], append0[0], offset_minus_4); + append0_t[2] = amd_bytealign (append0[2], append0[1], offset_minus_4); + append0_t[3] = amd_bytealign (append0[3], append0[2], offset_minus_4); + + u32x append1_t[4]; + + append1_t[0] = amd_bytealign (append1[0], append0[3], offset_minus_4); + append1_t[1] = amd_bytealign (append1[1], append1[0], offset_minus_4); + append1_t[2] = amd_bytealign (append1[2], append1[1], offset_minus_4); + append1_t[3] = amd_bytealign (append1[3], append1[2], offset_minus_4); + + u32x append2_t[4]; + + append2_t[0] = amd_bytealign (append2[0], append1[3], offset_minus_4); + append2_t[1] = amd_bytealign (append2[1], append2[0], offset_minus_4); + append2_t[2] = amd_bytealign (append2[2], append2[1], offset_minus_4); + append2_t[3] = amd_bytealign (append2[3], append2[2], offset_minus_4); + + u32x append3_t[4]; + + append3_t[0] = amd_bytealign (append3[0], append2[3], offset_minus_4); + append3_t[1] = amd_bytealign (append3[1], append3[0], offset_minus_4); + append3_t[2] = amd_bytealign (append3[2], append3[1], offset_minus_4); + append3_t[3] = amd_bytealign (append3[3], append3[2], offset_minus_4); + + u32x append4_t[4]; + + append4_t[0] = amd_bytealign ( 0, append3[3], offset_minus_4); + append4_t[1] = 0; + append4_t[2] = 0; + append4_t[3] = 0; + + if (mod == 0) + { + append0_t[0] = append0[0]; + append0_t[1] = append0[1]; + append0_t[2] = append0[2]; + append0_t[3] = append0[3]; + + append1_t[0] = append1[0]; + append1_t[1] = append1[1]; + append1_t[2] = append1[2]; + append1_t[3] = append1[3]; + + append2_t[0] = append2[0]; + append2_t[1] = append2[1]; + append2_t[2] = append2[2]; + append2_t[3] = append2[3]; + + append3_t[0] = append3[0]; + append3_t[1] = append3[1]; + append3_t[2] = append3[2]; + append3_t[3] = append3[3]; + + append4_t[0] = 0; + append4_t[1] = 0; + append4_t[2] = 0; + append4_t[3] = 0; + } + + switch (div) + { + case 0: block0[ 0] |= append0_t[0]; + block0[ 1] = append0_t[1]; + block0[ 2] = append0_t[2]; + block0[ 3] = append0_t[3]; + + block0[ 4] = append1_t[0]; + block0[ 5] = append1_t[1]; + block0[ 6] = append1_t[2]; + block0[ 7] = append1_t[3]; + + block0[ 8] = append2_t[0]; + block0[ 9] = append2_t[1]; + block0[10] = append2_t[2]; + block0[11] = append2_t[3]; + + block0[12] = append3_t[0]; + block0[13] = append3_t[1]; + block0[14] = append3_t[2]; + block0[15] = append3_t[3]; + + block1[ 0] = append4_t[0]; + block1[ 1] = append4_t[1]; + block1[ 2] = append4_t[2]; + block1[ 3] = append4_t[3]; + break; + + case 1: block0[ 1] |= append0_t[0]; + block0[ 2] = append0_t[1]; + block0[ 3] = append0_t[2]; + block0[ 4] = append0_t[3]; + + block0[ 5] = append1_t[0]; + block0[ 6] = append1_t[1]; + block0[ 7] = append1_t[2]; + block0[ 8] = append1_t[3]; + + block0[ 9] = append2_t[0]; + block0[10] = append2_t[1]; + block0[11] = append2_t[2]; + block0[12] = append2_t[3]; + + block0[13] = append3_t[0]; + block0[14] = append3_t[1]; + block0[15] = append3_t[2]; + block1[ 0] = append3_t[3]; + + block1[ 1] = append4_t[0]; + block1[ 2] = append4_t[1]; + block1[ 3] = append4_t[2]; + block1[ 4] = append4_t[3]; + break; + + case 2: block0[ 2] |= append0_t[0]; + block0[ 3] = append0_t[1]; + block0[ 4] = append0_t[2]; + block0[ 5] = append0_t[3]; + + block0[ 6] = append1_t[0]; + block0[ 7] = append1_t[1]; + block0[ 8] = append1_t[2]; + block0[ 9] = append1_t[3]; + + block0[10] = append2_t[0]; + block0[11] = append2_t[1]; + block0[12] = append2_t[2]; + block0[13] = append2_t[3]; + + block0[14] = append3_t[0]; + block0[15] = append3_t[1]; + block1[ 0] = append3_t[2]; + block1[ 1] = append3_t[3]; + + block1[ 2] = append4_t[0]; + block1[ 3] = append4_t[1]; + block1[ 4] = append4_t[2]; + block1[ 5] = append4_t[3]; + break; + + case 3: block0[ 3] |= append0_t[0]; + block0[ 4] = append0_t[1]; + block0[ 5] = append0_t[2]; + block0[ 6] = append0_t[3]; + + block0[ 7] = append1_t[0]; + block0[ 8] = append1_t[1]; + block0[ 9] = append1_t[2]; + block0[10] = append1_t[3]; + + block0[11] = append2_t[0]; + block0[12] = append2_t[1]; + block0[13] = append2_t[2]; + block0[14] = append2_t[3]; + + block0[15] = append3_t[0]; + block1[ 0] = append3_t[1]; + block1[ 1] = append3_t[2]; + block1[ 2] = append3_t[3]; + + block1[ 3] = append4_t[0]; + block1[ 4] = append4_t[1]; + block1[ 5] = append4_t[2]; + block1[ 6] = append4_t[3]; + break; + + case 4: block0[ 4] |= append0_t[0]; + block0[ 5] = append0_t[1]; + block0[ 6] = append0_t[2]; + block0[ 7] = append0_t[3]; + + block0[ 8] = append1_t[0]; + block0[ 9] = append1_t[1]; + block0[10] = append1_t[2]; + block0[11] = append1_t[3]; + + block0[12] = append2_t[0]; + block0[13] = append2_t[1]; + block0[14] = append2_t[2]; + block0[15] = append2_t[3]; + + block1[ 0] = append3_t[0]; + block1[ 1] = append3_t[1]; + block1[ 2] = append3_t[2]; + block1[ 3] = append3_t[3]; + + block1[ 4] = append4_t[0]; + block1[ 5] = append4_t[1]; + block1[ 6] = append4_t[2]; + block1[ 7] = append4_t[3]; + break; + + case 5: block0[ 5] |= append0_t[0]; + block0[ 6] = append0_t[1]; + block0[ 7] = append0_t[2]; + block0[ 8] = append0_t[3]; + + block0[ 9] = append1_t[0]; + block0[10] = append1_t[1]; + block0[11] = append1_t[2]; + block0[12] = append1_t[3]; + + block0[13] = append2_t[0]; + block0[14] = append2_t[1]; + block0[15] = append2_t[2]; + block1[ 0] = append2_t[3]; + + block1[ 1] = append3_t[0]; + block1[ 2] = append3_t[1]; + block1[ 3] = append3_t[2]; + block1[ 4] = append3_t[3]; + + block1[ 5] = append4_t[0]; + block1[ 6] = append4_t[1]; + block1[ 7] = append4_t[2]; + block1[ 8] = append4_t[3]; + break; + + case 6: block0[ 6] |= append0_t[0]; + block0[ 7] = append0_t[1]; + block0[ 8] = append0_t[2]; + block0[ 9] = append0_t[3]; + + block0[10] = append1_t[0]; + block0[11] = append1_t[1]; + block0[12] = append1_t[2]; + block0[13] = append1_t[3]; + + block0[14] = append2_t[0]; + block0[15] = append2_t[1]; + block1[ 0] = append2_t[2]; + block1[ 1] = append2_t[3]; + + block1[ 2] = append3_t[0]; + block1[ 3] = append3_t[1]; + block1[ 4] = append3_t[2]; + block1[ 5] = append3_t[3]; + + block1[ 6] = append4_t[0]; + block1[ 7] = append4_t[1]; + block1[ 8] = append4_t[2]; + block1[ 9] = append4_t[3]; + break; + + case 7: block0[ 7] |= append0_t[0]; + block0[ 8] = append0_t[1]; + block0[ 9] = append0_t[2]; + block0[10] = append0_t[3]; + + block0[11] = append1_t[0]; + block0[12] = append1_t[1]; + block0[13] = append1_t[2]; + block0[14] = append1_t[3]; + + block0[15] = append2_t[0]; + block1[ 0] = append2_t[1]; + block1[ 1] = append2_t[2]; + block1[ 2] = append2_t[3]; + + block1[ 3] = append3_t[0]; + block1[ 4] = append3_t[1]; + block1[ 5] = append3_t[2]; + block1[ 6] = append3_t[3]; + + block1[ 7] = append4_t[0]; + block1[ 8] = append4_t[1]; + block1[ 9] = append4_t[2]; + block1[10] = append4_t[3]; + break; + + case 8: block0[ 8] |= append0_t[0]; + block0[ 9] = append0_t[1]; + block0[10] = append0_t[2]; + block0[11] = append0_t[3]; + + block0[12] = append1_t[0]; + block0[13] = append1_t[1]; + block0[14] = append1_t[2]; + block0[15] = append1_t[3]; + + block1[ 0] = append2_t[0]; + block1[ 1] = append2_t[1]; + block1[ 2] = append2_t[2]; + block1[ 3] = append2_t[3]; + + block1[ 4] = append3_t[0]; + block1[ 5] = append3_t[1]; + block1[ 6] = append3_t[2]; + block1[ 7] = append3_t[3]; + + block1[ 8] = append4_t[0]; + block1[ 9] = append4_t[1]; + block1[10] = append4_t[2]; + block1[11] = append4_t[3]; + break; + + case 9: block0[ 9] |= append0_t[0]; + block0[10] = append0_t[1]; + block0[11] = append0_t[2]; + block0[12] = append0_t[3]; + + block0[13] = append1_t[0]; + block0[14] = append1_t[1]; + block0[15] = append1_t[2]; + block1[ 0] = append1_t[3]; + + block1[ 1] = append2_t[0]; + block1[ 2] = append2_t[1]; + block1[ 3] = append2_t[2]; + block1[ 4] = append2_t[3]; + + block1[ 5] = append3_t[0]; + block1[ 6] = append3_t[1]; + block1[ 7] = append3_t[2]; + block1[ 8] = append3_t[3]; + + block1[ 9] = append4_t[0]; + block1[10] = append4_t[1]; + block1[11] = append4_t[2]; + block1[12] = append4_t[3]; + break; + + case 10: block0[10] |= append0_t[0]; + block0[11] = append0_t[1]; + block0[12] = append0_t[2]; + block0[13] = append0_t[3]; + + block0[14] = append1_t[0]; + block0[15] = append1_t[1]; + block1[ 0] = append1_t[2]; + block1[ 1] = append1_t[3]; + + block1[ 2] = append2_t[0]; + block1[ 3] = append2_t[1]; + block1[ 4] = append2_t[2]; + block1[ 5] = append2_t[3]; + + block1[ 6] = append3_t[0]; + block1[ 7] = append3_t[1]; + block1[ 8] = append3_t[2]; + block1[ 9] = append3_t[3]; + + block1[10] = append4_t[0]; + block1[11] = append4_t[1]; + block1[12] = append4_t[2]; + block1[13] = append4_t[3]; + break; + + case 11: block0[11] |= append0_t[0]; + block0[12] = append0_t[1]; + block0[13] = append0_t[2]; + block0[14] = append0_t[3]; + + block0[15] = append1_t[0]; + block1[ 0] = append1_t[1]; + block1[ 1] = append1_t[2]; + block1[ 2] = append1_t[3]; + + block1[ 3] = append2_t[0]; + block1[ 4] = append2_t[1]; + block1[ 5] = append2_t[2]; + block1[ 6] = append2_t[3]; + + block1[ 7] = append3_t[0]; + block1[ 8] = append3_t[1]; + block1[ 9] = append3_t[2]; + block1[10] = append3_t[3]; + + block1[11] = append4_t[0]; + block1[12] = append4_t[1]; + block1[13] = append4_t[2]; + block1[14] = append4_t[3]; + break; + + case 12: block0[12] |= append0_t[0]; + block0[13] = append0_t[1]; + block0[14] = append0_t[2]; + block0[15] = append0_t[3]; + + block1[ 0] = append1_t[0]; + block1[ 1] = append1_t[1]; + block1[ 2] = append1_t[2]; + block1[ 3] = append1_t[3]; + + block1[ 4] = append2_t[0]; + block1[ 5] = append2_t[1]; + block1[ 6] = append2_t[2]; + block1[ 7] = append2_t[3]; + + block1[ 8] = append3_t[0]; + block1[ 9] = append3_t[1]; + block1[10] = append3_t[2]; + block1[11] = append3_t[3]; + + block1[12] = append4_t[0]; + block1[13] = append4_t[1]; + block1[14] = append4_t[2]; + block1[15] = append4_t[3]; + break; + + case 13: block0[13] |= append0_t[0]; + block0[14] = append0_t[1]; + block0[15] = append0_t[2]; + block1[ 0] = append0_t[3]; + + block1[ 1] = append1_t[0]; + block1[ 2] = append1_t[1]; + block1[ 3] = append1_t[2]; + block1[ 4] = append1_t[3]; + + block1[ 5] = append2_t[0]; + block1[ 6] = append2_t[1]; + block1[ 7] = append2_t[2]; + block1[ 8] = append2_t[3]; + + block1[ 9] = append3_t[0]; + block1[10] = append3_t[1]; + block1[11] = append3_t[2]; + block1[12] = append3_t[3]; + + block1[13] = append4_t[0]; + block1[14] = append4_t[1]; + block1[15] = append4_t[2]; + break; + + case 14: block0[14] |= append0_t[0]; + block0[15] = append0_t[1]; + block1[ 0] = append0_t[2]; + block1[ 1] = append0_t[3]; + + block1[ 2] = append1_t[0]; + block1[ 3] = append1_t[1]; + block1[ 4] = append1_t[2]; + block1[ 5] = append1_t[3]; + + block1[ 6] = append2_t[0]; + block1[ 7] = append2_t[1]; + block1[ 8] = append2_t[2]; + block1[ 9] = append2_t[3]; + + block1[10] = append3_t[0]; + block1[11] = append3_t[1]; + block1[12] = append3_t[2]; + block1[13] = append3_t[3]; + + block1[14] = append4_t[0]; + block1[15] = append4_t[1]; + break; + + case 15: block0[15] |= append0_t[0]; + block1[ 0] = append0_t[1]; + block1[ 1] = append0_t[2]; + block1[ 2] = append0_t[3]; + + block1[ 3] = append1_t[1]; + block1[ 4] = append1_t[2]; + block1[ 5] = append1_t[3]; + block1[ 6] = append1_t[0]; + + block1[ 7] = append2_t[0]; + block1[ 8] = append2_t[1]; + block1[ 9] = append2_t[2]; + block1[10] = append2_t[3]; + + block1[11] = append3_t[0]; + block1[12] = append3_t[1]; + block1[13] = append3_t[2]; + block1[14] = append3_t[3]; + + block1[15] = append4_t[0]; + break; + + case 16: block1[ 0] |= append0_t[0]; + block1[ 1] = append0_t[1]; + block1[ 2] = append0_t[2]; + block1[ 3] = append0_t[3]; + + block1[ 4] = append1_t[0]; + block1[ 5] = append1_t[1]; + block1[ 6] = append1_t[2]; + block1[ 7] = append1_t[3]; + + block1[ 8] = append2_t[0]; + block1[ 9] = append2_t[1]; + block1[10] = append2_t[2]; + block1[11] = append2_t[3]; + + block1[12] = append3_t[0]; + block1[13] = append3_t[1]; + block1[14] = append3_t[2]; + block1[15] = append3_t[3]; + break; + + case 17: block1[ 1] |= append0_t[0]; + block1[ 2] = append0_t[1]; + block1[ 3] = append0_t[2]; + block1[ 4] = append0_t[3]; + + block1[ 5] = append1_t[0]; + block1[ 6] = append1_t[1]; + block1[ 7] = append1_t[2]; + block1[ 8] = append1_t[3]; + + block1[ 9] = append2_t[0]; + block1[10] = append2_t[1]; + block1[11] = append2_t[2]; + block1[12] = append2_t[3]; + + block1[13] = append3_t[0]; + block1[14] = append3_t[1]; + block1[15] = append3_t[2]; + break; + + case 18: block1[ 2] |= append0_t[0]; + block1[ 3] = append0_t[1]; + block1[ 4] = append0_t[2]; + block1[ 5] = append0_t[3]; + + block1[ 6] = append1_t[0]; + block1[ 7] = append1_t[1]; + block1[ 8] = append1_t[2]; + block1[ 9] = append1_t[3]; + + block1[10] = append2_t[0]; + block1[11] = append2_t[1]; + block1[12] = append2_t[2]; + block1[13] = append2_t[3]; + + block1[14] = append3_t[0]; + block1[15] = append3_t[1]; + break; + + case 19: block1[ 3] |= append0_t[0]; + block1[ 4] = append0_t[1]; + block1[ 5] = append0_t[2]; + block1[ 6] = append0_t[3]; + + block1[ 7] = append1_t[0]; + block1[ 8] = append1_t[1]; + block1[ 9] = append1_t[2]; + block1[10] = append1_t[3]; + + block1[11] = append2_t[0]; + block1[12] = append2_t[1]; + block1[13] = append2_t[2]; + block1[14] = append2_t[3]; + + block1[15] = append3_t[0]; + break; + + case 20: block1[ 4] |= append0_t[0]; + block1[ 5] = append0_t[1]; + block1[ 6] = append0_t[2]; + block1[ 7] = append0_t[3]; + + block1[ 8] = append1_t[0]; + block1[ 9] = append1_t[1]; + block1[10] = append1_t[2]; + block1[11] = append1_t[3]; + + block1[12] = append2_t[0]; + block1[13] = append2_t[1]; + block1[14] = append2_t[2]; + block1[15] = append2_t[3]; + break; + + case 21: block1[ 5] |= append0_t[0]; + block1[ 6] = append0_t[1]; + block1[ 7] = append0_t[2]; + block1[ 8] = append0_t[3]; + + block1[ 9] = append1_t[0]; + block1[10] = append1_t[1]; + block1[11] = append1_t[2]; + block1[12] = append1_t[3]; + + block1[13] = append2_t[0]; + block1[14] = append2_t[1]; + block1[15] = append2_t[2]; + break; + + case 22: block1[ 6] |= append0_t[0]; + block1[ 7] = append0_t[1]; + block1[ 8] = append0_t[2]; + block1[ 9] = append0_t[3]; + + block1[10] = append1_t[0]; + block1[11] = append1_t[1]; + block1[12] = append1_t[2]; + block1[13] = append1_t[3]; + + block1[14] = append2_t[0]; + block1[15] = append2_t[1]; + break; + + case 23: block1[ 7] |= append0_t[0]; + block1[ 8] = append0_t[1]; + block1[ 9] = append0_t[2]; + block1[10] = append0_t[3]; + + block1[11] = append1_t[0]; + block1[12] = append1_t[1]; + block1[13] = append1_t[2]; + block1[14] = append1_t[3]; + + block1[15] = append2_t[0]; + break; + + case 24: block1[ 8] |= append0_t[0]; + block1[ 9] = append0_t[1]; + block1[10] = append0_t[2]; + block1[11] = append0_t[3]; + + block1[12] = append1_t[0]; + block1[13] = append1_t[1]; + block1[14] = append1_t[2]; + block1[15] = append1_t[3]; + break; + + case 25: block1[ 9] |= append0_t[0]; + block1[10] = append0_t[1]; + block1[11] = append0_t[2]; + block1[12] = append0_t[3]; + + block1[13] = append1_t[0]; + block1[14] = append1_t[1]; + block1[15] = append1_t[2]; + break; + + case 26: block1[10] |= append0_t[0]; + block1[11] = append0_t[1]; + block1[12] = append0_t[2]; + block1[13] = append0_t[3]; + + block1[14] = append1_t[0]; + block1[15] = append1_t[1]; + break; + + case 27: block1[11] |= append0_t[0]; + block1[12] = append0_t[1]; + block1[13] = append0_t[2]; + block1[14] = append0_t[3]; + + block1[15] = append1_t[0]; + break; + + case 28: block1[12] |= append0_t[0]; + block1[13] = append0_t[1]; + block1[14] = append0_t[2]; + block1[15] = append0_t[3]; + break; + + case 29: block1[13] |= append0_t[0]; + block1[14] = append0_t[1]; + block1[15] = append0_t[2]; + break; + + case 30: block1[14] |= append0_t[0]; + block1[15] = append0_t[1]; + break; + } + + u32 new_len = block_len + append_len; + + return new_len; +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m11400_m04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global sip_t *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + /** + * bin2asc table + */ + + __local u32 l_bin2asc[256]; + + const u32 lid4 = lid * 4; + + const u32 lid40 = lid4 + 0; + const u32 lid41 = lid4 + 1; + const u32 lid42 = lid4 + 2; + const u32 lid43 = lid4 + 3; + + const u32 v400 = (lid40 >> 0) & 15; + const u32 v401 = (lid40 >> 4) & 15; + const u32 v410 = (lid41 >> 0) & 15; + const u32 v411 = (lid41 >> 4) & 15; + const u32 v420 = (lid42 >> 0) & 15; + const u32 v421 = (lid42 >> 4) & 15; + const u32 v430 = (lid43 >> 0) & 15; + const u32 v431 = (lid43 >> 4) & 15; + + l_bin2asc[lid40] = ((v400 < 10) ? '0' + v400 : 'a' - 10 + v400) << 8 + | ((v401 < 10) ? '0' + v401 : 'a' - 10 + v401) << 0; + l_bin2asc[lid41] = ((v410 < 10) ? '0' + v410 : 'a' - 10 + v410) << 8 + | ((v411 < 10) ? '0' + v411 : 'a' - 10 + v411) << 0; + l_bin2asc[lid42] = ((v420 < 10) ? '0' + v420 : 'a' - 10 + v420) << 8 + | ((v421 < 10) ? '0' + v421 : 'a' - 10 + v421) << 0; + l_bin2asc[lid43] = ((v430 < 10) ? '0' + v430 : 'a' - 10 + v430) << 8 + | ((v431 < 10) ? '0' + v431 : 'a' - 10 + v431) << 0; + + barrier (CLK_LOCAL_MEM_FENCE); + + if (gid >= gid_max) return; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + append_0x80_2 (wordl0, wordl1, pw_l_len); + + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, combs_buf[0].pw_len); + } + + /** + * salt + */ + + const u32 salt_len = esalt_bufs[salt_pos].salt_len; // not a bug, we need to get it from the esalt + + u32 salt_buf0[16]; + + salt_buf0[ 0] = esalt_bufs[salt_pos].salt_buf[ 0]; + salt_buf0[ 1] = esalt_bufs[salt_pos].salt_buf[ 1]; + salt_buf0[ 2] = esalt_bufs[salt_pos].salt_buf[ 2]; + salt_buf0[ 3] = esalt_bufs[salt_pos].salt_buf[ 3]; + salt_buf0[ 4] = esalt_bufs[salt_pos].salt_buf[ 4]; + salt_buf0[ 5] = esalt_bufs[salt_pos].salt_buf[ 5]; + salt_buf0[ 6] = esalt_bufs[salt_pos].salt_buf[ 6]; + salt_buf0[ 7] = esalt_bufs[salt_pos].salt_buf[ 7]; + salt_buf0[ 8] = esalt_bufs[salt_pos].salt_buf[ 8]; + salt_buf0[ 9] = esalt_bufs[salt_pos].salt_buf[ 9]; + salt_buf0[10] = esalt_bufs[salt_pos].salt_buf[10]; + salt_buf0[11] = esalt_bufs[salt_pos].salt_buf[11]; + salt_buf0[12] = esalt_bufs[salt_pos].salt_buf[12]; + salt_buf0[13] = esalt_bufs[salt_pos].salt_buf[13]; + salt_buf0[14] = esalt_bufs[salt_pos].salt_buf[14]; + salt_buf0[15] = esalt_bufs[salt_pos].salt_buf[15]; + + u32 salt_buf1[16]; + + salt_buf1[ 0] = esalt_bufs[salt_pos].salt_buf[16]; + salt_buf1[ 1] = esalt_bufs[salt_pos].salt_buf[17]; + salt_buf1[ 2] = esalt_bufs[salt_pos].salt_buf[18]; + salt_buf1[ 3] = esalt_bufs[salt_pos].salt_buf[19]; + salt_buf1[ 4] = esalt_bufs[salt_pos].salt_buf[20]; + salt_buf1[ 5] = esalt_bufs[salt_pos].salt_buf[21]; + salt_buf1[ 6] = esalt_bufs[salt_pos].salt_buf[22]; + salt_buf1[ 7] = esalt_bufs[salt_pos].salt_buf[23]; + salt_buf1[ 8] = esalt_bufs[salt_pos].salt_buf[24]; + salt_buf1[ 9] = esalt_bufs[salt_pos].salt_buf[25]; + salt_buf1[10] = esalt_bufs[salt_pos].salt_buf[26]; + salt_buf1[11] = esalt_bufs[salt_pos].salt_buf[27]; + salt_buf1[12] = esalt_bufs[salt_pos].salt_buf[28]; + salt_buf1[13] = esalt_bufs[salt_pos].salt_buf[29]; + salt_buf1[14] = 0; + salt_buf1[15] = 0; + + /** + * esalt + */ + + const u32 esalt_len = esalt_bufs[salt_pos].esalt_len; + + u32 esalt_buf0[16]; + + esalt_buf0[ 0] = esalt_bufs[salt_pos].esalt_buf[ 0]; + esalt_buf0[ 1] = esalt_bufs[salt_pos].esalt_buf[ 1]; + esalt_buf0[ 2] = esalt_bufs[salt_pos].esalt_buf[ 2]; + esalt_buf0[ 3] = esalt_bufs[salt_pos].esalt_buf[ 3]; + esalt_buf0[ 4] = esalt_bufs[salt_pos].esalt_buf[ 4]; + esalt_buf0[ 5] = esalt_bufs[salt_pos].esalt_buf[ 5]; + esalt_buf0[ 6] = esalt_bufs[salt_pos].esalt_buf[ 6]; + esalt_buf0[ 7] = esalt_bufs[salt_pos].esalt_buf[ 7]; + esalt_buf0[ 8] = esalt_bufs[salt_pos].esalt_buf[ 8]; + esalt_buf0[ 9] = esalt_bufs[salt_pos].esalt_buf[ 9]; + esalt_buf0[10] = esalt_bufs[salt_pos].esalt_buf[10]; + esalt_buf0[11] = esalt_bufs[salt_pos].esalt_buf[11]; + esalt_buf0[12] = esalt_bufs[salt_pos].esalt_buf[12]; + esalt_buf0[13] = esalt_bufs[salt_pos].esalt_buf[13]; + esalt_buf0[14] = esalt_bufs[salt_pos].esalt_buf[14]; + esalt_buf0[15] = esalt_bufs[salt_pos].esalt_buf[15]; + + u32 esalt_buf1[16]; + + esalt_buf1[ 0] = esalt_bufs[salt_pos].esalt_buf[16]; + esalt_buf1[ 1] = esalt_bufs[salt_pos].esalt_buf[17]; + esalt_buf1[ 2] = esalt_bufs[salt_pos].esalt_buf[18]; + esalt_buf1[ 3] = esalt_bufs[salt_pos].esalt_buf[19]; + esalt_buf1[ 4] = esalt_bufs[salt_pos].esalt_buf[20]; + esalt_buf1[ 5] = esalt_bufs[salt_pos].esalt_buf[21]; + esalt_buf1[ 6] = esalt_bufs[salt_pos].esalt_buf[22]; + esalt_buf1[ 7] = esalt_bufs[salt_pos].esalt_buf[23]; + esalt_buf1[ 8] = esalt_bufs[salt_pos].esalt_buf[24]; + esalt_buf1[ 9] = esalt_bufs[salt_pos].esalt_buf[25]; + esalt_buf1[10] = esalt_bufs[salt_pos].esalt_buf[26]; + esalt_buf1[11] = esalt_bufs[salt_pos].esalt_buf[27]; + esalt_buf1[12] = esalt_bufs[salt_pos].esalt_buf[28]; + esalt_buf1[13] = esalt_bufs[salt_pos].esalt_buf[29]; + esalt_buf1[14] = esalt_bufs[salt_pos].esalt_buf[30]; + esalt_buf1[15] = esalt_bufs[salt_pos].esalt_buf[31]; + + u32 esalt_buf2[16]; + + esalt_buf2[ 0] = esalt_bufs[salt_pos].esalt_buf[32]; + esalt_buf2[ 1] = esalt_bufs[salt_pos].esalt_buf[33]; + esalt_buf2[ 2] = esalt_bufs[salt_pos].esalt_buf[34]; + esalt_buf2[ 3] = esalt_bufs[salt_pos].esalt_buf[35]; + esalt_buf2[ 4] = esalt_bufs[salt_pos].esalt_buf[36]; + esalt_buf2[ 5] = esalt_bufs[salt_pos].esalt_buf[37]; + esalt_buf2[ 6] = 0; + esalt_buf2[ 7] = 0; + esalt_buf2[ 8] = 0; + esalt_buf2[ 9] = 0; + esalt_buf2[10] = 0; + esalt_buf2[11] = 0; + esalt_buf2[12] = 0; + esalt_buf2[13] = 0; + esalt_buf2[14] = 0; + esalt_buf2[15] = 0; + + const u32 digest_esalt_len = 32 + esalt_len; + const u32 remaining_bytes = digest_esalt_len + 1 - 64; // substract previous block + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = combs_buf[il_pos].pw_len; + + const u32 pw_len = pw_l_len + pw_r_len; + + u32 wordr0[4]; + + wordr0[0] = combs_buf[il_pos].i[0]; + wordr0[1] = combs_buf[il_pos].i[1]; + wordr0[2] = combs_buf[il_pos].i[2]; + wordr0[3] = combs_buf[il_pos].i[3]; + + u32 wordr1[4]; + + wordr1[0] = combs_buf[il_pos].i[4]; + wordr1[1] = combs_buf[il_pos].i[5]; + wordr1[2] = combs_buf[il_pos].i[6]; + wordr1[3] = combs_buf[il_pos].i[7]; + + u32 wordr2[4]; + + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + + u32 wordr3[4]; + + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + u32x w0[4]; + + w0[0] = wordl0[0] | wordr0[0]; + w0[1] = wordl0[1] | wordr0[1]; + w0[2] = wordl0[2] | wordr0[2]; + w0[3] = wordl0[3] | wordr0[3]; + + u32x w1[4]; + + w1[0] = wordl1[0] | wordr1[0]; + w1[1] = wordl1[1] | wordr1[1]; + w1[2] = wordl1[2] | wordr1[2]; + w1[3] = wordl1[3] | wordr1[3]; + + u32x w2[4]; + + w2[0] = wordl2[0] | wordr2[0]; + w2[1] = wordl2[1] | wordr2[1]; + w2[2] = wordl2[2] | wordr2[2]; + w2[3] = wordl2[3] | wordr2[3]; + + u32x w3[4]; + + w3[0] = wordl3[0] | wordr3[0]; + w3[1] = wordl3[1] | wordr3[1]; + w3[2] = wordl3[2] | wordr3[2]; + w3[3] = wordl3[3] | wordr3[3]; + + const u32 pw_salt_len = salt_len + pw_len; + + /* + * HA1 = md5 ($salt . $pass) + */ + + // append the pass to the salt + + u32x block0[16]; + + block0[ 0] = salt_buf0[ 0]; + block0[ 1] = salt_buf0[ 1]; + block0[ 2] = salt_buf0[ 2]; + block0[ 3] = salt_buf0[ 3]; + block0[ 4] = salt_buf0[ 4]; + block0[ 5] = salt_buf0[ 5]; + block0[ 6] = salt_buf0[ 6]; + block0[ 7] = salt_buf0[ 7]; + block0[ 8] = salt_buf0[ 8]; + block0[ 9] = salt_buf0[ 9]; + block0[10] = salt_buf0[10]; + block0[11] = salt_buf0[11]; + block0[12] = salt_buf0[12]; + block0[13] = salt_buf0[13]; + block0[14] = salt_buf0[14]; + block0[15] = salt_buf0[15]; + + u32x block1[16]; + + block1[ 0] = salt_buf1[ 0]; + block1[ 1] = salt_buf1[ 1]; + block1[ 2] = salt_buf1[ 2]; + block1[ 3] = salt_buf1[ 3]; + block1[ 4] = salt_buf1[ 4]; + block1[ 5] = salt_buf1[ 5]; + block1[ 6] = salt_buf1[ 6]; + block1[ 7] = salt_buf1[ 7]; + block1[ 8] = salt_buf1[ 8]; + block1[ 9] = salt_buf1[ 9]; + block1[10] = salt_buf1[10]; + block1[11] = salt_buf1[11]; + block1[12] = salt_buf1[12]; + block1[13] = salt_buf1[13]; + block1[14] = salt_buf1[14]; + block1[15] = salt_buf1[15]; + + u32 block_len = 0; + + block_len = memcat32 (block0, block1, salt_len, w0, w1, w2, w3, pw_len); + + u32x w0_t[4]; + + w0_t[0] = block0[ 0]; + w0_t[1] = block0[ 1]; + w0_t[2] = block0[ 2]; + w0_t[3] = block0[ 3]; + + u32x w1_t[4]; + + w1_t[0] = block0[ 4]; + w1_t[1] = block0[ 5]; + w1_t[2] = block0[ 6]; + w1_t[3] = block0[ 7]; + + u32x w2_t[4]; + + w2_t[0] = block0[ 8]; + w2_t[1] = block0[ 9]; + w2_t[2] = block0[10]; + w2_t[3] = block0[11]; + + u32x w3_t[4]; + + w3_t[0] = block0[12]; + w3_t[1] = block0[13]; + w3_t[2] = block0[14]; + w3_t[3] = block0[15]; + + if (block_len < 56) + { + w3_t[2] = pw_salt_len * 8; + } + + // md5 + + u32x tmp2; + + u32x a = MD5M_A; + u32x b = MD5M_B; + u32x c = MD5M_C; + u32x d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0_t[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0_t[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0_t[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1_t[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1_t[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1_t[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2_t[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2_t[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2_t[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3_t[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3_t[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3_t[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0_t[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1_t[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2_t[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1_t[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1_t[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2_t[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3_t[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0_t[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2_t[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3_t[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0_t[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1_t[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3_t[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H1, a, b, c, d, w1_t[1], MD5C20, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w2_t[0], MD5C21, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w2_t[3], MD5C22, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w3_t[2], MD5C23, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w0_t[1], MD5C24, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w1_t[0], MD5C25, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w1_t[3], MD5C26, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w2_t[2], MD5C27, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w3_t[1], MD5C28, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w0_t[0], MD5C29, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w0_t[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w1_t[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w2_t[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w3_t[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w3_t[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w0_t[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1_t[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3_t[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3_t[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0_t[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0_t[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2_t[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1_t[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3_t[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1_t[0], MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w2_t[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0_t[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2_t[1], MD5C3f, MD5S33); + + a += MD5M_A; + b += MD5M_B; + c += MD5M_C; + d += MD5M_D; + + if (block_len > 55) + { + u32x r_a = a; + u32x r_b = b; + u32x r_c = c; + u32x r_d = d; + + w0_t[0] = block1[ 0]; + w0_t[1] = block1[ 1]; + w0_t[2] = block1[ 2]; + w0_t[3] = block1[ 3]; + + w1_t[0] = block1[ 4]; + w1_t[1] = block1[ 5]; + w1_t[2] = block1[ 6]; + w1_t[3] = block1[ 7]; + + w2_t[0] = block1[ 8]; + w2_t[1] = block1[ 9]; + w2_t[2] = block1[10]; + w2_t[3] = block1[11]; + + w3_t[0] = block1[12]; + w3_t[1] = block1[13]; + w3_t[2] = pw_salt_len * 8; + w3_t[3] = 0; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0_t[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0_t[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0_t[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1_t[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1_t[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1_t[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2_t[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2_t[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2_t[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3_t[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3_t[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3_t[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0_t[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1_t[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2_t[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1_t[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1_t[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2_t[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3_t[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0_t[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2_t[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3_t[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0_t[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1_t[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3_t[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H1, a, b, c, d, w1_t[1], MD5C20, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w2_t[0], MD5C21, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w2_t[3], MD5C22, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w3_t[2], MD5C23, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w0_t[1], MD5C24, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w1_t[0], MD5C25, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w1_t[3], MD5C26, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w2_t[2], MD5C27, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w3_t[1], MD5C28, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w0_t[0], MD5C29, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w0_t[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w1_t[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w2_t[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w3_t[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w3_t[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w0_t[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1_t[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3_t[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3_t[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0_t[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0_t[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2_t[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1_t[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3_t[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1_t[0], MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w2_t[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0_t[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2_t[1], MD5C3f, MD5S33); + + a += r_a; + b += r_b; + c += r_c; + d += r_d; + } + + /* + * final = md5 ($HA1 . $esalt) + * we have at least 2 MD5 blocks/transformations, but we might need 3 + */ + + w0_t[0] = uint_to_hex_lower8 ((a >> 0) & 255) << 0 + | uint_to_hex_lower8 ((a >> 8) & 255) << 16; + w0_t[1] = uint_to_hex_lower8 ((a >> 16) & 255) << 0 + | uint_to_hex_lower8 ((a >> 24) & 255) << 16; + w0_t[2] = uint_to_hex_lower8 ((b >> 0) & 255) << 0 + | uint_to_hex_lower8 ((b >> 8) & 255) << 16; + w0_t[3] = uint_to_hex_lower8 ((b >> 16) & 255) << 0 + | uint_to_hex_lower8 ((b >> 24) & 255) << 16; + w1_t[0] = uint_to_hex_lower8 ((c >> 0) & 255) << 0 + | uint_to_hex_lower8 ((c >> 8) & 255) << 16; + w1_t[1] = uint_to_hex_lower8 ((c >> 16) & 255) << 0 + | uint_to_hex_lower8 ((c >> 24) & 255) << 16; + w1_t[2] = uint_to_hex_lower8 ((d >> 0) & 255) << 0 + | uint_to_hex_lower8 ((d >> 8) & 255) << 16; + w1_t[3] = uint_to_hex_lower8 ((d >> 16) & 255) << 0 + | uint_to_hex_lower8 ((d >> 24) & 255) << 16; + + w2_t[0] = esalt_buf0[0]; + w2_t[1] = esalt_buf0[1]; + w2_t[2] = esalt_buf0[2]; + w2_t[3] = esalt_buf0[3]; + + w3_t[0] = esalt_buf0[4]; + w3_t[1] = esalt_buf0[5]; + w3_t[2] = esalt_buf0[6]; + w3_t[3] = esalt_buf0[7]; + + // md5 + // 1st transform + + a = MD5M_A; + b = MD5M_B; + c = MD5M_C; + d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0_t[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0_t[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0_t[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1_t[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1_t[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1_t[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2_t[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2_t[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2_t[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3_t[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3_t[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3_t[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0_t[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1_t[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2_t[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1_t[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1_t[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2_t[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3_t[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0_t[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2_t[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3_t[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0_t[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1_t[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3_t[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H1, a, b, c, d, w1_t[1], MD5C20, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w2_t[0], MD5C21, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w2_t[3], MD5C22, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w3_t[2], MD5C23, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w0_t[1], MD5C24, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w1_t[0], MD5C25, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w1_t[3], MD5C26, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w2_t[2], MD5C27, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w3_t[1], MD5C28, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w0_t[0], MD5C29, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w0_t[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w1_t[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w2_t[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w3_t[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w3_t[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w0_t[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1_t[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3_t[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3_t[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0_t[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0_t[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2_t[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1_t[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3_t[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1_t[0], MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w2_t[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0_t[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2_t[1], MD5C3f, MD5S33); + + a += MD5M_A; + b += MD5M_B; + c += MD5M_C; + d += MD5M_D; + + u32x r_a = a; + u32x r_b = b; + u32x r_c = c; + u32x r_d = d; + + // 2nd transform + + w0_t[0] = esalt_buf0[ 8]; + w0_t[1] = esalt_buf0[ 9]; + w0_t[2] = esalt_buf0[10]; + w0_t[3] = esalt_buf0[11]; + + w1_t[0] = esalt_buf0[12]; + w1_t[1] = esalt_buf0[13]; + w1_t[2] = esalt_buf0[14]; + w1_t[3] = esalt_buf0[15]; + + w2_t[0] = esalt_buf1[ 0]; + w2_t[1] = esalt_buf1[ 1]; + w2_t[2] = esalt_buf1[ 2]; + w2_t[3] = esalt_buf1[ 3]; + + w3_t[0] = esalt_buf1[ 4]; + w3_t[1] = esalt_buf1[ 5]; + w3_t[2] = esalt_buf1[ 6]; + w3_t[3] = esalt_buf1[ 7]; + + // it is the final block when no more than 55 bytes left + + if (remaining_bytes < 56) + { + // it is the last block ! + + w3_t[2] = digest_esalt_len * 8; + } + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0_t[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0_t[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0_t[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1_t[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1_t[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1_t[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2_t[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2_t[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2_t[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3_t[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3_t[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3_t[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0_t[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1_t[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2_t[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1_t[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1_t[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2_t[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3_t[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0_t[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2_t[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3_t[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0_t[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1_t[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3_t[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H1, a, b, c, d, w1_t[1], MD5C20, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w2_t[0], MD5C21, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w2_t[3], MD5C22, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w3_t[2], MD5C23, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w0_t[1], MD5C24, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w1_t[0], MD5C25, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w1_t[3], MD5C26, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w2_t[2], MD5C27, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w3_t[1], MD5C28, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w0_t[0], MD5C29, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w0_t[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w1_t[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w2_t[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w3_t[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w3_t[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w0_t[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1_t[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3_t[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3_t[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0_t[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0_t[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2_t[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1_t[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3_t[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1_t[0], MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w2_t[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0_t[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2_t[1], MD5C3f, MD5S33); + + // sometimes (not rare at all) we need a third block :( + + if (remaining_bytes > 55) + { + // this is for sure the final block + + a += r_a; + b += r_b; + c += r_c; + d += r_d; + + r_a = a; + r_b = b; + r_c = c; + r_d = d; + + w0_t[0] = esalt_buf1[ 8]; + w0_t[1] = esalt_buf1[ 9]; + w0_t[2] = esalt_buf1[10]; + w0_t[3] = esalt_buf1[11]; + + w1_t[0] = esalt_buf1[12]; + w1_t[1] = esalt_buf1[13]; + w1_t[2] = esalt_buf1[14]; + w1_t[3] = esalt_buf1[15]; + + w2_t[0] = esalt_buf2[ 0]; + w2_t[1] = esalt_buf2[ 1]; + w2_t[2] = esalt_buf2[ 2]; + w2_t[3] = esalt_buf2[ 3]; + + w3_t[0] = esalt_buf2[ 4]; + w3_t[1] = esalt_buf2[ 5]; + w3_t[2] = digest_esalt_len * 8; + w3_t[3] = 0; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0_t[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0_t[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0_t[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1_t[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1_t[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1_t[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2_t[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2_t[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2_t[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3_t[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3_t[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3_t[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0_t[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1_t[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2_t[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1_t[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1_t[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2_t[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3_t[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0_t[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2_t[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3_t[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0_t[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1_t[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3_t[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H1, a, b, c, d, w1_t[1], MD5C20, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w2_t[0], MD5C21, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w2_t[3], MD5C22, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w3_t[2], MD5C23, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w0_t[1], MD5C24, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w1_t[0], MD5C25, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w1_t[3], MD5C26, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w2_t[2], MD5C27, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w3_t[1], MD5C28, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w0_t[0], MD5C29, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w0_t[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w1_t[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w2_t[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w3_t[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w3_t[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w0_t[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1_t[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3_t[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3_t[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0_t[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0_t[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2_t[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1_t[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3_t[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1_t[0], MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w2_t[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0_t[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2_t[1], MD5C3f, MD5S33); + } + + a += r_a; + b += r_b; + c += r_c; + d += r_d; + + const u32x r0 = a; + const u32x r1 = d; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_M + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m11400_m08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global sip_t *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m11400_m16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global sip_t *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m11400_s04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global sip_t *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + /** + * bin2asc table + */ + + __local u32 l_bin2asc[256]; + + const u32 lid4 = lid * 4; + + const u32 lid40 = lid4 + 0; + const u32 lid41 = lid4 + 1; + const u32 lid42 = lid4 + 2; + const u32 lid43 = lid4 + 3; + + const u32 v400 = (lid40 >> 0) & 15; + const u32 v401 = (lid40 >> 4) & 15; + const u32 v410 = (lid41 >> 0) & 15; + const u32 v411 = (lid41 >> 4) & 15; + const u32 v420 = (lid42 >> 0) & 15; + const u32 v421 = (lid42 >> 4) & 15; + const u32 v430 = (lid43 >> 0) & 15; + const u32 v431 = (lid43 >> 4) & 15; + + l_bin2asc[lid40] = ((v400 < 10) ? '0' + v400 : 'a' - 10 + v400) << 8 + | ((v401 < 10) ? '0' + v401 : 'a' - 10 + v401) << 0; + l_bin2asc[lid41] = ((v410 < 10) ? '0' + v410 : 'a' - 10 + v410) << 8 + | ((v411 < 10) ? '0' + v411 : 'a' - 10 + v411) << 0; + l_bin2asc[lid42] = ((v420 < 10) ? '0' + v420 : 'a' - 10 + v420) << 8 + | ((v421 < 10) ? '0' + v421 : 'a' - 10 + v421) << 0; + l_bin2asc[lid43] = ((v430 < 10) ? '0' + v430 : 'a' - 10 + v430) << 8 + | ((v431 < 10) ? '0' + v431 : 'a' - 10 + v431) << 0; + + barrier (CLK_LOCAL_MEM_FENCE); + + if (gid >= gid_max) return; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + append_0x80_2 (wordl0, wordl1, pw_l_len); + + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, combs_buf[0].pw_len); + } + + /** + * salt + */ + + const u32 salt_len = esalt_bufs[salt_pos].salt_len; // not a bug, we need to get it from the esalt + + u32 salt_buf0[16]; + + salt_buf0[ 0] = esalt_bufs[salt_pos].salt_buf[ 0]; + salt_buf0[ 1] = esalt_bufs[salt_pos].salt_buf[ 1]; + salt_buf0[ 2] = esalt_bufs[salt_pos].salt_buf[ 2]; + salt_buf0[ 3] = esalt_bufs[salt_pos].salt_buf[ 3]; + salt_buf0[ 4] = esalt_bufs[salt_pos].salt_buf[ 4]; + salt_buf0[ 5] = esalt_bufs[salt_pos].salt_buf[ 5]; + salt_buf0[ 6] = esalt_bufs[salt_pos].salt_buf[ 6]; + salt_buf0[ 7] = esalt_bufs[salt_pos].salt_buf[ 7]; + salt_buf0[ 8] = esalt_bufs[salt_pos].salt_buf[ 8]; + salt_buf0[ 9] = esalt_bufs[salt_pos].salt_buf[ 9]; + salt_buf0[10] = esalt_bufs[salt_pos].salt_buf[10]; + salt_buf0[11] = esalt_bufs[salt_pos].salt_buf[11]; + salt_buf0[12] = esalt_bufs[salt_pos].salt_buf[12]; + salt_buf0[13] = esalt_bufs[salt_pos].salt_buf[13]; + salt_buf0[14] = esalt_bufs[salt_pos].salt_buf[14]; + salt_buf0[15] = esalt_bufs[salt_pos].salt_buf[15]; + + u32 salt_buf1[16]; + + salt_buf1[ 0] = esalt_bufs[salt_pos].salt_buf[16]; + salt_buf1[ 1] = esalt_bufs[salt_pos].salt_buf[17]; + salt_buf1[ 2] = esalt_bufs[salt_pos].salt_buf[18]; + salt_buf1[ 3] = esalt_bufs[salt_pos].salt_buf[19]; + salt_buf1[ 4] = esalt_bufs[salt_pos].salt_buf[20]; + salt_buf1[ 5] = esalt_bufs[salt_pos].salt_buf[21]; + salt_buf1[ 6] = esalt_bufs[salt_pos].salt_buf[22]; + salt_buf1[ 7] = esalt_bufs[salt_pos].salt_buf[23]; + salt_buf1[ 8] = esalt_bufs[salt_pos].salt_buf[24]; + salt_buf1[ 9] = esalt_bufs[salt_pos].salt_buf[25]; + salt_buf1[10] = esalt_bufs[salt_pos].salt_buf[26]; + salt_buf1[11] = esalt_bufs[salt_pos].salt_buf[27]; + salt_buf1[12] = esalt_bufs[salt_pos].salt_buf[28]; + salt_buf1[13] = esalt_bufs[salt_pos].salt_buf[29]; + salt_buf1[14] = 0; + salt_buf1[15] = 0; + + /** + * esalt + */ + + const u32 esalt_len = esalt_bufs[salt_pos].esalt_len; + + u32 esalt_buf0[16]; + + esalt_buf0[ 0] = esalt_bufs[salt_pos].esalt_buf[ 0]; + esalt_buf0[ 1] = esalt_bufs[salt_pos].esalt_buf[ 1]; + esalt_buf0[ 2] = esalt_bufs[salt_pos].esalt_buf[ 2]; + esalt_buf0[ 3] = esalt_bufs[salt_pos].esalt_buf[ 3]; + esalt_buf0[ 4] = esalt_bufs[salt_pos].esalt_buf[ 4]; + esalt_buf0[ 5] = esalt_bufs[salt_pos].esalt_buf[ 5]; + esalt_buf0[ 6] = esalt_bufs[salt_pos].esalt_buf[ 6]; + esalt_buf0[ 7] = esalt_bufs[salt_pos].esalt_buf[ 7]; + esalt_buf0[ 8] = esalt_bufs[salt_pos].esalt_buf[ 8]; + esalt_buf0[ 9] = esalt_bufs[salt_pos].esalt_buf[ 9]; + esalt_buf0[10] = esalt_bufs[salt_pos].esalt_buf[10]; + esalt_buf0[11] = esalt_bufs[salt_pos].esalt_buf[11]; + esalt_buf0[12] = esalt_bufs[salt_pos].esalt_buf[12]; + esalt_buf0[13] = esalt_bufs[salt_pos].esalt_buf[13]; + esalt_buf0[14] = esalt_bufs[salt_pos].esalt_buf[14]; + esalt_buf0[15] = esalt_bufs[salt_pos].esalt_buf[15]; + + u32 esalt_buf1[16]; + + esalt_buf1[ 0] = esalt_bufs[salt_pos].esalt_buf[16]; + esalt_buf1[ 1] = esalt_bufs[salt_pos].esalt_buf[17]; + esalt_buf1[ 2] = esalt_bufs[salt_pos].esalt_buf[18]; + esalt_buf1[ 3] = esalt_bufs[salt_pos].esalt_buf[19]; + esalt_buf1[ 4] = esalt_bufs[salt_pos].esalt_buf[20]; + esalt_buf1[ 5] = esalt_bufs[salt_pos].esalt_buf[21]; + esalt_buf1[ 6] = esalt_bufs[salt_pos].esalt_buf[22]; + esalt_buf1[ 7] = esalt_bufs[salt_pos].esalt_buf[23]; + esalt_buf1[ 8] = esalt_bufs[salt_pos].esalt_buf[24]; + esalt_buf1[ 9] = esalt_bufs[salt_pos].esalt_buf[25]; + esalt_buf1[10] = esalt_bufs[salt_pos].esalt_buf[26]; + esalt_buf1[11] = esalt_bufs[salt_pos].esalt_buf[27]; + esalt_buf1[12] = esalt_bufs[salt_pos].esalt_buf[28]; + esalt_buf1[13] = esalt_bufs[salt_pos].esalt_buf[29]; + esalt_buf1[14] = esalt_bufs[salt_pos].esalt_buf[30]; + esalt_buf1[15] = esalt_bufs[salt_pos].esalt_buf[31]; + + u32 esalt_buf2[16]; + + esalt_buf2[ 0] = esalt_bufs[salt_pos].esalt_buf[32]; + esalt_buf2[ 1] = esalt_bufs[salt_pos].esalt_buf[33]; + esalt_buf2[ 2] = esalt_bufs[salt_pos].esalt_buf[34]; + esalt_buf2[ 3] = esalt_bufs[salt_pos].esalt_buf[35]; + esalt_buf2[ 4] = esalt_bufs[salt_pos].esalt_buf[36]; + esalt_buf2[ 5] = esalt_bufs[salt_pos].esalt_buf[37]; + esalt_buf2[ 6] = 0; + esalt_buf2[ 7] = 0; + esalt_buf2[ 8] = 0; + esalt_buf2[ 9] = 0; + esalt_buf2[10] = 0; + esalt_buf2[11] = 0; + esalt_buf2[12] = 0; + esalt_buf2[13] = 0; + esalt_buf2[14] = 0; + esalt_buf2[15] = 0; + + const u32 digest_esalt_len = 32 + esalt_len; + const u32 remaining_bytes = digest_esalt_len + 1 - 64; // substract previous block + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = combs_buf[il_pos].pw_len; + + const u32 pw_len = pw_l_len + pw_r_len; + + u32 wordr0[4]; + + wordr0[0] = combs_buf[il_pos].i[0]; + wordr0[1] = combs_buf[il_pos].i[1]; + wordr0[2] = combs_buf[il_pos].i[2]; + wordr0[3] = combs_buf[il_pos].i[3]; + + u32 wordr1[4]; + + wordr1[0] = combs_buf[il_pos].i[4]; + wordr1[1] = combs_buf[il_pos].i[5]; + wordr1[2] = combs_buf[il_pos].i[6]; + wordr1[3] = combs_buf[il_pos].i[7]; + + u32 wordr2[4]; + + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + + u32 wordr3[4]; + + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + u32x w0[4]; + + w0[0] = wordl0[0] | wordr0[0]; + w0[1] = wordl0[1] | wordr0[1]; + w0[2] = wordl0[2] | wordr0[2]; + w0[3] = wordl0[3] | wordr0[3]; + + u32x w1[4]; + + w1[0] = wordl1[0] | wordr1[0]; + w1[1] = wordl1[1] | wordr1[1]; + w1[2] = wordl1[2] | wordr1[2]; + w1[3] = wordl1[3] | wordr1[3]; + + u32x w2[4]; + + w2[0] = wordl2[0] | wordr2[0]; + w2[1] = wordl2[1] | wordr2[1]; + w2[2] = wordl2[2] | wordr2[2]; + w2[3] = wordl2[3] | wordr2[3]; + + u32x w3[4]; + + w3[0] = wordl3[0] | wordr3[0]; + w3[1] = wordl3[1] | wordr3[1]; + w3[2] = wordl3[2] | wordr3[2]; + w3[3] = wordl3[3] | wordr3[3]; + + const u32 pw_salt_len = salt_len + pw_len; + + /* + * HA1 = md5 ($salt . $pass) + */ + + // append the pass to the salt + + u32x block0[16]; + + block0[ 0] = salt_buf0[ 0]; + block0[ 1] = salt_buf0[ 1]; + block0[ 2] = salt_buf0[ 2]; + block0[ 3] = salt_buf0[ 3]; + block0[ 4] = salt_buf0[ 4]; + block0[ 5] = salt_buf0[ 5]; + block0[ 6] = salt_buf0[ 6]; + block0[ 7] = salt_buf0[ 7]; + block0[ 8] = salt_buf0[ 8]; + block0[ 9] = salt_buf0[ 9]; + block0[10] = salt_buf0[10]; + block0[11] = salt_buf0[11]; + block0[12] = salt_buf0[12]; + block0[13] = salt_buf0[13]; + block0[14] = salt_buf0[14]; + block0[15] = salt_buf0[15]; + + u32x block1[16]; + + block1[ 0] = salt_buf1[ 0]; + block1[ 1] = salt_buf1[ 1]; + block1[ 2] = salt_buf1[ 2]; + block1[ 3] = salt_buf1[ 3]; + block1[ 4] = salt_buf1[ 4]; + block1[ 5] = salt_buf1[ 5]; + block1[ 6] = salt_buf1[ 6]; + block1[ 7] = salt_buf1[ 7]; + block1[ 8] = salt_buf1[ 8]; + block1[ 9] = salt_buf1[ 9]; + block1[10] = salt_buf1[10]; + block1[11] = salt_buf1[11]; + block1[12] = salt_buf1[12]; + block1[13] = salt_buf1[13]; + block1[14] = salt_buf1[14]; + block1[15] = salt_buf1[15]; + + u32 block_len = 0; + + block_len = memcat32 (block0, block1, salt_len, w0, w1, w2, w3, pw_len); + + u32x w0_t[4]; + + w0_t[0] = block0[ 0]; + w0_t[1] = block0[ 1]; + w0_t[2] = block0[ 2]; + w0_t[3] = block0[ 3]; + + u32x w1_t[4]; + + w1_t[0] = block0[ 4]; + w1_t[1] = block0[ 5]; + w1_t[2] = block0[ 6]; + w1_t[3] = block0[ 7]; + + u32x w2_t[4]; + + w2_t[0] = block0[ 8]; + w2_t[1] = block0[ 9]; + w2_t[2] = block0[10]; + w2_t[3] = block0[11]; + + u32x w3_t[4]; + + w3_t[0] = block0[12]; + w3_t[1] = block0[13]; + w3_t[2] = block0[14]; + w3_t[3] = block0[15]; + + if (block_len < 56) + { + w3_t[2] = pw_salt_len * 8; + } + + // md5 + + u32x tmp2; + + u32x a = MD5M_A; + u32x b = MD5M_B; + u32x c = MD5M_C; + u32x d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0_t[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0_t[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0_t[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1_t[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1_t[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1_t[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2_t[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2_t[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2_t[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3_t[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3_t[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3_t[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0_t[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1_t[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2_t[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1_t[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1_t[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2_t[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3_t[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0_t[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2_t[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3_t[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0_t[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1_t[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3_t[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H1, a, b, c, d, w1_t[1], MD5C20, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w2_t[0], MD5C21, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w2_t[3], MD5C22, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w3_t[2], MD5C23, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w0_t[1], MD5C24, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w1_t[0], MD5C25, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w1_t[3], MD5C26, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w2_t[2], MD5C27, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w3_t[1], MD5C28, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w0_t[0], MD5C29, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w0_t[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w1_t[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w2_t[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w3_t[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w3_t[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w0_t[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1_t[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3_t[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3_t[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0_t[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0_t[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2_t[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1_t[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3_t[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1_t[0], MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w2_t[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0_t[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2_t[1], MD5C3f, MD5S33); + + a += MD5M_A; + b += MD5M_B; + c += MD5M_C; + d += MD5M_D; + + if (block_len > 55) + { + u32x r_a = a; + u32x r_b = b; + u32x r_c = c; + u32x r_d = d; + + w0_t[0] = block1[ 0]; + w0_t[1] = block1[ 1]; + w0_t[2] = block1[ 2]; + w0_t[3] = block1[ 3]; + + w1_t[0] = block1[ 4]; + w1_t[1] = block1[ 5]; + w1_t[2] = block1[ 6]; + w1_t[3] = block1[ 7]; + + w2_t[0] = block1[ 8]; + w2_t[1] = block1[ 9]; + w2_t[2] = block1[10]; + w2_t[3] = block1[11]; + + w3_t[0] = block1[12]; + w3_t[1] = block1[13]; + w3_t[2] = pw_salt_len * 8; + w3_t[3] = 0; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0_t[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0_t[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0_t[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1_t[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1_t[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1_t[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2_t[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2_t[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2_t[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3_t[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3_t[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3_t[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0_t[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1_t[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2_t[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1_t[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1_t[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2_t[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3_t[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0_t[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2_t[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3_t[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0_t[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1_t[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3_t[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H1, a, b, c, d, w1_t[1], MD5C20, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w2_t[0], MD5C21, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w2_t[3], MD5C22, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w3_t[2], MD5C23, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w0_t[1], MD5C24, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w1_t[0], MD5C25, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w1_t[3], MD5C26, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w2_t[2], MD5C27, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w3_t[1], MD5C28, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w0_t[0], MD5C29, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w0_t[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w1_t[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w2_t[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w3_t[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w3_t[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w0_t[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1_t[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3_t[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3_t[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0_t[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0_t[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2_t[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1_t[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3_t[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1_t[0], MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w2_t[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0_t[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2_t[1], MD5C3f, MD5S33); + + a += r_a; + b += r_b; + c += r_c; + d += r_d; + } + + /* + * final = md5 ($HA1 . $esalt) + * we have at least 2 MD5 blocks/transformations, but we might need 3 + */ + + w0_t[0] = uint_to_hex_lower8 ((a >> 0) & 255) << 0 + | uint_to_hex_lower8 ((a >> 8) & 255) << 16; + w0_t[1] = uint_to_hex_lower8 ((a >> 16) & 255) << 0 + | uint_to_hex_lower8 ((a >> 24) & 255) << 16; + w0_t[2] = uint_to_hex_lower8 ((b >> 0) & 255) << 0 + | uint_to_hex_lower8 ((b >> 8) & 255) << 16; + w0_t[3] = uint_to_hex_lower8 ((b >> 16) & 255) << 0 + | uint_to_hex_lower8 ((b >> 24) & 255) << 16; + w1_t[0] = uint_to_hex_lower8 ((c >> 0) & 255) << 0 + | uint_to_hex_lower8 ((c >> 8) & 255) << 16; + w1_t[1] = uint_to_hex_lower8 ((c >> 16) & 255) << 0 + | uint_to_hex_lower8 ((c >> 24) & 255) << 16; + w1_t[2] = uint_to_hex_lower8 ((d >> 0) & 255) << 0 + | uint_to_hex_lower8 ((d >> 8) & 255) << 16; + w1_t[3] = uint_to_hex_lower8 ((d >> 16) & 255) << 0 + | uint_to_hex_lower8 ((d >> 24) & 255) << 16; + + w2_t[0] = esalt_buf0[0]; + w2_t[1] = esalt_buf0[1]; + w2_t[2] = esalt_buf0[2]; + w2_t[3] = esalt_buf0[3]; + + w3_t[0] = esalt_buf0[4]; + w3_t[1] = esalt_buf0[5]; + w3_t[2] = esalt_buf0[6]; + w3_t[3] = esalt_buf0[7]; + + // md5 + // 1st transform + + a = MD5M_A; + b = MD5M_B; + c = MD5M_C; + d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0_t[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0_t[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0_t[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1_t[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1_t[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1_t[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2_t[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2_t[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2_t[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3_t[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3_t[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3_t[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0_t[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1_t[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2_t[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1_t[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1_t[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2_t[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3_t[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0_t[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2_t[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3_t[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0_t[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1_t[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3_t[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H1, a, b, c, d, w1_t[1], MD5C20, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w2_t[0], MD5C21, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w2_t[3], MD5C22, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w3_t[2], MD5C23, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w0_t[1], MD5C24, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w1_t[0], MD5C25, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w1_t[3], MD5C26, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w2_t[2], MD5C27, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w3_t[1], MD5C28, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w0_t[0], MD5C29, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w0_t[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w1_t[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w2_t[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w3_t[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w3_t[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w0_t[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1_t[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3_t[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3_t[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0_t[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0_t[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2_t[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1_t[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3_t[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1_t[0], MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w2_t[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0_t[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2_t[1], MD5C3f, MD5S33); + + a += MD5M_A; + b += MD5M_B; + c += MD5M_C; + d += MD5M_D; + + u32x r_a = a; + u32x r_b = b; + u32x r_c = c; + u32x r_d = d; + + // 2nd transform + + w0_t[0] = esalt_buf0[ 8]; + w0_t[1] = esalt_buf0[ 9]; + w0_t[2] = esalt_buf0[10]; + w0_t[3] = esalt_buf0[11]; + + w1_t[0] = esalt_buf0[12]; + w1_t[1] = esalt_buf0[13]; + w1_t[2] = esalt_buf0[14]; + w1_t[3] = esalt_buf0[15]; + + w2_t[0] = esalt_buf1[ 0]; + w2_t[1] = esalt_buf1[ 1]; + w2_t[2] = esalt_buf1[ 2]; + w2_t[3] = esalt_buf1[ 3]; + + w3_t[0] = esalt_buf1[ 4]; + w3_t[1] = esalt_buf1[ 5]; + w3_t[2] = esalt_buf1[ 6]; + w3_t[3] = esalt_buf1[ 7]; + + // it is the final block when no more than 55 bytes left + + if (remaining_bytes < 56) + { + // it is the last block ! + + w3_t[2] = digest_esalt_len * 8; + } + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0_t[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0_t[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0_t[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1_t[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1_t[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1_t[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2_t[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2_t[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2_t[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3_t[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3_t[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3_t[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0_t[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1_t[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2_t[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1_t[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1_t[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2_t[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3_t[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0_t[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2_t[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3_t[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0_t[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1_t[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3_t[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H1, a, b, c, d, w1_t[1], MD5C20, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w2_t[0], MD5C21, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w2_t[3], MD5C22, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w3_t[2], MD5C23, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w0_t[1], MD5C24, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w1_t[0], MD5C25, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w1_t[3], MD5C26, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w2_t[2], MD5C27, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w3_t[1], MD5C28, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w0_t[0], MD5C29, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w0_t[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w1_t[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w2_t[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w3_t[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w3_t[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w0_t[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1_t[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3_t[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3_t[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0_t[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0_t[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2_t[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1_t[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3_t[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1_t[0], MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w2_t[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0_t[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2_t[1], MD5C3f, MD5S33); + + // sometimes (not rare at all) we need a third block :( + + if (remaining_bytes > 55) + { + // this is for sure the final block + + a += r_a; + b += r_b; + c += r_c; + d += r_d; + + r_a = a; + r_b = b; + r_c = c; + r_d = d; + + w0_t[0] = esalt_buf1[ 8]; + w0_t[1] = esalt_buf1[ 9]; + w0_t[2] = esalt_buf1[10]; + w0_t[3] = esalt_buf1[11]; + + w1_t[0] = esalt_buf1[12]; + w1_t[1] = esalt_buf1[13]; + w1_t[2] = esalt_buf1[14]; + w1_t[3] = esalt_buf1[15]; + + w2_t[0] = esalt_buf2[ 0]; + w2_t[1] = esalt_buf2[ 1]; + w2_t[2] = esalt_buf2[ 2]; + w2_t[3] = esalt_buf2[ 3]; + + w3_t[0] = esalt_buf2[ 4]; + w3_t[1] = esalt_buf2[ 5]; + w3_t[2] = digest_esalt_len * 8; + w3_t[3] = 0; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0_t[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0_t[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0_t[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1_t[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1_t[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1_t[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2_t[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2_t[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2_t[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3_t[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3_t[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3_t[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0_t[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1_t[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2_t[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1_t[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1_t[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2_t[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3_t[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0_t[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2_t[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3_t[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0_t[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1_t[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3_t[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H1, a, b, c, d, w1_t[1], MD5C20, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w2_t[0], MD5C21, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w2_t[3], MD5C22, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w3_t[2], MD5C23, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w0_t[1], MD5C24, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w1_t[0], MD5C25, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w1_t[3], MD5C26, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w2_t[2], MD5C27, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w3_t[1], MD5C28, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w0_t[0], MD5C29, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w0_t[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w1_t[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w2_t[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w3_t[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w3_t[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w0_t[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1_t[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3_t[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3_t[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0_t[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0_t[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2_t[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1_t[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3_t[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1_t[0], MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w2_t[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0_t[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2_t[1], MD5C3f, MD5S33); + } + + a += r_a; + b += r_b; + c += r_c; + d += r_d; + + const u32x r0 = a; + const u32x r1 = d; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_S + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m11400_s08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global sip_t *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m11400_s16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global sip_t *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/amd/m11400_a3.cl b/amd/m11400_a3.cl new file mode 100644 index 0000000000..084ed1b130 --- /dev/null +++ b/amd/m11400_a3.cl @@ -0,0 +1,6267 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _MD5_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW4 +#define VECT_SIZE2 +#endif + +#ifdef VLIW5 +#define VECT_SIZE2 +#endif + +#define DGST_R0 0 +#define DGST_R1 3 +#define DGST_R2 2 +#define DGST_R3 1 + +#include "include/kernel_functions.c" +#include "types_amd.c" +#include "common_amd.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +#ifdef VECT_SIZE1 +#define uint_to_hex_lower8(i) l_bin2asc[(i)] +#endif + +#ifdef VECT_SIZE1 +#define uint_to_hex_lower8(i) l_bin2asc[(i)] +#endif + +#ifdef VECT_SIZE2 +#define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1]) +#endif + +#ifdef VECT_SIZE4 +#define uint_to_hex_lower8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3]) +#endif + +static u32 memcat32 (u32x block0[16], u32x block1[16], const u32 block_len, const u32x append0[4], const u32x append1[4], const u32x append2[4], const u32x append3[4], const u32 append_len) +{ + const u32 mod = block_len & 3; + const u32 div = block_len / 4; + + const int offset_minus_4 = 4 - mod; + + u32x append0_t[4]; + + append0_t[0] = amd_bytealign (append0[0], 0, offset_minus_4); + append0_t[1] = amd_bytealign (append0[1], append0[0], offset_minus_4); + append0_t[2] = amd_bytealign (append0[2], append0[1], offset_minus_4); + append0_t[3] = amd_bytealign (append0[3], append0[2], offset_minus_4); + + u32x append1_t[4]; + + append1_t[0] = amd_bytealign (append1[0], append0[3], offset_minus_4); + append1_t[1] = amd_bytealign (append1[1], append1[0], offset_minus_4); + append1_t[2] = amd_bytealign (append1[2], append1[1], offset_minus_4); + append1_t[3] = amd_bytealign (append1[3], append1[2], offset_minus_4); + + u32x append2_t[4]; + + append2_t[0] = amd_bytealign (append2[0], append1[3], offset_minus_4); + append2_t[1] = amd_bytealign (append2[1], append2[0], offset_minus_4); + append2_t[2] = amd_bytealign (append2[2], append2[1], offset_minus_4); + append2_t[3] = amd_bytealign (append2[3], append2[2], offset_minus_4); + + u32x append3_t[4]; + + append3_t[0] = amd_bytealign (append3[0], append2[3], offset_minus_4); + append3_t[1] = amd_bytealign (append3[1], append3[0], offset_minus_4); + append3_t[2] = amd_bytealign (append3[2], append3[1], offset_minus_4); + append3_t[3] = amd_bytealign (append3[3], append3[2], offset_minus_4); + + u32x append4_t[4]; + + append4_t[0] = amd_bytealign ( 0, append3[3], offset_minus_4); + append4_t[1] = 0; + append4_t[2] = 0; + append4_t[3] = 0; + + if (mod == 0) + { + append0_t[0] = append0[0]; + append0_t[1] = append0[1]; + append0_t[2] = append0[2]; + append0_t[3] = append0[3]; + + append1_t[0] = append1[0]; + append1_t[1] = append1[1]; + append1_t[2] = append1[2]; + append1_t[3] = append1[3]; + + append2_t[0] = append2[0]; + append2_t[1] = append2[1]; + append2_t[2] = append2[2]; + append2_t[3] = append2[3]; + + append3_t[0] = append3[0]; + append3_t[1] = append3[1]; + append3_t[2] = append3[2]; + append3_t[3] = append3[3]; + + append4_t[0] = 0; + append4_t[1] = 0; + append4_t[2] = 0; + append4_t[3] = 0; + } + + switch (div) + { + case 0: block0[ 0] |= append0_t[0]; + block0[ 1] = append0_t[1]; + block0[ 2] = append0_t[2]; + block0[ 3] = append0_t[3]; + + block0[ 4] = append1_t[0]; + block0[ 5] = append1_t[1]; + block0[ 6] = append1_t[2]; + block0[ 7] = append1_t[3]; + + block0[ 8] = append2_t[0]; + block0[ 9] = append2_t[1]; + block0[10] = append2_t[2]; + block0[11] = append2_t[3]; + + block0[12] = append3_t[0]; + block0[13] = append3_t[1]; + block0[14] = append3_t[2]; + block0[15] = append3_t[3]; + + block1[ 0] = append4_t[0]; + block1[ 1] = append4_t[1]; + block1[ 2] = append4_t[2]; + block1[ 3] = append4_t[3]; + break; + + case 1: block0[ 1] |= append0_t[0]; + block0[ 2] = append0_t[1]; + block0[ 3] = append0_t[2]; + block0[ 4] = append0_t[3]; + + block0[ 5] = append1_t[0]; + block0[ 6] = append1_t[1]; + block0[ 7] = append1_t[2]; + block0[ 8] = append1_t[3]; + + block0[ 9] = append2_t[0]; + block0[10] = append2_t[1]; + block0[11] = append2_t[2]; + block0[12] = append2_t[3]; + + block0[13] = append3_t[0]; + block0[14] = append3_t[1]; + block0[15] = append3_t[2]; + block1[ 0] = append3_t[3]; + + block1[ 1] = append4_t[0]; + block1[ 2] = append4_t[1]; + block1[ 3] = append4_t[2]; + block1[ 4] = append4_t[3]; + break; + + case 2: block0[ 2] |= append0_t[0]; + block0[ 3] = append0_t[1]; + block0[ 4] = append0_t[2]; + block0[ 5] = append0_t[3]; + + block0[ 6] = append1_t[0]; + block0[ 7] = append1_t[1]; + block0[ 8] = append1_t[2]; + block0[ 9] = append1_t[3]; + + block0[10] = append2_t[0]; + block0[11] = append2_t[1]; + block0[12] = append2_t[2]; + block0[13] = append2_t[3]; + + block0[14] = append3_t[0]; + block0[15] = append3_t[1]; + block1[ 0] = append3_t[2]; + block1[ 1] = append3_t[3]; + + block1[ 2] = append4_t[0]; + block1[ 3] = append4_t[1]; + block1[ 4] = append4_t[2]; + block1[ 5] = append4_t[3]; + break; + + case 3: block0[ 3] |= append0_t[0]; + block0[ 4] = append0_t[1]; + block0[ 5] = append0_t[2]; + block0[ 6] = append0_t[3]; + + block0[ 7] = append1_t[0]; + block0[ 8] = append1_t[1]; + block0[ 9] = append1_t[2]; + block0[10] = append1_t[3]; + + block0[11] = append2_t[0]; + block0[12] = append2_t[1]; + block0[13] = append2_t[2]; + block0[14] = append2_t[3]; + + block0[15] = append3_t[0]; + block1[ 0] = append3_t[1]; + block1[ 1] = append3_t[2]; + block1[ 2] = append3_t[3]; + + block1[ 3] = append4_t[0]; + block1[ 4] = append4_t[1]; + block1[ 5] = append4_t[2]; + block1[ 6] = append4_t[3]; + break; + + case 4: block0[ 4] |= append0_t[0]; + block0[ 5] = append0_t[1]; + block0[ 6] = append0_t[2]; + block0[ 7] = append0_t[3]; + + block0[ 8] = append1_t[0]; + block0[ 9] = append1_t[1]; + block0[10] = append1_t[2]; + block0[11] = append1_t[3]; + + block0[12] = append2_t[0]; + block0[13] = append2_t[1]; + block0[14] = append2_t[2]; + block0[15] = append2_t[3]; + + block1[ 0] = append3_t[0]; + block1[ 1] = append3_t[1]; + block1[ 2] = append3_t[2]; + block1[ 3] = append3_t[3]; + + block1[ 4] = append4_t[0]; + block1[ 5] = append4_t[1]; + block1[ 6] = append4_t[2]; + block1[ 7] = append4_t[3]; + break; + + case 5: block0[ 5] |= append0_t[0]; + block0[ 6] = append0_t[1]; + block0[ 7] = append0_t[2]; + block0[ 8] = append0_t[3]; + + block0[ 9] = append1_t[0]; + block0[10] = append1_t[1]; + block0[11] = append1_t[2]; + block0[12] = append1_t[3]; + + block0[13] = append2_t[0]; + block0[14] = append2_t[1]; + block0[15] = append2_t[2]; + block1[ 0] = append2_t[3]; + + block1[ 1] = append3_t[0]; + block1[ 2] = append3_t[1]; + block1[ 3] = append3_t[2]; + block1[ 4] = append3_t[3]; + + block1[ 5] = append4_t[0]; + block1[ 6] = append4_t[1]; + block1[ 7] = append4_t[2]; + block1[ 8] = append4_t[3]; + break; + + case 6: block0[ 6] |= append0_t[0]; + block0[ 7] = append0_t[1]; + block0[ 8] = append0_t[2]; + block0[ 9] = append0_t[3]; + + block0[10] = append1_t[0]; + block0[11] = append1_t[1]; + block0[12] = append1_t[2]; + block0[13] = append1_t[3]; + + block0[14] = append2_t[0]; + block0[15] = append2_t[1]; + block1[ 0] = append2_t[2]; + block1[ 1] = append2_t[3]; + + block1[ 2] = append3_t[0]; + block1[ 3] = append3_t[1]; + block1[ 4] = append3_t[2]; + block1[ 5] = append3_t[3]; + + block1[ 6] = append4_t[0]; + block1[ 7] = append4_t[1]; + block1[ 8] = append4_t[2]; + block1[ 9] = append4_t[3]; + break; + + case 7: block0[ 7] |= append0_t[0]; + block0[ 8] = append0_t[1]; + block0[ 9] = append0_t[2]; + block0[10] = append0_t[3]; + + block0[11] = append1_t[0]; + block0[12] = append1_t[1]; + block0[13] = append1_t[2]; + block0[14] = append1_t[3]; + + block0[15] = append2_t[0]; + block1[ 0] = append2_t[1]; + block1[ 1] = append2_t[2]; + block1[ 2] = append2_t[3]; + + block1[ 3] = append3_t[0]; + block1[ 4] = append3_t[1]; + block1[ 5] = append3_t[2]; + block1[ 6] = append3_t[3]; + + block1[ 7] = append4_t[0]; + block1[ 8] = append4_t[1]; + block1[ 9] = append4_t[2]; + block1[10] = append4_t[3]; + break; + + case 8: block0[ 8] |= append0_t[0]; + block0[ 9] = append0_t[1]; + block0[10] = append0_t[2]; + block0[11] = append0_t[3]; + + block0[12] = append1_t[0]; + block0[13] = append1_t[1]; + block0[14] = append1_t[2]; + block0[15] = append1_t[3]; + + block1[ 0] = append2_t[0]; + block1[ 1] = append2_t[1]; + block1[ 2] = append2_t[2]; + block1[ 3] = append2_t[3]; + + block1[ 4] = append3_t[0]; + block1[ 5] = append3_t[1]; + block1[ 6] = append3_t[2]; + block1[ 7] = append3_t[3]; + + block1[ 8] = append4_t[0]; + block1[ 9] = append4_t[1]; + block1[10] = append4_t[2]; + block1[11] = append4_t[3]; + break; + + case 9: block0[ 9] |= append0_t[0]; + block0[10] = append0_t[1]; + block0[11] = append0_t[2]; + block0[12] = append0_t[3]; + + block0[13] = append1_t[0]; + block0[14] = append1_t[1]; + block0[15] = append1_t[2]; + block1[ 0] = append1_t[3]; + + block1[ 1] = append2_t[0]; + block1[ 2] = append2_t[1]; + block1[ 3] = append2_t[2]; + block1[ 4] = append2_t[3]; + + block1[ 5] = append3_t[0]; + block1[ 6] = append3_t[1]; + block1[ 7] = append3_t[2]; + block1[ 8] = append3_t[3]; + + block1[ 9] = append4_t[0]; + block1[10] = append4_t[1]; + block1[11] = append4_t[2]; + block1[12] = append4_t[3]; + break; + + case 10: block0[10] |= append0_t[0]; + block0[11] = append0_t[1]; + block0[12] = append0_t[2]; + block0[13] = append0_t[3]; + + block0[14] = append1_t[0]; + block0[15] = append1_t[1]; + block1[ 0] = append1_t[2]; + block1[ 1] = append1_t[3]; + + block1[ 2] = append2_t[0]; + block1[ 3] = append2_t[1]; + block1[ 4] = append2_t[2]; + block1[ 5] = append2_t[3]; + + block1[ 6] = append3_t[0]; + block1[ 7] = append3_t[1]; + block1[ 8] = append3_t[2]; + block1[ 9] = append3_t[3]; + + block1[10] = append4_t[0]; + block1[11] = append4_t[1]; + block1[12] = append4_t[2]; + block1[13] = append4_t[3]; + break; + + case 11: block0[11] |= append0_t[0]; + block0[12] = append0_t[1]; + block0[13] = append0_t[2]; + block0[14] = append0_t[3]; + + block0[15] = append1_t[0]; + block1[ 0] = append1_t[1]; + block1[ 1] = append1_t[2]; + block1[ 2] = append1_t[3]; + + block1[ 3] = append2_t[0]; + block1[ 4] = append2_t[1]; + block1[ 5] = append2_t[2]; + block1[ 6] = append2_t[3]; + + block1[ 7] = append3_t[0]; + block1[ 8] = append3_t[1]; + block1[ 9] = append3_t[2]; + block1[10] = append3_t[3]; + + block1[11] = append4_t[0]; + block1[12] = append4_t[1]; + block1[13] = append4_t[2]; + block1[14] = append4_t[3]; + break; + + case 12: block0[12] |= append0_t[0]; + block0[13] = append0_t[1]; + block0[14] = append0_t[2]; + block0[15] = append0_t[3]; + + block1[ 0] = append1_t[0]; + block1[ 1] = append1_t[1]; + block1[ 2] = append1_t[2]; + block1[ 3] = append1_t[3]; + + block1[ 4] = append2_t[0]; + block1[ 5] = append2_t[1]; + block1[ 6] = append2_t[2]; + block1[ 7] = append2_t[3]; + + block1[ 8] = append3_t[0]; + block1[ 9] = append3_t[1]; + block1[10] = append3_t[2]; + block1[11] = append3_t[3]; + + block1[12] = append4_t[0]; + block1[13] = append4_t[1]; + block1[14] = append4_t[2]; + block1[15] = append4_t[3]; + break; + + case 13: block0[13] |= append0_t[0]; + block0[14] = append0_t[1]; + block0[15] = append0_t[2]; + block1[ 0] = append0_t[3]; + + block1[ 1] = append1_t[0]; + block1[ 2] = append1_t[1]; + block1[ 3] = append1_t[2]; + block1[ 4] = append1_t[3]; + + block1[ 5] = append2_t[0]; + block1[ 6] = append2_t[1]; + block1[ 7] = append2_t[2]; + block1[ 8] = append2_t[3]; + + block1[ 9] = append3_t[0]; + block1[10] = append3_t[1]; + block1[11] = append3_t[2]; + block1[12] = append3_t[3]; + + block1[13] = append4_t[0]; + block1[14] = append4_t[1]; + block1[15] = append4_t[2]; + break; + + case 14: block0[14] |= append0_t[0]; + block0[15] = append0_t[1]; + block1[ 0] = append0_t[2]; + block1[ 1] = append0_t[3]; + + block1[ 2] = append1_t[0]; + block1[ 3] = append1_t[1]; + block1[ 4] = append1_t[2]; + block1[ 5] = append1_t[3]; + + block1[ 6] = append2_t[0]; + block1[ 7] = append2_t[1]; + block1[ 8] = append2_t[2]; + block1[ 9] = append2_t[3]; + + block1[10] = append3_t[0]; + block1[11] = append3_t[1]; + block1[12] = append3_t[2]; + block1[13] = append3_t[3]; + + block1[14] = append4_t[0]; + block1[15] = append4_t[1]; + break; + + case 15: block0[15] |= append0_t[0]; + block1[ 0] = append0_t[1]; + block1[ 1] = append0_t[2]; + block1[ 2] = append0_t[3]; + + block1[ 3] = append1_t[1]; + block1[ 4] = append1_t[2]; + block1[ 5] = append1_t[3]; + block1[ 6] = append1_t[0]; + + block1[ 7] = append2_t[0]; + block1[ 8] = append2_t[1]; + block1[ 9] = append2_t[2]; + block1[10] = append2_t[3]; + + block1[11] = append3_t[0]; + block1[12] = append3_t[1]; + block1[13] = append3_t[2]; + block1[14] = append3_t[3]; + + block1[15] = append4_t[0]; + break; + + case 16: block1[ 0] |= append0_t[0]; + block1[ 1] = append0_t[1]; + block1[ 2] = append0_t[2]; + block1[ 3] = append0_t[3]; + + block1[ 4] = append1_t[0]; + block1[ 5] = append1_t[1]; + block1[ 6] = append1_t[2]; + block1[ 7] = append1_t[3]; + + block1[ 8] = append2_t[0]; + block1[ 9] = append2_t[1]; + block1[10] = append2_t[2]; + block1[11] = append2_t[3]; + + block1[12] = append3_t[0]; + block1[13] = append3_t[1]; + block1[14] = append3_t[2]; + block1[15] = append3_t[3]; + break; + + case 17: block1[ 1] |= append0_t[0]; + block1[ 2] = append0_t[1]; + block1[ 3] = append0_t[2]; + block1[ 4] = append0_t[3]; + + block1[ 5] = append1_t[0]; + block1[ 6] = append1_t[1]; + block1[ 7] = append1_t[2]; + block1[ 8] = append1_t[3]; + + block1[ 9] = append2_t[0]; + block1[10] = append2_t[1]; + block1[11] = append2_t[2]; + block1[12] = append2_t[3]; + + block1[13] = append3_t[0]; + block1[14] = append3_t[1]; + block1[15] = append3_t[2]; + break; + + case 18: block1[ 2] |= append0_t[0]; + block1[ 3] = append0_t[1]; + block1[ 4] = append0_t[2]; + block1[ 5] = append0_t[3]; + + block1[ 6] = append1_t[0]; + block1[ 7] = append1_t[1]; + block1[ 8] = append1_t[2]; + block1[ 9] = append1_t[3]; + + block1[10] = append2_t[0]; + block1[11] = append2_t[1]; + block1[12] = append2_t[2]; + block1[13] = append2_t[3]; + + block1[14] = append3_t[0]; + block1[15] = append3_t[1]; + break; + + case 19: block1[ 3] |= append0_t[0]; + block1[ 4] = append0_t[1]; + block1[ 5] = append0_t[2]; + block1[ 6] = append0_t[3]; + + block1[ 7] = append1_t[0]; + block1[ 8] = append1_t[1]; + block1[ 9] = append1_t[2]; + block1[10] = append1_t[3]; + + block1[11] = append2_t[0]; + block1[12] = append2_t[1]; + block1[13] = append2_t[2]; + block1[14] = append2_t[3]; + + block1[15] = append3_t[0]; + break; + + case 20: block1[ 4] |= append0_t[0]; + block1[ 5] = append0_t[1]; + block1[ 6] = append0_t[2]; + block1[ 7] = append0_t[3]; + + block1[ 8] = append1_t[0]; + block1[ 9] = append1_t[1]; + block1[10] = append1_t[2]; + block1[11] = append1_t[3]; + + block1[12] = append2_t[0]; + block1[13] = append2_t[1]; + block1[14] = append2_t[2]; + block1[15] = append2_t[3]; + break; + + case 21: block1[ 5] |= append0_t[0]; + block1[ 6] = append0_t[1]; + block1[ 7] = append0_t[2]; + block1[ 8] = append0_t[3]; + + block1[ 9] = append1_t[0]; + block1[10] = append1_t[1]; + block1[11] = append1_t[2]; + block1[12] = append1_t[3]; + + block1[13] = append2_t[0]; + block1[14] = append2_t[1]; + block1[15] = append2_t[2]; + break; + + case 22: block1[ 6] |= append0_t[0]; + block1[ 7] = append0_t[1]; + block1[ 8] = append0_t[2]; + block1[ 9] = append0_t[3]; + + block1[10] = append1_t[0]; + block1[11] = append1_t[1]; + block1[12] = append1_t[2]; + block1[13] = append1_t[3]; + + block1[14] = append2_t[0]; + block1[15] = append2_t[1]; + break; + + case 23: block1[ 7] |= append0_t[0]; + block1[ 8] = append0_t[1]; + block1[ 9] = append0_t[2]; + block1[10] = append0_t[3]; + + block1[11] = append1_t[0]; + block1[12] = append1_t[1]; + block1[13] = append1_t[2]; + block1[14] = append1_t[3]; + + block1[15] = append2_t[0]; + break; + + case 24: block1[ 8] |= append0_t[0]; + block1[ 9] = append0_t[1]; + block1[10] = append0_t[2]; + block1[11] = append0_t[3]; + + block1[12] = append1_t[0]; + block1[13] = append1_t[1]; + block1[14] = append1_t[2]; + block1[15] = append1_t[3]; + break; + + case 25: block1[ 9] |= append0_t[0]; + block1[10] = append0_t[1]; + block1[11] = append0_t[2]; + block1[12] = append0_t[3]; + + block1[13] = append1_t[0]; + block1[14] = append1_t[1]; + block1[15] = append1_t[2]; + break; + + case 26: block1[10] |= append0_t[0]; + block1[11] = append0_t[1]; + block1[12] = append0_t[2]; + block1[13] = append0_t[3]; + + block1[14] = append1_t[0]; + block1[15] = append1_t[1]; + break; + + case 27: block1[11] |= append0_t[0]; + block1[12] = append0_t[1]; + block1[13] = append0_t[2]; + block1[14] = append0_t[3]; + + block1[15] = append1_t[0]; + break; + + case 28: block1[12] |= append0_t[0]; + block1[13] = append0_t[1]; + block1[14] = append0_t[2]; + block1[15] = append0_t[3]; + break; + + case 29: block1[13] |= append0_t[0]; + block1[14] = append0_t[1]; + block1[15] = append0_t[2]; + break; + + case 30: block1[14] |= append0_t[0]; + block1[15] = append0_t[1]; + break; + } + + u32 new_len = block_len + append_len; + + return new_len; +} + +static void m11400m_0_0 (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], const u32 pw_len, __global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global sip_t *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, __local u32 l_bin2asc[256]) +{ + /** + * modifier + */ + + const u32 gid = get_global_id (0); + const u32 lid = get_local_id (0); + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * salt + */ + + const u32 salt_len = esalt_bufs[salt_pos].salt_len; // not a bug, we need to get it from the esalt + + const u32 pw_salt_len = salt_len + pw_len; + + u32 salt_buf0[16]; + + salt_buf0[ 0] = esalt_bufs[salt_pos].salt_buf[ 0]; + salt_buf0[ 1] = esalt_bufs[salt_pos].salt_buf[ 1]; + salt_buf0[ 2] = esalt_bufs[salt_pos].salt_buf[ 2]; + salt_buf0[ 3] = esalt_bufs[salt_pos].salt_buf[ 3]; + salt_buf0[ 4] = esalt_bufs[salt_pos].salt_buf[ 4]; + salt_buf0[ 5] = esalt_bufs[salt_pos].salt_buf[ 5]; + salt_buf0[ 6] = esalt_bufs[salt_pos].salt_buf[ 6]; + salt_buf0[ 7] = esalt_bufs[salt_pos].salt_buf[ 7]; + salt_buf0[ 8] = esalt_bufs[salt_pos].salt_buf[ 8]; + salt_buf0[ 9] = esalt_bufs[salt_pos].salt_buf[ 9]; + salt_buf0[10] = esalt_bufs[salt_pos].salt_buf[10]; + salt_buf0[11] = esalt_bufs[salt_pos].salt_buf[11]; + salt_buf0[12] = esalt_bufs[salt_pos].salt_buf[12]; + salt_buf0[13] = esalt_bufs[salt_pos].salt_buf[13]; + salt_buf0[14] = esalt_bufs[salt_pos].salt_buf[14]; + salt_buf0[15] = esalt_bufs[salt_pos].salt_buf[15]; + + u32 salt_buf1[16]; + + salt_buf1[ 0] = esalt_bufs[salt_pos].salt_buf[16]; + salt_buf1[ 1] = esalt_bufs[salt_pos].salt_buf[17]; + salt_buf1[ 2] = esalt_bufs[salt_pos].salt_buf[18]; + salt_buf1[ 3] = esalt_bufs[salt_pos].salt_buf[19]; + salt_buf1[ 4] = esalt_bufs[salt_pos].salt_buf[20]; + salt_buf1[ 5] = esalt_bufs[salt_pos].salt_buf[21]; + salt_buf1[ 6] = esalt_bufs[salt_pos].salt_buf[22]; + salt_buf1[ 7] = esalt_bufs[salt_pos].salt_buf[23]; + salt_buf1[ 8] = esalt_bufs[salt_pos].salt_buf[24]; + salt_buf1[ 9] = esalt_bufs[salt_pos].salt_buf[25]; + salt_buf1[10] = esalt_bufs[salt_pos].salt_buf[26]; + salt_buf1[11] = esalt_bufs[salt_pos].salt_buf[27]; + salt_buf1[12] = esalt_bufs[salt_pos].salt_buf[28]; + salt_buf1[13] = esalt_bufs[salt_pos].salt_buf[29]; + salt_buf1[14] = 0; + salt_buf1[15] = 0; + + /** + * esalt + */ + + const u32 esalt_len = esalt_bufs[salt_pos].esalt_len; + + u32 esalt_buf0[16]; + + esalt_buf0[ 0] = esalt_bufs[salt_pos].esalt_buf[ 0]; + esalt_buf0[ 1] = esalt_bufs[salt_pos].esalt_buf[ 1]; + esalt_buf0[ 2] = esalt_bufs[salt_pos].esalt_buf[ 2]; + esalt_buf0[ 3] = esalt_bufs[salt_pos].esalt_buf[ 3]; + esalt_buf0[ 4] = esalt_bufs[salt_pos].esalt_buf[ 4]; + esalt_buf0[ 5] = esalt_bufs[salt_pos].esalt_buf[ 5]; + esalt_buf0[ 6] = esalt_bufs[salt_pos].esalt_buf[ 6]; + esalt_buf0[ 7] = esalt_bufs[salt_pos].esalt_buf[ 7]; + esalt_buf0[ 8] = esalt_bufs[salt_pos].esalt_buf[ 8]; + esalt_buf0[ 9] = esalt_bufs[salt_pos].esalt_buf[ 9]; + esalt_buf0[10] = esalt_bufs[salt_pos].esalt_buf[10]; + esalt_buf0[11] = esalt_bufs[salt_pos].esalt_buf[11]; + esalt_buf0[12] = esalt_bufs[salt_pos].esalt_buf[12]; + esalt_buf0[13] = esalt_bufs[salt_pos].esalt_buf[13]; + esalt_buf0[14] = esalt_bufs[salt_pos].esalt_buf[14]; + esalt_buf0[15] = esalt_bufs[salt_pos].esalt_buf[15]; + + u32 esalt_buf1[16]; + + esalt_buf1[ 0] = esalt_bufs[salt_pos].esalt_buf[16]; + esalt_buf1[ 1] = esalt_bufs[salt_pos].esalt_buf[17]; + esalt_buf1[ 2] = esalt_bufs[salt_pos].esalt_buf[18]; + esalt_buf1[ 3] = esalt_bufs[salt_pos].esalt_buf[19]; + esalt_buf1[ 4] = esalt_bufs[salt_pos].esalt_buf[20]; + esalt_buf1[ 5] = esalt_bufs[salt_pos].esalt_buf[21]; + esalt_buf1[ 6] = esalt_bufs[salt_pos].esalt_buf[22]; + esalt_buf1[ 7] = esalt_bufs[salt_pos].esalt_buf[23]; + esalt_buf1[ 8] = esalt_bufs[salt_pos].esalt_buf[24]; + esalt_buf1[ 9] = esalt_bufs[salt_pos].esalt_buf[25]; + esalt_buf1[10] = esalt_bufs[salt_pos].esalt_buf[26]; + esalt_buf1[11] = esalt_bufs[salt_pos].esalt_buf[27]; + esalt_buf1[12] = esalt_bufs[salt_pos].esalt_buf[28]; + esalt_buf1[13] = esalt_bufs[salt_pos].esalt_buf[29]; + esalt_buf1[14] = esalt_bufs[salt_pos].esalt_buf[30]; + esalt_buf1[15] = esalt_bufs[salt_pos].esalt_buf[31]; + + const u32 digest_esalt_len = 32 + esalt_len; + + /** + * loop + */ + + u32x w0l = w0[0]; + + for (u32 il_pos = 0; il_pos < bfs_cnt; il_pos++) + { + const u32 w0r = bfs_buf[il_pos].i; + + w0[0] = w0l | w0r; + + /* + * HA1 = md5 ($salt . $pass) + */ + + // append the pass to the salt + + u32x block0[16]; + + block0[ 0] = salt_buf0[ 0]; + block0[ 1] = salt_buf0[ 1]; + block0[ 2] = salt_buf0[ 2]; + block0[ 3] = salt_buf0[ 3]; + block0[ 4] = salt_buf0[ 4]; + block0[ 5] = salt_buf0[ 5]; + block0[ 6] = salt_buf0[ 6]; + block0[ 7] = salt_buf0[ 7]; + block0[ 8] = salt_buf0[ 8]; + block0[ 9] = salt_buf0[ 9]; + block0[10] = salt_buf0[10]; + block0[11] = salt_buf0[11]; + block0[12] = salt_buf0[12]; + block0[13] = salt_buf0[13]; + block0[14] = salt_buf0[14]; + block0[15] = salt_buf0[15]; + + u32x block1[16]; + + block1[ 0] = salt_buf1[ 0]; + block1[ 1] = salt_buf1[ 1]; + block1[ 2] = salt_buf1[ 2]; + block1[ 3] = salt_buf1[ 3]; + block1[ 4] = salt_buf1[ 4]; + block1[ 5] = salt_buf1[ 5]; + block1[ 6] = salt_buf1[ 6]; + block1[ 7] = salt_buf1[ 7]; + block1[ 8] = salt_buf1[ 8]; + block1[ 9] = salt_buf1[ 9]; + block1[10] = salt_buf1[10]; + block1[11] = salt_buf1[11]; + block1[12] = salt_buf1[12]; + block1[13] = salt_buf1[13]; + block1[14] = salt_buf1[14]; + block1[15] = salt_buf1[15]; + + memcat32 (block0, block1, salt_len, w0, w1, w2, w3, pw_len); + + u32x w0_t[4]; + + w0_t[0] = block0[ 0]; + w0_t[1] = block0[ 1]; + w0_t[2] = block0[ 2]; + w0_t[3] = block0[ 3]; + + u32x w1_t[4]; + + w1_t[0] = block0[ 4]; + w1_t[1] = block0[ 5]; + w1_t[2] = block0[ 6]; + w1_t[3] = block0[ 7]; + + u32x w2_t[4]; + + w2_t[0] = block0[ 8]; + w2_t[1] = block0[ 9]; + w2_t[2] = block0[10]; + w2_t[3] = block0[11]; + + u32x w3_t[4]; + + w3_t[0] = block0[12]; + w3_t[1] = block0[13]; + w3_t[2] = pw_salt_len * 8; + w3_t[3] = 0; + + // md5 + + u32x tmp2; + + u32x a = MD5M_A; + u32x b = MD5M_B; + u32x c = MD5M_C; + u32x d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0_t[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0_t[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0_t[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1_t[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1_t[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1_t[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2_t[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2_t[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2_t[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3_t[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3_t[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3_t[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0_t[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1_t[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2_t[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1_t[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1_t[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2_t[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3_t[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0_t[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2_t[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3_t[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0_t[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1_t[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3_t[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H1, a, b, c, d, w1_t[1], MD5C20, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w2_t[0], MD5C21, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w2_t[3], MD5C22, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w3_t[2], MD5C23, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w0_t[1], MD5C24, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w1_t[0], MD5C25, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w1_t[3], MD5C26, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w2_t[2], MD5C27, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w3_t[1], MD5C28, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w0_t[0], MD5C29, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w0_t[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w1_t[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w2_t[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w3_t[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w3_t[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w0_t[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1_t[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3_t[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3_t[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0_t[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0_t[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2_t[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1_t[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3_t[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1_t[0], MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w2_t[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0_t[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2_t[1], MD5C3f, MD5S33); + + a += MD5M_A; + b += MD5M_B; + c += MD5M_C; + d += MD5M_D; + + /* + * final = md5 ($HA1 . $esalt) + * we have at least 2 MD5 blocks/transformations, but we might need 3 + */ + + w0_t[0] = uint_to_hex_lower8 ((a >> 0) & 255) << 0 + | uint_to_hex_lower8 ((a >> 8) & 255) << 16; + w0_t[1] = uint_to_hex_lower8 ((a >> 16) & 255) << 0 + | uint_to_hex_lower8 ((a >> 24) & 255) << 16; + w0_t[2] = uint_to_hex_lower8 ((b >> 0) & 255) << 0 + | uint_to_hex_lower8 ((b >> 8) & 255) << 16; + w0_t[3] = uint_to_hex_lower8 ((b >> 16) & 255) << 0 + | uint_to_hex_lower8 ((b >> 24) & 255) << 16; + w1_t[0] = uint_to_hex_lower8 ((c >> 0) & 255) << 0 + | uint_to_hex_lower8 ((c >> 8) & 255) << 16; + w1_t[1] = uint_to_hex_lower8 ((c >> 16) & 255) << 0 + | uint_to_hex_lower8 ((c >> 24) & 255) << 16; + w1_t[2] = uint_to_hex_lower8 ((d >> 0) & 255) << 0 + | uint_to_hex_lower8 ((d >> 8) & 255) << 16; + w1_t[3] = uint_to_hex_lower8 ((d >> 16) & 255) << 0 + | uint_to_hex_lower8 ((d >> 24) & 255) << 16; + + w2_t[0] = esalt_buf0[0]; + w2_t[1] = esalt_buf0[1]; + w2_t[2] = esalt_buf0[2]; + w2_t[3] = esalt_buf0[3]; + + w3_t[0] = esalt_buf0[4]; + w3_t[1] = esalt_buf0[5]; + w3_t[2] = esalt_buf0[6]; + w3_t[3] = esalt_buf0[7]; + + // md5 + // 1st transform + + a = MD5M_A; + b = MD5M_B; + c = MD5M_C; + d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0_t[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0_t[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0_t[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1_t[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1_t[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1_t[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2_t[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2_t[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2_t[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3_t[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3_t[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3_t[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0_t[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1_t[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2_t[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1_t[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1_t[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2_t[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3_t[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0_t[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2_t[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3_t[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0_t[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1_t[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3_t[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H1, a, b, c, d, w1_t[1], MD5C20, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w2_t[0], MD5C21, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w2_t[3], MD5C22, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w3_t[2], MD5C23, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w0_t[1], MD5C24, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w1_t[0], MD5C25, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w1_t[3], MD5C26, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w2_t[2], MD5C27, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w3_t[1], MD5C28, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w0_t[0], MD5C29, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w0_t[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w1_t[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w2_t[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w3_t[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w3_t[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w0_t[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1_t[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3_t[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3_t[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0_t[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0_t[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2_t[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1_t[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3_t[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1_t[0], MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w2_t[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0_t[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2_t[1], MD5C3f, MD5S33); + + a += MD5M_A; + b += MD5M_B; + c += MD5M_C; + d += MD5M_D; + + u32x r_a = a; + u32x r_b = b; + u32x r_c = c; + u32x r_d = d; + + // 2nd transform + + w0_t[0] = esalt_buf0[ 8]; + w0_t[1] = esalt_buf0[ 9]; + w0_t[2] = esalt_buf0[10]; + w0_t[3] = esalt_buf0[11]; + + w1_t[0] = esalt_buf0[12]; + w1_t[1] = esalt_buf0[13]; + w1_t[2] = esalt_buf0[14]; + w1_t[3] = esalt_buf0[15]; + + w2_t[0] = esalt_buf1[ 0]; + w2_t[1] = esalt_buf1[ 1]; + w2_t[2] = esalt_buf1[ 2]; + w2_t[3] = esalt_buf1[ 3]; + + w3_t[0] = esalt_buf1[ 4]; + w3_t[1] = esalt_buf1[ 5]; + w3_t[2] = digest_esalt_len * 8; + w3_t[3] = 0; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0_t[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0_t[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0_t[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1_t[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1_t[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1_t[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2_t[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2_t[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2_t[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3_t[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3_t[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3_t[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0_t[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1_t[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2_t[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1_t[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1_t[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2_t[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3_t[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0_t[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2_t[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3_t[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0_t[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1_t[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3_t[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H1, a, b, c, d, w1_t[1], MD5C20, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w2_t[0], MD5C21, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w2_t[3], MD5C22, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w3_t[2], MD5C23, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w0_t[1], MD5C24, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w1_t[0], MD5C25, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w1_t[3], MD5C26, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w2_t[2], MD5C27, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w3_t[1], MD5C28, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w0_t[0], MD5C29, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w0_t[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w1_t[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w2_t[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w3_t[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w3_t[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w0_t[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1_t[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3_t[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3_t[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0_t[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0_t[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2_t[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1_t[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3_t[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1_t[0], MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w2_t[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0_t[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2_t[1], MD5C3f, MD5S33); + + a += r_a; + b += r_b; + c += r_c; + d += r_d; + + const u32x r0 = a; + const u32x r1 = d; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_S + } +} + +static void m11400m_0_1 (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], const u32 pw_len, __global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global sip_t *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, __local u32 l_bin2asc[256]) +{ + /** + * modifier + */ + + const u32 gid = get_global_id (0); + const u32 lid = get_local_id (0); + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * salt + */ + + const u32 salt_len = esalt_bufs[salt_pos].salt_len; // not a bug, we need to get it from the esalt + + const u32 pw_salt_len = salt_len + pw_len; + + u32 salt_buf0[16]; + + salt_buf0[ 0] = esalt_bufs[salt_pos].salt_buf[ 0]; + salt_buf0[ 1] = esalt_bufs[salt_pos].salt_buf[ 1]; + salt_buf0[ 2] = esalt_bufs[salt_pos].salt_buf[ 2]; + salt_buf0[ 3] = esalt_bufs[salt_pos].salt_buf[ 3]; + salt_buf0[ 4] = esalt_bufs[salt_pos].salt_buf[ 4]; + salt_buf0[ 5] = esalt_bufs[salt_pos].salt_buf[ 5]; + salt_buf0[ 6] = esalt_bufs[salt_pos].salt_buf[ 6]; + salt_buf0[ 7] = esalt_bufs[salt_pos].salt_buf[ 7]; + salt_buf0[ 8] = esalt_bufs[salt_pos].salt_buf[ 8]; + salt_buf0[ 9] = esalt_bufs[salt_pos].salt_buf[ 9]; + salt_buf0[10] = esalt_bufs[salt_pos].salt_buf[10]; + salt_buf0[11] = esalt_bufs[salt_pos].salt_buf[11]; + salt_buf0[12] = esalt_bufs[salt_pos].salt_buf[12]; + salt_buf0[13] = esalt_bufs[salt_pos].salt_buf[13]; + salt_buf0[14] = esalt_bufs[salt_pos].salt_buf[14]; + salt_buf0[15] = esalt_bufs[salt_pos].salt_buf[15]; + + u32 salt_buf1[16]; + + salt_buf1[ 0] = esalt_bufs[salt_pos].salt_buf[16]; + salt_buf1[ 1] = esalt_bufs[salt_pos].salt_buf[17]; + salt_buf1[ 2] = esalt_bufs[salt_pos].salt_buf[18]; + salt_buf1[ 3] = esalt_bufs[salt_pos].salt_buf[19]; + salt_buf1[ 4] = esalt_bufs[salt_pos].salt_buf[20]; + salt_buf1[ 5] = esalt_bufs[salt_pos].salt_buf[21]; + salt_buf1[ 6] = esalt_bufs[salt_pos].salt_buf[22]; + salt_buf1[ 7] = esalt_bufs[salt_pos].salt_buf[23]; + salt_buf1[ 8] = esalt_bufs[salt_pos].salt_buf[24]; + salt_buf1[ 9] = esalt_bufs[salt_pos].salt_buf[25]; + salt_buf1[10] = esalt_bufs[salt_pos].salt_buf[26]; + salt_buf1[11] = esalt_bufs[salt_pos].salt_buf[27]; + salt_buf1[12] = esalt_bufs[salt_pos].salt_buf[28]; + salt_buf1[13] = esalt_bufs[salt_pos].salt_buf[29]; + salt_buf1[14] = 0; + salt_buf1[15] = 0; + + /** + * esalt + */ + + const u32 esalt_len = esalt_bufs[salt_pos].esalt_len; + + u32 esalt_buf0[16]; + + esalt_buf0[ 0] = esalt_bufs[salt_pos].esalt_buf[ 0]; + esalt_buf0[ 1] = esalt_bufs[salt_pos].esalt_buf[ 1]; + esalt_buf0[ 2] = esalt_bufs[salt_pos].esalt_buf[ 2]; + esalt_buf0[ 3] = esalt_bufs[salt_pos].esalt_buf[ 3]; + esalt_buf0[ 4] = esalt_bufs[salt_pos].esalt_buf[ 4]; + esalt_buf0[ 5] = esalt_bufs[salt_pos].esalt_buf[ 5]; + esalt_buf0[ 6] = esalt_bufs[salt_pos].esalt_buf[ 6]; + esalt_buf0[ 7] = esalt_bufs[salt_pos].esalt_buf[ 7]; + esalt_buf0[ 8] = esalt_bufs[salt_pos].esalt_buf[ 8]; + esalt_buf0[ 9] = esalt_bufs[salt_pos].esalt_buf[ 9]; + esalt_buf0[10] = esalt_bufs[salt_pos].esalt_buf[10]; + esalt_buf0[11] = esalt_bufs[salt_pos].esalt_buf[11]; + esalt_buf0[12] = esalt_bufs[salt_pos].esalt_buf[12]; + esalt_buf0[13] = esalt_bufs[salt_pos].esalt_buf[13]; + esalt_buf0[14] = esalt_bufs[salt_pos].esalt_buf[14]; + esalt_buf0[15] = esalt_bufs[salt_pos].esalt_buf[15]; + + u32 esalt_buf1[16]; + + esalt_buf1[ 0] = esalt_bufs[salt_pos].esalt_buf[16]; + esalt_buf1[ 1] = esalt_bufs[salt_pos].esalt_buf[17]; + esalt_buf1[ 2] = esalt_bufs[salt_pos].esalt_buf[18]; + esalt_buf1[ 3] = esalt_bufs[salt_pos].esalt_buf[19]; + esalt_buf1[ 4] = esalt_bufs[salt_pos].esalt_buf[20]; + esalt_buf1[ 5] = esalt_bufs[salt_pos].esalt_buf[21]; + esalt_buf1[ 6] = esalt_bufs[salt_pos].esalt_buf[22]; + esalt_buf1[ 7] = esalt_bufs[salt_pos].esalt_buf[23]; + esalt_buf1[ 8] = esalt_bufs[salt_pos].esalt_buf[24]; + esalt_buf1[ 9] = esalt_bufs[salt_pos].esalt_buf[25]; + esalt_buf1[10] = esalt_bufs[salt_pos].esalt_buf[26]; + esalt_buf1[11] = esalt_bufs[salt_pos].esalt_buf[27]; + esalt_buf1[12] = esalt_bufs[salt_pos].esalt_buf[28]; + esalt_buf1[13] = esalt_bufs[salt_pos].esalt_buf[29]; + esalt_buf1[14] = esalt_bufs[salt_pos].esalt_buf[30]; + esalt_buf1[15] = esalt_bufs[salt_pos].esalt_buf[31]; + + u32 esalt_buf2[16]; + + esalt_buf2[ 0] = esalt_bufs[salt_pos].esalt_buf[32]; + esalt_buf2[ 1] = esalt_bufs[salt_pos].esalt_buf[33]; + esalt_buf2[ 2] = esalt_bufs[salt_pos].esalt_buf[34]; + esalt_buf2[ 3] = esalt_bufs[salt_pos].esalt_buf[35]; + esalt_buf2[ 4] = esalt_bufs[salt_pos].esalt_buf[36]; + esalt_buf2[ 5] = esalt_bufs[salt_pos].esalt_buf[37]; + esalt_buf2[ 6] = 0; + esalt_buf2[ 7] = 0; + esalt_buf2[ 8] = 0; + esalt_buf2[ 9] = 0; + esalt_buf2[10] = 0; + esalt_buf2[11] = 0; + esalt_buf2[12] = 0; + esalt_buf2[13] = 0; + esalt_buf2[14] = 0; + esalt_buf2[15] = 0; + + const u32 digest_esalt_len = 32 + esalt_len; + + /** + * loop + */ + + u32x w0l = w0[0]; + + for (u32 il_pos = 0; il_pos < bfs_cnt; il_pos++) + { + const u32 w0r = bfs_buf[il_pos].i; + + w0[0] = w0l | w0r; + + /* + * HA1 = md5 ($salt . $pass) + */ + + // append the pass to the salt + + u32x block0[16]; + + block0[ 0] = salt_buf0[ 0]; + block0[ 1] = salt_buf0[ 1]; + block0[ 2] = salt_buf0[ 2]; + block0[ 3] = salt_buf0[ 3]; + block0[ 4] = salt_buf0[ 4]; + block0[ 5] = salt_buf0[ 5]; + block0[ 6] = salt_buf0[ 6]; + block0[ 7] = salt_buf0[ 7]; + block0[ 8] = salt_buf0[ 8]; + block0[ 9] = salt_buf0[ 9]; + block0[10] = salt_buf0[10]; + block0[11] = salt_buf0[11]; + block0[12] = salt_buf0[12]; + block0[13] = salt_buf0[13]; + block0[14] = salt_buf0[14]; + block0[15] = salt_buf0[15]; + + u32x block1[16]; + + block1[ 0] = salt_buf1[ 0]; + block1[ 1] = salt_buf1[ 1]; + block1[ 2] = salt_buf1[ 2]; + block1[ 3] = salt_buf1[ 3]; + block1[ 4] = salt_buf1[ 4]; + block1[ 5] = salt_buf1[ 5]; + block1[ 6] = salt_buf1[ 6]; + block1[ 7] = salt_buf1[ 7]; + block1[ 8] = salt_buf1[ 8]; + block1[ 9] = salt_buf1[ 9]; + block1[10] = salt_buf1[10]; + block1[11] = salt_buf1[11]; + block1[12] = salt_buf1[12]; + block1[13] = salt_buf1[13]; + block1[14] = salt_buf1[14]; + block1[15] = salt_buf1[15]; + + memcat32 (block0, block1, salt_len, w0, w1, w2, w3, pw_len); + + u32x w0_t[4]; + + w0_t[0] = block0[ 0]; + w0_t[1] = block0[ 1]; + w0_t[2] = block0[ 2]; + w0_t[3] = block0[ 3]; + + u32x w1_t[4]; + + w1_t[0] = block0[ 4]; + w1_t[1] = block0[ 5]; + w1_t[2] = block0[ 6]; + w1_t[3] = block0[ 7]; + + u32x w2_t[4]; + + w2_t[0] = block0[ 8]; + w2_t[1] = block0[ 9]; + w2_t[2] = block0[10]; + w2_t[3] = block0[11]; + + u32x w3_t[4]; + + w3_t[0] = block0[12]; + w3_t[1] = block0[13]; + w3_t[2] = pw_salt_len * 8; + w3_t[3] = 0; + + // md5 + + u32x tmp2; + + u32x a = MD5M_A; + u32x b = MD5M_B; + u32x c = MD5M_C; + u32x d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0_t[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0_t[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0_t[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1_t[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1_t[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1_t[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2_t[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2_t[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2_t[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3_t[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3_t[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3_t[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0_t[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1_t[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2_t[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1_t[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1_t[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2_t[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3_t[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0_t[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2_t[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3_t[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0_t[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1_t[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3_t[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H1, a, b, c, d, w1_t[1], MD5C20, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w2_t[0], MD5C21, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w2_t[3], MD5C22, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w3_t[2], MD5C23, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w0_t[1], MD5C24, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w1_t[0], MD5C25, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w1_t[3], MD5C26, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w2_t[2], MD5C27, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w3_t[1], MD5C28, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w0_t[0], MD5C29, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w0_t[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w1_t[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w2_t[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w3_t[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w3_t[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w0_t[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1_t[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3_t[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3_t[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0_t[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0_t[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2_t[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1_t[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3_t[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1_t[0], MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w2_t[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0_t[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2_t[1], MD5C3f, MD5S33); + + a += MD5M_A; + b += MD5M_B; + c += MD5M_C; + d += MD5M_D; + + /* + * final = md5 ($HA1 . $esalt) + * we have at least 2 MD5 blocks/transformations, but we might need 3 + */ + + w0_t[0] = uint_to_hex_lower8 ((a >> 0) & 255) << 0 + | uint_to_hex_lower8 ((a >> 8) & 255) << 16; + w0_t[1] = uint_to_hex_lower8 ((a >> 16) & 255) << 0 + | uint_to_hex_lower8 ((a >> 24) & 255) << 16; + w0_t[2] = uint_to_hex_lower8 ((b >> 0) & 255) << 0 + | uint_to_hex_lower8 ((b >> 8) & 255) << 16; + w0_t[3] = uint_to_hex_lower8 ((b >> 16) & 255) << 0 + | uint_to_hex_lower8 ((b >> 24) & 255) << 16; + w1_t[0] = uint_to_hex_lower8 ((c >> 0) & 255) << 0 + | uint_to_hex_lower8 ((c >> 8) & 255) << 16; + w1_t[1] = uint_to_hex_lower8 ((c >> 16) & 255) << 0 + | uint_to_hex_lower8 ((c >> 24) & 255) << 16; + w1_t[2] = uint_to_hex_lower8 ((d >> 0) & 255) << 0 + | uint_to_hex_lower8 ((d >> 8) & 255) << 16; + w1_t[3] = uint_to_hex_lower8 ((d >> 16) & 255) << 0 + | uint_to_hex_lower8 ((d >> 24) & 255) << 16; + + w2_t[0] = esalt_buf0[0]; + w2_t[1] = esalt_buf0[1]; + w2_t[2] = esalt_buf0[2]; + w2_t[3] = esalt_buf0[3]; + + w3_t[0] = esalt_buf0[4]; + w3_t[1] = esalt_buf0[5]; + w3_t[2] = esalt_buf0[6]; + w3_t[3] = esalt_buf0[7]; + + // md5 + // 1st transform + + a = MD5M_A; + b = MD5M_B; + c = MD5M_C; + d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0_t[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0_t[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0_t[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1_t[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1_t[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1_t[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2_t[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2_t[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2_t[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3_t[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3_t[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3_t[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0_t[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1_t[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2_t[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1_t[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1_t[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2_t[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3_t[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0_t[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2_t[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3_t[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0_t[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1_t[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3_t[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H1, a, b, c, d, w1_t[1], MD5C20, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w2_t[0], MD5C21, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w2_t[3], MD5C22, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w3_t[2], MD5C23, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w0_t[1], MD5C24, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w1_t[0], MD5C25, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w1_t[3], MD5C26, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w2_t[2], MD5C27, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w3_t[1], MD5C28, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w0_t[0], MD5C29, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w0_t[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w1_t[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w2_t[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w3_t[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w3_t[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w0_t[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1_t[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3_t[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3_t[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0_t[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0_t[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2_t[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1_t[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3_t[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1_t[0], MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w2_t[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0_t[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2_t[1], MD5C3f, MD5S33); + + a += MD5M_A; + b += MD5M_B; + c += MD5M_C; + d += MD5M_D; + + u32x r_a = a; + u32x r_b = b; + u32x r_c = c; + u32x r_d = d; + + // 2nd transform + + w0_t[0] = esalt_buf0[ 8]; + w0_t[1] = esalt_buf0[ 9]; + w0_t[2] = esalt_buf0[10]; + w0_t[3] = esalt_buf0[11]; + + w1_t[0] = esalt_buf0[12]; + w1_t[1] = esalt_buf0[13]; + w1_t[2] = esalt_buf0[14]; + w1_t[3] = esalt_buf0[15]; + + w2_t[0] = esalt_buf1[ 0]; + w2_t[1] = esalt_buf1[ 1]; + w2_t[2] = esalt_buf1[ 2]; + w2_t[3] = esalt_buf1[ 3]; + + w3_t[0] = esalt_buf1[ 4]; + w3_t[1] = esalt_buf1[ 5]; + w3_t[2] = esalt_buf1[ 6]; + w3_t[3] = esalt_buf1[ 7]; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0_t[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0_t[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0_t[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1_t[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1_t[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1_t[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2_t[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2_t[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2_t[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3_t[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3_t[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3_t[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0_t[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1_t[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2_t[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1_t[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1_t[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2_t[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3_t[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0_t[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2_t[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3_t[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0_t[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1_t[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3_t[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H1, a, b, c, d, w1_t[1], MD5C20, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w2_t[0], MD5C21, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w2_t[3], MD5C22, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w3_t[2], MD5C23, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w0_t[1], MD5C24, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w1_t[0], MD5C25, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w1_t[3], MD5C26, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w2_t[2], MD5C27, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w3_t[1], MD5C28, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w0_t[0], MD5C29, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w0_t[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w1_t[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w2_t[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w3_t[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w3_t[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w0_t[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1_t[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3_t[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3_t[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0_t[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0_t[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2_t[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1_t[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3_t[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1_t[0], MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w2_t[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0_t[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2_t[1], MD5C3f, MD5S33); + + // this is for sure the final block + + a += r_a; + b += r_b; + c += r_c; + d += r_d; + + r_a = a; + r_b = b; + r_c = c; + r_d = d; + + w0_t[0] = esalt_buf1[ 8]; + w0_t[1] = esalt_buf1[ 9]; + w0_t[2] = esalt_buf1[10]; + w0_t[3] = esalt_buf1[11]; + + w1_t[0] = esalt_buf1[12]; + w1_t[1] = esalt_buf1[13]; + w1_t[2] = esalt_buf1[14]; + w1_t[3] = esalt_buf1[15]; + + w2_t[0] = esalt_buf2[ 0]; + w2_t[1] = esalt_buf2[ 1]; + w2_t[2] = esalt_buf2[ 2]; + w2_t[3] = esalt_buf2[ 3]; + + w3_t[0] = esalt_buf2[ 4]; + w3_t[1] = esalt_buf2[ 5]; + w3_t[2] = digest_esalt_len * 8; + w3_t[3] = 0; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0_t[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0_t[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0_t[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1_t[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1_t[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1_t[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2_t[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2_t[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2_t[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3_t[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3_t[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3_t[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0_t[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1_t[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2_t[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1_t[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1_t[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2_t[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3_t[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0_t[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2_t[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3_t[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0_t[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1_t[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3_t[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H1, a, b, c, d, w1_t[1], MD5C20, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w2_t[0], MD5C21, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w2_t[3], MD5C22, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w3_t[2], MD5C23, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w0_t[1], MD5C24, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w1_t[0], MD5C25, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w1_t[3], MD5C26, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w2_t[2], MD5C27, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w3_t[1], MD5C28, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w0_t[0], MD5C29, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w0_t[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w1_t[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w2_t[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w3_t[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w3_t[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w0_t[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1_t[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3_t[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3_t[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0_t[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0_t[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2_t[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1_t[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3_t[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1_t[0], MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w2_t[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0_t[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2_t[1], MD5C3f, MD5S33); + + a += r_a; + b += r_b; + c += r_c; + d += r_d; + + const u32x r0 = a; + const u32x r1 = d; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_S + } +} + +static void m11400m_1_0 (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], const u32 pw_len, __global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global sip_t *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, __local u32 l_bin2asc[256]) +{ + /** + * modifier + */ + + const u32 gid = get_global_id (0); + const u32 lid = get_local_id (0); + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * salt + */ + + const u32 salt_len = esalt_bufs[salt_pos].salt_len; // not a bug, we need to get it from the esalt + + const u32 pw_salt_len = salt_len + pw_len; + + u32 salt_buf0[16]; + + salt_buf0[ 0] = esalt_bufs[salt_pos].salt_buf[ 0]; + salt_buf0[ 1] = esalt_bufs[salt_pos].salt_buf[ 1]; + salt_buf0[ 2] = esalt_bufs[salt_pos].salt_buf[ 2]; + salt_buf0[ 3] = esalt_bufs[salt_pos].salt_buf[ 3]; + salt_buf0[ 4] = esalt_bufs[salt_pos].salt_buf[ 4]; + salt_buf0[ 5] = esalt_bufs[salt_pos].salt_buf[ 5]; + salt_buf0[ 6] = esalt_bufs[salt_pos].salt_buf[ 6]; + salt_buf0[ 7] = esalt_bufs[salt_pos].salt_buf[ 7]; + salt_buf0[ 8] = esalt_bufs[salt_pos].salt_buf[ 8]; + salt_buf0[ 9] = esalt_bufs[salt_pos].salt_buf[ 9]; + salt_buf0[10] = esalt_bufs[salt_pos].salt_buf[10]; + salt_buf0[11] = esalt_bufs[salt_pos].salt_buf[11]; + salt_buf0[12] = esalt_bufs[salt_pos].salt_buf[12]; + salt_buf0[13] = esalt_bufs[salt_pos].salt_buf[13]; + salt_buf0[14] = esalt_bufs[salt_pos].salt_buf[14]; + salt_buf0[15] = esalt_bufs[salt_pos].salt_buf[15]; + + u32 salt_buf1[16]; + + salt_buf1[ 0] = esalt_bufs[salt_pos].salt_buf[16]; + salt_buf1[ 1] = esalt_bufs[salt_pos].salt_buf[17]; + salt_buf1[ 2] = esalt_bufs[salt_pos].salt_buf[18]; + salt_buf1[ 3] = esalt_bufs[salt_pos].salt_buf[19]; + salt_buf1[ 4] = esalt_bufs[salt_pos].salt_buf[20]; + salt_buf1[ 5] = esalt_bufs[salt_pos].salt_buf[21]; + salt_buf1[ 6] = esalt_bufs[salt_pos].salt_buf[22]; + salt_buf1[ 7] = esalt_bufs[salt_pos].salt_buf[23]; + salt_buf1[ 8] = esalt_bufs[salt_pos].salt_buf[24]; + salt_buf1[ 9] = esalt_bufs[salt_pos].salt_buf[25]; + salt_buf1[10] = esalt_bufs[salt_pos].salt_buf[26]; + salt_buf1[11] = esalt_bufs[salt_pos].salt_buf[27]; + salt_buf1[12] = esalt_bufs[salt_pos].salt_buf[28]; + salt_buf1[13] = esalt_bufs[salt_pos].salt_buf[29]; + salt_buf1[14] = 0; + salt_buf1[15] = 0; + + /** + * esalt + */ + + const u32 esalt_len = esalt_bufs[salt_pos].esalt_len; + + u32 esalt_buf0[16]; + + esalt_buf0[ 0] = esalt_bufs[salt_pos].esalt_buf[ 0]; + esalt_buf0[ 1] = esalt_bufs[salt_pos].esalt_buf[ 1]; + esalt_buf0[ 2] = esalt_bufs[salt_pos].esalt_buf[ 2]; + esalt_buf0[ 3] = esalt_bufs[salt_pos].esalt_buf[ 3]; + esalt_buf0[ 4] = esalt_bufs[salt_pos].esalt_buf[ 4]; + esalt_buf0[ 5] = esalt_bufs[salt_pos].esalt_buf[ 5]; + esalt_buf0[ 6] = esalt_bufs[salt_pos].esalt_buf[ 6]; + esalt_buf0[ 7] = esalt_bufs[salt_pos].esalt_buf[ 7]; + esalt_buf0[ 8] = esalt_bufs[salt_pos].esalt_buf[ 8]; + esalt_buf0[ 9] = esalt_bufs[salt_pos].esalt_buf[ 9]; + esalt_buf0[10] = esalt_bufs[salt_pos].esalt_buf[10]; + esalt_buf0[11] = esalt_bufs[salt_pos].esalt_buf[11]; + esalt_buf0[12] = esalt_bufs[salt_pos].esalt_buf[12]; + esalt_buf0[13] = esalt_bufs[salt_pos].esalt_buf[13]; + esalt_buf0[14] = esalt_bufs[salt_pos].esalt_buf[14]; + esalt_buf0[15] = esalt_bufs[salt_pos].esalt_buf[15]; + + u32 esalt_buf1[16]; + + esalt_buf1[ 0] = esalt_bufs[salt_pos].esalt_buf[16]; + esalt_buf1[ 1] = esalt_bufs[salt_pos].esalt_buf[17]; + esalt_buf1[ 2] = esalt_bufs[salt_pos].esalt_buf[18]; + esalt_buf1[ 3] = esalt_bufs[salt_pos].esalt_buf[19]; + esalt_buf1[ 4] = esalt_bufs[salt_pos].esalt_buf[20]; + esalt_buf1[ 5] = esalt_bufs[salt_pos].esalt_buf[21]; + esalt_buf1[ 6] = esalt_bufs[salt_pos].esalt_buf[22]; + esalt_buf1[ 7] = esalt_bufs[salt_pos].esalt_buf[23]; + esalt_buf1[ 8] = esalt_bufs[salt_pos].esalt_buf[24]; + esalt_buf1[ 9] = esalt_bufs[salt_pos].esalt_buf[25]; + esalt_buf1[10] = esalt_bufs[salt_pos].esalt_buf[26]; + esalt_buf1[11] = esalt_bufs[salt_pos].esalt_buf[27]; + esalt_buf1[12] = esalt_bufs[salt_pos].esalt_buf[28]; + esalt_buf1[13] = esalt_bufs[salt_pos].esalt_buf[29]; + esalt_buf1[14] = esalt_bufs[salt_pos].esalt_buf[30]; + esalt_buf1[15] = esalt_bufs[salt_pos].esalt_buf[31]; + + const u32 digest_esalt_len = 32 + esalt_len; + + /** + * loop + */ + + u32x w0l = w0[0]; + + for (u32 il_pos = 0; il_pos < bfs_cnt; il_pos++) + { + const u32 w0r = bfs_buf[il_pos].i; + + w0[0] = w0l | w0r; + + /* + * HA1 = md5 ($salt . $pass) + */ + + // append the pass to the salt + + u32x block0[16]; + + block0[ 0] = salt_buf0[ 0]; + block0[ 1] = salt_buf0[ 1]; + block0[ 2] = salt_buf0[ 2]; + block0[ 3] = salt_buf0[ 3]; + block0[ 4] = salt_buf0[ 4]; + block0[ 5] = salt_buf0[ 5]; + block0[ 6] = salt_buf0[ 6]; + block0[ 7] = salt_buf0[ 7]; + block0[ 8] = salt_buf0[ 8]; + block0[ 9] = salt_buf0[ 9]; + block0[10] = salt_buf0[10]; + block0[11] = salt_buf0[11]; + block0[12] = salt_buf0[12]; + block0[13] = salt_buf0[13]; + block0[14] = salt_buf0[14]; + block0[15] = salt_buf0[15]; + + u32x block1[16]; + + block1[ 0] = salt_buf1[ 0]; + block1[ 1] = salt_buf1[ 1]; + block1[ 2] = salt_buf1[ 2]; + block1[ 3] = salt_buf1[ 3]; + block1[ 4] = salt_buf1[ 4]; + block1[ 5] = salt_buf1[ 5]; + block1[ 6] = salt_buf1[ 6]; + block1[ 7] = salt_buf1[ 7]; + block1[ 8] = salt_buf1[ 8]; + block1[ 9] = salt_buf1[ 9]; + block1[10] = salt_buf1[10]; + block1[11] = salt_buf1[11]; + block1[12] = salt_buf1[12]; + block1[13] = salt_buf1[13]; + block1[14] = salt_buf1[14]; + block1[15] = salt_buf1[15]; + + memcat32 (block0, block1, salt_len, w0, w1, w2, w3, pw_len); + + u32x w0_t[4]; + + w0_t[0] = block0[ 0]; + w0_t[1] = block0[ 1]; + w0_t[2] = block0[ 2]; + w0_t[3] = block0[ 3]; + + u32x w1_t[4]; + + w1_t[0] = block0[ 4]; + w1_t[1] = block0[ 5]; + w1_t[2] = block0[ 6]; + w1_t[3] = block0[ 7]; + + u32x w2_t[4]; + + w2_t[0] = block0[ 8]; + w2_t[1] = block0[ 9]; + w2_t[2] = block0[10]; + w2_t[3] = block0[11]; + + u32x w3_t[4]; + + w3_t[0] = block0[12]; + w3_t[1] = block0[13]; + w3_t[2] = block0[14]; + w3_t[3] = block0[15]; + + // md5 + + u32x tmp2; + + u32x a = MD5M_A; + u32x b = MD5M_B; + u32x c = MD5M_C; + u32x d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0_t[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0_t[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0_t[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1_t[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1_t[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1_t[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2_t[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2_t[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2_t[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3_t[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3_t[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3_t[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0_t[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1_t[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2_t[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1_t[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1_t[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2_t[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3_t[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0_t[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2_t[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3_t[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0_t[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1_t[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3_t[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H1, a, b, c, d, w1_t[1], MD5C20, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w2_t[0], MD5C21, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w2_t[3], MD5C22, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w3_t[2], MD5C23, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w0_t[1], MD5C24, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w1_t[0], MD5C25, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w1_t[3], MD5C26, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w2_t[2], MD5C27, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w3_t[1], MD5C28, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w0_t[0], MD5C29, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w0_t[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w1_t[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w2_t[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w3_t[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w3_t[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w0_t[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1_t[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3_t[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3_t[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0_t[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0_t[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2_t[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1_t[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3_t[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1_t[0], MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w2_t[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0_t[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2_t[1], MD5C3f, MD5S33); + + a += MD5M_A; + b += MD5M_B; + c += MD5M_C; + d += MD5M_D; + + u32x r_a = a; + u32x r_b = b; + u32x r_c = c; + u32x r_d = d; + + w0_t[0] = block1[ 0]; + w0_t[1] = block1[ 1]; + w0_t[2] = block1[ 2]; + w0_t[3] = block1[ 3]; + + w1_t[0] = block1[ 4]; + w1_t[1] = block1[ 5]; + w1_t[2] = block1[ 6]; + w1_t[3] = block1[ 7]; + + w2_t[0] = block1[ 8]; + w2_t[1] = block1[ 9]; + w2_t[2] = block1[10]; + w2_t[3] = block1[11]; + + w3_t[0] = block1[12]; + w3_t[1] = block1[13]; + w3_t[2] = pw_salt_len * 8; + w3_t[3] = 0; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0_t[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0_t[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0_t[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1_t[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1_t[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1_t[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2_t[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2_t[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2_t[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3_t[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3_t[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3_t[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0_t[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1_t[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2_t[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1_t[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1_t[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2_t[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3_t[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0_t[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2_t[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3_t[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0_t[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1_t[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3_t[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H1, a, b, c, d, w1_t[1], MD5C20, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w2_t[0], MD5C21, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w2_t[3], MD5C22, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w3_t[2], MD5C23, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w0_t[1], MD5C24, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w1_t[0], MD5C25, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w1_t[3], MD5C26, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w2_t[2], MD5C27, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w3_t[1], MD5C28, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w0_t[0], MD5C29, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w0_t[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w1_t[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w2_t[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w3_t[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w3_t[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w0_t[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1_t[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3_t[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3_t[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0_t[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0_t[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2_t[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1_t[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3_t[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1_t[0], MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w2_t[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0_t[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2_t[1], MD5C3f, MD5S33); + + a += r_a; + b += r_b; + c += r_c; + d += r_d; + + /* + * final = md5 ($HA1 . $esalt) + * we have at least 2 MD5 blocks/transformations, but we might need 3 + */ + + w0_t[0] = uint_to_hex_lower8 ((a >> 0) & 255) << 0 + | uint_to_hex_lower8 ((a >> 8) & 255) << 16; + w0_t[1] = uint_to_hex_lower8 ((a >> 16) & 255) << 0 + | uint_to_hex_lower8 ((a >> 24) & 255) << 16; + w0_t[2] = uint_to_hex_lower8 ((b >> 0) & 255) << 0 + | uint_to_hex_lower8 ((b >> 8) & 255) << 16; + w0_t[3] = uint_to_hex_lower8 ((b >> 16) & 255) << 0 + | uint_to_hex_lower8 ((b >> 24) & 255) << 16; + w1_t[0] = uint_to_hex_lower8 ((c >> 0) & 255) << 0 + | uint_to_hex_lower8 ((c >> 8) & 255) << 16; + w1_t[1] = uint_to_hex_lower8 ((c >> 16) & 255) << 0 + | uint_to_hex_lower8 ((c >> 24) & 255) << 16; + w1_t[2] = uint_to_hex_lower8 ((d >> 0) & 255) << 0 + | uint_to_hex_lower8 ((d >> 8) & 255) << 16; + w1_t[3] = uint_to_hex_lower8 ((d >> 16) & 255) << 0 + | uint_to_hex_lower8 ((d >> 24) & 255) << 16; + + w2_t[0] = esalt_buf0[0]; + w2_t[1] = esalt_buf0[1]; + w2_t[2] = esalt_buf0[2]; + w2_t[3] = esalt_buf0[3]; + + w3_t[0] = esalt_buf0[4]; + w3_t[1] = esalt_buf0[5]; + w3_t[2] = esalt_buf0[6]; + w3_t[3] = esalt_buf0[7]; + + // md5 + // 1st transform + + a = MD5M_A; + b = MD5M_B; + c = MD5M_C; + d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0_t[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0_t[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0_t[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1_t[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1_t[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1_t[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2_t[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2_t[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2_t[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3_t[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3_t[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3_t[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0_t[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1_t[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2_t[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1_t[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1_t[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2_t[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3_t[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0_t[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2_t[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3_t[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0_t[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1_t[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3_t[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H1, a, b, c, d, w1_t[1], MD5C20, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w2_t[0], MD5C21, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w2_t[3], MD5C22, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w3_t[2], MD5C23, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w0_t[1], MD5C24, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w1_t[0], MD5C25, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w1_t[3], MD5C26, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w2_t[2], MD5C27, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w3_t[1], MD5C28, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w0_t[0], MD5C29, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w0_t[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w1_t[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w2_t[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w3_t[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w3_t[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w0_t[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1_t[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3_t[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3_t[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0_t[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0_t[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2_t[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1_t[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3_t[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1_t[0], MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w2_t[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0_t[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2_t[1], MD5C3f, MD5S33); + + a += MD5M_A; + b += MD5M_B; + c += MD5M_C; + d += MD5M_D; + + r_a = a; + r_b = b; + r_c = c; + r_d = d; + + // 2nd transform + + w0_t[0] = esalt_buf0[ 8]; + w0_t[1] = esalt_buf0[ 9]; + w0_t[2] = esalt_buf0[10]; + w0_t[3] = esalt_buf0[11]; + + w1_t[0] = esalt_buf0[12]; + w1_t[1] = esalt_buf0[13]; + w1_t[2] = esalt_buf0[14]; + w1_t[3] = esalt_buf0[15]; + + w2_t[0] = esalt_buf1[ 0]; + w2_t[1] = esalt_buf1[ 1]; + w2_t[2] = esalt_buf1[ 2]; + w2_t[3] = esalt_buf1[ 3]; + + w3_t[0] = esalt_buf1[ 4]; + w3_t[1] = esalt_buf1[ 5]; + w3_t[2] = digest_esalt_len * 8; + w3_t[3] = 0; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0_t[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0_t[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0_t[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1_t[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1_t[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1_t[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2_t[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2_t[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2_t[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3_t[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3_t[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3_t[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0_t[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1_t[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2_t[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1_t[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1_t[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2_t[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3_t[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0_t[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2_t[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3_t[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0_t[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1_t[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3_t[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H1, a, b, c, d, w1_t[1], MD5C20, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w2_t[0], MD5C21, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w2_t[3], MD5C22, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w3_t[2], MD5C23, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w0_t[1], MD5C24, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w1_t[0], MD5C25, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w1_t[3], MD5C26, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w2_t[2], MD5C27, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w3_t[1], MD5C28, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w0_t[0], MD5C29, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w0_t[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w1_t[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w2_t[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w3_t[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w3_t[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w0_t[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1_t[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3_t[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3_t[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0_t[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0_t[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2_t[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1_t[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3_t[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1_t[0], MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w2_t[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0_t[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2_t[1], MD5C3f, MD5S33); + + a += r_a; + b += r_b; + c += r_c; + d += r_d; + + const u32x r0 = a; + const u32x r1 = d; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_S + } +} + +static void m11400m_1_1 (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], const u32 pw_len, __global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global sip_t *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, __local u32 l_bin2asc[256]) +{ + /** + * modifier + */ + + const u32 gid = get_global_id (0); + const u32 lid = get_local_id (0); + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * salt + */ + + const u32 salt_len = esalt_bufs[salt_pos].salt_len; // not a bug, we need to get it from the esalt + + const u32 pw_salt_len = salt_len + pw_len; + + u32 salt_buf0[16]; + + salt_buf0[ 0] = esalt_bufs[salt_pos].salt_buf[ 0]; + salt_buf0[ 1] = esalt_bufs[salt_pos].salt_buf[ 1]; + salt_buf0[ 2] = esalt_bufs[salt_pos].salt_buf[ 2]; + salt_buf0[ 3] = esalt_bufs[salt_pos].salt_buf[ 3]; + salt_buf0[ 4] = esalt_bufs[salt_pos].salt_buf[ 4]; + salt_buf0[ 5] = esalt_bufs[salt_pos].salt_buf[ 5]; + salt_buf0[ 6] = esalt_bufs[salt_pos].salt_buf[ 6]; + salt_buf0[ 7] = esalt_bufs[salt_pos].salt_buf[ 7]; + salt_buf0[ 8] = esalt_bufs[salt_pos].salt_buf[ 8]; + salt_buf0[ 9] = esalt_bufs[salt_pos].salt_buf[ 9]; + salt_buf0[10] = esalt_bufs[salt_pos].salt_buf[10]; + salt_buf0[11] = esalt_bufs[salt_pos].salt_buf[11]; + salt_buf0[12] = esalt_bufs[salt_pos].salt_buf[12]; + salt_buf0[13] = esalt_bufs[salt_pos].salt_buf[13]; + salt_buf0[14] = esalt_bufs[salt_pos].salt_buf[14]; + salt_buf0[15] = esalt_bufs[salt_pos].salt_buf[15]; + + u32 salt_buf1[16]; + + salt_buf1[ 0] = esalt_bufs[salt_pos].salt_buf[16]; + salt_buf1[ 1] = esalt_bufs[salt_pos].salt_buf[17]; + salt_buf1[ 2] = esalt_bufs[salt_pos].salt_buf[18]; + salt_buf1[ 3] = esalt_bufs[salt_pos].salt_buf[19]; + salt_buf1[ 4] = esalt_bufs[salt_pos].salt_buf[20]; + salt_buf1[ 5] = esalt_bufs[salt_pos].salt_buf[21]; + salt_buf1[ 6] = esalt_bufs[salt_pos].salt_buf[22]; + salt_buf1[ 7] = esalt_bufs[salt_pos].salt_buf[23]; + salt_buf1[ 8] = esalt_bufs[salt_pos].salt_buf[24]; + salt_buf1[ 9] = esalt_bufs[salt_pos].salt_buf[25]; + salt_buf1[10] = esalt_bufs[salt_pos].salt_buf[26]; + salt_buf1[11] = esalt_bufs[salt_pos].salt_buf[27]; + salt_buf1[12] = esalt_bufs[salt_pos].salt_buf[28]; + salt_buf1[13] = esalt_bufs[salt_pos].salt_buf[29]; + salt_buf1[14] = 0; + salt_buf1[15] = 0; + + /** + * esalt + */ + + const u32 esalt_len = esalt_bufs[salt_pos].esalt_len; + + u32 esalt_buf0[16]; + + esalt_buf0[ 0] = esalt_bufs[salt_pos].esalt_buf[ 0]; + esalt_buf0[ 1] = esalt_bufs[salt_pos].esalt_buf[ 1]; + esalt_buf0[ 2] = esalt_bufs[salt_pos].esalt_buf[ 2]; + esalt_buf0[ 3] = esalt_bufs[salt_pos].esalt_buf[ 3]; + esalt_buf0[ 4] = esalt_bufs[salt_pos].esalt_buf[ 4]; + esalt_buf0[ 5] = esalt_bufs[salt_pos].esalt_buf[ 5]; + esalt_buf0[ 6] = esalt_bufs[salt_pos].esalt_buf[ 6]; + esalt_buf0[ 7] = esalt_bufs[salt_pos].esalt_buf[ 7]; + esalt_buf0[ 8] = esalt_bufs[salt_pos].esalt_buf[ 8]; + esalt_buf0[ 9] = esalt_bufs[salt_pos].esalt_buf[ 9]; + esalt_buf0[10] = esalt_bufs[salt_pos].esalt_buf[10]; + esalt_buf0[11] = esalt_bufs[salt_pos].esalt_buf[11]; + esalt_buf0[12] = esalt_bufs[salt_pos].esalt_buf[12]; + esalt_buf0[13] = esalt_bufs[salt_pos].esalt_buf[13]; + esalt_buf0[14] = esalt_bufs[salt_pos].esalt_buf[14]; + esalt_buf0[15] = esalt_bufs[salt_pos].esalt_buf[15]; + + u32 esalt_buf1[16]; + + esalt_buf1[ 0] = esalt_bufs[salt_pos].esalt_buf[16]; + esalt_buf1[ 1] = esalt_bufs[salt_pos].esalt_buf[17]; + esalt_buf1[ 2] = esalt_bufs[salt_pos].esalt_buf[18]; + esalt_buf1[ 3] = esalt_bufs[salt_pos].esalt_buf[19]; + esalt_buf1[ 4] = esalt_bufs[salt_pos].esalt_buf[20]; + esalt_buf1[ 5] = esalt_bufs[salt_pos].esalt_buf[21]; + esalt_buf1[ 6] = esalt_bufs[salt_pos].esalt_buf[22]; + esalt_buf1[ 7] = esalt_bufs[salt_pos].esalt_buf[23]; + esalt_buf1[ 8] = esalt_bufs[salt_pos].esalt_buf[24]; + esalt_buf1[ 9] = esalt_bufs[salt_pos].esalt_buf[25]; + esalt_buf1[10] = esalt_bufs[salt_pos].esalt_buf[26]; + esalt_buf1[11] = esalt_bufs[salt_pos].esalt_buf[27]; + esalt_buf1[12] = esalt_bufs[salt_pos].esalt_buf[28]; + esalt_buf1[13] = esalt_bufs[salt_pos].esalt_buf[29]; + esalt_buf1[14] = esalt_bufs[salt_pos].esalt_buf[30]; + esalt_buf1[15] = esalt_bufs[salt_pos].esalt_buf[31]; + + u32 esalt_buf2[16]; + + esalt_buf2[ 0] = esalt_bufs[salt_pos].esalt_buf[32]; + esalt_buf2[ 1] = esalt_bufs[salt_pos].esalt_buf[33]; + esalt_buf2[ 2] = esalt_bufs[salt_pos].esalt_buf[34]; + esalt_buf2[ 3] = esalt_bufs[salt_pos].esalt_buf[35]; + esalt_buf2[ 4] = esalt_bufs[salt_pos].esalt_buf[36]; + esalt_buf2[ 5] = esalt_bufs[salt_pos].esalt_buf[37]; + esalt_buf2[ 6] = 0; + esalt_buf2[ 7] = 0; + esalt_buf2[ 8] = 0; + esalt_buf2[ 9] = 0; + esalt_buf2[10] = 0; + esalt_buf2[11] = 0; + esalt_buf2[12] = 0; + esalt_buf2[13] = 0; + esalt_buf2[14] = 0; + esalt_buf2[15] = 0; + + const u32 digest_esalt_len = 32 + esalt_len; + + /** + * loop + */ + + u32x w0l = w0[0]; + + for (u32 il_pos = 0; il_pos < bfs_cnt; il_pos++) + { + const u32 w0r = bfs_buf[il_pos].i; + + w0[0] = w0l | w0r; + + /* + * HA1 = md5 ($salt . $pass) + */ + + // append the pass to the salt + + u32x block0[16]; + + block0[ 0] = salt_buf0[ 0]; + block0[ 1] = salt_buf0[ 1]; + block0[ 2] = salt_buf0[ 2]; + block0[ 3] = salt_buf0[ 3]; + block0[ 4] = salt_buf0[ 4]; + block0[ 5] = salt_buf0[ 5]; + block0[ 6] = salt_buf0[ 6]; + block0[ 7] = salt_buf0[ 7]; + block0[ 8] = salt_buf0[ 8]; + block0[ 9] = salt_buf0[ 9]; + block0[10] = salt_buf0[10]; + block0[11] = salt_buf0[11]; + block0[12] = salt_buf0[12]; + block0[13] = salt_buf0[13]; + block0[14] = salt_buf0[14]; + block0[15] = salt_buf0[15]; + + u32x block1[16]; + + block1[ 0] = salt_buf1[ 0]; + block1[ 1] = salt_buf1[ 1]; + block1[ 2] = salt_buf1[ 2]; + block1[ 3] = salt_buf1[ 3]; + block1[ 4] = salt_buf1[ 4]; + block1[ 5] = salt_buf1[ 5]; + block1[ 6] = salt_buf1[ 6]; + block1[ 7] = salt_buf1[ 7]; + block1[ 8] = salt_buf1[ 8]; + block1[ 9] = salt_buf1[ 9]; + block1[10] = salt_buf1[10]; + block1[11] = salt_buf1[11]; + block1[12] = salt_buf1[12]; + block1[13] = salt_buf1[13]; + block1[14] = salt_buf1[14]; + block1[15] = salt_buf1[15]; + + memcat32 (block0, block1, salt_len, w0, w1, w2, w3, pw_len); + + u32x w0_t[4]; + + w0_t[0] = block0[ 0]; + w0_t[1] = block0[ 1]; + w0_t[2] = block0[ 2]; + w0_t[3] = block0[ 3]; + + u32x w1_t[4]; + + w1_t[0] = block0[ 4]; + w1_t[1] = block0[ 5]; + w1_t[2] = block0[ 6]; + w1_t[3] = block0[ 7]; + + u32x w2_t[4]; + + w2_t[0] = block0[ 8]; + w2_t[1] = block0[ 9]; + w2_t[2] = block0[10]; + w2_t[3] = block0[11]; + + u32x w3_t[4]; + + w3_t[0] = block0[12]; + w3_t[1] = block0[13]; + w3_t[2] = block0[14]; + w3_t[3] = block0[15]; + + // md5 + + u32x tmp2; + + u32x a = MD5M_A; + u32x b = MD5M_B; + u32x c = MD5M_C; + u32x d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0_t[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0_t[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0_t[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1_t[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1_t[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1_t[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2_t[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2_t[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2_t[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3_t[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3_t[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3_t[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0_t[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1_t[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2_t[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1_t[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1_t[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2_t[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3_t[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0_t[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2_t[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3_t[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0_t[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1_t[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3_t[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H1, a, b, c, d, w1_t[1], MD5C20, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w2_t[0], MD5C21, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w2_t[3], MD5C22, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w3_t[2], MD5C23, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w0_t[1], MD5C24, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w1_t[0], MD5C25, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w1_t[3], MD5C26, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w2_t[2], MD5C27, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w3_t[1], MD5C28, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w0_t[0], MD5C29, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w0_t[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w1_t[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w2_t[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w3_t[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w3_t[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w0_t[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1_t[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3_t[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3_t[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0_t[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0_t[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2_t[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1_t[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3_t[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1_t[0], MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w2_t[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0_t[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2_t[1], MD5C3f, MD5S33); + + a += MD5M_A; + b += MD5M_B; + c += MD5M_C; + d += MD5M_D; + + u32x r_a = a; + u32x r_b = b; + u32x r_c = c; + u32x r_d = d; + + w0_t[0] = block1[ 0]; + w0_t[1] = block1[ 1]; + w0_t[2] = block1[ 2]; + w0_t[3] = block1[ 3]; + + w1_t[0] = block1[ 4]; + w1_t[1] = block1[ 5]; + w1_t[2] = block1[ 6]; + w1_t[3] = block1[ 7]; + + w2_t[0] = block1[ 8]; + w2_t[1] = block1[ 9]; + w2_t[2] = block1[10]; + w2_t[3] = block1[11]; + + w3_t[0] = block1[12]; + w3_t[1] = block1[13]; + w3_t[2] = pw_salt_len * 8; + w3_t[3] = 0; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0_t[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0_t[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0_t[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1_t[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1_t[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1_t[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2_t[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2_t[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2_t[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3_t[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3_t[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3_t[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0_t[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1_t[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2_t[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1_t[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1_t[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2_t[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3_t[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0_t[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2_t[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3_t[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0_t[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1_t[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3_t[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H1, a, b, c, d, w1_t[1], MD5C20, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w2_t[0], MD5C21, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w2_t[3], MD5C22, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w3_t[2], MD5C23, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w0_t[1], MD5C24, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w1_t[0], MD5C25, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w1_t[3], MD5C26, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w2_t[2], MD5C27, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w3_t[1], MD5C28, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w0_t[0], MD5C29, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w0_t[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w1_t[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w2_t[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w3_t[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w3_t[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w0_t[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1_t[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3_t[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3_t[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0_t[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0_t[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2_t[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1_t[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3_t[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1_t[0], MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w2_t[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0_t[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2_t[1], MD5C3f, MD5S33); + + a += r_a; + b += r_b; + c += r_c; + d += r_d; + + /* + * final = md5 ($HA1 . $esalt) + * we have at least 2 MD5 blocks/transformations, but we might need 3 + */ + + w0_t[0] = uint_to_hex_lower8 ((a >> 0) & 255) << 0 + | uint_to_hex_lower8 ((a >> 8) & 255) << 16; + w0_t[1] = uint_to_hex_lower8 ((a >> 16) & 255) << 0 + | uint_to_hex_lower8 ((a >> 24) & 255) << 16; + w0_t[2] = uint_to_hex_lower8 ((b >> 0) & 255) << 0 + | uint_to_hex_lower8 ((b >> 8) & 255) << 16; + w0_t[3] = uint_to_hex_lower8 ((b >> 16) & 255) << 0 + | uint_to_hex_lower8 ((b >> 24) & 255) << 16; + w1_t[0] = uint_to_hex_lower8 ((c >> 0) & 255) << 0 + | uint_to_hex_lower8 ((c >> 8) & 255) << 16; + w1_t[1] = uint_to_hex_lower8 ((c >> 16) & 255) << 0 + | uint_to_hex_lower8 ((c >> 24) & 255) << 16; + w1_t[2] = uint_to_hex_lower8 ((d >> 0) & 255) << 0 + | uint_to_hex_lower8 ((d >> 8) & 255) << 16; + w1_t[3] = uint_to_hex_lower8 ((d >> 16) & 255) << 0 + | uint_to_hex_lower8 ((d >> 24) & 255) << 16; + + w2_t[0] = esalt_buf0[0]; + w2_t[1] = esalt_buf0[1]; + w2_t[2] = esalt_buf0[2]; + w2_t[3] = esalt_buf0[3]; + + w3_t[0] = esalt_buf0[4]; + w3_t[1] = esalt_buf0[5]; + w3_t[2] = esalt_buf0[6]; + w3_t[3] = esalt_buf0[7]; + + // md5 + // 1st transform + + a = MD5M_A; + b = MD5M_B; + c = MD5M_C; + d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0_t[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0_t[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0_t[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1_t[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1_t[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1_t[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2_t[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2_t[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2_t[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3_t[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3_t[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3_t[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0_t[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1_t[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2_t[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1_t[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1_t[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2_t[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3_t[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0_t[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2_t[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3_t[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0_t[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1_t[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3_t[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H1, a, b, c, d, w1_t[1], MD5C20, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w2_t[0], MD5C21, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w2_t[3], MD5C22, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w3_t[2], MD5C23, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w0_t[1], MD5C24, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w1_t[0], MD5C25, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w1_t[3], MD5C26, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w2_t[2], MD5C27, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w3_t[1], MD5C28, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w0_t[0], MD5C29, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w0_t[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w1_t[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w2_t[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w3_t[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w3_t[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w0_t[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1_t[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3_t[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3_t[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0_t[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0_t[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2_t[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1_t[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3_t[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1_t[0], MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w2_t[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0_t[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2_t[1], MD5C3f, MD5S33); + + a += MD5M_A; + b += MD5M_B; + c += MD5M_C; + d += MD5M_D; + + r_a = a; + r_b = b; + r_c = c; + r_d = d; + + // 2nd transform + + w0_t[0] = esalt_buf0[ 8]; + w0_t[1] = esalt_buf0[ 9]; + w0_t[2] = esalt_buf0[10]; + w0_t[3] = esalt_buf0[11]; + + w1_t[0] = esalt_buf0[12]; + w1_t[1] = esalt_buf0[13]; + w1_t[2] = esalt_buf0[14]; + w1_t[3] = esalt_buf0[15]; + + w2_t[0] = esalt_buf1[ 0]; + w2_t[1] = esalt_buf1[ 1]; + w2_t[2] = esalt_buf1[ 2]; + w2_t[3] = esalt_buf1[ 3]; + + w3_t[0] = esalt_buf1[ 4]; + w3_t[1] = esalt_buf1[ 5]; + w3_t[2] = esalt_buf1[ 6]; + w3_t[3] = esalt_buf1[ 7]; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0_t[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0_t[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0_t[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1_t[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1_t[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1_t[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2_t[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2_t[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2_t[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3_t[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3_t[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3_t[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0_t[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1_t[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2_t[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1_t[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1_t[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2_t[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3_t[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0_t[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2_t[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3_t[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0_t[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1_t[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3_t[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H1, a, b, c, d, w1_t[1], MD5C20, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w2_t[0], MD5C21, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w2_t[3], MD5C22, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w3_t[2], MD5C23, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w0_t[1], MD5C24, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w1_t[0], MD5C25, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w1_t[3], MD5C26, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w2_t[2], MD5C27, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w3_t[1], MD5C28, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w0_t[0], MD5C29, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w0_t[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w1_t[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w2_t[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w3_t[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w3_t[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w0_t[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1_t[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3_t[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3_t[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0_t[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0_t[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2_t[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1_t[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3_t[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1_t[0], MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w2_t[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0_t[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2_t[1], MD5C3f, MD5S33); + + // this is for sure the final block + + a += r_a; + b += r_b; + c += r_c; + d += r_d; + + r_a = a; + r_b = b; + r_c = c; + r_d = d; + + w0_t[0] = esalt_buf1[ 8]; + w0_t[1] = esalt_buf1[ 9]; + w0_t[2] = esalt_buf1[10]; + w0_t[3] = esalt_buf1[11]; + + w1_t[0] = esalt_buf1[12]; + w1_t[1] = esalt_buf1[13]; + w1_t[2] = esalt_buf1[14]; + w1_t[3] = esalt_buf1[15]; + + w2_t[0] = esalt_buf2[ 0]; + w2_t[1] = esalt_buf2[ 1]; + w2_t[2] = esalt_buf2[ 2]; + w2_t[3] = esalt_buf2[ 3]; + + w3_t[0] = esalt_buf2[ 4]; + w3_t[1] = esalt_buf2[ 5]; + w3_t[2] = digest_esalt_len * 8; + w3_t[3] = 0; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0_t[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0_t[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0_t[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1_t[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1_t[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1_t[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2_t[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2_t[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2_t[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3_t[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3_t[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3_t[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0_t[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1_t[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2_t[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1_t[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1_t[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2_t[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3_t[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0_t[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2_t[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3_t[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0_t[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1_t[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3_t[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H1, a, b, c, d, w1_t[1], MD5C20, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w2_t[0], MD5C21, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w2_t[3], MD5C22, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w3_t[2], MD5C23, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w0_t[1], MD5C24, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w1_t[0], MD5C25, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w1_t[3], MD5C26, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w2_t[2], MD5C27, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w3_t[1], MD5C28, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w0_t[0], MD5C29, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w0_t[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w1_t[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w2_t[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w3_t[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w3_t[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w0_t[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1_t[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3_t[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3_t[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0_t[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0_t[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2_t[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1_t[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3_t[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1_t[0], MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w2_t[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0_t[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2_t[1], MD5C3f, MD5S33); + + a += r_a; + b += r_b; + c += r_c; + d += r_d; + + const u32x r0 = a; + const u32x r1 = d; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_S + } +} + +static void m11400s_0_0 (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], const u32 pw_len, __global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global sip_t *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, __local u32 l_bin2asc[256]) +{ + /** + * modifier + */ + + const u32 gid = get_global_id (0); + const u32 lid = get_local_id (0); + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * salt + */ + + const u32 salt_len = esalt_bufs[salt_pos].salt_len; // not a bug, we need to get it from the esalt + + const u32 pw_salt_len = salt_len + pw_len; + + u32 salt_buf0[16]; + + salt_buf0[ 0] = esalt_bufs[salt_pos].salt_buf[ 0]; + salt_buf0[ 1] = esalt_bufs[salt_pos].salt_buf[ 1]; + salt_buf0[ 2] = esalt_bufs[salt_pos].salt_buf[ 2]; + salt_buf0[ 3] = esalt_bufs[salt_pos].salt_buf[ 3]; + salt_buf0[ 4] = esalt_bufs[salt_pos].salt_buf[ 4]; + salt_buf0[ 5] = esalt_bufs[salt_pos].salt_buf[ 5]; + salt_buf0[ 6] = esalt_bufs[salt_pos].salt_buf[ 6]; + salt_buf0[ 7] = esalt_bufs[salt_pos].salt_buf[ 7]; + salt_buf0[ 8] = esalt_bufs[salt_pos].salt_buf[ 8]; + salt_buf0[ 9] = esalt_bufs[salt_pos].salt_buf[ 9]; + salt_buf0[10] = esalt_bufs[salt_pos].salt_buf[10]; + salt_buf0[11] = esalt_bufs[salt_pos].salt_buf[11]; + salt_buf0[12] = esalt_bufs[salt_pos].salt_buf[12]; + salt_buf0[13] = esalt_bufs[salt_pos].salt_buf[13]; + salt_buf0[14] = esalt_bufs[salt_pos].salt_buf[14]; + salt_buf0[15] = esalt_bufs[salt_pos].salt_buf[15]; + + u32 salt_buf1[16]; + + salt_buf1[ 0] = esalt_bufs[salt_pos].salt_buf[16]; + salt_buf1[ 1] = esalt_bufs[salt_pos].salt_buf[17]; + salt_buf1[ 2] = esalt_bufs[salt_pos].salt_buf[18]; + salt_buf1[ 3] = esalt_bufs[salt_pos].salt_buf[19]; + salt_buf1[ 4] = esalt_bufs[salt_pos].salt_buf[20]; + salt_buf1[ 5] = esalt_bufs[salt_pos].salt_buf[21]; + salt_buf1[ 6] = esalt_bufs[salt_pos].salt_buf[22]; + salt_buf1[ 7] = esalt_bufs[salt_pos].salt_buf[23]; + salt_buf1[ 8] = esalt_bufs[salt_pos].salt_buf[24]; + salt_buf1[ 9] = esalt_bufs[salt_pos].salt_buf[25]; + salt_buf1[10] = esalt_bufs[salt_pos].salt_buf[26]; + salt_buf1[11] = esalt_bufs[salt_pos].salt_buf[27]; + salt_buf1[12] = esalt_bufs[salt_pos].salt_buf[28]; + salt_buf1[13] = esalt_bufs[salt_pos].salt_buf[29]; + salt_buf1[14] = 0; + salt_buf1[15] = 0; + + /** + * esalt + */ + + const u32 esalt_len = esalt_bufs[salt_pos].esalt_len; + + u32 esalt_buf0[16]; + + esalt_buf0[ 0] = esalt_bufs[salt_pos].esalt_buf[ 0]; + esalt_buf0[ 1] = esalt_bufs[salt_pos].esalt_buf[ 1]; + esalt_buf0[ 2] = esalt_bufs[salt_pos].esalt_buf[ 2]; + esalt_buf0[ 3] = esalt_bufs[salt_pos].esalt_buf[ 3]; + esalt_buf0[ 4] = esalt_bufs[salt_pos].esalt_buf[ 4]; + esalt_buf0[ 5] = esalt_bufs[salt_pos].esalt_buf[ 5]; + esalt_buf0[ 6] = esalt_bufs[salt_pos].esalt_buf[ 6]; + esalt_buf0[ 7] = esalt_bufs[salt_pos].esalt_buf[ 7]; + esalt_buf0[ 8] = esalt_bufs[salt_pos].esalt_buf[ 8]; + esalt_buf0[ 9] = esalt_bufs[salt_pos].esalt_buf[ 9]; + esalt_buf0[10] = esalt_bufs[salt_pos].esalt_buf[10]; + esalt_buf0[11] = esalt_bufs[salt_pos].esalt_buf[11]; + esalt_buf0[12] = esalt_bufs[salt_pos].esalt_buf[12]; + esalt_buf0[13] = esalt_bufs[salt_pos].esalt_buf[13]; + esalt_buf0[14] = esalt_bufs[salt_pos].esalt_buf[14]; + esalt_buf0[15] = esalt_bufs[salt_pos].esalt_buf[15]; + + u32 esalt_buf1[16]; + + esalt_buf1[ 0] = esalt_bufs[salt_pos].esalt_buf[16]; + esalt_buf1[ 1] = esalt_bufs[salt_pos].esalt_buf[17]; + esalt_buf1[ 2] = esalt_bufs[salt_pos].esalt_buf[18]; + esalt_buf1[ 3] = esalt_bufs[salt_pos].esalt_buf[19]; + esalt_buf1[ 4] = esalt_bufs[salt_pos].esalt_buf[20]; + esalt_buf1[ 5] = esalt_bufs[salt_pos].esalt_buf[21]; + esalt_buf1[ 6] = esalt_bufs[salt_pos].esalt_buf[22]; + esalt_buf1[ 7] = esalt_bufs[salt_pos].esalt_buf[23]; + esalt_buf1[ 8] = esalt_bufs[salt_pos].esalt_buf[24]; + esalt_buf1[ 9] = esalt_bufs[salt_pos].esalt_buf[25]; + esalt_buf1[10] = esalt_bufs[salt_pos].esalt_buf[26]; + esalt_buf1[11] = esalt_bufs[salt_pos].esalt_buf[27]; + esalt_buf1[12] = esalt_bufs[salt_pos].esalt_buf[28]; + esalt_buf1[13] = esalt_bufs[salt_pos].esalt_buf[29]; + esalt_buf1[14] = esalt_bufs[salt_pos].esalt_buf[30]; + esalt_buf1[15] = esalt_bufs[salt_pos].esalt_buf[31]; + + const u32 digest_esalt_len = 32 + esalt_len; + + /** + * loop + */ + + u32x w0l = w0[0]; + + for (u32 il_pos = 0; il_pos < bfs_cnt; il_pos++) + { + const u32 w0r = bfs_buf[il_pos].i; + + w0[0] = w0l | w0r; + + /* + * HA1 = md5 ($salt . $pass) + */ + + // append the pass to the salt + + u32x block0[16]; + + block0[ 0] = salt_buf0[ 0]; + block0[ 1] = salt_buf0[ 1]; + block0[ 2] = salt_buf0[ 2]; + block0[ 3] = salt_buf0[ 3]; + block0[ 4] = salt_buf0[ 4]; + block0[ 5] = salt_buf0[ 5]; + block0[ 6] = salt_buf0[ 6]; + block0[ 7] = salt_buf0[ 7]; + block0[ 8] = salt_buf0[ 8]; + block0[ 9] = salt_buf0[ 9]; + block0[10] = salt_buf0[10]; + block0[11] = salt_buf0[11]; + block0[12] = salt_buf0[12]; + block0[13] = salt_buf0[13]; + block0[14] = salt_buf0[14]; + block0[15] = salt_buf0[15]; + + u32x block1[16]; + + block1[ 0] = salt_buf1[ 0]; + block1[ 1] = salt_buf1[ 1]; + block1[ 2] = salt_buf1[ 2]; + block1[ 3] = salt_buf1[ 3]; + block1[ 4] = salt_buf1[ 4]; + block1[ 5] = salt_buf1[ 5]; + block1[ 6] = salt_buf1[ 6]; + block1[ 7] = salt_buf1[ 7]; + block1[ 8] = salt_buf1[ 8]; + block1[ 9] = salt_buf1[ 9]; + block1[10] = salt_buf1[10]; + block1[11] = salt_buf1[11]; + block1[12] = salt_buf1[12]; + block1[13] = salt_buf1[13]; + block1[14] = salt_buf1[14]; + block1[15] = salt_buf1[15]; + + memcat32 (block0, block1, salt_len, w0, w1, w2, w3, pw_len); + + u32x w0_t[4]; + + w0_t[0] = block0[ 0]; + w0_t[1] = block0[ 1]; + w0_t[2] = block0[ 2]; + w0_t[3] = block0[ 3]; + + u32x w1_t[4]; + + w1_t[0] = block0[ 4]; + w1_t[1] = block0[ 5]; + w1_t[2] = block0[ 6]; + w1_t[3] = block0[ 7]; + + u32x w2_t[4]; + + w2_t[0] = block0[ 8]; + w2_t[1] = block0[ 9]; + w2_t[2] = block0[10]; + w2_t[3] = block0[11]; + + u32x w3_t[4]; + + w3_t[0] = block0[12]; + w3_t[1] = block0[13]; + w3_t[2] = pw_salt_len * 8; + w3_t[3] = 0; + + // md5 + + u32x tmp2; + + u32x a = MD5M_A; + u32x b = MD5M_B; + u32x c = MD5M_C; + u32x d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0_t[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0_t[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0_t[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1_t[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1_t[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1_t[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2_t[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2_t[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2_t[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3_t[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3_t[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3_t[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0_t[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1_t[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2_t[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1_t[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1_t[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2_t[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3_t[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0_t[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2_t[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3_t[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0_t[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1_t[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3_t[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H1, a, b, c, d, w1_t[1], MD5C20, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w2_t[0], MD5C21, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w2_t[3], MD5C22, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w3_t[2], MD5C23, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w0_t[1], MD5C24, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w1_t[0], MD5C25, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w1_t[3], MD5C26, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w2_t[2], MD5C27, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w3_t[1], MD5C28, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w0_t[0], MD5C29, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w0_t[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w1_t[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w2_t[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w3_t[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w3_t[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w0_t[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1_t[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3_t[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3_t[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0_t[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0_t[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2_t[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1_t[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3_t[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1_t[0], MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w2_t[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0_t[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2_t[1], MD5C3f, MD5S33); + + a += MD5M_A; + b += MD5M_B; + c += MD5M_C; + d += MD5M_D; + + /* + * final = md5 ($HA1 . $esalt) + * we have at least 2 MD5 blocks/transformations, but we might need 3 + */ + + w0_t[0] = uint_to_hex_lower8 ((a >> 0) & 255) << 0 + | uint_to_hex_lower8 ((a >> 8) & 255) << 16; + w0_t[1] = uint_to_hex_lower8 ((a >> 16) & 255) << 0 + | uint_to_hex_lower8 ((a >> 24) & 255) << 16; + w0_t[2] = uint_to_hex_lower8 ((b >> 0) & 255) << 0 + | uint_to_hex_lower8 ((b >> 8) & 255) << 16; + w0_t[3] = uint_to_hex_lower8 ((b >> 16) & 255) << 0 + | uint_to_hex_lower8 ((b >> 24) & 255) << 16; + w1_t[0] = uint_to_hex_lower8 ((c >> 0) & 255) << 0 + | uint_to_hex_lower8 ((c >> 8) & 255) << 16; + w1_t[1] = uint_to_hex_lower8 ((c >> 16) & 255) << 0 + | uint_to_hex_lower8 ((c >> 24) & 255) << 16; + w1_t[2] = uint_to_hex_lower8 ((d >> 0) & 255) << 0 + | uint_to_hex_lower8 ((d >> 8) & 255) << 16; + w1_t[3] = uint_to_hex_lower8 ((d >> 16) & 255) << 0 + | uint_to_hex_lower8 ((d >> 24) & 255) << 16; + + w2_t[0] = esalt_buf0[0]; + w2_t[1] = esalt_buf0[1]; + w2_t[2] = esalt_buf0[2]; + w2_t[3] = esalt_buf0[3]; + + w3_t[0] = esalt_buf0[4]; + w3_t[1] = esalt_buf0[5]; + w3_t[2] = esalt_buf0[6]; + w3_t[3] = esalt_buf0[7]; + + // md5 + // 1st transform + + a = MD5M_A; + b = MD5M_B; + c = MD5M_C; + d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0_t[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0_t[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0_t[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1_t[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1_t[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1_t[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2_t[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2_t[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2_t[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3_t[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3_t[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3_t[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0_t[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1_t[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2_t[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1_t[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1_t[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2_t[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3_t[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0_t[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2_t[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3_t[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0_t[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1_t[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3_t[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H1, a, b, c, d, w1_t[1], MD5C20, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w2_t[0], MD5C21, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w2_t[3], MD5C22, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w3_t[2], MD5C23, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w0_t[1], MD5C24, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w1_t[0], MD5C25, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w1_t[3], MD5C26, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w2_t[2], MD5C27, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w3_t[1], MD5C28, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w0_t[0], MD5C29, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w0_t[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w1_t[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w2_t[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w3_t[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w3_t[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w0_t[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1_t[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3_t[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3_t[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0_t[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0_t[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2_t[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1_t[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3_t[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1_t[0], MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w2_t[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0_t[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2_t[1], MD5C3f, MD5S33); + + a += MD5M_A; + b += MD5M_B; + c += MD5M_C; + d += MD5M_D; + + u32x r_a = a; + u32x r_b = b; + u32x r_c = c; + u32x r_d = d; + + // 2nd transform + + w0_t[0] = esalt_buf0[ 8]; + w0_t[1] = esalt_buf0[ 9]; + w0_t[2] = esalt_buf0[10]; + w0_t[3] = esalt_buf0[11]; + + w1_t[0] = esalt_buf0[12]; + w1_t[1] = esalt_buf0[13]; + w1_t[2] = esalt_buf0[14]; + w1_t[3] = esalt_buf0[15]; + + w2_t[0] = esalt_buf1[ 0]; + w2_t[1] = esalt_buf1[ 1]; + w2_t[2] = esalt_buf1[ 2]; + w2_t[3] = esalt_buf1[ 3]; + + w3_t[0] = esalt_buf1[ 4]; + w3_t[1] = esalt_buf1[ 5]; + w3_t[2] = digest_esalt_len * 8; + w3_t[3] = 0; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0_t[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0_t[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0_t[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1_t[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1_t[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1_t[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2_t[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2_t[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2_t[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3_t[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3_t[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3_t[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0_t[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1_t[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2_t[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1_t[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1_t[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2_t[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3_t[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0_t[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2_t[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3_t[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0_t[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1_t[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3_t[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H1, a, b, c, d, w1_t[1], MD5C20, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w2_t[0], MD5C21, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w2_t[3], MD5C22, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w3_t[2], MD5C23, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w0_t[1], MD5C24, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w1_t[0], MD5C25, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w1_t[3], MD5C26, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w2_t[2], MD5C27, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w3_t[1], MD5C28, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w0_t[0], MD5C29, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w0_t[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w1_t[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w2_t[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w3_t[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w3_t[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w0_t[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1_t[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3_t[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3_t[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0_t[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0_t[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2_t[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1_t[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3_t[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1_t[0], MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w2_t[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0_t[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2_t[1], MD5C3f, MD5S33); + + a += r_a; + b += r_b; + c += r_c; + d += r_d; + + const u32x r0 = a; + const u32x r1 = d; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_S + } +} + +static void m11400s_0_1 (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], const u32 pw_len, __global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global sip_t *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, __local u32 l_bin2asc[256]) +{ + /** + * modifier + */ + + const u32 gid = get_global_id (0); + const u32 lid = get_local_id (0); + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * salt + */ + + const u32 salt_len = esalt_bufs[salt_pos].salt_len; // not a bug, we need to get it from the esalt + + const u32 pw_salt_len = salt_len + pw_len; + + u32 salt_buf0[16]; + + salt_buf0[ 0] = esalt_bufs[salt_pos].salt_buf[ 0]; + salt_buf0[ 1] = esalt_bufs[salt_pos].salt_buf[ 1]; + salt_buf0[ 2] = esalt_bufs[salt_pos].salt_buf[ 2]; + salt_buf0[ 3] = esalt_bufs[salt_pos].salt_buf[ 3]; + salt_buf0[ 4] = esalt_bufs[salt_pos].salt_buf[ 4]; + salt_buf0[ 5] = esalt_bufs[salt_pos].salt_buf[ 5]; + salt_buf0[ 6] = esalt_bufs[salt_pos].salt_buf[ 6]; + salt_buf0[ 7] = esalt_bufs[salt_pos].salt_buf[ 7]; + salt_buf0[ 8] = esalt_bufs[salt_pos].salt_buf[ 8]; + salt_buf0[ 9] = esalt_bufs[salt_pos].salt_buf[ 9]; + salt_buf0[10] = esalt_bufs[salt_pos].salt_buf[10]; + salt_buf0[11] = esalt_bufs[salt_pos].salt_buf[11]; + salt_buf0[12] = esalt_bufs[salt_pos].salt_buf[12]; + salt_buf0[13] = esalt_bufs[salt_pos].salt_buf[13]; + salt_buf0[14] = esalt_bufs[salt_pos].salt_buf[14]; + salt_buf0[15] = esalt_bufs[salt_pos].salt_buf[15]; + + u32 salt_buf1[16]; + + salt_buf1[ 0] = esalt_bufs[salt_pos].salt_buf[16]; + salt_buf1[ 1] = esalt_bufs[salt_pos].salt_buf[17]; + salt_buf1[ 2] = esalt_bufs[salt_pos].salt_buf[18]; + salt_buf1[ 3] = esalt_bufs[salt_pos].salt_buf[19]; + salt_buf1[ 4] = esalt_bufs[salt_pos].salt_buf[20]; + salt_buf1[ 5] = esalt_bufs[salt_pos].salt_buf[21]; + salt_buf1[ 6] = esalt_bufs[salt_pos].salt_buf[22]; + salt_buf1[ 7] = esalt_bufs[salt_pos].salt_buf[23]; + salt_buf1[ 8] = esalt_bufs[salt_pos].salt_buf[24]; + salt_buf1[ 9] = esalt_bufs[salt_pos].salt_buf[25]; + salt_buf1[10] = esalt_bufs[salt_pos].salt_buf[26]; + salt_buf1[11] = esalt_bufs[salt_pos].salt_buf[27]; + salt_buf1[12] = esalt_bufs[salt_pos].salt_buf[28]; + salt_buf1[13] = esalt_bufs[salt_pos].salt_buf[29]; + salt_buf1[14] = 0; + salt_buf1[15] = 0; + + /** + * esalt + */ + + const u32 esalt_len = esalt_bufs[salt_pos].esalt_len; + + u32 esalt_buf0[16]; + + esalt_buf0[ 0] = esalt_bufs[salt_pos].esalt_buf[ 0]; + esalt_buf0[ 1] = esalt_bufs[salt_pos].esalt_buf[ 1]; + esalt_buf0[ 2] = esalt_bufs[salt_pos].esalt_buf[ 2]; + esalt_buf0[ 3] = esalt_bufs[salt_pos].esalt_buf[ 3]; + esalt_buf0[ 4] = esalt_bufs[salt_pos].esalt_buf[ 4]; + esalt_buf0[ 5] = esalt_bufs[salt_pos].esalt_buf[ 5]; + esalt_buf0[ 6] = esalt_bufs[salt_pos].esalt_buf[ 6]; + esalt_buf0[ 7] = esalt_bufs[salt_pos].esalt_buf[ 7]; + esalt_buf0[ 8] = esalt_bufs[salt_pos].esalt_buf[ 8]; + esalt_buf0[ 9] = esalt_bufs[salt_pos].esalt_buf[ 9]; + esalt_buf0[10] = esalt_bufs[salt_pos].esalt_buf[10]; + esalt_buf0[11] = esalt_bufs[salt_pos].esalt_buf[11]; + esalt_buf0[12] = esalt_bufs[salt_pos].esalt_buf[12]; + esalt_buf0[13] = esalt_bufs[salt_pos].esalt_buf[13]; + esalt_buf0[14] = esalt_bufs[salt_pos].esalt_buf[14]; + esalt_buf0[15] = esalt_bufs[salt_pos].esalt_buf[15]; + + u32 esalt_buf1[16]; + + esalt_buf1[ 0] = esalt_bufs[salt_pos].esalt_buf[16]; + esalt_buf1[ 1] = esalt_bufs[salt_pos].esalt_buf[17]; + esalt_buf1[ 2] = esalt_bufs[salt_pos].esalt_buf[18]; + esalt_buf1[ 3] = esalt_bufs[salt_pos].esalt_buf[19]; + esalt_buf1[ 4] = esalt_bufs[salt_pos].esalt_buf[20]; + esalt_buf1[ 5] = esalt_bufs[salt_pos].esalt_buf[21]; + esalt_buf1[ 6] = esalt_bufs[salt_pos].esalt_buf[22]; + esalt_buf1[ 7] = esalt_bufs[salt_pos].esalt_buf[23]; + esalt_buf1[ 8] = esalt_bufs[salt_pos].esalt_buf[24]; + esalt_buf1[ 9] = esalt_bufs[salt_pos].esalt_buf[25]; + esalt_buf1[10] = esalt_bufs[salt_pos].esalt_buf[26]; + esalt_buf1[11] = esalt_bufs[salt_pos].esalt_buf[27]; + esalt_buf1[12] = esalt_bufs[salt_pos].esalt_buf[28]; + esalt_buf1[13] = esalt_bufs[salt_pos].esalt_buf[29]; + esalt_buf1[14] = esalt_bufs[salt_pos].esalt_buf[30]; + esalt_buf1[15] = esalt_bufs[salt_pos].esalt_buf[31]; + + u32 esalt_buf2[16]; + + esalt_buf2[ 0] = esalt_bufs[salt_pos].esalt_buf[32]; + esalt_buf2[ 1] = esalt_bufs[salt_pos].esalt_buf[33]; + esalt_buf2[ 2] = esalt_bufs[salt_pos].esalt_buf[34]; + esalt_buf2[ 3] = esalt_bufs[salt_pos].esalt_buf[35]; + esalt_buf2[ 4] = esalt_bufs[salt_pos].esalt_buf[36]; + esalt_buf2[ 5] = esalt_bufs[salt_pos].esalt_buf[37]; + esalt_buf2[ 6] = 0; + esalt_buf2[ 7] = 0; + esalt_buf2[ 8] = 0; + esalt_buf2[ 9] = 0; + esalt_buf2[10] = 0; + esalt_buf2[11] = 0; + esalt_buf2[12] = 0; + esalt_buf2[13] = 0; + esalt_buf2[14] = 0; + esalt_buf2[15] = 0; + + const u32 digest_esalt_len = 32 + esalt_len; + + /** + * loop + */ + + u32x w0l = w0[0]; + + for (u32 il_pos = 0; il_pos < bfs_cnt; il_pos++) + { + const u32 w0r = bfs_buf[il_pos].i; + + w0[0] = w0l | w0r; + + /* + * HA1 = md5 ($salt . $pass) + */ + + // append the pass to the salt + + u32x block0[16]; + + block0[ 0] = salt_buf0[ 0]; + block0[ 1] = salt_buf0[ 1]; + block0[ 2] = salt_buf0[ 2]; + block0[ 3] = salt_buf0[ 3]; + block0[ 4] = salt_buf0[ 4]; + block0[ 5] = salt_buf0[ 5]; + block0[ 6] = salt_buf0[ 6]; + block0[ 7] = salt_buf0[ 7]; + block0[ 8] = salt_buf0[ 8]; + block0[ 9] = salt_buf0[ 9]; + block0[10] = salt_buf0[10]; + block0[11] = salt_buf0[11]; + block0[12] = salt_buf0[12]; + block0[13] = salt_buf0[13]; + block0[14] = salt_buf0[14]; + block0[15] = salt_buf0[15]; + + u32x block1[16]; + + block1[ 0] = salt_buf1[ 0]; + block1[ 1] = salt_buf1[ 1]; + block1[ 2] = salt_buf1[ 2]; + block1[ 3] = salt_buf1[ 3]; + block1[ 4] = salt_buf1[ 4]; + block1[ 5] = salt_buf1[ 5]; + block1[ 6] = salt_buf1[ 6]; + block1[ 7] = salt_buf1[ 7]; + block1[ 8] = salt_buf1[ 8]; + block1[ 9] = salt_buf1[ 9]; + block1[10] = salt_buf1[10]; + block1[11] = salt_buf1[11]; + block1[12] = salt_buf1[12]; + block1[13] = salt_buf1[13]; + block1[14] = salt_buf1[14]; + block1[15] = salt_buf1[15]; + + memcat32 (block0, block1, salt_len, w0, w1, w2, w3, pw_len); + + u32x w0_t[4]; + + w0_t[0] = block0[ 0]; + w0_t[1] = block0[ 1]; + w0_t[2] = block0[ 2]; + w0_t[3] = block0[ 3]; + + u32x w1_t[4]; + + w1_t[0] = block0[ 4]; + w1_t[1] = block0[ 5]; + w1_t[2] = block0[ 6]; + w1_t[3] = block0[ 7]; + + u32x w2_t[4]; + + w2_t[0] = block0[ 8]; + w2_t[1] = block0[ 9]; + w2_t[2] = block0[10]; + w2_t[3] = block0[11]; + + u32x w3_t[4]; + + w3_t[0] = block0[12]; + w3_t[1] = block0[13]; + w3_t[2] = pw_salt_len * 8; + w3_t[3] = 0; + + // md5 + + u32x tmp2; + + u32x a = MD5M_A; + u32x b = MD5M_B; + u32x c = MD5M_C; + u32x d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0_t[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0_t[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0_t[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1_t[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1_t[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1_t[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2_t[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2_t[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2_t[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3_t[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3_t[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3_t[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0_t[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1_t[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2_t[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1_t[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1_t[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2_t[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3_t[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0_t[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2_t[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3_t[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0_t[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1_t[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3_t[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H1, a, b, c, d, w1_t[1], MD5C20, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w2_t[0], MD5C21, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w2_t[3], MD5C22, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w3_t[2], MD5C23, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w0_t[1], MD5C24, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w1_t[0], MD5C25, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w1_t[3], MD5C26, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w2_t[2], MD5C27, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w3_t[1], MD5C28, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w0_t[0], MD5C29, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w0_t[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w1_t[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w2_t[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w3_t[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w3_t[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w0_t[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1_t[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3_t[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3_t[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0_t[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0_t[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2_t[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1_t[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3_t[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1_t[0], MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w2_t[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0_t[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2_t[1], MD5C3f, MD5S33); + + a += MD5M_A; + b += MD5M_B; + c += MD5M_C; + d += MD5M_D; + + /* + * final = md5 ($HA1 . $esalt) + * we have at least 2 MD5 blocks/transformations, but we might need 3 + */ + + w0_t[0] = uint_to_hex_lower8 ((a >> 0) & 255) << 0 + | uint_to_hex_lower8 ((a >> 8) & 255) << 16; + w0_t[1] = uint_to_hex_lower8 ((a >> 16) & 255) << 0 + | uint_to_hex_lower8 ((a >> 24) & 255) << 16; + w0_t[2] = uint_to_hex_lower8 ((b >> 0) & 255) << 0 + | uint_to_hex_lower8 ((b >> 8) & 255) << 16; + w0_t[3] = uint_to_hex_lower8 ((b >> 16) & 255) << 0 + | uint_to_hex_lower8 ((b >> 24) & 255) << 16; + w1_t[0] = uint_to_hex_lower8 ((c >> 0) & 255) << 0 + | uint_to_hex_lower8 ((c >> 8) & 255) << 16; + w1_t[1] = uint_to_hex_lower8 ((c >> 16) & 255) << 0 + | uint_to_hex_lower8 ((c >> 24) & 255) << 16; + w1_t[2] = uint_to_hex_lower8 ((d >> 0) & 255) << 0 + | uint_to_hex_lower8 ((d >> 8) & 255) << 16; + w1_t[3] = uint_to_hex_lower8 ((d >> 16) & 255) << 0 + | uint_to_hex_lower8 ((d >> 24) & 255) << 16; + + w2_t[0] = esalt_buf0[0]; + w2_t[1] = esalt_buf0[1]; + w2_t[2] = esalt_buf0[2]; + w2_t[3] = esalt_buf0[3]; + + w3_t[0] = esalt_buf0[4]; + w3_t[1] = esalt_buf0[5]; + w3_t[2] = esalt_buf0[6]; + w3_t[3] = esalt_buf0[7]; + + // md5 + // 1st transform + + a = MD5M_A; + b = MD5M_B; + c = MD5M_C; + d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0_t[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0_t[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0_t[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1_t[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1_t[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1_t[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2_t[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2_t[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2_t[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3_t[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3_t[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3_t[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0_t[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1_t[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2_t[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1_t[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1_t[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2_t[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3_t[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0_t[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2_t[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3_t[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0_t[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1_t[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3_t[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H1, a, b, c, d, w1_t[1], MD5C20, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w2_t[0], MD5C21, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w2_t[3], MD5C22, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w3_t[2], MD5C23, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w0_t[1], MD5C24, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w1_t[0], MD5C25, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w1_t[3], MD5C26, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w2_t[2], MD5C27, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w3_t[1], MD5C28, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w0_t[0], MD5C29, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w0_t[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w1_t[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w2_t[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w3_t[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w3_t[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w0_t[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1_t[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3_t[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3_t[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0_t[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0_t[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2_t[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1_t[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3_t[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1_t[0], MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w2_t[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0_t[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2_t[1], MD5C3f, MD5S33); + + a += MD5M_A; + b += MD5M_B; + c += MD5M_C; + d += MD5M_D; + + u32x r_a = a; + u32x r_b = b; + u32x r_c = c; + u32x r_d = d; + + // 2nd transform + + w0_t[0] = esalt_buf0[ 8]; + w0_t[1] = esalt_buf0[ 9]; + w0_t[2] = esalt_buf0[10]; + w0_t[3] = esalt_buf0[11]; + + w1_t[0] = esalt_buf0[12]; + w1_t[1] = esalt_buf0[13]; + w1_t[2] = esalt_buf0[14]; + w1_t[3] = esalt_buf0[15]; + + w2_t[0] = esalt_buf1[ 0]; + w2_t[1] = esalt_buf1[ 1]; + w2_t[2] = esalt_buf1[ 2]; + w2_t[3] = esalt_buf1[ 3]; + + w3_t[0] = esalt_buf1[ 4]; + w3_t[1] = esalt_buf1[ 5]; + w3_t[2] = esalt_buf1[ 6]; + w3_t[3] = esalt_buf1[ 7]; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0_t[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0_t[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0_t[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1_t[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1_t[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1_t[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2_t[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2_t[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2_t[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3_t[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3_t[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3_t[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0_t[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1_t[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2_t[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1_t[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1_t[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2_t[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3_t[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0_t[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2_t[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3_t[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0_t[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1_t[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3_t[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H1, a, b, c, d, w1_t[1], MD5C20, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w2_t[0], MD5C21, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w2_t[3], MD5C22, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w3_t[2], MD5C23, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w0_t[1], MD5C24, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w1_t[0], MD5C25, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w1_t[3], MD5C26, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w2_t[2], MD5C27, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w3_t[1], MD5C28, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w0_t[0], MD5C29, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w0_t[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w1_t[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w2_t[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w3_t[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w3_t[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w0_t[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1_t[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3_t[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3_t[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0_t[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0_t[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2_t[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1_t[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3_t[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1_t[0], MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w2_t[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0_t[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2_t[1], MD5C3f, MD5S33); + + // this is for sure the final block + + a += r_a; + b += r_b; + c += r_c; + d += r_d; + + r_a = a; + r_b = b; + r_c = c; + r_d = d; + + w0_t[0] = esalt_buf1[ 8]; + w0_t[1] = esalt_buf1[ 9]; + w0_t[2] = esalt_buf1[10]; + w0_t[3] = esalt_buf1[11]; + + w1_t[0] = esalt_buf1[12]; + w1_t[1] = esalt_buf1[13]; + w1_t[2] = esalt_buf1[14]; + w1_t[3] = esalt_buf1[15]; + + w2_t[0] = esalt_buf2[ 0]; + w2_t[1] = esalt_buf2[ 1]; + w2_t[2] = esalt_buf2[ 2]; + w2_t[3] = esalt_buf2[ 3]; + + w3_t[0] = esalt_buf2[ 4]; + w3_t[1] = esalt_buf2[ 5]; + w3_t[2] = digest_esalt_len * 8; + w3_t[3] = 0; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0_t[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0_t[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0_t[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1_t[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1_t[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1_t[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2_t[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2_t[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2_t[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3_t[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3_t[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3_t[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0_t[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1_t[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2_t[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1_t[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1_t[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2_t[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3_t[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0_t[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2_t[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3_t[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0_t[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1_t[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3_t[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H1, a, b, c, d, w1_t[1], MD5C20, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w2_t[0], MD5C21, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w2_t[3], MD5C22, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w3_t[2], MD5C23, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w0_t[1], MD5C24, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w1_t[0], MD5C25, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w1_t[3], MD5C26, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w2_t[2], MD5C27, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w3_t[1], MD5C28, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w0_t[0], MD5C29, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w0_t[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w1_t[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w2_t[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w3_t[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w3_t[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w0_t[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1_t[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3_t[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3_t[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0_t[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0_t[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2_t[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1_t[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3_t[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1_t[0], MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w2_t[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0_t[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2_t[1], MD5C3f, MD5S33); + + a += r_a; + b += r_b; + c += r_c; + d += r_d; + + const u32x r0 = a; + const u32x r1 = d; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_S + } +} + +static void m11400s_1_0 (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], const u32 pw_len, __global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global sip_t *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, __local u32 l_bin2asc[256]) +{ + /** + * modifier + */ + + const u32 gid = get_global_id (0); + const u32 lid = get_local_id (0); + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * salt + */ + + const u32 salt_len = esalt_bufs[salt_pos].salt_len; // not a bug, we need to get it from the esalt + + const u32 pw_salt_len = salt_len + pw_len; + + u32 salt_buf0[16]; + + salt_buf0[ 0] = esalt_bufs[salt_pos].salt_buf[ 0]; + salt_buf0[ 1] = esalt_bufs[salt_pos].salt_buf[ 1]; + salt_buf0[ 2] = esalt_bufs[salt_pos].salt_buf[ 2]; + salt_buf0[ 3] = esalt_bufs[salt_pos].salt_buf[ 3]; + salt_buf0[ 4] = esalt_bufs[salt_pos].salt_buf[ 4]; + salt_buf0[ 5] = esalt_bufs[salt_pos].salt_buf[ 5]; + salt_buf0[ 6] = esalt_bufs[salt_pos].salt_buf[ 6]; + salt_buf0[ 7] = esalt_bufs[salt_pos].salt_buf[ 7]; + salt_buf0[ 8] = esalt_bufs[salt_pos].salt_buf[ 8]; + salt_buf0[ 9] = esalt_bufs[salt_pos].salt_buf[ 9]; + salt_buf0[10] = esalt_bufs[salt_pos].salt_buf[10]; + salt_buf0[11] = esalt_bufs[salt_pos].salt_buf[11]; + salt_buf0[12] = esalt_bufs[salt_pos].salt_buf[12]; + salt_buf0[13] = esalt_bufs[salt_pos].salt_buf[13]; + salt_buf0[14] = esalt_bufs[salt_pos].salt_buf[14]; + salt_buf0[15] = esalt_bufs[salt_pos].salt_buf[15]; + + u32 salt_buf1[16]; + + salt_buf1[ 0] = esalt_bufs[salt_pos].salt_buf[16]; + salt_buf1[ 1] = esalt_bufs[salt_pos].salt_buf[17]; + salt_buf1[ 2] = esalt_bufs[salt_pos].salt_buf[18]; + salt_buf1[ 3] = esalt_bufs[salt_pos].salt_buf[19]; + salt_buf1[ 4] = esalt_bufs[salt_pos].salt_buf[20]; + salt_buf1[ 5] = esalt_bufs[salt_pos].salt_buf[21]; + salt_buf1[ 6] = esalt_bufs[salt_pos].salt_buf[22]; + salt_buf1[ 7] = esalt_bufs[salt_pos].salt_buf[23]; + salt_buf1[ 8] = esalt_bufs[salt_pos].salt_buf[24]; + salt_buf1[ 9] = esalt_bufs[salt_pos].salt_buf[25]; + salt_buf1[10] = esalt_bufs[salt_pos].salt_buf[26]; + salt_buf1[11] = esalt_bufs[salt_pos].salt_buf[27]; + salt_buf1[12] = esalt_bufs[salt_pos].salt_buf[28]; + salt_buf1[13] = esalt_bufs[salt_pos].salt_buf[29]; + salt_buf1[14] = 0; + salt_buf1[15] = 0; + + /** + * esalt + */ + + const u32 esalt_len = esalt_bufs[salt_pos].esalt_len; + + u32 esalt_buf0[16]; + + esalt_buf0[ 0] = esalt_bufs[salt_pos].esalt_buf[ 0]; + esalt_buf0[ 1] = esalt_bufs[salt_pos].esalt_buf[ 1]; + esalt_buf0[ 2] = esalt_bufs[salt_pos].esalt_buf[ 2]; + esalt_buf0[ 3] = esalt_bufs[salt_pos].esalt_buf[ 3]; + esalt_buf0[ 4] = esalt_bufs[salt_pos].esalt_buf[ 4]; + esalt_buf0[ 5] = esalt_bufs[salt_pos].esalt_buf[ 5]; + esalt_buf0[ 6] = esalt_bufs[salt_pos].esalt_buf[ 6]; + esalt_buf0[ 7] = esalt_bufs[salt_pos].esalt_buf[ 7]; + esalt_buf0[ 8] = esalt_bufs[salt_pos].esalt_buf[ 8]; + esalt_buf0[ 9] = esalt_bufs[salt_pos].esalt_buf[ 9]; + esalt_buf0[10] = esalt_bufs[salt_pos].esalt_buf[10]; + esalt_buf0[11] = esalt_bufs[salt_pos].esalt_buf[11]; + esalt_buf0[12] = esalt_bufs[salt_pos].esalt_buf[12]; + esalt_buf0[13] = esalt_bufs[salt_pos].esalt_buf[13]; + esalt_buf0[14] = esalt_bufs[salt_pos].esalt_buf[14]; + esalt_buf0[15] = esalt_bufs[salt_pos].esalt_buf[15]; + + u32 esalt_buf1[16]; + + esalt_buf1[ 0] = esalt_bufs[salt_pos].esalt_buf[16]; + esalt_buf1[ 1] = esalt_bufs[salt_pos].esalt_buf[17]; + esalt_buf1[ 2] = esalt_bufs[salt_pos].esalt_buf[18]; + esalt_buf1[ 3] = esalt_bufs[salt_pos].esalt_buf[19]; + esalt_buf1[ 4] = esalt_bufs[salt_pos].esalt_buf[20]; + esalt_buf1[ 5] = esalt_bufs[salt_pos].esalt_buf[21]; + esalt_buf1[ 6] = esalt_bufs[salt_pos].esalt_buf[22]; + esalt_buf1[ 7] = esalt_bufs[salt_pos].esalt_buf[23]; + esalt_buf1[ 8] = esalt_bufs[salt_pos].esalt_buf[24]; + esalt_buf1[ 9] = esalt_bufs[salt_pos].esalt_buf[25]; + esalt_buf1[10] = esalt_bufs[salt_pos].esalt_buf[26]; + esalt_buf1[11] = esalt_bufs[salt_pos].esalt_buf[27]; + esalt_buf1[12] = esalt_bufs[salt_pos].esalt_buf[28]; + esalt_buf1[13] = esalt_bufs[salt_pos].esalt_buf[29]; + esalt_buf1[14] = esalt_bufs[salt_pos].esalt_buf[30]; + esalt_buf1[15] = esalt_bufs[salt_pos].esalt_buf[31]; + + const u32 digest_esalt_len = 32 + esalt_len; + + /** + * loop + */ + + u32x w0l = w0[0]; + + for (u32 il_pos = 0; il_pos < bfs_cnt; il_pos++) + { + const u32 w0r = bfs_buf[il_pos].i; + + w0[0] = w0l | w0r; + + /* + * HA1 = md5 ($salt . $pass) + */ + + // append the pass to the salt + + u32x block0[16]; + + block0[ 0] = salt_buf0[ 0]; + block0[ 1] = salt_buf0[ 1]; + block0[ 2] = salt_buf0[ 2]; + block0[ 3] = salt_buf0[ 3]; + block0[ 4] = salt_buf0[ 4]; + block0[ 5] = salt_buf0[ 5]; + block0[ 6] = salt_buf0[ 6]; + block0[ 7] = salt_buf0[ 7]; + block0[ 8] = salt_buf0[ 8]; + block0[ 9] = salt_buf0[ 9]; + block0[10] = salt_buf0[10]; + block0[11] = salt_buf0[11]; + block0[12] = salt_buf0[12]; + block0[13] = salt_buf0[13]; + block0[14] = salt_buf0[14]; + block0[15] = salt_buf0[15]; + + u32x block1[16]; + + block1[ 0] = salt_buf1[ 0]; + block1[ 1] = salt_buf1[ 1]; + block1[ 2] = salt_buf1[ 2]; + block1[ 3] = salt_buf1[ 3]; + block1[ 4] = salt_buf1[ 4]; + block1[ 5] = salt_buf1[ 5]; + block1[ 6] = salt_buf1[ 6]; + block1[ 7] = salt_buf1[ 7]; + block1[ 8] = salt_buf1[ 8]; + block1[ 9] = salt_buf1[ 9]; + block1[10] = salt_buf1[10]; + block1[11] = salt_buf1[11]; + block1[12] = salt_buf1[12]; + block1[13] = salt_buf1[13]; + block1[14] = salt_buf1[14]; + block1[15] = salt_buf1[15]; + + memcat32 (block0, block1, salt_len, w0, w1, w2, w3, pw_len); + + u32x w0_t[4]; + + w0_t[0] = block0[ 0]; + w0_t[1] = block0[ 1]; + w0_t[2] = block0[ 2]; + w0_t[3] = block0[ 3]; + + u32x w1_t[4]; + + w1_t[0] = block0[ 4]; + w1_t[1] = block0[ 5]; + w1_t[2] = block0[ 6]; + w1_t[3] = block0[ 7]; + + u32x w2_t[4]; + + w2_t[0] = block0[ 8]; + w2_t[1] = block0[ 9]; + w2_t[2] = block0[10]; + w2_t[3] = block0[11]; + + u32x w3_t[4]; + + w3_t[0] = block0[12]; + w3_t[1] = block0[13]; + w3_t[2] = block0[14]; + w3_t[3] = block0[15]; + + // md5 + + u32x tmp2; + + u32x a = MD5M_A; + u32x b = MD5M_B; + u32x c = MD5M_C; + u32x d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0_t[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0_t[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0_t[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1_t[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1_t[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1_t[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2_t[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2_t[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2_t[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3_t[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3_t[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3_t[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0_t[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1_t[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2_t[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1_t[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1_t[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2_t[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3_t[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0_t[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2_t[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3_t[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0_t[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1_t[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3_t[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H1, a, b, c, d, w1_t[1], MD5C20, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w2_t[0], MD5C21, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w2_t[3], MD5C22, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w3_t[2], MD5C23, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w0_t[1], MD5C24, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w1_t[0], MD5C25, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w1_t[3], MD5C26, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w2_t[2], MD5C27, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w3_t[1], MD5C28, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w0_t[0], MD5C29, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w0_t[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w1_t[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w2_t[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w3_t[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w3_t[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w0_t[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1_t[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3_t[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3_t[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0_t[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0_t[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2_t[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1_t[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3_t[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1_t[0], MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w2_t[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0_t[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2_t[1], MD5C3f, MD5S33); + + a += MD5M_A; + b += MD5M_B; + c += MD5M_C; + d += MD5M_D; + + u32x r_a = a; + u32x r_b = b; + u32x r_c = c; + u32x r_d = d; + + w0_t[0] = block1[ 0]; + w0_t[1] = block1[ 1]; + w0_t[2] = block1[ 2]; + w0_t[3] = block1[ 3]; + + w1_t[0] = block1[ 4]; + w1_t[1] = block1[ 5]; + w1_t[2] = block1[ 6]; + w1_t[3] = block1[ 7]; + + w2_t[0] = block1[ 8]; + w2_t[1] = block1[ 9]; + w2_t[2] = block1[10]; + w2_t[3] = block1[11]; + + w3_t[0] = block1[12]; + w3_t[1] = block1[13]; + w3_t[2] = pw_salt_len * 8; + w3_t[3] = 0; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0_t[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0_t[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0_t[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1_t[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1_t[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1_t[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2_t[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2_t[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2_t[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3_t[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3_t[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3_t[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0_t[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1_t[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2_t[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1_t[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1_t[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2_t[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3_t[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0_t[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2_t[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3_t[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0_t[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1_t[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3_t[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H1, a, b, c, d, w1_t[1], MD5C20, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w2_t[0], MD5C21, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w2_t[3], MD5C22, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w3_t[2], MD5C23, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w0_t[1], MD5C24, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w1_t[0], MD5C25, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w1_t[3], MD5C26, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w2_t[2], MD5C27, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w3_t[1], MD5C28, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w0_t[0], MD5C29, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w0_t[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w1_t[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w2_t[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w3_t[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w3_t[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w0_t[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1_t[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3_t[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3_t[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0_t[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0_t[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2_t[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1_t[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3_t[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1_t[0], MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w2_t[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0_t[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2_t[1], MD5C3f, MD5S33); + + a += r_a; + b += r_b; + c += r_c; + d += r_d; + + /* + * final = md5 ($HA1 . $esalt) + * we have at least 2 MD5 blocks/transformations, but we might need 3 + */ + + w0_t[0] = uint_to_hex_lower8 ((a >> 0) & 255) << 0 + | uint_to_hex_lower8 ((a >> 8) & 255) << 16; + w0_t[1] = uint_to_hex_lower8 ((a >> 16) & 255) << 0 + | uint_to_hex_lower8 ((a >> 24) & 255) << 16; + w0_t[2] = uint_to_hex_lower8 ((b >> 0) & 255) << 0 + | uint_to_hex_lower8 ((b >> 8) & 255) << 16; + w0_t[3] = uint_to_hex_lower8 ((b >> 16) & 255) << 0 + | uint_to_hex_lower8 ((b >> 24) & 255) << 16; + w1_t[0] = uint_to_hex_lower8 ((c >> 0) & 255) << 0 + | uint_to_hex_lower8 ((c >> 8) & 255) << 16; + w1_t[1] = uint_to_hex_lower8 ((c >> 16) & 255) << 0 + | uint_to_hex_lower8 ((c >> 24) & 255) << 16; + w1_t[2] = uint_to_hex_lower8 ((d >> 0) & 255) << 0 + | uint_to_hex_lower8 ((d >> 8) & 255) << 16; + w1_t[3] = uint_to_hex_lower8 ((d >> 16) & 255) << 0 + | uint_to_hex_lower8 ((d >> 24) & 255) << 16; + + w2_t[0] = esalt_buf0[0]; + w2_t[1] = esalt_buf0[1]; + w2_t[2] = esalt_buf0[2]; + w2_t[3] = esalt_buf0[3]; + + w3_t[0] = esalt_buf0[4]; + w3_t[1] = esalt_buf0[5]; + w3_t[2] = esalt_buf0[6]; + w3_t[3] = esalt_buf0[7]; + + // md5 + // 1st transform + + a = MD5M_A; + b = MD5M_B; + c = MD5M_C; + d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0_t[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0_t[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0_t[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1_t[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1_t[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1_t[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2_t[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2_t[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2_t[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3_t[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3_t[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3_t[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0_t[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1_t[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2_t[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1_t[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1_t[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2_t[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3_t[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0_t[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2_t[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3_t[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0_t[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1_t[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3_t[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H1, a, b, c, d, w1_t[1], MD5C20, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w2_t[0], MD5C21, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w2_t[3], MD5C22, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w3_t[2], MD5C23, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w0_t[1], MD5C24, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w1_t[0], MD5C25, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w1_t[3], MD5C26, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w2_t[2], MD5C27, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w3_t[1], MD5C28, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w0_t[0], MD5C29, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w0_t[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w1_t[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w2_t[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w3_t[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w3_t[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w0_t[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1_t[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3_t[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3_t[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0_t[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0_t[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2_t[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1_t[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3_t[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1_t[0], MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w2_t[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0_t[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2_t[1], MD5C3f, MD5S33); + + a += MD5M_A; + b += MD5M_B; + c += MD5M_C; + d += MD5M_D; + + r_a = a; + r_b = b; + r_c = c; + r_d = d; + + // 2nd transform + + w0_t[0] = esalt_buf0[ 8]; + w0_t[1] = esalt_buf0[ 9]; + w0_t[2] = esalt_buf0[10]; + w0_t[3] = esalt_buf0[11]; + + w1_t[0] = esalt_buf0[12]; + w1_t[1] = esalt_buf0[13]; + w1_t[2] = esalt_buf0[14]; + w1_t[3] = esalt_buf0[15]; + + w2_t[0] = esalt_buf1[ 0]; + w2_t[1] = esalt_buf1[ 1]; + w2_t[2] = esalt_buf1[ 2]; + w2_t[3] = esalt_buf1[ 3]; + + w3_t[0] = esalt_buf1[ 4]; + w3_t[1] = esalt_buf1[ 5]; + w3_t[2] = digest_esalt_len * 8; + w3_t[3] = 0; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0_t[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0_t[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0_t[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1_t[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1_t[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1_t[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2_t[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2_t[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2_t[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3_t[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3_t[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3_t[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0_t[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1_t[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2_t[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1_t[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1_t[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2_t[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3_t[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0_t[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2_t[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3_t[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0_t[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1_t[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3_t[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H1, a, b, c, d, w1_t[1], MD5C20, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w2_t[0], MD5C21, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w2_t[3], MD5C22, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w3_t[2], MD5C23, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w0_t[1], MD5C24, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w1_t[0], MD5C25, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w1_t[3], MD5C26, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w2_t[2], MD5C27, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w3_t[1], MD5C28, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w0_t[0], MD5C29, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w0_t[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w1_t[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w2_t[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w3_t[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w3_t[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w0_t[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1_t[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3_t[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3_t[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0_t[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0_t[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2_t[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1_t[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3_t[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1_t[0], MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w2_t[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0_t[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2_t[1], MD5C3f, MD5S33); + + a += r_a; + b += r_b; + c += r_c; + d += r_d; + + const u32x r0 = a; + const u32x r1 = d; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_S + } +} + +static void m11400s_1_1 (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], const u32 pw_len, __global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global sip_t *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, __local u32 l_bin2asc[256]) +{ + /** + * modifier + */ + + const u32 gid = get_global_id (0); + const u32 lid = get_local_id (0); + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * salt + */ + + const u32 salt_len = esalt_bufs[salt_pos].salt_len; // not a bug, we need to get it from the esalt + + const u32 pw_salt_len = salt_len + pw_len; + + u32 salt_buf0[16]; + + salt_buf0[ 0] = esalt_bufs[salt_pos].salt_buf[ 0]; + salt_buf0[ 1] = esalt_bufs[salt_pos].salt_buf[ 1]; + salt_buf0[ 2] = esalt_bufs[salt_pos].salt_buf[ 2]; + salt_buf0[ 3] = esalt_bufs[salt_pos].salt_buf[ 3]; + salt_buf0[ 4] = esalt_bufs[salt_pos].salt_buf[ 4]; + salt_buf0[ 5] = esalt_bufs[salt_pos].salt_buf[ 5]; + salt_buf0[ 6] = esalt_bufs[salt_pos].salt_buf[ 6]; + salt_buf0[ 7] = esalt_bufs[salt_pos].salt_buf[ 7]; + salt_buf0[ 8] = esalt_bufs[salt_pos].salt_buf[ 8]; + salt_buf0[ 9] = esalt_bufs[salt_pos].salt_buf[ 9]; + salt_buf0[10] = esalt_bufs[salt_pos].salt_buf[10]; + salt_buf0[11] = esalt_bufs[salt_pos].salt_buf[11]; + salt_buf0[12] = esalt_bufs[salt_pos].salt_buf[12]; + salt_buf0[13] = esalt_bufs[salt_pos].salt_buf[13]; + salt_buf0[14] = esalt_bufs[salt_pos].salt_buf[14]; + salt_buf0[15] = esalt_bufs[salt_pos].salt_buf[15]; + + u32 salt_buf1[16]; + + salt_buf1[ 0] = esalt_bufs[salt_pos].salt_buf[16]; + salt_buf1[ 1] = esalt_bufs[salt_pos].salt_buf[17]; + salt_buf1[ 2] = esalt_bufs[salt_pos].salt_buf[18]; + salt_buf1[ 3] = esalt_bufs[salt_pos].salt_buf[19]; + salt_buf1[ 4] = esalt_bufs[salt_pos].salt_buf[20]; + salt_buf1[ 5] = esalt_bufs[salt_pos].salt_buf[21]; + salt_buf1[ 6] = esalt_bufs[salt_pos].salt_buf[22]; + salt_buf1[ 7] = esalt_bufs[salt_pos].salt_buf[23]; + salt_buf1[ 8] = esalt_bufs[salt_pos].salt_buf[24]; + salt_buf1[ 9] = esalt_bufs[salt_pos].salt_buf[25]; + salt_buf1[10] = esalt_bufs[salt_pos].salt_buf[26]; + salt_buf1[11] = esalt_bufs[salt_pos].salt_buf[27]; + salt_buf1[12] = esalt_bufs[salt_pos].salt_buf[28]; + salt_buf1[13] = esalt_bufs[salt_pos].salt_buf[29]; + salt_buf1[14] = 0; + salt_buf1[15] = 0; + + /** + * esalt + */ + + const u32 esalt_len = esalt_bufs[salt_pos].esalt_len; + + u32 esalt_buf0[16]; + + esalt_buf0[ 0] = esalt_bufs[salt_pos].esalt_buf[ 0]; + esalt_buf0[ 1] = esalt_bufs[salt_pos].esalt_buf[ 1]; + esalt_buf0[ 2] = esalt_bufs[salt_pos].esalt_buf[ 2]; + esalt_buf0[ 3] = esalt_bufs[salt_pos].esalt_buf[ 3]; + esalt_buf0[ 4] = esalt_bufs[salt_pos].esalt_buf[ 4]; + esalt_buf0[ 5] = esalt_bufs[salt_pos].esalt_buf[ 5]; + esalt_buf0[ 6] = esalt_bufs[salt_pos].esalt_buf[ 6]; + esalt_buf0[ 7] = esalt_bufs[salt_pos].esalt_buf[ 7]; + esalt_buf0[ 8] = esalt_bufs[salt_pos].esalt_buf[ 8]; + esalt_buf0[ 9] = esalt_bufs[salt_pos].esalt_buf[ 9]; + esalt_buf0[10] = esalt_bufs[salt_pos].esalt_buf[10]; + esalt_buf0[11] = esalt_bufs[salt_pos].esalt_buf[11]; + esalt_buf0[12] = esalt_bufs[salt_pos].esalt_buf[12]; + esalt_buf0[13] = esalt_bufs[salt_pos].esalt_buf[13]; + esalt_buf0[14] = esalt_bufs[salt_pos].esalt_buf[14]; + esalt_buf0[15] = esalt_bufs[salt_pos].esalt_buf[15]; + + u32 esalt_buf1[16]; + + esalt_buf1[ 0] = esalt_bufs[salt_pos].esalt_buf[16]; + esalt_buf1[ 1] = esalt_bufs[salt_pos].esalt_buf[17]; + esalt_buf1[ 2] = esalt_bufs[salt_pos].esalt_buf[18]; + esalt_buf1[ 3] = esalt_bufs[salt_pos].esalt_buf[19]; + esalt_buf1[ 4] = esalt_bufs[salt_pos].esalt_buf[20]; + esalt_buf1[ 5] = esalt_bufs[salt_pos].esalt_buf[21]; + esalt_buf1[ 6] = esalt_bufs[salt_pos].esalt_buf[22]; + esalt_buf1[ 7] = esalt_bufs[salt_pos].esalt_buf[23]; + esalt_buf1[ 8] = esalt_bufs[salt_pos].esalt_buf[24]; + esalt_buf1[ 9] = esalt_bufs[salt_pos].esalt_buf[25]; + esalt_buf1[10] = esalt_bufs[salt_pos].esalt_buf[26]; + esalt_buf1[11] = esalt_bufs[salt_pos].esalt_buf[27]; + esalt_buf1[12] = esalt_bufs[salt_pos].esalt_buf[28]; + esalt_buf1[13] = esalt_bufs[salt_pos].esalt_buf[29]; + esalt_buf1[14] = esalt_bufs[salt_pos].esalt_buf[30]; + esalt_buf1[15] = esalt_bufs[salt_pos].esalt_buf[31]; + + u32 esalt_buf2[16]; + + esalt_buf2[ 0] = esalt_bufs[salt_pos].esalt_buf[32]; + esalt_buf2[ 1] = esalt_bufs[salt_pos].esalt_buf[33]; + esalt_buf2[ 2] = esalt_bufs[salt_pos].esalt_buf[34]; + esalt_buf2[ 3] = esalt_bufs[salt_pos].esalt_buf[35]; + esalt_buf2[ 4] = esalt_bufs[salt_pos].esalt_buf[36]; + esalt_buf2[ 5] = esalt_bufs[salt_pos].esalt_buf[37]; + esalt_buf2[ 6] = 0; + esalt_buf2[ 7] = 0; + esalt_buf2[ 8] = 0; + esalt_buf2[ 9] = 0; + esalt_buf2[10] = 0; + esalt_buf2[11] = 0; + esalt_buf2[12] = 0; + esalt_buf2[13] = 0; + esalt_buf2[14] = 0; + esalt_buf2[15] = 0; + + const u32 digest_esalt_len = 32 + esalt_len; + + /** + * loop + */ + + u32x w0l = w0[0]; + + for (u32 il_pos = 0; il_pos < bfs_cnt; il_pos++) + { + const u32 w0r = bfs_buf[il_pos].i; + + w0[0] = w0l | w0r; + + /* + * HA1 = md5 ($salt . $pass) + */ + + // append the pass to the salt + + u32x block0[16]; + + block0[ 0] = salt_buf0[ 0]; + block0[ 1] = salt_buf0[ 1]; + block0[ 2] = salt_buf0[ 2]; + block0[ 3] = salt_buf0[ 3]; + block0[ 4] = salt_buf0[ 4]; + block0[ 5] = salt_buf0[ 5]; + block0[ 6] = salt_buf0[ 6]; + block0[ 7] = salt_buf0[ 7]; + block0[ 8] = salt_buf0[ 8]; + block0[ 9] = salt_buf0[ 9]; + block0[10] = salt_buf0[10]; + block0[11] = salt_buf0[11]; + block0[12] = salt_buf0[12]; + block0[13] = salt_buf0[13]; + block0[14] = salt_buf0[14]; + block0[15] = salt_buf0[15]; + + u32x block1[16]; + + block1[ 0] = salt_buf1[ 0]; + block1[ 1] = salt_buf1[ 1]; + block1[ 2] = salt_buf1[ 2]; + block1[ 3] = salt_buf1[ 3]; + block1[ 4] = salt_buf1[ 4]; + block1[ 5] = salt_buf1[ 5]; + block1[ 6] = salt_buf1[ 6]; + block1[ 7] = salt_buf1[ 7]; + block1[ 8] = salt_buf1[ 8]; + block1[ 9] = salt_buf1[ 9]; + block1[10] = salt_buf1[10]; + block1[11] = salt_buf1[11]; + block1[12] = salt_buf1[12]; + block1[13] = salt_buf1[13]; + block1[14] = salt_buf1[14]; + block1[15] = salt_buf1[15]; + + memcat32 (block0, block1, salt_len, w0, w1, w2, w3, pw_len); + + u32x w0_t[4]; + + w0_t[0] = block0[ 0]; + w0_t[1] = block0[ 1]; + w0_t[2] = block0[ 2]; + w0_t[3] = block0[ 3]; + + u32x w1_t[4]; + + w1_t[0] = block0[ 4]; + w1_t[1] = block0[ 5]; + w1_t[2] = block0[ 6]; + w1_t[3] = block0[ 7]; + + u32x w2_t[4]; + + w2_t[0] = block0[ 8]; + w2_t[1] = block0[ 9]; + w2_t[2] = block0[10]; + w2_t[3] = block0[11]; + + u32x w3_t[4]; + + w3_t[0] = block0[12]; + w3_t[1] = block0[13]; + w3_t[2] = block0[14]; + w3_t[3] = block0[15]; + + // md5 + + u32x tmp2; + + u32x a = MD5M_A; + u32x b = MD5M_B; + u32x c = MD5M_C; + u32x d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0_t[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0_t[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0_t[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1_t[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1_t[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1_t[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2_t[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2_t[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2_t[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3_t[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3_t[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3_t[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0_t[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1_t[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2_t[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1_t[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1_t[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2_t[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3_t[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0_t[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2_t[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3_t[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0_t[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1_t[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3_t[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H1, a, b, c, d, w1_t[1], MD5C20, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w2_t[0], MD5C21, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w2_t[3], MD5C22, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w3_t[2], MD5C23, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w0_t[1], MD5C24, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w1_t[0], MD5C25, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w1_t[3], MD5C26, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w2_t[2], MD5C27, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w3_t[1], MD5C28, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w0_t[0], MD5C29, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w0_t[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w1_t[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w2_t[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w3_t[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w3_t[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w0_t[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1_t[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3_t[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3_t[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0_t[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0_t[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2_t[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1_t[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3_t[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1_t[0], MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w2_t[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0_t[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2_t[1], MD5C3f, MD5S33); + + a += MD5M_A; + b += MD5M_B; + c += MD5M_C; + d += MD5M_D; + + u32x r_a = a; + u32x r_b = b; + u32x r_c = c; + u32x r_d = d; + + w0_t[0] = block1[ 0]; + w0_t[1] = block1[ 1]; + w0_t[2] = block1[ 2]; + w0_t[3] = block1[ 3]; + + w1_t[0] = block1[ 4]; + w1_t[1] = block1[ 5]; + w1_t[2] = block1[ 6]; + w1_t[3] = block1[ 7]; + + w2_t[0] = block1[ 8]; + w2_t[1] = block1[ 9]; + w2_t[2] = block1[10]; + w2_t[3] = block1[11]; + + w3_t[0] = block1[12]; + w3_t[1] = block1[13]; + w3_t[2] = pw_salt_len * 8; + w3_t[3] = 0; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0_t[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0_t[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0_t[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1_t[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1_t[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1_t[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2_t[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2_t[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2_t[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3_t[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3_t[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3_t[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0_t[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1_t[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2_t[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1_t[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1_t[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2_t[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3_t[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0_t[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2_t[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3_t[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0_t[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1_t[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3_t[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H1, a, b, c, d, w1_t[1], MD5C20, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w2_t[0], MD5C21, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w2_t[3], MD5C22, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w3_t[2], MD5C23, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w0_t[1], MD5C24, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w1_t[0], MD5C25, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w1_t[3], MD5C26, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w2_t[2], MD5C27, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w3_t[1], MD5C28, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w0_t[0], MD5C29, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w0_t[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w1_t[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w2_t[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w3_t[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w3_t[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w0_t[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1_t[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3_t[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3_t[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0_t[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0_t[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2_t[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1_t[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3_t[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1_t[0], MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w2_t[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0_t[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2_t[1], MD5C3f, MD5S33); + + a += r_a; + b += r_b; + c += r_c; + d += r_d; + + /* + * final = md5 ($HA1 . $esalt) + * we have at least 2 MD5 blocks/transformations, but we might need 3 + */ + + w0_t[0] = uint_to_hex_lower8 ((a >> 0) & 255) << 0 + | uint_to_hex_lower8 ((a >> 8) & 255) << 16; + w0_t[1] = uint_to_hex_lower8 ((a >> 16) & 255) << 0 + | uint_to_hex_lower8 ((a >> 24) & 255) << 16; + w0_t[2] = uint_to_hex_lower8 ((b >> 0) & 255) << 0 + | uint_to_hex_lower8 ((b >> 8) & 255) << 16; + w0_t[3] = uint_to_hex_lower8 ((b >> 16) & 255) << 0 + | uint_to_hex_lower8 ((b >> 24) & 255) << 16; + w1_t[0] = uint_to_hex_lower8 ((c >> 0) & 255) << 0 + | uint_to_hex_lower8 ((c >> 8) & 255) << 16; + w1_t[1] = uint_to_hex_lower8 ((c >> 16) & 255) << 0 + | uint_to_hex_lower8 ((c >> 24) & 255) << 16; + w1_t[2] = uint_to_hex_lower8 ((d >> 0) & 255) << 0 + | uint_to_hex_lower8 ((d >> 8) & 255) << 16; + w1_t[3] = uint_to_hex_lower8 ((d >> 16) & 255) << 0 + | uint_to_hex_lower8 ((d >> 24) & 255) << 16; + + w2_t[0] = esalt_buf0[0]; + w2_t[1] = esalt_buf0[1]; + w2_t[2] = esalt_buf0[2]; + w2_t[3] = esalt_buf0[3]; + + w3_t[0] = esalt_buf0[4]; + w3_t[1] = esalt_buf0[5]; + w3_t[2] = esalt_buf0[6]; + w3_t[3] = esalt_buf0[7]; + + // md5 + // 1st transform + + a = MD5M_A; + b = MD5M_B; + c = MD5M_C; + d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0_t[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0_t[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0_t[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1_t[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1_t[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1_t[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2_t[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2_t[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2_t[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3_t[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3_t[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3_t[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0_t[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1_t[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2_t[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1_t[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1_t[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2_t[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3_t[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0_t[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2_t[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3_t[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0_t[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1_t[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3_t[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H1, a, b, c, d, w1_t[1], MD5C20, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w2_t[0], MD5C21, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w2_t[3], MD5C22, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w3_t[2], MD5C23, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w0_t[1], MD5C24, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w1_t[0], MD5C25, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w1_t[3], MD5C26, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w2_t[2], MD5C27, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w3_t[1], MD5C28, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w0_t[0], MD5C29, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w0_t[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w1_t[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w2_t[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w3_t[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w3_t[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w0_t[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1_t[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3_t[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3_t[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0_t[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0_t[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2_t[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1_t[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3_t[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1_t[0], MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w2_t[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0_t[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2_t[1], MD5C3f, MD5S33); + + a += MD5M_A; + b += MD5M_B; + c += MD5M_C; + d += MD5M_D; + + r_a = a; + r_b = b; + r_c = c; + r_d = d; + + // 2nd transform + + w0_t[0] = esalt_buf0[ 8]; + w0_t[1] = esalt_buf0[ 9]; + w0_t[2] = esalt_buf0[10]; + w0_t[3] = esalt_buf0[11]; + + w1_t[0] = esalt_buf0[12]; + w1_t[1] = esalt_buf0[13]; + w1_t[2] = esalt_buf0[14]; + w1_t[3] = esalt_buf0[15]; + + w2_t[0] = esalt_buf1[ 0]; + w2_t[1] = esalt_buf1[ 1]; + w2_t[2] = esalt_buf1[ 2]; + w2_t[3] = esalt_buf1[ 3]; + + w3_t[0] = esalt_buf1[ 4]; + w3_t[1] = esalt_buf1[ 5]; + w3_t[2] = esalt_buf1[ 6]; + w3_t[3] = esalt_buf1[ 7]; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0_t[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0_t[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0_t[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1_t[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1_t[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1_t[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2_t[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2_t[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2_t[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3_t[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3_t[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3_t[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0_t[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1_t[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2_t[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1_t[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1_t[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2_t[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3_t[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0_t[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2_t[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3_t[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0_t[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1_t[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3_t[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H1, a, b, c, d, w1_t[1], MD5C20, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w2_t[0], MD5C21, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w2_t[3], MD5C22, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w3_t[2], MD5C23, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w0_t[1], MD5C24, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w1_t[0], MD5C25, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w1_t[3], MD5C26, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w2_t[2], MD5C27, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w3_t[1], MD5C28, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w0_t[0], MD5C29, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w0_t[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w1_t[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w2_t[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w3_t[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w3_t[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w0_t[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1_t[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3_t[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3_t[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0_t[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0_t[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2_t[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1_t[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3_t[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1_t[0], MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w2_t[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0_t[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2_t[1], MD5C3f, MD5S33); + + // this is for sure the final block + + a += r_a; + b += r_b; + c += r_c; + d += r_d; + + r_a = a; + r_b = b; + r_c = c; + r_d = d; + + w0_t[0] = esalt_buf1[ 8]; + w0_t[1] = esalt_buf1[ 9]; + w0_t[2] = esalt_buf1[10]; + w0_t[3] = esalt_buf1[11]; + + w1_t[0] = esalt_buf1[12]; + w1_t[1] = esalt_buf1[13]; + w1_t[2] = esalt_buf1[14]; + w1_t[3] = esalt_buf1[15]; + + w2_t[0] = esalt_buf2[ 0]; + w2_t[1] = esalt_buf2[ 1]; + w2_t[2] = esalt_buf2[ 2]; + w2_t[3] = esalt_buf2[ 3]; + + w3_t[0] = esalt_buf2[ 4]; + w3_t[1] = esalt_buf2[ 5]; + w3_t[2] = digest_esalt_len * 8; + w3_t[3] = 0; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0_t[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0_t[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0_t[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1_t[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1_t[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1_t[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2_t[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2_t[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2_t[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3_t[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3_t[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3_t[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0_t[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1_t[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2_t[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1_t[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1_t[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2_t[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3_t[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0_t[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2_t[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3_t[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0_t[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1_t[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3_t[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H1, a, b, c, d, w1_t[1], MD5C20, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w2_t[0], MD5C21, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w2_t[3], MD5C22, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w3_t[2], MD5C23, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w0_t[1], MD5C24, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w1_t[0], MD5C25, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w1_t[3], MD5C26, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w2_t[2], MD5C27, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w3_t[1], MD5C28, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w0_t[0], MD5C29, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w0_t[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w1_t[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w2_t[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w3_t[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w3_t[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w0_t[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1_t[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3_t[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3_t[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0_t[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0_t[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2_t[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1_t[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3_t[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1_t[0], MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w2_t[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0_t[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2_t[1], MD5C3f, MD5S33); + + a += r_a; + b += r_b; + c += r_c; + d += r_d; + + const u32x r0 = a; + const u32x r1 = d; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_S + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m11400_m04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global sip_t *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = pws[gid].i[14]; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * bin2asc table + */ + + __local u32 l_bin2asc[256]; + + const u32 lid4 = lid * 4; + + const u32 lid40 = lid4 + 0; + const u32 lid41 = lid4 + 1; + const u32 lid42 = lid4 + 2; + const u32 lid43 = lid4 + 3; + + const u32 v400 = (lid40 >> 0) & 15; + const u32 v401 = (lid40 >> 4) & 15; + const u32 v410 = (lid41 >> 0) & 15; + const u32 v411 = (lid41 >> 4) & 15; + const u32 v420 = (lid42 >> 0) & 15; + const u32 v421 = (lid42 >> 4) & 15; + const u32 v430 = (lid43 >> 0) & 15; + const u32 v431 = (lid43 >> 4) & 15; + + l_bin2asc[lid40] = ((v400 < 10) ? '0' + v400 : 'a' - 10 + v400) << 8 + | ((v401 < 10) ? '0' + v401 : 'a' - 10 + v401) << 0; + l_bin2asc[lid41] = ((v410 < 10) ? '0' + v410 : 'a' - 10 + v410) << 8 + | ((v411 < 10) ? '0' + v411 : 'a' - 10 + v411) << 0; + l_bin2asc[lid42] = ((v420 < 10) ? '0' + v420 : 'a' - 10 + v420) << 8 + | ((v421 < 10) ? '0' + v421 : 'a' - 10 + v421) << 0; + l_bin2asc[lid43] = ((v430 < 10) ? '0' + v430 : 'a' - 10 + v430) << 8 + | ((v431 < 10) ? '0' + v431 : 'a' - 10 + v431) << 0; + + barrier (CLK_LOCAL_MEM_FENCE); + + if (gid >= gid_max) return; + + /** + * main + */ + + const u32 esalt_len = esalt_bufs[salt_pos].esalt_len; + const u32 salt_len = esalt_bufs[salt_pos].salt_len; + + const u32 sw_1 = ((32 + esalt_len + 1) > 119); + const u32 sw_2 = ((pw_len + salt_len) > 55) << 1; + + switch (sw_1 | sw_2) + { + case 0: + m11400m_0_0 (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset, l_bin2asc); + break; + case 1: + m11400m_0_1 (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset, l_bin2asc); + break; + case 2: + m11400m_1_0 (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset, l_bin2asc); + break; + case 3: + m11400m_1_1 (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset, l_bin2asc); + break; + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m11400_m08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global sip_t *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = pws[gid].i[14]; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * bin2asc table + */ + + __local u32 l_bin2asc[256]; + + const u32 lid4 = lid * 4; + + const u32 lid40 = lid4 + 0; + const u32 lid41 = lid4 + 1; + const u32 lid42 = lid4 + 2; + const u32 lid43 = lid4 + 3; + + const u32 v400 = (lid40 >> 0) & 15; + const u32 v401 = (lid40 >> 4) & 15; + const u32 v410 = (lid41 >> 0) & 15; + const u32 v411 = (lid41 >> 4) & 15; + const u32 v420 = (lid42 >> 0) & 15; + const u32 v421 = (lid42 >> 4) & 15; + const u32 v430 = (lid43 >> 0) & 15; + const u32 v431 = (lid43 >> 4) & 15; + + l_bin2asc[lid40] = ((v400 < 10) ? '0' + v400 : 'a' - 10 + v400) << 8 + | ((v401 < 10) ? '0' + v401 : 'a' - 10 + v401) << 0; + l_bin2asc[lid41] = ((v410 < 10) ? '0' + v410 : 'a' - 10 + v410) << 8 + | ((v411 < 10) ? '0' + v411 : 'a' - 10 + v411) << 0; + l_bin2asc[lid42] = ((v420 < 10) ? '0' + v420 : 'a' - 10 + v420) << 8 + | ((v421 < 10) ? '0' + v421 : 'a' - 10 + v421) << 0; + l_bin2asc[lid43] = ((v430 < 10) ? '0' + v430 : 'a' - 10 + v430) << 8 + | ((v431 < 10) ? '0' + v431 : 'a' - 10 + v431) << 0; + + barrier (CLK_LOCAL_MEM_FENCE); + + if (gid >= gid_max) return; + + /** + * main + */ + + const u32 esalt_len = esalt_bufs[salt_pos].esalt_len; + const u32 salt_len = esalt_bufs[salt_pos].salt_len; + + const u32 sw_1 = ((32 + esalt_len + 1) > 119); + const u32 sw_2 = ((pw_len + salt_len) > 55) << 1; + + switch (sw_1 | sw_2) + { + case 0: + m11400m_0_0 (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset, l_bin2asc); + break; + case 1: + m11400m_0_1 (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset, l_bin2asc); + break; + case 2: + m11400m_1_0 (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset, l_bin2asc); + break; + case 3: + m11400m_1_1 (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset, l_bin2asc); + break; + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m11400_m16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global sip_t *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = pws[gid].i[ 8]; + w2[1] = pws[gid].i[ 9]; + w2[2] = pws[gid].i[10]; + w2[3] = pws[gid].i[11]; + + u32x w3[4]; + + w3[0] = pws[gid].i[12]; + w3[1] = pws[gid].i[13]; + w3[2] = pws[gid].i[14]; + w3[3] = pws[gid].i[15]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * bin2asc table + */ + + __local u32 l_bin2asc[256]; + + const u32 lid4 = lid * 4; + + const u32 lid40 = lid4 + 0; + const u32 lid41 = lid4 + 1; + const u32 lid42 = lid4 + 2; + const u32 lid43 = lid4 + 3; + + const u32 v400 = (lid40 >> 0) & 15; + const u32 v401 = (lid40 >> 4) & 15; + const u32 v410 = (lid41 >> 0) & 15; + const u32 v411 = (lid41 >> 4) & 15; + const u32 v420 = (lid42 >> 0) & 15; + const u32 v421 = (lid42 >> 4) & 15; + const u32 v430 = (lid43 >> 0) & 15; + const u32 v431 = (lid43 >> 4) & 15; + + l_bin2asc[lid40] = ((v400 < 10) ? '0' + v400 : 'a' - 10 + v400) << 8 + | ((v401 < 10) ? '0' + v401 : 'a' - 10 + v401) << 0; + l_bin2asc[lid41] = ((v410 < 10) ? '0' + v410 : 'a' - 10 + v410) << 8 + | ((v411 < 10) ? '0' + v411 : 'a' - 10 + v411) << 0; + l_bin2asc[lid42] = ((v420 < 10) ? '0' + v420 : 'a' - 10 + v420) << 8 + | ((v421 < 10) ? '0' + v421 : 'a' - 10 + v421) << 0; + l_bin2asc[lid43] = ((v430 < 10) ? '0' + v430 : 'a' - 10 + v430) << 8 + | ((v431 < 10) ? '0' + v431 : 'a' - 10 + v431) << 0; + + barrier (CLK_LOCAL_MEM_FENCE); + + if (gid >= gid_max) return; + + /** + * main + */ + + const u32 esalt_len = esalt_bufs[salt_pos].esalt_len; + const u32 salt_len = esalt_bufs[salt_pos].salt_len; + + const u32 sw_1 = ((32 + esalt_len + 1) > 119); + const u32 sw_2 = ((pw_len + salt_len) > 55) << 1; + + switch (sw_1 | sw_2) + { + case 0: + m11400m_0_0 (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset, l_bin2asc); + break; + case 1: + m11400m_0_1 (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset, l_bin2asc); + break; + case 2: + m11400m_1_0 (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset, l_bin2asc); + break; + case 3: + m11400m_1_1 (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset, l_bin2asc); + break; + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m11400_s04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global sip_t *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = pws[gid].i[14]; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * bin2asc table + */ + + __local u32 l_bin2asc[256]; + + const u32 lid4 = lid * 4; + + const u32 lid40 = lid4 + 0; + const u32 lid41 = lid4 + 1; + const u32 lid42 = lid4 + 2; + const u32 lid43 = lid4 + 3; + + const u32 v400 = (lid40 >> 0) & 15; + const u32 v401 = (lid40 >> 4) & 15; + const u32 v410 = (lid41 >> 0) & 15; + const u32 v411 = (lid41 >> 4) & 15; + const u32 v420 = (lid42 >> 0) & 15; + const u32 v421 = (lid42 >> 4) & 15; + const u32 v430 = (lid43 >> 0) & 15; + const u32 v431 = (lid43 >> 4) & 15; + + l_bin2asc[lid40] = ((v400 < 10) ? '0' + v400 : 'a' - 10 + v400) << 8 + | ((v401 < 10) ? '0' + v401 : 'a' - 10 + v401) << 0; + l_bin2asc[lid41] = ((v410 < 10) ? '0' + v410 : 'a' - 10 + v410) << 8 + | ((v411 < 10) ? '0' + v411 : 'a' - 10 + v411) << 0; + l_bin2asc[lid42] = ((v420 < 10) ? '0' + v420 : 'a' - 10 + v420) << 8 + | ((v421 < 10) ? '0' + v421 : 'a' - 10 + v421) << 0; + l_bin2asc[lid43] = ((v430 < 10) ? '0' + v430 : 'a' - 10 + v430) << 8 + | ((v431 < 10) ? '0' + v431 : 'a' - 10 + v431) << 0; + + barrier (CLK_LOCAL_MEM_FENCE); + + if (gid >= gid_max) return; + + /** + * main + */ + + const u32 esalt_len = esalt_bufs[salt_pos].esalt_len; + const u32 salt_len = esalt_bufs[salt_pos].salt_len; + + const u32 sw_1 = ((32 + esalt_len + 1) > 119); + const u32 sw_2 = ((pw_len + salt_len) > 55) << 1; + + switch (sw_1 | sw_2) + { + case 0: + m11400s_0_0 (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset, l_bin2asc); + break; + case 1: + m11400s_0_1 (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset, l_bin2asc); + break; + case 2: + m11400s_1_0 (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset, l_bin2asc); + break; + case 3: + m11400s_1_1 (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset, l_bin2asc); + break; + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m11400_s08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global sip_t *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = pws[gid].i[14]; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * bin2asc table + */ + + __local u32 l_bin2asc[256]; + + const u32 lid4 = lid * 4; + + const u32 lid40 = lid4 + 0; + const u32 lid41 = lid4 + 1; + const u32 lid42 = lid4 + 2; + const u32 lid43 = lid4 + 3; + + const u32 v400 = (lid40 >> 0) & 15; + const u32 v401 = (lid40 >> 4) & 15; + const u32 v410 = (lid41 >> 0) & 15; + const u32 v411 = (lid41 >> 4) & 15; + const u32 v420 = (lid42 >> 0) & 15; + const u32 v421 = (lid42 >> 4) & 15; + const u32 v430 = (lid43 >> 0) & 15; + const u32 v431 = (lid43 >> 4) & 15; + + l_bin2asc[lid40] = ((v400 < 10) ? '0' + v400 : 'a' - 10 + v400) << 8 + | ((v401 < 10) ? '0' + v401 : 'a' - 10 + v401) << 0; + l_bin2asc[lid41] = ((v410 < 10) ? '0' + v410 : 'a' - 10 + v410) << 8 + | ((v411 < 10) ? '0' + v411 : 'a' - 10 + v411) << 0; + l_bin2asc[lid42] = ((v420 < 10) ? '0' + v420 : 'a' - 10 + v420) << 8 + | ((v421 < 10) ? '0' + v421 : 'a' - 10 + v421) << 0; + l_bin2asc[lid43] = ((v430 < 10) ? '0' + v430 : 'a' - 10 + v430) << 8 + | ((v431 < 10) ? '0' + v431 : 'a' - 10 + v431) << 0; + + barrier (CLK_LOCAL_MEM_FENCE); + + if (gid >= gid_max) return; + + /** + * main + */ + + const u32 esalt_len = esalt_bufs[salt_pos].esalt_len; + const u32 salt_len = esalt_bufs[salt_pos].salt_len; + + const u32 sw_1 = ((32 + esalt_len + 1) > 119); + const u32 sw_2 = ((pw_len + salt_len) > 55) << 1; + + switch (sw_1 | sw_2) + { + case 0: + m11400s_0_0 (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset, l_bin2asc); + break; + case 1: + m11400s_0_1 (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset, l_bin2asc); + break; + case 2: + m11400s_1_0 (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset, l_bin2asc); + break; + case 3: + m11400s_1_1 (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset, l_bin2asc); + break; + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m11400_s16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global sip_t *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = pws[gid].i[ 8]; + w2[1] = pws[gid].i[ 9]; + w2[2] = pws[gid].i[10]; + w2[3] = pws[gid].i[11]; + + u32x w3[4]; + + w3[0] = pws[gid].i[12]; + w3[1] = pws[gid].i[13]; + w3[2] = pws[gid].i[14]; + w3[3] = pws[gid].i[15]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * bin2asc table + */ + + __local u32 l_bin2asc[256]; + + const u32 lid4 = lid * 4; + + const u32 lid40 = lid4 + 0; + const u32 lid41 = lid4 + 1; + const u32 lid42 = lid4 + 2; + const u32 lid43 = lid4 + 3; + + const u32 v400 = (lid40 >> 0) & 15; + const u32 v401 = (lid40 >> 4) & 15; + const u32 v410 = (lid41 >> 0) & 15; + const u32 v411 = (lid41 >> 4) & 15; + const u32 v420 = (lid42 >> 0) & 15; + const u32 v421 = (lid42 >> 4) & 15; + const u32 v430 = (lid43 >> 0) & 15; + const u32 v431 = (lid43 >> 4) & 15; + + l_bin2asc[lid40] = ((v400 < 10) ? '0' + v400 : 'a' - 10 + v400) << 8 + | ((v401 < 10) ? '0' + v401 : 'a' - 10 + v401) << 0; + l_bin2asc[lid41] = ((v410 < 10) ? '0' + v410 : 'a' - 10 + v410) << 8 + | ((v411 < 10) ? '0' + v411 : 'a' - 10 + v411) << 0; + l_bin2asc[lid42] = ((v420 < 10) ? '0' + v420 : 'a' - 10 + v420) << 8 + | ((v421 < 10) ? '0' + v421 : 'a' - 10 + v421) << 0; + l_bin2asc[lid43] = ((v430 < 10) ? '0' + v430 : 'a' - 10 + v430) << 8 + | ((v431 < 10) ? '0' + v431 : 'a' - 10 + v431) << 0; + + barrier (CLK_LOCAL_MEM_FENCE); + + if (gid >= gid_max) return; + + /** + * main + */ + + const u32 esalt_len = esalt_bufs[salt_pos].esalt_len; + const u32 salt_len = esalt_bufs[salt_pos].salt_len; + + const u32 sw_1 = ((32 + esalt_len + 1) > 119); + const u32 sw_2 = ((pw_len + salt_len) > 55) << 1; + + switch (sw_1 | sw_2) + { + case 0: + m11400s_0_0 (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset, l_bin2asc); + break; + case 1: + m11400s_0_1 (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset, l_bin2asc); + break; + case 2: + m11400s_1_0 (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset, l_bin2asc); + break; + case 3: + m11400s_1_1 (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset, l_bin2asc); + break; + } +} diff --git a/amd/m11500_a0.cl b/amd/m11500_a0.cl new file mode 100644 index 0000000000..559d4b8916 --- /dev/null +++ b/amd/m11500_a0.cl @@ -0,0 +1,396 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _CRC32_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW4 +#define VECT_SIZE4 +#endif + +#ifdef VLIW5 +#define VECT_SIZE4 +#endif + +#define DGST_R0 0 +#define DGST_R1 1 +#define DGST_R2 2 +#define DGST_R3 3 + +#include "include/kernel_functions.c" +#include "types_amd.c" +#include "common_amd.c" +#include "include/rp_gpu.h" +#include "rp_amd.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +__constant u32 crc32tab[0x100] = +{ + 0x00000000, 0x77073096, 0xee0e612c, 0x990951ba, + 0x076dc419, 0x706af48f, 0xe963a535, 0x9e6495a3, + 0x0edb8832, 0x79dcb8a4, 0xe0d5e91e, 0x97d2d988, + 0x09b64c2b, 0x7eb17cbd, 0xe7b82d07, 0x90bf1d91, + 0x1db71064, 0x6ab020f2, 0xf3b97148, 0x84be41de, + 0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7, + 0x136c9856, 0x646ba8c0, 0xfd62f97a, 0x8a65c9ec, + 0x14015c4f, 0x63066cd9, 0xfa0f3d63, 0x8d080df5, + 0x3b6e20c8, 0x4c69105e, 0xd56041e4, 0xa2677172, + 0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b, + 0x35b5a8fa, 0x42b2986c, 0xdbbbc9d6, 0xacbcf940, + 0x32d86ce3, 0x45df5c75, 0xdcd60dcf, 0xabd13d59, + 0x26d930ac, 0x51de003a, 0xc8d75180, 0xbfd06116, + 0x21b4f4b5, 0x56b3c423, 0xcfba9599, 0xb8bda50f, + 0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924, + 0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d, + 0x76dc4190, 0x01db7106, 0x98d220bc, 0xefd5102a, + 0x71b18589, 0x06b6b51f, 0x9fbfe4a5, 0xe8b8d433, + 0x7807c9a2, 0x0f00f934, 0x9609a88e, 0xe10e9818, + 0x7f6a0dbb, 0x086d3d2d, 0x91646c97, 0xe6635c01, + 0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e, + 0x6c0695ed, 0x1b01a57b, 0x8208f4c1, 0xf50fc457, + 0x65b0d9c6, 0x12b7e950, 0x8bbeb8ea, 0xfcb9887c, + 0x62dd1ddf, 0x15da2d49, 0x8cd37cf3, 0xfbd44c65, + 0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2, + 0x4adfa541, 0x3dd895d7, 0xa4d1c46d, 0xd3d6f4fb, + 0x4369e96a, 0x346ed9fc, 0xad678846, 0xda60b8d0, + 0x44042d73, 0x33031de5, 0xaa0a4c5f, 0xdd0d7cc9, + 0x5005713c, 0x270241aa, 0xbe0b1010, 0xc90c2086, + 0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f, + 0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4, + 0x59b33d17, 0x2eb40d81, 0xb7bd5c3b, 0xc0ba6cad, + 0xedb88320, 0x9abfb3b6, 0x03b6e20c, 0x74b1d29a, + 0xead54739, 0x9dd277af, 0x04db2615, 0x73dc1683, + 0xe3630b12, 0x94643b84, 0x0d6d6a3e, 0x7a6a5aa8, + 0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1, + 0xf00f9344, 0x8708a3d2, 0x1e01f268, 0x6906c2fe, + 0xf762575d, 0x806567cb, 0x196c3671, 0x6e6b06e7, + 0xfed41b76, 0x89d32be0, 0x10da7a5a, 0x67dd4acc, + 0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5, + 0xd6d6a3e8, 0xa1d1937e, 0x38d8c2c4, 0x4fdff252, + 0xd1bb67f1, 0xa6bc5767, 0x3fb506dd, 0x48b2364b, + 0xd80d2bda, 0xaf0a1b4c, 0x36034af6, 0x41047a60, + 0xdf60efc3, 0xa867df55, 0x316e8eef, 0x4669be79, + 0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236, + 0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f, + 0xc5ba3bbe, 0xb2bd0b28, 0x2bb45a92, 0x5cb36a04, + 0xc2d7ffa7, 0xb5d0cf31, 0x2cd99e8b, 0x5bdeae1d, + 0x9b64c2b0, 0xec63f226, 0x756aa39c, 0x026d930a, + 0x9c0906a9, 0xeb0e363f, 0x72076785, 0x05005713, + 0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38, + 0x92d28e9b, 0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21, + 0x86d3d2d4, 0xf1d4e242, 0x68ddb3f8, 0x1fda836e, + 0x81be16cd, 0xf6b9265b, 0x6fb077e1, 0x18b74777, + 0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c, + 0x8f659eff, 0xf862ae69, 0x616bffd3, 0x166ccf45, + 0xa00ae278, 0xd70dd2ee, 0x4e048354, 0x3903b3c2, + 0xa7672661, 0xd06016f7, 0x4969474d, 0x3e6e77db, + 0xaed16a4a, 0xd9d65adc, 0x40df0b66, 0x37d83bf0, + 0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9, + 0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6, + 0xbad03605, 0xcdd70693, 0x54de5729, 0x23d967bf, + 0xb3667a2e, 0xc4614ab8, 0x5d681b02, 0x2a6f2b94, + 0xb40bbe37, 0xc30c8ea1, 0x5a05df1b, 0x2d02ef8d +}; + +static u32x round_crc32 (u32x a, const u32x v) +{ + const u32x k = (a ^ v) & 0xff; + + const u32x s = a >> 8; + + #ifdef VECT_SIZE1 + a = crc32tab[k]; + #endif + + #ifdef VECT_SIZE2 + a.s0 = crc32tab[k.s0]; + a.s1 = crc32tab[k.s1]; + #endif + + #ifdef VECT_SIZE4 + a.s0 = crc32tab[k.s0]; + a.s1 = crc32tab[k.s1]; + a.s2 = crc32tab[k.s2]; + a.s3 = crc32tab[k.s3]; + #endif + + a ^= s; + + return a; +} + +static u32x crc32 (const u32x w[16], const u32 pw_len, const u32 iv) +{ + u32x a = iv ^ ~0; + + if (pw_len >= 1) a = round_crc32 (a, w[0] >> 0); + if (pw_len >= 2) a = round_crc32 (a, w[0] >> 8); + if (pw_len >= 3) a = round_crc32 (a, w[0] >> 16); + if (pw_len >= 4) a = round_crc32 (a, w[0] >> 24); + + for (u32 i = 4, j = 1; i < pw_len; i += 4, j += 1) + { + if (pw_len >= (i + 1)) a = round_crc32 (a, w[j] >> 0); + if (pw_len >= (i + 2)) a = round_crc32 (a, w[j] >> 8); + if (pw_len >= (i + 3)) a = round_crc32 (a, w[j] >> 16); + if (pw_len >= (i + 4)) a = round_crc32 (a, w[j] >> 24); + } + + return ~a; +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m11500_m04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * digest + */ + + const u32 iv = salt_bufs[salt_pos].salt_buf[0]; + + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + u32x pw_buf1[4]; + + pw_buf1[0] = pws[gid].i[ 4]; + pw_buf1[1] = pws[gid].i[ 5]; + pw_buf1[2] = pws[gid].i[ 6]; + pw_buf1[3] = pws[gid].i[ 7]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + + w0[0] = pw_buf0[0]; + w0[1] = pw_buf0[1]; + w0[2] = pw_buf0[2]; + w0[3] = pw_buf0[3]; + + u32x w1[4]; + + w1[0] = pw_buf1[0]; + w1[1] = pw_buf1[1]; + w1[2] = pw_buf1[2]; + w1[3] = pw_buf1[3]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 out_len = apply_rules (rules_buf[il_pos].cmds, w0, w1, pw_len); + + u32x w_t[16]; + + w_t[ 0] = w0[0]; + w_t[ 1] = w0[1]; + w_t[ 2] = w0[2]; + w_t[ 3] = w0[3]; + w_t[ 4] = w1[0]; + w_t[ 5] = w1[1]; + w_t[ 6] = w1[2]; + w_t[ 7] = w1[3]; + w_t[ 8] = 0; + w_t[ 9] = 0; + w_t[10] = 0; + w_t[11] = 0; + w_t[12] = 0; + w_t[13] = 0; + w_t[14] = 0; + w_t[15] = 0; + + u32x a = crc32 (w_t, out_len, iv); + u32x b = 0; + + const u32x r0 = a; + const u32x r1 = b; + const u32x r2 = 0; + const u32x r3 = 0; + + #include VECT_COMPARE_M + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m11500_m08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m11500_m16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m11500_s04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + u32x pw_buf1[4]; + + pw_buf1[0] = pws[gid].i[ 4]; + pw_buf1[1] = pws[gid].i[ 5]; + pw_buf1[2] = pws[gid].i[ 6]; + pw_buf1[3] = pws[gid].i[ 7]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * digest + */ + + const u32 iv = salt_bufs[salt_pos].salt_buf[0]; + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + + w0[0] = pw_buf0[0]; + w0[1] = pw_buf0[1]; + w0[2] = pw_buf0[2]; + w0[3] = pw_buf0[3]; + + u32x w1[4]; + + w1[0] = pw_buf1[0]; + w1[1] = pw_buf1[1]; + w1[2] = pw_buf1[2]; + w1[3] = pw_buf1[3]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 out_len = apply_rules (rules_buf[il_pos].cmds, w0, w1, pw_len); + + u32x w_t[16]; + + w_t[ 0] = w0[0]; + w_t[ 1] = w0[1]; + w_t[ 2] = w0[2]; + w_t[ 3] = w0[3]; + w_t[ 4] = w1[0]; + w_t[ 5] = w1[1]; + w_t[ 6] = w1[2]; + w_t[ 7] = w1[3]; + w_t[ 8] = 0; + w_t[ 9] = 0; + w_t[10] = 0; + w_t[11] = 0; + w_t[12] = 0; + w_t[13] = 0; + w_t[14] = 0; + w_t[15] = 0; + + u32x a = crc32 (w_t, out_len, iv); + u32x b = 0; + + const u32x r0 = a; + const u32x r1 = b; + const u32x r2 = 0; + const u32x r3 = 0; + + #include VECT_COMPARE_S + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m11500_s08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m11500_s16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/amd/m11500_a1.cl b/amd/m11500_a1.cl new file mode 100644 index 0000000000..8f00e6c4c0 --- /dev/null +++ b/amd/m11500_a1.cl @@ -0,0 +1,446 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _CRC32_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW4 +#define VECT_SIZE4 +#endif + +#ifdef VLIW5 +#define VECT_SIZE4 +#endif + +#define DGST_R0 0 +#define DGST_R1 1 +#define DGST_R2 2 +#define DGST_R3 3 + +#include "include/kernel_functions.c" +#include "types_amd.c" +#include "common_amd.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +__constant u32 crc32tab[0x100] = +{ + 0x00000000, 0x77073096, 0xee0e612c, 0x990951ba, + 0x076dc419, 0x706af48f, 0xe963a535, 0x9e6495a3, + 0x0edb8832, 0x79dcb8a4, 0xe0d5e91e, 0x97d2d988, + 0x09b64c2b, 0x7eb17cbd, 0xe7b82d07, 0x90bf1d91, + 0x1db71064, 0x6ab020f2, 0xf3b97148, 0x84be41de, + 0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7, + 0x136c9856, 0x646ba8c0, 0xfd62f97a, 0x8a65c9ec, + 0x14015c4f, 0x63066cd9, 0xfa0f3d63, 0x8d080df5, + 0x3b6e20c8, 0x4c69105e, 0xd56041e4, 0xa2677172, + 0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b, + 0x35b5a8fa, 0x42b2986c, 0xdbbbc9d6, 0xacbcf940, + 0x32d86ce3, 0x45df5c75, 0xdcd60dcf, 0xabd13d59, + 0x26d930ac, 0x51de003a, 0xc8d75180, 0xbfd06116, + 0x21b4f4b5, 0x56b3c423, 0xcfba9599, 0xb8bda50f, + 0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924, + 0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d, + 0x76dc4190, 0x01db7106, 0x98d220bc, 0xefd5102a, + 0x71b18589, 0x06b6b51f, 0x9fbfe4a5, 0xe8b8d433, + 0x7807c9a2, 0x0f00f934, 0x9609a88e, 0xe10e9818, + 0x7f6a0dbb, 0x086d3d2d, 0x91646c97, 0xe6635c01, + 0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e, + 0x6c0695ed, 0x1b01a57b, 0x8208f4c1, 0xf50fc457, + 0x65b0d9c6, 0x12b7e950, 0x8bbeb8ea, 0xfcb9887c, + 0x62dd1ddf, 0x15da2d49, 0x8cd37cf3, 0xfbd44c65, + 0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2, + 0x4adfa541, 0x3dd895d7, 0xa4d1c46d, 0xd3d6f4fb, + 0x4369e96a, 0x346ed9fc, 0xad678846, 0xda60b8d0, + 0x44042d73, 0x33031de5, 0xaa0a4c5f, 0xdd0d7cc9, + 0x5005713c, 0x270241aa, 0xbe0b1010, 0xc90c2086, + 0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f, + 0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4, + 0x59b33d17, 0x2eb40d81, 0xb7bd5c3b, 0xc0ba6cad, + 0xedb88320, 0x9abfb3b6, 0x03b6e20c, 0x74b1d29a, + 0xead54739, 0x9dd277af, 0x04db2615, 0x73dc1683, + 0xe3630b12, 0x94643b84, 0x0d6d6a3e, 0x7a6a5aa8, + 0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1, + 0xf00f9344, 0x8708a3d2, 0x1e01f268, 0x6906c2fe, + 0xf762575d, 0x806567cb, 0x196c3671, 0x6e6b06e7, + 0xfed41b76, 0x89d32be0, 0x10da7a5a, 0x67dd4acc, + 0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5, + 0xd6d6a3e8, 0xa1d1937e, 0x38d8c2c4, 0x4fdff252, + 0xd1bb67f1, 0xa6bc5767, 0x3fb506dd, 0x48b2364b, + 0xd80d2bda, 0xaf0a1b4c, 0x36034af6, 0x41047a60, + 0xdf60efc3, 0xa867df55, 0x316e8eef, 0x4669be79, + 0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236, + 0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f, + 0xc5ba3bbe, 0xb2bd0b28, 0x2bb45a92, 0x5cb36a04, + 0xc2d7ffa7, 0xb5d0cf31, 0x2cd99e8b, 0x5bdeae1d, + 0x9b64c2b0, 0xec63f226, 0x756aa39c, 0x026d930a, + 0x9c0906a9, 0xeb0e363f, 0x72076785, 0x05005713, + 0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38, + 0x92d28e9b, 0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21, + 0x86d3d2d4, 0xf1d4e242, 0x68ddb3f8, 0x1fda836e, + 0x81be16cd, 0xf6b9265b, 0x6fb077e1, 0x18b74777, + 0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c, + 0x8f659eff, 0xf862ae69, 0x616bffd3, 0x166ccf45, + 0xa00ae278, 0xd70dd2ee, 0x4e048354, 0x3903b3c2, + 0xa7672661, 0xd06016f7, 0x4969474d, 0x3e6e77db, + 0xaed16a4a, 0xd9d65adc, 0x40df0b66, 0x37d83bf0, + 0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9, + 0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6, + 0xbad03605, 0xcdd70693, 0x54de5729, 0x23d967bf, + 0xb3667a2e, 0xc4614ab8, 0x5d681b02, 0x2a6f2b94, + 0xb40bbe37, 0xc30c8ea1, 0x5a05df1b, 0x2d02ef8d +}; + +static u32x round_crc32 (u32x a, const u32x v) +{ + const u32x k = (a ^ v) & 0xff; + + const u32x s = a >> 8; + + #ifdef VECT_SIZE1 + a = crc32tab[k]; + #endif + + #ifdef VECT_SIZE2 + a.s0 = crc32tab[k.s0]; + a.s1 = crc32tab[k.s1]; + #endif + + #ifdef VECT_SIZE4 + a.s0 = crc32tab[k.s0]; + a.s1 = crc32tab[k.s1]; + a.s2 = crc32tab[k.s2]; + a.s3 = crc32tab[k.s3]; + #endif + + a ^= s; + + return a; +} + +static u32x crc32 (const u32x w[16], const u32 pw_len, const u32 iv) +{ + u32x a = iv ^ ~0; + + if (pw_len >= 1) a = round_crc32 (a, w[0] >> 0); + if (pw_len >= 2) a = round_crc32 (a, w[0] >> 8); + if (pw_len >= 3) a = round_crc32 (a, w[0] >> 16); + if (pw_len >= 4) a = round_crc32 (a, w[0] >> 24); + + for (u32 i = 4, j = 1; i < pw_len; i += 4, j += 1) + { + if (pw_len >= (i + 1)) a = round_crc32 (a, w[j] >> 0); + if (pw_len >= (i + 2)) a = round_crc32 (a, w[j] >> 8); + if (pw_len >= (i + 3)) a = round_crc32 (a, w[j] >> 16); + if (pw_len >= (i + 4)) a = round_crc32 (a, w[j] >> 24); + } + + return ~a; +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m11500_m04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * digest + */ + + const u32 iv = salt_bufs[salt_pos].salt_buf[0]; + + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, combs_buf[0].pw_len); + } + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = combs_buf[il_pos].pw_len; + + const u32 pw_len = pw_l_len + pw_r_len; + + u32 wordr0[4]; + + wordr0[0] = combs_buf[il_pos].i[0]; + wordr0[1] = combs_buf[il_pos].i[1]; + wordr0[2] = combs_buf[il_pos].i[2]; + wordr0[3] = combs_buf[il_pos].i[3]; + + u32 wordr1[4]; + + wordr1[0] = combs_buf[il_pos].i[4]; + wordr1[1] = combs_buf[il_pos].i[5]; + wordr1[2] = combs_buf[il_pos].i[6]; + wordr1[3] = combs_buf[il_pos].i[7]; + + u32 wordr2[4]; + + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + + u32 wordr3[4]; + + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + u32x w_t[16]; + + w_t[ 0] = wordl0[0] | wordr0[0]; + w_t[ 1] = wordl0[1] | wordr0[1]; + w_t[ 2] = wordl0[2] | wordr0[2]; + w_t[ 3] = wordl0[3] | wordr0[3]; + w_t[ 4] = wordl1[0] | wordr1[0]; + w_t[ 5] = wordl1[1] | wordr1[1]; + w_t[ 6] = wordl1[2] | wordr1[2]; + w_t[ 7] = wordl1[3] | wordr1[3]; + w_t[ 8] = wordl2[0] | wordr2[0]; + w_t[ 9] = wordl2[1] | wordr2[1]; + w_t[10] = wordl2[2] | wordr2[2]; + w_t[11] = wordl2[3] | wordr2[3]; + w_t[12] = wordl3[0] | wordr3[0]; + w_t[13] = wordl3[1] | wordr3[1]; + w_t[14] = wordl3[2] | wordr3[2]; + w_t[15] = 0; + + u32x a = crc32 (w_t, pw_len, iv); + u32x b = 0; + + const u32x r0 = a; + const u32x r1 = b; + const u32x r2 = 0; + const u32x r3 = 0; + + #include VECT_COMPARE_M + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m11500_m08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m11500_m16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m11500_s04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, combs_buf[0].pw_len); + } + + /** + * digest + */ + + const u32 iv = salt_bufs[salt_pos].salt_buf[0]; + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = combs_buf[il_pos].pw_len; + + const u32 pw_len = pw_l_len + pw_r_len; + + u32 wordr0[4]; + + wordr0[0] = combs_buf[il_pos].i[0]; + wordr0[1] = combs_buf[il_pos].i[1]; + wordr0[2] = combs_buf[il_pos].i[2]; + wordr0[3] = combs_buf[il_pos].i[3]; + + u32 wordr1[4]; + + wordr1[0] = combs_buf[il_pos].i[4]; + wordr1[1] = combs_buf[il_pos].i[5]; + wordr1[2] = combs_buf[il_pos].i[6]; + wordr1[3] = combs_buf[il_pos].i[7]; + + u32 wordr2[4]; + + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + + u32 wordr3[4]; + + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + u32x w_t[16]; + + w_t[ 0] = wordl0[0] | wordr0[0]; + w_t[ 1] = wordl0[1] | wordr0[1]; + w_t[ 2] = wordl0[2] | wordr0[2]; + w_t[ 3] = wordl0[3] | wordr0[3]; + w_t[ 4] = wordl1[0] | wordr1[0]; + w_t[ 5] = wordl1[1] | wordr1[1]; + w_t[ 6] = wordl1[2] | wordr1[2]; + w_t[ 7] = wordl1[3] | wordr1[3]; + w_t[ 8] = wordl2[0] | wordr2[0]; + w_t[ 9] = wordl2[1] | wordr2[1]; + w_t[10] = wordl2[2] | wordr2[2]; + w_t[11] = wordl2[3] | wordr2[3]; + w_t[12] = wordl3[0] | wordr3[0]; + w_t[13] = wordl3[1] | wordr3[1]; + w_t[14] = wordl3[2] | wordr3[2]; + w_t[15] = 0; + + u32x a = crc32 (w_t, pw_len, iv); + u32x b = 0; + + const u32x r0 = a; + const u32x r1 = b; + const u32x r2 = 0; + const u32x r3 = 0; + + #include VECT_COMPARE_S + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m11500_s08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m11500_s16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/amd/m11500_a3.cl b/amd/m11500_a3.cl new file mode 100644 index 0000000000..9575ce035b --- /dev/null +++ b/amd/m11500_a3.cl @@ -0,0 +1,517 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _CRC32_ +#define _SCALAR_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW4 +#define VECT_SIZE4 +#endif + +#ifdef VLIW5 +#define VECT_SIZE4 +#endif + +#define DGST_R0 0 +#define DGST_R1 1 +#define DGST_R2 2 +#define DGST_R3 3 + +#include "include/kernel_functions.c" +#include "types_amd.c" +#include "common_amd.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4_warp.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4_warp.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4_warp.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4_warp.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4_warp.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4_warp.c" +#endif + +__constant u32 crc32tab[0x100] = +{ + 0x00000000, 0x77073096, 0xee0e612c, 0x990951ba, + 0x076dc419, 0x706af48f, 0xe963a535, 0x9e6495a3, + 0x0edb8832, 0x79dcb8a4, 0xe0d5e91e, 0x97d2d988, + 0x09b64c2b, 0x7eb17cbd, 0xe7b82d07, 0x90bf1d91, + 0x1db71064, 0x6ab020f2, 0xf3b97148, 0x84be41de, + 0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7, + 0x136c9856, 0x646ba8c0, 0xfd62f97a, 0x8a65c9ec, + 0x14015c4f, 0x63066cd9, 0xfa0f3d63, 0x8d080df5, + 0x3b6e20c8, 0x4c69105e, 0xd56041e4, 0xa2677172, + 0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b, + 0x35b5a8fa, 0x42b2986c, 0xdbbbc9d6, 0xacbcf940, + 0x32d86ce3, 0x45df5c75, 0xdcd60dcf, 0xabd13d59, + 0x26d930ac, 0x51de003a, 0xc8d75180, 0xbfd06116, + 0x21b4f4b5, 0x56b3c423, 0xcfba9599, 0xb8bda50f, + 0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924, + 0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d, + 0x76dc4190, 0x01db7106, 0x98d220bc, 0xefd5102a, + 0x71b18589, 0x06b6b51f, 0x9fbfe4a5, 0xe8b8d433, + 0x7807c9a2, 0x0f00f934, 0x9609a88e, 0xe10e9818, + 0x7f6a0dbb, 0x086d3d2d, 0x91646c97, 0xe6635c01, + 0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e, + 0x6c0695ed, 0x1b01a57b, 0x8208f4c1, 0xf50fc457, + 0x65b0d9c6, 0x12b7e950, 0x8bbeb8ea, 0xfcb9887c, + 0x62dd1ddf, 0x15da2d49, 0x8cd37cf3, 0xfbd44c65, + 0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2, + 0x4adfa541, 0x3dd895d7, 0xa4d1c46d, 0xd3d6f4fb, + 0x4369e96a, 0x346ed9fc, 0xad678846, 0xda60b8d0, + 0x44042d73, 0x33031de5, 0xaa0a4c5f, 0xdd0d7cc9, + 0x5005713c, 0x270241aa, 0xbe0b1010, 0xc90c2086, + 0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f, + 0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4, + 0x59b33d17, 0x2eb40d81, 0xb7bd5c3b, 0xc0ba6cad, + 0xedb88320, 0x9abfb3b6, 0x03b6e20c, 0x74b1d29a, + 0xead54739, 0x9dd277af, 0x04db2615, 0x73dc1683, + 0xe3630b12, 0x94643b84, 0x0d6d6a3e, 0x7a6a5aa8, + 0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1, + 0xf00f9344, 0x8708a3d2, 0x1e01f268, 0x6906c2fe, + 0xf762575d, 0x806567cb, 0x196c3671, 0x6e6b06e7, + 0xfed41b76, 0x89d32be0, 0x10da7a5a, 0x67dd4acc, + 0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5, + 0xd6d6a3e8, 0xa1d1937e, 0x38d8c2c4, 0x4fdff252, + 0xd1bb67f1, 0xa6bc5767, 0x3fb506dd, 0x48b2364b, + 0xd80d2bda, 0xaf0a1b4c, 0x36034af6, 0x41047a60, + 0xdf60efc3, 0xa867df55, 0x316e8eef, 0x4669be79, + 0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236, + 0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f, + 0xc5ba3bbe, 0xb2bd0b28, 0x2bb45a92, 0x5cb36a04, + 0xc2d7ffa7, 0xb5d0cf31, 0x2cd99e8b, 0x5bdeae1d, + 0x9b64c2b0, 0xec63f226, 0x756aa39c, 0x026d930a, + 0x9c0906a9, 0xeb0e363f, 0x72076785, 0x05005713, + 0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38, + 0x92d28e9b, 0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21, + 0x86d3d2d4, 0xf1d4e242, 0x68ddb3f8, 0x1fda836e, + 0x81be16cd, 0xf6b9265b, 0x6fb077e1, 0x18b74777, + 0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c, + 0x8f659eff, 0xf862ae69, 0x616bffd3, 0x166ccf45, + 0xa00ae278, 0xd70dd2ee, 0x4e048354, 0x3903b3c2, + 0xa7672661, 0xd06016f7, 0x4969474d, 0x3e6e77db, + 0xaed16a4a, 0xd9d65adc, 0x40df0b66, 0x37d83bf0, + 0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9, + 0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6, + 0xbad03605, 0xcdd70693, 0x54de5729, 0x23d967bf, + 0xb3667a2e, 0xc4614ab8, 0x5d681b02, 0x2a6f2b94, + 0xb40bbe37, 0xc30c8ea1, 0x5a05df1b, 0x2d02ef8d +}; + +static u32x round_crc32 (u32x a, const u32x v) +{ + const u32x k = (a ^ v) & 0xff; + + const u32x s = a >> 8; + + #ifdef VECT_SIZE1 + a = crc32tab[k]; + #endif + + #ifdef VECT_SIZE2 + a.s0 = crc32tab[k.s0]; + a.s1 = crc32tab[k.s1]; + #endif + + #ifdef VECT_SIZE4 + a.s0 = crc32tab[k.s0]; + a.s1 = crc32tab[k.s1]; + a.s2 = crc32tab[k.s2]; + a.s3 = crc32tab[k.s3]; + #endif + + a ^= s; + + return a; +} + +static u32x crc32 (const u32x w[16], const u32 pw_len, const u32 iv) +{ + u32x a = iv ^ ~0; + + if (pw_len >= 1) a = round_crc32 (a, w[0] >> 0); + if (pw_len >= 2) a = round_crc32 (a, w[0] >> 8); + if (pw_len >= 3) a = round_crc32 (a, w[0] >> 16); + if (pw_len >= 4) a = round_crc32 (a, w[0] >> 24); + + for (u32 i = 4, j = 1; i < pw_len; i += 4, j += 1) + { + if (pw_len >= (i + 1)) a = round_crc32 (a, w[j] >> 0); + if (pw_len >= (i + 2)) a = round_crc32 (a, w[j] >> 8); + if (pw_len >= (i + 3)) a = round_crc32 (a, w[j] >> 16); + if (pw_len >= (i + 4)) a = round_crc32 (a, w[j] >> 24); + } + + return ~a; +} + +static void m11500m (u32 w[16], const u32 pw_len, __global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global u32x * words_buf_r, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset) +{ + /** + * modifier + */ + + const u32 gid = get_global_id (0); + const u32 lid = get_local_id (0); + + /** + * digest + */ + + const u32 iv = salt_bufs[salt_pos].salt_buf[0]; + + /** + * loop + */ + + const u32 bf_loops = ceil ((float) bfs_cnt / VECT_DIV); + + u32x w0l = w[0]; + + for (u32 il_pos = 0; il_pos < bf_loops; il_pos++) + { + const u32x w0r = words_buf_r[il_pos]; + + const u32x w0 = w0l | w0r; + + u32x w_t[16]; + + w_t[ 0] = w0; + w_t[ 1] = w[ 1]; + w_t[ 2] = w[ 2]; + w_t[ 3] = w[ 3]; + w_t[ 4] = w[ 4]; + w_t[ 5] = w[ 5]; + w_t[ 6] = w[ 6]; + w_t[ 7] = w[ 7]; + w_t[ 8] = w[ 8]; + w_t[ 9] = w[ 9]; + w_t[10] = w[10]; + w_t[11] = w[11]; + w_t[12] = w[12]; + w_t[13] = w[13]; + w_t[14] = w[14]; + w_t[15] = w[15]; + + u32x a = crc32 (w_t, pw_len, iv); + u32x b = 0; + + const u32x r0 = a; + const u32x r1 = b; + const u32x r2 = 0; + const u32x r3 = 0; + + #include VECT_COMPARE_M + } +} + +static void m11500s (u32 w[16], const u32 pw_len, __global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global u32x * words_buf_r, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset) +{ + /** + * modifier + */ + + const u32 gid = get_global_id (0); + const u32 lid = get_local_id (0); + + /** + * digest + */ + + const u32 iv = salt_bufs[salt_pos].salt_buf[0]; + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * loop + */ + + const u32 bf_loops = ceil ((float) bfs_cnt / VECT_DIV); + + u32x w0l = w[0]; + + for (u32 il_pos = 0; il_pos < bf_loops; il_pos++) + { + const u32x w0r = words_buf_r[il_pos]; + + const u32x w0 = w0l | w0r; + + u32x w_t[16]; + + w_t[ 0] = w0; + w_t[ 1] = w[ 1]; + w_t[ 2] = w[ 2]; + w_t[ 3] = w[ 3]; + w_t[ 4] = w[ 4]; + w_t[ 5] = w[ 5]; + w_t[ 6] = w[ 6]; + w_t[ 7] = w[ 7]; + w_t[ 8] = w[ 8]; + w_t[ 9] = w[ 9]; + w_t[10] = w[10]; + w_t[11] = w[11]; + w_t[12] = w[12]; + w_t[13] = w[13]; + w_t[14] = w[14]; + w_t[15] = w[15]; + + u32x a = crc32 (w_t, pw_len, iv); + u32x b = 0; + + const u32x r0 = a; + const u32x r1 = b; + const u32x r2 = 0; + const u32x r3 = 0; + + #include VECT_COMPARE_S + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m11500_m04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global u32x * words_buf_r, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32 w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = 0; + w[ 5] = 0; + w[ 6] = 0; + w[ 7] = 0; + w[ 8] = 0; + w[ 9] = 0; + w[10] = 0; + w[11] = 0; + w[12] = 0; + w[13] = 0; + w[14] = 0; + w[15] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m11500m (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m11500_m08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global u32x * words_buf_r, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32 w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = pws[gid].i[ 4]; + w[ 5] = pws[gid].i[ 5]; + w[ 6] = pws[gid].i[ 6]; + w[ 7] = pws[gid].i[ 7]; + w[ 8] = 0; + w[ 9] = 0; + w[10] = 0; + w[11] = 0; + w[12] = 0; + w[13] = 0; + w[14] = 0; + w[15] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m11500m (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m11500_m16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global u32x * words_buf_r, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32 w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = pws[gid].i[ 4]; + w[ 5] = pws[gid].i[ 5]; + w[ 6] = pws[gid].i[ 6]; + w[ 7] = pws[gid].i[ 7]; + w[ 8] = pws[gid].i[ 8]; + w[ 9] = pws[gid].i[ 9]; + w[10] = pws[gid].i[10]; + w[11] = pws[gid].i[11]; + w[12] = pws[gid].i[12]; + w[13] = pws[gid].i[13]; + w[14] = pws[gid].i[14]; + w[15] = pws[gid].i[15]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m11500m (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m11500_s04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global u32x * words_buf_r, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32 w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = 0; + w[ 5] = 0; + w[ 6] = 0; + w[ 7] = 0; + w[ 8] = 0; + w[ 9] = 0; + w[10] = 0; + w[11] = 0; + w[12] = 0; + w[13] = 0; + w[14] = 0; + w[15] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m11500s (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m11500_s08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global u32x * words_buf_r, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32 w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = pws[gid].i[ 4]; + w[ 5] = pws[gid].i[ 5]; + w[ 6] = pws[gid].i[ 6]; + w[ 7] = pws[gid].i[ 7]; + w[ 8] = 0; + w[ 9] = 0; + w[10] = 0; + w[11] = 0; + w[12] = 0; + w[13] = 0; + w[14] = 0; + w[15] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m11500s (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m11500_s16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global u32x * words_buf_r, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32 w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = pws[gid].i[ 4]; + w[ 5] = pws[gid].i[ 5]; + w[ 6] = pws[gid].i[ 6]; + w[ 7] = pws[gid].i[ 7]; + w[ 8] = pws[gid].i[ 8]; + w[ 9] = pws[gid].i[ 9]; + w[10] = pws[gid].i[10]; + w[11] = pws[gid].i[11]; + w[12] = pws[gid].i[12]; + w[13] = pws[gid].i[13]; + w[14] = pws[gid].i[14]; + w[15] = pws[gid].i[15]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m11500s (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} diff --git a/amd/m11600.cl b/amd/m11600.cl new file mode 100644 index 0000000000..21dd5e5365 --- /dev/null +++ b/amd/m11600.cl @@ -0,0 +1,1974 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _SEVEN_ZIP_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW4 +#define VECT_SIZE1 +#endif + +#ifdef VLIW5 +#define VECT_SIZE1 +#endif + +#define DGST_R0 0 +#define DGST_R1 1 +#define DGST_R2 2 +#define DGST_R3 3 + +#include "include/kernel_functions.c" +#include "types_amd.c" +#include "common_amd.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +__constant u32 te0[256] = +{ + 0xc66363a5, 0xf87c7c84, 0xee777799, 0xf67b7b8d, + 0xfff2f20d, 0xd66b6bbd, 0xde6f6fb1, 0x91c5c554, + 0x60303050, 0x02010103, 0xce6767a9, 0x562b2b7d, + 0xe7fefe19, 0xb5d7d762, 0x4dababe6, 0xec76769a, + 0x8fcaca45, 0x1f82829d, 0x89c9c940, 0xfa7d7d87, + 0xeffafa15, 0xb25959eb, 0x8e4747c9, 0xfbf0f00b, + 0x41adadec, 0xb3d4d467, 0x5fa2a2fd, 0x45afafea, + 0x239c9cbf, 0x53a4a4f7, 0xe4727296, 0x9bc0c05b, + 0x75b7b7c2, 0xe1fdfd1c, 0x3d9393ae, 0x4c26266a, + 0x6c36365a, 0x7e3f3f41, 0xf5f7f702, 0x83cccc4f, + 0x6834345c, 0x51a5a5f4, 0xd1e5e534, 0xf9f1f108, + 0xe2717193, 0xabd8d873, 0x62313153, 0x2a15153f, + 0x0804040c, 0x95c7c752, 0x46232365, 0x9dc3c35e, + 0x30181828, 0x379696a1, 0x0a05050f, 0x2f9a9ab5, + 0x0e070709, 0x24121236, 0x1b80809b, 0xdfe2e23d, + 0xcdebeb26, 0x4e272769, 0x7fb2b2cd, 0xea75759f, + 0x1209091b, 0x1d83839e, 0x582c2c74, 0x341a1a2e, + 0x361b1b2d, 0xdc6e6eb2, 0xb45a5aee, 0x5ba0a0fb, + 0xa45252f6, 0x763b3b4d, 0xb7d6d661, 0x7db3b3ce, + 0x5229297b, 0xdde3e33e, 0x5e2f2f71, 0x13848497, + 0xa65353f5, 0xb9d1d168, 0x00000000, 0xc1eded2c, + 0x40202060, 0xe3fcfc1f, 0x79b1b1c8, 0xb65b5bed, + 0xd46a6abe, 0x8dcbcb46, 0x67bebed9, 0x7239394b, + 0x944a4ade, 0x984c4cd4, 0xb05858e8, 0x85cfcf4a, + 0xbbd0d06b, 0xc5efef2a, 0x4faaaae5, 0xedfbfb16, + 0x864343c5, 0x9a4d4dd7, 0x66333355, 0x11858594, + 0x8a4545cf, 0xe9f9f910, 0x04020206, 0xfe7f7f81, + 0xa05050f0, 0x783c3c44, 0x259f9fba, 0x4ba8a8e3, + 0xa25151f3, 0x5da3a3fe, 0x804040c0, 0x058f8f8a, + 0x3f9292ad, 0x219d9dbc, 0x70383848, 0xf1f5f504, + 0x63bcbcdf, 0x77b6b6c1, 0xafdada75, 0x42212163, + 0x20101030, 0xe5ffff1a, 0xfdf3f30e, 0xbfd2d26d, + 0x81cdcd4c, 0x180c0c14, 0x26131335, 0xc3ecec2f, + 0xbe5f5fe1, 0x359797a2, 0x884444cc, 0x2e171739, + 0x93c4c457, 0x55a7a7f2, 0xfc7e7e82, 0x7a3d3d47, + 0xc86464ac, 0xba5d5de7, 0x3219192b, 0xe6737395, + 0xc06060a0, 0x19818198, 0x9e4f4fd1, 0xa3dcdc7f, + 0x44222266, 0x542a2a7e, 0x3b9090ab, 0x0b888883, + 0x8c4646ca, 0xc7eeee29, 0x6bb8b8d3, 0x2814143c, + 0xa7dede79, 0xbc5e5ee2, 0x160b0b1d, 0xaddbdb76, + 0xdbe0e03b, 0x64323256, 0x743a3a4e, 0x140a0a1e, + 0x924949db, 0x0c06060a, 0x4824246c, 0xb85c5ce4, + 0x9fc2c25d, 0xbdd3d36e, 0x43acacef, 0xc46262a6, + 0x399191a8, 0x319595a4, 0xd3e4e437, 0xf279798b, + 0xd5e7e732, 0x8bc8c843, 0x6e373759, 0xda6d6db7, + 0x018d8d8c, 0xb1d5d564, 0x9c4e4ed2, 0x49a9a9e0, + 0xd86c6cb4, 0xac5656fa, 0xf3f4f407, 0xcfeaea25, + 0xca6565af, 0xf47a7a8e, 0x47aeaee9, 0x10080818, + 0x6fbabad5, 0xf0787888, 0x4a25256f, 0x5c2e2e72, + 0x381c1c24, 0x57a6a6f1, 0x73b4b4c7, 0x97c6c651, + 0xcbe8e823, 0xa1dddd7c, 0xe874749c, 0x3e1f1f21, + 0x964b4bdd, 0x61bdbddc, 0x0d8b8b86, 0x0f8a8a85, + 0xe0707090, 0x7c3e3e42, 0x71b5b5c4, 0xcc6666aa, + 0x904848d8, 0x06030305, 0xf7f6f601, 0x1c0e0e12, + 0xc26161a3, 0x6a35355f, 0xae5757f9, 0x69b9b9d0, + 0x17868691, 0x99c1c158, 0x3a1d1d27, 0x279e9eb9, + 0xd9e1e138, 0xebf8f813, 0x2b9898b3, 0x22111133, + 0xd26969bb, 0xa9d9d970, 0x078e8e89, 0x339494a7, + 0x2d9b9bb6, 0x3c1e1e22, 0x15878792, 0xc9e9e920, + 0x87cece49, 0xaa5555ff, 0x50282878, 0xa5dfdf7a, + 0x038c8c8f, 0x59a1a1f8, 0x09898980, 0x1a0d0d17, + 0x65bfbfda, 0xd7e6e631, 0x844242c6, 0xd06868b8, + 0x824141c3, 0x299999b0, 0x5a2d2d77, 0x1e0f0f11, + 0x7bb0b0cb, 0xa85454fc, 0x6dbbbbd6, 0x2c16163a, +}; + +__constant u32 te1[256] = +{ + 0xa5c66363, 0x84f87c7c, 0x99ee7777, 0x8df67b7b, + 0x0dfff2f2, 0xbdd66b6b, 0xb1de6f6f, 0x5491c5c5, + 0x50603030, 0x03020101, 0xa9ce6767, 0x7d562b2b, + 0x19e7fefe, 0x62b5d7d7, 0xe64dabab, 0x9aec7676, + 0x458fcaca, 0x9d1f8282, 0x4089c9c9, 0x87fa7d7d, + 0x15effafa, 0xebb25959, 0xc98e4747, 0x0bfbf0f0, + 0xec41adad, 0x67b3d4d4, 0xfd5fa2a2, 0xea45afaf, + 0xbf239c9c, 0xf753a4a4, 0x96e47272, 0x5b9bc0c0, + 0xc275b7b7, 0x1ce1fdfd, 0xae3d9393, 0x6a4c2626, + 0x5a6c3636, 0x417e3f3f, 0x02f5f7f7, 0x4f83cccc, + 0x5c683434, 0xf451a5a5, 0x34d1e5e5, 0x08f9f1f1, + 0x93e27171, 0x73abd8d8, 0x53623131, 0x3f2a1515, + 0x0c080404, 0x5295c7c7, 0x65462323, 0x5e9dc3c3, + 0x28301818, 0xa1379696, 0x0f0a0505, 0xb52f9a9a, + 0x090e0707, 0x36241212, 0x9b1b8080, 0x3ddfe2e2, + 0x26cdebeb, 0x694e2727, 0xcd7fb2b2, 0x9fea7575, + 0x1b120909, 0x9e1d8383, 0x74582c2c, 0x2e341a1a, + 0x2d361b1b, 0xb2dc6e6e, 0xeeb45a5a, 0xfb5ba0a0, + 0xf6a45252, 0x4d763b3b, 0x61b7d6d6, 0xce7db3b3, + 0x7b522929, 0x3edde3e3, 0x715e2f2f, 0x97138484, + 0xf5a65353, 0x68b9d1d1, 0x00000000, 0x2cc1eded, + 0x60402020, 0x1fe3fcfc, 0xc879b1b1, 0xedb65b5b, + 0xbed46a6a, 0x468dcbcb, 0xd967bebe, 0x4b723939, + 0xde944a4a, 0xd4984c4c, 0xe8b05858, 0x4a85cfcf, + 0x6bbbd0d0, 0x2ac5efef, 0xe54faaaa, 0x16edfbfb, + 0xc5864343, 0xd79a4d4d, 0x55663333, 0x94118585, + 0xcf8a4545, 0x10e9f9f9, 0x06040202, 0x81fe7f7f, + 0xf0a05050, 0x44783c3c, 0xba259f9f, 0xe34ba8a8, + 0xf3a25151, 0xfe5da3a3, 0xc0804040, 0x8a058f8f, + 0xad3f9292, 0xbc219d9d, 0x48703838, 0x04f1f5f5, + 0xdf63bcbc, 0xc177b6b6, 0x75afdada, 0x63422121, + 0x30201010, 0x1ae5ffff, 0x0efdf3f3, 0x6dbfd2d2, + 0x4c81cdcd, 0x14180c0c, 0x35261313, 0x2fc3ecec, + 0xe1be5f5f, 0xa2359797, 0xcc884444, 0x392e1717, + 0x5793c4c4, 0xf255a7a7, 0x82fc7e7e, 0x477a3d3d, + 0xacc86464, 0xe7ba5d5d, 0x2b321919, 0x95e67373, + 0xa0c06060, 0x98198181, 0xd19e4f4f, 0x7fa3dcdc, + 0x66442222, 0x7e542a2a, 0xab3b9090, 0x830b8888, + 0xca8c4646, 0x29c7eeee, 0xd36bb8b8, 0x3c281414, + 0x79a7dede, 0xe2bc5e5e, 0x1d160b0b, 0x76addbdb, + 0x3bdbe0e0, 0x56643232, 0x4e743a3a, 0x1e140a0a, + 0xdb924949, 0x0a0c0606, 0x6c482424, 0xe4b85c5c, + 0x5d9fc2c2, 0x6ebdd3d3, 0xef43acac, 0xa6c46262, + 0xa8399191, 0xa4319595, 0x37d3e4e4, 0x8bf27979, + 0x32d5e7e7, 0x438bc8c8, 0x596e3737, 0xb7da6d6d, + 0x8c018d8d, 0x64b1d5d5, 0xd29c4e4e, 0xe049a9a9, + 0xb4d86c6c, 0xfaac5656, 0x07f3f4f4, 0x25cfeaea, + 0xafca6565, 0x8ef47a7a, 0xe947aeae, 0x18100808, + 0xd56fbaba, 0x88f07878, 0x6f4a2525, 0x725c2e2e, + 0x24381c1c, 0xf157a6a6, 0xc773b4b4, 0x5197c6c6, + 0x23cbe8e8, 0x7ca1dddd, 0x9ce87474, 0x213e1f1f, + 0xdd964b4b, 0xdc61bdbd, 0x860d8b8b, 0x850f8a8a, + 0x90e07070, 0x427c3e3e, 0xc471b5b5, 0xaacc6666, + 0xd8904848, 0x05060303, 0x01f7f6f6, 0x121c0e0e, + 0xa3c26161, 0x5f6a3535, 0xf9ae5757, 0xd069b9b9, + 0x91178686, 0x5899c1c1, 0x273a1d1d, 0xb9279e9e, + 0x38d9e1e1, 0x13ebf8f8, 0xb32b9898, 0x33221111, + 0xbbd26969, 0x70a9d9d9, 0x89078e8e, 0xa7339494, + 0xb62d9b9b, 0x223c1e1e, 0x92158787, 0x20c9e9e9, + 0x4987cece, 0xffaa5555, 0x78502828, 0x7aa5dfdf, + 0x8f038c8c, 0xf859a1a1, 0x80098989, 0x171a0d0d, + 0xda65bfbf, 0x31d7e6e6, 0xc6844242, 0xb8d06868, + 0xc3824141, 0xb0299999, 0x775a2d2d, 0x111e0f0f, + 0xcb7bb0b0, 0xfca85454, 0xd66dbbbb, 0x3a2c1616, +}; + +__constant u32 te2[256] = +{ + 0x63a5c663, 0x7c84f87c, 0x7799ee77, 0x7b8df67b, + 0xf20dfff2, 0x6bbdd66b, 0x6fb1de6f, 0xc55491c5, + 0x30506030, 0x01030201, 0x67a9ce67, 0x2b7d562b, + 0xfe19e7fe, 0xd762b5d7, 0xabe64dab, 0x769aec76, + 0xca458fca, 0x829d1f82, 0xc94089c9, 0x7d87fa7d, + 0xfa15effa, 0x59ebb259, 0x47c98e47, 0xf00bfbf0, + 0xadec41ad, 0xd467b3d4, 0xa2fd5fa2, 0xafea45af, + 0x9cbf239c, 0xa4f753a4, 0x7296e472, 0xc05b9bc0, + 0xb7c275b7, 0xfd1ce1fd, 0x93ae3d93, 0x266a4c26, + 0x365a6c36, 0x3f417e3f, 0xf702f5f7, 0xcc4f83cc, + 0x345c6834, 0xa5f451a5, 0xe534d1e5, 0xf108f9f1, + 0x7193e271, 0xd873abd8, 0x31536231, 0x153f2a15, + 0x040c0804, 0xc75295c7, 0x23654623, 0xc35e9dc3, + 0x18283018, 0x96a13796, 0x050f0a05, 0x9ab52f9a, + 0x07090e07, 0x12362412, 0x809b1b80, 0xe23ddfe2, + 0xeb26cdeb, 0x27694e27, 0xb2cd7fb2, 0x759fea75, + 0x091b1209, 0x839e1d83, 0x2c74582c, 0x1a2e341a, + 0x1b2d361b, 0x6eb2dc6e, 0x5aeeb45a, 0xa0fb5ba0, + 0x52f6a452, 0x3b4d763b, 0xd661b7d6, 0xb3ce7db3, + 0x297b5229, 0xe33edde3, 0x2f715e2f, 0x84971384, + 0x53f5a653, 0xd168b9d1, 0x00000000, 0xed2cc1ed, + 0x20604020, 0xfc1fe3fc, 0xb1c879b1, 0x5bedb65b, + 0x6abed46a, 0xcb468dcb, 0xbed967be, 0x394b7239, + 0x4ade944a, 0x4cd4984c, 0x58e8b058, 0xcf4a85cf, + 0xd06bbbd0, 0xef2ac5ef, 0xaae54faa, 0xfb16edfb, + 0x43c58643, 0x4dd79a4d, 0x33556633, 0x85941185, + 0x45cf8a45, 0xf910e9f9, 0x02060402, 0x7f81fe7f, + 0x50f0a050, 0x3c44783c, 0x9fba259f, 0xa8e34ba8, + 0x51f3a251, 0xa3fe5da3, 0x40c08040, 0x8f8a058f, + 0x92ad3f92, 0x9dbc219d, 0x38487038, 0xf504f1f5, + 0xbcdf63bc, 0xb6c177b6, 0xda75afda, 0x21634221, + 0x10302010, 0xff1ae5ff, 0xf30efdf3, 0xd26dbfd2, + 0xcd4c81cd, 0x0c14180c, 0x13352613, 0xec2fc3ec, + 0x5fe1be5f, 0x97a23597, 0x44cc8844, 0x17392e17, + 0xc45793c4, 0xa7f255a7, 0x7e82fc7e, 0x3d477a3d, + 0x64acc864, 0x5de7ba5d, 0x192b3219, 0x7395e673, + 0x60a0c060, 0x81981981, 0x4fd19e4f, 0xdc7fa3dc, + 0x22664422, 0x2a7e542a, 0x90ab3b90, 0x88830b88, + 0x46ca8c46, 0xee29c7ee, 0xb8d36bb8, 0x143c2814, + 0xde79a7de, 0x5ee2bc5e, 0x0b1d160b, 0xdb76addb, + 0xe03bdbe0, 0x32566432, 0x3a4e743a, 0x0a1e140a, + 0x49db9249, 0x060a0c06, 0x246c4824, 0x5ce4b85c, + 0xc25d9fc2, 0xd36ebdd3, 0xacef43ac, 0x62a6c462, + 0x91a83991, 0x95a43195, 0xe437d3e4, 0x798bf279, + 0xe732d5e7, 0xc8438bc8, 0x37596e37, 0x6db7da6d, + 0x8d8c018d, 0xd564b1d5, 0x4ed29c4e, 0xa9e049a9, + 0x6cb4d86c, 0x56faac56, 0xf407f3f4, 0xea25cfea, + 0x65afca65, 0x7a8ef47a, 0xaee947ae, 0x08181008, + 0xbad56fba, 0x7888f078, 0x256f4a25, 0x2e725c2e, + 0x1c24381c, 0xa6f157a6, 0xb4c773b4, 0xc65197c6, + 0xe823cbe8, 0xdd7ca1dd, 0x749ce874, 0x1f213e1f, + 0x4bdd964b, 0xbddc61bd, 0x8b860d8b, 0x8a850f8a, + 0x7090e070, 0x3e427c3e, 0xb5c471b5, 0x66aacc66, + 0x48d89048, 0x03050603, 0xf601f7f6, 0x0e121c0e, + 0x61a3c261, 0x355f6a35, 0x57f9ae57, 0xb9d069b9, + 0x86911786, 0xc15899c1, 0x1d273a1d, 0x9eb9279e, + 0xe138d9e1, 0xf813ebf8, 0x98b32b98, 0x11332211, + 0x69bbd269, 0xd970a9d9, 0x8e89078e, 0x94a73394, + 0x9bb62d9b, 0x1e223c1e, 0x87921587, 0xe920c9e9, + 0xce4987ce, 0x55ffaa55, 0x28785028, 0xdf7aa5df, + 0x8c8f038c, 0xa1f859a1, 0x89800989, 0x0d171a0d, + 0xbfda65bf, 0xe631d7e6, 0x42c68442, 0x68b8d068, + 0x41c38241, 0x99b02999, 0x2d775a2d, 0x0f111e0f, + 0xb0cb7bb0, 0x54fca854, 0xbbd66dbb, 0x163a2c16, +}; + +__constant u32 te3[256] = +{ + 0x6363a5c6, 0x7c7c84f8, 0x777799ee, 0x7b7b8df6, + 0xf2f20dff, 0x6b6bbdd6, 0x6f6fb1de, 0xc5c55491, + 0x30305060, 0x01010302, 0x6767a9ce, 0x2b2b7d56, + 0xfefe19e7, 0xd7d762b5, 0xababe64d, 0x76769aec, + 0xcaca458f, 0x82829d1f, 0xc9c94089, 0x7d7d87fa, + 0xfafa15ef, 0x5959ebb2, 0x4747c98e, 0xf0f00bfb, + 0xadadec41, 0xd4d467b3, 0xa2a2fd5f, 0xafafea45, + 0x9c9cbf23, 0xa4a4f753, 0x727296e4, 0xc0c05b9b, + 0xb7b7c275, 0xfdfd1ce1, 0x9393ae3d, 0x26266a4c, + 0x36365a6c, 0x3f3f417e, 0xf7f702f5, 0xcccc4f83, + 0x34345c68, 0xa5a5f451, 0xe5e534d1, 0xf1f108f9, + 0x717193e2, 0xd8d873ab, 0x31315362, 0x15153f2a, + 0x04040c08, 0xc7c75295, 0x23236546, 0xc3c35e9d, + 0x18182830, 0x9696a137, 0x05050f0a, 0x9a9ab52f, + 0x0707090e, 0x12123624, 0x80809b1b, 0xe2e23ddf, + 0xebeb26cd, 0x2727694e, 0xb2b2cd7f, 0x75759fea, + 0x09091b12, 0x83839e1d, 0x2c2c7458, 0x1a1a2e34, + 0x1b1b2d36, 0x6e6eb2dc, 0x5a5aeeb4, 0xa0a0fb5b, + 0x5252f6a4, 0x3b3b4d76, 0xd6d661b7, 0xb3b3ce7d, + 0x29297b52, 0xe3e33edd, 0x2f2f715e, 0x84849713, + 0x5353f5a6, 0xd1d168b9, 0x00000000, 0xeded2cc1, + 0x20206040, 0xfcfc1fe3, 0xb1b1c879, 0x5b5bedb6, + 0x6a6abed4, 0xcbcb468d, 0xbebed967, 0x39394b72, + 0x4a4ade94, 0x4c4cd498, 0x5858e8b0, 0xcfcf4a85, + 0xd0d06bbb, 0xefef2ac5, 0xaaaae54f, 0xfbfb16ed, + 0x4343c586, 0x4d4dd79a, 0x33335566, 0x85859411, + 0x4545cf8a, 0xf9f910e9, 0x02020604, 0x7f7f81fe, + 0x5050f0a0, 0x3c3c4478, 0x9f9fba25, 0xa8a8e34b, + 0x5151f3a2, 0xa3a3fe5d, 0x4040c080, 0x8f8f8a05, + 0x9292ad3f, 0x9d9dbc21, 0x38384870, 0xf5f504f1, + 0xbcbcdf63, 0xb6b6c177, 0xdada75af, 0x21216342, + 0x10103020, 0xffff1ae5, 0xf3f30efd, 0xd2d26dbf, + 0xcdcd4c81, 0x0c0c1418, 0x13133526, 0xecec2fc3, + 0x5f5fe1be, 0x9797a235, 0x4444cc88, 0x1717392e, + 0xc4c45793, 0xa7a7f255, 0x7e7e82fc, 0x3d3d477a, + 0x6464acc8, 0x5d5de7ba, 0x19192b32, 0x737395e6, + 0x6060a0c0, 0x81819819, 0x4f4fd19e, 0xdcdc7fa3, + 0x22226644, 0x2a2a7e54, 0x9090ab3b, 0x8888830b, + 0x4646ca8c, 0xeeee29c7, 0xb8b8d36b, 0x14143c28, + 0xdede79a7, 0x5e5ee2bc, 0x0b0b1d16, 0xdbdb76ad, + 0xe0e03bdb, 0x32325664, 0x3a3a4e74, 0x0a0a1e14, + 0x4949db92, 0x06060a0c, 0x24246c48, 0x5c5ce4b8, + 0xc2c25d9f, 0xd3d36ebd, 0xacacef43, 0x6262a6c4, + 0x9191a839, 0x9595a431, 0xe4e437d3, 0x79798bf2, + 0xe7e732d5, 0xc8c8438b, 0x3737596e, 0x6d6db7da, + 0x8d8d8c01, 0xd5d564b1, 0x4e4ed29c, 0xa9a9e049, + 0x6c6cb4d8, 0x5656faac, 0xf4f407f3, 0xeaea25cf, + 0x6565afca, 0x7a7a8ef4, 0xaeaee947, 0x08081810, + 0xbabad56f, 0x787888f0, 0x25256f4a, 0x2e2e725c, + 0x1c1c2438, 0xa6a6f157, 0xb4b4c773, 0xc6c65197, + 0xe8e823cb, 0xdddd7ca1, 0x74749ce8, 0x1f1f213e, + 0x4b4bdd96, 0xbdbddc61, 0x8b8b860d, 0x8a8a850f, + 0x707090e0, 0x3e3e427c, 0xb5b5c471, 0x6666aacc, + 0x4848d890, 0x03030506, 0xf6f601f7, 0x0e0e121c, + 0x6161a3c2, 0x35355f6a, 0x5757f9ae, 0xb9b9d069, + 0x86869117, 0xc1c15899, 0x1d1d273a, 0x9e9eb927, + 0xe1e138d9, 0xf8f813eb, 0x9898b32b, 0x11113322, + 0x6969bbd2, 0xd9d970a9, 0x8e8e8907, 0x9494a733, + 0x9b9bb62d, 0x1e1e223c, 0x87879215, 0xe9e920c9, + 0xcece4987, 0x5555ffaa, 0x28287850, 0xdfdf7aa5, + 0x8c8c8f03, 0xa1a1f859, 0x89898009, 0x0d0d171a, + 0xbfbfda65, 0xe6e631d7, 0x4242c684, 0x6868b8d0, + 0x4141c382, 0x9999b029, 0x2d2d775a, 0x0f0f111e, + 0xb0b0cb7b, 0x5454fca8, 0xbbbbd66d, 0x16163a2c, +}; + +__constant u32 te4[256] = +{ + 0x63636363, 0x7c7c7c7c, 0x77777777, 0x7b7b7b7b, + 0xf2f2f2f2, 0x6b6b6b6b, 0x6f6f6f6f, 0xc5c5c5c5, + 0x30303030, 0x01010101, 0x67676767, 0x2b2b2b2b, + 0xfefefefe, 0xd7d7d7d7, 0xabababab, 0x76767676, + 0xcacacaca, 0x82828282, 0xc9c9c9c9, 0x7d7d7d7d, + 0xfafafafa, 0x59595959, 0x47474747, 0xf0f0f0f0, + 0xadadadad, 0xd4d4d4d4, 0xa2a2a2a2, 0xafafafaf, + 0x9c9c9c9c, 0xa4a4a4a4, 0x72727272, 0xc0c0c0c0, + 0xb7b7b7b7, 0xfdfdfdfd, 0x93939393, 0x26262626, + 0x36363636, 0x3f3f3f3f, 0xf7f7f7f7, 0xcccccccc, + 0x34343434, 0xa5a5a5a5, 0xe5e5e5e5, 0xf1f1f1f1, + 0x71717171, 0xd8d8d8d8, 0x31313131, 0x15151515, + 0x04040404, 0xc7c7c7c7, 0x23232323, 0xc3c3c3c3, + 0x18181818, 0x96969696, 0x05050505, 0x9a9a9a9a, + 0x07070707, 0x12121212, 0x80808080, 0xe2e2e2e2, + 0xebebebeb, 0x27272727, 0xb2b2b2b2, 0x75757575, + 0x09090909, 0x83838383, 0x2c2c2c2c, 0x1a1a1a1a, + 0x1b1b1b1b, 0x6e6e6e6e, 0x5a5a5a5a, 0xa0a0a0a0, + 0x52525252, 0x3b3b3b3b, 0xd6d6d6d6, 0xb3b3b3b3, + 0x29292929, 0xe3e3e3e3, 0x2f2f2f2f, 0x84848484, + 0x53535353, 0xd1d1d1d1, 0x00000000, 0xedededed, + 0x20202020, 0xfcfcfcfc, 0xb1b1b1b1, 0x5b5b5b5b, + 0x6a6a6a6a, 0xcbcbcbcb, 0xbebebebe, 0x39393939, + 0x4a4a4a4a, 0x4c4c4c4c, 0x58585858, 0xcfcfcfcf, + 0xd0d0d0d0, 0xefefefef, 0xaaaaaaaa, 0xfbfbfbfb, + 0x43434343, 0x4d4d4d4d, 0x33333333, 0x85858585, + 0x45454545, 0xf9f9f9f9, 0x02020202, 0x7f7f7f7f, + 0x50505050, 0x3c3c3c3c, 0x9f9f9f9f, 0xa8a8a8a8, + 0x51515151, 0xa3a3a3a3, 0x40404040, 0x8f8f8f8f, + 0x92929292, 0x9d9d9d9d, 0x38383838, 0xf5f5f5f5, + 0xbcbcbcbc, 0xb6b6b6b6, 0xdadadada, 0x21212121, + 0x10101010, 0xffffffff, 0xf3f3f3f3, 0xd2d2d2d2, + 0xcdcdcdcd, 0x0c0c0c0c, 0x13131313, 0xecececec, + 0x5f5f5f5f, 0x97979797, 0x44444444, 0x17171717, + 0xc4c4c4c4, 0xa7a7a7a7, 0x7e7e7e7e, 0x3d3d3d3d, + 0x64646464, 0x5d5d5d5d, 0x19191919, 0x73737373, + 0x60606060, 0x81818181, 0x4f4f4f4f, 0xdcdcdcdc, + 0x22222222, 0x2a2a2a2a, 0x90909090, 0x88888888, + 0x46464646, 0xeeeeeeee, 0xb8b8b8b8, 0x14141414, + 0xdededede, 0x5e5e5e5e, 0x0b0b0b0b, 0xdbdbdbdb, + 0xe0e0e0e0, 0x32323232, 0x3a3a3a3a, 0x0a0a0a0a, + 0x49494949, 0x06060606, 0x24242424, 0x5c5c5c5c, + 0xc2c2c2c2, 0xd3d3d3d3, 0xacacacac, 0x62626262, + 0x91919191, 0x95959595, 0xe4e4e4e4, 0x79797979, + 0xe7e7e7e7, 0xc8c8c8c8, 0x37373737, 0x6d6d6d6d, + 0x8d8d8d8d, 0xd5d5d5d5, 0x4e4e4e4e, 0xa9a9a9a9, + 0x6c6c6c6c, 0x56565656, 0xf4f4f4f4, 0xeaeaeaea, + 0x65656565, 0x7a7a7a7a, 0xaeaeaeae, 0x08080808, + 0xbabababa, 0x78787878, 0x25252525, 0x2e2e2e2e, + 0x1c1c1c1c, 0xa6a6a6a6, 0xb4b4b4b4, 0xc6c6c6c6, + 0xe8e8e8e8, 0xdddddddd, 0x74747474, 0x1f1f1f1f, + 0x4b4b4b4b, 0xbdbdbdbd, 0x8b8b8b8b, 0x8a8a8a8a, + 0x70707070, 0x3e3e3e3e, 0xb5b5b5b5, 0x66666666, + 0x48484848, 0x03030303, 0xf6f6f6f6, 0x0e0e0e0e, + 0x61616161, 0x35353535, 0x57575757, 0xb9b9b9b9, + 0x86868686, 0xc1c1c1c1, 0x1d1d1d1d, 0x9e9e9e9e, + 0xe1e1e1e1, 0xf8f8f8f8, 0x98989898, 0x11111111, + 0x69696969, 0xd9d9d9d9, 0x8e8e8e8e, 0x94949494, + 0x9b9b9b9b, 0x1e1e1e1e, 0x87878787, 0xe9e9e9e9, + 0xcececece, 0x55555555, 0x28282828, 0xdfdfdfdf, + 0x8c8c8c8c, 0xa1a1a1a1, 0x89898989, 0x0d0d0d0d, + 0xbfbfbfbf, 0xe6e6e6e6, 0x42424242, 0x68686868, + 0x41414141, 0x99999999, 0x2d2d2d2d, 0x0f0f0f0f, + 0xb0b0b0b0, 0x54545454, 0xbbbbbbbb, 0x16161616, +}; + +__constant u32 td0[256] = +{ + 0x51f4a750, 0x7e416553, 0x1a17a4c3, 0x3a275e96, + 0x3bab6bcb, 0x1f9d45f1, 0xacfa58ab, 0x4be30393, + 0x2030fa55, 0xad766df6, 0x88cc7691, 0xf5024c25, + 0x4fe5d7fc, 0xc52acbd7, 0x26354480, 0xb562a38f, + 0xdeb15a49, 0x25ba1b67, 0x45ea0e98, 0x5dfec0e1, + 0xc32f7502, 0x814cf012, 0x8d4697a3, 0x6bd3f9c6, + 0x038f5fe7, 0x15929c95, 0xbf6d7aeb, 0x955259da, + 0xd4be832d, 0x587421d3, 0x49e06929, 0x8ec9c844, + 0x75c2896a, 0xf48e7978, 0x99583e6b, 0x27b971dd, + 0xbee14fb6, 0xf088ad17, 0xc920ac66, 0x7dce3ab4, + 0x63df4a18, 0xe51a3182, 0x97513360, 0x62537f45, + 0xb16477e0, 0xbb6bae84, 0xfe81a01c, 0xf9082b94, + 0x70486858, 0x8f45fd19, 0x94de6c87, 0x527bf8b7, + 0xab73d323, 0x724b02e2, 0xe31f8f57, 0x6655ab2a, + 0xb2eb2807, 0x2fb5c203, 0x86c57b9a, 0xd33708a5, + 0x302887f2, 0x23bfa5b2, 0x02036aba, 0xed16825c, + 0x8acf1c2b, 0xa779b492, 0xf307f2f0, 0x4e69e2a1, + 0x65daf4cd, 0x0605bed5, 0xd134621f, 0xc4a6fe8a, + 0x342e539d, 0xa2f355a0, 0x058ae132, 0xa4f6eb75, + 0x0b83ec39, 0x4060efaa, 0x5e719f06, 0xbd6e1051, + 0x3e218af9, 0x96dd063d, 0xdd3e05ae, 0x4de6bd46, + 0x91548db5, 0x71c45d05, 0x0406d46f, 0x605015ff, + 0x1998fb24, 0xd6bde997, 0x894043cc, 0x67d99e77, + 0xb0e842bd, 0x07898b88, 0xe7195b38, 0x79c8eedb, + 0xa17c0a47, 0x7c420fe9, 0xf8841ec9, 0x00000000, + 0x09808683, 0x322bed48, 0x1e1170ac, 0x6c5a724e, + 0xfd0efffb, 0x0f853856, 0x3daed51e, 0x362d3927, + 0x0a0fd964, 0x685ca621, 0x9b5b54d1, 0x24362e3a, + 0x0c0a67b1, 0x9357e70f, 0xb4ee96d2, 0x1b9b919e, + 0x80c0c54f, 0x61dc20a2, 0x5a774b69, 0x1c121a16, + 0xe293ba0a, 0xc0a02ae5, 0x3c22e043, 0x121b171d, + 0x0e090d0b, 0xf28bc7ad, 0x2db6a8b9, 0x141ea9c8, + 0x57f11985, 0xaf75074c, 0xee99ddbb, 0xa37f60fd, + 0xf701269f, 0x5c72f5bc, 0x44663bc5, 0x5bfb7e34, + 0x8b432976, 0xcb23c6dc, 0xb6edfc68, 0xb8e4f163, + 0xd731dcca, 0x42638510, 0x13972240, 0x84c61120, + 0x854a247d, 0xd2bb3df8, 0xaef93211, 0xc729a16d, + 0x1d9e2f4b, 0xdcb230f3, 0x0d8652ec, 0x77c1e3d0, + 0x2bb3166c, 0xa970b999, 0x119448fa, 0x47e96422, + 0xa8fc8cc4, 0xa0f03f1a, 0x567d2cd8, 0x223390ef, + 0x87494ec7, 0xd938d1c1, 0x8ccaa2fe, 0x98d40b36, + 0xa6f581cf, 0xa57ade28, 0xdab78e26, 0x3fadbfa4, + 0x2c3a9de4, 0x5078920d, 0x6a5fcc9b, 0x547e4662, + 0xf68d13c2, 0x90d8b8e8, 0x2e39f75e, 0x82c3aff5, + 0x9f5d80be, 0x69d0937c, 0x6fd52da9, 0xcf2512b3, + 0xc8ac993b, 0x10187da7, 0xe89c636e, 0xdb3bbb7b, + 0xcd267809, 0x6e5918f4, 0xec9ab701, 0x834f9aa8, + 0xe6956e65, 0xaaffe67e, 0x21bccf08, 0xef15e8e6, + 0xbae79bd9, 0x4a6f36ce, 0xea9f09d4, 0x29b07cd6, + 0x31a4b2af, 0x2a3f2331, 0xc6a59430, 0x35a266c0, + 0x744ebc37, 0xfc82caa6, 0xe090d0b0, 0x33a7d815, + 0xf104984a, 0x41ecdaf7, 0x7fcd500e, 0x1791f62f, + 0x764dd68d, 0x43efb04d, 0xccaa4d54, 0xe49604df, + 0x9ed1b5e3, 0x4c6a881b, 0xc12c1fb8, 0x4665517f, + 0x9d5eea04, 0x018c355d, 0xfa877473, 0xfb0b412e, + 0xb3671d5a, 0x92dbd252, 0xe9105633, 0x6dd64713, + 0x9ad7618c, 0x37a10c7a, 0x59f8148e, 0xeb133c89, + 0xcea927ee, 0xb761c935, 0xe11ce5ed, 0x7a47b13c, + 0x9cd2df59, 0x55f2733f, 0x1814ce79, 0x73c737bf, + 0x53f7cdea, 0x5ffdaa5b, 0xdf3d6f14, 0x7844db86, + 0xcaaff381, 0xb968c43e, 0x3824342c, 0xc2a3405f, + 0x161dc372, 0xbce2250c, 0x283c498b, 0xff0d9541, + 0x39a80171, 0x080cb3de, 0xd8b4e49c, 0x6456c190, + 0x7bcb8461, 0xd532b670, 0x486c5c74, 0xd0b85742, +}; + +__constant u32 td1[256] = +{ + 0x5051f4a7, 0x537e4165, 0xc31a17a4, 0x963a275e, + 0xcb3bab6b, 0xf11f9d45, 0xabacfa58, 0x934be303, + 0x552030fa, 0xf6ad766d, 0x9188cc76, 0x25f5024c, + 0xfc4fe5d7, 0xd7c52acb, 0x80263544, 0x8fb562a3, + 0x49deb15a, 0x6725ba1b, 0x9845ea0e, 0xe15dfec0, + 0x02c32f75, 0x12814cf0, 0xa38d4697, 0xc66bd3f9, + 0xe7038f5f, 0x9515929c, 0xebbf6d7a, 0xda955259, + 0x2dd4be83, 0xd3587421, 0x2949e069, 0x448ec9c8, + 0x6a75c289, 0x78f48e79, 0x6b99583e, 0xdd27b971, + 0xb6bee14f, 0x17f088ad, 0x66c920ac, 0xb47dce3a, + 0x1863df4a, 0x82e51a31, 0x60975133, 0x4562537f, + 0xe0b16477, 0x84bb6bae, 0x1cfe81a0, 0x94f9082b, + 0x58704868, 0x198f45fd, 0x8794de6c, 0xb7527bf8, + 0x23ab73d3, 0xe2724b02, 0x57e31f8f, 0x2a6655ab, + 0x07b2eb28, 0x032fb5c2, 0x9a86c57b, 0xa5d33708, + 0xf2302887, 0xb223bfa5, 0xba02036a, 0x5ced1682, + 0x2b8acf1c, 0x92a779b4, 0xf0f307f2, 0xa14e69e2, + 0xcd65daf4, 0xd50605be, 0x1fd13462, 0x8ac4a6fe, + 0x9d342e53, 0xa0a2f355, 0x32058ae1, 0x75a4f6eb, + 0x390b83ec, 0xaa4060ef, 0x065e719f, 0x51bd6e10, + 0xf93e218a, 0x3d96dd06, 0xaedd3e05, 0x464de6bd, + 0xb591548d, 0x0571c45d, 0x6f0406d4, 0xff605015, + 0x241998fb, 0x97d6bde9, 0xcc894043, 0x7767d99e, + 0xbdb0e842, 0x8807898b, 0x38e7195b, 0xdb79c8ee, + 0x47a17c0a, 0xe97c420f, 0xc9f8841e, 0x00000000, + 0x83098086, 0x48322bed, 0xac1e1170, 0x4e6c5a72, + 0xfbfd0eff, 0x560f8538, 0x1e3daed5, 0x27362d39, + 0x640a0fd9, 0x21685ca6, 0xd19b5b54, 0x3a24362e, + 0xb10c0a67, 0x0f9357e7, 0xd2b4ee96, 0x9e1b9b91, + 0x4f80c0c5, 0xa261dc20, 0x695a774b, 0x161c121a, + 0x0ae293ba, 0xe5c0a02a, 0x433c22e0, 0x1d121b17, + 0x0b0e090d, 0xadf28bc7, 0xb92db6a8, 0xc8141ea9, + 0x8557f119, 0x4caf7507, 0xbbee99dd, 0xfda37f60, + 0x9ff70126, 0xbc5c72f5, 0xc544663b, 0x345bfb7e, + 0x768b4329, 0xdccb23c6, 0x68b6edfc, 0x63b8e4f1, + 0xcad731dc, 0x10426385, 0x40139722, 0x2084c611, + 0x7d854a24, 0xf8d2bb3d, 0x11aef932, 0x6dc729a1, + 0x4b1d9e2f, 0xf3dcb230, 0xec0d8652, 0xd077c1e3, + 0x6c2bb316, 0x99a970b9, 0xfa119448, 0x2247e964, + 0xc4a8fc8c, 0x1aa0f03f, 0xd8567d2c, 0xef223390, + 0xc787494e, 0xc1d938d1, 0xfe8ccaa2, 0x3698d40b, + 0xcfa6f581, 0x28a57ade, 0x26dab78e, 0xa43fadbf, + 0xe42c3a9d, 0x0d507892, 0x9b6a5fcc, 0x62547e46, + 0xc2f68d13, 0xe890d8b8, 0x5e2e39f7, 0xf582c3af, + 0xbe9f5d80, 0x7c69d093, 0xa96fd52d, 0xb3cf2512, + 0x3bc8ac99, 0xa710187d, 0x6ee89c63, 0x7bdb3bbb, + 0x09cd2678, 0xf46e5918, 0x01ec9ab7, 0xa8834f9a, + 0x65e6956e, 0x7eaaffe6, 0x0821bccf, 0xe6ef15e8, + 0xd9bae79b, 0xce4a6f36, 0xd4ea9f09, 0xd629b07c, + 0xaf31a4b2, 0x312a3f23, 0x30c6a594, 0xc035a266, + 0x37744ebc, 0xa6fc82ca, 0xb0e090d0, 0x1533a7d8, + 0x4af10498, 0xf741ecda, 0x0e7fcd50, 0x2f1791f6, + 0x8d764dd6, 0x4d43efb0, 0x54ccaa4d, 0xdfe49604, + 0xe39ed1b5, 0x1b4c6a88, 0xb8c12c1f, 0x7f466551, + 0x049d5eea, 0x5d018c35, 0x73fa8774, 0x2efb0b41, + 0x5ab3671d, 0x5292dbd2, 0x33e91056, 0x136dd647, + 0x8c9ad761, 0x7a37a10c, 0x8e59f814, 0x89eb133c, + 0xeecea927, 0x35b761c9, 0xede11ce5, 0x3c7a47b1, + 0x599cd2df, 0x3f55f273, 0x791814ce, 0xbf73c737, + 0xea53f7cd, 0x5b5ffdaa, 0x14df3d6f, 0x867844db, + 0x81caaff3, 0x3eb968c4, 0x2c382434, 0x5fc2a340, + 0x72161dc3, 0x0cbce225, 0x8b283c49, 0x41ff0d95, + 0x7139a801, 0xde080cb3, 0x9cd8b4e4, 0x906456c1, + 0x617bcb84, 0x70d532b6, 0x74486c5c, 0x42d0b857, +}; + +__constant u32 td2[256] = +{ + 0xa75051f4, 0x65537e41, 0xa4c31a17, 0x5e963a27, + 0x6bcb3bab, 0x45f11f9d, 0x58abacfa, 0x03934be3, + 0xfa552030, 0x6df6ad76, 0x769188cc, 0x4c25f502, + 0xd7fc4fe5, 0xcbd7c52a, 0x44802635, 0xa38fb562, + 0x5a49deb1, 0x1b6725ba, 0x0e9845ea, 0xc0e15dfe, + 0x7502c32f, 0xf012814c, 0x97a38d46, 0xf9c66bd3, + 0x5fe7038f, 0x9c951592, 0x7aebbf6d, 0x59da9552, + 0x832dd4be, 0x21d35874, 0x692949e0, 0xc8448ec9, + 0x896a75c2, 0x7978f48e, 0x3e6b9958, 0x71dd27b9, + 0x4fb6bee1, 0xad17f088, 0xac66c920, 0x3ab47dce, + 0x4a1863df, 0x3182e51a, 0x33609751, 0x7f456253, + 0x77e0b164, 0xae84bb6b, 0xa01cfe81, 0x2b94f908, + 0x68587048, 0xfd198f45, 0x6c8794de, 0xf8b7527b, + 0xd323ab73, 0x02e2724b, 0x8f57e31f, 0xab2a6655, + 0x2807b2eb, 0xc2032fb5, 0x7b9a86c5, 0x08a5d337, + 0x87f23028, 0xa5b223bf, 0x6aba0203, 0x825ced16, + 0x1c2b8acf, 0xb492a779, 0xf2f0f307, 0xe2a14e69, + 0xf4cd65da, 0xbed50605, 0x621fd134, 0xfe8ac4a6, + 0x539d342e, 0x55a0a2f3, 0xe132058a, 0xeb75a4f6, + 0xec390b83, 0xefaa4060, 0x9f065e71, 0x1051bd6e, + 0x8af93e21, 0x063d96dd, 0x05aedd3e, 0xbd464de6, + 0x8db59154, 0x5d0571c4, 0xd46f0406, 0x15ff6050, + 0xfb241998, 0xe997d6bd, 0x43cc8940, 0x9e7767d9, + 0x42bdb0e8, 0x8b880789, 0x5b38e719, 0xeedb79c8, + 0x0a47a17c, 0x0fe97c42, 0x1ec9f884, 0x00000000, + 0x86830980, 0xed48322b, 0x70ac1e11, 0x724e6c5a, + 0xfffbfd0e, 0x38560f85, 0xd51e3dae, 0x3927362d, + 0xd9640a0f, 0xa621685c, 0x54d19b5b, 0x2e3a2436, + 0x67b10c0a, 0xe70f9357, 0x96d2b4ee, 0x919e1b9b, + 0xc54f80c0, 0x20a261dc, 0x4b695a77, 0x1a161c12, + 0xba0ae293, 0x2ae5c0a0, 0xe0433c22, 0x171d121b, + 0x0d0b0e09, 0xc7adf28b, 0xa8b92db6, 0xa9c8141e, + 0x198557f1, 0x074caf75, 0xddbbee99, 0x60fda37f, + 0x269ff701, 0xf5bc5c72, 0x3bc54466, 0x7e345bfb, + 0x29768b43, 0xc6dccb23, 0xfc68b6ed, 0xf163b8e4, + 0xdccad731, 0x85104263, 0x22401397, 0x112084c6, + 0x247d854a, 0x3df8d2bb, 0x3211aef9, 0xa16dc729, + 0x2f4b1d9e, 0x30f3dcb2, 0x52ec0d86, 0xe3d077c1, + 0x166c2bb3, 0xb999a970, 0x48fa1194, 0x642247e9, + 0x8cc4a8fc, 0x3f1aa0f0, 0x2cd8567d, 0x90ef2233, + 0x4ec78749, 0xd1c1d938, 0xa2fe8cca, 0x0b3698d4, + 0x81cfa6f5, 0xde28a57a, 0x8e26dab7, 0xbfa43fad, + 0x9de42c3a, 0x920d5078, 0xcc9b6a5f, 0x4662547e, + 0x13c2f68d, 0xb8e890d8, 0xf75e2e39, 0xaff582c3, + 0x80be9f5d, 0x937c69d0, 0x2da96fd5, 0x12b3cf25, + 0x993bc8ac, 0x7da71018, 0x636ee89c, 0xbb7bdb3b, + 0x7809cd26, 0x18f46e59, 0xb701ec9a, 0x9aa8834f, + 0x6e65e695, 0xe67eaaff, 0xcf0821bc, 0xe8e6ef15, + 0x9bd9bae7, 0x36ce4a6f, 0x09d4ea9f, 0x7cd629b0, + 0xb2af31a4, 0x23312a3f, 0x9430c6a5, 0x66c035a2, + 0xbc37744e, 0xcaa6fc82, 0xd0b0e090, 0xd81533a7, + 0x984af104, 0xdaf741ec, 0x500e7fcd, 0xf62f1791, + 0xd68d764d, 0xb04d43ef, 0x4d54ccaa, 0x04dfe496, + 0xb5e39ed1, 0x881b4c6a, 0x1fb8c12c, 0x517f4665, + 0xea049d5e, 0x355d018c, 0x7473fa87, 0x412efb0b, + 0x1d5ab367, 0xd25292db, 0x5633e910, 0x47136dd6, + 0x618c9ad7, 0x0c7a37a1, 0x148e59f8, 0x3c89eb13, + 0x27eecea9, 0xc935b761, 0xe5ede11c, 0xb13c7a47, + 0xdf599cd2, 0x733f55f2, 0xce791814, 0x37bf73c7, + 0xcdea53f7, 0xaa5b5ffd, 0x6f14df3d, 0xdb867844, + 0xf381caaf, 0xc43eb968, 0x342c3824, 0x405fc2a3, + 0xc372161d, 0x250cbce2, 0x498b283c, 0x9541ff0d, + 0x017139a8, 0xb3de080c, 0xe49cd8b4, 0xc1906456, + 0x84617bcb, 0xb670d532, 0x5c74486c, 0x5742d0b8, +}; + +__constant u32 td3[256] = +{ + 0xf4a75051, 0x4165537e, 0x17a4c31a, 0x275e963a, + 0xab6bcb3b, 0x9d45f11f, 0xfa58abac, 0xe303934b, + 0x30fa5520, 0x766df6ad, 0xcc769188, 0x024c25f5, + 0xe5d7fc4f, 0x2acbd7c5, 0x35448026, 0x62a38fb5, + 0xb15a49de, 0xba1b6725, 0xea0e9845, 0xfec0e15d, + 0x2f7502c3, 0x4cf01281, 0x4697a38d, 0xd3f9c66b, + 0x8f5fe703, 0x929c9515, 0x6d7aebbf, 0x5259da95, + 0xbe832dd4, 0x7421d358, 0xe0692949, 0xc9c8448e, + 0xc2896a75, 0x8e7978f4, 0x583e6b99, 0xb971dd27, + 0xe14fb6be, 0x88ad17f0, 0x20ac66c9, 0xce3ab47d, + 0xdf4a1863, 0x1a3182e5, 0x51336097, 0x537f4562, + 0x6477e0b1, 0x6bae84bb, 0x81a01cfe, 0x082b94f9, + 0x48685870, 0x45fd198f, 0xde6c8794, 0x7bf8b752, + 0x73d323ab, 0x4b02e272, 0x1f8f57e3, 0x55ab2a66, + 0xeb2807b2, 0xb5c2032f, 0xc57b9a86, 0x3708a5d3, + 0x2887f230, 0xbfa5b223, 0x036aba02, 0x16825ced, + 0xcf1c2b8a, 0x79b492a7, 0x07f2f0f3, 0x69e2a14e, + 0xdaf4cd65, 0x05bed506, 0x34621fd1, 0xa6fe8ac4, + 0x2e539d34, 0xf355a0a2, 0x8ae13205, 0xf6eb75a4, + 0x83ec390b, 0x60efaa40, 0x719f065e, 0x6e1051bd, + 0x218af93e, 0xdd063d96, 0x3e05aedd, 0xe6bd464d, + 0x548db591, 0xc45d0571, 0x06d46f04, 0x5015ff60, + 0x98fb2419, 0xbde997d6, 0x4043cc89, 0xd99e7767, + 0xe842bdb0, 0x898b8807, 0x195b38e7, 0xc8eedb79, + 0x7c0a47a1, 0x420fe97c, 0x841ec9f8, 0x00000000, + 0x80868309, 0x2bed4832, 0x1170ac1e, 0x5a724e6c, + 0x0efffbfd, 0x8538560f, 0xaed51e3d, 0x2d392736, + 0x0fd9640a, 0x5ca62168, 0x5b54d19b, 0x362e3a24, + 0x0a67b10c, 0x57e70f93, 0xee96d2b4, 0x9b919e1b, + 0xc0c54f80, 0xdc20a261, 0x774b695a, 0x121a161c, + 0x93ba0ae2, 0xa02ae5c0, 0x22e0433c, 0x1b171d12, + 0x090d0b0e, 0x8bc7adf2, 0xb6a8b92d, 0x1ea9c814, + 0xf1198557, 0x75074caf, 0x99ddbbee, 0x7f60fda3, + 0x01269ff7, 0x72f5bc5c, 0x663bc544, 0xfb7e345b, + 0x4329768b, 0x23c6dccb, 0xedfc68b6, 0xe4f163b8, + 0x31dccad7, 0x63851042, 0x97224013, 0xc6112084, + 0x4a247d85, 0xbb3df8d2, 0xf93211ae, 0x29a16dc7, + 0x9e2f4b1d, 0xb230f3dc, 0x8652ec0d, 0xc1e3d077, + 0xb3166c2b, 0x70b999a9, 0x9448fa11, 0xe9642247, + 0xfc8cc4a8, 0xf03f1aa0, 0x7d2cd856, 0x3390ef22, + 0x494ec787, 0x38d1c1d9, 0xcaa2fe8c, 0xd40b3698, + 0xf581cfa6, 0x7ade28a5, 0xb78e26da, 0xadbfa43f, + 0x3a9de42c, 0x78920d50, 0x5fcc9b6a, 0x7e466254, + 0x8d13c2f6, 0xd8b8e890, 0x39f75e2e, 0xc3aff582, + 0x5d80be9f, 0xd0937c69, 0xd52da96f, 0x2512b3cf, + 0xac993bc8, 0x187da710, 0x9c636ee8, 0x3bbb7bdb, + 0x267809cd, 0x5918f46e, 0x9ab701ec, 0x4f9aa883, + 0x956e65e6, 0xffe67eaa, 0xbccf0821, 0x15e8e6ef, + 0xe79bd9ba, 0x6f36ce4a, 0x9f09d4ea, 0xb07cd629, + 0xa4b2af31, 0x3f23312a, 0xa59430c6, 0xa266c035, + 0x4ebc3774, 0x82caa6fc, 0x90d0b0e0, 0xa7d81533, + 0x04984af1, 0xecdaf741, 0xcd500e7f, 0x91f62f17, + 0x4dd68d76, 0xefb04d43, 0xaa4d54cc, 0x9604dfe4, + 0xd1b5e39e, 0x6a881b4c, 0x2c1fb8c1, 0x65517f46, + 0x5eea049d, 0x8c355d01, 0x877473fa, 0x0b412efb, + 0x671d5ab3, 0xdbd25292, 0x105633e9, 0xd647136d, + 0xd7618c9a, 0xa10c7a37, 0xf8148e59, 0x133c89eb, + 0xa927eece, 0x61c935b7, 0x1ce5ede1, 0x47b13c7a, + 0xd2df599c, 0xf2733f55, 0x14ce7918, 0xc737bf73, + 0xf7cdea53, 0xfdaa5b5f, 0x3d6f14df, 0x44db8678, + 0xaff381ca, 0x68c43eb9, 0x24342c38, 0xa3405fc2, + 0x1dc37216, 0xe2250cbc, 0x3c498b28, 0x0d9541ff, + 0xa8017139, 0x0cb3de08, 0xb4e49cd8, 0x56c19064, + 0xcb84617b, 0x32b670d5, 0x6c5c7448, 0xb85742d0, +}; + +__constant u32 td4[256] = +{ + 0x52525252, 0x09090909, 0x6a6a6a6a, 0xd5d5d5d5, + 0x30303030, 0x36363636, 0xa5a5a5a5, 0x38383838, + 0xbfbfbfbf, 0x40404040, 0xa3a3a3a3, 0x9e9e9e9e, + 0x81818181, 0xf3f3f3f3, 0xd7d7d7d7, 0xfbfbfbfb, + 0x7c7c7c7c, 0xe3e3e3e3, 0x39393939, 0x82828282, + 0x9b9b9b9b, 0x2f2f2f2f, 0xffffffff, 0x87878787, + 0x34343434, 0x8e8e8e8e, 0x43434343, 0x44444444, + 0xc4c4c4c4, 0xdededede, 0xe9e9e9e9, 0xcbcbcbcb, + 0x54545454, 0x7b7b7b7b, 0x94949494, 0x32323232, + 0xa6a6a6a6, 0xc2c2c2c2, 0x23232323, 0x3d3d3d3d, + 0xeeeeeeee, 0x4c4c4c4c, 0x95959595, 0x0b0b0b0b, + 0x42424242, 0xfafafafa, 0xc3c3c3c3, 0x4e4e4e4e, + 0x08080808, 0x2e2e2e2e, 0xa1a1a1a1, 0x66666666, + 0x28282828, 0xd9d9d9d9, 0x24242424, 0xb2b2b2b2, + 0x76767676, 0x5b5b5b5b, 0xa2a2a2a2, 0x49494949, + 0x6d6d6d6d, 0x8b8b8b8b, 0xd1d1d1d1, 0x25252525, + 0x72727272, 0xf8f8f8f8, 0xf6f6f6f6, 0x64646464, + 0x86868686, 0x68686868, 0x98989898, 0x16161616, + 0xd4d4d4d4, 0xa4a4a4a4, 0x5c5c5c5c, 0xcccccccc, + 0x5d5d5d5d, 0x65656565, 0xb6b6b6b6, 0x92929292, + 0x6c6c6c6c, 0x70707070, 0x48484848, 0x50505050, + 0xfdfdfdfd, 0xedededed, 0xb9b9b9b9, 0xdadadada, + 0x5e5e5e5e, 0x15151515, 0x46464646, 0x57575757, + 0xa7a7a7a7, 0x8d8d8d8d, 0x9d9d9d9d, 0x84848484, + 0x90909090, 0xd8d8d8d8, 0xabababab, 0x00000000, + 0x8c8c8c8c, 0xbcbcbcbc, 0xd3d3d3d3, 0x0a0a0a0a, + 0xf7f7f7f7, 0xe4e4e4e4, 0x58585858, 0x05050505, + 0xb8b8b8b8, 0xb3b3b3b3, 0x45454545, 0x06060606, + 0xd0d0d0d0, 0x2c2c2c2c, 0x1e1e1e1e, 0x8f8f8f8f, + 0xcacacaca, 0x3f3f3f3f, 0x0f0f0f0f, 0x02020202, + 0xc1c1c1c1, 0xafafafaf, 0xbdbdbdbd, 0x03030303, + 0x01010101, 0x13131313, 0x8a8a8a8a, 0x6b6b6b6b, + 0x3a3a3a3a, 0x91919191, 0x11111111, 0x41414141, + 0x4f4f4f4f, 0x67676767, 0xdcdcdcdc, 0xeaeaeaea, + 0x97979797, 0xf2f2f2f2, 0xcfcfcfcf, 0xcececece, + 0xf0f0f0f0, 0xb4b4b4b4, 0xe6e6e6e6, 0x73737373, + 0x96969696, 0xacacacac, 0x74747474, 0x22222222, + 0xe7e7e7e7, 0xadadadad, 0x35353535, 0x85858585, + 0xe2e2e2e2, 0xf9f9f9f9, 0x37373737, 0xe8e8e8e8, + 0x1c1c1c1c, 0x75757575, 0xdfdfdfdf, 0x6e6e6e6e, + 0x47474747, 0xf1f1f1f1, 0x1a1a1a1a, 0x71717171, + 0x1d1d1d1d, 0x29292929, 0xc5c5c5c5, 0x89898989, + 0x6f6f6f6f, 0xb7b7b7b7, 0x62626262, 0x0e0e0e0e, + 0xaaaaaaaa, 0x18181818, 0xbebebebe, 0x1b1b1b1b, + 0xfcfcfcfc, 0x56565656, 0x3e3e3e3e, 0x4b4b4b4b, + 0xc6c6c6c6, 0xd2d2d2d2, 0x79797979, 0x20202020, + 0x9a9a9a9a, 0xdbdbdbdb, 0xc0c0c0c0, 0xfefefefe, + 0x78787878, 0xcdcdcdcd, 0x5a5a5a5a, 0xf4f4f4f4, + 0x1f1f1f1f, 0xdddddddd, 0xa8a8a8a8, 0x33333333, + 0x88888888, 0x07070707, 0xc7c7c7c7, 0x31313131, + 0xb1b1b1b1, 0x12121212, 0x10101010, 0x59595959, + 0x27272727, 0x80808080, 0xecececec, 0x5f5f5f5f, + 0x60606060, 0x51515151, 0x7f7f7f7f, 0xa9a9a9a9, + 0x19191919, 0xb5b5b5b5, 0x4a4a4a4a, 0x0d0d0d0d, + 0x2d2d2d2d, 0xe5e5e5e5, 0x7a7a7a7a, 0x9f9f9f9f, + 0x93939393, 0xc9c9c9c9, 0x9c9c9c9c, 0xefefefef, + 0xa0a0a0a0, 0xe0e0e0e0, 0x3b3b3b3b, 0x4d4d4d4d, + 0xaeaeaeae, 0x2a2a2a2a, 0xf5f5f5f5, 0xb0b0b0b0, + 0xc8c8c8c8, 0xebebebeb, 0xbbbbbbbb, 0x3c3c3c3c, + 0x83838383, 0x53535353, 0x99999999, 0x61616161, + 0x17171717, 0x2b2b2b2b, 0x04040404, 0x7e7e7e7e, + 0xbabababa, 0x77777777, 0xd6d6d6d6, 0x26262626, + 0xe1e1e1e1, 0x69696969, 0x14141414, 0x63636363, + 0x55555555, 0x21212121, 0x0c0c0c0c, 0x7d7d7d7d, +}; + +__constant u32 rcon[] = +{ + 0x01000000, 0x02000000, 0x04000000, 0x08000000, + 0x10000000, 0x20000000, 0x40000000, 0x80000000, + 0x1b000000, 0x36000000, +}; + +static void AES256_ExpandKey (u32 *userkey, u32 *rek, __local u32 s_te0[256], __local u32 s_te1[256], __local u32 s_te2[256], __local u32 s_te3[256], __local u32 s_te4[256]) +{ + rek[0] = userkey[0]; + rek[1] = userkey[1]; + rek[2] = userkey[2]; + rek[3] = userkey[3]; + rek[4] = userkey[4]; + rek[5] = userkey[5]; + rek[6] = userkey[6]; + rek[7] = userkey[7]; + + int i; + int j; + + i = 0; + j = 0; + + u32 run = 1; + + while (run) + { + u32 temp = rek[j + 7]; + + rek[j + 8] = rek[j + 0] + ^ (s_te2[(temp >> 16) & 0xff] & 0xff000000) + ^ (s_te3[(temp >> 8) & 0xff] & 0x00ff0000) + ^ (s_te0[(temp >> 0) & 0xff] & 0x0000ff00) + ^ (s_te1[(temp >> 24) & 0xff] & 0x000000ff) + ^ rcon[i]; + + rek[j + 9] = rek[j + 1] ^ rek[j + 8]; + rek[j + 10] = rek[j + 2] ^ rek[j + 9]; + rek[j + 11] = rek[j + 3] ^ rek[j + 10]; + + if (++i == 7) + { + run = 0; + continue; + } + + temp = rek[j + 11]; + + rek[j + 12] = rek[j + 4] + ^ (s_te2[(temp >> 24) & 0xff] & 0xff000000) + ^ (s_te3[(temp >> 16) & 0xff] & 0x00ff0000) + ^ (s_te0[(temp >> 8) & 0xff] & 0x0000ff00) + ^ (s_te1[(temp >> 0) & 0xff] & 0x000000ff); + + rek[j + 13] = rek[j + 5] ^ rek[j + 12]; + rek[j + 14] = rek[j + 6] ^ rek[j + 13]; + rek[j + 15] = rek[j + 7] ^ rek[j + 14]; + + j += 8; + } +} + +static void AES256_InvertKey (u32 *rdk, __local u32 s_td0[256], __local u32 s_td1[256], __local u32 s_td2[256], __local u32 s_td3[256], __local u32 s_td4[256], __local u32 s_te0[256], __local u32 s_te1[256], __local u32 s_te2[256], __local u32 s_te3[256], __local u32 s_te4[256]) +{ + for (u32 i = 0, j = 56; i < j; i += 4, j -= 4) + { + u32 temp; + + temp = rdk[i + 0]; rdk[i + 0] = rdk[j + 0]; rdk[j + 0] = temp; + temp = rdk[i + 1]; rdk[i + 1] = rdk[j + 1]; rdk[j + 1] = temp; + temp = rdk[i + 2]; rdk[i + 2] = rdk[j + 2]; rdk[j + 2] = temp; + temp = rdk[i + 3]; rdk[i + 3] = rdk[j + 3]; rdk[j + 3] = temp; + } + + for (u32 i = 1, j = 4; i < 14; i += 1, j += 4) + { + rdk[j + 0] = + s_td0[s_te1[(rdk[j + 0] >> 24) & 0xff] & 0xff] ^ + s_td1[s_te1[(rdk[j + 0] >> 16) & 0xff] & 0xff] ^ + s_td2[s_te1[(rdk[j + 0] >> 8) & 0xff] & 0xff] ^ + s_td3[s_te1[(rdk[j + 0] >> 0) & 0xff] & 0xff]; + + rdk[j + 1] = + s_td0[s_te1[(rdk[j + 1] >> 24) & 0xff] & 0xff] ^ + s_td1[s_te1[(rdk[j + 1] >> 16) & 0xff] & 0xff] ^ + s_td2[s_te1[(rdk[j + 1] >> 8) & 0xff] & 0xff] ^ + s_td3[s_te1[(rdk[j + 1] >> 0) & 0xff] & 0xff]; + + rdk[j + 2] = + s_td0[s_te1[(rdk[j + 2] >> 24) & 0xff] & 0xff] ^ + s_td1[s_te1[(rdk[j + 2] >> 16) & 0xff] & 0xff] ^ + s_td2[s_te1[(rdk[j + 2] >> 8) & 0xff] & 0xff] ^ + s_td3[s_te1[(rdk[j + 2] >> 0) & 0xff] & 0xff]; + + rdk[j + 3] = + s_td0[s_te1[(rdk[j + 3] >> 24) & 0xff] & 0xff] ^ + s_td1[s_te1[(rdk[j + 3] >> 16) & 0xff] & 0xff] ^ + s_td2[s_te1[(rdk[j + 3] >> 8) & 0xff] & 0xff] ^ + s_td3[s_te1[(rdk[j + 3] >> 0) & 0xff] & 0xff]; + } +} + +static void AES256_decrypt (const u32 *in, u32 *out, const u32 *rdk, __local u32 s_td0[256], __local u32 s_td1[256], __local u32 s_td2[256], __local u32 s_td3[256], __local u32 s_td4[256]) +{ + u32 s0 = in[0] ^ rdk[0]; + u32 s1 = in[1] ^ rdk[1]; + u32 s2 = in[2] ^ rdk[2]; + u32 s3 = in[3] ^ rdk[3]; + + u32 t0; + u32 t1; + u32 t2; + u32 t3; + + t0 = s_td0[s0 >> 24] ^ s_td1[(s3 >> 16) & 0xff] ^ s_td2[(s2 >> 8) & 0xff] ^ s_td3[s1 & 0xff] ^ rdk[ 4]; + t1 = s_td0[s1 >> 24] ^ s_td1[(s0 >> 16) & 0xff] ^ s_td2[(s3 >> 8) & 0xff] ^ s_td3[s2 & 0xff] ^ rdk[ 5]; + t2 = s_td0[s2 >> 24] ^ s_td1[(s1 >> 16) & 0xff] ^ s_td2[(s0 >> 8) & 0xff] ^ s_td3[s3 & 0xff] ^ rdk[ 6]; + t3 = s_td0[s3 >> 24] ^ s_td1[(s2 >> 16) & 0xff] ^ s_td2[(s1 >> 8) & 0xff] ^ s_td3[s0 & 0xff] ^ rdk[ 7]; + s0 = s_td0[t0 >> 24] ^ s_td1[(t3 >> 16) & 0xff] ^ s_td2[(t2 >> 8) & 0xff] ^ s_td3[t1 & 0xff] ^ rdk[ 8]; + s1 = s_td0[t1 >> 24] ^ s_td1[(t0 >> 16) & 0xff] ^ s_td2[(t3 >> 8) & 0xff] ^ s_td3[t2 & 0xff] ^ rdk[ 9]; + s2 = s_td0[t2 >> 24] ^ s_td1[(t1 >> 16) & 0xff] ^ s_td2[(t0 >> 8) & 0xff] ^ s_td3[t3 & 0xff] ^ rdk[10]; + s3 = s_td0[t3 >> 24] ^ s_td1[(t2 >> 16) & 0xff] ^ s_td2[(t1 >> 8) & 0xff] ^ s_td3[t0 & 0xff] ^ rdk[11]; + t0 = s_td0[s0 >> 24] ^ s_td1[(s3 >> 16) & 0xff] ^ s_td2[(s2 >> 8) & 0xff] ^ s_td3[s1 & 0xff] ^ rdk[12]; + t1 = s_td0[s1 >> 24] ^ s_td1[(s0 >> 16) & 0xff] ^ s_td2[(s3 >> 8) & 0xff] ^ s_td3[s2 & 0xff] ^ rdk[13]; + t2 = s_td0[s2 >> 24] ^ s_td1[(s1 >> 16) & 0xff] ^ s_td2[(s0 >> 8) & 0xff] ^ s_td3[s3 & 0xff] ^ rdk[14]; + t3 = s_td0[s3 >> 24] ^ s_td1[(s2 >> 16) & 0xff] ^ s_td2[(s1 >> 8) & 0xff] ^ s_td3[s0 & 0xff] ^ rdk[15]; + s0 = s_td0[t0 >> 24] ^ s_td1[(t3 >> 16) & 0xff] ^ s_td2[(t2 >> 8) & 0xff] ^ s_td3[t1 & 0xff] ^ rdk[16]; + s1 = s_td0[t1 >> 24] ^ s_td1[(t0 >> 16) & 0xff] ^ s_td2[(t3 >> 8) & 0xff] ^ s_td3[t2 & 0xff] ^ rdk[17]; + s2 = s_td0[t2 >> 24] ^ s_td1[(t1 >> 16) & 0xff] ^ s_td2[(t0 >> 8) & 0xff] ^ s_td3[t3 & 0xff] ^ rdk[18]; + s3 = s_td0[t3 >> 24] ^ s_td1[(t2 >> 16) & 0xff] ^ s_td2[(t1 >> 8) & 0xff] ^ s_td3[t0 & 0xff] ^ rdk[19]; + t0 = s_td0[s0 >> 24] ^ s_td1[(s3 >> 16) & 0xff] ^ s_td2[(s2 >> 8) & 0xff] ^ s_td3[s1 & 0xff] ^ rdk[20]; + t1 = s_td0[s1 >> 24] ^ s_td1[(s0 >> 16) & 0xff] ^ s_td2[(s3 >> 8) & 0xff] ^ s_td3[s2 & 0xff] ^ rdk[21]; + t2 = s_td0[s2 >> 24] ^ s_td1[(s1 >> 16) & 0xff] ^ s_td2[(s0 >> 8) & 0xff] ^ s_td3[s3 & 0xff] ^ rdk[22]; + t3 = s_td0[s3 >> 24] ^ s_td1[(s2 >> 16) & 0xff] ^ s_td2[(s1 >> 8) & 0xff] ^ s_td3[s0 & 0xff] ^ rdk[23]; + s0 = s_td0[t0 >> 24] ^ s_td1[(t3 >> 16) & 0xff] ^ s_td2[(t2 >> 8) & 0xff] ^ s_td3[t1 & 0xff] ^ rdk[24]; + s1 = s_td0[t1 >> 24] ^ s_td1[(t0 >> 16) & 0xff] ^ s_td2[(t3 >> 8) & 0xff] ^ s_td3[t2 & 0xff] ^ rdk[25]; + s2 = s_td0[t2 >> 24] ^ s_td1[(t1 >> 16) & 0xff] ^ s_td2[(t0 >> 8) & 0xff] ^ s_td3[t3 & 0xff] ^ rdk[26]; + s3 = s_td0[t3 >> 24] ^ s_td1[(t2 >> 16) & 0xff] ^ s_td2[(t1 >> 8) & 0xff] ^ s_td3[t0 & 0xff] ^ rdk[27]; + t0 = s_td0[s0 >> 24] ^ s_td1[(s3 >> 16) & 0xff] ^ s_td2[(s2 >> 8) & 0xff] ^ s_td3[s1 & 0xff] ^ rdk[28]; + t1 = s_td0[s1 >> 24] ^ s_td1[(s0 >> 16) & 0xff] ^ s_td2[(s3 >> 8) & 0xff] ^ s_td3[s2 & 0xff] ^ rdk[29]; + t2 = s_td0[s2 >> 24] ^ s_td1[(s1 >> 16) & 0xff] ^ s_td2[(s0 >> 8) & 0xff] ^ s_td3[s3 & 0xff] ^ rdk[30]; + t3 = s_td0[s3 >> 24] ^ s_td1[(s2 >> 16) & 0xff] ^ s_td2[(s1 >> 8) & 0xff] ^ s_td3[s0 & 0xff] ^ rdk[31]; + s0 = s_td0[t0 >> 24] ^ s_td1[(t3 >> 16) & 0xff] ^ s_td2[(t2 >> 8) & 0xff] ^ s_td3[t1 & 0xff] ^ rdk[32]; + s1 = s_td0[t1 >> 24] ^ s_td1[(t0 >> 16) & 0xff] ^ s_td2[(t3 >> 8) & 0xff] ^ s_td3[t2 & 0xff] ^ rdk[33]; + s2 = s_td0[t2 >> 24] ^ s_td1[(t1 >> 16) & 0xff] ^ s_td2[(t0 >> 8) & 0xff] ^ s_td3[t3 & 0xff] ^ rdk[34]; + s3 = s_td0[t3 >> 24] ^ s_td1[(t2 >> 16) & 0xff] ^ s_td2[(t1 >> 8) & 0xff] ^ s_td3[t0 & 0xff] ^ rdk[35]; + t0 = s_td0[s0 >> 24] ^ s_td1[(s3 >> 16) & 0xff] ^ s_td2[(s2 >> 8) & 0xff] ^ s_td3[s1 & 0xff] ^ rdk[36]; + t1 = s_td0[s1 >> 24] ^ s_td1[(s0 >> 16) & 0xff] ^ s_td2[(s3 >> 8) & 0xff] ^ s_td3[s2 & 0xff] ^ rdk[37]; + t2 = s_td0[s2 >> 24] ^ s_td1[(s1 >> 16) & 0xff] ^ s_td2[(s0 >> 8) & 0xff] ^ s_td3[s3 & 0xff] ^ rdk[38]; + t3 = s_td0[s3 >> 24] ^ s_td1[(s2 >> 16) & 0xff] ^ s_td2[(s1 >> 8) & 0xff] ^ s_td3[s0 & 0xff] ^ rdk[39]; + s0 = s_td0[t0 >> 24] ^ s_td1[(t3 >> 16) & 0xff] ^ s_td2[(t2 >> 8) & 0xff] ^ s_td3[t1 & 0xff] ^ rdk[40]; + s1 = s_td0[t1 >> 24] ^ s_td1[(t0 >> 16) & 0xff] ^ s_td2[(t3 >> 8) & 0xff] ^ s_td3[t2 & 0xff] ^ rdk[41]; + s2 = s_td0[t2 >> 24] ^ s_td1[(t1 >> 16) & 0xff] ^ s_td2[(t0 >> 8) & 0xff] ^ s_td3[t3 & 0xff] ^ rdk[42]; + s3 = s_td0[t3 >> 24] ^ s_td1[(t2 >> 16) & 0xff] ^ s_td2[(t1 >> 8) & 0xff] ^ s_td3[t0 & 0xff] ^ rdk[43]; + t0 = s_td0[s0 >> 24] ^ s_td1[(s3 >> 16) & 0xff] ^ s_td2[(s2 >> 8) & 0xff] ^ s_td3[s1 & 0xff] ^ rdk[44]; + t1 = s_td0[s1 >> 24] ^ s_td1[(s0 >> 16) & 0xff] ^ s_td2[(s3 >> 8) & 0xff] ^ s_td3[s2 & 0xff] ^ rdk[45]; + t2 = s_td0[s2 >> 24] ^ s_td1[(s1 >> 16) & 0xff] ^ s_td2[(s0 >> 8) & 0xff] ^ s_td3[s3 & 0xff] ^ rdk[46]; + t3 = s_td0[s3 >> 24] ^ s_td1[(s2 >> 16) & 0xff] ^ s_td2[(s1 >> 8) & 0xff] ^ s_td3[s0 & 0xff] ^ rdk[47]; + s0 = s_td0[t0 >> 24] ^ s_td1[(t3 >> 16) & 0xff] ^ s_td2[(t2 >> 8) & 0xff] ^ s_td3[t1 & 0xff] ^ rdk[48]; + s1 = s_td0[t1 >> 24] ^ s_td1[(t0 >> 16) & 0xff] ^ s_td2[(t3 >> 8) & 0xff] ^ s_td3[t2 & 0xff] ^ rdk[49]; + s2 = s_td0[t2 >> 24] ^ s_td1[(t1 >> 16) & 0xff] ^ s_td2[(t0 >> 8) & 0xff] ^ s_td3[t3 & 0xff] ^ rdk[50]; + s3 = s_td0[t3 >> 24] ^ s_td1[(t2 >> 16) & 0xff] ^ s_td2[(t1 >> 8) & 0xff] ^ s_td3[t0 & 0xff] ^ rdk[51]; + t0 = s_td0[s0 >> 24] ^ s_td1[(s3 >> 16) & 0xff] ^ s_td2[(s2 >> 8) & 0xff] ^ s_td3[s1 & 0xff] ^ rdk[52]; + t1 = s_td0[s1 >> 24] ^ s_td1[(s0 >> 16) & 0xff] ^ s_td2[(s3 >> 8) & 0xff] ^ s_td3[s2 & 0xff] ^ rdk[53]; + t2 = s_td0[s2 >> 24] ^ s_td1[(s1 >> 16) & 0xff] ^ s_td2[(s0 >> 8) & 0xff] ^ s_td3[s3 & 0xff] ^ rdk[54]; + t3 = s_td0[s3 >> 24] ^ s_td1[(s2 >> 16) & 0xff] ^ s_td2[(s1 >> 8) & 0xff] ^ s_td3[s0 & 0xff] ^ rdk[55]; + + out[0] = (s_td4[(t0 >> 24) & 0xff] & 0xff000000) + ^ (s_td4[(t3 >> 16) & 0xff] & 0x00ff0000) + ^ (s_td4[(t2 >> 8) & 0xff] & 0x0000ff00) + ^ (s_td4[(t1 >> 0) & 0xff] & 0x000000ff) + ^ rdk[56]; + + out[1] = (s_td4[(t1 >> 24) & 0xff] & 0xff000000) + ^ (s_td4[(t0 >> 16) & 0xff] & 0x00ff0000) + ^ (s_td4[(t3 >> 8) & 0xff] & 0x0000ff00) + ^ (s_td4[(t2 >> 0) & 0xff] & 0x000000ff) + ^ rdk[57]; + + out[2] = (s_td4[(t2 >> 24) & 0xff] & 0xff000000) + ^ (s_td4[(t1 >> 16) & 0xff] & 0x00ff0000) + ^ (s_td4[(t0 >> 8) & 0xff] & 0x0000ff00) + ^ (s_td4[(t3 >> 0) & 0xff] & 0x000000ff) + ^ rdk[58]; + + out[3] = (s_td4[(t3 >> 24) & 0xff] & 0xff000000) + ^ (s_td4[(t2 >> 16) & 0xff] & 0x00ff0000) + ^ (s_td4[(t1 >> 8) & 0xff] & 0x0000ff00) + ^ (s_td4[(t0 >> 0) & 0xff] & 0x000000ff) + ^ rdk[59]; +} + +__constant u32 k_sha256[64] = +{ + SHA256C00, SHA256C01, SHA256C02, SHA256C03, + SHA256C04, SHA256C05, SHA256C06, SHA256C07, + SHA256C08, SHA256C09, SHA256C0a, SHA256C0b, + SHA256C0c, SHA256C0d, SHA256C0e, SHA256C0f, + SHA256C10, SHA256C11, SHA256C12, SHA256C13, + SHA256C14, SHA256C15, SHA256C16, SHA256C17, + SHA256C18, SHA256C19, SHA256C1a, SHA256C1b, + SHA256C1c, SHA256C1d, SHA256C1e, SHA256C1f, + SHA256C20, SHA256C21, SHA256C22, SHA256C23, + SHA256C24, SHA256C25, SHA256C26, SHA256C27, + SHA256C28, SHA256C29, SHA256C2a, SHA256C2b, + SHA256C2c, SHA256C2d, SHA256C2e, SHA256C2f, + SHA256C30, SHA256C31, SHA256C32, SHA256C33, + SHA256C34, SHA256C35, SHA256C36, SHA256C37, + SHA256C38, SHA256C39, SHA256C3a, SHA256C3b, + SHA256C3c, SHA256C3d, SHA256C3e, SHA256C3f, +}; + +static void sha256_transform (const u32x w[16], u32x digest[8]) +{ + u32x a = digest[0]; + u32x b = digest[1]; + u32x c = digest[2]; + u32x d = digest[3]; + u32x e = digest[4]; + u32x f = digest[5]; + u32x g = digest[6]; + u32x h = digest[7]; + + u32x w0_t = swap_workaround (w[ 0]); + u32x w1_t = swap_workaround (w[ 1]); + u32x w2_t = swap_workaround (w[ 2]); + u32x w3_t = swap_workaround (w[ 3]); + u32x w4_t = swap_workaround (w[ 4]); + u32x w5_t = swap_workaround (w[ 5]); + u32x w6_t = swap_workaround (w[ 6]); + u32x w7_t = swap_workaround (w[ 7]); + u32x w8_t = swap_workaround (w[ 8]); + u32x w9_t = swap_workaround (w[ 9]); + u32x wa_t = swap_workaround (w[10]); + u32x wb_t = swap_workaround (w[11]); + u32x wc_t = swap_workaround (w[12]); + u32x wd_t = swap_workaround (w[13]); + u32x we_t = swap_workaround (w[14]); + u32x wf_t = swap_workaround (w[15]); + + #define ROUND_EXPAND() \ + { \ + w0_t = SHA256_EXPAND (we_t, w9_t, w1_t, w0_t); \ + w1_t = SHA256_EXPAND (wf_t, wa_t, w2_t, w1_t); \ + w2_t = SHA256_EXPAND (w0_t, wb_t, w3_t, w2_t); \ + w3_t = SHA256_EXPAND (w1_t, wc_t, w4_t, w3_t); \ + w4_t = SHA256_EXPAND (w2_t, wd_t, w5_t, w4_t); \ + w5_t = SHA256_EXPAND (w3_t, we_t, w6_t, w5_t); \ + w6_t = SHA256_EXPAND (w4_t, wf_t, w7_t, w6_t); \ + w7_t = SHA256_EXPAND (w5_t, w0_t, w8_t, w7_t); \ + w8_t = SHA256_EXPAND (w6_t, w1_t, w9_t, w8_t); \ + w9_t = SHA256_EXPAND (w7_t, w2_t, wa_t, w9_t); \ + wa_t = SHA256_EXPAND (w8_t, w3_t, wb_t, wa_t); \ + wb_t = SHA256_EXPAND (w9_t, w4_t, wc_t, wb_t); \ + wc_t = SHA256_EXPAND (wa_t, w5_t, wd_t, wc_t); \ + wd_t = SHA256_EXPAND (wb_t, w6_t, we_t, wd_t); \ + we_t = SHA256_EXPAND (wc_t, w7_t, wf_t, we_t); \ + wf_t = SHA256_EXPAND (wd_t, w8_t, w0_t, wf_t); \ + } + + #define ROUND_STEP(i) \ + { \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, k_sha256[i + 0]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, k_sha256[i + 1]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, k_sha256[i + 2]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, k_sha256[i + 3]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, k_sha256[i + 4]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, k_sha256[i + 5]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, k_sha256[i + 6]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, k_sha256[i + 7]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, k_sha256[i + 8]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, k_sha256[i + 9]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, k_sha256[i + 10]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, k_sha256[i + 11]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, k_sha256[i + 12]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, k_sha256[i + 13]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, k_sha256[i + 14]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, k_sha256[i + 15]); \ + } + + ROUND_STEP (0); + + #pragma unroll + for (int i = 16; i < 64; i += 16) + { + ROUND_EXPAND (); ROUND_STEP (i); + } + + digest[0] += a; + digest[1] += b; + digest[2] += c; + digest[3] += d; + digest[4] += e; + digest[5] += f; + digest[6] += g; + digest[7] += h; +} + +__constant u32 crc32tab[0x100] = +{ + 0x00000000, 0x77073096, 0xee0e612c, 0x990951ba, + 0x076dc419, 0x706af48f, 0xe963a535, 0x9e6495a3, + 0x0edb8832, 0x79dcb8a4, 0xe0d5e91e, 0x97d2d988, + 0x09b64c2b, 0x7eb17cbd, 0xe7b82d07, 0x90bf1d91, + 0x1db71064, 0x6ab020f2, 0xf3b97148, 0x84be41de, + 0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7, + 0x136c9856, 0x646ba8c0, 0xfd62f97a, 0x8a65c9ec, + 0x14015c4f, 0x63066cd9, 0xfa0f3d63, 0x8d080df5, + 0x3b6e20c8, 0x4c69105e, 0xd56041e4, 0xa2677172, + 0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b, + 0x35b5a8fa, 0x42b2986c, 0xdbbbc9d6, 0xacbcf940, + 0x32d86ce3, 0x45df5c75, 0xdcd60dcf, 0xabd13d59, + 0x26d930ac, 0x51de003a, 0xc8d75180, 0xbfd06116, + 0x21b4f4b5, 0x56b3c423, 0xcfba9599, 0xb8bda50f, + 0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924, + 0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d, + 0x76dc4190, 0x01db7106, 0x98d220bc, 0xefd5102a, + 0x71b18589, 0x06b6b51f, 0x9fbfe4a5, 0xe8b8d433, + 0x7807c9a2, 0x0f00f934, 0x9609a88e, 0xe10e9818, + 0x7f6a0dbb, 0x086d3d2d, 0x91646c97, 0xe6635c01, + 0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e, + 0x6c0695ed, 0x1b01a57b, 0x8208f4c1, 0xf50fc457, + 0x65b0d9c6, 0x12b7e950, 0x8bbeb8ea, 0xfcb9887c, + 0x62dd1ddf, 0x15da2d49, 0x8cd37cf3, 0xfbd44c65, + 0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2, + 0x4adfa541, 0x3dd895d7, 0xa4d1c46d, 0xd3d6f4fb, + 0x4369e96a, 0x346ed9fc, 0xad678846, 0xda60b8d0, + 0x44042d73, 0x33031de5, 0xaa0a4c5f, 0xdd0d7cc9, + 0x5005713c, 0x270241aa, 0xbe0b1010, 0xc90c2086, + 0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f, + 0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4, + 0x59b33d17, 0x2eb40d81, 0xb7bd5c3b, 0xc0ba6cad, + 0xedb88320, 0x9abfb3b6, 0x03b6e20c, 0x74b1d29a, + 0xead54739, 0x9dd277af, 0x04db2615, 0x73dc1683, + 0xe3630b12, 0x94643b84, 0x0d6d6a3e, 0x7a6a5aa8, + 0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1, + 0xf00f9344, 0x8708a3d2, 0x1e01f268, 0x6906c2fe, + 0xf762575d, 0x806567cb, 0x196c3671, 0x6e6b06e7, + 0xfed41b76, 0x89d32be0, 0x10da7a5a, 0x67dd4acc, + 0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5, + 0xd6d6a3e8, 0xa1d1937e, 0x38d8c2c4, 0x4fdff252, + 0xd1bb67f1, 0xa6bc5767, 0x3fb506dd, 0x48b2364b, + 0xd80d2bda, 0xaf0a1b4c, 0x36034af6, 0x41047a60, + 0xdf60efc3, 0xa867df55, 0x316e8eef, 0x4669be79, + 0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236, + 0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f, + 0xc5ba3bbe, 0xb2bd0b28, 0x2bb45a92, 0x5cb36a04, + 0xc2d7ffa7, 0xb5d0cf31, 0x2cd99e8b, 0x5bdeae1d, + 0x9b64c2b0, 0xec63f226, 0x756aa39c, 0x026d930a, + 0x9c0906a9, 0xeb0e363f, 0x72076785, 0x05005713, + 0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38, + 0x92d28e9b, 0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21, + 0x86d3d2d4, 0xf1d4e242, 0x68ddb3f8, 0x1fda836e, + 0x81be16cd, 0xf6b9265b, 0x6fb077e1, 0x18b74777, + 0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c, + 0x8f659eff, 0xf862ae69, 0x616bffd3, 0x166ccf45, + 0xa00ae278, 0xd70dd2ee, 0x4e048354, 0x3903b3c2, + 0xa7672661, 0xd06016f7, 0x4969474d, 0x3e6e77db, + 0xaed16a4a, 0xd9d65adc, 0x40df0b66, 0x37d83bf0, + 0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9, + 0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6, + 0xbad03605, 0xcdd70693, 0x54de5729, 0x23d967bf, + 0xb3667a2e, 0xc4614ab8, 0x5d681b02, 0x2a6f2b94, + 0xb40bbe37, 0xc30c8ea1, 0x5a05df1b, 0x2d02ef8d +}; + +static u32x round_crc32 (u32x a, const u32x v) +{ + const u32x k = (a ^ v) & 0xff; + + const u32x s = a >> 8; + + #ifdef VECT_SIZE1 + a = crc32tab[k]; + #endif + + #ifdef VECT_SIZE2 + a.s0 = crc32tab[k.s0]; + a.s1 = crc32tab[k.s1]; + #endif + + #ifdef VECT_SIZE4 + a.s0 = crc32tab[k.s0]; + a.s1 = crc32tab[k.s1]; + a.s2 = crc32tab[k.s2]; + a.s3 = crc32tab[k.s3]; + #endif + + a ^= s; + + return a; +} + +static u32x crc32 (const u32x w[16], const u32 pw_len, const u32 iv) +{ + u32x a = iv ^ ~0; + + if (pw_len >= 1) a = round_crc32 (a, w[0] >> 0); + if (pw_len >= 2) a = round_crc32 (a, w[0] >> 8); + if (pw_len >= 3) a = round_crc32 (a, w[0] >> 16); + if (pw_len >= 4) a = round_crc32 (a, w[0] >> 24); + + for (u32 i = 4, j = 1; i < pw_len; i += 4, j += 1) + { + if (pw_len >= (i + 1)) a = round_crc32 (a, w[j] >> 0); + if (pw_len >= (i + 2)) a = round_crc32 (a, w[j] >> 8); + if (pw_len >= (i + 3)) a = round_crc32 (a, w[j] >> 16); + if (pw_len >= (i + 4)) a = round_crc32 (a, w[j] >> 24); + } + + return ~a; +} + +static void bzero16 (u32x block[16]) +{ + block[ 0] = 0; + block[ 1] = 0; + block[ 2] = 0; + block[ 3] = 0; + block[ 4] = 0; + block[ 5] = 0; + block[ 6] = 0; + block[ 7] = 0; + block[ 8] = 0; + block[ 9] = 0; + block[10] = 0; + block[11] = 0; + block[12] = 0; + block[13] = 0; + block[14] = 0; + block[15] = 0; +} + +static u32 memcat8c (u32x block[16], const u32 block_len, const u32x append[2], const u32 append_len, u32x digest[8]) +{ + const u32 mod = block_len & 3; + const u32 div = block_len / 4; + + u32x tmp0; + u32x tmp1; + u32x tmp2; + + const int offset_minus_4 = 4 - block_len; + + tmp0 = amd_bytealign (append[0], 0, offset_minus_4); + tmp1 = amd_bytealign (append[1], append[0], offset_minus_4); + tmp2 = amd_bytealign ( 0, append[1], offset_minus_4); + + if (mod == 0) + { + tmp0 = tmp1; + tmp1 = tmp2; + tmp2 = 0; + } + + u32x carry[2] = { 0, 0 }; + + switch (div) + { + case 0: block[ 0] |= tmp0; + block[ 1] = tmp1; + block[ 2] = tmp2; + break; + case 1: block[ 1] |= tmp0; + block[ 2] = tmp1; + block[ 3] = tmp2; + break; + case 2: block[ 2] |= tmp0; + block[ 3] = tmp1; + block[ 4] = tmp2; + break; + case 3: block[ 3] |= tmp0; + block[ 4] = tmp1; + block[ 5] = tmp2; + break; + case 4: block[ 4] |= tmp0; + block[ 5] = tmp1; + block[ 6] = tmp2; + break; + case 5: block[ 5] |= tmp0; + block[ 6] = tmp1; + block[ 7] = tmp2; + break; + case 6: block[ 6] |= tmp0; + block[ 7] = tmp1; + block[ 8] = tmp2; + break; + case 7: block[ 7] |= tmp0; + block[ 8] = tmp1; + block[ 9] = tmp2; + break; + case 8: block[ 8] |= tmp0; + block[ 9] = tmp1; + block[10] = tmp2; + break; + case 9: block[ 9] |= tmp0; + block[10] = tmp1; + block[11] = tmp2; + break; + case 10: block[10] |= tmp0; + block[11] = tmp1; + block[12] = tmp2; + break; + case 11: block[11] |= tmp0; + block[12] = tmp1; + block[13] = tmp2; + break; + case 12: block[12] |= tmp0; + block[13] = tmp1; + block[14] = tmp2; + break; + case 13: block[13] |= tmp0; + block[14] = tmp1; + block[15] = tmp2; + break; + case 14: block[14] |= tmp0; + block[15] = tmp1; + carry[ 0] = tmp2; + break; + case 15: block[15] |= tmp0; + carry[ 0] = tmp1; + carry[ 1] = tmp2; + break; + } + + u32 new_len = block_len + append_len; + + if (new_len >= 64) + { + new_len -= 64; + + sha256_transform (block, digest); + + bzero16 (block); + + block[0] = carry[0]; + block[1] = carry[1]; + } + + return new_len; +} + +static u32 memcat32c (u32x block[16], const u32 block_len, const u32x append[8], const u32 append_len, u32x digest[8]) +{ + const u32 mod = block_len & 3; + const u32 div = block_len / 4; + + u32x tmp0; + u32x tmp1; + u32x tmp2; + u32x tmp3; + u32x tmp4; + u32x tmp5; + u32x tmp6; + u32x tmp7; + u32x tmp8; + + const int offset_minus_4 = 4 - block_len; + + tmp0 = amd_bytealign (append[0], 0, offset_minus_4); + tmp1 = amd_bytealign (append[1], append[0], offset_minus_4); + tmp2 = amd_bytealign (append[2], append[1], offset_minus_4); + tmp3 = amd_bytealign (append[3], append[2], offset_minus_4); + tmp4 = amd_bytealign (append[4], append[3], offset_minus_4); + tmp5 = amd_bytealign (append[5], append[4], offset_minus_4); + tmp6 = amd_bytealign (append[6], append[5], offset_minus_4); + tmp7 = amd_bytealign (append[7], append[6], offset_minus_4); + tmp8 = amd_bytealign ( 0, append[7], offset_minus_4); + + if (mod == 0) + { + tmp0 = tmp1; + tmp1 = tmp2; + tmp2 = tmp3; + tmp3 = tmp4; + tmp4 = tmp5; + tmp5 = tmp6; + tmp6 = tmp7; + tmp7 = tmp8; + tmp8 = 0; + } + + u32x carry[8] = { 0, 0, 0, 0, 0, 0, 0, 0 }; + + switch (div) + { + case 0: block[ 0] |= tmp0; + block[ 1] = tmp1; + block[ 2] = tmp2; + block[ 3] = tmp3; + block[ 4] = tmp4; + block[ 5] = tmp5; + block[ 6] = tmp6; + block[ 7] = tmp7; + block[ 8] = tmp8; + break; + case 1: block[ 1] |= tmp0; + block[ 2] = tmp1; + block[ 3] = tmp2; + block[ 4] = tmp3; + block[ 5] = tmp4; + block[ 6] = tmp5; + block[ 7] = tmp6; + block[ 8] = tmp7; + block[ 9] = tmp8; + break; + case 2: block[ 2] |= tmp0; + block[ 3] = tmp1; + block[ 4] = tmp2; + block[ 5] = tmp3; + block[ 6] = tmp4; + block[ 7] = tmp5; + block[ 8] = tmp6; + block[ 9] = tmp7; + block[10] = tmp8; + break; + case 3: block[ 3] |= tmp0; + block[ 4] = tmp1; + block[ 5] = tmp2; + block[ 6] = tmp3; + block[ 7] = tmp4; + block[ 8] = tmp5; + block[ 9] = tmp6; + block[10] = tmp7; + block[11] = tmp8; + break; + case 4: block[ 4] |= tmp0; + block[ 5] = tmp1; + block[ 6] = tmp2; + block[ 7] = tmp3; + block[ 8] = tmp4; + block[ 9] = tmp5; + block[10] = tmp6; + block[11] = tmp7; + block[12] = tmp8; + break; + case 5: block[ 5] |= tmp0; + block[ 6] = tmp1; + block[ 7] = tmp2; + block[ 8] = tmp3; + block[ 9] = tmp4; + block[10] = tmp5; + block[11] = tmp6; + block[12] = tmp7; + block[13] = tmp8; + break; + case 6: block[ 6] |= tmp0; + block[ 7] = tmp1; + block[ 8] = tmp2; + block[ 9] = tmp3; + block[10] = tmp4; + block[11] = tmp5; + block[12] = tmp6; + block[13] = tmp7; + block[14] = tmp8; + break; + case 7: block[ 7] |= tmp0; + block[ 8] = tmp1; + block[ 9] = tmp2; + block[10] = tmp3; + block[11] = tmp4; + block[12] = tmp5; + block[13] = tmp6; + block[14] = tmp7; + block[15] = tmp8; + break; + case 8: block[ 8] |= tmp0; + block[ 9] = tmp1; + block[10] = tmp2; + block[11] = tmp3; + block[12] = tmp4; + block[13] = tmp5; + block[14] = tmp6; + block[15] = tmp7; + carry[ 0] = tmp8; + break; + case 9: block[ 9] |= tmp0; + block[10] = tmp1; + block[11] = tmp2; + block[12] = tmp3; + block[13] = tmp4; + block[14] = tmp5; + block[15] = tmp6; + carry[ 0] = tmp7; + carry[ 1] = tmp8; + break; + case 10: block[10] |= tmp0; + block[11] = tmp1; + block[12] = tmp2; + block[13] = tmp3; + block[14] = tmp4; + block[15] = tmp5; + carry[ 0] = tmp6; + carry[ 1] = tmp7; + carry[ 2] = tmp8; + break; + case 11: block[11] |= tmp0; + block[12] = tmp1; + block[13] = tmp2; + block[14] = tmp3; + block[15] = tmp4; + carry[ 0] = tmp5; + carry[ 1] = tmp6; + carry[ 2] = tmp7; + carry[ 3] = tmp8; + break; + case 12: block[12] |= tmp0; + block[13] = tmp1; + block[14] = tmp2; + block[15] = tmp3; + carry[ 0] = tmp4; + carry[ 1] = tmp5; + carry[ 2] = tmp6; + carry[ 3] = tmp7; + carry[ 4] = tmp8; + break; + case 13: block[13] |= tmp0; + block[14] = tmp1; + block[15] = tmp2; + carry[ 0] = tmp3; + carry[ 1] = tmp4; + carry[ 2] = tmp5; + carry[ 3] = tmp6; + carry[ 4] = tmp7; + carry[ 5] = tmp8; + break; + case 14: block[14] |= tmp0; + block[15] = tmp1; + carry[ 0] = tmp2; + carry[ 1] = tmp3; + carry[ 2] = tmp4; + carry[ 3] = tmp5; + carry[ 4] = tmp6; + carry[ 5] = tmp7; + carry[ 6] = tmp8; + break; + case 15: block[15] |= tmp0; + carry[ 0] = tmp1; + carry[ 1] = tmp2; + carry[ 2] = tmp3; + carry[ 3] = tmp4; + carry[ 4] = tmp5; + carry[ 5] = tmp6; + carry[ 6] = tmp7; + carry[ 7] = tmp8; + break; + } + + u32 new_len = block_len + append_len; + + if (new_len >= 64) + { + new_len -= 64; + + sha256_transform (block, digest); + + bzero16 (block); + + block[0] = carry[0]; + block[1] = carry[1]; + block[2] = carry[2]; + block[3] = carry[3]; + block[4] = carry[4]; + block[5] = carry[5]; + block[6] = carry[6]; + block[7] = carry[7]; + } + + return new_len; +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m11600_init (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global seven_zip_tmp_t *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global seven_zip_t *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + /** + * algo starts here already + */ + + u32x dgst[8]; + + dgst[0] = SHA256M_A; + dgst[1] = SHA256M_B; + dgst[2] = SHA256M_C; + dgst[3] = SHA256M_D; + dgst[4] = SHA256M_E; + dgst[5] = SHA256M_F; + dgst[6] = SHA256M_G; + dgst[7] = SHA256M_H; + + u32x block[16]; + + bzero16 (block); + + u32 block_len = 0; + u32 final_len = 0; + + /** + * context save + */ + + tmps[gid].dgst[0] = dgst[0]; + tmps[gid].dgst[1] = dgst[1]; + tmps[gid].dgst[2] = dgst[2]; + tmps[gid].dgst[3] = dgst[3]; + tmps[gid].dgst[4] = dgst[4]; + tmps[gid].dgst[5] = dgst[5]; + tmps[gid].dgst[6] = dgst[6]; + tmps[gid].dgst[7] = dgst[7]; + + tmps[gid].block[ 0] = block[ 0]; + tmps[gid].block[ 1] = block[ 1]; + tmps[gid].block[ 2] = block[ 2]; + tmps[gid].block[ 3] = block[ 3]; + tmps[gid].block[ 4] = block[ 4]; + tmps[gid].block[ 5] = block[ 5]; + tmps[gid].block[ 6] = block[ 6]; + tmps[gid].block[ 7] = block[ 7]; + tmps[gid].block[ 8] = block[ 8]; + tmps[gid].block[ 9] = block[ 9]; + tmps[gid].block[10] = block[10]; + tmps[gid].block[11] = block[11]; + tmps[gid].block[12] = block[12]; + tmps[gid].block[13] = block[13]; + tmps[gid].block[14] = block[14]; + tmps[gid].block[15] = block[15]; + + tmps[gid].block_len = block_len; + tmps[gid].final_len = final_len; +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m11600_loop (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global seven_zip_tmp_t *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global seven_zip_t *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x pw[8]; + + pw[0] = pws[gid].i[ 0]; + pw[1] = pws[gid].i[ 1]; + pw[2] = pws[gid].i[ 2]; + pw[3] = pws[gid].i[ 3]; + pw[4] = 0; + pw[5] = 0; + pw[6] = 0; + pw[7] = 0; + + u32 pw_len = pws[gid].pw_len; + + make_unicode (&pw[0], &pw[0], &pw[4]); + + pw_len *= 2; + + /** + * context load + */ + + u32x dgst[8]; + + dgst[0] = tmps[gid].dgst[0]; + dgst[1] = tmps[gid].dgst[1]; + dgst[2] = tmps[gid].dgst[2]; + dgst[3] = tmps[gid].dgst[3]; + dgst[4] = tmps[gid].dgst[4]; + dgst[5] = tmps[gid].dgst[5]; + dgst[6] = tmps[gid].dgst[6]; + dgst[7] = tmps[gid].dgst[7]; + + u32x block[16]; + + block[ 0] = tmps[gid].block[ 0]; + block[ 1] = tmps[gid].block[ 1]; + block[ 2] = tmps[gid].block[ 2]; + block[ 3] = tmps[gid].block[ 3]; + block[ 4] = tmps[gid].block[ 4]; + block[ 5] = tmps[gid].block[ 5]; + block[ 6] = tmps[gid].block[ 6]; + block[ 7] = tmps[gid].block[ 7]; + block[ 8] = tmps[gid].block[ 8]; + block[ 9] = tmps[gid].block[ 9]; + block[10] = tmps[gid].block[10]; + block[11] = tmps[gid].block[11]; + block[12] = tmps[gid].block[12]; + block[13] = tmps[gid].block[13]; + block[14] = tmps[gid].block[14]; + block[15] = tmps[gid].block[15]; + + u32 block_len = tmps[gid].block_len; + u32 final_len = tmps[gid].final_len; + + /** + * base + */ + + for (u32 i = 0, j = loop_pos; i < loop_cnt; i++, j++) + { + u32 it[2]; + + it[0] = j; + it[1] = 0; + + block_len = memcat32c (block, block_len, pw, pw_len, dgst); final_len += pw_len; + block_len = memcat8c (block, block_len, it, 8, dgst); final_len += 8; + } + + /** + * context save + */ + + tmps[gid].dgst[0] = dgst[0]; + tmps[gid].dgst[1] = dgst[1]; + tmps[gid].dgst[2] = dgst[2]; + tmps[gid].dgst[3] = dgst[3]; + tmps[gid].dgst[4] = dgst[4]; + tmps[gid].dgst[5] = dgst[5]; + tmps[gid].dgst[6] = dgst[6]; + tmps[gid].dgst[7] = dgst[7]; + + tmps[gid].block[ 0] = block[ 0]; + tmps[gid].block[ 1] = block[ 1]; + tmps[gid].block[ 2] = block[ 2]; + tmps[gid].block[ 3] = block[ 3]; + tmps[gid].block[ 4] = block[ 4]; + tmps[gid].block[ 5] = block[ 5]; + tmps[gid].block[ 6] = block[ 6]; + tmps[gid].block[ 7] = block[ 7]; + tmps[gid].block[ 8] = block[ 8]; + tmps[gid].block[ 9] = block[ 9]; + tmps[gid].block[10] = block[10]; + tmps[gid].block[11] = block[11]; + tmps[gid].block[12] = block[12]; + tmps[gid].block[13] = block[13]; + tmps[gid].block[14] = block[14]; + tmps[gid].block[15] = block[15]; + + tmps[gid].block_len = block_len; + tmps[gid].final_len = final_len; +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m11600_comp (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global seven_zip_tmp_t *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global seven_zip_t *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + const u32 lid = get_local_id (0); + + /** + * aes shared + */ + + const u32 lid4 = lid * 4; + + __local u32 s_td0[256]; + __local u32 s_td1[256]; + __local u32 s_td2[256]; + __local u32 s_td3[256]; + __local u32 s_td4[256]; + + __local u32 s_te0[256]; + __local u32 s_te1[256]; + __local u32 s_te2[256]; + __local u32 s_te3[256]; + __local u32 s_te4[256]; + + s_td0[lid4 + 0] = td0[lid4 + 0]; + s_td0[lid4 + 1] = td0[lid4 + 1]; + s_td0[lid4 + 2] = td0[lid4 + 2]; + s_td0[lid4 + 3] = td0[lid4 + 3]; + + s_td1[lid4 + 0] = td1[lid4 + 0]; + s_td1[lid4 + 1] = td1[lid4 + 1]; + s_td1[lid4 + 2] = td1[lid4 + 2]; + s_td1[lid4 + 3] = td1[lid4 + 3]; + + s_td2[lid4 + 0] = td2[lid4 + 0]; + s_td2[lid4 + 1] = td2[lid4 + 1]; + s_td2[lid4 + 2] = td2[lid4 + 2]; + s_td2[lid4 + 3] = td2[lid4 + 3]; + + s_td3[lid4 + 0] = td3[lid4 + 0]; + s_td3[lid4 + 1] = td3[lid4 + 1]; + s_td3[lid4 + 2] = td3[lid4 + 2]; + s_td3[lid4 + 3] = td3[lid4 + 3]; + + s_td4[lid4 + 0] = td4[lid4 + 0]; + s_td4[lid4 + 1] = td4[lid4 + 1]; + s_td4[lid4 + 2] = td4[lid4 + 2]; + s_td4[lid4 + 3] = td4[lid4 + 3]; + + s_te0[lid4 + 0] = te0[lid4 + 0]; + s_te0[lid4 + 1] = te0[lid4 + 1]; + s_te0[lid4 + 2] = te0[lid4 + 2]; + s_te0[lid4 + 3] = te0[lid4 + 3]; + + s_te1[lid4 + 0] = te1[lid4 + 0]; + s_te1[lid4 + 1] = te1[lid4 + 1]; + s_te1[lid4 + 2] = te1[lid4 + 2]; + s_te1[lid4 + 3] = te1[lid4 + 3]; + + s_te2[lid4 + 0] = te2[lid4 + 0]; + s_te2[lid4 + 1] = te2[lid4 + 1]; + s_te2[lid4 + 2] = te2[lid4 + 2]; + s_te2[lid4 + 3] = te2[lid4 + 3]; + + s_te3[lid4 + 0] = te3[lid4 + 0]; + s_te3[lid4 + 1] = te3[lid4 + 1]; + s_te3[lid4 + 2] = te3[lid4 + 2]; + s_te3[lid4 + 3] = te3[lid4 + 3]; + + s_te4[lid4 + 0] = te4[lid4 + 0]; + s_te4[lid4 + 1] = te4[lid4 + 1]; + s_te4[lid4 + 2] = te4[lid4 + 2]; + s_te4[lid4 + 3] = te4[lid4 + 3]; + + barrier (CLK_LOCAL_MEM_FENCE); + + if (gid >= gid_max) return; + + /** + * context load + */ + + u32x dgst[8]; + + dgst[0] = tmps[gid].dgst[0]; + dgst[1] = tmps[gid].dgst[1]; + dgst[2] = tmps[gid].dgst[2]; + dgst[3] = tmps[gid].dgst[3]; + dgst[4] = tmps[gid].dgst[4]; + dgst[5] = tmps[gid].dgst[5]; + dgst[6] = tmps[gid].dgst[6]; + dgst[7] = tmps[gid].dgst[7]; + + u32x block[16]; + + block[ 0] = tmps[gid].block[ 0]; + block[ 1] = tmps[gid].block[ 1]; + block[ 2] = tmps[gid].block[ 2]; + block[ 3] = tmps[gid].block[ 3]; + block[ 4] = tmps[gid].block[ 4]; + block[ 5] = tmps[gid].block[ 5]; + block[ 6] = tmps[gid].block[ 6]; + block[ 7] = tmps[gid].block[ 7]; + block[ 8] = tmps[gid].block[ 8]; + block[ 9] = tmps[gid].block[ 9]; + block[10] = tmps[gid].block[10]; + block[11] = tmps[gid].block[11]; + block[12] = tmps[gid].block[12]; + block[13] = tmps[gid].block[13]; + block[14] = tmps[gid].block[14]; + block[15] = tmps[gid].block[15]; + + u32 block_len = tmps[gid].block_len; + u32 final_len = tmps[gid].final_len; + + append_0x80_4 (block, block_len); + + if (block_len >= 56) + { + sha256_transform (block, dgst); + + bzero16 (block); + } + + block[15] = swap_workaround (final_len * 8); + + sha256_transform (block, dgst); + + /** + * final key operations + */ + + u32 iv[4]; + + iv[0] = esalt_bufs[salt_pos].iv_buf[0]; + iv[1] = esalt_bufs[salt_pos].iv_buf[1]; + iv[2] = esalt_bufs[salt_pos].iv_buf[2]; + iv[3] = esalt_bufs[salt_pos].iv_buf[3]; + + u32x ukey[8]; + + ukey[0] = dgst[0]; + ukey[1] = dgst[1]; + ukey[2] = dgst[2]; + ukey[3] = dgst[3]; + ukey[4] = dgst[4]; + ukey[5] = dgst[5]; + ukey[6] = dgst[6]; + ukey[7] = dgst[7]; + + #define KEYLEN 60 + + u32 rk[KEYLEN]; + + AES256_ExpandKey (ukey, rk, s_te0, s_te1, s_te2, s_te3, s_te4); + + AES256_InvertKey (rk, s_td0, s_td1, s_td2, s_td3, s_td4, s_te0, s_te1, s_te2, s_te3, s_te4); + + u32 crc = 0; + + int data_len = esalt_bufs[salt_pos].data_len; + int unpack_size = esalt_bufs[salt_pos].unpack_size; + + int i; + int j; + + for (i = 0, j = 0; i < data_len - 16; i += 16, j += 4) + { + u32 data[4]; + + data[0] = swap_workaround (esalt_bufs[salt_pos].data_buf[j + 0]); + data[1] = swap_workaround (esalt_bufs[salt_pos].data_buf[j + 1]); + data[2] = swap_workaround (esalt_bufs[salt_pos].data_buf[j + 2]); + data[3] = swap_workaround (esalt_bufs[salt_pos].data_buf[j + 3]); + + u32 out[4]; + + AES256_decrypt (data, out, rk, s_td0, s_td1, s_td2, s_td3, s_td4); + + out[0] ^= iv[0]; + out[1] ^= iv[1]; + out[2] ^= iv[2]; + out[3] ^= iv[3]; + + iv[0] = data[0]; + iv[1] = data[1]; + iv[2] = data[2]; + iv[3] = data[3]; + + out[0] = swap_workaround (out[0]); + out[1] = swap_workaround (out[1]); + out[2] = swap_workaround (out[2]); + out[3] = swap_workaround (out[3]); + + crc = crc32 (out, 16, crc); + } + + u32 data[4]; + + data[0] = swap_workaround (esalt_bufs[salt_pos].data_buf[j + 0]); + data[1] = swap_workaround (esalt_bufs[salt_pos].data_buf[j + 1]); + data[2] = swap_workaround (esalt_bufs[salt_pos].data_buf[j + 2]); + data[3] = swap_workaround (esalt_bufs[salt_pos].data_buf[j + 3]); + + u32 out[4]; + + AES256_decrypt (data, out, rk, s_td0, s_td1, s_td2, s_td3, s_td4); + + out[0] ^= iv[0]; + out[1] ^= iv[1]; + out[2] ^= iv[2]; + out[3] ^= iv[3]; + + iv[0] = data[0]; + iv[1] = data[1]; + iv[2] = data[2]; + iv[3] = data[3]; + + out[0] = swap_workaround (out[0]); + out[1] = swap_workaround (out[1]); + out[2] = swap_workaround (out[2]); + out[3] = swap_workaround (out[3]); + + const u32 margin = data_len - unpack_size; + + const u32 left = 16 - margin; + + crc = crc32 (out, left, crc); + + // use padding attack in that case + + if (margin >= 4) + { + switch (margin) + { + case 15: out[0] &= 0xffffff00; + break; + case 14: out[0] &= 0xffff0000; + break; + case 13: out[0] &= 0xff000000; + break; + case 12: out[0] = 0; + break; + case 11: out[0] = 0; + out[1] &= 0xffffff00; + break; + case 10: out[0] = 0; + out[1] &= 0xffff0000; + break; + case 9: out[0] = 0; + out[1] &= 0xff000000; + break; + case 8: out[0] = 0; + out[1] = 0; + break; + case 7: out[0] = 0; + out[1] = 0; + out[2] &= 0xffffff00; + break; + case 6: out[0] = 0; + out[1] = 0; + out[2] &= 0xffff0000; + break; + case 5: out[0] = 0; + out[1] = 0; + out[2] &= 0xff000000; + break; + case 4: out[0] = 0; + out[1] = 0; + out[2] = 0; + break; + case 3: out[0] = 0; + out[1] = 0; + out[2] = 0; + out[3] &= 0xffffff00; + break; + case 2: out[0] = 0; + out[1] = 0; + out[2] = 0; + out[3] &= 0xffff0000; + break; + case 1: out[0] = 0; + out[1] = 0; + out[2] = 0; + out[3] &= 0xff000000; + break; + } + + if ((out[0] == 0) && (out[1] == 0) && (out[2] == 0) && (out[3] == 0)) + { + mark_hash_s0 (plains_buf, hashes_shown, digests_offset + 0, gid, 0); + + d_return_buf[lid] = 1; + } + } + + const u32x r0 = crc; + const u32x r1 = 0; + const u32x r2 = 0; + const u32x r3 = 0; + + #define il_pos 0 + + #include VECT_COMPARE_M +} diff --git a/amd/m11700_a0.cl b/amd/m11700_a0.cl new file mode 100644 index 0000000000..47f214b697 --- /dev/null +++ b/amd/m11700_a0.cl @@ -0,0 +1,2670 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _GOST2012_256_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW4 +#define VECT_SIZE1 +#endif + +#ifdef VLIW5 +#define VECT_SIZE1 +#endif + +#define DGST_R0 0 +#define DGST_R1 1 +#define DGST_R2 2 +#define DGST_R3 3 + +#include "include/kernel_functions.c" +#include "types_amd.c" +#include "common_amd.c" +#include "include/rp_gpu.h" +#include "rp_amd.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +#define INITVAL 0x0101010101010101 + +#define SBOG_LPSti64 \ + s_sbob_sl64[0][(t[0] >> (i * 8)) & 0xff] ^ \ + s_sbob_sl64[1][(t[1] >> (i * 8)) & 0xff] ^ \ + s_sbob_sl64[2][(t[2] >> (i * 8)) & 0xff] ^ \ + s_sbob_sl64[3][(t[3] >> (i * 8)) & 0xff] ^ \ + s_sbob_sl64[4][(t[4] >> (i * 8)) & 0xff] ^ \ + s_sbob_sl64[5][(t[5] >> (i * 8)) & 0xff] ^ \ + s_sbob_sl64[6][(t[6] >> (i * 8)) & 0xff] ^ \ + s_sbob_sl64[7][(t[7] >> (i * 8)) & 0xff] + +// constants + +__constant u64 sbob_sl64[8][256] = +{ + { + 0xd031c397ce553fe6, + 0x16ba5b01b006b525, + 0xa89bade6296e70c8, + 0x6a1f525d77d3435b, + 0x6e103570573dfa0b, + 0x660efb2a17fc95ab, + 0x76327a9e97634bf6, + 0x4bad9d6462458bf5, + 0xf1830caedbc3f748, + 0xc5c8f542669131ff, + 0x95044a1cdc48b0cb, + 0x892962df3cf8b866, + 0xb0b9e208e930c135, + 0xa14fb3f0611a767c, + 0x8d2605f21c160136, + 0xd6b71922fecc549e, + 0x37089438a5907d8b, + 0x0b5da38e5803d49c, + 0x5a5bcc9cea6f3cbc, + 0xedae246d3b73ffe5, + 0xd2b87e0fde22edce, + 0x5e54abb1ca8185ec, + 0x1de7f88fe80561b9, + 0xad5e1a870135a08c, + 0x2f2adbd665cecc76, + 0x5780b5a782f58358, + 0x3edc8a2eede47b3f, + 0xc9d95c3506bee70f, + 0x83be111d6c4e05ee, + 0xa603b90959367410, + 0x103c81b4809fde5d, + 0x2c69b6027d0c774a, + 0x399080d7d5c87953, + 0x09d41e16487406b4, + 0xcdd63b1826505e5f, + 0xf99dc2f49b0298e8, + 0x9cd0540a943cb67f, + 0xbca84b7f891f17c5, + 0x723d1db3b78df2a6, + 0x78aa6e71e73b4f2e, + 0x1433e699a071670d, + 0x84f21be454620782, + 0x98df3327b4d20f2f, + 0xf049dce2d3769e5c, + 0xdb6c60199656eb7a, + 0x648746b2078b4783, + 0x32cd23598dcbadcf, + 0x1ea4955bf0c7da85, + 0xe9a143401b9d46b5, + 0xfd92a5d9bbec21b8, + 0xc8138c790e0b8e1b, + 0x2ee00b9a6d7ba562, + 0xf85712b893b7f1fc, + 0xeb28fed80bea949d, + 0x564a65eb8a40ea4c, + 0x6c9988e8474a2823, + 0x4535898b121d8f2d, + 0xabd8c03231accbf4, + 0xba2e91cab9867cbd, + 0x7960be3def8e263a, + 0x0c11a977602fd6f0, + 0xcb50e1ad16c93527, + 0xeae22e94035ffd89, + 0x2866d12f5de2ce1a, + 0xff1b1841ab9bf390, + 0x9f9339de8cfe0d43, + 0x964727c8c48a0bf7, + 0x524502c6aaae531c, + 0x9b9c5ef3ac10b413, + 0x4fa2fa4942ab32a5, + 0x3f165a62e551122b, + 0xc74148da76e6e3d7, + 0x924840e5e464b2a7, + 0xd372ae43d69784da, + 0x233b72a105e11a86, + 0xa48a04914941a638, + 0xb4b68525c9de7865, + 0xddeabaaca6cf8002, + 0x0a9773c250b6bd88, + 0xc284ffbb5ebd3393, + 0x8ba0df472c8f6a4e, + 0x2aef6cb74d951c32, + 0x427983722a318d41, + 0x73f7cdffbf389bb2, + 0x074c0af9382c026c, + 0x8a6a0f0b243a035a, + 0x6fdae53c5f88931f, + 0xc68b98967e538ac3, + 0x44ff59c71aa8e639, + 0xe2fce0ce439e9229, + 0xa20cde2479d8cd40, + 0x19e89fa2c8ebd8e9, + 0xf446bbcff398270c, + 0x43b3533e2284e455, + 0xd82f0dcd8e945046, + 0x51066f12b26ce820, + 0xe73957af6bc5426d, + 0x081ece5a40c16fa0, + 0x3b193d4fc5bfab7b, + 0x7fe66488df174d42, + 0x0e9814ef705804d8, + 0x8137ac857c39d7c6, + 0xb1733244e185a821, + 0x695c3f896f11f867, + 0xf6cf0657e3eff524, + 0x1aabf276d02963d5, + 0x2da3664e75b91e5e, + 0x0289bd981077d228, + 0x90c1fd7df413608f, + 0x3c5537b6fd93a917, + 0xaa12107e3919a2e0, + 0x0686dab530996b78, + 0xdaa6b0559ee3826e, + 0xc34e2ff756085a87, + 0x6d5358a44fff4137, + 0xfc587595b35948ac, + 0x7ca5095cc7d5f67e, + 0xfb147f6c8b754ac0, + 0xbfeb26ab91ddacf9, + 0x6896efc567a49173, + 0xca9a31e11e7c5c33, + 0xbbe44186b13315a9, + 0x0ddb793b689abfe4, + 0x70b4a02ba7fa208e, + 0xe47a3a7b7307f951, + 0x8cecd5be14a36822, + 0xeeed49b923b144d9, + 0x17708b4db8b3dc31, + 0x6088219f2765fed3, + 0xb3fa8fdcf1f27a09, + 0x910b2d31fca6099b, + 0x0f52c4a378ed6dcc, + 0x50ccbf5ebad98134, + 0x6bd582117f662a4f, + 0x94ce9a50d4fdd9df, + 0x2b25bcfb45207526, + 0x67c42b661f49fcbf, + 0x492420fc723259dd, + 0x03436dd418c2bb3c, + 0x1f6e4517f872b391, + 0xa08563bc69af1f68, + 0xd43ea4baeebb86b6, + 0x01cad04c08b56914, + 0xac94cacb0980c998, + 0x54c3d8739a373864, + 0x26fec5c02dbacac2, + 0xdea9d778be0d3b3e, + 0x040f672d20eeb950, + 0xe5b0ea377bb29045, + 0xf30ab136cbb42560, + 0x62019c0737122cfb, + 0xe86b930c13282fa1, + 0xcc1ceb542ee5374b, + 0x538fd28aa21b3a08, + 0x1b61223ad89c0ac1, + 0x36c24474ad25149f, + 0x7a23d3e9f74c9d06, + 0xbe21f6e79968c5ed, + 0xcf5f868036278c77, + 0xf705d61beb5a9c30, + 0x4d2b47d152dce08d, + 0x5f9e7bfdc234ecf8, + 0x247778583dcd18ea, + 0x867ba67c4415d5aa, + 0x4ce1979d5a698999, + 0x0000000000000000, + 0xec64f42133c696f1, + 0xb57c5569c16b1171, + 0xc1c7926f467f88af, + 0x654d96fe0f3e2e97, + 0x15f936d5a8c40e19, + 0xb8a72c52a9f1ae95, + 0xa9517daa21db19dc, + 0x58d27104fa18ee94, + 0x5918a148f2ad8780, + 0x5cdd1629daf657c4, + 0x8274c15164fb6cfa, + 0xd1fb13dbc6e056f2, + 0x7d6fd910cf609f6a, + 0xb63f38bdd9a9aa4d, + 0x3d9fe7faf526c003, + 0x74bbc706871499de, + 0xdf630734b6b8522a, + 0x3ad3ed03cd0ac26f, + 0xfadeaf2083c023d4, + 0xc00d42234ecae1bb, + 0x8538cba85cd76e96, + 0xc402250e6e2458eb, + 0x47bc3413026a5d05, + 0xafd7a71f114272a4, + 0x978df784cc3f62e3, + 0xb96dfc1ea144c781, + 0x21b2cf391596c8ae, + 0x318e4e8d950916f3, + 0xce9556cc3e92e563, + 0x385a509bdd7d1047, + 0x358129a0b5e7afa3, + 0xe6f387e363702b79, + 0xe0755d5653e94001, + 0x7be903a5fff9f412, + 0x12b53c2c90e80c75, + 0x3307f315857ec4db, + 0x8fafb86a0c61d31e, + 0xd9e5dd8186213952, + 0x77f8aad29fd622e2, + 0x25bda814357871fe, + 0x7571174a8fa1f0ca, + 0x137fec60985d6561, + 0x30449ec19dbc7fe7, + 0xa540d4dd41f4cf2c, + 0xdc206ae0ae7ae916, + 0x5b911cd0e2da55a8, + 0xb2305f90f947131d, + 0x344bf9ecbd52c6b7, + 0x5d17c665d2433ed0, + 0x18224feec05eb1fd, + 0x9e59e992844b6457, + 0x9a568ebfa4a5dd07, + 0xa3c60e68716da454, + 0x7e2cb4c4d7a22456, + 0x87b176304ca0bcbe, + 0x413aeea632f3367d, + 0x9915e36bbc67663b, + 0x40f03eea3a465f69, + 0x1c2d28c3e0b008ad, + 0x4e682a054a1e5bb1, + 0x05c5b761285bd044, + 0xe1bf8d1a5b5c2915, + 0xf2c0617ac3014c74, + 0xb7f5e8f1d11cc359, + 0x63cb4c4b3fa745ef, + 0x9d1a84469c89df6b, + 0xe33630824b2bfb3d, + 0xd5f474f6e60eefa2, + 0xf58c6b83fb2d4e18, + 0x4676e45f0adf3411, + 0x20781f751d23a1ba, + 0xbd629b3381aa7ed1, + 0xae1d775319f71bb0, + 0xfed1c80da32e9a84, + 0x5509083f92825170, + 0x29ac01635557a70e, + 0xa7c9694551831d04, + 0x8e65682604d4ba0a, + 0x11f651f8882ab749, + 0xd77dc96ef6793d8a, + 0xef2799f52b042dcd, + 0x48eef0b07a8730c9, + 0x22f1a2ed0d547392, + 0x6142f1d32fd097c7, + 0x4a674d286af0e2e1, + 0x80fd7cc9748cbed2, + 0x717e7067af4f499a, + 0x938290a9ecd1dbb3, + 0x88e3b293344dd172, + 0x2734158c250fa3d6, + }, + { + 0x7e37e62dfc7d40c3, + 0x776f25a4ee939e5b, + 0xe045c850dd8fb5ad, + 0x86ed5ba711ff1952, + 0xe91d0bd9cf616b35, + 0x37e0ab256e408ffb, + 0x9607f6c031025a7a, + 0x0b02f5e116d23c9d, + 0xf3d8486bfb50650c, + 0x621cff27c40875f5, + 0x7d40cb71fa5fd34a, + 0x6daa6616daa29062, + 0x9f5f354923ec84e2, + 0xec847c3dc507c3b3, + 0x025a3668043ce205, + 0xa8bf9e6c4dac0b19, + 0xfa808be2e9bebb94, + 0xb5b99c5277c74fa3, + 0x78d9bc95f0397bcc, + 0xe332e50cdbad2624, + 0xc74fce129332797e, + 0x1729eceb2ea709ab, + 0xc2d6b9f69954d1f8, + 0x5d898cbfbab8551a, + 0x859a76fb17dd8adb, + 0x1be85886362f7fb5, + 0xf6413f8ff136cd8a, + 0xd3110fa5bbb7e35c, + 0x0a2feed514cc4d11, + 0xe83010edcd7f1ab9, + 0xa1e75de55f42d581, + 0xeede4a55c13b21b6, + 0xf2f5535ff94e1480, + 0x0cc1b46d1888761e, + 0xbce15fdb6529913b, + 0x2d25e8975a7181c2, + 0x71817f1ce2d7a554, + 0x2e52c5cb5c53124b, + 0xf9f7a6beef9c281d, + 0x9e722e7d21f2f56e, + 0xce170d9b81dca7e6, + 0x0e9b82051cb4941b, + 0x1e712f623c49d733, + 0x21e45cfa42f9f7dc, + 0xcb8e7a7f8bba0f60, + 0x8e98831a010fb646, + 0x474ccf0d8e895b23, + 0xa99285584fb27a95, + 0x8cc2b57205335443, + 0x42d5b8e984eff3a5, + 0x012d1b34021e718c, + 0x57a6626aae74180b, + 0xff19fc06e3d81312, + 0x35ba9d4d6a7c6dfe, + 0xc9d44c178f86ed65, + 0x506523e6a02e5288, + 0x03772d5c06229389, + 0x8b01f4fe0b691ec0, + 0xf8dabd8aed825991, + 0x4c4e3aec985b67be, + 0xb10df0827fbf96a9, + 0x6a69279ad4f8dae1, + 0xe78689dcd3d5ff2e, + 0x812e1a2b1fa553d1, + 0xfbad90d6eba0ca18, + 0x1ac543b234310e39, + 0x1604f7df2cb97827, + 0xa6241c6951189f02, + 0x753513cceaaf7c5e, + 0x64f2a59fc84c4efa, + 0x247d2b1e489f5f5a, + 0xdb64d718ab474c48, + 0x79f4a7a1f2270a40, + 0x1573da832a9bebae, + 0x3497867968621c72, + 0x514838d2a2302304, + 0xf0af6537fd72f685, + 0x1d06023e3a6b44ba, + 0x678588c3ce6edd73, + 0x66a893f7cc70acff, + 0xd4d24e29b5eda9df, + 0x3856321470ea6a6c, + 0x07c3418c0e5a4a83, + 0x2bcbb22f5635bacd, + 0x04b46cd00878d90a, + 0x06ee5ab80c443b0f, + 0x3b211f4876c8f9e5, + 0x0958c38912eede98, + 0xd14b39cdbf8b0159, + 0x397b292072f41be0, + 0x87c0409313e168de, + 0xad26e98847caa39f, + 0x4e140c849c6785bb, + 0xd5ff551db7f3d853, + 0xa0ca46d15d5ca40d, + 0xcd6020c787fe346f, + 0x84b76dcf15c3fb57, + 0xdefda0fca121e4ce, + 0x4b8d7b6096012d3d, + 0x9ac642ad298a2c64, + 0x0875d8bd10f0af14, + 0xb357c6ea7b8374ac, + 0x4d6321d89a451632, + 0xeda96709c719b23f, + 0xf76c24bbf328bc06, + 0xc662d526912c08f2, + 0x3ce25ec47892b366, + 0xb978283f6f4f39bd, + 0xc08c8f9e9d6833fd, + 0x4f3917b09e79f437, + 0x593de06fb2c08c10, + 0xd6887841b1d14bda, + 0x19b26eee32139db0, + 0xb494876675d93e2f, + 0x825937771987c058, + 0x90e9ac783d466175, + 0xf1827e03ff6c8709, + 0x945dc0a8353eb87f, + 0x4516f9658ab5b926, + 0x3f9573987eb020ef, + 0xb855330b6d514831, + 0x2ae6a91b542bcb41, + 0x6331e413c6160479, + 0x408f8e8180d311a0, + 0xeff35161c325503a, + 0xd06622f9bd9570d5, + 0x8876d9a20d4b8d49, + 0xa5533135573a0c8b, + 0xe168d364df91c421, + 0xf41b09e7f50a2f8f, + 0x12b09b0f24c1a12d, + 0xda49cc2ca9593dc4, + 0x1f5c34563e57a6bf, + 0x54d14f36a8568b82, + 0xaf7cdfe043f6419a, + 0xea6a2685c943f8bc, + 0xe5dcbfb4d7e91d2b, + 0xb27addde799d0520, + 0x6b443caed6e6ab6d, + 0x7bae91c9f61be845, + 0x3eb868ac7cae5163, + 0x11c7b65322e332a4, + 0xd23c1491b9a992d0, + 0x8fb5982e0311c7ca, + 0x70ac6428e0c9d4d8, + 0x895bc2960f55fcc5, + 0x76423e90ec8defd7, + 0x6ff0507ede9e7267, + 0x3dcf45f07a8cc2ea, + 0x4aa06054941f5cb1, + 0x5810fb5bb0defd9c, + 0x5efea1e3bc9ac693, + 0x6edd4b4adc8003eb, + 0x741808f8e8b10dd2, + 0x145ec1b728859a22, + 0x28bc9f7350172944, + 0x270a06424ebdccd3, + 0x972aedf4331c2bf6, + 0x059977e40a66a886, + 0x2550302a4a812ed6, + 0xdd8a8da0a7037747, + 0xc515f87a970e9b7b, + 0x3023eaa9601ac578, + 0xb7e3aa3a73fbada6, + 0x0fb699311eaae597, + 0x0000000000000000, + 0x310ef19d6204b4f4, + 0x229371a644db6455, + 0x0decaf591a960792, + 0x5ca4978bb8a62496, + 0x1c2b190a38753536, + 0x41a295b582cd602c, + 0x3279dcc16426277d, + 0xc1a194aa9f764271, + 0x139d803b26dfd0a1, + 0xae51c4d441e83016, + 0xd813fa44ad65dfc1, + 0xac0bf2bc45d4d213, + 0x23be6a9246c515d9, + 0x49d74d08923dcf38, + 0x9d05032127d066e7, + 0x2f7fdeff5e4d63c7, + 0xa47e2a0155247d07, + 0x99b16ff12fa8bfed, + 0x4661d4398c972aaf, + 0xdfd0bbc8a33f9542, + 0xdca79694a51d06cb, + 0xb020ebb67da1e725, + 0xba0f0563696daa34, + 0xe4f1a480d5f76ca7, + 0xc438e34e9510eaf7, + 0x939e81243b64f2fc, + 0x8defae46072d25cf, + 0x2c08f3a3586ff04e, + 0xd7a56375b3cf3a56, + 0x20c947ce40e78650, + 0x43f8a3dd86f18229, + 0x568b795eac6a6987, + 0x8003011f1dbb225d, + 0xf53612d3f7145e03, + 0x189f75da300dec3c, + 0x9570db9c3720c9f3, + 0xbb221e576b73dbb8, + 0x72f65240e4f536dd, + 0x443be25188abc8aa, + 0xe21ffe38d9b357a8, + 0xfd43ca6ee7e4f117, + 0xcaa3614b89a47eec, + 0xfe34e732e1c6629e, + 0x83742c431b99b1d4, + 0xcf3a16af83c2d66a, + 0xaae5a8044990e91c, + 0x26271d764ca3bd5f, + 0x91c4b74c3f5810f9, + 0x7c6dd045f841a2c6, + 0x7f1afd19fe63314f, + 0xc8f957238d989ce9, + 0xa709075d5306ee8e, + 0x55fc5402aa48fa0e, + 0x48fa563c9023beb4, + 0x65dfbeabca523f76, + 0x6c877d22d8bce1ee, + 0xcc4d3bf385e045e3, + 0xbebb69b36115733e, + 0x10eaad6720fd4328, + 0xb6ceb10e71e5dc2a, + 0xbdcc44ef6737e0b7, + 0x523f158ea412b08d, + 0x989c74c52db6ce61, + 0x9beb59992b945de8, + 0x8a2cefca09776f4c, + 0xa3bd6b8d5b7e3784, + 0xeb473db1cb5d8930, + 0xc3fba2c29b4aa074, + 0x9c28181525ce176b, + 0x683311f2d0c438e4, + 0x5fd3bad7be84b71f, + 0xfc6ed15ae5fa809b, + 0x36cdb0116c5efe77, + 0x29918447520958c8, + 0xa29070b959604608, + 0x53120ebaa60cc101, + 0x3a0c047c74d68869, + 0x691e0ac6d2da4968, + 0x73db4974e6eb4751, + 0x7a838afdf40599c9, + 0x5a4acd33b4e21f99, + 0x6046c94fc03497f0, + 0xe6ab92e8d1cb8ea2, + 0x3354c7f5663856f1, + 0xd93ee170af7bae4d, + 0x616bd27bc22ae67c, + 0x92b39a10397a8370, + 0xabc8b3304b8e9890, + 0xbf967287630b02b2, + 0x5b67d607b6fc6e15, + }, + { + 0x8ab0a96846e06a6d, + 0x43c7e80b4bf0b33a, + 0x08c9b3546b161ee5, + 0x39f1c235eba990be, + 0xc1bef2376606c7b2, + 0x2c209233614569aa, + 0xeb01523b6fc3289a, + 0x946953ab935acedd, + 0x272838f63e13340e, + 0x8b0455eca12ba052, + 0x77a1b2c4978ff8a2, + 0xa55122ca13e54086, + 0x2276135862d3f1cd, + 0xdb8ddfde08b76cfe, + 0x5d1e12c89e4a178a, + 0x0e56816b03969867, + 0xee5f79953303ed59, + 0xafed748bab78d71d, + 0x6d929f2df93e53ee, + 0xf5d8a8f8ba798c2a, + 0xf619b1698e39cf6b, + 0x95ddaf2f749104e2, + 0xec2a9c80e0886427, + 0xce5c8fd8825b95ea, + 0xc4e0d9993ac60271, + 0x4699c3a5173076f9, + 0x3d1b151f50a29f42, + 0x9ed505ea2bc75946, + 0x34665acfdc7f4b98, + 0x61b1fb53292342f7, + 0xc721c0080e864130, + 0x8693cd1696fd7b74, + 0x872731927136b14b, + 0xd3446c8a63a1721b, + 0x669a35e8a6680e4a, + 0xcab658f239509a16, + 0xa4e5de4ef42e8ab9, + 0x37a7435ee83f08d9, + 0x134e6239e26c7f96, + 0x82791a3c2df67488, + 0x3f6ef00a8329163c, + 0x8e5a7e42fdeb6591, + 0x5caaee4c7981ddb5, + 0x19f234785af1e80d, + 0x255ddde3ed98bd70, + 0x50898a32a99cccac, + 0x28ca4519da4e6656, + 0xae59880f4cb31d22, + 0x0d9798fa37d6db26, + 0x32f968f0b4ffcd1a, + 0xa00f09644f258545, + 0xfa3ad5175e24de72, + 0xf46c547c5db24615, + 0x713e80fbff0f7e20, + 0x7843cf2b73d2aafa, + 0xbd17ea36aedf62b4, + 0xfd111bacd16f92cf, + 0x4abaa7dbc72d67e0, + 0xb3416b5dad49fad3, + 0xbca316b24914a88b, + 0x15d150068aecf914, + 0xe27c1debe31efc40, + 0x4fe48c759beda223, + 0x7edcfd141b522c78, + 0x4e5070f17c26681c, + 0xe696cac15815f3bc, + 0x35d2a64b3bb481a7, + 0x800cff29fe7dfdf6, + 0x1ed9fac3d5baa4b0, + 0x6c2663a91ef599d1, + 0x03c1199134404341, + 0xf7ad4ded69f20554, + 0xcd9d9649b61bd6ab, + 0xc8c3bde7eadb1368, + 0xd131899fb02afb65, + 0x1d18e352e1fae7f1, + 0xda39235aef7ca6c1, + 0xa1bbf5e0a8ee4f7a, + 0x91377805cf9a0b1e, + 0x3138716180bf8e5b, + 0xd9f83acbdb3ce580, + 0x0275e515d38b897e, + 0x472d3f21f0fbbcc6, + 0x2d946eb7868ea395, + 0xba3c248d21942e09, + 0xe7223645bfde3983, + 0xff64feb902e41bb1, + 0xc97741630d10d957, + 0xc3cb1722b58d4ecc, + 0xa27aec719cae0c3b, + 0x99fecb51a48c15fb, + 0x1465ac826d27332b, + 0xe1bd047ad75ebf01, + 0x79f733af941960c5, + 0x672ec96c41a3c475, + 0xc27feba6524684f3, + 0x64efd0fd75e38734, + 0xed9e60040743ae18, + 0xfb8e2993b9ef144d, + 0x38453eb10c625a81, + 0x6978480742355c12, + 0x48cf42ce14a6ee9e, + 0x1cac1fd606312dce, + 0x7b82d6ba4792e9bb, + 0x9d141c7b1f871a07, + 0x5616b80dc11c4a2e, + 0xb849c198f21fa777, + 0x7ca91801c8d9a506, + 0xb1348e487ec273ad, + 0x41b20d1e987b3a44, + 0x7460ab55a3cfbbe3, + 0x84e628034576f20a, + 0x1b87d16d897a6173, + 0x0fe27defe45d5258, + 0x83cde6b8ca3dbeb7, + 0x0c23647ed01d1119, + 0x7a362a3ea0592384, + 0xb61f40f3f1893f10, + 0x75d457d1440471dc, + 0x4558da34237035b8, + 0xdca6116587fc2043, + 0x8d9b67d3c9ab26d0, + 0x2b0b5c88ee0e2517, + 0x6fe77a382ab5da90, + 0x269cc472d9d8fe31, + 0x63c41e46faa8cb89, + 0xb7abbc771642f52f, + 0x7d1de4852f126f39, + 0xa8c6ba3024339ba0, + 0x600507d7cee888c8, + 0x8fee82c61a20afae, + 0x57a2448926d78011, + 0xfca5e72836a458f0, + 0x072bcebb8f4b4cbd, + 0x497bbe4af36d24a1, + 0x3cafe99bb769557d, + 0x12fa9ebd05a7b5a9, + 0xe8c04baa5b836bdb, + 0x4273148fac3b7905, + 0x908384812851c121, + 0xe557d3506c55b0fd, + 0x72ff996acb4f3d61, + 0x3eda0c8e64e2dc03, + 0xf0868356e6b949e9, + 0x04ead72abb0b0ffc, + 0x17a4b5135967706a, + 0xe3c8e16f04d5367f, + 0xf84f30028daf570c, + 0x1846c8fcbd3a2232, + 0x5b8120f7f6ca9108, + 0xd46fa231ecea3ea6, + 0x334d947453340725, + 0x58403966c28ad249, + 0xbed6f3a79a9f21f5, + 0x68ccb483a5fe962d, + 0xd085751b57e1315a, + 0xfed0023de52fd18e, + 0x4b0e5b5f20e6addf, + 0x1a332de96eb1ab4c, + 0xa3ce10f57b65c604, + 0x108f7ba8d62c3cd7, + 0xab07a3a11073d8e1, + 0x6b0dad1291bed56c, + 0xf2f366433532c097, + 0x2e557726b2cee0d4, + 0x0000000000000000, + 0xcb02a476de9b5029, + 0xe4e32fd48b9e7ac2, + 0x734b65ee2c84f75e, + 0x6e5386bccd7e10af, + 0x01b4fc84e7cbca3f, + 0xcfe8735c65905fd5, + 0x3613bfda0ff4c2e6, + 0x113b872c31e7f6e8, + 0x2fe18ba255052aeb, + 0xe974b72ebc48a1e4, + 0x0abc5641b89d979b, + 0xb46aa5e62202b66e, + 0x44ec26b0c4bbff87, + 0xa6903b5b27a503c7, + 0x7f680190fc99e647, + 0x97a84a3aa71a8d9c, + 0xdd12ede16037ea7c, + 0xc554251ddd0dc84e, + 0x88c54c7d956be313, + 0x4d91696048662b5d, + 0xb08072cc9909b992, + 0xb5de5962c5c97c51, + 0x81b803ad19b637c9, + 0xb2f597d94a8230ec, + 0x0b08aac55f565da4, + 0xf1327fd2017283d6, + 0xad98919e78f35e63, + 0x6ab9519676751f53, + 0x24e921670a53774f, + 0xb9fd3d1c15d46d48, + 0x92f66194fbda485f, + 0x5a35dc7311015b37, + 0xded3f4705477a93d, + 0xc00a0eb381cd0d8d, + 0xbb88d809c65fe436, + 0x16104997beacba55, + 0x21b70ac95693b28c, + 0x59f4c5e225411876, + 0xd5db5eb50b21f499, + 0x55d7a19cf55c096f, + 0xa97246b4c3f8519f, + 0x8552d487a2bd3835, + 0x54635d181297c350, + 0x23c2efdc85183bf2, + 0x9f61f96ecc0c9379, + 0x534893a39ddc8fed, + 0x5edf0b59aa0a54cb, + 0xac2c6d1a9f38945c, + 0xd7aebba0d8aa7de7, + 0x2abfa00c09c5ef28, + 0xd84cc64f3cf72fbf, + 0x2003f64db15878b3, + 0xa724c7dfc06ec9f8, + 0x069f323f68808682, + 0xcc296acd51d01c94, + 0x055e2bae5cc0c5c3, + 0x6270e2c21d6301b6, + 0x3b842720382219c0, + 0xd2f0900e846ab824, + 0x52fc6f277a1745d2, + 0xc6953c8ce94d8b0f, + 0xe009f8fe3095753e, + 0x655b2c7992284d0b, + 0x984a37d54347dfc4, + 0xeab5aebf8808e2a5, + 0x9a3fd2c090cc56ba, + 0x9ca0e0fff84cd038, + 0x4c2595e4afade162, + 0xdf6708f4b3bc6302, + 0xbf620f237d54ebca, + 0x93429d101c118260, + 0x097d4fd08cddd4da, + 0x8c2f9b572e60ecef, + 0x708a7c7f18c4b41f, + 0x3a30dba4dfe9d3ff, + 0x4006f19a7fb0f07b, + 0x5f6bf7dd4dc19ef4, + 0x1f6d064732716e8f, + 0xf9fbcc866a649d33, + 0x308c8de567744464, + 0x8971b0f972a0292c, + 0xd61a47243f61b7d8, + 0xefeb8511d4c82766, + 0x961cb6be40d147a3, + 0xaab35f25f7b812de, + 0x76154e407044329d, + 0x513d76b64e570693, + 0xf3479ac7d2f90aa8, + 0x9b8b2e4477079c85, + 0x297eb99d3d85ac69, + }, + { + 0x3ef29d249b2c0a19, + 0xe9e16322b6f8622f, + 0x5536994047757f7a, + 0x9f4d56d5a47b0b33, + 0x822567466aa1174c, + 0xb8f5057deb082fb2, + 0xcc48c10bf4475f53, + 0x373088d4275dec3a, + 0x968f4325180aed10, + 0x173d232cf7016151, + 0xae4ed09f946fcc13, + 0xfd4b4741c4539873, + 0x1b5b3f0dd9933765, + 0x2ffcb0967b644052, + 0xe02376d20a89840c, + 0xa3ae3a70329b18d7, + 0x419cbd2335de8526, + 0xfafebf115b7c3199, + 0x0397074f85aa9b0d, + 0xc58ad4fb4836b970, + 0xbec60be3fc4104a8, + 0x1eff36dc4b708772, + 0x131fdc33ed8453b6, + 0x0844e33e341764d3, + 0x0ff11b6eab38cd39, + 0x64351f0a7761b85a, + 0x3b5694f509cfba0e, + 0x30857084b87245d0, + 0x47afb3bd2297ae3c, + 0xf2ba5c2f6f6b554a, + 0x74bdc4761f4f70e1, + 0xcfdfc64471edc45e, + 0xe610784c1dc0af16, + 0x7aca29d63c113f28, + 0x2ded411776a859af, + 0xac5f211e99a3d5ee, + 0xd484f949a87ef33b, + 0x3ce36ca596e013e4, + 0xd120f0983a9d432c, + 0x6bc40464dc597563, + 0x69d5f5e5d1956c9e, + 0x9ae95f043698bb24, + 0xc9ecc8da66a4ef44, + 0xd69508c8a5b2eac6, + 0xc40c2235c0503b80, + 0x38c193ba8c652103, + 0x1ceec75d46bc9e8f, + 0xd331011937515ad1, + 0xd8e2e56886eca50f, + 0xb137108d5779c991, + 0x709f3b6905ca4206, + 0x4feb50831680caef, + 0xec456af3241bd238, + 0x58d673afe181abbe, + 0x242f54e7cad9bf8c, + 0x0211f1810dcc19fd, + 0x90bc4dbb0f43c60a, + 0x9518446a9da0761d, + 0xa1bfcbf13f57012a, + 0x2bde4f8961e172b5, + 0x27b853a84f732481, + 0xb0b1e643df1f4b61, + 0x18cc38425c39ac68, + 0xd2b7f7d7bf37d821, + 0x3103864a3014c720, + 0x14aa246372abfa5c, + 0x6e600db54ebac574, + 0x394765740403a3f3, + 0x09c215f0bc71e623, + 0x2a58b947e987f045, + 0x7b4cdf18b477bdd8, + 0x9709b5eb906c6fe0, + 0x73083c268060d90b, + 0xfedc400e41f9037e, + 0x284948c6e44be9b8, + 0x728ecae808065bfb, + 0x06330e9e17492b1a, + 0x5950856169e7294e, + 0xbae4f4fce6c4364f, + 0xca7bcf95e30e7449, + 0x7d7fd186a33e96c2, + 0x52836110d85ad690, + 0x4dfaa1021b4cd312, + 0x913abb75872544fa, + 0xdd46ecb9140f1518, + 0x3d659a6b1e869114, + 0xc23f2cabd719109a, + 0xd713fe062dd46836, + 0xd0a60656b2fbc1dc, + 0x221c5a79dd909496, + 0xefd26dbca1b14935, + 0x0e77eda0235e4fc9, + 0xcbfd395b6b68f6b9, + 0x0de0eaefa6f4d4c4, + 0x0422ff1f1a8532e7, + 0xf969b85eded6aa94, + 0x7f6e2007aef28f3f, + 0x3ad0623b81a938fe, + 0x6624ee8b7aada1a7, + 0xb682e8ddc856607b, + 0xa78cc56f281e2a30, + 0xc79b257a45faa08d, + 0x5b4174e0642b30b3, + 0x5f638bff7eae0254, + 0x4bc9af9c0c05f808, + 0xce59308af98b46ae, + 0x8fc58da9cc55c388, + 0x803496c7676d0eb1, + 0xf33caae1e70dd7ba, + 0xbb6202326ea2b4bf, + 0xd5020f87201871cb, + 0x9d5ca754a9b712ce, + 0x841669d87de83c56, + 0x8a6184785eb6739f, + 0x420bba6cb0741e2b, + 0xf12d5b60eac1ce47, + 0x76ac35f71283691c, + 0x2c6bb7d9fecedb5f, + 0xfccdb18f4c351a83, + 0x1f79c012c3160582, + 0xf0abadae62a74cb7, + 0xe1a5801c82ef06fc, + 0x67a21845f2cb2357, + 0x5114665f5df04d9d, + 0xbf40fd2d74278658, + 0xa0393d3fb73183da, + 0x05a409d192e3b017, + 0xa9fb28cf0b4065f9, + 0x25a9a22942bf3d7c, + 0xdb75e22703463e02, + 0xb326e10c5ab5d06c, + 0xe7968e8295a62de6, + 0xb973f3b3636ead42, + 0xdf571d3819c30ce5, + 0xee549b7229d7cbc5, + 0x12992afd65e2d146, + 0xf8ef4e9056b02864, + 0xb7041e134030e28b, + 0xc02edd2adad50967, + 0x932b4af48ae95d07, + 0x6fe6fb7bc6dc4784, + 0x239aacb755f61666, + 0x401a4bedbdb807d6, + 0x485ea8d389af6305, + 0xa41bc220adb4b13d, + 0x753b32b89729f211, + 0x997e584bb3322029, + 0x1d683193ceda1c7f, + 0xff5ab6c0c99f818e, + 0x16bbd5e27f67e3a1, + 0xa59d34ee25d233cd, + 0x98f8ae853b54a2d9, + 0x6df70afacb105e79, + 0x795d2e99b9bba425, + 0x8e437b6744334178, + 0x0186f6ce886682f0, + 0xebf092a3bb347bd2, + 0xbcd7fa62f18d1d55, + 0xadd9d7d011c5571e, + 0x0bd3e471b1bdffde, + 0xaa6c2f808eeafef4, + 0x5ee57d31f6c880a4, + 0xf50fa47ff044fca0, + 0x1addc9c351f5b595, + 0xea76646d3352f922, + 0x0000000000000000, + 0x85909f16f58ebea6, + 0x46294573aaf12ccc, + 0x0a5512bf39db7d2e, + 0x78dbd85731dd26d5, + 0x29cfbe086c2d6b48, + 0x218b5d36583a0f9b, + 0x152cd2adfacd78ac, + 0x83a39188e2c795bc, + 0xc3b9da655f7f926a, + 0x9ecba01b2c1d89c3, + 0x07b5f8509f2fa9ea, + 0x7ee8d6c926940dcf, + 0x36b67e1aaf3b6eca, + 0x86079859702425ab, + 0xfb7849dfd31ab369, + 0x4c7c57cc932a51e2, + 0xd96413a60e8a27ff, + 0x263ea566c715a671, + 0x6c71fc344376dc89, + 0x4a4f595284637af8, + 0xdaf314e98b20bcf2, + 0x572768c14ab96687, + 0x1088db7c682ec8bb, + 0x887075f9537a6a62, + 0x2e7a4658f302c2a2, + 0x619116dbe582084d, + 0xa87dde018326e709, + 0xdcc01a779c6997e8, + 0xedc39c3dac7d50c8, + 0xa60a33a1a078a8c0, + 0xc1a82be452b38b97, + 0x3f746bea134a88e9, + 0xa228ccbebafd9a27, + 0xabead94e068c7c04, + 0xf48952b178227e50, + 0x5cf48cb0fb049959, + 0x6017e0156de48abd, + 0x4438b4f2a73d3531, + 0x8c528ae649ff5885, + 0xb515ef924dfcfb76, + 0x0c661c212e925634, + 0xb493195cc59a7986, + 0x9cda519a21d1903e, + 0x32948105b5be5c2d, + 0x194ace8cd45f2e98, + 0x438d4ca238129cdb, + 0x9b6fa9cabefe39d4, + 0x81b26009ef0b8c41, + 0xded1ebf691a58e15, + 0x4e6da64d9ee6481f, + 0x54b06f8ecf13fd8a, + 0x49d85e1d01c9e1f5, + 0xafc826511c094ee3, + 0xf698a33075ee67ad, + 0x5ac7822eec4db243, + 0x8dd47c28c199da75, + 0x89f68337db1ce892, + 0xcdce37c57c21dda3, + 0x530597de503c5460, + 0x6a42f2aa543ff793, + 0x5d727a7e73621ba9, + 0xe232875307459df1, + 0x56a19e0fc2dfe477, + 0xc61dd3b4cd9c227d, + 0xe5877f03986a341b, + 0x949eb2a415c6f4ed, + 0x6206119460289340, + 0x6380e75ae84e11b0, + 0x8be772b6d6d0f16f, + 0x50929091d596cf6d, + 0xe86795ec3e9ee0df, + 0x7cf927482b581432, + 0xc86a3e14eec26db4, + 0x7119cda78dacc0f6, + 0xe40189cd100cb6eb, + 0x92adbc3a028fdff7, + 0xb2a017c2d2d3529c, + 0x200dabf8d05c8d6b, + 0x34a78f9ba2f77737, + 0xe3b4719d8f231f01, + 0x45be423c2f5bb7c1, + 0xf71e55fefd88e55d, + 0x6853032b59f3ee6e, + 0x65b3e9c4ff073aaa, + 0x772ac3399ae5ebec, + 0x87816e97f842a75b, + 0x110e2db2e0484a4b, + 0x331277cb3dd8dedd, + 0xbd510cac79eb9fa5, + 0x352179552a91f5c7, + }, + { + 0x05ba7bc82c9b3220, + 0x31a54665f8b65e4f, + 0xb1b651f77547f4d4, + 0x8bfa0d857ba46682, + 0x85a96c5aa16a98bb, + 0x990faef908eb79c9, + 0xa15e37a247f4a62d, + 0x76857dcd5d27741e, + 0xf8c50b800a1820bc, + 0xbe65dcb201f7a2b4, + 0x666d1b986f9426e7, + 0x4cc921bf53c4e648, + 0x95410a0f93d9ca42, + 0x20cdccaa647ba4ef, + 0x429a4060890a1871, + 0x0c4ea4f69b32b38b, + 0xccda362dde354cd3, + 0x96dc23bc7c5b2fa9, + 0xc309bb68aa851ab3, + 0xd26131a73648e013, + 0x021dc52941fc4db2, + 0xcd5adab7704be48a, + 0xa77965d984ed71e6, + 0x32386fd61734bba4, + 0xe82d6dd538ab7245, + 0x5c2147ea6177b4b1, + 0x5da1ab70cf091ce8, + 0xac907fce72b8bdff, + 0x57c85dfd972278a8, + 0xa4e44c6a6b6f940d, + 0x3851995b4f1fdfe4, + 0x62578ccaed71bc9e, + 0xd9882bb0c01d2c0a, + 0x917b9d5d113c503b, + 0xa2c31e11a87643c6, + 0xe463c923a399c1ce, + 0xf71686c57ea876dc, + 0x87b4a973e096d509, + 0xaf0d567d9d3a5814, + 0xb40c2a3f59dcc6f4, + 0x3602f88495d121dd, + 0xd3e1dd3d9836484a, + 0xf945e71aa46688e5, + 0x7518547eb2a591f5, + 0x9366587450c01d89, + 0x9ea81018658c065b, + 0x4f54080cbc4603a3, + 0x2d0384c65137bf3d, + 0xdc325078ec861e2a, + 0xea30a8fc79573ff7, + 0x214d2030ca050cb6, + 0x65f0322b8016c30c, + 0x69be96dd1b247087, + 0xdb95ee9981e161b8, + 0xd1fc1814d9ca05f8, + 0x820ed2bbcc0de729, + 0x63d76050430f14c7, + 0x3bccb0e8a09d3a0f, + 0x8e40764d573f54a2, + 0x39d175c1e16177bd, + 0x12f5a37c734f1f4b, + 0xab37c12f1fdfc26d, + 0x5648b167395cd0f1, + 0x6c04ed1537bf42a7, + 0xed97161d14304065, + 0x7d6c67daab72b807, + 0xec17fa87ba4ee83c, + 0xdfaf79cb0304fbc1, + 0x733f060571bc463e, + 0x78d61c1287e98a27, + 0xd07cf48e77b4ada1, + 0xb9c262536c90dd26, + 0xe2449b5860801605, + 0x8fc09ad7f941fcfb, + 0xfad8cea94be46d0e, + 0xa343f28b0608eb9f, + 0x9b126bd04917347b, + 0x9a92874ae7699c22, + 0x1b017c42c4e69ee0, + 0x3a4c5c720ee39256, + 0x4b6e9f5e3ea399da, + 0x6ba353f45ad83d35, + 0xe7fee0904c1b2425, + 0x22d009832587e95d, + 0x842980c00f1430e2, + 0xc6b3c0a0861e2893, + 0x087433a419d729f2, + 0x341f3dadd42d6c6f, + 0xee0a3faefbb2a58e, + 0x4aee73c490dd3183, + 0xaab72db5b1a16a34, + 0xa92a04065e238fdf, + 0x7b4b35a1686b6fcc, + 0x6a23bf6ef4a6956c, + 0x191cb96b851ad352, + 0x55d598d4d6de351a, + 0xc9604de5f2ae7ef3, + 0x1ca6c2a3a981e172, + 0xde2f9551ad7a5398, + 0x3025aaff56c8f616, + 0x15521d9d1e2860d9, + 0x506fe31cfa45073a, + 0x189c55f12b647b0b, + 0x0180ec9aae7ea859, + 0x7cec8b40050c105e, + 0x2350e5198bf94104, + 0xef8ad33455cc0dd7, + 0x07a7bee16d677f92, + 0xe5e325b90de76997, + 0x5a061591a26e637a, + 0xb611ef1618208b46, + 0x09f4df3eb7a981ab, + 0x1ebb078ae87dacc0, + 0xb791038cb65e231f, + 0x0fd38d4574b05660, + 0x67edf702c1ea8ebe, + 0xba5f4be0831238cd, + 0xe3c477c2cefebe5c, + 0x0dce486c354c1bd2, + 0x8c5db36416c31910, + 0x26ea9ed1a7627324, + 0x039d29b3ef82e5eb, + 0x9f28fc82cbf2ae02, + 0xa8aae89cf05d2786, + 0x431aacfa2774b028, + 0xcf471f9e31b7a938, + 0x581bd0b8e3922ec8, + 0xbc78199b400bef06, + 0x90fb71c7bf42f862, + 0x1f3beb1046030499, + 0x683e7a47b55ad8de, + 0x988f4263a695d190, + 0xd808c72a6e638453, + 0x0627527bc319d7cb, + 0xebb04466d72997ae, + 0xe67e0c0ae2658c7c, + 0x14d2f107b056c880, + 0x7122c32c30400b8c, + 0x8a7ae11fd5dacedb, + 0xa0dedb38e98a0e74, + 0xad109354dcc615a6, + 0x0be91a17f655cc19, + 0x8ddd5ffeb8bdb149, + 0xbfe53028af890aed, + 0xd65ba6f5b4ad7a6a, + 0x7956f0882997227e, + 0x10e8665532b352f9, + 0x0e5361dfdacefe39, + 0xcec7f3049fc90161, + 0xff62b561677f5f2e, + 0x975ccf26d22587f0, + 0x51ef0f86543baf63, + 0x2f1e41ef10cbf28f, + 0x52722635bbb94a88, + 0xae8dbae73344f04d, + 0x410769d36688fd9a, + 0xb3ab94de34bbb966, + 0x801317928df1aa9b, + 0xa564a0f0c5113c54, + 0xf131d4bebdb1a117, + 0x7f71a2f3ea8ef5b5, + 0x40878549c8f655c3, + 0x7ef14e6944f05dec, + 0xd44663dcf55137d8, + 0xf2acfd0d523344fc, + 0x0000000000000000, + 0x5fbc6e598ef5515a, + 0x16cf342ef1aa8532, + 0xb036bd6ddb395c8d, + 0x13754fe6dd31b712, + 0xbbdfa77a2d6c9094, + 0x89e7c8ac3a582b30, + 0x3c6b0e09cdfa459d, + 0xc4ae0589c7e26521, + 0x49735a777f5fd468, + 0xcafd64561d2c9b18, + 0xda1502032f9fc9e1, + 0x8867243694268369, + 0x3782141e3baf8984, + 0x9cb5d53124704be9, + 0xd7db4a6f1ad3d233, + 0xa6f989432a93d9bf, + 0x9d3539ab8a0ee3b0, + 0x53f2caaf15c7e2d1, + 0x6e19283c76430f15, + 0x3debe2936384edc4, + 0x5e3c82c3208bf903, + 0x33b8834cb94a13fd, + 0x6470deb12e686b55, + 0x359fd1377a53c436, + 0x61caa57902f35975, + 0x043a975282e59a79, + 0xfd7f70482683129c, + 0xc52ee913699ccd78, + 0x28b9ff0e7dac8d1d, + 0x5455744e78a09d43, + 0xcb7d88ccb3523341, + 0x44bd121b4a13cfba, + 0x4d49cd25fdba4e11, + 0x3e76cb208c06082f, + 0x3ff627ba2278a076, + 0xc28957f204fbb2ea, + 0x453dfe81e46d67e3, + 0x94c1e6953da7621b, + 0x2c83685cff491764, + 0xf32c1197fc4deca5, + 0x2b24d6bd922e68f6, + 0xb22b78449ac5113f, + 0x48f3b6edd1217c31, + 0x2e9ead75beb55ad6, + 0x174fd8b45fd42d6b, + 0x4ed4e4961238abfa, + 0x92e6b4eefebeb5d0, + 0x46a0d7320bef8208, + 0x47203ba8a5912a51, + 0x24f75bf8e69e3e96, + 0xf0b1382413cf094e, + 0xfee259fbc901f777, + 0x276a724b091cdb7d, + 0xbdf8f501ee75475f, + 0x599b3c224dec8691, + 0x6d84018f99c1eafe, + 0x7498b8e41cdb39ac, + 0xe0595e71217c5bb7, + 0x2aa43a273c50c0af, + 0xf50b43ec3f543b6e, + 0x838e3e2162734f70, + 0xc09492db4507ff58, + 0x72bfea9fdfc2ee67, + 0x11688acf9ccdfaa0, + 0x1a8190d86a9836b9, + 0x7acbd93bc615c795, + 0xc7332c3a286080ca, + 0x863445e94ee87d50, + 0xf6966a5fd0d6de85, + 0xe9ad814f96d5da1c, + 0x70a22fb69e3ea3d5, + 0x0a69f68d582b6440, + 0xb8428ec9c2ee757f, + 0x604a49e3ac8df12c, + 0x5b86f90b0c10cb23, + 0xe1d9b2eb8f02f3ee, + 0x29391394d3d22544, + 0xc8e0a17f5cd0d6aa, + 0xb58cc6a5f7a26ead, + 0x8193fb08238f02c2, + 0xd5c68f465b2f9f81, + 0xfcff9cd288fdbac5, + 0x77059157f359dc47, + 0x1d262e3907ff492b, + 0xfb582233e59ac557, + 0xddb2bce242f8b673, + 0x2577b76248e096cf, + 0x6f99c4a6d83da74c, + 0xc1147e41eb795701, + 0xf48baf76912a9337, + }, + { + 0x45b268a93acde4cc, + 0xaf7f0be884549d08, + 0x048354b3c1468263, + 0x925435c2c80efed2, + 0xee4e37f27fdffba7, + 0x167a33920c60f14d, + 0xfb123b52ea03e584, + 0x4a0cab53fdbb9007, + 0x9deaf6380f788a19, + 0xcb48ec558f0cb32a, + 0xb59dc4b2d6fef7e0, + 0xdcdbca22f4f3ecb6, + 0x11df5813549a9c40, + 0xe33fdedf568aced3, + 0xa0c1c8124322e9c3, + 0x07a56b8158fa6d0d, + 0x77279579b1e1f3dd, + 0xd9b18b74422ac004, + 0xb8ec2d9fffabc294, + 0xf4acf8a82d75914f, + 0x7bbf69b1ef2b6878, + 0xc4f62faf487ac7e1, + 0x76ce809cc67e5d0c, + 0x6711d88f92e4c14c, + 0x627b99d9243dedfe, + 0x234aa5c3dfb68b51, + 0x909b1f15262dbf6d, + 0x4f66ea054b62bcb5, + 0x1ae2cf5a52aa6ae8, + 0xbea053fbd0ce0148, + 0xed6808c0e66314c9, + 0x43fe16cd15a82710, + 0xcd049231a06970f6, + 0xe7bc8a6c97cc4cb0, + 0x337ce835fcb3b9c0, + 0x65def2587cc780f3, + 0x52214ede4132bb50, + 0x95f15e4390f493df, + 0x870839625dd2e0f1, + 0x41313c1afb8b66af, + 0x91720af051b211bc, + 0x477d427ed4eea573, + 0x2e3b4ceef6e3be25, + 0x82627834eb0bcc43, + 0x9c03e3dd78e724c8, + 0x2877328ad9867df9, + 0x14b51945e243b0f2, + 0x574b0f88f7eb97e2, + 0x88b6fa989aa4943a, + 0x19c4f068cb168586, + 0x50ee6409af11faef, + 0x7df317d5c04eaba4, + 0x7a567c5498b4c6a9, + 0xb6bbfb804f42188e, + 0x3cc22bcf3bc5cd0b, + 0xd04336eaaa397713, + 0xf02fac1bec33132c, + 0x2506dba7f0d3488d, + 0xd7e65d6bf2c31a1e, + 0x5eb9b2161ff820f5, + 0x842e0650c46e0f9f, + 0x716beb1d9e843001, + 0xa933758cab315ed4, + 0x3fe414fda2792265, + 0x27c9f1701ef00932, + 0x73a4c1ca70a771be, + 0x94184ba6e76b3d0e, + 0x40d829ff8c14c87e, + 0x0fbec3fac77674cb, + 0x3616a9634a6a9572, + 0x8f139119c25ef937, + 0xf545ed4d5aea3f9e, + 0xe802499650ba387b, + 0x6437e7bd0b582e22, + 0xe6559f89e053e261, + 0x80ad52e305288dfc, + 0x6dc55a23e34b9935, + 0xde14e0f51ad0ad09, + 0xc6390578a659865e, + 0x96d7617109487cb1, + 0xe2d6cb3a21156002, + 0x01e915e5779faed1, + 0xadb0213f6a77dcb7, + 0x9880b76eb9a1a6ab, + 0x5d9f8d248644cf9b, + 0xfd5e4536c5662658, + 0xf1c6b9fe9bacbdfd, + 0xeacd6341be9979c4, + 0xefa7221708405576, + 0x510771ecd88e543e, + 0xc2ba51cb671f043d, + 0x0ad482ac71af5879, + 0xfe787a045cdac936, + 0xb238af338e049aed, + 0xbd866cc94972ee26, + 0x615da6ebbd810290, + 0x3295fdd08b2c1711, + 0xf834046073bf0aea, + 0xf3099329758ffc42, + 0x1caeb13e7dcfa934, + 0xba2307481188832b, + 0x24efce42874ce65c, + 0x0e57d61fb0e9da1a, + 0xb3d1bad6f99b343c, + 0xc0757b1c893c4582, + 0x2b510db8403a9297, + 0x5c7698c1f1db614a, + 0x3e0d0118d5e68cb4, + 0xd60f488e855cb4cf, + 0xae961e0df3cb33d9, + 0x3a8e55ab14a00ed7, + 0x42170328623789c1, + 0x838b6dd19c946292, + 0x895fef7ded3b3aeb, + 0xcfcbb8e64e4a3149, + 0x064c7e642f65c3dc, + 0x3d2b3e2a4c5a63da, + 0x5bd3f340a9210c47, + 0xb474d157a1615931, + 0xac5934da1de87266, + 0x6ee365117af7765b, + 0xc86ed36716b05c44, + 0x9ba6885c201d49c5, + 0xb905387a88346c45, + 0x131072c4bab9ddff, + 0xbf49461ea751af99, + 0xd52977bc1ce05ba1, + 0xb0f785e46027db52, + 0x546d30ba6e57788c, + 0x305ad707650f56ae, + 0xc987c682612ff295, + 0xa5ab8944f5fbc571, + 0x7ed528e759f244ca, + 0x8ddcbbce2c7db888, + 0xaa154abe328db1ba, + 0x1e619be993ece88b, + 0x09f2bd9ee813b717, + 0x7401aa4b285d1cb3, + 0x21858f143195caee, + 0x48c381841398d1b8, + 0xfcb750d3b2f98889, + 0x39a86a998d1ce1b9, + 0x1f888e0ce473465a, + 0x7899568376978716, + 0x02cf2ad7ee2341bf, + 0x85c713b5b3f1a14e, + 0xff916fe12b4567e7, + 0x7c1a0230b7d10575, + 0x0c98fcc85eca9ba5, + 0xa3e7f720da9e06ad, + 0x6a6031a2bbb1f438, + 0x973e74947ed7d260, + 0x2cf4663918c0ff9a, + 0x5f50a7f368678e24, + 0x34d983b4a449d4cd, + 0x68af1b755592b587, + 0x7f3c3d022e6dea1b, + 0xabfc5f5b45121f6b, + 0x0d71e92d29553574, + 0xdffdf5106d4f03d8, + 0x081ba87b9f8c19c6, + 0xdb7ea1a3ac0981bb, + 0xbbca12ad66172dfa, + 0x79704366010829c7, + 0x179326777bff5f9c, + 0x0000000000000000, + 0xeb2476a4c906d715, + 0x724dd42f0738df6f, + 0xb752ee6538ddb65f, + 0x37ffbc863df53ba3, + 0x8efa84fcb5c157e6, + 0xe9eb5c73272596aa, + 0x1b0bdabf2535c439, + 0x86e12c872a4d4e20, + 0x9969a28bce3e087a, + 0xfafb2eb79d9c4b55, + 0x056a4156b6d92cb2, + 0x5a3ae6a5debea296, + 0x22a3b026a8292580, + 0x53c85b3b36ad1581, + 0xb11e900117b87583, + 0xc51f3a4a3fe56930, + 0xe019e1edcf3621bd, + 0xec811d2591fcba18, + 0x445b7d4c4d524a1d, + 0xa8da6069dcaef005, + 0x58f5cc72309de329, + 0xd4c062596b7ff570, + 0xce22ad0339d59f98, + 0x591cd99747024df8, + 0x8b90c5aa03187b54, + 0xf663d27fc356d0f0, + 0xd8589e9135b56ed5, + 0x35309651d3d67a1c, + 0x12f96721cd26732e, + 0xd28c1c3d441a36ac, + 0x492a946164077f69, + 0x2d1d73dc6f5f514b, + 0x6f0a70f40d68d88a, + 0x60b4b30eca1eac41, + 0xd36509d83385987d, + 0x0b3d97490630f6a8, + 0x9eccc90a96c46577, + 0xa20ee2c5ad01a87c, + 0xe49ab55e0e70a3de, + 0xa4429ca182646ba0, + 0xda97b446db962f6a, + 0xcced87d4d7f6de27, + 0x2ab8185d37a53c46, + 0x9f25dcefe15bcba6, + 0xc19c6ef9fea3eb53, + 0xa764a3931bd884ce, + 0x2fd2590b817c10f4, + 0x56a21a6d80743933, + 0xe573a0bb79ef0d0f, + 0x155c0ca095dc1e23, + 0x6c2c4fc694d437e4, + 0x10364df623053291, + 0xdd32dfc7836c4267, + 0x03263f3299bcef6e, + 0x66f8cd6ae57b6f9d, + 0x8c35ae2b5be21659, + 0x31b3c2e21290f87f, + 0x93bd2027bf915003, + 0x69460e90220d1b56, + 0x299e276fae19d328, + 0x63928c3c53a2432f, + 0x7082fef8e91b9ed0, + 0xbc6f792c3eed40f7, + 0x4c40d537d2de53db, + 0x75e8bfae5fc2b262, + 0x4da9c0d2a541fd0a, + 0x4e8fffe03cfd1264, + 0x2620e495696fa7e3, + 0xe1f0f408b8a98f6c, + 0xd1aa230fdda6d9c2, + 0xc7d0109dd1c6288f, + 0x8a79d04f7487d585, + 0x4694579ba3710ba2, + 0x38417f7cfa834f68, + 0x1d47a4db0a5007e5, + 0x206c9af1460a643f, + 0xa128ddf734bd4712, + 0x8144470672b7232d, + 0xf2e086cc02105293, + 0x182de58dbc892b57, + 0xcaa1f9b0f8931dfb, + 0x6b892447cc2e5ae9, + 0xf9dd11850420a43b, + 0x4be5beb68a243ed6, + 0x5584255f19c8d65d, + 0x3b67404e633fa006, + 0xa68db6766c472a1f, + 0xf78ac79ab4c97e21, + 0xc353442e1080aaec, + 0x9a4f9db95782e714, + }, + { + 0xc811a8058c3f55de, + 0x65f5b43196b50619, + 0xf74f96b1d6706e43, + 0x859d1e8bcb43d336, + 0x5aab8a85ccfa3d84, + 0xf9c7bf99c295fcfd, + 0xa21fd5a1de4b630f, + 0xcdb3ef763b8b456d, + 0x803f59f87cf7c385, + 0xb27c73be5f31913c, + 0x98e3ac6633b04821, + 0xbf61674c26b8f818, + 0x0ffbc995c4c130c8, + 0xaaa0862010761a98, + 0x6057f342210116aa, + 0xf63c760c0654cc35, + 0x2ddb45cc667d9042, + 0xbcf45a964bd40382, + 0x68e8a0c3ef3c6f3d, + 0xa7bd92d269ff73bc, + 0x290ae20201ed2287, + 0xb7de34cde885818f, + 0xd901eea7dd61059b, + 0xd6fa273219a03553, + 0xd56f1ae874cccec9, + 0xea31245c2e83f554, + 0x7034555da07be499, + 0xce26d2ac56e7bef7, + 0xfd161857a5054e38, + 0x6a0e7da4527436d1, + 0x5bd86a381cde9ff2, + 0xcaf7756231770c32, + 0xb09aaed9e279c8d0, + 0x5def1091c60674db, + 0x111046a2515e5045, + 0x23536ce4729802fc, + 0xc50cbcf7f5b63cfa, + 0x73a16887cd171f03, + 0x7d2941afd9f28dbd, + 0x3f5e3eb45a4f3b9d, + 0x84eefe361b677140, + 0x3db8e3d3e7076271, + 0x1a3a28f9f20fd248, + 0x7ebc7c75b49e7627, + 0x74e5f293c7eb565c, + 0x18dcf59e4f478ba4, + 0x0c6ef44fa9adcb52, + 0xc699812d98dac760, + 0x788b06dc6e469d0e, + 0xfc65f8ea7521ec4e, + 0x30a5f7219e8e0b55, + 0x2bec3f65bca57b6b, + 0xddd04969baf1b75e, + 0x99904cdbe394ea57, + 0x14b201d1e6ea40f6, + 0xbbb0c08241284add, + 0x50f20463bf8f1dff, + 0xe8d7f93b93cbacb8, + 0x4d8cb68e477c86e8, + 0xc1dd1b3992268e3f, + 0x7c5aa11209d62fcb, + 0x2f3d98abdb35c9ae, + 0x671369562bfd5ff5, + 0x15c1e16c36cee280, + 0x1d7eb2edf8f39b17, + 0xda94d37db00dfe01, + 0x877bc3ec760b8ada, + 0xcb8495dfe153ae44, + 0x05a24773b7b410b3, + 0x12857b783c32abdf, + 0x8eb770d06812513b, + 0x536739b9d2e3e665, + 0x584d57e271b26468, + 0xd789c78fc9849725, + 0xa935bbfa7d1ae102, + 0x8b1537a3dfa64188, + 0xd0cd5d9bc378de7a, + 0x4ac82c9a4d80cfb7, + 0x42777f1b83bdb620, + 0x72d2883a1d33bd75, + 0x5e7a2d4bab6a8f41, + 0xf4daab6bbb1c95d9, + 0x905cffe7fd8d31b6, + 0x83aa6422119b381f, + 0xc0aefb8442022c49, + 0xa0f908c663033ae3, + 0xa428af0804938826, + 0xade41c341a8a53c7, + 0xae7121ee77e6a85d, + 0xc47f5c4a25929e8c, + 0xb538e9aa55cdd863, + 0x06377aa9dad8eb29, + 0xa18ae87bb3279895, + 0x6edfda6a35e48414, + 0x6b7d9d19825094a7, + 0xd41cfa55a4e86cbf, + 0xe5caedc9ea42c59c, + 0xa36c351c0e6fc179, + 0x5181e4de6fabbf89, + 0xfff0c530184d17d4, + 0x9d41eb1584045892, + 0x1c0d525028d73961, + 0xf178ec180ca8856a, + 0x9a0571018ef811cd, + 0x4091a27c3ef5efcc, + 0x19af15239f6329d2, + 0x347450eff91eb990, + 0xe11b4a078dd27759, + 0xb9561de5fc601331, + 0x912f1f5a2da993c0, + 0x1654dcb65ba2191a, + 0x3e2dde098a6b99eb, + 0x8a66d71e0f82e3fe, + 0x8c51adb7d55a08d7, + 0x4533e50f8941ff7f, + 0x02e6dd67bd4859ec, + 0xe068aaba5df6d52f, + 0xc24826e3ff4a75a5, + 0x6c39070d88acddf8, + 0x6486548c4691a46f, + 0xd1bebd26135c7c0c, + 0xb30f93038f15334a, + 0x82d9849fc1bf9a69, + 0x9c320ba85420fae4, + 0xfa528243aff90767, + 0x9ed4d6cfe968a308, + 0xb825fd582c44b147, + 0x9b7691bc5edcb3bb, + 0xc7ea619048fe6516, + 0x1063a61f817af233, + 0x47d538683409a693, + 0x63c2ce984c6ded30, + 0x2a9fdfd86c81d91d, + 0x7b1e3b06032a6694, + 0x666089ebfbd9fd83, + 0x0a598ee67375207b, + 0x07449a140afc495f, + 0x2ca8a571b6593234, + 0x1f986f8a45bbc2fb, + 0x381aa4a050b372c2, + 0x5423a3add81faf3a, + 0x17273c0b8b86bb6c, + 0xfe83258dc869b5a2, + 0x287902bfd1c980f1, + 0xf5a94bd66b3837af, + 0x88800a79b2caba12, + 0x55504310083b0d4c, + 0xdf36940e07b9eeb2, + 0x04d1a7ce6790b2c5, + 0x612413fff125b4dc, + 0x26f12b97c52c124f, + 0x86082351a62f28ac, + 0xef93632f9937e5e7, + 0x3507b052293a1be6, + 0xe72c30ae570a9c70, + 0xd3586041ae1425e0, + 0xde4574b3d79d4cc4, + 0x92ba228040c5685a, + 0xf00b0ca5dc8c271c, + 0xbe1287f1f69c5a6e, + 0xf39e317fb1e0dc86, + 0x495d114020ec342d, + 0x699b407e3f18cd4b, + 0xdca3a9d46ad51528, + 0x0d1d14f279896924, + 0x0000000000000000, + 0x593eb75fa196c61e, + 0x2e4e78160b116bd8, + 0x6d4ae7b058887f8e, + 0xe65fd013872e3e06, + 0x7a6ddbbbd30ec4e2, + 0xac97fc89caaef1b1, + 0x09ccb33c1e19dbe1, + 0x89f3eac462ee1864, + 0x7770cf49aa87adc6, + 0x56c57eca6557f6d6, + 0x03953dda6d6cfb9a, + 0x36928d884456e07c, + 0x1eeb8f37959f608d, + 0x31d6179c4eaaa923, + 0x6fac3ad7e5c02662, + 0x43049fa653991456, + 0xabd3669dc052b8ee, + 0xaf02c153a7c20a2b, + 0x3ccb036e3723c007, + 0x93c9c23d90e1ca2c, + 0xc33bc65e2f6ed7d3, + 0x4cff56339758249e, + 0xb1e94e64325d6aa6, + 0x37e16d359472420a, + 0x79f8e661be623f78, + 0x5214d90402c74413, + 0x482ef1fdf0c8965b, + 0x13f69bc5ec1609a9, + 0x0e88292814e592be, + 0x4e198b542a107d72, + 0xccc00fcbebafe71b, + 0x1b49c844222b703e, + 0x2564164da840e9d5, + 0x20c6513e1ff4f966, + 0xbac3203f910ce8ab, + 0xf2edd1c261c47ef0, + 0x814cb945acd361f3, + 0x95feb8944a392105, + 0x5c9cf02c1622d6ad, + 0x971865f3f77178e9, + 0xbd87ba2b9bf0a1f4, + 0x444005b259655d09, + 0xed75be48247fbc0b, + 0x7596122e17cff42a, + 0xb44b091785e97a15, + 0x966b854e2755da9f, + 0xeee0839249134791, + 0x32432a4623c652b9, + 0xa8465b47ad3e4374, + 0xf8b45f2412b15e8b, + 0x2417f6f078644ba3, + 0xfb2162fe7fdda511, + 0x4bbbcc279da46dc1, + 0x0173e0bdd024a276, + 0x22208c59a2bca08a, + 0x8fc4906db836f34d, + 0xe4b90d743a6667ea, + 0x7147b5e0705f46ef, + 0x2782cb2a1508b039, + 0xec065ef5f45b1e7d, + 0x21b5b183cfd05b10, + 0xdbe733c060295c77, + 0x9fa73672394c017e, + 0xcf55321186c31c81, + 0xd8720e1a0d45a7ed, + 0x3b8f997a3ddf8958, + 0x3afc79c7edfb2b2e, + 0xe9a4198643ef0ece, + 0x5f09cdf67b4e2d37, + 0x4f6a6be9fa34df04, + 0xb6add47038a123f9, + 0x8d224d0a057eaaa1, + 0xc96248b85c1bf7a8, + 0xe3fd9760309a2eb5, + 0x0b2a6e5ba351820d, + 0xeb42c4e1fea75722, + 0x948d58299a1d8373, + 0x7fcf9cc864bad451, + 0xa55b4fb5d4b72a50, + 0x08bf5381ce3d7997, + 0x46a6d8d5e42d04e5, + 0xd22b80fc7e308796, + 0x57b69e77b57354a0, + 0x3969441d8097d0b4, + 0x3330cafbf3e2f0cf, + 0xe28e77dde0be8cc3, + 0x62b12e259c494f46, + 0xa6ce726fb9dbd1ca, + 0x41e242c1eed14dba, + 0x76032ff47aa30fb0, + }, + { + 0xe6f87e5c5b711fd0, + 0x258377800924fa16, + 0xc849e07e852ea4a8, + 0x5b4686a18f06c16a, + 0x0b32e9a2d77b416e, + 0xabda37a467815c66, + 0xf61796a81a686676, + 0xf5dc0b706391954b, + 0x4862f38db7e64bf1, + 0xff5c629a68bd85c5, + 0xcb827da6fcd75795, + 0x66d36daf69b9f089, + 0x356c9f74483d83b0, + 0x7cbcecb1238c99a1, + 0x36a702ac31c4708d, + 0x9eb6a8d02fbcdfd6, + 0x8b19fa51e5b3ae37, + 0x9ccfb5408a127d0b, + 0xbc0c78b508208f5a, + 0xe533e3842288eced, + 0xcec2c7d377c15fd2, + 0xec7817b6505d0f5e, + 0xb94cc2c08336871d, + 0x8c205db4cb0b04ad, + 0x763c855b28a0892f, + 0x588d1b79f6ff3257, + 0x3fecf69e4311933e, + 0x0fc0d39f803a18c9, + 0xee010a26f5f3ad83, + 0x10efe8f4411979a6, + 0x5dcda10c7de93a10, + 0x4a1bee1d1248e92c, + 0x53bff2db21847339, + 0xb4f50ccfa6a23d09, + 0x5fb4bc9cd84798cd, + 0xe88a2d8b071c56f9, + 0x7f7771695a756a9c, + 0xc5f02e71a0ba1ebc, + 0xa663f9ab4215e672, + 0x2eb19e22de5fbb78, + 0x0db9ce0f2594ba14, + 0x82520e6397664d84, + 0x2f031e6a0208ea98, + 0x5c7f2144a1be6bf0, + 0x7a37cb1cd16362db, + 0x83e08e2b4b311c64, + 0xcf70479bab960e32, + 0x856ba986b9dee71e, + 0xb5478c877af56ce9, + 0xb8fe42885f61d6fd, + 0x1bdd0156966238c8, + 0x622157923ef8a92e, + 0xfc97ff42114476f8, + 0x9d7d350856452ceb, + 0x4c90c9b0e0a71256, + 0x2308502dfbcb016c, + 0x2d7a03faa7a64845, + 0xf46e8b38bfc6c4ab, + 0xbdbef8fdd477deba, + 0x3aac4cebc8079b79, + 0xf09cb105e8879d0c, + 0x27fa6a10ac8a58cb, + 0x8960e7c1401d0cea, + 0x1a6f811e4a356928, + 0x90c4fb0773d196ff, + 0x43501a2f609d0a9f, + 0xf7a516e0c63f3796, + 0x1ce4a6b3b8da9252, + 0x1324752c38e08a9b, + 0xa5a864733bec154f, + 0x2bf124575549b33f, + 0xd766db15440dc5c7, + 0xa7d179e39e42b792, + 0xdadf151a61997fd3, + 0x86a0345ec0271423, + 0x38d5517b6da939a4, + 0x6518f077104003b4, + 0x02791d90a5aea2dd, + 0x88d267899c4a5d0a, + 0x930f66df0a2865c2, + 0x4ee9d4204509b08b, + 0x325538916685292a, + 0x412907bfc533a842, + 0xb27e2b62544dc673, + 0x6c5304456295e007, + 0x5af406e95351908a, + 0x1f2f3b6bc123616f, + 0xc37b09dc5255e5c6, + 0x3967d133b1fe6844, + 0x298839c7f0e711e2, + 0x409b87f71964f9a2, + 0xe938adc3db4b0719, + 0x0c0b4e47f9c3ebf4, + 0x5534d576d36b8843, + 0x4610a05aeb8b02d8, + 0x20c3cdf58232f251, + 0x6de1840dbec2b1e7, + 0xa0e8de06b0fa1d08, + 0x7b854b540d34333b, + 0x42e29a67bcca5b7f, + 0xd8a6088ac437dd0e, + 0xc63bb3a9d943ed81, + 0x21714dbd5e65a3b1, + 0x6761ede7b5eea169, + 0x2431f7c8d573abf6, + 0xd51fc685e1a3671a, + 0x5e063cd40410c92d, + 0x283ab98f2cb04002, + 0x8febc06cb2f2f790, + 0x17d64f116fa1d33c, + 0xe07359f1a99ee4aa, + 0x784ed68c74cdc006, + 0x6e2a19d5c73b42da, + 0x8712b4161c7045c3, + 0x371582e4ed93216d, + 0xace390414939f6fc, + 0x7ec5f12186223b7c, + 0xc0b094042bac16fb, + 0xf9d745379a527ebf, + 0x737c3f2ea3b68168, + 0x33e7b8d9bad278ca, + 0xa9a32a34c22ffebb, + 0xe48163ccfedfbd0d, + 0x8e5940246ea5a670, + 0x51c6ef4b842ad1e4, + 0x22bad065279c508c, + 0xd91488c218608cee, + 0x319ea5491f7cda17, + 0xd394e128134c9c60, + 0x094bf43272d5e3b3, + 0x9bf612a5a4aad791, + 0xccbbda43d26ffd0f, + 0x34de1f3c946ad250, + 0x4f5b5468995ee16b, + 0xdf9faf6fea8f7794, + 0x2648ea5870dd092b, + 0xbfc7e56d71d97c67, + 0xdde6b2ff4f21d549, + 0x3c276b463ae86003, + 0x91767b4faf86c71f, + 0x68a13e7835d4b9a0, + 0xb68c115f030c9fd4, + 0x141dd2c916582001, + 0x983d8f7ddd5324ac, + 0x64aa703fcc175254, + 0xc2c989948e02b426, + 0x3e5e76d69f46c2de, + 0x50746f03587d8004, + 0x45db3d829272f1e5, + 0x60584a029b560bf3, + 0xfbae58a73ffcdc62, + 0xa15a5e4e6cad4ce8, + 0x4ba96e55ce1fb8cc, + 0x08f9747aae82b253, + 0xc102144cf7fb471b, + 0x9f042898f3eb8e36, + 0x068b27adf2effb7a, + 0xedca97fe8c0a5ebe, + 0x778e0513f4f7d8cf, + 0x302c2501c32b8bf7, + 0x8d92ddfc175c554d, + 0xf865c57f46052f5f, + 0xeaf3301ba2b2f424, + 0xaa68b7ecbbd60d86, + 0x998f0f350104754c, + 0x0000000000000000, + 0xf12e314d34d0ccec, + 0x710522be061823b5, + 0xaf280d9930c005c1, + 0x97fd5ce25d693c65, + 0x19a41cc633cc9a15, + 0x95844172f8c79eb8, + 0xdc5432b7937684a9, + 0x9436c13a2490cf58, + 0x802b13f332c8ef59, + 0xc442ae397ced4f5c, + 0xfa1cd8efe3ab8d82, + 0xf2e5ac954d293fd1, + 0x6ad823e8907a1b7d, + 0x4d2249f83cf043b6, + 0x03cb9dd879f9f33d, + 0xde2d2f2736d82674, + 0x2a43a41f891ee2df, + 0x6f98999d1b6c133a, + 0xd4ad46cd3df436fa, + 0xbb35df50269825c0, + 0x964fdcaa813e6d85, + 0xeb41b0537ee5a5c4, + 0x0540ba758b160847, + 0xa41ae43be7bb44af, + 0xe3b8c429d0671797, + 0x819993bbee9fbeb9, + 0xae9a8dd1ec975421, + 0xf3572cdd917e6e31, + 0x6393d7dae2aff8ce, + 0x47a2201237dc5338, + 0xa32343dec903ee35, + 0x79fc56c4a89a91e6, + 0x01b28048dc5751e0, + 0x1296f564e4b7db7b, + 0x75f7188351597a12, + 0xdb6d9552bdce2e33, + 0x1e9dbb231d74308f, + 0x520d7293fdd322d9, + 0xe20a44610c304677, + 0xfeeee2d2b4ead425, + 0xca30fdee20800675, + 0x61eaca4a47015a13, + 0xe74afe1487264e30, + 0x2cc883b27bf119a5, + 0x1664cf59b3f682dc, + 0xa811aa7c1e78af5b, + 0x1d5626fb648dc3b2, + 0xb73e9117df5bce34, + 0xd05f7cf06ab56f5d, + 0xfd257f0acd132718, + 0x574dc8e676c52a9e, + 0x0739a7e52eb8aa9a, + 0x5486553e0f3cd9a3, + 0x56ff48aeaa927b7e, + 0xbe756525ad8e2d87, + 0x7d0e6cf9ffdbc841, + 0x3b1ecca31450ca99, + 0x6913be30e983e840, + 0xad511009956ea71c, + 0xb1b5b6ba2db4354e, + 0x4469bdca4e25a005, + 0x15af5281ca0f71e1, + 0x744598cb8d0e2bf2, + 0x593f9b312aa863b7, + 0xefb38a6e29a4fc63, + 0x6b6aa3a04c2d4a9d, + 0x3d95eb0ee6bf31e3, + 0xa291c3961554bfd5, + 0x18169c8eef9bcbf5, + 0x115d68bc9d4e2846, + 0xba875f18facf7420, + 0xd1edfcb8b6e23ebd, + 0xb00736f2f1e364ae, + 0x84d929ce6589b6fe, + 0x70b7a2f6da4f7255, + 0x0e7253d75c6d4929, + 0x04f23a3d574159a7, + 0x0a8069ea0b2c108e, + 0x49d073c56bb11a11, + 0x8aab7a1939e4ffd7, + 0xcd095a0b0e38acef, + 0xc9fb60365979f548, + 0x92bde697d67f3422, + 0xc78933e10514bc61, + 0xe1c1d9b975c9b54a, + 0xd2266160cf1bcd80, + 0x9a4492ed78fd8671, + 0xb3ccab2a881a9793, + 0x72cebf667fe1d088, + 0xd6d45b5d985a9427, + }, +}; + +__constant u64 sbob_rc64[12][8] = +{ + { + 0xe9daca1eda5b08b1, + 0x1f7c65c0812fcbeb, + 0x16d0452e43766a2f, + 0xfcc485758db84e71, + 0x0169679291e07c4b, + 0x15d360a4082a42a2, + 0x234d74cc36747605, + 0x0745a6f2596580dd, + }, + { + 0x1a2f9da98ab5a36f, + 0xd7b5700f469de34f, + 0x982b230a72eafef3, + 0x3101b5160f5ed561, + 0x5899d6126b17b59a, + 0xcaa70adbc261b55c, + 0x56cdcbd71ba2dd55, + 0xb79bb121700479e6, + }, + { + 0xc72fce2bacdc74f5, + 0x35843d6a28fc390a, + 0x8b1f9c525f5ef106, + 0x7b7b29b11475eaf2, + 0xb19e3590e40fe2d3, + 0x09db6260373ac9c1, + 0x31db7a8643f4b6c2, + 0xb20aba0af5961e99, + }, + { + 0xd26615e8b3df1fef, + 0xdde4715da0e148f9, + 0x7d3c5c337e858e48, + 0x3f355e68ad1c729d, + 0x75d603ed822cd7a9, + 0xbe0352933313b7d8, + 0xf137e893a1ea5334, + 0x2ed1e384bcbe0c22, + }, + { + 0x994747adac6bea4b, + 0x6323a96c0c413f9a, + 0x4a1086161f1c157f, + 0xbdff0f80d7359e35, + 0xa3f53a254717cdbf, + 0x161a2723b700ffdf, + 0xf563eaa97ea2567a, + 0x57fe6c7cfd581760, + }, + { + 0xd9d33a1daeae4fae, + 0xc039307a3bc3a46f, + 0x6ca44251f9c4662d, + 0xc68ef09ab49a7f18, + 0xb4b79a1cb7a6facf, + 0xb6c6bec2661ff20a, + 0x354f903672c571bf, + 0x6e7d64467a4068fa, + }, + { + 0xecc5aaee160ec7f4, + 0x540924bffe86ac51, + 0xc987bfe6c7c69e39, + 0xc9937a19333e47d3, + 0x372c822dc5ab9209, + 0x04054a2883694706, + 0xf34a3ca24c451735, + 0x93d4143a4d568688, + }, + { + 0xa7c9934d425b1f9b, + 0x41416e0c02aae703, + 0x1ede369c71f8b74e, + 0x9ac4db4d3b44b489, + 0x90069b92cb2b89f4, + 0x2fc4a5d12b8dd169, + 0xd9a8515935c2ac36, + 0x1ee702bfd40d7fa4, + }, + { + 0x9b223116545a8f37, + 0xde5f16ecd89a4c94, + 0x244289251b3a7d3a, + 0x84090de0b755d93c, + 0xb1ceb2db0b440a80, + 0x549c07a69a8a2b7b, + 0x602a1fcb92dc380e, + 0xdb5a238351446172, + }, + { + 0x526f0580a6debeab, + 0xf3f3e4b248e52a38, + 0xdb788aff1ce74189, + 0x0361331b8ae1ff1f, + 0x4b3369af0267e79f, + 0xf452763b306c1e7a, + 0xc3b63b15d1fa9836, + 0xed9c4598fbc7b474, + }, + { + 0xfb89c8efd09ecd7b, + 0x94fe5a63cdc60230, + 0x6107abebbb6bfad8, + 0x7966841421800120, + 0xcab948eaef711d8a, + 0x986e477d1dcdbaef, + 0x5dd86fc04a59a2de, + 0x1b2df381cda4ca6b, + }, + { + 0xba3116f167e78e37, + 0x7ab14904b08013d2, + 0x771ddfbc323ca4cd, + 0x9b9f2130d41220f8, + 0x86cc91189def805d, + 0x5228e188aaa41de7, + 0x991bb2d9d517f4fa, + 0x20d71bf14a92bc48, + }, +}; + +static void streebog_g (u64 h[8], const u64 m[8], __local u64 s_sbob_sl64[8][256]) +{ + u64 k[8]; + u64 s[8]; + u64 t[8]; + + #pragma unroll + for (int i = 0; i < 8; i++) + { + t[i] = h[i]; + } + + for (int i = 0; i < 8; i++) + { + k[i] = SBOG_LPSti64; + } + + #pragma unroll + for (int i = 0; i < 8; i++) + { + s[i] = m[i]; + } + + for (int r = 0; r < 12; r++) + { + #pragma unroll + for (int i = 0; i < 8; i++) + { + t[i] = s[i] ^ k[i]; + } + + #pragma unroll + for (int i = 0; i < 8; i++) + { + s[i] = SBOG_LPSti64; + } + + for (int i = 0; i < 8; i++) + { + t[i] = k[i] ^ sbob_rc64[r][i]; + } + + #pragma unroll + for (int i = 0; i < 8; i++) + { + k[i] = SBOG_LPSti64; + } + } + + #pragma unroll + for (int i = 0; i < 8; i++) + { + h[i] ^= s[i] ^ k[i] ^ m[i]; + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m11700_m04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * shared lookup table + */ + + const u32 lid4 = lid * 4; + + __local u64 s_sbob_sl64[8][256]; + + s_sbob_sl64[0][lid4 + 0] = sbob_sl64[0][lid4 + 0]; + s_sbob_sl64[0][lid4 + 1] = sbob_sl64[0][lid4 + 1]; + s_sbob_sl64[0][lid4 + 2] = sbob_sl64[0][lid4 + 2]; + s_sbob_sl64[0][lid4 + 3] = sbob_sl64[0][lid4 + 3]; + s_sbob_sl64[1][lid4 + 0] = sbob_sl64[1][lid4 + 0]; + s_sbob_sl64[1][lid4 + 1] = sbob_sl64[1][lid4 + 1]; + s_sbob_sl64[1][lid4 + 2] = sbob_sl64[1][lid4 + 2]; + s_sbob_sl64[1][lid4 + 3] = sbob_sl64[1][lid4 + 3]; + s_sbob_sl64[2][lid4 + 0] = sbob_sl64[2][lid4 + 0]; + s_sbob_sl64[2][lid4 + 1] = sbob_sl64[2][lid4 + 1]; + s_sbob_sl64[2][lid4 + 2] = sbob_sl64[2][lid4 + 2]; + s_sbob_sl64[2][lid4 + 3] = sbob_sl64[2][lid4 + 3]; + s_sbob_sl64[3][lid4 + 0] = sbob_sl64[3][lid4 + 0]; + s_sbob_sl64[3][lid4 + 1] = sbob_sl64[3][lid4 + 1]; + s_sbob_sl64[3][lid4 + 2] = sbob_sl64[3][lid4 + 2]; + s_sbob_sl64[3][lid4 + 3] = sbob_sl64[3][lid4 + 3]; + s_sbob_sl64[4][lid4 + 0] = sbob_sl64[4][lid4 + 0]; + s_sbob_sl64[4][lid4 + 1] = sbob_sl64[4][lid4 + 1]; + s_sbob_sl64[4][lid4 + 2] = sbob_sl64[4][lid4 + 2]; + s_sbob_sl64[4][lid4 + 3] = sbob_sl64[4][lid4 + 3]; + s_sbob_sl64[5][lid4 + 0] = sbob_sl64[5][lid4 + 0]; + s_sbob_sl64[5][lid4 + 1] = sbob_sl64[5][lid4 + 1]; + s_sbob_sl64[5][lid4 + 2] = sbob_sl64[5][lid4 + 2]; + s_sbob_sl64[5][lid4 + 3] = sbob_sl64[5][lid4 + 3]; + s_sbob_sl64[6][lid4 + 0] = sbob_sl64[6][lid4 + 0]; + s_sbob_sl64[6][lid4 + 1] = sbob_sl64[6][lid4 + 1]; + s_sbob_sl64[6][lid4 + 2] = sbob_sl64[6][lid4 + 2]; + s_sbob_sl64[6][lid4 + 3] = sbob_sl64[6][lid4 + 3]; + s_sbob_sl64[7][lid4 + 0] = sbob_sl64[7][lid4 + 0]; + s_sbob_sl64[7][lid4 + 1] = sbob_sl64[7][lid4 + 1]; + s_sbob_sl64[7][lid4 + 2] = sbob_sl64[7][lid4 + 2]; + s_sbob_sl64[7][lid4 + 3] = sbob_sl64[7][lid4 + 3]; + + barrier (CLK_LOCAL_MEM_FENCE); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + u32x pw_buf1[4]; + + pw_buf1[0] = pws[gid].i[ 4]; + pw_buf1[1] = pws[gid].i[ 5]; + pw_buf1[2] = pws[gid].i[ 6]; + pw_buf1[3] = pws[gid].i[ 7]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w[16]; + + w[ 0] = pw_buf0[0]; + w[ 1] = pw_buf0[1]; + w[ 2] = pw_buf0[2]; + w[ 3] = pw_buf0[3]; + w[ 4] = pw_buf1[0]; + w[ 5] = pw_buf1[1]; + w[ 6] = pw_buf1[2]; + w[ 7] = pw_buf1[3]; + w[ 8] = 0; + w[ 9] = 0; + w[10] = 0; + w[11] = 0; + w[12] = 0; + w[13] = 0; + w[14] = 0; + w[15] = 0; + + const u32 out_len = apply_rules (rules_buf[il_pos].cmds, &w[0], &w[1], pw_len); + + append_0x01_2 (&w[0], &w[1], out_len); + + /** + * reverse message block + */ + + u64 m[8]; + + m[0] = hl32_to_64 (w[15], w[14]); + m[1] = hl32_to_64 (w[13], w[12]); + m[2] = hl32_to_64 (w[11], w[10]); + m[3] = hl32_to_64 (w[ 9], w[ 8]); + m[4] = hl32_to_64 (w[ 7], w[ 6]); + m[5] = hl32_to_64 (w[ 5], w[ 4]); + m[6] = hl32_to_64 (w[ 3], w[ 2]); + m[7] = hl32_to_64 (w[ 1], w[ 0]); + + m[0] = swap_workaround (m[0]); + m[1] = swap_workaround (m[1]); + m[2] = swap_workaround (m[2]); + m[3] = swap_workaround (m[3]); + m[4] = swap_workaround (m[4]); + m[5] = swap_workaround (m[5]); + m[6] = swap_workaround (m[6]); + m[7] = swap_workaround (m[7]); + + // state buffer (hash) + + u64 h[8]; + + h[0] = INITVAL; + h[1] = INITVAL; + h[2] = INITVAL; + h[3] = INITVAL; + h[4] = INITVAL; + h[5] = INITVAL; + h[6] = INITVAL; + h[7] = INITVAL; + + streebog_g (h, m, s_sbob_sl64); + + u64 z[8]; + + z[0] = 0; + z[1] = 0; + z[2] = 0; + z[3] = 0; + z[4] = 0; + z[5] = 0; + z[6] = 0; + z[7] = swap_workaround ((u64) (out_len * 8)); + + streebog_g (h, z, s_sbob_sl64); + streebog_g (h, m, s_sbob_sl64); + + const u32 r0 = l32_from_64 (h[0]); + const u32 r1 = h32_from_64 (h[0]); + const u32 r2 = l32_from_64 (h[1]); + const u32 r3 = h32_from_64 (h[1]); + + #include VECT_COMPARE_M + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m11700_m08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m11700_m16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m11700_s04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + + /** + * shared lookup table + */ + + const u32 lid4 = lid * 4; + + __local u64 s_sbob_sl64[8][256]; + + s_sbob_sl64[0][lid4 + 0] = sbob_sl64[0][lid4 + 0]; + s_sbob_sl64[0][lid4 + 1] = sbob_sl64[0][lid4 + 1]; + s_sbob_sl64[0][lid4 + 2] = sbob_sl64[0][lid4 + 2]; + s_sbob_sl64[0][lid4 + 3] = sbob_sl64[0][lid4 + 3]; + s_sbob_sl64[1][lid4 + 0] = sbob_sl64[1][lid4 + 0]; + s_sbob_sl64[1][lid4 + 1] = sbob_sl64[1][lid4 + 1]; + s_sbob_sl64[1][lid4 + 2] = sbob_sl64[1][lid4 + 2]; + s_sbob_sl64[1][lid4 + 3] = sbob_sl64[1][lid4 + 3]; + s_sbob_sl64[2][lid4 + 0] = sbob_sl64[2][lid4 + 0]; + s_sbob_sl64[2][lid4 + 1] = sbob_sl64[2][lid4 + 1]; + s_sbob_sl64[2][lid4 + 2] = sbob_sl64[2][lid4 + 2]; + s_sbob_sl64[2][lid4 + 3] = sbob_sl64[2][lid4 + 3]; + s_sbob_sl64[3][lid4 + 0] = sbob_sl64[3][lid4 + 0]; + s_sbob_sl64[3][lid4 + 1] = sbob_sl64[3][lid4 + 1]; + s_sbob_sl64[3][lid4 + 2] = sbob_sl64[3][lid4 + 2]; + s_sbob_sl64[3][lid4 + 3] = sbob_sl64[3][lid4 + 3]; + s_sbob_sl64[4][lid4 + 0] = sbob_sl64[4][lid4 + 0]; + s_sbob_sl64[4][lid4 + 1] = sbob_sl64[4][lid4 + 1]; + s_sbob_sl64[4][lid4 + 2] = sbob_sl64[4][lid4 + 2]; + s_sbob_sl64[4][lid4 + 3] = sbob_sl64[4][lid4 + 3]; + s_sbob_sl64[5][lid4 + 0] = sbob_sl64[5][lid4 + 0]; + s_sbob_sl64[5][lid4 + 1] = sbob_sl64[5][lid4 + 1]; + s_sbob_sl64[5][lid4 + 2] = sbob_sl64[5][lid4 + 2]; + s_sbob_sl64[5][lid4 + 3] = sbob_sl64[5][lid4 + 3]; + s_sbob_sl64[6][lid4 + 0] = sbob_sl64[6][lid4 + 0]; + s_sbob_sl64[6][lid4 + 1] = sbob_sl64[6][lid4 + 1]; + s_sbob_sl64[6][lid4 + 2] = sbob_sl64[6][lid4 + 2]; + s_sbob_sl64[6][lid4 + 3] = sbob_sl64[6][lid4 + 3]; + s_sbob_sl64[7][lid4 + 0] = sbob_sl64[7][lid4 + 0]; + s_sbob_sl64[7][lid4 + 1] = sbob_sl64[7][lid4 + 1]; + s_sbob_sl64[7][lid4 + 2] = sbob_sl64[7][lid4 + 2]; + s_sbob_sl64[7][lid4 + 3] = sbob_sl64[7][lid4 + 3]; + + barrier (CLK_LOCAL_MEM_FENCE); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + u32x pw_buf1[4]; + + pw_buf1[0] = pws[gid].i[ 4]; + pw_buf1[1] = pws[gid].i[ 5]; + pw_buf1[2] = pws[gid].i[ 6]; + pw_buf1[3] = pws[gid].i[ 7]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w[16]; + + w[ 0] = pw_buf0[0]; + w[ 1] = pw_buf0[1]; + w[ 2] = pw_buf0[2]; + w[ 3] = pw_buf0[3]; + w[ 4] = pw_buf1[0]; + w[ 5] = pw_buf1[1]; + w[ 6] = pw_buf1[2]; + w[ 7] = pw_buf1[3]; + w[ 8] = 0; + w[ 9] = 0; + w[10] = 0; + w[11] = 0; + w[12] = 0; + w[13] = 0; + w[14] = 0; + w[15] = 0; + + const u32 out_len = apply_rules (rules_buf[il_pos].cmds, &w[0], &w[1], pw_len); + + append_0x01_2 (&w[0], &w[1], out_len); + + /** + * reverse message block + */ + + u64 m[8]; + + m[0] = hl32_to_64 (w[15], w[14]); + m[1] = hl32_to_64 (w[13], w[12]); + m[2] = hl32_to_64 (w[11], w[10]); + m[3] = hl32_to_64 (w[ 9], w[ 8]); + m[4] = hl32_to_64 (w[ 7], w[ 6]); + m[5] = hl32_to_64 (w[ 5], w[ 4]); + m[6] = hl32_to_64 (w[ 3], w[ 2]); + m[7] = hl32_to_64 (w[ 1], w[ 0]); + + m[0] = swap_workaround (m[0]); + m[1] = swap_workaround (m[1]); + m[2] = swap_workaround (m[2]); + m[3] = swap_workaround (m[3]); + m[4] = swap_workaround (m[4]); + m[5] = swap_workaround (m[5]); + m[6] = swap_workaround (m[6]); + m[7] = swap_workaround (m[7]); + + // state buffer (hash) + + u64 h[8]; + + h[0] = INITVAL; + h[1] = INITVAL; + h[2] = INITVAL; + h[3] = INITVAL; + h[4] = INITVAL; + h[5] = INITVAL; + h[6] = INITVAL; + h[7] = INITVAL; + + streebog_g (h, m, s_sbob_sl64); + + u64 z[8]; + + z[0] = 0; + z[1] = 0; + z[2] = 0; + z[3] = 0; + z[4] = 0; + z[5] = 0; + z[6] = 0; + z[7] = swap_workaround ((u64) (out_len * 8)); + + streebog_g (h, z, s_sbob_sl64); + streebog_g (h, m, s_sbob_sl64); + + const u32 r0 = l32_from_64 (h[0]); + const u32 r1 = h32_from_64 (h[0]); + const u32 r2 = l32_from_64 (h[1]); + const u32 r3 = h32_from_64 (h[1]); + + #include VECT_COMPARE_S + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m11700_s08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m11700_s16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/amd/m11700_a1.cl b/amd/m11700_a1.cl new file mode 100644 index 0000000000..bb457519ed --- /dev/null +++ b/amd/m11700_a1.cl @@ -0,0 +1,2780 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _GOST2012_256_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW4 +#define VECT_SIZE1 +#endif + +#ifdef VLIW5 +#define VECT_SIZE1 +#endif + +#define DGST_R0 0 +#define DGST_R1 1 +#define DGST_R2 2 +#define DGST_R3 3 + +#include "include/kernel_functions.c" +#include "types_amd.c" +#include "common_amd.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +#define INITVAL 0x0101010101010101 + +#define SBOG_LPSti64 \ + s_sbob_sl64[0][(t[0] >> (i * 8)) & 0xff] ^ \ + s_sbob_sl64[1][(t[1] >> (i * 8)) & 0xff] ^ \ + s_sbob_sl64[2][(t[2] >> (i * 8)) & 0xff] ^ \ + s_sbob_sl64[3][(t[3] >> (i * 8)) & 0xff] ^ \ + s_sbob_sl64[4][(t[4] >> (i * 8)) & 0xff] ^ \ + s_sbob_sl64[5][(t[5] >> (i * 8)) & 0xff] ^ \ + s_sbob_sl64[6][(t[6] >> (i * 8)) & 0xff] ^ \ + s_sbob_sl64[7][(t[7] >> (i * 8)) & 0xff] + +// constants + +__constant u64 sbob_sl64[8][256] = +{ + { + 0xd031c397ce553fe6, + 0x16ba5b01b006b525, + 0xa89bade6296e70c8, + 0x6a1f525d77d3435b, + 0x6e103570573dfa0b, + 0x660efb2a17fc95ab, + 0x76327a9e97634bf6, + 0x4bad9d6462458bf5, + 0xf1830caedbc3f748, + 0xc5c8f542669131ff, + 0x95044a1cdc48b0cb, + 0x892962df3cf8b866, + 0xb0b9e208e930c135, + 0xa14fb3f0611a767c, + 0x8d2605f21c160136, + 0xd6b71922fecc549e, + 0x37089438a5907d8b, + 0x0b5da38e5803d49c, + 0x5a5bcc9cea6f3cbc, + 0xedae246d3b73ffe5, + 0xd2b87e0fde22edce, + 0x5e54abb1ca8185ec, + 0x1de7f88fe80561b9, + 0xad5e1a870135a08c, + 0x2f2adbd665cecc76, + 0x5780b5a782f58358, + 0x3edc8a2eede47b3f, + 0xc9d95c3506bee70f, + 0x83be111d6c4e05ee, + 0xa603b90959367410, + 0x103c81b4809fde5d, + 0x2c69b6027d0c774a, + 0x399080d7d5c87953, + 0x09d41e16487406b4, + 0xcdd63b1826505e5f, + 0xf99dc2f49b0298e8, + 0x9cd0540a943cb67f, + 0xbca84b7f891f17c5, + 0x723d1db3b78df2a6, + 0x78aa6e71e73b4f2e, + 0x1433e699a071670d, + 0x84f21be454620782, + 0x98df3327b4d20f2f, + 0xf049dce2d3769e5c, + 0xdb6c60199656eb7a, + 0x648746b2078b4783, + 0x32cd23598dcbadcf, + 0x1ea4955bf0c7da85, + 0xe9a143401b9d46b5, + 0xfd92a5d9bbec21b8, + 0xc8138c790e0b8e1b, + 0x2ee00b9a6d7ba562, + 0xf85712b893b7f1fc, + 0xeb28fed80bea949d, + 0x564a65eb8a40ea4c, + 0x6c9988e8474a2823, + 0x4535898b121d8f2d, + 0xabd8c03231accbf4, + 0xba2e91cab9867cbd, + 0x7960be3def8e263a, + 0x0c11a977602fd6f0, + 0xcb50e1ad16c93527, + 0xeae22e94035ffd89, + 0x2866d12f5de2ce1a, + 0xff1b1841ab9bf390, + 0x9f9339de8cfe0d43, + 0x964727c8c48a0bf7, + 0x524502c6aaae531c, + 0x9b9c5ef3ac10b413, + 0x4fa2fa4942ab32a5, + 0x3f165a62e551122b, + 0xc74148da76e6e3d7, + 0x924840e5e464b2a7, + 0xd372ae43d69784da, + 0x233b72a105e11a86, + 0xa48a04914941a638, + 0xb4b68525c9de7865, + 0xddeabaaca6cf8002, + 0x0a9773c250b6bd88, + 0xc284ffbb5ebd3393, + 0x8ba0df472c8f6a4e, + 0x2aef6cb74d951c32, + 0x427983722a318d41, + 0x73f7cdffbf389bb2, + 0x074c0af9382c026c, + 0x8a6a0f0b243a035a, + 0x6fdae53c5f88931f, + 0xc68b98967e538ac3, + 0x44ff59c71aa8e639, + 0xe2fce0ce439e9229, + 0xa20cde2479d8cd40, + 0x19e89fa2c8ebd8e9, + 0xf446bbcff398270c, + 0x43b3533e2284e455, + 0xd82f0dcd8e945046, + 0x51066f12b26ce820, + 0xe73957af6bc5426d, + 0x081ece5a40c16fa0, + 0x3b193d4fc5bfab7b, + 0x7fe66488df174d42, + 0x0e9814ef705804d8, + 0x8137ac857c39d7c6, + 0xb1733244e185a821, + 0x695c3f896f11f867, + 0xf6cf0657e3eff524, + 0x1aabf276d02963d5, + 0x2da3664e75b91e5e, + 0x0289bd981077d228, + 0x90c1fd7df413608f, + 0x3c5537b6fd93a917, + 0xaa12107e3919a2e0, + 0x0686dab530996b78, + 0xdaa6b0559ee3826e, + 0xc34e2ff756085a87, + 0x6d5358a44fff4137, + 0xfc587595b35948ac, + 0x7ca5095cc7d5f67e, + 0xfb147f6c8b754ac0, + 0xbfeb26ab91ddacf9, + 0x6896efc567a49173, + 0xca9a31e11e7c5c33, + 0xbbe44186b13315a9, + 0x0ddb793b689abfe4, + 0x70b4a02ba7fa208e, + 0xe47a3a7b7307f951, + 0x8cecd5be14a36822, + 0xeeed49b923b144d9, + 0x17708b4db8b3dc31, + 0x6088219f2765fed3, + 0xb3fa8fdcf1f27a09, + 0x910b2d31fca6099b, + 0x0f52c4a378ed6dcc, + 0x50ccbf5ebad98134, + 0x6bd582117f662a4f, + 0x94ce9a50d4fdd9df, + 0x2b25bcfb45207526, + 0x67c42b661f49fcbf, + 0x492420fc723259dd, + 0x03436dd418c2bb3c, + 0x1f6e4517f872b391, + 0xa08563bc69af1f68, + 0xd43ea4baeebb86b6, + 0x01cad04c08b56914, + 0xac94cacb0980c998, + 0x54c3d8739a373864, + 0x26fec5c02dbacac2, + 0xdea9d778be0d3b3e, + 0x040f672d20eeb950, + 0xe5b0ea377bb29045, + 0xf30ab136cbb42560, + 0x62019c0737122cfb, + 0xe86b930c13282fa1, + 0xcc1ceb542ee5374b, + 0x538fd28aa21b3a08, + 0x1b61223ad89c0ac1, + 0x36c24474ad25149f, + 0x7a23d3e9f74c9d06, + 0xbe21f6e79968c5ed, + 0xcf5f868036278c77, + 0xf705d61beb5a9c30, + 0x4d2b47d152dce08d, + 0x5f9e7bfdc234ecf8, + 0x247778583dcd18ea, + 0x867ba67c4415d5aa, + 0x4ce1979d5a698999, + 0x0000000000000000, + 0xec64f42133c696f1, + 0xb57c5569c16b1171, + 0xc1c7926f467f88af, + 0x654d96fe0f3e2e97, + 0x15f936d5a8c40e19, + 0xb8a72c52a9f1ae95, + 0xa9517daa21db19dc, + 0x58d27104fa18ee94, + 0x5918a148f2ad8780, + 0x5cdd1629daf657c4, + 0x8274c15164fb6cfa, + 0xd1fb13dbc6e056f2, + 0x7d6fd910cf609f6a, + 0xb63f38bdd9a9aa4d, + 0x3d9fe7faf526c003, + 0x74bbc706871499de, + 0xdf630734b6b8522a, + 0x3ad3ed03cd0ac26f, + 0xfadeaf2083c023d4, + 0xc00d42234ecae1bb, + 0x8538cba85cd76e96, + 0xc402250e6e2458eb, + 0x47bc3413026a5d05, + 0xafd7a71f114272a4, + 0x978df784cc3f62e3, + 0xb96dfc1ea144c781, + 0x21b2cf391596c8ae, + 0x318e4e8d950916f3, + 0xce9556cc3e92e563, + 0x385a509bdd7d1047, + 0x358129a0b5e7afa3, + 0xe6f387e363702b79, + 0xe0755d5653e94001, + 0x7be903a5fff9f412, + 0x12b53c2c90e80c75, + 0x3307f315857ec4db, + 0x8fafb86a0c61d31e, + 0xd9e5dd8186213952, + 0x77f8aad29fd622e2, + 0x25bda814357871fe, + 0x7571174a8fa1f0ca, + 0x137fec60985d6561, + 0x30449ec19dbc7fe7, + 0xa540d4dd41f4cf2c, + 0xdc206ae0ae7ae916, + 0x5b911cd0e2da55a8, + 0xb2305f90f947131d, + 0x344bf9ecbd52c6b7, + 0x5d17c665d2433ed0, + 0x18224feec05eb1fd, + 0x9e59e992844b6457, + 0x9a568ebfa4a5dd07, + 0xa3c60e68716da454, + 0x7e2cb4c4d7a22456, + 0x87b176304ca0bcbe, + 0x413aeea632f3367d, + 0x9915e36bbc67663b, + 0x40f03eea3a465f69, + 0x1c2d28c3e0b008ad, + 0x4e682a054a1e5bb1, + 0x05c5b761285bd044, + 0xe1bf8d1a5b5c2915, + 0xf2c0617ac3014c74, + 0xb7f5e8f1d11cc359, + 0x63cb4c4b3fa745ef, + 0x9d1a84469c89df6b, + 0xe33630824b2bfb3d, + 0xd5f474f6e60eefa2, + 0xf58c6b83fb2d4e18, + 0x4676e45f0adf3411, + 0x20781f751d23a1ba, + 0xbd629b3381aa7ed1, + 0xae1d775319f71bb0, + 0xfed1c80da32e9a84, + 0x5509083f92825170, + 0x29ac01635557a70e, + 0xa7c9694551831d04, + 0x8e65682604d4ba0a, + 0x11f651f8882ab749, + 0xd77dc96ef6793d8a, + 0xef2799f52b042dcd, + 0x48eef0b07a8730c9, + 0x22f1a2ed0d547392, + 0x6142f1d32fd097c7, + 0x4a674d286af0e2e1, + 0x80fd7cc9748cbed2, + 0x717e7067af4f499a, + 0x938290a9ecd1dbb3, + 0x88e3b293344dd172, + 0x2734158c250fa3d6, + }, + { + 0x7e37e62dfc7d40c3, + 0x776f25a4ee939e5b, + 0xe045c850dd8fb5ad, + 0x86ed5ba711ff1952, + 0xe91d0bd9cf616b35, + 0x37e0ab256e408ffb, + 0x9607f6c031025a7a, + 0x0b02f5e116d23c9d, + 0xf3d8486bfb50650c, + 0x621cff27c40875f5, + 0x7d40cb71fa5fd34a, + 0x6daa6616daa29062, + 0x9f5f354923ec84e2, + 0xec847c3dc507c3b3, + 0x025a3668043ce205, + 0xa8bf9e6c4dac0b19, + 0xfa808be2e9bebb94, + 0xb5b99c5277c74fa3, + 0x78d9bc95f0397bcc, + 0xe332e50cdbad2624, + 0xc74fce129332797e, + 0x1729eceb2ea709ab, + 0xc2d6b9f69954d1f8, + 0x5d898cbfbab8551a, + 0x859a76fb17dd8adb, + 0x1be85886362f7fb5, + 0xf6413f8ff136cd8a, + 0xd3110fa5bbb7e35c, + 0x0a2feed514cc4d11, + 0xe83010edcd7f1ab9, + 0xa1e75de55f42d581, + 0xeede4a55c13b21b6, + 0xf2f5535ff94e1480, + 0x0cc1b46d1888761e, + 0xbce15fdb6529913b, + 0x2d25e8975a7181c2, + 0x71817f1ce2d7a554, + 0x2e52c5cb5c53124b, + 0xf9f7a6beef9c281d, + 0x9e722e7d21f2f56e, + 0xce170d9b81dca7e6, + 0x0e9b82051cb4941b, + 0x1e712f623c49d733, + 0x21e45cfa42f9f7dc, + 0xcb8e7a7f8bba0f60, + 0x8e98831a010fb646, + 0x474ccf0d8e895b23, + 0xa99285584fb27a95, + 0x8cc2b57205335443, + 0x42d5b8e984eff3a5, + 0x012d1b34021e718c, + 0x57a6626aae74180b, + 0xff19fc06e3d81312, + 0x35ba9d4d6a7c6dfe, + 0xc9d44c178f86ed65, + 0x506523e6a02e5288, + 0x03772d5c06229389, + 0x8b01f4fe0b691ec0, + 0xf8dabd8aed825991, + 0x4c4e3aec985b67be, + 0xb10df0827fbf96a9, + 0x6a69279ad4f8dae1, + 0xe78689dcd3d5ff2e, + 0x812e1a2b1fa553d1, + 0xfbad90d6eba0ca18, + 0x1ac543b234310e39, + 0x1604f7df2cb97827, + 0xa6241c6951189f02, + 0x753513cceaaf7c5e, + 0x64f2a59fc84c4efa, + 0x247d2b1e489f5f5a, + 0xdb64d718ab474c48, + 0x79f4a7a1f2270a40, + 0x1573da832a9bebae, + 0x3497867968621c72, + 0x514838d2a2302304, + 0xf0af6537fd72f685, + 0x1d06023e3a6b44ba, + 0x678588c3ce6edd73, + 0x66a893f7cc70acff, + 0xd4d24e29b5eda9df, + 0x3856321470ea6a6c, + 0x07c3418c0e5a4a83, + 0x2bcbb22f5635bacd, + 0x04b46cd00878d90a, + 0x06ee5ab80c443b0f, + 0x3b211f4876c8f9e5, + 0x0958c38912eede98, + 0xd14b39cdbf8b0159, + 0x397b292072f41be0, + 0x87c0409313e168de, + 0xad26e98847caa39f, + 0x4e140c849c6785bb, + 0xd5ff551db7f3d853, + 0xa0ca46d15d5ca40d, + 0xcd6020c787fe346f, + 0x84b76dcf15c3fb57, + 0xdefda0fca121e4ce, + 0x4b8d7b6096012d3d, + 0x9ac642ad298a2c64, + 0x0875d8bd10f0af14, + 0xb357c6ea7b8374ac, + 0x4d6321d89a451632, + 0xeda96709c719b23f, + 0xf76c24bbf328bc06, + 0xc662d526912c08f2, + 0x3ce25ec47892b366, + 0xb978283f6f4f39bd, + 0xc08c8f9e9d6833fd, + 0x4f3917b09e79f437, + 0x593de06fb2c08c10, + 0xd6887841b1d14bda, + 0x19b26eee32139db0, + 0xb494876675d93e2f, + 0x825937771987c058, + 0x90e9ac783d466175, + 0xf1827e03ff6c8709, + 0x945dc0a8353eb87f, + 0x4516f9658ab5b926, + 0x3f9573987eb020ef, + 0xb855330b6d514831, + 0x2ae6a91b542bcb41, + 0x6331e413c6160479, + 0x408f8e8180d311a0, + 0xeff35161c325503a, + 0xd06622f9bd9570d5, + 0x8876d9a20d4b8d49, + 0xa5533135573a0c8b, + 0xe168d364df91c421, + 0xf41b09e7f50a2f8f, + 0x12b09b0f24c1a12d, + 0xda49cc2ca9593dc4, + 0x1f5c34563e57a6bf, + 0x54d14f36a8568b82, + 0xaf7cdfe043f6419a, + 0xea6a2685c943f8bc, + 0xe5dcbfb4d7e91d2b, + 0xb27addde799d0520, + 0x6b443caed6e6ab6d, + 0x7bae91c9f61be845, + 0x3eb868ac7cae5163, + 0x11c7b65322e332a4, + 0xd23c1491b9a992d0, + 0x8fb5982e0311c7ca, + 0x70ac6428e0c9d4d8, + 0x895bc2960f55fcc5, + 0x76423e90ec8defd7, + 0x6ff0507ede9e7267, + 0x3dcf45f07a8cc2ea, + 0x4aa06054941f5cb1, + 0x5810fb5bb0defd9c, + 0x5efea1e3bc9ac693, + 0x6edd4b4adc8003eb, + 0x741808f8e8b10dd2, + 0x145ec1b728859a22, + 0x28bc9f7350172944, + 0x270a06424ebdccd3, + 0x972aedf4331c2bf6, + 0x059977e40a66a886, + 0x2550302a4a812ed6, + 0xdd8a8da0a7037747, + 0xc515f87a970e9b7b, + 0x3023eaa9601ac578, + 0xb7e3aa3a73fbada6, + 0x0fb699311eaae597, + 0x0000000000000000, + 0x310ef19d6204b4f4, + 0x229371a644db6455, + 0x0decaf591a960792, + 0x5ca4978bb8a62496, + 0x1c2b190a38753536, + 0x41a295b582cd602c, + 0x3279dcc16426277d, + 0xc1a194aa9f764271, + 0x139d803b26dfd0a1, + 0xae51c4d441e83016, + 0xd813fa44ad65dfc1, + 0xac0bf2bc45d4d213, + 0x23be6a9246c515d9, + 0x49d74d08923dcf38, + 0x9d05032127d066e7, + 0x2f7fdeff5e4d63c7, + 0xa47e2a0155247d07, + 0x99b16ff12fa8bfed, + 0x4661d4398c972aaf, + 0xdfd0bbc8a33f9542, + 0xdca79694a51d06cb, + 0xb020ebb67da1e725, + 0xba0f0563696daa34, + 0xe4f1a480d5f76ca7, + 0xc438e34e9510eaf7, + 0x939e81243b64f2fc, + 0x8defae46072d25cf, + 0x2c08f3a3586ff04e, + 0xd7a56375b3cf3a56, + 0x20c947ce40e78650, + 0x43f8a3dd86f18229, + 0x568b795eac6a6987, + 0x8003011f1dbb225d, + 0xf53612d3f7145e03, + 0x189f75da300dec3c, + 0x9570db9c3720c9f3, + 0xbb221e576b73dbb8, + 0x72f65240e4f536dd, + 0x443be25188abc8aa, + 0xe21ffe38d9b357a8, + 0xfd43ca6ee7e4f117, + 0xcaa3614b89a47eec, + 0xfe34e732e1c6629e, + 0x83742c431b99b1d4, + 0xcf3a16af83c2d66a, + 0xaae5a8044990e91c, + 0x26271d764ca3bd5f, + 0x91c4b74c3f5810f9, + 0x7c6dd045f841a2c6, + 0x7f1afd19fe63314f, + 0xc8f957238d989ce9, + 0xa709075d5306ee8e, + 0x55fc5402aa48fa0e, + 0x48fa563c9023beb4, + 0x65dfbeabca523f76, + 0x6c877d22d8bce1ee, + 0xcc4d3bf385e045e3, + 0xbebb69b36115733e, + 0x10eaad6720fd4328, + 0xb6ceb10e71e5dc2a, + 0xbdcc44ef6737e0b7, + 0x523f158ea412b08d, + 0x989c74c52db6ce61, + 0x9beb59992b945de8, + 0x8a2cefca09776f4c, + 0xa3bd6b8d5b7e3784, + 0xeb473db1cb5d8930, + 0xc3fba2c29b4aa074, + 0x9c28181525ce176b, + 0x683311f2d0c438e4, + 0x5fd3bad7be84b71f, + 0xfc6ed15ae5fa809b, + 0x36cdb0116c5efe77, + 0x29918447520958c8, + 0xa29070b959604608, + 0x53120ebaa60cc101, + 0x3a0c047c74d68869, + 0x691e0ac6d2da4968, + 0x73db4974e6eb4751, + 0x7a838afdf40599c9, + 0x5a4acd33b4e21f99, + 0x6046c94fc03497f0, + 0xe6ab92e8d1cb8ea2, + 0x3354c7f5663856f1, + 0xd93ee170af7bae4d, + 0x616bd27bc22ae67c, + 0x92b39a10397a8370, + 0xabc8b3304b8e9890, + 0xbf967287630b02b2, + 0x5b67d607b6fc6e15, + }, + { + 0x8ab0a96846e06a6d, + 0x43c7e80b4bf0b33a, + 0x08c9b3546b161ee5, + 0x39f1c235eba990be, + 0xc1bef2376606c7b2, + 0x2c209233614569aa, + 0xeb01523b6fc3289a, + 0x946953ab935acedd, + 0x272838f63e13340e, + 0x8b0455eca12ba052, + 0x77a1b2c4978ff8a2, + 0xa55122ca13e54086, + 0x2276135862d3f1cd, + 0xdb8ddfde08b76cfe, + 0x5d1e12c89e4a178a, + 0x0e56816b03969867, + 0xee5f79953303ed59, + 0xafed748bab78d71d, + 0x6d929f2df93e53ee, + 0xf5d8a8f8ba798c2a, + 0xf619b1698e39cf6b, + 0x95ddaf2f749104e2, + 0xec2a9c80e0886427, + 0xce5c8fd8825b95ea, + 0xc4e0d9993ac60271, + 0x4699c3a5173076f9, + 0x3d1b151f50a29f42, + 0x9ed505ea2bc75946, + 0x34665acfdc7f4b98, + 0x61b1fb53292342f7, + 0xc721c0080e864130, + 0x8693cd1696fd7b74, + 0x872731927136b14b, + 0xd3446c8a63a1721b, + 0x669a35e8a6680e4a, + 0xcab658f239509a16, + 0xa4e5de4ef42e8ab9, + 0x37a7435ee83f08d9, + 0x134e6239e26c7f96, + 0x82791a3c2df67488, + 0x3f6ef00a8329163c, + 0x8e5a7e42fdeb6591, + 0x5caaee4c7981ddb5, + 0x19f234785af1e80d, + 0x255ddde3ed98bd70, + 0x50898a32a99cccac, + 0x28ca4519da4e6656, + 0xae59880f4cb31d22, + 0x0d9798fa37d6db26, + 0x32f968f0b4ffcd1a, + 0xa00f09644f258545, + 0xfa3ad5175e24de72, + 0xf46c547c5db24615, + 0x713e80fbff0f7e20, + 0x7843cf2b73d2aafa, + 0xbd17ea36aedf62b4, + 0xfd111bacd16f92cf, + 0x4abaa7dbc72d67e0, + 0xb3416b5dad49fad3, + 0xbca316b24914a88b, + 0x15d150068aecf914, + 0xe27c1debe31efc40, + 0x4fe48c759beda223, + 0x7edcfd141b522c78, + 0x4e5070f17c26681c, + 0xe696cac15815f3bc, + 0x35d2a64b3bb481a7, + 0x800cff29fe7dfdf6, + 0x1ed9fac3d5baa4b0, + 0x6c2663a91ef599d1, + 0x03c1199134404341, + 0xf7ad4ded69f20554, + 0xcd9d9649b61bd6ab, + 0xc8c3bde7eadb1368, + 0xd131899fb02afb65, + 0x1d18e352e1fae7f1, + 0xda39235aef7ca6c1, + 0xa1bbf5e0a8ee4f7a, + 0x91377805cf9a0b1e, + 0x3138716180bf8e5b, + 0xd9f83acbdb3ce580, + 0x0275e515d38b897e, + 0x472d3f21f0fbbcc6, + 0x2d946eb7868ea395, + 0xba3c248d21942e09, + 0xe7223645bfde3983, + 0xff64feb902e41bb1, + 0xc97741630d10d957, + 0xc3cb1722b58d4ecc, + 0xa27aec719cae0c3b, + 0x99fecb51a48c15fb, + 0x1465ac826d27332b, + 0xe1bd047ad75ebf01, + 0x79f733af941960c5, + 0x672ec96c41a3c475, + 0xc27feba6524684f3, + 0x64efd0fd75e38734, + 0xed9e60040743ae18, + 0xfb8e2993b9ef144d, + 0x38453eb10c625a81, + 0x6978480742355c12, + 0x48cf42ce14a6ee9e, + 0x1cac1fd606312dce, + 0x7b82d6ba4792e9bb, + 0x9d141c7b1f871a07, + 0x5616b80dc11c4a2e, + 0xb849c198f21fa777, + 0x7ca91801c8d9a506, + 0xb1348e487ec273ad, + 0x41b20d1e987b3a44, + 0x7460ab55a3cfbbe3, + 0x84e628034576f20a, + 0x1b87d16d897a6173, + 0x0fe27defe45d5258, + 0x83cde6b8ca3dbeb7, + 0x0c23647ed01d1119, + 0x7a362a3ea0592384, + 0xb61f40f3f1893f10, + 0x75d457d1440471dc, + 0x4558da34237035b8, + 0xdca6116587fc2043, + 0x8d9b67d3c9ab26d0, + 0x2b0b5c88ee0e2517, + 0x6fe77a382ab5da90, + 0x269cc472d9d8fe31, + 0x63c41e46faa8cb89, + 0xb7abbc771642f52f, + 0x7d1de4852f126f39, + 0xa8c6ba3024339ba0, + 0x600507d7cee888c8, + 0x8fee82c61a20afae, + 0x57a2448926d78011, + 0xfca5e72836a458f0, + 0x072bcebb8f4b4cbd, + 0x497bbe4af36d24a1, + 0x3cafe99bb769557d, + 0x12fa9ebd05a7b5a9, + 0xe8c04baa5b836bdb, + 0x4273148fac3b7905, + 0x908384812851c121, + 0xe557d3506c55b0fd, + 0x72ff996acb4f3d61, + 0x3eda0c8e64e2dc03, + 0xf0868356e6b949e9, + 0x04ead72abb0b0ffc, + 0x17a4b5135967706a, + 0xe3c8e16f04d5367f, + 0xf84f30028daf570c, + 0x1846c8fcbd3a2232, + 0x5b8120f7f6ca9108, + 0xd46fa231ecea3ea6, + 0x334d947453340725, + 0x58403966c28ad249, + 0xbed6f3a79a9f21f5, + 0x68ccb483a5fe962d, + 0xd085751b57e1315a, + 0xfed0023de52fd18e, + 0x4b0e5b5f20e6addf, + 0x1a332de96eb1ab4c, + 0xa3ce10f57b65c604, + 0x108f7ba8d62c3cd7, + 0xab07a3a11073d8e1, + 0x6b0dad1291bed56c, + 0xf2f366433532c097, + 0x2e557726b2cee0d4, + 0x0000000000000000, + 0xcb02a476de9b5029, + 0xe4e32fd48b9e7ac2, + 0x734b65ee2c84f75e, + 0x6e5386bccd7e10af, + 0x01b4fc84e7cbca3f, + 0xcfe8735c65905fd5, + 0x3613bfda0ff4c2e6, + 0x113b872c31e7f6e8, + 0x2fe18ba255052aeb, + 0xe974b72ebc48a1e4, + 0x0abc5641b89d979b, + 0xb46aa5e62202b66e, + 0x44ec26b0c4bbff87, + 0xa6903b5b27a503c7, + 0x7f680190fc99e647, + 0x97a84a3aa71a8d9c, + 0xdd12ede16037ea7c, + 0xc554251ddd0dc84e, + 0x88c54c7d956be313, + 0x4d91696048662b5d, + 0xb08072cc9909b992, + 0xb5de5962c5c97c51, + 0x81b803ad19b637c9, + 0xb2f597d94a8230ec, + 0x0b08aac55f565da4, + 0xf1327fd2017283d6, + 0xad98919e78f35e63, + 0x6ab9519676751f53, + 0x24e921670a53774f, + 0xb9fd3d1c15d46d48, + 0x92f66194fbda485f, + 0x5a35dc7311015b37, + 0xded3f4705477a93d, + 0xc00a0eb381cd0d8d, + 0xbb88d809c65fe436, + 0x16104997beacba55, + 0x21b70ac95693b28c, + 0x59f4c5e225411876, + 0xd5db5eb50b21f499, + 0x55d7a19cf55c096f, + 0xa97246b4c3f8519f, + 0x8552d487a2bd3835, + 0x54635d181297c350, + 0x23c2efdc85183bf2, + 0x9f61f96ecc0c9379, + 0x534893a39ddc8fed, + 0x5edf0b59aa0a54cb, + 0xac2c6d1a9f38945c, + 0xd7aebba0d8aa7de7, + 0x2abfa00c09c5ef28, + 0xd84cc64f3cf72fbf, + 0x2003f64db15878b3, + 0xa724c7dfc06ec9f8, + 0x069f323f68808682, + 0xcc296acd51d01c94, + 0x055e2bae5cc0c5c3, + 0x6270e2c21d6301b6, + 0x3b842720382219c0, + 0xd2f0900e846ab824, + 0x52fc6f277a1745d2, + 0xc6953c8ce94d8b0f, + 0xe009f8fe3095753e, + 0x655b2c7992284d0b, + 0x984a37d54347dfc4, + 0xeab5aebf8808e2a5, + 0x9a3fd2c090cc56ba, + 0x9ca0e0fff84cd038, + 0x4c2595e4afade162, + 0xdf6708f4b3bc6302, + 0xbf620f237d54ebca, + 0x93429d101c118260, + 0x097d4fd08cddd4da, + 0x8c2f9b572e60ecef, + 0x708a7c7f18c4b41f, + 0x3a30dba4dfe9d3ff, + 0x4006f19a7fb0f07b, + 0x5f6bf7dd4dc19ef4, + 0x1f6d064732716e8f, + 0xf9fbcc866a649d33, + 0x308c8de567744464, + 0x8971b0f972a0292c, + 0xd61a47243f61b7d8, + 0xefeb8511d4c82766, + 0x961cb6be40d147a3, + 0xaab35f25f7b812de, + 0x76154e407044329d, + 0x513d76b64e570693, + 0xf3479ac7d2f90aa8, + 0x9b8b2e4477079c85, + 0x297eb99d3d85ac69, + }, + { + 0x3ef29d249b2c0a19, + 0xe9e16322b6f8622f, + 0x5536994047757f7a, + 0x9f4d56d5a47b0b33, + 0x822567466aa1174c, + 0xb8f5057deb082fb2, + 0xcc48c10bf4475f53, + 0x373088d4275dec3a, + 0x968f4325180aed10, + 0x173d232cf7016151, + 0xae4ed09f946fcc13, + 0xfd4b4741c4539873, + 0x1b5b3f0dd9933765, + 0x2ffcb0967b644052, + 0xe02376d20a89840c, + 0xa3ae3a70329b18d7, + 0x419cbd2335de8526, + 0xfafebf115b7c3199, + 0x0397074f85aa9b0d, + 0xc58ad4fb4836b970, + 0xbec60be3fc4104a8, + 0x1eff36dc4b708772, + 0x131fdc33ed8453b6, + 0x0844e33e341764d3, + 0x0ff11b6eab38cd39, + 0x64351f0a7761b85a, + 0x3b5694f509cfba0e, + 0x30857084b87245d0, + 0x47afb3bd2297ae3c, + 0xf2ba5c2f6f6b554a, + 0x74bdc4761f4f70e1, + 0xcfdfc64471edc45e, + 0xe610784c1dc0af16, + 0x7aca29d63c113f28, + 0x2ded411776a859af, + 0xac5f211e99a3d5ee, + 0xd484f949a87ef33b, + 0x3ce36ca596e013e4, + 0xd120f0983a9d432c, + 0x6bc40464dc597563, + 0x69d5f5e5d1956c9e, + 0x9ae95f043698bb24, + 0xc9ecc8da66a4ef44, + 0xd69508c8a5b2eac6, + 0xc40c2235c0503b80, + 0x38c193ba8c652103, + 0x1ceec75d46bc9e8f, + 0xd331011937515ad1, + 0xd8e2e56886eca50f, + 0xb137108d5779c991, + 0x709f3b6905ca4206, + 0x4feb50831680caef, + 0xec456af3241bd238, + 0x58d673afe181abbe, + 0x242f54e7cad9bf8c, + 0x0211f1810dcc19fd, + 0x90bc4dbb0f43c60a, + 0x9518446a9da0761d, + 0xa1bfcbf13f57012a, + 0x2bde4f8961e172b5, + 0x27b853a84f732481, + 0xb0b1e643df1f4b61, + 0x18cc38425c39ac68, + 0xd2b7f7d7bf37d821, + 0x3103864a3014c720, + 0x14aa246372abfa5c, + 0x6e600db54ebac574, + 0x394765740403a3f3, + 0x09c215f0bc71e623, + 0x2a58b947e987f045, + 0x7b4cdf18b477bdd8, + 0x9709b5eb906c6fe0, + 0x73083c268060d90b, + 0xfedc400e41f9037e, + 0x284948c6e44be9b8, + 0x728ecae808065bfb, + 0x06330e9e17492b1a, + 0x5950856169e7294e, + 0xbae4f4fce6c4364f, + 0xca7bcf95e30e7449, + 0x7d7fd186a33e96c2, + 0x52836110d85ad690, + 0x4dfaa1021b4cd312, + 0x913abb75872544fa, + 0xdd46ecb9140f1518, + 0x3d659a6b1e869114, + 0xc23f2cabd719109a, + 0xd713fe062dd46836, + 0xd0a60656b2fbc1dc, + 0x221c5a79dd909496, + 0xefd26dbca1b14935, + 0x0e77eda0235e4fc9, + 0xcbfd395b6b68f6b9, + 0x0de0eaefa6f4d4c4, + 0x0422ff1f1a8532e7, + 0xf969b85eded6aa94, + 0x7f6e2007aef28f3f, + 0x3ad0623b81a938fe, + 0x6624ee8b7aada1a7, + 0xb682e8ddc856607b, + 0xa78cc56f281e2a30, + 0xc79b257a45faa08d, + 0x5b4174e0642b30b3, + 0x5f638bff7eae0254, + 0x4bc9af9c0c05f808, + 0xce59308af98b46ae, + 0x8fc58da9cc55c388, + 0x803496c7676d0eb1, + 0xf33caae1e70dd7ba, + 0xbb6202326ea2b4bf, + 0xd5020f87201871cb, + 0x9d5ca754a9b712ce, + 0x841669d87de83c56, + 0x8a6184785eb6739f, + 0x420bba6cb0741e2b, + 0xf12d5b60eac1ce47, + 0x76ac35f71283691c, + 0x2c6bb7d9fecedb5f, + 0xfccdb18f4c351a83, + 0x1f79c012c3160582, + 0xf0abadae62a74cb7, + 0xe1a5801c82ef06fc, + 0x67a21845f2cb2357, + 0x5114665f5df04d9d, + 0xbf40fd2d74278658, + 0xa0393d3fb73183da, + 0x05a409d192e3b017, + 0xa9fb28cf0b4065f9, + 0x25a9a22942bf3d7c, + 0xdb75e22703463e02, + 0xb326e10c5ab5d06c, + 0xe7968e8295a62de6, + 0xb973f3b3636ead42, + 0xdf571d3819c30ce5, + 0xee549b7229d7cbc5, + 0x12992afd65e2d146, + 0xf8ef4e9056b02864, + 0xb7041e134030e28b, + 0xc02edd2adad50967, + 0x932b4af48ae95d07, + 0x6fe6fb7bc6dc4784, + 0x239aacb755f61666, + 0x401a4bedbdb807d6, + 0x485ea8d389af6305, + 0xa41bc220adb4b13d, + 0x753b32b89729f211, + 0x997e584bb3322029, + 0x1d683193ceda1c7f, + 0xff5ab6c0c99f818e, + 0x16bbd5e27f67e3a1, + 0xa59d34ee25d233cd, + 0x98f8ae853b54a2d9, + 0x6df70afacb105e79, + 0x795d2e99b9bba425, + 0x8e437b6744334178, + 0x0186f6ce886682f0, + 0xebf092a3bb347bd2, + 0xbcd7fa62f18d1d55, + 0xadd9d7d011c5571e, + 0x0bd3e471b1bdffde, + 0xaa6c2f808eeafef4, + 0x5ee57d31f6c880a4, + 0xf50fa47ff044fca0, + 0x1addc9c351f5b595, + 0xea76646d3352f922, + 0x0000000000000000, + 0x85909f16f58ebea6, + 0x46294573aaf12ccc, + 0x0a5512bf39db7d2e, + 0x78dbd85731dd26d5, + 0x29cfbe086c2d6b48, + 0x218b5d36583a0f9b, + 0x152cd2adfacd78ac, + 0x83a39188e2c795bc, + 0xc3b9da655f7f926a, + 0x9ecba01b2c1d89c3, + 0x07b5f8509f2fa9ea, + 0x7ee8d6c926940dcf, + 0x36b67e1aaf3b6eca, + 0x86079859702425ab, + 0xfb7849dfd31ab369, + 0x4c7c57cc932a51e2, + 0xd96413a60e8a27ff, + 0x263ea566c715a671, + 0x6c71fc344376dc89, + 0x4a4f595284637af8, + 0xdaf314e98b20bcf2, + 0x572768c14ab96687, + 0x1088db7c682ec8bb, + 0x887075f9537a6a62, + 0x2e7a4658f302c2a2, + 0x619116dbe582084d, + 0xa87dde018326e709, + 0xdcc01a779c6997e8, + 0xedc39c3dac7d50c8, + 0xa60a33a1a078a8c0, + 0xc1a82be452b38b97, + 0x3f746bea134a88e9, + 0xa228ccbebafd9a27, + 0xabead94e068c7c04, + 0xf48952b178227e50, + 0x5cf48cb0fb049959, + 0x6017e0156de48abd, + 0x4438b4f2a73d3531, + 0x8c528ae649ff5885, + 0xb515ef924dfcfb76, + 0x0c661c212e925634, + 0xb493195cc59a7986, + 0x9cda519a21d1903e, + 0x32948105b5be5c2d, + 0x194ace8cd45f2e98, + 0x438d4ca238129cdb, + 0x9b6fa9cabefe39d4, + 0x81b26009ef0b8c41, + 0xded1ebf691a58e15, + 0x4e6da64d9ee6481f, + 0x54b06f8ecf13fd8a, + 0x49d85e1d01c9e1f5, + 0xafc826511c094ee3, + 0xf698a33075ee67ad, + 0x5ac7822eec4db243, + 0x8dd47c28c199da75, + 0x89f68337db1ce892, + 0xcdce37c57c21dda3, + 0x530597de503c5460, + 0x6a42f2aa543ff793, + 0x5d727a7e73621ba9, + 0xe232875307459df1, + 0x56a19e0fc2dfe477, + 0xc61dd3b4cd9c227d, + 0xe5877f03986a341b, + 0x949eb2a415c6f4ed, + 0x6206119460289340, + 0x6380e75ae84e11b0, + 0x8be772b6d6d0f16f, + 0x50929091d596cf6d, + 0xe86795ec3e9ee0df, + 0x7cf927482b581432, + 0xc86a3e14eec26db4, + 0x7119cda78dacc0f6, + 0xe40189cd100cb6eb, + 0x92adbc3a028fdff7, + 0xb2a017c2d2d3529c, + 0x200dabf8d05c8d6b, + 0x34a78f9ba2f77737, + 0xe3b4719d8f231f01, + 0x45be423c2f5bb7c1, + 0xf71e55fefd88e55d, + 0x6853032b59f3ee6e, + 0x65b3e9c4ff073aaa, + 0x772ac3399ae5ebec, + 0x87816e97f842a75b, + 0x110e2db2e0484a4b, + 0x331277cb3dd8dedd, + 0xbd510cac79eb9fa5, + 0x352179552a91f5c7, + }, + { + 0x05ba7bc82c9b3220, + 0x31a54665f8b65e4f, + 0xb1b651f77547f4d4, + 0x8bfa0d857ba46682, + 0x85a96c5aa16a98bb, + 0x990faef908eb79c9, + 0xa15e37a247f4a62d, + 0x76857dcd5d27741e, + 0xf8c50b800a1820bc, + 0xbe65dcb201f7a2b4, + 0x666d1b986f9426e7, + 0x4cc921bf53c4e648, + 0x95410a0f93d9ca42, + 0x20cdccaa647ba4ef, + 0x429a4060890a1871, + 0x0c4ea4f69b32b38b, + 0xccda362dde354cd3, + 0x96dc23bc7c5b2fa9, + 0xc309bb68aa851ab3, + 0xd26131a73648e013, + 0x021dc52941fc4db2, + 0xcd5adab7704be48a, + 0xa77965d984ed71e6, + 0x32386fd61734bba4, + 0xe82d6dd538ab7245, + 0x5c2147ea6177b4b1, + 0x5da1ab70cf091ce8, + 0xac907fce72b8bdff, + 0x57c85dfd972278a8, + 0xa4e44c6a6b6f940d, + 0x3851995b4f1fdfe4, + 0x62578ccaed71bc9e, + 0xd9882bb0c01d2c0a, + 0x917b9d5d113c503b, + 0xa2c31e11a87643c6, + 0xe463c923a399c1ce, + 0xf71686c57ea876dc, + 0x87b4a973e096d509, + 0xaf0d567d9d3a5814, + 0xb40c2a3f59dcc6f4, + 0x3602f88495d121dd, + 0xd3e1dd3d9836484a, + 0xf945e71aa46688e5, + 0x7518547eb2a591f5, + 0x9366587450c01d89, + 0x9ea81018658c065b, + 0x4f54080cbc4603a3, + 0x2d0384c65137bf3d, + 0xdc325078ec861e2a, + 0xea30a8fc79573ff7, + 0x214d2030ca050cb6, + 0x65f0322b8016c30c, + 0x69be96dd1b247087, + 0xdb95ee9981e161b8, + 0xd1fc1814d9ca05f8, + 0x820ed2bbcc0de729, + 0x63d76050430f14c7, + 0x3bccb0e8a09d3a0f, + 0x8e40764d573f54a2, + 0x39d175c1e16177bd, + 0x12f5a37c734f1f4b, + 0xab37c12f1fdfc26d, + 0x5648b167395cd0f1, + 0x6c04ed1537bf42a7, + 0xed97161d14304065, + 0x7d6c67daab72b807, + 0xec17fa87ba4ee83c, + 0xdfaf79cb0304fbc1, + 0x733f060571bc463e, + 0x78d61c1287e98a27, + 0xd07cf48e77b4ada1, + 0xb9c262536c90dd26, + 0xe2449b5860801605, + 0x8fc09ad7f941fcfb, + 0xfad8cea94be46d0e, + 0xa343f28b0608eb9f, + 0x9b126bd04917347b, + 0x9a92874ae7699c22, + 0x1b017c42c4e69ee0, + 0x3a4c5c720ee39256, + 0x4b6e9f5e3ea399da, + 0x6ba353f45ad83d35, + 0xe7fee0904c1b2425, + 0x22d009832587e95d, + 0x842980c00f1430e2, + 0xc6b3c0a0861e2893, + 0x087433a419d729f2, + 0x341f3dadd42d6c6f, + 0xee0a3faefbb2a58e, + 0x4aee73c490dd3183, + 0xaab72db5b1a16a34, + 0xa92a04065e238fdf, + 0x7b4b35a1686b6fcc, + 0x6a23bf6ef4a6956c, + 0x191cb96b851ad352, + 0x55d598d4d6de351a, + 0xc9604de5f2ae7ef3, + 0x1ca6c2a3a981e172, + 0xde2f9551ad7a5398, + 0x3025aaff56c8f616, + 0x15521d9d1e2860d9, + 0x506fe31cfa45073a, + 0x189c55f12b647b0b, + 0x0180ec9aae7ea859, + 0x7cec8b40050c105e, + 0x2350e5198bf94104, + 0xef8ad33455cc0dd7, + 0x07a7bee16d677f92, + 0xe5e325b90de76997, + 0x5a061591a26e637a, + 0xb611ef1618208b46, + 0x09f4df3eb7a981ab, + 0x1ebb078ae87dacc0, + 0xb791038cb65e231f, + 0x0fd38d4574b05660, + 0x67edf702c1ea8ebe, + 0xba5f4be0831238cd, + 0xe3c477c2cefebe5c, + 0x0dce486c354c1bd2, + 0x8c5db36416c31910, + 0x26ea9ed1a7627324, + 0x039d29b3ef82e5eb, + 0x9f28fc82cbf2ae02, + 0xa8aae89cf05d2786, + 0x431aacfa2774b028, + 0xcf471f9e31b7a938, + 0x581bd0b8e3922ec8, + 0xbc78199b400bef06, + 0x90fb71c7bf42f862, + 0x1f3beb1046030499, + 0x683e7a47b55ad8de, + 0x988f4263a695d190, + 0xd808c72a6e638453, + 0x0627527bc319d7cb, + 0xebb04466d72997ae, + 0xe67e0c0ae2658c7c, + 0x14d2f107b056c880, + 0x7122c32c30400b8c, + 0x8a7ae11fd5dacedb, + 0xa0dedb38e98a0e74, + 0xad109354dcc615a6, + 0x0be91a17f655cc19, + 0x8ddd5ffeb8bdb149, + 0xbfe53028af890aed, + 0xd65ba6f5b4ad7a6a, + 0x7956f0882997227e, + 0x10e8665532b352f9, + 0x0e5361dfdacefe39, + 0xcec7f3049fc90161, + 0xff62b561677f5f2e, + 0x975ccf26d22587f0, + 0x51ef0f86543baf63, + 0x2f1e41ef10cbf28f, + 0x52722635bbb94a88, + 0xae8dbae73344f04d, + 0x410769d36688fd9a, + 0xb3ab94de34bbb966, + 0x801317928df1aa9b, + 0xa564a0f0c5113c54, + 0xf131d4bebdb1a117, + 0x7f71a2f3ea8ef5b5, + 0x40878549c8f655c3, + 0x7ef14e6944f05dec, + 0xd44663dcf55137d8, + 0xf2acfd0d523344fc, + 0x0000000000000000, + 0x5fbc6e598ef5515a, + 0x16cf342ef1aa8532, + 0xb036bd6ddb395c8d, + 0x13754fe6dd31b712, + 0xbbdfa77a2d6c9094, + 0x89e7c8ac3a582b30, + 0x3c6b0e09cdfa459d, + 0xc4ae0589c7e26521, + 0x49735a777f5fd468, + 0xcafd64561d2c9b18, + 0xda1502032f9fc9e1, + 0x8867243694268369, + 0x3782141e3baf8984, + 0x9cb5d53124704be9, + 0xd7db4a6f1ad3d233, + 0xa6f989432a93d9bf, + 0x9d3539ab8a0ee3b0, + 0x53f2caaf15c7e2d1, + 0x6e19283c76430f15, + 0x3debe2936384edc4, + 0x5e3c82c3208bf903, + 0x33b8834cb94a13fd, + 0x6470deb12e686b55, + 0x359fd1377a53c436, + 0x61caa57902f35975, + 0x043a975282e59a79, + 0xfd7f70482683129c, + 0xc52ee913699ccd78, + 0x28b9ff0e7dac8d1d, + 0x5455744e78a09d43, + 0xcb7d88ccb3523341, + 0x44bd121b4a13cfba, + 0x4d49cd25fdba4e11, + 0x3e76cb208c06082f, + 0x3ff627ba2278a076, + 0xc28957f204fbb2ea, + 0x453dfe81e46d67e3, + 0x94c1e6953da7621b, + 0x2c83685cff491764, + 0xf32c1197fc4deca5, + 0x2b24d6bd922e68f6, + 0xb22b78449ac5113f, + 0x48f3b6edd1217c31, + 0x2e9ead75beb55ad6, + 0x174fd8b45fd42d6b, + 0x4ed4e4961238abfa, + 0x92e6b4eefebeb5d0, + 0x46a0d7320bef8208, + 0x47203ba8a5912a51, + 0x24f75bf8e69e3e96, + 0xf0b1382413cf094e, + 0xfee259fbc901f777, + 0x276a724b091cdb7d, + 0xbdf8f501ee75475f, + 0x599b3c224dec8691, + 0x6d84018f99c1eafe, + 0x7498b8e41cdb39ac, + 0xe0595e71217c5bb7, + 0x2aa43a273c50c0af, + 0xf50b43ec3f543b6e, + 0x838e3e2162734f70, + 0xc09492db4507ff58, + 0x72bfea9fdfc2ee67, + 0x11688acf9ccdfaa0, + 0x1a8190d86a9836b9, + 0x7acbd93bc615c795, + 0xc7332c3a286080ca, + 0x863445e94ee87d50, + 0xf6966a5fd0d6de85, + 0xe9ad814f96d5da1c, + 0x70a22fb69e3ea3d5, + 0x0a69f68d582b6440, + 0xb8428ec9c2ee757f, + 0x604a49e3ac8df12c, + 0x5b86f90b0c10cb23, + 0xe1d9b2eb8f02f3ee, + 0x29391394d3d22544, + 0xc8e0a17f5cd0d6aa, + 0xb58cc6a5f7a26ead, + 0x8193fb08238f02c2, + 0xd5c68f465b2f9f81, + 0xfcff9cd288fdbac5, + 0x77059157f359dc47, + 0x1d262e3907ff492b, + 0xfb582233e59ac557, + 0xddb2bce242f8b673, + 0x2577b76248e096cf, + 0x6f99c4a6d83da74c, + 0xc1147e41eb795701, + 0xf48baf76912a9337, + }, + { + 0x45b268a93acde4cc, + 0xaf7f0be884549d08, + 0x048354b3c1468263, + 0x925435c2c80efed2, + 0xee4e37f27fdffba7, + 0x167a33920c60f14d, + 0xfb123b52ea03e584, + 0x4a0cab53fdbb9007, + 0x9deaf6380f788a19, + 0xcb48ec558f0cb32a, + 0xb59dc4b2d6fef7e0, + 0xdcdbca22f4f3ecb6, + 0x11df5813549a9c40, + 0xe33fdedf568aced3, + 0xa0c1c8124322e9c3, + 0x07a56b8158fa6d0d, + 0x77279579b1e1f3dd, + 0xd9b18b74422ac004, + 0xb8ec2d9fffabc294, + 0xf4acf8a82d75914f, + 0x7bbf69b1ef2b6878, + 0xc4f62faf487ac7e1, + 0x76ce809cc67e5d0c, + 0x6711d88f92e4c14c, + 0x627b99d9243dedfe, + 0x234aa5c3dfb68b51, + 0x909b1f15262dbf6d, + 0x4f66ea054b62bcb5, + 0x1ae2cf5a52aa6ae8, + 0xbea053fbd0ce0148, + 0xed6808c0e66314c9, + 0x43fe16cd15a82710, + 0xcd049231a06970f6, + 0xe7bc8a6c97cc4cb0, + 0x337ce835fcb3b9c0, + 0x65def2587cc780f3, + 0x52214ede4132bb50, + 0x95f15e4390f493df, + 0x870839625dd2e0f1, + 0x41313c1afb8b66af, + 0x91720af051b211bc, + 0x477d427ed4eea573, + 0x2e3b4ceef6e3be25, + 0x82627834eb0bcc43, + 0x9c03e3dd78e724c8, + 0x2877328ad9867df9, + 0x14b51945e243b0f2, + 0x574b0f88f7eb97e2, + 0x88b6fa989aa4943a, + 0x19c4f068cb168586, + 0x50ee6409af11faef, + 0x7df317d5c04eaba4, + 0x7a567c5498b4c6a9, + 0xb6bbfb804f42188e, + 0x3cc22bcf3bc5cd0b, + 0xd04336eaaa397713, + 0xf02fac1bec33132c, + 0x2506dba7f0d3488d, + 0xd7e65d6bf2c31a1e, + 0x5eb9b2161ff820f5, + 0x842e0650c46e0f9f, + 0x716beb1d9e843001, + 0xa933758cab315ed4, + 0x3fe414fda2792265, + 0x27c9f1701ef00932, + 0x73a4c1ca70a771be, + 0x94184ba6e76b3d0e, + 0x40d829ff8c14c87e, + 0x0fbec3fac77674cb, + 0x3616a9634a6a9572, + 0x8f139119c25ef937, + 0xf545ed4d5aea3f9e, + 0xe802499650ba387b, + 0x6437e7bd0b582e22, + 0xe6559f89e053e261, + 0x80ad52e305288dfc, + 0x6dc55a23e34b9935, + 0xde14e0f51ad0ad09, + 0xc6390578a659865e, + 0x96d7617109487cb1, + 0xe2d6cb3a21156002, + 0x01e915e5779faed1, + 0xadb0213f6a77dcb7, + 0x9880b76eb9a1a6ab, + 0x5d9f8d248644cf9b, + 0xfd5e4536c5662658, + 0xf1c6b9fe9bacbdfd, + 0xeacd6341be9979c4, + 0xefa7221708405576, + 0x510771ecd88e543e, + 0xc2ba51cb671f043d, + 0x0ad482ac71af5879, + 0xfe787a045cdac936, + 0xb238af338e049aed, + 0xbd866cc94972ee26, + 0x615da6ebbd810290, + 0x3295fdd08b2c1711, + 0xf834046073bf0aea, + 0xf3099329758ffc42, + 0x1caeb13e7dcfa934, + 0xba2307481188832b, + 0x24efce42874ce65c, + 0x0e57d61fb0e9da1a, + 0xb3d1bad6f99b343c, + 0xc0757b1c893c4582, + 0x2b510db8403a9297, + 0x5c7698c1f1db614a, + 0x3e0d0118d5e68cb4, + 0xd60f488e855cb4cf, + 0xae961e0df3cb33d9, + 0x3a8e55ab14a00ed7, + 0x42170328623789c1, + 0x838b6dd19c946292, + 0x895fef7ded3b3aeb, + 0xcfcbb8e64e4a3149, + 0x064c7e642f65c3dc, + 0x3d2b3e2a4c5a63da, + 0x5bd3f340a9210c47, + 0xb474d157a1615931, + 0xac5934da1de87266, + 0x6ee365117af7765b, + 0xc86ed36716b05c44, + 0x9ba6885c201d49c5, + 0xb905387a88346c45, + 0x131072c4bab9ddff, + 0xbf49461ea751af99, + 0xd52977bc1ce05ba1, + 0xb0f785e46027db52, + 0x546d30ba6e57788c, + 0x305ad707650f56ae, + 0xc987c682612ff295, + 0xa5ab8944f5fbc571, + 0x7ed528e759f244ca, + 0x8ddcbbce2c7db888, + 0xaa154abe328db1ba, + 0x1e619be993ece88b, + 0x09f2bd9ee813b717, + 0x7401aa4b285d1cb3, + 0x21858f143195caee, + 0x48c381841398d1b8, + 0xfcb750d3b2f98889, + 0x39a86a998d1ce1b9, + 0x1f888e0ce473465a, + 0x7899568376978716, + 0x02cf2ad7ee2341bf, + 0x85c713b5b3f1a14e, + 0xff916fe12b4567e7, + 0x7c1a0230b7d10575, + 0x0c98fcc85eca9ba5, + 0xa3e7f720da9e06ad, + 0x6a6031a2bbb1f438, + 0x973e74947ed7d260, + 0x2cf4663918c0ff9a, + 0x5f50a7f368678e24, + 0x34d983b4a449d4cd, + 0x68af1b755592b587, + 0x7f3c3d022e6dea1b, + 0xabfc5f5b45121f6b, + 0x0d71e92d29553574, + 0xdffdf5106d4f03d8, + 0x081ba87b9f8c19c6, + 0xdb7ea1a3ac0981bb, + 0xbbca12ad66172dfa, + 0x79704366010829c7, + 0x179326777bff5f9c, + 0x0000000000000000, + 0xeb2476a4c906d715, + 0x724dd42f0738df6f, + 0xb752ee6538ddb65f, + 0x37ffbc863df53ba3, + 0x8efa84fcb5c157e6, + 0xe9eb5c73272596aa, + 0x1b0bdabf2535c439, + 0x86e12c872a4d4e20, + 0x9969a28bce3e087a, + 0xfafb2eb79d9c4b55, + 0x056a4156b6d92cb2, + 0x5a3ae6a5debea296, + 0x22a3b026a8292580, + 0x53c85b3b36ad1581, + 0xb11e900117b87583, + 0xc51f3a4a3fe56930, + 0xe019e1edcf3621bd, + 0xec811d2591fcba18, + 0x445b7d4c4d524a1d, + 0xa8da6069dcaef005, + 0x58f5cc72309de329, + 0xd4c062596b7ff570, + 0xce22ad0339d59f98, + 0x591cd99747024df8, + 0x8b90c5aa03187b54, + 0xf663d27fc356d0f0, + 0xd8589e9135b56ed5, + 0x35309651d3d67a1c, + 0x12f96721cd26732e, + 0xd28c1c3d441a36ac, + 0x492a946164077f69, + 0x2d1d73dc6f5f514b, + 0x6f0a70f40d68d88a, + 0x60b4b30eca1eac41, + 0xd36509d83385987d, + 0x0b3d97490630f6a8, + 0x9eccc90a96c46577, + 0xa20ee2c5ad01a87c, + 0xe49ab55e0e70a3de, + 0xa4429ca182646ba0, + 0xda97b446db962f6a, + 0xcced87d4d7f6de27, + 0x2ab8185d37a53c46, + 0x9f25dcefe15bcba6, + 0xc19c6ef9fea3eb53, + 0xa764a3931bd884ce, + 0x2fd2590b817c10f4, + 0x56a21a6d80743933, + 0xe573a0bb79ef0d0f, + 0x155c0ca095dc1e23, + 0x6c2c4fc694d437e4, + 0x10364df623053291, + 0xdd32dfc7836c4267, + 0x03263f3299bcef6e, + 0x66f8cd6ae57b6f9d, + 0x8c35ae2b5be21659, + 0x31b3c2e21290f87f, + 0x93bd2027bf915003, + 0x69460e90220d1b56, + 0x299e276fae19d328, + 0x63928c3c53a2432f, + 0x7082fef8e91b9ed0, + 0xbc6f792c3eed40f7, + 0x4c40d537d2de53db, + 0x75e8bfae5fc2b262, + 0x4da9c0d2a541fd0a, + 0x4e8fffe03cfd1264, + 0x2620e495696fa7e3, + 0xe1f0f408b8a98f6c, + 0xd1aa230fdda6d9c2, + 0xc7d0109dd1c6288f, + 0x8a79d04f7487d585, + 0x4694579ba3710ba2, + 0x38417f7cfa834f68, + 0x1d47a4db0a5007e5, + 0x206c9af1460a643f, + 0xa128ddf734bd4712, + 0x8144470672b7232d, + 0xf2e086cc02105293, + 0x182de58dbc892b57, + 0xcaa1f9b0f8931dfb, + 0x6b892447cc2e5ae9, + 0xf9dd11850420a43b, + 0x4be5beb68a243ed6, + 0x5584255f19c8d65d, + 0x3b67404e633fa006, + 0xa68db6766c472a1f, + 0xf78ac79ab4c97e21, + 0xc353442e1080aaec, + 0x9a4f9db95782e714, + }, + { + 0xc811a8058c3f55de, + 0x65f5b43196b50619, + 0xf74f96b1d6706e43, + 0x859d1e8bcb43d336, + 0x5aab8a85ccfa3d84, + 0xf9c7bf99c295fcfd, + 0xa21fd5a1de4b630f, + 0xcdb3ef763b8b456d, + 0x803f59f87cf7c385, + 0xb27c73be5f31913c, + 0x98e3ac6633b04821, + 0xbf61674c26b8f818, + 0x0ffbc995c4c130c8, + 0xaaa0862010761a98, + 0x6057f342210116aa, + 0xf63c760c0654cc35, + 0x2ddb45cc667d9042, + 0xbcf45a964bd40382, + 0x68e8a0c3ef3c6f3d, + 0xa7bd92d269ff73bc, + 0x290ae20201ed2287, + 0xb7de34cde885818f, + 0xd901eea7dd61059b, + 0xd6fa273219a03553, + 0xd56f1ae874cccec9, + 0xea31245c2e83f554, + 0x7034555da07be499, + 0xce26d2ac56e7bef7, + 0xfd161857a5054e38, + 0x6a0e7da4527436d1, + 0x5bd86a381cde9ff2, + 0xcaf7756231770c32, + 0xb09aaed9e279c8d0, + 0x5def1091c60674db, + 0x111046a2515e5045, + 0x23536ce4729802fc, + 0xc50cbcf7f5b63cfa, + 0x73a16887cd171f03, + 0x7d2941afd9f28dbd, + 0x3f5e3eb45a4f3b9d, + 0x84eefe361b677140, + 0x3db8e3d3e7076271, + 0x1a3a28f9f20fd248, + 0x7ebc7c75b49e7627, + 0x74e5f293c7eb565c, + 0x18dcf59e4f478ba4, + 0x0c6ef44fa9adcb52, + 0xc699812d98dac760, + 0x788b06dc6e469d0e, + 0xfc65f8ea7521ec4e, + 0x30a5f7219e8e0b55, + 0x2bec3f65bca57b6b, + 0xddd04969baf1b75e, + 0x99904cdbe394ea57, + 0x14b201d1e6ea40f6, + 0xbbb0c08241284add, + 0x50f20463bf8f1dff, + 0xe8d7f93b93cbacb8, + 0x4d8cb68e477c86e8, + 0xc1dd1b3992268e3f, + 0x7c5aa11209d62fcb, + 0x2f3d98abdb35c9ae, + 0x671369562bfd5ff5, + 0x15c1e16c36cee280, + 0x1d7eb2edf8f39b17, + 0xda94d37db00dfe01, + 0x877bc3ec760b8ada, + 0xcb8495dfe153ae44, + 0x05a24773b7b410b3, + 0x12857b783c32abdf, + 0x8eb770d06812513b, + 0x536739b9d2e3e665, + 0x584d57e271b26468, + 0xd789c78fc9849725, + 0xa935bbfa7d1ae102, + 0x8b1537a3dfa64188, + 0xd0cd5d9bc378de7a, + 0x4ac82c9a4d80cfb7, + 0x42777f1b83bdb620, + 0x72d2883a1d33bd75, + 0x5e7a2d4bab6a8f41, + 0xf4daab6bbb1c95d9, + 0x905cffe7fd8d31b6, + 0x83aa6422119b381f, + 0xc0aefb8442022c49, + 0xa0f908c663033ae3, + 0xa428af0804938826, + 0xade41c341a8a53c7, + 0xae7121ee77e6a85d, + 0xc47f5c4a25929e8c, + 0xb538e9aa55cdd863, + 0x06377aa9dad8eb29, + 0xa18ae87bb3279895, + 0x6edfda6a35e48414, + 0x6b7d9d19825094a7, + 0xd41cfa55a4e86cbf, + 0xe5caedc9ea42c59c, + 0xa36c351c0e6fc179, + 0x5181e4de6fabbf89, + 0xfff0c530184d17d4, + 0x9d41eb1584045892, + 0x1c0d525028d73961, + 0xf178ec180ca8856a, + 0x9a0571018ef811cd, + 0x4091a27c3ef5efcc, + 0x19af15239f6329d2, + 0x347450eff91eb990, + 0xe11b4a078dd27759, + 0xb9561de5fc601331, + 0x912f1f5a2da993c0, + 0x1654dcb65ba2191a, + 0x3e2dde098a6b99eb, + 0x8a66d71e0f82e3fe, + 0x8c51adb7d55a08d7, + 0x4533e50f8941ff7f, + 0x02e6dd67bd4859ec, + 0xe068aaba5df6d52f, + 0xc24826e3ff4a75a5, + 0x6c39070d88acddf8, + 0x6486548c4691a46f, + 0xd1bebd26135c7c0c, + 0xb30f93038f15334a, + 0x82d9849fc1bf9a69, + 0x9c320ba85420fae4, + 0xfa528243aff90767, + 0x9ed4d6cfe968a308, + 0xb825fd582c44b147, + 0x9b7691bc5edcb3bb, + 0xc7ea619048fe6516, + 0x1063a61f817af233, + 0x47d538683409a693, + 0x63c2ce984c6ded30, + 0x2a9fdfd86c81d91d, + 0x7b1e3b06032a6694, + 0x666089ebfbd9fd83, + 0x0a598ee67375207b, + 0x07449a140afc495f, + 0x2ca8a571b6593234, + 0x1f986f8a45bbc2fb, + 0x381aa4a050b372c2, + 0x5423a3add81faf3a, + 0x17273c0b8b86bb6c, + 0xfe83258dc869b5a2, + 0x287902bfd1c980f1, + 0xf5a94bd66b3837af, + 0x88800a79b2caba12, + 0x55504310083b0d4c, + 0xdf36940e07b9eeb2, + 0x04d1a7ce6790b2c5, + 0x612413fff125b4dc, + 0x26f12b97c52c124f, + 0x86082351a62f28ac, + 0xef93632f9937e5e7, + 0x3507b052293a1be6, + 0xe72c30ae570a9c70, + 0xd3586041ae1425e0, + 0xde4574b3d79d4cc4, + 0x92ba228040c5685a, + 0xf00b0ca5dc8c271c, + 0xbe1287f1f69c5a6e, + 0xf39e317fb1e0dc86, + 0x495d114020ec342d, + 0x699b407e3f18cd4b, + 0xdca3a9d46ad51528, + 0x0d1d14f279896924, + 0x0000000000000000, + 0x593eb75fa196c61e, + 0x2e4e78160b116bd8, + 0x6d4ae7b058887f8e, + 0xe65fd013872e3e06, + 0x7a6ddbbbd30ec4e2, + 0xac97fc89caaef1b1, + 0x09ccb33c1e19dbe1, + 0x89f3eac462ee1864, + 0x7770cf49aa87adc6, + 0x56c57eca6557f6d6, + 0x03953dda6d6cfb9a, + 0x36928d884456e07c, + 0x1eeb8f37959f608d, + 0x31d6179c4eaaa923, + 0x6fac3ad7e5c02662, + 0x43049fa653991456, + 0xabd3669dc052b8ee, + 0xaf02c153a7c20a2b, + 0x3ccb036e3723c007, + 0x93c9c23d90e1ca2c, + 0xc33bc65e2f6ed7d3, + 0x4cff56339758249e, + 0xb1e94e64325d6aa6, + 0x37e16d359472420a, + 0x79f8e661be623f78, + 0x5214d90402c74413, + 0x482ef1fdf0c8965b, + 0x13f69bc5ec1609a9, + 0x0e88292814e592be, + 0x4e198b542a107d72, + 0xccc00fcbebafe71b, + 0x1b49c844222b703e, + 0x2564164da840e9d5, + 0x20c6513e1ff4f966, + 0xbac3203f910ce8ab, + 0xf2edd1c261c47ef0, + 0x814cb945acd361f3, + 0x95feb8944a392105, + 0x5c9cf02c1622d6ad, + 0x971865f3f77178e9, + 0xbd87ba2b9bf0a1f4, + 0x444005b259655d09, + 0xed75be48247fbc0b, + 0x7596122e17cff42a, + 0xb44b091785e97a15, + 0x966b854e2755da9f, + 0xeee0839249134791, + 0x32432a4623c652b9, + 0xa8465b47ad3e4374, + 0xf8b45f2412b15e8b, + 0x2417f6f078644ba3, + 0xfb2162fe7fdda511, + 0x4bbbcc279da46dc1, + 0x0173e0bdd024a276, + 0x22208c59a2bca08a, + 0x8fc4906db836f34d, + 0xe4b90d743a6667ea, + 0x7147b5e0705f46ef, + 0x2782cb2a1508b039, + 0xec065ef5f45b1e7d, + 0x21b5b183cfd05b10, + 0xdbe733c060295c77, + 0x9fa73672394c017e, + 0xcf55321186c31c81, + 0xd8720e1a0d45a7ed, + 0x3b8f997a3ddf8958, + 0x3afc79c7edfb2b2e, + 0xe9a4198643ef0ece, + 0x5f09cdf67b4e2d37, + 0x4f6a6be9fa34df04, + 0xb6add47038a123f9, + 0x8d224d0a057eaaa1, + 0xc96248b85c1bf7a8, + 0xe3fd9760309a2eb5, + 0x0b2a6e5ba351820d, + 0xeb42c4e1fea75722, + 0x948d58299a1d8373, + 0x7fcf9cc864bad451, + 0xa55b4fb5d4b72a50, + 0x08bf5381ce3d7997, + 0x46a6d8d5e42d04e5, + 0xd22b80fc7e308796, + 0x57b69e77b57354a0, + 0x3969441d8097d0b4, + 0x3330cafbf3e2f0cf, + 0xe28e77dde0be8cc3, + 0x62b12e259c494f46, + 0xa6ce726fb9dbd1ca, + 0x41e242c1eed14dba, + 0x76032ff47aa30fb0, + }, + { + 0xe6f87e5c5b711fd0, + 0x258377800924fa16, + 0xc849e07e852ea4a8, + 0x5b4686a18f06c16a, + 0x0b32e9a2d77b416e, + 0xabda37a467815c66, + 0xf61796a81a686676, + 0xf5dc0b706391954b, + 0x4862f38db7e64bf1, + 0xff5c629a68bd85c5, + 0xcb827da6fcd75795, + 0x66d36daf69b9f089, + 0x356c9f74483d83b0, + 0x7cbcecb1238c99a1, + 0x36a702ac31c4708d, + 0x9eb6a8d02fbcdfd6, + 0x8b19fa51e5b3ae37, + 0x9ccfb5408a127d0b, + 0xbc0c78b508208f5a, + 0xe533e3842288eced, + 0xcec2c7d377c15fd2, + 0xec7817b6505d0f5e, + 0xb94cc2c08336871d, + 0x8c205db4cb0b04ad, + 0x763c855b28a0892f, + 0x588d1b79f6ff3257, + 0x3fecf69e4311933e, + 0x0fc0d39f803a18c9, + 0xee010a26f5f3ad83, + 0x10efe8f4411979a6, + 0x5dcda10c7de93a10, + 0x4a1bee1d1248e92c, + 0x53bff2db21847339, + 0xb4f50ccfa6a23d09, + 0x5fb4bc9cd84798cd, + 0xe88a2d8b071c56f9, + 0x7f7771695a756a9c, + 0xc5f02e71a0ba1ebc, + 0xa663f9ab4215e672, + 0x2eb19e22de5fbb78, + 0x0db9ce0f2594ba14, + 0x82520e6397664d84, + 0x2f031e6a0208ea98, + 0x5c7f2144a1be6bf0, + 0x7a37cb1cd16362db, + 0x83e08e2b4b311c64, + 0xcf70479bab960e32, + 0x856ba986b9dee71e, + 0xb5478c877af56ce9, + 0xb8fe42885f61d6fd, + 0x1bdd0156966238c8, + 0x622157923ef8a92e, + 0xfc97ff42114476f8, + 0x9d7d350856452ceb, + 0x4c90c9b0e0a71256, + 0x2308502dfbcb016c, + 0x2d7a03faa7a64845, + 0xf46e8b38bfc6c4ab, + 0xbdbef8fdd477deba, + 0x3aac4cebc8079b79, + 0xf09cb105e8879d0c, + 0x27fa6a10ac8a58cb, + 0x8960e7c1401d0cea, + 0x1a6f811e4a356928, + 0x90c4fb0773d196ff, + 0x43501a2f609d0a9f, + 0xf7a516e0c63f3796, + 0x1ce4a6b3b8da9252, + 0x1324752c38e08a9b, + 0xa5a864733bec154f, + 0x2bf124575549b33f, + 0xd766db15440dc5c7, + 0xa7d179e39e42b792, + 0xdadf151a61997fd3, + 0x86a0345ec0271423, + 0x38d5517b6da939a4, + 0x6518f077104003b4, + 0x02791d90a5aea2dd, + 0x88d267899c4a5d0a, + 0x930f66df0a2865c2, + 0x4ee9d4204509b08b, + 0x325538916685292a, + 0x412907bfc533a842, + 0xb27e2b62544dc673, + 0x6c5304456295e007, + 0x5af406e95351908a, + 0x1f2f3b6bc123616f, + 0xc37b09dc5255e5c6, + 0x3967d133b1fe6844, + 0x298839c7f0e711e2, + 0x409b87f71964f9a2, + 0xe938adc3db4b0719, + 0x0c0b4e47f9c3ebf4, + 0x5534d576d36b8843, + 0x4610a05aeb8b02d8, + 0x20c3cdf58232f251, + 0x6de1840dbec2b1e7, + 0xa0e8de06b0fa1d08, + 0x7b854b540d34333b, + 0x42e29a67bcca5b7f, + 0xd8a6088ac437dd0e, + 0xc63bb3a9d943ed81, + 0x21714dbd5e65a3b1, + 0x6761ede7b5eea169, + 0x2431f7c8d573abf6, + 0xd51fc685e1a3671a, + 0x5e063cd40410c92d, + 0x283ab98f2cb04002, + 0x8febc06cb2f2f790, + 0x17d64f116fa1d33c, + 0xe07359f1a99ee4aa, + 0x784ed68c74cdc006, + 0x6e2a19d5c73b42da, + 0x8712b4161c7045c3, + 0x371582e4ed93216d, + 0xace390414939f6fc, + 0x7ec5f12186223b7c, + 0xc0b094042bac16fb, + 0xf9d745379a527ebf, + 0x737c3f2ea3b68168, + 0x33e7b8d9bad278ca, + 0xa9a32a34c22ffebb, + 0xe48163ccfedfbd0d, + 0x8e5940246ea5a670, + 0x51c6ef4b842ad1e4, + 0x22bad065279c508c, + 0xd91488c218608cee, + 0x319ea5491f7cda17, + 0xd394e128134c9c60, + 0x094bf43272d5e3b3, + 0x9bf612a5a4aad791, + 0xccbbda43d26ffd0f, + 0x34de1f3c946ad250, + 0x4f5b5468995ee16b, + 0xdf9faf6fea8f7794, + 0x2648ea5870dd092b, + 0xbfc7e56d71d97c67, + 0xdde6b2ff4f21d549, + 0x3c276b463ae86003, + 0x91767b4faf86c71f, + 0x68a13e7835d4b9a0, + 0xb68c115f030c9fd4, + 0x141dd2c916582001, + 0x983d8f7ddd5324ac, + 0x64aa703fcc175254, + 0xc2c989948e02b426, + 0x3e5e76d69f46c2de, + 0x50746f03587d8004, + 0x45db3d829272f1e5, + 0x60584a029b560bf3, + 0xfbae58a73ffcdc62, + 0xa15a5e4e6cad4ce8, + 0x4ba96e55ce1fb8cc, + 0x08f9747aae82b253, + 0xc102144cf7fb471b, + 0x9f042898f3eb8e36, + 0x068b27adf2effb7a, + 0xedca97fe8c0a5ebe, + 0x778e0513f4f7d8cf, + 0x302c2501c32b8bf7, + 0x8d92ddfc175c554d, + 0xf865c57f46052f5f, + 0xeaf3301ba2b2f424, + 0xaa68b7ecbbd60d86, + 0x998f0f350104754c, + 0x0000000000000000, + 0xf12e314d34d0ccec, + 0x710522be061823b5, + 0xaf280d9930c005c1, + 0x97fd5ce25d693c65, + 0x19a41cc633cc9a15, + 0x95844172f8c79eb8, + 0xdc5432b7937684a9, + 0x9436c13a2490cf58, + 0x802b13f332c8ef59, + 0xc442ae397ced4f5c, + 0xfa1cd8efe3ab8d82, + 0xf2e5ac954d293fd1, + 0x6ad823e8907a1b7d, + 0x4d2249f83cf043b6, + 0x03cb9dd879f9f33d, + 0xde2d2f2736d82674, + 0x2a43a41f891ee2df, + 0x6f98999d1b6c133a, + 0xd4ad46cd3df436fa, + 0xbb35df50269825c0, + 0x964fdcaa813e6d85, + 0xeb41b0537ee5a5c4, + 0x0540ba758b160847, + 0xa41ae43be7bb44af, + 0xe3b8c429d0671797, + 0x819993bbee9fbeb9, + 0xae9a8dd1ec975421, + 0xf3572cdd917e6e31, + 0x6393d7dae2aff8ce, + 0x47a2201237dc5338, + 0xa32343dec903ee35, + 0x79fc56c4a89a91e6, + 0x01b28048dc5751e0, + 0x1296f564e4b7db7b, + 0x75f7188351597a12, + 0xdb6d9552bdce2e33, + 0x1e9dbb231d74308f, + 0x520d7293fdd322d9, + 0xe20a44610c304677, + 0xfeeee2d2b4ead425, + 0xca30fdee20800675, + 0x61eaca4a47015a13, + 0xe74afe1487264e30, + 0x2cc883b27bf119a5, + 0x1664cf59b3f682dc, + 0xa811aa7c1e78af5b, + 0x1d5626fb648dc3b2, + 0xb73e9117df5bce34, + 0xd05f7cf06ab56f5d, + 0xfd257f0acd132718, + 0x574dc8e676c52a9e, + 0x0739a7e52eb8aa9a, + 0x5486553e0f3cd9a3, + 0x56ff48aeaa927b7e, + 0xbe756525ad8e2d87, + 0x7d0e6cf9ffdbc841, + 0x3b1ecca31450ca99, + 0x6913be30e983e840, + 0xad511009956ea71c, + 0xb1b5b6ba2db4354e, + 0x4469bdca4e25a005, + 0x15af5281ca0f71e1, + 0x744598cb8d0e2bf2, + 0x593f9b312aa863b7, + 0xefb38a6e29a4fc63, + 0x6b6aa3a04c2d4a9d, + 0x3d95eb0ee6bf31e3, + 0xa291c3961554bfd5, + 0x18169c8eef9bcbf5, + 0x115d68bc9d4e2846, + 0xba875f18facf7420, + 0xd1edfcb8b6e23ebd, + 0xb00736f2f1e364ae, + 0x84d929ce6589b6fe, + 0x70b7a2f6da4f7255, + 0x0e7253d75c6d4929, + 0x04f23a3d574159a7, + 0x0a8069ea0b2c108e, + 0x49d073c56bb11a11, + 0x8aab7a1939e4ffd7, + 0xcd095a0b0e38acef, + 0xc9fb60365979f548, + 0x92bde697d67f3422, + 0xc78933e10514bc61, + 0xe1c1d9b975c9b54a, + 0xd2266160cf1bcd80, + 0x9a4492ed78fd8671, + 0xb3ccab2a881a9793, + 0x72cebf667fe1d088, + 0xd6d45b5d985a9427, + }, +}; + +__constant u64 sbob_rc64[12][8] = +{ + { + 0xe9daca1eda5b08b1, + 0x1f7c65c0812fcbeb, + 0x16d0452e43766a2f, + 0xfcc485758db84e71, + 0x0169679291e07c4b, + 0x15d360a4082a42a2, + 0x234d74cc36747605, + 0x0745a6f2596580dd, + }, + { + 0x1a2f9da98ab5a36f, + 0xd7b5700f469de34f, + 0x982b230a72eafef3, + 0x3101b5160f5ed561, + 0x5899d6126b17b59a, + 0xcaa70adbc261b55c, + 0x56cdcbd71ba2dd55, + 0xb79bb121700479e6, + }, + { + 0xc72fce2bacdc74f5, + 0x35843d6a28fc390a, + 0x8b1f9c525f5ef106, + 0x7b7b29b11475eaf2, + 0xb19e3590e40fe2d3, + 0x09db6260373ac9c1, + 0x31db7a8643f4b6c2, + 0xb20aba0af5961e99, + }, + { + 0xd26615e8b3df1fef, + 0xdde4715da0e148f9, + 0x7d3c5c337e858e48, + 0x3f355e68ad1c729d, + 0x75d603ed822cd7a9, + 0xbe0352933313b7d8, + 0xf137e893a1ea5334, + 0x2ed1e384bcbe0c22, + }, + { + 0x994747adac6bea4b, + 0x6323a96c0c413f9a, + 0x4a1086161f1c157f, + 0xbdff0f80d7359e35, + 0xa3f53a254717cdbf, + 0x161a2723b700ffdf, + 0xf563eaa97ea2567a, + 0x57fe6c7cfd581760, + }, + { + 0xd9d33a1daeae4fae, + 0xc039307a3bc3a46f, + 0x6ca44251f9c4662d, + 0xc68ef09ab49a7f18, + 0xb4b79a1cb7a6facf, + 0xb6c6bec2661ff20a, + 0x354f903672c571bf, + 0x6e7d64467a4068fa, + }, + { + 0xecc5aaee160ec7f4, + 0x540924bffe86ac51, + 0xc987bfe6c7c69e39, + 0xc9937a19333e47d3, + 0x372c822dc5ab9209, + 0x04054a2883694706, + 0xf34a3ca24c451735, + 0x93d4143a4d568688, + }, + { + 0xa7c9934d425b1f9b, + 0x41416e0c02aae703, + 0x1ede369c71f8b74e, + 0x9ac4db4d3b44b489, + 0x90069b92cb2b89f4, + 0x2fc4a5d12b8dd169, + 0xd9a8515935c2ac36, + 0x1ee702bfd40d7fa4, + }, + { + 0x9b223116545a8f37, + 0xde5f16ecd89a4c94, + 0x244289251b3a7d3a, + 0x84090de0b755d93c, + 0xb1ceb2db0b440a80, + 0x549c07a69a8a2b7b, + 0x602a1fcb92dc380e, + 0xdb5a238351446172, + }, + { + 0x526f0580a6debeab, + 0xf3f3e4b248e52a38, + 0xdb788aff1ce74189, + 0x0361331b8ae1ff1f, + 0x4b3369af0267e79f, + 0xf452763b306c1e7a, + 0xc3b63b15d1fa9836, + 0xed9c4598fbc7b474, + }, + { + 0xfb89c8efd09ecd7b, + 0x94fe5a63cdc60230, + 0x6107abebbb6bfad8, + 0x7966841421800120, + 0xcab948eaef711d8a, + 0x986e477d1dcdbaef, + 0x5dd86fc04a59a2de, + 0x1b2df381cda4ca6b, + }, + { + 0xba3116f167e78e37, + 0x7ab14904b08013d2, + 0x771ddfbc323ca4cd, + 0x9b9f2130d41220f8, + 0x86cc91189def805d, + 0x5228e188aaa41de7, + 0x991bb2d9d517f4fa, + 0x20d71bf14a92bc48, + }, +}; + +static void streebog_g (u64 h[8], const u64 m[8], __local u64 s_sbob_sl64[8][256]) +{ + u64 k[8]; + u64 s[8]; + u64 t[8]; + + #pragma unroll + for (int i = 0; i < 8; i++) + { + t[i] = h[i]; + } + + for (int i = 0; i < 8; i++) + { + k[i] = SBOG_LPSti64; + } + + #pragma unroll + for (int i = 0; i < 8; i++) + { + s[i] = m[i]; + } + + for (int r = 0; r < 12; r++) + { + #pragma unroll + for (int i = 0; i < 8; i++) + { + t[i] = s[i] ^ k[i]; + } + + #pragma unroll + for (int i = 0; i < 8; i++) + { + s[i] = SBOG_LPSti64; + } + + for (int i = 0; i < 8; i++) + { + t[i] = k[i] ^ sbob_rc64[r][i]; + } + + #pragma unroll + for (int i = 0; i < 8; i++) + { + k[i] = SBOG_LPSti64; + } + } + + #pragma unroll + for (int i = 0; i < 8; i++) + { + h[i] ^= s[i] ^ k[i] ^ m[i]; + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m11700_m04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * shared lookup table + */ + + const u32 lid4 = lid * 4; + + __local u64 s_sbob_sl64[8][256]; + + s_sbob_sl64[0][lid4 + 0] = sbob_sl64[0][lid4 + 0]; + s_sbob_sl64[0][lid4 + 1] = sbob_sl64[0][lid4 + 1]; + s_sbob_sl64[0][lid4 + 2] = sbob_sl64[0][lid4 + 2]; + s_sbob_sl64[0][lid4 + 3] = sbob_sl64[0][lid4 + 3]; + s_sbob_sl64[1][lid4 + 0] = sbob_sl64[1][lid4 + 0]; + s_sbob_sl64[1][lid4 + 1] = sbob_sl64[1][lid4 + 1]; + s_sbob_sl64[1][lid4 + 2] = sbob_sl64[1][lid4 + 2]; + s_sbob_sl64[1][lid4 + 3] = sbob_sl64[1][lid4 + 3]; + s_sbob_sl64[2][lid4 + 0] = sbob_sl64[2][lid4 + 0]; + s_sbob_sl64[2][lid4 + 1] = sbob_sl64[2][lid4 + 1]; + s_sbob_sl64[2][lid4 + 2] = sbob_sl64[2][lid4 + 2]; + s_sbob_sl64[2][lid4 + 3] = sbob_sl64[2][lid4 + 3]; + s_sbob_sl64[3][lid4 + 0] = sbob_sl64[3][lid4 + 0]; + s_sbob_sl64[3][lid4 + 1] = sbob_sl64[3][lid4 + 1]; + s_sbob_sl64[3][lid4 + 2] = sbob_sl64[3][lid4 + 2]; + s_sbob_sl64[3][lid4 + 3] = sbob_sl64[3][lid4 + 3]; + s_sbob_sl64[4][lid4 + 0] = sbob_sl64[4][lid4 + 0]; + s_sbob_sl64[4][lid4 + 1] = sbob_sl64[4][lid4 + 1]; + s_sbob_sl64[4][lid4 + 2] = sbob_sl64[4][lid4 + 2]; + s_sbob_sl64[4][lid4 + 3] = sbob_sl64[4][lid4 + 3]; + s_sbob_sl64[5][lid4 + 0] = sbob_sl64[5][lid4 + 0]; + s_sbob_sl64[5][lid4 + 1] = sbob_sl64[5][lid4 + 1]; + s_sbob_sl64[5][lid4 + 2] = sbob_sl64[5][lid4 + 2]; + s_sbob_sl64[5][lid4 + 3] = sbob_sl64[5][lid4 + 3]; + s_sbob_sl64[6][lid4 + 0] = sbob_sl64[6][lid4 + 0]; + s_sbob_sl64[6][lid4 + 1] = sbob_sl64[6][lid4 + 1]; + s_sbob_sl64[6][lid4 + 2] = sbob_sl64[6][lid4 + 2]; + s_sbob_sl64[6][lid4 + 3] = sbob_sl64[6][lid4 + 3]; + s_sbob_sl64[7][lid4 + 0] = sbob_sl64[7][lid4 + 0]; + s_sbob_sl64[7][lid4 + 1] = sbob_sl64[7][lid4 + 1]; + s_sbob_sl64[7][lid4 + 2] = sbob_sl64[7][lid4 + 2]; + s_sbob_sl64[7][lid4 + 3] = sbob_sl64[7][lid4 + 3]; + + barrier (CLK_LOCAL_MEM_FENCE); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + append_0x80_2 (wordl0, wordl1, pw_l_len); + + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, combs_buf[0].pw_len); + } + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = combs_buf[il_pos].pw_len; + + const u32 pw_len = pw_l_len + pw_r_len; + + u32 wordr0[4]; + + wordr0[0] = combs_buf[il_pos].i[0]; + wordr0[1] = combs_buf[il_pos].i[1]; + wordr0[2] = combs_buf[il_pos].i[2]; + wordr0[3] = combs_buf[il_pos].i[3]; + + u32 wordr1[4]; + + wordr1[0] = combs_buf[il_pos].i[4]; + wordr1[1] = combs_buf[il_pos].i[5]; + wordr1[2] = combs_buf[il_pos].i[6]; + wordr1[3] = combs_buf[il_pos].i[7]; + + u32 wordr2[4]; + + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + + u32 wordr3[4]; + + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + u32x w[16]; + + w[ 0] = wordl0[0] | wordr0[0]; + w[ 1] = wordl0[1] | wordr0[1]; + w[ 2] = wordl0[2] | wordr0[2]; + w[ 3] = wordl0[3] | wordr0[3]; + w[ 4] = wordl1[0] | wordr1[0]; + w[ 5] = wordl1[1] | wordr1[1]; + w[ 6] = wordl1[2] | wordr1[2]; + w[ 7] = wordl1[3] | wordr1[3]; + w[ 8] = wordl2[0] | wordr2[0]; + w[ 9] = wordl2[1] | wordr2[1]; + w[10] = wordl2[2] | wordr2[2]; + w[11] = wordl2[3] | wordr2[3]; + w[12] = wordl3[0] | wordr3[0]; + w[13] = wordl3[1] | wordr3[1]; + w[14] = wordl3[1] | wordr3[1]; + w[15] = wordl3[1] | wordr3[1]; + + append_0x01_4 (&w[0], &w[1], &w[2], &w[3], pw_len); + + /** + * reverse message block + */ + + u64 m[8]; + + m[0] = hl32_to_64 (w[15], w[14]); + m[1] = hl32_to_64 (w[13], w[12]); + m[2] = hl32_to_64 (w[11], w[10]); + m[3] = hl32_to_64 (w[ 9], w[ 8]); + m[4] = hl32_to_64 (w[ 7], w[ 6]); + m[5] = hl32_to_64 (w[ 5], w[ 4]); + m[6] = hl32_to_64 (w[ 3], w[ 2]); + m[7] = hl32_to_64 (w[ 1], w[ 0]); + + m[0] = swap_workaround (m[0]); + m[1] = swap_workaround (m[1]); + m[2] = swap_workaround (m[2]); + m[3] = swap_workaround (m[3]); + m[4] = swap_workaround (m[4]); + m[5] = swap_workaround (m[5]); + m[6] = swap_workaround (m[6]); + m[7] = swap_workaround (m[7]); + + // state buffer (hash) + + u64 h[8]; + + h[0] = INITVAL; + h[1] = INITVAL; + h[2] = INITVAL; + h[3] = INITVAL; + h[4] = INITVAL; + h[5] = INITVAL; + h[6] = INITVAL; + h[7] = INITVAL; + + streebog_g (h, m, s_sbob_sl64); + + u64 z[8]; + + z[0] = 0; + z[1] = 0; + z[2] = 0; + z[3] = 0; + z[4] = 0; + z[5] = 0; + z[6] = 0; + z[7] = swap_workaround ((u64) (pw_len * 8)); + + streebog_g (h, z, s_sbob_sl64); + streebog_g (h, m, s_sbob_sl64); + + const u32 r0 = l32_from_64 (h[0]); + const u32 r1 = h32_from_64 (h[0]); + const u32 r2 = l32_from_64 (h[1]); + const u32 r3 = h32_from_64 (h[1]); + + #include VECT_COMPARE_M + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m11700_m08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m11700_m16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m11700_s04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + + /** + * shared lookup table + */ + + const u32 lid4 = lid * 4; + + __local u64 s_sbob_sl64[8][256]; + + s_sbob_sl64[0][lid4 + 0] = sbob_sl64[0][lid4 + 0]; + s_sbob_sl64[0][lid4 + 1] = sbob_sl64[0][lid4 + 1]; + s_sbob_sl64[0][lid4 + 2] = sbob_sl64[0][lid4 + 2]; + s_sbob_sl64[0][lid4 + 3] = sbob_sl64[0][lid4 + 3]; + s_sbob_sl64[1][lid4 + 0] = sbob_sl64[1][lid4 + 0]; + s_sbob_sl64[1][lid4 + 1] = sbob_sl64[1][lid4 + 1]; + s_sbob_sl64[1][lid4 + 2] = sbob_sl64[1][lid4 + 2]; + s_sbob_sl64[1][lid4 + 3] = sbob_sl64[1][lid4 + 3]; + s_sbob_sl64[2][lid4 + 0] = sbob_sl64[2][lid4 + 0]; + s_sbob_sl64[2][lid4 + 1] = sbob_sl64[2][lid4 + 1]; + s_sbob_sl64[2][lid4 + 2] = sbob_sl64[2][lid4 + 2]; + s_sbob_sl64[2][lid4 + 3] = sbob_sl64[2][lid4 + 3]; + s_sbob_sl64[3][lid4 + 0] = sbob_sl64[3][lid4 + 0]; + s_sbob_sl64[3][lid4 + 1] = sbob_sl64[3][lid4 + 1]; + s_sbob_sl64[3][lid4 + 2] = sbob_sl64[3][lid4 + 2]; + s_sbob_sl64[3][lid4 + 3] = sbob_sl64[3][lid4 + 3]; + s_sbob_sl64[4][lid4 + 0] = sbob_sl64[4][lid4 + 0]; + s_sbob_sl64[4][lid4 + 1] = sbob_sl64[4][lid4 + 1]; + s_sbob_sl64[4][lid4 + 2] = sbob_sl64[4][lid4 + 2]; + s_sbob_sl64[4][lid4 + 3] = sbob_sl64[4][lid4 + 3]; + s_sbob_sl64[5][lid4 + 0] = sbob_sl64[5][lid4 + 0]; + s_sbob_sl64[5][lid4 + 1] = sbob_sl64[5][lid4 + 1]; + s_sbob_sl64[5][lid4 + 2] = sbob_sl64[5][lid4 + 2]; + s_sbob_sl64[5][lid4 + 3] = sbob_sl64[5][lid4 + 3]; + s_sbob_sl64[6][lid4 + 0] = sbob_sl64[6][lid4 + 0]; + s_sbob_sl64[6][lid4 + 1] = sbob_sl64[6][lid4 + 1]; + s_sbob_sl64[6][lid4 + 2] = sbob_sl64[6][lid4 + 2]; + s_sbob_sl64[6][lid4 + 3] = sbob_sl64[6][lid4 + 3]; + s_sbob_sl64[7][lid4 + 0] = sbob_sl64[7][lid4 + 0]; + s_sbob_sl64[7][lid4 + 1] = sbob_sl64[7][lid4 + 1]; + s_sbob_sl64[7][lid4 + 2] = sbob_sl64[7][lid4 + 2]; + s_sbob_sl64[7][lid4 + 3] = sbob_sl64[7][lid4 + 3]; + + barrier (CLK_LOCAL_MEM_FENCE); + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + append_0x80_2 (wordl0, wordl1, pw_l_len); + + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, combs_buf[0].pw_len); + } + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = combs_buf[il_pos].pw_len; + + const u32 pw_len = pw_l_len + pw_r_len; + + u32 wordr0[4]; + + wordr0[0] = combs_buf[il_pos].i[0]; + wordr0[1] = combs_buf[il_pos].i[1]; + wordr0[2] = combs_buf[il_pos].i[2]; + wordr0[3] = combs_buf[il_pos].i[3]; + + u32 wordr1[4]; + + wordr1[0] = combs_buf[il_pos].i[4]; + wordr1[1] = combs_buf[il_pos].i[5]; + wordr1[2] = combs_buf[il_pos].i[6]; + wordr1[3] = combs_buf[il_pos].i[7]; + + u32 wordr2[4]; + + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + + u32 wordr3[4]; + + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + u32x w[16]; + + w[ 0] = wordl0[0] | wordr0[0]; + w[ 1] = wordl0[1] | wordr0[1]; + w[ 2] = wordl0[2] | wordr0[2]; + w[ 3] = wordl0[3] | wordr0[3]; + w[ 4] = wordl1[0] | wordr1[0]; + w[ 5] = wordl1[1] | wordr1[1]; + w[ 6] = wordl1[2] | wordr1[2]; + w[ 7] = wordl1[3] | wordr1[3]; + w[ 8] = wordl2[0] | wordr2[0]; + w[ 9] = wordl2[1] | wordr2[1]; + w[10] = wordl2[2] | wordr2[2]; + w[11] = wordl2[3] | wordr2[3]; + w[12] = wordl3[0] | wordr3[0]; + w[13] = wordl3[1] | wordr3[1]; + w[14] = wordl3[1] | wordr3[1]; + w[15] = wordl3[1] | wordr3[1]; + + append_0x01_4 (&w[0], &w[1], &w[2], &w[3], pw_len); + + /** + * reverse message block + */ + + u64 m[8]; + + m[0] = hl32_to_64 (w[15], w[14]); + m[1] = hl32_to_64 (w[13], w[12]); + m[2] = hl32_to_64 (w[11], w[10]); + m[3] = hl32_to_64 (w[ 9], w[ 8]); + m[4] = hl32_to_64 (w[ 7], w[ 6]); + m[5] = hl32_to_64 (w[ 5], w[ 4]); + m[6] = hl32_to_64 (w[ 3], w[ 2]); + m[7] = hl32_to_64 (w[ 1], w[ 0]); + + m[0] = swap_workaround (m[0]); + m[1] = swap_workaround (m[1]); + m[2] = swap_workaround (m[2]); + m[3] = swap_workaround (m[3]); + m[4] = swap_workaround (m[4]); + m[5] = swap_workaround (m[5]); + m[6] = swap_workaround (m[6]); + m[7] = swap_workaround (m[7]); + + // state buffer (hash) + + u64 h[8]; + + h[0] = INITVAL; + h[1] = INITVAL; + h[2] = INITVAL; + h[3] = INITVAL; + h[4] = INITVAL; + h[5] = INITVAL; + h[6] = INITVAL; + h[7] = INITVAL; + + streebog_g (h, m, s_sbob_sl64); + + u64 z[8]; + + z[0] = 0; + z[1] = 0; + z[2] = 0; + z[3] = 0; + z[4] = 0; + z[5] = 0; + z[6] = 0; + z[7] = swap_workaround ((u64) (pw_len * 8)); + + streebog_g (h, z, s_sbob_sl64); + streebog_g (h, m, s_sbob_sl64); + + const u32 r0 = l32_from_64 (h[0]); + const u32 r1 = h32_from_64 (h[0]); + const u32 r2 = l32_from_64 (h[1]); + const u32 r3 = h32_from_64 (h[1]); + + #include VECT_COMPARE_S + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m11700_s08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m11700_s16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/amd/m11700_a3.cl b/amd/m11700_a3.cl new file mode 100644 index 0000000000..f65dd45d4c --- /dev/null +++ b/amd/m11700_a3.cl @@ -0,0 +1,2977 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _GOST2012_256_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW4 +#define VECT_SIZE1 +#endif + +#ifdef VLIW5 +#define VECT_SIZE1 +#endif + +#define DGST_R0 0 +#define DGST_R1 1 +#define DGST_R2 2 +#define DGST_R3 3 + +#include "include/kernel_functions.c" +#include "types_amd.c" +#include "common_amd.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +#define INITVAL 0x0101010101010101 + +#define SBOG_LPSti64 \ + s_sbob_sl64[0][(t[0] >> (i * 8)) & 0xff] ^ \ + s_sbob_sl64[1][(t[1] >> (i * 8)) & 0xff] ^ \ + s_sbob_sl64[2][(t[2] >> (i * 8)) & 0xff] ^ \ + s_sbob_sl64[3][(t[3] >> (i * 8)) & 0xff] ^ \ + s_sbob_sl64[4][(t[4] >> (i * 8)) & 0xff] ^ \ + s_sbob_sl64[5][(t[5] >> (i * 8)) & 0xff] ^ \ + s_sbob_sl64[6][(t[6] >> (i * 8)) & 0xff] ^ \ + s_sbob_sl64[7][(t[7] >> (i * 8)) & 0xff] + +// constants + +__constant u64 sbob_sl64[8][256] = +{ + { + 0xd031c397ce553fe6, + 0x16ba5b01b006b525, + 0xa89bade6296e70c8, + 0x6a1f525d77d3435b, + 0x6e103570573dfa0b, + 0x660efb2a17fc95ab, + 0x76327a9e97634bf6, + 0x4bad9d6462458bf5, + 0xf1830caedbc3f748, + 0xc5c8f542669131ff, + 0x95044a1cdc48b0cb, + 0x892962df3cf8b866, + 0xb0b9e208e930c135, + 0xa14fb3f0611a767c, + 0x8d2605f21c160136, + 0xd6b71922fecc549e, + 0x37089438a5907d8b, + 0x0b5da38e5803d49c, + 0x5a5bcc9cea6f3cbc, + 0xedae246d3b73ffe5, + 0xd2b87e0fde22edce, + 0x5e54abb1ca8185ec, + 0x1de7f88fe80561b9, + 0xad5e1a870135a08c, + 0x2f2adbd665cecc76, + 0x5780b5a782f58358, + 0x3edc8a2eede47b3f, + 0xc9d95c3506bee70f, + 0x83be111d6c4e05ee, + 0xa603b90959367410, + 0x103c81b4809fde5d, + 0x2c69b6027d0c774a, + 0x399080d7d5c87953, + 0x09d41e16487406b4, + 0xcdd63b1826505e5f, + 0xf99dc2f49b0298e8, + 0x9cd0540a943cb67f, + 0xbca84b7f891f17c5, + 0x723d1db3b78df2a6, + 0x78aa6e71e73b4f2e, + 0x1433e699a071670d, + 0x84f21be454620782, + 0x98df3327b4d20f2f, + 0xf049dce2d3769e5c, + 0xdb6c60199656eb7a, + 0x648746b2078b4783, + 0x32cd23598dcbadcf, + 0x1ea4955bf0c7da85, + 0xe9a143401b9d46b5, + 0xfd92a5d9bbec21b8, + 0xc8138c790e0b8e1b, + 0x2ee00b9a6d7ba562, + 0xf85712b893b7f1fc, + 0xeb28fed80bea949d, + 0x564a65eb8a40ea4c, + 0x6c9988e8474a2823, + 0x4535898b121d8f2d, + 0xabd8c03231accbf4, + 0xba2e91cab9867cbd, + 0x7960be3def8e263a, + 0x0c11a977602fd6f0, + 0xcb50e1ad16c93527, + 0xeae22e94035ffd89, + 0x2866d12f5de2ce1a, + 0xff1b1841ab9bf390, + 0x9f9339de8cfe0d43, + 0x964727c8c48a0bf7, + 0x524502c6aaae531c, + 0x9b9c5ef3ac10b413, + 0x4fa2fa4942ab32a5, + 0x3f165a62e551122b, + 0xc74148da76e6e3d7, + 0x924840e5e464b2a7, + 0xd372ae43d69784da, + 0x233b72a105e11a86, + 0xa48a04914941a638, + 0xb4b68525c9de7865, + 0xddeabaaca6cf8002, + 0x0a9773c250b6bd88, + 0xc284ffbb5ebd3393, + 0x8ba0df472c8f6a4e, + 0x2aef6cb74d951c32, + 0x427983722a318d41, + 0x73f7cdffbf389bb2, + 0x074c0af9382c026c, + 0x8a6a0f0b243a035a, + 0x6fdae53c5f88931f, + 0xc68b98967e538ac3, + 0x44ff59c71aa8e639, + 0xe2fce0ce439e9229, + 0xa20cde2479d8cd40, + 0x19e89fa2c8ebd8e9, + 0xf446bbcff398270c, + 0x43b3533e2284e455, + 0xd82f0dcd8e945046, + 0x51066f12b26ce820, + 0xe73957af6bc5426d, + 0x081ece5a40c16fa0, + 0x3b193d4fc5bfab7b, + 0x7fe66488df174d42, + 0x0e9814ef705804d8, + 0x8137ac857c39d7c6, + 0xb1733244e185a821, + 0x695c3f896f11f867, + 0xf6cf0657e3eff524, + 0x1aabf276d02963d5, + 0x2da3664e75b91e5e, + 0x0289bd981077d228, + 0x90c1fd7df413608f, + 0x3c5537b6fd93a917, + 0xaa12107e3919a2e0, + 0x0686dab530996b78, + 0xdaa6b0559ee3826e, + 0xc34e2ff756085a87, + 0x6d5358a44fff4137, + 0xfc587595b35948ac, + 0x7ca5095cc7d5f67e, + 0xfb147f6c8b754ac0, + 0xbfeb26ab91ddacf9, + 0x6896efc567a49173, + 0xca9a31e11e7c5c33, + 0xbbe44186b13315a9, + 0x0ddb793b689abfe4, + 0x70b4a02ba7fa208e, + 0xe47a3a7b7307f951, + 0x8cecd5be14a36822, + 0xeeed49b923b144d9, + 0x17708b4db8b3dc31, + 0x6088219f2765fed3, + 0xb3fa8fdcf1f27a09, + 0x910b2d31fca6099b, + 0x0f52c4a378ed6dcc, + 0x50ccbf5ebad98134, + 0x6bd582117f662a4f, + 0x94ce9a50d4fdd9df, + 0x2b25bcfb45207526, + 0x67c42b661f49fcbf, + 0x492420fc723259dd, + 0x03436dd418c2bb3c, + 0x1f6e4517f872b391, + 0xa08563bc69af1f68, + 0xd43ea4baeebb86b6, + 0x01cad04c08b56914, + 0xac94cacb0980c998, + 0x54c3d8739a373864, + 0x26fec5c02dbacac2, + 0xdea9d778be0d3b3e, + 0x040f672d20eeb950, + 0xe5b0ea377bb29045, + 0xf30ab136cbb42560, + 0x62019c0737122cfb, + 0xe86b930c13282fa1, + 0xcc1ceb542ee5374b, + 0x538fd28aa21b3a08, + 0x1b61223ad89c0ac1, + 0x36c24474ad25149f, + 0x7a23d3e9f74c9d06, + 0xbe21f6e79968c5ed, + 0xcf5f868036278c77, + 0xf705d61beb5a9c30, + 0x4d2b47d152dce08d, + 0x5f9e7bfdc234ecf8, + 0x247778583dcd18ea, + 0x867ba67c4415d5aa, + 0x4ce1979d5a698999, + 0x0000000000000000, + 0xec64f42133c696f1, + 0xb57c5569c16b1171, + 0xc1c7926f467f88af, + 0x654d96fe0f3e2e97, + 0x15f936d5a8c40e19, + 0xb8a72c52a9f1ae95, + 0xa9517daa21db19dc, + 0x58d27104fa18ee94, + 0x5918a148f2ad8780, + 0x5cdd1629daf657c4, + 0x8274c15164fb6cfa, + 0xd1fb13dbc6e056f2, + 0x7d6fd910cf609f6a, + 0xb63f38bdd9a9aa4d, + 0x3d9fe7faf526c003, + 0x74bbc706871499de, + 0xdf630734b6b8522a, + 0x3ad3ed03cd0ac26f, + 0xfadeaf2083c023d4, + 0xc00d42234ecae1bb, + 0x8538cba85cd76e96, + 0xc402250e6e2458eb, + 0x47bc3413026a5d05, + 0xafd7a71f114272a4, + 0x978df784cc3f62e3, + 0xb96dfc1ea144c781, + 0x21b2cf391596c8ae, + 0x318e4e8d950916f3, + 0xce9556cc3e92e563, + 0x385a509bdd7d1047, + 0x358129a0b5e7afa3, + 0xe6f387e363702b79, + 0xe0755d5653e94001, + 0x7be903a5fff9f412, + 0x12b53c2c90e80c75, + 0x3307f315857ec4db, + 0x8fafb86a0c61d31e, + 0xd9e5dd8186213952, + 0x77f8aad29fd622e2, + 0x25bda814357871fe, + 0x7571174a8fa1f0ca, + 0x137fec60985d6561, + 0x30449ec19dbc7fe7, + 0xa540d4dd41f4cf2c, + 0xdc206ae0ae7ae916, + 0x5b911cd0e2da55a8, + 0xb2305f90f947131d, + 0x344bf9ecbd52c6b7, + 0x5d17c665d2433ed0, + 0x18224feec05eb1fd, + 0x9e59e992844b6457, + 0x9a568ebfa4a5dd07, + 0xa3c60e68716da454, + 0x7e2cb4c4d7a22456, + 0x87b176304ca0bcbe, + 0x413aeea632f3367d, + 0x9915e36bbc67663b, + 0x40f03eea3a465f69, + 0x1c2d28c3e0b008ad, + 0x4e682a054a1e5bb1, + 0x05c5b761285bd044, + 0xe1bf8d1a5b5c2915, + 0xf2c0617ac3014c74, + 0xb7f5e8f1d11cc359, + 0x63cb4c4b3fa745ef, + 0x9d1a84469c89df6b, + 0xe33630824b2bfb3d, + 0xd5f474f6e60eefa2, + 0xf58c6b83fb2d4e18, + 0x4676e45f0adf3411, + 0x20781f751d23a1ba, + 0xbd629b3381aa7ed1, + 0xae1d775319f71bb0, + 0xfed1c80da32e9a84, + 0x5509083f92825170, + 0x29ac01635557a70e, + 0xa7c9694551831d04, + 0x8e65682604d4ba0a, + 0x11f651f8882ab749, + 0xd77dc96ef6793d8a, + 0xef2799f52b042dcd, + 0x48eef0b07a8730c9, + 0x22f1a2ed0d547392, + 0x6142f1d32fd097c7, + 0x4a674d286af0e2e1, + 0x80fd7cc9748cbed2, + 0x717e7067af4f499a, + 0x938290a9ecd1dbb3, + 0x88e3b293344dd172, + 0x2734158c250fa3d6, + }, + { + 0x7e37e62dfc7d40c3, + 0x776f25a4ee939e5b, + 0xe045c850dd8fb5ad, + 0x86ed5ba711ff1952, + 0xe91d0bd9cf616b35, + 0x37e0ab256e408ffb, + 0x9607f6c031025a7a, + 0x0b02f5e116d23c9d, + 0xf3d8486bfb50650c, + 0x621cff27c40875f5, + 0x7d40cb71fa5fd34a, + 0x6daa6616daa29062, + 0x9f5f354923ec84e2, + 0xec847c3dc507c3b3, + 0x025a3668043ce205, + 0xa8bf9e6c4dac0b19, + 0xfa808be2e9bebb94, + 0xb5b99c5277c74fa3, + 0x78d9bc95f0397bcc, + 0xe332e50cdbad2624, + 0xc74fce129332797e, + 0x1729eceb2ea709ab, + 0xc2d6b9f69954d1f8, + 0x5d898cbfbab8551a, + 0x859a76fb17dd8adb, + 0x1be85886362f7fb5, + 0xf6413f8ff136cd8a, + 0xd3110fa5bbb7e35c, + 0x0a2feed514cc4d11, + 0xe83010edcd7f1ab9, + 0xa1e75de55f42d581, + 0xeede4a55c13b21b6, + 0xf2f5535ff94e1480, + 0x0cc1b46d1888761e, + 0xbce15fdb6529913b, + 0x2d25e8975a7181c2, + 0x71817f1ce2d7a554, + 0x2e52c5cb5c53124b, + 0xf9f7a6beef9c281d, + 0x9e722e7d21f2f56e, + 0xce170d9b81dca7e6, + 0x0e9b82051cb4941b, + 0x1e712f623c49d733, + 0x21e45cfa42f9f7dc, + 0xcb8e7a7f8bba0f60, + 0x8e98831a010fb646, + 0x474ccf0d8e895b23, + 0xa99285584fb27a95, + 0x8cc2b57205335443, + 0x42d5b8e984eff3a5, + 0x012d1b34021e718c, + 0x57a6626aae74180b, + 0xff19fc06e3d81312, + 0x35ba9d4d6a7c6dfe, + 0xc9d44c178f86ed65, + 0x506523e6a02e5288, + 0x03772d5c06229389, + 0x8b01f4fe0b691ec0, + 0xf8dabd8aed825991, + 0x4c4e3aec985b67be, + 0xb10df0827fbf96a9, + 0x6a69279ad4f8dae1, + 0xe78689dcd3d5ff2e, + 0x812e1a2b1fa553d1, + 0xfbad90d6eba0ca18, + 0x1ac543b234310e39, + 0x1604f7df2cb97827, + 0xa6241c6951189f02, + 0x753513cceaaf7c5e, + 0x64f2a59fc84c4efa, + 0x247d2b1e489f5f5a, + 0xdb64d718ab474c48, + 0x79f4a7a1f2270a40, + 0x1573da832a9bebae, + 0x3497867968621c72, + 0x514838d2a2302304, + 0xf0af6537fd72f685, + 0x1d06023e3a6b44ba, + 0x678588c3ce6edd73, + 0x66a893f7cc70acff, + 0xd4d24e29b5eda9df, + 0x3856321470ea6a6c, + 0x07c3418c0e5a4a83, + 0x2bcbb22f5635bacd, + 0x04b46cd00878d90a, + 0x06ee5ab80c443b0f, + 0x3b211f4876c8f9e5, + 0x0958c38912eede98, + 0xd14b39cdbf8b0159, + 0x397b292072f41be0, + 0x87c0409313e168de, + 0xad26e98847caa39f, + 0x4e140c849c6785bb, + 0xd5ff551db7f3d853, + 0xa0ca46d15d5ca40d, + 0xcd6020c787fe346f, + 0x84b76dcf15c3fb57, + 0xdefda0fca121e4ce, + 0x4b8d7b6096012d3d, + 0x9ac642ad298a2c64, + 0x0875d8bd10f0af14, + 0xb357c6ea7b8374ac, + 0x4d6321d89a451632, + 0xeda96709c719b23f, + 0xf76c24bbf328bc06, + 0xc662d526912c08f2, + 0x3ce25ec47892b366, + 0xb978283f6f4f39bd, + 0xc08c8f9e9d6833fd, + 0x4f3917b09e79f437, + 0x593de06fb2c08c10, + 0xd6887841b1d14bda, + 0x19b26eee32139db0, + 0xb494876675d93e2f, + 0x825937771987c058, + 0x90e9ac783d466175, + 0xf1827e03ff6c8709, + 0x945dc0a8353eb87f, + 0x4516f9658ab5b926, + 0x3f9573987eb020ef, + 0xb855330b6d514831, + 0x2ae6a91b542bcb41, + 0x6331e413c6160479, + 0x408f8e8180d311a0, + 0xeff35161c325503a, + 0xd06622f9bd9570d5, + 0x8876d9a20d4b8d49, + 0xa5533135573a0c8b, + 0xe168d364df91c421, + 0xf41b09e7f50a2f8f, + 0x12b09b0f24c1a12d, + 0xda49cc2ca9593dc4, + 0x1f5c34563e57a6bf, + 0x54d14f36a8568b82, + 0xaf7cdfe043f6419a, + 0xea6a2685c943f8bc, + 0xe5dcbfb4d7e91d2b, + 0xb27addde799d0520, + 0x6b443caed6e6ab6d, + 0x7bae91c9f61be845, + 0x3eb868ac7cae5163, + 0x11c7b65322e332a4, + 0xd23c1491b9a992d0, + 0x8fb5982e0311c7ca, + 0x70ac6428e0c9d4d8, + 0x895bc2960f55fcc5, + 0x76423e90ec8defd7, + 0x6ff0507ede9e7267, + 0x3dcf45f07a8cc2ea, + 0x4aa06054941f5cb1, + 0x5810fb5bb0defd9c, + 0x5efea1e3bc9ac693, + 0x6edd4b4adc8003eb, + 0x741808f8e8b10dd2, + 0x145ec1b728859a22, + 0x28bc9f7350172944, + 0x270a06424ebdccd3, + 0x972aedf4331c2bf6, + 0x059977e40a66a886, + 0x2550302a4a812ed6, + 0xdd8a8da0a7037747, + 0xc515f87a970e9b7b, + 0x3023eaa9601ac578, + 0xb7e3aa3a73fbada6, + 0x0fb699311eaae597, + 0x0000000000000000, + 0x310ef19d6204b4f4, + 0x229371a644db6455, + 0x0decaf591a960792, + 0x5ca4978bb8a62496, + 0x1c2b190a38753536, + 0x41a295b582cd602c, + 0x3279dcc16426277d, + 0xc1a194aa9f764271, + 0x139d803b26dfd0a1, + 0xae51c4d441e83016, + 0xd813fa44ad65dfc1, + 0xac0bf2bc45d4d213, + 0x23be6a9246c515d9, + 0x49d74d08923dcf38, + 0x9d05032127d066e7, + 0x2f7fdeff5e4d63c7, + 0xa47e2a0155247d07, + 0x99b16ff12fa8bfed, + 0x4661d4398c972aaf, + 0xdfd0bbc8a33f9542, + 0xdca79694a51d06cb, + 0xb020ebb67da1e725, + 0xba0f0563696daa34, + 0xe4f1a480d5f76ca7, + 0xc438e34e9510eaf7, + 0x939e81243b64f2fc, + 0x8defae46072d25cf, + 0x2c08f3a3586ff04e, + 0xd7a56375b3cf3a56, + 0x20c947ce40e78650, + 0x43f8a3dd86f18229, + 0x568b795eac6a6987, + 0x8003011f1dbb225d, + 0xf53612d3f7145e03, + 0x189f75da300dec3c, + 0x9570db9c3720c9f3, + 0xbb221e576b73dbb8, + 0x72f65240e4f536dd, + 0x443be25188abc8aa, + 0xe21ffe38d9b357a8, + 0xfd43ca6ee7e4f117, + 0xcaa3614b89a47eec, + 0xfe34e732e1c6629e, + 0x83742c431b99b1d4, + 0xcf3a16af83c2d66a, + 0xaae5a8044990e91c, + 0x26271d764ca3bd5f, + 0x91c4b74c3f5810f9, + 0x7c6dd045f841a2c6, + 0x7f1afd19fe63314f, + 0xc8f957238d989ce9, + 0xa709075d5306ee8e, + 0x55fc5402aa48fa0e, + 0x48fa563c9023beb4, + 0x65dfbeabca523f76, + 0x6c877d22d8bce1ee, + 0xcc4d3bf385e045e3, + 0xbebb69b36115733e, + 0x10eaad6720fd4328, + 0xb6ceb10e71e5dc2a, + 0xbdcc44ef6737e0b7, + 0x523f158ea412b08d, + 0x989c74c52db6ce61, + 0x9beb59992b945de8, + 0x8a2cefca09776f4c, + 0xa3bd6b8d5b7e3784, + 0xeb473db1cb5d8930, + 0xc3fba2c29b4aa074, + 0x9c28181525ce176b, + 0x683311f2d0c438e4, + 0x5fd3bad7be84b71f, + 0xfc6ed15ae5fa809b, + 0x36cdb0116c5efe77, + 0x29918447520958c8, + 0xa29070b959604608, + 0x53120ebaa60cc101, + 0x3a0c047c74d68869, + 0x691e0ac6d2da4968, + 0x73db4974e6eb4751, + 0x7a838afdf40599c9, + 0x5a4acd33b4e21f99, + 0x6046c94fc03497f0, + 0xe6ab92e8d1cb8ea2, + 0x3354c7f5663856f1, + 0xd93ee170af7bae4d, + 0x616bd27bc22ae67c, + 0x92b39a10397a8370, + 0xabc8b3304b8e9890, + 0xbf967287630b02b2, + 0x5b67d607b6fc6e15, + }, + { + 0x8ab0a96846e06a6d, + 0x43c7e80b4bf0b33a, + 0x08c9b3546b161ee5, + 0x39f1c235eba990be, + 0xc1bef2376606c7b2, + 0x2c209233614569aa, + 0xeb01523b6fc3289a, + 0x946953ab935acedd, + 0x272838f63e13340e, + 0x8b0455eca12ba052, + 0x77a1b2c4978ff8a2, + 0xa55122ca13e54086, + 0x2276135862d3f1cd, + 0xdb8ddfde08b76cfe, + 0x5d1e12c89e4a178a, + 0x0e56816b03969867, + 0xee5f79953303ed59, + 0xafed748bab78d71d, + 0x6d929f2df93e53ee, + 0xf5d8a8f8ba798c2a, + 0xf619b1698e39cf6b, + 0x95ddaf2f749104e2, + 0xec2a9c80e0886427, + 0xce5c8fd8825b95ea, + 0xc4e0d9993ac60271, + 0x4699c3a5173076f9, + 0x3d1b151f50a29f42, + 0x9ed505ea2bc75946, + 0x34665acfdc7f4b98, + 0x61b1fb53292342f7, + 0xc721c0080e864130, + 0x8693cd1696fd7b74, + 0x872731927136b14b, + 0xd3446c8a63a1721b, + 0x669a35e8a6680e4a, + 0xcab658f239509a16, + 0xa4e5de4ef42e8ab9, + 0x37a7435ee83f08d9, + 0x134e6239e26c7f96, + 0x82791a3c2df67488, + 0x3f6ef00a8329163c, + 0x8e5a7e42fdeb6591, + 0x5caaee4c7981ddb5, + 0x19f234785af1e80d, + 0x255ddde3ed98bd70, + 0x50898a32a99cccac, + 0x28ca4519da4e6656, + 0xae59880f4cb31d22, + 0x0d9798fa37d6db26, + 0x32f968f0b4ffcd1a, + 0xa00f09644f258545, + 0xfa3ad5175e24de72, + 0xf46c547c5db24615, + 0x713e80fbff0f7e20, + 0x7843cf2b73d2aafa, + 0xbd17ea36aedf62b4, + 0xfd111bacd16f92cf, + 0x4abaa7dbc72d67e0, + 0xb3416b5dad49fad3, + 0xbca316b24914a88b, + 0x15d150068aecf914, + 0xe27c1debe31efc40, + 0x4fe48c759beda223, + 0x7edcfd141b522c78, + 0x4e5070f17c26681c, + 0xe696cac15815f3bc, + 0x35d2a64b3bb481a7, + 0x800cff29fe7dfdf6, + 0x1ed9fac3d5baa4b0, + 0x6c2663a91ef599d1, + 0x03c1199134404341, + 0xf7ad4ded69f20554, + 0xcd9d9649b61bd6ab, + 0xc8c3bde7eadb1368, + 0xd131899fb02afb65, + 0x1d18e352e1fae7f1, + 0xda39235aef7ca6c1, + 0xa1bbf5e0a8ee4f7a, + 0x91377805cf9a0b1e, + 0x3138716180bf8e5b, + 0xd9f83acbdb3ce580, + 0x0275e515d38b897e, + 0x472d3f21f0fbbcc6, + 0x2d946eb7868ea395, + 0xba3c248d21942e09, + 0xe7223645bfde3983, + 0xff64feb902e41bb1, + 0xc97741630d10d957, + 0xc3cb1722b58d4ecc, + 0xa27aec719cae0c3b, + 0x99fecb51a48c15fb, + 0x1465ac826d27332b, + 0xe1bd047ad75ebf01, + 0x79f733af941960c5, + 0x672ec96c41a3c475, + 0xc27feba6524684f3, + 0x64efd0fd75e38734, + 0xed9e60040743ae18, + 0xfb8e2993b9ef144d, + 0x38453eb10c625a81, + 0x6978480742355c12, + 0x48cf42ce14a6ee9e, + 0x1cac1fd606312dce, + 0x7b82d6ba4792e9bb, + 0x9d141c7b1f871a07, + 0x5616b80dc11c4a2e, + 0xb849c198f21fa777, + 0x7ca91801c8d9a506, + 0xb1348e487ec273ad, + 0x41b20d1e987b3a44, + 0x7460ab55a3cfbbe3, + 0x84e628034576f20a, + 0x1b87d16d897a6173, + 0x0fe27defe45d5258, + 0x83cde6b8ca3dbeb7, + 0x0c23647ed01d1119, + 0x7a362a3ea0592384, + 0xb61f40f3f1893f10, + 0x75d457d1440471dc, + 0x4558da34237035b8, + 0xdca6116587fc2043, + 0x8d9b67d3c9ab26d0, + 0x2b0b5c88ee0e2517, + 0x6fe77a382ab5da90, + 0x269cc472d9d8fe31, + 0x63c41e46faa8cb89, + 0xb7abbc771642f52f, + 0x7d1de4852f126f39, + 0xa8c6ba3024339ba0, + 0x600507d7cee888c8, + 0x8fee82c61a20afae, + 0x57a2448926d78011, + 0xfca5e72836a458f0, + 0x072bcebb8f4b4cbd, + 0x497bbe4af36d24a1, + 0x3cafe99bb769557d, + 0x12fa9ebd05a7b5a9, + 0xe8c04baa5b836bdb, + 0x4273148fac3b7905, + 0x908384812851c121, + 0xe557d3506c55b0fd, + 0x72ff996acb4f3d61, + 0x3eda0c8e64e2dc03, + 0xf0868356e6b949e9, + 0x04ead72abb0b0ffc, + 0x17a4b5135967706a, + 0xe3c8e16f04d5367f, + 0xf84f30028daf570c, + 0x1846c8fcbd3a2232, + 0x5b8120f7f6ca9108, + 0xd46fa231ecea3ea6, + 0x334d947453340725, + 0x58403966c28ad249, + 0xbed6f3a79a9f21f5, + 0x68ccb483a5fe962d, + 0xd085751b57e1315a, + 0xfed0023de52fd18e, + 0x4b0e5b5f20e6addf, + 0x1a332de96eb1ab4c, + 0xa3ce10f57b65c604, + 0x108f7ba8d62c3cd7, + 0xab07a3a11073d8e1, + 0x6b0dad1291bed56c, + 0xf2f366433532c097, + 0x2e557726b2cee0d4, + 0x0000000000000000, + 0xcb02a476de9b5029, + 0xe4e32fd48b9e7ac2, + 0x734b65ee2c84f75e, + 0x6e5386bccd7e10af, + 0x01b4fc84e7cbca3f, + 0xcfe8735c65905fd5, + 0x3613bfda0ff4c2e6, + 0x113b872c31e7f6e8, + 0x2fe18ba255052aeb, + 0xe974b72ebc48a1e4, + 0x0abc5641b89d979b, + 0xb46aa5e62202b66e, + 0x44ec26b0c4bbff87, + 0xa6903b5b27a503c7, + 0x7f680190fc99e647, + 0x97a84a3aa71a8d9c, + 0xdd12ede16037ea7c, + 0xc554251ddd0dc84e, + 0x88c54c7d956be313, + 0x4d91696048662b5d, + 0xb08072cc9909b992, + 0xb5de5962c5c97c51, + 0x81b803ad19b637c9, + 0xb2f597d94a8230ec, + 0x0b08aac55f565da4, + 0xf1327fd2017283d6, + 0xad98919e78f35e63, + 0x6ab9519676751f53, + 0x24e921670a53774f, + 0xb9fd3d1c15d46d48, + 0x92f66194fbda485f, + 0x5a35dc7311015b37, + 0xded3f4705477a93d, + 0xc00a0eb381cd0d8d, + 0xbb88d809c65fe436, + 0x16104997beacba55, + 0x21b70ac95693b28c, + 0x59f4c5e225411876, + 0xd5db5eb50b21f499, + 0x55d7a19cf55c096f, + 0xa97246b4c3f8519f, + 0x8552d487a2bd3835, + 0x54635d181297c350, + 0x23c2efdc85183bf2, + 0x9f61f96ecc0c9379, + 0x534893a39ddc8fed, + 0x5edf0b59aa0a54cb, + 0xac2c6d1a9f38945c, + 0xd7aebba0d8aa7de7, + 0x2abfa00c09c5ef28, + 0xd84cc64f3cf72fbf, + 0x2003f64db15878b3, + 0xa724c7dfc06ec9f8, + 0x069f323f68808682, + 0xcc296acd51d01c94, + 0x055e2bae5cc0c5c3, + 0x6270e2c21d6301b6, + 0x3b842720382219c0, + 0xd2f0900e846ab824, + 0x52fc6f277a1745d2, + 0xc6953c8ce94d8b0f, + 0xe009f8fe3095753e, + 0x655b2c7992284d0b, + 0x984a37d54347dfc4, + 0xeab5aebf8808e2a5, + 0x9a3fd2c090cc56ba, + 0x9ca0e0fff84cd038, + 0x4c2595e4afade162, + 0xdf6708f4b3bc6302, + 0xbf620f237d54ebca, + 0x93429d101c118260, + 0x097d4fd08cddd4da, + 0x8c2f9b572e60ecef, + 0x708a7c7f18c4b41f, + 0x3a30dba4dfe9d3ff, + 0x4006f19a7fb0f07b, + 0x5f6bf7dd4dc19ef4, + 0x1f6d064732716e8f, + 0xf9fbcc866a649d33, + 0x308c8de567744464, + 0x8971b0f972a0292c, + 0xd61a47243f61b7d8, + 0xefeb8511d4c82766, + 0x961cb6be40d147a3, + 0xaab35f25f7b812de, + 0x76154e407044329d, + 0x513d76b64e570693, + 0xf3479ac7d2f90aa8, + 0x9b8b2e4477079c85, + 0x297eb99d3d85ac69, + }, + { + 0x3ef29d249b2c0a19, + 0xe9e16322b6f8622f, + 0x5536994047757f7a, + 0x9f4d56d5a47b0b33, + 0x822567466aa1174c, + 0xb8f5057deb082fb2, + 0xcc48c10bf4475f53, + 0x373088d4275dec3a, + 0x968f4325180aed10, + 0x173d232cf7016151, + 0xae4ed09f946fcc13, + 0xfd4b4741c4539873, + 0x1b5b3f0dd9933765, + 0x2ffcb0967b644052, + 0xe02376d20a89840c, + 0xa3ae3a70329b18d7, + 0x419cbd2335de8526, + 0xfafebf115b7c3199, + 0x0397074f85aa9b0d, + 0xc58ad4fb4836b970, + 0xbec60be3fc4104a8, + 0x1eff36dc4b708772, + 0x131fdc33ed8453b6, + 0x0844e33e341764d3, + 0x0ff11b6eab38cd39, + 0x64351f0a7761b85a, + 0x3b5694f509cfba0e, + 0x30857084b87245d0, + 0x47afb3bd2297ae3c, + 0xf2ba5c2f6f6b554a, + 0x74bdc4761f4f70e1, + 0xcfdfc64471edc45e, + 0xe610784c1dc0af16, + 0x7aca29d63c113f28, + 0x2ded411776a859af, + 0xac5f211e99a3d5ee, + 0xd484f949a87ef33b, + 0x3ce36ca596e013e4, + 0xd120f0983a9d432c, + 0x6bc40464dc597563, + 0x69d5f5e5d1956c9e, + 0x9ae95f043698bb24, + 0xc9ecc8da66a4ef44, + 0xd69508c8a5b2eac6, + 0xc40c2235c0503b80, + 0x38c193ba8c652103, + 0x1ceec75d46bc9e8f, + 0xd331011937515ad1, + 0xd8e2e56886eca50f, + 0xb137108d5779c991, + 0x709f3b6905ca4206, + 0x4feb50831680caef, + 0xec456af3241bd238, + 0x58d673afe181abbe, + 0x242f54e7cad9bf8c, + 0x0211f1810dcc19fd, + 0x90bc4dbb0f43c60a, + 0x9518446a9da0761d, + 0xa1bfcbf13f57012a, + 0x2bde4f8961e172b5, + 0x27b853a84f732481, + 0xb0b1e643df1f4b61, + 0x18cc38425c39ac68, + 0xd2b7f7d7bf37d821, + 0x3103864a3014c720, + 0x14aa246372abfa5c, + 0x6e600db54ebac574, + 0x394765740403a3f3, + 0x09c215f0bc71e623, + 0x2a58b947e987f045, + 0x7b4cdf18b477bdd8, + 0x9709b5eb906c6fe0, + 0x73083c268060d90b, + 0xfedc400e41f9037e, + 0x284948c6e44be9b8, + 0x728ecae808065bfb, + 0x06330e9e17492b1a, + 0x5950856169e7294e, + 0xbae4f4fce6c4364f, + 0xca7bcf95e30e7449, + 0x7d7fd186a33e96c2, + 0x52836110d85ad690, + 0x4dfaa1021b4cd312, + 0x913abb75872544fa, + 0xdd46ecb9140f1518, + 0x3d659a6b1e869114, + 0xc23f2cabd719109a, + 0xd713fe062dd46836, + 0xd0a60656b2fbc1dc, + 0x221c5a79dd909496, + 0xefd26dbca1b14935, + 0x0e77eda0235e4fc9, + 0xcbfd395b6b68f6b9, + 0x0de0eaefa6f4d4c4, + 0x0422ff1f1a8532e7, + 0xf969b85eded6aa94, + 0x7f6e2007aef28f3f, + 0x3ad0623b81a938fe, + 0x6624ee8b7aada1a7, + 0xb682e8ddc856607b, + 0xa78cc56f281e2a30, + 0xc79b257a45faa08d, + 0x5b4174e0642b30b3, + 0x5f638bff7eae0254, + 0x4bc9af9c0c05f808, + 0xce59308af98b46ae, + 0x8fc58da9cc55c388, + 0x803496c7676d0eb1, + 0xf33caae1e70dd7ba, + 0xbb6202326ea2b4bf, + 0xd5020f87201871cb, + 0x9d5ca754a9b712ce, + 0x841669d87de83c56, + 0x8a6184785eb6739f, + 0x420bba6cb0741e2b, + 0xf12d5b60eac1ce47, + 0x76ac35f71283691c, + 0x2c6bb7d9fecedb5f, + 0xfccdb18f4c351a83, + 0x1f79c012c3160582, + 0xf0abadae62a74cb7, + 0xe1a5801c82ef06fc, + 0x67a21845f2cb2357, + 0x5114665f5df04d9d, + 0xbf40fd2d74278658, + 0xa0393d3fb73183da, + 0x05a409d192e3b017, + 0xa9fb28cf0b4065f9, + 0x25a9a22942bf3d7c, + 0xdb75e22703463e02, + 0xb326e10c5ab5d06c, + 0xe7968e8295a62de6, + 0xb973f3b3636ead42, + 0xdf571d3819c30ce5, + 0xee549b7229d7cbc5, + 0x12992afd65e2d146, + 0xf8ef4e9056b02864, + 0xb7041e134030e28b, + 0xc02edd2adad50967, + 0x932b4af48ae95d07, + 0x6fe6fb7bc6dc4784, + 0x239aacb755f61666, + 0x401a4bedbdb807d6, + 0x485ea8d389af6305, + 0xa41bc220adb4b13d, + 0x753b32b89729f211, + 0x997e584bb3322029, + 0x1d683193ceda1c7f, + 0xff5ab6c0c99f818e, + 0x16bbd5e27f67e3a1, + 0xa59d34ee25d233cd, + 0x98f8ae853b54a2d9, + 0x6df70afacb105e79, + 0x795d2e99b9bba425, + 0x8e437b6744334178, + 0x0186f6ce886682f0, + 0xebf092a3bb347bd2, + 0xbcd7fa62f18d1d55, + 0xadd9d7d011c5571e, + 0x0bd3e471b1bdffde, + 0xaa6c2f808eeafef4, + 0x5ee57d31f6c880a4, + 0xf50fa47ff044fca0, + 0x1addc9c351f5b595, + 0xea76646d3352f922, + 0x0000000000000000, + 0x85909f16f58ebea6, + 0x46294573aaf12ccc, + 0x0a5512bf39db7d2e, + 0x78dbd85731dd26d5, + 0x29cfbe086c2d6b48, + 0x218b5d36583a0f9b, + 0x152cd2adfacd78ac, + 0x83a39188e2c795bc, + 0xc3b9da655f7f926a, + 0x9ecba01b2c1d89c3, + 0x07b5f8509f2fa9ea, + 0x7ee8d6c926940dcf, + 0x36b67e1aaf3b6eca, + 0x86079859702425ab, + 0xfb7849dfd31ab369, + 0x4c7c57cc932a51e2, + 0xd96413a60e8a27ff, + 0x263ea566c715a671, + 0x6c71fc344376dc89, + 0x4a4f595284637af8, + 0xdaf314e98b20bcf2, + 0x572768c14ab96687, + 0x1088db7c682ec8bb, + 0x887075f9537a6a62, + 0x2e7a4658f302c2a2, + 0x619116dbe582084d, + 0xa87dde018326e709, + 0xdcc01a779c6997e8, + 0xedc39c3dac7d50c8, + 0xa60a33a1a078a8c0, + 0xc1a82be452b38b97, + 0x3f746bea134a88e9, + 0xa228ccbebafd9a27, + 0xabead94e068c7c04, + 0xf48952b178227e50, + 0x5cf48cb0fb049959, + 0x6017e0156de48abd, + 0x4438b4f2a73d3531, + 0x8c528ae649ff5885, + 0xb515ef924dfcfb76, + 0x0c661c212e925634, + 0xb493195cc59a7986, + 0x9cda519a21d1903e, + 0x32948105b5be5c2d, + 0x194ace8cd45f2e98, + 0x438d4ca238129cdb, + 0x9b6fa9cabefe39d4, + 0x81b26009ef0b8c41, + 0xded1ebf691a58e15, + 0x4e6da64d9ee6481f, + 0x54b06f8ecf13fd8a, + 0x49d85e1d01c9e1f5, + 0xafc826511c094ee3, + 0xf698a33075ee67ad, + 0x5ac7822eec4db243, + 0x8dd47c28c199da75, + 0x89f68337db1ce892, + 0xcdce37c57c21dda3, + 0x530597de503c5460, + 0x6a42f2aa543ff793, + 0x5d727a7e73621ba9, + 0xe232875307459df1, + 0x56a19e0fc2dfe477, + 0xc61dd3b4cd9c227d, + 0xe5877f03986a341b, + 0x949eb2a415c6f4ed, + 0x6206119460289340, + 0x6380e75ae84e11b0, + 0x8be772b6d6d0f16f, + 0x50929091d596cf6d, + 0xe86795ec3e9ee0df, + 0x7cf927482b581432, + 0xc86a3e14eec26db4, + 0x7119cda78dacc0f6, + 0xe40189cd100cb6eb, + 0x92adbc3a028fdff7, + 0xb2a017c2d2d3529c, + 0x200dabf8d05c8d6b, + 0x34a78f9ba2f77737, + 0xe3b4719d8f231f01, + 0x45be423c2f5bb7c1, + 0xf71e55fefd88e55d, + 0x6853032b59f3ee6e, + 0x65b3e9c4ff073aaa, + 0x772ac3399ae5ebec, + 0x87816e97f842a75b, + 0x110e2db2e0484a4b, + 0x331277cb3dd8dedd, + 0xbd510cac79eb9fa5, + 0x352179552a91f5c7, + }, + { + 0x05ba7bc82c9b3220, + 0x31a54665f8b65e4f, + 0xb1b651f77547f4d4, + 0x8bfa0d857ba46682, + 0x85a96c5aa16a98bb, + 0x990faef908eb79c9, + 0xa15e37a247f4a62d, + 0x76857dcd5d27741e, + 0xf8c50b800a1820bc, + 0xbe65dcb201f7a2b4, + 0x666d1b986f9426e7, + 0x4cc921bf53c4e648, + 0x95410a0f93d9ca42, + 0x20cdccaa647ba4ef, + 0x429a4060890a1871, + 0x0c4ea4f69b32b38b, + 0xccda362dde354cd3, + 0x96dc23bc7c5b2fa9, + 0xc309bb68aa851ab3, + 0xd26131a73648e013, + 0x021dc52941fc4db2, + 0xcd5adab7704be48a, + 0xa77965d984ed71e6, + 0x32386fd61734bba4, + 0xe82d6dd538ab7245, + 0x5c2147ea6177b4b1, + 0x5da1ab70cf091ce8, + 0xac907fce72b8bdff, + 0x57c85dfd972278a8, + 0xa4e44c6a6b6f940d, + 0x3851995b4f1fdfe4, + 0x62578ccaed71bc9e, + 0xd9882bb0c01d2c0a, + 0x917b9d5d113c503b, + 0xa2c31e11a87643c6, + 0xe463c923a399c1ce, + 0xf71686c57ea876dc, + 0x87b4a973e096d509, + 0xaf0d567d9d3a5814, + 0xb40c2a3f59dcc6f4, + 0x3602f88495d121dd, + 0xd3e1dd3d9836484a, + 0xf945e71aa46688e5, + 0x7518547eb2a591f5, + 0x9366587450c01d89, + 0x9ea81018658c065b, + 0x4f54080cbc4603a3, + 0x2d0384c65137bf3d, + 0xdc325078ec861e2a, + 0xea30a8fc79573ff7, + 0x214d2030ca050cb6, + 0x65f0322b8016c30c, + 0x69be96dd1b247087, + 0xdb95ee9981e161b8, + 0xd1fc1814d9ca05f8, + 0x820ed2bbcc0de729, + 0x63d76050430f14c7, + 0x3bccb0e8a09d3a0f, + 0x8e40764d573f54a2, + 0x39d175c1e16177bd, + 0x12f5a37c734f1f4b, + 0xab37c12f1fdfc26d, + 0x5648b167395cd0f1, + 0x6c04ed1537bf42a7, + 0xed97161d14304065, + 0x7d6c67daab72b807, + 0xec17fa87ba4ee83c, + 0xdfaf79cb0304fbc1, + 0x733f060571bc463e, + 0x78d61c1287e98a27, + 0xd07cf48e77b4ada1, + 0xb9c262536c90dd26, + 0xe2449b5860801605, + 0x8fc09ad7f941fcfb, + 0xfad8cea94be46d0e, + 0xa343f28b0608eb9f, + 0x9b126bd04917347b, + 0x9a92874ae7699c22, + 0x1b017c42c4e69ee0, + 0x3a4c5c720ee39256, + 0x4b6e9f5e3ea399da, + 0x6ba353f45ad83d35, + 0xe7fee0904c1b2425, + 0x22d009832587e95d, + 0x842980c00f1430e2, + 0xc6b3c0a0861e2893, + 0x087433a419d729f2, + 0x341f3dadd42d6c6f, + 0xee0a3faefbb2a58e, + 0x4aee73c490dd3183, + 0xaab72db5b1a16a34, + 0xa92a04065e238fdf, + 0x7b4b35a1686b6fcc, + 0x6a23bf6ef4a6956c, + 0x191cb96b851ad352, + 0x55d598d4d6de351a, + 0xc9604de5f2ae7ef3, + 0x1ca6c2a3a981e172, + 0xde2f9551ad7a5398, + 0x3025aaff56c8f616, + 0x15521d9d1e2860d9, + 0x506fe31cfa45073a, + 0x189c55f12b647b0b, + 0x0180ec9aae7ea859, + 0x7cec8b40050c105e, + 0x2350e5198bf94104, + 0xef8ad33455cc0dd7, + 0x07a7bee16d677f92, + 0xe5e325b90de76997, + 0x5a061591a26e637a, + 0xb611ef1618208b46, + 0x09f4df3eb7a981ab, + 0x1ebb078ae87dacc0, + 0xb791038cb65e231f, + 0x0fd38d4574b05660, + 0x67edf702c1ea8ebe, + 0xba5f4be0831238cd, + 0xe3c477c2cefebe5c, + 0x0dce486c354c1bd2, + 0x8c5db36416c31910, + 0x26ea9ed1a7627324, + 0x039d29b3ef82e5eb, + 0x9f28fc82cbf2ae02, + 0xa8aae89cf05d2786, + 0x431aacfa2774b028, + 0xcf471f9e31b7a938, + 0x581bd0b8e3922ec8, + 0xbc78199b400bef06, + 0x90fb71c7bf42f862, + 0x1f3beb1046030499, + 0x683e7a47b55ad8de, + 0x988f4263a695d190, + 0xd808c72a6e638453, + 0x0627527bc319d7cb, + 0xebb04466d72997ae, + 0xe67e0c0ae2658c7c, + 0x14d2f107b056c880, + 0x7122c32c30400b8c, + 0x8a7ae11fd5dacedb, + 0xa0dedb38e98a0e74, + 0xad109354dcc615a6, + 0x0be91a17f655cc19, + 0x8ddd5ffeb8bdb149, + 0xbfe53028af890aed, + 0xd65ba6f5b4ad7a6a, + 0x7956f0882997227e, + 0x10e8665532b352f9, + 0x0e5361dfdacefe39, + 0xcec7f3049fc90161, + 0xff62b561677f5f2e, + 0x975ccf26d22587f0, + 0x51ef0f86543baf63, + 0x2f1e41ef10cbf28f, + 0x52722635bbb94a88, + 0xae8dbae73344f04d, + 0x410769d36688fd9a, + 0xb3ab94de34bbb966, + 0x801317928df1aa9b, + 0xa564a0f0c5113c54, + 0xf131d4bebdb1a117, + 0x7f71a2f3ea8ef5b5, + 0x40878549c8f655c3, + 0x7ef14e6944f05dec, + 0xd44663dcf55137d8, + 0xf2acfd0d523344fc, + 0x0000000000000000, + 0x5fbc6e598ef5515a, + 0x16cf342ef1aa8532, + 0xb036bd6ddb395c8d, + 0x13754fe6dd31b712, + 0xbbdfa77a2d6c9094, + 0x89e7c8ac3a582b30, + 0x3c6b0e09cdfa459d, + 0xc4ae0589c7e26521, + 0x49735a777f5fd468, + 0xcafd64561d2c9b18, + 0xda1502032f9fc9e1, + 0x8867243694268369, + 0x3782141e3baf8984, + 0x9cb5d53124704be9, + 0xd7db4a6f1ad3d233, + 0xa6f989432a93d9bf, + 0x9d3539ab8a0ee3b0, + 0x53f2caaf15c7e2d1, + 0x6e19283c76430f15, + 0x3debe2936384edc4, + 0x5e3c82c3208bf903, + 0x33b8834cb94a13fd, + 0x6470deb12e686b55, + 0x359fd1377a53c436, + 0x61caa57902f35975, + 0x043a975282e59a79, + 0xfd7f70482683129c, + 0xc52ee913699ccd78, + 0x28b9ff0e7dac8d1d, + 0x5455744e78a09d43, + 0xcb7d88ccb3523341, + 0x44bd121b4a13cfba, + 0x4d49cd25fdba4e11, + 0x3e76cb208c06082f, + 0x3ff627ba2278a076, + 0xc28957f204fbb2ea, + 0x453dfe81e46d67e3, + 0x94c1e6953da7621b, + 0x2c83685cff491764, + 0xf32c1197fc4deca5, + 0x2b24d6bd922e68f6, + 0xb22b78449ac5113f, + 0x48f3b6edd1217c31, + 0x2e9ead75beb55ad6, + 0x174fd8b45fd42d6b, + 0x4ed4e4961238abfa, + 0x92e6b4eefebeb5d0, + 0x46a0d7320bef8208, + 0x47203ba8a5912a51, + 0x24f75bf8e69e3e96, + 0xf0b1382413cf094e, + 0xfee259fbc901f777, + 0x276a724b091cdb7d, + 0xbdf8f501ee75475f, + 0x599b3c224dec8691, + 0x6d84018f99c1eafe, + 0x7498b8e41cdb39ac, + 0xe0595e71217c5bb7, + 0x2aa43a273c50c0af, + 0xf50b43ec3f543b6e, + 0x838e3e2162734f70, + 0xc09492db4507ff58, + 0x72bfea9fdfc2ee67, + 0x11688acf9ccdfaa0, + 0x1a8190d86a9836b9, + 0x7acbd93bc615c795, + 0xc7332c3a286080ca, + 0x863445e94ee87d50, + 0xf6966a5fd0d6de85, + 0xe9ad814f96d5da1c, + 0x70a22fb69e3ea3d5, + 0x0a69f68d582b6440, + 0xb8428ec9c2ee757f, + 0x604a49e3ac8df12c, + 0x5b86f90b0c10cb23, + 0xe1d9b2eb8f02f3ee, + 0x29391394d3d22544, + 0xc8e0a17f5cd0d6aa, + 0xb58cc6a5f7a26ead, + 0x8193fb08238f02c2, + 0xd5c68f465b2f9f81, + 0xfcff9cd288fdbac5, + 0x77059157f359dc47, + 0x1d262e3907ff492b, + 0xfb582233e59ac557, + 0xddb2bce242f8b673, + 0x2577b76248e096cf, + 0x6f99c4a6d83da74c, + 0xc1147e41eb795701, + 0xf48baf76912a9337, + }, + { + 0x45b268a93acde4cc, + 0xaf7f0be884549d08, + 0x048354b3c1468263, + 0x925435c2c80efed2, + 0xee4e37f27fdffba7, + 0x167a33920c60f14d, + 0xfb123b52ea03e584, + 0x4a0cab53fdbb9007, + 0x9deaf6380f788a19, + 0xcb48ec558f0cb32a, + 0xb59dc4b2d6fef7e0, + 0xdcdbca22f4f3ecb6, + 0x11df5813549a9c40, + 0xe33fdedf568aced3, + 0xa0c1c8124322e9c3, + 0x07a56b8158fa6d0d, + 0x77279579b1e1f3dd, + 0xd9b18b74422ac004, + 0xb8ec2d9fffabc294, + 0xf4acf8a82d75914f, + 0x7bbf69b1ef2b6878, + 0xc4f62faf487ac7e1, + 0x76ce809cc67e5d0c, + 0x6711d88f92e4c14c, + 0x627b99d9243dedfe, + 0x234aa5c3dfb68b51, + 0x909b1f15262dbf6d, + 0x4f66ea054b62bcb5, + 0x1ae2cf5a52aa6ae8, + 0xbea053fbd0ce0148, + 0xed6808c0e66314c9, + 0x43fe16cd15a82710, + 0xcd049231a06970f6, + 0xe7bc8a6c97cc4cb0, + 0x337ce835fcb3b9c0, + 0x65def2587cc780f3, + 0x52214ede4132bb50, + 0x95f15e4390f493df, + 0x870839625dd2e0f1, + 0x41313c1afb8b66af, + 0x91720af051b211bc, + 0x477d427ed4eea573, + 0x2e3b4ceef6e3be25, + 0x82627834eb0bcc43, + 0x9c03e3dd78e724c8, + 0x2877328ad9867df9, + 0x14b51945e243b0f2, + 0x574b0f88f7eb97e2, + 0x88b6fa989aa4943a, + 0x19c4f068cb168586, + 0x50ee6409af11faef, + 0x7df317d5c04eaba4, + 0x7a567c5498b4c6a9, + 0xb6bbfb804f42188e, + 0x3cc22bcf3bc5cd0b, + 0xd04336eaaa397713, + 0xf02fac1bec33132c, + 0x2506dba7f0d3488d, + 0xd7e65d6bf2c31a1e, + 0x5eb9b2161ff820f5, + 0x842e0650c46e0f9f, + 0x716beb1d9e843001, + 0xa933758cab315ed4, + 0x3fe414fda2792265, + 0x27c9f1701ef00932, + 0x73a4c1ca70a771be, + 0x94184ba6e76b3d0e, + 0x40d829ff8c14c87e, + 0x0fbec3fac77674cb, + 0x3616a9634a6a9572, + 0x8f139119c25ef937, + 0xf545ed4d5aea3f9e, + 0xe802499650ba387b, + 0x6437e7bd0b582e22, + 0xe6559f89e053e261, + 0x80ad52e305288dfc, + 0x6dc55a23e34b9935, + 0xde14e0f51ad0ad09, + 0xc6390578a659865e, + 0x96d7617109487cb1, + 0xe2d6cb3a21156002, + 0x01e915e5779faed1, + 0xadb0213f6a77dcb7, + 0x9880b76eb9a1a6ab, + 0x5d9f8d248644cf9b, + 0xfd5e4536c5662658, + 0xf1c6b9fe9bacbdfd, + 0xeacd6341be9979c4, + 0xefa7221708405576, + 0x510771ecd88e543e, + 0xc2ba51cb671f043d, + 0x0ad482ac71af5879, + 0xfe787a045cdac936, + 0xb238af338e049aed, + 0xbd866cc94972ee26, + 0x615da6ebbd810290, + 0x3295fdd08b2c1711, + 0xf834046073bf0aea, + 0xf3099329758ffc42, + 0x1caeb13e7dcfa934, + 0xba2307481188832b, + 0x24efce42874ce65c, + 0x0e57d61fb0e9da1a, + 0xb3d1bad6f99b343c, + 0xc0757b1c893c4582, + 0x2b510db8403a9297, + 0x5c7698c1f1db614a, + 0x3e0d0118d5e68cb4, + 0xd60f488e855cb4cf, + 0xae961e0df3cb33d9, + 0x3a8e55ab14a00ed7, + 0x42170328623789c1, + 0x838b6dd19c946292, + 0x895fef7ded3b3aeb, + 0xcfcbb8e64e4a3149, + 0x064c7e642f65c3dc, + 0x3d2b3e2a4c5a63da, + 0x5bd3f340a9210c47, + 0xb474d157a1615931, + 0xac5934da1de87266, + 0x6ee365117af7765b, + 0xc86ed36716b05c44, + 0x9ba6885c201d49c5, + 0xb905387a88346c45, + 0x131072c4bab9ddff, + 0xbf49461ea751af99, + 0xd52977bc1ce05ba1, + 0xb0f785e46027db52, + 0x546d30ba6e57788c, + 0x305ad707650f56ae, + 0xc987c682612ff295, + 0xa5ab8944f5fbc571, + 0x7ed528e759f244ca, + 0x8ddcbbce2c7db888, + 0xaa154abe328db1ba, + 0x1e619be993ece88b, + 0x09f2bd9ee813b717, + 0x7401aa4b285d1cb3, + 0x21858f143195caee, + 0x48c381841398d1b8, + 0xfcb750d3b2f98889, + 0x39a86a998d1ce1b9, + 0x1f888e0ce473465a, + 0x7899568376978716, + 0x02cf2ad7ee2341bf, + 0x85c713b5b3f1a14e, + 0xff916fe12b4567e7, + 0x7c1a0230b7d10575, + 0x0c98fcc85eca9ba5, + 0xa3e7f720da9e06ad, + 0x6a6031a2bbb1f438, + 0x973e74947ed7d260, + 0x2cf4663918c0ff9a, + 0x5f50a7f368678e24, + 0x34d983b4a449d4cd, + 0x68af1b755592b587, + 0x7f3c3d022e6dea1b, + 0xabfc5f5b45121f6b, + 0x0d71e92d29553574, + 0xdffdf5106d4f03d8, + 0x081ba87b9f8c19c6, + 0xdb7ea1a3ac0981bb, + 0xbbca12ad66172dfa, + 0x79704366010829c7, + 0x179326777bff5f9c, + 0x0000000000000000, + 0xeb2476a4c906d715, + 0x724dd42f0738df6f, + 0xb752ee6538ddb65f, + 0x37ffbc863df53ba3, + 0x8efa84fcb5c157e6, + 0xe9eb5c73272596aa, + 0x1b0bdabf2535c439, + 0x86e12c872a4d4e20, + 0x9969a28bce3e087a, + 0xfafb2eb79d9c4b55, + 0x056a4156b6d92cb2, + 0x5a3ae6a5debea296, + 0x22a3b026a8292580, + 0x53c85b3b36ad1581, + 0xb11e900117b87583, + 0xc51f3a4a3fe56930, + 0xe019e1edcf3621bd, + 0xec811d2591fcba18, + 0x445b7d4c4d524a1d, + 0xa8da6069dcaef005, + 0x58f5cc72309de329, + 0xd4c062596b7ff570, + 0xce22ad0339d59f98, + 0x591cd99747024df8, + 0x8b90c5aa03187b54, + 0xf663d27fc356d0f0, + 0xd8589e9135b56ed5, + 0x35309651d3d67a1c, + 0x12f96721cd26732e, + 0xd28c1c3d441a36ac, + 0x492a946164077f69, + 0x2d1d73dc6f5f514b, + 0x6f0a70f40d68d88a, + 0x60b4b30eca1eac41, + 0xd36509d83385987d, + 0x0b3d97490630f6a8, + 0x9eccc90a96c46577, + 0xa20ee2c5ad01a87c, + 0xe49ab55e0e70a3de, + 0xa4429ca182646ba0, + 0xda97b446db962f6a, + 0xcced87d4d7f6de27, + 0x2ab8185d37a53c46, + 0x9f25dcefe15bcba6, + 0xc19c6ef9fea3eb53, + 0xa764a3931bd884ce, + 0x2fd2590b817c10f4, + 0x56a21a6d80743933, + 0xe573a0bb79ef0d0f, + 0x155c0ca095dc1e23, + 0x6c2c4fc694d437e4, + 0x10364df623053291, + 0xdd32dfc7836c4267, + 0x03263f3299bcef6e, + 0x66f8cd6ae57b6f9d, + 0x8c35ae2b5be21659, + 0x31b3c2e21290f87f, + 0x93bd2027bf915003, + 0x69460e90220d1b56, + 0x299e276fae19d328, + 0x63928c3c53a2432f, + 0x7082fef8e91b9ed0, + 0xbc6f792c3eed40f7, + 0x4c40d537d2de53db, + 0x75e8bfae5fc2b262, + 0x4da9c0d2a541fd0a, + 0x4e8fffe03cfd1264, + 0x2620e495696fa7e3, + 0xe1f0f408b8a98f6c, + 0xd1aa230fdda6d9c2, + 0xc7d0109dd1c6288f, + 0x8a79d04f7487d585, + 0x4694579ba3710ba2, + 0x38417f7cfa834f68, + 0x1d47a4db0a5007e5, + 0x206c9af1460a643f, + 0xa128ddf734bd4712, + 0x8144470672b7232d, + 0xf2e086cc02105293, + 0x182de58dbc892b57, + 0xcaa1f9b0f8931dfb, + 0x6b892447cc2e5ae9, + 0xf9dd11850420a43b, + 0x4be5beb68a243ed6, + 0x5584255f19c8d65d, + 0x3b67404e633fa006, + 0xa68db6766c472a1f, + 0xf78ac79ab4c97e21, + 0xc353442e1080aaec, + 0x9a4f9db95782e714, + }, + { + 0xc811a8058c3f55de, + 0x65f5b43196b50619, + 0xf74f96b1d6706e43, + 0x859d1e8bcb43d336, + 0x5aab8a85ccfa3d84, + 0xf9c7bf99c295fcfd, + 0xa21fd5a1de4b630f, + 0xcdb3ef763b8b456d, + 0x803f59f87cf7c385, + 0xb27c73be5f31913c, + 0x98e3ac6633b04821, + 0xbf61674c26b8f818, + 0x0ffbc995c4c130c8, + 0xaaa0862010761a98, + 0x6057f342210116aa, + 0xf63c760c0654cc35, + 0x2ddb45cc667d9042, + 0xbcf45a964bd40382, + 0x68e8a0c3ef3c6f3d, + 0xa7bd92d269ff73bc, + 0x290ae20201ed2287, + 0xb7de34cde885818f, + 0xd901eea7dd61059b, + 0xd6fa273219a03553, + 0xd56f1ae874cccec9, + 0xea31245c2e83f554, + 0x7034555da07be499, + 0xce26d2ac56e7bef7, + 0xfd161857a5054e38, + 0x6a0e7da4527436d1, + 0x5bd86a381cde9ff2, + 0xcaf7756231770c32, + 0xb09aaed9e279c8d0, + 0x5def1091c60674db, + 0x111046a2515e5045, + 0x23536ce4729802fc, + 0xc50cbcf7f5b63cfa, + 0x73a16887cd171f03, + 0x7d2941afd9f28dbd, + 0x3f5e3eb45a4f3b9d, + 0x84eefe361b677140, + 0x3db8e3d3e7076271, + 0x1a3a28f9f20fd248, + 0x7ebc7c75b49e7627, + 0x74e5f293c7eb565c, + 0x18dcf59e4f478ba4, + 0x0c6ef44fa9adcb52, + 0xc699812d98dac760, + 0x788b06dc6e469d0e, + 0xfc65f8ea7521ec4e, + 0x30a5f7219e8e0b55, + 0x2bec3f65bca57b6b, + 0xddd04969baf1b75e, + 0x99904cdbe394ea57, + 0x14b201d1e6ea40f6, + 0xbbb0c08241284add, + 0x50f20463bf8f1dff, + 0xe8d7f93b93cbacb8, + 0x4d8cb68e477c86e8, + 0xc1dd1b3992268e3f, + 0x7c5aa11209d62fcb, + 0x2f3d98abdb35c9ae, + 0x671369562bfd5ff5, + 0x15c1e16c36cee280, + 0x1d7eb2edf8f39b17, + 0xda94d37db00dfe01, + 0x877bc3ec760b8ada, + 0xcb8495dfe153ae44, + 0x05a24773b7b410b3, + 0x12857b783c32abdf, + 0x8eb770d06812513b, + 0x536739b9d2e3e665, + 0x584d57e271b26468, + 0xd789c78fc9849725, + 0xa935bbfa7d1ae102, + 0x8b1537a3dfa64188, + 0xd0cd5d9bc378de7a, + 0x4ac82c9a4d80cfb7, + 0x42777f1b83bdb620, + 0x72d2883a1d33bd75, + 0x5e7a2d4bab6a8f41, + 0xf4daab6bbb1c95d9, + 0x905cffe7fd8d31b6, + 0x83aa6422119b381f, + 0xc0aefb8442022c49, + 0xa0f908c663033ae3, + 0xa428af0804938826, + 0xade41c341a8a53c7, + 0xae7121ee77e6a85d, + 0xc47f5c4a25929e8c, + 0xb538e9aa55cdd863, + 0x06377aa9dad8eb29, + 0xa18ae87bb3279895, + 0x6edfda6a35e48414, + 0x6b7d9d19825094a7, + 0xd41cfa55a4e86cbf, + 0xe5caedc9ea42c59c, + 0xa36c351c0e6fc179, + 0x5181e4de6fabbf89, + 0xfff0c530184d17d4, + 0x9d41eb1584045892, + 0x1c0d525028d73961, + 0xf178ec180ca8856a, + 0x9a0571018ef811cd, + 0x4091a27c3ef5efcc, + 0x19af15239f6329d2, + 0x347450eff91eb990, + 0xe11b4a078dd27759, + 0xb9561de5fc601331, + 0x912f1f5a2da993c0, + 0x1654dcb65ba2191a, + 0x3e2dde098a6b99eb, + 0x8a66d71e0f82e3fe, + 0x8c51adb7d55a08d7, + 0x4533e50f8941ff7f, + 0x02e6dd67bd4859ec, + 0xe068aaba5df6d52f, + 0xc24826e3ff4a75a5, + 0x6c39070d88acddf8, + 0x6486548c4691a46f, + 0xd1bebd26135c7c0c, + 0xb30f93038f15334a, + 0x82d9849fc1bf9a69, + 0x9c320ba85420fae4, + 0xfa528243aff90767, + 0x9ed4d6cfe968a308, + 0xb825fd582c44b147, + 0x9b7691bc5edcb3bb, + 0xc7ea619048fe6516, + 0x1063a61f817af233, + 0x47d538683409a693, + 0x63c2ce984c6ded30, + 0x2a9fdfd86c81d91d, + 0x7b1e3b06032a6694, + 0x666089ebfbd9fd83, + 0x0a598ee67375207b, + 0x07449a140afc495f, + 0x2ca8a571b6593234, + 0x1f986f8a45bbc2fb, + 0x381aa4a050b372c2, + 0x5423a3add81faf3a, + 0x17273c0b8b86bb6c, + 0xfe83258dc869b5a2, + 0x287902bfd1c980f1, + 0xf5a94bd66b3837af, + 0x88800a79b2caba12, + 0x55504310083b0d4c, + 0xdf36940e07b9eeb2, + 0x04d1a7ce6790b2c5, + 0x612413fff125b4dc, + 0x26f12b97c52c124f, + 0x86082351a62f28ac, + 0xef93632f9937e5e7, + 0x3507b052293a1be6, + 0xe72c30ae570a9c70, + 0xd3586041ae1425e0, + 0xde4574b3d79d4cc4, + 0x92ba228040c5685a, + 0xf00b0ca5dc8c271c, + 0xbe1287f1f69c5a6e, + 0xf39e317fb1e0dc86, + 0x495d114020ec342d, + 0x699b407e3f18cd4b, + 0xdca3a9d46ad51528, + 0x0d1d14f279896924, + 0x0000000000000000, + 0x593eb75fa196c61e, + 0x2e4e78160b116bd8, + 0x6d4ae7b058887f8e, + 0xe65fd013872e3e06, + 0x7a6ddbbbd30ec4e2, + 0xac97fc89caaef1b1, + 0x09ccb33c1e19dbe1, + 0x89f3eac462ee1864, + 0x7770cf49aa87adc6, + 0x56c57eca6557f6d6, + 0x03953dda6d6cfb9a, + 0x36928d884456e07c, + 0x1eeb8f37959f608d, + 0x31d6179c4eaaa923, + 0x6fac3ad7e5c02662, + 0x43049fa653991456, + 0xabd3669dc052b8ee, + 0xaf02c153a7c20a2b, + 0x3ccb036e3723c007, + 0x93c9c23d90e1ca2c, + 0xc33bc65e2f6ed7d3, + 0x4cff56339758249e, + 0xb1e94e64325d6aa6, + 0x37e16d359472420a, + 0x79f8e661be623f78, + 0x5214d90402c74413, + 0x482ef1fdf0c8965b, + 0x13f69bc5ec1609a9, + 0x0e88292814e592be, + 0x4e198b542a107d72, + 0xccc00fcbebafe71b, + 0x1b49c844222b703e, + 0x2564164da840e9d5, + 0x20c6513e1ff4f966, + 0xbac3203f910ce8ab, + 0xf2edd1c261c47ef0, + 0x814cb945acd361f3, + 0x95feb8944a392105, + 0x5c9cf02c1622d6ad, + 0x971865f3f77178e9, + 0xbd87ba2b9bf0a1f4, + 0x444005b259655d09, + 0xed75be48247fbc0b, + 0x7596122e17cff42a, + 0xb44b091785e97a15, + 0x966b854e2755da9f, + 0xeee0839249134791, + 0x32432a4623c652b9, + 0xa8465b47ad3e4374, + 0xf8b45f2412b15e8b, + 0x2417f6f078644ba3, + 0xfb2162fe7fdda511, + 0x4bbbcc279da46dc1, + 0x0173e0bdd024a276, + 0x22208c59a2bca08a, + 0x8fc4906db836f34d, + 0xe4b90d743a6667ea, + 0x7147b5e0705f46ef, + 0x2782cb2a1508b039, + 0xec065ef5f45b1e7d, + 0x21b5b183cfd05b10, + 0xdbe733c060295c77, + 0x9fa73672394c017e, + 0xcf55321186c31c81, + 0xd8720e1a0d45a7ed, + 0x3b8f997a3ddf8958, + 0x3afc79c7edfb2b2e, + 0xe9a4198643ef0ece, + 0x5f09cdf67b4e2d37, + 0x4f6a6be9fa34df04, + 0xb6add47038a123f9, + 0x8d224d0a057eaaa1, + 0xc96248b85c1bf7a8, + 0xe3fd9760309a2eb5, + 0x0b2a6e5ba351820d, + 0xeb42c4e1fea75722, + 0x948d58299a1d8373, + 0x7fcf9cc864bad451, + 0xa55b4fb5d4b72a50, + 0x08bf5381ce3d7997, + 0x46a6d8d5e42d04e5, + 0xd22b80fc7e308796, + 0x57b69e77b57354a0, + 0x3969441d8097d0b4, + 0x3330cafbf3e2f0cf, + 0xe28e77dde0be8cc3, + 0x62b12e259c494f46, + 0xa6ce726fb9dbd1ca, + 0x41e242c1eed14dba, + 0x76032ff47aa30fb0, + }, + { + 0xe6f87e5c5b711fd0, + 0x258377800924fa16, + 0xc849e07e852ea4a8, + 0x5b4686a18f06c16a, + 0x0b32e9a2d77b416e, + 0xabda37a467815c66, + 0xf61796a81a686676, + 0xf5dc0b706391954b, + 0x4862f38db7e64bf1, + 0xff5c629a68bd85c5, + 0xcb827da6fcd75795, + 0x66d36daf69b9f089, + 0x356c9f74483d83b0, + 0x7cbcecb1238c99a1, + 0x36a702ac31c4708d, + 0x9eb6a8d02fbcdfd6, + 0x8b19fa51e5b3ae37, + 0x9ccfb5408a127d0b, + 0xbc0c78b508208f5a, + 0xe533e3842288eced, + 0xcec2c7d377c15fd2, + 0xec7817b6505d0f5e, + 0xb94cc2c08336871d, + 0x8c205db4cb0b04ad, + 0x763c855b28a0892f, + 0x588d1b79f6ff3257, + 0x3fecf69e4311933e, + 0x0fc0d39f803a18c9, + 0xee010a26f5f3ad83, + 0x10efe8f4411979a6, + 0x5dcda10c7de93a10, + 0x4a1bee1d1248e92c, + 0x53bff2db21847339, + 0xb4f50ccfa6a23d09, + 0x5fb4bc9cd84798cd, + 0xe88a2d8b071c56f9, + 0x7f7771695a756a9c, + 0xc5f02e71a0ba1ebc, + 0xa663f9ab4215e672, + 0x2eb19e22de5fbb78, + 0x0db9ce0f2594ba14, + 0x82520e6397664d84, + 0x2f031e6a0208ea98, + 0x5c7f2144a1be6bf0, + 0x7a37cb1cd16362db, + 0x83e08e2b4b311c64, + 0xcf70479bab960e32, + 0x856ba986b9dee71e, + 0xb5478c877af56ce9, + 0xb8fe42885f61d6fd, + 0x1bdd0156966238c8, + 0x622157923ef8a92e, + 0xfc97ff42114476f8, + 0x9d7d350856452ceb, + 0x4c90c9b0e0a71256, + 0x2308502dfbcb016c, + 0x2d7a03faa7a64845, + 0xf46e8b38bfc6c4ab, + 0xbdbef8fdd477deba, + 0x3aac4cebc8079b79, + 0xf09cb105e8879d0c, + 0x27fa6a10ac8a58cb, + 0x8960e7c1401d0cea, + 0x1a6f811e4a356928, + 0x90c4fb0773d196ff, + 0x43501a2f609d0a9f, + 0xf7a516e0c63f3796, + 0x1ce4a6b3b8da9252, + 0x1324752c38e08a9b, + 0xa5a864733bec154f, + 0x2bf124575549b33f, + 0xd766db15440dc5c7, + 0xa7d179e39e42b792, + 0xdadf151a61997fd3, + 0x86a0345ec0271423, + 0x38d5517b6da939a4, + 0x6518f077104003b4, + 0x02791d90a5aea2dd, + 0x88d267899c4a5d0a, + 0x930f66df0a2865c2, + 0x4ee9d4204509b08b, + 0x325538916685292a, + 0x412907bfc533a842, + 0xb27e2b62544dc673, + 0x6c5304456295e007, + 0x5af406e95351908a, + 0x1f2f3b6bc123616f, + 0xc37b09dc5255e5c6, + 0x3967d133b1fe6844, + 0x298839c7f0e711e2, + 0x409b87f71964f9a2, + 0xe938adc3db4b0719, + 0x0c0b4e47f9c3ebf4, + 0x5534d576d36b8843, + 0x4610a05aeb8b02d8, + 0x20c3cdf58232f251, + 0x6de1840dbec2b1e7, + 0xa0e8de06b0fa1d08, + 0x7b854b540d34333b, + 0x42e29a67bcca5b7f, + 0xd8a6088ac437dd0e, + 0xc63bb3a9d943ed81, + 0x21714dbd5e65a3b1, + 0x6761ede7b5eea169, + 0x2431f7c8d573abf6, + 0xd51fc685e1a3671a, + 0x5e063cd40410c92d, + 0x283ab98f2cb04002, + 0x8febc06cb2f2f790, + 0x17d64f116fa1d33c, + 0xe07359f1a99ee4aa, + 0x784ed68c74cdc006, + 0x6e2a19d5c73b42da, + 0x8712b4161c7045c3, + 0x371582e4ed93216d, + 0xace390414939f6fc, + 0x7ec5f12186223b7c, + 0xc0b094042bac16fb, + 0xf9d745379a527ebf, + 0x737c3f2ea3b68168, + 0x33e7b8d9bad278ca, + 0xa9a32a34c22ffebb, + 0xe48163ccfedfbd0d, + 0x8e5940246ea5a670, + 0x51c6ef4b842ad1e4, + 0x22bad065279c508c, + 0xd91488c218608cee, + 0x319ea5491f7cda17, + 0xd394e128134c9c60, + 0x094bf43272d5e3b3, + 0x9bf612a5a4aad791, + 0xccbbda43d26ffd0f, + 0x34de1f3c946ad250, + 0x4f5b5468995ee16b, + 0xdf9faf6fea8f7794, + 0x2648ea5870dd092b, + 0xbfc7e56d71d97c67, + 0xdde6b2ff4f21d549, + 0x3c276b463ae86003, + 0x91767b4faf86c71f, + 0x68a13e7835d4b9a0, + 0xb68c115f030c9fd4, + 0x141dd2c916582001, + 0x983d8f7ddd5324ac, + 0x64aa703fcc175254, + 0xc2c989948e02b426, + 0x3e5e76d69f46c2de, + 0x50746f03587d8004, + 0x45db3d829272f1e5, + 0x60584a029b560bf3, + 0xfbae58a73ffcdc62, + 0xa15a5e4e6cad4ce8, + 0x4ba96e55ce1fb8cc, + 0x08f9747aae82b253, + 0xc102144cf7fb471b, + 0x9f042898f3eb8e36, + 0x068b27adf2effb7a, + 0xedca97fe8c0a5ebe, + 0x778e0513f4f7d8cf, + 0x302c2501c32b8bf7, + 0x8d92ddfc175c554d, + 0xf865c57f46052f5f, + 0xeaf3301ba2b2f424, + 0xaa68b7ecbbd60d86, + 0x998f0f350104754c, + 0x0000000000000000, + 0xf12e314d34d0ccec, + 0x710522be061823b5, + 0xaf280d9930c005c1, + 0x97fd5ce25d693c65, + 0x19a41cc633cc9a15, + 0x95844172f8c79eb8, + 0xdc5432b7937684a9, + 0x9436c13a2490cf58, + 0x802b13f332c8ef59, + 0xc442ae397ced4f5c, + 0xfa1cd8efe3ab8d82, + 0xf2e5ac954d293fd1, + 0x6ad823e8907a1b7d, + 0x4d2249f83cf043b6, + 0x03cb9dd879f9f33d, + 0xde2d2f2736d82674, + 0x2a43a41f891ee2df, + 0x6f98999d1b6c133a, + 0xd4ad46cd3df436fa, + 0xbb35df50269825c0, + 0x964fdcaa813e6d85, + 0xeb41b0537ee5a5c4, + 0x0540ba758b160847, + 0xa41ae43be7bb44af, + 0xe3b8c429d0671797, + 0x819993bbee9fbeb9, + 0xae9a8dd1ec975421, + 0xf3572cdd917e6e31, + 0x6393d7dae2aff8ce, + 0x47a2201237dc5338, + 0xa32343dec903ee35, + 0x79fc56c4a89a91e6, + 0x01b28048dc5751e0, + 0x1296f564e4b7db7b, + 0x75f7188351597a12, + 0xdb6d9552bdce2e33, + 0x1e9dbb231d74308f, + 0x520d7293fdd322d9, + 0xe20a44610c304677, + 0xfeeee2d2b4ead425, + 0xca30fdee20800675, + 0x61eaca4a47015a13, + 0xe74afe1487264e30, + 0x2cc883b27bf119a5, + 0x1664cf59b3f682dc, + 0xa811aa7c1e78af5b, + 0x1d5626fb648dc3b2, + 0xb73e9117df5bce34, + 0xd05f7cf06ab56f5d, + 0xfd257f0acd132718, + 0x574dc8e676c52a9e, + 0x0739a7e52eb8aa9a, + 0x5486553e0f3cd9a3, + 0x56ff48aeaa927b7e, + 0xbe756525ad8e2d87, + 0x7d0e6cf9ffdbc841, + 0x3b1ecca31450ca99, + 0x6913be30e983e840, + 0xad511009956ea71c, + 0xb1b5b6ba2db4354e, + 0x4469bdca4e25a005, + 0x15af5281ca0f71e1, + 0x744598cb8d0e2bf2, + 0x593f9b312aa863b7, + 0xefb38a6e29a4fc63, + 0x6b6aa3a04c2d4a9d, + 0x3d95eb0ee6bf31e3, + 0xa291c3961554bfd5, + 0x18169c8eef9bcbf5, + 0x115d68bc9d4e2846, + 0xba875f18facf7420, + 0xd1edfcb8b6e23ebd, + 0xb00736f2f1e364ae, + 0x84d929ce6589b6fe, + 0x70b7a2f6da4f7255, + 0x0e7253d75c6d4929, + 0x04f23a3d574159a7, + 0x0a8069ea0b2c108e, + 0x49d073c56bb11a11, + 0x8aab7a1939e4ffd7, + 0xcd095a0b0e38acef, + 0xc9fb60365979f548, + 0x92bde697d67f3422, + 0xc78933e10514bc61, + 0xe1c1d9b975c9b54a, + 0xd2266160cf1bcd80, + 0x9a4492ed78fd8671, + 0xb3ccab2a881a9793, + 0x72cebf667fe1d088, + 0xd6d45b5d985a9427, + }, +}; + +__constant u64 sbob_rc64[12][8] = +{ + { + 0xe9daca1eda5b08b1, + 0x1f7c65c0812fcbeb, + 0x16d0452e43766a2f, + 0xfcc485758db84e71, + 0x0169679291e07c4b, + 0x15d360a4082a42a2, + 0x234d74cc36747605, + 0x0745a6f2596580dd, + }, + { + 0x1a2f9da98ab5a36f, + 0xd7b5700f469de34f, + 0x982b230a72eafef3, + 0x3101b5160f5ed561, + 0x5899d6126b17b59a, + 0xcaa70adbc261b55c, + 0x56cdcbd71ba2dd55, + 0xb79bb121700479e6, + }, + { + 0xc72fce2bacdc74f5, + 0x35843d6a28fc390a, + 0x8b1f9c525f5ef106, + 0x7b7b29b11475eaf2, + 0xb19e3590e40fe2d3, + 0x09db6260373ac9c1, + 0x31db7a8643f4b6c2, + 0xb20aba0af5961e99, + }, + { + 0xd26615e8b3df1fef, + 0xdde4715da0e148f9, + 0x7d3c5c337e858e48, + 0x3f355e68ad1c729d, + 0x75d603ed822cd7a9, + 0xbe0352933313b7d8, + 0xf137e893a1ea5334, + 0x2ed1e384bcbe0c22, + }, + { + 0x994747adac6bea4b, + 0x6323a96c0c413f9a, + 0x4a1086161f1c157f, + 0xbdff0f80d7359e35, + 0xa3f53a254717cdbf, + 0x161a2723b700ffdf, + 0xf563eaa97ea2567a, + 0x57fe6c7cfd581760, + }, + { + 0xd9d33a1daeae4fae, + 0xc039307a3bc3a46f, + 0x6ca44251f9c4662d, + 0xc68ef09ab49a7f18, + 0xb4b79a1cb7a6facf, + 0xb6c6bec2661ff20a, + 0x354f903672c571bf, + 0x6e7d64467a4068fa, + }, + { + 0xecc5aaee160ec7f4, + 0x540924bffe86ac51, + 0xc987bfe6c7c69e39, + 0xc9937a19333e47d3, + 0x372c822dc5ab9209, + 0x04054a2883694706, + 0xf34a3ca24c451735, + 0x93d4143a4d568688, + }, + { + 0xa7c9934d425b1f9b, + 0x41416e0c02aae703, + 0x1ede369c71f8b74e, + 0x9ac4db4d3b44b489, + 0x90069b92cb2b89f4, + 0x2fc4a5d12b8dd169, + 0xd9a8515935c2ac36, + 0x1ee702bfd40d7fa4, + }, + { + 0x9b223116545a8f37, + 0xde5f16ecd89a4c94, + 0x244289251b3a7d3a, + 0x84090de0b755d93c, + 0xb1ceb2db0b440a80, + 0x549c07a69a8a2b7b, + 0x602a1fcb92dc380e, + 0xdb5a238351446172, + }, + { + 0x526f0580a6debeab, + 0xf3f3e4b248e52a38, + 0xdb788aff1ce74189, + 0x0361331b8ae1ff1f, + 0x4b3369af0267e79f, + 0xf452763b306c1e7a, + 0xc3b63b15d1fa9836, + 0xed9c4598fbc7b474, + }, + { + 0xfb89c8efd09ecd7b, + 0x94fe5a63cdc60230, + 0x6107abebbb6bfad8, + 0x7966841421800120, + 0xcab948eaef711d8a, + 0x986e477d1dcdbaef, + 0x5dd86fc04a59a2de, + 0x1b2df381cda4ca6b, + }, + { + 0xba3116f167e78e37, + 0x7ab14904b08013d2, + 0x771ddfbc323ca4cd, + 0x9b9f2130d41220f8, + 0x86cc91189def805d, + 0x5228e188aaa41de7, + 0x991bb2d9d517f4fa, + 0x20d71bf14a92bc48, + }, +}; + +static void streebog_g (u64 h[8], const u64 m[8], __local u64 s_sbob_sl64[8][256]) +{ + u64 k[8]; + u64 s[8]; + u64 t[8]; + + #pragma unroll + for (int i = 0; i < 8; i++) + { + t[i] = h[i]; + } + + for (int i = 0; i < 8; i++) + { + k[i] = SBOG_LPSti64; + } + + #pragma unroll + for (int i = 0; i < 8; i++) + { + s[i] = m[i]; + } + + for (int r = 0; r < 12; r++) + { + #pragma unroll + for (int i = 0; i < 8; i++) + { + t[i] = s[i] ^ k[i]; + } + + #pragma unroll + for (int i = 0; i < 8; i++) + { + s[i] = SBOG_LPSti64; + } + + for (int i = 0; i < 8; i++) + { + t[i] = k[i] ^ sbob_rc64[r][i]; + } + + #pragma unroll + for (int i = 0; i < 8; i++) + { + k[i] = SBOG_LPSti64; + } + } + + #pragma unroll + for (int i = 0; i < 8; i++) + { + h[i] ^= s[i] ^ k[i] ^ m[i]; + } +} + +static void m11700m (__local u64 s_sbob_sl64[8][256], u32x w[16], const u32 pw_len, __global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset) +{ + /** + * modifier + */ + + const u32 gid = get_global_id (0); + const u32 lid = get_local_id (0); + + /** + * loop + */ + + u32x w0l = w[0]; + + for (u32 il_pos = 0; il_pos < bfs_cnt; il_pos++) + { + const u32 w0r = bfs_buf[il_pos].i; + + w[0] = w0l | w0r; + + /** + * reverse message block + */ + + u64 m[8]; + + m[0] = hl32_to_64 (w[15], w[14]); + m[1] = hl32_to_64 (w[13], w[12]); + m[2] = hl32_to_64 (w[11], w[10]); + m[3] = hl32_to_64 (w[ 9], w[ 8]); + m[4] = hl32_to_64 (w[ 7], w[ 6]); + m[5] = hl32_to_64 (w[ 5], w[ 4]); + m[6] = hl32_to_64 (w[ 3], w[ 2]); + m[7] = hl32_to_64 (w[ 1], w[ 0]); + + m[0] = swap_workaround (m[0]); + m[1] = swap_workaround (m[1]); + m[2] = swap_workaround (m[2]); + m[3] = swap_workaround (m[3]); + m[4] = swap_workaround (m[4]); + m[5] = swap_workaround (m[5]); + m[6] = swap_workaround (m[6]); + m[7] = swap_workaround (m[7]); + + // state buffer (hash) + + u64 h[8]; + + h[0] = INITVAL; + h[1] = INITVAL; + h[2] = INITVAL; + h[3] = INITVAL; + h[4] = INITVAL; + h[5] = INITVAL; + h[6] = INITVAL; + h[7] = INITVAL; + + streebog_g (h, m, s_sbob_sl64); + + u64 z[8]; + + z[0] = 0; + z[1] = 0; + z[2] = 0; + z[3] = 0; + z[4] = 0; + z[5] = 0; + z[6] = 0; + z[7] = swap_workaround ((u64) (pw_len * 8)); + + streebog_g (h, z, s_sbob_sl64); + streebog_g (h, m, s_sbob_sl64); + + const u32 r0 = l32_from_64 (h[0]); + const u32 r1 = h32_from_64 (h[0]); + const u32 r2 = l32_from_64 (h[1]); + const u32 r3 = h32_from_64 (h[1]); + + #include VECT_COMPARE_M + } +} + +static void m11700s (__local u64 s_sbob_sl64[8][256], u32x w[16], const u32 pw_len, __global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset) +{ + /** + * modifier + */ + + const u32 gid = get_global_id (0); + const u32 lid = get_local_id (0); + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * loop + */ + + u32x w0l = w[0]; + + for (u32 il_pos = 0; il_pos < bfs_cnt; il_pos++) + { + const u32 w0r = bfs_buf[il_pos].i; + + w[0] = w0l | w0r; + + /** + * reverse message block + */ + + u64 m[8]; + + m[0] = hl32_to_64 (w[15], w[14]); + m[1] = hl32_to_64 (w[13], w[12]); + m[2] = hl32_to_64 (w[11], w[10]); + m[3] = hl32_to_64 (w[ 9], w[ 8]); + m[4] = hl32_to_64 (w[ 7], w[ 6]); + m[5] = hl32_to_64 (w[ 5], w[ 4]); + m[6] = hl32_to_64 (w[ 3], w[ 2]); + m[7] = hl32_to_64 (w[ 1], w[ 0]); + + m[0] = swap_workaround (m[0]); + m[1] = swap_workaround (m[1]); + m[2] = swap_workaround (m[2]); + m[3] = swap_workaround (m[3]); + m[4] = swap_workaround (m[4]); + m[5] = swap_workaround (m[5]); + m[6] = swap_workaround (m[6]); + m[7] = swap_workaround (m[7]); + + // state buffer (hash) + + u64 h[8]; + + h[0] = INITVAL; + h[1] = INITVAL; + h[2] = INITVAL; + h[3] = INITVAL; + h[4] = INITVAL; + h[5] = INITVAL; + h[6] = INITVAL; + h[7] = INITVAL; + + streebog_g (h, m, s_sbob_sl64); + + u64 z[8]; + + z[0] = 0; + z[1] = 0; + z[2] = 0; + z[3] = 0; + z[4] = 0; + z[5] = 0; + z[6] = 0; + z[7] = swap_workaround ((u64) (pw_len * 8)); + + streebog_g (h, z, s_sbob_sl64); + streebog_g (h, m, s_sbob_sl64); + + const u32 r0 = l32_from_64 (h[0]); + const u32 r1 = h32_from_64 (h[0]); + const u32 r2 = l32_from_64 (h[1]); + const u32 r3 = h32_from_64 (h[1]); + + #include VECT_COMPARE_S + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m11700_m04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + const u32 lid = get_local_id (0); + + u32x w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = 0; + w[ 5] = 0; + w[ 6] = 0; + w[ 7] = 0; + w[ 8] = 0; + w[ 9] = 0; + w[10] = 0; + w[11] = 0; + w[12] = 0; + w[13] = 0; + w[14] = 0; + w[15] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * shared lookup table + */ + + const u32 lid4 = lid * 4; + + __local u64 s_sbob_sl64[8][256]; + + s_sbob_sl64[0][lid4 + 0] = sbob_sl64[0][lid4 + 0]; + s_sbob_sl64[0][lid4 + 1] = sbob_sl64[0][lid4 + 1]; + s_sbob_sl64[0][lid4 + 2] = sbob_sl64[0][lid4 + 2]; + s_sbob_sl64[0][lid4 + 3] = sbob_sl64[0][lid4 + 3]; + s_sbob_sl64[1][lid4 + 0] = sbob_sl64[1][lid4 + 0]; + s_sbob_sl64[1][lid4 + 1] = sbob_sl64[1][lid4 + 1]; + s_sbob_sl64[1][lid4 + 2] = sbob_sl64[1][lid4 + 2]; + s_sbob_sl64[1][lid4 + 3] = sbob_sl64[1][lid4 + 3]; + s_sbob_sl64[2][lid4 + 0] = sbob_sl64[2][lid4 + 0]; + s_sbob_sl64[2][lid4 + 1] = sbob_sl64[2][lid4 + 1]; + s_sbob_sl64[2][lid4 + 2] = sbob_sl64[2][lid4 + 2]; + s_sbob_sl64[2][lid4 + 3] = sbob_sl64[2][lid4 + 3]; + s_sbob_sl64[3][lid4 + 0] = sbob_sl64[3][lid4 + 0]; + s_sbob_sl64[3][lid4 + 1] = sbob_sl64[3][lid4 + 1]; + s_sbob_sl64[3][lid4 + 2] = sbob_sl64[3][lid4 + 2]; + s_sbob_sl64[3][lid4 + 3] = sbob_sl64[3][lid4 + 3]; + s_sbob_sl64[4][lid4 + 0] = sbob_sl64[4][lid4 + 0]; + s_sbob_sl64[4][lid4 + 1] = sbob_sl64[4][lid4 + 1]; + s_sbob_sl64[4][lid4 + 2] = sbob_sl64[4][lid4 + 2]; + s_sbob_sl64[4][lid4 + 3] = sbob_sl64[4][lid4 + 3]; + s_sbob_sl64[5][lid4 + 0] = sbob_sl64[5][lid4 + 0]; + s_sbob_sl64[5][lid4 + 1] = sbob_sl64[5][lid4 + 1]; + s_sbob_sl64[5][lid4 + 2] = sbob_sl64[5][lid4 + 2]; + s_sbob_sl64[5][lid4 + 3] = sbob_sl64[5][lid4 + 3]; + s_sbob_sl64[6][lid4 + 0] = sbob_sl64[6][lid4 + 0]; + s_sbob_sl64[6][lid4 + 1] = sbob_sl64[6][lid4 + 1]; + s_sbob_sl64[6][lid4 + 2] = sbob_sl64[6][lid4 + 2]; + s_sbob_sl64[6][lid4 + 3] = sbob_sl64[6][lid4 + 3]; + s_sbob_sl64[7][lid4 + 0] = sbob_sl64[7][lid4 + 0]; + s_sbob_sl64[7][lid4 + 1] = sbob_sl64[7][lid4 + 1]; + s_sbob_sl64[7][lid4 + 2] = sbob_sl64[7][lid4 + 2]; + s_sbob_sl64[7][lid4 + 3] = sbob_sl64[7][lid4 + 3]; + + barrier (CLK_LOCAL_MEM_FENCE); + + if (gid >= gid_max) return; + + /** + * main + */ + + m11700m (s_sbob_sl64, w, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m11700_m08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + const u32 lid = get_local_id (0); + + u32x w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = pws[gid].i[ 4]; + w[ 5] = pws[gid].i[ 5]; + w[ 6] = pws[gid].i[ 6]; + w[ 7] = pws[gid].i[ 7]; + w[ 8] = 0; + w[ 9] = 0; + w[10] = 0; + w[11] = 0; + w[12] = 0; + w[13] = 0; + w[14] = 0; + w[15] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * shared lookup table + */ + + const u32 lid4 = lid * 4; + + __local u64 s_sbob_sl64[8][256]; + + s_sbob_sl64[0][lid4 + 0] = sbob_sl64[0][lid4 + 0]; + s_sbob_sl64[0][lid4 + 1] = sbob_sl64[0][lid4 + 1]; + s_sbob_sl64[0][lid4 + 2] = sbob_sl64[0][lid4 + 2]; + s_sbob_sl64[0][lid4 + 3] = sbob_sl64[0][lid4 + 3]; + s_sbob_sl64[1][lid4 + 0] = sbob_sl64[1][lid4 + 0]; + s_sbob_sl64[1][lid4 + 1] = sbob_sl64[1][lid4 + 1]; + s_sbob_sl64[1][lid4 + 2] = sbob_sl64[1][lid4 + 2]; + s_sbob_sl64[1][lid4 + 3] = sbob_sl64[1][lid4 + 3]; + s_sbob_sl64[2][lid4 + 0] = sbob_sl64[2][lid4 + 0]; + s_sbob_sl64[2][lid4 + 1] = sbob_sl64[2][lid4 + 1]; + s_sbob_sl64[2][lid4 + 2] = sbob_sl64[2][lid4 + 2]; + s_sbob_sl64[2][lid4 + 3] = sbob_sl64[2][lid4 + 3]; + s_sbob_sl64[3][lid4 + 0] = sbob_sl64[3][lid4 + 0]; + s_sbob_sl64[3][lid4 + 1] = sbob_sl64[3][lid4 + 1]; + s_sbob_sl64[3][lid4 + 2] = sbob_sl64[3][lid4 + 2]; + s_sbob_sl64[3][lid4 + 3] = sbob_sl64[3][lid4 + 3]; + s_sbob_sl64[4][lid4 + 0] = sbob_sl64[4][lid4 + 0]; + s_sbob_sl64[4][lid4 + 1] = sbob_sl64[4][lid4 + 1]; + s_sbob_sl64[4][lid4 + 2] = sbob_sl64[4][lid4 + 2]; + s_sbob_sl64[4][lid4 + 3] = sbob_sl64[4][lid4 + 3]; + s_sbob_sl64[5][lid4 + 0] = sbob_sl64[5][lid4 + 0]; + s_sbob_sl64[5][lid4 + 1] = sbob_sl64[5][lid4 + 1]; + s_sbob_sl64[5][lid4 + 2] = sbob_sl64[5][lid4 + 2]; + s_sbob_sl64[5][lid4 + 3] = sbob_sl64[5][lid4 + 3]; + s_sbob_sl64[6][lid4 + 0] = sbob_sl64[6][lid4 + 0]; + s_sbob_sl64[6][lid4 + 1] = sbob_sl64[6][lid4 + 1]; + s_sbob_sl64[6][lid4 + 2] = sbob_sl64[6][lid4 + 2]; + s_sbob_sl64[6][lid4 + 3] = sbob_sl64[6][lid4 + 3]; + s_sbob_sl64[7][lid4 + 0] = sbob_sl64[7][lid4 + 0]; + s_sbob_sl64[7][lid4 + 1] = sbob_sl64[7][lid4 + 1]; + s_sbob_sl64[7][lid4 + 2] = sbob_sl64[7][lid4 + 2]; + s_sbob_sl64[7][lid4 + 3] = sbob_sl64[7][lid4 + 3]; + + barrier (CLK_LOCAL_MEM_FENCE); + + if (gid >= gid_max) return; + + /** + * main + */ + + m11700m (s_sbob_sl64, w, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m11700_m16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + const u32 lid = get_local_id (0); + + u32x w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = pws[gid].i[ 4]; + w[ 5] = pws[gid].i[ 5]; + w[ 6] = pws[gid].i[ 6]; + w[ 7] = pws[gid].i[ 7]; + w[ 8] = pws[gid].i[ 8]; + w[ 9] = pws[gid].i[ 9]; + w[10] = pws[gid].i[10]; + w[11] = pws[gid].i[11]; + w[12] = pws[gid].i[12]; + w[13] = pws[gid].i[13]; + w[14] = pws[gid].i[14]; + w[15] = pws[gid].i[15]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * shared lookup table + */ + + const u32 lid4 = lid * 4; + + __local u64 s_sbob_sl64[8][256]; + + s_sbob_sl64[0][lid4 + 0] = sbob_sl64[0][lid4 + 0]; + s_sbob_sl64[0][lid4 + 1] = sbob_sl64[0][lid4 + 1]; + s_sbob_sl64[0][lid4 + 2] = sbob_sl64[0][lid4 + 2]; + s_sbob_sl64[0][lid4 + 3] = sbob_sl64[0][lid4 + 3]; + s_sbob_sl64[1][lid4 + 0] = sbob_sl64[1][lid4 + 0]; + s_sbob_sl64[1][lid4 + 1] = sbob_sl64[1][lid4 + 1]; + s_sbob_sl64[1][lid4 + 2] = sbob_sl64[1][lid4 + 2]; + s_sbob_sl64[1][lid4 + 3] = sbob_sl64[1][lid4 + 3]; + s_sbob_sl64[2][lid4 + 0] = sbob_sl64[2][lid4 + 0]; + s_sbob_sl64[2][lid4 + 1] = sbob_sl64[2][lid4 + 1]; + s_sbob_sl64[2][lid4 + 2] = sbob_sl64[2][lid4 + 2]; + s_sbob_sl64[2][lid4 + 3] = sbob_sl64[2][lid4 + 3]; + s_sbob_sl64[3][lid4 + 0] = sbob_sl64[3][lid4 + 0]; + s_sbob_sl64[3][lid4 + 1] = sbob_sl64[3][lid4 + 1]; + s_sbob_sl64[3][lid4 + 2] = sbob_sl64[3][lid4 + 2]; + s_sbob_sl64[3][lid4 + 3] = sbob_sl64[3][lid4 + 3]; + s_sbob_sl64[4][lid4 + 0] = sbob_sl64[4][lid4 + 0]; + s_sbob_sl64[4][lid4 + 1] = sbob_sl64[4][lid4 + 1]; + s_sbob_sl64[4][lid4 + 2] = sbob_sl64[4][lid4 + 2]; + s_sbob_sl64[4][lid4 + 3] = sbob_sl64[4][lid4 + 3]; + s_sbob_sl64[5][lid4 + 0] = sbob_sl64[5][lid4 + 0]; + s_sbob_sl64[5][lid4 + 1] = sbob_sl64[5][lid4 + 1]; + s_sbob_sl64[5][lid4 + 2] = sbob_sl64[5][lid4 + 2]; + s_sbob_sl64[5][lid4 + 3] = sbob_sl64[5][lid4 + 3]; + s_sbob_sl64[6][lid4 + 0] = sbob_sl64[6][lid4 + 0]; + s_sbob_sl64[6][lid4 + 1] = sbob_sl64[6][lid4 + 1]; + s_sbob_sl64[6][lid4 + 2] = sbob_sl64[6][lid4 + 2]; + s_sbob_sl64[6][lid4 + 3] = sbob_sl64[6][lid4 + 3]; + s_sbob_sl64[7][lid4 + 0] = sbob_sl64[7][lid4 + 0]; + s_sbob_sl64[7][lid4 + 1] = sbob_sl64[7][lid4 + 1]; + s_sbob_sl64[7][lid4 + 2] = sbob_sl64[7][lid4 + 2]; + s_sbob_sl64[7][lid4 + 3] = sbob_sl64[7][lid4 + 3]; + + barrier (CLK_LOCAL_MEM_FENCE); + + if (gid >= gid_max) return; + + /** + * main + */ + + m11700m (s_sbob_sl64, w, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m11700_s04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + const u32 lid = get_local_id (0); + + u32x w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = 0; + w[ 5] = 0; + w[ 6] = 0; + w[ 7] = 0; + w[ 8] = 0; + w[ 9] = 0; + w[10] = 0; + w[11] = 0; + w[12] = 0; + w[13] = 0; + w[14] = 0; + w[15] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * shared lookup table + */ + + const u32 lid4 = lid * 4; + + __local u64 s_sbob_sl64[8][256]; + + s_sbob_sl64[0][lid4 + 0] = sbob_sl64[0][lid4 + 0]; + s_sbob_sl64[0][lid4 + 1] = sbob_sl64[0][lid4 + 1]; + s_sbob_sl64[0][lid4 + 2] = sbob_sl64[0][lid4 + 2]; + s_sbob_sl64[0][lid4 + 3] = sbob_sl64[0][lid4 + 3]; + s_sbob_sl64[1][lid4 + 0] = sbob_sl64[1][lid4 + 0]; + s_sbob_sl64[1][lid4 + 1] = sbob_sl64[1][lid4 + 1]; + s_sbob_sl64[1][lid4 + 2] = sbob_sl64[1][lid4 + 2]; + s_sbob_sl64[1][lid4 + 3] = sbob_sl64[1][lid4 + 3]; + s_sbob_sl64[2][lid4 + 0] = sbob_sl64[2][lid4 + 0]; + s_sbob_sl64[2][lid4 + 1] = sbob_sl64[2][lid4 + 1]; + s_sbob_sl64[2][lid4 + 2] = sbob_sl64[2][lid4 + 2]; + s_sbob_sl64[2][lid4 + 3] = sbob_sl64[2][lid4 + 3]; + s_sbob_sl64[3][lid4 + 0] = sbob_sl64[3][lid4 + 0]; + s_sbob_sl64[3][lid4 + 1] = sbob_sl64[3][lid4 + 1]; + s_sbob_sl64[3][lid4 + 2] = sbob_sl64[3][lid4 + 2]; + s_sbob_sl64[3][lid4 + 3] = sbob_sl64[3][lid4 + 3]; + s_sbob_sl64[4][lid4 + 0] = sbob_sl64[4][lid4 + 0]; + s_sbob_sl64[4][lid4 + 1] = sbob_sl64[4][lid4 + 1]; + s_sbob_sl64[4][lid4 + 2] = sbob_sl64[4][lid4 + 2]; + s_sbob_sl64[4][lid4 + 3] = sbob_sl64[4][lid4 + 3]; + s_sbob_sl64[5][lid4 + 0] = sbob_sl64[5][lid4 + 0]; + s_sbob_sl64[5][lid4 + 1] = sbob_sl64[5][lid4 + 1]; + s_sbob_sl64[5][lid4 + 2] = sbob_sl64[5][lid4 + 2]; + s_sbob_sl64[5][lid4 + 3] = sbob_sl64[5][lid4 + 3]; + s_sbob_sl64[6][lid4 + 0] = sbob_sl64[6][lid4 + 0]; + s_sbob_sl64[6][lid4 + 1] = sbob_sl64[6][lid4 + 1]; + s_sbob_sl64[6][lid4 + 2] = sbob_sl64[6][lid4 + 2]; + s_sbob_sl64[6][lid4 + 3] = sbob_sl64[6][lid4 + 3]; + s_sbob_sl64[7][lid4 + 0] = sbob_sl64[7][lid4 + 0]; + s_sbob_sl64[7][lid4 + 1] = sbob_sl64[7][lid4 + 1]; + s_sbob_sl64[7][lid4 + 2] = sbob_sl64[7][lid4 + 2]; + s_sbob_sl64[7][lid4 + 3] = sbob_sl64[7][lid4 + 3]; + + barrier (CLK_LOCAL_MEM_FENCE); + + if (gid >= gid_max) return; + + /** + * main + */ + + m11700s (s_sbob_sl64, w, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m11700_s08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + const u32 lid = get_local_id (0); + + u32x w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = pws[gid].i[ 4]; + w[ 5] = pws[gid].i[ 5]; + w[ 6] = pws[gid].i[ 6]; + w[ 7] = pws[gid].i[ 7]; + w[ 8] = 0; + w[ 9] = 0; + w[10] = 0; + w[11] = 0; + w[12] = 0; + w[13] = 0; + w[14] = 0; + w[15] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * shared lookup table + */ + + const u32 lid4 = lid * 4; + + __local u64 s_sbob_sl64[8][256]; + + s_sbob_sl64[0][lid4 + 0] = sbob_sl64[0][lid4 + 0]; + s_sbob_sl64[0][lid4 + 1] = sbob_sl64[0][lid4 + 1]; + s_sbob_sl64[0][lid4 + 2] = sbob_sl64[0][lid4 + 2]; + s_sbob_sl64[0][lid4 + 3] = sbob_sl64[0][lid4 + 3]; + s_sbob_sl64[1][lid4 + 0] = sbob_sl64[1][lid4 + 0]; + s_sbob_sl64[1][lid4 + 1] = sbob_sl64[1][lid4 + 1]; + s_sbob_sl64[1][lid4 + 2] = sbob_sl64[1][lid4 + 2]; + s_sbob_sl64[1][lid4 + 3] = sbob_sl64[1][lid4 + 3]; + s_sbob_sl64[2][lid4 + 0] = sbob_sl64[2][lid4 + 0]; + s_sbob_sl64[2][lid4 + 1] = sbob_sl64[2][lid4 + 1]; + s_sbob_sl64[2][lid4 + 2] = sbob_sl64[2][lid4 + 2]; + s_sbob_sl64[2][lid4 + 3] = sbob_sl64[2][lid4 + 3]; + s_sbob_sl64[3][lid4 + 0] = sbob_sl64[3][lid4 + 0]; + s_sbob_sl64[3][lid4 + 1] = sbob_sl64[3][lid4 + 1]; + s_sbob_sl64[3][lid4 + 2] = sbob_sl64[3][lid4 + 2]; + s_sbob_sl64[3][lid4 + 3] = sbob_sl64[3][lid4 + 3]; + s_sbob_sl64[4][lid4 + 0] = sbob_sl64[4][lid4 + 0]; + s_sbob_sl64[4][lid4 + 1] = sbob_sl64[4][lid4 + 1]; + s_sbob_sl64[4][lid4 + 2] = sbob_sl64[4][lid4 + 2]; + s_sbob_sl64[4][lid4 + 3] = sbob_sl64[4][lid4 + 3]; + s_sbob_sl64[5][lid4 + 0] = sbob_sl64[5][lid4 + 0]; + s_sbob_sl64[5][lid4 + 1] = sbob_sl64[5][lid4 + 1]; + s_sbob_sl64[5][lid4 + 2] = sbob_sl64[5][lid4 + 2]; + s_sbob_sl64[5][lid4 + 3] = sbob_sl64[5][lid4 + 3]; + s_sbob_sl64[6][lid4 + 0] = sbob_sl64[6][lid4 + 0]; + s_sbob_sl64[6][lid4 + 1] = sbob_sl64[6][lid4 + 1]; + s_sbob_sl64[6][lid4 + 2] = sbob_sl64[6][lid4 + 2]; + s_sbob_sl64[6][lid4 + 3] = sbob_sl64[6][lid4 + 3]; + s_sbob_sl64[7][lid4 + 0] = sbob_sl64[7][lid4 + 0]; + s_sbob_sl64[7][lid4 + 1] = sbob_sl64[7][lid4 + 1]; + s_sbob_sl64[7][lid4 + 2] = sbob_sl64[7][lid4 + 2]; + s_sbob_sl64[7][lid4 + 3] = sbob_sl64[7][lid4 + 3]; + + barrier (CLK_LOCAL_MEM_FENCE); + + if (gid >= gid_max) return; + + /** + * main + */ + + m11700s (s_sbob_sl64, w, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m11700_s16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + const u32 lid = get_local_id (0); + + u32x w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = pws[gid].i[ 4]; + w[ 5] = pws[gid].i[ 5]; + w[ 6] = pws[gid].i[ 6]; + w[ 7] = pws[gid].i[ 7]; + w[ 8] = pws[gid].i[ 8]; + w[ 9] = pws[gid].i[ 9]; + w[10] = pws[gid].i[10]; + w[11] = pws[gid].i[11]; + w[12] = pws[gid].i[12]; + w[13] = pws[gid].i[13]; + w[14] = pws[gid].i[14]; + w[15] = pws[gid].i[15]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * shared lookup table + */ + + const u32 lid4 = lid * 4; + + __local u64 s_sbob_sl64[8][256]; + + s_sbob_sl64[0][lid4 + 0] = sbob_sl64[0][lid4 + 0]; + s_sbob_sl64[0][lid4 + 1] = sbob_sl64[0][lid4 + 1]; + s_sbob_sl64[0][lid4 + 2] = sbob_sl64[0][lid4 + 2]; + s_sbob_sl64[0][lid4 + 3] = sbob_sl64[0][lid4 + 3]; + s_sbob_sl64[1][lid4 + 0] = sbob_sl64[1][lid4 + 0]; + s_sbob_sl64[1][lid4 + 1] = sbob_sl64[1][lid4 + 1]; + s_sbob_sl64[1][lid4 + 2] = sbob_sl64[1][lid4 + 2]; + s_sbob_sl64[1][lid4 + 3] = sbob_sl64[1][lid4 + 3]; + s_sbob_sl64[2][lid4 + 0] = sbob_sl64[2][lid4 + 0]; + s_sbob_sl64[2][lid4 + 1] = sbob_sl64[2][lid4 + 1]; + s_sbob_sl64[2][lid4 + 2] = sbob_sl64[2][lid4 + 2]; + s_sbob_sl64[2][lid4 + 3] = sbob_sl64[2][lid4 + 3]; + s_sbob_sl64[3][lid4 + 0] = sbob_sl64[3][lid4 + 0]; + s_sbob_sl64[3][lid4 + 1] = sbob_sl64[3][lid4 + 1]; + s_sbob_sl64[3][lid4 + 2] = sbob_sl64[3][lid4 + 2]; + s_sbob_sl64[3][lid4 + 3] = sbob_sl64[3][lid4 + 3]; + s_sbob_sl64[4][lid4 + 0] = sbob_sl64[4][lid4 + 0]; + s_sbob_sl64[4][lid4 + 1] = sbob_sl64[4][lid4 + 1]; + s_sbob_sl64[4][lid4 + 2] = sbob_sl64[4][lid4 + 2]; + s_sbob_sl64[4][lid4 + 3] = sbob_sl64[4][lid4 + 3]; + s_sbob_sl64[5][lid4 + 0] = sbob_sl64[5][lid4 + 0]; + s_sbob_sl64[5][lid4 + 1] = sbob_sl64[5][lid4 + 1]; + s_sbob_sl64[5][lid4 + 2] = sbob_sl64[5][lid4 + 2]; + s_sbob_sl64[5][lid4 + 3] = sbob_sl64[5][lid4 + 3]; + s_sbob_sl64[6][lid4 + 0] = sbob_sl64[6][lid4 + 0]; + s_sbob_sl64[6][lid4 + 1] = sbob_sl64[6][lid4 + 1]; + s_sbob_sl64[6][lid4 + 2] = sbob_sl64[6][lid4 + 2]; + s_sbob_sl64[6][lid4 + 3] = sbob_sl64[6][lid4 + 3]; + s_sbob_sl64[7][lid4 + 0] = sbob_sl64[7][lid4 + 0]; + s_sbob_sl64[7][lid4 + 1] = sbob_sl64[7][lid4 + 1]; + s_sbob_sl64[7][lid4 + 2] = sbob_sl64[7][lid4 + 2]; + s_sbob_sl64[7][lid4 + 3] = sbob_sl64[7][lid4 + 3]; + + barrier (CLK_LOCAL_MEM_FENCE); + + if (gid >= gid_max) return; + + /** + * main + */ + + m11700s (s_sbob_sl64, w, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} diff --git a/amd/m11800_a0.cl b/amd/m11800_a0.cl new file mode 100644 index 0000000000..d0e95b3b7c --- /dev/null +++ b/amd/m11800_a0.cl @@ -0,0 +1,2670 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _GOST2012_512_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW4 +#define VECT_SIZE1 +#endif + +#ifdef VLIW5 +#define VECT_SIZE1 +#endif + +#define DGST_R0 0 +#define DGST_R1 1 +#define DGST_R2 2 +#define DGST_R3 3 + +#include "include/kernel_functions.c" +#include "types_amd.c" +#include "common_amd.c" +#include "include/rp_gpu.h" +#include "rp_amd.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +#define INITVAL 0 + +#define SBOG_LPSti64 \ + s_sbob_sl64[0][(t[0] >> (i * 8)) & 0xff] ^ \ + s_sbob_sl64[1][(t[1] >> (i * 8)) & 0xff] ^ \ + s_sbob_sl64[2][(t[2] >> (i * 8)) & 0xff] ^ \ + s_sbob_sl64[3][(t[3] >> (i * 8)) & 0xff] ^ \ + s_sbob_sl64[4][(t[4] >> (i * 8)) & 0xff] ^ \ + s_sbob_sl64[5][(t[5] >> (i * 8)) & 0xff] ^ \ + s_sbob_sl64[6][(t[6] >> (i * 8)) & 0xff] ^ \ + s_sbob_sl64[7][(t[7] >> (i * 8)) & 0xff] + +// constants + +__constant u64 sbob_sl64[8][256] = +{ + { + 0xd031c397ce553fe6, + 0x16ba5b01b006b525, + 0xa89bade6296e70c8, + 0x6a1f525d77d3435b, + 0x6e103570573dfa0b, + 0x660efb2a17fc95ab, + 0x76327a9e97634bf6, + 0x4bad9d6462458bf5, + 0xf1830caedbc3f748, + 0xc5c8f542669131ff, + 0x95044a1cdc48b0cb, + 0x892962df3cf8b866, + 0xb0b9e208e930c135, + 0xa14fb3f0611a767c, + 0x8d2605f21c160136, + 0xd6b71922fecc549e, + 0x37089438a5907d8b, + 0x0b5da38e5803d49c, + 0x5a5bcc9cea6f3cbc, + 0xedae246d3b73ffe5, + 0xd2b87e0fde22edce, + 0x5e54abb1ca8185ec, + 0x1de7f88fe80561b9, + 0xad5e1a870135a08c, + 0x2f2adbd665cecc76, + 0x5780b5a782f58358, + 0x3edc8a2eede47b3f, + 0xc9d95c3506bee70f, + 0x83be111d6c4e05ee, + 0xa603b90959367410, + 0x103c81b4809fde5d, + 0x2c69b6027d0c774a, + 0x399080d7d5c87953, + 0x09d41e16487406b4, + 0xcdd63b1826505e5f, + 0xf99dc2f49b0298e8, + 0x9cd0540a943cb67f, + 0xbca84b7f891f17c5, + 0x723d1db3b78df2a6, + 0x78aa6e71e73b4f2e, + 0x1433e699a071670d, + 0x84f21be454620782, + 0x98df3327b4d20f2f, + 0xf049dce2d3769e5c, + 0xdb6c60199656eb7a, + 0x648746b2078b4783, + 0x32cd23598dcbadcf, + 0x1ea4955bf0c7da85, + 0xe9a143401b9d46b5, + 0xfd92a5d9bbec21b8, + 0xc8138c790e0b8e1b, + 0x2ee00b9a6d7ba562, + 0xf85712b893b7f1fc, + 0xeb28fed80bea949d, + 0x564a65eb8a40ea4c, + 0x6c9988e8474a2823, + 0x4535898b121d8f2d, + 0xabd8c03231accbf4, + 0xba2e91cab9867cbd, + 0x7960be3def8e263a, + 0x0c11a977602fd6f0, + 0xcb50e1ad16c93527, + 0xeae22e94035ffd89, + 0x2866d12f5de2ce1a, + 0xff1b1841ab9bf390, + 0x9f9339de8cfe0d43, + 0x964727c8c48a0bf7, + 0x524502c6aaae531c, + 0x9b9c5ef3ac10b413, + 0x4fa2fa4942ab32a5, + 0x3f165a62e551122b, + 0xc74148da76e6e3d7, + 0x924840e5e464b2a7, + 0xd372ae43d69784da, + 0x233b72a105e11a86, + 0xa48a04914941a638, + 0xb4b68525c9de7865, + 0xddeabaaca6cf8002, + 0x0a9773c250b6bd88, + 0xc284ffbb5ebd3393, + 0x8ba0df472c8f6a4e, + 0x2aef6cb74d951c32, + 0x427983722a318d41, + 0x73f7cdffbf389bb2, + 0x074c0af9382c026c, + 0x8a6a0f0b243a035a, + 0x6fdae53c5f88931f, + 0xc68b98967e538ac3, + 0x44ff59c71aa8e639, + 0xe2fce0ce439e9229, + 0xa20cde2479d8cd40, + 0x19e89fa2c8ebd8e9, + 0xf446bbcff398270c, + 0x43b3533e2284e455, + 0xd82f0dcd8e945046, + 0x51066f12b26ce820, + 0xe73957af6bc5426d, + 0x081ece5a40c16fa0, + 0x3b193d4fc5bfab7b, + 0x7fe66488df174d42, + 0x0e9814ef705804d8, + 0x8137ac857c39d7c6, + 0xb1733244e185a821, + 0x695c3f896f11f867, + 0xf6cf0657e3eff524, + 0x1aabf276d02963d5, + 0x2da3664e75b91e5e, + 0x0289bd981077d228, + 0x90c1fd7df413608f, + 0x3c5537b6fd93a917, + 0xaa12107e3919a2e0, + 0x0686dab530996b78, + 0xdaa6b0559ee3826e, + 0xc34e2ff756085a87, + 0x6d5358a44fff4137, + 0xfc587595b35948ac, + 0x7ca5095cc7d5f67e, + 0xfb147f6c8b754ac0, + 0xbfeb26ab91ddacf9, + 0x6896efc567a49173, + 0xca9a31e11e7c5c33, + 0xbbe44186b13315a9, + 0x0ddb793b689abfe4, + 0x70b4a02ba7fa208e, + 0xe47a3a7b7307f951, + 0x8cecd5be14a36822, + 0xeeed49b923b144d9, + 0x17708b4db8b3dc31, + 0x6088219f2765fed3, + 0xb3fa8fdcf1f27a09, + 0x910b2d31fca6099b, + 0x0f52c4a378ed6dcc, + 0x50ccbf5ebad98134, + 0x6bd582117f662a4f, + 0x94ce9a50d4fdd9df, + 0x2b25bcfb45207526, + 0x67c42b661f49fcbf, + 0x492420fc723259dd, + 0x03436dd418c2bb3c, + 0x1f6e4517f872b391, + 0xa08563bc69af1f68, + 0xd43ea4baeebb86b6, + 0x01cad04c08b56914, + 0xac94cacb0980c998, + 0x54c3d8739a373864, + 0x26fec5c02dbacac2, + 0xdea9d778be0d3b3e, + 0x040f672d20eeb950, + 0xe5b0ea377bb29045, + 0xf30ab136cbb42560, + 0x62019c0737122cfb, + 0xe86b930c13282fa1, + 0xcc1ceb542ee5374b, + 0x538fd28aa21b3a08, + 0x1b61223ad89c0ac1, + 0x36c24474ad25149f, + 0x7a23d3e9f74c9d06, + 0xbe21f6e79968c5ed, + 0xcf5f868036278c77, + 0xf705d61beb5a9c30, + 0x4d2b47d152dce08d, + 0x5f9e7bfdc234ecf8, + 0x247778583dcd18ea, + 0x867ba67c4415d5aa, + 0x4ce1979d5a698999, + 0x0000000000000000, + 0xec64f42133c696f1, + 0xb57c5569c16b1171, + 0xc1c7926f467f88af, + 0x654d96fe0f3e2e97, + 0x15f936d5a8c40e19, + 0xb8a72c52a9f1ae95, + 0xa9517daa21db19dc, + 0x58d27104fa18ee94, + 0x5918a148f2ad8780, + 0x5cdd1629daf657c4, + 0x8274c15164fb6cfa, + 0xd1fb13dbc6e056f2, + 0x7d6fd910cf609f6a, + 0xb63f38bdd9a9aa4d, + 0x3d9fe7faf526c003, + 0x74bbc706871499de, + 0xdf630734b6b8522a, + 0x3ad3ed03cd0ac26f, + 0xfadeaf2083c023d4, + 0xc00d42234ecae1bb, + 0x8538cba85cd76e96, + 0xc402250e6e2458eb, + 0x47bc3413026a5d05, + 0xafd7a71f114272a4, + 0x978df784cc3f62e3, + 0xb96dfc1ea144c781, + 0x21b2cf391596c8ae, + 0x318e4e8d950916f3, + 0xce9556cc3e92e563, + 0x385a509bdd7d1047, + 0x358129a0b5e7afa3, + 0xe6f387e363702b79, + 0xe0755d5653e94001, + 0x7be903a5fff9f412, + 0x12b53c2c90e80c75, + 0x3307f315857ec4db, + 0x8fafb86a0c61d31e, + 0xd9e5dd8186213952, + 0x77f8aad29fd622e2, + 0x25bda814357871fe, + 0x7571174a8fa1f0ca, + 0x137fec60985d6561, + 0x30449ec19dbc7fe7, + 0xa540d4dd41f4cf2c, + 0xdc206ae0ae7ae916, + 0x5b911cd0e2da55a8, + 0xb2305f90f947131d, + 0x344bf9ecbd52c6b7, + 0x5d17c665d2433ed0, + 0x18224feec05eb1fd, + 0x9e59e992844b6457, + 0x9a568ebfa4a5dd07, + 0xa3c60e68716da454, + 0x7e2cb4c4d7a22456, + 0x87b176304ca0bcbe, + 0x413aeea632f3367d, + 0x9915e36bbc67663b, + 0x40f03eea3a465f69, + 0x1c2d28c3e0b008ad, + 0x4e682a054a1e5bb1, + 0x05c5b761285bd044, + 0xe1bf8d1a5b5c2915, + 0xf2c0617ac3014c74, + 0xb7f5e8f1d11cc359, + 0x63cb4c4b3fa745ef, + 0x9d1a84469c89df6b, + 0xe33630824b2bfb3d, + 0xd5f474f6e60eefa2, + 0xf58c6b83fb2d4e18, + 0x4676e45f0adf3411, + 0x20781f751d23a1ba, + 0xbd629b3381aa7ed1, + 0xae1d775319f71bb0, + 0xfed1c80da32e9a84, + 0x5509083f92825170, + 0x29ac01635557a70e, + 0xa7c9694551831d04, + 0x8e65682604d4ba0a, + 0x11f651f8882ab749, + 0xd77dc96ef6793d8a, + 0xef2799f52b042dcd, + 0x48eef0b07a8730c9, + 0x22f1a2ed0d547392, + 0x6142f1d32fd097c7, + 0x4a674d286af0e2e1, + 0x80fd7cc9748cbed2, + 0x717e7067af4f499a, + 0x938290a9ecd1dbb3, + 0x88e3b293344dd172, + 0x2734158c250fa3d6, + }, + { + 0x7e37e62dfc7d40c3, + 0x776f25a4ee939e5b, + 0xe045c850dd8fb5ad, + 0x86ed5ba711ff1952, + 0xe91d0bd9cf616b35, + 0x37e0ab256e408ffb, + 0x9607f6c031025a7a, + 0x0b02f5e116d23c9d, + 0xf3d8486bfb50650c, + 0x621cff27c40875f5, + 0x7d40cb71fa5fd34a, + 0x6daa6616daa29062, + 0x9f5f354923ec84e2, + 0xec847c3dc507c3b3, + 0x025a3668043ce205, + 0xa8bf9e6c4dac0b19, + 0xfa808be2e9bebb94, + 0xb5b99c5277c74fa3, + 0x78d9bc95f0397bcc, + 0xe332e50cdbad2624, + 0xc74fce129332797e, + 0x1729eceb2ea709ab, + 0xc2d6b9f69954d1f8, + 0x5d898cbfbab8551a, + 0x859a76fb17dd8adb, + 0x1be85886362f7fb5, + 0xf6413f8ff136cd8a, + 0xd3110fa5bbb7e35c, + 0x0a2feed514cc4d11, + 0xe83010edcd7f1ab9, + 0xa1e75de55f42d581, + 0xeede4a55c13b21b6, + 0xf2f5535ff94e1480, + 0x0cc1b46d1888761e, + 0xbce15fdb6529913b, + 0x2d25e8975a7181c2, + 0x71817f1ce2d7a554, + 0x2e52c5cb5c53124b, + 0xf9f7a6beef9c281d, + 0x9e722e7d21f2f56e, + 0xce170d9b81dca7e6, + 0x0e9b82051cb4941b, + 0x1e712f623c49d733, + 0x21e45cfa42f9f7dc, + 0xcb8e7a7f8bba0f60, + 0x8e98831a010fb646, + 0x474ccf0d8e895b23, + 0xa99285584fb27a95, + 0x8cc2b57205335443, + 0x42d5b8e984eff3a5, + 0x012d1b34021e718c, + 0x57a6626aae74180b, + 0xff19fc06e3d81312, + 0x35ba9d4d6a7c6dfe, + 0xc9d44c178f86ed65, + 0x506523e6a02e5288, + 0x03772d5c06229389, + 0x8b01f4fe0b691ec0, + 0xf8dabd8aed825991, + 0x4c4e3aec985b67be, + 0xb10df0827fbf96a9, + 0x6a69279ad4f8dae1, + 0xe78689dcd3d5ff2e, + 0x812e1a2b1fa553d1, + 0xfbad90d6eba0ca18, + 0x1ac543b234310e39, + 0x1604f7df2cb97827, + 0xa6241c6951189f02, + 0x753513cceaaf7c5e, + 0x64f2a59fc84c4efa, + 0x247d2b1e489f5f5a, + 0xdb64d718ab474c48, + 0x79f4a7a1f2270a40, + 0x1573da832a9bebae, + 0x3497867968621c72, + 0x514838d2a2302304, + 0xf0af6537fd72f685, + 0x1d06023e3a6b44ba, + 0x678588c3ce6edd73, + 0x66a893f7cc70acff, + 0xd4d24e29b5eda9df, + 0x3856321470ea6a6c, + 0x07c3418c0e5a4a83, + 0x2bcbb22f5635bacd, + 0x04b46cd00878d90a, + 0x06ee5ab80c443b0f, + 0x3b211f4876c8f9e5, + 0x0958c38912eede98, + 0xd14b39cdbf8b0159, + 0x397b292072f41be0, + 0x87c0409313e168de, + 0xad26e98847caa39f, + 0x4e140c849c6785bb, + 0xd5ff551db7f3d853, + 0xa0ca46d15d5ca40d, + 0xcd6020c787fe346f, + 0x84b76dcf15c3fb57, + 0xdefda0fca121e4ce, + 0x4b8d7b6096012d3d, + 0x9ac642ad298a2c64, + 0x0875d8bd10f0af14, + 0xb357c6ea7b8374ac, + 0x4d6321d89a451632, + 0xeda96709c719b23f, + 0xf76c24bbf328bc06, + 0xc662d526912c08f2, + 0x3ce25ec47892b366, + 0xb978283f6f4f39bd, + 0xc08c8f9e9d6833fd, + 0x4f3917b09e79f437, + 0x593de06fb2c08c10, + 0xd6887841b1d14bda, + 0x19b26eee32139db0, + 0xb494876675d93e2f, + 0x825937771987c058, + 0x90e9ac783d466175, + 0xf1827e03ff6c8709, + 0x945dc0a8353eb87f, + 0x4516f9658ab5b926, + 0x3f9573987eb020ef, + 0xb855330b6d514831, + 0x2ae6a91b542bcb41, + 0x6331e413c6160479, + 0x408f8e8180d311a0, + 0xeff35161c325503a, + 0xd06622f9bd9570d5, + 0x8876d9a20d4b8d49, + 0xa5533135573a0c8b, + 0xe168d364df91c421, + 0xf41b09e7f50a2f8f, + 0x12b09b0f24c1a12d, + 0xda49cc2ca9593dc4, + 0x1f5c34563e57a6bf, + 0x54d14f36a8568b82, + 0xaf7cdfe043f6419a, + 0xea6a2685c943f8bc, + 0xe5dcbfb4d7e91d2b, + 0xb27addde799d0520, + 0x6b443caed6e6ab6d, + 0x7bae91c9f61be845, + 0x3eb868ac7cae5163, + 0x11c7b65322e332a4, + 0xd23c1491b9a992d0, + 0x8fb5982e0311c7ca, + 0x70ac6428e0c9d4d8, + 0x895bc2960f55fcc5, + 0x76423e90ec8defd7, + 0x6ff0507ede9e7267, + 0x3dcf45f07a8cc2ea, + 0x4aa06054941f5cb1, + 0x5810fb5bb0defd9c, + 0x5efea1e3bc9ac693, + 0x6edd4b4adc8003eb, + 0x741808f8e8b10dd2, + 0x145ec1b728859a22, + 0x28bc9f7350172944, + 0x270a06424ebdccd3, + 0x972aedf4331c2bf6, + 0x059977e40a66a886, + 0x2550302a4a812ed6, + 0xdd8a8da0a7037747, + 0xc515f87a970e9b7b, + 0x3023eaa9601ac578, + 0xb7e3aa3a73fbada6, + 0x0fb699311eaae597, + 0x0000000000000000, + 0x310ef19d6204b4f4, + 0x229371a644db6455, + 0x0decaf591a960792, + 0x5ca4978bb8a62496, + 0x1c2b190a38753536, + 0x41a295b582cd602c, + 0x3279dcc16426277d, + 0xc1a194aa9f764271, + 0x139d803b26dfd0a1, + 0xae51c4d441e83016, + 0xd813fa44ad65dfc1, + 0xac0bf2bc45d4d213, + 0x23be6a9246c515d9, + 0x49d74d08923dcf38, + 0x9d05032127d066e7, + 0x2f7fdeff5e4d63c7, + 0xa47e2a0155247d07, + 0x99b16ff12fa8bfed, + 0x4661d4398c972aaf, + 0xdfd0bbc8a33f9542, + 0xdca79694a51d06cb, + 0xb020ebb67da1e725, + 0xba0f0563696daa34, + 0xe4f1a480d5f76ca7, + 0xc438e34e9510eaf7, + 0x939e81243b64f2fc, + 0x8defae46072d25cf, + 0x2c08f3a3586ff04e, + 0xd7a56375b3cf3a56, + 0x20c947ce40e78650, + 0x43f8a3dd86f18229, + 0x568b795eac6a6987, + 0x8003011f1dbb225d, + 0xf53612d3f7145e03, + 0x189f75da300dec3c, + 0x9570db9c3720c9f3, + 0xbb221e576b73dbb8, + 0x72f65240e4f536dd, + 0x443be25188abc8aa, + 0xe21ffe38d9b357a8, + 0xfd43ca6ee7e4f117, + 0xcaa3614b89a47eec, + 0xfe34e732e1c6629e, + 0x83742c431b99b1d4, + 0xcf3a16af83c2d66a, + 0xaae5a8044990e91c, + 0x26271d764ca3bd5f, + 0x91c4b74c3f5810f9, + 0x7c6dd045f841a2c6, + 0x7f1afd19fe63314f, + 0xc8f957238d989ce9, + 0xa709075d5306ee8e, + 0x55fc5402aa48fa0e, + 0x48fa563c9023beb4, + 0x65dfbeabca523f76, + 0x6c877d22d8bce1ee, + 0xcc4d3bf385e045e3, + 0xbebb69b36115733e, + 0x10eaad6720fd4328, + 0xb6ceb10e71e5dc2a, + 0xbdcc44ef6737e0b7, + 0x523f158ea412b08d, + 0x989c74c52db6ce61, + 0x9beb59992b945de8, + 0x8a2cefca09776f4c, + 0xa3bd6b8d5b7e3784, + 0xeb473db1cb5d8930, + 0xc3fba2c29b4aa074, + 0x9c28181525ce176b, + 0x683311f2d0c438e4, + 0x5fd3bad7be84b71f, + 0xfc6ed15ae5fa809b, + 0x36cdb0116c5efe77, + 0x29918447520958c8, + 0xa29070b959604608, + 0x53120ebaa60cc101, + 0x3a0c047c74d68869, + 0x691e0ac6d2da4968, + 0x73db4974e6eb4751, + 0x7a838afdf40599c9, + 0x5a4acd33b4e21f99, + 0x6046c94fc03497f0, + 0xe6ab92e8d1cb8ea2, + 0x3354c7f5663856f1, + 0xd93ee170af7bae4d, + 0x616bd27bc22ae67c, + 0x92b39a10397a8370, + 0xabc8b3304b8e9890, + 0xbf967287630b02b2, + 0x5b67d607b6fc6e15, + }, + { + 0x8ab0a96846e06a6d, + 0x43c7e80b4bf0b33a, + 0x08c9b3546b161ee5, + 0x39f1c235eba990be, + 0xc1bef2376606c7b2, + 0x2c209233614569aa, + 0xeb01523b6fc3289a, + 0x946953ab935acedd, + 0x272838f63e13340e, + 0x8b0455eca12ba052, + 0x77a1b2c4978ff8a2, + 0xa55122ca13e54086, + 0x2276135862d3f1cd, + 0xdb8ddfde08b76cfe, + 0x5d1e12c89e4a178a, + 0x0e56816b03969867, + 0xee5f79953303ed59, + 0xafed748bab78d71d, + 0x6d929f2df93e53ee, + 0xf5d8a8f8ba798c2a, + 0xf619b1698e39cf6b, + 0x95ddaf2f749104e2, + 0xec2a9c80e0886427, + 0xce5c8fd8825b95ea, + 0xc4e0d9993ac60271, + 0x4699c3a5173076f9, + 0x3d1b151f50a29f42, + 0x9ed505ea2bc75946, + 0x34665acfdc7f4b98, + 0x61b1fb53292342f7, + 0xc721c0080e864130, + 0x8693cd1696fd7b74, + 0x872731927136b14b, + 0xd3446c8a63a1721b, + 0x669a35e8a6680e4a, + 0xcab658f239509a16, + 0xa4e5de4ef42e8ab9, + 0x37a7435ee83f08d9, + 0x134e6239e26c7f96, + 0x82791a3c2df67488, + 0x3f6ef00a8329163c, + 0x8e5a7e42fdeb6591, + 0x5caaee4c7981ddb5, + 0x19f234785af1e80d, + 0x255ddde3ed98bd70, + 0x50898a32a99cccac, + 0x28ca4519da4e6656, + 0xae59880f4cb31d22, + 0x0d9798fa37d6db26, + 0x32f968f0b4ffcd1a, + 0xa00f09644f258545, + 0xfa3ad5175e24de72, + 0xf46c547c5db24615, + 0x713e80fbff0f7e20, + 0x7843cf2b73d2aafa, + 0xbd17ea36aedf62b4, + 0xfd111bacd16f92cf, + 0x4abaa7dbc72d67e0, + 0xb3416b5dad49fad3, + 0xbca316b24914a88b, + 0x15d150068aecf914, + 0xe27c1debe31efc40, + 0x4fe48c759beda223, + 0x7edcfd141b522c78, + 0x4e5070f17c26681c, + 0xe696cac15815f3bc, + 0x35d2a64b3bb481a7, + 0x800cff29fe7dfdf6, + 0x1ed9fac3d5baa4b0, + 0x6c2663a91ef599d1, + 0x03c1199134404341, + 0xf7ad4ded69f20554, + 0xcd9d9649b61bd6ab, + 0xc8c3bde7eadb1368, + 0xd131899fb02afb65, + 0x1d18e352e1fae7f1, + 0xda39235aef7ca6c1, + 0xa1bbf5e0a8ee4f7a, + 0x91377805cf9a0b1e, + 0x3138716180bf8e5b, + 0xd9f83acbdb3ce580, + 0x0275e515d38b897e, + 0x472d3f21f0fbbcc6, + 0x2d946eb7868ea395, + 0xba3c248d21942e09, + 0xe7223645bfde3983, + 0xff64feb902e41bb1, + 0xc97741630d10d957, + 0xc3cb1722b58d4ecc, + 0xa27aec719cae0c3b, + 0x99fecb51a48c15fb, + 0x1465ac826d27332b, + 0xe1bd047ad75ebf01, + 0x79f733af941960c5, + 0x672ec96c41a3c475, + 0xc27feba6524684f3, + 0x64efd0fd75e38734, + 0xed9e60040743ae18, + 0xfb8e2993b9ef144d, + 0x38453eb10c625a81, + 0x6978480742355c12, + 0x48cf42ce14a6ee9e, + 0x1cac1fd606312dce, + 0x7b82d6ba4792e9bb, + 0x9d141c7b1f871a07, + 0x5616b80dc11c4a2e, + 0xb849c198f21fa777, + 0x7ca91801c8d9a506, + 0xb1348e487ec273ad, + 0x41b20d1e987b3a44, + 0x7460ab55a3cfbbe3, + 0x84e628034576f20a, + 0x1b87d16d897a6173, + 0x0fe27defe45d5258, + 0x83cde6b8ca3dbeb7, + 0x0c23647ed01d1119, + 0x7a362a3ea0592384, + 0xb61f40f3f1893f10, + 0x75d457d1440471dc, + 0x4558da34237035b8, + 0xdca6116587fc2043, + 0x8d9b67d3c9ab26d0, + 0x2b0b5c88ee0e2517, + 0x6fe77a382ab5da90, + 0x269cc472d9d8fe31, + 0x63c41e46faa8cb89, + 0xb7abbc771642f52f, + 0x7d1de4852f126f39, + 0xa8c6ba3024339ba0, + 0x600507d7cee888c8, + 0x8fee82c61a20afae, + 0x57a2448926d78011, + 0xfca5e72836a458f0, + 0x072bcebb8f4b4cbd, + 0x497bbe4af36d24a1, + 0x3cafe99bb769557d, + 0x12fa9ebd05a7b5a9, + 0xe8c04baa5b836bdb, + 0x4273148fac3b7905, + 0x908384812851c121, + 0xe557d3506c55b0fd, + 0x72ff996acb4f3d61, + 0x3eda0c8e64e2dc03, + 0xf0868356e6b949e9, + 0x04ead72abb0b0ffc, + 0x17a4b5135967706a, + 0xe3c8e16f04d5367f, + 0xf84f30028daf570c, + 0x1846c8fcbd3a2232, + 0x5b8120f7f6ca9108, + 0xd46fa231ecea3ea6, + 0x334d947453340725, + 0x58403966c28ad249, + 0xbed6f3a79a9f21f5, + 0x68ccb483a5fe962d, + 0xd085751b57e1315a, + 0xfed0023de52fd18e, + 0x4b0e5b5f20e6addf, + 0x1a332de96eb1ab4c, + 0xa3ce10f57b65c604, + 0x108f7ba8d62c3cd7, + 0xab07a3a11073d8e1, + 0x6b0dad1291bed56c, + 0xf2f366433532c097, + 0x2e557726b2cee0d4, + 0x0000000000000000, + 0xcb02a476de9b5029, + 0xe4e32fd48b9e7ac2, + 0x734b65ee2c84f75e, + 0x6e5386bccd7e10af, + 0x01b4fc84e7cbca3f, + 0xcfe8735c65905fd5, + 0x3613bfda0ff4c2e6, + 0x113b872c31e7f6e8, + 0x2fe18ba255052aeb, + 0xe974b72ebc48a1e4, + 0x0abc5641b89d979b, + 0xb46aa5e62202b66e, + 0x44ec26b0c4bbff87, + 0xa6903b5b27a503c7, + 0x7f680190fc99e647, + 0x97a84a3aa71a8d9c, + 0xdd12ede16037ea7c, + 0xc554251ddd0dc84e, + 0x88c54c7d956be313, + 0x4d91696048662b5d, + 0xb08072cc9909b992, + 0xb5de5962c5c97c51, + 0x81b803ad19b637c9, + 0xb2f597d94a8230ec, + 0x0b08aac55f565da4, + 0xf1327fd2017283d6, + 0xad98919e78f35e63, + 0x6ab9519676751f53, + 0x24e921670a53774f, + 0xb9fd3d1c15d46d48, + 0x92f66194fbda485f, + 0x5a35dc7311015b37, + 0xded3f4705477a93d, + 0xc00a0eb381cd0d8d, + 0xbb88d809c65fe436, + 0x16104997beacba55, + 0x21b70ac95693b28c, + 0x59f4c5e225411876, + 0xd5db5eb50b21f499, + 0x55d7a19cf55c096f, + 0xa97246b4c3f8519f, + 0x8552d487a2bd3835, + 0x54635d181297c350, + 0x23c2efdc85183bf2, + 0x9f61f96ecc0c9379, + 0x534893a39ddc8fed, + 0x5edf0b59aa0a54cb, + 0xac2c6d1a9f38945c, + 0xd7aebba0d8aa7de7, + 0x2abfa00c09c5ef28, + 0xd84cc64f3cf72fbf, + 0x2003f64db15878b3, + 0xa724c7dfc06ec9f8, + 0x069f323f68808682, + 0xcc296acd51d01c94, + 0x055e2bae5cc0c5c3, + 0x6270e2c21d6301b6, + 0x3b842720382219c0, + 0xd2f0900e846ab824, + 0x52fc6f277a1745d2, + 0xc6953c8ce94d8b0f, + 0xe009f8fe3095753e, + 0x655b2c7992284d0b, + 0x984a37d54347dfc4, + 0xeab5aebf8808e2a5, + 0x9a3fd2c090cc56ba, + 0x9ca0e0fff84cd038, + 0x4c2595e4afade162, + 0xdf6708f4b3bc6302, + 0xbf620f237d54ebca, + 0x93429d101c118260, + 0x097d4fd08cddd4da, + 0x8c2f9b572e60ecef, + 0x708a7c7f18c4b41f, + 0x3a30dba4dfe9d3ff, + 0x4006f19a7fb0f07b, + 0x5f6bf7dd4dc19ef4, + 0x1f6d064732716e8f, + 0xf9fbcc866a649d33, + 0x308c8de567744464, + 0x8971b0f972a0292c, + 0xd61a47243f61b7d8, + 0xefeb8511d4c82766, + 0x961cb6be40d147a3, + 0xaab35f25f7b812de, + 0x76154e407044329d, + 0x513d76b64e570693, + 0xf3479ac7d2f90aa8, + 0x9b8b2e4477079c85, + 0x297eb99d3d85ac69, + }, + { + 0x3ef29d249b2c0a19, + 0xe9e16322b6f8622f, + 0x5536994047757f7a, + 0x9f4d56d5a47b0b33, + 0x822567466aa1174c, + 0xb8f5057deb082fb2, + 0xcc48c10bf4475f53, + 0x373088d4275dec3a, + 0x968f4325180aed10, + 0x173d232cf7016151, + 0xae4ed09f946fcc13, + 0xfd4b4741c4539873, + 0x1b5b3f0dd9933765, + 0x2ffcb0967b644052, + 0xe02376d20a89840c, + 0xa3ae3a70329b18d7, + 0x419cbd2335de8526, + 0xfafebf115b7c3199, + 0x0397074f85aa9b0d, + 0xc58ad4fb4836b970, + 0xbec60be3fc4104a8, + 0x1eff36dc4b708772, + 0x131fdc33ed8453b6, + 0x0844e33e341764d3, + 0x0ff11b6eab38cd39, + 0x64351f0a7761b85a, + 0x3b5694f509cfba0e, + 0x30857084b87245d0, + 0x47afb3bd2297ae3c, + 0xf2ba5c2f6f6b554a, + 0x74bdc4761f4f70e1, + 0xcfdfc64471edc45e, + 0xe610784c1dc0af16, + 0x7aca29d63c113f28, + 0x2ded411776a859af, + 0xac5f211e99a3d5ee, + 0xd484f949a87ef33b, + 0x3ce36ca596e013e4, + 0xd120f0983a9d432c, + 0x6bc40464dc597563, + 0x69d5f5e5d1956c9e, + 0x9ae95f043698bb24, + 0xc9ecc8da66a4ef44, + 0xd69508c8a5b2eac6, + 0xc40c2235c0503b80, + 0x38c193ba8c652103, + 0x1ceec75d46bc9e8f, + 0xd331011937515ad1, + 0xd8e2e56886eca50f, + 0xb137108d5779c991, + 0x709f3b6905ca4206, + 0x4feb50831680caef, + 0xec456af3241bd238, + 0x58d673afe181abbe, + 0x242f54e7cad9bf8c, + 0x0211f1810dcc19fd, + 0x90bc4dbb0f43c60a, + 0x9518446a9da0761d, + 0xa1bfcbf13f57012a, + 0x2bde4f8961e172b5, + 0x27b853a84f732481, + 0xb0b1e643df1f4b61, + 0x18cc38425c39ac68, + 0xd2b7f7d7bf37d821, + 0x3103864a3014c720, + 0x14aa246372abfa5c, + 0x6e600db54ebac574, + 0x394765740403a3f3, + 0x09c215f0bc71e623, + 0x2a58b947e987f045, + 0x7b4cdf18b477bdd8, + 0x9709b5eb906c6fe0, + 0x73083c268060d90b, + 0xfedc400e41f9037e, + 0x284948c6e44be9b8, + 0x728ecae808065bfb, + 0x06330e9e17492b1a, + 0x5950856169e7294e, + 0xbae4f4fce6c4364f, + 0xca7bcf95e30e7449, + 0x7d7fd186a33e96c2, + 0x52836110d85ad690, + 0x4dfaa1021b4cd312, + 0x913abb75872544fa, + 0xdd46ecb9140f1518, + 0x3d659a6b1e869114, + 0xc23f2cabd719109a, + 0xd713fe062dd46836, + 0xd0a60656b2fbc1dc, + 0x221c5a79dd909496, + 0xefd26dbca1b14935, + 0x0e77eda0235e4fc9, + 0xcbfd395b6b68f6b9, + 0x0de0eaefa6f4d4c4, + 0x0422ff1f1a8532e7, + 0xf969b85eded6aa94, + 0x7f6e2007aef28f3f, + 0x3ad0623b81a938fe, + 0x6624ee8b7aada1a7, + 0xb682e8ddc856607b, + 0xa78cc56f281e2a30, + 0xc79b257a45faa08d, + 0x5b4174e0642b30b3, + 0x5f638bff7eae0254, + 0x4bc9af9c0c05f808, + 0xce59308af98b46ae, + 0x8fc58da9cc55c388, + 0x803496c7676d0eb1, + 0xf33caae1e70dd7ba, + 0xbb6202326ea2b4bf, + 0xd5020f87201871cb, + 0x9d5ca754a9b712ce, + 0x841669d87de83c56, + 0x8a6184785eb6739f, + 0x420bba6cb0741e2b, + 0xf12d5b60eac1ce47, + 0x76ac35f71283691c, + 0x2c6bb7d9fecedb5f, + 0xfccdb18f4c351a83, + 0x1f79c012c3160582, + 0xf0abadae62a74cb7, + 0xe1a5801c82ef06fc, + 0x67a21845f2cb2357, + 0x5114665f5df04d9d, + 0xbf40fd2d74278658, + 0xa0393d3fb73183da, + 0x05a409d192e3b017, + 0xa9fb28cf0b4065f9, + 0x25a9a22942bf3d7c, + 0xdb75e22703463e02, + 0xb326e10c5ab5d06c, + 0xe7968e8295a62de6, + 0xb973f3b3636ead42, + 0xdf571d3819c30ce5, + 0xee549b7229d7cbc5, + 0x12992afd65e2d146, + 0xf8ef4e9056b02864, + 0xb7041e134030e28b, + 0xc02edd2adad50967, + 0x932b4af48ae95d07, + 0x6fe6fb7bc6dc4784, + 0x239aacb755f61666, + 0x401a4bedbdb807d6, + 0x485ea8d389af6305, + 0xa41bc220adb4b13d, + 0x753b32b89729f211, + 0x997e584bb3322029, + 0x1d683193ceda1c7f, + 0xff5ab6c0c99f818e, + 0x16bbd5e27f67e3a1, + 0xa59d34ee25d233cd, + 0x98f8ae853b54a2d9, + 0x6df70afacb105e79, + 0x795d2e99b9bba425, + 0x8e437b6744334178, + 0x0186f6ce886682f0, + 0xebf092a3bb347bd2, + 0xbcd7fa62f18d1d55, + 0xadd9d7d011c5571e, + 0x0bd3e471b1bdffde, + 0xaa6c2f808eeafef4, + 0x5ee57d31f6c880a4, + 0xf50fa47ff044fca0, + 0x1addc9c351f5b595, + 0xea76646d3352f922, + 0x0000000000000000, + 0x85909f16f58ebea6, + 0x46294573aaf12ccc, + 0x0a5512bf39db7d2e, + 0x78dbd85731dd26d5, + 0x29cfbe086c2d6b48, + 0x218b5d36583a0f9b, + 0x152cd2adfacd78ac, + 0x83a39188e2c795bc, + 0xc3b9da655f7f926a, + 0x9ecba01b2c1d89c3, + 0x07b5f8509f2fa9ea, + 0x7ee8d6c926940dcf, + 0x36b67e1aaf3b6eca, + 0x86079859702425ab, + 0xfb7849dfd31ab369, + 0x4c7c57cc932a51e2, + 0xd96413a60e8a27ff, + 0x263ea566c715a671, + 0x6c71fc344376dc89, + 0x4a4f595284637af8, + 0xdaf314e98b20bcf2, + 0x572768c14ab96687, + 0x1088db7c682ec8bb, + 0x887075f9537a6a62, + 0x2e7a4658f302c2a2, + 0x619116dbe582084d, + 0xa87dde018326e709, + 0xdcc01a779c6997e8, + 0xedc39c3dac7d50c8, + 0xa60a33a1a078a8c0, + 0xc1a82be452b38b97, + 0x3f746bea134a88e9, + 0xa228ccbebafd9a27, + 0xabead94e068c7c04, + 0xf48952b178227e50, + 0x5cf48cb0fb049959, + 0x6017e0156de48abd, + 0x4438b4f2a73d3531, + 0x8c528ae649ff5885, + 0xb515ef924dfcfb76, + 0x0c661c212e925634, + 0xb493195cc59a7986, + 0x9cda519a21d1903e, + 0x32948105b5be5c2d, + 0x194ace8cd45f2e98, + 0x438d4ca238129cdb, + 0x9b6fa9cabefe39d4, + 0x81b26009ef0b8c41, + 0xded1ebf691a58e15, + 0x4e6da64d9ee6481f, + 0x54b06f8ecf13fd8a, + 0x49d85e1d01c9e1f5, + 0xafc826511c094ee3, + 0xf698a33075ee67ad, + 0x5ac7822eec4db243, + 0x8dd47c28c199da75, + 0x89f68337db1ce892, + 0xcdce37c57c21dda3, + 0x530597de503c5460, + 0x6a42f2aa543ff793, + 0x5d727a7e73621ba9, + 0xe232875307459df1, + 0x56a19e0fc2dfe477, + 0xc61dd3b4cd9c227d, + 0xe5877f03986a341b, + 0x949eb2a415c6f4ed, + 0x6206119460289340, + 0x6380e75ae84e11b0, + 0x8be772b6d6d0f16f, + 0x50929091d596cf6d, + 0xe86795ec3e9ee0df, + 0x7cf927482b581432, + 0xc86a3e14eec26db4, + 0x7119cda78dacc0f6, + 0xe40189cd100cb6eb, + 0x92adbc3a028fdff7, + 0xb2a017c2d2d3529c, + 0x200dabf8d05c8d6b, + 0x34a78f9ba2f77737, + 0xe3b4719d8f231f01, + 0x45be423c2f5bb7c1, + 0xf71e55fefd88e55d, + 0x6853032b59f3ee6e, + 0x65b3e9c4ff073aaa, + 0x772ac3399ae5ebec, + 0x87816e97f842a75b, + 0x110e2db2e0484a4b, + 0x331277cb3dd8dedd, + 0xbd510cac79eb9fa5, + 0x352179552a91f5c7, + }, + { + 0x05ba7bc82c9b3220, + 0x31a54665f8b65e4f, + 0xb1b651f77547f4d4, + 0x8bfa0d857ba46682, + 0x85a96c5aa16a98bb, + 0x990faef908eb79c9, + 0xa15e37a247f4a62d, + 0x76857dcd5d27741e, + 0xf8c50b800a1820bc, + 0xbe65dcb201f7a2b4, + 0x666d1b986f9426e7, + 0x4cc921bf53c4e648, + 0x95410a0f93d9ca42, + 0x20cdccaa647ba4ef, + 0x429a4060890a1871, + 0x0c4ea4f69b32b38b, + 0xccda362dde354cd3, + 0x96dc23bc7c5b2fa9, + 0xc309bb68aa851ab3, + 0xd26131a73648e013, + 0x021dc52941fc4db2, + 0xcd5adab7704be48a, + 0xa77965d984ed71e6, + 0x32386fd61734bba4, + 0xe82d6dd538ab7245, + 0x5c2147ea6177b4b1, + 0x5da1ab70cf091ce8, + 0xac907fce72b8bdff, + 0x57c85dfd972278a8, + 0xa4e44c6a6b6f940d, + 0x3851995b4f1fdfe4, + 0x62578ccaed71bc9e, + 0xd9882bb0c01d2c0a, + 0x917b9d5d113c503b, + 0xa2c31e11a87643c6, + 0xe463c923a399c1ce, + 0xf71686c57ea876dc, + 0x87b4a973e096d509, + 0xaf0d567d9d3a5814, + 0xb40c2a3f59dcc6f4, + 0x3602f88495d121dd, + 0xd3e1dd3d9836484a, + 0xf945e71aa46688e5, + 0x7518547eb2a591f5, + 0x9366587450c01d89, + 0x9ea81018658c065b, + 0x4f54080cbc4603a3, + 0x2d0384c65137bf3d, + 0xdc325078ec861e2a, + 0xea30a8fc79573ff7, + 0x214d2030ca050cb6, + 0x65f0322b8016c30c, + 0x69be96dd1b247087, + 0xdb95ee9981e161b8, + 0xd1fc1814d9ca05f8, + 0x820ed2bbcc0de729, + 0x63d76050430f14c7, + 0x3bccb0e8a09d3a0f, + 0x8e40764d573f54a2, + 0x39d175c1e16177bd, + 0x12f5a37c734f1f4b, + 0xab37c12f1fdfc26d, + 0x5648b167395cd0f1, + 0x6c04ed1537bf42a7, + 0xed97161d14304065, + 0x7d6c67daab72b807, + 0xec17fa87ba4ee83c, + 0xdfaf79cb0304fbc1, + 0x733f060571bc463e, + 0x78d61c1287e98a27, + 0xd07cf48e77b4ada1, + 0xb9c262536c90dd26, + 0xe2449b5860801605, + 0x8fc09ad7f941fcfb, + 0xfad8cea94be46d0e, + 0xa343f28b0608eb9f, + 0x9b126bd04917347b, + 0x9a92874ae7699c22, + 0x1b017c42c4e69ee0, + 0x3a4c5c720ee39256, + 0x4b6e9f5e3ea399da, + 0x6ba353f45ad83d35, + 0xe7fee0904c1b2425, + 0x22d009832587e95d, + 0x842980c00f1430e2, + 0xc6b3c0a0861e2893, + 0x087433a419d729f2, + 0x341f3dadd42d6c6f, + 0xee0a3faefbb2a58e, + 0x4aee73c490dd3183, + 0xaab72db5b1a16a34, + 0xa92a04065e238fdf, + 0x7b4b35a1686b6fcc, + 0x6a23bf6ef4a6956c, + 0x191cb96b851ad352, + 0x55d598d4d6de351a, + 0xc9604de5f2ae7ef3, + 0x1ca6c2a3a981e172, + 0xde2f9551ad7a5398, + 0x3025aaff56c8f616, + 0x15521d9d1e2860d9, + 0x506fe31cfa45073a, + 0x189c55f12b647b0b, + 0x0180ec9aae7ea859, + 0x7cec8b40050c105e, + 0x2350e5198bf94104, + 0xef8ad33455cc0dd7, + 0x07a7bee16d677f92, + 0xe5e325b90de76997, + 0x5a061591a26e637a, + 0xb611ef1618208b46, + 0x09f4df3eb7a981ab, + 0x1ebb078ae87dacc0, + 0xb791038cb65e231f, + 0x0fd38d4574b05660, + 0x67edf702c1ea8ebe, + 0xba5f4be0831238cd, + 0xe3c477c2cefebe5c, + 0x0dce486c354c1bd2, + 0x8c5db36416c31910, + 0x26ea9ed1a7627324, + 0x039d29b3ef82e5eb, + 0x9f28fc82cbf2ae02, + 0xa8aae89cf05d2786, + 0x431aacfa2774b028, + 0xcf471f9e31b7a938, + 0x581bd0b8e3922ec8, + 0xbc78199b400bef06, + 0x90fb71c7bf42f862, + 0x1f3beb1046030499, + 0x683e7a47b55ad8de, + 0x988f4263a695d190, + 0xd808c72a6e638453, + 0x0627527bc319d7cb, + 0xebb04466d72997ae, + 0xe67e0c0ae2658c7c, + 0x14d2f107b056c880, + 0x7122c32c30400b8c, + 0x8a7ae11fd5dacedb, + 0xa0dedb38e98a0e74, + 0xad109354dcc615a6, + 0x0be91a17f655cc19, + 0x8ddd5ffeb8bdb149, + 0xbfe53028af890aed, + 0xd65ba6f5b4ad7a6a, + 0x7956f0882997227e, + 0x10e8665532b352f9, + 0x0e5361dfdacefe39, + 0xcec7f3049fc90161, + 0xff62b561677f5f2e, + 0x975ccf26d22587f0, + 0x51ef0f86543baf63, + 0x2f1e41ef10cbf28f, + 0x52722635bbb94a88, + 0xae8dbae73344f04d, + 0x410769d36688fd9a, + 0xb3ab94de34bbb966, + 0x801317928df1aa9b, + 0xa564a0f0c5113c54, + 0xf131d4bebdb1a117, + 0x7f71a2f3ea8ef5b5, + 0x40878549c8f655c3, + 0x7ef14e6944f05dec, + 0xd44663dcf55137d8, + 0xf2acfd0d523344fc, + 0x0000000000000000, + 0x5fbc6e598ef5515a, + 0x16cf342ef1aa8532, + 0xb036bd6ddb395c8d, + 0x13754fe6dd31b712, + 0xbbdfa77a2d6c9094, + 0x89e7c8ac3a582b30, + 0x3c6b0e09cdfa459d, + 0xc4ae0589c7e26521, + 0x49735a777f5fd468, + 0xcafd64561d2c9b18, + 0xda1502032f9fc9e1, + 0x8867243694268369, + 0x3782141e3baf8984, + 0x9cb5d53124704be9, + 0xd7db4a6f1ad3d233, + 0xa6f989432a93d9bf, + 0x9d3539ab8a0ee3b0, + 0x53f2caaf15c7e2d1, + 0x6e19283c76430f15, + 0x3debe2936384edc4, + 0x5e3c82c3208bf903, + 0x33b8834cb94a13fd, + 0x6470deb12e686b55, + 0x359fd1377a53c436, + 0x61caa57902f35975, + 0x043a975282e59a79, + 0xfd7f70482683129c, + 0xc52ee913699ccd78, + 0x28b9ff0e7dac8d1d, + 0x5455744e78a09d43, + 0xcb7d88ccb3523341, + 0x44bd121b4a13cfba, + 0x4d49cd25fdba4e11, + 0x3e76cb208c06082f, + 0x3ff627ba2278a076, + 0xc28957f204fbb2ea, + 0x453dfe81e46d67e3, + 0x94c1e6953da7621b, + 0x2c83685cff491764, + 0xf32c1197fc4deca5, + 0x2b24d6bd922e68f6, + 0xb22b78449ac5113f, + 0x48f3b6edd1217c31, + 0x2e9ead75beb55ad6, + 0x174fd8b45fd42d6b, + 0x4ed4e4961238abfa, + 0x92e6b4eefebeb5d0, + 0x46a0d7320bef8208, + 0x47203ba8a5912a51, + 0x24f75bf8e69e3e96, + 0xf0b1382413cf094e, + 0xfee259fbc901f777, + 0x276a724b091cdb7d, + 0xbdf8f501ee75475f, + 0x599b3c224dec8691, + 0x6d84018f99c1eafe, + 0x7498b8e41cdb39ac, + 0xe0595e71217c5bb7, + 0x2aa43a273c50c0af, + 0xf50b43ec3f543b6e, + 0x838e3e2162734f70, + 0xc09492db4507ff58, + 0x72bfea9fdfc2ee67, + 0x11688acf9ccdfaa0, + 0x1a8190d86a9836b9, + 0x7acbd93bc615c795, + 0xc7332c3a286080ca, + 0x863445e94ee87d50, + 0xf6966a5fd0d6de85, + 0xe9ad814f96d5da1c, + 0x70a22fb69e3ea3d5, + 0x0a69f68d582b6440, + 0xb8428ec9c2ee757f, + 0x604a49e3ac8df12c, + 0x5b86f90b0c10cb23, + 0xe1d9b2eb8f02f3ee, + 0x29391394d3d22544, + 0xc8e0a17f5cd0d6aa, + 0xb58cc6a5f7a26ead, + 0x8193fb08238f02c2, + 0xd5c68f465b2f9f81, + 0xfcff9cd288fdbac5, + 0x77059157f359dc47, + 0x1d262e3907ff492b, + 0xfb582233e59ac557, + 0xddb2bce242f8b673, + 0x2577b76248e096cf, + 0x6f99c4a6d83da74c, + 0xc1147e41eb795701, + 0xf48baf76912a9337, + }, + { + 0x45b268a93acde4cc, + 0xaf7f0be884549d08, + 0x048354b3c1468263, + 0x925435c2c80efed2, + 0xee4e37f27fdffba7, + 0x167a33920c60f14d, + 0xfb123b52ea03e584, + 0x4a0cab53fdbb9007, + 0x9deaf6380f788a19, + 0xcb48ec558f0cb32a, + 0xb59dc4b2d6fef7e0, + 0xdcdbca22f4f3ecb6, + 0x11df5813549a9c40, + 0xe33fdedf568aced3, + 0xa0c1c8124322e9c3, + 0x07a56b8158fa6d0d, + 0x77279579b1e1f3dd, + 0xd9b18b74422ac004, + 0xb8ec2d9fffabc294, + 0xf4acf8a82d75914f, + 0x7bbf69b1ef2b6878, + 0xc4f62faf487ac7e1, + 0x76ce809cc67e5d0c, + 0x6711d88f92e4c14c, + 0x627b99d9243dedfe, + 0x234aa5c3dfb68b51, + 0x909b1f15262dbf6d, + 0x4f66ea054b62bcb5, + 0x1ae2cf5a52aa6ae8, + 0xbea053fbd0ce0148, + 0xed6808c0e66314c9, + 0x43fe16cd15a82710, + 0xcd049231a06970f6, + 0xe7bc8a6c97cc4cb0, + 0x337ce835fcb3b9c0, + 0x65def2587cc780f3, + 0x52214ede4132bb50, + 0x95f15e4390f493df, + 0x870839625dd2e0f1, + 0x41313c1afb8b66af, + 0x91720af051b211bc, + 0x477d427ed4eea573, + 0x2e3b4ceef6e3be25, + 0x82627834eb0bcc43, + 0x9c03e3dd78e724c8, + 0x2877328ad9867df9, + 0x14b51945e243b0f2, + 0x574b0f88f7eb97e2, + 0x88b6fa989aa4943a, + 0x19c4f068cb168586, + 0x50ee6409af11faef, + 0x7df317d5c04eaba4, + 0x7a567c5498b4c6a9, + 0xb6bbfb804f42188e, + 0x3cc22bcf3bc5cd0b, + 0xd04336eaaa397713, + 0xf02fac1bec33132c, + 0x2506dba7f0d3488d, + 0xd7e65d6bf2c31a1e, + 0x5eb9b2161ff820f5, + 0x842e0650c46e0f9f, + 0x716beb1d9e843001, + 0xa933758cab315ed4, + 0x3fe414fda2792265, + 0x27c9f1701ef00932, + 0x73a4c1ca70a771be, + 0x94184ba6e76b3d0e, + 0x40d829ff8c14c87e, + 0x0fbec3fac77674cb, + 0x3616a9634a6a9572, + 0x8f139119c25ef937, + 0xf545ed4d5aea3f9e, + 0xe802499650ba387b, + 0x6437e7bd0b582e22, + 0xe6559f89e053e261, + 0x80ad52e305288dfc, + 0x6dc55a23e34b9935, + 0xde14e0f51ad0ad09, + 0xc6390578a659865e, + 0x96d7617109487cb1, + 0xe2d6cb3a21156002, + 0x01e915e5779faed1, + 0xadb0213f6a77dcb7, + 0x9880b76eb9a1a6ab, + 0x5d9f8d248644cf9b, + 0xfd5e4536c5662658, + 0xf1c6b9fe9bacbdfd, + 0xeacd6341be9979c4, + 0xefa7221708405576, + 0x510771ecd88e543e, + 0xc2ba51cb671f043d, + 0x0ad482ac71af5879, + 0xfe787a045cdac936, + 0xb238af338e049aed, + 0xbd866cc94972ee26, + 0x615da6ebbd810290, + 0x3295fdd08b2c1711, + 0xf834046073bf0aea, + 0xf3099329758ffc42, + 0x1caeb13e7dcfa934, + 0xba2307481188832b, + 0x24efce42874ce65c, + 0x0e57d61fb0e9da1a, + 0xb3d1bad6f99b343c, + 0xc0757b1c893c4582, + 0x2b510db8403a9297, + 0x5c7698c1f1db614a, + 0x3e0d0118d5e68cb4, + 0xd60f488e855cb4cf, + 0xae961e0df3cb33d9, + 0x3a8e55ab14a00ed7, + 0x42170328623789c1, + 0x838b6dd19c946292, + 0x895fef7ded3b3aeb, + 0xcfcbb8e64e4a3149, + 0x064c7e642f65c3dc, + 0x3d2b3e2a4c5a63da, + 0x5bd3f340a9210c47, + 0xb474d157a1615931, + 0xac5934da1de87266, + 0x6ee365117af7765b, + 0xc86ed36716b05c44, + 0x9ba6885c201d49c5, + 0xb905387a88346c45, + 0x131072c4bab9ddff, + 0xbf49461ea751af99, + 0xd52977bc1ce05ba1, + 0xb0f785e46027db52, + 0x546d30ba6e57788c, + 0x305ad707650f56ae, + 0xc987c682612ff295, + 0xa5ab8944f5fbc571, + 0x7ed528e759f244ca, + 0x8ddcbbce2c7db888, + 0xaa154abe328db1ba, + 0x1e619be993ece88b, + 0x09f2bd9ee813b717, + 0x7401aa4b285d1cb3, + 0x21858f143195caee, + 0x48c381841398d1b8, + 0xfcb750d3b2f98889, + 0x39a86a998d1ce1b9, + 0x1f888e0ce473465a, + 0x7899568376978716, + 0x02cf2ad7ee2341bf, + 0x85c713b5b3f1a14e, + 0xff916fe12b4567e7, + 0x7c1a0230b7d10575, + 0x0c98fcc85eca9ba5, + 0xa3e7f720da9e06ad, + 0x6a6031a2bbb1f438, + 0x973e74947ed7d260, + 0x2cf4663918c0ff9a, + 0x5f50a7f368678e24, + 0x34d983b4a449d4cd, + 0x68af1b755592b587, + 0x7f3c3d022e6dea1b, + 0xabfc5f5b45121f6b, + 0x0d71e92d29553574, + 0xdffdf5106d4f03d8, + 0x081ba87b9f8c19c6, + 0xdb7ea1a3ac0981bb, + 0xbbca12ad66172dfa, + 0x79704366010829c7, + 0x179326777bff5f9c, + 0x0000000000000000, + 0xeb2476a4c906d715, + 0x724dd42f0738df6f, + 0xb752ee6538ddb65f, + 0x37ffbc863df53ba3, + 0x8efa84fcb5c157e6, + 0xe9eb5c73272596aa, + 0x1b0bdabf2535c439, + 0x86e12c872a4d4e20, + 0x9969a28bce3e087a, + 0xfafb2eb79d9c4b55, + 0x056a4156b6d92cb2, + 0x5a3ae6a5debea296, + 0x22a3b026a8292580, + 0x53c85b3b36ad1581, + 0xb11e900117b87583, + 0xc51f3a4a3fe56930, + 0xe019e1edcf3621bd, + 0xec811d2591fcba18, + 0x445b7d4c4d524a1d, + 0xa8da6069dcaef005, + 0x58f5cc72309de329, + 0xd4c062596b7ff570, + 0xce22ad0339d59f98, + 0x591cd99747024df8, + 0x8b90c5aa03187b54, + 0xf663d27fc356d0f0, + 0xd8589e9135b56ed5, + 0x35309651d3d67a1c, + 0x12f96721cd26732e, + 0xd28c1c3d441a36ac, + 0x492a946164077f69, + 0x2d1d73dc6f5f514b, + 0x6f0a70f40d68d88a, + 0x60b4b30eca1eac41, + 0xd36509d83385987d, + 0x0b3d97490630f6a8, + 0x9eccc90a96c46577, + 0xa20ee2c5ad01a87c, + 0xe49ab55e0e70a3de, + 0xa4429ca182646ba0, + 0xda97b446db962f6a, + 0xcced87d4d7f6de27, + 0x2ab8185d37a53c46, + 0x9f25dcefe15bcba6, + 0xc19c6ef9fea3eb53, + 0xa764a3931bd884ce, + 0x2fd2590b817c10f4, + 0x56a21a6d80743933, + 0xe573a0bb79ef0d0f, + 0x155c0ca095dc1e23, + 0x6c2c4fc694d437e4, + 0x10364df623053291, + 0xdd32dfc7836c4267, + 0x03263f3299bcef6e, + 0x66f8cd6ae57b6f9d, + 0x8c35ae2b5be21659, + 0x31b3c2e21290f87f, + 0x93bd2027bf915003, + 0x69460e90220d1b56, + 0x299e276fae19d328, + 0x63928c3c53a2432f, + 0x7082fef8e91b9ed0, + 0xbc6f792c3eed40f7, + 0x4c40d537d2de53db, + 0x75e8bfae5fc2b262, + 0x4da9c0d2a541fd0a, + 0x4e8fffe03cfd1264, + 0x2620e495696fa7e3, + 0xe1f0f408b8a98f6c, + 0xd1aa230fdda6d9c2, + 0xc7d0109dd1c6288f, + 0x8a79d04f7487d585, + 0x4694579ba3710ba2, + 0x38417f7cfa834f68, + 0x1d47a4db0a5007e5, + 0x206c9af1460a643f, + 0xa128ddf734bd4712, + 0x8144470672b7232d, + 0xf2e086cc02105293, + 0x182de58dbc892b57, + 0xcaa1f9b0f8931dfb, + 0x6b892447cc2e5ae9, + 0xf9dd11850420a43b, + 0x4be5beb68a243ed6, + 0x5584255f19c8d65d, + 0x3b67404e633fa006, + 0xa68db6766c472a1f, + 0xf78ac79ab4c97e21, + 0xc353442e1080aaec, + 0x9a4f9db95782e714, + }, + { + 0xc811a8058c3f55de, + 0x65f5b43196b50619, + 0xf74f96b1d6706e43, + 0x859d1e8bcb43d336, + 0x5aab8a85ccfa3d84, + 0xf9c7bf99c295fcfd, + 0xa21fd5a1de4b630f, + 0xcdb3ef763b8b456d, + 0x803f59f87cf7c385, + 0xb27c73be5f31913c, + 0x98e3ac6633b04821, + 0xbf61674c26b8f818, + 0x0ffbc995c4c130c8, + 0xaaa0862010761a98, + 0x6057f342210116aa, + 0xf63c760c0654cc35, + 0x2ddb45cc667d9042, + 0xbcf45a964bd40382, + 0x68e8a0c3ef3c6f3d, + 0xa7bd92d269ff73bc, + 0x290ae20201ed2287, + 0xb7de34cde885818f, + 0xd901eea7dd61059b, + 0xd6fa273219a03553, + 0xd56f1ae874cccec9, + 0xea31245c2e83f554, + 0x7034555da07be499, + 0xce26d2ac56e7bef7, + 0xfd161857a5054e38, + 0x6a0e7da4527436d1, + 0x5bd86a381cde9ff2, + 0xcaf7756231770c32, + 0xb09aaed9e279c8d0, + 0x5def1091c60674db, + 0x111046a2515e5045, + 0x23536ce4729802fc, + 0xc50cbcf7f5b63cfa, + 0x73a16887cd171f03, + 0x7d2941afd9f28dbd, + 0x3f5e3eb45a4f3b9d, + 0x84eefe361b677140, + 0x3db8e3d3e7076271, + 0x1a3a28f9f20fd248, + 0x7ebc7c75b49e7627, + 0x74e5f293c7eb565c, + 0x18dcf59e4f478ba4, + 0x0c6ef44fa9adcb52, + 0xc699812d98dac760, + 0x788b06dc6e469d0e, + 0xfc65f8ea7521ec4e, + 0x30a5f7219e8e0b55, + 0x2bec3f65bca57b6b, + 0xddd04969baf1b75e, + 0x99904cdbe394ea57, + 0x14b201d1e6ea40f6, + 0xbbb0c08241284add, + 0x50f20463bf8f1dff, + 0xe8d7f93b93cbacb8, + 0x4d8cb68e477c86e8, + 0xc1dd1b3992268e3f, + 0x7c5aa11209d62fcb, + 0x2f3d98abdb35c9ae, + 0x671369562bfd5ff5, + 0x15c1e16c36cee280, + 0x1d7eb2edf8f39b17, + 0xda94d37db00dfe01, + 0x877bc3ec760b8ada, + 0xcb8495dfe153ae44, + 0x05a24773b7b410b3, + 0x12857b783c32abdf, + 0x8eb770d06812513b, + 0x536739b9d2e3e665, + 0x584d57e271b26468, + 0xd789c78fc9849725, + 0xa935bbfa7d1ae102, + 0x8b1537a3dfa64188, + 0xd0cd5d9bc378de7a, + 0x4ac82c9a4d80cfb7, + 0x42777f1b83bdb620, + 0x72d2883a1d33bd75, + 0x5e7a2d4bab6a8f41, + 0xf4daab6bbb1c95d9, + 0x905cffe7fd8d31b6, + 0x83aa6422119b381f, + 0xc0aefb8442022c49, + 0xa0f908c663033ae3, + 0xa428af0804938826, + 0xade41c341a8a53c7, + 0xae7121ee77e6a85d, + 0xc47f5c4a25929e8c, + 0xb538e9aa55cdd863, + 0x06377aa9dad8eb29, + 0xa18ae87bb3279895, + 0x6edfda6a35e48414, + 0x6b7d9d19825094a7, + 0xd41cfa55a4e86cbf, + 0xe5caedc9ea42c59c, + 0xa36c351c0e6fc179, + 0x5181e4de6fabbf89, + 0xfff0c530184d17d4, + 0x9d41eb1584045892, + 0x1c0d525028d73961, + 0xf178ec180ca8856a, + 0x9a0571018ef811cd, + 0x4091a27c3ef5efcc, + 0x19af15239f6329d2, + 0x347450eff91eb990, + 0xe11b4a078dd27759, + 0xb9561de5fc601331, + 0x912f1f5a2da993c0, + 0x1654dcb65ba2191a, + 0x3e2dde098a6b99eb, + 0x8a66d71e0f82e3fe, + 0x8c51adb7d55a08d7, + 0x4533e50f8941ff7f, + 0x02e6dd67bd4859ec, + 0xe068aaba5df6d52f, + 0xc24826e3ff4a75a5, + 0x6c39070d88acddf8, + 0x6486548c4691a46f, + 0xd1bebd26135c7c0c, + 0xb30f93038f15334a, + 0x82d9849fc1bf9a69, + 0x9c320ba85420fae4, + 0xfa528243aff90767, + 0x9ed4d6cfe968a308, + 0xb825fd582c44b147, + 0x9b7691bc5edcb3bb, + 0xc7ea619048fe6516, + 0x1063a61f817af233, + 0x47d538683409a693, + 0x63c2ce984c6ded30, + 0x2a9fdfd86c81d91d, + 0x7b1e3b06032a6694, + 0x666089ebfbd9fd83, + 0x0a598ee67375207b, + 0x07449a140afc495f, + 0x2ca8a571b6593234, + 0x1f986f8a45bbc2fb, + 0x381aa4a050b372c2, + 0x5423a3add81faf3a, + 0x17273c0b8b86bb6c, + 0xfe83258dc869b5a2, + 0x287902bfd1c980f1, + 0xf5a94bd66b3837af, + 0x88800a79b2caba12, + 0x55504310083b0d4c, + 0xdf36940e07b9eeb2, + 0x04d1a7ce6790b2c5, + 0x612413fff125b4dc, + 0x26f12b97c52c124f, + 0x86082351a62f28ac, + 0xef93632f9937e5e7, + 0x3507b052293a1be6, + 0xe72c30ae570a9c70, + 0xd3586041ae1425e0, + 0xde4574b3d79d4cc4, + 0x92ba228040c5685a, + 0xf00b0ca5dc8c271c, + 0xbe1287f1f69c5a6e, + 0xf39e317fb1e0dc86, + 0x495d114020ec342d, + 0x699b407e3f18cd4b, + 0xdca3a9d46ad51528, + 0x0d1d14f279896924, + 0x0000000000000000, + 0x593eb75fa196c61e, + 0x2e4e78160b116bd8, + 0x6d4ae7b058887f8e, + 0xe65fd013872e3e06, + 0x7a6ddbbbd30ec4e2, + 0xac97fc89caaef1b1, + 0x09ccb33c1e19dbe1, + 0x89f3eac462ee1864, + 0x7770cf49aa87adc6, + 0x56c57eca6557f6d6, + 0x03953dda6d6cfb9a, + 0x36928d884456e07c, + 0x1eeb8f37959f608d, + 0x31d6179c4eaaa923, + 0x6fac3ad7e5c02662, + 0x43049fa653991456, + 0xabd3669dc052b8ee, + 0xaf02c153a7c20a2b, + 0x3ccb036e3723c007, + 0x93c9c23d90e1ca2c, + 0xc33bc65e2f6ed7d3, + 0x4cff56339758249e, + 0xb1e94e64325d6aa6, + 0x37e16d359472420a, + 0x79f8e661be623f78, + 0x5214d90402c74413, + 0x482ef1fdf0c8965b, + 0x13f69bc5ec1609a9, + 0x0e88292814e592be, + 0x4e198b542a107d72, + 0xccc00fcbebafe71b, + 0x1b49c844222b703e, + 0x2564164da840e9d5, + 0x20c6513e1ff4f966, + 0xbac3203f910ce8ab, + 0xf2edd1c261c47ef0, + 0x814cb945acd361f3, + 0x95feb8944a392105, + 0x5c9cf02c1622d6ad, + 0x971865f3f77178e9, + 0xbd87ba2b9bf0a1f4, + 0x444005b259655d09, + 0xed75be48247fbc0b, + 0x7596122e17cff42a, + 0xb44b091785e97a15, + 0x966b854e2755da9f, + 0xeee0839249134791, + 0x32432a4623c652b9, + 0xa8465b47ad3e4374, + 0xf8b45f2412b15e8b, + 0x2417f6f078644ba3, + 0xfb2162fe7fdda511, + 0x4bbbcc279da46dc1, + 0x0173e0bdd024a276, + 0x22208c59a2bca08a, + 0x8fc4906db836f34d, + 0xe4b90d743a6667ea, + 0x7147b5e0705f46ef, + 0x2782cb2a1508b039, + 0xec065ef5f45b1e7d, + 0x21b5b183cfd05b10, + 0xdbe733c060295c77, + 0x9fa73672394c017e, + 0xcf55321186c31c81, + 0xd8720e1a0d45a7ed, + 0x3b8f997a3ddf8958, + 0x3afc79c7edfb2b2e, + 0xe9a4198643ef0ece, + 0x5f09cdf67b4e2d37, + 0x4f6a6be9fa34df04, + 0xb6add47038a123f9, + 0x8d224d0a057eaaa1, + 0xc96248b85c1bf7a8, + 0xe3fd9760309a2eb5, + 0x0b2a6e5ba351820d, + 0xeb42c4e1fea75722, + 0x948d58299a1d8373, + 0x7fcf9cc864bad451, + 0xa55b4fb5d4b72a50, + 0x08bf5381ce3d7997, + 0x46a6d8d5e42d04e5, + 0xd22b80fc7e308796, + 0x57b69e77b57354a0, + 0x3969441d8097d0b4, + 0x3330cafbf3e2f0cf, + 0xe28e77dde0be8cc3, + 0x62b12e259c494f46, + 0xa6ce726fb9dbd1ca, + 0x41e242c1eed14dba, + 0x76032ff47aa30fb0, + }, + { + 0xe6f87e5c5b711fd0, + 0x258377800924fa16, + 0xc849e07e852ea4a8, + 0x5b4686a18f06c16a, + 0x0b32e9a2d77b416e, + 0xabda37a467815c66, + 0xf61796a81a686676, + 0xf5dc0b706391954b, + 0x4862f38db7e64bf1, + 0xff5c629a68bd85c5, + 0xcb827da6fcd75795, + 0x66d36daf69b9f089, + 0x356c9f74483d83b0, + 0x7cbcecb1238c99a1, + 0x36a702ac31c4708d, + 0x9eb6a8d02fbcdfd6, + 0x8b19fa51e5b3ae37, + 0x9ccfb5408a127d0b, + 0xbc0c78b508208f5a, + 0xe533e3842288eced, + 0xcec2c7d377c15fd2, + 0xec7817b6505d0f5e, + 0xb94cc2c08336871d, + 0x8c205db4cb0b04ad, + 0x763c855b28a0892f, + 0x588d1b79f6ff3257, + 0x3fecf69e4311933e, + 0x0fc0d39f803a18c9, + 0xee010a26f5f3ad83, + 0x10efe8f4411979a6, + 0x5dcda10c7de93a10, + 0x4a1bee1d1248e92c, + 0x53bff2db21847339, + 0xb4f50ccfa6a23d09, + 0x5fb4bc9cd84798cd, + 0xe88a2d8b071c56f9, + 0x7f7771695a756a9c, + 0xc5f02e71a0ba1ebc, + 0xa663f9ab4215e672, + 0x2eb19e22de5fbb78, + 0x0db9ce0f2594ba14, + 0x82520e6397664d84, + 0x2f031e6a0208ea98, + 0x5c7f2144a1be6bf0, + 0x7a37cb1cd16362db, + 0x83e08e2b4b311c64, + 0xcf70479bab960e32, + 0x856ba986b9dee71e, + 0xb5478c877af56ce9, + 0xb8fe42885f61d6fd, + 0x1bdd0156966238c8, + 0x622157923ef8a92e, + 0xfc97ff42114476f8, + 0x9d7d350856452ceb, + 0x4c90c9b0e0a71256, + 0x2308502dfbcb016c, + 0x2d7a03faa7a64845, + 0xf46e8b38bfc6c4ab, + 0xbdbef8fdd477deba, + 0x3aac4cebc8079b79, + 0xf09cb105e8879d0c, + 0x27fa6a10ac8a58cb, + 0x8960e7c1401d0cea, + 0x1a6f811e4a356928, + 0x90c4fb0773d196ff, + 0x43501a2f609d0a9f, + 0xf7a516e0c63f3796, + 0x1ce4a6b3b8da9252, + 0x1324752c38e08a9b, + 0xa5a864733bec154f, + 0x2bf124575549b33f, + 0xd766db15440dc5c7, + 0xa7d179e39e42b792, + 0xdadf151a61997fd3, + 0x86a0345ec0271423, + 0x38d5517b6da939a4, + 0x6518f077104003b4, + 0x02791d90a5aea2dd, + 0x88d267899c4a5d0a, + 0x930f66df0a2865c2, + 0x4ee9d4204509b08b, + 0x325538916685292a, + 0x412907bfc533a842, + 0xb27e2b62544dc673, + 0x6c5304456295e007, + 0x5af406e95351908a, + 0x1f2f3b6bc123616f, + 0xc37b09dc5255e5c6, + 0x3967d133b1fe6844, + 0x298839c7f0e711e2, + 0x409b87f71964f9a2, + 0xe938adc3db4b0719, + 0x0c0b4e47f9c3ebf4, + 0x5534d576d36b8843, + 0x4610a05aeb8b02d8, + 0x20c3cdf58232f251, + 0x6de1840dbec2b1e7, + 0xa0e8de06b0fa1d08, + 0x7b854b540d34333b, + 0x42e29a67bcca5b7f, + 0xd8a6088ac437dd0e, + 0xc63bb3a9d943ed81, + 0x21714dbd5e65a3b1, + 0x6761ede7b5eea169, + 0x2431f7c8d573abf6, + 0xd51fc685e1a3671a, + 0x5e063cd40410c92d, + 0x283ab98f2cb04002, + 0x8febc06cb2f2f790, + 0x17d64f116fa1d33c, + 0xe07359f1a99ee4aa, + 0x784ed68c74cdc006, + 0x6e2a19d5c73b42da, + 0x8712b4161c7045c3, + 0x371582e4ed93216d, + 0xace390414939f6fc, + 0x7ec5f12186223b7c, + 0xc0b094042bac16fb, + 0xf9d745379a527ebf, + 0x737c3f2ea3b68168, + 0x33e7b8d9bad278ca, + 0xa9a32a34c22ffebb, + 0xe48163ccfedfbd0d, + 0x8e5940246ea5a670, + 0x51c6ef4b842ad1e4, + 0x22bad065279c508c, + 0xd91488c218608cee, + 0x319ea5491f7cda17, + 0xd394e128134c9c60, + 0x094bf43272d5e3b3, + 0x9bf612a5a4aad791, + 0xccbbda43d26ffd0f, + 0x34de1f3c946ad250, + 0x4f5b5468995ee16b, + 0xdf9faf6fea8f7794, + 0x2648ea5870dd092b, + 0xbfc7e56d71d97c67, + 0xdde6b2ff4f21d549, + 0x3c276b463ae86003, + 0x91767b4faf86c71f, + 0x68a13e7835d4b9a0, + 0xb68c115f030c9fd4, + 0x141dd2c916582001, + 0x983d8f7ddd5324ac, + 0x64aa703fcc175254, + 0xc2c989948e02b426, + 0x3e5e76d69f46c2de, + 0x50746f03587d8004, + 0x45db3d829272f1e5, + 0x60584a029b560bf3, + 0xfbae58a73ffcdc62, + 0xa15a5e4e6cad4ce8, + 0x4ba96e55ce1fb8cc, + 0x08f9747aae82b253, + 0xc102144cf7fb471b, + 0x9f042898f3eb8e36, + 0x068b27adf2effb7a, + 0xedca97fe8c0a5ebe, + 0x778e0513f4f7d8cf, + 0x302c2501c32b8bf7, + 0x8d92ddfc175c554d, + 0xf865c57f46052f5f, + 0xeaf3301ba2b2f424, + 0xaa68b7ecbbd60d86, + 0x998f0f350104754c, + 0x0000000000000000, + 0xf12e314d34d0ccec, + 0x710522be061823b5, + 0xaf280d9930c005c1, + 0x97fd5ce25d693c65, + 0x19a41cc633cc9a15, + 0x95844172f8c79eb8, + 0xdc5432b7937684a9, + 0x9436c13a2490cf58, + 0x802b13f332c8ef59, + 0xc442ae397ced4f5c, + 0xfa1cd8efe3ab8d82, + 0xf2e5ac954d293fd1, + 0x6ad823e8907a1b7d, + 0x4d2249f83cf043b6, + 0x03cb9dd879f9f33d, + 0xde2d2f2736d82674, + 0x2a43a41f891ee2df, + 0x6f98999d1b6c133a, + 0xd4ad46cd3df436fa, + 0xbb35df50269825c0, + 0x964fdcaa813e6d85, + 0xeb41b0537ee5a5c4, + 0x0540ba758b160847, + 0xa41ae43be7bb44af, + 0xe3b8c429d0671797, + 0x819993bbee9fbeb9, + 0xae9a8dd1ec975421, + 0xf3572cdd917e6e31, + 0x6393d7dae2aff8ce, + 0x47a2201237dc5338, + 0xa32343dec903ee35, + 0x79fc56c4a89a91e6, + 0x01b28048dc5751e0, + 0x1296f564e4b7db7b, + 0x75f7188351597a12, + 0xdb6d9552bdce2e33, + 0x1e9dbb231d74308f, + 0x520d7293fdd322d9, + 0xe20a44610c304677, + 0xfeeee2d2b4ead425, + 0xca30fdee20800675, + 0x61eaca4a47015a13, + 0xe74afe1487264e30, + 0x2cc883b27bf119a5, + 0x1664cf59b3f682dc, + 0xa811aa7c1e78af5b, + 0x1d5626fb648dc3b2, + 0xb73e9117df5bce34, + 0xd05f7cf06ab56f5d, + 0xfd257f0acd132718, + 0x574dc8e676c52a9e, + 0x0739a7e52eb8aa9a, + 0x5486553e0f3cd9a3, + 0x56ff48aeaa927b7e, + 0xbe756525ad8e2d87, + 0x7d0e6cf9ffdbc841, + 0x3b1ecca31450ca99, + 0x6913be30e983e840, + 0xad511009956ea71c, + 0xb1b5b6ba2db4354e, + 0x4469bdca4e25a005, + 0x15af5281ca0f71e1, + 0x744598cb8d0e2bf2, + 0x593f9b312aa863b7, + 0xefb38a6e29a4fc63, + 0x6b6aa3a04c2d4a9d, + 0x3d95eb0ee6bf31e3, + 0xa291c3961554bfd5, + 0x18169c8eef9bcbf5, + 0x115d68bc9d4e2846, + 0xba875f18facf7420, + 0xd1edfcb8b6e23ebd, + 0xb00736f2f1e364ae, + 0x84d929ce6589b6fe, + 0x70b7a2f6da4f7255, + 0x0e7253d75c6d4929, + 0x04f23a3d574159a7, + 0x0a8069ea0b2c108e, + 0x49d073c56bb11a11, + 0x8aab7a1939e4ffd7, + 0xcd095a0b0e38acef, + 0xc9fb60365979f548, + 0x92bde697d67f3422, + 0xc78933e10514bc61, + 0xe1c1d9b975c9b54a, + 0xd2266160cf1bcd80, + 0x9a4492ed78fd8671, + 0xb3ccab2a881a9793, + 0x72cebf667fe1d088, + 0xd6d45b5d985a9427, + }, +}; + +__constant u64 sbob_rc64[12][8] = +{ + { + 0xe9daca1eda5b08b1, + 0x1f7c65c0812fcbeb, + 0x16d0452e43766a2f, + 0xfcc485758db84e71, + 0x0169679291e07c4b, + 0x15d360a4082a42a2, + 0x234d74cc36747605, + 0x0745a6f2596580dd, + }, + { + 0x1a2f9da98ab5a36f, + 0xd7b5700f469de34f, + 0x982b230a72eafef3, + 0x3101b5160f5ed561, + 0x5899d6126b17b59a, + 0xcaa70adbc261b55c, + 0x56cdcbd71ba2dd55, + 0xb79bb121700479e6, + }, + { + 0xc72fce2bacdc74f5, + 0x35843d6a28fc390a, + 0x8b1f9c525f5ef106, + 0x7b7b29b11475eaf2, + 0xb19e3590e40fe2d3, + 0x09db6260373ac9c1, + 0x31db7a8643f4b6c2, + 0xb20aba0af5961e99, + }, + { + 0xd26615e8b3df1fef, + 0xdde4715da0e148f9, + 0x7d3c5c337e858e48, + 0x3f355e68ad1c729d, + 0x75d603ed822cd7a9, + 0xbe0352933313b7d8, + 0xf137e893a1ea5334, + 0x2ed1e384bcbe0c22, + }, + { + 0x994747adac6bea4b, + 0x6323a96c0c413f9a, + 0x4a1086161f1c157f, + 0xbdff0f80d7359e35, + 0xa3f53a254717cdbf, + 0x161a2723b700ffdf, + 0xf563eaa97ea2567a, + 0x57fe6c7cfd581760, + }, + { + 0xd9d33a1daeae4fae, + 0xc039307a3bc3a46f, + 0x6ca44251f9c4662d, + 0xc68ef09ab49a7f18, + 0xb4b79a1cb7a6facf, + 0xb6c6bec2661ff20a, + 0x354f903672c571bf, + 0x6e7d64467a4068fa, + }, + { + 0xecc5aaee160ec7f4, + 0x540924bffe86ac51, + 0xc987bfe6c7c69e39, + 0xc9937a19333e47d3, + 0x372c822dc5ab9209, + 0x04054a2883694706, + 0xf34a3ca24c451735, + 0x93d4143a4d568688, + }, + { + 0xa7c9934d425b1f9b, + 0x41416e0c02aae703, + 0x1ede369c71f8b74e, + 0x9ac4db4d3b44b489, + 0x90069b92cb2b89f4, + 0x2fc4a5d12b8dd169, + 0xd9a8515935c2ac36, + 0x1ee702bfd40d7fa4, + }, + { + 0x9b223116545a8f37, + 0xde5f16ecd89a4c94, + 0x244289251b3a7d3a, + 0x84090de0b755d93c, + 0xb1ceb2db0b440a80, + 0x549c07a69a8a2b7b, + 0x602a1fcb92dc380e, + 0xdb5a238351446172, + }, + { + 0x526f0580a6debeab, + 0xf3f3e4b248e52a38, + 0xdb788aff1ce74189, + 0x0361331b8ae1ff1f, + 0x4b3369af0267e79f, + 0xf452763b306c1e7a, + 0xc3b63b15d1fa9836, + 0xed9c4598fbc7b474, + }, + { + 0xfb89c8efd09ecd7b, + 0x94fe5a63cdc60230, + 0x6107abebbb6bfad8, + 0x7966841421800120, + 0xcab948eaef711d8a, + 0x986e477d1dcdbaef, + 0x5dd86fc04a59a2de, + 0x1b2df381cda4ca6b, + }, + { + 0xba3116f167e78e37, + 0x7ab14904b08013d2, + 0x771ddfbc323ca4cd, + 0x9b9f2130d41220f8, + 0x86cc91189def805d, + 0x5228e188aaa41de7, + 0x991bb2d9d517f4fa, + 0x20d71bf14a92bc48, + }, +}; + +static void streebog_g (u64 h[8], const u64 m[8], __local u64 s_sbob_sl64[8][256]) +{ + u64 k[8]; + u64 s[8]; + u64 t[8]; + + #pragma unroll + for (int i = 0; i < 8; i++) + { + t[i] = h[i]; + } + + for (int i = 0; i < 8; i++) + { + k[i] = SBOG_LPSti64; + } + + #pragma unroll + for (int i = 0; i < 8; i++) + { + s[i] = m[i]; + } + + for (int r = 0; r < 12; r++) + { + #pragma unroll + for (int i = 0; i < 8; i++) + { + t[i] = s[i] ^ k[i]; + } + + #pragma unroll + for (int i = 0; i < 8; i++) + { + s[i] = SBOG_LPSti64; + } + + for (int i = 0; i < 8; i++) + { + t[i] = k[i] ^ sbob_rc64[r][i]; + } + + #pragma unroll + for (int i = 0; i < 8; i++) + { + k[i] = SBOG_LPSti64; + } + } + + #pragma unroll + for (int i = 0; i < 8; i++) + { + h[i] ^= s[i] ^ k[i] ^ m[i]; + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m11800_m04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * shared lookup table + */ + + const u32 lid4 = lid * 4; + + __local u64 s_sbob_sl64[8][256]; + + s_sbob_sl64[0][lid4 + 0] = sbob_sl64[0][lid4 + 0]; + s_sbob_sl64[0][lid4 + 1] = sbob_sl64[0][lid4 + 1]; + s_sbob_sl64[0][lid4 + 2] = sbob_sl64[0][lid4 + 2]; + s_sbob_sl64[0][lid4 + 3] = sbob_sl64[0][lid4 + 3]; + s_sbob_sl64[1][lid4 + 0] = sbob_sl64[1][lid4 + 0]; + s_sbob_sl64[1][lid4 + 1] = sbob_sl64[1][lid4 + 1]; + s_sbob_sl64[1][lid4 + 2] = sbob_sl64[1][lid4 + 2]; + s_sbob_sl64[1][lid4 + 3] = sbob_sl64[1][lid4 + 3]; + s_sbob_sl64[2][lid4 + 0] = sbob_sl64[2][lid4 + 0]; + s_sbob_sl64[2][lid4 + 1] = sbob_sl64[2][lid4 + 1]; + s_sbob_sl64[2][lid4 + 2] = sbob_sl64[2][lid4 + 2]; + s_sbob_sl64[2][lid4 + 3] = sbob_sl64[2][lid4 + 3]; + s_sbob_sl64[3][lid4 + 0] = sbob_sl64[3][lid4 + 0]; + s_sbob_sl64[3][lid4 + 1] = sbob_sl64[3][lid4 + 1]; + s_sbob_sl64[3][lid4 + 2] = sbob_sl64[3][lid4 + 2]; + s_sbob_sl64[3][lid4 + 3] = sbob_sl64[3][lid4 + 3]; + s_sbob_sl64[4][lid4 + 0] = sbob_sl64[4][lid4 + 0]; + s_sbob_sl64[4][lid4 + 1] = sbob_sl64[4][lid4 + 1]; + s_sbob_sl64[4][lid4 + 2] = sbob_sl64[4][lid4 + 2]; + s_sbob_sl64[4][lid4 + 3] = sbob_sl64[4][lid4 + 3]; + s_sbob_sl64[5][lid4 + 0] = sbob_sl64[5][lid4 + 0]; + s_sbob_sl64[5][lid4 + 1] = sbob_sl64[5][lid4 + 1]; + s_sbob_sl64[5][lid4 + 2] = sbob_sl64[5][lid4 + 2]; + s_sbob_sl64[5][lid4 + 3] = sbob_sl64[5][lid4 + 3]; + s_sbob_sl64[6][lid4 + 0] = sbob_sl64[6][lid4 + 0]; + s_sbob_sl64[6][lid4 + 1] = sbob_sl64[6][lid4 + 1]; + s_sbob_sl64[6][lid4 + 2] = sbob_sl64[6][lid4 + 2]; + s_sbob_sl64[6][lid4 + 3] = sbob_sl64[6][lid4 + 3]; + s_sbob_sl64[7][lid4 + 0] = sbob_sl64[7][lid4 + 0]; + s_sbob_sl64[7][lid4 + 1] = sbob_sl64[7][lid4 + 1]; + s_sbob_sl64[7][lid4 + 2] = sbob_sl64[7][lid4 + 2]; + s_sbob_sl64[7][lid4 + 3] = sbob_sl64[7][lid4 + 3]; + + barrier (CLK_LOCAL_MEM_FENCE); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + u32x pw_buf1[4]; + + pw_buf1[0] = pws[gid].i[ 4]; + pw_buf1[1] = pws[gid].i[ 5]; + pw_buf1[2] = pws[gid].i[ 6]; + pw_buf1[3] = pws[gid].i[ 7]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w[16]; + + w[ 0] = pw_buf0[0]; + w[ 1] = pw_buf0[1]; + w[ 2] = pw_buf0[2]; + w[ 3] = pw_buf0[3]; + w[ 4] = pw_buf1[0]; + w[ 5] = pw_buf1[1]; + w[ 6] = pw_buf1[2]; + w[ 7] = pw_buf1[3]; + w[ 8] = 0; + w[ 9] = 0; + w[10] = 0; + w[11] = 0; + w[12] = 0; + w[13] = 0; + w[14] = 0; + w[15] = 0; + + const u32 out_len = apply_rules (rules_buf[il_pos].cmds, &w[0], &w[1], pw_len); + + append_0x01_2 (&w[0], &w[1], out_len); + + /** + * reverse message block + */ + + u64 m[8]; + + m[0] = hl32_to_64 (w[15], w[14]); + m[1] = hl32_to_64 (w[13], w[12]); + m[2] = hl32_to_64 (w[11], w[10]); + m[3] = hl32_to_64 (w[ 9], w[ 8]); + m[4] = hl32_to_64 (w[ 7], w[ 6]); + m[5] = hl32_to_64 (w[ 5], w[ 4]); + m[6] = hl32_to_64 (w[ 3], w[ 2]); + m[7] = hl32_to_64 (w[ 1], w[ 0]); + + m[0] = swap_workaround (m[0]); + m[1] = swap_workaround (m[1]); + m[2] = swap_workaround (m[2]); + m[3] = swap_workaround (m[3]); + m[4] = swap_workaround (m[4]); + m[5] = swap_workaround (m[5]); + m[6] = swap_workaround (m[6]); + m[7] = swap_workaround (m[7]); + + // state buffer (hash) + + u64 h[8]; + + h[0] = INITVAL; + h[1] = INITVAL; + h[2] = INITVAL; + h[3] = INITVAL; + h[4] = INITVAL; + h[5] = INITVAL; + h[6] = INITVAL; + h[7] = INITVAL; + + streebog_g (h, m, s_sbob_sl64); + + u64 z[8]; + + z[0] = 0; + z[1] = 0; + z[2] = 0; + z[3] = 0; + z[4] = 0; + z[5] = 0; + z[6] = 0; + z[7] = swap_workaround ((u64) (out_len * 8)); + + streebog_g (h, z, s_sbob_sl64); + streebog_g (h, m, s_sbob_sl64); + + const u32 r0 = l32_from_64 (h[0]); + const u32 r1 = h32_from_64 (h[0]); + const u32 r2 = l32_from_64 (h[1]); + const u32 r3 = h32_from_64 (h[1]); + + #include VECT_COMPARE_M + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m11800_m08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m11800_m16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m11800_s04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + + /** + * shared lookup table + */ + + const u32 lid4 = lid * 4; + + __local u64 s_sbob_sl64[8][256]; + + s_sbob_sl64[0][lid4 + 0] = sbob_sl64[0][lid4 + 0]; + s_sbob_sl64[0][lid4 + 1] = sbob_sl64[0][lid4 + 1]; + s_sbob_sl64[0][lid4 + 2] = sbob_sl64[0][lid4 + 2]; + s_sbob_sl64[0][lid4 + 3] = sbob_sl64[0][lid4 + 3]; + s_sbob_sl64[1][lid4 + 0] = sbob_sl64[1][lid4 + 0]; + s_sbob_sl64[1][lid4 + 1] = sbob_sl64[1][lid4 + 1]; + s_sbob_sl64[1][lid4 + 2] = sbob_sl64[1][lid4 + 2]; + s_sbob_sl64[1][lid4 + 3] = sbob_sl64[1][lid4 + 3]; + s_sbob_sl64[2][lid4 + 0] = sbob_sl64[2][lid4 + 0]; + s_sbob_sl64[2][lid4 + 1] = sbob_sl64[2][lid4 + 1]; + s_sbob_sl64[2][lid4 + 2] = sbob_sl64[2][lid4 + 2]; + s_sbob_sl64[2][lid4 + 3] = sbob_sl64[2][lid4 + 3]; + s_sbob_sl64[3][lid4 + 0] = sbob_sl64[3][lid4 + 0]; + s_sbob_sl64[3][lid4 + 1] = sbob_sl64[3][lid4 + 1]; + s_sbob_sl64[3][lid4 + 2] = sbob_sl64[3][lid4 + 2]; + s_sbob_sl64[3][lid4 + 3] = sbob_sl64[3][lid4 + 3]; + s_sbob_sl64[4][lid4 + 0] = sbob_sl64[4][lid4 + 0]; + s_sbob_sl64[4][lid4 + 1] = sbob_sl64[4][lid4 + 1]; + s_sbob_sl64[4][lid4 + 2] = sbob_sl64[4][lid4 + 2]; + s_sbob_sl64[4][lid4 + 3] = sbob_sl64[4][lid4 + 3]; + s_sbob_sl64[5][lid4 + 0] = sbob_sl64[5][lid4 + 0]; + s_sbob_sl64[5][lid4 + 1] = sbob_sl64[5][lid4 + 1]; + s_sbob_sl64[5][lid4 + 2] = sbob_sl64[5][lid4 + 2]; + s_sbob_sl64[5][lid4 + 3] = sbob_sl64[5][lid4 + 3]; + s_sbob_sl64[6][lid4 + 0] = sbob_sl64[6][lid4 + 0]; + s_sbob_sl64[6][lid4 + 1] = sbob_sl64[6][lid4 + 1]; + s_sbob_sl64[6][lid4 + 2] = sbob_sl64[6][lid4 + 2]; + s_sbob_sl64[6][lid4 + 3] = sbob_sl64[6][lid4 + 3]; + s_sbob_sl64[7][lid4 + 0] = sbob_sl64[7][lid4 + 0]; + s_sbob_sl64[7][lid4 + 1] = sbob_sl64[7][lid4 + 1]; + s_sbob_sl64[7][lid4 + 2] = sbob_sl64[7][lid4 + 2]; + s_sbob_sl64[7][lid4 + 3] = sbob_sl64[7][lid4 + 3]; + + barrier (CLK_LOCAL_MEM_FENCE); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + u32x pw_buf1[4]; + + pw_buf1[0] = pws[gid].i[ 4]; + pw_buf1[1] = pws[gid].i[ 5]; + pw_buf1[2] = pws[gid].i[ 6]; + pw_buf1[3] = pws[gid].i[ 7]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w[16]; + + w[ 0] = pw_buf0[0]; + w[ 1] = pw_buf0[1]; + w[ 2] = pw_buf0[2]; + w[ 3] = pw_buf0[3]; + w[ 4] = pw_buf1[0]; + w[ 5] = pw_buf1[1]; + w[ 6] = pw_buf1[2]; + w[ 7] = pw_buf1[3]; + w[ 8] = 0; + w[ 9] = 0; + w[10] = 0; + w[11] = 0; + w[12] = 0; + w[13] = 0; + w[14] = 0; + w[15] = 0; + + const u32 out_len = apply_rules (rules_buf[il_pos].cmds, &w[0], &w[1], pw_len); + + append_0x01_2 (&w[0], &w[1], out_len); + + /** + * reverse message block + */ + + u64 m[8]; + + m[0] = hl32_to_64 (w[15], w[14]); + m[1] = hl32_to_64 (w[13], w[12]); + m[2] = hl32_to_64 (w[11], w[10]); + m[3] = hl32_to_64 (w[ 9], w[ 8]); + m[4] = hl32_to_64 (w[ 7], w[ 6]); + m[5] = hl32_to_64 (w[ 5], w[ 4]); + m[6] = hl32_to_64 (w[ 3], w[ 2]); + m[7] = hl32_to_64 (w[ 1], w[ 0]); + + m[0] = swap_workaround (m[0]); + m[1] = swap_workaround (m[1]); + m[2] = swap_workaround (m[2]); + m[3] = swap_workaround (m[3]); + m[4] = swap_workaround (m[4]); + m[5] = swap_workaround (m[5]); + m[6] = swap_workaround (m[6]); + m[7] = swap_workaround (m[7]); + + // state buffer (hash) + + u64 h[8]; + + h[0] = INITVAL; + h[1] = INITVAL; + h[2] = INITVAL; + h[3] = INITVAL; + h[4] = INITVAL; + h[5] = INITVAL; + h[6] = INITVAL; + h[7] = INITVAL; + + streebog_g (h, m, s_sbob_sl64); + + u64 z[8]; + + z[0] = 0; + z[1] = 0; + z[2] = 0; + z[3] = 0; + z[4] = 0; + z[5] = 0; + z[6] = 0; + z[7] = swap_workaround ((u64) (out_len * 8)); + + streebog_g (h, z, s_sbob_sl64); + streebog_g (h, m, s_sbob_sl64); + + const u32 r0 = l32_from_64 (h[0]); + const u32 r1 = h32_from_64 (h[0]); + const u32 r2 = l32_from_64 (h[1]); + const u32 r3 = h32_from_64 (h[1]); + + #include VECT_COMPARE_S + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m11800_s08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m11800_s16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/amd/m11800_a1.cl b/amd/m11800_a1.cl new file mode 100644 index 0000000000..2b76d2f67c --- /dev/null +++ b/amd/m11800_a1.cl @@ -0,0 +1,2781 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _GOST2012_512_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW4 +#define VECT_SIZE1 +#endif + +#ifdef VLIW5 +#define VECT_SIZE1 +#endif + +#define DGST_R0 0 +#define DGST_R1 1 +#define DGST_R2 2 +#define DGST_R3 3 + +#include "include/kernel_functions.c" +#include "types_amd.c" +#include "common_amd.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + + +#define INITVAL 0 + +#define SBOG_LPSti64 \ + s_sbob_sl64[0][(t[0] >> (i * 8)) & 0xff] ^ \ + s_sbob_sl64[1][(t[1] >> (i * 8)) & 0xff] ^ \ + s_sbob_sl64[2][(t[2] >> (i * 8)) & 0xff] ^ \ + s_sbob_sl64[3][(t[3] >> (i * 8)) & 0xff] ^ \ + s_sbob_sl64[4][(t[4] >> (i * 8)) & 0xff] ^ \ + s_sbob_sl64[5][(t[5] >> (i * 8)) & 0xff] ^ \ + s_sbob_sl64[6][(t[6] >> (i * 8)) & 0xff] ^ \ + s_sbob_sl64[7][(t[7] >> (i * 8)) & 0xff] + +// constants + +__constant u64 sbob_sl64[8][256] = +{ + { + 0xd031c397ce553fe6, + 0x16ba5b01b006b525, + 0xa89bade6296e70c8, + 0x6a1f525d77d3435b, + 0x6e103570573dfa0b, + 0x660efb2a17fc95ab, + 0x76327a9e97634bf6, + 0x4bad9d6462458bf5, + 0xf1830caedbc3f748, + 0xc5c8f542669131ff, + 0x95044a1cdc48b0cb, + 0x892962df3cf8b866, + 0xb0b9e208e930c135, + 0xa14fb3f0611a767c, + 0x8d2605f21c160136, + 0xd6b71922fecc549e, + 0x37089438a5907d8b, + 0x0b5da38e5803d49c, + 0x5a5bcc9cea6f3cbc, + 0xedae246d3b73ffe5, + 0xd2b87e0fde22edce, + 0x5e54abb1ca8185ec, + 0x1de7f88fe80561b9, + 0xad5e1a870135a08c, + 0x2f2adbd665cecc76, + 0x5780b5a782f58358, + 0x3edc8a2eede47b3f, + 0xc9d95c3506bee70f, + 0x83be111d6c4e05ee, + 0xa603b90959367410, + 0x103c81b4809fde5d, + 0x2c69b6027d0c774a, + 0x399080d7d5c87953, + 0x09d41e16487406b4, + 0xcdd63b1826505e5f, + 0xf99dc2f49b0298e8, + 0x9cd0540a943cb67f, + 0xbca84b7f891f17c5, + 0x723d1db3b78df2a6, + 0x78aa6e71e73b4f2e, + 0x1433e699a071670d, + 0x84f21be454620782, + 0x98df3327b4d20f2f, + 0xf049dce2d3769e5c, + 0xdb6c60199656eb7a, + 0x648746b2078b4783, + 0x32cd23598dcbadcf, + 0x1ea4955bf0c7da85, + 0xe9a143401b9d46b5, + 0xfd92a5d9bbec21b8, + 0xc8138c790e0b8e1b, + 0x2ee00b9a6d7ba562, + 0xf85712b893b7f1fc, + 0xeb28fed80bea949d, + 0x564a65eb8a40ea4c, + 0x6c9988e8474a2823, + 0x4535898b121d8f2d, + 0xabd8c03231accbf4, + 0xba2e91cab9867cbd, + 0x7960be3def8e263a, + 0x0c11a977602fd6f0, + 0xcb50e1ad16c93527, + 0xeae22e94035ffd89, + 0x2866d12f5de2ce1a, + 0xff1b1841ab9bf390, + 0x9f9339de8cfe0d43, + 0x964727c8c48a0bf7, + 0x524502c6aaae531c, + 0x9b9c5ef3ac10b413, + 0x4fa2fa4942ab32a5, + 0x3f165a62e551122b, + 0xc74148da76e6e3d7, + 0x924840e5e464b2a7, + 0xd372ae43d69784da, + 0x233b72a105e11a86, + 0xa48a04914941a638, + 0xb4b68525c9de7865, + 0xddeabaaca6cf8002, + 0x0a9773c250b6bd88, + 0xc284ffbb5ebd3393, + 0x8ba0df472c8f6a4e, + 0x2aef6cb74d951c32, + 0x427983722a318d41, + 0x73f7cdffbf389bb2, + 0x074c0af9382c026c, + 0x8a6a0f0b243a035a, + 0x6fdae53c5f88931f, + 0xc68b98967e538ac3, + 0x44ff59c71aa8e639, + 0xe2fce0ce439e9229, + 0xa20cde2479d8cd40, + 0x19e89fa2c8ebd8e9, + 0xf446bbcff398270c, + 0x43b3533e2284e455, + 0xd82f0dcd8e945046, + 0x51066f12b26ce820, + 0xe73957af6bc5426d, + 0x081ece5a40c16fa0, + 0x3b193d4fc5bfab7b, + 0x7fe66488df174d42, + 0x0e9814ef705804d8, + 0x8137ac857c39d7c6, + 0xb1733244e185a821, + 0x695c3f896f11f867, + 0xf6cf0657e3eff524, + 0x1aabf276d02963d5, + 0x2da3664e75b91e5e, + 0x0289bd981077d228, + 0x90c1fd7df413608f, + 0x3c5537b6fd93a917, + 0xaa12107e3919a2e0, + 0x0686dab530996b78, + 0xdaa6b0559ee3826e, + 0xc34e2ff756085a87, + 0x6d5358a44fff4137, + 0xfc587595b35948ac, + 0x7ca5095cc7d5f67e, + 0xfb147f6c8b754ac0, + 0xbfeb26ab91ddacf9, + 0x6896efc567a49173, + 0xca9a31e11e7c5c33, + 0xbbe44186b13315a9, + 0x0ddb793b689abfe4, + 0x70b4a02ba7fa208e, + 0xe47a3a7b7307f951, + 0x8cecd5be14a36822, + 0xeeed49b923b144d9, + 0x17708b4db8b3dc31, + 0x6088219f2765fed3, + 0xb3fa8fdcf1f27a09, + 0x910b2d31fca6099b, + 0x0f52c4a378ed6dcc, + 0x50ccbf5ebad98134, + 0x6bd582117f662a4f, + 0x94ce9a50d4fdd9df, + 0x2b25bcfb45207526, + 0x67c42b661f49fcbf, + 0x492420fc723259dd, + 0x03436dd418c2bb3c, + 0x1f6e4517f872b391, + 0xa08563bc69af1f68, + 0xd43ea4baeebb86b6, + 0x01cad04c08b56914, + 0xac94cacb0980c998, + 0x54c3d8739a373864, + 0x26fec5c02dbacac2, + 0xdea9d778be0d3b3e, + 0x040f672d20eeb950, + 0xe5b0ea377bb29045, + 0xf30ab136cbb42560, + 0x62019c0737122cfb, + 0xe86b930c13282fa1, + 0xcc1ceb542ee5374b, + 0x538fd28aa21b3a08, + 0x1b61223ad89c0ac1, + 0x36c24474ad25149f, + 0x7a23d3e9f74c9d06, + 0xbe21f6e79968c5ed, + 0xcf5f868036278c77, + 0xf705d61beb5a9c30, + 0x4d2b47d152dce08d, + 0x5f9e7bfdc234ecf8, + 0x247778583dcd18ea, + 0x867ba67c4415d5aa, + 0x4ce1979d5a698999, + 0x0000000000000000, + 0xec64f42133c696f1, + 0xb57c5569c16b1171, + 0xc1c7926f467f88af, + 0x654d96fe0f3e2e97, + 0x15f936d5a8c40e19, + 0xb8a72c52a9f1ae95, + 0xa9517daa21db19dc, + 0x58d27104fa18ee94, + 0x5918a148f2ad8780, + 0x5cdd1629daf657c4, + 0x8274c15164fb6cfa, + 0xd1fb13dbc6e056f2, + 0x7d6fd910cf609f6a, + 0xb63f38bdd9a9aa4d, + 0x3d9fe7faf526c003, + 0x74bbc706871499de, + 0xdf630734b6b8522a, + 0x3ad3ed03cd0ac26f, + 0xfadeaf2083c023d4, + 0xc00d42234ecae1bb, + 0x8538cba85cd76e96, + 0xc402250e6e2458eb, + 0x47bc3413026a5d05, + 0xafd7a71f114272a4, + 0x978df784cc3f62e3, + 0xb96dfc1ea144c781, + 0x21b2cf391596c8ae, + 0x318e4e8d950916f3, + 0xce9556cc3e92e563, + 0x385a509bdd7d1047, + 0x358129a0b5e7afa3, + 0xe6f387e363702b79, + 0xe0755d5653e94001, + 0x7be903a5fff9f412, + 0x12b53c2c90e80c75, + 0x3307f315857ec4db, + 0x8fafb86a0c61d31e, + 0xd9e5dd8186213952, + 0x77f8aad29fd622e2, + 0x25bda814357871fe, + 0x7571174a8fa1f0ca, + 0x137fec60985d6561, + 0x30449ec19dbc7fe7, + 0xa540d4dd41f4cf2c, + 0xdc206ae0ae7ae916, + 0x5b911cd0e2da55a8, + 0xb2305f90f947131d, + 0x344bf9ecbd52c6b7, + 0x5d17c665d2433ed0, + 0x18224feec05eb1fd, + 0x9e59e992844b6457, + 0x9a568ebfa4a5dd07, + 0xa3c60e68716da454, + 0x7e2cb4c4d7a22456, + 0x87b176304ca0bcbe, + 0x413aeea632f3367d, + 0x9915e36bbc67663b, + 0x40f03eea3a465f69, + 0x1c2d28c3e0b008ad, + 0x4e682a054a1e5bb1, + 0x05c5b761285bd044, + 0xe1bf8d1a5b5c2915, + 0xf2c0617ac3014c74, + 0xb7f5e8f1d11cc359, + 0x63cb4c4b3fa745ef, + 0x9d1a84469c89df6b, + 0xe33630824b2bfb3d, + 0xd5f474f6e60eefa2, + 0xf58c6b83fb2d4e18, + 0x4676e45f0adf3411, + 0x20781f751d23a1ba, + 0xbd629b3381aa7ed1, + 0xae1d775319f71bb0, + 0xfed1c80da32e9a84, + 0x5509083f92825170, + 0x29ac01635557a70e, + 0xa7c9694551831d04, + 0x8e65682604d4ba0a, + 0x11f651f8882ab749, + 0xd77dc96ef6793d8a, + 0xef2799f52b042dcd, + 0x48eef0b07a8730c9, + 0x22f1a2ed0d547392, + 0x6142f1d32fd097c7, + 0x4a674d286af0e2e1, + 0x80fd7cc9748cbed2, + 0x717e7067af4f499a, + 0x938290a9ecd1dbb3, + 0x88e3b293344dd172, + 0x2734158c250fa3d6, + }, + { + 0x7e37e62dfc7d40c3, + 0x776f25a4ee939e5b, + 0xe045c850dd8fb5ad, + 0x86ed5ba711ff1952, + 0xe91d0bd9cf616b35, + 0x37e0ab256e408ffb, + 0x9607f6c031025a7a, + 0x0b02f5e116d23c9d, + 0xf3d8486bfb50650c, + 0x621cff27c40875f5, + 0x7d40cb71fa5fd34a, + 0x6daa6616daa29062, + 0x9f5f354923ec84e2, + 0xec847c3dc507c3b3, + 0x025a3668043ce205, + 0xa8bf9e6c4dac0b19, + 0xfa808be2e9bebb94, + 0xb5b99c5277c74fa3, + 0x78d9bc95f0397bcc, + 0xe332e50cdbad2624, + 0xc74fce129332797e, + 0x1729eceb2ea709ab, + 0xc2d6b9f69954d1f8, + 0x5d898cbfbab8551a, + 0x859a76fb17dd8adb, + 0x1be85886362f7fb5, + 0xf6413f8ff136cd8a, + 0xd3110fa5bbb7e35c, + 0x0a2feed514cc4d11, + 0xe83010edcd7f1ab9, + 0xa1e75de55f42d581, + 0xeede4a55c13b21b6, + 0xf2f5535ff94e1480, + 0x0cc1b46d1888761e, + 0xbce15fdb6529913b, + 0x2d25e8975a7181c2, + 0x71817f1ce2d7a554, + 0x2e52c5cb5c53124b, + 0xf9f7a6beef9c281d, + 0x9e722e7d21f2f56e, + 0xce170d9b81dca7e6, + 0x0e9b82051cb4941b, + 0x1e712f623c49d733, + 0x21e45cfa42f9f7dc, + 0xcb8e7a7f8bba0f60, + 0x8e98831a010fb646, + 0x474ccf0d8e895b23, + 0xa99285584fb27a95, + 0x8cc2b57205335443, + 0x42d5b8e984eff3a5, + 0x012d1b34021e718c, + 0x57a6626aae74180b, + 0xff19fc06e3d81312, + 0x35ba9d4d6a7c6dfe, + 0xc9d44c178f86ed65, + 0x506523e6a02e5288, + 0x03772d5c06229389, + 0x8b01f4fe0b691ec0, + 0xf8dabd8aed825991, + 0x4c4e3aec985b67be, + 0xb10df0827fbf96a9, + 0x6a69279ad4f8dae1, + 0xe78689dcd3d5ff2e, + 0x812e1a2b1fa553d1, + 0xfbad90d6eba0ca18, + 0x1ac543b234310e39, + 0x1604f7df2cb97827, + 0xa6241c6951189f02, + 0x753513cceaaf7c5e, + 0x64f2a59fc84c4efa, + 0x247d2b1e489f5f5a, + 0xdb64d718ab474c48, + 0x79f4a7a1f2270a40, + 0x1573da832a9bebae, + 0x3497867968621c72, + 0x514838d2a2302304, + 0xf0af6537fd72f685, + 0x1d06023e3a6b44ba, + 0x678588c3ce6edd73, + 0x66a893f7cc70acff, + 0xd4d24e29b5eda9df, + 0x3856321470ea6a6c, + 0x07c3418c0e5a4a83, + 0x2bcbb22f5635bacd, + 0x04b46cd00878d90a, + 0x06ee5ab80c443b0f, + 0x3b211f4876c8f9e5, + 0x0958c38912eede98, + 0xd14b39cdbf8b0159, + 0x397b292072f41be0, + 0x87c0409313e168de, + 0xad26e98847caa39f, + 0x4e140c849c6785bb, + 0xd5ff551db7f3d853, + 0xa0ca46d15d5ca40d, + 0xcd6020c787fe346f, + 0x84b76dcf15c3fb57, + 0xdefda0fca121e4ce, + 0x4b8d7b6096012d3d, + 0x9ac642ad298a2c64, + 0x0875d8bd10f0af14, + 0xb357c6ea7b8374ac, + 0x4d6321d89a451632, + 0xeda96709c719b23f, + 0xf76c24bbf328bc06, + 0xc662d526912c08f2, + 0x3ce25ec47892b366, + 0xb978283f6f4f39bd, + 0xc08c8f9e9d6833fd, + 0x4f3917b09e79f437, + 0x593de06fb2c08c10, + 0xd6887841b1d14bda, + 0x19b26eee32139db0, + 0xb494876675d93e2f, + 0x825937771987c058, + 0x90e9ac783d466175, + 0xf1827e03ff6c8709, + 0x945dc0a8353eb87f, + 0x4516f9658ab5b926, + 0x3f9573987eb020ef, + 0xb855330b6d514831, + 0x2ae6a91b542bcb41, + 0x6331e413c6160479, + 0x408f8e8180d311a0, + 0xeff35161c325503a, + 0xd06622f9bd9570d5, + 0x8876d9a20d4b8d49, + 0xa5533135573a0c8b, + 0xe168d364df91c421, + 0xf41b09e7f50a2f8f, + 0x12b09b0f24c1a12d, + 0xda49cc2ca9593dc4, + 0x1f5c34563e57a6bf, + 0x54d14f36a8568b82, + 0xaf7cdfe043f6419a, + 0xea6a2685c943f8bc, + 0xe5dcbfb4d7e91d2b, + 0xb27addde799d0520, + 0x6b443caed6e6ab6d, + 0x7bae91c9f61be845, + 0x3eb868ac7cae5163, + 0x11c7b65322e332a4, + 0xd23c1491b9a992d0, + 0x8fb5982e0311c7ca, + 0x70ac6428e0c9d4d8, + 0x895bc2960f55fcc5, + 0x76423e90ec8defd7, + 0x6ff0507ede9e7267, + 0x3dcf45f07a8cc2ea, + 0x4aa06054941f5cb1, + 0x5810fb5bb0defd9c, + 0x5efea1e3bc9ac693, + 0x6edd4b4adc8003eb, + 0x741808f8e8b10dd2, + 0x145ec1b728859a22, + 0x28bc9f7350172944, + 0x270a06424ebdccd3, + 0x972aedf4331c2bf6, + 0x059977e40a66a886, + 0x2550302a4a812ed6, + 0xdd8a8da0a7037747, + 0xc515f87a970e9b7b, + 0x3023eaa9601ac578, + 0xb7e3aa3a73fbada6, + 0x0fb699311eaae597, + 0x0000000000000000, + 0x310ef19d6204b4f4, + 0x229371a644db6455, + 0x0decaf591a960792, + 0x5ca4978bb8a62496, + 0x1c2b190a38753536, + 0x41a295b582cd602c, + 0x3279dcc16426277d, + 0xc1a194aa9f764271, + 0x139d803b26dfd0a1, + 0xae51c4d441e83016, + 0xd813fa44ad65dfc1, + 0xac0bf2bc45d4d213, + 0x23be6a9246c515d9, + 0x49d74d08923dcf38, + 0x9d05032127d066e7, + 0x2f7fdeff5e4d63c7, + 0xa47e2a0155247d07, + 0x99b16ff12fa8bfed, + 0x4661d4398c972aaf, + 0xdfd0bbc8a33f9542, + 0xdca79694a51d06cb, + 0xb020ebb67da1e725, + 0xba0f0563696daa34, + 0xe4f1a480d5f76ca7, + 0xc438e34e9510eaf7, + 0x939e81243b64f2fc, + 0x8defae46072d25cf, + 0x2c08f3a3586ff04e, + 0xd7a56375b3cf3a56, + 0x20c947ce40e78650, + 0x43f8a3dd86f18229, + 0x568b795eac6a6987, + 0x8003011f1dbb225d, + 0xf53612d3f7145e03, + 0x189f75da300dec3c, + 0x9570db9c3720c9f3, + 0xbb221e576b73dbb8, + 0x72f65240e4f536dd, + 0x443be25188abc8aa, + 0xe21ffe38d9b357a8, + 0xfd43ca6ee7e4f117, + 0xcaa3614b89a47eec, + 0xfe34e732e1c6629e, + 0x83742c431b99b1d4, + 0xcf3a16af83c2d66a, + 0xaae5a8044990e91c, + 0x26271d764ca3bd5f, + 0x91c4b74c3f5810f9, + 0x7c6dd045f841a2c6, + 0x7f1afd19fe63314f, + 0xc8f957238d989ce9, + 0xa709075d5306ee8e, + 0x55fc5402aa48fa0e, + 0x48fa563c9023beb4, + 0x65dfbeabca523f76, + 0x6c877d22d8bce1ee, + 0xcc4d3bf385e045e3, + 0xbebb69b36115733e, + 0x10eaad6720fd4328, + 0xb6ceb10e71e5dc2a, + 0xbdcc44ef6737e0b7, + 0x523f158ea412b08d, + 0x989c74c52db6ce61, + 0x9beb59992b945de8, + 0x8a2cefca09776f4c, + 0xa3bd6b8d5b7e3784, + 0xeb473db1cb5d8930, + 0xc3fba2c29b4aa074, + 0x9c28181525ce176b, + 0x683311f2d0c438e4, + 0x5fd3bad7be84b71f, + 0xfc6ed15ae5fa809b, + 0x36cdb0116c5efe77, + 0x29918447520958c8, + 0xa29070b959604608, + 0x53120ebaa60cc101, + 0x3a0c047c74d68869, + 0x691e0ac6d2da4968, + 0x73db4974e6eb4751, + 0x7a838afdf40599c9, + 0x5a4acd33b4e21f99, + 0x6046c94fc03497f0, + 0xe6ab92e8d1cb8ea2, + 0x3354c7f5663856f1, + 0xd93ee170af7bae4d, + 0x616bd27bc22ae67c, + 0x92b39a10397a8370, + 0xabc8b3304b8e9890, + 0xbf967287630b02b2, + 0x5b67d607b6fc6e15, + }, + { + 0x8ab0a96846e06a6d, + 0x43c7e80b4bf0b33a, + 0x08c9b3546b161ee5, + 0x39f1c235eba990be, + 0xc1bef2376606c7b2, + 0x2c209233614569aa, + 0xeb01523b6fc3289a, + 0x946953ab935acedd, + 0x272838f63e13340e, + 0x8b0455eca12ba052, + 0x77a1b2c4978ff8a2, + 0xa55122ca13e54086, + 0x2276135862d3f1cd, + 0xdb8ddfde08b76cfe, + 0x5d1e12c89e4a178a, + 0x0e56816b03969867, + 0xee5f79953303ed59, + 0xafed748bab78d71d, + 0x6d929f2df93e53ee, + 0xf5d8a8f8ba798c2a, + 0xf619b1698e39cf6b, + 0x95ddaf2f749104e2, + 0xec2a9c80e0886427, + 0xce5c8fd8825b95ea, + 0xc4e0d9993ac60271, + 0x4699c3a5173076f9, + 0x3d1b151f50a29f42, + 0x9ed505ea2bc75946, + 0x34665acfdc7f4b98, + 0x61b1fb53292342f7, + 0xc721c0080e864130, + 0x8693cd1696fd7b74, + 0x872731927136b14b, + 0xd3446c8a63a1721b, + 0x669a35e8a6680e4a, + 0xcab658f239509a16, + 0xa4e5de4ef42e8ab9, + 0x37a7435ee83f08d9, + 0x134e6239e26c7f96, + 0x82791a3c2df67488, + 0x3f6ef00a8329163c, + 0x8e5a7e42fdeb6591, + 0x5caaee4c7981ddb5, + 0x19f234785af1e80d, + 0x255ddde3ed98bd70, + 0x50898a32a99cccac, + 0x28ca4519da4e6656, + 0xae59880f4cb31d22, + 0x0d9798fa37d6db26, + 0x32f968f0b4ffcd1a, + 0xa00f09644f258545, + 0xfa3ad5175e24de72, + 0xf46c547c5db24615, + 0x713e80fbff0f7e20, + 0x7843cf2b73d2aafa, + 0xbd17ea36aedf62b4, + 0xfd111bacd16f92cf, + 0x4abaa7dbc72d67e0, + 0xb3416b5dad49fad3, + 0xbca316b24914a88b, + 0x15d150068aecf914, + 0xe27c1debe31efc40, + 0x4fe48c759beda223, + 0x7edcfd141b522c78, + 0x4e5070f17c26681c, + 0xe696cac15815f3bc, + 0x35d2a64b3bb481a7, + 0x800cff29fe7dfdf6, + 0x1ed9fac3d5baa4b0, + 0x6c2663a91ef599d1, + 0x03c1199134404341, + 0xf7ad4ded69f20554, + 0xcd9d9649b61bd6ab, + 0xc8c3bde7eadb1368, + 0xd131899fb02afb65, + 0x1d18e352e1fae7f1, + 0xda39235aef7ca6c1, + 0xa1bbf5e0a8ee4f7a, + 0x91377805cf9a0b1e, + 0x3138716180bf8e5b, + 0xd9f83acbdb3ce580, + 0x0275e515d38b897e, + 0x472d3f21f0fbbcc6, + 0x2d946eb7868ea395, + 0xba3c248d21942e09, + 0xe7223645bfde3983, + 0xff64feb902e41bb1, + 0xc97741630d10d957, + 0xc3cb1722b58d4ecc, + 0xa27aec719cae0c3b, + 0x99fecb51a48c15fb, + 0x1465ac826d27332b, + 0xe1bd047ad75ebf01, + 0x79f733af941960c5, + 0x672ec96c41a3c475, + 0xc27feba6524684f3, + 0x64efd0fd75e38734, + 0xed9e60040743ae18, + 0xfb8e2993b9ef144d, + 0x38453eb10c625a81, + 0x6978480742355c12, + 0x48cf42ce14a6ee9e, + 0x1cac1fd606312dce, + 0x7b82d6ba4792e9bb, + 0x9d141c7b1f871a07, + 0x5616b80dc11c4a2e, + 0xb849c198f21fa777, + 0x7ca91801c8d9a506, + 0xb1348e487ec273ad, + 0x41b20d1e987b3a44, + 0x7460ab55a3cfbbe3, + 0x84e628034576f20a, + 0x1b87d16d897a6173, + 0x0fe27defe45d5258, + 0x83cde6b8ca3dbeb7, + 0x0c23647ed01d1119, + 0x7a362a3ea0592384, + 0xb61f40f3f1893f10, + 0x75d457d1440471dc, + 0x4558da34237035b8, + 0xdca6116587fc2043, + 0x8d9b67d3c9ab26d0, + 0x2b0b5c88ee0e2517, + 0x6fe77a382ab5da90, + 0x269cc472d9d8fe31, + 0x63c41e46faa8cb89, + 0xb7abbc771642f52f, + 0x7d1de4852f126f39, + 0xa8c6ba3024339ba0, + 0x600507d7cee888c8, + 0x8fee82c61a20afae, + 0x57a2448926d78011, + 0xfca5e72836a458f0, + 0x072bcebb8f4b4cbd, + 0x497bbe4af36d24a1, + 0x3cafe99bb769557d, + 0x12fa9ebd05a7b5a9, + 0xe8c04baa5b836bdb, + 0x4273148fac3b7905, + 0x908384812851c121, + 0xe557d3506c55b0fd, + 0x72ff996acb4f3d61, + 0x3eda0c8e64e2dc03, + 0xf0868356e6b949e9, + 0x04ead72abb0b0ffc, + 0x17a4b5135967706a, + 0xe3c8e16f04d5367f, + 0xf84f30028daf570c, + 0x1846c8fcbd3a2232, + 0x5b8120f7f6ca9108, + 0xd46fa231ecea3ea6, + 0x334d947453340725, + 0x58403966c28ad249, + 0xbed6f3a79a9f21f5, + 0x68ccb483a5fe962d, + 0xd085751b57e1315a, + 0xfed0023de52fd18e, + 0x4b0e5b5f20e6addf, + 0x1a332de96eb1ab4c, + 0xa3ce10f57b65c604, + 0x108f7ba8d62c3cd7, + 0xab07a3a11073d8e1, + 0x6b0dad1291bed56c, + 0xf2f366433532c097, + 0x2e557726b2cee0d4, + 0x0000000000000000, + 0xcb02a476de9b5029, + 0xe4e32fd48b9e7ac2, + 0x734b65ee2c84f75e, + 0x6e5386bccd7e10af, + 0x01b4fc84e7cbca3f, + 0xcfe8735c65905fd5, + 0x3613bfda0ff4c2e6, + 0x113b872c31e7f6e8, + 0x2fe18ba255052aeb, + 0xe974b72ebc48a1e4, + 0x0abc5641b89d979b, + 0xb46aa5e62202b66e, + 0x44ec26b0c4bbff87, + 0xa6903b5b27a503c7, + 0x7f680190fc99e647, + 0x97a84a3aa71a8d9c, + 0xdd12ede16037ea7c, + 0xc554251ddd0dc84e, + 0x88c54c7d956be313, + 0x4d91696048662b5d, + 0xb08072cc9909b992, + 0xb5de5962c5c97c51, + 0x81b803ad19b637c9, + 0xb2f597d94a8230ec, + 0x0b08aac55f565da4, + 0xf1327fd2017283d6, + 0xad98919e78f35e63, + 0x6ab9519676751f53, + 0x24e921670a53774f, + 0xb9fd3d1c15d46d48, + 0x92f66194fbda485f, + 0x5a35dc7311015b37, + 0xded3f4705477a93d, + 0xc00a0eb381cd0d8d, + 0xbb88d809c65fe436, + 0x16104997beacba55, + 0x21b70ac95693b28c, + 0x59f4c5e225411876, + 0xd5db5eb50b21f499, + 0x55d7a19cf55c096f, + 0xa97246b4c3f8519f, + 0x8552d487a2bd3835, + 0x54635d181297c350, + 0x23c2efdc85183bf2, + 0x9f61f96ecc0c9379, + 0x534893a39ddc8fed, + 0x5edf0b59aa0a54cb, + 0xac2c6d1a9f38945c, + 0xd7aebba0d8aa7de7, + 0x2abfa00c09c5ef28, + 0xd84cc64f3cf72fbf, + 0x2003f64db15878b3, + 0xa724c7dfc06ec9f8, + 0x069f323f68808682, + 0xcc296acd51d01c94, + 0x055e2bae5cc0c5c3, + 0x6270e2c21d6301b6, + 0x3b842720382219c0, + 0xd2f0900e846ab824, + 0x52fc6f277a1745d2, + 0xc6953c8ce94d8b0f, + 0xe009f8fe3095753e, + 0x655b2c7992284d0b, + 0x984a37d54347dfc4, + 0xeab5aebf8808e2a5, + 0x9a3fd2c090cc56ba, + 0x9ca0e0fff84cd038, + 0x4c2595e4afade162, + 0xdf6708f4b3bc6302, + 0xbf620f237d54ebca, + 0x93429d101c118260, + 0x097d4fd08cddd4da, + 0x8c2f9b572e60ecef, + 0x708a7c7f18c4b41f, + 0x3a30dba4dfe9d3ff, + 0x4006f19a7fb0f07b, + 0x5f6bf7dd4dc19ef4, + 0x1f6d064732716e8f, + 0xf9fbcc866a649d33, + 0x308c8de567744464, + 0x8971b0f972a0292c, + 0xd61a47243f61b7d8, + 0xefeb8511d4c82766, + 0x961cb6be40d147a3, + 0xaab35f25f7b812de, + 0x76154e407044329d, + 0x513d76b64e570693, + 0xf3479ac7d2f90aa8, + 0x9b8b2e4477079c85, + 0x297eb99d3d85ac69, + }, + { + 0x3ef29d249b2c0a19, + 0xe9e16322b6f8622f, + 0x5536994047757f7a, + 0x9f4d56d5a47b0b33, + 0x822567466aa1174c, + 0xb8f5057deb082fb2, + 0xcc48c10bf4475f53, + 0x373088d4275dec3a, + 0x968f4325180aed10, + 0x173d232cf7016151, + 0xae4ed09f946fcc13, + 0xfd4b4741c4539873, + 0x1b5b3f0dd9933765, + 0x2ffcb0967b644052, + 0xe02376d20a89840c, + 0xa3ae3a70329b18d7, + 0x419cbd2335de8526, + 0xfafebf115b7c3199, + 0x0397074f85aa9b0d, + 0xc58ad4fb4836b970, + 0xbec60be3fc4104a8, + 0x1eff36dc4b708772, + 0x131fdc33ed8453b6, + 0x0844e33e341764d3, + 0x0ff11b6eab38cd39, + 0x64351f0a7761b85a, + 0x3b5694f509cfba0e, + 0x30857084b87245d0, + 0x47afb3bd2297ae3c, + 0xf2ba5c2f6f6b554a, + 0x74bdc4761f4f70e1, + 0xcfdfc64471edc45e, + 0xe610784c1dc0af16, + 0x7aca29d63c113f28, + 0x2ded411776a859af, + 0xac5f211e99a3d5ee, + 0xd484f949a87ef33b, + 0x3ce36ca596e013e4, + 0xd120f0983a9d432c, + 0x6bc40464dc597563, + 0x69d5f5e5d1956c9e, + 0x9ae95f043698bb24, + 0xc9ecc8da66a4ef44, + 0xd69508c8a5b2eac6, + 0xc40c2235c0503b80, + 0x38c193ba8c652103, + 0x1ceec75d46bc9e8f, + 0xd331011937515ad1, + 0xd8e2e56886eca50f, + 0xb137108d5779c991, + 0x709f3b6905ca4206, + 0x4feb50831680caef, + 0xec456af3241bd238, + 0x58d673afe181abbe, + 0x242f54e7cad9bf8c, + 0x0211f1810dcc19fd, + 0x90bc4dbb0f43c60a, + 0x9518446a9da0761d, + 0xa1bfcbf13f57012a, + 0x2bde4f8961e172b5, + 0x27b853a84f732481, + 0xb0b1e643df1f4b61, + 0x18cc38425c39ac68, + 0xd2b7f7d7bf37d821, + 0x3103864a3014c720, + 0x14aa246372abfa5c, + 0x6e600db54ebac574, + 0x394765740403a3f3, + 0x09c215f0bc71e623, + 0x2a58b947e987f045, + 0x7b4cdf18b477bdd8, + 0x9709b5eb906c6fe0, + 0x73083c268060d90b, + 0xfedc400e41f9037e, + 0x284948c6e44be9b8, + 0x728ecae808065bfb, + 0x06330e9e17492b1a, + 0x5950856169e7294e, + 0xbae4f4fce6c4364f, + 0xca7bcf95e30e7449, + 0x7d7fd186a33e96c2, + 0x52836110d85ad690, + 0x4dfaa1021b4cd312, + 0x913abb75872544fa, + 0xdd46ecb9140f1518, + 0x3d659a6b1e869114, + 0xc23f2cabd719109a, + 0xd713fe062dd46836, + 0xd0a60656b2fbc1dc, + 0x221c5a79dd909496, + 0xefd26dbca1b14935, + 0x0e77eda0235e4fc9, + 0xcbfd395b6b68f6b9, + 0x0de0eaefa6f4d4c4, + 0x0422ff1f1a8532e7, + 0xf969b85eded6aa94, + 0x7f6e2007aef28f3f, + 0x3ad0623b81a938fe, + 0x6624ee8b7aada1a7, + 0xb682e8ddc856607b, + 0xa78cc56f281e2a30, + 0xc79b257a45faa08d, + 0x5b4174e0642b30b3, + 0x5f638bff7eae0254, + 0x4bc9af9c0c05f808, + 0xce59308af98b46ae, + 0x8fc58da9cc55c388, + 0x803496c7676d0eb1, + 0xf33caae1e70dd7ba, + 0xbb6202326ea2b4bf, + 0xd5020f87201871cb, + 0x9d5ca754a9b712ce, + 0x841669d87de83c56, + 0x8a6184785eb6739f, + 0x420bba6cb0741e2b, + 0xf12d5b60eac1ce47, + 0x76ac35f71283691c, + 0x2c6bb7d9fecedb5f, + 0xfccdb18f4c351a83, + 0x1f79c012c3160582, + 0xf0abadae62a74cb7, + 0xe1a5801c82ef06fc, + 0x67a21845f2cb2357, + 0x5114665f5df04d9d, + 0xbf40fd2d74278658, + 0xa0393d3fb73183da, + 0x05a409d192e3b017, + 0xa9fb28cf0b4065f9, + 0x25a9a22942bf3d7c, + 0xdb75e22703463e02, + 0xb326e10c5ab5d06c, + 0xe7968e8295a62de6, + 0xb973f3b3636ead42, + 0xdf571d3819c30ce5, + 0xee549b7229d7cbc5, + 0x12992afd65e2d146, + 0xf8ef4e9056b02864, + 0xb7041e134030e28b, + 0xc02edd2adad50967, + 0x932b4af48ae95d07, + 0x6fe6fb7bc6dc4784, + 0x239aacb755f61666, + 0x401a4bedbdb807d6, + 0x485ea8d389af6305, + 0xa41bc220adb4b13d, + 0x753b32b89729f211, + 0x997e584bb3322029, + 0x1d683193ceda1c7f, + 0xff5ab6c0c99f818e, + 0x16bbd5e27f67e3a1, + 0xa59d34ee25d233cd, + 0x98f8ae853b54a2d9, + 0x6df70afacb105e79, + 0x795d2e99b9bba425, + 0x8e437b6744334178, + 0x0186f6ce886682f0, + 0xebf092a3bb347bd2, + 0xbcd7fa62f18d1d55, + 0xadd9d7d011c5571e, + 0x0bd3e471b1bdffde, + 0xaa6c2f808eeafef4, + 0x5ee57d31f6c880a4, + 0xf50fa47ff044fca0, + 0x1addc9c351f5b595, + 0xea76646d3352f922, + 0x0000000000000000, + 0x85909f16f58ebea6, + 0x46294573aaf12ccc, + 0x0a5512bf39db7d2e, + 0x78dbd85731dd26d5, + 0x29cfbe086c2d6b48, + 0x218b5d36583a0f9b, + 0x152cd2adfacd78ac, + 0x83a39188e2c795bc, + 0xc3b9da655f7f926a, + 0x9ecba01b2c1d89c3, + 0x07b5f8509f2fa9ea, + 0x7ee8d6c926940dcf, + 0x36b67e1aaf3b6eca, + 0x86079859702425ab, + 0xfb7849dfd31ab369, + 0x4c7c57cc932a51e2, + 0xd96413a60e8a27ff, + 0x263ea566c715a671, + 0x6c71fc344376dc89, + 0x4a4f595284637af8, + 0xdaf314e98b20bcf2, + 0x572768c14ab96687, + 0x1088db7c682ec8bb, + 0x887075f9537a6a62, + 0x2e7a4658f302c2a2, + 0x619116dbe582084d, + 0xa87dde018326e709, + 0xdcc01a779c6997e8, + 0xedc39c3dac7d50c8, + 0xa60a33a1a078a8c0, + 0xc1a82be452b38b97, + 0x3f746bea134a88e9, + 0xa228ccbebafd9a27, + 0xabead94e068c7c04, + 0xf48952b178227e50, + 0x5cf48cb0fb049959, + 0x6017e0156de48abd, + 0x4438b4f2a73d3531, + 0x8c528ae649ff5885, + 0xb515ef924dfcfb76, + 0x0c661c212e925634, + 0xb493195cc59a7986, + 0x9cda519a21d1903e, + 0x32948105b5be5c2d, + 0x194ace8cd45f2e98, + 0x438d4ca238129cdb, + 0x9b6fa9cabefe39d4, + 0x81b26009ef0b8c41, + 0xded1ebf691a58e15, + 0x4e6da64d9ee6481f, + 0x54b06f8ecf13fd8a, + 0x49d85e1d01c9e1f5, + 0xafc826511c094ee3, + 0xf698a33075ee67ad, + 0x5ac7822eec4db243, + 0x8dd47c28c199da75, + 0x89f68337db1ce892, + 0xcdce37c57c21dda3, + 0x530597de503c5460, + 0x6a42f2aa543ff793, + 0x5d727a7e73621ba9, + 0xe232875307459df1, + 0x56a19e0fc2dfe477, + 0xc61dd3b4cd9c227d, + 0xe5877f03986a341b, + 0x949eb2a415c6f4ed, + 0x6206119460289340, + 0x6380e75ae84e11b0, + 0x8be772b6d6d0f16f, + 0x50929091d596cf6d, + 0xe86795ec3e9ee0df, + 0x7cf927482b581432, + 0xc86a3e14eec26db4, + 0x7119cda78dacc0f6, + 0xe40189cd100cb6eb, + 0x92adbc3a028fdff7, + 0xb2a017c2d2d3529c, + 0x200dabf8d05c8d6b, + 0x34a78f9ba2f77737, + 0xe3b4719d8f231f01, + 0x45be423c2f5bb7c1, + 0xf71e55fefd88e55d, + 0x6853032b59f3ee6e, + 0x65b3e9c4ff073aaa, + 0x772ac3399ae5ebec, + 0x87816e97f842a75b, + 0x110e2db2e0484a4b, + 0x331277cb3dd8dedd, + 0xbd510cac79eb9fa5, + 0x352179552a91f5c7, + }, + { + 0x05ba7bc82c9b3220, + 0x31a54665f8b65e4f, + 0xb1b651f77547f4d4, + 0x8bfa0d857ba46682, + 0x85a96c5aa16a98bb, + 0x990faef908eb79c9, + 0xa15e37a247f4a62d, + 0x76857dcd5d27741e, + 0xf8c50b800a1820bc, + 0xbe65dcb201f7a2b4, + 0x666d1b986f9426e7, + 0x4cc921bf53c4e648, + 0x95410a0f93d9ca42, + 0x20cdccaa647ba4ef, + 0x429a4060890a1871, + 0x0c4ea4f69b32b38b, + 0xccda362dde354cd3, + 0x96dc23bc7c5b2fa9, + 0xc309bb68aa851ab3, + 0xd26131a73648e013, + 0x021dc52941fc4db2, + 0xcd5adab7704be48a, + 0xa77965d984ed71e6, + 0x32386fd61734bba4, + 0xe82d6dd538ab7245, + 0x5c2147ea6177b4b1, + 0x5da1ab70cf091ce8, + 0xac907fce72b8bdff, + 0x57c85dfd972278a8, + 0xa4e44c6a6b6f940d, + 0x3851995b4f1fdfe4, + 0x62578ccaed71bc9e, + 0xd9882bb0c01d2c0a, + 0x917b9d5d113c503b, + 0xa2c31e11a87643c6, + 0xe463c923a399c1ce, + 0xf71686c57ea876dc, + 0x87b4a973e096d509, + 0xaf0d567d9d3a5814, + 0xb40c2a3f59dcc6f4, + 0x3602f88495d121dd, + 0xd3e1dd3d9836484a, + 0xf945e71aa46688e5, + 0x7518547eb2a591f5, + 0x9366587450c01d89, + 0x9ea81018658c065b, + 0x4f54080cbc4603a3, + 0x2d0384c65137bf3d, + 0xdc325078ec861e2a, + 0xea30a8fc79573ff7, + 0x214d2030ca050cb6, + 0x65f0322b8016c30c, + 0x69be96dd1b247087, + 0xdb95ee9981e161b8, + 0xd1fc1814d9ca05f8, + 0x820ed2bbcc0de729, + 0x63d76050430f14c7, + 0x3bccb0e8a09d3a0f, + 0x8e40764d573f54a2, + 0x39d175c1e16177bd, + 0x12f5a37c734f1f4b, + 0xab37c12f1fdfc26d, + 0x5648b167395cd0f1, + 0x6c04ed1537bf42a7, + 0xed97161d14304065, + 0x7d6c67daab72b807, + 0xec17fa87ba4ee83c, + 0xdfaf79cb0304fbc1, + 0x733f060571bc463e, + 0x78d61c1287e98a27, + 0xd07cf48e77b4ada1, + 0xb9c262536c90dd26, + 0xe2449b5860801605, + 0x8fc09ad7f941fcfb, + 0xfad8cea94be46d0e, + 0xa343f28b0608eb9f, + 0x9b126bd04917347b, + 0x9a92874ae7699c22, + 0x1b017c42c4e69ee0, + 0x3a4c5c720ee39256, + 0x4b6e9f5e3ea399da, + 0x6ba353f45ad83d35, + 0xe7fee0904c1b2425, + 0x22d009832587e95d, + 0x842980c00f1430e2, + 0xc6b3c0a0861e2893, + 0x087433a419d729f2, + 0x341f3dadd42d6c6f, + 0xee0a3faefbb2a58e, + 0x4aee73c490dd3183, + 0xaab72db5b1a16a34, + 0xa92a04065e238fdf, + 0x7b4b35a1686b6fcc, + 0x6a23bf6ef4a6956c, + 0x191cb96b851ad352, + 0x55d598d4d6de351a, + 0xc9604de5f2ae7ef3, + 0x1ca6c2a3a981e172, + 0xde2f9551ad7a5398, + 0x3025aaff56c8f616, + 0x15521d9d1e2860d9, + 0x506fe31cfa45073a, + 0x189c55f12b647b0b, + 0x0180ec9aae7ea859, + 0x7cec8b40050c105e, + 0x2350e5198bf94104, + 0xef8ad33455cc0dd7, + 0x07a7bee16d677f92, + 0xe5e325b90de76997, + 0x5a061591a26e637a, + 0xb611ef1618208b46, + 0x09f4df3eb7a981ab, + 0x1ebb078ae87dacc0, + 0xb791038cb65e231f, + 0x0fd38d4574b05660, + 0x67edf702c1ea8ebe, + 0xba5f4be0831238cd, + 0xe3c477c2cefebe5c, + 0x0dce486c354c1bd2, + 0x8c5db36416c31910, + 0x26ea9ed1a7627324, + 0x039d29b3ef82e5eb, + 0x9f28fc82cbf2ae02, + 0xa8aae89cf05d2786, + 0x431aacfa2774b028, + 0xcf471f9e31b7a938, + 0x581bd0b8e3922ec8, + 0xbc78199b400bef06, + 0x90fb71c7bf42f862, + 0x1f3beb1046030499, + 0x683e7a47b55ad8de, + 0x988f4263a695d190, + 0xd808c72a6e638453, + 0x0627527bc319d7cb, + 0xebb04466d72997ae, + 0xe67e0c0ae2658c7c, + 0x14d2f107b056c880, + 0x7122c32c30400b8c, + 0x8a7ae11fd5dacedb, + 0xa0dedb38e98a0e74, + 0xad109354dcc615a6, + 0x0be91a17f655cc19, + 0x8ddd5ffeb8bdb149, + 0xbfe53028af890aed, + 0xd65ba6f5b4ad7a6a, + 0x7956f0882997227e, + 0x10e8665532b352f9, + 0x0e5361dfdacefe39, + 0xcec7f3049fc90161, + 0xff62b561677f5f2e, + 0x975ccf26d22587f0, + 0x51ef0f86543baf63, + 0x2f1e41ef10cbf28f, + 0x52722635bbb94a88, + 0xae8dbae73344f04d, + 0x410769d36688fd9a, + 0xb3ab94de34bbb966, + 0x801317928df1aa9b, + 0xa564a0f0c5113c54, + 0xf131d4bebdb1a117, + 0x7f71a2f3ea8ef5b5, + 0x40878549c8f655c3, + 0x7ef14e6944f05dec, + 0xd44663dcf55137d8, + 0xf2acfd0d523344fc, + 0x0000000000000000, + 0x5fbc6e598ef5515a, + 0x16cf342ef1aa8532, + 0xb036bd6ddb395c8d, + 0x13754fe6dd31b712, + 0xbbdfa77a2d6c9094, + 0x89e7c8ac3a582b30, + 0x3c6b0e09cdfa459d, + 0xc4ae0589c7e26521, + 0x49735a777f5fd468, + 0xcafd64561d2c9b18, + 0xda1502032f9fc9e1, + 0x8867243694268369, + 0x3782141e3baf8984, + 0x9cb5d53124704be9, + 0xd7db4a6f1ad3d233, + 0xa6f989432a93d9bf, + 0x9d3539ab8a0ee3b0, + 0x53f2caaf15c7e2d1, + 0x6e19283c76430f15, + 0x3debe2936384edc4, + 0x5e3c82c3208bf903, + 0x33b8834cb94a13fd, + 0x6470deb12e686b55, + 0x359fd1377a53c436, + 0x61caa57902f35975, + 0x043a975282e59a79, + 0xfd7f70482683129c, + 0xc52ee913699ccd78, + 0x28b9ff0e7dac8d1d, + 0x5455744e78a09d43, + 0xcb7d88ccb3523341, + 0x44bd121b4a13cfba, + 0x4d49cd25fdba4e11, + 0x3e76cb208c06082f, + 0x3ff627ba2278a076, + 0xc28957f204fbb2ea, + 0x453dfe81e46d67e3, + 0x94c1e6953da7621b, + 0x2c83685cff491764, + 0xf32c1197fc4deca5, + 0x2b24d6bd922e68f6, + 0xb22b78449ac5113f, + 0x48f3b6edd1217c31, + 0x2e9ead75beb55ad6, + 0x174fd8b45fd42d6b, + 0x4ed4e4961238abfa, + 0x92e6b4eefebeb5d0, + 0x46a0d7320bef8208, + 0x47203ba8a5912a51, + 0x24f75bf8e69e3e96, + 0xf0b1382413cf094e, + 0xfee259fbc901f777, + 0x276a724b091cdb7d, + 0xbdf8f501ee75475f, + 0x599b3c224dec8691, + 0x6d84018f99c1eafe, + 0x7498b8e41cdb39ac, + 0xe0595e71217c5bb7, + 0x2aa43a273c50c0af, + 0xf50b43ec3f543b6e, + 0x838e3e2162734f70, + 0xc09492db4507ff58, + 0x72bfea9fdfc2ee67, + 0x11688acf9ccdfaa0, + 0x1a8190d86a9836b9, + 0x7acbd93bc615c795, + 0xc7332c3a286080ca, + 0x863445e94ee87d50, + 0xf6966a5fd0d6de85, + 0xe9ad814f96d5da1c, + 0x70a22fb69e3ea3d5, + 0x0a69f68d582b6440, + 0xb8428ec9c2ee757f, + 0x604a49e3ac8df12c, + 0x5b86f90b0c10cb23, + 0xe1d9b2eb8f02f3ee, + 0x29391394d3d22544, + 0xc8e0a17f5cd0d6aa, + 0xb58cc6a5f7a26ead, + 0x8193fb08238f02c2, + 0xd5c68f465b2f9f81, + 0xfcff9cd288fdbac5, + 0x77059157f359dc47, + 0x1d262e3907ff492b, + 0xfb582233e59ac557, + 0xddb2bce242f8b673, + 0x2577b76248e096cf, + 0x6f99c4a6d83da74c, + 0xc1147e41eb795701, + 0xf48baf76912a9337, + }, + { + 0x45b268a93acde4cc, + 0xaf7f0be884549d08, + 0x048354b3c1468263, + 0x925435c2c80efed2, + 0xee4e37f27fdffba7, + 0x167a33920c60f14d, + 0xfb123b52ea03e584, + 0x4a0cab53fdbb9007, + 0x9deaf6380f788a19, + 0xcb48ec558f0cb32a, + 0xb59dc4b2d6fef7e0, + 0xdcdbca22f4f3ecb6, + 0x11df5813549a9c40, + 0xe33fdedf568aced3, + 0xa0c1c8124322e9c3, + 0x07a56b8158fa6d0d, + 0x77279579b1e1f3dd, + 0xd9b18b74422ac004, + 0xb8ec2d9fffabc294, + 0xf4acf8a82d75914f, + 0x7bbf69b1ef2b6878, + 0xc4f62faf487ac7e1, + 0x76ce809cc67e5d0c, + 0x6711d88f92e4c14c, + 0x627b99d9243dedfe, + 0x234aa5c3dfb68b51, + 0x909b1f15262dbf6d, + 0x4f66ea054b62bcb5, + 0x1ae2cf5a52aa6ae8, + 0xbea053fbd0ce0148, + 0xed6808c0e66314c9, + 0x43fe16cd15a82710, + 0xcd049231a06970f6, + 0xe7bc8a6c97cc4cb0, + 0x337ce835fcb3b9c0, + 0x65def2587cc780f3, + 0x52214ede4132bb50, + 0x95f15e4390f493df, + 0x870839625dd2e0f1, + 0x41313c1afb8b66af, + 0x91720af051b211bc, + 0x477d427ed4eea573, + 0x2e3b4ceef6e3be25, + 0x82627834eb0bcc43, + 0x9c03e3dd78e724c8, + 0x2877328ad9867df9, + 0x14b51945e243b0f2, + 0x574b0f88f7eb97e2, + 0x88b6fa989aa4943a, + 0x19c4f068cb168586, + 0x50ee6409af11faef, + 0x7df317d5c04eaba4, + 0x7a567c5498b4c6a9, + 0xb6bbfb804f42188e, + 0x3cc22bcf3bc5cd0b, + 0xd04336eaaa397713, + 0xf02fac1bec33132c, + 0x2506dba7f0d3488d, + 0xd7e65d6bf2c31a1e, + 0x5eb9b2161ff820f5, + 0x842e0650c46e0f9f, + 0x716beb1d9e843001, + 0xa933758cab315ed4, + 0x3fe414fda2792265, + 0x27c9f1701ef00932, + 0x73a4c1ca70a771be, + 0x94184ba6e76b3d0e, + 0x40d829ff8c14c87e, + 0x0fbec3fac77674cb, + 0x3616a9634a6a9572, + 0x8f139119c25ef937, + 0xf545ed4d5aea3f9e, + 0xe802499650ba387b, + 0x6437e7bd0b582e22, + 0xe6559f89e053e261, + 0x80ad52e305288dfc, + 0x6dc55a23e34b9935, + 0xde14e0f51ad0ad09, + 0xc6390578a659865e, + 0x96d7617109487cb1, + 0xe2d6cb3a21156002, + 0x01e915e5779faed1, + 0xadb0213f6a77dcb7, + 0x9880b76eb9a1a6ab, + 0x5d9f8d248644cf9b, + 0xfd5e4536c5662658, + 0xf1c6b9fe9bacbdfd, + 0xeacd6341be9979c4, + 0xefa7221708405576, + 0x510771ecd88e543e, + 0xc2ba51cb671f043d, + 0x0ad482ac71af5879, + 0xfe787a045cdac936, + 0xb238af338e049aed, + 0xbd866cc94972ee26, + 0x615da6ebbd810290, + 0x3295fdd08b2c1711, + 0xf834046073bf0aea, + 0xf3099329758ffc42, + 0x1caeb13e7dcfa934, + 0xba2307481188832b, + 0x24efce42874ce65c, + 0x0e57d61fb0e9da1a, + 0xb3d1bad6f99b343c, + 0xc0757b1c893c4582, + 0x2b510db8403a9297, + 0x5c7698c1f1db614a, + 0x3e0d0118d5e68cb4, + 0xd60f488e855cb4cf, + 0xae961e0df3cb33d9, + 0x3a8e55ab14a00ed7, + 0x42170328623789c1, + 0x838b6dd19c946292, + 0x895fef7ded3b3aeb, + 0xcfcbb8e64e4a3149, + 0x064c7e642f65c3dc, + 0x3d2b3e2a4c5a63da, + 0x5bd3f340a9210c47, + 0xb474d157a1615931, + 0xac5934da1de87266, + 0x6ee365117af7765b, + 0xc86ed36716b05c44, + 0x9ba6885c201d49c5, + 0xb905387a88346c45, + 0x131072c4bab9ddff, + 0xbf49461ea751af99, + 0xd52977bc1ce05ba1, + 0xb0f785e46027db52, + 0x546d30ba6e57788c, + 0x305ad707650f56ae, + 0xc987c682612ff295, + 0xa5ab8944f5fbc571, + 0x7ed528e759f244ca, + 0x8ddcbbce2c7db888, + 0xaa154abe328db1ba, + 0x1e619be993ece88b, + 0x09f2bd9ee813b717, + 0x7401aa4b285d1cb3, + 0x21858f143195caee, + 0x48c381841398d1b8, + 0xfcb750d3b2f98889, + 0x39a86a998d1ce1b9, + 0x1f888e0ce473465a, + 0x7899568376978716, + 0x02cf2ad7ee2341bf, + 0x85c713b5b3f1a14e, + 0xff916fe12b4567e7, + 0x7c1a0230b7d10575, + 0x0c98fcc85eca9ba5, + 0xa3e7f720da9e06ad, + 0x6a6031a2bbb1f438, + 0x973e74947ed7d260, + 0x2cf4663918c0ff9a, + 0x5f50a7f368678e24, + 0x34d983b4a449d4cd, + 0x68af1b755592b587, + 0x7f3c3d022e6dea1b, + 0xabfc5f5b45121f6b, + 0x0d71e92d29553574, + 0xdffdf5106d4f03d8, + 0x081ba87b9f8c19c6, + 0xdb7ea1a3ac0981bb, + 0xbbca12ad66172dfa, + 0x79704366010829c7, + 0x179326777bff5f9c, + 0x0000000000000000, + 0xeb2476a4c906d715, + 0x724dd42f0738df6f, + 0xb752ee6538ddb65f, + 0x37ffbc863df53ba3, + 0x8efa84fcb5c157e6, + 0xe9eb5c73272596aa, + 0x1b0bdabf2535c439, + 0x86e12c872a4d4e20, + 0x9969a28bce3e087a, + 0xfafb2eb79d9c4b55, + 0x056a4156b6d92cb2, + 0x5a3ae6a5debea296, + 0x22a3b026a8292580, + 0x53c85b3b36ad1581, + 0xb11e900117b87583, + 0xc51f3a4a3fe56930, + 0xe019e1edcf3621bd, + 0xec811d2591fcba18, + 0x445b7d4c4d524a1d, + 0xa8da6069dcaef005, + 0x58f5cc72309de329, + 0xd4c062596b7ff570, + 0xce22ad0339d59f98, + 0x591cd99747024df8, + 0x8b90c5aa03187b54, + 0xf663d27fc356d0f0, + 0xd8589e9135b56ed5, + 0x35309651d3d67a1c, + 0x12f96721cd26732e, + 0xd28c1c3d441a36ac, + 0x492a946164077f69, + 0x2d1d73dc6f5f514b, + 0x6f0a70f40d68d88a, + 0x60b4b30eca1eac41, + 0xd36509d83385987d, + 0x0b3d97490630f6a8, + 0x9eccc90a96c46577, + 0xa20ee2c5ad01a87c, + 0xe49ab55e0e70a3de, + 0xa4429ca182646ba0, + 0xda97b446db962f6a, + 0xcced87d4d7f6de27, + 0x2ab8185d37a53c46, + 0x9f25dcefe15bcba6, + 0xc19c6ef9fea3eb53, + 0xa764a3931bd884ce, + 0x2fd2590b817c10f4, + 0x56a21a6d80743933, + 0xe573a0bb79ef0d0f, + 0x155c0ca095dc1e23, + 0x6c2c4fc694d437e4, + 0x10364df623053291, + 0xdd32dfc7836c4267, + 0x03263f3299bcef6e, + 0x66f8cd6ae57b6f9d, + 0x8c35ae2b5be21659, + 0x31b3c2e21290f87f, + 0x93bd2027bf915003, + 0x69460e90220d1b56, + 0x299e276fae19d328, + 0x63928c3c53a2432f, + 0x7082fef8e91b9ed0, + 0xbc6f792c3eed40f7, + 0x4c40d537d2de53db, + 0x75e8bfae5fc2b262, + 0x4da9c0d2a541fd0a, + 0x4e8fffe03cfd1264, + 0x2620e495696fa7e3, + 0xe1f0f408b8a98f6c, + 0xd1aa230fdda6d9c2, + 0xc7d0109dd1c6288f, + 0x8a79d04f7487d585, + 0x4694579ba3710ba2, + 0x38417f7cfa834f68, + 0x1d47a4db0a5007e5, + 0x206c9af1460a643f, + 0xa128ddf734bd4712, + 0x8144470672b7232d, + 0xf2e086cc02105293, + 0x182de58dbc892b57, + 0xcaa1f9b0f8931dfb, + 0x6b892447cc2e5ae9, + 0xf9dd11850420a43b, + 0x4be5beb68a243ed6, + 0x5584255f19c8d65d, + 0x3b67404e633fa006, + 0xa68db6766c472a1f, + 0xf78ac79ab4c97e21, + 0xc353442e1080aaec, + 0x9a4f9db95782e714, + }, + { + 0xc811a8058c3f55de, + 0x65f5b43196b50619, + 0xf74f96b1d6706e43, + 0x859d1e8bcb43d336, + 0x5aab8a85ccfa3d84, + 0xf9c7bf99c295fcfd, + 0xa21fd5a1de4b630f, + 0xcdb3ef763b8b456d, + 0x803f59f87cf7c385, + 0xb27c73be5f31913c, + 0x98e3ac6633b04821, + 0xbf61674c26b8f818, + 0x0ffbc995c4c130c8, + 0xaaa0862010761a98, + 0x6057f342210116aa, + 0xf63c760c0654cc35, + 0x2ddb45cc667d9042, + 0xbcf45a964bd40382, + 0x68e8a0c3ef3c6f3d, + 0xa7bd92d269ff73bc, + 0x290ae20201ed2287, + 0xb7de34cde885818f, + 0xd901eea7dd61059b, + 0xd6fa273219a03553, + 0xd56f1ae874cccec9, + 0xea31245c2e83f554, + 0x7034555da07be499, + 0xce26d2ac56e7bef7, + 0xfd161857a5054e38, + 0x6a0e7da4527436d1, + 0x5bd86a381cde9ff2, + 0xcaf7756231770c32, + 0xb09aaed9e279c8d0, + 0x5def1091c60674db, + 0x111046a2515e5045, + 0x23536ce4729802fc, + 0xc50cbcf7f5b63cfa, + 0x73a16887cd171f03, + 0x7d2941afd9f28dbd, + 0x3f5e3eb45a4f3b9d, + 0x84eefe361b677140, + 0x3db8e3d3e7076271, + 0x1a3a28f9f20fd248, + 0x7ebc7c75b49e7627, + 0x74e5f293c7eb565c, + 0x18dcf59e4f478ba4, + 0x0c6ef44fa9adcb52, + 0xc699812d98dac760, + 0x788b06dc6e469d0e, + 0xfc65f8ea7521ec4e, + 0x30a5f7219e8e0b55, + 0x2bec3f65bca57b6b, + 0xddd04969baf1b75e, + 0x99904cdbe394ea57, + 0x14b201d1e6ea40f6, + 0xbbb0c08241284add, + 0x50f20463bf8f1dff, + 0xe8d7f93b93cbacb8, + 0x4d8cb68e477c86e8, + 0xc1dd1b3992268e3f, + 0x7c5aa11209d62fcb, + 0x2f3d98abdb35c9ae, + 0x671369562bfd5ff5, + 0x15c1e16c36cee280, + 0x1d7eb2edf8f39b17, + 0xda94d37db00dfe01, + 0x877bc3ec760b8ada, + 0xcb8495dfe153ae44, + 0x05a24773b7b410b3, + 0x12857b783c32abdf, + 0x8eb770d06812513b, + 0x536739b9d2e3e665, + 0x584d57e271b26468, + 0xd789c78fc9849725, + 0xa935bbfa7d1ae102, + 0x8b1537a3dfa64188, + 0xd0cd5d9bc378de7a, + 0x4ac82c9a4d80cfb7, + 0x42777f1b83bdb620, + 0x72d2883a1d33bd75, + 0x5e7a2d4bab6a8f41, + 0xf4daab6bbb1c95d9, + 0x905cffe7fd8d31b6, + 0x83aa6422119b381f, + 0xc0aefb8442022c49, + 0xa0f908c663033ae3, + 0xa428af0804938826, + 0xade41c341a8a53c7, + 0xae7121ee77e6a85d, + 0xc47f5c4a25929e8c, + 0xb538e9aa55cdd863, + 0x06377aa9dad8eb29, + 0xa18ae87bb3279895, + 0x6edfda6a35e48414, + 0x6b7d9d19825094a7, + 0xd41cfa55a4e86cbf, + 0xe5caedc9ea42c59c, + 0xa36c351c0e6fc179, + 0x5181e4de6fabbf89, + 0xfff0c530184d17d4, + 0x9d41eb1584045892, + 0x1c0d525028d73961, + 0xf178ec180ca8856a, + 0x9a0571018ef811cd, + 0x4091a27c3ef5efcc, + 0x19af15239f6329d2, + 0x347450eff91eb990, + 0xe11b4a078dd27759, + 0xb9561de5fc601331, + 0x912f1f5a2da993c0, + 0x1654dcb65ba2191a, + 0x3e2dde098a6b99eb, + 0x8a66d71e0f82e3fe, + 0x8c51adb7d55a08d7, + 0x4533e50f8941ff7f, + 0x02e6dd67bd4859ec, + 0xe068aaba5df6d52f, + 0xc24826e3ff4a75a5, + 0x6c39070d88acddf8, + 0x6486548c4691a46f, + 0xd1bebd26135c7c0c, + 0xb30f93038f15334a, + 0x82d9849fc1bf9a69, + 0x9c320ba85420fae4, + 0xfa528243aff90767, + 0x9ed4d6cfe968a308, + 0xb825fd582c44b147, + 0x9b7691bc5edcb3bb, + 0xc7ea619048fe6516, + 0x1063a61f817af233, + 0x47d538683409a693, + 0x63c2ce984c6ded30, + 0x2a9fdfd86c81d91d, + 0x7b1e3b06032a6694, + 0x666089ebfbd9fd83, + 0x0a598ee67375207b, + 0x07449a140afc495f, + 0x2ca8a571b6593234, + 0x1f986f8a45bbc2fb, + 0x381aa4a050b372c2, + 0x5423a3add81faf3a, + 0x17273c0b8b86bb6c, + 0xfe83258dc869b5a2, + 0x287902bfd1c980f1, + 0xf5a94bd66b3837af, + 0x88800a79b2caba12, + 0x55504310083b0d4c, + 0xdf36940e07b9eeb2, + 0x04d1a7ce6790b2c5, + 0x612413fff125b4dc, + 0x26f12b97c52c124f, + 0x86082351a62f28ac, + 0xef93632f9937e5e7, + 0x3507b052293a1be6, + 0xe72c30ae570a9c70, + 0xd3586041ae1425e0, + 0xde4574b3d79d4cc4, + 0x92ba228040c5685a, + 0xf00b0ca5dc8c271c, + 0xbe1287f1f69c5a6e, + 0xf39e317fb1e0dc86, + 0x495d114020ec342d, + 0x699b407e3f18cd4b, + 0xdca3a9d46ad51528, + 0x0d1d14f279896924, + 0x0000000000000000, + 0x593eb75fa196c61e, + 0x2e4e78160b116bd8, + 0x6d4ae7b058887f8e, + 0xe65fd013872e3e06, + 0x7a6ddbbbd30ec4e2, + 0xac97fc89caaef1b1, + 0x09ccb33c1e19dbe1, + 0x89f3eac462ee1864, + 0x7770cf49aa87adc6, + 0x56c57eca6557f6d6, + 0x03953dda6d6cfb9a, + 0x36928d884456e07c, + 0x1eeb8f37959f608d, + 0x31d6179c4eaaa923, + 0x6fac3ad7e5c02662, + 0x43049fa653991456, + 0xabd3669dc052b8ee, + 0xaf02c153a7c20a2b, + 0x3ccb036e3723c007, + 0x93c9c23d90e1ca2c, + 0xc33bc65e2f6ed7d3, + 0x4cff56339758249e, + 0xb1e94e64325d6aa6, + 0x37e16d359472420a, + 0x79f8e661be623f78, + 0x5214d90402c74413, + 0x482ef1fdf0c8965b, + 0x13f69bc5ec1609a9, + 0x0e88292814e592be, + 0x4e198b542a107d72, + 0xccc00fcbebafe71b, + 0x1b49c844222b703e, + 0x2564164da840e9d5, + 0x20c6513e1ff4f966, + 0xbac3203f910ce8ab, + 0xf2edd1c261c47ef0, + 0x814cb945acd361f3, + 0x95feb8944a392105, + 0x5c9cf02c1622d6ad, + 0x971865f3f77178e9, + 0xbd87ba2b9bf0a1f4, + 0x444005b259655d09, + 0xed75be48247fbc0b, + 0x7596122e17cff42a, + 0xb44b091785e97a15, + 0x966b854e2755da9f, + 0xeee0839249134791, + 0x32432a4623c652b9, + 0xa8465b47ad3e4374, + 0xf8b45f2412b15e8b, + 0x2417f6f078644ba3, + 0xfb2162fe7fdda511, + 0x4bbbcc279da46dc1, + 0x0173e0bdd024a276, + 0x22208c59a2bca08a, + 0x8fc4906db836f34d, + 0xe4b90d743a6667ea, + 0x7147b5e0705f46ef, + 0x2782cb2a1508b039, + 0xec065ef5f45b1e7d, + 0x21b5b183cfd05b10, + 0xdbe733c060295c77, + 0x9fa73672394c017e, + 0xcf55321186c31c81, + 0xd8720e1a0d45a7ed, + 0x3b8f997a3ddf8958, + 0x3afc79c7edfb2b2e, + 0xe9a4198643ef0ece, + 0x5f09cdf67b4e2d37, + 0x4f6a6be9fa34df04, + 0xb6add47038a123f9, + 0x8d224d0a057eaaa1, + 0xc96248b85c1bf7a8, + 0xe3fd9760309a2eb5, + 0x0b2a6e5ba351820d, + 0xeb42c4e1fea75722, + 0x948d58299a1d8373, + 0x7fcf9cc864bad451, + 0xa55b4fb5d4b72a50, + 0x08bf5381ce3d7997, + 0x46a6d8d5e42d04e5, + 0xd22b80fc7e308796, + 0x57b69e77b57354a0, + 0x3969441d8097d0b4, + 0x3330cafbf3e2f0cf, + 0xe28e77dde0be8cc3, + 0x62b12e259c494f46, + 0xa6ce726fb9dbd1ca, + 0x41e242c1eed14dba, + 0x76032ff47aa30fb0, + }, + { + 0xe6f87e5c5b711fd0, + 0x258377800924fa16, + 0xc849e07e852ea4a8, + 0x5b4686a18f06c16a, + 0x0b32e9a2d77b416e, + 0xabda37a467815c66, + 0xf61796a81a686676, + 0xf5dc0b706391954b, + 0x4862f38db7e64bf1, + 0xff5c629a68bd85c5, + 0xcb827da6fcd75795, + 0x66d36daf69b9f089, + 0x356c9f74483d83b0, + 0x7cbcecb1238c99a1, + 0x36a702ac31c4708d, + 0x9eb6a8d02fbcdfd6, + 0x8b19fa51e5b3ae37, + 0x9ccfb5408a127d0b, + 0xbc0c78b508208f5a, + 0xe533e3842288eced, + 0xcec2c7d377c15fd2, + 0xec7817b6505d0f5e, + 0xb94cc2c08336871d, + 0x8c205db4cb0b04ad, + 0x763c855b28a0892f, + 0x588d1b79f6ff3257, + 0x3fecf69e4311933e, + 0x0fc0d39f803a18c9, + 0xee010a26f5f3ad83, + 0x10efe8f4411979a6, + 0x5dcda10c7de93a10, + 0x4a1bee1d1248e92c, + 0x53bff2db21847339, + 0xb4f50ccfa6a23d09, + 0x5fb4bc9cd84798cd, + 0xe88a2d8b071c56f9, + 0x7f7771695a756a9c, + 0xc5f02e71a0ba1ebc, + 0xa663f9ab4215e672, + 0x2eb19e22de5fbb78, + 0x0db9ce0f2594ba14, + 0x82520e6397664d84, + 0x2f031e6a0208ea98, + 0x5c7f2144a1be6bf0, + 0x7a37cb1cd16362db, + 0x83e08e2b4b311c64, + 0xcf70479bab960e32, + 0x856ba986b9dee71e, + 0xb5478c877af56ce9, + 0xb8fe42885f61d6fd, + 0x1bdd0156966238c8, + 0x622157923ef8a92e, + 0xfc97ff42114476f8, + 0x9d7d350856452ceb, + 0x4c90c9b0e0a71256, + 0x2308502dfbcb016c, + 0x2d7a03faa7a64845, + 0xf46e8b38bfc6c4ab, + 0xbdbef8fdd477deba, + 0x3aac4cebc8079b79, + 0xf09cb105e8879d0c, + 0x27fa6a10ac8a58cb, + 0x8960e7c1401d0cea, + 0x1a6f811e4a356928, + 0x90c4fb0773d196ff, + 0x43501a2f609d0a9f, + 0xf7a516e0c63f3796, + 0x1ce4a6b3b8da9252, + 0x1324752c38e08a9b, + 0xa5a864733bec154f, + 0x2bf124575549b33f, + 0xd766db15440dc5c7, + 0xa7d179e39e42b792, + 0xdadf151a61997fd3, + 0x86a0345ec0271423, + 0x38d5517b6da939a4, + 0x6518f077104003b4, + 0x02791d90a5aea2dd, + 0x88d267899c4a5d0a, + 0x930f66df0a2865c2, + 0x4ee9d4204509b08b, + 0x325538916685292a, + 0x412907bfc533a842, + 0xb27e2b62544dc673, + 0x6c5304456295e007, + 0x5af406e95351908a, + 0x1f2f3b6bc123616f, + 0xc37b09dc5255e5c6, + 0x3967d133b1fe6844, + 0x298839c7f0e711e2, + 0x409b87f71964f9a2, + 0xe938adc3db4b0719, + 0x0c0b4e47f9c3ebf4, + 0x5534d576d36b8843, + 0x4610a05aeb8b02d8, + 0x20c3cdf58232f251, + 0x6de1840dbec2b1e7, + 0xa0e8de06b0fa1d08, + 0x7b854b540d34333b, + 0x42e29a67bcca5b7f, + 0xd8a6088ac437dd0e, + 0xc63bb3a9d943ed81, + 0x21714dbd5e65a3b1, + 0x6761ede7b5eea169, + 0x2431f7c8d573abf6, + 0xd51fc685e1a3671a, + 0x5e063cd40410c92d, + 0x283ab98f2cb04002, + 0x8febc06cb2f2f790, + 0x17d64f116fa1d33c, + 0xe07359f1a99ee4aa, + 0x784ed68c74cdc006, + 0x6e2a19d5c73b42da, + 0x8712b4161c7045c3, + 0x371582e4ed93216d, + 0xace390414939f6fc, + 0x7ec5f12186223b7c, + 0xc0b094042bac16fb, + 0xf9d745379a527ebf, + 0x737c3f2ea3b68168, + 0x33e7b8d9bad278ca, + 0xa9a32a34c22ffebb, + 0xe48163ccfedfbd0d, + 0x8e5940246ea5a670, + 0x51c6ef4b842ad1e4, + 0x22bad065279c508c, + 0xd91488c218608cee, + 0x319ea5491f7cda17, + 0xd394e128134c9c60, + 0x094bf43272d5e3b3, + 0x9bf612a5a4aad791, + 0xccbbda43d26ffd0f, + 0x34de1f3c946ad250, + 0x4f5b5468995ee16b, + 0xdf9faf6fea8f7794, + 0x2648ea5870dd092b, + 0xbfc7e56d71d97c67, + 0xdde6b2ff4f21d549, + 0x3c276b463ae86003, + 0x91767b4faf86c71f, + 0x68a13e7835d4b9a0, + 0xb68c115f030c9fd4, + 0x141dd2c916582001, + 0x983d8f7ddd5324ac, + 0x64aa703fcc175254, + 0xc2c989948e02b426, + 0x3e5e76d69f46c2de, + 0x50746f03587d8004, + 0x45db3d829272f1e5, + 0x60584a029b560bf3, + 0xfbae58a73ffcdc62, + 0xa15a5e4e6cad4ce8, + 0x4ba96e55ce1fb8cc, + 0x08f9747aae82b253, + 0xc102144cf7fb471b, + 0x9f042898f3eb8e36, + 0x068b27adf2effb7a, + 0xedca97fe8c0a5ebe, + 0x778e0513f4f7d8cf, + 0x302c2501c32b8bf7, + 0x8d92ddfc175c554d, + 0xf865c57f46052f5f, + 0xeaf3301ba2b2f424, + 0xaa68b7ecbbd60d86, + 0x998f0f350104754c, + 0x0000000000000000, + 0xf12e314d34d0ccec, + 0x710522be061823b5, + 0xaf280d9930c005c1, + 0x97fd5ce25d693c65, + 0x19a41cc633cc9a15, + 0x95844172f8c79eb8, + 0xdc5432b7937684a9, + 0x9436c13a2490cf58, + 0x802b13f332c8ef59, + 0xc442ae397ced4f5c, + 0xfa1cd8efe3ab8d82, + 0xf2e5ac954d293fd1, + 0x6ad823e8907a1b7d, + 0x4d2249f83cf043b6, + 0x03cb9dd879f9f33d, + 0xde2d2f2736d82674, + 0x2a43a41f891ee2df, + 0x6f98999d1b6c133a, + 0xd4ad46cd3df436fa, + 0xbb35df50269825c0, + 0x964fdcaa813e6d85, + 0xeb41b0537ee5a5c4, + 0x0540ba758b160847, + 0xa41ae43be7bb44af, + 0xe3b8c429d0671797, + 0x819993bbee9fbeb9, + 0xae9a8dd1ec975421, + 0xf3572cdd917e6e31, + 0x6393d7dae2aff8ce, + 0x47a2201237dc5338, + 0xa32343dec903ee35, + 0x79fc56c4a89a91e6, + 0x01b28048dc5751e0, + 0x1296f564e4b7db7b, + 0x75f7188351597a12, + 0xdb6d9552bdce2e33, + 0x1e9dbb231d74308f, + 0x520d7293fdd322d9, + 0xe20a44610c304677, + 0xfeeee2d2b4ead425, + 0xca30fdee20800675, + 0x61eaca4a47015a13, + 0xe74afe1487264e30, + 0x2cc883b27bf119a5, + 0x1664cf59b3f682dc, + 0xa811aa7c1e78af5b, + 0x1d5626fb648dc3b2, + 0xb73e9117df5bce34, + 0xd05f7cf06ab56f5d, + 0xfd257f0acd132718, + 0x574dc8e676c52a9e, + 0x0739a7e52eb8aa9a, + 0x5486553e0f3cd9a3, + 0x56ff48aeaa927b7e, + 0xbe756525ad8e2d87, + 0x7d0e6cf9ffdbc841, + 0x3b1ecca31450ca99, + 0x6913be30e983e840, + 0xad511009956ea71c, + 0xb1b5b6ba2db4354e, + 0x4469bdca4e25a005, + 0x15af5281ca0f71e1, + 0x744598cb8d0e2bf2, + 0x593f9b312aa863b7, + 0xefb38a6e29a4fc63, + 0x6b6aa3a04c2d4a9d, + 0x3d95eb0ee6bf31e3, + 0xa291c3961554bfd5, + 0x18169c8eef9bcbf5, + 0x115d68bc9d4e2846, + 0xba875f18facf7420, + 0xd1edfcb8b6e23ebd, + 0xb00736f2f1e364ae, + 0x84d929ce6589b6fe, + 0x70b7a2f6da4f7255, + 0x0e7253d75c6d4929, + 0x04f23a3d574159a7, + 0x0a8069ea0b2c108e, + 0x49d073c56bb11a11, + 0x8aab7a1939e4ffd7, + 0xcd095a0b0e38acef, + 0xc9fb60365979f548, + 0x92bde697d67f3422, + 0xc78933e10514bc61, + 0xe1c1d9b975c9b54a, + 0xd2266160cf1bcd80, + 0x9a4492ed78fd8671, + 0xb3ccab2a881a9793, + 0x72cebf667fe1d088, + 0xd6d45b5d985a9427, + }, +}; + +__constant u64 sbob_rc64[12][8] = +{ + { + 0xe9daca1eda5b08b1, + 0x1f7c65c0812fcbeb, + 0x16d0452e43766a2f, + 0xfcc485758db84e71, + 0x0169679291e07c4b, + 0x15d360a4082a42a2, + 0x234d74cc36747605, + 0x0745a6f2596580dd, + }, + { + 0x1a2f9da98ab5a36f, + 0xd7b5700f469de34f, + 0x982b230a72eafef3, + 0x3101b5160f5ed561, + 0x5899d6126b17b59a, + 0xcaa70adbc261b55c, + 0x56cdcbd71ba2dd55, + 0xb79bb121700479e6, + }, + { + 0xc72fce2bacdc74f5, + 0x35843d6a28fc390a, + 0x8b1f9c525f5ef106, + 0x7b7b29b11475eaf2, + 0xb19e3590e40fe2d3, + 0x09db6260373ac9c1, + 0x31db7a8643f4b6c2, + 0xb20aba0af5961e99, + }, + { + 0xd26615e8b3df1fef, + 0xdde4715da0e148f9, + 0x7d3c5c337e858e48, + 0x3f355e68ad1c729d, + 0x75d603ed822cd7a9, + 0xbe0352933313b7d8, + 0xf137e893a1ea5334, + 0x2ed1e384bcbe0c22, + }, + { + 0x994747adac6bea4b, + 0x6323a96c0c413f9a, + 0x4a1086161f1c157f, + 0xbdff0f80d7359e35, + 0xa3f53a254717cdbf, + 0x161a2723b700ffdf, + 0xf563eaa97ea2567a, + 0x57fe6c7cfd581760, + }, + { + 0xd9d33a1daeae4fae, + 0xc039307a3bc3a46f, + 0x6ca44251f9c4662d, + 0xc68ef09ab49a7f18, + 0xb4b79a1cb7a6facf, + 0xb6c6bec2661ff20a, + 0x354f903672c571bf, + 0x6e7d64467a4068fa, + }, + { + 0xecc5aaee160ec7f4, + 0x540924bffe86ac51, + 0xc987bfe6c7c69e39, + 0xc9937a19333e47d3, + 0x372c822dc5ab9209, + 0x04054a2883694706, + 0xf34a3ca24c451735, + 0x93d4143a4d568688, + }, + { + 0xa7c9934d425b1f9b, + 0x41416e0c02aae703, + 0x1ede369c71f8b74e, + 0x9ac4db4d3b44b489, + 0x90069b92cb2b89f4, + 0x2fc4a5d12b8dd169, + 0xd9a8515935c2ac36, + 0x1ee702bfd40d7fa4, + }, + { + 0x9b223116545a8f37, + 0xde5f16ecd89a4c94, + 0x244289251b3a7d3a, + 0x84090de0b755d93c, + 0xb1ceb2db0b440a80, + 0x549c07a69a8a2b7b, + 0x602a1fcb92dc380e, + 0xdb5a238351446172, + }, + { + 0x526f0580a6debeab, + 0xf3f3e4b248e52a38, + 0xdb788aff1ce74189, + 0x0361331b8ae1ff1f, + 0x4b3369af0267e79f, + 0xf452763b306c1e7a, + 0xc3b63b15d1fa9836, + 0xed9c4598fbc7b474, + }, + { + 0xfb89c8efd09ecd7b, + 0x94fe5a63cdc60230, + 0x6107abebbb6bfad8, + 0x7966841421800120, + 0xcab948eaef711d8a, + 0x986e477d1dcdbaef, + 0x5dd86fc04a59a2de, + 0x1b2df381cda4ca6b, + }, + { + 0xba3116f167e78e37, + 0x7ab14904b08013d2, + 0x771ddfbc323ca4cd, + 0x9b9f2130d41220f8, + 0x86cc91189def805d, + 0x5228e188aaa41de7, + 0x991bb2d9d517f4fa, + 0x20d71bf14a92bc48, + }, +}; + +static void streebog_g (u64 h[8], const u64 m[8], __local u64 s_sbob_sl64[8][256]) +{ + u64 k[8]; + u64 s[8]; + u64 t[8]; + + #pragma unroll + for (int i = 0; i < 8; i++) + { + t[i] = h[i]; + } + + for (int i = 0; i < 8; i++) + { + k[i] = SBOG_LPSti64; + } + + #pragma unroll + for (int i = 0; i < 8; i++) + { + s[i] = m[i]; + } + + for (int r = 0; r < 12; r++) + { + #pragma unroll + for (int i = 0; i < 8; i++) + { + t[i] = s[i] ^ k[i]; + } + + #pragma unroll + for (int i = 0; i < 8; i++) + { + s[i] = SBOG_LPSti64; + } + + for (int i = 0; i < 8; i++) + { + t[i] = k[i] ^ sbob_rc64[r][i]; + } + + #pragma unroll + for (int i = 0; i < 8; i++) + { + k[i] = SBOG_LPSti64; + } + } + + #pragma unroll + for (int i = 0; i < 8; i++) + { + h[i] ^= s[i] ^ k[i] ^ m[i]; + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m11800_m04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * shared lookup table + */ + + const u32 lid4 = lid * 4; + + __local u64 s_sbob_sl64[8][256]; + + s_sbob_sl64[0][lid4 + 0] = sbob_sl64[0][lid4 + 0]; + s_sbob_sl64[0][lid4 + 1] = sbob_sl64[0][lid4 + 1]; + s_sbob_sl64[0][lid4 + 2] = sbob_sl64[0][lid4 + 2]; + s_sbob_sl64[0][lid4 + 3] = sbob_sl64[0][lid4 + 3]; + s_sbob_sl64[1][lid4 + 0] = sbob_sl64[1][lid4 + 0]; + s_sbob_sl64[1][lid4 + 1] = sbob_sl64[1][lid4 + 1]; + s_sbob_sl64[1][lid4 + 2] = sbob_sl64[1][lid4 + 2]; + s_sbob_sl64[1][lid4 + 3] = sbob_sl64[1][lid4 + 3]; + s_sbob_sl64[2][lid4 + 0] = sbob_sl64[2][lid4 + 0]; + s_sbob_sl64[2][lid4 + 1] = sbob_sl64[2][lid4 + 1]; + s_sbob_sl64[2][lid4 + 2] = sbob_sl64[2][lid4 + 2]; + s_sbob_sl64[2][lid4 + 3] = sbob_sl64[2][lid4 + 3]; + s_sbob_sl64[3][lid4 + 0] = sbob_sl64[3][lid4 + 0]; + s_sbob_sl64[3][lid4 + 1] = sbob_sl64[3][lid4 + 1]; + s_sbob_sl64[3][lid4 + 2] = sbob_sl64[3][lid4 + 2]; + s_sbob_sl64[3][lid4 + 3] = sbob_sl64[3][lid4 + 3]; + s_sbob_sl64[4][lid4 + 0] = sbob_sl64[4][lid4 + 0]; + s_sbob_sl64[4][lid4 + 1] = sbob_sl64[4][lid4 + 1]; + s_sbob_sl64[4][lid4 + 2] = sbob_sl64[4][lid4 + 2]; + s_sbob_sl64[4][lid4 + 3] = sbob_sl64[4][lid4 + 3]; + s_sbob_sl64[5][lid4 + 0] = sbob_sl64[5][lid4 + 0]; + s_sbob_sl64[5][lid4 + 1] = sbob_sl64[5][lid4 + 1]; + s_sbob_sl64[5][lid4 + 2] = sbob_sl64[5][lid4 + 2]; + s_sbob_sl64[5][lid4 + 3] = sbob_sl64[5][lid4 + 3]; + s_sbob_sl64[6][lid4 + 0] = sbob_sl64[6][lid4 + 0]; + s_sbob_sl64[6][lid4 + 1] = sbob_sl64[6][lid4 + 1]; + s_sbob_sl64[6][lid4 + 2] = sbob_sl64[6][lid4 + 2]; + s_sbob_sl64[6][lid4 + 3] = sbob_sl64[6][lid4 + 3]; + s_sbob_sl64[7][lid4 + 0] = sbob_sl64[7][lid4 + 0]; + s_sbob_sl64[7][lid4 + 1] = sbob_sl64[7][lid4 + 1]; + s_sbob_sl64[7][lid4 + 2] = sbob_sl64[7][lid4 + 2]; + s_sbob_sl64[7][lid4 + 3] = sbob_sl64[7][lid4 + 3]; + + barrier (CLK_LOCAL_MEM_FENCE); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + append_0x80_2 (wordl0, wordl1, pw_l_len); + + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, combs_buf[0].pw_len); + } + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = combs_buf[il_pos].pw_len; + + const u32 pw_len = pw_l_len + pw_r_len; + + u32 wordr0[4]; + + wordr0[0] = combs_buf[il_pos].i[0]; + wordr0[1] = combs_buf[il_pos].i[1]; + wordr0[2] = combs_buf[il_pos].i[2]; + wordr0[3] = combs_buf[il_pos].i[3]; + + u32 wordr1[4]; + + wordr1[0] = combs_buf[il_pos].i[4]; + wordr1[1] = combs_buf[il_pos].i[5]; + wordr1[2] = combs_buf[il_pos].i[6]; + wordr1[3] = combs_buf[il_pos].i[7]; + + u32 wordr2[4]; + + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + + u32 wordr3[4]; + + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + u32x w[16]; + + w[ 0] = wordl0[0] | wordr0[0]; + w[ 1] = wordl0[1] | wordr0[1]; + w[ 2] = wordl0[2] | wordr0[2]; + w[ 3] = wordl0[3] | wordr0[3]; + w[ 4] = wordl1[0] | wordr1[0]; + w[ 5] = wordl1[1] | wordr1[1]; + w[ 6] = wordl1[2] | wordr1[2]; + w[ 7] = wordl1[3] | wordr1[3]; + w[ 8] = wordl2[0] | wordr2[0]; + w[ 9] = wordl2[1] | wordr2[1]; + w[10] = wordl2[2] | wordr2[2]; + w[11] = wordl2[3] | wordr2[3]; + w[12] = wordl3[0] | wordr3[0]; + w[13] = wordl3[1] | wordr3[1]; + w[14] = wordl3[1] | wordr3[1]; + w[15] = wordl3[1] | wordr3[1]; + + append_0x01_4 (&w[0], &w[1], &w[2], &w[3], pw_len); + + /** + * reverse message block + */ + + u64 m[8]; + + m[0] = hl32_to_64 (w[15], w[14]); + m[1] = hl32_to_64 (w[13], w[12]); + m[2] = hl32_to_64 (w[11], w[10]); + m[3] = hl32_to_64 (w[ 9], w[ 8]); + m[4] = hl32_to_64 (w[ 7], w[ 6]); + m[5] = hl32_to_64 (w[ 5], w[ 4]); + m[6] = hl32_to_64 (w[ 3], w[ 2]); + m[7] = hl32_to_64 (w[ 1], w[ 0]); + + m[0] = swap_workaround (m[0]); + m[1] = swap_workaround (m[1]); + m[2] = swap_workaround (m[2]); + m[3] = swap_workaround (m[3]); + m[4] = swap_workaround (m[4]); + m[5] = swap_workaround (m[5]); + m[6] = swap_workaround (m[6]); + m[7] = swap_workaround (m[7]); + + // state buffer (hash) + + u64 h[8]; + + h[0] = INITVAL; + h[1] = INITVAL; + h[2] = INITVAL; + h[3] = INITVAL; + h[4] = INITVAL; + h[5] = INITVAL; + h[6] = INITVAL; + h[7] = INITVAL; + + streebog_g (h, m, s_sbob_sl64); + + u64 z[8]; + + z[0] = 0; + z[1] = 0; + z[2] = 0; + z[3] = 0; + z[4] = 0; + z[5] = 0; + z[6] = 0; + z[7] = swap_workaround ((u64) (pw_len * 8)); + + streebog_g (h, z, s_sbob_sl64); + streebog_g (h, m, s_sbob_sl64); + + const u32 r0 = l32_from_64 (h[0]); + const u32 r1 = h32_from_64 (h[0]); + const u32 r2 = l32_from_64 (h[1]); + const u32 r3 = h32_from_64 (h[1]); + + #include VECT_COMPARE_M + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m11800_m08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m11800_m16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m11800_s04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + + /** + * shared lookup table + */ + + const u32 lid4 = lid * 4; + + __local u64 s_sbob_sl64[8][256]; + + s_sbob_sl64[0][lid4 + 0] = sbob_sl64[0][lid4 + 0]; + s_sbob_sl64[0][lid4 + 1] = sbob_sl64[0][lid4 + 1]; + s_sbob_sl64[0][lid4 + 2] = sbob_sl64[0][lid4 + 2]; + s_sbob_sl64[0][lid4 + 3] = sbob_sl64[0][lid4 + 3]; + s_sbob_sl64[1][lid4 + 0] = sbob_sl64[1][lid4 + 0]; + s_sbob_sl64[1][lid4 + 1] = sbob_sl64[1][lid4 + 1]; + s_sbob_sl64[1][lid4 + 2] = sbob_sl64[1][lid4 + 2]; + s_sbob_sl64[1][lid4 + 3] = sbob_sl64[1][lid4 + 3]; + s_sbob_sl64[2][lid4 + 0] = sbob_sl64[2][lid4 + 0]; + s_sbob_sl64[2][lid4 + 1] = sbob_sl64[2][lid4 + 1]; + s_sbob_sl64[2][lid4 + 2] = sbob_sl64[2][lid4 + 2]; + s_sbob_sl64[2][lid4 + 3] = sbob_sl64[2][lid4 + 3]; + s_sbob_sl64[3][lid4 + 0] = sbob_sl64[3][lid4 + 0]; + s_sbob_sl64[3][lid4 + 1] = sbob_sl64[3][lid4 + 1]; + s_sbob_sl64[3][lid4 + 2] = sbob_sl64[3][lid4 + 2]; + s_sbob_sl64[3][lid4 + 3] = sbob_sl64[3][lid4 + 3]; + s_sbob_sl64[4][lid4 + 0] = sbob_sl64[4][lid4 + 0]; + s_sbob_sl64[4][lid4 + 1] = sbob_sl64[4][lid4 + 1]; + s_sbob_sl64[4][lid4 + 2] = sbob_sl64[4][lid4 + 2]; + s_sbob_sl64[4][lid4 + 3] = sbob_sl64[4][lid4 + 3]; + s_sbob_sl64[5][lid4 + 0] = sbob_sl64[5][lid4 + 0]; + s_sbob_sl64[5][lid4 + 1] = sbob_sl64[5][lid4 + 1]; + s_sbob_sl64[5][lid4 + 2] = sbob_sl64[5][lid4 + 2]; + s_sbob_sl64[5][lid4 + 3] = sbob_sl64[5][lid4 + 3]; + s_sbob_sl64[6][lid4 + 0] = sbob_sl64[6][lid4 + 0]; + s_sbob_sl64[6][lid4 + 1] = sbob_sl64[6][lid4 + 1]; + s_sbob_sl64[6][lid4 + 2] = sbob_sl64[6][lid4 + 2]; + s_sbob_sl64[6][lid4 + 3] = sbob_sl64[6][lid4 + 3]; + s_sbob_sl64[7][lid4 + 0] = sbob_sl64[7][lid4 + 0]; + s_sbob_sl64[7][lid4 + 1] = sbob_sl64[7][lid4 + 1]; + s_sbob_sl64[7][lid4 + 2] = sbob_sl64[7][lid4 + 2]; + s_sbob_sl64[7][lid4 + 3] = sbob_sl64[7][lid4 + 3]; + + barrier (CLK_LOCAL_MEM_FENCE); + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + append_0x80_2 (wordl0, wordl1, pw_l_len); + + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, combs_buf[0].pw_len); + } + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = combs_buf[il_pos].pw_len; + + const u32 pw_len = pw_l_len + pw_r_len; + + u32 wordr0[4]; + + wordr0[0] = combs_buf[il_pos].i[0]; + wordr0[1] = combs_buf[il_pos].i[1]; + wordr0[2] = combs_buf[il_pos].i[2]; + wordr0[3] = combs_buf[il_pos].i[3]; + + u32 wordr1[4]; + + wordr1[0] = combs_buf[il_pos].i[4]; + wordr1[1] = combs_buf[il_pos].i[5]; + wordr1[2] = combs_buf[il_pos].i[6]; + wordr1[3] = combs_buf[il_pos].i[7]; + + u32 wordr2[4]; + + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + + u32 wordr3[4]; + + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + u32x w[16]; + + w[ 0] = wordl0[0] | wordr0[0]; + w[ 1] = wordl0[1] | wordr0[1]; + w[ 2] = wordl0[2] | wordr0[2]; + w[ 3] = wordl0[3] | wordr0[3]; + w[ 4] = wordl1[0] | wordr1[0]; + w[ 5] = wordl1[1] | wordr1[1]; + w[ 6] = wordl1[2] | wordr1[2]; + w[ 7] = wordl1[3] | wordr1[3]; + w[ 8] = wordl2[0] | wordr2[0]; + w[ 9] = wordl2[1] | wordr2[1]; + w[10] = wordl2[2] | wordr2[2]; + w[11] = wordl2[3] | wordr2[3]; + w[12] = wordl3[0] | wordr3[0]; + w[13] = wordl3[1] | wordr3[1]; + w[14] = wordl3[1] | wordr3[1]; + w[15] = wordl3[1] | wordr3[1]; + + append_0x01_4 (&w[0], &w[1], &w[2], &w[3], pw_len); + + /** + * reverse message block + */ + + u64 m[8]; + + m[0] = hl32_to_64 (w[15], w[14]); + m[1] = hl32_to_64 (w[13], w[12]); + m[2] = hl32_to_64 (w[11], w[10]); + m[3] = hl32_to_64 (w[ 9], w[ 8]); + m[4] = hl32_to_64 (w[ 7], w[ 6]); + m[5] = hl32_to_64 (w[ 5], w[ 4]); + m[6] = hl32_to_64 (w[ 3], w[ 2]); + m[7] = hl32_to_64 (w[ 1], w[ 0]); + + m[0] = swap_workaround (m[0]); + m[1] = swap_workaround (m[1]); + m[2] = swap_workaround (m[2]); + m[3] = swap_workaround (m[3]); + m[4] = swap_workaround (m[4]); + m[5] = swap_workaround (m[5]); + m[6] = swap_workaround (m[6]); + m[7] = swap_workaround (m[7]); + + // state buffer (hash) + + u64 h[8]; + + h[0] = INITVAL; + h[1] = INITVAL; + h[2] = INITVAL; + h[3] = INITVAL; + h[4] = INITVAL; + h[5] = INITVAL; + h[6] = INITVAL; + h[7] = INITVAL; + + streebog_g (h, m, s_sbob_sl64); + + u64 z[8]; + + z[0] = 0; + z[1] = 0; + z[2] = 0; + z[3] = 0; + z[4] = 0; + z[5] = 0; + z[6] = 0; + z[7] = swap_workaround ((u64) (pw_len * 8)); + + streebog_g (h, z, s_sbob_sl64); + streebog_g (h, m, s_sbob_sl64); + + const u32 r0 = l32_from_64 (h[0]); + const u32 r1 = h32_from_64 (h[0]); + const u32 r2 = l32_from_64 (h[1]); + const u32 r3 = h32_from_64 (h[1]); + + #include VECT_COMPARE_S + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m11800_s08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m11800_s16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/amd/m11800_a3.cl b/amd/m11800_a3.cl new file mode 100644 index 0000000000..9928c0b1c8 --- /dev/null +++ b/amd/m11800_a3.cl @@ -0,0 +1,2977 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _GOST2012_512_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW4 +#define VECT_SIZE1 +#endif + +#ifdef VLIW5 +#define VECT_SIZE1 +#endif + +#define DGST_R0 0 +#define DGST_R1 1 +#define DGST_R2 2 +#define DGST_R3 3 + +#include "include/kernel_functions.c" +#include "types_amd.c" +#include "common_amd.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +#define INITVAL 0 + +#define SBOG_LPSti64 \ + s_sbob_sl64[0][(t[0] >> (i * 8)) & 0xff] ^ \ + s_sbob_sl64[1][(t[1] >> (i * 8)) & 0xff] ^ \ + s_sbob_sl64[2][(t[2] >> (i * 8)) & 0xff] ^ \ + s_sbob_sl64[3][(t[3] >> (i * 8)) & 0xff] ^ \ + s_sbob_sl64[4][(t[4] >> (i * 8)) & 0xff] ^ \ + s_sbob_sl64[5][(t[5] >> (i * 8)) & 0xff] ^ \ + s_sbob_sl64[6][(t[6] >> (i * 8)) & 0xff] ^ \ + s_sbob_sl64[7][(t[7] >> (i * 8)) & 0xff] + +// constants + +__constant u64 sbob_sl64[8][256] = +{ + { + 0xd031c397ce553fe6, + 0x16ba5b01b006b525, + 0xa89bade6296e70c8, + 0x6a1f525d77d3435b, + 0x6e103570573dfa0b, + 0x660efb2a17fc95ab, + 0x76327a9e97634bf6, + 0x4bad9d6462458bf5, + 0xf1830caedbc3f748, + 0xc5c8f542669131ff, + 0x95044a1cdc48b0cb, + 0x892962df3cf8b866, + 0xb0b9e208e930c135, + 0xa14fb3f0611a767c, + 0x8d2605f21c160136, + 0xd6b71922fecc549e, + 0x37089438a5907d8b, + 0x0b5da38e5803d49c, + 0x5a5bcc9cea6f3cbc, + 0xedae246d3b73ffe5, + 0xd2b87e0fde22edce, + 0x5e54abb1ca8185ec, + 0x1de7f88fe80561b9, + 0xad5e1a870135a08c, + 0x2f2adbd665cecc76, + 0x5780b5a782f58358, + 0x3edc8a2eede47b3f, + 0xc9d95c3506bee70f, + 0x83be111d6c4e05ee, + 0xa603b90959367410, + 0x103c81b4809fde5d, + 0x2c69b6027d0c774a, + 0x399080d7d5c87953, + 0x09d41e16487406b4, + 0xcdd63b1826505e5f, + 0xf99dc2f49b0298e8, + 0x9cd0540a943cb67f, + 0xbca84b7f891f17c5, + 0x723d1db3b78df2a6, + 0x78aa6e71e73b4f2e, + 0x1433e699a071670d, + 0x84f21be454620782, + 0x98df3327b4d20f2f, + 0xf049dce2d3769e5c, + 0xdb6c60199656eb7a, + 0x648746b2078b4783, + 0x32cd23598dcbadcf, + 0x1ea4955bf0c7da85, + 0xe9a143401b9d46b5, + 0xfd92a5d9bbec21b8, + 0xc8138c790e0b8e1b, + 0x2ee00b9a6d7ba562, + 0xf85712b893b7f1fc, + 0xeb28fed80bea949d, + 0x564a65eb8a40ea4c, + 0x6c9988e8474a2823, + 0x4535898b121d8f2d, + 0xabd8c03231accbf4, + 0xba2e91cab9867cbd, + 0x7960be3def8e263a, + 0x0c11a977602fd6f0, + 0xcb50e1ad16c93527, + 0xeae22e94035ffd89, + 0x2866d12f5de2ce1a, + 0xff1b1841ab9bf390, + 0x9f9339de8cfe0d43, + 0x964727c8c48a0bf7, + 0x524502c6aaae531c, + 0x9b9c5ef3ac10b413, + 0x4fa2fa4942ab32a5, + 0x3f165a62e551122b, + 0xc74148da76e6e3d7, + 0x924840e5e464b2a7, + 0xd372ae43d69784da, + 0x233b72a105e11a86, + 0xa48a04914941a638, + 0xb4b68525c9de7865, + 0xddeabaaca6cf8002, + 0x0a9773c250b6bd88, + 0xc284ffbb5ebd3393, + 0x8ba0df472c8f6a4e, + 0x2aef6cb74d951c32, + 0x427983722a318d41, + 0x73f7cdffbf389bb2, + 0x074c0af9382c026c, + 0x8a6a0f0b243a035a, + 0x6fdae53c5f88931f, + 0xc68b98967e538ac3, + 0x44ff59c71aa8e639, + 0xe2fce0ce439e9229, + 0xa20cde2479d8cd40, + 0x19e89fa2c8ebd8e9, + 0xf446bbcff398270c, + 0x43b3533e2284e455, + 0xd82f0dcd8e945046, + 0x51066f12b26ce820, + 0xe73957af6bc5426d, + 0x081ece5a40c16fa0, + 0x3b193d4fc5bfab7b, + 0x7fe66488df174d42, + 0x0e9814ef705804d8, + 0x8137ac857c39d7c6, + 0xb1733244e185a821, + 0x695c3f896f11f867, + 0xf6cf0657e3eff524, + 0x1aabf276d02963d5, + 0x2da3664e75b91e5e, + 0x0289bd981077d228, + 0x90c1fd7df413608f, + 0x3c5537b6fd93a917, + 0xaa12107e3919a2e0, + 0x0686dab530996b78, + 0xdaa6b0559ee3826e, + 0xc34e2ff756085a87, + 0x6d5358a44fff4137, + 0xfc587595b35948ac, + 0x7ca5095cc7d5f67e, + 0xfb147f6c8b754ac0, + 0xbfeb26ab91ddacf9, + 0x6896efc567a49173, + 0xca9a31e11e7c5c33, + 0xbbe44186b13315a9, + 0x0ddb793b689abfe4, + 0x70b4a02ba7fa208e, + 0xe47a3a7b7307f951, + 0x8cecd5be14a36822, + 0xeeed49b923b144d9, + 0x17708b4db8b3dc31, + 0x6088219f2765fed3, + 0xb3fa8fdcf1f27a09, + 0x910b2d31fca6099b, + 0x0f52c4a378ed6dcc, + 0x50ccbf5ebad98134, + 0x6bd582117f662a4f, + 0x94ce9a50d4fdd9df, + 0x2b25bcfb45207526, + 0x67c42b661f49fcbf, + 0x492420fc723259dd, + 0x03436dd418c2bb3c, + 0x1f6e4517f872b391, + 0xa08563bc69af1f68, + 0xd43ea4baeebb86b6, + 0x01cad04c08b56914, + 0xac94cacb0980c998, + 0x54c3d8739a373864, + 0x26fec5c02dbacac2, + 0xdea9d778be0d3b3e, + 0x040f672d20eeb950, + 0xe5b0ea377bb29045, + 0xf30ab136cbb42560, + 0x62019c0737122cfb, + 0xe86b930c13282fa1, + 0xcc1ceb542ee5374b, + 0x538fd28aa21b3a08, + 0x1b61223ad89c0ac1, + 0x36c24474ad25149f, + 0x7a23d3e9f74c9d06, + 0xbe21f6e79968c5ed, + 0xcf5f868036278c77, + 0xf705d61beb5a9c30, + 0x4d2b47d152dce08d, + 0x5f9e7bfdc234ecf8, + 0x247778583dcd18ea, + 0x867ba67c4415d5aa, + 0x4ce1979d5a698999, + 0x0000000000000000, + 0xec64f42133c696f1, + 0xb57c5569c16b1171, + 0xc1c7926f467f88af, + 0x654d96fe0f3e2e97, + 0x15f936d5a8c40e19, + 0xb8a72c52a9f1ae95, + 0xa9517daa21db19dc, + 0x58d27104fa18ee94, + 0x5918a148f2ad8780, + 0x5cdd1629daf657c4, + 0x8274c15164fb6cfa, + 0xd1fb13dbc6e056f2, + 0x7d6fd910cf609f6a, + 0xb63f38bdd9a9aa4d, + 0x3d9fe7faf526c003, + 0x74bbc706871499de, + 0xdf630734b6b8522a, + 0x3ad3ed03cd0ac26f, + 0xfadeaf2083c023d4, + 0xc00d42234ecae1bb, + 0x8538cba85cd76e96, + 0xc402250e6e2458eb, + 0x47bc3413026a5d05, + 0xafd7a71f114272a4, + 0x978df784cc3f62e3, + 0xb96dfc1ea144c781, + 0x21b2cf391596c8ae, + 0x318e4e8d950916f3, + 0xce9556cc3e92e563, + 0x385a509bdd7d1047, + 0x358129a0b5e7afa3, + 0xe6f387e363702b79, + 0xe0755d5653e94001, + 0x7be903a5fff9f412, + 0x12b53c2c90e80c75, + 0x3307f315857ec4db, + 0x8fafb86a0c61d31e, + 0xd9e5dd8186213952, + 0x77f8aad29fd622e2, + 0x25bda814357871fe, + 0x7571174a8fa1f0ca, + 0x137fec60985d6561, + 0x30449ec19dbc7fe7, + 0xa540d4dd41f4cf2c, + 0xdc206ae0ae7ae916, + 0x5b911cd0e2da55a8, + 0xb2305f90f947131d, + 0x344bf9ecbd52c6b7, + 0x5d17c665d2433ed0, + 0x18224feec05eb1fd, + 0x9e59e992844b6457, + 0x9a568ebfa4a5dd07, + 0xa3c60e68716da454, + 0x7e2cb4c4d7a22456, + 0x87b176304ca0bcbe, + 0x413aeea632f3367d, + 0x9915e36bbc67663b, + 0x40f03eea3a465f69, + 0x1c2d28c3e0b008ad, + 0x4e682a054a1e5bb1, + 0x05c5b761285bd044, + 0xe1bf8d1a5b5c2915, + 0xf2c0617ac3014c74, + 0xb7f5e8f1d11cc359, + 0x63cb4c4b3fa745ef, + 0x9d1a84469c89df6b, + 0xe33630824b2bfb3d, + 0xd5f474f6e60eefa2, + 0xf58c6b83fb2d4e18, + 0x4676e45f0adf3411, + 0x20781f751d23a1ba, + 0xbd629b3381aa7ed1, + 0xae1d775319f71bb0, + 0xfed1c80da32e9a84, + 0x5509083f92825170, + 0x29ac01635557a70e, + 0xa7c9694551831d04, + 0x8e65682604d4ba0a, + 0x11f651f8882ab749, + 0xd77dc96ef6793d8a, + 0xef2799f52b042dcd, + 0x48eef0b07a8730c9, + 0x22f1a2ed0d547392, + 0x6142f1d32fd097c7, + 0x4a674d286af0e2e1, + 0x80fd7cc9748cbed2, + 0x717e7067af4f499a, + 0x938290a9ecd1dbb3, + 0x88e3b293344dd172, + 0x2734158c250fa3d6, + }, + { + 0x7e37e62dfc7d40c3, + 0x776f25a4ee939e5b, + 0xe045c850dd8fb5ad, + 0x86ed5ba711ff1952, + 0xe91d0bd9cf616b35, + 0x37e0ab256e408ffb, + 0x9607f6c031025a7a, + 0x0b02f5e116d23c9d, + 0xf3d8486bfb50650c, + 0x621cff27c40875f5, + 0x7d40cb71fa5fd34a, + 0x6daa6616daa29062, + 0x9f5f354923ec84e2, + 0xec847c3dc507c3b3, + 0x025a3668043ce205, + 0xa8bf9e6c4dac0b19, + 0xfa808be2e9bebb94, + 0xb5b99c5277c74fa3, + 0x78d9bc95f0397bcc, + 0xe332e50cdbad2624, + 0xc74fce129332797e, + 0x1729eceb2ea709ab, + 0xc2d6b9f69954d1f8, + 0x5d898cbfbab8551a, + 0x859a76fb17dd8adb, + 0x1be85886362f7fb5, + 0xf6413f8ff136cd8a, + 0xd3110fa5bbb7e35c, + 0x0a2feed514cc4d11, + 0xe83010edcd7f1ab9, + 0xa1e75de55f42d581, + 0xeede4a55c13b21b6, + 0xf2f5535ff94e1480, + 0x0cc1b46d1888761e, + 0xbce15fdb6529913b, + 0x2d25e8975a7181c2, + 0x71817f1ce2d7a554, + 0x2e52c5cb5c53124b, + 0xf9f7a6beef9c281d, + 0x9e722e7d21f2f56e, + 0xce170d9b81dca7e6, + 0x0e9b82051cb4941b, + 0x1e712f623c49d733, + 0x21e45cfa42f9f7dc, + 0xcb8e7a7f8bba0f60, + 0x8e98831a010fb646, + 0x474ccf0d8e895b23, + 0xa99285584fb27a95, + 0x8cc2b57205335443, + 0x42d5b8e984eff3a5, + 0x012d1b34021e718c, + 0x57a6626aae74180b, + 0xff19fc06e3d81312, + 0x35ba9d4d6a7c6dfe, + 0xc9d44c178f86ed65, + 0x506523e6a02e5288, + 0x03772d5c06229389, + 0x8b01f4fe0b691ec0, + 0xf8dabd8aed825991, + 0x4c4e3aec985b67be, + 0xb10df0827fbf96a9, + 0x6a69279ad4f8dae1, + 0xe78689dcd3d5ff2e, + 0x812e1a2b1fa553d1, + 0xfbad90d6eba0ca18, + 0x1ac543b234310e39, + 0x1604f7df2cb97827, + 0xa6241c6951189f02, + 0x753513cceaaf7c5e, + 0x64f2a59fc84c4efa, + 0x247d2b1e489f5f5a, + 0xdb64d718ab474c48, + 0x79f4a7a1f2270a40, + 0x1573da832a9bebae, + 0x3497867968621c72, + 0x514838d2a2302304, + 0xf0af6537fd72f685, + 0x1d06023e3a6b44ba, + 0x678588c3ce6edd73, + 0x66a893f7cc70acff, + 0xd4d24e29b5eda9df, + 0x3856321470ea6a6c, + 0x07c3418c0e5a4a83, + 0x2bcbb22f5635bacd, + 0x04b46cd00878d90a, + 0x06ee5ab80c443b0f, + 0x3b211f4876c8f9e5, + 0x0958c38912eede98, + 0xd14b39cdbf8b0159, + 0x397b292072f41be0, + 0x87c0409313e168de, + 0xad26e98847caa39f, + 0x4e140c849c6785bb, + 0xd5ff551db7f3d853, + 0xa0ca46d15d5ca40d, + 0xcd6020c787fe346f, + 0x84b76dcf15c3fb57, + 0xdefda0fca121e4ce, + 0x4b8d7b6096012d3d, + 0x9ac642ad298a2c64, + 0x0875d8bd10f0af14, + 0xb357c6ea7b8374ac, + 0x4d6321d89a451632, + 0xeda96709c719b23f, + 0xf76c24bbf328bc06, + 0xc662d526912c08f2, + 0x3ce25ec47892b366, + 0xb978283f6f4f39bd, + 0xc08c8f9e9d6833fd, + 0x4f3917b09e79f437, + 0x593de06fb2c08c10, + 0xd6887841b1d14bda, + 0x19b26eee32139db0, + 0xb494876675d93e2f, + 0x825937771987c058, + 0x90e9ac783d466175, + 0xf1827e03ff6c8709, + 0x945dc0a8353eb87f, + 0x4516f9658ab5b926, + 0x3f9573987eb020ef, + 0xb855330b6d514831, + 0x2ae6a91b542bcb41, + 0x6331e413c6160479, + 0x408f8e8180d311a0, + 0xeff35161c325503a, + 0xd06622f9bd9570d5, + 0x8876d9a20d4b8d49, + 0xa5533135573a0c8b, + 0xe168d364df91c421, + 0xf41b09e7f50a2f8f, + 0x12b09b0f24c1a12d, + 0xda49cc2ca9593dc4, + 0x1f5c34563e57a6bf, + 0x54d14f36a8568b82, + 0xaf7cdfe043f6419a, + 0xea6a2685c943f8bc, + 0xe5dcbfb4d7e91d2b, + 0xb27addde799d0520, + 0x6b443caed6e6ab6d, + 0x7bae91c9f61be845, + 0x3eb868ac7cae5163, + 0x11c7b65322e332a4, + 0xd23c1491b9a992d0, + 0x8fb5982e0311c7ca, + 0x70ac6428e0c9d4d8, + 0x895bc2960f55fcc5, + 0x76423e90ec8defd7, + 0x6ff0507ede9e7267, + 0x3dcf45f07a8cc2ea, + 0x4aa06054941f5cb1, + 0x5810fb5bb0defd9c, + 0x5efea1e3bc9ac693, + 0x6edd4b4adc8003eb, + 0x741808f8e8b10dd2, + 0x145ec1b728859a22, + 0x28bc9f7350172944, + 0x270a06424ebdccd3, + 0x972aedf4331c2bf6, + 0x059977e40a66a886, + 0x2550302a4a812ed6, + 0xdd8a8da0a7037747, + 0xc515f87a970e9b7b, + 0x3023eaa9601ac578, + 0xb7e3aa3a73fbada6, + 0x0fb699311eaae597, + 0x0000000000000000, + 0x310ef19d6204b4f4, + 0x229371a644db6455, + 0x0decaf591a960792, + 0x5ca4978bb8a62496, + 0x1c2b190a38753536, + 0x41a295b582cd602c, + 0x3279dcc16426277d, + 0xc1a194aa9f764271, + 0x139d803b26dfd0a1, + 0xae51c4d441e83016, + 0xd813fa44ad65dfc1, + 0xac0bf2bc45d4d213, + 0x23be6a9246c515d9, + 0x49d74d08923dcf38, + 0x9d05032127d066e7, + 0x2f7fdeff5e4d63c7, + 0xa47e2a0155247d07, + 0x99b16ff12fa8bfed, + 0x4661d4398c972aaf, + 0xdfd0bbc8a33f9542, + 0xdca79694a51d06cb, + 0xb020ebb67da1e725, + 0xba0f0563696daa34, + 0xe4f1a480d5f76ca7, + 0xc438e34e9510eaf7, + 0x939e81243b64f2fc, + 0x8defae46072d25cf, + 0x2c08f3a3586ff04e, + 0xd7a56375b3cf3a56, + 0x20c947ce40e78650, + 0x43f8a3dd86f18229, + 0x568b795eac6a6987, + 0x8003011f1dbb225d, + 0xf53612d3f7145e03, + 0x189f75da300dec3c, + 0x9570db9c3720c9f3, + 0xbb221e576b73dbb8, + 0x72f65240e4f536dd, + 0x443be25188abc8aa, + 0xe21ffe38d9b357a8, + 0xfd43ca6ee7e4f117, + 0xcaa3614b89a47eec, + 0xfe34e732e1c6629e, + 0x83742c431b99b1d4, + 0xcf3a16af83c2d66a, + 0xaae5a8044990e91c, + 0x26271d764ca3bd5f, + 0x91c4b74c3f5810f9, + 0x7c6dd045f841a2c6, + 0x7f1afd19fe63314f, + 0xc8f957238d989ce9, + 0xa709075d5306ee8e, + 0x55fc5402aa48fa0e, + 0x48fa563c9023beb4, + 0x65dfbeabca523f76, + 0x6c877d22d8bce1ee, + 0xcc4d3bf385e045e3, + 0xbebb69b36115733e, + 0x10eaad6720fd4328, + 0xb6ceb10e71e5dc2a, + 0xbdcc44ef6737e0b7, + 0x523f158ea412b08d, + 0x989c74c52db6ce61, + 0x9beb59992b945de8, + 0x8a2cefca09776f4c, + 0xa3bd6b8d5b7e3784, + 0xeb473db1cb5d8930, + 0xc3fba2c29b4aa074, + 0x9c28181525ce176b, + 0x683311f2d0c438e4, + 0x5fd3bad7be84b71f, + 0xfc6ed15ae5fa809b, + 0x36cdb0116c5efe77, + 0x29918447520958c8, + 0xa29070b959604608, + 0x53120ebaa60cc101, + 0x3a0c047c74d68869, + 0x691e0ac6d2da4968, + 0x73db4974e6eb4751, + 0x7a838afdf40599c9, + 0x5a4acd33b4e21f99, + 0x6046c94fc03497f0, + 0xe6ab92e8d1cb8ea2, + 0x3354c7f5663856f1, + 0xd93ee170af7bae4d, + 0x616bd27bc22ae67c, + 0x92b39a10397a8370, + 0xabc8b3304b8e9890, + 0xbf967287630b02b2, + 0x5b67d607b6fc6e15, + }, + { + 0x8ab0a96846e06a6d, + 0x43c7e80b4bf0b33a, + 0x08c9b3546b161ee5, + 0x39f1c235eba990be, + 0xc1bef2376606c7b2, + 0x2c209233614569aa, + 0xeb01523b6fc3289a, + 0x946953ab935acedd, + 0x272838f63e13340e, + 0x8b0455eca12ba052, + 0x77a1b2c4978ff8a2, + 0xa55122ca13e54086, + 0x2276135862d3f1cd, + 0xdb8ddfde08b76cfe, + 0x5d1e12c89e4a178a, + 0x0e56816b03969867, + 0xee5f79953303ed59, + 0xafed748bab78d71d, + 0x6d929f2df93e53ee, + 0xf5d8a8f8ba798c2a, + 0xf619b1698e39cf6b, + 0x95ddaf2f749104e2, + 0xec2a9c80e0886427, + 0xce5c8fd8825b95ea, + 0xc4e0d9993ac60271, + 0x4699c3a5173076f9, + 0x3d1b151f50a29f42, + 0x9ed505ea2bc75946, + 0x34665acfdc7f4b98, + 0x61b1fb53292342f7, + 0xc721c0080e864130, + 0x8693cd1696fd7b74, + 0x872731927136b14b, + 0xd3446c8a63a1721b, + 0x669a35e8a6680e4a, + 0xcab658f239509a16, + 0xa4e5de4ef42e8ab9, + 0x37a7435ee83f08d9, + 0x134e6239e26c7f96, + 0x82791a3c2df67488, + 0x3f6ef00a8329163c, + 0x8e5a7e42fdeb6591, + 0x5caaee4c7981ddb5, + 0x19f234785af1e80d, + 0x255ddde3ed98bd70, + 0x50898a32a99cccac, + 0x28ca4519da4e6656, + 0xae59880f4cb31d22, + 0x0d9798fa37d6db26, + 0x32f968f0b4ffcd1a, + 0xa00f09644f258545, + 0xfa3ad5175e24de72, + 0xf46c547c5db24615, + 0x713e80fbff0f7e20, + 0x7843cf2b73d2aafa, + 0xbd17ea36aedf62b4, + 0xfd111bacd16f92cf, + 0x4abaa7dbc72d67e0, + 0xb3416b5dad49fad3, + 0xbca316b24914a88b, + 0x15d150068aecf914, + 0xe27c1debe31efc40, + 0x4fe48c759beda223, + 0x7edcfd141b522c78, + 0x4e5070f17c26681c, + 0xe696cac15815f3bc, + 0x35d2a64b3bb481a7, + 0x800cff29fe7dfdf6, + 0x1ed9fac3d5baa4b0, + 0x6c2663a91ef599d1, + 0x03c1199134404341, + 0xf7ad4ded69f20554, + 0xcd9d9649b61bd6ab, + 0xc8c3bde7eadb1368, + 0xd131899fb02afb65, + 0x1d18e352e1fae7f1, + 0xda39235aef7ca6c1, + 0xa1bbf5e0a8ee4f7a, + 0x91377805cf9a0b1e, + 0x3138716180bf8e5b, + 0xd9f83acbdb3ce580, + 0x0275e515d38b897e, + 0x472d3f21f0fbbcc6, + 0x2d946eb7868ea395, + 0xba3c248d21942e09, + 0xe7223645bfde3983, + 0xff64feb902e41bb1, + 0xc97741630d10d957, + 0xc3cb1722b58d4ecc, + 0xa27aec719cae0c3b, + 0x99fecb51a48c15fb, + 0x1465ac826d27332b, + 0xe1bd047ad75ebf01, + 0x79f733af941960c5, + 0x672ec96c41a3c475, + 0xc27feba6524684f3, + 0x64efd0fd75e38734, + 0xed9e60040743ae18, + 0xfb8e2993b9ef144d, + 0x38453eb10c625a81, + 0x6978480742355c12, + 0x48cf42ce14a6ee9e, + 0x1cac1fd606312dce, + 0x7b82d6ba4792e9bb, + 0x9d141c7b1f871a07, + 0x5616b80dc11c4a2e, + 0xb849c198f21fa777, + 0x7ca91801c8d9a506, + 0xb1348e487ec273ad, + 0x41b20d1e987b3a44, + 0x7460ab55a3cfbbe3, + 0x84e628034576f20a, + 0x1b87d16d897a6173, + 0x0fe27defe45d5258, + 0x83cde6b8ca3dbeb7, + 0x0c23647ed01d1119, + 0x7a362a3ea0592384, + 0xb61f40f3f1893f10, + 0x75d457d1440471dc, + 0x4558da34237035b8, + 0xdca6116587fc2043, + 0x8d9b67d3c9ab26d0, + 0x2b0b5c88ee0e2517, + 0x6fe77a382ab5da90, + 0x269cc472d9d8fe31, + 0x63c41e46faa8cb89, + 0xb7abbc771642f52f, + 0x7d1de4852f126f39, + 0xa8c6ba3024339ba0, + 0x600507d7cee888c8, + 0x8fee82c61a20afae, + 0x57a2448926d78011, + 0xfca5e72836a458f0, + 0x072bcebb8f4b4cbd, + 0x497bbe4af36d24a1, + 0x3cafe99bb769557d, + 0x12fa9ebd05a7b5a9, + 0xe8c04baa5b836bdb, + 0x4273148fac3b7905, + 0x908384812851c121, + 0xe557d3506c55b0fd, + 0x72ff996acb4f3d61, + 0x3eda0c8e64e2dc03, + 0xf0868356e6b949e9, + 0x04ead72abb0b0ffc, + 0x17a4b5135967706a, + 0xe3c8e16f04d5367f, + 0xf84f30028daf570c, + 0x1846c8fcbd3a2232, + 0x5b8120f7f6ca9108, + 0xd46fa231ecea3ea6, + 0x334d947453340725, + 0x58403966c28ad249, + 0xbed6f3a79a9f21f5, + 0x68ccb483a5fe962d, + 0xd085751b57e1315a, + 0xfed0023de52fd18e, + 0x4b0e5b5f20e6addf, + 0x1a332de96eb1ab4c, + 0xa3ce10f57b65c604, + 0x108f7ba8d62c3cd7, + 0xab07a3a11073d8e1, + 0x6b0dad1291bed56c, + 0xf2f366433532c097, + 0x2e557726b2cee0d4, + 0x0000000000000000, + 0xcb02a476de9b5029, + 0xe4e32fd48b9e7ac2, + 0x734b65ee2c84f75e, + 0x6e5386bccd7e10af, + 0x01b4fc84e7cbca3f, + 0xcfe8735c65905fd5, + 0x3613bfda0ff4c2e6, + 0x113b872c31e7f6e8, + 0x2fe18ba255052aeb, + 0xe974b72ebc48a1e4, + 0x0abc5641b89d979b, + 0xb46aa5e62202b66e, + 0x44ec26b0c4bbff87, + 0xa6903b5b27a503c7, + 0x7f680190fc99e647, + 0x97a84a3aa71a8d9c, + 0xdd12ede16037ea7c, + 0xc554251ddd0dc84e, + 0x88c54c7d956be313, + 0x4d91696048662b5d, + 0xb08072cc9909b992, + 0xb5de5962c5c97c51, + 0x81b803ad19b637c9, + 0xb2f597d94a8230ec, + 0x0b08aac55f565da4, + 0xf1327fd2017283d6, + 0xad98919e78f35e63, + 0x6ab9519676751f53, + 0x24e921670a53774f, + 0xb9fd3d1c15d46d48, + 0x92f66194fbda485f, + 0x5a35dc7311015b37, + 0xded3f4705477a93d, + 0xc00a0eb381cd0d8d, + 0xbb88d809c65fe436, + 0x16104997beacba55, + 0x21b70ac95693b28c, + 0x59f4c5e225411876, + 0xd5db5eb50b21f499, + 0x55d7a19cf55c096f, + 0xa97246b4c3f8519f, + 0x8552d487a2bd3835, + 0x54635d181297c350, + 0x23c2efdc85183bf2, + 0x9f61f96ecc0c9379, + 0x534893a39ddc8fed, + 0x5edf0b59aa0a54cb, + 0xac2c6d1a9f38945c, + 0xd7aebba0d8aa7de7, + 0x2abfa00c09c5ef28, + 0xd84cc64f3cf72fbf, + 0x2003f64db15878b3, + 0xa724c7dfc06ec9f8, + 0x069f323f68808682, + 0xcc296acd51d01c94, + 0x055e2bae5cc0c5c3, + 0x6270e2c21d6301b6, + 0x3b842720382219c0, + 0xd2f0900e846ab824, + 0x52fc6f277a1745d2, + 0xc6953c8ce94d8b0f, + 0xe009f8fe3095753e, + 0x655b2c7992284d0b, + 0x984a37d54347dfc4, + 0xeab5aebf8808e2a5, + 0x9a3fd2c090cc56ba, + 0x9ca0e0fff84cd038, + 0x4c2595e4afade162, + 0xdf6708f4b3bc6302, + 0xbf620f237d54ebca, + 0x93429d101c118260, + 0x097d4fd08cddd4da, + 0x8c2f9b572e60ecef, + 0x708a7c7f18c4b41f, + 0x3a30dba4dfe9d3ff, + 0x4006f19a7fb0f07b, + 0x5f6bf7dd4dc19ef4, + 0x1f6d064732716e8f, + 0xf9fbcc866a649d33, + 0x308c8de567744464, + 0x8971b0f972a0292c, + 0xd61a47243f61b7d8, + 0xefeb8511d4c82766, + 0x961cb6be40d147a3, + 0xaab35f25f7b812de, + 0x76154e407044329d, + 0x513d76b64e570693, + 0xf3479ac7d2f90aa8, + 0x9b8b2e4477079c85, + 0x297eb99d3d85ac69, + }, + { + 0x3ef29d249b2c0a19, + 0xe9e16322b6f8622f, + 0x5536994047757f7a, + 0x9f4d56d5a47b0b33, + 0x822567466aa1174c, + 0xb8f5057deb082fb2, + 0xcc48c10bf4475f53, + 0x373088d4275dec3a, + 0x968f4325180aed10, + 0x173d232cf7016151, + 0xae4ed09f946fcc13, + 0xfd4b4741c4539873, + 0x1b5b3f0dd9933765, + 0x2ffcb0967b644052, + 0xe02376d20a89840c, + 0xa3ae3a70329b18d7, + 0x419cbd2335de8526, + 0xfafebf115b7c3199, + 0x0397074f85aa9b0d, + 0xc58ad4fb4836b970, + 0xbec60be3fc4104a8, + 0x1eff36dc4b708772, + 0x131fdc33ed8453b6, + 0x0844e33e341764d3, + 0x0ff11b6eab38cd39, + 0x64351f0a7761b85a, + 0x3b5694f509cfba0e, + 0x30857084b87245d0, + 0x47afb3bd2297ae3c, + 0xf2ba5c2f6f6b554a, + 0x74bdc4761f4f70e1, + 0xcfdfc64471edc45e, + 0xe610784c1dc0af16, + 0x7aca29d63c113f28, + 0x2ded411776a859af, + 0xac5f211e99a3d5ee, + 0xd484f949a87ef33b, + 0x3ce36ca596e013e4, + 0xd120f0983a9d432c, + 0x6bc40464dc597563, + 0x69d5f5e5d1956c9e, + 0x9ae95f043698bb24, + 0xc9ecc8da66a4ef44, + 0xd69508c8a5b2eac6, + 0xc40c2235c0503b80, + 0x38c193ba8c652103, + 0x1ceec75d46bc9e8f, + 0xd331011937515ad1, + 0xd8e2e56886eca50f, + 0xb137108d5779c991, + 0x709f3b6905ca4206, + 0x4feb50831680caef, + 0xec456af3241bd238, + 0x58d673afe181abbe, + 0x242f54e7cad9bf8c, + 0x0211f1810dcc19fd, + 0x90bc4dbb0f43c60a, + 0x9518446a9da0761d, + 0xa1bfcbf13f57012a, + 0x2bde4f8961e172b5, + 0x27b853a84f732481, + 0xb0b1e643df1f4b61, + 0x18cc38425c39ac68, + 0xd2b7f7d7bf37d821, + 0x3103864a3014c720, + 0x14aa246372abfa5c, + 0x6e600db54ebac574, + 0x394765740403a3f3, + 0x09c215f0bc71e623, + 0x2a58b947e987f045, + 0x7b4cdf18b477bdd8, + 0x9709b5eb906c6fe0, + 0x73083c268060d90b, + 0xfedc400e41f9037e, + 0x284948c6e44be9b8, + 0x728ecae808065bfb, + 0x06330e9e17492b1a, + 0x5950856169e7294e, + 0xbae4f4fce6c4364f, + 0xca7bcf95e30e7449, + 0x7d7fd186a33e96c2, + 0x52836110d85ad690, + 0x4dfaa1021b4cd312, + 0x913abb75872544fa, + 0xdd46ecb9140f1518, + 0x3d659a6b1e869114, + 0xc23f2cabd719109a, + 0xd713fe062dd46836, + 0xd0a60656b2fbc1dc, + 0x221c5a79dd909496, + 0xefd26dbca1b14935, + 0x0e77eda0235e4fc9, + 0xcbfd395b6b68f6b9, + 0x0de0eaefa6f4d4c4, + 0x0422ff1f1a8532e7, + 0xf969b85eded6aa94, + 0x7f6e2007aef28f3f, + 0x3ad0623b81a938fe, + 0x6624ee8b7aada1a7, + 0xb682e8ddc856607b, + 0xa78cc56f281e2a30, + 0xc79b257a45faa08d, + 0x5b4174e0642b30b3, + 0x5f638bff7eae0254, + 0x4bc9af9c0c05f808, + 0xce59308af98b46ae, + 0x8fc58da9cc55c388, + 0x803496c7676d0eb1, + 0xf33caae1e70dd7ba, + 0xbb6202326ea2b4bf, + 0xd5020f87201871cb, + 0x9d5ca754a9b712ce, + 0x841669d87de83c56, + 0x8a6184785eb6739f, + 0x420bba6cb0741e2b, + 0xf12d5b60eac1ce47, + 0x76ac35f71283691c, + 0x2c6bb7d9fecedb5f, + 0xfccdb18f4c351a83, + 0x1f79c012c3160582, + 0xf0abadae62a74cb7, + 0xe1a5801c82ef06fc, + 0x67a21845f2cb2357, + 0x5114665f5df04d9d, + 0xbf40fd2d74278658, + 0xa0393d3fb73183da, + 0x05a409d192e3b017, + 0xa9fb28cf0b4065f9, + 0x25a9a22942bf3d7c, + 0xdb75e22703463e02, + 0xb326e10c5ab5d06c, + 0xe7968e8295a62de6, + 0xb973f3b3636ead42, + 0xdf571d3819c30ce5, + 0xee549b7229d7cbc5, + 0x12992afd65e2d146, + 0xf8ef4e9056b02864, + 0xb7041e134030e28b, + 0xc02edd2adad50967, + 0x932b4af48ae95d07, + 0x6fe6fb7bc6dc4784, + 0x239aacb755f61666, + 0x401a4bedbdb807d6, + 0x485ea8d389af6305, + 0xa41bc220adb4b13d, + 0x753b32b89729f211, + 0x997e584bb3322029, + 0x1d683193ceda1c7f, + 0xff5ab6c0c99f818e, + 0x16bbd5e27f67e3a1, + 0xa59d34ee25d233cd, + 0x98f8ae853b54a2d9, + 0x6df70afacb105e79, + 0x795d2e99b9bba425, + 0x8e437b6744334178, + 0x0186f6ce886682f0, + 0xebf092a3bb347bd2, + 0xbcd7fa62f18d1d55, + 0xadd9d7d011c5571e, + 0x0bd3e471b1bdffde, + 0xaa6c2f808eeafef4, + 0x5ee57d31f6c880a4, + 0xf50fa47ff044fca0, + 0x1addc9c351f5b595, + 0xea76646d3352f922, + 0x0000000000000000, + 0x85909f16f58ebea6, + 0x46294573aaf12ccc, + 0x0a5512bf39db7d2e, + 0x78dbd85731dd26d5, + 0x29cfbe086c2d6b48, + 0x218b5d36583a0f9b, + 0x152cd2adfacd78ac, + 0x83a39188e2c795bc, + 0xc3b9da655f7f926a, + 0x9ecba01b2c1d89c3, + 0x07b5f8509f2fa9ea, + 0x7ee8d6c926940dcf, + 0x36b67e1aaf3b6eca, + 0x86079859702425ab, + 0xfb7849dfd31ab369, + 0x4c7c57cc932a51e2, + 0xd96413a60e8a27ff, + 0x263ea566c715a671, + 0x6c71fc344376dc89, + 0x4a4f595284637af8, + 0xdaf314e98b20bcf2, + 0x572768c14ab96687, + 0x1088db7c682ec8bb, + 0x887075f9537a6a62, + 0x2e7a4658f302c2a2, + 0x619116dbe582084d, + 0xa87dde018326e709, + 0xdcc01a779c6997e8, + 0xedc39c3dac7d50c8, + 0xa60a33a1a078a8c0, + 0xc1a82be452b38b97, + 0x3f746bea134a88e9, + 0xa228ccbebafd9a27, + 0xabead94e068c7c04, + 0xf48952b178227e50, + 0x5cf48cb0fb049959, + 0x6017e0156de48abd, + 0x4438b4f2a73d3531, + 0x8c528ae649ff5885, + 0xb515ef924dfcfb76, + 0x0c661c212e925634, + 0xb493195cc59a7986, + 0x9cda519a21d1903e, + 0x32948105b5be5c2d, + 0x194ace8cd45f2e98, + 0x438d4ca238129cdb, + 0x9b6fa9cabefe39d4, + 0x81b26009ef0b8c41, + 0xded1ebf691a58e15, + 0x4e6da64d9ee6481f, + 0x54b06f8ecf13fd8a, + 0x49d85e1d01c9e1f5, + 0xafc826511c094ee3, + 0xf698a33075ee67ad, + 0x5ac7822eec4db243, + 0x8dd47c28c199da75, + 0x89f68337db1ce892, + 0xcdce37c57c21dda3, + 0x530597de503c5460, + 0x6a42f2aa543ff793, + 0x5d727a7e73621ba9, + 0xe232875307459df1, + 0x56a19e0fc2dfe477, + 0xc61dd3b4cd9c227d, + 0xe5877f03986a341b, + 0x949eb2a415c6f4ed, + 0x6206119460289340, + 0x6380e75ae84e11b0, + 0x8be772b6d6d0f16f, + 0x50929091d596cf6d, + 0xe86795ec3e9ee0df, + 0x7cf927482b581432, + 0xc86a3e14eec26db4, + 0x7119cda78dacc0f6, + 0xe40189cd100cb6eb, + 0x92adbc3a028fdff7, + 0xb2a017c2d2d3529c, + 0x200dabf8d05c8d6b, + 0x34a78f9ba2f77737, + 0xe3b4719d8f231f01, + 0x45be423c2f5bb7c1, + 0xf71e55fefd88e55d, + 0x6853032b59f3ee6e, + 0x65b3e9c4ff073aaa, + 0x772ac3399ae5ebec, + 0x87816e97f842a75b, + 0x110e2db2e0484a4b, + 0x331277cb3dd8dedd, + 0xbd510cac79eb9fa5, + 0x352179552a91f5c7, + }, + { + 0x05ba7bc82c9b3220, + 0x31a54665f8b65e4f, + 0xb1b651f77547f4d4, + 0x8bfa0d857ba46682, + 0x85a96c5aa16a98bb, + 0x990faef908eb79c9, + 0xa15e37a247f4a62d, + 0x76857dcd5d27741e, + 0xf8c50b800a1820bc, + 0xbe65dcb201f7a2b4, + 0x666d1b986f9426e7, + 0x4cc921bf53c4e648, + 0x95410a0f93d9ca42, + 0x20cdccaa647ba4ef, + 0x429a4060890a1871, + 0x0c4ea4f69b32b38b, + 0xccda362dde354cd3, + 0x96dc23bc7c5b2fa9, + 0xc309bb68aa851ab3, + 0xd26131a73648e013, + 0x021dc52941fc4db2, + 0xcd5adab7704be48a, + 0xa77965d984ed71e6, + 0x32386fd61734bba4, + 0xe82d6dd538ab7245, + 0x5c2147ea6177b4b1, + 0x5da1ab70cf091ce8, + 0xac907fce72b8bdff, + 0x57c85dfd972278a8, + 0xa4e44c6a6b6f940d, + 0x3851995b4f1fdfe4, + 0x62578ccaed71bc9e, + 0xd9882bb0c01d2c0a, + 0x917b9d5d113c503b, + 0xa2c31e11a87643c6, + 0xe463c923a399c1ce, + 0xf71686c57ea876dc, + 0x87b4a973e096d509, + 0xaf0d567d9d3a5814, + 0xb40c2a3f59dcc6f4, + 0x3602f88495d121dd, + 0xd3e1dd3d9836484a, + 0xf945e71aa46688e5, + 0x7518547eb2a591f5, + 0x9366587450c01d89, + 0x9ea81018658c065b, + 0x4f54080cbc4603a3, + 0x2d0384c65137bf3d, + 0xdc325078ec861e2a, + 0xea30a8fc79573ff7, + 0x214d2030ca050cb6, + 0x65f0322b8016c30c, + 0x69be96dd1b247087, + 0xdb95ee9981e161b8, + 0xd1fc1814d9ca05f8, + 0x820ed2bbcc0de729, + 0x63d76050430f14c7, + 0x3bccb0e8a09d3a0f, + 0x8e40764d573f54a2, + 0x39d175c1e16177bd, + 0x12f5a37c734f1f4b, + 0xab37c12f1fdfc26d, + 0x5648b167395cd0f1, + 0x6c04ed1537bf42a7, + 0xed97161d14304065, + 0x7d6c67daab72b807, + 0xec17fa87ba4ee83c, + 0xdfaf79cb0304fbc1, + 0x733f060571bc463e, + 0x78d61c1287e98a27, + 0xd07cf48e77b4ada1, + 0xb9c262536c90dd26, + 0xe2449b5860801605, + 0x8fc09ad7f941fcfb, + 0xfad8cea94be46d0e, + 0xa343f28b0608eb9f, + 0x9b126bd04917347b, + 0x9a92874ae7699c22, + 0x1b017c42c4e69ee0, + 0x3a4c5c720ee39256, + 0x4b6e9f5e3ea399da, + 0x6ba353f45ad83d35, + 0xe7fee0904c1b2425, + 0x22d009832587e95d, + 0x842980c00f1430e2, + 0xc6b3c0a0861e2893, + 0x087433a419d729f2, + 0x341f3dadd42d6c6f, + 0xee0a3faefbb2a58e, + 0x4aee73c490dd3183, + 0xaab72db5b1a16a34, + 0xa92a04065e238fdf, + 0x7b4b35a1686b6fcc, + 0x6a23bf6ef4a6956c, + 0x191cb96b851ad352, + 0x55d598d4d6de351a, + 0xc9604de5f2ae7ef3, + 0x1ca6c2a3a981e172, + 0xde2f9551ad7a5398, + 0x3025aaff56c8f616, + 0x15521d9d1e2860d9, + 0x506fe31cfa45073a, + 0x189c55f12b647b0b, + 0x0180ec9aae7ea859, + 0x7cec8b40050c105e, + 0x2350e5198bf94104, + 0xef8ad33455cc0dd7, + 0x07a7bee16d677f92, + 0xe5e325b90de76997, + 0x5a061591a26e637a, + 0xb611ef1618208b46, + 0x09f4df3eb7a981ab, + 0x1ebb078ae87dacc0, + 0xb791038cb65e231f, + 0x0fd38d4574b05660, + 0x67edf702c1ea8ebe, + 0xba5f4be0831238cd, + 0xe3c477c2cefebe5c, + 0x0dce486c354c1bd2, + 0x8c5db36416c31910, + 0x26ea9ed1a7627324, + 0x039d29b3ef82e5eb, + 0x9f28fc82cbf2ae02, + 0xa8aae89cf05d2786, + 0x431aacfa2774b028, + 0xcf471f9e31b7a938, + 0x581bd0b8e3922ec8, + 0xbc78199b400bef06, + 0x90fb71c7bf42f862, + 0x1f3beb1046030499, + 0x683e7a47b55ad8de, + 0x988f4263a695d190, + 0xd808c72a6e638453, + 0x0627527bc319d7cb, + 0xebb04466d72997ae, + 0xe67e0c0ae2658c7c, + 0x14d2f107b056c880, + 0x7122c32c30400b8c, + 0x8a7ae11fd5dacedb, + 0xa0dedb38e98a0e74, + 0xad109354dcc615a6, + 0x0be91a17f655cc19, + 0x8ddd5ffeb8bdb149, + 0xbfe53028af890aed, + 0xd65ba6f5b4ad7a6a, + 0x7956f0882997227e, + 0x10e8665532b352f9, + 0x0e5361dfdacefe39, + 0xcec7f3049fc90161, + 0xff62b561677f5f2e, + 0x975ccf26d22587f0, + 0x51ef0f86543baf63, + 0x2f1e41ef10cbf28f, + 0x52722635bbb94a88, + 0xae8dbae73344f04d, + 0x410769d36688fd9a, + 0xb3ab94de34bbb966, + 0x801317928df1aa9b, + 0xa564a0f0c5113c54, + 0xf131d4bebdb1a117, + 0x7f71a2f3ea8ef5b5, + 0x40878549c8f655c3, + 0x7ef14e6944f05dec, + 0xd44663dcf55137d8, + 0xf2acfd0d523344fc, + 0x0000000000000000, + 0x5fbc6e598ef5515a, + 0x16cf342ef1aa8532, + 0xb036bd6ddb395c8d, + 0x13754fe6dd31b712, + 0xbbdfa77a2d6c9094, + 0x89e7c8ac3a582b30, + 0x3c6b0e09cdfa459d, + 0xc4ae0589c7e26521, + 0x49735a777f5fd468, + 0xcafd64561d2c9b18, + 0xda1502032f9fc9e1, + 0x8867243694268369, + 0x3782141e3baf8984, + 0x9cb5d53124704be9, + 0xd7db4a6f1ad3d233, + 0xa6f989432a93d9bf, + 0x9d3539ab8a0ee3b0, + 0x53f2caaf15c7e2d1, + 0x6e19283c76430f15, + 0x3debe2936384edc4, + 0x5e3c82c3208bf903, + 0x33b8834cb94a13fd, + 0x6470deb12e686b55, + 0x359fd1377a53c436, + 0x61caa57902f35975, + 0x043a975282e59a79, + 0xfd7f70482683129c, + 0xc52ee913699ccd78, + 0x28b9ff0e7dac8d1d, + 0x5455744e78a09d43, + 0xcb7d88ccb3523341, + 0x44bd121b4a13cfba, + 0x4d49cd25fdba4e11, + 0x3e76cb208c06082f, + 0x3ff627ba2278a076, + 0xc28957f204fbb2ea, + 0x453dfe81e46d67e3, + 0x94c1e6953da7621b, + 0x2c83685cff491764, + 0xf32c1197fc4deca5, + 0x2b24d6bd922e68f6, + 0xb22b78449ac5113f, + 0x48f3b6edd1217c31, + 0x2e9ead75beb55ad6, + 0x174fd8b45fd42d6b, + 0x4ed4e4961238abfa, + 0x92e6b4eefebeb5d0, + 0x46a0d7320bef8208, + 0x47203ba8a5912a51, + 0x24f75bf8e69e3e96, + 0xf0b1382413cf094e, + 0xfee259fbc901f777, + 0x276a724b091cdb7d, + 0xbdf8f501ee75475f, + 0x599b3c224dec8691, + 0x6d84018f99c1eafe, + 0x7498b8e41cdb39ac, + 0xe0595e71217c5bb7, + 0x2aa43a273c50c0af, + 0xf50b43ec3f543b6e, + 0x838e3e2162734f70, + 0xc09492db4507ff58, + 0x72bfea9fdfc2ee67, + 0x11688acf9ccdfaa0, + 0x1a8190d86a9836b9, + 0x7acbd93bc615c795, + 0xc7332c3a286080ca, + 0x863445e94ee87d50, + 0xf6966a5fd0d6de85, + 0xe9ad814f96d5da1c, + 0x70a22fb69e3ea3d5, + 0x0a69f68d582b6440, + 0xb8428ec9c2ee757f, + 0x604a49e3ac8df12c, + 0x5b86f90b0c10cb23, + 0xe1d9b2eb8f02f3ee, + 0x29391394d3d22544, + 0xc8e0a17f5cd0d6aa, + 0xb58cc6a5f7a26ead, + 0x8193fb08238f02c2, + 0xd5c68f465b2f9f81, + 0xfcff9cd288fdbac5, + 0x77059157f359dc47, + 0x1d262e3907ff492b, + 0xfb582233e59ac557, + 0xddb2bce242f8b673, + 0x2577b76248e096cf, + 0x6f99c4a6d83da74c, + 0xc1147e41eb795701, + 0xf48baf76912a9337, + }, + { + 0x45b268a93acde4cc, + 0xaf7f0be884549d08, + 0x048354b3c1468263, + 0x925435c2c80efed2, + 0xee4e37f27fdffba7, + 0x167a33920c60f14d, + 0xfb123b52ea03e584, + 0x4a0cab53fdbb9007, + 0x9deaf6380f788a19, + 0xcb48ec558f0cb32a, + 0xb59dc4b2d6fef7e0, + 0xdcdbca22f4f3ecb6, + 0x11df5813549a9c40, + 0xe33fdedf568aced3, + 0xa0c1c8124322e9c3, + 0x07a56b8158fa6d0d, + 0x77279579b1e1f3dd, + 0xd9b18b74422ac004, + 0xb8ec2d9fffabc294, + 0xf4acf8a82d75914f, + 0x7bbf69b1ef2b6878, + 0xc4f62faf487ac7e1, + 0x76ce809cc67e5d0c, + 0x6711d88f92e4c14c, + 0x627b99d9243dedfe, + 0x234aa5c3dfb68b51, + 0x909b1f15262dbf6d, + 0x4f66ea054b62bcb5, + 0x1ae2cf5a52aa6ae8, + 0xbea053fbd0ce0148, + 0xed6808c0e66314c9, + 0x43fe16cd15a82710, + 0xcd049231a06970f6, + 0xe7bc8a6c97cc4cb0, + 0x337ce835fcb3b9c0, + 0x65def2587cc780f3, + 0x52214ede4132bb50, + 0x95f15e4390f493df, + 0x870839625dd2e0f1, + 0x41313c1afb8b66af, + 0x91720af051b211bc, + 0x477d427ed4eea573, + 0x2e3b4ceef6e3be25, + 0x82627834eb0bcc43, + 0x9c03e3dd78e724c8, + 0x2877328ad9867df9, + 0x14b51945e243b0f2, + 0x574b0f88f7eb97e2, + 0x88b6fa989aa4943a, + 0x19c4f068cb168586, + 0x50ee6409af11faef, + 0x7df317d5c04eaba4, + 0x7a567c5498b4c6a9, + 0xb6bbfb804f42188e, + 0x3cc22bcf3bc5cd0b, + 0xd04336eaaa397713, + 0xf02fac1bec33132c, + 0x2506dba7f0d3488d, + 0xd7e65d6bf2c31a1e, + 0x5eb9b2161ff820f5, + 0x842e0650c46e0f9f, + 0x716beb1d9e843001, + 0xa933758cab315ed4, + 0x3fe414fda2792265, + 0x27c9f1701ef00932, + 0x73a4c1ca70a771be, + 0x94184ba6e76b3d0e, + 0x40d829ff8c14c87e, + 0x0fbec3fac77674cb, + 0x3616a9634a6a9572, + 0x8f139119c25ef937, + 0xf545ed4d5aea3f9e, + 0xe802499650ba387b, + 0x6437e7bd0b582e22, + 0xe6559f89e053e261, + 0x80ad52e305288dfc, + 0x6dc55a23e34b9935, + 0xde14e0f51ad0ad09, + 0xc6390578a659865e, + 0x96d7617109487cb1, + 0xe2d6cb3a21156002, + 0x01e915e5779faed1, + 0xadb0213f6a77dcb7, + 0x9880b76eb9a1a6ab, + 0x5d9f8d248644cf9b, + 0xfd5e4536c5662658, + 0xf1c6b9fe9bacbdfd, + 0xeacd6341be9979c4, + 0xefa7221708405576, + 0x510771ecd88e543e, + 0xc2ba51cb671f043d, + 0x0ad482ac71af5879, + 0xfe787a045cdac936, + 0xb238af338e049aed, + 0xbd866cc94972ee26, + 0x615da6ebbd810290, + 0x3295fdd08b2c1711, + 0xf834046073bf0aea, + 0xf3099329758ffc42, + 0x1caeb13e7dcfa934, + 0xba2307481188832b, + 0x24efce42874ce65c, + 0x0e57d61fb0e9da1a, + 0xb3d1bad6f99b343c, + 0xc0757b1c893c4582, + 0x2b510db8403a9297, + 0x5c7698c1f1db614a, + 0x3e0d0118d5e68cb4, + 0xd60f488e855cb4cf, + 0xae961e0df3cb33d9, + 0x3a8e55ab14a00ed7, + 0x42170328623789c1, + 0x838b6dd19c946292, + 0x895fef7ded3b3aeb, + 0xcfcbb8e64e4a3149, + 0x064c7e642f65c3dc, + 0x3d2b3e2a4c5a63da, + 0x5bd3f340a9210c47, + 0xb474d157a1615931, + 0xac5934da1de87266, + 0x6ee365117af7765b, + 0xc86ed36716b05c44, + 0x9ba6885c201d49c5, + 0xb905387a88346c45, + 0x131072c4bab9ddff, + 0xbf49461ea751af99, + 0xd52977bc1ce05ba1, + 0xb0f785e46027db52, + 0x546d30ba6e57788c, + 0x305ad707650f56ae, + 0xc987c682612ff295, + 0xa5ab8944f5fbc571, + 0x7ed528e759f244ca, + 0x8ddcbbce2c7db888, + 0xaa154abe328db1ba, + 0x1e619be993ece88b, + 0x09f2bd9ee813b717, + 0x7401aa4b285d1cb3, + 0x21858f143195caee, + 0x48c381841398d1b8, + 0xfcb750d3b2f98889, + 0x39a86a998d1ce1b9, + 0x1f888e0ce473465a, + 0x7899568376978716, + 0x02cf2ad7ee2341bf, + 0x85c713b5b3f1a14e, + 0xff916fe12b4567e7, + 0x7c1a0230b7d10575, + 0x0c98fcc85eca9ba5, + 0xa3e7f720da9e06ad, + 0x6a6031a2bbb1f438, + 0x973e74947ed7d260, + 0x2cf4663918c0ff9a, + 0x5f50a7f368678e24, + 0x34d983b4a449d4cd, + 0x68af1b755592b587, + 0x7f3c3d022e6dea1b, + 0xabfc5f5b45121f6b, + 0x0d71e92d29553574, + 0xdffdf5106d4f03d8, + 0x081ba87b9f8c19c6, + 0xdb7ea1a3ac0981bb, + 0xbbca12ad66172dfa, + 0x79704366010829c7, + 0x179326777bff5f9c, + 0x0000000000000000, + 0xeb2476a4c906d715, + 0x724dd42f0738df6f, + 0xb752ee6538ddb65f, + 0x37ffbc863df53ba3, + 0x8efa84fcb5c157e6, + 0xe9eb5c73272596aa, + 0x1b0bdabf2535c439, + 0x86e12c872a4d4e20, + 0x9969a28bce3e087a, + 0xfafb2eb79d9c4b55, + 0x056a4156b6d92cb2, + 0x5a3ae6a5debea296, + 0x22a3b026a8292580, + 0x53c85b3b36ad1581, + 0xb11e900117b87583, + 0xc51f3a4a3fe56930, + 0xe019e1edcf3621bd, + 0xec811d2591fcba18, + 0x445b7d4c4d524a1d, + 0xa8da6069dcaef005, + 0x58f5cc72309de329, + 0xd4c062596b7ff570, + 0xce22ad0339d59f98, + 0x591cd99747024df8, + 0x8b90c5aa03187b54, + 0xf663d27fc356d0f0, + 0xd8589e9135b56ed5, + 0x35309651d3d67a1c, + 0x12f96721cd26732e, + 0xd28c1c3d441a36ac, + 0x492a946164077f69, + 0x2d1d73dc6f5f514b, + 0x6f0a70f40d68d88a, + 0x60b4b30eca1eac41, + 0xd36509d83385987d, + 0x0b3d97490630f6a8, + 0x9eccc90a96c46577, + 0xa20ee2c5ad01a87c, + 0xe49ab55e0e70a3de, + 0xa4429ca182646ba0, + 0xda97b446db962f6a, + 0xcced87d4d7f6de27, + 0x2ab8185d37a53c46, + 0x9f25dcefe15bcba6, + 0xc19c6ef9fea3eb53, + 0xa764a3931bd884ce, + 0x2fd2590b817c10f4, + 0x56a21a6d80743933, + 0xe573a0bb79ef0d0f, + 0x155c0ca095dc1e23, + 0x6c2c4fc694d437e4, + 0x10364df623053291, + 0xdd32dfc7836c4267, + 0x03263f3299bcef6e, + 0x66f8cd6ae57b6f9d, + 0x8c35ae2b5be21659, + 0x31b3c2e21290f87f, + 0x93bd2027bf915003, + 0x69460e90220d1b56, + 0x299e276fae19d328, + 0x63928c3c53a2432f, + 0x7082fef8e91b9ed0, + 0xbc6f792c3eed40f7, + 0x4c40d537d2de53db, + 0x75e8bfae5fc2b262, + 0x4da9c0d2a541fd0a, + 0x4e8fffe03cfd1264, + 0x2620e495696fa7e3, + 0xe1f0f408b8a98f6c, + 0xd1aa230fdda6d9c2, + 0xc7d0109dd1c6288f, + 0x8a79d04f7487d585, + 0x4694579ba3710ba2, + 0x38417f7cfa834f68, + 0x1d47a4db0a5007e5, + 0x206c9af1460a643f, + 0xa128ddf734bd4712, + 0x8144470672b7232d, + 0xf2e086cc02105293, + 0x182de58dbc892b57, + 0xcaa1f9b0f8931dfb, + 0x6b892447cc2e5ae9, + 0xf9dd11850420a43b, + 0x4be5beb68a243ed6, + 0x5584255f19c8d65d, + 0x3b67404e633fa006, + 0xa68db6766c472a1f, + 0xf78ac79ab4c97e21, + 0xc353442e1080aaec, + 0x9a4f9db95782e714, + }, + { + 0xc811a8058c3f55de, + 0x65f5b43196b50619, + 0xf74f96b1d6706e43, + 0x859d1e8bcb43d336, + 0x5aab8a85ccfa3d84, + 0xf9c7bf99c295fcfd, + 0xa21fd5a1de4b630f, + 0xcdb3ef763b8b456d, + 0x803f59f87cf7c385, + 0xb27c73be5f31913c, + 0x98e3ac6633b04821, + 0xbf61674c26b8f818, + 0x0ffbc995c4c130c8, + 0xaaa0862010761a98, + 0x6057f342210116aa, + 0xf63c760c0654cc35, + 0x2ddb45cc667d9042, + 0xbcf45a964bd40382, + 0x68e8a0c3ef3c6f3d, + 0xa7bd92d269ff73bc, + 0x290ae20201ed2287, + 0xb7de34cde885818f, + 0xd901eea7dd61059b, + 0xd6fa273219a03553, + 0xd56f1ae874cccec9, + 0xea31245c2e83f554, + 0x7034555da07be499, + 0xce26d2ac56e7bef7, + 0xfd161857a5054e38, + 0x6a0e7da4527436d1, + 0x5bd86a381cde9ff2, + 0xcaf7756231770c32, + 0xb09aaed9e279c8d0, + 0x5def1091c60674db, + 0x111046a2515e5045, + 0x23536ce4729802fc, + 0xc50cbcf7f5b63cfa, + 0x73a16887cd171f03, + 0x7d2941afd9f28dbd, + 0x3f5e3eb45a4f3b9d, + 0x84eefe361b677140, + 0x3db8e3d3e7076271, + 0x1a3a28f9f20fd248, + 0x7ebc7c75b49e7627, + 0x74e5f293c7eb565c, + 0x18dcf59e4f478ba4, + 0x0c6ef44fa9adcb52, + 0xc699812d98dac760, + 0x788b06dc6e469d0e, + 0xfc65f8ea7521ec4e, + 0x30a5f7219e8e0b55, + 0x2bec3f65bca57b6b, + 0xddd04969baf1b75e, + 0x99904cdbe394ea57, + 0x14b201d1e6ea40f6, + 0xbbb0c08241284add, + 0x50f20463bf8f1dff, + 0xe8d7f93b93cbacb8, + 0x4d8cb68e477c86e8, + 0xc1dd1b3992268e3f, + 0x7c5aa11209d62fcb, + 0x2f3d98abdb35c9ae, + 0x671369562bfd5ff5, + 0x15c1e16c36cee280, + 0x1d7eb2edf8f39b17, + 0xda94d37db00dfe01, + 0x877bc3ec760b8ada, + 0xcb8495dfe153ae44, + 0x05a24773b7b410b3, + 0x12857b783c32abdf, + 0x8eb770d06812513b, + 0x536739b9d2e3e665, + 0x584d57e271b26468, + 0xd789c78fc9849725, + 0xa935bbfa7d1ae102, + 0x8b1537a3dfa64188, + 0xd0cd5d9bc378de7a, + 0x4ac82c9a4d80cfb7, + 0x42777f1b83bdb620, + 0x72d2883a1d33bd75, + 0x5e7a2d4bab6a8f41, + 0xf4daab6bbb1c95d9, + 0x905cffe7fd8d31b6, + 0x83aa6422119b381f, + 0xc0aefb8442022c49, + 0xa0f908c663033ae3, + 0xa428af0804938826, + 0xade41c341a8a53c7, + 0xae7121ee77e6a85d, + 0xc47f5c4a25929e8c, + 0xb538e9aa55cdd863, + 0x06377aa9dad8eb29, + 0xa18ae87bb3279895, + 0x6edfda6a35e48414, + 0x6b7d9d19825094a7, + 0xd41cfa55a4e86cbf, + 0xe5caedc9ea42c59c, + 0xa36c351c0e6fc179, + 0x5181e4de6fabbf89, + 0xfff0c530184d17d4, + 0x9d41eb1584045892, + 0x1c0d525028d73961, + 0xf178ec180ca8856a, + 0x9a0571018ef811cd, + 0x4091a27c3ef5efcc, + 0x19af15239f6329d2, + 0x347450eff91eb990, + 0xe11b4a078dd27759, + 0xb9561de5fc601331, + 0x912f1f5a2da993c0, + 0x1654dcb65ba2191a, + 0x3e2dde098a6b99eb, + 0x8a66d71e0f82e3fe, + 0x8c51adb7d55a08d7, + 0x4533e50f8941ff7f, + 0x02e6dd67bd4859ec, + 0xe068aaba5df6d52f, + 0xc24826e3ff4a75a5, + 0x6c39070d88acddf8, + 0x6486548c4691a46f, + 0xd1bebd26135c7c0c, + 0xb30f93038f15334a, + 0x82d9849fc1bf9a69, + 0x9c320ba85420fae4, + 0xfa528243aff90767, + 0x9ed4d6cfe968a308, + 0xb825fd582c44b147, + 0x9b7691bc5edcb3bb, + 0xc7ea619048fe6516, + 0x1063a61f817af233, + 0x47d538683409a693, + 0x63c2ce984c6ded30, + 0x2a9fdfd86c81d91d, + 0x7b1e3b06032a6694, + 0x666089ebfbd9fd83, + 0x0a598ee67375207b, + 0x07449a140afc495f, + 0x2ca8a571b6593234, + 0x1f986f8a45bbc2fb, + 0x381aa4a050b372c2, + 0x5423a3add81faf3a, + 0x17273c0b8b86bb6c, + 0xfe83258dc869b5a2, + 0x287902bfd1c980f1, + 0xf5a94bd66b3837af, + 0x88800a79b2caba12, + 0x55504310083b0d4c, + 0xdf36940e07b9eeb2, + 0x04d1a7ce6790b2c5, + 0x612413fff125b4dc, + 0x26f12b97c52c124f, + 0x86082351a62f28ac, + 0xef93632f9937e5e7, + 0x3507b052293a1be6, + 0xe72c30ae570a9c70, + 0xd3586041ae1425e0, + 0xde4574b3d79d4cc4, + 0x92ba228040c5685a, + 0xf00b0ca5dc8c271c, + 0xbe1287f1f69c5a6e, + 0xf39e317fb1e0dc86, + 0x495d114020ec342d, + 0x699b407e3f18cd4b, + 0xdca3a9d46ad51528, + 0x0d1d14f279896924, + 0x0000000000000000, + 0x593eb75fa196c61e, + 0x2e4e78160b116bd8, + 0x6d4ae7b058887f8e, + 0xe65fd013872e3e06, + 0x7a6ddbbbd30ec4e2, + 0xac97fc89caaef1b1, + 0x09ccb33c1e19dbe1, + 0x89f3eac462ee1864, + 0x7770cf49aa87adc6, + 0x56c57eca6557f6d6, + 0x03953dda6d6cfb9a, + 0x36928d884456e07c, + 0x1eeb8f37959f608d, + 0x31d6179c4eaaa923, + 0x6fac3ad7e5c02662, + 0x43049fa653991456, + 0xabd3669dc052b8ee, + 0xaf02c153a7c20a2b, + 0x3ccb036e3723c007, + 0x93c9c23d90e1ca2c, + 0xc33bc65e2f6ed7d3, + 0x4cff56339758249e, + 0xb1e94e64325d6aa6, + 0x37e16d359472420a, + 0x79f8e661be623f78, + 0x5214d90402c74413, + 0x482ef1fdf0c8965b, + 0x13f69bc5ec1609a9, + 0x0e88292814e592be, + 0x4e198b542a107d72, + 0xccc00fcbebafe71b, + 0x1b49c844222b703e, + 0x2564164da840e9d5, + 0x20c6513e1ff4f966, + 0xbac3203f910ce8ab, + 0xf2edd1c261c47ef0, + 0x814cb945acd361f3, + 0x95feb8944a392105, + 0x5c9cf02c1622d6ad, + 0x971865f3f77178e9, + 0xbd87ba2b9bf0a1f4, + 0x444005b259655d09, + 0xed75be48247fbc0b, + 0x7596122e17cff42a, + 0xb44b091785e97a15, + 0x966b854e2755da9f, + 0xeee0839249134791, + 0x32432a4623c652b9, + 0xa8465b47ad3e4374, + 0xf8b45f2412b15e8b, + 0x2417f6f078644ba3, + 0xfb2162fe7fdda511, + 0x4bbbcc279da46dc1, + 0x0173e0bdd024a276, + 0x22208c59a2bca08a, + 0x8fc4906db836f34d, + 0xe4b90d743a6667ea, + 0x7147b5e0705f46ef, + 0x2782cb2a1508b039, + 0xec065ef5f45b1e7d, + 0x21b5b183cfd05b10, + 0xdbe733c060295c77, + 0x9fa73672394c017e, + 0xcf55321186c31c81, + 0xd8720e1a0d45a7ed, + 0x3b8f997a3ddf8958, + 0x3afc79c7edfb2b2e, + 0xe9a4198643ef0ece, + 0x5f09cdf67b4e2d37, + 0x4f6a6be9fa34df04, + 0xb6add47038a123f9, + 0x8d224d0a057eaaa1, + 0xc96248b85c1bf7a8, + 0xe3fd9760309a2eb5, + 0x0b2a6e5ba351820d, + 0xeb42c4e1fea75722, + 0x948d58299a1d8373, + 0x7fcf9cc864bad451, + 0xa55b4fb5d4b72a50, + 0x08bf5381ce3d7997, + 0x46a6d8d5e42d04e5, + 0xd22b80fc7e308796, + 0x57b69e77b57354a0, + 0x3969441d8097d0b4, + 0x3330cafbf3e2f0cf, + 0xe28e77dde0be8cc3, + 0x62b12e259c494f46, + 0xa6ce726fb9dbd1ca, + 0x41e242c1eed14dba, + 0x76032ff47aa30fb0, + }, + { + 0xe6f87e5c5b711fd0, + 0x258377800924fa16, + 0xc849e07e852ea4a8, + 0x5b4686a18f06c16a, + 0x0b32e9a2d77b416e, + 0xabda37a467815c66, + 0xf61796a81a686676, + 0xf5dc0b706391954b, + 0x4862f38db7e64bf1, + 0xff5c629a68bd85c5, + 0xcb827da6fcd75795, + 0x66d36daf69b9f089, + 0x356c9f74483d83b0, + 0x7cbcecb1238c99a1, + 0x36a702ac31c4708d, + 0x9eb6a8d02fbcdfd6, + 0x8b19fa51e5b3ae37, + 0x9ccfb5408a127d0b, + 0xbc0c78b508208f5a, + 0xe533e3842288eced, + 0xcec2c7d377c15fd2, + 0xec7817b6505d0f5e, + 0xb94cc2c08336871d, + 0x8c205db4cb0b04ad, + 0x763c855b28a0892f, + 0x588d1b79f6ff3257, + 0x3fecf69e4311933e, + 0x0fc0d39f803a18c9, + 0xee010a26f5f3ad83, + 0x10efe8f4411979a6, + 0x5dcda10c7de93a10, + 0x4a1bee1d1248e92c, + 0x53bff2db21847339, + 0xb4f50ccfa6a23d09, + 0x5fb4bc9cd84798cd, + 0xe88a2d8b071c56f9, + 0x7f7771695a756a9c, + 0xc5f02e71a0ba1ebc, + 0xa663f9ab4215e672, + 0x2eb19e22de5fbb78, + 0x0db9ce0f2594ba14, + 0x82520e6397664d84, + 0x2f031e6a0208ea98, + 0x5c7f2144a1be6bf0, + 0x7a37cb1cd16362db, + 0x83e08e2b4b311c64, + 0xcf70479bab960e32, + 0x856ba986b9dee71e, + 0xb5478c877af56ce9, + 0xb8fe42885f61d6fd, + 0x1bdd0156966238c8, + 0x622157923ef8a92e, + 0xfc97ff42114476f8, + 0x9d7d350856452ceb, + 0x4c90c9b0e0a71256, + 0x2308502dfbcb016c, + 0x2d7a03faa7a64845, + 0xf46e8b38bfc6c4ab, + 0xbdbef8fdd477deba, + 0x3aac4cebc8079b79, + 0xf09cb105e8879d0c, + 0x27fa6a10ac8a58cb, + 0x8960e7c1401d0cea, + 0x1a6f811e4a356928, + 0x90c4fb0773d196ff, + 0x43501a2f609d0a9f, + 0xf7a516e0c63f3796, + 0x1ce4a6b3b8da9252, + 0x1324752c38e08a9b, + 0xa5a864733bec154f, + 0x2bf124575549b33f, + 0xd766db15440dc5c7, + 0xa7d179e39e42b792, + 0xdadf151a61997fd3, + 0x86a0345ec0271423, + 0x38d5517b6da939a4, + 0x6518f077104003b4, + 0x02791d90a5aea2dd, + 0x88d267899c4a5d0a, + 0x930f66df0a2865c2, + 0x4ee9d4204509b08b, + 0x325538916685292a, + 0x412907bfc533a842, + 0xb27e2b62544dc673, + 0x6c5304456295e007, + 0x5af406e95351908a, + 0x1f2f3b6bc123616f, + 0xc37b09dc5255e5c6, + 0x3967d133b1fe6844, + 0x298839c7f0e711e2, + 0x409b87f71964f9a2, + 0xe938adc3db4b0719, + 0x0c0b4e47f9c3ebf4, + 0x5534d576d36b8843, + 0x4610a05aeb8b02d8, + 0x20c3cdf58232f251, + 0x6de1840dbec2b1e7, + 0xa0e8de06b0fa1d08, + 0x7b854b540d34333b, + 0x42e29a67bcca5b7f, + 0xd8a6088ac437dd0e, + 0xc63bb3a9d943ed81, + 0x21714dbd5e65a3b1, + 0x6761ede7b5eea169, + 0x2431f7c8d573abf6, + 0xd51fc685e1a3671a, + 0x5e063cd40410c92d, + 0x283ab98f2cb04002, + 0x8febc06cb2f2f790, + 0x17d64f116fa1d33c, + 0xe07359f1a99ee4aa, + 0x784ed68c74cdc006, + 0x6e2a19d5c73b42da, + 0x8712b4161c7045c3, + 0x371582e4ed93216d, + 0xace390414939f6fc, + 0x7ec5f12186223b7c, + 0xc0b094042bac16fb, + 0xf9d745379a527ebf, + 0x737c3f2ea3b68168, + 0x33e7b8d9bad278ca, + 0xa9a32a34c22ffebb, + 0xe48163ccfedfbd0d, + 0x8e5940246ea5a670, + 0x51c6ef4b842ad1e4, + 0x22bad065279c508c, + 0xd91488c218608cee, + 0x319ea5491f7cda17, + 0xd394e128134c9c60, + 0x094bf43272d5e3b3, + 0x9bf612a5a4aad791, + 0xccbbda43d26ffd0f, + 0x34de1f3c946ad250, + 0x4f5b5468995ee16b, + 0xdf9faf6fea8f7794, + 0x2648ea5870dd092b, + 0xbfc7e56d71d97c67, + 0xdde6b2ff4f21d549, + 0x3c276b463ae86003, + 0x91767b4faf86c71f, + 0x68a13e7835d4b9a0, + 0xb68c115f030c9fd4, + 0x141dd2c916582001, + 0x983d8f7ddd5324ac, + 0x64aa703fcc175254, + 0xc2c989948e02b426, + 0x3e5e76d69f46c2de, + 0x50746f03587d8004, + 0x45db3d829272f1e5, + 0x60584a029b560bf3, + 0xfbae58a73ffcdc62, + 0xa15a5e4e6cad4ce8, + 0x4ba96e55ce1fb8cc, + 0x08f9747aae82b253, + 0xc102144cf7fb471b, + 0x9f042898f3eb8e36, + 0x068b27adf2effb7a, + 0xedca97fe8c0a5ebe, + 0x778e0513f4f7d8cf, + 0x302c2501c32b8bf7, + 0x8d92ddfc175c554d, + 0xf865c57f46052f5f, + 0xeaf3301ba2b2f424, + 0xaa68b7ecbbd60d86, + 0x998f0f350104754c, + 0x0000000000000000, + 0xf12e314d34d0ccec, + 0x710522be061823b5, + 0xaf280d9930c005c1, + 0x97fd5ce25d693c65, + 0x19a41cc633cc9a15, + 0x95844172f8c79eb8, + 0xdc5432b7937684a9, + 0x9436c13a2490cf58, + 0x802b13f332c8ef59, + 0xc442ae397ced4f5c, + 0xfa1cd8efe3ab8d82, + 0xf2e5ac954d293fd1, + 0x6ad823e8907a1b7d, + 0x4d2249f83cf043b6, + 0x03cb9dd879f9f33d, + 0xde2d2f2736d82674, + 0x2a43a41f891ee2df, + 0x6f98999d1b6c133a, + 0xd4ad46cd3df436fa, + 0xbb35df50269825c0, + 0x964fdcaa813e6d85, + 0xeb41b0537ee5a5c4, + 0x0540ba758b160847, + 0xa41ae43be7bb44af, + 0xe3b8c429d0671797, + 0x819993bbee9fbeb9, + 0xae9a8dd1ec975421, + 0xf3572cdd917e6e31, + 0x6393d7dae2aff8ce, + 0x47a2201237dc5338, + 0xa32343dec903ee35, + 0x79fc56c4a89a91e6, + 0x01b28048dc5751e0, + 0x1296f564e4b7db7b, + 0x75f7188351597a12, + 0xdb6d9552bdce2e33, + 0x1e9dbb231d74308f, + 0x520d7293fdd322d9, + 0xe20a44610c304677, + 0xfeeee2d2b4ead425, + 0xca30fdee20800675, + 0x61eaca4a47015a13, + 0xe74afe1487264e30, + 0x2cc883b27bf119a5, + 0x1664cf59b3f682dc, + 0xa811aa7c1e78af5b, + 0x1d5626fb648dc3b2, + 0xb73e9117df5bce34, + 0xd05f7cf06ab56f5d, + 0xfd257f0acd132718, + 0x574dc8e676c52a9e, + 0x0739a7e52eb8aa9a, + 0x5486553e0f3cd9a3, + 0x56ff48aeaa927b7e, + 0xbe756525ad8e2d87, + 0x7d0e6cf9ffdbc841, + 0x3b1ecca31450ca99, + 0x6913be30e983e840, + 0xad511009956ea71c, + 0xb1b5b6ba2db4354e, + 0x4469bdca4e25a005, + 0x15af5281ca0f71e1, + 0x744598cb8d0e2bf2, + 0x593f9b312aa863b7, + 0xefb38a6e29a4fc63, + 0x6b6aa3a04c2d4a9d, + 0x3d95eb0ee6bf31e3, + 0xa291c3961554bfd5, + 0x18169c8eef9bcbf5, + 0x115d68bc9d4e2846, + 0xba875f18facf7420, + 0xd1edfcb8b6e23ebd, + 0xb00736f2f1e364ae, + 0x84d929ce6589b6fe, + 0x70b7a2f6da4f7255, + 0x0e7253d75c6d4929, + 0x04f23a3d574159a7, + 0x0a8069ea0b2c108e, + 0x49d073c56bb11a11, + 0x8aab7a1939e4ffd7, + 0xcd095a0b0e38acef, + 0xc9fb60365979f548, + 0x92bde697d67f3422, + 0xc78933e10514bc61, + 0xe1c1d9b975c9b54a, + 0xd2266160cf1bcd80, + 0x9a4492ed78fd8671, + 0xb3ccab2a881a9793, + 0x72cebf667fe1d088, + 0xd6d45b5d985a9427, + }, +}; + +__constant u64 sbob_rc64[12][8] = +{ + { + 0xe9daca1eda5b08b1, + 0x1f7c65c0812fcbeb, + 0x16d0452e43766a2f, + 0xfcc485758db84e71, + 0x0169679291e07c4b, + 0x15d360a4082a42a2, + 0x234d74cc36747605, + 0x0745a6f2596580dd, + }, + { + 0x1a2f9da98ab5a36f, + 0xd7b5700f469de34f, + 0x982b230a72eafef3, + 0x3101b5160f5ed561, + 0x5899d6126b17b59a, + 0xcaa70adbc261b55c, + 0x56cdcbd71ba2dd55, + 0xb79bb121700479e6, + }, + { + 0xc72fce2bacdc74f5, + 0x35843d6a28fc390a, + 0x8b1f9c525f5ef106, + 0x7b7b29b11475eaf2, + 0xb19e3590e40fe2d3, + 0x09db6260373ac9c1, + 0x31db7a8643f4b6c2, + 0xb20aba0af5961e99, + }, + { + 0xd26615e8b3df1fef, + 0xdde4715da0e148f9, + 0x7d3c5c337e858e48, + 0x3f355e68ad1c729d, + 0x75d603ed822cd7a9, + 0xbe0352933313b7d8, + 0xf137e893a1ea5334, + 0x2ed1e384bcbe0c22, + }, + { + 0x994747adac6bea4b, + 0x6323a96c0c413f9a, + 0x4a1086161f1c157f, + 0xbdff0f80d7359e35, + 0xa3f53a254717cdbf, + 0x161a2723b700ffdf, + 0xf563eaa97ea2567a, + 0x57fe6c7cfd581760, + }, + { + 0xd9d33a1daeae4fae, + 0xc039307a3bc3a46f, + 0x6ca44251f9c4662d, + 0xc68ef09ab49a7f18, + 0xb4b79a1cb7a6facf, + 0xb6c6bec2661ff20a, + 0x354f903672c571bf, + 0x6e7d64467a4068fa, + }, + { + 0xecc5aaee160ec7f4, + 0x540924bffe86ac51, + 0xc987bfe6c7c69e39, + 0xc9937a19333e47d3, + 0x372c822dc5ab9209, + 0x04054a2883694706, + 0xf34a3ca24c451735, + 0x93d4143a4d568688, + }, + { + 0xa7c9934d425b1f9b, + 0x41416e0c02aae703, + 0x1ede369c71f8b74e, + 0x9ac4db4d3b44b489, + 0x90069b92cb2b89f4, + 0x2fc4a5d12b8dd169, + 0xd9a8515935c2ac36, + 0x1ee702bfd40d7fa4, + }, + { + 0x9b223116545a8f37, + 0xde5f16ecd89a4c94, + 0x244289251b3a7d3a, + 0x84090de0b755d93c, + 0xb1ceb2db0b440a80, + 0x549c07a69a8a2b7b, + 0x602a1fcb92dc380e, + 0xdb5a238351446172, + }, + { + 0x526f0580a6debeab, + 0xf3f3e4b248e52a38, + 0xdb788aff1ce74189, + 0x0361331b8ae1ff1f, + 0x4b3369af0267e79f, + 0xf452763b306c1e7a, + 0xc3b63b15d1fa9836, + 0xed9c4598fbc7b474, + }, + { + 0xfb89c8efd09ecd7b, + 0x94fe5a63cdc60230, + 0x6107abebbb6bfad8, + 0x7966841421800120, + 0xcab948eaef711d8a, + 0x986e477d1dcdbaef, + 0x5dd86fc04a59a2de, + 0x1b2df381cda4ca6b, + }, + { + 0xba3116f167e78e37, + 0x7ab14904b08013d2, + 0x771ddfbc323ca4cd, + 0x9b9f2130d41220f8, + 0x86cc91189def805d, + 0x5228e188aaa41de7, + 0x991bb2d9d517f4fa, + 0x20d71bf14a92bc48, + }, +}; + +static void streebog_g (u64 h[8], const u64 m[8], __local u64 s_sbob_sl64[8][256]) +{ + u64 k[8]; + u64 s[8]; + u64 t[8]; + + #pragma unroll + for (int i = 0; i < 8; i++) + { + t[i] = h[i]; + } + + for (int i = 0; i < 8; i++) + { + k[i] = SBOG_LPSti64; + } + + #pragma unroll + for (int i = 0; i < 8; i++) + { + s[i] = m[i]; + } + + for (int r = 0; r < 12; r++) + { + #pragma unroll + for (int i = 0; i < 8; i++) + { + t[i] = s[i] ^ k[i]; + } + + #pragma unroll + for (int i = 0; i < 8; i++) + { + s[i] = SBOG_LPSti64; + } + + for (int i = 0; i < 8; i++) + { + t[i] = k[i] ^ sbob_rc64[r][i]; + } + + #pragma unroll + for (int i = 0; i < 8; i++) + { + k[i] = SBOG_LPSti64; + } + } + + #pragma unroll + for (int i = 0; i < 8; i++) + { + h[i] ^= s[i] ^ k[i] ^ m[i]; + } +} + +static void m11800m (__local u64 s_sbob_sl64[8][256], u32x w[16], const u32 pw_len, __global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset) +{ + /** + * modifier + */ + + const u32 gid = get_global_id (0); + const u32 lid = get_local_id (0); + + /** + * loop + */ + + u32x w0l = w[0]; + + for (u32 il_pos = 0; il_pos < bfs_cnt; il_pos++) + { + const u32 w0r = bfs_buf[il_pos].i; + + w[0] = w0l | w0r; + + /** + * reverse message block + */ + + u64 m[8]; + + m[0] = hl32_to_64 (w[15], w[14]); + m[1] = hl32_to_64 (w[13], w[12]); + m[2] = hl32_to_64 (w[11], w[10]); + m[3] = hl32_to_64 (w[ 9], w[ 8]); + m[4] = hl32_to_64 (w[ 7], w[ 6]); + m[5] = hl32_to_64 (w[ 5], w[ 4]); + m[6] = hl32_to_64 (w[ 3], w[ 2]); + m[7] = hl32_to_64 (w[ 1], w[ 0]); + + m[0] = swap_workaround (m[0]); + m[1] = swap_workaround (m[1]); + m[2] = swap_workaround (m[2]); + m[3] = swap_workaround (m[3]); + m[4] = swap_workaround (m[4]); + m[5] = swap_workaround (m[5]); + m[6] = swap_workaround (m[6]); + m[7] = swap_workaround (m[7]); + + // state buffer (hash) + + u64 h[8]; + + h[0] = INITVAL; + h[1] = INITVAL; + h[2] = INITVAL; + h[3] = INITVAL; + h[4] = INITVAL; + h[5] = INITVAL; + h[6] = INITVAL; + h[7] = INITVAL; + + streebog_g (h, m, s_sbob_sl64); + + u64 z[8]; + + z[0] = 0; + z[1] = 0; + z[2] = 0; + z[3] = 0; + z[4] = 0; + z[5] = 0; + z[6] = 0; + z[7] = swap_workaround ((u64) (pw_len * 8)); + + streebog_g (h, z, s_sbob_sl64); + streebog_g (h, m, s_sbob_sl64); + + const u32 r0 = l32_from_64 (h[0]); + const u32 r1 = h32_from_64 (h[0]); + const u32 r2 = l32_from_64 (h[1]); + const u32 r3 = h32_from_64 (h[1]); + + #include VECT_COMPARE_M + } +} + +static void m11800s (__local u64 s_sbob_sl64[8][256], u32x w[16], const u32 pw_len, __global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset) +{ + /** + * modifier + */ + + const u32 gid = get_global_id (0); + const u32 lid = get_local_id (0); + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * loop + */ + + u32x w0l = w[0]; + + for (u32 il_pos = 0; il_pos < bfs_cnt; il_pos++) + { + const u32 w0r = bfs_buf[il_pos].i; + + w[0] = w0l | w0r; + + /** + * reverse message block + */ + + u64 m[8]; + + m[0] = hl32_to_64 (w[15], w[14]); + m[1] = hl32_to_64 (w[13], w[12]); + m[2] = hl32_to_64 (w[11], w[10]); + m[3] = hl32_to_64 (w[ 9], w[ 8]); + m[4] = hl32_to_64 (w[ 7], w[ 6]); + m[5] = hl32_to_64 (w[ 5], w[ 4]); + m[6] = hl32_to_64 (w[ 3], w[ 2]); + m[7] = hl32_to_64 (w[ 1], w[ 0]); + + m[0] = swap_workaround (m[0]); + m[1] = swap_workaround (m[1]); + m[2] = swap_workaround (m[2]); + m[3] = swap_workaround (m[3]); + m[4] = swap_workaround (m[4]); + m[5] = swap_workaround (m[5]); + m[6] = swap_workaround (m[6]); + m[7] = swap_workaround (m[7]); + + // state buffer (hash) + + u64 h[8]; + + h[0] = INITVAL; + h[1] = INITVAL; + h[2] = INITVAL; + h[3] = INITVAL; + h[4] = INITVAL; + h[5] = INITVAL; + h[6] = INITVAL; + h[7] = INITVAL; + + streebog_g (h, m, s_sbob_sl64); + + u64 z[8]; + + z[0] = 0; + z[1] = 0; + z[2] = 0; + z[3] = 0; + z[4] = 0; + z[5] = 0; + z[6] = 0; + z[7] = swap_workaround ((u64) (pw_len * 8)); + + streebog_g (h, z, s_sbob_sl64); + streebog_g (h, m, s_sbob_sl64); + + const u32 r0 = l32_from_64 (h[0]); + const u32 r1 = h32_from_64 (h[0]); + const u32 r2 = l32_from_64 (h[1]); + const u32 r3 = h32_from_64 (h[1]); + + #include VECT_COMPARE_S + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m11800_m04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + const u32 lid = get_local_id (0); + + u32x w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = 0; + w[ 5] = 0; + w[ 6] = 0; + w[ 7] = 0; + w[ 8] = 0; + w[ 9] = 0; + w[10] = 0; + w[11] = 0; + w[12] = 0; + w[13] = 0; + w[14] = 0; + w[15] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * shared lookup table + */ + + const u32 lid4 = lid * 4; + + __local u64 s_sbob_sl64[8][256]; + + s_sbob_sl64[0][lid4 + 0] = sbob_sl64[0][lid4 + 0]; + s_sbob_sl64[0][lid4 + 1] = sbob_sl64[0][lid4 + 1]; + s_sbob_sl64[0][lid4 + 2] = sbob_sl64[0][lid4 + 2]; + s_sbob_sl64[0][lid4 + 3] = sbob_sl64[0][lid4 + 3]; + s_sbob_sl64[1][lid4 + 0] = sbob_sl64[1][lid4 + 0]; + s_sbob_sl64[1][lid4 + 1] = sbob_sl64[1][lid4 + 1]; + s_sbob_sl64[1][lid4 + 2] = sbob_sl64[1][lid4 + 2]; + s_sbob_sl64[1][lid4 + 3] = sbob_sl64[1][lid4 + 3]; + s_sbob_sl64[2][lid4 + 0] = sbob_sl64[2][lid4 + 0]; + s_sbob_sl64[2][lid4 + 1] = sbob_sl64[2][lid4 + 1]; + s_sbob_sl64[2][lid4 + 2] = sbob_sl64[2][lid4 + 2]; + s_sbob_sl64[2][lid4 + 3] = sbob_sl64[2][lid4 + 3]; + s_sbob_sl64[3][lid4 + 0] = sbob_sl64[3][lid4 + 0]; + s_sbob_sl64[3][lid4 + 1] = sbob_sl64[3][lid4 + 1]; + s_sbob_sl64[3][lid4 + 2] = sbob_sl64[3][lid4 + 2]; + s_sbob_sl64[3][lid4 + 3] = sbob_sl64[3][lid4 + 3]; + s_sbob_sl64[4][lid4 + 0] = sbob_sl64[4][lid4 + 0]; + s_sbob_sl64[4][lid4 + 1] = sbob_sl64[4][lid4 + 1]; + s_sbob_sl64[4][lid4 + 2] = sbob_sl64[4][lid4 + 2]; + s_sbob_sl64[4][lid4 + 3] = sbob_sl64[4][lid4 + 3]; + s_sbob_sl64[5][lid4 + 0] = sbob_sl64[5][lid4 + 0]; + s_sbob_sl64[5][lid4 + 1] = sbob_sl64[5][lid4 + 1]; + s_sbob_sl64[5][lid4 + 2] = sbob_sl64[5][lid4 + 2]; + s_sbob_sl64[5][lid4 + 3] = sbob_sl64[5][lid4 + 3]; + s_sbob_sl64[6][lid4 + 0] = sbob_sl64[6][lid4 + 0]; + s_sbob_sl64[6][lid4 + 1] = sbob_sl64[6][lid4 + 1]; + s_sbob_sl64[6][lid4 + 2] = sbob_sl64[6][lid4 + 2]; + s_sbob_sl64[6][lid4 + 3] = sbob_sl64[6][lid4 + 3]; + s_sbob_sl64[7][lid4 + 0] = sbob_sl64[7][lid4 + 0]; + s_sbob_sl64[7][lid4 + 1] = sbob_sl64[7][lid4 + 1]; + s_sbob_sl64[7][lid4 + 2] = sbob_sl64[7][lid4 + 2]; + s_sbob_sl64[7][lid4 + 3] = sbob_sl64[7][lid4 + 3]; + + barrier (CLK_LOCAL_MEM_FENCE); + + if (gid >= gid_max) return; + + /** + * main + */ + + m11800m (s_sbob_sl64, w, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m11800_m08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + const u32 lid = get_local_id (0); + + u32x w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = pws[gid].i[ 4]; + w[ 5] = pws[gid].i[ 5]; + w[ 6] = pws[gid].i[ 6]; + w[ 7] = pws[gid].i[ 7]; + w[ 8] = 0; + w[ 9] = 0; + w[10] = 0; + w[11] = 0; + w[12] = 0; + w[13] = 0; + w[14] = 0; + w[15] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * shared lookup table + */ + + const u32 lid4 = lid * 4; + + __local u64 s_sbob_sl64[8][256]; + + s_sbob_sl64[0][lid4 + 0] = sbob_sl64[0][lid4 + 0]; + s_sbob_sl64[0][lid4 + 1] = sbob_sl64[0][lid4 + 1]; + s_sbob_sl64[0][lid4 + 2] = sbob_sl64[0][lid4 + 2]; + s_sbob_sl64[0][lid4 + 3] = sbob_sl64[0][lid4 + 3]; + s_sbob_sl64[1][lid4 + 0] = sbob_sl64[1][lid4 + 0]; + s_sbob_sl64[1][lid4 + 1] = sbob_sl64[1][lid4 + 1]; + s_sbob_sl64[1][lid4 + 2] = sbob_sl64[1][lid4 + 2]; + s_sbob_sl64[1][lid4 + 3] = sbob_sl64[1][lid4 + 3]; + s_sbob_sl64[2][lid4 + 0] = sbob_sl64[2][lid4 + 0]; + s_sbob_sl64[2][lid4 + 1] = sbob_sl64[2][lid4 + 1]; + s_sbob_sl64[2][lid4 + 2] = sbob_sl64[2][lid4 + 2]; + s_sbob_sl64[2][lid4 + 3] = sbob_sl64[2][lid4 + 3]; + s_sbob_sl64[3][lid4 + 0] = sbob_sl64[3][lid4 + 0]; + s_sbob_sl64[3][lid4 + 1] = sbob_sl64[3][lid4 + 1]; + s_sbob_sl64[3][lid4 + 2] = sbob_sl64[3][lid4 + 2]; + s_sbob_sl64[3][lid4 + 3] = sbob_sl64[3][lid4 + 3]; + s_sbob_sl64[4][lid4 + 0] = sbob_sl64[4][lid4 + 0]; + s_sbob_sl64[4][lid4 + 1] = sbob_sl64[4][lid4 + 1]; + s_sbob_sl64[4][lid4 + 2] = sbob_sl64[4][lid4 + 2]; + s_sbob_sl64[4][lid4 + 3] = sbob_sl64[4][lid4 + 3]; + s_sbob_sl64[5][lid4 + 0] = sbob_sl64[5][lid4 + 0]; + s_sbob_sl64[5][lid4 + 1] = sbob_sl64[5][lid4 + 1]; + s_sbob_sl64[5][lid4 + 2] = sbob_sl64[5][lid4 + 2]; + s_sbob_sl64[5][lid4 + 3] = sbob_sl64[5][lid4 + 3]; + s_sbob_sl64[6][lid4 + 0] = sbob_sl64[6][lid4 + 0]; + s_sbob_sl64[6][lid4 + 1] = sbob_sl64[6][lid4 + 1]; + s_sbob_sl64[6][lid4 + 2] = sbob_sl64[6][lid4 + 2]; + s_sbob_sl64[6][lid4 + 3] = sbob_sl64[6][lid4 + 3]; + s_sbob_sl64[7][lid4 + 0] = sbob_sl64[7][lid4 + 0]; + s_sbob_sl64[7][lid4 + 1] = sbob_sl64[7][lid4 + 1]; + s_sbob_sl64[7][lid4 + 2] = sbob_sl64[7][lid4 + 2]; + s_sbob_sl64[7][lid4 + 3] = sbob_sl64[7][lid4 + 3]; + + barrier (CLK_LOCAL_MEM_FENCE); + + if (gid >= gid_max) return; + + /** + * main + */ + + m11800m (s_sbob_sl64, w, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m11800_m16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + const u32 lid = get_local_id (0); + + u32x w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = pws[gid].i[ 4]; + w[ 5] = pws[gid].i[ 5]; + w[ 6] = pws[gid].i[ 6]; + w[ 7] = pws[gid].i[ 7]; + w[ 8] = pws[gid].i[ 8]; + w[ 9] = pws[gid].i[ 9]; + w[10] = pws[gid].i[10]; + w[11] = pws[gid].i[11]; + w[12] = pws[gid].i[12]; + w[13] = pws[gid].i[13]; + w[14] = pws[gid].i[14]; + w[15] = pws[gid].i[15]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * shared lookup table + */ + + const u32 lid4 = lid * 4; + + __local u64 s_sbob_sl64[8][256]; + + s_sbob_sl64[0][lid4 + 0] = sbob_sl64[0][lid4 + 0]; + s_sbob_sl64[0][lid4 + 1] = sbob_sl64[0][lid4 + 1]; + s_sbob_sl64[0][lid4 + 2] = sbob_sl64[0][lid4 + 2]; + s_sbob_sl64[0][lid4 + 3] = sbob_sl64[0][lid4 + 3]; + s_sbob_sl64[1][lid4 + 0] = sbob_sl64[1][lid4 + 0]; + s_sbob_sl64[1][lid4 + 1] = sbob_sl64[1][lid4 + 1]; + s_sbob_sl64[1][lid4 + 2] = sbob_sl64[1][lid4 + 2]; + s_sbob_sl64[1][lid4 + 3] = sbob_sl64[1][lid4 + 3]; + s_sbob_sl64[2][lid4 + 0] = sbob_sl64[2][lid4 + 0]; + s_sbob_sl64[2][lid4 + 1] = sbob_sl64[2][lid4 + 1]; + s_sbob_sl64[2][lid4 + 2] = sbob_sl64[2][lid4 + 2]; + s_sbob_sl64[2][lid4 + 3] = sbob_sl64[2][lid4 + 3]; + s_sbob_sl64[3][lid4 + 0] = sbob_sl64[3][lid4 + 0]; + s_sbob_sl64[3][lid4 + 1] = sbob_sl64[3][lid4 + 1]; + s_sbob_sl64[3][lid4 + 2] = sbob_sl64[3][lid4 + 2]; + s_sbob_sl64[3][lid4 + 3] = sbob_sl64[3][lid4 + 3]; + s_sbob_sl64[4][lid4 + 0] = sbob_sl64[4][lid4 + 0]; + s_sbob_sl64[4][lid4 + 1] = sbob_sl64[4][lid4 + 1]; + s_sbob_sl64[4][lid4 + 2] = sbob_sl64[4][lid4 + 2]; + s_sbob_sl64[4][lid4 + 3] = sbob_sl64[4][lid4 + 3]; + s_sbob_sl64[5][lid4 + 0] = sbob_sl64[5][lid4 + 0]; + s_sbob_sl64[5][lid4 + 1] = sbob_sl64[5][lid4 + 1]; + s_sbob_sl64[5][lid4 + 2] = sbob_sl64[5][lid4 + 2]; + s_sbob_sl64[5][lid4 + 3] = sbob_sl64[5][lid4 + 3]; + s_sbob_sl64[6][lid4 + 0] = sbob_sl64[6][lid4 + 0]; + s_sbob_sl64[6][lid4 + 1] = sbob_sl64[6][lid4 + 1]; + s_sbob_sl64[6][lid4 + 2] = sbob_sl64[6][lid4 + 2]; + s_sbob_sl64[6][lid4 + 3] = sbob_sl64[6][lid4 + 3]; + s_sbob_sl64[7][lid4 + 0] = sbob_sl64[7][lid4 + 0]; + s_sbob_sl64[7][lid4 + 1] = sbob_sl64[7][lid4 + 1]; + s_sbob_sl64[7][lid4 + 2] = sbob_sl64[7][lid4 + 2]; + s_sbob_sl64[7][lid4 + 3] = sbob_sl64[7][lid4 + 3]; + + barrier (CLK_LOCAL_MEM_FENCE); + + if (gid >= gid_max) return; + + /** + * main + */ + + m11800m (s_sbob_sl64, w, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m11800_s04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + const u32 lid = get_local_id (0); + + u32x w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = 0; + w[ 5] = 0; + w[ 6] = 0; + w[ 7] = 0; + w[ 8] = 0; + w[ 9] = 0; + w[10] = 0; + w[11] = 0; + w[12] = 0; + w[13] = 0; + w[14] = 0; + w[15] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * shared lookup table + */ + + const u32 lid4 = lid * 4; + + __local u64 s_sbob_sl64[8][256]; + + s_sbob_sl64[0][lid4 + 0] = sbob_sl64[0][lid4 + 0]; + s_sbob_sl64[0][lid4 + 1] = sbob_sl64[0][lid4 + 1]; + s_sbob_sl64[0][lid4 + 2] = sbob_sl64[0][lid4 + 2]; + s_sbob_sl64[0][lid4 + 3] = sbob_sl64[0][lid4 + 3]; + s_sbob_sl64[1][lid4 + 0] = sbob_sl64[1][lid4 + 0]; + s_sbob_sl64[1][lid4 + 1] = sbob_sl64[1][lid4 + 1]; + s_sbob_sl64[1][lid4 + 2] = sbob_sl64[1][lid4 + 2]; + s_sbob_sl64[1][lid4 + 3] = sbob_sl64[1][lid4 + 3]; + s_sbob_sl64[2][lid4 + 0] = sbob_sl64[2][lid4 + 0]; + s_sbob_sl64[2][lid4 + 1] = sbob_sl64[2][lid4 + 1]; + s_sbob_sl64[2][lid4 + 2] = sbob_sl64[2][lid4 + 2]; + s_sbob_sl64[2][lid4 + 3] = sbob_sl64[2][lid4 + 3]; + s_sbob_sl64[3][lid4 + 0] = sbob_sl64[3][lid4 + 0]; + s_sbob_sl64[3][lid4 + 1] = sbob_sl64[3][lid4 + 1]; + s_sbob_sl64[3][lid4 + 2] = sbob_sl64[3][lid4 + 2]; + s_sbob_sl64[3][lid4 + 3] = sbob_sl64[3][lid4 + 3]; + s_sbob_sl64[4][lid4 + 0] = sbob_sl64[4][lid4 + 0]; + s_sbob_sl64[4][lid4 + 1] = sbob_sl64[4][lid4 + 1]; + s_sbob_sl64[4][lid4 + 2] = sbob_sl64[4][lid4 + 2]; + s_sbob_sl64[4][lid4 + 3] = sbob_sl64[4][lid4 + 3]; + s_sbob_sl64[5][lid4 + 0] = sbob_sl64[5][lid4 + 0]; + s_sbob_sl64[5][lid4 + 1] = sbob_sl64[5][lid4 + 1]; + s_sbob_sl64[5][lid4 + 2] = sbob_sl64[5][lid4 + 2]; + s_sbob_sl64[5][lid4 + 3] = sbob_sl64[5][lid4 + 3]; + s_sbob_sl64[6][lid4 + 0] = sbob_sl64[6][lid4 + 0]; + s_sbob_sl64[6][lid4 + 1] = sbob_sl64[6][lid4 + 1]; + s_sbob_sl64[6][lid4 + 2] = sbob_sl64[6][lid4 + 2]; + s_sbob_sl64[6][lid4 + 3] = sbob_sl64[6][lid4 + 3]; + s_sbob_sl64[7][lid4 + 0] = sbob_sl64[7][lid4 + 0]; + s_sbob_sl64[7][lid4 + 1] = sbob_sl64[7][lid4 + 1]; + s_sbob_sl64[7][lid4 + 2] = sbob_sl64[7][lid4 + 2]; + s_sbob_sl64[7][lid4 + 3] = sbob_sl64[7][lid4 + 3]; + + barrier (CLK_LOCAL_MEM_FENCE); + + if (gid >= gid_max) return; + + /** + * main + */ + + m11800s (s_sbob_sl64, w, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m11800_s08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + const u32 lid = get_local_id (0); + + u32x w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = pws[gid].i[ 4]; + w[ 5] = pws[gid].i[ 5]; + w[ 6] = pws[gid].i[ 6]; + w[ 7] = pws[gid].i[ 7]; + w[ 8] = 0; + w[ 9] = 0; + w[10] = 0; + w[11] = 0; + w[12] = 0; + w[13] = 0; + w[14] = 0; + w[15] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * shared lookup table + */ + + const u32 lid4 = lid * 4; + + __local u64 s_sbob_sl64[8][256]; + + s_sbob_sl64[0][lid4 + 0] = sbob_sl64[0][lid4 + 0]; + s_sbob_sl64[0][lid4 + 1] = sbob_sl64[0][lid4 + 1]; + s_sbob_sl64[0][lid4 + 2] = sbob_sl64[0][lid4 + 2]; + s_sbob_sl64[0][lid4 + 3] = sbob_sl64[0][lid4 + 3]; + s_sbob_sl64[1][lid4 + 0] = sbob_sl64[1][lid4 + 0]; + s_sbob_sl64[1][lid4 + 1] = sbob_sl64[1][lid4 + 1]; + s_sbob_sl64[1][lid4 + 2] = sbob_sl64[1][lid4 + 2]; + s_sbob_sl64[1][lid4 + 3] = sbob_sl64[1][lid4 + 3]; + s_sbob_sl64[2][lid4 + 0] = sbob_sl64[2][lid4 + 0]; + s_sbob_sl64[2][lid4 + 1] = sbob_sl64[2][lid4 + 1]; + s_sbob_sl64[2][lid4 + 2] = sbob_sl64[2][lid4 + 2]; + s_sbob_sl64[2][lid4 + 3] = sbob_sl64[2][lid4 + 3]; + s_sbob_sl64[3][lid4 + 0] = sbob_sl64[3][lid4 + 0]; + s_sbob_sl64[3][lid4 + 1] = sbob_sl64[3][lid4 + 1]; + s_sbob_sl64[3][lid4 + 2] = sbob_sl64[3][lid4 + 2]; + s_sbob_sl64[3][lid4 + 3] = sbob_sl64[3][lid4 + 3]; + s_sbob_sl64[4][lid4 + 0] = sbob_sl64[4][lid4 + 0]; + s_sbob_sl64[4][lid4 + 1] = sbob_sl64[4][lid4 + 1]; + s_sbob_sl64[4][lid4 + 2] = sbob_sl64[4][lid4 + 2]; + s_sbob_sl64[4][lid4 + 3] = sbob_sl64[4][lid4 + 3]; + s_sbob_sl64[5][lid4 + 0] = sbob_sl64[5][lid4 + 0]; + s_sbob_sl64[5][lid4 + 1] = sbob_sl64[5][lid4 + 1]; + s_sbob_sl64[5][lid4 + 2] = sbob_sl64[5][lid4 + 2]; + s_sbob_sl64[5][lid4 + 3] = sbob_sl64[5][lid4 + 3]; + s_sbob_sl64[6][lid4 + 0] = sbob_sl64[6][lid4 + 0]; + s_sbob_sl64[6][lid4 + 1] = sbob_sl64[6][lid4 + 1]; + s_sbob_sl64[6][lid4 + 2] = sbob_sl64[6][lid4 + 2]; + s_sbob_sl64[6][lid4 + 3] = sbob_sl64[6][lid4 + 3]; + s_sbob_sl64[7][lid4 + 0] = sbob_sl64[7][lid4 + 0]; + s_sbob_sl64[7][lid4 + 1] = sbob_sl64[7][lid4 + 1]; + s_sbob_sl64[7][lid4 + 2] = sbob_sl64[7][lid4 + 2]; + s_sbob_sl64[7][lid4 + 3] = sbob_sl64[7][lid4 + 3]; + + barrier (CLK_LOCAL_MEM_FENCE); + + if (gid >= gid_max) return; + + /** + * main + */ + + m11800s (s_sbob_sl64, w, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m11800_s16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + const u32 lid = get_local_id (0); + + u32x w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = pws[gid].i[ 4]; + w[ 5] = pws[gid].i[ 5]; + w[ 6] = pws[gid].i[ 6]; + w[ 7] = pws[gid].i[ 7]; + w[ 8] = pws[gid].i[ 8]; + w[ 9] = pws[gid].i[ 9]; + w[10] = pws[gid].i[10]; + w[11] = pws[gid].i[11]; + w[12] = pws[gid].i[12]; + w[13] = pws[gid].i[13]; + w[14] = pws[gid].i[14]; + w[15] = pws[gid].i[15]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * shared lookup table + */ + + const u32 lid4 = lid * 4; + + __local u64 s_sbob_sl64[8][256]; + + s_sbob_sl64[0][lid4 + 0] = sbob_sl64[0][lid4 + 0]; + s_sbob_sl64[0][lid4 + 1] = sbob_sl64[0][lid4 + 1]; + s_sbob_sl64[0][lid4 + 2] = sbob_sl64[0][lid4 + 2]; + s_sbob_sl64[0][lid4 + 3] = sbob_sl64[0][lid4 + 3]; + s_sbob_sl64[1][lid4 + 0] = sbob_sl64[1][lid4 + 0]; + s_sbob_sl64[1][lid4 + 1] = sbob_sl64[1][lid4 + 1]; + s_sbob_sl64[1][lid4 + 2] = sbob_sl64[1][lid4 + 2]; + s_sbob_sl64[1][lid4 + 3] = sbob_sl64[1][lid4 + 3]; + s_sbob_sl64[2][lid4 + 0] = sbob_sl64[2][lid4 + 0]; + s_sbob_sl64[2][lid4 + 1] = sbob_sl64[2][lid4 + 1]; + s_sbob_sl64[2][lid4 + 2] = sbob_sl64[2][lid4 + 2]; + s_sbob_sl64[2][lid4 + 3] = sbob_sl64[2][lid4 + 3]; + s_sbob_sl64[3][lid4 + 0] = sbob_sl64[3][lid4 + 0]; + s_sbob_sl64[3][lid4 + 1] = sbob_sl64[3][lid4 + 1]; + s_sbob_sl64[3][lid4 + 2] = sbob_sl64[3][lid4 + 2]; + s_sbob_sl64[3][lid4 + 3] = sbob_sl64[3][lid4 + 3]; + s_sbob_sl64[4][lid4 + 0] = sbob_sl64[4][lid4 + 0]; + s_sbob_sl64[4][lid4 + 1] = sbob_sl64[4][lid4 + 1]; + s_sbob_sl64[4][lid4 + 2] = sbob_sl64[4][lid4 + 2]; + s_sbob_sl64[4][lid4 + 3] = sbob_sl64[4][lid4 + 3]; + s_sbob_sl64[5][lid4 + 0] = sbob_sl64[5][lid4 + 0]; + s_sbob_sl64[5][lid4 + 1] = sbob_sl64[5][lid4 + 1]; + s_sbob_sl64[5][lid4 + 2] = sbob_sl64[5][lid4 + 2]; + s_sbob_sl64[5][lid4 + 3] = sbob_sl64[5][lid4 + 3]; + s_sbob_sl64[6][lid4 + 0] = sbob_sl64[6][lid4 + 0]; + s_sbob_sl64[6][lid4 + 1] = sbob_sl64[6][lid4 + 1]; + s_sbob_sl64[6][lid4 + 2] = sbob_sl64[6][lid4 + 2]; + s_sbob_sl64[6][lid4 + 3] = sbob_sl64[6][lid4 + 3]; + s_sbob_sl64[7][lid4 + 0] = sbob_sl64[7][lid4 + 0]; + s_sbob_sl64[7][lid4 + 1] = sbob_sl64[7][lid4 + 1]; + s_sbob_sl64[7][lid4 + 2] = sbob_sl64[7][lid4 + 2]; + s_sbob_sl64[7][lid4 + 3] = sbob_sl64[7][lid4 + 3]; + + barrier (CLK_LOCAL_MEM_FENCE); + + if (gid >= gid_max) return; + + /** + * main + */ + + m11800s (s_sbob_sl64, w, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} diff --git a/amd/m11900.cl b/amd/m11900.cl new file mode 100644 index 0000000000..4ad46917fd --- /dev/null +++ b/amd/m11900.cl @@ -0,0 +1,421 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _PBKDF2_MD5_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW4 +#define VECT_SIZE1 +#endif + +#ifdef VLIW5 +#define VECT_SIZE1 +#endif + +#define DGST_R0 0 +#define DGST_R1 1 +#define DGST_R2 2 +#define DGST_R3 3 + +#include "include/kernel_functions.c" + +#include "types_amd.c" +#include "common_amd.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +static void md5_transform (const u32x w0[4], const u32x w1[4], const u32x w2[4], const u32x w3[4], u32x digest[4]) +{ + u32x a = digest[0]; + u32x b = digest[1]; + u32x c = digest[2]; + u32x d = digest[3]; + + u32x w0_t = w0[0]; + u32x w1_t = w0[1]; + u32x w2_t = w0[2]; + u32x w3_t = w0[3]; + u32x w4_t = w1[0]; + u32x w5_t = w1[1]; + u32x w6_t = w1[2]; + u32x w7_t = w1[3]; + u32x w8_t = w2[0]; + u32x w9_t = w2[1]; + u32x wa_t = w2[2]; + u32x wb_t = w2[3]; + u32x wc_t = w3[0]; + u32x wd_t = w3[1]; + u32x we_t = w3[2]; + u32x wf_t = w3[3]; + + u32x tmp2; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t, MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t, MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t, MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t, MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w4_t, MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w5_t, MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w6_t, MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w7_t, MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w8_t, MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w9_t, MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, wa_t, MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, wb_t, MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, wc_t, MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, wd_t, MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, we_t, MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, wf_t, MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w1_t, MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w6_t, MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, wb_t, MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t, MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w5_t, MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, wa_t, MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, wf_t, MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w4_t, MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w9_t, MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, we_t, MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t, MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w8_t, MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, wd_t, MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t, MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w7_t, MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, wc_t, MD5C1f, MD5S13); + + MD5_STEP (MD5_H1, a, b, c, d, w5_t, MD5C20, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w8_t, MD5C21, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, wb_t, MD5C22, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, we_t, MD5C23, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w1_t, MD5C24, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w4_t, MD5C25, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w7_t, MD5C26, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, wa_t, MD5C27, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, wd_t, MD5C28, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w0_t, MD5C29, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w3_t, MD5C2a, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w6_t, MD5C2b, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w9_t, MD5C2c, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, wc_t, MD5C2d, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, wf_t, MD5C2e, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w2_t, MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t, MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w7_t, MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, we_t, MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w5_t, MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, wc_t, MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t, MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, wa_t, MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t, MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w8_t, MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, wf_t, MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w6_t, MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, wd_t, MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w4_t, MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, wb_t, MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t, MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w9_t, MD5C3f, MD5S33); + + digest[0] += a; + digest[1] += b; + digest[2] += c; + digest[3] += d; +} + +static void hmac_md5_pad (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], u32x ipad[4], u32x opad[4]) +{ + w0[0] = w0[0] ^ 0x36363636; + w0[1] = w0[1] ^ 0x36363636; + w0[2] = w0[2] ^ 0x36363636; + w0[3] = w0[3] ^ 0x36363636; + w1[0] = w1[0] ^ 0x36363636; + w1[1] = w1[1] ^ 0x36363636; + w1[2] = w1[2] ^ 0x36363636; + w1[3] = w1[3] ^ 0x36363636; + w2[0] = w2[0] ^ 0x36363636; + w2[1] = w2[1] ^ 0x36363636; + w2[2] = w2[2] ^ 0x36363636; + w2[3] = w2[3] ^ 0x36363636; + w3[0] = w3[0] ^ 0x36363636; + w3[1] = w3[1] ^ 0x36363636; + w3[2] = w3[2] ^ 0x36363636; + w3[3] = w3[3] ^ 0x36363636; + + ipad[0] = MD5M_A; + ipad[1] = MD5M_B; + ipad[2] = MD5M_C; + ipad[3] = MD5M_D; + + md5_transform (w0, w1, w2, w3, ipad); + + w0[0] = w0[0] ^ 0x6a6a6a6a; + w0[1] = w0[1] ^ 0x6a6a6a6a; + w0[2] = w0[2] ^ 0x6a6a6a6a; + w0[3] = w0[3] ^ 0x6a6a6a6a; + w1[0] = w1[0] ^ 0x6a6a6a6a; + w1[1] = w1[1] ^ 0x6a6a6a6a; + w1[2] = w1[2] ^ 0x6a6a6a6a; + w1[3] = w1[3] ^ 0x6a6a6a6a; + w2[0] = w2[0] ^ 0x6a6a6a6a; + w2[1] = w2[1] ^ 0x6a6a6a6a; + w2[2] = w2[2] ^ 0x6a6a6a6a; + w2[3] = w2[3] ^ 0x6a6a6a6a; + w3[0] = w3[0] ^ 0x6a6a6a6a; + w3[1] = w3[1] ^ 0x6a6a6a6a; + w3[2] = w3[2] ^ 0x6a6a6a6a; + w3[3] = w3[3] ^ 0x6a6a6a6a; + + opad[0] = MD5M_A; + opad[1] = MD5M_B; + opad[2] = MD5M_C; + opad[3] = MD5M_D; + + md5_transform (w0, w1, w2, w3, opad); +} + +static void hmac_md5_run (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], u32x ipad[4], u32x opad[4], u32x digest[4]) +{ + digest[0] = ipad[0]; + digest[1] = ipad[1]; + digest[2] = ipad[2]; + digest[3] = ipad[3]; + + md5_transform (w0, w1, w2, w3, digest); + + w0[0] = digest[0]; + w0[1] = digest[1]; + w0[2] = digest[2]; + w0[3] = digest[3]; + w1[0] = 0x80; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + w3[0] = 0; + w3[1] = 0; + w3[2] = (64 + 16) * 8; + w3[3] = 0; + + digest[0] = opad[0]; + digest[1] = opad[1]; + digest[2] = opad[2]; + digest[3] = opad[3]; + + md5_transform (w0, w1, w2, w3, digest); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m11900_init (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global pbkdf2_md5_tmp_t *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global pbkdf2_md5_t *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = pws[gid].i[ 8]; + w2[1] = pws[gid].i[ 9]; + w2[2] = pws[gid].i[10]; + w2[3] = pws[gid].i[11]; + + u32x w3[4]; + + w3[0] = pws[gid].i[12]; + w3[1] = pws[gid].i[13]; + w3[2] = pws[gid].i[14]; + w3[3] = pws[gid].i[15]; + + /** + * salt + */ + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + u32 esalt_buf0[4]; + u32 esalt_buf1[4]; + u32 esalt_buf2[4]; + u32 esalt_buf3[4]; + + esalt_buf0[0] = esalt_bufs[salt_pos].salt_buf[ 0]; + esalt_buf0[1] = esalt_bufs[salt_pos].salt_buf[ 1]; + esalt_buf0[2] = esalt_bufs[salt_pos].salt_buf[ 2]; + esalt_buf0[3] = esalt_bufs[salt_pos].salt_buf[ 3]; + esalt_buf1[0] = esalt_bufs[salt_pos].salt_buf[ 4]; + esalt_buf1[1] = esalt_bufs[salt_pos].salt_buf[ 5]; + esalt_buf1[2] = esalt_bufs[salt_pos].salt_buf[ 6]; + esalt_buf1[3] = esalt_bufs[salt_pos].salt_buf[ 7]; + esalt_buf2[0] = esalt_bufs[salt_pos].salt_buf[ 8]; + esalt_buf2[1] = esalt_bufs[salt_pos].salt_buf[ 9]; + esalt_buf2[2] = esalt_bufs[salt_pos].salt_buf[10]; + esalt_buf2[3] = esalt_bufs[salt_pos].salt_buf[11]; + esalt_buf3[0] = esalt_bufs[salt_pos].salt_buf[12]; + esalt_buf3[1] = esalt_bufs[salt_pos].salt_buf[13]; + esalt_buf3[2] = (64 + salt_len + 4) * 8; + esalt_buf3[3] = 0; + + u32 ipad[4]; + u32 opad[4]; + + hmac_md5_pad (w0, w1, w2, w3, ipad, opad); + + tmps[gid].ipad[0] = ipad[0]; + tmps[gid].ipad[1] = ipad[1]; + tmps[gid].ipad[2] = ipad[2]; + tmps[gid].ipad[3] = ipad[3]; + + tmps[gid].opad[0] = opad[0]; + tmps[gid].opad[1] = opad[1]; + tmps[gid].opad[2] = opad[2]; + tmps[gid].opad[3] = opad[3]; + + for (u32 i = 0, j = 1; i < 4; i += 4, j += 1) + { + u32 dgst[4]; + + hmac_md5_run (esalt_buf0, esalt_buf1, esalt_buf2, esalt_buf3, ipad, opad, dgst); + + tmps[gid].dgst[i + 0] = dgst[0]; + tmps[gid].dgst[i + 1] = dgst[1]; + tmps[gid].dgst[i + 2] = dgst[2]; + tmps[gid].dgst[i + 3] = dgst[3]; + + tmps[gid].out[i + 0] = dgst[0]; + tmps[gid].out[i + 1] = dgst[1]; + tmps[gid].out[i + 2] = dgst[2]; + tmps[gid].out[i + 3] = dgst[3]; + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m11900_loop (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global pbkdf2_md5_tmp_t *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global pbkdf2_md5_t *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32 ipad[4]; + + ipad[0] = tmps[gid].ipad[0]; + ipad[1] = tmps[gid].ipad[1]; + ipad[2] = tmps[gid].ipad[2]; + ipad[3] = tmps[gid].ipad[3]; + + u32 opad[4]; + + opad[0] = tmps[gid].opad[0]; + opad[1] = tmps[gid].opad[1]; + opad[2] = tmps[gid].opad[2]; + opad[3] = tmps[gid].opad[3]; + + for (u32 i = 0; i < 4; i += 4) + { + u32 dgst[4]; + + dgst[0] = tmps[gid].dgst[i + 0]; + dgst[1] = tmps[gid].dgst[i + 1]; + dgst[2] = tmps[gid].dgst[i + 2]; + dgst[3] = tmps[gid].dgst[i + 3]; + + u32 out[4]; + + out[0] = tmps[gid].out[i + 0]; + out[1] = tmps[gid].out[i + 1]; + out[2] = tmps[gid].out[i + 2]; + out[3] = tmps[gid].out[i + 3]; + + for (u32 j = 0; j < loop_cnt; j++) + { + u32 w0[4]; + u32 w1[4]; + u32 w2[4]; + u32 w3[4]; + + w0[0] = dgst[0]; + w0[1] = dgst[1]; + w0[2] = dgst[2]; + w0[3] = dgst[3]; + w1[0] = 0x80; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + w3[0] = 0; + w3[1] = 0; + w3[2] = (64 + 16) * 8; + w3[3] = 0; + + hmac_md5_run (w0, w1, w2, w3, ipad, opad, dgst); + + out[0] ^= dgst[0]; + out[1] ^= dgst[1]; + out[2] ^= dgst[2]; + out[3] ^= dgst[3]; + } + + tmps[gid].dgst[i + 0] = dgst[0]; + tmps[gid].dgst[i + 1] = dgst[1]; + tmps[gid].dgst[i + 2] = dgst[2]; + tmps[gid].dgst[i + 3] = dgst[3]; + + tmps[gid].out[i + 0] = out[0]; + tmps[gid].out[i + 1] = out[1]; + tmps[gid].out[i + 2] = out[2]; + tmps[gid].out[i + 3] = out[3]; + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m11900_comp (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global pbkdf2_md5_tmp_t *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global pbkdf2_md5_t *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + const u32 lid = get_local_id (0); + + const u32x r0 = tmps[gid].out[DGST_R0]; + const u32x r1 = tmps[gid].out[DGST_R1]; + const u32x r2 = tmps[gid].out[DGST_R2]; + const u32x r3 = tmps[gid].out[DGST_R3]; + + #define il_pos 0 + + #include VECT_COMPARE_M +} diff --git a/amd/m12000.cl b/amd/m12000.cl new file mode 100644 index 0000000000..2eddbd18f7 --- /dev/null +++ b/amd/m12000.cl @@ -0,0 +1,464 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _PBKDF2_SHA1_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW4 +#define VECT_SIZE1 +#endif + +#ifdef VLIW5 +#define VECT_SIZE1 +#endif + +#define DGST_R0 0 +#define DGST_R1 1 +#define DGST_R2 2 +#define DGST_R3 3 + +#include "include/kernel_functions.c" + +#include "types_amd.c" +#include "common_amd.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +static void sha1_transform (const u32x w0[4], const u32x w1[4], const u32x w2[4], const u32x w3[4], u32x digest[5]) +{ + u32x A = digest[0]; + u32x B = digest[1]; + u32x C = digest[2]; + u32x D = digest[3]; + u32x E = digest[4]; + + u32x w0_t = w0[0]; + u32x w1_t = w0[1]; + u32x w2_t = w0[2]; + u32x w3_t = w0[3]; + u32x w4_t = w1[0]; + u32x w5_t = w1[1]; + u32x w6_t = w1[2]; + u32x w7_t = w1[3]; + u32x w8_t = w2[0]; + u32x w9_t = w2[1]; + u32x wa_t = w2[2]; + u32x wb_t = w2[3]; + u32x wc_t = w3[0]; + u32x wd_t = w3[1]; + u32x we_t = w3[2]; + u32x wf_t = w3[3]; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, A, B, C, D, E, w0_t); + SHA1_STEP (SHA1_F0o, E, A, B, C, D, w1_t); + SHA1_STEP (SHA1_F0o, D, E, A, B, C, w2_t); + SHA1_STEP (SHA1_F0o, C, D, E, A, B, w3_t); + SHA1_STEP (SHA1_F0o, B, C, D, E, A, w4_t); + SHA1_STEP (SHA1_F0o, A, B, C, D, E, w5_t); + SHA1_STEP (SHA1_F0o, E, A, B, C, D, w6_t); + SHA1_STEP (SHA1_F0o, D, E, A, B, C, w7_t); + SHA1_STEP (SHA1_F0o, C, D, E, A, B, w8_t); + SHA1_STEP (SHA1_F0o, B, C, D, E, A, w9_t); + SHA1_STEP (SHA1_F0o, A, B, C, D, E, wa_t); + SHA1_STEP (SHA1_F0o, E, A, B, C, D, wb_t); + SHA1_STEP (SHA1_F0o, D, E, A, B, C, wc_t); + SHA1_STEP (SHA1_F0o, C, D, E, A, B, wd_t); + SHA1_STEP (SHA1_F0o, B, C, D, E, A, we_t); + SHA1_STEP (SHA1_F0o, A, B, C, D, E, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F0o, E, A, B, C, D, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F0o, D, E, A, B, C, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F0o, C, D, E, A, B, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F0o, B, C, D, E, A, w3_t); + + #undef K + #define K SHA1C01 + + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w7_t); + + #undef K + #define K SHA1C02 + + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, wb_t); + + #undef K + #define K SHA1C03 + + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, wf_t); + + digest[0] += A; + digest[1] += B; + digest[2] += C; + digest[3] += D; + digest[4] += E; +} + +static void hmac_sha1_pad (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], u32x ipad[5], u32x opad[5]) +{ + w0[0] = w0[0] ^ 0x36363636; + w0[1] = w0[1] ^ 0x36363636; + w0[2] = w0[2] ^ 0x36363636; + w0[3] = w0[3] ^ 0x36363636; + w1[0] = w1[0] ^ 0x36363636; + w1[1] = w1[1] ^ 0x36363636; + w1[2] = w1[2] ^ 0x36363636; + w1[3] = w1[3] ^ 0x36363636; + w2[0] = w2[0] ^ 0x36363636; + w2[1] = w2[1] ^ 0x36363636; + w2[2] = w2[2] ^ 0x36363636; + w2[3] = w2[3] ^ 0x36363636; + w3[0] = w3[0] ^ 0x36363636; + w3[1] = w3[1] ^ 0x36363636; + w3[2] = w3[2] ^ 0x36363636; + w3[3] = w3[3] ^ 0x36363636; + + ipad[0] = SHA1M_A; + ipad[1] = SHA1M_B; + ipad[2] = SHA1M_C; + ipad[3] = SHA1M_D; + ipad[4] = SHA1M_E; + + sha1_transform (w0, w1, w2, w3, ipad); + + w0[0] = w0[0] ^ 0x6a6a6a6a; + w0[1] = w0[1] ^ 0x6a6a6a6a; + w0[2] = w0[2] ^ 0x6a6a6a6a; + w0[3] = w0[3] ^ 0x6a6a6a6a; + w1[0] = w1[0] ^ 0x6a6a6a6a; + w1[1] = w1[1] ^ 0x6a6a6a6a; + w1[2] = w1[2] ^ 0x6a6a6a6a; + w1[3] = w1[3] ^ 0x6a6a6a6a; + w2[0] = w2[0] ^ 0x6a6a6a6a; + w2[1] = w2[1] ^ 0x6a6a6a6a; + w2[2] = w2[2] ^ 0x6a6a6a6a; + w2[3] = w2[3] ^ 0x6a6a6a6a; + w3[0] = w3[0] ^ 0x6a6a6a6a; + w3[1] = w3[1] ^ 0x6a6a6a6a; + w3[2] = w3[2] ^ 0x6a6a6a6a; + w3[3] = w3[3] ^ 0x6a6a6a6a; + + opad[0] = SHA1M_A; + opad[1] = SHA1M_B; + opad[2] = SHA1M_C; + opad[3] = SHA1M_D; + opad[4] = SHA1M_E; + + sha1_transform (w0, w1, w2, w3, opad); +} + +static void hmac_sha1_run (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], u32x ipad[5], u32x opad[5], u32x digest[5]) +{ + digest[0] = ipad[0]; + digest[1] = ipad[1]; + digest[2] = ipad[2]; + digest[3] = ipad[3]; + digest[4] = ipad[4]; + + sha1_transform (w0, w1, w2, w3, digest); + + w0[0] = digest[0]; + w0[1] = digest[1]; + w0[2] = digest[2]; + w0[3] = digest[3]; + w1[0] = digest[4]; + w1[1] = 0x80000000; + w1[2] = 0; + w1[3] = 0; + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = (64 + 20) * 8; + + digest[0] = opad[0]; + digest[1] = opad[1]; + digest[2] = opad[2]; + digest[3] = opad[3]; + digest[4] = opad[4]; + + sha1_transform (w0, w1, w2, w3, digest); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m12000_init (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global pbkdf2_sha1_tmp_t *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global pbkdf2_sha1_t *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = swap_workaround (pws[gid].i[ 0]); + w0[1] = swap_workaround (pws[gid].i[ 1]); + w0[2] = swap_workaround (pws[gid].i[ 2]); + w0[3] = swap_workaround (pws[gid].i[ 3]); + + u32x w1[4]; + + w1[0] = swap_workaround (pws[gid].i[ 4]); + w1[1] = swap_workaround (pws[gid].i[ 5]); + w1[2] = swap_workaround (pws[gid].i[ 6]); + w1[3] = swap_workaround (pws[gid].i[ 7]); + + u32x w2[4]; + + w2[0] = swap_workaround (pws[gid].i[ 8]); + w2[1] = swap_workaround (pws[gid].i[ 9]); + w2[2] = swap_workaround (pws[gid].i[10]); + w2[3] = swap_workaround (pws[gid].i[11]); + + u32x w3[4]; + + w3[0] = swap_workaround (pws[gid].i[12]); + w3[1] = swap_workaround (pws[gid].i[13]); + w3[2] = swap_workaround (pws[gid].i[14]); + w3[3] = swap_workaround (pws[gid].i[15]); + + /** + * salt + */ + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + u32 esalt_buf0[4]; + u32 esalt_buf1[4]; + u32 esalt_buf2[4]; + u32 esalt_buf3[4]; + + esalt_buf0[0] = swap_workaround (esalt_bufs[salt_pos].salt_buf[ 0]); + esalt_buf0[1] = swap_workaround (esalt_bufs[salt_pos].salt_buf[ 1]); + esalt_buf0[2] = swap_workaround (esalt_bufs[salt_pos].salt_buf[ 2]); + esalt_buf0[3] = swap_workaround (esalt_bufs[salt_pos].salt_buf[ 3]); + esalt_buf1[0] = swap_workaround (esalt_bufs[salt_pos].salt_buf[ 4]); + esalt_buf1[1] = swap_workaround (esalt_bufs[salt_pos].salt_buf[ 5]); + esalt_buf1[2] = swap_workaround (esalt_bufs[salt_pos].salt_buf[ 6]); + esalt_buf1[3] = swap_workaround (esalt_bufs[salt_pos].salt_buf[ 7]); + esalt_buf2[0] = swap_workaround (esalt_bufs[salt_pos].salt_buf[ 8]); + esalt_buf2[1] = swap_workaround (esalt_bufs[salt_pos].salt_buf[ 9]); + esalt_buf2[2] = swap_workaround (esalt_bufs[salt_pos].salt_buf[10]); + esalt_buf2[3] = swap_workaround (esalt_bufs[salt_pos].salt_buf[11]); + esalt_buf3[0] = swap_workaround (esalt_bufs[salt_pos].salt_buf[12]); + esalt_buf3[1] = swap_workaround (esalt_bufs[salt_pos].salt_buf[13]); + esalt_buf3[2] = 0; + esalt_buf3[3] = (64 + salt_len + 4) * 8; + + u32 ipad[5]; + u32 opad[5]; + + hmac_sha1_pad (w0, w1, w2, w3, ipad, opad); + + tmps[gid].ipad[0] = ipad[0]; + tmps[gid].ipad[1] = ipad[1]; + tmps[gid].ipad[2] = ipad[2]; + tmps[gid].ipad[3] = ipad[3]; + tmps[gid].ipad[4] = ipad[4]; + + tmps[gid].opad[0] = opad[0]; + tmps[gid].opad[1] = opad[1]; + tmps[gid].opad[2] = opad[2]; + tmps[gid].opad[3] = opad[3]; + tmps[gid].opad[4] = opad[4]; + + for (u32 i = 0, j = 1; i < 5; i += 5, j += 1) + { + u32 dgst[5]; + + hmac_sha1_run (esalt_buf0, esalt_buf1, esalt_buf2, esalt_buf3, ipad, opad, dgst); + + tmps[gid].dgst[i + 0] = dgst[0]; + tmps[gid].dgst[i + 1] = dgst[1]; + tmps[gid].dgst[i + 2] = dgst[2]; + tmps[gid].dgst[i + 3] = dgst[3]; + tmps[gid].dgst[i + 4] = dgst[4]; + + tmps[gid].out[i + 0] = dgst[0]; + tmps[gid].out[i + 1] = dgst[1]; + tmps[gid].out[i + 2] = dgst[2]; + tmps[gid].out[i + 3] = dgst[3]; + tmps[gid].out[i + 4] = dgst[4]; + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m12000_loop (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global pbkdf2_sha1_tmp_t *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global pbkdf2_sha1_t *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32 ipad[5]; + + ipad[0] = tmps[gid].ipad[0]; + ipad[1] = tmps[gid].ipad[1]; + ipad[2] = tmps[gid].ipad[2]; + ipad[3] = tmps[gid].ipad[3]; + ipad[4] = tmps[gid].ipad[4]; + + u32 opad[5]; + + opad[0] = tmps[gid].opad[0]; + opad[1] = tmps[gid].opad[1]; + opad[2] = tmps[gid].opad[2]; + opad[3] = tmps[gid].opad[3]; + opad[4] = tmps[gid].opad[4]; + + for (u32 i = 0; i < 5; i += 5) + { + u32 dgst[5]; + + dgst[0] = tmps[gid].dgst[i + 0]; + dgst[1] = tmps[gid].dgst[i + 1]; + dgst[2] = tmps[gid].dgst[i + 2]; + dgst[3] = tmps[gid].dgst[i + 3]; + dgst[4] = tmps[gid].dgst[i + 4]; + + u32 out[5]; + + out[0] = tmps[gid].out[i + 0]; + out[1] = tmps[gid].out[i + 1]; + out[2] = tmps[gid].out[i + 2]; + out[3] = tmps[gid].out[i + 3]; + out[4] = tmps[gid].out[i + 4]; + + for (u32 j = 0; j < loop_cnt; j++) + { + u32 w0[4]; + u32 w1[4]; + u32 w2[4]; + u32 w3[4]; + + w0[0] = dgst[0]; + w0[1] = dgst[1]; + w0[2] = dgst[2]; + w0[3] = dgst[3]; + w1[0] = dgst[4]; + w1[1] = 0x80000000; + w1[2] = 0; + w1[3] = 0; + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = (64 + 20) * 8; + + hmac_sha1_run (w0, w1, w2, w3, ipad, opad, dgst); + + out[0] ^= dgst[0]; + out[1] ^= dgst[1]; + out[2] ^= dgst[2]; + out[3] ^= dgst[3]; + out[4] ^= dgst[4]; + } + + tmps[gid].dgst[i + 0] = dgst[0]; + tmps[gid].dgst[i + 1] = dgst[1]; + tmps[gid].dgst[i + 2] = dgst[2]; + tmps[gid].dgst[i + 3] = dgst[3]; + tmps[gid].dgst[i + 4] = dgst[4]; + + tmps[gid].out[i + 0] = out[0]; + tmps[gid].out[i + 1] = out[1]; + tmps[gid].out[i + 2] = out[2]; + tmps[gid].out[i + 3] = out[3]; + tmps[gid].out[i + 4] = out[4]; + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m12000_comp (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global pbkdf2_sha1_tmp_t *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global pbkdf2_sha1_t *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + const u32 lid = get_local_id (0); + + const u32x r0 = tmps[gid].out[DGST_R0]; + const u32x r1 = tmps[gid].out[DGST_R1]; + const u32x r2 = tmps[gid].out[DGST_R2]; + const u32x r3 = tmps[gid].out[DGST_R3]; + + #define il_pos 0 + + #include VECT_COMPARE_M +} diff --git a/amd/m12200.cl b/amd/m12200.cl new file mode 100644 index 0000000000..b7ae9d25f8 --- /dev/null +++ b/amd/m12200.cl @@ -0,0 +1,340 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _SHA512_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW4 +#define VECT_SIZE1 +#endif + +#ifdef VLIW5 +#define VECT_SIZE1 +#endif + +#define DGST_R0 0 +#define DGST_R1 1 +#define DGST_R2 2 +#define DGST_R3 3 + +#include "include/kernel_functions.c" +#include "types_amd.c" +#include "common_amd.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +__constant u64 k_sha512[80] = +{ + SHA512C00, SHA512C01, SHA512C02, SHA512C03, + SHA512C04, SHA512C05, SHA512C06, SHA512C07, + SHA512C08, SHA512C09, SHA512C0a, SHA512C0b, + SHA512C0c, SHA512C0d, SHA512C0e, SHA512C0f, + SHA512C10, SHA512C11, SHA512C12, SHA512C13, + SHA512C14, SHA512C15, SHA512C16, SHA512C17, + SHA512C18, SHA512C19, SHA512C1a, SHA512C1b, + SHA512C1c, SHA512C1d, SHA512C1e, SHA512C1f, + SHA512C20, SHA512C21, SHA512C22, SHA512C23, + SHA512C24, SHA512C25, SHA512C26, SHA512C27, + SHA512C28, SHA512C29, SHA512C2a, SHA512C2b, + SHA512C2c, SHA512C2d, SHA512C2e, SHA512C2f, + SHA512C30, SHA512C31, SHA512C32, SHA512C33, + SHA512C34, SHA512C35, SHA512C36, SHA512C37, + SHA512C38, SHA512C39, SHA512C3a, SHA512C3b, + SHA512C3c, SHA512C3d, SHA512C3e, SHA512C3f, + SHA512C40, SHA512C41, SHA512C42, SHA512C43, + SHA512C44, SHA512C45, SHA512C46, SHA512C47, + SHA512C48, SHA512C49, SHA512C4a, SHA512C4b, + SHA512C4c, SHA512C4d, SHA512C4e, SHA512C4f, +}; + +static void sha512_transform (const u64 w[16], u64 dgst[8]) +{ + u64 a = dgst[0]; + u64 b = dgst[1]; + u64 c = dgst[2]; + u64 d = dgst[3]; + u64 e = dgst[4]; + u64 f = dgst[5]; + u64 g = dgst[6]; + u64 h = dgst[7]; + + u64 w0_t = w[ 0]; + u64 w1_t = w[ 1]; + u64 w2_t = w[ 2]; + u64 w3_t = w[ 3]; + u64 w4_t = w[ 4]; + u64 w5_t = w[ 5]; + u64 w6_t = w[ 6]; + u64 w7_t = w[ 7]; + u64 w8_t = w[ 8]; + u64 w9_t = w[ 9]; + u64 wa_t = w[10]; + u64 wb_t = w[11]; + u64 wc_t = w[12]; + u64 wd_t = w[13]; + u64 we_t = w[14]; + u64 wf_t = w[15]; + + #define ROUND_EXPAND() \ + { \ + w0_t = SHA512_EXPAND (we_t, w9_t, w1_t, w0_t); \ + w1_t = SHA512_EXPAND (wf_t, wa_t, w2_t, w1_t); \ + w2_t = SHA512_EXPAND (w0_t, wb_t, w3_t, w2_t); \ + w3_t = SHA512_EXPAND (w1_t, wc_t, w4_t, w3_t); \ + w4_t = SHA512_EXPAND (w2_t, wd_t, w5_t, w4_t); \ + w5_t = SHA512_EXPAND (w3_t, we_t, w6_t, w5_t); \ + w6_t = SHA512_EXPAND (w4_t, wf_t, w7_t, w6_t); \ + w7_t = SHA512_EXPAND (w5_t, w0_t, w8_t, w7_t); \ + w8_t = SHA512_EXPAND (w6_t, w1_t, w9_t, w8_t); \ + w9_t = SHA512_EXPAND (w7_t, w2_t, wa_t, w9_t); \ + wa_t = SHA512_EXPAND (w8_t, w3_t, wb_t, wa_t); \ + wb_t = SHA512_EXPAND (w9_t, w4_t, wc_t, wb_t); \ + wc_t = SHA512_EXPAND (wa_t, w5_t, wd_t, wc_t); \ + wd_t = SHA512_EXPAND (wb_t, w6_t, we_t, wd_t); \ + we_t = SHA512_EXPAND (wc_t, w7_t, wf_t, we_t); \ + wf_t = SHA512_EXPAND (wd_t, w8_t, w0_t, wf_t); \ + } + + #define ROUND_STEP(i) \ + { \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, a, b, c, d, e, f, g, h, w0_t, k_sha512[i + 0]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, h, a, b, c, d, e, f, g, w1_t, k_sha512[i + 1]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, g, h, a, b, c, d, e, f, w2_t, k_sha512[i + 2]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, f, g, h, a, b, c, d, e, w3_t, k_sha512[i + 3]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, e, f, g, h, a, b, c, d, w4_t, k_sha512[i + 4]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, d, e, f, g, h, a, b, c, w5_t, k_sha512[i + 5]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, c, d, e, f, g, h, a, b, w6_t, k_sha512[i + 6]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, b, c, d, e, f, g, h, a, w7_t, k_sha512[i + 7]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, a, b, c, d, e, f, g, h, w8_t, k_sha512[i + 8]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, h, a, b, c, d, e, f, g, w9_t, k_sha512[i + 9]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, g, h, a, b, c, d, e, f, wa_t, k_sha512[i + 10]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, f, g, h, a, b, c, d, e, wb_t, k_sha512[i + 11]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, e, f, g, h, a, b, c, d, wc_t, k_sha512[i + 12]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, d, e, f, g, h, a, b, c, wd_t, k_sha512[i + 13]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, c, d, e, f, g, h, a, b, we_t, k_sha512[i + 14]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, b, c, d, e, f, g, h, a, wf_t, k_sha512[i + 15]); \ + } + + ROUND_STEP (0); + + //#pragma unroll // kernel fails if used + for (int i = 16; i < 80; i += 16) + { + ROUND_EXPAND (); ROUND_STEP (i); + } + + dgst[0] += a; + dgst[1] += b; + dgst[2] += c; + dgst[3] += d; + dgst[4] += e; + dgst[5] += f; + dgst[6] += g; + dgst[7] += h; +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m12200_init (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global ecryptfs_tmp_t *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = pws[gid].i[ 8]; + w2[1] = pws[gid].i[ 9]; + w2[2] = pws[gid].i[10]; + w2[3] = pws[gid].i[11]; + + u32x w3[4]; + + w3[0] = pws[gid].i[12]; + w3[1] = pws[gid].i[13]; + w3[2] = pws[gid].i[14]; + w3[3] = pws[gid].i[15]; + + u32 pw_len = pws[gid].pw_len; + + append_0x80_4 (w0, w1, w2, w3, pw_len); + + w0[0] = swap_workaround (w0[0]); + w0[1] = swap_workaround (w0[1]); + w0[2] = swap_workaround (w0[2]); + w0[3] = swap_workaround (w0[3]); + w1[0] = swap_workaround (w1[0]); + w1[1] = swap_workaround (w1[1]); + w1[2] = swap_workaround (w1[2]); + w1[3] = swap_workaround (w1[3]); + w2[0] = swap_workaround (w2[0]); + w2[1] = swap_workaround (w2[1]); + w2[2] = swap_workaround (w2[2]); + w2[3] = swap_workaround (w2[3]); + w3[0] = swap_workaround (w3[0]); + w3[1] = swap_workaround (w3[1]); + w3[2] = swap_workaround (w3[2]); + w3[3] = swap_workaround (w3[3]); + + /** + * salt + */ + + u32 s0[2]; + + s0[0] = salt_bufs[salt_pos].salt_buf[0]; + s0[1] = salt_bufs[salt_pos].salt_buf[1]; + + u32 salt_len = salt_bufs[salt_pos].salt_len; + + u64 w[16]; + + w[ 0] = hl32_to_64 (s0[0], s0[1]); + w[ 1] = hl32_to_64 (w0[0], w0[1]); + w[ 2] = hl32_to_64 (w0[2], w0[3]); + w[ 3] = hl32_to_64 (w1[0], w1[1]); + w[ 4] = hl32_to_64 (w1[2], w1[3]); + w[ 5] = hl32_to_64 (w2[0], w2[1]); + w[ 6] = hl32_to_64 (w2[2], w2[3]); + w[ 7] = hl32_to_64 (w3[0], w3[1]); + w[ 8] = hl32_to_64 (w3[2], w3[3]); + w[ 9] = 0; + w[10] = 0; + w[11] = 0; + w[12] = 0; + w[13] = 0; + w[14] = 0; + w[15] = (salt_len + pw_len) * 8; + + u64 dgst[8]; + + dgst[0] = SHA512M_A; + dgst[1] = SHA512M_B; + dgst[2] = SHA512M_C; + dgst[3] = SHA512M_D; + dgst[4] = SHA512M_E; + dgst[5] = SHA512M_F; + dgst[6] = SHA512M_G; + dgst[7] = SHA512M_H; + + sha512_transform (w, dgst); + + tmps[gid].out[0] = dgst[0]; + tmps[gid].out[1] = dgst[1]; + tmps[gid].out[2] = dgst[2]; + tmps[gid].out[3] = dgst[3]; + tmps[gid].out[4] = dgst[4]; + tmps[gid].out[5] = dgst[5]; + tmps[gid].out[6] = dgst[6]; + tmps[gid].out[7] = dgst[7]; +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m12200_loop (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global ecryptfs_tmp_t *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u64 dgst[8]; + + dgst[0] = tmps[gid].out[0]; + dgst[1] = tmps[gid].out[1]; + dgst[2] = tmps[gid].out[2]; + dgst[3] = tmps[gid].out[3]; + dgst[4] = tmps[gid].out[4]; + dgst[5] = tmps[gid].out[5]; + dgst[6] = tmps[gid].out[6]; + dgst[7] = tmps[gid].out[7]; + + for (u32 i = 0; i < loop_cnt; i++) + { + u64 w[16]; + + w[ 0] = dgst[0]; + w[ 1] = dgst[1]; + w[ 2] = dgst[2]; + w[ 3] = dgst[3]; + w[ 4] = dgst[4]; + w[ 5] = dgst[5]; + w[ 6] = dgst[6]; + w[ 7] = dgst[7]; + w[ 8] = 0x8000000000000000; + w[ 9] = 0; + w[10] = 0; + w[11] = 0; + w[12] = 0; + w[13] = 0; + w[14] = 0; + w[15] = 64 * 8; + + dgst[0] = SHA512M_A; + dgst[1] = SHA512M_B; + dgst[2] = SHA512M_C; + dgst[3] = SHA512M_D; + dgst[4] = SHA512M_E; + dgst[5] = SHA512M_F; + dgst[6] = SHA512M_G; + dgst[7] = SHA512M_H; + + sha512_transform (w, dgst); + } + + tmps[gid].out[0] = dgst[0]; + tmps[gid].out[1] = dgst[1]; + tmps[gid].out[2] = dgst[2]; + tmps[gid].out[3] = dgst[3]; + tmps[gid].out[4] = dgst[4]; + tmps[gid].out[5] = dgst[5]; + tmps[gid].out[6] = dgst[6]; + tmps[gid].out[7] = dgst[7]; +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m12200_comp (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global ecryptfs_tmp_t *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + const u32 lid = get_local_id (0); + + const u64x a = tmps[gid].out[0]; + + const u32x r0 = h32_from_64 (a); + const u32x r1 = l32_from_64 (a); + const u32x r2 = 0; + const u32x r3 = 0; + + #define il_pos 0 + + #include VECT_COMPARE_M +} diff --git a/amd/m12300.cl b/amd/m12300.cl new file mode 100644 index 0000000000..65a817761d --- /dev/null +++ b/amd/m12300.cl @@ -0,0 +1,535 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _PBKDF2_SHA512_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW4 +#define VECT_SIZE1 +#endif + +#ifdef VLIW5 +#define VECT_SIZE1 +#endif + +#define DGST_R0 0 +#define DGST_R1 1 +#define DGST_R2 2 +#define DGST_R3 3 + +#include "include/kernel_functions.c" +#include "types_amd.c" +#include "common_amd.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +__constant u64 k_sha512[80] = +{ + SHA512C00, SHA512C01, SHA512C02, SHA512C03, + SHA512C04, SHA512C05, SHA512C06, SHA512C07, + SHA512C08, SHA512C09, SHA512C0a, SHA512C0b, + SHA512C0c, SHA512C0d, SHA512C0e, SHA512C0f, + SHA512C10, SHA512C11, SHA512C12, SHA512C13, + SHA512C14, SHA512C15, SHA512C16, SHA512C17, + SHA512C18, SHA512C19, SHA512C1a, SHA512C1b, + SHA512C1c, SHA512C1d, SHA512C1e, SHA512C1f, + SHA512C20, SHA512C21, SHA512C22, SHA512C23, + SHA512C24, SHA512C25, SHA512C26, SHA512C27, + SHA512C28, SHA512C29, SHA512C2a, SHA512C2b, + SHA512C2c, SHA512C2d, SHA512C2e, SHA512C2f, + SHA512C30, SHA512C31, SHA512C32, SHA512C33, + SHA512C34, SHA512C35, SHA512C36, SHA512C37, + SHA512C38, SHA512C39, SHA512C3a, SHA512C3b, + SHA512C3c, SHA512C3d, SHA512C3e, SHA512C3f, + SHA512C40, SHA512C41, SHA512C42, SHA512C43, + SHA512C44, SHA512C45, SHA512C46, SHA512C47, + SHA512C48, SHA512C49, SHA512C4a, SHA512C4b, + SHA512C4c, SHA512C4d, SHA512C4e, SHA512C4f, +}; + +static void sha512_transform (const u64 w[16], u64 dgst[8]) +{ + u64 a = dgst[0]; + u64 b = dgst[1]; + u64 c = dgst[2]; + u64 d = dgst[3]; + u64 e = dgst[4]; + u64 f = dgst[5]; + u64 g = dgst[6]; + u64 h = dgst[7]; + + u64 w0_t = w[ 0]; + u64 w1_t = w[ 1]; + u64 w2_t = w[ 2]; + u64 w3_t = w[ 3]; + u64 w4_t = w[ 4]; + u64 w5_t = w[ 5]; + u64 w6_t = w[ 6]; + u64 w7_t = w[ 7]; + u64 w8_t = w[ 8]; + u64 w9_t = w[ 9]; + u64 wa_t = w[10]; + u64 wb_t = w[11]; + u64 wc_t = w[12]; + u64 wd_t = w[13]; + u64 we_t = w[14]; + u64 wf_t = w[15]; + + #define ROUND_EXPAND() \ + { \ + w0_t = SHA512_EXPAND (we_t, w9_t, w1_t, w0_t); \ + w1_t = SHA512_EXPAND (wf_t, wa_t, w2_t, w1_t); \ + w2_t = SHA512_EXPAND (w0_t, wb_t, w3_t, w2_t); \ + w3_t = SHA512_EXPAND (w1_t, wc_t, w4_t, w3_t); \ + w4_t = SHA512_EXPAND (w2_t, wd_t, w5_t, w4_t); \ + w5_t = SHA512_EXPAND (w3_t, we_t, w6_t, w5_t); \ + w6_t = SHA512_EXPAND (w4_t, wf_t, w7_t, w6_t); \ + w7_t = SHA512_EXPAND (w5_t, w0_t, w8_t, w7_t); \ + w8_t = SHA512_EXPAND (w6_t, w1_t, w9_t, w8_t); \ + w9_t = SHA512_EXPAND (w7_t, w2_t, wa_t, w9_t); \ + wa_t = SHA512_EXPAND (w8_t, w3_t, wb_t, wa_t); \ + wb_t = SHA512_EXPAND (w9_t, w4_t, wc_t, wb_t); \ + wc_t = SHA512_EXPAND (wa_t, w5_t, wd_t, wc_t); \ + wd_t = SHA512_EXPAND (wb_t, w6_t, we_t, wd_t); \ + we_t = SHA512_EXPAND (wc_t, w7_t, wf_t, we_t); \ + wf_t = SHA512_EXPAND (wd_t, w8_t, w0_t, wf_t); \ + } + + #define ROUND_STEP(i) \ + { \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, a, b, c, d, e, f, g, h, w0_t, k_sha512[i + 0]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, h, a, b, c, d, e, f, g, w1_t, k_sha512[i + 1]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, g, h, a, b, c, d, e, f, w2_t, k_sha512[i + 2]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, f, g, h, a, b, c, d, e, w3_t, k_sha512[i + 3]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, e, f, g, h, a, b, c, d, w4_t, k_sha512[i + 4]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, d, e, f, g, h, a, b, c, w5_t, k_sha512[i + 5]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, c, d, e, f, g, h, a, b, w6_t, k_sha512[i + 6]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, b, c, d, e, f, g, h, a, w7_t, k_sha512[i + 7]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, a, b, c, d, e, f, g, h, w8_t, k_sha512[i + 8]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, h, a, b, c, d, e, f, g, w9_t, k_sha512[i + 9]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, g, h, a, b, c, d, e, f, wa_t, k_sha512[i + 10]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, f, g, h, a, b, c, d, e, wb_t, k_sha512[i + 11]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, e, f, g, h, a, b, c, d, wc_t, k_sha512[i + 12]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, d, e, f, g, h, a, b, c, wd_t, k_sha512[i + 13]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, c, d, e, f, g, h, a, b, we_t, k_sha512[i + 14]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, b, c, d, e, f, g, h, a, wf_t, k_sha512[i + 15]); \ + } + + ROUND_STEP (0); + + //#pragma unroll // kernel fails if used + for (int i = 16; i < 80; i += 16) + { + ROUND_EXPAND (); ROUND_STEP (i); + } + + dgst[0] += a; + dgst[1] += b; + dgst[2] += c; + dgst[3] += d; + dgst[4] += e; + dgst[5] += f; + dgst[6] += g; + dgst[7] += h; +} + +static void hmac_run (const u64 w1[16], const u64 ipad[8], const u64 opad[8], u64 dgst[8]) +{ + dgst[0] = ipad[0]; + dgst[1] = ipad[1]; + dgst[2] = ipad[2]; + dgst[3] = ipad[3]; + dgst[4] = ipad[4]; + dgst[5] = ipad[5]; + dgst[6] = ipad[6]; + dgst[7] = ipad[7]; + + sha512_transform (w1, dgst); + + u64 w[16]; + + w[ 0] = dgst[0]; + w[ 1] = dgst[1]; + w[ 2] = dgst[2]; + w[ 3] = dgst[3]; + w[ 4] = dgst[4]; + w[ 5] = dgst[5]; + w[ 6] = dgst[6]; + w[ 7] = dgst[7]; + w[ 8] = 0x8000000000000000; + w[ 9] = 0; + w[10] = 0; + w[11] = 0; + w[12] = 0; + w[13] = 0; + w[14] = 0; + w[15] = (128 + 64) * 8; + + dgst[0] = opad[0]; + dgst[1] = opad[1]; + dgst[2] = opad[2]; + dgst[3] = opad[3]; + dgst[4] = opad[4]; + dgst[5] = opad[5]; + dgst[6] = opad[6]; + dgst[7] = opad[7]; + + sha512_transform (w, dgst); +} + +static void hmac_init (u64 w[16], u64 ipad[8], u64 opad[8]) +{ + w[ 0] ^= 0x3636363636363636; + w[ 1] ^= 0x3636363636363636; + w[ 2] ^= 0x3636363636363636; + w[ 3] ^= 0x3636363636363636; + w[ 4] ^= 0x3636363636363636; + w[ 5] ^= 0x3636363636363636; + w[ 6] ^= 0x3636363636363636; + w[ 7] ^= 0x3636363636363636; + w[ 8] ^= 0x3636363636363636; + w[ 9] ^= 0x3636363636363636; + w[10] ^= 0x3636363636363636; + w[11] ^= 0x3636363636363636; + w[12] ^= 0x3636363636363636; + w[13] ^= 0x3636363636363636; + w[14] ^= 0x3636363636363636; + w[15] ^= 0x3636363636363636; + + ipad[0] = SHA512M_A; + ipad[1] = SHA512M_B; + ipad[2] = SHA512M_C; + ipad[3] = SHA512M_D; + ipad[4] = SHA512M_E; + ipad[5] = SHA512M_F; + ipad[6] = SHA512M_G; + ipad[7] = SHA512M_H; + + sha512_transform (w, ipad); + + w[ 0] ^= 0x6a6a6a6a6a6a6a6a; + w[ 1] ^= 0x6a6a6a6a6a6a6a6a; + w[ 2] ^= 0x6a6a6a6a6a6a6a6a; + w[ 3] ^= 0x6a6a6a6a6a6a6a6a; + w[ 4] ^= 0x6a6a6a6a6a6a6a6a; + w[ 5] ^= 0x6a6a6a6a6a6a6a6a; + w[ 6] ^= 0x6a6a6a6a6a6a6a6a; + w[ 7] ^= 0x6a6a6a6a6a6a6a6a; + w[ 8] ^= 0x6a6a6a6a6a6a6a6a; + w[ 9] ^= 0x6a6a6a6a6a6a6a6a; + w[10] ^= 0x6a6a6a6a6a6a6a6a; + w[11] ^= 0x6a6a6a6a6a6a6a6a; + w[12] ^= 0x6a6a6a6a6a6a6a6a; + w[13] ^= 0x6a6a6a6a6a6a6a6a; + w[14] ^= 0x6a6a6a6a6a6a6a6a; + w[15] ^= 0x6a6a6a6a6a6a6a6a; + + opad[0] = SHA512M_A; + opad[1] = SHA512M_B; + opad[2] = SHA512M_C; + opad[3] = SHA512M_D; + opad[4] = SHA512M_E; + opad[5] = SHA512M_F; + opad[6] = SHA512M_G; + opad[7] = SHA512M_H; + + sha512_transform (w, opad); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m12300_init (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global oraclet_tmp_t *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = swap_workaround (pws[gid].i[ 0]); + w0[1] = swap_workaround (pws[gid].i[ 1]); + w0[2] = swap_workaround (pws[gid].i[ 2]); + w0[3] = swap_workaround (pws[gid].i[ 3]); + + u32x w1[4]; + + w1[0] = swap_workaround (pws[gid].i[ 4]); + w1[1] = swap_workaround (pws[gid].i[ 5]); + w1[2] = swap_workaround (pws[gid].i[ 6]); + w1[3] = swap_workaround (pws[gid].i[ 7]); + + u32x w2[4]; + + w2[0] = swap_workaround (pws[gid].i[ 8]); + w2[1] = swap_workaround (pws[gid].i[ 9]); + w2[2] = swap_workaround (pws[gid].i[10]); + w2[3] = swap_workaround (pws[gid].i[11]); + + u32x w3[4]; + + w3[0] = swap_workaround (pws[gid].i[12]); + w3[1] = swap_workaround (pws[gid].i[13]); + w3[2] = swap_workaround (pws[gid].i[14]); + w3[3] = swap_workaround (pws[gid].i[15]); + + /** + * salt + */ + + u64 data[16]; + + data[ 0] = hl32_to_64 (salt_bufs[salt_pos].salt_buf[0], salt_bufs[salt_pos].salt_buf[1]); + data[ 1] = hl32_to_64 (salt_bufs[salt_pos].salt_buf[2], salt_bufs[salt_pos].salt_buf[3]); + data[ 2] = 0x415554485f50424b; + data[ 3] = 0x4446325f53504545; + data[ 4] = 0x44595f4b45590000; + data[ 5] = 0x0001800000000000; + data[ 6] = 0; + data[ 7] = 0; + data[ 8] = 0; + data[ 9] = 0; + data[10] = 0; + data[11] = 0; + data[12] = 0; + data[13] = 0; + data[14] = 0; + data[15] = (128 + 16 + 22 + 4) * 8; + + u64 w[16]; + + w[ 0] = hl32_to_64 (w0[0], w0[1]); + w[ 1] = hl32_to_64 (w0[2], w0[3]); + w[ 2] = hl32_to_64 (w1[0], w1[1]); + w[ 3] = hl32_to_64 (w1[2], w1[3]); + w[ 4] = hl32_to_64 (w2[0], w2[1]); + w[ 5] = hl32_to_64 (w2[2], w2[3]); + w[ 6] = hl32_to_64 (w3[0], w3[1]); + w[ 7] = hl32_to_64 (w3[2], w3[3]); + w[ 8] = 0; + w[ 9] = 0; + w[10] = 0; + w[11] = 0; + w[12] = 0; + w[13] = 0; + w[14] = 0; + w[15] = 0; + + u64 ipad[8]; + u64 opad[8]; + + hmac_init (w, ipad, opad); + + tmps[gid].ipad[0] = ipad[0]; + tmps[gid].ipad[1] = ipad[1]; + tmps[gid].ipad[2] = ipad[2]; + tmps[gid].ipad[3] = ipad[3]; + tmps[gid].ipad[4] = ipad[4]; + tmps[gid].ipad[5] = ipad[5]; + tmps[gid].ipad[6] = ipad[6]; + tmps[gid].ipad[7] = ipad[7]; + + tmps[gid].opad[0] = opad[0]; + tmps[gid].opad[1] = opad[1]; + tmps[gid].opad[2] = opad[2]; + tmps[gid].opad[3] = opad[3]; + tmps[gid].opad[4] = opad[4]; + tmps[gid].opad[5] = opad[5]; + tmps[gid].opad[6] = opad[6]; + tmps[gid].opad[7] = opad[7]; + + for (u32 i = 0, j = 1; i < 8; i += 8, j += 1) + { + u64 dgst[8]; + + hmac_run (data, ipad, opad, dgst); + + tmps[gid].dgst[i + 0] = dgst[0]; + tmps[gid].dgst[i + 1] = dgst[1]; + tmps[gid].dgst[i + 2] = dgst[2]; + tmps[gid].dgst[i + 3] = dgst[3]; + tmps[gid].dgst[i + 4] = dgst[4]; + tmps[gid].dgst[i + 5] = dgst[5]; + tmps[gid].dgst[i + 6] = dgst[6]; + tmps[gid].dgst[i + 7] = dgst[7]; + + tmps[gid].out[i + 0] = dgst[0]; + tmps[gid].out[i + 1] = dgst[1]; + tmps[gid].out[i + 2] = dgst[2]; + tmps[gid].out[i + 3] = dgst[3]; + tmps[gid].out[i + 4] = dgst[4]; + tmps[gid].out[i + 5] = dgst[5]; + tmps[gid].out[i + 6] = dgst[6]; + tmps[gid].out[i + 7] = dgst[7]; + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m12300_loop (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global oraclet_tmp_t *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u64 ipad[8]; + + ipad[0] = tmps[gid].ipad[0]; + ipad[1] = tmps[gid].ipad[1]; + ipad[2] = tmps[gid].ipad[2]; + ipad[3] = tmps[gid].ipad[3]; + ipad[4] = tmps[gid].ipad[4]; + ipad[5] = tmps[gid].ipad[5]; + ipad[6] = tmps[gid].ipad[6]; + ipad[7] = tmps[gid].ipad[7]; + + u64 opad[8]; + + opad[0] = tmps[gid].opad[0]; + opad[1] = tmps[gid].opad[1]; + opad[2] = tmps[gid].opad[2]; + opad[3] = tmps[gid].opad[3]; + opad[4] = tmps[gid].opad[4]; + opad[5] = tmps[gid].opad[5]; + opad[6] = tmps[gid].opad[6]; + opad[7] = tmps[gid].opad[7]; + + for (u32 i = 0; i < 8; i += 8) + { + u64 dgst[8]; + + dgst[0] = tmps[gid].dgst[i + 0]; + dgst[1] = tmps[gid].dgst[i + 1]; + dgst[2] = tmps[gid].dgst[i + 2]; + dgst[3] = tmps[gid].dgst[i + 3]; + dgst[4] = tmps[gid].dgst[i + 4]; + dgst[5] = tmps[gid].dgst[i + 5]; + dgst[6] = tmps[gid].dgst[i + 6]; + dgst[7] = tmps[gid].dgst[i + 7]; + + u64 out[8]; + + out[0] = tmps[gid].out[i + 0]; + out[1] = tmps[gid].out[i + 1]; + out[2] = tmps[gid].out[i + 2]; + out[3] = tmps[gid].out[i + 3]; + out[4] = tmps[gid].out[i + 4]; + out[5] = tmps[gid].out[i + 5]; + out[6] = tmps[gid].out[i + 6]; + out[7] = tmps[gid].out[i + 7]; + + for (u32 j = 0; j < loop_cnt; j++) + { + u64 w[16]; + + w[ 0] = dgst[0]; + w[ 1] = dgst[1]; + w[ 2] = dgst[2]; + w[ 3] = dgst[3]; + w[ 4] = dgst[4]; + w[ 5] = dgst[5]; + w[ 6] = dgst[6]; + w[ 7] = dgst[7]; + w[ 8] = 0x8000000000000000; + w[ 9] = 0; + w[10] = 0; + w[11] = 0; + w[12] = 0; + w[13] = 0; + w[14] = 0; + w[15] = (128 + 64) * 8; + + hmac_run (w, ipad, opad, dgst); + + out[0] ^= dgst[0]; + out[1] ^= dgst[1]; + out[2] ^= dgst[2]; + out[3] ^= dgst[3]; + out[4] ^= dgst[4]; + out[5] ^= dgst[5]; + out[6] ^= dgst[6]; + out[7] ^= dgst[7]; + } + + tmps[gid].dgst[i + 0] = dgst[0]; + tmps[gid].dgst[i + 1] = dgst[1]; + tmps[gid].dgst[i + 2] = dgst[2]; + tmps[gid].dgst[i + 3] = dgst[3]; + tmps[gid].dgst[i + 4] = dgst[4]; + tmps[gid].dgst[i + 5] = dgst[5]; + tmps[gid].dgst[i + 6] = dgst[6]; + tmps[gid].dgst[i + 7] = dgst[7]; + + tmps[gid].out[i + 0] = out[0]; + tmps[gid].out[i + 1] = out[1]; + tmps[gid].out[i + 2] = out[2]; + tmps[gid].out[i + 3] = out[3]; + tmps[gid].out[i + 4] = out[4]; + tmps[gid].out[i + 5] = out[5]; + tmps[gid].out[i + 6] = out[6]; + tmps[gid].out[i + 7] = out[7]; + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m12300_comp (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global oraclet_tmp_t *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + const u32 lid = get_local_id (0); + + u64 w[16]; + + w[ 0] = tmps[gid].out[0]; + w[ 1] = tmps[gid].out[1]; + w[ 2] = tmps[gid].out[2]; + w[ 3] = tmps[gid].out[3]; + w[ 4] = tmps[gid].out[4]; + w[ 5] = tmps[gid].out[5]; + w[ 6] = tmps[gid].out[6]; + w[ 7] = tmps[gid].out[7]; + w[ 8] = hl32_to_64 (salt_bufs[salt_pos].salt_buf[0], salt_bufs[salt_pos].salt_buf[1]); + w[ 9] = hl32_to_64 (salt_bufs[salt_pos].salt_buf[2], salt_bufs[salt_pos].salt_buf[3]); + w[10] = 0x8000000000000000; + w[11] = 0; + w[12] = 0; + w[13] = 0; + w[14] = 0; + w[15] = (64 + 16) * 8; + + u64 dgst[8]; + + dgst[0] = SHA512M_A; + dgst[1] = SHA512M_B; + dgst[2] = SHA512M_C; + dgst[3] = SHA512M_D; + dgst[4] = SHA512M_E; + dgst[5] = SHA512M_F; + dgst[6] = SHA512M_G; + dgst[7] = SHA512M_H; + + sha512_transform (w, dgst); + + const u32x r0 = h32_from_64 (dgst[0]); + const u32x r1 = l32_from_64 (dgst[0]); + const u32x r2 = h32_from_64 (dgst[1]); + const u32x r3 = l32_from_64 (dgst[1]); + + #define il_pos 0 + + #include VECT_COMPARE_M +} diff --git a/amd/m12400.cl b/amd/m12400.cl new file mode 100644 index 0000000000..9d6b0fe4c9 --- /dev/null +++ b/amd/m12400.cl @@ -0,0 +1,787 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _DES_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW4 +#define VECT_SIZE1 +#endif + +#ifdef VLIW5 +#define VECT_SIZE1 +#endif + +#define DGST_R0 0 +#define DGST_R1 1 +#define DGST_R2 2 +#define DGST_R3 3 + +#include "include/kernel_functions.c" +#include "types_amd.c" +#include "common_amd.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +#define PERM_OP(a,b,tt,n,m) \ +{ \ + tt = a >> n; \ + tt = tt ^ b; \ + tt = tt & m; \ + b = b ^ tt; \ + tt = tt << n; \ + a = a ^ tt; \ +} + +#define HPERM_OP(a,tt,n,m) \ +{ \ + tt = a << (16 + n); \ + tt = tt ^ a; \ + tt = tt & m; \ + a = a ^ tt; \ + tt = tt >> (16 + n); \ + a = a ^ tt; \ +} + +#define IP(l,r,tt) \ +{ \ + PERM_OP (r, l, tt, 4, 0x0f0f0f0f); \ + PERM_OP (l, r, tt, 16, 0x0000ffff); \ + PERM_OP (r, l, tt, 2, 0x33333333); \ + PERM_OP (l, r, tt, 8, 0x00ff00ff); \ + PERM_OP (r, l, tt, 1, 0x55555555); \ +} + +#define FP(l,r,tt) \ +{ \ + PERM_OP (l, r, tt, 1, 0x55555555); \ + PERM_OP (r, l, tt, 8, 0x00ff00ff); \ + PERM_OP (l, r, tt, 2, 0x33333333); \ + PERM_OP (r, l, tt, 16, 0x0000ffff); \ + PERM_OP (l, r, tt, 4, 0x0f0f0f0f); \ +} + +__constant u32 c_SPtrans[8][64] = +{ + /* nibble 0 */ + 0x00820200, 0x00020000, 0x80800000, 0x80820200, + 0x00800000, 0x80020200, 0x80020000, 0x80800000, + 0x80020200, 0x00820200, 0x00820000, 0x80000200, + 0x80800200, 0x00800000, 0x00000000, 0x80020000, + 0x00020000, 0x80000000, 0x00800200, 0x00020200, + 0x80820200, 0x00820000, 0x80000200, 0x00800200, + 0x80000000, 0x00000200, 0x00020200, 0x80820000, + 0x00000200, 0x80800200, 0x80820000, 0x00000000, + 0x00000000, 0x80820200, 0x00800200, 0x80020000, + 0x00820200, 0x00020000, 0x80000200, 0x00800200, + 0x80820000, 0x00000200, 0x00020200, 0x80800000, + 0x80020200, 0x80000000, 0x80800000, 0x00820000, + 0x80820200, 0x00020200, 0x00820000, 0x80800200, + 0x00800000, 0x80000200, 0x80020000, 0x00000000, + 0x00020000, 0x00800000, 0x80800200, 0x00820200, + 0x80000000, 0x80820000, 0x00000200, 0x80020200, + /* nibble 1 */ + 0x10042004, 0x00000000, 0x00042000, 0x10040000, + 0x10000004, 0x00002004, 0x10002000, 0x00042000, + 0x00002000, 0x10040004, 0x00000004, 0x10002000, + 0x00040004, 0x10042000, 0x10040000, 0x00000004, + 0x00040000, 0x10002004, 0x10040004, 0x00002000, + 0x00042004, 0x10000000, 0x00000000, 0x00040004, + 0x10002004, 0x00042004, 0x10042000, 0x10000004, + 0x10000000, 0x00040000, 0x00002004, 0x10042004, + 0x00040004, 0x10042000, 0x10002000, 0x00042004, + 0x10042004, 0x00040004, 0x10000004, 0x00000000, + 0x10000000, 0x00002004, 0x00040000, 0x10040004, + 0x00002000, 0x10000000, 0x00042004, 0x10002004, + 0x10042000, 0x00002000, 0x00000000, 0x10000004, + 0x00000004, 0x10042004, 0x00042000, 0x10040000, + 0x10040004, 0x00040000, 0x00002004, 0x10002000, + 0x10002004, 0x00000004, 0x10040000, 0x00042000, + /* nibble 2 */ + 0x41000000, 0x01010040, 0x00000040, 0x41000040, + 0x40010000, 0x01000000, 0x41000040, 0x00010040, + 0x01000040, 0x00010000, 0x01010000, 0x40000000, + 0x41010040, 0x40000040, 0x40000000, 0x41010000, + 0x00000000, 0x40010000, 0x01010040, 0x00000040, + 0x40000040, 0x41010040, 0x00010000, 0x41000000, + 0x41010000, 0x01000040, 0x40010040, 0x01010000, + 0x00010040, 0x00000000, 0x01000000, 0x40010040, + 0x01010040, 0x00000040, 0x40000000, 0x00010000, + 0x40000040, 0x40010000, 0x01010000, 0x41000040, + 0x00000000, 0x01010040, 0x00010040, 0x41010000, + 0x40010000, 0x01000000, 0x41010040, 0x40000000, + 0x40010040, 0x41000000, 0x01000000, 0x41010040, + 0x00010000, 0x01000040, 0x41000040, 0x00010040, + 0x01000040, 0x00000000, 0x41010000, 0x40000040, + 0x41000000, 0x40010040, 0x00000040, 0x01010000, + /* nibble 3 */ + 0x00100402, 0x04000400, 0x00000002, 0x04100402, + 0x00000000, 0x04100000, 0x04000402, 0x00100002, + 0x04100400, 0x04000002, 0x04000000, 0x00000402, + 0x04000002, 0x00100402, 0x00100000, 0x04000000, + 0x04100002, 0x00100400, 0x00000400, 0x00000002, + 0x00100400, 0x04000402, 0x04100000, 0x00000400, + 0x00000402, 0x00000000, 0x00100002, 0x04100400, + 0x04000400, 0x04100002, 0x04100402, 0x00100000, + 0x04100002, 0x00000402, 0x00100000, 0x04000002, + 0x00100400, 0x04000400, 0x00000002, 0x04100000, + 0x04000402, 0x00000000, 0x00000400, 0x00100002, + 0x00000000, 0x04100002, 0x04100400, 0x00000400, + 0x04000000, 0x04100402, 0x00100402, 0x00100000, + 0x04100402, 0x00000002, 0x04000400, 0x00100402, + 0x00100002, 0x00100400, 0x04100000, 0x04000402, + 0x00000402, 0x04000000, 0x04000002, 0x04100400, + /* nibble 4 */ + 0x02000000, 0x00004000, 0x00000100, 0x02004108, + 0x02004008, 0x02000100, 0x00004108, 0x02004000, + 0x00004000, 0x00000008, 0x02000008, 0x00004100, + 0x02000108, 0x02004008, 0x02004100, 0x00000000, + 0x00004100, 0x02000000, 0x00004008, 0x00000108, + 0x02000100, 0x00004108, 0x00000000, 0x02000008, + 0x00000008, 0x02000108, 0x02004108, 0x00004008, + 0x02004000, 0x00000100, 0x00000108, 0x02004100, + 0x02004100, 0x02000108, 0x00004008, 0x02004000, + 0x00004000, 0x00000008, 0x02000008, 0x02000100, + 0x02000000, 0x00004100, 0x02004108, 0x00000000, + 0x00004108, 0x02000000, 0x00000100, 0x00004008, + 0x02000108, 0x00000100, 0x00000000, 0x02004108, + 0x02004008, 0x02004100, 0x00000108, 0x00004000, + 0x00004100, 0x02004008, 0x02000100, 0x00000108, + 0x00000008, 0x00004108, 0x02004000, 0x02000008, + /* nibble 5 */ + 0x20000010, 0x00080010, 0x00000000, 0x20080800, + 0x00080010, 0x00000800, 0x20000810, 0x00080000, + 0x00000810, 0x20080810, 0x00080800, 0x20000000, + 0x20000800, 0x20000010, 0x20080000, 0x00080810, + 0x00080000, 0x20000810, 0x20080010, 0x00000000, + 0x00000800, 0x00000010, 0x20080800, 0x20080010, + 0x20080810, 0x20080000, 0x20000000, 0x00000810, + 0x00000010, 0x00080800, 0x00080810, 0x20000800, + 0x00000810, 0x20000000, 0x20000800, 0x00080810, + 0x20080800, 0x00080010, 0x00000000, 0x20000800, + 0x20000000, 0x00000800, 0x20080010, 0x00080000, + 0x00080010, 0x20080810, 0x00080800, 0x00000010, + 0x20080810, 0x00080800, 0x00080000, 0x20000810, + 0x20000010, 0x20080000, 0x00080810, 0x00000000, + 0x00000800, 0x20000010, 0x20000810, 0x20080800, + 0x20080000, 0x00000810, 0x00000010, 0x20080010, + /* nibble 6 */ + 0x00001000, 0x00000080, 0x00400080, 0x00400001, + 0x00401081, 0x00001001, 0x00001080, 0x00000000, + 0x00400000, 0x00400081, 0x00000081, 0x00401000, + 0x00000001, 0x00401080, 0x00401000, 0x00000081, + 0x00400081, 0x00001000, 0x00001001, 0x00401081, + 0x00000000, 0x00400080, 0x00400001, 0x00001080, + 0x00401001, 0x00001081, 0x00401080, 0x00000001, + 0x00001081, 0x00401001, 0x00000080, 0x00400000, + 0x00001081, 0x00401000, 0x00401001, 0x00000081, + 0x00001000, 0x00000080, 0x00400000, 0x00401001, + 0x00400081, 0x00001081, 0x00001080, 0x00000000, + 0x00000080, 0x00400001, 0x00000001, 0x00400080, + 0x00000000, 0x00400081, 0x00400080, 0x00001080, + 0x00000081, 0x00001000, 0x00401081, 0x00400000, + 0x00401080, 0x00000001, 0x00001001, 0x00401081, + 0x00400001, 0x00401080, 0x00401000, 0x00001001, + /* nibble 7 */ + 0x08200020, 0x08208000, 0x00008020, 0x00000000, + 0x08008000, 0x00200020, 0x08200000, 0x08208020, + 0x00000020, 0x08000000, 0x00208000, 0x00008020, + 0x00208020, 0x08008020, 0x08000020, 0x08200000, + 0x00008000, 0x00208020, 0x00200020, 0x08008000, + 0x08208020, 0x08000020, 0x00000000, 0x00208000, + 0x08000000, 0x00200000, 0x08008020, 0x08200020, + 0x00200000, 0x00008000, 0x08208000, 0x00000020, + 0x00200000, 0x00008000, 0x08000020, 0x08208020, + 0x00008020, 0x08000000, 0x00000000, 0x00208000, + 0x08200020, 0x08008020, 0x08008000, 0x00200020, + 0x08208000, 0x00000020, 0x00200020, 0x08008000, + 0x08208020, 0x00200000, 0x08200000, 0x08000020, + 0x00208000, 0x00008020, 0x08008020, 0x08200000, + 0x00000020, 0x08208000, 0x00208020, 0x00000000, + 0x08000000, 0x08200020, 0x00008000, 0x00208020 +}; + +__constant u32 c_skb[8][64] = +{ + /* for C bits (numbered as per FIPS 46) 1 2 3 4 5 6 */ + 0x00000000, 0x00000010, 0x20000000, 0x20000010, + 0x00010000, 0x00010010, 0x20010000, 0x20010010, + 0x00000800, 0x00000810, 0x20000800, 0x20000810, + 0x00010800, 0x00010810, 0x20010800, 0x20010810, + 0x00000020, 0x00000030, 0x20000020, 0x20000030, + 0x00010020, 0x00010030, 0x20010020, 0x20010030, + 0x00000820, 0x00000830, 0x20000820, 0x20000830, + 0x00010820, 0x00010830, 0x20010820, 0x20010830, + 0x00080000, 0x00080010, 0x20080000, 0x20080010, + 0x00090000, 0x00090010, 0x20090000, 0x20090010, + 0x00080800, 0x00080810, 0x20080800, 0x20080810, + 0x00090800, 0x00090810, 0x20090800, 0x20090810, + 0x00080020, 0x00080030, 0x20080020, 0x20080030, + 0x00090020, 0x00090030, 0x20090020, 0x20090030, + 0x00080820, 0x00080830, 0x20080820, 0x20080830, + 0x00090820, 0x00090830, 0x20090820, 0x20090830, + /* for C bits (numbered as per FIPS 46) 7 8 10 11 12 13 */ + 0x00000000, 0x02000000, 0x00002000, 0x02002000, + 0x00200000, 0x02200000, 0x00202000, 0x02202000, + 0x00000004, 0x02000004, 0x00002004, 0x02002004, + 0x00200004, 0x02200004, 0x00202004, 0x02202004, + 0x00000400, 0x02000400, 0x00002400, 0x02002400, + 0x00200400, 0x02200400, 0x00202400, 0x02202400, + 0x00000404, 0x02000404, 0x00002404, 0x02002404, + 0x00200404, 0x02200404, 0x00202404, 0x02202404, + 0x10000000, 0x12000000, 0x10002000, 0x12002000, + 0x10200000, 0x12200000, 0x10202000, 0x12202000, + 0x10000004, 0x12000004, 0x10002004, 0x12002004, + 0x10200004, 0x12200004, 0x10202004, 0x12202004, + 0x10000400, 0x12000400, 0x10002400, 0x12002400, + 0x10200400, 0x12200400, 0x10202400, 0x12202400, + 0x10000404, 0x12000404, 0x10002404, 0x12002404, + 0x10200404, 0x12200404, 0x10202404, 0x12202404, + /* for C bits (numbered as per FIPS 46) 14 15 16 17 19 20 */ + 0x00000000, 0x00000001, 0x00040000, 0x00040001, + 0x01000000, 0x01000001, 0x01040000, 0x01040001, + 0x00000002, 0x00000003, 0x00040002, 0x00040003, + 0x01000002, 0x01000003, 0x01040002, 0x01040003, + 0x00000200, 0x00000201, 0x00040200, 0x00040201, + 0x01000200, 0x01000201, 0x01040200, 0x01040201, + 0x00000202, 0x00000203, 0x00040202, 0x00040203, + 0x01000202, 0x01000203, 0x01040202, 0x01040203, + 0x08000000, 0x08000001, 0x08040000, 0x08040001, + 0x09000000, 0x09000001, 0x09040000, 0x09040001, + 0x08000002, 0x08000003, 0x08040002, 0x08040003, + 0x09000002, 0x09000003, 0x09040002, 0x09040003, + 0x08000200, 0x08000201, 0x08040200, 0x08040201, + 0x09000200, 0x09000201, 0x09040200, 0x09040201, + 0x08000202, 0x08000203, 0x08040202, 0x08040203, + 0x09000202, 0x09000203, 0x09040202, 0x09040203, + /* for C bits (numbered as per FIPS 46) 21 23 24 26 27 28 */ + 0x00000000, 0x00100000, 0x00000100, 0x00100100, + 0x00000008, 0x00100008, 0x00000108, 0x00100108, + 0x00001000, 0x00101000, 0x00001100, 0x00101100, + 0x00001008, 0x00101008, 0x00001108, 0x00101108, + 0x04000000, 0x04100000, 0x04000100, 0x04100100, + 0x04000008, 0x04100008, 0x04000108, 0x04100108, + 0x04001000, 0x04101000, 0x04001100, 0x04101100, + 0x04001008, 0x04101008, 0x04001108, 0x04101108, + 0x00020000, 0x00120000, 0x00020100, 0x00120100, + 0x00020008, 0x00120008, 0x00020108, 0x00120108, + 0x00021000, 0x00121000, 0x00021100, 0x00121100, + 0x00021008, 0x00121008, 0x00021108, 0x00121108, + 0x04020000, 0x04120000, 0x04020100, 0x04120100, + 0x04020008, 0x04120008, 0x04020108, 0x04120108, + 0x04021000, 0x04121000, 0x04021100, 0x04121100, + 0x04021008, 0x04121008, 0x04021108, 0x04121108, + /* for D bits (numbered as per FIPS 46) 1 2 3 4 5 6 */ + 0x00000000, 0x10000000, 0x00010000, 0x10010000, + 0x00000004, 0x10000004, 0x00010004, 0x10010004, + 0x20000000, 0x30000000, 0x20010000, 0x30010000, + 0x20000004, 0x30000004, 0x20010004, 0x30010004, + 0x00100000, 0x10100000, 0x00110000, 0x10110000, + 0x00100004, 0x10100004, 0x00110004, 0x10110004, + 0x20100000, 0x30100000, 0x20110000, 0x30110000, + 0x20100004, 0x30100004, 0x20110004, 0x30110004, + 0x00001000, 0x10001000, 0x00011000, 0x10011000, + 0x00001004, 0x10001004, 0x00011004, 0x10011004, + 0x20001000, 0x30001000, 0x20011000, 0x30011000, + 0x20001004, 0x30001004, 0x20011004, 0x30011004, + 0x00101000, 0x10101000, 0x00111000, 0x10111000, + 0x00101004, 0x10101004, 0x00111004, 0x10111004, + 0x20101000, 0x30101000, 0x20111000, 0x30111000, + 0x20101004, 0x30101004, 0x20111004, 0x30111004, + /* for D bits (numbered as per FIPS 46) 8 9 11 12 13 14 */ + 0x00000000, 0x08000000, 0x00000008, 0x08000008, + 0x00000400, 0x08000400, 0x00000408, 0x08000408, + 0x00020000, 0x08020000, 0x00020008, 0x08020008, + 0x00020400, 0x08020400, 0x00020408, 0x08020408, + 0x00000001, 0x08000001, 0x00000009, 0x08000009, + 0x00000401, 0x08000401, 0x00000409, 0x08000409, + 0x00020001, 0x08020001, 0x00020009, 0x08020009, + 0x00020401, 0x08020401, 0x00020409, 0x08020409, + 0x02000000, 0x0A000000, 0x02000008, 0x0A000008, + 0x02000400, 0x0A000400, 0x02000408, 0x0A000408, + 0x02020000, 0x0A020000, 0x02020008, 0x0A020008, + 0x02020400, 0x0A020400, 0x02020408, 0x0A020408, + 0x02000001, 0x0A000001, 0x02000009, 0x0A000009, + 0x02000401, 0x0A000401, 0x02000409, 0x0A000409, + 0x02020001, 0x0A020001, 0x02020009, 0x0A020009, + 0x02020401, 0x0A020401, 0x02020409, 0x0A020409, + /* for D bits (numbered as per FIPS 46) 16 17 18 19 20 21 */ + 0x00000000, 0x00000100, 0x00080000, 0x00080100, + 0x01000000, 0x01000100, 0x01080000, 0x01080100, + 0x00000010, 0x00000110, 0x00080010, 0x00080110, + 0x01000010, 0x01000110, 0x01080010, 0x01080110, + 0x00200000, 0x00200100, 0x00280000, 0x00280100, + 0x01200000, 0x01200100, 0x01280000, 0x01280100, + 0x00200010, 0x00200110, 0x00280010, 0x00280110, + 0x01200010, 0x01200110, 0x01280010, 0x01280110, + 0x00000200, 0x00000300, 0x00080200, 0x00080300, + 0x01000200, 0x01000300, 0x01080200, 0x01080300, + 0x00000210, 0x00000310, 0x00080210, 0x00080310, + 0x01000210, 0x01000310, 0x01080210, 0x01080310, + 0x00200200, 0x00200300, 0x00280200, 0x00280300, + 0x01200200, 0x01200300, 0x01280200, 0x01280300, + 0x00200210, 0x00200310, 0x00280210, 0x00280310, + 0x01200210, 0x01200310, 0x01280210, 0x01280310, + /* for D bits (numbered as per FIPS 46) 22 23 24 25 27 28 */ + 0x00000000, 0x04000000, 0x00040000, 0x04040000, + 0x00000002, 0x04000002, 0x00040002, 0x04040002, + 0x00002000, 0x04002000, 0x00042000, 0x04042000, + 0x00002002, 0x04002002, 0x00042002, 0x04042002, + 0x00000020, 0x04000020, 0x00040020, 0x04040020, + 0x00000022, 0x04000022, 0x00040022, 0x04040022, + 0x00002020, 0x04002020, 0x00042020, 0x04042020, + 0x00002022, 0x04002022, 0x00042022, 0x04042022, + 0x00000800, 0x04000800, 0x00040800, 0x04040800, + 0x00000802, 0x04000802, 0x00040802, 0x04040802, + 0x00002800, 0x04002800, 0x00042800, 0x04042800, + 0x00002802, 0x04002802, 0x00042802, 0x04042802, + 0x00000820, 0x04000820, 0x00040820, 0x04040820, + 0x00000822, 0x04000822, 0x00040822, 0x04040822, + 0x00002820, 0x04002820, 0x00042820, 0x04042820, + 0x00002822, 0x04002822, 0x00042822, 0x04042822 +}; + +#ifdef VECT_SIZE1 +#define BOX(i,n,S) (u32x) ((S)[(n)][(i)]) +#endif + +#ifdef VECT_SIZE2 +#define BOX(i,n,S) (u32x) ((S)[(n)][(i).s0], (S)[(n)][(i).s1]) +#endif + +#ifdef VECT_SIZE4 +#define BOX(i,n,S) (u32x) ((S)[(n)][(i).s0], (S)[(n)][(i).s1], (S)[(n)][(i).s2], (S)[(n)][(i).s3]) +#endif + +static void _des_crypt_keysetup (u32x c, u32x d, u32x Kc[16], u32x Kd[16], __local u32 s_skb[8][64]) +{ + u32x tt; + + PERM_OP (d, c, tt, 4, 0x0f0f0f0f); + HPERM_OP (c, tt, 2, 0xcccc0000); + HPERM_OP (d, tt, 2, 0xcccc0000); + PERM_OP (d, c, tt, 1, 0x55555555); + PERM_OP (c, d, tt, 8, 0x00ff00ff); + PERM_OP (d, c, tt, 1, 0x55555555); + + d = ((d & 0x000000ff) << 16) + | ((d & 0x0000ff00) << 0) + | ((d & 0x00ff0000) >> 16) + | ((c & 0xf0000000) >> 4); + + c = c & 0x0fffffff; + + #pragma unroll + for (u32 i = 0; i < 16; i++) + { + const u32 shifts3s0[16] = { 1, 1, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 1 }; + const u32 shifts3s1[16] = { 27, 27, 26, 26, 26, 26, 26, 26, 27, 26, 26, 26, 26, 26, 26, 27 }; + + c = c >> shifts3s0[i] | c << shifts3s1[i]; + d = d >> shifts3s0[i] | d << shifts3s1[i]; + + c = c & 0x0fffffff; + d = d & 0x0fffffff; + + const u32x c00 = (c >> 0) & 0x0000003f; + const u32x c06 = (c >> 6) & 0x00383003; + const u32x c07 = (c >> 7) & 0x0000003c; + const u32x c13 = (c >> 13) & 0x0000060f; + const u32x c20 = (c >> 20) & 0x00000001; + + u32x s = BOX (((c00 >> 0) & 0xff), 0, s_skb) + | BOX (((c06 >> 0) & 0xff) + |((c07 >> 0) & 0xff), 1, s_skb) + | BOX (((c13 >> 0) & 0xff) + |((c06 >> 8) & 0xff), 2, s_skb) + | BOX (((c20 >> 0) & 0xff) + |((c13 >> 8) & 0xff) + |((c06 >> 16) & 0xff), 3, s_skb); + + const u32x d00 = (d >> 0) & 0x00003c3f; + const u32x d07 = (d >> 7) & 0x00003f03; + const u32x d21 = (d >> 21) & 0x0000000f; + const u32x d22 = (d >> 22) & 0x00000030; + + u32x t = BOX (((d00 >> 0) & 0xff), 4, s_skb) + | BOX (((d07 >> 0) & 0xff) + |((d00 >> 8) & 0xff), 5, s_skb) + | BOX (((d07 >> 8) & 0xff), 6, s_skb) + | BOX (((d21 >> 0) & 0xff) + |((d22 >> 0) & 0xff), 7, s_skb); + + Kc[i] = ((t << 16) | (s & 0x0000ffff)); + Kd[i] = ((s >> 16) | (t & 0xffff0000)); + } +} + +static void _des_crypt_encrypt (u32x iv[2], u32 mask, u32 rounds, u32x Kc[16], u32x Kd[16], __local u32 s_SPtrans[8][64]) +{ + u32x tt; + + const u32 E0 = ((mask >> 0) & 0x003f) + | ((mask >> 4) & 0x3f00); + const u32 E1 = ((mask >> 2) & 0x03f0) + | ((mask >> 6) & 0xf000) + | ((mask >> 22) & 0x0003); + + u32x r = iv[0]; + u32x l = iv[1]; + + for (u32 i = 0; i < rounds; i++) + { + #pragma unroll + for (u32 j = 0; j < 16; j++) + { + /* sbox */ + u32x t = r ^ (r >> 16); + + u32x u = t; + + // u + u = u & E0; + + tt = (u << 16); + + u = u ^ r; + u = u ^ tt; + u = u ^ Kc[j]; + + // t + + t = t & E1; + + tt = (t << 16); + + t = t ^ r; + t = t ^ tt; + t = rotl32 (t, 28u); + t = t ^ Kd[j]; + + const u32x um = u & 0x3f3f3f3f; + const u32x tm = t & 0x3f3f3f3f; + + l ^= BOX (((um >> 0) & 0xff), 0, s_SPtrans) + | BOX (((um >> 8) & 0xff), 2, s_SPtrans) + | BOX (((um >> 16) & 0xff), 4, s_SPtrans) + | BOX (((um >> 24) & 0xff), 6, s_SPtrans) + | BOX (((tm >> 0) & 0xff), 1, s_SPtrans) + | BOX (((tm >> 8) & 0xff), 3, s_SPtrans) + | BOX (((tm >> 16) & 0xff), 5, s_SPtrans) + | BOX (((tm >> 24) & 0xff), 7, s_SPtrans); + + tt = l; + l = r; + r = tt; + } + + tt = l; + l = r; + r = tt; + } + + iv[0] = r; + iv[1] = l; +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m12400_init (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global bsdicrypt_tmp_t *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + const u32 lid = get_local_id (0); + + /** + * sbox + */ + + __local u32 s_SPtrans[8][64]; + + s_SPtrans[0][lid] = c_SPtrans[0][lid]; + s_SPtrans[1][lid] = c_SPtrans[1][lid]; + s_SPtrans[2][lid] = c_SPtrans[2][lid]; + s_SPtrans[3][lid] = c_SPtrans[3][lid]; + s_SPtrans[4][lid] = c_SPtrans[4][lid]; + s_SPtrans[5][lid] = c_SPtrans[5][lid]; + s_SPtrans[6][lid] = c_SPtrans[6][lid]; + s_SPtrans[7][lid] = c_SPtrans[7][lid]; + + __local u32 s_skb[8][64]; + + s_skb[0][lid] = c_skb[0][lid]; + s_skb[1][lid] = c_skb[1][lid]; + s_skb[2][lid] = c_skb[2][lid]; + s_skb[3][lid] = c_skb[3][lid]; + s_skb[4][lid] = c_skb[4][lid]; + s_skb[5][lid] = c_skb[5][lid]; + s_skb[6][lid] = c_skb[6][lid]; + s_skb[7][lid] = c_skb[7][lid]; + + barrier (CLK_LOCAL_MEM_FENCE); + + if (gid >= gid_max) return; + + /** + * word + */ + + u32x w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = pws[gid].i[ 4]; + w[ 5] = pws[gid].i[ 5]; + w[ 6] = pws[gid].i[ 6]; + w[ 7] = pws[gid].i[ 7]; + w[ 8] = pws[gid].i[ 8]; + w[ 9] = pws[gid].i[ 9]; + w[10] = pws[gid].i[10]; + w[11] = pws[gid].i[11]; + w[12] = pws[gid].i[12]; + w[13] = pws[gid].i[13]; + w[14] = pws[gid].i[14]; + w[15] = pws[gid].i[15]; + + u32 pw_len = pws[gid].pw_len; + + u32 tt; + + u32 Kc[16]; + u32 Kd[16]; + + + u32 out[2]; + + out[0] = (w[0] << 1) & 0xfefefefe; + out[1] = (w[1] << 1) & 0xfefefefe; + + for (u32 i = 8, j = 2; i < pw_len; i += 8, j += 2) + { + _des_crypt_keysetup (out[0], out[1], Kc, Kd, s_skb); + + IP (out[0], out[1], tt); + + out[0] = rotr32 (out[0], 31); + out[1] = rotr32 (out[1], 31); + + _des_crypt_encrypt (out, 0, 1, Kc, Kd, s_SPtrans); + + out[0] = rotl32 (out[0], 31); + out[1] = rotl32 (out[1], 31); + + FP (out[1], out[0], tt); + + const u32 R = (w[j + 0] << 1) & 0xfefefefe; + const u32 L = (w[j + 1] << 1) & 0xfefefefe; + + out[0] ^= R; + out[1] ^= L; + } + + /* + out[0] = (out[0] & 0xfefefefe) >> 1; + out[1] = (out[1] & 0xfefefefe) >> 1; + + out[0] = (out[0] << 1) & 0xfefefefe; + out[1] = (out[1] << 1) & 0xfefefefe; + */ + + _des_crypt_keysetup (out[0], out[1], Kc, Kd, s_skb); + + tmps[gid].Kc[ 0] = Kc[ 0]; + tmps[gid].Kc[ 1] = Kc[ 1]; + tmps[gid].Kc[ 2] = Kc[ 2]; + tmps[gid].Kc[ 3] = Kc[ 3]; + tmps[gid].Kc[ 4] = Kc[ 4]; + tmps[gid].Kc[ 5] = Kc[ 5]; + tmps[gid].Kc[ 6] = Kc[ 6]; + tmps[gid].Kc[ 7] = Kc[ 7]; + tmps[gid].Kc[ 8] = Kc[ 8]; + tmps[gid].Kc[ 9] = Kc[ 9]; + tmps[gid].Kc[10] = Kc[10]; + tmps[gid].Kc[11] = Kc[11]; + tmps[gid].Kc[12] = Kc[12]; + tmps[gid].Kc[13] = Kc[13]; + tmps[gid].Kc[14] = Kc[14]; + tmps[gid].Kc[15] = Kc[15]; + + tmps[gid].Kd[ 0] = Kd[ 0]; + tmps[gid].Kd[ 1] = Kd[ 1]; + tmps[gid].Kd[ 2] = Kd[ 2]; + tmps[gid].Kd[ 3] = Kd[ 3]; + tmps[gid].Kd[ 4] = Kd[ 4]; + tmps[gid].Kd[ 5] = Kd[ 5]; + tmps[gid].Kd[ 6] = Kd[ 6]; + tmps[gid].Kd[ 7] = Kd[ 7]; + tmps[gid].Kd[ 8] = Kd[ 8]; + tmps[gid].Kd[ 9] = Kd[ 9]; + tmps[gid].Kd[10] = Kd[10]; + tmps[gid].Kd[11] = Kd[11]; + tmps[gid].Kd[12] = Kd[12]; + tmps[gid].Kd[13] = Kd[13]; + tmps[gid].Kd[14] = Kd[14]; + tmps[gid].Kd[15] = Kd[15]; + + tmps[gid].iv[0] = 0; + tmps[gid].iv[1] = 0; +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m12400_loop (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global bsdicrypt_tmp_t *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + const u32 lid = get_local_id (0); + + /** + * sbox + */ + + __local u32 s_SPtrans[8][64]; + + s_SPtrans[0][lid] = c_SPtrans[0][lid]; + s_SPtrans[1][lid] = c_SPtrans[1][lid]; + s_SPtrans[2][lid] = c_SPtrans[2][lid]; + s_SPtrans[3][lid] = c_SPtrans[3][lid]; + s_SPtrans[4][lid] = c_SPtrans[4][lid]; + s_SPtrans[5][lid] = c_SPtrans[5][lid]; + s_SPtrans[6][lid] = c_SPtrans[6][lid]; + s_SPtrans[7][lid] = c_SPtrans[7][lid]; + + barrier (CLK_LOCAL_MEM_FENCE); + + if (gid >= gid_max) return; + + u32 Kc[16]; + + Kc[ 0] = tmps[gid].Kc[ 0]; + Kc[ 1] = tmps[gid].Kc[ 1]; + Kc[ 2] = tmps[gid].Kc[ 2]; + Kc[ 3] = tmps[gid].Kc[ 3]; + Kc[ 4] = tmps[gid].Kc[ 4]; + Kc[ 5] = tmps[gid].Kc[ 5]; + Kc[ 6] = tmps[gid].Kc[ 6]; + Kc[ 7] = tmps[gid].Kc[ 7]; + Kc[ 8] = tmps[gid].Kc[ 8]; + Kc[ 9] = tmps[gid].Kc[ 9]; + Kc[10] = tmps[gid].Kc[10]; + Kc[11] = tmps[gid].Kc[11]; + Kc[12] = tmps[gid].Kc[12]; + Kc[13] = tmps[gid].Kc[13]; + Kc[14] = tmps[gid].Kc[14]; + Kc[15] = tmps[gid].Kc[15]; + + u32 Kd[16]; + + Kd[ 0] = tmps[gid].Kd[ 0]; + Kd[ 1] = tmps[gid].Kd[ 1]; + Kd[ 2] = tmps[gid].Kd[ 2]; + Kd[ 3] = tmps[gid].Kd[ 3]; + Kd[ 4] = tmps[gid].Kd[ 4]; + Kd[ 5] = tmps[gid].Kd[ 5]; + Kd[ 6] = tmps[gid].Kd[ 6]; + Kd[ 7] = tmps[gid].Kd[ 7]; + Kd[ 8] = tmps[gid].Kd[ 8]; + Kd[ 9] = tmps[gid].Kd[ 9]; + Kd[10] = tmps[gid].Kd[10]; + Kd[11] = tmps[gid].Kd[11]; + Kd[12] = tmps[gid].Kd[12]; + Kd[13] = tmps[gid].Kd[13]; + Kd[14] = tmps[gid].Kd[14]; + Kd[15] = tmps[gid].Kd[15]; + + u32 iv[2]; + + iv[0] = tmps[gid].iv[0]; + iv[1] = tmps[gid].iv[1]; + + const u32 mask = salt_bufs[salt_pos].salt_buf[0]; + + _des_crypt_encrypt (iv, mask, loop_cnt, Kc, Kd, s_SPtrans); + + tmps[gid].Kc[ 0] = Kc[ 0]; + tmps[gid].Kc[ 1] = Kc[ 1]; + tmps[gid].Kc[ 2] = Kc[ 2]; + tmps[gid].Kc[ 3] = Kc[ 3]; + tmps[gid].Kc[ 4] = Kc[ 4]; + tmps[gid].Kc[ 5] = Kc[ 5]; + tmps[gid].Kc[ 6] = Kc[ 6]; + tmps[gid].Kc[ 7] = Kc[ 7]; + tmps[gid].Kc[ 8] = Kc[ 8]; + tmps[gid].Kc[ 9] = Kc[ 9]; + tmps[gid].Kc[10] = Kc[10]; + tmps[gid].Kc[11] = Kc[11]; + tmps[gid].Kc[12] = Kc[12]; + tmps[gid].Kc[13] = Kc[13]; + tmps[gid].Kc[14] = Kc[14]; + tmps[gid].Kc[15] = Kc[15]; + + tmps[gid].Kd[ 0] = Kd[ 0]; + tmps[gid].Kd[ 1] = Kd[ 1]; + tmps[gid].Kd[ 2] = Kd[ 2]; + tmps[gid].Kd[ 3] = Kd[ 3]; + tmps[gid].Kd[ 4] = Kd[ 4]; + tmps[gid].Kd[ 5] = Kd[ 5]; + tmps[gid].Kd[ 6] = Kd[ 6]; + tmps[gid].Kd[ 7] = Kd[ 7]; + tmps[gid].Kd[ 8] = Kd[ 8]; + tmps[gid].Kd[ 9] = Kd[ 9]; + tmps[gid].Kd[10] = Kd[10]; + tmps[gid].Kd[11] = Kd[11]; + tmps[gid].Kd[12] = Kd[12]; + tmps[gid].Kd[13] = Kd[13]; + tmps[gid].Kd[14] = Kd[14]; + tmps[gid].Kd[15] = Kd[15]; + + tmps[gid].iv[0] = iv[0]; + tmps[gid].iv[1] = iv[1]; +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m12400_comp (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global bsdicrypt_tmp_t *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + const u32 lid = get_local_id (0); + + const u32x r0 = tmps[gid].iv[0]; + const u32x r1 = tmps[gid].iv[1]; + const u32x r2 = 0; + const u32x r3 = 0; + + #define il_pos 0 + + #include VECT_COMPARE_M +} diff --git a/amd/m12500.cl b/amd/m12500.cl new file mode 100644 index 0000000000..d628112e1c --- /dev/null +++ b/amd/m12500.cl @@ -0,0 +1,1350 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _RAR3_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW4 +#define VECT_SIZE1 +#endif + +#ifdef VLIW5 +#define VECT_SIZE1 +#endif + +#define DGST_R0 0 +#define DGST_R1 1 +#define DGST_R2 2 +#define DGST_R3 3 + +#include "include/kernel_functions.c" + +#include "types_amd.c" +#include "common_amd.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#define ROUNDS 0x40000 + +#define PUTCHAR(a,p,c) ((u8 *)(a))[(p)] = (u8) (c) +#define GETCHAR(a,p) ((u8 *)(a))[(p)] + +#define PUTCHAR_BE(a,p,c) ((u8 *)(a))[(p) ^ 3] = (u8) (c) +#define GETCHAR_BE(a,p) ((u8 *)(a))[(p) ^ 3] + +__constant u32 te0[256] = +{ + 0xc66363a5, 0xf87c7c84, 0xee777799, 0xf67b7b8d, + 0xfff2f20d, 0xd66b6bbd, 0xde6f6fb1, 0x91c5c554, + 0x60303050, 0x02010103, 0xce6767a9, 0x562b2b7d, + 0xe7fefe19, 0xb5d7d762, 0x4dababe6, 0xec76769a, + 0x8fcaca45, 0x1f82829d, 0x89c9c940, 0xfa7d7d87, + 0xeffafa15, 0xb25959eb, 0x8e4747c9, 0xfbf0f00b, + 0x41adadec, 0xb3d4d467, 0x5fa2a2fd, 0x45afafea, + 0x239c9cbf, 0x53a4a4f7, 0xe4727296, 0x9bc0c05b, + 0x75b7b7c2, 0xe1fdfd1c, 0x3d9393ae, 0x4c26266a, + 0x6c36365a, 0x7e3f3f41, 0xf5f7f702, 0x83cccc4f, + 0x6834345c, 0x51a5a5f4, 0xd1e5e534, 0xf9f1f108, + 0xe2717193, 0xabd8d873, 0x62313153, 0x2a15153f, + 0x0804040c, 0x95c7c752, 0x46232365, 0x9dc3c35e, + 0x30181828, 0x379696a1, 0x0a05050f, 0x2f9a9ab5, + 0x0e070709, 0x24121236, 0x1b80809b, 0xdfe2e23d, + 0xcdebeb26, 0x4e272769, 0x7fb2b2cd, 0xea75759f, + 0x1209091b, 0x1d83839e, 0x582c2c74, 0x341a1a2e, + 0x361b1b2d, 0xdc6e6eb2, 0xb45a5aee, 0x5ba0a0fb, + 0xa45252f6, 0x763b3b4d, 0xb7d6d661, 0x7db3b3ce, + 0x5229297b, 0xdde3e33e, 0x5e2f2f71, 0x13848497, + 0xa65353f5, 0xb9d1d168, 0x00000000, 0xc1eded2c, + 0x40202060, 0xe3fcfc1f, 0x79b1b1c8, 0xb65b5bed, + 0xd46a6abe, 0x8dcbcb46, 0x67bebed9, 0x7239394b, + 0x944a4ade, 0x984c4cd4, 0xb05858e8, 0x85cfcf4a, + 0xbbd0d06b, 0xc5efef2a, 0x4faaaae5, 0xedfbfb16, + 0x864343c5, 0x9a4d4dd7, 0x66333355, 0x11858594, + 0x8a4545cf, 0xe9f9f910, 0x04020206, 0xfe7f7f81, + 0xa05050f0, 0x783c3c44, 0x259f9fba, 0x4ba8a8e3, + 0xa25151f3, 0x5da3a3fe, 0x804040c0, 0x058f8f8a, + 0x3f9292ad, 0x219d9dbc, 0x70383848, 0xf1f5f504, + 0x63bcbcdf, 0x77b6b6c1, 0xafdada75, 0x42212163, + 0x20101030, 0xe5ffff1a, 0xfdf3f30e, 0xbfd2d26d, + 0x81cdcd4c, 0x180c0c14, 0x26131335, 0xc3ecec2f, + 0xbe5f5fe1, 0x359797a2, 0x884444cc, 0x2e171739, + 0x93c4c457, 0x55a7a7f2, 0xfc7e7e82, 0x7a3d3d47, + 0xc86464ac, 0xba5d5de7, 0x3219192b, 0xe6737395, + 0xc06060a0, 0x19818198, 0x9e4f4fd1, 0xa3dcdc7f, + 0x44222266, 0x542a2a7e, 0x3b9090ab, 0x0b888883, + 0x8c4646ca, 0xc7eeee29, 0x6bb8b8d3, 0x2814143c, + 0xa7dede79, 0xbc5e5ee2, 0x160b0b1d, 0xaddbdb76, + 0xdbe0e03b, 0x64323256, 0x743a3a4e, 0x140a0a1e, + 0x924949db, 0x0c06060a, 0x4824246c, 0xb85c5ce4, + 0x9fc2c25d, 0xbdd3d36e, 0x43acacef, 0xc46262a6, + 0x399191a8, 0x319595a4, 0xd3e4e437, 0xf279798b, + 0xd5e7e732, 0x8bc8c843, 0x6e373759, 0xda6d6db7, + 0x018d8d8c, 0xb1d5d564, 0x9c4e4ed2, 0x49a9a9e0, + 0xd86c6cb4, 0xac5656fa, 0xf3f4f407, 0xcfeaea25, + 0xca6565af, 0xf47a7a8e, 0x47aeaee9, 0x10080818, + 0x6fbabad5, 0xf0787888, 0x4a25256f, 0x5c2e2e72, + 0x381c1c24, 0x57a6a6f1, 0x73b4b4c7, 0x97c6c651, + 0xcbe8e823, 0xa1dddd7c, 0xe874749c, 0x3e1f1f21, + 0x964b4bdd, 0x61bdbddc, 0x0d8b8b86, 0x0f8a8a85, + 0xe0707090, 0x7c3e3e42, 0x71b5b5c4, 0xcc6666aa, + 0x904848d8, 0x06030305, 0xf7f6f601, 0x1c0e0e12, + 0xc26161a3, 0x6a35355f, 0xae5757f9, 0x69b9b9d0, + 0x17868691, 0x99c1c158, 0x3a1d1d27, 0x279e9eb9, + 0xd9e1e138, 0xebf8f813, 0x2b9898b3, 0x22111133, + 0xd26969bb, 0xa9d9d970, 0x078e8e89, 0x339494a7, + 0x2d9b9bb6, 0x3c1e1e22, 0x15878792, 0xc9e9e920, + 0x87cece49, 0xaa5555ff, 0x50282878, 0xa5dfdf7a, + 0x038c8c8f, 0x59a1a1f8, 0x09898980, 0x1a0d0d17, + 0x65bfbfda, 0xd7e6e631, 0x844242c6, 0xd06868b8, + 0x824141c3, 0x299999b0, 0x5a2d2d77, 0x1e0f0f11, + 0x7bb0b0cb, 0xa85454fc, 0x6dbbbbd6, 0x2c16163a, +}; + +__constant u32 te1[256] = +{ + 0xa5c66363, 0x84f87c7c, 0x99ee7777, 0x8df67b7b, + 0x0dfff2f2, 0xbdd66b6b, 0xb1de6f6f, 0x5491c5c5, + 0x50603030, 0x03020101, 0xa9ce6767, 0x7d562b2b, + 0x19e7fefe, 0x62b5d7d7, 0xe64dabab, 0x9aec7676, + 0x458fcaca, 0x9d1f8282, 0x4089c9c9, 0x87fa7d7d, + 0x15effafa, 0xebb25959, 0xc98e4747, 0x0bfbf0f0, + 0xec41adad, 0x67b3d4d4, 0xfd5fa2a2, 0xea45afaf, + 0xbf239c9c, 0xf753a4a4, 0x96e47272, 0x5b9bc0c0, + 0xc275b7b7, 0x1ce1fdfd, 0xae3d9393, 0x6a4c2626, + 0x5a6c3636, 0x417e3f3f, 0x02f5f7f7, 0x4f83cccc, + 0x5c683434, 0xf451a5a5, 0x34d1e5e5, 0x08f9f1f1, + 0x93e27171, 0x73abd8d8, 0x53623131, 0x3f2a1515, + 0x0c080404, 0x5295c7c7, 0x65462323, 0x5e9dc3c3, + 0x28301818, 0xa1379696, 0x0f0a0505, 0xb52f9a9a, + 0x090e0707, 0x36241212, 0x9b1b8080, 0x3ddfe2e2, + 0x26cdebeb, 0x694e2727, 0xcd7fb2b2, 0x9fea7575, + 0x1b120909, 0x9e1d8383, 0x74582c2c, 0x2e341a1a, + 0x2d361b1b, 0xb2dc6e6e, 0xeeb45a5a, 0xfb5ba0a0, + 0xf6a45252, 0x4d763b3b, 0x61b7d6d6, 0xce7db3b3, + 0x7b522929, 0x3edde3e3, 0x715e2f2f, 0x97138484, + 0xf5a65353, 0x68b9d1d1, 0x00000000, 0x2cc1eded, + 0x60402020, 0x1fe3fcfc, 0xc879b1b1, 0xedb65b5b, + 0xbed46a6a, 0x468dcbcb, 0xd967bebe, 0x4b723939, + 0xde944a4a, 0xd4984c4c, 0xe8b05858, 0x4a85cfcf, + 0x6bbbd0d0, 0x2ac5efef, 0xe54faaaa, 0x16edfbfb, + 0xc5864343, 0xd79a4d4d, 0x55663333, 0x94118585, + 0xcf8a4545, 0x10e9f9f9, 0x06040202, 0x81fe7f7f, + 0xf0a05050, 0x44783c3c, 0xba259f9f, 0xe34ba8a8, + 0xf3a25151, 0xfe5da3a3, 0xc0804040, 0x8a058f8f, + 0xad3f9292, 0xbc219d9d, 0x48703838, 0x04f1f5f5, + 0xdf63bcbc, 0xc177b6b6, 0x75afdada, 0x63422121, + 0x30201010, 0x1ae5ffff, 0x0efdf3f3, 0x6dbfd2d2, + 0x4c81cdcd, 0x14180c0c, 0x35261313, 0x2fc3ecec, + 0xe1be5f5f, 0xa2359797, 0xcc884444, 0x392e1717, + 0x5793c4c4, 0xf255a7a7, 0x82fc7e7e, 0x477a3d3d, + 0xacc86464, 0xe7ba5d5d, 0x2b321919, 0x95e67373, + 0xa0c06060, 0x98198181, 0xd19e4f4f, 0x7fa3dcdc, + 0x66442222, 0x7e542a2a, 0xab3b9090, 0x830b8888, + 0xca8c4646, 0x29c7eeee, 0xd36bb8b8, 0x3c281414, + 0x79a7dede, 0xe2bc5e5e, 0x1d160b0b, 0x76addbdb, + 0x3bdbe0e0, 0x56643232, 0x4e743a3a, 0x1e140a0a, + 0xdb924949, 0x0a0c0606, 0x6c482424, 0xe4b85c5c, + 0x5d9fc2c2, 0x6ebdd3d3, 0xef43acac, 0xa6c46262, + 0xa8399191, 0xa4319595, 0x37d3e4e4, 0x8bf27979, + 0x32d5e7e7, 0x438bc8c8, 0x596e3737, 0xb7da6d6d, + 0x8c018d8d, 0x64b1d5d5, 0xd29c4e4e, 0xe049a9a9, + 0xb4d86c6c, 0xfaac5656, 0x07f3f4f4, 0x25cfeaea, + 0xafca6565, 0x8ef47a7a, 0xe947aeae, 0x18100808, + 0xd56fbaba, 0x88f07878, 0x6f4a2525, 0x725c2e2e, + 0x24381c1c, 0xf157a6a6, 0xc773b4b4, 0x5197c6c6, + 0x23cbe8e8, 0x7ca1dddd, 0x9ce87474, 0x213e1f1f, + 0xdd964b4b, 0xdc61bdbd, 0x860d8b8b, 0x850f8a8a, + 0x90e07070, 0x427c3e3e, 0xc471b5b5, 0xaacc6666, + 0xd8904848, 0x05060303, 0x01f7f6f6, 0x121c0e0e, + 0xa3c26161, 0x5f6a3535, 0xf9ae5757, 0xd069b9b9, + 0x91178686, 0x5899c1c1, 0x273a1d1d, 0xb9279e9e, + 0x38d9e1e1, 0x13ebf8f8, 0xb32b9898, 0x33221111, + 0xbbd26969, 0x70a9d9d9, 0x89078e8e, 0xa7339494, + 0xb62d9b9b, 0x223c1e1e, 0x92158787, 0x20c9e9e9, + 0x4987cece, 0xffaa5555, 0x78502828, 0x7aa5dfdf, + 0x8f038c8c, 0xf859a1a1, 0x80098989, 0x171a0d0d, + 0xda65bfbf, 0x31d7e6e6, 0xc6844242, 0xb8d06868, + 0xc3824141, 0xb0299999, 0x775a2d2d, 0x111e0f0f, + 0xcb7bb0b0, 0xfca85454, 0xd66dbbbb, 0x3a2c1616, +}; + +__constant u32 te2[256] = +{ + 0x63a5c663, 0x7c84f87c, 0x7799ee77, 0x7b8df67b, + 0xf20dfff2, 0x6bbdd66b, 0x6fb1de6f, 0xc55491c5, + 0x30506030, 0x01030201, 0x67a9ce67, 0x2b7d562b, + 0xfe19e7fe, 0xd762b5d7, 0xabe64dab, 0x769aec76, + 0xca458fca, 0x829d1f82, 0xc94089c9, 0x7d87fa7d, + 0xfa15effa, 0x59ebb259, 0x47c98e47, 0xf00bfbf0, + 0xadec41ad, 0xd467b3d4, 0xa2fd5fa2, 0xafea45af, + 0x9cbf239c, 0xa4f753a4, 0x7296e472, 0xc05b9bc0, + 0xb7c275b7, 0xfd1ce1fd, 0x93ae3d93, 0x266a4c26, + 0x365a6c36, 0x3f417e3f, 0xf702f5f7, 0xcc4f83cc, + 0x345c6834, 0xa5f451a5, 0xe534d1e5, 0xf108f9f1, + 0x7193e271, 0xd873abd8, 0x31536231, 0x153f2a15, + 0x040c0804, 0xc75295c7, 0x23654623, 0xc35e9dc3, + 0x18283018, 0x96a13796, 0x050f0a05, 0x9ab52f9a, + 0x07090e07, 0x12362412, 0x809b1b80, 0xe23ddfe2, + 0xeb26cdeb, 0x27694e27, 0xb2cd7fb2, 0x759fea75, + 0x091b1209, 0x839e1d83, 0x2c74582c, 0x1a2e341a, + 0x1b2d361b, 0x6eb2dc6e, 0x5aeeb45a, 0xa0fb5ba0, + 0x52f6a452, 0x3b4d763b, 0xd661b7d6, 0xb3ce7db3, + 0x297b5229, 0xe33edde3, 0x2f715e2f, 0x84971384, + 0x53f5a653, 0xd168b9d1, 0x00000000, 0xed2cc1ed, + 0x20604020, 0xfc1fe3fc, 0xb1c879b1, 0x5bedb65b, + 0x6abed46a, 0xcb468dcb, 0xbed967be, 0x394b7239, + 0x4ade944a, 0x4cd4984c, 0x58e8b058, 0xcf4a85cf, + 0xd06bbbd0, 0xef2ac5ef, 0xaae54faa, 0xfb16edfb, + 0x43c58643, 0x4dd79a4d, 0x33556633, 0x85941185, + 0x45cf8a45, 0xf910e9f9, 0x02060402, 0x7f81fe7f, + 0x50f0a050, 0x3c44783c, 0x9fba259f, 0xa8e34ba8, + 0x51f3a251, 0xa3fe5da3, 0x40c08040, 0x8f8a058f, + 0x92ad3f92, 0x9dbc219d, 0x38487038, 0xf504f1f5, + 0xbcdf63bc, 0xb6c177b6, 0xda75afda, 0x21634221, + 0x10302010, 0xff1ae5ff, 0xf30efdf3, 0xd26dbfd2, + 0xcd4c81cd, 0x0c14180c, 0x13352613, 0xec2fc3ec, + 0x5fe1be5f, 0x97a23597, 0x44cc8844, 0x17392e17, + 0xc45793c4, 0xa7f255a7, 0x7e82fc7e, 0x3d477a3d, + 0x64acc864, 0x5de7ba5d, 0x192b3219, 0x7395e673, + 0x60a0c060, 0x81981981, 0x4fd19e4f, 0xdc7fa3dc, + 0x22664422, 0x2a7e542a, 0x90ab3b90, 0x88830b88, + 0x46ca8c46, 0xee29c7ee, 0xb8d36bb8, 0x143c2814, + 0xde79a7de, 0x5ee2bc5e, 0x0b1d160b, 0xdb76addb, + 0xe03bdbe0, 0x32566432, 0x3a4e743a, 0x0a1e140a, + 0x49db9249, 0x060a0c06, 0x246c4824, 0x5ce4b85c, + 0xc25d9fc2, 0xd36ebdd3, 0xacef43ac, 0x62a6c462, + 0x91a83991, 0x95a43195, 0xe437d3e4, 0x798bf279, + 0xe732d5e7, 0xc8438bc8, 0x37596e37, 0x6db7da6d, + 0x8d8c018d, 0xd564b1d5, 0x4ed29c4e, 0xa9e049a9, + 0x6cb4d86c, 0x56faac56, 0xf407f3f4, 0xea25cfea, + 0x65afca65, 0x7a8ef47a, 0xaee947ae, 0x08181008, + 0xbad56fba, 0x7888f078, 0x256f4a25, 0x2e725c2e, + 0x1c24381c, 0xa6f157a6, 0xb4c773b4, 0xc65197c6, + 0xe823cbe8, 0xdd7ca1dd, 0x749ce874, 0x1f213e1f, + 0x4bdd964b, 0xbddc61bd, 0x8b860d8b, 0x8a850f8a, + 0x7090e070, 0x3e427c3e, 0xb5c471b5, 0x66aacc66, + 0x48d89048, 0x03050603, 0xf601f7f6, 0x0e121c0e, + 0x61a3c261, 0x355f6a35, 0x57f9ae57, 0xb9d069b9, + 0x86911786, 0xc15899c1, 0x1d273a1d, 0x9eb9279e, + 0xe138d9e1, 0xf813ebf8, 0x98b32b98, 0x11332211, + 0x69bbd269, 0xd970a9d9, 0x8e89078e, 0x94a73394, + 0x9bb62d9b, 0x1e223c1e, 0x87921587, 0xe920c9e9, + 0xce4987ce, 0x55ffaa55, 0x28785028, 0xdf7aa5df, + 0x8c8f038c, 0xa1f859a1, 0x89800989, 0x0d171a0d, + 0xbfda65bf, 0xe631d7e6, 0x42c68442, 0x68b8d068, + 0x41c38241, 0x99b02999, 0x2d775a2d, 0x0f111e0f, + 0xb0cb7bb0, 0x54fca854, 0xbbd66dbb, 0x163a2c16, +}; + +__constant u32 te3[256] = +{ + 0x6363a5c6, 0x7c7c84f8, 0x777799ee, 0x7b7b8df6, + 0xf2f20dff, 0x6b6bbdd6, 0x6f6fb1de, 0xc5c55491, + 0x30305060, 0x01010302, 0x6767a9ce, 0x2b2b7d56, + 0xfefe19e7, 0xd7d762b5, 0xababe64d, 0x76769aec, + 0xcaca458f, 0x82829d1f, 0xc9c94089, 0x7d7d87fa, + 0xfafa15ef, 0x5959ebb2, 0x4747c98e, 0xf0f00bfb, + 0xadadec41, 0xd4d467b3, 0xa2a2fd5f, 0xafafea45, + 0x9c9cbf23, 0xa4a4f753, 0x727296e4, 0xc0c05b9b, + 0xb7b7c275, 0xfdfd1ce1, 0x9393ae3d, 0x26266a4c, + 0x36365a6c, 0x3f3f417e, 0xf7f702f5, 0xcccc4f83, + 0x34345c68, 0xa5a5f451, 0xe5e534d1, 0xf1f108f9, + 0x717193e2, 0xd8d873ab, 0x31315362, 0x15153f2a, + 0x04040c08, 0xc7c75295, 0x23236546, 0xc3c35e9d, + 0x18182830, 0x9696a137, 0x05050f0a, 0x9a9ab52f, + 0x0707090e, 0x12123624, 0x80809b1b, 0xe2e23ddf, + 0xebeb26cd, 0x2727694e, 0xb2b2cd7f, 0x75759fea, + 0x09091b12, 0x83839e1d, 0x2c2c7458, 0x1a1a2e34, + 0x1b1b2d36, 0x6e6eb2dc, 0x5a5aeeb4, 0xa0a0fb5b, + 0x5252f6a4, 0x3b3b4d76, 0xd6d661b7, 0xb3b3ce7d, + 0x29297b52, 0xe3e33edd, 0x2f2f715e, 0x84849713, + 0x5353f5a6, 0xd1d168b9, 0x00000000, 0xeded2cc1, + 0x20206040, 0xfcfc1fe3, 0xb1b1c879, 0x5b5bedb6, + 0x6a6abed4, 0xcbcb468d, 0xbebed967, 0x39394b72, + 0x4a4ade94, 0x4c4cd498, 0x5858e8b0, 0xcfcf4a85, + 0xd0d06bbb, 0xefef2ac5, 0xaaaae54f, 0xfbfb16ed, + 0x4343c586, 0x4d4dd79a, 0x33335566, 0x85859411, + 0x4545cf8a, 0xf9f910e9, 0x02020604, 0x7f7f81fe, + 0x5050f0a0, 0x3c3c4478, 0x9f9fba25, 0xa8a8e34b, + 0x5151f3a2, 0xa3a3fe5d, 0x4040c080, 0x8f8f8a05, + 0x9292ad3f, 0x9d9dbc21, 0x38384870, 0xf5f504f1, + 0xbcbcdf63, 0xb6b6c177, 0xdada75af, 0x21216342, + 0x10103020, 0xffff1ae5, 0xf3f30efd, 0xd2d26dbf, + 0xcdcd4c81, 0x0c0c1418, 0x13133526, 0xecec2fc3, + 0x5f5fe1be, 0x9797a235, 0x4444cc88, 0x1717392e, + 0xc4c45793, 0xa7a7f255, 0x7e7e82fc, 0x3d3d477a, + 0x6464acc8, 0x5d5de7ba, 0x19192b32, 0x737395e6, + 0x6060a0c0, 0x81819819, 0x4f4fd19e, 0xdcdc7fa3, + 0x22226644, 0x2a2a7e54, 0x9090ab3b, 0x8888830b, + 0x4646ca8c, 0xeeee29c7, 0xb8b8d36b, 0x14143c28, + 0xdede79a7, 0x5e5ee2bc, 0x0b0b1d16, 0xdbdb76ad, + 0xe0e03bdb, 0x32325664, 0x3a3a4e74, 0x0a0a1e14, + 0x4949db92, 0x06060a0c, 0x24246c48, 0x5c5ce4b8, + 0xc2c25d9f, 0xd3d36ebd, 0xacacef43, 0x6262a6c4, + 0x9191a839, 0x9595a431, 0xe4e437d3, 0x79798bf2, + 0xe7e732d5, 0xc8c8438b, 0x3737596e, 0x6d6db7da, + 0x8d8d8c01, 0xd5d564b1, 0x4e4ed29c, 0xa9a9e049, + 0x6c6cb4d8, 0x5656faac, 0xf4f407f3, 0xeaea25cf, + 0x6565afca, 0x7a7a8ef4, 0xaeaee947, 0x08081810, + 0xbabad56f, 0x787888f0, 0x25256f4a, 0x2e2e725c, + 0x1c1c2438, 0xa6a6f157, 0xb4b4c773, 0xc6c65197, + 0xe8e823cb, 0xdddd7ca1, 0x74749ce8, 0x1f1f213e, + 0x4b4bdd96, 0xbdbddc61, 0x8b8b860d, 0x8a8a850f, + 0x707090e0, 0x3e3e427c, 0xb5b5c471, 0x6666aacc, + 0x4848d890, 0x03030506, 0xf6f601f7, 0x0e0e121c, + 0x6161a3c2, 0x35355f6a, 0x5757f9ae, 0xb9b9d069, + 0x86869117, 0xc1c15899, 0x1d1d273a, 0x9e9eb927, + 0xe1e138d9, 0xf8f813eb, 0x9898b32b, 0x11113322, + 0x6969bbd2, 0xd9d970a9, 0x8e8e8907, 0x9494a733, + 0x9b9bb62d, 0x1e1e223c, 0x87879215, 0xe9e920c9, + 0xcece4987, 0x5555ffaa, 0x28287850, 0xdfdf7aa5, + 0x8c8c8f03, 0xa1a1f859, 0x89898009, 0x0d0d171a, + 0xbfbfda65, 0xe6e631d7, 0x4242c684, 0x6868b8d0, + 0x4141c382, 0x9999b029, 0x2d2d775a, 0x0f0f111e, + 0xb0b0cb7b, 0x5454fca8, 0xbbbbd66d, 0x16163a2c, +}; + +__constant u32 te4[256] = +{ + 0x63636363, 0x7c7c7c7c, 0x77777777, 0x7b7b7b7b, + 0xf2f2f2f2, 0x6b6b6b6b, 0x6f6f6f6f, 0xc5c5c5c5, + 0x30303030, 0x01010101, 0x67676767, 0x2b2b2b2b, + 0xfefefefe, 0xd7d7d7d7, 0xabababab, 0x76767676, + 0xcacacaca, 0x82828282, 0xc9c9c9c9, 0x7d7d7d7d, + 0xfafafafa, 0x59595959, 0x47474747, 0xf0f0f0f0, + 0xadadadad, 0xd4d4d4d4, 0xa2a2a2a2, 0xafafafaf, + 0x9c9c9c9c, 0xa4a4a4a4, 0x72727272, 0xc0c0c0c0, + 0xb7b7b7b7, 0xfdfdfdfd, 0x93939393, 0x26262626, + 0x36363636, 0x3f3f3f3f, 0xf7f7f7f7, 0xcccccccc, + 0x34343434, 0xa5a5a5a5, 0xe5e5e5e5, 0xf1f1f1f1, + 0x71717171, 0xd8d8d8d8, 0x31313131, 0x15151515, + 0x04040404, 0xc7c7c7c7, 0x23232323, 0xc3c3c3c3, + 0x18181818, 0x96969696, 0x05050505, 0x9a9a9a9a, + 0x07070707, 0x12121212, 0x80808080, 0xe2e2e2e2, + 0xebebebeb, 0x27272727, 0xb2b2b2b2, 0x75757575, + 0x09090909, 0x83838383, 0x2c2c2c2c, 0x1a1a1a1a, + 0x1b1b1b1b, 0x6e6e6e6e, 0x5a5a5a5a, 0xa0a0a0a0, + 0x52525252, 0x3b3b3b3b, 0xd6d6d6d6, 0xb3b3b3b3, + 0x29292929, 0xe3e3e3e3, 0x2f2f2f2f, 0x84848484, + 0x53535353, 0xd1d1d1d1, 0x00000000, 0xedededed, + 0x20202020, 0xfcfcfcfc, 0xb1b1b1b1, 0x5b5b5b5b, + 0x6a6a6a6a, 0xcbcbcbcb, 0xbebebebe, 0x39393939, + 0x4a4a4a4a, 0x4c4c4c4c, 0x58585858, 0xcfcfcfcf, + 0xd0d0d0d0, 0xefefefef, 0xaaaaaaaa, 0xfbfbfbfb, + 0x43434343, 0x4d4d4d4d, 0x33333333, 0x85858585, + 0x45454545, 0xf9f9f9f9, 0x02020202, 0x7f7f7f7f, + 0x50505050, 0x3c3c3c3c, 0x9f9f9f9f, 0xa8a8a8a8, + 0x51515151, 0xa3a3a3a3, 0x40404040, 0x8f8f8f8f, + 0x92929292, 0x9d9d9d9d, 0x38383838, 0xf5f5f5f5, + 0xbcbcbcbc, 0xb6b6b6b6, 0xdadadada, 0x21212121, + 0x10101010, 0xffffffff, 0xf3f3f3f3, 0xd2d2d2d2, + 0xcdcdcdcd, 0x0c0c0c0c, 0x13131313, 0xecececec, + 0x5f5f5f5f, 0x97979797, 0x44444444, 0x17171717, + 0xc4c4c4c4, 0xa7a7a7a7, 0x7e7e7e7e, 0x3d3d3d3d, + 0x64646464, 0x5d5d5d5d, 0x19191919, 0x73737373, + 0x60606060, 0x81818181, 0x4f4f4f4f, 0xdcdcdcdc, + 0x22222222, 0x2a2a2a2a, 0x90909090, 0x88888888, + 0x46464646, 0xeeeeeeee, 0xb8b8b8b8, 0x14141414, + 0xdededede, 0x5e5e5e5e, 0x0b0b0b0b, 0xdbdbdbdb, + 0xe0e0e0e0, 0x32323232, 0x3a3a3a3a, 0x0a0a0a0a, + 0x49494949, 0x06060606, 0x24242424, 0x5c5c5c5c, + 0xc2c2c2c2, 0xd3d3d3d3, 0xacacacac, 0x62626262, + 0x91919191, 0x95959595, 0xe4e4e4e4, 0x79797979, + 0xe7e7e7e7, 0xc8c8c8c8, 0x37373737, 0x6d6d6d6d, + 0x8d8d8d8d, 0xd5d5d5d5, 0x4e4e4e4e, 0xa9a9a9a9, + 0x6c6c6c6c, 0x56565656, 0xf4f4f4f4, 0xeaeaeaea, + 0x65656565, 0x7a7a7a7a, 0xaeaeaeae, 0x08080808, + 0xbabababa, 0x78787878, 0x25252525, 0x2e2e2e2e, + 0x1c1c1c1c, 0xa6a6a6a6, 0xb4b4b4b4, 0xc6c6c6c6, + 0xe8e8e8e8, 0xdddddddd, 0x74747474, 0x1f1f1f1f, + 0x4b4b4b4b, 0xbdbdbdbd, 0x8b8b8b8b, 0x8a8a8a8a, + 0x70707070, 0x3e3e3e3e, 0xb5b5b5b5, 0x66666666, + 0x48484848, 0x03030303, 0xf6f6f6f6, 0x0e0e0e0e, + 0x61616161, 0x35353535, 0x57575757, 0xb9b9b9b9, + 0x86868686, 0xc1c1c1c1, 0x1d1d1d1d, 0x9e9e9e9e, + 0xe1e1e1e1, 0xf8f8f8f8, 0x98989898, 0x11111111, + 0x69696969, 0xd9d9d9d9, 0x8e8e8e8e, 0x94949494, + 0x9b9b9b9b, 0x1e1e1e1e, 0x87878787, 0xe9e9e9e9, + 0xcececece, 0x55555555, 0x28282828, 0xdfdfdfdf, + 0x8c8c8c8c, 0xa1a1a1a1, 0x89898989, 0x0d0d0d0d, + 0xbfbfbfbf, 0xe6e6e6e6, 0x42424242, 0x68686868, + 0x41414141, 0x99999999, 0x2d2d2d2d, 0x0f0f0f0f, + 0xb0b0b0b0, 0x54545454, 0xbbbbbbbb, 0x16161616, +}; + +__constant u32 td0[256] = +{ + 0x51f4a750, 0x7e416553, 0x1a17a4c3, 0x3a275e96, + 0x3bab6bcb, 0x1f9d45f1, 0xacfa58ab, 0x4be30393, + 0x2030fa55, 0xad766df6, 0x88cc7691, 0xf5024c25, + 0x4fe5d7fc, 0xc52acbd7, 0x26354480, 0xb562a38f, + 0xdeb15a49, 0x25ba1b67, 0x45ea0e98, 0x5dfec0e1, + 0xc32f7502, 0x814cf012, 0x8d4697a3, 0x6bd3f9c6, + 0x038f5fe7, 0x15929c95, 0xbf6d7aeb, 0x955259da, + 0xd4be832d, 0x587421d3, 0x49e06929, 0x8ec9c844, + 0x75c2896a, 0xf48e7978, 0x99583e6b, 0x27b971dd, + 0xbee14fb6, 0xf088ad17, 0xc920ac66, 0x7dce3ab4, + 0x63df4a18, 0xe51a3182, 0x97513360, 0x62537f45, + 0xb16477e0, 0xbb6bae84, 0xfe81a01c, 0xf9082b94, + 0x70486858, 0x8f45fd19, 0x94de6c87, 0x527bf8b7, + 0xab73d323, 0x724b02e2, 0xe31f8f57, 0x6655ab2a, + 0xb2eb2807, 0x2fb5c203, 0x86c57b9a, 0xd33708a5, + 0x302887f2, 0x23bfa5b2, 0x02036aba, 0xed16825c, + 0x8acf1c2b, 0xa779b492, 0xf307f2f0, 0x4e69e2a1, + 0x65daf4cd, 0x0605bed5, 0xd134621f, 0xc4a6fe8a, + 0x342e539d, 0xa2f355a0, 0x058ae132, 0xa4f6eb75, + 0x0b83ec39, 0x4060efaa, 0x5e719f06, 0xbd6e1051, + 0x3e218af9, 0x96dd063d, 0xdd3e05ae, 0x4de6bd46, + 0x91548db5, 0x71c45d05, 0x0406d46f, 0x605015ff, + 0x1998fb24, 0xd6bde997, 0x894043cc, 0x67d99e77, + 0xb0e842bd, 0x07898b88, 0xe7195b38, 0x79c8eedb, + 0xa17c0a47, 0x7c420fe9, 0xf8841ec9, 0x00000000, + 0x09808683, 0x322bed48, 0x1e1170ac, 0x6c5a724e, + 0xfd0efffb, 0x0f853856, 0x3daed51e, 0x362d3927, + 0x0a0fd964, 0x685ca621, 0x9b5b54d1, 0x24362e3a, + 0x0c0a67b1, 0x9357e70f, 0xb4ee96d2, 0x1b9b919e, + 0x80c0c54f, 0x61dc20a2, 0x5a774b69, 0x1c121a16, + 0xe293ba0a, 0xc0a02ae5, 0x3c22e043, 0x121b171d, + 0x0e090d0b, 0xf28bc7ad, 0x2db6a8b9, 0x141ea9c8, + 0x57f11985, 0xaf75074c, 0xee99ddbb, 0xa37f60fd, + 0xf701269f, 0x5c72f5bc, 0x44663bc5, 0x5bfb7e34, + 0x8b432976, 0xcb23c6dc, 0xb6edfc68, 0xb8e4f163, + 0xd731dcca, 0x42638510, 0x13972240, 0x84c61120, + 0x854a247d, 0xd2bb3df8, 0xaef93211, 0xc729a16d, + 0x1d9e2f4b, 0xdcb230f3, 0x0d8652ec, 0x77c1e3d0, + 0x2bb3166c, 0xa970b999, 0x119448fa, 0x47e96422, + 0xa8fc8cc4, 0xa0f03f1a, 0x567d2cd8, 0x223390ef, + 0x87494ec7, 0xd938d1c1, 0x8ccaa2fe, 0x98d40b36, + 0xa6f581cf, 0xa57ade28, 0xdab78e26, 0x3fadbfa4, + 0x2c3a9de4, 0x5078920d, 0x6a5fcc9b, 0x547e4662, + 0xf68d13c2, 0x90d8b8e8, 0x2e39f75e, 0x82c3aff5, + 0x9f5d80be, 0x69d0937c, 0x6fd52da9, 0xcf2512b3, + 0xc8ac993b, 0x10187da7, 0xe89c636e, 0xdb3bbb7b, + 0xcd267809, 0x6e5918f4, 0xec9ab701, 0x834f9aa8, + 0xe6956e65, 0xaaffe67e, 0x21bccf08, 0xef15e8e6, + 0xbae79bd9, 0x4a6f36ce, 0xea9f09d4, 0x29b07cd6, + 0x31a4b2af, 0x2a3f2331, 0xc6a59430, 0x35a266c0, + 0x744ebc37, 0xfc82caa6, 0xe090d0b0, 0x33a7d815, + 0xf104984a, 0x41ecdaf7, 0x7fcd500e, 0x1791f62f, + 0x764dd68d, 0x43efb04d, 0xccaa4d54, 0xe49604df, + 0x9ed1b5e3, 0x4c6a881b, 0xc12c1fb8, 0x4665517f, + 0x9d5eea04, 0x018c355d, 0xfa877473, 0xfb0b412e, + 0xb3671d5a, 0x92dbd252, 0xe9105633, 0x6dd64713, + 0x9ad7618c, 0x37a10c7a, 0x59f8148e, 0xeb133c89, + 0xcea927ee, 0xb761c935, 0xe11ce5ed, 0x7a47b13c, + 0x9cd2df59, 0x55f2733f, 0x1814ce79, 0x73c737bf, + 0x53f7cdea, 0x5ffdaa5b, 0xdf3d6f14, 0x7844db86, + 0xcaaff381, 0xb968c43e, 0x3824342c, 0xc2a3405f, + 0x161dc372, 0xbce2250c, 0x283c498b, 0xff0d9541, + 0x39a80171, 0x080cb3de, 0xd8b4e49c, 0x6456c190, + 0x7bcb8461, 0xd532b670, 0x486c5c74, 0xd0b85742, +}; + +__constant u32 td1[256] = +{ + 0x5051f4a7, 0x537e4165, 0xc31a17a4, 0x963a275e, + 0xcb3bab6b, 0xf11f9d45, 0xabacfa58, 0x934be303, + 0x552030fa, 0xf6ad766d, 0x9188cc76, 0x25f5024c, + 0xfc4fe5d7, 0xd7c52acb, 0x80263544, 0x8fb562a3, + 0x49deb15a, 0x6725ba1b, 0x9845ea0e, 0xe15dfec0, + 0x02c32f75, 0x12814cf0, 0xa38d4697, 0xc66bd3f9, + 0xe7038f5f, 0x9515929c, 0xebbf6d7a, 0xda955259, + 0x2dd4be83, 0xd3587421, 0x2949e069, 0x448ec9c8, + 0x6a75c289, 0x78f48e79, 0x6b99583e, 0xdd27b971, + 0xb6bee14f, 0x17f088ad, 0x66c920ac, 0xb47dce3a, + 0x1863df4a, 0x82e51a31, 0x60975133, 0x4562537f, + 0xe0b16477, 0x84bb6bae, 0x1cfe81a0, 0x94f9082b, + 0x58704868, 0x198f45fd, 0x8794de6c, 0xb7527bf8, + 0x23ab73d3, 0xe2724b02, 0x57e31f8f, 0x2a6655ab, + 0x07b2eb28, 0x032fb5c2, 0x9a86c57b, 0xa5d33708, + 0xf2302887, 0xb223bfa5, 0xba02036a, 0x5ced1682, + 0x2b8acf1c, 0x92a779b4, 0xf0f307f2, 0xa14e69e2, + 0xcd65daf4, 0xd50605be, 0x1fd13462, 0x8ac4a6fe, + 0x9d342e53, 0xa0a2f355, 0x32058ae1, 0x75a4f6eb, + 0x390b83ec, 0xaa4060ef, 0x065e719f, 0x51bd6e10, + 0xf93e218a, 0x3d96dd06, 0xaedd3e05, 0x464de6bd, + 0xb591548d, 0x0571c45d, 0x6f0406d4, 0xff605015, + 0x241998fb, 0x97d6bde9, 0xcc894043, 0x7767d99e, + 0xbdb0e842, 0x8807898b, 0x38e7195b, 0xdb79c8ee, + 0x47a17c0a, 0xe97c420f, 0xc9f8841e, 0x00000000, + 0x83098086, 0x48322bed, 0xac1e1170, 0x4e6c5a72, + 0xfbfd0eff, 0x560f8538, 0x1e3daed5, 0x27362d39, + 0x640a0fd9, 0x21685ca6, 0xd19b5b54, 0x3a24362e, + 0xb10c0a67, 0x0f9357e7, 0xd2b4ee96, 0x9e1b9b91, + 0x4f80c0c5, 0xa261dc20, 0x695a774b, 0x161c121a, + 0x0ae293ba, 0xe5c0a02a, 0x433c22e0, 0x1d121b17, + 0x0b0e090d, 0xadf28bc7, 0xb92db6a8, 0xc8141ea9, + 0x8557f119, 0x4caf7507, 0xbbee99dd, 0xfda37f60, + 0x9ff70126, 0xbc5c72f5, 0xc544663b, 0x345bfb7e, + 0x768b4329, 0xdccb23c6, 0x68b6edfc, 0x63b8e4f1, + 0xcad731dc, 0x10426385, 0x40139722, 0x2084c611, + 0x7d854a24, 0xf8d2bb3d, 0x11aef932, 0x6dc729a1, + 0x4b1d9e2f, 0xf3dcb230, 0xec0d8652, 0xd077c1e3, + 0x6c2bb316, 0x99a970b9, 0xfa119448, 0x2247e964, + 0xc4a8fc8c, 0x1aa0f03f, 0xd8567d2c, 0xef223390, + 0xc787494e, 0xc1d938d1, 0xfe8ccaa2, 0x3698d40b, + 0xcfa6f581, 0x28a57ade, 0x26dab78e, 0xa43fadbf, + 0xe42c3a9d, 0x0d507892, 0x9b6a5fcc, 0x62547e46, + 0xc2f68d13, 0xe890d8b8, 0x5e2e39f7, 0xf582c3af, + 0xbe9f5d80, 0x7c69d093, 0xa96fd52d, 0xb3cf2512, + 0x3bc8ac99, 0xa710187d, 0x6ee89c63, 0x7bdb3bbb, + 0x09cd2678, 0xf46e5918, 0x01ec9ab7, 0xa8834f9a, + 0x65e6956e, 0x7eaaffe6, 0x0821bccf, 0xe6ef15e8, + 0xd9bae79b, 0xce4a6f36, 0xd4ea9f09, 0xd629b07c, + 0xaf31a4b2, 0x312a3f23, 0x30c6a594, 0xc035a266, + 0x37744ebc, 0xa6fc82ca, 0xb0e090d0, 0x1533a7d8, + 0x4af10498, 0xf741ecda, 0x0e7fcd50, 0x2f1791f6, + 0x8d764dd6, 0x4d43efb0, 0x54ccaa4d, 0xdfe49604, + 0xe39ed1b5, 0x1b4c6a88, 0xb8c12c1f, 0x7f466551, + 0x049d5eea, 0x5d018c35, 0x73fa8774, 0x2efb0b41, + 0x5ab3671d, 0x5292dbd2, 0x33e91056, 0x136dd647, + 0x8c9ad761, 0x7a37a10c, 0x8e59f814, 0x89eb133c, + 0xeecea927, 0x35b761c9, 0xede11ce5, 0x3c7a47b1, + 0x599cd2df, 0x3f55f273, 0x791814ce, 0xbf73c737, + 0xea53f7cd, 0x5b5ffdaa, 0x14df3d6f, 0x867844db, + 0x81caaff3, 0x3eb968c4, 0x2c382434, 0x5fc2a340, + 0x72161dc3, 0x0cbce225, 0x8b283c49, 0x41ff0d95, + 0x7139a801, 0xde080cb3, 0x9cd8b4e4, 0x906456c1, + 0x617bcb84, 0x70d532b6, 0x74486c5c, 0x42d0b857, +}; + +__constant u32 td2[256] = +{ + 0xa75051f4, 0x65537e41, 0xa4c31a17, 0x5e963a27, + 0x6bcb3bab, 0x45f11f9d, 0x58abacfa, 0x03934be3, + 0xfa552030, 0x6df6ad76, 0x769188cc, 0x4c25f502, + 0xd7fc4fe5, 0xcbd7c52a, 0x44802635, 0xa38fb562, + 0x5a49deb1, 0x1b6725ba, 0x0e9845ea, 0xc0e15dfe, + 0x7502c32f, 0xf012814c, 0x97a38d46, 0xf9c66bd3, + 0x5fe7038f, 0x9c951592, 0x7aebbf6d, 0x59da9552, + 0x832dd4be, 0x21d35874, 0x692949e0, 0xc8448ec9, + 0x896a75c2, 0x7978f48e, 0x3e6b9958, 0x71dd27b9, + 0x4fb6bee1, 0xad17f088, 0xac66c920, 0x3ab47dce, + 0x4a1863df, 0x3182e51a, 0x33609751, 0x7f456253, + 0x77e0b164, 0xae84bb6b, 0xa01cfe81, 0x2b94f908, + 0x68587048, 0xfd198f45, 0x6c8794de, 0xf8b7527b, + 0xd323ab73, 0x02e2724b, 0x8f57e31f, 0xab2a6655, + 0x2807b2eb, 0xc2032fb5, 0x7b9a86c5, 0x08a5d337, + 0x87f23028, 0xa5b223bf, 0x6aba0203, 0x825ced16, + 0x1c2b8acf, 0xb492a779, 0xf2f0f307, 0xe2a14e69, + 0xf4cd65da, 0xbed50605, 0x621fd134, 0xfe8ac4a6, + 0x539d342e, 0x55a0a2f3, 0xe132058a, 0xeb75a4f6, + 0xec390b83, 0xefaa4060, 0x9f065e71, 0x1051bd6e, + 0x8af93e21, 0x063d96dd, 0x05aedd3e, 0xbd464de6, + 0x8db59154, 0x5d0571c4, 0xd46f0406, 0x15ff6050, + 0xfb241998, 0xe997d6bd, 0x43cc8940, 0x9e7767d9, + 0x42bdb0e8, 0x8b880789, 0x5b38e719, 0xeedb79c8, + 0x0a47a17c, 0x0fe97c42, 0x1ec9f884, 0x00000000, + 0x86830980, 0xed48322b, 0x70ac1e11, 0x724e6c5a, + 0xfffbfd0e, 0x38560f85, 0xd51e3dae, 0x3927362d, + 0xd9640a0f, 0xa621685c, 0x54d19b5b, 0x2e3a2436, + 0x67b10c0a, 0xe70f9357, 0x96d2b4ee, 0x919e1b9b, + 0xc54f80c0, 0x20a261dc, 0x4b695a77, 0x1a161c12, + 0xba0ae293, 0x2ae5c0a0, 0xe0433c22, 0x171d121b, + 0x0d0b0e09, 0xc7adf28b, 0xa8b92db6, 0xa9c8141e, + 0x198557f1, 0x074caf75, 0xddbbee99, 0x60fda37f, + 0x269ff701, 0xf5bc5c72, 0x3bc54466, 0x7e345bfb, + 0x29768b43, 0xc6dccb23, 0xfc68b6ed, 0xf163b8e4, + 0xdccad731, 0x85104263, 0x22401397, 0x112084c6, + 0x247d854a, 0x3df8d2bb, 0x3211aef9, 0xa16dc729, + 0x2f4b1d9e, 0x30f3dcb2, 0x52ec0d86, 0xe3d077c1, + 0x166c2bb3, 0xb999a970, 0x48fa1194, 0x642247e9, + 0x8cc4a8fc, 0x3f1aa0f0, 0x2cd8567d, 0x90ef2233, + 0x4ec78749, 0xd1c1d938, 0xa2fe8cca, 0x0b3698d4, + 0x81cfa6f5, 0xde28a57a, 0x8e26dab7, 0xbfa43fad, + 0x9de42c3a, 0x920d5078, 0xcc9b6a5f, 0x4662547e, + 0x13c2f68d, 0xb8e890d8, 0xf75e2e39, 0xaff582c3, + 0x80be9f5d, 0x937c69d0, 0x2da96fd5, 0x12b3cf25, + 0x993bc8ac, 0x7da71018, 0x636ee89c, 0xbb7bdb3b, + 0x7809cd26, 0x18f46e59, 0xb701ec9a, 0x9aa8834f, + 0x6e65e695, 0xe67eaaff, 0xcf0821bc, 0xe8e6ef15, + 0x9bd9bae7, 0x36ce4a6f, 0x09d4ea9f, 0x7cd629b0, + 0xb2af31a4, 0x23312a3f, 0x9430c6a5, 0x66c035a2, + 0xbc37744e, 0xcaa6fc82, 0xd0b0e090, 0xd81533a7, + 0x984af104, 0xdaf741ec, 0x500e7fcd, 0xf62f1791, + 0xd68d764d, 0xb04d43ef, 0x4d54ccaa, 0x04dfe496, + 0xb5e39ed1, 0x881b4c6a, 0x1fb8c12c, 0x517f4665, + 0xea049d5e, 0x355d018c, 0x7473fa87, 0x412efb0b, + 0x1d5ab367, 0xd25292db, 0x5633e910, 0x47136dd6, + 0x618c9ad7, 0x0c7a37a1, 0x148e59f8, 0x3c89eb13, + 0x27eecea9, 0xc935b761, 0xe5ede11c, 0xb13c7a47, + 0xdf599cd2, 0x733f55f2, 0xce791814, 0x37bf73c7, + 0xcdea53f7, 0xaa5b5ffd, 0x6f14df3d, 0xdb867844, + 0xf381caaf, 0xc43eb968, 0x342c3824, 0x405fc2a3, + 0xc372161d, 0x250cbce2, 0x498b283c, 0x9541ff0d, + 0x017139a8, 0xb3de080c, 0xe49cd8b4, 0xc1906456, + 0x84617bcb, 0xb670d532, 0x5c74486c, 0x5742d0b8, +}; + +__constant u32 td3[256] = +{ + 0xf4a75051, 0x4165537e, 0x17a4c31a, 0x275e963a, + 0xab6bcb3b, 0x9d45f11f, 0xfa58abac, 0xe303934b, + 0x30fa5520, 0x766df6ad, 0xcc769188, 0x024c25f5, + 0xe5d7fc4f, 0x2acbd7c5, 0x35448026, 0x62a38fb5, + 0xb15a49de, 0xba1b6725, 0xea0e9845, 0xfec0e15d, + 0x2f7502c3, 0x4cf01281, 0x4697a38d, 0xd3f9c66b, + 0x8f5fe703, 0x929c9515, 0x6d7aebbf, 0x5259da95, + 0xbe832dd4, 0x7421d358, 0xe0692949, 0xc9c8448e, + 0xc2896a75, 0x8e7978f4, 0x583e6b99, 0xb971dd27, + 0xe14fb6be, 0x88ad17f0, 0x20ac66c9, 0xce3ab47d, + 0xdf4a1863, 0x1a3182e5, 0x51336097, 0x537f4562, + 0x6477e0b1, 0x6bae84bb, 0x81a01cfe, 0x082b94f9, + 0x48685870, 0x45fd198f, 0xde6c8794, 0x7bf8b752, + 0x73d323ab, 0x4b02e272, 0x1f8f57e3, 0x55ab2a66, + 0xeb2807b2, 0xb5c2032f, 0xc57b9a86, 0x3708a5d3, + 0x2887f230, 0xbfa5b223, 0x036aba02, 0x16825ced, + 0xcf1c2b8a, 0x79b492a7, 0x07f2f0f3, 0x69e2a14e, + 0xdaf4cd65, 0x05bed506, 0x34621fd1, 0xa6fe8ac4, + 0x2e539d34, 0xf355a0a2, 0x8ae13205, 0xf6eb75a4, + 0x83ec390b, 0x60efaa40, 0x719f065e, 0x6e1051bd, + 0x218af93e, 0xdd063d96, 0x3e05aedd, 0xe6bd464d, + 0x548db591, 0xc45d0571, 0x06d46f04, 0x5015ff60, + 0x98fb2419, 0xbde997d6, 0x4043cc89, 0xd99e7767, + 0xe842bdb0, 0x898b8807, 0x195b38e7, 0xc8eedb79, + 0x7c0a47a1, 0x420fe97c, 0x841ec9f8, 0x00000000, + 0x80868309, 0x2bed4832, 0x1170ac1e, 0x5a724e6c, + 0x0efffbfd, 0x8538560f, 0xaed51e3d, 0x2d392736, + 0x0fd9640a, 0x5ca62168, 0x5b54d19b, 0x362e3a24, + 0x0a67b10c, 0x57e70f93, 0xee96d2b4, 0x9b919e1b, + 0xc0c54f80, 0xdc20a261, 0x774b695a, 0x121a161c, + 0x93ba0ae2, 0xa02ae5c0, 0x22e0433c, 0x1b171d12, + 0x090d0b0e, 0x8bc7adf2, 0xb6a8b92d, 0x1ea9c814, + 0xf1198557, 0x75074caf, 0x99ddbbee, 0x7f60fda3, + 0x01269ff7, 0x72f5bc5c, 0x663bc544, 0xfb7e345b, + 0x4329768b, 0x23c6dccb, 0xedfc68b6, 0xe4f163b8, + 0x31dccad7, 0x63851042, 0x97224013, 0xc6112084, + 0x4a247d85, 0xbb3df8d2, 0xf93211ae, 0x29a16dc7, + 0x9e2f4b1d, 0xb230f3dc, 0x8652ec0d, 0xc1e3d077, + 0xb3166c2b, 0x70b999a9, 0x9448fa11, 0xe9642247, + 0xfc8cc4a8, 0xf03f1aa0, 0x7d2cd856, 0x3390ef22, + 0x494ec787, 0x38d1c1d9, 0xcaa2fe8c, 0xd40b3698, + 0xf581cfa6, 0x7ade28a5, 0xb78e26da, 0xadbfa43f, + 0x3a9de42c, 0x78920d50, 0x5fcc9b6a, 0x7e466254, + 0x8d13c2f6, 0xd8b8e890, 0x39f75e2e, 0xc3aff582, + 0x5d80be9f, 0xd0937c69, 0xd52da96f, 0x2512b3cf, + 0xac993bc8, 0x187da710, 0x9c636ee8, 0x3bbb7bdb, + 0x267809cd, 0x5918f46e, 0x9ab701ec, 0x4f9aa883, + 0x956e65e6, 0xffe67eaa, 0xbccf0821, 0x15e8e6ef, + 0xe79bd9ba, 0x6f36ce4a, 0x9f09d4ea, 0xb07cd629, + 0xa4b2af31, 0x3f23312a, 0xa59430c6, 0xa266c035, + 0x4ebc3774, 0x82caa6fc, 0x90d0b0e0, 0xa7d81533, + 0x04984af1, 0xecdaf741, 0xcd500e7f, 0x91f62f17, + 0x4dd68d76, 0xefb04d43, 0xaa4d54cc, 0x9604dfe4, + 0xd1b5e39e, 0x6a881b4c, 0x2c1fb8c1, 0x65517f46, + 0x5eea049d, 0x8c355d01, 0x877473fa, 0x0b412efb, + 0x671d5ab3, 0xdbd25292, 0x105633e9, 0xd647136d, + 0xd7618c9a, 0xa10c7a37, 0xf8148e59, 0x133c89eb, + 0xa927eece, 0x61c935b7, 0x1ce5ede1, 0x47b13c7a, + 0xd2df599c, 0xf2733f55, 0x14ce7918, 0xc737bf73, + 0xf7cdea53, 0xfdaa5b5f, 0x3d6f14df, 0x44db8678, + 0xaff381ca, 0x68c43eb9, 0x24342c38, 0xa3405fc2, + 0x1dc37216, 0xe2250cbc, 0x3c498b28, 0x0d9541ff, + 0xa8017139, 0x0cb3de08, 0xb4e49cd8, 0x56c19064, + 0xcb84617b, 0x32b670d5, 0x6c5c7448, 0xb85742d0, +}; + +__constant u32 td4[256] = +{ + 0x52525252, 0x09090909, 0x6a6a6a6a, 0xd5d5d5d5, + 0x30303030, 0x36363636, 0xa5a5a5a5, 0x38383838, + 0xbfbfbfbf, 0x40404040, 0xa3a3a3a3, 0x9e9e9e9e, + 0x81818181, 0xf3f3f3f3, 0xd7d7d7d7, 0xfbfbfbfb, + 0x7c7c7c7c, 0xe3e3e3e3, 0x39393939, 0x82828282, + 0x9b9b9b9b, 0x2f2f2f2f, 0xffffffff, 0x87878787, + 0x34343434, 0x8e8e8e8e, 0x43434343, 0x44444444, + 0xc4c4c4c4, 0xdededede, 0xe9e9e9e9, 0xcbcbcbcb, + 0x54545454, 0x7b7b7b7b, 0x94949494, 0x32323232, + 0xa6a6a6a6, 0xc2c2c2c2, 0x23232323, 0x3d3d3d3d, + 0xeeeeeeee, 0x4c4c4c4c, 0x95959595, 0x0b0b0b0b, + 0x42424242, 0xfafafafa, 0xc3c3c3c3, 0x4e4e4e4e, + 0x08080808, 0x2e2e2e2e, 0xa1a1a1a1, 0x66666666, + 0x28282828, 0xd9d9d9d9, 0x24242424, 0xb2b2b2b2, + 0x76767676, 0x5b5b5b5b, 0xa2a2a2a2, 0x49494949, + 0x6d6d6d6d, 0x8b8b8b8b, 0xd1d1d1d1, 0x25252525, + 0x72727272, 0xf8f8f8f8, 0xf6f6f6f6, 0x64646464, + 0x86868686, 0x68686868, 0x98989898, 0x16161616, + 0xd4d4d4d4, 0xa4a4a4a4, 0x5c5c5c5c, 0xcccccccc, + 0x5d5d5d5d, 0x65656565, 0xb6b6b6b6, 0x92929292, + 0x6c6c6c6c, 0x70707070, 0x48484848, 0x50505050, + 0xfdfdfdfd, 0xedededed, 0xb9b9b9b9, 0xdadadada, + 0x5e5e5e5e, 0x15151515, 0x46464646, 0x57575757, + 0xa7a7a7a7, 0x8d8d8d8d, 0x9d9d9d9d, 0x84848484, + 0x90909090, 0xd8d8d8d8, 0xabababab, 0x00000000, + 0x8c8c8c8c, 0xbcbcbcbc, 0xd3d3d3d3, 0x0a0a0a0a, + 0xf7f7f7f7, 0xe4e4e4e4, 0x58585858, 0x05050505, + 0xb8b8b8b8, 0xb3b3b3b3, 0x45454545, 0x06060606, + 0xd0d0d0d0, 0x2c2c2c2c, 0x1e1e1e1e, 0x8f8f8f8f, + 0xcacacaca, 0x3f3f3f3f, 0x0f0f0f0f, 0x02020202, + 0xc1c1c1c1, 0xafafafaf, 0xbdbdbdbd, 0x03030303, + 0x01010101, 0x13131313, 0x8a8a8a8a, 0x6b6b6b6b, + 0x3a3a3a3a, 0x91919191, 0x11111111, 0x41414141, + 0x4f4f4f4f, 0x67676767, 0xdcdcdcdc, 0xeaeaeaea, + 0x97979797, 0xf2f2f2f2, 0xcfcfcfcf, 0xcececece, + 0xf0f0f0f0, 0xb4b4b4b4, 0xe6e6e6e6, 0x73737373, + 0x96969696, 0xacacacac, 0x74747474, 0x22222222, + 0xe7e7e7e7, 0xadadadad, 0x35353535, 0x85858585, + 0xe2e2e2e2, 0xf9f9f9f9, 0x37373737, 0xe8e8e8e8, + 0x1c1c1c1c, 0x75757575, 0xdfdfdfdf, 0x6e6e6e6e, + 0x47474747, 0xf1f1f1f1, 0x1a1a1a1a, 0x71717171, + 0x1d1d1d1d, 0x29292929, 0xc5c5c5c5, 0x89898989, + 0x6f6f6f6f, 0xb7b7b7b7, 0x62626262, 0x0e0e0e0e, + 0xaaaaaaaa, 0x18181818, 0xbebebebe, 0x1b1b1b1b, + 0xfcfcfcfc, 0x56565656, 0x3e3e3e3e, 0x4b4b4b4b, + 0xc6c6c6c6, 0xd2d2d2d2, 0x79797979, 0x20202020, + 0x9a9a9a9a, 0xdbdbdbdb, 0xc0c0c0c0, 0xfefefefe, + 0x78787878, 0xcdcdcdcd, 0x5a5a5a5a, 0xf4f4f4f4, + 0x1f1f1f1f, 0xdddddddd, 0xa8a8a8a8, 0x33333333, + 0x88888888, 0x07070707, 0xc7c7c7c7, 0x31313131, + 0xb1b1b1b1, 0x12121212, 0x10101010, 0x59595959, + 0x27272727, 0x80808080, 0xecececec, 0x5f5f5f5f, + 0x60606060, 0x51515151, 0x7f7f7f7f, 0xa9a9a9a9, + 0x19191919, 0xb5b5b5b5, 0x4a4a4a4a, 0x0d0d0d0d, + 0x2d2d2d2d, 0xe5e5e5e5, 0x7a7a7a7a, 0x9f9f9f9f, + 0x93939393, 0xc9c9c9c9, 0x9c9c9c9c, 0xefefefef, + 0xa0a0a0a0, 0xe0e0e0e0, 0x3b3b3b3b, 0x4d4d4d4d, + 0xaeaeaeae, 0x2a2a2a2a, 0xf5f5f5f5, 0xb0b0b0b0, + 0xc8c8c8c8, 0xebebebeb, 0xbbbbbbbb, 0x3c3c3c3c, + 0x83838383, 0x53535353, 0x99999999, 0x61616161, + 0x17171717, 0x2b2b2b2b, 0x04040404, 0x7e7e7e7e, + 0xbabababa, 0x77777777, 0xd6d6d6d6, 0x26262626, + 0xe1e1e1e1, 0x69696969, 0x14141414, 0x63636363, + 0x55555555, 0x21212121, 0x0c0c0c0c, 0x7d7d7d7d, +}; + +__constant u32 rcon[] = +{ + 0x01000000, 0x02000000, 0x04000000, 0x08000000, + 0x10000000, 0x20000000, 0x40000000, 0x80000000, + 0x1b000000, 0x36000000, +}; + +static void AES128_ExpandKey (u32 *userkey, u32 *rek, __local u32 s_te0[256], __local u32 s_te1[256], __local u32 s_te2[256], __local u32 s_te3[256], __local u32 s_te4[256]) +{ + rek[0] = userkey[0]; + rek[1] = userkey[1]; + rek[2] = userkey[2]; + rek[3] = userkey[3]; + + for (u32 i = 0, j = 0; i < 10; i += 1, j += 4) + { + u32 temp = rek[j + 3]; + + temp = (s_te2[(temp >> 16) & 0xff] & 0xff000000) + ^ (s_te3[(temp >> 8) & 0xff] & 0x00ff0000) + ^ (s_te0[(temp >> 0) & 0xff] & 0x0000ff00) + ^ (s_te1[(temp >> 24) & 0xff] & 0x000000ff); + + rek[j + 4] = rek[j + 0] + ^ temp + ^ rcon[i]; + + rek[j + 5] = rek[j + 1] ^ rek[j + 4]; + rek[j + 6] = rek[j + 2] ^ rek[j + 5]; + rek[j + 7] = rek[j + 3] ^ rek[j + 6]; + } +} + +static void AES128_InvertKey (u32 *rdk, __local u32 s_td0[256], __local u32 s_td1[256], __local u32 s_td2[256], __local u32 s_td3[256], __local u32 s_td4[256], __local u32 s_te0[256], __local u32 s_te1[256], __local u32 s_te2[256], __local u32 s_te3[256], __local u32 s_te4[256]) +{ + for (u32 i = 0, j = 40; i < j; i += 4, j -= 4) + { + u32 temp; + + temp = rdk[i + 0]; rdk[i + 0] = rdk[j + 0]; rdk[j + 0] = temp; + temp = rdk[i + 1]; rdk[i + 1] = rdk[j + 1]; rdk[j + 1] = temp; + temp = rdk[i + 2]; rdk[i + 2] = rdk[j + 2]; rdk[j + 2] = temp; + temp = rdk[i + 3]; rdk[i + 3] = rdk[j + 3]; rdk[j + 3] = temp; + } + + for (u32 i = 1, j = 4; i < 10; i += 1, j += 4) + { + rdk[j + 0] = + s_td0[s_te1[(rdk[j + 0] >> 24) & 0xff] & 0xff] ^ + s_td1[s_te1[(rdk[j + 0] >> 16) & 0xff] & 0xff] ^ + s_td2[s_te1[(rdk[j + 0] >> 8) & 0xff] & 0xff] ^ + s_td3[s_te1[(rdk[j + 0] >> 0) & 0xff] & 0xff]; + + rdk[j + 1] = + s_td0[s_te1[(rdk[j + 1] >> 24) & 0xff] & 0xff] ^ + s_td1[s_te1[(rdk[j + 1] >> 16) & 0xff] & 0xff] ^ + s_td2[s_te1[(rdk[j + 1] >> 8) & 0xff] & 0xff] ^ + s_td3[s_te1[(rdk[j + 1] >> 0) & 0xff] & 0xff]; + + rdk[j + 2] = + s_td0[s_te1[(rdk[j + 2] >> 24) & 0xff] & 0xff] ^ + s_td1[s_te1[(rdk[j + 2] >> 16) & 0xff] & 0xff] ^ + s_td2[s_te1[(rdk[j + 2] >> 8) & 0xff] & 0xff] ^ + s_td3[s_te1[(rdk[j + 2] >> 0) & 0xff] & 0xff]; + + rdk[j + 3] = + s_td0[s_te1[(rdk[j + 3] >> 24) & 0xff] & 0xff] ^ + s_td1[s_te1[(rdk[j + 3] >> 16) & 0xff] & 0xff] ^ + s_td2[s_te1[(rdk[j + 3] >> 8) & 0xff] & 0xff] ^ + s_td3[s_te1[(rdk[j + 3] >> 0) & 0xff] & 0xff]; + } +} + +static void AES128_decrypt (const u32 *in, u32 *out, const u32 *rdk, __local u32 s_td0[256], __local u32 s_td1[256], __local u32 s_td2[256], __local u32 s_td3[256], __local u32 s_td4[256]) +{ + u32 s0 = in[0] ^ rdk[0]; + u32 s1 = in[1] ^ rdk[1]; + u32 s2 = in[2] ^ rdk[2]; + u32 s3 = in[3] ^ rdk[3]; + + u32 t0; + u32 t1; + u32 t2; + u32 t3; + + t0 = s_td0[s0 >> 24] ^ s_td1[(s3 >> 16) & 0xff] ^ s_td2[(s2 >> 8) & 0xff] ^ s_td3[s1 & 0xff] ^ rdk[ 4]; + t1 = s_td0[s1 >> 24] ^ s_td1[(s0 >> 16) & 0xff] ^ s_td2[(s3 >> 8) & 0xff] ^ s_td3[s2 & 0xff] ^ rdk[ 5]; + t2 = s_td0[s2 >> 24] ^ s_td1[(s1 >> 16) & 0xff] ^ s_td2[(s0 >> 8) & 0xff] ^ s_td3[s3 & 0xff] ^ rdk[ 6]; + t3 = s_td0[s3 >> 24] ^ s_td1[(s2 >> 16) & 0xff] ^ s_td2[(s1 >> 8) & 0xff] ^ s_td3[s0 & 0xff] ^ rdk[ 7]; + s0 = s_td0[t0 >> 24] ^ s_td1[(t3 >> 16) & 0xff] ^ s_td2[(t2 >> 8) & 0xff] ^ s_td3[t1 & 0xff] ^ rdk[ 8]; + s1 = s_td0[t1 >> 24] ^ s_td1[(t0 >> 16) & 0xff] ^ s_td2[(t3 >> 8) & 0xff] ^ s_td3[t2 & 0xff] ^ rdk[ 9]; + s2 = s_td0[t2 >> 24] ^ s_td1[(t1 >> 16) & 0xff] ^ s_td2[(t0 >> 8) & 0xff] ^ s_td3[t3 & 0xff] ^ rdk[10]; + s3 = s_td0[t3 >> 24] ^ s_td1[(t2 >> 16) & 0xff] ^ s_td2[(t1 >> 8) & 0xff] ^ s_td3[t0 & 0xff] ^ rdk[11]; + t0 = s_td0[s0 >> 24] ^ s_td1[(s3 >> 16) & 0xff] ^ s_td2[(s2 >> 8) & 0xff] ^ s_td3[s1 & 0xff] ^ rdk[12]; + t1 = s_td0[s1 >> 24] ^ s_td1[(s0 >> 16) & 0xff] ^ s_td2[(s3 >> 8) & 0xff] ^ s_td3[s2 & 0xff] ^ rdk[13]; + t2 = s_td0[s2 >> 24] ^ s_td1[(s1 >> 16) & 0xff] ^ s_td2[(s0 >> 8) & 0xff] ^ s_td3[s3 & 0xff] ^ rdk[14]; + t3 = s_td0[s3 >> 24] ^ s_td1[(s2 >> 16) & 0xff] ^ s_td2[(s1 >> 8) & 0xff] ^ s_td3[s0 & 0xff] ^ rdk[15]; + s0 = s_td0[t0 >> 24] ^ s_td1[(t3 >> 16) & 0xff] ^ s_td2[(t2 >> 8) & 0xff] ^ s_td3[t1 & 0xff] ^ rdk[16]; + s1 = s_td0[t1 >> 24] ^ s_td1[(t0 >> 16) & 0xff] ^ s_td2[(t3 >> 8) & 0xff] ^ s_td3[t2 & 0xff] ^ rdk[17]; + s2 = s_td0[t2 >> 24] ^ s_td1[(t1 >> 16) & 0xff] ^ s_td2[(t0 >> 8) & 0xff] ^ s_td3[t3 & 0xff] ^ rdk[18]; + s3 = s_td0[t3 >> 24] ^ s_td1[(t2 >> 16) & 0xff] ^ s_td2[(t1 >> 8) & 0xff] ^ s_td3[t0 & 0xff] ^ rdk[19]; + t0 = s_td0[s0 >> 24] ^ s_td1[(s3 >> 16) & 0xff] ^ s_td2[(s2 >> 8) & 0xff] ^ s_td3[s1 & 0xff] ^ rdk[20]; + t1 = s_td0[s1 >> 24] ^ s_td1[(s0 >> 16) & 0xff] ^ s_td2[(s3 >> 8) & 0xff] ^ s_td3[s2 & 0xff] ^ rdk[21]; + t2 = s_td0[s2 >> 24] ^ s_td1[(s1 >> 16) & 0xff] ^ s_td2[(s0 >> 8) & 0xff] ^ s_td3[s3 & 0xff] ^ rdk[22]; + t3 = s_td0[s3 >> 24] ^ s_td1[(s2 >> 16) & 0xff] ^ s_td2[(s1 >> 8) & 0xff] ^ s_td3[s0 & 0xff] ^ rdk[23]; + s0 = s_td0[t0 >> 24] ^ s_td1[(t3 >> 16) & 0xff] ^ s_td2[(t2 >> 8) & 0xff] ^ s_td3[t1 & 0xff] ^ rdk[24]; + s1 = s_td0[t1 >> 24] ^ s_td1[(t0 >> 16) & 0xff] ^ s_td2[(t3 >> 8) & 0xff] ^ s_td3[t2 & 0xff] ^ rdk[25]; + s2 = s_td0[t2 >> 24] ^ s_td1[(t1 >> 16) & 0xff] ^ s_td2[(t0 >> 8) & 0xff] ^ s_td3[t3 & 0xff] ^ rdk[26]; + s3 = s_td0[t3 >> 24] ^ s_td1[(t2 >> 16) & 0xff] ^ s_td2[(t1 >> 8) & 0xff] ^ s_td3[t0 & 0xff] ^ rdk[27]; + t0 = s_td0[s0 >> 24] ^ s_td1[(s3 >> 16) & 0xff] ^ s_td2[(s2 >> 8) & 0xff] ^ s_td3[s1 & 0xff] ^ rdk[28]; + t1 = s_td0[s1 >> 24] ^ s_td1[(s0 >> 16) & 0xff] ^ s_td2[(s3 >> 8) & 0xff] ^ s_td3[s2 & 0xff] ^ rdk[29]; + t2 = s_td0[s2 >> 24] ^ s_td1[(s1 >> 16) & 0xff] ^ s_td2[(s0 >> 8) & 0xff] ^ s_td3[s3 & 0xff] ^ rdk[30]; + t3 = s_td0[s3 >> 24] ^ s_td1[(s2 >> 16) & 0xff] ^ s_td2[(s1 >> 8) & 0xff] ^ s_td3[s0 & 0xff] ^ rdk[31]; + s0 = s_td0[t0 >> 24] ^ s_td1[(t3 >> 16) & 0xff] ^ s_td2[(t2 >> 8) & 0xff] ^ s_td3[t1 & 0xff] ^ rdk[32]; + s1 = s_td0[t1 >> 24] ^ s_td1[(t0 >> 16) & 0xff] ^ s_td2[(t3 >> 8) & 0xff] ^ s_td3[t2 & 0xff] ^ rdk[33]; + s2 = s_td0[t2 >> 24] ^ s_td1[(t1 >> 16) & 0xff] ^ s_td2[(t0 >> 8) & 0xff] ^ s_td3[t3 & 0xff] ^ rdk[34]; + s3 = s_td0[t3 >> 24] ^ s_td1[(t2 >> 16) & 0xff] ^ s_td2[(t1 >> 8) & 0xff] ^ s_td3[t0 & 0xff] ^ rdk[35]; + t0 = s_td0[s0 >> 24] ^ s_td1[(s3 >> 16) & 0xff] ^ s_td2[(s2 >> 8) & 0xff] ^ s_td3[s1 & 0xff] ^ rdk[36]; + t1 = s_td0[s1 >> 24] ^ s_td1[(s0 >> 16) & 0xff] ^ s_td2[(s3 >> 8) & 0xff] ^ s_td3[s2 & 0xff] ^ rdk[37]; + t2 = s_td0[s2 >> 24] ^ s_td1[(s1 >> 16) & 0xff] ^ s_td2[(s0 >> 8) & 0xff] ^ s_td3[s3 & 0xff] ^ rdk[38]; + t3 = s_td0[s3 >> 24] ^ s_td1[(s2 >> 16) & 0xff] ^ s_td2[(s1 >> 8) & 0xff] ^ s_td3[s0 & 0xff] ^ rdk[39]; + + out[0] = (s_td4[(t0 >> 24) & 0xff] & 0xff000000) + ^ (s_td4[(t3 >> 16) & 0xff] & 0x00ff0000) + ^ (s_td4[(t2 >> 8) & 0xff] & 0x0000ff00) + ^ (s_td4[(t1 >> 0) & 0xff] & 0x000000ff) + ^ rdk[40]; + + out[1] = (s_td4[(t1 >> 24) & 0xff] & 0xff000000) + ^ (s_td4[(t0 >> 16) & 0xff] & 0x00ff0000) + ^ (s_td4[(t3 >> 8) & 0xff] & 0x0000ff00) + ^ (s_td4[(t2 >> 0) & 0xff] & 0x000000ff) + ^ rdk[41]; + + out[2] = (s_td4[(t2 >> 24) & 0xff] & 0xff000000) + ^ (s_td4[(t1 >> 16) & 0xff] & 0x00ff0000) + ^ (s_td4[(t0 >> 8) & 0xff] & 0x0000ff00) + ^ (s_td4[(t3 >> 0) & 0xff] & 0x000000ff) + ^ rdk[42]; + + out[3] = (s_td4[(t3 >> 24) & 0xff] & 0xff000000) + ^ (s_td4[(t2 >> 16) & 0xff] & 0x00ff0000) + ^ (s_td4[(t1 >> 8) & 0xff] & 0x0000ff00) + ^ (s_td4[(t0 >> 0) & 0xff] & 0x000000ff) + ^ rdk[43]; +} + +static void sha1_transform (const u32x w[16], u32x digest[5]) +{ + u32x A = digest[0]; + u32x B = digest[1]; + u32x C = digest[2]; + u32x D = digest[3]; + u32x E = digest[4]; + + u32x w0_t = w[ 0]; + u32x w1_t = w[ 1]; + u32x w2_t = w[ 2]; + u32x w3_t = w[ 3]; + u32x w4_t = w[ 4]; + u32x w5_t = w[ 5]; + u32x w6_t = w[ 6]; + u32x w7_t = w[ 7]; + u32x w8_t = w[ 8]; + u32x w9_t = w[ 9]; + u32x wa_t = w[10]; + u32x wb_t = w[11]; + u32x wc_t = w[12]; + u32x wd_t = w[13]; + u32x we_t = w[14]; + u32x wf_t = w[15]; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, A, B, C, D, E, w0_t); + SHA1_STEP (SHA1_F0o, E, A, B, C, D, w1_t); + SHA1_STEP (SHA1_F0o, D, E, A, B, C, w2_t); + SHA1_STEP (SHA1_F0o, C, D, E, A, B, w3_t); + SHA1_STEP (SHA1_F0o, B, C, D, E, A, w4_t); + SHA1_STEP (SHA1_F0o, A, B, C, D, E, w5_t); + SHA1_STEP (SHA1_F0o, E, A, B, C, D, w6_t); + SHA1_STEP (SHA1_F0o, D, E, A, B, C, w7_t); + SHA1_STEP (SHA1_F0o, C, D, E, A, B, w8_t); + SHA1_STEP (SHA1_F0o, B, C, D, E, A, w9_t); + SHA1_STEP (SHA1_F0o, A, B, C, D, E, wa_t); + SHA1_STEP (SHA1_F0o, E, A, B, C, D, wb_t); + SHA1_STEP (SHA1_F0o, D, E, A, B, C, wc_t); + SHA1_STEP (SHA1_F0o, C, D, E, A, B, wd_t); + SHA1_STEP (SHA1_F0o, B, C, D, E, A, we_t); + SHA1_STEP (SHA1_F0o, A, B, C, D, E, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F0o, E, A, B, C, D, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F0o, D, E, A, B, C, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F0o, C, D, E, A, B, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F0o, B, C, D, E, A, w3_t); + + #undef K + #define K SHA1C01 + + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w7_t); + + #undef K + #define K SHA1C02 + + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, wb_t); + + #undef K + #define K SHA1C03 + + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, wf_t); + + digest[0] += A; + digest[1] += B; + digest[2] += C; + digest[3] += D; + digest[4] += E; +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m12500_init (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global rar3_tmp_t *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global pbkdf2_sha1_t *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + tmps[gid].dgst[0][0] = SHA1M_A; + tmps[gid].dgst[0][1] = SHA1M_B; + tmps[gid].dgst[0][2] = SHA1M_C; + tmps[gid].dgst[0][3] = SHA1M_D; + tmps[gid].dgst[0][4] = SHA1M_E; +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m12500_loop (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global rar3_tmp_t *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global pbkdf2_sha1_t *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32 pw_buf[5]; + + pw_buf[0] = pws[gid].i[0]; + pw_buf[1] = pws[gid].i[1]; + pw_buf[2] = pws[gid].i[2]; + pw_buf[3] = pws[gid].i[3]; + pw_buf[4] = pws[gid].i[4]; + + const u32 pw_len = pws[gid].pw_len; + + u32 salt_buf[2]; + + salt_buf[0] = salt_bufs[salt_pos].salt_buf[0]; + salt_buf[1] = salt_bufs[salt_pos].salt_buf[1]; + + const u32 salt_len = 8; + + // this is large enough to hold all possible w[] arrays for 64 iterations + + #define LARGEBLOCK_ELEMS ((40 + 8 + 3) * 16) + + u32 largeblock[LARGEBLOCK_ELEMS]; + + for (u32 i = 0; i < LARGEBLOCK_ELEMS; i++) largeblock[i] = 0; + + for (u32 i = 0, p = 0; i < 64; i++) + { + for (u32 j = 0; j < pw_len; j++, p += 2) + { + PUTCHAR_BE (largeblock, p, GETCHAR (pw_buf, j)); + } + + for (u32 j = 0; j < salt_len; j++, p += 1) + { + PUTCHAR_BE (largeblock, p, GETCHAR (salt_buf, j)); + } + + PUTCHAR_BE (largeblock, p + 2, (loop_pos >> 16) & 0xff); + + p += 3; + } + + const u32 p3 = (pw_len * 2) + salt_len + 3; + + const u32 init_pos = loop_pos / (ROUNDS / 16); + + u32 dgst[5]; + + dgst[0] = tmps[gid].dgst[init_pos][0]; + dgst[1] = tmps[gid].dgst[init_pos][1]; + dgst[2] = tmps[gid].dgst[init_pos][2]; + dgst[3] = tmps[gid].dgst[init_pos][3]; + dgst[4] = tmps[gid].dgst[init_pos][4]; + + u32 iter = loop_pos; + + for (u32 i = 0; i < 256; i += 4) + { + for (u32 j = 0; j < 64; j++) + { + const u32 p = ((j + 1) * p3) - 2; + + PUTCHAR_BE (largeblock, p, iter >> 8); + } + + for (u32 k = 0; k < 4; k++) + { + for (u32 j = 0; j < 64; j++) + { + const u32 p = ((j + 1) * p3) - 3; + + PUTCHAR_BE (largeblock, p, iter >> 0); + + iter++; + } + + for (u32 j = 0; j < p3; j++) + { + const u32 j16 = j * 16; + + sha1_transform (&largeblock[j16], dgst); + } + } + } + + tmps[gid].dgst[init_pos + 1][0] = dgst[0]; + tmps[gid].dgst[init_pos + 1][1] = dgst[1]; + tmps[gid].dgst[init_pos + 1][2] = dgst[2]; + tmps[gid].dgst[init_pos + 1][3] = dgst[3]; + tmps[gid].dgst[init_pos + 1][4] = dgst[4]; +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m12500_comp (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global rar3_tmp_t *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global pbkdf2_sha1_t *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + const u32 lid = get_local_id (0); + + /** + * aes shared + */ + + const u32 lid4 = lid * 4; + + __local u32 s_td0[256]; + __local u32 s_td1[256]; + __local u32 s_td2[256]; + __local u32 s_td3[256]; + __local u32 s_td4[256]; + + __local u32 s_te0[256]; + __local u32 s_te1[256]; + __local u32 s_te2[256]; + __local u32 s_te3[256]; + __local u32 s_te4[256]; + + s_td0[lid4 + 0] = td0[lid4 + 0]; + s_td0[lid4 + 1] = td0[lid4 + 1]; + s_td0[lid4 + 2] = td0[lid4 + 2]; + s_td0[lid4 + 3] = td0[lid4 + 3]; + + s_td1[lid4 + 0] = td1[lid4 + 0]; + s_td1[lid4 + 1] = td1[lid4 + 1]; + s_td1[lid4 + 2] = td1[lid4 + 2]; + s_td1[lid4 + 3] = td1[lid4 + 3]; + + s_td2[lid4 + 0] = td2[lid4 + 0]; + s_td2[lid4 + 1] = td2[lid4 + 1]; + s_td2[lid4 + 2] = td2[lid4 + 2]; + s_td2[lid4 + 3] = td2[lid4 + 3]; + + s_td3[lid4 + 0] = td3[lid4 + 0]; + s_td3[lid4 + 1] = td3[lid4 + 1]; + s_td3[lid4 + 2] = td3[lid4 + 2]; + s_td3[lid4 + 3] = td3[lid4 + 3]; + + s_td4[lid4 + 0] = td4[lid4 + 0]; + s_td4[lid4 + 1] = td4[lid4 + 1]; + s_td4[lid4 + 2] = td4[lid4 + 2]; + s_td4[lid4 + 3] = td4[lid4 + 3]; + + s_te0[lid4 + 0] = te0[lid4 + 0]; + s_te0[lid4 + 1] = te0[lid4 + 1]; + s_te0[lid4 + 2] = te0[lid4 + 2]; + s_te0[lid4 + 3] = te0[lid4 + 3]; + + s_te1[lid4 + 0] = te1[lid4 + 0]; + s_te1[lid4 + 1] = te1[lid4 + 1]; + s_te1[lid4 + 2] = te1[lid4 + 2]; + s_te1[lid4 + 3] = te1[lid4 + 3]; + + s_te2[lid4 + 0] = te2[lid4 + 0]; + s_te2[lid4 + 1] = te2[lid4 + 1]; + s_te2[lid4 + 2] = te2[lid4 + 2]; + s_te2[lid4 + 3] = te2[lid4 + 3]; + + s_te3[lid4 + 0] = te3[lid4 + 0]; + s_te3[lid4 + 1] = te3[lid4 + 1]; + s_te3[lid4 + 2] = te3[lid4 + 2]; + s_te3[lid4 + 3] = te3[lid4 + 3]; + + s_te4[lid4 + 0] = te4[lid4 + 0]; + s_te4[lid4 + 1] = te4[lid4 + 1]; + s_te4[lid4 + 2] = te4[lid4 + 2]; + s_te4[lid4 + 3] = te4[lid4 + 3]; + + barrier (CLK_LOCAL_MEM_FENCE); + + if (gid >= gid_max) return; + + const u32 pw_len = pws[gid].pw_len; + + const u32 salt_len = 8; + + const u32 p3 = (pw_len * 2) + salt_len + 3; + + u32x w_buf[16]; + + w_buf[ 0] = 0x80000000; + w_buf[ 1] = 0; + w_buf[ 2] = 0; + w_buf[ 3] = 0; + w_buf[ 4] = 0; + w_buf[ 5] = 0; + w_buf[ 6] = 0; + w_buf[ 7] = 0; + w_buf[ 8] = 0; + w_buf[ 9] = 0; + w_buf[10] = 0; + w_buf[11] = 0; + w_buf[12] = 0; + w_buf[13] = 0; + w_buf[14] = 0; + w_buf[15] = (p3 * ROUNDS) * 8; + + u32 dgst[5]; + + dgst[0] = tmps[gid].dgst[16][0]; + dgst[1] = tmps[gid].dgst[16][1]; + dgst[2] = tmps[gid].dgst[16][2]; + dgst[3] = tmps[gid].dgst[16][3]; + dgst[4] = tmps[gid].dgst[16][4]; + + sha1_transform (w_buf, dgst); + + u32x rk[60]; + + u32 data[4]; + + data[0] = salt_bufs[salt_pos].salt_buf[2]; + data[1] = salt_bufs[salt_pos].salt_buf[3]; + data[2] = salt_bufs[salt_pos].salt_buf[4]; + data[3] = salt_bufs[salt_pos].salt_buf[5]; + + u32x ukeyx[4]; + + ukeyx[0] = swap_workaround (dgst[0]); + ukeyx[1] = swap_workaround (dgst[1]); + ukeyx[2] = swap_workaround (dgst[2]); + ukeyx[3] = swap_workaround (dgst[3]); + + AES128_ExpandKey (ukeyx, rk, s_te0, s_te1, s_te2, s_te3, s_te4); + + AES128_InvertKey (rk, s_td0, s_td1, s_td2, s_td3, s_td4, s_te0, s_te1, s_te2, s_te3, s_te4); + + u32 out[4]; + + AES128_decrypt (data, out, rk, s_td0, s_td1, s_td2, s_td3, s_td4); + + u32 iv[4]; + + iv[0] = 0; + iv[1] = 0; + iv[2] = 0; + iv[3] = 0; + + for (int i = 0; i < 16; i++) + { + u32 pw_buf[5]; + + pw_buf[0] = pws[gid].i[0]; + pw_buf[1] = pws[gid].i[1]; + pw_buf[2] = pws[gid].i[2]; + pw_buf[3] = pws[gid].i[3]; + pw_buf[4] = pws[gid].i[4]; + + const u32 pw_len = pws[gid].pw_len; + + u32 salt_buf[2]; + + salt_buf[0] = salt_bufs[salt_pos].salt_buf[0]; + salt_buf[1] = salt_bufs[salt_pos].salt_buf[1]; + + const u32 salt_len = 8; + + const u32 p3 = (pw_len * 2) + salt_len + 3; + + u32x w[16]; + + w[ 0] = 0; + w[ 1] = 0; + w[ 2] = 0; + w[ 3] = 0; + w[ 4] = 0; + w[ 5] = 0; + w[ 6] = 0; + w[ 7] = 0; + w[ 8] = 0; + w[ 9] = 0; + w[10] = 0; + w[11] = 0; + w[12] = 0; + w[13] = 0; + w[14] = 0; + w[15] = 0; + + u32 p = 0; + + for (u32 j = 0; j < pw_len; j++, p += 2) + { + PUTCHAR_BE (w, p, GETCHAR (pw_buf, j)); + } + + for (u32 j = 0; j < salt_len; j++, p += 1) + { + PUTCHAR_BE (w, p, GETCHAR (salt_buf, j)); + } + + const u32 iter_pos = i * (ROUNDS / 16); + + PUTCHAR_BE (w, p + 0, (iter_pos >> 0) & 0xff); + PUTCHAR_BE (w, p + 1, (iter_pos >> 8) & 0xff); + PUTCHAR_BE (w, p + 2, (iter_pos >> 16) & 0xff); + + PUTCHAR_BE (w, p3, 0x80); + + w[15] = ((iter_pos + 1) * p3) * 8; + + u32 dgst[5]; + + dgst[0] = tmps[gid].dgst[i][0]; + dgst[1] = tmps[gid].dgst[i][1]; + dgst[2] = tmps[gid].dgst[i][2]; + dgst[3] = tmps[gid].dgst[i][3]; + dgst[4] = tmps[gid].dgst[i][4]; + + sha1_transform (w, dgst); + + PUTCHAR (iv, i, dgst[4] & 0xff); + } + + out[0] ^= swap_workaround (iv[0]); + out[1] ^= swap_workaround (iv[1]); + out[2] ^= swap_workaround (iv[2]); + out[3] ^= swap_workaround (iv[3]); + + const u32x r0 = out[0]; + const u32x r1 = out[1]; + const u32x r2 = 0; + const u32x r3 = 0; + + #define il_pos 0 + + #include VECT_COMPARE_M +} diff --git a/amd/m12600_a0.cl b/amd/m12600_a0.cl new file mode 100644 index 0000000000..200be916c6 --- /dev/null +++ b/amd/m12600_a0.cl @@ -0,0 +1,844 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _SHA256_SHA1_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW4 +#define VECT_SIZE4 +#endif + +#ifdef VLIW5 +#define VECT_SIZE4 +#endif + +#define DGST_R0 3 +#define DGST_R1 7 +#define DGST_R2 2 +#define DGST_R3 6 + +#include "include/kernel_functions.c" +#include "types_amd.c" +#include "common_amd.c" +#include "include/rp_gpu.h" +#include "rp_amd.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +#ifdef VECT_SIZE1 +#define uint_to_hex_upper8(i) l_bin2asc[(i)] +#endif + +#ifdef VECT_SIZE2 +#define uint_to_hex_upper8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1]) +#endif + +#ifdef VECT_SIZE4 +#define uint_to_hex_upper8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3]) +#endif + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m12600_m04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + u32x pw_buf1[4]; + + pw_buf1[0] = pws[gid].i[ 4]; + pw_buf1[1] = pws[gid].i[ 5]; + pw_buf1[2] = pws[gid].i[ 6]; + pw_buf1[3] = pws[gid].i[ 7]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * salt + */ + + u32 pc256[8]; + + pc256[0] = salt_bufs[salt_pos].salt_buf_pc[0]; + pc256[1] = salt_bufs[salt_pos].salt_buf_pc[1]; + pc256[2] = salt_bufs[salt_pos].salt_buf_pc[2]; + pc256[3] = salt_bufs[salt_pos].salt_buf_pc[3]; + pc256[4] = salt_bufs[salt_pos].salt_buf_pc[4]; + pc256[5] = salt_bufs[salt_pos].salt_buf_pc[5]; + pc256[6] = salt_bufs[salt_pos].salt_buf_pc[6]; + pc256[7] = salt_bufs[salt_pos].salt_buf_pc[7]; + + /** + * bin2asc table + */ + + __local u32 l_bin2asc[256]; + + const u32 lid4 = lid * 4; + + const u32 lid40 = lid4 + 0; + const u32 lid41 = lid4 + 1; + const u32 lid42 = lid4 + 2; + const u32 lid43 = lid4 + 3; + + const u32 v400 = (lid40 >> 0) & 15; + const u32 v401 = (lid40 >> 4) & 15; + const u32 v410 = (lid41 >> 0) & 15; + const u32 v411 = (lid41 >> 4) & 15; + const u32 v420 = (lid42 >> 0) & 15; + const u32 v421 = (lid42 >> 4) & 15; + const u32 v430 = (lid43 >> 0) & 15; + const u32 v431 = (lid43 >> 4) & 15; + + l_bin2asc[lid40] = ((v400 < 10) ? '0' + v400 : 'A' - 10 + v400) << 8 + | ((v401 < 10) ? '0' + v401 : 'A' - 10 + v401) << 0; + l_bin2asc[lid41] = ((v410 < 10) ? '0' + v410 : 'A' - 10 + v410) << 8 + | ((v411 < 10) ? '0' + v411 : 'A' - 10 + v411) << 0; + l_bin2asc[lid42] = ((v420 < 10) ? '0' + v420 : 'A' - 10 + v420) << 8 + | ((v421 < 10) ? '0' + v421 : 'A' - 10 + v421) << 0; + l_bin2asc[lid43] = ((v430 < 10) ? '0' + v430 : 'A' - 10 + v430) << 8 + | ((v431 < 10) ? '0' + v431 : 'A' - 10 + v431) << 0; + + barrier (CLK_LOCAL_MEM_FENCE); + + if (gid >= gid_max) return; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + + w0[0] = pw_buf0[0]; + w0[1] = pw_buf0[1]; + w0[2] = pw_buf0[2]; + w0[3] = pw_buf0[3]; + + u32x w1[4]; + + w1[0] = pw_buf1[0]; + w1[1] = pw_buf1[1]; + w1[2] = pw_buf1[2]; + w1[3] = pw_buf1[3]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 out_len = apply_rules (rules_buf[il_pos].cmds, w0, w1, pw_len); + + append_0x80_2 (w0, w1, out_len); + + /** + * sha1 + */ + + u32x w0_t = swap_workaround (w0[0]); + u32x w1_t = swap_workaround (w0[1]); + u32x w2_t = swap_workaround (w0[2]); + u32x w3_t = swap_workaround (w0[3]); + u32x w4_t = swap_workaround (w1[0]); + u32x w5_t = swap_workaround (w1[1]); + u32x w6_t = swap_workaround (w1[2]); + u32x w7_t = swap_workaround (w1[3]); + u32x w8_t = swap_workaround (w2[0]); + u32x w9_t = swap_workaround (w2[1]); + u32x wa_t = swap_workaround (w2[2]); + u32x wb_t = swap_workaround (w2[3]); + u32x wc_t = swap_workaround (w3[0]); + u32x wd_t = swap_workaround (w3[1]); + u32x we_t = 0; + u32x wf_t = out_len * 8; + + u32x a = SHA1M_A; + u32x b = SHA1M_B; + u32x c = SHA1M_C; + u32x d = SHA1M_D; + u32x e = SHA1M_E; + u32x f = 0; + u32x g = 0; + u32x h = 0; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w0_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w1_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w2_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w3_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w4_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w5_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w6_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w7_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w8_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w9_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wa_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, wb_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, wc_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, wd_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, we_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F0o, e, a, b, c, d, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F0o, d, e, a, b, c, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F0o, c, d, e, a, b, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F0o, b, c, d, e, a, w3_t); + + #undef K + #define K SHA1C01 + + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w7_t); + + #undef K + #define K SHA1C02 + + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wb_t); + + #undef K + #define K SHA1C03 + + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wf_t); + + a += SHA1M_A; + b += SHA1M_B; + c += SHA1M_C; + d += SHA1M_D; + e += SHA1M_E; + + /** + * sha256 + */ + + w0_t = uint_to_hex_upper8 ((a >> 24) & 255) << 0 + | uint_to_hex_upper8 ((a >> 16) & 255) << 16; + w1_t = uint_to_hex_upper8 ((a >> 8) & 255) << 0 + | uint_to_hex_upper8 ((a >> 0) & 255) << 16; + w2_t = uint_to_hex_upper8 ((b >> 24) & 255) << 0 + | uint_to_hex_upper8 ((b >> 16) & 255) << 16; + w3_t = uint_to_hex_upper8 ((b >> 8) & 255) << 0 + | uint_to_hex_upper8 ((b >> 0) & 255) << 16; + w4_t = uint_to_hex_upper8 ((c >> 24) & 255) << 0 + | uint_to_hex_upper8 ((c >> 16) & 255) << 16; + w5_t = uint_to_hex_upper8 ((c >> 8) & 255) << 0 + | uint_to_hex_upper8 ((c >> 0) & 255) << 16; + w6_t = uint_to_hex_upper8 ((d >> 24) & 255) << 0 + | uint_to_hex_upper8 ((d >> 16) & 255) << 16; + w7_t = uint_to_hex_upper8 ((d >> 8) & 255) << 0 + | uint_to_hex_upper8 ((d >> 0) & 255) << 16; + w8_t = uint_to_hex_upper8 ((e >> 24) & 255) << 0 + | uint_to_hex_upper8 ((e >> 16) & 255) << 16; + w9_t = uint_to_hex_upper8 ((e >> 8) & 255) << 0 + | uint_to_hex_upper8 ((e >> 0) & 255) << 16; + + w0_t = swap_workaround (w0_t); + w1_t = swap_workaround (w1_t); + w2_t = swap_workaround (w2_t); + w3_t = swap_workaround (w3_t); + w4_t = swap_workaround (w4_t); + w5_t = swap_workaround (w5_t); + w6_t = swap_workaround (w6_t); + w7_t = swap_workaround (w7_t); + w8_t = swap_workaround (w8_t); + w9_t = swap_workaround (w9_t); + wa_t = 0x80000000; + wb_t = 0; + wc_t = 0; + wd_t = 0; + we_t = 0; + wf_t = (64 + 40) * 8; + + a = pc256[0]; + b = pc256[1]; + c = pc256[2]; + d = pc256[3]; + e = pc256[4]; + f = pc256[5]; + g = pc256[6]; + h = pc256[7]; + + SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C00); + SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C01); + SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C02); + SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C03); + SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C04); + SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C05); + SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C06); + SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C07); + SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C08); + SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C09); + SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C0a); + SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C0b); + SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C0c); + SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C0d); + SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C0e); + SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C0f); + + w0_t = SHA256_EXPAND (we_t, w9_t, w1_t, w0_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C10); + w1_t = SHA256_EXPAND (wf_t, wa_t, w2_t, w1_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C11); + w2_t = SHA256_EXPAND (w0_t, wb_t, w3_t, w2_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C12); + w3_t = SHA256_EXPAND (w1_t, wc_t, w4_t, w3_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C13); + w4_t = SHA256_EXPAND (w2_t, wd_t, w5_t, w4_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C14); + w5_t = SHA256_EXPAND (w3_t, we_t, w6_t, w5_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C15); + w6_t = SHA256_EXPAND (w4_t, wf_t, w7_t, w6_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C16); + w7_t = SHA256_EXPAND (w5_t, w0_t, w8_t, w7_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C17); + w8_t = SHA256_EXPAND (w6_t, w1_t, w9_t, w8_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C18); + w9_t = SHA256_EXPAND (w7_t, w2_t, wa_t, w9_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C19); + wa_t = SHA256_EXPAND (w8_t, w3_t, wb_t, wa_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C1a); + wb_t = SHA256_EXPAND (w9_t, w4_t, wc_t, wb_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C1b); + wc_t = SHA256_EXPAND (wa_t, w5_t, wd_t, wc_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C1c); + wd_t = SHA256_EXPAND (wb_t, w6_t, we_t, wd_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C1d); + we_t = SHA256_EXPAND (wc_t, w7_t, wf_t, we_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C1e); + wf_t = SHA256_EXPAND (wd_t, w8_t, w0_t, wf_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C1f); + + w0_t = SHA256_EXPAND (we_t, w9_t, w1_t, w0_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C20); + w1_t = SHA256_EXPAND (wf_t, wa_t, w2_t, w1_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C21); + w2_t = SHA256_EXPAND (w0_t, wb_t, w3_t, w2_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C22); + w3_t = SHA256_EXPAND (w1_t, wc_t, w4_t, w3_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C23); + w4_t = SHA256_EXPAND (w2_t, wd_t, w5_t, w4_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C24); + w5_t = SHA256_EXPAND (w3_t, we_t, w6_t, w5_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C25); + w6_t = SHA256_EXPAND (w4_t, wf_t, w7_t, w6_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C26); + w7_t = SHA256_EXPAND (w5_t, w0_t, w8_t, w7_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C27); + w8_t = SHA256_EXPAND (w6_t, w1_t, w9_t, w8_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C28); + w9_t = SHA256_EXPAND (w7_t, w2_t, wa_t, w9_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C29); + wa_t = SHA256_EXPAND (w8_t, w3_t, wb_t, wa_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C2a); + wb_t = SHA256_EXPAND (w9_t, w4_t, wc_t, wb_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C2b); + wc_t = SHA256_EXPAND (wa_t, w5_t, wd_t, wc_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C2c); + wd_t = SHA256_EXPAND (wb_t, w6_t, we_t, wd_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C2d); + we_t = SHA256_EXPAND (wc_t, w7_t, wf_t, we_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C2e); + wf_t = SHA256_EXPAND (wd_t, w8_t, w0_t, wf_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C2f); + + w0_t = SHA256_EXPAND (we_t, w9_t, w1_t, w0_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C30); + w1_t = SHA256_EXPAND (wf_t, wa_t, w2_t, w1_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C31); + w2_t = SHA256_EXPAND (w0_t, wb_t, w3_t, w2_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C32); + w3_t = SHA256_EXPAND (w1_t, wc_t, w4_t, w3_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C33); + w4_t = SHA256_EXPAND (w2_t, wd_t, w5_t, w4_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C34); + w5_t = SHA256_EXPAND (w3_t, we_t, w6_t, w5_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C35); + w6_t = SHA256_EXPAND (w4_t, wf_t, w7_t, w6_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C36); + w7_t = SHA256_EXPAND (w5_t, w0_t, w8_t, w7_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C37); + w8_t = SHA256_EXPAND (w6_t, w1_t, w9_t, w8_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C38); + w9_t = SHA256_EXPAND (w7_t, w2_t, wa_t, w9_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C39); + wa_t = SHA256_EXPAND (w8_t, w3_t, wb_t, wa_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C3a); + wb_t = SHA256_EXPAND (w9_t, w4_t, wc_t, wb_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C3b); + wc_t = SHA256_EXPAND (wa_t, w5_t, wd_t, wc_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C3c); + wd_t = SHA256_EXPAND (wb_t, w6_t, we_t, wd_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C3d); + we_t = SHA256_EXPAND (wc_t, w7_t, wf_t, we_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C3e); + wf_t = SHA256_EXPAND (wd_t, w8_t, w0_t, wf_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C3f); + + const u32x r0 = d; + const u32x r1 = h; + const u32x r2 = c; + const u32x r3 = g; + + #include VECT_COMPARE_M + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m12600_m08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m12600_m16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m12600_s04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + u32x pw_buf1[4]; + + pw_buf1[0] = pws[gid].i[ 4]; + pw_buf1[1] = pws[gid].i[ 5]; + pw_buf1[2] = pws[gid].i[ 6]; + pw_buf1[3] = pws[gid].i[ 7]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * salt + */ + + u32 pc256[8]; + + pc256[0] = salt_bufs[salt_pos].salt_buf_pc[0]; + pc256[1] = salt_bufs[salt_pos].salt_buf_pc[1]; + pc256[2] = salt_bufs[salt_pos].salt_buf_pc[2]; + pc256[3] = salt_bufs[salt_pos].salt_buf_pc[3]; + pc256[4] = salt_bufs[salt_pos].salt_buf_pc[4]; + pc256[5] = salt_bufs[salt_pos].salt_buf_pc[5]; + pc256[6] = salt_bufs[salt_pos].salt_buf_pc[6]; + pc256[7] = salt_bufs[salt_pos].salt_buf_pc[7]; + + /** + * bin2asc table + */ + + __local u32 l_bin2asc[256]; + + const u32 lid4 = lid * 4; + + const u32 lid40 = lid4 + 0; + const u32 lid41 = lid4 + 1; + const u32 lid42 = lid4 + 2; + const u32 lid43 = lid4 + 3; + + const u32 v400 = (lid40 >> 0) & 15; + const u32 v401 = (lid40 >> 4) & 15; + const u32 v410 = (lid41 >> 0) & 15; + const u32 v411 = (lid41 >> 4) & 15; + const u32 v420 = (lid42 >> 0) & 15; + const u32 v421 = (lid42 >> 4) & 15; + const u32 v430 = (lid43 >> 0) & 15; + const u32 v431 = (lid43 >> 4) & 15; + + l_bin2asc[lid40] = ((v400 < 10) ? '0' + v400 : 'A' - 10 + v400) << 8 + | ((v401 < 10) ? '0' + v401 : 'A' - 10 + v401) << 0; + l_bin2asc[lid41] = ((v410 < 10) ? '0' + v410 : 'A' - 10 + v410) << 8 + | ((v411 < 10) ? '0' + v411 : 'A' - 10 + v411) << 0; + l_bin2asc[lid42] = ((v420 < 10) ? '0' + v420 : 'A' - 10 + v420) << 8 + | ((v421 < 10) ? '0' + v421 : 'A' - 10 + v421) << 0; + l_bin2asc[lid43] = ((v430 < 10) ? '0' + v430 : 'A' - 10 + v430) << 8 + | ((v431 < 10) ? '0' + v431 : 'A' - 10 + v431) << 0; + + barrier (CLK_LOCAL_MEM_FENCE); + + if (gid >= gid_max) return; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + + w0[0] = pw_buf0[0]; + w0[1] = pw_buf0[1]; + w0[2] = pw_buf0[2]; + w0[3] = pw_buf0[3]; + + u32x w1[4]; + + w1[0] = pw_buf1[0]; + w1[1] = pw_buf1[1]; + w1[2] = pw_buf1[2]; + w1[3] = pw_buf1[3]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 out_len = apply_rules (rules_buf[il_pos].cmds, w0, w1, pw_len); + + append_0x80_2 (w0, w1, out_len); + + /** + * sha1 + */ + + u32x w0_t = swap_workaround (w0[0]); + u32x w1_t = swap_workaround (w0[1]); + u32x w2_t = swap_workaround (w0[2]); + u32x w3_t = swap_workaround (w0[3]); + u32x w4_t = swap_workaround (w1[0]); + u32x w5_t = swap_workaround (w1[1]); + u32x w6_t = swap_workaround (w1[2]); + u32x w7_t = swap_workaround (w1[3]); + u32x w8_t = swap_workaround (w2[0]); + u32x w9_t = swap_workaround (w2[1]); + u32x wa_t = swap_workaround (w2[2]); + u32x wb_t = swap_workaround (w2[3]); + u32x wc_t = swap_workaround (w3[0]); + u32x wd_t = swap_workaround (w3[1]); + u32x we_t = 0; + u32x wf_t = out_len * 8; + + u32x a = SHA1M_A; + u32x b = SHA1M_B; + u32x c = SHA1M_C; + u32x d = SHA1M_D; + u32x e = SHA1M_E; + u32x f = 0; + u32x g = 0; + u32x h = 0; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w0_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w1_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w2_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w3_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w4_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w5_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w6_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w7_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w8_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w9_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wa_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, wb_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, wc_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, wd_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, we_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F0o, e, a, b, c, d, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F0o, d, e, a, b, c, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F0o, c, d, e, a, b, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F0o, b, c, d, e, a, w3_t); + + #undef K + #define K SHA1C01 + + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w7_t); + + #undef K + #define K SHA1C02 + + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wb_t); + + #undef K + #define K SHA1C03 + + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wf_t); + + a += SHA1M_A; + b += SHA1M_B; + c += SHA1M_C; + d += SHA1M_D; + e += SHA1M_E; + + + /** + * sha256 + */ + + w0_t = uint_to_hex_upper8 ((a >> 24) & 255) << 0 + | uint_to_hex_upper8 ((a >> 16) & 255) << 16; + w1_t = uint_to_hex_upper8 ((a >> 8) & 255) << 0 + | uint_to_hex_upper8 ((a >> 0) & 255) << 16; + w2_t = uint_to_hex_upper8 ((b >> 24) & 255) << 0 + | uint_to_hex_upper8 ((b >> 16) & 255) << 16; + w3_t = uint_to_hex_upper8 ((b >> 8) & 255) << 0 + | uint_to_hex_upper8 ((b >> 0) & 255) << 16; + w4_t = uint_to_hex_upper8 ((c >> 24) & 255) << 0 + | uint_to_hex_upper8 ((c >> 16) & 255) << 16; + w5_t = uint_to_hex_upper8 ((c >> 8) & 255) << 0 + | uint_to_hex_upper8 ((c >> 0) & 255) << 16; + w6_t = uint_to_hex_upper8 ((d >> 24) & 255) << 0 + | uint_to_hex_upper8 ((d >> 16) & 255) << 16; + w7_t = uint_to_hex_upper8 ((d >> 8) & 255) << 0 + | uint_to_hex_upper8 ((d >> 0) & 255) << 16; + w8_t = uint_to_hex_upper8 ((e >> 24) & 255) << 0 + | uint_to_hex_upper8 ((e >> 16) & 255) << 16; + w9_t = uint_to_hex_upper8 ((e >> 8) & 255) << 0 + | uint_to_hex_upper8 ((e >> 0) & 255) << 16; + + w0_t = swap_workaround (w0_t); + w1_t = swap_workaround (w1_t); + w2_t = swap_workaround (w2_t); + w3_t = swap_workaround (w3_t); + w4_t = swap_workaround (w4_t); + w5_t = swap_workaround (w5_t); + w6_t = swap_workaround (w6_t); + w7_t = swap_workaround (w7_t); + w8_t = swap_workaround (w8_t); + w9_t = swap_workaround (w9_t); + wa_t = 0x80000000; + wb_t = 0; + wc_t = 0; + wd_t = 0; + we_t = 0; + wf_t = (64 + 40) * 8; + + a = pc256[0]; + b = pc256[1]; + c = pc256[2]; + d = pc256[3]; + e = pc256[4]; + f = pc256[5]; + g = pc256[6]; + h = pc256[7]; + + SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C00); + SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C01); + SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C02); + SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C03); + SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C04); + SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C05); + SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C06); + SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C07); + SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C08); + SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C09); + SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C0a); + SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C0b); + SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C0c); + SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C0d); + SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C0e); + SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C0f); + + w0_t = SHA256_EXPAND (we_t, w9_t, w1_t, w0_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C10); + w1_t = SHA256_EXPAND (wf_t, wa_t, w2_t, w1_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C11); + w2_t = SHA256_EXPAND (w0_t, wb_t, w3_t, w2_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C12); + w3_t = SHA256_EXPAND (w1_t, wc_t, w4_t, w3_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C13); + w4_t = SHA256_EXPAND (w2_t, wd_t, w5_t, w4_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C14); + w5_t = SHA256_EXPAND (w3_t, we_t, w6_t, w5_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C15); + w6_t = SHA256_EXPAND (w4_t, wf_t, w7_t, w6_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C16); + w7_t = SHA256_EXPAND (w5_t, w0_t, w8_t, w7_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C17); + w8_t = SHA256_EXPAND (w6_t, w1_t, w9_t, w8_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C18); + w9_t = SHA256_EXPAND (w7_t, w2_t, wa_t, w9_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C19); + wa_t = SHA256_EXPAND (w8_t, w3_t, wb_t, wa_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C1a); + wb_t = SHA256_EXPAND (w9_t, w4_t, wc_t, wb_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C1b); + wc_t = SHA256_EXPAND (wa_t, w5_t, wd_t, wc_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C1c); + wd_t = SHA256_EXPAND (wb_t, w6_t, we_t, wd_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C1d); + we_t = SHA256_EXPAND (wc_t, w7_t, wf_t, we_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C1e); + wf_t = SHA256_EXPAND (wd_t, w8_t, w0_t, wf_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C1f); + + w0_t = SHA256_EXPAND (we_t, w9_t, w1_t, w0_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C20); + w1_t = SHA256_EXPAND (wf_t, wa_t, w2_t, w1_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C21); + w2_t = SHA256_EXPAND (w0_t, wb_t, w3_t, w2_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C22); + w3_t = SHA256_EXPAND (w1_t, wc_t, w4_t, w3_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C23); + w4_t = SHA256_EXPAND (w2_t, wd_t, w5_t, w4_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C24); + w5_t = SHA256_EXPAND (w3_t, we_t, w6_t, w5_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C25); + w6_t = SHA256_EXPAND (w4_t, wf_t, w7_t, w6_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C26); + w7_t = SHA256_EXPAND (w5_t, w0_t, w8_t, w7_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C27); + w8_t = SHA256_EXPAND (w6_t, w1_t, w9_t, w8_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C28); + w9_t = SHA256_EXPAND (w7_t, w2_t, wa_t, w9_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C29); + wa_t = SHA256_EXPAND (w8_t, w3_t, wb_t, wa_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C2a); + wb_t = SHA256_EXPAND (w9_t, w4_t, wc_t, wb_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C2b); + wc_t = SHA256_EXPAND (wa_t, w5_t, wd_t, wc_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C2c); + wd_t = SHA256_EXPAND (wb_t, w6_t, we_t, wd_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C2d); + we_t = SHA256_EXPAND (wc_t, w7_t, wf_t, we_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C2e); + wf_t = SHA256_EXPAND (wd_t, w8_t, w0_t, wf_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C2f); + + w0_t = SHA256_EXPAND (we_t, w9_t, w1_t, w0_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C30); + w1_t = SHA256_EXPAND (wf_t, wa_t, w2_t, w1_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C31); + w2_t = SHA256_EXPAND (w0_t, wb_t, w3_t, w2_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C32); + w3_t = SHA256_EXPAND (w1_t, wc_t, w4_t, w3_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C33); + w4_t = SHA256_EXPAND (w2_t, wd_t, w5_t, w4_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C34); + w5_t = SHA256_EXPAND (w3_t, we_t, w6_t, w5_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C35); + w6_t = SHA256_EXPAND (w4_t, wf_t, w7_t, w6_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C36); + w7_t = SHA256_EXPAND (w5_t, w0_t, w8_t, w7_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C37); + w8_t = SHA256_EXPAND (w6_t, w1_t, w9_t, w8_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C38); + w9_t = SHA256_EXPAND (w7_t, w2_t, wa_t, w9_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C39); + wa_t = SHA256_EXPAND (w8_t, w3_t, wb_t, wa_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C3a); + wb_t = SHA256_EXPAND (w9_t, w4_t, wc_t, wb_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C3b); + wc_t = SHA256_EXPAND (wa_t, w5_t, wd_t, wc_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C3c); + wd_t = SHA256_EXPAND (wb_t, w6_t, we_t, wd_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C3d); + we_t = SHA256_EXPAND (wc_t, w7_t, wf_t, we_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C3e); + wf_t = SHA256_EXPAND (wd_t, w8_t, w0_t, wf_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C3f); + + const u32x r0 = d; + const u32x r1 = h; + const u32x r2 = c; + const u32x r3 = g; + + #include VECT_COMPARE_S + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m12600_s08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m12600_s16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/amd/m12600_a1.cl b/amd/m12600_a1.cl new file mode 100644 index 0000000000..19f68b547b --- /dev/null +++ b/amd/m12600_a1.cl @@ -0,0 +1,955 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _SHA256_SHA1_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW4 +#define VECT_SIZE4 +#endif + +#ifdef VLIW5 +#define VECT_SIZE4 +#endif + +#define DGST_R0 3 +#define DGST_R1 7 +#define DGST_R2 2 +#define DGST_R3 6 + +#include "include/kernel_functions.c" +#include "types_amd.c" +#include "common_amd.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +#ifdef VECT_SIZE1 +#define uint_to_hex_upper8(i) l_bin2asc[(i)] +#endif + +#ifdef VECT_SIZE2 +#define uint_to_hex_upper8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1]) +#endif + +#ifdef VECT_SIZE4 +#define uint_to_hex_upper8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3]) +#endif + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m12600_m04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + append_0x80_2 (wordl0, wordl1, pw_l_len); + + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, combs_buf[0].pw_len); + } + + /** + * salt + */ + + u32 pc256[8]; + + pc256[0] = salt_bufs[salt_pos].salt_buf_pc[0]; + pc256[1] = salt_bufs[salt_pos].salt_buf_pc[1]; + pc256[2] = salt_bufs[salt_pos].salt_buf_pc[2]; + pc256[3] = salt_bufs[salt_pos].salt_buf_pc[3]; + pc256[4] = salt_bufs[salt_pos].salt_buf_pc[4]; + pc256[5] = salt_bufs[salt_pos].salt_buf_pc[5]; + pc256[6] = salt_bufs[salt_pos].salt_buf_pc[6]; + pc256[7] = salt_bufs[salt_pos].salt_buf_pc[7]; + + /** + * bin2asc table + */ + + __local u32 l_bin2asc[256]; + + const u32 lid4 = lid * 4; + + const u32 lid40 = lid4 + 0; + const u32 lid41 = lid4 + 1; + const u32 lid42 = lid4 + 2; + const u32 lid43 = lid4 + 3; + + const u32 v400 = (lid40 >> 0) & 15; + const u32 v401 = (lid40 >> 4) & 15; + const u32 v410 = (lid41 >> 0) & 15; + const u32 v411 = (lid41 >> 4) & 15; + const u32 v420 = (lid42 >> 0) & 15; + const u32 v421 = (lid42 >> 4) & 15; + const u32 v430 = (lid43 >> 0) & 15; + const u32 v431 = (lid43 >> 4) & 15; + + l_bin2asc[lid40] = ((v400 < 10) ? '0' + v400 : 'A' - 10 + v400) << 8 + | ((v401 < 10) ? '0' + v401 : 'A' - 10 + v401) << 0; + l_bin2asc[lid41] = ((v410 < 10) ? '0' + v410 : 'A' - 10 + v410) << 8 + | ((v411 < 10) ? '0' + v411 : 'A' - 10 + v411) << 0; + l_bin2asc[lid42] = ((v420 < 10) ? '0' + v420 : 'A' - 10 + v420) << 8 + | ((v421 < 10) ? '0' + v421 : 'A' - 10 + v421) << 0; + l_bin2asc[lid43] = ((v430 < 10) ? '0' + v430 : 'A' - 10 + v430) << 8 + | ((v431 < 10) ? '0' + v431 : 'A' - 10 + v431) << 0; + + barrier (CLK_LOCAL_MEM_FENCE); + + if (gid >= gid_max) return; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = combs_buf[il_pos].pw_len; + + const u32 pw_len = pw_l_len + pw_r_len; + + u32 wordr0[4]; + + wordr0[0] = combs_buf[il_pos].i[0]; + wordr0[1] = combs_buf[il_pos].i[1]; + wordr0[2] = combs_buf[il_pos].i[2]; + wordr0[3] = combs_buf[il_pos].i[3]; + + u32 wordr1[4]; + + wordr1[0] = combs_buf[il_pos].i[4]; + wordr1[1] = combs_buf[il_pos].i[5]; + wordr1[2] = combs_buf[il_pos].i[6]; + wordr1[3] = combs_buf[il_pos].i[7]; + + u32 wordr2[4]; + + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + + u32 wordr3[4]; + + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + append_0x80_2 (wordr0, wordr1, pw_r_len); + + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + u32x w0[4]; + + w0[0] = wordl0[0] | wordr0[0]; + w0[1] = wordl0[1] | wordr0[1]; + w0[2] = wordl0[2] | wordr0[2]; + w0[3] = wordl0[3] | wordr0[3]; + + u32x w1[4]; + + w1[0] = wordl1[0] | wordr1[0]; + w1[1] = wordl1[1] | wordr1[1]; + w1[2] = wordl1[2] | wordr1[2]; + w1[3] = wordl1[3] | wordr1[3]; + + u32x w2[4]; + + w2[0] = wordl2[0] | wordr2[0]; + w2[1] = wordl2[1] | wordr2[1]; + w2[2] = wordl2[2] | wordr2[2]; + w2[3] = wordl2[3] | wordr2[3]; + + u32x w3[4]; + + w3[0] = wordl3[0] | wordr3[0]; + w3[1] = wordl3[1] | wordr3[1]; + w3[2] = 0; + w3[3] = 0; + + /** + * sha1 + */ + + u32x w0_t = swap_workaround (w0[0]); + u32x w1_t = swap_workaround (w0[1]); + u32x w2_t = swap_workaround (w0[2]); + u32x w3_t = swap_workaround (w0[3]); + u32x w4_t = swap_workaround (w1[0]); + u32x w5_t = swap_workaround (w1[1]); + u32x w6_t = swap_workaround (w1[2]); + u32x w7_t = swap_workaround (w1[3]); + u32x w8_t = swap_workaround (w2[0]); + u32x w9_t = swap_workaround (w2[1]); + u32x wa_t = swap_workaround (w2[2]); + u32x wb_t = swap_workaround (w2[3]); + u32x wc_t = swap_workaround (w3[0]); + u32x wd_t = swap_workaround (w3[1]); + u32x we_t = 0; + u32x wf_t = pw_len * 8; + + u32x a = SHA1M_A; + u32x b = SHA1M_B; + u32x c = SHA1M_C; + u32x d = SHA1M_D; + u32x e = SHA1M_E; + u32x f = 0; + u32x g = 0; + u32x h = 0; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w0_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w1_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w2_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w3_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w4_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w5_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w6_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w7_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w8_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w9_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wa_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, wb_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, wc_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, wd_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, we_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F0o, e, a, b, c, d, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F0o, d, e, a, b, c, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F0o, c, d, e, a, b, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F0o, b, c, d, e, a, w3_t); + + #undef K + #define K SHA1C01 + + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w7_t); + + #undef K + #define K SHA1C02 + + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wb_t); + + #undef K + #define K SHA1C03 + + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wf_t); + + a += SHA1M_A; + b += SHA1M_B; + c += SHA1M_C; + d += SHA1M_D; + e += SHA1M_E; + + + /** + * sha256 + */ + + w0_t = uint_to_hex_upper8 ((a >> 24) & 255) << 0 + | uint_to_hex_upper8 ((a >> 16) & 255) << 16; + w1_t = uint_to_hex_upper8 ((a >> 8) & 255) << 0 + | uint_to_hex_upper8 ((a >> 0) & 255) << 16; + w2_t = uint_to_hex_upper8 ((b >> 24) & 255) << 0 + | uint_to_hex_upper8 ((b >> 16) & 255) << 16; + w3_t = uint_to_hex_upper8 ((b >> 8) & 255) << 0 + | uint_to_hex_upper8 ((b >> 0) & 255) << 16; + w4_t = uint_to_hex_upper8 ((c >> 24) & 255) << 0 + | uint_to_hex_upper8 ((c >> 16) & 255) << 16; + w5_t = uint_to_hex_upper8 ((c >> 8) & 255) << 0 + | uint_to_hex_upper8 ((c >> 0) & 255) << 16; + w6_t = uint_to_hex_upper8 ((d >> 24) & 255) << 0 + | uint_to_hex_upper8 ((d >> 16) & 255) << 16; + w7_t = uint_to_hex_upper8 ((d >> 8) & 255) << 0 + | uint_to_hex_upper8 ((d >> 0) & 255) << 16; + w8_t = uint_to_hex_upper8 ((e >> 24) & 255) << 0 + | uint_to_hex_upper8 ((e >> 16) & 255) << 16; + w9_t = uint_to_hex_upper8 ((e >> 8) & 255) << 0 + | uint_to_hex_upper8 ((e >> 0) & 255) << 16; + + w0_t = swap_workaround (w0_t); + w1_t = swap_workaround (w1_t); + w2_t = swap_workaround (w2_t); + w3_t = swap_workaround (w3_t); + w4_t = swap_workaround (w4_t); + w5_t = swap_workaround (w5_t); + w6_t = swap_workaround (w6_t); + w7_t = swap_workaround (w7_t); + w8_t = swap_workaround (w8_t); + w9_t = swap_workaround (w9_t); + wa_t = 0x80000000; + wb_t = 0; + wc_t = 0; + wd_t = 0; + we_t = 0; + wf_t = (64 + 40) * 8; + + a = pc256[0]; + b = pc256[1]; + c = pc256[2]; + d = pc256[3]; + e = pc256[4]; + f = pc256[5]; + g = pc256[6]; + h = pc256[7]; + + SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C00); + SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C01); + SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C02); + SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C03); + SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C04); + SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C05); + SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C06); + SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C07); + SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C08); + SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C09); + SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C0a); + SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C0b); + SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C0c); + SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C0d); + SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C0e); + SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C0f); + + w0_t = SHA256_EXPAND (we_t, w9_t, w1_t, w0_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C10); + w1_t = SHA256_EXPAND (wf_t, wa_t, w2_t, w1_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C11); + w2_t = SHA256_EXPAND (w0_t, wb_t, w3_t, w2_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C12); + w3_t = SHA256_EXPAND (w1_t, wc_t, w4_t, w3_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C13); + w4_t = SHA256_EXPAND (w2_t, wd_t, w5_t, w4_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C14); + w5_t = SHA256_EXPAND (w3_t, we_t, w6_t, w5_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C15); + w6_t = SHA256_EXPAND (w4_t, wf_t, w7_t, w6_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C16); + w7_t = SHA256_EXPAND (w5_t, w0_t, w8_t, w7_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C17); + w8_t = SHA256_EXPAND (w6_t, w1_t, w9_t, w8_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C18); + w9_t = SHA256_EXPAND (w7_t, w2_t, wa_t, w9_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C19); + wa_t = SHA256_EXPAND (w8_t, w3_t, wb_t, wa_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C1a); + wb_t = SHA256_EXPAND (w9_t, w4_t, wc_t, wb_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C1b); + wc_t = SHA256_EXPAND (wa_t, w5_t, wd_t, wc_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C1c); + wd_t = SHA256_EXPAND (wb_t, w6_t, we_t, wd_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C1d); + we_t = SHA256_EXPAND (wc_t, w7_t, wf_t, we_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C1e); + wf_t = SHA256_EXPAND (wd_t, w8_t, w0_t, wf_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C1f); + + w0_t = SHA256_EXPAND (we_t, w9_t, w1_t, w0_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C20); + w1_t = SHA256_EXPAND (wf_t, wa_t, w2_t, w1_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C21); + w2_t = SHA256_EXPAND (w0_t, wb_t, w3_t, w2_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C22); + w3_t = SHA256_EXPAND (w1_t, wc_t, w4_t, w3_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C23); + w4_t = SHA256_EXPAND (w2_t, wd_t, w5_t, w4_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C24); + w5_t = SHA256_EXPAND (w3_t, we_t, w6_t, w5_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C25); + w6_t = SHA256_EXPAND (w4_t, wf_t, w7_t, w6_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C26); + w7_t = SHA256_EXPAND (w5_t, w0_t, w8_t, w7_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C27); + w8_t = SHA256_EXPAND (w6_t, w1_t, w9_t, w8_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C28); + w9_t = SHA256_EXPAND (w7_t, w2_t, wa_t, w9_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C29); + wa_t = SHA256_EXPAND (w8_t, w3_t, wb_t, wa_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C2a); + wb_t = SHA256_EXPAND (w9_t, w4_t, wc_t, wb_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C2b); + wc_t = SHA256_EXPAND (wa_t, w5_t, wd_t, wc_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C2c); + wd_t = SHA256_EXPAND (wb_t, w6_t, we_t, wd_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C2d); + we_t = SHA256_EXPAND (wc_t, w7_t, wf_t, we_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C2e); + wf_t = SHA256_EXPAND (wd_t, w8_t, w0_t, wf_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C2f); + + w0_t = SHA256_EXPAND (we_t, w9_t, w1_t, w0_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C30); + w1_t = SHA256_EXPAND (wf_t, wa_t, w2_t, w1_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C31); + w2_t = SHA256_EXPAND (w0_t, wb_t, w3_t, w2_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C32); + w3_t = SHA256_EXPAND (w1_t, wc_t, w4_t, w3_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C33); + w4_t = SHA256_EXPAND (w2_t, wd_t, w5_t, w4_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C34); + w5_t = SHA256_EXPAND (w3_t, we_t, w6_t, w5_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C35); + w6_t = SHA256_EXPAND (w4_t, wf_t, w7_t, w6_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C36); + w7_t = SHA256_EXPAND (w5_t, w0_t, w8_t, w7_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C37); + w8_t = SHA256_EXPAND (w6_t, w1_t, w9_t, w8_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C38); + w9_t = SHA256_EXPAND (w7_t, w2_t, wa_t, w9_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C39); + wa_t = SHA256_EXPAND (w8_t, w3_t, wb_t, wa_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C3a); + wb_t = SHA256_EXPAND (w9_t, w4_t, wc_t, wb_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C3b); + wc_t = SHA256_EXPAND (wa_t, w5_t, wd_t, wc_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C3c); + wd_t = SHA256_EXPAND (wb_t, w6_t, we_t, wd_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C3d); + we_t = SHA256_EXPAND (wc_t, w7_t, wf_t, we_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C3e); + wf_t = SHA256_EXPAND (wd_t, w8_t, w0_t, wf_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C3f); + + const u32x r0 = d; + const u32x r1 = h; + const u32x r2 = c; + const u32x r3 = g; + + #include VECT_COMPARE_M + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m12600_m08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m12600_m16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m12600_s04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + /** + * base + */ + + const u32 gid = get_global_id (0); + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + append_0x80_2 (wordl0, wordl1, pw_l_len); + + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, combs_buf[0].pw_len); + } + + /** + * salt + */ + + u32 pc256[8]; + + pc256[0] = salt_bufs[salt_pos].salt_buf_pc[0]; + pc256[1] = salt_bufs[salt_pos].salt_buf_pc[1]; + pc256[2] = salt_bufs[salt_pos].salt_buf_pc[2]; + pc256[3] = salt_bufs[salt_pos].salt_buf_pc[3]; + pc256[4] = salt_bufs[salt_pos].salt_buf_pc[4]; + pc256[5] = salt_bufs[salt_pos].salt_buf_pc[5]; + pc256[6] = salt_bufs[salt_pos].salt_buf_pc[6]; + pc256[7] = salt_bufs[salt_pos].salt_buf_pc[7]; + + /** + * bin2asc table + */ + + __local u32 l_bin2asc[256]; + + const u32 lid4 = lid * 4; + + const u32 lid40 = lid4 + 0; + const u32 lid41 = lid4 + 1; + const u32 lid42 = lid4 + 2; + const u32 lid43 = lid4 + 3; + + const u32 v400 = (lid40 >> 0) & 15; + const u32 v401 = (lid40 >> 4) & 15; + const u32 v410 = (lid41 >> 0) & 15; + const u32 v411 = (lid41 >> 4) & 15; + const u32 v420 = (lid42 >> 0) & 15; + const u32 v421 = (lid42 >> 4) & 15; + const u32 v430 = (lid43 >> 0) & 15; + const u32 v431 = (lid43 >> 4) & 15; + + l_bin2asc[lid40] = ((v400 < 10) ? '0' + v400 : 'A' - 10 + v400) << 8 + | ((v401 < 10) ? '0' + v401 : 'A' - 10 + v401) << 0; + l_bin2asc[lid41] = ((v410 < 10) ? '0' + v410 : 'A' - 10 + v410) << 8 + | ((v411 < 10) ? '0' + v411 : 'A' - 10 + v411) << 0; + l_bin2asc[lid42] = ((v420 < 10) ? '0' + v420 : 'A' - 10 + v420) << 8 + | ((v421 < 10) ? '0' + v421 : 'A' - 10 + v421) << 0; + l_bin2asc[lid43] = ((v430 < 10) ? '0' + v430 : 'A' - 10 + v430) << 8 + | ((v431 < 10) ? '0' + v431 : 'A' - 10 + v431) << 0; + + barrier (CLK_LOCAL_MEM_FENCE); + + if (gid >= gid_max) return; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = combs_buf[il_pos].pw_len; + + const u32 pw_len = pw_l_len + pw_r_len; + + u32 wordr0[4]; + + wordr0[0] = combs_buf[il_pos].i[0]; + wordr0[1] = combs_buf[il_pos].i[1]; + wordr0[2] = combs_buf[il_pos].i[2]; + wordr0[3] = combs_buf[il_pos].i[3]; + + u32 wordr1[4]; + + wordr1[0] = combs_buf[il_pos].i[4]; + wordr1[1] = combs_buf[il_pos].i[5]; + wordr1[2] = combs_buf[il_pos].i[6]; + wordr1[3] = combs_buf[il_pos].i[7]; + + u32 wordr2[4]; + + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + + u32 wordr3[4]; + + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + append_0x80_2 (wordr0, wordr1, pw_r_len); + + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + u32x w0[4]; + + w0[0] = wordl0[0] | wordr0[0]; + w0[1] = wordl0[1] | wordr0[1]; + w0[2] = wordl0[2] | wordr0[2]; + w0[3] = wordl0[3] | wordr0[3]; + + u32x w1[4]; + + w1[0] = wordl1[0] | wordr1[0]; + w1[1] = wordl1[1] | wordr1[1]; + w1[2] = wordl1[2] | wordr1[2]; + w1[3] = wordl1[3] | wordr1[3]; + + u32x w2[4]; + + w2[0] = wordl2[0] | wordr2[0]; + w2[1] = wordl2[1] | wordr2[1]; + w2[2] = wordl2[2] | wordr2[2]; + w2[3] = wordl2[3] | wordr2[3]; + + u32x w3[4]; + + w3[0] = wordl3[0] | wordr3[0]; + w3[1] = wordl3[1] | wordr3[1]; + w3[2] = 0; + w3[3] = 0; + + /** + * sha1 + */ + + u32x w0_t = swap_workaround (w0[0]); + u32x w1_t = swap_workaround (w0[1]); + u32x w2_t = swap_workaround (w0[2]); + u32x w3_t = swap_workaround (w0[3]); + u32x w4_t = swap_workaround (w1[0]); + u32x w5_t = swap_workaround (w1[1]); + u32x w6_t = swap_workaround (w1[2]); + u32x w7_t = swap_workaround (w1[3]); + u32x w8_t = swap_workaround (w2[0]); + u32x w9_t = swap_workaround (w2[1]); + u32x wa_t = swap_workaround (w2[2]); + u32x wb_t = swap_workaround (w2[3]); + u32x wc_t = swap_workaround (w3[0]); + u32x wd_t = swap_workaround (w3[1]); + u32x we_t = 0; + u32x wf_t = pw_len * 8; + + u32x a = SHA1M_A; + u32x b = SHA1M_B; + u32x c = SHA1M_C; + u32x d = SHA1M_D; + u32x e = SHA1M_E; + u32x f = 0; + u32x g = 0; + u32x h = 0; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w0_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w1_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w2_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w3_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w4_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w5_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w6_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w7_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w8_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w9_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wa_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, wb_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, wc_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, wd_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, we_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F0o, e, a, b, c, d, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F0o, d, e, a, b, c, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F0o, c, d, e, a, b, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F0o, b, c, d, e, a, w3_t); + + #undef K + #define K SHA1C01 + + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w7_t); + + #undef K + #define K SHA1C02 + + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wb_t); + + #undef K + #define K SHA1C03 + + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wf_t); + + a += SHA1M_A; + b += SHA1M_B; + c += SHA1M_C; + d += SHA1M_D; + e += SHA1M_E; + + + /** + * sha256 + */ + + w0_t = uint_to_hex_upper8 ((a >> 24) & 255) << 0 + | uint_to_hex_upper8 ((a >> 16) & 255) << 16; + w1_t = uint_to_hex_upper8 ((a >> 8) & 255) << 0 + | uint_to_hex_upper8 ((a >> 0) & 255) << 16; + w2_t = uint_to_hex_upper8 ((b >> 24) & 255) << 0 + | uint_to_hex_upper8 ((b >> 16) & 255) << 16; + w3_t = uint_to_hex_upper8 ((b >> 8) & 255) << 0 + | uint_to_hex_upper8 ((b >> 0) & 255) << 16; + w4_t = uint_to_hex_upper8 ((c >> 24) & 255) << 0 + | uint_to_hex_upper8 ((c >> 16) & 255) << 16; + w5_t = uint_to_hex_upper8 ((c >> 8) & 255) << 0 + | uint_to_hex_upper8 ((c >> 0) & 255) << 16; + w6_t = uint_to_hex_upper8 ((d >> 24) & 255) << 0 + | uint_to_hex_upper8 ((d >> 16) & 255) << 16; + w7_t = uint_to_hex_upper8 ((d >> 8) & 255) << 0 + | uint_to_hex_upper8 ((d >> 0) & 255) << 16; + w8_t = uint_to_hex_upper8 ((e >> 24) & 255) << 0 + | uint_to_hex_upper8 ((e >> 16) & 255) << 16; + w9_t = uint_to_hex_upper8 ((e >> 8) & 255) << 0 + | uint_to_hex_upper8 ((e >> 0) & 255) << 16; + + w0_t = swap_workaround (w0_t); + w1_t = swap_workaround (w1_t); + w2_t = swap_workaround (w2_t); + w3_t = swap_workaround (w3_t); + w4_t = swap_workaround (w4_t); + w5_t = swap_workaround (w5_t); + w6_t = swap_workaround (w6_t); + w7_t = swap_workaround (w7_t); + w8_t = swap_workaround (w8_t); + w9_t = swap_workaround (w9_t); + wa_t = 0x80000000; + wb_t = 0; + wc_t = 0; + wd_t = 0; + we_t = 0; + wf_t = (64 + 40) * 8; + + a = pc256[0]; + b = pc256[1]; + c = pc256[2]; + d = pc256[3]; + e = pc256[4]; + f = pc256[5]; + g = pc256[6]; + h = pc256[7]; + + SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C00); + SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C01); + SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C02); + SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C03); + SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C04); + SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C05); + SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C06); + SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C07); + SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C08); + SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C09); + SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C0a); + SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C0b); + SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C0c); + SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C0d); + SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C0e); + SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C0f); + + w0_t = SHA256_EXPAND (we_t, w9_t, w1_t, w0_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C10); + w1_t = SHA256_EXPAND (wf_t, wa_t, w2_t, w1_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C11); + w2_t = SHA256_EXPAND (w0_t, wb_t, w3_t, w2_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C12); + w3_t = SHA256_EXPAND (w1_t, wc_t, w4_t, w3_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C13); + w4_t = SHA256_EXPAND (w2_t, wd_t, w5_t, w4_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C14); + w5_t = SHA256_EXPAND (w3_t, we_t, w6_t, w5_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C15); + w6_t = SHA256_EXPAND (w4_t, wf_t, w7_t, w6_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C16); + w7_t = SHA256_EXPAND (w5_t, w0_t, w8_t, w7_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C17); + w8_t = SHA256_EXPAND (w6_t, w1_t, w9_t, w8_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C18); + w9_t = SHA256_EXPAND (w7_t, w2_t, wa_t, w9_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C19); + wa_t = SHA256_EXPAND (w8_t, w3_t, wb_t, wa_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C1a); + wb_t = SHA256_EXPAND (w9_t, w4_t, wc_t, wb_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C1b); + wc_t = SHA256_EXPAND (wa_t, w5_t, wd_t, wc_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C1c); + wd_t = SHA256_EXPAND (wb_t, w6_t, we_t, wd_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C1d); + we_t = SHA256_EXPAND (wc_t, w7_t, wf_t, we_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C1e); + wf_t = SHA256_EXPAND (wd_t, w8_t, w0_t, wf_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C1f); + + w0_t = SHA256_EXPAND (we_t, w9_t, w1_t, w0_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C20); + w1_t = SHA256_EXPAND (wf_t, wa_t, w2_t, w1_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C21); + w2_t = SHA256_EXPAND (w0_t, wb_t, w3_t, w2_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C22); + w3_t = SHA256_EXPAND (w1_t, wc_t, w4_t, w3_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C23); + w4_t = SHA256_EXPAND (w2_t, wd_t, w5_t, w4_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C24); + w5_t = SHA256_EXPAND (w3_t, we_t, w6_t, w5_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C25); + w6_t = SHA256_EXPAND (w4_t, wf_t, w7_t, w6_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C26); + w7_t = SHA256_EXPAND (w5_t, w0_t, w8_t, w7_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C27); + w8_t = SHA256_EXPAND (w6_t, w1_t, w9_t, w8_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C28); + w9_t = SHA256_EXPAND (w7_t, w2_t, wa_t, w9_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C29); + wa_t = SHA256_EXPAND (w8_t, w3_t, wb_t, wa_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C2a); + wb_t = SHA256_EXPAND (w9_t, w4_t, wc_t, wb_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C2b); + wc_t = SHA256_EXPAND (wa_t, w5_t, wd_t, wc_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C2c); + wd_t = SHA256_EXPAND (wb_t, w6_t, we_t, wd_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C2d); + we_t = SHA256_EXPAND (wc_t, w7_t, wf_t, we_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C2e); + wf_t = SHA256_EXPAND (wd_t, w8_t, w0_t, wf_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C2f); + + w0_t = SHA256_EXPAND (we_t, w9_t, w1_t, w0_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C30); + w1_t = SHA256_EXPAND (wf_t, wa_t, w2_t, w1_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C31); + w2_t = SHA256_EXPAND (w0_t, wb_t, w3_t, w2_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C32); + w3_t = SHA256_EXPAND (w1_t, wc_t, w4_t, w3_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C33); + w4_t = SHA256_EXPAND (w2_t, wd_t, w5_t, w4_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C34); + w5_t = SHA256_EXPAND (w3_t, we_t, w6_t, w5_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C35); + w6_t = SHA256_EXPAND (w4_t, wf_t, w7_t, w6_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C36); + w7_t = SHA256_EXPAND (w5_t, w0_t, w8_t, w7_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C37); + w8_t = SHA256_EXPAND (w6_t, w1_t, w9_t, w8_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C38); + w9_t = SHA256_EXPAND (w7_t, w2_t, wa_t, w9_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C39); + wa_t = SHA256_EXPAND (w8_t, w3_t, wb_t, wa_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C3a); + wb_t = SHA256_EXPAND (w9_t, w4_t, wc_t, wb_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C3b); + wc_t = SHA256_EXPAND (wa_t, w5_t, wd_t, wc_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C3c); + wd_t = SHA256_EXPAND (wb_t, w6_t, we_t, wd_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C3d); + we_t = SHA256_EXPAND (wc_t, w7_t, wf_t, we_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C3e); + wf_t = SHA256_EXPAND (wd_t, w8_t, w0_t, wf_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C3f); + + const u32x r0 = d; + const u32x r1 = h; + const u32x r2 = c; + const u32x r3 = g; + + #include VECT_COMPARE_S + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m12600_s08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m12600_s16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/amd/m12600_a3.cl b/amd/m12600_a3.cl new file mode 100644 index 0000000000..ae31557518 --- /dev/null +++ b/amd/m12600_a3.cl @@ -0,0 +1,1178 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _SHA256_SHA1_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW4 +#define VECT_SIZE4 +#endif + +#ifdef VLIW5 +#define VECT_SIZE4 +#endif + +#define DGST_R0 3 +#define DGST_R1 7 +#define DGST_R2 2 +#define DGST_R3 6 + +#include "include/kernel_functions.c" +#include "types_amd.c" +#include "common_amd.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +#ifdef VECT_SIZE1 +#define uint_to_hex_upper8(i) l_bin2asc[(i)] +#endif + +#ifdef VECT_SIZE2 +#define uint_to_hex_upper8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1]) +#endif + +#ifdef VECT_SIZE4 +#define uint_to_hex_upper8(i) (u32x) (l_bin2asc[(i).s0], l_bin2asc[(i).s1], l_bin2asc[(i).s2], l_bin2asc[(i).s3]) +#endif + +static void m12600m (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], const u32 pw_len, __global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, __local u32 l_bin2asc[256]) +{ + /** + * modifier + */ + + const u32 gid = get_global_id (0); + const u32 lid = get_local_id (0); + + /** + * salt + */ + + u32 pc256[8]; + + pc256[0] = salt_bufs[salt_pos].salt_buf_pc[0]; + pc256[1] = salt_bufs[salt_pos].salt_buf_pc[1]; + pc256[2] = salt_bufs[salt_pos].salt_buf_pc[2]; + pc256[3] = salt_bufs[salt_pos].salt_buf_pc[3]; + pc256[4] = salt_bufs[salt_pos].salt_buf_pc[4]; + pc256[5] = salt_bufs[salt_pos].salt_buf_pc[5]; + pc256[6] = salt_bufs[salt_pos].salt_buf_pc[6]; + pc256[7] = salt_bufs[salt_pos].salt_buf_pc[7]; + + /** + * loop + */ + + u32x w0l = w0[0]; + + for (u32 il_pos = 0; il_pos < bfs_cnt; il_pos++) + { + const u32 w0r = bfs_buf[il_pos].i; + + w0[0] = w0l | w0r; + + /** + * sha1 + */ + + u32x w0_t = w0[0]; + u32x w1_t = w0[1]; + u32x w2_t = w0[2]; + u32x w3_t = w0[3]; + u32x w4_t = w1[0]; + u32x w5_t = w1[1]; + u32x w6_t = w1[2]; + u32x w7_t = w1[3]; + u32x w8_t = w2[0]; + u32x w9_t = w2[1]; + u32x wa_t = w2[2]; + u32x wb_t = w2[3]; + u32x wc_t = w3[0]; + u32x wd_t = w3[1]; + u32x we_t = 0; + u32x wf_t = pw_len * 8; + + u32x a = SHA1M_A; + u32x b = SHA1M_B; + u32x c = SHA1M_C; + u32x d = SHA1M_D; + u32x e = SHA1M_E; + u32x f = 0; + u32x g = 0; + u32x h = 0; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w0_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w1_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w2_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w3_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w4_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w5_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w6_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w7_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w8_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w9_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wa_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, wb_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, wc_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, wd_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, we_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F0o, e, a, b, c, d, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F0o, d, e, a, b, c, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F0o, c, d, e, a, b, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F0o, b, c, d, e, a, w3_t); + + #undef K + #define K SHA1C01 + + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w7_t); + + #undef K + #define K SHA1C02 + + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wb_t); + + #undef K + #define K SHA1C03 + + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wf_t); + + a += SHA1M_A; + b += SHA1M_B; + c += SHA1M_C; + d += SHA1M_D; + e += SHA1M_E; + + /** + * sha256 + */ + + w0_t = uint_to_hex_upper8 ((a >> 24) & 255) << 0 + | uint_to_hex_upper8 ((a >> 16) & 255) << 16; + w1_t = uint_to_hex_upper8 ((a >> 8) & 255) << 0 + | uint_to_hex_upper8 ((a >> 0) & 255) << 16; + w2_t = uint_to_hex_upper8 ((b >> 24) & 255) << 0 + | uint_to_hex_upper8 ((b >> 16) & 255) << 16; + w3_t = uint_to_hex_upper8 ((b >> 8) & 255) << 0 + | uint_to_hex_upper8 ((b >> 0) & 255) << 16; + w4_t = uint_to_hex_upper8 ((c >> 24) & 255) << 0 + | uint_to_hex_upper8 ((c >> 16) & 255) << 16; + w5_t = uint_to_hex_upper8 ((c >> 8) & 255) << 0 + | uint_to_hex_upper8 ((c >> 0) & 255) << 16; + w6_t = uint_to_hex_upper8 ((d >> 24) & 255) << 0 + | uint_to_hex_upper8 ((d >> 16) & 255) << 16; + w7_t = uint_to_hex_upper8 ((d >> 8) & 255) << 0 + | uint_to_hex_upper8 ((d >> 0) & 255) << 16; + w8_t = uint_to_hex_upper8 ((e >> 24) & 255) << 0 + | uint_to_hex_upper8 ((e >> 16) & 255) << 16; + w9_t = uint_to_hex_upper8 ((e >> 8) & 255) << 0 + | uint_to_hex_upper8 ((e >> 0) & 255) << 16; + + w0_t = swap_workaround (w0_t); + w1_t = swap_workaround (w1_t); + w2_t = swap_workaround (w2_t); + w3_t = swap_workaround (w3_t); + w4_t = swap_workaround (w4_t); + w5_t = swap_workaround (w5_t); + w6_t = swap_workaround (w6_t); + w7_t = swap_workaround (w7_t); + w8_t = swap_workaround (w8_t); + w9_t = swap_workaround (w9_t); + wa_t = 0x80000000; + wb_t = 0; + wc_t = 0; + wd_t = 0; + we_t = 0; + wf_t = (64 + 40) * 8; + + a = pc256[0]; + b = pc256[1]; + c = pc256[2]; + d = pc256[3]; + e = pc256[4]; + f = pc256[5]; + g = pc256[6]; + h = pc256[7]; + + SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C00); + SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C01); + SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C02); + SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C03); + SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C04); + SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C05); + SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C06); + SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C07); + SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C08); + SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C09); + SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C0a); + SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C0b); + SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C0c); + SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C0d); + SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C0e); + SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C0f); + + w0_t = SHA256_EXPAND (we_t, w9_t, w1_t, w0_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C10); + w1_t = SHA256_EXPAND (wf_t, wa_t, w2_t, w1_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C11); + w2_t = SHA256_EXPAND (w0_t, wb_t, w3_t, w2_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C12); + w3_t = SHA256_EXPAND (w1_t, wc_t, w4_t, w3_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C13); + w4_t = SHA256_EXPAND (w2_t, wd_t, w5_t, w4_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C14); + w5_t = SHA256_EXPAND (w3_t, we_t, w6_t, w5_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C15); + w6_t = SHA256_EXPAND (w4_t, wf_t, w7_t, w6_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C16); + w7_t = SHA256_EXPAND (w5_t, w0_t, w8_t, w7_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C17); + w8_t = SHA256_EXPAND (w6_t, w1_t, w9_t, w8_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C18); + w9_t = SHA256_EXPAND (w7_t, w2_t, wa_t, w9_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C19); + wa_t = SHA256_EXPAND (w8_t, w3_t, wb_t, wa_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C1a); + wb_t = SHA256_EXPAND (w9_t, w4_t, wc_t, wb_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C1b); + wc_t = SHA256_EXPAND (wa_t, w5_t, wd_t, wc_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C1c); + wd_t = SHA256_EXPAND (wb_t, w6_t, we_t, wd_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C1d); + we_t = SHA256_EXPAND (wc_t, w7_t, wf_t, we_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C1e); + wf_t = SHA256_EXPAND (wd_t, w8_t, w0_t, wf_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C1f); + + w0_t = SHA256_EXPAND (we_t, w9_t, w1_t, w0_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C20); + w1_t = SHA256_EXPAND (wf_t, wa_t, w2_t, w1_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C21); + w2_t = SHA256_EXPAND (w0_t, wb_t, w3_t, w2_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C22); + w3_t = SHA256_EXPAND (w1_t, wc_t, w4_t, w3_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C23); + w4_t = SHA256_EXPAND (w2_t, wd_t, w5_t, w4_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C24); + w5_t = SHA256_EXPAND (w3_t, we_t, w6_t, w5_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C25); + w6_t = SHA256_EXPAND (w4_t, wf_t, w7_t, w6_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C26); + w7_t = SHA256_EXPAND (w5_t, w0_t, w8_t, w7_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C27); + w8_t = SHA256_EXPAND (w6_t, w1_t, w9_t, w8_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C28); + w9_t = SHA256_EXPAND (w7_t, w2_t, wa_t, w9_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C29); + wa_t = SHA256_EXPAND (w8_t, w3_t, wb_t, wa_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C2a); + wb_t = SHA256_EXPAND (w9_t, w4_t, wc_t, wb_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C2b); + wc_t = SHA256_EXPAND (wa_t, w5_t, wd_t, wc_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C2c); + wd_t = SHA256_EXPAND (wb_t, w6_t, we_t, wd_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C2d); + we_t = SHA256_EXPAND (wc_t, w7_t, wf_t, we_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C2e); + wf_t = SHA256_EXPAND (wd_t, w8_t, w0_t, wf_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C2f); + + w0_t = SHA256_EXPAND (we_t, w9_t, w1_t, w0_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C30); + w1_t = SHA256_EXPAND (wf_t, wa_t, w2_t, w1_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C31); + w2_t = SHA256_EXPAND (w0_t, wb_t, w3_t, w2_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C32); + w3_t = SHA256_EXPAND (w1_t, wc_t, w4_t, w3_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C33); + w4_t = SHA256_EXPAND (w2_t, wd_t, w5_t, w4_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C34); + w5_t = SHA256_EXPAND (w3_t, we_t, w6_t, w5_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C35); + w6_t = SHA256_EXPAND (w4_t, wf_t, w7_t, w6_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C36); + w7_t = SHA256_EXPAND (w5_t, w0_t, w8_t, w7_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C37); + w8_t = SHA256_EXPAND (w6_t, w1_t, w9_t, w8_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C38); + w9_t = SHA256_EXPAND (w7_t, w2_t, wa_t, w9_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C39); + wa_t = SHA256_EXPAND (w8_t, w3_t, wb_t, wa_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C3a); + wb_t = SHA256_EXPAND (w9_t, w4_t, wc_t, wb_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C3b); + wc_t = SHA256_EXPAND (wa_t, w5_t, wd_t, wc_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C3c); + wd_t = SHA256_EXPAND (wb_t, w6_t, we_t, wd_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C3d); + we_t = SHA256_EXPAND (wc_t, w7_t, wf_t, we_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C3e); + wf_t = SHA256_EXPAND (wd_t, w8_t, w0_t, wf_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C3f); + + const u32x r0 = d; + const u32x r1 = h; + const u32x r2 = c; + const u32x r3 = g; + + #include VECT_COMPARE_M + } +} + +static void m12600s (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], const u32 pw_len, __global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, __local u32 l_bin2asc[256]) +{ + /** + * modifier + */ + + const u32 gid = get_global_id (0); + const u32 lid = get_local_id (0); + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * salt + */ + + u32 pc256[8]; + + pc256[0] = salt_bufs[salt_pos].salt_buf_pc[0]; + pc256[1] = salt_bufs[salt_pos].salt_buf_pc[1]; + pc256[2] = salt_bufs[salt_pos].salt_buf_pc[2]; + pc256[3] = salt_bufs[salt_pos].salt_buf_pc[3]; + pc256[4] = salt_bufs[salt_pos].salt_buf_pc[4]; + pc256[5] = salt_bufs[salt_pos].salt_buf_pc[5]; + pc256[6] = salt_bufs[salt_pos].salt_buf_pc[6]; + pc256[7] = salt_bufs[salt_pos].salt_buf_pc[7]; + + /** + * loop + */ + + u32x w0l = w0[0]; + + for (u32 il_pos = 0; il_pos < bfs_cnt; il_pos++) + { + const u32 w0r = bfs_buf[il_pos].i; + + w0[0] = w0l | w0r; + + /** + * sha1 + */ + + u32x w0_t = w0[0]; + u32x w1_t = w0[1]; + u32x w2_t = w0[2]; + u32x w3_t = w0[3]; + u32x w4_t = w1[0]; + u32x w5_t = w1[1]; + u32x w6_t = w1[2]; + u32x w7_t = w1[3]; + u32x w8_t = w2[0]; + u32x w9_t = w2[1]; + u32x wa_t = w2[2]; + u32x wb_t = w2[3]; + u32x wc_t = w3[0]; + u32x wd_t = w3[1]; + u32x we_t = 0; + u32x wf_t = pw_len * 8; + + u32x a = SHA1M_A; + u32x b = SHA1M_B; + u32x c = SHA1M_C; + u32x d = SHA1M_D; + u32x e = SHA1M_E; + u32x f = 0; + u32x g = 0; + u32x h = 0; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w0_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w1_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w2_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w3_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w4_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w5_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w6_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w7_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w8_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w9_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wa_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, wb_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, wc_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, wd_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, we_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F0o, e, a, b, c, d, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F0o, d, e, a, b, c, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F0o, c, d, e, a, b, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F0o, b, c, d, e, a, w3_t); + + #undef K + #define K SHA1C01 + + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w7_t); + + #undef K + #define K SHA1C02 + + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wb_t); + + #undef K + #define K SHA1C03 + + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wf_t); + + a += SHA1M_A; + b += SHA1M_B; + c += SHA1M_C; + d += SHA1M_D; + e += SHA1M_E; + + /** + * sha256 + */ + + w0_t = uint_to_hex_upper8 ((a >> 24) & 255) << 0 + | uint_to_hex_upper8 ((a >> 16) & 255) << 16; + w1_t = uint_to_hex_upper8 ((a >> 8) & 255) << 0 + | uint_to_hex_upper8 ((a >> 0) & 255) << 16; + w2_t = uint_to_hex_upper8 ((b >> 24) & 255) << 0 + | uint_to_hex_upper8 ((b >> 16) & 255) << 16; + w3_t = uint_to_hex_upper8 ((b >> 8) & 255) << 0 + | uint_to_hex_upper8 ((b >> 0) & 255) << 16; + w4_t = uint_to_hex_upper8 ((c >> 24) & 255) << 0 + | uint_to_hex_upper8 ((c >> 16) & 255) << 16; + w5_t = uint_to_hex_upper8 ((c >> 8) & 255) << 0 + | uint_to_hex_upper8 ((c >> 0) & 255) << 16; + w6_t = uint_to_hex_upper8 ((d >> 24) & 255) << 0 + | uint_to_hex_upper8 ((d >> 16) & 255) << 16; + w7_t = uint_to_hex_upper8 ((d >> 8) & 255) << 0 + | uint_to_hex_upper8 ((d >> 0) & 255) << 16; + w8_t = uint_to_hex_upper8 ((e >> 24) & 255) << 0 + | uint_to_hex_upper8 ((e >> 16) & 255) << 16; + w9_t = uint_to_hex_upper8 ((e >> 8) & 255) << 0 + | uint_to_hex_upper8 ((e >> 0) & 255) << 16; + + w0_t = swap_workaround (w0_t); + w1_t = swap_workaround (w1_t); + w2_t = swap_workaround (w2_t); + w3_t = swap_workaround (w3_t); + w4_t = swap_workaround (w4_t); + w5_t = swap_workaround (w5_t); + w6_t = swap_workaround (w6_t); + w7_t = swap_workaround (w7_t); + w8_t = swap_workaround (w8_t); + w9_t = swap_workaround (w9_t); + wa_t = 0x80000000; + wb_t = 0; + wc_t = 0; + wd_t = 0; + we_t = 0; + wf_t = (64 + 40) * 8; + + a = pc256[0]; + b = pc256[1]; + c = pc256[2]; + d = pc256[3]; + e = pc256[4]; + f = pc256[5]; + g = pc256[6]; + h = pc256[7]; + + SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C00); + SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C01); + SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C02); + SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C03); + SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C04); + SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C05); + SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C06); + SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C07); + SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C08); + SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C09); + SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C0a); + SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C0b); + SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C0c); + SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C0d); + SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C0e); + SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C0f); + + w0_t = SHA256_EXPAND (we_t, w9_t, w1_t, w0_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C10); + w1_t = SHA256_EXPAND (wf_t, wa_t, w2_t, w1_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C11); + w2_t = SHA256_EXPAND (w0_t, wb_t, w3_t, w2_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C12); + w3_t = SHA256_EXPAND (w1_t, wc_t, w4_t, w3_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C13); + w4_t = SHA256_EXPAND (w2_t, wd_t, w5_t, w4_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C14); + w5_t = SHA256_EXPAND (w3_t, we_t, w6_t, w5_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C15); + w6_t = SHA256_EXPAND (w4_t, wf_t, w7_t, w6_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C16); + w7_t = SHA256_EXPAND (w5_t, w0_t, w8_t, w7_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C17); + w8_t = SHA256_EXPAND (w6_t, w1_t, w9_t, w8_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C18); + w9_t = SHA256_EXPAND (w7_t, w2_t, wa_t, w9_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C19); + wa_t = SHA256_EXPAND (w8_t, w3_t, wb_t, wa_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C1a); + wb_t = SHA256_EXPAND (w9_t, w4_t, wc_t, wb_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C1b); + wc_t = SHA256_EXPAND (wa_t, w5_t, wd_t, wc_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C1c); + wd_t = SHA256_EXPAND (wb_t, w6_t, we_t, wd_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C1d); + we_t = SHA256_EXPAND (wc_t, w7_t, wf_t, we_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C1e); + wf_t = SHA256_EXPAND (wd_t, w8_t, w0_t, wf_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C1f); + + w0_t = SHA256_EXPAND (we_t, w9_t, w1_t, w0_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C20); + w1_t = SHA256_EXPAND (wf_t, wa_t, w2_t, w1_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C21); + w2_t = SHA256_EXPAND (w0_t, wb_t, w3_t, w2_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C22); + w3_t = SHA256_EXPAND (w1_t, wc_t, w4_t, w3_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C23); + w4_t = SHA256_EXPAND (w2_t, wd_t, w5_t, w4_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C24); + w5_t = SHA256_EXPAND (w3_t, we_t, w6_t, w5_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C25); + w6_t = SHA256_EXPAND (w4_t, wf_t, w7_t, w6_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C26); + w7_t = SHA256_EXPAND (w5_t, w0_t, w8_t, w7_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C27); + w8_t = SHA256_EXPAND (w6_t, w1_t, w9_t, w8_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C28); + w9_t = SHA256_EXPAND (w7_t, w2_t, wa_t, w9_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C29); + wa_t = SHA256_EXPAND (w8_t, w3_t, wb_t, wa_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C2a); + wb_t = SHA256_EXPAND (w9_t, w4_t, wc_t, wb_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C2b); + wc_t = SHA256_EXPAND (wa_t, w5_t, wd_t, wc_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C2c); + wd_t = SHA256_EXPAND (wb_t, w6_t, we_t, wd_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C2d); + we_t = SHA256_EXPAND (wc_t, w7_t, wf_t, we_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C2e); + wf_t = SHA256_EXPAND (wd_t, w8_t, w0_t, wf_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C2f); + + w0_t = SHA256_EXPAND (we_t, w9_t, w1_t, w0_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C30); + w1_t = SHA256_EXPAND (wf_t, wa_t, w2_t, w1_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C31); + w2_t = SHA256_EXPAND (w0_t, wb_t, w3_t, w2_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C32); + w3_t = SHA256_EXPAND (w1_t, wc_t, w4_t, w3_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C33); + w4_t = SHA256_EXPAND (w2_t, wd_t, w5_t, w4_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C34); + w5_t = SHA256_EXPAND (w3_t, we_t, w6_t, w5_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C35); + w6_t = SHA256_EXPAND (w4_t, wf_t, w7_t, w6_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C36); + w7_t = SHA256_EXPAND (w5_t, w0_t, w8_t, w7_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C37); + w8_t = SHA256_EXPAND (w6_t, w1_t, w9_t, w8_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C38); + w9_t = SHA256_EXPAND (w7_t, w2_t, wa_t, w9_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C39); + wa_t = SHA256_EXPAND (w8_t, w3_t, wb_t, wa_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C3a); + wb_t = SHA256_EXPAND (w9_t, w4_t, wc_t, wb_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C3b); + wc_t = SHA256_EXPAND (wa_t, w5_t, wd_t, wc_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C3c); + wd_t = SHA256_EXPAND (wb_t, w6_t, we_t, wd_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C3d); + we_t = SHA256_EXPAND (wc_t, w7_t, wf_t, we_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C3e); + wf_t = SHA256_EXPAND (wd_t, w8_t, w0_t, wf_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C3f); + + const u32x r0 = d; + const u32x r1 = h; + const u32x r2 = c; + const u32x r3 = g; + + #include VECT_COMPARE_S + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m12600_m04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = pws[gid].i[15]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * bin2asc table + */ + + __local u32 l_bin2asc[256]; + + const u32 lid4 = lid * 4; + + const u32 lid40 = lid4 + 0; + const u32 lid41 = lid4 + 1; + const u32 lid42 = lid4 + 2; + const u32 lid43 = lid4 + 3; + + const u32 v400 = (lid40 >> 0) & 15; + const u32 v401 = (lid40 >> 4) & 15; + const u32 v410 = (lid41 >> 0) & 15; + const u32 v411 = (lid41 >> 4) & 15; + const u32 v420 = (lid42 >> 0) & 15; + const u32 v421 = (lid42 >> 4) & 15; + const u32 v430 = (lid43 >> 0) & 15; + const u32 v431 = (lid43 >> 4) & 15; + + l_bin2asc[lid40] = ((v400 < 10) ? '0' + v400 : 'A' - 10 + v400) << 8 + | ((v401 < 10) ? '0' + v401 : 'A' - 10 + v401) << 0; + l_bin2asc[lid41] = ((v410 < 10) ? '0' + v410 : 'A' - 10 + v410) << 8 + | ((v411 < 10) ? '0' + v411 : 'A' - 10 + v411) << 0; + l_bin2asc[lid42] = ((v420 < 10) ? '0' + v420 : 'A' - 10 + v420) << 8 + | ((v421 < 10) ? '0' + v421 : 'A' - 10 + v421) << 0; + l_bin2asc[lid43] = ((v430 < 10) ? '0' + v430 : 'A' - 10 + v430) << 8 + | ((v431 < 10) ? '0' + v431 : 'A' - 10 + v431) << 0; + + barrier (CLK_LOCAL_MEM_FENCE); + + if (gid >= gid_max) return; + + /** + * main + */ + + m12600m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset, l_bin2asc); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m12600_m08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = pws[gid].i[15]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * bin2asc table + */ + + __local u32 l_bin2asc[256]; + + const u32 lid4 = lid * 4; + + const u32 lid40 = lid4 + 0; + const u32 lid41 = lid4 + 1; + const u32 lid42 = lid4 + 2; + const u32 lid43 = lid4 + 3; + + const u32 v400 = (lid40 >> 0) & 15; + const u32 v401 = (lid40 >> 4) & 15; + const u32 v410 = (lid41 >> 0) & 15; + const u32 v411 = (lid41 >> 4) & 15; + const u32 v420 = (lid42 >> 0) & 15; + const u32 v421 = (lid42 >> 4) & 15; + const u32 v430 = (lid43 >> 0) & 15; + const u32 v431 = (lid43 >> 4) & 15; + + l_bin2asc[lid40] = ((v400 < 10) ? '0' + v400 : 'A' - 10 + v400) << 8 + | ((v401 < 10) ? '0' + v401 : 'A' - 10 + v401) << 0; + l_bin2asc[lid41] = ((v410 < 10) ? '0' + v410 : 'A' - 10 + v410) << 8 + | ((v411 < 10) ? '0' + v411 : 'A' - 10 + v411) << 0; + l_bin2asc[lid42] = ((v420 < 10) ? '0' + v420 : 'A' - 10 + v420) << 8 + | ((v421 < 10) ? '0' + v421 : 'A' - 10 + v421) << 0; + l_bin2asc[lid43] = ((v430 < 10) ? '0' + v430 : 'A' - 10 + v430) << 8 + | ((v431 < 10) ? '0' + v431 : 'A' - 10 + v431) << 0; + + barrier (CLK_LOCAL_MEM_FENCE); + + if (gid >= gid_max) return; + + /** + * main + */ + + m12600m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset, l_bin2asc); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m12600_m16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = pws[gid].i[ 8]; + w2[1] = pws[gid].i[ 9]; + w2[2] = pws[gid].i[10]; + w2[3] = pws[gid].i[11]; + + u32x w3[4]; + + w3[0] = pws[gid].i[12]; + w3[1] = pws[gid].i[13]; + w3[2] = pws[gid].i[14]; + w3[3] = pws[gid].i[15]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * bin2asc table + */ + + __local u32 l_bin2asc[256]; + + const u32 lid4 = lid * 4; + + const u32 lid40 = lid4 + 0; + const u32 lid41 = lid4 + 1; + const u32 lid42 = lid4 + 2; + const u32 lid43 = lid4 + 3; + + const u32 v400 = (lid40 >> 0) & 15; + const u32 v401 = (lid40 >> 4) & 15; + const u32 v410 = (lid41 >> 0) & 15; + const u32 v411 = (lid41 >> 4) & 15; + const u32 v420 = (lid42 >> 0) & 15; + const u32 v421 = (lid42 >> 4) & 15; + const u32 v430 = (lid43 >> 0) & 15; + const u32 v431 = (lid43 >> 4) & 15; + + l_bin2asc[lid40] = ((v400 < 10) ? '0' + v400 : 'A' - 10 + v400) << 8 + | ((v401 < 10) ? '0' + v401 : 'A' - 10 + v401) << 0; + l_bin2asc[lid41] = ((v410 < 10) ? '0' + v410 : 'A' - 10 + v410) << 8 + | ((v411 < 10) ? '0' + v411 : 'A' - 10 + v411) << 0; + l_bin2asc[lid42] = ((v420 < 10) ? '0' + v420 : 'A' - 10 + v420) << 8 + | ((v421 < 10) ? '0' + v421 : 'A' - 10 + v421) << 0; + l_bin2asc[lid43] = ((v430 < 10) ? '0' + v430 : 'A' - 10 + v430) << 8 + | ((v431 < 10) ? '0' + v431 : 'A' - 10 + v431) << 0; + + barrier (CLK_LOCAL_MEM_FENCE); + + if (gid >= gid_max) return; + + /** + * main + */ + + m12600m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset, l_bin2asc); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m12600_s04 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = pws[gid].i[15]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * bin2asc table + */ + + __local u32 l_bin2asc[256]; + + const u32 lid4 = lid * 4; + + const u32 lid40 = lid4 + 0; + const u32 lid41 = lid4 + 1; + const u32 lid42 = lid4 + 2; + const u32 lid43 = lid4 + 3; + + const u32 v400 = (lid40 >> 0) & 15; + const u32 v401 = (lid40 >> 4) & 15; + const u32 v410 = (lid41 >> 0) & 15; + const u32 v411 = (lid41 >> 4) & 15; + const u32 v420 = (lid42 >> 0) & 15; + const u32 v421 = (lid42 >> 4) & 15; + const u32 v430 = (lid43 >> 0) & 15; + const u32 v431 = (lid43 >> 4) & 15; + + l_bin2asc[lid40] = ((v400 < 10) ? '0' + v400 : 'A' - 10 + v400) << 8 + | ((v401 < 10) ? '0' + v401 : 'A' - 10 + v401) << 0; + l_bin2asc[lid41] = ((v410 < 10) ? '0' + v410 : 'A' - 10 + v410) << 8 + | ((v411 < 10) ? '0' + v411 : 'A' - 10 + v411) << 0; + l_bin2asc[lid42] = ((v420 < 10) ? '0' + v420 : 'A' - 10 + v420) << 8 + | ((v421 < 10) ? '0' + v421 : 'A' - 10 + v421) << 0; + l_bin2asc[lid43] = ((v430 < 10) ? '0' + v430 : 'A' - 10 + v430) << 8 + | ((v431 < 10) ? '0' + v431 : 'A' - 10 + v431) << 0; + + barrier (CLK_LOCAL_MEM_FENCE); + + if (gid >= gid_max) return; + + /** + * main + */ + + m12600s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset, l_bin2asc); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m12600_s08 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = pws[gid].i[15]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * bin2asc table + */ + + __local u32 l_bin2asc[256]; + + const u32 lid4 = lid * 4; + + const u32 lid40 = lid4 + 0; + const u32 lid41 = lid4 + 1; + const u32 lid42 = lid4 + 2; + const u32 lid43 = lid4 + 3; + + const u32 v400 = (lid40 >> 0) & 15; + const u32 v401 = (lid40 >> 4) & 15; + const u32 v410 = (lid41 >> 0) & 15; + const u32 v411 = (lid41 >> 4) & 15; + const u32 v420 = (lid42 >> 0) & 15; + const u32 v421 = (lid42 >> 4) & 15; + const u32 v430 = (lid43 >> 0) & 15; + const u32 v431 = (lid43 >> 4) & 15; + + l_bin2asc[lid40] = ((v400 < 10) ? '0' + v400 : 'A' - 10 + v400) << 8 + | ((v401 < 10) ? '0' + v401 : 'A' - 10 + v401) << 0; + l_bin2asc[lid41] = ((v410 < 10) ? '0' + v410 : 'A' - 10 + v410) << 8 + | ((v411 < 10) ? '0' + v411 : 'A' - 10 + v411) << 0; + l_bin2asc[lid42] = ((v420 < 10) ? '0' + v420 : 'A' - 10 + v420) << 8 + | ((v421 < 10) ? '0' + v421 : 'A' - 10 + v421) << 0; + l_bin2asc[lid43] = ((v430 < 10) ? '0' + v430 : 'A' - 10 + v430) << 8 + | ((v431 < 10) ? '0' + v431 : 'A' - 10 + v431) << 0; + + barrier (CLK_LOCAL_MEM_FENCE); + + if (gid >= gid_max) return; + + /** + * main + */ + + m12600s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset, l_bin2asc); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m12600_s16 (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global void *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + /** + * modifier + */ + + const u32 lid = get_local_id (0); + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = pws[gid].i[ 8]; + w2[1] = pws[gid].i[ 9]; + w2[2] = pws[gid].i[10]; + w2[3] = pws[gid].i[11]; + + u32x w3[4]; + + w3[0] = pws[gid].i[12]; + w3[1] = pws[gid].i[13]; + w3[2] = pws[gid].i[14]; + w3[3] = pws[gid].i[15]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * bin2asc table + */ + + __local u32 l_bin2asc[256]; + + const u32 lid4 = lid * 4; + + const u32 lid40 = lid4 + 0; + const u32 lid41 = lid4 + 1; + const u32 lid42 = lid4 + 2; + const u32 lid43 = lid4 + 3; + + const u32 v400 = (lid40 >> 0) & 15; + const u32 v401 = (lid40 >> 4) & 15; + const u32 v410 = (lid41 >> 0) & 15; + const u32 v411 = (lid41 >> 4) & 15; + const u32 v420 = (lid42 >> 0) & 15; + const u32 v421 = (lid42 >> 4) & 15; + const u32 v430 = (lid43 >> 0) & 15; + const u32 v431 = (lid43 >> 4) & 15; + + l_bin2asc[lid40] = ((v400 < 10) ? '0' + v400 : 'A' - 10 + v400) << 8 + | ((v401 < 10) ? '0' + v401 : 'A' - 10 + v401) << 0; + l_bin2asc[lid41] = ((v410 < 10) ? '0' + v410 : 'A' - 10 + v410) << 8 + | ((v411 < 10) ? '0' + v411 : 'A' - 10 + v411) << 0; + l_bin2asc[lid42] = ((v420 < 10) ? '0' + v420 : 'A' - 10 + v420) << 8 + | ((v421 < 10) ? '0' + v421 : 'A' - 10 + v421) << 0; + l_bin2asc[lid43] = ((v430 < 10) ? '0' + v430 : 'A' - 10 + v430) << 8 + | ((v431 < 10) ? '0' + v431 : 'A' - 10 + v431) << 0; + + barrier (CLK_LOCAL_MEM_FENCE); + + if (gid >= gid_max) return; + + /** + * main + */ + + m12600s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset, l_bin2asc); +} diff --git a/amd/m12700.cl b/amd/m12700.cl new file mode 100644 index 0000000000..5bbe450988 --- /dev/null +++ b/amd/m12700.cl @@ -0,0 +1,1600 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _SHA1_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW4 +#define VECT_SIZE1 +#endif + +#ifdef VLIW5 +#define VECT_SIZE1 +#endif + +#define DGST_R0 0 +#define DGST_R1 1 +#define DGST_R2 2 +#define DGST_R3 3 + +#include "include/kernel_functions.c" +#include "types_amd.c" +#include "common_amd.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +__constant u32 te0[256] = +{ + 0xc66363a5, 0xf87c7c84, 0xee777799, 0xf67b7b8d, + 0xfff2f20d, 0xd66b6bbd, 0xde6f6fb1, 0x91c5c554, + 0x60303050, 0x02010103, 0xce6767a9, 0x562b2b7d, + 0xe7fefe19, 0xb5d7d762, 0x4dababe6, 0xec76769a, + 0x8fcaca45, 0x1f82829d, 0x89c9c940, 0xfa7d7d87, + 0xeffafa15, 0xb25959eb, 0x8e4747c9, 0xfbf0f00b, + 0x41adadec, 0xb3d4d467, 0x5fa2a2fd, 0x45afafea, + 0x239c9cbf, 0x53a4a4f7, 0xe4727296, 0x9bc0c05b, + 0x75b7b7c2, 0xe1fdfd1c, 0x3d9393ae, 0x4c26266a, + 0x6c36365a, 0x7e3f3f41, 0xf5f7f702, 0x83cccc4f, + 0x6834345c, 0x51a5a5f4, 0xd1e5e534, 0xf9f1f108, + 0xe2717193, 0xabd8d873, 0x62313153, 0x2a15153f, + 0x0804040c, 0x95c7c752, 0x46232365, 0x9dc3c35e, + 0x30181828, 0x379696a1, 0x0a05050f, 0x2f9a9ab5, + 0x0e070709, 0x24121236, 0x1b80809b, 0xdfe2e23d, + 0xcdebeb26, 0x4e272769, 0x7fb2b2cd, 0xea75759f, + 0x1209091b, 0x1d83839e, 0x582c2c74, 0x341a1a2e, + 0x361b1b2d, 0xdc6e6eb2, 0xb45a5aee, 0x5ba0a0fb, + 0xa45252f6, 0x763b3b4d, 0xb7d6d661, 0x7db3b3ce, + 0x5229297b, 0xdde3e33e, 0x5e2f2f71, 0x13848497, + 0xa65353f5, 0xb9d1d168, 0x00000000, 0xc1eded2c, + 0x40202060, 0xe3fcfc1f, 0x79b1b1c8, 0xb65b5bed, + 0xd46a6abe, 0x8dcbcb46, 0x67bebed9, 0x7239394b, + 0x944a4ade, 0x984c4cd4, 0xb05858e8, 0x85cfcf4a, + 0xbbd0d06b, 0xc5efef2a, 0x4faaaae5, 0xedfbfb16, + 0x864343c5, 0x9a4d4dd7, 0x66333355, 0x11858594, + 0x8a4545cf, 0xe9f9f910, 0x04020206, 0xfe7f7f81, + 0xa05050f0, 0x783c3c44, 0x259f9fba, 0x4ba8a8e3, + 0xa25151f3, 0x5da3a3fe, 0x804040c0, 0x058f8f8a, + 0x3f9292ad, 0x219d9dbc, 0x70383848, 0xf1f5f504, + 0x63bcbcdf, 0x77b6b6c1, 0xafdada75, 0x42212163, + 0x20101030, 0xe5ffff1a, 0xfdf3f30e, 0xbfd2d26d, + 0x81cdcd4c, 0x180c0c14, 0x26131335, 0xc3ecec2f, + 0xbe5f5fe1, 0x359797a2, 0x884444cc, 0x2e171739, + 0x93c4c457, 0x55a7a7f2, 0xfc7e7e82, 0x7a3d3d47, + 0xc86464ac, 0xba5d5de7, 0x3219192b, 0xe6737395, + 0xc06060a0, 0x19818198, 0x9e4f4fd1, 0xa3dcdc7f, + 0x44222266, 0x542a2a7e, 0x3b9090ab, 0x0b888883, + 0x8c4646ca, 0xc7eeee29, 0x6bb8b8d3, 0x2814143c, + 0xa7dede79, 0xbc5e5ee2, 0x160b0b1d, 0xaddbdb76, + 0xdbe0e03b, 0x64323256, 0x743a3a4e, 0x140a0a1e, + 0x924949db, 0x0c06060a, 0x4824246c, 0xb85c5ce4, + 0x9fc2c25d, 0xbdd3d36e, 0x43acacef, 0xc46262a6, + 0x399191a8, 0x319595a4, 0xd3e4e437, 0xf279798b, + 0xd5e7e732, 0x8bc8c843, 0x6e373759, 0xda6d6db7, + 0x018d8d8c, 0xb1d5d564, 0x9c4e4ed2, 0x49a9a9e0, + 0xd86c6cb4, 0xac5656fa, 0xf3f4f407, 0xcfeaea25, + 0xca6565af, 0xf47a7a8e, 0x47aeaee9, 0x10080818, + 0x6fbabad5, 0xf0787888, 0x4a25256f, 0x5c2e2e72, + 0x381c1c24, 0x57a6a6f1, 0x73b4b4c7, 0x97c6c651, + 0xcbe8e823, 0xa1dddd7c, 0xe874749c, 0x3e1f1f21, + 0x964b4bdd, 0x61bdbddc, 0x0d8b8b86, 0x0f8a8a85, + 0xe0707090, 0x7c3e3e42, 0x71b5b5c4, 0xcc6666aa, + 0x904848d8, 0x06030305, 0xf7f6f601, 0x1c0e0e12, + 0xc26161a3, 0x6a35355f, 0xae5757f9, 0x69b9b9d0, + 0x17868691, 0x99c1c158, 0x3a1d1d27, 0x279e9eb9, + 0xd9e1e138, 0xebf8f813, 0x2b9898b3, 0x22111133, + 0xd26969bb, 0xa9d9d970, 0x078e8e89, 0x339494a7, + 0x2d9b9bb6, 0x3c1e1e22, 0x15878792, 0xc9e9e920, + 0x87cece49, 0xaa5555ff, 0x50282878, 0xa5dfdf7a, + 0x038c8c8f, 0x59a1a1f8, 0x09898980, 0x1a0d0d17, + 0x65bfbfda, 0xd7e6e631, 0x844242c6, 0xd06868b8, + 0x824141c3, 0x299999b0, 0x5a2d2d77, 0x1e0f0f11, + 0x7bb0b0cb, 0xa85454fc, 0x6dbbbbd6, 0x2c16163a, +}; + +__constant u32 te1[256] = +{ + 0xa5c66363, 0x84f87c7c, 0x99ee7777, 0x8df67b7b, + 0x0dfff2f2, 0xbdd66b6b, 0xb1de6f6f, 0x5491c5c5, + 0x50603030, 0x03020101, 0xa9ce6767, 0x7d562b2b, + 0x19e7fefe, 0x62b5d7d7, 0xe64dabab, 0x9aec7676, + 0x458fcaca, 0x9d1f8282, 0x4089c9c9, 0x87fa7d7d, + 0x15effafa, 0xebb25959, 0xc98e4747, 0x0bfbf0f0, + 0xec41adad, 0x67b3d4d4, 0xfd5fa2a2, 0xea45afaf, + 0xbf239c9c, 0xf753a4a4, 0x96e47272, 0x5b9bc0c0, + 0xc275b7b7, 0x1ce1fdfd, 0xae3d9393, 0x6a4c2626, + 0x5a6c3636, 0x417e3f3f, 0x02f5f7f7, 0x4f83cccc, + 0x5c683434, 0xf451a5a5, 0x34d1e5e5, 0x08f9f1f1, + 0x93e27171, 0x73abd8d8, 0x53623131, 0x3f2a1515, + 0x0c080404, 0x5295c7c7, 0x65462323, 0x5e9dc3c3, + 0x28301818, 0xa1379696, 0x0f0a0505, 0xb52f9a9a, + 0x090e0707, 0x36241212, 0x9b1b8080, 0x3ddfe2e2, + 0x26cdebeb, 0x694e2727, 0xcd7fb2b2, 0x9fea7575, + 0x1b120909, 0x9e1d8383, 0x74582c2c, 0x2e341a1a, + 0x2d361b1b, 0xb2dc6e6e, 0xeeb45a5a, 0xfb5ba0a0, + 0xf6a45252, 0x4d763b3b, 0x61b7d6d6, 0xce7db3b3, + 0x7b522929, 0x3edde3e3, 0x715e2f2f, 0x97138484, + 0xf5a65353, 0x68b9d1d1, 0x00000000, 0x2cc1eded, + 0x60402020, 0x1fe3fcfc, 0xc879b1b1, 0xedb65b5b, + 0xbed46a6a, 0x468dcbcb, 0xd967bebe, 0x4b723939, + 0xde944a4a, 0xd4984c4c, 0xe8b05858, 0x4a85cfcf, + 0x6bbbd0d0, 0x2ac5efef, 0xe54faaaa, 0x16edfbfb, + 0xc5864343, 0xd79a4d4d, 0x55663333, 0x94118585, + 0xcf8a4545, 0x10e9f9f9, 0x06040202, 0x81fe7f7f, + 0xf0a05050, 0x44783c3c, 0xba259f9f, 0xe34ba8a8, + 0xf3a25151, 0xfe5da3a3, 0xc0804040, 0x8a058f8f, + 0xad3f9292, 0xbc219d9d, 0x48703838, 0x04f1f5f5, + 0xdf63bcbc, 0xc177b6b6, 0x75afdada, 0x63422121, + 0x30201010, 0x1ae5ffff, 0x0efdf3f3, 0x6dbfd2d2, + 0x4c81cdcd, 0x14180c0c, 0x35261313, 0x2fc3ecec, + 0xe1be5f5f, 0xa2359797, 0xcc884444, 0x392e1717, + 0x5793c4c4, 0xf255a7a7, 0x82fc7e7e, 0x477a3d3d, + 0xacc86464, 0xe7ba5d5d, 0x2b321919, 0x95e67373, + 0xa0c06060, 0x98198181, 0xd19e4f4f, 0x7fa3dcdc, + 0x66442222, 0x7e542a2a, 0xab3b9090, 0x830b8888, + 0xca8c4646, 0x29c7eeee, 0xd36bb8b8, 0x3c281414, + 0x79a7dede, 0xe2bc5e5e, 0x1d160b0b, 0x76addbdb, + 0x3bdbe0e0, 0x56643232, 0x4e743a3a, 0x1e140a0a, + 0xdb924949, 0x0a0c0606, 0x6c482424, 0xe4b85c5c, + 0x5d9fc2c2, 0x6ebdd3d3, 0xef43acac, 0xa6c46262, + 0xa8399191, 0xa4319595, 0x37d3e4e4, 0x8bf27979, + 0x32d5e7e7, 0x438bc8c8, 0x596e3737, 0xb7da6d6d, + 0x8c018d8d, 0x64b1d5d5, 0xd29c4e4e, 0xe049a9a9, + 0xb4d86c6c, 0xfaac5656, 0x07f3f4f4, 0x25cfeaea, + 0xafca6565, 0x8ef47a7a, 0xe947aeae, 0x18100808, + 0xd56fbaba, 0x88f07878, 0x6f4a2525, 0x725c2e2e, + 0x24381c1c, 0xf157a6a6, 0xc773b4b4, 0x5197c6c6, + 0x23cbe8e8, 0x7ca1dddd, 0x9ce87474, 0x213e1f1f, + 0xdd964b4b, 0xdc61bdbd, 0x860d8b8b, 0x850f8a8a, + 0x90e07070, 0x427c3e3e, 0xc471b5b5, 0xaacc6666, + 0xd8904848, 0x05060303, 0x01f7f6f6, 0x121c0e0e, + 0xa3c26161, 0x5f6a3535, 0xf9ae5757, 0xd069b9b9, + 0x91178686, 0x5899c1c1, 0x273a1d1d, 0xb9279e9e, + 0x38d9e1e1, 0x13ebf8f8, 0xb32b9898, 0x33221111, + 0xbbd26969, 0x70a9d9d9, 0x89078e8e, 0xa7339494, + 0xb62d9b9b, 0x223c1e1e, 0x92158787, 0x20c9e9e9, + 0x4987cece, 0xffaa5555, 0x78502828, 0x7aa5dfdf, + 0x8f038c8c, 0xf859a1a1, 0x80098989, 0x171a0d0d, + 0xda65bfbf, 0x31d7e6e6, 0xc6844242, 0xb8d06868, + 0xc3824141, 0xb0299999, 0x775a2d2d, 0x111e0f0f, + 0xcb7bb0b0, 0xfca85454, 0xd66dbbbb, 0x3a2c1616, +}; + +__constant u32 te2[256] = +{ + 0x63a5c663, 0x7c84f87c, 0x7799ee77, 0x7b8df67b, + 0xf20dfff2, 0x6bbdd66b, 0x6fb1de6f, 0xc55491c5, + 0x30506030, 0x01030201, 0x67a9ce67, 0x2b7d562b, + 0xfe19e7fe, 0xd762b5d7, 0xabe64dab, 0x769aec76, + 0xca458fca, 0x829d1f82, 0xc94089c9, 0x7d87fa7d, + 0xfa15effa, 0x59ebb259, 0x47c98e47, 0xf00bfbf0, + 0xadec41ad, 0xd467b3d4, 0xa2fd5fa2, 0xafea45af, + 0x9cbf239c, 0xa4f753a4, 0x7296e472, 0xc05b9bc0, + 0xb7c275b7, 0xfd1ce1fd, 0x93ae3d93, 0x266a4c26, + 0x365a6c36, 0x3f417e3f, 0xf702f5f7, 0xcc4f83cc, + 0x345c6834, 0xa5f451a5, 0xe534d1e5, 0xf108f9f1, + 0x7193e271, 0xd873abd8, 0x31536231, 0x153f2a15, + 0x040c0804, 0xc75295c7, 0x23654623, 0xc35e9dc3, + 0x18283018, 0x96a13796, 0x050f0a05, 0x9ab52f9a, + 0x07090e07, 0x12362412, 0x809b1b80, 0xe23ddfe2, + 0xeb26cdeb, 0x27694e27, 0xb2cd7fb2, 0x759fea75, + 0x091b1209, 0x839e1d83, 0x2c74582c, 0x1a2e341a, + 0x1b2d361b, 0x6eb2dc6e, 0x5aeeb45a, 0xa0fb5ba0, + 0x52f6a452, 0x3b4d763b, 0xd661b7d6, 0xb3ce7db3, + 0x297b5229, 0xe33edde3, 0x2f715e2f, 0x84971384, + 0x53f5a653, 0xd168b9d1, 0x00000000, 0xed2cc1ed, + 0x20604020, 0xfc1fe3fc, 0xb1c879b1, 0x5bedb65b, + 0x6abed46a, 0xcb468dcb, 0xbed967be, 0x394b7239, + 0x4ade944a, 0x4cd4984c, 0x58e8b058, 0xcf4a85cf, + 0xd06bbbd0, 0xef2ac5ef, 0xaae54faa, 0xfb16edfb, + 0x43c58643, 0x4dd79a4d, 0x33556633, 0x85941185, + 0x45cf8a45, 0xf910e9f9, 0x02060402, 0x7f81fe7f, + 0x50f0a050, 0x3c44783c, 0x9fba259f, 0xa8e34ba8, + 0x51f3a251, 0xa3fe5da3, 0x40c08040, 0x8f8a058f, + 0x92ad3f92, 0x9dbc219d, 0x38487038, 0xf504f1f5, + 0xbcdf63bc, 0xb6c177b6, 0xda75afda, 0x21634221, + 0x10302010, 0xff1ae5ff, 0xf30efdf3, 0xd26dbfd2, + 0xcd4c81cd, 0x0c14180c, 0x13352613, 0xec2fc3ec, + 0x5fe1be5f, 0x97a23597, 0x44cc8844, 0x17392e17, + 0xc45793c4, 0xa7f255a7, 0x7e82fc7e, 0x3d477a3d, + 0x64acc864, 0x5de7ba5d, 0x192b3219, 0x7395e673, + 0x60a0c060, 0x81981981, 0x4fd19e4f, 0xdc7fa3dc, + 0x22664422, 0x2a7e542a, 0x90ab3b90, 0x88830b88, + 0x46ca8c46, 0xee29c7ee, 0xb8d36bb8, 0x143c2814, + 0xde79a7de, 0x5ee2bc5e, 0x0b1d160b, 0xdb76addb, + 0xe03bdbe0, 0x32566432, 0x3a4e743a, 0x0a1e140a, + 0x49db9249, 0x060a0c06, 0x246c4824, 0x5ce4b85c, + 0xc25d9fc2, 0xd36ebdd3, 0xacef43ac, 0x62a6c462, + 0x91a83991, 0x95a43195, 0xe437d3e4, 0x798bf279, + 0xe732d5e7, 0xc8438bc8, 0x37596e37, 0x6db7da6d, + 0x8d8c018d, 0xd564b1d5, 0x4ed29c4e, 0xa9e049a9, + 0x6cb4d86c, 0x56faac56, 0xf407f3f4, 0xea25cfea, + 0x65afca65, 0x7a8ef47a, 0xaee947ae, 0x08181008, + 0xbad56fba, 0x7888f078, 0x256f4a25, 0x2e725c2e, + 0x1c24381c, 0xa6f157a6, 0xb4c773b4, 0xc65197c6, + 0xe823cbe8, 0xdd7ca1dd, 0x749ce874, 0x1f213e1f, + 0x4bdd964b, 0xbddc61bd, 0x8b860d8b, 0x8a850f8a, + 0x7090e070, 0x3e427c3e, 0xb5c471b5, 0x66aacc66, + 0x48d89048, 0x03050603, 0xf601f7f6, 0x0e121c0e, + 0x61a3c261, 0x355f6a35, 0x57f9ae57, 0xb9d069b9, + 0x86911786, 0xc15899c1, 0x1d273a1d, 0x9eb9279e, + 0xe138d9e1, 0xf813ebf8, 0x98b32b98, 0x11332211, + 0x69bbd269, 0xd970a9d9, 0x8e89078e, 0x94a73394, + 0x9bb62d9b, 0x1e223c1e, 0x87921587, 0xe920c9e9, + 0xce4987ce, 0x55ffaa55, 0x28785028, 0xdf7aa5df, + 0x8c8f038c, 0xa1f859a1, 0x89800989, 0x0d171a0d, + 0xbfda65bf, 0xe631d7e6, 0x42c68442, 0x68b8d068, + 0x41c38241, 0x99b02999, 0x2d775a2d, 0x0f111e0f, + 0xb0cb7bb0, 0x54fca854, 0xbbd66dbb, 0x163a2c16, +}; + +__constant u32 te3[256] = +{ + 0x6363a5c6, 0x7c7c84f8, 0x777799ee, 0x7b7b8df6, + 0xf2f20dff, 0x6b6bbdd6, 0x6f6fb1de, 0xc5c55491, + 0x30305060, 0x01010302, 0x6767a9ce, 0x2b2b7d56, + 0xfefe19e7, 0xd7d762b5, 0xababe64d, 0x76769aec, + 0xcaca458f, 0x82829d1f, 0xc9c94089, 0x7d7d87fa, + 0xfafa15ef, 0x5959ebb2, 0x4747c98e, 0xf0f00bfb, + 0xadadec41, 0xd4d467b3, 0xa2a2fd5f, 0xafafea45, + 0x9c9cbf23, 0xa4a4f753, 0x727296e4, 0xc0c05b9b, + 0xb7b7c275, 0xfdfd1ce1, 0x9393ae3d, 0x26266a4c, + 0x36365a6c, 0x3f3f417e, 0xf7f702f5, 0xcccc4f83, + 0x34345c68, 0xa5a5f451, 0xe5e534d1, 0xf1f108f9, + 0x717193e2, 0xd8d873ab, 0x31315362, 0x15153f2a, + 0x04040c08, 0xc7c75295, 0x23236546, 0xc3c35e9d, + 0x18182830, 0x9696a137, 0x05050f0a, 0x9a9ab52f, + 0x0707090e, 0x12123624, 0x80809b1b, 0xe2e23ddf, + 0xebeb26cd, 0x2727694e, 0xb2b2cd7f, 0x75759fea, + 0x09091b12, 0x83839e1d, 0x2c2c7458, 0x1a1a2e34, + 0x1b1b2d36, 0x6e6eb2dc, 0x5a5aeeb4, 0xa0a0fb5b, + 0x5252f6a4, 0x3b3b4d76, 0xd6d661b7, 0xb3b3ce7d, + 0x29297b52, 0xe3e33edd, 0x2f2f715e, 0x84849713, + 0x5353f5a6, 0xd1d168b9, 0x00000000, 0xeded2cc1, + 0x20206040, 0xfcfc1fe3, 0xb1b1c879, 0x5b5bedb6, + 0x6a6abed4, 0xcbcb468d, 0xbebed967, 0x39394b72, + 0x4a4ade94, 0x4c4cd498, 0x5858e8b0, 0xcfcf4a85, + 0xd0d06bbb, 0xefef2ac5, 0xaaaae54f, 0xfbfb16ed, + 0x4343c586, 0x4d4dd79a, 0x33335566, 0x85859411, + 0x4545cf8a, 0xf9f910e9, 0x02020604, 0x7f7f81fe, + 0x5050f0a0, 0x3c3c4478, 0x9f9fba25, 0xa8a8e34b, + 0x5151f3a2, 0xa3a3fe5d, 0x4040c080, 0x8f8f8a05, + 0x9292ad3f, 0x9d9dbc21, 0x38384870, 0xf5f504f1, + 0xbcbcdf63, 0xb6b6c177, 0xdada75af, 0x21216342, + 0x10103020, 0xffff1ae5, 0xf3f30efd, 0xd2d26dbf, + 0xcdcd4c81, 0x0c0c1418, 0x13133526, 0xecec2fc3, + 0x5f5fe1be, 0x9797a235, 0x4444cc88, 0x1717392e, + 0xc4c45793, 0xa7a7f255, 0x7e7e82fc, 0x3d3d477a, + 0x6464acc8, 0x5d5de7ba, 0x19192b32, 0x737395e6, + 0x6060a0c0, 0x81819819, 0x4f4fd19e, 0xdcdc7fa3, + 0x22226644, 0x2a2a7e54, 0x9090ab3b, 0x8888830b, + 0x4646ca8c, 0xeeee29c7, 0xb8b8d36b, 0x14143c28, + 0xdede79a7, 0x5e5ee2bc, 0x0b0b1d16, 0xdbdb76ad, + 0xe0e03bdb, 0x32325664, 0x3a3a4e74, 0x0a0a1e14, + 0x4949db92, 0x06060a0c, 0x24246c48, 0x5c5ce4b8, + 0xc2c25d9f, 0xd3d36ebd, 0xacacef43, 0x6262a6c4, + 0x9191a839, 0x9595a431, 0xe4e437d3, 0x79798bf2, + 0xe7e732d5, 0xc8c8438b, 0x3737596e, 0x6d6db7da, + 0x8d8d8c01, 0xd5d564b1, 0x4e4ed29c, 0xa9a9e049, + 0x6c6cb4d8, 0x5656faac, 0xf4f407f3, 0xeaea25cf, + 0x6565afca, 0x7a7a8ef4, 0xaeaee947, 0x08081810, + 0xbabad56f, 0x787888f0, 0x25256f4a, 0x2e2e725c, + 0x1c1c2438, 0xa6a6f157, 0xb4b4c773, 0xc6c65197, + 0xe8e823cb, 0xdddd7ca1, 0x74749ce8, 0x1f1f213e, + 0x4b4bdd96, 0xbdbddc61, 0x8b8b860d, 0x8a8a850f, + 0x707090e0, 0x3e3e427c, 0xb5b5c471, 0x6666aacc, + 0x4848d890, 0x03030506, 0xf6f601f7, 0x0e0e121c, + 0x6161a3c2, 0x35355f6a, 0x5757f9ae, 0xb9b9d069, + 0x86869117, 0xc1c15899, 0x1d1d273a, 0x9e9eb927, + 0xe1e138d9, 0xf8f813eb, 0x9898b32b, 0x11113322, + 0x6969bbd2, 0xd9d970a9, 0x8e8e8907, 0x9494a733, + 0x9b9bb62d, 0x1e1e223c, 0x87879215, 0xe9e920c9, + 0xcece4987, 0x5555ffaa, 0x28287850, 0xdfdf7aa5, + 0x8c8c8f03, 0xa1a1f859, 0x89898009, 0x0d0d171a, + 0xbfbfda65, 0xe6e631d7, 0x4242c684, 0x6868b8d0, + 0x4141c382, 0x9999b029, 0x2d2d775a, 0x0f0f111e, + 0xb0b0cb7b, 0x5454fca8, 0xbbbbd66d, 0x16163a2c, +}; + +__constant u32 te4[256] = +{ + 0x63636363, 0x7c7c7c7c, 0x77777777, 0x7b7b7b7b, + 0xf2f2f2f2, 0x6b6b6b6b, 0x6f6f6f6f, 0xc5c5c5c5, + 0x30303030, 0x01010101, 0x67676767, 0x2b2b2b2b, + 0xfefefefe, 0xd7d7d7d7, 0xabababab, 0x76767676, + 0xcacacaca, 0x82828282, 0xc9c9c9c9, 0x7d7d7d7d, + 0xfafafafa, 0x59595959, 0x47474747, 0xf0f0f0f0, + 0xadadadad, 0xd4d4d4d4, 0xa2a2a2a2, 0xafafafaf, + 0x9c9c9c9c, 0xa4a4a4a4, 0x72727272, 0xc0c0c0c0, + 0xb7b7b7b7, 0xfdfdfdfd, 0x93939393, 0x26262626, + 0x36363636, 0x3f3f3f3f, 0xf7f7f7f7, 0xcccccccc, + 0x34343434, 0xa5a5a5a5, 0xe5e5e5e5, 0xf1f1f1f1, + 0x71717171, 0xd8d8d8d8, 0x31313131, 0x15151515, + 0x04040404, 0xc7c7c7c7, 0x23232323, 0xc3c3c3c3, + 0x18181818, 0x96969696, 0x05050505, 0x9a9a9a9a, + 0x07070707, 0x12121212, 0x80808080, 0xe2e2e2e2, + 0xebebebeb, 0x27272727, 0xb2b2b2b2, 0x75757575, + 0x09090909, 0x83838383, 0x2c2c2c2c, 0x1a1a1a1a, + 0x1b1b1b1b, 0x6e6e6e6e, 0x5a5a5a5a, 0xa0a0a0a0, + 0x52525252, 0x3b3b3b3b, 0xd6d6d6d6, 0xb3b3b3b3, + 0x29292929, 0xe3e3e3e3, 0x2f2f2f2f, 0x84848484, + 0x53535353, 0xd1d1d1d1, 0x00000000, 0xedededed, + 0x20202020, 0xfcfcfcfc, 0xb1b1b1b1, 0x5b5b5b5b, + 0x6a6a6a6a, 0xcbcbcbcb, 0xbebebebe, 0x39393939, + 0x4a4a4a4a, 0x4c4c4c4c, 0x58585858, 0xcfcfcfcf, + 0xd0d0d0d0, 0xefefefef, 0xaaaaaaaa, 0xfbfbfbfb, + 0x43434343, 0x4d4d4d4d, 0x33333333, 0x85858585, + 0x45454545, 0xf9f9f9f9, 0x02020202, 0x7f7f7f7f, + 0x50505050, 0x3c3c3c3c, 0x9f9f9f9f, 0xa8a8a8a8, + 0x51515151, 0xa3a3a3a3, 0x40404040, 0x8f8f8f8f, + 0x92929292, 0x9d9d9d9d, 0x38383838, 0xf5f5f5f5, + 0xbcbcbcbc, 0xb6b6b6b6, 0xdadadada, 0x21212121, + 0x10101010, 0xffffffff, 0xf3f3f3f3, 0xd2d2d2d2, + 0xcdcdcdcd, 0x0c0c0c0c, 0x13131313, 0xecececec, + 0x5f5f5f5f, 0x97979797, 0x44444444, 0x17171717, + 0xc4c4c4c4, 0xa7a7a7a7, 0x7e7e7e7e, 0x3d3d3d3d, + 0x64646464, 0x5d5d5d5d, 0x19191919, 0x73737373, + 0x60606060, 0x81818181, 0x4f4f4f4f, 0xdcdcdcdc, + 0x22222222, 0x2a2a2a2a, 0x90909090, 0x88888888, + 0x46464646, 0xeeeeeeee, 0xb8b8b8b8, 0x14141414, + 0xdededede, 0x5e5e5e5e, 0x0b0b0b0b, 0xdbdbdbdb, + 0xe0e0e0e0, 0x32323232, 0x3a3a3a3a, 0x0a0a0a0a, + 0x49494949, 0x06060606, 0x24242424, 0x5c5c5c5c, + 0xc2c2c2c2, 0xd3d3d3d3, 0xacacacac, 0x62626262, + 0x91919191, 0x95959595, 0xe4e4e4e4, 0x79797979, + 0xe7e7e7e7, 0xc8c8c8c8, 0x37373737, 0x6d6d6d6d, + 0x8d8d8d8d, 0xd5d5d5d5, 0x4e4e4e4e, 0xa9a9a9a9, + 0x6c6c6c6c, 0x56565656, 0xf4f4f4f4, 0xeaeaeaea, + 0x65656565, 0x7a7a7a7a, 0xaeaeaeae, 0x08080808, + 0xbabababa, 0x78787878, 0x25252525, 0x2e2e2e2e, + 0x1c1c1c1c, 0xa6a6a6a6, 0xb4b4b4b4, 0xc6c6c6c6, + 0xe8e8e8e8, 0xdddddddd, 0x74747474, 0x1f1f1f1f, + 0x4b4b4b4b, 0xbdbdbdbd, 0x8b8b8b8b, 0x8a8a8a8a, + 0x70707070, 0x3e3e3e3e, 0xb5b5b5b5, 0x66666666, + 0x48484848, 0x03030303, 0xf6f6f6f6, 0x0e0e0e0e, + 0x61616161, 0x35353535, 0x57575757, 0xb9b9b9b9, + 0x86868686, 0xc1c1c1c1, 0x1d1d1d1d, 0x9e9e9e9e, + 0xe1e1e1e1, 0xf8f8f8f8, 0x98989898, 0x11111111, + 0x69696969, 0xd9d9d9d9, 0x8e8e8e8e, 0x94949494, + 0x9b9b9b9b, 0x1e1e1e1e, 0x87878787, 0xe9e9e9e9, + 0xcececece, 0x55555555, 0x28282828, 0xdfdfdfdf, + 0x8c8c8c8c, 0xa1a1a1a1, 0x89898989, 0x0d0d0d0d, + 0xbfbfbfbf, 0xe6e6e6e6, 0x42424242, 0x68686868, + 0x41414141, 0x99999999, 0x2d2d2d2d, 0x0f0f0f0f, + 0xb0b0b0b0, 0x54545454, 0xbbbbbbbb, 0x16161616, +}; + +__constant u32 td0[256] = +{ + 0x51f4a750, 0x7e416553, 0x1a17a4c3, 0x3a275e96, + 0x3bab6bcb, 0x1f9d45f1, 0xacfa58ab, 0x4be30393, + 0x2030fa55, 0xad766df6, 0x88cc7691, 0xf5024c25, + 0x4fe5d7fc, 0xc52acbd7, 0x26354480, 0xb562a38f, + 0xdeb15a49, 0x25ba1b67, 0x45ea0e98, 0x5dfec0e1, + 0xc32f7502, 0x814cf012, 0x8d4697a3, 0x6bd3f9c6, + 0x038f5fe7, 0x15929c95, 0xbf6d7aeb, 0x955259da, + 0xd4be832d, 0x587421d3, 0x49e06929, 0x8ec9c844, + 0x75c2896a, 0xf48e7978, 0x99583e6b, 0x27b971dd, + 0xbee14fb6, 0xf088ad17, 0xc920ac66, 0x7dce3ab4, + 0x63df4a18, 0xe51a3182, 0x97513360, 0x62537f45, + 0xb16477e0, 0xbb6bae84, 0xfe81a01c, 0xf9082b94, + 0x70486858, 0x8f45fd19, 0x94de6c87, 0x527bf8b7, + 0xab73d323, 0x724b02e2, 0xe31f8f57, 0x6655ab2a, + 0xb2eb2807, 0x2fb5c203, 0x86c57b9a, 0xd33708a5, + 0x302887f2, 0x23bfa5b2, 0x02036aba, 0xed16825c, + 0x8acf1c2b, 0xa779b492, 0xf307f2f0, 0x4e69e2a1, + 0x65daf4cd, 0x0605bed5, 0xd134621f, 0xc4a6fe8a, + 0x342e539d, 0xa2f355a0, 0x058ae132, 0xa4f6eb75, + 0x0b83ec39, 0x4060efaa, 0x5e719f06, 0xbd6e1051, + 0x3e218af9, 0x96dd063d, 0xdd3e05ae, 0x4de6bd46, + 0x91548db5, 0x71c45d05, 0x0406d46f, 0x605015ff, + 0x1998fb24, 0xd6bde997, 0x894043cc, 0x67d99e77, + 0xb0e842bd, 0x07898b88, 0xe7195b38, 0x79c8eedb, + 0xa17c0a47, 0x7c420fe9, 0xf8841ec9, 0x00000000, + 0x09808683, 0x322bed48, 0x1e1170ac, 0x6c5a724e, + 0xfd0efffb, 0x0f853856, 0x3daed51e, 0x362d3927, + 0x0a0fd964, 0x685ca621, 0x9b5b54d1, 0x24362e3a, + 0x0c0a67b1, 0x9357e70f, 0xb4ee96d2, 0x1b9b919e, + 0x80c0c54f, 0x61dc20a2, 0x5a774b69, 0x1c121a16, + 0xe293ba0a, 0xc0a02ae5, 0x3c22e043, 0x121b171d, + 0x0e090d0b, 0xf28bc7ad, 0x2db6a8b9, 0x141ea9c8, + 0x57f11985, 0xaf75074c, 0xee99ddbb, 0xa37f60fd, + 0xf701269f, 0x5c72f5bc, 0x44663bc5, 0x5bfb7e34, + 0x8b432976, 0xcb23c6dc, 0xb6edfc68, 0xb8e4f163, + 0xd731dcca, 0x42638510, 0x13972240, 0x84c61120, + 0x854a247d, 0xd2bb3df8, 0xaef93211, 0xc729a16d, + 0x1d9e2f4b, 0xdcb230f3, 0x0d8652ec, 0x77c1e3d0, + 0x2bb3166c, 0xa970b999, 0x119448fa, 0x47e96422, + 0xa8fc8cc4, 0xa0f03f1a, 0x567d2cd8, 0x223390ef, + 0x87494ec7, 0xd938d1c1, 0x8ccaa2fe, 0x98d40b36, + 0xa6f581cf, 0xa57ade28, 0xdab78e26, 0x3fadbfa4, + 0x2c3a9de4, 0x5078920d, 0x6a5fcc9b, 0x547e4662, + 0xf68d13c2, 0x90d8b8e8, 0x2e39f75e, 0x82c3aff5, + 0x9f5d80be, 0x69d0937c, 0x6fd52da9, 0xcf2512b3, + 0xc8ac993b, 0x10187da7, 0xe89c636e, 0xdb3bbb7b, + 0xcd267809, 0x6e5918f4, 0xec9ab701, 0x834f9aa8, + 0xe6956e65, 0xaaffe67e, 0x21bccf08, 0xef15e8e6, + 0xbae79bd9, 0x4a6f36ce, 0xea9f09d4, 0x29b07cd6, + 0x31a4b2af, 0x2a3f2331, 0xc6a59430, 0x35a266c0, + 0x744ebc37, 0xfc82caa6, 0xe090d0b0, 0x33a7d815, + 0xf104984a, 0x41ecdaf7, 0x7fcd500e, 0x1791f62f, + 0x764dd68d, 0x43efb04d, 0xccaa4d54, 0xe49604df, + 0x9ed1b5e3, 0x4c6a881b, 0xc12c1fb8, 0x4665517f, + 0x9d5eea04, 0x018c355d, 0xfa877473, 0xfb0b412e, + 0xb3671d5a, 0x92dbd252, 0xe9105633, 0x6dd64713, + 0x9ad7618c, 0x37a10c7a, 0x59f8148e, 0xeb133c89, + 0xcea927ee, 0xb761c935, 0xe11ce5ed, 0x7a47b13c, + 0x9cd2df59, 0x55f2733f, 0x1814ce79, 0x73c737bf, + 0x53f7cdea, 0x5ffdaa5b, 0xdf3d6f14, 0x7844db86, + 0xcaaff381, 0xb968c43e, 0x3824342c, 0xc2a3405f, + 0x161dc372, 0xbce2250c, 0x283c498b, 0xff0d9541, + 0x39a80171, 0x080cb3de, 0xd8b4e49c, 0x6456c190, + 0x7bcb8461, 0xd532b670, 0x486c5c74, 0xd0b85742, +}; + +__constant u32 td1[256] = +{ + 0x5051f4a7, 0x537e4165, 0xc31a17a4, 0x963a275e, + 0xcb3bab6b, 0xf11f9d45, 0xabacfa58, 0x934be303, + 0x552030fa, 0xf6ad766d, 0x9188cc76, 0x25f5024c, + 0xfc4fe5d7, 0xd7c52acb, 0x80263544, 0x8fb562a3, + 0x49deb15a, 0x6725ba1b, 0x9845ea0e, 0xe15dfec0, + 0x02c32f75, 0x12814cf0, 0xa38d4697, 0xc66bd3f9, + 0xe7038f5f, 0x9515929c, 0xebbf6d7a, 0xda955259, + 0x2dd4be83, 0xd3587421, 0x2949e069, 0x448ec9c8, + 0x6a75c289, 0x78f48e79, 0x6b99583e, 0xdd27b971, + 0xb6bee14f, 0x17f088ad, 0x66c920ac, 0xb47dce3a, + 0x1863df4a, 0x82e51a31, 0x60975133, 0x4562537f, + 0xe0b16477, 0x84bb6bae, 0x1cfe81a0, 0x94f9082b, + 0x58704868, 0x198f45fd, 0x8794de6c, 0xb7527bf8, + 0x23ab73d3, 0xe2724b02, 0x57e31f8f, 0x2a6655ab, + 0x07b2eb28, 0x032fb5c2, 0x9a86c57b, 0xa5d33708, + 0xf2302887, 0xb223bfa5, 0xba02036a, 0x5ced1682, + 0x2b8acf1c, 0x92a779b4, 0xf0f307f2, 0xa14e69e2, + 0xcd65daf4, 0xd50605be, 0x1fd13462, 0x8ac4a6fe, + 0x9d342e53, 0xa0a2f355, 0x32058ae1, 0x75a4f6eb, + 0x390b83ec, 0xaa4060ef, 0x065e719f, 0x51bd6e10, + 0xf93e218a, 0x3d96dd06, 0xaedd3e05, 0x464de6bd, + 0xb591548d, 0x0571c45d, 0x6f0406d4, 0xff605015, + 0x241998fb, 0x97d6bde9, 0xcc894043, 0x7767d99e, + 0xbdb0e842, 0x8807898b, 0x38e7195b, 0xdb79c8ee, + 0x47a17c0a, 0xe97c420f, 0xc9f8841e, 0x00000000, + 0x83098086, 0x48322bed, 0xac1e1170, 0x4e6c5a72, + 0xfbfd0eff, 0x560f8538, 0x1e3daed5, 0x27362d39, + 0x640a0fd9, 0x21685ca6, 0xd19b5b54, 0x3a24362e, + 0xb10c0a67, 0x0f9357e7, 0xd2b4ee96, 0x9e1b9b91, + 0x4f80c0c5, 0xa261dc20, 0x695a774b, 0x161c121a, + 0x0ae293ba, 0xe5c0a02a, 0x433c22e0, 0x1d121b17, + 0x0b0e090d, 0xadf28bc7, 0xb92db6a8, 0xc8141ea9, + 0x8557f119, 0x4caf7507, 0xbbee99dd, 0xfda37f60, + 0x9ff70126, 0xbc5c72f5, 0xc544663b, 0x345bfb7e, + 0x768b4329, 0xdccb23c6, 0x68b6edfc, 0x63b8e4f1, + 0xcad731dc, 0x10426385, 0x40139722, 0x2084c611, + 0x7d854a24, 0xf8d2bb3d, 0x11aef932, 0x6dc729a1, + 0x4b1d9e2f, 0xf3dcb230, 0xec0d8652, 0xd077c1e3, + 0x6c2bb316, 0x99a970b9, 0xfa119448, 0x2247e964, + 0xc4a8fc8c, 0x1aa0f03f, 0xd8567d2c, 0xef223390, + 0xc787494e, 0xc1d938d1, 0xfe8ccaa2, 0x3698d40b, + 0xcfa6f581, 0x28a57ade, 0x26dab78e, 0xa43fadbf, + 0xe42c3a9d, 0x0d507892, 0x9b6a5fcc, 0x62547e46, + 0xc2f68d13, 0xe890d8b8, 0x5e2e39f7, 0xf582c3af, + 0xbe9f5d80, 0x7c69d093, 0xa96fd52d, 0xb3cf2512, + 0x3bc8ac99, 0xa710187d, 0x6ee89c63, 0x7bdb3bbb, + 0x09cd2678, 0xf46e5918, 0x01ec9ab7, 0xa8834f9a, + 0x65e6956e, 0x7eaaffe6, 0x0821bccf, 0xe6ef15e8, + 0xd9bae79b, 0xce4a6f36, 0xd4ea9f09, 0xd629b07c, + 0xaf31a4b2, 0x312a3f23, 0x30c6a594, 0xc035a266, + 0x37744ebc, 0xa6fc82ca, 0xb0e090d0, 0x1533a7d8, + 0x4af10498, 0xf741ecda, 0x0e7fcd50, 0x2f1791f6, + 0x8d764dd6, 0x4d43efb0, 0x54ccaa4d, 0xdfe49604, + 0xe39ed1b5, 0x1b4c6a88, 0xb8c12c1f, 0x7f466551, + 0x049d5eea, 0x5d018c35, 0x73fa8774, 0x2efb0b41, + 0x5ab3671d, 0x5292dbd2, 0x33e91056, 0x136dd647, + 0x8c9ad761, 0x7a37a10c, 0x8e59f814, 0x89eb133c, + 0xeecea927, 0x35b761c9, 0xede11ce5, 0x3c7a47b1, + 0x599cd2df, 0x3f55f273, 0x791814ce, 0xbf73c737, + 0xea53f7cd, 0x5b5ffdaa, 0x14df3d6f, 0x867844db, + 0x81caaff3, 0x3eb968c4, 0x2c382434, 0x5fc2a340, + 0x72161dc3, 0x0cbce225, 0x8b283c49, 0x41ff0d95, + 0x7139a801, 0xde080cb3, 0x9cd8b4e4, 0x906456c1, + 0x617bcb84, 0x70d532b6, 0x74486c5c, 0x42d0b857, +}; + +__constant u32 td2[256] = +{ + 0xa75051f4, 0x65537e41, 0xa4c31a17, 0x5e963a27, + 0x6bcb3bab, 0x45f11f9d, 0x58abacfa, 0x03934be3, + 0xfa552030, 0x6df6ad76, 0x769188cc, 0x4c25f502, + 0xd7fc4fe5, 0xcbd7c52a, 0x44802635, 0xa38fb562, + 0x5a49deb1, 0x1b6725ba, 0x0e9845ea, 0xc0e15dfe, + 0x7502c32f, 0xf012814c, 0x97a38d46, 0xf9c66bd3, + 0x5fe7038f, 0x9c951592, 0x7aebbf6d, 0x59da9552, + 0x832dd4be, 0x21d35874, 0x692949e0, 0xc8448ec9, + 0x896a75c2, 0x7978f48e, 0x3e6b9958, 0x71dd27b9, + 0x4fb6bee1, 0xad17f088, 0xac66c920, 0x3ab47dce, + 0x4a1863df, 0x3182e51a, 0x33609751, 0x7f456253, + 0x77e0b164, 0xae84bb6b, 0xa01cfe81, 0x2b94f908, + 0x68587048, 0xfd198f45, 0x6c8794de, 0xf8b7527b, + 0xd323ab73, 0x02e2724b, 0x8f57e31f, 0xab2a6655, + 0x2807b2eb, 0xc2032fb5, 0x7b9a86c5, 0x08a5d337, + 0x87f23028, 0xa5b223bf, 0x6aba0203, 0x825ced16, + 0x1c2b8acf, 0xb492a779, 0xf2f0f307, 0xe2a14e69, + 0xf4cd65da, 0xbed50605, 0x621fd134, 0xfe8ac4a6, + 0x539d342e, 0x55a0a2f3, 0xe132058a, 0xeb75a4f6, + 0xec390b83, 0xefaa4060, 0x9f065e71, 0x1051bd6e, + 0x8af93e21, 0x063d96dd, 0x05aedd3e, 0xbd464de6, + 0x8db59154, 0x5d0571c4, 0xd46f0406, 0x15ff6050, + 0xfb241998, 0xe997d6bd, 0x43cc8940, 0x9e7767d9, + 0x42bdb0e8, 0x8b880789, 0x5b38e719, 0xeedb79c8, + 0x0a47a17c, 0x0fe97c42, 0x1ec9f884, 0x00000000, + 0x86830980, 0xed48322b, 0x70ac1e11, 0x724e6c5a, + 0xfffbfd0e, 0x38560f85, 0xd51e3dae, 0x3927362d, + 0xd9640a0f, 0xa621685c, 0x54d19b5b, 0x2e3a2436, + 0x67b10c0a, 0xe70f9357, 0x96d2b4ee, 0x919e1b9b, + 0xc54f80c0, 0x20a261dc, 0x4b695a77, 0x1a161c12, + 0xba0ae293, 0x2ae5c0a0, 0xe0433c22, 0x171d121b, + 0x0d0b0e09, 0xc7adf28b, 0xa8b92db6, 0xa9c8141e, + 0x198557f1, 0x074caf75, 0xddbbee99, 0x60fda37f, + 0x269ff701, 0xf5bc5c72, 0x3bc54466, 0x7e345bfb, + 0x29768b43, 0xc6dccb23, 0xfc68b6ed, 0xf163b8e4, + 0xdccad731, 0x85104263, 0x22401397, 0x112084c6, + 0x247d854a, 0x3df8d2bb, 0x3211aef9, 0xa16dc729, + 0x2f4b1d9e, 0x30f3dcb2, 0x52ec0d86, 0xe3d077c1, + 0x166c2bb3, 0xb999a970, 0x48fa1194, 0x642247e9, + 0x8cc4a8fc, 0x3f1aa0f0, 0x2cd8567d, 0x90ef2233, + 0x4ec78749, 0xd1c1d938, 0xa2fe8cca, 0x0b3698d4, + 0x81cfa6f5, 0xde28a57a, 0x8e26dab7, 0xbfa43fad, + 0x9de42c3a, 0x920d5078, 0xcc9b6a5f, 0x4662547e, + 0x13c2f68d, 0xb8e890d8, 0xf75e2e39, 0xaff582c3, + 0x80be9f5d, 0x937c69d0, 0x2da96fd5, 0x12b3cf25, + 0x993bc8ac, 0x7da71018, 0x636ee89c, 0xbb7bdb3b, + 0x7809cd26, 0x18f46e59, 0xb701ec9a, 0x9aa8834f, + 0x6e65e695, 0xe67eaaff, 0xcf0821bc, 0xe8e6ef15, + 0x9bd9bae7, 0x36ce4a6f, 0x09d4ea9f, 0x7cd629b0, + 0xb2af31a4, 0x23312a3f, 0x9430c6a5, 0x66c035a2, + 0xbc37744e, 0xcaa6fc82, 0xd0b0e090, 0xd81533a7, + 0x984af104, 0xdaf741ec, 0x500e7fcd, 0xf62f1791, + 0xd68d764d, 0xb04d43ef, 0x4d54ccaa, 0x04dfe496, + 0xb5e39ed1, 0x881b4c6a, 0x1fb8c12c, 0x517f4665, + 0xea049d5e, 0x355d018c, 0x7473fa87, 0x412efb0b, + 0x1d5ab367, 0xd25292db, 0x5633e910, 0x47136dd6, + 0x618c9ad7, 0x0c7a37a1, 0x148e59f8, 0x3c89eb13, + 0x27eecea9, 0xc935b761, 0xe5ede11c, 0xb13c7a47, + 0xdf599cd2, 0x733f55f2, 0xce791814, 0x37bf73c7, + 0xcdea53f7, 0xaa5b5ffd, 0x6f14df3d, 0xdb867844, + 0xf381caaf, 0xc43eb968, 0x342c3824, 0x405fc2a3, + 0xc372161d, 0x250cbce2, 0x498b283c, 0x9541ff0d, + 0x017139a8, 0xb3de080c, 0xe49cd8b4, 0xc1906456, + 0x84617bcb, 0xb670d532, 0x5c74486c, 0x5742d0b8, +}; + +__constant u32 td3[256] = +{ + 0xf4a75051, 0x4165537e, 0x17a4c31a, 0x275e963a, + 0xab6bcb3b, 0x9d45f11f, 0xfa58abac, 0xe303934b, + 0x30fa5520, 0x766df6ad, 0xcc769188, 0x024c25f5, + 0xe5d7fc4f, 0x2acbd7c5, 0x35448026, 0x62a38fb5, + 0xb15a49de, 0xba1b6725, 0xea0e9845, 0xfec0e15d, + 0x2f7502c3, 0x4cf01281, 0x4697a38d, 0xd3f9c66b, + 0x8f5fe703, 0x929c9515, 0x6d7aebbf, 0x5259da95, + 0xbe832dd4, 0x7421d358, 0xe0692949, 0xc9c8448e, + 0xc2896a75, 0x8e7978f4, 0x583e6b99, 0xb971dd27, + 0xe14fb6be, 0x88ad17f0, 0x20ac66c9, 0xce3ab47d, + 0xdf4a1863, 0x1a3182e5, 0x51336097, 0x537f4562, + 0x6477e0b1, 0x6bae84bb, 0x81a01cfe, 0x082b94f9, + 0x48685870, 0x45fd198f, 0xde6c8794, 0x7bf8b752, + 0x73d323ab, 0x4b02e272, 0x1f8f57e3, 0x55ab2a66, + 0xeb2807b2, 0xb5c2032f, 0xc57b9a86, 0x3708a5d3, + 0x2887f230, 0xbfa5b223, 0x036aba02, 0x16825ced, + 0xcf1c2b8a, 0x79b492a7, 0x07f2f0f3, 0x69e2a14e, + 0xdaf4cd65, 0x05bed506, 0x34621fd1, 0xa6fe8ac4, + 0x2e539d34, 0xf355a0a2, 0x8ae13205, 0xf6eb75a4, + 0x83ec390b, 0x60efaa40, 0x719f065e, 0x6e1051bd, + 0x218af93e, 0xdd063d96, 0x3e05aedd, 0xe6bd464d, + 0x548db591, 0xc45d0571, 0x06d46f04, 0x5015ff60, + 0x98fb2419, 0xbde997d6, 0x4043cc89, 0xd99e7767, + 0xe842bdb0, 0x898b8807, 0x195b38e7, 0xc8eedb79, + 0x7c0a47a1, 0x420fe97c, 0x841ec9f8, 0x00000000, + 0x80868309, 0x2bed4832, 0x1170ac1e, 0x5a724e6c, + 0x0efffbfd, 0x8538560f, 0xaed51e3d, 0x2d392736, + 0x0fd9640a, 0x5ca62168, 0x5b54d19b, 0x362e3a24, + 0x0a67b10c, 0x57e70f93, 0xee96d2b4, 0x9b919e1b, + 0xc0c54f80, 0xdc20a261, 0x774b695a, 0x121a161c, + 0x93ba0ae2, 0xa02ae5c0, 0x22e0433c, 0x1b171d12, + 0x090d0b0e, 0x8bc7adf2, 0xb6a8b92d, 0x1ea9c814, + 0xf1198557, 0x75074caf, 0x99ddbbee, 0x7f60fda3, + 0x01269ff7, 0x72f5bc5c, 0x663bc544, 0xfb7e345b, + 0x4329768b, 0x23c6dccb, 0xedfc68b6, 0xe4f163b8, + 0x31dccad7, 0x63851042, 0x97224013, 0xc6112084, + 0x4a247d85, 0xbb3df8d2, 0xf93211ae, 0x29a16dc7, + 0x9e2f4b1d, 0xb230f3dc, 0x8652ec0d, 0xc1e3d077, + 0xb3166c2b, 0x70b999a9, 0x9448fa11, 0xe9642247, + 0xfc8cc4a8, 0xf03f1aa0, 0x7d2cd856, 0x3390ef22, + 0x494ec787, 0x38d1c1d9, 0xcaa2fe8c, 0xd40b3698, + 0xf581cfa6, 0x7ade28a5, 0xb78e26da, 0xadbfa43f, + 0x3a9de42c, 0x78920d50, 0x5fcc9b6a, 0x7e466254, + 0x8d13c2f6, 0xd8b8e890, 0x39f75e2e, 0xc3aff582, + 0x5d80be9f, 0xd0937c69, 0xd52da96f, 0x2512b3cf, + 0xac993bc8, 0x187da710, 0x9c636ee8, 0x3bbb7bdb, + 0x267809cd, 0x5918f46e, 0x9ab701ec, 0x4f9aa883, + 0x956e65e6, 0xffe67eaa, 0xbccf0821, 0x15e8e6ef, + 0xe79bd9ba, 0x6f36ce4a, 0x9f09d4ea, 0xb07cd629, + 0xa4b2af31, 0x3f23312a, 0xa59430c6, 0xa266c035, + 0x4ebc3774, 0x82caa6fc, 0x90d0b0e0, 0xa7d81533, + 0x04984af1, 0xecdaf741, 0xcd500e7f, 0x91f62f17, + 0x4dd68d76, 0xefb04d43, 0xaa4d54cc, 0x9604dfe4, + 0xd1b5e39e, 0x6a881b4c, 0x2c1fb8c1, 0x65517f46, + 0x5eea049d, 0x8c355d01, 0x877473fa, 0x0b412efb, + 0x671d5ab3, 0xdbd25292, 0x105633e9, 0xd647136d, + 0xd7618c9a, 0xa10c7a37, 0xf8148e59, 0x133c89eb, + 0xa927eece, 0x61c935b7, 0x1ce5ede1, 0x47b13c7a, + 0xd2df599c, 0xf2733f55, 0x14ce7918, 0xc737bf73, + 0xf7cdea53, 0xfdaa5b5f, 0x3d6f14df, 0x44db8678, + 0xaff381ca, 0x68c43eb9, 0x24342c38, 0xa3405fc2, + 0x1dc37216, 0xe2250cbc, 0x3c498b28, 0x0d9541ff, + 0xa8017139, 0x0cb3de08, 0xb4e49cd8, 0x56c19064, + 0xcb84617b, 0x32b670d5, 0x6c5c7448, 0xb85742d0, +}; + +__constant u32 td4[256] = +{ + 0x52525252, 0x09090909, 0x6a6a6a6a, 0xd5d5d5d5, + 0x30303030, 0x36363636, 0xa5a5a5a5, 0x38383838, + 0xbfbfbfbf, 0x40404040, 0xa3a3a3a3, 0x9e9e9e9e, + 0x81818181, 0xf3f3f3f3, 0xd7d7d7d7, 0xfbfbfbfb, + 0x7c7c7c7c, 0xe3e3e3e3, 0x39393939, 0x82828282, + 0x9b9b9b9b, 0x2f2f2f2f, 0xffffffff, 0x87878787, + 0x34343434, 0x8e8e8e8e, 0x43434343, 0x44444444, + 0xc4c4c4c4, 0xdededede, 0xe9e9e9e9, 0xcbcbcbcb, + 0x54545454, 0x7b7b7b7b, 0x94949494, 0x32323232, + 0xa6a6a6a6, 0xc2c2c2c2, 0x23232323, 0x3d3d3d3d, + 0xeeeeeeee, 0x4c4c4c4c, 0x95959595, 0x0b0b0b0b, + 0x42424242, 0xfafafafa, 0xc3c3c3c3, 0x4e4e4e4e, + 0x08080808, 0x2e2e2e2e, 0xa1a1a1a1, 0x66666666, + 0x28282828, 0xd9d9d9d9, 0x24242424, 0xb2b2b2b2, + 0x76767676, 0x5b5b5b5b, 0xa2a2a2a2, 0x49494949, + 0x6d6d6d6d, 0x8b8b8b8b, 0xd1d1d1d1, 0x25252525, + 0x72727272, 0xf8f8f8f8, 0xf6f6f6f6, 0x64646464, + 0x86868686, 0x68686868, 0x98989898, 0x16161616, + 0xd4d4d4d4, 0xa4a4a4a4, 0x5c5c5c5c, 0xcccccccc, + 0x5d5d5d5d, 0x65656565, 0xb6b6b6b6, 0x92929292, + 0x6c6c6c6c, 0x70707070, 0x48484848, 0x50505050, + 0xfdfdfdfd, 0xedededed, 0xb9b9b9b9, 0xdadadada, + 0x5e5e5e5e, 0x15151515, 0x46464646, 0x57575757, + 0xa7a7a7a7, 0x8d8d8d8d, 0x9d9d9d9d, 0x84848484, + 0x90909090, 0xd8d8d8d8, 0xabababab, 0x00000000, + 0x8c8c8c8c, 0xbcbcbcbc, 0xd3d3d3d3, 0x0a0a0a0a, + 0xf7f7f7f7, 0xe4e4e4e4, 0x58585858, 0x05050505, + 0xb8b8b8b8, 0xb3b3b3b3, 0x45454545, 0x06060606, + 0xd0d0d0d0, 0x2c2c2c2c, 0x1e1e1e1e, 0x8f8f8f8f, + 0xcacacaca, 0x3f3f3f3f, 0x0f0f0f0f, 0x02020202, + 0xc1c1c1c1, 0xafafafaf, 0xbdbdbdbd, 0x03030303, + 0x01010101, 0x13131313, 0x8a8a8a8a, 0x6b6b6b6b, + 0x3a3a3a3a, 0x91919191, 0x11111111, 0x41414141, + 0x4f4f4f4f, 0x67676767, 0xdcdcdcdc, 0xeaeaeaea, + 0x97979797, 0xf2f2f2f2, 0xcfcfcfcf, 0xcececece, + 0xf0f0f0f0, 0xb4b4b4b4, 0xe6e6e6e6, 0x73737373, + 0x96969696, 0xacacacac, 0x74747474, 0x22222222, + 0xe7e7e7e7, 0xadadadad, 0x35353535, 0x85858585, + 0xe2e2e2e2, 0xf9f9f9f9, 0x37373737, 0xe8e8e8e8, + 0x1c1c1c1c, 0x75757575, 0xdfdfdfdf, 0x6e6e6e6e, + 0x47474747, 0xf1f1f1f1, 0x1a1a1a1a, 0x71717171, + 0x1d1d1d1d, 0x29292929, 0xc5c5c5c5, 0x89898989, + 0x6f6f6f6f, 0xb7b7b7b7, 0x62626262, 0x0e0e0e0e, + 0xaaaaaaaa, 0x18181818, 0xbebebebe, 0x1b1b1b1b, + 0xfcfcfcfc, 0x56565656, 0x3e3e3e3e, 0x4b4b4b4b, + 0xc6c6c6c6, 0xd2d2d2d2, 0x79797979, 0x20202020, + 0x9a9a9a9a, 0xdbdbdbdb, 0xc0c0c0c0, 0xfefefefe, + 0x78787878, 0xcdcdcdcd, 0x5a5a5a5a, 0xf4f4f4f4, + 0x1f1f1f1f, 0xdddddddd, 0xa8a8a8a8, 0x33333333, + 0x88888888, 0x07070707, 0xc7c7c7c7, 0x31313131, + 0xb1b1b1b1, 0x12121212, 0x10101010, 0x59595959, + 0x27272727, 0x80808080, 0xecececec, 0x5f5f5f5f, + 0x60606060, 0x51515151, 0x7f7f7f7f, 0xa9a9a9a9, + 0x19191919, 0xb5b5b5b5, 0x4a4a4a4a, 0x0d0d0d0d, + 0x2d2d2d2d, 0xe5e5e5e5, 0x7a7a7a7a, 0x9f9f9f9f, + 0x93939393, 0xc9c9c9c9, 0x9c9c9c9c, 0xefefefef, + 0xa0a0a0a0, 0xe0e0e0e0, 0x3b3b3b3b, 0x4d4d4d4d, + 0xaeaeaeae, 0x2a2a2a2a, 0xf5f5f5f5, 0xb0b0b0b0, + 0xc8c8c8c8, 0xebebebeb, 0xbbbbbbbb, 0x3c3c3c3c, + 0x83838383, 0x53535353, 0x99999999, 0x61616161, + 0x17171717, 0x2b2b2b2b, 0x04040404, 0x7e7e7e7e, + 0xbabababa, 0x77777777, 0xd6d6d6d6, 0x26262626, + 0xe1e1e1e1, 0x69696969, 0x14141414, 0x63636363, + 0x55555555, 0x21212121, 0x0c0c0c0c, 0x7d7d7d7d, +}; + +__constant u32 rcon[] = +{ + 0x01000000, 0x02000000, 0x04000000, 0x08000000, + 0x10000000, 0x20000000, 0x40000000, 0x80000000, + 0x1b000000, 0x36000000, +}; + +static void AES256_ExpandKey (u32 *userkey, u32 *rek, __local u32 s_te0[256], __local u32 s_te1[256], __local u32 s_te2[256], __local u32 s_te3[256], __local u32 s_te4[256]) +{ + rek[0] = userkey[0]; + rek[1] = userkey[1]; + rek[2] = userkey[2]; + rek[3] = userkey[3]; + rek[4] = userkey[4]; + rek[5] = userkey[5]; + rek[6] = userkey[6]; + rek[7] = userkey[7]; + + int i; + int j; + + i = 0; + j = 0; + + u32 run = 1; + + while (run) + { + u32 temp = rek[j + 7]; + + rek[j + 8] = rek[j + 0] + ^ (s_te2[(temp >> 16) & 0xff] & 0xff000000) + ^ (s_te3[(temp >> 8) & 0xff] & 0x00ff0000) + ^ (s_te0[(temp >> 0) & 0xff] & 0x0000ff00) + ^ (s_te1[(temp >> 24) & 0xff] & 0x000000ff) + ^ rcon[i]; + + rek[j + 9] = rek[j + 1] ^ rek[j + 8]; + rek[j + 10] = rek[j + 2] ^ rek[j + 9]; + rek[j + 11] = rek[j + 3] ^ rek[j + 10]; + + if (++i == 7) + { + run = 0; + continue; + } + + temp = rek[j + 11]; + + rek[j + 12] = rek[j + 4] + ^ (s_te2[(temp >> 24) & 0xff] & 0xff000000) + ^ (s_te3[(temp >> 16) & 0xff] & 0x00ff0000) + ^ (s_te0[(temp >> 8) & 0xff] & 0x0000ff00) + ^ (s_te1[(temp >> 0) & 0xff] & 0x000000ff); + + rek[j + 13] = rek[j + 5] ^ rek[j + 12]; + rek[j + 14] = rek[j + 6] ^ rek[j + 13]; + rek[j + 15] = rek[j + 7] ^ rek[j + 14]; + + j += 8; + } +} + +static void AES256_InvertKey (u32 *rdk, __local u32 s_td0[256], __local u32 s_td1[256], __local u32 s_td2[256], __local u32 s_td3[256], __local u32 s_td4[256], __local u32 s_te0[256], __local u32 s_te1[256], __local u32 s_te2[256], __local u32 s_te3[256], __local u32 s_te4[256]) +{ + for (u32 i = 0, j = 56; i < j; i += 4, j -= 4) + { + u32 temp; + + temp = rdk[i + 0]; rdk[i + 0] = rdk[j + 0]; rdk[j + 0] = temp; + temp = rdk[i + 1]; rdk[i + 1] = rdk[j + 1]; rdk[j + 1] = temp; + temp = rdk[i + 2]; rdk[i + 2] = rdk[j + 2]; rdk[j + 2] = temp; + temp = rdk[i + 3]; rdk[i + 3] = rdk[j + 3]; rdk[j + 3] = temp; + } + + for (u32 i = 1, j = 4; i < 14; i += 1, j += 4) + { + rdk[j + 0] = + s_td0[s_te1[(rdk[j + 0] >> 24) & 0xff] & 0xff] ^ + s_td1[s_te1[(rdk[j + 0] >> 16) & 0xff] & 0xff] ^ + s_td2[s_te1[(rdk[j + 0] >> 8) & 0xff] & 0xff] ^ + s_td3[s_te1[(rdk[j + 0] >> 0) & 0xff] & 0xff]; + + rdk[j + 1] = + s_td0[s_te1[(rdk[j + 1] >> 24) & 0xff] & 0xff] ^ + s_td1[s_te1[(rdk[j + 1] >> 16) & 0xff] & 0xff] ^ + s_td2[s_te1[(rdk[j + 1] >> 8) & 0xff] & 0xff] ^ + s_td3[s_te1[(rdk[j + 1] >> 0) & 0xff] & 0xff]; + + rdk[j + 2] = + s_td0[s_te1[(rdk[j + 2] >> 24) & 0xff] & 0xff] ^ + s_td1[s_te1[(rdk[j + 2] >> 16) & 0xff] & 0xff] ^ + s_td2[s_te1[(rdk[j + 2] >> 8) & 0xff] & 0xff] ^ + s_td3[s_te1[(rdk[j + 2] >> 0) & 0xff] & 0xff]; + + rdk[j + 3] = + s_td0[s_te1[(rdk[j + 3] >> 24) & 0xff] & 0xff] ^ + s_td1[s_te1[(rdk[j + 3] >> 16) & 0xff] & 0xff] ^ + s_td2[s_te1[(rdk[j + 3] >> 8) & 0xff] & 0xff] ^ + s_td3[s_te1[(rdk[j + 3] >> 0) & 0xff] & 0xff]; + } +} + +static void AES256_decrypt (const u32 *in, u32 *out, const u32 *rdk, __local u32 s_td0[256], __local u32 s_td1[256], __local u32 s_td2[256], __local u32 s_td3[256], __local u32 s_td4[256]) +{ + u32 s0 = in[0] ^ rdk[0]; + u32 s1 = in[1] ^ rdk[1]; + u32 s2 = in[2] ^ rdk[2]; + u32 s3 = in[3] ^ rdk[3]; + + u32 t0; + u32 t1; + u32 t2; + u32 t3; + + t0 = s_td0[s0 >> 24] ^ s_td1[(s3 >> 16) & 0xff] ^ s_td2[(s2 >> 8) & 0xff] ^ s_td3[s1 & 0xff] ^ rdk[ 4]; + t1 = s_td0[s1 >> 24] ^ s_td1[(s0 >> 16) & 0xff] ^ s_td2[(s3 >> 8) & 0xff] ^ s_td3[s2 & 0xff] ^ rdk[ 5]; + t2 = s_td0[s2 >> 24] ^ s_td1[(s1 >> 16) & 0xff] ^ s_td2[(s0 >> 8) & 0xff] ^ s_td3[s3 & 0xff] ^ rdk[ 6]; + t3 = s_td0[s3 >> 24] ^ s_td1[(s2 >> 16) & 0xff] ^ s_td2[(s1 >> 8) & 0xff] ^ s_td3[s0 & 0xff] ^ rdk[ 7]; + s0 = s_td0[t0 >> 24] ^ s_td1[(t3 >> 16) & 0xff] ^ s_td2[(t2 >> 8) & 0xff] ^ s_td3[t1 & 0xff] ^ rdk[ 8]; + s1 = s_td0[t1 >> 24] ^ s_td1[(t0 >> 16) & 0xff] ^ s_td2[(t3 >> 8) & 0xff] ^ s_td3[t2 & 0xff] ^ rdk[ 9]; + s2 = s_td0[t2 >> 24] ^ s_td1[(t1 >> 16) & 0xff] ^ s_td2[(t0 >> 8) & 0xff] ^ s_td3[t3 & 0xff] ^ rdk[10]; + s3 = s_td0[t3 >> 24] ^ s_td1[(t2 >> 16) & 0xff] ^ s_td2[(t1 >> 8) & 0xff] ^ s_td3[t0 & 0xff] ^ rdk[11]; + t0 = s_td0[s0 >> 24] ^ s_td1[(s3 >> 16) & 0xff] ^ s_td2[(s2 >> 8) & 0xff] ^ s_td3[s1 & 0xff] ^ rdk[12]; + t1 = s_td0[s1 >> 24] ^ s_td1[(s0 >> 16) & 0xff] ^ s_td2[(s3 >> 8) & 0xff] ^ s_td3[s2 & 0xff] ^ rdk[13]; + t2 = s_td0[s2 >> 24] ^ s_td1[(s1 >> 16) & 0xff] ^ s_td2[(s0 >> 8) & 0xff] ^ s_td3[s3 & 0xff] ^ rdk[14]; + t3 = s_td0[s3 >> 24] ^ s_td1[(s2 >> 16) & 0xff] ^ s_td2[(s1 >> 8) & 0xff] ^ s_td3[s0 & 0xff] ^ rdk[15]; + s0 = s_td0[t0 >> 24] ^ s_td1[(t3 >> 16) & 0xff] ^ s_td2[(t2 >> 8) & 0xff] ^ s_td3[t1 & 0xff] ^ rdk[16]; + s1 = s_td0[t1 >> 24] ^ s_td1[(t0 >> 16) & 0xff] ^ s_td2[(t3 >> 8) & 0xff] ^ s_td3[t2 & 0xff] ^ rdk[17]; + s2 = s_td0[t2 >> 24] ^ s_td1[(t1 >> 16) & 0xff] ^ s_td2[(t0 >> 8) & 0xff] ^ s_td3[t3 & 0xff] ^ rdk[18]; + s3 = s_td0[t3 >> 24] ^ s_td1[(t2 >> 16) & 0xff] ^ s_td2[(t1 >> 8) & 0xff] ^ s_td3[t0 & 0xff] ^ rdk[19]; + t0 = s_td0[s0 >> 24] ^ s_td1[(s3 >> 16) & 0xff] ^ s_td2[(s2 >> 8) & 0xff] ^ s_td3[s1 & 0xff] ^ rdk[20]; + t1 = s_td0[s1 >> 24] ^ s_td1[(s0 >> 16) & 0xff] ^ s_td2[(s3 >> 8) & 0xff] ^ s_td3[s2 & 0xff] ^ rdk[21]; + t2 = s_td0[s2 >> 24] ^ s_td1[(s1 >> 16) & 0xff] ^ s_td2[(s0 >> 8) & 0xff] ^ s_td3[s3 & 0xff] ^ rdk[22]; + t3 = s_td0[s3 >> 24] ^ s_td1[(s2 >> 16) & 0xff] ^ s_td2[(s1 >> 8) & 0xff] ^ s_td3[s0 & 0xff] ^ rdk[23]; + s0 = s_td0[t0 >> 24] ^ s_td1[(t3 >> 16) & 0xff] ^ s_td2[(t2 >> 8) & 0xff] ^ s_td3[t1 & 0xff] ^ rdk[24]; + s1 = s_td0[t1 >> 24] ^ s_td1[(t0 >> 16) & 0xff] ^ s_td2[(t3 >> 8) & 0xff] ^ s_td3[t2 & 0xff] ^ rdk[25]; + s2 = s_td0[t2 >> 24] ^ s_td1[(t1 >> 16) & 0xff] ^ s_td2[(t0 >> 8) & 0xff] ^ s_td3[t3 & 0xff] ^ rdk[26]; + s3 = s_td0[t3 >> 24] ^ s_td1[(t2 >> 16) & 0xff] ^ s_td2[(t1 >> 8) & 0xff] ^ s_td3[t0 & 0xff] ^ rdk[27]; + t0 = s_td0[s0 >> 24] ^ s_td1[(s3 >> 16) & 0xff] ^ s_td2[(s2 >> 8) & 0xff] ^ s_td3[s1 & 0xff] ^ rdk[28]; + t1 = s_td0[s1 >> 24] ^ s_td1[(s0 >> 16) & 0xff] ^ s_td2[(s3 >> 8) & 0xff] ^ s_td3[s2 & 0xff] ^ rdk[29]; + t2 = s_td0[s2 >> 24] ^ s_td1[(s1 >> 16) & 0xff] ^ s_td2[(s0 >> 8) & 0xff] ^ s_td3[s3 & 0xff] ^ rdk[30]; + t3 = s_td0[s3 >> 24] ^ s_td1[(s2 >> 16) & 0xff] ^ s_td2[(s1 >> 8) & 0xff] ^ s_td3[s0 & 0xff] ^ rdk[31]; + s0 = s_td0[t0 >> 24] ^ s_td1[(t3 >> 16) & 0xff] ^ s_td2[(t2 >> 8) & 0xff] ^ s_td3[t1 & 0xff] ^ rdk[32]; + s1 = s_td0[t1 >> 24] ^ s_td1[(t0 >> 16) & 0xff] ^ s_td2[(t3 >> 8) & 0xff] ^ s_td3[t2 & 0xff] ^ rdk[33]; + s2 = s_td0[t2 >> 24] ^ s_td1[(t1 >> 16) & 0xff] ^ s_td2[(t0 >> 8) & 0xff] ^ s_td3[t3 & 0xff] ^ rdk[34]; + s3 = s_td0[t3 >> 24] ^ s_td1[(t2 >> 16) & 0xff] ^ s_td2[(t1 >> 8) & 0xff] ^ s_td3[t0 & 0xff] ^ rdk[35]; + t0 = s_td0[s0 >> 24] ^ s_td1[(s3 >> 16) & 0xff] ^ s_td2[(s2 >> 8) & 0xff] ^ s_td3[s1 & 0xff] ^ rdk[36]; + t1 = s_td0[s1 >> 24] ^ s_td1[(s0 >> 16) & 0xff] ^ s_td2[(s3 >> 8) & 0xff] ^ s_td3[s2 & 0xff] ^ rdk[37]; + t2 = s_td0[s2 >> 24] ^ s_td1[(s1 >> 16) & 0xff] ^ s_td2[(s0 >> 8) & 0xff] ^ s_td3[s3 & 0xff] ^ rdk[38]; + t3 = s_td0[s3 >> 24] ^ s_td1[(s2 >> 16) & 0xff] ^ s_td2[(s1 >> 8) & 0xff] ^ s_td3[s0 & 0xff] ^ rdk[39]; + s0 = s_td0[t0 >> 24] ^ s_td1[(t3 >> 16) & 0xff] ^ s_td2[(t2 >> 8) & 0xff] ^ s_td3[t1 & 0xff] ^ rdk[40]; + s1 = s_td0[t1 >> 24] ^ s_td1[(t0 >> 16) & 0xff] ^ s_td2[(t3 >> 8) & 0xff] ^ s_td3[t2 & 0xff] ^ rdk[41]; + s2 = s_td0[t2 >> 24] ^ s_td1[(t1 >> 16) & 0xff] ^ s_td2[(t0 >> 8) & 0xff] ^ s_td3[t3 & 0xff] ^ rdk[42]; + s3 = s_td0[t3 >> 24] ^ s_td1[(t2 >> 16) & 0xff] ^ s_td2[(t1 >> 8) & 0xff] ^ s_td3[t0 & 0xff] ^ rdk[43]; + t0 = s_td0[s0 >> 24] ^ s_td1[(s3 >> 16) & 0xff] ^ s_td2[(s2 >> 8) & 0xff] ^ s_td3[s1 & 0xff] ^ rdk[44]; + t1 = s_td0[s1 >> 24] ^ s_td1[(s0 >> 16) & 0xff] ^ s_td2[(s3 >> 8) & 0xff] ^ s_td3[s2 & 0xff] ^ rdk[45]; + t2 = s_td0[s2 >> 24] ^ s_td1[(s1 >> 16) & 0xff] ^ s_td2[(s0 >> 8) & 0xff] ^ s_td3[s3 & 0xff] ^ rdk[46]; + t3 = s_td0[s3 >> 24] ^ s_td1[(s2 >> 16) & 0xff] ^ s_td2[(s1 >> 8) & 0xff] ^ s_td3[s0 & 0xff] ^ rdk[47]; + s0 = s_td0[t0 >> 24] ^ s_td1[(t3 >> 16) & 0xff] ^ s_td2[(t2 >> 8) & 0xff] ^ s_td3[t1 & 0xff] ^ rdk[48]; + s1 = s_td0[t1 >> 24] ^ s_td1[(t0 >> 16) & 0xff] ^ s_td2[(t3 >> 8) & 0xff] ^ s_td3[t2 & 0xff] ^ rdk[49]; + s2 = s_td0[t2 >> 24] ^ s_td1[(t1 >> 16) & 0xff] ^ s_td2[(t0 >> 8) & 0xff] ^ s_td3[t3 & 0xff] ^ rdk[50]; + s3 = s_td0[t3 >> 24] ^ s_td1[(t2 >> 16) & 0xff] ^ s_td2[(t1 >> 8) & 0xff] ^ s_td3[t0 & 0xff] ^ rdk[51]; + t0 = s_td0[s0 >> 24] ^ s_td1[(s3 >> 16) & 0xff] ^ s_td2[(s2 >> 8) & 0xff] ^ s_td3[s1 & 0xff] ^ rdk[52]; + t1 = s_td0[s1 >> 24] ^ s_td1[(s0 >> 16) & 0xff] ^ s_td2[(s3 >> 8) & 0xff] ^ s_td3[s2 & 0xff] ^ rdk[53]; + t2 = s_td0[s2 >> 24] ^ s_td1[(s1 >> 16) & 0xff] ^ s_td2[(s0 >> 8) & 0xff] ^ s_td3[s3 & 0xff] ^ rdk[54]; + t3 = s_td0[s3 >> 24] ^ s_td1[(s2 >> 16) & 0xff] ^ s_td2[(s1 >> 8) & 0xff] ^ s_td3[s0 & 0xff] ^ rdk[55]; + + out[0] = (s_td4[(t0 >> 24) & 0xff] & 0xff000000) + ^ (s_td4[(t3 >> 16) & 0xff] & 0x00ff0000) + ^ (s_td4[(t2 >> 8) & 0xff] & 0x0000ff00) + ^ (s_td4[(t1 >> 0) & 0xff] & 0x000000ff) + ^ rdk[56]; + + out[1] = (s_td4[(t1 >> 24) & 0xff] & 0xff000000) + ^ (s_td4[(t0 >> 16) & 0xff] & 0x00ff0000) + ^ (s_td4[(t3 >> 8) & 0xff] & 0x0000ff00) + ^ (s_td4[(t2 >> 0) & 0xff] & 0x000000ff) + ^ rdk[57]; + + out[2] = (s_td4[(t2 >> 24) & 0xff] & 0xff000000) + ^ (s_td4[(t1 >> 16) & 0xff] & 0x00ff0000) + ^ (s_td4[(t0 >> 8) & 0xff] & 0x0000ff00) + ^ (s_td4[(t3 >> 0) & 0xff] & 0x000000ff) + ^ rdk[58]; + + out[3] = (s_td4[(t3 >> 24) & 0xff] & 0xff000000) + ^ (s_td4[(t2 >> 16) & 0xff] & 0x00ff0000) + ^ (s_td4[(t1 >> 8) & 0xff] & 0x0000ff00) + ^ (s_td4[(t0 >> 0) & 0xff] & 0x000000ff) + ^ rdk[59]; +} + +static void sha1_transform (const u32x w0[4], const u32x w1[4], const u32x w2[4], const u32x w3[4], u32x digest[5]) +{ + u32x A = digest[0]; + u32x B = digest[1]; + u32x C = digest[2]; + u32x D = digest[3]; + u32x E = digest[4]; + + u32x w0_t = w0[0]; + u32x w1_t = w0[1]; + u32x w2_t = w0[2]; + u32x w3_t = w0[3]; + u32x w4_t = w1[0]; + u32x w5_t = w1[1]; + u32x w6_t = w1[2]; + u32x w7_t = w1[3]; + u32x w8_t = w2[0]; + u32x w9_t = w2[1]; + u32x wa_t = w2[2]; + u32x wb_t = w2[3]; + u32x wc_t = w3[0]; + u32x wd_t = w3[1]; + u32x we_t = w3[2]; + u32x wf_t = w3[3]; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, A, B, C, D, E, w0_t); + SHA1_STEP (SHA1_F0o, E, A, B, C, D, w1_t); + SHA1_STEP (SHA1_F0o, D, E, A, B, C, w2_t); + SHA1_STEP (SHA1_F0o, C, D, E, A, B, w3_t); + SHA1_STEP (SHA1_F0o, B, C, D, E, A, w4_t); + SHA1_STEP (SHA1_F0o, A, B, C, D, E, w5_t); + SHA1_STEP (SHA1_F0o, E, A, B, C, D, w6_t); + SHA1_STEP (SHA1_F0o, D, E, A, B, C, w7_t); + SHA1_STEP (SHA1_F0o, C, D, E, A, B, w8_t); + SHA1_STEP (SHA1_F0o, B, C, D, E, A, w9_t); + SHA1_STEP (SHA1_F0o, A, B, C, D, E, wa_t); + SHA1_STEP (SHA1_F0o, E, A, B, C, D, wb_t); + SHA1_STEP (SHA1_F0o, D, E, A, B, C, wc_t); + SHA1_STEP (SHA1_F0o, C, D, E, A, B, wd_t); + SHA1_STEP (SHA1_F0o, B, C, D, E, A, we_t); + SHA1_STEP (SHA1_F0o, A, B, C, D, E, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F0o, E, A, B, C, D, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F0o, D, E, A, B, C, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F0o, C, D, E, A, B, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F0o, B, C, D, E, A, w3_t); + + #undef K + #define K SHA1C01 + + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w7_t); + + #undef K + #define K SHA1C02 + + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, wb_t); + + #undef K + #define K SHA1C03 + + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, wf_t); + + digest[0] += A; + digest[1] += B; + digest[2] += C; + digest[3] += D; + digest[4] += E; +} + +static void hmac_sha1_pad (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], u32x ipad[5], u32x opad[5]) +{ + w0[0] = w0[0] ^ 0x36363636; + w0[1] = w0[1] ^ 0x36363636; + w0[2] = w0[2] ^ 0x36363636; + w0[3] = w0[3] ^ 0x36363636; + w1[0] = w1[0] ^ 0x36363636; + w1[1] = w1[1] ^ 0x36363636; + w1[2] = w1[2] ^ 0x36363636; + w1[3] = w1[3] ^ 0x36363636; + w2[0] = w2[0] ^ 0x36363636; + w2[1] = w2[1] ^ 0x36363636; + w2[2] = w2[2] ^ 0x36363636; + w2[3] = w2[3] ^ 0x36363636; + w3[0] = w3[0] ^ 0x36363636; + w3[1] = w3[1] ^ 0x36363636; + w3[2] = w3[2] ^ 0x36363636; + w3[3] = w3[3] ^ 0x36363636; + + ipad[0] = SHA1M_A; + ipad[1] = SHA1M_B; + ipad[2] = SHA1M_C; + ipad[3] = SHA1M_D; + ipad[4] = SHA1M_E; + + sha1_transform (w0, w1, w2, w3, ipad); + + w0[0] = w0[0] ^ 0x6a6a6a6a; + w0[1] = w0[1] ^ 0x6a6a6a6a; + w0[2] = w0[2] ^ 0x6a6a6a6a; + w0[3] = w0[3] ^ 0x6a6a6a6a; + w1[0] = w1[0] ^ 0x6a6a6a6a; + w1[1] = w1[1] ^ 0x6a6a6a6a; + w1[2] = w1[2] ^ 0x6a6a6a6a; + w1[3] = w1[3] ^ 0x6a6a6a6a; + w2[0] = w2[0] ^ 0x6a6a6a6a; + w2[1] = w2[1] ^ 0x6a6a6a6a; + w2[2] = w2[2] ^ 0x6a6a6a6a; + w2[3] = w2[3] ^ 0x6a6a6a6a; + w3[0] = w3[0] ^ 0x6a6a6a6a; + w3[1] = w3[1] ^ 0x6a6a6a6a; + w3[2] = w3[2] ^ 0x6a6a6a6a; + w3[3] = w3[3] ^ 0x6a6a6a6a; + + opad[0] = SHA1M_A; + opad[1] = SHA1M_B; + opad[2] = SHA1M_C; + opad[3] = SHA1M_D; + opad[4] = SHA1M_E; + + sha1_transform (w0, w1, w2, w3, opad); +} + +static void hmac_sha1_run (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], u32x ipad[5], u32x opad[5], u32x digest[5]) +{ + digest[0] = ipad[0]; + digest[1] = ipad[1]; + digest[2] = ipad[2]; + digest[3] = ipad[3]; + digest[4] = ipad[4]; + + sha1_transform (w0, w1, w2, w3, digest); + + w0[0] = digest[0]; + w0[1] = digest[1]; + w0[2] = digest[2]; + w0[3] = digest[3]; + w1[0] = digest[4]; + w1[1] = 0x80000000; + w1[2] = 0; + w1[3] = 0; + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = (64 + 20) * 8; + + digest[0] = opad[0]; + digest[1] = opad[1]; + digest[2] = opad[2]; + digest[3] = opad[3]; + digest[4] = opad[4]; + + sha1_transform (w0, w1, w2, w3, digest); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m12700_init (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global mywallet_tmp_t *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = pws[gid].i[ 8]; + w2[1] = pws[gid].i[ 9]; + w2[2] = pws[gid].i[10]; + w2[3] = pws[gid].i[11]; + + u32x w3[4]; + + w3[0] = pws[gid].i[12]; + w3[1] = pws[gid].i[13]; + w3[2] = pws[gid].i[14]; + w3[3] = pws[gid].i[15]; + + /** + * salt + */ + + u32 salt_len = 16; + + u32 salt_buf[4]; + + salt_buf[0] = salt_bufs[salt_pos].salt_buf[0]; + salt_buf[1] = salt_bufs[salt_pos].salt_buf[1]; + salt_buf[2] = salt_bufs[salt_pos].salt_buf[2]; + salt_buf[3] = salt_bufs[salt_pos].salt_buf[3]; + + /** + * pads + */ + + w0[0] = swap_workaround (w0[0]); + w0[1] = swap_workaround (w0[1]); + w0[2] = swap_workaround (w0[2]); + w0[3] = swap_workaround (w0[3]); + w1[0] = swap_workaround (w1[0]); + w1[1] = swap_workaround (w1[1]); + w1[2] = swap_workaround (w1[2]); + w1[3] = swap_workaround (w1[3]); + w2[0] = swap_workaround (w2[0]); + w2[1] = swap_workaround (w2[1]); + w2[2] = swap_workaround (w2[2]); + w2[3] = swap_workaround (w2[3]); + w3[0] = swap_workaround (w3[0]); + w3[1] = swap_workaround (w3[1]); + w3[2] = swap_workaround (w3[2]); + w3[3] = swap_workaround (w3[3]); + + u32x ipad[5]; + u32x opad[5]; + + hmac_sha1_pad (w0, w1, w2, w3, ipad, opad); + + tmps[gid].ipad[0] = ipad[0]; + tmps[gid].ipad[1] = ipad[1]; + tmps[gid].ipad[2] = ipad[2]; + tmps[gid].ipad[3] = ipad[3]; + tmps[gid].ipad[4] = ipad[4]; + + tmps[gid].opad[0] = opad[0]; + tmps[gid].opad[1] = opad[1]; + tmps[gid].opad[2] = opad[2]; + tmps[gid].opad[3] = opad[3]; + tmps[gid].opad[4] = opad[4]; + + // first 160 bits + + { + w0[0] = salt_buf[0]; + w0[1] = salt_buf[1]; + w0[2] = salt_buf[2]; + w0[3] = salt_buf[3]; + w1[0] = 0x00000001; + w1[1] = 0x80000000; + w1[2] = 0; + w1[3] = 0; + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = (64 + salt_len + 4) * 8; + + u32x dgst1[5]; + + hmac_sha1_run (w0, w1, w2, w3, ipad, opad, dgst1); + + tmps[gid].dgst1[0] = dgst1[0]; + tmps[gid].dgst1[1] = dgst1[1]; + tmps[gid].dgst1[2] = dgst1[2]; + tmps[gid].dgst1[3] = dgst1[3]; + tmps[gid].dgst1[4] = dgst1[4]; + + tmps[gid].out1[0] = dgst1[0]; + tmps[gid].out1[1] = dgst1[1]; + tmps[gid].out1[2] = dgst1[2]; + tmps[gid].out1[3] = dgst1[3]; + tmps[gid].out1[4] = dgst1[4]; + } + + // second 160 bits + + { + w0[0] = salt_buf[0]; + w0[1] = salt_buf[1]; + w0[2] = salt_buf[2]; + w0[3] = salt_buf[3]; + w1[0] = 0x00000002; + w1[1] = 0x80000000; + w1[2] = 0; + w1[3] = 0; + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = (64 + salt_len + 4) * 8; + + u32x dgst2[5]; + + hmac_sha1_run (w0, w1, w2, w3, ipad, opad, dgst2); + + tmps[gid].dgst2[0] = dgst2[0]; + tmps[gid].dgst2[1] = dgst2[1]; + tmps[gid].dgst2[2] = dgst2[2]; + tmps[gid].dgst2[3] = dgst2[3]; + tmps[gid].dgst2[4] = dgst2[4]; + + tmps[gid].out2[0] = dgst2[0]; + tmps[gid].out2[1] = dgst2[1]; + tmps[gid].out2[2] = dgst2[2]; + tmps[gid].out2[3] = dgst2[3]; + tmps[gid].out2[4] = dgst2[4]; + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m12700_loop (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global mywallet_tmp_t *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32x ipad[5]; + u32x opad[5]; + + ipad[0] = tmps[gid].ipad[0]; + ipad[1] = tmps[gid].ipad[1]; + ipad[2] = tmps[gid].ipad[2]; + ipad[3] = tmps[gid].ipad[3]; + ipad[4] = tmps[gid].ipad[4]; + + opad[0] = tmps[gid].opad[0]; + opad[1] = tmps[gid].opad[1]; + opad[2] = tmps[gid].opad[2]; + opad[3] = tmps[gid].opad[3]; + opad[4] = tmps[gid].opad[4]; + + // first 160 bits + + { + u32x dgst1[5]; + u32x out1[5]; + + dgst1[0] = tmps[gid].dgst1[0]; + dgst1[1] = tmps[gid].dgst1[1]; + dgst1[2] = tmps[gid].dgst1[2]; + dgst1[3] = tmps[gid].dgst1[3]; + dgst1[4] = tmps[gid].dgst1[4]; + + out1[0] = tmps[gid].out1[0]; + out1[1] = tmps[gid].out1[1]; + out1[2] = tmps[gid].out1[2]; + out1[3] = tmps[gid].out1[3]; + out1[4] = tmps[gid].out1[4]; + + for (u32 j = 0; j < loop_cnt; j++) + { + u32x w0[4]; + u32x w1[4]; + u32x w2[4]; + u32x w3[4]; + + w0[0] = dgst1[0]; + w0[1] = dgst1[1]; + w0[2] = dgst1[2]; + w0[3] = dgst1[3]; + w1[0] = dgst1[4]; + w1[1] = 0x80000000; + w1[2] = 0; + w1[3] = 0; + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = (64 + 20) * 8; + + hmac_sha1_run (w0, w1, w2, w3, ipad, opad, dgst1); + + out1[0] ^= dgst1[0]; + out1[1] ^= dgst1[1]; + out1[2] ^= dgst1[2]; + out1[3] ^= dgst1[3]; + out1[4] ^= dgst1[4]; + } + + tmps[gid].dgst1[0] = dgst1[0]; + tmps[gid].dgst1[1] = dgst1[1]; + tmps[gid].dgst1[2] = dgst1[2]; + tmps[gid].dgst1[3] = dgst1[3]; + tmps[gid].dgst1[4] = dgst1[4]; + + tmps[gid].out1[0] = out1[0]; + tmps[gid].out1[1] = out1[1]; + tmps[gid].out1[2] = out1[2]; + tmps[gid].out1[3] = out1[3]; + tmps[gid].out1[4] = out1[4]; + } + + // second 160 bits + + { + u32x dgst2[5]; + u32x out2[5]; + + dgst2[0] = tmps[gid].dgst2[0]; + dgst2[1] = tmps[gid].dgst2[1]; + dgst2[2] = tmps[gid].dgst2[2]; + dgst2[3] = tmps[gid].dgst2[3]; + dgst2[4] = tmps[gid].dgst2[4]; + + out2[0] = tmps[gid].out2[0]; + out2[1] = tmps[gid].out2[1]; + out2[2] = tmps[gid].out2[2]; + out2[3] = tmps[gid].out2[3]; + out2[4] = tmps[gid].out2[4]; + + for (u32 j = 0; j < loop_cnt; j++) + { + u32x w0[4]; + u32x w1[4]; + u32x w2[4]; + u32x w3[4]; + + w0[0] = dgst2[0]; + w0[1] = dgst2[1]; + w0[2] = dgst2[2]; + w0[3] = dgst2[3]; + w1[0] = dgst2[4]; + w1[1] = 0x80000000; + w1[2] = 0; + w1[3] = 0; + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = (64 + 20) * 8; + + hmac_sha1_run (w0, w1, w2, w3, ipad, opad, dgst2); + + out2[0] ^= dgst2[0]; + out2[1] ^= dgst2[1]; + out2[2] ^= dgst2[2]; + out2[3] ^= dgst2[3]; + out2[4] ^= dgst2[4]; + } + + tmps[gid].dgst2[0] = dgst2[0]; + tmps[gid].dgst2[1] = dgst2[1]; + tmps[gid].dgst2[2] = dgst2[2]; + tmps[gid].dgst2[3] = dgst2[3]; + tmps[gid].dgst2[4] = dgst2[4]; + + tmps[gid].out2[0] = out2[0]; + tmps[gid].out2[1] = out2[1]; + tmps[gid].out2[2] = out2[2]; + tmps[gid].out2[3] = out2[3]; + tmps[gid].out2[4] = out2[4]; + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m12700_comp (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global mywallet_tmp_t *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global void *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + const u32 lid = get_local_id (0); + + /** + * aes shared + */ + + const u32 lid4 = lid * 4; + + __local u32 s_td0[256]; + __local u32 s_td1[256]; + __local u32 s_td2[256]; + __local u32 s_td3[256]; + __local u32 s_td4[256]; + + __local u32 s_te0[256]; + __local u32 s_te1[256]; + __local u32 s_te2[256]; + __local u32 s_te3[256]; + __local u32 s_te4[256]; + + s_td0[lid4 + 0] = td0[lid4 + 0]; + s_td0[lid4 + 1] = td0[lid4 + 1]; + s_td0[lid4 + 2] = td0[lid4 + 2]; + s_td0[lid4 + 3] = td0[lid4 + 3]; + + s_td1[lid4 + 0] = td1[lid4 + 0]; + s_td1[lid4 + 1] = td1[lid4 + 1]; + s_td1[lid4 + 2] = td1[lid4 + 2]; + s_td1[lid4 + 3] = td1[lid4 + 3]; + + s_td2[lid4 + 0] = td2[lid4 + 0]; + s_td2[lid4 + 1] = td2[lid4 + 1]; + s_td2[lid4 + 2] = td2[lid4 + 2]; + s_td2[lid4 + 3] = td2[lid4 + 3]; + + s_td3[lid4 + 0] = td3[lid4 + 0]; + s_td3[lid4 + 1] = td3[lid4 + 1]; + s_td3[lid4 + 2] = td3[lid4 + 2]; + s_td3[lid4 + 3] = td3[lid4 + 3]; + + s_td4[lid4 + 0] = td4[lid4 + 0]; + s_td4[lid4 + 1] = td4[lid4 + 1]; + s_td4[lid4 + 2] = td4[lid4 + 2]; + s_td4[lid4 + 3] = td4[lid4 + 3]; + + s_te0[lid4 + 0] = te0[lid4 + 0]; + s_te0[lid4 + 1] = te0[lid4 + 1]; + s_te0[lid4 + 2] = te0[lid4 + 2]; + s_te0[lid4 + 3] = te0[lid4 + 3]; + + s_te1[lid4 + 0] = te1[lid4 + 0]; + s_te1[lid4 + 1] = te1[lid4 + 1]; + s_te1[lid4 + 2] = te1[lid4 + 2]; + s_te1[lid4 + 3] = te1[lid4 + 3]; + + s_te2[lid4 + 0] = te2[lid4 + 0]; + s_te2[lid4 + 1] = te2[lid4 + 1]; + s_te2[lid4 + 2] = te2[lid4 + 2]; + s_te2[lid4 + 3] = te2[lid4 + 3]; + + s_te3[lid4 + 0] = te3[lid4 + 0]; + s_te3[lid4 + 1] = te3[lid4 + 1]; + s_te3[lid4 + 2] = te3[lid4 + 2]; + s_te3[lid4 + 3] = te3[lid4 + 3]; + + s_te4[lid4 + 0] = te4[lid4 + 0]; + s_te4[lid4 + 1] = te4[lid4 + 1]; + s_te4[lid4 + 2] = te4[lid4 + 2]; + s_te4[lid4 + 3] = te4[lid4 + 3]; + + barrier (CLK_LOCAL_MEM_FENCE); + + if (gid >= gid_max) return; + + /** + * AES part + */ + + const u32 iv[4] = + { + salt_bufs[salt_pos].salt_buf[0], + salt_bufs[salt_pos].salt_buf[1], + salt_bufs[salt_pos].salt_buf[2], + salt_bufs[salt_pos].salt_buf[3] + }; + + const u32 data[4] = + { + salt_bufs[salt_pos].salt_buf[4], + salt_bufs[salt_pos].salt_buf[5], + salt_bufs[salt_pos].salt_buf[6], + salt_bufs[salt_pos].salt_buf[7] + }; + + u32x ukey[8]; + + ukey[0] = tmps[gid].out1[0]; + ukey[1] = tmps[gid].out1[1]; + ukey[2] = tmps[gid].out1[2]; + ukey[3] = tmps[gid].out1[3]; + ukey[4] = tmps[gid].out1[4]; + ukey[5] = tmps[gid].out2[0]; + ukey[6] = tmps[gid].out2[1]; + ukey[7] = tmps[gid].out2[2]; + + #define KEYLEN 60 + + u32 rk[KEYLEN]; + + AES256_ExpandKey (ukey, rk, s_te0, s_te1, s_te2, s_te3, s_te4); + + AES256_InvertKey (rk, s_td0, s_td1, s_td2, s_td3, s_td4, s_te0, s_te1, s_te2, s_te3, s_te4); + + u32 out[4]; + + AES256_decrypt (data, out, rk, s_td0, s_td1, s_td2, s_td3, s_td4); + + out[0] ^= iv[0]; + out[1] ^= iv[1]; + out[2] ^= iv[2]; + out[3] ^= iv[3]; + + out[0] = swap_workaround (out[0]); + out[1] = swap_workaround (out[1]); + out[2] = swap_workaround (out[2]); + out[3] = swap_workaround (out[3]); + + if ((out[0] & 0xff) != '{') return; + + char *pt = (char *) out; + + for (int i = 1; i < 16 - 6; i++) + { + if (pt[i + 0] != '"') continue; + if (pt[i + 1] != 'g') continue; + if (pt[i + 2] != 'u') continue; + if (pt[i + 3] != 'i') continue; + if (pt[i + 4] != 'd') continue; + if (pt[i + 5] != '"') continue; + + const u32x r0 = data[0]; + const u32x r1 = data[1]; + const u32x r2 = data[2]; + const u32x r3 = data[3]; + + #define il_pos 0 + + #include VECT_COMPARE_M + } +} diff --git a/amd/m12800.cl b/amd/m12800.cl new file mode 100644 index 0000000000..2877018d0c --- /dev/null +++ b/amd/m12800.cl @@ -0,0 +1,658 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _MS_DRSR_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW4 +#define VECT_SIZE1 +#endif + +#ifdef VLIW5 +#define VECT_SIZE1 +#endif + +#define DGST_R0 0 +#define DGST_R1 1 +#define DGST_R2 2 +#define DGST_R3 3 + +#include "include/kernel_functions.c" + +#include "types_amd.c" +#include "common_amd.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE1 +#define uint_to_hex_lower8(i) l_bin2asc[(i)] +#endif + +__constant u32 k_sha256[64] = +{ + SHA256C00, SHA256C01, SHA256C02, SHA256C03, + SHA256C04, SHA256C05, SHA256C06, SHA256C07, + SHA256C08, SHA256C09, SHA256C0a, SHA256C0b, + SHA256C0c, SHA256C0d, SHA256C0e, SHA256C0f, + SHA256C10, SHA256C11, SHA256C12, SHA256C13, + SHA256C14, SHA256C15, SHA256C16, SHA256C17, + SHA256C18, SHA256C19, SHA256C1a, SHA256C1b, + SHA256C1c, SHA256C1d, SHA256C1e, SHA256C1f, + SHA256C20, SHA256C21, SHA256C22, SHA256C23, + SHA256C24, SHA256C25, SHA256C26, SHA256C27, + SHA256C28, SHA256C29, SHA256C2a, SHA256C2b, + SHA256C2c, SHA256C2d, SHA256C2e, SHA256C2f, + SHA256C30, SHA256C31, SHA256C32, SHA256C33, + SHA256C34, SHA256C35, SHA256C36, SHA256C37, + SHA256C38, SHA256C39, SHA256C3a, SHA256C3b, + SHA256C3c, SHA256C3d, SHA256C3e, SHA256C3f, +}; + +static void md4_transform (const u32x w0[4], const u32x w1[4], const u32x w2[4], const u32x w3[4], u32x digest[4]) +{ + u32x a = digest[0]; + u32x b = digest[1]; + u32x c = digest[2]; + u32x d = digest[3]; + + MD4_STEP (MD4_Fo, a, b, c, d, w0[0], MD4C00, MD4S00); + MD4_STEP (MD4_Fo, d, a, b, c, w0[1], MD4C00, MD4S01); + MD4_STEP (MD4_Fo, c, d, a, b, w0[2], MD4C00, MD4S02); + MD4_STEP (MD4_Fo, b, c, d, a, w0[3], MD4C00, MD4S03); + MD4_STEP (MD4_Fo, a, b, c, d, w1[0], MD4C00, MD4S00); + MD4_STEP (MD4_Fo, d, a, b, c, w1[1], MD4C00, MD4S01); + MD4_STEP (MD4_Fo, c, d, a, b, w1[2], MD4C00, MD4S02); + MD4_STEP (MD4_Fo, b, c, d, a, w1[3], MD4C00, MD4S03); + MD4_STEP (MD4_Fo, a, b, c, d, w2[0], MD4C00, MD4S00); + MD4_STEP (MD4_Fo, d, a, b, c, w2[1], MD4C00, MD4S01); + MD4_STEP (MD4_Fo, c, d, a, b, w2[2], MD4C00, MD4S02); + MD4_STEP (MD4_Fo, b, c, d, a, w2[3], MD4C00, MD4S03); + MD4_STEP (MD4_Fo, a, b, c, d, w3[0], MD4C00, MD4S00); + MD4_STEP (MD4_Fo, d, a, b, c, w3[1], MD4C00, MD4S01); + MD4_STEP (MD4_Fo, c, d, a, b, w3[2], MD4C00, MD4S02); + MD4_STEP (MD4_Fo, b, c, d, a, w3[3], MD4C00, MD4S03); + + MD4_STEP (MD4_Go, a, b, c, d, w0[0], MD4C01, MD4S10); + MD4_STEP (MD4_Go, d, a, b, c, w1[0], MD4C01, MD4S11); + MD4_STEP (MD4_Go, c, d, a, b, w2[0], MD4C01, MD4S12); + MD4_STEP (MD4_Go, b, c, d, a, w3[0], MD4C01, MD4S13); + MD4_STEP (MD4_Go, a, b, c, d, w0[1], MD4C01, MD4S10); + MD4_STEP (MD4_Go, d, a, b, c, w1[1], MD4C01, MD4S11); + MD4_STEP (MD4_Go, c, d, a, b, w2[1], MD4C01, MD4S12); + MD4_STEP (MD4_Go, b, c, d, a, w3[1], MD4C01, MD4S13); + MD4_STEP (MD4_Go, a, b, c, d, w0[2], MD4C01, MD4S10); + MD4_STEP (MD4_Go, d, a, b, c, w1[2], MD4C01, MD4S11); + MD4_STEP (MD4_Go, c, d, a, b, w2[2], MD4C01, MD4S12); + MD4_STEP (MD4_Go, b, c, d, a, w3[2], MD4C01, MD4S13); + MD4_STEP (MD4_Go, a, b, c, d, w0[3], MD4C01, MD4S10); + MD4_STEP (MD4_Go, d, a, b, c, w1[3], MD4C01, MD4S11); + MD4_STEP (MD4_Go, c, d, a, b, w2[3], MD4C01, MD4S12); + MD4_STEP (MD4_Go, b, c, d, a, w3[3], MD4C01, MD4S13); + + MD4_STEP (MD4_H , a, b, c, d, w0[0], MD4C02, MD4S20); + MD4_STEP (MD4_H , d, a, b, c, w2[0], MD4C02, MD4S21); + MD4_STEP (MD4_H , c, d, a, b, w1[0], MD4C02, MD4S22); + MD4_STEP (MD4_H , b, c, d, a, w3[0], MD4C02, MD4S23); + MD4_STEP (MD4_H , a, b, c, d, w0[2], MD4C02, MD4S20); + MD4_STEP (MD4_H , d, a, b, c, w2[2], MD4C02, MD4S21); + MD4_STEP (MD4_H , c, d, a, b, w1[2], MD4C02, MD4S22); + MD4_STEP (MD4_H , b, c, d, a, w3[2], MD4C02, MD4S23); + MD4_STEP (MD4_H , a, b, c, d, w0[1], MD4C02, MD4S20); + MD4_STEP (MD4_H , d, a, b, c, w2[1], MD4C02, MD4S21); + MD4_STEP (MD4_H , c, d, a, b, w1[1], MD4C02, MD4S22); + MD4_STEP (MD4_H , b, c, d, a, w3[1], MD4C02, MD4S23); + MD4_STEP (MD4_H , a, b, c, d, w0[3], MD4C02, MD4S20); + MD4_STEP (MD4_H , d, a, b, c, w2[3], MD4C02, MD4S21); + MD4_STEP (MD4_H , c, d, a, b, w1[3], MD4C02, MD4S22); + MD4_STEP (MD4_H , b, c, d, a, w3[3], MD4C02, MD4S23); + + digest[0] += a; + digest[1] += b; + digest[2] += c; + digest[3] += d; +} + +static void sha256_transform (const u32x w0[4], const u32x w1[4], const u32x w2[4], const u32x w3[4], u32x digest[8]) +{ + u32x a = digest[0]; + u32x b = digest[1]; + u32x c = digest[2]; + u32x d = digest[3]; + u32x e = digest[4]; + u32x f = digest[5]; + u32x g = digest[6]; + u32x h = digest[7]; + + u32x w0_t = w0[0]; + u32x w1_t = w0[1]; + u32x w2_t = w0[2]; + u32x w3_t = w0[3]; + u32x w4_t = w1[0]; + u32x w5_t = w1[1]; + u32x w6_t = w1[2]; + u32x w7_t = w1[3]; + u32x w8_t = w2[0]; + u32x w9_t = w2[1]; + u32x wa_t = w2[2]; + u32x wb_t = w2[3]; + u32x wc_t = w3[0]; + u32x wd_t = w3[1]; + u32x we_t = w3[2]; + u32x wf_t = w3[3]; + + #define ROUND_EXPAND() \ + { \ + w0_t = SHA256_EXPAND (we_t, w9_t, w1_t, w0_t); \ + w1_t = SHA256_EXPAND (wf_t, wa_t, w2_t, w1_t); \ + w2_t = SHA256_EXPAND (w0_t, wb_t, w3_t, w2_t); \ + w3_t = SHA256_EXPAND (w1_t, wc_t, w4_t, w3_t); \ + w4_t = SHA256_EXPAND (w2_t, wd_t, w5_t, w4_t); \ + w5_t = SHA256_EXPAND (w3_t, we_t, w6_t, w5_t); \ + w6_t = SHA256_EXPAND (w4_t, wf_t, w7_t, w6_t); \ + w7_t = SHA256_EXPAND (w5_t, w0_t, w8_t, w7_t); \ + w8_t = SHA256_EXPAND (w6_t, w1_t, w9_t, w8_t); \ + w9_t = SHA256_EXPAND (w7_t, w2_t, wa_t, w9_t); \ + wa_t = SHA256_EXPAND (w8_t, w3_t, wb_t, wa_t); \ + wb_t = SHA256_EXPAND (w9_t, w4_t, wc_t, wb_t); \ + wc_t = SHA256_EXPAND (wa_t, w5_t, wd_t, wc_t); \ + wd_t = SHA256_EXPAND (wb_t, w6_t, we_t, wd_t); \ + we_t = SHA256_EXPAND (wc_t, w7_t, wf_t, we_t); \ + wf_t = SHA256_EXPAND (wd_t, w8_t, w0_t, wf_t); \ + } + + #define ROUND_STEP(i) \ + { \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, k_sha256[i + 0]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, k_sha256[i + 1]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, k_sha256[i + 2]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, k_sha256[i + 3]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, k_sha256[i + 4]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, k_sha256[i + 5]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, k_sha256[i + 6]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, k_sha256[i + 7]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, k_sha256[i + 8]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, k_sha256[i + 9]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, k_sha256[i + 10]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, k_sha256[i + 11]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, k_sha256[i + 12]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, k_sha256[i + 13]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, k_sha256[i + 14]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, k_sha256[i + 15]); \ + } + + ROUND_STEP (0); + + #pragma unroll + for (int i = 16; i < 64; i += 16) + { + ROUND_EXPAND (); ROUND_STEP (i); + } + + digest[0] += a; + digest[1] += b; + digest[2] += c; + digest[3] += d; + digest[4] += e; + digest[5] += f; + digest[6] += g; + digest[7] += h; +} + +static void hmac_sha256_pad (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], u32x ipad[8], u32x opad[8]) +{ + w0[0] = w0[0] ^ 0x36363636; + w0[1] = w0[1] ^ 0x36363636; + w0[2] = w0[2] ^ 0x36363636; + w0[3] = w0[3] ^ 0x36363636; + w1[0] = w1[0] ^ 0x36363636; + w1[1] = w1[1] ^ 0x36363636; + w1[2] = w1[2] ^ 0x36363636; + w1[3] = w1[3] ^ 0x36363636; + w2[0] = w2[0] ^ 0x36363636; + w2[1] = w2[1] ^ 0x36363636; + w2[2] = w2[2] ^ 0x36363636; + w2[3] = w2[3] ^ 0x36363636; + w3[0] = w3[0] ^ 0x36363636; + w3[1] = w3[1] ^ 0x36363636; + w3[2] = w3[2] ^ 0x36363636; + w3[3] = w3[3] ^ 0x36363636; + + ipad[0] = SHA256M_A; + ipad[1] = SHA256M_B; + ipad[2] = SHA256M_C; + ipad[3] = SHA256M_D; + ipad[4] = SHA256M_E; + ipad[5] = SHA256M_F; + ipad[6] = SHA256M_G; + ipad[7] = SHA256M_H; + + sha256_transform (w0, w1, w2, w3, ipad); + + w0[0] = w0[0] ^ 0x6a6a6a6a; + w0[1] = w0[1] ^ 0x6a6a6a6a; + w0[2] = w0[2] ^ 0x6a6a6a6a; + w0[3] = w0[3] ^ 0x6a6a6a6a; + w1[0] = w1[0] ^ 0x6a6a6a6a; + w1[1] = w1[1] ^ 0x6a6a6a6a; + w1[2] = w1[2] ^ 0x6a6a6a6a; + w1[3] = w1[3] ^ 0x6a6a6a6a; + w2[0] = w2[0] ^ 0x6a6a6a6a; + w2[1] = w2[1] ^ 0x6a6a6a6a; + w2[2] = w2[2] ^ 0x6a6a6a6a; + w2[3] = w2[3] ^ 0x6a6a6a6a; + w3[0] = w3[0] ^ 0x6a6a6a6a; + w3[1] = w3[1] ^ 0x6a6a6a6a; + w3[2] = w3[2] ^ 0x6a6a6a6a; + w3[3] = w3[3] ^ 0x6a6a6a6a; + + opad[0] = SHA256M_A; + opad[1] = SHA256M_B; + opad[2] = SHA256M_C; + opad[3] = SHA256M_D; + opad[4] = SHA256M_E; + opad[5] = SHA256M_F; + opad[6] = SHA256M_G; + opad[7] = SHA256M_H; + + sha256_transform (w0, w1, w2, w3, opad); +} + +static void hmac_sha256_run (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], u32x ipad[8], u32x opad[8], u32x digest[8]) +{ + digest[0] = ipad[0]; + digest[1] = ipad[1]; + digest[2] = ipad[2]; + digest[3] = ipad[3]; + digest[4] = ipad[4]; + digest[5] = ipad[5]; + digest[6] = ipad[6]; + digest[7] = ipad[7]; + + sha256_transform (w0, w1, w2, w3, digest); + + w0[0] = digest[0]; + w0[1] = digest[1]; + w0[2] = digest[2]; + w0[3] = digest[3]; + w1[0] = digest[4]; + w1[1] = digest[5]; + w1[2] = digest[6]; + w1[3] = digest[7]; + w2[0] = 0x80000000; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = (64 + 32) * 8; + + digest[0] = opad[0]; + digest[1] = opad[1]; + digest[2] = opad[2]; + digest[3] = opad[3]; + digest[4] = opad[4]; + digest[5] = opad[5]; + digest[6] = opad[6]; + digest[7] = opad[7]; + + sha256_transform (w0, w1, w2, w3, digest); +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m12800_init (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global pbkdf2_sha256_tmp_t *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global pbkdf2_sha256_t *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + const u32 lid = get_local_id (0); + + /** + * lookup ascii table + */ + + __local u32 l_bin2asc[256]; + + const u32 lid4 = lid * 4; + + const u32 lid40 = lid4 + 0; + const u32 lid41 = lid4 + 1; + const u32 lid42 = lid4 + 2; + const u32 lid43 = lid4 + 3; + + const u32 v400 = (lid40 >> 0) & 15; + const u32 v401 = (lid40 >> 4) & 15; + const u32 v410 = (lid41 >> 0) & 15; + const u32 v411 = (lid41 >> 4) & 15; + const u32 v420 = (lid42 >> 0) & 15; + const u32 v421 = (lid42 >> 4) & 15; + const u32 v430 = (lid43 >> 0) & 15; + const u32 v431 = (lid43 >> 4) & 15; + + l_bin2asc[lid40] = ((v400 < 10) ? '0' + v400 : 'A' - 10 + v400) << 8 + | ((v401 < 10) ? '0' + v401 : 'A' - 10 + v401) << 0; + l_bin2asc[lid41] = ((v410 < 10) ? '0' + v410 : 'A' - 10 + v410) << 8 + | ((v411 < 10) ? '0' + v411 : 'A' - 10 + v411) << 0; + l_bin2asc[lid42] = ((v420 < 10) ? '0' + v420 : 'A' - 10 + v420) << 8 + | ((v421 < 10) ? '0' + v421 : 'A' - 10 + v421) << 0; + l_bin2asc[lid43] = ((v430 < 10) ? '0' + v430 : 'A' - 10 + v430) << 8 + | ((v431 < 10) ? '0' + v431 : 'A' - 10 + v431) << 0; + + barrier (CLK_LOCAL_MEM_FENCE); + + if (gid >= gid_max) return; + + /** + * base + */ + + u32x w0[4]; + + w0[0] = pws[gid].i[0]; + w0[1] = pws[gid].i[1]; + w0[2] = pws[gid].i[2]; + w0[3] = pws[gid].i[3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[4]; + w1[1] = pws[gid].i[5]; + w1[2] = 0; + w1[3] = 0; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * salt + */ + + u32 salt_len = salt_bufs[salt_pos].salt_len; + + u32 salt_buf0[4]; + + salt_buf0[0] = swap_workaround (salt_bufs[salt_pos].salt_buf[0]); + salt_buf0[1] = swap_workaround (salt_bufs[salt_pos].salt_buf[1]); + salt_buf0[2] = swap_workaround (salt_bufs[salt_pos].salt_buf[2]); + salt_buf0[3] = swap_workaround (salt_bufs[salt_pos].salt_buf[3]); + + u32 salt_buf1[4]; + + salt_buf1[0] = 0; + salt_buf1[1] = 0; + salt_buf1[2] = 0; + salt_buf1[3] = 0; + + u32 salt_buf2[4]; + + salt_buf2[0] = 0; + salt_buf2[1] = 0; + salt_buf2[2] = 0; + salt_buf2[3] = 0; + + u32 salt_buf3[4]; + + salt_buf3[0] = 0; + salt_buf3[1] = 0; + salt_buf3[2] = 0; + salt_buf3[3] = (64 + salt_len + 4) * 8; + + /** + * generate nthash + */ + + append_0x80_2 (w0, w1, pw_len); + + make_unicode (w1, w2, w3); + make_unicode (w0, w0, w1); + + w3[2] = pw_len * 2 * 8; + + u32x digest_md4[4]; + + digest_md4[0] = MD4M_A; + digest_md4[1] = MD4M_B; + digest_md4[2] = MD4M_C; + digest_md4[3] = MD4M_D; + + md4_transform (w0, w1, w2, w3, digest_md4); + + w0[0] = uint_to_hex_lower8 ((digest_md4[0] >> 0) & 255) << 0 + | uint_to_hex_lower8 ((digest_md4[0] >> 8) & 255) << 16; + w0[1] = uint_to_hex_lower8 ((digest_md4[0] >> 16) & 255) << 0 + | uint_to_hex_lower8 ((digest_md4[0] >> 24) & 255) << 16; + w0[2] = uint_to_hex_lower8 ((digest_md4[1] >> 0) & 255) << 0 + | uint_to_hex_lower8 ((digest_md4[1] >> 8) & 255) << 16; + w0[3] = uint_to_hex_lower8 ((digest_md4[1] >> 16) & 255) << 0 + | uint_to_hex_lower8 ((digest_md4[1] >> 24) & 255) << 16; + w1[0] = uint_to_hex_lower8 ((digest_md4[2] >> 0) & 255) << 0 + | uint_to_hex_lower8 ((digest_md4[2] >> 8) & 255) << 16; + w1[1] = uint_to_hex_lower8 ((digest_md4[2] >> 16) & 255) << 0 + | uint_to_hex_lower8 ((digest_md4[2] >> 24) & 255) << 16; + w1[2] = uint_to_hex_lower8 ((digest_md4[3] >> 0) & 255) << 0 + | uint_to_hex_lower8 ((digest_md4[3] >> 8) & 255) << 16; + w1[3] = uint_to_hex_lower8 ((digest_md4[3] >> 16) & 255) << 0 + | uint_to_hex_lower8 ((digest_md4[3] >> 24) & 255) << 16; + + make_unicode (w1, w2, w3); + make_unicode (w0, w0, w1); + + w0[0] = swap_workaround (w0[0]); + w0[1] = swap_workaround (w0[1]); + w0[2] = swap_workaround (w0[2]); + w0[3] = swap_workaround (w0[3]); + w1[0] = swap_workaround (w1[0]); + w1[1] = swap_workaround (w1[1]); + w1[2] = swap_workaround (w1[2]); + w1[3] = swap_workaround (w1[3]); + w2[0] = swap_workaround (w2[0]); + w2[1] = swap_workaround (w2[1]); + w2[2] = swap_workaround (w2[2]); + w2[3] = swap_workaround (w2[3]); + w3[0] = swap_workaround (w3[0]); + w3[1] = swap_workaround (w3[1]); + w3[2] = swap_workaround (w3[2]); + w3[3] = swap_workaround (w3[3]); + + u32 ipad[8]; + u32 opad[8]; + + hmac_sha256_pad (w0, w1, w2, w3, ipad, opad); + + tmps[gid].ipad[0] = ipad[0]; + tmps[gid].ipad[1] = ipad[1]; + tmps[gid].ipad[2] = ipad[2]; + tmps[gid].ipad[3] = ipad[3]; + tmps[gid].ipad[4] = ipad[4]; + tmps[gid].ipad[5] = ipad[5]; + tmps[gid].ipad[6] = ipad[6]; + tmps[gid].ipad[7] = ipad[7]; + + tmps[gid].opad[0] = opad[0]; + tmps[gid].opad[1] = opad[1]; + tmps[gid].opad[2] = opad[2]; + tmps[gid].opad[3] = opad[3]; + tmps[gid].opad[4] = opad[4]; + tmps[gid].opad[5] = opad[5]; + tmps[gid].opad[6] = opad[6]; + tmps[gid].opad[7] = opad[7]; + + for (u32 i = 0, j = 1; i < 8; i += 8, j += 1) + { + u32 dgst[8]; + + hmac_sha256_run (salt_buf0, salt_buf1, salt_buf2, salt_buf3, ipad, opad, dgst); + + tmps[gid].dgst[i + 0] = dgst[0]; + tmps[gid].dgst[i + 1] = dgst[1]; + tmps[gid].dgst[i + 2] = dgst[2]; + tmps[gid].dgst[i + 3] = dgst[3]; + tmps[gid].dgst[i + 4] = dgst[4]; + tmps[gid].dgst[i + 5] = dgst[5]; + tmps[gid].dgst[i + 6] = dgst[6]; + tmps[gid].dgst[i + 7] = dgst[7]; + + tmps[gid].out[i + 0] = dgst[0]; + tmps[gid].out[i + 1] = dgst[1]; + tmps[gid].out[i + 2] = dgst[2]; + tmps[gid].out[i + 3] = dgst[3]; + tmps[gid].out[i + 4] = dgst[4]; + tmps[gid].out[i + 5] = dgst[5]; + tmps[gid].out[i + 6] = dgst[6]; + tmps[gid].out[i + 7] = dgst[7]; + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m12800_loop (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global pbkdf2_sha256_tmp_t *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global pbkdf2_sha256_t *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32 ipad[8]; + + ipad[0] = tmps[gid].ipad[0]; + ipad[1] = tmps[gid].ipad[1]; + ipad[2] = tmps[gid].ipad[2]; + ipad[3] = tmps[gid].ipad[3]; + ipad[4] = tmps[gid].ipad[4]; + ipad[5] = tmps[gid].ipad[5]; + ipad[6] = tmps[gid].ipad[6]; + ipad[7] = tmps[gid].ipad[7]; + + u32 opad[8]; + + opad[0] = tmps[gid].opad[0]; + opad[1] = tmps[gid].opad[1]; + opad[2] = tmps[gid].opad[2]; + opad[3] = tmps[gid].opad[3]; + opad[4] = tmps[gid].opad[4]; + opad[5] = tmps[gid].opad[5]; + opad[6] = tmps[gid].opad[6]; + opad[7] = tmps[gid].opad[7]; + + for (u32 i = 0; i < 8; i += 8) + { + u32 dgst[8]; + + dgst[0] = tmps[gid].dgst[i + 0]; + dgst[1] = tmps[gid].dgst[i + 1]; + dgst[2] = tmps[gid].dgst[i + 2]; + dgst[3] = tmps[gid].dgst[i + 3]; + dgst[4] = tmps[gid].dgst[i + 4]; + dgst[5] = tmps[gid].dgst[i + 5]; + dgst[6] = tmps[gid].dgst[i + 6]; + dgst[7] = tmps[gid].dgst[i + 7]; + + u32 out[8]; + + out[0] = tmps[gid].out[i + 0]; + out[1] = tmps[gid].out[i + 1]; + out[2] = tmps[gid].out[i + 2]; + out[3] = tmps[gid].out[i + 3]; + out[4] = tmps[gid].out[i + 4]; + out[5] = tmps[gid].out[i + 5]; + out[6] = tmps[gid].out[i + 6]; + out[7] = tmps[gid].out[i + 7]; + + for (u32 j = 0; j < loop_cnt; j++) + { + u32 w0[4]; + u32 w1[4]; + u32 w2[4]; + u32 w3[4]; + + w0[0] = dgst[0]; + w0[1] = dgst[1]; + w0[2] = dgst[2]; + w0[3] = dgst[3]; + w1[0] = dgst[4]; + w1[1] = dgst[5]; + w1[2] = dgst[6]; + w1[3] = dgst[7]; + w2[0] = 0x80000000; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = (64 + 32) * 8; + + hmac_sha256_run (w0, w1, w2, w3, ipad, opad, dgst); + + out[0] ^= dgst[0]; + out[1] ^= dgst[1]; + out[2] ^= dgst[2]; + out[3] ^= dgst[3]; + out[4] ^= dgst[4]; + out[5] ^= dgst[5]; + out[6] ^= dgst[6]; + out[7] ^= dgst[7]; + } + + tmps[gid].dgst[i + 0] = dgst[0]; + tmps[gid].dgst[i + 1] = dgst[1]; + tmps[gid].dgst[i + 2] = dgst[2]; + tmps[gid].dgst[i + 3] = dgst[3]; + tmps[gid].dgst[i + 4] = dgst[4]; + tmps[gid].dgst[i + 5] = dgst[5]; + tmps[gid].dgst[i + 6] = dgst[6]; + tmps[gid].dgst[i + 7] = dgst[7]; + + tmps[gid].out[i + 0] = out[0]; + tmps[gid].out[i + 1] = out[1]; + tmps[gid].out[i + 2] = out[2]; + tmps[gid].out[i + 3] = out[3]; + tmps[gid].out[i + 4] = out[4]; + tmps[gid].out[i + 5] = out[5]; + tmps[gid].out[i + 6] = out[6]; + tmps[gid].out[i + 7] = out[7]; + } +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) m12800_comp (__global pw_t *pws, __global gpu_rule_t *rules_buf, __global comb_t *combs_buf, __global bf_t *bfs_buf, __global pbkdf2_sha256_tmp_t *tmps, __global void *hooks, __global u32 *bitmaps_buf_s1_a, __global u32 *bitmaps_buf_s1_b, __global u32 *bitmaps_buf_s1_c, __global u32 *bitmaps_buf_s1_d, __global u32 *bitmaps_buf_s2_a, __global u32 *bitmaps_buf_s2_b, __global u32 *bitmaps_buf_s2_c, __global u32 *bitmaps_buf_s2_d, __global plain_t *plains_buf, __global digest_t *digests_buf, __global u32 *hashes_shown, __global salt_t *salt_bufs, __global pbkdf2_sha256_t *esalt_bufs, __global u32 *d_return_buf, __global u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + const u32 lid = get_local_id (0); + + const u32x r0 = tmps[gid].out[DGST_R0]; + const u32x r1 = tmps[gid].out[DGST_R1]; + const u32x r2 = tmps[gid].out[DGST_R2]; + const u32x r3 = tmps[gid].out[DGST_R3]; + + #define il_pos 0 + + #include VECT_COMPARE_M +} diff --git a/amd/markov_be_v1.cl b/amd/markov_be_v1.cl new file mode 100644 index 0000000000..1fad7bcdbf --- /dev/null +++ b/amd/markov_be_v1.cl @@ -0,0 +1,129 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#include "include/kernel_vendor.h" + +#define CHARSIZ 256 + +#define VECT_SIZE1 + +#include "types_amd.c" + +static void generate_pw (u32 pw_buf[16], __global cs_t *root_css_buf, __global cs_t *markov_css_buf, const u32 pw_l_len, const u32 pw_r_len, const u32 mask80, const u32 bits14, const u32 bits15, u64 val) +{ + pw_buf[ 0] = 0; + pw_buf[ 1] = 0; + pw_buf[ 2] = 0; + pw_buf[ 3] = 0; + pw_buf[ 4] = 0; + pw_buf[ 5] = 0; + pw_buf[ 6] = 0; + pw_buf[ 7] = 0; + pw_buf[ 8] = 0; + pw_buf[ 9] = 0; + pw_buf[10] = 0; + pw_buf[11] = 0; + pw_buf[12] = 0; + pw_buf[13] = 0; + pw_buf[14] = 0; + pw_buf[15] = 0; + + __global cs_t *cs = &root_css_buf[pw_r_len]; + + u32 i; + u32 j; + + for (i = 0, j = pw_r_len; i < pw_l_len; i++, j++) + { + const u32 len = cs->cs_len; + + const u64 next = val / len; + const u64 pos = val % len; + + val = next; + + const u32 key = cs->cs_buf[pos]; + + const u32 jd4 = j / 4; + const u32 jm4 = j % 4; + + pw_buf[jd4] |= key << ((3 - jm4) * 8); + + cs = &markov_css_buf[(j * CHARSIZ) + key]; + } + + const u32 jd4 = j / 4; + const u32 jm4 = j % 4; + + pw_buf[jd4] |= (0xff << ((3 - jm4) * 8)) & mask80; + + if (bits14) pw_buf[14] = (pw_l_len + pw_r_len) * 8; + if (bits15) pw_buf[15] = (pw_l_len + pw_r_len) * 8; +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) l_markov (__global pw_t *pws_buf_l, __global cs_t *root_css_buf, __global cs_t *markov_css_buf, const u64 off, const u32 pw_l_len, const u32 pw_r_len, const u32 mask80, const u32 bits14, const u32 bits15, const u32 gid_max) +{ + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32 pw_buf[16]; + + generate_pw (pw_buf, root_css_buf, markov_css_buf, pw_l_len, pw_r_len, mask80, bits14, bits15, off + gid); + + pws_buf_l[gid].i[ 0] = pw_buf[ 0]; + pws_buf_l[gid].i[ 1] = pw_buf[ 1]; + pws_buf_l[gid].i[ 2] = pw_buf[ 2]; + pws_buf_l[gid].i[ 3] = pw_buf[ 3]; + pws_buf_l[gid].i[ 4] = pw_buf[ 4]; + pws_buf_l[gid].i[ 5] = pw_buf[ 5]; + pws_buf_l[gid].i[ 6] = pw_buf[ 6]; + pws_buf_l[gid].i[ 7] = pw_buf[ 7]; + pws_buf_l[gid].i[ 8] = pw_buf[ 8]; + pws_buf_l[gid].i[ 9] = pw_buf[ 9]; + pws_buf_l[gid].i[10] = pw_buf[10]; + pws_buf_l[gid].i[11] = pw_buf[11]; + pws_buf_l[gid].i[12] = pw_buf[12]; + pws_buf_l[gid].i[13] = pw_buf[13]; + pws_buf_l[gid].i[14] = pw_buf[14]; + pws_buf_l[gid].i[15] = pw_buf[15]; + + pws_buf_l[gid].pw_len = pw_l_len + pw_r_len; +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) r_markov (__global bf_t *pws_buf_r, __global cs_t *root_css_buf, __global cs_t *markov_css_buf, const u64 off, const u32 pw_r_len, const u32 mask80, const u32 bits14, const u32 bits15, const u32 gid_max) +{ + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32 pw_buf[16]; + + generate_pw (pw_buf, root_css_buf, markov_css_buf, pw_r_len, 0, 0, 0, 0, off + gid); + + pws_buf_r[gid].i = pw_buf[0]; +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) C_markov (__global comb_t *pws_buf, __global cs_t *root_css_buf, __global cs_t *markov_css_buf, const u64 off, const u32 pw_len, const u32 mask80, const u32 bits14, const u32 bits15, const u32 gid_max) +{ + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32 pw_buf[16]; + + generate_pw (pw_buf, root_css_buf, markov_css_buf, pw_len, 0, mask80, bits14, bits15, off + gid); + + pws_buf[gid].i[ 0] = pw_buf[ 0]; + pws_buf[gid].i[ 1] = pw_buf[ 1]; + pws_buf[gid].i[ 2] = pw_buf[ 2]; + pws_buf[gid].i[ 3] = pw_buf[ 3]; + pws_buf[gid].i[ 4] = pw_buf[ 4]; + pws_buf[gid].i[ 5] = pw_buf[ 5]; + pws_buf[gid].i[ 6] = pw_buf[ 6]; + pws_buf[gid].i[ 7] = pw_buf[ 7]; + + pws_buf[gid].pw_len = pw_len; +} diff --git a/amd/markov_be_v2.cl b/amd/markov_be_v2.cl new file mode 100644 index 0000000000..11b2db412d --- /dev/null +++ b/amd/markov_be_v2.cl @@ -0,0 +1,178 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#include "include/kernel_vendor.h" + +#define CHARSIZ 256 + +#define VECT_SIZE2 + +#include "types_amd.c" + +static void generate_pw (u32 pw_buf[16], __global cs_t *root_css_buf, __global cs_t *markov_css_buf, const u32 pw_l_len, const u32 pw_r_len, const u32 mask80, const u32 bits14, const u32 bits15, u64 val) +{ + pw_buf[ 0] = 0; + pw_buf[ 1] = 0; + pw_buf[ 2] = 0; + pw_buf[ 3] = 0; + pw_buf[ 4] = 0; + pw_buf[ 5] = 0; + pw_buf[ 6] = 0; + pw_buf[ 7] = 0; + pw_buf[ 8] = 0; + pw_buf[ 9] = 0; + pw_buf[10] = 0; + pw_buf[11] = 0; + pw_buf[12] = 0; + pw_buf[13] = 0; + pw_buf[14] = 0; + pw_buf[15] = 0; + + __global cs_t *cs = &root_css_buf[pw_r_len]; + + u32 i; + u32 j; + + for (i = 0, j = pw_r_len; i < pw_l_len; i++, j++) + { + const u32 len = cs->cs_len; + + const u64 next = val / len; + const u64 pos = val % len; + + val = next; + + const u32 key = cs->cs_buf[pos]; + + const u32 jd4 = j / 4; + const u32 jm4 = j % 4; + + pw_buf[jd4] |= key << ((3 - jm4) * 8); + + cs = &markov_css_buf[(j * CHARSIZ) + key]; + } + + const u32 jd4 = j / 4; + const u32 jm4 = j % 4; + + pw_buf[jd4] |= (0xff << ((3 - jm4) * 8)) & mask80; + + if (bits14) pw_buf[14] = (pw_l_len + pw_r_len) * 8; + if (bits15) pw_buf[15] = (pw_l_len + pw_r_len) * 8; +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) l_markov (__global pw_t *pws_buf_l, __global cs_t *root_css_buf, __global cs_t *markov_css_buf, const u64 off, const u32 pw_l_len, const u32 pw_r_len, const u32 mask80, const u32 bits14, const u32 bits15, const u32 gid_max) +{ + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + const u32 gid2 = gid * 2; + + u32 pw_buf0[16]; + u32 pw_buf1[16]; + + generate_pw (pw_buf0, root_css_buf, markov_css_buf, pw_l_len, pw_r_len, mask80, bits14, bits15, off + gid2 + 0); + generate_pw (pw_buf1, root_css_buf, markov_css_buf, pw_l_len, pw_r_len, mask80, bits14, bits15, off + gid2 + 1); + + #pragma unroll 16 + for (int i = 0; i < 16; i++) + { + pws_buf_l[gid].i[i].s0 = pw_buf0[i]; + pws_buf_l[gid].i[i].s1 = pw_buf1[i]; + } + + pws_buf_l[gid].pw_len = pw_l_len + pw_r_len; +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) r_markov (__global bf_t *pws_buf_r, __global cs_t *root_css_buf, __global cs_t *markov_css_buf, const u64 off, const u32 pw_r_len, const u32 mask80, const u32 bits14, const u32 bits15, const u32 gid_max) +{ + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + const u32 gid2 = gid * 2; + + u32 pw_buf[16]; + + generate_pw (pw_buf, root_css_buf, markov_css_buf, pw_r_len, 0, 0, 0, 0, off + gid2 + 0); + + pws_buf_r[gid2 + 0].i = pw_buf[0]; + + generate_pw (pw_buf, root_css_buf, markov_css_buf, pw_r_len, 0, 0, 0, 0, off + gid2 + 1); + + pws_buf_r[gid2 + 1].i = pw_buf[0]; + + generate_pw (pw_buf, root_css_buf, markov_css_buf, pw_r_len, 0, 0, 0, 0, off + gid2 + 2); + + pws_buf_r[gid2 + 2].i = pw_buf[0]; + + generate_pw (pw_buf, root_css_buf, markov_css_buf, pw_r_len, 0, 0, 0, 0, off + gid2 + 3); + + pws_buf_r[gid2 + 3].i = pw_buf[0]; +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) C_markov (__global comb_t *pws_buf, __global cs_t *root_css_buf, __global cs_t *markov_css_buf, const u64 off, const u32 pw_len, const u32 mask80, const u32 bits14, const u32 bits15, const u32 gid_max) +{ + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + const u32 gid2 = gid * 2; + + u32 pw_buf[16]; + + generate_pw (pw_buf, root_css_buf, markov_css_buf, pw_len, 0, mask80, bits14, bits15, off + gid2 + 0); + + pws_buf[gid2 + 0].i[ 0] = pw_buf[ 0]; + pws_buf[gid2 + 0].i[ 1] = pw_buf[ 1]; + pws_buf[gid2 + 0].i[ 2] = pw_buf[ 2]; + pws_buf[gid2 + 0].i[ 3] = pw_buf[ 3]; + pws_buf[gid2 + 0].i[ 4] = pw_buf[ 4]; + pws_buf[gid2 + 0].i[ 5] = pw_buf[ 5]; + pws_buf[gid2 + 0].i[ 6] = pw_buf[ 6]; + pws_buf[gid2 + 0].i[ 7] = pw_buf[ 7]; + + pws_buf[gid2 + 0].pw_len = pw_len; + + generate_pw (pw_buf, root_css_buf, markov_css_buf, pw_len, 0, mask80, bits14, bits15, off + gid2 + 1); + + pws_buf[gid2 + 1].i[ 0] = pw_buf[ 0]; + pws_buf[gid2 + 1].i[ 1] = pw_buf[ 1]; + pws_buf[gid2 + 1].i[ 2] = pw_buf[ 2]; + pws_buf[gid2 + 1].i[ 3] = pw_buf[ 3]; + pws_buf[gid2 + 1].i[ 4] = pw_buf[ 4]; + pws_buf[gid2 + 1].i[ 5] = pw_buf[ 5]; + pws_buf[gid2 + 1].i[ 6] = pw_buf[ 6]; + pws_buf[gid2 + 1].i[ 7] = pw_buf[ 7]; + + pws_buf[gid2 + 1].pw_len = pw_len; + + generate_pw (pw_buf, root_css_buf, markov_css_buf, pw_len, 0, mask80, bits14, bits15, off + gid2 + 2); + + pws_buf[gid2 + 2].i[ 0] = pw_buf[ 0]; + pws_buf[gid2 + 2].i[ 1] = pw_buf[ 1]; + pws_buf[gid2 + 2].i[ 2] = pw_buf[ 2]; + pws_buf[gid2 + 2].i[ 3] = pw_buf[ 3]; + pws_buf[gid2 + 2].i[ 4] = pw_buf[ 4]; + pws_buf[gid2 + 2].i[ 5] = pw_buf[ 5]; + pws_buf[gid2 + 2].i[ 6] = pw_buf[ 6]; + pws_buf[gid2 + 2].i[ 7] = pw_buf[ 7]; + + pws_buf[gid2 + 2].pw_len = pw_len; + + generate_pw (pw_buf, root_css_buf, markov_css_buf, pw_len, 0, mask80, bits14, bits15, off + gid2 + 3); + + pws_buf[gid2 + 3].i[ 0] = pw_buf[ 0]; + pws_buf[gid2 + 3].i[ 1] = pw_buf[ 1]; + pws_buf[gid2 + 3].i[ 2] = pw_buf[ 2]; + pws_buf[gid2 + 3].i[ 3] = pw_buf[ 3]; + pws_buf[gid2 + 3].i[ 4] = pw_buf[ 4]; + pws_buf[gid2 + 3].i[ 5] = pw_buf[ 5]; + pws_buf[gid2 + 3].i[ 6] = pw_buf[ 6]; + pws_buf[gid2 + 3].i[ 7] = pw_buf[ 7]; + + pws_buf[gid2 + 3].pw_len = pw_len; +} diff --git a/amd/markov_be_v4.cl b/amd/markov_be_v4.cl new file mode 100644 index 0000000000..a5d4a6b331 --- /dev/null +++ b/amd/markov_be_v4.cl @@ -0,0 +1,184 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#include "include/kernel_vendor.h" + +#define CHARSIZ 256 + +#define VECT_SIZE4 + +#include "types_amd.c" + +static void generate_pw (u32 pw_buf[16], __global cs_t *root_css_buf, __global cs_t *markov_css_buf, const u32 pw_l_len, const u32 pw_r_len, const u32 mask80, const u32 bits14, const u32 bits15, u64 val) +{ + pw_buf[ 0] = 0; + pw_buf[ 1] = 0; + pw_buf[ 2] = 0; + pw_buf[ 3] = 0; + pw_buf[ 4] = 0; + pw_buf[ 5] = 0; + pw_buf[ 6] = 0; + pw_buf[ 7] = 0; + pw_buf[ 8] = 0; + pw_buf[ 9] = 0; + pw_buf[10] = 0; + pw_buf[11] = 0; + pw_buf[12] = 0; + pw_buf[13] = 0; + pw_buf[14] = 0; + pw_buf[15] = 0; + + __global cs_t *cs = &root_css_buf[pw_r_len]; + + u32 i; + u32 j; + + for (i = 0, j = pw_r_len; i < pw_l_len; i++, j++) + { + const u32 len = cs->cs_len; + + const u64 next = val / len; + const u64 pos = val % len; + + val = next; + + const u32 key = cs->cs_buf[pos]; + + const u32 jd4 = j / 4; + const u32 jm4 = j % 4; + + pw_buf[jd4] |= key << ((3 - jm4) * 8); + + cs = &markov_css_buf[(j * CHARSIZ) + key]; + } + + const u32 jd4 = j / 4; + const u32 jm4 = j % 4; + + pw_buf[jd4] |= (0xff << ((3 - jm4) * 8)) & mask80; + + if (bits14) pw_buf[14] = (pw_l_len + pw_r_len) * 8; + if (bits15) pw_buf[15] = (pw_l_len + pw_r_len) * 8; +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) l_markov (__global pw_t *pws_buf_l, __global cs_t *root_css_buf, __global cs_t *markov_css_buf, const u64 off, const u32 pw_l_len, const u32 pw_r_len, const u32 mask80, const u32 bits14, const u32 bits15, const u32 gid_max) +{ + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + const u32 gid4 = gid * 4; + + u32 pw_buf0[16]; + u32 pw_buf1[16]; + u32 pw_buf2[16]; + u32 pw_buf3[16]; + + generate_pw (pw_buf0, root_css_buf, markov_css_buf, pw_l_len, pw_r_len, mask80, bits14, bits15, off + gid4 + 0); + generate_pw (pw_buf1, root_css_buf, markov_css_buf, pw_l_len, pw_r_len, mask80, bits14, bits15, off + gid4 + 1); + generate_pw (pw_buf2, root_css_buf, markov_css_buf, pw_l_len, pw_r_len, mask80, bits14, bits15, off + gid4 + 2); + generate_pw (pw_buf3, root_css_buf, markov_css_buf, pw_l_len, pw_r_len, mask80, bits14, bits15, off + gid4 + 3); + + #pragma unroll 16 + for (int i = 0; i < 16; i++) + { + pws_buf_l[gid].i[i].s0 = pw_buf0[i]; + pws_buf_l[gid].i[i].s1 = pw_buf1[i]; + pws_buf_l[gid].i[i].s2 = pw_buf2[i]; + pws_buf_l[gid].i[i].s3 = pw_buf3[i]; + } + + pws_buf_l[gid].pw_len = pw_l_len + pw_r_len; +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) r_markov (__global bf_t *pws_buf_r, __global cs_t *root_css_buf, __global cs_t *markov_css_buf, const u64 off, const u32 pw_r_len, const u32 mask80, const u32 bits14, const u32 bits15, const u32 gid_max) +{ + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + const u32 gid4 = gid * 4; + + u32 pw_buf[16]; + + generate_pw (pw_buf, root_css_buf, markov_css_buf, pw_r_len, 0, 0, 0, 0, off + gid4 + 0); + + pws_buf_r[gid4 + 0].i = pw_buf[0]; + + generate_pw (pw_buf, root_css_buf, markov_css_buf, pw_r_len, 0, 0, 0, 0, off + gid4 + 1); + + pws_buf_r[gid4 + 1].i = pw_buf[0]; + + generate_pw (pw_buf, root_css_buf, markov_css_buf, pw_r_len, 0, 0, 0, 0, off + gid4 + 2); + + pws_buf_r[gid4 + 2].i = pw_buf[0]; + + generate_pw (pw_buf, root_css_buf, markov_css_buf, pw_r_len, 0, 0, 0, 0, off + gid4 + 3); + + pws_buf_r[gid4 + 3].i = pw_buf[0]; +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) C_markov (__global comb_t *pws_buf, __global cs_t *root_css_buf, __global cs_t *markov_css_buf, const u64 off, const u32 pw_len, const u32 mask80, const u32 bits14, const u32 bits15, const u32 gid_max) +{ + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + const u32 gid4 = gid * 4; + + u32 pw_buf[16]; + + generate_pw (pw_buf, root_css_buf, markov_css_buf, pw_len, 0, mask80, bits14, bits15, off + gid4 + 0); + + pws_buf[gid4 + 0].i[ 0] = pw_buf[ 0]; + pws_buf[gid4 + 0].i[ 1] = pw_buf[ 1]; + pws_buf[gid4 + 0].i[ 2] = pw_buf[ 2]; + pws_buf[gid4 + 0].i[ 3] = pw_buf[ 3]; + pws_buf[gid4 + 0].i[ 4] = pw_buf[ 4]; + pws_buf[gid4 + 0].i[ 5] = pw_buf[ 5]; + pws_buf[gid4 + 0].i[ 6] = pw_buf[ 6]; + pws_buf[gid4 + 0].i[ 7] = pw_buf[ 7]; + + pws_buf[gid4 + 0].pw_len = pw_len; + + generate_pw (pw_buf, root_css_buf, markov_css_buf, pw_len, 0, mask80, bits14, bits15, off + gid4 + 1); + + pws_buf[gid4 + 1].i[ 0] = pw_buf[ 0]; + pws_buf[gid4 + 1].i[ 1] = pw_buf[ 1]; + pws_buf[gid4 + 1].i[ 2] = pw_buf[ 2]; + pws_buf[gid4 + 1].i[ 3] = pw_buf[ 3]; + pws_buf[gid4 + 1].i[ 4] = pw_buf[ 4]; + pws_buf[gid4 + 1].i[ 5] = pw_buf[ 5]; + pws_buf[gid4 + 1].i[ 6] = pw_buf[ 6]; + pws_buf[gid4 + 1].i[ 7] = pw_buf[ 7]; + + pws_buf[gid4 + 1].pw_len = pw_len; + + generate_pw (pw_buf, root_css_buf, markov_css_buf, pw_len, 0, mask80, bits14, bits15, off + gid4 + 2); + + pws_buf[gid4 + 2].i[ 0] = pw_buf[ 0]; + pws_buf[gid4 + 2].i[ 1] = pw_buf[ 1]; + pws_buf[gid4 + 2].i[ 2] = pw_buf[ 2]; + pws_buf[gid4 + 2].i[ 3] = pw_buf[ 3]; + pws_buf[gid4 + 2].i[ 4] = pw_buf[ 4]; + pws_buf[gid4 + 2].i[ 5] = pw_buf[ 5]; + pws_buf[gid4 + 2].i[ 6] = pw_buf[ 6]; + pws_buf[gid4 + 2].i[ 7] = pw_buf[ 7]; + + pws_buf[gid4 + 2].pw_len = pw_len; + + generate_pw (pw_buf, root_css_buf, markov_css_buf, pw_len, 0, mask80, bits14, bits15, off + gid4 + 3); + + pws_buf[gid4 + 3].i[ 0] = pw_buf[ 0]; + pws_buf[gid4 + 3].i[ 1] = pw_buf[ 1]; + pws_buf[gid4 + 3].i[ 2] = pw_buf[ 2]; + pws_buf[gid4 + 3].i[ 3] = pw_buf[ 3]; + pws_buf[gid4 + 3].i[ 4] = pw_buf[ 4]; + pws_buf[gid4 + 3].i[ 5] = pw_buf[ 5]; + pws_buf[gid4 + 3].i[ 6] = pw_buf[ 6]; + pws_buf[gid4 + 3].i[ 7] = pw_buf[ 7]; + + pws_buf[gid4 + 3].pw_len = pw_len; +} diff --git a/amd/markov_le_v1.cl b/amd/markov_le_v1.cl new file mode 100644 index 0000000000..1b833b5af0 --- /dev/null +++ b/amd/markov_le_v1.cl @@ -0,0 +1,129 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#include "include/kernel_vendor.h" + +#define CHARSIZ 256 + +#define VECT_SIZE1 + +#include "types_amd.c" + +static void generate_pw (u32 pw_buf[16], __global cs_t *root_css_buf, __global cs_t *markov_css_buf, const u32 pw_l_len, const u32 pw_r_len, const u32 mask80, const u32 bits14, const u32 bits15, u64 val) +{ + pw_buf[ 0] = 0; + pw_buf[ 1] = 0; + pw_buf[ 2] = 0; + pw_buf[ 3] = 0; + pw_buf[ 4] = 0; + pw_buf[ 5] = 0; + pw_buf[ 6] = 0; + pw_buf[ 7] = 0; + pw_buf[ 8] = 0; + pw_buf[ 9] = 0; + pw_buf[10] = 0; + pw_buf[11] = 0; + pw_buf[12] = 0; + pw_buf[13] = 0; + pw_buf[14] = 0; + pw_buf[15] = 0; + + __global cs_t *cs = &root_css_buf[pw_r_len]; + + u32 i; + u32 j; + + for (i = 0, j = pw_r_len; i < pw_l_len; i++, j++) + { + const u32 len = cs->cs_len; + + const u64 next = val / len; + const u64 pos = val % len; + + val = next; + + const u32 key = cs->cs_buf[pos]; + + const u32 jd4 = j / 4; + const u32 jm4 = j % 4; + + pw_buf[jd4] |= key << (jm4 * 8); + + cs = &markov_css_buf[(j * CHARSIZ) + key]; + } + + const u32 jd4 = j / 4; + const u32 jm4 = j % 4; + + pw_buf[jd4] |= (0xff << (jm4 * 8)) & mask80; + + if (bits14) pw_buf[14] = (pw_l_len + pw_r_len) * 8; + if (bits15) pw_buf[15] = (pw_l_len + pw_r_len) * 8; +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) l_markov (__global pw_t *pws_buf_l, __global cs_t *root_css_buf, __global cs_t *markov_css_buf, const u64 off, const u32 pw_l_len, const u32 pw_r_len, const u32 mask80, const u32 bits14, const u32 bits15, const u32 gid_max) +{ + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32 pw_buf[16]; + + generate_pw (pw_buf, root_css_buf, markov_css_buf, pw_l_len, pw_r_len, mask80, bits14, bits15, off + gid); + + pws_buf_l[gid].i[ 0] = pw_buf[ 0]; + pws_buf_l[gid].i[ 1] = pw_buf[ 1]; + pws_buf_l[gid].i[ 2] = pw_buf[ 2]; + pws_buf_l[gid].i[ 3] = pw_buf[ 3]; + pws_buf_l[gid].i[ 4] = pw_buf[ 4]; + pws_buf_l[gid].i[ 5] = pw_buf[ 5]; + pws_buf_l[gid].i[ 6] = pw_buf[ 6]; + pws_buf_l[gid].i[ 7] = pw_buf[ 7]; + pws_buf_l[gid].i[ 8] = pw_buf[ 8]; + pws_buf_l[gid].i[ 9] = pw_buf[ 9]; + pws_buf_l[gid].i[10] = pw_buf[10]; + pws_buf_l[gid].i[11] = pw_buf[11]; + pws_buf_l[gid].i[12] = pw_buf[12]; + pws_buf_l[gid].i[13] = pw_buf[13]; + pws_buf_l[gid].i[14] = pw_buf[14]; + pws_buf_l[gid].i[15] = pw_buf[15]; + + pws_buf_l[gid].pw_len = pw_l_len + pw_r_len; +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) r_markov (__global bf_t *pws_buf_r, __global cs_t *root_css_buf, __global cs_t *markov_css_buf, const u64 off, const u32 pw_r_len, const u32 mask80, const u32 bits14, const u32 bits15, const u32 gid_max) +{ + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32 pw_buf[16]; + + generate_pw (pw_buf, root_css_buf, markov_css_buf, pw_r_len, 0, 0, 0, 0, off + gid); + + pws_buf_r[gid].i = pw_buf[0]; +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) C_markov (__global comb_t *pws_buf, __global cs_t *root_css_buf, __global cs_t *markov_css_buf, const u64 off, const u32 pw_len, const u32 mask80, const u32 bits14, const u32 bits15, const u32 gid_max) +{ + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + u32 pw_buf[16]; + + generate_pw (pw_buf, root_css_buf, markov_css_buf, pw_len, 0, mask80, bits14, bits15, off + gid); + + pws_buf[gid].i[ 0] = pw_buf[ 0]; + pws_buf[gid].i[ 1] = pw_buf[ 1]; + pws_buf[gid].i[ 2] = pw_buf[ 2]; + pws_buf[gid].i[ 3] = pw_buf[ 3]; + pws_buf[gid].i[ 4] = pw_buf[ 4]; + pws_buf[gid].i[ 5] = pw_buf[ 5]; + pws_buf[gid].i[ 6] = pw_buf[ 6]; + pws_buf[gid].i[ 7] = pw_buf[ 7]; + + pws_buf[gid].pw_len = pw_len; +} diff --git a/amd/markov_le_v2.cl b/amd/markov_le_v2.cl new file mode 100644 index 0000000000..b341877d9d --- /dev/null +++ b/amd/markov_le_v2.cl @@ -0,0 +1,144 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#include "include/kernel_vendor.h" + +#define CHARSIZ 256 + +#define VECT_SIZE2 + +#include "types_amd.c" + +static void generate_pw (u32 pw_buf[16], __global cs_t *root_css_buf, __global cs_t *markov_css_buf, const u32 pw_l_len, const u32 pw_r_len, const u32 mask80, const u32 bits14, const u32 bits15, u64 val) +{ + pw_buf[ 0] = 0; + pw_buf[ 1] = 0; + pw_buf[ 2] = 0; + pw_buf[ 3] = 0; + pw_buf[ 4] = 0; + pw_buf[ 5] = 0; + pw_buf[ 6] = 0; + pw_buf[ 7] = 0; + pw_buf[ 8] = 0; + pw_buf[ 9] = 0; + pw_buf[10] = 0; + pw_buf[11] = 0; + pw_buf[12] = 0; + pw_buf[13] = 0; + pw_buf[14] = 0; + pw_buf[15] = 0; + + __global cs_t *cs = &root_css_buf[pw_r_len]; + + u32 i; + u32 j; + + for (i = 0, j = pw_r_len; i < pw_l_len; i++, j++) + { + const u32 len = cs->cs_len; + + const u64 next = val / len; + const u64 pos = val % len; + + val = next; + + const u32 key = cs->cs_buf[pos]; + + const u32 jd4 = j / 4; + const u32 jm4 = j % 4; + + pw_buf[jd4] |= key << (jm4 * 8); + + cs = &markov_css_buf[(j * CHARSIZ) + key]; + } + + const u32 jd4 = j / 4; + const u32 jm4 = j % 4; + + pw_buf[jd4] |= (0xff << (jm4 * 8)) & mask80; + + if (bits14) pw_buf[14] = (pw_l_len + pw_r_len) * 8; + if (bits15) pw_buf[15] = (pw_l_len + pw_r_len) * 8; +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) l_markov (__global pw_t *pws_buf_l, __global cs_t *root_css_buf, __global cs_t *markov_css_buf, const u64 off, const u32 pw_l_len, const u32 pw_r_len, const u32 mask80, const u32 bits14, const u32 bits15, const u32 gid_max) +{ + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + const u32 gid2 = gid * 2; + + u32 pw_buf0[16]; + u32 pw_buf1[16]; + + generate_pw (pw_buf0, root_css_buf, markov_css_buf, pw_l_len, pw_r_len, mask80, bits14, bits15, off + gid2 + 0); + generate_pw (pw_buf1, root_css_buf, markov_css_buf, pw_l_len, pw_r_len, mask80, bits14, bits15, off + gid2 + 1); + + #pragma unroll 16 + for (int i = 0; i < 16; i++) + { + pws_buf_l[gid].i[i].s0 = pw_buf0[i]; + pws_buf_l[gid].i[i].s1 = pw_buf1[i]; + } + + pws_buf_l[gid].pw_len = pw_l_len + pw_r_len; +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) r_markov (__global bf_t *pws_buf_r, __global cs_t *root_css_buf, __global cs_t *markov_css_buf, const u64 off, const u32 pw_r_len, const u32 mask80, const u32 bits14, const u32 bits15, const u32 gid_max) +{ + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + const u32 gid2 = gid * 2; + + u32 pw_buf[16]; + + generate_pw (pw_buf, root_css_buf, markov_css_buf, pw_r_len, 0, 0, 0, 0, off + gid2 + 0); + + pws_buf_r[gid2 + 0].i = pw_buf[0]; + + generate_pw (pw_buf, root_css_buf, markov_css_buf, pw_r_len, 0, 0, 0, 0, off + gid2 + 1); + + pws_buf_r[gid2 + 1].i = pw_buf[0]; +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) C_markov (__global comb_t *pws_buf, __global cs_t *root_css_buf, __global cs_t *markov_css_buf, const u64 off, const u32 pw_len, const u32 mask80, const u32 bits14, const u32 bits15, const u32 gid_max) +{ + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + const u32 gid2 = gid * 2; + + u32 pw_buf[16]; + + generate_pw (pw_buf, root_css_buf, markov_css_buf, pw_len, 0, mask80, bits14, bits15, off + gid2 + 0); + + pws_buf[gid2 + 0].i[ 0] = pw_buf[ 0]; + pws_buf[gid2 + 0].i[ 1] = pw_buf[ 1]; + pws_buf[gid2 + 0].i[ 2] = pw_buf[ 2]; + pws_buf[gid2 + 0].i[ 3] = pw_buf[ 3]; + pws_buf[gid2 + 0].i[ 4] = pw_buf[ 4]; + pws_buf[gid2 + 0].i[ 5] = pw_buf[ 5]; + pws_buf[gid2 + 0].i[ 6] = pw_buf[ 6]; + pws_buf[gid2 + 0].i[ 7] = pw_buf[ 7]; + + pws_buf[gid2 + 0].pw_len = pw_len; + + generate_pw (pw_buf, root_css_buf, markov_css_buf, pw_len, 0, mask80, bits14, bits15, off + gid2 + 1); + + pws_buf[gid2 + 1].i[ 0] = pw_buf[ 0]; + pws_buf[gid2 + 1].i[ 1] = pw_buf[ 1]; + pws_buf[gid2 + 1].i[ 2] = pw_buf[ 2]; + pws_buf[gid2 + 1].i[ 3] = pw_buf[ 3]; + pws_buf[gid2 + 1].i[ 4] = pw_buf[ 4]; + pws_buf[gid2 + 1].i[ 5] = pw_buf[ 5]; + pws_buf[gid2 + 1].i[ 6] = pw_buf[ 6]; + pws_buf[gid2 + 1].i[ 7] = pw_buf[ 7]; + + pws_buf[gid2 + 1].pw_len = pw_len; +} diff --git a/amd/markov_le_v4.cl b/amd/markov_le_v4.cl new file mode 100644 index 0000000000..e7b9b06c52 --- /dev/null +++ b/amd/markov_le_v4.cl @@ -0,0 +1,184 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#include "include/kernel_vendor.h" + +#define CHARSIZ 256 + +#define VECT_SIZE4 + +#include "types_amd.c" + +static void generate_pw (u32 pw_buf[16], __global cs_t *root_css_buf, __global cs_t *markov_css_buf, const u32 pw_l_len, const u32 pw_r_len, const u32 mask80, const u32 bits14, const u32 bits15, u64 val) +{ + pw_buf[ 0] = 0; + pw_buf[ 1] = 0; + pw_buf[ 2] = 0; + pw_buf[ 3] = 0; + pw_buf[ 4] = 0; + pw_buf[ 5] = 0; + pw_buf[ 6] = 0; + pw_buf[ 7] = 0; + pw_buf[ 8] = 0; + pw_buf[ 9] = 0; + pw_buf[10] = 0; + pw_buf[11] = 0; + pw_buf[12] = 0; + pw_buf[13] = 0; + pw_buf[14] = 0; + pw_buf[15] = 0; + + __global cs_t *cs = &root_css_buf[pw_r_len]; + + u32 i; + u32 j; + + for (i = 0, j = pw_r_len; i < pw_l_len; i++, j++) + { + const u32 len = cs->cs_len; + + const u64 next = val / len; + const u64 pos = val % len; + + val = next; + + const u32 key = cs->cs_buf[pos]; + + const u32 jd4 = j / 4; + const u32 jm4 = j % 4; + + pw_buf[jd4] |= key << (jm4 * 8); + + cs = &markov_css_buf[(j * CHARSIZ) + key]; + } + + const u32 jd4 = j / 4; + const u32 jm4 = j % 4; + + pw_buf[jd4] |= (0xff << (jm4 * 8)) & mask80; + + if (bits14) pw_buf[14] = (pw_l_len + pw_r_len) * 8; + if (bits15) pw_buf[15] = (pw_l_len + pw_r_len) * 8; +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) l_markov (__global pw_t *pws_buf_l, __global cs_t *root_css_buf, __global cs_t *markov_css_buf, const u64 off, const u32 pw_l_len, const u32 pw_r_len, const u32 mask80, const u32 bits14, const u32 bits15, const u32 gid_max) +{ + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + const u32 gid4 = gid * 4; + + u32 pw_buf0[16]; + u32 pw_buf1[16]; + u32 pw_buf2[16]; + u32 pw_buf3[16]; + + generate_pw (pw_buf0, root_css_buf, markov_css_buf, pw_l_len, pw_r_len, mask80, bits14, bits15, off + gid4 + 0); + generate_pw (pw_buf1, root_css_buf, markov_css_buf, pw_l_len, pw_r_len, mask80, bits14, bits15, off + gid4 + 1); + generate_pw (pw_buf2, root_css_buf, markov_css_buf, pw_l_len, pw_r_len, mask80, bits14, bits15, off + gid4 + 2); + generate_pw (pw_buf3, root_css_buf, markov_css_buf, pw_l_len, pw_r_len, mask80, bits14, bits15, off + gid4 + 3); + + #pragma unroll 16 + for (int i = 0; i < 16; i++) + { + pws_buf_l[gid].i[i].s0 = pw_buf0[i]; + pws_buf_l[gid].i[i].s1 = pw_buf1[i]; + pws_buf_l[gid].i[i].s2 = pw_buf2[i]; + pws_buf_l[gid].i[i].s3 = pw_buf3[i]; + } + + pws_buf_l[gid].pw_len = pw_l_len + pw_r_len; +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) r_markov (__global bf_t *pws_buf_r, __global cs_t *root_css_buf, __global cs_t *markov_css_buf, const u64 off, const u32 pw_r_len, const u32 mask80, const u32 bits14, const u32 bits15, const u32 gid_max) +{ + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + const u32 gid4 = gid * 4; + + u32 pw_buf[16]; + + generate_pw (pw_buf, root_css_buf, markov_css_buf, pw_r_len, 0, 0, 0, 0, off + gid4 + 0); + + pws_buf_r[gid4 + 0].i = pw_buf[0]; + + generate_pw (pw_buf, root_css_buf, markov_css_buf, pw_r_len, 0, 0, 0, 0, off + gid4 + 1); + + pws_buf_r[gid4 + 1].i = pw_buf[0]; + + generate_pw (pw_buf, root_css_buf, markov_css_buf, pw_r_len, 0, 0, 0, 0, off + gid4 + 2); + + pws_buf_r[gid4 + 2].i = pw_buf[0]; + + generate_pw (pw_buf, root_css_buf, markov_css_buf, pw_r_len, 0, 0, 0, 0, off + gid4 + 3); + + pws_buf_r[gid4 + 3].i = pw_buf[0]; +} + +__kernel void __attribute__((reqd_work_group_size (64, 1, 1))) C_markov (__global comb_t *pws_buf, __global cs_t *root_css_buf, __global cs_t *markov_css_buf, const u64 off, const u32 pw_len, const u32 mask80, const u32 bits14, const u32 bits15, const u32 gid_max) +{ + const u32 gid = get_global_id (0); + + if (gid >= gid_max) return; + + const u32 gid4 = gid * 4; + + u32 pw_buf[16]; + + generate_pw (pw_buf, root_css_buf, markov_css_buf, pw_len, 0, mask80, bits14, bits15, off + gid4 + 0); + + pws_buf[gid4 + 0].i[ 0] = pw_buf[ 0]; + pws_buf[gid4 + 0].i[ 1] = pw_buf[ 1]; + pws_buf[gid4 + 0].i[ 2] = pw_buf[ 2]; + pws_buf[gid4 + 0].i[ 3] = pw_buf[ 3]; + pws_buf[gid4 + 0].i[ 4] = pw_buf[ 4]; + pws_buf[gid4 + 0].i[ 5] = pw_buf[ 5]; + pws_buf[gid4 + 0].i[ 6] = pw_buf[ 6]; + pws_buf[gid4 + 0].i[ 7] = pw_buf[ 7]; + + pws_buf[gid4 + 0].pw_len = pw_len; + + generate_pw (pw_buf, root_css_buf, markov_css_buf, pw_len, 0, mask80, bits14, bits15, off + gid4 + 1); + + pws_buf[gid4 + 1].i[ 0] = pw_buf[ 0]; + pws_buf[gid4 + 1].i[ 1] = pw_buf[ 1]; + pws_buf[gid4 + 1].i[ 2] = pw_buf[ 2]; + pws_buf[gid4 + 1].i[ 3] = pw_buf[ 3]; + pws_buf[gid4 + 1].i[ 4] = pw_buf[ 4]; + pws_buf[gid4 + 1].i[ 5] = pw_buf[ 5]; + pws_buf[gid4 + 1].i[ 6] = pw_buf[ 6]; + pws_buf[gid4 + 1].i[ 7] = pw_buf[ 7]; + + pws_buf[gid4 + 1].pw_len = pw_len; + + generate_pw (pw_buf, root_css_buf, markov_css_buf, pw_len, 0, mask80, bits14, bits15, off + gid4 + 2); + + pws_buf[gid4 + 2].i[ 0] = pw_buf[ 0]; + pws_buf[gid4 + 2].i[ 1] = pw_buf[ 1]; + pws_buf[gid4 + 2].i[ 2] = pw_buf[ 2]; + pws_buf[gid4 + 2].i[ 3] = pw_buf[ 3]; + pws_buf[gid4 + 2].i[ 4] = pw_buf[ 4]; + pws_buf[gid4 + 2].i[ 5] = pw_buf[ 5]; + pws_buf[gid4 + 2].i[ 6] = pw_buf[ 6]; + pws_buf[gid4 + 2].i[ 7] = pw_buf[ 7]; + + pws_buf[gid4 + 2].pw_len = pw_len; + + generate_pw (pw_buf, root_css_buf, markov_css_buf, pw_len, 0, mask80, bits14, bits15, off + gid4 + 3); + + pws_buf[gid4 + 3].i[ 0] = pw_buf[ 0]; + pws_buf[gid4 + 3].i[ 1] = pw_buf[ 1]; + pws_buf[gid4 + 3].i[ 2] = pw_buf[ 2]; + pws_buf[gid4 + 3].i[ 3] = pw_buf[ 3]; + pws_buf[gid4 + 3].i[ 4] = pw_buf[ 4]; + pws_buf[gid4 + 3].i[ 5] = pw_buf[ 5]; + pws_buf[gid4 + 3].i[ 6] = pw_buf[ 6]; + pws_buf[gid4 + 3].i[ 7] = pw_buf[ 7]; + + pws_buf[gid4 + 3].pw_len = pw_len; +} diff --git a/amd/rp_amd.c b/amd/rp_amd.c new file mode 100644 index 0000000000..5b41e87681 --- /dev/null +++ b/amd/rp_amd.c @@ -0,0 +1,2838 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +static u32x generate_cmask (u32x buf) +{ + const u32x rmask = ((buf & 0x40404040) >> 1) + & ~((buf & 0x80808080) >> 2); + + const u32x hmask = (buf & 0x1f1f1f1f) + 0x05050505; + const u32x lmask = (buf & 0x1f1f1f1f) + 0x1f1f1f1f; + + return rmask & ~hmask & lmask; +} + +static void truncate_right (u32x w0[4], u32x w1[4], const u32 len) +{ + const u32 tmp = (1 << ((len % 4) * 8)) - 1; + + switch (len / 4) + { + case 0: w0[0] &= tmp; + w0[1] = 0; + w0[2] = 0; + w0[3] = 0; + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + break; + case 1: w0[1] &= tmp; + w0[2] = 0; + w0[3] = 0; + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + break; + case 2: w0[2] &= tmp; + w0[3] = 0; + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + break; + case 3: w0[3] &= tmp; + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + break; + case 4: w1[0] &= tmp; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + break; + case 5: w1[1] &= tmp; + w1[2] = 0; + w1[3] = 0; + break; + case 6: w1[2] &= tmp; + w1[3] = 0; + break; + case 7: w1[3] &= tmp; + break; + } +} + +static void truncate_left (u32x w0[4], u32x w1[4], const u32 len) +{ + const u32 tmp = ~((1 << ((len % 4) * 8)) - 1); + + switch (len / 4) + { + case 0: w0[0] &= tmp; + break; + case 1: w0[0] = 0; + w0[1] &= tmp; + break; + case 2: w0[0] = 0; + w0[1] = 0; + w0[2] &= tmp; + break; + case 3: w0[0] = 0; + w0[1] = 0; + w0[2] = 0; + w0[3] &= tmp; + break; + case 4: w0[0] = 0; + w0[1] = 0; + w0[2] = 0; + w0[3] = 0; + w1[0] &= tmp; + break; + case 5: w0[0] = 0; + w0[1] = 0; + w0[2] = 0; + w0[3] = 0; + w1[0] = 0; + w1[1] &= tmp; + break; + case 6: w0[0] = 0; + w0[1] = 0; + w0[2] = 0; + w0[3] = 0; + w1[0] = 0; + w1[1] = 0; + w1[2] &= tmp; + break; + case 7: w0[0] = 0; + w0[1] = 0; + w0[2] = 0; + w0[3] = 0; + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] &= tmp; + break; + } +} + +static void lshift_block (const u32x in0[4], const u32x in1[4], u32x out0[4], u32x out1[4]) +{ + /* cuda + out0[0] = in0[0] >> 8 | in0[1] << 24; + out0[1] = in0[1] >> 8 | in0[2] << 24; + out0[2] = in0[2] >> 8 | in0[3] << 24; + out0[3] = in0[3] >> 8 | in1[0] << 24; + out1[0] = in1[0] >> 8 | in1[1] << 24; + out1[1] = in1[1] >> 8 | in1[2] << 24; + out1[2] = in1[2] >> 8 | in1[3] << 24; + out1[3] = in1[3] >> 8; + */ + + out0[0] = amd_bytealign (in0[1], in0[0], 1); + out0[1] = amd_bytealign (in0[2], in0[1], 1); + out0[2] = amd_bytealign (in0[3], in0[2], 1); + out0[3] = amd_bytealign (in1[0], in0[3], 1); + out1[0] = amd_bytealign (in1[1], in1[0], 1); + out1[1] = amd_bytealign (in1[2], in1[1], 1); + out1[2] = amd_bytealign (in1[3], in1[2], 1); + out1[3] = amd_bytealign ( 0, in1[3], 1); +} + +static void rshift_block (const u32x in0[4], const u32x in1[4], u32x out0[4], u32x out1[4]) +{ + /* cuda + out1[3] = in1[3] << 8 | in1[2] >> 24; + out1[2] = in1[2] << 8 | in1[1] >> 24; + out1[1] = in1[1] << 8 | in1[0] >> 24; + out1[0] = in1[0] << 8 | in0[3] >> 24; + out0[3] = in0[3] << 8 | in0[2] >> 24; + out0[2] = in0[2] << 8 | in0[1] >> 24; + out0[1] = in0[1] << 8 | in0[0] >> 24; + out0[0] = in0[0] << 8; + */ + + out1[3] = amd_bytealign (in1[3], in1[2], 3); + out1[2] = amd_bytealign (in1[2], in1[1], 3); + out1[1] = amd_bytealign (in1[1], in1[0], 3); + out1[0] = amd_bytealign (in1[0], in0[3], 3); + out0[3] = amd_bytealign (in0[3], in0[2], 3); + out0[2] = amd_bytealign (in0[2], in0[1], 3); + out0[1] = amd_bytealign (in0[1], in0[0], 3); + out0[0] = amd_bytealign (in0[0], 0, 3); +} + +static void lshift_block_N (const u32x in0[4], const u32x in1[4], u32x out0[4], u32x out1[4], const u32 num) +{ + switch (num) + { + case 0: out0[0] = in0[0]; + out0[1] = in0[1]; + out0[2] = in0[2]; + out0[3] = in0[3]; + out1[0] = in1[0]; + out1[1] = in1[1]; + out1[2] = in1[2]; + out1[3] = in1[3]; + break; + case 1: out0[0] = amd_bytealign (in0[1], in0[0], 1); + out0[1] = amd_bytealign (in0[2], in0[1], 1); + out0[2] = amd_bytealign (in0[3], in0[2], 1); + out0[3] = amd_bytealign (in1[0], in0[3], 1); + out1[0] = amd_bytealign (in1[1], in1[0], 1); + out1[1] = amd_bytealign (in1[2], in1[1], 1); + out1[2] = amd_bytealign (in1[3], in1[2], 1); + out1[3] = amd_bytealign ( 0, in1[3], 1); + break; + case 2: out0[0] = amd_bytealign (in0[1], in0[0], 2); + out0[1] = amd_bytealign (in0[2], in0[1], 2); + out0[2] = amd_bytealign (in0[3], in0[2], 2); + out0[3] = amd_bytealign (in1[0], in0[3], 2); + out1[0] = amd_bytealign (in1[1], in1[0], 2); + out1[1] = amd_bytealign (in1[2], in1[1], 2); + out1[2] = amd_bytealign (in1[3], in1[2], 2); + out1[3] = amd_bytealign ( 0, in1[3], 2); + break; + case 3: out0[0] = amd_bytealign (in0[1], in0[0], 3); + out0[1] = amd_bytealign (in0[2], in0[1], 3); + out0[2] = amd_bytealign (in0[3], in0[2], 3); + out0[3] = amd_bytealign (in1[0], in0[3], 3); + out1[0] = amd_bytealign (in1[1], in1[0], 3); + out1[1] = amd_bytealign (in1[2], in1[1], 3); + out1[2] = amd_bytealign (in1[3], in1[2], 3); + out1[3] = amd_bytealign ( 0, in1[3], 3); + break; + case 4: out0[0] = in0[1]; + out0[1] = in0[2]; + out0[2] = in0[3]; + out0[3] = in1[0]; + out1[0] = in1[1]; + out1[1] = in1[2]; + out1[2] = in1[3]; + out1[3] = 0; + break; + case 5: out0[0] = amd_bytealign (in0[2], in0[1], 1); + out0[1] = amd_bytealign (in0[3], in0[2], 1); + out0[2] = amd_bytealign (in1[0], in0[3], 1); + out0[3] = amd_bytealign (in1[1], in1[0], 1); + out1[0] = amd_bytealign (in1[2], in1[1], 1); + out1[1] = amd_bytealign (in1[3], in1[2], 1); + out1[2] = amd_bytealign ( 0, in1[3], 1); + out1[3] = 0; + break; + case 6: out0[0] = amd_bytealign (in0[2], in0[1], 2); + out0[1] = amd_bytealign (in0[3], in0[2], 2); + out0[2] = amd_bytealign (in1[0], in0[3], 2); + out0[3] = amd_bytealign (in1[1], in1[0], 2); + out1[0] = amd_bytealign (in1[2], in1[1], 2); + out1[1] = amd_bytealign (in1[3], in1[2], 2); + out1[2] = amd_bytealign ( 0, in1[3], 2); + out1[3] = 0; + break; + case 7: out0[0] = amd_bytealign (in0[2], in0[1], 3); + out0[1] = amd_bytealign (in0[3], in0[2], 3); + out0[2] = amd_bytealign (in1[0], in0[3], 3); + out0[3] = amd_bytealign (in1[1], in1[0], 3); + out1[0] = amd_bytealign (in1[2], in1[1], 3); + out1[1] = amd_bytealign (in1[3], in1[2], 3); + out1[2] = amd_bytealign ( 0, in1[3], 3); + out1[3] = 0; + break; + case 8: out0[0] = in0[2]; + out0[1] = in0[3]; + out0[2] = in1[0]; + out0[3] = in1[1]; + out1[0] = in1[2]; + out1[1] = in1[3]; + out1[2] = 0; + out1[3] = 0; + break; + case 9: out0[0] = amd_bytealign (in0[3], in0[2], 1); + out0[1] = amd_bytealign (in1[0], in0[3], 1); + out0[2] = amd_bytealign (in1[1], in1[0], 1); + out0[3] = amd_bytealign (in1[2], in1[1], 1); + out1[0] = amd_bytealign (in1[3], in1[2], 1); + out1[1] = amd_bytealign ( 0, in1[3], 1); + out1[2] = 0; + out1[3] = 0; + break; + case 10: out0[0] = amd_bytealign (in0[3], in0[2], 2); + out0[1] = amd_bytealign (in1[0], in0[3], 2); + out0[2] = amd_bytealign (in1[1], in1[0], 2); + out0[3] = amd_bytealign (in1[2], in1[1], 2); + out1[0] = amd_bytealign (in1[3], in1[2], 2); + out1[1] = amd_bytealign ( 0, in1[3], 2); + out1[2] = 0; + out1[3] = 0; + break; + case 11: out0[0] = amd_bytealign (in0[3], in0[2], 3); + out0[1] = amd_bytealign (in1[0], in0[3], 3); + out0[2] = amd_bytealign (in1[1], in1[0], 3); + out0[3] = amd_bytealign (in1[2], in1[1], 3); + out1[0] = amd_bytealign (in1[3], in1[2], 3); + out1[1] = amd_bytealign ( 0, in1[3], 3); + out1[2] = 0; + out1[3] = 0; + break; + case 12: out0[0] = in0[3]; + out0[1] = in1[0]; + out0[2] = in1[1]; + out0[3] = in1[2]; + out1[0] = in1[3]; + out1[1] = 0; + out1[2] = 0; + out1[3] = 0; + break; + case 13: out0[0] = amd_bytealign (in1[0], in0[3], 1); + out0[1] = amd_bytealign (in1[1], in1[0], 1); + out0[2] = amd_bytealign (in1[2], in1[1], 1); + out0[3] = amd_bytealign (in1[3], in1[2], 1); + out1[0] = amd_bytealign ( 0, in1[3], 1); + out1[1] = 0; + out1[2] = 0; + out1[3] = 0; + break; + case 14: out0[0] = amd_bytealign (in1[0], in0[3], 2); + out0[1] = amd_bytealign (in1[1], in1[0], 2); + out0[2] = amd_bytealign (in1[2], in1[1], 2); + out0[3] = amd_bytealign (in1[3], in1[2], 2); + out1[0] = amd_bytealign ( 0, in1[3], 2); + out1[1] = 0; + out1[2] = 0; + out1[3] = 0; + break; + case 15: out0[0] = amd_bytealign (in1[0], in0[3], 3); + out0[1] = amd_bytealign (in1[1], in1[0], 3); + out0[2] = amd_bytealign (in1[2], in1[1], 3); + out0[3] = amd_bytealign (in1[3], in1[2], 3); + out1[0] = amd_bytealign ( 0, in1[3], 3); + out1[1] = 0; + out1[2] = 0; + out1[3] = 0; + break; + case 16: out0[0] = in1[0]; + out0[1] = in1[1]; + out0[2] = in1[2]; + out0[3] = in1[3]; + out1[0] = 0; + out1[1] = 0; + out1[2] = 0; + out1[3] = 0; + break; + case 17: out0[0] = amd_bytealign (in1[1], in1[0], 1); + out0[1] = amd_bytealign (in1[2], in1[1], 1); + out0[2] = amd_bytealign (in1[3], in1[2], 1); + out0[3] = amd_bytealign ( 0, in1[3], 1); + out1[0] = 0; + out1[1] = 0; + out1[2] = 0; + out1[3] = 0; + break; + case 18: out0[0] = amd_bytealign (in1[1], in1[0], 2); + out0[1] = amd_bytealign (in1[2], in1[1], 2); + out0[2] = amd_bytealign (in1[3], in1[2], 2); + out0[3] = amd_bytealign ( 0, in1[3], 2); + out1[0] = 0; + out1[1] = 0; + out1[2] = 0; + out1[3] = 0; + break; + case 19: out0[0] = amd_bytealign (in1[1], in1[0], 3); + out0[1] = amd_bytealign (in1[2], in1[1], 3); + out0[2] = amd_bytealign (in1[3], in1[2], 3); + out0[3] = amd_bytealign ( 0, in1[3], 3); + out1[0] = 0; + out1[1] = 0; + out1[2] = 0; + out1[3] = 0; + break; + case 20: out0[0] = in1[1]; + out0[1] = in1[2]; + out0[2] = in1[3]; + out0[3] = 0; + out1[0] = 0; + out1[1] = 0; + out1[2] = 0; + out1[3] = 0; + break; + case 21: out0[0] = amd_bytealign (in1[2], in1[1], 1); + out0[1] = amd_bytealign (in1[3], in1[2], 1); + out0[2] = amd_bytealign ( 0, in1[3], 1); + out0[3] = 0; + out1[0] = 0; + out1[1] = 0; + out1[2] = 0; + out1[3] = 0; + break; + case 22: out0[0] = amd_bytealign (in1[2], in1[1], 2); + out0[1] = amd_bytealign (in1[3], in1[2], 2); + out0[2] = amd_bytealign ( 0, in1[3], 2); + out0[3] = 0; + out1[0] = 0; + out1[1] = 0; + out1[2] = 0; + out1[3] = 0; + break; + case 23: out0[0] = amd_bytealign (in1[2], in1[1], 3); + out0[1] = amd_bytealign (in1[3], in1[2], 3); + out0[2] = amd_bytealign ( 0, in1[3], 3); + out0[3] = 0; + out1[0] = 0; + out1[1] = 0; + out1[2] = 0; + out1[3] = 0; + break; + case 24: out0[0] = in1[2]; + out0[1] = in1[3]; + out0[2] = 0; + out0[3] = 0; + out1[0] = 0; + out1[1] = 0; + out1[2] = 0; + out1[3] = 0; + break; + case 25: out0[0] = amd_bytealign (in1[3], in1[2], 1); + out0[1] = amd_bytealign ( 0, in1[3], 1); + out0[2] = 0; + out0[3] = 0; + out1[0] = 0; + out1[1] = 0; + out1[2] = 0; + out1[3] = 0; + break; + case 26: out0[0] = amd_bytealign (in1[3], in1[2], 2); + out0[1] = amd_bytealign ( 0, in1[3], 2); + out0[2] = 0; + out0[3] = 0; + out1[0] = 0; + out1[1] = 0; + out1[2] = 0; + out1[3] = 0; + break; + case 27: out0[0] = amd_bytealign (in1[3], in1[2], 3); + out0[1] = amd_bytealign ( 0, in1[3], 3); + out0[2] = 0; + out0[3] = 0; + out1[0] = 0; + out1[1] = 0; + out1[2] = 0; + out1[3] = 0; + break; + case 28: out0[0] = in1[3]; + out0[1] = 0; + out0[2] = 0; + out0[3] = 0; + out1[0] = 0; + out1[1] = 0; + out1[2] = 0; + out1[3] = 0; + break; + case 29: out0[0] = amd_bytealign ( 0, in1[3], 1); + out0[1] = 0; + out0[2] = 0; + out0[3] = 0; + out1[0] = 0; + out1[1] = 0; + out1[2] = 0; + out1[3] = 0; + break; + case 30: out0[0] = amd_bytealign ( 0, in1[3], 2); + out0[1] = 0; + out0[2] = 0; + out0[3] = 0; + out1[0] = 0; + out1[1] = 0; + out1[2] = 0; + out1[3] = 0; + break; + case 31: out0[0] = amd_bytealign ( 0, in1[3], 3); + out0[1] = 0; + out0[2] = 0; + out0[3] = 0; + out1[0] = 0; + out1[1] = 0; + out1[2] = 0; + out1[3] = 0; + break; + } +} + +static void rshift_block_N (const u32x in0[4], const u32x in1[4], u32x out0[4], u32x out1[4], const u32 num) +{ + switch (num) + { + case 0: out1[3] = in1[3]; + out1[2] = in1[2]; + out1[1] = in1[1]; + out1[0] = in1[0]; + out0[3] = in0[3]; + out0[2] = in0[2]; + out0[1] = in0[1]; + out0[0] = in0[0]; + break; + case 1: out1[3] = amd_bytealign (in1[3], in1[2], 3); + out1[2] = amd_bytealign (in1[2], in1[1], 3); + out1[1] = amd_bytealign (in1[1], in1[0], 3); + out1[0] = amd_bytealign (in1[0], in0[3], 3); + out0[3] = amd_bytealign (in0[3], in0[2], 3); + out0[2] = amd_bytealign (in0[2], in0[1], 3); + out0[1] = amd_bytealign (in0[1], in0[0], 3); + out0[0] = amd_bytealign (in0[0], 0, 3); + break; + case 2: out1[3] = amd_bytealign (in1[3], in1[2], 2); + out1[2] = amd_bytealign (in1[2], in1[1], 2); + out1[1] = amd_bytealign (in1[1], in1[0], 2); + out1[0] = amd_bytealign (in1[0], in0[3], 2); + out0[3] = amd_bytealign (in0[3], in0[2], 2); + out0[2] = amd_bytealign (in0[2], in0[1], 2); + out0[1] = amd_bytealign (in0[1], in0[0], 2); + out0[0] = amd_bytealign (in0[0], 0, 2); + break; + case 3: out1[3] = amd_bytealign (in1[3], in1[2], 1); + out1[2] = amd_bytealign (in1[2], in1[1], 1); + out1[1] = amd_bytealign (in1[1], in1[0], 1); + out1[0] = amd_bytealign (in1[0], in0[3], 1); + out0[3] = amd_bytealign (in0[3], in0[2], 1); + out0[2] = amd_bytealign (in0[2], in0[1], 1); + out0[1] = amd_bytealign (in0[1], in0[0], 1); + out0[0] = amd_bytealign (in0[0], 0, 1); + break; + case 4: out1[3] = in1[2]; + out1[2] = in1[1]; + out1[1] = in1[0]; + out1[0] = in0[3]; + out0[3] = in0[2]; + out0[2] = in0[1]; + out0[1] = in0[0]; + out0[0] = 0; + break; + case 5: out1[3] = amd_bytealign (in1[2], in1[1], 3); + out1[2] = amd_bytealign (in1[1], in1[0], 3); + out1[1] = amd_bytealign (in1[0], in0[3], 3); + out1[0] = amd_bytealign (in0[3], in0[2], 3); + out0[3] = amd_bytealign (in0[2], in0[1], 3); + out0[2] = amd_bytealign (in0[1], in0[0], 3); + out0[1] = amd_bytealign (in0[0], 0, 3); + out0[0] = 0; + break; + case 6: out1[3] = amd_bytealign (in1[2], in1[1], 2); + out1[2] = amd_bytealign (in1[1], in1[0], 2); + out1[1] = amd_bytealign (in1[0], in0[3], 2); + out1[0] = amd_bytealign (in0[3], in0[2], 2); + out0[3] = amd_bytealign (in0[2], in0[1], 2); + out0[2] = amd_bytealign (in0[1], in0[0], 2); + out0[1] = amd_bytealign (in0[0], 0, 2); + out0[0] = 0; + break; + case 7: out1[3] = amd_bytealign (in1[2], in1[1], 1); + out1[2] = amd_bytealign (in1[1], in1[0], 1); + out1[1] = amd_bytealign (in1[0], in0[3], 1); + out1[0] = amd_bytealign (in0[3], in0[2], 1); + out0[3] = amd_bytealign (in0[2], in0[1], 1); + out0[2] = amd_bytealign (in0[1], in0[0], 1); + out0[1] = amd_bytealign (in0[0], 0, 1); + out0[0] = 0; + break; + case 8: out1[3] = in1[1]; + out1[2] = in1[0]; + out1[1] = in0[3]; + out1[0] = in0[2]; + out0[3] = in0[1]; + out0[2] = in0[0]; + out0[1] = 0; + out0[0] = 0; + break; + case 9: out1[3] = amd_bytealign (in1[1], in1[0], 3); + out1[2] = amd_bytealign (in1[0], in0[3], 3); + out1[1] = amd_bytealign (in0[3], in0[2], 3); + out1[0] = amd_bytealign (in0[2], in0[1], 3); + out0[3] = amd_bytealign (in0[1], in0[0], 3); + out0[2] = amd_bytealign (in0[0], 0, 3); + out0[1] = 0; + out0[0] = 0; + break; + case 10: out1[3] = amd_bytealign (in1[1], in1[0], 2); + out1[2] = amd_bytealign (in1[0], in0[3], 2); + out1[1] = amd_bytealign (in0[3], in0[2], 2); + out1[0] = amd_bytealign (in0[2], in0[1], 2); + out0[3] = amd_bytealign (in0[1], in0[0], 2); + out0[2] = amd_bytealign (in0[0], 0, 2); + out0[1] = 0; + out0[0] = 0; + break; + case 11: out1[3] = amd_bytealign (in1[1], in1[0], 1); + out1[2] = amd_bytealign (in1[0], in0[3], 1); + out1[1] = amd_bytealign (in0[3], in0[2], 1); + out1[0] = amd_bytealign (in0[2], in0[1], 1); + out0[3] = amd_bytealign (in0[1], in0[0], 1); + out0[2] = amd_bytealign (in0[0], 0, 1); + out0[1] = 0; + out0[0] = 0; + break; + case 12: out1[3] = in1[0]; + out1[2] = in0[3]; + out1[1] = in0[2]; + out1[0] = in0[1]; + out0[3] = in0[0]; + out0[2] = 0; + out0[1] = 0; + out0[0] = 0; + break; + case 13: out1[3] = amd_bytealign (in1[0], in0[3], 3); + out1[2] = amd_bytealign (in0[3], in0[2], 3); + out1[1] = amd_bytealign (in0[2], in0[1], 3); + out1[0] = amd_bytealign (in0[1], in0[0], 3); + out0[3] = amd_bytealign (in0[0], 0, 3); + out0[2] = 0; + out0[1] = 0; + out0[0] = 0; + break; + case 14: out1[3] = amd_bytealign (in1[0], in0[3], 2); + out1[2] = amd_bytealign (in0[3], in0[2], 2); + out1[1] = amd_bytealign (in0[2], in0[1], 2); + out1[0] = amd_bytealign (in0[1], in0[0], 2); + out0[3] = amd_bytealign (in0[0], 0, 2); + out0[2] = 0; + out0[1] = 0; + out0[0] = 0; + break; + case 15: out1[3] = amd_bytealign (in1[0], in0[3], 1); + out1[2] = amd_bytealign (in0[3], in0[2], 1); + out1[1] = amd_bytealign (in0[2], in0[1], 1); + out1[0] = amd_bytealign (in0[1], in0[0], 1); + out0[3] = amd_bytealign (in0[0], 0, 1); + out0[2] = 0; + out0[1] = 0; + out0[0] = 0; + break; + case 16: out1[3] = in0[3]; + out1[2] = in0[2]; + out1[1] = in0[1]; + out1[0] = in0[0]; + out0[3] = 0; + out0[2] = 0; + out0[1] = 0; + out0[0] = 0; + break; + case 17: out1[3] = amd_bytealign (in0[3], in0[2], 3); + out1[2] = amd_bytealign (in0[2], in0[1], 3); + out1[1] = amd_bytealign (in0[1], in0[0], 3); + out1[0] = amd_bytealign (in0[0], 0, 3); + out0[3] = 0; + out0[2] = 0; + out0[1] = 0; + out0[0] = 0; + break; + case 18: out1[3] = amd_bytealign (in0[3], in0[2], 2); + out1[2] = amd_bytealign (in0[2], in0[1], 2); + out1[1] = amd_bytealign (in0[1], in0[0], 2); + out1[0] = amd_bytealign (in0[0], 0, 2); + out0[3] = 0; + out0[2] = 0; + out0[1] = 0; + out0[0] = 0; + break; + case 19: out1[3] = amd_bytealign (in0[3], in0[2], 1); + out1[2] = amd_bytealign (in0[2], in0[1], 1); + out1[1] = amd_bytealign (in0[1], in0[0], 1); + out1[0] = amd_bytealign (in0[0], 0, 1); + out0[3] = 0; + out0[2] = 0; + out0[1] = 0; + out0[0] = 0; + break; + case 20: out1[3] = in0[2]; + out1[2] = in0[1]; + out1[1] = in0[0]; + out1[0] = 0; + out0[3] = 0; + out0[2] = 0; + out0[1] = 0; + out0[0] = 0; + break; + case 21: out1[3] = amd_bytealign (in0[2], in0[1], 3); + out1[2] = amd_bytealign (in0[1], in0[0], 3); + out1[1] = amd_bytealign (in0[0], 0, 3); + out1[0] = 0; + out0[3] = 0; + out0[2] = 0; + out0[1] = 0; + out0[0] = 0; + break; + case 22: out1[3] = amd_bytealign (in0[2], in0[1], 2); + out1[2] = amd_bytealign (in0[1], in0[0], 2); + out1[1] = amd_bytealign (in0[0], 0, 2); + out1[0] = 0; + out0[3] = 0; + out0[2] = 0; + out0[1] = 0; + out0[0] = 0; + break; + case 23: out1[3] = amd_bytealign (in0[2], in0[1], 1); + out1[2] = amd_bytealign (in0[1], in0[0], 1); + out1[1] = amd_bytealign (in0[0], 0, 1); + out1[0] = 0; + out0[3] = 0; + out0[2] = 0; + out0[1] = 0; + out0[0] = 0; + break; + case 24: out1[3] = in0[1]; + out1[2] = in0[0]; + out1[1] = 0; + out1[0] = 0; + out0[3] = 0; + out0[2] = 0; + out0[1] = 0; + out0[0] = 0; + break; + case 25: out1[3] = amd_bytealign (in0[1], in0[0], 3); + out1[2] = amd_bytealign (in0[0], 0, 3); + out1[1] = 0; + out1[0] = 0; + out0[3] = 0; + out0[2] = 0; + out0[1] = 0; + out0[0] = 0; + break; + case 26: out1[3] = amd_bytealign (in0[1], in0[0], 2); + out1[2] = amd_bytealign (in0[0], 0, 2); + out1[1] = 0; + out1[0] = 0; + out0[3] = 0; + out0[2] = 0; + out0[1] = 0; + out0[0] = 0; + break; + case 27: out1[3] = amd_bytealign (in0[1], in0[0], 1); + out1[2] = amd_bytealign (in0[0], 0, 1); + out1[1] = 0; + out1[0] = 0; + out0[3] = 0; + out0[2] = 0; + out0[1] = 0; + out0[0] = 0; + break; + case 28: out1[3] = in0[0]; + out1[2] = 0; + out1[1] = 0; + out1[0] = 0; + out0[3] = 0; + out0[2] = 0; + out0[1] = 0; + out0[0] = 0; + break; + case 29: out1[3] = amd_bytealign (in0[0], 0, 3); + out1[2] = 0; + out1[1] = 0; + out1[0] = 0; + out0[3] = 0; + out0[2] = 0; + out0[1] = 0; + out0[0] = 0; + break; + case 30: out1[3] = amd_bytealign (in0[0], 0, 2); + out1[2] = 0; + out1[1] = 0; + out1[0] = 0; + out0[3] = 0; + out0[2] = 0; + out0[1] = 0; + out0[0] = 0; + break; + case 31: out1[3] = amd_bytealign (in0[0], 0, 1); + out1[2] = 0; + out1[1] = 0; + out1[0] = 0; + out0[3] = 0; + out0[2] = 0; + out0[1] = 0; + out0[0] = 0; + break; + } +} + +static void append_block1 (const u32 offset, u32x dst0[4], u32x dst1[4], const u32x src_r0) +{ + u32x tmp[2]; + + switch (offset & 3) + { + case 0: tmp[0] = src_r0; + tmp[1] = 0; + break; + case 1: tmp[0] = src_r0 << 8; + tmp[1] = src_r0 >> 24; + break; + case 2: tmp[0] = src_r0 << 16; + tmp[1] = src_r0 >> 16; + break; + case 3: tmp[0] = src_r0 << 24; + tmp[1] = src_r0 >> 8; + break; + } + + switch (offset / 4) + { + case 0: dst0[0] |= tmp[0]; + dst0[1] = tmp[1]; + break; + case 1: dst0[1] |= tmp[0]; + dst0[2] = tmp[1]; + break; + case 2: dst0[2] |= tmp[0]; + dst0[3] = tmp[1]; + break; + case 3: dst0[3] |= tmp[0]; + dst1[0] = tmp[1]; + break; + case 4: dst1[0] |= tmp[0]; + dst1[1] = tmp[1]; + break; + case 5: dst1[1] |= tmp[0]; + dst1[2] = tmp[1]; + break; + case 6: dst1[2] |= tmp[0]; + dst1[3] = tmp[1]; + break; + case 7: dst1[3] |= tmp[0]; + break; + } +} + +static void append_block8 (const u32 offset, u32x dst0[4], u32x dst1[4], const u32x src_l0[4], const u32x src_l1[4], const u32x src_r0[4], const u32x src_r1[4]) +{ + switch (offset) + { + case 0: + dst0[0] = src_r0[0]; + dst0[1] = src_r0[1]; + dst0[2] = src_r0[2]; + dst0[3] = src_r0[3]; + dst1[0] = src_r1[0]; + dst1[1] = src_r1[1]; + dst1[2] = src_r1[2]; + dst1[3] = src_r1[3]; + break; + + case 1: + dst0[0] = src_l0[0] + | src_r0[0] << 8; + dst0[1] = amd_bytealign (src_r0[1], src_r0[0], 3); + dst0[2] = amd_bytealign (src_r0[2], src_r0[1], 3); + dst0[3] = amd_bytealign (src_r0[3], src_r0[2], 3); + dst1[0] = amd_bytealign (src_r1[0], src_r0[3], 3); + dst1[1] = amd_bytealign (src_r1[1], src_r1[0], 3); + dst1[2] = amd_bytealign (src_r1[2], src_r1[1], 3); + dst1[3] = amd_bytealign (src_r1[3], src_r1[2], 3); + break; + + case 2: + dst0[0] = src_l0[0] + | src_r0[0] << 16; + dst0[1] = amd_bytealign (src_r0[1], src_r0[0], 2); + dst0[2] = amd_bytealign (src_r0[2], src_r0[1], 2); + dst0[3] = amd_bytealign (src_r0[3], src_r0[2], 2); + dst1[0] = amd_bytealign (src_r1[0], src_r0[3], 2); + dst1[1] = amd_bytealign (src_r1[1], src_r1[0], 2); + dst1[2] = amd_bytealign (src_r1[2], src_r1[1], 2); + dst1[3] = amd_bytealign (src_r1[3], src_r1[2], 2); + break; + + case 3: + dst0[0] = src_l0[0] + | src_r0[0] << 24; + dst0[1] = amd_bytealign (src_r0[1], src_r0[0], 1); + dst0[2] = amd_bytealign (src_r0[2], src_r0[1], 1); + dst0[3] = amd_bytealign (src_r0[3], src_r0[2], 1); + dst1[0] = amd_bytealign (src_r1[0], src_r0[3], 1); + dst1[1] = amd_bytealign (src_r1[1], src_r1[0], 1); + dst1[2] = amd_bytealign (src_r1[2], src_r1[1], 1); + dst1[3] = amd_bytealign (src_r1[3], src_r1[2], 1); + break; + + case 4: + dst0[1] = src_r0[0]; + dst0[2] = src_r0[1]; + dst0[3] = src_r0[2]; + dst1[0] = src_r0[3]; + dst1[1] = src_r1[0]; + dst1[2] = src_r1[1]; + dst1[3] = src_r1[2]; + break; + + case 5: + dst0[1] = src_l0[1] + | src_r0[0] << 8; + dst0[2] = amd_bytealign (src_r0[1], src_r0[0], 3); + dst0[3] = amd_bytealign (src_r0[2], src_r0[1], 3); + dst1[0] = amd_bytealign (src_r0[3], src_r0[2], 3); + dst1[1] = amd_bytealign (src_r1[0], src_r0[3], 3); + dst1[2] = amd_bytealign (src_r1[1], src_r1[0], 3); + dst1[3] = amd_bytealign (src_r1[2], src_r1[1], 3); + break; + + case 6: + dst0[1] = src_l0[1] + | src_r0[0] << 16; + dst0[2] = amd_bytealign (src_r0[1], src_r0[0], 2); + dst0[3] = amd_bytealign (src_r0[2], src_r0[1], 2); + dst1[0] = amd_bytealign (src_r0[3], src_r0[2], 2); + dst1[1] = amd_bytealign (src_r1[0], src_r0[3], 2); + dst1[2] = amd_bytealign (src_r1[1], src_r1[0], 2); + dst1[3] = amd_bytealign (src_r1[2], src_r1[1], 2); + break; + + case 7: + dst0[1] = src_l0[1] + | src_r0[0] << 24; + dst0[2] = amd_bytealign (src_r0[1], src_r0[0], 1); + dst0[3] = amd_bytealign (src_r0[2], src_r0[1], 1); + dst1[0] = amd_bytealign (src_r0[3], src_r0[2], 1); + dst1[1] = amd_bytealign (src_r1[0], src_r0[3], 1); + dst1[2] = amd_bytealign (src_r1[1], src_r1[0], 1); + dst1[3] = amd_bytealign (src_r1[2], src_r1[1], 1); + break; + + case 8: + dst0[2] = src_r0[0]; + dst0[3] = src_r0[1]; + dst1[0] = src_r0[2]; + dst1[1] = src_r0[3]; + dst1[2] = src_r1[0]; + dst1[3] = src_r1[1]; + break; + + case 9: + dst0[2] = src_l0[2] + | src_r0[0] << 8; + dst0[3] = amd_bytealign (src_r0[1], src_r0[0], 3); + dst1[0] = amd_bytealign (src_r0[2], src_r0[1], 3); + dst1[1] = amd_bytealign (src_r0[3], src_r0[2], 3); + dst1[2] = amd_bytealign (src_r1[0], src_r0[3], 3); + dst1[3] = amd_bytealign (src_r1[1], src_r1[0], 3); + break; + + case 10: + dst0[2] = src_l0[2] + | src_r0[0] << 16; + dst0[3] = amd_bytealign (src_r0[1], src_r0[0], 2); + dst1[0] = amd_bytealign (src_r0[2], src_r0[1], 2); + dst1[1] = amd_bytealign (src_r0[3], src_r0[2], 2); + dst1[2] = amd_bytealign (src_r1[0], src_r0[3], 2); + dst1[3] = amd_bytealign (src_r1[1], src_r1[0], 2); + break; + + case 11: + dst0[2] = src_l0[2] + | src_r0[0] << 24; + dst0[3] = amd_bytealign (src_r0[1], src_r0[0], 1); + dst1[0] = amd_bytealign (src_r0[2], src_r0[1], 1); + dst1[1] = amd_bytealign (src_r0[3], src_r0[2], 1); + dst1[2] = amd_bytealign (src_r1[0], src_r0[3], 1); + dst1[3] = amd_bytealign (src_r1[1], src_r1[0], 1); + break; + + case 12: + dst0[3] = src_r0[0]; + dst1[0] = src_r0[1]; + dst1[1] = src_r0[2]; + dst1[2] = src_r0[3]; + dst1[3] = src_r1[0]; + break; + + case 13: + dst0[3] = src_l0[3] + | src_r0[0] << 8; + dst1[0] = amd_bytealign (src_r0[1], src_r0[0], 3); + dst1[1] = amd_bytealign (src_r0[2], src_r0[1], 3); + dst1[2] = amd_bytealign (src_r0[3], src_r0[2], 3); + dst1[3] = amd_bytealign (src_r1[0], src_r0[3], 3); + break; + + case 14: + dst0[3] = src_l0[3] + | src_r0[0] << 16; + dst1[0] = amd_bytealign (src_r0[1], src_r0[0], 2); + dst1[1] = amd_bytealign (src_r0[2], src_r0[1], 2); + dst1[2] = amd_bytealign (src_r0[3], src_r0[2], 2); + dst1[3] = amd_bytealign (src_r1[0], src_r0[3], 2); + break; + + case 15: + dst0[3] = src_l0[3] + | src_r0[0] << 24; + dst1[0] = amd_bytealign (src_r0[1], src_r0[0], 1); + dst1[1] = amd_bytealign (src_r0[2], src_r0[1], 1); + dst1[2] = amd_bytealign (src_r0[3], src_r0[2], 1); + dst1[3] = amd_bytealign (src_r1[0], src_r0[3], 1); + break; + + case 16: + dst1[0] = src_r0[0]; + dst1[1] = src_r0[1]; + dst1[2] = src_r0[2]; + dst1[3] = src_r0[3]; + break; + + case 17: + dst1[0] = src_l1[0] + | src_r0[0] << 8; + dst1[1] = amd_bytealign (src_r0[1], src_r0[0], 3); + dst1[2] = amd_bytealign (src_r0[2], src_r0[1], 3); + dst1[3] = amd_bytealign (src_r0[3], src_r0[2], 3); + break; + + case 18: + dst1[0] = src_l1[0] + | src_r0[0] << 16; + dst1[1] = amd_bytealign (src_r0[1], src_r0[0], 2); + dst1[2] = amd_bytealign (src_r0[2], src_r0[1], 2); + dst1[3] = amd_bytealign (src_r0[3], src_r0[2], 2); + break; + + case 19: + dst1[0] = src_l1[0] + | src_r0[0] << 24; + dst1[1] = amd_bytealign (src_r0[1], src_r0[0], 1); + dst1[2] = amd_bytealign (src_r0[2], src_r0[1], 1); + dst1[3] = amd_bytealign (src_r0[3], src_r0[2], 1); + break; + + case 20: + dst1[1] = src_r0[0]; + dst1[2] = src_r0[1]; + dst1[3] = src_r0[2]; + break; + + case 21: + dst1[1] = src_l1[1] + | src_r0[0] << 8; + dst1[2] = amd_bytealign (src_r0[1], src_r0[0], 3); + dst1[3] = amd_bytealign (src_r0[2], src_r0[1], 3); + break; + + case 22: + dst1[1] = src_l1[1] + | src_r0[0] << 16; + dst1[2] = amd_bytealign (src_r0[1], src_r0[0], 2); + dst1[3] = amd_bytealign (src_r0[2], src_r0[1], 2); + break; + + case 23: + dst1[1] = src_l1[1] + | src_r0[0] << 24; + dst1[2] = amd_bytealign (src_r0[1], src_r0[0], 1); + dst1[3] = amd_bytealign (src_r0[2], src_r0[1], 1); + break; + + case 24: + dst1[2] = src_r0[0]; + dst1[3] = src_r0[1]; + break; + + case 25: + dst1[2] = src_l1[2] + | src_r0[0] << 8; + dst1[3] = amd_bytealign (src_r0[1], src_r0[0], 3); + break; + + case 26: + dst1[2] = src_l1[2] + | src_r0[0] << 16; + dst1[3] = amd_bytealign (src_r0[1], src_r0[0], 2); + break; + + case 27: + dst1[2] = src_l1[2] + | src_r0[0] << 24; + dst1[3] = amd_bytealign (src_r0[1], src_r0[0], 1); + break; + + case 28: + dst1[3] = src_r0[0]; + break; + + case 29: + dst1[3] = src_l1[3] + | src_r0[0] << 8; + break; + + case 30: + dst1[3] = src_l1[3] + | src_r0[0] << 16; + break; + + case 31: + dst1[3] = src_l1[3] + | src_r0[0] << 24; + break; + } +} + +static void reverse_block (u32x in0[4], u32x in1[4], u32x out0[4], u32x out1[4], const u32 len) +{ + rshift_block_N (in0, in1, out0, out1, 32 - len); + + u32x tib40[4]; + u32x tib41[4]; + + tib40[0] = out1[3]; + tib40[1] = out1[2]; + tib40[2] = out1[1]; + tib40[3] = out1[0]; + tib41[0] = out0[3]; + tib41[1] = out0[2]; + tib41[2] = out0[1]; + tib41[3] = out0[0]; + + out0[0] = swap_workaround (tib40[0]); + out0[1] = swap_workaround (tib40[1]); + out0[2] = swap_workaround (tib40[2]); + out0[3] = swap_workaround (tib40[3]); + out1[0] = swap_workaround (tib41[0]); + out1[1] = swap_workaround (tib41[1]); + out1[2] = swap_workaround (tib41[2]); + out1[3] = swap_workaround (tib41[3]); +} + +static u32 rule_op_mangle_lrest (const u32 p0, const u32 p1, u32x buf0[4], u32x buf1[4], const u32 in_len) +{ + buf0[0] |= (generate_cmask (buf0[0])); + buf0[1] |= (generate_cmask (buf0[1])); + buf0[2] |= (generate_cmask (buf0[2])); + buf0[3] |= (generate_cmask (buf0[3])); + buf1[0] |= (generate_cmask (buf1[0])); + buf1[1] |= (generate_cmask (buf1[1])); + buf1[2] |= (generate_cmask (buf1[2])); + buf1[3] |= (generate_cmask (buf1[3])); + + return in_len; +} + +static u32 rule_op_mangle_urest (const u32 p0, const u32 p1, u32x buf0[4], u32x buf1[4], const u32 in_len) +{ + buf0[0] &= ~(generate_cmask (buf0[0])); + buf0[1] &= ~(generate_cmask (buf0[1])); + buf0[2] &= ~(generate_cmask (buf0[2])); + buf0[3] &= ~(generate_cmask (buf0[3])); + buf1[0] &= ~(generate_cmask (buf1[0])); + buf1[1] &= ~(generate_cmask (buf1[1])); + buf1[2] &= ~(generate_cmask (buf1[2])); + buf1[3] &= ~(generate_cmask (buf1[3])); + + return in_len; +} + +static u32 rule_op_mangle_lrest_ufirst (const u32 p0, const u32 p1, u32x buf0[4], u32x buf1[4], const u32 in_len) +{ + rule_op_mangle_lrest (p0, p1, buf0, buf1, in_len); + + buf0[0] &= ~(0x00000020 & generate_cmask (buf0[0])); + + return in_len; +} + +static u32 rule_op_mangle_urest_lfirst (const u32 p0, const u32 p1, u32x buf0[4], u32x buf1[4], const u32 in_len) +{ + rule_op_mangle_urest (p0, p1, buf0, buf1, in_len); + + buf0[0] |= (0x00000020 & generate_cmask (buf0[0])); + + return in_len; +} + +static u32 rule_op_mangle_trest (const u32 p0, const u32 p1, u32x buf0[4], u32x buf1[4], const u32 in_len) +{ + buf0[0] ^= (generate_cmask (buf0[0])); + buf0[1] ^= (generate_cmask (buf0[1])); + buf0[2] ^= (generate_cmask (buf0[2])); + buf0[3] ^= (generate_cmask (buf0[3])); + buf1[0] ^= (generate_cmask (buf1[0])); + buf1[1] ^= (generate_cmask (buf1[1])); + buf1[2] ^= (generate_cmask (buf1[2])); + buf1[3] ^= (generate_cmask (buf1[3])); + + return in_len; +} + +static u32 rule_op_mangle_toggle_at (const u32 p0, const u32 p1, u32x buf0[4], u32x buf1[4], const u32 in_len) +{ + if (p0 >= in_len) return (in_len); + + const u32 tmp = 0x20 << ((p0 & 3) * 8); + + switch (p0 / 4) + { + case 0: buf0[0] ^= (tmp & generate_cmask (buf0[0])); break; + case 1: buf0[1] ^= (tmp & generate_cmask (buf0[1])); break; + case 2: buf0[2] ^= (tmp & generate_cmask (buf0[2])); break; + case 3: buf0[3] ^= (tmp & generate_cmask (buf0[3])); break; + case 4: buf1[0] ^= (tmp & generate_cmask (buf1[0])); break; + case 5: buf1[1] ^= (tmp & generate_cmask (buf1[1])); break; + case 6: buf1[2] ^= (tmp & generate_cmask (buf1[2])); break; + case 7: buf1[3] ^= (tmp & generate_cmask (buf1[3])); break; + } + + return in_len; +} + +static u32 rule_op_mangle_reverse (const u32 p0, const u32 p1, u32x buf0[4], u32x buf1[4], const u32 in_len) +{ + reverse_block (buf0, buf1, buf0, buf1, in_len); + + return in_len; +} + +static u32 rule_op_mangle_dupeword (const u32 p0, const u32 p1, u32x buf0[4], u32x buf1[4], const u32 in_len) +{ + if ((in_len + in_len) >= 32) return (in_len); + + u32 out_len = in_len; + + u32x tib40[4]; + u32x tib41[4]; + + tib40[0] = buf0[0]; + tib40[1] = buf0[1]; + tib40[2] = buf0[2]; + tib40[3] = buf0[3]; + tib41[0] = buf1[0]; + tib41[1] = buf1[1]; + tib41[2] = buf1[2]; + tib41[3] = buf1[3]; + + append_block8 (out_len, buf0, buf1, buf0, buf1, tib40, tib41); + + out_len += in_len; + + return out_len; +} + +static u32 rule_op_mangle_dupeword_times (const u32 p0, const u32 p1, u32x buf0[4], u32x buf1[4], const u32 in_len) +{ + if (((in_len * p0) + in_len) >= 32) return (in_len); + + u32 out_len = in_len; + + u32x tib40[4]; + u32x tib41[4]; + + tib40[0] = buf0[0]; + tib40[1] = buf0[1]; + tib40[2] = buf0[2]; + tib40[3] = buf0[3]; + tib41[0] = buf1[0]; + tib41[1] = buf1[1]; + tib41[2] = buf1[2]; + tib41[3] = buf1[3]; + + for (u32 i = 0; i < p0; i++) + { + append_block8 (out_len, buf0, buf1, buf0, buf1, tib40, tib41); + + out_len += in_len; + } + + return out_len; +} + +static u32 rule_op_mangle_reflect (const u32 p0, const u32 p1, u32x buf0[4], u32x buf1[4], const u32 in_len) +{ + if ((in_len + in_len) >= 32) return (in_len); + + u32 out_len = in_len; + + u32x tib40[4]; + u32x tib41[4]; + + reverse_block (buf0, buf1, tib40, tib41, out_len); + + append_block8 (out_len, buf0, buf1, buf0, buf1, tib40, tib41); + + out_len += in_len; + + return out_len; +} + +static u32 rule_op_mangle_append (const u32 p0, const u32 p1, u32x buf0[4], u32x buf1[4], const u32 in_len) +{ + if ((in_len + 1) >= 32) return (in_len); + + u32 out_len = in_len; + + append_block1 (out_len, buf0, buf1, p0); + + out_len++; + + return out_len; +} + +static u32 rule_op_mangle_prepend (const u32 p0, const u32 p1, u32x buf0[4], u32x buf1[4], const u32 in_len) +{ + if ((in_len + 1) >= 32) return (in_len); + + u32 out_len = in_len; + + rshift_block (buf0, buf1, buf0, buf1); + + buf0[0] = buf0[0] | p0; + + out_len++; + + return out_len; +} + +static u32 rule_op_mangle_rotate_left (const u32 p0, const u32 p1, u32x buf0[4], u32x buf1[4], const u32 in_len) +{ + if (in_len == 0) return (in_len); + + const u32 in_len1 = in_len - 1; + + const u32 sh = (in_len1 & 3) * 8; + + const u32x tmp = (buf0[0] & 0xff) << sh; + + lshift_block (buf0, buf1, buf0, buf1); + + switch (in_len1 / 4) + { + case 0: buf0[0] |= tmp; break; + case 1: buf0[1] |= tmp; break; + case 2: buf0[2] |= tmp; break; + case 3: buf0[3] |= tmp; break; + case 4: buf1[0] |= tmp; break; + case 5: buf1[1] |= tmp; break; + case 6: buf1[2] |= tmp; break; + case 7: buf1[3] |= tmp; break; + } + + return in_len; +} + +static u32 rule_op_mangle_rotate_right (const u32 p0, const u32 p1, u32x buf0[4], u32x buf1[4], const u32 in_len) +{ + if (in_len == 0) return (in_len); + + const u32 in_len1 = in_len - 1; + + const u32 sh = (in_len1 & 3) * 8; + + u32x tmp = 0; + + switch (in_len1 / 4) + { + case 0: tmp = (buf0[0] >> sh) & 0xff; break; + case 1: tmp = (buf0[1] >> sh) & 0xff; break; + case 2: tmp = (buf0[2] >> sh) & 0xff; break; + case 3: tmp = (buf0[3] >> sh) & 0xff; break; + case 4: tmp = (buf1[0] >> sh) & 0xff; break; + case 5: tmp = (buf1[1] >> sh) & 0xff; break; + case 6: tmp = (buf1[2] >> sh) & 0xff; break; + case 7: tmp = (buf1[3] >> sh) & 0xff; break; + } + + rshift_block (buf0, buf1, buf0, buf1); + + buf0[0] |= tmp; + + truncate_right (buf0, buf1, in_len); + + return in_len; +} + +static u32 rule_op_mangle_delete_first (const u32 p0, const u32 p1, u32x buf0[4], u32x buf1[4], const u32 in_len) +{ + if (in_len == 0) return (in_len); + + const u32 in_len1 = in_len - 1; + + lshift_block (buf0, buf1, buf0, buf1); + + return in_len1; +} + +static u32 rule_op_mangle_delete_last (const u32 p0, const u32 p1, u32x buf0[4], u32x buf1[4], const u32 in_len) +{ + if (in_len == 0) return (in_len); + + const u32 in_len1 = in_len - 1; + + const u32 tmp = (1 << ((in_len1 & 3) * 8)) - 1; + + switch (in_len1 / 4) + { + case 0: buf0[0] &= tmp; break; + case 1: buf0[1] &= tmp; break; + case 2: buf0[2] &= tmp; break; + case 3: buf0[3] &= tmp; break; + case 4: buf1[0] &= tmp; break; + case 5: buf1[1] &= tmp; break; + case 6: buf1[2] &= tmp; break; + case 7: buf1[3] &= tmp; break; + } + + return in_len1; +} + +static u32 rule_op_mangle_delete_at (const u32 p0, const u32 p1, u32x buf0[4], u32x buf1[4], const u32 in_len) +{ + if (p0 >= in_len) return (in_len); + + u32 out_len = in_len; + + u32x tib40[4]; + u32x tib41[4]; + + lshift_block (buf0, buf1, tib40, tib41); + + const u32 ml = (1 << ((p0 & 3) * 8)) - 1; + const u32 mr = ~ml; + + switch (p0 / 4) + { + case 0: buf0[0] = (buf0[0] & ml) + | (tib40[0] & mr); + buf0[1] = tib40[1]; + buf0[2] = tib40[2]; + buf0[3] = tib40[3]; + buf1[0] = tib41[0]; + buf1[1] = tib41[1]; + buf1[2] = tib41[2]; + buf1[3] = tib41[3]; + break; + case 1: buf0[1] = (buf0[1] & ml) + | (tib40[1] & mr); + buf0[2] = tib40[2]; + buf0[3] = tib40[3]; + buf1[0] = tib41[0]; + buf1[1] = tib41[1]; + buf1[2] = tib41[2]; + buf1[3] = tib41[3]; + break; + case 2: buf0[2] = (buf0[2] & ml) + | (tib40[2] & mr); + buf0[3] = tib40[3]; + buf1[0] = tib41[0]; + buf1[1] = tib41[1]; + buf1[2] = tib41[2]; + buf1[3] = tib41[3]; + break; + case 3: buf0[3] = (buf0[3] & ml) + | (tib40[3] & mr); + buf1[0] = tib41[0]; + buf1[1] = tib41[1]; + buf1[2] = tib41[2]; + buf1[3] = tib41[3]; + break; + case 4: buf1[0] = (buf1[0] & ml) + | (tib41[0] & mr); + buf1[1] = tib41[1]; + buf1[2] = tib41[2]; + buf1[3] = tib41[3]; + break; + case 5: buf1[1] = (buf1[1] & ml) + | (tib41[1] & mr); + buf1[2] = tib41[2]; + buf1[3] = tib41[3]; + break; + case 6: buf1[2] = (buf1[2] & ml) + | (tib41[2] & mr); + buf1[3] = tib41[3]; + break; + case 7: buf1[3] = (buf1[3] & ml) + | (tib41[3] & mr); + break; + } + + out_len--; + + return out_len; +} + +static u32 rule_op_mangle_extract (const u32 p0, const u32 p1, u32x buf0[4], u32x buf1[4], const u32 in_len) +{ + if (p0 >= in_len) return (in_len); + + if ((p0 + p1) > in_len) return (in_len); + + u32 out_len = p1; + + lshift_block_N (buf0, buf1, buf0, buf1, p0); + + truncate_right (buf0, buf1, out_len); + + return out_len; +} + +static u32 rule_op_mangle_omit (const u32 p0, const u32 p1, u32x buf0[4], u32x buf1[4], const u32 in_len) +{ + if (p0 >= in_len) return (in_len); + + if ((p0 + p1) > in_len) return (in_len); + + u32 out_len = in_len; + + u32x tib40[4]; + u32x tib41[4]; + + tib40[0] = 0; + tib40[1] = 0; + tib40[2] = 0; + tib40[3] = 0; + tib41[0] = 0; + tib41[1] = 0; + tib41[2] = 0; + tib41[3] = 0; + + lshift_block_N (buf0, buf1, tib40, tib41, p1); + + const u32 ml = (1 << ((p0 & 3) * 8)) - 1; + const u32 mr = ~ml; + + switch (p0 / 4) + { + case 0: buf0[0] = (buf0[0] & ml) + | (tib40[0] & mr); + buf0[1] = tib40[1]; + buf0[2] = tib40[2]; + buf0[3] = tib40[3]; + buf1[0] = tib41[0]; + buf1[1] = tib41[1]; + buf1[2] = tib41[2]; + buf1[3] = tib41[3]; + break; + case 1: buf0[1] = (buf0[1] & ml) + | (tib40[1] & mr); + buf0[2] = tib40[2]; + buf0[3] = tib40[3]; + buf1[0] = tib41[0]; + buf1[1] = tib41[1]; + buf1[2] = tib41[2]; + buf1[3] = tib41[3]; + break; + case 2: buf0[2] = (buf0[2] & ml) + | (tib40[2] & mr); + buf0[3] = tib40[3]; + buf1[0] = tib41[0]; + buf1[1] = tib41[1]; + buf1[2] = tib41[2]; + buf1[3] = tib41[3]; + break; + case 3: buf0[3] = (buf0[3] & ml) + | (tib40[3] & mr); + buf1[0] = tib41[0]; + buf1[1] = tib41[1]; + buf1[2] = tib41[2]; + buf1[3] = tib41[3]; + break; + case 4: buf1[0] = (buf1[0] & ml) + | (tib41[0] & mr); + buf1[1] = tib41[1]; + buf1[2] = tib41[2]; + buf1[3] = tib41[3]; + break; + case 5: buf1[1] = (buf1[1] & ml) + | (tib41[1] & mr); + buf1[2] = tib41[2]; + buf1[3] = tib41[3]; + break; + case 6: buf1[2] = (buf1[2] & ml) + | (tib41[2] & mr); + buf1[3] = tib41[3]; + break; + case 7: buf1[3] = (buf1[3] & ml) + | (tib41[3] & mr); + break; + } + + out_len -= p1; + + return out_len; +} + +static u32 rule_op_mangle_insert (const u32 p0, const u32 p1, u32x buf0[4], u32x buf1[4], const u32 in_len) +{ + if (p0 > in_len) return (in_len); + + if ((in_len + 1) >= 32) return (in_len); + + u32 out_len = in_len; + + u32x tib40[4]; + u32x tib41[4]; + + rshift_block (buf0, buf1, tib40, tib41); + + const u32 p1n = p1 << ((p0 & 3) * 8); + + const u32 ml = (1 << ((p0 & 3) * 8)) - 1; + + const u32 mr = 0xffffff00 << ((p0 & 3) * 8); + + switch (p0 / 4) + { + case 0: buf0[0] = (buf0[0] & ml) | p1n | (tib40[0] & mr); + buf0[1] = tib40[1]; + buf0[2] = tib40[2]; + buf0[3] = tib40[3]; + buf1[0] = tib41[0]; + buf1[1] = tib41[1]; + buf1[2] = tib41[2]; + buf1[3] = tib41[3]; + break; + case 1: buf0[1] = (buf0[1] & ml) | p1n | (tib40[1] & mr); + buf0[2] = tib40[2]; + buf0[3] = tib40[3]; + buf1[0] = tib41[0]; + buf1[1] = tib41[1]; + buf1[2] = tib41[2]; + buf1[3] = tib41[3]; + break; + case 2: buf0[2] = (buf0[2] & ml) | p1n | (tib40[2] & mr); + buf0[3] = tib40[3]; + buf1[0] = tib41[0]; + buf1[1] = tib41[1]; + buf1[2] = tib41[2]; + buf1[3] = tib41[3]; + break; + case 3: buf0[3] = (buf0[3] & ml) | p1n | (tib40[3] & mr); + buf1[0] = tib41[0]; + buf1[1] = tib41[1]; + buf1[2] = tib41[2]; + buf1[3] = tib41[3]; + break; + case 4: buf1[0] = (buf1[0] & ml) | p1n | (tib41[0] & mr); + buf1[1] = tib41[1]; + buf1[2] = tib41[2]; + buf1[3] = tib41[3]; + break; + case 5: buf1[1] = (buf1[1] & ml) | p1n | (tib41[1] & mr); + buf1[2] = tib41[2]; + buf1[3] = tib41[3]; + break; + case 6: buf1[2] = (buf1[2] & ml) | p1n | (tib41[2] & mr); + buf1[3] = tib41[3]; + break; + case 7: buf1[3] = (buf1[3] & ml) | p1n | (tib41[3] & mr); + break; + } + + out_len++; + + return out_len; +} + +static u32 rule_op_mangle_overstrike (const u32 p0, const u32 p1, u32x buf0[4], u32x buf1[4], const u32 in_len) +{ + if (p0 >= in_len) return (in_len); + + const u32 p1n = p1 << ((p0 & 3) * 8); + + const u32 m = ~(0xff << ((p0 & 3) * 8)); + + switch (p0 / 4) + { + case 0: buf0[0] = (buf0[0] & m) | p1n; break; + case 1: buf0[1] = (buf0[1] & m) | p1n; break; + case 2: buf0[2] = (buf0[2] & m) | p1n; break; + case 3: buf0[3] = (buf0[3] & m) | p1n; break; + case 4: buf1[0] = (buf1[0] & m) | p1n; break; + case 5: buf1[1] = (buf1[1] & m) | p1n; break; + case 6: buf1[2] = (buf1[2] & m) | p1n; break; + case 7: buf1[3] = (buf1[3] & m) | p1n; break; + } + + return in_len; +} + +static u32 rule_op_mangle_truncate_at (const u32 p0, const u32 p1, u32x buf0[4], u32x buf1[4], const u32 in_len) +{ + if (p0 >= in_len) return (in_len); + + truncate_right (buf0, buf1, p0); + + return p0; +} + +static u32 rule_op_mangle_replace (const u32 p0, const u32 p1, u32x buf0[4], u32x buf1[4], const u32 in_len) +{ + #ifdef VECT_SIZE1 + + const uchar4 tmp0 = (uchar4) (p0); + const uchar4 tmp1 = (uchar4) (p1); + + uchar4 tmp; + + tmp = as_uchar4 (buf0[0]); tmp = select (tmp, tmp1, tmp == tmp0); buf0[0] = as_uint (tmp); + tmp = as_uchar4 (buf0[1]); tmp = select (tmp, tmp1, tmp == tmp0); buf0[1] = as_uint (tmp); + tmp = as_uchar4 (buf0[2]); tmp = select (tmp, tmp1, tmp == tmp0); buf0[2] = as_uint (tmp); + tmp = as_uchar4 (buf0[3]); tmp = select (tmp, tmp1, tmp == tmp0); buf0[3] = as_uint (tmp); + tmp = as_uchar4 (buf1[0]); tmp = select (tmp, tmp1, tmp == tmp0); buf1[0] = as_uint (tmp); + tmp = as_uchar4 (buf1[1]); tmp = select (tmp, tmp1, tmp == tmp0); buf1[1] = as_uint (tmp); + tmp = as_uchar4 (buf1[2]); tmp = select (tmp, tmp1, tmp == tmp0); buf1[2] = as_uint (tmp); + tmp = as_uchar4 (buf1[3]); tmp = select (tmp, tmp1, tmp == tmp0); buf1[3] = as_uint (tmp); + + #endif + + #ifdef VECT_SIZE2 + + const uchar8 tmp0 = (uchar8) (p0); + const uchar8 tmp1 = (uchar8) (p1); + + uchar8 tmp; + + tmp = as_uchar8 (buf0[0]); tmp = select (tmp, tmp1, tmp == tmp0); buf0[0] = as_uint2 (tmp); + tmp = as_uchar8 (buf0[1]); tmp = select (tmp, tmp1, tmp == tmp0); buf0[1] = as_uint2 (tmp); + tmp = as_uchar8 (buf0[2]); tmp = select (tmp, tmp1, tmp == tmp0); buf0[2] = as_uint2 (tmp); + tmp = as_uchar8 (buf0[3]); tmp = select (tmp, tmp1, tmp == tmp0); buf0[3] = as_uint2 (tmp); + tmp = as_uchar8 (buf1[0]); tmp = select (tmp, tmp1, tmp == tmp0); buf1[0] = as_uint2 (tmp); + tmp = as_uchar8 (buf1[1]); tmp = select (tmp, tmp1, tmp == tmp0); buf1[1] = as_uint2 (tmp); + tmp = as_uchar8 (buf1[2]); tmp = select (tmp, tmp1, tmp == tmp0); buf1[2] = as_uint2 (tmp); + tmp = as_uchar8 (buf1[3]); tmp = select (tmp, tmp1, tmp == tmp0); buf1[3] = as_uint2 (tmp); + + #endif + + #ifdef VECT_SIZE4 + + const uchar16 tmp0 = (uchar16) (p0); + const uchar16 tmp1 = (uchar16) (p1); + + uchar16 tmp; + + tmp = as_uchar16 (buf0[0]); tmp = select (tmp, tmp1, tmp == tmp0); buf0[0] = as_uint4 (tmp); + tmp = as_uchar16 (buf0[1]); tmp = select (tmp, tmp1, tmp == tmp0); buf0[1] = as_uint4 (tmp); + tmp = as_uchar16 (buf0[2]); tmp = select (tmp, tmp1, tmp == tmp0); buf0[2] = as_uint4 (tmp); + tmp = as_uchar16 (buf0[3]); tmp = select (tmp, tmp1, tmp == tmp0); buf0[3] = as_uint4 (tmp); + tmp = as_uchar16 (buf1[0]); tmp = select (tmp, tmp1, tmp == tmp0); buf1[0] = as_uint4 (tmp); + tmp = as_uchar16 (buf1[1]); tmp = select (tmp, tmp1, tmp == tmp0); buf1[1] = as_uint4 (tmp); + tmp = as_uchar16 (buf1[2]); tmp = select (tmp, tmp1, tmp == tmp0); buf1[2] = as_uint4 (tmp); + tmp = as_uchar16 (buf1[3]); tmp = select (tmp, tmp1, tmp == tmp0); buf1[3] = as_uint4 (tmp); + + #endif + + return in_len; +} + +static u32 rule_op_mangle_purgechar (const u32 p0, const u32 p1, u32x buf0[4], u32x buf1[4], const u32 in_len) +{ + // TODO + return in_len; +} + +static u32 rule_op_mangle_togglecase_rec (const u32 p0, const u32 p1, u32x buf0[4], u32x buf1[4], const u32 in_len) +{ + // TODO + return in_len; +} + +static u32 rule_op_mangle_dupechar_first (const u32 p0, const u32 p1, u32x buf0[4], u32x buf1[4], const u32 in_len) +{ + if ( in_len == 0) return (in_len); + if ((in_len + p0) >= 32) return (in_len); + + u32 out_len = in_len; + + const u32x tmp = buf0[0] & 0xFF; + + rshift_block_N (buf0, buf1, buf0, buf1, p0); + + switch (p0) + { + case 1: buf0[0] |= tmp << 0; + break; + case 2: buf0[0] |= tmp << 0 | tmp << 8; + break; + case 3: buf0[0] |= tmp << 0 | tmp << 8 | tmp << 16; + break; + case 4: buf0[0] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24; + break; + case 5: buf0[0] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24; + buf0[1] |= tmp << 0; + break; + case 6: buf0[0] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24; + buf0[1] |= tmp << 0 | tmp << 8; + break; + case 7: buf0[0] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24; + buf0[1] |= tmp << 0 | tmp << 8 | tmp << 16; + break; + case 8: buf0[0] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24; + buf0[1] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24; + break; + case 9: buf0[0] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24; + buf0[1] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24; + buf0[2] |= tmp << 0; + break; + case 10: buf0[0] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24; + buf0[1] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24; + buf0[2] |= tmp << 0 | tmp << 8; + break; + case 11: buf0[0] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24; + buf0[1] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24; + buf0[2] |= tmp << 0 | tmp << 8 | tmp << 16; + break; + case 12: buf0[0] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24; + buf0[1] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24; + buf0[2] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24; + break; + case 13: buf0[0] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24; + buf0[1] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24; + buf0[2] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24; + buf0[3] |= tmp << 0; + break; + case 14: buf0[0] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24; + buf0[1] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24; + buf0[2] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24; + buf0[3] |= tmp << 0 | tmp << 8; + break; + case 15: buf0[0] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24; + buf0[1] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24; + buf0[2] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24; + buf0[3] |= tmp << 0 | tmp << 8 | tmp << 16; + break; + case 16: buf0[0] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24; + buf0[1] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24; + buf0[2] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24; + buf0[3] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24; + break; + case 17: buf0[0] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24; + buf0[1] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24; + buf0[2] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24; + buf0[3] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24; + buf1[0] |= tmp << 0; + break; + case 18: buf0[0] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24; + buf0[1] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24; + buf0[2] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24; + buf0[3] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24; + buf1[0] |= tmp << 0 | tmp << 8; + break; + case 19: buf0[0] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24; + buf0[1] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24; + buf0[2] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24; + buf0[3] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24; + buf1[0] |= tmp << 0 | tmp << 8 | tmp << 16; + break; + case 20: buf0[0] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24; + buf0[1] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24; + buf0[2] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24; + buf0[3] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24; + buf1[0] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24; + break; + case 21: buf0[0] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24; + buf0[1] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24; + buf0[2] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24; + buf0[3] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24; + buf1[0] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24; + buf1[1] |= tmp << 0; + break; + case 22: buf0[0] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24; + buf0[1] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24; + buf0[2] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24; + buf0[3] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24; + buf1[0] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24; + buf1[1] |= tmp << 0 | tmp << 8; + break; + case 23: buf0[0] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24; + buf0[1] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24; + buf0[2] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24; + buf0[3] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24; + buf1[0] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24; + buf1[1] |= tmp << 0 | tmp << 8 | tmp << 16; + break; + case 24: buf0[0] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24; + buf0[1] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24; + buf0[2] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24; + buf0[3] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24; + buf1[0] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24; + buf1[1] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24; + break; + case 25: buf0[0] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24; + buf0[1] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24; + buf0[2] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24; + buf0[3] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24; + buf1[0] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24; + buf1[1] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24; + buf1[2] |= tmp << 0; + break; + case 26: buf0[0] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24; + buf0[1] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24; + buf0[2] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24; + buf0[3] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24; + buf1[0] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24; + buf1[1] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24; + buf1[2] |= tmp << 0 | tmp << 8; + break; + case 27: buf0[0] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24; + buf0[1] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24; + buf0[2] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24; + buf0[3] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24; + buf1[0] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24; + buf1[1] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24; + buf1[2] |= tmp << 0 | tmp << 8 | tmp << 16; + break; + case 28: buf0[0] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24; + buf0[1] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24; + buf0[2] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24; + buf0[3] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24; + buf1[0] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24; + buf1[1] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24; + buf1[2] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24; + break; + case 29: buf0[0] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24; + buf0[1] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24; + buf0[2] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24; + buf0[3] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24; + buf1[0] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24; + buf1[1] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24; + buf1[2] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24; + buf1[3] |= tmp << 0; + break; + case 30: buf0[0] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24; + buf0[1] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24; + buf0[2] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24; + buf0[3] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24; + buf1[0] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24; + buf1[1] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24; + buf1[2] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24; + buf1[3] |= tmp << 0 | tmp << 8; + break; + case 31: buf0[0] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24; + buf0[1] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24; + buf0[2] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24; + buf0[3] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24; + buf1[0] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24; + buf1[1] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24; + buf1[2] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24; + buf1[3] |= tmp << 0 | tmp << 8 | tmp << 16; + break; + } + + out_len += p0; + + return out_len; +} + +static u32 rule_op_mangle_dupechar_last (const u32 p0, const u32 p1, u32x buf0[4], u32x buf1[4], const u32 in_len) +{ + if ( in_len == 0) return (in_len); + if ((in_len + p0) >= 32) return (in_len); + + const u32 in_len1 = in_len - 1; + + const u32 sh = (in_len1 & 3) * 8; + + u32x tmp = 0; + + switch (in_len1 / 4) + { + case 0: tmp = (buf0[0] >> sh) & 0xff; break; + case 1: tmp = (buf0[1] >> sh) & 0xff; break; + case 2: tmp = (buf0[2] >> sh) & 0xff; break; + case 3: tmp = (buf0[3] >> sh) & 0xff; break; + case 4: tmp = (buf1[0] >> sh) & 0xff; break; + case 5: tmp = (buf1[1] >> sh) & 0xff; break; + case 6: tmp = (buf1[2] >> sh) & 0xff; break; + case 7: tmp = (buf1[3] >> sh) & 0xff; break; + } + + u32 out_len = in_len; + + for (u32 i = 0; i < p0; i++) + { + append_block1 (out_len, buf0, buf1, tmp); + + out_len++; + } + + return out_len; +} + +static u32 rule_op_mangle_dupechar_all (const u32 p0, const u32 p1, u32x buf0[4], u32x buf1[4], const u32 in_len) +{ + if ( in_len == 0) return (in_len); + if ((in_len + in_len) >= 32) return (in_len); + + u32 out_len = in_len; + + u32x tib40[4]; + u32x tib41[4]; + + tib40[0] = ((buf0[0] & 0x000000FF) << 0) | ((buf0[0] & 0x0000FF00) << 8); + tib40[1] = ((buf0[0] & 0x00FF0000) >> 16) | ((buf0[0] & 0xFF000000) >> 8); + tib40[2] = ((buf0[1] & 0x000000FF) << 0) | ((buf0[1] & 0x0000FF00) << 8); + tib40[3] = ((buf0[1] & 0x00FF0000) >> 16) | ((buf0[1] & 0xFF000000) >> 8); + tib41[0] = ((buf0[2] & 0x000000FF) << 0) | ((buf0[2] & 0x0000FF00) << 8); + tib41[1] = ((buf0[2] & 0x00FF0000) >> 16) | ((buf0[2] & 0xFF000000) >> 8); + tib41[2] = ((buf0[3] & 0x000000FF) << 0) | ((buf0[3] & 0x0000FF00) << 8); + tib41[3] = ((buf0[3] & 0x00FF0000) >> 16) | ((buf0[3] & 0xFF000000) >> 8); + + buf0[0] = tib40[0] | (tib40[0] << 8); + buf0[1] = tib40[1] | (tib40[1] << 8); + buf0[2] = tib40[2] | (tib40[2] << 8); + buf0[3] = tib40[3] | (tib40[3] << 8); + buf1[0] = tib41[0] | (tib41[0] << 8); + buf1[1] = tib41[1] | (tib41[1] << 8); + buf1[2] = tib41[2] | (tib41[2] << 8); + buf1[3] = tib41[3] | (tib41[3] << 8); + + out_len = out_len + out_len; + + return out_len; +} + +static u32 rule_op_mangle_switch_first (const u32 p0, const u32 p1, u32x buf0[4], u32x buf1[4], const u32 in_len) +{ + if (in_len < 2) return (in_len); + + buf0[0] = (buf0[0] & 0xFFFF0000) | ((buf0[0] << 8) & 0x0000FF00) | ((buf0[0] >> 8) & 0x000000FF); + + return in_len; +} + +static u32 rule_op_mangle_switch_last (const u32 p0, const u32 p1, u32x buf0[4], u32x buf1[4], const u32 in_len) +{ + if (in_len < 2) return (in_len); + + switch (in_len) + { + case 2: buf0[0] = ((buf0[0] << 8) & 0x0000FF00) | ((buf0[0] >> 8) & 0x000000FF); + break; + case 3: buf0[0] = (buf0[0] & 0x000000FF) | ((buf0[0] << 8) & 0x00FF0000) | ((buf0[0] >> 8) & 0x0000FF00); + break; + case 4: buf0[0] = (buf0[0] & 0x0000FFFF) | ((buf0[0] << 8) & 0xFF000000) | ((buf0[0] >> 8) & 0x00FF0000); + break; + case 5: buf0[1] = (buf0[0] & 0xFF000000) | buf0[1]; + buf0[0] = (buf0[0] & 0x00FFFFFF) | (buf0[1] << 24); + buf0[1] = (buf0[1] >> 24); + break; + case 6: buf0[1] = ((buf0[1] << 8) & 0x0000FF00) | ((buf0[1] >> 8) & 0x000000FF); + break; + case 7: buf0[1] = (buf0[1] & 0x000000FF) | ((buf0[1] << 8) & 0x00FF0000) | ((buf0[1] >> 8) & 0x0000FF00); + break; + case 8: buf0[1] = (buf0[1] & 0x0000FFFF) | ((buf0[1] << 8) & 0xFF000000) | ((buf0[1] >> 8) & 0x00FF0000); + break; + case 9: buf0[2] = (buf0[1] & 0xFF000000) | buf0[2]; + buf0[1] = (buf0[1] & 0x00FFFFFF) | (buf0[2] << 24); + buf0[2] = (buf0[2] >> 24); + break; + case 10: buf0[2] = ((buf0[2] << 8) & 0x0000FF00) | ((buf0[2] >> 8) & 0x000000FF); + break; + case 11: buf0[2] = (buf0[2] & 0x000000FF) | ((buf0[2] << 8) & 0x00FF0000) | ((buf0[2] >> 8) & 0x0000FF00); + break; + case 12: buf0[2] = (buf0[2] & 0x0000FFFF) | ((buf0[2] << 8) & 0xFF000000) | ((buf0[2] >> 8) & 0x00FF0000); + break; + case 13: buf0[3] = (buf0[2] & 0xFF000000) | buf0[3]; + buf0[2] = (buf0[2] & 0x00FFFFFF) | (buf0[3] << 24); + buf0[3] = (buf0[3] >> 24); + break; + case 14: buf0[3] = ((buf0[3] << 8) & 0x0000FF00) | ((buf0[3] >> 8) & 0x000000FF); + break; + case 15: buf0[3] = (buf0[3] & 0x000000FF) | ((buf0[3] << 8) & 0x00FF0000) | ((buf0[3] >> 8) & 0x0000FF00); + break; + case 16: buf0[3] = (buf0[3] & 0x0000FFFF) | ((buf0[3] << 8) & 0xFF000000) | ((buf0[3] >> 8) & 0x00FF0000); + break; + case 17: buf1[0] = (buf0[3] & 0xFF000000) | buf1[0]; + buf0[3] = (buf0[3] & 0x00FFFFFF) | (buf1[0] << 24); + buf1[0] = (buf1[0] >> 24); + break; + case 18: buf1[0] = ((buf1[0] << 8) & 0x0000FF00) | ((buf1[0] >> 8) & 0x000000FF); + break; + case 19: buf1[0] = (buf1[0] & 0x000000FF) | ((buf1[0] << 8) & 0x00FF0000) | ((buf1[0] >> 8) & 0x0000FF00); + break; + case 20: buf1[0] = (buf1[0] & 0x0000FFFF) | ((buf1[0] << 8) & 0xFF000000) | ((buf1[0] >> 8) & 0x00FF0000); + break; + case 21: buf1[1] = (buf1[0] & 0xFF000000) | buf1[1]; + buf1[0] = (buf1[0] & 0x00FFFFFF) | (buf1[1] << 24); + buf1[1] = (buf1[1] >> 24); + break; + case 22: buf1[1] = ((buf1[1] << 8) & 0x0000FF00) | ((buf1[1] >> 8) & 0x000000FF); + break; + case 23: buf1[1] = (buf1[1] & 0x000000FF) | ((buf1[1] << 8) & 0x00FF0000) | ((buf1[1] >> 8) & 0x0000FF00); + break; + case 24: buf1[1] = (buf1[1] & 0x0000FFFF) | ((buf1[1] << 8) & 0xFF000000) | ((buf1[1] >> 8) & 0x00FF0000); + break; + case 25: buf1[2] = (buf1[1] & 0xFF000000) | buf1[2]; + buf1[1] = (buf1[1] & 0x00FFFFFF) | (buf1[2] << 24); + buf1[2] = (buf1[2] >> 24); + break; + case 26: buf1[2] = ((buf1[2] << 8) & 0x0000FF00) | ((buf1[2] >> 8) & 0x000000FF); + break; + case 27: buf1[2] = (buf1[2] & 0x000000FF) | ((buf1[2] << 8) & 0x00FF0000) | ((buf1[2] >> 8) & 0x0000FF00); + break; + case 28: buf1[2] = (buf1[2] & 0x0000FFFF) | ((buf1[2] << 8) & 0xFF000000) | ((buf1[2] >> 8) & 0x00FF0000); + break; + case 29: buf1[3] = (buf1[2] & 0xFF000000) | buf1[3]; + buf1[2] = (buf1[2] & 0x00FFFFFF) | (buf1[3] << 24); + buf1[3] = (buf1[3] >> 24); + break; + case 30: buf1[3] = ((buf1[3] << 8) & 0x0000FF00) | ((buf1[3] >> 8) & 0x000000FF); + break; + case 31: buf1[3] = (buf1[3] & 0x000000FF) | ((buf1[3] << 8) & 0x00FF0000) | ((buf1[3] >> 8) & 0x0000FF00); + break; + } + + return in_len; +} + +static u32 rule_op_mangle_switch_at (const u32 p0, const u32 p1, u32x buf0[4], u32x buf1[4], const u32 in_len) +{ + if (p0 >= in_len) return (in_len); + if (p1 >= in_len) return (in_len); + + u32x tmp0 = 0; + u32x tmp1 = 0; + + switch (p0) + { + case 0: tmp0 = (buf0[0] >> 0) & 0xFF; + break; + case 1: tmp0 = (buf0[0] >> 8) & 0xFF; + break; + case 2: tmp0 = (buf0[0] >> 16) & 0xFF; + break; + case 3: tmp0 = (buf0[0] >> 24) & 0xFF; + break; + case 4: tmp0 = (buf0[1] >> 0) & 0xFF; + break; + case 5: tmp0 = (buf0[1] >> 8) & 0xFF; + break; + case 6: tmp0 = (buf0[1] >> 16) & 0xFF; + break; + case 7: tmp0 = (buf0[1] >> 24) & 0xFF; + break; + case 8: tmp0 = (buf0[2] >> 0) & 0xFF; + break; + case 9: tmp0 = (buf0[2] >> 8) & 0xFF; + break; + case 10: tmp0 = (buf0[2] >> 16) & 0xFF; + break; + case 11: tmp0 = (buf0[2] >> 24) & 0xFF; + break; + case 12: tmp0 = (buf0[3] >> 0) & 0xFF; + break; + case 13: tmp0 = (buf0[3] >> 8) & 0xFF; + break; + case 14: tmp0 = (buf0[3] >> 16) & 0xFF; + break; + case 15: tmp0 = (buf0[3] >> 24) & 0xFF; + break; + case 16: tmp0 = (buf1[0] >> 0) & 0xFF; + break; + case 17: tmp0 = (buf1[0] >> 8) & 0xFF; + break; + case 18: tmp0 = (buf1[0] >> 16) & 0xFF; + break; + case 19: tmp0 = (buf1[0] >> 24) & 0xFF; + break; + case 20: tmp0 = (buf1[1] >> 0) & 0xFF; + break; + case 21: tmp0 = (buf1[1] >> 8) & 0xFF; + break; + case 22: tmp0 = (buf1[1] >> 16) & 0xFF; + break; + case 23: tmp0 = (buf1[1] >> 24) & 0xFF; + break; + case 24: tmp0 = (buf1[2] >> 0) & 0xFF; + break; + case 25: tmp0 = (buf1[2] >> 8) & 0xFF; + break; + case 26: tmp0 = (buf1[2] >> 16) & 0xFF; + break; + case 27: tmp0 = (buf1[2] >> 24) & 0xFF; + break; + case 28: tmp0 = (buf1[3] >> 0) & 0xFF; + break; + case 29: tmp0 = (buf1[3] >> 8) & 0xFF; + break; + case 30: tmp0 = (buf1[3] >> 16) & 0xFF; + break; + case 31: tmp0 = (buf1[3] >> 24) & 0xFF; + break; + } + + switch (p1) + { + case 0: tmp1 = (buf0[0] >> 0) & 0xff; + buf0[0] = (buf0[0] & 0xffffff00) | tmp0 << 0; + break; + case 1: tmp1 = (buf0[0] >> 8) & 0xff; + buf0[0] = (buf0[0] & 0xffff00ff) | tmp0 << 8; + break; + case 2: tmp1 = (buf0[0] >> 16) & 0xff; + buf0[0] = (buf0[0] & 0xff00ffff) | tmp0 << 16; + break; + case 3: tmp1 = (buf0[0] >> 24) & 0xff; + buf0[0] = (buf0[0] & 0x00ffffff) | tmp0 << 24; + break; + case 4: tmp1 = (buf0[1] >> 0) & 0xff; + buf0[1] = (buf0[1] & 0xffffff00) | tmp0 << 0; + break; + case 5: tmp1 = (buf0[1] >> 8) & 0xff; + buf0[1] = (buf0[1] & 0xffff00ff) | tmp0 << 8; + break; + case 6: tmp1 = (buf0[1] >> 16) & 0xff; + buf0[1] = (buf0[1] & 0xff00ffff) | tmp0 << 16; + break; + case 7: tmp1 = (buf0[1] >> 24) & 0xff; + buf0[1] = (buf0[1] & 0x00ffffff) | tmp0 << 24; + break; + case 8: tmp1 = (buf0[2] >> 0) & 0xff; + buf0[2] = (buf0[2] & 0xffffff00) | tmp0 << 0; + break; + case 9: tmp1 = (buf0[2] >> 8) & 0xff; + buf0[2] = (buf0[2] & 0xffff00ff) | tmp0 << 8; + break; + case 10: tmp1 = (buf0[2] >> 16) & 0xff; + buf0[2] = (buf0[2] & 0xff00ffff) | tmp0 << 16; + break; + case 11: tmp1 = (buf0[2] >> 24) & 0xff; + buf0[2] = (buf0[2] & 0x00ffffff) | tmp0 << 24; + break; + case 12: tmp1 = (buf0[3] >> 0) & 0xff; + buf0[3] = (buf0[3] & 0xffffff00) | tmp0 << 0; + break; + case 13: tmp1 = (buf0[3] >> 8) & 0xff; + buf0[3] = (buf0[3] & 0xffff00ff) | tmp0 << 8; + break; + case 14: tmp1 = (buf0[3] >> 16) & 0xff; + buf0[3] = (buf0[3] & 0xff00ffff) | tmp0 << 16; + break; + case 15: tmp1 = (buf0[3] >> 24) & 0xff; + buf0[3] = (buf0[3] & 0x00ffffff) | tmp0 << 24; + break; + case 16: tmp1 = (buf1[0] >> 0) & 0xff; + buf1[0] = (buf1[0] & 0xffffff00) | tmp0 << 0; + break; + case 17: tmp1 = (buf1[0] >> 8) & 0xff; + buf1[0] = (buf1[0] & 0xffff00ff) | tmp0 << 8; + break; + case 18: tmp1 = (buf1[0] >> 16) & 0xff; + buf1[0] = (buf1[0] & 0xff00ffff) | tmp0 << 16; + break; + case 19: tmp1 = (buf1[0] >> 24) & 0xff; + buf1[0] = (buf1[0] & 0x00ffffff) | tmp0 << 24; + break; + case 20: tmp1 = (buf1[1] >> 0) & 0xff; + buf1[1] = (buf1[1] & 0xffffff00) | tmp0 << 0; + break; + case 21: tmp1 = (buf1[1] >> 8) & 0xff; + buf1[1] = (buf1[1] & 0xffff00ff) | tmp0 << 8; + break; + case 22: tmp1 = (buf1[1] >> 16) & 0xff; + buf1[1] = (buf1[1] & 0xff00ffff) | tmp0 << 16; + break; + case 23: tmp1 = (buf1[1] >> 24) & 0xff; + buf1[1] = (buf1[1] & 0x00ffffff) | tmp0 << 24; + break; + case 24: tmp1 = (buf1[2] >> 0) & 0xff; + buf1[2] = (buf1[2] & 0xffffff00) | tmp0 << 0; + break; + case 25: tmp1 = (buf1[2] >> 8) & 0xff; + buf1[2] = (buf1[2] & 0xffff00ff) | tmp0 << 8; + break; + case 26: tmp1 = (buf1[2] >> 16) & 0xff; + buf1[2] = (buf1[2] & 0xff00ffff) | tmp0 << 16; + break; + case 27: tmp1 = (buf1[2] >> 24) & 0xff; + buf1[2] = (buf1[2] & 0x00ffffff) | tmp0 << 24; + break; + case 28: tmp1 = (buf1[3] >> 0) & 0xff; + buf1[3] = (buf1[3] & 0xffffff00) | tmp0 << 0; + break; + case 29: tmp1 = (buf1[3] >> 8) & 0xff; + buf1[3] = (buf1[3] & 0xffff00ff) | tmp0 << 8; + break; + case 30: tmp1 = (buf1[3] >> 16) & 0xff; + buf1[3] = (buf1[3] & 0xff00ffff) | tmp0 << 16; + break; + case 31: tmp1 = (buf1[3] >> 24) & 0xff; + buf1[3] = (buf1[3] & 0x00ffffff) | tmp0 << 24; + break; + } + + switch (p0) + { + case 0: buf0[0] = (buf0[0] & 0xffffff00) | tmp1 << 0; + break; + case 1: buf0[0] = (buf0[0] & 0xffff00ff) | tmp1 << 8; + break; + case 2: buf0[0] = (buf0[0] & 0xff00ffff) | tmp1 << 16; + break; + case 3: buf0[0] = (buf0[0] & 0x00ffffff) | tmp1 << 24; + break; + case 4: buf0[1] = (buf0[1] & 0xffffff00) | tmp1 << 0; + break; + case 5: buf0[1] = (buf0[1] & 0xffff00ff) | tmp1 << 8; + break; + case 6: buf0[1] = (buf0[1] & 0xff00ffff) | tmp1 << 16; + break; + case 7: buf0[1] = (buf0[1] & 0x00ffffff) | tmp1 << 24; + break; + case 8: buf0[2] = (buf0[2] & 0xffffff00) | tmp1 << 0; + break; + case 9: buf0[2] = (buf0[2] & 0xffff00ff) | tmp1 << 8; + break; + case 10: buf0[2] = (buf0[2] & 0xff00ffff) | tmp1 << 16; + break; + case 11: buf0[2] = (buf0[2] & 0x00ffffff) | tmp1 << 24; + break; + case 12: buf0[3] = (buf0[3] & 0xffffff00) | tmp1 << 0; + break; + case 13: buf0[3] = (buf0[3] & 0xffff00ff) | tmp1 << 8; + break; + case 14: buf0[3] = (buf0[3] & 0xff00ffff) | tmp1 << 16; + break; + case 15: buf0[3] = (buf0[3] & 0x00ffffff) | tmp1 << 24; + break; + case 16: buf1[0] = (buf1[0] & 0xffffff00) | tmp1 << 0; + break; + case 17: buf1[0] = (buf1[0] & 0xffff00ff) | tmp1 << 8; + break; + case 18: buf1[0] = (buf1[0] & 0xff00ffff) | tmp1 << 16; + break; + case 19: buf1[0] = (buf1[0] & 0x00ffffff) | tmp1 << 24; + break; + case 20: buf1[1] = (buf1[1] & 0xffffff00) | tmp1 << 0; + break; + case 21: buf1[1] = (buf1[1] & 0xffff00ff) | tmp1 << 8; + break; + case 22: buf1[1] = (buf1[1] & 0xff00ffff) | tmp1 << 16; + break; + case 23: buf1[1] = (buf1[1] & 0x00ffffff) | tmp1 << 24; + break; + case 24: buf1[2] = (buf1[2] & 0xffffff00) | tmp1 << 0; + break; + case 25: buf1[2] = (buf1[2] & 0xffff00ff) | tmp1 << 8; + break; + case 26: buf1[2] = (buf1[2] & 0xff00ffff) | tmp1 << 16; + break; + case 27: buf1[2] = (buf1[2] & 0x00ffffff) | tmp1 << 24; + break; + case 28: buf1[3] = (buf1[3] & 0xffffff00) | tmp1 << 0; + break; + case 29: buf1[3] = (buf1[3] & 0xffff00ff) | tmp1 << 8; + break; + case 30: buf1[3] = (buf1[3] & 0xff00ffff) | tmp1 << 16; + break; + case 31: buf1[3] = (buf1[3] & 0x00ffffff) | tmp1 << 24; + break; + } + + return in_len; +} + +static u32 rule_op_mangle_chr_shiftl (const u32 p0, const u32 p1, u32x buf0[4], u32x buf1[4], const u32 in_len) +{ + if (p0 >= in_len) return (in_len); + + const u32 mr = 0xff << ((p0 & 3) * 8); + const u32 ml = ~mr; + + switch (p0 / 4) + { + case 0: buf0[0] = (buf0[0] & ml) | (((buf0[0] & mr) << 1) & mr); break; + case 1: buf0[1] = (buf0[1] & ml) | (((buf0[1] & mr) << 1) & mr); break; + case 2: buf0[2] = (buf0[2] & ml) | (((buf0[2] & mr) << 1) & mr); break; + case 3: buf0[3] = (buf0[3] & ml) | (((buf0[3] & mr) << 1) & mr); break; + case 4: buf1[0] = (buf1[0] & ml) | (((buf1[0] & mr) << 1) & mr); break; + case 5: buf1[1] = (buf1[1] & ml) | (((buf1[1] & mr) << 1) & mr); break; + case 6: buf1[2] = (buf1[2] & ml) | (((buf1[2] & mr) << 1) & mr); break; + case 7: buf1[3] = (buf1[3] & ml) | (((buf1[3] & mr) << 1) & mr); break; + } + + return in_len; +} + +static u32 rule_op_mangle_chr_shiftr (const u32 p0, const u32 p1, u32x buf0[4], u32x buf1[4], const u32 in_len) +{ + if (p0 >= in_len) return (in_len); + + const u32 mr = 0xff << ((p0 & 3) * 8); + const u32 ml = ~mr; + + switch (p0 / 4) + { + case 0: buf0[0] = (buf0[0] & ml) | (((buf0[0] & mr) >> 1) & mr); break; + case 1: buf0[1] = (buf0[1] & ml) | (((buf0[1] & mr) >> 1) & mr); break; + case 2: buf0[2] = (buf0[2] & ml) | (((buf0[2] & mr) >> 1) & mr); break; + case 3: buf0[3] = (buf0[3] & ml) | (((buf0[3] & mr) >> 1) & mr); break; + case 4: buf1[0] = (buf1[0] & ml) | (((buf1[0] & mr) >> 1) & mr); break; + case 5: buf1[1] = (buf1[1] & ml) | (((buf1[1] & mr) >> 1) & mr); break; + case 6: buf1[2] = (buf1[2] & ml) | (((buf1[2] & mr) >> 1) & mr); break; + case 7: buf1[3] = (buf1[3] & ml) | (((buf1[3] & mr) >> 1) & mr); break; + } + + return in_len; +} + +static u32 rule_op_mangle_chr_incr (const u32 p0, const u32 p1, u32x buf0[4], u32x buf1[4], const u32 in_len) +{ + if (p0 >= in_len) return (in_len); + + const u32 mr = 0xff << ((p0 & 3) * 8); + const u32 ml = ~mr; + + const u32 n = 0x01010101 & mr; + + switch (p0 / 4) + { + case 0: buf0[0] = (buf0[0] & ml) | (((buf0[0] & mr) + n) & mr); break; + case 1: buf0[1] = (buf0[1] & ml) | (((buf0[1] & mr) + n) & mr); break; + case 2: buf0[2] = (buf0[2] & ml) | (((buf0[2] & mr) + n) & mr); break; + case 3: buf0[3] = (buf0[3] & ml) | (((buf0[3] & mr) + n) & mr); break; + case 4: buf1[0] = (buf1[0] & ml) | (((buf1[0] & mr) + n) & mr); break; + case 5: buf1[1] = (buf1[1] & ml) | (((buf1[1] & mr) + n) & mr); break; + case 6: buf1[2] = (buf1[2] & ml) | (((buf1[2] & mr) + n) & mr); break; + case 7: buf1[3] = (buf1[3] & ml) | (((buf1[3] & mr) + n) & mr); break; + } + + return in_len; +} + +static u32 rule_op_mangle_chr_decr (const u32 p0, const u32 p1, u32x buf0[4], u32x buf1[4], const u32 in_len) +{ + if (p0 >= in_len) return (in_len); + + const u32 mr = 0xff << ((p0 & 3) * 8); + const u32 ml = ~mr; + + const u32 n = 0x01010101 & mr; + + switch (p0 / 4) + { + case 0: buf0[0] = (buf0[0] & ml) | (((buf0[0] & mr) - n) & mr); break; + case 1: buf0[1] = (buf0[1] & ml) | (((buf0[1] & mr) - n) & mr); break; + case 2: buf0[2] = (buf0[2] & ml) | (((buf0[2] & mr) - n) & mr); break; + case 3: buf0[3] = (buf0[3] & ml) | (((buf0[3] & mr) - n) & mr); break; + case 4: buf1[0] = (buf1[0] & ml) | (((buf1[0] & mr) - n) & mr); break; + case 5: buf1[1] = (buf1[1] & ml) | (((buf1[1] & mr) - n) & mr); break; + case 6: buf1[2] = (buf1[2] & ml) | (((buf1[2] & mr) - n) & mr); break; + case 7: buf1[3] = (buf1[3] & ml) | (((buf1[3] & mr) - n) & mr); break; + } + + return in_len; +} + +static u32 rule_op_mangle_replace_np1 (const u32 p0, const u32 p1, u32x buf0[4], u32x buf1[4], const u32 in_len) +{ + if ((p0 + 1) >= in_len) return (in_len); + + u32x tib40[4]; + u32x tib41[4]; + + lshift_block (buf0, buf1, tib40, tib41); + + const u32 mr = 0xff << ((p0 & 3) * 8); + const u32 ml = ~mr; + + switch (p0 / 4) + { + case 0: buf0[0] = (buf0[0] & ml) | (tib40[0] & mr); break; + case 1: buf0[1] = (buf0[1] & ml) | (tib40[1] & mr); break; + case 2: buf0[2] = (buf0[2] & ml) | (tib40[2] & mr); break; + case 3: buf0[3] = (buf0[3] & ml) | (tib40[3] & mr); break; + case 4: buf1[0] = (buf1[0] & ml) | (tib41[0] & mr); break; + case 5: buf1[1] = (buf1[1] & ml) | (tib41[1] & mr); break; + case 6: buf1[2] = (buf1[2] & ml) | (tib41[2] & mr); break; + case 7: buf1[3] = (buf1[3] & ml) | (tib41[3] & mr); break; + } + + return in_len; +} + +static u32 rule_op_mangle_replace_nm1 (const u32 p0, const u32 p1, u32x buf0[4], u32x buf1[4], const u32 in_len) +{ + if (p0 == 0) return (in_len); + + if (p0 >= in_len) return (in_len); + + u32x tib40[4]; + u32x tib41[4]; + + rshift_block (buf0, buf1, tib40, tib41); + + const u32 mr = 0xff << ((p0 & 3) * 8); + const u32 ml = ~mr; + + switch (p0 / 4) + { + case 0: buf0[0] = (buf0[0] & ml) | (tib40[0] & mr); break; + case 1: buf0[1] = (buf0[1] & ml) | (tib40[1] & mr); break; + case 2: buf0[2] = (buf0[2] & ml) | (tib40[2] & mr); break; + case 3: buf0[3] = (buf0[3] & ml) | (tib40[3] & mr); break; + case 4: buf1[0] = (buf1[0] & ml) | (tib41[0] & mr); break; + case 5: buf1[1] = (buf1[1] & ml) | (tib41[1] & mr); break; + case 6: buf1[2] = (buf1[2] & ml) | (tib41[2] & mr); break; + case 7: buf1[3] = (buf1[3] & ml) | (tib41[3] & mr); break; + } + + return in_len; +} + +static u32 rule_op_mangle_dupeblock_first (const u32 p0, const u32 p1, u32x buf0[4], u32x buf1[4], const u32 in_len) +{ + if (p0 > in_len) return (in_len); + + if ((in_len + p0) >= 32) return (in_len); + + u32 out_len = in_len; + + u32x tib40[4]; + u32x tib41[4]; + + tib40[0] = buf0[0]; + tib40[1] = buf0[1]; + tib40[2] = buf0[2]; + tib40[3] = buf0[3]; + tib41[0] = buf1[0]; + tib41[1] = buf1[1]; + tib41[2] = buf1[2]; + tib41[3] = buf1[3]; + + truncate_right (tib40, tib41, p0); + + rshift_block_N (buf0, buf1, buf0, buf1, p0); + + buf0[0] |= tib40[0]; + buf0[1] |= tib40[1]; + buf0[2] |= tib40[2]; + buf0[3] |= tib40[3]; + buf1[0] |= tib41[0]; + buf1[1] |= tib41[1]; + buf1[2] |= tib41[2]; + buf1[3] |= tib41[3]; + + out_len += p0; + + return out_len; +} + +static u32 rule_op_mangle_dupeblock_last (const u32 p0, const u32 p1, u32x buf0[4], u32x buf1[4], const u32 in_len) +{ + if (p0 > in_len) return (in_len); + + if ((in_len + p0) >= 32) return (in_len); + + u32 out_len = in_len; + + u32x tib40[4]; + u32x tib41[4]; + + rshift_block_N (buf0, buf1, tib40, tib41, p0); + + truncate_left (tib40, tib41, out_len); + + buf0[0] |= tib40[0]; + buf0[1] |= tib40[1]; + buf0[2] |= tib40[2]; + buf0[3] |= tib40[3]; + buf1[0] |= tib41[0]; + buf1[1] |= tib41[1]; + buf1[2] |= tib41[2]; + buf1[3] |= tib41[3]; + + out_len += p0; + + return out_len; +} + +static u32 rule_op_mangle_title (const u32 p0, const u32 p1, u32x buf0[4], u32x buf1[4], const u32 in_len) +{ + buf0[0] |= (generate_cmask (buf0[0])); + buf0[1] |= (generate_cmask (buf0[1])); + buf0[2] |= (generate_cmask (buf0[2])); + buf0[3] |= (generate_cmask (buf0[3])); + buf1[0] |= (generate_cmask (buf1[0])); + buf1[1] |= (generate_cmask (buf1[1])); + buf1[2] |= (generate_cmask (buf1[2])); + buf1[3] |= (generate_cmask (buf1[3])); + + #ifdef VECT_SIZE1 + + u32x tib40[4]; + u32x tib41[4]; + + const uchar4 tmp0 = (uchar4) (' '); + const uchar4 tmp1 = (uchar4) (0x00); + const uchar4 tmp2 = (uchar4) (0xff); + + uchar4 tmp; + + tmp = as_uchar4 (buf0[0]); tmp = select (tmp1, tmp2, tmp == tmp0); tib40[0] = as_uint (tmp); + tmp = as_uchar4 (buf0[1]); tmp = select (tmp1, tmp2, tmp == tmp0); tib40[1] = as_uint (tmp); + tmp = as_uchar4 (buf0[2]); tmp = select (tmp1, tmp2, tmp == tmp0); tib40[2] = as_uint (tmp); + tmp = as_uchar4 (buf0[3]); tmp = select (tmp1, tmp2, tmp == tmp0); tib40[3] = as_uint (tmp); + tmp = as_uchar4 (buf1[0]); tmp = select (tmp1, tmp2, tmp == tmp0); tib41[0] = as_uint (tmp); + tmp = as_uchar4 (buf1[1]); tmp = select (tmp1, tmp2, tmp == tmp0); tib41[1] = as_uint (tmp); + tmp = as_uchar4 (buf1[2]); tmp = select (tmp1, tmp2, tmp == tmp0); tib41[2] = as_uint (tmp); + tmp = as_uchar4 (buf1[3]); tmp = select (tmp1, tmp2, tmp == tmp0); tib41[3] = as_uint (tmp); + + rshift_block (tib40, tib41, tib40, tib41); tib40[0] |= 0xff; + + buf0[0] &= ~(generate_cmask (buf0[0]) & tib40[0]); + buf0[1] &= ~(generate_cmask (buf0[1]) & tib40[1]); + buf0[2] &= ~(generate_cmask (buf0[2]) & tib40[2]); + buf0[3] &= ~(generate_cmask (buf0[3]) & tib40[3]); + buf1[0] &= ~(generate_cmask (buf1[0]) & tib41[0]); + buf1[1] &= ~(generate_cmask (buf1[1]) & tib41[1]); + buf1[2] &= ~(generate_cmask (buf1[2]) & tib41[2]); + buf1[3] &= ~(generate_cmask (buf1[3]) & tib41[3]); + + #else + + buf0[0] &= ~(0x00000020 & generate_cmask (buf0[0])); + + // The VLIW1 code above freezes VLIW4 and VLIW5 systems + + for (u32 i = 0; i < in_len; i++) + { + u32x tmp0; + u32x tmp1; + + switch (i) + { + case 0: tmp0 = (buf0[0] >> 0) & 0xFF; + tmp1 = ~(0x00002000 & generate_cmask (buf0[0])); break; + case 1: tmp0 = (buf0[0] >> 8) & 0xFF; + tmp1 = ~(0x00200000 & generate_cmask (buf0[0])); break; + case 2: tmp0 = (buf0[0] >> 16) & 0xFF; + tmp1 = ~(0x20000000 & generate_cmask (buf0[0])); break; + case 3: tmp0 = (buf0[0] >> 24) & 0xFF; + tmp1 = ~(0x00000020 & generate_cmask (buf0[1])); break; + case 4: tmp0 = (buf0[1] >> 0) & 0xFF; + tmp1 = ~(0x00002000 & generate_cmask (buf0[1])); break; + case 5: tmp0 = (buf0[1] >> 8) & 0xFF; + tmp1 = ~(0x00200000 & generate_cmask (buf0[1])); break; + case 6: tmp0 = (buf0[1] >> 16) & 0xFF; + tmp1 = ~(0x20000000 & generate_cmask (buf0[1])); break; + case 7: tmp0 = (buf0[1] >> 24) & 0xFF; + tmp1 = ~(0x00000020 & generate_cmask (buf0[2])); break; + case 8: tmp0 = (buf0[2] >> 0) & 0xFF; + tmp1 = ~(0x00002000 & generate_cmask (buf0[2])); break; + case 9: tmp0 = (buf0[2] >> 8) & 0xFF; + tmp1 = ~(0x00200000 & generate_cmask (buf0[2])); break; + case 10: tmp0 = (buf0[2] >> 16) & 0xFF; + tmp1 = ~(0x20000000 & generate_cmask (buf0[2])); break; + case 11: tmp0 = (buf0[2] >> 24) & 0xFF; + tmp1 = ~(0x00000020 & generate_cmask (buf0[3])); break; + case 12: tmp0 = (buf0[3] >> 0) & 0xFF; + tmp1 = ~(0x00002000 & generate_cmask (buf0[3])); break; + case 13: tmp0 = (buf0[3] >> 8) & 0xFF; + tmp1 = ~(0x00200000 & generate_cmask (buf0[3])); break; + case 14: tmp0 = (buf0[3] >> 16) & 0xFF; + tmp1 = ~(0x20000000 & generate_cmask (buf0[3])); break; + case 15: tmp0 = (buf0[3] >> 24) & 0xFF; + tmp1 = ~(0x00000020 & generate_cmask (buf1[0])); break; + case 16: tmp0 = (buf1[0] >> 0) & 0xFF; + tmp1 = ~(0x00002000 & generate_cmask (buf1[0])); break; + case 17: tmp0 = (buf1[0] >> 8) & 0xFF; + tmp1 = ~(0x00200000 & generate_cmask (buf1[0])); break; + case 18: tmp0 = (buf1[0] >> 16) & 0xFF; + tmp1 = ~(0x20000000 & generate_cmask (buf1[0])); break; + case 19: tmp0 = (buf1[0] >> 24) & 0xFF; + tmp1 = ~(0x00000020 & generate_cmask (buf1[1])); break; + case 20: tmp0 = (buf1[1] >> 0) & 0xFF; + tmp1 = ~(0x00002000 & generate_cmask (buf1[1])); break; + case 21: tmp0 = (buf1[1] >> 8) & 0xFF; + tmp1 = ~(0x00200000 & generate_cmask (buf1[1])); break; + case 22: tmp0 = (buf1[1] >> 16) & 0xFF; + tmp1 = ~(0x20000000 & generate_cmask (buf1[1])); break; + case 23: tmp0 = (buf1[1] >> 24) & 0xFF; + tmp1 = ~(0x00000020 & generate_cmask (buf1[2])); break; + case 24: tmp0 = (buf1[2] >> 0) & 0xFF; + tmp1 = ~(0x00002000 & generate_cmask (buf1[2])); break; + case 25: tmp0 = (buf1[2] >> 8) & 0xFF; + tmp1 = ~(0x00200000 & generate_cmask (buf1[2])); break; + case 26: tmp0 = (buf1[2] >> 16) & 0xFF; + tmp1 = ~(0x20000000 & generate_cmask (buf1[2])); break; + case 27: tmp0 = (buf1[2] >> 24) & 0xFF; + tmp1 = ~(0x00000020 & generate_cmask (buf1[3])); break; + case 28: tmp0 = (buf1[3] >> 0) & 0xFF; + tmp1 = ~(0x00002000 & generate_cmask (buf1[3])); break; + case 29: tmp0 = (buf1[3] >> 8) & 0xFF; + tmp1 = ~(0x00200000 & generate_cmask (buf1[3])); break; + case 30: tmp0 = (buf1[3] >> 16) & 0xFF; + tmp1 = ~(0x20000000 & generate_cmask (buf1[3])); break; + } + + #ifdef VECT_SIZE2 + if (i < 3) + { + if (tmp0.s0 == ' ') buf0[0].s0 &= tmp1.s0; + if (tmp0.s1 == ' ') buf0[0].s1 &= tmp1.s1; + } + else if (i < 7) + { + if (tmp0.s0 == ' ') buf0[1].s0 &= tmp1.s0; + if (tmp0.s1 == ' ') buf0[1].s1 &= tmp1.s1; + } + else if (i < 11) + { + if (tmp0.s0 == ' ') buf0[2].s0 &= tmp1.s0; + if (tmp0.s1 == ' ') buf0[2].s1 &= tmp1.s1; + } + else if (i < 15) + { + if (tmp0.s0 == ' ') buf0[3].s0 &= tmp1.s0; + if (tmp0.s1 == ' ') buf0[3].s1 &= tmp1.s1; + } + else if (i < 19) + { + if (tmp0.s0 == ' ') buf1[0].s0 &= tmp1.s0; + if (tmp0.s1 == ' ') buf1[0].s1 &= tmp1.s1; + } + else if (i < 23) + { + if (tmp0.s0 == ' ') buf1[1].s0 &= tmp1.s0; + if (tmp0.s1 == ' ') buf1[1].s1 &= tmp1.s1; + } + else if (i < 27) + { + if (tmp0.s0 == ' ') buf1[2].s0 &= tmp1.s0; + if (tmp0.s1 == ' ') buf1[2].s1 &= tmp1.s1; + } + else if (i < 31) + { + if (tmp0.s0 == ' ') buf1[3].s0 &= tmp1.s0; + if (tmp0.s1 == ' ') buf1[3].s1 &= tmp1.s1; + } + #endif + + #ifdef VECT_SIZE4 + if (i < 3) + { + if (tmp0.s0 == ' ') buf0[0].s0 &= tmp1.s0; + if (tmp0.s1 == ' ') buf0[0].s1 &= tmp1.s1; + if (tmp0.s2 == ' ') buf0[0].s2 &= tmp1.s2; + if (tmp0.s3 == ' ') buf0[0].s3 &= tmp1.s3; + } + else if (i < 7) + { + if (tmp0.s0 == ' ') buf0[1].s0 &= tmp1.s0; + if (tmp0.s1 == ' ') buf0[1].s1 &= tmp1.s1; + if (tmp0.s2 == ' ') buf0[1].s2 &= tmp1.s2; + if (tmp0.s3 == ' ') buf0[1].s3 &= tmp1.s3; + } + else if (i < 11) + { + if (tmp0.s0 == ' ') buf0[2].s0 &= tmp1.s0; + if (tmp0.s1 == ' ') buf0[2].s1 &= tmp1.s1; + if (tmp0.s2 == ' ') buf0[2].s2 &= tmp1.s2; + if (tmp0.s3 == ' ') buf0[2].s3 &= tmp1.s3; + } + else if (i < 15) + { + if (tmp0.s0 == ' ') buf0[3].s0 &= tmp1.s0; + if (tmp0.s1 == ' ') buf0[3].s1 &= tmp1.s1; + if (tmp0.s2 == ' ') buf0[3].s2 &= tmp1.s2; + if (tmp0.s3 == ' ') buf0[3].s3 &= tmp1.s3; + } + else if (i < 19) + { + if (tmp0.s0 == ' ') buf1[0].s0 &= tmp1.s0; + if (tmp0.s1 == ' ') buf1[0].s1 &= tmp1.s1; + if (tmp0.s2 == ' ') buf1[0].s2 &= tmp1.s2; + if (tmp0.s3 == ' ') buf1[0].s3 &= tmp1.s3; + } + else if (i < 23) + { + if (tmp0.s0 == ' ') buf1[1].s0 &= tmp1.s0; + if (tmp0.s1 == ' ') buf1[1].s1 &= tmp1.s1; + if (tmp0.s2 == ' ') buf1[1].s2 &= tmp1.s2; + if (tmp0.s3 == ' ') buf1[1].s3 &= tmp1.s3; + } + else if (i < 27) + { + if (tmp0.s0 == ' ') buf1[2].s0 &= tmp1.s0; + if (tmp0.s1 == ' ') buf1[2].s1 &= tmp1.s1; + if (tmp0.s2 == ' ') buf1[2].s2 &= tmp1.s2; + if (tmp0.s3 == ' ') buf1[2].s3 &= tmp1.s3; + } + else if (i < 31) + { + if (tmp0.s0 == ' ') buf1[3].s0 &= tmp1.s0; + if (tmp0.s1 == ' ') buf1[3].s1 &= tmp1.s1; + if (tmp0.s2 == ' ') buf1[3].s2 &= tmp1.s2; + if (tmp0.s3 == ' ') buf1[3].s3 &= tmp1.s3; + } + #endif + } + + #endif + + return in_len; +} + +u32 apply_rule (const u32 name, const u32 p0, const u32 p1, u32x buf0[4], u32x buf1[4], const u32 in_len) +{ + u32 out_len = in_len; + + switch (name) + { + case RULE_OP_MANGLE_LREST: out_len = rule_op_mangle_lrest (p0, p1, buf0, buf1, out_len); break; + case RULE_OP_MANGLE_UREST: out_len = rule_op_mangle_urest (p0, p1, buf0, buf1, out_len); break; + case RULE_OP_MANGLE_LREST_UFIRST: out_len = rule_op_mangle_lrest_ufirst (p0, p1, buf0, buf1, out_len); break; + case RULE_OP_MANGLE_UREST_LFIRST: out_len = rule_op_mangle_urest_lfirst (p0, p1, buf0, buf1, out_len); break; + case RULE_OP_MANGLE_TREST: out_len = rule_op_mangle_trest (p0, p1, buf0, buf1, out_len); break; + case RULE_OP_MANGLE_TOGGLE_AT: out_len = rule_op_mangle_toggle_at (p0, p1, buf0, buf1, out_len); break; + case RULE_OP_MANGLE_REVERSE: out_len = rule_op_mangle_reverse (p0, p1, buf0, buf1, out_len); break; + case RULE_OP_MANGLE_DUPEWORD: out_len = rule_op_mangle_dupeword (p0, p1, buf0, buf1, out_len); break; + case RULE_OP_MANGLE_DUPEWORD_TIMES: out_len = rule_op_mangle_dupeword_times (p0, p1, buf0, buf1, out_len); break; + case RULE_OP_MANGLE_REFLECT: out_len = rule_op_mangle_reflect (p0, p1, buf0, buf1, out_len); break; + case RULE_OP_MANGLE_APPEND: out_len = rule_op_mangle_append (p0, p1, buf0, buf1, out_len); break; + case RULE_OP_MANGLE_PREPEND: out_len = rule_op_mangle_prepend (p0, p1, buf0, buf1, out_len); break; + case RULE_OP_MANGLE_ROTATE_LEFT: out_len = rule_op_mangle_rotate_left (p0, p1, buf0, buf1, out_len); break; + case RULE_OP_MANGLE_ROTATE_RIGHT: out_len = rule_op_mangle_rotate_right (p0, p1, buf0, buf1, out_len); break; + case RULE_OP_MANGLE_DELETE_FIRST: out_len = rule_op_mangle_delete_first (p0, p1, buf0, buf1, out_len); break; + case RULE_OP_MANGLE_DELETE_LAST: out_len = rule_op_mangle_delete_last (p0, p1, buf0, buf1, out_len); break; + case RULE_OP_MANGLE_DELETE_AT: out_len = rule_op_mangle_delete_at (p0, p1, buf0, buf1, out_len); break; + case RULE_OP_MANGLE_EXTRACT: out_len = rule_op_mangle_extract (p0, p1, buf0, buf1, out_len); break; + case RULE_OP_MANGLE_OMIT: out_len = rule_op_mangle_omit (p0, p1, buf0, buf1, out_len); break; + case RULE_OP_MANGLE_INSERT: out_len = rule_op_mangle_insert (p0, p1, buf0, buf1, out_len); break; + case RULE_OP_MANGLE_OVERSTRIKE: out_len = rule_op_mangle_overstrike (p0, p1, buf0, buf1, out_len); break; + case RULE_OP_MANGLE_TRUNCATE_AT: out_len = rule_op_mangle_truncate_at (p0, p1, buf0, buf1, out_len); break; + case RULE_OP_MANGLE_REPLACE: out_len = rule_op_mangle_replace (p0, p1, buf0, buf1, out_len); break; + //case RULE_OP_MANGLE_PURGECHAR: out_len = rule_op_mangle_purgechar (p0, p1, buf0, buf1, out_len); break; + //case RULE_OP_MANGLE_TOGGLECASE_REC: out_len = rule_op_mangle_togglecase_rec (p0, p1, buf0, buf1, out_len); break; + case RULE_OP_MANGLE_DUPECHAR_FIRST: out_len = rule_op_mangle_dupechar_first (p0, p1, buf0, buf1, out_len); break; + case RULE_OP_MANGLE_DUPECHAR_LAST: out_len = rule_op_mangle_dupechar_last (p0, p1, buf0, buf1, out_len); break; + case RULE_OP_MANGLE_DUPECHAR_ALL: out_len = rule_op_mangle_dupechar_all (p0, p1, buf0, buf1, out_len); break; + case RULE_OP_MANGLE_SWITCH_FIRST: out_len = rule_op_mangle_switch_first (p0, p1, buf0, buf1, out_len); break; + case RULE_OP_MANGLE_SWITCH_LAST: out_len = rule_op_mangle_switch_last (p0, p1, buf0, buf1, out_len); break; + case RULE_OP_MANGLE_SWITCH_AT: out_len = rule_op_mangle_switch_at (p0, p1, buf0, buf1, out_len); break; + case RULE_OP_MANGLE_CHR_SHIFTL: out_len = rule_op_mangle_chr_shiftl (p0, p1, buf0, buf1, out_len); break; + case RULE_OP_MANGLE_CHR_SHIFTR: out_len = rule_op_mangle_chr_shiftr (p0, p1, buf0, buf1, out_len); break; + case RULE_OP_MANGLE_CHR_INCR: out_len = rule_op_mangle_chr_incr (p0, p1, buf0, buf1, out_len); break; + case RULE_OP_MANGLE_CHR_DECR: out_len = rule_op_mangle_chr_decr (p0, p1, buf0, buf1, out_len); break; + case RULE_OP_MANGLE_REPLACE_NP1: out_len = rule_op_mangle_replace_np1 (p0, p1, buf0, buf1, out_len); break; + case RULE_OP_MANGLE_REPLACE_NM1: out_len = rule_op_mangle_replace_nm1 (p0, p1, buf0, buf1, out_len); break; + case RULE_OP_MANGLE_DUPEBLOCK_FIRST: out_len = rule_op_mangle_dupeblock_first (p0, p1, buf0, buf1, out_len); break; + case RULE_OP_MANGLE_DUPEBLOCK_LAST: out_len = rule_op_mangle_dupeblock_last (p0, p1, buf0, buf1, out_len); break; + case RULE_OP_MANGLE_TITLE: out_len = rule_op_mangle_title (p0, p1, buf0, buf1, out_len); break; + } + + return out_len; +} + +u32 apply_rules (__global u32 *cmds, u32x buf0[4], u32x buf1[4], const u32 len) +{ + u32 out_len = len; + + for (u32 i = 0; cmds[i] != 0; i++) + { + const u32 cmd = cmds[i]; + + const u32 name = (cmd >> 0) & 0xff; + const u32 p0 = (cmd >> 8) & 0xff; + const u32 p1 = (cmd >> 16) & 0xff; + + out_len = apply_rule (name, p0, p1, buf0, buf1, out_len); + } + + return out_len; +} diff --git a/amd/types_amd.c b/amd/types_amd.c new file mode 100644 index 0000000000..d6da9ce9ee --- /dev/null +++ b/amd/types_amd.c @@ -0,0 +1,955 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +typedef uchar u8; +typedef ushort u16; +typedef uint u32; +typedef ulong u64; + +#ifdef VECT_SIZE1 +#define VECT_SHIFT 0 +#define VECT_DIV 1 +typedef uchar u8x; +typedef uint u32x; +typedef ulong u64x; +#endif + +#ifdef VECT_SIZE2 +#define VECT_SHIFT 1 +#define VECT_DIV 2 +typedef uchar2 u8x; +typedef uint2 u32x; +typedef ulong2 u64x; + +#define u8x(a,b) (u8x) (a,b) +#define u16x(a,b) (u16x) (a,b) +#define u32x(a,b) (u32x) (a,b) +#define u64x(a,b) (u64x) (a,b) +#endif + +#ifdef VECT_SIZE4 +#define VECT_SHIFT 2 +#define VECT_DIV 4 +typedef uchar4 u8x; +typedef uint4 u32x; +typedef ulong4 u64x; + +#define u8x(a,b,c,d) (u8x) (a,b,c,d) +#define u16x(a,b,c,d) (u16x) (a,b,c,d) +#define u32x(a,b,c,d) (u32x) (a,b,c,d) +#define u64x(a,b,c,d) (u64x) (a,b,c,d) +#endif + +static inline bool allx (const u32 r) +{ + return r; +} + +static inline u32 rotr32 (const u32 a, const u32 n) +{ + return amd_bitalign (a, a, n); +} + +static inline u32 rotl32 (const u32 a, const u32 n) +{ + return rotate (a, n); +} + +static inline u32 l32_from_64 (u64 a) +{ + const u32 r = (uint) (a); + + return r; +} + +static inline u32 h32_from_64 (u64 a) +{ + a >>= 32; + + const u32 r = (uint) (a); + + return r; +} + +static inline u64 hl32_to_64 (const u32 a, const u32 b) +{ + return as_ulong ((uint2) (b, a)); +} + +static inline u64 rotr64 (const u64 a, const u32 n) +{ + uint2 a2 = as_uint2 (a); + + uint2 t; + + t.s0 = (n >= 32) ? amd_bitalign (a2.s0, a2.s1, n - 32) + : amd_bitalign (a2.s1, a2.s0, n); + t.s1 = (n >= 32) ? amd_bitalign (a2.s1, a2.s0, n - 32) + : amd_bitalign (a2.s0, a2.s1, n); + + return as_ulong (t); +} + +static inline u64 rotl64 (const u64 a, const u32 n) +{ + return rotr64 (a, 64 - n); +} + +#ifdef VECT_SIZE2 +static inline bool allx (const int2 r) +{ + return all (r); +} + +static inline u32x rotl32 (const u32x a, const u32 n) +{ + return (u32x) (rotl32 (a.s0, n), + rotl32 (a.s1, n)); +} + +static inline u32x rotr32 (const u32x a, const u32 n) +{ + return (u32x) (rotr32 (a.s0, n), + rotr32 (a.s1, n)); +} + +static inline u64x rotl64 (const u64x a, const u32 n) +{ + return (u64x) (rotl64 (a.s0, n), + rotl64 (a.s1, n)); +} + +static inline u64x rotr64 (const u64x a, const u32 n) +{ + return (u64x) (rotr64 (a.s0, n), + rotr64 (a.s1, n)); +} + +static inline u32x l32_from_64 (const u64x a) +{ + return (u32x) (l32_from_64 (a.s0), + l32_from_64 (a.s1)); +} + +static inline u32x h32_from_64 (const u64x a) +{ + return (u32x) (h32_from_64 (a.s0), + h32_from_64 (a.s1)); +} + +static inline u64x hl32_to_64 (const u32x a, const u32x b) +{ + return (u64x) (hl32_to_64 (a.s0, b.s0), + hl32_to_64 (a.s1, b.s1)); +} + + +#endif + +#ifdef VECT_SIZE4 +static inline bool allx (const int4 r) +{ + return all (r); +} + +static inline u32x rotl32 (const u32x a, const u32 n) +{ + return (u32x) (rotl32 (a.s0, n), + rotl32 (a.s1, n), + rotl32 (a.s2, n), + rotl32 (a.s3, n)); +} + +static inline u32x rotr32 (const u32x a, const u32 n) +{ + return (u32x) (rotr32 (a.s0, n), + rotr32 (a.s1, n), + rotr32 (a.s2, n), + rotr32 (a.s3, n)); +} + +static inline u64x rotl64 (const u64x a, const u32 n) +{ + return (u64x) (rotl64 (a.s0, n), + rotl64 (a.s1, n), + rotl64 (a.s2, n), + rotl64 (a.s3, n)); +} + +static inline u64x rotr64 (const u64x a, const u32 n) +{ + return (u64x) (rotr64 (a.s0, n), + rotr64 (a.s1, n), + rotr64 (a.s2, n), + rotr64 (a.s3, n)); +} + +static inline u32x l32_from_64 (const u64x a) +{ + return (u32x) (l32_from_64 (a.s0), + l32_from_64 (a.s1), + l32_from_64 (a.s2), + l32_from_64 (a.s3)); +} + +static inline u32x h32_from_64 (const u64x a) +{ + return (u32x) (h32_from_64 (a.s0), + h32_from_64 (a.s1), + h32_from_64 (a.s2), + h32_from_64 (a.s3)); +} + +static inline u64x hl32_to_64 (const u32x a, const u32x b) +{ + return (u64x) (hl32_to_64 (a.s0, b.s0), + hl32_to_64 (a.s1, b.s1), + hl32_to_64 (a.s2, b.s2), + hl32_to_64 (a.s3, b.s3)); +} +#endif + +typedef struct +{ + #if defined _DES_ + u32 digest_buf[4]; + #elif defined _MD4_ + u32 digest_buf[4]; + #elif defined _MD5_ + u32 digest_buf[4]; + #elif defined _MD5H_ + u32 digest_buf[4]; + #elif defined _SHA1_ + u32 digest_buf[5]; + #elif defined _BCRYPT_ + u32 digest_buf[6]; + #elif defined _SHA256_ + u32 digest_buf[8]; + #elif defined _SHA384_ + u32 digest_buf[16]; + #elif defined _SHA512_ + u32 digest_buf[16]; + #elif defined _KECCAK_ + u32 digest_buf[50]; + #elif defined _RIPEMD160_ + u32 digest_buf[5]; + #elif defined _WHIRLPOOL_ + u32 digest_buf[16]; + #elif defined _GOST_ + u32 digest_buf[8]; + #elif defined _GOST2012_256_ + u32 digest_buf[8]; + #elif defined _GOST2012_512_ + u32 digest_buf[16]; + #elif defined _SAPB_ + u32 digest_buf[4]; + #elif defined _SAPG_ + u32 digest_buf[5]; + #elif defined _MYSQL323_ + u32 digest_buf[4]; + #elif defined _LOTUS5_ + u32 digest_buf[4]; + #elif defined _LOTUS6_ + u32 digest_buf[4]; + #elif defined _SCRYPT_ + u32 digest_buf[8]; + #elif defined _LOTUS8_ + u32 digest_buf[4]; + #elif defined _OFFICE2007_ + u32 digest_buf[4]; + #elif defined _OFFICE2010_ + u32 digest_buf[4]; + #elif defined _OFFICE2013_ + u32 digest_buf[4]; + #elif defined _OLDOFFICE01_ + u32 digest_buf[4]; + #elif defined _OLDOFFICE34_ + u32 digest_buf[4]; + #elif defined _SIPHASH_ + u32 digest_buf[4]; + #elif defined _PBKDF2_MD5_ + u32 digest_buf[32]; + #elif defined _PBKDF2_SHA1_ + u32 digest_buf[32]; + #elif defined _PBKDF2_SHA256_ + u32 digest_buf[32]; + #elif defined _PBKDF2_SHA512_ + u32 digest_buf[32]; + #elif defined _PDF17L8_ + u32 digest_buf[8]; + #elif defined _CRC32_ + u32 digest_buf[4]; + #elif defined _SEVEN_ZIP_ + u32 digest_buf[4]; + #elif defined _ANDROIDFDE_ + u32 digest_buf[4]; + #elif defined _DCC2_ + u32 digest_buf[4]; + #elif defined _WPA_ + u32 digest_buf[4]; + #elif defined _MD5_SHA1_ + u32 digest_buf[4]; + #elif defined _SHA1_MD5_ + u32 digest_buf[5]; + #elif defined _NETNTLMV2_ + u32 digest_buf[4]; + #elif defined _KRB5PA_ + u32 digest_buf[4]; + #elif defined _CLOUDKEY_ + u32 digest_buf[8]; + #elif defined _SCRYPT_ + u32 digest_buf[4]; + #elif defined _PSAFE2_ + u32 digest_buf[5]; + #elif defined _LOTUS8_ + u32 digest_buf[4]; + #elif defined _RAR3_ + u32 digest_buf[4]; + #elif defined _SHA256_SHA1_ + u32 digest_buf[8]; + #elif defined _MS_DRSR_ + u32 digest_buf[8]; + #endif + +} digest_t; + +typedef struct +{ + u32 salt_buf[16]; + u32 salt_buf_pc[8]; + + u32 salt_len; + u32 salt_iter; + u32 salt_sign[2]; + + u32 keccak_mdlen; + u32 truecrypt_mdlen; + + u32 digests_cnt; + u32 digests_done; + + u32 digests_offset; + + u32 scrypt_N; + u32 scrypt_r; + u32 scrypt_p; + u32 scrypt_tmto; + u32 scrypt_phy; + +} salt_t; + +typedef struct +{ + int V; + int R; + int P; + + int enc_md; + + u32 id_buf[8]; + u32 u_buf[32]; + u32 o_buf[32]; + + int id_len; + int o_len; + int u_len; + + u32 rc4key[2]; + u32 rc4data[2]; + +} pdf_t; + +typedef struct +{ + u32 pke[25]; + u32 eapol[64]; + int eapol_size; + int keyver; + +} wpa_t; + +typedef struct +{ + u32 cry_master_buf[64]; + u32 ckey_buf[64]; + u32 public_key_buf[64]; + + u32 cry_master_len; + u32 ckey_len; + u32 public_key_len; + +} bitcoin_wallet_t; + +typedef struct +{ + u32 salt_buf[30]; + u32 salt_len; + + u32 esalt_buf[38]; + u32 esalt_len; + +} sip_t; + +typedef struct +{ + u32 data[384]; + +} androidfde_t; + +typedef struct +{ + u32 nr_buf[16]; + u32 nr_len; + + u32 msg_buf[128]; + u32 msg_len; + +} ikepsk_t; + +typedef struct +{ + u32 user_len; + u32 domain_len; + u32 srvchall_len; + u32 clichall_len; + + u32 userdomain_buf[64]; + u32 chall_buf[256]; + +} netntlm_t; + +typedef struct +{ + u32 user[16]; + u32 realm[16]; + u32 salt[32]; + u32 timestamp[16]; + u32 checksum[4]; + +} krb5pa_t; + +typedef struct +{ + u32 salt_buf[16]; + u32 data_buf[112]; + u32 keyfile_buf[16]; + +} tc_t; + +typedef struct +{ + u32 salt_buf[16]; + +} pbkdf2_md5_t; + +typedef struct +{ + u32 salt_buf[16]; + +} pbkdf2_sha1_t; + +typedef struct +{ + u32 salt_buf[16]; + +} pbkdf2_sha256_t; + +typedef struct +{ + u32 salt_buf[32]; + +} pbkdf2_sha512_t; + +typedef struct +{ + u32 salt_buf[128]; + u32 salt_len; + +} rakp_t; + +typedef struct +{ + u32 data_len; + u32 data_buf[512]; + +} cloudkey_t; + +typedef struct +{ + u32 encryptedVerifier[4]; + u32 encryptedVerifierHash[5]; + + u32 keySize; + +} office2007_t; + +typedef struct +{ + u32 encryptedVerifier[4]; + u32 encryptedVerifierHash[8]; + +} office2010_t; + +typedef struct +{ + u32 encryptedVerifier[4]; + u32 encryptedVerifierHash[8]; + +} office2013_t; + +typedef struct +{ + u32 version; + u32 encryptedVerifier[4]; + u32 encryptedVerifierHash[4]; + u32 rc4key[2]; + +} oldoffice01_t; + +typedef struct +{ + u32 version; + u32 encryptedVerifier[4]; + u32 encryptedVerifierHash[5]; + u32 rc4key[2]; + +} oldoffice34_t; + +typedef struct +{ + u32x digest[4]; + u32x out[4]; + +} pdf14_tmp_t; + +typedef struct +{ + union + { + u32 dgst32[16]; + u64 dgst64[8]; + }; + + u32 dgst_len; + u32 W_len; + +} pdf17l8_tmp_t; + +typedef struct +{ + u32x digest_buf[4]; + +} phpass_tmp_t; + +typedef struct +{ + u32x digest_buf[4]; + +} md5crypt_tmp_t; + +typedef struct +{ + u32x alt_result[8]; + + u32x p_bytes[4]; + u32x s_bytes[4]; + +} sha256crypt_tmp_t; + +typedef struct +{ + u64x l_alt_result[8]; + + u64x l_p_bytes[2]; + u64x l_s_bytes[2]; + +} sha512crypt_tmp_t; + +typedef struct +{ + u32x ipad[5]; + u32x opad[5]; + + u32x dgst[10]; + u32x out[10]; + +} wpa_tmp_t; + +typedef struct +{ + u64x dgst[8]; + +} bitcoin_wallet_tmp_t; + +typedef struct +{ + u32x ipad[5]; + u32x opad[5]; + + u32x dgst[5]; + u32x out[4]; + +} dcc2_tmp_t; + +typedef struct +{ + u32x P[18]; + + u32x S0[256]; + u32x S1[256]; + u32x S2[256]; + u32x S3[256]; + +} bcrypt_tmp_t; + +typedef struct +{ + u32x digest[2]; + + u32x P[18]; + + u32x S0[256]; + u32x S1[256]; + u32x S2[256]; + u32x S3[256]; + +} pwsafe2_tmp_t; + +typedef struct +{ + u32x digest_buf[8]; + +} pwsafe3_tmp_t; + +typedef struct +{ + u32x digest_buf[5]; + +} androidpin_tmp_t; + +typedef struct +{ + u32x ipad[5]; + u32x opad[5]; + + u32x dgst[10]; + u32x out[10]; + +} androidfde_tmp_t; + +typedef struct +{ + u32x ipad[16]; + u32x opad[16]; + + u32x dgst[64]; + u32x out[64]; + +} tc_tmp_t; + +typedef struct +{ + u64x ipad[8]; + u64x opad[8]; + + u64x dgst[32]; + u64x out[32]; + +} tc64_tmp_t; + +typedef struct +{ + u32x ipad[4]; + u32x opad[4]; + + u32x dgst[32]; + u32x out[32]; + +} pbkdf2_md5_tmp_t; + +typedef struct +{ + u32x ipad[5]; + u32x opad[5]; + + u32x dgst[32]; + u32x out[32]; + +} pbkdf2_sha1_tmp_t; + +typedef struct +{ + u32x ipad[8]; + u32x opad[8]; + + u32x dgst[32]; + u32x out[32]; + +} pbkdf2_sha256_tmp_t; + +typedef struct +{ + u64x ipad[8]; + u64x opad[8]; + + u64x dgst[16]; + u64x out[16]; + +} pbkdf2_sha512_tmp_t; + +typedef struct +{ + u64x out[8]; + +} ecryptfs_tmp_t; + +typedef struct +{ + u64x ipad[8]; + u64x opad[8]; + + u64x dgst[16]; + u64x out[16]; + +} oraclet_tmp_t; + +typedef struct +{ + u32x ipad[5]; + u32x opad[5]; + + u32x dgst[5]; + u32x out[5]; + +} agilekey_tmp_t; + +typedef struct +{ + u32 ipad[5]; + u32 opad[5]; + + u32 dgst1[5]; + u32 out1[5]; + + u32 dgst2[5]; + u32 out2[5]; + +} mywallet_tmp_t; + +typedef struct +{ + u32x ipad[5]; + u32x opad[5]; + + u32x dgst[5]; + u32x out[5]; + +} sha1aix_tmp_t; + +typedef struct +{ + u32x ipad[8]; + u32x opad[8]; + + u32x dgst[8]; + u32x out[8]; + +} sha256aix_tmp_t; + +typedef struct +{ + u64x ipad[8]; + u64x opad[8]; + + u64x dgst[8]; + u64x out[8]; + +} sha512aix_tmp_t; + +typedef struct +{ + u32x ipad[8]; + u32x opad[8]; + + u32x dgst[8]; + u32x out[8]; + +} lastpass_tmp_t; + +typedef struct +{ + u64x digest_buf[8]; + +} drupal7_tmp_t; + +typedef struct +{ + u32x ipad[5]; + u32x opad[5]; + + u32x dgst[5]; + u32x out[5]; + +} lotus8_tmp_t; + +typedef struct +{ + u32x out[5]; + +} office2007_tmp_t; + +typedef struct +{ + u32x out[5]; + +} office2010_tmp_t; + +typedef struct +{ + u64x out[8]; + +} office2013_tmp_t; + +typedef struct +{ + u32x digest_buf[5]; + +} saph_sha1_tmp_t; + +typedef struct +{ + u32x block[16]; + + u32x dgst[8]; + + u32x block_len; + u32x final_len; + +} seven_zip_tmp_t; + +typedef struct +{ + u32x Kc[16]; + u32x Kd[16]; + + u32x iv[2]; + +} bsdicrypt_tmp_t; + +typedef struct +{ + u32 dgst[17][5]; + +} rar3_tmp_t; + +typedef struct +{ + u32 user[16]; + +} cram_md5_t; + +typedef struct +{ + u32 iv_buf[4]; + u32 iv_len; + + u32 salt_buf[4]; + u32 salt_len; + + u32 crc; + + u32 data_buf[96]; + u32 data_len; + + u32 unpack_size; + +} seven_zip_t; + +typedef struct +{ + u32 key; + u64 val; + +} hcstat_table_t; + +typedef struct +{ + u32 cs_buf[0x100]; + u32 cs_len; + +} cs_t; + +typedef struct +{ + u32 cmds[15]; + +} gpu_rule_t; + +/* +typedef struct +{ + u32 plain_buf[16]; + u32 plailen; + +} plain_t; +*/ + +typedef struct +{ + u32 gidvid; + u32 il_pos; + +} plain_t; + +typedef struct +{ + #ifdef _SCALAR_ + u32 i[64]; + #else + #ifdef VECT_SIZE4 + u32x i[16]; + #endif + + #ifdef VECT_SIZE2 + u32x i[32]; + #endif + + #ifdef VECT_SIZE1 + u32x i[64]; + #endif + #endif + + u32 pw_len; + u32 alignment_placeholder_1; + u32 alignment_placeholder_2; + u32 alignment_placeholder_3; + +} pw_t; + +typedef struct +{ + u32 i; + +} bf_t; + +typedef struct +{ + u32 i[8]; + + u32 pw_len; + +} comb_t; + +typedef struct +{ + u32 b[32]; + +} bs_word_t; + +typedef struct +{ + uint4 P[64]; + +} scrypt_tmp_t; diff --git a/charsets/combined/Bulgarian.hcchr b/charsets/combined/Bulgarian.hcchr new file mode 100644 index 0000000000..b05efaa8f0 --- /dev/null +++ b/charsets/combined/Bulgarian.hcchr @@ -0,0 +1 @@ +ˆ°²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ \ No newline at end of file diff --git a/charsets/combined/Castilian.hcchr b/charsets/combined/Castilian.hcchr new file mode 100644 index 0000000000..bfcc7bd029 --- /dev/null +++ b/charsets/combined/Castilian.hcchr @@ -0,0 +1 @@ +€¡¤¨ª´º¿ÁÉÍÑÓÚÜáéíñóúü \ No newline at end of file diff --git a/charsets/combined/Catalan.hcchr b/charsets/combined/Catalan.hcchr new file mode 100644 index 0000000000..8b7a7c6852 --- /dev/null +++ b/charsets/combined/Catalan.hcchr @@ -0,0 +1 @@ +€¡¤¨ª´º¿ÀÇÈÉÍÏÒÓÚÜàçèéíïòóúü \ No newline at end of file diff --git a/charsets/combined/English.hcchr b/charsets/combined/English.hcchr new file mode 100644 index 0000000000..6c46b96476 --- /dev/null +++ b/charsets/combined/English.hcchr @@ -0,0 +1 @@ +€£¤ \ No newline at end of file diff --git a/charsets/combined/French.hcchr b/charsets/combined/French.hcchr new file mode 100644 index 0000000000..35e4b5ec48 --- /dev/null +++ b/charsets/combined/French.hcchr @@ -0,0 +1 @@ +€ŒœŸ¡¤¨ª«°´»¼½¾¿ÀÂÆÇÈÉÊËÎÏÔÙÛÜàâæçèéêëîïôùûüÿ \ No newline at end of file diff --git a/charsets/combined/German.hcchr b/charsets/combined/German.hcchr new file mode 100644 index 0000000000..7f4ed6d6c6 --- /dev/null +++ b/charsets/combined/German.hcchr @@ -0,0 +1 @@ +€¤²³ºÄÖÜßäöü \ No newline at end of file diff --git a/charsets/combined/Greek.hcchr b/charsets/combined/Greek.hcchr new file mode 100644 index 0000000000..3a455261c7 --- /dev/null +++ b/charsets/combined/Greek.hcchr @@ -0,0 +1 @@ +€¢¤¶¸¹º¼¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþ \ No newline at end of file diff --git a/charsets/combined/GreekPolytonic.hcchr b/charsets/combined/GreekPolytonic.hcchr new file mode 100644 index 0000000000..3a455261c7 --- /dev/null +++ b/charsets/combined/GreekPolytonic.hcchr @@ -0,0 +1 @@ +€¢¤¶¸¹º¼¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþ \ No newline at end of file diff --git a/charsets/combined/Italian.hcchr b/charsets/combined/Italian.hcchr new file mode 100644 index 0000000000..dfdce57ec9 --- /dev/null +++ b/charsets/combined/Italian.hcchr @@ -0,0 +1 @@ +€£¤ª´ºÀÈÉÌÍÎÒÓÙÚàèéìíîòóùú \ No newline at end of file diff --git a/charsets/combined/Lithuanian.hcchr b/charsets/combined/Lithuanian.hcchr new file mode 100644 index 0000000000..71d61b9501 --- /dev/null +++ b/charsets/combined/Lithuanian.hcchr @@ -0,0 +1 @@ +€¡©®±¹¾ÀÁÆÇÈÊËÌÐØÙÛÞàáæçèêëìðøùûþ \ No newline at end of file diff --git a/charsets/combined/Polish.hcchr b/charsets/combined/Polish.hcchr new file mode 100644 index 0000000000..7a112f80b6 --- /dev/null +++ b/charsets/combined/Polish.hcchr @@ -0,0 +1 @@ +€ŒœŸ¡£¥¦¬¯±³¶¹¼¿ÆÊÑÓæêñó \ No newline at end of file diff --git a/charsets/combined/Portuguese.hcchr b/charsets/combined/Portuguese.hcchr new file mode 100644 index 0000000000..fc0dd26d35 --- /dev/null +++ b/charsets/combined/Portuguese.hcchr @@ -0,0 +1 @@ +€£¤¨ª«´º»ÀÁÂÃÇÉÊÍÓÔÕÚÜàáâãçéêíóôõúü \ No newline at end of file diff --git a/charsets/combined/Russian.hcchr b/charsets/combined/Russian.hcchr new file mode 100644 index 0000000000..ec5f362d24 --- /dev/null +++ b/charsets/combined/Russian.hcchr @@ -0,0 +1 @@ +‹›¡£¨°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ \ No newline at end of file diff --git a/charsets/combined/Slovak.hcchr b/charsets/combined/Slovak.hcchr new file mode 100644 index 0000000000..84bdccc5f5 --- /dev/null +++ b/charsets/combined/Slovak.hcchr @@ -0,0 +1 @@ +€ŠŽšž¡¥¨©«®°´µ·¹»¼¾ÀÁÄÅÈÉÍÏÒÓÔÚÝàáäåèéíïòóôúý \ No newline at end of file diff --git a/charsets/combined/Spanish.hcchr b/charsets/combined/Spanish.hcchr new file mode 100644 index 0000000000..0a71ef659a --- /dev/null +++ b/charsets/combined/Spanish.hcchr @@ -0,0 +1 @@ +€¡¤¨ª´º¿ÀÁÇÈÉÍÏÑÒÓÚÜàáçèéíïñòóúü \ No newline at end of file diff --git a/charsets/special/Castilian/es-ES_ISO-8859-1-special.hcchr b/charsets/special/Castilian/es-ES_ISO-8859-1-special.hcchr new file mode 100644 index 0000000000..fff897d694 --- /dev/null +++ b/charsets/special/Castilian/es-ES_ISO-8859-1-special.hcchr @@ -0,0 +1 @@ +¡¨ª´º¿ÁÉÍÑÓÚÜáéíñóúü \ No newline at end of file diff --git a/charsets/special/Castilian/es-ES_ISO-8859-15-special.hcchr b/charsets/special/Castilian/es-ES_ISO-8859-15-special.hcchr new file mode 100644 index 0000000000..dbedf255cd --- /dev/null +++ b/charsets/special/Castilian/es-ES_ISO-8859-15-special.hcchr @@ -0,0 +1 @@ +¡¤ªº¿ÁÉÍÑÓÚÜáéíñóúü \ No newline at end of file diff --git a/charsets/special/Castilian/es-ES_cp1252-special.hcchr b/charsets/special/Castilian/es-ES_cp1252-special.hcchr new file mode 100644 index 0000000000..b5f70bb79d --- /dev/null +++ b/charsets/special/Castilian/es-ES_cp1252-special.hcchr @@ -0,0 +1 @@ +€¡¨ª´º¿ÁÉÍÑÓÚÜáéíñóúü \ No newline at end of file diff --git a/charsets/special/Catalan/ca_ISO-8859-1-special.hcchr b/charsets/special/Catalan/ca_ISO-8859-1-special.hcchr new file mode 100644 index 0000000000..4b7803f6a0 --- /dev/null +++ b/charsets/special/Catalan/ca_ISO-8859-1-special.hcchr @@ -0,0 +1 @@ +¡¨ª´º¿ÀÇÈÉÍÏÒÓÚÜàçèéíïòóúü \ No newline at end of file diff --git a/charsets/special/Catalan/ca_ISO-8859-15-special.hcchr b/charsets/special/Catalan/ca_ISO-8859-15-special.hcchr new file mode 100644 index 0000000000..637d142e94 --- /dev/null +++ b/charsets/special/Catalan/ca_ISO-8859-15-special.hcchr @@ -0,0 +1 @@ +¡¤ªº¿ÀÇÈÉÍÏÒÓÚÜàçèéíïòóúü \ No newline at end of file diff --git a/charsets/special/Catalan/ca_cp1252-special.hcchr b/charsets/special/Catalan/ca_cp1252-special.hcchr new file mode 100644 index 0000000000..bdc0a5b9b9 --- /dev/null +++ b/charsets/special/Catalan/ca_cp1252-special.hcchr @@ -0,0 +1 @@ +€¡¨ª´º¿ÀÇÈÉÍÏÒÓÚÜàçèéíïòóúü \ No newline at end of file diff --git a/charsets/special/French/fr_ISO-8859-1-special.hcchr b/charsets/special/French/fr_ISO-8859-1-special.hcchr new file mode 100644 index 0000000000..cf4b9c5029 --- /dev/null +++ b/charsets/special/French/fr_ISO-8859-1-special.hcchr @@ -0,0 +1 @@ +¡¨ª«°´»¿ÀÂÆÇÈÉÊËÎÏÔÙÛÜàâæçèéêëîïôùûüÿ \ No newline at end of file diff --git a/charsets/special/French/fr_ISO-8859-15-special.hcchr b/charsets/special/French/fr_ISO-8859-15-special.hcchr new file mode 100644 index 0000000000..76c7c48b7d --- /dev/null +++ b/charsets/special/French/fr_ISO-8859-15-special.hcchr @@ -0,0 +1 @@ +¡¤ª«°»¼½¾¿ÀÂÆÇÈÉÊËÎÏÔÙÛÜàâæçèéêëîïôùûüÿ \ No newline at end of file diff --git a/charsets/special/French/fr_ISO-8859-16-special.hcchr b/charsets/special/French/fr_ISO-8859-16-special.hcchr new file mode 100644 index 0000000000..4d41c16ff2 --- /dev/null +++ b/charsets/special/French/fr_ISO-8859-16-special.hcchr @@ -0,0 +1 @@ +¤«°»¼½¾ÀÂÆÇÈÉÊËÎÏÔÙÛÜàâæçèéêëîïôùûüÿ \ No newline at end of file diff --git a/charsets/special/French/fr_cp1252-special.hcchr b/charsets/special/French/fr_cp1252-special.hcchr new file mode 100644 index 0000000000..2f4c083188 --- /dev/null +++ b/charsets/special/French/fr_cp1252-special.hcchr @@ -0,0 +1 @@ +€ŒœŸ¡¨ª«°´»¿ÀÂÆÇÈÉÊËÎÏÔÙÛÜàâæçèéêëîïôùûüÿ \ No newline at end of file diff --git a/charsets/special/German/de_ISO-8859-1-special.hcchr b/charsets/special/German/de_ISO-8859-1-special.hcchr new file mode 100644 index 0000000000..7900001d97 --- /dev/null +++ b/charsets/special/German/de_ISO-8859-1-special.hcchr @@ -0,0 +1 @@ +²³ºÄÖÜßäöü \ No newline at end of file diff --git a/charsets/special/German/de_ISO-8859-15-special.hcchr b/charsets/special/German/de_ISO-8859-15-special.hcchr new file mode 100644 index 0000000000..bd42fde86d --- /dev/null +++ b/charsets/special/German/de_ISO-8859-15-special.hcchr @@ -0,0 +1 @@ +¤²³ºÄÖÜßäöü \ No newline at end of file diff --git a/charsets/special/German/de_cp1252-special.hcchr b/charsets/special/German/de_cp1252-special.hcchr new file mode 100644 index 0000000000..0886ec1d5d --- /dev/null +++ b/charsets/special/German/de_cp1252-special.hcchr @@ -0,0 +1 @@ +€²³ºÄÖÜßäöü \ No newline at end of file diff --git a/charsets/special/Greek/el_ISO-8859-7-special.hcchr b/charsets/special/Greek/el_ISO-8859-7-special.hcchr new file mode 100644 index 0000000000..f0a2501186 --- /dev/null +++ b/charsets/special/Greek/el_ISO-8859-7-special.hcchr @@ -0,0 +1 @@ +¤¶¸¹º¼¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþ \ No newline at end of file diff --git a/charsets/special/Greek/el_cp1253-special.hcchr b/charsets/special/Greek/el_cp1253-special.hcchr new file mode 100644 index 0000000000..aa2d0f20b4 --- /dev/null +++ b/charsets/special/Greek/el_cp1253-special.hcchr @@ -0,0 +1 @@ +€¢¸¹º¼¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþ \ No newline at end of file diff --git a/charsets/special/Italian/it_ISO-8859-1-special.hcchr b/charsets/special/Italian/it_ISO-8859-1-special.hcchr new file mode 100644 index 0000000000..258c57e4bb --- /dev/null +++ b/charsets/special/Italian/it_ISO-8859-1-special.hcchr @@ -0,0 +1 @@ +£ª´ºÀÈÉÌÍÎÒÓÙÚàèéìíîòóùú \ No newline at end of file diff --git a/charsets/special/Italian/it_ISO-8859-15-special.hcchr b/charsets/special/Italian/it_ISO-8859-15-special.hcchr new file mode 100644 index 0000000000..0ef4a6b7aa --- /dev/null +++ b/charsets/special/Italian/it_ISO-8859-15-special.hcchr @@ -0,0 +1 @@ +£¤ªºÀÈÉÌÍÎÒÓÙÚàèéìíîòóùú \ No newline at end of file diff --git a/charsets/special/Italian/it_cp1252-special.hcchr b/charsets/special/Italian/it_cp1252-special.hcchr new file mode 100644 index 0000000000..38b4f7d308 --- /dev/null +++ b/charsets/special/Italian/it_cp1252-special.hcchr @@ -0,0 +1 @@ +€£ª´ºÀÈÉÌÍÎÒÓÙÚàèéìíîòóùú \ No newline at end of file diff --git a/charsets/special/Polish/pl_cp1250-special.hcchr b/charsets/special/Polish/pl_cp1250-special.hcchr new file mode 100644 index 0000000000..8c18088800 --- /dev/null +++ b/charsets/special/Polish/pl_cp1250-special.hcchr @@ -0,0 +1 @@ +€ŒœŸ£¥¯³¹¿ÆÊÑÓæêñó \ No newline at end of file diff --git a/charsets/special/Portuguese/pt_ISO-8859-1-special.hcchr b/charsets/special/Portuguese/pt_ISO-8859-1-special.hcchr new file mode 100644 index 0000000000..6ca39e35c9 --- /dev/null +++ b/charsets/special/Portuguese/pt_ISO-8859-1-special.hcchr @@ -0,0 +1 @@ +£¨ª«´º»ÀÁÂÃÇÉÊÍÓÔÕÚÜàáâãçéêíóôõúü \ No newline at end of file diff --git a/charsets/special/Portuguese/pt_ISO-8859-15-special.hcchr b/charsets/special/Portuguese/pt_ISO-8859-15-special.hcchr new file mode 100644 index 0000000000..e0a2f33273 --- /dev/null +++ b/charsets/special/Portuguese/pt_ISO-8859-15-special.hcchr @@ -0,0 +1 @@ +£¤ª«º»ÀÁÂÃÇÉÊÍÓÔÕÚÜàáâãçéêíóôõúü \ No newline at end of file diff --git a/charsets/special/Portuguese/pt_cp1252-special.hcchr b/charsets/special/Portuguese/pt_cp1252-special.hcchr new file mode 100644 index 0000000000..0d1118fa2e --- /dev/null +++ b/charsets/special/Portuguese/pt_cp1252-special.hcchr @@ -0,0 +1 @@ +€£¨ª«´º»ÀÁÂÃÇÉÊÍÓÔÕÚÜàáâãçéêíóôõúü \ No newline at end of file diff --git a/charsets/special/Russian/ru_ISO-8859-5-special.hcchr b/charsets/special/Russian/ru_ISO-8859-5-special.hcchr new file mode 100644 index 0000000000..709083ca0f --- /dev/null +++ b/charsets/special/Russian/ru_ISO-8859-5-special.hcchr @@ -0,0 +1 @@ +¡¢°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñ \ No newline at end of file diff --git a/charsets/special/Russian/ru_cp1251-special.hcchr b/charsets/special/Russian/ru_cp1251-special.hcchr new file mode 100644 index 0000000000..9e4ec69724 --- /dev/null +++ b/charsets/special/Russian/ru_cp1251-special.hcchr @@ -0,0 +1 @@ +‹›¨¸¹ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ \ No newline at end of file diff --git a/charsets/special/Slovak/sk_ISO-8859-2-special.hcchr b/charsets/special/Slovak/sk_ISO-8859-2-special.hcchr new file mode 100644 index 0000000000..193e75be12 --- /dev/null +++ b/charsets/special/Slovak/sk_ISO-8859-2-special.hcchr @@ -0,0 +1 @@ +¥¨©«®°´µ·¹»¾ÀÁÄÅÈÉÍÏÒÓÔÚÝàáäåèéíïòóôúý \ No newline at end of file diff --git a/charsets/special/Slovak/sk_cp1250-special.hcchr b/charsets/special/Slovak/sk_cp1250-special.hcchr new file mode 100644 index 0000000000..42af5dea7c --- /dev/null +++ b/charsets/special/Slovak/sk_cp1250-special.hcchr @@ -0,0 +1 @@ +€ŠŽšž¡¨°´¼¾ÀÁÄÅÈÉÍÏÒÓÔÚÝàáäåèéíïòóôúý \ No newline at end of file diff --git a/charsets/special/Spanish/es_ISO-8859-1-special.hcchr b/charsets/special/Spanish/es_ISO-8859-1-special.hcchr new file mode 100644 index 0000000000..f63a278c13 --- /dev/null +++ b/charsets/special/Spanish/es_ISO-8859-1-special.hcchr @@ -0,0 +1 @@ +¡¨ª´º¿ÀÁÇÈÉÍÏÑÒÓÚÜàáçèéíïñòóúü \ No newline at end of file diff --git a/charsets/special/Spanish/es_ISO-8859-15-special.hcchr b/charsets/special/Spanish/es_ISO-8859-15-special.hcchr new file mode 100644 index 0000000000..eab01c4c05 --- /dev/null +++ b/charsets/special/Spanish/es_ISO-8859-15-special.hcchr @@ -0,0 +1 @@ +¡¤ªº¿ÀÁÇÈÉÍÏÑÒÓÚÜàáçèéíïñòóúü \ No newline at end of file diff --git a/charsets/special/Spanish/es_cp1252-special.hcchr b/charsets/special/Spanish/es_cp1252-special.hcchr new file mode 100644 index 0000000000..9a65f77e6d --- /dev/null +++ b/charsets/special/Spanish/es_cp1252-special.hcchr @@ -0,0 +1 @@ +€¡¨ª´º¿ÀÁÇÈÉÍÏÑÒÓÚÜàáçèéíïñòóúü \ No newline at end of file diff --git a/charsets/standard/Bulgarian/bg_ISO-8859-5.hcchr b/charsets/standard/Bulgarian/bg_ISO-8859-5.hcchr new file mode 100644 index 0000000000..97e2a6d498 --- /dev/null +++ b/charsets/standard/Bulgarian/bg_ISO-8859-5.hcchr @@ -0,0 +1 @@ +°²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊÌÍÎÏÐÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêìíîï \ No newline at end of file diff --git a/charsets/standard/Bulgarian/bg_KOI8-R.hcchr b/charsets/standard/Bulgarian/bg_KOI8-R.hcchr new file mode 100644 index 0000000000..058604c4c4 --- /dev/null +++ b/charsets/standard/Bulgarian/bg_KOI8-R.hcchr @@ -0,0 +1 @@ +ÀÁÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÚÛÜÝÞßàáãäåæçèéêëìíîïðñòóôõö÷øúûüýþÿ \ No newline at end of file diff --git a/charsets/standard/Bulgarian/bg_cp1251.hcchr b/charsets/standard/Bulgarian/bg_cp1251.hcchr new file mode 100644 index 0000000000..4d84566922 --- /dev/null +++ b/charsets/standard/Bulgarian/bg_cp1251.hcchr @@ -0,0 +1 @@ +ˆÀÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÜÝÞßàâãäåæçèéêëìíîïðñòóôõö÷øùúüýþÿ \ No newline at end of file diff --git a/charsets/standard/Castilian/es-ES_ISO-8859-1.hcchr b/charsets/standard/Castilian/es-ES_ISO-8859-1.hcchr new file mode 100644 index 0000000000..b1b8aad515 --- /dev/null +++ b/charsets/standard/Castilian/es-ES_ISO-8859-1.hcchr @@ -0,0 +1 @@ +¡¿ÁÉÍÑÓÚÜáéíñóúü \ No newline at end of file diff --git a/charsets/standard/Castilian/es-ES_ISO-8859-15.hcchr b/charsets/standard/Castilian/es-ES_ISO-8859-15.hcchr new file mode 100644 index 0000000000..dd5327c265 --- /dev/null +++ b/charsets/standard/Castilian/es-ES_ISO-8859-15.hcchr @@ -0,0 +1 @@ +¡¤¿ÁÉÍÑÓÚÜáéíñóúü \ No newline at end of file diff --git a/charsets/standard/Castilian/es-ES_cp1252.hcchr b/charsets/standard/Castilian/es-ES_cp1252.hcchr new file mode 100644 index 0000000000..fdaf3c77d8 --- /dev/null +++ b/charsets/standard/Castilian/es-ES_cp1252.hcchr @@ -0,0 +1 @@ +€¡¿ÁÉÍÑÓÚÜáéíñóúü \ No newline at end of file diff --git a/charsets/standard/Catalan/ca_ISO-8859-1.hcchr b/charsets/standard/Catalan/ca_ISO-8859-1.hcchr new file mode 100644 index 0000000000..4db0ceb2c2 --- /dev/null +++ b/charsets/standard/Catalan/ca_ISO-8859-1.hcchr @@ -0,0 +1 @@ +¡¿ÀÇÈÉÍÏÒÓÚÜàçèéíïòóúü \ No newline at end of file diff --git a/charsets/standard/Catalan/ca_ISO-8859-15.hcchr b/charsets/standard/Catalan/ca_ISO-8859-15.hcchr new file mode 100644 index 0000000000..0b22a17461 --- /dev/null +++ b/charsets/standard/Catalan/ca_ISO-8859-15.hcchr @@ -0,0 +1 @@ +¡¤¿ÀÇÈÉÍÏÒÓÚÜàçèéíïòóúü \ No newline at end of file diff --git a/charsets/standard/Catalan/ca_cp1252.hcchr b/charsets/standard/Catalan/ca_cp1252.hcchr new file mode 100644 index 0000000000..30f3f3d587 --- /dev/null +++ b/charsets/standard/Catalan/ca_cp1252.hcchr @@ -0,0 +1 @@ +€¡¿ÀÇÈÉÍÏÒÓÚÜàçèéíïòóúü \ No newline at end of file diff --git a/charsets/standard/English/en_ISO-8859-1.hcchr b/charsets/standard/English/en_ISO-8859-1.hcchr new file mode 100644 index 0000000000..c471733217 --- /dev/null +++ b/charsets/standard/English/en_ISO-8859-1.hcchr @@ -0,0 +1 @@ +£ \ No newline at end of file diff --git a/charsets/standard/English/en_ISO-8859-15.hcchr b/charsets/standard/English/en_ISO-8859-15.hcchr new file mode 100644 index 0000000000..e40d705f06 --- /dev/null +++ b/charsets/standard/English/en_ISO-8859-15.hcchr @@ -0,0 +1 @@ +£¤ \ No newline at end of file diff --git a/charsets/standard/English/en_cp1252.hcchr b/charsets/standard/English/en_cp1252.hcchr new file mode 100644 index 0000000000..e97f2c9791 --- /dev/null +++ b/charsets/standard/English/en_cp1252.hcchr @@ -0,0 +1 @@ +€£ \ No newline at end of file diff --git a/charsets/standard/French/fr_ISO-8859-1.hcchr b/charsets/standard/French/fr_ISO-8859-1.hcchr new file mode 100644 index 0000000000..9e723623fa --- /dev/null +++ b/charsets/standard/French/fr_ISO-8859-1.hcchr @@ -0,0 +1 @@ +¡¿ÀÂÆÇÈÉÊËÎÏÔÙÛÜàâæçèéêëîïôùûüÿ \ No newline at end of file diff --git a/charsets/standard/French/fr_ISO-8859-15.hcchr b/charsets/standard/French/fr_ISO-8859-15.hcchr new file mode 100644 index 0000000000..c0f72f51c6 --- /dev/null +++ b/charsets/standard/French/fr_ISO-8859-15.hcchr @@ -0,0 +1 @@ +¡¤¼½¾¿ÀÂÆÇÈÉÊËÎÏÔÙÛÜàâæçèéêëîïôùûüÿ \ No newline at end of file diff --git a/charsets/standard/French/fr_ISO-8859-16.hcchr b/charsets/standard/French/fr_ISO-8859-16.hcchr new file mode 100644 index 0000000000..49986cccda --- /dev/null +++ b/charsets/standard/French/fr_ISO-8859-16.hcchr @@ -0,0 +1 @@ +¤¼½¾ÀÂÆÇÈÉÊËÎÏÔÙÛÜàâæçèéêëîïôùûüÿ \ No newline at end of file diff --git a/charsets/standard/French/fr_cp1252.hcchr b/charsets/standard/French/fr_cp1252.hcchr new file mode 100644 index 0000000000..2fe8ec26b0 --- /dev/null +++ b/charsets/standard/French/fr_cp1252.hcchr @@ -0,0 +1 @@ +€ŒœŸ¡¿ÀÂÆÇÈÉÊËÎÏÔÙÛÜàâæçèéêëîïôùûüÿ \ No newline at end of file diff --git a/charsets/standard/German/de_ISO-8859-1.hcchr b/charsets/standard/German/de_ISO-8859-1.hcchr new file mode 100644 index 0000000000..0341305745 --- /dev/null +++ b/charsets/standard/German/de_ISO-8859-1.hcchr @@ -0,0 +1 @@ +ÄÖÜßäöü \ No newline at end of file diff --git a/charsets/standard/German/de_ISO-8859-15.hcchr b/charsets/standard/German/de_ISO-8859-15.hcchr new file mode 100644 index 0000000000..7925e6ef5c --- /dev/null +++ b/charsets/standard/German/de_ISO-8859-15.hcchr @@ -0,0 +1 @@ +¤ÄÖÜßäöü \ No newline at end of file diff --git a/charsets/standard/German/de_cp1252.hcchr b/charsets/standard/German/de_cp1252.hcchr new file mode 100644 index 0000000000..7473397cea --- /dev/null +++ b/charsets/standard/German/de_cp1252.hcchr @@ -0,0 +1 @@ +€ÄÖÜßäöü \ No newline at end of file diff --git a/charsets/standard/Greek/el_ISO-8859-7.hcchr b/charsets/standard/Greek/el_ISO-8859-7.hcchr new file mode 100644 index 0000000000..de0b0343dd --- /dev/null +++ b/charsets/standard/Greek/el_ISO-8859-7.hcchr @@ -0,0 +1 @@ +¤ÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÓÔÕÖ×ØÙáâãäåæçèéêëìíîïðñòóôõö÷øù \ No newline at end of file diff --git a/charsets/standard/Greek/el_cp1253.hcchr b/charsets/standard/Greek/el_cp1253.hcchr new file mode 100644 index 0000000000..0dbbd6d929 --- /dev/null +++ b/charsets/standard/Greek/el_cp1253.hcchr @@ -0,0 +1 @@ +€ÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÓÔÕÖ×ØÙáâãäåæçèéêëìíîïðñòóôõö÷øù \ No newline at end of file diff --git a/charsets/standard/GreekPolytonic/el_polytonic_ISO-8859-7.hcchr b/charsets/standard/GreekPolytonic/el_polytonic_ISO-8859-7.hcchr new file mode 100644 index 0000000000..f0a2501186 --- /dev/null +++ b/charsets/standard/GreekPolytonic/el_polytonic_ISO-8859-7.hcchr @@ -0,0 +1 @@ +¤¶¸¹º¼¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþ \ No newline at end of file diff --git a/charsets/standard/GreekPolytonic/el_polytonic_cp1253.hcchr b/charsets/standard/GreekPolytonic/el_polytonic_cp1253.hcchr new file mode 100644 index 0000000000..aa2d0f20b4 --- /dev/null +++ b/charsets/standard/GreekPolytonic/el_polytonic_cp1253.hcchr @@ -0,0 +1 @@ +€¢¸¹º¼¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþ \ No newline at end of file diff --git a/charsets/standard/Hungarian/hu_cp1250.hcchr b/charsets/standard/Hungarian/hu_cp1250.hcchr new file mode 100644 index 0000000000..65f414d988 --- /dev/null +++ b/charsets/standard/Hungarian/hu_cp1250.hcchr @@ -0,0 +1 @@ +ÁÉÍÓÕÖÚÛÜáéíóõöúûü \ No newline at end of file diff --git a/charsets/standard/Italian/it_ISO-8859-1.hcchr b/charsets/standard/Italian/it_ISO-8859-1.hcchr new file mode 100644 index 0000000000..525f057116 --- /dev/null +++ b/charsets/standard/Italian/it_ISO-8859-1.hcchr @@ -0,0 +1 @@ +ÀÈÉÌÍÎÒÓÙÚàèéìíîòóùú \ No newline at end of file diff --git a/charsets/standard/Italian/it_ISO-8859-15.hcchr b/charsets/standard/Italian/it_ISO-8859-15.hcchr new file mode 100644 index 0000000000..d56205ad03 --- /dev/null +++ b/charsets/standard/Italian/it_ISO-8859-15.hcchr @@ -0,0 +1 @@ +¤ÀÈÉÌÍÎÒÓÙÚàèéìíîòóùú \ No newline at end of file diff --git a/charsets/standard/Italian/it_cp1252.hcchr b/charsets/standard/Italian/it_cp1252.hcchr new file mode 100644 index 0000000000..220315e84d --- /dev/null +++ b/charsets/standard/Italian/it_cp1252.hcchr @@ -0,0 +1 @@ +€ÀÈÉÌÍÎÒÓÙÚàèéìíîòóùú \ No newline at end of file diff --git a/charsets/standard/Lithuanian/lt_ISO-8859-13.hcchr b/charsets/standard/Lithuanian/lt_ISO-8859-13.hcchr new file mode 100644 index 0000000000..32a49f6dc6 --- /dev/null +++ b/charsets/standard/Lithuanian/lt_ISO-8859-13.hcchr @@ -0,0 +1 @@ +ÀÁÆÈËÐØÛÞàáæèëðøûþ \ No newline at end of file diff --git a/charsets/standard/Lithuanian/lt_ISO-8859-4.hcchr b/charsets/standard/Lithuanian/lt_ISO-8859-4.hcchr new file mode 100644 index 0000000000..79ea1d1f65 --- /dev/null +++ b/charsets/standard/Lithuanian/lt_ISO-8859-4.hcchr @@ -0,0 +1 @@ +¡©®±¹¾ÇÈÊÌÙÞçèêìùþ \ No newline at end of file diff --git a/charsets/standard/Lithuanian/lt_cp1257.hcchr b/charsets/standard/Lithuanian/lt_cp1257.hcchr new file mode 100644 index 0000000000..b6e0075557 --- /dev/null +++ b/charsets/standard/Lithuanian/lt_cp1257.hcchr @@ -0,0 +1 @@ +€ÀÁÆÈËÐØÛÞàáæèëðøûþ \ No newline at end of file diff --git a/charsets/standard/Polish/pl_ISO-8859-2.hcchr b/charsets/standard/Polish/pl_ISO-8859-2.hcchr new file mode 100644 index 0000000000..30420e8ab5 --- /dev/null +++ b/charsets/standard/Polish/pl_ISO-8859-2.hcchr @@ -0,0 +1 @@ +¡£¦¬¯±³¶¼¿ÆÊÑÓæêñó \ No newline at end of file diff --git a/charsets/standard/Polish/pl_cp1250.hcchr b/charsets/standard/Polish/pl_cp1250.hcchr new file mode 100644 index 0000000000..cfa1ec6890 --- /dev/null +++ b/charsets/standard/Polish/pl_cp1250.hcchr @@ -0,0 +1 @@ +ŒœŸ£¥¯³¹¿ÆÊÑÓæêñó \ No newline at end of file diff --git a/charsets/standard/Portuguese/pt_ISO-8859-1.hcchr b/charsets/standard/Portuguese/pt_ISO-8859-1.hcchr new file mode 100644 index 0000000000..377a2aec41 --- /dev/null +++ b/charsets/standard/Portuguese/pt_ISO-8859-1.hcchr @@ -0,0 +1 @@ +ÀÁÂÃÇÉÊÍÓÔÕÚÜàáâãçéêíóôõúü \ No newline at end of file diff --git a/charsets/standard/Portuguese/pt_ISO-8859-15.hcchr b/charsets/standard/Portuguese/pt_ISO-8859-15.hcchr new file mode 100644 index 0000000000..ebf437f7f1 --- /dev/null +++ b/charsets/standard/Portuguese/pt_ISO-8859-15.hcchr @@ -0,0 +1 @@ +¤ÀÁÂÃÇÉÊÍÓÔÕÚÜàáâãçéêíóôõúü \ No newline at end of file diff --git a/charsets/standard/Portuguese/pt_cp1252.hcchr b/charsets/standard/Portuguese/pt_cp1252.hcchr new file mode 100644 index 0000000000..262ceaff0f --- /dev/null +++ b/charsets/standard/Portuguese/pt_cp1252.hcchr @@ -0,0 +1 @@ +€ÀÁÂÃÇÉÊÍÓÔÕÚÜàáâãçéêíóôõúü \ No newline at end of file diff --git a/charsets/standard/Russian/ru_ISO-8859-5.hcchr b/charsets/standard/Russian/ru_ISO-8859-5.hcchr new file mode 100644 index 0000000000..e1231b1ce8 --- /dev/null +++ b/charsets/standard/Russian/ru_ISO-8859-5.hcchr @@ -0,0 +1 @@ +¡°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñ \ No newline at end of file diff --git a/charsets/standard/Russian/ru_KOI8-R.hcchr b/charsets/standard/Russian/ru_KOI8-R.hcchr new file mode 100644 index 0000000000..bffda719fd --- /dev/null +++ b/charsets/standard/Russian/ru_KOI8-R.hcchr @@ -0,0 +1 @@ +£³ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ \ No newline at end of file diff --git a/charsets/standard/Russian/ru_cp1251.hcchr b/charsets/standard/Russian/ru_cp1251.hcchr new file mode 100644 index 0000000000..46e471415e --- /dev/null +++ b/charsets/standard/Russian/ru_cp1251.hcchr @@ -0,0 +1 @@ +¨¸¹ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ \ No newline at end of file diff --git a/charsets/standard/Slovak/sk_ISO-8859-2.hcchr b/charsets/standard/Slovak/sk_ISO-8859-2.hcchr new file mode 100644 index 0000000000..c88fb04d1f --- /dev/null +++ b/charsets/standard/Slovak/sk_ISO-8859-2.hcchr @@ -0,0 +1 @@ +¥©«®µ¹»¾ÀÁÄÅÈÉÍÏÒÓÔÚÝàáäåèéíïòóôúý \ No newline at end of file diff --git a/charsets/standard/Slovak/sk_cp1250.hcchr b/charsets/standard/Slovak/sk_cp1250.hcchr new file mode 100644 index 0000000000..1e788fbfda --- /dev/null +++ b/charsets/standard/Slovak/sk_cp1250.hcchr @@ -0,0 +1 @@ +€ŠŽšž¼¾ÀÁÄÅÈÉÍÏÒÓÔÚÝàáäåèéíïòóôúý \ No newline at end of file diff --git a/charsets/standard/Spanish/es_ISO-8859-1.hcchr b/charsets/standard/Spanish/es_ISO-8859-1.hcchr new file mode 100644 index 0000000000..c40d3a2de0 --- /dev/null +++ b/charsets/standard/Spanish/es_ISO-8859-1.hcchr @@ -0,0 +1 @@ +¡¿ÀÁÇÈÉÍÏÑÒÓÚÜàáçèéíïñòóúü \ No newline at end of file diff --git a/charsets/standard/Spanish/es_ISO-8859-15.hcchr b/charsets/standard/Spanish/es_ISO-8859-15.hcchr new file mode 100644 index 0000000000..7a1e9534b4 --- /dev/null +++ b/charsets/standard/Spanish/es_ISO-8859-15.hcchr @@ -0,0 +1 @@ +¡¤¿ÀÁÇÈÉÍÏÑÒÓÚÜàáçèéíïñòóúü \ No newline at end of file diff --git a/charsets/standard/Spanish/es_cp1252.hcchr b/charsets/standard/Spanish/es_cp1252.hcchr new file mode 100644 index 0000000000..e142bf0998 --- /dev/null +++ b/charsets/standard/Spanish/es_cp1252.hcchr @@ -0,0 +1 @@ +€¡¿ÀÁÇÈÉÍÏÑÒÓÚÜàáçèéíïñòóúü \ No newline at end of file diff --git a/cudaExample0.cmd b/cudaExample0.cmd new file mode 100644 index 0000000000..ace7147cea --- /dev/null +++ b/cudaExample0.cmd @@ -0,0 +1,2 @@ +cudaHashcat64.exe -t 32 -a 7 example0.hash ?a?a?a?a example.dict +pause diff --git a/cudaExample0.sh b/cudaExample0.sh new file mode 100755 index 0000000000..38e5fd1f5f --- /dev/null +++ b/cudaExample0.sh @@ -0,0 +1 @@ +./cudaHashcat64.bin -t 32 -a 7 example0.hash ?a?a?a?a example.dict diff --git a/cudaExample400.cmd b/cudaExample400.cmd new file mode 100644 index 0000000000..b80b25eae3 --- /dev/null +++ b/cudaExample400.cmd @@ -0,0 +1,2 @@ +type example.dict | cudaHashcat64.exe -m 400 example400.hash +pause diff --git a/cudaExample400.sh b/cudaExample400.sh new file mode 100755 index 0000000000..c2f043445a --- /dev/null +++ b/cudaExample400.sh @@ -0,0 +1 @@ +cat example.dict | ./cudaHashcat64.bin -m 400 example400.hash diff --git a/cudaExample500.cmd b/cudaExample500.cmd new file mode 100644 index 0000000000..6274087724 --- /dev/null +++ b/cudaExample500.cmd @@ -0,0 +1,2 @@ +cudaHashcat64.exe -m 500 example500.hash example.dict +pause diff --git a/cudaExample500.sh b/cudaExample500.sh new file mode 100755 index 0000000000..e5b11fca48 --- /dev/null +++ b/cudaExample500.sh @@ -0,0 +1 @@ +./cudaHashcat64.bin -m 500 example500.hash example.dict diff --git a/docs/BUILD.md b/docs/BUILD.md new file mode 100644 index 0000000000..247773399d --- /dev/null +++ b/docs/BUILD.md @@ -0,0 +1,197 @@ +oclHashcat build documentation += +# Revision: +* 1.0 + +# Authors: +* Gabriele Gristina <> +* Christoph Heuwieser <> + +# Dependencies + +To compile **oclHashcat** the following third party libraries are required: + + ADL_SDK v8.0 - http://developer.amd.com/tools-and-sdks/graphics-development/display-library-adl-sdk/ + cuda v7.5 - https://developer.nvidia.com/cuda-downloads + GDK v352_55 - https://developer.nvidia.com/gpu-deployment-kit + NVIDIA Driver v352.21 - https://www.nvidia.com/download/driverResults.aspx/86390/en-us + NVAPI R352 - https://developer.nvidia.com/nvapi + AMD-APP-SDK v3.0 - http://developer.amd.com/tools-and-sdks/opencl-zone/amd-accelerated-parallel-processing-app-sdk/ + +To be able to compile the ocl binaries, it is required to have the latest stable driver from AMD installed. +(fglxr must be installed and initialized) + + http://support.amd.com/ + +The next thing to do is download all the third party libraries listed above and put files into */opt/hashcat-deps/tmp* directory. + +The following files are needed inside the */opt/hashcat-deps/tmp* directory: + + ADL_SDK8.zip + R352-developer.zip + cuda_7.5.18_linux.run + NVIDIA-Linux-x86_64-352.21.run + gdk_linux_amd64_352_55_release.run + AMDAPPSDK-3.0-linux64.tar.bz2 + +Now just execute the following script to complete the installation of dependencies (check for an updated version in **docs/deps.sh**): + + #!/bin/bash + # Author: Gabriele Gristina + # Revision: 1.0 + + ## global vars + DEPS="make gcc-4.9 g++-4.9 gcc-4.9-multilib g++-4.9-multilib libc6-dev-i386 mingw-w64 build-essential unzip" + DOWNLOAD_DEPS="ADL_SDK8.zip R352-developer.zip cuda_7.5.18_linux.run NVIDIA-Linux-x86_64-352.21.run gdk_linux_amd64_352_55_release.run AMDAPPSDK-3.0-linux64.tar.bz2" + + ## root check + if [ $(id -u) -ne 0 ]; then + echo "! Must be root" + exit 1 + fi + + ## cleanup 'hashcat-deps' directories + rm -rf /opt/hashcat-deps/{adl-sdk,cuda-7.5,NVIDIA-Linux-x86_64-352.21,nvidia-gdk,amd-app-sdk} && \ + mkdir -p /opt/hashcat-deps/{tmp,adl-sdk,cuda-7.5,NVIDIA-Linux-x86_64-352.21,nvidia-gdk,amd-app-sdk} && \ + cd /opt/hashcat-deps/tmp + + if [ $? -ne 0 ]; then + echo "! Cannot create hashcat-deps directories." + exit 1 + fi + + ## check dependencies + i=0 + for d in ${DOWNLOAD_DEPS}; do + if [ ! -f "${d}" ]; then + echo "! ${d} not found." + ((i++)) + fi + done + + if [ ${i} -gt 0 ]; then + echo "! Please download manually into the directory /opt/hashcat-deps/tmp" + exit 1 + fi + + ## installing needed packages + for pkg in ${DEPS}; do + apt-get -y install ${pkg} + if [ $? -ne 0 ]; then + echo "! failed to install ${pkg}" + exit 1 + fi + done + + ## extract ADL SDK + unzip ADL_SDK8.zip -d /opt/hashcat-deps/adl-sdk-8 + ret=$? + + if [[ ${ret} -ne 0 ]] && [[ ${ret} -ne 1 ]]; then + echo "! failed to extract ADL SDK" + exit 1 + fi + + rm -rf /opt/hashcat-deps/adl-sdk && ln -s /opt/hashcat-deps/adl-sdk-8 /opt/hashcat-deps/adl-sdk + + if [ $? -ne 0 ]; then + echo "! failed to setup ADL SDK link" + exit 1 + fi + + ## extract NVAPI + unzip R352-developer.zip -d /opt/hashcat-deps/ + ret=$? + + if [[ ${ret} -ne 0 ]] && [[ ${ret} -ne 1 ]]; then + echo "! failed to extract NVAPI" + exit 1 + fi + + ## install CUDA SDK + chmod +x cuda_7.5.18_linux.run && \ + ./cuda_7.5.18_linux.run -toolkit -silent -override --toolkitpath=/opt/hashcat-deps/cuda-7.5 + + if [ $? -ne 0 ]; then + echo "! failed to install CUDA SDK" + exit 1 + fi + + ## install NVIDIA Driver + chmod +x NVIDIA-Linux-x86_64-352.21.run && \ + ./NVIDIA-Linux-x86_64-352.21.run -x && \ + mv NVIDIA-Linux-x86_64-352.21 /opt/hashcat-deps/ && \ + cd /opt/hashcat-deps/NVIDIA-Linux-x86_64-352.21 && \ + ln -s libnvidia-ml.so.352.21 libnvidia-ml.so && \ + ln -s libcuda.so.352.21 libcuda.so && \ + cd 32 && \ + ln -s libnvidia-ml.so.352.21 libnvidia-ml.so && \ + ln -s libcuda.so.352.21 libcuda.so && \ + cd /opt/hashcat-deps/tmp + + if [ $? -ne 0 ]; then + echo "! failed to install NVIDIA Driver" + exit 1 + fi + + ## install NVIDIA GPU Deployment Kit + chmod +x gdk_linux_amd64_352_55_release.run && \ + ./gdk_linux_amd64_352_55_release.run --silent --installdir=/opt/hashcat-deps/nvidia-gdk + + if [ $? -ne 0 ]; then + echo "! failed to install NVIDIA GPU Deployment Kit" + exit 1 + fi + + ## extract AMD APP SDK + tar xjf AMDAPPSDK-3.0-linux64.tar.bz2 && \ + ./AMD-APP-SDK-v3.0.130.135-GA-linux64.sh --noexec --target /opt/hashcat-deps/amd-app-sdk-v3.0.130.135 + + if [ $? -ne 0 ]; then + echo "! failed to extract AMD APP SDK" + exit 1 + fi + + rm -rf /opt/hashcat-deps/amd-app-sdk && ln -s /opt/hashcat-deps/amd-app-sdk-v3.0.130.135 /opt/hashcat-deps/amd-app-sdk + + if [ $? -ne 0 ]; then + echo "! failed to setup ADL SDK link" + exit 1 + fi + + echo "> oclHashcat dependencies have been resolved." + +# Building oclHashcat +First get a copy of **oclHashcat** repository + +```sh +$ git clone https://github.com/hashcat/oclHashcat.git +``` + +Now simply jump in and type "make all" + +```sh +$ cd oclHashcat +$ make all +``` + +Useful tricks: +- build only *Linux* binaries +```sh +$ make linux +``` +- build only *Windows* binaries +```sh +$ make windows +``` +- build only *AMD kernel* binaries +```sh +$ make amd_all +``` +- build only *NVIDIA kernel* binaries +```sh +$ make nv_all +``` + += +Enjoy your fresh **oclHashcat** binaries ;) diff --git a/docs/changes.txt b/docs/changes.txt new file mode 100644 index 0000000000..e166143da9 --- /dev/null +++ b/docs/changes.txt @@ -0,0 +1,1582 @@ +* changes v1.37 -> v2.00: + +Type: Project +File: All +Desc: Made the project Open-Source + +Type: Project +File: All +Desc: Switched the license to MIT + +Type: Feature +File: Host +Desc: Removed Timebomb-, Beta- and Keyfile- checks + +Type: Driver +File: Host +Desc: Added support for AMD APP SDK v3.0 GA + +Type: Driver +File: Host +Desc: Added support for AMD ADL 8.0 + +Type: Driver +File: Host +Desc: added support for NV CUDA 7.5 + +Type: Feature +File: Host +Desc: Replaced support for NVAPI with support for its successor GDK, starting with version 352.55 + +Type: Driver +File: Host +Desc: Added support for all AMD Fiji based GPU (Fury) +Trac: 677 + +Type: Change +File: Kernel +Desc: Bitsliced mode -m 1500 = crypt, DES(Unix), Traditional DES in mask mode + +Type: Change +File: Kernel +Desc: Bitsliced mode -m 3000 = LM in mask mode + +Type: Feature +File: Kernel +Desc: Added new hash mode -m 12700 = Blockchain, My Wallet +Trac: 645 + +Type: Feature +File: Kernel +Desc: Added new hash mode -m 12800 = MS-AzureSync PBKDF2-HMAC-SHA256 +Trac: 669 + +Type: Feature +File: Kernel +Desc: Added new hash mode -m 6211 = TrueCrypt 5.0+ PBKDF2-HMAC-RipeMD160 + XTS 512 bit +Desc: Added new hash mode -m 6212 = TrueCrypt 5.0+ PBKDF2-HMAC-RipeMD160 + XTS 1024 bit +Desc: Added new hash mode -m 6213 = TrueCrypt 5.0+ PBKDF2-HMAC-RipeMD160 + XTS 1536 bit +Desc: Added new hash mode -m 6221 = TrueCrypt 5.0+ PBKDF2-HMAC-SHA512 + XTS 512 bit +Desc: Added new hash mode -m 6222 = TrueCrypt 5.0+ PBKDF2-HMAC-SHA512 + XTS 1024 bit +Desc: Added new hash mode -m 6223 = TrueCrypt 5.0+ PBKDF2-HMAC-SHA512 + XTS 1536 bit +Desc: Added new hash mode -m 6231 = TrueCrypt 5.0+ PBKDF2-HMAC-Whirlpool + XTS 512 bit +Desc: Added new hash mode -m 6232 = TrueCrypt 5.0+ PBKDF2-HMAC-Whirlpool + XTS 1024 bit +Desc: Added new hash mode -m 6233 = TrueCrypt 5.0+ PBKDF2-HMAC-Whirlpool + XTS 1536 bit +Desc: Added new hash mode -m 6241 = TrueCrypt 5.0+ PBKDF2-HMAC-RipeMD160 + XTS 512 bit + boot-mode +Desc: Added new hash mode -m 6242 = TrueCrypt 5.0+ PBKDF2-HMAC-RipeMD160 + XTS 1024 bit + boot-mode +Desc: Added new hash mode -m 6243 = TrueCrypt 5.0+ PBKDF2-HMAC-RipeMD160 + XTS 1536 bit + boot-mode +Trac: 394 + +Type: Feature +File: Kernel +Desc: Added support for keyfiles with TrueCrypt 5.0+ for all modes +Trac: 618 + +Type: Feature +File: Host +Desc: Added new status-display line showing Recovered/Time rate for current and average activity + +Type: Change +File: Kernel +Desc: Hash-Modes 10900, 11900, 12000 and 12100 switched salt encoding from raw to base64 +Trac: #658 + +Type: Change +File: Host +Desc: Fine-tuned fanspeed regulation to work nice even on bigger systems (6+ GPU) + +Type: Change +File: Host +Desc: Renamed rule 'x' to 'O', omit X chars of word at pos N + +Type: Change +File: Host +Desc: Added rule 'x', extract X chars of word at pos N, to keep compatibility to JtR/crack + +Type: Change +File: Host +Desc: Switched to newer glibc for binaries (testphase; please contact us if you have problems) + +Type: Bug +File: Host +Desc: On Nvidia, do not use cuMemAllocHost() on CUDA systems with many GPUs to avoid errors of type cuMemAllocHost() 999 + +Type: Bug +File: Host +Desc: On Nvidia, make sure to clean constant buffer for each iteration of maskfiles +Trac: 691 + +Type: Bug +File: Host +Desc: When trying to crack a raw hash with appended salt, the salt length was taken into account when calculating the number of bytes for the innerloop + +* changes v1.36 -> v1.37: + +Type: Driver +File: Host +Desc: Added support for all AMD Catalyst >= v14.9 + +Type: Feature +File: Kernel +Desc: Added new hash mode -m 11700 = GOST R 34.11-2012 (Streebog) 256-bit + +Type: Feature +File: Kernel +Desc: Added new hash mode -m 11800 = GOST R 34.11-2012 (Streebog) 512-bit + +Type: Feature +File: Kernel +Desc: Added new hash mode -m 11900 = PBKDF2-HMAC-MD5 + +Type: Feature +File: Kernel +Desc: Added new hash mode -m 12000 = PBKDF2-HMAC-SHA1 + +Type: Feature +File: Kernel +Desc: Added new hash mode -m 12100 = PBKDF2-HMAC-SHA512 + +Type: Feature +File: Kernel +Desc: Added new hash mode -m 12200 = eCryptfs + +Type: Feature +File: Kernel +Desc: Added new hash mode -m 12300 = Oracle T: Type (Oracle 12+) + +Type: Feature +File: Kernel +Desc: Added new hash mode -m 12400 = BSDiCrypt, Extended DES + +Type: Feature +File: Kernel +Desc: Added new hash mode -m 12500 = RAR3-hp + +Type: Feature +File: Kernel +Desc: Added new hash mode -m 12600 = ColdFusion 10+ + +Type: Feature +File: Kernel +Desc: Added support for longer field lengths in -m 11400 = SIP digest authentication (MD5) +Trac: #539, #624 + +Type: Feature +File: Host +Desc: Fixed digest size for all hash-types internally to 128 bit + +Type: Feature +File: Host +Desc: Fixed a bug in .hcmask file custom charset keyspace +Trac: #617 + +Type: Change +File: Kernel +Desc: Renamed -m 112 = Oracle 11g/12c to -m 112 = Oracle S: Type (Oracle 11+) + +Type: Change +File: Kernel +Desc: Renamed -m 3100 = Oracle 7-10g, DES(Oracle) to -m 3100 = Oracle H: Type (Oracle 7+) + +Type: Change +File: Host +Desc: Renamed -m 3800 = md5 ($pass.$salt.$pass) to -m 3800 = md5 ($salt.$pass.$salt) + +Type: Change +File: Host +Desc: Renamed -m 1100 = Domain Cached Credentials, mscash to -m 1100 = Domain Cached Credentials (DCC), MS Cache + +Type: Change +File: Host +Desc: Renamed -m 2100 = Domain Cached Credentials2, mscash2 to -m 2100 = Domain Cached Credentials 2 (DCC2), MS Cache 2 + +Type: Change +File: Host +Desc: Reordered hash-type listing in usage screen and set default benchmark ordering anlogue to that listing + +Type: Change +File: Host +Desc: oclHashcat binaries are now being build on Ubuntu 15.04 (vivid) + +Type: Bug +File: Host +Desc: Loopback file names now also depend and the path contains a random number, not timestamp only + +Type: Bug +File: Host +Desc: Fixed a bug where the extra rules -j and -k were applied based on the wordlist-size not position + +Type: Bug +File: Host +Desc: Fixed problem with --loopback that could sometimes lead to an infinite loop on windows +Trac: #626 + +* changes v1.35 -> v1.36: + +Type: Driver +File: Kernel +Desc: Added support for NV ForceWare 346.59 driver + +Type: Feature +File: Kernel +Desc: Added new hash mode -m 11400 = SIP digest authentication (MD5) +Trac: #539 + +Type: Feature +File: Kernel +Desc: Added new hash mode -m 11300 = Bitcoin/Litecoin wallet.dat +Trac: #434 + +Type: Feature +File: Kernel +Desc: Added new hash mode -m 11500 = CRC32 +Trac: #532 + +Type: Feature +File: Kernel +Desc: Added new hash mode -m 11600 = 7-Zip +Trac: #532 + +Type: Feature +File: Host +Desc: Optimized final round flushing (reduces time at last percents of progress with slower speed) + +Type: Feature +File: Host +Desc: Optimized rejection handling (for example passwords > 8 if cracking DEScrypt etc) + +Type: Feature +File: Host +Desc: Added parameter --bitmap-min to help loading huge hashlists faster + +Type: Feature +File: Host +Desc: In status display, if a single hash is longer than 40 chars, truncate it and add "..." to it + +Type: Change +File: Host +Desc: Renamed -m 3810 = md5($salt.$pass.$salt) to -m 3800 = md5($salt.$pass.$salt) + +Type: Change +File: Host +Desc: Renamed -m 4710 = sha1($salt.$pass.$salt) to -m 4900 = sha1($salt.$pass.$salt) + +Type: Change +File: Host +Desc: The speed in status display is no longer divide by the number of uncracked salts + +Type: Change +File: Host +Desc: If all hashes bound to a salt are cracked, reduce the progress count of one salt from the total progress + +Type: Change +File: Host +Desc: --show/--left does now work with both halves of -m 3000 = LM hashes if they are 32 hex chars long +Trac: #448 + +Type: Bug +File: Kernels +Desc: Fixed a bug in NVidia multihash kernels: MD5, NTLM, IPB2 + +Type: Bug +File: Host +Desc: Added additional checks for hexadecimal values supplied in masks by using the --hex-charset switch +Trac: 610 + +Type: Bug +File: Host +Desc: Fixed a bug in NVidia workload balancing + +Type: Bug +File: Host +Desc: Fixed a bug in single rule applied to each word from left dict + +Type: Bug +File: Host +Desc: Problem with "," character escaping in .hcmask file fixed + +Type: Bug +File: Host +Desc: Fixed a bug in -m 101, was showing a wrong cracked plaintext + +* changes v1.34 -> v1.35: + +Type: Feature +File: Kernel +Desc: Increased speed for all multihash kernel using a bitmap technique + +Type: Bug +File: Kernels +Desc: Fixed a bug in NVidia multihash kernels that a hash was not found even with the correct plain + +* changes v1.33 -> v1.34: + +Type: Feature +File: Kernel +Desc: Increased speed for SHA1 raw kernels (-m 100/110/120/130/140) on GCN cards (7970, 280x, 290x, ...) + +Type: Feature +File: Kernel +Desc: Increased speed for PDF kernel (-m 104xx and -m 105xx) for all NVidia GPU + +Type: Feature +File: Kernel +Desc: Increased speed for all multihash kernel using a bitmap technique + +Type: Feature +File: Kernel +Desc: Added oclHashcat compile timestamp to buffered binary kernels to avoid collisions with older versions + +Type: Feature +File: Kernel +Desc: Added new hash mode -m 11000 = PrestaShop +Trac: #589 + +Type: Feature +File: Kernel +Desc: Added new hash mode -m 11100 = PostgreSQL Challenge-Response Authentication (MD5) +Trac: #490 + +Type: Feature +File: Kernel +Desc: Added new hash mode -m 11200 = MySQL Challenge-Response Authentication (SHA1) +Trac: #490 + +Type: Feature +File: Kernel +Desc: Added support for 32 bytes ID objects for hash type -m 10500 = PDF 1.4 - 1.6 +Trac: #594 + +Type: Feature +File: Host +Desc: Inform user with small wordlists how to avoid slow speed with slow hashes +Trac: #597 + +Type: Change +File: Host +Desc: Renamed -m 7100 = OS X v10.8 / v10.9 to OS X v10.8+ + +Type: Workaround +File: Host +Desc: New workaround for -m 2500 = WPA/WPA2 key versions which are not valid (should always be < 256) + +Type: Bug +File: Kernels +Desc: Fixed a race condition in multihash kernels + +Type: Bug +File: Kernels +Desc: Fixed a buffer overflow that could lead to all kinds of segmentation fault or system freezing +Trac: #591 + +Type: Bug +File: Host +Desc: The key size (AES 128 vs AES 256) for office 2007 hashes was not shown correctly in output/status +Trac: #590 + +Type: Bug +File: Host +Desc: Fixed a bug if a rule in -j changes the length of the words in the wordlist, ex. ] +Trac: #593 + +Type: Bug +File: Host +Desc: Fixed a crash when using the outfile remove feature together with some hash types +Trac: #593 + +Type: Bug +File: Host +Desc: Fixed a problem where wrong restore point percentage was shown +Trac: #606 + +Type: Bug +File: Host +Desc: Fixed a buffer overflow in stdin mode + +Type: Bug +File: Host +Desc: Fixed a bug which caused clCreateBuffer() -61 Error even on single hashes + +Type: Bug +File: Host +Desc: Fixed a bug which caused clEnqueueCopyBuffer() -30 Error by limiting --gpu-loops to a maximum of 1024 + +Type: Bug +File: Host +Desc: Fixed a bug related to the maximum password length supported per hash-type + +* changes v1.32 -> v1.33: + +Type: Feature +File: Kernel +Desc: added new hash mode -m 10400 = PDF 1.1 - 1.3 (Acrobat 2 - 4) +Trac: #160 + +Type: Feature +File: Kernel +Desc: added new hash mode -m 10410 = PDF 1.1 - 1.3 (Acrobat 2 - 4) + collider-mode #1 +Trac: #160 + +Type: Feature +File: Kernel +Desc: added new hash mode -m 10420 = PDF 1.1 - 1.3 (Acrobat 2 - 4) + collider-mode #2 +Trac: #160 + +Type: Feature +File: Kernel +Desc: added new hash mode -m 10500 = PDF 1.4 - 1.6 (Acrobat 5 - 8) +Trac: #160 + +Type: Feature +File: Kernel +Desc: added new hash mode -m 10600 = PDF 1.7 Level 3 (Acrobat 9) +Trac: #160 + +Type: Feature +File: Kernel +Desc: added new hash mode -m 10700 = PDF 1.7 Level 8 (Acrobat 10 - 11) +Trac: #160 + +Type: Feature +File: Kernel +Desc: added new hash mode -m 10900 = PBKDF2-HMAC-SHA256 +Trac: #256 + +Type: Feature +File: Kernel +Desc: added support for cracking AES-256 in -m 9400 = Office 2007 +Trac: #576 + +Type: Feature +File: Host +Desc: Multithreaded wordlist loader + +Type: Feature +File: Host +Desc: Added last restore point information to status screen +Trac: #445 + +Type: Feature +File: Host +Desc: Support added to allow both {SSHA} and {ssha} signatures for -m 111 = nsldaps, SSHA-1(Base64), Netscape LDAP SSHA +Trac: #537 + +Type: Feature +File: Host +Desc: Avoid using GPU_NUM_COMPUTE_RINGS to solve clGetDeviceIDs() -1 on some systems +Trac: #564 + +Type: Bug +File: Host +Desc: Beta key date check will now be disabled in release versions +Trac: #536 + +Type: Bug +File: Host +Desc: Minor change in exit code handling, priority of exit codes changed +Trac: #545 + +Type: Bug +File: Host +Desc: Solved a memory problem when using --show and --username with corrupted or missing user name +Trac: #565 + +Type: Bug +File: Host +Desc: Fixed a formatting problem when using the --username switch while cracking (colons were wrongly prepended to each line) +Trac: #566 + +* changes v1.31 -> v1.32: + +Type: Driver +File: Host +Desc: Marked AMD Catalyst 14.12 as broken driver + +Type: Driver +File: Kernel +Desc: Added support for AMD APP SDK v3.0 beta + +Type: Driver +File: Kernel +Desc: Added support for NV ForceWare 346.29 driver + +Type: Driver +File: Kernel +Desc: added support for NV CUDA 7.0 + +Type: Driver +File: Kernel +Desc: Added support for NV new GPUs: "sm_37", used in Tesla K80 + +Type: Driver +File: Host +Desc: NVidia dropped support for CUDA enabled cards <= sm_13 + +Type: Driver +File: Host +Desc: Removed bzero kernel as they are now supported by native runtime + +Type: Workaround +File: Kernel +Desc: Fixed bug in RC4 based algorithms like Office initiated by AMD drivers + +Type: Reimplementation +File: Kernel and Host +Desc: Rewrote slow hash candidate amplifiers, ported from CPU to GPU + +Type: Reimplementation +File: Kernel +Desc: Rewrote support for algorithm -m 8900 = scrypt, simply more speed +Trac: #507 + +Type: Feature +File: Kernel +Desc: added support for TrueCrypt 5.x containers in all hash modes -m 62XX + +Type: Feature +File: Kernel +Desc: added new hash mode -m 4710 = sha1($salt.$pass.$salt) +Trac: #517 + +Type: Feature +File: Kernel +Desc: added new hash mode -m 10200 = Cram MD5 +Trac: #528 + +Type: Feature +File: Kernel +Desc: added new hash mode -m 10300 = SAP CODVN H (PWDSALTEDHASH) iSSHA-1 + +Type: Change +File: Host +Desc: renamed -m 123 = Django (SHA-1) to -m 124 = Django (SHA-1) + +Type: Change +File: Host +Desc: renamed --powertune-disable to --powertune-enable and set default to unset + +Type: Feature +File: Host +Desc: Added parameter --scrypt-tmto to manually override automatically calculated tmto settings + +Type: Bug +File: Host +Desc: fixed a bug when two rules in chaining-mode exceed maximum 15 functions calls in sum + +Type: Bug +File: Host +Desc: fixed a bug in -j if the rule causes to change password length + +Type: Bug +File: Host +Desc: fixed problem with ADL fan speed display, catalyst 14.9 driver had problems querying the fan information/speed +Trac: #514 + +Type: Bug +File: Host +Desc: fixed a problem with too aggressive plain rejection check +Trac: #515 + +Type: Bug +File: Host +Desc: show error message when the user attempts to use directories in combinator attack (which is not supported) +Trac: #518 + +Type: Bug +File: Host +Desc: show error message when the user tries to use too long masks, fixes a crash +Trac: #522 + +Type: Bug +File: Host +Desc: Fixed Redmine format; support for 32 bytes of hexadecimal salt added +Trac: #543 + +Type: Bug +File: Host +Desc: Fixed a problem when using --remove with a multi-hccap file +Trac: #552 + +type: Feature +file: Rules +desc: added dive.rule +Trac: #519 + +* changes v1.30 -> v1.31: + +Type: Driver +File: Host +Desc: added support for AMD Catalyst 14.9 + +Type: Driver +File: Host +Desc: added support for NV CUDA 6.5 + +Type: Driver +File: Kernel +Desc: Added support for NV new GPUs: "sm_52" (Maxwell v2), used in GTX 970/980 + +Type: Feature +File: Kernel +Desc: added new hash mode -m 12 = PostgreSQL + +Type: Feature +File: Kernel +Desc: added new hash mode -m 123 = Django (SHA-1) + +Type: Feature +File: Kernel +Desc: added new hash mode -m 501 = Juniper IVE + +Type: Feature +File: Kernel +Desc: added new hash mode -m 4300 = md5(strtoupper(md5($pass))) + +Type: Feature +File: Kernel +Desc: added new hash mode -m 3810 = md5($salt.$pass.$salt) + +Type: Feature +File: Kernel +Desc: added new hash mode -m 9200 = Cisco $8$ + +Type: Feature +File: Kernel +Desc: added new hash mode -m 9300 = Cisco $9$ + +Type: Feature +File: Kernel +Desc: added new hash mode -m 9400 = Office 2007 + +Type: Feature +File: Kernel +Desc: added new hash mode -m 9500 = Office 2010 + +Type: Feature +File: Kernel +Desc: added new hash mode -m 9600 = Office 2013 + +Type: Feature +File: Kernel +Desc: added new hash mode -m 9700 = MS Office <= 2003 MD5 + RC4, oldoffice$0, oldoffice$1 + +Type: Feature +File: Kernel +Desc: added new hash mode -m 9710 = MS Office <= 2003 MD5 + RC4, collider-mode #1 + +Type: Feature +File: Kernel +Desc: added new hash mode -m 9720 = MS Office <= 2003 MD5 + RC4, collider-mode #2 + +Type: Feature +File: Kernel +Desc: added new hash mode -m 9800 = MS Office <= 2003 SHA1 + RC4, oldoffice$3, oldoffice$4 + +Type: Feature +File: Kernel +Desc: added new hash mode -m 9810 = MS Office <= 2003 SHA1 + RC4, collider-mode #1 + +Type: Feature +File: Kernel +Desc: added new hash mode -m 9820 = MS Office <= 2003 SHA1 + RC4, collider-mode #2 + +Type: Feature +File: Kernel +Desc: added new hash mode -m 9900 = Radmin2 + +Type: Feature +File: Kernel +Desc: added new hash mode -m 10000 = Django (PBKDF2-SHA256) +Trac: #473 + +Type: Feature +File: Kernel +Desc: added new hash mode -m 10100 = SipHash +Trac: #509 + +Type: Feature +File: Host +Desc: new feature to notice the user how many hashes were removed because of pot file remove feature +Trac: #506 + +Type: Feature +File: Host +Desc: output the MAC address (BSSID) too when cracking WPA/WPA2, pot file output is different too +Trac: #440 + +Type: Change +File: Host +Desc: renamed -m 8800 = Android FDE to -m 8800 = Android FDE <= 4.3 + +Type: Change +File: Docs +Desc: Removed docs/credits.txt + +Type: Bug +File: Host +Desc: fixed problem with ADL fan speed information; only happening on some non-reference design Overdrive6 GPUs +Trac: #498 + +Type: Bug +File: Host +Desc: fixed crash with --debug-mode=x when number of rules was exactly 14 (approaching maximum amount of rules allowed) +Trac: #505 + +Type: Bug +File: Host +Desc: fixed inconsistency when using --show together with --username and different --outfile-format options +Trac: #513 + +* changes v1.21 -> v1.30: + +Type: Driver +File: Kernel +Desc: Added support for AMD Catalyst v14.6 and v14.7 (beta) driver + +Type: Driver +File: Kernel +Desc: Added support for NV ForceWare 340.24 driver + +Type: Driver +File: Host +Desc: added support for AMD ADL 7.0 + +Type: Reimplementation +File: Host +Desc: Rewrote dispatcher thread from scratch + +Type: Reimplementation +File: Kernel +Desc: Rewrote support for algorithm -m 7500 = Kerberos 5 AS-REQ Pre-Auth etype 23 as fast algorithm + +Type: Feature +File: Kernel +Desc: Added support for algorithm -m 23 = Skype +Trac: #474 + +Type: Feature +File: Kernel +Desc: Added support for algorithm -m 133 = PeopleSoft +Trac: #419 + +Type: Feature +File: Kernel +Desc: Added support for algorithm -m 3710 = md5($salt.md5($pass)) + +Type: Feature +File: Kernel +Desc: Added support for algorithm -m 3711 = Mediawiki B type +Trac: #410 + +Type: Feature +File: Kernel +Desc: Added support for algorithm -m 8800 = Android FDE + +Type: Feature +File: Host +Desc: Added support for algorithm -m 8900 = scrypt +Trac: #295 + +Type: Feature +File: Host +Desc: Allow the use of --show and --left while another instance of oclHashcat is running +Trac: #480 + +Type: Feature +File: Host +Desc: Added support for algorithm -m 9000 = Password Safe v2 + +Type: Feature +File: Host +Desc: Added support for algorithm -m 9100 = Lotus Notes/Domino 8 + +Type: Feature +File: Host +Desc: Added support for --increment with attack-mode 6 and attack-mode 7 +Trac: #450 + +Type: Change +File: Kernel +Desc: Renamed -m 112 = Oracle 11g to -m 112 = Oracle 11g/12c + +Type: Change +File: Kernel +Desc: Renamed -m 5200 = Password Safe SHA256 to -m 5200 = Password Safe v3 + +Type: Change +File: Kernel +Desc: Renamed -m 5800 = Samsung Android Password/PIN to -m 5800 = Android PIN + +Type: Bug +File: Kernel +Desc: fixed bug in warp kernels were zero-byte leading plains are incorrectly displayed +Trac: #428 + +Type: Bug +File: Kernel +Desc: fixed bug in SAP CODVN B (BCODE) misses correct password in rare cases +Trac: #495 + +Type: Bug +File: Kernel +Desc: Enforce maximum password length for -m 8500 = RACF +Trac: #431 + +Type: Bug +File: Kernel +Desc: Rule iNX = Insert character X at position N didn't allow to insert a character at the very end of the plain +Trac: #457 + +Type: Bug +File: Host +Desc: fixed bug in bitmap table leading to uncracked 64-bit based hashes if bitmap_size > 0xffff + +Type: Bug +File: Host +Desc: Separator for -m 22 = Juniper Netscreen/SSG (ScreenOS) should always be ':', regardless of --separator +Trac: #454 + +Type: Bug +File: Host +Desc: fixed memory problem of rules_optimize tool +Trac: #456 + +Type: Bug +File: Host +Desc: fixed crash with --show when using hash types which use "long" salts, e.g. -m 5600 +Trac: #489 + +Type: Bug +File: Host +Desc: fixed output problem when using --attack-mode 1/6/7, sometimes output was truncated +Trac: #494 + +Type: Bug +File: Rules +Desc: Reduced generated2.rule file to 64k (65536) rules +Trac: #436 + +* changes v1.20 -> v1.21: + +Type: Feature +File: Host +Desc: Added support for algorithm -m 2612 = PHPS + +Type: Feature +File: Kernel +Desc: Added support for algorithm -m 8600 = Lotus Notes/Domino 5 + +Type: Feature +File: Kernel +Desc: Added support for algorithm -m 8700 = Lotus Notes/Domino 6 + +Type: Workaround +File: Kernel +Desc: Fixed performance drop on descrypt, LM and oracle-old initiated by AMD drivers + +Type: Workaround +File: Host +Desc: Fixed problem with restoring ADL performance state when the clock size reported by the AMD driver didn't respect the clock step size +Trac: #435 + +Type: Workaround +File: Host +Desc: Fixed problem with setting ADL powertune value for r9 295x2 GPUs +Trac: #438 + +Type: Feature +File: Host +Desc: Added support for writing logfiles +Trac: #420 + +Type: Feature +File: Host +Desc: Added parameter --logfile-disable which should be self-explaining +Trac: #420 + +Type: Change +File: Host +Desc: Dictstat is now no longer session dependent and will always be based on oclHashcat installation directory +Trac: #437 + +Type: Change +File: Host +Desc: Use AMD custom profile settings instead of basing the AMD powertune/clock settings on maximum supported clock values +Trac: #433 + +Type: Bug +File: Host +Desc: Fixed VLIW size calculated by compute capability was broken for sm_50 -> cuModuleLoad() 301 + +Type: Bug +File: Host +Desc: Make --runtime count relative to real attack start not program start + +Type: Bug +File: Host +Desc: Fixed problem with potfile remove when there are hashes in the .pot file with invalid length for the specific hash type selected + +Type: Bug +File: Host +Desc: Don't allow --keyspace together with --increment or mask files +Trac: #430 + +Type: Bug +File: Host +Desc: Fixed bug with fan speed handling, if fan speed is manually set to a high enought value (e.g. 100%) oclHashcat shouldn't change it +Trac: #439 + +Type: Bug +File: Host +Desc: Problem with username parsing (--username) was fixed +Trac: #441 + +Type: Bug +File: Host +Desc: Fixed problem where IKE-PSK sha1/md5 (-m 5300/-m 5400) were wrongly recognized as shadow file formats +Trac: #443 + +Type: Bug +File: Host +Desc: Fixed problem where the 'delete range' rule (xNM) did not allow to remove charaters at the very end of the word +Trac: #444 + +Type: Bug +File: Host +Desc: Fixed memory problem when using .hcmask files together with --increment +Trac: #462 + +Type: Bug +File: Host +Desc: Fixed problem in benchmark mode when the user hits 'b' (bypass), the following algorithms were all skipped too +Trac: #469 + +Type: Bug +File: Host +Desc: Fixed Overdrive6 temperature query on some new AMD GPUs, fixes WARN: ADL_Overdrive5_Temperature_Get(): -5 +Trac: #476 + +* changes v1.01 -> v1.20: + +Type: Driver +File: Kernel +Desc: Added support for AMD Catalyst v14.4 (mantle) driver + +Type: Driver +File: Kernel +Desc: Added support for AMD new GPUs: "Spectre", "Spooky", "Kalindi", "Hainan", "Iceland", "Tonga" and "Mullins" + +Type: Driver +File: Kernel +Desc: Added support for NV ForceWare 331.67 driver + +Type: Driver +File: Kernel +Desc: Added support for NV new GPUs: "sm_50" (Maxwell) + +Type: Reimplementation +File: Kernel +Desc: Rewrote multihash structure, ex: 290x can now load up to 100,000,000+ MD5/NTLM hashes at once + +Type: Reimplementation +File: Kernel and Host +Desc: Rewrote rule engines (CPU and GPU) and made them more robust by synchronizing error handling + +Type: Reimplementation +File: Host +Desc: Rewrote restore system from scratch; no longer requires same system with same GPUs + +Type: Reimplementation +File: Host +Desc: Restructured .restore file; no longer create huge .restore files, stay < 2k of size + +Type: Reimplementation +File: Host +Desc: Rewrote weak-hash check; support all algorithm types including salted ones +Trac: #165 + +Type: Reimplementation +File: Host +Desc: Rewrote workload dispatching when progress is near to keyspace end; act more conservative + +Type: Reimplementation +File: Host +Desc: Rewrote mechanism to control the fan with AMD GPUs + +Type: Feature +File: Kernel +Desc: Added support for algorithm -m 22 = Juniper Netscreen/SSG (ScreenOS) +Trac: #235 + +Type: Feature +File: Kernel +Desc: Added support for algorithm -m 200 = MySQL323 +Trac: #377 + +Type: Feature +File: Kernel +Desc: Added support for algorithm -m 1421 = hMailServer +Trac: #401 + +Type: Feature +File: Kernel +Desc: Added support for algorithm -m 2410 = Cisco-ASA MD5 +Trac: #365 + +Type: Feature +File: Kernel +Desc: Added support for algorithm -m 4400 = md5(sha1($pass)) +Trac: #198 + +Type: Feature +File: Kernel +Desc: Added support for algorithm -m 4500 = Double SHA1 +Trac: #390 + +Type: Feature +File: Kernel +Desc: Added support for algorithm -m 4700 = sha1(md5($pass)) +Trac: #198 + +Type: Feature +File: Kernel +Desc: Added support for algorithm -m 4800 = MD5(Chap), iSCSI CHAP authentication +Trac: #214 + +Type: Feature +File: Kernel +Desc: Added support for algorithm -m 6251 = TrueCrypt 5.0+ PBKDF2-HMAC-RipeMD160 + AES + hidden-volume +Trac: #378 + +Type: Feature +File: Kernel +Desc: Added support for algorithm -m 6261 = TrueCrypt 5.0+ PBKDF2-HMAC-SHA512 + AES + hidden-volume +Trac: #378 + +Type: Feature +File: Kernel +Desc: Added support for algorithm -m 6271 = TrueCrypt 5.0+ PBKDF2-HMAC-Whirlpool + AES + hidden-volume +Trac: #378 + +Type: Feature +File: Kernel +Desc: Added support for algorithm -m 6281 = TrueCrypt 5.0+ PBKDF2-HMAC-RipeMD160 + AES + hidden-volume + boot-mode +Trac: #378 + +Type: Feature +File: Kernel +Desc: Added support for algorithm -m 7300 = IPMI2 RAKP HMAC-SHA1 +Trac: #233 + +Type: Feature +File: Kernel +Desc: Added support for algorithm -m 7600 = Redmine Project Management Web App +Trac: #391 + +Type: Feature +File: Kernel +Desc: Added support for algorithm -m 7700 = SAP CODVN B (BCODE) +Trac: #177 + +Type: Feature +File: Kernel +Desc: Added support for algorithm -m 7800 = SAP CODVN F/G (PASSCODE) +Trac: #177 + +Type: Feature +File: Kernel +Desc: Added support for algorithm -m 7900 = Drupal7 +Trac: #326 + +Type: Feature +File: Kernel +Desc: Added support for algorithm -m 8000 = Sybase ASE +Trac: #193 + +Type: Feature +File: Kernel +Desc: Added support for algorithm -m 8100 = Citrix Netscaler +Trac: #369 + +Type: Feature +File: Kernel +Desc: Added support for algorithm -m 8200 = 1Password, cloudkeychain +Trac: #126 + +Type: Feature +File: Kernel +Desc: Added support for algorithm -m 8300 = DNSSEC (NSEC3) +Trac: #387 + +Type: Feature +File: Kernel +Desc: Added support for algorithm -m 8400 = WBB3, Woltlab Burning Board 3 +Trac: #181 + +Type: Feature +File: Kernel +Desc: Added support for algorithm -m 8500 = RACF +Trac: #192 + +Type: Feature +File: Kernel +Desc: Added support for $2y$ and $2a$ bcrypt signatures +Trac: #251 + +Type: Feature +File: Kernel +Desc: Added support for higher cost factors for -m 400 = phpass +Trac: #280 + +Type: Feature +File: Kernels +Desc: Increased support for username length up to 20 for -m 1100 = Domain Cached Credentials, mscash +Trac: #379 + +Type: Feature +File: Kernels +Desc: Increased support for username length up to 20 for -m 2100 = Domain Cached Credentials2, mscash2 +Trac: #379 + +Type: Feature +File: Kernels +Desc: Added support for mixed cracking WPA and WPA2 at once, no more need for split +Trac: #388 + +Type: Feature +File: Host +Desc: Added support for Tesla Deployment Kit v5.319.85 + +Type: Feature +File: Host +Desc: Added parameter --workload-profile to give the user a convenient way to set the reduced, default or tuned performance tuning options + +Type: Feature +File: Host +Desc: Added parameter -s for use in distributed computing, mark skip of range of keyspace + +Type: Feature +File: Host +Desc: Added parameter -l for use in distributed computing, mark length of range of keyspace + +Type: Feature +File: Host +Desc: Added parameter --keyspace for use in distributed computing, calculate keyspace + +Type: Feature +File: Host +Desc: Load already cracked hashes from potfile on startup to avoid double cracking + +Type: Feature +File: Host +Desc: Added inline induction directory that can be used for on-the-fly adding of new password candidates + +Type: Feature +File: Host +Desc: Added switch --loopback to automatically write cracked plains into a file in the induction directory + +Type: Feature +File: Host +Desc: Added debugging support for rules as in hashcat CPU; used for rule- and dictionary efficiency analysis + +Type: Feature +File: Host +Desc: Added parameter --debug-mode and --debug-file to write found plains and/or rules as in hashcat CPU + +Type: Feature +File: Host +Desc: Added --debug-mode 4 == original_plain:rule:modified_plain +Trac: #317 + +Type: Feature +File: Host +Desc: Added tweaks for AMD OverDrive 6 (powercontrol, core- and mem-clock profiles) + +Type: Feature +File: Host +Desc: Added switch --powertune-disable to allow users to disable automatic power tuning for AMD OverDrive 6 + +Type: Feature +File: Host +Desc: Added --induction-dir to allow the users to specify the folder which will be used instead of the default induct folder + +Type: Feature +File: Host +Desc: Added --outfile-check-dir to allow the users to specify the folder which should be monitored for cracked hashes + +Type: Feature +File: Host +Desc: Added --outfile-check-timer to allow the users to control the outfile/potfile reading frequency (0 = disabled) + +Type: Feature +File: Host +Desc: Added periodic outfile reading such that user can remove hashes while cracking by appending the hash[:salt]:plain to the file + +Type: Feature +File: Host +Desc: Added support for automatic detection for hashfile-formats like pwdump, passwd, shadow, etc. +Trac: #393 + +Type: Feature +File: Host +Desc: Undo fan speed changes by oclHashcat after stopping/aborting +Trac: #238 + +Type: Feature +File: Host +Desc: Added support loading $HEX[...] format from dictionaries + +Type: Feature +File: Host +Desc: Added switch --outfile-autohex-disable to disable $HEX[...] format + +Type: Feature +File: Host +Desc: Added switch --hex-wordlist to enable parsing words in wordlists given in hex + +Type: Feature +File: Host +Desc: Increased maximum bitmap size to 24 bits to speed up cracking of huge hashlists at once + +Type: Feature +File: Host +Desc: Added parameter --bitmap-max to help loading huge hashlists and with small gpu ram + +Type: Feature +File: Host +Desc: Added parameter --weak-hash-threshold to set a maximum number of salts for which weak hashes should be checked + +Type: Feature +File: Host +Desc: Added parameter --remove-timer to set the frequency the hash-file should be updated when using --remove + +Type: Feature +File: Host +Desc: Added bit for parameter --outfile-format to print the position of a candidate that cracked a hash + +Type: Feature +File: Host +Desc: Added parameter --status-automat to let oclHashcat display the status view in a machine readable format +Trac: #406 + +Type: Feature +File: Host +Desc: Added column "Skipped" to status display to showing skipped candidates because of cracked salt(s) + +Type: Feature +File: Host +Desc: Improved handling of signals and terminate events; SIGTERM support and windows cmd close handling +Trac: #143 + +Type: Feature +File: Host +Desc: Added ability to use restore files from previous versions in case the structure did not change + +Type: Feature +File: Host +Desc: Set default retain and abort temperatures for AMD OverDrive6 GPUs according to the values reported by ADL +Trac: #225 + +Type: Feature +File: Host +Desc: Added parameter -v to displays the version string (as -V does) +Trac: #252 + +Type: Feature +File: Host +Desc: Added support to load and save invalid salt characters used in descrypt +Trac: #269, #405 + +Type: Feature +File: Host +Desc: Added support for variable iteration number for -m 2100 = mscash2 +Trac: #380 + +Type: Feature +File: Host +Desc: outfile-check and potfile remove (at startup) can now also be used together with hash mode 2500 = WPA/WPA2 and 6800 = Lastpass +Trac: #400 + +Type: Feature +File: Host +Desc: Added rules_optimizer standalone binary for use with debug-rules mode 3 output files + +Type: Feature +File: Host +Desc: While parsing hashes on start inform user about the progress + +Type: Feature +File: Rules +Desc: Added InsidePro-HashManager.rule + +Type: Feature +File: Rules +Desc: Added generated2.rule, each one cracked a real hash, sorted by occourance. use head -XXXX to make a top XXXX +Cred: EvilMog + +Type: Change +File: Rules +Desc: Renamed passwordspro.rule to InsidePro-PasswordsPro.rule + +Type: Change +File: Host +Desc: Modified output plains to $HEX[...] format in case cracked password contains chars outside 0x20 - 0x80 ASCII range +Trac: #148 + +Type: Change +File: Host +Desc: Modified switch --potfile-disable to disable loading already cracked hashes from potfile on startup + +Type: Change +File: Host +Desc: Save potfile and dicstat in the current working directory instead of installation directory +Trac: #281 + +Type: Change +File: Host +Desc: Change input hash format for -m 2100 = mscash2 +Trac: #380 + +Type: Change +File: Host +Desc: Update tab completion for bash (in extra folder) to match up with new parameters + +Type: Change +File: Host +Desc: Renamed switch --disable-potfile to --potfile-disable to match up parameter logic + +Type: Change +File: Host +Desc: Renamed switch --disable-restore to --restore-disable to match up parameter logic + +Type: Change +File: Docs +Desc: Help and docs update to underline that OSX 10.9 uses same format as 10.8 +Trac: #236 + +Type: Change +File: Docs +Desc: Help and docs update to underline that MSSQL(2014) uses same format as MSSQL(2012) + +Type: Change +File: Docs +Desc: Removed examples.txt; see wiki for more information +Trac: #236 + +Type: Change +File: Host +Desc: Renamed hash type Joomla into 'Joomla < 2.5.18', -m 400 has now also the note about MD5(Joomla) +Trac: #402 + +Type: Bug +File: Kernel +Desc: Raw whirlpool -m 6100 hashes could not be cracked in -a 1 combinator mode + +Type: Bug +File: Host +Desc: If increment and masks were used in combination, status display needs reset to INIT after each iteration + +Type: Bug +File: Host +Desc: In attack-mode 1 and 7, if at least one word in right wordlist is exactly of length 31, memory corruption occoured over time + +Type: Bug +File: Host +Desc: Status timer should be enabled by default when in stdin mode +Trac: #218 + +Type: Bug +File: Host +Desc: Improved reading of fan speed and temperature; It sometimes failed when using twin GPUs on windows +Trac: #231 + +Type: Bug +File: Host +Desc: File handling ('Permission denied' error) fixed when using --remove with -m 2500 +Trac: #395 + +Type: Distribution +File: Packages +Desc: Created two packages for download: oclHashcat-* for AMD, cudaHashcat-* for CUDA + +* changes v1.00 -> v1.01: + +Type: Driver +File: Kernel +Desc: Added support for AMD Catalyst v13.12 + +Type: Feature +File: Host +Desc: Added switch --generate-rules-seed, sets seed used for randomization so rulesets can be reproduced + +Type: Feature +File: Host +Desc: Added some hcchr charset files in /charsets, some new files: Bulgarian, Polish, Hungarian +Cred: Rub3nCT + +Type: Bug +File: Host +Desc: When using -m 2500 w/ multi hccap files there was no error shown if the user mixed WPA and WPA2 networks, this is currently not allowed +Trac: #222 + +* initial version 1.00 + +first public release, oclHashcat is a fusion of oclHashcat-plus v0.15 and oclHashcat-lite v0.15 + +Type: Driver +File: Kernel +Desc: Added support for AMD Catalyst v13.8b* + +Type: Driver +File: Kernel +Desc: Added support for AMD Catalyst v13.9 + +Type: Driver +File: Kernel +Desc: Added support for AMD Catalyst v13.11b* + +Type: Driver +File: Kernel +Desc: Added support for AMD R9 series + +Type: Driver +File: Kernel +Desc: Added support for AMD APP SDK v2.9 + +Type: Feature +File: Kernel +Desc: Added support for algorithm -m 50 = HMAC-MD5 (key = $pass) + +Type: Feature +File: Kernel +Desc: Added support for algorithm -m 60 = HMAC-MD5 (key = $salt) + +Type: Feature +File: Kernel +Desc: Added support for algorithm -m 150 = HMAC-SHA1 (key = $pass) + +Type: Feature +File: Kernel +Desc: Added support for algorithm -m 160 = HMAC-SHA1 (key = $salt) + +Type: Feature +File: Kernel +Desc: Added support for algorithm -m 190 = sha1(LinkedIn) +Trac: #190 + +Type: Feature +File: Kernel +Desc: Added support for algorithm -m 1450 = HMAC-SHA256 (key = $pass) +Trac: #97 + +Type: Feature +File: Kernel +Desc: Added support for algorithm -m 1460 = HMAC-SHA256 (key = $salt) +Trac: #97 + +Type: Feature +File: Kernel +Desc: Added support for algorithm -m 1750 = HMAC-SHA512 (key = $pass) + +Type: Feature +File: Kernel +Desc: Added support for algorithm -m 1760 = HMAC-SHA512 (key = $salt) + +Type: Feature +File: Kernel +Desc: Added support for algorithm -m 7500 = Kerberos 5 AS-REQ Pre-Auth etype 23 + +Type: Feature +File: Host +Desc: Added tab completion for bash (in extra folder) + +Type: Feature +File: Host +Desc: Added support for Tesla Deployment Kit v5.319.43 + +Type: Feature +File: Host +Desc: Added support for NVAPI R319 + +Type: Feature +File: Host +Desc: Added switch --benchmark, run several hash modes in benchmark mode for speed tests + +Type: Feature +File: Host +Desc: Added switch --disable-restore option, don't write/update nor touch restore file + +Type: Feature +File: Host +Desc: Added support for hccap files containing several networks +Trac: #167 + +Type: Feature +File: Host +Desc: Show the status by hitting the s key or the Enter key, show the status when dict or mask Changed +Trac: #189 + +Type: Feature +File: Host +Desc: Show line progress for maskfiles (.hcmask) +Trac: #206 + +Type: rules +File: T0XlC.rule +Desc: cleaned, original T0XlC.rule +Cred: T0XlC + +Type: rules +File: T0XlCv1.rule +Desc: Added ruleset with 12000 random rules +Cred: T0XlC + +Type: rules +File: T0XlC_insert_00-99_1950-2050_toprules_0_F.rule +Desc: Added ruleset with insert rules from position 0 to position F (00-99,1950-2050) +Cred: T0XlC + +Type: rules +File: T0XlC_insert_space_and_special_0_F.rule +Desc: Added ruleset with insert rules from position 0 to position F (special characters) +Cred: T0XlC + +Type: rules +File: T0XlC_insert_top_100_passwords_1_G.rule +Desc: Added ruleset with insert rules from position 0 to position F (top 100 passwords) +Cred: T0XlC + +Type: Bug +File: Host +Desc: problem while performing the --remove operation in windows fixed - timing problem (Permission denied error) + +Type: Bug +File: Host +Desc: Fixed mask length display in status screen when using hash types that internally use unicode + +Type: Bug +File: Host +Desc: Hash files that did not end with a newline character were not parsed correctly + +Type: Bug +File: Host +Desc: Fixed crash when hitting CTRL-C, when receiving abort signals + +Type: Bug +File: Host +Desc: Fixed freeze, flush problem w/ progress at ~100% +Trac: #82 + +Type: Bug +File: Host +Desc: Fixed russian charset files (hcchr), removed unnecessary chars +Trac: #194 + +Type: Bug +File: Host +Desc: Fixes a crash when using --username together with --remove +Trac: #197 + +Type: Change +File: Host +Desc: new default status-timer value is 10 seconds instead of 1 minute diff --git a/docs/contact.txt b/docs/contact.txt new file mode 100644 index 0000000000..f3de5f4d4e --- /dev/null +++ b/docs/contact.txt @@ -0,0 +1,3 @@ +web: https://hashcat.net +email: atom@hashcat.net +irc: freenode #hashcat diff --git a/docs/license.txt b/docs/license.txt new file mode 100644 index 0000000000..ea5307875f --- /dev/null +++ b/docs/license.txt @@ -0,0 +1,22 @@ +The MIT License (MIT) + +Copyright (c) 2015 Jens Steube + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + diff --git a/docs/performance.txt b/docs/performance.txt new file mode 100644 index 0000000000..a684c0b453 --- /dev/null +++ b/docs/performance.txt @@ -0,0 +1,5 @@ +Performance Notes: +================== + +- Always Use the latest display driver +- To significantly improve performance use -w 3 diff --git a/docs/readme.txt b/docs/readme.txt new file mode 100644 index 0000000000..7866da0dde --- /dev/null +++ b/docs/readme.txt @@ -0,0 +1,222 @@ +oclHashcat v2.00 +================ + +NV users require ForceWare 346.59 or later +AMD users require Catalyst 14.9 or later + +## +## Features +## + +- World's fastest password cracker +- World's first and only GPGPU-based rule engine +- Free +- Open-Source +- Multi-GPU (up to 128 GPUs) +- Multi-Hash (up to 100 million hashes at once) +- Multi-OS (Linux & Windows native binaries) +- Multi-Platform (OpenCL & CUDA support) +- Multi-Algorithm (see below) +- Low resource utilization; you can still watch movies or play games while cracking +- Focuses on highly iterated modern hashes +- Focuses on dictionary-based attacks +- Supports distributed cracking +- Supports pause / resume while cracking +- Supports sessions +- Supports restore +- Supports reading words from file and stdin +- Supports hex-salt and hex-charset +- Built-in benchmarking system +- Integrated thermal watchdog +- 150+ Hash-types implemented with performance in mind +- ... and much more + +## +## Attack-Modes +## + +- Straight * +- Combination +- Brute-force +- Hybrid dict + mask +- Hybrid mask + dict + +* = Supports rules + +## +## Hash-Types +## + +- MD4 +- MD5 +- Half MD5 (left, mid, right) +- SHA1 +- SHA-256 +- SHA-384 +- SHA-512 +- SHA-3 (Keccak) +- SipHash +- RipeMD160 +- Whirlpool +- GOST R 34.11-94 +- GOST R 34.11-2012 (Streebog) 256-bit +- GOST R 34.11-2012 (Streebog) 512-bit +- Double MD5 +- Double SHA1 +- md5($pass.$salt) +- md5($salt.$pass) +- md5(unicode($pass).$salt) +- md5($salt.unicode($pass)) +- md5(sha1($pass)) +- md5($salt.md5($pass)) +- md5($salt.$pass.$salt) +- md5(strtoupper(md5($pass))) +- sha1($pass.$salt) +- sha1($salt.$pass) +- sha1(unicode($pass).$salt) +- sha1($salt.unicode($pass)) +- sha1(md5($pass)) +- sha1($salt.$pass.$salt) +- sha256($pass.$salt) +- sha256($salt.$pass) +- sha256(unicode($pass).$salt) +- sha256($salt.unicode($pass)) +- sha512($pass.$salt) +- sha512($salt.$pass) +- sha512(unicode($pass).$salt) +- sha512($salt.unicode($pass)) +- HMAC-MD5 (key = $pass) +- HMAC-MD5 (key = $salt) +- HMAC-SHA1 (key = $pass) +- HMAC-SHA1 (key = $salt) +- HMAC-SHA256 (key = $pass) +- HMAC-SHA256 (key = $salt) +- HMAC-SHA512 (key = $pass) +- HMAC-SHA512 (key = $salt) +- PBKDF2-HMAC-MD5 +- PBKDF2-HMAC-SHA1 +- PBKDF2-HMAC-SHA256 +- PBKDF2-HMAC-SHA512 +- MyBB +- phpBB3 +- SMF +- vBulletin +- IPB +- Woltlab Burning Board +- osCommerce +- xt:Commerce +- PrestaShop +- Mediawiki B type +- Wordpress +- Drupal +- Joomla +- PHPS +- Django (SHA-1) +- Django (PBKDF2-SHA256) +- EPiServer +- ColdFusion 10+ +- Apache MD5-APR +- MySQL +- PostgreSQL +- MSSQL +- Oracle H: Type (Oracle 7+) +- Oracle S: Type (Oracle 11+) +- Oracle T: Type (Oracle 12+) +- Sybase +- hMailServer +- DNSSEC (NSEC3) +- IKE-PSK +- IPMI2 RAKP +- iSCSI CHAP +- Cram MD5 +- MySQL Challenge-Response Authentication (SHA1) +- PostgreSQL Challenge-Response Authentication (MD5) +- SIP Digest Authentication (MD5) +- WPA +- WPA2 +- NetNTLMv1 +- NetNTLMv1 + ESS +- NetNTLMv2 +- Kerberos 5 AS-REQ Pre-Auth etype 23 +- Netscape LDAP SHA/SSHA +- LM +- NTLM +- Domain Cached Credentials (DCC), MS Cache +- Domain Cached Credentials 2 (DCC2), MS Cache 2 +- MS-AzureSync PBKDF2-HMAC-SHA256 +- descrypt +- bsdicrypt +- md5crypt +- sha256crypt +- sha512crypt +- bcrypt +- scrypt +- OSX v10.4 +- OSX v10.5 +- OSX v10.6 +- OSX v10.7 +- OSX v10.8 +- OSX v10.9 +- OSX v10.10 +- AIX {smd5} +- AIX {ssha1} +- AIX {ssha256} +- AIX {ssha512} +- Cisco-ASA +- Cisco-PIX +- Cisco-IOS +- Cisco $8$ +- Cisco $9$ +- Juniper IVE +- Juniper Netscreen/SSG (ScreenOS) +- Android PIN +- GRUB 2 +- CRC32 +- RACF +- Radmin2 +- Redmine +- Citrix Netscaler +- SAP CODVN B (BCODE) +- SAP CODVN F/G (PASSCODE) +- SAP CODVN H (PWDSALTEDHASH) iSSHA-1 +- PeopleSoft +- Skype +- 7-Zip +- RAR3-hp +- PDF 1.1 - 1.3 (Acrobat 2 - 4) +- PDF 1.4 - 1.6 (Acrobat 5 - 8) +- PDF 1.7 Level 3 (Acrobat 9) +- PDF 1.7 Level 8 (Acrobat 10 - 11) +- MS Office <= 2003 MD5 +- MS Office <= 2003 SHA1 +- MS Office 2007 +- MS Office 2010 +- MS Office 2013 +- Lotus Notes/Domino 5 +- Lotus Notes/Domino 6 +- Lotus Notes/Domino 8 +- Bitcoin/Litecoin wallet.dat +- Blockchain, My Wallet +- 1Password, agilekeychain +- 1Password, cloudkeychain +- Lastpass +- Password Safe v2 +- Password Safe v3 +- eCryptfs +- Android FDE <= 4.3 +- TrueCrypt 5.0+ + +## +## Tested OS's +## + +- All Windows and Linux versions should work on both 32 and 64 bit + +## +## Tested GPU's +## + +- All NVidia CUDA enabled cards >= sm_20 +- All AMD OpenCL enabled cards >= HD 5000 + +To get started, run the example scripts or check out docs/user_manuals.txt diff --git a/docs/rules.txt b/docs/rules.txt new file mode 100644 index 0000000000..6251bc920a --- /dev/null +++ b/docs/rules.txt @@ -0,0 +1,58 @@ +#define RULE_OP_MANGLE_NOOP ':' // does nothing +#define RULE_OP_MANGLE_LREST 'l' // lower case all chars +#define RULE_OP_MANGLE_UREST 'u' // upper case all chars +#define RULE_OP_MANGLE_LREST_UFIRST 'c' // lower case all chars, upper case 1st +#define RULE_OP_MANGLE_UREST_LFIRST 'C' // upper case all chars, lower case 1st +#define RULE_OP_MANGLE_TREST 't' // switch the case of each char +#define RULE_OP_MANGLE_TOGGLE_AT 'T' // switch the case of each char on pos N +#define RULE_OP_MANGLE_REVERSE 'r' // reverse word +#define RULE_OP_MANGLE_DUPEWORD 'd' // append word to itself +#define RULE_OP_MANGLE_DUPEWORD_TIMES 'p' // append word to itself N times +#define RULE_OP_MANGLE_REFLECT 'f' // reflect word (append reversed word) +#define RULE_OP_MANGLE_ROTATE_LEFT '{' // rotate the word left. ex: hello -> elloh +#define RULE_OP_MANGLE_ROTATE_RIGHT '}' // rotate the word right. ex: hello -> ohell +#define RULE_OP_MANGLE_APPEND '$' // append char X +#define RULE_OP_MANGLE_PREPEND '^' // prepend char X +#define RULE_OP_MANGLE_DELETE_FIRST '[' // delete first char of word +#define RULE_OP_MANGLE_DELETE_LAST ']' // delete last char of word +#define RULE_OP_MANGLE_DELETE_AT 'D' // delete char of word at pos N +#define RULE_OP_MANGLE_EXTRACT 'x' // extract X chars of word at pos N +#define RULE_OP_MANGLE_OMIT 'O' // omit X chars of word at pos N +#define RULE_OP_MANGLE_INSERT 'i' // insert char X at pos N +#define RULE_OP_MANGLE_OVERSTRIKE 'o' // overwrite with char X at pos N +#define RULE_OP_MANGLE_TRUNCATE_AT '\''// cut the word at pos N +#define RULE_OP_MANGLE_REPLACE 's' // replace all chars X with char Y +#define RULE_OP_MANGLE_PURGECHAR '@' // purge all instances of char X +#define RULE_OP_MANGLE_DUPECHAR_FIRST 'z' // prepend first char of word to itself. ex: hello -> hhello +#define RULE_OP_MANGLE_DUPECHAR_LAST 'Z' // append last char of word to itself. ex: hello -> helloo +#define RULE_OP_MANGLE_DUPECHAR_ALL 'q' // duplicate all chars. ex: hello -> hheelllloo +#define RULE_OP_MANGLE_EXTRACT_MEMORY 'X' // insert substring delimited by N and M into current word at position I +#define RULE_OP_MANGLE_APPEND_MEMORY '4' // insert the word saved by 'M' at the end of current word +#define RULE_OP_MANGLE_PREPEND_MEMORY '6' // insert the word saved by 'M' at the beginning of current word + +#define RULE_OP_MEMORIZE_WORD 'M' // memorize current word + +#define RULE_OP_REJECT_LESS '<' // reject plains of length greater than N +#define RULE_OP_REJECT_GREATER '>' // reject plains of length less than N +#define RULE_OP_REJECT_CONTAIN '!' // reject plains that contain char X +#define RULE_OP_REJECT_NOT_CONTAIN '/' // reject plains that do not contain char X +#define RULE_OP_REJECT_EQUAL_FIRST '(' // reject plains that do not contain char X at first position +#define RULE_OP_REJECT_EQUAL_LAST ')' // reject plains that do not contain char X at last position +#define RULE_OP_REJECT_EQUAL_AT '=' // reject plains that do not contain char X at position N +#define RULE_OP_REJECT_CONTAINS '%' // reject plains that contain char X less than N times +#define RULE_OP_REJECT_MEMORY 'Q' // reject plains that match the plain saved (see M), i.e. if unchanged + +/* hashcat only */ + +#define RULE_OP_MANGLE_SWITCH_FIRST 'k' // switches the first 2 chars. ex: hello -> ehllo +#define RULE_OP_MANGLE_SWITCH_LAST 'K' // switches the last 2 chars. ex: hello -> helol +#define RULE_OP_MANGLE_SWITCH_AT '*' // switches the first 2 chars after pos N. ex: hello -> hlelo +#define RULE_OP_MANGLE_CHR_SHIFTL 'L' // bitwise shift left char at pos N. ex: hello0 -> hello` +#define RULE_OP_MANGLE_CHR_SHIFTR 'R' // bitwise shift right char at pos N. ex: hello` -> hello0 +#define RULE_OP_MANGLE_CHR_INCR '+' // bytewise increase at pos N. ex: hello0 -> hello1 +#define RULE_OP_MANGLE_CHR_DECR '-' // bytewise decreate at pos N. ex: hello1 -> hello0 +#define RULE_OP_MANGLE_REPLACE_NP1 '.' // replaces character @ n with value at @ n plus 1 +#define RULE_OP_MANGLE_REPLACE_NM1 ',' // replaces character @ n with value at @ n minus 1 +#define RULE_OP_MANGLE_DUPEBLOCK_FIRST 'y' // duplicates first n characters +#define RULE_OP_MANGLE_DUPEBLOCK_LAST 'Y' // duplicates last n characters +#define RULE_OP_MANGLE_TITLE 'E' // lowercase everything then upper case the first letter and every letter after a space diff --git a/docs/status_codes.txt b/docs/status_codes.txt new file mode 100644 index 0000000000..3282ff7257 --- /dev/null +++ b/docs/status_codes.txt @@ -0,0 +1,8 @@ +status codes on exit: +===================== + +-2 = gpu-watchdog alarm +-1 = error + 0 = OK/cracked + 1 = exhausted + 2 = aborted diff --git a/docs/user_manuals.txt b/docs/user_manuals.txt new file mode 100644 index 0000000000..d6dd7829fd --- /dev/null +++ b/docs/user_manuals.txt @@ -0,0 +1,3 @@ +The user manuals are constantly updated. Thats why they are not part of the distribtion. + +For more detailed Informations and advanced hashcat usage visit our Wiki: http://hashcat.net/wiki diff --git a/example.dict b/example.dict new file mode 100644 index 0000000000..3e4c007a36 --- /dev/null +++ b/example.dict @@ -0,0 +1,129988 @@ +0 +00 +000 +0000 +00000 +000000 +0000000 +00000000 +000000000 +0000000000 +000000009 +00000001 +000000011 +0000001976 +0000002427 +00000040 +0000007 +000001 +00000188 +0000019 +000007 +00000x +00001 +00001080 +00001111 +00001234 +00001478 +00001969 +000022 +00003712 +00005 +000050 +00006 +00007 +00009090 +00009111 +00009715 +0000qw +0001000 +00010001 +00010207 +0001051462 +000111 +000111000 +000111679 +000123123 +000123258 +000134 +000143 +00014563 +000147000 +000153 +000159 +000173000 +0001779313 +000182 +0001972 +0001987 +0002006 +000222 +000229 +000235285 +000249 +000287075 +000321 +000325 +000333 +000444 +000462 +0005196127 +000548 +00055244 +00056325 +000567 +000568264 +000571 +0007 +000715 +00071a +00087261 +000925 +000965 +0009732 +00097329 +000988 +000aaa +000abl9f +000c12g7 +000cnp000 +000ersin +000luohg +000magick +000shizuka +001 +00100 +001001 +0010068163 +0010069879 +001007 +00101000 +0010293847 +001032077 +00104898 +00105876 +001071 +0011 +001100 +001122 +00112230 +001140 +00114477 +00114843 +001158 +00118835 +00119945 +0011kam +00123 +0012345 +001235 +001239 +0012550800 +001291 +00129961 +00130000 +00130013 +001301 +00132580 +00132809 +001329 +001337 +00134199 +00135799 +00137528 +0013845 +00140187 +001405 +001429 +001450 +001453 +00145961 +00146803 +00147284 +00147896 +001513 +0016492437 +001663 +00171810 +00174548 +00174800 +00175329 +0017908 +00180018 +001809FF +0018754 +001876 +00190046 +00191047 +001926 +001957 +00197900 +001980 +0019800840 +00198506 +001986 +001988 +00198800 +001989 +001991 +001992 +001993 +001995 +001alten +001direc +001gza +001heslo +001major +002002 +002006 +0020134537 +00203 +0020602060 +00207795 +00210335 +002121 +00215487 +002200 +0022001l +002208476 +00221235 +002222 +002233 +0022336809 +002266 +002298 +0023200232 +002327 +002332 +00233871 +002392 +00242474 +00243035 +0024bk +0025014 +002514 +00255500 +002688701 +00270027 +002707 +002731186 +002758 +00278452 +002819 +002929 +002pism +0030 +0030032 +003083ce +0030aer1 +0031032 +00311967 +00313206 +00313387 +00313582 +00314 +003214 +003263 +0034 +003400 +003412 +0034579 +00346000 +003487 +00349795 +003544 +00359887 +00376370 +00377147 +00383351 +0039dafi +003a9cd5 +0040148 +004063 +00414806 +00415581 +00417099 +0041a511 +00424424 +00425c +004296 +0043475132 +004403850 +004455q +00451316 +00452355 +004656 +004703 +004707 +0047204 +00480e38 +00481 +00483940 +0048sam +00490049 +0049345 +005008004 +00508000 +00511440 +00518518 +005212686 +00531531 +0053695 +0053ds08 +0053fb +0054400 +005500 +00553236 +00554123 +00561100 +005691 +005691 +005806 +00594824 +005993 +005alive +005ki +005n005n +00601602 +006045 +0060860a +006241 +006321 +006458200 +006525 +00657545 +00657725 +006676 +0066789 +006crap +007 +007007 +0070076103 +007008 +0070220207 +0070717 +0070901 +007188 +0071lapb +00720072 +00734260 +00751185 +0075703 +0076963 +007700 +007770 +00777a19 +0077kike +007803928 +00784581 +007a4 +007aas +007ambiorix +007d8sa7 +007dicey +007gosu*** +007ha261 +007isthe +007jo123 +007konto +007matthias +007tyran +007xps +0080 +0080018086 +0082 +00830957 +00832139 +00832369 +00866022 +0087082 +00881144 +0088zz +00890089 +009 +0090094c +00901681 +00904140 +009079 +0092363948 +00931687 +0094eb +00950e +009546 +0096341 +0096587 +00967515 +00967965 +00968414 +00969133 +0096923919 +009700 +009710 +00972456 +00981357 +009961 +009988 +00PS +00SonGoten +00a10784 +00aa00bb +00alero +00birthday +00blade00 +00bond +00bouer +00d9f04f +00e058 +00eyeballs +00gisborn +00goofy +00haha +00hasi00 +00heinz00 +00hideki00 +00hier +00khaled00 +00laban +00lakris +00leia00 +00ludi +00matthew +00nase00 +00nnuu33 +00o99i +00osiem +00polo00 +00queed +00raymond +00saab93 +00sevenn +00shane0 +00snorres +00sweets +00trolls +00tuesday0 +00utcast +00vernon +00vertigo +00whiteboy +00working +00x8y9y +00xel +00y7ct +01 +01003765 +01004797 +0101 +010101 +01010101 +01010202 +010108dh +01011928 +01011956 +01011966 +01011968 +01011970 +01011971 +01011980 +01011985 +01011986 +01011988 +01011991 +01011992 +0101200 +01012004 +0101239034 +010136 +0101368388 +0101387354 +0101535229 +010161 +010178 +0101800540 +010183aa +010188 +0101889966 +010190 +01019090 +010193pz +0101991336 +0101rojo +0102 +010200 +0102005263 +01020102 +010201023 +010203 +0102030 +01020304 +0102030405 +0102033 +0102034 +010203a +010205 +01020708 +0102120210 +01021975 +01021976 +01021990 +01022837 +010236547 +0102501254 +0102533060 +010256001 +0102571003 +0102617165 +0102939415 +010302 +0103060120 +010310 +01031975 +01031984 +01031990 +01032227 +0103346783 +01036392 +010367 +010376 +0103775433 +010392 +010392z +010403 +01041958 +01041972 +0104485802 +010458 +0104667184 +010467 +0104685228 +010470 +010474 +0104826775 +010492 +0104982241 +010505050 +0105067196 +0105119371 +01051927 +0105311157 +010535008 +01057921 +010587 +0105890998 +010599 +01060106 +010605 +010607 +01060815 +01061077 +01061343 +0106151013 +01061976 +01061982 +01061989 +01061991 +0106273810 +0106466557 +0106634121 +010665 +0106740413 +010689 +010693 +010695 +0106968054 +0106rcxz +01070107 +010703 +0107030254 +0107033 +01072541 +01072732 +01073310 +010769 +010772 +0108 +01081973 +01081977 +01081981a +01081983 +01081984 +01082006 +0108406435 +01086294 +0108704268 +010871 +01087791 +010880 +0108842224 +01091956 +01091984 +01091987 +01091999 +0109226185 +010939 +0109616626 +0109824288 +010990 +0110020 +01101976 +01101978 +01101985 +01101987 +01101992 +0110203040 +01102513 +011035 +01105552 +011103j +011112726 +01111973 +01111978 +01111986 +01111988 +011183l +011189 +01121988 +01121989 +01121992 +01122005 +01124 +011267 +0113 +01131226 +0113179077 +01131945 +01131982j +0113401134 +01141994 +011492 +01150115 +011603291 +0117 +01171e +0117501175 +01178063 +011839rr +0118bdf +01190857 +011910 +011955 +011965 +011974 +0119830 +011e496q +012 +0120 +012005033 +01201291 +012098cs +01210621 +01211014 +01212847 +0121479959 +0121722009 +0121909334 +0121938372 +0121gelmar +0122292863 +0122715122 +0122802895 +0123 +01230 +012300 +01230123 +01231045 +0123151729 +0123175710 +0123219518 +01233 +01234 +012345 +0123456 +01234560 +0123456700 +0123456789 +0123458430 +012346 +0123506727 +0123547862 +0123591977 +0123698745 +0123706916 +0123721056 +0123880877 +0123898570 +0123nn +0124044176 +0124047347 +0124050060 +0124075049 +0124161300 +01242 +0124450661 +0124493867 +01245158 +01245483 +0124566159 +01246050 +01246203 +01247163 +01247426 +0125126 +012567 +012569 +0125703788 +0125820722 +01260126 +01260977 +01261979 +0126480770 +0126600909 +0126646039 +012680 +0127037484 +0127058892 +0127081 +012728 +0127518792 +01275283 +0127570024 +0127582627 +0127643838 +0127812 +0127961463 +0128377913 +0128687195 +0129 +0129025015 +01291973 +0129919801 +0129ak +01300130 +013013013 +013090 +01313358 +01315980 +0133688200 +0134083983 +013443801 +0134679 +0134752145 +01348757 +01350135 +01350283 +0135790 +013766 +013835081 +01383885 +013932 +0139832297 +0139940276 +013ro +01400140 +014003926 +01430143 +014353 +0143kids +014520 +014523 +01454634 +014563200 +014564542 +0146545 +014658020 +0147 +01470147 +0147258369 +01475364 +01477410 +0147852 +01478520 +0147852369 +01478546 +0147856 +014789 +01478963 +014795 +014826377 +01486300 +01486305 +01487572 +01488a +0149 +0152 +015248179 +01525sky +0153299 +01533510 +01540056 +01544917 +015469884 +015501 +01558381 +015604 +015903475 +0159341b +01595656 +01597530 +015e9e85 +01604351 +0160bb +0160pede +0161665561 +016220358 +0163112296 +0163333818 +016360934 +0163687618 +016375100 +01640164 +0164065346 +0164067627 +016606678 +01661829 +01662217 +016626371 +0166494292 +016650451 +0166603281 +01669717 +0167301088 +016822 +0168758990 +0169 +01693556 +01701297 +0170238 +017080700 +0171418 +0172 +017251547 +01727914 +0172815034 +01728445 +0173639632 +017428 +0174799 +01749131 +017492321 +01750175 +017577 +0175elro +01763010 +01764118 +017710 +0178xs96 +01790179 +0180324 +01805 +0181 +0181410679 +018253576 +0185857559 +0186320 +0186c835 +018820731 +01900190 +0190143 +01901786 +0190422422 +0190anja +0190mz +01911072 +019136019 +0192039809 +019283 +0192837465 +0192p1 +0193347330 +01936 +0194269280 +0194610679 +019542 +01955 +0196149102 +0196523 +0197184931 +01972013 +01973230 +0198380687 +01985 +0198605439 +019910 +019d5f +01Neunauge10 +01Password +01ad01 +01admon +01aldi +01az23er +01baug06 +01blkz06 +01breeze +01ca9db +01chicory +01d71402 +01deborah +01fast01 +01gaurav +01inessa +01joejoe +01johnny +01joomla +01koopa +01l1vw +01laarti +01mag19 +01man +01matthi +01nubiana +01papirus +01patti +01pebbles +01qgc +01reaver +01regreso +01sep01 +01sumayyah +01surfer +01test +01umpf +020071015 +02007p +0200963 +020106009 +020109001 +02011511 +02011986 +02011989 +02011991 +02011994 +020199 +0201hemj +020201 +020202 +02020202 +0202021020 +02021015 +0202171723 +02021963 +02021966 +02021972 +02021985 +02021987 +02021993 +020225002 +02022603 +020281 +020291 +020293 +02031990 +020386 +020389 +02039693 +020405 +02040817 +0204082 +02041114 +02041974 +02041983 +02041984 +020463 +02048793 +020493 +020494 +0204wolf +020516619 +02051989 +02051990 +020561 +020584cu +020587t +0205882013 +0205884119 +020590 +020592 +0205ashley +0205cdfa +0205jsc +0206 +020601036 +02060429 +02060915 +02061981 +02061991 +02061992 +0206432376 +0206540686 +020684 +020688 +0206coaz +02070122 +02071971 +02071979 +02071986 +02072132 +020753 +020787 +020802 +020803 +02081990 +02082002 +020850 +0208811842 +020891 +02091967 +02091976 +02092066 +020975Dm +020f28 +020goeke +02101939 +02101985 +02101987 +02101989 +02101994 +021021 +02102532 +021075 +021077174 +021086 +021089 +02109 +0210neno +02110211 +02110281 +02111983 +02111984 +02111988 +02112004 +0211218818 +0211451992 +021162 +021175 +021191 +021192hi +021203 +02121980 +02121983 +02121985 +02121991 +021221627 +021268 +021280 +021281 +021282 +0212974 +0212wall +021353 +02137 +0213koodi +021416874 +0214179 +02144502 +021476590 +0214863 +021500 +021501 +02153460 +0216 +02160516 +0217 +021702 +021722638 +02173181 +02179492 +021797820 +02180106 +02180218 +02181959 +0218218265 +02190219 +02191944 +0219700731 +0219kilt +021ed3 +02201964 +02203505 +0220421177 +02205 +0220857 +022089kk +02213891 +02219556 +0222001 +0222092512 +022254423 +022362626 +022390 +022414006 +022415 +022473 +02247622 +022477 +022485 +022520550 +0225588 +022585 +02262255 +02269b +02271307 +022721262 +022724386 +0227932 +02281109 +02282524 +0228296 +02283390 +02283620 +02284080 +022840801 +022892 +02291972 +022931012 +022x +023 +02302 +0231 +02311808 +0231483909 +02315773 +02316840 +02316899 +023187789 +02338081 +02350598 +023519 +0235458540 +0235632730 +0235689 +02360236 +023796766 +023899 +0239502395 +024062426 +0240786 +024080 +0240Feet +024124694 +0241258475 +024180 +02421006 +024287 +024337506 +02437236 +02450841 +0245111052 +024528193 +024562hy +02460343 +02468 +0246846 +0248 +0248202 +024824012 +02489798 +0250010 +025063m +025100008 +025113063 +025121 +0251690732 +0251jp +025213189 +02525256 +02525548 +025388 +02540254 +025438 +0258 +02580258 +025817511 +0258520 +025861311 +0258666 +02587410 +02588520 +02591 +025921980 +0259232 +02592820 +025f3 +02611 +02614261 +0263 +02633 +026516977 +026605 +02661846 +02662475 +02662640 +02664221 +026723317 +02673 +026762664 +026769933 +0268 +02691985 +026951 +02696614 +02698615 +02706833 +0274nt +0275035 +02776631 +02780278 +02799655 +0280280 +028159e +028300 +0283240324 +02834401 +0283552300 +02836106 +028361631 +028435714 +0286 +02869618 +02870593 +02870932 +02903859 +029231642 +02939896 +0293fadi +029507598 +02966931 +02974957 +029772623 +029781285 +029828175 +02990299 +029hd +02Gard +02Hocus +02Peeker +02a204 +02a8463 +02at313 +02bartels +02bentley +02brianna +02d9ur +02duran +02edb3 +02g0142 +02haeschen +02iamgod +02joefish +02jxb +02kh1962 +02leolinda +02lkjlkj +02lwvypx +02mary +02pnvfuh +02rettig +02rushmore +02s11623 +02se4391 +02sudhakar +02tgsx +02tourism +02z7r7 +03.09.1980 +03000300 +0300167471 +030023368 +03008827 +03011987 +03011989 +03012006 +030182 +030183b +030192 +0302 +030211735 +03021966 +03021984 +03021986Z +03021992 +0302301859 +030286 +0302992533 +0303 +030303 +030309. +03031412 +03031968 +03031974 +03031985 +03031993i +03032006 +0303456e +030381125 +0303hi +0304030412 +0304182 +0304194808 +03041980 +03041989 +03041990 +03042552 +030479 +030487 +030489 +030493 +0304mb +03050405 +03051964 +03051971 +03051977 +03051988 +03051989 +03051990 +03052002 +03054412 +030558 +030575 +030580 +030588 +030595 +0306 +03061974 +03061975 +03061985 +03061986 +03061989j +030666 +030680 +030689 +0306root +03071988 +03074466 +030765661 +03077102 +030777mv +03077976 +0307803 +030789 +030793 +0308026 +030863 +030877 +030879 +0308swat +03091982 +03092002 +030986 +030987vk +030b4dcb +0310 +03100310 +03101974 +03101984 +03102514 +031031031 +031068 +031074 +031083 +03110792 +0311111111 +03111987 +03111989 +03112345 +03112394 +03113106 +03113136 +031153 +031154600 +031173 +031182 +031184 +031186ua +031192 +031193 +03119328 +0312 +03121219 +03121959 +03121989 +031224005 +031254 +031264 +031280 +031288 +031290 +031291 +03130313 +0313394 +03142516 +031499 +03157208 +03167030 +03177581 +031789 +03180831 +031828125 +03191990 +0319821020 +031lillen +03200007 +0320085 +0320095 +0320331462 +0320757672 +03208d81 +0321336 +0321654 +03216656 +0322 +03220322 +03223892 +032274 +032458 +032479 +03251860 +03258336 +03261111 +0326154879 +03270835a +03272001 +032792 +03280404 +03281991 +032878 +03294e +033077 +0330tyler +0331042 +033107sc +0331470856 +033180 +0331wim +03320 +03320072 +033220 +033320909 +033355402 +033430 +033441 +03344330 +033511017 +03354156 +0335duo +033957105 +03400340 +03407026 +03421018 +03423365 +034236 +03434769 +034520 +034606342 +034666980 +034690152 +03470347 +034906747 +0349310950 +035017534 +035037701 +035051010 +03510351 +035341114 +0353murlok +0354516 +035463384 +035468281 +0354sbc +035526370 +0355539452 +0355feva +035710 +03571428 +035757 +035912344 +0359404 +0359roy +0360aa +03618232 +0362092 +0363911717 +03640364 +0364461268 +036517018 +036519065 +03660426 +036628 +036641953 +036717460 +036774627 +036829 +036831511 +03690369 +036vi9 +03709 +0371cvag +037222 +03741234 +03751324 +037971970 +038120138 +038215em +038514 +03851850 +038756 +03884312 +0388Radar +038900326 +0390011 +03903962 +039322 +039338998 +03948482 +039510841 +039587033 +03961989 +039692522 +03@TAJ- +03admin +03amos03 +03august +03b132b0 +03b6fbea +03bolani +03c87 +03c887d +03cap +03charlie +03chevrolet +03chinook +03coffeeman +03dc3d +03drums +03e2d987 +03edriaw +03eidech +03falcon +03liverpool +03makeme +03milkman +03montessori +03moroney +03mtk +03napthali +03nosilla +03pcmw04 +03rc06cs +03robi03 +03rossac +03salvatore +03shaggy +03sleep +03ssssss +03ubt +0400031386 +04000400 +0400044 +040035 +040105 +04010906 +04011986 +04013525 +04016a91 +0401kira +040203012 +04021990 +04021991 +04025349 +040286 +040290 +0402920723 +0402980044 +0403021 +04031611 +04031982 +04031988 +040322 +0403523137 +0403620842 +0403693s +04038223 +040404 +04040831 +04040925 +04041960 +04045025 +040488 +0404903588 +040492 +0405 +040505 +0405081988 +04051990 +04052001 +0405400685 +0405t +04060909 +04061949 +04061989 +04061990 +040680 +0407 +040711 +0407112808 +04071979 +04071986 +04071988 +04071990 +040779a +040782mj +0407841387 +04078919 +040794321 +04081988 +04082003 +040881 +04088162 +040888 +040889 +04088978 +040892 +0408buss +0409 +04091985 +04091988 +04091998 +040977 +040987 +040995 +0409ajb +040rlf09 +04101963 +04101987 +04101989 +04105100 +041063 +041090 +04110411 +041106006 +04111168 +0411151980 +04111961 +04111980 +04112852 +041140934 +041152an +041180 +0411stefan +041204 +04121984 +041229 +041237395 +041264 +041274 +041286 +0412891500 +041298 +041376ch +041387 +041390 +041475 +04150605 +04151026 +0415205158 +04154807 +04166561 +041701ac +041706452 +0418 +0419649140 +0419730299 +0419850902 +0420 +042006 +04203 +042069 +042091 +042230 +0423005022 +0423601120 +0423donk +04240424 +0424284246 +04254007 +0425803571 +04271988 +04280508 +042888001 +042894 +042904 +042928 +0430 +04301103 +043013339 +043019 +0430312658 +043165967 +043183 +043202247 +043212 +0432995151 +043332831 +043699 +043727179 +04380438 +043kj6 +0440proview +04415061 +0441747s +044212971 +04423033 +044512 +044535 +044653135 +04498367 +0450404410 +0450705137 +045120163 +045235612 +04536770 +045432 +04546399 +045478 +0456 +0458015899 +04591942 +0461 +04630112 +046333 +04643423 +04670467 +046913007 +046936864 +047004477 +047047 +047155 +0471666073 +047261271 +0472691877 +047463 +0474686767 +047568505 +0475900769 +047631976 +0477616904 +0479592384 +0481392003 +0482153 +048367749 +048389111 +048410545 +04851023 +0485204646 +048521 +048586 +04862333 +0487577194 +048951 +04907d52 +0491311951 +0492899203 +0494058688 +0494676765 +049614115 +049678 +0498421542 +049968114 +049986984 +049989659 +04F63f +04JASMINE +04NZBT +04akos22 +04bang07 +04c788 +04cdb4b +04chipmunk +04connor +04df9e1 +04jesus +04ljrbbs +04malaika +04mull40 +04paddys +04pxc +04sailing +04sb13 +04seq +04sex454 +04splash +04t0zmqw +04vi75 +0500191477 +0500457457 +0500536466 +0501164781 +05011984 +05011989 +05012005 +0501296656 +050150 +050192 +0501dt +0501pi89 +0502009930 +0502188865 +05021960 +05021976 +05021982 +05021983 +0502217788 +0502327896 +050240897 +050280 +0502842129 +050293 +050294 +0502992274 +0502blue +0502teal +0503020010 +050307010 +0503092615 +0503113249 +050315x +05031959 +05031967 +05031986 +05031988 +05031994 +05031997 +0503409755 +0503416987 +0503724613 +0503805966 +050385 +050386 +050391 +0504 +050403009 +050404 +050405 +05041956 +05041984 +05041985 +0504448810 +050465 +050471 +0504845 +050486 +050488 +0505 +05051976 +05051985 +05051990 +05052002 +0505222995 +0505253371 +0505310504 +050532163 +0505395001 +0505459907 +050570 +050575 +0505781188 +0505808111 +0505818187 +050586 +050588u +050590 +0505924382 +0505J +05060405 +0506050148 +0506059022 +0506195436 +0506197426 +05061980 +05061984 +05061990 +0506282347 +050655 +05066 +050673 +0506736373 +050679 +0506804154 +050682 +050684 +050691 +0507111 +05071888 +05071986 +05072512 +0507338088 +050740798 +0507476844 +0507516411 +0507566901 +0507632800 +0507638462 +0507659120 +0507729419 +050793 +0508005202 +0508144013 +05081991 +0508215135 +050830002 +0508520443 +0508735736 +0508739744 +0508784417 +050880 +050888 +0508896772 +0508962696 +0508cm87 +05090523 +05091946 +05091978 +05091981 +05092004 +050944868 +050952509 +050974 +050985 +0509zg +051000 +05101982 +05101984 +05101992 +05105895 +051076 +051099 +05111926 +05111977 +05111982 +05111987 +05111988 +051143402 +051161 +051183 +051187 +0511921937 +05122521 +051278JT +051282 +051285 +051286 +051288 +0512oipc +051304 +05131722 +051323253 +05133 +05135577 +051385386 +051425047 +051435530 +051477a +051576080 +051589525 +0515ham +051609562 +05169354 +051761 +0518 +0518222426 +051867al +051940867 +051990 +051993 +052023658 +05203014 +0520741 +052090 +052141587 +052179 +052244313 +0522463892 +052260582 +05226184 +0522690285 +0523009060 +052301 +0523192371 +0523213511 +0523320144 +0523364195 +052342856 +0523564677 +05236985 +0523860086 +0524061491 +0524199104 +0524279711 +052447 +052465375 +052465451 +0524700170 +0524802830 +052490y +0524boum +0525119599 +052515559 +0525420978 +0525590950 +052562 +0525658620 +0525867074 +052598 +0526082381 +0526115084 +05261306 +0526200658 +052649 +0526632904 +0526790718 +052689 +052716392 +052732163 +0527646021 +0527722682 +05278298 +0528 +052802173 +052822005 +052877 +052889 +052891 +0528984037 +0528986080 +05291993 +052970 +052976438 +052987347 +05300816 +053032036 +05303991 +053101039 +053121820 +053189 +053282102 +053482709 +053486490 +053505 +05356694 +0535861654 +0535tr +053685122 +053691042 +0536963 +053701780 +053715414 +0537642 +053785355 +053850945 +0538679 +053894584 +053901316 +05394466 +0539521 +053960935 +054054054 +054142559 +054142692 +054203012 +054210 +054213 +05421e55 +0542361834 +054254175 +0542823621 +054299 +0544216666 +05442370 +0544247 +0544436826 +0544487459 +0544503040 +0544762283 +0544806317 +0544890411 +0545289416 +0545420022 +0545489769 +0545525 +0545536655 +054555738 +0545904776 +0545949845 +054653781 +0546692 +0547360716 +0547643484 +0547671625 +05478685 +0548023107 +0548421084 +054902355 +0549093116 +054934740 +054966578 +054h2o89 +05500550 +05501991 +0550226607 +0550779200 +0551169326 +0551445511 +0551744661 +055208920 +055232075 +055275015 +055311 +0553335879 +055397 +0553997999 +05545036 +0554670 +05546864 +05548554 +05550212 +05552623 +0555328607 +0555419336 +05555 +055555 +0555599704 +0555640770 +0555900370 +055605 +0556121329 +0556165727 +0556232125 +055652409 +0556557709 +0556640069 +055702338 +0557099056 +055711205 +0557137717 +0557337724 +0557385 +055748591 +055760 +0557711030 +0557c3 +0558734780 +0558855979 +0558910151 +055907011 +0559074414 +055907586 +0559572573 +055960561 +0559958810 +056149725 +056206010 +05623585 +0565112277 +056528840 +05656008 +056588572 +0565971975 +056650859 +056674220 +056710912 +05676229 +0568189888 +056844330 +0569000323 +0569268965 +057100 +05710571 +05710622 +05710632 +057120335 +05724 +0572451995 +0574010a +057592363 +0576601719 +0577 +057752430 +0577657 +0577970321 +05802052 +05827 +05830 +0585fa7 +0586888885 +058946720 +058962694 +058JZx +0590 +059025257 +05930593 +059331 +059345290 +059348 +059403937 +059712396 +0599051998 +0599322823 +0599482691 +0599686596 +05JEFFREY +05a04f69 +05admin +05adrianna +05anfang05 +05arjak +05bb4b +05boxman +05bretth +05c722 +05cheese +05chengrui +05d1c1f +05ddf3 +05de4662 +05domino +05ee594 +05france +05gtv6 +05housewife +05jamaica +05lanm +05ms10dt +05n3tw0rk597 +05national +05rbx +05remember +05se83 +05stephen +05stuart +05t540c +05thirty +05vikram +05zp05 +06 +06$044 +060008915 +060027289 +06008950 +060106301 +060165960 +060171 +060177 +06019800 +06020501 +06021987 +06021991 +060239140 +0602650073 +06027769 +0603 +06031978 +06031980 +06031983 +06031987 +060391 +0603ecdb +060410 +0604106 +0604118557 +06041978 +06042000a +06044879 +060486 +060511 +060512 +060512052 +06051979 +06052005 +060580545 +060583677 +060602 +06060606 +06061990 +06062006 +060622 +060644 +060677MG +0606794z +060686 +060690 +060691 +060693 +060696 +060702 +060719606 +06071987 +060745 +0607760210 +060782 +0607822441 +060784 +060791 +0608 +060804 +06081929 +06081961 +06081984 +060826 +060879 +060882 +060884 +060885 +06091980 +06091991 +060956 +060958 +0609861986 +060993947 +060999 +06101497a +061019820 +06101983 +06101992 +061022123 +061064 +0611000734 +06111904 +06111990 +06111997 +06112005 +0611318228 +0611401096 +061160 +061162 +06116890 +061177 +0611isa +0611soep +0612 +06121103 +06121975 +061242978 +061249930 +061258 +061282 +061305463 +06131106 +061329 +061338 +06140614 +061452jk +06151983 +0615830227 +06162923 +06163809 +061659827 +061692 +061718117 +061820 +0618251745 +06185190 +061864777 +061881974 +0619030252 +061964 +061979 +061987 +061991 +061bkw +062006 +062029 +062062893 +0622502818 +062313460 +06231903 +06231971 +06235 +062366 +062379710 +062389 +06240624 +062437881 +062491 +0624love +0625 +06250625 +0625520205 +062596630 +062610938 +062688 +0626qq +06273102 +062748144 +06281978 +0628620 +0629 +0629856190 +063009683 +063045 +0630585621 +063094340 +063117063 +063133 +0631441368 +0631474 +0631utt8 +06322044 +06330633 +0633304315 +063359725 +063362630 +06351 +063565 +063602205 +063854 +0638721627 +0638949046 +063915741 +0639167170 +0641735620 +0643533546 +06442263 +064440463 +0645006738 +064528 +064571255 +0646226 +0646659821 +064674487 +064690456 +06470647 +0649677128 +0650er +065125878 +065243146 +06528139 +065332245 +065370580 +0654502 +06596822 +0660094152 +0660539400 +0661 +066101486 +0661406132 +0662526985 +0662809525 +0663cora +06641945 +06647286 +0664955374 +0666 +0667 +066852 +066908694 +0669623 +0670399 +0670400 +06705117 +067150557 +067349521 +067626943 +067631035 +067653937 +06780678 +067951480 +068011 +068138757 +068215625 +068412267 +068480514 +068481342 +068559828 +0686056245 +0686244 +06868 +0687892018 +068790066 +06881453 +0688268132 +068840658 +068847849 +06890077 +06903425 +0690eb +06912010 +069147wr +0692175200 +0692833501 +069351135 +0695fab +069959838 +069Bella +069fju +069tyt +06Fantail +06Fatboy +06PRINCESS +06Zeppelin +06a6b1b +06alicia +06beresford +06blahblah +06c92da +06celsle +06chepe +06chewie +06com22 +06houses +06karatedo +06kudnl3 +06lilacs +06loomis +06midgette +06mudder +06mvm79 +06nev50 +06nov94 +06nti759 +06ogi296 +06reddog +06s045 +06thusitha +06tiffany +0700182780 +07007372 +07010312 +07010503 +07010914 +070152059 +0701mo +0701sar +070200 +070203 +07021139 +07021986 +07021989 +070271 +0702896512 +070294 +07031977 +07031985 +07031992 +070330128 +070362 +070386 +070393aa +070414 +07041776 +07041972 +0704603568 +070491 +070492 +070494js +0704957978 +07049911 +0704ella +0704misfits +070504 +07051 +07051906 +07051955 +0705297126 +0705679256 +070582 +070586 +0706 +0706226769 +0706631394 +0706729794 +0706751807 +070681523 +070683 +070686 +070687 +07070 +07071940 +07071968 +07071971 +07071988 +07080708 +07081979 +07081990 +07081991 +07081992 +07081998 +07081999 +0708275210 +070858t +070885rm +070890 +0708971110 +070898 +0708bts +0709 +0709151 +07091976 +070968 +07098741 +070e41a +07100710 +07101518 +071018 +07101949 +07101964 +07101988 +07101990 +071055 +071083407 +07111987 +07111996 +071133 +071182 +071184nr +071186 +071192 +0712121998 +07121973 +07121978 +07121986 +07121991 +071219me +07123456 +071281 +07130713 +07131206 +071312066 +07132005 +071517d0 +07157569 +071679et +0717 +071700 +071788 +071822241 +071980 +071985 +071986 +07201845 +072055447 +0720852818 +0721335297 +07213355 +0721919 +072269 +0722721580 +07227438 +072290 +0723122227 +0723360704 +0723910595 +0724294843 +07242b48 +072577 +07272006 +0727453329 +072793 +0728557700 +073192 +07323323 +073268ml +0733669926 +07350745 +073557854 +0736210190 +0736354133 +073754584 +073774e1 +0738285201 +073935216 +0739idc +074062 +0741208155 +0741743442 +0742427176 +074455067 +0745012061 +0747852948 +0748500556 +0748643834 +074873481 +074girls +075030 +07526812 +07530755 +0754fe +07550852 +075690ng +075759510 +076355704 +0763fjb +0764123 +076415003 +0764478339 +07652718 +076584539 +07685374 +076959047 +0771033669 +077127608 +077289331 +0773743416 +07745144 +0775250375 +0775546641 +0776425293 +077654830 +0777 +07770777 +077739201 +07775000 +0777676876 +0777888999 +077822941 +0778455723 +0778956134 +077909836 +0779259254 +0780 +078030 +078112025 +078217878 +0782heck +0784zfrt +078674525 +0788868299 +07890789 +0789laue +078e15d +078p6 +07907290 +0791104 +0792 +079242398 +07931505 +07948 +07951200 +0795282525 +0795602872 +079563219 +079605 +0796090542 +079686086 +079704210 +079801307 +079905969 +0799365 +07KERST +07alabaster +07c790 +07charlie +07chars +07crw +07frosch +07fusion +07grl42 +07jajaja +07knuckles +07marmee +07mg6738 +07monkey +07roma56 +07ryder +07static +07txv +07uu17 +07xhn +07zxcvbnm +08000709 +080013 +080069sm +0801020037 +080116 +08011938 +08012501 +080137081 +080167 +0802381410 +080303 +080305 +08031982 +08041986 +08041987r +08042004 +080487 +0804andy +0804mira +0804sido +08050212 +080503 +08051984 +08052004 +080574 +080582 +0806 +08061954 +08061983 +08061984 +08061986 +080689 +08071970 +08071981 +0807509 +080758cc +080759 +0808 +0808080805 +080808li +08081978 +08081985 +08081995 +080865 +080874 +080884 +08088874 +0809 +08090424 +08091992 +080949 +0809515014 +08096 +080989 +081004 +08101987 +08103069 +081041 +081083 +081089 +081102 +08111111 +08111968 +08111985 +08111986 +08112001 +08112493 +081156112 +08118598 +081186 +081188xx +0811lu +0812 +08121985 +0812555 +081273 +081275 +081297se +0812david +08137936 +081424 +0815 +08150815 +081512 +08154711 +081547111 +0815742936 +0815Abc +0815Tennis +0815agl +0815eggi +0815jaco +0815ourworld +0815paul +081620qq +081620zz +08170831* +0817461269 +08180180 +08181979a +081888 +081907 +08191229 +0819247 +081979 +081986 +08201692 +08201976 +082092 +082093 +0821792687 +082182jl +082191 +082204 +0822520 +082259 +082288 +082341 +082578020 +08263610 +08281122 +08281410 +08296c +082980Je +082991 +082999 +0830 +0831 +083217 +08324bhp +083322 +0834491828 +08351387 +0836010822 +0836210119 +084087ua +08410841 +084136 +084474 +084563855 +085030x +0850655 +0851505150 +08518775 +0852 +08520852 +08530859 +0855041631 +0856904951 +0858 +085861 +08596602 +08604109 +0862276902 +086232379 +0862914372 +0863002108 +08630863 +086338940 +0864338f +08648038 +0866212340 +0866891871 +086763944 +0868774654 +086890665 +086921 +087206 +087226301 +087283 +0872869195 +087401 +08750853 +08754156 +08767820 +087735 +087832285 +0883481107 +088415429 +0884494053 +0884f1a2 +0885166263 +0885228 +0885228750 +08859 +0886534155 +0886761606 +0886832751 +0886daka +0887225224 +08872nj +0887347955 +0887949570 +0888075067 +0888995879 +0889480847 +0889580847 +0890 +089036894 +08907e +089087 +0891172353 +089205955 +0893bfb +0895321123 +0895803737 +0896015350 +0897303125 +0897312928 +089769181 +08978888 +089807725 +0898330384 +089843681 +08985248 +08991220 +0899425562 +0899462579 +0899694404 +0899943443 +089cpa2 +08@126 +08a126a +08clydie +08connor +08d09j90 +08erythrina +08fKH0 +08fatt +08genell +08global +08isolino +08jt76tw +08justin +08l28 +08l7twc +08lance +08midnight +08nimda +08opensesame +08rebmevon +08rocky08 +08teacher +08thw15 +08wilder +09000804 +090031874 +0901131971 +09011961 +090164fc +09016731 +090179 +090183 +0902 +090210 +0902158223 +09021986 +09021993 +09022004 +090271 +0902791213 +090281 +090283 +090294 +090306 +090307 +09031981 +09031988 +090356614 +0903804802 +0903872675 +090402 +09040904 +0904121249 +0904126424 +09041983 +09041992 +0904199333 +09041994 +0904272812 +090472 +090483 +090487 +0904932848 +0905 +09051945 +09051978 +090556k +090558md +0905735504 +090580 +090581 +090587ps +090590 +090595047 +090597 +09061975 +09061986 +09061991 +090682 +0906824 +090684 +090690ri +09071985 +09072005 +0907237890 +0907322274 +090776 +09078183 +090798123 +0908010969 +09080706 +09081984 +0908237209 +0908555675 +090856584 +0908952844 +090909 +09090909 +0909145378 +09091985 +09091986 +09091989 +09092008 +0909820 +090989 +0909yazd +09101973 +09101987 +09101995b +091086 +09110712 +09111968 +09111971 +09111984 +09118098 +091185 +0911sasi +09121974 +09121977 +0912665628 +0912779910 +09127845 +09128734 +091289 +09128sk +091297754 +0912aslk +0913213432 +091333 +0913673230 +09141962a +091494 +091555pp +09161992 +09170529 +0918238118 +0918305151 +0918306809 +0918eerde +0919080005 +09191431 +09192635 +091958720 +0919636579 +091988 +091989 +09202834 +092103 +092165 +092191 +09222003 +0922362575 +0922799366 +0922849949 +09231813 +0923203270 +0923669780 +092440bb +092629 +092668829 +0926ad +092727 +0927laz +09281 +0928594605 +092871 +0928815d +092977 +092v4 +09300521 +093028614 +0930621404 +0930820489 +093087 +093095 +09320329 +0932493817 +0932766911 +0933234270 +0933293757 +0933302100 +0933318636 +0933318832 +0933329135 +0933857982 +0933902379 +0935004251 +0936248625 +0936295310 +0938068787 +0938237214 +093840121 +0938687816 +0939707421 +0939891035 +094002 +094025 +094030554 +09410122 +0942200 +0943ec +0944560938 +09464323 +09470947 +0948de +09490120 +095073 +09527279 +095276009 +0953294511 +0953330590 +0953417 +095357 +0953596261 +0953695a +095400 +0955189100 +0955599846 +095766901 +0957952011 +0958499059 +0958906865 +096025001 +0960637197 +096086 +096163 +0964756589 +0967044c +09680000 +0968133412 +0969g +096e6f +0973564 +09740974 +097421961 +097453528 +097718229 +097826942 +09783775 +09790979 +0979428890 +097c1b0b +098013599 +098098098 +0981745087 +09818631 +0982006871 +098268376 +098297750 +0983224 +09832410 +0983661982 +098454200 +098488477 +098501632 +09853276 +098551860 +0985bbca +0987 +098754 +09876 +098765 +0987654 +0987654321 +09877890 +09887289 +098884319 +0989 +098997042 +098Austin +098wsx +0990220220 +09914051 +09918042 +099521215 +099897031 +099962623 +0999761184 +09BUSTER +09MOTOS +09Pumuckl +09Tritons +09andrew +09az122 +09bee5 +09bigdick +09bodrum +09c54b +09cfda +09darkslide +09ds09 +09erbl02 +09escrima +09expert +09h6vsvh +09hav27 +09im6guv +09jamesp +09juice5 +09juin02 +09karma +09lollol +09nevermind +09oikjmn +09ping +09pme +09po87iu +09popcorn +09raleigh +09rc8 +09sept +09supernova +09tnonac +09virgin +0B027 +0CB3FF +0CE762 +0FCOLQ5 +0IkI3 +0MgSuX +0N +0NT1ME! +0Nz3wn +0T*1Mi2VaW9*WJ +0Torrent1 +0W#0ICX +0a011306 +0a051987 +0a0ddb35 +0a0f1d7 +0a33e469 +0a37357b +0a581c22 +0a5a9e7 +0a84fa7c +0a8545 +0a8eb7 +0a992fd8 +0a9e3fd +0a9s8d7f +0aMTi +0aborussia +0abreathe +0abux403 +0adeath1 +0admin0 +0afamily5 +0ageorge2 +0ajumpup +0aknightly +0alaster +0amike +0amolasses +0ana7ops +0and1 +0anlauf +0apmd +0arabbit +0ars8k +0asaturday +0asfkun +0ashuang +0asnout +0astevens +0astra3 +0athomas1 +0aviking +0awDuBv413 +0ax9trfz +0b1c23d8 +0b1ivi0n +0b2531 +0b359d37 +0b71195 +0b936b86 +0babacab +0bamanda +0bcricket +0bd081 +0be864de +0bf1rm0 +0bfb6 +0bjeepman +0blaze0 +0bliv22 +0bliy +0blong +0bmarine +0booger +0borker0 +0bprincess +0brif +0bserver +0bsophie +0bu5j1 +0bvolkan +0bwj5 +0bxvz +0c00730 +0c0f +0c7a49d5 +0c811f +0c81db35 +0carina8 +0caxeman +0cbayong +0cfa6c +0cgreen1 +0chaplin +0chockey +0clynora +0cm7n +0cmj4 +0cporsche +0cprivet +0cvectra +0cx55tn +0d0240e +0d251d +0d497d7d +0dREDRED +0danker1 +0darrows +0dc899a +0dcraigo +0ddrb222 +0devastator0 +0dfuller +0djxm +0dkjr +0dlanges +0dlilyrose +0dmagical +0dmarine +0dniceone +0dniteg +0dprodigy +0dsquinky +0dstomers +0dstupid +0duppsala +0e0c9c +0e13d06 +0e290e +0e323c +0e5276b5 +0e5d4u21 +0e653df5 +0e90590 +0eboomboom +0edactylo +0ediana +0eeaca +0eeddie +0eemu +0ef86d +0egabriel +0einf +0ekhq +0ereyhani +0eselecta +0eslayer +0esmokey +0esn9 +0esoftware +0estr0gen +0ewood +0eyqc0ra +0f01a90a +0f0415f8 +0f123456 +0f2be8 +0f306699 +0f325b +0f36cc5 +0f383f70 +0f45b3 +0f4e7ac +0f5c20 +0f86df +0f8c0214 +0f97582f +0fLauryn +0fac3340 +0fb93vfq +0fbella +0fcba321 +0fcurly +0feclipse +0fmarissa +0fmiller +0fpabli +0frabbit +0franklin0 +0fsamsung +0fsgc +0fshotokan +0ftrance +0ftw2426 +0g1f9x0 +0g798 +0gi4snr6 +0gpqrn +0gr0dy23 +0gravity +0gygia +0g{jKPOk2Q7iqZ +0hammers +0harmony0 +0hhm91me +0hjcv +0hlar +0hyj1 +0i1r7y +0ifse +0iwi0xqx +0iycx +0j6hhweu +0jackm +0jahf +0jkzd +0jnmkmw2 +0justin1 +0jxmm0h0 +0k00l35 +0k3f0d4 +0k3m9h +0klah0ma +0kqs4zfc +0kr1Pt +0l3kz +0l4l40 +0lb0x +0leu0 +0lffrqmg +0li8r +0liceum0 +0llitam0 +0m3g0 +0mana8 +0marsz0 +0mfnpr +0mlq1 +0mochis3 +0murkel0 +0mx4rk +0myw5 +0nbbx +0ndnh +0ndrst15 +0net1me +0netxis1 +0ni +0nl1ne1 +0nl1nech +0nl1nepl +0nly1kn0 +0nly4ish +0nlyjuv3 +0nmuraki +0npw4 +0o5e2b6f +0oOaaA5>08=7K1 +0ofertas +0okm9ijn +0okmnji9 +0p1qM +0p2gayvh +0p3ndrum +0p3nup +0p4n4k +0p7eyp +0pass +0pcenter +0pen7ake +0perator +0pllp0 +0putd +0pwn0 +0q114 +0qmp8 +0r1onss +0r5tilla +0r@cle +0racl38i +0rbek +0rbutter +0rd7nhhx +0re0d0g +0required +0rgalan0 +0rgan1ser +0rka +0rpan +0rpheus +0rqu1dea +0rtalion +0rv1ll3 +0s2kbrar +0scar +0sita +0sjrm +0snxx +0spaas +0sqzu +0st3ns +0sterkam +0sw3lz +0sxf7 +0symf +0t51k3 +0t5l5a4 +0t63aqmp +0theox09 +0tjkc +0txei +0uagm1re +0udn9 +0ugmt +0ugn6 +0uh6tj +0unreal0 +0uyt9 +0v1tuwh7 +0v80u8my +0vbq7 +0verl0ad +0verr1de +0vidia +0vnc6 +0vps2 +0vzhvwu2 +0w4buhh9 +0wZ1S +0wb0wju +0wfrx +0wins +0wm9c5x4 +0wn3d +0wn3dj00 +0wn3rs +0wn4g3 +0wn4ge +0wnagE +0wnage +0wned +0wnedby0 +0wnzj00 +0x33ae27 +0x3a3a +0x444444 +0x735nq4 +0xbCi +0xe9core +0xiqd +0xpwned +0xwinzsg +0xyg3n +0y7g12 +0y8asnba +0y9dq +0ypk7 +0zdim +0zfs3 +0zit0 +0zjrq +0zmetika +1 +1!bopper +1!comedy +1*basti +1+91 +1.Versuch +1.jakeman +1.lotte +1.orion +1.stein +10 +100 +1000 +100000 +1000000 +1000000000 +1000001 +100002009 +100008090 +10001000 +10009000 +100096 +1000mike +1000mixa +1001 +100100 +10011001 +1001110110 +10011981 +10011985 +10011990 +10012123 +10012401 +100134 +10014735 +10015286 +100169 +10017804 +100193 +10019423 +100198 +1001Moons +1001comp +1001samko +100200 +100200100 +100200300 +10020033 +10020040 +100201 +10021974 +10021984 +10021990 +10021991 +10021993 +1002245049 +10025124 +10028326 +100291lh +10029213 +10029370 +10031975 +10031990 +10031999 +100359 +100363 +100380 +100390 +100394JV +1003983 +1004 +100402 +100404 +100406 +10040606 +10041993 +10041994a +1004608059 +100462 +10046480 +100478505 +100488 +100500 +100505 +10051083 +10051958 +10051977 +10051987 +10051990 +10051992 +10051995 +100532 +100544 +10056 +100585 +100591 +100593cb +1006 +10061312 +10061987 +10061988 +10061989 +10062000 +10062006 +1006204011 +1006640 +100666 +100668 +100675 +100675ms +100679 +100680 +100686 +100688 +1006pd +100714359 +10071989 +100767 +10077021 +1007725 +100779 +100786 +10078910 +100793ck +10080000 +10081347 +10081981 +10082001 +10082003 +10082007 +100823 +10082607 +1008361942 +1008368530 +100864 +100877 +100877k +1009 +10090100 +1009056 +10091978 +10091980 +10091987 +10091988 +100919987 +100962 +100973 +100981 +100Rullar +100anfcc +100d5f +100dbm +100e173 +100flori +100forum +100free +100hours +100jahrebvb +100jeux2 +100kazoo +100kolas +100kotow +100mil +100proof +100tanga +100trip +100x100 +1010 +101001 +1010011936 +101010 +101010+ +10101010 +10101010 +1010101010 +101010Lc +101010x +101011k +101013 +10101975 +10101982 +10101983 +10101987 +10101994aya +10101995 +10101996 +10102000 +10102003 +101023 +1010381118 +1010413862 +101068rc +101082e +101088 +101093 +101096 +101098 +1010mesh +1010radan +1010tbt +1010wien +10111049l +10111104 +101112 +10111986 +101138844 +1011402 +1011535 +101169 +10117 +101170 +101175 +101184 +101188 +10119 +101191 +1011994 +1011ba +101202 +10120833 +10121012 +1012128402 +10121967 +10121984 +10121985 +10121994 +1012253 +101280 +101288 +101293 +1012quin +101304197 +10131936 +10132027 +10132889f +101391 +10144010 +101453 +1014926095 +101495 +1015 +10150106 +10150529 +10151016 +101512163 +1015363 +101538509 +101540 +10155112 +10155713 +101562 +1015645 +101582406 +1015fce +1016139 +10161984a +1016202072 +10169290 +1016smm1 +1016tqt +1017151340 +10171990 +10178000 +10181018 +10186023 +101889 +1018m +1019 +101905 +10191138 +10191987 +1019231 +10193390 +101956 +101962 +101970 +101972 +1019760180 +10198919 +101994 +1019haley +101abn +101diagm +101staa +1020 +102000 +102001050 +102010500 +10202208 +102030 +10203040 +1020304050 +10203050 +1020311045 +102076 +102090 +102102007 +102102102 +10211021 +10211985 +10213243 +1021835608 +10218362 +1021983 +1021990010 +10221022 +1022407 +102263 +102294mh +10231004 +10233ed +102351968 +10241990 +1024717 +1024ens +102505 +102519831 +10251998 +1025231 +1025879595 +102587bm +1025999 +1025mv +10266295 +102675nm +102681 +1026sex +10271951 +102749 +10277 +102778 +102791 +10280622 +10285483 +10287 +102878 +102882346 +1029 +10291963 +102938 +1029384756 +1029384765 +102959 +1029aa +1029lewt +102ANGELA +103 +103025 +103053 +103059 +1030wien +103103103 +10311031y +10312782 +10313028 +1031989 +1031b84 +1031rfix +1031rudi +10321032 +103229846 +1032383388 +103241278 +1032910 +103311 +10331mr +10334480 +103396 +103410 +10342 +103425 +103490 +1034apd +103500 +1035019891 +10351035 +1035804002 +10359439 +10360409 +10371037 +103721 +1037474 +10376321 +103792ip +1038415 +1038622 +10389cas +103cheu +103fbx +103pekan +104033 +104040 +10406230 +1040700 +1040879955 +10412500 +10412500 +10417890 +1041wbcn +10421143 +104267 +1043793 +1044078 +104496575 +104587sp +10460010 +1046674239 +10480228 +104805 +104811 +1048310483 +1048576 +10491 +1049659 +104nanet +105021 +1050232956 +1050510565 +1050633008 +10513047 +10515 +105199 +1052777989 +10533224 +1053779105 +10543748 +1054509073 +1054653652 +105486 +1054Ag +1055negro +105695628 +1057581284 +105799 +105855746 +1058a39c +1058red +1059710597 +105985755 +105altec +105tec64 +106029202 +106044 +1061001331 +106106 +106121023 +10614027 +1061986 +1061989 +106296 +10637696 +1063Cfvfhf +1063Consalt +1063vd +10643895 +1064977 +10651841 +10654 +106626391 +1066399845 +106651767 +1066keep +10673591 +1068 +10681068 +10692 +106merlin +1070828273 +1070gsx +1071981 +1071990 +1071ultrix +10723 +107309646 +1073567935 +10739134 +107393 +107393os +107487424 +107578 +1075hest +107777 +1078206 +1079 +1079683640 +107e60 +107qv +107s6 +108 +1080712 +1080900 +1080life +108100 +108155 +1081993 +1081kure +10820913 +108211323 +108225693 +108234 +1082787 +10832559 +1083640 +10841084 +108479 +10851085 +108546174 +10855436 +10858256 +1086420 +10875123 +108807 +108852 +10890 +10891089 +1089437 +1089680 +1089931226 +10901 +10901090 +1090424608 +10905281 +10913410 +109160986 +1091869 +1091893686 +1091990 +109206 +109270644 +10927e +10930017 +10939503 +1094487889 +109501986 +10956796 +10972923 +109753826 +1097710920 +1097maju +1099175 +10991972 +10992 +10994267q +109bs9 +10Picotto +10RAM3 +10Weiber +10a11c +10a52j +10aaeg31 +10abba10 +10abuter +10adidas +10ae9b3a +10agos98 +10ajg8 +10as62me +10b6ba +10bamberg +10bdka +10brandon01 +10claudie +10danson +10dedtx7 +10e4life +10fausti +10feb04 +10fhzc +10flyhalf +10goof10 +10jul28 +10kg +10kimber +10kollmorgen10 +10labyrinth +10poto +10qpalzm +10quosig10 +10st13s +10stewart +10storms +10tacos +10tacula +10tahun +10tattoos +10theresa +10tobias10 +10tomaten +10u640r +10voli2 +10whiskey +10worker +10wxu +10yasd +11 +110 +1100 +1100000011 +1100101 +1100101a +110011 +11001100 +11007755 +110099 +1100fenley +1100n +11010125 +11010157 +11010294 +110110 +110110123 +110111 +11011979 +11011982 +11011987 +110133 +11016397 +110177 +110180 +110185 +1101968 +1101983 +1101yme +11020101 +110206 +11021978 +11021982 +110219820 +11021985 +11021988 +1102310 +1102391 +110261YT +110268 +110278 +1102836803 +110284 +110286 +11028792 +110290tc +1102kh +1103003 +110307 +11030727 +11031103 +11031961 +11031975 +11031981 +11031983 +11031984 +11031987 +11032049 +1103613488 +110381 +11038516 +1104 +11040010 +1104014 +110402 +11041985 +11041986 +11041988 +11041990 +11041994 +11044385 +110456 +110468 +110469 +110483 +1104raul +1105 +1105043 +1105051989 +1105081202 +1105140 +11051992 +1105412 +11054128 +110582 +1105855 +110587dl +1105945948 +1105marduk +1106 +1106 +110611 +11061989 +11061991 +110661 +110673 +110683 +1106968152 +1106far +1107 +110707 +11071944 +1107198207 +11073bm +110774ab +110779 +110782 +110790 +110797 +1107cj +1108 +11081108 +11081201 +11081957 +11081975 +11081988 +110862 +1109131325 +11091983 +11091990 +11092001 +1109588 +110981 +110987 +110993 +1109fayz +1109oeg +110anos +110florida +110g13l +111 +111 +111016 +11101965 +11101971 +11101977 +11101988 +111053sk +111067 +111085 +111088 +111091 +111099 +1111 +111100 +111103 +11111 +111111 +111111 +1111111000 +11111111 +111111111 +1111111111 +1111112 +111111qq +111112 +11111966 +11111976 +111119790 +11111981 +11111q +11112005 +11112222 +11112222j +111123 +111186 +111187 +1111888189 +111189 +111191 +111198 +1111985 +1111990 +1112 +111209 +11121187 +111212z +111213 +1112130355 +11121990a +111222 +11122212 +111222333 +11123 +11123456 +111235987 +111256 +111266 +111270 +111275 +111279 +111280 +111282 +111285 +111286 +111289 +11129gan +111317 +11131994 +111333 +111339287 +11134l +1113577428 +111363 +111367 +111372 +1113987 +1113sark +11141631 +11150 +1115111 +11154130 +11154323 +111555 +111555999 +11156440 +111597kk +11164298 +111671 +111689677 +11173ab +1117551 +11177 +111778 +111782 +11181960 +111824ok +11183406 +11185518 +1118585111 +1118851696 +1118854 +111888666 +1119050067 +111927 +1119514 +111983 +111986 +111994 +111D7 +111aaa +111aaa23 +111abwq +111john111 +111ter +111tip +111uav +111und90 +112 +112000 +112006 +1120100402 +1120100405 +112023211 +112057765 +112074252 +1120872087 +1121 +11211 +11211121 +112112 +112121 +112122 +112122 +1121311217 +112131as +11213210 +112188 +112189 +112192003 +1121986 +1122 +112200 +112211 +11221122 +1122121425 +1122123344 +112225 +112233 +11223300 +11223311 +1122331111 +112233123 +11223322 +1122332211 +1122334 +11223344 +1122334455 +112233e +112233fd +112233x +112234 +112255 +11225544 +112299885 +1122ippi +1122ss +1123 +1123 +11231123 +11231954 +11232951 +112334551 +1123451 +1123456 +11234566 +11235 +112358 +11235813 +1123581321 +11237609 +11238816 +112389b +1123956361 +1124 +11241111 +11241975 +11245 +112474a9 +1124850 +1125003 +112507 +11252 +112543 +112561 +11257580 +112593753 +1125?1027 +1125ami +1125pacd +11261983 +11262408 +1127 +1127011 +112709471 +11272200 +112728 +112789 +1128061421 +112834142 +11288 +1128aran +1128olive +112900 +11291986 +1129358451 +1129539154 +1129583957 +112976 +1129808311 +112dcm +113 +1130 +1130062452 +1130659615 +113082 +113086 +113090 +1131 +1131215 +113135 +11313895 +113141225 +1131871344 +11318918 +113211 +113255 +113262 +11328590 +113311 +11331133 +11332244 +1133271243 +1133409 +1133446677 +1133552244 +1133557799 +113355qq +113386655 +1133smuci +113400 +1134014611 +113405 +1134656448 +1134awaits +1134harrison +11361136 +11361595 +113625106 +11363 +113661 +11369a73 +11372007 +1137587142 +113811 +1138623095 +113871380 +11388019 +1138sigrid +1138sw +11397884 +1140 +11401 +1140114011 +11404474b +114074737 +11411141 +1141415 +114155 +1141985 +1142000 +1143 +1143372340 +1143388821 +11434 +1143489 +11434im +1143688357 +11437541 +114379153 +1144 +11440 +11441144 +1144152219 +11442234 +11442845 +1144476218 +114477 +11451145 +11452020 +114578825 +1145cc3 +11462218 +114677 +1147254134 +1147273131 +1147275297 +114759j +11488 +1148966252 +114922 +1149450724 +1149794315 +1150 +11508765 +1150kep1 +11511151 +115116 +11512 +1151252 +1151367 +1151425695 +115146017 +1151654104 +1151930703 +1151963 +1151maxx +115200 +1152223408 +115230 +115236 +11523913 +115242266 +11526s1 +11530904 +1153661492 +1154008833 +1154021229 +1154214017 +1154302182 +1154401371 +11544017 +11545235 +1154885450 +1155006495 +1155019429 +115511 +11552144 +115533 +1155360190 +1155775 +115599 +1155995115 +11559988 +115599ee +1156021690 +1156133227 +1156147413 +1156195616 +1156402 +11565 +11569388 +1157142 +115730 +115769 +1157813763 +11580005 +1158077060 +1158163106 +1158265062 +11582909d +1158314030 +1158428 +115865874 +1158748962 +11588 +1158867b +1159 +115929511 +1159458839 +1159741252 +115980525 +115Bert +116001 +11601 +11601597 +1160666202 +1161006509 +116108 +1161129925 +11611973 +11611x +1161219665 +1161313519 +11613354 +1161336283 +1161499792 +1161570080 +11621162 +1162143 +1162360196 +116281819 +1163 +1163003914 +1163333167 +1163333195 +1163337879 +116352 +116366115 +116401234 +1164830222 +1165 +11651165 +1165151023 +1165789523 +116627 +116650 +116668732 +116677 +1166916713 +1167 +1167204 +1167209884 +1167618815 +116779 +1167990834 +1168029496 +1168030491 +1168179817 +1168315363 +1168770207 +1168840133 +116911 +1169629264 +1169769263 +116996 +1169962407 +116Rwg +116tyuiop +11700711 +11701170 +11703514 +11704160 +117051 +1170684027 +117097 +117117 +1171630 +11717739 +117189582 +117200 +1172182473 +117265523 +1172911563 +117292036 +1172953768 +11731621 +117403 +11742549 +1174318375 +117449658 +117456as +11747400 +1175247697 +1175425660 +11754419 +11757592 +1175824 +1175831 +1175870173 +1176244 +1176535724 +1176danny +117711 +117722 +1177247829 +1177316430 +11773315a +1177349781 +11779933 +1178928068 +1178928070 +1178fc +1178rap +1179352618 +11794591 +1179484066 +11798011 +11799464 +117f5b +117lake +117msa +1180 +1180012056 +1180075231 +118009 +1180174350 +1180668264 +1180723683 +1180723736 +1180995370 +11811181 +1181229233 +11817e3 +11818 +1181990 +1181992 +1181993 +1181ba +11820x +1182oslo +1183034749 +1183338155 +118421 +118559254 +11865326 +11867 +1187061 +1187201501 +11880 +11894 +11895bb +118979141 +1189945334 +118994690 +118harvest +118soccer +1190337775 +11907851 +1191 +1191142137 +119119 +11914220 +1192035688 +1192191737 +1193210 +1194 +1194042500 +1194314134 +1194502143 +119474001 +1195180764 +1195201 +1195339992 +1195339998 +1195378965 +1195478481 +1195749707 +1195750014 +119596 +11961196 +11965051 +1196639060 +1196984382 +11971197 +1197123 +11971982 +1197397554 +11974213 +119803895 +1198201075 +1198445676 +119857 +1198600304 +119877743 +11989 +1198905728 +1198923289 +11990088 +1199282724 +11Airborne +11Axp22 +11Hasso22 +11Help33 +11Teddies +11abcdefgh +11abus +11alanna11 +11asswad +11av3 +11b256 +11back11 +11bass66 +11bbccdd +11berbec11 +11beta1 +11bizet11 +11briget +11buster +11candlestick +11chateau +11chi +11deano11 +11diego +11e6lo +11engraver1 +11esig55 +11f45 +11fc16d0 +11ff81 +11flor11 +11ftime +11ghiyath +11gras +11guld22 +11hs110kv +11istari +11j03m88 +11jahre +11joah +11july82 +11k14d +11kamarad11 +11lars11 +11laurie +11lulu1 +11maar87 +11macinto +11maja +11markar11 +11mdh5 +11mer1ca +11merch +11muncher +11nascar +11nina11 +11nk1npark +11noslen +11nyjets +11piripi +11platin11 +11poca +11polopolo +11power11 +11pretoria +11qaws22 +11qqaazz +11rico11 +11ril03 +11rotten +11rpa +11rumbos11 +11saysay +11tanel +11tat22 +11truelove +11underworld11 +11vodafone +11von10 +11voran33 +11vova +11web +11wheelie +11y1u1 +11y777 +12 +120 +1200 +12000825 +12001200 +1200147753 +1200187907 +120030396 +120037272 +1200551 +120055200 +1200699327 +120080 +1200js +1200tech +1200webx +1201 +12011 +12011982 +120120 +120120120 +120122aa +120124 +120140 +120140170 +12014789 +1201480805 +1201549280 +1201601123 +120193 +1201kalle +1201leonida +12021202 +12021958 +12021985 +120222002 +120232433 +1202649151 +120284175 +12029155 +120291jd +120292 +120294 +1202989628 +1202kl80 +1202stol +12030300 +12030330 +12031203 +12031309 +12031954 +12031985 +12031986 +12031987 +12031990 +1203202000 +1203506a +120359st +1203655951 +12036719 +120384 +120387 +120388 +120389 +12041981 +12041984 +1204216766 +1204231150 +120461 +1204649792 +120468 +120477 +120484 +1204841299 +120488 +120492 +120496 +12050 +1205019423 +120505551 +1205055511 +12051973 +12051978 +12051980 +12051981 +12051987 +12051988 +12052007 +120537bs +120578 +120581je +120582 +120585137963 +120592 +1205966148 +12061968 +12061981 +12061985 +12062688 +120634 +1206541991 +120655 +12065601 +1206753974 +120681 +120683 +120689 +1206967 +1207 +120702 +1207133137 +12071974 +12071978 +12071981 +12071985 +12071987 +120730 +1207443719 +1207450468 +1207720145 +120784 +120787 +120789 +120789ew +120795 +1208 +1208150 +12081989 +12086400a +120870575 +120880 +1208845169 +120887 +120888 +120889 +120891 +120892 +1209 +1209022895 +12091209 +12091962 +12091969 +12091978 +12091979d +12091990 +12091991 +12091993 +12091997 +12091998 +12093487 +1209387889 +1209397645 +12093b +1209655665 +12097211 +120974 +120976000 +120977 +120977xs +120986 +120990 +120993 +120mmgtt +120oakwood +120xyz3 +121011 +12101210 +12101983 +12101987b +12105384 +121077 +121078 +121080 +12108019 +121084335 +121085 +12108668 +1210gts +121106637 +121112 +121112420 +12111263 +12111988 +1211444428 +1211536388 +121166154 +121180 +121182 +121183 +121188 +121190 +1211949302 +1211967 +1212 +12121007 +121212 +12121212 +121212a +121212o +121212qw +121213 +1212151215 +12121954 +12121980 +12121982 +12121991 +12121993 +12122008 +12122260 +12122424 +12122455 +1212289568 +1212294351 +1212294504 +12123 +1212312 +1212314472 +121233 +121233345 +121233444 +1212339 +121234 +1212341234 +12123434 +1212347 +121253625 +1212555 +121256 +121263 +1212708268 +121290aa +1212968764 +1212978086 +1212988619 +1212990158 +1213 +1213005952 +1213024300 +1213024380 +1213024403 +1213050854 +1213072889 +1213103519 +12131213 +121314 +121314123 +12131415 +1213141521 +1213156745 +1213196125 +121321 +1213350970 +12135633 +1213593188 +1213610323 +1213677129 +1213678563 +12136966 +1213702277 +1213702747 +121371117 +121371137 +1213757323 +1213790761 +1213793167 +1213795395 +1213862895 +121387631 +1213922804 +1213931025 +1213onex +1213qwerty +12141214 +121415 +1214176k +1214206297 +1214247484 +12145 +1214528658 +121456 +1214az91 +12150201 +1215049496 +121508745 +1215144517 +1215156316 +1215318191 +121534310 +1215366723 +1215495172 +12155199 +1215571272 +121570 +1215753988 +121576ch +12159304 +1215ad +1216 +1216140853 +12163897a +121658 +12167 +1216720653 +1216810 +121700 +1217095430 +1217158 +1217264620 +1217281955 +1217320526 +12173537 +1217430147 +1217469665 +1217616902 +1217629 +1217815297 +1217873575 +1217924631 +121798 +1218 +1218616359 +1218641991 +12186700 +1218684375 +1218856432 +1218904792 +12189495 +121902 +12191219 +121927 +12193 +121954 +1219823004 +12198313 +121987 +121989 +1219922684 +1219mjs +121a2 +121li204 +122 +122077 +122087Ab +1220vw +1221 +12210 +122100 +12210021 +1221043873 +122110 +12211221 +12212 +12212213 +12213 +1221356410 +1221562300 +12216764 +12218384 +12218963 +12219694 +1221rx79 +122211 +12221390 +12222222 +122229hh +1222733507 +1222kbcs +1223 +12230806 +12231591 +1223308 +1223309572 +122331 +122333 +1223388556 +1223458984 +1223468958 +1223550866 +1223830594 +122387 +1223901779 +1224056928 +122415 +1224155493 +12242005m +12242567 +1224258680 +12243648b +12244444 +12244896 +122484746 +1224984 +1224tnt +122505 +12250926 +1225094861 +122527 +1225345389 +122545538 +12255842 +1225622321 +12257240 +122574 +122581 +1225870215 +122589 +1225dec +1225tb +12262 +122622 +1226696536 +1226916448 +1226f14 +12274 +1227422 +1227959031 +122799 +12281990 +1228550 +122891306 +12289577 +122899410 +1228xx +1229057664 +1229060596 +122934293 +122934296 +122942326 +122942332 +122942335 +1229433905 +1229617808 +1229831 +123 +123 +1230 +12300 +123000 +123000.66 +123000xp +12300123 +12300321 +123009 +1230123 +12301230 +12301234 +12301923 +12301983 +1230321 +12303210 +12304 +12304560 +1230612306 +1230796821 +12309 +123098 +1231 +12310583 +12311417 +12312 +1231214 +123123 +1231230 +12312300 +12312310 +12312312 +123123123 +1231231234 +123123124 +1231234 +12312345 +123123456 +1231235 +12312350 +123123a +123123w +123124 +12312819 +123132 +12313212 +123147 +123147753 +123151080 +123151383 +123171016 +123188 +123196398 +1232 +12321 +123210210 +123212 +1232123 +12321312 +1232201523 +12323 +12323123 +123234 +123253735 +123253739 +123254013 +123254016 +12325465 +123258 +123270454 +1232875381 +1233 +123312 +1233155904 +123321 +1233210 +12332100 +12332112 +123321123 +1233214 +123321456 +12332157 +123321a +123321gs +123321tv +123325 +123325123 +12332o +123333 +12334456 +123345665 +123369AZ +123384704 +1233900 +123396565 +1234 +1234! +12340000 +12340567 +12340987 +123412 +1234123 +123412312 +12341234 +123412341 +12341324 +123414675 +12341qaz +123423 +12343 +12343010 +12343174 +1234321 +1234334 +123434 +12344 +123440318 +12344321 +12344321z +123444 +1234445 +123444d +1234456 +12345 +12345 +123450 +1234509876 +123451 +1234512341 +1234512345 +123452005 +1234535 +123454321 +1234546 +123455 +1234552 +123456 +123456 +1234560 +12345600 +1234560a +1234561 +12345612 +123456122 +123456123 +1234562 +12345631 +123456321 +1234564 +12345646 +1234565 +12345656 +1234566 +123456654 +12345666 +12345667 +1234567 +12345670 +12345673 +12345675 +12345677 +12345678 +123456781 +123456788 +123456789 +123456789 +1234567890 +1234567891 +1234567892 +1234567899 +123456789Aa +123456789Onra +123456789WoW +123456789adf +123456789go +123456789mlp +12345679 +12345679 +1234567a +1234567kl +1234567sigmar +1234568 +123456842 +123456852 +12345689 +1234569 +12345698 +123456987 +12345699 +123456999 +123456LADA +123456SCH +123456a +123456aa +123456ab +123456aq +123456azsxdcfv +123456b +123456db +123456dr +123456fe +123456fx +123456go +123456ho +123456mg +123456mi +123456ms +123456muh +123456n +123456nb +123456q +123456qazw +123456qqq +123456qw +123456s +123456sd +123456ss +123456t +123456tf +123456tz +123456x +123456xj +123456y +123456zones +123456zr +123456zx +123457 +12345776 +1234578 +1234579 +123457m +123458 +1234580 +12345828 +12345888 +1234589 +123459 +12345a +12345ab +12345b +12345bco +12345bhf +12345ct +12345emrah +12345ht +12345hzv +12345koeien +12345numbers +12345q +12345qw +12345ssss +12345t +12345tgb +12345vilivili +12345y +12345z +12346 +123465 +12346578 +123465789 +12346579 +12346650 +12346789 +12346878 +12346a +12347858 +123480973 +12348765 +123496303 +1234Dumb +1234Korn +1234QQ +1234Qwer +1234a94 +1234aa +1234aman +1234asd1234 +1234bg +1234bier +1234cable +1234caffe +1234cdt +1234d +1234db +1234eizo +1234flo +1234four +1234franz +1234ftab +1234gg +1234hels1234 +1234hide +1234jkl +1234jonny +1234lk +1234lol +1234oliv +1234party +1234qwer +1234r +1234rkgl +1234sns +1234yon +1234yupi +1234zip +1234zxcv +1235 +1235001123 +123507165 +12351 +12351 +123510 +12351235 +12351984 +12354 +123546 +12354v1 +123555 +123562156 +123563 +12356498 +123567 +123569 +12357895 +123581321 +123582568 +1235889959 +1235896 +1236 +123612366 +1236203 +123654 +12365474 +123654789 +123654987 +123654a +123654cs +1236655 +123666 +123666999 +123678 +123690 +123698 +1236987 +12369874 +123698741 +123698745 +1236987456 +1236993321 +1237221 +12372905 +12374106 +1237449416 +1237549 +1237654w +12377 +123771517 +123785 +123789 +1237891231 +1237891313 +123789456 +123789654 +123789852 +123800 +123809595 +1238316 +12385 +123852 +12385474 +1238791 +1239012309 +12391111 +123912 +123961 +12397ogi +1239825059 +1239825510 +123987 +123CAV +123Hummel456 +123PROF +123PassWord +123Qweasd +123Sebi123 +123Teichi +123World +123Zacker +123a123 +123a456 +123aaa +123aaa2 +123abc +123abcd +123aces +123ada +123adm +123admin +123aero +123aichi +123albin123 +123ali +123amin +123aq456 +123aqw +123aroma +123arrowwood +123as456 +123asd +123auh +123aventar +123aziz +123bacon +123bang +123bekim +123bengie4567 +123bin +123bira +123bobby123 +123bobo +123bonus +123carola +123cbe +123cbgs +123cew +123chickie +123corey +123crap +123d33 +123dante +123dbz +123ducklings +123dvp +123dy123 +123eat +123edison +123edro +123ee789 +123eevee +123eggoj +123enver +123ewq +123fly +123furia +123fyd +123genkai +123ggman +123gina +123girls +123gris +123gunn +123hack1 +123halko +123harasym +123hawky +123hjelp +123hjy6 +123hnk +123huyen +123ilinca +123india +123indy +123ivan +123jkl45 +123joel123 +123julle +123kaufen +123kittens321 +123klg123 +123klima +123kn91 +123kold +123konoy +123kp +123krystle +123lala +123larry +123ljy123 +123lol +123lords +123loss +123m +123madr123 +123marjan +123masina123 +123merrick +123mersi +123metoo +123mic +123migue321 +123moms +123money +123montage +123moo456 +123msp +123mudar +123n321 +123nbm123 +123neo45 +123nicolee +123nok123 +123ns456 +123nv +123ok +123onyou +123pampel +123pandaman +123pear321 +123pelo +123pietruszka +123pina123 +123pml123 +123polo +123polse123 +123ps!@# +123pvd9 +123qaz +123qeasd +123qwasz +123qwe +123qweasd +123qweb +123red +123redragon +123rickard +123riva +123rosh +123sadder +123sar +123saru +123saz +123siti123 +123sms +123sofe123 +123soro +123sral +123ssom +123steve +123stian +123taha +123test +123tfc +123thizz +123tier123 +123tmc +123truth +123ufuky +123ugl +123ukan +123undefined +123v +123vatech +123voth +123vsf +123vta321 +123wareagle +123wer +123wes +123window +123wrtb43 +123xy321 +123yjz +123yo47 +123z123 +123zerg +123zg45 +123zodiak +123zy456 +124 +12404900 +1240607918 +1241 +124125 +12413066 +12415584 +12415936f +124163457 +1241817 +1241912415 +1241913222 +1242252122 +1242572 +124290194 +124291725 +1243000 +1243097747 +1243103279 +1243222038 +12433 +124331133 +1243586936 +12440 +124411694 +12441244 +124421 +124438 +124456113 +1244733387 +12448 +1244926863 +1244Reni +1245 +124512 +12451245 +12451246 +12451988 +12453lol +12454 +12454322 +1245459g +12456 +124563 +124568788 +124578 +124578963 +124580 +124589 +1245casy +1246437202 +12465 +1246586 +12465987 +1246674463 +12467890 +124689 +12469748 +12471247 +1247510544 +124763 +124777 +1248163264 +124850661 +124860552 +1248632 +124892 +12495 +124983m +124lifes +124skip +125 +125000 +12500a +1250527353 +1250608640 +125111828 +1251218 +125125 +125170 +1251747913 +1251nnn +1251stern +12521254 +1252312523 +12523nw +125252 +1252654889 +125267791 +1252911952 +125311 +12531253 +1253307320 +12535686 +125378320 +125378329 +1253riole +1254 +125409998 +12541254 +12541254a +125439547 +12544491 +12545 +125450 +125456as +125480 +125496387 +12552274 +12554482 +1255534321 +125569e +1255ht +1256 +12561256 +12563 +12563478 +125638 +1256478512 +12566 +125678 +1256879430 +125689 +125689743 +1256adi +1257 +12571257 +125724561 +12574380 +1258 +125800 +125840988 +12588mp +125916785 +1259630 +125968045 +125985600 +125985608 +125986347 +125afb0 +125coqueta +125gh89 +125nicholas +125rbc +1260 +126021988 +1261 +126126126 +126141130 +1261niki +1262009870 +12621 +1263367266 +12635455 +126378 +126410 +12641244 +1264632312 +126531127 +126579853 +1265876 +126612 +1266126612 +1266305 +12664392 +126644 +12665109 +12666888 +126700 +126711959 +12671267 +126716541 +1267234988 +126789 +1268gar +126terra +126vojin +127 +1270033558 +1270080770 +127012 +127040 +1270818548 +1270910547 +127119 +127127 +1271417115 +1271604114 +1271604743 +1271983 +127241975 +1273730941 +127488622 +1275102603 +127595 +127612 +1276uf31 +1277 +1277329 +12774587 +12782507 +12783ace +12784211 +12784512 +127NYH +127c4mfy +128 +1280073 +1280400060 +12805523 +12805a +128072 +1280dani +1281972 +1281rene +1282048 +12823528 +1282xx +128317 +1283456 +1283c52d +12843555 +1284abc +128500 +12852790 +128540789 +1285953516 +1286043322 +12862103 +12865236 +128657 +128856355 +1289 +1289018704 +12891289 +128957463 +12897377 +12897538 +1289emblem +128elijah +128joffer +128steve +128x +129 +1290 +129135707 +129186m +1291990 +1291991 +1292 +129255 +12930 +12933077 +12941294 +1295221 +1295281 +12961943 +12963963 +1296418529 +12964823 +129658 +12968 +1296michelle +1297 +129789jb +12979111 +12981496 +1298480462 +129958 +129eugene +12BRANDY +12Emus +12JARMANS +12KpQ +12Mist3 +12a3333 +12aa33 +12ab12bc +12ab34 +12ab34yz +12acht62 +12alex2 +12amiga +12asada34 +12asdfv +12asterix345 +12babe34 +12barbara34 +12bard12 +12barf34 +12basia34 +12bell34 +12beta +12beta34 +12bienen +12bip +12bluewater +12blumen +12bpg134 +12bub34 +12cacho +12cba +12cd24z +12conn34 +12cr34 +12d18f98 +12d9tss +12dari34 +12dawid +12dece88 +12dia34 +12doc34 +12dsl8n +12dtl98 +12e14d26 +12e3hmyq +12e45 +12ellen12 +12erst34 +12feb90 +12friedi +12geit34 +12gm12 +12inch +12jedi21 +12jessy3 +12jr4067 +12jrc3 +12juho34 +12june1964 +12kani12 +12kfhtcs +12knives +12ktmr24 +12lara24 +12leguan +12linuxtracker +12liudas +12lo +12loki14 +12loko12 +12lonsdale21 +12lung88 +12m01a +12markus +12mawkish3 +12metallica34 +12micky +12mike +12monkeys12 +12naz12 +12nijmegen +12ninj45 +12nnone +12nordea34 +12oct96 +12phoenix21 +12piec +12pm23 +12polka34 +12prg +12primal12 +12pte34 +12purdys +12q23w +12qawsed +12qng +12qw12 +12qw12QWS +12qw34er +12qwasyx +12qwaszx +12qwerty +12qwmn00 +12r34m5c +12reeh34 +12rellah12 +12reufh +12richi12 +12rkceej +12roei34 +12saints +12senki34 +12shania +12shayna +12sobak +12spirit +12spud34 +12star21 +12stern1 +12takk34 +12tavu12 +12temp +12three4 +12thrice +12titkos +12turbo12 +12v35ah +12walker +12we34 +12wien34 +12wilde12 +12willow +12xffx12 +12xxbb1 +12xxbba +12zedred +12zegna34 +12zx12 +13 +13001 +13001300 +13001873 +1300444563 +1300na +1300unimog +13011987 +13012004 +130130 +130185 +130189 +130201 +13021416 +13021970 +13021988 +13021991 +13021993 +1302713566 +1302759683 +13028 +130284 +130311 +13031975 +13031979 +13031984 +1303394 +1303398 +1303417 +130353 +13035969 +130363 +130401987 +13041964 +13041984 +13042006 +13042209 +130447 +130463 +130485!! +130487 +13048700 +130498 +1304989 +13050502 +130513 +130519 +13051974 +13051993 +1305250 +13055031 +130576 +130585 +130588 +1305897618 +13059001 +130596 +1306 +13061981 +13061988 +13062002 +130654321 +130678 +130687 +13068777 +130696gt +1307 +13071253 +13071979 +13071988 +130768 +13077al +130782 +1307ys69 +13081990 +1308199400 +130886 +130892 +1308940731 +1309 +130900 +130904 +130909 +13091978 +13091981 +13091986 +13091989 +13091993 +13092001 +130988 +130992 +13099543 +130H$u +131000 +131001 +131008725 +13101951 +13101955 +13101979 +13101999 +13106469 +13108325 +131088 +131089 +131092 +1310terra +1311 +13110079 +131107 +13111971 +13111985 +13111991 +13111994 +131133e +1311731161 +131183 +131187 +131188 +131189 +13121091 +1312147442 +131219 +13121978 +13121983 +13121986 +13121994 +131223683 +131290 +131291 +1313 +131313 +13131313 +1313132 +131313i +1313491530 +1313632 +131378 +13138794 +1313figaro +1313mm +1314 +1314013336 +13140K +13141314 +13141516A +1314520. +13145456 +1314derek +1314thian +13157925 +1315967141 +1315986629 +1315heidi +13164342 +131700 +131739 +1317514 +13176482 +1317kx2c +131800 +131831 +13186 +13189079 +1319 +131907 +13193752 +131978 +131geo +132 +1320 +132000* +13201320 +1320472052 +132062 +13208096 +132099 +1320hagx +1320webx +13211321 +13212313 +132125 +132132 +132132ki +1321631877 +13219032 +1321977 +1321kk +132206480 +132207786 +132213 +13221322 +132220 +132251577 +132293622 +13231132 +13231143 +13231323 +132321 +132348a +13241324 +1324315 +132435 +13243546 +132435kl +13245 +132456 +1324567 +132465798 +1324877 +1324@1324 +1324fys +1324qwer +13250gd +13251325 +1325170 +13251986 +13255231 +1325805 +1326f +1327 +132786Db +1327o9 +132837678 +132952781 +1329573553 +1329865555 +132dell +132p0 +133 +133012 +13302511 +13305625 +133082 +133113 +13316690 +1331mmn +1331mmna +133241 +13324124 +13331989 +133331 +13336880 +1333961a +133454 +1334613660 +133498a +1334moffen +13350998 +13353 +13355 +133557799 +133607 +13367038 +1336918 +1336994455 +1337 +13371337 +1337178 +1337331 +1337417 +1337Toothpaste +1337Will +1337asdf +1337betsy +1337crew +1337er +1337fxp +1337guild +1337hack +1337haxx +1337lol +1337mongo +1337oneWS# +1337pally +1337pw +1337sjur +1337skeet +1337sungy +1337tbird +1337toymaster +1337uber +1337wow +1337z0r5 +1338 +13390529 +1339229 +13397 +1339957310 +133eugen +1340 +1340670 +1340fxst +1341368 +134192 +1341985 +1342200331 +1342510 +134362 +134413 +1345352 +1345564 +134611 +1346257 +134652 +13467393 +134679 +134679258 +1346795 +13467985 +134679852 +1346798520 +134679aa +13468879 +13470max +1347221133 +1347df +13487 +1348795462 +13488ra +13490210 +13493saa +134969sf +1349cradle +1349ican +1350 +13501350 +135062 +1350895 +1350f13 +135114710 +1351977 +13519852 +135236 +13524 +135246 +13524678 +13524ab +135303 +13539242 +1353kurd +1354123 +135423 +13544 +1354597 +13548abc +13548bac +135492 +1354970987 +1354ppa +135531 +135614 +135642 +1356863491 +1357696653 +135789 +13579 +135790 +13579000 +1357902468 +1357908642 +135791 +1357910 +13579111 +1357911h +13579135 +13579159 +135791991 +135792 +135792468 +135792864 +135794159 +135796 +135798462 +135798642 +1357997531 +13579abc +1357bb0 +13580744 +135858 +13589 +13589313 +1359 +13591119 +135935 +135mci +135nelsy +13601360 +136033898 +1360617 +1360abcd +1361039610 +136111 +13611361 +136145 +1361990 +1361992 +13621362 +13621385 +13621984 +13622 +1363chel +136402 +13641364 +1364377 +136455 +136479 +13651365 +136513e +1365624a +1366137 +136642 +136650 +1366613 +136661313 +1366887 +13671546 +136718 +136738 +1367756640 +1367io +1368142515 +1368322282 +1369078503 +13691314 +1369idk +136ox +137100566 +13722157 +13733m +1374281 +1375 +1375137520 +13761376 +13778313 +1378555417 +1379 +1379128465 +13791379 +137921337 +13792468 +137941 +137946852 +13795 +1379510025 +1379ff +1379lol +1379pound +137ashe +137mbx +1380390 +1380614 +1380893 +1381 +138100 +13824435 +13836027 +138366 +13841056 +1385015 +1385695781 +138587 +138621 +1386425709 +1387 +13870214 +13870411 +1387787 +1387ali +13883102 +138914 +1389229 +13901 +139022a +1390bz +1391 +1391373 +139211 +13921392 +139228610 +13935551 +1393610 +1393mj +1394 +13942531 +13951489 +1395288871 +1396 +13969444 +1397 +139713 +13972332 +139726845 +13976418 +13978546 +13987233 +139903 +13E9C75 +13Februar +13Immortal13 +13LEXON +13a9d4 +13anduin +13annabelle +13b10b19 +13banner +13beger +13bfr666 +13bfu +13brew +13cd25jp +13ch13 +13chambery +13cle01 +13d03r81 +13d9b6 +13dbdb13 +13e1985 +13e8606 +13edgeware +13el1207 +13er01 +13erfolg +13f9978 +13fabi13 +13felt14 +13gracious +13guendalina +13hill +13kloten +13krot13 +13krvr13 +13malcolm +13milton +13moo59 +13nn0n +13p86kvy +13peaceful +13pp +13ppq08 +13roses +13sins +13sm08 +13sparky +13stingray +13stufen +13system +13talien +13tut13 +13ug4z +13vipergts +13virgins +13vxlt +13xm0nke +13zakker +13zigzag +14 +1400218576 +14008 +1400918 +1400glpp +1401 +14011962 +14011986 +14011990 +14011995 +14013 +1401401 +140141 +140164 +140177 +1401830000 +140188 +140189 +140190123 +140191th +1401ne +140202 +140209 +14021402 +14021971 +14021978 +14021980 +14021982 +14021986 +14022004 +14022007 +1402245 +140288 +1403 +1403018286 +14031026 +14031422 +14031959 +14031979 +14031991 +14031994 +1403535 +140354 +140379 +140387 +140388 +14038903 +140392 +14041949 +14041987 +14047860 +140482 +140489 +14049900 +140499sv +1405 +14051978 +14051987 +140589 +140591 +140594 +1406070420 +14061958 +14061986 +14061989 +14062006 +140642 +140681 +140682 +140683 +140683140 +1407 +14071985 +14071996 +140770 +140784 +140792 +14080126 +14081978 +14081982 +14081982 +14081989 +14081991 +140825520 +1408574 +140879 +140892 +1409 +140902 +14091332 +14091987 +14091992 +14091994 +140978 +140984 +140987 +14098835 +1409895438 +140990 +141 +14100 +14101364 +14101410 +14101971 +14101981 +141019833 +14101988 +14101989 +14101993 +14101n +14102000 +141065 +141067 +141077 +141078 +141086 +141100 +141102 +141103 +14110703 +14112004 +141166 +141176 +1411816 +141182 +141186 +141189 +141191 +14121948 +14121973 +14121980 +14121981 +14121987 +14121988 +14121991 +14122000 +14123 +141282 +141287mb +141290687 +141291 +141293 +1412988 +1412dez +1412zz76 +1413 +14136367 +1414 +1414058814 +141414 +14141414 +141418aa +141433 +1414le +1414m14 +141500 +14151415 +141516 +1415878 +141592654 +1416 +141603 +14161416 +141649 +141685 +1417 +14171417 +1417229 +141741 +1418 +141803 +1418031712 +141812 +14183945 +14191a +141955 +141984rg +1419jb +141btu +141q123a +141tekoa +142 +1420 +1420000778 +142021 +14203150 +1420bnt +1421402 +142142 +142153 +142154695 +142166000 +1421971 +1422001 +14220202 +142222 +142233 +142241 +1423 +142356 +1423700452 +1424safc +142512788 +142536 +142536987 +1425712 +1425980377 +1426 +1427169 +1428 +14281428 +142898mp +142925413 +14295339 +14296 +1429600123 +14297039 +142a4224 +142wz +14306996a +1431 +143143 +1431517369 +143167 +1431680 +1432 +143212 +14321432 +143294 +1433 +14341987 +1434901 +14352326 +14361436 +143621 +143644 +14375612 +14378254 +1438006446 +14383377 +143953 +143adc +143ajc +143beer +143caitie +143careana +143joe +143starr +144000 +144072416 +144114 +1441262626 +144144 +1441988 +1441av +1442069 +1442122 +144233fa +1442362 +144255366 +14425886 +1442918701 +1443 +1443237 +14433 +144366701 +1444488 +14446269 +144485 +1445 +14450vw +144541 +14456 +144606647 +14463171 +144648 +144722 +1447561 +1447699 +1448 +1448845701 +1449023229 +1449513 +14496976 +144ibs14 +14505710 +1451 +1451217 +145145 +145175761 +1451992 +1452131 +14521452 +145236 +145261 +14527741 +145297 +1453 +1453 +145300 +14531071 +145312 +1453123 +14531299 +14531453 +14531789c +14531817 +14531980 +14531992 +14532136 +14532905 +14533541 +145347 +145365 +1453fsm +1455 +145541 +14554700 +1456 +14560956 +1456320 +1456325 +14569 +14571457 +145811 +14589 +1458943514 +145910 +1459233950 +14594 +145989 +145admin +145ca11 +145e7f7f +1460103948 +14604925 +146092179 +1461 +146119 +1461618241 +14619968 +146212 +14621462 +1463252623 +14634l +1463rade +14651465 +14653120a +1466mor +14671467 +1467bulo +146800 +1468378217 +1469 +146905928 +14692728 +14699677 +1469Nicola +147 +1470741 +147133m +147147 +147159123 +147234901 +147254 +147258 +14725803 +147258369 +147258963 +147258c +14732020 +147369 +1473695 +147369yi +147390 +14744924 +1475369 +1475369510 +147596321 +147600 +1476217241 +147682 +1477 +1477258369 +14773 +147741 +14780438 +147825 +147852 +147852# +14785200 +14785236 +147852369 +147853183 +14785963 +14785a +1478621d +14788 +1478951 +147896 +1478963 +14789632 +147896321 +147896325 +14789635 +1478com +14791479 +147951xs +147963222 +147a8a8 +147aa222 +147iN0 +147wer44 +148 +1480125621 +1482095 +1482qv +1483515 +148443 +1484asek +1485026161 +1486800024 +1486904190 +148738745 +148786672 +1488 +148801 +148812 +148823 +148867183 +1488duke +1488online +1488v +148908c +1489488 +149 +149074 +1491 +1491976 +1491990 +1492632 +149321 +14948 +149482 +1494b1 +149595 +14975930 +149811 +149852 +1499114991 +1499260 +149960 +149hinde +149vaness +14Anna +14Premolar +14alex01 +14all41 +14angela +14apn +14ashram +14bbef6a +14booyaka +14bronzefish +14c25o +14c6f45 +14catriona +14corner +14fanter +14fidelio +14gardiner +14goodgirl +14h4f1sh +14h8vg +14harold +14janelle +14jaxson +14jb18 +14jhn +14juli94 +14kati12 +14lottchen +14malfroy +14manager +14marcel +14putrid +14rhcp14 +14rossland +14sailboat +14sd8y +14sloven +14snowflake +14sweetums +14tiamat +14tri11 +14u14m +14u214u2 +14ueb435 +14unlimited +14words14 +14xx9su +15 +1500 +150000 +15000522 +15001500 +15002089 +15002386 +1500550376 +15008 +15011501 +15011968 +15011981 +15011984 +15011989 +15011991 +15012003 +150177 +150179 +150182 +150187 +150191 +1501w +150202 +15021007 +15021983 +1502387 +150269 +150277 +1503 +15031953 +15031980 +15031993 +15032 +15032001 +15034704 +150393 +1504 +15041980 +15041990 +15041991 +150463 +150472 +150488 +150498 +150499 +1505 +150500 +15051505 +15051894 +15051983 +15052006 +1505651369 +1505972000 +1506 +150601 +15061961 +15061978 +150620023 +150626223 +150664 +1506805 +15068619 +150691c +150692 +1506ju +15071507 +15071984 +15071988 +15071991 +150784 +1507937108 +1508 +150806lh +15081385 +15081984 +15081989 +150859 +150884 +150887 +150889 +150892 +1508terra +150903 +150916924 +15091978 +15091984 +15092003 +150935229 +1509550691 +15096711 +150979 +15098199 +150985 +150bca +150omni +150p3nup +151 +1510 +151001 +151008 +15101962 +15101982 +15101988 +1510582722 +151069 +151069932 +151085 +151090 +1510dk +1511 +151106 +151110 +15111976 +151152 +151165159 +151185b +151194946 +1512 +151200 +15121358 +151214 +1512167620 +15121981 +15121998 +151283 +151287 +151288 +151322 +15149d +1514life +1515 +151500 +1515011988 +151515 +151515aa +151515xx +15154473 +15156218 +1516282 +1516n +15171412 +15175035b +15178198 +15182547 +151918 +151940 +151969 +151978 +151984 +152 +1520 +152011 +152047002 +1520omit +152119799 +152152 +15221460 +15225642 +15229077 +1522ed +152400123 +15241542 +15242653 +152433 +152457 +15247 +15253545 +15259085 +152606 +152608 +15262393 +15262715 +15264215 +152798 +1528020112 +152822 +1528231973 +15290 +152925 +15301530 +1531535 +153200 +15321 +1532206 +153246 +153255 +153257815 +15326789 +1533 +153351 +1533edd +153411 +15342679 +1535759500 +1535821 +1535947 +153595 +1536 +153624 +15362412 +1537 +1537 +1537246 +153733138 +153759 +15377351 +1538 +153847370 +15385771 +153942 +153af07fa +153n9 +153run +1540582 +154076 +1540xb +15410699 +1541122263 +15411541 +154151335 +154154895 +154166987 +154190 +15419809 +1542356 +1542365210 +154263 +154278 +15431543 +1543f +1543prut +15441544 +15443144 +1545743673 +1546 +15462331 +15463@ +154643588 +1547 +15473966 +154769290 +154835881 +1548653 +1549 +154930 +154956255 +1550 +155023 +15502449 +1550aqr +155117 +15514056 +155155 +1551768791 +15518264 +155223 +155247 +155274107 +1553991 +155467491 +155630555 +15566500 +1557721634 +1558140202 +15587249 +15587600 +155gilde +156 +1560171944 +1560398180 +15610994 +156115024 +15611561 +1561204455 +156145518 +156154 +15630523 +1563058032 +15632410 +156324789 +156324852 +1563252 +156423 +1567535965 +15681568 +156830424 +15689ama +1568ss +156983837 +156e076 +156fairy +1570 +1570200877 +1571 +1572 +1572005 +1572082 +1572fc +1573433 +15741574 +15741988 +1575102 +157544 +157593426 +157607 +15763349 +157635690 +1577470716 +157751 +157753369 +1577699637 +1577da +1577fair +1578 +157800 +157842 +157863 +15793487 +1579532846 +157954 +157987 +157news +1580696854 +158100192 +158158hf +158168178 +1582211057 +158221278 +15823970 +158277697 +1583119 +15835800 +15842mmm +15843002 +1584918 +158500 +158613 +15861586 +158657 +1586836 +1587340488 +158891 +158gs +158stw +159 +1590276 +159041816 +1590er +1591235 +15914215 +159159 +159159159 +159159789 +15918r7 +15926321 +1592634286 +15926347 +1593 +159305191 +159357 +15935700 +159357456 +1593578246 +159357th +15937 +159372513 +159456654 +159456753 +1595614710 +1596 +15961596 +1596300 +15963005 +159632 +1596321 +1596321456 +159663 +1597233398 +1597358 +159753 +15975300 +1597531 +15975310 +15975311 +159753456 +1597534682 +15975357 +15975372 +159753hg +159753hp +159753mf +159753qp +159754 +159761344 +1597831 +159789 +159847 +159851wq +159852 +159852123 +1598521463 +159852ab +15987 +159874 +1598742360 +1598753 +159875333 +1598757 +15988951 +1599 +15991599 +159951 +1599510 +159951125 +159951ss +159963 +159987 +159bob44 +159bra +159c79 +159f147 +159trez +15A2NB +15adt28x +15arimasu +15avri +15bright +15bvn +15c31445 +15cheese +15cpjrc +15cringer +15dca36 +15dxo98a +15f66e +15fevri +15geister +15ginger +15krack +15l7d2 +15l8964m +15lap200 +15lilavati +15lu1573 +15lx95 +15ma3l +15marius +15nantie +15oo2386 +15print +15qs24f4 +15rXp1 +15renaissa +15rob300 +15tO13 +15thaug +15tron26 +15ubbo84 +15vamp16 +15vaughn +15webogu +15y2rega +15yogibear +15z9dz +16 +1600101 +160011646 +160032633 +160115869 +1601692267 +1601781089 +160184kp +160185Ab +160186 +1601zy57 +1602 +16021503 +16021971 +16022006 +160237a +160266 +160269 +160283 +160295 +1603 +1603 +160300 +160307a +16031608 +16031977 +16031985 +16031994 +160326 +1603503204 +160381 +160393 +1604 +16041489 +16041984 +16041991 +16043002 +160468 +160476 +160484 +160485 +1604flamenco +16050170 +160519 +16051999 +160570 +160590aa +160596rt +1605diet +1606 +16061984 +16061987 +16061990 +16061993 +16062000 +16066038a +160660825 +160682 +160686 +1606902008 +160692 +160696 +1606knox +16071989 +16071991 +16071992 +160783 +160787 +1607871910 +160789 +1607sk78 +16080459 +16081989 +160864 +160878 +160890 +160891 +160892 +16089200 +16089345 +1609 +16090916 +160919990 +160968 +160983 +160991 +1609teal +160WPn +160nrr +161 +16101944 +16101986 +16101987 +16106186 +1610831385 +161088 +161089 +161091 +161100 +16110808 +161111985 +16111981 +16111982 +16111984 +16111994 +16112006 +161165 +161184 +161194 +161200 +161206 +16121968 +16121982 +16121987 +16121990 +16124023 +161256gg +161264 +1612732316 +161282 +16131687 +161381301 +161392k +1614 +161409 +1615 +161510307 +16151514 +1616 +161616 +161710 +16175k +161820 +161924 +161962 +161984 +16198745 +161xn +1620010 +162109 +16212618 +16215857 +1621616592 +1622621121 +16231900 +16242964 +162521 +16252555 +162555 +1625714631 +162587bb +162632305 +162644301 +1627384950 +16281628 +16287652 +16291629 +16298010 +1629bk +162p7 +1631286719 +1631504516 +16316498 +1632131025 +1632374 +163253253 +163264lh +163351 +1634 +16343743 +16344730 +163479 +1634tux +16354125 +1636 +163618060 +1636426586 +1636894080 +16379790 +16393463 +16401840 +1640276232 +164033 +164036057 +16408363 +16408451 +1641406 +16422167 +164325 +164389 +164427cd +164491 +1644xv67 +1646 +1646965 +164832 +1648523 +16486xyz +164895122 +16497113 +1649hg24 +165071746 +165165 +16521652 +1652medford +16565897 +16581658 +165826419 +165953147 +16599258k +166100 +16621311 +16631522 +166363 +1664 +16641664 +16643351 +1664dav +1664feel +16655477 +16673697 +1667943 +1669502166 +1670264903 +16702650 +16729438 +1674406187 +167532 +16765078 +1677 +16774 +1677513957 +16775ver +167943258 +1679435x +167946 +167a2f0f +16803098 +16821682 +16841684 +1684301725 +16843882 +168453aa +1684608307 +1685558 +1686201908 +168653533 +168684 +1687162007 +16879516 +1687kuu3 +16881987 +16887 +16899168 +168cctv +169174 +1692813116 +169356bs +1694828340 +1695392022 +1695824 +16Distiller +16a50d +16ak89 +16bucko16 +16c9e275 +16cali08 +16ce559 +16corazon +16d1983 +16datamart +16deyanira +16dublin +16exeter +16f69f01 +16graver +16gs16 +16guest +16hole +16idr0x +16julian +16k023 +16kismet +16madara +16myboy +16myszka +16nica08 +16okanagan +16rosey +16sharpei +16tarantula +16vjetta +16vmini +16walkies +16wasabi +16waterski +16won17 +16x12xum +16yankee +17 +170 +1700023759 +17001700 +1700excx +1701 +170103 +17011701 +17011964 +17011982 +17011989 +170147 +170177 +170184 +17019294 +1701w +1702 +17021968 +17021976 +17021987 +17021988 +170260 +17026359 +170273 +170275 +170276 +170279 +170284 +170290 +170291 +1702941837 +1702kr +17031987 +1703289901 +170346 +1703548759 +17035nad +170379 +170389010 +17039 +170391 +1703gth +17041989 +17041990 +17041997 +1704570 +170478 +170483 +1704830 +170491 +170497S +1704kora +170503 +17051705 +17051971 +17051977 +17051985 +170522061 +170580 +1705bodensee +170605mp +17061980 +17061984 +170621776 +170680 +170683sb +170689 +1706920 +170754 +170761c +170766007 +170777 +17079055 +1707st +170802aa +17081973 +17081991 +17082000 +170871 +170875 +17091972 +17091987 +1709736241 +17098 +170988 +17098917 +171010 +171011 +17101992 +1710778 +171085 +171086 +171087 +171088 +17109 +17110309 +17110600 +17111975 +17111981 +17111985 +17111987 +17111990 +17111991 +171159hc +171177 +171191 +171192 +1711993 +1711la +17121019 +17121950 +17121974 +17121981 +17121984 +17121990 +171239 +171241712 +171288 +17128900 +171290 +171298 +1712bine +1713 +17131013 +171313244 +1713133725 +17131814 +171319 +17146831 +1715smyrna +171676619 +1717 +171717user +171717x +17173445 +1717411 +1717Sage +17181613 +171819 +17182000 +1718lind +171911 +171917 +171987 +171994 +171ec230 +171ran +171yqy +172000 +17201991 +1720j +17210672 +17214888 +1722 +17228282 +17231184 +172346df +172354447 +1724557113 +172488230788 +1724grub +17262741 +1726354 +1726njtt +172701 +172722 +172839 +17291 +17293 +172950248 +172snx8j +1730168 +17311521 +173173 +17324518 +173439489 +1735162620 +1737 +1737t +173884589 +17395b +1740206905 +17404967 +1741097 +174175 +1741993 +174216 +174231289 +174285396 +17429 +17441324 +17441744 +17449 +1745bs22 +1745rose +174610 +1747 +17471022 +17477441 +17479eah +17482295 +17493 +174b6b52 +174thecow +175069 +1750995840 +175174 +17521428 +17525152 +1753 +175331 +17533370 +175488764 +175527ad +1755isla +175693 +1757414 +175altar +175c643b +176114865 +176177 +1762165535 +1762517626 +1763210 +17644529 +17645312 +17649c9 +1764dgh +1766235e +1767C5 +17680050 +17681768 +1768456360 +1768657 +1768josh +177002334 +177022287 +1771 +177159 +177177 +1771989 +1771992 +1772741035 +177316 +1773703 +177804676 +1778124643 +17788 +17800980 +17806531 +1781002b +178110048 +178157502 +17816240 +1781Lestat +178239456 +1784b0d0 +1785pusen +1787092 +17871787 +1788045496 +1788055 +17882cc3 +178855403 +1789 +178939 +17901790 +17903624 +1790781235 +1791056787 +1792 +1793 +17931793 +179317931 +17932486 +1793528 +1797190 +1797993189 +17987 +1799852480 +179992 +17Sandrita +17ab5e +17alex34 +17arek12 +17azx1w7 +17cameron +17concho +17eric17 +17f52833 +17ghsu15 +17halo17 +17john17 +17knarf +17loja28 +17m1982 +17mishaun +17nancya +17o11n +17paid +17pussy17 +17rec72 +17saru08 +17tandem +17und4 +17y8y26 +17ydoc +18 +1800655 +1800tower +1801 +18010484 +18011978 +180155 +180170lz +1802 +180206712 +18021958 +18021991 +18021992 +180224 +180255 +180278 +180296 +18030901 +18031942 +18031977 +1803197778 +18031998 +180368 +180378se +180382 +180385 +180388 +180392 +1804 +18041982 +18041987 +18041992 +180461982 +180476 +1804770443 +180503 +18051976 +18051985 +18051990 +18051998 +18052002 +18052560 +180555145 +180571 +180577 +180590b +180591 +18060718 +180618 +18061981 +18061983 +18061991 +18066018 +180662749 +180666 +180681 +180687 +180690 +18070871 +18071807 +18071986 +18074565 +180760 +180773 +180781 +180784 +180786 +180796 +18081980 +18081985 +18081991 +18081992 +18081995 +180865 +180872 +180888 +1808lc +18091965 +18091978 +18091991 +18091992 +1809npm +18101810 +18101979 +18101991b +18101993 +1810268704 +181067 +181089 +181090 +181111988 +18111364 +18111982 +181149 +181185 +181191 +1811990h +1812 +18121982 +18121989 +18121991 +18122002 +181261 +181269 +181284 +181286 +1812cd +1812mary +181311810 +181366 +18151815 +18152229 +18153 +18161431 +18161816 +1816240866 +1816594 +1816b +1817 +1817628 +18181039 +181812 +181818 +181819 +181881 +1819202 +181921 +181926 +1819827569 +181987 +181990 +181992 +181994 +1819wind +1820 +182005CH +1820saba +18211821 +1822 +18222516 +1824337329 +182493710 +182500 +182510tb +1827129696 +18272004 +1827752t +182888 +18291829 +1829297 +1829461123 +182950 +182950al +182aja21 +18300292 +183028 +1830283508 +1830861 +183107 +1831215 +18315315 +1831644868 +1831993 +1831java +1832082832 +1832389 +18330732 +1833615438 +183454 +1834562 +183461 +183462790 +18347150 +183512025 +18352200 +183642316 +183729 +183729465 +183756140 +18378neo +18379246 +183945435 +18401250 +1840918971 +184184 +1841981554 +1841985 +18433714 +18435a +18441844 +1845 +18450 +18465bf1 +184672g +1847fg +184998413 +185000 +18501850 +185052 +185188 +18529425 +1853339588 +18535 +1853520 +18539490 +1854afx +1854tink +18560239 +1856819 +1857dfea +18597660 +186015 +186091013 +1860cc +18614 +1861993 +18628462 +1863142029 +186397 +186417 +1866036833 +1866815971 +1868025824 +1868a3d2 +18691869 +186ace5 +186phi6 +18701870 +187097 +187187 +1872208688 +187236 +18729787 +18731596 +187340529 +18742168 +18745330 +18751875 +18752004s +187556 +1875m +187600 +18760649 +187803a +187817696 +187833217 +187Rugrats +187predator +187under +18810 +18810266 +188138 +188191220 +1881984 +1881man +1882536a +188522 +18857325 +1886 +1886manu +18879946 +18880676 +18881 +188818 +18889662 +1888jojo +1889bear +189053 +189148 +18915071 +189189 +18919661 +1891m11el91zo +18921892 +18926014 +1893tvg +1894510 +18945599 +18948968 +18954 +18965 +189655aa +1897 +1899 +18991899 +189978004 +1899941756 +1899milanac +1899xxxx +18Shamoo +18Watchit +18a20a47 +18a9d7 +18april +18aw1942 +18bcf +18bebe74 +18burck +18curne18 +18cuscus +18dildo +18dulias +18eacd +18f11622 +18fishing +18fuckhead +18hofer +18j7pyvy +18kih283 +18koh +18longboard +18lullaby +18m6a5gk +18midnight +18mufti +18naitsabes +18nrbh05 +18nxnb +18ophelia +18out76 +18pickle +18random81 +18rlt +18rnd23 +18scph23 +18sept86 +18sportive +18startrek +18stiles +18sussex +18thfc82 +18wTG +18zimmerman +19 +1900152789 +19001570 +19001844 +19001900 +19006006 +19008 +1901 +190106 +1901130045 +19011987 +190123 +190180 +190201 +19021951 +19021981 +190290 +1902chiva +1902dragon +1902kine +1903 +19031003 +19031903 +19031933 +19031954 +19031990 +19032003 +19032005 +19032006 +1903428 +1903731105 +190382 +190384 +190387 +190388 +1903888 +190391m +1903Holstein +1903bjk +1903mete +19041977 +19041989 +19041991 +19041992 +19047070 +190483 +190489 +1904900414 +190491 +1905 +190500 +190502 +19051102 +190512509 +19051905 +19051985 +19051987 +19051990 +19051991 +19052005 +19052006 +1905201119 +1905910 +1905u +1906 +190603 +19060807 +19061985 +19062004 +190660sa +190678 +190680 +190688 +1907 +190702 +190704 +1907123 +190715 +19071865 +19071907 +19071923 +190719662 +19071982 +19071983 +19071985 +19071986 +19071987 +19071989 +19071991 +19071993 +19072344 +190749 +1907826 +190784 +190789 +190791 +190792 +1907fb +1907ts +1908 +19081981 +19081989 +190847 +19086r +190883 +1908832328 +1909 +1909197213 +19091981 +19091991 +19091992 +19092005 +1909891929 +1909Danilo +190f74 +191 +1910 +191002ST +191007 +19101945 +19101976 +19101985 +19101988 +19101990 +19102565 +19102879 +19105871 +191079 +191082 +191090 +191091 +191101 +191103 +1911049 +19111954! +19111962 +19111968 +1911321512 +191146 +191176 +191190 +1911992 +1912 +191202 +19121 +19121965 +19121977 +19121978 +19121986 +19121999 +191271 +191278 +191310 +1913848 +1913936 +1914 +191413 +191478 +1915252625 +191583193 +19159753 +191615852 +19171311 +19171997 +191817 +19187 +1918tate +191919 +1919290224 +1919365 +19198282 +1919k +191b8 +191e0596 +191h0001 +192007 +19201920 +19208 +1920ink +192116 +1921680121 +19216821 +192168223 +1921683132 +192182 +19220500 +1923 +192300 +19231923 +19231924 +192367 +192367hg +1923turk +1924 +19241969 +1924260105 +192427 +192456m +1925 +19251218 +19251925 +19252243 +1925yali +1927064464 +19276343 +1928 +192837 +19283746 +192837465 +1928374650 +1928374655 +192837ad +192846375 +192873465 +19300627 +1930083 +1930abends +193140253 +1931xxyy +19320930 +193279 +1933189 +1933211062 +193346310 +193373920 +1934201 +19343110 +19356 +193614 +19361945 +19366 +19370119 +1937284560 +1937285456 +193746 +193755 +19375542 +1937889 +19381938 +19382738 +19386510 +19389495 +19390104 +193940 +1939YY +193qA +193sud40 +193xxx +1940 +194043 +194107ma +1941rose +19421228 +19430313 +19431943 +194319jk +1944 +194400318 +19440325 +19440606 +19440617 +19441203 +19441205 +19441944 +1944pp +19450225 +19450702 +19450911 +19451031 +19451475 +19451945 +19456547 +1945d +1946 +19461119 +1946738291 +19469** +1946mks +19470404 +19473679 +19480426 +19481024 +19481990 +1948501659 +19487397 +1948861262 +1948pk07 +1949111 +19491127 +19491217 +194924030 +19499903 +194a6af +19500515 +19501013 +1950113 +19502001 +1950490984 +1950Loewe +19510822 +19510826 +19511028 +19511951 +19511980 +19515682 +1951845 +1951984 +1951990 +19520122 +19520325 +19520616 +19520701 +19521021 +19521986 +1952cm +19530118 +19530224 +19531230 +19531945 +195320 +19532569 +19532598 +19534485 +195346dE +19538964 +19538ac +1953rumpel +19540204 +1954108 +1954109 +19547208 +1954ra +1954zzz +1955 +19551955 +19551960 +19551988 +19551992 +19553348 +19557294 +1955830 +1955ar +19560929 +19563241 +195640212 +195651 +195673 +1956bunow +1957 +195710 +1957116 +19571206 +19571808 +195731 +1957364280 +1957923 +1957tlen +1957x +1958 +19580403 +19580731 +19580807 +1958157 +19581928 +19581958 +19581963 +19581980 +19589b1 +1958jola +1959 +1959oct +196 +1960 +196045 +1960bn +1960ss +1961 +196101 +19610501 +19611003 +19611026 +19611030 +19611105 +1961112233 +19612004 +1961696020 +196184324 +1961868995 +196196 +1961murkel +19621982 +196248 +1962falc +1963 +1963 +19630421 +19631 +19631025 +1963110 +19631110 +19631963 +19631964 +1963520 +19635700 +196388360 +1964 +19640619 +19641964 +19641966 +19641970 +19642005 +1964314159 +1964523003 +1964523797 +1964dum +1964gee +196500 +19650522 +196507rl +19651965 +196570 +196574 +1966 +19660501 +19660606 +19660902 +19661012 +19661966 +19661973M +19666 +1966631821 +196666 +1966fred +1966jeanni +1966tino +1967 +19670108 +19671971 +19671988 +19671992 +1967325 +196762 +1967pontiac +19680324 +19681018 +19681211 +19681968 +1968qiu +1969 +19690516 +19690707 +19691168 +19693101 +196944 +196975303 +1969818 +19698266 +1969paola +196adc +196d31 +196d754f +196zc80 +1970 +19700414 +19700610 +19700814 +19700909 +19701970 +1970930 +1971 +197100 +19710301 +19710524 +1971119711 +1971219712 +1971519819 +19716223 +1971arch +1971hiro +1971patrice +1972 +19721008 +19721025 +19721115 +19721125 +19721972 +19721992 +19722000 +19722007 +1972345 +1972468 +1972pepe +1973 +19730211 +19730246 +19730410 +19730425 +19731027 +19731973 +19732104 +197328 +197346285 +19734682 +197346852 +19735 +19735654 +19735a +197373 +197382465 +197391 +1973913755 +1973917 +1973cs +1973penzance +1974 +1974 +19740304 +19740327 +19740405 +19740924 +19741011 +19741221 +19741966 +19741974 +19741980 +19741985 +1974208 +19744 +1974444 +1974513 +1974632 +197480 +1974803013 +19748360 +1974HONOR +1974dhw +1974poa +1975 +19750000 +19750111 +19750314 +19750619 +19750926 +197510 +19751010 +19751108 +19751804 +19751972 +19751975 +19752 +197526 +197557548 +197561 +197577 +19759278 +1975oa +1976 +19760122 +19760124 +19760202 +19760317 +19760410 +19761120 +19761204 +19761976 +19762000 +19762653 +1976748 +197678 +1976929 +1976Falkenburg +1976btba +1977 +1977030201 +19770531 +19770724 +19771973 +19771977 +19771982 +19771983 +19772005 +1977219772 +197724 +19777124 +1977zy +1978 +1978-19 +19780214 +19780601 +19780805 +19781012 +19781023 +19781978 +19781982 +197828 +19782893 +19783874b +1978420 +197846 +19785252 +1978636730 +197864 +197879 +1978815a +1978ford +1978hs96 +1978ma21 +1978skill +1979002k +19790207 +19790227 +19790921 +19790928 +19791005? +1979111 +19791212 +197913 +19791315 +19791956 +19792 +197920 +197950 +1979680106 +19797024 +197979 +1979815 +1979MUNIRA +1979hwi +1979isgreat +1979lb +197hatde +197iyas +1980 +19800 +19800109 +198007 +19800808 +198012 +19801980 +19801985 +19801990 +19802337 +1980320 +1980623 +198077 +1980817984 +1980826 +1980828082 +1980832a +198097 +1980a +1980ft +1981 +198101 +19810512 +19810609 +19810928 +19811127 +198113 +19812005 +1981218 +198144 +198147ek +1981829 +1981976 +1981ldm +1981sad +1982 +19820218 +19820321$ +19820606 +19820820 +19821021 +19821021 +19821030 +198210mm +1982117q +19821919 +19821981 +19821982 +19821983@ +19822435 +1982251453 +198288 +198294521 +1982mai +1982onet +1982sdfx +1982vane +1982yan +1983 +19830101 +19830505 +19830718 +19830807 +198310 +19831017 +198312 +1983120123 +1983147 +19831508 +198318cz +19831982 +19831983 +19832007 +198322aa +198326 +1983323323 +1983425 +1983517 +1983mk +1983pw +1984 +19840115 +19840127 +19840213 +19840327 +19840613 +19841002 +19841007a +1984102188 +19841122 +1984128 +19841363 +19841979 +19841984 +19841987 +19841988 +19842005 +198421 +19844 +1984444 +19846673 +1984723 +198484 +1984903 +19849425 +1984bir +1984cem +1984gogi +1984jank +1984je34 +1984jule +1984utem +1985 +1985+1985 +198500 +19850110 +19850204 +198504298 +1985102828 +19851112 +198519 +19851962 +19851985 +198523mg +19855 +198555 +198560 +198566 +19857479 +198585 +1985Nemo +1985aag +1985kn +1985lchp +1985livia +1986 +198600 +19860201 +19860319 +198606 +19860725 +19861016 +19861092 +1986110011 +19861118 +19861206 +19861215 +19861216 +1986123 +19861688 +19861949 +19861961 +19861986 +19861987 +19862001 +1986519865 +198656 +198677 +198686 +198697420 +1986aap +1986andi +1986usaf +1987 +198702280 +19870319 +198707 +19870774 +19870802 +19870822 +19870829 +19870907 +198711 +19871410 +19871453 +198717 +19871952 +19871955 +19871987 +1987198712 +19871989 +19872003 +19872088 +198721 +19872275 +198725123 +19873117 +19873131 +198736589 +19873728 +198741 +198764038 +19878130 +19878468 +1987cop +1987xristos +1988 +19880022z +1988003351 +19880109 +198801102 +19880131 +19880220a +19880317 +198804 +19880406 +19880527 +19880701 +19881002 +19881010 +19881018 +19881113 +19881125 +1988171053 +19881907 +1988191988 +19881961 +19881988 +198822 +19882212 +19882409 +19882905 +198853891 +19885865 +19887290 +198875 +1988757 +19887611 +1988820 +198888 +198891 +1988Jeep +1988bad +1988bear +1988cris +1988ebel +1988er +1988kyle +1988lion +1989 +198900 +19890212 +19890504 +19890520 +19890610 +1989061016 +19890624 +19890801 +19891017 +19891021 +19891026 +19891123 +19891178 +19891206 +19891217 +1989126430 +198915 +19891802 +19891907 +19891970 +19891989 +19892005 +198923 +19892302 +1989255 +198933fr +19893407 +198935818 +1989455 +198953 +198954 +198964 +1989726 +198990 +198998 +198998ib +1989kb +1989lolz +1989om +1989rvc +1989tom +198rio +1990 +19900220 +19900311 +19900421 +19900522 +19901010 +19901011 +19901114 +19901128 +19901412 +19901903 +19901905 +19901907 +19901990 +19901991 +1990228a +199024 +1990249 +1990277 +199061636 +1990823 +199098 +1990arau +1990faett +1990zoubi +1991 +1991007911 +19910114 +19910228 +1991030209 +19910329 +19910612 +19910710 +19910925 +19911001 +1991101010 +1991111g +1991112919 +19911209 +19911218 +199113 +19911991 +19911998 +1991460032 +199153 +19916062 +19916134 +1991613405 +19918386 +1991by10 +1992 +199200 +199200m +19920102 +19920221 +199206 +19921105 +19921702 +1992194564 +19921987 +19921992 +19922991 +19922op +1992422 +19925915 +199272 +199293 +1992damion +1992dar +1992eb +1992fth +1992halo +1992sm +199300 +19930415 +19930805 +19930815 +19930820 +199309789 +199310 +19931116 +19931248 +19931990 +19931994 +1993255 +19933991 +1993430 +199360999 +1993alg +1993biblo +1993lulu +1993naes +1994 +19940118 +19940360 +199413 +19941960 +19941994 +19941999 +1994flex +1994jm +1995 +19950315 +19951994 +19951995 +1995432515 +1995rcw +1996 +19960720 +19960924 +19961706 +199637 +1996451706 +199652 +199657 +19969691 +1996ford +199705hu +19970715 +19971997 +19972010 +19973158 +1997445896 +19979798 +1997enero +1998 +19981998 +19982484 +1998bird +1998haus +1999 +19990705 +19991005 +1999111 +19991999 +199993 +199999 +1999999999 +19Andre87 +19Aug98 +19Babylon79 +19CGE90 +19Conny79 +19GARVEY +19Gustav29 +19Krise29 +19Lieschen60 +19Margareta39 +19Naps99 +19Pitti45 +19Pred78 +19TOM59 +19Tierpark87 +19acesso +19ad16ce +19admin +19akiele37 +19ar65no +19arta69 +19as53gh +19avatar +19babu88 +19benner96 +19bine02 +19ca1 +19cali72 +19cannes77 +19cessna01 +19ch58bl +19chicco +19chick90 +19chip85 +19christina85 +19cinos94 +19civic98 +19company +19conny57 +19cuda70 +19darkness92 +19denise +19dirk71 +19doggies +19doon90 +19dvd87 +19edwin02 +19ekim +19elkb48 +19elke70 +19erme82 +19f836dc +19fanatik74 +19frosta +19geo48 +19guestrow67 +19halo19 +19hh33 +19hiljainen76 +19hoboken +19hugo84 +19iajknx +19ir082 +19isb69 +19jewi58 +19jimmy86 +19joconnor +19joern96 +19joga91 +19judite86 +19juli91 +19jura86 +19kanu94 +19katze79 +19keines36 +19kelly5 +19kilo30 +19kitten87 +19kpss12 +19lendin +19lieselotte60 +19linoer +19linux73 +19listopad +19mae03 +19maggie77 +19maik77 +19marcia57 +19miles +19minimal88 +19moni59 +19mvk +19nemo72 +19neon19 +19nili56 +19nirak59 +19nosneb +19nosy98 +19ok3184 +19omiyage +19orion84 +19otto37 +19oydEyCyD91 +19pandora59 +19parca82 +19pascal60 +19patience +19patriot85 +19paul94 +19payola +19peugeot +19pierre72 +19prelude +19rene84 +19ricky63 +19robert94 +19rpl79 +19samuels21 +19satchmo64 +19scotty51 +19scs69 +19sepp51 +19sirius68 +19sixtynine +19sn84 +19sonnyboy +19spatie +19stella40 +19tais97 +19ter90 +19terra64 +19tfd +19thom94 +19tina95 +19trachten06 +19ts90 +19unique85 +19ursula01 +19vito72 +19voay74 +19warrior24 +19werter53 +19werule78 +19will71 +19winner19 +19woitzik55 +19wxyz55 +19yugi92 +19zined90 +19zinny27 +19zoli77 +19zyrtec60 +1A2B3C +1A2S3D +1A518 +1Amberger +1Angela! +1Aufbruch +1Bsb +1CAMPA1 +1CRmUV +1Caleb8 +1Chippers +1DB6B +1Dyp +1Firedragon2 +1Fita9 +1Gauss! +1H3177 +1H4T3H4 +1ImI2 +1JACKAS +1Katrin +1Lindsey1 +1Lucky +1M2IMV +1Manolito1 +1Mnh +1Norge +1OnelovE +1Passwort. +1Quappe0 +1Raul +1Remains +1Resisto +1SHADOW +1Sa2Fo +1Sandra1 +1Saskia +1Specials +1Squirrel +1Stratus +1Taliesin! +1Telefone2 +1U17M8 +1Yxw +1a01c3 +1a10e +1a2b3c +1a2b3c4d +1a2b3c9z +1a2b3cc +1a2d3a4m +1a2e3o4n +1a2s3d +1a2s3y4a +1a32a5 +1a3b5c +1a3dmin +1a3st3 +1a473d32 +1a4fAF +1a7h9wa9 +1a9l8e7x +1a9m9d2 +1aa66831 +1aa74 +1absoluta +1ac14 +1ac6rbke +1acargill +1access1 +1adelta1 +1admin +1admin05 +1admin2 +1adres23 +1adri +1aepof +1afrika! +1ah2vs3s +1ah5P +1ahenare +1ai3312 +1aies +1ajxy +1akira1 +1alaska! +1albane1 +1alinton +1am0rz +1amalove +1amgraf +1amore2 +1amoscar +1andreas +1antonis +1aq5f4 +1aregod +1argentum +1arichard +1arkova +1asav4 +1asd3 +1asegeln +1asgentr +1assis23 +1astra23 +1atena +1aumakua +1aunq +1awings1 +1azxcvg6 +1b0728 +1b1og +1b26bca +1b2cbc +1b4d52 +1b722d7c +1b927ad8 +1b9n7d9 +1bacata1 +1bacha1 +1bagira2 +1bamber +1bamboo1 +1bamboom +1bastral +1batman1 +1bb3xsa7 +1bbellamy +1bbqhax +1bcoudray +1be34278 +1be67f +1beHappy +1beach11 +1berry11 +1bfj8 +1bfluffy +1bfluffy +1bgateway +1bgrs +1bigpeni +1bissonnette +1bkgm3 +1blusky0 +1bminmin +1bobbie2 +1bollow1 +1bone152 +1bonehead +1bonnie6 +1boommm +1boris +1bps0p1 +1breawaken +1brendan! +1bturnip +1btwa +1buttfuck +1buyuxfr +1buzir45 +1c05a5v1 +1c0de0n +1c2a3n +1c2b1b +1c3c62 +1c3d0g01 +1c45a7b +1c58cc46 +1c77a3 +1c80e3 +1ca3f08 +1caflm +1calida2 +1camel1 +1cc8fca3 +1ccf4d25 +1ccharity +1cd2ab3 +1cdcecd0 +1ced79c +1cedad78 +1ceman +1cg6az53 +1cg9wP +1cklj +1cl6x27w +1clark +1clemons +1coffee1 +1color +1constance +1cor13 +1cosocyl +1cpeasant +1csegonzac +1csmith +1csynergy +1ctundra +1cvhtufb +1cwesley +1d123qaz +1d27067 +1d2d3d +1d3a2s +1d4ba78 +1d6u7v3 +1d7c1d7c +1d9463 +1d9ee9c3 +1dabpvxz +1dahlstedt5 +1daloalo +1dani +1daniel2 +1davkal2 +1dbaxter +1dc0f14b +1dcorally +1ddvf +1delerium +1deltax1 +1demork +1dfriends +1di1goao +1dibb3h +1dimat +1diot1 +1dj0h0jl +1djones +1dlo2kd +1dmaxwell +1dnaatom +1doctor2 +1doxy +1dpiano +1dreki2 +1dsamantha +1dsawdust +1dyassar +1dzidzia +1e199 +1e2w3q +1e3654 +1e3699 +1e3769c +1e452185 +1e540d +1e5ab9 +1e7181 +1e8o8 +1eConny +1ea6e3f +1eabc123 +1eafwa1k +1eccray +1ecdl976 +1eenduro +1ef7r1gh7 +1eforgotten +1egenius +1egeorge1 +1eiwv +1ejaymi +1ekh1 +1eleong6 +1elizabeth1 +1em1em1 +1ema32 +1encantador +1enter +1enterprise2 +1eo3ugn +1epoetry +1eran1 +1erandal +1eric2 +1ericsson7 +1erikama +1esiemens +1eslo +1etelecom +1ethebest +1etrompet +1etrung +1ezf3 +1f +1f05m1 +1f23c58d +1f2f3f4f +1f2t3r4 +1f3d12d5 +1f3of +1f81988 +1f9rahfj +1fUNICORN +1fady1 +1farsite +1fastz +1fb37f +1fbnl +1fbrandy +1fbullitt +1fcampbell +1fcce7a +1fdc78e8 +1ffargs +1ffd376 +1firesz +1fish2fish +1fjackson +1fkalmar +1florian +1fmossberg +1fnashua +1focus1 +1frandsen1 +1franzi0 +1frosch2 +1fruitcake1 +1fshadow +1fstormy +1ftesti +1fuzzface +1fxxm +1g12vE +1g4m8m7g +1g9m8g5 +1gangsta +1garbonzo +1gb7y38i +1gb89as +1gcwod +1genius1 +1gilera1 +1glory1 +1glueck9 +1godfathers +1gogol +1grgurevic1 +1grietje6 +1grundo1 +1grunge1 +1gurke1 +1gynonc +1h2u3ss +1h7bh9md +1hannah2 +1havefun +1hbfsvkb +1hblsqt +1heike1 +1hello +1hendar2 +1hiace +1highlander2 +1highst +1hlp123 +1hlp123! +1hoer1 +1hoppies +1hotmomma +1hqgl +1htsuser +1htx437 +1hwestuj +1hxnzpbs +1i +1i698xx +1i9v8a7n +1idna1 +1iklmr23 +1ilikefo +1immortale +1infantry1 +1info2 +1isginc1 +1isq3 +1j03m8 +1j11d1 +1j1ebn +1j1ebn33 +1j2j4l45 +1j8azxds +1jameson3 +1jasper4 +1jbhi5 +1jed2 +1jesslyn +1ji8bwca +1jiia5eh +1jn316 +1joellen2 +1jofj +1jok4w8 +1joop11 +1jqoheik +1jsilvia +1jthm +1ju8s3g8 +1judge1 +1justyte +1k2g3b +1k453 +1k8764bl +1k9i9m2f +1kOx1 +1kaneda1 +1karaer1 +1karius1 +1kartal1 +1karting +1kati23 +1kauf +1ke4s +1kenad +1kerstin2 +1kesagat +1kgcy +1kids1 +1kimmie1 +1kinkichi2 +1knoedel +1ksabk69 +1kttt +1kw0202l +1kycux4h +1kzy1 +1l00j1j4 +1l1i1n1 +1l2l3l +1l3e3e7t +1l9e7e3 +1ladyli1 +1laksa1 +1lambda2 +1lar1a +1lasombra1 +1lavinia +1lcd2 +1lckdo7i +1legion5 +1lewy1 +1live1 +1loadload +1lovecat +1lovekt +1lovestal +1m053t +1m4fa83 +1m7ddmvi +1m9a4t +1madlen! +1majav +1malacka1 +1maman +1mann6 +1manolo +1manson9 +1marmor4 +1martas. +1marwer +1master2 +1maus9 +1mausi1 +1maxon1 +1med453 +1merkle3 +1metacom2 +1mf4ever +1michael +1milkman7 +1million +1minden +1mistert +1mixp +1mj5po +1mjxnrrr +1mkvjv3q +1mohil +1mojf +1mooman1 +1morris1 +1moshir1 +1motorola +1mpadv +1mperium +1mports7 +1mwgryor +1n1kin +1naj9 +1nanook4 +1naq0 +1nata2 +1nation +1navigator0 +1nerlei +1net2dji +1neunzehn9 +1newday +1nf0s3c +1ngen1um +1nite +1niut1 +1nk1wwhf +1nkslave +1nov1983 +1npvfgl1 +1nsfkbiz +1nt3rf +1nter9dt +1ntr4n3t +1nu887il +1nv1c1ble +1nv1t4d0 +1o5t5 +1o9n8u9r +1ofr7 +1olb5 +1om3c0 +1ona1jmm +1ooqi +1opaopa1 +1orbison +1osv879p +1p2a3s4s +1p2a3u4l +1p2ambdp +1p31wn +1p7e1e1 +1p9pon +1packen +1pakize1 +1pakoska +1panos +1parivel +1pdMPP +1pdppt2s +1pdsz +1peekaboo +1peggy1 +1peliculas2 +1php1 +1pikus1 +1pilota +1pj8cets +1poopy2 +1prelude +1presario1 +1prompt1 +1pufulete11 +1puyx +1q +1q1111 +1q1WVL +1q1q1q1q +1q2 +1q2a3z +1q2k9zh2 +1q2w3e +1q2w3e4 +1q2w3e4r +1q2w3e78 +1q2w3ewq +1q2wxc +1q7ak7w +1qa2ws +1qay2wsx +1qay3edc +1qayxsw2 +1qaz +1qaz1qaz +1qaz2w +1qaz2wsx +1qazally +1qazse4 +1qazse4 +1qazwe23 +1qazxsw2 +1qazxsw2 +1qazzaq1 +1qp4zk +1qq +1qsx1qsx +1qtyj +1quad451 +1quwa +1qvake23 +1qw23er4 +1qwe23 +1qwer2asdf +1qwer2t +1qwertz +1qwertzu +1qwq2s +1r2rta +1r2wmbeu +1r669gkp +1r7d56s +1r85573 +1rafal +1rangi2 +1ranti1 +1ratte23 +1red4sun +1relaxing +1resets1 +1riff2 +1rjvb1 +1rkwi +1rl0dh2 +1rlighter +1rodney3 +1rofk +1roflrofl +1ronnan2 +1rpc12 +1rumasa2 +1runaway +1s22p6 +1s2ufv +1s4b3ll4 +1s56cq8m +1sXaR +1saat +1sal +1samirah +1santos1 +1saralea +1satanic2 +1scanar0 +1schlaf1 +1schlagzeug +1schweiz +1secrets +1sedam +1select2 +1sen1ben +1sensei1 +1sierras +1silbern1 +1simple9 +1singles +1skulpie +1sl3w0rth +1slam786 +1sland93 +1slkuser +1smyzth6 +1snail +1snkf +1sodice +1sodomy1 +1sometimes +1somos4 +1sonne2 +1sponge1 +1st4nbul +1starada +1stargame +1stclass +1stcobra +1stfirst +1stinkfist +1stmanon +1stopit1 +1submit0 +1sunnybank +1superfly +1superman +1swatch9 +1sweets1 +1syafiq1 +1sysop2 +1syw7 +1t0xel1 +1t2l3k4g +1t3ch62 +1tacobell2 +1tallguy +1tanishia +1target9 +1techno6 +1teddie1 +1teich +1teiger +1texan2 +1tg2sj +1thistle +1thraen1 +1tiamo +1tower2 +1tqni +1traeumer +1trantra2 +1tre1231 +1treca +1tron2 +1turboie +1tuukhi1 +1tvad +1txwc +1ubskk34 +1ucdse2 +1ucr4p1d +1ukp7 +1unitedstates +1unmaker +1unseen1 +1uoba +1uwgwbry +1uxct +1vaila! +1vally11 +1varsson +1vauto23 +1vt3nxb +1vvhjbja +1vyjo +1way234 +1wdultra +1we453 +1wildone5 +1winnie +1winter23 +1winxp3 +1witchman +1withgod +1wizard2 +1worries +1wortendyke +1wu4you2 +1wupq +1x32mw +1x924c +1xbh8 +1xcrh +1xgar4ut +1xpmm5 +1xutz +1xwqx +1y2x3c4v +1y6f2l5y +1yge4 +1ykq1 +1ylbv +1ymgd +1ynq6 +1ynqx +1yojimbo +1yunotme +1yvhgh64 +1yxcv1 +1z0xcv2 +1z2x3c +1z2x3c4 +1z2x3c4v +1z3b992 +1z793 +1z9ydu +1zahit1 +1zaun5 +1zbXso +1zicek1 +1zims +1zkn9 +1zrael +1ztp1 +1zwy5r +1zxcvbn1 +1zyay +2 +2*0(Q(= +2.10.1991 +20.10 +20.11.1976 +20.11.69 +2000 +200000 +20000127 +200005 +20000724 +20001229 +2000129032 +2000153 +200024379 +200048155 +2000520 +2000520005 +2000915 +2000Yob +2000gu +2000klf +2000ls1 +2001 +20010280 +2001033528 +200103971 +2001043880 +200106 +20011002 +2001188 +20011977 +20011986 +20011988 +20011990 +20011993 +20012 +20012001 +20014210 +2001515b +200157152 +200169fu +200184 +2001871733 +2001Chevy +2001Fltr +2001am +200200 +20020066 +20020523 +200205527 +20020994 +200212 +20021224 +2002123131 +20021232 +20021901 +20021932 +20021979 +20021982 +20021991 +20021994 +20021999 +20022002 +20022003 +20022183 +200231025 +200233 +200244 +20024910 +2002580 +200276009 +200282 +200289 +2002cyclone +2002mariusa +2002rebel +2002trans +2003 +2003005 +20030119 +20030315 +200303925 +2003071114 +200308 +20030904 +20031152 +20031330 +20031973 +20031983 +20031988 +20032003 +2003218002 +20033041 +200350619 +200364255 +200378 +200381 +20038472 +200393 +20039646 +2003lt +2003mar +2003mario +2003nadine +2004 +2004010014 +2004021147 +200404 +200406 +20041331 +20041983 +2004198618 +20041990 +20042004 +20042005 +20042813 +20043061 +2004333267 +200451411 +2004624535 +200471 +200481 +200494 +2004rav4 +2004wrx +2005 +20050102 +20050151 +20050406 +20050989 +20051025 +20051103 +200511111 +20051227 +200512556s +200518 +20051986 +20051993 +20051994 +20051997 +20051999 +20052006 +200520187 +20053 +200533 +2005376 +2005400 +20055000 +2005554 +200562276 +2005712020 +200576 +200579hs +200586 +20058891 +200591 +2005941647 +2005jayman +2005sail +2005wien +2006 +2006011 +20060206 +20060225 +20060301 +20061974 +20061982 +20061989 +20061990 +20062006 +20062007 +2006474 +20064s +2006515 +200656681 +200661 +200675 +200676m +200683 +200685 +200691 +2006Herbert +2006ak47 +2006alex +2006div2 +2006hpjm +2006rm +2007 +20070211 +20070518 +200706 +20070913 +20070914 +20071004 +200711n +20071209 +20071712 +20071969 +20071972 +20071987 +20071990 +20072007 +2007400866 +200753 +200768 +200781d +200785m +200786 +2007mn +2007picassa +2008 +200801 +200808 +20080808 +2008110904 +2008118119 +20082002 +20082009 +2008504 +200867 +20087500 +200883 +2008852527 +200889 +2008936liu +200899 +2008man +2008tiburon +2008twop +2009 +200903 +20091977 +20091982 +20091986 +20092009 +20095111 +200983 +2009832603 +200983sg +200986 +2009linkinpark +2009manual +2009persoane +2009thalium +200tao4e +201000 +2010020 +2010020100 +2010041513 +20101040a +20101987 +20101988 +2010199023 +20101991 +20102010 +2010610 +201066 +201081 +201084 +20108762 +2010919 +201104 +2011060395 +20111978 +20111985 +20114893 +201182 +201183 +201184 +201187 +201190 +201190tt +201192 +201196 +201202203 +201205r +20121967 +20121974 +2012636963 +201280 +201284 +2012842z +201286 +201288qq +201291 +201293 +2012near +20131893 +201373396 +201378 +20137970 +2013warriors +2014224184 +20143143 +2014820148 +201490 +201513Bi +20152000 +2015656009 +201578 +20166856 +2017871 +2017chovet +2019 +2019213628 +201969 +20199228 +201992gs +201sun +2020 +202013 +202020 +2020229 +20203623 +20204242 +20207256 +2020qtj +20212021 +202122 +2021369607 +202173 +2022057415 +202220 +20222022 +202228 +2022565 +202276 +2022839 +20231515 +202421 +2024758 +202502 +2025066 +202515498 +202589ls +202606 +20262152 +202663 +2027 +2027563564 +20280510 +2028191839 +20282002 +2029241998 +202933 +2029445 +203015003 +2030821208 +2030or +2031407386 +2031975 +2031980q +2032 +20320897 +20323084 +20323828 +203314380 +20333 +203429808 +203626361 +20363039 +2036450910 +2036712810 +2038320383 +20384833 +2038xbf +2039688 +203983754 +204055 +204060 +2040791387 +2041026131 +204105552 +204159669 +204204l +204208904 +20421212 +204218 +20421sc +20427285 +204321640 +20449829 +2046923194 +204692fa +204724 +20482048 +204826 +20487123 +20493 +2049466 +204blood +20507110 +20511203 +2051985 +2051989 +2051ABDs +2052680 +2053009 +205304 +2053476 +20539539 +2055 +20551 +205519614 +2055463 +20555889 +2055806 +20580339 +20582632 +2058qaz +20591447 +2059252531 +205997hh +206000004 +20603216 +206206 +206262899 +2063045 +2064656382 +2064705665 +206502501 +2065038564 +20665634 +20683442 +20687469 +2068998592 +2069 +20690379 +20693451 +2070cc +20710908 +20715 +20720 +20727711 +20747sw +2075598 +20756 +2076115394 +207812 +2078972 +2079 +2079978 +207x22zy +20801992 +2081528 +2083070 +20831989 +20841681 +20847857 +2085d15g +208615 +2086369958 +2088 +2088290406 +208N032 +208butternut +208nezumi +209.211 +20918513 +20922092 +20924475 +20927 +209316 +209320 +20936027 +2095004114 +20956844 +2096395454 +209646 +2097407 +20986417 +2099 +209958493 +209f4sj4 +209skater +20Benny04 +20Canada00 +20Carole08 +20Excel07 +20Julie02 +20Khalis09 +20Lani06 +20Lina08 +20Sage07 +20TEST2 +20Wutz10 +20a272 +20amisha +20beau37 +20bruiser43 +20buis06 +20bvnk12 +20camerons10 +20chris08 +20csk06 +20cyprus23 +20da +20davy08 +20dxk +20e843e0 +20ester05 +20falconer +20feb00 +20fevr +20ffrg03 +20george +20get0up +20ggh04 +20gidget +20gott03 +20hammer +20hollad +20jakobus05 +20jf1985 +20june03 +20jvd09 +20kawaii +20kcc06 +20lesen09 +20letras +20libing +20ll2508 +20lulu05 +20maj20 +20mas06 +20maya07 +20millon +20mini07 +20mits08 +20neuropsych +20oblique +20pace01 +20paranoia +20pkz2fv +20poohbear +20r04h48 +20rdf438 +20romart09 +20ronni02 +20rps07 +20shak +20sipe77 +20skater +20soli06 +20sssssss +20tallguy +20telefon00 +20terra07 +20ub36 +20valide +20vega60 +20webmaster03 +20wr80 +20zarria +20zx1x0 +21 +21.07.1993 +21.09.2006 +2100 +210000 +2100013 +21001177 +2100123 +21002069 +21002876 +210052 +21007125 +2100zxx +21010 +210106 +2101121 +21011977 +2101611 +21017 +210189 +21019011 +2101971 +2101988 +2101b220 +21021969 +21021986 +21021990 +21022102 +2102251 +210238 +2102919321 +210307 +21031968 +21031969 +21031990 +21031991 +210323 +210340 +210358 +2103623! +210376 +210383 +210388 +21040 +21041939 +21041958 +21041986 +21044991 +210465 +2104kurd +2105 +210506 +21051971 +21051977 +21051992 +21051997 +21052003 +210560 +210574 +210589 +210590 +210592 +210592dm +21061890 +21061983 +21061984 +21061997 +210642 +210653 +210663aa +2106649 +210665 +210679 +210680 +210685as +210688d +210689 +210691 +210694 +210701 +21071990 +21071996 +210762 +210773 +210777 +210786 +210789 +21079 +210790 +210816568 +21082108 +210831 +210857 +21086983 +210870 +210887 +210889 +210891 +210895 +21091969 +21092 +21092109 +210933988 +2109344158 +210962 +210979ab +210994 +210997328 +2109geb +210ckunz +210rmc85 +210vs514 +2110 +21100370 +2110041 +21101955 +21101980 +21101988 +21102008 +211069 +21108814 +211092 +211093 +2111102812 +21111984 +2111721227 +211184 +2111869 +211189 +2112 +211210 +21121007 +211211 +2112183 +21121966 +21121982 +21122112 +211242 +211274 +211281 +21128507 +211286me +211287 +211288 +211295 +2112gal +211317 +211330 +21137476 +21140511 +2114455 +211480 +2114cga6 +2115 +21152812 +211549 +2116lion +21177 +2117870211 +211807m +2119 +2119066 +211915 +211955 +211965 +2120022 +2121 +212121 +21212121 +212121xx +2121345 +212159393 +21217900 +21218866 +2121890249 +2121985 +21219911 +2121wqwq +212223 +212224 +2122310874 +21223445 +21225R +2123 +2123212 +212367 +21238384 +21238385 +2124112804 +212428 +2124318 +2124786421 +2124822 +2125 +2125195 +21251992 +212541255 +2125830 +2125922 +212602dk +212690967 +2127202 +21273032 +2127322 +212782994 +212808a3 +2128163 +212829 +2128506 +21285229 +21293ggg +21298599 +212t7445 +2131363 +2131587000 +21319437 +2131997 +21320 +2132070 +21322132 +213243 +2132876 +213321 +21337 +213400 +21342134 +213452 +2134522200 +2134989 +213512 +213513 +2135168437 +213546879 +21362010 +21365597 +2138736 +2138796 +21388 +21389165 +2138clau +213900 +2139191434 +21392139 +213954086 +213986 +2139dd +213af +213cn5us +21411h +2141974948 +2142186 +2143522412 +214365 +2143923 +214405661 +214414 +21448522 +2145065 +2145138818 +21456 +214563789 +2145moaz +2146040 +2146150 +2146289 +21465563 +21469375 +214702251 +21473610 +2147591 +2147841 +2147896325 +214823 +2148254 +214932 +21494 +2149594 +214heero +214sli +2150 +215131 +21522 +21522152 +2152363 +215243 +2152770025 +215284 +215300 +2153asd +215555 +2155sanou +2156374 +2156818 +2157125897 +21572157 +21574852 +2157557008 +2157842842 +2158060 +2158684579 +215915215 +2159844 +21601810 +21602160 +2160476 +2160986 +2160994 +2161 +21611357 +2161226509 +21619 +2161908 +2162510749 +216277 +21629035 +216434 +2164810 +2164965 +2165135 +21651490 +216580 +216582903 +21658300 +2167 +216711 +21688612 +21695271 +216977 +2169scsc +2170059 +217109 +21717635a +217243 +217444 +2174975 +2175283 +217568 +2176388106 +217639121 +2176782336 +217758991 +2178157 +21787 +2179509130 +21807 +2182121821 +2182317 +218505 +218564 +21866444 +218670 +2188080372 +21882114 +2188524 +218870 +218992 +2190056277 +2190159 +219056010 +21922347 +219234 +2192baller +21931924 +219362177 +21951637 +2195450 +2196893 +21980 +219802 +2199102427 +21992199 +21996433 +219dd3 +21D61 +21Goldengirl +21U53Y +21cardam +21chantez +21college +21colors +21dal21 +21fifty +21fixy +21gsgm09 +21hye +21ivta04 +21jorss +21jow +21juni +21kw547 +21lcry +21madhuri +21nathaniel +21netball +21pastor +21ranger +21rewq +21rob25 +21shaca +21spiderma +21starcraf +21storm +21td021 +21w3b06 +21wankers +21wojtek +21xalo21 +21zhoxeh +22 +22.01.1987 +2200004 +220011 +22002 +220022 +22008004 +22009 +22011993 +220123 +220151re +220179 +22017970 +220187 +22018720 +2201ct68 +2202094 +22021977 +22021987 +22021988 +220255377 +220264 +220271 +220280 +2202801980 +220286dw +22029886 +2202suzuki +22031954 +22031988 +22031989 +22032 +22032003 +22032203 +22032805 +22034469 +220373 +220381 +220382 +220387** +220392 +2203mythos +2203patrice +2203remi +22041961 +22041964 +22041966 +22041970 +22041980 +22041981 +220426 +220437720 +220456 +220477 +220482 +220488 +220491 +2204mw +2204souza +2205 +220501 +22050208 +22051704 +22051981 +22051998 +2205671105 +220581 +220584 +220587 +220588 +220590 +2205paka +22061985 +22061988 +22061990 +22061994 +220633 +2206331984 +220657 +220684mm +220688 +220689 +2206891 +220691 +2207 +22071975 +22072002 +220757mk +22077814 +220788 +220789 +220790 +22081954 +22081963 +22081964 +22081987 +220857 +220873 +22087435 +220882 +220890 +2208932147 +220897 +2208pin +220906 +22091906 +22091983 +22092raj +220977 +220984 +220988 +2209885 +220c759 +220sn778 +2210 +221008 +221019 +22101969 +22101982 +22101986 +22101991 +22102001 +22102182 +2210290 +22104006 +221070 +221082 +221087 +221090 +2211 +22110000 +2211155s +2211176 +22111963 +22111968 +22111976 +22111983 +22111990 +221122 +22112212 +22113344 +221170 +221177 +22117may +221190 +2211902 +221191 +221192 +2211es +2211thb +2212 +2212123322 +22121988 +221224 +2212822128 +221285 +221286 +2212922129 +22129621 +2212BAL +22131234 +22132660 +2213324 +22133354 +221357 +22142214 +22147724 +2214tc +2215866 +221608 +2216131 +22161887 +2216254 +2216600 +22166973 +22177736 +22182020 +2218902534 +221927 +221987 +221991jm +2219965 +222 +222 +2220180 +222033 +2220566711 +222122 +222123 +222165 +222177 +2222 +2222008 +222214pr +22222 +222222 +22222208 +22222495j +222226 +2222461548 +222258 +2222624 +222279503 +2222888 +2222opop +222322 +222333 +222333b +222333wq +222430285 +222444 +222446 +222459 +2224806b +222770fi +222791 +222796 +222950 +222Faith +222ajs222 +222wm4 +223013 +2230679 +223070461 +2230877 +2231000 +2231020 +223106 +223126196 +2231299 +2231823 +22321422 +22321424 +2232144934 +22322 +223229 +223242 +2232473 +223267 +22329732 +2233068417 +22331 +22331111 +223315 +223331869 +2233344444 +2233439 +223344 +22334455 +22336541 +22337 +223370803 +22337755 +22338503 +2234040 +2234056 +2234114 +223422 +22343234 +223497 +2235090572 +2235105 +223519 +22352255 +22354112 +2235ab +2236 +223615746 +22362236 +22365311 +22368671 +2236927 +22370259 +2238426 +22388 +223890 +2239 +223923 +223996 +2239lib +223today +2240099 +22402871 +224039 +2240474203 +2240f05 +224100 +22412241 +2241639 +224198jr +2242040 +224224o +224236 +22428299 +224295 +2242jk +2243 +22436 +2244 +2244542 +224466 +22446611 +2244668800 +224469 +22447722 +22448816 +2244chrille +2245 +2245091 +22451147 +22452245 +2245337 +2245608161 +224581988 +224604057 +22461917 +2246389 +224669 +22476288 +22481085 +22483044 +224867 +22488alp +22491719 +22492 +225 +2250955 +225120 +22513905 +2251786 +2251823163 +225182378 +2251ee3 +22521234 +22521395 +22521766 +225225225 +22527460 +22528 +2252822528 +2252BR +2253115 +22534 +2253529 +2253614 +22542095 +2254311 +22554466 +2255751 +22558549 +225588 +22558888 +225607 +225631588 +2256416 +2256743 +2258513 +225856009 +225864 +22588799 +22590 +225900 +225Fox +22603001 +2261 +2261091708 +226161 +22616418 +2261656 +226166 +22621554 +226215543 +2262310 +226248 +2262666 +22628011 +2262eden +2263105400 +22637236 +2264052 +2264205 +226460 +22653 +2265628 +226588933 +2265915 +2266219 +2266402 +2266417 +2267227 +226724s +22678001 +2268160 +22681816 +22683149 +22704 +2271158106 +2272289 +22724402 +227261 +22730755 +22731977 +2273365 +22734 +22734190 +22736418 +22738938 +227415 +2274359 +2274647 +2274cari +227529 +227559145 +22765463 +2277 +227730631 +2277898 +2277player +22782592 +22786003 +22791360 +227989790 +227a171 +227f6afd +227labl +22802280 +2280954 +2281 +2281329313 +2281988 +22822 +2283820 +22840 +228571970 +22859672 +2286 +22862286 +22867396 +22874296 +228df56 +228real +228real +2291960 +2292155 +22930220 +22931101 +22934575 +229379254 +229393 +229460 +2294mb +229513198 +229525455 +22961870 +2296soad +2297844399 +22982722 +2298324281 +22998908 +22GS6 +22Mouse +22ayanah +22bas +22bashee +22bb95 +22be9f +22beta +22bogdan +22budala +22build +22buster +22cloud +22com33 +22ct34 +22dec05 +22deceit +22ecuador +22f9f18 +22fisch +22fuai22 +22gold44 +22h86ke +22jireh +22jul05 +22luckies +22maj88 +22may2010 +22may75 +22morte +22moto99 +22nous12 +22pangane +22paw44 +22qig +22rallye +22ramx +22redstar22 +22rifle +22s05p86 +22sept77 +22shannen +22sikker +22sony11 +22squire +22teacup +22twinkle +22woodlane +22wwee +22yogini +22ywern +22yycc +23 +23000058 +23001989 +230023 +230102702 +23011972 +23011980 +23011988 +23011989n +23015234 +230167230 +2301705 +230178 +230183 +230183lf +23018963 +230190 +230202 +23021210 +23021977 +2302342 +23025850 +230298 +2303 +23031979 +23031984 +23031991 +23032006 +23032066 +23032303 +230348 +230367 +2303837835 +230390 +2304 +230400 +23041955 +23041974 +23041986 +23045711 +230474 +230480 +230487 +23051392 +23051981 +23051984 +23051989 +23051991 +2305323 +230533157 +2305368 +230590 +230599724 +2306 +23061981 +23061991 +230672nb +230680 +230682 +230683 +230684 +230685dw +2306878769 +230687k +230692 +2307 +230707 +2307198325 +23071986 +2307198s +23071991 +2307470a +2307561 +23076603 +230784 +230787 +230790 +230811905 +23081365 +23082005 +23082008 +2308686 +230883 +230884 +23091980 +230964md +2309702 +230992 +230997 +2309acbe +2310 +231009 +231012 +2310191 +23101944 +23101986 +23101987 +23101997 +2310221 +23102310 +2310231010 +2310274567 +2310626532 +2310664493 +231079 +231089 +23109023 +2310nud +2311 +231103 +23111988 +23111990 +23111991 +231123 +23114 +231154 +231204 +231213 +23121989 +23122001 +23122002 +2312283415 +23123 +2312428 +231272 +231281 +231286 +2312860 +2312862005 +23130623 +23132001 +231331132 +2313374u +231372612 +2313974h +2313wlmi +2313woodway +2313xj +2314000747 +23140692 +2314103 +231414 +23143140 +231450 +23151330 +231564 +231564uf +23161278 +231659 +2316607 +2316gajas +23174 +231834 +23195462 +231960 +2319697j +231976 +2319777 +23198008 +231985 +231988 +231mib +231x6 +23202320 +2320233 +2320441 +2320545 +232055 +232081 +2320834 +232100 +2321089 +232114466 +2321730327 +232187 +2321987 +23222420 +232232 +2322619 +2323 +232323 +23232315 +232336 +2324 +232400 +2324010066 +2324024 +232405 +232425 +23242502 +2324452 +2324581457 +2325222 +23252325 +2325357 +2325664 +23256880 +23261701 +2326ea +23272321 +23275240 +2328003 +2328707e +23287878 +23289 +2329615 +23299000 +2329plop +232gf54 +2330013 +23302222 +23304423 +2331 +2331329 +2332 +23321411 +2334 +2334+8 +23340821 +2334204 +23342334 +23351895 +23354615 +2335659 +2335789 +2335808 +233600f8 +23361415 +23362336 +23365765 +233722 +233942f +233947002 +234 +2340063 +234010 +2340345 +234111 +234202t +234206 +234234 +234243 +23424323 +2343154525 +23432 +2344181 +234455 +2345 +234561po +234562345 +234567 +23456789 +234585 +2345877 +234589ts +23461540 +234626 +2346680 +2346821 +23470 +23470493 +2347191978 +23486 +2349323 +23498847 +234998321 +234dvp +234jacob +234shad +234yv +2350165487 +23505458 +2350ftgt +23511240 +2351270 +2351456 +23519565 +2352241 +23522918 +235269737 +2353 +2353205t +2353515 +2353535 +23537705 +2354 +23545 +235467 +235486 +2354860849 +2356235658 +235648 +23564d18 +23567531 +235689 +23571113 +23572357 +23572468 +2357aaaa +2358132144 +235846 +235859 +2358801 +235889 +23589 +2359660 +235de4 +236173035 +23619097 +23622345 +2362623626 +2363236 +236335 +236342 +2363682 +236381388 +23642007 +236423 +2364349 +236456 +23650410 +2365833m +236644123 +236699 +23671066 +236776 +23678657 +2369134 +236965746 +23698741 +236999 +2369qwx +236ttzzz +237027410 +2370520 +2370522 +23709303 +2370tomi +237173 +2371891 +23741721 +237430d +23746 +23755455 +2376 +23767 +237675251 +2376mid +23773974b +237830 +237842378 +2378423784 +237891 +23793556 +238 +2381 +23812381 +238188 +238238 +23827487 +23831108 +2383277 +2384623846 +238471 +2385026403 +2385045 +238552320 +23859499 +238645 +2388042 +2388051s +23882wb +238833 +2388941 +23890131 +238973sd +239 +23905147p +239093160 +23912391 +2391416 +23916 +239200 +23931251 +2393223 +2394 +23940044 +2394620 +2395341 +2395664 +2396c43 +23982398 +2399223992 +2399772 +23COCO +23Frauke +23NEWZEALAND +23ad11 +23agosto +23apocrypha +23august +23blnklm +23c845 +23ca7e +23ceejay +23de3472 +23dfmdf +23doobie +23f0711 +23gavriel +23guitar +23hamed +23i28 +23illuminaten +23in11eu +23ingo +23inside +23ipaniw +23jacob +23jesus +23joseph +23kobbie +23leo4 +23lk67nh +23meeuwen +23morningstar +23mother23 +23nay +23philip4 +23polizei +23reverse23 +23rm23 +23room23 +23s21s4 +23sabrina +23shadowcat +23shasta +23smoking +23tera02 +23tr47 +23tyme12 +23v3n +23zachary +24 +24.09.85 +2401 +240106681 +24011983 +24011989 +24011992 +240135 +2401470731 +24015060 +2402086 +24021961 +24021978 +24021984 +240219jf +240221257 +24022402 +24025101 +240279 +240283 +240284 +240284 +24029147 +2403124031 +24031981 +24031984 +24031988 +24032004 +24032005 +2403832599 +2403875632 +240392 +24041969 +24046485 +240490 +240491 +240492 +2404bort +24051988 +24051989 +24052003 +240568 +2405859719 +240586 +24061980 +24061983 +24061988 +24062007 +24067111 +2406717 +240681 +240685 +240690yo +240692 +240693 +2406984 +2407 +24071982 +24071986a +240763 +240782 +240784 +240785117 +2407891516 +2408110904 +24081990 +24081993 +24082003 +2408585 +2408dcco +2408gina +2409 +24091982 +24091984 +24091987 +24092000 +240959 +240962 +240983 +240b042 +240if76h +2410 +2410111t +24101958 +24101983 +24101990 +241042 +241070 +241084vi +241088 +24109431 +241094jb +2411 +24111959 +24111974 +24111981 +24111985 +241179 +241184 +2411872737 +241188mb +241198by +2411ar +2411emo +2412 +24120304 +241205 +24121982 +24121983 +241236 +24125828 +241276 +24128900 +24129188 +241292 +2412ami +2412fd +2412me +24133724 +2414006 +241469 +24149870 +2415324153 +241581 +2415sq69 +241600778 +2416055 +241608 +241650 +241653 +241653789 +24169466f +24172397 +2417793 +24180945 +24181101 +2418153 +241899 +241958673 +24198824 +241999 +241harmon +241kr488 +242001651 +2420brett +24210179 +2421400 +2421418 +2422220 +2423039 +24237686 +2423854 +2424 +242424 +24242424 +24242424j +242426 +2424277 +242435924 +2424710 +2424784 +24252425 +24252818 +2426 +24262426 +242625 +24265959 +2426668 +2426727962 +24273 +24274 +24279838 +2428ly +2429 +24298GM +242Megaforce +243009 +2430674 +2430677 +243120 +24313033 +24315012 +2431dd +2431ll +24324224 +2432818 +2433219771 +24341032 +24349342 +2435368119 +243561 +243580 +243691 +24375951 +24382007 +2439 +2439117 +2439813 +243fxgc7 +24402440a +24411714 +24412441 +24430ada +244341977 +24442244 +244422448 +244435397 +2444478 +24451171 +24457519l +2445983 +244651 +2446896 +2447680123 +2447867 +2448 +24480A +24482448 +244912 +24494093 +24495712 +244z9nce +2450393 +24505356 +24510a +245120 +245132 +2451662 +245234854 +24524 +2452458806 +245432 +2455 +2455685 +2455866 +2456468416 +245666 +245694 +2456bf +2456ju +24576967 +245804 +245836 +24588211 +2458996 +2459412 +245995 +245bf5 +245pp +245qip +246015232 +2461 +24613668 +2461989 +24622462 +24623038 +2462ml +24632866 +2463938578 +24642464 +24642712 +246651 +246659829 +246789 +246800 +246801 +24680975 +246810 +24681012 +246810z +246813 +2468131310 +246813579 +2468159357 +24685855 +24686132 +24688642 +24689 +2468907185 +2468wl +2469 +246b7c37 +246josh +246yqup +24707325 +2471376 +2471968 +24733600 +24736605 +24742474 +2474774 +24754109 +247710379 +247728 +24775535 +24782636 +24784602 +2478694 +2478lv +247919 +248040448 +24817783 +24821111 +2482524 +24828591 +24828928 +2482954 +2483 +2484880d +248505 +2485397c +2485967310 +2486 +248631795 +24865 +248651508 +248655021 +2486597 +24869355 +2486warr +2487850 +24882019 +248928a +24895842 +24899 +2489dx +2489lost +24902445 +2490519889 +2491000663 +249125 +2491988 +249280356 +24929690 +24934753 +2496751386 +2497653z +2498058 +24985240 +249981534 +249b0f69 +249fisch +249lissi +24ANNA +24V2ip +24a0978b +24admin +24aeceia +24ath +24aue +24bc1467 +24black +24blackbear +24boomer +24br0nt3 +24buhlen +24ca3d +24cals24 +24cbp65 +24chuckles +24connally +24crapola +24dohc +24ef80 +24egmont +24elmaco +24f4f9 +24football +24griffith +24h0qqgu +24hannah +24ilke35 +24jasp24 +24kevin +24limpin +24lu87 +24mai81 +24mau83 +24mazing +24mikie +24quail +24root68 +24roses +24scabo24 +24shiva24 +24tippy +24vines +24vvzd8u +24xmas +24xmax +24yam24h +25 +25.5.96 +2500 +25001687 +25001986 +25003282 +2500380317 +2501101979 +25011979 +25012501 +25013255 +2501561987 +250166 +250188 +250189 +250194 +2501tricon +2502005 +25020832 +25021906 +25022502 +25025025 +250252 +250253 +250262 +250292 +250294 +2502945325 +2503 +25030451 +25031270 +25031986 +25031994 +25032006 +250376 +250390 +250398 +2503mw +250400 +25041981n +25041987 +25041992 +25042501 +250430569 +250482 +250484 +250485 +250490 +2505 +250501 +250510 +250512 +25051992q +25051997 +2505243 +250539758 +250569 +250590 +2505924145 +2506 +25061978 +25061979 +25061990 +250658 +250670 +250679 +250680zn +250687mk +250688 +250692 +250698 +250701 +250703 +25071977 +25071991 +250721 +25074903 +25075526 +25075527 +25075689 +250780 +250783mh +250790 +250795 +250797 +25081990 +25082005 +2508436 +250870 +250884 +250885 +250886 +250889 +250903 +25091609 +25091972 +25091980 +25091984 +25091989 +25091993 +250952 +25095778 +250960 +25096824 +250filao +250valis +251001 +251003 +25100412 +25101970 +25101985 +25101987 +25101989 +25101997G +251020 +2510246842 +2510346462 +25104963 +25107576 +251079 +251081 +251085 +251086 +251088 +251089 +2510941163 +25109898 +25111 +2511131 +25114119 +251183ss +251187 +251189tk +2511983 +2512 +2512.232 +25121961 +25121991 +25122512 +25123456 +2512424 +2512437149 +251252 +251254 +25127185 +25127514 +251288 +251308466 +25131178 +2513396 +25138620 +2513887q +2513frede +251400 +25140040 +25144152 +25145aroma +251477763 +251485 +25149337 +251514 +25151734 +25154744 +25161111 +25162516 +251644aa +2516581 +25174455 +2518 +251825 +251885 +2518898 +2519 +251986 +251993 +251gtho3 +252003 +2520252022 +2520425 +25209081 +252111 +2521722 +252172233 +2522120033 +2522278 +252278 +2522951 +25231062 +2523232 +2523407 +25234154 +252419158 +252434974 +252444922 +2524abcd +2525 +252500 +25251325 +2525232 +2525236 +252525 +25252525 +252530 +252627 +252634fu +2528 +2529011996 +25295 +2529ndp +252a20 +253 +2530 +2533bc +253405 +253471ma +253525 +2535544 +2536 +2536271 +2536r +253916 +25399352 +253d06 +25402540 +25404310 +2541234 +25412541 +2541887 +254252 +254254 +25432844 +25440 +2544110178 +25442236 +254426221 +254500 +2545213932 +2546 +25462546 +2546492 +2546ad +2547 +25470981 +2547a +254854 +254862dc +254917 +25492549 +254948 +2549929 +254bum +254lawton +2550 +2550532 +255060 +2551983 +2551987 +2552 +2552071677 +255246 +2552856733 +255323 +255324 +255355 +2554217 +25542554 +255740 +25574425t +255755 +25584 +25586655 +2559189 +255AA0 +2560 +2560110g +256166 +2561986 +2563298 +25633652 +256402048 +256475 +256495795 +256512 +2565benjamin +25672567 +25680001 +25683 +2568560 +25688 +256899082 +25690a +2569121212 +25692395 +2569490 +25698 +25698471 +2569eart +2569fake +256James +256mb +25703581 +2570d78 +2571fde0 +257305 +2574167489 +25742887 +25742a98 +25755922 +25756477 +25762576 +25775212 +2578 +257808 +257863 +2579 +258 +2580 +258000 +2580000 +25801986 +258025 +25802580 +25803131 +2580456 +2580768l +258090hm +2580abcd +2580tja +258105 +258123 +2581988 +258258 +258265 +25828633 +25830533 +258322153 +25834237 +25842584 +258426 +258456 +25851660 +25852 +25852585 +25858658 +25862586 +258654 +2586618 +258741 +258741hj +2587883 +258789 +258852 +25885222 +25887758 +2589159 +258963 +258964 +259 +259004 +259101 +259107al +25911020 +2591517 +2591987 +259257258 +259257965 +2593 +2593370a +2594 +25944 +25950130 +259620 +2596637 +25969060 +25981132 +2598897 +2599 +259906789 +25992099 +259988 +25Corvette +25GABRIELA +25SUZUKI +25anuf +25arcade +25arne80 +25b71ce +25beads +25boin30 +25buster +25da751d +25e890c +25emtec25 +25fender +25malley +25meagan +25nXMd +25okt04 +25oyabune +25phr7b5 +25prayer +25rgmrrv +25rwj +25s04w85 +25simona +25smart +25stanhope +25star26 +25survive +25tino87 +25toad +25trp7 +25tucker +25umr +25united +25wordpass +25zd67 +25zealand +26 +26.05.86 +260001947 +260086081 +2601 +26011959 +260130 +260147 +2601640 +2601820 +260187317 +260191 +26021995 +26022006 +260233 +260280 +260285 +260286 +260290 +26031203 +26031992 +260367 +260388 +260391 +260392 +2603dk +26041987 +26042007 +26042513 +260458 +26046969 +260505 +26051550 +26051651 +26051966 +26051988 +26053e1 +260585 +260598wy +2605alex +2606 +26061977 +26061990 +26067519 +260682 +260687 +260688 +260689 +260691 +2606taha +26071306 +26071984 +26072002 +2607373 +2607582087 +260760 +26077305a +26081961 +26081966 +26081986 +26081988 +26082608 +260869 +26088576 +260886e +260888 +260891 +260893 +260893412 +26090309 +26091983 +26091992 +26092005 +26096e +260981 +26101939 +26101985 +26101991 +26102003 +26105594 +261080 +261086 +261089 +261093 +26111979 +26111986 +26111993z +26114021 +261163 +261188 +2612147 +26121522 +2612155k +26121979 +26121986 +26121990 +26125175 +261269 +261277 +261279 +261290 +26132613 +2614026140 +261543992 +26158560 +261590 +2617705 +2617jf +261823 +261890 +26189945 +2619751 +261987 +261988 +261d4fa +26201193 +26206606 +26217 +26226632 +26233462 +26248099 +2625601478 +262580 +2625RV +26262121 +262626 +26272829 +2627852 +262864 +2628891 +26288xx +2629602n +2632108 +263230 +263251 +2633 +26330077 +26337f4c +26342634 +26345dng +263500 +263525 +2639 +263991909 +263g4b +264 +2640214021 +2640260 +264053 +2641 +2641200 +2641274 +2641997 +2642155 +2642lee +26432643 +264356 +2644 +264435 +2645126 +26452645 +26457567 +264666161 +2647beq +26483274 +2648538 +26502140 +2650649946 +2651032478 +2651317b +26514zen +2651993 +26523366 +2652482 +26527262 +2652Hush +2652vbg +2654911 +26551987 +26553315a +265603164 +26572612 +26574019 +265757 +26582658 +2658408 +26587 +26589622 +2659 +2659553 +266019100 +2661043020 +2661143 +266114923 +2662 +2662285 +2663484 +2663rj +266455008 +26658794 +2665jb +266643ja +26665mhz +26680200 +26693 +2669539 +2669692 +26696969a +266kerstin +2670020188 +26700648 +26702 +267071010 +2670Greve +2671032 +2671986 +2671988 +26721594 +26735367 +26738639 +267399 +2674 +26745143 +26753020 +26758619 +267643469 +267657 +2676ms +2677 +26775959 +267785 +26784290 +267873 +2678811 +2679492 +267988 +267f15a2 +267mdf +2680711 +2680831 +268202 +2683zolw +2684 +2684043 +26842684 +268452 +2684542 +2684791350 +26852588 +268556 +2686 +26873194 +268746666 +268791 +2688 +268809 +2688313 +268843 +26892 +268tom +2690511 +2690836 +26914635 +26919301 +269269 +2692819269 +26931466 +269422679 +269478454 +26957 +2697750 +269784a +269800388 +26981430 +2698800387 +269911 +26995369 +269iaick +26Faster +26H1w +26LUCIENNE +26a6f8 +26b4490 +26b7644 +26broughton +26bsxv6t +26c82x +26ccmeai +26czerwca +26diverge +26ecd632 +26elia26 +26ep12 +26georgi +26gremlin +26hkcc +26jenalynn +26lars85 +26michaelj +26monarque +26nadine +26pickles +26pickmere +26prong +26pumpkin +26saveme +26sonntage +26ta01 +26toupot +27.09.98 +27.12.03 +270015005 +27011988 +27015916 +270173 +270180 +27021981 +27021988 +27021990 +27021992 +27022004 +27022702 +270260382 +270270270 +270288 +2702flo +2702nb +270301 +27031978 +27031985 +27031988 +27031990 +27031991 +270372 +2703755 +270380 +270391562 +270391ab +27041965 +27041973 +27041978 +27041982 +27041988 +270437 +270487 +27048800 +270500 +27051978 +27051989 +27051992 +27051993j +27052000 +27052705 +270590 +27059029 +2705torti +27061984 +27061994 +270657 +270665ho +270684 +270691 +270692jd +2706janick +27070059 +27071980 +27071993 +27072707 +270748 +2707690 +270778 +270782 +2707dieter +2707ja +27080606 +27081978 +270819866 +27081999 +270865 +270878 +27087982 +270884 +270890 +27090000 +27091 +27091984 +27091986 +2709629 +2709668 +2709882824 +270990np +270991 +2709re +271 +27101276 +27101966 +27101972 +27101984 +27101995 +27102903 +271077w +27108610 +271089 +2710bere +271111111 +27111988 +27113113 +271160 +271170as +271174 +271176 +271187 +271188 +271191 +271192a +271202 +271215t +27121978 +27121988 +27121991 +271286 +2712avea +2713285 +271336 +2713631986 +271397 +2713abc +2713samael +271403025 +27145045 +2715354 +271557 +27162307 +271651 +271733878 +271828 +2718399 +2719327193 +271950ad +271986 +271992 +271992961 +271fa1 +271fan27 +272015 +27202720 +27208112 +272103 +272156 +2722 +2723brad +27244924 +272496700 +27271 +272722 +27272397 +272727 +272733 +2727632 +2727700 +2728 +27305683 +2730gyp +27312405 +2731985 +2731986 +2731993r +273616 +27361944 +273669584 +2736951285 +273723274 +27375898 +27379 +27392739 +273937 +27400314 +2740477 +27408480 +27415628 +2742211 +274536 +2746303 +2746622 +274676332 +274720kt +274800 +27482748 +2749827 +275058360 +275186 +2751988 +275233 +275251215 +2752939 +27538fca +27544333 +2754627546 +27549308 +275535 +2755619 +275608302 +27591235 +27607002 +27626 +2764sab +27650013 +2765912 +27671540 +27678 +276848 +2768937 +276956 +27698633 +276Blur +276bd4b8 +276bs +2773033 +277341670 +277442 +27751616 +27752775 +27755021 +277777 +2777vipere +2778394 +27789120 +277abcor +277d384r +27808 +2781251 +278395 +2785560 +278631 +27863144 +2788009974 +27882564 +27891 +278931 +27894182 +27897507 +2789sc +278b44 +278dait +278pac +27903364 +2791 +279170 +279345360 +2795002 +279571452 +279622868 +27969850 +27972797 +27980592 +279871 +2799 +279987 +279somers +27E41F +27J8m +27Kpe +27Kronau +27a8kh57 +27at07te +27atiram +27bluemarble +27bos53 +27cb6d +27ce0570 +27connor +27d636 +27derfla +27f7tg7j +27fgr5 +27frank +27gdp +27geiey +27gogeta +27griffe +27guitar +27hellrot +27hextall +27indianer +27indians +27juni +27lambert +27makaveli +27mg02 +27mmc8 +27nutmeg +27nutmeg +27oriental +27panzer +27pern0d +27popeye +27prom99 +27rhiannon +27ta858 +27westring +27woolly +27xad12 +27yz2011 +28 +280100 +280102 +28011430 +28011989 +280119995 +2801262166 +280181 +280186 +280194 +28021875 +28021947 +28021976 +28021980 +28021987 +28021988 +28021993 +28022000 +28022cb +280280 +2802832 +280288 +280291 +2802955 +28031976 +28031983 +28031987 +28031988 +28031991 +28032803 +280333 +280386ab +280387 +280389 +2803891989 +280391 +280392 +2803raisin +28041410 +28041990 +28042006 +280481t +280489 +2804a +28051206 +2805188480 +2805661561 +280570 +280580 +280582 +280586 +280587 +280588md +280591 +2806 +28061983 +28061986 +28061988 +28064212 +2806660909 +280682 +2806kcl +2807 +28071246 +28071677 +28071976 +28071982b +28071999 +28072005 +2807251913 +280750 +2807780743 +28078 +280789 +2807love +2807marcel +280804 +28081960 +28081982 +28082808 +280868* +280890 +280892 +2809 +280900 +280919781 +28091988 +28091990 +280961 +280989 +280gators +28101446 +28101942 +28101962 +28101982 +28102003 +281052 +281072 +281074 +281090 +281093 +2810933 +281100 +281101 +281102 +28111111 +28111977a +28111981 +2811672 +281176 +281179 +281182Fa +281186 +281188 +281192 +281194 +2811shnh +281204211 +28121970 +28121979 +28121981 +28121982 +28121988 +28124pf +28128900 +281382 +2813aabb +281494358 +2815897 +2816975 +281710569 +28189459 +2818javier +2819071938 +281957 +2819748 +281979 +28197f +281988 +282006 +282085911 +2821np +2822 +28222fmg +2822773394 +282320 +2825239 +2825315231 +2825779 +2826247213 +28264451 +282828 +282838 +2829277 +282930 +2830virum +28316 +2831968 +283198633 +2831df9d +283201 +2832328110 +28335681 +2833682 +2835145 +28366832 +28372837 +2837688 +28377578 +283f4484 +284064170 +284106492 +284142 +2841992 +284284284 +28429e +284346375 +2845jm +284655 +28465828 +2846992 +284746 +284751 +28487109 +28497ea0 +284999 +284ED2 +284ed2 +2851357 +2851756 +2851779 +2851fish +28538458 +285415623 +285447669 +2854520 +28547914 +28582917 +28588915 +28593382 +285e383a +2861615 +2864212 +286525000 +2867582 +287061 +2871947620 +287286 +287345 +28740029 +2874258 +28746377 +28750 +287654748 +2877burp +28783126 +2878c9 +287eu +287ez +287ezdzt +28802737 +288088180 +28821873 +2882243969 +28825269 +2883jojo +2885105 +2886363f +288682457 +28870499 +2887597 +288888 +2889sss +288b2ebf +288fd5 +288ye +289012127 +289147 +289191 +2891992 +2892fed4 +2893270 +2893566000 +2893cc +2894 +28943759 +2895279 +28973011 +289745520 +28983683 +2898815745 +289890799 +289binet +289d6cc8 +289tor +289tron +28LADYBUG +28and26 +28auspex +28ceo6 +28cervix +28church +28d06a +28freire +28gXq +28grytor +28hydrogen +28iwona +28junket +28jy229 +28k12f66 +28kahn +28kittie +28lor04p +28lucygrace +28maggio +28maja +28moped +28nov83 +28nuni02 +28ouks +28rocket +28santiago +28tipper +28uhu68 +28vx13sa +28william +28xc6r8 +29000162 +2901 +290104 +29011982 +29011988 +2901199 +290190cs +2901992 +2901km +29020400 +290292 +2903 +29031983 +29031984 +2903198406 +29031988 +29031994 +29031997 +29032527 +290366 +290387 +29041971 +29041987 +29041989 +29041993 +2904199410 +29042218 +290486 +290489 +29051453 +290514536 +290559 +290583 +290587 +290594 +29060115 +290604 +29061705 +29061988 +29061990 +290672 +290684 +290687 +290694 +29070400 +29071976 +29071985 +29071989 +29071999 +290784 +290789 +2907lasher +2907tom +29081984 +29082003 +290886 +29088600 +2909 +29090 +29091962 +29091974 +29091988 +290966 +290980 +290987 +2909880329 +2909us01 +290c966c +29101970 +29101984 +29102524 +291052 +291069 +291085g +291087 +291088 +291089 +29111989 +291132314 +29115429 +291164 +291181 +291187 +2912 +29121974 +29121986 +29121992 +29122716 +29123098 +291234a +291234ax +291286 +2912892975 +291293 +2912fabian +291300473 +291301 +2913163 +29132913 +291352 +2914572 +2915763 +2916755 +291700 +2917410150 +2917asdf +2918 +291921 +291962 +291992 +291um +2920305 +2920924 +29213110 +292148 +292189134 +292195 +2922352737 +2923647 +2923a1d0 +292446 +29246844 +2925082 +29257 +2925923 +292667 +2927falko +2929 +292929 +29295786 +292bogdan +292cbb0f +29313575n +2931983 +2931987 +2931990a +2931a521 +2934xow +29352935 +29355160 +2935home +2939 +293d293d +293steps +29403015 +2943953 +29479950 +294807523 +2949369 +29504 +2951269 +2951359 +2951994 +29520142 +295229 +295295295 +29562956 +2957870@ +295829301 +295874125 +295910508 +295liu +29604911 +2960aa +29614016 +2962101 +2962279 +296242457 +296254 +29625509 +29644383 +2965052179 +296581320 +296728 +29681666 +29685 +296905 +296978 +2969837 +296d952b +2971 +29714 +29722487 +2973449 +2973629736 +29737332 +297404609 +2974487448 +29751181 +29751730 +2975597 +29765692 +2976889e +29783801 +2978549 +298021aA +298051 +298104036 +2981219296 +2982455 +29841957 +2984371 +2984486 +29858820 +29872987x +2989796 +298maz +2990 +299013821 +299034 +2991nalyd +299202 +29922992 +299299 +2994470811 +2995436 +2997031420 +299792458 +2997headed +299891 +29989586 +29997890 +299997 +29Maurice +29NQG +29ak29ak +29alma89 +29bindy +29catelli +29ccxv5g +29couch +29croms +29defender +29een +29frosty +29grandsons +29hailey +29kc59 +29kmz13 +29letsgo +29march1974 +29mi10 +29muffin +29november29 +29pitcher +29pookie +29radomir +29raufar +29raymond +29s53w +29seich +29simon29 +29sjdgb +29spartan +29tavo +29tonka +29vadivelu +29weidi +2AWyxc +2CA016 +2CH4 +2CWZRF +2GZPEMU +2GztYe +2Hch4 +2HuQ13 +2I3auch121 +2KTPJG +2Kool +2Krikkit +2Kt42Z +2M&7DAC +2Maximilian! +2Ohren +2Symbiose +2Unlimited +2Vixen22 +2W3E4R5T +2Waldo2 +2a1240eb +2a1b3c +2a218f05 +2a688cb +2a718666 +2a768e +2a77Xg +2a9iz +2a9sm067 +2aaccess +2aadmin +2aangel1 +2abcd345 +2ac87d +2acrisis +2advance +2aeioj2 +2agensis +2agudglu +2ahobbes +2aixxjxu +2aj99ukz +2aktv4d +2alexandra2 +2alice8 +2alostboy +2alxljdu +2alxojdu +2am3ber3 +2amatilda +2amcdowell +2antidos +2antwon2 +2anything2 +2aoigoxi +2aopopop +2appelsiner +2aqtdoho +2arxliox +2as601m +2ashoes +2astatus +2asweety +2atnq +2atrouble +2ava3en +2awdx3 +2axiooll +2b +2b0ded +2b0t0t +2b14958b +2b233035 +2b23c146 +2b2cfa31ae +2b307bdd +2b34de6g +2b359a53 +2b3eb890 +2b54b9e +2b687c10 +2b6kc52a +2bac1986 +2bad2bad +2bagger +2balder22 +2ballz +2banana3 +2bbucket +2bcc61 +2bcu3 +2bdc97a7 +2bdd83e +2bdecember +2beijos +2bennick +2beril2 +2bi5z +2big4you +2birube +2bitcolor +2bjr8 +2bleval +2boards +2bok472 +2bon2b +2brn2b +2bsanya +2byg3byg +2c0v0c1 +2c56cb +2c8nu +2cFruit +2ca091f +2caki +2caramelo +2cb1a9 +2cbg3p +2cc4c5 +2ccc55 +2cconan +2cdbe82c +2cenitan +2cf33951 +2cfuckhead +2chaddad +2cjetski +2cmeatball +2cmslq9 +2cninja +2coinno +2cool4u +2corazones +2courgettes +2cpancreas +2cpearl +2crddraw +2cseptembr +2cshop +2ctol +2cvdolly +2cxg2 +2czipper +2d0e1c9k +2d2f8b4 +2d394d2 +2d65ba68 +2d89e2 +2d9a74 +2d9te +2dCourtney +2dRanger +2dabbies +2dachfenster +2dadawn +2daidurl +2dantasha +2dar2 +2dbarker +2dbc4 +2dbeata +2dbf63 +2dd8cc6 +2ddeath +2ddropleaf +2dennne +2deulced +2df6hju8 +2dfe0 +2dgrolsch +2dgujlou +2diamond +2didier3 +2diiduli +2diiluli +2djohannes +2dkc18qo +2dkd5hsz +2dliduri +2dmcphisto +2dnrwncj +2doxuiix +2drenate +2drxrlox +2dtrixie +2dxg4m2c +2dzaku2 +2e0v1a5 +2e3df965 +2e3fd8 +2e3wscdx +2e75a3ea +2e856270 +2e9172ad +2e9d137 +2eMolly +2eSummer +2easy4u +2ecameron +2edd811 +2edonkey +2ee056 +2ee52d2 +2ee68f +2eendjes +2efatboy +2elacky +2emepass +2erocky +2esecurity +2eshannon +2estupid1 +2etopper +2evh4 +2exrm +2f3446dd +2f40fjz +2f46kshh +2f59800e +2f773987 +2f86a07c +2f8sv +2fachberater +2fadrian +2fast4u +2fast4us +2fbunnyhop +2fcooper +2fe0a020 +2ffreebsd +2ffroggy +2ffungus +2fh90cah +2fhk +2fkendra +2fkirby +2fknight +2foln2sb +2fpickle +2fpolley +2fpuppett +2freibier +2freptile +2frishi +2fromeu +2fshimano +2fsignals +2fsquamish +2fst2slw +2ftriumph +2g2kgnmw +2gaildrl +2gdajdj +2gdijdxl +2gdiuaxl +2gdiudxl +2gdujriu +2ggidadl +2ggioddl +2ggo0 +2gjiidjl +2gl6kdoq +2gorka2 +2grpepel +2guildji +2gvuy4 +2gxijall +2h20ski +2h5sqrks +2hangch1 +2hannu1 +2hantel2 +2hel13 +2hgjrpfa +2hkdo +2hl3r8 +2hnir +2hostas +2hot4u +2hot4you +2hundert +2hwrfw +2hxeza +2hzy7 +2i5Rck +2iEtfT +2ia58 +2iaixlol +2iapvr +2idedap3 +2igiilal +2igijlal +2iguldiu +2iimkcrf +2ijillgl +2ijioiui +2ijurdou +2imkp +2immortalis +2imzcak +2inches +2ioijiui +2ioillui +2ioim +2iridiai +2iririai +2isgood# +2isuoa2s +2ixiiiil +2j3atQk195 +2j553 +2j7n3cga +2jbowqha +2jdirgxl +2jftr +2jfxx +2jgujxou +2jjijjjl +2jjixjjl +2jjuruuu +2jlijjri +2jlxoxgu +2joidgxi +2joxoxix +2jriojdi +2ju2608 +2jup1ter +2jwlri7w +2jznsvfi +2k0i0t4 +2k338733 +2kaleidoskop +2katrin3 +2kaugummi +2kawk9xv +2kdu6 +2keller3 +2kewl4u +2kfa9fx +2kidzz +2kjeuxko +2kmt5s2 +2koeien +2kolec +2kouz2 +2kp2c1zw +2ktb5ms8 +2kzinf +2l33t4u +2lQos +2laujgar +2ldirrul +2lftf33t +2lgiural +2lguggiu +2ligzext +2ljuggou +2lkopp +2llafthgin +2llijooi +2llijroi +2llilooi +2lol2lol +2london4 +2lori +2love2 +2loveis1 +2lpc9ppu +2lrxdjix +2lspm +2lubila4 +2luno14 +2lussis +2lxwy +2lxxdjux +2m84c +2mSEXm +2madison2 +2markus +2mda +2mehans1 +2mermaids +2met63 +2middagh +2mj6po +2mmolto +2moggie +2mpqxvg +2much4u +2myself +2mysza2 +2n2kas +2n2vbvmr +2nddemon +2nelly +2neptune2 +2newtime +2nf304gm +2ngoisao +2nhcm +2njd30mx +2nurtur3 +2o2o9868 +2o464 +2o8y7v7w +2oaiauol +2oaiouol +2ogiaual +2ogilual +2ogioual +2oixxixu +2old4u2 +2ooiruui +2oojv +2opower +2oscar2 +2ot4l +2ourdadd +2oxilxil +2p3bhc +2p3bw +2p4c +2p651 +2p6iyv3y +2p98j4 +2pac4eva +2pactobi +2pek62mv +2pkeg +2pli4 +2poles6 +2pp1yn0w +2precious +2prmy +2q01yi6t +2q2q2q +2q603 +2qbzu1 +2qe0s2tg +2qfa8 +2qg5sa3w +2qmj1cjz +2qsl2 +2quille8 +2quxn +2raiuaol +2raj6sxb +2rands# +2ratio +2rc3bvsa +2redstar +2rg79x8 +2rgigaal +2rgiuaal +2rjuorru +2rliodoi +2rsbk +2rto73 +2rude2 +2ruxxrrx +2s57rkzw +2sacciu +2sc2314 +2scirocco +2screed3 +2se3tile +2secure +2sepult +2sgp6 +2shedz +2skol123 +2skol177 +2slw4 +2snm0j6p +2somer +2sp3ider +2spooky +2srE +2stampador +2stargate +2stefan9 +2suyy +2sweet +2syndicate +2t1i0a9 +2t3f5b6b +2tappal2 +2tausend7 +2tayas +2tcjf +2themax +2thrashed +2tmcinky +2to1odds +2tobias34 +2toby +2tomlinson1 +2tr1agan +2tsworgc +2tvgr2 +2twomile +2txnbhbv +2ty4f27 +2u25z9cv +2ubqu +2uhg +2ujhy2h5 +2ulilgoi +2uoiijui +2uridgai +2uriugai +2us7w +2ut33huk +2uuirggy +2uuxlarx +2uuxlrrx +2uxiggil +2uxospaq +2v8diq +2v9bfe +2vertretung3 +2vif7689 +2vnt2 +2w0i0n3 +2w1l6g0c +2w4c27 +2w4y8yvy +2w636 +2w7e3b5 +2w8q670b +2wah95zb +2wally56 +2wd0kn +2wd0knb4 +2wg1rx8x +2wire +2witches +2wre2 +2wsx9ijn +2wsxdr5 +2wzdh +2x3com18 +2x3ri +2x558bge +2xaialrl +2xbgb +2xcn7 +2xdc365 +2xdlares +2xet6 +2xfufx64 +2xiilili +2xilrriq +2xjxm +2xlxdadu +2xoya5 +2xplod +2xriaidg +2xriaidi +2xrijidi +2xrilidi +2xrxa +2xxirill +2xxuraxr +2yizl +2ymg8 +2ymhqjrd +2yozw +2ypxv9jx +2ysqx +2ytyk7uj +2yvael3h +2zczq +2zigi56y +2zkvl +2zlm5wfe +2zpj2 +2zweifach +2zxqh8tt +3 +3.141592 +3.2.1986 +30.06.06 +30.08.1962 +30003000 +3000880 +3000hels +3000wesc +3000win +3000zz +300101 +300112345 +30011936 +30011953 +30011989 +300122 +30012345 +300175 +3001826251 +300188 +300193 +300194 +3001ama +300208sg +30023002 +300257474 +3003 +300300 +300302 +30031985 +30031992 +30032002 +30035329 +30038201 +300382018 +300392 +300393 +3003dehaan +30041906 +30041945 +30041978 +30041982 +30041987 +30044ga +30046573 +300478 +300485 +300490 +30051982 +30051987 +300578 +30057899 +300584 +300585 +300585nb +300589 +300591 +300592 +300593 +30059363 +3005985 +300602 +30061991 +300677 +300680m +300699 +3007 +30071507 +30071980 +30071984 +300793 +3007shirin +300805s +30081205 +30081967 +30081982 +30081983 +300838 +300882 +300883z +300890 +30091940 +30091981 +3009737 +3009770 +300978om +300982 +300991 +300993 +30099994 +300plus +300tdt06 +300zx +3010 +301004 +3010121 +301015bl +30101966 +30101992 +30102002 +301022os +301051 +30107300 +301084 +3011 +301107616 +30110904 +30111988 +30111989 +301140 +301191 +301197pp +3011988 +3011mer +30121947 +301248 +301273 +301276 +30127980 +301286 +3012wnx +3013194 +301438 +30156012 +3016455 +301680 +3018.. +301801096 +301858924 +30186 +3018889 +3019 +301960 +301986 +3019932697 +302010 +3020344 +3020Bern +3021277 +302136l +30221542 +302235 +302280144 +302289335 +302302 +302318a +302390888 +302443338 +3024831 +3026998 +30272805 +302786892 +302806211 +302840 +3028577 +3029 +302946371 +302980508 +302984539 +302c60 +302caren +302fb2 +3030 +30308585 +3030leavers +303180459 +30321670 +30328926 +303325000 +3033ts +3036 +3036852 +303704 +303837869 +303conga +30400396 +30400553 +304009df +304049 +30405060 +304050a3 +3041988 +30422 +30423042 +3044051841 +30449269 +3045218 +304554a +30465 +304797088 +304871 +304950 +30495649 +304983 +304Nicolas +30500211 +30500251 +3050210103 +3050joe +305117012 +305121 +3051989 +3051991 +3052023 +305233215 +305243776 +30527672n +305312387 +305420325 +305455206 +3054us +30553055 +3055901068 +305591208 +30563056 +305722183 +305757mi +30596 +305d0a +3060 +3060140 +306066 +306088 +306090120 +3061284 +3061400 +3061827 +306299217 +30636817 +3064066816 +3065678 +3065973 +306788963 +306792 +30685511 +3068698 +3069349 +30699099 +306cd740 +306nsfj1 +306ya +307070 +307094294 +30721641 +30727539 +307605 +3076AL +30776 +307788824 +3077sd5e +3078398 +307840323 +307875 +307b37b2 +3081015 +30814771 +30816031 +308160316 +30817269y +3081rosi +3082060 +308301571 +308452431 +3086 +3086318 +30869282 +308726100 +3087403 +308889755 +3089475 +308963669 +3090164009 +3090564 +3091992 +309225548 +30923151 +3093232 +309375 +30937992 +3094002058 +309496131 +3095508n +3095882 +30963696 +309710 +309712602 +30Braemore +30Ictoria +30a11m +30anais +30around +30ashtanga +30athena +30c01c91 +30c5e4 +30cemal8 +30cheeter +30dkp11 +30itsme +30josie +30kjh +30lorelle +30marzec +30mei98 +30no8ght +30ryan +30sd585 +30sept87 +30testtest +30uvy +30zone +31 +31.12.1990 +3100 +3100ct +31011966 +310153 +310167 +310189 +310191 +3101989 +3101flo +31022884 +310283 +3103 +310300 +3103149820 +31031947 +31031986 +31031991 +31032004 +31032007 +31033792 +3103576 +310374 +310375 +310386 +31039200 +31041921 +3105 +310512 +31051990 +31056427 +310571 +310606165 +31061048 +3106156 +3106789456 +31071986 +31072007 +3107268 +31073107 +310776 +310787 +310788 +310789kK +310797 +3108 +31081981 +31081982 +31081988 +310867 +310882dr +310888 +3108agv +3108seb +3109150791 +310George +310pwa +311 +31100511 +311009 +3110121 +3110122 +31101453p +31101598 +31101982 +31102004m +311069 +311078 +311081 +311095 +3110okt +3111 +3111988 +31121937 +31121968 +31121978 +31121987 +31121988 +31121991 +31123456 +311261 +311264 +3112820 +311287 +311290 +311291462 +311311dg +311312 +311330 +3113326 +31136226 +3113711 +3113718 +3113841234 +311384234 +311388 +3114 +311407kb +31154501 +31158363 +3116141413 +311694 +3117698 +31178950 +3117906256 +3118650 +3118car +311941 +311967 +3119d0 +311judith +31200 +3120490 +31207652 +31208340 +3120mesa +3121 +3121291 +3121384 +3121988 +312211 +3122156 +3122213132 +31223122 +3123180 +312326 +31233123 +312334456 +3123464 +312388420 +3123oitg +3124086 +31243124 +31247312 +3124848 +31250794 +31250815 +3125246 +3126asd +3127068 +312803882 +31283128 +3128411 +31288 +31288156 +3130 +313103 +31312580 +313126219 +313131 +3131341 +31315050 +31316262 +3131701 +3132130126 +313220 +3132333435 +3132448 +3132737 +313313 +31334188 +3133676 +31337 +313373 +3133731337 +31337563 +3133duken +3133fde5 +313449100 +313512 +3135201 +313719 +313737 +31385 +313arpad +313fba9e +313ke5t +314037 +3140956 +3141249 +31415 +31415 +314159 +3141592 +31415926 +314159265 +3141592654 +31415926a+ +314285714 +3142916291 +314314 +314330255 +31435009 +3143594 +314373283 +3143fish +31465210 +314655785 +31475874 +3148trebor +3149220 +3149605 +31498680 +314Emily +314d156 +314r9 +314rfg +3150633 +3151515 +3151992 +3152 +31521603 +3152290 +315269 +3152miner +31535087 +3155530a +31558735 +315603 +315731 +315977 +315977 +3159887 +315hxc +315tanny +315w101 +3160 +31600165 +316014 +316048418 +316056 +3161vo +31621905 +31623162 +316293 +3162993497 +3162yngwie +3163643718 +3163zm78 +3164 +3165266 +31656542 +316759552 +316919927 +3169353 +3169aragon +3170dani +3171 +3171973 +317302248 +317366656 +3173ers +317465868 +317569011 +3175n +31772abc +3177692954 +3179413 +317null +3180154 +3180mod +3181231812 +3181987 +3181994 +31824ul +3182507 +318308954 +318318 +3183boe +318585 +3186 +31867420 +318752 +318970 +3189923 +318seek +31904337 +319085 +3190perm +3191092 +3192 +3192888 +319494 +3195793 +3197746 +319821982 +31983198 +3199 +31AB73 +31REGAL +31aly +31b5a30 +31benjiman +31cc3c +31chester +31egj3j +31htll +31jui82 +31mart01 +31moneys +31obfcez +31password +31queenb +31qw31qw +31rainbow +31reiling +31sharyn +31sophear +31sp05 +31tadano +31tati +31vinaug +32 +3200 +320050005 +3201 +320257 +320320 +32040459 +3204326 +320447238 +320455405 +3205650 +32060573 +32061868 +320623123 +320652jy +3207 +3207044 +3207a +320842650 +3208482 +320884 +3209027536 +32092235 +32096001 +320982159 +320e9e +320n320n +321 +32101268 +3210chs +32111298 +321123r +321239 +321242877 +3212522 +321321 +321321321 +3213215 +321321a +3214 +321456 +321475642 +32151790 +3215732 +3215962 +3216 +32162998 +32164np7 +321654 +321654789 +321654987 +32167 +32167b87 +3217815 +321789654 +3218071437 +3219300 +3219510296 +3219mi +321Darda +321Harley +321boom +321drin +321dsa123 +321ewq +321fisk +321gugliotta +321j964s +321kerry +321np +321qaz +321qq +321reda +321samba +321samit +321sexlr +321shank +3220535205 +3221 +32210967 +322145702 +3221991 +3221ctn +3221foro +32223322 +322322 +3223519 +3224 +322451 +322468 +3224781 +322507 +3225453a +3225569 +32264944 +3226666 +322697 +32272628 +3227640 +32282818 +32283228 +322876 +3228826540 +323128 +323148 +323194861 +3231991 +3231c +3232213 +323232 +323236 +323259849 +3232696 +32328975 +323293 +3233034 +3233210535 +323323 +32343234 +3235557429 +3236 +3236932369 +323810 +3238357 +323PKO +324000 +324021201 +3242341 +32423rw +324244244 +3242803 +3243434 +32439206 +3244113 +3244666 +324523666 +3246367 +32475 +324762293 +32482 +3248837 +32497505 +3251 +32510000 +3251674 +325325 +32532800 +32536037 +3253667 +32541 +3255 +3255087 +32553255 +325614789 +32562145c +3256787p +3256793 +325694790 +325896 +3259877 +32598776 +325bmw +326004qq +32604055 +32611046 +32611823 +326156 +326159487 +326185e +326224 +32622e57 +3262497 +3262979210 +3263099 +32631844 +326598741 +32663266 +3266760 +326686 +32670141 +3267481 +326950 +326990e5 +326G9V +3270182b +32702370 +327040 +32705260l +327073 +327101973 +32711189 +3271399 +32717 +327242 +327489549 +3275040 +3275xx +3276 +32768 +327795885 +327843845 +327853 +32786 +3278afaf +32792634 +327shiri +327sssss +32803763 +328346169 +32838690 +32840816 +32844884 +32847395 +32850156 +328508322 +32861494 +32861900 +328657 +3287314 +328dp04i +328lh +329066105 +32922464 +3292jt +3293622 +3293910 +32949208 +32955d1 +329586r +3298201588 +32993299 +329HGAG +329dba +32CALLUM +32aeef07 +32bossman +32candles1 +32ecfd +32fuckin1 +32gibber +32hfg53 +32hooter +32mOzKu +32maxi60 +32monday +32polony +32q2h93r +32qaswe +32santana1 +32secure +32smtk6b +32tasman +32tasos1 +32xm56ee +32xplode +32zbyszek +33 +33 +330071 +330101 +330107 +33018311 +3302030038 +33033303 +33036754 +3304588 +33048432 +330545760 +330584 +33070942 +33089316 +3309283 +3309jk +330snow +331 +3310 +33104458 +33113311 +33117458 +3311801 +3312423966 +3312455 +3313040627 +3313154d +331488 +33153315 +33165755 +3318083 +33181833 +33184fa +331865 +3318eea +3319399 +33194 +33195374 +3319865 +3319zs37 +331voc +332040944 +33215433 +3322063 +332211 +33221166 +332241 +3322602 +332266 +33231235 +332332332 +3324021981 +33258550 +3326203 +332641973 +33264580 +33268319 +3327033 +3328262 +332892780 +3329254 +333 +33312536 +3331789 +333231 +333231q +333233 +3332473j +333250 +33333 +333333 +3333333 +33333333 +333358067 +3333785 +333457 +333479129 +333536 +333555 +333555b +333665 +333777 +3338841 +333925 +33399 +333992361 +333bb1a5 +333cato +333px8 +333xcb06 +3340628 +334177 +33421330 +3343mh +33440841 +33443344 +33445567 +3344vids +3345220 +33456789 +3345med +3346 +334620 +3346215 +3347azx +3348898 +3349028 +33496766 +334a8shj +334na3ff +335002525 +33506534 +335335 +335338070 +33538683 +33539851 +3353996 +3354 +3354633 +33553967 +33554214 +3355533 +33557799 +3355800 +3355xx +33562 +33563018s +33564230a +335644 +3357082q +33573357 +3358334 +33589399 +33593359 +33597031 +3360029 +336079 +3361064333 +33617000 +3363405 +336433 +33644 +33649 +3364965229 +3365 +33663366 +336699 +336719 +336783 +3367jh +3368 +3368789 +336mario +336vrv +337214 +3372285900 +33722c +33723372 +3372576 +33737mb +337381955 +3375099 +3375877 +3376dawg +33773377 +3378902 +338006280 +3380863 +3381513313 +33822525 +33825181 +338264 +338551686 +3385900972 +338640809 +338800 +3388pipi +3389923 +33908340 +33912 +33923392 +33935 +3393zx +339491 +33956603 +339855 +339918112 +33ROBERT +33a84c +33abd99 +33ars +33athlete +33ben33 +33bigtree +33blackhorse +33btf +33choota +33cucian +33dv741 +33ec217 +33f04c0a +33f9d16 +33foodtown +33grunta +33jen33 +33joie99 +33lady33 +33laugh +33lauren +33lrt77 +33marti +33maxwell +33meimei +33mer33 +33mp68 +33murelli +33neb33 +33nyo +33pc5e +33poj8tr +33qby5 +33rochu +33roxan22 +33saudade33 +33shanti +33tamanna +33tassie +33terra22 +33tewkes +33tigger +33twister +33wc5b6m +33wilderness +34 +34000bba +340216 +3402river +34033403 +3403501543 +340436524 +340441886 +340500 +34063005 +3407123 +34085881 +3408725227 +340890 +3409299538 +3410 +341043215 +3411 +341163 +3411mad +3412 +341275sq +341341 +341374 +341460642 +34151736 +341525 +3416226143 +34175867 +3418 +34180000 +3418343518 +341835687 +341986bw +342000 +342012 +342156 +3421f1 +342212 +342345564 +342423423 +34243 +342481011 +3424pw +342521 +342622683 +3427208 +342828 +342837 +34284468 +3430262 +34304793 +3430676 +34315492 +343231 +34333321 +343386955 +3434 +34340074 +34340551 +343434 +34343434 +3434343434 +3436 +3436159 +343833691832 +3438818 +343928 +343930 +3439589 +3439911995 +3439rjr +3441 +344111 +3441138 +344267636 +34427051 +3442752 +34446 +3445 +3445crma +3446veuc +344746 +34488784 +344grand +34507 +34511300 +34523452 +345237369 +34523kes +34525824 +3453177 +34533417 +345345 +345471243 +3454825 +34556182 +34562 +34567812 +3456789 +3456cjm +3456wert +34575245 +345816 +3458510820 +34587157 +3458847 +3459ch +345DBT678 +345dvp +345tttyu +345yr4df3v +346 +3460306 +346034 +346125 +3462 +34620 +346435 +3464405 +34649294 +34662784 +34672462 +3467725 +34679 +34707 +3471516 +3471bb +3472140 +3472496 +3472954815 +3472lise +347332 +347437 +34748293 +34762130 +3476664208 +3477167 +3477661 +3477bubba +3477eries +347815476 +34781984 +34788054 +3478fn3f +3479 +347923311 +347935 +34793544 +3479472 +3480z05 +3481127 +34812132 +3484 +3484237d +3485 +3485846 +3486099 +34873487 +348754358 +3487836 +348794 +3488914 +34893489 +3489554 +348feus +349108 +3491587 +3493105 +349349 +3493688 +349411666 +349423 +3496252942 +34976ass +3498451 +3499507a +349shiva +349xi +34A9T +34TDMw +34a2a1 +34a2bc +34b33087 +34be27a +34d5c9b +34drum +34dskk +34dupablada56 +34dz5 +34global +34golfer +34gsoa53 +34h2npdl +34hokeya +34isabel +34jf383 +34kap09 +34loveday +34mariam +34olol +34racecar +34rally5 +34santos43 +34serafim +34tarawera +34tohana +34uadmin +34um0887 +34up0352 +34vc554 +34war4 +34writer +35002307 +35003 +350151522 +3502010 +350350125 +35037mr +3504535 +350469 +35053505 +35056032 +35067433 +350700 +3507768 +350chev +350jps +3510max0 +3512350456 +35123512 +35124900 +3513152 +351387 +3514220 +35143980 +3514954 +35150 +351539191 +3515417 +3515la +351624 +351666 +351706 +35171868 +3517278 +35191721 +35193519 +3519761227 +351megan +35206160 +3520the +352100 +352109 +35215914 +3521647 +352186st +3525688 +352577 +3525th +352650 +352700 +3527045 +352912d9 +3529267789 +3529359$ +352baja +352john2 +3530337256 +353068ru +35312850 +35320116 +353214 +3532424 +3532562 +3532604 +353356 +35335866 +35353305 +353535 +353543 +353562 +353643 +353685126 +3537terra +3538854 +35395127 +35398899 +353b00k2 +354 +35406955 +354139 +354188417 +3542199 +3542718 +3543220035 +354328558 +3543525 +354354 +35435445 +354452138 +3545 +35461564 +354730 +35478961 +354806954 +354878 +3549f3 +354mp2 +35503550 +355049862 +355114982 +3551606 +3552481 +35530 +355355 +3554066 +3555459 +355553 +35556165 +35562881 +3558 +35584115 +3559847 +3560106 +3561670583 +3562735627 +356319999 +356376 +356450 +35649574 +35660 +35675585 +3567889563 +3568404 +3568615 +356b93 +356dedad +3570198215 +35703570 +3571035710 +357159 +3571590 +3571610 +357258a +3572tp +357357 +357357357 +357424 +35743574 +357592 +3576541590 +3576831821 +357753 +3577664 +357852mj +3578672 +35789512 +357900 +357951 +357951KS +3579tina +35800850 +3580788703 +35823582 +35824765 +358256878 +3583237671 +358328569 +358358358 +35847 +3586123 +35883588 +35883933 +358b10 +359.779 +359095 +3594153301 +35941943 +3595130 +35968 +359700 +359751 +359bbd0 +359wjl +35ZuPQ +35anyatten +35be911d +35bf58 +35camwood +35eloqui +35f68021 +35faerie +35iforgot +35jacinth +35katana +35michel +35mouses +35oneworld +35ozq +35retok +35rk47ov +35sacredheart +35sarnia +35steel +35street +35surfer +35tnvqi8 +35tomcat +35trousers +35woodturners +35x1aw07 +35yv7kmj +36000075 +36006411 +36010523k +360117 +3601610516 +360224370 +3603g +3604119 +360477914 +3605yw +360afx +360gux +360icx +360xbox +36111187 +361166 +3612502 +3612mk +36131656 +361361 +36145aroma +361461437 +361490 +3614dx +3614he +36152484 +3615ac +3616f6c9 +3617317361 +3617336564 +3617948 +3618410 +36191127m +361992 +361b0389 +361effd +3620050036 +362043 +3620563 +3620670a +3621 +362101284 +362133893 +36231 +362324 +362389 +36243129 +3624522 +362463839 +36250228 +362514 +3625236 +3626159487 +362634 +3628733 +36288519 +36303630 +3631580 +36323632 +3632vida +3634317260 +3634wlm +3635 +363549 +363636 +3636477 +3636580 +36366109 +363663 +36373216 +36387300 +363blue +364200 +36425633 +36428 +3642gkc +36433643 +364371 +3644 +36451782 +3645314 +3647 +3647445 +36481 +36486479 +3650035 +365078SD +3651 +3651039 +36512900 +3652627 +365431 +365472578 +36570676 +3658947547 +365f14b6 +365kaixin +365o6 +36605456 +3662 +36624 +36624325 +3663266 +3664324606 +3664645 +366475 +3665456 +36662 +3667628 +3668211 +3668794 +366efd53 +366jkt +3671065 +3672181 +367277 +36729 +36733673 +3675206S +367556475 +36770 +3677589 +3678436784 +367880306 +3680488 +368105 +3681241 +3682071 +3687447 +3688692 +36896603 +3689666 +368980 +3689lykke +368wjuni +369 +3691058 +3691215 +369123 +369141 +3691470 +369147258 +3691qjt +3692266 +369258 +3692581470 +369348 +369369 +36946250 +36951475 +3696221 +369630dw +369656 +369715619 +36982599 +369852 +36985200 +369852147 +36987 +3698741 +369874125 +3699 +369cheanna +36Barney +36Chickens +36c2p +36c757 +36christ +36coconut36 +36crusader +36d8a6 +36edf6 +36ernst +36geheim +36hee98n +36iasnob +36k31 +36kp75 +36l8725 +36lopetz +36neon36 +36p713 +36platz +36qku28 +36sweetie +36tania +36timberwolf +36wl3ykd +36ydennek63 +36zcm +37 +370037 +37014348 +37019858 +370204630 +370288 +370388 +370410 +37063969 +3706tain +37075ab +370761 +370ju +370muli +371083115 +371092930 +37113711 +37120581 +3713088y +371425 +37144173 +3714790 +37165745 +3717081984 +37183718 +37190537 +3719258460 +371973 +371T3P1 +3721264 +37218864 +372196818 +3721b945 +3722765197 +37231625 +37245 +372502 +3725944 +37265144 +372816 +3728195 +3729466466 +373 +373093067 +3734636159 +37373737 +3738979 +3739 +3739534 +373984218 +3740Was +374100 +374128aa +374362 +3744ff +3744snafu +37458404 +3745hand +374685 +3750931 +3752152 +3752199 +37525035 +37526 +3753772516 +3755169 +3755286026 +375624 +37562e3 +375744151 +3758000 +37586411 +3759409635 +3761415 +3761964 +3764094 +3764578 +3764597 +37667474 +3766ce +3767 +376756 +3767975 +37685B +37694125 +376medya +3770 +3770182 +37713771 +3771808 +3772510820 +3773 +377377 +37739986 +3774 +3774b657 +3777 +377712 +377758521 +377b524a +378472 +3785848 +3785jnf +37873787 +3787423 +378992 +378999 +378franz +37901056 +3790742 +379095 +379137 +37919337 +3793537935 +37935616 +37951784 +379546 +379575339 +37978998 +37981634 +3799 +3799ks +37Az4G +37CHEWY +37Octron +37a45bcd +37days +37dean +37deers +37duchesne +37ee181 +37ex21pi +37geebung +37grace +37jimbeam +37k51 +37lb925 +37portroyal +37rm67 +37souter +37tiktak +37ugb +37wallace +3800500 +3800507 +380084627 +3801gorm +3802 +3802180 +3805792 +38061 +38070326 +380907648 +380az +3810231116 +381029 +38104508 +381108 +3811498 +381173 +3811750 +38123456 +3813de +3814688853 +3815774 +3816black +3818263 +3818779 +38192297 +381a22a1 +38212 +382152075 +3822404901 +3822594 +382452135 +382471 +382563 +38258 +3825fuck +3825sweet +382603007 +38267871 +3827311 +38281993 +38282830 +382874169 +3828yakumo +38312005 +3831338 +38313831 +3831927 +38325027 +3833duff +38341298 +383433359 +3834benjamin +38352966 +383696 +383715 +38373837r +383764 +3837max +3838 +38383838 +383940 +383d12c9 +383valis +38401274 +3840850 +384328da +384384 +38440389 +3846063 +3847215 +384765 +38478 +384805013 +384840 +3848walmart +384d5 +384swee +385 +38510060 +38510325 +3852421 +3854357 +3854613A +3854785 +385502si +385555 +38563856 +3856910 +38580 +3858eli +385bb5 +38602512 +386221965 +38632895 +38640095 +3864djm +3867 +38692 +386j1s4f +3871349 +3873chaldean +387412 +38746917 +3876 +3878035 +387ac5df +3880111278 +388229 +3883 +3884055 +388446 +38851644 +388585885 +388606448 +388688 +38875422B +38877013 +38893889 +3889609 +388tor +389000 +38904258 +389138 +38914031 +38919090 +3892298 +3892366 +389277 +389489 +38954736 +38960303 +3896868 +3897996039 +389a789 +38BE6 +38GLOBAL +38a166a +38b100 +38b892d2 +38bertha +38bunny +38bxj +38cbdmax +38ea82 +38f74gy1 +38fbo +38flingy +38jillian +38kankudai +38n3iol5 +38numeric +38orange +38pnt73g +38sefwah +38snowball +38stoner +38tjt123 +38ylj +39004328 +390331q +3904rene +390616 +390734 +39074227 +3907541 +39093 +391047 +3911569 +3911639216 +391345 +39166696 +3916bbb +3916terra +391761603 +3917616032 +39178999 +3918611239 +391988 +3919be5d +392023406 +39205143 +392100 +392125 +3924124 +3926781217 +3926bns +39273 +392801737 +3929282 +3930103 +3930510004 +39323932 +3934759 +3934gary +393537354 +39374399d +3939 +393924027 +3939355 +393ws +39400864 +39421 +39435 +39451287p +39454390 +39463946 +3947340 +39483715 +394d028e +394dl +394tsp +394v20e +39507f +39508895 +39521 +3953195 +3953248 +395415 +3956160 +39562511 +395646 +3956pz +39572127 +39575819 +39579b +39588280 +3960c9b0 +3961045566 +396188 +396244503 +396300 +3963308 +3963385849 +396355439 +3963mine +3964578125 +3964821 +396800 +396a9a1e +396eb4 +39717604 +3971981 +397360b +397397 +39791333 +39832 +39836535 +39838560 +3986428 +398662466 +3988888888 +398a92 +399345 +3994981 +39973 +399db38 +39Chameleon +39Mariah +39Tungsten +39ae064 +39asdfasdf +39d0f134 +39d389 +39e0f6r3 +39einstein +39erDFCV +39f9554 +39hahaha +39komuna +39pa39jo +39python +39rowson +39rs3333 +39uze +39waltheof +3@5t3rn +3BQ92q +3Corsairs3 +3DGYROS +3ET@G03 +3FAIRFI +3FNM3EX +3FdA +3Gunmen +3LP3N3 +3LiLaC3 +3Maja +3Monkeez +3OZsCQd641 +3PKD+4= +3Schwerter +3Scort +3SiB6o +3TF +3WQ7YT +3Wertzu +3Y1TZI +3a08334 +3a12345 +3a2005km +3a3a3a3a +3a6f37c +3aNissy +3ab2f3 +3ablakqt +3acinzia +3adaisydog +3adietcoke +3aenigma21 +3aharewood +3ahockey +3ajames +3ajessica +3al +3alami3 +3arnau3 +3arrington2 +3aspirit +3at4lif3 +3aturnings +3atyi +3auf3 +3av24i +3awekira +3awhiskey +3awtech +3aytmgst +3b077c99 +3b14xt +3b1x4d +3b4534 +3b4gkm +3b6ec3c +3b72aadd +3b79c695 +3bMonster +3badmin +3baf9fc0 +3bbrendan +3bc8ef9f +3bc8n1 +3bcallant +3bcartoon +3bed9f +3bella33 +3bgizzard +3bi6c8 +3binertial +3bmongos +3bmshtr +3bnight +3bougdnk +3bpasscode +3brujillas +3brytan +3bsterling +3bucm2y1 +3burts +3c303f +3c3bye +3c4107 +3c59dc04 +3c5x09 +3c5x9cfg +3c7298 +3c7515 +3cGrieser +3cairline +3calles5 +3cb +3cbbdcf +3cbc82 +3cdhl +3ce4e0e8 +3cfb52 +3ch0l0n +3chongkong +3cjgw +3ckatelyn +3clance +3convy3 +3council3 +3cpacyga +3cqbx +3cshingles +3ctravis +3cumares +3d056bc4 +3d0596 +3d05bb +3d0fc80 +3d2s1a +3d309a +3d39017 +3d5596ce +3d5gui +3d894bb3 +3d8a85r +3d9677xl +3d9uuhb +3da21u4l +3da9f1f6 +3daduxlx +3davkal4 +3dbluejay +3dc25cf +3dcc39e6 +3dcf0bfc +3def085 +3delias +3demmitt +3demon +3dercdf +3dextex +3df4c +3df5584 +3df5f6 +3dffxc9d +3dg7b +3dginger +3dheppy +3dhotrod +3dlounge +3dminnie +3dmn5125 +3dorpen +3dparadox +3drei3 +3drobinj +3drowallan +3dsemire +3dsimpson1 +3dspiky +3dsunrise +3dtwiggy +3du8lu3 +3dudes +3dw1n3k +3dwhisky +3dx2k9 +3dyang +3e1ht +3e23000 +3e2392 +3e2fe3b +3e33703 +3e4r5t +3e4r5t6y +3e4rf +3e98679 +3ea62f +3ea8 +3eaiurea +3eanx +3eb1bb +3ebfan +3eblackie +3ebutterfly +3eca4f +3echatter +3edc4rfv +3edemobx +3edeu +3eglobal +3ekal +3electure +3emanson +3emorrison +3end +3esawdust +3escgbwi +3ewoody +3ewwp +3eziy4 +3f0af69a +3f0da01 +3f2g0194 +3f75812 +3f966d +3fDeck +3fLorraine +3fPASSWORD +3faaeb +3fallworld +3famous +3fandres +3fbacc15 +3fc2a323 +3fcassie +3ff3gy +3fgeorgia +3fgfg981 +3fhailey +3fnautique +3foy9b7 +3fpbcx1k +3fprofit +3fpyramid +3fraaigg +3fsabrina +3fsobers +3fsparhawk +3fvooruit +3fzj1 +3g1phnkp +3g2378uj +3g5jq +3gcul +3ggplant +3gnle +3go3d +3gtp6 +3gwaivo +3h8fdeko +3haab +3hafvnag +3hamster +3head01 +3hf9d87 +3hfo6s +3hiduxoj +3hittinu +3hkcp +3hwdm +3i136 +3i9c1k +3ijpqwr5 +3ilialoi +3illuminaten +3imoeud5 +3ipsacul +3iqhi +3iwfi +3iwl3r +3iwtpcof +3izw8 +3jiiojl3 +3jodlpec +3k536 +3k5393ev +3k5r1t9 +3kaputra +3kdk5923 +3kingz +3kitties +3kol7ja +3kqhywz +3kr4z +3ks37 +3kv5s2mk +3kysz4rj +3l33tn3ss +3l3ctr0 +3l3ctronics +3l3n487 +3l5k7r +3lcubanito +3le9a +3level +3limiscaf +3line +3liveson +3lo3 +3lqcd +3ltzhz7g +3lvue +3lzm9 +3m1rc4n +3m23r3 +3m3d35 +3m3m1965 +3m3n1t +3m4nu3l3 +3maalole +3malachi +3mar96 +3med3med +3mfpc +3mgzt +3milovan +3min3m +3minem +3montag3 +3mous3 +3moz173m +3mpr3zz +3mruok +3mt01023 +3mta368 +3mxe9t2f +3n2htkhe +3n3e9i2l +3n3rgyxy +3n6kygnr +3na2uj +3nd1c0tt +3nd3v0ur +3ndv7 +3nigam +3ns3mbl3 +3ntlc +3ntry12 +3nvo5 +3o1tv +3o4cf5y9 +3p2ntr0g +3pat6mar +3patella +3pd7fl45 +3piger +3pmf +3ppkh +3promille +3psilon +3pvke +3pwjn +3pwl2 +3q2zlj +3q630x +3qc5u3 +3qd4ggar +3qdw4 +3qjr1 +3qqx5 +3qtgn +3qygk9bb +3r1K9 +3r1ck666 +3r5mqp +3r7t2u1b +3r8rc +3r9rsfc6 +3rd$hr3w +3rdcav +3rdgrade +3rdn4210 +3resonancia +3rgx3 +3rhed +3rizt +3rk3nn3n +3rose +3rotic +3rr0rz +3seven68 +3sgemr2 +3shyla4 +3silmarils +3sk1m0 +3spress0 +3sqav +3srb8 +3srmq +3stein +3stnrvw2 +3suppe +3sy54l +3t3rn41 +3tag7rxk +3test +3tex4as9 +3th3rn3t +3thomas5 +3towaopy +3tpgr4dz +3tumla +3u0vu +3u0xl +3u5df +3ucnz +3ujbw +3uoop +3upz8u +3ur0p3 +3utn9 +3v3lina +3vagm +3virus +3vqcd3z +3vqyq +3vtpowfk +3vxez +3vztd +3w44c +3w7ygscp +3wbfz +3we32wed +3wet +3wgmku +3wills0n +3wqar +3wt9aef +3wttX +3wyXk +3x07gup1 +3x18move +3xaczthh +3xd3eb4 +3xileust +3xkbf +3xonuzu9 +3xpr355 +3xpre55 +3xqvn +3xt4wk32 +3y193 +3y4y1l0 +3ybb6 +3yh1kmje +3yh6b8 +3ytsirk3 +3z0b4t3d +3z2x1c +3zatx +3zaw9 +3zeitgeist +3zffj +3zfi6 +3zjr0 +3znf4wkq +3zucy +3zvcn65514 +3zzzvpk5 +4 +4! +40 +4000eren +4001 +40011587 +400164278 +4002 +40023551 +4003124g +4003387128 +4003717 +40039865 +4004ter +40054005 +40055 +400629987 +400700 +4007izoo +40091161 +400abe24 +400emag +400lag +400saari +401104 +40114011 +40123b46 +40136798 +40146195 +401518 +4016108 +401611 +40161968 +40161990 +4019 +4019295 +402 +402.11 +40216 +4021985 +4022832 +402334 +4024 +402484 +40252515 +40262314 +403100 +40312190 +40315gr +4031ken +4031wick +40323058 +4035319 +4038054 +40384038 +4039607 +403bade +4040 +404004 +404028 +404040 +4040midn +404149548 +404150995 +4042192246 +404294841 +4042than +4043604 +404467857 +40462 +4046874 +4048 +40486327 +404877 +4048857 +40491541 +40497862 +404gto77 +4050 +40501090 +40508 +405152601 +40520 +405369119 +4056756 +40578097 +40584058 +405888691 +4059645 +405amantha +40613057 +4061324 +4064086 +406640 +40665544 +40680926 +407150501 +40715297 +4071803 +4075782779 +40761200 +4076200 +40784 +407843062 +40793299 +40794079 +407sucks +408074 +4080908495 +408095 +408102 +4082 +40823b8 +4082419 +408408 +408995417 +40937983 +4095703 +40976531 +4098211 +4099 +4099940 +409bunny +409c5eb +40aloevera +40asdfgh +40cakes +40dbdf23 +40diove4 +40fa05 +40fairuza +40frances +40ia32 +40ily +40joshua +40lacizo +40limonov +40mangos +40powershop +40snoopy +40uqk +41004596 +4100771501 +4101024 +41013748 +41018 +410186c3 +410203 +4103520 +410410 +41046403 +410470 +410526 +41054105 +41064106 +41065 +4108883810 +410993657 +410Sauron +410aeswz +4110612233 +41114111 +4111713 +4111971 +411315 +41137058 +4113741913 +411448177 +4114557 +411484848 +4114874 +4114dan +41159383 +4115983 +4116e9a +4117 +41179 +411867 +41195f +411989 +4119e4c +411gib81 +4120 +4120468 +4121 +41212292 +412200 +4122001 +41223551 +4122479 +41227 +4122prytania +4123436279 +412378822 +4124ca +412589 +4125iw +4126 +41264126 +412695331 +41285 +4131199 +41321705 +4132378 +41324132 +4132ecec +413343362 +41345253 +413473 +4135307 +41353109 +413582 +4136108 +413639641 +4136750 +413712009 +4138nancy +413910794 +413d15 +414 +41400xx +4140187201 +4140464 +414141 +414152 +41419858 +4141cool +4141qwer +4142175 +4142rvoi +414338 +4143667 +4144084 +414415 +4145035 +41462350 +414728 +414735488 +4147658 +41478086 +414799G +414852 +41499130 +414yushu +4151246 +4151417 +4151932 +4152617 +415263 +415272601 +415322 +415413 +41541ts +41544154 +4155 +41552930 +4156621 +41567186 +41569732 +41594159 +4159856 +4160 +4160815447 +41611269 +41612917 +41615977 +41625762 +4163357167 +41639571 +4164177 +4166430 +4167674 +41687974a +4169958939 +416lados +4171652 +4171994 +41723slw +4172519 +417258086 +41739570 +4173calma +4174 +4174592541 +417469 +417519520 +4175bee +4175c9 +417732261 +4178490642 +417889748 +41792777 +417cda6 +417never +41810242 +41868342 +4188273 +41892280 +4189dw +418stats +418tu +41902287 +41912304 +4191parrot +41924192 +419748868 +419783 +41980374 +41982540 +4198680 +4199 +419963817 +41Shakuntala +41ZUBRA +41ahmet41 +41b3rt0 +41babygirl +41bcd8 +41buffet +41cb5e +41ce8a02 +41chubby +41copeland +41delfin +41diamond +41e3fkfh +41ecae +41fd97l5 +41fivers +41harvey +41insidious +41jumanji +41juw +41macleans +41nidebs +41nlr +41password +41r0x1 +41rangi +41schalke +41zCx +42 +42000000 +42002748 +42004200 +42005864 +4201102569 +42011064 +420161950 +42019330 +4201love +420202 +420207845 +420247 +4202633 +4203020032 +420399 +420420420 +420556 +420621z +4208854 +42088644 +4208908 +420conway +420finkler +420goldberg +420gryphon +420p0w3r +420sec +420shan +420twr +42105210 +4211451 +4211991 +4212020 +42120218 +421210103 +4212335 +4212395 +42133600 +4214121 +4217024 +4217967 +42182442 +42186331 +4218ng08 +42190445 +4219463 +421ewla +421f74 +421park +422024140 +4220323444 +4220353 +4220355 +4222724 +422272970 +4223332a +422345 +422395 +4224183 +42249718x +4225 +4225259 +42258976 +4227843 +4229535 +4229scumbag +422fd0 +422west +423000 +42311 +423150566 +423156 +42322443 +42329 +42335333 +4234669311 +42349238 +42352004 +4235241 +42356765 +42374978 +423911832 +42399 +423d3b +423shaman +42404240 +424093 +42423956 +4243256 +42433286 +42435 +4244709 +424490 +42452953f +4245356 +42471987 +4248940 +424921 +424971804 +42507 +4252658 +425302 +4253047 +4253967303 +425419214 +42562555 +425665 +4256725 +4257032381 +4258164 +42582 +42594 +42594259 +4259e0 +426000 +4261472 +426186 +4261991 +42654846 +42661008 +42664225 +426692 +426748778 +426761a8 +42676920 +42688624 +426fjau +4270080 +4273910 +4275 +427558104 +4277695 +42785 +427888376 +427cobra +427sting +42827538 +4283mels +428423 +42843255 +4285595 +42858779 +428597 +4286329 +428799 +42884288 +4288609 +4289177 +428946824 +429184 +4294terra +429735038 +4298440 +42CA0CB +42august +42basket +42brent +42chimes +42devonport +42ecafe +42f8699c +42getin +42gn6fw +42guild +42gunope +42huxley +42jr5efe +42ktilxp +42meowmix42 +42newstreet +42ratte42 +42revised +42schlep +42stinson +42trapdoor24 +42watson +42ws42 +4300dirty +4300sf +43070593 +4308505 +43092 +43094309 +430cedar +43100 +43100616 +4310551d +43112V +4311hell +4312 +43120797 +431303 +43137925e +4314186 +43144314 +4314539317 +4315 +4315252 +43154123m +43165268h +431954823 +431968 +4319869 +4320011207 +4320320 +4321 +43210 +43214321 +4321qwe +4322 +4322088 +432265 +432325040 +4324156 +4325009 +43251186 +43251565 +432541759 +43261990p +4327186 +43278987 +432901 +4331590 +43318 +4332 +433212 +4332889 +4333prussian +433494437 +4335075137 +4335117 +433534 +433567947 +43358891 +433773435 +4337e5b6 +4339043 +43396at +434083 +4341 +4343 +434343 +43437000m +43439278 +4343sultan4343 +4345341 +4347823 +434scott +4350006 +4350058 +4350100 +43506973 +435166 +435183530 +4351886 +43541393 +43542erc +43549887 +4355 +43558276w +43565428 +435666 +435698 +4357129 +4358096 +4359898 +4364366 +4364596 +436531 +4365swfd653 +436693230 +436703 +4367338 +436JA +436amae +436d3ss2 +4370598 +437100 +43731295 +43734373 +4375egon +437695 +43770 +4377700 +43778cz +4380chu +438114431 +43814381 +438143816 +438186 +43821076 +43823 +4387107 +4388 +438lax7d +439023 +4395218 +4398003579 +43984398 +43990402 +43992630 +43II0b +43Rx99 +43aaaaa +43ahmed +43bailey +43d1518 +43d2e25 +43daisy +43dnoces +43ercoupe +43falcons +43gmf9 +43gorman +43hercules +43hotspur +43kiaora +43redstar +43rone21 +43saten +43sawdust +43site +43vejnovic +43ygv +44.963 +44004400 +440141 +4401741183 +44027aa +4403 +4405021972 +440589 +440727 +440790 +44083004 +44083408 +44090 +440997 +44104063 +4410893 +44111144 +441125 +441130 +4412164 +4412485 +441263cc +4413312 +4413998 +441405 +441441789 +441510553 +441528337 +441626 +4416ac92 +4417 +44170153 +4417421 +4417457 +441789 +4418960 +441960 +4419822 +442068 +442071Hk +4421603 +442175 +4421942628 +4422 +44220325 +44221 +4422552266 +4422993 +442334 +442337 +442451608 +442495 +44253611 +442566 +4426 +4426935 +442712345 +44282314 +4428252604 +44286868 +442terra +4431 +44322097 +443301 +443400 +443443 +44346620 +44347284 +4435016 +4435540522 +443594 +4435f2 +443610 +443652 +4436906310 +4437 +4437802 +4444 +44442369 +444444 +44444444 +444444444 +4444444444 +44445432 +44446666 +4444aa +4444h2 +44454445 +444555 +4445556 +44459742 +444719 +444814 +44494 +4449671 +444RAV +444anji +444f5g9d +444lumber +445042112 +44504450j +44505766 +4451035110 +4452 +44524452 +445262 +4452718 +44552455y +445554 +4455556 +445566 +4455666 +44556786 +445588 +4456 +44570397 +445737 +4457774 +4459601 +445987473 +4460631 +4460767 +4462186 +446241739 +4463 +446561 +4466123 +4466468 +446669 +446872 +446958961 +446959 +4469jolle +446james +4470Nina +4472296140 +44746948 +4475539 +447799 +44799178p +447rorsu +448071 +448111 +4481fred +44822001 +448448448 +4485 +44851901 +44870 +448724 +4487alex +4488 +448811 +448816 +44888987 +448v9 +4490215 +449061373 +4491486 +44915101 +44951350 +449607210 +4496541511 +4496715 +449764811 +44987 +4498912x +44Viktoria +44XA49 +44af54 +44afrika +44becker +44bfv +44blackmore +44d0ed +44dkh55 +44dolphin +44e15da5 +44erat44 +44freedom +44gaming +44global +44golf44 +44hema99 +44ib3 +44iifij7 +44india +44jamies +44katherine +44komma44 +44kssgpg +44mada +44mln +44nuv +44octane +44ra4ok +44roadrunner +44shirdi +44stephen +44xp8az1 +44zng +450026403 +4500273471 +450029675 +4500495 +450077 +4500891008 +4502388786 +4502641 +45026616 +450288 +4503167892 +450341 +450375 +4504246 +45050279 +4505556039 +4505617w +45056223m +45063450 +4507021979 +4507722 +4507929170 +45079691 +4508 +4509863979 +450n9 +450tv7fu +4510 +4510311 +45109769f +4511456123 +45123 +451238b +4512434 +45124512 +45125623 +4512963028 +45134513 +4514411 +451451 +4515100026 +45151270 +4515253565 +45158 +45162 +4517300 +451881AA +4519316 +452018g +4520230 +452043 +452060789 +45214521 +4521998 +4521plk +4522712 +4524465 +452452 +45254022 +45254525 +452597 +4526terra +452735406 +45277 +4527932 +45284528d +4530mani +453123 +4533452 +45342205 +45344534 +453454 +4535329 +4535385 +4535645 +453634 +4536628 +4539452 +453vip +454016617 +45404540 +4540ah +4541ee +454261985 +4542627 +4543279 +4543312 +4544 +454474a +4545 +45450 +454545 +45454564 +454550 +4545629 +4545656525 +4545ec +4546 +454647a +454662 +454775 +45479s +45484632 +454858 +454rzdr4 +455 +455238 +4552387392 +4552A +455341800 +4554 +45540491 +455406 +45545454 +455520 +455565 +4556 +45560221 +45564556 +4556666 +45570 +455blaster +456 +4560079412 +4560149 +45611 +456123 +456123789 +4561478l +456188q +4562364 +456258 +456289059 +45629362 +456321 +4563258 +456369 +45639888 +4564 +45645010s +456456 +456456456 +45646423 +456466 +456520123 +45654565 +456579 +456582 +45658885 +4565f502 +4566335 +4566450 +456654456 +456728aa +45674567 +45678 +456789 +45683846 +45684568 +456852 +4568520123 +456852110 +456852357 +456857217 +4568912 +456897 +4568db +45694569 +4569510233 +456987 +456D5 +456aztec +456c852 +456hqk +456m789m +456s123 +456welle +456yhr +4570 +457000 +4570505570 +4571228 +457145 +4572145 +45723819 +4572626 +4572allgone +45730728 +457323 +4573423 +4574 +45748696 +4576125 +457730 +4578 +45782356 +4578430 +45785116 +457851505 +457ed7go +4580 +45804580 +45810487 +45812211 +45821811 +45825055 +45834583 +4585077 +45851682 +4585196 +45854420 +4585568 +458699 +45871 +4587428 +458790 +458796 +4587ghyt +4587iu +4587zxd +45883 +45884555s +4589373 +45896ed +4589825 +45899643 +458atg +45908433 +459145690 +45917861 +459254123 +4593721860 +4594141 +459459 +459487 +45951770 +45971033 +4598131992 +4598450001 +45Walton +45bessie +45bigdog +45biggles +45bombay +45butter +45c43e63 +45clydie +45cp13fk +45datsun +45e093b +45efvf5 +45eqr6yb +45essence +45f4f6 +45ffpto +45gwq3 +45lewo45 +45m2993 +45m6188 +45mals0 +45positiva +45sandman +45shithole +45t9kqkm +46 +4600231989 +4601037 +4602514 +46050900 +46064094 +4607015 +4607330 +46073f64 +4607713a +46084481 +4610 +461012 +4610207 +461046 +4611110387 +4611216041 +461200 +46121 +46132674 +461342449 +4614460 +461461 +4615517 +46161935 +4616814 +46173958 +46184950 +4619840416 +461987 +461991 +462005 +462085 +4620871212 +4625165 +462581 +462591 +462608778 +46261976 +4628311148 +46285 +46288270 +46293684 +46304h +4631267 +4633 +4634246342 +463497 +463602 +46362960 +46364636 +463777802 +463808 +4639716 +463dv5 +463nsq75 +4641458212 +4641cashew +4642400 +46431459 +464459 +464557 +46462269 +46463951 +46464141 +464646 +46472b +46473695 +464784862 +464888 +4649 +46494649 +46497f +4649825 +465 +46510225 +46512625 +465142d +46521987 +4655958 +465636 +4656745 +465688055 +4657409415 +465a163 +465rn +466308659 +46636308 +466453 +4666633 +4666718317 +46674668 +4668710 +466995194 +4670 +46751924 +4675cc5c +4676457 +4676502 +4677 +46774677 +467811 +4678611a +4679 +468101418 +468255 +4682551535 +4682552864 +46837638 +46838006 +46854321 +46871981 +46883767 +4689 +468ike +468sz937 +46904690 +4690dej +46911812 +4691YG +4693 +469369772 +46944170 +469467116 +4694759 +46947aa +469627696 +4697038 +4698640963 +46Betty +46alcohol +46b6c7 +46blackcat +46clober +46f076 +46godess +46lente +46mau87 +46mwv +46novear +46pnleo +46rooster +46routes +46shiva +46ski82 +46spooky +46sycamore +46t9kqkm +46thunderbird +46xiaomeng +4701442 +470213999 +470242654 +47024702 +470470 +470507 +4706854 +470744 +47075357s +470918 +4710 +47101234 +4711 +4711003 +47110815 +471110 +4711110164 +4711210403 +47113001 +4711409 +471147 +47114711 +471147123 +47119733 +4711gcr +4712 +47121229 +47123456 +471255 +47130 +4716146 +47177442 +4717992 +471a59 +4721 +47215059 +4724ohio +4725 +4725166309 +472569 +47278189 +47284106 +473#827 +47300q +473173 +47324732 +4733544 +4735 +4736822 +47398675 +47424742 +4742893 +474294 +47437286q +474555 +4745577 +47456 +47474747 +474747xx +4748860 +4749259 +4749555 +4749751a +47511992 +47521632 +475232273 +4753550 +47536f +4755561 +4756687 +4757010 +4757juli +475869123 +475872 +47588375 +47589592 +47591 +475j9 +476234 +47641094 +476418 +47646212 +476499921 +476994 +476c87 +4770668 +4770yuen +47727900 +4772933 +47735582 +47739800 +4773fb +477490 +477508500 +4777car +4778850 +47798vb +4779arni +4780436 +4781 +478121592 +47824578 +47826292 +4783636 +4784294 +47851702 +478523901 +47856230 +478650031 +478688 +47870664 +47880 +47896321 +4789f79 +478ku +47900 +479062 +47906k +4791 +47956095 +47976 +479811aa +479972699 +479ckp42 +47DAVIDS +47Sammy +47altezza +47b1068 +47bambou +47baptisms +47baseball +47brooky +47cf5d51 +47dennis +47destini +47e06def +47gnaxgx +47jusega +47morten +47pl23gg +47popozao +47qsa74s +47raspberry +47sevens +47slipknot +47star +47tessa +47tissue +47txy +47vzhha +47wormald +47x1b3z1 +4800280 +48037538 +4803814829 +48061622q +480713 +48073582 +480816306 +4808560 +4809680 +4812050 +4813222 +48141992 +4815162342 +48154848 +4816361 +481772 +48182230 +4819 +4819034 +4819889 +481merchant +481snowball +481wcc +4820579 +4821342366 +4821549 +4821mushy +4822 +4823865 +482448 +48244892 +482480p +4825091986 +482511 +482524 +482649583 +482711246 +4828 +4829001x +48298882 +482999 +482namca +48304076 +48304830 +4831835 +48326125 +48329667 +48330857 +4835635 +48364051 +4838155 +4838887 +48397192 +48401609 +484132483 +484148 +484155584 +4841614 +4842004 +4844778 +48461668 +48464846 +484700j +4848 +48481949 +48482687 +484848 +48494849 +48496324 +484kaiai +484vrpal +4850372 +485091 +4854644 +485466 +48551224 +485560 +485584 +48563123 +4856u02y +48574857 +4858680 +48588336 +485n30 +486012 +48607419 +48613 +486148r +4861823 +4862 +486213 +48621789 +486257913 +4862966715 +4863are +4865401512 +486579 +48658388 +48686e1 +486876404 +4868950 +4868bred +486920676 +4869476 +486981 +4870 +48704587 +48709453 +487160293 +48724872 +48746635 +487482611 +487487487 +48762121 +48764876 +48767diu +4876e0ff +4877 +4877gf +4878 +4879 +48790040 +48798029 +488050192 +4880976 +488125369 +48828484 +4882a001 +48837246 +488391204 +488413 +488531 +4886582 +4887361 +488761 +4888152000 +4888danix +489036204 +48909012 +48910 +4891349 +4892037903 +4893297 +4895#1 +489500 +48952058 +489558 +489758f +489764 +4897970 +489924 +489wx +48Crash +48a168e9 +48a544 +48abc123 +48adriaan +48alanon +48barmaley +48cart +48d6bcb1 +48fbe3c +48g3ad6c +48haylee +48icv +48jackass +48jqh +48kdi +48matus +48misty +48orange +48please +48qweweqwe +48raket +48soviet +48sterni +48tf58 +48tumut +48turner +48ue321 +48virtual +48web601 +48ytl +49 +49002372 +4900909 +490100 +4902727 +4902bb +49031 +490370008 +49038611 +490479 +490506 +490522212 +4905600 +4906523 +4908705 +491337 +4918496 +4918leeg +49194 +49194919 +4921cliq +4921java +4924021c +4924127 +49241842 +49273624 +492787283 +4929298 +4929f9f +4931065676 +49364576a +493718 +493931 +49412360 +4942516 +494461295 +49450120 +494505 +49465 +4946hrea +4949 +494901990 +494949 +49496767 +494973703 +494ys005 +495071 +49509034 +495188829 +49531715 +4953b9c6 +495520725 +495549 +495618237 +49564956 +49586m19 +4959049590 +495jqa +4961237805 +496380578 +496415 +4964722478 +4964735 +4964816 +49658000 +496ag54 +497 +49700 +4970c5 +49724086 +497241891 +497334 +497334690 +497686600 +4978483 +497926717 +497no23 +4980255 +498107226 +498207 +49829977 +49844984 +498752 +498941364 +4990ss +49911072 +49914991 +4991576 +499291953 +49937 +4994130 +4994532 +4995 +499573666 +4995887 +4996 +499720 +499ntw +49a54 +49a8f09 +49bnp +49bossman +49brianna +49classic +49clawis +49converse +49dd252 +49denisa +49ee4d2c +49glasses +49jeferson +49jv4jxy +49kut +49louis +49plinius +49scuderia +49thflr +49wood +4=opA +4ATR +4Angel2 +4C +4FWVXG +4GW94D +4Iloveu! +4Jt16h +4KN3L4 +4MUSICO +4Money +4NjIng +4Paramore +4Rhonda +4Rudy5 +4S5T8O +4Savage8 +4Tingi +4UP272 +4WALDST +4a021nx +4a3hat99 +4a66nphf +4a84631 +4aae3cec +4ab135 +4abalfour +4abaton +4acidics4 +4acorsair +4adidas4 +4admin2c +4ae9e0 +4aefd26 +4aerdna0 +4agr5 +4aicthus +4akaufen +4akrileg +4alexita +4alljunk +4amorite +4ampa +4antrz +4aorakel +4arealist +4arussell +4asammy +4asiena +4assw0rd +4astormers +4aubc780 +4av9rbmh +4axvh +4ayX7u +4b1757 +4b239730 +4b3ce4ae +4b46618 +4b4fN +4b5b79 +4b5udi +4b6ead4 +4b9ureoa +4babc123 +4baf484 +4bajou +4balls +4bardos +4basana +4bbadran +4bbaw3du +4bbodie +4bcapetown +4bdaewoo +4bdaf +4bdrummer +4becker5 +4bethan +4bf5d65 +4bgounia +4bgunsmith +4bidunno +4bjeeper +4bknifeman +4bkps01 +4bmother +4bmulder +4bmurray +4bnl760 +4boobies! +4boyzz5 +4brats +4bu4s +4bugs2 +4bvoxynh +4c009ab +4c1956 +4c4155 +4c4d3my +4c4ntz +4c619d +4c6c7047 +4c9663 +4cWILKIE +4calegna +4candy9 +4caramelos +4carissa +4caxydtm +4cbooboo +4cc3ssx +4cc6951f +4ccornell +4ccrunch +4cfernleaf +4chaucer +4chiarts +4cjohnboy +4cjyz +4clincoln +4cmed +4cmonday +4codrade +4coonies4 +4copenit +4cpookie +4cqwerpoiu +4cslja +4ctFpb +4cwco7vw +4cxtkwmt +4czb0 +4d00866 +4d20c10 +4d22888 +4d2d0il +4d2wcr4s +4d3lf14 +4d51b049 +4d5332 +4d710e26 +4d7cc339 +4d98ed +4d9nt +4dZhiyu +4daa96 +4dagny44 +4dalbion +4daneave +4dassius +4dates +4dbl28pi +4dbrindis +4dd1 +4dd5on +4devon2c +4dgarfield +4dhappydog +4dhector +4dj8934j +4dleifl +4dloretta +4dm1n +4dm1n10 +4dm1n1tc +4dmadison +4dmi3n +4dmind4y +4drdi +4drevenant +4drmdp +4dshakti +4dsl6868 +4dvanc3 +4e073c +4e7pTr +4e8ba1le +4eAUCKLAND +4eLNW +4ea4210c +4eafdcd +4eb52b +4ebluebird +4ebrooke +4ec16bb +4echris +4edanger +4edanny +4eg7tzf3 +4eglobal +4ehockey44 +4einvestment +4eistoot +4eksmp1 +4emassage +4emhnu5 +4epantera +4eruapehu +4estgump +4ete5tg +4euniversity +4ever +4evercw +4everftw +4eyaz555 +4eyoyoyo +4f222124 +4f2cr3v +4f30b7 +4f37922c +4f4e2f2 +4f6000 +4f7c408b +4fCeline +4fa17c2 +4falcatel +4fallout +4fc50b6c +4fd0e9b0 +4fedison1 +4felijah +4felvis +4ffy6 +4fgalaxy +4fghoti +4fjordan +4flowers +4fpio0 +4fr33mans +4ftk8 +4fuzzies +4fwa61r +4fyz801 +4g1m4 +4g2sd45 +4g307 +4g962714 +4gapt +4gbnl +4gdzx +4geta6dw +4gjic +4gl6445 +4greta7 +4gulli +4gwkz +4h28y2f4 +4h28y2f5 +4h2alafw +4h3ool4 +4h86epr5 +4hcfghqf +4hdf7 +4hdokrq5 +4hgttts2 +4hiking44 +4him333 +4hokage +4hrd99x +4huntress +4hynyc4 +4hzdi2 +4hzhdl +4i2rxk +4i3195 +4i4olina +4i8emrhe +4iKCN +4idkits7 +4ikra8mr +4j3f1t0 +4j3hd82k +4j5tgv8k +4j62G9 +4jaimeso +4jamie1 +4jbjo +4jfkJFvn +4jl0j +4jsg8uh7 +4ka5ff +4kamz +4karca +4kc6w3 +4kcr3wd3 +4kdm54 +4kflvby +4kfms +4khpk +4kj5t9d6 +4kli3sfs +4kv +4kxicwwm +4l2a5v +4l6d7s3m +4lb4 +4lik2 +4linden +4lingwst +4linuX +4ljnq +4lorlei4 +4lpenmilch +4ltnb +4lunkwill2 +4lunyul6 +4lyn2k +4m405 +4m4d3u5 +4m7gfS +4mAz0n +4mLTbYHp +4madness +4maky5ye +4march10 +4mciklar +4me2use +4me4bsfo +4menot +4meopen +4mer1can +4mhko +4mrf12 +4mse7f +4mst3l5 +4msucks +4mully +4mvub +4my4my +4n4NGz +4n4f4d3 +4n4l0p3s +4n4rchy +4n63l1n4 +4n8o2pbt +4narchist +4narchy +4narsil4 +4ndr3w +4neisel +4ni0ll +4nicator +4nj4r0 +4njja +4nz5umch +4o49djbj +4obxp +4ofclubs +4oneone +4onkelz4 +4ouvcp +4owend +4p5w3qea +4pb5f +4pbce +4pdpass +4peace +4pgiu8ki +4pindi +4po46knc +4point +4poo6 +4pricat5 +4prn6dm +4punks +4q0yq3o +4q676 +4qi$$ +4qlej +4quilka +4r077 +4r0sch +4r1f +4r2only +4rG5U +4rch3r +4rchenemy +4rfde3 +4rfv5tgb +4rfvgy7 +4rockers +4rs2no1y +4rt3rk +4rtb1t +4rtg0d +4rumit +4s5a4sv6 +4s75bp +4saef46 +4scfq +4schnapp +4sep +4sh3n123 +4siamese4 +4silver +4sizgd +4sjcmtnn +4skiman +4spinale4 +4sport10 +4ss4m1t3 +4star4 +4strings +4suihtsi +4sushp +4t34t3 +4t4t4t +4t7u1e1v +4ta4c16t +4tcmf +4thebest +4thekids +4theking +4throck +4tpzgto +4tver +4tze9o +4uaspect +4ugment +4ujoe2 +4ukocc +4urban +4utqh +4uym5w7 +4v28x46 +4v8snbrf +4vCC6 +4vk46 +4vp2xt +4vpwvmjt +4w497 +4w98s +4w9gh0uq +4wachters +4waqzah +4wekc +4wheelzr +4whmj +4wkkj8ok +4ws0m3 +4wy3r +4x33nt3 +4x3k7b6r +4xjdu +4xruc +4xwqu +4y58bi97 +4y68zoe8 +4yamamoto +4ydc88xc +4yfom +4yln6mug +4ypcq +4ysuj +4yvpx +4zsm1fnp +4zsou +4ztvo +4zzze5q5 +5 +5$Footlong +50 +50001000 +5000271 +5000ebmw +50010125 +50010517 +500258768 +50027e5 +500362 +50042643a +500500 +5005002 +500502 +500505ll +500555 +5006061 +5006141 +5006582 +5006601 +500878 +500910 +5009840120 +500artist +500cents +500d +500power +500s49 +500simba +501 +501051539 +5011111 +5011250 +50117&# +5011986 +5011jesper +5012023 +501220 +501247855 +50131505 +501358 +501368 +501375 +5014148 +5014951 +50149742 +501501 +5016342 +501678398 +50181 +501835684 +50185118S +5019173 +501bc92 +5020024 +502048020 +502199977 +50221746 +502287 +502311 +5024fm +5025646966 +50257306 +5026 +5027865 +50296203 +50299143 +502honey +503020a +5032tow +503331686 +503362821 +50353752 +503669 +5038690 +503870b +503c5d6a +503f2e +5040 +504000343 +504018919 +5040214 +504074 +50407b21 +5040pq16 +5042080 +50435043 +5044819 +504698 +50480000 +50481 +504817 +50490000 +504939 +504yukon +5050 +505026 +505030275 +505050 +50505050 +505065 +505083 +5051177 +50514001 +5051828 +5052022112 +5052308 +505281e +5052937 +505325 +505356138 +5053706048 +5053746251 +50550513 +5055092797 +505520 +505531193 +505545 +505600 +505606 +50564b13 +5057734234 +5058527035 +5058780350 +50589841 +505967 +505f75 +50602216 +506070n +50607816 +5062521 +50628165 +5062985 +5063281 +506481121 +506506 +506555bb +50668 +506896889 +506ab9 +5071456 +50715091 +50721543 +50739952 +5075808 +50763498 +5076dj +50773ccc +50775171 +5079tl +5082 +508205833 +50824739 +5083694950 +50839 +508420 +50845bc +508493 +508513 +508568 +5087301 +50878688 +5088874 +508986716 +508oe +509 +50905090 +5090663 +50910251 +5091983 +5091k +509266f +5094751018 +509485323 +509496ec +509727100 +50984111 +509feb +509k509 +50Thierstein +50apven +50barbados +50bd215f +50billybob +50birdie +50cent +50cents +50cranium +50crochet +50d84b +50hoppie +50kroner +50l4r15 +50nature +50precision +50snorer +50soundwave +50stoney +50tabetha +50tnuong +50valley +510011 +51002245 +510152025 +51016042 +5101677 +5101990 +51027261 +5103006 +5103217 +510363377 +51051744 +51065238 +51065698 +510858645 +5109171 +51105110 +5111386 +511163 +5112200 +5112222 +51122559 +5112413 +5112514 +5112704 +51129374 +5112Den +51135523 +511421781 +511441 +51145803 +5116231990 +5117177 +511741 +5117914 +51181218 +51184319 +511877 +5118n0qh +511982 +511992 +511f75 +512011 +51203505 +5120555 +5121072 +5121131418 +5121991 +512210 +51223969 +5122775a +512292968 +5123090 +51234 +51236 +5123641 +5123rc +5125323 +51254956 +512584 +5125v +512625 +512628 +51264 +512835233 +512c66 +512mbddr +5131355 +5131492010 +5131cam +5131kiya +5132693 +513386084 +5136249 +51365 +51365136a +51366 +51383499 +5139033 +5139145 +513924520 +514051 +514130 +51414080 +5141rowen +514326 +51441475 +51446 +5147 +5149825 +515 +5150 +51501820 +515055 +5150834 +5150hold +5150merry +5150wolf +51516301 +51518442 +515190744 +5151highland +51521990 +515238 +51525660 +51533517 +51535957 +51544118 +5155196a +515623 +5159278 +515951 +5159568565 +51596401 +515ly +5160pih +516161579 +5161791 +5162 +5162678 +51627625 +516375 +5165 +51655165 +51662301 +51684058 +516m1 +517168 +517170730 +517209213 +5172232 +51725172 +517322 +51732591 +517389 +5175140 +517572875 +517651200 +517659 +51775 +51789l +517acht +517clb +517e36 +518005 +5181 +5181115 +51819854 +5183000 +518351856 +5183dz +518428456 +51847597 +518493 +51855185 +518787222 +518927001 +518tc518 +51907a +51910435 +51923482 +51924141 +5192716360 +51946 +519759 +519862 +51992641 +5199328 +51AMAA- +51Power +51SKKg8xL,0SUL +51ab240 +51akkan51 +51alanna +51allblacks +51area +51ashley +51b604b +51bicycle +51blackman +51breath +51ceaser +51chevy +51czyzcq +51dajia +51eb9d56 +51edf00b +51eminem +51foxx +51gm4 +51holiday +51jimbo +51jimminy +51jql +51kosta +51lbp +51mask +51mp13 +51nickp +51pants +51potato +51teste +51tooltime +51toomuch +51tryou +51velvet +51w68 +51xgb +51yih +520038 +52010000 +5201222118 +5201302 +5201596 +5201769966 +520178 +52025 +520333733 +5203344 +52041688 +520424 +52047745 +5204852 +520520 +520520zn +5206128 +520772 +52080 +5209065 +52097571 +520ce616 +520liran +520sss +520taxi +521012 +52109 +52111377 +5211314q +521177166 +5211985621 +521207 +52122019 +521313 +5213777 +52139731 +5214 +521478963 +521521 +52152100 +5215230 +5215252 +5216008 +5216354289 +521645 +5216700 +521804f9 +521888 +5219208 +5219311088 +521992 +521lemon +521soft +521stt +521xiaokai +522092 +522222 +5223 +52233 +5224620 +5224744 +52259bk +5225inuyasha +5226086 +5227054 +522775 +522959 +522fc0 +52300001 +5230054 +5231314 +5231523 +5231658 +52317983 +52324719 +523252 +52337 +52341026 +523415841 +5234182 +523434663 +523489 +52349 +523523 +5235503 +52355235 +5235ap05 +523631 +5236741a +523714 +5237562 +523768 +523803 +52386687 +52391207 +523bdb8 +524072855 +5241411 +5242066 +5244124 +524549714 +524661 +52468231 +52469376 +5247 +524993 +524CA8 +5250004 +525202017 +52524600 +5252462 +52525252 +52538 +5253hutch +5254694 +5255 +52554111 +52575257 +52575859 +5257So +5257mtl +525fb2eg +52605260 +52610845 +5261lelina +5262jussi +52630955 +526324864 +526341 +52637279 +52640481 +5265067 +5265666 +52661226 +52673 +526776 +5268 +527 +5270114 +5270738 +52721965 +52724262 +5273392 +5274027 +5274875 +5275486e +52765276 +52772g +527828840 +5278927 +52789e4e +52792www +5279ccac +527azm +528057mu +5281119 +5281379640 +52814773 +528214 +52826464 +528273985 +528289 +52835721 +52838583 +528389527 +5284265 +52858979 +5288512 +52897 +5290602 +5291991 +5292059 +5292679 +5293294 +529377 +529400 +5294000972 +52948525 +5295404 +52956361 +5297heli +529870 +52987705 +52988 +5298mona +52Xmax +52a91b +52asd1c2 +52bc84f +52bella +52beulah +52bills +52brasil +52bzc +52ca1b52 +52davidm +52dd9d7c +52dinham +52dua224 +52e886 +52fefer +52goggie +52hilux +52hotrod +52injun +52kathrine +52maxi14 +52mlk96 +52newland +52pbzzxp +52powa +52prout +52rapide +52root +52saibaba +52saltbox +52scotland +52sunliner +52togo00 +52tortie +52tyreese +52wilson +52xavier +52zzage +53000 +53006406 +53007278 +53025162l +530298345 +5303138 +5303858 +53041207 +53046 +530495 +53050577 +53053 +530530 +530530Z +530563 +530603 +530617 +5307 +5308 +530848 +53087200 +5309jeni +530dmaster +530i500v +531 +5310 +531020 +53104984 +531179 +5312322 +5313711 +5314 +53140062 +5314084 +531464 +531478 +53149877 +531506 +53153077 +531531 +53158136 +53160725 +53165316 +531795 +5317955 +5318lb +531969 +531981 +531cyber +531da7 +531referee +532075317 +5321380 +53214869 +532164 +53221664 +5322193 +5322288 +5322383288 +53227 +5325495858 +5325503 +5325925 +53263 +5327000449 +53271628 +532801a +53284753 +53285328 +5329090 +5329360 +532970369 +532f2e3a +533111 +53311304 +533146200 +5332741 +533335999 +5333362a +5333418673 +5333888 +53345274 +5336107788 +53362872c +5336419439 +53367964 +53368 +533703 +53379425 +53384711d +53388652v +533akkan +5341089 +53411401 +53415341 +5341786 +53419555 +53484035 +534906 +53515977 +5351mw +5351po +53522322 +535249 +535285400 +5353 +5353147 +5353564273 +53545354 +5354554 +5354556 +5355 +5355643864 +5355914038 +53564231z +5356849508 +5357944757 +53580660k +5358775107 +5359534014 +5359546878 +5359678708 +5359807136 +53607543v +5361185 +53615361a +53627137 +5362847553 +536302018 +5363591795 +5363961081 +53644 +5364426085 +5364460257 +5364514 +536487 +536487 +53649259 +5365119630 +536525136 +5365941 +5366020296 +53662436 +5366425700 +5367031 +5368800253 +5370jox +537110 +53713 +5371858 +537262 +53730533 +5373718 +53738307a +5375 +5375488 +5375931427 +5377 +5378018684 +5378616627 +5378637046 +537937 +53799466 +537JEJ +537fde +5381232 +5383825722 +53863335 +5388010 +5389118 +5389775 +5390151033 +5391 +539294 +53934d +5394000 +53945394 +53945863 +539465 +5394gm +5395254598 +539525804 +5397ttu +5399182 +53Limelight +53X0RZ +53XyX0 +53athena +53babygirl +53c32f2 +53country +53cr3t +53d1f8 +53daemon +53e63 +53fadeaway +53gibson +53hachi +53jiang +53manetheren +53mercedes +53n0r1 +53normak +53paulie +53ven115 +53yxz +53zander +5400099 +540040720 +54007666 +540127 +5401738543 +54031605 +5403543 +54038827 +54056802 +5406usn +540724 +5408117 +540981205 +540ems +5410 +54104 +541063718 +541069 +5411765 +54121631i +5413072520 +541340 +541417 +54144317 +5414inco +541553 +541608 +54177373 +54186937 +5418839 +541987 +541Sparky +54202 +542100 +54215 +54215421 +5422football +5423207188 +5423529388 +54236585 +5423919 +5423alex +5424180 +5424656 +5424745298 +542542 +54264257 +542742 +5427940112 +543017 +5430649 +5431410615 +5431600 +54321 +543210 +5432105 +543211 +543216 +5432167 +543219930 +54321PIDAN +5432322324 +543238 +5432A +5433209755 +54336494 +543375f8 +543427 +543521 +5435702 +543588608 +5436242882 +54385438 +543871 +5438841177 +543888 +5439189 +5439401 +5440529544 +544213a +544232652 +544247a +5442574776 +5443123217 +5443518112 +544352 +5444758964 +5445274131 +5445346286 +54455444 +544566 +5446 +544709913 +54474650 +54482948 +5450139 +545069 +545078707 +5451 +545234234 +5453666 +5454 +545454 +545454x +54546893 +545475545 +545486 +545537 +54568087 +5457585956 +54578925 +54581601 +545866 +545866963 +545h4 +546002 +54615461 +5462 +5464354643 +54655455 +5467a +5468472 +5468523535 +546897 +5469750909 +5470161269 +54702422 +547105 +547227 +5472614 +54735473 +547441 +547506 +5475160 +5477675 +54777 +547803574 +54780625 +5478231094 +547913 +5479307 +547955246 +547Seater +54805480 +54821235 +54826846 +548341112 +5484362 +5484656 +5484a6 +548582 +5487435 +548art +548c575 +5490 +5490673 +5491233 +54912585 +5492213 +5494932 +5494km +5496521 +54DeGroote +54R6 +54Tommy +54admin +54aec5e4 +54bd57 +54benson +54bronson +54bruce +54colocolo +54elisha +54f02bb8 +54fengzi +54fxdwg +54gogel +54homeworld +54k1qxgs +54midland +54mif +54niklas +54pcf +54r6 +54sgzh59 +54troublesome +54txd1r +54walii +54whatever +54whitegate +54yomero +55 +55 +5500048 +5500727 +550130 +550196775 +550450 +55055903 +5505931 +550720 +550758rw +550778 +550825 +55084146 +5510452 +5510586 +5511 +5512214 +5512689 +5513859 +55145514D +5515317 +5516217 +5516379551 +5516469 +551699 +5516priddle +551700 +551990 +551991 +552002 +5520159 +552032aa +5520408 +55210978 +55220065 +552233 +55223300 +55225522 +5522babygurl +55232736 +5523708 +552415 +552427a +5525 +552523 +5525369 +552557n +5526332 +5527 +5527058392 +5527504 +55278547 +5528054 +55284179 +552846 +5528464123 +5528601 +5528853 +5529475 +552gpkbx +55325532 +553273 +553311 +553353 +55336262 +55341843z +5536730 +55370056 +554 +55410570 +554142 +55419650 +5542 +55422849 +55425542 +55437673 +5543893 +5544 +5544 +554413 +554455 +55462855 +55467718 +554688 +55476718 +554855222 +555 +555000 +5550123 +555123 +55512388 +5552 +555222 +5552323 +5552781002 +5552885104 +5553018450 +5553209212 +5553316215 +5554197 +5554312 +555444666 +55545567 +555468 +5554845452 +5555 +555511 +555544 +5555499582 +55555 +5555522 +55555333 +555555 +5555555 +555556 +55556666 +555577778 +55558 +55558888 +5555Zazu +5556 +555652 +55566555 +555666 +5556789 +5556969 +555888 +555889 +5558sdf +5559623h +555bigman +555bj555 +555ioana555 +555nase +555slayer +555star +555timer +555vova +5561623 +5562000 +55630926 +5564213 +5564498 +55644jmw +5565854525 +55661203 +5566146261 +556644 +5566443 +556655 +5566789 +556688 +5566audi +5566tree +5567883 +55681554 +556882 +5568dcv +556935431 +556d11 +556htkr +556pev +556sticks +5570540 +55705570 +557059 +5570a +55711438 +5572194 +55730301 +557557kt +557580 +5576 +5576b7 +55772336 +557740 +5577522 +557788 +5577998866 +5580055800 +55810000 +55811297 +5581682 +55823788 +55823877 +55829712 +55830418 +5584146 +55842899 +55865586 +558822 +5588833 +5588jg +5588tr11 +55891081 +55911481 +5591Willy +5591west +559212 +5592d7 +5593872 +559529 +55953774 +5595551 +5597 +559799 +5599123 +55998v +559zns +55MILCHREIS +55adele +55admin +55c7ba9c +55chevy +55cm1972 +55euro +55f1l9 +55fb22fe +55fc3a4 +55fontana +55fuai55 +55googoo +55intel +55jb6969 +55jl812 +55joseph11 +55love10 +55mark66 +55mellem55 +55monash +55rr65 +55scatty +55smile +55strength +55super55 +560072 +5605542 +560560 +560711 +560761 +560862 +560ia +560nuke +560sel +5610040 +5610253 +5610e7a8 +5612 +5612003 +5612223 +56123110 +5612317 +561308 +561464no +5615101997 +5616471 +5617681 +5618022 +561949 +5619566 +5619648756 +56198354 +561kf +5620 +5620123562 +56205628 +5621 +56215621 +5621mollie +5622 +5622621 +562299 +56233790 +5625380 +562594 +5626 +562621 +5626210292 +5626430 +5627a +562987 +563 +5632178 +5632284 +5632451 +56328341 +5633014 +56332124 +5633605 +5634031682 +563412 +5635266 +5636 +56364889 +563685 +5637399 +5639 +5639150 +5641399 +564162 +5644144 +564417858 +56452z81 +564552 +5646 +564789 +564913 +564ajjm +565020 +5651486 +5651495 +5652 +565231 +565233 +5652858 +5654378 +5654634 +5654852 +5654cwhy +5655Baerbel +5656 +5656356 +565656 +565656 +56565656 +565675mx +56572240 +56578082 +56584747 +56590565 +5659925 +5659e +566$566 +5660235 +56606c4 +566174953 +566221965 +566299889 +56631789 +5663263 +5663840 +566543004 +56655665 +566556aa +566577880 +5666227 +5667 +566739 +566756 +56683 +5669 +567 +5670640 +5670882 +5671CS +567302 +56732151 +567348 +56738219a +5675050 +5675COR +567653074 +567698 +567828c +5678596 +56789 +567898765 +5678999 +56791307 +56798359 +567ERW +567af8 +567hff3 +567toni567 +56826666 +5684507 +56847973 +56850268 +5685065 +5686 +5686810 +5687 +56871fn +5688 +56890905 +5689758 +5690069 +5690392164 +5691 +56911919 +5691849a +5692692 +569293689 +5693502 +5693575 +56941142 +569568 +56965696 +5697917 +5697ge +5698 +569874123 +56995105 +56COWBOYS +56EF0F +56Roxanne +56Wilde +56a56ef +56aaron +56ab0126 +56admin +56b97z +56d77d21 +56fww +56gmp +56hummer +56inyourface +56lion58 +56lopu9 +56orochi +56pfl +56pmhf +56tascha +56terrence +56uccgrg +56viognier +56weiss +56yr87 +57 +570081504 +570099545 +5703179669 +570339090 +5704ygh +5705west +570825 +570911hg +570a531 +570fd +5710448m +571055 +57111 +571121 +571122em +5711390 +5711413 +5711876 +5711bf +5712667 +571295 +5713571357 +5713785 +5713nov +5714 +57143000 +5714515 +5714601 +571469 +5715286 +571632 +5716322340 +571737 +571756 +5718496+ +5718795b +57200 +572274 +5723520 +572519831 +5727 +5727247 +572823 +573112 +5731cue +57332524 +5734 +5735064 +5735234 +5735462 +5735912486 +5736896 +5736USN +573973 +573c258 +5740574 +5741265u +57416 +574270 +5749300 +5749975 +5757292 +575757 +5757720 +57579 +57585758 +575913073 +575danielle +5760urs +5761554 +5762301568 +57626369 +57638882 +5763956 +5765415 +57673184 +5767901589 +5768099086 +5769131b +57695769 +576wur +576zoe +57717896 +577187 +57735499 +5774601 +57784590 +577868901 +577wag +578021900 +5781400 +5782041 +57833982t +57841635 +578635 +578729 +5789 +579095 +57917290 +57917777 +5791duarte +5792820 +5793428 +57935168 +579695829 +57973007 +57985531 +579ugjuq +57Bakshish +57Christmas +57ROXANNE +57Variety +57artist +57bangbang +57bonbons +57chevy +57chriso +57computer +57crazy +57dannika +57de23da +57falcon +57jade03 +57jd8817 +57miller75 +57nb1yu7 +57r4k1s +57richard +57ryk3r +57sabourin +57spoons +57sydney +57theesalon +57thi +57xjm700 +57xjzw +57zach75 +580000 +5800600 +5801 +58023joe +580291521 +5806051 +580651 +5808firt +5809ken +580a!@#p +58115811 +5812360 +5813151 +58152244 +5818921362 +58192929 +581973 +581991 +582134 +5821436975 +58214dkp +5822201 +58222555 +582320713 +58235823 +5823856 +582407 +5824190255 +582458 +582509130 +58256 +58257240 +582582 +5826328 +582663680 +582684 +58272 +583 +58330084 +58352630 +583588 +58376sas +58409378 +58419466 +58433642 +5844049 +58461574 +5849014 +584a8f3e +585122699 +585225 +58542634 +5854271288 +585438mn +58545854 +5855676 +585569 +5856971 +5858 +585858 +58585858 +5858585858 +5858647 +58588171 +585984268 +586058 +586174 +58629425 +586467 +586470am +58647295 +586699 +5867349 +5867pg +5868675 +5869027 +58700123 +5870123 +587213 +58730575 +587305c +58748334 +5875 +587541523 +58764502 +58766282 +5879xac +587e514 +587ed363 +58803864 +58826435 +58834d +58855sj +58857559 +5886 +58863788 +5887415157 +588988 +58900sS +589100 +58911162 +58912191 +589151152 +58949589 +589507671 +58959196 +589600 +589627 +589632147 +58972465 +58973256 +589825949 +58FUCKU +58Pisang +58STUMPY +58Sl43 +58arsenal +58badtoelz +58d78e26 +58f7101 +58fawkes +58golfet +58hanadi +58jever +58k65 +58koeln +58ozan44 +58p4uz3d +58polly +58rabbit +58shebele +58sneg +58tweety +59040098 +590412 +59058 +59059056 +590624 +5908599 +591017xp +59110421 +59110623 +5911145 +591117 +5911681168 +59130 +591306050 +5913730 +591374268 +5914213 +5915 +59156 +59160c63 +5917413 +59192415 +591932 +591981 +592009 +59202332 +59203a3 +59205920 +5922277 +5922442560 +5924662643 +592482328 +592568 +59276985 +5928790 +592a69 +59302ed +59311028 +593296126 +59330593 +5934 +5934408 +59370209 +59373417 +593imi +5946295 +59465946 +594800 +59497236 +595001 +595063m +5951753 +59521521 +595296029 +595318 +595334348 +595398 +5955164 +595666 +5956792 +5957 +595719 +5957351 +595853 +595959 +5959678 +5959cm +59600394 +59608790 +59621eb +596499907 +596528 +59657123 +59658689 +59658791 +59670354 +5967e7a4 +596855 +596861 +5968807 +596dba +597211652 +597474 +597486 +597598599 +59761978 +597f62 +5981032147 +59813b3 +5982007 +59820159 +598373 +598439 +5985 +5985424 +59855985 +59864499 +59867760 +59871900 +59873e +5989 +599 +599007 +5992959929 +5993 +599443064 +5995735 +599577 +5996553455 +5997 +5998360 +599872589 +599956303 +5999afor +59Clancy +59DAWSON +59Keyring +59WfW5qA +59Yxcvbnm +59aqwzsx +59bellaa +59bernice +59cotton +59emkdih +59ex3c13 +59fgh99 +59gaynor +59grandpa +59guest +59jg62pd +59maggie +59nnepjf +59rs20 +59sandman +59tfe +59unsafe +5Aib2Z +5Alvador +5Cheyenne2 +5Gtlwd +5Henri +5L8QAG +5NRD02e193 +5Otc6 +5PSe11 +5PW8Uq +5QRe12 +5Ratte +5a1177 +5a123456 +5a2222 +5a3b1c +5a4b1c +5a60b4 +5a645636 +5a6f1c +5a6y2p +5a7ltfhm +5a88ut +5aFluffy +5ablackie +5abqh2w1 +5ac3007e +5ac9a2 +5acheese +5ad1d0c +5adey5 +5adharma +5aernest +5afreenet +5ajamelle +5ak7q +5akaushik +5alive5 +5am5ung +5amuncher +5apm4i +5apuggle +5arachel +5arah912 +5arcania5 +5as00ea +5aslo0 +5asunnyd +5avqr +5aw3veht +5aweetabix +5ayp4 +5azJ +5b0c1f +5b18c6 +5b24c649 +5b4647a0 +5b5b93 +5b72hyoo +5bSPINDLE +5bbummer +5bcerise +5be18 +5bekker5 +5beri212 +5bf101e +5bf653d3 +5bhoney +5bjackson +5bjimbo +5bjordan +5bkaitana +5bkoalas +5blue5 +5bmontanas +5boakland +5bommar +5bsamson +5bspitfire +5bswatch +5bysn +5c0tt13 +5c123456 +5c1235d2 +5c21cd +5c6ed297 +5c84e3e7 +5c999999 +5calibra +5cbanks +5cfa5675 +5cfooey +5cgwry +5cjazzjazz +5cmoney +5cnck +5confa +5cr4mb13 +5crubbish +5cwhites +5cwinston +5cztp7zr +5d123456 +5d1g175 +5d2519 +5d295e3c +5d442578 +5d5t6f +5d64a4 +5d6b27f +5d6de640 +5d7460fb +5d7p2qst +5d8df9 +5dadmin +5darkness +5dbobbob +5dbrisco +5dderekk +5df06 +5dginnke +5dharcourt +5dimogen +5djasper1 +5djiahui +5djulouu +5dm +5dmarlene +5dmarten +5dmetoo +5dorpiment +5dshanny +5dslider +5dsweater +5dwinnie +5dyui +5e0209b2 +5e0495f5 +5e1106 +5e11111 +5e30cc16 +5e4194 +5e4eb776 +5e7f3547 +5e982b +5eAncestor +5eJessie +5eadmin +5eafa +5ebecky +5ebugger +5econtemp +5ecosmo +5ecourtney +5ecyclonic +5edecision +5eek1tr +5eelfira +5egenesis +5egiovanni +5ehands +5ehappyboy +5ehoneymoon +5ejohnny5 +5ejuliette +5elaj7nz +5emaddie +5emissy +5eobelix +5eprefect +5eqwzzs +5erally +5esandy +5etilla +5ev4g +5evoronova +5f18a3f9 +5f1f2a +5f281186 +5f3db1 +5f53e31 +5f7488e2 +5f9126 +5fExtreme +5fWEHY +5fa463 +5fadmin +5fbei +5fc9753f +5feileen +5fflaky +5finsomnia +5fmagic +5fmomoney +5foot8 +5fquestion +5frieda +5frieda5 +5ftangar +5fthinking +5fthomas +5g6rhyzf +5gd9iz +5geor +5gghe +5gh47t8r +5gnlh +5haman15m +5hbxh +5hf5784 +5hgiv +5hlz4 +5hpq7 +5hslj386 +5hynezy +5i4xfy6 +5i5j +5i72ma6k +5iloveyou5 +5impsons +5ingor10 +5ipp4 +5irockz7 +5j644 +5j6o2e8 +5j97fr9 +5jan1969 +5jbwt6k4 +5jdxgqse +5je9m65x +5jl7f +5jllim4y +5jrdtjwh +5jtr7 +5jttp +5kNGJ +5kall5kada +5kasim +5kaste +5key1603 +5kflmpkh +5kids13 +5kilgann0n +5kmmvz7 +5kofi5 +5konijn +5l1mmer +5laender +5lcz9240 +5leo8 +5leseid7 +5letsirhc +5llfw +5luralistisk +5lyz0 +5m643 +5mdkcd +5mheqp +5million +5mmko5ah +5mufk +5mz7jtkj +5n4oawy9 +5narutos +5nbw0 +5ngrx +5nisan +5nmgda73 +5nmxg +5nslma +5numara +5nuyu +5o7o2l +5ohrw +5oi3fekr +5ojpv +5ol09va1 +5onn3n5ch31n +5onneberg +5oxls +5p1nm3 +5p33d08 +5p4c384r +5p601 +5p95m7 +5pagbol +5ph8a +5phere +5phvcx +5poppin +5ppyd +5premf8 +5psd2571 +5pso1 +5pte17 +5q5xg +5qa11 +5qbyiw8h +5qcoukae +5qj7wg36 +5qjic9t7 +5qmgz +5qs2cent +5qswst +5r11p +5r5r5r5r +5r995 +5rabbit55 +5rdx6tfc +5rho2 +5roel5 +5s6738 +5sciu5x +5sd8sx0 +5senftenberg +5smcy +5spitfire +5srhi +5starmom +5starz +5sx81vss +5sxx2 +5t33l3r5 +5t4nd4rd +5t6gLF +5tandrews +5tarwarS +5tgbasdf +5tgbhu8 +5thm8i +5tnmqd +5tp4z +5tprn +5tr0nz1 +5tr4taha +5tu8e +5u1tsa +5u44qw +5uabg +5ucc35 +5ud0ku +5udub +5ue7c +5uesoa4f +5ugg3s7 +5un1ight +5up7b6 +5uperStar +5urfin9 +5uskri +5uyb9uyr +5v2j19ak +5v3o7p3e +5v3o7p3r +5v44z +5v857 +5vce0 +5vei9 +5vordemberg +5vt1ums2 +5w1gr4 +5wdfs +5wobly5 +5wosy +5wqkm +5wry6 +5wszidm2 +5x2yer +5x32 +5xkrh +5xl5fb5 +5xsivert +5xyugxh1 +5yr1nx +5yw2arm4 +5yydz +5zar2a +5zc3notz +5zdpir92 +5zilj +5zmn7 +5zvuw +6 +6&HA9!Y +60 +6000347572 +600071 +600082 +600119986 +60013759 +60017472 +600187 +60025 +600270819 +600327756 +6003578 +6004171273 +600422 +600666 +60076007 +600872551 +600bench +600nitro +600two +6010 +601010 +601019ff +60110405 +6011711 +6011_SA +6012340316 +60123456 +601246152 +60126012 +6013 +6013020 +60152885 +60159302 +6016242479 +60176017 +6017866798 +601902638 +6019132 +6019437a +6020002 +6020628040 +60210631 +60233560 +602418 +602469 +6024902 +60262697 +6026277 +6026366 +6027774 +6027904 +60281858 +60285830 +602912as +6029542 +6029anne +60301129 +60309142 +6031353 +6032684 +603411138 +60343cd0 +603504 +60350458a +603812 +60386336 +6039 +603p65 +6040627 +60409032 +604160 +60434165 +604389016 +6047207806 +6047295 +60474 +605040 +60512807 +60516051 +6051944 +60535074 +6053771 +605842165 +6059427 +60603381 +606040 +60606060 +60609 +6060da +60615085 +60619405 +606199733 +606254188 +606289332 +60629078e +606357 +60636063 +606628 +606656 +60666115 +606773 +6067989 +606805758 +60689 +606998909 +606gzhwe +606kf40b +606v2 +607 +607260071 +607304f +60734287 +6073760737 +6073909 +607400 +607634350 +607808544 +6080106080 +6080315 +608180044 +608269258 +6083e +6084418 +608550186 +608608 +608676385 +608840 +60906090 +6090638449 +60914t +609231429 +60924890 +60928888 +60933428 +60940 +609419 +609501597 +609506 +6095817235 +60965350 +609714712 +60986098 +6099073 +609930577 +60Allied +60bc43 +60butterflies +60c062 +60dementia +60ds8ru +60gaetano +60iHU +60kh4n +60kmx7yd +60lanzar +60monty +60nero01 +60odessa +60trieni +60tuff1 +610044120 +61004888 +61013840 +6101949 +610242 +610253520 +610289 +610315 +610327 +61050045 +6106334389 +610658 +610742839 +610976 +611008 +611008qq +6110161061 +61116 +61124 +61128240 +6113814 +6114002b +61144814a +6114713 +611611 +6118162 +6118453137 +611992 +611a66b9 +611tiger +61200 +612000 +6120753 +61214111 +6121990 +61231080 +6123446 +61238477 +6125805 +612622 +612667 +61267 +61269387 +612850 +61295670 +61311059 +613212737 +6132741 +6133216 +61343808 +6134oyun +6134ts +6136lr +613854688 +6138af +613934146 +613939 +613971 +6140 +614069 +6142178213 +614297983 +61435523 +61443714 +614501 +6145152 +6145375 +614755636 +6148c42 +6150 +615294 +6153625 +61538 +615423 +61555493 +61558911 +615629 +61580658a +615826 +615846ma +6159 +616010rm +616016725 +616082463 +616082jh +6160902 +6161 +616161 +61616161 +6161616171 +6162 +61628494 +61630 +6163305 +616383 +616411363 +6164185 +6164241 +6164259 +61666197 +6167 +61679677 +616939 +616jv +617033640 +6170e7 +61712bc7 +6171610 +61716171 +617207062 +61746174 +61782587 +6179512 +61795797 +6180 +61806180 +61814250 +61823192 +6183260295 +6183nick +61874878 +6188128 +61893837 +6192348282 +619428735 +619536q +6195u +619686516 +61976903 +619947611 +619Rey +61Jennifer +61ashley +61ba09 +61bikes +61btnn +61charline +61f009ce +61hellome +61hopeful +61jetski +61lu40 +61lvh +61moonstar +61qwerty +61raymond +61reissue +61scumbag +6200401 +62004990 +620193 +62020313 +62021405 +6202215 +6203066 +620344038 +620510964 +6205748 +6206113299 +620671319 +62076019 +62078380 +6209 +6209320 +620972 +620bol +62100000 +621009 +62101900 +621023 +621083700 +6211 +6212067 +621235 +62124572 +6212898 +6214699 +621481 +6215128 +62158653 +621722 +62186681 +621926 +621929 +621hilal +621upass +6220 +622178 +6222328 +6223522 +6224736 +6224885 +6225961 +6225tw84 +62271005 +62272727 +6227sc +622b224 +62306230 +62308036 +6231 +6231124 +6231398 +6231697 +6231976 +6232063 +623572 +62363240 +6237285 +623868060 +6238985572 +6239 +623bb9 +62416241d +624391682 +6244426 +6245a9 +6246246246 +6246cb +624701a +6249513232 +62497393 +624bhy +62506 +62506a9 +6251140 +625129273 +62515124 +62517993 +62524e +6259117 +62600917 +626010887 +626057 +626106 +6262 +62621265 +6262255 +6263899202 +62642623 +62644199 +6264465887 +626538423 +62666 +626688 +62681022 +627027284 +627058 +6270774056 +627148058 +627169 +62732 +627380320 +6275zewa +627654754 +62768626 +627687 +62771134 +6277603 +627881210 +6279061 +627ed1 +627ob +62801917 +6281280 +62812808 +6282224 +62827123 +628305c +62830aa2 +62846284 +6285 +628811 +628833 +628888 +6289336 +6289380 +6289habeas +628pl0 +6290jul +629189 +629199 +629257894 +6292708 +629316001 +6293740 +62946411 +629627de +629629 +62976297 +629oTe +62Lachlan +62a5978d +62abnet +62allan +62auckland +62blades +62cadi +62ct81pt +62de0a8 +62eab71e +62harmony +62hwxtw2 +62kill62 +62knight +62l42 +62laklba +62linkin +62ljmjmf +62memory +62sexton +62shitface +62ssv +62x9ql +62yyl +62zarah +630008 +630106 +6301643 +6301900 +6302224 +630280454 +6303347567 +63040687 +63044102 +6304434 +630445 +6304515 +63060338 +630709900 +630914 +630wolle +631005 +6310240 +6311381138 +631207 +631228 +6313085 +631436124 +631763004 +63182265 +6318276 +631850 +631987 +631993 +632 +632008 +6320101991 +632032 +6321071101 +632121 +63214988 +632156 +6321589 +6321777777 +6321947 +632203 +63220898 +6323274 +63232755 +6323363 +6323632 +6325115921 +63254687 +632797 +6328193p +63294 +632962 +632fe6 +633010 +633150g +6332556 +6332904 +63357ts +6336660 +6339603 +633eagle +63400742 +63429060 +6345789 +634827 +634bd2aa +63556355 +635608591 +635635635 +6356793 +635829 +635836 +6359402 +6359bill +636119 +6361691 +63624400 +63628278 +636363 +6364225 +63651234 +636585669 +636630522 +636788 +63696701 +63699990 +636a751 +63723 +63725000 +6372816718 +6372harry +637442 +637565nb +63758499 +63786357 +63819 +63830898 +63865789 +6387381 +63876287 +6388512 +638a77cf +63901113 +639178536 +6392272513 +639328524 +639377 +639395 +6394212 +639526881 +63981530 +63a6902a +63ambika +63b6b240 +63b932 +63br0nt +63cb2d8 +63devil +63dongan +63encase +63garet +63gej +63gemini +63gumby +63hg89ng +63imperial +63jdobem +63laurene +63livro +63moltil +63n3s1s +63niyamat +63overlord +63pass +63rossi +63semigloss +63sgw6g0 +63tullia +63zyw +6400059077 +640050 +6400707 +640205 +64023737 +6402535 +6402seeker +6403087062 +640310 +64053857 +64056700 +6407186952 +640726 +6410 +641010 +6410212427 +64109c +641121 +6411250 +6411662 +641234 +641370 +64141335 +641502 +64152185 +641536 +641553 +64156415 +6416979 +64171815 +6418800 +6418837 +64195306 +6419b62 +6420000 +6423088 +6423381 +6423505 +6423846 +64244 +6424655 +6424jan +6425421 +6425766 +6425cb +642634 +642651 +64276427 +64282864 +642891787 +6429 +6429457 +642sammy +6430605 +64308525 +6431458 +6431480 +64324xxx +64334360 +643537 +6436222 +6437657 +6439dprb +643djay +6440086 +6441336 +644200 +6442216 +6442596 +64426442 +6443 +6444808 +6447412302 +6448084 +6448344 +6448353 +644bfn +644lords +644zegre +64501973 +645142784 +645151390 +6452828 +645285 +645349602 +64536986 +645387 +645428 +645865686 +645j4 +6461229 +646190296 +646318032 +646370 +646452646 +646478 +64649999 +6464kk8 +6467901 +646981 +647010 +647312cd +64746474 +6474shan +6475147 +6475478 +6479 +647and21 +64806480 +6480998 +64810410 +6481884 +64823719 +648260 +648264859 +64832063 +6485247 +648731791 +64879932 +649041110 +6490ar +6496412b +64980509 +64986 +64986498 +64E25 +64Knaben +64ac0901 +64aeba +64b655 +64b8df +64bigboy +64braza64 +64ca68pp +64corolla +64d63792 +64dbe6 +64e6aa08 +64edvvuf +64fletcher +64i4 +64iuf +64koolest +64lne +64my84 +64n9c28h +64nugget +64pdqfod +64qztu +64sampson +64tbird +64transformed +64trixie +65001009 +65003227 +650092657 +6500a918 +65015024 +650229 +650229s +6502570 +6502bud +650428 +650463496 +650474 +650506 +650541 +650599218 +6506161110 +65067373 +650747807 +6508078 +650893146 +650Hedge +651023037 +651028 +65110286 +65110583 +65117229 +651175 +6511850 +651223 +6512411 +6513412 +651342 +6514 +6515 +65153565 +651651651 +65192111 +651937 +651985 +651f19 +6520181 +6520phil +6521111111 +6521221 +652209629 +6523145652 +6523894521 +6524 +652526864 +652635 +6526522 +65270 +6527017 +6527871 +65278937 +652819156 +653105013 +653105743 +6531136 +65312163 +653142 +65315528 +6532738 +6533263 +653364 +6533652 +6533970 +653411426 +65350776 +65351656 +6535kv +6536hx +6537114511 +6537194 +6538 +653951 +6539x +653gifford +6540 +6540249 +654123 +654123789 +6542018 +654207737 +6542250 +654239407 +6542647 +6542693 +65428352 +654321 +6543210 +6543211 +65432120 +654321987 +654321ab +654321qq +654321tt +65436987 +6543asdf +654457 +6545281 +654599002 +6545niki +654654456 +6547 +6547742 +654789321 +6547896321 +654813843 +654852 +6548868868 +654902 +654910054 +65494270 +654987 +6549qae2 +654asd +654bnm +654dfg +65502517 +6550365503 +655055 +65506550 +65522031 +6552303 +6552453 +655252415 +6552564711 +655336468 +65534605 +65536 +6553831 +65539355 +655557700 +65556259 +6557vf +6558231 +6558760 +6559 +65590940 +65598 +6561117 +6561465 +65614800 +6562581 +6562995 +65646796 +65654322 +656550 +6565665 +6565jr +6565lacy +6566450 +656696 +6568547 +6568795 +6568889 +656896 +65696569 +65700666 +6570650 +6571190 +6571321 +65724810 +657293 +65729300 +6576 +657647 +6576851055 +65773805 +657zd5c3 +6580508 +6580fc +6581221 +6581466 +65814668 +658149206 +658152 +658309578 +6583768 +65846584 +658478 +6585098 +658633 +6586988698 +6587169 +658754 +658785 +6587XX +6588hei +658undos +6591543 +65921412 +65928667 +659303 +65930302 +65954487 +65965496 +659699 +65979 +65A7XX +65DUFFY +65KINGS +65amanda +65bluejean +65espresso +65farmer +65fleming +65golfet +65guitar +65holiday +65holly +65i68 +65jaijai +65mhb +65michelle +65murphy +65prestige +65pulsate +65u8vp13 +65waffle +65x7zq +65y2hmki +6600 +66006600 +660080126 +660092436 +6600958 +660124 +660151348 +6602073 +660226 +66027269 +6603 +66037742 +660430 +660432639 +6604mungie +660534027 +660536 +6606 +66060016 +6606077433 +6606111 +6606419 +660684 +660685395 +660705 +660717 +660827 +660845652 +660856 +660884605 +66089183 +660912 +660930 +660967 +660988ad +661001 +661010925 +661033 +66103310 +661132527 +66113300 +661196683 +66120ffe +66121971 +661288 +66138257 +66141909 +6614353 +66156262 +6617 +661702777 +661817796 +6618ee +661903C +66193613 +6619364 +661984NF +661987 +661989 +66199212 +661dfcff +6621034 +66211266 +6623362 +66244447 +66246596 +6625172488 +66254262 +6625630 +6625dolphins +66260092 +6626022 +662671 +66269210 +6628767 +6629bbvd +66305518 +6630619 +66306190 +66315015 +6632 +66325418a +66381 +663873 +6638kl +663DAJ +6641252 +664228399 +664369kd +6644 +664466 +6644766752 +66479973 +664884 +6649504 +66496649 +6650416 +66523960 +66523960 +6652fc +665416386 +66542331 +6654363 +665463 +66553760 +665623 +665629896 +665665 +665804 +6658158 +6658584 +666 +666012 +6660139 +666111 +66611346 +6661212 +666127878 +6661518 +666222 +6663025 +6663215 +666452504 +666518513 +666539413 +66658693 +6666 +66666 +666666 +66666666 +666666666 +666666xx +66668866 +66669466 +66669999 +6666liam +6666oo +6666rjh +6667495576 +666769 +6667771 +666777888 +666898512 +66690588 +666940211 +666942 +6669871828 +666999 +666999mg +666LORDI +666Levi666 +666Sunny +666bad666 +666carcass666 +666conrad +666dem +666hateme666 +666hell +666huji +666kdhz +666mdf +666satan +666sinner +667013780 +6671 +66711 +66712944 +66716679 +667213 +667226544 +667296678 +66745936 +6675423 +667604108 +667607633 +6676cea +66777717 +667788 +667966 +667ghq +6681492 +6681502 +6682052 +6682724 +668295248 +668331 +6683lc +66847 +668489 +66849706 +6685241 +6686686686 +66876687 +668800@ +66887843x +6689090339 +66903 +6690581 +669122212 +669215853 +669404078 +6695002 +669601 +66966966 +6696834 +669688903 +66993315 +669966 +66Brooklynn +66POLICE +66PeterPan +66a +66b1cu3u +66birthing +66bypbzz +66c31445 +66c933 +66cactus +66ce5f +66charlie +66charlotte +66chickpeas +66christine +66crimson6 +66crush +66davedave +66duane +66dvp11 +66fearless +66galaxie +66gvcia +66hateem +66holm66 +66jellyfish +66jiq +66king66 +66mkxk +66mtree +66qzwem +66rn001 +66skippy +66spirit +66stammheim +66stefan +66stupid +66surbiton +6700294 +670071 +6700ueg +670128 +670208 +670318 +670369321 +6706442 +67082e +670899 +670912 +670926 +670matan +6710076925 +6710159 +6711156 +6711acht +6712120315 +67136713 +67142750 +671850 +671875 +671946 +671968 +671turnings +6720 +6720421 +6720974 +672107 +6721637 +6722 +672220 +672245 +67232659 +672390 +67242890 +672491 +6725113277 +67265800 +67268ddc +67282807 +672973dc +673001 +6730293 +6730667 +67343 +67352866 +67359950 +674 +67400377 +6740226 +6741343 +67414c4 +67439 +67453025 +67455149 +674565758 +6746514 +67466ll +6746828 +6746934 +67486748 +67495532 +674bilbo +67503155 +67512 +675141 +675164836 +67518888 +675230 +675243cb +6754339 +6754gb +675731 +6757432 +67582480 +6758493j +6760591 +676194024 +67619596 +67629357 +676355 +67652820 +676767 +6767gemm +6770 +677012 +6770225 +67714542 +677254413 +6773743380 +677602 +677718 +67772528 +678000 +678002 +6780120 +67802055 +678098369 +678131427 +67820 +6783569 +678456234 +67847173 +678513302 +6786 +67861 +67866786 +6787211 +67877641 +678789 +67880325 +6789000 +678910 +678914820 +67897062 +6789865 +678joe +6790174 +679100 +6791851 +6792 +679241263 +6792467924 +679284546 +6793a042 +6794kurt +679575803 +6796666 +6799 +67999976 +679a68e +679dea +679jjs +67CORNELIA +67Natascha +67adbcf1 +67atam43 +67barefeet +67bessie +67bv89sx +67d8bc +67daddc3 +67demo +67dk93fr +67dusty4 +67erth +67esa +67gabriel +67gt56f +67julia +67jutah3 +67landau +67matthew +67n5oe9q +67okn +67olamiji +67path01 +67sheryl +67tr45 +67trueno +67velouria +67vodafone +67wasa +67x3y1a +67x93h06 +67y7m12d +6801291087 +6802012614 +680213433 +680236 +68031341 +6804 +6805680500 +680727 +680815 +680820 +68095667 +6809931 +680holly +681032 +6811040467 +6811193111 +6812299 +68124658 +6812621262 +6812916 +6813415216 +68146600 +6815 +6817476 +681872413 +6819533 +6819541 +68206183 +68207426 +682226644 +682239 +682239552 +6824837 +682682 +6828ad +682ct +68303232 +68313808 +68315 +683268 +6832nb +68336833 +6834acac +68360326 +6836460 +683691209 +68377961 +68382701 +683e628 +68410412 +684268 +6843457 +68434574 +684345745 +6843b7 +6846oguz +6847218 +68474383 +68487487 +6849598 +684h7xxx +685000 +68502151 +685050157 +685148 +6852075 +68542060 +685511582 +68553562 +685598 +685630 +6857095 +68572000 +685magty +6860223 +6860806 +6861180 +6861408 +686182 +686225202 +6864524 +686559 +68665104 +68666604 +6866800 +6866883333 +6868181 +68681994 +686829 +6868585 +686868 +686868wht +6869 +686923935 +686929 +68695 +68699799 +687097 +687203832 +687208 +68728123 +68743986 +68748862 +6875433 +6876371 +68765187 +687818089 +6878656 +6878dav +687915 +6879vl +688276 +68828c +688358 +68842464 +688592100 +6886329887 +688673 +688699xp +6887 +68877728 +6888233 +6888674 +68896340 +689137 +689201 +68920136 +6898020 +6898213 +68FOOTBALL +68aou123 +68attitude +68b616 +68b7dc +68bathroom +68bb7b3 +68camus +68d30 +68daniel +68dfa7 +68dssodr +68e1362 +68evr +68f1b731 +68g344a +68ia267m +68lennox +68milhouse +68mz08jq +68oliver +68police +68samira +68ucceet +69 +690010 +690066 +690101 +69010dss +6901153 +690116445 +6901250000 +69025306 +6903024 +69031c8e +690325 +6903609 +69052712 +690606 +6908172 +6908392c +690927 +690f326 +69100011 +691110 +69115CB +69133256 +691369 +691458 +6915225 +69171119 +691961 +691password +692012505 +6921540m +69222511a +6922262 +6923752 +692649 +6926499 +69264999 +692802273 +6928228 +692887 +692974750 +692981321 +69313810e +69323 +6934020024 +6934080758 +6934084376 +69346895 +693485002 +69356596 +69356636 +69357404 +6936305397 +6936535694 +6936914628 +6936933797 +6937355702 +693779333 +6937939023 +6938885498 +69400 +6942861971 +6942931064 +69436943 +6944332741 +694479613 +6944971400 +6945382 +6945595924 +6946066980 +6946439988 +6946900318 +6947495988 +6947496696 +6948756538 +69488406 +694908659 +69501221 +6950gnat +69516951 +69526022 +69537337 +6954546 +6955004a +69553 +695554746 +695726713 +69584yra +6958649 +69587152 +69596595 +69603031 +6961160 +696328787 +696398159 +696444991 +696454893 +696534400 +6965f2d +6966450 +6966669 +696744561 +6967643 +6967683 +6969 +6969092 +696969 +69696969 +696996 +6969lister +6969o3 +6969vb +696ab827 +696hook +6970200 +6971533616 +6972146975 +6972203925 +697247725 +69725633 +6973410350 +6973unes +6974370008 +6975670 +697609116 +697738d +697775 +69784525 +6978623256 +6978896503 +6979721102 +6980491 +69815 +6981838461 +698188 +6982311667 +6983026898 +69847265 +6985921626 +698741235 +698923 +698noidt +6990 +699164206 +69921511 +69926992 +6993201126 +6993586322 +699399053 +6995 +6996364188 +699650666 +699669 +6998336687 +6998501965 +69985919 +6999753 +6999965 +699c23 +69BUNNEY +69Eyes +69Gibson +69Ginger +69alex69 +69alexis +69almond +69anytime +69b07be +69b2e148 +69baaba +69bhogh +69bhvzob +69brecht69 +69c1ff +69coronet +69cunts +69db22bf +69esma +69fafc +69jena69 +69jtkdg3 +69kelsey69 +69krishna +69logitech +69mariet +69molina +69monkies +69otp7 +69pervert +69primus +69reece +69richards +69royal69 +69slayer +69tbird +69timoth +69volvo +69walker +69wjhb +69woof96 +69wookie69 +69ybhyh +6A8714 +6B5BA +6C3F5 +6JSBRF +6PjsKs7p +6Ranger6 +6Svv9W +6VKUln +6a3d1034 +6a465 +6a563d6b +6a5b2b8b +6a5oh +6a6a6a +6a7b1992 +6aa6bc3a +6aadmin +6aaf1ef +6abarney +6acbc2 +6af22bc +6af61ef +6afatima +6afunny +6ah3qfrg +6aribble +6arpei +6asasha +6aseasons +6ax5993v +6az8cok +6azbaise +6b222222 +6b23d4 +6b3228 +6b59bcd8 +6b878c +6backy6 +6balyssa +6banderas +6bb6s +6bbrayden +6bbucmfs +6bcherry1 +6bcuk +6beavis9 +6bf4af +6bf78a66 +6bfucku +6bgreene +6bidon +6bkailash +6bluemax +6bmc8 +6bmybabies +6bripper +6bsenedu +6bspencer +6bsteve +6bvk0 +6c10p79 +6c1464aa +6c17ae22 +6c25cdf +6c51cf63 +6c5e586 +6c833b +6cPASSWORD +6ca2b +6carezza6 +6cbogart +6cd02 +6cdoreen +6ce37c1d +6ce9e39d +6celcius +6cf1cxdh +6cfuckoff +6cgarbage +6chassan +6chqf +6chsr +6cintertan +6ckaikoura +6cletus6 +6cmiranda +6cmusicals +6conny66 +6cpabst +6cqnj +6csarosi +6csnuffy +6csunrise +6d02e5 +6d2db6 +6d4a2v3i +6d592da +6dHAMISH +6dLazarus +6da890 +6dacb38 +6daduxlx +6dav7475 +6dbulldog +6dc148f1 +6dc5496 +6dc92bde +6ddexter +6de176a +6de3e4 +6death9 +6dhu762g +6djabber +6djustdoit +6dlwp +6dollars +6dom134 +6dpugsley +6dsummer +6dwayne1 +6dyamaha +6e0879 +6e1081 +6e18289 +6e24a89c +6e2d35eb +6e4c0d +6e5g21hx +6e64268 +6e7c23 +6e8047 +6e84f9 +6e9643 +6eCharlie +6eTOBAGO +6eanimat +6earboles +6easdasd +6ebb6d +6ebd04a6 +6ebecky +6ebetty +6ebottom +6ecarson +6ecopper +6ed871 +6ed89f +6ee7d171 +6eebass +6eextreme +6ejuventus +6emagic +6emassiv +6emonster +6erUIN +6eschnuffi +6escorpion +6esjvuff +6esko +6essington +6etekken +6eue1cps +6eysf +6f28gmm +6f3ec09 +6f62e4c +6f65648 +6f7e49 +6fAcrobat +6fa6le +6fab206 +6fandres +6fangels2 +6fc2ef +6fcabbage +6fchingy +6fcm8 +6fd2f4 +6fdoggies +6feaq +6fhell0u +6fjz94 +6flin +6fmatchbox +6fmuncher +6fn2ioty +6fplastic +6frouter +6fsatana +6fstella +6fstylus +6fwoodshop +6fxzu9cj +6g2mjiuf +6g7d0s8 +6gdqulj9 +6glz8 +6grainer6 +6grange6 +6gxxd73v +6h3is +6heerve +6hexadien6 +6hpjl +6hspk +6i8ut +6i91vw +6il7vef5 +6inatten +6irs0tga +6isnews +6ix88g7g +6j2pp98r +6jdjdk +6jjif +6jkn8 +6jmhp +6jnqu +6jrpru +6jvpp +6k098ugx +6kfg9vhv +6ki0k +6killers +6kral6 +6krtb +6kwonxmv +6lduhf +6lizz1 +6lkvq +6lmnx +6lulabell66 +6lv2ou +6lvoy +6lwze +6ly7bgcr +6m7sjc +6macm +6manu4 +6mlkjhg6 +6moftn87 +6moocow7 +6mtve +6muhaba9 +6mwn5y +6n2a8moy +6n3anj +6n3vy7e +6n4sqp +6n6x9a +6naiv +6nffr +6nzuj82m +6oo6ii +6owb1 +6p279 +6p5d4r3s +6p94eg00 +6paska9 +6pdy9 +6phn6 +6pkog +6plo77k +6pnpd7pg +6poofy9 +6qfpg +6qlxk +6qoe8 +6r1782 +6reashin +6rgjvazu +6ria2lat +6rjpp +6rlk4jtp +6rooney6 +6rpJNU +6rs6edy +6rxk5 +6s6fwsf2 +6sa6ta6n +6sdx9 +6sex66 +6sh7vq4z +6shaq +6sigma +6slg2 +6slices +6snyppau +6so19ntt +6sotona6 +6souls +6sprity6 +6ssdv +6sylvester +6syrs +6ta5a +6tgbnhy7 +6tx7qb62 +6ty7Mf +6u0k86 +6ucred3p +6ufet +6v1jr +6v396 +6v419 +6v8qvstg +6vnjdb +6walsing +6wmsx +6wqs1 +6wr7s +6wu3l +6xcpc8bq +6xnolhtb +6yetd8 +6yhn6yhn +6yhnji9 +6yza0 +6zgef +6zsp2l3 +6zta3 +6zwrrqw +6zyjy +7 +7000189 +700116 +700123 +7002051985 +7003 +700324 +700456 +700477ac +7005 +700523 +7006120670 +7006131903 +70067455 +7007 +7007 +700726 +70080m +700902 +700rima +70100830 +70100bny +701015 +7010312210 +70106533 +70110036 +701109 +70112068 +701212 +70125acg +70150 +70152686 +701562 +701574008 +70197019 +701clh +701n10 +701uq +702000126 +702051 +70220566 +7025431 +702562 +702emerica +7031337 +7032 +703210 +703564 +7036sari +7037303 +7037herz +7041 +70424z +7044s55 +704599219 +7045n +70462779 +70485621 +7048791 +704gct +70504090 +70547676 +7055 +705631001 +70590643 +705942 +70637011 +70644 +70685706 +707070 +7071915a +707252696 +7073352 +707434531 +7074475 +70763521 +7076948 +70773170 +7077904806 +7079154 +707988 +707nessa +70804891 +7081ml +7081tp +7082629992 +70835409 +708410 +708426 +708600 +70864444 +70867086 +70878787 +70886243 +70887088 +7088827422 +7089798 +70919286 +709333 +709394 +7093bs +70944907 +709760 +709panda +70ESCALADE +70Prelude +70annette +70ashlyn2003 +70cd04 +70dogfish +70er2eha +70jrb0z4 +70ktd +70laci12 +70laurenm +70opelgt +70payno +70roots +70schatzie +70shell +70tax3oo +70tinajo +71015385x +710194000 +7101ec +7102001 +7102198 +7103152 +7103427952 +71037103 +71039556 +71041108 +7105176386 +7105277946 +7105304002 +7105567 +71057105 +71058186 +710724 +710750108 +71091783 +7109988 +711005zx +71108623 +7111023 +711120921 +711250682 +711420222 +7115017 +71150897 +7115625 +7115736 +71158905 +71160c4 +7116518 +711662667 +711681 +7117363793 +711777 +711ks711 +711ryazan +7120 +712005 +7120217 +7120234 +712037 +7121990 +7122002 +71231 +7123447 +7123471499 +7123528194 +7125693 +7126363 +7126kyra +7128001 +71281as +7129166 +7129171291 +71296 +71308155 +713101 +7132307177 +713530 +713576 +7136ad88 +713705 +71370537 +7137506 +7139 +713928465 +713v925t +7140e30e +7141412 +7141859 +7141984C +7142110 +7142gw +71437592 +71439766h +714420pp +71446255 +7144corne +71452863m +71456505j +7146546 +714711 +714769167 +7148177 +714quaalude +715082 +71510088 +7152375 +715268 +7154420 +71559563 +715638109 +7157505 +7158 +71584354 +715a34 +715b6d0c +715z8348 +716051 +716189 +71633081 +71650039 +71655505 +71673364 +7171 +71713672 +7171454 +717171 +717273 +7172970 +71731716 +717601 +717753 +71779084 +71799032 +717fots +717ju8 +718049 +71810458 +71830 +71830440 +718321 +7183578338 +7184 +7187eaf +7188409020 +7189 +71893488 +71897189 +71897954t +718P5 +718ocs35 +71901790 +719212 +7194343 +7197806 +71986000 +719987 +71a0c2 +71a9u8su +71addison +71alesis +71artur +71blondie +71cb6a +71d305 +71da75fi +71f1a +71f572 +71falkland +71gopal +71jesuschrist +71maboda +71master +71mrburns +71myster +71reuben +71roxette +71v3emyo +71x1337 +720 +7200433 +72007 +7201177207 +7201250 +72020 +720404 +72058 +720720 +7208 +720818 +720825 +720921 +7210137602 +721020952 +721103 +72111 +7211935 +72120606 +721292 +72141993 +72142b3 +7214ha +7215252 +72170371 +7217206 +721721771 +7217276 +721855 +72191311 +7219142170 +7219214 +721986809 +7219lisa +721ec1 +72200000 +7220339798 +7220f7 +7221059a +7221dkg +72227328 +7222984 +7223006 +7223RR +7224283 +722gw3xp +7230043 +72308 +72317l +723210 +7232258 +723226 +723226e +72328973 +7233170 +7233476 +72343 +723477957 +723521 +7237 +72373796 +723738703 +723772356 +7239714787 +723f22 +7240215 +7241410 +724142319 +724595 +7245b25 +7246137 +7246ex +72471616 +72475d +724859 +724b9903 +724rdl +724wbot +7251070 +7251151 +72511942 +7253172531 +7253259 +7253454a +72551319 +72580123 +7258249 +725833 +725876 +7258800 +725898 +726289 +7263388 +7263414 +726482 +7266214 +726729 +72674 +7268112 +726905ec +7269875e +7270392 +72719423 +727272 +72728108 +727294 +727419a +72757275 +727620 +7276569 +72766 +72779673 +72787878 +7278mimi +7279706f +728003368 +72804169s +728048250 +728066640 +7280769 +7282226 +72831050 +728459815 +7284voices +728645ba +72864978q +728657 +72866258 +7287638 +72890012 +7289116 +72919774 +72920875 +7295star +72965944 +72971013 +7297550 +7297655 +72979132 +729813 +729881698 +72afc57 +72anutza +72batman +72bulldog +72carrie +72df83 +72ege +72hicham +72icb8 +72iris19 +72kakariki +72keystone +72lh6525 +72monte +72murchison +72pajarraco +72q946 +72samara +72seasaw +72silence +72thecure +72through +72uruguay +72weedseed +72x90 +73 +73000 +730096 +7302 +7302090211 +73022288 +7303094777 +730322485 +7305517 +730704652 +73079su +730821 +73095f +73095mjc +73096134 +7309849 +7309973099 +7310014032 +731013 +7310280404 +73102873 +73109581 +7311072 +73112048 +73112358 +7312027300 +731208q +731209050 +731336467 +73136101 +731415 +731716 +731748325 +731815394 +73193642 +73194682 +731950 +731956482 +7319824650 +731984 +732053870 +7323679678 +7325901z +732808x1 +732904436 +7329166 +7329474 +73311337 +73313 +7332 +733243 +73329 +7334127a +7334822 +733599853 +7336282 +7337399 +733779854 +733798 +73385953 +7340110 +7345285 +7345786 +7346666 +734681 +73479306 +73480308 +734837 +734925 +7349723 +7349pq +73501471 +7350849 +73517824 +735210 +735226 +735320 +7353571 +7353870 +7355608 +7356218 +73564183v +73566472 +7356764628 +73570R +735763 +7358570 +7360280 +736110470 +7363 +7363411 +7363426 +736377 +7365dy +7366767 +736691 +7366beef +736759 +73682323 +7369302 +737262205 +7373 +737351141 +737373 +7374950102 +7375062 +73773 +737J4 +737jxg +73801980 +738310 +73845290 +73845510 +7385661 +7387 +738853 +7388b4c4 +7391581 +7391852 +7391948 +7393225 +7394 +739464 +739482458 +73981671 +73993446 +73994565 +739999a +739c6b +73Sportster +73a428 +73a649b8 +73amadeus +73atlanta +73bluebell +73bojszi +73butterfly +73cassandra +73e5ea +73effd9 +73fn78 +73giveup +73hokies +73jesuschrist +73kingston +73leftover +73merchants +73nightlife +73nkp34 +73oliver +73privat73 +73snowball +74 +740307 +7403142004 +7404108520 +7404280463 +7405356 +740577bs +7406037 +7406186883 +7406446390 +740695 +740754 +7407865 +7408116 +740826 +7408267408 +740853f +740912 +7410 +7410 +741014 +741019 +741056 +74108 +74108520 +7410852963 +7410rt +741106000 +741111 +741147 +74116be +741206 +74123 +741233 +7412369 +741236985 +74125369 +741255 +74125693 +741258 +741369 +7415732 +74159 +741593 +741593vk +7415963 +741596300 +7417 +741741 +7417bbd +741852 +741852963 +7418965 +741923 +741953id +741963 +741963456 +7419635 +741993 +74215005 +74215176 +7422612 +742296 +742351 +742447687 +7425786 +7426Shan +74275013 +74277777 +742913 +743119 +743153 +7432342 +74323743 +74336535 +74344481 +7435078 +74352106 +7435f2c +7435yj1 +74369812 +743744 +743877 +74393757 +7439906 +743yhffv +74412127 +7445368 +7445479346 +7445520 +74457445 +74467876 +7447412 +7448076 +74489910 +7450151 +745045 +7451024 +7451111 +74545147 +7454634 +74546596 +74547454 +7456312589 +7456819 +745896 +745945745 +74605633k +7462102 +746264413 +74627 +74630bf7 +7463100 +7463513 +74637463 +746385 +7464302 +74647464 +7465059 +74656 +7466327 +746635 +74665900 +746735823 +7467970 +7468210 +74682933 +7469411 +746geiju +746kp +74704059 +7470667 +74714 +7471814 +7472970 +7474 +747420 +747456 +7474calcu +7475787 +7475911411 +747601 +74771062 +74776545 +7478 +74789060 +747897 +74790 +747908 +747Texas +747boing +747sim +74809598g +748159263 +748222 +74850731 +7485749l +74858745r +748596 +74865074 +7491ar +7492 +74936e1 +7494 +7494842 +7495626 +749685 +7497037 +74@263157 +74DOGGY +74Imogen +74a4a5 +74benim +74blazer +74boating +74brandy +74c5e050 +74c926md +74charity1 +74chetan +74chickens +74courtney +74d54d4e +74de35ca +74dltjr +74dreamy +74eitw +74fitzgerald +74gtse9i +74hv7f +74leab10 +74m4220 +74marilyn1 +74mooser +74mopars +74password +74regisw +74scooter +74shaleah +74sword1 +74tenkey +74toolworks +74wireless1 +75 +75000 +75012088 +750131 +75015 +75016625 +7501fl +750200506 +75028 +7503373 +750374 +7504162673 +7504650 +7507000197 +750724 +750807 +75082400 +750924a +750ow31 +7510056986 +7512055870 +7512427 +7512637 +7512C6 +75130562 +75133807 +751373613 +7514111 +7514416 +751499 +75156914 +75161069j +7517543 +751984 +7520423 +7520561 +752087675 +752257 +7523018 +752396 +7523kris +7524620 +752525 +7526280 +752820 +7528787567 +75294 +752952 +7530131205 +7531 +7531238 +7531246n +7531457 +753159 +75317531 +753215987 +75321mp +753258 +753357 +753369963 +7534218692 +753456951 +75367536 +753698 +7537003 +75373970 +75379519 +7537omygod +7538ok +753951 +753951123 +753951456 +753951852 +753951eu +753ED1 +753mdcn +753niky +753zx46m +7542750 +7543464 +75452432 +75457545 +75487 +75494896 +7549500909 +7550055 +755096 +75511652 +7552062 +75526894 +7553369 +75547734 +75557521 +75560209b +7556575 +755657575 +755715 +755716 +7557400 +75574812 +755768 +75580074 +756112 +7561457 +756320 +75637563 +756444l +756533 +7565336533 +75655657 +75656590 +75657 +75669cc +75705 +757055 +75725236j +75732573 +7575 +75751975 +757667 +75778280l +757AMBER +757ca4bf +758000 +75813160 +75813450 +75815193v +75827582 +7583 +7584929 +7586678 +75867720 +75868932 +7587 +7588801 +758911 +7591189 +759153 +75915321 +7592060. +7592miro +75945624 +759751 +7597640 +759d006 +75Zb +75a1d1 +75buttonville +75cab754 +75cessna +75connects +75d798 +75da21 +75dc7e3 +75fdbf8 +75guno00 +75hide +75k6mus2 +75keyonna +75r5776 +75retlaw +75schiffman +75stinko +75thowns +75wabbit +76$$ +7600060 +7600801 +760154 +7602119 +760226 +7603 +760328 +760400 +760416 +76041989 +7604639412 +76070450 +76073162 +760836932 +76087096z +7608js +760Bsb +761006111 +76101620 +7610538 +7610933 +761120149 +761125091 +7611426 +7611441 +761167 +7611hsf +761212 +7612166123 +761223 +76123456 +76132236 +7613271 +761369 +76138275 +7614240892 +761458 +7615477 +761555 +7618046 +7618093 +7619438520 +7620337 +76233946 +7623586 +7624682 +762530 +7625549 +762557 +7627207 +7628835 +762crazee +763096583 +7631 +7632098 +76382400 +7638270 +7639377 +763941 +763mba +764 +7640qpwp +7643009 +764450 +76458964 +7646 +76463636q +76467212 +76480e02 +7649320 +76522567 +7653 +7654153726 +7654321 +7655952 +765647041 +7658032 +76590ed +765922 +765dfx +765hc +766405 +766405987 +76654904 +76667666 +7667070+ +7667237728 +7667615 +766bd1ad +76703747 +767187 +7671993 +76729315 +7674sp +7675 +767504876 +767574 +76764 +767694 +7676porn +76775729 +76777777 +76799 +767j900o +7682 +76843247 +76854331 +7685467465 +7685490 +76859413 +76886668 +76894559 +76897 +7689720 +769099507 +769100 +7691312010 +769161mi +76918159h +76940749 +769427 +76Elizabeth +76HH76 +76KIMMY +76Kenzo +76PASSWORD +76Tre4 +76ab79 +76augusta +76bd1ac5 +76bizkit +76brittney +76cabelo +76cola +76d0b7d6 +76dcflol +76demons +76e481 +76enima +76fddf8 +76inline +76leslie +76m0NM +76mc77ag +76pd77jm +76pepe +76sencer +76trombo +76xox +7700934777 +770173724 +7702162 +77027721 +770301 +770407 +7704244446 +77043678 +7704651 +77047385 +770530508 +770596 +7706367 +77070207 +7707229 +77072617 +770730 +77096 +770abc +770b7417 +7710047600 +771005911 +77101741 +77107532 +771139 +77135273 +77143396 +77144996 +7714836t +7715254 +7715481 +77161089 +77162 +7717729287 +771900ff +77191661 +771asmodeus +7720ce31 +772111314 +7722 +7722445 +77237350 +7730783 +77310000 +7731523 +77316912 +77321702 +7732250481 +773246720 +773400 +77340z +77344u +77351679b +773593733 +77373659 +77377737 +7737921 +7738828 +773afcc9 +773e8 +774091 +7741422 +7741ew +774218 +774259342 +77431941 +7744063 +7744812 +7744bc +77452985 +7747459 +774801772 +7750025002 +775048 +77508 +775118802 +7751elixer +77523822 +7752aa +77537464 +7755 +77552452 +77555543 +77567758 +77581071 +7758502 +775852100 +775961025 +775970 +77597957 +7761 +776302776 +776379 +77654321 +77657765 +7766 +7766554433 +7766A +776800 +77690601 +77695906 +776u7 +777 +777110 +777111000 +777133486 +777145 +777250 +7772581 +777333 +777410 +77741614 +777444111 +77746 +777466564 +77747774 +777525045 +77752740 +7777 +777758 +77776262 +77776666 +777777 +7777777 +77777777 +7777777777 +777778 +77777l +77786567q +77788899 +7779 +777999 +7779991133 +777aa999 +777filk +777wn0aa +777yelnats +777zf +777zzz +7781226384 +77830431 +7784324782 +77845807 +7784n23 +7785 +7786005 +77863910 +7787JK +77880 +7788520 +778899 +7788991177 +778899888 +7788no9 +7789285724 +7789445611 +7789646456 +7789Narc +778d772 +778eab +7790 +77927792 +779323027 +7794947 +77951512 +779522zx +77956148 +7795e44 +7796413 +7797212 +77972124 +7797979 +7799 +779982 +7799881100 +77FRED +77Maggie +77admin +77appletree +77apvuc +77barfoot +77bots77 +77coma77 +77dc4 +77delik77 +77eighty +77gs34 +77herald +77idiots +77kancer +77lost +77musig +77nhss16 +77reggie +77shawn +77sig77 +77smirnoff +77soleil77 +77sonne88 +77tenpin +77transform +77wenqi +77wenwen +77wexcmy +77xp77 +77ym16 +78 +78 +780033 +7801041974 +780127 +780162pl +780164731 +7802 +7802133982 +78039 +780516029 +780601 +78060896 +7806739a +780701 +7807311480 +780736297 +7807811 +780786 +780808 +7808131 +7809050529 +780cf220 +7810012676 +78101606 +781023 +781028 +781029 +7810369 +781088 +781120 +781149fu +7812033 +781206 +781224 +781227lm +7812456 +781339499 +78144168 +78151920 +781539585 +7815489 +7816057 +78181878 +78187818 +78198878 +7819b95d +781dm +7821vg51 +782328 +782396541 +78242302 +7826080 +7826999 +78274283 +7828 +78285939 +7830114 +78302920 +7831 +783181 +783293621 +78331617 +78339 +78359304 +7835urmom +7836070 +783613 +78367836 +7837059 +78375261 +7837737 +7838 +783be895 +78408720 +784105 +78412200 +7841479 +7841548 +78417 +7842065 +7843 +78431536 +784512 +7845120 +78451221 +784512963 +784614726 +784623 +78497238 +784DEf +784gh6t +785102 +785200aa +78523174 +78524 +78529716 +78532 +7853274 +78535873 +785404712 +785412cd +785421 +785423 +785484 +7855192749 +78559966 +785620 +78563214 +785785785 +7857cV +785826963 +78592565 +78595 +785yfrai +786007 +7861865 +78627862 +7863574a +786681 +7867 +7868112 +7868144 +7868569 +786913 +786hphs +786s8ucj +7870250 +78715109 +78721434 +78722nd +787345825 +7874102 +787433 +7874523 +78758 +7876015671 +7878046k +78782 +787878 +787888741 +7878UJI +7879767372 +78803162 +7880520 +788206 +7882195 +78827882 +78827fa +7882899 +788371wk +788377 +788403444 +78850055 +7887dc +78893 +7889680 +78897850 +78897889 +788h024 +789 +789023456 +7890mille +789102 +789123 +789159963 +78916071 +789180 +78918013 +7892158 +789254 +78932191 +789330 +789342 +789456 +7894561 +78945612 +789456123 +7894561230 +78945678 +789456fb +7895123 +7895210 +78958254j +7896321 +78963214 +789632145 +789635 +789645 +7896451 +789654 +78965615 +7897789720 +789778977 +789789 +789789u +78979com +789830 +789852 +7898xx +789987 +789987123 +789Sushi +789Uio +789bjk +789jkl +789or456 +789u8f +78Blodet +78Jaydon +78Maja +78Ottawa +78UwP +78a4cc +78admin +78aht99 +78artpep +78barney +78blah96 +78boy78 +78bridge +78disconected +78e02801 +78edg392 +78ellis +78empress +78erdinc +78f2502 +78gizella +78hyt99 +78kkhruv +78master78 +78missy +78monster +78montreal +78orue78 +78s23h +78southpark +78tdg +78west +79002192 +79009567a +790103 +7901036868 +790106 +790118 +790124 +7901283 +790211m +79027570F +7903024011 +7905182211 +790570 +79057055 +79061199 +7907043587 +7907211 +790909 +79091979 +790power +79107400 +791209 +79121980 +79124 +79132487 +7913584260 +7913as +7914116 +7914729 +79160473 +791978 +792 +79202540 +7920491 +7920rock +7922710b +792318004 +7924161 +7924786 +7926015821 +7928125 +792813 +792900 +792906 +7929213 +7929741 +792TXM +7930ps +793167054 +7931f +7935746 +793607 +793607a +793615870 +7937950 +79381e64 +793dce +7940813 +7940960 +79413161 +7942132 +7946018 +79461305 +79461346 +794671 +794685 +7947473 +7947942009 +794806 +79489584 +79508972 +7953869 +7955 +79551107 +795513 +795597 +795f430 +796363 +7965 +79669300 +79671057 +7967179775 +796796 +796803356 +796866456 +796b247 +796rv +7971712 +79717971 +7971hsoj +7973195 +7976tttt +79770420 +797979 +7979796 +798100Wh +7982360 +79825401 +7982fuck +798465132 +798468 +798520 +79857985 +79863541 +7986560e +7986961 +79877987 +798899174 +7988reaver +7989028 +7990 +7990048 +7990321677 +79930445 +7994389438 +799488 +7995433 +799591 +7995d9e3 +799sw +799yi +79ADSZ +79Harley +79a3c76 +79altazar79 +79amaryllis +79cheeta +79darkangel +79gregory +79kefsuf +79ktc33g +79major +79molson +79p8n0v +79spacecadet +79summer +79sv83mj +79tercel +79togu79 +79zee +7B9905 +7BA6D +7BKKNIX +7Bauer4 +7Elvee7 +7IXPH7 +7Impalas +7JULI7 +7Melani# +7Monkeys +7P13c8 +7PYVoWX4Zx +7Password7 +7Sandra1 +7Super7 +7TALOL +7U8vMt +7Ut&xZ! +7WslE +7a274437 +7a31b0b +7a34639 +7a39d60 +7a3f2g7o +7a5s3d +7a610f +7a6121 +7a7a7a +7a8727a +7a9a103 +7a9b3e32 +7aca07 +7acatcat +7achadwick +7achisel +7ad11i18 +7adental +7aduchess +7afda4ae +7afuckin1 +7agogeta +7ailes +7ajaguar +7aloula +7amzn +7arichard8 +7aromantic +7ashane +7asniper +7athornz +7attack +7aulw +7awibble +7b0cd896 +7b5637 +7b791c5 +7b7a5fee +7b7e519f +7b83cc +7b8c37 +7b8cytd +7b9c46 +7b9da2 +7bImants +7ba2892 +7ba9a1a +7badmin +7badvance +7baerin7 +7bai7 +7band4 +7bboofer +7bclemson +7bd0ef +7bef9f9f +7bello +7bfc8rpm +7bgreen77 +7bgwyther +7bholden +7bimperf +7bkickass +7blacksun +7bliving +7bnzsteel +7bonilla7 +7bporche +7bportugal +7bsurabaya +7btrumpet +7buergen +7bwhatif +7bx74i +7c02bd0 +7c402a0 +7c625bff +7c810759 +7cWarlock +7ca357d4 +7ca875 +7cab5b +7calivp +7ccally +7chai7 +7chaos7 +7cinh +7cmartin +7cneemo +7cpainter +7cpeter +7cshivaya +7ct1kp +7cteste +7cuvi4re +7cznj +7d0659e +7d1e804 +7d1ykmup +7d38egrg +7d42c9ce +7d54d3 +7d75043 +7d7a5d8 +7dalbany +7dbarnard +7dbrigid +7dchucky +7ddanny +7ddustin +7deec76 +7devangel +7df913 +7dfreeride +7dfxnow +7dh88urn +7djonkers +7dmesanger +7dmicrosd +7dnd1 +7dsdc86w +7dthumby +7dvirginia +7dvquqdw +7dwhiskey +7e00000 +7e4718 +7e551d63 +7e64X +7eav9 +7eb1d3 +7eb71385 +7ecompri +7econflict1 +7ee4795e +7ee81 +7eeverest +7eglobal +7egovinda1 +7ejerome +7ekpc +7ekyushu +7emacchi +7embiscoe +7emitchell +7emuchiri +7enrw +7eoladipo +7epompier +7eposeidon +7etigra +7ev0an9a +7even1 +7ewelcomes +7f4df451 +7f4f7d2 +7f5af8d0 +7f935a +7fAVEDA +7fKatie +7faspire +7fb2271 +7fcountry +7fdbcf10 +7ff641a +7fflexscan +7fg7q6 +7fhfuzrc +7fhxq +7ficknwy +7fkupfer +7fletche +7fnewnam +7fsatya +7fsd9 +7fshanet +7g073 +7g9u4mpk +7gaxbp +7ghnd6rp +7gnbb2sc +7grace7 +7grum7 +7gtronic +7gvyn +7hat245 +7haus +7heinzi9 +7hells +7highjump +7hkwqcov +7hnh2n +7hpa0 +7hqsd +7hyperion7 +7i1vc +7i88z +7iiqohr +7iyyh +7j397ukg +7j3qh1x +7jeekh +7jfiu +7jkmrcwt +7jos9pzx +7jpcoyti +7jtiy +7juneau +7k1bsneq +7kanshak +7kfct +7kl8ij9 +7koinonia7 +7kovac8 +7kvnlbv5 +7kxl5t +7lct2 +7lekiust +7lhQGR +7lrl4l +7luiv +7lxp1 +7m17k67s +7m4ui +7magda7 +7mai88 +7mjkl7mk +7mkc7 +7njd5 +7nnqs +7nocsta8 +7nqc8 +7nrjhkmf +7nxny +7o6c4017 +7ooas +7ormen7 +7owjiz7 +7p5684f +7p588 +7password +7pc3n +7plrmeh +7pmjcarr +7pqh9 +7putzi4 +7py8gx2o +7pzqgci7 +7q1xt5 +7q509 +7q6y5k0q +7q7w7e +7q8w9e +7qc52xmx +7qvmk +7r65toy +7rFctb +7ra74 +7robbins +7rs1fj07 +7rumv +7rvka +7rytre +7s8xuchr +7sawj8dk +7sbbrari +7schnalle +7sephiroth +7sevens +7shane +7sisters +7skifahren3 +7soft +7sornette +7sp32f1b +7sqvj +7summer3 +7susy84 +7sw44e3v +7szczur +7t12j82 +7t3a448b +7t7t7t +7t8k9h +7tbc8 +7tharmy7 +7thclas +7topgun7 +7truthseekers9 +7tupak1 +7ty9hv9y +7tyhzo +7u1ihbt +7u559525 +7u5mb +7u7o7 +7u8i)O=P +7u8i9o0p +7uL14n +7uiu7gyf +7ujpmlkz +7ungs73n +7v3329s1 +7v4po +7vjvdq2p +7vmfi +7votd +7vtzi +7w4sfest +7w5h3m +7w95r2j9 +7winx5 +7wrar +7x3572xx +7x3x22f +7x8zYp +7x942 +7x97pxd +7xaak +7xc5mpa2 +7xmcn +7xnwec62 +7xov4 +7xqyi +7xsette +7y231 +7y7m4tv4 +7ycmthkf +7yfeggb0 +7ygvnji9 +7yro9 +7ytkr +7yuc12 +7zballah +7zcn2 +7zgmm8he +7zhdvt29 +7znz5 +8 +800003308 +800021775 +80004005 +8001 +8001711 +8001Spirit +8002013 +8002063 +800246 +80028002a +8003043043 +800320gh +8004f4e +800510123 +800519 +800529 +8006220068 +800627 +8006272791 +800629 +800630 +800700 +8007863 +80079 +800800 +8008135 +800921 +8009Joey +800f800f +800ict41 +801009 +80101034 +801040 +8010728a +80110 +801101 +801108ss +80110x +8011107063 +80111591 +801117a +801230 +801257 +80134284 +8014ka +8018163 +8018337b +801902 +8020 +80211a +80214182 +8023588 +802466 +8024vu +80250048 +80264276 +802731711 +803004471 +803116 +803200 +8033642596 +803455aa +803497a +80351059d +803549674 +8036greg +80402010 +804186 +80419 +804300bb +80454600 +80468046 +804804 +8050 +805071 +805201314 +805205121 +805306de +8053977302 +8055 +805566 +80558080m +805598 +8055judd +80564a +80567848 +80576fb +805angel +805fdcd2 +8060497 +80617681 +806412 +8066 +806610963 +806818729 +806857 +8070314 +80718071 +80725 +807679753 +807717 +80778296 +80800912 +808013858 +808080801 +808103 +8083193 +8083jl +8084242 +8085505 +80874 +808773 +80890903 +808acc +809099 +80914301 +80927065 +80928092 +8095223009 +8095tw +80973172 +80999580 +80999c56 +809ajm +809d933 +80PRECIOUS +80Tic +80a40b +80allen80 +80b5352 +80beasty +80bicycle +80boogy +80c0ee +80chaton +80creative +80df415a +80dolphin80 +80edf8f +80everlove +80gallon +80hsj +80magister +80mascarada80 +80mdc +80moffatt +80multimedia +80ottmar +80polarity +80priest +80r2pq +80scooter +80squidget +80stuart +80twitch +81001345 +81002006 +810069 +810105ps +810111 +810111 +810112330 +810188 +8101990 +8102007 +8102015 +810220 +810318170 +810402877 +81040581 +810406 +8104064616 +8104151123 +8104167995 +8104191183 +810428a1 +810456 +81050131 +810509 +810528a +8106066 +81077518 +810817121 +810817809 +8109176745 +8109661 +811018 +81101on +8111111111 +811125 +8111977 +8113529 +8113547 +8113jhh +8114206. +8115313828 +8115850834 +811606 +811612 +81164467 +811839333 +81188118 +81188668 +812004 +812043 +8120aral +81216098 +8123180018 +8124482 +81258125 +8126451 +8128632248 +812cmnlh +812sieg3 +813 +813174 +81326659 +813568 +81378137 +813887290 +813ccab +8141 +8141183b +8141791 +814563 +81460669 +814660 +8148013789 +814803266 +814Cz +814f17 +814n9 +8152325261 +815250 +81528156 +8153862 +8154168759 +81551368 +8155221 +81555555 +8155570590 +815815815 +815897340 +8159 +815chen +8161415 +81624869 +816427 +816437 +81658721 +816602 +816681 +81668132 +8168079 +816868 +8168681686 +81694 +816cdf +816sar +8170 +8170241991 +81726354 +8173d0ed +8174071 +8176toll +817718445 +81773 +81773362 +8179 +817omer +817soak +8180 +8181169 +8181400 +818149 +8182mpb +8183jsjs +81841216 +8184ea +8185120389 +81852108 +818530 +81879280 +818947 +818969947 +818f0d2b +8190763 +81916876 +8194071 +8194231 +8194534 +819658475 +819919 +81998199a +81admin +81affirm +81andy42 +81bundle +81cba9 +81classic +81cosmos +81d711 +81deers +81demo +81drowssap +81ebkk +81eml05e +81escadron +81fineline +81frances +81ggd5 +81ihd +81jackal +81jimmyd +81jordan +81joseph +81keekee +81lucia +81maketable +81mercy +81nico57 +81nocturne +81pby +81perry +81racecar +81rc9irw +81research +81ryoga +81sunny +81tornado +81uli81 +8200000 +820101 +820104 +82011891 +820166 +82021807 +820307 +8203805 +8203ko33 +8204269129 +8204love +82051323 +820517 +82070316 +820727 +820731375 +82077466 +82081101 +820915 +820923 +820jm +82101514 +821018726 +821065 +8210JO +821113 +8211192 +8211290500 +821130 +82120214 +8212128448 +821222 +821230 +8212702 +8213135 +82132879 +8214086 +82142666 +821503 +821588 +82163246 +8216justine +821752921 +821765917 +821799 +8218907 +82199 +821niv90 +822 +822026 +82212345 +82217855 +8222528 +8223748 +82241952 +8225500 +8225740 +82268504 +822706jr +8228581 +8228sam +8229332 +822nym +82301249 +8231 +82314159 +823190 +82329521 +823341di +823349923 +82336160 +82340406 +823659 +8236766 +82386688 +823snv +824056 +824130149 +8241531 +82419690 +824280127 +824358553 +8243651 +8244selle +82453817 +824602 +8246154 +8246507 +824657193 +82468324 +824774IN +8250217 +825034 +825170 +8251gp +8253676 +8253743 +8254cm +82555023 +825600 +82562231 +82563 +825647 +82568256 +825811 +825p1i3t +8260424330 +8260596 +826175 +82618 +8263270b +826400 +8264326 +826435625 +8265091620 +826862 +82691918 +826b556 +827051 +8271175 +82714456 +82716212 +82718271 +82721500p +8272817 +82738603 +82738603 +82741 +8274309 +827780ma +8278030 +82786458 +82787377 +82796877 +82810lgm +828182 +8281882419 +8283209190 +828383 +8283919t +82841900 +8284963 +8285262 +828536 +82858 +8286 +828806 +82897333 +82898 +828main +828march +82920229 +82921328 +82989140 +829972912 +829ox +82ALICIA +82a85370 +82bobi19 +82e9374 +82edbdf8 +82elijah +82erdna +82esperanza +82geronimo +82jwp2 +82key63 +82loverly +82nf02s +82nr1829 +82passwork +82pussy +82trainer +82v22 +82zapper +830 +8300072 +8300632 +83012470 +830130 +830301 +830321608 +8304176 +8306520f +8308031614 +8308090583 +830817 +830824 +8309225066 +831000 +831056 +831079 +8310a325 +8311220 +8311420 +83128312 +8313019416 +8313255 +83150014 +83158372 +83158467 +83161348 +8316563 +83167901 +831758op +831826 +83193176 +83195td +831966 +831b2722 +8320000 +83200556 +8320093 +83203690 +8321761 +83222072 +8323mb +8325087 +8325780 +8327604 +83276070 +8328HWL +8329406z +833034286 +83307721 +8330838 +83333 +8333493 +8334 +833545 +833608 +8337SD +83392356 +8339862 +83410180 +8342083420 +8343 +83448344 +8344915 +8345263 +83485285 +83490 +83495353 +8349826 +834D +834colts +8350505 +8351008 +83516551 +835201767 +8352669520 +83532905 +83548215 +8355 +83552456 +836024 +83607 +83619 +8362341 +83636203 +8363760 +83642897 +83647500 +83656656 +83680498 +83685000 +83692285 +836927 +837115033 +83718371 +83739179 +8374589 +8375221 +83753598 +8377301216 +83795891 +837cwl95 +83817015 +8382701 +83830104 +83838 +838383 +83842730 +8385809 +8385nyo +8387e911 +83888888 +83891998 +8395220 +8395flo +839681 +8397125 +8397916b +839839 +83999214 +83Brigadoon +83annick +83bgxw0p +83bonbtp +83charlie +83cherry +83cnji +83f2280 +83fugman +83heckler +83huaosd +83keystone +83ryuko +83sadie +83scamper +83silver +83sorgenfrei +83uggacz +83x31 +83z4hxgr +840096928 +840113 +8401230521 +84012395 +8402 +840201008 +8403155 +840413 +840428 +840617 +84065595 +8406f6 +840704333 +840711 +8407270 +84077052 +840796942 +8408051430 +84080a +840812 +840879778 +840917 +840928 +841010025 +84111558 +841119 +84120151 +84123678 +84127642 +84128412 +841365121 +841669481 +841975 +841s +842100 +842166 +84221200 +8423 +8423879 +8424023 +842458 +84247786 +842519 +8425794x +842617 +84265 +84268426 +84278198 +84278fi +84298433 +842afji +842pxc +8431tail +8432547 +8432835050 +84332399 +843327 +8434 +84354846 +84358933 +84368436 +84371838 +843762 +8438183 +843843 +843980663 +843e0 +8443224 +844331412 +8443865 +84451068 +8445e8ed +84484848 +84500925 +845038 +8451+ +8451255 +8452118 +8452271 +8452k +8453 +84530404 +84532646 +8453722 +84538270 +84552513 +84555782 +84558455 +84560601 +84564388 +8456495 +84566100 +8456nora +845755791 +8458786 +846023444 +84607217 +846132 +846212 +8462357951 +846239 +846289 +8462sur +84632000 +8464ce +84652033 +84653007 +84673768 +8468232 +84711845 +84719981 +847200 +8473720 +84739156 +84745623 +84755 +8475John +8478890 +84789092 +847f36 +847tor +8480341505 +84821207 +8483495 +84841330 +84843 +848492647 +84858485a +84870000 +8487679 +848990 +848Iberis +84918827 +849225658 +84924926 +849252 +84938491 +8493ali +8495312 +849595 +84988498 +8499ak +84Computer +84DIVINE +84TuXx +84alexis +84ckxnv6 +84f7ada +84fabianna +84fh84 +84george +84global +84hsi +84jordan +84kishore +84nagrom +84pezzulo +84pinguin +84pjk +84samsung +84ttn38g +84ugrs +84wolfman +84yv7623 +8501169435 +850211ok +8502369 +8503245592 +85041998 +850511 +8505171708 +85054b38 +850606845 +8507 +850820 +850826 +8508647 +8508bal +850903 +8509961 +85100022 +851025sa +851029 +85104 +851066099 +8511111412 +8511233481 +85118147 +85121238. +851300 +8513218 +8513772 +8514033 +85148514 +85165f1 +8517418 +851851 +8519859011 +8520 +85200102 +85200258 +8520123 +85201456 +8520147 +8520456 +85208520 +852101 +852114345 +8521194 +852123 +85214789 +852159 +852225 +852231 +8522401106 +852258 +852258771 +852258kl +85227410 +8523 +8523239 +85237102 +852396741 +852456 +8524567391 +852456a +852456m +852456r +8524632 +8526082 +8526515 +852654 +85272c +85276800 +852790 +852852 +852852!! +8528521 +8528811 +8529427 +852963 +8529j +85318531 +8535539 +8536072 +8536733 +85368536 +85406 +85411300 +854126044 +854179874 +85418541 +85420130 +8542912 +8543185 +8544504 +85446 +85457616 +8546 +8546485464 +854685645 +85473 +85477 +8547munakas +8549045 +85497281 +8549fde +8551 +85518012 +8552 +8552486 +85538625 +85540 +8554065 +855464 +8555553 +85558555 +85566841 +85569746 +8557 +85572566 +85575774 +855770400 +8557f1e3 +8559559558 +855dbd27 +8560 +8562873 +856293847 +85632145 +856400 +85648210c +8565i1vw +85673255 +856974 +856ty6 +856wj +856yy +85702809 +85714803 +8572444 +857271 +8573272 +857565012 +85760042 +85768576 +85780588 +8579 +857928 +8580 +85801556 +858032 +85806208 +858107 +8583 +85832230 +85836227 +8584 +8585224 +85858585 +8586580 +858685 +8588013e +8589911 +858vvc +859092 +85919999 +85938593 +859491 +85951195 +8595603347 +8596950 +859940 +85HR26 +85MooN +85RICHARD +85antman +85bawn +85be028 +85cheyenne +85e6196a +85gpn +85gt7K +85harriet +85judyann +85kennedy +85lesha +85mnb06 +85o5uqh3 +85owqx +85pkh +85rabbi +85rene82 +85secreto +85shower +85targa +85tuatara +85walmac +860036542 +8601027620 +860124310 +86016529 +8601710 +860201 +8602284047 +860370711 +8604511984 +8604jmas +8604sony +860509 +860523bo +860615239 +860702c +86080662 +860822a +86092121 +861043182 +8611590879 +861205 +8612158508 +861263 +8613207 +86132511 +8613474 +861347416 +861355 +861420782 +861583572 +861615711 +861623 +861678107 +86176289 +8618015 +861840144 +86188259 +861898 +8618k +861955 +8619red +862115212 +862251970 +862385309 +86239102 +8624266 +86248 +86248624d +862598912 +86260776 +86261255 +862826404 +863082 +8630869 +8631 +86336473 +86338633 +863497646 +86352308 +863551034 +863742974 +86378637 +863791 +8638 +8638196109 +86385526 +86400 +8641163 +86415A +86416352 +86430739 +86432558 +864340897 +86445818 +8646530 +86465320 +86485147 +8649695 +8651088 +8652 +865200 +86521456r +86525197 +865368624 +865428816 +86568656 +865781100 +865898042 +8659210 +8659801z +86608660 +866292 +8662922006 +866753 +86678667 +8669336 +866Haab +866kyim +86701309 +867175064 +86732 +86753 +8675309 +86753099 +8675322 +86758675 +867683ac +8678325 +86792853 +867953525 +868022 +8681 +86811225 +86819e6b +86826256 +868364123 +8684 +8685046092 +86851002 +868560900 +8685a32 +868686 +868687229 +86871414 +868817630 +86886263 +8689300 +86896566 +8689814 +86934 +86948374 +8694981760 +8695252 +8695345761 +86961188 +8697053 +869899 +869913798 +869925971 +869dcae5 +869voit +86D62 +86PASSWORD +86Schouten +86a1bf +86aswA +86bab302 +86bonehead +86damien +86ecfc90 +86friedberg +86jks4v3 +86jug86 +86limpo +86mission +86platinum +86prout +86ranger +86rockon +86selby86 +86smid +86snufkin +86strat +86thefox +86thunderbird +86tigger +86tyrone +86vwjtta +86yio +86zigge +8700 +8700700 +8700782 +870209 +870267ff +8703113443 +870330 +8703757864 +8704 +8704020480 +8704091951 +8704146708 +8705059330 +8705061020 +870509 +8705154455 +870525 +8705apr +870621345 +8707119 +8707223 +8708053670 +870915 +870slowmo +871001560 +8710158976 +8710173898 +871113116 +87121190 +871216892 +871220 +871228 +871267387 +8713075 +8713181 +871435 +87157852 +87158715 +8717987179 +87181707 +8719519 +871987 +871a7b +8720163 +87211418 +872205 +87228722 +87229e +872426 +8724817245 +87250602 +8725866 +872623 +87266364 +872699 +87289610 +872945750 +87298542 +8729861 +8729o9o +87320088 +8732518 +87326d +87327602 +8733195029 +8734597 +8735585 +873668 +8736laney +8738677 +8739663 +873cb9 +87404686 +87413831 +8741774 +874187410 +87423 +8742704 +8742980 +874310 +87438042 +87438743 +8744251 +87454 +8745564 +8746 +8747579 +87478747 +8749moni +8750027 +87503504 +87518160 +8751851807 +8751atheos +875234 +875319 +8753383668 +8754 +87540865 +875421 +8754417 +8754961234 +8756982 +875880 +87592112 +875nco +87602138 +87603693 +8761005329 +87611118 +87615049 +8761799 +87623237s +8762345678 +87630094 +87648dc +8765432 +8765432 +87654321 +87654329 +876553568 +87662215 +87686805 +8769805 +87700584 +8770237 +87722707 +87730790 +877565203 +8775657 +87794120 +877c951 +8780873 +8781832 +878288 +87853374 +8785345321 +878587 +8786 +87870664 +87870703 +878766201 +878787 +878787g +87886610 +87900556 +87911122 +8791906 +8792640 +8794263 +87946762 +87951052 +87962 +8796338 +879738 +87975468 +879Df +879Moh +879b4d +879dc3c +879e749 +87arijana +87asdfa +87b9930 +87barrack +87blah87 +87c51 +87cabernet +87calis +87dolphins +87karate +87krud +87lo15 +87mikamika +87o00 +87qazxsw +87sprint +87u639 +87vegies +87vision +8800970 +880103 +880112 +88012626 +88012712 +88012888 +8802127 +880226 +88028a +8803 +880318 +8803245902 +880327 +88040433 +8804044525 +880407 +880421 +88042401 +88045609 +880473852 +8804a6c +880518pl +8805288217 +88061199 +8806993 +8807087534 +88078979 +880791816 +8808038460 +8808080808 +880813 +8808165916 +880820 +880829 +88085321 +88086806 +880911 +8809363400 +88098809 +8809897 +881005 +881016 +8810316520 +881034 +881109456 +8811094561 +881111 +881123 +881129 +881133 +881176 +88119394 +881201 +88121212 +88125364 +8813614 +8814165 +881451 +8815d97 +8815shir +881609ds +88167995 +8817 +881741 +8818tir +88190617 +88190914 +88191108 +88196815 +881978 +881986 +88199 +881991 +88206 +88223388 +88223880 +8823 +88230159 +8823201 +88242488 +8824263 +8824282 +88246810 +8825233 +882619257 +88262826 +882755 +8827882 +882801749 +882882 +882912588 +8830499 +88311787 +883173lb +88320231 +8833 +88341 +8837057 +8838485868 +88391506 +884012 +8840256 +884223944 +88426879 +884317 +8844640 +88451545 +88452877 +8845572 +88463162 +884689a +88482048 +88482925 +88488848 +88489959 +884900 +8849841 +885015 +885050245 +885100 +885105 +8852 +88522411 +88525ik +885294439 +8853637e +885522 +88561484 +8858 +88583417 +8858888a +88588a +886229 +88626388 +88630678 +8863d0 +886513778 +88651590 +886588 +886600 +8866eoi +8868201 +886886 +88693261 +88698869 +886christopher +887252 +88729640 +88736 +8874562 +8875065823 +88759123 +88767655 +8876854 +887766 +8877915 +8879082 +887a599 +887d4eb +887tv +888025662 +8880618 +88812356 +888178 +88818881 +8882345 +88826266 +88827338 +888298375 +888302453 +88833300 +888333000 +888333001 +888333111 +888333222 +8884265217 +888570912 +888666684 +88875566 +8888 +8888 +88883922 +88887 +888872 +888888 +88888888 +8888888888 +8888vip +888911 +88896590 +888999 +8889993457 +888Fav +888affen +888ich888 +888lk888 +888tomi +8890 +88908606 +88911988 +88914011 +889164 +8891babe +889353479 +889409113 +889551 +889600132 +8896322 +88976889 +889800411 +88986680 +8898ksm +889966 +8899665478 +889988 +88Aladdin +88Pumpee +88a44 +88admin +88angel88 +88arda88 +88b9c1 +88beaker +88bunky +88ctw +88dd72 +88dolf +88edb7a5 +88edgewood +88eqq +88flocks +88futbol +88gothic +88hitler +88huggies +88huso88 +88ioaapl +88kvemhf +88matrix +88meap +88mobilier +88negril +88nfl88 +88ojv +88persians +88pisces +88qrb9eg +88rodrigues +88rth8r +88state +88sv9xnm +88t23ak5 +88wdpf88 +88you22 +890100 +8901074089 +8902022822 +8902272978 +89024703 +8903 +890324 +8903280215 +89035437 +8904026422 +890420 +890706 +8907185639 +8908124622 +8909070520 +890918 +891010 +89101238 +891012jk +8910152184 +891023h +891046 +89105252 +8910551 +8910i +8911 +8911048507 +891155725 +8912057041 +89121235k +8912127149 +891223 +8913145 +891318 +8913276a +8913svarre +8914858 +891547 +89155555 +89156706 +891600az +8916031 +89197981 +89203149 +8920552 +892061623 +892111 +89213800 +8921774 +8923456 +892411400 +8924311 +89262626 +8926306423 +89280255 +89282857 +892892892 +892e97 +89307528 +89308930 +8931 +89311618 +893150907 +8931678 +893171989 +89325a0f +89331251 +893420 +893566 +8936abf +893739626 +89376001 +8937964 +893894 +894094 +894174535 +894370 +89452367 +8947780 +8949ap +894pwdx +8950 +89501 +89513556 +895151 +8951513b +8953hannes +8954 +895467 +895566 +89558955 +8956 +8956007 +895623 +895674 +89568245 +895683 +895852 +8959hrdr +89613076 +89616c4 +8961993968 +8962 +896325 +8963986123 +896431 +8965 +896558tg +8966465 +896762223 +89676818 +89687 +896901 +8969368 +896979 +896ie +8971561 +89720540 +89727717 +89728972 +89745971 +89769752 +897921 +898139 +8981565 +898227679 +8983 +898319 +898378 +898388640 +89849873 +898526 +8989002 +89891414 +89898989 +898989xx +89911618 +899166 +89932179 +899403 +899512388 +89958 +8995plp +89987z +8999724 +899qn +89A116 +89Absalom +89JETSKI +89M4074 +89aqw +89b9e9 +89c0875 +89cab3 +89fbod +89ff9a8 +89guest +89honda +89illiae +89jeremy +89kawi +89kom +89linnea +89molly +89online +89overload +89owner +89pandamonium +89pham +89philipsz +89pq36 +89pt93 +89saltash +89sandeep +89simonsays +89speke +89tedina +89tryumph +89ys89ys +8;(5Nl_FLiRvuZ +8FB4A +8Gj5sC +8JULI9 +8OldKing +8Rda +8Rebecca +8RjsWT +8Uv16k +8VXS3 +8WCK9V +8ZGtzQDeRG@1Cd +8a15a070 +8a25f5df +8a26daf +8a45ee1f +8a507e9f +8a6z4e2 +8a721fcc +8a7ximzh +8a8d48e0 +8a968b +8aZ8QxgcIV9+Sm +8aaa01 +8aanton +8aawsome +8acharles +8ad344 +8ado2 +8aecd57 +8aetschE +8afinrod +8agvo +8ahotella +8alugnut +8alya8 +8amaxwell +8amu7a +8aplume +8asmart +8atomolo +8awhatever +8b29fd +8b2da21 +8b69c88 +8b6e5fa1 +8b767053 +8bISAIAH +8badmin +8baeeb +8bassotto +8bbd61 +8bdatsuns +8bf2cde7 +8bfep +8bg2nfsi +8bjaiden +8bkwh +8bladdie +8bmarine +8bmercedes +8bmidtown +8bods +8boisco +8bojh +8bonbon8 +8bpembt5 +8bran4me +8bscrumpy +8bsilvia +8btanaka +8bubbles +8bvt6tup +8bwyoma +8c489 +8c5d65 +8c62npvn +8c72a7 +8c87955 +8cBAMBAM +8cP5m +8cVIPER +8ca6ee5 +8cascot +8cbed05 +8cchrish +8cf782 +8cfbk +8cfc6b13 +8chouses +8ciloveu +8ckarter +8clo7bjq +8cplanker +8crfs +8csedona +8cskibum +8cvr0ne8 +8cwxunt9 +8d0baef4 +8d1t0r +8d22798 +8d3ec5c +8d872hn +8d8ee22a +8d9200 +8dRosemary +8dannie +8dbarry +8dbinbrook +8dcc272f +8dchangeme +8dcherry +8dd72ec8 +8de0d8 +8dfwru +8dhokzx3 +8dimus88 +8dkvadrat +8dm1n +8dmamba +8dmcdowell +8drenault +8dsafety +8dskooter +8dsocceroo +8dstuart +8duyi +8dyfi +8e228c +8e35be8 +8e57h +8e9joln +8eb25b +8ebaker +8ecatcat +8ece3916 +8ecef29 +8ef6cku7 +8egoodluck +8ehunters +8ekennedy +8elovers +8emaddog +8emonty1 +8enkxn +8epolaris +8eshitface +8estaffy +8etic +8ewaswas +8f39e9 +8f5d2d +8f887q77 +8f8f21 +8f9e9ba5 +8fCAMERON +8fLONDON +8fabas88 +8father8 +8fbuttons +8fc0a4f +8fc5yiah +8fcandyman +8fd892c +8fd94afd +8fdaniel +8ferrari8 +8ffir3 +8fgarl1c +8fkatrina +8floz +8flucinda +8fmercedes +8fnathan +8fouru +8fpunkin +8fq7h3v8 +8frubes +8fsawdust +8fxqa +8g333 +8ga8k5 +8gcjq +8ghe9v +8gn8p +8gntr8 +8gomahn +8gracc8 +8h154211 +8h3930 +8h4rfv +8hannibal6 +8helmut8 +8helpers +8hfsalhj +8hksl +8hth6 +8htover +8hwbs +8i7mfqob +8i8i2 +8ihg2 +8ijnc756 +8ims4jla +8isq5 +8j1g1y1 +8j600 +8jacky14 +8jaimie8 +8jgjn +8jngg +8jo3f94t +8joyaba +8jt6akbp +8jumboo9 +8jyr0430 +8kPZta +8kac0 +8kei58 +8kkclq +8kl3dm +8kmu8uo +8kntxa95 +8kutub8 +8l3tt3r +8l81n9de +8leroc8 +8letters +8liza0 +8llz3grk +8lsx3o +8lszu +8lueeyes1 +8m0ah5re +8mak8mak +8maria +8moot30p +8mrx1fya +8muey +8n14sw7d +8n1Wft +8nHDBt +8nadb2o +8naiwt +8naj5n9m +8nb8vg86 +8ngx3un5 +8ni1011 +8nipphf +8nivek8 +8nostromo +8nqjc +8nwf4jsu +8nzvm +8o8ym +8oETE +8obmam8 +8ogl1 +8ojf4w +8ol1x +8olxd +8oolv +8oypn +8p3dgfrv +8pi64pxr +8pigswill +8psb5 +8ptvy +8pu97mx +8q871fpu +8qb3t +8qfobav8 +8qlyv +8r3ss2 +8rbgjmfb +8ri7dusi +8ripken8 +8rooney +8rsch +8ru4wese +8rwq4 +8s795r +8schnalle6 +8segx +8selanne +8simran8 +8sl7b39 +8slotter9 +8stidnwb +8sywg +8szh7 +8t1ka +8t6wrx +8t759m41 +8ta3k +8tfj85hc +8tfwm +8tg6w5 +8thaugust +8tia17 +8tpu4 +8tqji +8txkb +8u1137 +8u1Ent +8u4eb +8uhbgr43 +8uidu +8ung3r +8upzn +8useR8 +8ux24xc2 +8v9wpug +8vaisbrg +8vdyt +8vh83jdj +8viviwus +8vnz881r +8vw9dd +8vwen +8w07uz +8wb317 +8wcba +8weedllf +8wezw828 +8wkqza +8wnHxB +8wqvo +8x7yqpc1 +8xhxa +8xhxf +8xpdhpck +8xt3ia2s +8xyiefbz +8y3ri +8y6g8622 +8ydweo53 +8yiqj +8z0z1z2z +8zaandam +8zlm9 +8zsc2 +9 +9+*%8FX +90 +900 +90000385l +900045090 +9001085760 +900153209 +900203585 +900215 +90023076 +9002543862 +900307 +900323ak +900326 +9003280550 +9004023443 +9004031080 +9004091596 +900418 +90048289 +9005041190 +9005213622 +9005252215 +90052823k +9005723468 +9006 +900600900 +9006020458 +9006266524 +9006301409 +900638332 +900664 +90067951 +90069006 +9007040 +9007146626 +900721 +900739 +900768 +900817 +9008305321 +9008930 +900924 +900935 +900950 +900zxi +9010041960 +9010105089 +901013AS +901019 +9010240654 +901082 +901090 +9011 +901108 +90111001 +901111pp +901175 +90119 +90129012 +9015 +90154230 +901646 +90174224 +9019287 +901Penti +90206112 +902070758 +90219021 +9021981a +9022 +902544 +9028 +9029952 +9030202 +9031993 +9034 +90361496 +9036160384 +90365597 +903689202 +903716 +903790 +9038855 +903903903 +903912 +903953146 +90396363 +90431a +904438 +904482 +9048730706 +904906 +9050gt +9052307118 +905331hh +90533ad +90547ms +905495162 +9056234443 +9058080928 +90603 +90606236 +906090000 +906090a +9061027707 +90611 +906205 +90624641 +906487 +90672756 +906906 +90730083k +9073915 +90747094 +90762935 +90771088 +9077461 +90786620 +9080 +90807060 +90809 +9080astre +9081335 +908212 +9083121 +908353 +90862827 +90864009 +9087431 +90879087 +9087sd +90888888 +90889088 +908950416 +90898213 +9090 +9090883458 +909090 +909090rr +9090juan +9091190 +9095300 +909555 +9095967789 +90961600 +909722 +909819729 +90992 +909K1l +909night +90a4567 +90aa511 +90ae08e0 +90alicante +90aup2jw +90banda +90biberach +90c74bd +90david +90e956c7 +90et19d9 +90fatal +90ford +90gh78ui +90guenther +90io90io +90irirti +90kahlua +90maddog +90minnie +90morayo +90opkl +90rissler +90sagita +90sandstorm +90sev3r7 +90ssa +90thiagu +90vanessa +90vqhwmi +91005321 +9101038546 +910109 +9101210022 +91014099 +910172 +9102215055 +91039103 +910423ta +9104281020 +9105156254 +910578 +9105ilka +9106076560 +9106146148 +910629146 +910704 +9107095610 +910719 +910720 +91072811 +910756 +9108012916 +910802 +910808 +9108084482 +910829 +9108tobi +9109051 +9109613 +910laura +910tabea +911 +9110056352 +911060155 +9110epoc +9111020020 +911111 +9111kzinti +9111robert +9112345 +911323li +911335026 +9114133222 +91142826 +9115336456 +911555444 +91158814 +911612 +911727 +911758 +911831 +91189 +911902sc +911911911 +91199mty +911Qazws +911hallo +911ster +911turbo +912007 +912104 +9121970 +9122st +91231223 +9123495 +912422341 +91242407 +91259514 +9126832430 +9127275 +912774 +912791279 +9128886633 +91301012 +9130ast +9130c91 +913131 +913158424 +91319497 +913270 +9133 +9133114061 +913484470 +9134cca +91368s +913a46 +91402244b +9141524 +914284 +91429142 +914302754 +91431659 +91440640 +914518150 +91486735 +9148824882 +914927511 +915 +9150302 +91503791 +915205 +915274 +915312896 +915429 +915491 +915495129 +915612 +9156491564 +91598695 +9160 +916094f +916161392 +9161986235 +9162 +9162647 +9162911 +91632807 +916423 +91653440 +91654630 +916607 +9166735487 +9166909 +916691921 +916764100 +91682033 +9168633 +9168900 +9168Handy +917 +917068061 +91716617 +9172007 +917245 +91729241 +9173 +9173524 +9175gags +91765kev +91772795 +917861360 +91802146 +918182 +9182452185 +918273 +9183000a +918470 +918534 +9186261464 +918712 +9187817 +9187f5f5 +919191 +91919876 +91925 +91931 +91940 +919476 +9196171 +9197491969 +9197c1de +91986288 +919908 +91Sonja +91boom +91c68d25 +91c74a +91cornice +91cowboy +91dragonlance +91ee30 +91evpzzd +91floz7 +91fraser +91gsixty +91henry +91indi +91kelvin +91knock +91metin +91o93y +91pantera +91rul0 +91scooby +91stella +91summer +91tammie +91tattoo +91verbatim +91wiklund +9201128321 +920117 +92016861 +9203532f +9204101707 +92049204 +9205074934 +9205088723 +9205363112 +9205482141 +9205655532 +920618 +920640 +9207241889 +9207374921 +9208110511 +920820 +920821 +9208291004 +920898905 +920918 +921024yp +9210252 +92107149 +9210geos +921100 +921202 +9212036600 +9212109 +9212261982 +9212313234 +9213asd +92144126 +9215401540 +9217407 +9218624 +9219657846 +921990773 +921999 +9221191503 +92212822 +922192 +92219791 +9223054 +92236b +9225711 +9226592265 +9228 +92289228a +9228998 +922aafc0 +923064 +923211 +9233 +92331331 +92339233 +92341176e +9234448 +923533 +92354898 +923781431 +92378rtr +923925904 +92393102 +924 +92426635 +92428746 +92442843 +9244dafi +9246596 +924692 +924797665 +924clo +92501919 +92519946 +9252 +9256 +92566537 +92567tz +92585416 +925angel +925troca +92620748 +92623715 +926337 +926622 +9268522 +926rjw +92702689 +92740000 +9274926493 +9275tchm +927665 +927849511 +9279p +9280 +928007 +928093279 +92810407 +928415 +9284lock +9286170011 +92868a +92869286a +92896 +9289mj +928irte +929107911 +9292 +9294612a +92954040 +929580 +92983288 +929insane +92SCNL +92aab3 +92alejan +92awalex +92b4f0c +92cc2 +92chico +92chocolate +92dsm +92e61542 +92emmerson +92f9b461 +92fucker +92georgette +92ingrid +92jordan +92karma +92lazybones +92lg8f23 +92lisa53 +92lithium +92m80 +92mingo +92nbvcxw +92outback +92qgd +92qge +92r21h +92rick +92shivaya +92super +92tauranga +92viau92 +92z1ms +93000000 +930204 +930216 +9302204590 +9303112131 +930312 +9303147374 +9303260112 +9305058 +930505q +9305226549 +930650 +930679 +9307221865 +9308201168 +930911 +9309128412 +9309211929 +93095800 +930bf +9310083442 +9310111018 +9310223061 +931031ak +9311067195 +9311393 +93117 +93121094 +9313 +931314336 +93132032 +9314145 +9314565 +93145651 +9315093 +9315261370 +931593 +93170005 +9318894338 +9319 +9319359 +931982 +931992lm +93200953 +9321 +9321478 +932253787 +9323109 +93238539 +9325 +932568914 +93276082 +93279327 +93283023 +9328465 +93290901 +933 +93313377 +9331869 +93328d +93329050 +93329332 +9335003k +933548041 +9338xeev +93394436 +934 +934011 +934200033 +9342181668 +9342835 +9343192 +934405844 +934507547 +9346pbe +934935936 +93494119 +935015 +935239635 +9357186880 +93575947 +9360227323 +93624354 +9363 +9363385 +9363610367 +9363700 +93639363 +93646041 +936555 +93659864 +93677640 +93691870 +9371200 +93724115 +937328 +9373372 +9374567a +93760 +937E4E +938164 +938271b +9384 +938630395 +93865144 +938680184 +93868169 +93870 +9387546 +93897840 +938jme +939346 +9394papi +93959906 +9396 +93971333 +939793 +93983eff +9399339 +93Geirrod +93Stephanie +93a0921e +93abdullah +93antea +93barbie +93beebop +93bf94 +93biscuit +93captainj +93cct +93computer +93corkery +93diablo +93e229 +93e8736 +93elgub +93flood +93goodyear +93henricus +93hobbes +93hoesel +93juncm8 +93junp +93marypoppins +93mememe +93million +93pfa +93postage +93rullen +93sa87 +93seasons +93softball +93spunky +93wolfgang +940219000 +94025020 +9403027041 +94031025 +9405045551 +9405104441 +940601 +94065649e +940666 +9407437 +94090347 +941001l +941016 +9410318221 +9410811610 +9410925 +94123456 +941385 +94140081 +9414051970 +9416486 +9417 +941704 +941711 +941806Jj +941973 +9419834520 +941da89a +942005 +9420074011 +942147151 +9423221 +9423472 +942370 +9426134 +9429naha +942asfix +94304947 +9431675 +94320 +94330154 +9434526 +94347508 +943715720 +943749783 +943b6d +944 +9443856 +944482 +94480 +944894 +944900 +944b0ee9 +944d31a +945081 +945344620 +9454 +94544517 +94568267 +945926 +945d85f +946062011 +946314513 +9463273 +94638107 +9463960 +9463Xx +9463tj +94651095 +9465213 +94669222 +9468774 +946eva +947224213 +9473025616 +94730320 +947494jc +947658s +947733 +94793835 +94800 +948178 +94825 +94826247 +94831635 +94839483 +948413 +9490721 +94929492z +949345 +94939101 +94949 +949494 +949596 +949822168 +94B1D7 +94BARBELO +94Fascist +94Marcos +94Nim +94VOLVIC +94a663bf +94cobain +94d0df0 +94d59a1d +94d97b +94etaLk +94fegg85 +94fescue +94ff3103 +94fisk94 +94jagger +94jeep +94justin +94kingdom +94kizd73 +94merlot +94nfvhev +94noodle +94plaything +94valiant +94viktor +9500521 +9500946 +9501190002 +9501660 +95016922 +950189d +950235 +950312dl +950350f9 +950359895 +95040326 +950417036 +9504184 +95048610 +9505054405 +9507215788 +950fe3e +950mci +951 +9510 +95100 +951000 +9510225312 +951047255 +951091 +951123 +951156lk +951159 +95120 +95123456 +951235789 +9512367891 +95123as +95129505 +95132147 +95140061 +9514563287 +9514ee +95150t +95154470 +9516 +951623 +9516432885 +95171275 +951753 +95175345 +951753d +9518264 +951851 +9518513 +95185131 +951951 +9519592007 +9519646895 +951983 +951988 +951jfa +951kvhqc +952000 +952024dj +9520423 +95209520 +95214 +9521478 +95220522d +9523932429 +95246800 +952521700 +9527587913 +952760 +95277544 +95289528 +952964328 +952db80f +95303030 +95312975 +9531395313 +953661100 +95373b01 +95374220 +953953 +953hp +953jer +95403787 +954039 +954076 +95422459 +954251 +9543431 +954396298 +9543zx77 +954o8 +95510389 +9552172 +9552243376 +9552sl +95540432 +955427f8 +955505705 +95556 +9555959 +955714 +9557160 +9557321 +9557339 +9557804 +95584854 +95587836 +9558fo +95592333 +9560edee +95620 +9563 +9563630 +9564002313 +95641128 +95648and +95652445 +95655659 +956695 +956700000 +956742 +956824500 +95684233 +9569 +9569446 +956e452 +956srb +9571255 +957253822 +9576597 +957671 +95782107 +9581226713 +95816 +95822089 +9583415 +9583717 +95843125 +9584357 +958523104 +95859585 +958674123 +95910783 +95911 +959117 +95924f1 +9593200 +9593aa9e +9594976 +959505 +959595 +959697 +9598 +9598 +959952 +959qw +95ashlyne +95bdfe +95billy +95bq3jcx +95bradda +95caribbean +95chronic +95cubes +95damage +95dillyn +95dougal +95e2t41p +95fredfred +95k46 +95langenberg +95m92 +95mandela +95omq +95p9011 +95panorama +95sunflower +95truckie +95woodie +95yama +9600av +9600rp +960123 +96013218 +96014320 +96024 +9602478 +960414124 +9604208880 +96050ba +96055008 +9606629021 +96071980 +96081371 +961001 +96109983 +96111111 +961129 +961145 +96132533 +961422559 +961495734 +96159005 +9616094 +96172158 +96197037 +961989 +961fd99 +962020048 +9620376 +9621141424 +9623967w +962404321 +962515 +9625539 +962763849 +962824 +962855 +9629045122 +963 +963147 +963157 +963181991 +963214 +9632147 +963258 +9632587410 +96329622 +9633063129 +9634127 +963479230 +963515 +96353374 +96356789 +963741852 +963741js +96379767 +9638008 +963824 +963852 +96385265 +963852741 +9638527411 +963852pm +9638898 +963963 +963963963 +963984 +964006 +96409300 +964207692 +96436976 +9643721 +964462358 +9649684111 +9650974 +965141 +96519651 +965229387 +96528 +9653142007 +965374 +9654238 +9655206 +96556990 +965824 +9658545 +9658lulu +9659530024 +965965 +965ba7b0 +966 +966021q +9660907 +966118 +96621ad6 +9664244 +9664409 +96645058 +966474282 +9665557 +96658473 +9666108 +966797196 +966850 +96713 +96731444 +967710 +9679565 +96796 +967Ets +967beygir +9680167028 +9680993 +9681102 +968308 +968396 +9685 +968574 +9686314 +9687546814 +96891012 +968963453 +96900266 +96906231 +9691 +96922694 +96940411 +969590 +969696 +96984460 +96Molly +96Worsley +96ashley +96c6eeee +96carob +96d105ee +96essen +96feb3 +96hayward +96marcos +96mo9m +96netscape +96nosila +96paco93 +96paladin +96pardes +96popcorn +96skiing +96tossing +96uuvnpl +96za2b75 +96zinger +9701099 +9701414246 +9701967 +97029007 +970301043 +97031903 +9703220816 +97050218 +97060231 +9706496 +97070417 +9709160465 +970947 +97095160 +971032631 +9711195 +9711tora +97120045 +971230593 +97125847 +971364520 +971386086 +97147f9 +971496208 +97156040 +971636647 +9716496571 +9717036 +971757800 +97183332 +971873405 +972061 +97219318 +9722086 +97223518 +972309 +97232kj +9724220032 +9724503565 +9725274768 +9725lwe +972794 +9728276 +972gatto +97300178 +9731017 +97324584 +973353 +973478586 +9734869 +97371539 +97373269 +97378747 +9737efa +9741399 +97422619 +9742424 +9744231 +9747627 +97484054 +9749326a +975123 +975310 +97531194 +9753190w +975350 +9754056838 +9755083123 +97555782 +9756220 +9756268 +97575203 +9757rk +9758381 +975db2 +97611280 +976253598 +97639027 +976530 +97663477 +97670877 +97675653 +97690272 +976cef +977312307 +97741832 +977547085 +9777897 +97782 +978124635 +978171 +9782191963 +978321 +9785084d +978649 +9787900 +97890772 +9790087 +97900896 +979070 +9791185 +979123 +97913664 +97917984 +9793042a +979335782 +9793vsvs +9794131 +9797 +979797 +9797head +979814 +97986666 +979872514 +9798979 +979899 +97990740 +979976676 +97Danielle +97GD0P +97Redhand +97a83z +97andrea +97ballet +97bb5609 +97bowmaker +97chevy +97dozie +97f3d5 +97f54a46 +97fa7920 +97farter +97godman +97huangyan +97jetta +97leggie +97leili +97liverpool +97nichole +97pissed +97probe +97romanow +97silent +97tuongvi +97vivace +97zimbabwe +98 +980108042 +980125 +980191 +9801tnguyen +9803735395 +980381 +980480 +980516263 +980517 +98052147 +9805d4 +9807013131 +98086857 +980891 +9809 +9809521 +980aw +980james +9810 +981018531 +9810208 +9810211044 +9810451 +981108 +9811217 +981220 +9812az3 +981356465 +981400 +98142020 +9814535 +98151013 +98154711 +981564153 +9816374 +9816501 +981655 +9818 +981940 +981952 +981958vw +98198073 +981990DK +981ph +98202181 +98210026 +98213850 +98218059 +9822180380 +9824179660 +98243395 +98257642 +982888 +98294489 +98296033 +982bb9e +9831258 +983228 +9833ramona +983422 +9834xxde +98355083 +9836 +9837agil +9839 +983tOv +9841123 +9841777721 +9841854 +984222zb +984269 +98431998 +984375b +984458 +98489189 +98496698 +985014 +985044 +9850612069 +98524111 +9852479631 +9855046 +98553083 +9855757 +98565519 +98571152 +985758 +98579044 +98582455 +986 +9861392 +986231508 +9862995 +98636526 +9864022 +986532 +986532147 +9865f70 +9866338 +98679867 +986874 +986875 +986879 +98700222 +9870f1 +9871000 +98711103 +9871120 +9871218 +98712289 +987123654 +98722030 +987234 +987240dd +987321 +987321400 +987412365 +987415 +9874151 +9874155 +98741a +98741h +987456 +987456213 +987508 +9875105 +9875123 +987520123 +98756r +9876 +9876123 +98765 +987654 +987654321 +9876543210 +9876543211 +9876544562 +987654a +987654sv +9876988 +9876redp +9876tx +9877 +987786001 +987802 +9878424203 +98785868z +98790348 +987978 +987987 +987bandits +987bf2e5 +987clu +987mdcn +987wouter654 +9881jokke +988223 +9882974 +9883446 +9884128232 +9884362098 +98843946 +9884541 +9886200783 +98865240 +98868073b +98869886 +98879887 +98881086 +98893237 +989 +9890 +9890285968 +98903200 +989056 +9891073 +98912162 +98916135 +9891816 +989182500 +9892180126 +98921947 +9894176161 +98953990 +98958044 +9896 +989801 +98982000 +98982490 +989898 +98992928 +989uyt +98HMeL +98Halinka +98a3af +98b1947 +98b899 +98baggins +98bdfg +98codeine +98e1tvtv +98e6y37z +98e9901 +98festplatte +98fluffy +98h89 +98iiiiiii +98ikea00 +98kcg8 +98l54r2 +98loveme +98nn19 +98pigg98 +98princeton +98redbone +98robino +98spunky +98uk3t04 +98volvo +98warped +98x98x +990055 +990066 +99010777 +990120 +9901332 +99028296 +990305 +99034942 +99035595 +9904247564 +990427 +9905021 +990512 +990624 +9906756 +990711 +990f7b +990tyw +99100037 +9910210020 +99104448 +9910523 +99111062 +9911296 +9911500 +99115476 +9911759 +99119911 +9911kh +991220ok +991238 +9913547 +9913932 +9913b2a3 +9915059 +99153085 +9915379t +9915966638 +9916199161 +9916699166 +9917313f +9917630 +9918256 +991984 +992 +992040082 +9920924 +992198903 +9922031977 +99221622 +992249db +992277 +99229692 +9922nntt +992315 +9923472882 +992796608 +99281761 +99282014 +99286539 +99287459 +9930948 +99315315 +9932393 +9932545 +9933111144 +99334411 +99335417 +99340477 +9934772 +993492bd +993556431 +99361022 +9937079 +993799 +9937robert +993949294 +993c3ace +993lz2 +994020 +99404357 +99428459 +994788660 +9948449 +99495xx7 +994sp96n +994sushi +9950959 +995211 +99522418 +99529756 +99531759 +99549954 +995511 +9956031884 +995738225 +9958 +99582908 +995tre +9960087729 +9960230 +996186528 +99632377 +99633706 +996453 +996633dj +9966552284 +9966895498 +99687049 +9968912192 +996920 +9969dl +9970425658 +99709970 +9971 +997123 +997195111 +997213904 +99734330 +99735ad0 +997471499 +9975004 +997516 +9976601186 +9977 +9977257502 +997755 +9977576 +997789 +9977ey +997809as +99789978 +9978pqkx +9979seitz +997kylo +998 +99808770 +99809980 +9981053 +99828607 +9983032 +9984121 +99856651 +998735 +998748 +9988 +998877 +99887766 +9988856384 +998899 +9988xdj +998999 +999 +999000 +999101 +9991172 +999222 +9992229 +99924414 +99928dc3 +99951100 +999529 +999558800 +99956800 +999666 +999666 +999666999 +99968459 +999699 +999764 +999777555 +999888 +99989 +9999 +999900 +99991111 +9999199 +999988 +9999887 +99999 +999999 +99999999 +999999999 +999999999! +9999999999 +999999999abc +9999flore +999beers +999head +999hedgehog +999lines +999loki +999of777 +999sing +999xxx +99Eminence +99FDD3 +99a0058 +99ava9on +99basca +99bobkil +99ch4613 +99df +99dually +99duration +99dvd4y7 +99ecad7 +99elephant +99f7118 +99fdee +99flip9 +99floors +99foster +99gretal +99healey +99hester +99kaiapoi +99medieval +99newnan22 +99paul99 +99pisven +99taters +99tulloch +99twila +99usaid +99uyj +99valentin +99vegeta +99wahnsinnig +99xrtb96 +99xy989 +9A2DB0 +9ADFD +9BF74D +9CJ2 +9DIBG +9F1B4 +9GUGAae974 +9H(4ABJ +9JULI1 +9KDK0R0B +9NdVvH +9R6NGB +9T63NR +9a123123 +9a130398 +9a14y7 +9a33ea5 +9a4504 +9a48ht6f +9a4t6g +9a5528 +9a6b5n9g +9a71c +9a82a4 +9a905c +9a9dcvgw +9a9s9d9f +9aLynette +9aaztec99 +9ac7fb6x +9ac93ebe +9acarolina +9adigfut +9ae066 +9aff1a1 +9aff64 +9akittycat +9aknockers +9alapland +9am5uuu +9amagpie +9amatruh +9amolson +9amsharp +9anhz +9aniggles +9antelis +9atrucido +9axhj +9b4cc602 +9b66d7 +9b6e64 +9bHealth +9ba1w +9bacchus +9badmin +9bbened +9bcatcat +9bctt +9bdawson +9bdddddd +9bhpked +9blugano +9bmatr1x +9borders +9bqj4 +9bqwerty +9bramirez +9bsecret +9bwood +9c11235 +9c1234 +9c23ec60 +9c5822 +9c58d7cf +9c94r417 +9cab6b +9cafrika +9cbooboo +9cc99f63 +9cdirector +9ce727 +9ce8863f +9cec898b +9cfa62 +9cirina +9ckaiser +9clizard +9cmadison +9cmaniac +9cnewyork +9color1 +9concern9 +9conion1 +9credyp5 +9crismo5 +9csc0tia +9cscnet6 +9cwicked +9cxthv76 +9d126303 +9d1881 +9d1rm864 +9d3716 +9d46ef17 +9d624d2 +9d7bxb23 +9d9mbvq +9dChantal +9dROBERT +9dXXXXXX +9da541 +9dafcea +9darches +9dbella +9dc0mputer +9dchesco +9dcorliss +9deh9ra6 +9df809 +9dfa9fad +9dfootball +9dglobal +9difo +9disaack +9djackson +9dkathr +9dlogan1 +9dpatty +9dpython +9drhulen +9dsquid +9dsuppe +9dtrinidad +9dvera1 +9dwarwick +9dwojtek +9dwombat +9e290b97 +9e59c5f +9e81107c +9e8d7c7 +9eRebels +9eapsley +9eba7d +9ebandit +9ebfna +9ec79a +9ece48 +9edbb1 +9edward +9eec3c +9eeverton +9efigtree +9ehacogi +9eijz +9ejeri +9ejh3c1f +9eldir3 +9elus +9emadmax +9emadness +9emarianne +9eqshfn9 +9erosehill +9ersrule +9esmeghead +9espencer +9est449r +9ev5s45n +9eyzj7lj +9f1915 +9f2ahjhy +9f9d51bc +9fFr +9fadoni +9fathfath +9fchrissie +9fdockers +9fdolphin +9ff690 +9fgoldie +9fhammer +9fmiaous +9fpaul1 +9fplasma +9fpython +9froxanne +9frpc +9fsoccer +9fsueson +9ftwisted +9fv2uwcz +9fyellow +9g0oxbj +9gFGN +9gbgu +9ghetto4 +9gnjj +9groulx2 +9gzq0 +9h478 +9hUsz5 +9hcc5 +9heartbut +9hi5t7 +9hidj +9hquak7u +9hsle +9hw27m1 +9i7jk6 +9i8UTz +9iailion +9icox +9idrytt3 +9ieqlawo +9ijnmko0 +9ijnmko0 +9iubiug2 +9iulnx +9izkkzi9 +9izpd +9j82ou82 +9ja7g +9jbqy +9jibbas +9juhtxz8 +9kambing +9kanai9 +9kd178h +9kendo9 +9kendra6 +9kfe2 +9kflc +9kings +9knuf +9kurt4 +9kvyv +9lelzh +9lighter +9lij7 +9ljkox9k +9lqul +9lyvj +9m32uu +9m55b +9m8ur +9master9 +9mco8 +9menary9 +9mh7lxn +9mjwna +9mk0ttta +9ml7s +9mpwy2sz +9mt4w4g7 +9myp83 +9mzig +9n3if +9n9999 +9nmhm +9npvfgl9 +9nqw035 +9nrkw +9nvd8 +9o0p90op +9ovaq +9ovk5zz +9p7a5 +9p9m0p7 +9p9u1v +9pev0gy3 +9phillip6 +9picea55 +9pnn7ps9 +9pnya +9prmc9 +9psht +9qanf9 +9qkyrax +9qqu1q +9qsi4pen +9qtsz +9qvkp +9r1fvs +9r7yui1e +9r839r83 +9r8ljrpo +9rb6t +9rb6tqw +9rdo5b95 +9rjpf +9rkhosok +9runner9 +9rxy31cm +9s3os +9s5mhi7 +9s9eu +9sadako +9sarcasmo9 +9sdfa0w3 +9sekretne +9sers9 +9skol999 +9skww9 +9soup12 +9srxw +9srzn +9sycjyqk +9t793273 +9thg9 +9tttfqy4 +9tvgq +9u2n4r4b +9uasr6hj +9uaxa +9ubqf +9ulusoy1 +9univers +9unpbmef +9uuseu +9uuuc +9vendett +9vkxl +9vsy3awy +9vtje +9war123 +9wdjn +9wdny1ue +9wfay +9wgbn +9wtco +9x30yg4c +9x8v9x +9x9gu5hh +9xbp7 +9xf3x8v5 +9xh1hcts +9xs6oesg +9xu5kzps +9yfvs +9ynz9 +9ywL +9ywev5 +9z784 +9zhnr +9zsb8hhy +: +:lopas + + += +=BG-E6H +? +?boccia! +?doerte! +@ +@!Porcaria +@.602118 +@0112358 +@17081968 +@1712@ +@1c0h01 +@54321 +@@anss +@K +@KARATE +@KKX54- +@PRB905 +@Pr0f35510nal@ +@R@XN! +@Taha@ +@Terry1 +@ct10n +@dw0rk +@less2006 +@nautilus1 +@ndr3as +@p@ssword +@snickers5 +@trollo@ +@vectra +@wert1 +@zord@ +A +A012010k +A03501667 +A091066Z +A11212164 +A117S5 +A123123F +A130479B +A1308951 +A14530 +A1lc1u +A2005K +A23q +A261172A +A27808886 +A2SnH4 +A34cvB +A3A2r1 +A3B4 +A4Tech +A4hF6m +A532mA +A57Bz +A5A0K2 +A5F93AB +A5taga +A61002 +A65B9 +A71b7W +A7a89ph +A7m00 +A813138b +A90430 +A969F +A96D8CF +A990E7 +A9s0Q1 +AA042010 +AA815346 +AAAA +AAAAAA +AAAMMM +AAASSS +AADDF +AAFF2010 +AAS +AAnthonio +AB021488 +AB270790 +AB4E7 +ABBA +ABBATH +ABC +ABCABC345 +ABCDEF +ABCDEFGH +ABCDEFGHIJ +ABCDEFGHIJKL +ABE1947 +ABEDUL33 +ABFAHRT00 +ABIDAL +ABR462 +ABRENT +ABRIL129 +ABc +AC10194 +AC51x +ACCACIO4 +ACES5000 +ACL1920 +AD0L +ADAMKO +ADCDE45 +ADDADD +ADDONIS1 +ADE5CAROL +ADKINS +ADM +ADM#AMP +ADMIN +ADMIN20 +ADRIA +AEJT01 +AEROMAT01 +AEcool +AF7gvsCQ +AFCE6 +AFE28 +AFafAf +AFd +AG1118 +AG2084 +AGGIE1 +AGNE4X +AGOSTO +AGOSTO33 +AH7411 +AHMED +AIKON328 +AJK98KO +AJKDLM +AJSH +AK0136 +AK0910 +AK994074 +AKENATON5 +AKRA2035 +AL051974 +AL0H@ +ALANTE +ALBARRACIN7 +ALBERTO1990 +ALDINO +ALFA +ALFABET123 +ALIOSHA123 +ALLAH1 +ALLIN1000 +ALMERIA2010 +ALO123 +ALPINIT +ALTIMA +ALUCARD +ALUCRA +ALVARO23 +AM01881 +AM2729 +AMARILL4 +AMATECH33 +AMD +ANABEL57 +ANAIRE08 +ANASTAS +ANDREU15 +ANGEL1975 +ANGELICA66 +ANHNAM +ANNA24 +ANNASO +ANTEQUERA1 +ANTONH +ANUBIS +AN_44 +ANderson +AOS +APAY2010 +APER +APR1L01 +APRIL +APetS +AQ +ARAXI +ARCHI3VADOR +ARKAw +ARNAUD +ARR +ARTMAN +ARTYI +ARVIN +ARYAN +AS +AS+3QK4 +ASD123 +ASDASD +ASDF +ASDFGH +ASE +ASGHAR +ASLI +ASP306 +ASSOR2 +ASTROS +ASdf12 +ASqw12 +AT6721 +ATATURK +ATHENEA03 +ATILAS +ATION6 +ATLETA25 +ATT2 +AU53921 +AUCOIN1 +AUSSIE +AUT0MAT +AUTO1972 +AV$4HNO +AVIZO1 +AWH26 +AWKWARD +AWfnR1 +AWtMhR +AXAS77 +AY +AZ +AZERTY +AZz +Aa555555 +Aa9876 +AaliYah +Aasgeier +Ab12 +Ab1234 +AbCde +Abakan +Abakus07 +Abarth +Abbadon99 +Abbes09 +Abc321 +Abc456 +Abelleira1980 +Abigail1 +Abitur +Aboriginal +Abril2010 +Absurd83 +Abvs21 +Abyss +Acalips +Access +Accessinua +Account1* +Ace +Achernar01 +Achieve +Acj7320 +Acon21 +Ad284000 +AdMiN +AdMiN2 +Ada6Mn +Adam +Adanos!? +Address1622 +Addy3 +Adeamo +Adjust16 +Adler +Adlope +Adm!N +Admin +Admin1 +Admin123# +Admin147 +AdminAdmin +AdminZ +Adminadmin +Admini +Administrator +Adminlon123 +Admins +Admiral +Adnan +Adrian +Adrian! +Adrian1 +Adric +AdriennE +Adrimin1 +Aerdna32 +Affe20 +Afterburn22 +Afterburn91 +Afterlif1 +Afyonlu +Agamemnon13 +Agape1992 +Aggro +Aghost +Agiel180 +Agreel +Aguila1 +Ahmed2002 +Ahmed9 +Ahoj +Ai06 +Ai5396 +Aichele +Aidan822 +Ailliot7 +Airforce55 +Airis +Aisha8903 +Ajaitr +Akeem1999 +Akimbo1983 +Akinorev +Al19dh +Aladdin +Alain +Alapalooza1! +Alaraja +Alarm2008 +Albion111 +Alcatel1 +Alcatraz +Aldebaran +Aldebaran68 +AleC12 +Aleksandar1 +Aleksandra1 +Alena1981 +Ales +Alex1707 +Alex9141 +Alexander +Alexandra80 +Alexandros +Alexia +Alias +AlieN2 +Alienship135 +Alina2711 +Alive215 +Alle01 +Allegator72 +Allen0930 +Alles65 +Allister12 +Allmanbr0s +Alma +Alma1sy +Almedin1 +Alobar123 +Alpha1 +Alpha1Alpha +Alphonso1 +Already222 +Alt123 +Altersack1 +Altoel +Alucard +Alundra01 +Alvilda1 +Alyssa126 +Alysson +AmAnita1 +Amalek88 +Amandine21 +Amber +Amberley09 +Ambers123 +Amely +America +Amerin123 +AmiUni +Amistad +Amlas +Amon0000 +Amon13 +Amptron +Amravati +Amsterdam +Amy686 +Amélie +Analsex +Anarkia88 +Anastasia. +Anatevka1 +Anathema1 +And!reas +And20M +Andaro +Andilan +Andra1293 +Andre +Andrea +Andreas.1 +Andreas2208 +Andrew +Andrew2010 +Andrikos +Andromed4 +AndrzeJ +Andy91 +Anemik +Anemone1 +Anfang10 +Ange2B +Angel +Angel231 +Angel5673 +Angela1929 +Angelb0y +Angelika +Angelika52 +Angeln10 +Angels +Angelus +Angila0018 +Angmar008 +Angyal1 +Anilda +Anima +Anime +Anita +Anja +Anjelica +Ankat1 +Anmar85 +Ann0579 +Anna-Lena +Annapolis1 +Annchen +Anne25 +Anne87 +Annemie82 +Annett04 +Annwn111 +Anny84 +Anonymous13 +Another1 +Ant1l0pe +Ant1past0 +Anthony +Anthony7430 +Antifa +Antifa! +Antimo70 +Antje3004 +Anton0208 +Anton143 +Anton2405 +Antone7162 +Antonio +Antony +Anulka81 +AnwendeR +Anyware111 +Apace27 +Apfe1baum +Apocan2006 +Apollo13 +Apolo138 +Apolon +Apple432 +Apple5871 +Apples +Apulien +Aquila1769 +Aquinas +Ara4gorn +AragornE +Aramant0 +Arany50 +Arbeit08 +ArbeitArbeit +Arbosch +ArbuZz +Arc551 +Arcade33 +Arcane628 +AreA51 +Arend +AretA +Argo9617 +Argyle3426 +Arizona1 +Arkangel +Armandito +Armenius +Arno1962 +Arrakis85 +Array +Arroyo +Arsch +Arschloch +Artemis337 +Arua9 +Arwen +Aryanna82 +As4554sac +AsSir +Ascan1 +Ascen +Ascherl1 +Asco12B +Ascoline +Asek85 +Ash8ley +Aspelta +Assasins89 +Assassin +Asshole1! +Astaroth +Asterix81 +Astra +Astra +AstraF +Astraf11 +Asylum2009 +AtKYh5 +Athena +Athena918 +Athlon82 +Aticia99 +Atlantis +Ato743 +Attenzione +AudiA8 +AudiTT +Audra2004 +August +August06 +Augustiner +Augustyna +Auktionen96 +Aurelien1 +Aurora +Austin! +Autocad +Autohaus3 +Automapa +Autoteile +Avaritia29 +Avarra +AvenSis +Avenger +Aventia2008 +Averline +Awareness1 +Awesom0 +Awesome +AxBx +AxDg6Xo948 +Ayanami +Aylen2009 +AylinAylin +Aysha +Az3rty +AzErTy +AzK +Aza +Azrael84 +B +B!GB00B +B072a156e +B0BLE54 +B0dR3X +B0eller. +B0mbaym1x +B0r15 +B0st0n +B1ack0ut +B24OPKG +B2a63F +B30BXYJ +B3aUo3R274 +B3ckS +B452s +B4xbmn +B52007 +B59479066 +B654321A +B@VB1A# +BA47cd +BABA77 +BABYLAND +BAC0T +BAF3A +BAL3ARD +BAL9999 +BALDER +BALDOR +BALSER10 +BALTUS +BAMBI +BAMbam +BANC@20 +BANDER1LLAS +BARBARA440 +BARKING +BARNABE18 +BARTOLO8 +BARocks +BAtaka +BB12E +BB310583 +BB8582 +BB9AM +BBBOOM +BC9EE +BCeUeN +BE10937 +BE260159 +BEEFCAK +BEET44 +BEN +BENITO72 +BER2GA +BETH +BF1942 +BG6296 +BGALCU +BH137565 +BH6286 +BHAASCH +BIGBLOCK +BILLSOF +BIMeD2 +BJ020396 +BJ0713 +BJC101 +BJC22 +BKL2008 +BLA +BLACKY +BLANES +BLANQUITA16 +BLIZZARD91 +BLOB +BLOODY +BLT2Tj +BLoGMe +BND66 +BNM123 +BOHEEM +BOJANI +BOLETUS +BOLIVIA +BOOTWOR +BOXERS3 +BQ +BR00KLIN +BR1048 +BR456789 +BROOKSIDE +BRUNO1 +BS# +BTLR9H +BTN1Vy +BTn +BUCHds +BUDHA +BULENT +BULL$EY +BULLIT +BULLKJH +BULOVA8 +BUNGLE4000 +BURGUILLOS33 +BURIAL +BWHSS +BaMH6 +BaMbY +Babaika +Babf0 +Babylon5 +Back99 +Bacon555 +BadBoy +Badboy +Badewanne +Badgirl600 +Baer0806 +Bagel4623 +Baggage2 +Bahamas +Bailey0420 +Balarsen +BallaBil4 +Balmes55 +Baltimora +Baltrum +BamBus +Bamberger +Bammie +Bandan2001 +Bande18 +Bandit100 +Bandit26 +Bandoth +Banjie +Banou132 +BaraDa27 +Barb05 +Barbie1707 +Barneyb1 +Barnie +Barolo00 +Barolo95 +Baron2210 +Barrack01 +Bart92 +Basil1502 +Basile92 +Baskent +Bassart +Bassfaced +Bassie +Bastet +Bastien +Batista1 +Batman1 +Battleaxe1! +Battlestar +Batzen +Bauer +Baum +Baumschule007 +Bayern# +Bazooka +Bbant5 +BeBlog +Beaa138 +Beads2009 +Beamen +Beanie +Bearbear11 +Bearcat046 +BeateK +Becia0140 +Becks +BeeGee01 +BeeGees4 +BeePHP +Beeble01 +Beer1022 +Beerbower02 +Beginner +Behavioral +Beholder12 +Beita +Belantis +Belgarath13 +Belial123 +Belial76 +Bemann +Bemerode +BenQ75 +Benavidez12 +Bendiksen76 +Bene1506 +Bengals14 +Benjamin! +Benjamin!1 +Benjie +Bennet +Benny1406 +Benson85 +Berco +Berghorn12 +Berit4631 +Bernadette2009 +Bernadus46 +Bernau67 +Bernd1410 +Berni2801 +Berolina24 +Berserka8 +Berta +Bessy15 +Best251 +Betaames +Betina*2 +Betsy0345 +Bettdeck0815 +Betti1985 +Bettina1965 +Bezirk18 +Bfv6Pw +Bhar +BiGfoot7 +Biagi2010 +Bibc1990 +Bibi +Biddle11 +Bieber01 +Bielefeld +Bielik +Biene +Biene0815 +Biene5104 +BiertjE +Bietschez +BigKick1 +Bigfoot2 +Bigheads0 +Bigtime +Bil1ly +Bila89 +Bild +Bild3200 +Bilder +Billbill3 +Bille +Billi1209 +Bim263 +BioHazard1 +Bioko +Biomedical1 +Birgit +Birgit1 +Birgit39 +Birne3947 +Bitburger +BiteMe +Bjarne35 +Bjarne389 +Bk9638 +BkBGnb +Bl040109 +BlaBla01 +Blaat! +Black +Blackfire86 +Blacky +Blacky3145 +Bladder007 +Blade +BlagM8 +Blake +Blaney01 +Blanka11 +Blanou01 +Blattlaus01 +Bliksem26 +Blitz +Blixten74 +Blizard5 +Blizzard1341 +Blizzard6 +Blockbuster +Blog +Blood +BloodAxe3 +Blub +Blue10 +Bluemoon424 +Bluenote1 +Bluesband90 +Bluesman +Bn135790 +BoMbErPiLoT85 +BoaBoa +Board4 +Board5 +BobDole77 +Bobbert88 +Bobby +Bobby2107 +BobbyG +Bobs21 +Bobson +Bodley123 +BoeMa +Boggle +Bogle +Bognor05 +Boguzki +Bohmte +Boilers8 +BoingBoing00 +Bokstav14 +Bolle +Boluda38 +BondBond +Bonez1369 +BoniFaz7 +Bonnie0906 +Bonny +Bont2611 +Bonzo +BooBoo +BooN +Booger78 +Boogie1 +Boomex +Booth1865 +Bootleg1 +Bordeaux +Borland2006 +Borussia9771 +Bouba +Bouboule +Boulder2 +Bounty +Bowling0 +Bowman +BoxxeR +Boyett80 +Bozzone +BqsVY1 +Br0t +Br34K +Br549 +Braccina +Bracken20 +Brad396 +Braddock123 +Brago100 +Brains78 +Brandenburg2! +Brandon699 +Brands420 +Brasov74 +Bratley +Bravo949 +Breakdown +Brecht5972 +Brian2272 +Brick +Brina2312 +Broilers123 +Brooklyn16 +Brownb00 +Brub@ker +BruceL +Bruddha +Bruening4711 +Brujah777 +Brunnen +Bruno1951 +Bruno3797 +Brutus +BryanA +Bs41hO +BuZ +Bubac666 +Bubbles +Bubi77 +Buchwalde +Buddy616 +Budweiser21 +Buetti98 +Buffalo +Buffy446 +Bugger1! +BugsBunny +Buick1983 +Bulent +Bull +Bulldog27 +Bulldog5 +Bullthor +Bum115 +Bundeswehr +Bunga +Bunker2009 +Buria +Burice32 +Burko582 +Burleson1974 +Burton +Busche +Bushido2001 +Busilade +Bute92 +Buxtehude2 +Bwf642 +Bx23K4 +Byakko +ByeBye +Bymer +Byq87 +Bzr3039 +C0D312 +C0R0N44 +C0ffee1 +C0mputerz +C0nf +C0smos +C0staR!ca +C10 +C150858O +C1cbb2 +C22O#!G +C28pv +C2D1S1* +C30na1 +C3A3X3A +C3P3D3 +C3R3M3 +C3rb3r +C45513 +C4633384 +C4R1n3 +C65221 +C6603251 +C7A0CRT +C7tkw +C83025 +C9AC01 +CACTUS +CAL-TEC +CAL0NGES +CAMELU +CAMP1ONS +CAMPOY +CAPILEIRA5 +CAR1LINA +CARANT02 +CARAVANA1 +CARDINA +CARIOCA +CARLOS +CARPENTER21 +CARYD28 +CASHIER +CASUAL +CATALANS1 +CATFOOD +CATcat +CAYMONE +CAZALLA2 +CC220022 +CCC +CCLAIR +CCMT01 +CD250295 +CD754P +CDA15 +CE2E8H +CELEDONIA0 +CERT276 +CESARIUS197 +CEYHUN +CFIL +CFM004 +CFRMRA +CHANGEME +CHAOS_5 +CHBR1999 +CHEMIST +CHEVYS +CHIBCHA +CHINITA +CHLOE +CHOCOLATE +CHRISTOPHE +CHU%RN +CHUSKY +CIKLOM +CL-SH76 +CL4N +CLAMAT +CLAUD1A1 +CLICKTR +CM03 +CMKJ +CMSS +CN456789 +COCOON +COEK25 +COFRA1DE +COISOET +COMEMELA2 +COMERC1O +COMPAQ1 +COMPAS5 +CONFiG +CONGRES +COPENHA +CORDOBA +CORRA1LES +CORSAIR +COSITA +COURAGE +COU_G*R +CP180877 +CPT0270 +CQCJN6 +CRACKED +CRAKNQ +CRAQUE6 +CREST03 +CRI@200 +CRISAN +CRISTI00 +CRISTIAN +CRISTIANO +CRODRIGUEZ +CS4390 +CS99 +CSABA66 +CSDBZ +CTKKW +CUARTA09 +CUBIC +CUDDL3$ +CUGOPU +CUKz9Y +CUONG +CURASI +CURTIS +CW +CYBERCAFE1 +CYBNK22 +CYS988 +CZEKOLADA1 +CZU7QR +C^F8CEX +C_2005 +CaMiLa +Cabinett +Caesar +Caesaru3 +CagS +CaiHong +Caitlin1 +Cajon2008 +Calab0z0 +Calamity16 +Calculating +California +Calimero +CamJon +Camaro1967 +Cambio2 +Camel975 +Camelot777 +Campeones1 +Campett11 +Campo1 +Canabis91 +Candyman +Cannoli218 +Cannon221 +Canon180 +Canseco123 +Cantina +Cantus12 +Capalua +CapgW +Captiva07 +CarJack33 +CarKon +CarMel12 +Caralho81 +Card6114 +Carias03 +Carl +Carl22 +Carlo. +Carlota040404 +CarlottaP +Carma111111 +Carmen +Carnaxide26 +Carnicero +Carola62 +Carouse1 +Carsten +Casaccia12 +Cascada +Cascada1989 +Casildo1 +Caspien +Cass16 +Cassi9 +Cassy +Casta4373 +Castor72 +Catch-22 +Caterina +Cathexis +Catrine16 +Cavalcader +Cavebear45 +Cazoge +Cd6234 +Ceder2000 +Celine2302 +Cellar01 +Cellofan +Centre77 +Centurio +Cepin123 +Cepter01 +Ceryk +Cetelem1 +Cetelem5 +Ch1906 +Ch218219 +Cha1d +Chacho1 +Challenger4$ +Challenges +Chandra0 +Chang3d1 +ChangeMe +Changeme +Channels1 +Chaos2005 +Chaos612 +Charcoal10 +Charel +Charles +Charlie +Charlotte +Charly011 +Charmed1 +Chase +Chavarria8 +Cheester +Chelsea +ChenLing +Cheri518 +Cherry +Chi2007 +Chicca +Chicco +Chick +Chief1 +Chinchi11a +Chingon123 +Chip4567 +Chitter05 +ChoCobo7 +Chobits +Chopalot +Choper +Chris1 +Chris9375 +Chrisi +Chrismas +Chrissi +Chrissi13 +Christian +Christian1 +Christiane +Christina1 +Christine1986 +Chromin8 +Chumby27 +Chus +Ci010103 +Ciao +Cigaro1300 +Cimarron86 +Cincilla +Cirkeline +CisCo +Cisco +Citlali +Cjac79 +Ck373438 +CkM8ap +CkmY67 +CkopnuoH +Cl4sser +Claire1285 +Clara0404 +Claudia +Claudia1 +Claudia2 +Claudia619 +Cleanjet01 +Cleo25 +Clever +Clinton +ClioV6 +Clouds3 +Clyde +CmS6eTnt +Coasters +Cobalto09 +Cobra981 +CocaCola +CodeRhapsody +Colacurcio +Coline +Colorado1337 +Comander +Comdisco01 +Comex +Commander#1 +Commando1978 +Commerce42 +Compaq +Compop +Computer +Conan +Connect +Consejo +Constantine1! +Consulta09 +Contacten1 +Conti81 +Control +Coochie +Coolie4 +Coolness +Copiloto13 +Corasta +Cord +Corel1Draw +Cornuta80 +Corny304 +Corran +Corsa003 +Cortez +Corvette +Cosmin89 +Cottbus89 +CouCou +Country1 +Courage +Craggy73 +Craiova22 +Cralle69 +Crawlinxp +Crazy131 +Cre@tive2006 +Cream +Creeper +Crey6956 +Crimmy23 +Crimson +CrisTiano +Cristal35 +Crocodile165 +Crosman +Crow +Crutches +Ct5Ltv +Cthulhu07 +Cthutq +Culloden1746 +Cup2cake +Custom +Customer +Cutty112 +CvnK +CyHcCyDh +Cyanide13 +Cyanide2180 +CyberSpace +Cz3Vv +Czarnuch1 +Czeslaw1 +D +D#MOCRA +D-CRE1G +D03015289 +D0R0THY +D0ntP@nic +D0uglas. +D123666D +D14monds +D2003! +D33C0N +D3BB7 +D3BEPP +D3DY +D3F3RR +D3ft0n3s +D3str0y +D3tonat3 +D43=WBz0pC!MBl +D43D4LUS +D4B6E0E +D4LuG2 +D4NIELITO +D4rkS1de +D55EYq +D72007 +D76891 +D7mLbo +D83y41 +D@KINST +DA2510 +DAKO0TAS +DAMIANS3 +DAN023 +DANCE4U +DANFEG +DANZADOS2010 +DAO1984 +DARCI2010 +DARGENT78 +DAVEDAVE447 +DAX007 +DAYN55 +DAngeL +DB1607 +DB270789 +DBHFSD +DC082979 +DD13899 +DEADBEEF +DEADSHAD +DEBRECEN +DECKING +DEFD3 +DEKORADO +DELAMARE +DELETE +DELONG +DEMO +DENEME +DESKTOP +DF722232 +DICK +DIETRICH33 +DIFDFG +DIGDUG +DIM9KXW +DIRKA!@ +DISPATCHING99 +DJ1474 +DJEB +DL&IEL$ +DM3R7 +DMW007 +DMlaw +DNA125 +DOKI53 +DONTSTOP +DOOM +DOTAE +DPS345678 +DRAGOON +DREAMBOX2010 +DREAMLOVER +DRECKSACK +DRFAIR +DRHHNT1 +DROMEDAREN5 +DROWSSA +DRSJol +DRjack +DS +DS25 +DSC30 +DSDc221641 +DSOM +DSoC +DUDEK19 +DUOMO$3 +DUOlom +DV8ed +DWE342 +DWud7G +Da5id1 +DaN08e +DaNJyS +DaVinci12 +Dabe +Daddy2407 +Dadou +Dafranz +Dagaz13 +Dagoba666 +Daimon +Daisie123 +Dakina1 +Dakisha2 +Dakoma +DalMate08 +Dalen31 +Dalton1 +Damian +Damian1 +Damiano1 +Damokles15 +Damon1 +Dampf +DanCer83 +Danger1 +Daniel +Daniela +Daniela1 +Danne112 +Dannyj#1 +Dant +Danzigra +Dar123 +DarK +Dark +Darkangel +Darkhammer +Darko +Darkone +Darren1414 +Darwints +Dascha1 +Dasha0714 +Dasing +DataBase88 +Datterich +Daubert1234 +David +David1992 +Davide +Davidz +Dbl99J +Dddd +DeC +DeFc0n3 +DeKKO +Deadric2 +Deaktiviert +Dearie +Death +Death1074 +Deathcon5 +Deathwing8 +Deborah +Debrecen10 +December1 +December988 +DeeEmm +Dege77 +Dehaene59 +Deimos1! +Deiner +Dekieb +Delaunay1 +Delete +Delfin327 +DeltaTau77 +Deltax1 +Demon1Demon +Demonic79 +Demonology19 +Demrete2 +DeneME +DeniSe +Dennis +Depp +Derby111 +Derek +Derek2222 +Deryne +Desayhr +Desertrid +Designer09 +Deskjet +Dest23ination +Destructo70 +Destruktor +Deutschland +DevTools +Deve12 +Deven1488 +Dezember +Dfcmrf +Dh101268 +DhDH5 +Dhaka1234 +DiCkS +DiDoX2 +DiV81x +Diablo2 +Diament0 +Diamond410 +Diana0307 +Diazzz +Dickmann +DieBitch81 +Dieckmann1 +Diedo +Diego114 +Diener1 +Dietrich62 +DigOut +Diller666 +Dilpo +Dimsan +Dingleberry1 +Dini44 +DinoDino +Dionysos87 +Diplom2000 +Diplom4 +Dipso +Dipstickz +Direct2009 +Dirk195 +Diroll +Disc +Discordi +Diva +Divinus17 +Divya710 +Dixie321 +Dixto +Dj160704 +Django1234 +Djoser33 +Dk051096 +Dmdc*389KRT +Dmitry +DmwQ87 +Docket01 +Doener8 +Doering1447 +Dog +DogMad +Dogga1 +Dolly +Dolores1 +Dolphins#1 +Dom2611 +Dominik +Domino +Don +Donald904 +Donjuan81 +Donna!13 +Donnerau +Donovan1 +Donovan101 +Dood1 +Doozer +Doreen2803 +Doreen321 +Dort3mund +DotaDota +Dp +Dp38GL +Dq@4Cc6wU8rx4q +Dr4ch3 +Dr4g0n +DrEaMsCaPe +DrOnE52 +Drac0 +Drachen6 +Drachen747 +Draconic15 +Draconis +Dracula +Draggy1975 +Dragon +Dragon1 +Dragonball +Dragons7 +Dragoon +Dragunas +Drake199 +Draken998 +Dramme03 +Drannel1 +Dreams90 +Dreamy11 +DreduS +Drek99 +Dresden +Drew +Drew11 +Droopy69 +Druider21 +Drupok6 +Drzymala +Dschungel2003 +DuMDgL +Duck0909 +Ducks1981 +Dudul0006 +Duggy2222 +Dui1968 +Dukan429 +Duke84 +Dummies6 +Dung2202 +Dunge +Dupont60 +Dur@cell1 +Duran +Dv0r4k +DwBiS +Dwarf437 +Dweezil1969 +DxAfub +Dylan1 +Dynamic1 +Dyplom1 +Dyplom2 +E +E0S! +E123 +E1U9g3s241 +E1b735 +E1j4Un +E2)7LwFJ38kom5 +E270357E +E45343S +E5g89l +E6^^ +E75TNP +E76AV +E8bel7 +E@FIRE5 +EATLX9 +ED!0Pb0IYHsTdl +EDILSON +EDRF34 +EDVzoerbig8084 +EF4A56 +EFTEKAE +EG1234567 +EGEM +EGPASS7 +EGYPTEsp +EHNwg +EI5!XZK +EISENK +EJUI0S +EK280795 +EL +ELD1ABLO +ELECTRON +ELWLXJF +EM112884 +EMEIAZ +EMOEMO +EMRJDL +EMiNE +ENGLISC +EO(%AKD +EOFcz +EREVAN +ERNEST1TO +ERREIUU +ESCULTOR5 +ESSAI +ESTHER +ESTRADILLA1 +EU1993 +EUFORIAS1 +EURO@20 +EUROPE +EVB +EVILC555 +EVKLID +EVMWFD! +EWWT +EXTAR +E_JBT#5 +Ea7p1e +Eagle1 +Earnie123 +Eastern747 +Ecki +Eclipse +Eclipse87 +Eclipsemc +Eco2423 +Ecoto +EddY +Eddy2 +Edenko +Edi +Edi1 +Edit1 +Edith +Edition100 +Edmond +Edmonton +Edmund0815 +Edoardo +EdtV2L +Eduard +Eduard4985 +Eduardo9287 +Edut1tal +Edx9Uy +Ef064726 +Eg0610 +Egersen +Egnoj4 +Egoist3006 +Ehrmann. +Eibach30 +EichHorn +Eifeler +Einkaufen#3 +Einkaufen1976 +Einstein +Eintracht +Eio2Ew6369 +Eiphnh +Eisbergsalat +Eisenbeiss +Eisvogel2 +Ejtna +Ekonum +ElPYBO +Eladamri1 +Elan7854 +Elburg +Elche2007 +Elcycib +Eleanor +Electric +Elefant +Elenor1967 +Eleonore2012 +Elessar +Elgran65 +Elisa +Elisabeth60 +Elisabetta +Elitegroup +Elsanto101 +Elsbeth002 +Elspeet88 +Eltern124 +Em4K8r +Emeline3 +Emil +Emilia +Emin +Emin3m +Eminem +Eminem1 +EmirC +Emmali +EmpowerinG +EnEsCe +Encoder +Encryption +Energy1047 +Engelbert1930 +Engine0610 +Eniac +Enian6 +Enibas +Ennasus2000 +EnrageD1 +Enslaved91 +Entecorp +EoCz4 +Ephesians611 +EpiDural28 +Epiphone09 +Epiphone100 +Eplusse +ErEr +Erdbeere35 +Erhard +Eric8247 +Ericamar +Erick +Erik +Erika +Erna1968 +Error +Eselin +Esl123 +Espresso09 +Essen +EtUUp6 +Eternal +EureKa +Europea +Eva1212 +Eva2949 +EvaEva +Evangelion532 +Everex +Everfading +Evergreen +Evrim +Ewerk2000 +EwidO6 +Ex170 +Excalibur105 +Excalibur114 +Exodia +Exodus +Exper3 +Exposed123 +Extreme111 +Eyaxb +Ezekiel9343 +F +F$n +F1901Z +F1ght3r5 +F1inanzen +F1r3c4t +F4#6SJP +F41611A +F4C2A +F4U +F5646 +F58LR8 +F789852F +F7ha4o +F@ZZ342 +F@clopez095 +FA2D89 +FABSTER +FAC1EA6 +FAGS +FAHRRAD +FAKE +FALCON +FAREAST +FATHER +FAXFAX0 +FCEBF +FCKgw +FECHT1 +FEDERICA +FELIXOW +FERRARI +FEZOBO +FFFAAA +FG01bm +FGH23456 +FGtpb +FH280899 +FICKEN +FIJ6RGY +FINE119 +FIRE +FISCH +FITDNS +FKK320 +FL#6UZH +FLAMEAL +FLAVIO +FLOQUI +FLORENCE +FLOW01 +FLOYD +FMCT5D +FNAPLA0 +FNBCVDQ +FOLGORE +FOOTBALL +FQfDG +FR0GGY +FRACTALE +FRAGMENTATION +FRANCY90 +FROSCH +FRT6Y4 +FS985)9 +FTM24 +FUCK +FUCK11 +FUCKED +FUCKER +FUCKER345 +FUCKU +FUCKYA +FUCKYOU +FUEGOO +FVqI0td528 +FXJ123456 +FYODOR1 +FYo8iIQ984 +FZK48 +Fa!rhav3n +Fabian +Fabri +Fabrizio2002 +Faceman8 +Fachwerk +Fadyo +Faisal +Faith825 +Falco +Falkenberg07 +Fangio +Fantasy +Fantom1959 +Far0ut +FarCry +Farcry66 +Farhad44 +Farlow20 +Farmer +Farmor +Faros181 +Fartosh1 +Fatih1 +FauMol +Faustuz +Fawzia!1 +Fazer +February4 +Feiern +Feigling1 +Felagund7 +Felia8188 +Felidae +Felix +Fell09 +Fencer +Fengib2 +Fenster4 +Feran1991 +Feras +Ferdo1 +Ferien +Fernseher +Ferrada +Ferrari1 +Ferreira +Festival2009 +Feuerer1 +Feyenoord1 +FiSh +Ficken +Fidibus +Fifa07 +Fifa2100 +Fiji666 +Fikus2005 +Fille1 +Filou +Filou1953 +Finalfantasy +Finger28 +FipX39 +Fire4u +FireMaster1 +Fireman21 +Fishbone +Fishies +Fiskus +FkJn31 +Fl0ppY +Fl0r1da$ +Fl1nken +Flaan +Flache99 +Fladers4 +Flamengo +Flank423 +Flash +Flatfeet2 +Flatfeet369 +FleXx +Flieder33 +Flirt025 +FlodHest +Floh23 +Floortje25 +Florent +Florentiner +Florian +Florian1 +Florida1 +Florida2009 +Flughafen01 +Fluppe +Flyaway +FndUFC +Fokus123 +Foot +Foreskin1 +Forgo101 +Forgotten +Formation168 +Fornax56 +Forums33 +Fourpoint0 +Foxbox1991 +Fprince1 +Fr1end$ +FrIBsG +Frabit +Fraktur +FranCIS +Francic91 +Francie01 +Franki +Franko80 +Frantz77 +Franzel1506 +Franzen24 +Franzi +FrauMann +Frauke1053 +Fraunhofer +Frazier77 +Fred2002 +Fredrik +Free1404 +Freebird +Freedom +Freeflow213 +Freelancer1 +Freestyler +Freeza +Frfltvbz1945 +Fri759 +Frida0445 +Frida2 +Frieda2204 +Friede07 +Friedhof +Frieza700 +Frits0531 +Frk999 +Frodo1590 +Frogger1# +Froggy365 +Frontoe1 +Fronty01 +Frosch73 +Frpipe +Fs2508 +Fuck10 +Fuck1t +Fuck3r +FuckMW +FuckYou +Fuckit +Fuckit1! +Fucku +Fudie555 +Fuessen99 +Fuglebur25 +Fuj!ts@Ind!@ +Fujitsu24 +Fun17X +Furkan +Fussball +Fussel +Fussingen +Futte5444 +Futzi +Fux +Fuzzies0 +Fx78rP +G&65g76* +G00dguy1 +G00gL3 +G07zH4 +G0edicke +G0ffer +G15998 +G1l0w4 +G1llstr0m +G1lw1y +G2hO4 +G3%sol(2008 +G3()NTR +G34t65 +G3m1ni +G5000 +G80205007 +G9791B +G9daNou383 +GABRIEL +GANDALF +GAWGla +GAY +GAZEL69 +GBDYG** +GBZKX8K +GBZRoy +GENADY +GERARD +GERARDO1990 +GEST@20 +GETLIT +GG +GGG +GHBJHBN +GHOST +GIO@200 +GIRONA02 +GITO44 +GIX559 +GJGJ +GK15692 +GL1944 +GLE +GM99 +GMZ7mQ +GNC +GNT13 +GOA88 +GOBLIN4 +GOCHA1 +GOD +GOLDEE12 +GOM2MN +GOM2OP +GONDOR +GOOD +GORDITOS2 +GOURMET +GQ6HAW +GQB8JIYKqAcNDL +GR0ae85o +GR8)(4M +GR84ME) +GRAC1A +GRAFIX +GRANDPRIX +GREATSCOTT +GRUNZWA +GTISPEC +GU1NN35 +GUDRUN +GUIDO +GUILDES +GUITAR@ +GYSMTP +Ga11er3 +GabI +Gabber +Gabi22 +Gaborik3 +Gabriel +Gabriel1 +Gabriel6 +Gabrieli92 +Gaby09 +Gaetan +Gaggo +GahannaX +Gainward +Galatasaray +Galileo1 +Gallard1 +Gambino01 +GameR +Gameboy +Gameboy@1 +Gameshark +Gamy14 +Gangsta2 +Gank1963 +Ganondorf +Gantenbein +Gap!7 +Garag3 +Gargamel5 +Garoad +Garten +Garten04 +Garza +Gator88 +Gauja +Gauloises +Gb1004 +Gcent +GeFo +GeLiDo +Geben1 +Gecko1 +GeeCrY +Geforce8800 +Geheim +Gehring0 +Geipel +Geist +Geka123 +Geld78 +Geli3423 +Gemelli2 +General +General1 +Genesis +GeniE! +Genisis +Genius22 +Genson +Gentex87 +Genzel +Geordie69 +George +Gerasim +Gerhard2008 +Gerrit +Gerrit123 +Gerry67 +Gertrud48 +Gesicht +GesineM +Gesucht +Gewitter +Gfhjkm +Gfik +GgYuZF +Gh24tP +Gh3M4X +Gh4T3L +GhosTy +Gibbard08 +Giblert13 +Giblet85 +Gibsgs +Gigagi +Gilberto33 +Gild0r +Gill +Ginny2045 +Gino +Giotto +Giovanni +Giraffe +Gisela28 +Gissmo +Gitarre +GkA +GkA12s +Gladbeck +Glasses013 +Glaukon1968 +Gliched +Glinde +Glober +Gloo123 +Glorieux008 +Glory2a +Glynge +Gman64 +Gmiller1968 +Gnaget123 +GnuDIP +GoBlue +GoCkEl25 +GoDem +GoOgIe1 +Goblin101 +Goblin123 +Goddess +Godly102 +Godofwar1826 +Goeppingen +Gokul +Gol1ath! +Golddigger1 +Goldfish2 +Golf001 +Golf4 +Golf62 +Golgatha198 +Goliat172 +Gonzalez1771 +Gonzo1166 +Goo +GoobT +Goober001 +Google +Goose +Gor5379 +Gordy +Gorilla1180 +Gorillian +Gothic +Gothic1 +Gott +Govani +GpWRM3 +GrQhzi +Grabbi +Graber +Grader123 +Gradory +Grassy123 +Greebo09 +Greenbay04 +Greenday2 +Greg +Gregoor +Gregory1 +Grendel +Greyman1 +Greyson +Griffith33 +Griml0ck +Groening +Gronau1 +Gronker +Gross +Grossman51 +Grotter +Grudge83 +Gruga5 +GuTiX +Guellerup +Guenter01 +Guest +Gulli+# +Gulls669 +Gully666 +Gummi69 +Gundamseed +Gunman89 +Gunnar +Gunnar94 +Gunni +Gunstar36 +Guru +Gustaf +Gustav007 +Gustav32 +Gustel +Guylaine7 +Guzzi478 +GvUQQ4 +Gygy66 +Gyr +Gysburn +H +H!a3 +H03xZs +H0W!$I+ +H0WG00D +H0mebrew +H0urent1 +H0wling3 +H100H +H154872S +H1567 +H160474 +H1GHNOW +H1lar10u$ +H2288G +H2902 +H2O +H3YER8 +H3r03s +H3yw5 +H491n +H4CK3R +H4Ck3n +H4X3D +H4cX3R +H4cx3R +H4rdcor3 +H4sw3ll +H8015348 +H@rtm@nn +HACCP +HACK +HACKED +HACKING +HADAR +HAGSAU +HAHA +HAKAN1 +HALLER +HARDT +HARRISON +HARRSEN +HASSE +HAXOR +HAckerZ +HArDEe +HBUe +HCH1993 +HCOSMOS +HE24d +HE@RTBR +HEIGRO +HEINZ +HELLEDE +HELLFIR +HELLO +HELLOHO +HELSINKI +HERMINA +HERSHEY +HESHAM +HF90 +HFHDaf +HGKG +HGRT635 +HHHHHH +HHHHHHHH +HHLink +HI +HIBOY +HIGHKU +HIK7b7 +HIM133 +HKD44 +HKJCR +HLM +HN51 +HOLA +HOLLAND +HOLLYWOOD50 +HOLMES +HOMER1 +HOMMER +HONGHUI920 +HOPE18 +HORSEME +HORTAL1ZA +HORTEN16 +HORVATH +HOT +HOTTIE +HOW2004 +HP197 +HPWG +HQ1512 +HQlove +HR0k51 +HR170758 +HRvqbf +HSOJ1234 +HTZ +HTfBI +HUELVA123 +HUESCA +HUHTIkuu +HUNTER +HW1234 +HXb1Pq +HY1950 +Ha121106 +HaLlo +HaMtA2 +HaSSaN +HaTeME +HaVoK +Habiba00 +Habicht +Habitats0 +Haburn1 +Hac4TP +Hack4u +Hacked +Hacken01 +Hacker +Hacker! +Hackers +Hacking +Hadoken +Hadoken01 +Hag5gard +Haifisch1 +Hakan +Halcyon1 +Haldir +Halifax2003 +Hallo +Hallo! +HalloHallo +Hallohh1 +Hamburg +Hamed +Hamilton +Hamish +Hamlet +Hammer!2 +Hammett4 +Hamster +Handball +Handel2010 +Handys84 +Handzia +Hanna007 +Hanne3lore +Hans +HansemanD +Hansol45 +Happe666 +Happy#1 +Happy862 +HaraMia56 +Haraldsen1 +Harbar101 +Harbinger666 +Hardcore +Hardrive1 +Haribo +Harkel1 +HarkonneN +Harley2434 +Harmen01 +Harold1 +Harry +Harry1021 +Harryhall +Harryp0tter +Haruhi52 +Harvard89 +Hasan +Hase +Hasen +Hash +Hasi2312 +Hasitasi +Hastala +Hatay +Hatcher01 +Hauklotz +Haus +Haus2004 +Hausberg63 +Hausen +Hawkns +Hayate +He240681 +HeadMaster1 +Header +Hearst20 +Heather1 +Heathery +Heaven546 +Heavenly96 +Hebrews +Hecht123 +Heckmeck99 +Hedge4hog +Hedi2512 +HediW +Heexae1che +Heffer85 +Hehe +Hei26 +HeiKe +Heide1 +Heide66 +Heidelberg39 +Heidi251 +Heihas +Heike +Heike265 +Heiko +Heimweg2 +Heiner3 +Heinrich007 +Heinrich1001 +Heinz2130 +Hejmore +HelenA +Helg0land +Helga1 +Helios2147 +Hellfire +Hello +Hello! +Hello1 +Helloooo +Hellup! +Helmut58 +Helo2 +Hemmelig123 +Hemmelig85 +Hendrik1! +Henna2 +Henning +Henrici8 +Henry728 +Henryy12 +Herat420 +Hercules +Herdern9 +Herg56 +Hermans +Hermine7757 +Hero +Herrieden +Hertha +Heslo +Hexentan +Hf,jnf123 +HiTmAn +HiWi3! +Hibernian1 +Hibsli +Highland1965 +Highlander42 +Highscreen +Hikaru +Hilda +Hildi201 +Hilter +HindHead +HipHop +Hiphop +Hippolyte +Hirsch +Hirsch13 +Hiscott743 +Hitler +Hitman14 +Hj2006 +Hjemme93 +Hkskds +Hluk1126 +Ho3u73 +Hobbes1775 +Hochhaus10 +Hodags2 +Hoffe10 +Hofmann +Hohenheim89 +Hohenstaufen +Hola33 +Hola68 +Holger +Holger2212 +Holland +Holly6363 +HolzHaus5 +HomRod +Homarus90 +Homebase12 +Homers38 +Hometime +Homeworld7 +Hommel11 +Homosap1en +Honey +HongkinG +Honseller +Hooah89 +Hooch21 +Hooch5233 +Hooligan332 +Hooligan88 +Hoolli +Hooters1! +Hope8487 +Hopkins +Hoppari1 +Hoppel +Horst1815 +HotDog +Hotmail5858 +Hotpants +Hottime +House +Houssam +Hovding84 +Howare23 +Howitzer155 +HpqFa3 +HrS9Io +Hrzn!@# +Huang2615 +Huba21 +Hugh +Hugo12 +HugoBoss +Hugosson6 +Huhn +Human321 +Humberto +Humpe1961 +Hund +Hunden88 +Hunley.1 +Hunny1234 +Huschel2 +Hussel62 +Hybird +HyeKyung +Hyundai112 +Hyv44444 +I +I+FR33K +I11usion2 +I3390A +I6a#ez +I6s6i6 +IAM +IAmGod +IBANEZ2 +ID061167 +ID491347 +IDKA777 +IDRNV +IDgdgG +II178900 +IIws47 +IKG344 +ILOVEYOU +ILS123 +IMATION +INAMAUS +INFOTEL +INGET +IOMEGA20 +IOfpKQ +IRELAND +IRLS +IS2107 +ISAKOVIC +ISKO +ISSW +IT +IT441144 +ITN@#16 +ITTer +IUSR_WEB +IVIGOE +Iamd0rhk123 +Iaonsl +Ib057L +IbFKk7H737 +IbdkLF +Icehouse +Ichou111 +Iconman +IcyPit +Idefix25 +Idiot +Idlhof +IdoIne +Idontno89 +Iga26 +Igyboy +IhtH4r +Iiyama +Ilest1642 +Ilja13 +Illmatic77 +Illuminatus! +Ilse +Imelda83 +Imhotep88 +ImmerGut +Impalla2007 +Impulse +Impulse1234 +Impulsive +In5anity +InJeC7 +Indian5 +Indie9385 +Indien08 +Indre2 +Infinity1981 +Influencer +Info +Information +IngeBorg1 +Ingeborg +Ingeborg123 +Ingeborg29 +Inhuman390 +Inline4 +Inlove86 +Innos +Inot49 +Ins6ip +Insomnian +Integra! +Intensem1 +Inter +InterNet12345 +Internet +Intravert +Inuyasha1 +Invisible!1 +Ipple4 +Ipswich08 +Irland +Irlnd +Irma1990 +Irmhild28 +Irome +Isabell +Isards22 +Ishkhan12345 +Ishtar1177 +Iska +Isley1983 +Ismail +Ismail62 +Italia1516 +Italia883 +Ith45Y +Iu4Km3 +Iulian81 +Ivaritta +Ivelios +Ivonne06 +Iwf4n +Ixoxi +J +J003938H +J004771y +J092702k +J0N@TH@ +J0shua11 +J0urn3y1 +J1234a +J14082 +J1mC0l@986 +J2K1A3 +J3b +J3l3Xx +J3nif3r1 +J4UV3N +J4ckie! +J61592 +J7CV2w +J@ck@55! +JAHC1974 +JANA +JANXSM +JARAMA +JARINE11 +JAXJAX +JBOGAS +JBonsack +JC231201 +JE0212 +JEBAC1 +JEBUS19 +JEMMES +JERONIMA123 +JERRY +JESSICA +JESUSITO1 +JEX +JEsus +JFD769 +JIANGNAN4848 +JIPAQE +JJ2004 +JK071308 +JK21xb +JKFmr +JKL +JLD +JLM1950 +JLTest +JM240285 +JMiller69 +JOBU1974 +JODOWE +JOE +JOE74 +JOKERS +JORDI2010 +JOSE1MAR +JOSE43 +JOSEFINA23 +JOSELE89 +JP2310 +JP3413 +JP6672 +JR3825 +JR562gg6$ +JR87C5 +JRG1118 +JRT8209 +JS1007 +JS591512 +JSS185 +JT061080 +JT6666 +JTM842 +JUB1LADO +JULI +JULIA5 +JUN08C +JUNIOR +JURAJ +JVP20 +JVU7Q0 +JX13qv +JXLJXL +JZB2002 +Jabbathehut23 +Jabber +Jabberwock1* +Jack1095 +Jack1989 +Jack5824 +Jack685 +Jackass +Jackboot56 +Jacky262 +Jacman09 +Jacobf +Jacobi +Jacquie1984 +Jaffa +Jagger.0 +Jago1807 +Jahrgang87 +Jak0r +JallenS +Jambo +Jamesbond +Jamie814 +Jan +Jana2302 +Janamand +Jani347 +Janim +Janina103 +Janine +Janka75 +Jannicke1 +Jannis1996 +Jansen +Japan9999 +Japanese +Jara5555 +Jasmin +Jasmin7 +Jasmine +Jasnovidec2 +Jawadn +Jaxson34 +Jb4238 +Jc872222 +JeTtic +Jeanne8 +Jeannette +Jeanny1 +Jeanyve +Jeepster +Jeferi +Jegar22 +Jeh123 +Jehanne01 +Jenni245 +Jennifer1! +Jennifer500 +Jenny0815 +Jenny1185 +Jenny1998 +Jenny530 +Jer +Jeremiah719 +Jeremies +Jerica01 +Jeroen6 +Jess20 +Jessi1981 +Jessi206 +Jessica +Jessica64 +Jessie1 +Jessie2004 +Jesus1 +Jethrotull +Jetta +Jette00 +Jetteb +Jettte +Jetty101 +Jezu1969 +Jezus +Jezz00 +Jgt6d1 +JhLcqp +Jherman2 +Ji396Ui966 +JiM1 +Jim +Jimen2008 +Jimmy +JinRoh +Jingles05 +Jinous2007 +Jiraya9 +JiuJitsu1 +Jk010112 +Jkhan1985 +Jla4ko +Jloges +Jmd15 +Jmz233 +JnDfKb +JnoSv +Jnocik +JoKKeR +Joana1 +Joergo +Joey6205 +Jogadi +JohNy +Johan +Johanna1 +Johanna1005 +Johanne +Johna8585 +Johnny +Joking +Jolina0910 +JolleJolle +Jonah05 +Jonas1410 +Jonathan +Jongert +Jonno +JooJoo +Joppl +Jordan +Jordan17 +Joschka1980 +Josef22 +Josh +Joshua +Joshua3 +Joti1239 +Joule10 +Joystick5 +Jr569R +Js23sy +Jsic2d +Jst +Ju1an +Ju1y11 +JuL1aE +Juanita1 +Juenhi +Jugendheim +Jugendliebe +Juhan6 +Jujutsu23 +JulDan +Julenissen1 +Juli2412 +JuliaC +Juliama1 +Julian +Julian@1 +Juliana08 +Juliane +Julianr23 +Julius0712 +July11 +Jump2193 +Jumper +Junga62 +Junghans! +Jungle! +Juninho +Junk +Jupiler41 +Jussi +JustM3 +Justic3462 +Justina66 +Jv022090 +JwkpaM +JyRiNi +Jyllinge4040 +JypqFL +K +K&Z5UI +K* +K0US4N +K123 +K2a +K3211 +K34_54Gtq3_12b +K3Da1 +K3V +K3j4dJ +K4m1n0 +K4mP3R +K5869792 +K851756a +K9zbc6 +KA482322 +KAANKAAN +KAK2009 +KAKASHI +KAKtos +KALIPSO +KANKERA +KAOX +KARATE +KARENKAY1 +KASPERSKY +KATARZYNA +KAUKO19 +KAVITA +KAVKAZ +KB76CH +KBMONEY +KCostin +KD +KD1958 +KEKE +KENKA +KENNYB +KEVIN9876 +KG200 +KH244vp9# +KHDIEF4 +KHOA +KIB123B +KIK +KIKAIDER +KILLAH +KIRO2003 +KISSASS +KITKAT +KId2P +KJURE +KKH05 +KKY666 +KKwk5h +KLj36 +KLnM012q +KLsb73 +KMFxMn +KMXFSLG +KN439273 +KNOCKKNOCK +KNUDDEL +KNUKiM +KOALITA37 +KOKOJUN +KOKOTE +KONTRAST +KOOKIES1 +KP1996 +KP8435 +KRAZY +KRS +KRUSTIE +KS234 +KSsf +KU1507 +KUKU +KUOMIN_ +KUTTNER +KVPK9PB +KWAXYB +KWgovIN +KYOSHOU +KaBelJau +KaBra2 +KaRTaL +KaSiA7 +Kabi1! +Kaese331 +Kaffeebohne +Kahanec +Kai +KaiTak +Kaitlynn05 +Kakashi +Kaktus +Kalimera +Kalle1975 +Kallis +Kame +Kamil11 +Kamisia +Kanake1 +Kanjy +Kapellen58 +Kappa062 +Kara0ke1 +Karademir1 +Karambol +Karano00 +Karatecat +Kardonnel +Karin +Karitas +Karl2007 +Karlins +Karlstad132 +Karol7 +Kartellamt +KartoffeL +Kasia111 +Kasimir610 +Kasimir7 +Kasper +Kaszuba55 +Katana +Katana00 +Kater +Kathleen0902 +KathrinH +Kati15 +Katja2607 +Katrin82 +Katze +Katze7 +Kaufladen +Kaufmand3 +Kautz1610 +Kayla0889 +Kaylan0608 +Kayleigh01 +KdmHk9 +Kdu39s +KefMie +Keflavik +KeinPlan +Kellerer60 +Kellie69 +Kelsey +Kelsey1 +Kem +Kemal +Kendell +Kennwort +Kenshin4 +Kenwood1 +Kenwood3 +Kerstin1981 +Kerstin2 +Kesian05 +Kessi82 +Ketchup05 +KeyPos +Khaltak +Khandras1 +Khayman666 +Khazad3 +KiMER +Kiayrn +Kiel2007 +Kill85 +Killer +Killing583 +Killme +Kilsund +Kimico +Kinder43 +Kingdom +Kintaro +Kirby4444 +Kirchner +Kirra4104 +Kirsche +Kirsten +Kirua +Kisat9598 +KissMe +Kissen07 +Kissie34 +Kissur1 +Kiste1! +KiszkA +Kitesurf1 +Kitten2kitten +Kittyhawk1 +Kittykat23 +Kittykat66 +KjrfkFlvby@%51 +Klanke36 +Klara +Klasyka10 +Klaue +Klaus187 +Klaus2007 +KlausDieter +Klausi +Kleber1954 +Kleisne +Klf5gI +Klinik +Klokan +Kn5asx +Knackes1311 +Knasten11 +Knaui +Kneebone +Knipser5 +Knirps04 +Knopfler17 +Knubbl9 +Knuddel +KoE +Koala1 +Koala2 +Koala2008 +Kochanie86 +Koenv +Koffie +KohLrabi09 +Kohara +Kolberg +Kollege2 +Kolmes +Koloss13 +Komakino81 +Komissar1 +Kondom +Konqueror1 +Konstantin1 +Kontakter +Kopernikus +Korda +Korein18 +Kormoran +Korson1981 +Koskie0711 +Kotroju +Kouros1307 +Kov4cS +Kova16 +Koza1985 +Kozak1648 +Kq0CeX +KqFPyj +KraLiM +Kranich8 +Kravitz +Kraynai +Krebe +Krefeld66 +Kret18 +Kreta2004 +Kreuzberg13 +Krille1! +Krissy17 +Krist468 +Krista +Kristy143 +KroKodyl +Krocana1 +Kruegler1209 +Krypto2411 +Kryton +Kuba +Kubajz +Kubus1 +Kuchin +Kuester1926 +Kulibert +Kungfu75 +Kuni44 +Kupfer7 +Kur +Kurita +Kurosaki95 +Kursa7 +Kurva +Kutasy16 +Kutje +Kv397585 +Kwaker02 +Kwenus +Kwiatek4 +Kyoshou7! +L +L0)KI4P +L000315s +L00kMa +L055h1 +L0R1NG +L0b3l387 +L0gans! +L0gick +L0ll1G +L0oL +L12345 +L180603r +L1I2M3A +L1zard +L2005 +L33T +L38jl +L3B4y +L4n3pA +L5FRU7 +L7a89 +L94Grb +L@ught3r +LAAMER +LAB@200 +LALALA +LALIME +LAMERZ +LANEVi +LAP44 +LAPTOP +LASTALP +LASVEGAS +LAVA +LAWPNJ +LB3064 +LBL0114 +LC350BK +LC586 +LCORBEIRA +LDM193 +LEAFS01 +LEC2TURA +LEGOLAS +LEICA19 +LEMOS4 +LEMOS5 +LEMOS9 +LETHEL71 +LEVEL10 +LEVSKI +LEW9T3R +LEXMARK +LF16TS +LIBRERIA +LIFEGUARD +LIGHTNING08 +LINARES23 +LINKSYS +LIPO +LISO22 +LIW1515 +LInux11 +LJnr23 +LKserverS$= +LL8EK7 +LLLLL +LLORET +LM-HASH +LMENT4 +LNiptP +LOBJ248 +LOCALHO +LOG1002 +LOL +LOLA1LOLA +LOLWTF +LONDON2 +LOOKSLI +LORDA +LORENA +LOROIS +LOSTIlosti1987 +LOSTWIS +LOVE4MO +LS4EVA +LT1066B +LT310183 +LU7G3I +LUBOFV +LUCASR +LUCHO1234 +LUCIA2010 +LUCIFER +LUCYNA1944 +LUDO +LUIS +LUKE +LUPE1954 +LUSTIG387 +La8Pv +LaDama +LaDiDa219 +LaGuardia1 +Laatikko1993 +Labas +Labello +Lachina +Lacie1024 +Lacoste17 +Ladaura +Ladis1 +Ladm1n +Lagan12345 +Lainie03 +Lal +LalaD +Lalani2 +Laluna786 +Lambeth +Lan +Lang30 +LangustE +Lanky1990 +Lante145 +Lanzer +Lapras21 +Lara2109 +Larzon +Lasagne32 +LascauX1 +Laska022 +Latein +Laufen01 +Laura +Laura118 +Laurac2804 +Lavaur +LddmNUI339 +Le +LePrincE +LeSaDi +Le_C0kke +Leanne13 +Learning +Leer +Leetah +LegendarY +Legends +Legolas +Lehnen +Lei4889 +Leini +Lekeplass2 +LelT8 +Lemar1985 +Lembit +Lementation1 +Lemieux +Lemons#1 +Lena13 +Lena3101 +Lenabell776 +Lene26 +Leni93 +Lennert23 +Leno4ka +Leobra2468 +LeonNico +Leonidov1976 +Leonor09 +Leonor36 +Leppa1234 +Ler483 +Leront +Lessel60 +Let +LetsGo +Leuchter +Levani +Level125 +Lex123 +Lexikon +Lexxi +Lezic +Lga1234 +Lgonzalez +Lhkfe +Liano4ka +Lidia +Liebe5 +Liebes40 +Lifeforce1 +Lifetile1 +Light +Lili +Lim1T +Limestones +Limin0019 +Lincoln +LindaW +Lindam +Lindsay +Linhard +Linkin23 +Linn209 +Linux +Linzy2 +Liobelle +Lior66 +Liquids123 +Lischewski +Lito1926 +Live4U +Livelong +Livii +Liyd1d3! +Lizzard70 +Lk9qtr +LktranSFer48 +Llewellyn +Llothh +LmADFr +LoL +LoLLig1 +Lobo86 +Lobose123 +LocDog +Locked +Lockedout1 +Locky +Loco +Locomotive +Lofty1231 +Log1 +Logan0431 +Logan2 +Loggin2k +Logitech84 +Loidl +Lok0110 +Lokhie +Lol +Lol123 +Lolly2306 +Lolo3012 +London +London0920 +Longline +Lonnie7 +LorT94 +Lorenz26 +Losenord112 +Lost7 +Lotus +Lotusblomst1 +LouIse +Louan +Loudness@ +LoveMe +Lowrider1359 +Loyni +Lscott05 +Lsua6P +LuVD34 +Luca113 +Luciosus +Lucky1 +Lucky3006 +Luckys25 +Lucynka24 +Ludwig8 +Lufums +Lui +Luis2809 +Luisen01 +Lukas94 +Luke2811 +Luke2888 +LukesA +Lulli1983 +Lumpi318 +Lumpii +Lunikoff76 +Lura1163 +Lusine1984 +Lutz1966 +Luxsor +Lv3hs +LxNbS +Lycanthrope11 +Lykanthrop +Lyndsay2# +Lynn1472 +Lynnie000 +Lysie +M +M* +M*Z8294 +M00nshad0w +M00rh3ad +M041259P@z +M061180 +M0N2K17 +M0NC03UR +M0nk3y +M0sc0w +M0tH3ro0 +M123456P +M1909 +M1LL1K1 +M1cha3lg +M1k3y +M1keaU +M1ller14 +M1st1gr1 +M2-34-0 +M2313Z +M32xq8 +M38 +M3RCAD0NA +M3ljey +M3t4Ll +M4DM4XU +M4c9yv3r +M4tR1X +M59L_1# +M61674761 +M7621444 +M910604m +M@FF3B2 +MAARES +MACARENA05 +MACGYVER +MACRO +MADERA +MAFITA76 +MAG1990 +MAGONZALEZ +MAGUI123 +MAHEKG +MAILROO +MAINSYS +MALAGA16 +MALAU1RA +MALOSI +MAMA01 +MAMAMIA2 +MANDOO +MANELY +MANOLO09 +MANPOWER +MAR!POSA +MAR1AS7A +MAR3TITA +MARA4CAN +MARCAR01 +MARI0909 +MARI3SOL +MARICARMEN1 +MARINE789 +MARIPE33 +MARISA58 +MARKO99 +MARTANGO +MARTI1991 +MARZO11A +MATANZA1960 +MATEMATICA +MATRIX8 +MAYTAG +MAZAGON1 +MBMOMP +MCC57 +MCE277 +MCHSr2 +MD1708 +MD5 +MDL1M4 +ME0721 +MEBE78 +MEDIA +MEDION +MEDUSA154 +MELISSA +MELYNA +MENACHA3 +MENORCA +MENORKA1 +MERENGUE +MERLIN +MERhaba +MESec +METEO6 +METROID +MEXX73 +MFONS +MFS +MG9eVY +MGsk42 +MH3SH5M +MH9016 +MIBEBE +MILITO +MILK3GO +MINIMALIST +MINX1 +MIOPE +MIQUEL38 +MIST +MIXAS +MJ6VHR +MJW36=@ +MK*(UYT +MKO0pl +MLONENI +MLP958 +MM5110 +MM68063 +MM8912 +MMMM +MMMMMM +MMMdms +MMN4466 +MMp0s$ +MOISEI +MOLLYTA +MONIZEB +MONTSE +MONTSE100 +MONTSERRAT +MONTY +MOR +MORADO4321 +MORTSEL1 +MOSINGS +MPILAR789 +MRM356 +MRqVca +MS1408 +MS180c +MS440 +MSA +MSM582 +MTCool +MTOC +MURIEL +MURZYN123 +MUSTAFA +MUZIKA +MV234567 +MVHS02 +MWAC3N +MX310 +MY1958 +MYLEX12 +Ma3ters +Ma5984 +Ma5984 +MaBe +MaCabEE +MaNGoS +MaNiEk +MaNsOn +MaRcO +MaTT +MacOSX +Machine45 +Macio012 +MadDog04 +Mada4 +Maddog3000 +Maddy2394 +Madein1992 +Madeleine +Madhuri1 +Madness +Madrid1 +Maerz2010 +Maf15q +MafIA +Mafttc +Magaluf09 +Magdie69 +Mage2llan +Magellan07 +Maggie +Maggie2 +Maghrebi0 +Magical +Magnetim +Magnol1a7 +Magnus16 +Magnus599 +Magpie02 +Magus101 +Magyar44 +Mahlzeit1 +MaiUli +Maiel1014 +MaikMaik +Maitre2009 +Makabra666 +Malachy21 +Malainm1 +Malaki711 +Malakian123 +Malder22 +Malibu2. +Mallow +Malma123 +Malmen991 +Maluska +Malzer +Mammanr1 +Mammut08 +ManUTD +Manauv +Mandala2008 +Mandara8 +Mandel95 +Manfred +Manga04 +Maniac0916 +Manics +Manny1 +Manon22 +Manowar +Manson2000 +Manuel +Manuela +Maor +Mar +Mara1903 +Marals +Marc +Marc1210 +MarcO +Marcel1488 +Marcinek28 +Marcio7 +Marco +Marco1329 +Marcos +Marduk1066 +Mare +Marek +Marguerite +Mari1nes +Maria1 +Maria1604 +Marianne +MarieCarmen +Mariella2009 +Marija1 +Marija2008 +Marine3650 +MarioM. +Marion +Marisa +Marita12 +Marius +Mariwi +Marjn5 +Mark_78eting +Markus0306 +Marlboro1 +Marlies1 +Marlin27 +Marlousa +Marquee1 +Married +Marselle +Marshall21 +Mart1n1o +Marta2 +Martin +Martin.3 +Martina00 +Martince +Martinez31 +MaruMaru +MaryHope +MaryJane +Marybeth9 +Marysia +Marzia23 +Marzo2010 +Mascha13 +Mascher +Masco1988 +Master +Master.2 +Master1 +Master9 +Masteratarms#1 +Mastero1 +Mastiff +Mata1234 +Matalan345 +Matching +Mateen2009 +Mathe +Mathew94 +Matinee27 +Matt +Matt1107 +Mattes +Matth12 +Matthias1 +Matthias80 +Matz +Maulwurf +Maurice.1 +Maus +Maus741 +Maus797 +Mausi178 +Mausi62 +MausiMausi +Max1995 +Max2445 +Maxfield +Maximov +Maximum500 +Maximus1930 +MayBe +Maylin2005 +Mayra +Mazzman1 +Mc2ken +McAuliffe +McCaskill +McClure09 +McFitz +McNroe +Mdc +Me130171 +Me1989 +MeSHOP +Mechanical +Mecring +MedX +Medion +Medjai +Medjugorje +Medour +Medterm1 +Medved +Meeeik +Mefistofele +Meg0279 +Megadeth +Megane969 +Megawars4$ +Mehari71 +Meiko333 +Meines +Meinl1403 +MeinzZ +Mekong#3 +Melanie +Melanie1976 +Melanie2406 +Melbourne +Melfitano +Melissa1976 +Melkor85 +Melli1973 +Melman134 +Melnibone@1 +Melone345 +Memorex +Menolly32 +Mensch08 +MenyukE +Mephisto01 +Mercured +Mercury360 +Merhaba! +Merida7850 +Merl1n12 +Merlin +Merlin1107 +Merlin1950 +Merlyn1 +Merry1310 +Mesiah80 +Messalla +Mest71 +Mester10 +Metal +Metaller +Meth +Methel123 +Metzel +MfC123 +Mg0819 +Mi2ser +MiAu98 +MiCRoP +Mibeas +Mic22 +Mic988 +Micha3 +Michael +Michael7 +MichaelF4 +Miche77e +Michel01 +MichelII +Michele +Mickey +Microsoft0000 +Microsoft1978 +Mict72 +Midian01 +Miedo +Mieteks +Mig1nion +Migaja +MiiKa +Mijo2003 +Mike +Mikel +Mikhail03 +Miki3942 +Mikica25 +Mikrofon +Milch1989 +Milena +Milisana +Millars15 +Miller +Miltenberg58 +Milton78 +Mimoza +Mineralwasser +Minigolf123 +Minimoog +Minki +Minouchen +Miraculix +Mirime +Mirjam21 +Mirko78 +MisJbrand1* +Misan1972 +Misha +MissD +MissKarma +Mistika123 +Mitchell +Mitsukai +Mitsy1993 +Mittweida98 +Miyamoto +Mizi88 +Mjolnir +Mm1234 +MmMm54 +Mmahdi +MnH45i +Mobay230 +Mobilfunk0! +Mobiltelefon1 +Mockba86 +Moejoe +Moffe4040 +Mohammad +MoinMoin +Molly1 +Monarca45 +Monchen?! +Monday +Mondeo3$ +Mongo123 +Moni1981 +Monika!! +Monika0815 +Monitor1 +Monopol2 +Monster +Montse6 +Montt1s +Moogle11 +Moppie +Mor5pheus +Morais1828 +Morgaine27 +Morgaine81 +Moritz08 +Moritz60 +Moritz7 +Morla +Morph1 +Morrigan12 +MortalCombat +Morteno1 +Moschen! +Moses49 +Motia +Motte131 +Mousepad1 +Mow3rs +Moxie069 +Mp240205 +MrR8PP +Mrrs7302 +Mrspock77 +MsG852#120 +Mtp307 +Mu4acH +Mu5tang1 +MuTe22 +Mucki +Mucki2862 +Muecke +Muenchen +Muetze01 +Mulan8088 +Mullest6 +Multiverse09 +Mummelcz +Mupfele +Murat +Music +Music1 +Musique75 +Muss11 +Mustan9 +Mutikainen +Mutilat3 +MutterSchiff +Mvrty1 +Mx1000 +MxPx +MyLove +MySct3 +Mygirl1212 +Mykel +Mylife68 +Mylove72 +München +N +N0T4PAT +N0stradamus! +N0teingang +N140660o +N1k0la5 +N1othing +N31L03 +N45zWa +N4d1n3 +N5286667 +N6PJ7CV +N8719592 +N8ightlife +N9PA22 +NA1ZARET +NADDL +NAE1976 +NAFOLK +NASI5678 +NAVIDAD +NBANBA +ND79KM +NE120770 +NEBREDA6 +NEFASTO +NEGRITA01 +NEMESIS +NEVEM +NEWLIFE +NEWLINC +NFSMW +NFYw53 +NG +NG6413 +NGSEC +NGs3X +NHNHNH +NICOLAS35 +NIGACRA +NIGGER +NIGHTMARE +NILSI +NINA65 +NINGUNA +NINJA +NIRVANA +NK171299 +NKFUI +NKOUANE +NLMJQ +NNBVZT9 +NNuUqd +NO!ACCE +NOA1000 +NOCTURNA +NODO13 +NOFOOD +NOKILL +NOOB +NOT277 +NOTF-10 +NOTICE +NS1720 +NTEL +NUBL4DOS +NUR@196 +NV2084 +NYc4m4 +NaCib +NaTaS +NabZ +Naboo +Nachito09 +Nadala09 +Nadana1 +Naddel +Nadine +Nadya2002 +Naef8888 +Nagasaki+ +Nahani7 +Nait2 +Namwong05 +Nandariel +Napster! +Naraku +Naroth77 +Naruto262 +Natalia1234 +Natascha +Natasha +Naten7467 +Nathalie1506 +Nathie123 +Natsumi +Nauders +Nautilus2000 +Navy1337 +Nazarre2960 +Ncghk +Ne2ari +NeI37P +Neapolis +Nebeling +Nebiye +Nebraska35 +Nec +Necro098 +Neelloc +Nei +Nekkid6 +Nelida02 +Nelly1967 +Nemesis +Nemesis2 +Nenanu +Neo +Nephew33 +Neptun +Nereus12345 +NetWerk +Netdog19 +Netgate +Netserver +Netzer +Netzteil352 +Netzwerk +Neuman +Neuromancer +Neuss1976 +Nevsehir64 +NewDay +NewYork88 +Newburg09 +Newhouse +Nexus1981 +Nexus500 +Nfslhq +NiC +NiMDa9 +NiTe2 +NibNib +Nibbles318 +Nibelungen10 +Nicki0407 +Nicky +Nico +Nico16 +Nicolai0202 +Nicole +Niebelungen +NiederlandE +Nieslen1 +Nightmare121 +Nightmare67 +Nightrave +Niha7519 +Nihonga0 +Nihongono +Nikiel111 +Nikita123 +Nikitan +NikkiE +Nikolas +Niles1951 +Nils1005 +Nima2108 +Nimda +Nimrod +Nina1212 +Nini210 +Ninja1 +Niob +Niracha +Nirvana +Nirvana812 +Nitra86 +Nitram88 +Nitrok9 +NlKgf8 +Nm +Noaccess07 +Noah1103 +Noel0312 +Noemi +Noldi +Nomis1070 +Non. +Noob19 +Noobss +Nopass +NorCat +Nora2008 +Norbert5379 +Norbi +Nordlicht +Nordwind90 +Normin123 +North +North69 +Norway09 +Nostradamus +Not found +NothoN +Nova1957 +Novemb5r +November +Novus100 +Npm2002 +Nretni82 +NtAgFWGX +NuDkuR +Nuad01 +Nubsi +Nuckel17 +Nude1981 +Nuernberg +Nuffe +Numark2 +Nummer6 +Nurcy0611 +Nuss3 +Nussi24 +Nutto +Nutwell5 +Ny7 +Nyarlathotep +Nyland123 +Nylons +Nynu91 +O +O&& +O00729 +O36oFg +O3LIVENZA +OCBOCB +OCEAN8008 +OCTUBRE55 +OGo3Pw +OHAION +OKEN +OKOK +OLALEKAN82 +OLDBAD +OLIVELLA +OMFG +ON3! +ONEtouch +ONIC13 +OPINION +ORIOL3 +ORIOL4 +ORTEGA9A +OReilly12 +OSCAR +OSMAN +OSR4IM +OSZIMT1 +OU812 +OUbZ3b7X +OWNED +Oasen1234 +Oberhausen! +Oberro +ObiWan +Object11 +Oblivi09 +ObliviaN +Oblivion +Obsidian +Ochrona05 +October +October1975 +Odi3lia +Officer101 +Ohood +OkSaNa71 +Olching +OldForum +Oldenburg1 +Olejniczak77 +Olelek +Olenegorsk8 +Oliver! +Oliver418 +Olivier +Olli +Olorin +Omar1977 +OmdhaF +Omega +Omega0921 +Omega4 +Omroz +Omvfmn +OnRuSh +One379 +Oneiro4444 +Oneonta1 +Ong +Onkelenno +Onkelz +OnlyMe +Optical +Orange1! +Orangen +Ordies +Orien123 +Orlando +Orleta123 +OrpheusD +Osiris68 +Osman +Osmium01 +Osprey303 +Osser +OsterN +Ostern2010 +Ostfriesland +Other2407 +Oversoul +Ownage1 +Owns +OwrdvRE365 +Ox47dP +Ox7oRd +Oxana37 +P +P.ortugal +P07005896 +P0mpus +P10277 +P1410553 +P1DL0L +P1MPAMPUM +P1NS1_E +P1rate +P1tbu115 +P2385979 +P27J9 +P33w33 +P3R3E3 +P3rk3l3! +P455W0R +P4C432P +P4Wa1b +P4ssw0rded +P5rQIG +P7Brudr9 +P7UX=WH +P9113 +P@550N0fquippp +P@r1s +PABLO1 +PACOLA +PAFYWA +PALMIERI +PALOMO +PAMPLINAS5 +PANKER +PANOROO +PARADISE +PASSW0R +PASSWOR +PASSWORD +PATAGONIA10 +PATAT1TA +PATO +PAWNEE88 +PAXIL +PB6075 +PDCDN +PE +PEANUT1 +PEEPER123 +PEGASUS144 +PEGAZO +PENFEY +PENIS +PENN0R +PENSAR33 +PEPE12 +PEPITO +PERCHA13 +PEREZA +PERICO +PERPER94 +PERRIER008 +PETER +PETESPR +PETIKE7 +PG +PGMFI +PH040455 +PI22AHU +PICTURE +PIDARY +PIFACY +PILON001 +PINCEK +PINRAI1 +PIN_ADM +PIPERAL +PITRIW +PLIMMY +PLOP +PN2517 +PNCU1S2 +POISON +POKEMON +POLET1234 +POLETE +POLKIO +POOLTABLE +PORSCHE +PORT +POSTERIOR21 +POWER +POZOS234 +PP0673 +PPLIVE +PPNbPQu149 +PPOOII +PQtsB +PR0NBR0 +PRASANT123 +PREZES100 +PRINTING +PRIVATE +PROFESSIONAL +PRUEBA2010 +PS239007 +PSLPSL +PT2005 +PTPCYB91 +PU5RINI +PULSE158 +PUPA +PUTO +PUZZO90 +PV0V +PVPTNKdX +PY773*F +PZ140302 +Pa$sword +PaDDy +Pablo +PacMan121 +Padmaja9 +Paegan02 +Pahws +Paladin +Palawan00 +Palourat +Palpatine2 +Paluch24 +Pampi0 +Panasonic5 +Panch0 +Pandas1234 +Panerai01 +Pannekake123 +Panser +Panterra26 +Pantheon! +Pantico +Panzer8 +Paolami4 +Paperin0 +Paquito12 +Paris2752 +Partick1 +Party +PartyTime +Pas4PF +Pascal79 +Pascal86 +Pascha +Pascha04 +Pascha10 +Pass1n +Passas +Password +Password1 +Password2 +Password3 +Password5 +Passwort +Pat93 +Patent2004 +Patricia +Patricia94 +Patries01 +Patrizia91 +Patrol077 +Patron +PatuR7 +Paul0309 +Paul2953 +Paulas123 +Paulchen01 +Paulchen2000 +Paulchen2007 +Paule1 +Pauli1010 +Pauli50 +PeTzI +Peach +Pecunia12 +Pegasos2 +Pegasus19 +Pegasus2739 +Peggy2 +Pelikan1 +Penelope +Penis +Penn125 +Penner +Penny461 +Peno +Pentium +Penzao +Peoples86 +Pepina +Pepitoz +Peppi14 +Perceval1 +Percomp3 +Percyn1 +Perle. +Perle10 +Perlen2010 +Persepolis9 +Pesto99 +PetLvr +Peter +Peter91 +PeterMeier +Peters +Peterson +Peteruta +Pethor12 +Petra +Petra0404 +Petra105 +Petra1943 +Petralex +Petrinja +Pferd +Pfts1708 +Ph528907 +PhaNtO +Phaded +Phanta2 +Pharma +PhenomenA +Pheobe +Phi481 +Phil +Philamor +Philipp +Philips +Photon61 +Phylake +Physic +PiXa87 +Picard7 +Pichler11 +Piekna3 +Piemont2009 +PieriePierie +PigSticker1 +Piggy +Pike4668 +Pilatus12 +Pilgern +Pimpin +Pincode64 +Pincode7487 +Pineapp9 +Pineapple +Ping3r1 +Pinguin1* +Pingus666 +Pioneer +Pioneer09 +Pioniere +Piotrek97 +Pippilotta13 +Pirat1963 +Pirelli +Pirx +PischI +Pitagora1984 +Pitons1984 +Pitten1337 +Pixter +PkqrvzMz +Pl003511 +Pl19456 +Pl4y3R +Pl@cide +Pla2k8 +PlaceMan +Placebo +Plattfisch +Platza81 +Play01 +Playaz11 +Pledge1 +Plok2000 +Ploki210 +PlrdlC +Pluto +Pluto8895 +PoPoLo01 +Pochum +Pocitac +Podi9ceps +Poepel +Poessel +Polgara3 +Police06 +Poligon +Polina.6 +Polizei +Polizist +Poller999 +Polli4374 +Polyglot +Pomerancovej +Pommern70 +Poncho16 +Pontiac +Pontiac00 +Ponury1 +Poop1235 +Poosir +Pop +Porfin +Porgy01 +Porsze +Porton3248 +Poseidon1 +PostMaster +Postamt +Posten666 +Postmann +Potemkin +Pourboir1 +Power1018 +Power378 +PowerBook +Powerliner +Pq2oQY +Pr1nce +Praktikum +Predator9252 +Preisi +Presee1212 +Present +Press1 +Pretoria09 +PriSon +Pride5 +PrimaX +Primco6618 +Pringles +Prinses59 +Priscilla!1 +Pro +ProTools +ProVa +Problema +Products01 +Profectus +Profi2501 +Project45 +Promet +PrometheaS# +Promocja09 +Property +Prophet +Prora +Protege1! +Proto666 +Prout. +Pryde001 +Przemek +PsYch0 +Psykoman! +Psywar76 +PtYECo +PtgoAO +Pu51n6 +Pueppi +Puhelin +Pulfer +PulpeT +Puma1337 +Pumaaa +Pumsen +Punk39 +Punti +Puppets1986 +Puppy0345 +Pupsi +Purple1987 +Purrfect0000 +Purzel1201 +Puska555 +Pussy1209 +Pusur +Puttick1 +PvKdoR +PvQ3n7 +Pwo3d +Px34M +PxA31 +Pygmy13 +Pynchon1 +Pyromania76 +Pz9S4t +Q +Q%3286 +Q19890615 +Q1Am4T +Q1W2E3R +Q2jK0o +Q4OufU +Q7zCs +QAJUFE +QAWS)(1 +QAWS12 +QBi9mX +QHTpnV +QIKAR91 +QQ +QQQQQQ +QROFORM +QT7R1_% +QTBme3 +QUENT903 +QUESS23 +QUF(WKD +QWE +QWER +QWERTY +QWERTYUI +QWertz +Qing1971 +QmlF3l +Qmsy8KY921 +Qode +Qu1qu3 +Qu33k5 +Quidam86 +Quieter1 +Quincy02 +Quino +Qw2232 +QwE1 +QwE123 +Qwerty9851 +Qx38sd +Qysac +QzPqQ +R +R-5)CIO +R034s +R0amer +R0bbie +R0chette +R12818 +R15972 +R1982te +R1a5rdK699 +R3M0T3B +R3b +R3d4lf +R3dFOX +R3medy +R4ND0M +R624ER +R9042G +R94GT4 +R9Mboi +RA!N +RA060606 +RAFITA410 +RAGOS +RAINBOW +RAINUR +RAJ +RALEMYH +RAM737 +RANKE5 +RAPIDO +RAT%20$ +RAUM_70 +RAZER +RBGBK +RBHBKK +RCBlog +RCC@200 +RCSBB +REDDOG#1 +REGLIS +REN661 +RENNES +RENO +RESAVA +RESO44 +REVENTON83 +REfua +RElisYs +RF010653 +RFQn +RForums +RG9494 +RGHEEI +RGL91Ud365 +RGPw03 +RGV250 +RGrLlC +RHarris +RIDDLER11 +RIVENDEL +RIVERA34 +RLDOTKF +RN&9WJW +RNK +ROCHO +RODRIGUEZ58 +RODSAM +ROFL +ROGER +ROKSANA13 +ROMAINE +ROMANIA +ROMANUL +ROMERO +ROOT +RORPT +ROSA4MARIA +ROSAIRE +ROSENBERG +ROSILI40 +ROTGET +RP20 +RQ2JUR +RRCHDFS +RRZQLTE +RRd8s +RS0010 +RS87720 +RSRS11 +RUBI2010 +RUGRATS +RUKS40 +RX7RX8 +RX9aef +RY@LOVE +RY@NN0M +RZ708239 +R^ +RaPsTeR99 +Rabbie87 +Rachel +Rachel810 +Racoon +Radeon770 +Radno9 +Raed +Raffaele +Raffles +Raging00 +Rahat2006 +Raheli +Rahowa +Raid05 +RaidedR +Raikou +Railgun +Raimis +Rainer +Rainier98 +Rainman +Raizen +Rambo +Rambo0901 +Rambo915 +Ramm01 +RammanT +Ramona03 +Ramona99 +Rana +Rancid +Random +Random112 +Ranger1966 +Ranilok +Ranko123 +Raphael! +RapiDa +Rare +Rasputin +Rastafari1 +Rasty12 +Ratchet1 +Ratonero1 +Ratte +Ratzke +Raucher78 +Rawr!1 +Rayshon92 +ReWolf +Rea558 +Reader +Realnoob +Reatos +Reb0z0 +Rebasle +Rebekka53 +Recife +Recluce +RedBull22 +Redalert0901 +Reddragon1996 +Redfox62 +Redoran1 +Redskin1 +Reference +RefleX +Regas +Regatta144 +Regattas32 +Regina81 +Registrierung +Rehberg9 +Reifen +RemAcc +Remedie123 +Rene88 +Renegade +Renegade1887 +Renomona +Reparatur2009 +Repli+kation +Resistance88 +Retlaw26 +Retribution +RevU +ReveaL +Reverie86 +Revolution1 +Revolutionary +RewaRewa +Rexona +Rey +Rg001 +RhoDan +RiKkU +Ricci1969 +Richard1 +Ricky1805 +Ridhwan#2 +Rilas5 +Rimaz +RinoRo +Rinty +RioBravo +Ripamonti +Rising17 +Riva123 +Rivest +Rizist +Rj081948 +RjirF +Rkd6487 +Rleik10 +RmcDPv +Ro3Baq +RoPa55 +RoRo +RoTrauT +RoadHouse +Roadrunner2004 +Rob3rt +RobSuz +Robert +Robert29 +Robert83 +Robin1 +Robin789 +Robin987 +RobinG +Robinson +Rock2010 +Rocker +Rocko +Rockstar +Rockwell00 +Rocky1 +Rocky1980 +Rocky3188 +Rocky872 +Rockys +Roemer06 +Rogue001 +Rohling1 +Roksana1 +Roland +Rollason2 +Rollen23 +Roller +Rom05 +Rom1eo +Roma +Ronaldo +Ronin159 +RonjaF +Ronson +Roofos +Rootbeer53 +RosCommon7 +Rose81 +Rosemarie +Rosemont1 +Rosenheim +Rosenquist +Rossanna5 +Rosshead +Rostos20 +Rotkohl +Roxette123 +Roxette99 +Roxor +Rp7Scx +Rs1234 +RsgPek +Rtc12345 +Ru11di +RuckerP +Rudolf +Rudy1992 +Rueda581 +Rujana +Rumdum +RumpSteak1 +Run +Runner2008 +Russen +Russia2 +Rustenburg +Rustys11 +Rutgers +Ryan25 +Ryland2110 +Rytiss +Rzteam +S +S! +S!ddharta +S!lverf!sh +S0H3IL +S0MBRAS1 +S0lweig +S0sD3m +S0uthp0rt +S11997733 +S15117 +S171091A +S1959 +S1@ppyNtz +S1IOMU +S2031W +S3VNPT +S3cR3t +S3ld0n +S3relo +S4QmDg +S4n1 +S695502S +S6zKEGs167 +S77009400 +S9780 +S=$*JM4 +S@1776 +SA108281 +SA1GADOS +SA8419 +SABRINA +SAG1RA +SAGRARIO09 +SAL@200 +SALSABILA +SALT +SALVAD35 +SAMPLE +SAMWAG +SARROCA39 +SASHA +SAUDIARABIA +SAUGOM +SAWADEE +SAZIHA +SB3200 +SB46cX +SCHEI?ER +SCHMARRN +SCOPEIS +SCOTTSM +SCUDO +SCjN5R +SDW30 +SE2002 +SEANFLA +SEBERW +SECRET +SEDDES +SEHA +SEKSEK +SENHRGE +SENSEI9 +SENTA33 +SEPTEMBER +SERGI196 +SERGO09 +SERIOS +SET08D +SETSUNA +SEX666 +SF1H1B +SFSMITH08 +SGpRvr +SHARKS +SHENOL +SIEMPRE +SILVANITAS +SISAAA +SISTECH7 +SISTERO123 +SITGES05 +SIXTB +SJ400 +SKBKa +SL804 +SLK +SMASH +SMN2006 +SNAPD&K +SNICH1 +SNIP317 +SNKk +SNowak +SOCA3000 +SOLUTIM +SONNE2W +SOPHIE +SP120B +SPANDA1985 +SPIELEN +SPIN01 +SPIN14 +SPIRIT +SPLADMI +SPPUZE +SQLQL +SQZug +SS +SSJ +SSSSSS +SSTV +STACI2009 +STARgate +STARol +STAS188 +STEFANO +STEVE +STFU +STHLT +STORstrom +STinat +STte +SUCK +SUNTER1 +SURELY4 +SW +SWABRA +SWALLOW +SWAN +SWEEPDA +SXKJDX +SXZxfS +SY&7Ww4fVY3NMC +SYRUS +SYSTEC +SaEA4v +SaH6iS +SaRoNa +Saara#1 +Sabina0806 +Sabine2007 +Sabine5302 +Sabire +Sacramento1975 +Safire10 +Sahrie +Saibot +Saibot2256 +Sailfish24 +Sailor +Saint1 +Saintly83 +Sakinis +SalahdiN +Salamander0 +Salbei1 +Salut +SamSam00 +SamSpy +Samba +Samburi8 +Samira +Sammer +Sammer6 +Sammy! +Samsun +Samsung +Sand11 +Sandberg23 +Sandmann2360 +Sando1 +Sandra +Sandra0907 +Sandra1812 +Sandra3103 +Sandwich1 +Sandy +Sangao +Sango3128 +Sania666 +SantaB +SantaFee +Santoare +Sapsys1em +SarahM +Sarek944 +Sartan1983 +Sascha +Sascha1984 +Saskia0406 +Sasol8704 +Satan +Satan1974 +Satanist +Satcom1972 +Sather33 +Satinerus +Saturn0815 +Saturnus95 +Satyricon +Saudi +Sauerkra +Sauger0606 +Saunie13 +Sausage37 +Savage1989 +ScHrOeDeR71 +Scales123 +Scalpell +Scar2301 +Scaramanga1974 +Scarfo +Scarlett +Sch00L +Schaefchen21 +Schatz +Scheisse +Schelly +Scherer +Scherg +Scherry2 +Schicker0402 +Schiemann +Schigger +Schijt1 +Schill59 +Schilling +Schiri +Schissda +Schkk6 +Schlafen +Schlampi10 +Schlange +Schlips6 +Schlunzer +Schnecke +Schnecke03 +Schnecke12 +Schneetreiben +Schnolle +Schorchi +Schranke +Schrump1 +Schuab1 +Schule +Schumi +Schutten! +Schwaggi +Schwede +Schweden +Schweich +SchweigeR +Schwein +Schwimmer3 +Scirrocco +Scissor91 +Scorpions +Scorps81 +Scotch +SeJJCH +SeaOtter28 +Seattle143 +Sebastian +Secret6853 +Secure +Seemann79 +Seemoewe99 +Segaa +Segami88 +Segretos +Seguridad +Seji9406 +Selina2299 +Sempron123 +Semproniak +SenatorA +Sence412 +Sensei89 +Sentinelle +Sephiroth +Sept2972 +September +Serena092 +Serena0c +Serpentin54 +Server0302 +Servus +Session311 +Seth +Severin2006 +Sex +SfavV +Sfax06 +Sgenesis +Sgilde +Sh1n3y +Sh33P0 +Shad0w +Shadey2802 +Shadow +Shadowoo +Shaggy +Shahida1 +Shakes74 +Shakespeare +Shakira +Shaklee2009 +Shakur92 +Shalin9 +ShanE +Shane +Shannah247 +Shanty42 +Sharan69 +Sharky12 +Sharon +Sharpie3! +Shawn3235 +Sheeva1967 +ShefShef +Sheff0812 +Sheila0303 +Sheila2405 +Sheila9 +Shelton1! +Sherdon01 +Sherry8788 +Shickano +Shield +Shimano! +Shippensburg11 +Shizo +Shocking1904 +Shogun99 +Shotgun7 +Shoty +Shpili +Shrewsbury123 +Shritis +Si2619 +SiL3nT +Sian08 +Sibylle67 +Sieger77 +Siemens +Siemensv1 +Siena32 +Sigaretta12 +Sigi46 +Sigi77 +Signal95 +Silber4 +Silberman1 +Silencer2112 +Silent +Silke1 +Silke1211 +Silkiest +Sillysilly2 +Silmarillion +Silvester +Silvia +Sim +Simba +Simens1 +Simon +Simona +Simone +Simsalabim01 +Sina +Sinaaa +Sinclair +Singha +Siobhan +Siofok06 +Sirf00 +Sirus840 +Sister09 +SistersT +Siteman +Siviella +Six123 +Sixpack +SjdkAS +Skandal! +Skate +Skate1 +Skateboard +Skatime +Skeeve01 +Skiler +Skillet +Skink2 +Skleslo +Skowron3210 +Skriver11 +Skunk1977 +Skylar333 +Skyline33 +Skyline6891 +Skype3 +Skywalker +Sl177079 +Sl1mmer1 +Slasher90 +Slawek1979 +Slayand6666 +Slayer +Sleep1313 +Slice85 +Slider +SliveR +Slottery91 +Slovan +Slugger +Slut666 +Smaggy +Smarinex1 +Smarty +Smash +Smile +Smirnoff +Smokin99 +Smoyk +Smx2Acs10Tpr +Smyrek +Sn0wmane +Sn1vFd +Snajdis +Snape +Sneep +Snegow +Snickers2008 +Snin1977 +Sniper1 +SnoOpy +SnodGrass +Snoopy1303 +Snotty1 +Snow12 +Snowflake19 +Snuffy705 +SoAE +Sobe3 +Sobo13 +SociAl +Socka605 +Sockenn +Sodalith +Soeiro +Soemmerda +Soest +Sofi928Dani +Sofie1976 +Softba1* +SokrateS +Solar1997 +Solaris5 +Soldier +Solkan +Soly +Something +Sommarsol +Sommerferien08 +Sommerwind +Sonci2010 +Sonderpreise +Sonic1402 +Sonne09 +Sonne159 +Sonne2010 +Sonnen1schein +Sonnenallee1 +Sonnenblume +Sonnenschein +Sonnenschein77 +Sonntag4a +Sophokles +Sotis9496 +Sound2308 +Southgate +Souza2009 +Sp00n +Sp00n1 +SpEccY +Spamky +Spanien +Spanner85 +Sparta16 +Spartaner +Spawn +Speakers101 +Spears +Spectrum59 +Speeches +Speedracer!5 +Speedy0310 +Spengler01 +Spider406 +Spidernet +Spiked69 +Spikey5317 +Spinner +Spirale1122 +SpiriTz10 +Spirit +Spitfire +Spitfire44 +Spitii +Spleen0162 +Spoon182 +SpoonMan76 +Sporthalle +Sportler66 +Spr1ng11 +Spring09 +Springerm9 +Spunk +Sputnic08 +Sql2008 +Srol2 +Ss2000 +Sstar +St1808 +St3li0s +St916330 +StHubert +Stabioxu +Stalemate875 +Stalker84 +Stange +Stanley1q +Star6234 +StarBug1 +StarWars +Stardust +Starfire +Starfire88 +Stark +Stark753 +Starling85 +Starsh1n3 +Start +Staufen10 +Stavba99 +Ste5henson +SteFfi +StefaN1 +Stefan +Steffen +Steffens1 +Steffi +Steffi0803 +Steigeisen +Steined1 +Steiner747 +Steini88 +Steinmet +Stekcub +Stellwer +Stemwede0177 +Stenograf +Stephan +Stephen +Sterling7 +Stern +Sterne02 +Steroids +Steve +Steven +Stevenius +Stevevai11 +Stieby +Stiehli +Stolzenbach +Stoned +Stonehenge99 +Storgatan32 +Stormtrooper +Strangers37 +Strasilo +StrawberrY +Streg1987 +Stricher +Strider21 +Striewe +Strike4203 +Striker1101 +Striker36 +Strindberg +String +Stro350 +Strolch2002 +Stromecek444 +Strudel84 +Strumpet69 +Strumpf +Strumpfhose +Stube329 +Student2780 +Studium1988 +Stuermer1984 +Stumpfi +Stupid1a +Styles +SuPrA1 +SuZuKa1 +Suba68 +Subi0130 +Subliminal +Success! +Sucharek123 +Sucker +Sugar7712 +Suhler77 +Suku2212 +Sumatra987 +SunFun2008 +SunShine1! +Sunkist7 +Sunscr1t +Sup3rwoman +Super0607 +Super1 +Super62 +SuperBowl09 +SuperJudge +SuperM +Superl66 +Superman1978 +Supernova1985 +Supertino76 +Support4321 +Supreme +Surprise0 +Susanne1* +Susi293 +Susi73 +Suzanne8$ +Suzia1 +Sv1011 +Svenja2302 +Sverkos +Sviluppo2009 +Sweet2Mall +SweetPea66 +Sweetness1! +Sweety5 +Swim21 +Swud7Z +Swudae +Syncry +Synergy01 +Synthes1 +Syscon2410 +Sysf12 +SzK908 +Szadek11 +Szymon1981 +T +T(( +T.Frings +T0CH!KE +T0PD0G! +T0T0 +T0mmass0 +T0rn +T0y0t4 +T14950 +T14m0 +T1NTT1 +T1tty +T5eep +T952K +TAMER +TARDOR +TARGETS2 +TARTAR +TAUrus +TC060402 +TDK123 +TE +TE4fyou8 +TEACHUS +TEAM200 +TECHSUP +TELEFONI11 +TELLITE +TEODAM +TERRA +TERRA72 +TEST +TEST123 +TESTING +TGACC2 +TH3S1X1 +THAILAND +THOR1972 +THUNDERGOD06 +THX117 +TIAPITR +TICA02 +TIGRES1A +TIKIOP +TIM +TINKER +TINTIN +TK103 +TKO23 +TL4S +TNT +TO1TO +TO2000 +TOADSTOOL +TOBIAS +TOBRINA +TOCINO00 +TOES@1 +TOIFELS +TOMEK2005 +TOOL84) +TOPGUM +TOPS65 +TOPU41J +TORRES33 +TOTALNOD +TPB12345 +TPK175 +TQse30 +TR3ATY +TRANSMISSION +TRAVEL +TRE$UIO +TRE13S +TRETOR +TRIBUNAL +TRIGUEROS3 +TRIYA! +TROPICOS3 +TROTTEL +TRUSTEE +TRY4FUN +TSV75 +TSurabus +TT112233 +TTC +TTWTTW +TURTLE +TUl +TW310190 +TWENGA +TWINKLE +TWe7 +TXOMIN11 +TY54()G +Tabaluga4 +Tablette +Tagore1967 +Tahoe831 +Tahvo1337 +Taihen23 +Taisija +Takamine +Takarya +Takko06 +Talaia1257 +Talida1 +Talmadge1999 +Tamara0108 +Tamara0388 +Tamara2703 +Tamasii9 +Tami11 +Tamir* +Tammy1 +Tammyann60 +Tamuna +Tania +Tanis +TanjaB +Tanjar +Tanner6707 +Tanteto2 +Tapsi +Taradell +Tarheel1 +Tartan07 +Tauchen08 +Taucher +Taunt213 +Taunus2 +Taurean1 +Taylor +Tbontb79 +TchVs +Tcy8UmGp +Teaparty1 +Techman1 +TechnicaL +Techniks +Techno +Techno712 +Teclis +Tectonik +Tedi +Teekanne28 +Teekessel1 +Teknikum91 +Tekra332 +TeleK +Telegate01 +Television +Tellervo +Temo +Tenebre5 +Teneriffa +Tenshi +Tensions +Teoma1965 +Terence +Teresa +Termin83 +Terminal09 +Ternura +Terppa1 +Terri1986 +Terrica04 +Terrisue143 +Terrorist +Terry720 +Test +Test1 +Test123 +Test123 +TestPW +TestTest +Testas +Teste +Testen +Tester +Testoi +Testosteron +Teufel +Teutonia +Teutonius +Teves15 +Tevion100 +Tewes +Text +TextH +TfourM +Tgirl1971 +Th3r3sa1 +Thalin5 +Thawach +The +TheLaw +TheTruth18 +Thegreatest1 +Thermo13 +Therry01 +Thessa +Thijn1984 +Thomas0 +Thomas1171 +Thomas6688 +Thopia +Thoric2a +Thorsen007 +Thorwal74 +Thrawn +Threepwood +Thui1337 +Thunder177 +Thyra1997 +TiNa04 +Tibet1 +Tibu2991 +Tiere123 +Tiffany! +Tiger1006 +Tigershark1 +Tigger +Tigris05 +Tilfi +Tilsit1903 +Timbaland92 +Timbuk2 +Timerider24 +Timmi188 +Timmy +Timtim03 +Tina0508 +Tinchen0013 +Tinderet +Tinka07 +Tinkerbell +Tiph09 +Tippman99 +Tiptronic69 +Tissi100 +Titanas +Titania1898 +Titanik +Titanium27 +Titten +TjLeQX +TjoR30 +Tjorven04 +TkdPvS +Tktyf +Tnrwcz +ToBiAs +ToWeR +Toaster1 +Tobago28 +Tobias101 +Tobias15 +Toby8124 +Tofu12 +Togram +Tol1to +TolKien5 +Tolans805 +Toldi83 +Toled035 +Toledo03 +Toller99 +Tom +Tom1sena +TomTex +TomaS +Tomahawk +Tomas1 +Tomate23 +Tomate30 +Tomek1 +Tommas91 +Tompa +Tomten1632 +Tonics01 +Tontechnik +Toodlepip123 +ToolBoxen +Toots7112 +TopP0l +Topaz6501 +Topmodel +Toreador04 +Toria +Tornes +Torok15 +Torsten +Torsten08 +Torte26 +Tosun76 +Total +Total493 +Totti +Tottie +Touring +Tourn1quet +Touta +Tova88 +Toward1 +Toya12 +Tracey80 +TradeMark +Trae3890 +Trampes +Transf1 +Transit2009 +Traudi58 +Travelnet2 +Travis +Treasury01 +Trebor +Tres0000 +Tresaurus +Tribute09 +Trigger12 +Trillian8 +Trinit1 +Triquetra3 +Trit0ns +Trixie220 +Trocadero +Trolle +Trooper +Trottel +Trubert129 +Trucks +True +Truffeltje +Trump90 +Trunks00 +Trunks2259 +Trust1 +Trustone1 +Ts24816 +Tsunami42 +Tsuruga! +TuFru3 +TuPaC +TuT +Tuba1cain +Tuber +Tulled +TuneUp +Tuon2828 +Tupfer110 +Turanga1 +Turboc +Turk01 +Turoc +Turquiano +Tvilling +Twilight +Twista +Twister +Tygrys1 +Tyhwth +Tykki123 +Tyler08 +Tylynn82 +Tyrael +Tyranda6 +Tz456477 +U +U5!0HuzaVGSgBJ +U5U3Y +U8I +UBEDA003 +UBEDA1973 +UBNT4AD +UG180250 +UG51 +UGO +UHEYUR +UHgrif +UKJDb +ULTIMATE +UM4052 +UM@2$69 +UMDeqy +UMUTAL +UNIAR +UNKNOWN002 +UPKS7 +USER +UTADAH +UTD@11@ +UTE123456com +UUUuuuUUU +UUuuuuUU +UXFQIJ4 +UaQ273 +Ucsd1234 +Uf1sadm +Ufa2005 +Ufhbjy +Ufrogs +UfuEsx +Uh220181 +Uli888 +Uller123 +Ulric4252 +Ulrich99 +Ultegra75 +Ultima8 +Un1ty +Un1xM3 +UnRe41 +Unblind215 +UndeadZ +Undertaker +Unholy +Unicorn +Unikowo6 +Universal +Unkas +Unknown +Unless6451 +Unreal +Unrivalled1 +Untam3d1 +Uoyn5 +Up7CK +Updike08 +Uphill53 +Upsala03 +Ur7AGa +Uraj +Uri +Urlaub2 +Us15C +User +Username +Usuarios +Ut39lB +UtGt6g +Utah +Utero1 +UtmvEA +Uxe35 +V07042010 +V123456T +V123789A +V1CENTES +V1s10n4ry +V2+2KQS +V3R4N3R0 +V68@FHS +VA0177 +VA0707 +VADIN +VAGINA +VALERIE +VASYALO +VAXC3 +VB2008 +VDIPD23 +VDaQ6n +VECCHIA1987 +VEG123 +VELERO +VENERE +VENICE61 +VFMIAZ +VICENTE +VIDEOMAN +VILNIUS +VIRG8NIA +VK011267 +VKR2L5! +VNC +VO5OJKQ +VOLKAN +VS9WIEC248 +VTFF +VVvv +VW777 +VYZEQI +Vachja +Vader +Vadym +Vaihingen +ValVe2 +Valco18 +ValerA +Valiooo +Valium21 +Vampira +Vampire +Vanessa +Vanessa021 +Vanhalen#1 +Varient0679 +Varmint4 +Varna052 +Varvara2005 +Vasilis +Vati42 +Vatter +Vbhu8292 +VeNus64 +Vega83 +Vegas +Vegeta +Vendetta10 +Venise +Ventricule +Veranda2010 +Verano2010 +Veratou +Verena!2 +Verena06 +Verena1234 +Vergere39 +Vergessen7 +Veritech76 +Veronik4 +Vertrauensmann +Verwalter#1 +Vfjr0 +Vfylfhby2009 +VgpMKk +Vibeke +Vic624 +Vicknair7 +Vicky +Victoria +Victrola7 +Vida +Viersen +Viewsonic +Vikbil +Viktor +Viktorija +Village020 +Vilmer123 +Vinter667 +Violetta +Viper9 +Virtala1 +Virus +Virus1971 +Visitar +Vista1955 +VisualAge +Vivec2 +Vivien +Vl010980 +Vlad1517 +Vlora5 +Vmarc +Voba9795 +Vodevil1 +Vogelweider +Volcano1 +Volkan1 +Volks123 +VollMond +Vonnegut06 +Vorderbu +Vortex1978 +Vroni23 +VuTo26 +Vulcan +Vuuren2021 +W0WPA55 +W1209x +W188YI +W1LK1NS +W1ntermut3 +W236092W +W3ath3rwax +W3ston +W5Gb4C +W5kpzc +W@lther +WA84PW +WACKO28 +WALKER1 +WANTED999 +WAREZ +WATERRA +WBF563D +WC(4Umjjudr9OW +WCUWCU +WD4056 +WDETH=1 +WELKOM +WENcheng +WH@TEVE +WHTFZST +WIFIADM +WILLY275 +WINNER +WM2003 +WM6500 +WM73 +WMMiss +WORDPAS +WOWWOW +WPD123 +WS3JQ8 +WSFTP +WSQ +WTA8Q36 +WUPPERTAL +WVC17PoB +WWW +WYB +WZPOUl +Wa1sh1 +WaRdY +WaTsOn +WaZaa +Wachtwoord88 +Waeller4 +Waffle27 +Waggon33 +Wagner +Wakk +WaldHorn +Waldner +Waldo +Wales +Walkman +Wallus +Waltraud +Wanted2009 +War1ockz +Wario234 +Warland2789 +Warlock37 +WartBurg +Waschen +Wasiat +Wasted22 +Watermark1! +Watertown22 +WcjoU +WeSt +Web777 +Webern +Wedgewood658 +Weezer00 +Wein82 +Wekkerradi0 +Welcome +Welcome! +Welcome9 +Weldon718 +Welling1 +Werner49 +Werwolf26 +Wesley +Wespe1943 +WestSussex +Westclox24 +Westside +Westwood91 +Wexi4608 +Whatever +Whitestar123 +Whopper +Whore6 +Wi2lW3 +Widget69 +Widikum1 +Wiesenberger +Wiking +Wilbers +Wildcard10 +Wilkau +Wilkinson23 +William9123 +Williams +Willow +Willow1974 +Willy05 +Willy536 +Wilson143 +Wim0712 +Win-vmtestsrv +Win32s +Windmaker1 +Windows +Windsurfen +Windsurfen07 +Winfo2008 +WingMan13 +Winston +WinteR +Winter1 +WinterNacht +Wintere72 +Winterzeit02 +Witten +Wizard1337 +Wlpc#3040 +WoW8698 +WobnxL +Woelfe +Woelfe22 +Woelle +Wolf +Wolf16 +Wolfen1954 +Wolvie0303 +Wombel +Wonderland22 +WooHoo +Woodbird6 +Woodstock +Woodstock08 +Wookies456 +Word +WorkFlow1234 +Wosz +Wotan3004 +Wqz2q +Wrestler69 +Wroma +Wudus6 +Wugy +WukDa +Wurmloch45 +Wurzel17 +Wyoming +X +X0621573 +X2000A +X2D +X34A9T +X3C08 +X4l4n4 +X4v10r +X5O!P%@ +X61279 +X93523813 +XBlack +XC6hd +XCD +XERX8N +XF4411 +XIHUAN1981 +XIII +XJ059P0 +XJS22Q +XJYc +XK63W4 +XLpox +XR650R +XWI926 +XWI927 +XXEBBA +XXHjnw +XXXXXX +XXXXXXXXXX +Xades1 +Xanatos11 +Xaviore1 +Xc5K6l +Xdie +XenrU +XhELp5 +XiaoLi +Xilebo +XrE6Ph +XrZ3LN +Xtyuio +XuXuXu +Xx2392 +XxXxxX +XybCj +Xyv9X +Y&B1L#K +Y3K +Y3sevG +Y46363 +Y5KAaRZ396 +Y6oL0d +Y7kvar +Y@NK33$ +YARRAK +YDMW95 +YEAxb +YGNE4 +YGfV31 +YJ7S +YKSVW7 +YN5G +YNH0D +YOU +YOUSTIN +YOWOb +YRU2STU +YUGIOH +YUI +YUI123 +YULXIO +YXI222 +YXWvQ3 +YYST44 +Yachi +Yael99 +Yaelyael +Yak55 +Yakumo +Yamaha2 +Yamaneko +Yankovic84 +Yannick1 +Yannick1998 +Yannis +Yariv +Yasur +Yatsura0 +Ybjb05 +Ye54bu +Yeah +Yecgaa +Yelis1708 +Yellowball37 +Yenny +Yenz1957 +Yerda001 +Yeropa +Yes +Yesmin94 +Yessongs11 +Yfnfif +Yggdrasil +Yggdrasil84 +Yi4hu +YmLen4 +Ymca0987 +YnKHnl +Yoda76 +Yoffin +Yojw6 +Yokki +Yolanta1 +Yoq +Yorosiku1 +You +Younes +Young +Youri +Yozgat +YqmH%f%8 +Yserbius1 +Yster +Ytongg +YuzDqT +Yz3b0vY166 +Z +Z199762 +Z2RMMh +Z3R0!K0 +Z4n0Z1 +Z7rBESKq +ZAC1234 +ZAGOR19 +ZAPZAP +ZBOR7 +ZBOR79 +ZEG22 +ZENTAO +ZINGER +ZJP7uN +ZKB3I1D +ZKS +ZKYZ +ZONITO +ZOO8Lm +ZORORO +ZSEckm +ZShell +ZUHYJU +ZUMRUD +ZXCde3 +ZYXTOL +ZYqgRe +ZZZZZZZ +ZZa711 +ZaBcA +Zahraa2a +Zaira12 +Zakon +Zander02 +Zarita +ZeHa45 +Zedler05 +Zehnmal3 +Zeitung +Zekk06 +Zelda1 +Zelda868 +Zend +Zenkan897 +Zenno54 +Zerbi912 +ZgLabs +ZhOpA +ZhqWyf +ZiGe32 +Zidane30 +ZieGeL +Ziegelei9 +Zientek +Zierfische +Zigaretten +Zigeuner1 +Ziggy4414 +ZimmeR +Zimmer1 +Zinni +Zino96 +Zinty1 +Zion7 +Zippa111 +Zippo +Zitate98 +ZitronenBaum +Zitto123 +Zlhd04 +ZmIk10 +Zmei1983 +Zonker2 +Zonkerz! +Zosia519 +Zrinka20 +Zs4Ss6 +Zucchero +Zucker +Zucotu +Zumsel +ZuoXin +Zwerg25 +Zwiebel. +ZyPE +Zz18Ee +[ +[avada] +[shithead] +] +^ +_ +_GoldrakE_ +_UNDERD +a +a'leshia +a.manar +a0011897 +a0027u +a0050394 +a006ee34 +a0070028 +a010203 +a010283z +a01036219 +a0161852 +a0186df0 +a027332a +a030166b +a031995 +a03220 +a0355564 +a04071235 +a04520452 +a04750475 +a04c95 +a05demir +a0610410 +a06288 +a0796s +a08c22 +a08t68m +a0982129 +a098626 +a0a1b2c3 +a0a25c +a0abcd0a +a0admin +a0alfred +a0b0b7 +a0b0c0op +a0b1096 +a0b1c2 +a0billy +a0danielle +a0dc6c +a0dontknow +a0f026ae +a0fgcehh +a0fingers +a0fsr +a0godmode +a0holiday +a0k5k43e +a0kitten +a0kitty +a0lbil +a0prince +a0s9d8f7 +a0sammie +a0vzk2qk +a1 +a100400a +a10101 +a101942 +a102010a +a103190 +a1064782 +a10988no +a10c2dd +a11 +a110ha +a111222b +a1168f +a117s2 +a117s20 +a11yb0b +a12031988 +a12098644 +a1212k +a1215493 +a12172 +a123182 +a123321 +a12345 +a123456 +a1234567 +a123456a +a123456k +a1234avi +a123567 +a12358 +a1236547 +a123a +a123f456 +a128128k +a12szug +a131482f +a1334b +a1346916 +a1357ab +a1379cc +a13bAZ +a1421974 +a147147a +a147369a +a147852d +a14cc1d6 +a150263 +a154c3 +a159456z +a1598753 +a159951a +a15fd3bb +a161072 +a16111983 +a1651e +a1663539 +a16andye +a16e9f +a16ec4 +a171259 +a17383 +a1755 +a1771 +a17eb65 +a181297m +a18915 +a1912p +a1923590 +a1984923 +a1985a +a19b86 +a1B2C3 +a1Xtremely +a1a1a1 +a1a2a3 +a1a2a3s1 +a1a8ae7e +a1advocate +a1alice +a1b2c3 +a1b2c3d4 +a1b2cx30 +a1b2o3 +a1b3c6 +a1b6c4d6 +a1bb2kmg +a1bigguy +a1bunnies +a1d2a3m4 +a1d2e3y4 +a1d36b +a1d4a2m3 +a1d9a8m9 +a1dakaps +a1debaran +a1f2s3d3 +a1f6bit +a1fwmk7 +a1godzilla +a1goober +a1jaguar +a1k2r +a1knz +a1l3e9jo +a1laguna +a1letmein +a1m13u21 +a1m2i3r4 +a1n2e3s4 +a1n9d8i7 +a1nk +a1points +a1quebec +a1rc243e +a1s1a1 +a1s2d3 +a1s2d30 +a1s2d3f4 +a1s3n9a6 +a1samson +a1stealth +a1unicorn +a1vdykar +a1wa7s +a1z2e3r +a1z4a2z5 +a1zsijj +a20001 +a20ccfdb +a2107p +a211078 +a211430 +a2123123 +a21587m +a2215b +a2242592 +a2292683 +a22988a +a23 +a23091958 +a231182z +a23175 +a2317s +a2333 +a236593 +a246321a +a2468 +a2478b +a250383 +a2549578 +a25892589 +a2743 +a28463750 +a28637490 +a290919a +a2998395 +a29f8f4 +a2a394 +a2afxup5 +a2ajnat +a2b +a2b22ab +a2baron +a2bella +a2cwb +a2ducky +a2e00o5 +a2ejx +a2forever +a2gerald +a2hotdog +a2ivanhoe +a2jqu +a2kb333u +a2l4a0n7 +a2lesley +a2loathing +a2m1e3 +a2m2t4p6 +a2maxwell +a2merlin +a2mickey +a2monday +a2oakley +a2roxzan +a2s3d4f5 +a2sq31 +a2starship +a2tf99 +a2tpowa +a2uqw +a3005979 +a30nflux +a3123304 +a31tl5e +a322222 +a3276880 +a330552 +a33221666 +a332v6 +a33nym +a3423050 +a344596a +a34827620 +a34891a +a34bo56 +a34lkhd +a34m320 +a34zq +a3500e +a353a028 +a3550198 +a3567543 +a3609451 +a3668waq +a371b64d +a371ce +a376800 +a379108c +a37p0j34 +a38cvha +a39402616 +a3Werty +a3a823 +a3b2c1 +a3bogart +a3c10794 +a3c1cdf +a3coffee +a3d87cz5 +a3ecss +a3gordon +a3kae +a3mollyb +a3multimedia +a3patricia +a3pepper +a3r0ph1l +a3slarti +a3stealth +a3trueno +a3turkey +a3v5f7 +a3xzaz0 +a3zebra +a4011627 +a4044153 +a4080727 +a4271994 +a42798b +a429abcd +a42q8r0c +a43994961 +a43b69xx +a444de7 +a445556 +a452a5f +a456654 +a456aa +a4601215 +a46596 +a470pv2u +a4736479 +a4745 +a4786588 +a49c6f +a49yutjy +a4a92330 +a4bb626 +a4beeeab +a4berni +a4bugsy +a4chelsea +a4f5525 +a4f66 +a4f6626 +a4fredfred +a4g19842 +a4growly +a4joer +a4nsbjlr +a4q8t1ya +a4qoa +a4r8wy1q +a4s5d6 +a4s5w +a4scooter +a4sterne +a4sweet +a4tech50 +a4wc6m9d +a4worrel +a4zb6ou +a5022607 +a51199 +a51502112 +a51dac4 +a51m0v +a5241047 +a529688a +a52qkk22 +a53gijwt +a53lj +a5430z +a54427964 +a5458137 +a54d62 +a5508888 +a5513155 +a55a51n +a55clown +a55fdc7a +a56052400 +a56aru74 +a570071g +a578c3 +a5857772 +a58911 +a5MHwk +a5PTDH +a5allison +a5buddies +a5c1 +a5d8a6 +a5d9j2l9 +a5e4b6 +a5ea1f +a5fa10 +a5failure +a5ilh +a5kentucky +a5mapt4 +a5mdn +a5meisie +a5yi46 +a6029037 +a61 +a610521b +a610687 +a616113 +a6161206 +a622b8 +a624b512 +a6251707 +a626aa +a6281877 +a630e8af +a6312a +a6320033 +a6323d +a6337237 +a6338833 +a6363598 +a64b65 +a6551288 +a6561051 +a66mgmbk +a6764782 +a6777adc +a687191 +a695g27n +a6H2oL +a6a3c7 +a6a9d0e2 +a6b4086 +a6b4e16y +a6baongoc +a6bd088 +a6ce79 +a6deltree +a6df0a +a6eg32r0 +a6f57449 +a6fairfax +a6jubilee +a6macca +a6nixon1 +a6pack4u +a6s4d8h +a6s4d8h9 +a6sairam +a6schatzi +a6v6j2fl +a718c91 +a71bf80 +a7213b6a +a72817281 +a729057a +a730914a +a731cook +a739050z +a73926122 +a740922 +a7437533 +a7466140 +a7475928 +a74igu9e +a7503g +a755711a +a7569567 +a7573e6e +a7654321 +a7721a +a77734536 +a77777a +a781015 +a7815191 +a7819063 +a7854120 +a787d8a6 +a7880041 +a7898521 +a78s6dg +a79096294 +a79e7b7 +a79eae +a7a703f0 +a7c16ab5 +a7c432 +a7cmhuxq +a7eda7ed +a7f98h3e +a7fqaful +a7g27vh +a7gh5n +a7jubel +a7m7stec +a7malp1 +a7massage +a7scorched +a7shoote +a7spitfire +a80oct20 +a82006 +a8359415 +a8402155 +a8449987 +a84556477 +a84edba8 +a84g07a +a851214s +a861204 +a864c2b6 +a8700161 +a8708446 +a87181 +a87587676 +a879601 +a8854081 +a88957222 +a89606a +a89843007 +a89zdz +a8ctnswa +a8diesel +a8dk4bme +a8joshua +a8lobster +a8lovefool +a8lucky +a8makeout +a8nijxv3 +a8nsli +a8optio +a8q3v6 +a8sophie +a8tonkin +a8txi +a8voltage +a8wjdvuw +a9001900 +a900q145 +a9071957 +a90ae530 +a9128425 +a92q9xx8 +a941013b +a94216398 +a944823s +a9601025 +a9605888 +a9637415 +a96w5jb0 +a97ys5 +a98026 +a989498a +a98bs1l5 +a9998877 +a99dafa +a9angelou +a9asterix +a9audrey +a9ceilidh +a9dad82 +a9dde668 +a9dfeb4 +a9djp +a9dqb57u +a9evelyne +a9f44f4 +a9g3rc45 +a9j3d8h5 +a9montrose +a9richard +a9sidney +a9skeeve +a9tigerman +a9toa99 +a9tomato +a9uft +aA123456 +aBB +aCadir +aCiBa +aHn34k +aIT4z +aJ19zQ6w +aL3h8s +aLoe83 +aR7Us +aSAD +aTtila1 +aWatif +aXJmm1Z299 +aa +aa015628 +aa031294 +aa111000 +aa1111 +aa113355 +aa123321 +aa1234 +aa12aa +aa12asan +aa1337 +aa177fb9 +aa1952 +aa1b81b4 +aa1bb1 +aa2006 +aa237 +aa2ca3 +aa2loaz0 +aa364462 +aa374bf +aa3peip5 +aa436078 +aa4392he +aa480612 +aa4afcf +aa52fg9 +aa654321 +aa668897 +aa66tzr +aa728787 +aa74b +aa754ea9 +aa777999 +aa779567 +aa8007 +aa871352 +aa8b5c4 +aa919117 +aa922781 +aa986z +aa9973 +aaa +aaa030 +aaa111 +aaa123 +aaa223 +aaa333 +aaa777 +aaa8111 +aaa999 +aaaa +aaaa1111 +aaaa1113 +aaaaa +aaaaaa +aaaaaa1 +aaaaaa55 +aaaaaaA1 +aaaaaaa +aaaaaaa7 +aaaaaaaa +aaaaaaaaaa +aaabbb +aaabbbc +aaasss +aaawin +aab +aabbccdd +aabks11 +aabr9 +aacc767 +aaccf53 +aachen +aachen93 +aacomps +aad +aadelgado +aadjj52x +aadmin +aae569 +aaerty +aaezp7uw +aafios +aagcdssj +aagrfe +aai000 +aai2011 +aak419 +aakt1234 +aal74hg +aalborg +aalbu +aalesley +aalhamed +aaliyah +aaliyah1 +aallah +aalmot +aalo +aamai1969 +aami333 +aamisiek +aamm2303 +aamo1980 +aanderaa89 +aannggee +aao1957 +aaosas +aap +aapaap +aapje123 +aapjeaapje1 +aapnoot +aapo21 +aaqqaa +aaqwer +aardvark +aare13 +aarika +aarikasdf +aaron +aaron0208 +aaron1 +aaron79 +aaronb55 +aarongeg +aaronli +aarons +aarosan +aarsa69 +aarshaar +aartur +aas954sx +aasen457 +aass2020 +aassaass +aassdd +aassff +aatqvhdu +aaw45nf8 +aawsom +aax2tuuk +aay +aay31qn +aayac123 +aayy +aaz3o +aazkzw4e +aazzaazz +ab +ab011193 +ab090380 +ab0963e5 +ab101Q +ab103cd +ab1090 +ab10sc +ab123 +ab1234 +ab123456 +ab12ab +ab1415 +ab180625 +ab2005 +ab244056 +ab249583 +ab24aa +ab2512 +ab280788 +ab3 +ab321653 +ab33777 +ab356ca +ab371359 +ab3cf2h3 +ab450446 +ab5615f8 +ab623a1e +ab77858 +ab7bc32 +ab83e0 +ab8520 +ab92149 +ab9690 +ab98275 +ab987c1 +ab9999 +abBRENDAN +abOOdi +aba +aba007 +aba706 +abab0217 +abacabb +abacadaba +abaccan +abacus +abad +abadan77 +abadas +abaddon +abadesso +abagail +abahirem +abaima +abakus +abaljem +abalones +abalys +abarca +abas +abasaleh +abass +abathulk +abaukkpo +abava906 +abavaema +abayanj +abazaba +abbadmin +abbadon8 +abbaffabba +abbagl27 +abbas2007 +abbc1212 +abbelgard +abbey +abbey1 +abbkrub +abborre0043 +abby +abby +abby1abby +abby2006 +abby284 +abbyemma +abc +abc010 +abc123 +abc1230 +abc1234 +abc12345 +abc123a +abc124 +abc185 +abc19 +abc1978 +abc321 +abc3qhai +abc5 +abc579 +abc6954 +abc7123 +abc789?? +abca +abcabcabcabc +abcd +abcd0216 +abcd098 +abcd123 +abcd1234 +abcd1553 +abcd2462 +abcd3 +abcd4647 +abcd6232 +abcd9511 +abcde +abcde001 +abcde321 +abcdeabcde +abcdef +abcdefg +abcdefgh +abcdefghi +abcdeniz +abcefg +abceger +abcfe +abcolcan +abcom +abcottage +abctenor +abcxyz +abcxyz42 +abcyoyo +abcz +abd001 +abd123 +abdali +abdali13 +abdallah +abdaughter +abdc +abdeghjk +abdel jabbar +abdel khalek +abdela79 +abdelali +abdelaziz +abdellah +abdilli +abdo1010 +abdo1982 +abdo2010 +abdo2k8 +abdomen +abdoucpi +abdoula +abdoulaye +abdul wares +abdul-rahman +abduljude +abdullah +abdullahs +abe +abe +abe3rj8a +abeceda1 +abecotel +abedin +abeedz +abeer416 +abel +abel0108 +abelcain +abelete +abello44 +abeltran +abelvictor +abend$rot +abenteurer +aber4deen +aberl00l +abfall +abfrws +abgehtz +abggw +abgrasen01 +abhirami +abhishek +abiabi +abibuch +abid +abiela +abies +abigail +abigail +abihayat +abim1 +abimael50 +abin0728 +abinabin +abinat +abinews +abiralsh +abit3117 +abitur2020 +abiturol +abj89bmu +abjuf895 +abken123 +abkoshka +ablg +abmazmo +abmuppets +abner +aboajwa +abobadar +abod +abodahim +abolimba +abomar98 +abone55555 +abongo1337 +aboreem +aborisso +abort57 +aboseta +about420 +aboveground +abpcorp +abr00m1 +abr1990 +abracadabra9 +abraham +abrakadabra +abram25 +abrasel +abraxas +abraxas +abrder +abriles609 +abrilzoe +abriscan +abs25 +abs8220 +absabrina +absapaco +absburner +abschiet +absiif +abskpics +abso74x1 +absolut +absolut3 +absolutely +abspring99 +abstecken +absurd15 +absynergy +abtoulouse +abu7910 +abuahmad +abubakr +abudak79 +abuder3 +abudhabi1 +abuelita +abufaizy +abuhajar +abukir48 +abusus96 +abut19o +abuyahya +abuyounes +abvictory +abwestover +abwnb31183 +abyss650 +ac/dc +ac0e7b +ac106 +ac1089 +ac123 +ac12397 +ac1604 +ac1d0r +ac204 +ac205aroma +ac223891 +ac24304 +ac2710 +ac2849 +ac2bc +ac2f95 +ac300480 +ac35a8c1 +ac384b57 +ac386sx +ac4ever +ac4roses +ac62ds36 +ac697528 +ac6hup1 +ac7883 +ac81e8e +ac851649 +ac92hjxi +acMessiah +aca2810 +aca4webx +aca5213 +acab +acab! +acac2000 +acacac +acacia +acacia05 +acacia777 +academe27 +acagb +acamodie +acapulco4636 +acat77 +acb123 +acbabybaby +acca14 +accel_2009 +accent11 +accept +access +access01 +access127 +access235 +access420 +access70 +accfive +accidit1 +accio333 +acclady1 +acclon +accodata001 +accoerty +accord11 +accordse +accorwin +account +account02 +accountlog2 +accounts +accoword +accrete12345 +acctg +accupass +accutec +acdc1234 +acdc45 +acdc5 +acdeers +ace +ace trucking +ace1361 +ace16 +ace1772 +ace180 +ace313 +ace565 +aceace +acecho1 +acegik +acehvmtk +acelga321 +aceman +aceman9 +aceonby +acer +acer1517 +acer1711 +acer1984 +acer5961 +acer95g +aceral +aceramd +acerbis0 +acerocks +aces8177 +aceviper +acf00c +acfackua +acfg732a +acfilor1 +acgahgei +ach9i6tb +achat857 +achectore +acherk +acheron +achi90hc +achillea5 +achilles +achilles45 +achilles62 +achilleus +achim +achim +achmed15 +acho +achour81 +achsen +acht53 +achterkamer +achtung +acid123 +acid1948 +acid4all +acid7542 +acidas +acidb +acidburn +acide31 +acidman +acidrain11 +acidtrip +acj2005 +acjr0x +ack2208 +ack85hya +ackack +acker +ackers1 +ackers19 +ackimaus +acl33ch +acmaster +acmeacme +acmecity +acmilan +acnhgr +aco +acoauser +acobol +acoladjava +acomputer123 +aconon +acoolive +acorn1122 +acorn250 +acowns +acp123 +acp1scom +acp451 +acparma78 +acplugs +acrbf +acro1978 +acrylic +acrylico +acsiom +acsm567 +acspeaker +acsr +acss6666 +acstre33 +act4750 +acta2003 +actafool +actasia +actgra77 +acti9174 +action +activato1 +active +active4231 +activex +actor59 +actronc1 +actros +acts238 +actual01 +acu69rom +acua295 +acuario +acuarius20 +acul74 +acul86 +aculov +acunetix +acura1 +acura1980 +acuransx +acutfxex +acvg45 +acvshi08 +acwinter +acwolnosc +aczjr +aczstw +ad +ad0718 +ad123456 +ad13690 +ad180672 +ad1i2 +ad22007 +ad255c +ad25jd69 +ad2miral +ad301714 +ad35em +ad35wm +ad385385 +ad3min +ad4370 +ad4forum +ad561542 +ad5s2g9 +ad61031 +ad63619 +ad641017 +ad6p96 +ad8o7mqx +ad91849e +ad9595 +ad978min +adUser +adZam1 +ada +ada000 +ada1965 +ada7love +ada8542 +ada8f17 +adaa4302 +adaads +adadad +adagarga +adagio123 +adagny +adaklim +adalberto +adalee223 +adalon +adam +adam +adam0314 +adam1 +adam1234 +adam12ss +adam1955 +adam2020 +adam2664 +adam6907 +adam8026 +adam9715 +adama333 +adamadam +adamadam1 +adamboy1 +adamek +adamek +adammak1 +adammm +adammoss +adamr123 +adamsuxx +adamsvoboda +adamus0904 +adana +adanadan +adanoer +adara5946 +adaro +adarriel +adata14 +adblock +adburd +adc123 +adchronic +adcirrus +adclem03 +adcmike +add116ef +adda4831 +addada312 +addddfil +adde8510 +addemon +addesalle +addgroup1 +addidas345 +addie +addison +addisonfdsa +addmin +addonas +addram +address1 +addsum +adduser +addyman1 +ade +ade1360 +adefesio00 +adel +adelaida +adelaida +adelaide +adele +adelene81 +adelheid +adelina +adeline +adeline dewalt +adeline47 +adelmo +adelmsms +adelo +adelsberger +adem +adem +ademario +ademolas +ademonus +aden +adenabuy +adeniji2 +adenine2 +adenip +adenman +adenthekid +adequate +aderiple +adessa70 +adeva99 +adexya +adezsaez +adf +adf1s2s3 +adfa429 +adfabfive +adfadfdf +adfear +adfontes +adg8u +adgangskode12 +adgettie +adghdcjw +adgj +adgjm +adgjmp0 +adgjsfh +adgsfh1 +adhcadhc +adhuj375 +adhunsa +adi +adi +adi098 +adi122 +adi1996 +adi234 +adi31641 +adia +adialtec +adib2000 +adiboy +adidas +adidas181 +adidas3k +adidaslt +adige +adiida +adijagi +adik1230 +adiksayo +adilar +adildona +adile +adile1 +adilgr +adilngr +adilover +adinaelena +adineamin +adioni +adipass +adipc21 +adipop27 +adirga02 +adirosko +adis +adisko13 +adisol +adison +adison!7 +adisun03 +adisurya +adit +adit666 +aditane +aditevet +aditi3 +aditza +adivina +adixxx1 +adjr6ain +adjumo +adk +adkcss +adkle19 +adlatus +adler63 +adlfsmin +adloos +adm +adm004 +adm0scj +adm12101 +adm123 +adm12sys +adm1N +adm1n +adm1n230506 +adm1n4eg +adm20034 +adm3 +adm32511 +adm32768 +adm333 +adm3699 +adm42pas +adm59inv +adm7890 +admcus7 +admdcm +admfeest +admim +admin +admin +admin! +admin. +admin00 +admin001 +admin00n +admin01 +admin02 +admin022 +admin03 +admin04 +admin06 +admin1 +admin101 +admin10x +admin11 +admin111 +admin112 +admin12 +admin123 +admin125 +admin127 +admin13 +admin14 +admin147 +admin15 +admin16 +admin165 +admin1c +admin2 +admin200 +admin208 +admin21b +admin22 +admin222 +admin225 +admin23 +admin234 +admin236 +admin273 +admin27z +admin2c +admin2k +admin2k6 +admin3 +admin321 +admin35 +admin368 +admin37 +admin42 +admin4m3 +admin5 +admin50 +admin509 +admin543 +admin55 +admin567 +admin58 +admin639 +admin666 +admin687 +admin7 +admin73 +admin753 +admin76 +admin77 +admin786 +admin8 +admin80 +admin888 +admin900 +admin911 +admin951 +admin968 +admin9753 +admin980 +admin989 +admin99 +adminadmin +adminas +adminawp +adminbb +adminbbc +adminbkk +adminc +admincaf +admincfg +admincr +admincrs +admindlm +adminduk +adminek +adminek1 +adminem +adminfd +adminfit +adminfx +adminfy +adminfzf +adming +admingol +adminguy +adminhbr +adminhh +adminhp +admini +adminia +adminifg +adminio +adminis +administra +administrador +administrateur +administrator +administrator1 +adminja +adminjd1 +adminjos +adminka +adminka1 +adminklok +adminktg +adminleo +adminlionel +adminlol +adminlox +adminm2t +adminmis +adminmst +adminmtc +adminmx3 +adminn +adminnic +adminnimda +admino +adminp +adminpas +adminpil +adminpl +adminpop +adminpro +adminps1 +adminpse +adminpw +adminpwd +adminr0x +adminric +adminrty +admins +adminsb +adminss +admintcl +adminted +admintk +adminun +adminuoy +adminv +adminvgl +adminweb +adminwim +adminx +adminx88 +adminxb +adminxxx +adminz +adminz0 +admiral68 +admirals +admirer1 +admiropa +admis13 +admjkrps +admjnd +admkre +admmin +admnt +admon +admp9618 +admsmd +adnan +adnari +adobe +adobe1 +adocom +adog4044 +adol1234 +adolf +adolf14 +adolf2000 +adolf88 +adolfo +adolfo +adolfo77 +adolph +adolphe +adolpho +adomadom +adomas +adomas12 +adonis +adoor +ador2000 +adoree +adoree +adorufo +adospalace34 +adospalace344 +adotpwdw +adowa2 +adpadp +adpiyush +adpookie +adporman +adquv +adradr +adranders +adrax1 +adrenalin +adrenalina +adrenne +adress +adreyer +adrian +adrian +adrian belew +adrian0$erver +adrian03 +adrian1 +adrian2323 +adrian890 +adriana +adriana +adriana75 +adrianj +adrianna +adriano +adriano +adrias0722 +adriduke +adrien +adrien13 +adrienne +adrienne +adriomax +adro1217 +adrozd +adrychu +ads28tb +ads37590 +ads5683 +ads674 +ads881 +adsabber +adsalzoa +adsbls +adsense +adsl +adsl01 +adsl0904 +adsl1113 +adsl82 +adslf +adson +adson55 +adsweb13 +adswebstar +adt0708 +adt556 +adul +adulicad +aduriT +adv1500 +adv30148 +adv41986 +adv62888 +adv75030 +advance83 +advanced +advent +advent1 +advent306 +adventa2 +adventure +adveronica +adwadw +adwanda +adxr246 +ady2002 +ady2k +adycted +adyokohama +adz1251 +ae +ae020301 +ae133f3 +ae154304 +ae190290 +ae291556 +ae295126 +ae2agts8 +ae2db4 +ae3 +ae31ee +ae34447 +ae3qt +ae41b08 +ae6167 +ae65vah +ae6d6a +ae6rg +ae707zcb +ae7dcf +ae7j68 +ae85sony +ae90360 +ae929b97 +ae990985 +aePASSWORD +aeSUNSHINE +aeae9191 +aealepia +aeb6Keb0 +aebadboy +aec12km +aece741 +aedani +aedating +aedw2000 +aeemilio +aeesaees +aefalcons +aefhil +aeft2156 +aegeov +aegis +aegpkh +aegy +aegypten +aehumbug +aei11nov +aeiou1 +aeiou1337 +aeioub +aeisepe +aej3fwah +aekole21 +aeleanna +aelorella +aemastro +aemo1o6x +aendern +aenevada +aenima +aenne +aenr1 +aeon13 +aepasset +aephihop +aequitas +aera2003 +aera51 +aerachel +aerettig +aerj8 +aero08 +aero95 +aerobicks +aeronwy1 +aerosil +aerosmith +aerosol +aerox +aerox15 +aeroxmaxine +aesc1234 +aet1415 +aeternitas23 +aethelma +aethelstan +aetractor +aets8rhy +aeu2zx +aeu9xb6 +aeutdpm +aew813 +aex17yx3 +aezdo6jr +af +af009832 +af012087 +af05436 +af12345 +af161xzq +af31267 +af4212e8 +af5166 +af58e43b +af5c69d +af5na5 +af607d +af6bc12 +af85vls1 +af94194 +af9a301 +afPenfish +afa39e +afacan +afacan67 +afarack +afatsum +afatsum9964 +afbki +afc9394 +afcajax +afcnorth +afcpup +afddssdf +afe27b +afe4a +afeaspw +aferinn +aferpito +afetnimda +aff3872 +aff666 +aff911 +affarkit +affe +affect30 +affekt +affen +affenkot +affiliate +affin33 +affly12345 +afg97643 +afgeralda +afgolf88 +afgpower +afgu1234 +afh16d +afhannah +afhhhyta +afi729 +afielove +afigenai +afitka18 +afjqsfrn +afk1986 +afletgo +afmaxis +afmbs701 +afmr800 +afnan +aforar +afpan123 +afqa123456 +afr3ak1t +afranet +africa +africano2 +afrika +afro +afro2000 +afrodismo +afropuff +afroruby +afs9479 +afsalem +afshin777 +afsiaah2 +afsiebolt +aft117 +aft589 +aftab202 +afterglow2009 +afterlife987 +aftermath62 +aftiyar +afut4172 +afvlc +afwe5123 +afx9 +ag0414 +ag100668 +ag1999sw +ag202506 +ag22ll9z +ag2soiw0 +ag4421 +ag59pa59 +ag6nndoj +ag9092 +ag9338 +aga0104 +aga2566 +aga333 +aga666k +aga763 +aga777 +aga987 +agacior +agadir77 +agadmin1 +agafcis +agaga +again2 +agalloch12 +agam +agamaria +agame1199 +agamemno5 +agamemnon24 +aganau +agando +aganti +agape251 +agarici11 +agasgasg +agasik +agatha +agathe +agathi275 +agato +agb +agbert +agbriner +agcgetc +agcms07 +agcrewe +agde413 +agdg1234 +age48a3r +age610 +age6race +ageless +ageman +agency1 +agenda +agenjo +agent007 +agent007 +agent117 +agent129 +agent616 +agente04 +agentline +agentt11 +ageovsk8 +agerbon +ages +agesci +agesig +agficken +aggie +aggie1221 +aggro1 +aggro19 +aggrober +aggrofan +aggrohbs +agh6r +agharta +aghebate +aghla +aghora0 +agi +agi87ntd +agiko12 +agiler +agim +aging +agiosg +agizas +agjent +agk368 +agk4z +agkmnh62 +agm2006 +agne1997 +agne4x +agnes +agnes +agnes1906 +agnesgoh +agneska +agneslay +agneta +agneta13 +agnieszka +agnieszka1 +agob45 +agogo +agonnoob +agony +agony6 +agordons +agostina +agostino +agp2804 +agpass +agpv6800 +agr10pec +agr2007z +agrandey +agreion2 +agresor1 +agressive +agriklin +agris333 +agriupm +agro20 +agrsnx +agrz +ags123 +ags77170 +agslnm1 +agtzq +aguada74 +aguahua +aguanga +agugu8 +aguila100 +aguinaga +aguitas +agung27 +agungack +aguniaa +agus +agus01 +agusta19 +agustin +agustin +agvipp29 +agy6tr4 +agypten +agzxcvbn +ah0019 +ah0j +ah0j1234 +ah2ah +ah2v2e +ah4 +ah4497 +aha +aha190 +aha24wq4 +ahabib +ahah +ahahah +ahahahaz +ahajb +ahanda +ahapxija +aharon +ahb1g +ahbleza +ahbwd +ahcmjf +ahe7avo +ahe8y +ahead +ahestem +ahgh99 +ahgh999 +ahgman1 +ahgn +ahhhchew +ahhshit +ahhsp +ahiamsup +ahilles +ahimsa123 +ahin2 +ahin2008 +ahjrtkyl +ahk947 +ahlers123 +ahm +ahmad +ahmad +ahmad1002 +ahmad101 +ahmad94 +ahmads +ahmed +ahmed +ahmed12 +ahmed4 +ahmedahm +ahmedasd +ahmedcem +ahmedfox +ahmedmee +ahmedooo +ahmedq +ahmet +ahmet +ahmet11 +ahmet14 +ahmet352 +ahmet397 +ahmet777 +ahmetahmet +ahmetf +ahmetksk +ahmetmacit +ahml9032 +ahmuz5 +ahna +ahnet +ahngiexe +ahnguicr +ahnwwxm +ahoaltin +ahoi +ahoi123 +ahoj +ahoj312 +ahojky +ahojte +ahotyau +ahrar +ahs185 +ahs7285 +ahsgdf +ahsx3399 +ahtkb411 +ahupo +ahwax350 +ai +ai02ugt +ai0588 +ai19bh28 +ai1geren +ai251183 +ai3oc +ai51ai +ai51ai51 +ai7348 +aiardi +aiatin94 +aibb825 +aibo55 +aiboaibo +aic05 +aicirtap +aicpyes +aictpl +aida +aida007 +aida2000 +aida6485 +aida793 +aida97 +aidan +aidan1999 +aidan2112 +aideen +aiden +aidenn22 +aids1234 +aidsina +aienlind +aiess77 +aigil5 +aigle +aiglou +aigner1975 +aihcaihc +aihdffa +aija123 +aika2006 +aikaren +aikhong +aikido +aikido00 +aikido05 +aiknx +aiko +aikon74 +aikonabc +aikuchen +ail0310 +aileen +ailine14 +ailing +ailios +ailton +ailuj +aim +aim8781 +aima +aimbnc +aime +aimee +aimee0506 +aimeel +aimisgay +aimmaroc +aimonjsy +aina +aina2008 +ainara2009 +aingeru +ainhoa +aino +air +air100 +air124 +airair +airball2 +airbase +airborn5 +airboy +airbrush +airbrush101 +airbus +airbus92 +aircore +aircraft +aird2023 +airdroq +airforce +airforce1 +airghost +airgun +airline +airman484 +airmann +aironeairone +airplay +airport +airsoft +airstein +airstein +airtime2 +airycaba +ais78 +aisa1425 +aisapero +aisberg +aischa +aisgdswj +aisha0516 +aisha111 +aisha4189 +aiste16 +aisxhaisxh +aitch +aitch2ay +aitiko +aitor1 +aitoriko +aitpr7ak +aitutaki87 +aiu658 +aiv3lisa +aivani +aivoksi +aivy425 +aiw7z +aiwa1900 +aiwas +aiwprton +aixer1 +aiy8z +aiypwzqp +aizibing +aj1632 +aj4142 +aj4fjtrv +aj4fun +aj553135 +aj75q4 +aj89 +aj905111 +ajah +ajain +ajame53 +ajans33 +ajapa +ajava +ajax07 +ajax2003 +ajaxajax +ajaxxaja +ajay +ajayrajen +ajd1976 +ajdaturk +ajebajeb +ajf22rk +ajfp8 +ajh1977 +ajhnjxrf +ajinka +ajinomoto +ajita +ajj1988 +ajjaajja +ajlmou86 +ajm3424 +ajm911 +ajma6896 +ajmcpu +ajminer +ajna +ajna6105 +ajnevs +ajnjuhfa +ajnor +ajnoskin +ajpd7 +ajr035 +ajrajr +ajroush +ajtj2585 +ajtry6oq +ajwhite3 +ajzx77y2 +ajzych28 +ak0000 +ak020485 +ak0gjsqt +ak101178 +ak1204 +ak1446 +ak159630 +ak2007 +ak2301 +ak2331 +ak23x2k +ak260475 +ak2nps7p +ak47 +ak4711 +ak4711nd +ak475200 +ak4763 +ak47cccp +ak47m4a1 +ak47ownz +ak47tz7 +ak47wooz +ak48923 +ak56Lk +ak580818 +ak5893 +ak6wblt +ak7395 +ak74 +ak74ka +ak753tm +ak8499 +ak93b4 +akJv92_CJ%Ot +aka45391 +aka47 +akaaka +akad860 +akada35 +akademik14 +akak +akamakar +akanate +akaracan +akarap +akari1 +akariuta +akarsu +akasmith +akatjook +akatsuki +akaufi +akay63 +akay6767 +akaziya +akconsol +akcyber +akdd600 +ake +ake3647 +akeka +akele +akemi +akemolo +akg6n +akggy +akgvch +akhakh +akhdan +akhila +akhoundi +aki +aki1028 +aki543 +akibnova +akihein +akihiko +akiki +akiko +akiko1 +akilles +akim +akin +akinakes +akinakin +akinan +akinna18 +akio +akiogs +akipekka +akira +akira2391 +akira99 +akiravic +akiyo +akj8g6d4 +akjagul +akjsk123 +akk93bp +akkie +akkus52 +aklaimas +aklio +akma45 +akmcpqe +akmerkez +aknas +aknolbaj +akoj123 +akok34al +akoren06 +akoska +akosua +akotsio +akpa1953 +akqpt +akrawee +akriline1 +akrobat22 +akrobatik1 +akroma +akroma4me +akromas +aksaray +akselis +aksina +aksiyon +aksrl213 +aksu47 +akswhr00 +aksx1598 +akta2004 +akta2005 +aktas +aktaytay +aktelt +akterra +aktesla +aktorius +aktyx +aku +aku0yay3 +aku911 +akujin +akul +akula11 +akumar +akunovri +akut4you +akware +akwarium10 +akwewi +akwlux +akwsb +akx2514 +akz6810 +al +al1078 +al10ks92 +al11ien4 +al1234 +al1913 +al196578 +al1991 +al199797 +al2003 +al241085 +al291183 +al3542bo +al3anood +al3ubudi +al42 +al68vy19 +al7a1r +al7kbx +al84 +al8re6 +al98nd +ala +ala111 +ala123 +alaa +alaaweb +alabala +alacon +aladin72 +alafol00 +alain +alain +alain david +alain120 +alaina +alaina98 +alajmi23 +alakazam05 +alalaka +alalla +alaloo +alalzagi +alam +alameda +alami +alami01 +alamiah +alamides +alamrya +alan +alan +alan dinehart +alan1066 +alan123 +alan1234 +alan1876 +alan1987 +alan2406 +alan4365 +alan7191 +alana +alana04 +alana0522 +alanada +alanalan +alanann +alanaspa +alanek +alania +alanis +alanis12345 +alanna1 +alanoc4 +alantam +alanya +alar +alarabi +alaric +alarm +alarme +alasdairs2 +alask4 +alaska +alaska+1 +alaska300 +alasta1r +alastair +alastair1903 +alastor +alatika +alaudin +alb37y +alba +albacrew +albagirl +albahack +albana +albane +albany2011 +albast0407 +albator +albatro5 +albatron +albdr +albe2007 +albea +alberik +albert +albert +albert06 +albert1 +albert45 +albert475 +alberta +alberthufeisen +albertina +albertine +albertino +alberto +alberto +albertru +albertvg +albex +albeyaz2 +albie +albin +albino +albion2468 +alboran +albpower +albrecht +albrecht1 +albright +albrota0 +albumweb +albundy +alby137 +alc00l +alc181ad3s +alcaklar +alcapone +alcata +alcate +alcatel +alceo +alchemizer +alchi5 +alcolo +alcs898 +alda +aldatz +aldee123 +alden +alden12b +alder12 +alderia +aldershot27 +aldershot87 +aldi +aldibasi +aldin7 +aldina99 +aldine +aldis +aldjfhg +aldo +aldo +aldo bufi +aldo121 +aldo1304 +aldo1990 +aldoanna +aldolfo +aldrich +ale$10ghi +ale0221 +ale1305 +ale22mame +ale78dro +alea2009 +alec +alec006 +alec0205 +alecos +aleelv +alef1990 +aleghigo +aleid01 +aleisgood +aleister +alejandra234 +alejandro +alejandro +alejandro14 +alejo +alejomora +alekia +aleks +aleksa10 +aleksandar +aleksander +aleksej +aleksi9221 +alelaiwi +alelilo +alelolol +aleluja1 +aleman7481 +alemci +alemdar +aleminco +alen +alen13 +alen2014 +alen6558 +alena +alenio +alenok +alensex +aler38he +alericki +alernon6107 +alert534 +alerta89 +alesacek +alesamy +alesbo +alesek +alesha +alesia** +alesig63 +alessa +alessandra +alessandra +alessandro +alessia +alessio +aleste242 +alesund +aletha +aletheia +alethia420 +alev2006 +alev234 +alex +alex +alex01 +alex0103 +alex0123 +alex0208 +alex0480 +alex06 +alex0781 +alex0818 +alex0852 +alex1000 +alex11 +alex1148 +alex12 +alex123 +alex1234 +alex1294 +alex1342 +alex14 +alex1610 +alex1673 +alex1689 +alex1701 +alex1713 +alex177n +alex1900 +alex1979 +alex1991 +alex1992 +alex1993 +alex2005 +alex2006 +alex21 +alex2173 +alex2184 +alex219 +alex2290 +alex2312 +alex2412 +alex2539 +alex2901 +alex2k +alex3009 +alex3564 +alex4774 +alex5363 +alex54 +alex66 +alex7553 +alex84 +alex88 +alex8815 +alex89 +alex90 +alex99 +alex99fb +alex@nder +alexa +alexa001 +alexa100 +alexa1501 +alexa209 +alexakis1 +alexalex +alexande +alexander +alexander +alexander fu +alexander171 +alexander747 +alexandi +alexandra +alexandra +alexandra106 +alexandra1199 +alexandre +alexandre +alexandria +alexandros8 +alexandru +alexandru +alexandru123 +alexane +alexasd +alexatoi +alexator +alexatos +alexb002 +alexbbbb +alexbibi +alexbobo +alexboy1 +alexbrea +alexbueno +alexbyte +alexchala +alexde +alexei +alexeyev +alexguru +alexhowe +alexia +alexia +alexiel +alexiia +alexik1 +alexis +alexis +alexis42 +alexissa +alexix +alexjia +alexjr +alexk2710 +alexkid +alexkoch +alexlol +alexmetrik +alexmt +alexnt1 +alexnya +alexpz +alexray +alexsaez +alexso +alexu1 +alexutzu +alexx +alexxela +alexxx +alexys +alezlom +alf +alf +alf3884 +alf727 +alf7431 +alfa100 +alfa145 +alfa1711 +alfa1807 +alfa1999 +alfa23 +alfa51 +alfa6alfa +alfa90 +alfa99 +alfabeta +alfador +alfalfa +alfano +alfasvet +alfaz +alfermp +alfie +alfie +alfieboy12345 +alfiero +alfieson +alfine +alfio +alfonsito86 +alfonso +alfonso +alfonso16 +alform +alfrd +alfre +alfred +alfred +alfred71 +alfredas +alfredo +alfredo +alfrocky +alg0alg0 +algarve01 +algasx1 +algerie +algiusrc +algo +algo77 +algozone +algren +alh1080 +alhacker +alhafiz +alhambra +alhamoor +alho4567 +alhuile +alhussaini +ali +ali +ali ben +ali dede +ali111 +ali123 +ali1349 +ali1353 +ali1386 +ali157 +ali1975 +ali1988 +ali2000 +ali2004 +ali333 +ali786 +ali99 +alia +aliaalia +aliabd +aliak47 +aliakh +aliakin +aliakova +aliali +aliali6 +alianna11 +alias +aliaslana +aliata +aliaweb +alibaba +alibabali +alibra23 +alican +alicans +alice +alice +alice colombo +alice duer +alice mildred +alice02 +alicej +alicelam +alicia +alicia +alicia16 +aliciarobby +alicja01 +alicja1 +alicja1 +alida +alie9900 +alien +alien007 +alien06 +alien4 +aliena77 +aliens +aliens22 +aliens49 +alienware +alieslam +alifair +alifakih +alig +alig8or +aligider +aligokoz +aligur +alihot6 +aliinal +alika12345 +aliki +aliko +alikovo +alilucy +alimenti53 +alimpije912 +alin +alin1975 +alina +alina +alina1 +alinafin +alinahensel +alinalin +alinariva +aline +aline2502 +alineco +alinedes +alinghi +alinutza555 +alionka +alioop +aliortac +alipc1 +alireza +alis1212 +alisa789 +alisanils +alisatim +alisha +alisice +alison +alison +alissa +alissa +alissak1 +alissax3 +alistair +alistair +alive777 +alived +aliveli +alix +alix125 +alixalix +alixalman +aliya +aliyahoo +aliyem +aliza +alizabeth +alizee +alizex +aljava +aljwl +alka +alkaline +alkan +alkan56 +alkannas +alkatraz13 +alkhatib +alkias2 +alkjt73w +all +all0toi +all4free +all4me +alla +allabama +alladdin +alladile +allah001 +allahallah +allahome +allall +allamo +allan +allan rocky +allan ross +allan123 +allan6303 +allandra +allauch +allaweil +allazar +allbury12 +alldumm +alle90 +alleen +allegra +allegra09 +allegro +allegrosik +allen +allen +allen goorwitz +allene +allens +allensue +allentel +allepac +aller +alleria +allerlom +alles +allesha +allesneu +allets1234 +allezlom +allfirmware +allforone +alliance +allianz +allianz01 +allie +allied +allii +allimon +allirocks +allison +allla +alllinna +allmighty98 +allnuts +allo +allomani +allonby +allora101 +alloux +allow1996 +allowme +alloyou +allrad +allroad +allround2 +allround2007 +allroy84 +allsop32 +allsoppy +allstar7 +allstar89 +alltt4l +allwa +allway82 +allwelsh +ally +allyn +allyn ann +allyson +allyssa88 +allzeit1! +alm10569 +alm699fr +alma +alma +alma delia +alma rose +alma01 +alma96 +alma9974 +almada69 +almaearl +almafa +almaguer8 +almaisg8 +almalm +almanako132 +almandos +almangal +almansa +almata +almazs +almega4453 +almegida +almera2000 +almera76 +almeria2009 +almf1984 +almhmad +almick +alminares2 +almira +almobde3 +almogtt +almoj +almonds +almory +almos +almqvist4 +almut +almz45t +alnica72 +alnoerno +alocin94 +aloelife +aloftweb +aloha +aloha5150 +aloha88 +alohaa +alohahe +alok +aloka +alol43 +alom3453 +alomru +alon035 +alon05 +alon06 +alona +alone1717 +alonenot +alongtimeago +alonmaoz +alons5 +alonso +alonzo +aloris +alotaibi +alow3456 +alowe +alpakax +alpcom +alpenhof +alper123 +alperen +alpha +alpha001 +alpha01 +alpha1 +alpha1020 +alpha123 +alpha12d +alpha13 +alpha13p +alpha21 +alpha38 +alpha454 +alpha5217 +alpha6 +alpha74 +alpha90 +alphaandomega +alphab3t +alphabbo +alphabets +alphaone +alphapsi +alphasem +alphawe +alphax879 +alphonce1 +alphonse +alphonso +alphonz +alpi0311 +alpina +alpine +alpine7873 +alpisim +alpputin +alptech +alptekin +alpy33 +alq14455 +alqarni +alqarni3 +alr4d5kk +alr6u7 +alrededor +alri4eva +alrick +alrighty +alrik +alsafe +alsaher +alsecrop +alsemo +alshogby +alsk1029 +alsk27wo +alskdjfh +alskling +also0141 +also1782 +alspal +alsrud1 +alsto25 +alston +alt2600 +alta +alta2305 +altaboy +altaca +altair +altair2123 +altair68 +altalhia +altamont +altan +altarr08 +altas +altaterra +altavista +altay007 +altayx11 +altceva +altec +altec1230 +altena10 +alter +alterac +alteradel +alternate +alterra5933 +alters1 +althor1 +altie1983 +altimex +altius34 +altmann1 +altn8r +alto11p +alto8890 +altogumi +alton324 +altovice +altovise +alts1278 +altug123 +altum22 +altun +alu1721 +alu7gr3d +aluadmin +alubias +alucard +alucard1 +alucardo2 +aluche +aluluvsh +alun +alundra +alunix +alura123 +alus +alv45678 +alva5n +alvagorn +alvalade1 +alvarez lisa +alvaro +alvaro98 +alvarova +alve30 +alvetro +alvin +alvine2005 +alvino +alvino ray +alvs7802 +alvy +alwa7che +alwafi6 +alwatan +always +alwaysii +alwaysl8 +alwin +alwina309 +alwy +alwyn +alx6969 +alxam +alxlyon +alxndria +alxp2nex +aly8sia +alyaman +alyks +alyn +alyque +alyson +alyssa +alyssa +alyssa1219 +alyssa5 +alzen +am +am01881 +am0707 +am0lad +am112 +am1225 +am14fa09 +am15cv3 +am160761 +am161197 +am1808 +am190197 +am1am +am210880 +am220706 +am251079 +am3310 +am5mf +am681209 +ama4 +amabc +amad1974 +amadeo +amadeo00 +amadeo1511 +amadeus +amadeus1 +amadeus274 +amadex +amadex29 +amadis +amador +amagad92 +amagadxd +amalegk +amalfi156 +amalgamation33 +amalia +amalia +amalie2606 +amalio +amalula +amamarla +amanaman +amanda +amanda +amanda jane +amanda1120 +amanda13 +amanda23 +amandasr +amandrilada +amanecte +amans +amany +amanyes +amapola del +amar +amar01 +amar1ma +amar2012 +amare1 +amarillo +amarlife +amarok01 +amaroq18 +amarsch1 +amasa04 +amashama +amato +amator +amator2 +amax0000 +amaxdx1k +amay +amaz +amaza +amazina +amazok63 +amazon243 +amazonas4712 +amazone +amazone47 +amazonit0736 +amb1g1ous +amb3rlin +ambaj7 +ambang +ambassadors +amber +amber0055 +amber123 +amber14 +amber155 +amber2 +amber21 +amber460 +amber69 +amberr77 +ambh1982 +ambiguus +ambitious +ambloo4 +amboku +ambrepeu +ambrine +ambrose +ambrosia +ambrosine +ambrosio1 +ambrozik +amcik +amd1700 +amd233 +amd2500 +amdi1864 +amdo6963 +amdrules +amdrulz +amdsucks +ame1234 +ame7ash +ame810 +ameadb +amecspie +amed2005 +amedazad +amedeo +amedli +amedmush +ameemeg +ameer +ameerco +ameise2 +amejamej +amel +amelia +amelia +amelia dela +amelia17 +ameliaj +amelias +amelie +amelin +amelita +amenay +amenige +ameninaq +amenna +america +america1 +america11 +america420 +american +americana +americaneagle +americano3 +amerigo +amerika +amerika007 +ameron99 +amers1 +amesfan +ametimor +ameur195 +amfarg +amfi8eas +amfj9798 +amg12387 +amg131 +amgodamgod +amh0159 +amhzajax +amhzuluk +ami +ami2705 +ami4179 +amiami +amibios +amicitia2 +amid +amidamary +amiejeff +amievil +amig0owe +amiga +amiga1 +amiga500 +amiga666 +amiganut +amigas +amigo1 +amiitae +amilas +amilo +amilworm +amin +amin123 +amin5195 +amina +amina73 +amine +aminoss +aminta +amir +amir452 +amir765 +amir9 +amira +amira +amira1 +amiralen1 +amiramir +amirc123 +amireal +amiris +amirmustafa +amirnir +amirpass +amis005 +amisamis +amisan1 +amish7799 +amisk1303 +amistad +amistosa07 +amit1980 +amit2234 +amit99 +amitabh +amitb +amitech +amitech321 +amix +amizzi +amjad420 +amjb176m +amjika +amkamk +amkgtn +amlash1 +amletto +amlien368 +amllive +amlprok7 +amm325 +amma +amma101 +ammalftm +amman1969 +ammar +ammar456 +ammelie +ammer1808 +ammidhc +ammivr +amnclub +amnesia +amnesiac +amnesis +amnhac +amnon +amo1 +amoG +amod1sws +amoippai +amoki +amoldo +amolld7 +amon1986 +amoni77r +amor +amor2004 +amor247l +amor77 +amore +amoremio +amoren1 +amoroso +amoroso9 +amos2003 +amouee +amour +amour07 +amouss +amoxana +amp483 +amp64 +ampamp713 +amparo +amparo soler +amparo66 +ampha +amplified23 +ampmok04 +ampolla +ampster +amptron1 +amr469 +amram120 +amre1234 +amren001 +amrish +amro1971 +amroamro +amron87 +amrrifky +ams1218 +ams1999 +amsakis +amse +amsedeus +amsoil08 +amspille +amstaff1 +amstaff28 +amstel70 +amsterdam +amstrad. +amt24477 +amtren +amu123 +amuerte +amuk +amukun77 +amuleyka +amuuamuu +amvn003 +amw1983 +amway1 +amwg8 +amy +amy +amy123 +amy337 +amy9594 +amya2692 +amyrocks +amza +amzie +an0985 +an0nsux +an1004 +an142523 +an1946zu +an2000 +an3ast3r +an3mos +an4oes +an5050 +an5601 +an5thony +an86ki +an8wzzzc +ana +ana bertha +ana luisa +ana maria +ana marie +ana yrsa +ana00007 +ana0007 +ana2001x +ana770 +anaama +anaana +anaana11 +anabdhou +anabel +anabel04 +anabel101 +anac0nda +anac6 +anacarla +anaconda +anaconda9865 +anacool +anady0m3n3 +anahi +anahita1977 +anaik +anais2007 +anakabah +anakid98 +anakin +anakin1984 +anakin23 +anakin83 +anakon17 +anakrus +anakshop +anal +anal66 +analchef +analerotic +analfabeta +analgeburt +analhaare +analhenker +anali18 +analia +analiz +analnie +analog +analog56 +analsex +analuque +analyzer +anamari +anamaria +anamata +anamez +anamia1337 +anan +anan1989 +ananas +ananghd +ananoki +anarboy +anarc0ma +anarch13 +anarchie +anarchism86 +anarchy +anarchy2012 +anarchy23 +anarchy321 +anarkia17 +anas321 +anasayfa +anasazi +anase +anasmk +anasofia121 +anastas +anastasia +anastasija +anastazja22 +anathema +anathema21 +anatoli +anatoli +anatoly +anatomy +anatority +anatrem +anauam +anav +anava123 +anawebas +anaya143 +anayury +anazat4 +anca770 +ancafeo +ancalima +anchdan +anchoa85 +anchor04 +ancientsite +ancilla +anco1708 +ancona38 +ancu +ancuteo +and +and71 +and? +andale +andalite +andante23 +andda99 +andebol +andechs +andeh +anderm +anders +anders +anders33 +andersen6 +andersen85 +andersn +anderson +andersson2 +andersson345 +andethen +andi +andi +andi0707 +andi1121 +andi1208 +andi1683 +andi1968 +andi1988 +andi2006 +andi501 +andie +andinja +andire00 +andone111 +andonia +andor +andorra +andover +andr0m1da +andr3a +andra +andrade +andraku +andras +andre +andre +andre van den +andre1 +andre123 +andre2221 +andre2501 +andre2548 +andre3174 +andre321 +andre4130 +andre6525 +andre67 +andre76 +andrea +andrea +andrea0104 +andrea06 +andrea08 +andrea12 +andrea5000 +andrea6728 +andreaj4 +andreas +andreas +andreas3605 +andreas98 +andreas99 +andreask1 +andreb1802 +andrebeier +andree +andreea +andref +andreg2 +andrei +andrei +andrei1 +andrei27 +andreia +andreina +andreix +andreju +andrel +andrenam +andrerrs +andres +andres +andres01 +andres10 +andres3409 +andreser +andresq +andreus +andrew +andrew +andrew gordon +andrew louis +andrew scott +andrew012 +andrew9111 +andrewg +andrewj +andrewk +andrewro +andrews +andrey +andrian +andriano123 +andrias8 +andrienne +andrija2244 +andrillo +andrioke +andrius +andriuss +andriy +android +andromache +andromeda +andromeda234 +andromeda7 +andronia +andronic +androo +androsov +andrzej +andrzej12 +andrzej1988 +andrzej1989 +andrzej2 +andrzej5504 +andrzej69 +andrzej@ +andwefallin +andy +andy +andy01 +andy02 +andy0406 +andy0730 +andy0747 +andy1010 +andy1024 +andy1998 +andy2004 +andy2345 +andy2a +andy3140 +andy5858 +andy74 +andyandy +andykin +andylo +andym +andyman +andymoo +andypace +andys +andysann +andyud +andyyy82 +andzia1 +ane +anecka +aneczka +aneczka123 +aneerbas +anej2005 +anel84 +anelia99 +aneliese +anelise1 +anelka +anelka39 +anello87 +anemario +anemiaaa +anemoi13 +anemone +anerinho +aneshawy +aneta +aneta1 +aneta13 +aneta85 +anetoz +anette +anette +anette2504 +aneubauer +anew943 +anewjob +anewlove +anexis +anexxus +anezid04 +anfam3 +anfang +anfin150 +anfisa +anflo123 +anfscd97 +ang125 +ang1684 +ang310v3 +ang8me9 +angband1 +ange0810 +ange6la +angeja54 +angel +angel +angel1 +angel123 +angel13 +angel18 +angel365 +angel4e +angel555 +angel6 +angel676 +angel718 +angel813 +angel99 +angela +angela +angela punch +angela14 +angela3012 +angelas +angelca +angele +angeles +angelic +angelica +angelical +angelika +angelika +angelillo +angelina +angelina +angelina7 +angelino +angelique +angelita +angelito +angelito +angelmen +angelo +angelo +angelo07 +angelofdeath +angelone +angelov3 +angels +angelsro +angeltje100 +angeluka +angelus +angelus999 +angelwater87 +angelwings +angelyn +angergmbh +angharad +anghel +angi451 +angiangi +angie +angie12 +angie555 +angie8908 +angiet +angkorwat +angle +angolar +angry +angry1 +angryman +anguelos +angus +angus +angus007 +angus607 +angusbcr +angwanp1 +anh303d3 +anha1961 +anhdinh +anhhieu +anhhuy +anhieu +anhlayem +anhsieu +anhthang +anhtuan +anhvaem +anhviet +anhyeu +anhyeuem +ani +ani2wne +ani563 +ani5land +ani9male +ania1085 +ania1973 +ania2202 +aniaania +aniabl +anibal +anibus! +aniceday +anicee +anicet +anidiot +aniello +anigerte +anikata +anikin +anikun +anil +anil +anil04 +anil123 +anile +anilorak6 +anim80r +anima +animal +animal75 +animalitos +animalov +animalu +animania +animation +animation90 +animatore +anime0915 +anime1211 +anime1313 +anime5 +anime666 +animeman +animeroox +animess +animus74 +animyst +anin +aningsky +aniol +aniol92 +anioleczek4 +aniolek1 +aniram +aniratak1 +anirbas1 +anirimi +aniroc121 +anis +anis2006 +anisaselma +anissa1011 +anisso +anita +anita +anita12 +anita2706 +anita91 +anita956 +anitaa +anitad85 +anital +anitalein +anitavon +anitche +anitech +aniureru +anivier* +aniyfirt +anja +anja +anja-christine +anja123 +anja1973 +anja88 +anja98 +anjaanna +anjab410 +anjamanja +anjamarek +anjamaus +anjanette +anjao2 +anjastefi +anjeanje +anjelica +anjieyzz +anjing +anjofixx +anjoukeh +ank van der +ank5p +anka +anka123 +anka158 +ankada +ankara +ankara01 +ankatrin +ankavuz +anke08 +anke1966 +anke1988 +anke5627 +anke74 +ankedh +anker145 +ankesh1 +ankeveen +ankhsonja +anki1234 +ankimaus +anking005 +ankmi +ankoe96c +ankornas123 +ankou77 +ankriavi +ankuc +anmar +anmar999 +anmp8p2y +anmwdb1 +ann +ann del +ann-mari +ann-mari max +ann-marie +ann1krit +anna +anna +anna lisa +anna lynn +anna mae +anna maria +anna marie +anna may +anna stina +anna-katerina +anna-maria +anna1113 +anna1316 +anna2003 +anna2006 +anna2407 +anna4228 +annaSH +annabel +annabelj +annabell22 +annabelle +annabelle328 +annabeth +annabuch +annachri +annaebba +annaego +annaik +annailse +annakarena +annako +annalars +annalena +annalie +annalisa +annam. +annamaria +annamerle +annamom +annasina +annazette +annazorro +anne +anne +anne gisel +anne gisele +anne louise +anne marie +anne tucker +anne-cath +anne-claude +anne-else +anne-lise +anne-marie +anne-severine +anne0001 +anne1981 +annecim +annedore +annekathrin +annekatrin +anneke99 +annelein +annelies +anneliese +anneliis +annelise +annellau1 +annemarie +annemarie112 +annemarijn +annep81 +annepuu +annesha56 +annete17 +annett +annett66 +annette +annette +annette12 +annette1403 +annevanburen +annex1945 +anni +anni0877 +anni2202 +anni29 +annibal +annica84 +annick +annick09 +annie +annie birgit +annie joe +annie316 +annie79 +annik +annika +annika +annika15 +annika92 +annina +annissa123 +annita +annkarin1 +annmount +anno +anno100 +anno1999 +anno99 +annona +annouk11 +annubis +annuity08 +annwes +anny +anob1um +anoingas +anolis +anomali1 +anon123 +anonimka +anonimo +anonym +anonyme +anonymous +anopeit +anorth +anos1411 +another1 +anouk +anouk2892 +anour +anox2005 +anp3250 +anpova1 +anqr4b +ans2811 +ansei +anselmo +ansema +anseo384 +ansett +ansgar +anson weeks +ansoz +anstoss +anstoss3 +anstossmaster +answer1216 +answer21 +answerv3 +ant0ine11 +ant123 +ant1979 +ant5937 +ant77p33 +anta1984 +anta30 +antagon1 +antagonist +antal +antalya +antani +antarctica123 +antares64 +antarion +antarm0 +antbanx1 +antbob +ante1452 +antec01 +antena1 +anterak +antergy +anteus +anthemrules +antheus +anthills55 +anthoantho +anthology +anthony +anthony +anthony pullen +anthony-james +anthony1 +anthony3802 +anthony627 +anthony7 +anthrax8218 +anti2to +antibot +antiboys +antichat +antichrist +anticona +antidos2 +antidoto +antifa +antifa69 +antiflo +antigone +antiguos +antihack +antiintel +antiloope +antilop9849 +antilope7 +antimu43 +antiquing +antirats +antiscam +antivirus +antje +antje +antje000 +antje2212 +antjebine +antlions52 +anto15 +anto26 +antoine +antoine6302 +antoinette +antoks +antolec1 +anton +anton +anton123 +anton389 +anton3952 +anton4 +anton5255 +anton8001 +anton99999 +antonain +antonanton +antonella +antonella +antonello82 +antoni +antonia +antonia +antonin +antonina +antonino +antonio +antonio +antonis +antonita +antonn +antony +antony +antoon30 +antorella1 +antoroby +antpub +antrax +antro5 +antti +antti92 +antuan58 +antwerp29 +antyair +anu0b +anubis +anubis.1 +anubis1012 +anubis2112 +anubis32 +anubis680 +anubisslowpoke +anudora +anugerah +anula +anulka1 +anulu +anusia2005 +anviler +anwar +anx +anx910 +anxyus +any1234 +any12ong +any1469 +any2405 +anya +anya scher +anyangcw +anyflo +anykey01 +anymedia +anyone! +anysia +anything +anything16 +anzac +anzai +ao4brmwp +ao9s9e8i +aocmenuz +aodbamf +aoh +aoi +aoi1234 +aoi133 +aoiqe8k5 +aoitsuki +aok4073 +aokswl3e +aol +aol123 +aol2001 +aol20x +aol8207 +aolarena +aolishit +aolman +aolmerde +aolsux +aomnocd +aomstar +aomv1r +aonrk +aoocl +aoom4awq +aoqkky6z +aoqokz8 +aotterra +aoty1234 +aoxri +aoy06ua2 +ap101996 +ap12AP +ap1986 +ap38vz +ap3jjnp6 +ap3zatrj +ap55v4ze +ap700jj +ap73wn +ap81360 +ap8j7h +apa +apac9026 +apacabar +apache +apache11 +apache248 +apakah? +apakor11 +apan2019 +apanapa1 +apap1972 +apapap +aparagaf +aparicio123 +aparna +aparna das +apasih +apass +apatin22 +apau2004 +apcc66vj +apcs1522 +apd +apdullah +apearl1 +apeksux +apelsin +apendix +aper6587 +aperitiff +apero51 +apeshit90 +apeu9 +apex +apex2412 +apfc32 +apfe12 +apfel +apfel1964 +apfel288 +apfel2ge +apfelmus1 +apfelsaft7 +apfelstrudel1 +aphex7 +aphextwin +aphro1212 +aphto +apina +apina69 +apis123 +apj5m +apk +aplaton +apleigh +aplication2 +aplsos +aplwgqga +apnads +apo +apocalypse +apofis +apogrifo +apolda +apollo +apollo12 +apollo13 +apollon +apollonia +apolo1987 +apolon +aporn +apostasy +apostel12 +apostolos +apostrof +app4o +appd0666 +appel +appelkoek +appelmoes001 +appeltaart +appeltje12 +appiah8 +appip79 +appl3pi3 +apple +apple juice +apple123 +apple13 +apple3g +apple435 +apple44 +apple64 +apple904 +apple98 +apple99 +applebee5 +applebye +applecore6789 +appleh +applehouse46 +applepie +applered +apples +apples6 +appleseed +appletree +applied29 +apply +appointment04 +appollo5 +approach +appserver +appxdl +appypie +apq789 +apr001 +apr2305 +aprawks +apri1234 +april +april09 +april1477 +april2088 +april2501 +april29 +april4 +april6 +april76 +aprilia +aprilia1 +aprilia41 +aprilia4711 +apriliaclassic +aprill +aprilm +aprilmay +apropos19 +aps123 +aps2312 +apsaps +apsmm +aptech4u +apucika +apupsiks +apv0n +apv73b3h +apvl89sx +apvp6x4w +apwn25az +apx09 +apxking +apzoei +aq +aq1111 +aq12ws +aq190591 +aq62PX +aq7f4vyo +aqaqaq +aqgmjd +aqhh8aam +aqjyz +aqkxjj7t +aqo2a +aqo2x +aqp5MKTo +aqq +aqqaqq +aqr001 +aqsenin +aqswde123456 +aqt5x2 +aqu1le1a +aqua0302 +aquaadm +aquaball +aquaolos +aquarius +aquasun2 +aquenop +aquila +aquila289 +aquila311 +aquiladkp +aquiles +aquilla +aquino +aquoua +aquz +aqva677 +aqw15975 +aqw741 +aqwaqw +aqwerfds +aqwerty491 +aqwpmn +aqwsez +aqwxsz +aqwzs +aqwzsx +aqxaqxaqx +aqyb82 +aqza13 +aqzsed +aqzwergi +ar021284 +ar0406 +ar052945 +ar06depf +ar08sb07 +ar101590 +ar107 +ar11al +ar12345 +ar2000 +ar234423 +ar24ch +ar2an4da +ar311099 +ar3653 +ar3bfa +ar540 +ar5k1c +ar6670ad +ar70al78 +ar8697 +ar897y +ar95400 +ara01kbs +ara1000 +ara4545 +ara51 +arab2a1 +araba +arabarab +arabas +arabica7 +arac +aracarm +araceli +aracne1 +aracno +arad0987 +aradi +aradia1975 +aradia666 +aradika +arag0n +aragorn +aragorn100 +aragorn2008 +aragorn300 +aragri +aram +aram +aram1nta +arama +aramam86 +aramante +aramas14 +aramens +aramis +aran70 +aranbaba +arandela55 +aranita2 +aranka89 +arankar +arantxa +aranwen +aranya +aranykut +araon4o +aras33 +arash +arat43 +aratanka +aratoz +arb2007 +arbeit +arbeit05 +arbeitsmarkt50 +arbol +arc +arc01 +arc9zha +arcadia +arcadia77 +arcandia +arcane12 +arcangel +arcanoid +arcasin +arcastar +arcatest +arcaton +arceus16 +arch +arch1234 +arch1ve +arch4 +archanarohit +archangel +archangel77 +archangel88 +archangell1990 +archarons +archdruid3 +archer +archer +archerx1 +archesss +archibald +archie +archie savage +archieC +archieterra +archimedes1 +archives +archmage20 +arcibbs +arclam +arco2000 +arco4713 +arcobaleno +arcozelo +arcticarvid +arczip +arda +arda8242 +ardathh +arde +ardeche +ardeczlc +ardell +ardesign +ardiani +ardianos +ardil +ardnaxela1 +ardy +area2000 +area2005 +area2721 +area51 +area5151 +area51alx +area606 +arecife +areczka +aredlein +areffes +aregons +areille +arek54321 +arekpap +arely323 +aremac4 +aremarem +aren5586 +arena9x +arenal69 +arenques +areostar +arequipe123 +arere123 +ares00 +ares12 +ares1327 +aresa1838 +aresares +aresone +aret14 +arete1966 +areti1 +aretusa +areva25 +arewal +arex +arezoo +arf2009! +arg +argen27 +argenteu +argenti +argentia +argentina +argentina +argentina91 +argentini +argento +argentum23 +argi1957 +argiris8 +argive +argo11 +argo1234 +argo36 +argotess +argro123 +arham816 +ari0828 +ari11483 +ari1819 +ari1umij +ari30839 +ari4fifi +aria +ariaddna +ariadna +ariadne +arianda +arianna +arianthe +ariari +aribert +aridad +arie +arieh +ariel +ariel +ariel5205 +ariela +arielariel +arielb +arielethan +arielle +arielsaa +aries +aries123 +arif +arigatou3 +arijana +arik +arikxx +arimany9 +arimathea +arina +arinza +arirang +aririri +aris +aris +aris2002 +arish +arisha +aristes77 +ariston11 +ariva +arivasan +arizona +arizona2 +arjona +arjonilla2007 +arjun1306 +arjun890 +arjun8a +arjwxlgo +ark345 +ark645 +arkadiusz +arkadiusz1 +arkadiusz3 +arkan315 +arkange +arkhen +arkie +arkii007 +arkilus +arko123456 +arkom033 +arkonastr +arkos1 +arkp226 +arktis +arktos321 +arla868 +arleen +arleigh1 +arlen +arlene +arleod66 +arletta1 +arlette +arleysue +arliarli +arlind95 +arlindd +arline +arlinest3 +arlirau +arliss +arlo +arlry +arm0mag1 +arm1dale1 +arma1234 +armaan +armada +armadas +armadillos +armadon9 +armageddon +armagedon +armand +armand curly +armand$1 +armande +armando +armands48 +armanini +armas +armchair +armeaftp +armed +armeedt +armelia +armelle +armen0711 +armeni +armerbruno +armi +armia247 +armijn18 +armin +armin +armina1985 +arminkaric +armit +armitage +armless1 +armorique12 +armoteam +armstrong +army +army1012 +army1043 +army1521 +army8922 +armyhaff +arn123 +arn5n +arna-maria +arnad +arnaldo +arnaud +arnaud34 +arne +arnearne1 +arnella +arnfried +arni +arnica06 +arnie +arnim +arnitis +arno +arno481 +arnoarno +arnoelch +arnold +arnold +arnold4552 +arnoldo +arnoldo +arnophil +arnorolf +arnoschw +arnost +arnovdk +arnsberg +arny +arod3030 +aroha1968 +aroiodui +aroldo +aron +aron +aron123 +aronbaer +aronvanes +aropagoi +aros +aros71 +arosatos +arosenb1 +around# +arp2006 +arpad +arpegio69 +arphee +arpias1 +arpita. +arpm77 +arpus1990 +arqrm +arqui3 +arr +arra77 +arrabida +arrakis +arras +arrasando1 +arreat22 +arreis88 +arrin +arriola833 +arriyanti +arrouwad +arroyito +arrs +arruda +ars2100 +arsch +arsch001 +arsch1 +arsch1337 +arsch2k +arsch3 +arsch5000 +arsch74 +arschi +arschie +arschloch +arschloch. +arschloch2068 +arsearse +arsenal +arsenal1 +arsenali +arsenia2 +arses08 +arsham +arsinoi +arsitek +arslan +arslonga +arsten +art +art +art15ok +art1957 +art3003 +art38 +art525p +art525s +art525t +art926 +artIus +artagon +artamis123 +artani +artauf +artazzi +artc1ass +artcom77 +arte +arte1a5 +arte2002 +artecona +artefact +artefakt +artegrp +artema +artemiz +arten +artesia +artharon +arthas411 +arthur +arthur edmund +arthur11 +arthurc +arthurdollar +arti2003 +arti78 +artic +artico8 +articolo +artie +artie shaw +artifact +artifact3 +artificial +artimodes +artin333 +artinmal +artisan +artisart +artist +artist +artistic3946 +artix64 +artleader +artlescs +artlib +artmoney13 +artos1996 +artosek +artreef +artschuh +artschuhe +artsfist +arttopic +artur +artur +artur1998 +artur3k +artur72 +arturek9 +arturo +arturo +arturo garcia +arturro0 +artw0rk +artwork +arty +artyom +aruba +arukas2 +arum +arumku +arunas +aruth +aruvep +arv1d +arvelo10 +arvenen1 +arvid +arvid +arvinzz +arvpley0 +arwen +arwen +arwist +arx7b48x +arxak3p +aryanaryan +aryavrat +arye +aryil98 +arzte +arzudtx +arzy7297 +as +as051198 +as0985ll +as100476 +as11196 +as1122 +as122005 +as123 +as1234 +as123456 +as123as +as12d3 +as12df +as12qw +as131087 +as1346 +as151684 +as1qj41 +as2006 +as21sa +as2586jr +as2718 +as317463 +as34df +as34rty +as3bdqjr +as3s6r74 +as4218 +as42686028 +as45nk09 +as4nkev +as5350ps +as554215 +as55dfc +as567kl +as7ab +as8557as +as862480 +as8995 +as9527 +asCER23 +asDfGh +asa +asa123 +asaasa +asaasa09 +asabuku4 +asad1951 +asadmin +asaf +asaf2202 +asafad50 +asakura335 +asakuraa +asal29 +asalet +asandir +asas +asas1 +asas9632 +asasas +asasas1 +asasas12 +asasas13 +asasd +asassin6 +asatru14 +asbak01 +asbalke +asbf1912 +asbirim +asc1193 +ascadian +ascalon2 +ascanio +asccascc +asccc1 +ascfajfc +aschenbecher +ascher214 +aschkopp +aschoff +asciano78 +asco22 +ascolon1 +ascona +ascona89 +asconab +ascosam2 +ascott23 +ascxx +asd +asd1 +asd123 +asd12369 +asd13 +asd1414 +asd14pl +asd2221 +asd2243 +asd22asd +asd2574 +asd321 +asd321qw +asd456 +asd56fg1 +asd666 +asd678l +asd7091 +asd987 +asdEE +asdN +asda +asda11 +asdaaja +asdas +asdas123 +asdasd +asdasd1 +asdasd22 +asdasd32 +asdasd89 +asdasda +asdasdas +asdcoco +asdcxz +asdd23 +asddsa +asddsa12 +asddsa56 +asdecar +asded2 +asdef138 +asdel271 +asdert +asdewq +asdewq1 +asdf +asdf02 +asdf0716 +asdf0914 +asdf10 +asdf1127 +asdf12 +asdf1212 +asdf123 +asdf1234 +asdf1337 +asdf1415 +asdf1479 +asdf2 +asdf2000 +asdf408 +asdf5213 +asdf552 +asdf56 +asdf59p0 +asdfas +asdfasdf +asdfasdf1 +asdfasdfasdf +asdfer +asdferer +asdfes +asdffa +asdffd1 +asdffdsa +asdffg55 +asdfg +asdfg11h +asdfg123 +asdfg321 +asdfgH +asdfgh +asdfgh68 +asdfghjk +asdfjkl +asdfjkl1q +asdfjkl; +asdflaus +asdflol +asdforg +asdfqwer +asdfsdfg +asdfuck +asdfvcxz +asdfzx +asdfzxcv +asdfzxcvtyui +asdgs2 +asdh4kl +asdhetzi +asdlol +asdpwd10 +asdq123 +asdqw +asdqwe +asdqwe1 +asdqwer +asdrubale +asds2737 +asdsada +asdsadda +asdsdasd +asdtre +asduio +asdwow +asdwqe +asdyxc +asdzxc +asdzxc1 +asdzxz +aseba23 +asedata +asede +asedwq +aseepipo +aseitona +asejsda +asekaz +asem +asemoon +asenam +asenchoo +asere1 +asereje +aserf100 +aserius +asermine +asero1 +ases1991 +asf +asf99mo +asfalt +asfaltico123 +asfand +asfdddd +asfg346 +asfgtyu7 +asfixiao +asgard +asgeir +asgh6798 +asgrd1 +asgt1138 +ash +ash13y +ash1sh +ash42001 +ash4life +ash571 +ash6rus +ashang +ashapeer +ashar +ashbaby +ashby +ashen1812 +asher1985 +asherat +ashes +ashgabad +ashgan007 +ashiownz +ashish +ashish83 +ashiyane +ashken +ashlea +ashlee +ashlee747 +ashley +ashley +ashley1 +ashley2402 +ashley725 +ashline18 +ashman12 +ashtera +ashton +ashut +ashwood10 +asi +asi83279 +asi9mac8 +asia123 +asia14 +asia1829 +asia2005 +asiaa0 +asiaf4u +asiakingkong +asiamia +asiasi +asics11 +asics2080 +asiejade +asif765432 +asif9443 +asignore +asilas +asilas1 +asilowed +asim2024 +asimple1 +asinan +asiorek1 +asirtu +asisasis +asiyah +asj19edf +asja31 +asjonas +ask +ask123me +ask5os4o +askaaska +askaban +askachan +askam90 +askan123 +askancu7 +askarida +askary32 +askask123 +askavi +askbadtoelz +askc6c6c +askepot1 +asker789 +askica1 +askietas +askim +askim! +askim. +askim123 +askim40 +askim43 +askim80 +askimaskim +askimsin +askipa7 +askjvk +asklaskl +askp372j +askt320 +asl123 +asl9yvjz +aslak +aslangs +aslantok +aslapublish +aslasl22 +aslexx0 +asli +aslibebe +aslihan +aslissga +aslksdkj +aslpls +asm321 +asma1114 +asma3486 +asmaa +asmax +asmf7 +asmida +asmo1987 +asmodai64 +asmodis1 +asmonaco +asmos11 +asn321d +asn4837o +asnaeb +asnatiir7 +asnco +asni6146 +asnx55 +asnyasny +asop7823 +asp00cqr +aspair +aspanu1 +asparagus7 +aspas1 +aspasp +aspcelo +aspe77 +asphyxiation69 +aspice2k +aspiona +aspire9285 +aspirin +aspirine +aspirinecarajo +aspiring4 +asplok +aspninan +asprey7? +asproma +aspsh01 +asq113 +asquizz +asqw12 +asqw123 +asqwerty +asr1345 +asr1656 +asr307 +asr7729 +asra +asrael01 +asretsar +asroma +asroma10 +ass +ass0man +ass9678 +assaadiq +assaf +assaf +assaf720 +assailant +assamia +assamite +assan +assan +assane +assasa00 +assasine +assass +assassin +assassin94 +assassin967 +assassinators +assauer +assault1 +assbitch +assbone +assdod +asse92 +asseasse +asseater9 +assedic +assehole +assel666 +assem +assembler +assen +assen +asser +assessor +asshat +asshole +assiette +assikind +assis +assis1 +assistant +asskiker +assman +assmann* +assmunch +assne1 +assnuts +asso57c +assoc534 +associated +assoreta +assouan +assrape +asss2005 +assu104 +assunta +assurance +assurbanipal +asswhoop +asswipe +assword +assya +ast0r1a +asta +asta09 +asta1987 +astaga +astala +astangov +astanker +astar8 +astaroth928 +astarothma +astarren1 +asterisco007 +asterisk21 +asterix +astest +astha +astik +astma653 +astmmqs2 +aston +astondb9 +astonv12 +astortv +astorvr +astound +astr0101 +astra +astra123 +astraf +astrag +astrana +astrata +astrewo1 +astrid +astrit +astrix +astro +astro04 +astro1 +astro234 +astro5 +astro911 +astrolab +astrolabio +astrolon +astron88 +astronom12345 +astronomy +asts1455 +astuto +asu +asuchan6 +asuka +asukar +asukirik +asul41 +asulty +asuncion +asuncion1 +asus +asus1991 +asus40 +asus512 +asusp4xp +asusss +asusxt +asv2004 +asv986b +asvc +asvvp +asw11464 +asw2354f +asweas11 +aswq12 +asx +asynien +asystole22 +asz511 +aszhara +aszxdcfy +at0173bp +at1950 +at1994 +at220681 +at252891 +at3601 +at40csak +at450fff +ata +ata1966 +ata7798 +atacar23 +atahualpa +atair! +atakan2121 +atakan22 +atakan35 +atakan73 +atalay +atama31 +atanas +atao +atari1 +ataris36 +ataris99 +atarisoft +ataru123 +atat7070 +atatun +ataturk +atb210ta +atbasms +atbdc3 +atbitane +atboku +atc123 +atc3271 +atc7j +atc85g +atchoume +atd179 +ate92190 +ateeow +atef +ateivis +atemp +atempoc +atena1979 +atento +atescan1 +atetea88 +atex0923 +atfal123 +atfp2009 +atfpass +atg900 +ath1xx +athanas7 +athar +athen1977 +athena +athena +athena23 +athena5713 +athene +athene +athene24 +athens +athenzava +athhev2 +athinna +athlete +athletics1 +athlon +athnaked +athol +athole +athome +athorlito +athos +athravan +athu4gen +athw3b06 +ati05 +ati1081 +ati20i +atibus1 +atiera +atijuv +atik +atila +atilla55 +atilla69 +atinevin +atinot +atjrn +atk369 +atki +atkins01 +atl1337 +atl1979 +atlantic +atlantiq +atlantis +atlantis1 +atlantis999 +atlas +atleatle +atlenews +atleti +atlieb +atlinux +atmo1200 +ato +ato6068 +atodi +atohags +atom45 +atom887 +atomic +atomix234 +atomklo +atomsrules +atonia +atop +atos2004 +atowango +atown369 +atp2485 +atph999 +atq1g +atqx8 +atr4dm1n +atr4wh +atrada +atrance +atrani +atraxnow +atrazina +atrcatrc +atreyu010 +atreyu0795 +atreyu221 +atreyu85 +atrfirf +atrox +atroxwwf +atrunmio +ats1971 +atsq56 +atsuko +atsuo +atsushi +atsz4 +attack1105 +attack29 +attax1 +atte13 +attema26 +attentio1 +atti2935 +atticbat +atticcat +atticus93 +attil +attila +attila +attila24 +attila69 +attitude +attoon99 +attractives +attribut +attsuck2 +attx1881 +atuk20 +aturma12 +atutor +atveries +atx12dp +atyclb +atylla3 +atze2090 +atziri +atziri18 +au +au4to +au8y7g1b +au9eynt +aubanan +aubrac +aubrey +aubrey99 +auburn +auc74toh +aucc21 +auceane +auckland +auction1234 +aud egede +aud18592 +aude +audecaca +audeucul +audi007 +audi1989 +audi200 +audi89 +audiA4 +audia3130 +audia4 +audia8 +audiasex +audidz208 +audie +audigy +audimax +audio +audioa +audispray +audit +auditek +auditt09 +auditt992 +audra +audrey +audrey88 +audriana +audrie +audriusj +audriux +aue8h8q +auepgr +auer10 +auf3mars +aufguss +auford00 +aufstehn +auftakt99 +aug2121 +auge2000 +auge37 +augentrost +augest22 +augmen01 +augsaugs +august +august +august03 +august12 +august15 +august88 +augusta +auguste +augustine +augustino +augusto +augustus +auguta +augyboy +auhb7 +auhost +auhsoj +auhtzroe +aulatic +aumenau +aumetz +aumilolt +aumsucks +aumurcia +aun77joh +auq9h +aura +aura55 +auracms +auraham +aure +aureana5 +aurel +aurel +aurele +aurelia +aurelien +aurelio +aurelio +aurelle +aurevoir +aurezmo +aurimm +aurina +auriol +aurland1 +aurora +aurorah07 +aurore +aurore +aurris +aurum99 +aurytuo +aus1981 +aus6767 +auscol +ausgefickt +ausommet +ausra123 +ausree +aussenwerbung +aussi1983 +aussie321 +aussie57 +aussie60 +aussieland +austern +austin +austin +austin0512 +austin6681 +austinp +australia +australia94 +australien99 +australo73 +austria12 +aususa +autakia +autb4343 +autechre +autekep4 +autg394 +authenex +author +authser +auto +auto2mobil +auto321 +auto88 +auto8888 +auto9191 +autobahn +autobahn13 +autoband +autobus +autobusas +autocad +autoduel +autofahrer +autograffx +autograph +automa +automate +automobil +automotive1 +autor +autoroot +autoscan1 +autoselect +autpq +auts2000 +autsauts +autsch +autschii +autujt +autumn +autumn6078 +aux1root +aux2game +av000000 +av13xess +av1975 +av1negau +av2612 +av3ln +av63772 +av8lo9 +ava +ava44182 +ava445 +avalon +avalon1962 +avalon6170 +avalux +avangard +avangard068 +avanger +avanta4 +avanti262 +avanti48 +avasha +avatar +avatar68 +avatti +avaz0frm +avbice +avcmd +avcms06 +avcservice +avd5z +avds +ave +ave16ar +avea +aveave +avectoi +avefenix +avegod +avelinee1 +avelitog +avena +avendis1 +avenge88 +avenger1 +avens1s1 +avensis177 +avensis1963 +aventis03 +aventura +aver2000 +averell +averous +avery +avery +avery4567 +avex2111 +avexus +avge1b +avgunit +avi +avi +avi10 +avi123 +avi8tr +aviad9 +aviateur +avice +avick0810 +avicohen +avid07 +avido22 +aviemore +avifli +avigail +avinder1 +avioane +aviram99 +avis +avis456 +avisct +avitron +avk2z +avkltlt +avme +avmi1892 +avner +avnpuutm +avoeavoe +avon +avon123 +avonne +avosg +avplane +avr2525 +avraham +avril +avril1 +avril13 +avrng423 +avs333 +avs51 +avsp55 +avt0256 +avtomoco +avtozvuk +avvwyTS356 +avypm4ee +aw123 +aw12345 +aw195608 +aw2005 +aw240971 +aw95b5 +aw96geax +awakess +awalnet +awami +awang533 +award +awas +awatar +awatbuor +awazxc +awcc78 +awchy8 +awcw3t7 +awcycles +awd486 +awd4a5 +awd912 +awdRgy +awdcft +awdpli55 +awe4326 +awe9113 +awedas +awefguil +awekeys +aweko +awesome +awfprod +awm101 +awmnqq +awo +awrsri +awsd1234 +awsd1337 +awsdgyhj +awsedr +awsedr56 +awsome1234 +awvcpf +awwaww +awwkh +ax2tm2 +ax321 +ax40word +ax7ih9 +axb123 +axbeta3 +axbucrxf +axeaxe +axebzmdv +axefix +axel +axel1127 +axel2001 +axel2004 +axel4416 +axel52 +axel972 +axelle +axepulse +axetys +axfbg +axfe085v +axhkq4pm +axik601 +aximilian1 +axioaxio +axiohikn +axis +axis01 +axis128 +axis99 +axisqlol +axk512tom +axklima +axkuz +axl2axl +axl55axl +axlaxl1 +axlroot +axnnxa +axolotl +axolotl42 +axp9388 +axpabedo +axq491 +axsdagpm +axsprime +axte12te +axva3 +axvu9 +axx986 +axxis7566 +axxloch +ay100lj +ay1c2y25 +ay444ay +ay942136 +aya104 +aya4amao +ayak +ayako +ayanami +ayanami7 +ayancuk +ayashi +aybabtu +aybax +ayberk +ayboyxct +aycpal +ayd4xgx +aydar +ayersshelby +ayerun +ayes8cej +ayesha +ayficken +ayh1311 +ayhan +ayibobo +ayjeag +aykj8 +aykut +ayla +aylacan +aylian12 +ayllene +aym96 +aymank +aymee98 +aymen +aymeric* +aymrh +ayn +ayn8C5 +ayna01 +aynat +aynurum +ayoub242424 +ayoubwac +ayoute +ayrton +ayrton94 +ayrtonsenna +ayse emel +ayse4704 +ayselim +aysem +aysen +ayshamom +aysu47 +aysun +aysw3yx8 +aysx1562 +aysxdc +aytac +ayten +aytena +ayturgan +ayudame2 +ayudhika +ayulover +ayumi +ayuneevx +aywy0504 +ayxan1 +ayxx3a +ayyjx +ayyoub +ayz6wz6w +az +az1048 +az123456 +az1973 +az1975 +az1987 +az242eb +az2dkz0q +az369741 +az3755ds +az3t87 +az4422 +az45hg89 +az63033 +az73040 +az741852 +az81372 +az81wi +az920404 +aza221p +aza2k +azaadi +azaaza +azade44 +azadmann +azam1385 +azar1us +azari +azaria +azariah +azarking +azathoth1980 +azaz +azazaz +azazaz0990 +azazazaz +azazel +azazello +azbrw3hs +azcorp91 +azdkoiu +azdruval +aze123 +azeaze +azedsq +azehe163 +azemat +azeqsd +azeqsd19 +azer12 +azer1234 +azer1988 +azer22 +azer36 +azer83 +azer8520 +azerbayc +azert +azert1 +azerto +azertu +azerty +azerty00 +azerty12 +azerty13 +azerty3 +azerty50 +azerty62 +azerty82 +azerty86 +azerty93 +azerty98 +azerty99 +azertyop +azertyqs +azertyui +azevedo +azeytr +azg78c +azhack +azhar +azhazh +azhqxpaz +azi291ok +azimut +aziz +aziz1979 +aziz4778 +aziz6334 +azizbaba +azizti05 +azizziza +azk +azlan +azman1814 +azmedia +azmi09 +azmi96 +azn3b +aznarepse +aznboi +aznboy +aznpryde +aznxxx +azon21 +azonic23 +azorek +azorot4 +azrach +azrael +azrail44 +azrailazrail +azriah87 +azrsrv5j +azrz98fa +azsx1122 +azsxdc +azsxdcfv +aztlan98 +aztrem +azttar +azubi +azubuike +azul2168 +azules +azuma11 +azureus +azuroo +azwat +azx1azx +azxcvb +azxcvg12 +azxsdcvf +azyndiae +azyx3mb +azz92 +azza9502 +azzazz +azzazza1 +azzgs +azziamari +azzo4877 +azzorak +azzorel +b +b-st. john +b0095212 +b00a2a +b00b13s +b00b5 +b00mb00m +b00mload +b00nz0r +b00tsdog +b00ty +b014 +b02051991 +b020e576 +b0353n +b03ac32 +b04cc3 +b05ca0fe +b05ff138 +b06027324 +b0628b +b064efa0 +b081073e +b08623 +b08799189 +b0b0lami +b0b102 +b0bbyt +b0bobobo +b0bucket +b0ching +b0dda21 +b0f4kkcm +b0gardan +b0j0uR +b0j1l0v +b0matrix +b0mb3r +b0mb4s +b0mm4 +b0monclova +b0n3s6t9 +b0nn1b3ll +b0nsa1 +b0pentium +b0r0b0y +b0rd3l +b0rdel +b0rdem +b0rnh01m +b0sinbad +b0st0n +b0stjan +b0stumpy +b0tc0m13 +b0telecom +b0than +b0w2bobc +b0z0istf +b101735b +b1034192 +b11gb11g +b122474 +b12345b +b1235555 +b1269 +b12pass +b13512b +b13k3r +b1451277 +b1483l +b1617ph +b167g90c +b16bc5 +b18891 +b18b3f +b19862 +b1Danielle +b1acky +b1allison +b1asana +b1b1b1b1 +b1b8b9b3 +b1brixton +b1c63d5 +b1ca32fa +b1cobble +b1dongxi +b1drag0n +b1dule +b1feild +b1football +b1freedom +b1gdog +b1gellow3 +b1gkwq92 +b1gl0gs +b1global +b1i2e3r4 +b1l2a3 +b1l8u7e9 +b1nk3rt +b1ollo +b1patti +b1pendor +b1rfll +b1ryan1 +b1teme +b1tyb0o +b1tzzz +b1u3 +b1wwsj45 +b1zerte +b2121b +b21758 +b21adb +b21b21ps +b2252123 +b2291977 +b237jh +b23b3ad1 +b23etm46 +b2441fu +b24829b +b24f5bb5 +b24opkgb +b26071969 +b2793711 +b299zrq +b2b001k +b2b606 +b2bdfa8 +b2bsttsk +b2calvin +b2carmen +b2cba321 +b2chance +b2e5mi4 +b2exe4ever +b2f0c6ab +b2f29338 +b2fc91 +b2fdv7 +b2inform +b2judpgq +b2juggle +b2n3dfgh +b2oba1 +b2ocs7nl +b2plebian +b2rubbish +b2sheldan +b2sublime +b2t +b2ta49 +b2timetogo +b2umer +b2vxxx +b2windos +b30421 +b31625 +b330hs +b33ns +b33r +b33r30 +b33rb34r +b33rb3lly +b34n1372 +b3591129 +b360eec +b36d3314 +b370x +b374wi +b37a19ca +b3955546 +b39b9t8 +b3Angel +b3LEGS +b3abe6 +b3ar1t +b3arcats6 +b3ast1 +b3aut7 +b3b129 +b3bbe6b7 +b3bourbon +b3bovine +b3buffy +b3c8d1e2 +b3camaro +b3cateyes +b3df0rd +b3e7745b +b3g0k123 +b3hb3hani +b3henry +b3j4r +b3k3r +b3korea +b3l00ga +b3lial +b3nz0ate +b3ohne +b3poohbear +b3r53rk1r +b3rk4y93 +b3smith +b3ss3sap +b3st3r +b3stickey +b3ta +b3tight +b3tissem +b3xbw +b3xci +b3y0nd +b3zkizo3 +b3zmshcf +b41fbdff +b4260949 +b42692 +b439854 +b4582 +b476i87k +b47h6bd +b47xg3 +b4Perle +b4bubba +b4c6e3 +b4d1247 +b4d93 +b4de2d +b4dger +b4dger77 +b4ed46d8 +b4fredfred +b4gg1 +b4h4mu +b4h4rsj +b4h4ttee +b4hasmet +b4hnh0f +b4j1ng +b4jesus +b4l4wr0 +b4liberty +b4loxley +b4m2v6q4 +b4milly +b4mozart +b4n654t +b4nk0tsu +b4nsh334 +b4olympic +b4ovv +b4rtl3tt +b4stuart +b4techno +b4ttl3 +b4ttn +b4u2d0 +b4uqw +b50002332 +b5070z18 +b50nknyv +b51676448 +b5200583 +b5311129 +b5326ecb +b555 +b56802 +b5698dbn +b59723e +b5Buddha +b5Buster +b5agv +b5bodrum +b5bstreet +b5cb2952 +b5cyberkey +b5d2cf0 +b5dvmSm +b5glorious +b5lavender +b5luise +b5n9rvqg +b5ni89c3 +b5rachel +b5shanti +b61072 +b628129 +b63586h +b63a1e3 +b64mftdw +b653664b +b675v +b68018 +b6SIENNA +b6abdel +b6ad5716 +b6aq45 +b6b590 +b6b626 +b6braves +b6d4b49 +b6d7d3c +b6goleafs +b6mithril +b6music +b6panther +b6qcb +b6random +b6ranger +b6t0f223 +b6worthy +b7 +b706626 +b711111 +b7158c8d +b7175845 +b72801 +b72lmc29 +b743acd3 +b7769067 +b78492 +b78e31 +b791110b +b79s24b +b7TUXEDO +b7a32b +b7alaska +b7b4e3 +b7b87c1 +b7c3d208 +b7e457 +b7ee72c +b7herion +b7hs4vox +b7imperiet +b7information +b7maxell +b7millee +b7pochun +b7shaun +b7skydive +b7thailand +b7vly91 +b7whisky +b805bb +b8070479 +b8135s +b81wdr6j +b8203109 +b8393e +b8402059 +b8424242 +b84e3 +b8601152 +b870963b +b8740187 +b8795c +b87fb0 +b87tcp0k +b891662 +b8940114 +b8953033 +b8972300 +b89a2c5b +b8Lynette +b8c7czb7 +b8chadwick +b8cressida +b8cs35 +b8ecuador +b8k2lmn +b8kennung +b8kitsa +b8o7d +b8pasadena +b8qyghh0 +b8s44w5s +b8seball +b8simon +b8tamatea +b8wct +b8yogesh +b9016018 +b91 +b919ea73 +b93669c8 +b9458333 +b96a3ecb +b97556 +b987654s +b9B8iT +b9Django +b9bigmac +b9c25b9c +b9chris +b9d786d7 +b9declan +b9detritus +b9devilish +b9fe70 +b9g4elle +b9gundam +b9iikn6j +b9kaf4wo +b9mickey +b9pixies +b9qwerty +b9r1hvgv +b9seagate +b9tester +b9veghel +b@t@tinh@ +bDHQdr +bErSeRk +bGd725 +bJ673489 +bLACK +bLWfp3 +bUchEn +bWobm +bZjq2x +ba +ba +ba000123 +ba005679 +ba041056 +ba0c4c +ba12345 +ba1975 +ba1ley +ba25651 +ba2b44 +ba2jagov +ba33m4n +ba35chec +ba5399 +ba6ch7y9 +ba7ebek +ba7ebha +ba841 +ba894e +ba8k1rrw +ba8ondol +ba913057 +ba91d7a4 +ba9b82 +baMADIE +baMOTOR +baalambe1 +baardgier +baau5 +bab +bab106 +bab2lon5 +baba +baba0606 +baba17 +baba1988 +baba1991 +babaa +bababa +babababa +bababoo +babaca +babacan +babachka +babaground +babailing +babajan +babaji6 +babakino +babakoto +babaloo22 +babam1 +babama +babamama +babamoo +babamrt +baban12 +babaqga +babar +babaroga +babata +babay25 +babbalu +babbel +babble +babbuino42 +babcanx1 +babcia1 +babe +babe +babe081 +babe129 +babeegees +babelfish +babeltute +baberuth +baberuth777 +babeth1 +babette +babette1994 +babie1978 +babil +babilove +babinda +babis68 +babka +babke99 +babooman +baboon +baboon371 +baboslaw +babou88 +baboune +babruno +babsi3110 +babsihund +babsy +babsy79 +babua123 +babuji +babulike +babunas +babus1235 +baby +baby +baby bobby +baby001 +baby0804 +baby2b +baby4 +baby7115 +baby93 +babyb0y2 +babybaby +babyback +babybear1 +babybitc +babyboy +babyboys +babybun +babycakes +babydoll +babyemma +babyface +babygirl +babygirl2515 +babygirl2877 +babyguy +babykill +babyl00n +babylay +babyliss +babylon +babylon#5 +babylon5 +babylone +babylove +babyroo2 +babyyuan +bac +baca +baca980 +bacadi +bacanon +bacardi +bacbier +baccios +bach +bach1959 +bach713 +bachay12 +bachir +baciu69 +back1paz +back2it +back4rbp +backd00r +backdoor +backdraft +backegg +backer1234 +backerod +backfisch +backinblack007 +backlund235 +backman94 +backnang +backora91 +backspace1968 +backspin +backstep01 +backstreet +backup +backup +backupexec +backwoods87 +bacn11q +bacon +bacon123 +baconbit +baconman +baconpants +bacricket +baczas92 +bad0609 +bad123 +bad1bob +bad2en1 +bad513 +bada4000 +badabing +badaboum +badak39 +badams01 +badangel +badass +badass1000 +badass75 +badass98 +badassbeal +badbad +badbad23 +badbad67 +badboy +badboy01 +badboy12 +badboy28 +badboy386 +badboys +badboys7 +badcold +badcom33 +badd1798 +baddguy +baddog +baddog1982 +baddog23 +baddude +badeer55 +baden +bader +badfrog +badger +badger95 +badgones +badgowox +badguz +badijuli +badiola +badizi +badja +badja medu +badjas88 +badkarma6 +badkran +badllama +badmad +badmin +badminton +badminton01 +badnic +badoit +badone81 +badpad +badr2005 +badragons +badrun +badseed +badsgard +badskill +badstore +badtouch +badyno +badyta +baea2008 +baecker02 +baeda647 +baem +baer23 +baerbel2004 +baerenfang +baerli +baerlie +baerpower +baesan +baezoles +baf +baf642 +baf690 +baf781 +bafabian +bafalcor +baff60 +baffy2307 +bafica18 +bafrum +bag1506 +baga788 +bagandalf +bagdatt +bagdg +bagel100 +bagel83 +bagelord +baggersrocky +baggins +baggins1238 +baggio11 +baghdar +baghi99 +bagiamay +bagira666 +bagiux +baglady38 +bagman0912 +bagodo +bagoo2 +bagpipe1 +bagrik +bags1892 +baguette +baguvix +bagybg +bah000 +baha12b5 +bahadir +bahagia4 +bahama13 +bahamut +bahamut00 +bahamut0301 +bahar +bahbah2004 +bahbah64 +bahdja +bahfs +bahh787 +bahia70 +bahia98 +bahiamax +bahja1 +bahnhof +bahnhofspenner +bahrain +bahram +bahtiyar +baibai88 +baiche77 +baidoon +baidyla +baier7 +baierbaier +baihao77 +baikalas +bailarina3 +bailey +bailey +bailey3083 +baileyku +baileys1 +bailygd +baipyltp +bairbre ni +baitedowned +baiyunya +baja18 +bajabp1 +bajalko +bajanboy +bajbus +bajen55 +bajgora +bajnok71 +bajom +bajs +bajsapa +bajsar10 +bajsbajs +bajsballe +bajseric +bajskaka +bajskatt +bak7890 +baka00 +baka1 +baka5589 +bakaitlin +bakalaka +bakaplz +bakar1977 +bakayoko1 +bake2345 +bakedbeans +bakemono99 +bakeoo +baker01 +baker11 +baker1966 +bakersen +baki +bakiyas +bakkabakka +bakkers +baksana +baksas +bakubaku +bakukuk +bal +bal51299 +bala +bala2486 +balabala +balachita +balagan911 +balahzhx +balaji +balakat +balalaika +balance +balance1 +balancepoint +balasucks +balauru1 +balbo00 +balciunas112 +baldao89 +balddown +baldi1086 +baldorian1 +baldrian +baldrige +balduin +baldur88 +baldwin +baldwin +balea790 +balena +balena29 +balerie +baleze +bali69 +baliko28 +balin89 +balint +balista2000 +balkan +balkon +ball32 +ball33 +balla +balla44 +ballaballa +ballard +ballbag +balleballe +baller117 +ballet12 +ballet88 +balletdancer +ballica +ballie +ballin2y +ballina +ballon06 +ballpark +balls +ballsniff +ballybran1 +balmar67 +balmung6 +balocutus +baloo5047 +balooo +baloozg +balorcim +balou06 +balou1985 +balroa +balrog +balrog71 +baltazar +baltet +balthasar +balthazar +balti +baltueuz +baltus123 +balu.. +balu12 +balzak16 +bam8883 +bama123 +bama68 +bamako +bamalte1 +bamarox +bamba +bamba2008 +bambam +bambam1 +bamban24 +bambang +bambang12 +bamberg5 +bambi +bambi +bambino +bambou +bambus +bamies1 +bamiloe +bamiwa46 +bamper10 +bamrei +bamse123 +bamse4895 +bamsemaxi +bamsemums91 +bamu4e +ban131313 +bana1173 +banaan +banaanzooi +banagher +banan001 +banan87 +banana +bananabe +bananadin6 +bananaphone +bananarama2 +bananas +bananass +banane +banane00 +banane1 +banane1337 +banane2 +bananer1337 +bananes +bananets +bananna +banbel +banbury +banchong +bancio +banco +bancobanco +band +band104j +band1234 +band1t +band7410 +bandefamilie +bander +bandersnatch1 +bandgeek +bandhar +bandicoot +bandido0 +bandido89 +bandini2023 +bandit +bandit18 +bandit25 +bandit674 +banditai +bandito67 +bandolero +bandora135 +bandpink +bandra767 +bandrajs +bandrj +bandzior1 +bane34 +bane88 +banffer +bangalore +bangarak +bangbang01 +bangbus +bangem +bangers +banghu +banging! +bangkak +bangkiki +bangla +bangor77 +bangsat +banguide +bani +baniagi3 +banished +banja2002 +banjo1944 +banjo97 +banjoman +bankai +banket123 +banki7 +banklazy +bankpas +banks +banksia +bann +bannani +banned +banner +bannholz +bannor13 +bannu +banoan +bans +banshi21 +bansux +bantam01 +banteng +banuamin +banunavut +banurobert +bany2000 +banyo +banzai +banzaix +banzin +baoanhco +baohf +baolam +bap255 +bapaga +bapakama +baproverbs +bapsis +baptiste +baqafix2 +bar +bar10der +bar1986 +bar1987 +bar2508 +bar3wax +barabara +barabbas021 +barachel +barack +baracuda53 +barad3y +baradur +barak12 +baraka +barakglr +barakuda +barakuda11 +barakz +baramin +baran +baran323 +baranbaran +baranowski1 +baratti +barb52 +barb89 +barbanpass +barbara +barbara ann +barbara bel +barbara jean +barbara jo +barbara#1 +barbara6390 +barbaram +barbarawood +barbare +barbare +barbarossa +barbazel +barber99 +barberenko +barbi +barbie +barbio +barbo +barbo47 +barbot22 +barboura +barbpass +barbqdog +barbra +barbro +barbseth +barbunya +barburao +barby13 +barbyli +barc +barca +barca1 +barca10 +barcelo108 +barcelon1 +barcelona +bard1997 +bardak77 +bardha +bardo11 +bardo15 +bareback1993 +barebone +barecreek +barena90 +barigudo +barink +baris10 +barisdmr +barista1996 +barjack +barkbark +barker +barker73 +barkouky +barkybites +barlow1592 +barlowe +barmetet +barn3368 +barn3tt36 +barnaby +barnadine +barnard +barnen2006 +barnett +barney +barney +barney10 +baroban +barolo +barolo11 +baron +baronak +baroness0504 +baronscourt +barr +barracuda +barracuda31 +barrah +barrak74 +barraki +barraza100 +barraza500 +barret +barret +barrett +barrie +barrie young +barril21 +barros34 +barroso +barrow02 +barry +barry1 +barry88 +barsch +barsche +barseq +barstis18 +bart +bart +bart12 +bart123 +bart168 +bart3000 +barta +bartar +bartas16 +bartek +bartek01 +bartek1 +bartek2 +bartek49 +bartek83 +bartekm +bartez1 +barthaha +bartjud +bartlett +bartman +bartolo +bartolomeo +bartolomeo +barton +bartosz +bartraw12 +bartsimp +bartsimpson1 +bartsux +bartuc +barty! +baru +baruch +baruffa +barutana +barve420 +barwar +bary123 +bas +bas1989 +bas417 +basRTQ +basak +basalisk +basar +basavahr +baschi +basciagi +bascran +base +basebale +baseball +baseball135 +baseballs +basel9 +baselkab +basenji42 +basero +baset2003 +basgall2 +basglas +bash +bash1337 +bash1438 +bashbash +bashert99 +bashirley +basho +basi2002 +basia +basia14 +basic +basicbasic +basicmd5 +basics +basij +basil +basil.. +basilIa44 +basile +basilikum +basilja +basink +basique +basis+ +basisbes +basitmi +basje1 +baskent +basket +basket08 +basketba +basketball +basko02 +basman +baso +bason +baspaceboy +basquiat! +bass123 +bass2k +bass2k04 +bassadd +bassbass5 +bassboxx +basse2312 +basseboy +basset34 +basset77 +bassfish +bassgirl +bassi86 +bassie +bassist! +basso1 +bassoft +bassspass +basta +bastard +bastardo +bastards121 +basteli7 +basterds1 +bastereg +bastest +basti +basti030 +basti123 +basti1873 +basti2 +bastian +bastian1984 +bastien +bastig +bastiklein +bastimort +bastler +bastogne +bastoncino +bastou +basty +basuicidal +basula7 +basura2009 +bat098 +bat2 +bat2ball +bat4ever +bata +bataille +batata24 +batavia14 +batboys91 +batchnet +batcon +bateau +bater22 +batera +baterija +bates237 +batgirl1710 +bath1937 +bathurst2795 +batian +batibar +baticic +batidito +batigoal +batis1 +batista +batistuta87 +batko123 +batm3085 +batman +batman115 +batman13 +batman19 +batman21 +batman22 +batman27 +batman28 +batman42 +batmandte +batmang +bato +batok +baton22 +batonik +batsche +batt0sai +battbatt +batterie74 +battle +battleaxe +battlecobra +battlefield +battlefield2 +battleteam +battletech!! +battletech1970 +battys1 +batu18 +batu2000 +batuhako +batuhan +batvinis +batya +batyr14 +batz6676 +batzan +bau +baubau +baubau77 +baudas12 +baudisch +baueasas +bauer +bauer07 +bauerei +bauext +bauglir +bauglir1 +bauhaus24 +baum +baum11 +baum44 +baum4818 +baumhaus2 +baumrinde1 +baus01 +bausch99 +bauwf +baven +bavr7301 +bawls +bawls987 +bax123 +bax72uz +bax8706 +baxee +baxinho +baxter2005 +baxter2009 +baxter4428 +baxterr +baxtyar +bay1085 +bayant +bayargw +bayb2703 +baybay1 +bayer04 +bayern +bayern11 +bayern2 +bayern22 +bayern90 +bayfd12 +bayfv +bayhawks +bayley +bayly777 +baynurul +bayou +bayou123 +baypoint22 +bayram +bayuda +baz7996 +bazarova +bazbaz +bazebs67 +bazil1001 +baziwolli +baznas +bazooka +bazooka25 +bazuka +bazzerb1 +bb +bb022492 +bb022904 +bb030625 +bb051593 +bb06b73 +bb120288 +bb125897 +bb161985 +bb1954 +bb1bd03b +bb2627 +bb297867 +bb301295 +bb3500 +bb3851 +bb3f21 +bb4069 +bb42 +bb430606 +bb46d3 +bb67rs1 +bb73c8f +bb861f73 +bb8om2ma +bb94f56 +bb9aef43 +bbab +bbabsi +bbadm5n +bbahan +bbaircadet +bbalex +bball +bball1 +bball54 +bbartek +bbb +bbb1be +bbb3dfe2 +bbbb +bbbbb +bbbbb +bbbbb03 +bbbbbb +bbbbbb +bbcbbc +bbcbmb +bbcmedan +bbdmsk +bbdnahui +bbdtlll +bberen +bbert +bbgfl +bbggsbbg +bbi699 +bbithilien +bbking +bbkivris +bbl7623 +bbl8h +bbl999 +bblade +bbofx540 +bbonline +bbooss1 +bboy +bbpeonf +bbpixel +bbpk +bbrains2 +bbrichboy +bbring +bbrolli +bbrosig +bbs +bbs2008 +bbs9702 +bbsaturn +bbsense +bbsfbank +bbshorty +bbstc1 +bbsuxx +bbt217 +bbtbmona +bbte +bbund +bbunny994 +bbvw3d +bbygi +bbyz125 +bc072390 +bc2guv9 +bc32f5 +bc3a424d +bc6205a7 +bc66620 +bc8370 +bcaouyle +bcareful +bcarhdf5 +bcatern +bcbc5647 +bcbmjr +bcc1976 +bcc940 +bcc997 +bccl +bcdavid1976 +bcdegptv +bcdqil +bcf26be +bcfX0C +bcfarrer +bcfcbcfc1 +bcgeil +bchb206 +bcjsbba2 +bck20167 +bckh8139 +bckid21 +bcl3v3r +bclaguna +bcmarsh +bcn2001 +bcntnr +bco79a +bcpatricia +bcpollux +bcpurple +bcraig +bcsl3150 +bcspeights +bcsplash +bcwx45xt +bcyjp52 +bczaphod +bd060471 +bd08e7f +bd091100 +bd100150 +bd150763 +bd201290 +bd280783 +bd3713 +bd48220 +bd48e1 +bd4dm1n +bd4wn20 +bd525lk +bd5a3e7e +bd5hv14 +bd6058 +bd7434 +bd828q1a +bd883 +bd8dsk3e +bd931702 +bda14me +bda8k1ue +bdaac2 +bdatende +bdawg05 +bdbelieve +bdcanada +bdcg0033 +bdchicco +bddcee1 +bddougal +bdea1234 +bdec330 +bdee8707 +bdfcbdfc +bdh1y +bdhcfaym +bdintern +bdk17rd4 +bdklnc +bdl1403 +bdm7vph7 +bdmermaid +bdmiriam +bdmqgcot +bdon11 +bdpopsicle +bdpt1 +bdq9jq7d +bdr +bdr130 +bdr3618 +bdringo +bdrjr +bdsmudge +bdtmbam +bdtweeek +bdupas86 +bdvm +bdvodka +bdwgiwqp +be +be0039 +be0560 +be101216 +be1234 +be12xxbb +be252256 +be25791 +be2ost +be4ea8 +be5132 +be578861 +be7414 +be8qco +be9592b +be9hhk +beLLaBellA +bea +bea1234 +bea1410 +bea4606 +beaa2d +beach +beacher +beachv03 +beachy2109 +beacon +beadle140 +beah +beak +beaker +beakster +beame +beamer +bean5150 +beane6969 +beaner345 +beaner41 +beanhead +beanies +beans +beans999 +beansok +beantown +beany828 +bear11 +bear1119 +bear1550 +bear2006 +bear2327 +bear4040 +bear98 +bearclaw +bearcubb +beardog23 +beardown +beardrum +bearing420 +bearjuna +bearpak +bears3 +beartrap62 +beasiri +beasley05 +beast +beast123 +beast1289 +beastie +beastlypally +beat +beat76 +beata +beata1 +beata6 +beataem +beatdown7 +beate +beate0804 +beate177 +beatie +beatle +beatle77 +beatles +beatlive +beatlove +beatnavy +beatrice +beatriks +beatrix +beatrix55 +beatriz +beatriz650 +beatthat +beatthis +beatus79 +beau +beaufort6 +beaumont +beaver7685 +beavers +beavis +beavis1342 +beawinner +beaxx098 +beazt1 +beb28392 +beb5554 +beba +bebamew2 +bebbe +bebboba +bebe +bebe +bebe3838 +bebemalo +bebeq +beber2 +bebert +bebetina +bebey28 +bebf0a +bebik11 +bebina +bebisim +bebispek +bebita1 +bebitu21 +bebloxal +bebo1234 +bebolax +bebope +bec91coz +becasbecas +because +beccab1 +beccal +beceejay +beceren +becexs +becher00 +beciak +beckett +beckham +beckham7 +becki +beckro +beckroth +becks +becks203 +beckstrand45 +becky jo +becky7 +beckyemma +beckyh +beckyjoe1 +becn1469 +become +becoming +bed06f9 +bedeille +bederd13 +bedhuine +bedlagt +bednarek82 +bednarski +bedo2002 +bedrich +bedtime88 +bee +bee5359 +beea2b2 +beearnie +beebee85 +beech +beecher +beeches +beedie +beef123 +beef3443 +beefcake +beefsteak +beeftime +beeftrain +beefymac +beehan +beehive +beej +beelas +beeld +beemaster +beemer520 +been1one +beenfeldt91 +beepbeep1 +beepgirl +beer +beer0724 +beer0815 +beer211 +beer4951 +beerad +beerbear +beerke +beerking +beernuts +beerz +beetel450 +beethoven +beetle +beetlejuice +beextrem +beeyago +beezer +bef7f1e +beford +befri123 +beg4life +beg696 +begbie1 +begin +beginnen +beginner4 +begley03 +begona +begonia939 +begood +begoule +begurudev +beguuu87 +beha0162 +behbeh +behcet +behnam64 +behnambehnam +behold +behringer +behrooz +behruz +behumza +behurryup +beidi14 +beijing64 +beirut1 +beisbol +beispiel +beist +beizhai +bejossie +bek +bekir +bekisar +bekka897 +bekki +bekler +bekleriz +beko8983 +beksa33 +bekster +bel0823w +bel12tr +bel1nda +bel2006 +bel31lel +bela +bela +beladana +belajar +belan0970 +belang +belanger123 +belanova +belda512 +beldzik +beleaua9 +beleg85 +belekas +belekaz +belekk +belelina +belemneu +belepek +belette +beleza +belfegor +belfort +belgarath +belgie +belgium +belier89 +believer55 +believing +belina +belinda +belinea +belinea2 +belinha +belita +bell4444 +bell7331 +bella +bella starace +bella04 +bella1 +bella21 +bellaboo +bellacos1973 +bellaire04 +bellamym +bellawoods +belle +belle1017 +belle125 +belle972 +bellemeade +bellen00 +bellep +bellera +belleza +belliom +bellissima +belliver +bellkiss +bellucci +belma123 +belmer51 +belmont +beloglinka +belove +beloved +beltboy +belthle +beltsander +belvis +bema +bembelis +bembol +bemenni +bemiks +bemol +ben +ben +ben0tt0 +ben1150 +ben12693 +ben1men1 +ben28 +ben3307 +ben8shit +benali03 +benamram +benawaco +benay +benbe0803 +benben +benblog +benbow +bence1 +bench2297 +benco +benda73 +bendan +bender +bender37 +bendes +bendl1043 +bendo +bendot +bendud +bene2002 +benedict +benedikt +benedikt79 +benedita01 +benek12 +benell1e +benesh14 +benevrek +beney2009 +benfica +benga65 +bengal789 +bengay +bengoc +bengt +beni +beni47 +beni88 +benia +beniandi +benike +beniko +benim +benimcanim +benimki +benimsin +beniouse +benita +benita +benito +benj2798 +benja +benjamin +benjamin +benjamin1999 +benjawan +benjegek +benji +benji10 +benji2987 +benji84 +benjille +benjo2891 +benjymon +benkkneb +benlaura +benlouis +benmic +benmoi +benne51 +bennett +benni01 +benni123 +bennie +bennie +benno +benno123 +bennom +bennu6628 +benny +benny +benny2810 +benny7755 +benny91 +benny9247 +bennyamin +bennyboy8383 +bennyy1 +benoire +benoit +benolio +benq +benqpcok +benro123 +benrye +bensaxer +bensiina +benson +benson +benson1 +benster +bent +bent84 +bentck +benteal +bentley +bentole +bentos123 +benudel +benutzen3 +benvesen +benwin +beny1 +benyhil +benz6766 +benza +benzacne +benzzo +beo +beoohyk +beotelko +beowulf +bepo +beporno +beppe +beppe2001 +beppo +beppo11 +beppu +bepxci +beq050 +beq055 +beq1o +beqa +bequick +ber54ni +beracha +berangere +berard10 +berbang +berberos +berdia +berdien +berdine +berendes +berenice +beretisa +beretta +berf1958 +berfinim +bergamo07 +berge546 +bergen39 +bergeot1 +berger +berger01 +berger84 +berget01 +bergey +bergfeld +berggren1992 +bergheimx +berghof1 +berghuis +bergliot +berglund1996 +bergmann +bergstrom95 +bergur +bergwacht +berick75 +berik123 +berilefe +berilo1 +berita +berk +berk10 +berk1230 +berk1990 +berk3061 +berk95 +berkana1812 +berkay +berkkreb +berky89 +berl1211 +berleur +berli179 +berlin +berlin04 +berlin23 +berlin37 +berlin77 +berlin99 +berlinda +berlingo007 +berlingo2 +berlut +bermuda2613 +berna +bernadene +bernadette +bernadette +bernal23 +bernard +bernard pierre +bernard-pierre +bernardina +bernardo +bernd +bernd1063 +bernd1604 +bernd2102 +bernd2105 +bernd3 +berndbb +berner1996 +bernhard +bernhard +bernhard8 +berni2410 +berni64 +bernice +bernie +bernie +bernie1 +bernie10 +bernie12 +berny +beroende85 +berruer +berry +berry +berryberg +berrylau +bers123 +berser +berserk +berserker +bersileni +bert +bert +bert04 +berta +berta +bertalan +bertbert1s +berte +bertha +bertha012 +berthe +bertil +bertino +bertollo213 +berton +bertram +bertram2 +bertuelo +berty1976 +berube101 +beryl +berys +berysio6 +berzan23 +besahabus +besar123 +beschd12 +beselea +besenstiel +besh123 +besi92 +besibesi +beside99 +besiina +besiktas +besma05 +besmart +besnadene +besource +bess +bess001 +bess101j +bessa1337 +bessem +besser21 +besserpunk +bessibessi +bessie +bessie love +bessiedixie +bessyvon +best0806 +bestar +bestclub +bestell72 +bester +bestgames +bestguy +bestiale +bestie +bestill4 +bestjt +bestjunk +bestof2005 +bestoloj +bestrune +bestseller +bestyboy +besveiks +bet00din +beta +beta123 +beta13 +beta2000 +beta2003 +beta2379 +beta55 +beta9x +betaaling +betab2 +betacam +betagoro +betamax +betaterra +betbox +betgigi +beth +beth2008 +beth69 +bethany1 +bethanyg +bethel +bethel2k +betheone +bethere8 +bethesro +bethie24 +bethina01 +beti9192 +betina +betina01 +betina02 +betinho +betipster +betjj14 +beto +betobeto +betoche +betoya16 +betray +betrix +betsy +betsy julia +betsy ross +betsybetsy +bett1227 +betta +bette +bettell1 +bettermann +betterred +betti +bettina +bettina +bettina. +bettine +betty +betty +betty ann +betty jane +betty lou +betty rose +betty ross +betty1 +betty964 +bettyboo +bettyboop +bettychu +bettye +bettyma0924 +betucker +betul +betul123 +betulsen +between121 +between2334 +beulah +beut +beuz1007 +bev1061 +bevan +bevbom66 +beverlee +beverley +beverley1 +beverly +beverly +beverly booth +beverly hope +bevih +bew0v +bewedis +bewerbung1 +bewexos +bewit1988 +bewitched5 +bewko123 +bewten +bewuxo +bex483 +bexbex +bexffpv9 +bexo +bexora +beyaz +beyblade +beycan +beykala +beyonce +beyza +beyza93 +beyzade611 +bezelek +bezerromf +bezobear +bf109g5 +bf109g6 +bf110c4 +bf150880 +bf1942 +bf1942cs +bf22142 +bf2pro +bf32302 +bf66d7 +bf747wv +bf924t2 +bf9646k6 +bfa541b9 +bfadmin +bfaookf +bfarve +bfbrother +bfdranzer +bffa628 +bfg10k +bfg7600 +bfg9000 +bfg908 +bfhfdf65 +bfhoefle +bfk9000 +bfkevin +bfkevin +bfl5526 +bflame +bfm9qq +bfmolson +bfnappy +bfnavl12 +bfpanic +bfpjd +bfr93rod +bfseashell +bftech +bftelekom +bftellie +bfuchs +bfwrr +bg042483 +bg0511 +bg0612 +bg082303 +bg131969 +bg18mg +bg204858 +bg268454 +bg4341 +bg7592 +bga3855 +bgaq6mka +bgb1va +bgb3365 +bgbatbt +bgbgbg +bgbstr +bgforlife +bgfr436 +bgfsmsw +bghieu +bgi50 +bgjgr101 +bgk6t +bgm202020 +bgmd1965 +bgmu8ib +bgpimp +bgr1410 +bgr5jny2 +bgr6by9 +bgrg2809 +bgsbil +bgsh0p +bgslyde +bgt5tgb +bgtrader +bgutrwv1 +bguwz +bgx3o +bgxd07 +bgzo5 +bh0414 +bh165sq +bh21281s +bh280591 +bh2841 +bh2is367 +bh328641 +bh3nxskx +bh4xl87 +bh58hh3n +bh7a2 +bhaal1 +bhabhi66 +bhaktapur +bharvest +bhaska12 +bhavic +bhb123456 +bhbirf82 +bhbxlmos +bhcc3345 +bhcofm55 +bhcofm66 +bhekv1 +bhf5bg2r +bhhk1334 +bhk002bh +bhl +bhlcrew +bhogwan +bhood08 +bhopdude +bhrkmc +bhs2k1 +bhsrules +bhtn0808 +bhtnr +bhuj398 +bhupesh +bhut5 +bhutto15 +bi0tek5t +bi2487 +biZk8t +biaaatch +biafc111 +biaga +biagio +bian789 +bianca +bianca +bianca0710 +bianca18 +bianca1991 +bianca91 +biancariva +bianchette +bianchi +bianco +bianconero +biashftz +biatch +biatchz +biavsg +bib0001 +bibeau007 +bibek +bibel1 +bibel456 +bibemp +bibendum21 +bibeta3 +bibfeind +bibi +bibi +bibi20 +bibi2000 +bibi9 +bibi94 +bibiaaaa +bibiana3004 +bibibi +bibichou +bibiene +bibifoc +bibik +bibiloi +bibimann +bibinem +bibinha +bibione +bible76 +bibleguy +bibo131 +bibo2007 +bibolito +bibou10 +biboune +biboxbi +bibu1950 +bibvimiy +bicboc +bicbozji +bicc1 +bichard +bichchi +bichngoc +bichthi +biciclo2 +bickey17 +bicowski +bicque +bicross +bicu +bicym447 +bidbid191 +bidc987 +bidifsxu +bidit38 +bidoran +bidouil +bidoul +bidp8 +bidule +bie9G7 +bieber06 +biegzie +biel65 +bielefld +bielle1107 +bienchen +biene0815 +biene29 +biene2k +biene528 +bienemeier +bienen7honig +bienenvolk +bienve +bier +bier122 +bier1234 +bierbong +bierclan +biere +biere1 +bierfass +biergarten +bierher +bierher9 +bierhier +bierle +bierput +bierschinken +biersode +bieszczad3 +biff +biffarb +biffy +bifi +big +big boy +big joe +big patcheen +big0208 +big0926 +big0nes +big10in +big1cab +big1zoo +big35dog +big54dog +big6php +bigady +bigarnak +bigass +bigbad +bigballa +bigbang +bigbear42 +bigbearpaw +bigben +bigberg +bigbird +bigboss +bigbuds +bigbull +bigcat99 +bigcyp1 +bigd0g +bigdaddy +bigdaddy1 +bigdaddy86 +bigdale +bigdave0069 +bigdawg +bigdog +bigdok14 +bigeared1 +biged01 +bigf1202 +bigfish +bigfoot +bigfoot1 +biggdogg +biggestbach +biggie +biggles99 +biggun2506 +bighair +bighat +bighemi +bighen540 +bighugs +bigidiot +bigit +bigjobs +bigk1970 +bigkts +bigmac003 +bigmac15 +bigman +bigmansd +bigmike486 +bignnk +bignose +bigobello +bigoltoe +bigone2001 +bigorneaux +bigos +bigoude +bigpapa1 +bigpenis +bigray +bigred95 +bigredblob +bigrig +bigrig8 +bigsabba +bigshows +bigterd +bigtime +bigtits +bigtroy1 +bigtyme +bigun135 +bigviper +bigworld +bihunsup +biiiiiko +biiteotb +bijoubiu +bijour +bijoux74 +bike +bikeas +bikeman +biken01 +biker01 +biker101 +bikerbiker +bikerpapa +bikette +bikolebi +bil01bo0 +bil0xi +bil274 +bil2kaya +bil456 +bilabong +bilaly +bilancia1 +bilancia8 +bilar +bilbi +bilbo +bilbo1 +bilbo4404 +bilbobagger +bild4e +bilde +bilder12 +bildfuchs +bildschirm +bildung01 +bile19 +bilgee +bilgi05 +biliard1 +bilicojr +biljana +bill +bill +bill steele +bill101 +bill112 +bill123 +bill603 +bill69 +bill9072 +billabong +billabong213 +billabong99 +bille +billi0822 +billie +billie0 +billings12 +billion +bills243 +bills69 +billsuck +billvoss +billy +billy +billy dee +billy green +billy jack +billy kent +billy ray +billy0110 +billy1 +billy1232 +billy202 +billybob0099 +billybob1 +billybob500 +billybob66 +billybob731 +billyboy +billyboy10 +billyboy2000 +billygates +bilmem +biloba +bilocan1 +bilosto +bilsport132 +bilvask90 +bilwukav +bim12345 +bim1994 +bimbam2001 +bimbo +bimbo0217 +bimbo111 +bimboto +bimbotvb +bimmer +bimoe +bimokh +bimomo +bimpfe +bimse +bimsln +bin +bin323 +binaer +binary808 +binbin7410 +binbin8520 +binchen +bindi +bindoten +bindusty +bine2006 +bine679 +binebubi +bineoli1 +bing +bing84 +bingas +bingbing +bingo +bingo666 +bingo7 +bingo8442 +bingojpd +bingol +bingza +binh +binhex99 +binhminh8284 +binkis +binky123 +binladen +binladen405 +binne123 +binnerd +binnie +bino2466 +binsbach +bintang1 +bintang2002 +binza0154 +bio +bio1512 +bio2kitt +bio33584 +bio456 +biob +biocaos +biocratz7 +biodun +biogas +biogen4486 +biohazard +biolink22 +biologie +biologija +bioloids +biomat +biomonte +biondina +bionic +bionicle +bionicle0 +bionicle12345 +bioracer +biosbuch +bioscoop +biosp73 +bioware +bipyva +biraa +bircan23 +birch456 +bird +birdhouse +birdie!5 +birger +birgit +birgit64 +birgit81 +birgitte +biriki +birillo77 +birke1 +birken69 +birkenstock +birkenstrasse +birkinshaw30 +birman88 +birmingham +birne +birne14 +biroute +birsor +birtan +birth +birthday +birthe +birubi +bisa1003 +bisabisabisa +bisadmin +bisatch +bisaxa43 +biscanka +bischoff +biscuit1718 +biserino +bisherbisher +bishop1 +biskra07 +biskus +bismarck +bismilah +bismillah +bisminla +bisnouk +bison0510 +bissso +bistasdu +bisvas +bit-bucket +bit4net7 +bit4net7 +bitanem +bitanesi +bitanga +bitch +bitch1 +bitch143 +bitch16 +bitch2 +bitch269 +bitchho +bitchin2 +bitchno1 +bitchs123 +bitchy +bitchyou +bite +bite69 +biteme +biteme420 +biteme69 +bithao +bitkiller +bitoku +biton12 +bitondo1 +bitqr +bitran +bitskin +bitte37 +bittertea +bitzer88 +biula1 +biulo +bius +biut1425 +bivjk +bivod +bivred21 +biwi1982 +bixian +bixit0 +bixo +biz3rre +bizahmet +bizdnz75 +biziz +bizkit +biznatch +biznes5 +bizzare123 +bizzarro +bj123456 +bj9797 +bj9ue +bjarni1712 +bjc1150c +bjc210 +bjc5b +bjcd0f +bjd8m +bjerges11 +bjfa0778 +bjh2410 +bjhinet +bjhuang +bjjgkmx2 +bjk1903 +bjk1993 +bjlud185 +bjoern +bjoern +bjoho01 +bjork2 +bjorlin78 +bjorn +bjorn +bjorne +bjpetro +bjplu +bjq2w +bjqga8yp +bjs3x55u +bjtki86 +bjtsb8 +bjunicom +bjwj0125 +bjxo9 +bjxxbpgt +bk117 +bk121278 +bk230583 +bk252525 +bk3004ml +bk3009u +bk5804 +bk85md85 +bk98up37 +bkadmin +bkam56 +bkaoc +bkcenter +bkcfgt2v +bkd123 +bkd770 +bkeebler +bkep3y +bket666 +bkhgy +bkk +bkk9mn4q +bkl8g +bkuyu874 +bkworks +bky1860 +bl00d05 +bl00dy +bl00p61 +bl00py +bl0bl0 +bl0ggy +bl0mma +bl0wm3 +bl120981 +bl1btn7 +bl1ckle +bl1nd +bl1sters +bl2IHH +bl3bl3 +bl3nd3r2 +bl47827 +bl4ck0rg +bla +bla123 +bla12345 +bla5t3r +bla7bla7 +bla99ne +blaat +blaat007 +blaat326 +blaatkees +blaatz +blabbo +blabla +blabla00 +blabla00 +blabla01 +blabla11 +blabla12 +blabla2 +blablabla +blablabla4 +blablax1 +blablbb +blablub +blablubb +blac8798 +black +black +black011 +black1 +black123 +black13 +black133 +black1707 +black2727 +black371 +black5 +black82 +blackabt +blackadm +blackadmin +blackbelt2000 +blackbelt7 +blackbelt700 +blackbird +blackbob00 +blackbook1! +blackbye +blackcat104 +blackdeath +blackeagle11 +blackeye +blackfin +blackfire +blackflag7 +blackfly87 +blackgcf +blackguy +blackhat +blackhawk +blackhawk72 +blackhea +blackhole +blackie1 +blackie5149 +blackit +blackjack +blackjack118 +blackmask01 +blackmore13 +blackout +blackout1 +blackrock11 +blackrose +blacksheep +blacksmith +blackspot +blacktiger1 +blackvg +blackwolf9 +blacky +blacky1 +blacky1996 +blackymuschi +blade +blade123 +blade2 +blade3 +bladee +bladefetish +blader17 +bladers1 +bladerunner101 +blades +bladetwink +bladimir28 +bladj2 +blaekdal +blafasel +blafblafblaf +blafuck +blagidan +blago99 +blah +blah0123 +blah1234 +blah212 +blah29ah +blah38 +blah612k +blah6663 +blah7684 +blah96 +blahblah +blahblah98 +blahblahbitch +blahblahblah2 +blahdeblah56 +blahdich +blahhhh +blahman +blahv4 +blahyada +blahz0r +blaine +blaine +blair +blaise +blaj1524 +blake +blakebs1 +blakemore +blakers04 +blakes21 +blakey +blaky78 +blamblat +blamblum +blanca +blance +blanche +blanchette +blanchy1 +blancman1 +blandine +blandine +blandor +blane +blanguita +blank +blank123 +blanka +blapass +blarg321 +blarg42 +blargh +blas1911 +blasen8 +blasfo +blask199 +blasko13 +blaslash +blast +blast666 +blasted667 +blaster +blastermaster +blastoff7 +blastoise9 +blastwarrior +blata87 +blatblat +blatherskite75 +blatte8 +blattela +blau1 +blau1212 +blau80 +blaua +blauauge +blauberg +blauerteddy +blauesau +blauesel +blaumerle +blaupunkt0 +blaurot +blauu007 +blavki +blaz3ing +blaze +blaze123 +blaze2 +blaze420 +blazeable +blazebyron +blazedice +blazen468 +blazers30 +blazin +blda0559 +bldbld +ble101 +bleach90 +bleachforlife +bleb +bleble +blecha +blechm11 +blecting +bledinde +bleed18 +bleepuh +blees01 +bleh +bleh03 +bleherg +blehh +blehness +bleifuss +bleistoft +blekota +blender3699 +blendie +blento +blesk +blessing +blessing105 +blgp8 +blhjm +blhusky +bliad +blick +blickwechsel +bliff +blinck +blindados +blinde4kuh +blindsec +blingbling +blingy +blink069 +blink182 +blink192 +blink9 +blinkblink +blinker +blinkie21 +blinks +blinky07 +blinky22 +blissful +blist +blistex +blistex99 +blitcas +blitrow +blitz +blitzen +blitzgrill +blix109 +bliz +blizzard +blizzard223 +blizzard78 +blizzard915 +blizzeta +bljkyung +bljlz +blklbl +bllabla +bllc7 +blobbob +bloc147 +block +blockbuster +blockgrunt +blocus +blod2276 +blodekuh +bloedsin +bloedtner +bloempje3 +bloempot +blofish +blog007 +blog2006 +blogaritmo +blogblog +blogger +blogis +blogis23 +blogmdp +blogmotion +blogtgae +blomman2 +blommor +blomoris +blomst +blond45 +blonde76 +blondi3789 +blondie +blondine +blondman +blondynka1 +blonskiz +bloo +blood1 +blood951 +bloodbath66 +bloodcai +blooddc +blooddna +bloodflame +bloodgod +bloodis80 +bloodlust +bloodman +bloodraine +bloodrayne +bloodred +bloodschad +bloodscourge +bloodspiller1 +bloodsport +bloodstar1 +bloody02 +bloomer06 +blooper08 +blopel +bloqueur +blorkpie +blossom +blossom +blossom2 +blossom7 +blowblow +blowjob +blowme +blqblq +blqblqlq +blqea +bls257 +blteg +blu3bl00d +blub +blub123 +blubah +blubb +blubb12 +blubb123 +blubb187 +blubb89 +blubba +blubba12 +blubber +blubber25 +blubbl +blubblub +blublu +blubsch +blubvis +blue +blue +blue0002 +blue04 +blue0621 +blue1010 +blue123 +blue1907 +blue1984 +blue2468 +blue2551 +blue2921 +blue42 +blue55 +blue575 +blue5923 +blue781 +blue7eye +blueage +bluebambi +bluebar.1 +bluebear +bluebella +blueberry1 +blueberry99 +blueblue +blueboy +blueboy419 +bluecity +bluecoga +bluedkp +bluedog +bluedr +bluedragon +blueee +blueeyes +bluefox350 +blueissima +bluejava +bluejay722 +blueline +bluemary +bluemchen +bluemick +bluemoon +blueoil1 +blueone +bluepill +bluepill2000 +blueprint +blueprints +bluerichie +bluerock +bluerose +blues +blues2597 +blues66 +bluesboy +bluesgimpy +bluesky0331 +bluesky1158 +bluespot +bluestar +bluetoon +bluff +blughost +blume +blumen +blumentopf +blumk555 +blunar +blunder20 +blunderbass +blundt +bluranger +blurga +blut4t00 +blutegel +blutrausch +blv88vbd +blvc2003 +blya64 +blyers99 +blyes +blythe +bm060392 +bm1962 +bm2006 +bm262 +bm3nal1a +bm4254 +bm60319 +bm67gaio +bm6ok3ov +bm9222 +bmHere +bma2006 +bmail +bmamhz +bmamuda +bmanpj +bmashlum +bmbmark +bmc +bmc1174 +bmcc1001 +bmccabe +bmccss +bmd6x4iw +bmdc1125 +bme87 +bmg1986 +bmhl11 +bminus +bmirtu8w +bmj6iyuj +bmonkey +bmrbmr +bmrsss1g +bmshizzle +bmuallah +bmw +bmw2956 +bmw315 +bmw320i +bmw323i +bmw333 +bmw520i +bmw540i +bmwe30 +bmwkc28 +bmwpower +bmxbiker +bmxmania +bmxmom +bmydz +bn1010gk +bn2006 +bn240dd +bn2c6m +bn32ra +bn417mu2 +bn5773 +bn78p +bnactive +bnd13 +bnhhnb +bni123g +bnldghhs +bnlppkr +bnn0582 +bnn30841 +bnoe9 +bnp44 +bnr296 +bnt358ev +bnvi1987 +bnxxhbbn +bny82mb +bnyuxs94 +bo +bo1o7 +bo2216 +bo23nk +bo25em07 +bo6469 +bo80ri +bo9p45tk +boA45x +boaa1234 +boacaim +boakorean +boanerge +board +board13 +boarder +boardmarker +boardmin +boasorte +boatman43 +boaz +bob +bob +bob landry +bob nolan +bob wills +bob321 +bob379 +bob4542 +bob4557 +bob62140 +bob8989 +boba +boba206a +bobafett +boban +bobana +bobar123 +bobb +bobbana +bobbaz +bobbes42 +bobbi +bobbie +bobbishe +bobbitts1 +bobbl1756 +bobblehead1 +bobbob +bobbobbybob +bobby +bobby +bobby23 +bobbyno +bobbysox76 +bobcat +bobebu +bobeman +bober21 +bobess +bobfire +bobgostoso +bobi123 +bobi7912 +bobic91 +bobieeh +bobifou1 +bobik +bobilo +bobinawa +bobips +bobjuh +bobleylo +bobmarley +bobo +bobo +bobo0507 +bobo28 +bobo3000 +bobo3105 +bobo770 +bobobo +boboboss +boboboy +bobojojo +bobonis +bobories +bobosim3 +boboss +boboyou +bobr55 +bobs +bobsbest +bobsean +bobtail +bobu +bobums +bobumz +bobutes +bobware +boby +bobyy +bocajrg7 +bocamm1 +bocanegra666 +boccio1 +boceta69 +bochat59 +bochumer00 +bocomiti +bocuse +bod74865 +bodan1976 +bodde4215 +bodecki +bodeni +bodger69 +bodiaro7 +bodie666 +bodil +bodington1 +bodo +bodo82 +bodohead +bodom247 +bodowebalex +bodrum +bodrum48 +bodt1696 +bodybag +bodyfit +bodygo +bodytech +bodyzoo +bodzio1 +boeani +boebbel +boeder17 +boeghr +boehmc +boeiend +boeing +boekentas +boemel17 +boendi +boenni +boerhoer +boerje +boewe01 +boewolf +boferj +bofh4211 +bofoking +bogaboga +bogart +bogart1313 +bogdan +bogdan +bogdan55 +bogdanel +boge +bogerass +bogey +bogey41 +boggob +bogibogi +bogoss +bogota1980 +bogotac +bogueroot +bogumil +bogus +boguslaw +boh007 +bohboh +bohdan +bohemian +bohmone +bohtho3 +bohus +boi7777 +boikota +boing6114 +boingo12 +boissard +bojalil +bojan +bojeduge +bojessen +bojie520 +bojinov +bok1bok1 +boka +bokacafa +bokaka +bokcobic +bokie889 +bokmuvar +boksi93 +bokt07 +bol.de +bol10cks +bol4cha +bolade +bolaget +bolbol +bold6 +bolden22 +bolduc123 +bole27 +bole520 +boleh01 +bolek2005 +bolek32 +bolekspiegel +boleslav2 +boleslaw54 +bolet +boletus9 +bolf +bolgilar +bolisgay +bolivia2007 +bolivia44 +bolivo +boljan1 +boll0cks +boll385 +bollabolla +bollek +bollen +boller +bolli +bollocks1 +bollocks2u +bollox +bollspel +bolos83 +bolsena +bolsena2 +bolsevik +bolstein +boltman1 +bom +bom2ber +bomartin +bomb1 +bomb1973 +bomba1 +bombabah +bombaci +bombalo +bombarie1 +bombasko +bombastic +bombe27 +bombe93 +bombel +bomber +bomber35 +bomberman +bombers +bombi +bombinha +bombmanws +bombnigga +bombshell +bombur00 +bomeczek +bomer346 +bomma +bommel +bommel1994 +bommel9000 +bommes12 +bomorona +bon +bonZai +bona1973 +bonaccorso41 +bonadea120 +bonannas +bonapartre +bonar +bonas000 +bonasi +bonaterra +bonawentura77 +bonbon +bonbonka +boncek +boncuk25 +bond007 +bond03 +bond1111 +bond99 +bondgirl +bone +bone2 +bonedher +bonehead +boneless87 +bonerfest +boners19 +bones +bonesval +bonetto1993 +bong +bong +bong soo +bong2045 +bongabe +bongabonga +bongies +bongo +bongo2404 +bongo2407 +bongo5451 +bongo710 +bongs420 +bonhomme +boniek2990 +bonita +bonita +bonita1969 +bonitamavis +bonjody +bonjour +bonjour2801 +bonjourses +bonjovi +bonkas +bonkers +bonni7 +bonnie +bonnie +bonnie98 +bonny. +bono +bono1972 +bonrasu +bonsai +bonsai24 +bonsai509 +bonsai76 +bonsaizwerg +bonskor +bontrou +bonvoj +bonx23l +bonygay +boo +boo67 +boo8hoo +boob123 +booba +boobaa90 +boober101 +booberry79 +boobie +boobies1 +boobman1 +booboo +booboo11 +booboo12 +boobs +bood +boofa123 +boogabooga +booger +booger0 +booger22 +boogeyman123 +boogie54 +book +book2520 +book2867 +book5177 +book771 +bookbillig +bookbook +bookends39 +booker1 +booker21 +bookert +bookholt +bookking +booklist +booksbooks +bookshop28 +bookworm +boom +boom21 +boom22 +boom26 +boom4321 +boomax +boomer005 +boomer030 +boomer3232 +boomerang57 +boomgaard1992 +boomkin100 +boomskin +boon1973 +boon9800 +boondock87 +boone727 +booney29 +boonheng +boonia +booooo +booper70 +boopod +boorple +boosh +boost +booster +boot +boot1324 +boot29 +boot397 +bootboys22 +booten +booth +booth +boothe +bootjack +bootleg +bootlv +boots +boots anson +boots1 +bootss22 +bootstrap +booty +bootzi +booyow +booza123 +booze +boozer1121 +boppvylu +bopteam +boqboq +bor04250 +bor1982 +bor1cua +bora +bora86 +borac +boraerok +boragud02 +borasago +bordel +bordelaise +border +borderline +bordladen +bordstein +bordtennis01 +borecore +bored456 +bored67 +borelioza +boreslaw +borg223 +borg79 +borges +borgo2249 +boris +boris +boris121 +boris123 +boris3 +boris34 +boris369 +boris674 +boris955 +borislav +borisov1976 +borisu +borja301 +borje +borjosin +borkatje +borkbork1 +borkram +borkum01 +borland +borlero +born +born1007 +born1969 +born1991 +born2run +borneo +bornin85 +boro85 +borolino +borracho22 +borracho3012 +borsanet +borusgs +borussia +borussia1609 +borysek +borysek81 +bosco +bosco606 +bosco636 +bosco7 +bose1707 +boseman +boshnag +boskop64 +bosleybutt +boslose +bosman26 +bosonwhir +bosquejo +bosr99 +boss +boss06 +boss2312 +boss46 +boss4bb +boss666 +boss7151 +bossman +bossmann +bossup14 +bostik +bostjan +boston +boston008 +boston9709 +boswell99 +bosxy +bot123 +bot321 +bot7nerp +botai123 +botan +botanik210 +bote +botev57 +bothus1 +botito +botj1234 +botm6 +botosani +botsrogue +bottle3527 +bottone +bouazza +boubi +boubili +boubou +boubou69 +bouboune +boucher444 +bouclier +boudan +boudin +boudin76 +boudou +boufer +bouffon +bougli +bouhbouh +bouk +boulder +boulet +boulet74 +boulevarden +boulix +boulot +boulou1a +boumboum +bouncer +bounty2 +bouo +bourcade +bourgain +bourgogne +bourlem +bournemouth01 +bourneo +boussoit +boutave +bouteille +boutin29 +bouwmeester +bovenste +bovine7 +bovinity1861 +bovist +bow123 +bowbet +bowcow +bowditch +bowen11 +bowflex4828 +bowie +bowie1006 +bowie234 +bowieis1 +bowl1111 +bowl1357 +bowling +bowling1 +bowling200 +bowmore31 +bowser +bowser11 +bowyzvfo +box410 +box448 +box55blt +box913ti +boxcar5179 +boxeren2 +boxers +boxeur +boxie2007 +boxman! +boxoff +boxsterwh +boxxen +boxxer +boy +boy +boy1122 +boy2boy +boy88juw +boyblue +boyd +boyd +boyd red +boyfeet +boyke +boymalas +boys +boys2003 +boyscout +boywonder +boyzone +boyzsuck +boz456 +bozenka +bozhong +bozidar +bozidarka +bozkurt +bozo +bozo +bozo25 +bozok66 +bozone3265 +bozuyuk1 +bp0710 +bp1500pn +bp1980 +bp31909 +bp5472 +bp73ts +bp77fx +bp9co +bpadrkc3 +bpatrick +bpdmf9uw +bpln3f +bpm2665 +bpm28013 +bpm456 +bpn370 +bpnov770 +bpr00f +bpsgirl +bpsv4 +bpt0706 +bpubrko +bpvg7 +bpwargh +bpxe7 +bq083080 +bq9m8 +bqak9 +bqbqepwq +bqkox +bqrkp +bqsj7 +bqu5e +bqvzyqmz +br!tta +br001592 +br00dwar +br00klyn +br0e2 +br0ns4rt +br0ntus +br0ther +br120719 +br12345 +br1300q +br2864la +br3003br +br300801 +br33zer +br3553n +br3jvm47 +br3lgkmgte +br3thren +br400doh +br549 +br57olp +bra8728 +braadworst +brabham +brabib66 +brabus +brabus69 +braccialetto +bracelet +brachy85 +bracken +brackenr +brad +brad +bradette1 +bradford +bradford +bradl3y +bradley +bradley14 +bradlol +bradoc +bradshaw90 +brady0506 +brady9494 +bradyfake +bragjort +brahim +brahle +brahma +braiant +braile +braimee +brain +brain123 +brain344 +brainbug +braindead23 +braindead92 +braine +brainfever +brainfish +brainiac +brains666 +brainy11 +brak +bram +bram2504 +bram7703 +bramble +bramble86 +bramborak +brammetje +brammie5 +bramwell +branch +brandgefahr +brandi0920 +brandie17 +brandiesilva +brandman123 +brandneu7 +brandon +brandon +brandon1 +brandonh +brandweer +brandy +brandy +brandzi +branford +branislav +branko +branko00 +branlooz +brannbil +brant +brap +brasco2k +brasil91 +brasilien +brasima +brasov +brassbua +brasss +brat1002 +brat6969 +brata123 +bratpfanne +bratso1 +bratunac +bratwurst +bratz100 +braunelle +brause666 +brav673 +brava +braveheart +bravenez +braves95 +braview +bravo24 +bravo33 +bravo8424 +bravo9er +bravohai +brayden313 +braz1979 +brazil6 +brazilian69 +brazzo +brcgbrcg +bread6500 +breads18 +break61 +breakbeat +breakbot +breaker100 +breann5a +breanna98 +breannaa +breannac +breanne21 +breasts11 +breathetoday +breathin17 +brebal1 +brebre +brecht34 +breck +brecon18 +brede8 +bredegatt +bredemos +bree +breedst13 +breeze +breezie1 +breezy0505 +brefni +bregan916 +breibe13 +breinded +breitmaul +breizh +breizh75 +brekken1 +brekken321 +brel7678 +bremen +bremen31 +bremer+haven +bren7001 +brenda +brenda +brendalm +brendan +brendan! +brendany +brende1989 +brendell6969 +brenden +brennan +brennan +brenneke9 +brennen2621 +brenner +brent +brent047 +brent1 +brent123 +brent3338 +brentford +brenton87 +brentwood +bresea2 +bret +bretagne +bretonash +brett +brett1511 +brett1984 +brettj2003 +breugel25 +breuvery +brevx313 +brfheirf +brguel +brh41813 +brhant88 +brhkt10 +bri2tta +briafroe +briagha +brian +brian +brian doyle +brian henson +brian poole +brian123 +brian1911 +brian456 +briana16 +brianc +briand911 +brianj1006 +brianna +brianrox +briansumner +briany +briareos +bribabie +bribri88 +briciola +brick +brickit +bridge +bridge25 +bridgebridge +bridget +bridget183 +bridgetta +bridgette +briech33 +brigada +brigaman +brigante +bright +brightmeadow +brighton +brightonroad +brigid +brigid eric +brigit68 +brigitt +brigitta +brigitte +brigitte +brille07 +brillen8 +brillenpass +brillo +brillo02 +brimac +brineedge +brinsley +brintel +brion +briony +brioso417 +brisbane27 +brisk101 +briska300 +briski11 +brister12 +bristoia +brit +brit01 +brita +brita178 +britcult +british86 +britnee12 +britney +britoboy +britorsk +britpass +britt +britta +britta +brittanee89 +brittny7 +brittpub +brix1988 +brix88 +brixel4 +brlulu +brm +brndwrmn +brnswnn +bro03886 +bro3886 +bro8lanc +broa66 +broadband +broadlands +brocarit +broccoli +broch118 +brock +brock05 +brock890 +brock9901 +brocolli +brod +broda513 +broderick +brodex +brodyboy +broek78 +brogsas +broilking +broken +broken7478 +brokensore +broker +brokilon +brolly100 +brolly17 +brollylo +broly0617 +bromanne +brombasse +bromley +bromotio +bron1004 +bron1005 +brona +bronco +bronco billy +broncos82 +brondby1964 +bronislav +bronislaw +bronson +bronte01 +bronwen +bronx27 +bronzen1423 +broodwar +brook +brooke +brooke +brookie186 +brookl1n +brooks +brooks2786 +broono +broplv12 +brormin +broskyna +brot +brot123 +brotherb1 +brotherhood +brothermate +brothers +brotmesser +broto +brouer01 +broussard23 +brout224 +brouteur +browar +browarek +brown +brown27 +browncar +browncow +browneyes1976 +browni23 +brownyn +brownyweb +brozowski +brpqxvz +brqnx +brrdata +brredeaz +brrqf5yh +brtosbtc +bru369 +bruamp +bruce +bruce +bruce meredith +bruce78 +bruce7855 +brucelee +bruces +brucetimm +brudasek +bruderhardy +bruges01 +bruian +bruin +bruin15 +bruinen1 +bruinn28 +bruinos +bruins33 +bruiser +bruiser94 +brujabpp +brujah99 +brujas2374 +brujitar +brull +brumbar +brumm5749 +brumma +brunei2809 +brunella +brunelli +brunetto del +brunfarin +brunflo3 +bruninho120 +brunko +brunnen2 +brunner +bruno +bruno +bruno ve +bruno12 +bruno1941 +bruno20 +bruno54 +bruno60 +bruno64 +bruno77777 +brunohans +brunol27 +brunommc +brunswick108 +bruse +brushes +brusive11 +brusky +bruslia +bruso +brust1010 +brute force +brutel69 +bruto +brutus11 +brux +bruxa03 +brva2782 +bryan +bryan +bryan123 +bryansk +bryant +bryantness +bryce111 +bryce726 +brymic +brynny21 +brzanek +brzuchalski3 +bs0521 +bs060790 +bs100f +bs1805 +bs258874 +bs2811 +bs5678 +bsTerra +bsa1707 +bsa2006 +bsa712 +bsarenex +bsartist +bsas7116 +bsas7117 +bsback +bsbbtl +bsbfixed +bsbjunky +bscats +bscrypt +bsdhf +bse2cjd2 +bsem433 +bsh.2009 +bsh505 +bsi1337 +bsio2 +bsisgr8 +bsjsagar +bsjy2xhm +bslmiabi +bsm1976 +bsmc6e0b +bsp2002 +bspasse +bsports +bspw31 +bss +bste +bstronga +bsu2s +bsw2515 +bswc9 +bswltywb +bswraven +bsxds123 +bt +bt0099 +bt1749 +bt687rd +bt79bt82 +bt7emtuu +bt8r7xpb +bt97bic +bt9wt2 +bta774 +btar2013 +btbp2005 +btbp2007 +btd3txwn +btdcj +btebte +btech252 +btgq12gg +bthvn +btit2004 +btjsj +btkclan +btkfusby +btkk +btle4 +btm2oo8 +btmone +btoe7 +btr111 +btr567 +btscan +btsnrc +btv5026 +bu +bu123654 +bu14bu +bu3um +bu497942 +bu6it +bu970056 +buabua +buahmuah +buba +bubabobo +bubaru +bubastis0 +bubayafa +bubba +bubba1 +bubba123 +bubba17 +bubba1987 +bubba21 +bubba68 +bubba951 +bubbale +bubbas +bubbas01 +bubbeltjes +bubble +bubblegum +bubbleme33 +bubblerap +bubbles +bubbles +bubblezz +bubblys +bubel3 +bubeto +bubi +bubica +bubilein +bubino78 +bubito77 +bubiukas +bubman +bubokas +bubsy +bubu +bubu01 +bubu123 +bubu5661 +bububu +bubulech +bubulina +bucboy +buccaneers24 +buccherese +bucci1 +buccini1 +bucear +bucelea +bucetao +buch0244 +buch210 +buchanan +buchchef +buchfrosch +buchins. +buchjung +buchkaiser +buchkaufen +buchos +buchshopping +buchspass +buchverkauf +buchvirus +buci +bucika +buck +buck001 +buck1ngham +buck3t +buckaroo +buckbuck +bucked +bucket +buckets9 +buckeyes222 +buckfast +buckit +buckley42 +buckleyk1 +buckmuck +bucksfizz +buckshot +bucky8it +bucling +bucs082 +bud +bud osborne +bud4eva1 +budabuda +budak22 +budapest +budd +budda1717 +buddha +buddha03 +buddha334 +buddha87 +buddie +buddy +buddy +buddy1 +buddy123 +buddy180 +buddy420 +buddy632 +buddy9nu +buddydog +buddylee +buddyw +budget08 +budgy123 +budhamer +budlight +budlight666 +budlight99 +budlite888 +budokai15 +budoor +budral +budrys1 +budsgreat +budster +buduka +budvar +budvar21 +budweiser +budyn1414 +budynbudyn +bueak +buecherlis +buecherwahl +buechli +buechse2 +bueni +bueno5 +buenosaires +buenosaires08 +buettino +buff +buff123 +buffalo +buffalo +buffalo bill +buffalo360 +buffaxe +buffer +buffie24 +buffjeff +buffon89 +buffy +buffy12 +buffy80 +bufklc6g +bufo1ufo +bufu8701 +bug +bug17 +bug3519 +bug84ume +bugaga +bugagenz +bugalho1 +bugansa +bugatti +bugblood +bugbug +bugdayci +bugg3r +bugga151 +bugger +bugger0 +buggie05 +buggkung +buggy +buggy7 +buggzy +bugi1205 +bugit +bugle0053 +bugley +bugmenot +bugo +bugra1982 +bugsier3 +bugslife +bugsy2004 +bugwae +bugyc66 +buh1 +buhuuu +buipop3 +buitenspel! +buja0507 +buja5543 +bujangan +bujhm123 +bujinkan +bujzugaz +buka +bukkake +bukleeft +bukowe12 +bukowski4 +buktwild +buldog +buldozer18 +buldozer93 +bulent +buli1 +bulimi +bull +bull151169 +bull1988 +bull1993 +bulldog +bulldog5 +bulldogs1 +bulle +bulleen8 +bullen001 +bullen6 +bullen84 +buller +bullet213 +bulletproof +bullets +bullfrog +bullhead +bullhurley +bulli007 +bulls +bulls111 +bullshit +bullshitter08 +bullshitwow +bulltwin +bully069 +bully0783 +bully1 +bully555 +bully712 +bulova +bultaco12 +bulttk2009 +bulukun +bulwab +bum +bum713 +buma5576 +bumamara +bumb72e +bumbasik +bumbel16 +bumbis +bumble +bumblebee +bumbulis11 +bumby +bumeris +bumfroot +bumhat +bumlove +bummer +bumolab +bumper +bumper90 +bumsenator +bun +bun652 +bunbu +bund01 +bund80 +bundespolizei +bundpol +bundy001 +bundy33 +bunen +bunfi +bunga +bungee +bungee2007 +bungie003 +bunglau1 +bungle1270 +bunke1 +bunker1995 +bunker29 +bunkermc +bunky1965 +bunnabunna +bunniesrainbow +bunny +bunny +bunny lauri +bunny100 +bunny621 +bunny7386 +bunny99 +bunsel +bunso14 +bunta +buntree +bunty +bunyamin +bunz1029 +bupneqex +bupupa +bur12345 +bur99ton +burak +burak01 +burakcan +burakhan +buraksev +burakt1 +buras1941 +burasi +buratta991 +burauen123 +burbo1992 +burbuja06 +burca28 +burcin +burcinka +burcu +burcu54 +burcu81 +burcum +burdens3 +burdur +bureau +bureau01 +burecon +burek +burek22 +burfster +burgas +burgas10 +burgberg +burgenland +burger +burgerking +burgerman +burgess +burghard +burgina +burgman400 +burgsinn +burgundy +burhan12 +burhanss +burhop315 +burk +burke +burkerta1 +burkhard +burl +burlpony63 +burmese9 +burn223 +burn9388 +burnbaby +burndie +burnell +burnfire420 +burngabe +burningxx +burnja +burnout +burnside +burnside47 +burnt123 +buro03 +burr +burr1 +burrito15 +burro +burro200 +bursa016 +burstinc +burt +burton +burton +burundanga8 +bus +bus1397 +busa9871 +busby +busby9194 +buschi123 +buschung +busecik +buseck +busgas +bush2008 +bushan +bushelon +bushey12 +bushido +bushido1 +bushido2009 +bushkrieger +busico +business +busk1965 +busklia4 +busologo +buss12 +bussharry +busshock +bussi +busso +busted137 +buster +buster +buster fite +buster02 +buster224 +buster32 +bustingshots +bustter +busttera +but1811 +but25bet +butaneswin +butch +butcha2389 +butcher24 +butcher714 +butchers959 +butler +butliving +butlma +butlma40 +butra +butraw +butrvb99 +butschi +butt +butt3r51 +buttas +butter162 +buttercup3 +butterfinger +butterfly +butterfly +butterfly1 +butterfly3 +butterman12 +butters79 +buttf4c3 +buttface97 +butthead +butthead2 +butthole +buttmunch +buttplug +buttriks +buttsecs +buttsex +butty +butyi80 +butzeli +buu123 +buvel111 +buxuna +buy +buyanm3 +buzifasz +buzikas +buzinha +buzz +buzz4me2 +buzzen +buzzgurl +buzzly +buzzurro +buzzy +bv1234 +bv130dr +bv7187 +bvb09 +bvb099 +bvbb +bvbbbb +bvbsean +bvcmeteo +bvcxza +bvd2051 +bvdwb +bvffk +bville +bvlgari +bvt4all +bvwhz +bvyucerj +bw2kroxx +bw310775 +bw4bosa +bw570s6h +bw666666 +bw688la +bwadmin +bwana +bwarin +bwb4ever +bwcom +bwf9u +bwfcb0y +bwfhnf +bwhwar58 +bwow05 +bwspss +bwt9t +bwtpdcrp +bwut51f7 +bwwman +bwxj4zsv +bx26q9gt +bx43bY +bxa37 +bxcosmo +bxemdl +bxggg4v5 +bxnxg +bxs72hje +bxtop100 +bxwbk +bxxks +bxy1i +bxy671 +bxyur +bxzacya +by1801 +by1990 +by2alber +byakugen +byayaz +byazdfe +bybbyb +bybiukas +byboy +byc66 +byccfunt +bycodec +byebye +byerly107 +byg66 +byhooked +bykasoft +bykp123 +bykr632 +byku1960 +byloue +bymar66a +byn056 +byng2008 +bynhbuf +bynthytn +byntkc +bynunsky +bynuri +bypass +byrami +byran +byrant +byron +byron barr +byron22 +byronanthony +byronstone +bysrkno +bysteam +byt +byte1035 +byte2300 +bytec1306 +bytelog +byteme +byteme1 +byteme66 +byter +bytfrx +bytfrx78 +bytom +byuspeeches +byy6byy6 +bz104p +bz827aq3 +bzem446 +bzh56360 +bzh666 +bzh7382 +bziama +bzium666 +bzkjl +bzl7f5f3 +bzn3110 +bzocher +bzom55 +bzrou +bzs68bzs +bzsimpson +bztg101 +bzulm +c +c00e2k48 +c00kie +c00l +c0101a02 +c0113g3 +c01333363 +c01be890 +c01c98a +c03web +c071084 +c07h4 +c07y9hv6 +c0876c +c08k88 +c0FF33 +c0a09f +c0aaaa +c0bbl3r +c0bickford +c0bra98 +c0c0n1m0 +c0c0nut +c0c0nuts +c0cac0la +c0ckh3ad +c0d312 +c0d3r +c0d3rs +c0dec0de +c0dehtml +c0donkey +c0ff33 +c0ff5l4n +c0george +c0gl10n3 +c0ke +c0l0nna +c0l0rad0 +c0l0ssu5 +c0l1g +c0l1ne +c0la +c0levin +c0lgat3 +c0m3t65 +c0mb4t14 +c0met86 +c0mm3nt +c0mmerce +c0mpa55 +c0mpaq +c0mpc1ty +c0mplete +c0mpu73r +c0n3x +c0n9c0n9 +c0nan32 +c0nc0n +c0nc0rd +c0nc0rde +c0nchas2 +c0nd0m +c0nf1xx +c0nfuse0 +c0nn0r +c0nstant +c0ntr1tus +c0ntr4s3n4 +c0ntraba55 +c0onkelz +c0pp37 +c0r32008 +c0r4fun +c0rd0b4 +c0rn3l14 +c0rnba11 +c0rps3 +c0silver +c0sm0 +c0spike +c0sty99 +c0ts4433 +c0unt3r +c0w80ys +c100682l +c101101c +c1090034 +c10bc3e3 +c11d13 +c11fford +c11tanel +c1234321 +c12345 +c123456 +c1234567 +c130j +c13670 +c1378f00 +c13anup +c1403n +c14831260 +c149 +c16031437 +c170961h +c1750e22 +c17785 +c1809d +c18488 +c1951901 +c1958web +c1983616 +c19vbj8x +c1Chandler +c1Evelyn +c1a2g300 +c1a2z3zo +c1admin +c1b2d3z5 +c1c2i3 +c1c2p1 +c1cfa933 +c1cruiser +c1fb7e3 +c1freeman +c1guess +c1h2a3d +c1h2a3d4 +c1heather +c1l2o3w4 +c1las6ia +c1mantis +c1marin +c1n3m4t1c +c1normandy +c1nth14 +c1nz1a +c1oUd +c1ph3r +c1ph3r20 +c1pornstar +c1saifun +c1skookum +c1stargate +c1windows +c1x8wdfp +c1xxxxx +c1yzv +c1zidane +c2077676 +c2098765 +c20c438 +c210680c +c21568z +c21a23 +c21e1ca +c2201 +c22403a9 +c22admin +c232748 +c23a63bc +c23e18 +c23r61 +c24702 +c255u +c2567473 +c275504 +c277tacs +c28405c +c28429c +c28ca7fe +c29013c +c297p85o +c29b74 +c2a52f6 +c2achange +c2art +c2benson +c2c7d09c +c2cazzie +c2culture +c2d3b8fa +c2delta2 +c2divya +c2e7d6f +c2fac2a +c2fdd8 +c2finnegan +c2h2o2 +c2h2r2i2 +c2harmist +c2health +c2m6w9 +c2nothing +c2oro +c2paiman +c2pgy +c2t2l2g +c2theboys +c2vbg +c2wlan +c2zeitz +c3089db +c313st1a1 +c32dlufr +c33c727 +c37j9d6 +c3811018 +c3a2a2 +c3b2a1 +c3basics +c3candles +c3citadel +c3d5a8 +c3ddd +c3f14b3c +c3hei +c3inuyasha +c3jeremy +c3k30 +c3l3r0n +c3lorraine +c3nadine +c3nt3rs +c3pgb +c3po +c3pojk2 +c3por2d2 +c3r3br0s +c3s3n@ +c3tl2pqh +c3vodafone +c4044eea +c40505c +c405co +c4086033 +c41w3n +c41w3n14 +c422123 +c4251289 +c42c42 +c447z +c475jam +c4878 +c4Jenke +c4bbq +c4brindis +c4c1ed47 +c4c4 +c4ct1 +c4dnstuff +c4driver +c4ff83b +c4fghgh +c4gurudeva +c4hairy +c4hercules +c4honey2 +c4hotrod +c4irreal +c4james +c4k3 +c4kpoo +c4l1n4z1 +c4lily +c4looking +c4m4r4d4 +c4millay +c4mpfir3 +c4n0tkn0 +c4n4lmp3 +c4nd3i +c4nsqbk7 +c4p3d3 +c4pone +c4pung99 +c4r0l +c4rachael +c4rlito +c4rouler +c4rrc0mm +c4scanner +c4serrano +c4simba1 +c4t5 +c4truffles +c4x40 +c50awk0w +c5102030 +c511b6b4 +c519061 +c51c981d +c51nsw0n +c52ee772 +c5312cef +c532f76 +c535ab98 +c542542 +c543dc3f +c55 +c552106 +c55b279e +c55mrmy4 +c5699323 +c573a55 +c58428r +c58761 +c58942b3 +c5919a4 +c5a6e636 +c5b118e5 +c5bd965 +c5carmen +c5chewie +c5engineer +c5furball +c5kitch7 +c5kobes +c5n +c5q2x2 +c5seaman +c5solaia +c5t0rm +c5winslow +c5wwwww +c6162897 +c618553 +c61cc4 +c6271996 +c627627 +c6315627 +c63479843 +c636g7e1 +c63iYt +c63x79 +c65yibo +c66201250 +c6888888 +c6D6wc +c6Georgy +c6a1be3c +c6aaaaaaaa +c6bhavin +c6dc0afa +c6design +c6dpbg4z +c6eaa +c6ff4423 +c6freedom +c6h12o6 +c6i2n5 +c6jbower +c6juke +c6kittie +c6marylou +c6perfect +c6spencer +c6trinity +c6vpvkw4 +c6xxxxxx +c6zby +c702fe3 +c72c716 +c746e0 +c7570446 +c75j921w +c760bc +c78039507 +c78df1 +c79842f +c7Ki6J +c7a4ed00 +c7a628cb +c7a7t7 +c7a847 +c7adf49 +c7blacksun +c7d8072f +c7daniel +c7dgrds +c7dobson +c7e12 +c7edytka +c7golfer +c7molly +c7ny6v1l6l +c7ozx +c7poetizer +c7rattrap +c7respite +c7sc5 +c7sc6zw1 +c7xpr +c804d8dc +c8059261 +c81953aw +c82b879 +c8550pdv +c8698691 +c86iwzdc +c87654321 +c87ndn2 +c88088609 +c886c56 +c88859315 +c89a +c8Andreas +c8a9w921 +c8barney +c8bfe2 +c8cn2yx4 +c8d9q7 +c8dd3422 +c8defr +c8freder +c8french +c8haslo +c8j8n3 +c8ll1dus +c8rotors +c8sterno +c8trinus +c8x8g +c90075450 +c9107176 +c910j104 +c92805182 +c92ph3yb +c9300002 +c938h +c943110 +c976534 +c9847pl +c989225 +c99859 +c999999 +c9a504 +c9a51a +c9angella +c9b000c +c9bigfoot +c9bulldog +c9c7602c +c9caitlyn +c9default +c9f0a2ea +c9hwuxkp +c9jericho +c9kh35al +c9metcalf +c9out +c9scotch +c9scratch +c9traxdata +c9vitalise +cAthletes +cDpm +cEducation +cEthics +cFt7RE +cIpl4k +cK20570 +cLaRa +cMedia +cMedical +cMr +cOke97 +cPeace +cRacK +cReferee +cSport +cVeterans +cY54hY +ca010106 +ca11away +ca137313 +ca1admin +ca262707 +ca593287 +ca703053 +ca7226 +ca7226th +ca741741 +ca77df3f +ca7enn3 +ca890529 +ca91706 +ca92129 +ca97zo15 +caAnika +caBlack +caFreedom +caLeXm +caPeter +caSMUDGE +caSox4 +caa4da04 +caaa040 +caaainc +caaainc1 +caadmin +caag3636 +caaktds +caarng +caasha +caat654321 +caawj +cab calloway +cabal1 +cabalero +cabalgante +caballero +caballos +cabbage +cabbage911 +cabbar +cabcab3 +cabdots1 +cabedx +cabello +cabezon21 +cabezon93 +cabezonp +cabezuda13 +cabina22 +cabir +caboose304 +caboose543 +cabra33 +cabricorn +cabrihna +cabrio +cabrones +cabu0001 +cac0e +cac87r1 +caca +caca43 +cacaca +cacagila +cacahuete +cacao59 +cacarara +cacaroz +cacat +cacatoes +cacatule +cacca +cacchione +caccia87 +cacenwy +cach69 +cacho +cachorra +cachorro +cacilda +cacka007 +cackman1 +cacmain +cacomsn +cacona34 +cacti +cactus +cactus +cactus0 +cad +cad0415 +cad23 +cadbury03 +caddylein +cadedc25 +cadenb1 +cadetmod +cadetraf +cadilac69 +cadillac+ +cadime +cadlab +cadmium +cadmods +cady1007 +cae123 +caece +caedere +caedes +caeff123 +caeiro1985 +caesar +caesar11 +caf2493 +cafasso +cafcim +cafe +cafe279 +cafe6b7n +cafemi +cafer77 +caff1613 +caff3la773 +caffe73 +caffeolae +caflages +cafm0815 +cag70 +cagalha +cagaste +cagatay2207 +cagcag +cagd9390 +cagdas17 +caged +caggegi +caggiula21 +cagiusi +cagliari +cagnetta +cahit +cai17den +caifu888 +caihui +cailin +caima +caiman55 +cainan06 +caine513 +cainer01 +cainsy +cainvwar +cainweb +caio +caipi9 +caipiran +caironet +caitlin +caitlin99 +caitsith +caiwave +caj25con +cajnice +cak0vec +cak17kat +cak22123 +cake +cake2004 +cakemix999 +cakep +cakey844 +caki +cakicaki +cakovec +cal +cal shrum +cal421 +calabash +calabria +calador +calaelen +calagan +calahorra5 +calamin +calamus +calavera +calbert +calcio1410 +calculator +calculus +calderon +caldja93 +caleb05 +calella +calemino +calfu +calgon +calgrl01 +calheng7 +caliaga +caliber55 +calibos +calibra +calibra2.0 +calibur66 +calica +calico +calidman +califano +califax +califkt +caligaris17 +caligirl +calimero +calimero15 +calina +calinou +caliper01 +calipso1 +caliskan +calistace +calita +calix777 +calkjhg +callace +callandor232 +callas01 +callas1975 +calle1509 +calle99 +callese +callies +callista +callnet +callnet2 +callo +callofduty +callum69 +callum8 +calluna +calode +calontir +calorcalor +calos1 +calpass +calsigov +calstar22 +caltasut +caltrans +calucaden +calude +calumet +calus3r +calvin +calvin +calvin2124 +calvino +calx9 +calychew +calypso +cam4an +cama1eon +camaba +camachoj +camada1 +camaleon +camaleon147 +camali +camaloga +camar0 +camaro +camaro5 +camaro69 +camaro86 +camaro88 +camaro94 +camay +cambeis +cambell +cambiami +cambiar +cambodge +cambodia +cambogia +cambria1 +cameco1403 +camedia +cameku +camel +camel12 +camel123 +camel1411 +camel191 +camel2211 +camel489 +camela +camelias +camelot203 +cameltg +camera99 +cameradc +camero +cameron +cameron1 +cameron1999 +cameron2 +cameroun +camiLLE +camie123 +camilia +camilla +camilla42 +camilla666 +camillaa1 +camille +camille +camillo +camillo +camilo +camilo2747 +caminka +camino007 +camino15 +camino771 +cammie +cammo1 +camodust +camour +camp32 +camp88c +campagiu +campana +campbell +campbell +camper +campervan73 +camping +campione +campofrio +campusero +campy +camryn +camtech1 +can +can1977 +can78945 +canabilla +canabis +canada +canada +canada622 +canada9 +canada98 +canadia +canadian2 +canadian99 +canadiens33 +canan000 +canan1a2 +canapea +canario1984 +canasta1659 +canavis +canawar +canberk +cancan +cancelar +cancelli +cancer +cancerbero +cancun97 +cancuyas +candace +candace22 +candi +candiano61 +candice +candice6 +candida +candida123 +candidate +candiez +candiria +candles27 +candlewax2 +candmed +cando01 +cando1 +candu4u2 +candy +candy003 +candy010 +candy1 +candy1279 +candy4me +candy904 +candygram748 +candyland +candys +canela +caner31 +canera +canercan +canes33 +canhamo +caniko98 +canim +canim123 +canim34 +canimo +canimsin +canimulk +canine82 +canis83 +canisi +canita2 +canius +cankids +cankles +cannabis +cannabis43 +cannonball +cannonc1 +cannotcompute +cano1899 +canon20d +canonal +canond +canossa +canowin +canpogo +canqfy12 +canseco1985 +cantanem +cantcha +canterbury +cantik +cantina +cantona85 +cantor josef +canttell +cantu2202 +cantutu +canuck12 +cao2006 +cao2nima +cao6026 +caocao +caonimei +caos2012 +caos8787 +caosarmy +cap0n3 +cap123 +cap19038 +cap2003 +cap52cem +capa1173 +capa2839 +capablanca194 +capblanc +capcom +capcom22 +capcom222 +capeb +capede +capeji +capekdeh +capisani +capital +capital1 +capitalship +capitan +capitan89 +capitone +capizzle +caplover +capnemo +capoeira +capoeira5 +caposmas +capoutre +cappers +capps171 +capr1con +capri +capri3 +capri837 +capricorn +caprimx5 +caps5302 +capslock +capsule1 +captain +captaingrs +captivat123 +captk1dd +captkirk +capucine +capul1! +capullo +capullon +capzikum +caq1cp2 +caquimon +car +car1 +car1369 +car1eton +car23cre +car24ven +car450 +car4zugu +car512 +car82876 +cara +carablue +carabus1984 +caracara12 +caracas +caracol123 +caracoles +caraculo +carajo +carajo01 +caralho +caram3l0 +caramba29 +caramel +caramella +caramelle +caranda +carapaus +carasacred +carasd12 +caraterra +caravana +carballo +carben05 +carbon +carcadel +carcar2000 +carcare +carchar +card7350 +cardapio +cardew +cardiff1956 +cardinal +cardiology +cardoen +cardy +carebear +carebox +careen1 +carefree +carete47 +careworker1 +carey +carfaaye +carflash +cargobay +carhartt +carhartt1988 +caribbean1 +caribe51 +caric98 +carica +carick123 +carigato +carilo +carina +carinca +carine +carini +carino124 +carioca +cariocas +caris +carisa80 +carisma +carissa0 +carissa90 +caristopher +carito24 +carl +carl +carl alfalfa +carl benton +carl heinz +carl ludwig +carl rogers +carl-gustaf +carl-henrik +carl5757 +carla +carla +carla del +carla18 +carlaam +carlab +carlasol +carlchen +carleemya +carlenec +carlet +carletlouis +carleton +carlijn1982 +carlin +carline +carling128 +carlis +carlitob +carlitos00 +carljr +carljr11 +carlo +carlo della +carlo1809 +carlos +carlos +carlos lopez +carlos ruiz +carlos03 +carlos08 +carlos20 +carlos44 +carlos88 +carlos98 +carlosaz +carlosjr +carlosva +carloswen +carlota +carlotta +carlotta +carlotta2 +carlotta76 +carlsgay +carlson +carlsson7777 +carlton +carlton +carlyb1 +carlyb8 +carlyle +carlym +carma82 +carman16 +carme +carmel +carmela +carmelchen +carmelita +carmelo +carmen +carmen +carmen12 +carmencita +carmencita +carmi001 +carmine +carmody +carneiro10 +carnelas +carnell +carnero1992 +carneros13 +carnevale +carnie59 +carnival +carnivor +carnivores +carnot +caro +caro0002 +caro0107 +caro1988 +caro1989 +caro2605 +caro676 +carocha89 +carol +carol curtis +carol jean +carol-jean +carol1 +carol955 +carola +carola +carolb1945 +carole +carole +carole ann +carole ita +carolee123 +caroli18 +carolin +carolin777 +carolina +carolina +caroline +caroline +caroll +carolove +carolyn +carolynd +carona2000 +carota +carotina +carotino +carp06 +carpathia11 +carpe +carpe diem +carped +carpediem +carpend1 +carpenter +carpet84 +carpi973 +carport +carr3ra4 +carr7iere +carrahee +carreno +carrera93 +carreri +carrie +carrie +carrie clark +carrie kei +carrie5982 +carrol +carroll +carrollton +carros0303 +carrot +carrot17 +carrot42 +carrotarms +carrott2 +carrottop89 +carroz +cars +cars2007 +cars2744 +cars5860 +carsever +carsmine +carsta +carstene +carstensen1 +cart0grafia +cartagenero0 +cartel +cartelim +cartelpa +carter +carter +carter15 +carterb6 +carth1234 +cartier4u +cartman +cartman8 +caruso +carvajal2007 +carver69 +carxclub +cary +cary01 +caryjami +caryl +caryn +cas11lok +cas12345 +cas1kai2 +cas2357 +casa +casa2006 +casa23 +casa248 +casa453 +casa770 +casablanca +casablanca11 +casals11 +casanova +cascade +cascas +cascate +casco111 +case1666 +caser4546 +casesensitive3 +casey +casey +casey1217 +casey3895 +casey4 +casey4152 +caseyjt +caseymeow +cash +cash22 +cash2809 +cashanei +cashcash +cashcr +cashe66 +cashion1826 +cashmone +cashmoney +cashn0w +casi2007 +casi8890 +casillas +casimir +casimiro +casino +casino1 +casino1969 +casino770 +casinoriva +casio +casio12 +casio1887 +casio70 +casio9510 +casiof91 +casioone +casiop +casiour +casmwn +caspar64 +casper +casper1711 +casper814 +caspian13 +caspie +caspo2 +casriva +cass county +cass1097 +cass1204 +cassac +cassandra +cassano +cassanova +casseh +cassette +cassidy5436 +cassie +cassie3039 +cassiezz1 +cassini +cassino07 +cassio +cassio08 +cassiopI +cassiopeia +cassius +casson +cassowary1994 +cassy +cassy1980 +cast3r +cast78 +casta21 +caste12 +casteel2 +castellah1 +castellano99 +caster428 +castikil +castillo +castor16 +castores +castro +castro sendra +castulo +casyan +cat +cat112 +cat1606 +cat1joke +cat200 +cat256 +cat2peg +cat2vat +cat6003 +cat7274 +cat975 +cata +cata16 +cata77 +catacata +catacomb +catacry +catala +catalanc +catalin +catalina +catalina +catalina96 +catalogo4215 +catalogue12 +catalory +catalyst28 +catan +catapult +catbbhoo +catch447 +catchfif +catcrush +catdog +catdog +catdog07 +catdog139 +cate +cateaport +category +catel +catenotest +caterina +caterina +catering +caterpillar +catervas13 +catfish +catfish82 +cath860 +cath8603 +catharina +catharina37 +catharine +cathecat +catherina +catherine +catherine +catherine mary +catherine1 +cathleen +catholic69 +cathryn +cathy +cathy lee +cathy15a +cathy622 +catinas10 +catinthehat +catlover6 +catmouse +catracho +catrident +catriona +cats +catsch +catsloup +cattle215 +catty04 +catulo +catwood +cauchemar +cauf89 +cause22 +causio +caution +caution1 +cav1954 +cavaliers +cavalo +cavan +cavan +cavanagh12 +cavanaugh +cave1902 +caved0g +caveman +caven +cavern12 +cavicchi42 +cavigiaa +cavolo2 +cavtat6 +caw1975 +caweeks +cawhitney +cawley123 +cawmlm +cawzumog +cay +cayici +cayitito +cayman1 +caz389tz +caza12 +cazden +cazim67 +cazywvus +cazzo +cazzo1234 +cazzona +cazzone +cb093796 +cb162175 +cb16e996 +cb1a2b3c +cb2485 +cb2830 +cb3108 +cb3398hg +cb3cbe00 +cb47ctr8 +cb5702 +cb5c22 +cb6363 +cb657ha +cb8iu +cb93aa +cb94d9 +cbaF +cbadmin +cbangel +cbb146 +cbb99 +cbbbbz +cbc1350 +cbc7fe24 +cbcvbdfg +cbdoyle +cbeka +cbf0a441 +cbg09abi +cbhv351 +cbhyvnx1 +cbidems +cbivcc +cbj56 +cbjones1 +cbl001fr +cblairme +cblinkin +cblions +cbm125 +cbmalaga +cbmayall +cbmc2s3r +cbmcbean +cbmcbm12 +cboa +cbolo4i +cbpne +cbr1000 +cbr600f2 +cbr600rr +cbrlry +cbrosse +cbrvfcby +cbs +cbsavt83 +cbskulls +cbspanien +cbspirit +cbt73y +cbx550 +cbzubv +cc0849e6 +cc11cc +cc1221 +cc150599 +cc155610 +cc1890 +cc23e8 +cc2aa2bn +cc32164 +cc3yy +cc417eg +cc44llkk +cc71773 +cc72698 +cc7878 +cc830716 +cc840111 +cc8542ob +cc881991 +cc904a +cc98802e +cca1q2ds +cca462 +ccaa12 +ccarnold +ccbe26p +ccblissy +ccblub +ccc +ccc074 +ccccc +cccccc +cccccccc +cccp666 +cccp74 +cccristian +cccvvv +ccd0e90b +ccd580 +ccd815fa +ccd9853c +ccddewar +cced297 +cceeaadd +ccfcccfc +ccfd1 +ccff4ff5 +ccg +cch4 +ccheadshot +cchunyen +ccivs123 +ccjuniper +cck000 +cck2002 +ccl1734t +cclance +cclean +ccmap +ccmdas +ccmw812 +cco5877 +ccoo +ccoupe007 +ccpa1978 +ccpauls +ccpower +ccq6p +ccqldqe +ccro1275 +ccrp1064 +ccrulz +ccsharma +ccterra +ccthepee +cctv +ccusle +ccuzzg +ccvcc +ccvdppab +ccvoodoo +ccvuws +ccwkpxwq +ccwordpass +ccwurm +ccyvavy +cd014m11 +cd10576 +cd111111 +cd123456 +cd1313 +cd1c554d +cd205aroma +cd220502 +cd2b89 +cd3233 +cd360991 +cd424765 +cd4ever +cd6020 +cd6340 +cd7766 +cd7vino +cd910 +cdChaos +cda13175 +cda393f +cda98435 +cdaaron +cdaction +cdad5249 +cdazav4 +cdb8154 +cdbluesky +cdbyteme +cdc3ef89 +cdcali38 +cdcd +cdcotton +cdd2eda9 +cdd3610 +cddo +cdducks +cde321 +cdezaq +cdfa2354 +cdfatpig +cdfvbghn +cdga13 +cdgfx47i +cdgnet +cdhmls +cdi5774 +cdjb7l6 +cdjilly +cdjixsko +cdkey1681 +cdkh2478 +cdknario +cdm10 +cdoyle86 +cdr1700 +cdr180 +cdr327 +cdreipo +cdroma +cdromm +cdrw80 +cdrwbtc1 +cdrwcdrw +cdspelen +cdspill +cdtnbr +cdtoyota +cdtvcv +cdtxrf +cdum +cdumit +cdv1985 +cdwriter +cdx534 +cdxc780 +cdzander +ce0168x +ce0188 +ce0924 +ce101101 +ce1wvlsv +ce240374 +ce2ohaqy +ce35chfs +ce3fe +ce581001 +ce628212 +ce6rttqn +ce90c727 +ceadmin +cear5962 +cebdufid +cebelcek +cebi15 +cebreanna +cebula +cec +cece0008 +cecelia +cecella +cecenul +cecfaq +ceci4599 +ceci7600 +cecil +cecil4588 +cecila +cecile +cecilia +cecilia +cecilie2412 +cecilio +cecillia +cecily +ceclass +ceclet +cecmigz0 +cedaeyy +cedange +cedar +cedark +cedebird +cedepos +cedgro +cedha4 +cedpen +cedraxze +cedric +cedric1993 +cedrik23 +ceduetto +cee +ceecis +ceeeeeem +ceekie +ceenuaa +ceescees +cefaciba +cefernando +cefs44 +ceg2002 +cegep00 +cegido +cegredo +cegthvty +ceh3680 +cehappyday +cehennem +cehpugaj +cehtx +cejge55t +cejk982 +ceju7ki8 +cekfvbnf +celal21 +celalg +celandr1 +celarent +celber +celdamage +celdoran +celebi +celeborn +celebr8 +celer123 +celerino77 +celeron +celeron11 +celeron2 +celeron42 +celeste +celeste +celestial84 +celestine +celevra +celfire +celia +celia1994 +celiathecat +celica79 +celina +celina09 +celina5 +celine +celinede +celinepoisson +celisoft +celka300 +cell3200 +cell8169 +cellat1099 +celle7 +celler14 +cellphone +cellulare +celmon +celos888 +celso +celsopro +celtic +celtic06 +celtico7 +celtik1993 +cem2 +cem89ada +cemangonel +cemballo +cembeg +cemcem +cemento +cemgsm +cemocan +cemoweda +cemreoz +cena619 +cenar +cenda81 +cenderoh +cendrillon! +cengo +cenin1 +cenk5021 +cenkbey +cenmaweb +cennet +cenovis1 +censura +cent0606 +centaur +centaure +centauro +centenial +center +center#0 +centerline434 +centerq1 +centfois +centi22 +central +centre79 +centrocampista +centrum +centrum0 +centurion +ceo111 +ceolcp +ceomas99 +ceonux +ceoqat06 +ceoqzjwd +cepascal +cephillip +cepse2 +ceptera +ceq6e +ceqhobog +cera1206 +ceramic +cerasta +cerbe202 +cercasa +cereal +cereal99 +cerebellum34 +cerebus78 +ceren +ceres2006 +cerise60 +cerla +cermallo +cernet +cero1907 +ceromex +ceronte +cerradura +cerro78 +cersoc +cert +cerule11 +cerveza +cervin +cesa10 +cesa8482 +cesar +cesar0815 +cesarcas +cesarcro +cesare +cesare +cescully +cesena91 +cesio500 +cesnapper +cessna67 +cessna93 +cessy26 +cestmir +cestoup +cestro1 +cesur +ceszek +cet987 +cetecma +cethecat +cetravis +cev9a +ceverbatim +cevo +cevpv +cevyn777 +ceyenf20 +ceza +ceza311 +ceza6233 +cezaceza +cezalper +cezar +cezaro +cezdb +cf0920 +cf1081 +cf1968 +cf1bb2 +cf269001 +cf44977 +cf4f1cdb +cf4sl1q5 +cf657863 +cf772288 +cf9008 +cf91264 +cf9c9HC941 +cf9df4d0 +cfCarolyn +cfNWT +cfQsTD +cfa086c +cfa1yxhk +cfalakazam +cfb123 +cfb91081 +cfblondie +cfc +cfc4ac +cfccfc +cfcesars +cfd4715 +cfdiscman +cfdrouin +cfdsjluj +cff5964 +cffb00 +cfflyfish +cfg42119 +cfhjxrf +cfhlm +cfjustdoit +cfl06 +cflrq +cfmangere +cfmmix +cfmvT +cfn753 +cfnfyfc +cfnl1973 +cfond123 +cfonwar +cfpooooo +cfretard +cft159 +cft6yhn +cftg398 +cfv7xzhf +cfvfhf +cfwipeout +cfwsp +cfyby +cg22595 +cg4z9pua +cg7rjjqb +cganinat +cgcarus +cgcc123 +cges1302 +cggj +cgh898989 +cghkm +cghp2z38 +cgiperl +cgk456 +cgku +cgma2510 +cgnxz2 +cgorshin +cgv6q3 +cgv8v +cgvmp9ge +ch'eng pin +ch00k +ch00pa21 +ch09wh57 +ch12345 +ch123456 +ch123y +ch12400 +ch191279 +ch198702 +ch1ctdz +ch1roh +ch1rp23 +ch33s3y +ch33ser +ch33t +ch3ch2oh +ch3cooh +ch3rub1n +ch415985 +ch471982 +ch4l0tt3 +ch4mb3r +ch4ng3m3 +ch4rb3l +ch5037me +ch580216 +ch611230 +ch620327 +ch6346 +ch7ge +ch8009 +ch84l0oe +ch8920an +ch8ttt +ch91709 +cha +cha0zz +cha23put +cha2503 +cha68f13 +chabelis +chaberbo +chabert +chaboya +chabrou +chacal +chachacha7 +chackie +chaco2 +chad +chad103 +chadafm +chadaki +chadders +chaddino +chadeux +chadhaha +chadjo +chadley115 +chadschads1 +chadt +chagari +chagra +chahra +chai9999 +chaibar2 +chaim +chain +chains +chainy18 +chair +chair69 +chakib +chakotaz +chalin +chaline +challe11 +challeng3r +chaltron +chamalow +chambchamb +chamberx +chameau +chami67 +chamierd +chamkar +chammyrick +champ123 +champ169 +champion +champion the +champions1 +championship +champs25 +champus +chamroon +chamsiin +chan +chan king +chan pa +chan wai +chan yu +chan1511 +chan88 +chanDler +chana +chana18 +chance +chancla +chanda1 +chandana +chandas7 +chandler +chandler532 +chandra +chandra +chane123 +chanel1982 +chang +chang +chang hua +chang son +chang3m3 +changdao +change +change1 +change69 +change84 +changed +changeit +changeme +changeme +changeme004 +changer +changer16 +changes +changethis +changlee203 +changsta +channel +channels +channie92 +channing +chano +chantador +chantal +chantal +chantal6 +chantel999 +chantelle77 +chanty1 +chantyl1 +chanuco +chao +chao +chaos +chaos1 +chaos1133 +chaos2001 +chaos217 +chaos27 +chaos666 +chaos99 +chaosauger +chaose +chaoslord666 +chaosval +chap +chaparral +chaparri +chapel813 +chapelle +chapi72 +chapita +chapman888 +chappel +chappy +chapstick +char444 +char84 +charLOTTE +charanj4 +charcil +charcoa1 +charger +chargers +chargor +charia +charice +charidan +charikila +charito +charkie2 +charlaine +charleen23 +charleene +charlene +charles +charles +charles bud +charles buddy +charles chio +charles croker +charles edward +charles emmett +charles gordon +charles hill +charles honi +charles lloyd +charles martin +charles nelson +charles red +charles1119 +charlet13 +charley +charlie +charlie +charlie martin +charlie2814 +charlie288 +charlie8 +charliegizmo +charline +charlita +charlockv1 +charlot +charlot2 +charlotte +charlotte +charlotte81 +charlton +charly +charly +charly1992 +charly24 +charly411 +charly99 +charmain +charmant +charmed +charo +charon +charrington +charro69 +charrua00 +charu bala +charvel89 +chas5176 +chase2595 +chase710 +chassot +chat +chat1oda +chat4u +chat6771 +chatchat08 +chatfreak +chati +chatnaz +chato618 +chatori +chatterton1 +chaumas +chauncey +chava1979 +chavalit +chave98 +chavez55 +chayito1989 +chaz0t +chazhead +chb0211 +chb4h +chblasde +chc5ut2h +chdasa +chdbj +chdca1 +che +che3se +chea +cheapsh0t +cheaters +cheats99 +chebeague0 +cheburek +checco +chechen +chechevitsa +chechk0 +check +checka99 +checkbox63 +checker +checker! +checker34 +checkersn +checkit +checkpw +checoen +chedd2te +chedder142 +chee8407 +cheech +cheech +cheefatt +cheer up +cheerespe +cheese +cheese3 +cheese3277 +cheeseburger +cheesemon1 +cheeses132 +cheesy +cheetara1 +cheeweeg +cheezit +cheezit5160 +chef +chef +chef0815 +chef13 +chef87 +chef9744 +chefbb +chefchen +chefdildo +chefe06 +cheferik +cheffe1954 +cheffvin +chefin +chefkoch77 +chefsache +cheggaa +cheick +cheik +chekit7 +chekmatei1 +chela +chela +chelcie +cheldo +chelito123 +chelo +chelo98 +chels22 +chelsea +chelsey +chem920 +chemeck +chemical1 +chemie +chemii +chemin +cheminot +chemistry +chemmiko +chemnitz88 +chemo +chems +chems +chen +chen +chen bor +chen man +chen sau +chen0000 +chen0610 +chen0624 +chen0918 +chen1019 +chen1680 +chen4246 +chen6516 +chenbro +chendroj +chenery5 +cheng +cheng fu +cheng65 +chengducw +chengjie +chenhong +chenjing +chenkuan +chenn +chennue +chenry72 +chenxiong +chenzone +cheo777 +cheops +chepassa +cher01 +cher128 +cherdadm +cherem +cheri +cherie +cherie1810 +cherie1965 +cherie2 +cherie69 +cherng12 +cherokee +cherokeerose +cherry +cherrypie +cherva71 +chery +cheryl +cheryl63 +chesa1234 +chesnok1 +chesscat +chessflash +chesta22 +chesta2892 +chester +chester1 +chestnut49 +chet +chetos25 +cheu3680 +cheung +cheval +chevaliers +chevallier +chevalo +chevere +chevey00 +chevi +chevrolet21 +chevy +chevy4 +chewba +chewbacca +chewbaka91 +chewy +chewy384 +chewyman +chex0059 +chey +cheyenne +cheyenne4711 +chez7chez +chezeree +chi2005 +chi6180 +chia8592 +chiahan99 +chiaki +chiang +chiang0907 +chiara +chiara22 +chiarina +chiauchiau +chibichi1967 +chic +chica +chica1 +chicago +chicca55 +chicca85 +chicco +chicha12 +chichako +chiche +chichi +chichi1209 +chichorey +chick +chick +chicken +chicken1 +chickenman14 +chickens +chicklet122 +chicks420 +chico +chico +chico93 +chicony +chidomil +chief +chief +chief big +chief blue +chief dan +chief jay +chief john big +chief many +chief thunder +chief tunder +chief white +chief3463 +chief86 +chiefs12 +chiefs4242 +chieko +chiemsee +chien +chien hsiae +chiff458 +chigephy +chiha508 +chiharu +chii2k +chikage +chikevin +chil +chile +chileno +chilez06 +chili +chililitah +chill +chill3r1 +chilla92 +chilli +chillichilli +chillin1 +chillmofo +chilln +chills +chilltechno +chilly +chimboz +chimdada +chimera109 +chimera78 +chimichanga1 +chimmo +chimp1337 +chimpies +chin +chin chih +chin00k +china +china5 +chinabbs +chinaboy +chinabuses +chinadit +chinara123 +chindis +chineme +chiner01 +chiney50 +ching +ching +ching wah +chingford99 +chingwah +chingy8 +chinh123 +chini1 +chinita +chink +chinman +chinni +chinoah +chinois69 +chinomo +chinping +chinq44 +chintoh +chinzia +chip +chipboy +chipi22 +chipie +chipie57 +chipiron +chiplord +chipmuk +chipper +chippewa +chippsy +chips +chips328 +chips72 +chipset1100 +chipsmongo +chira98 +chirayu +chireo +chirine ed +chiro0407 +chiro1895 +chiro2010 +chiro3656 +chiro4u +chiro7 +chiromed2 +chisaii +chisao76 +chishu +chislaine +chispa1909 +chisposo +chita +chitiet +chito +chitwood +chiu ah +chivani3 +chivo91 +chixing +chiyoko +chizuko +chizuru1 +chizurus2 +chizzle24 +chkdsk1 +chkhdz +chlebek1 +chloe +chloe +chloe1 +chloemay +chloer56 +chloes +chloez +chlol +chlorom +chlrul3z +chltksgk +chlu9meo +chmi1012 +chmielaq +chnouky +cho +chobitS +chobits +chobits7 +chocaholic +chocapic +chocho +choco +chocoat +chocobo +chocobo420 +chocolat +chocolate +chocolate8 +chocolates +chode92 +choen123 +choi +choi7767 +choice. +choicecut +choichiro +choirin +chojrak2 +chokej +choklad123 +chokladen94 +chole1 +cholgas +cholo +cholu09 +chomP1 +chomik +chomik83 +chompas1 +chomper86 +chon2002 +chona3124 +chong2002 +chongho +chongim +chonner1 +choo41ex +choochi +choomith +choosri +chop2005 +chopin5611 +choppa88 +choppah4 +chopper699 +choppers +chopperswc +choppy23 +chops +chor68 +chorbet +chordy +chorn +chorwat666 +chose2 +chosen1 +chosito +chota +chotaro +choti +chou +chou1218 +choumine +choupette3 +chow tan +chowchilla +chowcowz +chowmady +choya72 +chp123 +chp1ca +chr1109 +chr129 +chr15513 +chr15t0pher +chr1st0f +chr3812 +chr89 +chralv10 +chrille200 +chrille21 +chris +chris +chris pin +chris willow +chris-pin +chris1 +chris123 +chris153 +chris1702 +chris2206 +chris23 +chris25 +chris3007 +chris3991 +chris4657 +chris640 +chris87 +chris92 +chrisb3 +chrisco87 +chrisdl +chriseid +chrisf +chrisi +chrisi11 +chrisi13 +chrisi14 +chrisj12 +chrisma05 +chrisole +chrisos01 +chrispy1 +chriss +chrisser +chrissi +chrissi79 +chrissx2 +chrissy +christ +christ +christ01 +christ2541 +christa +christa +christa gail +christa3110 +christa56 +christeael +christene +christer89 +christian +christian +christian1 +christiane +christie +christied +christin +christina +christina +christine +christine +christine510 +christione +christl1988 +christmas +christo +christof61 +christoffer87 +christoph +christoph +christophe +christophe12 +christopher +christopher01 +christopher666 +christos +christreet +christu +christy +christy +christyv1 +chrisu +chrisvb6 +chrisx +chrisyee +chrisz +chrmel +chroedder +chroma +chromos +chron0 +chronic +chronic2388 +chronicles +chrs7365 +chrtaflo +chrum +chrxt1na +chrysali +chrystin +chrystus7 +chs082 +chs0973 +chsittig +chtitha +chtr1543 +chtw1927 +chu +chu chu +chu'eng +chuan9 +chuancho +chuancho5 +chubaka +chubbs316 +chubby +chucha +chucheux +chucho +chuchu +chuchu10 +chuchu39 +chuck +chuck +chuck74 +chuckalucka +chuckeh +chudesa +chuds2110 +chudy +chuhuo +chuimei +chuipala +chuj +chuj5 +chukhawebsite +chulis12 +chulosa +chumaco +chumas213 +chumbawumba7 +chumfm +chumpp1 +chumpy +chumwich +chun +chun8688 +chunchuna +chunda +chunk3987 +chunky01 +chunky11 +chuonglc +chuot08 +chupa +chupa23 +chupala +chupala4 +chupalo +chupamel +chupamela12 +chuprex +chuqui +church +church +churchill +chus +chuschus +chuso47 +chutima13 +chuvak +chuverex +chuyito +chvchv +chwdp +chwe9846 +chyang +chyba123 +chyp9 +chzv7 +ci1stluw +ci5 +ci7677ma +ciPcia32 +cia7m2tj +ciacia +ciadbp +ciaisgay +cialdina +cianni +ciao +ciao +ciao007 +ciao79 +ciaociao +ciaodame +ciarin +ciaterra +ciauz +cibaikia +cibale11 +cibc1w +cibe000 +cibei +ciber +ciberlud +cibernetica73 +cibernos +cibmr +cibubur +cic1jiej +cica2121 +cicakman +cicci +ciccia +ciccibu +ciccio +ciccio +ciccio79 +ciccione +cicekli +cicely +cicero +cichanowski85 +cichlidae +cichy8 +cici +cicicici +cicik6 +cicina +cickann +cicklow +cicko999 +cico1974 +cicomico +cicoto +cicuska +cidcz +ciddit +cidms +cidnie +cidon1234 +cidumo6 +cidve +cidwusat +cieciu +ciel1977 +cielia +cielo1 +cielo123 +ciencias +ciepap +cieslakc1 +cieyoa6i +cigalko +cigans +cigarman +cigars +cigcalaj +cigdems +cihacker +cihan +cihan +cihat448 +cihatdagli +cijfer +cikesito +cikuera +cilgin +cilous +cim +cima1956 +cimbi +cimbom +cimbom90 +cimeries +cimlenit +cinali +cinatit +cinciallegra +cincin +cincin22 +cinder6259 +cindi +cindy +cindy +cindyhasi +cineclub +cinema5 +cineplexx +cingular +ciniak +cinim0d +cinnagnome +cinnasam +cinque +cinta +cintaqu +cintia +cintia11 +cintia16 +cinu +cinzia +cipa1234 +cipa2824 +cipadu +cipanek1 +cipcia +cipcis +cipe +cipherr +cipka1234 +cippa5 +ciqp6 +cique00 +cirby +circa11 +circa924 +circle +circuito77 +cirehilbert +ciresica +cirion +ciripaha +cirkelll +cirmed +cirmihti +ciro +cirocco +ciroga54 +cirolone +ciroporno +ciroreal +cirrus28 +cirrus74 +cis +cis6715 +cis84u77 +cisc001 +cisco +cisco123 +cisco16 +cisco677 +cisco999 +ciscocisco +ciss1962 +cissrox +cissy +cistsoft +cisum2009 +citcat +cithec +citizenw +citlili +cito +citopan +citrin95 +citroen407 +citrom +citron +citrone1 +citta555 +citty13 +cituaar +cityfire +cityh +cityhall +citymanager +cityserv +ciucicu +ciud33 +ciud3306 +ciudad +ciugam6 +ciulla3744 +ciulpkbb +cium666 +ciupino +ciuppo00 +ciuy1 +civ04 +civ62wro +civ654 +civciv +civic1031 +civic22 +civica +civiceg3 +ciwan +ciwana +cix13 +cizubv +cj122393 +cj140477 +cj170377 +cj1ygfqk +cj31dog +cj3tv81f +cj456456 +cj51151 +cj690622 +cj880407 +cjad5645 +cjay1957 +cjb1230 +cjb1940 +cjcbnt +cjcfs +cjd2004 +cjdd +cjdr91 +cjfarmer +cjff +cjgp253 +cjhjrnhb +cjkzhbc +cjlnje +cjones1992 +cjrhfn +cjuvw +cjvacjva +cjvdmaas +cjwbj21 +cjxkjjc +cjytxrj +ck00148 +ck112099 +ck1223 +ck1too +ck300882 +ckcai313 +ckerisfi +ckfdbr +ckfdbyf +ckfwz +ckgtl +ckh0933 +ckight90 +ckj7y +ckl4856 +ckllov +ckloug +ckm1a +ckm5593 +cknoener +ckr1ckr1 +cks +ckt58 +cktimo +ckvans +ckw7359 +ckwr9 +ckwv24 +ckx727 +ckxw8 +ckygty +ckyphoto +cl0718 +cl10 +cl1t0r15 +cl2006 +cl2833dk +cl4440 +cl5afp1y +cl780508 +cl7au2d0 +cl7stdn8 +cla194 +clacarch +clacavac +claced85 +clad84 +clades +claes +claid64 +claire +claire +claire11 +claire8 +claire80 +claired +clairedu +clairette +clairon +clam39 +clamic +clamsauce +clan007 +clan5454 +clanbase +clanbot +clancy +clancy +clanfr +clangclang +clangk +clank0197 +clanmous +clanpass +clanwar +clanwolf +claoli +clar1369 +clara +clara +clara kimball +clara1982 +clara20 +claramae +clarawieck +clardy +clare +clare9266 +clarebare +clarence +clarentia +clarice +clarines +clarinet23 +clarion74 +clarissa +clarita1008 +clarity05 +clark +clarke +clarmaple +claro +clas8396 +clasav87 +clasens +clash +clasik +class +class180 +class84 +classe +classic0013 +classic9 +classless$ +claud +claud123 +claude +claude +claude earl +claude moore +claude-oliver +claude00 +claude01 +claude7914 +claudelle +claudetle +claudette +claudi0 +claudia +claudia +claudiakauft +claudianoah +claudiariva +claudine +claudio +claudio +claudio garcia +claudio54 +claudioa +claudiov +claudito +claudius +claudius1690 +claura770 +claus +claus benton +claus-deter +clauseaa +clausen22 +clausius +clauster83 +clave +clave23 +clave27 +clavesg1 +clavito +claw12 +clawhammer +clay +clay11 +clay12 +clayan21 +clayfeet +clayke +clayton +clayton95 +clb0178 +clbchaos +clc06 +clcs1117 +clea +clean2004 +cleaner +cleartext +clearviews +cleavant +cleaver5555 +cleavon +cleg1993 +clegg +clelia +clem +clem1305 +clem3012 +clemence +clemence12 +clemens +clemens +clement +clemente +clementine +clemi +clemmy +clemni +clemos +clems34 +clemson +clemtruc +cleo +cleo1 +cleo1310 +cleo2727 +cleocin1 +cleofuck +cleoline +cleopatra +clessan +cleta1 +clete +clete roberts +cletus +cletus78 +cleve +clg473ec +clg6502 +click280 +clicked3 +clickpro +clickz +clidu +client +cliente +clienti +cliff +cliff +cliff88 +clifford +clifford +cliffton89 +clifton +cliftons1 +climax +climb9582 +climbing +clinika +clinks81 +clint +clint1313 +clinternal +clinton +clinton +clinton2 +clioram +clipe +clipper501 +clit69 +clive +clivey12 +clkin1000 +clli3 +cloart +clochette +clockin3838 +clockwork +cloclotiti +cloe31 +cloey707 +clogie +clone141 +clone17 +clone3 +cloner +clonewar +cloney +clonghi +clooney01 +clorets +cloris +close +close321 +closingtime +clotilde +cloud +cloud056 +cloud1 +cloud270 +cloudcloud +cloudeth1 +cloudpak +clouds +cloux74 +cloveclove +clovis +clovis74 +clovishigh +clown11 +clownfish +cloyce +clqc28 +clrogers +cls59136 +clsdir12 +clsxpc00 +clu +cluaude +club +club100 +club1210 +club1934 +club2006 +club3d +clubchem +clubic29 +clubland4 +clubwing +clumei22 +clumsy +cluster +clvks2x5 +clwdvj +clwq5 +clx0u +clx8y +clyde +clydus15 +clynnj +clytie +clyton +cm010259 +cm1308sc +cm1573 +cm254 +cm3030 +cm54219 +cm751et1 +cm93 +cma2005 +cma4azqz +cmacma +cmartens +cmbasic +cmcmdc +cmd3 +cmdayt +cmdkeo30 +cmelo +cmgt01 +cmh87859 +cmi8330 +cmij +cmki28gk +cmkrav +cmlrsdf +cmm5696 +cmndyp +cmoi714 +cmors +cmos4000 +cmproj +cmpw5 +cmqd9111 +cmro81 +cms +cms1722 +cmsadmin +cmsfr +cmsheld +cmslq9 +cmsucks +cmt0406 +cmtcp33 +cmxz6 +cmyk1113 +cmyk27 +cmysmy +cn181ak +cn1draft +cn26jay +cna1997 +cnaepoch +cnarf59 +cnbcms +cnbrates +cnbvncnv +cnd123x +cnels88 +cnet2529 +cng43v3r +cngcst78 +cnjgcnjg +cnjznm +cnk9yrm8 +cnmhtcdn +cnnmbc2 +cnpicdc +cnps7000 +cnqianqian +cnr63lff +cns0526 +cnsu154a +cnthdf +cnuddeke +cnwdisc +cnx35p +co +co +co001l5 +co1423co +co25ho +co3al27 +co4binc4 +co728bdi +co7mam16 +coa2008 +coach123 +coachl +coadmin +coal123 +coala +coaly2 +coandai +coaster113 +coatesb1 +cob2100 +cob4l4gi +coba +cobain +cobalt2627 +coban100 +cobo0816 +cobofebo +cobra +cobra148 +cobra21 +cobra427 +cobra905 +cobraii +cobrass +coburg +coby0850 +coca70 +cocabi +cocaco1a +cocacola +cocacola2 +cocaina +cocaine +cocaine103 +cocazero +coccinella +cochon59 +cock +cock69 +cockerjo +cockerlui +cockfag +cockhead +cocki +cockman08 +cocks +cocktail. +cocky2 +coco +coco +coco100 +coco1959 +coco1963 +coco21 +coco2626 +coco2808 +coco5433 +coco648 +coco72 +cocoa +cocoa12 +cocoabean +cocoball +cocobod +cocochacal +cocokid +cocolash1 +cocolatv +cocolo123 +coconut +coconutgrub +coconuts +coconuts123 +cocopipi +cocopuffs +cocorico +cocoscoco +cocpinag +cocxi +cod123 +cod2002 +cod4pwd0 +codcod +code +code000 +code0266 +code15 +code1992 +code3 +code4527 +code6778 +codeblue +coded +codeman +codemarie +codemaster +codename +codenaur +coder +coder88 +coderb +codered +codermc +coderx +codevn +codewort1 +codex +codforum +codigo +coding +codp8844 +cody +cody1323 +codybowman +codyboy +codychad +coedfryn +coffee +coffee111 +coffee33 +coffeecup0 +coffeykid +cofy1n +cogeys +cogito123 +cognactrinker +cohaslo +cohe6 +cohoduk2 +coijo +coil2rec +coin123 +coin929 +coincoin +coincon +cointche +coivateo +cojest00 +cojidau +cojosu2s +cokacola34 +coke0 +coke123 +coke2007 +cokecard +coker08 +coker1 +cokinou +cokolino +col6aukq +cola +cola0905 +cola48 +cola500 +colacao +colaiste +colamix +colazo69 +colbrand +colby +colby5 +colby97 +colbydog +colcal +cold123 +cold187 +cold2653 +cold654 +cold99 +coldasice +coldmatch +coldplay +coldrex +coldzero +cole +cole2006 +colea +coleen +coleman27 +colesn13 +coleton01 +colette +colgan5 +colhasa +colibri +colibri2009 +colin +colin123 +colin24 +colin656 +colinlilli +coliseum +colito +colja10 +colla888 +collants +collaps3 +collapse1336 +collar +colle86 +collectr +colleen +colleen +collene +collette +colley +collier1 +collier76 +collin +collin wilcox +collins +collision +collons +colman +colmillo +colo7118 +coloc29 +cologne +colombiabogota +colon +colonel tim +colonel101 +color +coloradi +colorado +colorado3k +colore +coloreal +coloss +colosseo +colosus +colourful +colt1911 +colt45 +colton0815 +colton619 +coltowns +coltr1n0 +coltrane +colts1818 +coltss +coltwork +colum143 +columba +columbia +columbretes +com0469 +com4100 +com4paco +com68575 +com6ton +comacota +comand +comando3 +comarr +comax +combat13 +combat18 +combat2008 +combat51 +combine +combo +combo1721 +combomax +comcast2 +comcyl +come105 +comedor +comedy +comedy1225 +comeleib +comemela +comeon +comeonwu +comet123 +cometmia +comhop +comicfood +comiks11 +comite +comite09 +comm7777 +comma4 +command +command1 +commander +commando +commando80 +commandos +commerce +commi91 +commodore +communicat +communicator +community +como +comobebe +comognes +comp1803 +comp4u5 +compact +compact666 +compak +companio +company +compaq +compaq2 +compaq50 +compaq99 +compaqsf1 +compare +compassion +compassion1 +compers +compilo1 +completO +complexity12 +complicated +compo01 +comport +compos +compound321 +compre39 +compsci99 +compton +compton +compton1 +compu1234 +compuadam +compub +computAdora2 +computador +computer +computer1 +computer112 +computer486 +computerflut +computers +computronics +comrace +comrax +comtome +comuihfc +comunes +comuscl +con3fig0 +con4l1vf +conTER +conan +conankane +concac +conceicao +concert +concetto +concha +conchata +conchita +conchita +concisa2010 +conclebe +conclusion +concon +concord300 +concorde +concordia +concrete +concrete1 +condar +condas1363 +conde +condemnation +condor +conduoi +cone632 +conejitos +conestoga30 +conf2008 +confey +confiance +confidence +confidentiel +config +confirm +conflict +conflux1 +confpass +confuz3d +cong +congduan +congdung +conguitu +coni +coni1985 +conican +conifeer +conion +conjured40 +conker +conker02 +conlua +conmaton +conmeno +conn3ct +connair +connard +connect +connecticut +connectin3 +conner +conner1b +connessione1 +conni2006 +connie +connie1 +connolly911 +connor1413 +connor1994 +connor84 +connorbrandon +connpoco +conny +conny +conny112 +conny82 +connyp +conocer +conor666 +conorbaby +conquerors +conquest9 +conrad +conrado +conrado san +conroy1021 +cons01 +consafe +consej2 +conserve +console +constance +constans13 +constant +constant +constanta +constantin +constantine +construct +consuelito +consuelo +consuelo +consumer07 +consumers +conta90 +contaci +contact24 +contact251 +contact88 +contaduria +contain112 +container +conteur1 +continental01 +continuum013 +contorsionista +contos18 +contra2000 +contracts123 +contrast +contrex +contri +control +controle +controle123 +contura +conure69 +conv3rg3nc3 +convent9 +convers07 +convibal +conway +conway27 +conzetto2 +coobiak +coochie +coocie +coogie007 +cook3724 +cook80 +cooked +cooker3142 +cookie +cookie187 +cookies +cookies1 +cooks4you +cool +cool1125 +cool1218 +cool123 +cool1985 +cool2231 +cool2408 +cool2k +cool3311 +cool69 +cool8zad +coolaler +coolanom +coolas +coolboy +coolcat +coolco +coolcode +coolcool +cooldamn +cooldoo +cooldown +cooldude1 +cooler +coolest +cooley +coolfish +coolfritz +coolguy +coolguy1 +coolguys +cooling +coolio +coolio1 +coolioisnt +cooliolol +cooljava +coolkat +coolkid +cooll0 +coolman +coolman1337 +coolmint +coolone +coolover +coolpass +coolpwd +cooltek +coolz +coonhunt +coop123 +coopec +cooper +cooper +cooper4230 +coopernb +coord123 +coorpa +coorslit +cooter316 +coozcu +copacetic +copado +copaneco +copanki +copasetic +copero +copilot49 +copiloto +copito +copno2009 +copno2010 +coppaq +copper +copper24 +copper81 +copperhead16 +coppermine +coppo2010 +cops +cops2005 +coptere +copterra +coptyty +copy1786 +copycat34 +copycat4 +copyleft2e +coqodi36 +cora +cora sue +coraazrael +coral +coralars +coralee +coralie +coralie +coralsauber +coraly +coranglais +corazon1 +corazoness +corbac +corbatas17 +corbet +corbet28 +corbett +corbett602 +corbin +corbin121212 +corbinkane +corblin +corcodel +cordamic +cordas17 +cordelia +cordell +cordell214 +corderov +cordmak +cordoba +cordobra +cordy +cordycordy +core +core2113! +core630 +core6565 +core8235 +coredev +coredump +corehard +corel +corentco +corester87 +corey +coreyna +coreynol +corfid1 +cori2111 +coriano +corigush +corin +corinariva +corine +corini5 +corinna +corinna1983 +corinne +corinne +corinni +corix00 +cork +corky +corkyjim +corleone +corleonie +corloni +corma +cormar21 +cormo1234 +corn +corn48 +corndog2 +corned +cornel +cornelia +cornelia +cornelia otis +cornelius +cornell +cornell +corner +cornet +cornetin +cornfed71 +cornflakes99 +cornholio +cornwall +cornwall83 +coro54 +corolle +corolloso +corona +corpa +corporates +corrado +corrado +corral02 +corral35 +corrapaws +correan +corrector +correeny1 +correia1984 +corrial3 +corrido +corrupt666 +corruption +corsa007 +corsa1313 +corsab +corsagsi +corsair133 +corsica55 +cortes +cortese45 +cortina +cortina64 +cortins +cortisol +corto +corto01 +coruption6 +corvax +corven +corvent +corvete6 +corvette +corvette1 +corvette221 +corvette4 +corvideo +corwin821 +cory +cory bumper +corylang +cosb186 +cosetta +cosette +cosette +cosftw22 +cosima0507 +cosimo +cosina1604 +cosino01 +cosinus +coskun1972 +cosmic +cosmicfate +cosmik0112 +cosmix +cosmo +cosmo01 +cosmos +cosmotan +cosocyl1 +cossacks +costa +costa888 +costache +costan +costas +costcouk +costel +costin81 +costituente +cosybe +coteagua +cotito10 +cotletto +cottage21 +cottereau +cottito +cotton +cotty2004 +couchmaster +coucou +couder885 +couga17 +cougar +cough3 +cougs1012 +coulter +counik +count +count basie +count billy +counter +counterstrike +countess +countess agnes +countess liev +counti87 +country +country joe +country40 +coupals +coupet +couple +couqui +courage +courbal7 +courbish +court +courtney +courtney +courtois18 +couts0 +cova +covandes1 +covenant +covenojo +coventry +covertop +cow0818 +cow123 +cowabunga +cowboy12 +cowboy25 +cowboy3116 +cowboy72 +cowboys +cowbrown +cowdungs +cowfood1 +cowgrl +cowk234n +cowlitz +cowpie6 +cows +cows41 +cowsgreat +cowshit +cowsown1 +cowsrule +cowstuff +cowtown +cowww +cox +coxie +coxinha1 +coygonuq +coyoche +coyote +coyote98 +cozadds1 +cozakey +cp0202 +cp0423 +cp200603 +cp3169dt +cp76107 +cp790406 +cp7961 +cp9Hp +cpadmin +cpak5678 +cpamoi +cpap +cpazc +cpc123 +cpdguate +cpdstcul +cpe9lga9 +cpeefbxx +cpelle123 +cpf0519 +cpf1798 +cpfigatx +cpit2006 +cpjrd +cpl120 +cpl4066 +cplcpl +cpleader +cplpro +cplsd48 +cplsd50 +cpnv +cppcpp +cppmp12 +cpsych +cpu +cpu1337 +cpu80mhz +cputek2k +cpv288 +cpw123 +cpwarrior +cpyouth +cpzlex +cq19gw +cq4f7 +cq603 +cq894 +cqK0Fm +cqafaz41 +cqbsos +cqgnesf +cqi2001 +cqmzqel +cqn0x +cqrescue +cqwd6 +cr00klyn +cr0ckp0t +cr0ottal +cr0quet0 +cr0un53 +cr151994 +cr15t37 +cr1m3 +cr1ppl3 +cr1s3s +cr20323v +cr260267 +cr34t1v3 +cr3ativ3 +cr3ative +cr41189 +cr4ck3rs +cr4ckers +cr4niums +cr4nk +cr4zyg0d +cr57000 +cr5udtkj +cr85a12k +crabsite +crabtree +crac +crack +crack02 +crack101 +crack4u +crackback40 +cracked +cracked! +cracken +cracker +crackerjack +crackers +crackit +crackme +cracky +cracotte +cradle +craecom9 +craf2w85 +crahan +craig +craig +craig richard +craig9869 +craighall +craighall1 +craigm60 +craiova +craiterz +crakked5 +cral48 +cram007 +cram1944 +cramis70 +cramon +crampi +cranberries +crane +cranford +crankez +crapaq +crappy +crash +crash0708 +crash8797 +crashme12 +crasy79 +cratcher! +crates +crauford +craufurd +cravax +cravero +crawcell +crawley5253 +crax5346 +cray +crayer19 +crayola2 +craze187 +crazy +crazy123 +crazy1998 +crazy3 +crazyb +crazyblood +crazydad +crazydog +crazylee +crazyna +crazyroy +crazyt +crcuties +crdjpyzr +crdp209 +cre80r +creamcake01 +creatab1 +create4601 +create7 +createc +created7 +creatine +creation +creation60 +creations +creative +creative0 +creative00 +creative312 +creative4000 +creativeagency +creator +creatore12 +cred5390 +crediamo +credit2u +credo14 +credsack +cree summer +creek0356 +creep2 +creepy +creepy1975 +crehe73 +creighton +creosa15 +crepusculo +creqa +cresimir +cressida +crest +creta +crevard +crew81 +crezo01 +crf3096 +crg2607 +cri1w5eg +criatura222 +crib24 +crick +cricket +cridaa +crier99 +crifab +crilla30 +crime1 +crimea +crimeaua +crimedog +criminal136 +criminy +crimloc +crimmama +crion199 +criper34 +crippen92 +crippler +cris +cris0401 +cris1510 +cris718 +crisanto +crisco20 +crisis87 +crispin +crispin tyrone +crisse1337 +crisso12 +crissolo +crista +cristaline12 +cristalino12 +cristallo1 +cristea +cristi +cristian +cristian08 +cristiana +cristiano +cristiano +cristina +cristina +cristina galbo +cristine +cristo +cristo.87 +critter +critters +crivaau +crjjf7a9 +crk79 +crlz2008 +crm1962 +crn37 +crnagora +crncer88 +crnq0551 +cro1noap +crobar76 +croc +croc4 +crochet01 +crociferi +crocket +crocro +croft +croft2 +cromer60 +cromicre +cronfeld +cronian +crono40 +crook +cropoz +crosato +cross993 +crosscek +crossface +crosshair +crossknack +crossman1 +crossnet +crotalus +crotte54 +crouton +crouz +crow +crow0513 +crow2001 +crow246 +crow7016 +crowchi +crowcrow1 +crowefam +crowkait +crowki +crp230 +crshXh +crsta95 +crterra +cru111 +cru68 +cru8u6ru +cruciata4 +crucible698 +crucifix +crudo84 +crue1007 +cruel +cruidi +cruiser +cruiser0223 +cruncher +crunk420 +crunkit +crusade007 +crusade1096 +crusader +crusader98 +crushader +crusher +crux2377 +cruzer +crwhite +crxsi88 +cryfish +crying4 +crymd5 +cryolite +cryozero +cryptic +cryptme +cryptography +cryptomeria +crysistr +crystal +crystal +crystal1 +crystalgears +crytina +cryyt +cs010203 +cs120283 +cs123456 +cs1cz3w +cs1wku1v +cs219 +cs2203 +cs2st +cs3tfs5k +cs40704 +cs4life +cs930102 +csa1865 +csa4life +csabyka +csad68j +csag2006 +csakoL +csala783 +csb2rs4u +csc7899 +cscart +cscience +cscscs51 +cscscscs +csd71 +csdp63sa +cse1126 +cseber +csfool +csh123 +cshepherd6 +cshift1b +csiga +csilla +csivet +csj30318 +csjpr +cskellan +csking +cslewis86 +csm13579 +csman1ak +csmy4rzy +csncsn +csoit +csoka +csoki76 +csonti23 +csotto +csplayer +cspro1 +cspt75kv +csqeqr22 +csquared2 +css +css4all +cssclan +cssgamer +cssn4nh0 +cssorult +cssource +cssphp +cssrlz +csss5560 +cssstorm +cstrike +csutika +csw1500 +csw2000 +csypi +csz500 +ct +ct011978 +ct03 +ct06801 +ct247474 +ct4lf8 +ct5agkgi +ct7342wa +ct89fh +ct9999 +ctaskfiu +ctb7389 +ctbuv +ctcpnic +ctdfgjw +ctes1551 +ctg843 +ctgekmrf +cthnbabrfn +cthulhu44 +ctigerk +ctl1807c +ctod1234 +ctp90ixl +ctpnew +ctr354 +ctrhtn +ctscekil +cttszzx +ctuusa +ctvgao +ctweb34 +ctwerks +ctx34ksl +cu1ic +cu2day +cu570m +cu8o5 +cu971501 +cu9j94ff +cuGpF +cuIgnotus +cuadro9 +cuai +cualquier +cualug +cuando +cuat5891 +cubac51 +cubalibre +cubaners +cubasesx +cubava07 +cube +cubic +cubitus +cubixx1 +cubs1990 +cubscout +cubsfan32 +cubswin +cucaios +cucciola +cuccyuta +cuchillos08 +cuchita +cuchoi01 +cuckho +cucrew +cucu1453 +cucu3690 +cucucucu +cuculugu +cucumber +cucumber30 +cuda +cuda1973 +cuddcudd +cuddeback03 +cudemuo +cudmen +cueit +cuesta +cugini +cuh6d88 +cuhaci +cuicid +cuijuan@@ +cuilanwu +cuisnfhf +cuixyyrx +cuiyajin +cujo0015 +cuk25org +cuke +cuki11 +cukrowa1 +cuksetez +cul +culebrass +culinary90 +culjut +cullarr +cullen +culles13 +culley123 +cully +cullyn +culo +cultura33 +cumangw +cumaraoc +cumasari +cumhuriyet +cumino +cumloc +cunce +cuneyt +cunhide +cunt$$ +cunt1 +cuntmuncher +cuntrag7 +cuny +cuoco +cuofm02k +cuonghy +cuore128 +cup123 +cupcake213 +cupertino +cuphold1 +cupin79 +cupo1902 +cupola1 +cuprija +cups2000 +cura1962 +curcic02 +curefix +cureterra +curhcurh +curieux +curiosi? +curl8512 +curley +curly +curly +curond +curreta +curro +currycurry2 +curse +curso +cursos +curt +curtains0 +curter92 +curtis +curtis +curtis63 +cusbajez +cuscus +cusl5ib0 +custard1102 +custer68 +custodios864 +custom +customer +custus +cususmim +cutcos +cutcot +cute +cutefesi +cuteme +cutenews +cuti33 +cutie +cutieb +cutler +cutler21 +cutlermr0 +cutone +cutrettola +cutter69 +cutters44 +cuttysark123 +cuulong +cuva2882 +cuwkowas +cux23ciq +cuxevuyu +cuxfan +cuxipomi +cuy3479 +cuydaroz +cuzxojmk +cv1507 +cv1999 +cv264 +cv45ba76 +cv59plk +cv61ea6b +cv6swdpd +cvaslko +cvbn0987 +cvceg +cvd!$ +cvdfpn8d +cvekas19 +cvekica +cvfg63za +cvg01 +cvgqb +cvilla +cvitjeta +cvjy6 +cvm7676q +cvmds +cvml43 +cvn9as +cvowx +cvp205 +cvqxcnka +cvrst +cvsadmin +cvtwx22 +cvwyuirv +cw0187 +cw12cw +cw255841 +cw611 +cwajpak +cwc3cwc3 +cwccbnm +cwen2005 +cwiicpnm +cwilti +cwk298a +cwks1234 +cwks1791 +cwmmodel +cwp1v +cwr7qf3 +cwrr +cwx991241 +cwxszzcy +cwy520ty +cwy6g +cwzgw +cx159rq +cx3uutul +cx731106 +cxb8i +cxcx +cxejyb32 +cxeujd72 +cxgfzabr +cxj19539 +cxkzcn +cxnnwksg +cxpv2 +cxrocks1 +cxtk5 +cxtoq991 +cxutx +cxv94 +cxvari +cxww +cxxwn +cxyWA2 +cxz987 +cxzcxz +cy +cy131622 +cy42wafg +cy573915 +cy6uldod +cya +cyanide +cyatoy +cyb +cyb3rm4x +cybbyc +cyber +cyber +cyber200 +cyber89 +cybercandy +cybercom +cyberdog +cyberhck +cyberia7 +cyberjoe +cyberken +cyberkot +cyberman +cybermax +cybernet +cyberplus +cyberpunk1971 +cybershot72 +cybersk8 +cyberwarrior +cyberwiz +cyberx60 +cyberzay +cybi05 +cybill +cyborg +cyc166 +cyclomana +cyclone +cyclops +cyco1532 +cyco1966 +cycocyco +cycybaby +cyd +cyd charisse +cydhb +cydmnocq +cyeanne +cygaro1324 +cylim123 +cylinders70 +cyn6ok7i +cyndi +cynic123 +cynne90 +cynp79pt +cynt9arq +cynthia +cynthia +cynthia leake +cynthia1 +cypraeas +cyprea +cypress +cyranogp +cyrax +cyrielle +cyril +cyril chips +cyril01 +cyrille +cyrus +cyrus +cyrusthe +cyska +cyst52 +cytomax1 +cyuslyn +cyxycnet +cz1ka +cz271280 +cz861105 +czadler +czajka +czajny1 +czapla1961 +czapla898 +czarek2004 +czarna115 +czarna66 +czarni +czat92 +czekolada +czekoladka +czekoladka83 +czen46 +czeslaw +czester +czeznu38 +czf668e9 +czg2005 +czhjoer +czi2u +czlowiek +czmixery +czno6 +czojv +czosnek +czpoint +czrj7 +czst +czu508 +czupa22 +czxur +d +d'arcy +d'mitch +d'urville +d003cf9 +d004ds +d00dl3 +d00dmac +d00k1 +d00m3r +d00mlord +d02574882 +d0391c +d03a64 +d041u +d0446f +d060563s +d0655c +d0705e7d +d074961 +d075b5 +d090809 +d097bfe +d0Riley +d0banau +d0brede4 +d0c464 +d0dFCA +d0daniel +d0ded4f4 +d0e7fc75 +d0fef737 +d0g +d0gG0d +d0gf00d +d0gg0d +d0gm3plz +d0gm4n +d0gshit +d0gw0rd +d0han +d0kayaks +d0league +d0lphins +d0m1n1c +d0m1n1c05 +d0m377 +d0m3n1c0 +d0ming0 +d0minick +d0mousemat +d0nat0 +d0nthack7 +d0ote +d0p3st13 +d0peshow +d0pqh +d0rman1 +d0rrance +d0s +d0sunshine +d0swar3 +d0tryme +d0wn +d0zettler +d1008d53 +d104501 +d10can3 +d11160 +d118475 +d11d +d11n7zm +d11wtf +d123456w +d123kme +d129104 +d12y65x +d13013 +d1379361 +d13k3o +d144196 +d1505a2f +d154512l +d15d11 +d1625672 +d16z6crx +d170188 +d1701e44 +d17ef5 +d1994r +d19m10 +d1arules +d1d2d3d4 +d1dennis +d1denver +d1e103 +d1ea7 +d1eclipse +d1ee89de +d1eir +d1fishing +d1fui +d1g1tal +d1gaming +d1gw33d +d1h7k4 +d1llh0le +d1looploop +d1mo457 +d1mon3y +d1naMo +d1ostrog +d1qdxzdq +d1r2m3 +d1r3ct0r +d1rtc4f3 +d1scuss +d1sinker +d1sjunt0 +d1smac86 +d1strust1 +d1sturbed1 +d1telekom +d1wefl +d20 +d20ebea +d22small +d23182t +d2432fc1 +d24729733 +d24m01 +d253180e +d253425d +d258741 +d268556 +d27021994 +d27c6d6 +d28134z +d2857374 +d28rsa7w +d2902311 +d29f64b4 +d2Wendy +d2a3r7o7 +d2a8f7 +d2cabello +d2clone +d2cochrane +d2d24fs7 +d2d4df +d2danalynn +d2foodtown +d2j7g5c3 +d2kaitlyn +d2kenzie +d2masakari +d2nerdboy +d2nothc +d2o7s1y8 +d2privat +d2quintin +d2shazer +d2virgin +d2wxkrve +d2yxcvb +d3026d +d310161d +d3120774 +d31n1 +d31z4tkp +d32938142 +d32c90 +d3315106 +d33pwat3r +d33znutz +d343f6 +d346f0 +d34982759 +d3516ca6 +d353t +d35ad271 +d35dc6 +d35p4ir +d3629229 +d3929de +d3971844 +d3aardvark +d3al0c +d3amelia +d3athstalk3r +d3bas3r +d3caralho +d3ck4 +d3cookies +d3doorss +d3dunbar +d3evelyn +d3f4ce91 +d3fe7e01 +d3ficken +d3fishhead +d3guqb5n +d3insecure +d3inspire +d3lm3r +d3ls0l77 +d3luxe +d3m0n01d +d3mx1 +d3nn15 +d3nsh1 +d3peterf +d3qawsed +d3quality +d3rb0zz +d3rg0n +d3rk3ks +d3slonko +d3spoin@ +d3st0t11 +d3stroyed +d3t21l +d3t3w3 +d3traore +d3tundra +d3v0r1ck +d3v1l +d4000 +d41d8 +d429glk +d43210 +d43o0jfw +d44bac +d44n80 +d4518c +d48bda3 +d48e71c +d490223y +d4Peaceful +d4RET +d4ae3938 +d4azsxdcfv +d4bdat +d4c3b2a1 +d4cobber +d4d4d6 +d4d5c4e5 +d4dd846f +d4dd89c +d4eb79 +d4eh9 +d4fbe210 +d4hph +d4hyx6 +d4jones +d4k34123 +d4kLm2 +d4llllll +d4marlie +d4maxwell +d4melitta +d4murphy +d4n13l +d4nc3r5 +d4nm4rk +d4nny +d4rk0n +d4rkc0r3 +d4rkn3ss +d4rkne55 +d4rkw1nd +d4rq1598 +d4sp0d0 +d4t34m +d4tad0g +d4thomas +d4v1d +d4wertzu +d4zwanzig +d50vic64 +d51699169 +d51db5b +d51et +d52ihc7h +d539827 +d54f410b +d551202d +d578421 +d589789 +d591020d +d5933c07 +d5Prati +d5XRF2 +d5au0214 +d5c364 +d5cef1 +d5chickn +d5curnow +d5elsley +d5fraser +d5g79ox +d5michell +d5mongoose +d5ncytvz +d5praveen +d5r1J +d5rockon +d5sambuca +d5sputnik +d5tcza +d5yeh5uw +d60155777 +d611224 +d611b22 +d61293k +d62416241 +d62680d +d62959d8 +d6295ba1 +d63804b6 +d63d2dc +d63d7e7 +d63e6283 +d640419d +d654321 +d656919d +d65e5 +d67bab96 +d6857f +d69radf +d6adagio +d6annie +d6booboo +d6cny +d6e5akng +d6eileen +d6forest +d6ginger +d6june10 +d6ronsard +d6s5a4 +d6timbo +d6tiy +d6vvq +d6wildbill +d7514617 +d75201314 +d76221965 +d7694p +d77zqb +d786e93a +d78d59 +d7apple +d7b432b6 +d7b5ea +d7cb380 +d7cf9b0a +d7cottage +d7d7d7 +d7degzod +d7doraemon +d7ducati +d7e4e7 +d7e6758a +d7ed35f +d7global +d7gravity +d7herald +d7kasia +d7mullet +d7naibaf +d7newleaf +d7oer +d7r33n +d7srf8 +d7srf822 +d7stupid +d7xxxxx +d800914 +d8016ad +d80a8b3 +d80nikon +d82gyni7 +d8369514 +d86ef9a2 +d8738379 +d87b5a32 +d888c +d8922547 +d8963173 +d8967652 +d8DVD352 +d8Jesus +d8azj +d8b8b6a +d8beeher +d8beezee +d8c1e2 +d8canadian +d8codename +d8d4f2 +d8ef2eab +d8f635 +d8ikook +d8mbil +d8sharp +d8soulmate +d8squirt +d8vertigo +d8xtl2mi +d8yogibear +d912345 +d9160983 +d922cf +d9285324 +d92cb434 +d93299dc +d939ba +d93bf8b +d93f2084 +d9404143 +d951l +d958436 +d96320 +d976f2 +d98e6bc +d99c88 +d9aee082 +d9aiag9k +d9badman +d9birdie +d9blowfish +d9c7f69a +d9command +d9d624c +d9f095a +d9fczz6w +d9h4olwt +d9hamilton +d9maria +d9mother +d9optimist +d9player +d9q7x8u7 +d9redrose +d9slipknot +d9slw4hm +d9spider +d9sushi +d9u2k +d9ucn +d9zpx +d@rkknig +d@rkm00n +d@rkness1 +dE10mN +dFg92i +dHc +dJur9 +dQ06g +dRwH2Q +dW0rkin66 +da +da010177 +da123456 +da1551 +da19053 +da1e3ef7 +da2006 +da2020 +da2bi +da2edd2 +da325497 +da3gets6 +da46nv +da479b +da552501 +da6293 +da62ma65 +da64be0 +da669cfd +da6cf7 +da7ec4 +da82768 +da8284 +da83rb +daNASCAR +daa49e +daajml11 +daan0296 +daan3004 +daan3226 +daarkdaark +daaxj +dab8614 +dabadan4 +dabate +dabba456 +dabbes +dabbs +dabdado2 +dabears +dabeast1976 +dabeda +dabest +dabl3459 +dabney +dabomb +daboyz1 +dabrown910 +dabudie +dabustech +dabuva +dac818 +dacece +dachs835 +dachsgrund +dacindy +dackdack +dackel79 +dacky +dacoda11 +dactiles +dad +dad123 +dad19722 +dad96cat +dada +dada333 +dada855 +dadada +dadadany +dadarck1 +dadas +dadass +dadbab +dadd1e +daddel10 +daddel11 +daddio73 +daddln +daddln03 +daddy +daddy1 +daddy13 +daddy1340 +daddy5 +daddy7272 +daddyhot +daddylow +daddyo22 +daddys +dade +dadgumit +dadi1402 +dadi20 +dadi2701 +dadiani +dadica +dadino +dadjkew +dado +dado1000 +dado2001 +dado2005 +dado2007 +dadolino +dadrepus9 +daduda +dadurty +dae3a2d7 +daedalus23 +daeldael3 +daem0n +daemonxx +daemous666 +daewoo +daewoo1321 +dafa2000 +dafa5565 +daferdafer +daffy2158 +daffyduck +daffyduck123 +daffytank +daffyxxx +dafifth +dafilth +dafni +dafrog07 +dafrogga +daft1 +daftclub +dafuto +dafydd +dag260 +dag35605 +dagbill +dagbrind +dagdelen +dageee +daggel99 +daggerem4 +daggergarnet +dagget +dagmar +dagmarpb +dagmaweb +dagna +dagny136 +dagoba +dagobert +dagobert0815 +dagobert1 +dagon1986 +dagor2d2 +dagorlad3019 +dagrammy +dagrou77 +dagydagy +dagys +dah384 +dah53leq +dahab123 +dahai5858 +dahl3100 +dahleb +dahlia +dahlia +dahlia04 +dahn +dai3tnaa +daiana +daiana99 +daibai +daica +daidai +daidayo +daiewill +daijag +daijiro +daikando +dailee@7 +daili011 +daili120 +daili131 +daili133 +daili135 +daili137 +daili138 +daimonas +daine +dainius +dainora +dainwei +daioner +daisuke +daisuki +daisy +daisy +daisy01 +daisy1 +daisy123 +daisy3534 +daisy456 +daisy831 +daisy98 +daisybri +daisyrutter +daisys22 +daitarnx +daiv107 +dajenti +dajiyuan +dajmarie +dajmos19 +dajoka10 +dakaras +dakatie1 +dakidakm +dakine +dakingo8 +dakirat3 +dakkar +dakota +dakota01 +dakota03 +dakota7134 +dakota98 +dakota99 +dakoviph +daktilo123 +dakyibi +dal +dal17 +dalaeka +dalam0r +dalamar7 +dalandan +dalariel +dalarna1337 +dalarna94 +dalaze1 +dalcin1 +daldal +daldana +dale +dale +dale0222 +dale4814 +dale812w +daleabc1 +dalejr +dalejr8 +daleksec1 +dalem714 +dalen21 +daleth47 +daletrbl +daley +dalhousie +dalia +daliah +daliahbingos +dalibero +dalidali7 +dalien +dalife +dalila +dalila +dalissa91 +dallac +dallama +dallas +dallas +dallefille +dallevalle +dallfab +dalloune +dally +dalmation57 +dalmuta +dalo3550 +daluh88 +dalvm +dalyarak +dam +dam +dam0ras0 +damAshii22 +damacec4 +damage +damage78 +damais +damar +damar1 +damaris2 +damarm +dambo1976 +dambolo1 +damchoo +damcius +dame edith +dame may +dame sybil +damedame +dameit +damelang +dames +dami12 +dami1337 +damian +damian +damian04 +damiank1 +damianw01 +damien +damien +damien126 +damien1a +damienthebest +damijan1991 +damik1 +damion +damion1999 +damkampioen13 +damlaa +damm50 +dammast +dammit +dammy1 +damn1289 +damn666 +damnation +damned +damned04 +damnin +damnit +damnroot +damnshit +damnteam +damokles +damon +damon +damoniak +damoshell +damoune +dampapa +dampbanan +dampfbahn +dampfl0k +dampflok44 +dampil +damrod84 +dams01 +damsch +damudamu +damudm +damyros +dan +dan +dan00aka +dan0161 +dan103 +dan123 +dan13579 +dan17396 +dan1986 +dan1989 +dan1el +dan1m1f +dan2563 +dan3097 +dan45bo +dan6952 +dan953 +dana +dana +dana3262 +dana48 +dana6854 +danaclip +danadevi +danadrian +danai +danail +danara1998 +danashly +danbigh +danby +dance +dance05 +dancehall +dancer +dances +danchau +dancing2009 +danciotu +dandan1243 +dandan44 +dandans +dandik06 +dandy +dandy624 +dane +dane15wi +daneal +daneel97 +danehr +danek510 +danelle +danerzam +danette47 +danfig84 +dang viet +dang4261 +dangalow +danger0729 +danger2008 +danger54 +danger84 +dangit45 +dangit83 +danglemah +dango24 +dani +dani +dani0302 +dani035 +dani093 +dani1711 +dani182 +dani1988 +dani2000 +dani2006 +dani3210 +dani3485 +dani90 +dani9090 +dania +daniboi28 +danica +danica10 +danie +danie5554 +daniel +daniel +daniel boone +daniel day +daniel01 +daniel06 +daniel11 +daniel13 +daniel16 +daniel17 +daniel27 +daniel84 +daniel88 +daniel99 +daniela +daniela +daniela4 +daniela73 +daniele +daniele +daniele1994 +daniele4 +danielf +danielj1996 +daniell +danielle +danielle +daniello28 +daniels1 +danielson86 +danielss1 +danier +danies +daniggi +danijel +danijel2 +danik123 +danila +danila +danilo +danilo +daniluka1 +daninm +daninuke +danio13p +danisar +danitest +dank +dank420 +dankbud +danke +danko +danl56 +danman +danmark186 +dannalh +danne123 +danne3954 +danni +danni123 +danni2406 +dannisss +danno +danny +danny +danny big +danny001 +danny1 +danny1966 +danny78 +dannyah +dannyboy +dannyd +dannyfar +dannyfor +dannym11 +dannyt +dano1967 +danone +dans +dansai10 +dansar1729 +dansen11 +dansoft +dansonice +dant313 +dantae2005 +dantai +dante +dante +dante013 +dante1000 +dantec +dantecz +danton +dantoon +dantraut +dantre12 +dantri123 +danubit +danuse +danush1 +danusia1985 +danutz +danwid +dany +dany2508 +dany63 +danya319 +danzag +daopen +daoserim +daoud321 +dapa1570 +dapa23ss +dapat +daphine +daphinez +daphna +daphne +daphne +daphonso +dapimp +daplop +dapotek +dapperuh +dapprg +daqf1 +dar +dar2000d +dar25ren +dar3mix +dar4023 +dar7fab8 +dar997 +dara6487 +darabos2 +daralyn +darbe +darbe55 +darbenai +darby +darby +darcel +darchdu59660 +darcy +darcy7 +darcydog +dardania. +dardania12 +dare +dareba0628 +darek +darek0509 +darekdarek +darekmai +daretoda +darev +darg0n +dargaard +dargis +dari79 +daria +daria1 +darie +darien +darien7381 +darigan123 +darin123 +darin2012 +darina +darinio +dario +dario +darius +darius20 +darius87 +darjeeling +dark +dark0knight +dark0r +dark11 +dark1236 +dark13 +dark133t +dark1boy +dark218 +dark3131 +dark4c +dark7 +darkac +darkaileron +darkaim +darkalex +darkangel +darkangels +darkap89 +darkas +darkatns +darkavis +darkaz12 +darkblk +darkboft +darkbond +darkcess +darkcode +darkcroka +darkdevil1221 +darkdoor +darkdude +darkdweller +darken +darker +darkethra +darkeye336 +darkfig +darkfire98 +darkforce +darkgio +darkhawk2 +darkhorse +darkis +darkis123 +darkjedi +darkjedi35 +darklord +darkman +darkmanr +darkmanx +darkmeme +darkmind +darkne55 +darknejo +darkness +darknessrises +darknesstorm +darknest +darknite +darko +darko100 +darko2819 +darkone +darkputo +darkreborn +darksaad +darksage10 +darksea +darkside +darkside! +darkside48 +darksith +darksod +darksoft +darksstory +darkstaa +darkstar +darkstar3328 +darkstone2 +darkstone91 +darkwalf +darkwing31 +darky115 +darkys99 +darkzero +darla6316 +darlanne +darlau +darleen +darlene +darling +darling +darling9 +daroca88 +darot07 +darrbaja +darrell +darrell +darren +darren +darren11 +darren46 +darrow +darry +darryl +darryn +darss2010 +dartanya +dartanyan +dartboard1972 +darth +darthang +darthsauron +darthshambles +darthtater +darthvader +darts411 +dartyx +darude +darwin +darwin +darwin151 +darwish87 +darwyn +dary +darya +daryai +daryl +daryl +daryll +daryth69 +darzak22 +das12aq +das53qw3 +dasBoot01 +dasbrot +dascam45 +dasdas +dasein05 +dasforum +dasgeht +dasgrab +dash189 +dasha1974 +dashaft +dashaunt +dashmesh +dashsoft +dasich +dasie1960 +dasistarm +dasister +dasixk +daskalo +daslol11 +daslunis +dasreich +dassbach28 +dasse. +dastard1066 +dastcita +dastoner +dasymaus +dat1media +dat2ezay +database +database66 +datachip60 +datadata +datalogo +datamus +datar786 +datasuul +datawise +dataxi +datbeat +datearea +dato +dator +datorn +datrouble +datson +dattel28 +dauber79 +dauer133 +daujaro +daunas +daunte65 +daurade +daurine +daurquhart +dautu +dav +dava +davarun +dave +dave +dave howdy +dave tex +dave0629 +dave076 +dave101 +dave123 +dave231 +dave2388 +dave3164 +dave330k +dave3418 +dave5033 +dave6841 +dave976 +davediva +davef79 +davejako +davemix2 +daventai +daveon81 +davephp5 +davercs +daves666 +davi +davianni +daviau8 +david +david +david alan +david alfaro +david hatton +david ogden +david patrick +david perez +david prowse +david scott +david1 +david2 +david4334 +david789 +davidb +davidc14 +davidca9 +daviddavid +daviddd +davidde100 +davidder +davide +davidg01 +davidk +davidlol +davidm15 +davidoff +davids +davids1 +davids17 +davidscheer +davidson +davidw +davidz +davila +davin912 +davina +davina59 +davina64 +davins2 +davis +davis62 +davisgmbh +davison +davnet00 +davornikolic +davos66 +davpass +davraz +davudu +davw43 +davy +davystar +daw4ood +dawanbri +dawdaw +dawgs088 +dawgss +dawi09 +dawid van der +dawid1 +dawid987 +dawidd +dawidek321 +dawidudl +dawka +dawn +dawn +dawn1065 +dawn7715 +dawne +dawnod +dawnstar1 +dawson +dawson7314 +daxiea +daxou +daxter +daxter05 +daxtes +daxusky +day0512 +daybr00k +dayday +daydayup +daydream +dayfun +dayhuff2195 +dayi +daykamm +dayle +dayof0406 +dayose +dayron111 +daystar +dayton +daytona +daytona69 +daywaker +daz +daz11620 +dazaran1 +db1425 +db1jac +db20eb +db210989 +db22492 +db261185 +db2919sb +db2inst1 +db3007 +db3sac99 +db4480 +db4891 +db4e1f0 +db67013 +db697c +db8246tk +db9438 +db9658 +db9tmapa +dbDurandal +dbTaipan +dba +dba242 +dbabf513 +dbadmin +dbavna23 +dbb9796 +dbbailey +dbbandit +dbbjjzt +dbc4f2c9 +dbca818 +dbcolleges +dbcool02 +dbcreeper +dbdoom +dbds0906 +dbfa5ec8 +dbhlan14 +dblakshmi +dblk2012 +dbmn103 +dbmoritz +dbms79 +dbnathan +dbnt0 +dbqa6 +dbrtssf +dbrwe77 +dbsasha +dbsid +dbtxyz01 +dbvictoria +dbxp599 +dbygq4f +dbz111 +dbz123 +dbz12345 +dbzarena +dbzchats +dbzdbz +dbzgtaf +dc010394 +dc0a29 +dc1002 +dc1201 +dc169716 +dc228831 +dc23n0nc +dc2925 +dc309391 +dc3552 +dc6889 +dc696d +dc7295 +dc794613 +dc7ef74 +dc821011 +dc9222 +dc9fec +dc9mec22 +dca8t +dca99 +dcaae102 +dcain069 +dcatling +dcbalrog +dcbooya +dcc +dcc4d +dcdisc +dcdrahcir +dcencase +dcgoobers +dch0p3r +dch41n +dchemal +dck +dckiril +dcloer +dcmayor +dcmorteza +dcncuong +dcomer34 +dcontino +dcortez +dcowboy7 +dcpa55 +dcpichee +dcplus +dcpm97b +dcqqf7x8 +dcragbag +dcrichard +dcroman26 +dcsjr123 +dcteam +dcthanh +dctuneit +dcujy6e0 +dcurless +dcwillabee +dcz +dd +dd000000 +dd0415 +dd1063 +dd112178 +dd1191 +dd13um +dd1bj +dd2580 +dd2jk7 +dd3175 +dd4021 +dd410 +dd412115 +dd551046 +dd78ed +dd7951 +dd93973 +dd992 +dd992213 +ddA490 +dda0287 +dda7533 +ddaa12 +ddaaddaa +ddabc625 +ddalles +ddamoeba +ddarko +ddavismi +ddbabylove +ddbaldey +ddblacklab +ddccdd +ddcf0001 +ddcnbsau +ddd +ddd0b1 +ddd6t +dddd +dddd4444 +dddddd +dddeanm6 +dddemon +dddf435 +dddhxx +dddianne +dde911 +ddemontt +ddfj4862 +ddfmdsga +ddfnf +ddfprod +ddgracie +ddhh +ddhooligan +ddiv345 +ddjj1234 +ddjj1234$ +ddjj135 +ddjj5689$$ +ddk888 +ddlit1 +ddman1 +ddmarandy +ddojjack +ddosteam +ddot99 +ddplrox +ddqmy +ddr123 +ddr1707 +ddragonn +ddservant +ddshow +ddsister +ddsteven +ddt5634 +ddtz7661 +ddu8g +dduf9nh4 +ddumass +ddupper +ddv0815 +ddv45G +ddv4b +ddvgls +ddw7e +ddxt0425 +ddxwtige +ddyzn5 +ddzddz +ddzzyy +de +de +de forest +de vera +de witt +de wolf +de01234 +de0815 +de0adf +de0yish +de123de +de123er +de14885c +de14wrba +de19711 +de1992 +de2410660 +de3112 +de38cb6 +de391255 +de4fsfbu +de4sa8 +de5522 +de661e +de667mon +de8164b7 +de863071 +de8754gf +de89f2 +de8ea +deBroglie +deKayla +deLETMEIN +dea +dea1995 +dea1de +deacon +deadalus +deadbolt87 +deadcats1 +deadd666 +deaddog666 +deadeyes +deadgott +deadhead +deadhead13 +deadiam +deadl26 +deadlands63 +deadline +deadlines +deadlock13 +deadly +deadly52 +deadlytouch +deadman +deadman2010 +deadman6 +deadoralive +deadromeo +deadsafe +deadsea +deadushi +deady +deagth14 +deaiom +deal2000 +dealerq +dealio3 +dealmaus +deamon1992 +dean +dean +dean paul +dean-paul +dean06 +dean1029 +deancolbert +deandoron +deandra +deandre +deane12 +deanedeane +deang239 +deangalloway +deanna +deanna +deannabelle +deanne419 +dearbhla +dearie76 +dearjms +dearsina +death +death1 +death123 +death14 +death2 +death2u +deathadder24 +deathangel +deathart +deathbats +deathco221 +deathdeath +deathfaber +deathkings +deathless +deathlord42 +deathmask49 +deathmonster +deathnite1 +deathone +deathrow +deathrrr +deaths +deathsoldiers +deathstar +deb123 +deb5hc7d +deb69ora +debaas1 +debach +debain +debalzar +debanot +debbie +debbie +debbie472 +debbo1986 +debby +debby +debeka82 +debest12 +debeste +debi +debi1379 +debiak123 +debian +debil +debil108 +debilas +debile0000 +debilek +debilek1 +debili123 +debill +debis5 +debitel +debitel1803 +deborah +deborah sue +deborah-lee +deborra-lee +debout01 +debra +debra +debrajut +debralee +debussy +debute +debwys49 +deby +dec0785 +dec0980 +dec12984 +dec1word +dec382 +dec383 +dec6389 +dec7704a +deca +decaes +decale +decameron +decampos +decano +decapitator87 +decco123 +decebalstyle +decembar +december +decept1c0n +dechenhe +dechets +dechocolate +dechtera +dechtice +deck3887 +deckard +decker +decking +deckmaster +declan03 +declowns +deco2044 +decode +decorate +decoy123 +decroly +dect121 +ded60d7c +deda +dedale69 +deddington +dede +dede007 +dede1234 +dede2005 +dede8585 +dedede +dededede +dedee +dedekt +dedelsh +dedeman +deden +dedesi +dedeyne1 +dedi +dedicate +dedis3 +dediwat +dedlock95 +dedo7804 +dedoemes +dedooo +dedpenmen +dedusca2 +dedust32 +dedy +dee +dee dee +dee gee +dee wallace +dee4dee5 +dee736 +deebee707 +deedee22 +deedle +deedsanj +deeemo +deejay +deelan +deep +deep2204 +deep3064 +deep82 +deepak +deepblog +deepdodo +deeper +deepesh +deepfree +deeps6995 +deerfield123 +deerpark11 +deerr554 +dees2003 +deeshiba +deevana +deeznutz +def4321 +def456 +def5b0 +def869tn +def99wa +defaces +defacing +defalcono +defari +default +default1 +defby +defcon +defcon18 +defcon42 +defcon5 +defcut99 +defdac +defence8 +defender +defender2511 +defensor32 +defest +defest92 +defi4nc3 +defiantina +defjam +deflow3p +defne03 +defo +deforest +deforrest +defra2007 +defrag01 +defrock90 +defter +deftones +deftones0645 +deftzone +deg6zd +degage +degas +degas0987 +degaussa +degela4 +degeneffe323 +deggial321 +degistim +degonet +degroof1 +degu1968 +dehghan +dehl +dehm45 +dehoedt +dehogy +deia +deia +deigen77 +deimante +deimudda +deimudda123 +deimuttr +deineier +deirdre +deiron13 +deisei9a +deitys11 +deividas +deivisss +deja8526 +dejavu +dejavu4u +dejeff +dejman +dejnah +dejuco +dek chai +dek5129* +deka2621 +dekdek +dekenneth +dekim1004 +dekird +dekisgay +dekista +dekkadag +dekker +deklamm +deklaration +dekomers +dekor35 +dekrypt1 +del +del1010 +del15 +del49908 +del5019 +del57ta +delPiero +dela1 +delabodu +delaina1970 +delal21 +delalic +delaney +delaney +delany +delapan +delaura +delbert +deldel +deleb456 +delegue +deleon +delete +deleverance +delf2310 +delfin +delfin1 +delfina +delfines +deli +delia +delia000 +delibeyi +delice91 +deliciosity +delidana +delidolu +deligreece +delije +delije4u +delikurt +delilah420 +deliric +deliric1 +delirium +delirium0 +deliturk +deliver +deliyim +deljak36 +delkim +delkor1 +dell +dell +dell1000 +dell1230 +dell1702 +dell450 +dell6400 +dell852 +dell92 +della +delldell +delle +dellp120 +delmar +delmukuz +delo0512 +delola +delorean81 +delores +delores del +deloro123 +delownzu +delpher +delphi +delphi99 +delphia01 +delphia24 +delphina1966 +delphine +delphine +delpiera +delpiero +delponte1 +delram +delsol +delt1645 +delta +delta rhythm +delta05 +delta386 +delta4 +delta5 +delta543 +delta757 +delta76 +deltab4 +deltaco +deltacon +deltaspi +delter +deltri +deltros +delusionrocks +delux18x +deluxe +delvill +dem +dem0 +dem2dem +demal123 +deman216 +demangala +demarus1 +dembek +dembski +demelony1 +demencia536 +dementor +demest +demeter6 +demetrius +demi +demi1212 +demi1994 +demian +demian808 +demian92 +demiang +demidov91 +demigod +demille81 +deminio +demion +demir +demis_21 +demise24 +demisha +demisp21 +demmin79 +demmler123 +demo +demo1 +demo1992 +demo2 +demo30 +demo84 +demodemo +demokrat +demolay7 +demolder +demolire03 +demon +demon123 +demon2 +demon222 +demon321 +demon54 +demone01 +demonh +demonias +demoniste4 +demonoid +demonology6 +demons2294 +demonshank +demonx88 +demorga +demostratos +demota +demox +demoxx01 +den2998 +den2kv6v +den53213 +dena +dena2847 +denadai2 +denali8191 +denar1 +denarin1 +denbest +dencol +denden +dendrite +dene +dene124 +denecke +denell +deneme +deneme1 +deneme12 +denemek +denernoget +deney +denhaag +denhaag7 +denholm +deni2703 +denial +denian +denideni +denied +denier +denile222 +deniluka +denis +denis +denis123 +denis1504 +denisa3003 +denisdavid +denise +denise +denise12 +denise33 +denisis +deniska +denismou +deniz +deniz12 +deniz19 +deniz471 +denizim +denizli +denizx +denken +denkste! +denluk +denmas +dennie +dennie13 +dennis +dennis +dennis01 +dennis0211 +dennis10 +dennis125 +dennis13 +dennis19 +dennis310 +dennis40 +dennis43 +dennis77 +dennis89 +dennisax +dennisba +denniseriksson +denny +denon14 +denon9292 +denpe +denpet01 +denron01 +densidensi +dentro123 +dentysta01 +denver +denver +denver4420 +denver56 +denver81 +denvermax +denyer9 +denys +denz1983 +denzel +denznow +denzo1506 +deodatus43 +deoi450 +deojuvante +deonrennie +depa8 +depart +depeche321 +depedro +depietro +depmocip +depo +depot006 +depot3015 +depotkater +depp2009 +depp31 +depp69 +deppdepp +deppenhausen +deppsau +deprabao +depredador97 +deprehend191 +depri45 +dept8053 +deputy56 +deqlvfqy +der.che +der15ik +der2te +der9wok +deradler +derank18 +derbe3 +derbeste +derboss +derby +derdegen +derder +derdesle +derdjg +dere +derecik +derek +derek +derek000 +derek22 +derek578 +derekl +derekm +derekx1 +derelton +deresel +derevo +derfer +derftz +dergino5 +derhomi +derick +deriko +deriks +dering! +derive85 +derko +derlaule +dermaket +dermaler +dermot +dernek +dernico +dernrf +deroeck54 +deromeob +derose +derped +derpg +derqui +derrek +derren +derrick +derrick +derrick champ +derrin +dersabg +dershaw +dersim +dert1 +derthona +dertinos +dertli +dertyp2 +dervia +dervis +derya +deryam91 +deryck +derzeter +derzone +des +des03046 +des4life +desOxy80 +desaq96 +desar12345 +desaster +desaster3 +desc0720 +descartes +descent2 +descention12 +desecab +desecho +deseje +desert +deserted +desertuss +desfase69 +desfencer +desferal +desfor +desharonve +deshave +desheng +deshontay +deshret +desi +design +design01 +design13 +design4u +designed +designer +designer2010 +desing +desing18 +desintegrador +desioras +desir +desire1024 +desiree +deska89 +deskjet +deskjet1 +deskpens +deskpro +desktoppass +desmond +desmond1993 +desmoss +desolator666 +despair12 +desperado +desperado05 +desperados7 +despina +despina +despo +despot +desreta +dessenhe +dessert +dessie bad +dessmonn +desssmx5 +dessy +dest11 +destati7 +destek +dester +desterro +destijl +destina +destinam +destination +destini +destino0105 +destiny +destiny1210 +destinys +destro +destro1242 +destructo +desvii +deswaq +desy +det0nate +det2mi2m +det313 +deta123 +detberti +detective01 +determinator +detestabilis +detewe +deth +detotoche +detour1 +detroit00 +dettabun +dette561 +dettezor +detti33 +dettmer +deukecrh +deulofeu +deus11 +deuscanis +deusex +deusexx +deuspaz +deusy +deut118 +deuteros +deutor +deutsch +deutsches +deutschland +dev +dev +dev038 +dev2007 +dev21465 +dev58int +devOne +devalk +devana88 +devaryu +devass +devcool +devdorn +develop +develop2010 +developer +developing +development +devgru +devids +devil +devil01a +devil021 +devil1 +devil123 +devil22k +devil44 +devil666 +devil978 +devildevil9 +devildog3531 +devilek1 +devilgm +devilion +devilish241 +devilman1138 +devilpat +devilpax +devils +devils96 +devilxtr +devine7 +devinlee +devinmatt +devit +devivon +devixf7b +devjk +devn00b +devnia +devnul +devo1devo +devoampu +devokan +devon +devorior +devotee77 +devray03 +devrimci +devry +devylder9463 +dew3270 +dew420 +dewaa2 +dewayne +dewayne +dewd +dewey +deweylai +deweys246 +dewil +dewilz +dewitt +dewolf +dewolf18 +dewotka +dewsre +dex +dex555 +dex888 +dex9536 +dexter +dexter +dexter59 +dexter74 +dexter812 +dexxa +dexxacam +dey +dezco +dezember +dezenerd +dezert +dezibel +dezso +dezydezy +df021394 +df09f0d +df12nc +df160709 +df168805 +df19831 +df21e19 +df222726 +df3v3fgd54 +df45df45 +df4niwjp +df56gh +df62do9b +df65c841 +df660598 +df7gzrd +df8g95nm +dfRockport +dfa081 +dfa37f50 +dfasdfgh +dfauvel +dfb6484 +dfbb +dfclan +dfcxser +dfcz123 +dfczcfv +dfczdfcz +dfd5 +dfdarkling +dfdf +dfdfd +dffa48 +dffdffcv +dfffn7k2 +dfg +dfgd +dfgdfgdf55 +dfgfds +dfgurke +dfhag5 +dfhdgfh +dfhelene +dfisk92 +dfitalian +dfjkdfjk +dfk2793 +dfkdpfl +dfkj192 +dfkjsbvb +dfkthb +dfkubrick +dfkz1938 +dfmdfm +dfniceone +dfonpz12 +dfp23rt +dfpelikan +dfreload +dfroger +dfrooter +dfs246 +dfsanket +dfsdse +dfsf +dfsid88 +dft7c +dftomos +dfufyjdf +dfw6526 +dfybkm +dfytpv98 +dfyzdfyz +dg010157 +dg040887 +dg062780 +dg07 +dg1 +dg102030 +dg4040 +dg569491 +dg5fbd +dg5mmj +dg6yhe +dg7eao +dgasher +dgbz489 +dgcss +dgdhali +dgerko +dgform +dggclan +dghimmel +dgilm4rt +dgintern +dgja0456 +dgm97a +dgn13 +dgn6850 +dgoceva +dgp123 +dgq1o +dgrdavv +dgrgd4 +dgs007 +dgs8712 +dgtgsll1 +dgx988 +dgxw1 +dh1903 +dh1982 +dh201169 +dh20749 +dh60y2k8 +dh6915 +dh8410 +dha3100 +dhahost2 +dhajg7zt +dhanifan +dhansen1 +dhany +dharma4u +dharmadasa +dhas252 +dhc13 +dhcify +dhggi +dhgpv007 +dhh170 +dhh4xx +dhhmc +dhigh123 +dhimaz +dhimiter +dhimpadg +dhipldhl +dhiren1 +dhk272s +dhkm1 +dhkn12mz +dhl3041 +dhnki +dhnuwk +dhqzj +dhr2000 +dhr819 +dhsrules +dhstvc +dht1500s +dhtkuhi +dhtphsepc +dhungula +dhz4sx +di +di010107 +di1961ja +di6e8uv4 +dia2adm5 +diabel14 +diabetas +diabl0 +diable +diables +diablo +diablo1 +diablo1116 +diablo2 +diablo2872 +diablo3011 +diablo33 +diablo950 +diabloguild +diabloii +diablosdoom +diabolic +diabolo +diabolo13 +diabolo150 +diaconu +diagnose +diahann +diahnne +diajeng +dial911 +diala1 +dialer +diam +diamant +diamante +diamantidis13 +diamond +diamond1223 +diamond323 +diamondback +diamondring +diamondshepard +dian0m1 +diana +diana +diana123 +dianak +dianasue123 +diane +diane +diane lee +diane van der +dianiki +dianita +dianka91 +dianna +dianna56 +dianne +dianne turley +dianou +diapson +dias1803 +diaspora83 +diaz +diazbabe +dibblepi +diblivim +dibol5 +diboune +dibu01 +dibuono25 +dica49 +dicembre1983 +dichetdi +dick +dick +dick1717 +dick813 +dickdick +dicker +dicker89 +dickhead +dickie +dicknutz +dickson15 +dicky +dictator1982 +dictionary +didasabe +diddy +dideke01 +diderik1 +didi +didi2468 +didier +didikplg +didine +didodido +didounet +didval +die +die jacob +die12mic +die2003 +die2live +die5408 +dieawen +diebels123 +diebert +diedamie +diedas +diedem +diedie +diedri86 +dieene +diefuxi +dieg05 +diego +diego +diego007 +diego1117 +diego16 +diegobsc +diegoeloy +diegoms +diegop +diegoroses +diegos +diegote +diehappy +diehard84 +diehure +dielale +dien +dienstag +diensten +dientes +dientu +dieosama +diepre47 +diepvr +dieq41 +diesel +diesel224 +diesel4ever +diesel8542 +dieseln +diesels25 +diesims2 +diesonne +dietcok3 +dietcoke +dietcoke73 +dieter +dieter +dieter11 +dieter76 +dietlinde +dietmar +dietmar +dietrich +dieu002 +dieu2488 +diewurst +diezohm +difcul95 +diff7913 +difusion +dig1c00l +dig4je +digdug11 +dige9876 +digg +digga123 +diggah +digger +diggerer +diggins +diggler +diggy5599 +digicom +digid00 +digidrag +digiglam +digimon +digimon1 +digit +digital +digital5 +digitall +digitaria +digiview +dignitat +dii03 +dijkstra +dijon123 +dijonnay +dijson +dikey55 +diki01 +diki1984 +dikke tette +dikola +diksi1 +dikti +dikulis +dikzak +dil9b666 +dilana +dilanok +dilara +dilara81 +dilbert4$ +dilbert5 +dilbertdilbert +dildo2012 +dildo69 +dilegim +dilemler +dilemma1 +dilija +dilip +diller +dilles22 +dillinger +dillman17 +dillon +dillon +dillons3 +dillrod1 +dillwink +dilo79 +dilohati +dilou21 +dilou78 +dilsuhte +dilution251 +dilyana +dilys +dim2389 +dima +dima0505 +dima1316 +dima16 +dima1987 +dima1990 +dimabrak +dimacs93 +dimafar +dimage +dimak111 +dimaluca +dimart +dimarzio19 +dimas +dime +dimebag5 +dimens35 +dimension +dimensis +dimepick +dimetra +dimi1029 +dimi2512 +dimiter +dimitra +dimitri +dimitri +dimitrij +dimitrije +dimitris +dimitris2121 +dimitris86 +dimitrisv +dimka123456 +dimka666 +dimlin1 +dimmdimm +dimmell +dimmu666 +dimnpfds +dimo +dimo +dimo1234 +dimoca26 +dimon0390 +dimonlazarev +dimpas +dimpenhu +dimple +dimples +din0b0ts +din15da +dina +dina1965 +dina2011 +dinah +dinaida +dinamita121 +dinamita9 +dinamo +dinaskoe +dinc13 +dincking +dindaku +dinefwr4 +dinesan +dingding +dingdong +dingel1116 +dinges +dingo0401 +dingoen6 +dings +dingsen +dinidini +dinin69 +dinitoni +dink +dinkie +dinkie12 +dinks1010 +dinkum11 +dinky +dinky +dinky06 +dinlisda +dinnake +dinner +dino +dino +dino1986 +dino20 +dino2003 +dino208 +dino666 +dinodino +dinoline +dinsane1 +dinsdale +dinu +dinuite +dinute +dioCqi +dioabro +dioboe +diocane! +diocane123 +diocane92 +diode +dioden +diogenes +diogos +diokixma +diomag +dion +diondion +dionisie +dionisio +dionn1993 +dionne +dionne11 +dionysia +dionysus +dior2005 +diorules +dios +diosdavid +diosdios +dipardo1 +dipedevi +dipeer +dipjo87 +diplings +diplom +dipoxx96 +dippolito +dipset +dipset06 +dipshit +dir1234 +dira +dirce +dirdir +direct1995 +direct3d +director +director012 +directtv +diredire +direhwdp +direktor +direnis +dirk +dirk +dirk210 +dirk2690 +dirk27 +dirk28 +dirk41go +dirk5790 +dirk6002 +dirk71 +dirko303 +dirkpitt +dirla753 +dirleoni +dirmilli +dirose +dirtbikes +dirty +dis123 +dis7565 +disaster +disc +disc0man +discepati +discipline +disco +disco13 +disco776 +disco89 +discoa +disconnect +discount03 +discover +discovery +discrete +discrim +discus +disel1 +disforum +dishaman +dishdish +dishrag +dishsat +disiz78 +diskspade +diskus23 +diskusi +disne92 +disney +disneyland +dispepsi1 +disperz +dispo2000 +disrepute +dissection123 +dissimili +distinct +distribucia +disturb +dita +ditaoky +ditech +ditinisy +dito1976 +dito3486 +dito84 +ditopax +ditscher +ditte +ditte2608 +ditto +diugys12 +div230 +div3l0g +divadnx +divana +dive3d +dive4771 +dive8869 +divebomb +diveevid +divemaster +diver0127 +diverkm +divers +diversesolo +divertis +divgenesis +divinia +division2009 +divizionen +divl +divljina +divocak +diwnoqif +dixa898 +dixan91 +dixaster +dixi8642 +dixie +dixie +dixies01 +dixitcar +dixry +diyb1962 +diz +dizzdass +dizzy666 +dj131097 +dj1803 +dj190360 +dj1985 +dj1989 +dj2829 +dj2weedq +dj404850 +dj4u6b +dj4v4 +dj54a23 +dj722c +dj73qs +dj741021 +dj8114 +dj94xk4 +djamz3 +django +django500 +djarot +djaweb +djboby +djbolo +djboss73 +djbr3nn +djbur1236 +djc150 +djcalvin +djcosla +djdasfh2 +djdejavu +djdick1 +djdoky +djembe +djemstil +djerba17 +djfan06 +djfufu +djgreg1 +djiapvbj +djibout +djibouti +djidane1 +djidat1 +djidris +djina@ +djistf +djiu34fg +djjansen +djjjfp +djjpnayh +djjtn11 +djkiller +djknot +djleroy +djlj9ktq +djlukmp3 +djmadou +djmarek +djml47 +djmurat +djnaff +djnanni +djneu653 +djnivek +djnoyd +djoko +djolence +djordje +djp6j +djr0ass0 +djrave04 +djrush +djseba +djshah +djsmells +djspesh +djspin +djsummer +djsys123 +djter +djthriller +djtiesto +djtj15 +djtomciu +dju83210 +djukani +djuuss +djvolli +djx400 +djy54anp +djyamaha +djz5nt4c +djzd7919 +dk +dk0369 +dk12345 +dk1533 +dk250601 +dk251290 +dk386430 +dk47sqb1 +dk4er +dk5hlspz +dk727542 +dk72916 +dk791003 +dk7delta +dk923628 +dkah0007 +dkaiq6ph +dkbike +dkd39ohb +dkdkdk +dkdkho +dkfjl34d +dkforlife +dkg3000 +dkg5m +dkgame00 +dkgsvnkl +dkhmi +dkhnr +dkjekd +dkjklase +dklein +dkm123 +dknaier +dkny5678 +dkpdude +dkpemmsk +dkpinfo +dkr123 +dkr6um +dkrj43y4 +dksthdud +dkthebest +dktww +dku5dku5 +dkup57 +dkwza591 +dl +dl020903 +dl0hgf +dl1mac +dl2579 +dl36068 +dl3mab60 +dl6tr1 +dl7177 +dlanod +dlawosch +dlb6e +dlbck55 +dlci9182 +dldbsqhr +dldid02 +dldl123 +dlemeni +dlf6d +dlfl1212 +dli2195 +dlijpos +dljcad38 +dlk5058 +dlk8rkxb +dll921 +dllrfh +dllrty +dlonie +dlonier1 +dlovan +dlove2009 +dlrulez +dltkdgns +dlugopis007 +dlus9apr +dlux3891 +dlw971 +dlypu +dlz0614 +dm +dm070860 +dm0727 +dm1234 +dm19v47 +dm2000 +dm65tx56 +dm6632 +dm720805 +dman1 +dman22 +dmark8 +dmb102 +dmb420 +dmc99 +dmchalo +dmcitf01 +dmdeda +dmdmdeda +dmercier +dmf2x +dmg452 +dmgmdm +dmhabe +dmjok +dml51888 +dmm990 +dmn2179 +dmn92nip +dmnoob +dmnroice +dmorton1323 +dmouse +dmr77yem +dmrs360 +dms1988 +dms8625 +dmsgo126 +dmsict +dmwpotm +dn920915 +dnacode4 +dnad1234 +dnalpha1 +dnbsu34 +dncgx6 +dnd123456 +dnd82109 +dndndn +dnflwlq +dnjsvltm +dnkerror +dnky +dnl1309 +dnldnl +dnn98280 +dnob +dnpass +dns0909 +dnsadmin +dnslup80 +dnstuff +dnstuff12 +dnstuff81 +dnstufff +dnt1212 +dntadmin +dnthmn +dntiafo6 +dnz1212 +dnz1977 +dnz51 +do12x3k +do13as56 +do29577 +do3xtc84 +do7304 +doa1134 +doaa1423 +doan +doan chau +doanNDf872 +doatbt +dobber34 +dobbin007 +dobbs +dobel2004 +doberck +doberman +doberman2 +dobermann +dobermann81 +dobermann99 +dobi1101 +dobi2112 +doblep +doblo123 +dobrawa +dobruna0 +dobs +dobson85 +doc +doc4321 +docdent +doce_12 +dock +docky +docnoise +docnok +docs287 +docsurto +doct0r +doctor albert +doctor jim +doctor joyce +doctor rhys +doctor! +doctor$@ +doctor28 +doctorrandy +doctrine +document55 +docusa +dod12345 +dodge1 +dodger301 +dodger3172 +dodgeram +dodgev10 +dodie +dodko +dodl +dodo +dodo01 +dodo0606 +dodo999 +dododo +dodol +dodon1981 +dodonet +dodoo +dodoria +dodos +dodrugs +dodu194 +dody +doe +doedel +doeidoei +doel +doelpunt +doener +doerte69 +dofana35 +dofffern +doftpion +dog +dog04you +dog1258 +dog21cat +dog5cat0 +dog771 +dog88078 +doga2264 +dogaege +dogazet +dogcrzy +dogfish +dogfrog +dogg0011 +dogg4205 +dogger +doggies +doggo +doggy1 +doggylover +doggys +doggystyle +dogi9166 +dogiezgi +doglas12 +dogman +dogmeat12 +dogpark +dogpeg +dogpenis +dogpoo11 +dogubeyy +dogukan +dogukan1 +dogusum +dogwalk +dogwood +doh kum +dohbulef +dohergood +dohmamay +dohmoe +dohnowor +dohote37 +doi +doibuon +doinzoo +doit42 +doitdoit +doizece +dojo +dok din +dok12 +dokimi +dokken817 +doktor +doktor90 +doktorum +doktrace +dokumaci +dol008 +dolamroth +dolar +dolares +dolaretu +dolby1 +dolby1981 +dolby3d +dolen5446 +dolette mc +dolf +dolla +dollacpe +dollar +dollar05 +dollette +dollface1029 +dolliegirl +dolly +dolly01 +dolly69 +dollyann +dollynik +dollysaikia +dolma8551 +dolores +dolores +dolores del +dolph +dolphin +dolumdolum +dolunay +dom +dom1107 +dom2002 +doma8269 +domac05 +domagala123 +domain +domainas +domal12 +domantas1 +domas +domas14 +domat4o +domcia1 +domco +domcup12 +dome0815 +dome3044 +domeika +domek107 +domek39 +domene +domenico +domenico +domenikt1 +domestic +domi +domi2y +domichri +domin197 +domin87 +dominate69 +domination +domine +domingo +dominguez83 +dominic +dominic +dominic1877 +dominicana +dominick +dominick +dominiczka +dominik +dominik +dominik. +dominika +dominikdaniel +dominiom1 +dominique +domino +domino79 +domino99 +dominoes69 +dominole +dominque +dominuna +domisas +domiziana +domo +domo1982 +domobike +domoor +domsco +domson +domteam +don +don red +don whitehead +don007 +don123 +don2etzi +don4g24s +dona +dona2009 +donack +donad +donal +donald +donald +donald mac +donald red +donald30 +donald377 +donalde9 +donall +donann +donapa +donatass +donatell +donatella +donato1975 +donaufeld +donb +donbosco +doncasino +donchavu +donchoa +dondaddy +dondeleo +dondennis +dondunn +donfunky +dong hyun +dong5254 +dongdong +dongi1234 +dongjian +dongle +dongledingle +dongs54 +dongshun +dongsook +doni69 +donia123 +donic123 +donielle +donjon666 +donkem +donkey +donkey6 +donkey? +donlup +donm1lls +donn +donna +donna +donna kei +donna lynn +donna2603 +donnelly +donner93 +donnerstag +donnie +donnie01 +donny +dono0604 +donohoe +donotuse +donovan +donovanr +donpeace +dons1968 +dons2007 +donster +donsue +dont4get +dontask +dontbrad +dontcry +dontdont +donthack +dontknow +dontmess +dontomas2 +dontpanic +dontrue +dontryit +donuts +donuts14 +donyale +doobie +doobie11 +doobieduke +dooblar +dooby +doocot +doodle522 +doodle92 +doodles +doodles +doof101 +doof2000 +doofasdf +doofi05 +dooftime +doogie9458 +doogram +dooki +dookie +dookie95 +dooky6 +doolab +dooley +doolin +doolmister +doom +doom11 +doom154 +doomcat2 +doomcow +doomer12 +doomfun +doomie64 +doomlore +doomsday09 +doon2003 +doonas6 +dooney99 +doook +doopka +door635 +doorgaan1 +dooring +doorman1 +doors8998 +doosxx +doozgle +dop1dop +dop3y7 +dope +dopeys +dopio +doppler91 +dopre +dopsys +dopy1996 +doqans12 +dor321 +dora +dora van der +dora160 +dora379 +doragon +doral +dorateya +dorbox +dorcas +dorcel +dorcha70 +dorchester +dordor +dore +doree33 +doreen +doreen185 +doreen2507 +doreen7284 +doreham +dorekape +doremi1978 +doremifa +doremon +doretta +dorfren +dori +dorian +dorian +doriane +dorien0804 +dorime +dorimebig +dorin +dorinabv +dorinne +doris +doris +doris eaton +doris10 +doris1703 +dorit +dorito3d +dorkass7 +dorkf1sh +dorks +dormagen +dorman +dormant56 +dormen +dormon +doro +doro +doro654 +dorota +dorota1a +doroth3a +dorothea +dorothea +dorothee +dorothy +dorotica +dorotka +dorottya +dorrie +dorris +dorrit +dorryg72 +dorsch +dorsey +dort +dortmund +dortmund0 +dortmund1 +dortmund2008 +doruknet +dorvalla +doryz +dos1000 +dosendte +dosfir80 +dosha +doshite +dosijex +doskp +dosntq23 +dossyo +dostalo +dosth123 +dostoevski03 +dot +dotarot +dotcom22 +dotf2105 +dothack1 +dothead +dotnet +dotorg +dots +dotti213 +dottie bee +dotusisi +dotuwr +double +doublemean +doublesnow +doud8442 +doudou +doug +doug +doug937 +dough +douglas +douglas +douglass +dougtab +douka01 +doul44 +doulos +doulos11 +dourden +dousche +douta +doutche1563 +dov +dove8806 +dovea +dovinhpc +dovis +downander +downboy +downdown +downh101 +downhill +downing +downlink1 +download +downloads +downsite +downtime +downtown +downtree1 +downunder2 +dowsha +dowux +dox740 +doxadeo +doxxdoxx +doyle +doyley +dozent +dozer1969 +dp060147 +dp0w3ll1 +dp1128 +dp2020 +dp2097 +dp251183 +dp302 +dp3mraxz +dp4747xx +dp4wg9uv +dp559099 +dp93550 +dp9fpgn4 +dpassage +dpbcz +dpbegona +dpclan +dpcnfsmw +dperyan +dpfg3 +dpgc83 +dpgunn +dph1065 +dpigunmb +dpk4z +dpkhtuiu +dplndr78 +dpmenr +dpnpw02 +dpo7web +dpound +dpqwa +dpr951 +dpsurz +dpsz8 +dpt1643 +dpveljnn +dq0n0xcv +dq516pkg +dq7gn9 +dqa10M#8s6#bF8 +dqdoti +dqhb5u24 +dqj1j +dqmoi +dqvcp8 +dr004290 +dr0kG +dr142432 +dr1zzt1 +dr250991 +dr3003 +dr34jh +dr3w832r +dr3wsc0m +dr42o69 +dr4ch0 +dr4ch3 +dr4g0n55 +dr4gon8 +dr4k4n +dr4life +dr4m0n +dr567890 +dr62tgs3 +dr7uyiub +dr8cula +dr8w9e +dra10310 +dra13344 +dra517 +dra8t95 +draamed +dracade +drachen +drachentod +dracheny +draco003 +draco5354 +dracodata +draconi5 +dracoslav3 +dracula +drafter115 +drag +drag0n +drag0n31 +drag0ns0 +drag2005 +drag2345 +draga +dragan +dragan +dragana +dragao1987 +dragao76 +dragicka +drago +dragomir +dragomko +dragon +dragon +dragon13 +dragon15 +dragon2! +dragon2078 +dragon23 +dragon2k +dragon4218 +dragon52 +dragon55 +dragon6541 +dragon66 +dragon713 +dragon8# +dragon80 +dragona333 +dragonball +dragonball7 +dragonballz +dragonbi +dragonclaw +dragoner +dragoner132 +dragonfly +dragonhunter +dragonic +dragonka1 +dragonlance +dragonlord35 +dragonmaster77 +dragonrider +dragons +dragonx +dragoon +dragoon101 +dragos +dragoste +dragur +draguss +drahreg1 +drainu +drak0nis +drakadon +drakan +drakcap +drake01 +drake2323 +drakemorter +drakes1978 +drakken25 +drakkers +drakltie +drakoman +drakon +drakon4o +drakonus1 +drakula +dral82 +draleche +drama10 +dramamine09 +drambl +dramentus +dran11 +dranc1 +dranzer +drapes9265 +draptis +dratte4563 +draugas +draven25 +draw3456 +drawdog1 +drawsap +dray38 +drayke +drayton +draziw.1 +drazmy +drb6459 +drbob +drbukv +drd04 +drd222 +drdorian +drdre27 +drdrew +drdunlop +dre7oqri +dreaded1 +dreadgay +dreadhood +dreadlife +dreadlocks1 +dreadlord3388 +dreadlord69 +dream +dream1984 +dream911 +dreamer +dreamer11 +dreamerz +dreaming +dreams +dreams118 +dreamsky +dreamung +dreamweb +dreatore +drebeng +dregba +dreggsau +dreherch +drei +dreibein +dreifas +dreim11 +drek +drekka99 +dremadmin +dremples +drenica5 +drenthee +dresden +dresdner +dresende +dresiarz +dreswe +drete +drev510 +drevare +drevo +drew +drew +drew bundi +drew1234 +drew9050 +drewbear +drewe +drewinxp +drewna +drezeze +drfever1 +drg37400 +drg82th +drgrobot +drh +drh947 +dria +dribkcaw +driepl +drift.7 +drill +drilll +drimgame +drimkast +drimse +drinck +drinken667 +drinkov +drisa +dritone +dritz183 +drivan95 +drive +drive55 +drivein666 +driver +driver2k +driver8 +drivergf +drizzt +drizzt187 +drizzt6283 +drjoshi +drk654 +drkanje +drkosch +drlacy77 +drlove +drm123 +drmadmin +drmang02 +drmmas +drndr +dro7e +droese53 +drog4t0 +drogas +drogba +drogee +drogen83 +droid +drol +dromadaire +dromedario1 +dromerc +drood1992 +droogmans +drooler11 +droolgore +droopy +droopy12 +droopy1973 +droors +droos1 +dropdead1 +dropduck +dropout411 +dropout50 +droppie +droppie171 +dropshot7 +dropsrot +droptheworld +drosario +drosdro +drosmis +drouble +drout +drowsapp1 +drowssap +drowzee +droxia +droxuser +drpepper +drpepper30 +drpepper4545 +drpfeffer +drpibb08 +drpkck +drpmy +drpsych +drq1m0d +drrig +drs +drs2006 +drsdrs +drste1911 +drstein +drszkftp +drt5802 +drtux +dru229 +dru7eche +druarty +drublic +drucker +drue +druge18 +drugs +drugstore +druid1027 +druid1123 +druid4109 +druid72 +druide +druidmax +druidrules +druids +druids02 +druidtalon +druidwicca +drukipu +drum +drum1998 +drum4988 +drumcore +drumer +drumer01 +drumer262 +drumgott +drumhead +drumline +drummer +drummer1 +drummer1954 +drumming +drummr +drums +drumsky +drunir +drunk +drunken2 +drunkzz +drusdrus +drussian +druzepsd +drv +drvodka +drw +drw1719 +drx9175l +drxqcn7z +drxryr +dry5640 +dry9h +dryjv14 +dryphus +dryqe +dryzyW +drzvl +ds +ds0219ds +ds150782 +ds1npxrl +ds2004 +ds241183 +ds346200 +ds45ets +ds4de +ds5087 +ds53ds53 +ds7muuj6 +ds7rmyf9 +ds80389 +ds80YW +ds95102 +dsa +dsad123 +dsadsa +dsaf543 +dsammler +dsamomid +dsan767 +dsasasa +dsay5 +dsb33axc +dsb9274 +dsbi2370 +dschiefx +dscrew +dscz0908 +dsd2003 +dsdadmin +dsddnm +dsedse +dsf +dsf44dd8 +dsfdsfsd +dsfesda +dsfsdfs +dsfsgs +dsg446h +dsgfgh4 +dsgmid97 +dsgs +dsgsdhhj +dsidevad +dsignos +dsilhl7f +dsiujhjl +dsjsok +dsl4ever +dsl586 +dsliadb +dslim712 +dsllsd15 +dsm1121 +dsmall!! +dsmfubar +dsndsn4 +dsninja1 +dsp1992 +dspizzle +dspoder +dsschat +dssgroup +dssodr +dst44127 +dstcal +dstlmp +dstncl44 +dstock42 +dstout55 +dstr +dstsy +dsv2003 +dsword +dsworld +dt159357 +dt2cg5 +dt6789am +dt772810 +dtantum +dtasf3kh +dtc +dtc2000 +dtcdtc +dtcfdp +dtjrc +dtjzykjz +dtkggl7i +dtlxg +dtm8524 +dtmrd3 +dtnth +dtp1221 +dtpjn +dtronly +dtsqq +dttfohmr +dtthmo +dttigers +dtvqftlo +dtw +dtxpress +dtyeiaf +du121066 +du41berg +du434an +du4wipi +du820ds +duality +duality101 +dualway +duane +duane1991 +duane2206 +duangchai +duaqss +dub +dub0815 +dubacik +dubai23 +dubel15 +dubert +dubina +dubinka +dubitaju +dublin69 +duboqe97 +dubrovnik93 +dubuque +duc +duc4t1 +ducati +ducati1 +ducati2 +ducati5 +ducatipaso +ducdt77 +ducestaley +duch0015 +duchesne1 +duchess68 +duchess84 +duci307 +duck +duck11 +duck2009 +duck7374 +duckduck +duckhunt1 +ducki007 +duckman +ducktales1 +ducky +duckys23 +ducon01 +ducs1972 +duda +dudaduda +dudderar05 +dude +dude2010 +dudedan +dudel123 +dudeman! +duden +duden12 +dudeness +duderanch +duderman +dudewhat +dudi2003 +dudidum +dudinha +dudl389 +dudley +dudley0215 +dudley44 +dudleyd +dudolf +dudrum +dudu +dudu +dudu84 +duduki67 +dudulx +dudus2121 +duece +duelme +duemarzo +duemmer99 +duester6 +duevej44 +dufe69 +duffa23 +duffett25 +duffs +duffy +dufort1990 +dufrane4 +dufseth +dufus +dugaga +dughound +duhirn +duhrup +duhuren +duicghzr +duid00 +duifje09 +duilie +duilio +duinevel +duitama +dukacke +dukaddy +dukat3169 +duke +duke +duke ellington +duke1002 +duke2004 +duke3d +duke4027 +duke4283 +duke49 +duke857 +duke89 +dukedo +dukeduke +dukej1 +dukenuke +duker +dukes' +dukeyspicy +dukicabl +dukker +dukko +dulces08 +dulcie +dulda +dullyxtt +duma11 +dumansiz +dumass +dumaurier +dumb +dumb8812 +dumbass +dumbasss +dumbell25 +dumbhorses +dumbo312 +dumcu113 +dumdidum +dumdum9 +duminik +dummdie +dummhaha +dummy +dummy500 +dummyc +dumpass1 +dumper +dumpty +duna6en +dunadan1 +duncan +duncan +duncan21 +duncan420 +duncan48 +duncanvi +dunchess +dundee +dundee90 +dunduk +dune2 +dune34 +dune4723 +dunedain +dunerhem +dunes1 +dung +dung87vn +dungeon +dungeon67 +dungeons123 +dungiis +dunhill +duniel6 +dunkel120 +dunkel99 +dunkley +dunlex +dunlop90 +dunning2009 +dunno +dunnon +dunnow +duolaigv +duong84 +dupa +dupa1125 +dupa12 +dupa123 +dupa14 +dupa1987 +dupa231 +dupa400 +dupa41 +dupa8 +dupa8222 +dupacyk +dupadupa +dupajeza +dupatata +dupcia1 +dupeczka23 +dupeczkaqwerty +dupek1 +dupencio +duplicate +duplicity19 +duplo903 +dupsj4 +dupsko +dura123 +duracell83 +durakslv +duran +durang930 +durango99 +duras +duratec +duraz1 +durban +durbin58 +durchstarter +durda +durdinle +durex007 +durge22 +durham1970 +duri1lm8 +durias +durike +durimand +duritz +durkadin +durkan +durko +durmel +durmus88 +durnell1 +duro +duron +dursun00 +durumae1 +durzo +durzu +dus +dusa +dusackse +dusang4539 +dusanvv +dusko +dusko +duster123 +dustin +dustin +dustin83 +dustine +dustinmail +duststar +dustt +dusty +dusty1 +dusty99 +dustyb0y +dustydog +dustye +dutch +dutch +dutches2 +dute001 +dutilleul +dutruc +dutz +duuunk +duvel450 +duvido +duwup +duwurst +dux2000 +duyen +duygu +duygum +duykhanh +duymaer +duysam12 +duzduru +dv +dv0610 +dv100207 +dv1928 +dv2boit +dv5050 +dv885522 +dvUPup +dvbawy +dvd +dvd1225 +dvd19784 +dvd2450 +dvdvcd +dveled +dvg665 +dvirdvir +dvivon +dvkbd +dvkck +dvlocgb +dvoa1dyp +dvoboj +dvora +dvorak +dvorok6 +dvrg7v6a +dvservus +dvsteam +dvu53cgh +dvu8r +dvvsgts +dvw123 +dvx4pz49 +dw0565fr +dw123456 +dw2780 +dw3801 +dw3991 +dw3lla +dw3rhs +dw912cow +dwade2105 +dwarf +dwarfc +dwarfman +dwarfpal +dway73 +dwayne +dwd +dweezil +dwhsvd +dwier +dwight +dwight +dwighthorn +dwiks +dwirules +dwl3487 +dwlpl +dwo0k +dwr00t +dwr76943 +dws1978 +dwsou +dwsterra +dwxmey +dx2269 +dx47piu +dx871271 +dx91212 +dxbfy1sn +dxdfrt +dxdv6gy7 +dxfethf +dxg4m2c +dxisback +dxjmr +dxq09 +dxrocks +dxrst1 +dy17907 +dy1968 +dy1fa +dy889161 +dyah6196 +dyan +dyann +dyanne +dyc2306 +dyc3a6f +dyc862q7 +dychadycha +dyd218 +dyd2mi +dyeedia +dyguu +dyk +dyke1548 +dylan01 +dylan0525 +dylan17 +dylan2 +dylan3369 +dylandylan +dylanf +dylanh +dylantje +dyllwynn +dyluchna +dymysys9 +dyn7532 +dynaflat +dynamic1 +dynamite +dynamo88 +dynamo91 +dynamode +dynastar +dynasty101 +dynax9xi +dyndel76 +dynflash +dynh416 +dynie +dynx +dyonisus +dype46 +dypjg9 +dypsy +dyqjoge +dyrektor +dys1qay +dysan +dyub9e +dyvf0 +dyvnw9uu +dywan1 +dyxoi +dyzohq9a +dz197403 +dz726 +dzakarta +dzda08ka +dzfitbbs +dzgpts6b +dziadek1910 +dzialas +dzieciaki +dzigis +dzigitas +dzik12 +dziopa1 +dziubel +dziudo +dziunek +dziwka +dziwne +dzonis +dzs123 +dzult1ym +dzwbsjqd +dzxctx +e +e'lon +e0020 +e0123456 +e0241183 +e025b2d +e02b801 +e08284 +e096cc6a +e0adfbdb +e0admin1 +e0afeb +e0asthma +e0bright +e0e05bb9 +e0endia +e0f488d0 +e0f6e9 +e0hotrod +e0kj8pnz +e0mc2 +e0newton +e0neyw1 +e0onkelz +e0r7i1c7 +e0sanders +e0seashore +e0sergun +e0stafford +e0story +e0uann +e0yesboy +e10rp0g1 +e1170887 +e11880g +e11yb34r +e120tdk +e123852 +e1250626 +e127ak +e12cea7 +e15c1a +e15nrg46 +e161910 +e16790ml +e174984c +e188c0 +e18ca1 +e18d76e1 +e1908c +e1967 +e19bfe70 +e1a2g3le +e1c8b393 +e1cartman +e1corsair +e1discover +e1eee85 +e1ef5501 +e1gip1to +e1it3 +e1m4d +e1mandolin +e1maremac +e1michelle +e1nikolaus +e1panasonic +e1parrot +e1r2t3y4 +e1ranger +e1stanley +e1tijani +e1v1ssa +e1wokki +e1y2u3p4 +e2041376 +e22891 +e230366e +e25051983 +e25e9ee +e26273b +e2858503 +e2Borstel +e2aquarium +e2asterix +e2baxter +e2cbfb +e2d42776 +e2d4f6s8 +e2dm7ea +e2e15cbd +e2e64e16 +e2e6bb7 +e2e71381 +e2f1c615 +e2flem +e2lht +e2maillet +e2naomi +e2neale +e2penfold +e2poiuytre +e2ryl +e2sergio +e2technics +e2trapper +e2tyyyh2 +e2yemaya +e2zaiz8m +e3085008 +e3090e1d +e3123698 +e31416 +e32476c +e3364a +e350ppc +e36124gh +e3651635 +e36gs282 +e374e169 +e37bzk8 +e38508189 +e38ldp +e3b848 +e3beach +e3c7127 +e3ccle +e3ee2434 +e3emporio +e3evermont +e3f973 +e3f9954 +e3fairmont +e3freeze +e3king +e3ktk7kn +e3liefje +e3m1hwab +e3omdp +e3scholz +e3scooters +e3someday +e3tigger +e3y9lzbf +e3zk9v +e4019bb +e4109a +e42503 +e427vkw +e4387d +e44o45 +e45a9e5 +e495ac30 +e4Bomber +e4PASSWORD +e4SATOKO +e4T +e4Woolwich +e4a2907 +e4aqo +e4boubou +e4c433 +e4c67f +e4carman +e4ccd2 +e4delft +e4dui +e4f156 +e4g2oh33 +e4gb6i9 +e4gshock +e4hy5w +e4jazzjazz +e4macalla +e4meisei +e4r3d2i1 +e4saltbox +e4skipper +e4splhcb +e4superdoc +e4susan +e4traffic +e4y3hac +e4zahac +e5 +e509ba +e50fce7b +e54409734 +e56gerg +e5711438 +e57fsa3p +e584e24 +e5917131 +e5959564 +e5ADKINS +e5Rodrigo +e5a4556 +e5b83w +e5baggie +e5carida +e5clemson +e5e82a +e5magnolia +e5mamamia +e5mandie +e5mbf +e5pidgeon +e5samuel +e5thyroid +e5traes +e5x19s +e5zenaro +e5zumpz4 +e6073601 +e6105143 +e617yj8a +e63a68 +e6463e +e6514 +e66859 +e6799b +e67pjxez +e6956645 +e6SIENNA +e6Trojan +e6a3a8p +e6cranberry +e6d099e +e6garden +e6global +e6gzw +e6k14yy8 +e6kcz +e6natural +e6pqlxsd +e6puppies +e6rjo +e6shijian +e6sporting +e6t4a9w4 +e6xsvdaa +e6zvi +e7195512 +e71d4f +e73650 +e746476 +e74oblq +e759d3f3 +e761b3 +e7810777 +e78e6d +e79Vhx +e7Matthias +e7amv +e7auerbach +e7ckm +e7clive +e7e544df +e7f7ca +e7fc32c +e7fucker +e7gkoc68 +e7kamaole +e7l8i9o4 +e7laffan +e7m4rku5 +e7pass1 +e7perls +e7scouts +e7scrumpy +e7sisley +e7wilfred +e7wuyw60 +e7xiaofang +e7xmoeae +e7z3d9y3 +e80180809 +e807c2a +e8267f +e843wx +e84akt +e84edbd9 +e8510420 +e8615a1d +e87cg5 +e8OLKg +e8c4a12b +e8c5f45 +e8champion +e8gemini +e8hsieh +e8j8b583 +e8madrid +e8medsys +e8murphy +e8nxbr4p +e8umt +e8yeu +e900 +e9032684 +e9040299 +e9141fb4 +e91438144 +e944321 +e951194 +e99e744b +e99p1ant +e9N3k2 +e9a8c9 +e9a8d8d0 +e9c908 +e9cipos +e9cook +e9doskas +e9f064 +e9f253d +e9fatboys +e9fb2eda +e9gkoo68 +e9lehnert +e9miriam +e9molly +e9perdita +e9rseh4p +e9silver +e9solebury +e9titititi +e9tivion +e9tluv +e9waterboy +eFin34 +eLSEj +eMule +eNjOdA +eNte +eSel99 +eSoftware +eU88pj +eVgUwm +eXoDuS +ea +ea1088 +ea1764 +ea1987 +ea1bfe +ea2003 +ea2ca15e +ea40b32c +ea51okp +ea5678 +ea624457 +ea681816 +ea6c6a7c +ea97f4d0 +ea999999 +eaAnnette +eaa47a +eaa8d8b +eaacc +eaapfelmus +eab1225 +eabobobo +eac1ac78 +eacan2 +eachit +ead264 +ead4b7 +ead99 +eadb50dd +eades +eadlfj +eaea +eaefa +eaefafon +eafmc05 +eag +eagle +eagle007 +eagle6 +eagle631 +eagle7585 +eagle78 +eagle8 +eagleeyes +eagleita +eagleman07 +eagleone +eaglepc +eagles +eaglescout05 +eah1400 +eainsect +eais9 +eakry +eammon +eamon +eamon1992 +eamona +eamont +ean +eanataraja +eanfs12 +eanma3ws +eannia +eaobioma +eaog0x +eapoe777 +eaqwssdf +ear12u9 +ear1i +earboy +earendil +earhc01k +earhost +earl +earl2000 +earl3535 +earle +earnest +earth +earth1 +eartha +earthworm +eashirley +east +eastcoast +eastend92 +easter +easter342 +eastereg +eastern +eastretch +eastroad2 +eastside +eastwest +eastwood +easw76 +easy +easy1 +easy1016 +easy12 +easy123 +easy2006 +easy76 +easyas +easyline +easypc +easytodo +easywind +eat295 +eat66 +eatit6 +eatme +eawies +eawz5nao +eaxxxxx +eaydin +eb +eb00a2 +eb0y1 +eb157157 +eb2006 +eb2006t +eb3oe +eb405eb +eb5665 +eb624 +eb6617 +ebabillo +ebasuq +ebayde +ebazalar +ebb +ebboogy +ebcalvin +ebd104 +ebd235 +ebd89f +ebdb102b +ebdeac +ebdelamare +ebe4420 +ebeac45 +ebenemi +ebenje +eber60 +eberhard +eberhash +ebet1233 +ebhippie +ebiz2mk +ebjaguar +eblLCF +eblafv +eblynx +ebmincho +ebnavrot +ebola +ebonybox +ebook +ebook420 +ebpegasus +ebrar123 +ebrasov1 +ebru +ebrumut +ebsmookie +ebx181 +ec +ec12em +ec238968 +ec269b9 +ec2904 +ec2b03ca +ec361708 +ec3forum +ec3muq8h +ec4232 +ec6bfbb4 +ec88f8 +ec9c11 +ec9e02 +ecAugust +ecGareth +ecPatrick +ecacting +ecarg821 +ecasales +ecaterina +ecatlantis +ecbe4tup +ecbhavani +ecbobann +ecbulldawg +ecc412 +eccd460 +eccor123 +ecd3644 +ecde2134 +ecdysten +ece14f +ece9d5 +ecedlgi +ecefjga +ecetara8 +ecf2a11c +ecf7n +ecfkrcq +echa1980 +echedos +echel0n1 +echelon +echnAton15 +echo123 +echo1883 +echo223 +echo2u +echo94 +echoll +echomar +echt01 +echttoll +ecialinav +ecilopfr +eckerte1 +eckhoff1 +eckl1860 +ecko24 +eckoffo +eclipse +eclipse351 +eclipse85 +ecluciana +eclypse +ecmenus +ecmyt +ecnHh +ecnalder +ecnlsnd +eco34 +eco4190 +ecoffee +ecofrankfurt +ecoles +ecological +ecology +ecomatic +econ2001 +econs005 +ecopark1 +ecosu +ecowxy +ecqwe123 +ecr4k +ecram +ecran +ecsmain +ecstasy +ecto123 +ecto83 +ectoplasme +ectp4 +ecttszz +ecwcwwf1 +ecwgbxej +ecwhisky +ecxrcm9h +ed +ed04255 +ed06 +ed130884 +ed194219 +ed20776p +ed24680 +ed3790 +ed43529f +ed4747 +ed4d0d +ed4d6f3 +ed63a2 +ed7rwdq4 +ed821112 +ed8677 +ed8da1 +eda +eda reiss +eda reys +edalb1984 +edana +edanur +edaudio +edb +edbc123 +edbr759a +edcba +edd +edd1369 +edda +eddactylo +eddaed +eddeee +eddi +eddi01 +eddi0102 +eddi2401 +eddie +eddie +eddie foy +eddie kane +eddie little +eddie03 +eddie222 +eddies32 +edding +eddra +eddy +eddy +eddy1 +eddy14 +eddy93 +eddy9999 +ede7kamp +edebiyat6 +ededed +edelemu +edelhoff +edelmarder +edeltraud +edelweiss +eden +eden2009 +eden7777 +edenlin +edenorte +edenroc +edenrules +edentune +eder +edersoft +edessa1144 +edez +edf2007 +edf39bdf +edfgdf +edg59th +edgar +edgar +edgar1939 +edgar23 +edgar445 +edgar714 +edgaras +edgardo +edgarela +edgarl1 +edgarmx +edgarpoe13 +edge101 +edge143 +edgebrook327 +edgeedge +edgerush +edglasgow +edhardy +edhonesty +edi1 +edi2004 +ediambad +edibletv +edie +edie kerouac +edik +edikshef +edilson +edimax +edin1986 +edina +ediroma +ediscool +edison +edissonn +edit +edit +edit2art +edith +edith325 +edith9339 +edithmx +editor +editor103 +editor4930 +editor725 +editor77 +editor919 +editwp7 +edivad +edizlens +edk8765 +edle +edlock +edlr87mz +edlund13 +edmeston02 +edmin +edmn1909 +edmo7694 +edmon +edmond +edmond +edmund +edmund823 +edmundgray +edmundo +edmunds12 +edmynameis +edn7mxxt +edna +edna mae +edna may +ednalyn +ednet5070 +edo +edoardo +edoardo +edocedoc +edodin +edofga15 +edona +edouard +edparker +edra +edragon3 +edric +eds5a2mz +edsamurai +edschnucki +edscomng +edson1981 +edsunshine +edsymone +edterra +edtimar +edtivion +edu +edu2485 +eduard +eduard02 +eduardo +eduardo +eduardo1988 +educastream +education +edukriss +edula123 +eduse95 +edv1912a +edvard +edvard98 +edvardsen78 +edvbuecher +edvin +edvirginia +edvssr +edward +edward +edward entero +edward everett +edward james +edward tap +edward3568 +edward715 +edwards +edwards101 +edwestmere +edwige +edwin +edwina +edxg8jr +edy +edy +edy5591 +edycjaxp +edypos74 +edyta11 +edythe +edytka +ee012470 +ee1015 +ee1c863 +ee335205 +ee6d03 +ee6fbd +ee86888 +ee9d82 +eeWakW +eeacmilan +eeadmin1 +eeadvance +eealfons +eeapollo13 +eeasterr +eeblackdog +eeboubou +eec5382 +eechaton +eechever +eecvazo +eecyxea +eedeers +eedef7 +eedge93 +eee +eee1998 +eee222 +eee3z +eeeeee88 +eeeeeee +eeesss +eeeyore +eef15an +eefae2ee +eeh45f +eehpqedc +eeif8 +eeireland +eelsrock +eemaddie +eemborg +eemf9ww6 +eemgemz +eempdf +eepatoka +eepowers +eer123456789 +eersel4379 +eetmeter +eettafel +eeupgrade +eevee31 +eevudr82 +eeyinyin +ef +ef123 +ef12421 +ef46zovk +ef6bc40 +efAbsolute +efPARYS +efaday +efakitas +efc03aba +efcabbage +efcccc +efcia9pl +efconfiant +efdogman +efe31d33 +efeberat +efece +efelant +efeler4 +efendim +eferim +eferreira +efestiga +efever79 +efexor +eff244 +effe +effe5466 +effeckt +effectiv3 +effecto +effectt +effert +effertz +effi +effie +effon111 +efg598 +efglobal +efifuga3 +efifuga4 +efigenia12 +efioa1 +efiram +efm33 +efmi85 +efpersist +efpheobie +efpino +efqweasd +efren +efrin +efs1785 +efsane +efsidims +eftalya +eftedal1 +eftigeld +efufleue +efva +efwaiheke +eg3962 +eg5525 +eg654321 +eg9ha +egal +egal01 +egal1983 +egalwas33 +egames +egbdfe +egbirdie +ege +ege35 +ege58 +ege69rmg +eged3455 +egemen +egemweb +egersund +egeskov123 +eggalpp1 +eggarip +eggdance +egger5000 +eggert +egghead +eggis1234 +eggon +eghacked +egidio +egieynd +egisto +egj8qok6 +egjoxbli +eglantic +eglantine53 +eglass1 +egle0599 +eglute +egmond09 +egnplm +ego +ego02 +ego1092 +ego877 +egocontrol +egoisme9029 +egoist +egon +egon7901 +egoramigo +egp12car +egpass +egqzawxv +egr4t6 +egracing1 +egreinmc +egropa +egs9m +egtmeye5 +egtrll +eguiamo2 +egupp +eguusc +eguw7 +egyniter +egypt +egyptdog +egypteam +egyptian331 +egzona +eh12345678 +eh161270 +eh2191ma +eh2hnhqf +eh6q3mzx +eh89xru5 +ehaape +ehahoxug +ehbeecee +ehcrllig +ehcsnnir +ehefrau1 +ehefrau2 +eheheh12 +eheim +ehf555 +ehfkjhty +ehgeietv +ehh +ehhjp6sq +ehj3oplq +ehk10kxe +ehlvofg +ehmi +ehmsen92 +ehqmz +ehren33 +ehrenfeld +ehrsam3 +ehsane +ehtar45 +ehuehu +ehx7t +ehy80lqf +ehyoybw +ei264153 +ei3dei +ei5423e +ei99tje +eiadop +eias2004 +eibo84 +eic9q +eiche29 +eicher361 +eichwalde2010 +eicingo +eicv225 +eidflow +eidke +eido4257 +eidos6367 +eieio +eieio12 +eieiou12 +eierkopf +eierkuchen +eierneger +eieruhrr +eierwisch +eiewtgs4 +eif896 +eiffel65 +eifler7 +eifos* +eifxf3ya +eigawol +eight +eightball03 +eighteen8 +eightit +eiji +eika +eika96 +eikc55r8 +eiko +eikoss +eiktunx +eilan01 +eilatan6891 +eileen +eileen o'reill +eileen987 +eileen99 +eileene +eilene +eilensen +eilertzen +eilhelm +eilidh +eilif +eilonlo +eily +eimaeima +eimear01 +einStein1 +einar +einar perry +einari +einari88 +einasikt +einfach +eingedi3 +einkaufen1 +einschlag +einsmerk +einstein +einstein82 +einstein9 +eintest +einticig +eintracht! +eintracht# +eintracht1959 +einveldi88 +eiram524 +eirik1993 +eisa4ever +eisbaer03 +eisbonbon +eisenbahn123 +eisenfresser +eisern +eishockey88 +eisi +eisi69 +eiskalt +eislamay +eiswurm +eiszeiten +eitaro +eitask +eiter +eitthvad +eiv1yuv +eivissa +eiwy85 +eixy372 +eizo +eizo +eizo1974 +eizoeizo +ej8d16y8 +ejanjs03 +ejauz +ejazone +ejchen13 +ejdnjs2010! +ejefln23 +ejhy7 +eji +ejiri111 +ejko +ejlh3 +ejlmejlm +ejm456 +ejmsw +ejn0181 +ejp0911 +ejpdcm +ejproms +ejqgvirj +ejqvt +ejqzu +ejrqbm6z +ejshz049 +ejt9s +ejteam42 +ejzys +ek +ek3p4q +ek68istu +eka57mol +ekamusik +ekaterina +ekaterina +ekattack +ekband +ekeimenna +ekelhoff +ekendall +eketem +ekf8t +ekidna +ekii2000 +ekim +ekimetoc +ekkehard +ekmekyemez +ekofresh +ekolas +ekolas1 +ekolay +ekonomia +ekopaket +ekoputra +ekose37 +ekou5 +ekrem +ekrem311 +eks +eksbyrkd +ekt379wv +ekuva +ekwador +ekyle1 +ekzxk9yt +el +el0dSz +el1 +el1259 +el1bs8rk +el327 +el7150 +ela2byex +elacero +eladles +eladna1m +elaine +elaine +elaine15 +elal1988 +elamanu +elan77 +elanii +elanoriloveyou +elariane1 +elarto +elayne +elaynie +elbarto +elbasan +elbe123 +elber1 +elbethel7 +elblag +elbolso +elborj +elbosco +elc38lx +elc6l +elcairo8 +elcallao +elcattivo +elchkuh +elchw33 +elci123 +elcia38 +eldasa +eldawen +eldelron +elder +elders +eldersss +eldest141 +eldest9100 +eldiablo +eldin1994 +eldine76 +eldon +eldran8877 +ele +ele123 +ele21303 +eleana15 +eleanor +eleanor +eleanora +eleanore +elearner +elec499 +elechos +elect1 +electra +electra920 +electric1 +electro +electro123 +electronic +elecyp +eledgeo +eleet123 +elefant +elegant86 +eleganz6 +elegia +elegua247 +eleina62 +elektra1 +elektro +elektroda +elektron +elektron1 +elektronika +elektrotroll +elektryk169 +eleman +element +element1 +elementet20 +elements +elements123 +elementx +elemi88 +elemiset +elena +elena09 +elena123 +elena22 +elena326 +elena799 +elena87 +elenaelena +elenaeng +elendil +elene +elenews +eleni +elenijanna +elenita +elenor +eleomore +eleonora +eleonora rossi +eleonore +eleonore67 +eleos5210 +elepant +eleph8nt +elephan2 +elephant +elequipo +eleta +eletai +elevator23 +eleven11 +eleven421 +elf89 +elfa3532 +elfenscheise +elfette +elfique +elfkam +elfman +elfmeter06 +elfo +elfriede +elfriede +elfuertes +elg47lea +elga +elgatowow +elguiri +elguite +eli +eli240 +elia +elian +eliana +eliane +eliane051 +eliane1 +elianor18 +elianore +elias +elias +elias01 +elias12 +eliaspour +elica77 +elicec +elida +eliedg +eliezer +elif +elif1985 +elif44 +elifcik +elifff +elifim +elifim70 +elijah +elijah06 +elijahlk +elilan +elilisa +elimomma +elin2312 +elina +elina85 +elinakis +elinas +elinemaja +elinga14 +elinin +elinor +elio +eliomara +elior002 +eliot +eliot0120 +eliot1973 +elipsis +elipsis22 +elisa +elisa1 +elisa184 +elisa2109 +elisa5 +elisabeth +elisabeth +elisabetta +elisaleo +elisangela +elisatat +elisb123 +elisb123 +elise +elise1979 +elise4me +eliseopg +elisha +eliska +eliska65 +elissa +elit34 +elite +elite. +elite117 +elite123 +elite359 +elite45 +elite6 +eliteasy +elitebet +eliteh +eliten12 +elith +elive09 +eliven +eliz2266 +eliza +eliza99 +elizabeth +elizabeth +elizbieta +elizel2p +eljas681 +eljefe +eljor +elk484 +elke +elke +elke2501 +elkek +elkelbey +elkiler +elking67 +elkjelkj +ella +ella mae +ella40 +ellada +ellada01 +ellada912 +elle +elle4612 +elleen +ellefell +ellen +ellen claire +ellenbayer +ellennis +ellenora2010 +ellepj +ellessar +ellevenor +elli +ellie +ellifabi +ellington87 +ellion +elliot +elliot1978 +elliott +elliott +elliott6 +ellis +ellis1 +ellmau +ellone +elluthe +elly +elly +ellye +ellyn123 +ellypsis +elm3003 +elm704 +elma +elma1708 +elmalo +elmalo9 +elmar684 +elmas958 +elmer +elmer+ +elmers34 +elmers456 +elmicou +elmilo +elminster +elmira92 +elmo +elmono +elmopp +elmrin +elnar +elnino21 +elnoesel +elo123 +elo4ka +elocr8 +elodie +elohim +eloim68 +eloisa07 +eloise +eloise +elojtd +elorap +eloreja +eloy +eloy123 +eloy1926 +eloy2006 +elpapa +elpasotx +elpass +elpedia +elpillo +elpipoli +elpollo +elposeso +elprof +elqnas +elric420 +elrobin1 +elroikoo +elsa +elsa7902 +elsadmin +elsadog +elsaida +elsaleo9 +elsayed81 +elsburg3 +else +else1944 +elsemops +elseve +elsever +elshaddi +elsham +elsie +elsie benjamin +elsie jane +elsilein +elskereis +elsoyyo +elspeth +elstal +elsteve +elsutor +elsyrde +eltest1 +eltest2 +elthug11 +eltm0811 +elton +elton21 +elturrutle +elune4me +elusiey +elv4g +elvafan +elvee21 +elven007 +elvia +elvia1111 +elvin +elvira +elvire +elviry +elvis +elvis +elvis007 +elvis123 +elvis987 +elvis999 +elvissimo +elw1337 +elwenn +elwin +elwood +elwreb85 +elwyn +ely +ely81 +elya +elyr746 +elyse +elzapato +elzapop +elzbieta +elzem +elzie +em0z10nt +em170588 +em1959 +em1986re +em2008ac +em24ac +em3e551n +em4124ts +em4dm1n +em4k8r +em77tr25 +em9kx3cq +emaNuel +emaadmin +emacsnow +emad1369 +emad1409 +emad1990 +emadany +emaho +emaik2 +email +email123 +emalatif +eman2006 +emantis +emanuele +emb1040 +embe1990 +ember100 +embla2004 +embombie +embranco +embrarr +emc111 +emc4good +emdnnth2 +emek20 +emel25 +emelieta +emeline +emelite +emerald8 +emeras1 +emercom +emerelds +emergpmd +emeric09 +emerica +emerica1 +emericaboy +emerik +emerlynam +emers0n +emerson +emerte +emery +emestoiw +emhsncca +emi +emichael1 +emiel +emigenie +emiizz +emil +emil +emil0902 +emil1977 +emil2000 +emil8080 +emile +emilhic +emilia +emilia2007 +emiliaemilia +emilian +emiliano +emilie +emilie +emiliejb +emilien89 +emilija +emilija +emilio +emilio +emilka +emille1 +emillia +emillie +emilonga +emily +emily +emily0510 +emily1 +emily3 +emily69 +emily773 +emily8688 +emilyann +emilyguo +emilylois +emilyp +emilyvl +emine +emine28 +eminem +eminem1 +eminem22 +eminem55 +eminem77 +eminem96 +eminemas +eminemdotcom +eminems2 +eminos +emir angel +emir195 +emirhan +emirtuna +emisans +emisd333 +emitoth1 +emitter1 +emixam +emkidk +emlen +emlyn +emma +emma +emma0112 +emma03 +emma0727 +emma1999 +emma3543 +emma4mic +emmag +emmagin +emmaline +emmaluise +emmamino +emmanuel +emmanuelle +emmapeel +emmarie10 +emmepot +emmerich +emmerlords +emmet +emmett +emmett pappy +emmette +emmi0202 +emmi2311 +emmie999 +emmitt13 +emmitt22 +emmop34 +emmudbd +emmy +emmy53 +emocoes +emogirl +emoish +emokid +emokid1 +emolevi +emomusic +emoney +emory +emorysf +emotion111 +emountain +empaleur +empass +empathy +empe123 +emperor +emperor +emperor138 +emperor47 +empire +empire1x +empire20 +empire32 +empire69 +empires +empti8p8 +empty1 +emptycups +emq1w2e3 +emrahcan +emre +emre123 +emre2004 +emre3673 +emreemre +emremm +emrepet +emrock7 +emroy123 +emrullah +emryn666 +emrys +emsbaer +emsima12 +emslkj5 +emsrjfe +emtynn +emu +emubones +emuhack +emulation +emule +emuler +emupedia +emus639 +emuspace +emuupper +emw340 +emwu +emxsm8y9 +emy1472 +emz1991 +emzy1988 +en1012 +en10saio +en1659 +en18jm81 +en1gma11 +en2007 +en3sis +en49rt2 +en50ib39 +en9fa +enabled +enailan +enamorada +enanito5 +enanitos +enanitos21 +enano1 +enard85 +enas80 +enavant +enayat +enc2345 +encarna +encarna2 +encarta +encarta8 +enclan +enclosed +encore2001 +encrypted128 +encule +encyklopedia +endelon1 +endemii +endend +ender090 +ender320 +ender422 +ender86 +ender9999 +endilim +endless +endless23 +endlich22 +endlich81 +endlos2000 +endo122 +endodkp +endomorph2 +endor21 +endor666 +endorphin +endoume +endre +endsieg +endzeit +endzeit666 +enea +eneamoe2 +enefis +enegroth +enekin +enekuri +enelson +enemoi77 +enercity +energetic +energia2005 +energizer +energy +energy1029 +energy2k +energysistem +eneri48 +enero +enersha +enery123 +enes +enetri82 +enfocus5 +enfoiro +enfomuka +enforcers143 +eng +enga1329 +engageme +engel +engel07 +engel1 +engel123 +engel13 +engelbecken +engelbert +engelchen +engelein123 +engin +engin512 +engine +england +england9313 +englisch. +engomi +engraved2 +enhp1636 +enhxko +enialis +enid +enie2662 +enigma +enime +enirobr +enishi +enius123 +enix7069 +enizevop +enjeru123 +enjiaska +enjoy +enjoycocaine +enkellisa +enlightened04 +enlightened3 +enmuyy +enn1godd +enna5u5 +ennazus +ennesse11 +ennio +ennio123 +enno1976 +enny +enny5400 +ennyton +enoch900 +enoecafd +enogtyve7 +enoguor +enora +enoska +enqfyvrn +enqlet +enrica maria +enrich +enrico +enrico +enrico maria +enrico-maria +enrico2816 +enrike1993 +enrique +enroque382 +enrroque +enschede +enscts +enseirb +enshu +enspiral +ent4er +ente1980 +entebbe86 +enteka11 +entenficken +entennest1 +entenpark +enter +enter1 +enter123 +enter1959 +enter2003 +enter4734 +enter88 +enteract +enterbr +enteredstr +entermod +enternow +entero +enterprise +enterprise +enterprise1991 +entertop +entheman4 +entheos7 +entities6d +entomo10 +entorno +entosd +entr03 +entr0404 +entra +entrada1 +entrar +entrepid +entreri +entreri1 +entrium +entropia +enu7hu8n +enudj +enur2211 +env11rom +enver +enver111 +enver1993 +envoi +envoysys +enxlg +enya99 +enyllock +enza +enzcc +enzed005 +enzio1234 +enzo +enzo +enzoal1 +enzof50 +enzoleo +eo2002 +eoakago +eoan9 +eoapf +eobalj21 +eoexk +eof113v +eogksalsrnr!@# +eoliu661 +eolpfk +eorgf324 +eosi77 +eotstx +eowns +ep1000 +ep160877 +ep170787 +ep1tsota +ep4488 +ep46oci +ep576gt +ep58tojm +ep5ut76v +ep7tyhzo +epacweb +epatha +epbfsi +epbjm +epc2143 +epcmil +epcnor +epcot1984 +epcs3004 +epectaza +epelein +eperez +epesses +eph611 +eph61118 +ephbc +ephion +ephot2c7 +ephu98s +epic4me +epic6782 +epica8864 +epicapa +epiclulz +epicsrule +epiphany +epiphone +epirr +epitech +epjoomla +epkv +epl5200 +epl6200 +eplekake +eplrm213 +epnewss +epnwm +epoch2 +epona333 +eponas +eposfirst +eposter +epottam1 +eppilK +epqhoudd +epqs0 +epress55 +epsilon07 +epson +epson10 +epson123 +epsonc48 +epsonrules +epstron +eptsam +epukrlxv +epx7o +epx96 +epy3u +epzvyv1c +eq086 +eq800208 +eq8bbk9w +eq9102 +eqdkp1 +eqeloy +eqmq1898 +eqmv32 +eqo4j0vs +eqsyla +eqtvsz +equ4t0r1 +equine11 +equinox +equinox8472 +equique7 +equus29 +eqwi97 +er1851 +er1c +er33tz +er3451 +er45ik89 +er45rt +er5xdl +er8my +er8zzwhg +er9715 +era91 +eraclio +eragon31 +eragona +erakjobo +erally82 +eran96 +eraqus +erar5ro +eras3r +erase +erasec +erased +eraser2k +erasmo +erawxyz +erazer +erbaalim +erbacher +erbil +erbipl +erc165 +ercan +erci3238 +ercilia +ercin +ercoer +erdal +erdbeben +erdbeere +erde007 +erde69 +erdeck +erdem +erdem3 +erden1953 +erdener000 +erderdas +erdfgde +erdinger +erdini +erdkunde +erdo2009 +erdogan29 +erdrausch +erdrick +erdungen +ereet +erehtyysq +erekday +erel1211 +erelis123 +eremso1 +eren +eren77 +erenbaba +erenbala +eresburg +erez1978 +erf154 +erfolg07 +erfolge1990 +erford +erftui +erg207 +erginho +ergio1 +ergot1 +erhan +erhanerhan +erhard1958 +erhard1979 +erhardt +erhjgxbr +eribear +eric +eric burton +eric0000 +eric10 +eric1031 +eric1106 +eric123 +eric2551 +eric6153 +eric6666 +eric7301 +eric8sson +erica +erica6208 +ericaaz +ericcabral +erich +erich +erich1307 +erich87 +ericishere +ericj9991 +ericjq56 +erick +erick +erick1999 +ericka1 +erickant +ericko624 +ericsson +eridan +erik +erik +erik13 +erik2007 +erik2261 +erik23 +erik2907 +erika +erika +erika05 +erika1 +erika811 +erikad1 +erikainge +erikas +erikhhhh +erikito +erikjan12 +eriko +erikro0112 +erikruler +eriksen96 +erildil +erin +erin o'brien +erin7277 +erinjean +eris23 +eris66 +erisa +eristoff +erivelto +eriwan24 +erix08 +erixon17 +erkam1 +erkan007 +erkan111 +erkelenz +erkenek +erkin35 +erland +erle +erlend123 +erlend1994 +erma +ermadean +ermal +erman +ermand +ermanno +ermannox +ermellino +ermete +ermira +erna martha +erna2003 +ernc5150 +erner234 +ernest +ernest +ernestina +ernestine +ernesto +ernesto gomez +ernesto369 +erni +erni +ernie +ernie +ernie0124 +ernie9 +erniel14 +ernis +ernita +erno +erno +ernsim +ernst +ernst99 +ernte23 +ernten +erocorp +eroftei +erojah +erojas +erol +erol516 +erolerol +erolisse +eron +eronveru +erookie +eroov494 +eros +eros +eros2000 +erosi +erotan2k +eroticfew +erotikus +eroucm +err454 +erratum +erre +erre9b10 +erreud +errol +errol +error +error285 +error404 +error666 +erroras +ershwend +ersinim +erskine +erst71 +erster +ersvf +ert345dfg +ert578 +ertan364 +ertegun +erthes80 +ertrunken +ertusjoe +ertz5746 +eruh +eruidfjk +eruption10 +ervhaz +erville +erwann +erwin +erwin +erwina +eryaman1 +erz25tr +erzsebet +erzsi +es +es09c881 +es0teric +es1223 +es16812 +es2ws +es5324 +es5463 +es880513 +es99ltd +es9eji2d +es9er +esN571 +esa +esaaktuell +esaase12 +esacata +esacatad +esaurito +esbbpw +esc1 +esc1abc2 +esc2010x +escada +escaflowne +escalade +escalation +escalator73 +escape +escarnador +escf1f2 +eschaton1 +eschi +escoba +escolapios +escordaa +escorpio +escorpion +escorpion361 +escorpiona +escorts +escrime +escusi +esdo +esenkent +esenler +eser1234 +eserebru +eses1965 +eset1234 +eset99 +eseteeme +esfarelo +esfera +esfxp +esh20 +eshmit +esilo248 +esirnus55 +esist +esistprivat +esko +esko +eskogido +eslam1212 +eslami +eslpg00 +eslwar +esma +esma +esme +esmegert +esmia04 +esmirna +esmond +esmtevzi +esor12 +esp2325 +esp666 +espace +espacios +espada +espada1 +espada14 +espanhol +espanita +espartaco2011 +espemalu +espen +espeo +esper +esperanc +esperanto +esperanza +espero +espesp +espion1234 +espiona34 +espionux +espkh2 +espn2k5 +espoir11 +espresso +espresso1 +espresso2 +esprit +esqdw9 +esqueci +esraesra +esrakes +esrax +esrevsna99 +esrt2020 +ess1423 +essai +essait +essake +essakraps +essam +esseesse +essejh +essen86 +essence +essex +essie +esso +essorcal22 +essy +est +est007 +est1869 +estabu +estampida +estanoes +estauns1 +esteban +estee +esteix +estelita +estelle +estelle +ester +ester +estera +esterbea +esterita +estesete +estevez +esther +esther +estolad1 +estrella +estrellita +estroncio1001 +estrongo +estruch +estrude +estupendo +esty90 +esuohtnep +esvtm +eswc300 +esxar4un +esy +esyaga +esyc1106 +esystem1 +esztcewd +eszter +eszter91 +et115014 +et1217 +et13hsqc +et19720 +et1j6 +et444887 +et4nis +et52mu +et555555 +etadpu1123 +etag +etak100 +etak911 +etamax01 +etamere +etatunis +etd6gqj3 +etdscd99 +etdxb +eteach +etekin +etel +eteocle +eterna1 +eternity +ethan +ethan0787 +ethan2304 +ethanol09 +ethel +ethel grey +ethelia3 +ethelo32 +ethernet +ethi4boo +ethik +ethiopia +ethne +ethno23 +ethos2007 +ethug211 +etienne +etilaist +etilsa1 +etiqueta +etirps72 +etishi +etisv2kq +etjetjetj +etmatrix +etmcdm +etmlogos +etnies +etnups +etokruto +etorg17 +etotako +etower75 +etozyx +etpadm +etqaq +etrere +etron995 +etrsop +etrusca +etrust01 +ets2i +etsuko +etta +ettan2215 +etteyla +ettlingen01 +ettore +ettubal +etty +etuilu +ety2997s +etzn9 +eu080595 +eu13ro04 +eu33str +euag1 +eucheuch +eudes51 +eudhfo +eue8u +eueuni +euflfqrf +eug2404 +eug3112 +eugen +eugen6318 +eugene +eugene1 +eugeni +eugenia +eugenie +eugeniusz +eugenkl +eugohan +euhkpc +eui47654 +eujenzo +eukl33jb +eukmg +eula +eulalia +eulalie +eulogio1 +eum1983 +eumeamo +eumel99 +eumenco +euml +euneuneu +eunice +eunjoo34 +eunjoo99 +eup3m +euphoric +eur6k +euracom +eurad135 +eurasian +euribe +euro123 +euro1722 +euro2000 +euro2004 +euro8469 +eurocb +eurodent +eurodist +euroeuro +eurofl +eurogimpy +eurokus +euroliga +europa +europa1 +europa12 +europa66 +europe01 +eurosports +eurus +eurzer +eus483ei +eusant +eusebia +eusebia +eusebio +eusebiu +euskari4 +eusmezcw +eusou14 +eustace +euteamo +euterfee +euthvy52 +eutin156 +eutoyc52 +euuezh +euuuf92x +euxeux +euyeroro +euz789 +euzinha +ev081182 +ev310769 +ev5n7 +ev7813 +eva +eva +eva leonard +eva maria +eva marie +eva-ingeborg +eva-maria +evaari99 +evabritt +evadne +evaeh +evaeva6 +evajulia +evakant +evaldas +evalyn +evamm +evan +evan2002 +evan8206 +evan888 +evandria +evanescence +evanevan +evangelina +evangelion +evangelion1 +evann08 +evanovich06 +evans +evans123 +evans21 +evart +evasion +evaueli1 +evavdh +evbiks3 +eve +eve +eve lee +eve182 +eve4ever +eve64046 +eveadmin +evefan +evekiwi +evelina +evelina +eveline +evelinez1 +evellyn +evelyn +evelyn +evelyn del +evelyn pope +evelyn8654 +evelyna +evelyne +evelyxe +eveneril +evensen92 +evenstar04 +evepass +everde79 +everest +everett +evergreen984 +everlast +everlee +everley +everrest +everton +everton +evertonf1 +everwhat +every12 +everyday1 +everyone666 +evfspl +evg123 +evg9c +evgeni +evgenij +evgeniy1990 +evgeny +evhgueni +evi +evi1975 +evicka +evievi +evil2121 +evil44me +evildave +evildead +evilelk1 +evilgenius +evilke +evilmeow +evilsakura +evimaier +evin +evita +evita1324 +evita1998 +evitaaa +eviveviv +evliadam +evmgmbh +evo +evo4924 +evo6rs +evo8575 +evobus +evoell +evoeva7 +evoli5 +evolution +evolution7 +evolva +evon160 +evon3866 +evor1234 +evosonic +evrim123 +evrolog +evsamsung +evxrbibj +evzzh +ew9hqp4h +ewa +ewa1234 +ewa13 +ewa6784 +ewaewa +ewaina1 +ewakurcz +ewald +ewald +ewald29 +ewan +ewan4372 +ewans +ewans68 +ewazizil +ewb123 +ewb1811 +ewdja +ewelina +ewelina1210 +ewellapb +ewen +eweuxup +ewing +ewmaster +ewnlqru +ewol111 +ewsd00 +ewstro +ewtq9 +ewunia +ewunia21 +ewuuwe +ewyrl +ex.ch +ex0991 +ex0TT0 +ex1l33 +ex3gzgnq +ex791 +exalon55 +example +exarkun +excaliber +excalibur +excedrin +excedrin33 +excellent +excelsior +excha1 +exchung +exciter64 +exe2000 +exe2018 +exe2019 +exebs +execute725 +executive +executive21 +exeexe +exelare +exelexel +exemple +exene +exequq +exeter +exforge +exforum +exhale4me +exia9sgn +exif +exige88 +exile3 +exile33 +exilim +exist +existenz +exit6 +exitmenu +exkilla1 +exl4ever +exl9h +exlax78 +exlibri04 +exlove06 +exo +exo1944 +exodia +exodus +exodus1 +exonbu24 +exooo +exorder +exordere +exorzist81 +exosci +exousia1 +expass +experimental +expert +expert10 +expert12 +exploit +explore +explorer +explosivo +expoexpo +exporta1 +expres +expresvu +exroorxe +exse12 +extensive +extinction1973 +extra675 +extracting +extradry +extrasmall +extreem99 +extrem55 +extreme +extreme. +extreme66 +extro1234 +extruder +exupqfgq +exuus123 +exwook +exxon00 +exyyle +exyztftp +ey1992 +ey470213 +eyakut +eyal +eyal2000 +eyalka +eyass +eyco5 +eydreist +eyedoctor +eyejung +eyemindz +eyesburn +eyesonme +eyf92se +eyfa7x +eyg2j +eyh072 +eyhr845 +eyj1o +eymenk +eyninio0 +eytmosbq +eyxuw +ez31nb +ez5zwrpi +ezAsHtE615 +ezbish69 +ezdesign +ezdk38 +ezekiel79 +ezfs0 +ezida9 +ezio +ezio +ezn08wqs +ezpk +ezra +ezra1219 +ezra23 +ezra6172 +ezracobb +ezridax +ezserhat +ezt710bh +ezthx +ezxs61 +ezy1g +ezysxxx +f +f005b5 +f00bar +f00bart +f00dmart +f00pass +f00tball +f00wh0r3 +f01162180 +f01stein +f07221995 +f07cfcf8 +f07m18 +f080690p +f081283 +f081560 +f0857657 +f0881d3c +f08d02e +f0Westie +f0a114bc +f0ad51ee +f0afe919 +f0bluebird +f0d48d +f0gh4t +f0h0hf0h +f0h77c6v +f0holden +f0kbt +f0moomoo +f0ndle +f0noa +f0nq3p +f0obl3s +f0r3v3r +f0rg0t1t +f0rgn01 +f0robbien +f0rrest +f0rum +f0rumov3 +f0rums +f0rw4rd +f0s09 +f0snook1 +f0sscssc +f0trebor +f0wl0 +f0xtr0t +f0y3R +f0yq67b412 +f104g +f1111111 +f11235853 +f112358f +f123456 +f123nlay +f12464w +f1280701 +f12kio7 +f1420a1b +f147lux +f15010324 +f157232e +f164250l +f18w1ck +f1a51980 +f1b024e +f1baongoc +f1c2k3o4 +f1c9ff +f1ckdich +f1dd13 +f1duc14 +f1dutchess +f1gh3tt4 +f1gqx +f1jc22 +f1jungle +f1l3n3 +f1liberty +f1lorian +f1loveis +f1lter +f1m2h3 +f1mikes +f1n4l +f1news +f1ngers5 +f1nnegan +f1olliffe +f1olorin +f1prints +f1ptkrvl +f1r3f0x +f1r3s7ar73r +f1reak +f1reh0use +f1rei323 +f1rs3d2 +f1satana +f1sh1ng1 +f1shb0n3 +f1sidekick +f1terrence +f1tfu3l +f1tgal +f1tiramisu +f1tna +f1tr1an1 +f1tzg3rald +f1xhyeep +f1yr0xnb +f2000 +f212drav +f2210680 +f231089 +f239fb +f23a45 +f240evm +f240zn6z +f246a8 +f257px0 +f25f16 +f25f9948 +f27628650 +f27f62 +f2884584 +f28daf +f2Spruzzi +f2a9ac5 +f2abc123 +f2awg +f2c12f +f2chalky +f2ckasil +f2d8023 +f2dinsdale +f2e1b3r7 +f2global +f2mankiw +f2music +f2namaste +f2o2x2 +f2pal +f2ppl6qn +f2profi +f2qpgzl4 +f2r2sb +f2richards +f2rotate +f2snow +f2stinky +f314b0 +f316adb7 +f3251311 +f32a83fb +f32vctm2 +f341aj2g +f34ed159 +f34rus +f365108 +f37265W +f379afc +f37ix1 +f39i1zc +f3Bodensee +f3bossman +f3brains +f3canada +f3ck0ff +f3cobalt +f3gl5d +f3hadeed +f3i3rn +f3jethro +f3kvvm3f +f3latex9 +f3m41p8 +f3m7xg +f3ncing1 +f3stefan +f3wpdh2m +f4072705 +f412 +f424833a +f4356e +f4444 +f482LK +f490ko +f4PASSWORD +f4a61nm8 +f4admin +f4b14n +f4b29a +f4bellaa +f4bug +f4c277 +f4c7j8 +f4declan +f4dorothy +f4gg0t +f4ginkgo +f4harmony +f4hj9ku2 +f4iryfl055 +f4m5tjr +f4nature +f4q9xct +f4qci +f4rb8ga +f4rq1t +f4tucker +f4utrA +f4v4li +f4xm0d3m +f5004a85 +f51e6c4 +f5201314 +f53868 +f55536k +f560bcb +f563t +f56d50 +f57456b +f5763b +f57p343g +f581fb +f59e19c +f5aco3kc +f5allmine +f5d6e7ds +f5edster +f5falcon +f5hithere +f5j9lir6 +f5maddie +f5moneys +f5u4c6k1 +f60086 +f6032d2 +f6227978 +f633678 +f64759 +f64h8 +f64life +f65412ac +f655241 +f660h +f68hya +f68smndk +f69904080 +f69k149 +f6Seahawk +f6a46fb +f6adcd +f6beegees +f6boomer +f6e9de +f6f7b2ae +f6f87bs +f6faa365 +f6fc74 +f6gremlin +f6hickory +f6jacira +f6kolton +f6natas +f6r7nkhy +f6rookie +f6sanjay +f6slime +f6swathi +f6xfo +f6ymerej +f720305h +f7468505 +f74799639 +f767qcc +f7749a1d +f776d234 +f78f8bc +f79640 +f79648d +f799e490 +f7amelia +f7cff1 +f7d67385 +f7dashed +f7dominica +f7ed8ceb +f7edwards +f7egyd +f7ew2y4 +f7g6f7g8 +f7garden +f7georgia +f7k9b112 +f7king +f7m4au +f7omj +f7oneworld +f7peanuts +f7q53oz +f7qwertzui +f7rz0j2r +f7snoopy +f7t1l8 +f7ulrich +f7wp5jby +f80695 +f8081987 +f8101362 +f810814t +f816573 +f8180599 +f8250481 +f83022993 +f83a5a7 +f83jd9 +f83lgr4n +f8422efc +f843c7 +f845721 +f85hi0n +f86sabre +f8b662df +f8b8c8 +f8bobbob +f8brgv +f8chier +f8dingle +f8f4f1 +f8ferris +f8hy8zwx +f8j2s9 +f8keith +f8massimo +f8ms6 +f8qqqqqq +f8smithers +f8thomas +f8tshk +f8wood +f8zfhapb +f90746d1 +f90e1195 +f917d7b0 +f94fmv45 +f951a6fe +f9658678 +f9739d +f982538 +f984fjen +f99478 +f9Checker +f9Toby +f9a03f57 +f9ashlyn +f9batoul +f9buddy +f9c2978 +f9c602kw +f9cancer +f9chayce +f9christus +f9e0l0ch +f9ffx +f9hch +f9janosch +f9lando +f9mousty +f9omsairam +f9qyj6 +f9s3m8 +f9secord +f9taidog +f9thomas +f9w0bg +f9ygg +fG5tz +fL4m3S +fLxKYb +fOUr +fOq714 +fOrsAkEn +fRaNzI +fUckoff23 +fa021075 +fa147896 +fa1966 +fa1zw3y8 +fa22bfcf +fa24fs69 +fa256778 +fa278e +fa3af22d +fa3fss +fa4486 +fa554377 +fa7cyj8q +fa870322 +fa881fd +fa8dfa +fa921761 +fa94lp15 +faOLIVIER +faa4a9 +faadmin +faagod1 +faam +fab5fave +fab882f9 +fabbricante +fabi0408 +fabi22 +fabi3489 +fabia +fabian +fabian +fabian17 +fabian32 +fabian96 +fabian99 +fabiana +fabiankette +fabiao +fabien +fabienne +fabienne +fabijan +fabilein +fabinser +fabio +fabio +fabio223 +fabioac +fable665 +fabregas14 +fabrice +fabrice +fabricio +fabrizio +fabrys +fabsys +fabulous +facafaca +faceman +faces +facetiously45 +facex1 +facho +facility3 +fackers2 +facruzx +facteur +faction1970 +factions +facu1816 +facundo2005 +fad39sel +fada +fadaji39 +faddddd +fadeblac +fadelnew +fadey123 +fadf1179 +fadh82 +fadiesis +fadigp7 +fadmin +fads +faduckman +fady2004 +faec5d6 +faeirouz +fafaf +fafafa +fafane +fafaou +fafe2f +fafnir91 +fag +fag2010 +fagan860 +fagaras89 +fagasf1 +fage11 +fagend0 +faget1 +fagget +faggot +faggot91 +fagi2180 +fagotto +fagrassy +fah3282 +fahad +fahad101 +fahad11 +fahad435 +fahadm +fahadq8 +faheineken +fahneabe +fahr177 +fahrenheit +fahri52 +fahrrad +fahrtest +faidhe +faidros +fail +faildetta +faile951 +failed354 +failtree +fainline +faire +fairlawn +fairout +fairuza +fairwater +fairyfeet +faisal +faisalme +faisan2003 +fait21in +fait77 +faith +faith +faith123 +faith7143 +faithag +faithfull1 +faithis2 +faizam +faize +faize999 +faj1k +fajny1982 +fajo33 +fakajsie +fakangte +fake +fake07 +fake4me6 +fakebank +fakefuni +fakepost +fakeris +fakeshit +fakezone +fakhri +fakinfakin +fakorea +fal0826 +fal4u +fal96547 +fala4fel +falc0n +falcao07 +falco +falcoln +falcon0019 +falcon01 +falcon029 +falcon1 +falcon3190 +falcon325 +falcon327 +falcon64 +falcon79 +falcon99 +falconetti12 +falcsu +falemai +falfal +falillo +falinho +falk +falk06 +falke06 +falke1805 +falkhor +falkom10 +falkon650 +fall +falleen +fallel +fallen2544 +fallen273 +fallen2k3 +fallen365 +fallen7629 +fallguy654 +fallout2 +fallstar +falltopieces +fallujah +faloyak +falr01 +falsan16 +falsch +false +falso +famafama +famamaman +fameggi +famians +familia1 +familjena +family +famimika +famos2 +fan0806 +fan231 +fana914 +fanatic +fanatik +fanatikas +fancsita +fanculo +fancyspa +fandango +fandarly +fanderay +fandong +fanfan6868 +fang +fang0628 +fangs!! +fankurve +fannie +fanny +fanny +fanny belle +fanny007 +fanny1 +fanny59 +fanta +fanta1 +fanta212 +fanta71 +fanta888 +fantadig +fantasmaso +fantastic +fantasties +fantastika +fantasy +fantino05 +fantom +fantom80 +fantomi1 +fantsay027 +fanuc25 +fanumao +fany18 +fanyface +fanzai90 +faoposting +fapat07 +fapitbull +faq +faq2ass +faqmens +faqwow +fara3day +fara4ce +farafina +faramarz +farandal +faraons +farash +faraway +faraz +farbe33 +farcry +farcry90 +fardeim +fardin +fares91 +farfar +farhana +farid +farid +farinas +fario30 +fariza09 +farkel +farkika +farkman +farley +farlocco +farlou29 +farm321 +farmboy666 +farmer +farmer88 +farmmom +farmweb +farndt +farne1 +farnham +farnk +faro3290 +farofa2008 +faroffa +faron +farook +farout +farrah +farre123 +farrel +farrell +farrell1060 +farrette +fars +fars1966 +farseer1995 +farshad +farsq2 +fart +fart123 +fart159 +fart45 +fartburp +fartcaster +farted +fartelli +fartello +fartface22 +farthead +fartman +fartz126 +faruk +farukk +farukk2 +farva31 +farwell9 +farzad +fasce +fasching +fasd1234 +fasd2301 +fasec +fashion +fashocker +fashon1 +fashow +fasitec +fasola990 +fassacz +fassari +fasseng +fast1987 +fast83 +fastagio +fastand +fastarest5 +fastback +fastback65 +fastball +fastcrew +fastdow +fasteddie +faster +fastereggs +fasterholt +fastgold +fastily +fastline +fastpigs +fasty666 +fasulye +fasupun +fat32 +fatal +fatal505 +fatality +fatality93 +fatals +fatape +fatboy +fatboy1991 +fatboy69 +fatcat +fatcat01 +fatcat042 +fatcat23 +fatcat8896 +fatcoach +fatdam +fate12 +fateless +faten +faten521 +fatface3 +fatfota +fatfuck +fatgirl +fatguy85 +father +father +father spike +fathihku +fatiH +fatih +fatihh +fatihh68 +fatihim +fatim1 +fatima +fatima +fatima#1 +fatima20 +fatkid12 +fatma1968 +fatmam +fatmer57 +fatnerds +fatool000 +fatosss +fatou +fatouma2 +fatpanda +fatrider +fatsoas +fattony +fattouma +fatty +fau5t1an +faucher1 +fauchi +faulina +faultier +fauntitle +faurndau +fauseg +fausto +fausts01 +faustyna +fautas +fauxmoi +fauzia +favaritz +favilla2323 +favuab +fawcetta +faweather +fax1 +fax11 +faxemail +faxtel12 +fay +faye +faye0708 +fayek +fayrelum +fayruz +faz1il23 +faz247 +fazite +fb007 +fb011083 +fb1212 +fb1410 +fb1907 +fb321 +fb3efd46 +fb5q7y +fb67209 +fb7521 +fb757575 +fb8a5c7c +fb8km3ds +fbNASCAR +fbahadir +fbalaska +fbaldassari +fbannalisa +fbayle +fbb233 +fbbaddmi +fbbarry +fbbossley +fbc1796 +fbcity69 +fbcomstock +fbdeedee +fbdillon +fbdiscus +fbdragon +fbebmb +fbelisha +fbespana +fbfmlj +fbgt113 +fbhmnqdb +fbi1492 +fbifbi +fbj4r +fbjapanese +fbletmein +fblynann +fbmillie +fbmjj +fbmonkman +fboel84 +fboost +fborions +fbpantera +fbpass +fbr366 +fbs01 +fbsearcher +fbsweeter +fbtmg +fbtwiggy +fbtyf +fbvasant +fbvsr6ka +fbwinter +fbxl1855 +fbzsolnay +fc07dd +fc0d47 +fc126b +fc171717 +fc29 +fc54321k +fc9a2m +fcCharlie +fcall888 +fcalvet +fcarlone +fcb +fcb100 +fcb178e9 +fcbarca +fcbayern +fcbca8af +fcbernau +fcbfcb +fcbj1379 +fcbj2008 +fcbno1 +fcburnti +fccaitlin +fccc3874 +fccopper +fcd465 +fcdabi +fcdilworth +fce123 +fceu37 +fcfbs01 +fcfcfc +fcfh6424 +fcfuture +fcg8030 +fcgb33 +fcgweb +fch +fch73rag +fchansa +fcis5823 +fcjhfcjh +fcjuve +fckfck +fckgw +fckgwe +fckgwrhq +fckl531k +fckwkwst +fcnantes +fcnewman +fcnthbrc +fco1985 +fcop7291 +fcopass +fcosmin +fcpolyview +fcprincess +fcprulaz +fcr123 +fcrb0792 +fcstimpy +fct2005 +fctomtom +fcufcb +fcupload +fcv123 +fcxserd +fcxsr +fcyfcy +fczau +fczfcz +fczwolle +fd102582 +fd1498fd +fd1vbief +fd208 +fd3887 +fd3ikks +fd652108 +fd6d68pc +fd6dade +fd8ocqav +fdKUPIEC +fda30726 +fda4a1hs +fda7196 +fdagre +fdalqy +fdb4b4 +fdb4b751 +fdb877d5 +fdbeachboy +fdc3x +fdcfdc +fdcomand +fdcordless +fdcrockett +fdd +fde9oy47 +fdf74trh +fdfd025 +fdgfg34 +fdhere +fdjesus +fdjk56 +fdm4lif3 +fdmeodg +fdmorepork +fdn25ukj +fdnjh +fdryler +fds2537 +fdsa +fdsa0987 +fdsa4321 +fdsafdsa +fdsarewq +fdsawww +fdsfj84 +fdsfsdf +fdshinobi +fdstro +fdtdahak +fdtfdt +fdtrebor +fdty738 +fdvc84e +fdw31hcx +fe1385 +fe192b +fe2254 +fe4546 +fe4r13l +fe57140 +fe6cce +fe7zci +fe894b +fe9cl +fe9z683n +fea0dc76 +fealdad +fealy1975 +feanor +feanor520 +fear +fearazo +feared00 +fearf001 +fearless +fearme01 +fearsome1! +feates +feathers +feb2701 +feb2783 +feb8191a +febef159 +febocobo +februar +februar76 +febstar +fec239 +fecamp06 +fecht1 +feck1027 +feco +fecttsz +fed400 +fed8d2f +fedaac +fedda +fede +fede0550 +fede10 +federal23 +federer7 +federica +federica +federico +federico +federkiel +fedor +fedora +fedouati +feeder +feeilove +feeisl +feeks +feelings +feelings84 +feeny1 +feever +fef2575 +fefb35bd +fefe1203 +fegro90 +feh +feh8d +feharrison +fehler +feiern +feilo +feimeow +feinbein +feinripp +feinstein +fejb5amq +feke123 +fekete22 +fekristen +feky +fel00xaj +felcher +felden +felder1 +feldispat +felfes3 +feli#dae +feli2105 +felice +felice91 +felichan +felicia +felicia +felicite +felicity +felicjae1 +felidae +feliks +felinejunkie +felipe +felipe +felipe00 +felipe13 +felipe89 +felipeuc +felippa +felippe +felisa +felisha1 +felix +felix +felix1 +felix101 +felix1361 +felix6 +felixneel +felixok +felixou +fellous +fellow15 +felluri +fellw4r +felo +felo3356 +felpsa +feltchy +feltetgt +felton +fely +femff10 +femijet +fence012 +fender +fender1 +fender72 +fendi1231 +fendtgt +fenech +fenella +fenemo +fenena +fener02x +fenerbahce +feng +feng1 +feng2 +feng28 +fengken +fengspoons +fenice89 +feniks +fenix214 +fenix777 +fenixdorado +fenja987 +fenomen1234 +fenomeno +fenris +fenster +fenzo +feo123 +feodor +feofeo +feotillo +fepainter +fepaulanna +fepdb +fepqmywk +feqtvs +fer135 +fer1509 +fer77 +fera1362 +feraget +feralinstinct +feralsean +ferarri +ferasvib +ferca +ferca2x +ferdam +ferdamn +ferde +ferdinand +ferdinando +ferdy +fere0400 +ferenc +ferencz +ferengie +ferets +ferfer +fergal +ferhat +ferhat78 +ferhatim +ferias69 +ferici11 +feridferid +ferien17 +ferike +ferit +ferkan +ferkel246 +ferkel2k +ferlin +ferm +fermin +fern +fernan +fernand +fernanda +fernandez +fernando +fernando +fernando ramos +fernando2 +fernando62 +fernbedienung +fernweh23 +fernwood +ferobaba +feroz +ferr9920 +ferrall500 +ferrao17 +ferrari +ferrari1 +ferrell +ferret +ferret1915 +ferret41 +ferrets +ferris +ferrogay +fertig +fertosfertos +ferts4me +feryat +fes87 +fesatwi8 +feshan +fess +fessan +festival +festiwal +fet0s +fet131 +fet66 +fetalab1 +fetcher +fetcher1 +fetenhit +fetsie +fett12 +fettaa +fettel15 +fettes007 +fetti +fettlaus +fetty +fetyacen +fetze +fetzer78 +feuer +feuer14 +feuer3 +feuer9 +feuerst1 +feuerwehr +fever12 +fever512 +feversea +fevre71 +fevzi +fevzix +fewestside +fewlass +fewonder +fextex35 +feyenoord +feyerabend +feyokohama +fezagu6 +fezie +fezo12 +fezzik11 +ff +ff0590ff +ff0ee36 +ff123 +ff1rgero +ff2 +ff2008 +ff220407 +ff268c7d +ff3f7f5 +ff46 +ff5g2s2q +ff62618 +ff7be6a2 +ff9d61 +ffaab +ffb48c7d +ffbla1 +ffdgrtws +ffef661 +fff +fff1967 +fff211 +fff9710 +fffatass +fffeee1 +fffefffe +ffff +fffff +ffffff +ffffg +ffffggg +ffh292a +ffh462 +ffinvoke +ffjiqqv +ffma5634 +ffnomlas +ffoldur +ffooffoo +ffp557 +ffrbbr +ffreitas +ffrounch +ffrulez +fftybs +ffu21 +ffu3mf6e +ffz8a4pu +fg1181 +fg7cvsj6 +fg7p3cq +fgadkljr +fgb2uoyj +fgba54m +fgbc2mth +fgfghh +fgh46d +fghdfhg +fghfgh078 +fghj046 +fghj0756 +fghtyu +fgk6p +fgpfm18 +fgribben +fgs0501 +fgth1968 +fgthrjn +fgw45y +fgz10ea +fh0108 +fh4046 +fh7wgfop +fha02a33 +fhc85bd +fhd323xp +fhdgfng +fhemesnp +fhfbm1 +fhfhtdk +fhgju99r +fhingo +fhntv +fhofho +fhorse28 +fhwl5934 +fhxl61md +fhxvt +fhzfhzfhz +fi1cha9p +fi1dy +fi8ga +fia2004 +fiallos +fianni +fiat124 +fiat500 +fiatparma +fiber07 +fiboline +fic7199 +ficcion +fiche12 +fick +fick0712 +fickaz +fickdich +ficken +ficken04 +ficken12 +ficken18 +ficken2 +ficken23 +ficken3d +ficken57 +fickenficken +ficker +fickerz +ficklampa199 +fickschick +fiction +ficus117 +fidcefak +fiddle34 +fidel +fidel +fidelia2006 +fidelis che +fidelita +fidelmar +fidelova +fidfid +fidium +fido +fido4152 +fidp7 +fidstwo +fiduciasit +fiebersaft +fiedel +fieldgoal2 +fieldhockey +fields09 +fiends12 +fienessa +fieras +fierce +fiesling +fiesta +fiete42 +fietsbel +fifa +fifa06 +fifa07 +fifa2000 +fifa2003 +fifa2005 +fifa2006 +fifi +fifi +fififi1 +fifille +fifka1 +fifke007 +fifolifo +fifty +fifty8four +fig +figar0 +figaro +figaro1 +fight +fighter +fighter1 +fighter81 +fighthel +fighting62 +figiell +figlia +figo10 +figo7ita +figo82 +figua001 +figura66 +fihorn +fiiit +fij7p9k5 +fijio +fijwgug1 +fik1999 +fika2304 +fike +fiklvezo +fil +fil652 +filadel +filantrop +filaoel +filbert +file025 +file21 +filebase1 +filebox +filemon +files +fili +filiale280867 +filiani6 +filijana +fililuna +filimon1982 +filip +filip +filip11 +filip123 +filipbrand +filipedt +filipok +filippa +filippo +filippos111 +filippos1995 +filire +filiz +filiz86 +filizus5 +fillan03 +filleken +fillys4 +film +film123 +filma +filmcorp +filmfilm +filobeto +filofax1 +filoss +filou +filou262 +filter +filter160 +filters +filth666 +filthy84 +filu +filutek4 +fiman1 +fin12345 +fin859 +final +final123 +final17 +final2n4 +finalf +finalfantasy +finalfantasy7 +finalis +finalmetal +finalx +finch +finchen +fincher +finden +finderx +findosko +findus +fine809 +finekick +finella6 +finfant7 +finfin +finger +fingers +fingolfin +fini06 +finik1 +fininho0 +finis +finish +finju +fink1 +finke +finkel84 +finlandia +finlay +finley +finley +finn +finn +finnegan +finnland +finnluca +finnmarc +finnvivi +fino1000 +finola +finsen +finska +fintina +fiocco +fiona +fiona2222 +fionnuala +fionnula +fiore872 +fiorella +fiorentina +fiorenzo +fiorito18 +fiq91hiz +fir3f0x +fir40bh +firas +fire +fire07 +fire0fly +fire1212 +fire1336 +fire2k +fire3545 +fire44 +fireandice +fireater +fireball +fireball1 +fireball5267 +firebat1 +firebird +fireblast500 +fireboard +firebolt +firebolt1 +firebug524 +firedragon +fireeatr +fireeyes +firefly20 +firefly2727 +fireforge187 +firefox +firefox30 +firefox666 +firefoxx +firehawk21 +firehouse5 +firekuku +fireman +fireman206 +firemen69 +firenze +firepatch +firepogi +firepoi5 +firepower007 +firerose +fires +firestorm +firesung +fireteam +firewall +firex +firey1 +firma1 +firma12 +firma123 +firmacif +firo3176 +firsich +first +first post +first0ne +firstcu +firstoct +firstteam +firuz +fis667 +fisc2005 +fisch +fisch2010 +fisch2210 +fisch2802 +fisch3 +fisch777 +fische +fische00 +fischen123 +fischer +fischi +fischler +fischtown +fischweck +fish0823 +fish4212 +fish81 +fish84 +fishaqua +fishbone +fishbot +fisher +fisher1 +fisher1515 +fisher755 +fisherman +fisherman#1 +fishfingers +fishhead99 +fishinG1 +fishing +fishlip +fishlips +fishlord +fishman +fisho05 +fishppl6 +fishstick +fishtank +fishy +fishy99 +fishyfish +fishyman +fisio00 +fisk +fisk1337 +fisk628 +fiskar123 +fisken +fisken91 +fisker01 +fisker1549 +fisker1987 +fiskesuppe +fisoa00 +fisonet +fist +fister9050 +fisterwe +fistful +fistik +fisto +fistro +fita +fite22 +fitful +fito0517 +fitq5xjd +fitshaza +fittja +fityma +fitz2002 +fiv1z +fivetour +fiwa8885 +fiwahij +fixer666 +fixit835 +fixme6676 +fixtitten +fixxfan +fixxme +fizan077 +fizban111 +fizban23 +fizban29 +fizf8crp +fizzler! +fj1100 +fj12345 +fj322 +fjJ$Fkvm +fjblabla +fjc94 +fjcantais +fjd71 +fjdk4738 +fjellet123 +fjenalta +fjew11 +fjg709ym +fjghjf +fjgonzal +fjibwwrr +fjiord41 +fjk356 +fjk7200 +fjk9830 +fjlfi +fjolnir1 +fjouth8 +fjp16721 +fjp25vt +fjr1300a +fjsm1808 +fjsmbtnj +fjtmno +fjtx5 +fjugend +fjwrz +fjwvi +fjyn7gqm +fk01 +fk1sjkpt +fk3z7ubw +fk4411 +fkakmene +fkea2 +fkebc4z +fkfllby +fkilmd +fkivmhla +fkixql32 +fkk5w +fkkwbwcv +fkl0637 +fkmaf123 +fkmir99t +fkn163 +fknadia +fkoxatxy +fkp3723 +fks49 +fkt6 +fktrcbq9 +fktyeirf +fkzcrf02 +fl0g5 +fl0ppy +fl0renz +fl0ssy +fl1705 +fl1ppy +fl2oy4d +fl2sh +fl3447 +fl3g3lix +fl3x +fl4m3ng0 +fl4sh +fl4tr0n +fl4ut4 +fla2ash +fla84154 +flacan +flach1313 +flad12 +flaffi +flahdah +flakeman +flallmz +flamaras +flamdrag +flameme1 +flamengo12345 +flames87 +flamese6 +flaming2 +flamingcat +flamingo55 +flamingx +flamo +flamy41 +flanke23 +flanker +flanker2 +flareon2 +flarfiny +flarg7 +flasche +flash +flash1962 +flash22 +flash66 +flash704 +flashback +flashboy +flashbulb +flasher +flashpoint +flashsxx +flashx +flaskan1 +flathead74 +flati60 +flatmal +flatpro +flatron +flatron1 +flatron5 +flatt123 +flavia +flavia11 +flavio +flavours +flaxa01 +flbkjdbx +fldpkx4n +fleapie +fleckie +fledermaus +fleef5 +fleet +fleet27 +fleeth3 +fleez68 +fleja +flema69 +fleming90 +flemmig +flemming +flemse +flensburg +fletch +fletcher +fleur +fleuren +flevonet +flex321 +flexamin +flexibility +flexible45 +flfsklf +flgiair +flglair +flguild +flharp +flib +flibbity +flibble +flickr +flider91 +flieder10 +flieder14 +fliege1 +fliege95 +fliegerterra +flierl12 +flighty1 +flimmer +flip +flip +flip0500 +flip414 +flip45 +flip96 +flipchar8 +fliper69 +flipflop100 +flipper +flippit +flippy +flipside04 +flisan84 +flixli +flju1103 +fln1dwn1 +fln668 +flo +flo112fs +flo1501 +flo1515 +flo3001 +flo333 +flo44 +flo66er +flocke19 +flocky1 +floddan1234 +flode13 +flodu51 +floflo +floflo12 +floflo1979 +floflo77 +floflo9588 +flofor +flogblog +floghax +flogi69 +floh22 +flokki +flolie +flolulu +floman +flomax +flooder +floodmusic +floor7314 +floorbally +flop +flopaz +flopiana +floppi79 +floppy3881 +flopyc +flor +flor1309 +flor4 +flor770 +florA +flora +flora009 +florai +floralenz +floran08 +florasuarez +florbal +florek +florena +florence +florence +florencio +florendo +florent +florentius11 +florenz +flores +flori +flori01 +flori123 +flori7 +florian +florian35 +florian3527 +florian66 +florian82 +floriano +florida +florida +florient +floriishot +florin +florin +florina86 +florinda +florine +florivana +floriver +florizin +floste81 +flotation +flotiti +flotraes +flounder77 +flourens +flow123 +flow9043 +flowdeviance +flower +flower +flower1 +flower12 +flowerpower +flowers +floyd +floyd1 +floydfan +floyy +flp4ever +flrn19 +flsh5418 +flslcu +flslwl12 +flubba26 +flubber +flubby +flubster +fluch +fluff +fluffy02 +fluffy18 +fluffy8975 +flug8338 +flugticket +fluidpixels +flumi05 +flumps73 +flunk1e +flutes26 +flutsch +flux1994 +flvby +flvby14 +flw811c +fly1ng +fly1np1g +fly2free +fly618 +flyaway20 +flyazn +flybest +flybys11 +flyers +flyers86 +flyfishing09 +flying01 +flying42 +flying44 +flyingfox +flyleaf08 +flylong +flyn3t +flynut! +flyordie +flysoclose +flzxsqc +fm2006mf +fm2875 +fm4opis +fmafma +fmasmrmm +fmb1984 +fmbdc +fmbl20oo +fmbpwt +fmc +fmca47rw +fmck +fmesra01 +fmetrt +fmf819 +fmfprdim +fmo1000 +fmql0U +fmuafhhh +fmusic2 +fmvs7 +fmwpnj75 +fmxovvtq +fmxpro +fmz8rll4 +fn4n86cm +fn56564 +fnacfnac +fnaskapa +fnclq4hj +fnd4h +fniviere +fnkysht +fnman12 +fnmi9 +fnn666xe +fnord1213 +fnord523 +fnpdanpr +fnpzhwkz +fnqmqvrr +fnqv6pvq +fnshost +fntevion +fntmpayn +fnvy0801 +fnx48n +fnz2190 +fo0 +fo051990 +fo163233 +fo1960 +fo42eu31 +fo50et01 +fo5rj +fo712xh +foA +fobar5 +fobb1 +fobia +fobiabbs +focaccia +focddn9 +focgezem +focken +focker +foconis +focrclan +focus +focus168 +fodbold +fodbold01 +foelf0 +foers +foetgp +fofao123 +fofcesow +fofinha3 +fofo +fofona55 +fog +fogata1984 +fogg66 +foglog +fogvx +fohcunje +foister +fojistas +fojz4 +foka1982 +fokada +fokion +fokker +fol07 +fola +fola2000 +folco +folder +foldox +foley +foley26 +folfer78 +folgers91 +folgore +folka +folken +folled19 +followme +folly123 +fominyh +fonc6 +fondi123 +fondi33 +fondi77 +fondi98 +foners1 +fonihx +fonrives +fons +fonseca +fontane +fontenoce +fontface +fony +fonyod +foo +foo0408x +foo1bar +foo666 +foob +foobar +foobar08 +foobar1 +food003 +food77 +foodawg +foodfood +fookies +fool +fooled +fools2009 +foona373 +foopah +foorden +foot1993 +footace +footas +football +football0723 +football1 +football833 +football974 +footbell +footbol +foothold917 +footie +footstep92 +footy24 +footybal +fopb5 +foppes +foppetje +fopuca +for +for04jod +for78get +foratisd +forbes +forbidden +forbidin1 +forca +force +forcedxp +ford +ford429 +ford92 +fordaiga +fordana +fordas +fordcity08 +fordgt90 +fordka +fordka11 +fordwich117 +fordxr8 +fordxy +foredoomed123 +forensic +forensick7 +forest +forest +forest1 +forest47 +forests +forever +forever556 +foreverbound +foreverinlove +forfeit7 +forgag15 +forget +forget11 +forgetme +forgiven711 +forgoing +forgoodg +forint +forist1 +forkot +formalin1 +format +formated +formathas +formatted3 +formula1 +fornof227 +foro +forqian +forrest +forrest +forrester +forsaken +forsakendeath +forssell1972 +forstalle86 +forsure +fortan +forte +forte77 +fortress +fortuna +fortunamajor +fortunas +fortunato +fortune +fortunio +fortunio bona +fortunion +fortuyn1 +fortwint +forty7 +fortyone +forum +forum00 +forum000 +forum153 +forum321 +forum4me +forum519 +forum648 +forumfr +forumgg +forumgs +forumka +forumman +forumpw +forums +forumvv +forumzz1 +forvard7 +forward +forza +fos83ruw +fosco +fossexile +fostaaa +foster +foster234 +foster609 +fosters666 +fosters88 +fot459 +fotbal +fotballh +fotboll112 +fotboll3 +fotend +foto +fotochan +fotoeho +fotofoto +fotogen23 +fotomi +fotos27 +fotosenf +fotosine +fotsopp +fottiti +fotucohu +fotzen85 +fotzkopp +fotzo +fouchu +foudi +foueq +founette +four +fourdigi +fourkxoc +fourlife +fourtunio bona +foutain +foutese +fovb1 +fowkes3 +fowler9307 +fox +fox007 +fox0174 +fox12321 +fox3 +fox369 +fox425 +fox666k +foxbcn +foxdie +foxfire6 +foxfire85 +foxi +foxi12345 +foxivu25 +foxman11 +foxriver1 +foxrulz3 +foxsro +foxtail +foxtrot +foxtrott666 +foxxy03 +foxy12 +foxyfoxy +foy willing +foyfatuw +foyuan +fp +fp4135 +fp8vun +fpaahs +fpdstcul +fpfink +fph5earj +fplala +fplc2000 +fpmouarf +fpride +fptqmspt +fpud054 +fpwf2p +fpxx1999 +fpypmrh +fqbt6 +fqcgtjz +fqckds78 +fqea6fbt +fqemw +fqgv4 +fqjwdx +fqk891 +fqkzt +fqovxxev +fqves +fr +fr0ek +fr0g1t +fr0ggY +fr0st13 +fr0x4bet +fr0z3n +fr0z3n +fr1221ag +fr1nkbot +fr1yr +fr3156ee +fr33d0m +fr33dom +fr33m4n +fr3ddy +fr3drick +fr3huw9a +fr3sh0ne +fr3zn +fr4GME +fr4ho +fr4nt1c +fr56deop +fr5fn974 +fr6907fr +fr82is46 +fr86cv +fra +fra123 +fra22re +fra74con +fraaanz +frack +fractal45 +fradame +fradav +fradi +fradista +fradn7 +fraflo +fragancia +fragger +fraggle09 +fraggles +fraggy1 +fragigi3 +fragigid +fragles7 +fragmama +fragmented +fragmich +fraise +fraj9 +fraja1 +fralla +fraluna +framagy +framer +frampyx +fran +fran +franc +franc +franca +france +france +france44 +frances +frances lee +francesca +francesca +francesco +francesco06 +francesco1972 +franchot +franci +franci21 +francia +francilla +francine +francis +francis +francis1 +francisc +francisca +francisco +francisco +francisco jose +franciscomp +franciscus +franciszek +franciz +franck +franck +franck23 +franck23 +franco +franco +francois +francois +francois009 +francoise +francuski +frandany +franek +franey1 +frank +frank +frank finch +frank pancho +frank1145 +frank123 +frank4201 +frank69 +frank999 +franka1 +frankdie +franken +frankhf +frankie +frankie +frankie wei +franklin +franklin +franklin1441 +franklyn +frankotte +frankreich +frankrik3 +franky +frankyg +frankymc +franlehn +frannie +franpass +franquin +franrufo +frans +fransson89 +franta +frantisek +franz +franz +franz jan +franz-adolph +franz1 +franz88 +franzela +franzi81 +franziska +franziska04 +franzjosef123 +franzschi +franzstraff +frap9635 +fraps123 +fraser +frasse0506 +frasse5032 +frati +fratman +frauce +fraunest +frax287b +fraxich2 +fray2335 +frb199 +frbjz7yl +frdndr +frdy1978 +fre3 +freacomment +freak +freak1 +freak2002 +freak421 +freak444 +freak666 +freakish +freakker +freakoo +freakout01 +freakpw +freakske +frech23 +frechbaer +frecisco +freclepc +fred +fred +fred harris +fred louis +fred mac +fred snowflake +fred0531 +fred10 +fred11 +fred1230 +fred1989 +fred44 +fred4500 +fred6035 +fred69 +fred7757 +freda +fredan300 +fredar01 +fredbowo +fredd +fredderf +freddi13 +freddie +freddie +freddie burke +freddie1 +freddy +freddy +freddy01 +freddy35 +freddyfat +freder0147 +frederic +frederic +frederic1 +frederick +frederik +frederik +frederik2 +frederique +fredgtrf +fredgu +fredhead +fredi +fredju +fredl +fredme2 +fredme22 +fredo147 +fredo65 +fredoo +fredprig +fredric +fredrich +fredrick +fredrik +fredrik. +fredriksen87 +fredys +free +free123 +free1979 +free1space +free200 +free77 +freeaxe +freebsd +freecell1 +freecool +freed210 +freed4207 +freedom +freedom0 +freedom1 +freedomguild +freedomlove +freedoom209 +freefall +freefall101 +freefffff +freefly +freefrau +freefree +freefreedom +freefun +freeguild +freehand +freehzss +freeinet +freek +freeking +freelancer2 +freeles1 +freeloader83 +freemail +freeman +freeman +freeman715 +freemanx +freemqn +freeporn +freerf +freeride +freeride2431 +frees3221 +freese +freestyle +freestyler +freetag +freethai +freeuser +freev4 +freewar +freewin +freewing +freewise +freewoma +freezer +freezerx +freezz +fregata +fregato +fregoli1966 +frehibis +frei1234 +freiburg +freiburg0820 +freida +freihans +freitag +freitags5 +freital05 +freitas +freixo +frejuran +freman1 +freminik +fremoa08 +fremov85 +fremy +french20 +frenchel3207 +frenchhorn +frenchie +frenky +frento02 +frenzi1 +frepick +freres9 +fresa +fresa24 +fresa57568651 +fresh +fresh101 +fresh4 +fresh87 +freshest +freshh20 +freshs +fressen741 +fressia +fressie +freszghi +freude03 +freunde +freyad +freyie +frf9n +frg104u +frginium +frgxbm +fribourg07 +fricco +frick +frida +frida25 +friday +friday13 +friday19 +fridex +fridi17 +fridi18 +fridolin +fridolin2505 +fridoo +fridtjof110 +frieda +friede123 +friedel +friedel3 +frieden +friedhard +friedhelm +friedhilde60 +friedje +friedl +friedo +friedrich +friedrichfranz +friedrick +friend +friend4u +friends +friendship +friese13 +frigard +frigga +friggin925 +frigor +frika3delle +frikadelle +frikandel +friko +fringe,mss +frinklo +friolin +frippel +fripple7 +frisby +frisch +friskey11 +friskole01 +frisky1987 +frisprit +frite512 +fritiof +fritlof +fritolay +frits +fritsch84 +fritte +fritten +fritz +fritz +fritz027 +fritz4711 +fritzbarth +fritze22 +fritzi +fritzi06 +fritzi13 +fritzle +friwoll03 +frixdog +frixos11 +frizzie1 +frizzo11 +frk127ee +frm50cph +frmyak +frnk2056 +frocio +frod1234 +froda +frode +frodev +frodie +frodo +frodo123 +frodo67 +frodon14 +frodoweb +froelunda +frog1111 +frog1992 +frog4370 +frog909 +frogabaw +froger +frogfrag +frogfrog +frogg +frogger +froggy +froggy55 +froggy79 +frogj1 +froglegs20 +froglips +frogman +frogman +frogxxxx +frogy1992 +frogzard +frolic25 +frolovn +from123 +from666 +fromage1 +front +fronti66 +frontline +froop1979 +frorse1 +frosch +frost2009 +frost234 +frost5253 +frostadmin +frosted01 +frostfire451 +frostst1 +frosty +frostz +frouk123 +froydis +frozen +frozening +frozensaints +frozon +frozzen +frpakauh +frpcet8t +frprva +frr45r +frrullo +frsf +frsfth8k +frstrtr +frt8ikl4 +frtwfrtw +fru1tbat +fru9920 +frucht +fruchtzwerg29 +fruitbat +fruitsap +frumpydog +frutalor +frutus +frwrh +fry8576 +fryday99 +frydlant +frylock +frynds03 +fryta666 +frz +frzvjrds +fs02FS +fs179889 +fs204694 +fs270791 +fs2a21a +fs456132 +fs5595 +fs6670 +fsa +fsacidburn +fsadock +fsat1818 +fsaut01 +fsaz02 +fscjdgl +fsdfsegg +fsdwea +fse +fsfok154 +fsh40den +fshaiduc +fshgzt +fshieh +fsibh +fsj1112 +fsk8btk3 +fslc2908 +fslhggi +fsm1453 +fsnjzgk +fsnul +fsoftware +fspasy +fspqp +fsracma +fsrpro +fsuis1 +fsv1910 +fswri +ft0701 +ft101z82 +ftatv +ftbe2002 +ftd2202 +ftetytv +fthhexer +fthkrsln +fthvfdao +fticka94 +fticpa69 +ftl123 +ftlgq102 +ftlgr +ftofto +ftp +ftp2316 +ftp4dmin +ftphyi +ftpqb123 +ftpttp49 +ftrf2 +ftripper +ftrmr7 +ftron123 +fts3504 +ftt660 +ftt7d +ftvegue +ftwr +ftxfmc00 +fu03211 +fu11m00n +fu12uod +fu1988 +fu37wb09 +fu3fu3 +fu696969 +fu6gfaht +fu91s +fuadmin +fualive +fuapo +fuat +fuat0916 +fubak +fubar +fubar01 +fubar222 +fubitch +fubu05 +fuchs +fuchs63 +fuchshit +fuck +fuck u bitch +fuck001 +fuck0ff +fuck1702 +fuck1987 +fuck1997 +fuck3r +fuck48 +fuck4fun +fuck4you +fuckaim +fuckcity +fuckdkp +fucked +fuckedup +fuckem +fucken +fucker +fucker003 +fucker06 +fucker07 +fucker13 +fucker2 +fucker99 +fuckerp +fuckers +fuckerz +fuckety +fuckface +fuckfaceass +fuckfast +fuckfuck +fuckgl +fuckh +fuckhead111 +fuckhim +fucking +fuckit +fuckit1 +fuckit69 +fuckjaw +fuckl0gs +fuckles +fucklife1189 +fucklove +fuckme +fuckme +fuckme21 +fucknet7 +fucknut +fuckof +fuckoff +fuckom75 +fuckpam +fuckpaul +fuckphox +fucks1 +fucksam +fucksamp +fuckshawn +fuckshop +fuckt4rd +fuckthat +fucktom +fucku +fucku +fucku123 +fucku2 +fucku33 +fuckuall +fuckulol +fuckup +fuckwien +fuckwit +fucky0u +fuckyou +fuckyou0 +fuckyou1 +fuckyou124 +fuckyou2 +fuckyou235 +fuckyou5 +fucnokia +fudao248 +fudge2004 +fudge3 +fudkp123 +fueeg +fueg8 +fuego1985 +fuerstenberg +fuerte +fufio +fufufu +fufupass +fuga +fugger24 +fuggey +fuhacker +fuhr24 +fuhrer +fuhricud +fuja6 +fuji +fuji26 +fujie456 +fujifilm +fujin1912 +fujitsu +fujitsu18 +fujitsu1980 +fukdvc +fukfuky +fukke +fukknu2 +fukoff +fuks +fuku +fuku4hac +fukunishi +fukuta1234 +fukya +fukyou123 +fulcher86 +fulda30 +fuldjur +fulhest +fuller +fullmoon +fullroms +fuloghop +fulp88 +fulpuzop +fulsoery +fulton +fulvia +fulvio11 +fulzavij +fum40s +fuman112 +fumanshu +fumateds +fumc5184 +fumetto +fumio +fumiyo +fun +fun1583 +funboard +funboy132 +funda13s +fundatie +funday +funday1007 +fundetta +funds +fundys +funeoh1 +funeral11 +funfrog +funfun +funfun1 +funfun59 +fung huk +fungb +funghu +fungi1994 +fungsion +funhouse68 +funk +funkadelic1 +funkar +funkel78 +funken07 +funkie88 +funkmachine +funkmaus +funktioniert +funkweck +funky1 +funky123 +funkyboy +funkyfab +funkyou +funkyt +funkyt0wn +funkytown226 +funmail +funmaza +funn689 +funnai +funny +funnybone +funnynka +funrob +funsolon +funtastic +funtime1369 +funtimes123 +funtor +funyhj +funyta +funz23el +funzel +funzeln +fuongpro +fuppert +furat77 +furbo321 +furby06 +furette +furf12 +furfur1 +furio +furioso +furious1 +furiouz +furisosoqu +furium1234 +furkan +furman3201 +furnier9 +furq4ns +furrtek +furry +furryfurry3 +furstcorn +furtado18 +furtivo308 +furto19 +fury1234 +fury2656 +fusdb +fusees +fusefuse +fusfus +fusion +fusion2 +fuska8 +fusker86 +fussball +fussball1 +fussballfest +fusseh +fusspawn +fusspilz +fut1234 +fut134a +futache +futari +futbol05 +futbol23 +futbol_05 +futbolas +futebol0 +futile2196 +futler91 +futman +futsalla +futter +futtich +futula +futur567 +future +future1 +futurebird +futurism3 +futurist20 +futuro +futzy123 +fuvwabol +fux0r +fuxuup +fuxx +fuxxing +fuxxor +fuxxxu +fuyisoft +fuytlbot +fuz01945 +fuz10n +fuz2zvoj +fuzzin +fuzzmat +fuzzo0 +fuzzy +fuzzy00 +fuzzybass +fuzzyme +fuzzyv70 +fv1to20 +fvbbjjjj +fvbr0311 +fvddo79b +fvjmp +fvp4f +fvzi1num +fw041679 +fw145152 +fw2lrx3y +fwallgren +fwbhz +fwds32ad +fweuw +fwf536ng +fwf9vi2g +fwg0g +fwijq +fwk63 +fwn3d18 +fwpnmm +fwqskg +fwqvvl +fwroot +fwt234 +fwtaucher +fww +fwwzr +fx4859 +fx92b1 +fx9th2k +fxbxurb2 +fxckip +fxfyfz +fxgvbp +fxn33s3b +fxngv4sk +fxo866 +fxrce88u +fxsuum4g +fxtyb +fxvxtr +fxz4itzk +fy144266 +fya13921 +fyet7 +fyfnjkbq +fyhs1181 +fyiim +fyodor +fyoyvize +fyqkymai +fyrkenda +fysn54 +fytyfqrf +fyuhe +fyv2u +fywga64i +fywmrjs7 +fywzq9s8 +fyxcl +fyy2lqq2 +fyyf1966 +fyzlehf123 +fz0719 +fz114123 +fz12345 +fz191164 +fz1985 +fz37z5 +fz785 +fza7upj8 +fzadmin +fzcy +fzhkdz +fzmbtf +fzparola +fzqr7 +fzr +fzr1000 +fzzhhhhn +g +g00ber +g00djob +g00dluck +g00dwr3nch +g00gl3 +g00gle42 +g00glero +g00ns +g00thic3 +g021405k +g02fvsc0 +g041zk +g090973 +g09k +g0b1gr3d +g0d5d4mn +g0dhiv +g0dlike +g0dpker8 +g0dvlab2 +g0emh +g0evyh +g0f1gur3 +g0g0lit0 +g0gulin4 +g0krmzia +g0ld3n1 +g0ldberg +g0ldenbe4r +g0ldf15h +g0ran +g0re +g0scha +g0t0b3d +g0t0wn3d +g0tc4ndy +g102368 +g10rg10 +g122522 +g123456 +g125311 +g13579 +g1395 +g13ru69g +g14h1738 +g16053 +g16399 +g18 +g18355 +g186325a +g1974g +g1a1g8 +g1a2n3s4 +g1avcs7 +g1bt6 +g1d2s1 +g1dqf +g1erhard +g1g2g3 +g1hero +g1hvj +g1kppndp +g1l1p0ll4s +g1r4f209 +g1r4ff3 +g1su4 +g1yh16 +g1yv0 +g1zm0456 +g2012003 +g21152115 +g218091 +g22z6n +g280292s +g2858503 +g2bb9fkv +g2fun4y +g2g2man +g2g4023 +g2lezhap +g2m3a597 +g2osb +g2pla82 +g2yoi2px +g3254360 +g36600 +g36corto +g36mp5 +g37365 +g3az447h +g3doa +g3e1n6z8 +g3filt3fish +g3i9g3a1 +g3ksp +g3n35i5 +g3n3rall33 +g3n74 +g3neburg +g3p650 +g3r1c0m +g3rhu8me +g3t0ut09 +g3t5x23 +g43tgv +g4455257 +g4536761 +g45fy34 +g46h3n9 +g48iKh +g4k834ju +g4l2n8 +g4l4ct1c4 +g4l4xy17 +g4m3 +g4mjh +g4n0nd0rf +g4nap8 +g4olb +g4rocks +g4ttus0 +g4vo4 +g4zica +g50cent +g5250035 +g53f54 +g540123 +g54q09m +g5628 +g56519 +g5726 +g5768178 +g58cbc +g5Ec +g5Ztm +g5d0y0q6 +g5p0r7 +g65sam +g66rzzii +g6793486 +g683274z +g6cpd +g6gas +g6h744 +g6k17u5r +g6muw +g6yus6s1 +g6ztn3 +g7239g +g777333111 +g7Jkd3 +g7a6n5z4 +g7bfj +g7f6e5d4 +g7nzu +g8225710 +g840918 +g840s +g86p3411 +g8739r +g89m05 +g8qeow +g8sgnmge +g8uboUsIep +g8yizya3 +g99fett +g9ad9m +g9d0fd +g9e1n6z8 +g9e2v7nl +g9hshrsj +g9rdp +g9wc +gAm44X +gCt11u +gK5Qgl +gOXUL +gQcZ +gQoeHL +gYgYgY +ga0538 +ga0he +ga2579 +ga2j03bi +ga2ppnao +ga3738 +ga7919 +gaaaaa +gaara0078 +gaarder +gab19xx +gab43a +gab4eto +gabana +gabanal +gabanas +gabbagabba +gabber +gabbert +gabbo5 +gabby +gabby +gabby2005 +gabby98 +gabbyjo +gabc1516 +gabdonok +gabe +gabe12 +gaberoo +gabi +gabi +gabija +gabija2004 +gabijo07 +gabika +gabinka +gables21 +gabo +gabor +gabor2 +gabri100 +gabriel +gabriel +gabriel008 +gabriel7734 +gabriela +gabriela +gabriela555 +gabrielariva +gabriele +gabriella +gabrielle +gabrysia +gaby +gaby +gaby11 +gaby22 +gabyeyes +gabyudo +gacha21 +gacusiek +gadacz +gaddas +gadget +gadget1 +gadient1 +gadska +gadzis +gadzoo +gaeb +gaefeg +gaelle +gaeltest +gaetan +gaetane +gaetano +gaetano56 +gaf4367b +gaf6cab4 +gafiga +gag2008 +gaga +gaga11 +gaga123 +gaga163 +gaga29op +gagadu +gagailor +gagamann +gagamel +gagamel77 +gagamel9 +gage +gagne1 +gagnoa +gagrice +gagzor91 +gaia +gaia +gaidys +gaijin66 +gail +gailard +gailen2829 +gaillat +gaitano +gaiver +gajbla07 +gajda +gajda911 +gajdys +gajol123 +gajus +gakhixug +gakshunter +gal100 +gal220 +gal5buk +gal665 +gal7gal7 +gal96093 +gala +galaa +galabatu +galactica +galactica3 +galadriel +galal +galal01 +galal99 +galan +galan69 +galant77 +galapagos +galata +galatasaray +galatea3752 +galati +galatica +galatool +galaxy +galdos123 +gale +galeon12 +galeria5 +galerie +galerija +galfer19 +galia +galia26 +galianor +galiba23 +galileo +galina +galina85 +galionye +galiunas +galjac +galkowski25 +gallagher +galleria1 +galleros +gallery +gallery++ +galleyxie +gallo14 +gallo1983 +gallons +gallows +gallws +galo +galo2008 +galopiru +galqc +galrtm +galt1954 +galuwka +galvan +galyloz +galyn +gam0rn +gam0rz +gam321 +gama1968 +gamabuka +gamadf +gamados +gamainrade1 +gamaoua +gamber123 +gambio11 +gambit +gambit35 +gambit69 +gambito1982 +gambito9 +gambl0r +gamble +gamble12 +gambri +gambyt +game +game001 +game1113 +game1230 +game1234 +game2004 +game2005 +game2play +game893 +gameboy +gameboy93 +gamecorn +gamecube +gamefaqs2007 +gameflu1230 +gameguru3141 +gamehack +gamehenge +gamela +gamelau +gamemaster +gameop +gameover +gameover1987 +gameplay +gameplayer13 +gamer +gamer0 +gamer009 +gamer29 +gamer9 +gamer90 +gamera +gamermatze +gameroc +gamers +gamers1985 +gamerz +gamerz05 +games +games1 +games101 +games69 +gamesad +gamesradar +gamesspo +gamestah +gamestar +gamesua8 +gametime11 +gamezpk1 +gamgee1234 +gamice29 +gamick +gamil +gaming1 +gamini +gamitan +gamma +gamma09 +gamma1981 +gamma269 +gammaray1 +gammbiff +gammel +gammon +gamorph +gamuser +gamze +gamzesiz +ganache +ganalulu +ganapati +gand02 +gandalf +gandalf1267 +gandalf39 +gandalf4921 +gandalf709 +gandalfp +gandolf +gane5040 +ganebo44 +ganesha6 +ganet +ganga17 +gangas +gangbang +gangdal +gangel +gangrel77 +gangrel78 +gangsta +gangsta1 +gangster +gangulic +gangzta +ganimede +ganimet23 +ganja +ganja1 +ganjiro +gano500 +ganpat99 +gant1234 +ganteng +ganthis +gantiadi +ganxta +gaoxuan +gaoyong820 +gaplek +gapreg59 +gaqo +gaqoraluk +gar +garabito09 +garados +garako +garald666 +garath48 +garbear +garcia00 +gard1n +garda007 +gardenbrd +gardenchic +gardener +gardensite +gardist28 +gardner +gardonzo +gare112 +gareth +garethlewis +garfi +garfield +garfield +garfield2555 +garfii +garfild +garfy924 +garga +gargon28 +gargrash +garin62 +gariss +garitz +garkeins +garlic01 +garlic23 +garlitz +garment +garmin2 +garner +garnet710 +garni333 +garo1972 +garret +garret11 +garrett +garric69 +garrick +garrix +garry +garry +garsha +garside3 +garten02 +gartende +garth0379 +gartou +garu2604 +gary +gary +gary howard +gary lee +gary rand +gary268 +gary3007 +gary6 +gary6512 +garyj4g +garyja +garythegreat +garzon +gas +gas21qoy +gas6464 +gaschema +gasg +gasgil1 +gasgs2 +gashaj +gasmask +gasmine +gaspercari +gaspode4 +gassb1 +gassm +gassyd +gast1 +gaston +gastone +gaswm +gat0rad3 +gat0rade +gat1a8 +gat1all +gate2k6 +gatekeeper21 +gater4u +gates +gateway +gateway2 +gatfd +gathering4 +gatierf +gatito +gatito52 +gatlin +gato +gatomon1 +gator6275 +gatora1d +gatorade541 +gators +gatqc3 +gatschi +gatsu52 +gatterl +gattes +gattling1 +gatto43 +gattoni +gattuso1 +gatuso +gau +gauche +gaugetheory +gauja13 +gauja357 +gauloises +gauloises1! +gauranga +gauvadin +gavalas +gavan +gavekort69 +gavin +gavin +gavin1129 +gavin22 +gavin5 +gavins01 +gavott93 +gavrik +gavwicel +gaw5t8 +gawakofi +gawgle +gawiczek +gawzf +gay +gay +gay ellen +gay0n00 +gay11gay +gay1gay +gay4evr +gaya +gaya123 +gayass +gaycun60 +gaye +gayenzo +gayhart1 +gayheim +gayle +gaylord +gaylordy +gayman +gayne +gayweqoh +gaz +gaza110 +gazali86 +gazebo3133 +gazger +gazgireev +gazo4321 +gazoual +gazsucks +gaztigu +gazz0436 +gazza96 +gb +gb074 +gb2312 +gb4512 +gb74gfa +gb8igf +gbap0509 +gbcgmbh +gbenga123 +gbgbcmrf +gbgodis +gbgthi +gbl0gbd +gblfhfc +gbljhfc +gbnjy87 +gbnth +gbnxkysi +gboac65 +gboooo +gborekci +gbplf +gbpltw +gbsabcd +gbseni +gbsuxac +gbwnl +gbyudby +gbzeus +gc071304 +gc131151 +gc3872bu +gc671213 +gc7uz7hu +gc8113KML4 +gc8xpvz8 +gcabel84 +gcadmin +gcapozzi +gcba +gccccc +gcerou75 +gcgcgc +gchapman1 +gchq2312 +gcmap +gcms0610 +gcms1410 +gconte +gcp13 +gcpasse +gcqueen +gcskas87 +gcuar +gcube55 +gcushrc +gcwd1p +gcz6y +gd0599 +gd1g9 +gd525718 +gd8541 +gdbl33k +gdc4ef +gdezk +gdfg +gdgfmng +gdghsssa +gdi28nod +gdidier2 +gdl +gdp255 +gdpzwz +gds87421 +gdsm9 +gdt2005 +gdt2006 +gdtlo +gduxe80 +gdynia1 +ge-ge +ge1forum +ge24mo +ge3bqy5n +ge4150 +ge9heid +ge9tqctt +gea1gea +geanaaron +gear +gear1715 +gear2 +gearbox +gearedbra +gearhead +geas978 +gebalong +geben1 +geben321 +gebertjan +gebhard +gebiche +gebminer +gebruikersnaam +gebze +geca1320 +gecco9 +geceler +gecenemi +gecube +ged +ged123 +ged85cic +ged999 +gedanp38 +gedde +geddes4e +gedi2005 +gediminas +gediminas +gedore +gedowid +geeg76 +geegee +geegee1312 +geek1842 +geek1yes +geekboy +geeks +geelong5 +geena +geenid +geepas +geert +geertje1 +gees +geese +geezer +geffen +gefickt +geforce +geforce50 +gefuck +gege +gegenlicht1 +gegep +geggebuh +gegusha +geh3ux54 +geheim +geheim115 +geheimer008 +geheimnis97 +gehenna +gehirntod +gehis +gehowo63 +gehtdoch +gei3armn +geier +geiermk +geil +geilwa77 +geimpft +geir1099 +geir2k2 +geis5254 +geisha +geiss1373 +geissen13 +geist1293 +geisterwolke +geistlos +geitbe +gej12345 +gejsrjf +geju5 +gekke04 +gekko1 +gekonik1 +gel8acht +gelagelo +gelaogelao +gelarian +gelder2188 +geldher +geleinha +gelernt +gelgoog1 +gelibeen +gelini33 +gella +gellert +gelmusic +gelo +gelo1 +gelo1989 +geltonas +gem.bala +gem228 +gem93nul +gemaelde +gemaga +gemas +gemastik +gemat0ma +gembul +gemelli +gemera3h +gemetzel +gemfire +gemhost +gemicha8 +gemini +gemini1 +gemini117 +gemini189 +gemini6 +geminimp +geminirc +geminisd +gemma +gemma +gemocha +gempk783 +gems321 +gemstone +gemsvishu +gemze +gen +gen +gen1al +gen22 +gen333 +gen4444 +gena +genata +genauso +genc9573 +gene +gene krupa +gene0802 +gene123 +gene2211 +gened +generaal01 +general +general +general chuck +general1 +general50 +generalecaster +generals +generals538 +generation +generator +generix +genesia +genesimmons +genesis +genesis1 +genetic +genetix +geneva +genevieve +genex +gengchul +gengjia +gengjian +genia +genialoide +genie1 +geniesen +genii +genious +genisis123 +genisis91 +genitika +genius +genius000 +genius2me +genius32 +genius984 +geniuss +geniusss +genjot +genjuro +genkagenka +genkeim7 +genki +genki123 +genmay +gennadi +gennaro +gennaro +gennero +gennie +genny50 +genoa +genoa89 +genocide +genoiuss +genosis12 +genpass +genre05 +genstar0 +gentoo +gentorac +gentrish +genuine +genzyme1 +geo +geo +geo anne +geo12 +geo21net +geo725 +geodezja11 +geoelen +geof1705 +geoff +geoff187 +geoffery +geoffrey +geoling +geomega +geoneti +geophile +georg +georg +georg august +georg stanford +georgann +georganne +george +george +george bean +george buck +george gabby +george h +george haymid +george kee +george lah +george lee +george pat +george raymond +george slim +george01 +georgem +georges +georges1981 +georgeta57 +georgeterra +georgette +georggeorg +georgi +georgia +georgia +georgia ann +georgiana +georgianna +georgie +georgina +georgine +georginia +georgis +georglin +geotech1 +gep2ovv4 +gepard2104 +gepatit +geppeto71 +ger04240 +ger1234 +gera38 +gerad +geraine +gerakatz +gerald +gerald +gerald oliver +gerald89 +geraldine +gerard +gerardo +gerardoalfredo +gerascs5 +gerasimos5 +gerber2008 +gerbie +gerbiee +gerbil +gerd +gerd123 +gerd26 +gerda +gerda1947 +gerdici +gerdsa17 +gereed +gergo84 +gerhard +gerhard1488 +gerhardt +gerhart +geri +gericom +gerilja1 +gerilla +geriny +geris93 +gerisa +gerlinde +gerlinde +germ469a +germain +germaine +germaines +german +german +german1a +german30 +germana +germania0 +germano +germany +germany121 +germeyn +germi1173 +germi96 +gero +gerold +geronax +geronimo +geroschatz +gerrard +gerrin18 +gerrit +gerrit +gerrithansen +gerritt +gerry +gerry69 +gerson +gersoto2 +gerstein51 +gert +gert guenter +gertan +gerti +gertik +gertlogen +gertrud +gertrud +gertrude +gertrude +gerttu +gerulis +geruolis +gerutis +gervang1986 +gervasio +gesa +gesamt +gesie +gesliwez +geslow +gesproy +gestank8 +gestefan +gestion +gesue +get1now2 +get959 +getabook +getacces +getar +getemd123 +getfucked +gethigh +gethke +geti1007 +getin +getinto +getit +getout +getready +getrude +getter12 +getthem +getthis1 +getti3 +getwave +getzxn66 +geula +geuuzyfl +gev80737 +gevara +gew42 +gewcarta +gewinner +gewmi9b8 +gex25000 +geymond +gez35av1 +gez73dom +geza +gezhus +gezi0815 +gezmods +gezrx +gezupo +geändert +gf +gf0515 +gf1106 +gf1122 +gf290972 +gf387p4 +gf38ol +gf666 +gf675tg +gfb0204 +gfb0j +gfd009 +gfdea +gfeadmin +gfeller +gfhfgkfy +gfhjkm +gfhjkm2007 +gfhorsens +gfhreh +gfhrt5gz +gfjkdfjm +gfkatie +gfkilla8 +gflkf +gfmnwu +gfnetbar +gfoidl +gfp56 +gfp902 +gfpkel +gfr3ak1t +gft +gfxsauae +gfxstmbl +gfy19853 +gg +gg0210 +gg0715 +gg123456 +gg1245a +gg161169 +gg2105 +gg210586 +gg37kg2v +gg6b4w +gg7 +gg785k +gg9xef10 +ggbq6tb6 +ggcut2k3 +ggd111 +ggegz96 +ggfcb +ggflpjg +ggg +gggeraaa +gggerson +ggggffff +gggggg +gggggh +ggh46e +gghamdi +ggiay +ggkiller +ggoldf12 +ggpk3 +ggrang +ggs903 +ggssmm +gguhz +gguns246 +ggzh913 +gh050262 +gh05tl4nd5 +gh0st +gh0st +gh1029 +gh121076 +gh12122 +gh1gh2 +gh2000 +gh25mnt +gh25s1t6 +gh2b78 +gh2iup45 +gh4156 +gh45jk +gh4wv6 +gh5010 +gh53wb7g +gh56tzbn +gh6712tp +gh8fur +ghackerg +ghada321 +ghadames9799 +ghaghasd +ghalia +ghandi1 +ghandy +ghar2007 +gharrek1 +ghb1dtn +ghbdtn +ghbghfdf +ghbrjk +ghbrsc01 +ghbtzx +ghbvfvbh +ghbynth +ghchuy58 +ghdssssf +gheorghe +gheroghe +ghetto +ghetto09 +ghetto87 +ghey19 +ghfkbx +ghforces +ghg1234 +ghgh +ghgh56 +ghghgh +ghghgh77 +ghghj +ghhaxor +ghi84jg9 +ghiberti89 +ghici +ghicima +ghidkata +ghigo80 +ghimau +ghislain +ghita +ghita ben +ghitaa01 +ghizfeeg +ghj +ghj123 +ghj14wju +ghjcnj +ghjgbk +ghjkbn34 +ghkity +ghn0096 +gholami +ghooviev +ghoraidh +ghost +ghost +ghost2k +ghost324 +ghostbear78 +ghostchan +ghoste123 +ghostir +ghostj +ghostrider +ghostrider1 +ghosts +ghosts86 +ghosty +ghostz +ghoti1 +ghottish +ghoul1615 +ghouri +ghouse +ghpowa +ghs1977 +ghsebe +ghsy39 +ght4587 +ght5412 +ghtr785e +ghuasuu8 +ghuiwe +ghuk +ghviu +ghwrs +ghww91 +ghy456 +ghyt5y6 +ghytbn +ghytghyt +gi-gi +gi0nyi +gi1111 +gi123 +gi281085 +gi4321 +gi6zuv7b +gi91myne +gia +giacomo +giacomo +giacomo rossi +giallo +giampiero +gian maria +gian-carlo +giancarlo +gianfranco +gianluca +gianluca +gianna +gianna +gianna maria +giannace +giannakis1 +gianni +gianni +giannino +gianpy44 +gianpy91 +giant937 +giantbeans +giants +giappolo +giapponE +giappone +giauc305 +gibb +gibbon3004 +gibgub +gibou +gibs001 +gibson +gibson +gibson1234 +gibson23 +gibson72 +gibtde +gic6ch69 +gicgl +gicleon +gid04ll +gideon +gideon +gidnz +gidon +gidwest +giedre +giedrius +giella +giellore +gievde +gievfree +gifclan +giff +giftig1 +gifting +gig +giga +giga2027 +gigaak +gigaball +gigabyt3 +gigabyte121 +gigaclaw +gigade +gigafan1 +gigagame +gigaman +giganet +gigant+2 +gigapixel +gigaset4175 +gigel +gigelo +gigetto +giggalo1 +giggigg +giggity1! +giggity5 +giggle35 +gighagigha +gigi +gigi +gigi1212 +gigi1951 +gigi28 +gigi2809 +gigi4380 +gigi48 +gigi65 +gigi66 +gigi71 +gigigigi +gigikent +gigiliu +gigounon +gigovic +giguel76 +gijoe18 +gijsbers54 +gijwel +gikas +gil +gila +gilad1 +gilamaze +gilat +gilbates +gilberd +gilbert +gilberto +gilda +gilda007 +gilf +gilgalad1 +gilgames +gilgamesh +gille60 +gilles +gilles84 +gillian +gillian elisa +gilligan81 +gillinda +gilokyas +gilopp +gilqot +gilthore +gilyak9 +gimajope +gimby666 +gimd7458 +gimegime +gimgim +gimme114 +gimmegimme +gimn4 +gimnazjum7 +gimnazjum9 +gimpomat +gimpy +gimpy2007 +gimpyhamster +gimpyklamm +gimpymizuno +gimpynews +gimson89 +gin +gina +gina1307 +gina2411 +gina303 +gina89 +gina96 +ginack38 +ginas +ginawild +gincius +gindafiy +ginelle8 +ginette +ging +gingaoo +gingee!1 +ginger +ginger +ginger01 +ginger0132 +ginger277 +gingham +ginna2156 +ginny +ginny1 +ginny345 +gino +gino del +gino2007 +ginokopf +gintajuv +gintare +gintonic +giny1109 +gio +gio +gio2563 +gioaliok +giocare +giocoso +gioggy02 +giogio +gioia +giolio +gionni +giordano +giorgi +giorgio +giorgio89 +giorgior +giosue +giotto +giovana00 +giovani +giovann lla +giovanna +giovanni +giovanni +giovannivan +gipSbeiN +gipfel8850 +gipsy400 +gir2778 +gir3730 +girafa +girafe +giraffe +girasino +girasol73 +giraya +girgel86 +girice +girishk +girls4girls +girlss +girlzq3a +girona30 +girones10 +giroux +girstut9 +gisbert +gisela +gisele +gisella +giselle +giselle +gisha7 +gismo +gismo123 +gismo13 +gismoe +gismor +gismospi +gistek +gistummel +gisue07 +gita +gita741 +gitara +gitariye +gitarr +gitarre +gitarrespielen +gitdata +giterdon +gits4570 +gitt +gitta +gitte +gitteers +gittermast +gitti +gitti123 +gittioma +gitzgitz +giuditta +giulia +giulia +giuliagiulia +giuliana +giuliana +giuliano +giuliano +giulietta +giulietta +giulio +giulio +giuriato +giuseppe +giuseppe +giusha9 +giusi88 +giussani +giutz8ne +giv3v +givigivi1 +givtff +gixdax2 +giz +gizemgizem +gizileja +gizlikod +gizmo +gizmo1808 +gizmo3415 +gizmo360 +gizmo99 +gizmocw +giznad0 +gj0025 +gj6iw3xn +gj6rg4zo +gjakova +gjcav +gjf2a +gjg1297 +gjhndtqy +gjilanas +gjk5035 +gjkbwfq +gjksoer +gjmgjm +gjoca5 +gjones99 +gjpbnbd +gjq1q +gjsheen +gjsqud11 +gjt7uiv6 +gjuroxxl +gjuw4 +gjxgrts +gjyopyop +gk2315 +gk316632 +gk3409 +gk394042 +gkb3332 +gkb3333 +gkbime +gket57as +gkeuby +gkg7ogk7 +gkh43ayk +gkhanmem +gkiorgko +gkipheno +gkkmz +gkownz +gks004 +gks1980 +gkstnmcj +gkstychy +gkt9q +gktgkt +gkwI2 +gkz404tk +gl +gl1505 +gl1940 +gl59ah58 +gl640708 +gl8050 +gl8082 +gladanka +gladbeck +gladden +gladek +gladgrad +gladiator +gladiators +gladium12 +gladpack +gladys +glagah +glam15 +glamour1 +glamour6 +glan +glanforo +glanga11 +glase +glasel123 +glasmotte +glassair +glasses321 +glassko3 +glasslol +glauco +glay5858 +glazing37 +gldp8090 +gleason +gledmyr +gleelarsen +gleeok8814 +glen +glen charles +glen gray +glenda +glenda +glendale +glenmorangie +glenn +glenn miller +glenne +glenois +glg443 +glgs +gli9m +glibl +glicher420 +gligani +gligoric +gliguori +glinga +glitter +glitzer2008 +gliwice1958 +glj4303 +glk4000 +glm321 +glm526 +gln2rfdn +gloam9123 +gloane +glob1989 +global +globalb +globalx +globe3 +glober +globus +globus09 +globz008 +glock021 +gloisgay +glomar +gloom +gloom666 +glopglop +gloria +gloria mitzi +glorioso +gloris +gloryin1 +glouglou +glov +glovarm123 +glow852 +glowka1234 +glring +gls00001 +gls0203 +gluck1 +gluckstr15 +gluglu +glumpi +glupos3 +glut1992 +gluttony +glwypi7l +glx72 +glycer!ne +glyn +glyndoran +glynis +glynn +glynn1031 +glz2001 +gm158904 +gm1959 +gm2030 +gm4ever +gm7241 +gmail7 +gmbg0808 +gmbg2222 +gmc13377 +gmc13s +gmcz71 +gmdas +gmetod +gmh1265 +gmh4tid +gmladmin +gms007 +gms231 +gmt1313 +gmuabjcc +gmuva +gmuva1 +gmv@web08 +gmx12666 +gmxchen +gmxler +gn0s1s69 +gn1234567 +gn125 +gn150489 +gn170892 +gn35753 +gn489875 +gn5fzT +gn86qvqt +gn8gn8cu +gn9dgkg +gnamore +gnappone +gnarl1993 +gnarly +gnatpsb +gnavpot +gnb13666 +gnbj6 +gneiss123 +gnet +gnezgnez +gnfmrt +gni7jbpg +gnida123 +gnig9 +gnio359 +gnk6xxx +gnkhmzao +gnok10 +gnome +gnomebegone +gnomen20 +gnomes +gnomik79 +gnoms +gnosis +gnowpcz +gnpclaus +gnq52 +gnrtn22c +gns0912 +gntxdl +gnu +gnugnu +gnutvn +gnvf5 +gnwpu6a +gnxh32s +go +go +go-kart +go0gLe +go2545nu +go2bett +go2h311 +go2hell +go2irc +go2sleep +go2theog +go2up123 +go300888 +go39473 +go4dkp +go4it +go6247 +go7612 +go79dogs +go9090 +go96i8i8 +go9tox +goa2000 +goachild +goahead69 +goalb4 +goalkeeper1 +goalkpr +goamd89 +goat +goat4ever +goat9669 +goatboy6 +goatse +goaty3711 +goaway +goaway1388 +gob +gob007 +gob0b +gobears01 +gobelin +gobeyond +gobial00 +goblay +goblin +goblin18 +goblin70 +goblin76 +goblinfires +gocart20 +gocredix +god +god1069 +god1985 +god2000 +god435 +god707 +god96pro +godbl3ss +godch1ld1 +goddammit +goddamn +goddamnit +goddds +goddess +godewind +godfather +godfirst +godfrey +godgod2 +godhand +godhelpm +godimsor +godis10 +godis4me +godisadj +godisred +godking1 +godlike +godly420 +godm4f14 +godman44 +godman911 +godmode +godmode2021 +godmother1 +godof +godofwar +godreto +godsbane73 +godsdice +godsdog +godsmack +godsmack85 +godsquad +goducks +godxaker +godxii +godz1234 +godzilaa +godzilla +goedhart1 +goeffrey +goeharmony +goeran +goerge +goerges +goerig +goess9 +goesta +goetter24 +goetz +gofl2711 +goforit +gofy6 +gog88gog +goga4it +gogadget +gogamgogam +gogata +gogeta +gogeta2 +gogetter71 +gogge123 +goggeduu +gogi0109 +gogich +gogirl +gogo +gogo12 +gogo1717 +gogo6 +gogo88 +gogo8c +gogobear +gogogel +gogogo +gogokit +gogol123 +gogolen +gogoli +gogomeme +gogopopo +gogos74 +gogosa +gogusor +gohabs +gohabsgo +gohan15 +gohan2092 +gohan24 +gohan8 +gohanki +gohdar17 +goheels +goi27 +goiley +goinfast +going345 +goingd +goinggoing +goingto +gointer +goirish28 +goiset +goivaw9 +goiyin +goj50 +gojira54 +gojkovic1 +gok14 +goka +gokart08 +gokart31 +gokart93 +gokhan +gokor +goku0 +goku007 +goku080808 +goku123 +goku2k3 +goku333 +gokuh +gokus +gokuson +gokuss +gol1ath +gola014 +gola123 +golan8044 +gold +gold123 +gold3474 +gold456 +gold500 +gold5569 +goldae +golde +golden +golden +golden1 +golden1975 +goldeneye +goldengames +goldenheaven +goldenrod +goldfinger94 +goldfisch +goldfish +goldfreak +goldfree +goldi +goldie +goldie1 +goldini38 +goldminer93 +goldstyl +goldwing +goldygoldy +goleafs +golem +golf +golf0156 +golf1991 +golf22 +golf33 +golf387 +golf4fun +golf4gti +golfare +golfchamp +golfen +golfer +golfgl +golfgt1 +golfgt16 +golfinho +golfo +golfpark +golfplatz +golfpro +golfspieler +golfvr6 +golgotha +goliat7558 +goliath7 +goliaxoi +golla318 +gollan9111 +golle02 +golleci +gollum57 +golly666 +golm2004 +goloso1963 +golpesar +golsiad +golum +golum76 +goly3d +gomaeva +gomer +gomer101 +gomettes +gomez +gomez082 +gomgomer +gomin1 +gomora +gomujo +gon +gon51604 +gonad12 +goncz1 +gond4040 +gondes75 +gondolin +gondor +gondoratp +gonenc87 +gongas2083 +gonge420 +gonguxir +gongyiaa +gonoles +gonore +gonul +gonveqoz +gonzalez +gonzalo +gonzman +gonzo +gonzo1 +gonzo2347 +gonzo73 +goober +goober76 +gooble2 +gooch195 +good +good123 +good2wear +good7887 +goodboy +goodbye +goodbyw0 +goodfish +goodgod +goodgood +goodhost +goodies +goodies003 +goodjin +goodjob +goodjob0 +goodluck +goodman +goodnews +goodnumber +goodone2 +goodramen +goodsnt +goodtimes +goodwill17 +gooeng +goofey +goofus02 +goofy1 +goofy100 +goofy8 +goofydk +googan +googie +googiepan +google +google +google.de +google1 +google16 +google44 +google69 +google88 +googlegoogle +googleit +googlemang +googles1 +googlito +googsgoogs +googy +goohoo +goolerz +goomba +gooner +gooner1 +gooogle +goose +goose882 +goosegay +goosig +goosuto +goosy132 +gooyert +goozi +gopack +gopal +goper +goperka +gopher112 +gopher32 +gopostal +goprri +gopunk +gor5623 +goran1979 +goranb +gorath1 +gordana +gordana12345 +gordenafra +gordie6 +gordillo41 +gordon +gordon +gordon john +gordon01 +gordon80 +gordylu1 +gore99 +gorele1 +gorfongo +gorgan433 +gorge! +gorgio13 +gorgo2007 +gorgon1355 +gorgonzola95 +gorica +gorila23 +gorilla +gorillah +goristan +gork2212 +gorkan1348 +gormley86 +gorn99 +gornal1 +gornev +goro +gorogoro +gorras10 +gorrionaco +gortig37 +gortsos +gorzaram +gosca +goshorn86 +gosia1 +gosia82 +gosiap80 +gosik75 +goska2205 +goskins21 +gosling519 +gosmer123 +gosnell +goso1982 +gospelcode +gospodarc +gospodarqt +gossip3091 +gosta +gostaff +gostate +gosty +got +got2buy +gotele +goten2314 +goten3 +goten933 +gotenks +gotenks4 +goth +goth6666 +gotha2001 +gothamcity +gothic +gothic2 +gothic88 +gothica25 +gothy123 +gotia123 +gotnuts +goto1 +gotogoto +gotohell +gotokevin +gotome +gotony20 +gotowned +gotree2 +gott +gott1987 +gottfried +gottgott +gottidj +gottpau +gotyy123 +gotz +gouda111 +gouki699 +gouku1 +goumbik +gouranga +governor +govinda +govkha +govnaz +govno007 +govols +govrov +gowcezux +gower +gowgow +gowinamp +gown408 +gowno323 +goya1746 +goylobec +gozilla7 +gp130965 +gp2003 +gp602a +gpasswd0 +gpatw +gpchess +gpgarrido +gpgrw +gpimpc +gpjingles +gpndt +gpo4ever +gpolice +gppilots +gpsywsw1 +gptfx80 +gpz1100 +gpzf +gq110162 +gq12345 +gq5386mf +gqiezr1g +gqlfc +gqnmit +gqx1k +gqxni +gqxswed +gr00v3 +gr00v3r +gr0645 +gr0ndahl +gr0u5e +gr0wth +gr123een +gr1gr1 +gr1oeck +gr235553 +gr33n1$h +gr33ns3a +gr33tz +gr3707er +gr3g111 +gr4n4d4 +gr62551 +gr635511 +gr6een0 +gr72os05 +gr8335bm +gr852456 +gr8boy +gr8nt +gr8scott +gra34fod +grabbar93 +grabben12 +graber +grabow01 +grace +grace +grace lee +gracek14 +graceland +gracew78 +gracias +gracie +graciela +gracilea +gracille +gracinda +gracz +gradecki +gradefour +gradmin +gradnja11 +gradoo +graduate +gradus45 +grady +grady13 +graem +graeme +graffi123 +graffiti +graffiti1 +grafik +grafitek +grafix128 +grafke +grafoman99 +graham +grahame +grahamwe +grahan +grail69 +grainger +grakj +gralb +grall111 +gram91 +grameno +grammen +grammy +gramoona +gramsci +granat +grancapo +grand magic +grande +grande +grandeco +grandel +grandia +grandia2 +grandon +grandpa +grandtheft +granija +granit91 +granite +granmott +granny04 +granny2009 +granny79 +granresc +grant +grant +grantis1337 +grantlee76 +grants +granular2008 +granville +grap3441 +grape +grape67 +grapeattack +grapetree922 +grapevo +graph4u2 +graphs +grapids +grasnbag +grasshopper +grasveld1990 +gratia +gratien +gratis +grauberg +grauli +grav1273 +gravador +gravar05 +gravedigger +gravemind +gravestrafe +gravette21 +graveyard +gravitation +gray +gray555 +gray69 +graybeard1 +grayce +grayscale +graysen +grayson +grazia +grazyna +grbgouda +gre53z +great +great1 +great321 +greatjob +greatlee +greatone +grebdlog78 +grec1969 +greco +greebo1278 +greedy +greeks +green +green05 +green123 +green182 +green223 +green2458 +green432 +green5 +green555 +green846 +green856 +greenblue +greencow1 +greenday +greenday7421 +greenery +greenhead56 +greenie +greenjelly +greenland78 +greenlin +greenman +greenman1 +greenmm +greenpeace +greenslight +greensun +greentim +greentinted +greer +greets +greg +greg +greg1089 +gregas +greger32 +gregg +greglard +gregoire +gregoor +gregor +gregor +gregor14 +gregori +gregoria +gregorian +gregorians +gregorie +gregory +gregorz +gregp +greieras +greigh +grejpen +gremling1 +gren1234 +grenaa8500 +grenade +grenat +grenig13 +grenoble2 +grerp1 +grerp4 +gresizi +grespik +greta +greta420 +greta87 +gretchen +gretchen61 +grete +gretel +grethe +greti +gretl +grett +gretta +grevels +grewal333 +grey +grey17 +grey2525 +grey7754 +greyman +greyvi +greywolf13 +grezzerg +grfdvpt +grhorn +gribbel23 +gribben1234 +gribouille +grichev +griek753 +griever +griff +griff rhys +griffen29 +griffey +griffin +griffin +griffin666 +griffith +grifo714 +grigor +grigor13 +grigori +grilla00 +grilledtoast +grilleur +grillfass +grillo +grilool +grim snorre +grim0817 +grim2 +grim59 +grim666 +grimaldi +grimaou +grimes42 +grimgor +grimlin9229 +grimmer +grimmie499 +grimmy1 +grimreaper +grinch1988 +grind666 +grindel92 +grindelwald59 +grinder3 +grinders +grindhouse321 +grindston2 +gring1 +gringo +gringo09 +grint17 +gripen +grisb +grischa +griskoto +grissoo +grith +griubx +grizelda +grizha +grizli +grizly345 +grizwald +grizz7522 +grizzly +grizzly7 +grkiwi +grkmspr +grm131 +grmbjaeu +grn5y7 +grnewsm +grobar60 +grobi5555 +groboeuf +grobot0910 +grobsen +grocerlala +grodzki +groej +groffice +grogan626 +grognar +grokat +grokgigo +groki345 +grokid +groland +grom666 +grom92 +gromit +gromit32 +gromotek +grond +grooke24 +groomi +grooming +groove +groovet +groovie +groppo09 +grosch24 +grosik999 +gross34 +grossgewann +grossigj +grosskill +groth +groucho +groucho16 +ground11 +grounds54 +grove123 +grover +grovis1989 +grovsnus +grower +growhow +grown187 +groxio +grrenyy +grrrr +grs3651 +grsmas +grsoft +gru4936 +grubas71 +grube +gruby1 +gruby27 +gruby2906 +grucha1123 +grudzinski +gruen4444 +gruenelda +gruenkegruenke +gruff15 +gruffel +grufti +gruja88 +grumd00k +grumpf +grumpli +grumpy +grumpy51 +grundig92 +grundy +grunge +grunt337 +grunts +grupa2006 +grupi611 +grupodr +grupoges +grusa1243 +gruster +gruszka +grutto6 +gruxuna +grv59y7x +grybukas +grynien +gryphon2266 +gryphonx +gryta9 +grzechu7 +grzegorz +grzesio +grzybek1 +gs +gs0195 +gs1234 +gs1300xr +gs14life +gs1508 +gs1626la +gs1905 +gs1gs1 +gs2001 +gs2007 +gs2266 +gs3nt57 +gs500e +gs550m +gs766 +gs78gh +gs9500 +gsa9064 +gsandbox +gsd647 +gsetten +gsgsgs +gsh9381 +gshare +gsi193 +gsi2006 +gslenoob +gsmfree +gsmgsm +gsmm4245 +gsmphpbb +gsna5682 +gsona123 +gsp1 +gsrj3n +gssaga +gssozluk +gsspsryb +gssushop +gstar +gstar78 +gsuf9 +gsuria +gsw950 +gsx1200 +gsx1300r +gt1476 +gt153315 +gt196912 +gt200345 +gt200545 +gt367gt +gt4512 +gt4569 +gt56sam +gt5j753h +gt7zuhm +gt84my39 +gt91742 +gt9u5ark +gta +gta01 +gta100 +gta111 +gta12345 +gta211 +gta2gta2 +gta3 +gtaben +gtalukas +gtanormen +gtare2 +gtasa +gtasa6561 +gtasan +gtavice +gtb129 +gtbolide +gtcjadm +gtdrei78 +gtflavio +gtg +gtgcjnf +gtgtkfw +gth4492 +gthjgtla +gthlc60 +gthtvtyf +gthtvtys +gti03vw +gti16s +gti205 +gtiption +gtjzrxf +gtk87 +gtkhk +gtm +gtmaster +gtmjgpa8 +gtnasty3 +gtneirb +gtnhjdbx +gtnv3e6a +gto455 +gtossici +gtozgtoz +gtpass +gtr34sky +gtr367 +gtrf456s +gtrxu350 +gts123456 +gtsprs +gtt +gttgtt +gttnull +gtvo +gtw485 +gtwywt +gu1234 +gu1d0b +gu1l23 +gu4dofun +gu7686 +gu7cluk4 +guacamole +guada141 +guadalupe del +gualberto +guangzhou +guapayo +guarapo +guard452 +guard4605 +guardian +guardian7 +guardianes +guatemala +gubgub +gubish +guc66 +gucci1 +gucgegum +gucio1 +gucio2 +guda19 +gudbage +gudi +gudi2211 +gudny +gudrjs2 +gudrun +gudrun +gudrun27 +gudrunno +gudzee +guendalina123 +guenni47 +guenter +guenther +gueorgui +guero123 +gueros666 +guerriere +guerrilla +guesa +guess1145 +guess123 +guess7147 +guessit +guest +guest001 +guest228 +guest99 +guest: +guestabi +guestguest +guestnow +guevara1 +gufetto +guff238 +guffaw0304 +gufpif +guftekar +guga18 +gugalica +guggi +gugliemo +gugluggs +gugmcvdf +gugre375 +guguita +gui +gui0509 +guia1999 +guiamania +guich +guiche +guido +guido009 +guido13 +guigui21 +guigui90 +guigus86 +guik3193 +guil5668 +guild08 +guild1492 +guild9000 +guildabraxas +guildfatality +guillain +guillaume +guillaume +guille +guillermina +guillermo +guillory12 +guilo +guiloune +guiness +guinn +guinne55 +guinness +guinness1 +guiomz +guirro +guiseppe +guismo +guismo30 +guitar +guitar01 +guitar2 +guitar488 +guitar50 +guitarman1 +guitarman3 +guja +gujbbxaj +gujkbujk +gujsalor +gulcinim +guldklimpen65 +guleb +gulfer99 +gulfink +gulfkilo +guli +guli51 +guliano +gulin306 +gullden1 +gully +gulost +gulsah +gulsah87 +gulseren +gulsot +gulsum03 +gulussum +gum45tip +gum9t10n +gumball1337 +gumbie12 +gumbo2476 +gumby123 +gumdr0p5 +gummi6 +gummibil +gummitot +gummy123 +gumnut11 +gumo2003 +gums +gumybear +gun +gun6coal +gunazem3 +gunboat +guncha89 +gundam +gundam05 +gundam0880 +gundelse +gundelsheim +gunders1337 +gundican +gundolf +gundula +gunesbjk +gunesgunes +guney123 +gungstol +gunhead +gunkaile +gunkie +gunkler +gunman03 +gunn +gunn4r +gunnal +gunnan123 +gunnar +gunnar +gunnel +gunner12 +gunnerdh +gunness88 +gunnilla +gunnis +gunnysac80 +guns +gunshot +gunslinger803 +gunsnroses +guntars +gunter +gunter +gunter maria +gunter92 +gunther +gunther maria +guntina +guntr0ss +gunvor +guo1ying +guochain +guolijun +guphie +guppy +guppy120 +guppys1 +gural1 +guraxaho +gurcancan +gurdil +gurer506 +gureu272 +gurgel1544 +gurino +gurk4n +gurka1173 +gurkan1338 +gurkan76 +gurke2002 +gurken +gurmuckel +gurpreet +gurra3221 +gurrydusty +guru1234 +guru1997 +gurucom1 +gururum +gus +gus arnheim +gus103 +gus123 +gusan +gusan0 +gusek +gusfazar +gusfraba +gush +gusse23 +gussie +gusta +gustaf00 +gustas +gustav +gustav +gustave +gustavo +gustavo +gustaw +gustawa050 +gusti +gustoavo +gut08zet +gutako +gute900 +gutemine87 +guten8 +gutenmorgen +guther +guthrie +gutinaf +gutkowski +gutmann +gutterball7575 +guttural1337 +guty +gutyfa +guudsje +guus +guus van der +guusje +guust2502 +guvercin +guw19ufu +guy +guy bates +guy des +guy2guy +guy82000 +guybrush +guybrush9 +guydht +guydoo +guyer07 +guyownz +guyslie +guythe +guytkfx +guyumino +guyver30 +guyver4505 +guyver4850 +guyver701 +guyverx +guzbach +guzel35 +guzica50 +guzun +gv123 +gv1986 +gv270105 +gv5676 +gv5j1uu5 +gv66244 +gvV +gvanca +gvarona +gvazauri +gvd310a +gvf2000 +gvg9h +gvillot +gvisg +gvmmm +gvnu0 +gvonline +gvotF +gvozdika +gvptgv +gvqhyd +gvqrt6mg +gvsucc +gvz +gw0ebpv6 +gw1234 +gw1589 +gw1943 +gw2jr +gw2k5 +gw4mk7 +gw5myk95 +gw8599 +gw9701 +gwadmin +gwaellet +gwahooy +gwar3d +gwar9802 +gwata +gwb666 +gwbedu +gwbush04 +gweed0 +gweir1 +gwen +gwen frangcon +gwen14 +gwen8575 +gwendolen +gwendolyn +gwendolyn +gwenn +gweo0 +gwh28dgc +gwiazdka1 +gwidarn +gwille12 +gwm546ti +gwm8320 +gwmighty +gwp0311 +gwpowa +gws2006 +gwtechit +gwwc7w7 +gwym8amm +gwyneth +gwynian +gwyrdd3 +gx72gn63 +gxa2gO +gxbei +gxcj4z +gxe7v +gxfc0025 +gxfc0703 +gxg623 +gxjine7703 +gxjvq +gxm69429 +gxoxi +gxt4mhp +gxtlk +gyBounce +gyaaikon +gyburani +gyekvp +gygy123c +gyiiabpl +gyl9gyl +gyles +gym357 +gymnastik01 +gymnasts +gymraeg3 +gynecologist +gyntars +gyo36 +gyoergy +gyorgy +gypsey +gypsi01 +gypsy rose +gyr56xxk +gyrostime +gyrzf5tp +gyt123 +gytrsty +gyula +gyuri +gyuv7e1w +gyy8vl +gyzcglc +gz957435 +gzdz4g2f +gzemzem +gzer01 +gzewg +gzfn5 +gzhuce +gziog159 +gzjpevli +gznfxjr +gzodg +gzp0w3r +gzpu3 +gzt37826 +h +h00780078 +h00ps1 +h00ptie +h00r3n +h00sier +h01o0fih +h03kwins +h0914310 +h0H0ho +h0bb3s +h0cster +h0ffm4nn +h0ldens +h0ll0w +h0ly +h0m3c4r6 +h0m3l355 +h0m3r0n3 +h0m3r75 +h0me4all +h0n07u7u +h0n3y13b +h0nderd +h0no +h0norux +h0nqif +h0pe1835 +h0r5fa11 +h0r98x +h0rikawa +h0rnbl0w +h0rnet +h0st1l3 +h0t41f +h0ts99ts +h0undd0gz +h0undoom +h0y1729 +h1228976 +h123456 +h1234560 +h12aXr +h13j6j7 +h1593574 +h1605h +h16734 +h1e2i3a4 +h1er0glyph +h1ghl0w +h1ghw1nd +h1h1h1 +h1ile +h1iu7 +h1l4ry +h1ldegard +h1pplz +h1qy112 +h1ttekat +h1udt +h1vzh2sr +h1xt9u +h201057h +h2031511 +h206cmjh +h210952c +h22 +h2210s +h223j +h2514300 +h25hecra +h260g +h2685k +h28ouo +h2945 +h29ytf5y +h2b1w7 +h2b4c6d8 +h2cor7b +h2edc8rv +h2fmvxv4 +h2g5jsw +h2h2003 +h2j3k4l5 +h2oco2 +h2pbso4 +h2so4123 +h2terrade +h2uus +h2w2c2a2 +h2znl +h3011g +h316h316 +h31820 +h3434768 +h35khz +h3959050 +h3ad5h0t +h3ll0! +h3ll0123 +h3lli0n +h3llid4 +h3llo +h3llw0rm +h3lly34h +h3lping +h3mc4kl +h3p1a8 +h3r01x +h3r035 +h3r3am1 +h3r4d +h3rbb +h3rc2l3s +h3ritag3. +h3rold +h3s10 +h3s3huk3 +h3s3n +h3xwsth4 +h3y3nfug +h4362626 +h437 +h44k0n +h45naou7 +h46ad0n3 +h4ck3d +h4ck3d5 +h4ck3r +h4ck3r1s +h4ck3r5 +h4cked +h4cky0u +h4e8riew +h4h4l0l +h4kb4fd +h4l012 +h4ll03l3 +h4m1l70n +h4nd +h4nswurs7 +h4rfm +h4rnrlpl +h4ttghz7 +h4wn0 +h4x03d +h4x0d +h4x0r +h4x0rk4 +h4x34 +h4x3d +h4xs12 +h4yl0o +h4ysin +h500210 +h508517 +h59911 +h5bolf +h5epo +h5ip6g +h5k6l8 +h5n1 +h5n19212 +h5n1mac +h5spzs +h5vegy6k +h5yut +h63m81 +h686q6g3 +h68ahj +h6afiepl +h6ikaonx +h6thg8 +h6ztazpc +h725 +h739h +h75047 +h75erhqk +h773maak +h7929355 +h797 +h7a8h7a8 +h7gl9m +h7guy +h7ifabe9 +h7lna +h7ml7vww +h7volm2l +h7w5m5uj +h8000hc +h8123456 +h82f91c +h83ds4r2 +h859142 +h870881 +h8777482 +h87bg +h888888 +h8a3xt74 +h8meownd +h8ucv +h8vi1vig +h906v +h912exe +h95101 +h953f +h96dd +h96ddd +h9901969 +h9e8l4p0 +h9fri +h9gwv +h9h6t29u +h9yyhzrj +h9zggqj +hADI54 +hAx0Rz +hEauA +hEro01 +hId5Tb +hOmmie +hS123 +ha +ha gashash ha +ha myoung +ha11berg +ha12345 +ha1j5 +ha24cmas +ha318318 +ha3elma7 +ha487 +ha4uv1 +ha728284 +haLLOween +haZed +haareziehen +haarhuis +haarlem +haarstapel +haas23 +haasen146 +haaz9 +haazzi +habach +habakuk +habana91 +habanos +habbemann +habbili +habbo1 +habeba +habeins +haben +habennn +habib +habibe +habibiya +habisch +habjames +habkeins +haboktor +habrebdc +habreloh +habs1971 +habs99 +habu1 +habusaki +habworld +hacc155 +hace5573 +hace5577 +hach +hachde +hache +hachew +hachez23 +hachikyu +haci1453 +haci84 +hack +hack05s +hack123 +hack3d +hack3r +hack4you +hack55 +hack666 +hack8331 +hacka?! +hackadmn +hackbase +hackbedo +hackea2 +hacked +hacked1 +hacked11 +hacked12 +hacked2 +hacked25 +hacked34 +hackedhacked +hackedu +hackena +hacker +hacker +hacker00 +hacker09 +hacker1 +hacker135$$ +hacker18 +hacker255 +hacker68 +hacker89 +hackercx +hackerdz +hackerer +hackerhacker +hackers +hackers9 +hackersa +hackervn +hackerwo +hackerx +hackerz +hackgore +hackhour +hacking +hacking1 +hackinga +hackit +hackiut +hackld +hackman2009 +hackman6 +hackmase +hackme +hackmy +hackone +hacks481 +hacksat +hacksite +hackthis +hackx1 +hackyong +haco14 +hacuba +had1970 +had20x +hadda +haddon +hadedene +hadehade +haderach +hades +hades139 +hadesman +hadesqwe +hadi +hadi689 +hadiabi +hadiboss +hadihf +hadilan +hadilen +hadisv1 +haditech +hadja13 +hadjer +hadley +hadugga +hadysova +hae +haeckert +haegar. +haeger1976 +haeschen +hafel9 +hafen23 +hafermarkt +haferschleim83 +hafez8816 +haffner1m +hafide +hafiz +hafsaa +hagal678 +hagbard +hagen +hagenatw +hagenstr +hagge76 +haggis +hagkonin +hagula +hah0 +haha +haha110 +haha123 +haha1987 +haha79 +haha89 +haha898 +hahablah +hahah +hahaha +hahaha99 +hahahaha +hahahahaha +hahahahahahaha +hahaorly +hahe69er +hahe98 +hahejin3 +hahiv +hahnaldo +hahuhahu +hai1911 +hai2u +haiao +haibara +haidee +haider +haie2000 +haifisch69 +haiham +haihoa +haijun +haikenna +hail2008 +hailbrigade +hailee +hailee1 +haileris +haileymaude +hailin1106 +haillee +hailong +haily1212 +haim +haim5162 +haimsuss +hainer +haineto +haing +haipasta +hairyfrog +hairytree +haise2315 +haisu11 +haisuli +haitest1 +haitham5 +haiti07 +haivnn +haivri +haivuong +haixin +haj380g +hajmola +hajnal +hajo +hajstone +hajtos88 +hakafule +hakala04 +hakamaru +hakan +hakan +hakan21 +hakanhakan +hakanhus +hakann +hakbani +haked123 +hakentec +haker +haker21 +haker3003 +haker99 +hakerit +hakers +hakhak +haki1310 +hakim1 +hakimos +hakin9 +hakkai +hakkancs +hakke +hakkerke +hakomop +hakoosal +hakslk +hakstege +haku +hakumsun +hakz1 +hal +hal boyle +hal kemp +hal talia +hal0942 +hal099 +hal10 +hal1cola +hal2 +hal9000 +hal95842 +hala1995 +halabuda +halalan +halama +halara13 +halaria +halbarad +halbertino +haldar01 +haldir +hale +haledin1 +halen2008 +halenjones +haley0220 +half-life +half8803 +halflife +halflife2 +halflife3 +halfman27 +halfpint +halfpipe +halfware +hali +halid12 +halife +haliho +halil +halil75 +halilgs +halina +halkida +hall +hall johnson +hall66 +hallabaloo +hallam +halland92 +halle007 +halle890 +halleluia +hallet +hallet64 +halli +halli0977 +hallie +hallie24 +hallihalli +halliwell +halllo +hallo +hallo004 +hallo090 +hallo1 +hallo112 +hallo12 +hallo123 +hallo1582 +hallo1965 +hallo20 +hallo213 +hallo2201 +hallo234 +hallo32 +hallo6654 +hallo846 +hallo93 +hallo99 +halloaa +halloaap +hallobtr +hallocap +hallodu +hallodufisch +hallohallo +hallohi +halloich +hallol +hallomax +hallon110 +halloo12 +halloogame +halloppp +hallos +hallose +hallouas +halloula +hallowlh +hallowx1 +hallowz0 +hallozoc +hallroot +halls6921 +hallvar +hallydms +halmstad10 +halo +halo02 +halo123 +halo1234 +halo1818 +halo1991 +halo1et2 +halo2 +halo2003 +halo2bmb +halo3 +halo55 +halo7319 +halo9769 +haloftw +halogen8 +haloman +halong +haloomyv +haloone +haloween +halperin +halsab +halsid330 +haltik15 +haluk +halvar +halvbror93 +ham +ham gi +ham38mir +ham3ter +hamabasi +hamacc +hamad147 +hamada16 +hamada75 +hamadryas01 +haman100 +hamanaam +hamau203 +hamazz +hamburg +hamburg 1887 +hamburger1 +hamburgers +hamburgonline +hamburgsfinest +hamc96 +hamdan1476 +hamdo132 +hamdounia +hamedhamed +hamers +hamia4ka +hamibcr +hamid +hamid +hamidht +hamidon +hamilma +hamilton +hamilton +hamilton430 +hamiro +hamlet +hammadg +hamman122 +hamman2 +hammarby4 +hammarlund1 +hammarstrom11 +hammel +hammer +hammer16 +hammer7 +hammerfall$1 +hammerfall3 +hammerson +hammett +hammock69 +hammou +hammouda +hammy007 +hamoda29 +hamon0402 +hamosha +hamppu12 +hamptaro +hampton +hampton50 +hamptonhigh +hamsi +hamster +hamster2 +hamsterdam +hamsterfutter +hamsteri2 +hamuda +hamulll +hamurabi +hamza +hamza3009 +hamzaoner +han +han +han se +han so +han1f1 +han9074 +hana +hana1807 +hanaku +hanan +hanan +hanayome1 +hanazono +hancha12 +hand007 +hand19 +hand1ball +hand631 +handball +handbike +handcu44 +hande91 +handehande +handgun357 +handley +handoi12 +handstand135 +handtowel8 +handwash1 +handy1 +handy88 +hanella +hanepa82 +hanfman +hang23 +hanghohn +hanghuhn +hangman +hangmann +hangya27 +hanhiu +hanhjoon +hani1565 +hani5100 +hania666 +haniball +hanieks +hanifa +haninelias +hanjo +hanjo2252 +hanjorg +hanjyung +hank +hank123 +hanke +hankhanh +hankook +hankuk +hanlon86 +hanmic +hann +hanna +hanna1 +hannah +hannah1 +hannah54 +hannah618 +hannah927 +hannahj +hannalei +hannalore +hannamaria +hannan3176 +hannan89 +hanne +hannelor +hannelore +hannelore +hannerl +hannes +hannes +hannes1 +hannes2503 +hannes99 +hannfie +hanni +hannibal +hannibal1 +hannimaus +hannita +hanno +hanno2306 +hanno338 +hannoi +hannoo +hannover +hanns +hanns leo +hanny +hanoi +hanoi123 +hanouna +hanover +hans +hans +hans adalbert +hans carl +hans christian +hans ernst +hans guenther +hans heinz +hans michael +hans otto +hans schott +hans-christian +hans-peter +hans0123 +hans11 +hans134 +hans1955 +hans23 +hans3011 +hans3333 +hans7725 +hansa +hansan3688 +hansblond +hansel +hanselmann57 +hansen0094 +hansen13 +hansen2505 +hanser123 +hansford +hanshans +hanshoek +hansi +hansi +hansjoerg +hansol +hansol04 +hansol05 +hansol99 +hansolo +hansolo101 +hansome +hansp +hanspfeiffer +hansu1993 +hansvdp +hanswurst +hanswurst1 +hansy2424 +hantelis +hanueli +hanusa +hanusic1 +hanw19 +hanweb +hanwei789 +hanyou +hanzade +hao6oa09 +hao85j +haoxiang +haoxx888 +haphazad +hapiness +hapkido +hapoel +hapoelpt +happi2801 +happosai +happy +happy03 +happy11 +happy1562 +happy163 +happy24 +happy717 +happy8 +happy88 +happy99 +happy999 +happybeads +happyday +happydays +happye2003 +happyhil +happyp +happypig +happysad +happyy123 +hapstar +hapuu1 +har0ld13 +har1r1 +hara6513 +haragei76 +harakiri +harakiri21 +haraktar +haralambie +harald +harald2476 +harald654 +harameee +haramia +harannig +harasek +harcourt +hard13 +hard1701 +hard2374 +hardbody1 +hardcore +hardcored +harddisk72 +hardee +harder +hardhore43 +hardi321 +hardick0805 +hardick2112 +hardie +hardkor1 +hardmode +hardrock +hardtek84 +hardtrance +hardware +hardwarp +hardy +hardy +hardy3280 +hardys +harfoot +harger +hari +hari +haribo +haribo0011 +haribo1 +harika12 +harikli +haring12 +hariprasad +haris +harish20 +hariskov +haritha1 +hark +harketab +harlan +harlech +harlemglob +harlemic +harlequin54 +harley +harley +harley0709 +harley17 +harley93 +harleyd +harlov +harm88a +harmank +harmnone +harmony +harmony101 +harmsx3 +harmuth1 +harnani +harno +haro2412 +harocesh +harold +haroon +harper +harpo +harras1938 +harras99 +harribo +harrier1 +harriet +harriett +harriette +harrine +harris +harrison +harrison +harro +harry +harry +harry dean +harry duke +harry walker +harry1 +harry1328 +harry2323 +harry33 +harry9222 +harrykrok +harryp3 +harrys +harsh +harshadmin +harst +hart +hart leroy +hart1989 +harthouse +hartk11 +hartley +hartlow +hartmann3012 +hartmut +hartmut06 +hartnett10 +hartola +hartwall5 +hartwell +haruhi777 +haruhiko +haruka76 +haruko +haruko4742 +harumi +harun +haruyoki +harve +harvel +harvey +harvey1# +harvis +harwia +hary01bo +harzhexe +has02 +has59ili +has63sem +has8a2na +hasady +hasan +hasanat +hasanaydin +hasanh +hasatan +hasbe +hasburger +hasdo4 +hase +hase0170 +hase08 +hase17 +hase2 +hase89 +hase99 +hasefurz +haselk87 +haselko +haseloewe +hasemalen +hasemaus +hasenloeffel +hasewurm +hash +hash2 +hash234 +hashes +hashizo +hashpipe +hashstring +hasi +hasi11 +hasimaus +hasiok +haskell +haskell +haskell28 +haskina +haskul +hasl0123 +haslamc3 +hasllo6 +haslo +haslo007 +haslo1 +haslo123 +haslo13 +haslo15 +haslo231 +haslohaslo +hasmertz +haso1888 +hasoo0 +hasret +hass31 +hassah +hassamog +hassan +hassana1 +hassard +hasse +hassel03 +hassen! +hasso17 +hasso7688 +hasso82 +hassyr +hastalavista +hastings +hasxyz +hat +hatamig1 +hatamy +hatavy +hatchie +hatchjii +hate +hate666 +hateball +hatehate +hatelove +hateme01 +hater446 +hater973 +hateu11 +hatevt +hatework +hathcock93 +hathor25 +hatice +hatice1 +hatikwah +hatingforyou +hatman09 +hatnep +hatred0495 +hatsche +hatschi +hatschie +hattasa0 +hatte +hatte666 +hattie +hattrick +hatzis9410 +hau +hauaha +hauber22 +haubitz26 +haufman +hauge29 +haugehauge1 +hauke1965 +haukenfrers +haunted +haunted09 +hauntedh +haunui +hauptsignal +haurnio +haus123 +haus133 +haus99 +hausboot +hausdrop +hauskatze +hausmeister +hausplan +haustier111 +haustor +hautscho +havana +havanna12 +havefun +haveit09 +havejoy +haven911 +havencat +haverly2 +havet926 +haviland +havino +havoc0214 +havock +havok +havok13 +havva0397 +hawaiana +hawaii +hawaiian +hawarriors +hawaya +hawazin +hawira +hawisch1 +hawk +hawk111 +hawk420 +hawk52 +hawk666 +hawk7341 +hawke412 +hawkeyes +hawkgt +hawkins09 +hawks +hawks000 +hawree +hawtpn6 +hawv7 +haww4e +hax +hax0r +hax0r123 +hax0red +hax0rz +hax7xpeb +haxa321 +haxed +haxen007 +haxes +haxhax +haxixa +haxme01 +haxn00b +haxor +haxor666 +haxx +haxx0r +haxx113 +haxzopil +hay +hay054 +hay97qac +haya +hayabusa +hayabusa20 +hayabusa507 +hayal +hayatim +haydar +haydee +hayden +haydenl9w +haydn +hayef222 +hayes300 +haykhft +haykirma +haylee123 +hayley +hayleyprice +hayrani +hayric +hayriye +haysence +hayslut +haytchy +haytinet +haywire8 +hayyan +hayzise +haza96 +hazard +hazard21 +hazard77 +haze444 +hazel +hazen +hazerules +hazhaz +hazim123 +hazim84 +haziran +hazkapus +hazmat95 +hb012748 +hb0811 +hb102883 +hb2157 +hb271255 +hb4pq2 +hbabe2 +hbagr +hbalta +hbb372 +hbb3729 +hbbear +hbcsemur +hbea0001 +hbeck2399 +hbf72 +hbglic2 +hbh450q +hbhyeo46 +hbikals +hbilly +hbiuu +hbjz8182 +hbll +hblock10 +hblqa +hblyrl +hbnjalil +hbpr789 +hbquick +hbrismf5 +hbshbshs +hbsucks +hbtred +hbzqy +hc082198 +hc4444 +hc4yn67z +hc5ie4 +hc5umlv0 +hc72et +hcds1628 +hcdy9ia3 +hce3ki6l +hcfggy +hci5329 +hcjvv +hcliuhh +hclso4 +hcncon1 +hcpc1234 +hcqf0 +hcraiding +hcs2005 +hcs20517 +hctbqqg +hcte38 +hcterts +hd131421 +hd187123 +hd1962nb +hd1qr +hd5a2d6 +hd80117 +hd868185 +hda456 +hdaantje +hdb1171 +hdbrjunb +hdchb9uz +hddm13 +hddpower +hddude +hdgdll +hdggdl +hdhmj9p +hdl275 +hdlhdl +hdlll +hdls28 +hdpanhead +hdr4ever +hdt6624 +hdtogo +hduq83 +hdvev +he020876 +he0310jd +he1l1g80 +he1pdesk +he2venly +he3bie +he46w8u3 +he57cfjr +he5lo +he5xek +he5z8 +he6gpk +he6hh3 +he78975 +he7zu48f +he8il +he9mpt +heXe99 +head +headass +headbang +headbanger69 +headbone +headhead +headkes +headlight1 +headmaster +headphones21 +headsale +headset321 +headshot +headshot1983 +heakyung +healing +health +healthcare +heapsporno +hearing23 +heart +heart000 +heartace +heast +heat +heat991 +heataj +heath +heather +heather +heather mac +heather1 +heatherp00 +heathor30 +heatwave +heaveho412 +heaven +heaven2716 +heaven2915 +heavy99 +heavydz +heb81bin +hebaf1 +hebele +hebelek +hebelhirsch +hebesmex +hebi92 +hebny +hebron97 +hec12345 +hecaixia +hecate +heccfr +hecho1 +hechttxt +heck123 +heck222 +heckel123 +heckfy +heckler +heckler127 +hectik +hector +hector +hecv4mwt +hedda +hedfejeh +hedgeh0g +hedi +hedi979 +hedisedi +hedley +hedrick +hedwig +hedwig +hedwiga +hedy +heeda123 +heerauz +heerde1 +heervein +heeswijk +hef104 +hef134 +hefaz2 +hegecs +hegrkaal +hehe +hehe0101 +heheHe +hehehe +hehehe34 +heheman +hehenihao +hehihi62 +hehxulij +hehzor +hei +hei600 +heide +heideger +heidelberg76 +heidelinde +heidern +heidi +heidi +heidiann17 +heidine +heidrun +heidrune +heievwaj +heihei +heike +heike17 +heike3864 +heikelchen +heikki1212 +heiko +heil +heilig65 +heilige1 +heilpsx +heim1208 +heina +heine +heineken +heiner +heiner +heinie +heinisch +heinpitt +heinrich +heinrich +heinrich07 +heinz +heinz +heinz dieter +heinz01 +heinz1927 +heinze +heinzi +heinzikoko +heinzunger1 +heinzz +heirofex +heisann +heiseliu +hej +hej +hej123 +hej135 +heja1 +heja55 +hejaan +hejadept +hejar +hejcp +hejhej +hejhej2k +hejhej77 +hejiko +hejing +hejj +hejjxv +hejjxv10 +hejsa1225 +hejsan +hejsan1 +hejsan2 +hejsan2! +hejsan502 +hejvaf12 +hekajek +hekate86 +hekeriux +hekko +hektik +hel +hel!mark +hel1ac +hela79 +heladox +helahela +helaine1 +helang00 +helbert1 +helder +hele5na +heleen +helen +helen day +helen jerome +helen koford +helen lee +helen1337 +helen22 +helen49 +helen5325 +helena +helena +helena bonham +helene +helene +helene1787 +helene314 +helenehermine +helenewagner +helenp +helfer50 +helfond +helga +helga1966 +helga2112 +helga47 +helga5 +helgakelp +helge +helge61 +helgered +helgufac +heli +heli1414 +heliamerika +helicopter +helides567 +helimoser +helin +helioss +heliotrope88 +helipad462 +helistin +helium +heliumstimme +helivan +helix07 +helixcode +helixking +hell +hell1 +hell4311 +hell666 +hella +hellas +hellas1 +hellas30 +hellbender +hellblom +hellboy +hellboy16 +hellboy92 +hellcat1! +helldick +helle merete +helle1966 +hellfire +hellfire132 +hellfiremike +hellhack +hellkill +hellmann01 +hellmuth +hellno +hello +hello +hello there +hello world +hello! +hello01 +hello1 +hello108 +hello12 +hello123 +hello13 +hello132 +hello199 +hello2287 +hello25 +hello2u +hello5366 +hello98 +helloboy +hellog +hellogof +helloh1 +hellohello +helloi +hellojpn +hellola +hellome +helloo +hellothere +hellou +hellousc +hellow3 +helloworld +hellrais +hellraiser +hellraser22 +hellrox +hellsdoor +hellsing +helltown +hellwood +hellxoft +hellyeah121212 +helm01 +helm57 +helma +helmers +helmo +helmug +helmut +helmut +helmut28 +helmutg +helmuth +helmuthelli +helmuthorn +helo +helo21 +helorme +helother +help +help123 +help4me +help4you +helpdesk +helpme +helpme +helpme28 +helraisr +helspites +helvete +helvete11 +helvetia +helvetik +helyhely +helyn eby +hem1hh77 +heman999 +hemati +hemi318 +hemi4561 +hemiola +hemligt02 +hemligt3810 +hemlock +hemlock15 +hemmelig002 +hemmingo +hemmis123 +hemp99 +hems05 +hemsida +hemsom +hemssvz +hemstr +hemta +hen +henbr +henchen +hencse +henderson +henderson1991 +hendo1 +hendra +hendricks2006 +hendrik +hendrik +hendrix +hendrix017 +hendrix2 +hendrix3 +hendrixj +hendro +hendy1970 +hene +henen +henhas +heni13 +henigm4 +henigma4 +henk +henk3857 +henk50 +henkbmw +henke +henkhenk +henkie +henne +henne1 +henne147 +henne258 +henner1231 +hennie +henning +henning +henning13 +hennry87 +henny +henny +henny82 +henri +henri +henri-jacques +henri3tte +henrietta +henriette +henrik +henrik +henrik1099 +henrik20 +henriksen1984 +henriwiese +henry +henry +henry110 +henry14 +henry18 +henry3518 +henry628 +henry7 +henryk +hensem3 +henshin +hensman1 +hensy +hentai +hentai01 +hentai1 +hentai4321 +heofores +heolo1 +hep93811 +hepeke +hepemefe +heplino +hepth +hepuh +her1573 +heradmin +herakles +herakles2010 +herald +herat18 +herb +herba55 +herbal1fe +herbals +herbart +herbbust +herbert +herbert +herbert cowboy +herbert new +herbert rim +herbert-arthur +herbie +herbie227 +herbie2549 +herbou62 +herbs101 +herbst +herbst04 +herbst7 +herbz1 +hercules +hercules0 +herculesyuri +herder6266 +herdnerd +heredia +hereigo +hereniel +hererjeg +heresy +heretic +herewego +herholz +hering2009 +heritage1340 +heriway +herjac +herkul +herkul87 +herkules +herlinde +herman +herman +herman12 +hermann +hermann +hermano +hermantown +hermekul +hermelin12 +hermes +hermesetas7 +hermida +hermila +hermine +herminia +hermione +hermione +hermioni +hernan +hernandez +hernime +herning6 +hernvall4512 +hero123 +hero1339 +hero1907 +hero1963 +hero52 +hero57 +hero789 +hero9999 +heroaze +heroes +heroes03 +heroes47 +heroin +heroin420 +heroina +heroine +heroine12 +herold11 +heroo +heros2453 +herosheros +herpes2107 +herrant +herrara +herrbauer +herren2 +herrera12 +herrpeter +herruzo +herschel +hershel +hershey +herson +herst +herta +hertasarah +hertha +hertha +herti +hertie +hertle +herums +herve +herz7037 +herzblut +herzchen1 +hes +hesagod +heshiu +hesl00 +heslo +heslo114 +heslo12 +heslo123 +hesmond +hesnes02 +hesoyam +hesreal +hessemail +hessenwalter +hessians +hest +hest5124 +heste +hester +hesterchic +hetman1 +hetman2 +hettelai +hetti01 +hetty +hettypee +heuTe40 +heulen1 +heumesmo +heumeu +heuschrecke123 +heute +heute! +heutenix +heve ssert +hevi14 +hewal5im +hewielarsen +hex +hex151 +hex404 +hexa2242 +hexadecimal +hexaglot01 +hexagr4m +hexbaby +hexe +hexe1506 +hexe65 +hexenwald +hexer1965 +hexerei97 +hexfilog +hexhex +hexinv23 +hexmen +hexwanted +hey +hey young +hey9454 +heyadmin +heyang +heydamar +heydd +heyfaget +heyfaret +heyhey +heyhey1 +heyho +heyhoi +heyjoe +heylin1996 +heymama +heyromy +heytse +heywood +heywood hale +heyy +heyya +heyyoyo +heyznl +hezil1 +hf,jnfcfqn +hf2003 +hf2aktjy +hf7118 +hfajc +hfba +hfbaiwdl +hfbla +hfdur784 +hff3 +hfgdkl +hfhfh +hfho6 +hfjihg +hfjshl +hfml0 +hfmonkey +hfnvt +hfspinos +hfu1j +hfvhidl +hfzxcv1 +hg100709 +hg1337 +hg225295 +hg4er +hg7nfd +hg8731 +hg917917 +hgFill +hgah7q +hgatzen +hgavhvd +hgb1f0sz +hgblva +hgd7843 +hge6kl +hgg3284 +hghgjojo +hgk3cv +hgo455 +hgo82l +hgohgr +hgprpr +hgq1989 +hgrhqq2 +hgsd5500 +hgsgld +hgsvix3e +hgulhdvm +hgw5j +hgwzgp +hgyjkl +hgyvhl +hh +hh031283 +hh220165 +hh262826 +hh2milnb +hh31513 +hh4x0r +hh585290 +hh66hh66 +hhan937 +hhas07 +hhb48 +hhdd43m +hhdw7264 +hhf111 +hhgzfrt1 +hhh +hhh316 +hhhb4 +hhhhh1 +hhhhhh +hhhpimp +hhhsmh +hhjwnprt +hhk8hhk8 +hhkoh +hhksz +hhlolhh +hhm0vuva +hhm5jtjy +hhmhhh +hhpass +hhpp55 +hhqdr +hhr01hhr +hhs2588 +hhssmm88 +hhtosooo +hhuvq +hhvhd7w +hhvseb33 +hhwsad +hhx23k8t +hhxx2739 +hhzhang +hhzho +hhzzttgg +hi +hi ra +hi007 +hi11t0p +hi1hi1 +hi8mtnl0 +hi8q1l +hi9017 +hi97br +hi97cv1b +hi9vj +hia2007 +hiahana +hiall +hiariia +hiashi +hibbity +hibernia +hibiskus +hibiskus69 +hibo27 +hibob +hibrid456 +hicazkar +hiccitim +hichiker +hichiro +hickey +hickory82 +hickory88 +hickssmith +hidde1998 +hidden +hiddengoldmine +hide2fuk +hideandseek0 +hidecora +hidego +hideko +hideo +hideseek +hideto +hidexj +hideyo +hidi12345 +hidrocanal +hiedtj1 +hield123 +hielke +hien +hien1hien +hierarchic +hiersigk +hiesel +hieudung +hieuthao +hiexoez4 +hifebkp +hifk1897 +hifmizez +hifnecaz +hifonics +higabby +higgler +higgs202 +high2top +high4020 +high55 +highbike +highfisch +highgfx +highland +highlife +highlight89 +highlord +highmoon +highnote +highroller +highscho +highstinger +hightide +hightower +highvoltage1 +highway +highwind +higina99 +higinia* +hignut08 +higor +hihello +hihi +hihihi +hihkshhe +hiiah +hiihtope +hiii +hijesse +hijoao +hijoputa +hijskraan +hijvouj5 +hikamilo +hikari!2 +hikari59 +hiker44 +hikmet +hikmet1986 +hikoka +hilaria +hilarie +hilariopedro +hilary +hilary +hilaryss +hilda +hilda campbell +hilda$ +hilde +hildebrand123 +hildegard +hildegard +hildegarde +hildeken +hildele +hildesheim +hildie0113 +hilding +hildy +hiledgarde +hileute +hilfee +hilhop98 +hili68 +hiljanen +hill1234 +hillary +hillbill23 +hille +hillegom79 +hiller0451 +hillfields76 +hilli +hillibilly +hilloo +hillside +hilly +hilma2003 +hilmar +hilmi +hilo +hilos +hiltihilti +hilton +hilton +hiltonf +hilversum19 +hilw6 +him3259 +him876 +himaggie +himaster +himatt +himbeere1951 +himelick666 +himes1234 +himirt +himmel +himmler +himradj +hinde523 +hindilernen +hindle +hinega +hines1 +hiney! +hingis1 +hinhdan +hintswen +hios1060 +hip2000 +hipari +hipera79 +hiphop +hiphop12 +hiphop13 +hiphop88 +hiplove +hippi0 +hippi1098 +hippie33 +hippies22 +hippili +hippo +hippo10 +hippo2 +hippocampus +hippos +hiprap +hiprap66 +hipuvp +hiqrp +hiqyoviy +hir863 +hira +hirad +hiram +hirama +hirasaka +hirek01 +hirnlego +hiro +hiroki +hiromela +hiromi +hiromitsu +hiroshi +hiroyuki +hirsch +hirtajct +hiru0000 +hirule +hirvi4hirvi +hiryan +hirzau4 +his4irma +hisako +hisao +hisarweb +hisashi +hisashi +hisaya +hisham +hislight +hisman70 +hisoshi +hispanec +hispanica4 +hispasec +histeria3 +histeria666 +historia8 +history +history121 +hisword +hiszpan +hiszpania +hit4ewer +hitachi +hitachi94 +hitary +hitchhiker +hitchiri +hitcode +hitdhitd +hithere! +hitler +hitler244 +hitler88 +hitlerok +hitman +hitman14 +hitmanmonkey +hitmemore +hitomi +hitoshi +hitriton +hitstalin +hitsuri +hittehitte +hiver05 +hiwahiwa +hiy0f +hiya22 +hiyall +hiyass +hj171290 +hj1979 +hj418481 +hj5C3P +hj7899 +hjSopsop +hjalmar92 +hjdf745hg64 +hjem861 +hjg118 +hjgs2792 +hjjinhua +hjk21045 +hjkhjk +hjkhlui0 +hjkiu45d +hjmcSB +hjmm22 +hjn522 +hjnkwfjs +hjw5v +hjwew +hjxf1012 +hjyen +hjza8 +hk030585 +hk1707 +hk250477 +hk7215 +hk78ik +hk92al47 +hkaaunsh +hkd5a +hkdbbi +hkdgkldhfgdf +hkghgh +hkimh +hking91 +hkjm7822 +hklvv +hkmnkiod +hksskhk +hkver123 +hkvino +hkwxf341 +hkxvgyir +hkyadmin +hkynysk2 +hl15ef +hl2 +hl2d3fc +hl2jklm +hl4d0vk4 +hl890221 +hlavica +hlb1o +hledat182 +hlg7502 +hlgotye +hlin1 +hlj44 +hlokhiho +hlr9i +hm2d3n +hm32kjlp +hm3369 +hm6369 +hm6616 +hm8rni6r +hmZ1dd +hmaade +hmansour +hmar06 +hmc2293 +hmd00000 +hmeccaa +hmhmhm +hmi2507 +hmkfuee +hmkloeh9 +hml11396 +hmlan123 +hmmhmm +hmmka +hmmopla +hmoney11 +hmpf121 +hmschool +hmsmugg +hmta05 +hmuoyj +hmus69 +hmusn +hmx414 +hmx6o +hmxzjxzj +hn33po27 +hn4rbuwx +hn5ae1mj +hnI7gt +hnb7asd +hnc483 +hncsjvip +hndrs577 +hndz8379 +hnftw +hnh2004 +hnhaxxit +hnhgh +hnjatwxf +hnjpjden +hnlnbn +hnlymym +hnm912 +hnmsagw +hnpeje65 +hnpre +hns475 +hntwckzg +hnuieseo +hnusta +hnz9hn +ho +ho00nk1 +ho14 +ho145x +ho511920 +ho6soup +ho6wi +ho7vczuu +ho8rde +ho9841 +hoagcaddy +hoagy +hoaianh +hoaitam +hoang vinh +hoangtu +hoangyen +hoaquynh +hoax6456 +hobard +hobart +hobart1980 +hobb +hobber12 +hobbes +hobbes92 +hobbit +hobbit12 +hobbit14 +hobbit440 +hobbit65 +hobbit70 +hobbits +hobbnix +hobbs15 +hobbyrap +hobel123 +hobert +hobie +hobo +hobo2006 +hobo8390 +hoboj25 +hobojim +hobokan1 +hobolz +hobzon +hochack +hochhaus +hochmut6 +hockey +hockey1 +hockey168 +hockey24 +hockey75 +hockey8177 +hockey82 +hockeybk +hockeynut9 +hocky27 +hocracex +hocsucks +hocunecu +hoda1818 +hodenkop +hodge123 +hoei +hoekstra +hoel +hoemo +hoepli +hoersturz +hoertje4 +hoetmer +hof33nod +hoff1994 +hoffer12 +hoffnung +hofis +hog1672 +hog351 +hogan +hogata +hogday +hogdog87 +hogefuga +hogehoge +hogtown11 +hogwarts +hoh5cby7 +hohesc40 +hohnusep +hohoho +hohoho07 +hohol +hohue +hoi +hoi774 +hoiching +hoihoi +hoilul +hojnacke42 +hoju3456 +hojzofah +hok1qw +hok58faf +hoke +hokuto +hokuto2 +hokxan9 +hoky3318 +hokyugag +hol95ger +hola +hola00 +hola01 +hola2 +hola24 +hola33 +hola5 +holaaa01 +holaaaa +holache +holadraco +holahola123 +holawest +holbrook +holda9 +holdem17 +holden +holdrio +holein1 +holfosay +holger +holger +holger17 +holger231 +holger79 +holgi1 +holiday1 +holk1992 +holka +holla +holland +holland +holland8266 +holler +hollger +hollis +holliste85 +hollow +hollowman +holly +holly +holly10 +holly123 +holly1989 +holly812 +hollyjoy3 +hollylisle +hollypie +hollys +hollywood +holmes +holmes +holo123 +holo22 +holode +holodeck01 +holoholo17 +holstein +holsten1879 +holstermann +holt497x +holter +holunder +holybolox +holycrap +holyfuck +holygoalie +holyhead +holykake +holylale +holylord +holym77 +holynoob +holyrose +holysh1t +holzente +holzsack +holzwurm82 +holzzopf +hombergen +hombre00 +home +home123 +home1919 +home89 +homeboy +homeboy1 +homedry4 +homeff +homepage +homer +homer +homer1 +homer123 +homer2247 +homerjay +homers88 +homersex +homeschool2009 +homesick1 +homeslice +homewise5 +homework1 +homeworld +homeworlds +homi523 +homies1 +homit1 +hommada +hommi007 +homo +homo3465 +homogong +homolui +homomikko +homosacer +homsxa +hon1248 +honda +honda05 +honda125 +honda185 +honda3 +hondaa423 +hondacb +hondacivic91 +hondacrx +hondansx +hondatrx +hondax +hondazz +honderd +hondje +hondjuh +honey +honey +honey1 +honey1229 +honey123 +honey2010 +honey25 +honey310 +honey420 +honey989 +honeydawg +honeyko +honeysuckle123 +hong +hongbao +hongfei88 +hongkong +hongkongbye +hongkun +honie25 +honing +honki4u +honkmania +honky123 +honkytonky +honneur +honor +honor44 +honor4me +honorable +honorata17 +honore +honu +honza +honza47 +honza5554 +hoo73ver +hooba +hoobas +hooblah +hood123 +hooden54 +hoohaole +hook +hookahey +hookem5476 +hooker +hooker66 +hooker82 +hookers +hookie +hookman7 +hookoo2k +hooli12 +hoolie +hoolihan +hools1 +hoonara +hooopp +hoop0e +hoop4667 +hooper +hoorayhooray +hoosier hot +hoosiers12 +hoot +hooter1252 +hooter420 +hooters69 +hoover5 +hooya945 +hooyhooy +hop310 +hope +hope622 +hopefear +hopeful6 +hopela +hopeluv1 +hopeman +hopeman01 +hoper +hopferle +hophop +hopi62 +hoping11 +hopiste +hopla67 +hoplite10 +hopmosis +hopp01 +hoppas3 +hoppauf +hoppehei +hoppel +hopper +hopper1967 +hoppi12 +hopps501 +hopsel +hopser +hopzip +hoqkevoj +hora2717 +horace +horacio +horade +horatio111 +horatiu +horatius +horcate +horde1987 +horde285 +horde5099 +hordika +horeca +horefaen +horiba +hork23 +hormoz11 +horne242 +hornet16 +hornet98 +hornets4 +hornfrog +horni +hornyme +hornynoodle +horo +horpos +horrem +horridus +horse2 +horseley +horsemen +horst +horst +hortense +hortensia +hortonhc +horunge +horwich1 +hos34ben +hos55555 +hos5xa +hosaka01 +hosc188 +hoschi02 +hoschi2606 +hoschi47 +hoschi99 +hosea +hosein +hoser4hoser +hoshii +hoshipet +hosj5 +hospoda +hossa08 +hossa1 +hossa5 +hossam +hossboss +hossein +host +host04 +host1932 +host2004 +hostedip +hosting +hostmas +hostnine +hostway +hot098 +hot123 +hot2006 +hot56789 +hotarc23 +hotaru +hotass +hotbox +hotchick +hotchili +hotcw +hotdog1122 +hotdog44 +hotdog852 +hotdogg +hotel144 +hotelleo +hotewi79 +hotfox68 +hotgirls +hotgod +hothot +hothot13 +hotkey +hotline702 +hotmail +hotmailcom20 +hotmobil +hotnews +hotohori1436 +hotrod +hotrod66 +hotsauce +hotsex +hotshit +hotshot205 +hotshot5317 +hotstep1 +hotswap +hotta123 +hotti84 +hottie1041 +hottmale +hottom +hottopic +hottoro +hottub2k +hotymoma +hotzack +hou +hou88se +hou88sel +houazqha +houclan +houdini +houm +hound1267 +hounddog420 +hounds +houpdbv8 +hourahoura +hourocas +houron231 +house +house +house624 +houseley +houseparty +housepen +housing +housley +houssam +houssam2606 +houston +houston7 +hovet +hovno +hovnohla +how1 +how1036 +how1vat +howard +howard +howard jay +howard marian +howard marion +howareyou +howdyhow +howie +howl157 +howland +howlett86 +howtodo +hoycc1 +hoyh3756 +hoyhifoy +hoyokill +hoyspd +hoyt +hozatlim +hp10117 +hp1783 +hp19po +hp2035 +hp23560 +hp36414 +hp3820 +hp560254 +hp656sys +hp6900 +hp920c +hp9t7y23 +hpa1234 +hpaptiva +hpcahbys +hpcd4rwd +hpcg2005 +hpdeskjet +hpeindl +hpf1703 +hpgievvh +hphphp +hpip1 +hpkd22 +hpm2006 +hpmrbm41 +hpmx70 +hpmx701 +hpp1130 +hprtbmh +hpst2523 +hptest +hptrvnzv +hpvdoo +hpwf1907 +hpxav +hpxgo +hpxmtr6u +hq1029 +hq2be9rc +hq8ycoq5 +hqh6q +hqm4u +hqmdwtng +hqvdy +hqyfsn44 +hqzjvh3h +hr +hr098 +hr111016 +hr1729 +hr1pe +hr5760 +hr7zcacj +hr83sb +hr9dp8i +hranehrane +hrath09 +hrc6g +hrefwp +hrens +hrf456 +hrglawnj +hrgtw +hrigir9 +hrisomu +hristian +hrithik +hrixo1 +hrkl5 +hrl488 +hrmadani +hrms59 +hrnhgzrt +hrnokia +hrnsn +hro0226y +hroch +hrose +hroznysi +hrprensa +hrra39 +hrshrshrs +hrsoq +hrumeder +hruska +hs +hs0fas +hs1234 +hs170775 +hs183 +hs29br +hs3291 +hs73nl0 +hs789456 +hs8hn0 +hsa7v +hsan +hsaoifd +hsasss +hsb456 +hsd123 +hsd123456 +hsd4866 +hsdincp +hsdkfopw +hsenheff +hsh1421 +hsh5xt2n +hshh2res +hshmine9 +hshwx +hsieh +hsieh88 +hsitech +hsiwusa +hsj3u +hsjo4301 +hskclan +hsl4203 +hslktl +hsmf2k +hsnews85 +hson1985 +hsp90930 +hspgm33 +hsplmn80 +hspq78 +hsqol1 +hsr +hsshan +hsu +hsu12482 +hsu67716 +hsuan +hsvhsv +hsy520 +ht1980 +ht3456ht +ht56j7 +ht8p7 +htc123 +htcbu +htdbue4m +hte515 +htennek +htforums +hthr +hthvn1 +hticusni +htide +htiduj +htk7f +htkamimi +htl +htl9mat1 +htlacnem +htlcms +htm4f +html123 +htmldb +htn77 +htnhbtnh +htp1234 +htpchtpc +htq5j +htreloaded +htrgk +htrrdt +htt3128 +httemail +http +http020 +http365 +httpbgzl +httpmp7 +htweeo +htxpo +htz14rt +hu +hu hui +hu pao +hu0715 +hu123456 +hu2wk5 +hu58s4 +hu5ej3 +hu6848 +hu7jk342 +hu8642md +hua3cho +huacho +huaitang +huamc3 +huang +huang chung +huang jen +huang321 +huang99 +huangkun +huaq7xsb +huasheng803 +huaxu1981 +huayta +huayuweb +hub +hub01sn5 +hub4ev +hubbakin +hubby15 +hubduzd8 +huber +hubert +hubert +hubert321 +hubertus +hubertus +hubertus. +hubliwuk +huby1412 +hucares +hucheck +huckerby +huckleberry +huckme2 +huckrui +hudele +hudhud2 +hudieyao +hudj0611 +hudson +hudve +huehner +hueks +huelse01 +hueo3 +huette +huey +hueyshueys +hufesa02 +huff1962 +huffer12 +huga18 +huger +huggi008 +huggies107 +huggy55 +hugh +hughes +hughie +hughno1 +hugo +hugo +hugo van den +hugo werner +hugo0001 +hugo0815 +hugo1234 +hugo1705 +hugo1980 +hugo5 +hugo5688 +hugo98 +hugo9853 +hugoegon +hugohugo +hugolina +hugoluka +hugosch +hugox +hugues +huguette +huguette +huhete123!@# +huhn +huhn05 +huhn19 +huhu +huhu32 +huhu8877 +huhuhu +huhuuhu +hui +hui +hui733 +huiamus +huiaoox1 +huib +huibljad +huibui90 +huifkar +huiluk +huis +huisje +huisvuil +huixing8728 +huj +huj1234 +huj456xy +hujadupa +hujciw +hujciw4 +huje21 +hujek +hujkarol +hujnja2345 +hujth89 +huju +hujwie7 +hukum123 +hukurt +hulahula23 +huldiger +hulf5614 +hulk +hulk000 +hulken +hullerz +hullohullo1 +hulltech +hullu303 +hullud +hulshoft +hultan93 +hulya +hum224 +hum2b3k +humairoh +human +human0 +human316 +humanfly +humanz +humapcms +humas +humax22 +humayr4 +humayra +humbaba290 +humbahumba +humbert +humberto +humbled4u +hume +humels +humfeld1 +humhum +hummel0815 +hummel21 +hummel25 +hummer +hummer4676 +hummer84 +humpert7 +humphrey +humpme8 +humuluku +hunaland +hunanpork +hunareng +hund +hund111 +hund1606 +hundar1969 +hundarco +hundehueter +hundekin +hundeleb +hundemam +hunden +hundestaffel +hundie18 +hundred8 +hundrex +hundsgrund +hung +hung1116 +hung12 +hung1234 +hung2402 +hungamek +hungcho +hungduy +hungkings +hungnd +hungqn +hungthanh +hunkar +hunt3r +hunter +hunter +hunter1 +hunter13 +hunter167 +hunter2 +hunter2006 +hunter530 +hunter90 +hunterfriendly +hunterlily +hunting456 +huntington2 +huntley +huntz +huong77 +huong88 +hup367c +hupaes +hupjajob +huq73dix +hur111 +hur7a +hura45 +huraaaaa +hurbay +hurbert +hurd +hurensoh +hurensohn +huriam66 +hurl7ton +hurre35 +hurri7525 +hurric4ne +hurricane +hurricane5 +hurricanes +hursus +hurtme +hurv1ine +hurzhurz +hurzig +hus50jeb +husband2005 +huschi +huschten +huseten +huseyin +huseyin +huskies94 +husky8 +huskyasd +huskyfel +huskyj +huso +husoibo +hussain +hussar +hussler +hustak99 +hustec +husten2 +hustler +hustler1 +husyn +hut66 +hutko1987 +hutner99 +hutten2002 +hutton +hutton4990 +huuthinh +huwn1031 +huxinjie +huy +huyeniu +huyhoang +huykimdo +huynhanh +huyrotah +huzurca +hv130804 +hva3j +hvachvac +hvadmin +hvaon +hves +hvhbmlqo +hvkhhah +hvonline +hvorfor12345 +hvrullo +hvs10mun +hvvc2002 +hvzhangxin +hvzuq +hw123456 +hw2401 +hw45520 +hw5fd5 +hw7izuw3 +hwarpa29 +hwc19p +hwd9PK +hwdp1 +hwdp12 +hwdpolo1 +hwdpx18 +hwizv +hwkonnit +hwkzodrg +hwpeter +hwptr4 +hwq221 +hwr371 +hwr3er +hws719 +hwt227 +hwushc +hwvqf +hwy0320 +hwyp0 +hwzyihxf +hx07dk +hx288 +hx2rg3p +hx6699 +hx8bitgv +hxcsabhn +hxf83 +hxgdrpbt +hxht2004 +hxits4u +hxpoes +hxr3353 +hxugvtgj +hxxmhm +hxyx8 +hxzyyww +hy +hy31415 +hy6eg +hyChangeMe +hyalloi +hybryda +hydargos +hyde +hydegay +hydr0 +hydr0cat +hydra1813 +hydra701 +hydro0258 +hydro20 +hydroid +hydrontic +hydroplanes +hyeclass +hyghyg +hyip1234 +hyip4494 +hyip4762 +hyip6242 +hylda +hyllan111 +hylon340 +hyman +hymrjv +hyon +hyp753lq +hypdc1t +hyper900 +hyperion +hyperraum +hyperspace +hyphen23 +hypnotiq001 +hypnoziz +hyruebe +hyss1 +hyster1492 +hysteria +hysteric2 +hyt63b +hytm +hyu3ga +hyuhu +hyundai +hyundai8 +hyung kil +hywel +hyy2kesp +hz1337 +hz3hz3 +hz5sk3ut +hz7xq +hz8inuh8 +hzcv1xqg +hzlfa +hzmt4aez +hzofc +hzq9l +hzryopoa +hzuig7 +i.maiden +i081k +i0bqf +i0n8ibll +i0rdendu +i0rei +i0vrb +i1105s +i12nta +i1918 +i1990i +i1bonbon +i1c2l3h4 +i1c95 +i1c9500 +i1d2a3n4 +i1d8n0a8 +i1eew +i1g2l3e4 +i1iar +i1klm +i1l2a3 +i1nkd8yf +i1osh +i1pzd4s +i1s2i300 +i1s2o3 +i1uda +i1uxv +i23005k +i23le6 +i2569472 +i2724585 +i28624wr +i289b +i2av8yge +i2h3v3b7 +i2s8f5h7 +i2ttgcj +i2xi6cgd +i2zgf +i30ttM9zF +i31hhj22 +i3386753 +i3IQsz +i3emuas3 +i3gjm +i3ibt +i3iwZe +i3jcf +i3kz2278 +i3looc1 +i3oken7w +i420420 +i462fjau +i4c14u2 +i4fvbm55 +i4gotit +i4j23n1 +i4kn2c +i4lolz +i4m +i4nSxA +i5auy +i5m80h +i5oblyo +i5wqjesr +i633007 +i6456564 +i654321 +i6nfo8za +i6pix +i6ydn +i6zkn +i757k +i77a5a16 +i7UqxN +i7sqy +i7tlg +i81cat4t +i82bcmmm +i88a5a16 +i89rr5dw +i8jello +i8mco +i8rcys +i8tdl +i8uvg +i902epbc +i94t3gnh +i95N84 +i99egzu4 +i9cxni3w +i9doh +i9l0pg +i9mrg75e +i9uim +iCcm +iMD5 +iMaciMac +iOJoD4 +iPhone +iX6t +iZfhsB +ia49 +ia4w2z +iaah. +iaai00dt +iabnk2s6 +iabyd +iac1965 +iachia +iacono +iacool +iadps +iagcatiu +iaht8424 +iain +iaio71 +iaiss655 +iajoqn1 +iakodub +iakos111 +ialveter +ialwzxxg +iam1337 +iam1admin +iamadmin +iamadonkey +iamajedi +iamamedi +iamapimp +iamara +iambatch +iambest +iambored +iamcool +iamcool2 +iamdenny +iamedtoday +iameqo +iamevil +iamfishy +iamfree +iamfun +iamgay +iamgod77 +iamgod9500 +iamgreen +iamguru +iamhappy21 +iamhelix +iamhere +iamilkay +iamjason +iamjayz +iamlax13 +iamlolin +iamlove +iammad11 +iammadm +iammany1 +iammash +iammills +iamnadia +iamnoask +iamnot +iamoscar +iampixie +iamrodger +iamsarah +iamsatan +iamsk8 +iamsmart +iamthe1337 +iamthecount +iamthemane +iamthenick +iamtopo +iamurs +iamve928 +iamviva +iamwhoam +iamyour5 +ian +ian +ian geer +ian mac +ianbale +ianhays +ianknows +ianmcgregor +iansha +iapu2103 +iapula +iarcos +iarkafor +iartwind +iarwj0 +iasi77 +iasjoomla +iasmurf +iatimm +iawrestling +iay627o +iaz61 +ib6ub9 +iba +ibaf8523 +ibaialde +ibanez +ibanezk7 +ibara7 +ibatub +ibbelalhi +ibbumbus +ibbvm3 +ibc123 +ibd1AB +ibdbcdw +ibdub00 +ibeepy +ibew332 +ibex12 +ibinns +ibis +ibiza +ibiza03 +ibiza69 +ibland2051 +ibm123 +ibmce1 +ibmg76 +ibmibm +ibmri2m7 +ibne +ibneahmt +ibnt5msn +ibnux +ibo1942 +ibode +iboibo +iboleh80 +ibotr11 +ibp64 +ibracing +ibrahim +ibrahim bin +ibrahim4 +ibrain +ibremm +ibrgz +ibsa100 +ibseyras +ibsuxorz +ibtissam +ibu3aknp +ibukole5 +ibumi +iburnedm +ibvs0404 +ic +ic0n1nc +ic2008 +ic3fir3 +ic3gh05t +ic501 +ic8dtv +ica +ical +icalonga +icare +icarus +icbpscda +iccrew +ice +ice008 +ice123 +ice4 +ice4620 +ice790 +iceage2002 +iceage40 +icebaby +iceberg +icebird +icecold +icecoldbeer +icecream +icecream246 +icecube +icedfire +icehappy +icehouse21 +iceice +iceman +iceman22 +icemat24 +icetea77 +iceto95 +icewater +icewind2 +icewind86 +icewire +icf2cnxr +icfcig +icfh4 +icfnde +icfvz8e8 +icfweb +ich +ich007 +ich06445 +ich1991 +ich2lebe +ich43562 +ichak +ichbin23 +ichbin2k8 +ichbin60 +ichbinda +ichbindu +ichbins#1 +ichbins* +ichbins2 +ichdarf +ichderk +icheva +ichi7723 +ichi9530 +ichibang +ichigo +ichigo12 +ichini +ichipollas +ichiro +ichizo +ichlebe +ichliebe +ichliebedas +ichnicht +ichnussa +ichooph +ichrocke +ichrufe +ichschaffen +ichschon +ichselbst +ichthys0316 +ichunddu +ichuxu +ichwerde +icinetas +icing11 +icke678 +ickodos +icldq +iclight +icnmn2y +icolossal +icon610 +iconcon +iconroo +icontrol +icos00 +icou812 +icpepsi +icpiq +icpo9ok5 +icq12345 +icq2002 +icqenmsn +icqmario +icra3406 +icrivo +ics +ict1001 +ict2jzzk +ictius +icu7a +icug0 +icuthere +icv1234 +icv12345 +icwe0 +icy119 +icydont +icyriver +iczh3 +id0115 +id07an +id1000 +id198725 +id1999 +id2002 +id3963 +id51332 +id5ep9xe +id8s9 +ida +idahmala +idaho +idaho11 +idaho9 +idairah +idalia +idamarie7 +idan5789 +idb4055 +idclev32 +iddbid +iddqd +iddqd2 +iddqde +iddqdpc +ideadent +ideal12 +ideal7132 +idealia +idef22 +idef23 +idefix +idefix20 +idefix2002 +idelma +ident1fy +identity +ideoideo2 +idgsild0 +idh8441 +idi +idiamin +idilia +idiot +idiot2 +idiotensache +idis123 +idit1976 +idk043 +idkfa +idkfa23 +idkfa85 +idkfa86 +idkfa9 +idlkthjp +idmonline +idn1395 +idna40 +idoabi +idoexist +idol +idol666 +idolise +idontkno +idontknow +idontno +idop123 +idox +idp891 +idqda +idrhdw7t +idris +idu1 +idunedv +idunno +idunno85 +idwig +idxpmb +idzerd +ieatbats +ieatglue +ieebn411 +ieee1284 +ieee1394 +ieeebd +iegvl +ieh75 +iei1979 +ieij3 +iek25738 +ieleen +iemamy +ier5s +ies6932 +iese0ub +ieutmg +ieva123 +ievute +iew32d98 +if1y1 +if28gr6 +if593u6a +ifan +ifan huw +ifar +ifassafi +ifbb88 +ife555 +ifeel +iffouqol +ifgjuq1v +ifgrecia +ifhbyu +ifhem +ifi999 +ifiksr +ifk0809 +ifoda0 +ifor1206 +iforget1 +iforget5 +iforgetu1 +iforgot +ifpn24 +ifrblj +ifrit14 +ift123 +ifu5yd0g +ifuckup +ifuckyou +ifusmell +ifuxu11 +ifvr +ifwhmd +ig3jxs9n +ig6ystxf +ig8821b +igal +igarc001 +igdstcul +igeam +igel83 +igela1 +igfota +igiveup +igjj2adg +iglika +iglodowska +igmbgts +ign0j +ign321 +ignacio +ignacio lopez +ignacito +ignaczak1 +ignat +ignazio +igneci +ignimbrit +ignition +ignition +ignor +igolfakstp +igombine +igor +igor +igor2212 +igor2403 +igor63 +igor73 +igorhippe +igork +igorsl +igory2 +igotit +igotkorn +igotps2 +igt95 +iguana1618 +iguiguii +iguinni +igus21 +igus93 +igv62 +igvrj +ih143 +ih1623 +ih2ku1m +ih460932 +ih4xu +ih79nefr +ih82bl8 +ih8f1981 +ih8ppl +iha1444g +iha7805 +ihackyou +ihatealot +ihateboon +ihatechinks +ihateron +ihateu +ihatevernon +ihatevms +ihateyou +ihateyou34 +ihaveno +ihbndrwr +ihc0110 +ihdgdl +ihdnea +ihdvv +ihe2zb +ihevipq +ihfinaze +ihht9egr +ihichem +ihjtsg89 +ihl513 +ihnm5ims +ihp15 +ihrnicht +ihrul1ng +ihs3756 +ihsan +ihsan +ihsaniye +ihum323 +ihumid +iic05hgg +iic0a +iic2005 +iida14 +iiehku +iif1m6 +iii7uri +iiidiota +iiiii +iiiiii +iijcn +iiktest +iil6339 +iinsert6 +iistb48 +iit2ctpw +iiuak +iiyama +iiyama081 +iiyama1234 +iiyamaiiyama +iiyim +iiyqama +ij2612 +ij6thnmg +ij7hiwfc +ija +ija05wan +ije85 +ijftibi +ijh2000 +ijhul +ijk +ijmno +ijn987mk +ijrengis +ik4eva +ik4qiw +ikArS +ikNOgg +ika +ikaa4509 +ikagci +ikaika +ikalove +ikano37 +ikaria +ikariame +ikbendom +ikbenlol +ikbfvcuz +ikcoto +ike +ike1275 +ike9iec9 +ikeike +iker +ikex2x +ikexe +ikg7q +ikhwan +iki +ikillyou +ikj1779 +ikjlljki +ikjtz7l6 +ikkaben +ikke +ikke1121 +ikke123 +ikke2270 +ikke2468 +ikkeee +ikki12 +ikkoku +ikku22 +iklinkin +iklvjnl +ikm23we +iknumket +ikohicks +ikonka1 +ikopass +ikpass5 +ikpoe +ikra2525 +iksexy +ikszdee +ikttorak +ikuchan +ikvat +ikwfvhb8 +ikxmyhb9 +ikzd302 +ikzelf +ikzgo522 +il0veyou +il0w3 +il12wbc +il13rh +il1rab +il2411 +il2848 +il2876 +il2kajaa +il3969 +il5sp +il77yu +ilDuce88 +ila +ila +ila19yog +ilah +ilan +ilana +ilao1971 +ilaria +ilaria87 +ilario +ilario79 +ilarion +ilarion90 +ilasejk +ilau123 +ilaydam +ilaysemi +ilboub +ildavina +ildennis +ildiko +ildikqpo +ildipi +ildn9lys +ildo +ildruby +ilds1808 +ilds281 +ileana +ilegow +ilegress +ilene +ilesenuj +ilfanfo +ilham +ilhami +ilia +ilia1$ +ilia123 +ilia1990 +iliaanu +ilieilie +iliescu +ilija +ilikeche +ilikecheryl +ilikedani +ilikepep +ilikepie +ilikepoo +ilikesex +ilikewounds +ilikeyou +ilikeyoubitch +iline +iliros +ilisns +ilj21mlj +ilja1990 +iljanius +iljuha01 +iljw25 +ilka +ilkadmin +ilkamike +ilker +ilkerim +ilkerxtr +ilknur +illegal +illidan +illinois +illja +illjitth +illmill +illrain +illsite +illuminati305 +illuminator +illusa1705 +illusion +illuvatar +illuz1on +illyo +illyo12 +ilmala73 +ilmari123 +ilmeglio +ilmiawan +ilmjaj13 +ilmp34 +ilne3t +ilokoko +iloled +ilona +ilona1152 +ilona18 +ilona3244 +ilona666 +ilonka666 +ilot2d +ilove1337 +ilove369 +iloveGod11 +ilovead +iloveaik +iloveana +iloveav +iloveaxl +ilovebear +iloveben +ilovebnl +ilovebooks +ilovecs +ilovedana1 +ilovedos +iloveghj +ilovegod +ilovegod52 +ilovejc +ilovejen +ilovelnw +iloveme +ilovemma +ilovenab +ilovengoc +ilovenicki +iloveraw +ilovesex +ilovesgb +ilovesqu +ilovesx +iloveu +iloveu69 +iloveyou +iloveyou! +iloveyou1336 +ilovezis +ilpad +ilrossi +ilsa +ilsa +ilsdn08 +ilse +ilse04 +ilse35 +ilsji920 +ilsmfi +ilsole +iltgs9 +iltsk +ilu +ilu123 +ilu1234 +ilublo +ilujen +iluvandy +iluveric +iluvme +iluvmeg +iluvoc1 +iluvrosi +iluxa73 +ilv4v +ilvu4fr +ilxaj +ilxvq +ilyana +ilyass +ilyjilyj +ilytomoe +ilyy +ilzidur +im000786 +im061496 +im1bsbnp +im2ded4u +im2ed +im44mn3t +im4ge +im6kz +im7q2i76 +ima45d00 +imabd +imabot +imac371 +imacheat +imadexxf +imafag +imag0d +imagen07 +imagine +imagine1235 +imagus +imajica99 +imajwap +imalo +imaniman +imari +imation +imation5 +imba12345 +imback +imbaleno +imbeast3 +imbecille +imbemdeu +imboard +imcafe +imchris +imcsai99 +imdaan +imdead +imdfr +imdonald +imdone1 +imechanik +imeleet +imenyan +imerg +img355 +imgay +imhatimi +imhoper +imhotep1 +imhw1e6w +imig00 +imigigi +imissher +imisssierra +imissu +imissyou +imitiss +imjammin +imjpdmle +imkb2003 +imki5t +iml3e +imladris +imlotsh1 +imm3740 +imme13 +immebett +immensee +immer61 +immergruen1 +immhhw04 +immicl +immo +immopool +immortal +immortalguild +immuj9pa +immun +immun1ty +immy +imnalen +imneo15 +imnews +imoc1980 +imoelter +imogen +imogene +imop0 +imopaeo +imortal +imortals1 +imothep +imoti +imp1957 +impact +impact! +impala +impala1 +impala11 +impalate +imper +imperial +imperial145 +imperial440 +imperio +impeto +impex612 +impexint +import15 +importador +importal +impossible +imprensa +impretty +imprezza +impro159 +impro5555 +imps9999 +impulsdenis +impulse3 +imran +imre +imready +imrich +imsaveit +imsohot +imsx +imthe14u +imthekin +imtim2 +imtired1 +imtomlee +imtony48 +imtp0800 +imwaez +imyfw9b4 +imyunsuk +imzadi001 +in001068 +in1 +in135650 +in2thec +in3ge03g +in44ir17 +in4648ox +in5talli +in69the2 +in73rn +in83wprz +inCube +ina +ina +ina1962 +inab1ti +inacan +inahas +inaki +inakom25 +inaktiv +inapway +inazuma09 +incarna +incase4374 +incense +inchworms12 +inci +inci2009 +inclusion +income2# +incomedy +incoming49 +increible +incsec +incubis +incubus +incubus1 +ind33d +ind764 +indeed89 +independent +indertat +index +index78 +index? +indi2900 +indi4623 +india12 +india123 +india19 +india211 +indian +indian96 +indiana +indianajones +indiaroc +indien1 +indifi +indig0 +indiglo +indigo +indigo47 +indigoj7 +indija +indiogay +indiscipline +indologam +indonet +indoor +indrac84 +indrax +indukult +indunil +indus +induserv +indy1506 +indygo +indymid +ineal +inefabil +inefulac +inekafe +ineko +ines +ines des +ines775 +ineslieb +inesrita +iness +inet123 +inet2000 +inettotp +inexita +inext +inez +infami215 +infantry12 +infected +inferis1 +infernal +infernalis +inferno +inferno1234 +inferno1385 +inferno9 +infernoes +infestation23 +infested +infi1759 +infierno999 +infilian +infinity +inflames +info +info1007 +info110 +info1977 +info3115 +infocet +infocom +infofuel +infologic +infolord +infopeda +informal +informatica +informatika +infoserv +infotec1010 +infovekk +infox +infrad +infrainfra +infsps +inftech +infulein +infurma +ing2006 +inga +inga-bodil +ingavv +ingbut +inge +inge0505 +inge1234 +ingeborg +ingelore02 +ingemar +ingemaric +ingemoll +inger +inger jalmert +inger lise +ingeri +inget123 +inglio +ingmar +ingo27 +ingo4you +ingobert +ingodwetrust +ingold +ingold01 +ingolstadt +ingre +ingrid +ingrid3011 +ingridd +ingusia +ingute +inhohmat +inhuman21 +iniaki +iniduha +inigo +inin1021 +inismor +init +init2005 +initiald +initiald101 +initinit +inj3ba +injostfe +inka +inka12 +inkadinkadoo +inkisa +inkj2nh4 +inkjet +inkl10 +inkovs6 +inlen7ve +inlove +inlove823 +inm0use +inmaculada +inmelman +inmexa24 +inmine00 +inminnyb +inna +innocence018 +innocent13 +innoi11 +innokenti +innokenty +innova2 +innovation +innovative +innovator +innovision +inoff55 +inoino89 +inomnia +inondation +inostwig +inoue +inouq159 +inpairbo +inpas1 +inpe1609 +inquisiteur +ins4ne +insan639 +insanala +insane09 +insanetank +inscr1te +insel05 +inselccc +inselmon +inselstaat +insert +inside +inside23 +inside62 +insideout4 +insider +insiders99 +insign +insom70 +insomapi +insomnia +insomniac1234 +inson22 +insosk +insp1973 +inst +install +installed +instead75 +insterburg +instinct +instinto12 +institut +instone +instuy +insulene +insungm +insurgent +insyderz +int1952 +int3nt0 +int468 +int47doc +intec06 +integra +intel +intel30 +intel4 +intel4850 +intend +intenret +intensecs +intensiv31 +inter +inter1 +inter220 +inter30r +inter329 +inter788 +intera +interact +interactivos +interdev +interessant +interesting +interface +interfleet +interflow +interi +interista10 +interm2009 +intern01 +intern04 +intern87 +interna +internaat +internacional +international +internet +internet1 +internet66 +internet8 +internetlol +interpol +interpolation +interregio +interroh +intex12345 +inthanon +inthemix +inthouse +intikam +intiurpi +intjudo +into513 +intraco1 +intrared +intrepid +introuvable5 +introw88 +intruder +intrus9876 +intrusion +inuendos +inuka +inuyasha4377 +inuyasha52 +inv31rmf +inv3nt +inv3nta +invasion +invasion5 +inverse +invest +invest76 +invincible +invincible8 +invisible +invite21 +inviteszone +invito94 +invoker2 +inwestor09 +inxxss +inzane +io +io100264 +io2pjtpy +io43nz98 +ioana +ioannis1 +iod1q +iodclan +ioff733 +iola +iolanda1 +iomega12 +iomeio +iominal +ioming +ion +ion +iona +iona +ione +ione1911 +ionescur +ionica +ionnau +iono +ionquad +ionu1234 +ionutz +iop2903 +iop890 +iopdfg +iopiop +iopjkl90 +ioppsg +iorigold +iorinap +ios2005 +iosif4o0 +iotest +iothea +iowa00 +iowabass +iowadream +iowaiowa +iownu +ioy4fnce +ip +ip00d1 +ip0p5Y +ip1969 +ipMO1u +ipa2206 +ipaq2002 +ipaq3942 +ipaq6700 +ipbdopus +ipbiespk +ipcam +ipds3500 +ipeka1 +iperion +iperlol +ipesi70 +ipesiks +ipex00 +ipfree +ipfvo +iphigenie +iphysics +ipi2c +ipl2321 +iplayw0w +ipm1 +ipmcepap +ipmm8zls +ipmyass +ipnekod +ipneozan +ipo4m +ipodnano +ipp2006 +ipp2dfv0 +ippek +ippi1122 +ipqq89 +ipsenlol +ipsoinfo +ipsonia +ipswich50 +ipswichm +ipwn2zzz +ipwnuall +ipxx9727 +iqbefriad +iqfender +iqk2738 +iqkjl +iqlagada +iqlci +iqod +iqom123 +iqrrj +ir0cm0d +ir0nm4n +ir1684 +ir230419 +ir3l8nd1 +ir456wsx +ira +iraki89 +irakli +iranchan +irankami +iraqi12 +iraqknew +irasema +irasvenja +irb0074 +irb3223 +irbkw +ircOpz +irca1234 +irca68 +irckcs21 +irco6no +ircoper +irdaa +irdeto2 +irdx2005 +irecar +iregurum +irekor82 +ireland07 +ireland65 +irelandk +irelandts +iremnisa +iren +irena +irenak +irene +irene +irene lopez +irene yah ling +irene2802 +irene57 +irene76 +irenekuo +irenka80 +ireoireo +irerwhpa +iretiamo +irfan +irfn1923 +irfrules +irgalom +irgendeins +irgendetwas +irhax +irida07 +irie13 +irigoin +irigvagy +irihin +irikk22 +irina +irina1966 +irina81 +iris +iris101 +iris1110 +iris2000 +iris2106 +irishe +irishi +irishman79 +irishy +irisstr +irith +irj8ioo4 +irka +irland01 +irlandia +irlrk +irm +irma +irma2 +irmel1000 +irmer +irmgard3001 +irmitz +irna +iro1405 +irobot99 +irock +irock5 +irocs +irodmar +iron +iron eyes +iron0112 +iron0575 +iron123 +iron17 +ironbimb +ironclaw +ironduck +ironfish42 +ironfish72 +ironic24 +ironmaiden +ironmaiden4 +ironman +ironore123 +ironpillars +iroooni +irosan2 +irp130ma +irq8jpjp +irr3471 +irrehs +irritec1 +irsa +irsa +irsirs +irskine +irtyune +irul34ll +irvin +irvinchia +irvine92 +irving +irving +irwanii +irwin +irwin104 +irzfl +is +is0mag0 +is0sucks +is11210 +is34mail +is3t34 +is4450 +is4tr00t +is75apoc +isa +isa +isa moeller +isa0129 +isa1402 +isa275 +isa30 +isa612 +isaac +isaac +isaach +isab2912 +isaba123 +isabe +isabel +isabel +isabel06 +isabel1008 +isabel128 +isabela +isabell +isabell +isabella +isabella +isabelle +isabelle +isabelle canto +isabells +isabonn +isabos +isacol4 +isaeli +isaiah31 +isaiah63 +isakabir +isalmuru +isaloki5 +isamu +isan00b +isancu +isaniel +isao +isaphi +isapnp +isaque +isarco +isatis +isbisb +ischa1525 +ischenen +iscool +isdepski +isdj6 +isdn4971 +isdn75 +isdn99 +ise2t +isee258 +isee6mv2 +isela +iselkatita +iselldead +isem +isengard24 +isfried +isgek +ish +isha4 +ishaq +ishia +ishidafr +ishiko1 +ishkhanw +ishtar +ishtw4m2 +isi2010 +isia407 +iside +isidoor +isidore +isidore +isilwing +isim +isimen +isj3l +isjj412 +isk5767 +iskander91 +iskenderun +iskewl +iskilots +iskis +iskra +iskre +iskricka +isl32207 +isla +isla1755 +islaforum +islam +islam1 +islam78 +islam786 +islamic1 +islamicarmy +islamlib +islamway +island +islandia +islavista +islem5 +islim773 +islove13 +ismael +ismael123 +ismail85 +ismailkhalil +ismell +ismet +ismim +isnich +isnotme +isnydyou +iso +iso81iso +isobel +isolde +isostar7 +isotop5 +ispdf +ispywith +isqxx +israel +israfil1977 +isrres +iss1402p +issdas +isso +issy +ist210 +istanbul +istaristar +istawa +isthat05 +isthe +istotak +istprivat +istra22 +istvan +istvan291 +isuck2u +isuhanna +isxgx +isyanci +isyankar +it +it05gp8 +it10pes +it18sa23 +it290 +it29hs +it3686 +it4069 +it4fived +ita2007 +ita713 +ita:ita +itachi +itadmin1 +itai1zae +itala +italas +italia +italia coppola +italia1 +italiano +italien22 +italo +italomafia +italy +italy! +italy620 +italy86 +itamar +itarchive +itas0783 +itbreyg3 +itcacti +itchyer +itdc1526 +itdxtyrj +iteach +item111 +itends +iterntar +iteu4342 +itg5589 +ithink4 +iti +iti24134 +itis1776 +itiscold +itisf8 +itisme +itisvt16 +itmfund +itnclan +itogluit +itojaber +itop +itpaqliq +itr0x +itryonline +itsabhp +itsane +itsasecret +itsasecret325 +itsdone +itse0201 +itseasy +itsme +itsme23 +itsmine +itsmine1996 +itsreal +itsstock +itstime +ittelkom +ittenips +itti7575 +itunes +itunic +itusy7ne +itv8889 +itvgd +itwan +itworks +itxpl68 +itzhaze +iu290180 +iu550 +iubire +iucze2tu +iuhwa982 +iuk62 +iumh9 +iumsak +iup5f +iupenhiu +iupopto +iurisabo +iusoccer +iusslnz +iutbezac +iutfjce3 +iuwxssdx +iuz20c5 +iv +iv123 +iv5c1 +iva +ivailo12 +ival +ivalice +ivam +ivan +ivan +ivan jandl +ivan10 +ivan2400 +ivan3658 +ivan4o +ivan9446 +ivanak1 +ivanhoe +ivanivan +ivanka70 +ivanmix +ivannehu +ivano90 +ivanov239 +ivanyau +ivar +ivarara +ivasik +ivb4j +ivc29yk7 +ivcj997y +iver +iverson +ives +ives99 +ivetag +ivica +ivica79 +ivika1 +ivin99 +ivisoft +ivjms +ivjtpy +ivkoto +ivlev5342 +ivnapina +ivo +ivo12345 +ivo9277 +ivomax +ivonchi5 +ivonne +ivonne3* +ivor +ivory +ivqxg +ivt0au9r +ivuska +ivw6r +ivy +ivy1650 +iw0awh +iw134 +iw220271 +iw40cln +iwailo +iwan +iwan +iwan1607 +iwantlin +iwantstuff +iwbin78y +iwd00pro +iwe4p +iweb2000 +iwej8 +iwillgo +iwin4652 +iwinkatu +iwiwqsdd +iwjtu3u3 +iwk4e123 +iwnh9124 +iwnsg6 +iwo2509 +iwoa187 +iwona +iwonka34 +iwpqm +iwpvc +iwq0w +iwrqoux1 +iwsu2oc1 +iwtl7577 +iwudi +iwuvyou +iwwi10ve +ix367 +ixakuga +ixepetai +ixghit85 +ixhdkpns +ixi53199 +ixigirl +ixion9801 +ixirules +ixpass +ixplem +ixrnkkfr +ixwinnt +ixwnr +ixzfq +iy2gs +iy5er4 +iya +iyfip +iygfq +iyi81401 +iylidh +iynz1893 +iyqwevpu +iyyvg +iz3335ka +iz5a4orr +izabel +izabela +izaber1 +izadora +izernois +izgilik +izgrecia +izhak +izi +izik +izik916 +izitaaa +izmalin +izmc16 +izmhy +izmir35 +izojg +izokroha +izqa6u4c +izumi +izvn8 +izzet +izzy +izzybee +j +j edward +j jam +j00 +j01091981 +j0141993 +j062u +j072280n +j0achim +j0aquins +j0eyi +j0hannes +j0hnj0hn +j0j32l66 +j0ker +j0kkm0kk +j0lqy +j0lxz +j0mar1 +j0n1etz +j0s3l30n +j0u14h +j1 +j100temp +j110387k +j1110w +j1111s +j1210a +j13ehrtt +j141252k +j1445 +j1605d30 +j17tkhas +j1911m +j195502 +j1d889gs +j1evq5vb +j1g2c3m4 +j1hpp +j1j2j3 +j1j2j3j4 +j1lku +j1mb33m +j1mm1n33 +j1o2e3s4 +j1ujitsu +j1ykz +j206re15 +j24071982 +j2460647 +j261288 +j261290 +j271280g +j2a4fp +j2fhi +j2iim +j2kb42a +j2n1n3 +j2s1009 +j2t5w52g +j2tb67ht +j2vbb +j310198j +j31719 +j3194779 +j330rt58 +j3420432 +j365780k +j3d85d +j3e2n1 +j3ikh +j3lyt +j3mand +j3nnus +j3qesq60 +j3r1ch0 +j3rs8 +j3t41m3 +j3ttv +j3v1 +j3wrl +j3xzc +j3z3b31 +j3zdhdoi +j42608 +j4295602 +j45h67n8 +j490dhy +j49ed +j4b3rw0k +j4bwg +j4m3s +j4mb0n +j4nc0X +j4ngk4r +j4nohvly +j4yyc +j55kpvsr +j5998196 +j5lm3z +j5n3j2c9 +j5ozmf9p +j5reu +j5u8a9n1 +j62u6 +j64436931 +j65r34v1 +j67ek4nj +j6a2j5 +j6btzz +j72558 +j73067 +j747 +j748p +j774091 +j77899 +j7c30699 +j7kofatu +j84vhteo +j8dkk686 +j8jbfmyt +j8jnj +j8mehufe +j8sp3r +j9063211 +j90but26 +j9701064 +j98mmumo +j99eo3 +j9agl82v +j9evh +j9hff9tc +j9kasdh9 +jFTFv6 +jPL2p +jV171186 +jYNUhD +ja +ja061607 +ja07mi03 +ja0kc +ja1010 +ja120893 +ja3967 +ja3g3r +ja95y +ja97je01 +jaabna +jaadam +jaadld +jaakko +jaanson +jaanus012 +jaapie +jaapie90 +jabali +jabali79 +jabaliin +jabanamas +jabarty1 +jabatowin +jabba +jabba912 +jabbahut +jabber69 +jabberwocky +jaber321 +jabier +jabir +jablko +jabol01 +jabr0 +jabran +jac +jaca22 +jaca44 +jacco +jaccos +jacdmly +jace +jacek +jacek +jacek1 +jacek78 +jacekeze +jacenter +jaceot +jacerca +jacfaib +jacha +jachamji +jachan85 +jachondo +jachwer +jacint +jacinta +jacintopt +jack +jack +jack david +jack mylong +jack0107 +jack0815 +jack1104 +jack12 +jack123 +jack1234 +jack1393 +jack1549 +jack1e +jack2007 +jack2126 +jack370a +jack8183 +jack9314 +jack9807 +jackal060 +jackal99 +jackalv1 +jackaroo123 +jackass +jackass8 +jackbaxter +jackbeau +jackboy14 +jackbro1 +jackbull +jackch12 +jackchen +jackdog7 +jacke +jacked12 +jackee +jackelyn +jacker +jacker23 +jackhammer +jackhole +jacki +jackie +jackie +jackie butch +jackie earle +jackie288 +jackinabox +jackjack +jackjewe +jackler3 +jacklyn +jacko9989 +jackpanda +jackpotmail +jacks0n +jacks1 +jacksen +jacksite +jackson +jackson +jackson020 +jackson1 +jackson730 +jacksonbouvier +jackw +jackward +jacky +jacky1489 +jacky15 +jacky1997 +jacky25 +jacky3001 +jacky3020 +jackyman +jackyterry +jaclyn +jaclynne +jaco0301 +jacob +jacob +jacob1 +jacob604 +jacob858 +jacob899 +jacobbe1985 +jacobi +jacobo +jacoburn +jacq8948 +jacque +jacque lynn +jacquelin +jacqueline +jacqueline +jacquelyn +jacques +jacques des +jacques-henri +jacques1977 +jacques2 +jacqui +jacquline05 +jacsct +jaculator +jad4chad +jada123 +jade vander +jade1679 +jade1996 +jade7684 +jadeall0 +jaded111 +jadeindy +jaden1993 +jaden8 +jadenkste +jader88 +jadereport +jaderunner +jadin111 +jadore +jadoreca +jadpxs +jadwiga +jaec95 +jaeden +jaeg93 +jaeger +jaeger530 +jaehah +jaehee +jaesen2723 +jaf123 +jafpro +jafra45 +jag3f +jagR24 +jagabay +jagadaku +jagaeger +jagalot +jagashpw +jagdish +jagdterrier +jagegrym +jagen123 +jagex +jaggerbombs +jaghp001 +jago03 +jagoda +jagoma +jagst770 +jaguar +jaguar09 +jagy2005 +jahaja +jahanna9 +jahannam +jahnke +jahnuls +jahoda +jahr1987 +jahrgang59 +jai15ans +jaidasue +jaiden15 +jaikeel +jaimac +jaime +jaime del +jaime123 +jaimeb03 +jaimebabe +jaimeg +jaimepl1 +jaimeproud +jaimico +jaimie2005 +jaina2418 +jairop19 +jaishil +jaisson +jaja +jaja12 +jaja2007 +jajaarj +jajaja +jajaja55 +jajaja69 +jajajaja +jajalol +jajesam +jajoja +jajsem1x +jak11bit +jak22lov +jakago +jakapujs +jake +jake +jake0206 +jake1022 +jake1970 +jake69 +jakebox +jakec1 +jakeeey +jakejake +jakelav +jakemac1 +jakeman1010 +jakeman666 +jakerss +jaketate +jakies +jakieshasl +jakiss +jakkaman +jakles +jaklinn +jako +jakob +jakob +jakoblawrence +jakobs98 +jakobsen321 +jakom +jaks91 +jaksa16 +jaksid +jakub +jakub1988 +jakubassa +jakuz4 +jakuza +jalabule +jaladas +jalal +jalasin +jaldenv1 +jaliat +jalla +jalla100 +jalla97 +jalvert +jam8828 +jamaica +jamaican +jamajka +jamakasi +jamalas +jamaljamal +jamba4536 +jameelee +jamelao +james +james +james dan +james david +james earl +james hambone +james leo +james yi +james1 +james14 +james187 +james1883 +james2 +james204 +james247 +james36 +james401 +james5b +james617 +james999 +jamesappell +jamesb01 +jamesbond +jamesbond10 +jamesbond77 +jamesbrown +jameshusky +jamesjohn123 +jamesli9017 +jamesnewman +jameson +jamesp123 +jamesson +jamest1 +jamest1073 +jamhvqme +jami +jamie +jamie +jamie lee +jamie1 +jamie2385 +jamie721 +jamieb88 +jamiem +jamiemcd +jamies12 +jamil +jamil1212 +jamila +jamilah +jamimart +jamis1 +jamison1992 +jammer +jammer1 +jammin84 +jamnik009 +jamnik18 +jamnik29 +jamocha +jamolek +jamourtu +jamppa1234 +jamppama +jamrak +jamroon +jamshid +jamtland89 +jamworks +jamy2005 +jamz +jamz1041 +jan +jan +jan gan +jan garber +jan ivan +jan mac +jan michael +jan-michael +jan-paul +jan0194 +jan1010 +jan12390 +jan1488 +jan2006 +jan20099 +jan4711 +jan59 +jan6361a +jana +jana +jana0100 +jana2608 +janah +janan +janatampe +janbev +janboz +janc0X +janc0k +janchuks +janclaudio +jancok +jancuk +jandasek +jandees +jandj318 +jandrax1 +jandres2009 +jandrito +jane +jane +jane ira +jane jordan +jane mac +jane marla +jane0407 +jane32c +jane4447 +jane6685 +janedoe79 +janee1004 +janeflegel +janekling +janel321 +janelle69 +janesf15 +janet +janet +janet ann +janet elsie +janet lee +janete +janeth67 +janette +janeway +janeway7 +janez +janez179 +jang kang +janhjanj +jani +jani90 +jania +janice +janice +janice77 +janicka +janie +janiequa +janikk +janina +janina +janina13 +janina1612 +janina2206 +janine +janine +janine1988 +janinekk +janis +janis +janis7 +janit +janitor777 +jankes +jankess1 +jankowski1 +jankro +janky22 +janlass +janluka +janm +janman01 +jann +janna +jannarden +janne +janne90 +janner12 +janner7256 +jannervt +janni1984 +jannie10 +jannik +jannik +jannik92 +jannis +jannis84 +jano23 +jano46 +janochan +janos +janos1791 +janosch +janosch03 +janosch83 +janpirat +janpogi526 +janrolf +jans03 +jansmit +janssen1988 +januari159 +january +janus +janusz +janusz +janusz234 +janusz63 +janvier +jany +janzen12 +jao +jap1kap +jap22lol +jap9437 +japan +japan. +japan007 +japcsi +japjet12 +japon +jappos +jaqnivvd +jaqueline +jaqueline +jaquo +jar1985 +jar7ale8 +jara1976 +jaracz84 +jaralla1 +jaratsi +jarcgil +jardel +jardin +jared +jared +jared69 +jarek123 +jarek19 +jargil1 +jarhead13 +jariboe2 +jarino +jarl +jarla1990 +jarlan1973 +jarlath +jarma +jarmila +jaro +jarod84 +jaromir +jaron13 +jaros +jaroslav +jaroslaw +jarp6106 +jarpen +jarral11 +jarreb0x +jarrod09 +jarrodroy +jarsma17 +jartaka +jarunee +jaruwan +jarvais +jarvster +jarwanto +jaryn001 +jaryuen +jas123 +jas84753 +jasemate +jasflo +jashugun +jasiek +jasiog +jasitaji +jasiu +jasivs +jasko1 +jaskon7 +jaslap +jasm1na +jasmickan +jasmin +jasmin2150 +jasmin97 +jasmin9783 +jasmina +jasmine +jasmine1026 +jasna +jasna666 +jason +jason +jason01 +jason04 +jason6283 +jason669 +jason723 +jasonc37 +jasonjason +jasonjr +jasonly2 +jasorget +jasp85 +jasper +jasper0501 +jasper1871 +jasper624 +jasper7 +jaspion +jassidy2 +jatanud +jatky +jatmucox +jatorg +jatta +jatymywy +jauernek +jaujau92 +jaul1084 +jaume +jaume +jauniena +java +java0310 +java1337 +java2000 +java225 +javaboy +javaboy1 +javacplu +javad1213 +javadk11 +javadog7 +javala +javameny +javanna22 +javascript +javelin123 +javi +javi1212 +javi20 +javi2200 +javichu +javier +javier +javier1112 +javierg +javlar +jawa1400 +jawadn +jawd9d83 +jawermus +jawknee +jawn +jawzclan +jax626 +jax86vop +jaxi +jaxx2012 +jay +jay slim +jay0909 +jay0909h +jay106 +jay424 +jay65273 +jaybird +jayce +jayce111 +jayd +jayden +jayden5320 +jaydip +jaye +jayeff +jayibo75 +jayisgod +jayita +jaykay +jaykid02 +jaylee27 +jayman123 +jayme2005 +jayne +jayoes12 +jayr34 +jayrectal +jayson +jayson00 +jaysonleo +jayut +jayzon21 +jaz21085 +jazdA7 +jazevedo +jazmyne911 +jazsrs +jazz1973 +jazzdog +jazzfag +jazzkilla +jazzman +jazzolino +jazzvad +jazzy +jazzy86 +jb +jb010901 +jb119 +jb2005 +jb301126 +jb3611 +jb7723 +jb7759 +jb83483 +jb8569 +jbalel3 +jbart127 +jbbcombo +jbdm80 +jbhbwma +jbhood +jbidym93 +jbinoche0 +jbisme +jbj911 +jbjb9999 +jbl4731 +jblaze81 +jbldr4 +jbn5252 +jbnr143 +jboogy +jbq3n +jbrfn +jbs7219 +jbsfw +jbtaco2 +jbtrib30 +jbu7878 +jbucuane +jbvks +jbx2mpoo +jc +jc007008 +jc020385 +jc021955 +jc0459 +jc0708ch +jc101188 +jc1108 +jc170985 +jc21b9jc +jc2310 +jc254339 +jc335930 +jc4nciaa +jc6856 +jc7c9dh3 +jcadcam +jcash1932 +jcb2023 +jcbs +jcc1tpc2 +jccjean +jcclan +jccobain +jcdjcd +jcenybfb +jcgod007 +jch4nccy +jchun123 +jcinkter +jcisla +jckk1033 +jclxmj9z +jcm3217 +jcmald +jcmmrp +jcmnaibt +jco +jcpr5 +jcrimmer +jcrn +jcrozat +jcs66226 +jct92790 +jctechs1 +jcw1047 +jcw1961 +jcwtiger +jcy0yaqg +jd102406 +jd130548 +jd310198 +jd3t2 +jd43147 +jd5859 +jd5bnh6 +jd8 +jd8048 +jd834gfs +jd849 +jd96qhym +jda5767 +jdalgala +jdanielt4 +jdblue99 +jdd4j7k3 +jddc602 +jdeagy +jdelaine +jdgb0603 +jdgraff +jdh21h +jdiouia +jdjdjd +jdje +jdkfWi +jdkofajs +jdlcrrl +jdlsnpjd +jdnosa +jdo1791 +jdport +jdr811 +jdrjdr +jdrmicro +jdros13 +jds666 +jdsgx +jdt2008 +jdtlja8h +jdubya +jdw985 +jdwlyqwb +jdzooeyg +je11238i +je1851fn +je3260 +je43nva9 +je4els6 +je9235 +jeagar +jeah +jeajea +jean +jean +jean del +jean francois +jean jacques +jean louis +jean marie +jean paul +jean pierre +jean- paul +jean-claude +jean-daniel +jean-francois +jean-guy +jean-hughes +jean-hugues +jean-jacques +jean-louis +jean-louise +jean-luc +jean-marc +jean-marie +jean-michel +jean-paul +jean-philippe +jean-pierre +jean-pol +jean-yves +jean0410 +jean1006 +jean1ne +jeananne +jeandat +jeanette +jeanette +jeanette6y +jeanie +jeanine +jeanine anne +jeanluc +jeanmichel +jeanne +jeanne +jeanne fusier +jeanne marie +jeanne54 +jeannett1 +jeannette +jeannette lin +jeannie +jeannine +jeannine +jeanpaul +jeanpierre +jeansblau +jeantso +jeanv +jearnist +jeb +jeb7776 +jeb999 +jebac +jebacica +jebaka01 +jebako +jebalo +jebanie +jebitix0 +jebran +jec6918 +jecarove +jecca4000 +jece +jecols82 +jecplus +jecuseh +jeczatuv +jed +jeda69 +jedcairo +jedd5246 +jeddak +jeden5. +jedhs +jedi00 +jedi35 +jedi41 +jedi6 +jediknig +jedinstvo +jednicka +jedoens +jedrek234 +jedy +jeeez1 +jeep +jeep17 +jeep58 +jeep87 +jeep97 +jeeps2 +jefe21 +jeff +jeff +jeff0406 +jeff0827 +jeff24 +jeff5455 +jeff6862 +jeff99 +jeffer109 +jefferson +jefferson +jeffery +jeffgogo +jeffie +jeffifer +jeffrey +jeffrey +jeffri1984 +jeffro8989 +jeffw123 +jeflic +jegoapwt +jegoopa +jegqq +jehad +jehova +jehovah +jehovah1 +jehvexes +jeica03 +jeijei +jeiy1801 +jejdaman +jejeje +jejeje12 +jejejeje +jejijo +jeka9304 +jekaterina +jekatirina +jekker +jekyll1984 +jelaime122 +jelanie +jelc3 +jelek +jelena +jelena00 +jelenic138 +jelenie2 +jeliman +jelisaueta +jelle001 +jellebel +jello +jello1 +jello9 +jellow +jelly +jelly123 +jelly224 +jellybaby +jellybean +jellyjelly +jellytot +jelsik +jelszo +jem111 +jem777 +jema123 +jemaah +jemama +jembat +jeme12 +jemelle1 +jemidon +jemn2827 +jemoeder +jems234 +jemsdh +jemuzu +jen2103 +jen2870 +jen2baby +jen5em +jen825 +jen98 +jena +jenae3 +jenasis +jenbar +jenda83 +jendy0711 +jenette +jeni +jenie +jenifer +jenifer +jenine +jenisgay +jenitha13 +jenj1017 +jenji22 +jenlung3 +jenn +jenn251 +jenn4008 +jenna1708 +jenna1977 +jennandi +jennap75 +jennefts +jenner123 +jenni +jenni106 +jenni21 +jennie +jennie +jennie155 +jennifer +jennifer +jennifer jason +jennifer88 +jennings +jenny +jenny +jenny lee +jenny01 +jenny08 +jenny1 +jenny1617 +jenny23 +jenny3a +jenny57 +jennyspw +jennyver +jeno +jenova0703 +jenpitt +jens +jens +jens123 +jens3 +jens4 +jens98 +jensarn +jensdirk +jensen +jensen2299 +jenskoehler +jensmes +jensnina +jensolaf +jensomat +jenson07 +jenspiet +jensth +jentsch99 +jeoff +jeong7 +jeonne +jepjep +jepp76 +jeppe1313 +jeppesen132 +jeppesjeppes +jer14ea +jer1973 +jerbear1 +jere +jere2009 +jere333 +jered +jeremi0 +jeremiah +jeremy +jeremy +jeremy scott +jeremy12 +jeremy2275 +jeremy6693 +jeremyian +jeremysb1 +jerge +jeri +jeri lynne +jerichonokia +jerik91 +jeriryan +jerkey +jerkitou +jerkjerk +jerky13 +jerm9961 +jermaine +jermaine5 +jernis123 +jeroen +jeroen1970 +jerold +jeroma +jerome +jerome +jeromee1 +jeromy +jeromy85 +jerono +jerrad +jerri +jerrica66 +jerricho +jerry +jerry owen +jerry101 +jerry11 +jerry111 +jerry1145 +jerry12 +jerry429 +jerry8537 +jerryb +jerrylee79 +jerrys +jersey joe +jersey214 +jertjert +jerusalem +jery356 +jery88 +jerz3 +jerzy +jerzyb58 +jesaispo +jescz +jesepa +jeseto +jesica22 +jesicarabbit +jesjoker +jesmarel +jesparza +jesper +jesper2 +jesper4556 +jesperbank +jesperwolf +jesripig +jess +jess2374 +jess263 +jess6361 +jess87 +jessalex +jessalyn17 +jesse +jesse +jesse royce +jessedriscoll +jessee89 +jesselow +jesserogers +jessi1693 +jessi83 +jessica +jessica +jessica wight +jessica02 +jessica4406 +jessicab +jessicas +jessicaw +jessie +jessie +jessie lee +jessie royce +jessie3# +jessie99 +jessika +jessjoey +jesslyn +jessper +jessy1735 +jest3r +jester +jester357 +jester515 +jester69 +jester88 +jestinkt +jesuisbe +jesuit1 +jesus +jesus +jesus1 +jesus10 +jesus1958 +jesus25 +jesus4u +jesus6615 +jesus666 +jesus777 +jesusfreak +jesushe +jesusiano +jesusjesus +jesuspp +jesuss +jesussaves +jet05lon +jet123 +jet6870 +jetaime +jetblue11 +jete +jetfrosch +jethro +jetjet +jetlee +jetli81 +jetmira +jetovuxe +jetpilot +jetpilot1 +jetplane50 +jetsgirl +jetta +jetta01 +jetta100 +jetta911 +jettpuff +jetzt255 +jeudtksh +jeumpa +jevader +jew +jew123 +jewbag +jewel +jewfire6 +jewgenija +jewssuck +jexivd +jey1288 +jey8k +jezalin +jezerine +jezevec +jezoplod +jezz0729 +jf040785 +jf100400 +jf12824 +jf2009 +jfantasy +jfbelas +jfblf +jfcadmin +jfectts +jfeqtvs +jffid +jfghj +jflores5272 +jfn12426 +jfnvkd67 +jfo246 +jfo7x +jfp4242 +jfreney +jfrp2m +jfs4vm +jftkami6 +jfu3j +jfunsfvt +jfv31682 +jfvghg +jg646651 +jg8188 +jg88pgpd +jg8a89ft +jg98xuxl +jga2603 +jgadmin +jgd41y +jgerippo +jgfon +jghkgh +jgjode +jglqo148 +jgmu +jgnakpr5 +jgnuts +jgobm +jgp3981 +jgsgyyyy +jgyrywgh +jgzmmj +jh090701 +jh0c4rz +jh1129 +jh13kmpa +jh21ga +jh23dk +jh3835 +jh4161 +jh55555 +jh600113 +jh8972 +jhadmin +jhanley11 +jhassian +jhcarine +jheath22 +jhenjhen +jheras75 +jhgdmg +jhgyt +jhhbmj33 +jhhcf +jhhoakh +jhk789 +jhkrreie +jhnjgtl +jhnkvn +jhnobpp2 +jhobmwlu +jhonmar +jhonny67 +jhoyland +jhp17 +jhq0g +jhrs07 +jhs142 +jhsbe +jhshhhjh +jhu2cbs1 +jhunter +jhv6ir +ji-tu +ji394rmp +ji394su3 +ji3g4wei +jia +jia5g0mm +jiaime6f +jiajia348 +jialat +jian22 +jiangwp +jiangzemin +jianhua0724 +jianke +jiannx +jianya168 +jiapeyz +jiaqian3 +jiayong +jiba13 +jibeho01 +jibraeel +jichu1 +jidiro +jie1021 +jieb5c3q +jieruch +jif0462 +jif97gab +jiffi +jiffxp +jiga4392 +jigga +jiggy +jigogei +jigolo +jigsaw26 +jiguel +jigvaga +jiha +jihad +jihadist +jihen +jihmi +jiibay +jiji +jijiji +jijoja123 +jikijik +jikmik76 +jikol73 +jikoranu +jiktak +jil31lew +jil60qax +jilera +jilguero +jilkn21 +jill +jill +jill barrie +jill1002 +jill1030 +jill1106 +jill233 +jill520 +jillali +jillian +jillian418 +jillianhenry +jillskate +jilly123 +jillyan10 +jilrogal +jiltjilt +jim +jim +jim katugi +jim01 +jim23077 +jim3055 +jimao1994 +jimaze99 +jimb0b00 +jimbeam24 +jimbo0907 +jimbo1 +jimbo666 +jimbob +jimbob66 +jimbong +jimcary +jimena33 +jimena98 +jimenez90 +jimhenry +jimi +jimi +jimi99 +jiminy4356 +jimjim8181 +jimjupiter +jimkat14 +jimkn9 +jimmedan +jimmie +jimmiehart +jimmis0018 +jimmy +jimmy +jimmy carl +jimmy davis +jimmy wakely +jimmy00 +jimmy05 +jimmy10 +jimmy123 +jimmy999 +jimmybob +jimmyjack25 +jimmyjamal +jimmyjimmy7 +jimmynicole +jimney1 +jimoli +jimppa +jimsleep +jimu8n +jimzovax +jin yoo +jin21009 +jin97bap +jinamar +jincan123 +jine +jine +jingkai86 +jingou +jingwen17 +jingyan0705 +jingzhou +jinhe2007 +jinhu1981 +jinhua11 +jinhuili +jinjang +jinjin29 +jinky8 +jinlong9 +jinpachi +jinsona1 +jinuwin4 +jinx +jinx13 +jinxy +jinxy3 +jiomh +jioshua +jip4jan +jipjee +jiq42wid +jiretin +jiri +jirina +jirka +jirka02 +jirka474 +jirmb +jiro +jirung +jirwedim +jis5932 +jishidao +jisshof +jistow +jisujisu +jit1980 +jitgjitg +jitsuko +jivin' jacks +jiwan123 +jiwrastu +jixxer +jixxp +jiyunfei +jiz5jodx +jj0693 +jj083075 +jj1984 +jj211000 +jj216053 +jj3001 +jj42793 +jj52oc +jj8002 +jj8002 +jj8r3afg +jjajr +jjas1961 +jjcc2213 +jje0223 +jjffkkdd +jjfit888 +jjgt7188 +jjh37997 +jjh864 +jjinc123 +jjj123 +jjj650mb +jjjh2so4 +jjjh2so5 +jjjj +jjjjjj +jjjjjjj +jjk143 +jjk498 +jjmimijj +jjmpass +jjmwni +jjojjjoj +jjojut42 +jjokker +jjor69 +jjorge +jjp1116 +jjp2001 +jjp21169 +jjrty3 +jjs123 +jjseOp +jjshearin +jjuntti +jjwoaini +jjyppg +jk070549 +jk082a +jk111qqq +jk14325 +jk17887 +jk2701fv +jk287511 +jk287511 +jk28c4p +jk2pros +jk640689 +jk7077 +jk838bpb +jk9069 +jk910423 +jk980412 +jka2001 +jkauvseb +jkc523 +jkdhdkj +jkerty11 +jkf4ever +jkg159 +jkgfsdt +jkhvjkhv +jkill99 +jkje7se7 +jkjk7202 +jkkyyo +jkl +jkl41170 +jkl456 +jkl48ip +jkl8q +jklingx +jkljkl +jklm2222 +jklmmm +jklmnb +jkmok +jkmuf +jknvjfd +jkoAP9 +jkolnuke +jkshdjk3 +jkty9576 +jkuh675f +jkv31173 +jkzuu954 +jl031594 +jl101213 +jl12786 +jl1314 +jl141287 +jl5490 +jl6892 +jl69jl +jlaiz +jlalex +jlangley +jlaudio +jlaureng +jlb5776 +jlbpower +jlchrist +jld8y8zc +jldnt +jle7uyqr +jlee0255 +jlenny +jlf9tksi +jlh71984 +jli54088 +jlkjlk +jln1975 +jln4607 +jlojlo +jlopez17 +jlsanz +jlsmo +jlt135 +jlub6iec +jluk123 +jlvfg +jlxe5 +jm +jm0218 +jm0909 +jm102397 +jm111sg +jm197575 +jm240566 +jm3256 +jm3312 +jm3941 +jm840201 +jm8dm0g +jm931973 +jm9900 +jmaaaf +jmacmast +jmafwkvk +jmak9855 +jmartinez1 +jmau5 +jmax123 +jmbanu +jmbn96 +jmcp5506 +jmd7g +jmdark3 +jmeb +jmes1539 +jmfl6358 +jmhls +jmjayann +jmjm5236 +jmjoel +jmojo +jmoser +jmotl +jmpcsr +jmqykq +jmrnd +jmryc123 +jmt956 +jmt9566 +jmtj01 +jmw0424 +jmyym +jn120473 +jn450017 +jn8hik0k +jn9lb8m0 +jnakass +jnavarro64 +jnavas +jnbgew +jncncn +jnco69 +jncoskik +jndfkb +jndtw98d +jniedenh +jniqaw1t +jnjudq +jnm72698 +jnuflfq +jnva4 +jnvjs628 +jo +jo +jo ann +jo anne +jo-carroll +jo15li26 +jo2009ck +jo211270 +jo4067mo +jo438840 +jo890505 +jo980711 +jo99em +joachim +joachim +joacim11 +joaker +joakim43 +joakimswe +joako123 +joan +joan +joan brodel +joan63 +joana083 +joana22 +joanainga +joanhi78 +joanie +joanjoan +joanna +joanna +joanne +joanne +joanne moore +joanne4434 +joanneb1 +joao +joao2309 +joaoma +joaquim +joaquin +joaquina +joatnohe +job100 +job314 +jobanas +jobbig454 +jobeth +jobob911 +jobrhm +jobrida +jobweb +joby +jobyna +joce +joce777 +jocelyn +jocelyn9 +jochen +jochen29 +jochjoch +jochozof +jocika +jocj000 +jock +jock8492 +jocke +jocke77 +jockel +jockelol +jockelts +jocken +jocker +jocks2010 +joconde +jocr0028 +jocser1a +joctopus +joda1948 +joda6 +jodajoda2 +jodazati +jodeci420 +jodels +joden +jodenkoek +jodete +jodi +jodie +jodokjodok +jodsalz +jody +joe +joe +joe don +joe jay +joe zammie +joe1173 +joe13260 +joe1609 +joe2160 +joe233 +joe32ged +joe360 +joe61178 +joe9652 +joebob620 +joechan +joed12 +joeee +joegle +joejoe +joejoe0110 +joejoe63 +joel +joel +joel1020 +joelj3 +joella +joelluka +joelrush +joely +joemama +joepie +joer87 +joerg +joerg +joerg8848 +joergen +joerijoeri +joesatriani +joesbrand +joeseph +joetech +joetyson +joey +joey +joey123 +joey1234 +joey2001 +joey@@ +joeydc22 +joeylee17 +joeysmail +jofano +joffer +joffer1 +joffrey +jofisk +jofre +jogan007 +jogi06 +jogi59 +jogo1018 +jogurts22 +joh +joh316 +joh318 +joh41nei +joha01 +johali +johan +johan +johan.8 +johan0319 +johan1 +johan73 +johan8262 +johan94 +johankj +johann +johann +johann7 +johanna +johanna +johannastadler +johannes +johannes +johannes1 +johannes93 +johannis20 +johans +johanv +johele +johhn +john +john +john allen +john barrymore +john bennett +john bill +john blythe +john cameron +john charles +john clellon +john david +john davis +john doe +john drew +john edward +john glyn +john graham +john henry +john howard +john lester +john mack +john maxwell +john michael +john paul +john phillip +john red +john ringling +john scott +john skins +john van ness +john war +john webb +john william +john0268 +john0815 +john12 +john123 +john1335 +john2338 +john2580 +john316 +john3v16 +john4002 +john4852 +john5291 +john612 +john707 +john770 +john856 +john9876 +johnWayne +johnaa +johnadam +johnbow +johncane +johncena +johndoe69 +johnflieger +johngoll +johnie13 +johnira +johnjohn21 +johnk +johnlee2418 +johnnie +johnny +johnny +johnny lang +johnny mack +johnny mark +johnny55 +johnny70 +johnny9 +johnnycakes1 +johnnyj +johnnykebab +johnnyou +johnsk02 +johnson +johnson2 +johnston +johnston1425 +johnwec +johnwoo +johny +johny +johny mack +johny222 +johny777 +johnyboy +johnyf +johnyjohny +johnzerg +johs +johsaari +johsio +johthe +joi +joi2kmhi +joicy9 +joie +joiilkk2 +join +joinme +joinnow +joint010 +jointrans +joinus +joissa93 +joj65ref +jojacufo +joji +jojidom +jojo +jojo +jojo0111 +jojo1221 +jojo1993 +jojo206 +jojo3486 +jojo420 +jojo5656 +jojo604 +jojo6676 +jojo678 +jojo91 +jojo9568 +jojobaer +jojoboink +jojodu95 +jojojo +jojojojo +jojole44 +jojomusen +jojoshop +joka1410 +jokedick +jokeit43 +joker +joker0 +joker1 +joker111 +joker123 +joker20 +joker247 +joker321 +joker4 +joker657 +joker69 +jokerusia +jokipuro +jokk +jokkemor +jokker +jokle9b +jokoasd1 +jokohama +jokolove +joktar +jokulima +joky22 +jokyy +jola0308 +jola6969 +joladu +jolaika +jolana +jolanta +jolanta +jolanthe1979 +jolaol58 +jolas0000 +jole +jole +joleenma +jolie1 +jolie1950 +jolien5565 +jolin7410 +jolin811 +jolineko +jolink +jolita +jolleen +jolliboy +jollie +jolly0615 +jollyj +jollyjumper +jollyroger5 +joloma +jom +jom121 +jomacho +jomagam +jomamma +jomare12 +jomark4 +jomf7676 +jomima +jominga +jompa1337 +jomqowut +jon +jon +jon-erik +jon2672 +jon2go +jon589 +jona +jonah +jonah1234 +jonahman +jonas +jonas +jonas11 +jonas1404 +jonas18 +jonas8835 +jonasb +jonash +jonasjonas +jonaso +jonata +jonathan +jonathan +jonathana02 +jonathon +jonatlin +jonder1992 +jone +jone +jone2ec +jones +jonesboggy +jong hi +jongol +joni +joni +joni996 +jonjon +jonkent +jonkhg45 +jonmatt +jonn +jonnie +jonny +jonny05 +jonopa +jonsie1009 +jonson71 +jonsson +jonte1337 +jonte4673 +jonvel +jookie123 +joola +joom11la +joomarci +joomla +joona1 +joona2003 +joona69 +joonnojo +joopajoo +joos123 +jooseppi123 +jopa123 +jopatome +jopcis +jopetas +jopforig +jophilli +jopik +joplayer +joprupho +joq14ber +jorabe +jordal10 +jordamy +jordan +jordan +jordan07 +jordan1407 +jordan16 +jordan23 +jordan28 +jordan3 +jordan4424 +jordanian +jordanssith +jordanty +jordev +jordi7351 +jordie809 +jordiperez +jordon +jordon12 +jorge +jorge +jorge martinez +jorge molina +jorge rivera +jorgecorreia +jorgeoo7 +jorgito +jorie +jorina12 +joris +jorita +joro1 +jorp12 +jorredev +jorvey +jorvlon +jory +jory89 +jos +jos67tiv +josaali2 +joschi +joschi2929 +joschka9 +jose +jose alonso +jose carlos +jose chavez +jose clemente +jose elias +jose gomez +jose lopez +jose luis +jose manuel +jose marco +jose marfa +jose maria +jose mariano +jose mojica +jose pena +jose perez +jose vicente +jose-luis +jose123 +jose456 +jose71 +josean03 +josef +josef +josef0506 +josefa +joseffff +josefina +josefina90 +josefine +josefine10 +josefwitt +josejuan +josemaria +josep +joseph +joseph +joseph086 +joseph1005 +joseph12 +joseph1369 +joseph5? +joseph6 +joseph86 +joseph927 +josephine +josephine +josephle +joserafa +josette +josh +josh +josh1114 +josh123 +josh1969 +josh7410 +joshab +joshhd +joshjosh4 +joshlane +joshmak +joshtice +joshua +joshua +joshua1019 +joshua23 +joshua67 +joshua8 +josi +josiane +josibig3 +josie +josie001 +josieown +josine +josip210 +josipdc +josiptel +joskirk +joso2206 +josoua +josquin +joss +josseline +jossiane +jost +joster1991 +joszef +joszko28 +jota101 +jota2004 +jotabranco +jotain123 +jotes +jotunheim1 +jotwe +jouet680 +joulia66 +jouqyg +jourdin +journey +jovan +jovan285 +jovani2002 +jovgakiw +jovi69 +jovi71 +jovy911 +jow +jowal +jownivar +joy +joy +joy askew +joy0645 +joy1208 +joy1969 +joy5000 +joy621 +joyajose +joyan +joyan53 +joyce +joyful01 +joynaruk +joyous +joysbead +joza +jozan1992 +jozef +jozef +jozef666 +jozfubak +jozo +jozo +jozo1234 +jozsef +jozxyqk +jp +jp079 +jp112 +jp1313 +jp1542 +jp230785 +jp2406 +jp5711 +jp69jp +jp7406 +jp780903 +jp7872xx +jpaulg +jpbcsw80 +jpdelx +jpen01 +jpet2mqf +jpf2p +jpf6524 +jpgr64 +jpgterra +jph1206 +jpiszla +jpjm1127 +jplcm +jpm1029 +jpn42f9 +jpnk4400 +jpnova +jponline +jpp374 +jppg4757 +jppmbh +jps +jps6223 +jpsan06 +jpsdpc82 +jpyicq +jq3jkv +jq4ever +jqadmin +jqbhtcgv +jqeqa +jqflo +jqr617 +jqrfhvk +jqtwso +jqztd +jr14072 +jr1492 +jr222 +jr2811 +jr291299 +jr4218lq +jr6042 +jr66x +jr6qj0 +jr8371 +jrap6666 +jrbmlf88 +jrc2z +jreviews +jrgaylor +jrhubbell +jrivera11 +jrkthw1 +jrlinh +jrm100 +jrose1988 +jrq0lo0k +jrqyb +jrs968 +jrsaints +jrsnrn05 +jrtorna +jruKga +jruner1 +jrvzd +js070290 +js0732 +js1214 +js167259 +js1955 +js1990 +js2013 +js2049 +js210283 +js2306 +js2900 +js4300 +js696969 +js84l3 +jsatm5 +jscott24 +jscriptcss +jsdsj +jse0305 +jsg2e +jsgg69 +jsgxu +jsharp19 +jsjk2 +jsm1j +jspyrk77 +jsrjfeq +jstclair +jsung +jsw42 +jt101159 +jt111469 +jt122588 +jt12badd +jt18245 +jt240876 +jt300495 +jt3stat +jt4an98 +jt78re90 +jt84fy6g +jtace123 +jtadmin +jtanner +jtaw +jtbclan +jtbjrb +jtc0i +jtenam +jtj36 +jtjelery +jtlrwe +jtmcindy +jtmmatoo +jtompok +jtselect +jtsg2 +jtsongge +jtthis +jtyu9 +ju +ju#230104 +ju0980 +ju101186 +ju12ne92 +ju13ju +ju18nm +ju1cebus +ju5rktg0 +ju5t22 +ju5ty5i4 +ju6611 +ju6q7 +ju8fr4 +ju95i4p4 +ju9sy6qm +jualapt +juamaisa +juampi +juan +juan +juan antonio +juan carlos +juan cristobal +juan garcia +juan jose +juan manuel +juan pablo +juan1010 +juan133 +juan1818 +juan2002 +juan246 +juan2573 +juan33 +juan98 +juanes +juanette19 +juanin +juanita +juanito +juanito1 +juanjo +juanjo +juanjo85 +juanma +juanma01 +juanmm07 +juanmp +juano +juanpablo2010 +juanq22 +juansito +juas +juas10 +juasjuas +juaslol +juaxx +jubar +jubbajubba4 +jubby7806 +jubei +jubekar +jubeltru +jubercik +jubilee1978 +jubin123 +jubiraca +juca +juccdk +juccifuj +jucg +jucien +jud +judacris +judas12 +judas4hq +judd +jude +jude +judejude +judentum +juderith +judge +judge997 +judgement12 +judi +judie +judihui +judit +judite +judith +judith +judith00 +judlum +judo11 +judo1107 +judo39 +judoaap +judoka13 +judokwai +judson +judy +judy ford +judy garland +judy1111 +judy1989 +judy9585 +judyard +judyd0g +judyfreak +jue7d +jueg0sxl +juemguma +jueppes +juer18 +juergen +juergen +juergen18 +juergen20 +juergen32 +jueron +jug666 +jugbetec +jugeen7 +jugehas +juggalo +jugger101 +juggernaut +jughead1 +jugimas +jugus1 +juh32ra +juh4n1 +juhani +juhani79 +juho90 +juhu +juhu1234 +juhu2011 +juin72 +juinweit +juissi88 +juja213 +jujep +juju +juju02 +juju0709 +juju16 +juju93 +jujubibi +jujuju +jujujuju +jujukaka +jujukiki +juk07waf +juka1juka +jukebox +juki +jukka23 +juku112 +jul0690 +jul117 +jul2ien +julann +julanne +julcel +julchen +julchen06 +jule +jule2012 +jule2910 +juleaften24 +juleim +julekake +jules +jules +juletid1 +juletre +julette +juli +juli +juli007 +juli123 +juli1309 +julia +julia +julia caba +julia swayne +julia03 +julia0904 +julia14 +julia8881 +juliaa +juliabcn +julian +julian +julian01 +julian16 +julian4us +julian553 +julian89 +juliana +juliana246 +juliandj +juliane +juliane! +juliane80 +julianeT +julianna +julianne +juliano +juliansimon +juliauma +julidine +julie +julie +julie ann +julie swayne +julie01 +julie123 +julie925 +juliedal +julien +julien +julien10 +julien12 +julien13 +julien44 +julies01 +juliet +juliette +juliette +juliette1977 +juliezen +julihans +julija +julina +julio +julio perez +julissa manuel +julita +julite +julius +julius00 +juliy +jullan2003 +jullex +julli56 +julmust +jultomte11 +jultomten111 +july02 +july16 +july19 +july1979 +july2173 +july2784 +july793 +julysecond +jumacaca +jumala86 +jumalau +jumama01 +jumbo +jumjuj +jumjum +jump822 +jumper +jumpers123 +jumpjoy +jumu25 +jun +jun-kyung +jun45gle +jun7586 +junajuna +junak1 +junchan +junctioncity1 +june +june +june1946 +june1959 +june2003 +june22 +june2384 +june2582 +junejuly +junero +juney +jung +jung1004 +junge +jungfrau +jungfrau1 +junglemo +junglism +junie +junie1982 +junigy +juninho +juninio +junio07 +junior +junior +junior12 +juniorb +junjie1011 +junjun +junkenyc +junkey +junkichi +junkie +junkjunk +junko +junky +junmao +juntheking +juntti12 +junus55 +junya +junzaburo +juockis +juonukas +juosas +juozas +juozukas +jupak97 +jupiler +jupios +jupiter +jupiter7 +jupiterc2 +jupjup +jupp +jupp13 +juppi2800 +juppidu +jupsadri +jur0310 +jura123456 +juraforum +juragan +juragis +juraj +juraland +jurandot +jurart +jurassic +jurate +jure58 +jures33 +jurgen +jurgen +jurgen11 +jurgen4800 +jurigag +juris1669 +jurjur +jurkje69 +jurriaan +jurrine1 +jurte384 +jus01tin +jus1405 +jusepe +jushi14 +jussara2 +jusse +jussi81 +jussiopi +just0125 +just05 +just07 +just1710 +just4u2 +justbird +justdoit! +justdoitwow +justel +juster +justgiveup +justice +justice143 +justice2k8 +justicia +justin +justin +justin1 +justin1126 +justin12 +justin5 +justin65 +justin7640 +justin90 +justinas +justinb +justinb7 +justine +justine +justine918 +justinhg +justino +justiver +justme +justor87 +justulka +justus2894 +justy002 +justyna +justyna1 +justynka +justynka2 +jutaro +jutbox +jutemupo +jutland5 +jutohech +jutooo +jutsu +jutta +jutta#1 +juttatel +juttl14 +juu7A5 +juuhach18 +juvcexow +juve05 +juve1234 +juventus +juventus1 +juvep1 +juvex3 +juvina +juxian66 +juynedud +juz20kon +juzcu +juzek1 +juzik99 +jv001638 +jv123 +jv6t8bxp +jv7415 +jv7756 +jv801278 +jv97 +jvanas +jvc321 +jvdlippe +jvgbf2ii +jvhack +jvhuatai +jviNM +jvjacs +jvkao +jvl1313 +jvmlf +jvn11 +jvplhcit +jvvk1110 +jvvkn1z1 +jvvv7 +jw032571 +jw050763 +jw123 +jw1301 +jw1604 +jw23olo +jw244805 +jw7092 +jw7726 +jwaabgba +jwb4p +jwdrlkar +jwe84w23 +jwk2s +jwl7481 +jwm0666 +jwmiller5 +jwnet888 +jwoalla +jwwhoami +jwzggft3 +jx5am9vn +jxgnmf +jxgv5 +jxladmin +jxowns +jxrfhbr +jxw3eok6 +jxw7g21 +jxxs7 +jxy2 +jxziwcro +jy10929 +jy12jy12 +jy22f8tc +jy4vsd4w +jyae38 +jyaegel1 +jyb7p +jyb8op3i +jycm2 +jyh3389 +jylland02 +jyn32Y +jyonline +jypkb +jysmurf +jyu100 +jyuzo +jywms +jywok2z5 +jz3yk76w +jzfzf +jzggq +jzgz7xtj +jzk311 +jzmyk +jzrxfwq +jzs9y +jzsrobxb +jzu454 +jzwfa +jzx7q +jzysn +k +k0000 +k010777w +k0501365 +k09s48n +k0bbg +k0d1k0s +k0hle +k0k0mik0 +k0k7k9k9 +k0kamo +k0m0rka +k0n4et0 +k0nijn +k0pete +k0rn98 +k0valchuk +k0vw0t3r +k0zcelik +k0zmand0 +k10252004 +k112399 +k1171779 +k123456 +k124095 +k12883h +k131198k +k13m14 +k14589 +k15274318 +k159357k +k1664 +k184n +k1Ds +k1a5k9 +k1bm36 +k1ff3r +k1fryy +k1j6yqaq +k1ju2 +k1k1k1 +k1lhc0hc +k1ll3rp3ngu1n +k1ller +k1llm30k +k1oors +k1rsten1 +k1sm3t +k1t0ki +k1tchen +k1tt3n5 +k1tty +k200176 +k20308 +k219059g +k21jpcgq +k22888822 +k22f83 +k22rnel +k23499ge +k250648i +k2610mt +k271089p +k282i +k291084 +k2axis +k2dad69x +k2dhlam7 +k2g2hsuf +k2j6sh +k2ohx +k2rtc +k2sp3r +k30559k +k310172t +k3221727 +k32325 +k32s44 +k3357841 +k33ff3 +k33l34 +k33p0r +k33s3y +k33tng +k369258 +k3789456 +k3ae7i8 +k3fpoD +k3hhticp +k3l3m3n7 +k3nshin +k3rb3r06 +k3rb4ng0 +k3rnramp +k3rr13 +k3uk1 +k3wud +k3yb04rd +k4176675 +k439ful +k442649 +k45r3 +k463u +k46yt8k +k48kgxcp +k4cz9 +k4d3n +k4fk4esk +k4hv +k4k4dura +k4k4k4 +k4ktus +k4ll3 +k4m1 +k4m3ll0s +k4mgiat0 +k4ndep0r +k4nk3r +k4p1t4n +k4pus1 +k4r0l3k +k4r4luch +k4rn3v4l +k4t4n4 +k4tr1n +k4v7q9n0 +k4yakstu +k52307527 +k55jaj3r +k561me6 +k57pf5 +k5af1lqn +k5afi +k5bj5dia +k5blazer +k5cr7jhl +k5et9 +k5fwg +k5nxe +k5p3q8 +k5r2a0m7 +k5v6fs3h +k5voq +k5wdb42 +k5xpjn +k5z5wf2m +k65626541 +k664757 +k6jsp +k6tjp +k6vf4udv +k6xsi +k70539 +k70j59ef +k71964n +k754rx2 +k7573z +k75hzb2g +k76m2qqe +k786dt +k7fch088 +k7fpp8v1 +k7gmk +k7lb35m +k7nbp +k7s41gx +k7thy +k7xhrhpu +k7ygny +k8196l +k8244025 +k8509o +k8515115 +k8530857 +k8dqc +k8dsh2nj +k8jryc1m +k8k6k8 +k8mnj0 +k8qa2w9 +k8rm0vfj +k8thie +k8tmi +k8tzv8tz +k8y9r8y7 +k9 +k9079k69 +k91147h +k91313 +k916928 +k925v +k93r16 +k944321 +k94679 +k94cgfu +k956764 +k9cv28 +k9frend +k9hiphgs +k9k9k9 +k9moores +k9qmp +k9qqo +k9treet +k9utgum4 +kApstAdt +kAraTu +kAzek +kFc8b2 +kFqzcj +kZMnGR +ka0418 +ka0x +ka121075 +ka1mi2 +ka22ka +ka2401 +ka2vtm +ka332dir +ka35i +ka3pv6 +ka57x34s +ka6214 +ka6atn5 +ka77ee +ka90saj +kaTrin18 +kaZewo +kaa2002 +kaalikas +kaamwali +kaan +kaan123 +kaan4307 +kaan748 +kaanabi +kaanberk +kaankan +kaare +kaaren +kaarlo +kaartje1 +kaasboer55 +kaasdoek +kaaskop +kaasu12 +kabakero1 +kaban21 +kabara +kabazso +kabcj +kabel +kabi +kabil11 +kabina +kabir +kabir +kabjn +kablam1 +kablane +kablitz +kabo456 +kaboom +kaboom007 +kabre12 +kabuki430 +kabum +kabuq +kabuus +kachal +kachel22 +kachelofEn +kachi +kacir125 +kacke +kacken +kacken90 +kacknap +kacksack +kackwort +kacper2007 +kacper7 +kacperek +kacukt02 +kaczka1 +kaczop +kaczor3e +kaczp +kaczuka +kadanjad +kadash12 +kaddir66 +kader +kaderim +kaderka +kadetcip +kadiedra +kadios +kadir +kadirim +kadjelto +kadofur +kadosz +kadr234 +kadri +kadry +kady +kae8143 +kaedron1 +kaefer +kaefer1303 +kaeferland +kael8 +kaelhula +kaemon +kaena22 +kaesejogi +kaesong12 +kaethe +kaew2006 +kafb92xg +kaff33 +kaffe01 +kaffe916 +kaffee +kaffeesuechtig +kafke +kafke13 +kafkefo +kage1010 +kagelari +kagerou +kagestly +kagge1 +kagkag85 +kagome +kagome20 +kagran +kahin +kahitano +kahlan +kahless1 +kahlil68 +kahlua777 +kahmann88 +kahn2560 +kahraman +kahuna +kahyaman +kai +kai +kai138 +kai1985 +kai8127 +kai91 +kaiabp +kaiba +kaichan0 +kaichen0 +kaichiri +kaicho +kaicolo +kaid al +kaida +kaiden817 +kaifeng3166 +kaifun +kaije123 +kaikai4 +kailasha +kaileah4 +kaileigh8 +kailey +kailis +kaily1202 +kaimas +kaimaz +kaimuk +kaimynai +kainito001 +kainoa1223 +kaioken1 +kaipokki +kaiqexxm +kaiser +kaiser2k +kaisey0713 +kaishin28 +kaisi +kaiti1984 +kaitlyn +kaitlynn16 +kaito +kaitou24 +kaiwei67 +kaizer9893 +kaizoku0u +kaj +kaj24den +kaj30rqt +kaja1141 +kajak +kajarkajar +kajetask +kajiparolata +kajko88j +kajls2 +kajman +kajmeran +kajmeren +kajou97 +kajtek109 +kajtus13 +kaka +kaka123 +kaka22 +kaka38 +kaka8888 +kaka99 +kakaap2 +kakadoener +kakadu +kakadu1 +kakadu14 +kakady +kakag1010 +kakaka +kakaka +kakakaka +kakali +kakali1 +kakalot +kakamaka +kakamasi +kakaop +kakarot +kakaroto +kakas123 +kakashi +kakashi157 +kakazas +kakdila? +kake +kakekake +kaki +kaki01 +kakimufi +kakka +kakka1 +kakkeli +kakker321 +kakman77 +kaknac89 +kako88 +kakseks +kaktanten +kaktus +kaktus1 +kaktusas +kaktuse +kaku1300 +kakukk +kakumei01 +kakusius +kakya24 +kal8f +kala +kalaa1 +kalaauto +kalabida +kalafior1 +kalahig +kalakukko1 +kalakuta +kalala +kalamaja +kalamar +kalamarx +kalamazo +kalamees +kalanlar +kalap321 +kalaska +kalaskam +kalavod +kalbasa +kalber46 +kalcoqok +kaldoran +kaleb0905 +kaledos +kaleeb74 +kaleid76 +kaleighlo +kaleka21 +kalem +kalemon2 +kalen +kalendar +kalendars +kalender +kalerden +kaleri123 +kaley1 +kalg00rlie1 +kalgegil +kalhan1326 +kaliber +kalidoss124 +kaligula +kalimantan +kalimd0r +kalimera1 +kalimera67 +kalimero +kaline01 +kalinin +kalion1 +kalipek +kalirode +kalispera182 +kalissia +kalisto +kaliuxa +kalix78 +kalla +kallaber +kallangen1 +kalle +kalle0788 +kalle320 +kalleatm +kallech +kalleost +kalliche +kallies +kallike +kallinip +kallis12 +kallistomoon +kallkopf +kalman +kalonike +kaloryfer +kalos +kalsuri +kalte132 +kalter +kalu +kalu427 +kalupka +kalusek +kalvar12 +kalvey +kalvito +kaly +kalynda1 +kam +kam fong +kam1kaz3 +kam4gav2 +kam52nus +kam98lar +kama1974 +kama2012 +kamakai +kamal +kamal el +kamal1ha +kamalkamal +kaman123 +kamarada89 +kamasu30 +kamasutra +kamasutra9 +kamatari +kamazas +kamber05 +kambiz +kambizk +kameha12 +kamehameha +kamela69 +kamelotsh +kami1120 +kamikadze +kamikase +kamikaz +kamikaze +kamikazze2 +kamil +kamil11 +kamil12 +kamil123 +kamil2 +kamil66 +kamil93 +kamila +kamila1 +kamilion +kamilka3 +kamilkos +kamilla1 +kamille +kamims +kamine +kamineko +kamingoy +kamino33 +kamis +kamisia +kamiss +kamiyama1 +kamiyu7 +kamkam20 +kamla +kamocho +kamote +kampabo +kampala +kampari +kampas +kampf1 +kampmann +kampret +kamptrad +kamran8241 +kams2110 +kamthorn +kamub +kamui64 +kamui89 +kamuran +kamuve +kamyk123 +kan-chi +kan40set +kana18 +kanabis13 +kanacke +kanada +kanaeru4 +kanako +kanald +kanalia +kaname +kanarie12 +kanarini +kanastah +kanavosz +kanberra +kanchit +kanciapa +kandcfe2 +kandemir +kandi118 +kandice +kandye +kane +kane +kane2119 +kane2824 +kanefann +kaneko +kanenod +kanerva +kanet111 +kang ju +kang14al +kangaroo2 +kangas95 +kangbud +kangoo +kanguber +kangyu04 +kani123 +kanibalismus +kanibirk +kanida2 +kanika +kanin3 +kaninchen +kaninchen5 +kaninen34 +kaninos +kanior6 +kanis2044 +kanji51 +kanjuro +kankam +kankam21 +kankara +kankerkanker +kankikanki +kankiler +kanman294 +kanonarles +kanozud +kansai426 +kansas +kansas88 +kanske +kantalop +kantar +kantarell1 +kantate +kantboll +kantin +kantom88 +kantor13 +kanu +kanu55 +kanuni61 +kanupolo +kanur +kanutomi +kanya +kanz2001 +kanzor +kao +kao44 +kaoriyae +kaoru417 +kaos03 +kaos1122 +kaos4u +kaosrap +kaotic +kap4eb +kapak1 +kapamike +kaparede +kapaun5! +kapec18 +kapey1980 +kapilan7 +kapital7 +kapitu +kapl0mbe +kaplan +kapok123 +kapolei +kaporta +kappa001 +kappa1 +kappa3pi +kappa90 +kappar0x +kappas +kapra235 +kapseli +kapt0l +kaptue +kapue92 +kapuha +kapunn +kapuskasing1 +kaq2i +kar +kar +kar123 +kar23975 +kar26 +kar65915 +kar89puz +kar98k +kara +kara187 +kara1te2 +karaa12 +karabas +karabiner +karabold +karaborsa +karaca +karachi2010 +karafan +karagul +karagy +karahana +karainci +karak055 +karakat13 +karakter +karalane22 +karalho +karam621 +karamba +karamba1 +karamba98 +karambar +karamela +karamellbonbon +karamia110 +karanliks +karaoke1 +karas01 +karashu1 +karasikss +karat102 +karat123 +karatay +karate +karate2 +karate24 +karate2d +karate32 +karate67 +karate99 +karateka6875 +karavan +karaze05 +karazhan +karberk1 +karbeyaz +karbon +kardel2 +kardelen +kardelyte +kardo88 +kardon +kare0102 +kare3962 +kareebu +kareka +karel +karel +karel007 +karelkat +karelmaj +karen +karen +karen lynn +karen randers +karenjav +karenl1m +karenner +karexpen +karharas +kari +kari +kari123 +karibik +karic201 +karih +karikatur +karim +karim +karim68 +karin +karin +karin1561 +karin308 +karin6da +karina +karina +karinaj +karinaliv +karindb +karine +karinheile +karinka +karioka +karis1989 +karis1o +karismaf3 +karizma +karkar +karkel2 +karkki90 +karkoqe +karl +karl +karl gunnar +karl heinz +karl killer +karl ludwig +karl michael +karl otto +karl wright +karl-arne +karl-heinz +karl003 +karl123 +karl1234 +karl13 +karl1715 +karl2005 +karl5678 +karla +karlbird +karle91 +karlheinz +karlheinz +karli36 +karlinge +karlkani +karlludwig +karlmay1 +karlmjb +karlo +karloos +karlsruhe75 +karlsson12345 +karlsson22 +karlsson767 +karlsson87 +karlsson92 +karlstad +karlton +karma012 +karma100 +karma5601 +karma95 +karmar87 +karmara +karner28 +karniman +karnin2007 +karnkrub +karnov +karo +karo1992 +karo23 +karol +karol +karolbsh +karolcia18 +karolin +karolina +karolina +karolina123 +karolina97 +karolis +karolw +karoly +karolyn +karool +karote01 +karott05 +karper15 +karpfen +karpiles +karpuzum +karr +karr1524 +karrah33 +karro9 +karroum ben +karson2512 +karsten +karsten +kart33 +kartal +kartal. +karteluszek +kartenhaus +karter29 +karting35 +kartoffel +kartofle +karton88 +kartusche +kartusz1 +karuna108 +karunel +karuro11 +karusele +karuzela +karves +karvinen +karvuzes +karylou +karyn +kas +kas100 +kas11ok +kas79per +kasa2776 +kasabian +kasandra +kasanimo +kaschel +kaschtin +kasden +kaseta77 +kash6888 +kashareza +kashgar81 +kashmir +kasi25 +kasia +kasia +kasia1 +kasia11 +kasia33 +kasiaj1 +kasihu2 +kasiisak +kasima +kasimir +kasimirdicker +kasiunia +kaskus +kasonia87 +kaspar +kasparas +kasper +kasper +kasper00 +kasper094 +kasper11 +kasper2508 +kasper911 +kasperdana +kasperth +kasra +kasra515 +kassala1975 +kassandra19 +kassap65 +kasse +kassel +kassespar +kassidy20 +kasslol +kassouni1 +kassy629 +kastamonu +kastana +kaster09 +kastriotti +kastyork +kasu1234 +kasuko +kasunmu +kaszanka +kaszanki2 +kaszc +kasztan +kat020 +kat111 +kat3714 +kat4n4 +kat50soq +katabatu +katach +katakata +katalia5 +katalin +katalin +katalogas +katalonia +katana +katana4 +katana400 +katarina +katarina +katash21 +katastrophal +kate +kate +kate mac +kate222 +katedra +kategori +katelyn94 +katelynf2 +kateness +kater23 +katerina +katerina +kateron +katers78 +katertobi +kateryn +katgmk +kath9882 +katha2005 +katha7 +kathanina +katharina +katharina +katharine +katharine +kathe +kathead1 +katherine +kathi +kathi350 +kathi6685 +kathie +kathina +kathleen +kathleen +kathleen6 +kathlyn +kathmarc +kathome +kathrin +kathrin +kathrin clare +kathrine +kathryn +kathryn +kathryn clare +kathy +kathy1 +kathy1992 +kathy51 +kathylvy +kati +kati +kati09 +kati1981 +kati1a +katia +katia +katie +katie1 +katie2 +katiemoe +katimp +katina +katina98 +katinas +katinas044 +katja +katjekai +katlind +kato +kato1313 +kato1337 +kato2008 +kato22 +katolikus +katoomax +katorse +katoussi +katp8429 +katren +katrien1 +katrin +katrin +katrin58 +katrina +katrina +katrina1214 +katrine +katrinia5 +katrinstern +katruli +katsaounis1 +katschi +katsuya +katt +katt10 +katta +katta70 +kattan +kattekes +kattemat +katten +katten137 +katten1997 +katten98 +katter15 +katty56 +katubecy +katun2 +katvobek +katy +katya +katya1992 +katyra18 +katytja +katze +katze! +katze1# +katze123 +katze456 +katze58 +katze84 +katzen +katzen6 +katzkatz +katzmatz +kaubummi +kauf1808 +kaufen2005 +kaufmann +kaukimia +kaunas +kauno1 +kaurak23 +kauttaja +kavabup2 +kaval +kavala +kavanaru +kaverno +kaviyoor +kavoks +kaw9naca +kawa2001 +kawak +kawalsky +kawasaki3136 +kawasuki +kawcia82 +kaxa1627 +kaxz +kay +kay kyser's +kay tong +kay16lyn +kay1972 +kay417 +kay697 +kay7272 +kay8599 +kaya123 +kaya589 +kaya61 +kayacanz +kayak +kayaker +kayako +kayakp5 +kayalodge +kayanugz +kaybie +kayder12 +kaydo1966 +kaye +kayemel +kaykar15 +kayla0825 +kayla12 +kayla1987 +kaylas22 +kayle4me +kaylee +kaylee1032 +kayline13 +kaylum +kaymarie4 +kaymber +kayode99 +kayoko +kayoshin +kaytek +kaytlin19 +kaz0219 +kazaa? +kazaaa +kazacnac +kazak4816 +kazakaza +kazam +kazama +kazanova +kazanski +kazbegi +kaze05 +kaze2ma +kaze8241 +kazik +kazik17 +kazikas +kazim +kazimierz +kazin099 +kazinski +kazkaz +kazkokia +kazlas +kazuhito +kazukazu +kazuki +kazuko +kazuo +kazuya +kazuyoshi +kazzkazz +kb1711 +kb208574 +kb2888 +kb5005 +kb5328 +kb5jit +kb663636 +kb68yb70 +kb7587 +kb85025 +kb98 +kbabe1 +kbc9r2 +kbcd1401 +kbckey +kbe55y26 +kbi +kbibetta +kbj +kbjgxlm1 +kbplzthx +kbrendan +kbro49 +kbronzp +kbscphpw +kbsn78ga +kbt145 +kbthnh +kbtoys2 +kbv +kbw7rs2x +kbxtne73 +kby1rult +kbyuq +kc080806 +kc101006 +kc123456 +kc159951 +kc1ulu +kc2003 +kc291911 +kc35822 +kc4h6 +kc7ihe +kcaz777 +kcbagas +kcdb0 +kceckcec +kcg3fj0237 +kcgirl +kchs3122 +kcicliff +kcin +kcinx +kcn911 +kcoutlaw +kcp210 +kcp8410 +kcs888 +kcss919 +kcstyzpv +kcsylwia +kcwtch13 +kcx62 +kd0n6 +kd124764 +kd1511 +kd191982 +kd297362 +kd547 +kd75nhj +kd8710 +kd94jfe +kdabra +kdak7kll +kdb1854 +kdeoov +kdihgg +kdjd +kdjfhg +kdju5pq3 +kdlmdl23 +kdlttv01 +kdm28log +kdm3811 +kdn54iks +kdr39ai +kds110 +kdsgce18 +kdteste +kdw2005 +kdx200 +ke +ke huy +ke1062ry +ke150378 +ke1k8 +ke1ke23 +ke25ya07 +ke6ect +ke8729 +ke960400 +ke98sh11 +keac0 +keanjace +keanu +keanu123 +keaolani +keaqh +keas1977 +keats +keats38 +keb +kebab1277 +kebab1995 +kebap2 +kebelek +kebm123 +kebtarum +kebumen +kecodoc +kecopete +kecsdlam +kediedik +kedria +kedric +kedrios1 +keebo6 +keefe +keegan1101 +keegan29 +keeko03 +keeley1822 +keenan +keenan1978 +keene +keene +keep3254 +keeper +keeper013 +keepers13 +keepliz +keepout +keerkeer1 +keeryan +kees +kees ter +kees1989 +keeshad +keeshond +keeskist +keeter62 +keezor +kefah +keffer +kefka007 +kefkef +keflar +keggy +keh8whfp +kehak1 +kehat98 +kehcho +kehle +kei +keiichiro +keiichis +keiji +keijiro +keijjo +keiju +keiko +keiko6151 +keimling +keimo162 +kein +keine +keine1 +keinekeine +keinerlei +keines +keines09 +keinie +keinplan +keins +keins0 +keins01 +keins123 +keins? +keinss +keiperse +keir +keiron +keistas +keith +keith +keith joe +keith123 +keith28 +keiths +keizer123 +keizeur +kej55082 +kejiu +kejxvC +kekdsdoa +keke +keke1 +keke1978 +kekeke +kekekek +kekelah +kekinhuo +kekkuli +kekocity +kekopa +kekrkt56 +keks +keks007 +keks15 +keks2004 +keks64 +keksboy +kekse +kekse! +kekz +kel +kelaa14 +kelaham +kelaher +kelakuan +kelangdu +kelasel +kelatus +kelaynak +kelbayi +kelcyra +kelebek1 +kelek001 +kelel4 +kelemvor +kelethin +keletigu +keli1950 +kelkun13 +kelle +kelle +kellen +keller11 +keller95 +kellerme +kellerwald +kelli +kelli2929 +kellie +kellogg911 +kelly +kelly +kelly jean +kelly lai +kelly11 +kelly1964 +kelly2kelly +kellyc13 +kellychao +kellye +kellyr +kelmas +kelmor123 +kelo1234 +kelp999 +kelsea +kelsey +kelsie519 +kelso +kelthord +keltosh +kelvin +kelvin han +kelvinc +kelvinliang +kem1970 +kem42104 +kemal +kemal +kemala +kemalati +kemaster +kemdl +keme1981 +kemija666 +kemira123 +kemo +kemo0000 +kemot77 +kemotaku +kemowong +kempa +kempe1 +kempka123 +kempsa +kempton +kemyzs69 +ken +ken1der1 +ken240 +kenan +kenan58 +kenavo +kendahl3 +kendall +kendall kay +kender14 +kender3 +kenedax +kenef4o +kenga68 +kenitec +kenjamin41 +kenji +kenji +kenji123 +kenne +kenneth +kenneth +kenneth mac +kenneth robert +kenneth4700 +kennethu +kennie +kenno89 +kennustod +kennwort +kenny +kenny +kenny101 +kenny18 +kenny2402 +kenra2008 +kenshin +kenshin1 +kenshin2 +kenshin343 +kenshin4 +kenshinx +kensie812 +kensington +kent +kent1362 +kent18 +kent5368 +kenta +kentaure +kenth0099 +kenton +kents1 +kentwood +kentz1993 +kenuk +kenwood +kenwoods +keny +keny92 +kenya123 +kenzo +keo +keodeco +keokuk07 +keons7 +keops +kephhilg +keppana1 +kepure +keqqihip +ker8ph +ker99bad +kerbela2 +kerberus8312 +kerbi2903 +kerboran +kerdokas +kerem +kerem06 +kerem2108 +kerem26 +keremcem +keremci +keremida +keres1916 +keri4145 +keriseke +kerita +kerken +kerkuk +kerkuk46 +kerle1995 +kerman +kermasa +kermet +kermit +kermit +kernan +kernan86 +kernel +kernel06 +kernel92 +kernunnos +keroli +kerouac +kerpele2 +kerplunk +kerri +kerrie +kerrigan +kerrol +kerrun +kerry +kersiluv +kerstin +kerstin3350 +kerstinkutsche +kertih +kertor +kervadec +kerwin +kery1957 +keryck +kerze22 +kerze25 +kesant +kesgrave83 +kesguerr +kesi4653 +kesina +kesit05 +kessel17 +kessnico +kestas +kesteab +kesuab +keszon +ket3000 +ketan +ketaper7 +ketchup +keteam4 +kethna12 +keti14 +ketino +ketket +ketl7 +ketnil96 +ketrogoj +kett0910 +ketterer +ketti +kettoketto +ketty +kev +kev3in +kev929 +kevaco +keve +kevers +kevhas +keviin +kevin +kevin +kevin-gerard +kevin0 +kevin1 +kevin101 +kevin122 +kevin123 +kevin1709 +kevin2108 +kevin2411 +kevin3090 +kevin4 +kevin517 +kevin951 +kevina +kevinb +kevinb0793 +kevindk1 +kevingarcias +kevinh +kevinl +kevinsu7 +kevkev +kevkevev +kevlar +kevodanh +kevok21 +kevork +kevvie +kevwii +kevyn major +kewdog +kewken +kewlboy +kewlmenot +kewlness +kewpie +kewtkewt +kexaf8at +kexin00 +key +key +key22856 +key420 +key5ravk +keyblade +keyboard +keydura +keye +keyhole3 +keyicw32 +keyla +keymi +keyskeys +keystone +keystone +keystroke +keysy2 +keywest91 +kez85keh +kezakl +kezisek +kezrfy8y +kf0xod +kf8kh +kfc2549 +kfc3lmp +kfdg2005 +kfdy3 +kfe0m +kffa010 +kfhz0uf1 +kfir17 +kflnpass +kfmpg +kfr232 +kfr38e12 +kfranhob +kfs96130 +kfto4 +kfx122 +kfytrewq +kg47wwq +kgb007 +kgbito69 +kgbnkwdd +kgcte +kgf69a7b +kghmjzue +kgho23pl +kgm862 +kgmida +kgplop +kgu711 +kgugzsbn +kgwc00 +kgwz6 +kgzjz +kh010784 +kh042007 +kh0ngco +kh1h0 +kh4li5 +kh63ge3 +kh63zn68 +kh6ow +kh86gfk7 +kh9968jk +kh9c1s4s +khXZJa +khada +khadija +khadzad +khaiphuong +khake5 +khakh19 +khaled +khaled +khalib +khalid +khalida +khalil +khalil +khalouda +khan01 +khan05 +khan06 +khan08 +khan12 +khan2192 +khanhdn +khanhjnq +khanke +khanume +khar01 +kharpeet +khaye +khcwe +khe2k +kheadz +khedma +kheira +khekhe +kheldorn +khenchela40 +kherson111 +khg2oo8 +khh13tn +khhappy +khhkhh +khif2gux +khigh +khjl5 +khloeice +khloode +khlteam +khm2757 +khmd129 +khoa +khoas9111 +khodam05 +khongmua +khongnho +khorne +khoudia +khould +khoury +khr6x +khr96tv3 +khrono4 +khsc1234 +khtcdubh +khu55uj +khuhua +khuong +khxkuu +ki +ki0245ba +ki0ji +ki554r5e +ki7dn +ki88er +kiCk18 +kiFfEr +kiVa71 +kia +kiahua +kiaiii +kiam6603 +kian4321 +kianmika +kiany117 +kiaora101 +kiara405 +kib1978 +kib56056 +kiba343 +kiba4012 +kibakun +kibel +kibiras +kibitz08 +kibouga +kicek1 +kicha007 +kicherle +kichiemon +kicia1976 +kicius8 +kickass +kickass1 +kickback +kicken192 +kickeren +kickers +kickflip +kickin +kicpuros +kid107 +kid21 +kid2k +kidalovo +kiddies4 +kidding +kiddjmad +kiddo1174 +kide +kideki +kideris +kidha1 +kidhanig +kididano +kidlets3 +kidloeft +kidmens1 +kidokai +kidrock#3 +kidrock1986 +kids04 +kids123 +kids4e +kidson +kidzia +kie +kiebas24 +kiebitz +kiefer +kieke27 +kiekeboe +kieken +kiel +kielanne +kielce83 +kieliba +kiem12 +kienle0301 +kieran1 +kierdorf +kieron +kiersten +kiesha +kietas +kietekas +kieth +kieu +kiffen +kiffen555 +kiffen79 +kiffer +kiffi0905 +kiffi1976 +kifotnya +kigeco57 +kigol1 +kih71nuq +kii +kiiiop +kiiver1 +kij43ek +kij4mskq +kijang +kijidder +kijk001 +kijno +kik44ass +kik8t +kika +kikakika +kikakiki +kikas +kikavica +kikema55 +kikentai +kikhpto3 +kiki +kiki19ho +kiki3001 +kiki3620 +kiki614 +kiki73 +kiki83 +kikidi +kikiki12 +kikikoko +kikikoko10 +kikilo +kikimo +kikiriver +kikis +kikishi +kikkeli3 +kikker +kikkerprins +kikko12 +kiklop +kiko +kiko +kiko012 +kiko1961 +kiko25 +kiko323 +kiko87 +kikoloki +kikoo +kikool +kikoolol +kikosek +kikosha +kikou +kikou123 +kikoukikou +kikoulol +kikoun +kikozork +kikukiku2 +kila +kiler123 +kiler13 +kilian +kilian8 +kilian94 +kilijan +kilimas +kilimnik +kilincs1 +kill +kill1406 +kill3r +kill56 +kill666 +kill9696 +killa +killa007 +killa52 +killaazz +killacon +killah +killakilla +killall +killarmy +killbill +killbill2010 +killbill264 +killdeer +killer +killer01 +killer06 +killer1 +killer11 +killer1169 +killer1233 +killer13 +killer177 +killer2 +killer27 +killer3 +killer77 +killer81 +killerak +killerbees +killerbpg +killerc4 +killergummi +killerrage +killersgamers +killerspaten +killerthug +killerun +killerx1 +killerx3 +killeur +killing667 +killink6 +killjack +killjoy +killkill +killme +killme31 +killpapa +killpope +killsaddam +killshotz +killtrend +killua +killz +kilo111 +kilo171 +kilokal +kiloseven +kilroy +kiltbed +kilus90 +kilzall +kim +kim +kim jung +kim kafkaloff +kim01 +kim1 +kim221 +kim57314 +kim61299 +kim76 +kim82589 +kimacaba +kimal73 +kimba312 +kimba6262 +kimbalex +kimber +kimberlee +kimberley +kimberly +kimberly +kimbernix +kimbo19 +kimboh +kimbree16 +kimchi +kimd41 +kimdong +kimi2110 +kimido14 +kimiko +kimiko3 +kimimben +kimira +kimirsen +kimj0511 +kimjin12 +kimkim +kimmen4866 +kimmer +kimmie +kimmie69 +kimmrdja +kimmy444 +kimngan +kimochii +kimon +kimono +kimono11 +kimova +kimpec +kimsan +kimset +kimsia +kimslan +kimsnet9 +kimsucks +kimu0717 +kimvivi +kimykimy +kimzach +kin +kin jin +kind404 +kinder +kinder01 +kindergarten +kinderquatsch +kindra88 +kindred30 +kindsiit +kineee +kineem21 +king +king +king1017 +king113 +king1991 +king219 +king3875 +king4you +king99 +king9snake +kinga1986 +kingabing +kingamigo +kingbear +kingdan +kingdinero +kingdom0311 +kinger +kingfisher +kinghack +kingisco +kingking +kingkong +kingman123 +kingme +kingofbongo +kingolo +kingpeen +kingpin1988 +kingra2000 +kingreturn +kings099 +kingsaoe +kingsfull +kingsley +kingsoft +kingsoul +kingss17 +kingsvoice +kingt +kingturq +kingtwo +kingudo +kingx +kinito +kiniusa1 +kinjam99 +kinka2403 +kinkey02 +kinki123 +kinkies +kinks50 +kinkya +kinley75 +kinnari +kinneas +kino +kino1515 +kinopop +kinquwel +kinser +kinuyo +kinya +kinyo321 +kinzel +kio42m +kio7f +kioku92 +kiotari +kip +kip +kipepeo +kiphop +kipirica +kipling89 +kipod +kipower +kipp +kippee +kippen +kippokippo +kippy +kira +kira1000 +kira404 +kiraken +kiraleo +kiran +kiranbak +kirash +kirashaw +kirbiro +kirby +kirby. +kirby06 +kirbyc +kirbyxxl +kirchart +kirche +kirchein +kirchweg11 +kirchy +kirdec +kirderf +kire66 +kirgo123 +kirh05 +kiriath +kirika14 +kirikou +kiril +kiril33 +kirill +kirinuki +kirion +kirk +kirk +kirk95 +kirkilas +kirkisag +kirkjames +kirkland4 +kirkw00d +kirler +kirli160 +kirmes5 +kirne11h +kirovski +kirrili +kirsche +kirsche2009 +kirsche6 +kirschenkirmes +kirsehir19 +kirsten +kirsten +kirsten2678 +kirsti +kirstie +kirstin +kirstine23 +kirsty +kirtl +kiruna +kiruna12345 +kirusha +kisakisa +kisan250 +kisara12 +kisat9598 +kishan +kishore +kiskalap +kiskiki +kiskis +kiskopal +kismet +kismet90 +kisous +kispok +kispok81 +kiss12 +kiss2 +kiss2002 +kiss44 +kiss7382 +kissa +kissa +kissa123 +kissaZ +kissakani +kissen12 +kisser1279 +kissfan7 +kissi1 +kissimmee11 +kisskiss +kissme +kissme1 +kissmee2 +kissmel +kissmesergey +kissmyass +kissmyass3 +kisstattoo +kistadinka +kisuange +kit +kit0007 +kit3kat +kitano +kitao2004 +kitas +kitcer12 +kitemmu +kith6669 +kitie324 +kitkat +kitkat1211 +kitkat41 +kitkaty +kito +kitoks9 +kitomar +kitomer1 +kitt3ns +kittcarter +kitte7 +kitten12 +kitten3 +kittens72 +kittens85 +kittensperr +kitti +kitti +kitti1 +kitti44 +kittie +kitties +kittle05 +kittus +kitty +kitty +kitty288 +kitty2cat +kittycat +kittycat787 +kittycats1 +kittychow1971 +kittyk +kittykat +kittyz +kitwuvoy +kiu56tgh +kiukiu +kiune307 +kivet123 +kivilcim +kivistik +kiviyk +kiwako +kiwi1200 +kiwi2002 +kiwi5555 +kiwi6721 +kiwi8608 +kiwi8720 +kiwi99 +kiwibanane +kiwiboi +kiwidile +kiwiflip +kiwii +kiwitool +kiya2006 +kiyoako +kiyohiko +kiyomiw2 +kiyoshi +kizsay +kizuna00 +kizv120 +kj +kj010986 +kj0110 +kj042102 +kj14 +kj1409 +kj15cc +kj312120 +kj45w7 +kj51751 +kj763 +kj85v9 +kj96321 +kjbadmin +kjbei +kjean630 +kjell +kjellaug2 +kjellluca +kjg4f +kjh777 +kjhgfdsa +kjiflm +kjiflm +kjihoio +kjkjkj +kjl1982 +kjl8u +kjmaese +kjnt1 +kjo4t +kjs45 +kjsf421 +kju455du +kjzlx +kk0599d +kk0kot +kk120450 +kk12345 +kk1593 +kk2006 +kk261898 +kk3n67 +kk3rcokb +kk456ll +kk4all +kk645824 +kk8575 +kk8hl8n +kk8hl8ni +kk94534 +kk992465 +kk9cv288 +kkaa111 +kkai22 +kkc123 +kkc556 +kkcool +kkdlavak +kkdmwddj +kkeit1 +kkf1dgvb +kkfghi +kkk12345 +kkk5000 +kkkbbbjq +kkkillers +kkkk +kkkk2 +kkkkk +kkkkkk +kkkkkkkkkk +kkklex +kkllmm +kkmadmin +kkmocch +kknd1kknd +kknd2179 +kknoel +kkodak +kkp0q +kkpub921 +kkpura +kkrose +kks007 +kks02119 +kksmoly +kksuk69 +kkt +kkttg67d +kku780 +kkyyjj +kl0403 +kl0953 +kl0f4c3 +kl13ike2 +kl186pap +kl240358 +kl5fe +kl65g17 +kl7l4791 +kl848627 +kl89zx +kla475 +kla5vier +klaas100 +klaasjan +kladda92 +kladimue +klages +klaiber +klaiber2 +klaipeda +klander +klando +klang001 +klanhidra +klapdor +klapjou +klappen +klappen12 +klapper1 +klappse +klara +klara3719 +klarentina +klari +klarika12 +klarofix +klase +klasowe1 +klass8854 +klasse7a +klasse9d +klassen +klaten +klatka08 +klaunas +klauns +klaus +klaus +klaus maria +klaus-peter +klaus1955 +klauscorp +klausd01 +klausdadi +klausen +klausi +klausti +klavertje +klavertjevier +klavier +klawal +klawiatura +klayman +klaynt +kld095 +kldsf123 +kle.opa +kle0niki +kleahcim +kleber13 +klecjiol +kleeer +kleene +kleene2 +kleene28 +kleener5 +kleenermann +kleenex +klein033 +klein123 +klein1967 +kleinduimpje +kleiner40 +kleinerknochen +kleinerman +kleines +kleinesarsch +kleinkeks +kleinkram +kleinlich +kleist05 +kleistpark +klekk +klemmo +kleon800 +kleox466 +klesko2313 +kletz +kleur6 +kleuxis +klever1 +kleworex +klexx22 +klezmer1 +kli33if8 +klice +klicha1 +kliche +klicka6 +klient +klier +klife789 +kliffer +klik22 +kliko +kliko02 +kliko022 +klima109 +klimat121 +klimis50 +klimmen +klin +kline113 +kline123 +klinge +klinge28 +klingel +klingo +klingon +klingon3 +klinlara +kliovas +klirmen +klister112 +kljb06 +kljh876 +klke04 +klklkl +klm224 +klm6210 +klm654321 +klmmadest +klmn10dk +klmsaftp +klmsiia +klo505 +klobeg3 +klobla22 +klocka12 +klocot37 +klodzko1977 +klokklok +klokli +kloklo +klol +klomp90 +klompen +kloner91 +klonk234 +klop00wc +klop81 +klop84 +klop90 +klopek7 +klopfer +klopholz +klopik +klopklop +klopolo +klopot +klopp05 +klopp8 +klopsik +klopsiki +klopskind +klosett8 +klote84 +klotzkopf +klowor71 +klp2337 +klpwefds +klrrppoo +kltkc +klu1vert +klu36q +klub +klubba18 +kluber +klubhus01 +klumpfisk +kluster +klusteri +klutz89 +klvoeuyb +klwx9703 +klx111 +klzd5958 +km05ysc +km2006 +km5692 +km609907 +km666jc +km990595 +kmar2187 +kmaras46 +kmd8ji +kmdn05 +kmedia +kmehl9p2 +kmfkmf +kmiamrox +kmicha +kmier8te +kmikaz +kmjp1953 +kmjwcfx7 +kmk1331 +kmklka +kmkm8232 +kmkmkm +kml4135 +kmlab +kmmoruk +kmorales +kmp5s +kmpcp206 +kmsd123 +kmst0 +kmxdyfks +kmxuvv +kmy204 +kn134679 +kn1ght0r +kn2rmp1q +kn4LL +kn557447 +kn80honp +kn8hcy9v +knall. +knalli12 +knancy143 +knap2007 +knarf1209 +knarf1609 +knarf1968 +knas3art +knasti9 +knb3889 +knb3914 +kneesocks +kneippp +kneissel +knep56bu +knepis +knete1 +kngs123 +knhriz79 +knicks +knife421 +kniffma +knigh1998 +knight +knight7491 +knights +knights2 +knipser04 +knirps +knirsch3 +kniver585 +knj623 +knk99ttw +knknpnkn +knob1989 +knobel +knockon4 +knockout7 +knodden +knoedel +knoedel27 +knoetti +knolli +knopa03 +knoppen +knoppers2410 +knoppix1 +knoppix6 +knorman2008 +knorr1989 +knorren11 +knossos +knotyou +knowledge1 +knowles +knowme +knowthing +knox +knoyjulc +knpyg +knslbtsh +knubbel +knuckl2 +knuckles801 +knuddels +knuddelz +knuffel +knuffi +knuffo +knugarna +knul1956 +knull +knuppi +knut +knuts +knutscha +knwldg42 +knyx211 +ko12op34 +ko1425 +ko2is +ko2ze +ko346153 +ko7jaba5 +koa27503 +koaka +koala +koala1 +koala126 +koala20 +koala774 +koali +koalicija1 +koam7713 +kobak1234 +koban +kobe08 +kobe2k10 +kobe6666 +kobefook +kobi +kobi1989 +kobi21 +kobille +koboldine +kobra +kobu +kobui2 +koby4874 +koby7355 +kocakxxx +kocanmi +kocata +kocatepe +koch18 +koch1810 +kocham08 +kocham321 +kochamagne +kochanie +kochen +kochifre +kociak +kociak14 +kociak83 +kock +kocka +kocken83 +kocmiel +kocopass +kocour +kocsog +kod09lux +kod2015 +kodak10 +kodeord0925 +koder +kodewort +kodiak +kodiak01 +kodiak555 +kodianew +kodikodi +kodikos +kodoman +koe +koe011 +koeien +koeien55 +koekje3 +koelle1976 +koelle88 +koeln2007 +koemanron +koen +koenig30 +koenigin +koeniglich +koenigsgrund +koerente +koerting +kof123 +kof2002 +kof2004 +kofata1 +kofc2007 +kofe +koffie +koffur65 +koffur66 +kofola +kogkav70 +kohchang +kohinoor +kohle2 +kohlo99 +koichi +koiemn +koimark +koinare +koira1 +koiruus12 +koiter00 +kojah19 +koji +kojika37 +kojine +kojiro +kok1mok1 +koka +kokanee +kokaura +kokenes +koki2001 +koki234 +koki4 +koki4a +kokinji +kokiwapo +kokken1967 +kokkie94 +kokko23 +kokkonen87 +koko +koko +koko13 +koko159 +koko1902 +koko2609 +koko5210 +kokobg +kokoko +kokola44 +kokoli21 +kokoliso +kokonut +kokopko +kokoriko +kokos1 +kokos93 +kokosnuss +kokot +kokotko +kokotkokot +kokowawa +koks +koksal +kokso +kokus16 +kol0ty67 +kol152 +kol2jg0 +kola0103 +kola14 +kolabear +koladog1 +kolarz1 +kolayy +kolbarsch +kolderie1 +koldo3005 +koleg +kolega +kolega54321 +kolega6 +kolegija +kolej19 +kolejorz +kolejowa1 +koleman +kolemole +kolgara +kolhoff7206 +kolibri +koliko315 +koliko323 +koliko8 +kolinka +kolip +kolisih +kolkija +kolkol123 +koll4711 +kollector +koller86 +kolli67 +kollon18 +kolloss +kolnes1989 +kolnuro +kolo +kolobrzeg +kolok1337 +koloko +kolokola +kolon193 +kolonele +koloo1 +kolopo1268 +kolorado +kolos1 +kolotool +kolporter +kolporter1 +kolstad87 +kolster +kolt1510 +koltanz +koltrave +kolumbus123 +kolya1989 +kolychka +kolyma68 +komadina1 +komaku +komander +komapat +komar123 +komarac +komastar +komatso +komdat +komdav +kometeis +komfort1 +komi +kominar +komintern +komlok +kommaklar +kommander +kommando +kommer1 +kommrein +komnet +komo +komoca +komodas +komodio +komodo +komodo12 +komorera +komoriuta2 +komp11 +kompas +kompiki +kompis16 +kompis29 +kompis939 +kompisss +kompjuter1 +komplett123 +kompot1 +komputer +komputer1 +komsas +komsetup +komsomolka +komunismus +kon0neri +kon1991 +kon40yar +kon65mod +konakona +konami +konas666 +konaworld +kondom69 +kondomer123 +kondor87 +kondrat +koneins +kong +kong08 +kongelige +kongen2567 +kongezoc +kongkong +kongming +kongol +kongpob +konicek +konieczny +konijn +konijntje +koniki +konje1 +konkia +konnichiwa +konno1254 +konny59 +konoha +konrad +konrad +konrad08 +konrad1 +konrad17 +konrad18 +konradx13 +kons1612 +konserv1 +konsey +konst +konst1235 +konstantin +konstihh +konsumgeil +kontakt +konter +konteris +kontol +kontol12 +kontorce +kontrabass44 +kontrol355 +kontroll6 +konya42 +konyaa +konyarus +konzum +koochi +koodari +kook48jt +kookie525 +kookoo +kool12 +kool26 +koolest12 +koolio20 +kooliu +koolkool +koolman123 +koolmees +koolneon +koolness +koom233 +koondak +koopman7 +kooram +kooxoo +kop22vuw +kopaka +kopapen +kopbana +kopeczi +kopele +kopernik1 +kopernikus1 +kopetzky +kopflor +kopfnuss1990 +kopfschuss +kopiid +kopite +kopkopak +kopler +kopli +kopola32 +kopoli +koponen112 +kopretina1 +koprivaii +kopusan +kopy111 +kopyls +koqpiyom +koqxoyag +korabi +koraj1 +koral +koraw1 +korax1379 +koray +korea +korea615 +koreja9 +korek20 +korektor123 +koreman +korentin +korexal +koreya +korf52 +korfu2010 +korgun18 +korhh +koriandr +korina +korinto +korka +korkil +korn +korn0509 +korn123 +korn666 +kornelia +kornelia1 +kornelka +kornfan +kornkorn +koroleva1 +korolevu +korram +korsika123 +korsopita +korsow72 +kort +kortao +kortes15 +kortum +korvbas +korvin +korvunge +korwal +kos20kos +kos87 +kosa12 +kosa1212 +kosaj12 +kosak82 +kosc07 +koschka +kosiak +koskator +koskos +kosmic +kosmita1991 +kosmo +kosmo1# +kosmocool +kosmos000 +kosmos30 +kosmos349 +kosmozoid +kosova +kosova5 +kosowo99 +kosshd19 +kossiwie +kossu +kost0492 +kosta +kosta117 +kostas +kostas +kostava +kostelis +kostia +kostonas +kostraba +kostya +kosunola +koszula +koszyk20 +kot1 +kotai +kotaro15 +kotek +kotek1 +kotenko +kotenok +kotka +kotka12 +kotka369 +kotolna +kotomoto +kotona88 +kotone +kottan1961 +kotti +kotzklan +kouba1 +kouge999 +kouichi1454 +kouko513 +kourim +kouros38 +kourosh +koursk +kourtni23 +koussa +kovacs11 +kovin +kovo11d +kovsejav +kow3sdmk +kow8152t +kowa1991 +kowa77 +kowal883 +kowalski +kowb300 +koxxtp +koy1paan +koyan +koyasu58 +koyumu12 +koyuncu +koza1 +koza3 +koza66 +kozaaga +kozaczki3 +kozak115 +kozanara +kozel997 +kozhivv +kozjewuc +kozmo0410 +kozzgsf +kp0315 +kp0c12 +kp1032 +kp198275 +kp2 +kp2511 +kp33so4s +kp43123 +kp528845 +kp54fg6 +kp5i1p8 +kp6793 +kp9703 +kpachorp +kpah61 +kpasa +kpcclan +kpels +kpfj4fyg +kphfh0q0 +kphotv5 +kpinto +kpmalikp +kpn12 +kpo3g +kpokou +kpon1337 +kpotok5 +kppass +kppow123 +kprfsu +kptech +kptmipoh +kpwkm +kq12as +kq212r7l +kqdgyra5 +kqdtt +kqgrmrm +kqp5vepn +kqrj2 +kqtgejs +kr00S +kr00ked +kr010131 +kr012981 +kr0k0dil +kr1st3n +kr1stie +kr428199 +kr69800 +kr7gam6m +kr7ti +kr7zc4pe +krab123 +krabappe1 +krabbe04 +kracha3 +krackerz +kradin +kradmin +kraeved +krafen45 +krafft +krai +krail202020 +krak +kraka7oa +krakatau +kraken1024 +krakk2k +krakow +krakowNHRK +kral +kral1294 +kralho +kralint1 +kralj +kramer357 +kramit +kramme0202 +krampe183 +kranbahn +krankenhaus019 +krap34to +kraprac1 +krasen9853 +krash1 +krasi +krasi13 +krasnall +krastaf +krasza +kraujass +krausbi +krause0210 +krause06 +krausen53 +kraut1349 +krawk123 +krazyk24 +krb090 +krblg +krc2007 +kre09 +kre2067 +kreasta +kreative0987 +kreda2872 +kreeft123 +kreft123 +kreisel44 +kreiselmutter +kreisi10 +krembo03 +kremen +kremnica +krenaria +krenelka1 +krepsius +kres +kreslo11 +kreso +kresser5 +krestie6544 +kret16 +kretenns +kretin13 +kreuzbewegt +krew0621 +krew23 +krew454 +kreysy45 +krezith +krgr1964 +krhr64 +krhu3x +krid1944 +krieg0204 +kriegsmarine +kriegspw +krif2010 +kriftel1 +krijebr +krik9188 +krille74 +krimar62 +krina445 +krip2n +kris +kris1986 +kris4960 +kris6151 +kris6551 +krisana +krisantem +krischte +krisje8 +krisleigh +kriss399 +kriss44 +krissi. +krissi2 +krist +krist0 +krist4162 +krista +krista02 +kristall140 +kristan73 +kristaps1 +kristau +kristbjorg +kristen +kristen +krister +krister sit +kristi +kristi66 +kristian +kristian1 +kristian135 +kristin +kristin9 +kristina +kristina +kristine +kristine +kristins. +kristoffer +kristoph +kristopher +kristrash +kristuss +kristy +kristy +kristy72 +kristyk8 +krit +kritek +krits001 +kritt88 +kritter +kritzler +kriusa +krizia +krizko +krj73n +krml +krneki +krneki11 +kro1664 +kroatien +kroegerdruck +krokan +krokared +kroko123 +krokodeath +krokodil+ +krokodyl +krokonils +krolina +krolock +krom1802 +kromm420 +kronach +kronan123 +krone4 +kronecele +kronenbach +krong +kronic +kronos +kronos1881 +kronos22 +kronus56 +kronwell +kroog666 +kroon1991 +kroonmann +kroontje +kroq1067 +krosanke +kroschie +krosno4g +krow8808 +krp127 +krpbot +krsna108 +krst5 +krt34 +krt74mbh +krt89df +krtecci +krthfdbs +kruczek +kruder01 +kruemel +kruiden +kruizin +kruka17 +krukow28 +kruku +krumel +krummel +krumslv +krunb83t +kruno2002 +krunoslav +krupa1976 +kruszon01 +kruvkruv7 +krycek +kryddan +krym5213 +krymle76 +krymson7 +krypto +krypton55 +kryptopro +krys2307 +kryshna +krystal0904 +krystal93 +krystek1 +krystie1 +krystina12 +krystyna +krystynka10 +kryszak +krzychu1 +krzyk123 +krzys123 +krzys2001 +krzysia1 +krzysiek +krzysiek04 +krzysiek27 +krzysiu +krzysztof +ks129001 +ks1610 +ks2000 +ks23812 +ks26781 +ks338000 +ks388cn +ks5689 +ks7wa +ks83ks3 +ks9902 +ksauto +ksawery +ksb1v +ksc1952 +ksc97543 +kscenia +kscnjdbc +ksdzzncw +ksem70 +ksemalia +ksenia +ksh2003 +ksiazek122 +ksiazka +ksiazki +ksibs +ksiezyc1 +ksjadmin +ksjk33j +kskarj +kskhost +ksktb199 +ksl5961 +kslt0512 +ksncl +ksoea +ksong789 +ksp35ymf +ksr +kss21 +kss321 +kssdfl88 +kst9320 +ksteu +kstfxcj4 +kstt4 +ksuha +ksundc +ksutrend +ksvyndvm +ksw33ts +kswardi +kswiss +ksworld1 +ksy3117 +kt222125 +kt258369 +kt2glye4 +kt2srw +kt2zvnuo +kt34hi7h +kt5ag0ty +ktadmin +ktb96 +ktbkotr +ktc01 +ktcm31 +ktfjmace +ktfo9bse +kthf0911 +kthp1zss +kthxbyez +ktiryr +ktix1590 +ktjktj +ktm200 +ktmktm +ktomczas +ktos1 +kts20bln +ktsmurf +ktso765 +ktujkfc +ktulu69 +ktvktv +ktxdabcd +kty18jze +ktypisch +ku +ku kuan +ku87adbl +ku8spcgp +kuaUaj +kuan +kuasfin +kuba +kuba1981 +kuba1993 +kuba321 +kuba6326 +kuba92 +kubala2007 +kubanan +kubas86 +kubcio79 +kuber10 +kubicki1 +kubilay +kubinec1 +kubineca +kubis1 +kuboesch +kubram +kuceto +kuchen +kuchta11 +kucing +kuciss +kuckuckchen +kuckuk80 +kuco5456 +kud69sal +kuddel +kudnada +kudosnewcastl +kudoss +kudret +kudzo100 +kuehneop +kuei1004 +kuemmerling +kufafax +kufahl +kufak +kugel535 +kugell +kuguare +kuhfdesv +kuhlbarsi +kuils +kuja00 +kujenuve +kuk +kuka5852 +kukacadi +kukfaen +kukhuvve +kukikoki +kukiluna2 +kukla4ev +kuko1967 +kukrit +kuku1 +kuku1x +kuku2001 +kukulaz +kukulis +kukunder +kukuruznik +kukuryku +kulekara +kulilk +kulimisch +kulka1 +kuller +kullerei +kullli +kullu +kultakala123 +kululove +kulunda +kuma500 +kuma7551 +kumalo +kumanova +kumao520 +kumar159 +kumars +kumbaia +kumbayo +kumberg3 +kumi +kumiko +kumla123 +kumluca07 +kumpel24 +kumrulu +kumson +kun123 +kundalini11 +kunde +kunde1 +kundicka +kungen021 +kungen75 +kungfu +kuniasti +kunie +kunigunde13 +kunihiko +kuningan +kunolobo +kunoyi +kunst +kunteper +kuntxx +kuntz72 +kunuso2 +kunzang +kunzi1 +kuo +kuopio99 +kupa +kupa11 +kupa123 +kupa13 +kupa1852 +kupa2 +kupa997 +kupaw12 +kupl2006 +kuppila2 +kupsch3 +kur00t +kura126 +kurades +kurd +kurd4evr +kurdevan +kurdistan +kuriatko +kuriev +kurinor1 +kuriyel +kurkaa +kurki3 +kurma234 +kurnaz91 +kurnik +kurono +kurosakik +kurre1337 +kurri1 +kurs34 +kurs90 +kursad +kursai5 +kursorobert +kurt +kurt +kurt2005 +kurt47 +kurtcoba +kurtis +kurtlar +kurton +kurtr2009 +kurtuesi +kuruma +kurunkurun +kurvafix +kurw4m4c +kurwa +kurwa1 +kurwa11 +kurwa12 +kurwa1828 +kurwa29 +kurwa4me +kurwaa +kurwamac +kurwka +kurznase +kus1v +kus73map +kus85lig +kuseqale +kushtrim +kusjes44 +kusman35 +kustome2 +kustone +kusum +kuszy66 +kut +kuta +kutas +kutas1 +kutga1 +kutijaro +kutimato +kutinge +kutkind +kutlay +kutman +kutscher +kutte0815 +kutty +kutu +kutzooi +kuukkeli +kuulei +kuust1 +kuv313 +kuvas6 +kuwait500 +kuwait63 +kux0zcxx +kuy +kuzu1001 +kv2010 +kv4474 +kv595a +kv78j9 +kv7i9rdu +kvW990 +kvakva +kvanka99 +kvaran84 +kvekk85 +kveta +kvfrost +kvietok +kvj319 +kvmlc2r1 +kvqme +kvt16r +kvtg4ss +kvtjd +kvul1 +kvw181 +kvwvsuw2 +kw2162 +kw3rln +kw560142 +kw7793 +kwFBc +kwa65896 +kwan +kwan shan +kwan3839 +kwanl +kwantum12 +kwapis +kwark85 +kwasserstoff +kwaytiao +kwb4gore +kweber04 +kweenie +kwekwe +kwiatowa1 +kwiatowa51 +kwigebo +kwijibo +kwill555 +kwisatz +kwmwrqtj +kwmyshit +kwokk1en +kwon016 +kwonboa +kwonilsu +kwonta3 +kwontae +kwpllva +kwrsp89 +kwso6389 +kwuicx +kwuvk7f +kwzg1 +kx5ogpcp +kx5qgpcp +kxceq +kxd12d +kxfrfr +kxgzwhnn +kxhg6 +kxp1191 +kxpdm5 +kxrml +kxss0623 +kxt33 +kxtrems +kxx8q +ky +ky01ik79 +ky0207vs +ky0ce +ky0xvir +kyalo +kyan21 +kybalion +kybele13 +kydfzaq7 +kyit1323 +kykhg +kykysik +kylar939 +kylarb03 +kyle +kyle +kyle mac +kyle32 +kyleadib +kyleh +kyler +kyli1224 +kylie +kylie1 +kylie252 +kylie3996 +kylion8 +kylling14 +kym +kymaster +kynaston +kyo2122 +kyo82519 +kyoccool +kyoko +kyosa287 +kyosho +kyosoma +kyoufov +kypbap +kyphros2 +kyplot +kyqe +kyra +kyra1102 +kyra3582 +kyra89 +kyrababy +kyralex +kyriakos90 +kyrian +kyrian87 +kyrios23 +kyripto +kyrle +kythorne +kytka +kytruw0y +kyu27ih1 +kyungah5 +kyuuu000 +kyuzo +kyy7e +kyzox0 +kz11eqc3 +kzafer +kzb78def +kzgf +kzh5b8rg +kzh6rt3 +kzi2j +kzl9xvql +kzlrn +kzozuvc +kzrolli +kzrulez +kzzag +l +l00k0ut +l00ker +l00p1e +l00p1ng +l03p04 +l0b0t123 +l0c0123 +l0ckd0wn +l0ckitup +l0g1n +l0gg3d +l0gitech +l0gpwns +l0k1 +l0l0 +l0lf3d21 +l0lj33z +l0ll0l +l0ll1p0p +l0pdUn +l0r3mast3r +l0rdsh3n +l0retta +l0sangeles +l0stman +l0tt0k4j +l0tus79 +l0ucat +l0uisa +l0uwvgr +l0v3m3 +l0v3u04 +l0vat0 +l0vestar +l0vey0u +l0veya +l0wh0rn +l0y4lty +l11210 +l123d5 +l1313k +l1701m +l1730slg +l192171l +l1952s +l1953s +l197054 +l19790425 +l1984 +l1a2r3s4 +l1b3rt +l1bby13 +l1c2b3 +l1crespo +l1e2o3n4 +l1ec3 +l1f3t3ch +l1g2s7 +l1l2l3 +l1monad3 +l1nda +l1ndsay +l1onf1sh +l1ughran +l1voupg +l22753 +l2495kn +l2581l +l25i1 +l2798935 +l2awsphe +l2bnub +l2hack +l2i6t9 +l2ptcm3x +l2shanty +l2spain +l2t2x4 +l2xcv +l2ybw +l30n3 +l30p0ld0 +l31ght0n +l33t +l33tkrew +l33tn00b +l33tness +l353679 +l357 +l3admin +l3b3nsm1tt3l +l3chug4s +l3dnar +l3fzt +l3g3nd +l3g3nd5 +l3ight0n +l3l3k4k0 +l3mm3in +l3pth1ra +l3st4t +l3tm31n +l3tm3n0w +l3v1tyra +l3wt7 +l3xd0r9 +l3xoj +l3zfa2vg +l4133039 +l41zm +l4308412 +l43628019 +l45fra +l47uk60 +l4823245 +l4L4l4 +l4f525 +l4m32lol +l4m3p455 +l4m3r3 +l4mnn +l4nc3l0t +l4ng0n4 +l4nn2 +l4p1nus +l4pl3b3 +l4stv0gn +l4z25owr +l506x +l55m7TW0E$28b/ +l5bl8chr +l5e11q35 +l5iavdy1 +l5o7p9l2 +l5xzz1 +l647jf83 +l666j +l6994066 +l6b8w6c7 +l6bfh +l6ukp +l700cxe +l7218e +l7816469 +l7hbwe2k +l7l77976 +l7mafr +l7qem +l7shp +l885l885 +l899yfe +l8kk +l8l0h3g5 +l8onl8on +l8p1l1e2 +l8vg8lmd +l8xbucm8 +l8ylu +l97cfw9m +l9a1k8s2 +l9l9l9l9 +l9o7h8s7 +l9pqvk5y +l9v0pqu +lAcheR +lSr +lUzk9 +la +la.vida +la001754 +la1324 +la150277 +la19rk68 +la2site +la54luz +la5tagool +la6ino +laCie2 +laa2 +laa3438 +laal03 +laaldea +laari72 +laatta +lab +lab +labadore3 +laban +labarber09 +labas +labas1 +labas123 +labas13 +labaslabas +labass +labast +labeden +labelle9 +labello +labels +labina +labinc03 +labinnah1 +labipa +labipass +labitat1 +labkoto +laboite2 +labomba +laboule +labrador +labretec +labrodor +labtec +labtec0 +labtec2 +labtecad +labuanft +labuche +labuda +labuda1 +labukas +labunya +labusola +labyda +labyrinth +lac5dek +lace123 +lacero25 +lacey101 +lacey1119 +laceyh29 +lachaffe +lachania +lachen +lachesis1 +lachhaft +lachi +lachim22 +lachlan +lachlan +lackawanna +lacke1 +laclan +lacle +laco1991 +laco80 +lacontra +lacortei +lacoste90 +lacrosse711 +lada +lada1453 +lada98 +ladalle1988 +ladan +ladaxure +ladder +ladder03 +ladderterra +laddie +ladede666 +ladenerde +ladensolar +ladies5 +ladiesman +ladigue +ladislav +lady +lady +lady1108 +lady1230 +lady911 +ladyanne5 +ladybird +ladybofh +ladycrow +ladyrene +ladytron +ladywell33 +lae1dope +laemmi +laepple +laeti +laetitia +laeub299 +laewta79 +laeyg8i8 +laf1r2 +lafave1 +lafayette +lafayette33 +lafe +laffe09 +laffer05 +laflaca +laflecha +lafleur840 +lafrench +lafyou +lag6868 +laga5 +lagalaxy13 +lagaluga +lagan1 +lagan12345 +lagartijo4 +lagasca +lageer +lagerfeuer +lagerfix +lagi0730 +lagnaf2005 +lagnetwl +lagnusu +lagoon440 +lagrange +lagranha +lagun17as +lagun7 +laguna84 +lah1lak1 +lahmia +lahmy +lahore +lahori786 +lahsamup +lahti015 +lahvd999 +lai chand +laid +laihan51 +laika +laika101 +laikim +laikinas +laila123456 +lailaadem +lailah18 +lailui +laima111 +laimutee +lainie +lainon +lair1997 +laird +laird0656 +laisve +laivas +laj671 +laje13 +lajeado +lajos +lajos +lajplajp +lak +lak400 +lakai +lake1234 +lakebo +lakecity19 +lakecountry +lakeer +lakeland +lakeland123 +lakers +lakers8 +lakes1de +lakeshore +lakhsmi1 +laki1992 +lakii +lakiluk +lakjsaf +lakot +lakota1223 +lakrize +laksono +laksoo +lakustre +lakvicsi +lakylan +lal2vf +lala +lala +lala12 +lala21 +lala321 +lala345 +lala45l +lala90 +lalabum +lalaila +lalala +lalala03 +lalalala25 +lalaland +lalalele +lalali +lalalolo +lalana +lalanya42 +lalata +lale2337 +lalelu +lalepra +lalictia +lalie131 +lalita +lalle1234 +lallex +lalli317 +lally +lalmatia +lalo +lalobo +lalola +lalords +lalou83 +lalowned +lalwic3o +lam +lam kin +lam0rak1 +lama +lama001 +lama123 +lama1986 +lamaga1 +lamak +lamakas +lamala +lamalama +lamalol +lamanoid +lamaraloca +lamarie +lamartine +lamb5529 +lambamba +lambart +lambda33 +lambermont +lambers +lambert +lamberto +lamborambo +lamborghini16 +lambot34 +lambros +lamdalamda +lame +lame8855 +lamepas +lamephle +lamer +lamer123 +lamer333 +lameris +lameriux +lamerized +lamersum +lameshit +lamfs21 +lamiata +lamickaa +lamido +lamija +laminate4 +laminator8 +lamine +lamiokas +lamismus +lamka66 +lamkius +lamlil +lamlisa +lammer +lamo +lamodel1 +lamont +lamorado +lamorte +lamosa50 +lamot +lamp +lampa5314 +lampadina +lampe69 +lampenstein +lampestang +lampi1994 +lampion +lampis100 +lampo +lamponie +lampshade200 +lampshade24 +lamu5376 +lamuiema +lamuna20 +lamus22 +lamusch +lamut +lamyk123 +lan2k4 +lana +lana +lanacam +lanakind +lanalana +lananh +lananisha +lanaquist +lancaster +lance +lance +lance william +lance1968 +lancelot02 +lancelot1243 +lancer +lancers2 +lancha +lanci18 +lancia +lancom +land0501 +landara1 +landau +lander345 +landers +landers steven +landes40 +landet19 +landgrafen +lando +lando01 +landocom +landonba +landos +landover +landrover +landsay +landser +landwehr +landysgt +lane +lanet +lanet21 +laneth +lang +langbart +langbein12 +langde +lange007 +lange1 +langenfeld +langeo0g +langer88 +langhong +langit +langkawi +langkofel +langston123 +language +lanie320 +lankant +lankwitz +lanlan1612 +lanna +lanny +lano123 +lanochka +lansing +lanta1 +lantaro +lantern001 +lantern101 +lanterni12 +lantra +lanunch +lanx2255 +lanxuwu8 +lanzer +laola +laoli007 +laon +laopo520 +laosikim +laosole +laotco +laozaa +lapalma6 +laparada +lapardha +lapaz1 +laphsay +lapicero +lapin +lapinas +lapinou +lapo4ka +laposte +lappeland +lappen +lapseki +lapsteel +lapstuen +laptev999 +lapthanh +laptop +laptop26 +laputa +lapuxas +lapw8778 +laqlaq1 +laquiero +lar4e +lara +lara +lara jill +lara01 +lara12 +lara14 +lara1406 +lara93 +laraboss +larabu +laracha +laracox +laracr +larae +larahwc +laraine +laralara +laralisa +laramaus +larandi +laras +larasandra +larassa +larbi +larchfield1 +lardauq +lardner +lareana1 +lareana2 +laremas +larenja +lares4 +lareth82 +largames +largermarge +lariano +larinka +larisa +larissa +lariukas +larka1337 +larosuxa +larper +larrisa +larry +larry +larry buster +larry flash +larry joe +larry parks +larry111 +larry5150 +larryati +lars +lars1982 +lars2005 +lars246 +lars8032 +larsfeige +larsjana +larske13 +larskim +larslock +larsopa +larsopp1 +larsson1991 +larsson3 +larsson890 +larusira +larutan +larva667 +larwajo +larzcatz +las0920 +las123 +las12rik +las1ka +las317 +las911 +lasalle30 +lasalsa +lasantha +lasarenas +lasat123 +lasdop +laser +laser1 +laser123 +laser5p +laser7075 +lasergc +laserpen +laserrad +laserscan +lasha +lashoner +lasiks +lasipullo4 +lask11 +laska1 +laskoviy +laslocas +laslovo1 +lasolita +lasombra +lass3npk +lasse +lasse +lasse08 +lasse29 +lassek0258 +lassek86 +lassepus +lasses +lassessein +lassie +lassword +last1 +last123 +lastan +lastbear +lasthope +lastiji +lastingexile +lastking +lastmandown +lastone +lasvegas3 +lasxlo +laszio +laszka0 +laszlo +lat9565 +late +lated0g +lateef +later +latex123 +latex2 +latexmamma +latfi123 +lathack +lathar +latias +latif +latini +latino +latino22 +latios +latisold +latitude +latour66 +latrodectus +lattanzi +lattecaldo +latvia +latvija22 +latyrx99 +lau12 +lau2206 +lau2628 +lau46095 +laublaub +lauchdiamant +lauchlan1 +laudabas +laudatur1 +laudie +lauersen +laufe110 +laufobo +lauka +laupas +laura +laura +laura hope +laura huny +laura06 +laura500 +laura570 +laura77 +lauraboulton +laurajtm +lauram +laurariva +laurasan +laurayasmin +laure +laureca1 +laureen +laureles1 +laurelhardy +laurelle +lauren +lauren +laurence +laurence +laurence626 +laurene +laurens11 +laurent +laurent +laurentia +laurentiu24 +laurette +laurette +lauri +lauri231 +laurie +laurie +lauriejk +laurina2007 +laurinda +lauritz +lauritz1 +laury +laurynas +lauscher +lauserli +lautaro +lautaro murua +lautern +lauti +lauwen +lav03 +lav0k0 +lav8anga +lava +lava11 +lavabox +lavadora321 +lavalamp +lavalite +lavana +lavanya +lavazzaschwarz +lavendel +lavendelblau +laver +laverne +laverne +lavero +lavi737 +laviga +lavinia +lavinya +lavriva +law +lawer1999 +lawl +lawl1337 +lawler68 +lawlrus +lawman +lawnmower +lawobayr +lawrence +lawrence105 +lawrence22 +lawri ann +lawson +lawson +lawto24x +lax0423 +laxation +laxbawek +laxer113 +laxigu +laxman +laxman13 +lay +layana +layla29 +laylyla +layout137 +layton +lazar +lazar +lazara900 +lazare +lazaro15 +lazaros +lazaros77 +lazarus +lazarus +lazer1 +lazercad +lazerman +lazerope +lazim123 +lazio +lazio31 +lazkopat +lazlo +lazwhard +lazyday +lazyharry +lazyjx +lazzarus +lb008911 +lb028653 +lb19less +lb2124 +lb3824 +lba123 +lba55 +lbadoer +lbc12345 +lbc69j2 +lbcdawg +lbcyikgf +lbczjyx +lbepower +lbhtrnjh +lbi +lbl3547 +lblanc +lbmjbt +lbntdl1 +lboog1 +lbp460 +lbpfqy22 +lbr4y +lbtzu +lbvf +lbw7117 +lby5m +lc07031 +lc121815 +lc2311 +lc25127 +lc3 +lc_cnc_12.162 +lcb8n1qy +lcbcsl05 +lcby4 +lcd16 +lcdata +lcdrh23 +lcfc44 +lcgadmin +lcgw1996 +lch77ex +lchack +lchild2 +lck033 +lclbaszt +lcnb61 +lcopei19 +lcov7uvb +lcpro +lcsaxfe +lcshop +lcsrules +lcte +lcwwpivf +lcx123 +lcy520 +lcz0m +ld0926 +ld101010 +ld40zi +ld4all +ld55346 +ldScn +ldbell +ldcarl76 +ldchkd +lddwb +ldjns +ldlvxtso +ldmpbq +ldnv01 +ldoyyrjk +ldyzwa +ldznvgux +le +le +le grand +le petit +le strange +le thanh +le0ndr4k +le113092 +le34531 +le3840 +le5m0d5 +le6ujnem +leHrer +leSpAul +lea +lea0503 +lea1991 +lea2003 +lea2704 +lea3009 +lea6969 +lea91luk +leachloe +leachmaster +leachy +leaden +leader +leaderstudio +leaf +leaf9761 +leafboy +leafleaf +leah +leah +leah king +leah1977 +leaha +leahbeah +leahbosch +leahcim +leahconnor +leahel +leahrae13 +leakers82 +leal +lealuca +lealuke +leamarie +leandro +leandrodiego +leaney07 +leanne +leaonly +lear7869 +learn +leather1 +leatrice +leaves21 +lebanon1 +lebarto +lebegue +lebelge +lebkalad +leblance +lebmogox +leboheux +leborgne +leboss +lebossjo +lebovic +lebron +lech +lechemin +lechsner +lecib7 +lecicale +lecking123 +leckmich +lecram +leda +leda3795 +ledas18 +ledas90 +ledberg +ledder82 +lederhose +lederkonzept +ledetzky +ledig +ledini +ledoedol +ledokol +ledus5 +ledwards +lee +lee +lee fang +lee harcourt +lee hoi +lee lasses +lee taylor +lee tung +lee-max +lee1122 +lee190 +lee2000 +lee2005 +lee2007 +lee2213 +lee2676 +lee5897 +leebruce +leech +leech007 +leecher +leechi +leeecher +leef +leehill +leek1m05 +leekaa +leela +leelee11 +leeleoyb +leeloo +leeloode +leeloold +leem1980 +leena +leer!zeichen +leeroyj1 +leeryan +leeshin2 +leet +leet1337 +leet7na +leetek10 +leetman123 +leetme +leetness +leeto +leetone +leeveemon +leeyan +leezhen +lefdedo +lefifi +lefteris65 +leftfield89 +lefthand +leftover89 +leftwing +lefutur +leg1on +legHorn +legacy +legacy6354 +legal +leganda +leganes16 +legastick +legat15 +legatas +legend +legenda +legendary1 +legends +leggendario +legia +legion +legion +legionA1 +legisla +legitpie +legiux +legnats1 +lego1111 +lego123 +lego1234 +lego2 +lego29 +lego3113 +lego8880 +legobest +legoblok +legoclip +legod +legod33 +legogol +legol4s +legoland +legolas +legolas4125 +legolass +legoss +legster +leh0paty +leha +lehand +lehcaiq5 +lehfr172 +lehgocus +lehmann666 +lehmannser +lehmi89 +lehnerz +lehrer +lehtek +lehvek +lei +lei24sav +lei2q +leia21 +leiachou +leib +leibo208 +leibsch +leichtmatrose +leidwein +leif +leigh +leighcrowe +leijona +leikir +leiknir +leikz0mg +leila +leila4539 +leilan +leinad99 +leines +leipzig1 +leirens1 +leiser +leitner +leitstelle +lejla +lejonet155 +lejup1ht +lekg2866 +lekoko59 +lekrjt89 +leksand12 +leksand23 +lekstute +lekuahcs +lela +lelaine77 +leland +lelberd +lele +lele80 +lelek911 +lelemal3 +lelia +leliani +lelie +lelijkerd1 +lelik1 +lelise +lelle00 +lelloc +lellodio +leloki +lelolelo +lelonek +lelong +lelord +leluasa +lely +lem0n +lem0nade +lem123 +lemaitre6 +lemalin +leman +lemanyak +lemigou +lemistio +lemiux +lemmein +lemmel0120 +lemmi159 +lemming +lemmis +lemmy1971 +lemocin +lemon +lemonde +lemonhead1 +lemonjazz +lemons +lemons1 +lemont07 +lemuri@ +lemuriada +len +len#ders +lena +lena +lena-maria +lena1100 +lena1987 +lena2804 +lena46 +lena6me +lena8 +lena947 +lenabock +lenacapp +lenard +lenardo +lendlice +lene +lene1979 +lenejul +lenejuul +leni +leni +lenin +leninha +leninskoje +lenio12 +lenis15 +lenita +lenka +lenka +lenkarou +lenn3609 +lenn777 +lennard +lennart +lennart1 +lenni +lennic +lennie +lennier490 +lennolivet +lennox +lenny +lenny +lennylen +lenora +lenore +lenore9973 +lenovo +lenovocw +lenoxky +lensntu +lentix +lenusik +lenzclan +lenzi28 +leo +leo +leo diamond +leo richmond +leo1115 +leo2003 +leo2010 +leo2a5 +leo4526 +leo@leo +leobell0 +leobsb +leogep1 +leoh yong +leoisi +leojleoj +leola +leolora +leomenn +leomilla +leon +leon +leon isaac +leon0255 +leon1109 +leon123 +leon15 +leon2000 +leon2003 +leon30do +leon66 +leon7man +leon91 +leona +leonard +leonard +leonarde +leonardo +leonardo +leonardo3323 +leonario1 +leonas +leoncio +leonhart +leonid +leonidas1991 +leonide +leonidus +leonie +leonie19 +leonie44 +leonleon99 +leonn +leonor +leonora +leonotto +leonreik +leonriena +leopa59 +leopard +leopard# +leopard2004 +leoparrt +leophp45 +leopold +leopold1 +leopoldine +leopoldo +leopoldo00 +leoquake +leora +leore7739 +leosc13 +leosqual +leota +leouf +leoz. +lepanto +lepassadmin +lepehe82 +leperier +lepeska1 +lepida2001 +leplaisir +leponge +lepositeet89 +lepper +leppy +leprechaun71 +leprince +lepton99 +leq1904 +lequang +leraler +lerche77 +lerjjemh +lerman +lerolero +leroy +lerpajopol +lerrad67 +lerua123 +lerucha +les +les123 +les1505 +lesa +lesadri +lesamis +lesanko +lesbe13 +lesbian +lesbos +lesebago +lesego +leseratte +lesetrend +lesfsl +lesh +lesie +leska01 +leskovac +lesleh +lesley +lesley ann +lesley-ann +lesley-anne +lesley123 +lesley22 +lesli126 +leslie +leslie ann +leslie1308 +leslie21 +leslie615 +lesliepo +leslip +lesly +lesma +lesna2 +leson232 +lespaul007 +lespaul78 +lespotes +less +lessard007 +lesson +lessthan4 +lestat +lestat76 +lester +lester +lesterch +lestock49 +lestrange +leszek +leszek +leszno105 +letcheer +letepping +letero +lethaldkp +lethall +lethalweapon +lethe1104 +letheftw +lethimin +leticia +letigre2 +letisa81 +letitia +letizia +letizia +letlove2 +letme1n +letme1n1 +letmein +letmein! +letmein2 +letmein2033 +letmein2404 +letmein? +letmesee +leto +letosvet +letsdoit +letseat +letsfets +letsgo +letsgoforit +letsgoterra +letsraid +lettbart +letter +letters +letty +leueen +leuft +leugim +leugim25 +leung shing +leutzu +leuvven +lev +lev000 +leva +leval7134 +levana +levanda +levar +levdkp +level0 +levell +levent +levent93 +leverkusen +leverkusen! +levi +levi1971 +leviandries +levit132 +levitikus +levlueck +levon +levski +levski11 +levski90 +levskibg +levy +levyross +lew +lew +lewap +lewcka +lewenuvu +lewis +lewis1 +lewisde +lewq0659 +lex +lex12345678 +lex7xrql +lexa86 +lexalexa +lexasten +lexe00 +lexenlen +lexeq6 +lexhugo +lexi3498 +lexietc +lexigame +lexis9 +lexiviat +lexlegis +lexlex +lexmark +lexous +lexus1429 +lexus147 +lexus212 +lexus5 +lexuslei +lexxus +lexxzone +ley +leyirumi +leyla +leylaa +leyland +lezajsk +lezba +lezcefub +lezlie +lf14789 +lf5slotn +lfalduto +lfc123 +lffreiberg +lfhzif +lfj02 +lfkato +lfkn1234 +lfm608 +lfnlfn +lfownzu +lfs300z +lfvgbpls +lfxvt +lfyz10 +lg123pat +lg226wq +lg254543 +lg36dgr +lg3rschk! +lg563a +lg699656 +lgCP +lgbd44 +lgc943zx +lgcyclon +lge +lgf2250 +lgfhmilv +lghetto +lgkg1992 +lgl123456 +lgl1919s +lgn8i +lgntbcdc +lgpadmin +lgrm2002 +lgt710ph +lgvnm49 +lgxy5316 +lh0614 +lh110574 +lh5n3uat +lharoot +lhbidon +lhewst +lhhma +lhitb88 +lhnnf +lhr2e4np +lhs1c +lhshynh +lhsths +lhthao +lhvdhlvd +li +li chih +li hai +li tao +li0y9 +li1005 +li123087 +li5266 +li6ok3hs +li851023 +li9s1p4v +lia +lia +lia2005 +liadon +liadvon +liam +liam1412 +liam99 +liamdec1 +liamsdad +liamtasha +lian +liana +liana del +liane +liane2009 +liang28 +liangeline +liangwan +liani45 +lianna +lians +liao8844 +liar +liar73 +liatbob1 +libano +libaon +libbie +libbor +libby +libby3 +libero +libero76 +libertad +liberte +liberto7 +liberty +libguun +libin521 +libing2480 +libiti +libnau +libor +library +libster +libstits +libuse +lica +lica101 +liceas +liceum +licht83 +lichter10 +lichterkette1 +lichtlos +lichtstrahl62 +lichttest +lichynia +lickclit +licker +lickit +licknuts +lickspud +licor500 +licoze +lics156 +lid +lida1963 +lidaka +liddy +lideer08 +lidel +lider4e +lidi84 +lidia +lidington1 +lidius55 +lidoabc +lidoc +lidor250 +lidor951 +lidoren +lidum222 +lie2best +lieb55 +liebe +liebe666 +liebeiva +liebelt! +liebesknochen +liebesuse +liebevv +liebing +liebsein +liebster +liefde +lien +lienen +liesbeth +lieselot +lieselotte +liesl +lietus +lietuva +lietuvis +lietuwa +lietzio +lieute +lieux +lieve +lieviejz +liew hoo +liezl22 +lifcirot +life +life006 +life2411 +life26 +life587 +life6996 +life987 +lifeaspw +lifeinme +lifeless94 +lifelife +lifetec +lifetec256 +lifetime3 +lifsan95 +lifted420 +lifterrower +liftlift +liga +ligaosheng +ligerx +ligfivov +light +light123 +light1n +light560 +lighter83 +lightf00t +lightfoot +lighthealing +lighthouse +lighting +lightlance +lightmage +lightmyfire +lightness +lightning +lightning1 +lighto0 +lightpad +lights +lightwars +lightxx +lightyear +ligi1202 +ligia +ligio +ligiu +ligla1 +ligonis +ligota33 +lih5e +lihehu24 +lihongxia +lihula +lihwumel +liinpgm +lija +lijianan +lijsoft +lika +likaaq +like +likemagg +likeomg +likeshe +likethis +likom67 +likome +likomi +lil +lil1der1 +lil78rey +lil89cif +lila +lila0768 +lila67 +lila8652 +lilac7 +lilagrau +lilahuhn +lilako1983 +lilalimbo +lilalol +lild3210 +lildevil +liley144 +lilgijar +lilguck +lili +lili +lili1003 +lili58 +lilia +lilian +lilian +liliana +liliane +lilie +lilihip +lilila +lilipopo +lilith +lilj8346 +liljay98 +liljoe2 +liljon +liljon21 +lilkool +lilla +lillebror11 +lillebror4 +lillehammer +lillemor +lillen7 +lillev +lilley38 +lilli +lillian +lilliane +lillieb +lillihamster +lilliputans +lillu +lilly +lilly +lilly44 +lillyche +lilman3 +lilmomma +lilo +lilo +lilofu +liloiris +liloju10 +lilon2002 +lilone2 +liloo +lilop +lilosh12 +lilous +lilpaul +lils2you +liltman +lilu9mm +lilustra +lily +lily kemble +lily0446 +lily22 +lily9996 +lilyan +lilylu08 +lilytha +lim +lim4693 +lima +lima15 +lima9499 +limacity +limadisplay +limasoma +limbmusic +limbox1 +lime4048 +limengna +limes27 +limescale +limesinferior +limewire +limey2788 +limfawaz +limijian +limit05 +limitbrk +limite +limmer1910 +limming +limo15 +limodemo +limonada +limonadas +limor +limos1 +limosa +limp1517 +limpdick +limpopoo +limubai +lin +lin ching +lin shou +lin12do3 +lin2266 +lin3age +lin7676 +lina +lina0916 +lina1 +lina1234 +lina73 +linababy +linas +linaspav +linbus +linc123 +linc67 +lince123 +lincoln +lind +linda +linda +linda39 +lindaa +lindatss +lindau +lindawg2 +lindberg9009 +lindemann +linden +lindenbaum4 +lindgren1983 +lindi9909 +lindley125 +lindqvist96 +lindros +lindsay +lindsay +lindsay ann +lindsay kemp +lindsey +lindum10 +lindus +lindwall123 +lindy +lindy3151 +line +line1111 +line2605 +linea123 +lineage +lineage0 +lineage2 +linecase +linelis +linemen65 +linengwen +lineo +lineoff +linexin +linezaza +ling +ling1972 +lingering +lingon100 +lingvistika +linhntv +linhti +linie711 +link1989 +link410 +linke41e +linked +linker +linker6 +linkfirst +linkin +linkin1 +linkin11 +linkin12 +linkin987 +linkis#1 +linklink +linkm3up +linknavi +linkoln1 +linkot5 +linkou +links2003 +linksys +linksys4 +linksys80 +linkthis +linlin0617 +linn123 +linnea +linnemann +linneryd +linnie +lino +lino06 +linoa5 +linoleum +linosiwan +linozas +linping123 +linsashe +linsoftxp +lintang +linu2156 +linu6002 +linus +linus2210 +linus334 +linusluise +linux +linux0s +linux1145 +linux123 +linux23 +linux4me +linux4u +linux654321 +linux7234 +linuxcool +linuxe +linuxeinkauf +linuxero +linuxfan +linuxfun +linuxppc +linuxtracker +linuxtracker11 +linuxtracker69 +linz56 +linzyann +lio1975 +lio666 +lio9494 +liom5678 +liomod +lion +lion1902 +lion3682 +lion7341 +lion817 +lionel +lionel +lionhear7 +lionheart +lionking +lionper2 +lions1 +lions45 +liopas +lioudmila +lipalas1 +lipgart +lipiec +lipien50 +lipinho77 +lipo1 +lippo +lippy53 +lippyrou +lipready +lips3096 +lipsett +lipside +lipton12 +liqidtch +liquefaction +liquid +lira4420 +liranely +lirufq +lirulin +lisa +lisa +lisa blake +lisa gay +lisa hart +lisa jane +lisa0421 +lisa07 +lisa1003 +lisa11 +lisa1105 +lisa123 +lisa1990 +lisa2000 +lisa2007 +lisa27 +lisa42 +lisa57 +lisa6055 +lisa6710 +lisa88 +lisabeth +lisaherzog +lisahope +lisahund +lisale +lisalisa +lisalotte +lisanne30 +lisapowa +lisar123 +lisat +lisbeth +lisboa +lisboa7g +liscom +lise +lise3 +liseiotte +lisek +lisek1988 +lisek666 +liseli +liselle85 +liselotte +lisg2 +lish3116 +lisherrera +lisito +lisjo +liskat +lisle +lisowska +lisplisp1 +lissa +lissa1234 +lissahaley +lissi1 +lissy +lissy +lissy123 +lissy127 +lissykira +list +list321 +listen +listento +listerine +listewka1 +lisunebi +lita +lita6751 +litac123 +litchee +liteline +litelu +liteon +liteon94 +liter12345 +lithium01 +lithium9 +litianwen +litie. +litmanen +lito +litodisi +litsa +litsara1 +litten +little +little +little jack +little jamie +little nell +little06 +little400 +littleaura +littlecd +littlejoe +littleman +littus209 +liturgy +litvinemko +litz94 +liu +liu ah +liu huan +liu hui +liu meng +liu shang +liu tse +liu tsung +liu595 +liu7788 +liuS31 +liuchao +liudmila +liufan76 +liujing110 +liulang +liuosiai +liuruixx +liuting02 +liv +live +live2die +live8069 +livelink +livelive +livemmy +livemusiC +liverkop +liverpool +liverpool1 +liverpool235 +liverspots +livhege +livia +livid +livio +livo9 +livorno +livrebook +livtyler +liwyafub +lixjusuh +liyi22 +liypwsxn +liz +liz0916 +liz1187 +liza +liza90 +lizabeth +lizaczek +lizak5454 +lizaked +lizard +lizardman8 +lizardo +lizaz +lizbeth +lizenzbrecher +lizhilong +lizifer +lizking1 +lizlura +lizy0128 +lizzard7963 +lizzi +lizzie1337 +lizzy +lizzy777 +lizzyg +lj123123 +lj1234 +lj603386 +lj910828 +ljaphas +ljcaal +ljch0922 +ljchsong +ljczevbo +ljep9 +ljhggg +ljhglkjk +ljiljana +ljk8s +ljls1992 +ljrc1203 +ljsiii +ljuba +ljuba1 +ljubav +ljubica +ljubisa +ljubisu +ljubo +ljubov +ljufljuf +ljupka +ljvfrol0 +ljxj0 +ljxnq +lk0984 +lk12cd +lk1910 +lk1t4 +lk2opv8s +lk40sd34 +lk801004 +lk8ut +lk917 +lk9fclb +lkcae0 +lkdonlon +lkdzi +lkg34ert +lkh7n +lkhg5555 +lkhj2525 +lki2ikl +lkiuj87 +lkj1lkj1 +lkj321 +lkjUI5 +lkjasdlj +lkjiponm +lkjmnh +lkjser +lklk1234 +lkmmn67y +lknuelhk +lkol00 +lkq123 +lkrijn +lktjv +lktkpttk +lkwlucky +lkwn2 +lkwpeter +lkya +ll +ll2m1gz +ll490319 +ll51ll +ll8899 +ll924 +ll924b +ll99ll +llDTD +llaeut12 +llahsram44 +llais2m0 +llamar78 +llamas +llap +llblog +llcoolj +llen0226 +llfg +llfntgca +llih +lliw17 +llk60 +lll +llllkkkk +lllll +llllll +lllllll +lllppp +llmao +llo +llodhk +llokyto +llooll +lloret07 +lloveras69 +lloyd +lloyd5 +lloyod +llqv8 +llraas +llss11 +lltclc7p +lluflim +llwedge +llzxb +lm113512 +lm169007 +lm2137 +lm549dvk +lm674376 +lm6sum +lm810123 +lmaamg +lmafs +lmao +lmao1 +lmaonow +lmaries +lmbff +lmcsdi +lmd85tt +lmdelval +lmebmk66 +lmf +lmfao +lmfao111 +lmge44 +lmh1234 +lmh2h +lmhn4401 +lmidr232 +lmingle +lmjjj123 +lmnop1 +lmon12 +lmorphin +lmrachel +lmrot +lmsadmin +lmstt +lmtzxbbs +lmw113 +lmy3r +lmz2001 +lnaho1 +lnar3410 +lnbh01 +lncex4 +lnclnc +lnd258 +lnd2p +lndn071 +lnigda +lnp9q +lnqruh +lnrj9 +lnure +lo +lo +lo04tjrk +lo1011 +lo1349li +lo1gol2a +lo3p8x +loa +loaded +loaded001 +loaded56 +loader +loader +loaner123 +loano83 +loat2 +loaz +lobasuu +lobbes +lobeg +lobezno +lobezno2 +lobito +lobo1000 +lobolaw9 +lobont +lobotheduck +lobster321 +lobsters +local +local2528 +local9 +localhost +localizer +locan123 +locath012 +locdog +loch123456 +lochie51 +lochness13 +lock +lockdown +locke +locke1 +locke57 +locker12 +locker1322 +locker2144 +lockhaven1 +lockheed +lockmaster +locknar +lockpick +lockpick8 +lockpicking +lockport305 +locksumma +lockwood +locky113 +lockzx +loco +loco +loco00 +loco1242 +locomoti +locoproxxx +locura +locutus1 +lod123 +loda +lodclan +lodda200 +lodi02 +lodo2501 +lodoss +lodvuhoz +lodxibuq +loe1957 +loecher +loelpwd +loet +loetje +loewe228 +loewen294 +lofasz +lofasz11 +lofberg123 +lofeti +loffen12 +lofguild +loft +lofti8 +log0712 +log8473i +log91 +logan +logan +logan5 +logan78 +logank13 +logannoah +loganx91 +logar2 +logare +logestinkt +logflume +logger91 +logic +logic01 +logiman +login +login098 +login1 +login411 +logincms +logind +logined +loginfranz +loginljd +loginlogin +loginnow +logisiel +logismos +logisys1 +logitech +logitech1 +logitech5231 +logitechbum +logiteck +logitek +logmein +logmein1! +logn2957 +lognes77 +logo +logo001 +logon14 +logone2004 +logonit +logopade +logos +logos1 +logos425 +logout +logowanie1 +logowin9 +logrecap +logrus +logsol +logynov +loh +lohan +lohan06 +lohann +lohinja +lohkamp +lohnstein +lohs +lohse +loic +loic2001 +loikloik +loillier +lois +lois jane +loise007 +loisel66 +loiselmax +loiuytr +lojas +lojas1993 +lojze +lojzip +lok +lok1lok1 +loka1508 +lokal2209 +lokasto +lokernum +loki +loki#2 +loki2000 +loki7000 +loki99 +loki998 +loki_7793 +lokiju +lokilo +lokiloki +lokira +lokirene +lokirita +lokis +lokito007 +lokkalec +lokkosh +loklp555 +lokman +loko100 +loko123 +lokokina +lokololazo +lokomotiv +lokomotywa +lokotka +lokozola +lokqtg +loksdf +lokteva +lokum +lokum654 +lol +lol010 +lol1 +lol111 +lol121 +lol123 +lol1234 +lol12345 +lol136 +lol147 +lol2 +lol2000 +lol22lol +lol2323 +lol2lol +lol2omg +lol2rofl +lol456 +lol484 +lol4life +lol523 +lol5i +lol619 +lol7530 +lol99 +lol990 +lol? +lola +lola29 +lolabond +lolacow +lolage +lolapa123 +lolapalo +lolapua +lolaromane +lolasdas +lolazin +lolazo +lolbbq +lolbiggy +lolburzum +lolcats +lolchina +loldelol +loldenied +loldusau +lole +loleczek +loled1 +loled90 +lolek +lolek1 +lolek987 +lolekk +lolen +lolh4x +lolhaus +lolhax1 +loli +loli123 +loli37 +lolidol +lolig +loligag +loliger +lolik +lolikas +loliki +lolilol +lolinga +lolinjo +lolipop +lolish1 +lolislol +lolislol1991 +lolita +lolita +lolita01 +lolitka +lolivas +loljke123 +loljojo +lolk1234 +lolk21 +lolki99 +lolkki +lollakas +lolle89 +lollen125 +lollerfasan +lollero +lollers +lolli266 +lollie +lollipop +lollipopmini +lolll +lollla +lollo +lollo +lollo92 +lollo94 +lollol +lollol11 +lolly +lollybag +lollylol +lollypops3 +lolman +lolman0 +lolman4550 +lolmao3 +lolmdr +lolmplol +lolnah +lolneG +lolnoob1 +lolo +lolo01 +lolo12 +lolo1971 +lolo1997 +lolo2007 +lolo300 +lolo4407 +lolo5 +lolo94 +loloask +lolodidi +lolodj +loloiziz +lolokay +loloke +lolokok +lolol +lolola +lololo +lololo11 +lololol +lololol7 +lololopl +lolomat +lolomg +lolor6 +lolorz +lolowned +lolowo +lolozaur +lolpass +lolpew +lolpwnt +lolshin +lolson321 +lolsuke +loltflux +loltjamh +lolu22 +lolundso +lolus99 +lolusuck +lolvlaka +lolwalker +lolwhat +lolwtf +lolwut +lolx +lolxlolx +lolxyne +loly23 +lolz +lolz13 +lolzone +lolzone0 +lolzor3 +lolzor332 +lom4321 +lomalinda +lomar +lomas +lomason0! +lombok23 +lomekol1 +lomeli123 +lomex +lomfgc +loming123 +lominui +lomkhs2 +lomkhs3 +lomolo +lomonosov1 +lomsden +lomu +lon +lon83fum +lona +london +london +london00 +london0201 +london1 +london6 +londres +lone +lonedark +lonesome01 +lonestar01 +lonette +lonewolf +long1978 +longboard9 +longboatkey +longbow +longdick +longdxdx +longfei +longhair +longhi +longhorns321 +longika1 +longines +longjump +longleat +longnhi +longone9 +longpark +longtime89 +longtree624 +longuito +longvideo +loni +lonitha +lonneke1 +lonnie +lonniea +lonny +lono6970 +lontze +loo46594 +loobaqu0 +loodaca +loodak +loogin11 +loois131 +look123 +look4me2 +looka9126 +lookalike99 +lookgood +lookmypc +lookout911 +looky +lool +loollool +looney2 +loony +loooool +loop +loop99 +looped +looper +loopies +looping +looploop11 +looptroo +loopy000 +loopy1 +loopy6676 +looser +looser1 +looser88 +looserek +loosk26 +lootlist +lopas +lopas123 +lopas32 +lopas321 +lopas789 +lopasas +lopass +lopastu +lopasw +lopata +lopata84 +lopelis +lopes +lopeta +lopez1 +lopez3 +lopgg +lopikop +lopino +lopipl +lopive +lopov13 +loppig +lopspy +loqkoman +loquilla +loquillo +loquito3262 +lor2tw +lor4nzo +lora +lora +lorafem +lorahlu +loraine +loraineshc +loraleix +loran +loranail +lorbeerblatt +lorc213 +lord1961 +lordares +lordbung +lordek +lordela +lordes +lordestt +lordfish +lordhack +lordi +lordilord +lordinateur +lordkenshin +lordlad +lordo1 +lordofevil +lordschaft +lordsrule +lordss +lordvaio +lordzero +lore +lore +lore2008 +lore38 +lore53 +loredana +loredano +loree +loreen64 +loreena +loreit +lorelai +loren +lorena +lorena +lorena09 +lorendy +lorenz +lorenz +lorenz12 +lorenz71 +lorenzo +lorenzo2010 +lorenzo6 +loretta +loretta han-yi +lori +lori +lori anne +lori-nan +lorie +lorie12 +lorient +lorillar +lorillo +lorin +loring +lorion +loris +lorisemilio +lorito +lorna +lorna0924 +lorna105 +lorne +lorpa +lorquito +lorraine +lorraine +lorraine696 +lorren +lorry2 +lort2005 +lorus1983 +lory2000 +los +los angeles +losangeles +losangeles3 +losdelta +losenord +loser +loser1 +loser1980 +loser1995 +loser5 +losia +losiana +loslocos04 +losludib +losohne +losorio +losr71 +lost +lost3507 +lostchc +lostecco +losted +lostinmoment +lostsaka +lostsoul +lot2tor2 +lotelive +lotensin +loteria93 +lotfi +lotgsux1 +lothar +lothar99 +lothar991 +lothce78 +lothlorien +lothor +lotion +loto40 +lotos77 +lotos87 +lotrdori +lotrel +lotrrotk +lotta2008 +lotta5 +lottame +lotte +lotte1008 +lottebeate +lottes +lotti +lotti +lottie +lotto0 +lotto10 +lotus +lotus5 +lotusas1 +lotusone +lotusti +lou +lou1do +lou591 +louane +louba +loubrian +louc1950 +louco +louco25 +louella +louie +louie +louie12345 +louis +louis jean +louis john +louis miehe +louis miguel +louis sheldon +louis0915 +louis481 +louis973 +louisa +louisa +louisa1 +louiscp +louise +louise +louise closser +louise gold +louise1812 +louissa1 +loukoum +loul0804 +loulan +loulla +loulloul +loulou +loulou01 +loumell morgan +loumpi +louna02 +lounge +loungec +lounis +loup3004 +loupcats +loupinou +lourdes +loureed +loutre13 +loutso +louvre +louw +lov08huh +lovana +lovas432 +love +love tom +love0102 +love0211 +love0427 +love0526 +love0807 +love09 +love0924 +love101 +love1014 +love1208 +love1219 +love123 +love18 +love2009 +love2046 +love2go +love2you +love4u +love5125 +love5270 +love7973 +lovead3 +loveadna +loveb33r +lovebaby +lovebeer +lovebobo +lovebugs +loveca93 +lovecs +lovedoku +lovefall +lovefly +lovegirl +loveh8 +lovehema +lovehim1 +lovehurt +lovein19 +loveisme +lovejxl +lovekelsie +lovekush +lovelady +loveland +loveleng +loveless4e +lovelevi +lovelife +lovelisa +lovelolo +lovelove +lovely0711 +loveme +loveme8 +loveme916 +lovemeek +lovemiri +lovemm +lovemok +loveneopet +loveoguz +lovepost +lover +lover33 +loveray +loverboy +loveroni +loverose +lovers +lovertroll +loveryaya +lovesbane +lovesepe +lovesevy +lovesoso +lovespity +lovetv +lovevip +loveyoana +loveyou +loveyuna +loving +lovying +lovynes +low965 +lowelas1 +lowell +lowen82 +lowenstein +lowepro +lowes20 +lowfive +lowflyer +lowimy +lowly777 +lowpyp49 +lowrid +lowrider +lowry123 +lowskill +lowsky +lowspirit +loxas +loxeju9 +loxolo +loyal96 +loyd +loyh1 +loyola +loza +lozanna +lozano8990 +lozinka +lozovik1 +lp +lp +lp-12-02-45 +lp0605 +lp111083 +lp12145 +lp1234 +lp290689 +lp4ever +lp52bp +lp5532ma +lp821102 +lp98f3 +lp994230 +lpaker +lpdladf +lpeerr +lph4sxqk +lpj80928 +lpjx3 +lpjz13 +lpk88 +lpkfj +lpkojihu +lpo1 +lpool +lpp2609 +lpr1389 +lps412 +lpsinvites +lpsk2007 +lpuyp +lq5lllcp +lq95v3 +lqle +lqm3cfp5 +lqmt2681 +lqpbi +lqs15189315555 +lqudi7 +lqw8w +lqwfnlwu +lqxy44 +lqyvi +lr2005 +lr2407 +lr5kvtdp +lr721126 +lraok +lrdfrb +lrdgzx3 +lrfrd0 +lrfvz1dm +lrgb97 +lrgtum +lrj018 +lrjrspm7 +lrofqcg +lrqied +lrs7umsx +lrsm77 +lrt2000 +lrw1230 +ls02ls +ls1204 +ls170195 +ls2325a +ls29ne +ls2e8cj7 +ls4ever +ls8edarw +ls95bc +lsawgr +lsb?! +lsbbbs77 +lsd +lsd24 +lsdreams +lsie4yt9 +lsingd +lsisdead +lsjgo6 +lskdh +lskov80 +lslrvfrb +lsmith59 +lsnc1938 +lspnet +lss1500 +lssah +lstadj +lstevens1 +lsws13 +lsyaafav +lsz999 +lt01ve02 +lt211566 +lt2400 +lt840411 +ltakilla +ltapple +ltaqp +ltawv +ltbbe +ltd0k +ltd12345 +ltechnic +ltfalcon +ltgb14 +lthmz +ltk58758 +ltntf +ltntf88 +ltpepdo +ltplz95 +ltrcrl76 +ltsicher +ltst +ltstmi +ltuae42 +ltvbyf +ltym +ltzh1jcu +lu +lu +lu ann +lu0384j +lu0723 +lu114084 +lu212112 +lu4r13l +lu88z +lu8te9zo +luBoy +luan +luan123 +luana +luana2801 +luano +luar676 +luarns +lub789 +lubelle +lubenita +lubja002 +lubor +lubumba +luc +luc-antoine +luc14b0 +luc4f1g0 +luca +luca +luca0308 +luca0701 +luca91 +lucacor +lucadvd +lucaelion +lucaman2 +lucario17 +lucas +lucas +lucas123 +lucas2 +lucasasher +lucasbidu +lucatoni +lucavito +luce +lucente19 +lucero +lucertola +lucette +lucha +luchi12 +luchino +luchino +lucho +luchy +luci +luci11o +lucia +lucia mello +lucia1981 +lucia22 +lucia666 +lucian +luciana +lucianne +luciano +lucie +lucie33 +luciekevin +lucien +lucien87 +lucien88 +luciene +lucienne +lucifer +luciferno +lucifero85 +lucile +lucilla +lucille +lucina +lucinda +lucinka +lucio +lucius +lucjabek +lucka +lucka20 +luckaffe +luckies +luckshot +lucky +lucky +lucky! +lucky001 +lucky123 +lucky14 +lucky1405 +lucky19 +lucky66 +lucky713 +lucky99 +luckylex +luckyluc +luckyman +luckypei +luckys82 +luckysring +luckystrike +luckytj1 +luckytwo +lucoso25 +lucozade01 +lucrana +lucrative7 +lucren +lucretia +lucrezia +lucy +lucy +lucy lee +lucy4678 +lucy9897 +lucygubi +lucykatze +lucyuser +luczka1 +lud +lud2512 +ludacris +ludata +luddegb +luddi +ludeklos +luder3 +ludhihin +ludmila +ludmilia +ludmilla +ludo +ludo1083 +ludo2512 +ludovica +ludovico +ludvig +ludw1g +ludwig +ludwig +ludwig32 +ludwing +ludwiz +luella +lueqj +luetha2667 +luffe1971 +luffer +luffewil +lufsa2005 +luftdata +lufth4ns4 +luftodan +luftwaffe +lufucafa +lufuzi +lug2233 +lugar +lugdunums +lugeh +luggezie +luggi2310 +lugmne +lugos +lugwig +lui +luibuse +luigi +luigi123 +luigixio +luino007 +luioutoi +luis +luis +luis del +luis dominguez +luis lopez +luis manuel +luis maria +luis medina +luis miguel +luis0489 +luis1992 +luis25 +luis2505 +luis4989 +luisa +luisa +luisa della +luisdee7 +luise +luise2004 +luisella +luisella +luisfigo +luisina +luiskk +luitpoid +luivick +luiz +luiz alberto +luiz sergio +luize +luizka +lujza +luk +luk2 +luk4891 +luka1005 +luka13 +luka2411 +lukaluka +lukaluna +lukas +lukas +lukas0907 +lukas094 +lukas1 +lukas122 +lukas154 +lukas1602 +lukas92 +lukas9301 +lukas999 +lukasb +lukasg +lukask +lukasko +lukasn +lukasoskar +lukassk1 +lukaswer +lukasz1 +lukasz1989 +lukasz50 +lukaz246 +luke +luke +luke1610 +luke21 +luke78 +lukeson +luki +luki01 +luki12 +luki1234 +luki19 +luki69 +lukier123 +lukis +lukiuks +lukluk +luknas +lukosius +lukpad +luksah +luksas92 +luktyllt +lukutis +luky1981 +lukyluke +lula1324 +lula3008 +lulaki +lulalu +luli +lulixx01 +lullabi +lullabym3 +lulle123 +lulli8307 +lullz +lulo794 +lulu +lulu +lulu007 +lulu0207 +lulu129 +lulu13 +lulu2 +lulu2009 +lulubelle +lululu +lulut +lulzim123 +lumatech +lumberjack +lumene +lumes123 +lumetu +lumid33 +lumimies30 +lumina +luminita2001 +luminita770 +luminoki +luminou +lumos7 +lumox3 +lump09 +lumplump +lumpus69 +lumpy97 +lumsan +lumsden +luna +luna02 +luna0306 +luna117 +luna2002 +luna2111 +luna2k7 +luna2sol +luna33 +luna52 +luna53 +luna99 +lunadate +lunagaspar +lunaj225 +lunapark +lunapop +lunar +lunar007 +lunar1 +lunar3300 +lunas +lunatic666 +lunatica +lunatik +lundrim1 +lunelle +lunepa90 +lunetta1010 +lungboy +luniks23 +lunina +lunita +lunitari +lunufilu +lunyranger +luochuen +luohua +luomitou +lup3s +lupa +lupa12 +lupe +lupino +lupita +lupita95 +luplitol +lupo2417 +lupo61 +lupogal +lupoterra +lupowarp +lupu +lupusmax +luqma73 +lurene +lurifax5 +lurker +lurp03 +luryja +luseco +luser +lushr00m +lusi01 +lusifer31 +lusilusi +lusiphur1 +luso9145 +luss2k +lustomatic +luther +luther +luther512 +luther97 +luthero +lutin +lutiz +lutom1 +lutom123 +lutscher +luty1980 +lutz +lutz02 +lutz1302 +lutz6746 +lutzmutz +lutzst +luuser03 +luuville +luuvu4 +luv2buy +luv400 +luvage +luvduv +luvhope +luvsilat +luvsit +luvsteph +luvsue +luvsue75 +luvsyn78 +luwwd02 +lux2125 +luxella +luxi0017 +luxian +luxor6306 +luxsus +luxus9595 +luxusvilla +luz +luz maria +luz2442 +luz666 +luz9tngu +luzbluz +luzifer1 +luzifer5282 +luzifer91 +luzinha +luzroja +luzy21 +lv0511 +lv09216 +lv120034 +lv2av8 +lv4x1111 +lv782 +lvbnhbq +lvbxu +lvc8319 +lvcat3 +lvdb613 +lvgmblnc +lvl +lvm1101 +lvnrq7 +lvpvq +lvtengsj +lvvt3 +lvxoria +lvzxw +lw150701 +lwc42728 +lwer3 +lwglbob +lwjblmas +lwjnbdkr +lwm8d +lwo17h +lwq53s +lwq5n +lwr2t +lwsd2906 +lwstone +lwtqy +lwwadmin +lx3980 +lx3ngtfa +lx76 +lxchgymj +lxclxclxc +lxgiwyl +lxkvt +lxkvu5q2 +lxlniknl +lxna4 +lxvton3 +lxx95 +ly0806 +ly0kha +ly1981 +ly22box +ly69kine +lya +lyax1 +lycanthrope +lycidi74 +lycos +lyda +lyderen +lydia +lydia9680 +lyga1957 +lyhh5 +lyhonghui +lyk629 +lyka263 +lykeny1991 +lykwwi +lyl +lyla +lyle +lyle conway +lylle25 +lyman +lyn +lyn01 +lyn02 +lyn03 +lyna1000 +lynda +lynda day +lynda mason +lyndel +lyndsay +lynette +lynette +lynggo +lynice17 +lynk8 +lynn +lynn-holly +lynn0546 +lynn1998 +lynn4159 +lynne +lynnerup16 +lynnet +lynnse87 +lynnzero +lynsey +lynton +lynux32 +lynx4057 +lynyrd +lynyrd29 +lyons +lyovon +lyrix307 +lys0l! +lysa97 +lysander1 +lysell +lyseuh +lysha9b8 +lystatic +lytuchau +lyubomir +lyubor +lyudmila +lyudmilla +lyvinh +lyvita06 +lyyj88 +lyz12345 +lz2kpd +lz2kpl +lz623be +lzc2495 +lzfcf4yj +lzlznjkz +lzp0rn0 +lztmljo +lzy1995 +löschen +m +m'el +m.blade06 +m000 +m0000h +m000ritz +m00dl3 +m00dle +m00glez +m00ing +m00m00 +m00nbeam7 +m00ndust +m00nf4ll +m00qhp00 +m00zvt +m01639 +m01m0203 +m02151m +m030592h +m040885s +m0469n +m06z1m +m070692m +m071392 +m09914070 +m0Op4s +m0j0n3r0 +m0komaki +m0l0k1a2 +m0m0n3y +m0merath +m0ndego +m0nk3y +m0nocle +m0nty +m0om0o +m0rt4d3l0 +m0rt4l88 +m0rte0 +m0rtg4g3 +m0t0r0la +m0torol4 +m0v30v34 +m0vn0jf4 +m101099 +m102030k +m1134b79 +m113a1 +m113omo1 +m11a63 +m11c68 +m121212 +m121322 +m123 +m1234567 +m12345m +m12dek13 +m134943l +m1387 +m13e5l12 +m1436001 +m1440 +m151980 +m153246c +m15695706 +m16a1 +m1804R +m182wv +m186ba +m189191 +m190487s +m1944 +m1991z +m1992 +m19IzB +m1a2s3e4 +m1a2x3i4 +m1base3 +m1ch3l3tt1 +m1chae1 +m1cheala +m1chelle +m1e2h3e3 +m1eze +m1grand1 +m1ha1l1d1s +m1iO2 +m1j2a3 +m1k177 +m1k1ty +m1ke416 +m1l4r3p4 +m1less +m1lkyway +m1lorde +m1lsucks +m1m2m3 +m1n0t@ur +m1n1m4x +m1n1n0xz +m1nam00 +m1nh087 +m1o2n3k4 +m1r1m1r1 +m1r4yer6 +m1rdlug +m1rku5 +m1sch3ll3 +m1ssf1re +m1ssour1 +m1t5v9 +m1tche11 +m1vlo +m200x3za +m20582k +m2081923 +m2128s +m212srg6 +m2207800 +m22137799 +m22l03 +m22lf22 +m230484b +m23id9y +m242 +m24318 +m2431994 +m24cp3s +m260685j +m26275 +m2710559 +m2745388 +m280385k +m29gn05 +m29scher +m2bqw +m2g6jun5 +m2kpgw +m2nst3r +m2ofd +m2pt1c +m2r28n1 +m2r3p219 +m2ruqcn6 +m2t45844 +m301191g +m3018596 +m303623a +m30773m +m30994 +m3110N +m320603 +m322wvp +m3321bhp +m3357766 +m33gs666 +m33pm33p +m34583458 +m34l0 +m34tplz +m3500f +m35563556 +m359b +m359icy5 +m364tr0n +m39an22 +m3I3x +m3asu +m3d3ll14 +m3d7k8f9 +m3d8r9ii +m3dmd9 +m3dw4y +m3fyy +m3gadriv3 +m3gan +m3gat0n +m3inh3ld +m3ist3r +m3j7u9l +m3k0ng4s +m3k605 +m3kanika +m3l0ny89 +m3l1nda +m3l2ni3 +m3ldrum1 +m3m0ri4m +m3m151 +m3mi12 +m3phisto +m3plg +m3r3d1th +m3r3dy7h +m3rczis +m3rl1n +m3rlin03 +m3s14 +m3t1nvan +m3t62l9 +m3zz2609 +m4 +m41d3n +m43lstr0m +m4531j +m45t3r +m46422618 +m4C11 +m4I5x +m4a1ak47 +m4artini +m4c4rd +m4c4x6 +m4ch1ne5 +m4dc4t3. +m4dd3n06 +m4dl3n +m4dm1k3y +m4dp4nd4 +m4ghz23e +m4gic +m4glx +m4h4k4l4 +m4k4r0n +m4la6 +m4lt3 +m4mp4r99 +m4mxe +m4n0l4ur +m4n1ac +m4nt2 +m4rc01 +m4rc14 +m4rc4cc1 +m4ri4 +m4ric14 +m4rine +m4rkl1n +m4rlb0r0 +m4rt4s +m4sd +m4ss4cr3 +m4st3r +m4tt +m4urr1o +m4xp4yn3 +m4y56s7t +m531x +m53bl352 +m5556602 +m580632t +m59p765z +m5WlEF4249 +m5j7s2 +m5nt00l5 +m5q9887z +m5qdx9i1 +m5trix +m5zn +m60a3tts +m6119781 +m62920 +m6714252 +m67il58 +m6964138 +m6a2p3 +m6aort +m6cto8wd +m6dd9 +m6ehlers +m6mlvfye +m6vaw8k4 +m6xaw +m70310 +m708759 +m72yavuz +m72ym72y +m75158472 +m7654321 +m77046t3 +m78yr2vd +m7e2lp +m7mod +m7xrp +m803ht +m8151973 +m8153z +m821327 +m8231111 +m8389 +m84life +m84r9m +m852l852 +m8590641 +m8HJQR +m8a1r8 +m8a247ax +m8bgbh4f +m8euok +m8fhR4 +m8iklg +m8janix +m8jhdi8x +m8lsx +m8r1s2 +m8tter +m8ujs +m8vee93k +m8viq +m8yda +m90610k +m90s87b4 +m9188102 +m9a9o8r8 +m9f4g5b2 +m9ffw +m9jy6q +m9lea +m9n8b7v6 +m9ny6465 +m9qqn +m9sb8fgc +m9vzfbby +m@tr1@rch +mALERMEISTER +mC250382 +mCnEb42V +mDG5sA +mDahRI +mFeqeG +mIGUEL +mInjIn +mONKEY +mSd8jY +mTr5BM +ma!co!mx +ma011087 +ma01ch +ma061063 +ma070567 +ma0schel +ma1199 +ma121400 +ma1234 +ma123se +ma191062 +ma1975 +ma1980nu +ma19an77 +ma1dz0ia +ma1g2l3 +ma21rt23 +ma221221 +ma2412 +ma270600 +ma2901al +ma2c4ja +ma457000 +ma4un +ma5bm6d +ma670d2 +ma6ina +ma828ram +ma8car +maa +maa123 +maa2002 +maad5502 +maag +maaike14 +maailmaa12 +maal0818 +maalaaga +maamar +maan1 +maanam +maaq21 +maar123 +maaris +maarouf3333 +maarten +maat2000 +mab1126 +mabadjia +mabagou +mabaker +mabe82 +mabel +mabel123 +mabel1ta +mabelle +mabexx +mabeyn +mable1212 +mabok123 +maboki +mabruk +mabs +mabu +mac +mac +mac dara o +mac11 +mac1729 +mac2212 +mac2965 +mac4eaws +mac4life +mac6116 +mac6224 +mac8192 +macadam +macadam2010 +macadamia +macaena +macak65 +macartue +macaskill1 +macasta +macauto +macbeth623 +macbook2s +maccarach +maccix +maccr1 +macdonald +macedo90 +macent69 +maceo +macey +macfee +macfej85 +macfilez +macfly69 +macg1146 +macha +macha +machane87 +macheeee +machidd +machiko +machin +machin02 +machine +machismo1 +machiyo +machty +maciej +maciej +maciej1 +maciej2700 +maciejos +maciek +maciek1 +maciek11 +maciek132 +maciek6 +maciekk1 +macieta +macine +macinek +macintosh5 +macintyre +macito +maciulis +macius +macius12 +macius66 +mack +macka +mackaime +mackan007 +mackbook +mackeliten +mackena7 +mackenzie +mackenzie +mackenzie2001 +mackiejo +mackier1 +mackinaw1984 +mackinlay +mackito +macknife +macko15 +macko18 +mackoz +macktel +macl1926 +maclciii +maclellan +macljumi +maclyn +macmac +macmac333 +maco5woz +macon +maconga1947 +maconius +macos +macoy123 +macpoil +macq14 +macross +macsix +macska +mactoto +macubo +macuco82 +macuili5 +macy +macy +macy102 +maczo +maczo997 +mad +mad1902 +mad3663 +mada2991 +madafaka +madagascar99 +madagaskar +madaleine +madalenas33 +madalina29 +madalynn07 +madame +madame +madame93 +madar5 +madbike +madcat +madchen +madcow +madd70 +madd7465 +maddalena +maddar +maddawgz +madde +maddie +maddie +maddin147 +maddiyam +maddmaxx +maddog +maddog47 +maddog69 +maddoge +maddoggs +maddox2139 +madducks +maddunr +maddy06 +maddymaddy +made +madeira31 +madeleine +madeleine +madeleine$ +madelene +madeline +madeline +madelyn +mademoiselle +maderim +madesst +madeye +madge +madgic88 +madhat42 +madhavi01 +madhead +madhivi +madhoo +madhur +madi66 +madi7788 +madilynn05 +madina +madinina +madinka +madison +madison +madison1 +madisond +madjap +madlax +madlena +madlyn +madmama +madman +madman12 +madman77 +madmax +madmax34 +madmaxo +madmin +madmixx +madness +mado6528 +madolyn +madone +madonna1608 +madraif +madrid +madrid01 +madrid96 +madrox360 +madruga1 +mads +mads1995 +madsen2416 +madsjensen +madsnh81 +madsor +madtea +madtop +madur +madv +madworm +mady +madzia150 +mae +mae2yan +maedl22 +maegalca +maegeri +maelriou +maelstrom +maemi +maenner2 +maerz0. +maestre +maestro +maestro101 +maetix +maeva44 +maf05021 +mafagite +maffersz +maffi1 +maffia12 +mafhh +mafia +mafia007 +mafia24 +mafia4 +mafia55 +mafialao +mafija +mafioso +mafkees +mafr26 +mafukas +mafzepoq +mag#net +mag12ros +mag15ter +mag1a +mag357 +mag6042 +mag77 +magali +magali +magaly +magareto +magas777 +magasuar +magazine +magazzino +magda +magda +magda123 +magda2 +magda789 +magda89 +magdalena +magdalena +magdalenka +magdan2 +magdeburg1 +mage +mage99 +maged +magelan +magens +magenta66 +magert520 +mageta +magetan +magge1 +magget1990 +maggi +maggi3269 +maggie +maggie +maggie13 +maggie2 +maggie98 +maggiewk +maggizwerg +maggot +maggus1986 +magi252525 +magia +magic +magic0509 +magic32j +magic42 +magic554 +magic555 +magic6 +magic61 +magic7562 +magic99 +magical +magicas +magicbox +magicc +magiccar +magichip +magicianshell +magicien68 +magicman +magicman1168 +magicmtg +magics +magics1 +magicsti +magie +magija +magik1 +magika +magikland1 +magios +magique +magirosa +magixxx +maglite +magmedia +magnarty +magnet +magni2010 +magnolia1951 +magnum22 +magnum54 +magnum6 +magnus90 +magnuv +mago8095 +magodeoz +magoo +magoo0505 +magoo176 +magoole +magosia +magpie +magpower +magrat2003 +magrat23 +magray +magrelo +magros12 +mags2693 +magster +magtimer +maguicho +magurl +magusta +magylos +mah300 +maha96 +mahabad +mahabharatat +mahadeva +mahajir +mahal1295 +mahal78 +mahalard +mahalia +maharaj +maharaja +maharani +mahbsa2b +mahdi111 +mahdi373 +mahdi60 +mahdi600 +mahdiah +mahdiye +mahee +maheeya +mahepl +maher +maher00 +mahiedev +mahjongg +mahlon +mahlon123 +mahmood +mahmoud +mahmut +maho1989 +maho230 +mahoaga +mahogany1993 +mahsun +mahun378 +mahyar +mai +mai1977 +mai52mai +maia +maia +maiale +maiblume +maich +maida +maidel +maiden +maiden82 +maiden829 +maidie +maidt28 +maiella +maigorzata +maiile +maijai +maik +maik.. +maik0611 +maik3960 +maik8988 +maik93 +maikati +maikchef +maike +maikedana +maikelos +maikfeliz +maiki64 +maiklgr +maikranz +mail1234 +mail1347 +mail4u +mail5193 +mailaina +mailan +mailbg +mailding +mailemil +mailin +mailmeon +mailmeyn +mailstrom26 +mailun +mailzeit +maimai +maimee +maimunka +main1973 +maina +mainboard0 +maindoor +maine +mainecs +maineteamo +mainframe01 +maingila +mainmain +mainmstr +mainpas +mainsonly +mainstream +mainusch +mainz05 +mainz5 +maira +maira01 +maire +mairead ni +mairmay1 +mais20 +maiscool +maiseu01 +maisie +maiskolben62 +maison +maison3 +maisys +maite +maithuna +maitland +maitran +maiwiese +maiyeu +maj-britt +maj1maj1 +maj99maj +maja +maja +maja123 +maja424 +majaika +majajl +majakas +majamaja +majasilvie +majata +majawe +majcherek +majcimop +majcoa +majed142 +majel +majere1209 +majevica +majic100 +majid999 +majidd +majin +majka +majka15 +majka1977 +majkel18 +majlou +majmun95 +majmune1 +majnanet +majocka +major +major sam +major99 +majora9 +majora99 +majorie +majorka990 +majorplow +majortom +majorymm +majulu +majun000 +majya +mak +mak007 +mak1234 +mak12345 +mak205b +mak226 +mak31ts0 +mak4buyu +maka +maka007 +makaay05 +makakim +makakinas +makalo +makalo11 +makanef +makaogyg +makara kwaitha +makarevich9 +makaris1985 +makarna +makarony +makarovs +makas123 +makaveli +makayla +makc23 +makco +make +make1ts0 +makeitso +makel13 +makeloni +makemoney +maker80 +maker811 +makerangel +makeread +makeway06 +makhmud +makhn67 +makhram +maki +makia +makijato +makiki1128 +makina +makita +makita1m +makito +makkawi +makkelijk000 +makki +makmania +mako +mako5014 +makos89 +makoto +makpass +makrifat +makro72 +makrower +maks6801 +maksi +maksiu1 +maksude +maksym +makumba +maky +mal +mal1234 +mal5150 +mal9846 +mala +mala27 +malabar +malabar59 +malaca61 +malachi +malachi java +malade +malaga +malaga08 +malak +malakas +malaky +malamala +malamar +malamute17 +malandro +malareligion +malatya +malawi05 +malaz +malazija +malboro +malcesine2000 +malchim +malcolm +malcolm bud +malcolm1979 +malcolm401 +malcom +malcom +malcom86 +malcomx99 +maldegem +maldito +maldive +maldivesmura +malecha +malecon3 +malediven123 +malediven2005 +maleducada69 +malee +malegues +malek18 +malekhai +malena +malena91 +malene +malenka007 +malenka123 +malenky +malepse +maler64 +malesef +malev400 +malevolent +malewaze +malfoy22 +malga25 +malgorzata +malgoska +mali +mali007 +malibo +malibu +malibu7 +malice +malicedei +malick +maliforo +malik +malika +malikjr1 +malikmalik +malikrox +malin +malina71 +malinak +malinda753 +malinious +malinka1! +malinkie +malinsa +malique +malisa +malisha +malk5150 +malka +malke123 +malki430 +malkia +malla +mallard55 +mallaton +mallely +maller009 +maller103 +malleus +malleus6 +malli +mallie +mallikas +mallo +mallor1 +mallorca +mallorie +mallory +mallory2020 +mallow +mallrats +malmal95 +malmanis +malmberg086 +malmgren1 +maln6874 +malnatea +malo35 +malo64 +malo6put +maloche +malocoton +malol +malone +maloski +malossi46 +malou182 +malou205 +maloumalou +malove69 +malper +malt36f2 +malte +malte996 +maltekir +malteser +malthe2007 +malthouse +malto1 +maltzeit +maluco +maludegu +maluise +malupan +malus +malus123 +malvado +malvina +malvinka +malwina +malworm +maly +malysh +mam08 +mama +mama007 +mama0178 +mama1004 +mama1010 +mama11 +mama1221 +mama123 +mama1234 +mama13 +mama1701 +mama1970 +mama2000 +mama44ti +mama6447 +mama666 +mama888 +mamad +mamadou +mamae +mamahaute +mamahund +mamainga +mamaino +mamak +mamaka82 +mamaker +mamaki77ee +mamalyka +mamamama +mamamia +mamamia8 +mamamu +maman +maman1 +maman29 +mamapizza +mamarazzi +mamarodica +mamasata +mamaschka +mamaseta +mamaster +mamasu +mamata +mamatata1 +mamaw1984 +mamba +mambaj80 +mambana +mambo123 +mambo22 +mambo444 +mambo99 +mambokane +mambono5 +mambopk +mambos10 +mambouh +mambrobo +mambu +mambuca +mamdir52 +mamelade +mameladen1 +mameluco +mamenebo +mameuniv +mamexcbo +mamfrobo +mamhrobo +mami +mami. +mami0301 +mami1952 +mamie +mamijot +mamiko +mamilic +mamina1981 +maminka +mamita198 +mamita2 +mamix +mamjtubo +mamli1 +mamm34ut +mamma +mamma123 +mamma500 +mammam +mammananna +mammasoscar +mammelfx +mammma +mammoda2 +mammut +mamnouze +mamnubap +mamo +mamogupa +mamona12 +mamour +mampasms +mams1924 +mamtoo +mamuka +mamulis +mamun +mamyte +mamzvobo +man +man +man chi +man0n +man0rash +man16 +man1jak5 +man234 +man2a +man4720 +man4fred +man5on +mana33 +manager +manager15 +managers +managua1313 +manakos +manart +manastrudel +manat +manatarms +manatee +manay7 +manaz123 +manbat00 +manch0n +manchester +manchitaaa +mancho +manchot35 +mancie1 +mancio1983 +mancity +manco +mancool +mancy +mand1001 +manda +mandabas +mandala8 +mandar04 +mandarin91 +mandarina +mandarinas +mandas +mandelbrot +mandeo10 +manderly +mandi +mandigolf +mandil +mandinga +mandiraci72 +mando28 +mandr21 +mandragola +mandragora +mandrake +mandred47 +mandrem +mandrik +manduck +mandurah +mandy +mandy +mandy rice +mandy00 +mandy1010 +mandy210 +mandyhexe +mandyilu +mandymae +mandysue +manel +manelm +manezao +manfred +manfred +manfredus +manfried +manga +manga13 +mangaka +mangamanga +mangekyo86 +mangela +mangiume +mango +mango123 +mango3728 +mango848 +mangobus +mangopen +mangosof +manhgh +mani +mani123 +mania38 +maniac +maniak12 +maniak9 +maniaxis +manic111 +manics +manidipa +manie +maniek33 +manifest +manifest86 +manija +manila +manilein +manimanta +maninette +maninpink +maninred +manio118 +manisman +manita +manitass +manitu +maniura +manius95 +manja +manjau16 +manji08 +mankeli1 +mankos30 +manley +manman +manmeet +mann +mannaxxl +manne1808 +mannen88 +mannequin312 +mannheim +manni +manni0808 +manni81 +mannie +mannimu +manning +mannix81 +mannli +manno2007 +mannok +manny +manny +manny666 +manochao +manocska +manoel +manoel1 +manojit +manokak +manol +manolete +manoli +manolico +manolito +manolo +manolo +manolo13 +manoman +manomano +manon +manop +manos +manos1 +manos2004 +manosinka +manoter1 +manoue +manouk5 +manowar +manpreet +manresa +manricox +manriri +mansanto +mansche4 +mansfield00 +manshy +mansikoc +mansjoerg +manslayer +manson +manson65 +mansos3490 +manssvensson +mansur123 +mant1989 +manta1 +mantaan +mantab1234 +mantan +mantas +mantenimiento +manticore26 +mantis +mantle +mantles +manto +manton +mantoox +mantuxas +manu +manu +manu0815 +manu1204 +manu123 +manu18 +manu2322 +manu2706 +manu306 +manu34 +manu55 +manu87 +manual +manualfa +manuca94 +manucop +manue +manue101 +manuel +manuel +manuel23 +manuel30 +manuel49 +manuel69 +manuel88 +manuela +manuela +manuela1 +manuelch +manuelh1 +manuelku +manueltp +manuelw +manueo +manuman +manumanu +manunba +manund +manunka +manurpe +manush81 +manutd +manutd1 +manute +manuv50 +manwaterboy +manweldi +many +many17 +manya +manyaa +manyak +manyaq +manygay +manyi +manylai +manzana +manzoni +manó +mao0f +mao3699 +maoam +maop2eto +maorak12 +maoriora +maoye +maoz0 +mapa2000 +mapa2887 +mapache +mapalla +maparo +mapaso +mapass +mapatrie +mapauser +mapcerey +mapemape +mapf +maphia +maphin +maple city +maple1 +maple1337 +mapleiloveu +mapleisgood +maplejacky +maples +maplevoodoo +maporita +mapppp +mapuce +mapuce5 +maq8810 +maqinox +maqkilud +maqui80 +maquiavelo +maquis21 +maquitor +mar003 +mar007 +mar01hen +mar123 +mar1388 +mar1997 +mar1g01d +mar455 +mar5793 +mar61273 +mar7433 +mar77a +mara +mara +mara scott +mara314 +mara496 +maraba +maraban +marabeam +maracuya007 +maradona +marahai +marakuja +maralola +marana1 +maranatha +maranda +maranda1 +marangha +maranhao1884 +marano90 +marapaint +maras84 +marasi +marasko +marasri +maratesz +marath0n +maratkz +maraton45 +maravilla +maravilladx +marazino +marbella65 +marble88 +marbles +marburg911 +marc +marc +marc ernest +marc-henri +marc1234 +marc1305 +marc1375 +marc15 +marc1989 +marc2103 +marc85 +marcadm +marcano +marcaria +marceb +marcel +marcel +marcel46 +marcel82 +marcela lopez +marcela1 +marcelaine +marcelina87 +marceline +marcelino +marcell +marcella +marcelle +marcello +marcello +marcelo +marcelo +marcelo chavez +marceloa1707 +march10 +march22 +marchelo009 +marchewka +marchjoe +marchtown +marci +marcia +marcia jean +marcia mae +marcia44 +marciap2006 +marcilla +marcin +marcin.z +marcin1 +marcin11 +marcin14 +marcin2008 +marcin25 +marcin88 +marcinek +marcinek23 +marcinh +marcinkowski90 +marcino14 +marciosa +marcjan +marcl1488 +marco +marco +marco antonio +marco3930 +marco456 +marco79 +marcoholzer +marcoio +marconi13 +marcop +marcopolo +marcos +marcos1993 +marcos38 +marcosnavarro +marcospc +marcoule +marcov +marcoxx +marcrh +marcus +marcus +marcus1404 +marcus15 +marcus83 +marcusla +marcweik +marcy +marda +mardikms +mare +marec +marek +marek +marek15 +marek1989 +mareks +mareleser +marella +maremare +maren +maren +maren123 +marena +marenghi1 +mareno +mareoma +maresa6 +maretha +maretta22 +marfa +marga +marga +marga ann +margalo +margaret +margaret +margareta +margarete +margaretha +margarethe +margaretta +margarida +margarida1 +margarita +margaritas73 +margarito +marge +marge88 +margeo2009 +margera +margery +margherita +margherita +margia +margie +margit +margit78 +margo +margo +margo23 +margolis1 +margorie +margot +margoz +margrethe +margrit +margrit +margrit evelyn +marguerita +marguerite +marhouni +mari +mari +mari carmen +mari-claire +mari2212 +mari6969 +maria +maria +maria claudia +maria conchita +maria elena +maria grazia +maria klens +maria lucia +maria luisa +maria manuela +maria ouspens +maria pia +maria rosa +maria teresa +maria theresa +maria! +maria1943 +maria4206 +maria80 +maria911 +mariaemma +mariah +mariah9790 +mariaha +mariahcarey +mariaka +marialina44 +marialuisa +mariamy8 +marian +mariana +mariana +marianasandra +mariangela +mariani +marianna +marianne +mariaux +maribel +maribor123 +maribu +marica +marich2909 +maricka +mariclare +marico +maricruz +marie +marie +marie louise +marie-ange +marie-charlott +marie-france +marie-helene +marie-jeanne +marie-jo +marie-jose +marie-josee +marie-louise +marie-luce +marie-luise +marie-paul +marie-sophie +marie1a +marie1luise +marie255 +marie69 +marie919 +mariej +mariejosee +mariel +mariella +mariella +mariene +marienr1 +marieriek +marieskids +marietta +mariette +marija +marija +marijeta2006 +marijo2 +marijuana +marijus +marika +marikas +mariko +marilee +marilia +marilina +mariline +marilse +marilse1 +marilu +marilu +marily +marilyn +marilyn +marilyne +marimba011 +marin3000 +marina +marina +marina24 +marina9 +marinams +marinda +marine +marine +marines +marines19 +marinette +marino +marino13 +marino1309 +marinx +mario +mario +mario07 +mario07 +mario12 +mario21 +mario244 +mario3264 +mario4455 +mario6 +mario64 +mario77 +mario90a +mariobiondi +mariog88 +marioj1203 +mariok28 +mariola +mariola1974 +mariolina +mariom +mariomario +marion +marion +marion1966 +marion53 +marionsa +mariorende +marios1984 +marios1988 +mariosi +mariposa +mariposamj +maris +marisa +marisa +marisa2102 +marisa97 +mariscal +marise +marisha2630 +marishka01 +mariska +marisol +marisol2012 +marit +marit4678 +marita +marita +marite +maritro +mariukas +mariukass +marius +marius +marius101 +marius30 +marius957 +mariusus +mariusz +mariusz0712 +mariza +marj +marj2000 +marjam52 +marjanxx +marjorie +marjorie ann +marjorie babe +marjory +mark +mark +mark linn +mark1130 +mark135 +mark1692 +mark2 +mark2509 +mark40 +mark4124 +mark7031 +mark8amy +mark921 +markabroad +markaloha +markanthony +markass +marked +markedman +markel11 +marker +market1 +marketa +marketeria +marketing +marketka +markev +markeye1 +marki +markiboy +markic +markie2811 +markiee +markings +markje2 +marklove +markman +marko +marko +marko333 +markoch +markoni +markonio +markpj +markuik +markus +markus02 +markus13 +markus16 +markus2509 +markus87 +markusdahlke +markusman +markusw +markview +markwest98 +marky +markyb +markyp +markz881 +marlE0 +marla +marlane +marlanne +marlboro +marlboro1 +marlborough +marlea48 +marlee +marleen +marleen99 +marlen +marlena +marlena89 +marlencia +marlene +marlene +marlene115 +marlene2603 +marlenes +marlenka +marley +marley +marley28 +marlies +marlin +marlin +marlin15 +marlineb +marlis +marlis1 +marlo +marloes7 +marlon +marlon +marlonjm +marluko1 +marly +marlyn +marmar90 +marmara1 +marmaras +marmaras2007 +marmelade +marmelade! +marmelat +marmoset11 +marmot +marmotas +marmotta +marmotte +marmus +marne +marneus +marni +marnie99 +marnix133 +maro +maro1029 +maro2901 +maroalone +maroc +maroc12 +marode +maroh225 +marokana +maroni +maroo123 +maroula +marpar +marpessa +marquis3 +marquita +marraj00 +marrakech +marrar72 +marraru +marrian +married +marrim +marrio +marrkan +marrko +marrona +marry +mars +mars0719 +mars13 +mars1506 +mars2008 +mars2045 +mars25 +marsan +marschi +marsea +marseille +marsella +marsha +marsha mae +marshal +marshal01 +marshall +marshall +marshall12 +marshall56 +marsipan +marsli1 +marsman8 +marso10 +marsok +marsterra +marsters12 +mart +mart1 +marta +marta +marta04 +marta123 +marta1989 +martamichal +marte +marte0743 +martellimarco +martello1 +marten +marten +marteng1 +martens +martensan +martha +martha +marthe +marthinsen21 +marthy2201 +marti +marti +marti5 +martialarts1 +martica31 +martigny +martijn +martijn11 +martillus +martin +martin +martin harvey +martin01 +martin0211 +martin1151 +martin16 +martin1997 +martin21 +martin49 +martin4o +martin71 +martin766 +martin87 +martin88 +martin92 +martina +martina62 +martine +martine +martinekul +martines +martinez +martini +martinie +martino +martinschnelle +martita +martius2761 +martuke +martulka +marty +marty12 +marty123 +marty5 +martyn +martyna +martyna +martynas +martz +maru +maru +maru0077 +marucha +maruchi +marudi01 +maruecos +maruja +marujita +marukame +maruko +maruli +marus2003 +maruschka +marusia +maruska +marv +marv1234 +marvel1987 +marvelle +marveln +marvimi +marvin +marvin +marvin1 +marvin42 +marvintm +marvis +marwan +marwintiger +marxfang +mary +mary agen +mary ann +mary beth +mary elizabeth +mary ellen +mary jane +mary jo +mary kate +mary kay +mary lou +mary louise +mary margaret +mary miles +mary monica +mary nell +mary stuart +mary tyler +mary1389 +mary145 +mary74 +marya +maryam +maryam49 +marybeth +maryedith +maryeva8 +marygold +maryh123 +maryjane +maryland2004 +marylin +maryna +marynarzz +marynka1 +marynme2 +marypain +maryport +marys +maryse +marysia +marysin +marysol +marzenie +marzetti5 +marziey +marzipan2 +marzura +mas1984 +mas2000 +mas22ter +mas9n9 +masa224 +masacota +masacred +masafaka +masaha +masahiko +masahiro +masakari1 +masakasm +masako +masami +masamune +masarn1a +masato +masaxiro +masayuke +masayuki +masazumi +mascagni09 +mascha +maschatilly +maschine +maschmann72 +mascho01 +maschweg +masciam1 +mascomp +masegosa +maserati4200 +masfeleve +masfina0 +mash +mash132 +masha007 +mashal +mashaqi +masherman +mashkal +mashugly +mashy +masi2314 +masiar +masicank +masimo +masina +masinyte +masita +masja +mask +masken69 +maslo +maslucas +masneda +masnic +masofx +masoht +mason +mason00 +mason0811 +masonfan +masora00 +masoud321 +masqbus +massacre117 +massanzug +massart +masseband +masseur13 +massimiliano +massimo +massimo +massiv +massive1 +massmass +massmode +mast1963 +mast3rp13c3 +masta111 +mastah +mastah221 +master +master russell +master01 +master0666 +master09 +master1 +master12 +master17 +master22 +master3005 +master35 +master45 +master5 +master5290 +master615 +master65 +master76 +master81 +master88 +master99 +masterbat3 +mastercard91 +masterd +mastere +masterer13 +masterjg +masterk +masterkey +masterlc +masterlicks +mastermaster +mastermind +mastermovies +masterof42 +masterok +masterp +masterpiece430 +masters +mastert +masticate +mastice +masting +maston +mastrom +mastrpce +masty84 +masuk +masukkan +masur13 +mat +mat2275 +mat62bet +mat667 +mata +mata83 +matan67 +matana99 +matango +matank +matao +mataram +matarawi +matareyes +matchless +matchman +matchup1 +mate93 +mateblau +mateev78 +matej000 +mateja +mateklos +matemate +matematica +matematika +mateo35 +mateo89 +mateo99 +mater1977 +matera +materials +mates +matest +mateu1 +mateusz +mateusz1 +mateusz1321 +mateusz26 +mateusz3633 +mateuszb +matfly +math0209 +mathafter +mathdept +mathe +matheux25 +mathew +mathew +mathfy1 +mathias +mathias +mathieu +mathieu +mathieul +mathilda +mathilda +mathilda1002 +mathilde +mathilde +mathix +mathss97 +mathteam +mathwhiz +mati04 +mati90 +matias2211 +matiasu2 +matigae +matilda +matilde +matina07 +matino +matio123 +matirasa +matita +matjac2 +matjac90 +matkal12 +matkhau +matkim +matko887 +matma12 +matmat +matmon +matosacy +matoub +matp +matpgm +matr1x +matre +matrena +matrine +matriosca99 +matrix +matrix0601 +matrix1 +matrix11 +matrix13 +matrix1302 +matrix135 +matrix2 +matrix22 +matrix2k +matrix714 +matrix82 +matrix84 +matrix86 +matrix93 +matrixx +matrox +matrox02 +matrox05 +mats +mats56 +mats66 +matscape +matselin +matsi666 +matson +matt +matt +matt0304 +matt0509 +matt0606 +matt07 +matt12 +matt123 +matt1234 +matt1478 +matt16 +matt3do5 +matt423 +matt558 +matt6t9 +mattangie +mattat415 +matte0114 +matteo +matter1001 +matter12 +mattes +mattes00 +mattes9814 +mattgroe +matth123 +matth77t +matthei +matthew +matthew +matthew3 +matthew509 +matthews98 +matthias +matthias +matthias! +matthieu +matthieu +matths +matthwee +matti27 +mattia +mattia1982 +mattias +mattie +mattie1103 +mattie2201 +mattig +mattis1337 +mattj0hn +mattman9269 +mattone +mattpass +mattsuck +mattti +matty +matty208 +matty22 +mattyb24 +mattyn +mattze +matumba +matumba +matun2 +matus +matus123 +matux22 +matwocuj +matzas4505 +matze +matze1a +matze4u +matzeking +matzel211 +maubau +maud +maude +maude turner +maudie +mauii2000 +maujin +maulsid +maulwurf1 +maulwurf3 +maumau +maumedis +maunza +maupka +maupower +mauq0 +maura +maureen +maureen2 +maureene +mauri +maurice +maurice +maurice00 +maurice1 +mauricio +mauricio +mauricio2 +maurico +maurie +maurin +mauritius +mauritz +maurizio +mauro +mauro1337 +mauro20 +mauros0900 +maury +maus +maus1606 +maus1964 +maus1968 +maus2004 +maus2504 +maus323 +maus7170 +maus77 +mausebi +mausel12 +mauser75 +mausert +mausi +mausi010 +mausi1 +mausi13 +mausi14 +mausi2302 +mausi24 +mausi492 +mausi86 +mausi9311 +mausie +mausix17 +mausko +maustmaust +mautzi +mauzi007 +mauzie1 +mauzinger +mav2000 +mav2111 +mavaffa +mave0153 +maverick +maverick2010 +maverik34 +mavi2x +mavikedi +mavirock +mavis +mavishim +mavitest +mavrom +mavsucks +mawaddah +mawan +mawena +mawerick +mawson21 +max +max +max001 +max005 +max11722 +max1203 +max123 +max1412 +max16 +max1956 +max2002 +max2005 +max225 +max2554 +max2604 +max56x +max75 +max82392 +maxadmin +maxandan +maxandr +maxbella +maxdata +maxdelux +maxelino +maxell +maxell92 +maxellnisse +maxellterra +maxellus +maxene +maxent55 +maxers +maxfan78 +maxfield +maxi +maxi110 +maxi1912 +maxi1981 +maxi1990 +maxi1993 +maxi2003 +maxi637 +maxi92 +maxibeau +maxie +maxikiki +maxim +maxim1 +maxima712 +maximax1 +maxime +maximilian +maximilian +maximilian33 +maximiliane +maximka27 +maximlee +maximo +maximr +maximsam +maximum +maximus +maxine +maxine +maxiterra +maxiu1 +maxklax +maxl +maxmax +maxmax89 +maxmaxy +maxmini +maxmsmax +maxnik14 +maxou459 +maxou58 +maxpayne +maxpayne159 +maxphoto +maxpower +maxsixs +maxtis +maxtol +maxuser +maxwel123 +maxwell +maxwell +maxwell1 +maxx +maxx11 +maxxman +maxxtro +maxxtro2 +maxy1984 +maxyfm82 +maxyma +maxymuss +maxytech +maxzuber +may +may100 +may15 +may1940 +may21 +may2275 +may2525 +may2584 +may51890 +may7p +may80kel +may898 +maya +maya1 +maya2001 +maya28 +maya4you +mayababy +mayacat1 +mayacim +mayajin +mayana22 +mayapple91 +mayar0se +mayazein +maybe45 +maybelle +maybelle +maybenow +maybery +maycry +mayday +mayday06 +mayday14 +maye +mayek33 +mayer3014 +mayeu20 +mayeya +mayfer +mayfield +mayh3m +mayheim1 +mayk1616 +maykel29 +maykkk +maylands6051 +maymay +mayme +maynard +maynard3 +maynard9905 +maynecao +mayo +mayo1091 +maypt633 +mayrata +mayris chaney +maysie +maythe +mayu1985 +mayumi +mayurachat +maz1973 +maza84 +mazac +mazafaka +mazajie +mazak123 +mazaltov +mazbut +mazda +mazda1 +mazda3 +mazda323 +mazda626 +mazdaasdf +mazderka +mazed +mazeur3 +mazharne +mazia +maziarz1 +mazija +mazinga +mazinzeon +maziton +mazius +maznak +mazot62 +mazunte +mazz1995 +mazz666 +mazze123 +mazzone-abbott +mazzy +mb112165 +mb1352 +mb140476 +mb1609 +mb1988 +mb2004 +mb230e +mb2me123 +mb379546 +mb383ruv +mb3jkh +mb4nchg7 +mb6131 +mb6391 +mb642412 +mb9979 +mba2phd +mbadmb +mbarth +mbayrak +mbb13766 +mbbx9nh2 +mbc31081 +mbcenter +mbcochem +mbcorpo2 +mbe0211 +mbelink9 +mbenz +mbeshk +mbgspr01 +mbh2159 +mbisudfx +mbjerky +mbk8376 +mbkhu +mbl7362 +mbmbmb +mbmd1m +mbmh123 +mbmovie +mbn76324 +mbo2001 +mbombo +mbor +mbp4glim +mbp86c +mbpky +mbr2103 +mbr7763 +mbroetje +mbstek +mbt18 +mbtuzcu +mbue00 +mburak +mbx24 +mbyte00 +mbzkq +mc02301 +mc03020 +mc090290 +mc0909 +mc100399 +mc11684 +mc1211 +mc130768 +mc139115 +mc1951 +mc230875 +mc2425 +mc25q6 +mc2isp +mc4091 +mc46uxhe +mc502180 +mc7905m +mc7tuc +mc8cb49 +mc9230 +mc9692 +mcadmin +mcafee02 +mcarmona +mcat +mcat1024 +mcazure +mcb34tm3 +mcc123 +mccartney1 +mcceja +mccjg9 +mccullough99 +mcd022 +mcdjk +mcdonald +mcdonald54 +mcee7ybp +mcelal +mcelvi +mcemouse +mcf2557 +mcfcmcfc +mcfire +mcflop +mcg0v3rn +mcgarity +mcgk3cgn +mcgoo1 +mcgovern +mcgowen74 +mcgrewse +mcil45as +mckiller +mckwak11 +mcky750 +mclaren +mclaren29 +mclearen +mclo70a2 +mcmaster +mcmc92 +mcmccmmc +mcmillan +mcmlredr +mcmlxxix +mcmrm3 +mcnabb5 +mcnamara3 +mcnasty11 +mcnofear +mconway1 +mcorner +mcotne +mcpayne +mcpioch +mcrima45 +mcrush +mcsacool +mcsb123 +mcse4me +mctavish1 +mctibi +mcveigh10 +mcw23 +mcyf1 +mcyihwd2 +mczk0 +mczkw +md +md1007 +md1103mw +md120104 +md2010 +md3286 +md3g8tib +md4 +md5 +md5001 +md50202 +md5conv +md5hash +md5mhm +md5pass +md5sum +md6md7 +md747920 +mdadmin +mdangers +mdata +mdavis1929 +mdawg +mdawg1 +mdbdiego +mdboerde +mdc2211 +mdca3490 +mdcec +mdcl3108 +mddn3691 +mde040 +mde089de +mdelma22 +mdeneri +mdev374 +mdex +mdfclan +mdfjk +mdg3mdg3 +mdged63 +mdh2006 +mdh5923 +mdj404 +mdjh +mdk32373 +mdkclan +mdl1975 +mdlr13 +mdma1969 +mdma250 +mdmp0347 +mdnidj5 +mdp +mdp12345 +mdp48v9 +mdpmdp +mdpt1975 +mdptth +mdr +mdr6kulk +mdrpop +mdsr505 +mdstro +mdtfx70e +mdtks +mdv31npm +mdw1213 +mdx600 +mdxt +mdxt2 +mdxt3 +mdxts +me +me-me +me109g6 +me1223 +me1426ro +me1than +me2000 +me2005 +me251269 +me259699 +me280163 +me280276 +me2you +me304er +me310762 +me4love +me5326 +me553355 +me661222 +me757234 +me8h9p +meM0ry +mea123 +meade6 +meadowlark +mealdeal +meamiga +meandlin +meandu00 +meaning2 +meannn +means +meansbeans +meant2be +mearshon +meat12 +meatbridge +meatfree +meatis86 +meats1126 +meatspin +meatterra +mebram +mebrother +mec4tyuf +mecana1024 +mecb63 +mecc2401 +mecca11 +mecha +mechanical +mechelen1985 +mechoci +mechteddy +mechthild +mechviper +mecki +mecki65 +meckju +mecklan +mectruy +med +med0 +med1one +med30il +med3615 +med48ina +medabee +medadm +medafx +medalla +medalof1 +medap +medcraft93 +meddo1993 +mede11in +medea +medeco7470 +medeiros +medelfm +medelhfm +medelim +medford +medi +medi0103 +media +media21 +medialab +mediaman1 +mediamit +mediat01 +mediata +mediatech1 +medicat +medicine +medick135 +medidok +medien06 +medienfrosch +medienguru +medikana +medil +medina +medina1 +medine01 +medion +medion1 +medion18 +medion22 +medira +medium19 +mediumquelle +medkayas +medline12 +medlist +medmahdi +medman1 +medmek67 +medo152 +medokin0 +medomode +medousa7 +medravic +medspa1 +medulla +medusa +medusa1809 +medusa25 +medusa99 +medusantica +meduse +medutis +meduza +medved +medved17 +mee0843 +mee55 +meecham +meegan +meekster +meeli +meeliite +meepsheep +meerat +meesh001 +meesha +meet +meether1 +mefis1 +meforget +mefreakz +mefto +meg +meg543 +meg666 +mega150 +mega4 +megachef +megadet +megadeth +megadeth95 +megadrive +megagirl +megagorky +megakey +megalight +megaloman +megaman +megamash +megami04 +megami42 +megan +megan +megan2221 +meganal +megane1 +megane75 +meganedti +meganm1 +meganmac +meganna +meganob1 +megapass +megapharm +megaports +megapreis +megarouge +megaskod +megasxlr +megatron +megaxx +megazone +megge +meggy0817 +meghan807 +meghan98 +meglic +megmeg +mego771 +megs +megs1972 +meh07 +meh101 +mehdi +mehdifes +mehdov +mehet +meheume +mehiyo +mehlhardt +mehman +mehmet +mehmet06 +mehmet1 +mehr +mehrbod +mehrdad +mehtee +mei +meidolno +meier +meiers24 +meije1 +meikade +meiko +meikomelina +meimei +meimei1970 +meinaaj4 +meinarzt +meinemau +meineoma +meiner +meingot +meinhart +meinholz +meinkampf +meinmaik +meinolf01 +meinpass +meinpw01 +meinraute +meinrijs +meins89 +meinsix +meinv321 +meipb +meir +meira +meirasch +meirtz9 +meisgreg +meissen +meister +meister1 +meisterschaft +meiwuai +meiyilai +meizumeizu +mej23fdt +mej3064 +mejes48 +mejesan +mejia90 +mejiapercy +mejlius +mekanik34 +mekanq +mekika +mekkev +meko +mekongas +mekwento +mel +mel!ssa1 +mel0die +mel1issa +mel24red +mel4life +mel7me +mela3004 +melachris +melancolia +melancolie10 +melandru +melani +melanie +melanie +melanie1 +melati44 +melba +melboune +melbourne +melbourne +melchiorre1 +melegim +melek +melendez0 +melendy +melfe11 +melfina1 +melfoxy +meliamne +meliana83 +melichus +melih223 +melin123 +melina +melina +melinda +melinda +melinda!0 +melindas +melinita +melino007 +melis1177 +melissa +melissa +melissa1 +melissa1! +melissak +melita +melkarie +melkem +melker00 +melker40 +melkor1 +mell1973 +mellanie +melle89 +meller9269 +mellesio +melleva +melli13 +mellon +mellow +mellowd1 +melly9369 +melocactus +melodee3248 +melodi +melodie +melodie +melody +melody +meloku +meloman +melon +melon07 +melon1507 +melone2d +melonhead2 +melonik11 +melora +melord52 +melorin +melovedr +meltem +meltface +melville +melvin +melvin72 +melvyn +melwood1 +mema +meman6 +memaster +mematt +member +membership +memberskole +membre +memduha +meme +memedias +memele +mememe +memily12 +memito75 +memkan +memleket +memmaker +memmo +memnarch +memnune +memo +memo +memo1991 +memo2 +memocan +memoemin +memomemo +memorex +memorex1 +memoriam +memory +memphys +memster +memtb +memxwtwh +memyselfandi +men +men1 +men490 +men52556 +men5478 +men5641 +mena +mena179 +menace +menace58 +menahem +menasse291 +menc1337 +mencas +mencia66 +mende671 +mendebil +mendel46 +menderes +mendesxx +mendezz +mendigo1234 +mendillo1 +mendoza22 +mendy17 +menel +mener +meneses +menesis +menet78 +menethill +menetket +meneves2 +meng +meng2544 +mengina +mengmeng +mengna1222 +meni15 +menia +menime +meninblack +menken56 +menno2701 +mennsite +menofy +menorca1996 +menorca79 +menosay +menric +mensaje +menschenhaut +menscini +mensi14 +ment0s3 +mental +mental02 +mental0408 +mental4 +mentally5 +mentap +mentas +mentedi +mentj1 +mentor4931 +mentos22 +menu +menu1234 +menzura +meogon +meones +meosn +meow666 +meowacat +meowcake +meowkitty +meowmeow +meowmeow0586 +meowmix +mepass +mepelapa +mephisto +mephisto1001 +mepissa +mepjep +mepogi +mepr9001 +meqwl +mer12lin +mer1cury +mer1t1 +mer5gabo +merafu49 +meral +merata +merc3d3s +mercator +mercedes +mercedes +mercedes256 +mercedes411 +mercedez1234 +mercenaries09 +mercer +merche +merche03 +merchel +merci0815 +mercile2924 +merciless93 +mercredy +mercurial +mercurio +mercury +mercury2 +mercury5 +mercutio00 +mercyful9 +merdamole +merde +merde05 +merde312 +merdeh66 +merdemerde +merdeta +merdina1 +merdiwen +meredith +merek +merello +merendina9 +merets +merf0626 +merf2307 +mergulho +mergyte +merhaba +merholm +meri +meri91 +merial +merida90 +meridian1 +meriel +merima +merit8888 +merkel22 +merkur1 +merkur2007 +merkur24 +merle +merlin +merlin +merlin02 +merlin1 +merlin11 +merlin50 +merlin7 +merlin77 +merlin89 +merlin99 +merlindu +merline1 +merlino +merloni789 +merlot +merlyno +mermet +merna +mernice01 +merona39 +meronmeron +merrie +merrill +merritt +merry +merry +merser +mert1453 +merten36 +mertens +mertmert +merton +mertonur +mertosti +mertx8 +merulz +merv +mervenur +mervyn +merwin +merwy +mery4me +meryem +meryl +mes224 +mesa24 +mesahz18 +mesalina0 +mescal +mescal75 +mescalit0 +mescja66 +mesdiode +mesfils +mesghena +meshach +mesho +mesho0o9 +meshut +mesiti +mesitis +meskasas +meskillers +meskute +meskutis +mesmots +mesola +mesples +mesquite +messab +message +messager +messedup +messen123 +messi1 +messiah1 +messina1 +mester5! +meston6 +mestrado +mestral74 +mestre +mestro33 +mesut +mesutmesut +met1zeon +met443co +meta +meta +meta2009 +metaal +metakix +metal +metal1 +metal386 +metal540 +metal97 +metalbr +metalgear +metalhead +metalica46 +metallica +metallo78 +metallx +metalman007 +metalov1 +metalsecure +metalsu +metalx! +metamec2 +metan +metatron +metaxas1 +metay +metbrauer +metc123 +metcal99 +metdid +mete +meteocrash +meteoedu +meteora +meteque +metesey +meth11 +metha999 +methadon912 +method +methodes +methodman +methos0 +metin +metin254 +metinbjk +metis +meto202 +meto5757 +metod +metodio7 +metojavi +metoyou2 +metracky +metrapont +metrebus +metred3 +metril +metrix24 +metro +metroid +metroid0488 +metroid87 +metroid9221 +metropolis +metrs +metta +mettametta +mette +mette1997 +mettwurst1337 +metty5980 +metu1994 +metz4326 +metz79 +metzages +metzger +metzler2006 +meuamor +meucci +meuco +meuh2003 +meuhhh +meuhmeuh +meurey +meuway +mev1mtnl +mevange1 +mevingas +mew +mew100 +mewmew +mewnmew +mewtu1 +mewtwo +mewtwo22 +mewtwo64 +mewviwug +mewwinners +mewxucox +mex01 +mex32tme +mexicanpirate +mexico +mexico99 +mexicool +mexx +meydey +meyer +meyg1904 +meysune +mez3gev4 +mezar +mezart +mezcmine +mezfozef +mezginas +mezkemcd +mezoued +mezzanine +mezzasega +mezzo +mezzomix +mf00745 +mf011269 +mf0983 +mf35ykcn +mf3kbg8c +mf6gk9gk +mf783v7e +mfa4150 +mfc +mfc24 +mfcrules +mfd1b +mfd2hd +mfecz +mff83 +mfgDuP +mfgmfg +mfgmikel +mfiidu +mflx45me +mfmht95 +mfninn +mfnm56 +mfnww +mfofqm17 +mfund4 +mfurkan +mfz3003 +mfzdaiox +mg080350 +mg135789 +mg1550 +mg1976mg +mg1984 +mg2224 +mg3l13r +mg5841 +mg666666 +mg693h2 +mg808 +mgConsult +mgZ315pLJ8 +mgcool +mgcqpcah +mgdha5ky +mgeyii +mgfcioo +mgg197 +mggok +mgh28021 +mgh3588 +mgiessen +mgj1978 +mglboy +mgm2l +mgmga4 +mgmtcrm +mgntml +mgom4 +mgp1385 +mgs2 +mgscholz +mgssgm +mguy2840 +mgw24gw +mgxey +mgzz +mh005093 +mh050903 +mh140980 +mh170179 +mh181046 +mh197541 +mh1988 +mh1le +mh2006 +mh230279 +mh274266 +mh6oqjpx +mh731991 +mh734764 +mh8762 +mhE0W9 +mhabad +mhagl +mhardy22 +mhb1967mhb +mhc9bac3 +mhd0815 +mhd2001 +mhdh03 +mhdljs69 +mhdosin +mhezv +mhfat +mhfe92 +mhff4bws +mhhytnv +mhl901r +mhlachen +mhlehl +mhll0831 +mhm21a +mhmeed +mhn0h +mhn8271 +mhnmhn +mho3824 +mhoerder +mhp5269 +mhqww228 +mhrmhotl +mhs2k +mhsxct +mhudak19 +mhwzmima +mhx666 +mhyadmin +mhyk5036 +mhyxx9 +mhz91 +mi000315 +mi1000 +mi107373 +mi12lan +mi158kiss +mi1912 +mi1981be +mi1999ke +mi19hu79 +mi22000 +mi2604 +mi37ka +mi4vafid +mi5zvuol +mi6o4ko +mi7qh8lu +mia +mia +mia1337x +mia1985 +mia31 +mia87kps +miaaroma +miabob +miabuela +miae1234 +miaislam +miakmm85 +mialotta +miami +miamix +miamor +miancera +mianek08 +mianlien +miaouss +miapunto +miarron +miau +miau5433 +miaumiau0 +miaupurr +miavite6 +miazga21 +mib581 +mib9a9a +miba +mibibyte +mibo1801 +mic34med +mic5572 +mic5key +mica +mica1961 +mica2bru +micacca +micael +micaela +micah090 +micasa +micblvit +miccoli +mice +mice55 +mich1006 +mich1968 +mich1ael +mich2006 +mich2482 +mich301 +mich790a +micha +micha1 +micha12 +micha14 +micha1979 +micha4780 +micha522 +micha77 +michabiene +michablk +michael +michael +michael ames +michael c +michael dalm +michael des +michael lee +michael sundin +michael warren +michael-james +michael1 +michael11 +michaela +michaela +michaela1983 +michaela510 +michaelad1 +michaelc +michaelvira +michal +michal +michal1 +michal12 +michal2001 +michal231 +michal9 +michal9410 +michala +michalde +michalis +michalklin +michandi +michas +michaud +michcio +michcio1 +michel +michel +michel del +michel1299 +michelangelo +michele +michele +michele7 +michelene +michelgs +micheline +michelino +michelle +michelle +michelle0819 +michey +michfred +michi +michi +michi1 +michi1586 +michi421 +michi99 +michico +michie +michig +michike +michiko +michio +michiyo +michl +michl1810 +michoto8 +michse +michse1 +michsedy +michu0 +michy +michy2821 +micike +micimacko +micimici +micinka +miciott0 +mick +mick1236 +mick1993 +micka +micka0504 +mickael +mickamor +mickey +mickey +mickey01 +mickey1 +mickeymouse1 +mickez +micki0 +micki09 +mickie +micko3 +micky +micky0817 +micky1003 +mickysilver +miclave01 +micmac +micmac13 +micmau12 +micmol07 +mico +mico231 +micol +micole +miconoel +micota +micr0l0g +micr0scan +micra +micra22 +micro +micro118 +micro128 +micro5oft +microbe +microice +microlab +micromate +micron +micron99 +micronax +microscan +microsoft +microsoft2 +microstar +microtek +microvert +micuta0201 +miczasa +midabubu +midas0919 +midas5010 +middelbaar123 +midelt1 +midgam +midgeling +midget789 +midna999 +midnight +mido4857 +mie +mie3327 +mie3jiez +mieczysl wa +mieczyslaw +mieimiei +mieko +miele1212 +mielew1 +mierchen +mierda +mierda1101 +mierdav1 +mierlo +miesedie +miesole +mieszkanie +mietek12 +mietek92 +mietek99 +miettinen1 +mietzmaus +miezie1 +mifabio +mifxucab +mig29yu +miganiga +migato +migdv +migedith +migge110 +mightbe +mighty +mighty1 +mightylong +migl2108 +miglena +migly2 +migma +mignon +migolo +migotka +migotka +migu7578 +migue2 +miguel +miguel +miguel aceves +miguel angel +miguel mateo +miguel04 +miguelito +miguelo +miha +mihael +mihaela +mihaela001 +mihai +mihail +mihailo +mihain +mihaj69 +mihajlo +mihalis +mihalj11 +mihariva +mihmi +miho02 +mihopa +mihov21 +mihsg +mii2007 +miika +miiko +miisla30 +mija +mijanou +mijanq23 +mijbm9 +mijdrecht2 +mijdvnjp +mijeta94 +mijnpc +mijntijger +mijr27 +mijukas +mijz1z8f +mik0se +mik13670 +mik17 +mik314 +mik3kha +mik636 +mika +mika1996 +mika3 +mika55 +mikado +mikael +mikael66 +mikaela +mikaela1995 +mikaila1 +mikaivoja +mikala5104 +mikaoj11 +mikaoj1995 +mikas1 +mikasa +mikasa16 +mikasha +mikaurel +mikayla08 +mike +mike +mike#1835 +mike0014 +mike019 +mike10 +mike1025 +mike1066 +mike11 +mike1234 +mike1296 +mike1980 +mike1989 +mike1992 +mike2007 +mike2203 +mike2402 +mike2403 +mike2486 +mike25 +mike3333 +mike3716 +mike81k +mike98j +mike9999 +mikea4 +mikebios81 +mikebo72 +mikebrough +mikecet +mikeg91 +mikehess +mikehl +mikek498 +mikekim +mikekirr +mikel +mikel +mikel001 +mikel09 +mikelele +mikeman +miken1336 +miker506 +mikes +mikesch +mikesgay +mikesgrl +mikesun +miketa89 +miketest +mikewood1993 +mikey +mikey +mikeyyy +mikhail +miki +miki +miki9911 +mikicat +mikifiki +mikilol9 +mikimano +mikio +mikitiga +mikizero +mikjar +mikkel6077 +mikki +mikki37 +mikky +mikkyds +miklac +miklas +mikle2401 +miklos +miklshih +miknuyh +miko99 +mikolaj +mikolaj23 +mikommerz +mikroshit +miktamo +mikula +mikun942 +mikusiek +mikute2 +mila +mila2810 +mila52 +milagros +milaki1 +milamber05 +milan +milan +milan00 +milan000 +milan121 +milan200 +milan2211 +milance +milani +milano +milanoo +milas1 +milaskey +milburn +milch +milchmann +milda +milda +milder +mildick +mildnet +mildred +mildred joanne +milek1 +milen1 +milena +milena +milenari +milenium +miler31 +miles +miles +miles12 +miles2 +milesnear +milford09 +milhouse +mililani1 +mililo +milimi +milina +milita666 +militarra +military10 +milivoj +miliworm +milk007 +milka +milka01 +milka1 +milka5 +milka75 +milkakuh +milkamino +milkbone +milkcow8 +milkereit06 +milkglass +milkman +milkman024 +milkmilk +milkshakE +milky00000 +milky2069 +milkyway3785 +mill99os +milla +millamoo +millane +millar07 +millard +millefett +millemand +millemus +millenia +miller +miller0408 +miller1 +miller18 +miller907 +milletim +milletre +millette1 +milli +millicent +millie +millie +millie751 +millierose +millionen2 +millions05 +millkak +millo1974 +millos1 +mills +millw0rm +milly +milly001 +milo +milo12 +milo1475 +milo3691 +milo456 +miloamos +milobar +milobloom +milorad2 +milos +milos +milosc0101 +miloslav +miloto +milouda1 +miloude +miloux +milow +mils +milsani +milt +milt040 +milt77 +milta198 +milter +milti123 +miltitz1 +miltom +milton +miltos1 +milu0998 +milucia0 +miluju +milvana +milw0rm +milw0rm1 +milwom +milworm +milyak +mim7fa8 +mima +mima0311 +mima19 +mima2006 +mimas1 +mimbla +mimella +mimi +mimi +mimi123 +mimi177 +mimi2005 +mimi4785 +mimi90 +mimic3 +mimiflan +mimilota +mimilove +mimine +miminne +mimirg +mimisiku +mimiterra +mimixtk +mimma +mimma76 +mimmel +mimmi123 +mimmi1337 +mimmi19 +mimmo +mimmo1 +mimmone +mimo31 +mimo7d5m +mimocas +mimoma +mimosa4409 +mimoun +mimpav11 +mimsan +mimsy +mimy +min +min0taur +min161 +min1stry +min27389 +min4rik0 +mina +mina100 +mina1957 +mina2348 +minad +minad88 +minajane +minamino2 +minano84 +minardo1 +minaret26 +minato1981 +minaya +minbari2005 +minca +minch123 +minchang85 +minchia +minco4me +mind13 +mind1m +minda128 +mindcrime +mindener +minder +mindfreak21 +mindkatz +mindless778 +mindseye13 +mindshare1 +mindtech +minduca +mindukas +mindy3103 +mine1111 +mine666 +mineenim +minemarkus +minena05 +mineone +mineralibus98 +minerva +minerx +mineskl +mineten +minever +minevitch +minfin +ming +mingcun +minggat +mingia +mingyar +minh +minh71 +minh8857 +minhanh +minhduy +minhhai +minhhha +mini100 +mini1025 +mini1981 +mini23 +mini7021 +miniadb +minick767 +miniclip +minicoopers +minidisc +minieme5 +minieri +minigare +minigolf1 +minigun17 +miniki +minikoralle +minilepra +minima +minimac86 +minimax +minimi +minina73 +mining +minino22 +miniot2 +minipwn +minislav +minister001 +ministery +miniuk +minivox +minixi +minka +minka80 +minka8481 +minkakaka +minkie +minkins +minkmink +minko1981 +minmand1 +minmi +minmiller +minmolta +minna +minne4711 +minnie +minnie ha +minnyman +mino +minoes +minolta +minomino +minor +minor251 +minorali +minoru +minoru +minosxyz +minotti +minounou +minova +minpak80 +minpanda +minrem +minsheng +minstrel +minstrom +minsy +minta +mintal11 +mintsa +minupc +minutes +minyue +minyves +mio +mioara +miobiru +miobone +miodrag +miodrag +miodzio +miok4243 +miokus +miomio +miosina1 +miou +mioumiou +mipalm +mipanchi +mipdiyer +miqdad007 +miquel +mir +mir2406 +mir6el +mira +miracle +miracle! +mirado89 +mirage +mirage18 +mirahalo +miraka +mirali1 +mirama1 +miramar +miranda +miranda +miranto +miratel1 +mirca +mircea +mircha +mirchi34 +mirco +mirco007 +mire16n +mirec +mirec23 +mireia +mireille +mirek08 +mireklll +mirel1993 +mirel666 +mirella +mirena +mirepoix22 +mireya +mirheta +miri1972 +miri2107 +miriam +miriam +miriam233 +miriam87 +miriama +mirielle +mirinda +mirja2312 +mirjam +mirjam +mirjana +mirjanaa +mirka +mirko +mirko9690 +mirkobianca +mirkom +mirkovico +mirlenys +mirnubit +miro187 +mironcostel +mironovd +mironus +miroslav +miroslav +miroslava +mirques +mirror +mirror +mirror06 +mirt1491 +mirta +mirtha +mirtha73 +mirtis +mirtutee +miru1508 +mirza +mirzasux +mirzl1 +mirzo +misake +misand +misat0 +misatko +misbebes +mischa +mischa +mischa6780 +mischu1 +miser +miser2 +miserables +misero +miseslv +misfit +misha +misha +misha22 +mishamisha +mishapen +misho12 +mishok +misia1 +misia23 +misiak +misiak01 +misiek +misiek83 +misingo +misino +misio123 +misio77 +misiu +misiu2582 +miska +miska2004 +miskawid +misko +mislina +mismis23 +misnick#1 +miss +miss326 +miss60 +missen +misser123 +missfits +missfloppy +missgeburt1 +misshand +misshomy +missie75 +missinu1 +mission +mission1 +mission6 +mississippi +missman +misstea +missty +missy +missy +missy03 +missy10 +missy109 +missy827 +missyou +mista +mistal +mistang +misterhobbs +misterjon +mistermonday +misterq +misterrpg +misters2006 +misterx +misterxy +mistgrey +mistgrsc +misthagen +mistic333 +mistic85 +mistik +mistpast +mistrapower +mistrix1 +mistuo +misty +misty +misty12 +misty123 +misty22 +misty89 +misty933 +mistyhond +misul0nt +misun92 +misurald +misutka2 +miszczu +miszou +mit20mir +mitaqipw +mitch +mitch +mitch3110 +mitche11 +mitchel +mitchell +mitchell +mithracat +mithrandir +mithril +mitht +mitiline +mitirapa +mititica +mitko98 +mitkobgr +mitnaber +mitnick +mito4079 +mito98 +mitosika +mitou24 +mitox14 +mitraia +mitrax +mitro +mits0815 +mitsch18 +mitscher1 +mitsman +mitsuki +mitsuko +mitsumi0 +mitsuru +mitsutoshi +mittens17 +mittens329 +mittie +mityap13 +mitza1986 +mitze123 +mitzi +miuit +miumiu +mivona +miwa79 +miwixy6 +mix2005 +mixani67 +mixcar +mixer210 +mixerboy +mixerino +mixerman +mixery +mixery01 +mixi +mixmaster317 +mixtape91 +mixtom +mixvaa +mixx +mixxer +miyako +miyoshi +miz4711 +mize1990 +mizi1969 +mizie2404 +mizune +mizutan1 +mizzou79 +mj1234 +mj1859pl +mj1872 +mj236053 +mj28jc26 +mj357357 +mj4422 +mj638633 +mj7114 +mj7315 +mjau +mjcrabtre +mjd2582 +mjd9596 +mjdnf +mjgbu +mjgqfz +mjhmb +mjjcyzdo +mjk2mjk +mjk6994 +mjmj93 +mjolnir55 +mjp2803 +mjpr3a6w +mjrmjr88 +mjs666 +mjshaq22 +mjtest +mju76zhn +mjuhgf4 +mjyogvpc +mjzg2414 +mjznht12 +mjzy +mk0369 +mk100f +mk118491 +mk121317 +mk123445 +mk1411 +mk1541 +mk1976 +mk200390 +mk241267 +mk299468 +mk3152 +mk3287 +mk32km +mk434 +mk45 +mk4872 +mk4983 +mk4all2 +mk621987 +mk785a +mka53 +mkaao +mkaolsen +mkaram +mkb4u +mkbis +mkcofatm +mkfg1453 +mkg23dx1 +mkhf17 +mkisofsd +mkj8mkj8 +mkjd2805 +mkjdr +mkkxcf8h +mklassen +mkll1704 +mklmkj +mkm +mkm123 +mkm284 +mkmdze12 +mkmk +mknj +mko098 +mko48625 +mkobra +mkolsen +mkonji +mkoqk +mkpower +mkprmkpr +mks +mks123 +mktech +mktg2007 +mktgvxng +mktmrssi +mku6kuuw +mkur3963 +mkuwari +mkv1309 +mkv8t +mkw109 +mkxxxx +mkzamk +mkzaz +ml-123-SERVER +ml1273 +ml20171 +ml311085 +ml350g3 +ml7017 +ml91190 +mla0610 +mla14400 +mla83rtd +mladder +mladen +mladen2001 +mleczko7 +mleko87 +mletzkom +mlhure +mli212 +mlim8126 +mlk0398 +mlk3009 +mlk52mlk +mlkdead +mlkkt +mlky5 +mlm2004 +mlnw19sf +mloda12 +mlody +mlokmlok +mlom2001 +mlossin +mlqad +mlrofqc +mlsr99 +mlt2773 +mlt531zx +mltj118 +mltr01 +mlup2406 +mlynky +mlyt5334 +mm +mm010203 +mm022373 +mm110077 +mm123456 +mm167833 +mm1q2w3e +mm232980 +mm2580 +mm2660 +mm27444 +mm290995 +mm3106mm +mm365 +mm4k +mm5195 +mm58285 +mm66447 +mm6660 +mm7789 +mm820923 +mm85eo +mm921999 +mm9582 +mm963000 +mmaJ3n +mmag10 +mmalfi +mmamo +mmanuel1234 +mmasu40 +mmawi +mmbootsy +mmca183 +mmcb1234 +mmcc4pwf +mmclothes +mmcomic +mmcounter +mme965 +mmed +mmfi804 +mmg123 +mmhadjnh +mmhhdd +mmhk16 +mmhmmh +mmhz06 +mmibe55 +mmiiaa +mmilaa +mmilano +mmilch +mmilli +mmj7844 +mmm +mmm15adv +mmmm +mmmm4321 +mmmmmm +mmmmmmm +mmmmmmmm +mmmut0v +mmnn +mmob516 +mmonkey +mmorpg69 +mmrocks +mms +mms0k +mms2120 +mmsmms +mmuak147 +mmuis +mmusik +mmutairi +mmwiz05 +mmx486 +mmxmmx +mn1809 +mn1987wq +mn1bp +mn2123 +mn2mig29 +mn333606 +mn43rs +mn6709fg +mnafe +mnallah +mnasir +mnb50501 +mnbf732d +mnbv1234 +mnbvcx1 +mnbvcxy +mnbvcxya +mnbvcxz +mnbxio1 +mndcy +mnemic91 +mnf116 +mngteam +mni03dmn +mnili888 +mnina +mninety +mnkjoi09 +mnleech +mnlx0 +mnmhv +mnmnmn +mnmsh2 +mnopqrs13 +mnti7coy +mnv3695 +mnvigd +mnxzc2 +mo010485 +mo0oka +mo20786 +mo23rr59 +mo321sys +mo3diver +mo3sti3 +mo705602 +moa6265 +moab69 +moaf8 +moamoa +moanna +mobanexi +mobber +mobel terry +mobi67 +mobil2an +mobil48 +mobil710 +mobilcom +mobile +mobilera +mobilkom +mobler2 +moblinz +mobydick +moc1969 +moc25rtu +mocha1 +mocha2004 +mocha444 +mochas +mochazo31 +mochie85 +mocidade96 +mocity +mock69 +mocki +mocko +mocnit +moco15 +mocogo +mocos321 +mocosoft +mocutex +mod02han +mod2003 +mod302b +mod679 +modaniya +modder1983 +modder92 +modding +modding1 +mode1988 +mode5 +modean52 +model123 +model99 +modell +models +modelt +modena +modena29 +moder +moder12 +moderador +moderator +modernezeiten +modest91 +modesty +modifiye +modins +modjo8246 +modjoro +modo2609 +modon79 +module +modulo5k +moe +moe1dan +moe23 +moeace +moebiman +moeffeom +moehler +moelker +moeller666 +moep +moep18 +moepasca +moepmoep +moeps0n +moepsi +moerdn +moes123 +moevenas +mofa2002 +mofeed +moffatts +moffetta +mofia +mofo6969 +mofoftw +mofokid +mogens66 +mogestas +moggie2 +moggy007 +mogi +mogli83 +mogoitui +mogray +moguila +mogy12 +moh01 +moh1811 +moh234 +moha +mohaa +mohaa73 +mohaa96 +mohaaboo +mohaas +mohamed +mohamed +mohamed abdel +mohamed0 +mohamed2 +mohamedacount +mohamm1 +mohammad +mohammad1 +mohammadreza +mohammed +mohammed +mohapx +mohata +mohawe03 +mohawk9259 +mohd +mohd2006 +mohd4444 +mohd4560 +mohdeen +mohdfais +mohdmohd +mohfucka +mohorea +mohpa +mohsen ben +mohsin123 +mohsmi7 +moi123 +moi225 +moi666 +moia2099 +moicava +moielza +moietmoi +moiii +moik +moilecon +moimeme +moimoi +moin +moin449 +moinbier +moinda +moineo +moinfabi +moinhome +moinmoin +moinoo +moinsen +moir1937 +moira +moira +moise +moisessucr +moishe +moisram +moize +mojaera +mojalula +mojamoja +mojdidub +mojegg +mojkovac +mojmacik +mojmoj +mojo +mojo88 +mojojojo +mojtabar +mok313 +mokambo +mokase +mokcyber +mokdad +moke +mokhtar13 +mokkori +moko +mokranje +mokuba1 +mokykla +mol8312 +mola2004 +molanel +molanus +molason +molchi +molchy +moldavia +mole8702 +moleca +molenbeer +molgan +molika +molina87 +molinao +molkette +molkomolko +moll1e +molle3051 +moller2759 +mollers101 +molli66 +mollie +mollix +mollo0815 +molly +molly +molly morgan +molly123 +molly2000 +molly871 +mollyhaggis +mollymia +mollymolly +molnet54 +molodo +molopolo +molotito +molotok +molpmolp +molslaan +moltbe +molten335 +molten76 +moltke19 +molyben +mom123 +mom5466 +mom6540k +moma +moma404 +momandme +mombasa2 +momcilovic111 +momdad +momence88 +moment6980 +momide +momiji +momiju00 +momilo +momis1 +momito +momma +mommam2 +mommsen71 +mommy6558 +mommy98 +mommyss +momo +momo1977 +momo1998 +momo2901 +momo30 +momo5287 +momo81 +momodu94 +momomo +momomomo +momon +momos +momota +momsemor +momygoo +mon25826 +mon308 +mon34az +mon3817 +mon55key +mon8icaa +mon98i +mona +mona +mona0724 +mona105 +mona1904 +mona1930 +mona2005 +mona2806 +mona86 +monalisa +monamarlen +moname +monami +monami42 +monarch +monarosa +monbebe +monchien122 +moncul +mond +monda16 +monday +mondeo +mondeo1212 +mondeost +mondiala +mondkind +mondo +mondo6 +mondo99 +mondorf12 +mondorik +mondrianus +mondshop +moneer +monekmonek +monet +monet40 +moneta +money +money40 +money4no +money69 +money999 +moneyman +moneymoney +moneys +mongiovi +mongizmo +mongo13 +mongo899 +mongol +mongoman +mongrelo +mongrill +moni0669 +moni1 +moni1974 +moniKA +monia1 +monia999 +moniboni +monica +monica +monica1 +monicaliman +monicatete +moniczek +moniek71 +monika +monika +monika1 +monika11 +monika1612 +monika1805 +monika1808 +monika19 +monika21 +monika2911 +monil123 +monilove +monima99 +monin +monini +monique +monique +monique1 +monirak +moniteur +monitor +monitores +monkeemonkee +monkey +monkey01 +monkey1 +monkey11 +monkey12 +monkey2 +monkey2050 +monkey593 +monkey66 +monkey69 +monkey99 +monkeyballs +monkeyboy +monkeym8 +monkeynutz3 +monkeys +monkeywrench +monkfish +monkie2 +monkmonk +monkrlz +monline +mono1234 +monocacy22 +monokey +monolith +monolith24 +monolith969 +monoply66 +monopoly0 +monostade +monoteta +monque69 +monroe +monsieur +monsonego +monster +monster0901 +monster1 +monster2 +monster202 +monster266 +monster5 +monstersliv +monstersoul +monsun +montY +monta +montag80 +montagu +montague +montague +montana +montana110 +montblanc +monte +montella1 +monter00 +montero +montey +montezuma +montgomery +montgomery +monti +montie +montluel +montoya1 +montr +montreal +montrex +montri +montu123 +monty +monty +monty1313 +montylee1 +monyles1 +monzavi1 +monzon1930 +moo +moo111 +moo7456 +mooc0w +moochar1 +moochky +moochp +moocow +moocows +moodle +moodle2010 +mooduboo +moody +moody467 +moog1559 +moogle1 +moogle28 +mooglers +moojaw +mookie0217 +mookk +mooman1112 +moomin +moominio +moomoo +moomoomoo +moon +moon +moon123 +moon15 +moon1990 +moon6789 +moonbeam1000 +mooncat1 +mooncow +moondancer45 +moonerve +mooney +mooneyaa +moonface5 +moonhot +moonkfcc +moonlight +moonlite +moonm1le +moonmoon +moonoi +moonrise +moonshaen0 +moonstar5 +moonstruck +moonwalker +moonwel +moony06 +moooo +moooob6 +moop45 +moopoo +moordorf +moore +moore +moorea1a +moorhase +moorhuhn +moorhuhnn +moory yank +moose1616 +moose19 +moose30 +moose912 +moosehead +mooseman55 +moosenstein +mooser +mooses +moosey11 +mooshkai +moosie +mooska24 +mooswald +mootah +mootman5 +mootown +mooy3m2x +mop1991 +mop3door +mopjes +mopmop +moppe123 +mopped84 +moppel03 +moppie71 +moppy1 +mops123 +mopsi38 +mopsiki +mopsy28 +mor +mor0911g +mor0jym +mor101g1 +mor85bus +mor9191 +mora200 +morag +moraime +moraj +morakot +moraku +morales1988 +morales470 +moralez +morallyunsound +morango321 +morann +morath1991 +morattaja +morava13 +moray +morbid11 +morbius3 +morchel2 +morcove +mord +mordais2 +mordark +mordecai +mordechai +mordechay +mordii +mordor +mordor227 +mordor88 +mordor97 +mordrac +mordrag +mordred +mordrok +morechi +moremaids +moremaney +morena +morengo +moreninja +moreno19 +moreno268 +moreno83 +moreton +moretti +morey +morfar +morfin123 +morfinis91 +morfius +morg0th +morgan +morgan +morgana +morgana +morgane +morgane1510 +morgen111 +morgen500 +morgen530 +morgen99 +morgenroete +morgray90 +mori +moria +moria +moriam +moribm +morihiro +morile +moriman +morindano +morion748 +moripa +moris134 +morisker +morisset9 +moritz +moritz0406 +moritz27 +moritznina +moriz +morjen2 +morkie +morkos +morland +morle112 +morle1993 +morler +morlock +mormel10 +mormeltje1986 +mormor +mormor02 +mormor19 +mornica +morning +morningglory +morningstar +morocco789 +moron +moron964 +moroni +moros1 +morph101 +morphen +morpheus +morpheus08 +morpheus7 +morr1992 +morradi +morray +morris +morris +morrisa1234 +morrison +morron520 +morrow +morsey123 +morsov +morsula +mort +mort +mortadelo +mortal3 +mortality666 +mortel85 +morten +morten +morten10 +morten2701 +morten363 +morten55 +morten62 +morticia +mortiis +mortimer +mortimore +mortis +mortlach15 +mortlock1 +mortmort +morton +morton +mortonek +mortvif +morty +mory16 +mos201 +mosa +mosafer +mosaikvr +mosb165 +mosbay +mosca +moscherie +moschus1 +mosconi +moscowearn +moscowmoney +mosdir +mosel +moseley8 +moser2 +moses +moses1983 +mosfet +mosfos +mosful05 +mosi2301 +mosibat +mosientj +moskaluk32 +mosko +moskrayt +moskva +moskwa20 +mosland +mosopp05 +mosprek +mosqui9s +mosqutio +moss04 +mossa +mossad12 +mosschen +mossgreen +mossoro +most77 +mostafa +mostein +mostostal +mostovoi +mostyn +mosucker +moswack +mot +mot3k3 +mot52val +mota +mota29 +motauaja +motavian +motay1 +motconga +motdepas +motenai +moter2142 +moteral +moteuchi +mothafuckas +mother +mother235 +motherboard +motherfucker +motherload3 +motherlode +mothership +moti +moti0705 +motia +motika +motiv123 +motlook +motmot00 +moto +moto1321 +moto18 +motoRO +motocross +motoendo +motofanas +motoko +motoko69 +motolog +motoman +motor1 +motorass +motorbike +motorbike77 +motorhead +motorhome +motormanic +motorola +motorrad +motorstorm09 +motov300 +motox654 +motox78 +motte3 +motties +motufan1 +motumbo +motya2202 +motylek12 +motyw1 +motzki +mou +mouadrap +mouakia +mouarf +mouboule +moucha +moudien +mougli6 +mouiok +moukate1 +moulimouli +moulin56 +moultrie +moumouth +mounette +mouniaz +mounir +mounou +mounssif +mountain +mountainbike66 +mountequinox +mounty82 +mourad +mouritz32 +mourmijs +mournival1991 +mouru3 +mousa +mouse +mouse11 +mouse423 +mouse66 +mousebots +mousemat +mousie100 +mousseau4 +moussons +moustik +moustique +moutarde12 +mouton +movie666 +movin1 +movita +movla +movpowav +mowbray30 +mowesgay +mowgli42 +mowi1769 +moygorod +moyna +moynagh1 +moyo2829 +moyra +moyumi +moyzikah +moz84fup +mozar +mozar1 +mozart +mozeiko +mozgod +mozilla +mozillka +mozkaz +mozlapqb +mozx246 +mozzi +mp00th +mp041078 +mp1636 +mp1nera +mp230860 +mp2915 +mp312345 +mp3me +mp3sale +mp3site +mp3world +mp5don +mp5sdrt2 +mp6200s +mp654321 +mp75xa +mp7fid +mp7qwW +mp9 +mpass +mpater +mpauto +mpb7697 +mpc190 +mpcvf6k6 +mpff +mpg71081 +mpgcss05 +mpgr0xs +mphgka8h +mphim7 +mpik9c +mpive +mpjbs710 +mpk9800 +mpkeceli +mplawdce +mpliment +mplmpl +mplqafyg +mpmpmpmp +mpo0520 +mpoisqpg +mpower +mpownz +mppwzdh +mpqzal +mps103 +mpsteve +mpvhs +mpwt9 +mpxlv +mq25tahc +mq7es7vp +mq87zo +mqhg39uu +mqlol +mqn5f +mqonly +mqudc9nw +mr0531 +mr0wek +mr1220 +mr1zisr4 +mr2307 +mr245390 +mr33613 +mr3clvhy +mr420f +mra8400 +mra95crs +mracxe3m +mraim +mran407 +mrbenn +mrbill1234 +mrbitch +mrbrew72 +mrbrown! +mrburns +mrc1666 +mrc1964 +mrc5683 +mrcashew +mrchan +mrcrd01 +mrdaddy +mrf123 +mrg2t +mrg2wkt8 +mrgeula +mrgman +mrh23 +mrim +mrimage +mrisD +mrkelsey +mrkerber +mrkibsie +mrks78 +mrkvicka70 +mrlaneth +mrlanky +mrlb4578 +mrlitva +mrlong +mrm22333 +mrmeow +mrmime +mrmojo68 +mrmono +mrmoon14 +mrmoti +mrmouse +mrmreto +mrmrmr +mrncrl +mrninja1 +mrnjau +mrnra6d2 +mrobin +mrowka11 +mrozek +mrp3719 +mrpibb +mrpimp95 +mrpo0p +mrpoka +mrs03106 +mrs8mrs +mrshaskell +mrsmeena +mrsmile +mrsmink +mrstbe +mrtallica +mrtanev +mrtapproves +mrtbasak +mrterra +mrtkonov +mrtoy99 +mrtvy1 +mrumrumq +mrv1911 +mrwizard +mrxrule +mryb99 +mrz26 +ms +ms000111 +ms0212 +ms148814 +ms1634me +ms170620 +ms1779p +ms1956 +ms2005ms +ms2202mu +ms2455 +ms246969 +ms2517 +ms2jyg72 +ms30cube +ms31 +ms31392 +ms323z12 +ms3310 +ms39194 +ms410b +ms4k9n +ms632571 +ms806596 +msashdod +msb7rodw +msbioo +msblst +msch1107 +mschi3f +mscode +mscorp +mscrp +msdmsd +msdos +msdos117 +msdos99 +mse2412 +mseg06 +mseig140 +msenties +msf1234 +msfb1306 +msg +msh102 +mshaban +mshary +mshn8 +mshr12x +mshs51 +msi87gh1 +msibasf +msik7n2 +msjhp +msjn2 +msk001 +mslpr55 +msm +msm07s04 +msm1982 +msmile +msmlmsml +msmouse +msno +msnvx +msok1013 +msomso +msor28 +msp1803 +mspencer +msr4ever +msr644 +msrjfec +msrquvp +mss11iro +mss32dll +mss32wek +mss32zam +mss444 +msshadow +mssjsl +mssm1234 +msstdfmt +msstud +mst10tt +mstang +mstech11 +msterra +mstersas +mstjeo5 +mstlin +mstri +mswesing +mswinsam +msy0402 +mszuigt +mt1214 +mt1to10 +mt24u234 +mt36 +mt37791 +mt860920 +mt8865 +mt96f5 +mtFbwU +mtb3086 +mtbdhlkw +mtblc29 +mtct +mtdjr14 +mtecimer +mtf3734 +mtfbwu +mtfcrazy +mtfmtf +mtg +mtgv921 +mthead31 +mthull +mtirdsst +mtje6wrv +mtjl79 +mtk445 +mtk7hi +mtkn7n +mtl1001 +mtme04 +mtnwj +mtobias1 +mtojqniz +mtr217 +mtstudio +mtsucks +mtsw005 +mtt1993 +mtthw7 +mtts38 +mturan +mtvhead +mtx069 +mtxo6 +mu0712 +mu1 +mu8030 +muabmuab +muaddib +muadib? +muahahaha +mualla +muatasim +muaythai +much123456 +much2much +mucha1 +mucha1992 +muchi13 +muchno +muchoito +muchomor +muchpower +mucirkus +muckel +muckel55 +muckla +mucko +mucmucmuc +mud118 +mud1904 +mudhoney9 +mudilka +mudkip26 +mudmud +mudozvon +mudrun +mudrus +mudslinga1 +mudvayne +mue11er +muecamueca +mueller +muempf +muenchen +muenchen67 +muerto1981 +muerto666 +muesli01 +muething +muetze +muetze11 +mufa2006 +mufasa +muffie123 +muffin +muffin! +muffin10 +muffins112 +mufftaucher +mugi1296 +mugisha +mugo0131 +mugrilo1 +mugsinc +muguete7 +mugur02 +muh123 +muh12345 +muha1983 +muhaha +muhamad +muhameti +muhammaddh +muhammed +muhammed ali +muhammedali +muhan87 +muhblub1 +muhkuh +muhlis +muhly10 +muhmuh +muhpower +muhq +muhtar +muhterem +muie +muie123 +muiee +muiele +muiemuie +muietie +muir +muitnep +mukaba79 +muki. +muki07 +mukkefug +mukoen +mukows +muky +mulabekt +mulan1103 +mulavipe +mulder +mulder74 +mulfman +mulgar +mulher +mulher01 +mullane +mulle1993 +mullen +muller +mullins +mulote +multi91 +multigestion +multimedia +multimeter +multimiri +multinbr +multipass +multipla1 +multipuss +multitech12 +multivan128 +multivan150 +mulubaby +muma318 +mumba1 +mumbo14 +mumbo2008 +mumedu +mumija +muminki +mumkunmu +mummeli112 +mummiya +mummo. +mummo888 +mummy12 +mumrich +mumsasaz +mumtufab +mumu +mumu23 +mumudark +mumumu +muna +munakas1 +munbill +munch +munch8176 +munchkai +munchkin +munda1 +mundai +mundis419 +mundle1187 +mundowii +mundrial +muneez +mungbean +mungo8011 +muni42 +munihim +munir +munkey +munkster +munky17 +munmepim +munmo +munmurmeli +munnum +munoo +muntean +munterer +munzur +muppet +muppmupp +mupt6y9q +mur1983 +mur24phy +mur62nuj +mura1935 +muradas +muradodo +murakami5 +muralha +murali +muramas0 +murasme +murat +murat100 +murat147 +murat1510 +murat30 +murat531 +murat61 +muratbey +muratt +muratt1 +murattt +murbruk +murcia2 +murcielago +murda162 +murder69 +murderonic +murdl9 +murdle +murdo +murdoc +murdoch5 +murdock +murdok +muresan +muress +murhas +murie +muriel +murihhja +murillo +murka +murka15 +murkel +murloc +murloc100 +murmel78 +murmelfrosch +murmutis +murni06 +murphy +murphy69 +murray +murray ramsay +murrdenn +murret +murring1 +murry +mursh3d +mursu89 +mursula +murt8 +murtaza +murthag +murti123 +murty +murulez +murusgla +murvyn +murzel +murzynek +mus123 +mus1481 +mus1837 +mus1inde +mus8h +musa +musaeren +musarrat +musashi +musasu +musbox +musc79 +muscaria1 +muschi +muschi369 +muschi51 +muschi88 +muscle +musclehead +musdecaq +muse0085 +muse0202 +mush1988 +mush5303 +mushaf +mushe1 +mushharden +mushr00m +mushroom +mushtuk +mushu +mushu1517 +music +music1 +music10 +music52 +musicale +musicalgreece +musicaljt +musicprime +musics50 +musik +musik1 +musik15 +musikchaot +musiklab +musikman +musiq01 +musique +musiquez +musja2k5 +muskat123 +musky +muslim +muslim22 +musselasse +mussol0 +mussolini +must1kk4 +must4ng +mustafa +mustafa +mustafam +mustaine88 +mustang +mustang1 +mustang1723 +mustang2 +mustard +mustdai +musti +mustim +musty +musty22 +mut2home +mut2phpf +mutande +mute17 +mutia +mutilao +mutiny101 +mutis04 +mutmosib +mutroniks +muts2000 +mutsen15 +mutti246 +mutti5066 +mutti61 +muttis +muttley +muttly13 +muuh123 +muuk7 +muumipeikko1 +muvhaz +mux007 +muxny +muxteles +muy5qaqe +muybueno +muz2kab +muz660e +muz89rap +muzerjeg +muzeum03 +muzeum2 +muzeyyen +muzicaa +muziek15 +muzomuzo +muzzer550 +mv00ft00 +mv06love +mv1003 +mv500 +mv5000 +mv5454 +mvc9vc9 +mvcwj +mvd3816 +mvemjsunp10 +mvhdb6 +mvjabam +mvlandys +mvolodia +mvp123 +mvp1703 +mvpeter +mvpmvp +mvrl3jur +mvstevia +mvszoe +mvuboqob +mvv635 +mvwnz +mvxtc +mvycius +mw0202 +mw0815 +mw09648 +mw1 +mw1104 +mw123456 +mw1551 +mw170266 +mw2410 +mw272727 +mw2811md +mw37920 +mw3dlrw7 +mw6944 +mw901221 +mwM05d +mwako +mwanza99 +mwarlock +mwdmfs15 +mwelt +mwey24v1 +mwin +mwindu +mwkeeton +mwltfn +mwm58666 +mwmeijer +mwmvhf99 +mwnd +mwoods +mwpaz5fq +mwsgmc +mwssie +mwteam +mwuuf +mwzefr11 +mx04php5 +mx171090 +mx3000 +mx313495 +mx3282 +mx441k +mx589gl +mxbbjz +mxgm +mxl7510 +mxlaser +mxmx2311 +mxpx +mxrv4oe3 +mxtfb28x +mxtvprod +mxvxs +mxxd6674 +mxyhxcvd +my +my +my0000 +my11scar +my1762 +my1958 +my2008 +my220578 +my2685 +my2sons +my4212 +my50647 +my54026 +my551106 +my56069 +my5tr0 +my6274 +my753320 +my7r4 +my917759 +myammie +myangel +myaptiva +myas1an +myasd +myasian +myayla +mybaby04 +myballoon +myboard +mybody +mybuddy +mybugs +mybwmybh +myc2535 +mychild +mycity +myd7c +mydata +mydear +mydianne +mydogjay +mydoskey +mydreams +mydvi2k +myear1877 +myflatmate +myforum +myfrends +myg0t +mygacudo +mygon68 +mygsn28e +myhires +myhost +myhouse31 +myi5wyqx +myjoshy1 +mykel +mykel13 +mykids1975 +mykir12 +mykitty +myky0k0 +mykyjosa +mylab813 +mylanta1 +mylene +mylene +mylium +mylove +mylove1! +mylove1023 +mylove3188 +mylove50 +mylovehelen +mylovemeg +mylust4u +myluv +mym5x5 +mymaus +mymaxst +mymom +mymother +mymouse +mympeg98 +myname +mynameised +mynameispower +mynamez +mynheer +mynocin +mynthon +mynvr +myocean +myofibril7 +myoppass +myoshi +myown +myp4ss +mypaan +mypass +mypass1 +mypassword +mypeach +mypetie +mypookie +mypossy +mypp11 +mypuck +myr0x0r +myr2004 +myra +myrette +myri90 +myriam +myriam +myriem +myrkgrav +myrl +myrna +myroker +myron +myrr40 +myrrhine +myrt0013 +myrthe123 +myrtle +myrxbot +myself +myself98 +mysh +myshoe33 +mysims2 +myslady +mysorum +myspace +mysql +mysql100 +mysql123 +mysql2t6 +myssbp +myst +mysterio4me +mystery +mystery1 +mystery6 +mysticism +myszek5 +myteamis +myter44n +mytest +mythmembers +mythos595 +mythrex +mythshop +mythsucks +mytyme +myv55 +myvideos +myw2 +myweb110 +mywuwu +myxin67 +myzmjc +mz09060 +mz0p +mz1309kz +mz140379 +mz27ir03 +mz3soer7 +mz7zzzzq +mz8152 +mzaki3 +mzalej +mzb9r +mzbpc +mzcifc +mzddxp +mzf9g +mzhxg +mzk25k +mzlflgu +mzlwkmsp +mznzhpr +mzp5n2 +mzsk9 +mzt3025 +mzwygveg +mzz7z7go +n +n' +n0000b +n0078303 +n00b +n00b87jj +n00bb00n +n00bd6 +n00blike +n00br6 +n00bu6 +n00dl3s +n01tsme +n03de +n07gx4k +n0access +n0ch1ps +n0ck0ne +n0cl408z +n0dr0ps +n0ehh +n0j4l4 +n0k1a +n0k1arlz +n0k3sv1l +n0kasd0k +n0n0j4m +n0n3 +n0n3llk +n0name12 +n0noriaj +n0o0o0b0 +n0passwort +n0s7j9o1 +n0t3ka +n0t4u2n0 +n0tasc0t +n0th1ng +n0tn0w +n0v3mbxv +n0v410k +n0val0k +n0way78 +n109110k +n1129j55 +n11m1 +n123123 +n1252231 +n1402119 +n148828b +n1663r +n18211940 +n19n33 +n1a1i1f1 +n1c0l35 +n1cebaby +n1e2d3i4 +n1emesis +n1enn0r +n1erder +n1fdq +n1gg4 +n1gger +n1jen0c +n1k0la +n1lvw +n1m1tz +n1mmx +n1n3h +n1n73nd0 +n1nt3ndo +n1ptuck +n1tr0g3n +n1vig +n1wjj +n1ymb +n200sx +n25kj90p +n260422 +n26wtrxr +n270967 +n2h1980 +n2ma +n2on2o +n2qwr +n2row +n2xls +n2yf22d3 +n30276016 +n30p03t +n30t3k +n3107726 +n33t0z +n3802003 +n3b1ka +n3e1c00 +n3gg0 +n3il +n3ini3a +n3m3sis +n3nhnxdp +n3pa7ine +n3r0tic +n3r3f +n3rdc0r3 +n3rukghj +n3tc4ll +n3tw0rk +n3ty7 +n3ukf +n3v1zad3 +n3w0ner +n3wal13n +n3wh0m35 +n3wj0rk3 +n3wp0rt +n3wzp455 +n3x258 +n3y4kpqk +n3yrs5cu +n40e4044 +n41mdeet +n4337987 +n45lz +n4argyh4 +n4b1l +n4b340f1 +n4d2ns +n4esm +n4n077 +n4rut001 +n4sl3dnik +n4t4l3 +n4usf8 +n4z833 +n50037w +n511325 +n526e +n5448301 +n561v5ex +n5880445 +n5a34 +n5coo +n5d25d90 +n5hzfham +n5jri +n5p5lm +n5pf0 +n5xzjr9m +n5yde +n5zhve3h +n6022313 +n627b +n66552 +n6678g +n6mjs +n6n3tpkj +n6n8gytt +n721031a +n7398 +n7453916 +n765btc +n7nnx +n7shdl +n7xgggb3 +n7xgp +n7z9yuc6 +n82vd6e1 +n8373a +n84bd24 +n8TJH +n8bvvu3u +n8cyu +n8gu9jjq +n8h2m13i +n8pprsc5 +n8syb372 +n8vif +n8zls +n9040015 +n928jb +n9cr8d6 +n9k4dlci +n9sc8 +nEgy +nMVbn4 +nN0FxO +nZjk35 +na10ch20 +na1204 +na49b6u +na7u7os +na82wxbt +naa0Ho +naadaidm +naahuui +naama04 +nab9line +nababati +nabacan +nabba123 +nabben94 +naber +naberlan +nabi75 +nabial +nabiii +nabiki +nabila +nabile84 +nabilx +nabisco +nabpat +nabueh +nac +nacciw1 +nace6938 +nach3to +nachete +nachie01 +nachisa +nacho +nacho +nacho2 +nacho94 +nachos12 +nachtigall +nachtlicht +nacimi00 +nacio herb +nacional1207 +nacixem +nad35uh +nada +nada +nada! +nada0500 +nada13 +nada31 +nadapapi +nadavs +naddel +nadege +nadege13 +nadepina +nader +nader1975 +nadera +nadesa65 +nadham +nadia +nadia maro +nadia456 +nadiaaula +nadial +nadiauci +nadije +nadim +nadin80 +nadine +nadine +nadine van der +nadine01 +nadine1811 +nadine3nadine +nadineevi +nadire van der +nadiusa +nadja +nadjasabine +nadornet +nadpan +nadyrox1 +naebisa +naeemnaeem +naemi +naerim98 +nafets +nafetsod +nafetsos +naffer180 +nafigid +nafisa +nafizy +nafnaf +nafpop52 +naftata +nafur +naganaga +nagano +nagelack +nagelflu +nagelteam +nagi3564 +nagidam1 +nagilla542 +nagol9504 +nagyatad +nah1alir +nahan198 +naher +nahetem1 +nahidy +nahir177 +nahjwn22 +nahnah +nahodne +nahovno +nahum +nai6397 +naidag +naigolai +naikas +nail007 +naile1211 +nailhead +nailui +naim112 +naima +nain +nainen696969 +naio56 +nairet84 +nairolf +nairolf7 +naisso1 +naiv48 +naja1316 +najade77 +najaune +najberg +najbolji56 +najean +najeho +najjar +najmadin +najs123 +najwc7sn +nakamici +naked +naked4285 +nakedchief +naker +nakina19 +nakkie +naklamo +naklar +nakomika +nakonako +naksiku +naksu +nakts123 +nakula +nala +nala0064 +nala02 +nala4190 +nalchik +naldii +nalimv +nallepuh +nalton +nalzorb +nam +nam +nam20 +nam7u +nama11 +namada80 +namala +naman +namanh +namas1h +namass +namaste +namaste42 +namcet +namco252 +namecaps +nameer +nameer0123 +namehere +namejb +namesjo +namfah +namfrel +namidayo +namm1982 +namnlos1 +namomer +namour +nampass +namred66 +namsob4 +namxela +nan +nan01984 +nan1356 +nan13579 +nan1954 +nana +nana +nana1228 +nanak +nanak911 +nanala +nanami +nanana +nanana01 +nananana +nanang +nanapass +nanapooh +nanapuk +nanc911 +nance +nanchang666666 +nanci1 +nancu6 +nancy +nancy anne +nancy hall +nancy lea +nancy lee +nancy locke +nancy louise +nancy52 +nancycat +nancykov +nancylg7 +nancym +nancyw +nanda +nanda +nandev +nandhini +nandjiwarra +nando +nando0705 +nando2284 +nandor +nandows +nandox +nandu +nandub +nanette +nani +nani05 +nanie2121 +nanirosi +nanito +nankoo +nanna +nanna +nanneddu +nannette +nanni +nanny0gg +nano +nano1955 +nanohack +nanook1 +nanopc +nanoputo +nanou +nanporot +nantana +nantaporn +nanuem1 +nanwang620 +nanwheel +nanya535 +nanyclem +naocale1 +naohiko +naoki1985 +naoko +naome +naomi +naomi036 +naomi123 +naomi97 +naomihanter +naonao +naonhead +naorman +naosei +naotem +naoum +napa1234 +napa3um +napalm40 +napapiiri +napcan +napero +napkof79 +naples29 +naples55 +napoleon +napoleon +napoleon1 +napoli +napoli07 +napoli12 +nappern +napprasse +nappy +naq18piq +naquadah +naquan12 +narancs +naranjas +naravno76 +naray1 +narayana +narayana1989 +narbonne +narcilll +narcinarci +narciso +narcissa88 +nardella++ +nardi +narek +narelle +narelle +naren +narf +narf10 +narfigo +narfnarf +narib +naricka +narie +narinc +naritofr +narnia05 +narnia1377 +narong +narr3659 +narryy +narsch +narsil +nart +narumi +naruto +naruto311 +narutojutsu +narutux +narvik40 +nary559 +narya1 +nas67poh +nasTy1 +nasa1 +nasa13 +nasa2003 +nasadf +nasaix +nasan +nascar +nascar.com +nascar31 +nasdaq4 +nasdee +nase +nase2002 +nase84 +nasecomo +naseer +naseeruddin +nasenmix +naseputzen +naser123 +nasernre +nash2000 +nash3814 +nash93 +nashira +nashrun +nashua12 +nasim +nasine +nasip1 +nasir123 +nasir1367 +nasiuduk +nasjid +naskonasko +naso +naso11 +nasonis +nasper +nasral741 +nasrha +nasrin +nasronasro +nasser +nasser1967 +nasshole +nassim +nassima +nassop +nassu +nastasa +nastasia +nastassia +nastassja +nastja +nastoid +nasty123 +nastya +nastydave +nastynews +nasuwadr +nasyirat +nat +nat king +nat123 +nat2007 +nat22 +nat511 +natal1a +natale +natali3 +natali911 +natalia +natalia +natalie +natalie +natalie vande +natalija +natalino +natalja1980 +natalka +natalka8 +nataloss +nataly +natalya +natas69 +natasa1993 +natasa98 +natascha +natascha77 +natasha +natation +natatyta +natcomp +nate +nate +nate123 +nate4203 +nateland +nateyp +nath06aa +nathalie +nathalie +nathalie82 +nathan +nathan +nathan00 +nathan1 +nathan1971 +nathan804 +nathan85 +nathaniel +nathanoj +nathy07 +nati +nati99 +natie1 +natie112 +natik813 +natividad +natlampe123 +natnat +natnatx +nator23 +natport +natrat +natrissa +natsnats +natsue001 +natsujo +natten99 +natter42 +nattisen +natur +natura +nature +natym +nau72lus +naughtyjuice +naujokass +nauloiii +naunton +nauqdt +naura +nautic +nautilus +nautix07 +nauyaca66 +nava +nava2876 +navajo +navajo1965 +navar +naveel +navi1 +navidleo +navin +navmp +navne3660 +navy123 +navy3313 +navyman1983 +navyseal +navyseal99 +naw3a +nawaf0485 +nawaf999 +nawal +nawar +nawarat +nawarner +nawary77 +nawkviek +nawroty +naxeras +nayeb11 +nayeko78 +naynays +nayrb17 +nayss +nayu4re9 +naz45437 +naz4raz +nazar13 +nazar1995 +nazareno +nazaret1 +nazareth +nazcaec +nazeeba +nazgul$ +nazijoon +nazipack +nazirite +nazvupih +nb236699 +nb251079 +nb30856 +nb61zx +nba12 +nba2000 +nbaasai +nbalive +nbbt8634 +nbdr4e +nbgaps +nbgsxp45 +nbhxx +nbi8v +nbidnbid +nbills +nbj42 +nbk2006 +nbksnipe +nbn2z +nbprs96 +nbq25 +nbrsvl9q +nbt301 +nbteu8 +nbtstat +nbtvpvwe +nbu +nburvv +nbw14 +nc +nc11471 +nc1701 +nc190989 +nc2507 +nc41111 +nc6f81 +ncaglar +ncassidy +ncb3000 +ncc1701 +ncc1701a +ncc1701b +ncc1701c +ncc1701e +ncc1701m +ncc1707d +ncc4200 +ncdck +ncgf0s +nch2728 +ncic142 +nclweb +ncm4091 +ncode61 +ncossard +ncpwns +ncpxdzk +ncr2021 +ncs2007 +ncsRK +ncsbw +ncsc5163 +ncxtc +ncy4b +nd1g7 +nd4spd +ndadmin +ndandisi +ndangtea +ndanisa +nddgg99 +ndg2008 +ndgkcn +ndh2006 +ndlf88 +ndmk05 +ndn3tpwd +ndn5kr67 +ndp1023 +ndp2005 +ndpcpt +ndr123 +ndr1d +ndrek +nds1212 +ndtq78 +ndubuisi +ne0eevee +ne14sex +ne1966 +ne2008w +ne2eke6j +ne2pia +ne2um5i7 +ne3t1plk +ne5oqoho +ne5rfmpc +ne72ro +neadmin +neahneah +neahok +neakz +neandertal +neb6ndxn +nebbe1515 +nebclan +nebish +nebmed +nebo001 +nebsnave +nebukati +nebula +nebulas +nebunu +necati71 +neckarboy +neckermann +necmettin +necnec21 +neco0212 +necojo +necos +necro +necroally +necromancer30 +necron +necron123 +necronomicon +necrophite +necrosis +necroziz +neculaie +ned +ned35 +neda +nedabogy +nedaftp +nedavadi +nedda +neddies88 +neddim +neden +nederland +nederlander123 +nedersin +nediraj7 +nedj3110 +nedkelly +nedken +nedra +nedrans3 +nedrick +nedrise +nedurb01 +nedux7 +need0224 +need4spd +needgear +needl000 +neele +neelix94 +neenee23 +neenuh +neerod +neeznam +nef621 +neferiti +nefilim50 +neformal +nefretim +nefti +neg +negani +negar +negativedread +negausi +negedoc +neger +negerneger +negersnopp +negger +negledai +negpov +negra +negra96 +negrinka +negua8086 +negvuli +nehemiah +nehorazny +neihco86 +neikole +neil +neil123 +neil1980 +neil4170 +neil76 +neilan123 +neiledgn +neilgt +neilk +neill +neilneil +nein2405 +neinuke +neirdaj +neiti82k +neji91 +nejood +neka007 +nekamas +nekaneka +nekas +nekit01 +nekja4 +nekogirl +nekopi +nekrofil +nektar +nel2328 +nel4ke +nela +nela57 +nele13 +nele50 +nelemoj +nelia +nelida +neliski7 +nelitar +nell +nell roy +nella +nella +nella83 +nellachen +nelli +nellie +nellie bly +nellik12 +nelly +nelly +nelly bly +nelly1 +nelly159 +nelly56 +nellyy +nelmol +nels0n +nelsandi +nelson +nelson +nelson1329 +nelson2325 +nelson29 +nelson95 +nelysk +nem +nem0 +nema3tode +nemanja +nemanja87 +nemesis +nemesis0499 +nemesis1 +nemesis8 +nemigam +nemisis67 +nemitko +nemmy82 +nemo07 +nemolix +nemosch +nemra +nemrac67 +nemravec +nen +nen +nen39man +nena +nenablue +nenavist88 +nendoxe +nene05 +nene44 +neneftw6 +neness +nenettex +nenhum +nenita84 +nenny +neno22 +nenoze22 +neo +neo0708 +neo123 +neo1986 +neo2611 +neo308 +neo3535 +neo5747 +neo8sov +neo911 +neoadsl +neoalpha +neoanonimus +neoauron +neocool5 +neocortex +neogau67 +neoghost +neoiiik +neojacky +neolol1 +neomodus +neomuffy +neoneo +neonjoker +neonlight +neooen00 +neoown +neopia +neos68 +neos7007 +neosar01 +neosporinn +neothe3 +neotokyo +neovo1122 +neovowii +neowa +neowarez +neoyevon +neozion +nepal123 +nepbfs +nepbfsiy +nepeulb +nephtys +nephy999 +nepneerg +nepo11 +nepo11tr +nepomuk26 +nepsxt +nepta123 +neptun +neptun22 +neptune +neptunemb +neptunus +nepu123 +neq71fos +neqznam +nerak +nerak130 +nerdare +nerdz4 +nereknu +nergezif +nerida +nerijus +nerio +nerja5246 +nerlich +nermal02 +nero +nero1234 +nero32 +nero93 +nerolaan +neroman +neron1 +neronero +nerostart +nert67 +nerubriv +neruda +nerv12 +nervding +nerves3591 +nervy +neryani1 +nes24sp +nes8438 +nes9178 +nesa1981 +nesaanch +nesadmin +nesamone +nescafe +nesebor1 +nesertep +neshama +neshida +neskam21 +neskyy +nesles +nesma +neso16 +nesp53qt +nespola +nesquick +nesrin +nessha +nessuna +nessus +nesta23 +nestak55 +nestani +nestor +nestor +nesvarbu +nesz0R +net +net&2000 +net123 +net1263 +net155 +net1983 +net1pc +net1power +net2010 +net23aa +net4249 +net4dmin +net4me +net5 +net556 +netPr0 +netaka +netapowa +netatlantic +netbaffo +netbase09 +netboy +netbre +netbro +netc0m +netcabo +netcafe +neteag +neten +netfly +netglob +nether1343 +nethng12 +nethost +netiaksz +netkabus +netland2009 +netmedia +netmelto +netmumps +neto3797 +netoksas +netoma +netopir +netpioneer +netpr0 +netradio +netrinio +netrix12 +netrom92 +netsa48 +netscape +netset +netsol +netsol21 +netsrak +nettefen +nettefix +nettike +nettle +netto007 +nettwerk +netup123 +netware +netwehuq +network +network1 +networm +netzhost +netzpw +netzteil +netzwerk +neu +neu10xk +neu19boc +neuccio +neues1 +neues1 +neugent7 +neuheute +neumann +neumont +neun2918 +neunsch +neuromancer8 +neuron99 +neurone +neurorouge +neurotech7 +neusprachler +neutrino +neva +nevada +nevada1123 +nevada21 +nevaro89 +neve3003 +nevehomo +nevena +never +never1236 +never4321 +neveravine +neverdie +neverhood11 +neverim +neverland +neverlies +nevermend +nevermet +nevermind +nevermore45 +neveser +nevia88 +neviem +nevilc5f +nevill +neville +neville99 +nevoruem +nevzat +new +new0323 +new078 +new0rder +new123 +new123abc!@# +new16285 +new2007 +new6968 +new8803 +new8803x +newSpeak +newart +newb +newbacca +newber +newberg99 +newbie0815 +newbie1002 +newbiewa +newbking +newblood +newbmm06 +newcastle +newclan +newcombe83 +newcyber +newdb +newdelhi1 +newdkp +newell208 +newera123 +newera17 +newfortt +newgaya +newgrounds +newhappy +newhart +newhouse1 +newjack +newjunk +newknees +newlife +newln999 +newlogin1 +newlondon42 +newmg +newmoon224 +newnerds +newnesslinux +newnet09 +newnews +newopen +newp455 +newpa$$1 +newpass +newpassword +newport +newport1 +newports +newports21 +newpost +newpsswd +newpstv +news +news123 +news1235 +newsadmin +newscan +newschool333 +newsguy +newsoper +newspaper2009 +newsum41 +newt +newt0001 +newtec +newton +newton +newton23 +newtown +newtype +newuser45 +newwine +newy0rk +newyork +newyork1 +newyorkcity +nex1345 +next02 +next486 +nextel53 +nextgo +nexthy45 +nextstep1997 +nextt123 +nexus +nexus1 +nexus75 +nexus85 +nexxus69 +neya +neylan03 +neyle +nezakir +nezinau +nf03wd04 +nf105074 +nf2611 +nf5nd +nfa2679 +nfadmin +nfetten +nffv3 +nfie2312 +nfjth +nfkc123 +nfksd82 +nfl47s +nfly1664 +nfm581 +nfnfnf +nfnsd1ol +nfoi42hg +nforce5 +nfq30dg5 +nfq4yrwz +nfr0x123 +nfr1xqbe +nfrsj1uv +nfscars +nfsmw +nfspeed +nftbj7qh +nfu2w +nfufyxby +nfv5p +nfx52 +nfyovjty +nfzd6 +nfzur +ng siu +ng0704vt +ng19998 +ng1o0m +ng7k8 +ngalem +ngauty +ngboo19 +ngboro +ngc4565 +ngdelphi +ngednged +ngek! +ngepep7 +nghianghia +ngibil +ngikb00 +ngioph +ngktdyxt +ngoc +ngoc12 +ngonluan +ngpgroup +ngr3tnx7 +nguyen +nguyen dang +nguyen01 +nguyenny +nguyenthi +nh1702 +nh1904 +nh4ever +nh5h1evg +nhXHO +nhaaq743 +nhanduc +nhaqajvu +nhatun +nhawat +nhb822 +nhbhx86 +nhcforum +nhctax +nhfabu +nhfqhipt +nhgxj +nhhadm1n +nhhawk +nhieu +nhjj13 +nhjui8 +nhkalkn +nhl2000 +nhl2002 +nhl2003 +nhl291 +nhl295 +nhllak23 +nhlpa2002 +nhlpas +nhm444 +nhm53253 +nhnazha +nhneoy3b +nhocxinh +nhoveem +nhs552 +nht35kbm +nhtemp +nhtwrmth +nhu +nhuanbut +nhumanh +nhuthien +nhy5q3de +nhybgt +nhyt5vcx +ni0urc0n +ni1ih +ni2072 +ni291004 +ni3tc +ni983en +niTi8 +niUp +niZZle +niaemr +nial +niall +niania +niaomujj +niarbeht +niba2004 +nic +nic0 +nic000 +nic007 +nic0909 +nic11492 +nic1303 +nic2005 +nic3day5 +nic4las +nican8r +nicchen +nice +nice0103 +nice2123 +nice2try +nice3 +nice300 +nice4u +nice5own +nice7317 +niceclan +niceday4me +niceecin +nicenez1 +nicenice +nicerack +nicesandwich +nicetry +nicey123 +nichack1 +nichelle +nichich +nichlas94 +nicholas +nicholas +nicholas0941 +nicholas13 +nichollette +nicht +nichts00 +nichtso4 +nici1991 +nick +nick +nick apollo +nick02 +nick0211 +nick0409 +nick0413 +nick05 +nick0698 +nick09 +nick12 +nick1284 +nick1503 +nick1993 +nick331 +nick465 +nickbottom +nickcyprus +nickel +nickel05 +nickel44 +nickelby1 +nickelgo +nicki2411 +nicki3 +nicki3de +nicklas +nicklas1991 +nickle32 +nickle99 +nicknamE +nickname +nicko +nickolas +nickolas +nickpe +nickrox +nicky +nickyjan +nickym +niclas +niclas!! +nicnac +nicnac11 +nico +nico0506 +nico10 +nico1945 +nico1986 +nico2794 +nico6166 +nico85 +nico8827 +nico91 +nico9315 +nicocasi +nicodemus99 +nicodog +nicohund +nicojenn +nicojoff +nicol +nicol65 +nicola +nicola +nicola17 +nicola23 +nicolaS +nicolai +nicolas +nicolas +nicolas1$ +nicolaterra +nicole +nicole +nicole++ +nicole00 +nicole01 +nicole04 +nicole05 +nicole1 +nicole12 +nicole2510 +nicole42 +nicoleta +nicoletta +nicoletta +nicolette +nicolex +nicoline08 +nicolino +nicolka +nicoloiso +nicom1986 +nicomadsen +niconico +niconicofr +niconl +nicos999 +nicoseba +nicotra +nicsar +nicser1 +nicyvon +niczyja1 +nidalap32 +nideya22 +nidi +nido2009 +nidolf +nie.powiem +nie3416 +niebla1 +nied2011 +niedersachsen +niederzier +niekada +niel87 +nielange +nielle79 +niels +niels +niels-peter +niels123 +niels277 +niels468 +nielsen0917 +nielsen363 +nielsm +nielsnes +niem9698 +niemand +niemand1 +niemcy7 +nieminen92 +nienanh +nienils +niere76 +niero78 +niessen61 +niets123 +nietsche +nieuw +nieuws +nievents +niewyezz +niezapomnij +nif1t6th +nif30 +niffle23 +niffs918 +nifl3 +nifrom +nifsnifs +nifty33 +nig +nigalli +nigel +nigel +nigelt +nigeria +nigete77 +nigga +nigga00 +nigga1 +nigga123 +nigga2284 +niggaplz +niggas +niggaz44 +niggemann +nigger +nigger1 +niggers +nigglet +nigguh215 +night +night123 +nightcloud +nightfal7 +nightfall01 +nightfall66 +nightfire0 +nightingale15 +nightmare316 +nightowl1 +nightshade72 +nightsky67 +nightstalker1 +nightsup +nightswimming +nightwalkero +nightwing42 +nightyowns +nignak11 +nigz +nihan +nihanim +nihao888 +nihaom +nihau +nihipass +nihon +nihonjin1 +nihuja +nihuyase +niiax2sn +niilo1999 +niinmiea +nijiko +nijntje +nijo12345 +nijoleg +nijtss +nik1973 +nika +nika1024 +nikaad +nikamaus +nikas1 +nikboggs +nike +nike123 +nikeair +nikeboy5 +nikeboyy +nikenike +niki0105 +niki17 +niki1980 +niki3080 +niki4712 +nikifir +nikigor +nikike +nikita +nikita +nikita12 +nikita31 +nikitas +nikitas6 +nikitka +nikito +nikitos1986 +nikki +nikki +nikki6 +nikkiblows +nikko3765 +nikkolaj1 +nikky78 +nikl3013 +niklas +niklas +niklas06 +niklas12 +niklas2k4 +niklas4981 +niklisa +niknakno +niknik +niko0401 +niko1710 +nikodem +nikola +nikola +nikola94 +nikolai +nikolai +nikolai2009 +nikolai33 +nikolais dance +nikolaj611 +nikolaki +nikolap +nikolas +nikolask +nikolass +nikolaus +nikolaus +nikolaus09 +nikolay +nikolin +nikon +nikon01 +nikon2001 +nikon330 +nikon9j +nikond50 +nikonfm2 +nikorit +nikoroli +nikos +nikos01 +nikosia +nikusa +nikusha +nil +nil14bog +nila +nila0007 +nilay30 +nilaynilay +nilda +nildo +nildon +niles +nilfoo +niljhuku +nille33 +nilpferd +nilrebe +nilrem +nils +nils ole +nils olle +nils% +nils4321 +nilsmoll +nilsnina +nilsson +nilsson1995 +nilsthun +nima555 +nimaya +nimaya12 +nimbus29 +nimchen +nimda +nimda123 +nimda1b +nimda4500 +nimdae0 +nimdanimda +nimdaor +nimdawiki +nimeleth +nimesay +nimeta +nimmokah +nimni82 +nimporte +nimren. +nimrod636 +nimrod724 +nimrod77 +nimsoc +nimvayoz +nina +nina mae +nina0909 +nina1979 +nina1989 +nina1991 +nina2000 +nina2369 +nina7955 +ninabella +ninadine +ninamint +ninanina +nincs +nincsen +nincsen9 +nincube +nineba +niners +niners1z +nineta +nineteen74 +ninette +ning99q +ningen10 +ninguna +ninh2011 +ninhkieu +ninho22 +nini +nini2504 +ninja +ninja124 +ninja234 +ninja5347 +ninja81 +ninjac +ninjaho +ninjapan +ninjars +ninjutsu +ninlanth +ninni +nino +nino10 +ninochha +ninonano +nintendi +nintendo +nintendo1. +nintendo24 +nintendo4492 +ninuita +nioll +niouky +nipaporn +nippel +nipper89 +nippersink +nipple +nippler +nipponsan +nipsy +nir516 +nirak102 +niran29 +niranjan +nirew98 +nirmal +niroot +nirtak +nirvana +nis2k6 +nis3t2wz +nisa8j3i +nisacik +nish +nishant777 +nishi120 +nishma +niska +nismo123 +nismo6666 +nismoz +nison1 +nissa1978 +nissa54 +nissan +nissan8 +nissani +nissannx +nissassa +nisse4765 +nissemand123 +nisser88 +nisshar +nisw +nit +nita +nitasis +nite03 +nite38 +niteuk +nithyah +nitish +nitish98 +nito76 +nitr07 +nitram +nitram69 +nitro89 +nitroboy +nitronos +nitsanb1 +nitsmpqa +nitsuab1 +nitta007 +nittany21 +nittany65 +nittish123 +nitto +nitza +niu +niunia +niunia1 +niunia72 +niuniu +niuunia +niv1015 +nivasas +nivesse +nivniv8 +niwka244 +niwokx +niwota88 +niwwcc8s +nix123 +nix37 +nixamiga +nixdavon +nixdeafr +nixdhe69 +nixdorf1 +nixdorft +nixgibts +niyejoul +niyyiyew +niza +nizaro +nj004348 +nj004610 +nj1989 +nj1995sim +nj3utlwg +njarrrgh +njbarch1 +njegac +njelet33 +njget +njh1965 +njh2094 +nji2b3h4 +njimko +njlpn +njm7788 +njmlk4 +njohn1930 +njoly11 +njqaou +njqs5 +njrf1 +njri2003 +njutarn +njuztim0 +njyo1 +nk192513 +nk2513 +nk2707 +nk4you +nk53819 +nk83ost +nk8991 +nkBHv +nkcrew +nkdrrd +nkenstun +nkfkr73q +nkgvtc +nki7210 +nkjbf +nkk066 +nkl44 +nkmidget +nknews +nkoplm +nkqez +nksdizay +nku3b +nl0000 +nl05ddv +nl2115 +nl2212 +nla23587 +nlb0201 +nlbnlb +nler1 +nlive638 +nlj1nlj1 +nljex +nlmg6aao +nlos +nlp80 +nlq52 +nlss1944 +nlyouare +nlzfr +nlzra +nlzzpprl +nm121886 +nm14z +nm1869 +nm2007 +nm230490 +nm60s2 +nm6qtoss +nm70lj +nma2xqzq +nmandy +nmaweb5 +nmawiz20 +nmc4200 +nmggm +nmoment +nmousa +nmpkwv +nmra9403 +nms04 +nmst +nmsysopp +nmwuz5v4 +nmy66327 +nmyj +nn11210 +nn114re +nn1203 +nn504240 +nn67059 +nn7h2gnw +nnad15 +nnbbmm +nnd7v +nnhhkk12 +nnj1sxp +nnj4dm1n +nnj5m +nnkdxd +nnkhanh +nnmak +nnnnnn +nnpj3185 +nnqme4yn +nns8hh1o +nnvidia +nnw3lod2 +nnw442 +no actor +no one +no12zu38 +no13se94 +no198000 +no1inco +no1knows +no1sux +no3344 +no386771 +no433119 +no50858t +no62f1 +no9902 +noSleP +noaccess +noah +noah +noah1998 +noala +noali +noalki +noam +noam +noam2211 +noangel1 +noaomer +nobBy25 +nobbi123 +nobby3969 +nobi1804 +noble +noble8892 +nobles1 +nobmuo +nobnob143 +nobnumek +nobnuts +nobody +noborrar +noboyko +nobrew4u +nobu +nobuko +nobuo +noburo +nobuyo +noccanocca +nochail +nocheat +nochzone +noci9911 +nociviti +nocker00 +nockhien +nocoast1 +nocode1234 +noctem +nocturna +nocturne1734 +nocuri +nocy1303 +noda1234 +noddov +noddy5 +noddymx +nodeal +nodo +nodoubt +nodrog +nodules1 +noe +noel +noel john +noel1 +noel1984 +noel77 +noele +noelene +noeli00 +noelia80 +noeline +noelle +noelle112 +noemi +noemi +noeminoemi +noemio2007 +noentry +noeosie +noetzlie +nofear16 +nofear69 +nofelia +nofgag71 +nofood4u +nofwarez +nofx +nofxnofx +nogard8046 +nogay +nogeen +noget +noghreh +nogitnow +nogood4you +noh87kuw +nohack36 +nohack51 +nohackmas +nohc04x +nohea05 +nohness1 +nohope +nohs2013 +noi11mar +noichy +noidea +noir10 +noirmout +noise +noise1991 +noisebox +noises +noisette +noisp +noisy666 +noize888 +noizette +nojento +nojnoj +nok351 +noka2100 +nokia +nokia007 +nokia007 +nokia06 +nokia0604 +nokia1 +nokia11 +nokia123 +nokia13 +nokia2 +nokia3 +nokia5 +nokia5530 +nokia66t +nokia8 +nokia999 +nokiaa +nokiaa1 +nokiae65 +nokiaike +nokiam14 +nokian +nokian73 +nokianokia +nokonok +nola +nolan +nolan29 +nolan974 +nolase08 +noldor +noley29 +nolichucky1 +nolier +nolimitd +nolimits +nolita84 +nolka +nolle +nollie +nollopa +nolove +nomad +nomad1500 +nomad92 +nomad987 +nomade +nomadi +nomadic +nomadism +nomamel +nomarly +nombar15 +nomea +nomejodas22 +nomelase +nomeleas +nomemmar +nomercy +nomino@2 +nomis +nomis2 +nomjegeg +nomore +non24572 +nona +nona33 +nonaadel +nonaahmed +noname135 +noname69 +noname9658 +nonanona +nonasailing +none +noneee +noneno +nonenone +nonest +nonexistent +nong +nonglean +nongming +nongtim +noni +nonix +nonlaso +nonlpef +nonmiva +nono +nono0000 +nono4000 +nono5252 +nono90 +nono954 +nonore +nonoyno +nonsense +nonya +noob +noob12 +noob123 +noob1990 +noob2007 +noob23 +noob2323 +noob51 +noobcleric +noobie.1 +nooblet3 +nooblet92 +nooblike +noobllol +noobnigger +noobnoob +noobs +noobs456 +noobsoup +noobtias +noobtube +noobus +noodle420 +noodles +noodles1 +noofy123 +nookiedvd +noomate +noone +noone22 +nooneyou +noonie +noonoo +nooo +noooob +noooor +noopadoo +noorhan1 +noorman95 +nooroo11 +noot2001 +nootropil1 +nop +nopadoe +nopadol +nopass +nopass81 +nopatiku +nope +nopob012 +nopuedo +nopw! +noquid +noquiero +nor12345 +nor1330 +nora +nora lou +nora03 +nora09 +noraa +norah +noralars +noramae725 +noranora +norarae +norasinclair +norb0904 +norbenn +norbert +norbert01 +norbert20 +norbert41 +norbert5044 +norberto +norbi +norbo262 +norco +norco1 +nord7 +nord8899 +nordeng86 +norderst +nordikmix +nordmann25 +nordrein +nordvik81 +nordwich +nore95 +noreen +noreli +noreturn +norga +norgo +nori elisabeth +noricers +noriegab +norihei +norilsk1979 +noris20 +norito +noriyuki pat +norka12 +norkles1 +norland1 +norm +norm +norma +norma +norma dell +norma jean +normac +normaj8164 +normals +norman +norman +norman1989 +normandy +normankurt +normann +normark. +normaruppert +normee +normondo +nornor +norrab +norriboz +norrie +norrilein +norris +norrlands00 +norte06 +north +northbrook +northern77 +northrop +norton +nortonf1 +nortschi +norty +nortycs +norway93 +norwegen96 +norwegia1 +norwegian006 +nos7serc +nosam123 +nosarh +noscrubs +noseball +nosedive +nosep0rq +nosfera2 +nosferatu +nosferatu65 +nosila29 +nosmoke +nosocial +nospam1 +nospe90 +nospoon +nosrat +nosser123 +nosss1 +nosstiti +nostra00 +nostromo +nostromo1 +nosugar +not found +not2me +not4che +not4ne1 +not4sale +not4u2c +not93num +notarget +notbrian +notceg54 +notebook2009 +notemari +notepad107 +notfail +notfair +notforu +notfound +notgiving +nothing +nothing1 +nothing2009 +nothingspecial +noticsp +notification +notime +notirt +notnow +notorious +notpassgo +notpr0n +notqvlws +notredame +notredbear +notresla +nottingham08 +noudeux +noudje +nounou +nounou05 +nounouf5 +nounours +nour3000 +nourick +nouvelle45 +nov2080 +nov601lp +nova +nova1 +nova369 +nova5497 +novac007 +novacane +novah1 +novaidea +novalja +novebohe +novell +novella +novelle +november +noveonada +nover082 +novi76 +noviembre3003 +novilo +novirus +novisad +novita +novita12 +novita69 +novitanovita +novoross +novricky +now2now +now2then +nowak +nowakm +nowalone +nowass +nowastrona +noway01 +noway1 +nowayout1314 +nowcool +nowdarum +nowe3340 +nowelle +nowhere +nowhere9 +nowimin +nowis1983 +nowitzki +nowkking +nowmich +nownow +nowwhat +nowyport +nowzari71 +noxiousnoob +noxrox +noxx669 +noxxx3 +noxzh +noyan +noyan8898 +noyesfamily +noynoy +nozha +nozhagh +nozmul +np006911 +np1815 +np3s6 +np4uijqg +np5604 +np68zung +np6s2kgj +np9sv12 +npc0394 +npcdx +npdedi17 +npdsb +npfu9 +npgia +npkx6 +npl174k +npl50a12 +npmmamt +npnwtm +nppc6772 +nppqdlc +nproot +nprules +npsysmk +npufc05 +npurxo +nqc8 +nqca0 +nqgw8d +nqhippo +nqi33u +nqthuy +nqvwkfyt +nqzi7 +nr4459 +nr8sv +nr9426 +nrab6s +nrbd7 +nrcr2016 +nrdt77 +nrgnrg3 +nrh4upc7 +nrh820 +nria95 +nrj369a +nrkz +nrmatrix +nrmcbd +nrmcss79 +nrmzxr +nrw4ctx +nrw74y +nrzpfw3h +ns123sm +ns224431 +ns82na0i +ns8318 +nsakyra +nsan7252 +nse0623 +nsejg +nsfqmthb +nsfz0523 +nsgamer +nshadday +nsj69tqr +nsk74y +nslc +nslhnslh +nslucia +nsm +nsn +nsofnsof +nsp2k5 +nsqct +nsrdmah +nsrguy89 +nsrhonda +nsrs79ti +nstasg10 +nstl2000 +nstyle +nsw2f +nswnsw +nsx100 +nsxkf474 +nszwolle +nt1008 +nt4luvdj +nt50f57 +nt650gt +nt824475 +ntasm +ntazamel +ntbytes +ntc47091 +ntexec +nthau +nthu207 +ntisj0 +ntn8cyfx +ntnet +ntodmitry +ntoutec +ntp2004 +ntpthao +nts58xp +ntsmms +nttrieu +nttwl +ntur1234 +ntut +ntv4585 +ntv791 +ntvmsnbc +ntxhai69 +nty3b6 +nuage0206 +nuamnici +nub +nub2oo5 +nubcake +nubilum +nubius1 +nucera91 +nuckels2 +nucle01 +nuclear +nuddel2 +nude2003 +nudelholz +nudeln +nudelret +nudelsuppe +nudlmail +nueasta7 +nuefree +nuella +nuely +nuera36 +nuernberg +nuessy90 +nuestrac +nuevo +nueza123 +nufuba31 +nugaal +nuggets +nuggets4me +nugt284 +nugul +nuke0414 +nuke0776 +nuke0815 +nuke25 +nuke36 +nuke4356 +nuke77 +nukem678 +nukem99 +nukenut +nuker +nukerail +nukeshit +nukester +nukh2009 +nukkui2006 +nukkumatti +nukreb +nukunuku +nul67 +nuleech +null +null07 +nulli1314 +nullnull +num1kila +numa +numair +numaitu +numancia2009 +number1 +number2209 +number4 +number71805 +numberone +numbert +numbie +numeisei +numenor1 +numer1 +numism +numlock +numlock1408 +numlook +nummer91 +nummerx +numpty +nun45zen +nuna2662 +nuneca +nunes +nuno leal +nunoamaral +nunsl90 +nunu2776 +nunu5466 +nunuta +nunya1002 +nunzio +nuoroda +nuovo +nupsk1 +nupvo68x +nupwahag +nuqudu +nur1122 +nur1532 +nur4064 +nurcan +nurcan16 +nurd123 +nurdostu +nurgle +nurgul +nurhan +nuri +nuri +nuria +nurich +nurminen11 +nurntka +nurnur1 +nuroman0 +nurse +nursel +nursen12 +nuruakh +nury +nury1984 +nuryslake +nus123 +nusct +nuser1 +nusestie +nusse0011 +nut94ter +nutcracker95 +nutella +nutella9 +nutellaa +nutka123 +nutkitty +nutmeg +nutpass +nutrafin +nutsack +nutsnuts +nutte +nutte40 +nutty2 +nuv98 +nuveena +nuvolari84 +nuw86san +nuwanda +nuym +nuza1837 +nv7xo4 +nvbwwcjw +nvca +nvdoi +nvern0oy +nveu96 +nvfe92a7 +nvgg2 +nvhcj +nvidia +nvm3act3 +nvreptil +nvsystem +nvtkel +nvux0 +nvvi4fiy +nvytt +nw3096 +nw67vk32 +nwa7273 +nwbdd +nwbxl +nwc8 +nwdf +nwewsurg +nwgdhdz +nwind2k +nwm2tpxc +nwms3qnd +nwonwo +nwoshag +nwpfwv +nwra21 +nwwj9 +nx01nx01 +nx2hwd3u +nx6dztrt +nx7brq +nx91010 +nxc4p +nxdabest +nxf5s +nxnxnx +nxpEhs +nxt101 +nxt60 +nxxh15pa +nxyawz +ny1234 +ny15602 +ny1gy6uk +ny2005mt +ny252650 +ny4444 +ny7829 +nya +nya8d36p +nyabicha +nyafi1 +nyc2004 +nyc580jr +nyca +nyca2118 +nyctale +nydeh +nydia +nyganes +nygas12 +nygatan6c +nyger1 +nyjets69 +nyjetsnyjets +nyki66 +nykiel89 +nyktbs6y +nyl5m +nylon11 +nylons +nymph678 +nymph7089 +nymphet +nyncu +nynyny +nyo678 +nyp0y +nypd12 +nypogo25 +nyquil6400 +nyquist +nyree dawn +nyrx +nys +nysander +nystrom85 +nytadmin +nytrda +nytt138 +nyu4520 +nyupper +nyv1zt9h +nyx +nz0070 +nz146484 +nz2009 +nz450 +nz49499 +nzFD33DAH7$2Zm +nzdft +nzej93nz +nzeu0 +nzf140 +nzfkc +nzm95 +nzpw3 +nzsl1 +nzt4294 +nztriops +nztvsl +nzwzf +nzxqdlji +nzxtfxp +o +o'neill +o02asedj +o037s6 +o0530o +o0bva +o0ebp +o0nls +o1418ku1 +o183366 +o1fed3ew +o1k1a1n1 +o1rqz +o1t2e3k4 +o1tjqj8y +o2007o +o21193 +o230350m +o2785621 +o29492l +o2r0e5n7 +o2x5d6 +o3l1tj +o44x8 +o4799 +o4anw +o4duo +o4kly +o4lgq5 +o4ze8 +o55k55 +o5dmoeoy +o5glx +o5iris +o5r5a2 +o62036 +o646p +o64759so +o674u +o6lve +o6usp2rc +o72787 +o743g +o7o452jb +o7plbh +o7qpdxa6 +o7vxw5nv +o86zm9 +o875ppp +o8aqduz1 +o8ehD12888 +o8m9e0r7 +o90700qa +o944321 +o9a2mn5g +o9ckeghem +o9erlin +o9j6oypo +o9ltf +o9ozce4g +o9ri4w +o9wok +oBJrQ9R167 +oCO4Z +oCeE41 +oI2soR3 +oKuMi7 +oMpusG +oSdbxu +oT691215 +oWQUgc +oa5p0 +oa8140 +oaasbssz +oachi +oaev4 +oak +oak954 +oakcrest09 +oakhill +oakland +oakland0512 +oakley +oakmont86 +oakridge +oaktown12 +oami +oao260 +oasd2g95 +oasis24 +oasisgt +oasisoasis +oaskdjr +oaspswd +oatmeal +oatnarak +oatts4017 +oaxen +oaza2010 +ob14sv36 +ob281 +ob632106 +obaka +obcgraham +obchmata +obcs2113 +obe999 +obeisance92 +obelix +obelix24 +obelix73 +obenhaus +oberaffe +oberfett +oberg +oberochse +oberon456 +oberriet +obi4amte +obidomi +obiobi +obiwan1a +obiwan20 +obiwan27 +obiwan99 +obiwankenobi +objectif +obkv7777 +oblal2 +oblinian +oblivion +oblivion6 +oblivion9723 +oblix +oblom23 +obolg09 +obqbvjhg +obrazek7 +obren +obrus +obscure1 +obsession1979 +obsidian +obsidian1 +obsolete56 +obtztu2w +obuda3 +obviously1 +oc190270 +oc21735 +oc2202 +oc2213 +ocalatd +ocali +occ00 +occult +ocdave +ocdlaura +ocean +ocean893 +oceanborn +oceandir +oceane +oceane30 +oceanit +oceanreise +oceloyd +ochaeta +ochipala +ociacia +ocilives +ociredef92 +ocken +ocmk1 +ocn2e +ocnjr +ocococ +ocoee98 +oconnor +ocsserver +oct1232 +oct1283 +oct1586 +oct71978 +octaaf +octagon +octav16 +octavier245 +octavio +octo2682 +october +october24 +octonoob +octopius +octopus033 +octrard +octron +octubus +ocurra +ocy43 +od07sw +od5nbk4n +od5nbk4n +od5rak +od735 +odb7s0r2 +odbyt +odd +odd234 +odd321 +odd6171 +oddekalv91 +odder8300 +oddish7474 +oddone +oddset +oddworld +oddysey123 +oded +odeeps +odelay76 +odem88 +odeode +oderece +odessa +odessa32 +odete +odette +odh8292 +odi2lik +odiccrew +odie1129 +odie2208 +odiebest +odif1234 +odile +odin09 +odin14 +odin1981 +odin99 +odisea +odishelm +odiugma +odium +odjebi +odnair +odneox88 +odoardo +odolmed3 +odonto +odrie4 +odropico +odtuodtu +odv70597 +odyseja +odyssee +odyssey2009 +odysss +oe8425ch +oecim +oecr641 +oeilog +oeloel +oemsoft +oen123 +oeph0 +oeps60 +oerbekke +oergaard +oerjan +oernesto +oesiole +oettam75 +ofbehack +ofcadmin +ofdehomo +ofelia +ofen66 +ofenbau +offchar +offenbarung +offenbit +offeroge +office +officers +offline +offlyne +offmgr +offspring +ofhru +oficial +oficina +ofir +ofir0fir +ofir123o +oflmv +ofna666 +ofni +ofoda +ofqcgtj +ofra +ofschile +oftn8 +ofuofu +ofv3001 +ofvc440 +og4web +ogabooga +ogame1 +ogame19 +ogamegamer +ogamer22 +ogarek900 +ogbl0 +ogf423 +ogfvg +ogib18 +ogis321 +ogki6 +oglum +ogor +ogourana +ograx16 +ogrenci +ogretmen +ogrodnik +ogsadmin +ogulsan +ogun4eto +ogunoyku +oguz9805 +oguzhan +oh2005 +oh299100 +oh43615 +oh447188 +oh5555 +oh7ol +ohab567 +ohadzona +ohaoha +ohapres +ohbabydu +ohcomely12 +ohesii +ohfilza +ohgott99 +ohgr1982 +ohgrocks +ohhdamn +ohilburger +ohiopal +ohlalaa +ohleever +ohlo +ohmigawd1 +ohmss1981 +ohmstede +ohmygod +ohmygod09 +oho8f +ohrwurm +ohsnap +ohsnp +ohvei3na +ohvitae +ohvnk75 +ohwlgd73 +ohyufztt +oi +oi06 +oi09oi +oi225dzm +oiWvia +oic9505 +oicalvin +oiceoyok +oicne1n +oicu2222 +oidoid +oidoxie +oie +oierak71 +oigaiboigaib +oihtiyar +oiks +oil3232 +oimama +oinka1 +oinkoink +oinkpo27 +oint +oioi1212 +oioioi +oioioi29 +oiomine +oip123 +oiqu9 +oiram84 +oiramneo +oirrio +oiswv +oitmiqn9 +oiueek +oivad +ojamajo +ojco1n2z +ojdingo +ojeboasp +ojeoje +ojeva +ojfarhjc +ojg7v1 +ojg978 +ojhci3x1 +ojkiller +ojkiyd +ojkjs +ojn585 +ojp8q +ojpxv +ojs2gmv3 +ojuhjkh +ok +ok123456 +ok1344 +ok2009@ok +ok212006 +ok654321 +ok791003 +ok8tenak +okan +okan111 +okan1991 +okan2006 +okane123 +okanhex +okanokan +okapi972 +okapokap +okashi10 +okay55 +okay555 +okazaki1 +okba123 +okc8j +okco9dio +okcool +okdyb +okenia +okeoke +okerland +okey +okhack3r +okidata +okidoki +okiginiq +okilione +okiloki +okimoto +okin85 +okita +okj8h +okjr3 +okkapa +okkn4k +okko +okkool +okl375 +oklahoma +oklks733 +okm98waz +okmokm +okmujm +okmvxzdf +oknardaj +oknetal5 +oknitram +okocha51 +okocim +okokawaw +okokok +okoksd +okome +okonite12 +okoska +okpook18 +okpwd33k +okqtgej +okqtr +okqualle +okse1234 +oksit +okt2ber3 +oktavian +okthen +oktober +oktopos +oktoy66 +okular40 +okuma +okunokun +okuzumsu +okwut1 +okyanus +okyanus5 +okyanus7 +okydokey +okyukigo +okzacehr +ol1v3r +ol234gs +ol298mas +ol49pm36 +ol693945 +ol6mtrb3 +ol84neve +ola +ola +ola6583 +olaa48 +olababy2 +olaf +olafmod +olafson +olaiuool +olala1 +olala4 +olan +olana +olanders2 +olaola +olav +olavo123 +olca00 +olcay123 +oldaib +oldday6 +olddog150 +olddwarf +oldenburg +oldfan +oldfool +oldgonzo +oldham123 +oldhun +oldie13 +oldiq789 +oldlion +oldman69 +oldmen +oldone +oldpirates +oldschool +oldsmobile +oldtimez1 +ole +ole3800 +olee633 +oleemuh +oleg +oleg +olegoleg +olek7905 +olenlah3 +oleodder +oleolay +oleole1 +oley +olfaref9 +olfert +olfktm11 +olfqtac1 +olga +olga +olga georges +olga san +olga1234 +olgakirk +olge89 +olgiata0 +olgpas +olhuveli +oli1707 +oli345 +oli52740 +oli8461 +oli987 +oliH +olibas +olibones +olicool +olidata +oliger +olijf +olimA1 +olimpas +olimpia +olimpica6666 +olimps +olin +olinka +olitec +oliterra +olive +olive golden +oliver +oliver +oliver3792 +oliver89 +olivera +olivercedric +oliverio +oliverm1 +oliverol +olivett3 +olivetti +olivia +olivia +olivier +olivier +olivierh +olivine42 +oliwan1 +oliwia121 +olka +olka1804 +olkm7f3o +olko8 +olla +olle +olleh1 +ollelund +olli +ollidolli +ollie +ollie1005 +ollie99 +ollieking +ollihr +olloloo +ollouggu +ollw280c +olly1234567 +ollytini +olmass +olmecsss +olmetec +olniR +oloco9ud +olof +olofsson123 +ologil8i +ololz +olom6 +olon +olopopi +oloppolo +olorgh +olorin2 +oloroko +olotrab3 +olovier +olpeole +olpifgi6 +olpolp +olppe +olpran +olrak93 +olred +olsenolsen +olsykh +olsztyn +oltajavi +olu +olugid48 +olusia +olusia10 +oluwole +olvido +olvier +olviier +olx5v +olxeayll +olya123 +olymp +olymp75 +olympe +olympia +olyolyo +olyvian +om +om0562 +om111434 +om1d2s3m +oma123 +oma3110 +omaberta +omac1988 +omadmin +omaewo +omafelix +omagah12 +omagawd +omaha2284 +omahg +omalulu +omamees +omar +omar +omar0998 +omar1996 +omar88 +omarabad +omarh +omaro20 +omarqwe +omaschum +ombeline +ombligo +ombug +omcxnx89 +omebryn +omega +omega. +omega1 +omega1t3 +omega360 +omega56 +omega87 +omegadib +omegapet +omegapi +omegaterra +omegavan +omegazafira +omekron +omelon +omen +omen59 +omena +omena123 +omens789 +omensore +omer +omer12 +omer310 +omergo12 +omerimha +omero +omero +omeromer +omerta +omfdatff +omfg +omfgbbq +omfghax +omfglol +omfgrofl +omfgz0r +omg +omgapass +omgcool +omgcows +omgd +omggosu +omgh4x +omghax +omghi2u +omgkw9m8 +omglol +omglolpw +omgnoob +omgomg +omgrofl +omgt1t4n +omgtkkyb +omguruom +omgwee +omgwtf +omgyou12 +omhariom +omhenk +omhinucd +omi680 +omi9g +omicron +omid +omid4450 +omikrony +omila123 +omiromir +omito3636 +omitomit +omkara +omkxn +omlo +omloop109 +omme3103 +omnbx +omnea +omni1313 +omni2549 +omni99 +omnia085 +omnia55 +omniaomnia +omnibus21 +omnimart +omnimonx2 +omnipote +omnitrix +omo +omonoia +omooant4 +omorode +omosom +omotoro +omqlol +omr12569 +omran22 +omri23 +omri89 +omrkk +omsk1410 +omsk69 +omsmedia +omur +omwo75 +omxvq +omyvfkkr +on4viequ +onBRK +ona +onafets +onali +onarbul +onares +onaronar +onasya +onbekend18 +oncall +oncel +oncue1 +ondrejka +one1 +one4all +oneal2653 +onedollar +oneechan +oneesama!1 +onefour4 +onegai1 +onegin86 +onegs911 +onelov3 +onelove +onep4950 +onepiece +oner566 +oneren +onerim1 +onesign +onetinc +onetree +onetruck +onetwothree +oneway +onewinged0 +oneworld! +onfrappe +ong kian +ongtrum +ongue +onhill +oni4life +oni75951 +onimoc +onion093 +onion11 +onionxp +onka01 +onkel252 +onkeldoe +onkellothar +onkelz +onkelz04 +onl73 +onlartin +onli1wb +online +online1 +online39 +onlinedaft +onlinu +only1sg1 +only4me +only60 +onlyalex +onlyforme +onlyino +onlyleet +onlyonce +onlys +onlystar +onlytou +onlyu +onmove +onmxtr2m +onmyfarm +onneb +ono009 +onoernie +onomastica +onomatopoeia +onosendai +onpfnd3d +onpnwfa9 +onreifni6 +onrockz +onrop +onsale +onseha +onskelis +onslow +ontario1960 +ontario666 +ontidvo +onulyil +onur +onur01 +onur123 +onur13v +onur89 +onur981 +onurcan +onyx10j +onyx2000 +onyxia69 +onyxou +onz6123 +oo +oo12382o +ooROcv +ooet57mm +oofatine +oogie1 +ookie +ooliocay +oomhmee +ooneeta +oongiso +oonnnnii +oono0ko +ooo +ooo156 +ooo2jhl +oooh8400 +oooo +oooooooo +oooyk +oop003 +oopee9g +oops +oops. +oops121s +oops1225 +oops8888 +ooq36 +oot98 +ootto muehl +ootwt +ooxa2 +op123 +op20c +opa999 +opaldog +opalenet +opaline +opalos12 +opalstein66 +opaoma +opaopa +opaopa3 +opapapa0 +oparola +opatofu +opc123 +opcyk1 +opdeeck +ope9g02 +opedja4 +opel0299 +opel1966 +opel1994 +opel2005 +opel40 +opel77 +opelclub +opelgsi +opelgt +opely1337 +open +open door +open sesame +open0401 +open123 +open15 +open240 +open2580 +open4me +openalka +openconf +openit +opennow +openop +openross +opensaysm9 +opensesame +opentest +openwindow +openxp +oper0089 +oper1597 +oper2002 +opera2000 +opera73 +opera84 +operador +operador2 +operasyon +operate123 +operater +operations8 +operator +opethfan +opex2008 +opexpass +opfer949 +opfr0102 +ophelia +ophelia92 +opicapi +opijs1 +opikik +opilein +opilek +opilki +opimuadc +opiopi +opium! +opium62 +opkno4ik +opl3sax +oplata2010 +oplers45 +oplopo +opnhx +opo +opoppg12 +opoppip2 +opossum525 +oppa2430 +oppgave2 +oppolska +opr2p +opra115 +opra77 +oprah +optech +optecon +optichef +optikeR +optimist +optimo +optimus08 +option +optional +options1393 +optiplex +optix123 +optjuwsu +optout01 +opus2007 +opus28 +opus64 +opusmilo +opzbp8sb +oqdfk +oqegyq +oqmhux +oqupload +oqzo1 +or1y5 +or9ei +ora00b +ora6cool +orac +oracle +oracle69 +oracle9i +oracool6 +oraison +orakulas +orakulo +oralb +oraleorale +oran6414 +oranda +orane +orange +orange12 +orange50 +orange55 +orangeb +orangejam +oranges +oranges3 +orangetj +orangina +orango55 +oranje04 +orasa +orazio +orban01 +orbi6651 +orbit +orbit111 +orbital +orbitek +orbjet +orbo77 +orboros +orca3000 +orcesco +orcinus +orcox +orcsan +orcsown +orcthac +ordc321 +ordema +orden +order1989 +ordinateur +ordlyn1 +ordnaelk +ordner06 +ordosian +ordu52 +oreagpee +oregano +oregano91 +oregon +oreh7822 +orel123 +orel159 +oren +oreng +oreo +oreo01 +oreo3908 +oreooreo +oreste +orestes +orestevi +orewa319 +orfmu +orgaf +organa23 +organism84 +orgasm +orgasmatron +orgatec1 +orgie +orgle15 +orgrudi +orhan +orhan123 +orhemi77 +ori +orian70 +oriana +oribisu +oridori +orietta +origami +original +originalas +orihuela +orimail +orina333 +orinoko +orion +orion +orion003 +orion145 +orion8 +orion9 +orion998 +oriondna +orionz! +orioscar +orita13 +orjan +orka +orkan1512 +orkand +orkissos +orla +orla00 +orlandini +orlando +orlando +orlandob +orley +orlitix +orlo +orlowski +ormantik +ormond13 +ornella +ornella +oronite +ororor34 +orororor +orospu +orozbek +orp22f +orphen86 +orpund +orre112 +orris92 +orrn2007 +orschel +orschel34 +orslow +orson +orsson +ortaasya +ortakoy71 +ortodox +ortsac123 +orus099 +orusclub +orville +orving +orxwu +oryan321 +orzi4321 +os/2 +os021168 +os2000 +os2xls3 +osa +osacuka +osama +osama008 +osamad0x +osamen +osamu +osao +osarugue +osasuna +osbm2565 +osbourne132 +oscar +oscar +oscar ortiz +oscar paul +oscar1 +oscar101 +oscar123 +oscar1337 +oscar321 +oscar64 +oscar78 +oscaree +oscarfwg +oscarmaximo +oscarmolnar +oscarru +oscarsson91 +oscillon +oscoda73 +oscuro5 +osdorp +osdset +oseayo +osef +osem8888 +osfarias +osfr332u +osgood +osgood +oshannah +oshblab7 +oshique +oshitaka7 +oshiwa +oshjay +oshooj +oshrey +osinix31 +osiris +osiris1990 +osiris84 +osirisadmin +osito1 +osiwlyfb +oskar +oskar +oskar02 +oskar2003 +oskarex +oskarix +oskaroskar +oskeemm +oslik2000 +oslo1420 +oslobaer +osm4722 +osman +osman +osman2006 +osman963 +osmancik +osmanme +osmanosman +osmanpepe +osmar +osmashi +osmosas +osms +osobuco +osocahef +osofmb +osokau05 +osopanda +osorio +ososos55 +ospirap +osponde +osqiof +oss3k +ossa12 +ossc +ossela +ossi1982 +ossie +ost1304 +ostara +ostbahn +ostejens1 +ostepai1 +osterblume +ostermond +ostern17 +ostern: +osthyvel +ostia +ostrava +ostroda6 +ostrus14 +osvache +osvajaci +osvaldo +oswald +oswald1402 +oswaldo +oswegatchie1 +oswego1999 +oswels +osxrules +ot1sberg +ot4power +otacon +otadmin +otahel +otajye2p +otakar +otaku +otakurules +otar +otavio +otb9n +otcfre +oteil +oteim07 +otello +otelo33 +othello64 +otillia +otimiaj +otinane2 +otinesra +otis +otj35 +otjhj +otkos +otm123 +otmnsat +otniap +otnk6490 +oto +otoja5 +otomar +oton2205 +otorak +otr +otr2006 +otred +otreko +otrlog +otsosika +otta +ottaman +ottavia +ottawa1 +otte1312 +otten +ottensen35 +otter +otter12 +otter1997 +otto +otto.. +otto1735 +otto1984 +otto1990 +otto2910 +ottocarl +ottola +ottolenghi +ottooma +otvalite +otvvqnjb +otwinta +otxi7100 +ou +ou yang pei +ou yang so +ou31gfc3 +ou812 +ou8122 +ou812345 +ou8124me +ouaisse +oudo +oudshoorn +ouechmoi +oufhwjgd +oufpool +ougrocks +ouidan +ouioui +ouioui69 +oukiindy +oulaj +oulala +ounaiom7 +ounana +ouned +ounis +ounix +oupas +ouqz6 +our2kids +ouragan +ourale +ouray +ourhouse +ourkrk63 +ourmaika +ourtime +oussama +out2break +outbreak01 +outcast +outer69 +outfig +outi +outkast +outland2009 +outlast +outlaw +outlaw123 +outlawxp +outlook +output +outrider123 +outside +outzida +ouvki +ouvnyp +ouwevent +ouzosissy +ov101283 +ov3zt +ovans123 +ovb8m2kr +ovc2p +ovcapass +ove +ovelha +ovelord +over21 +overberger +overbey1 +overdrive +overeasy +overklog +overly +overmind82 +overpower100 +overpower16 +override +overwerder +overworld1 +overzeal +ovflyh +ovi +ovi8meri +ovidux +oviedoov +ovila +ovjothi +ovned1 +ovni38 +ovruch +ovwts +ovxn4 +ow8n69 +owalmc2 +owcl +owd1968 +owd3s +owdnw42 +owen +owen +owen01 +owen10 +owen6174 +owen777 +owenhart +owenhart +owentown +owfema01 +owl1981 +owlterra +owlz7 +own3d +ownadger +ownage +ownage! +ownage3 +ownami +owned +owned03 +owned1 +ownedone +ownedyou +ownme +ownt101 +ownt12345 +ownyou +owulacja +owvn123 +owy5xgp +owzX46 +oxced52 +oxeru +oxfeldt +oxlaban +oxmox +oxoiglxi +oxoneeum +oxpanjaz +oxpt0 +oxuun +oxwc9kmm +oxwii +oxymoron +oya +oyde +oyetio +oygk7 +oyin +oyj26 +oykaiqu +oykeppj +oykuoyku +oykv9 +oynm3t1l +oynvu +oyqdn +oyu15516 +oyvind2207 +oz0myge5 +oz0xxx +oz123 +oz198487 +oz1992 +oz3626 +oz4yxub5 +oz9zy +ozadmin +ozan1989 +ozanacar +ozanbabacan +ozaoozao +ozc65588 +ozcan +ozcan2031 +ozcan31 +ozcancan +ozeg1984 +ozek123 +ozekinci +ozeluii +ozemedia +ozepass +ozer2020 +ozeresin +ozge1976 +ozgenoz +ozgeozge +ozgur +ozhe33 +ozhkyte +ozhozh +oziiii +oziro +ozirus +ozisback +ozismygm +ozj1977 +ozkan64 +ozling +ozmo1983 +ozoire +ozom2003 +ozywihew +ozzayy +ozzie +ozzie nelson +ozzie8908 +ozzmosis +ozzy0627 +ozzy12 +ozzy5 +ozzy500 +ozzy6666 +p +p00000k +p00bear +p00fta +p00n3d +p00p0990 +p01sson +p020901t +p022871s +p040690i +p060790 +p07470 +p085632p +p098uhgf +p0Exp1 +p0d2009 +p0dp0d01 +p0esf +p0icn +p0ker +p0l1c3s +p0l1n3 +p0larr +p0llux +p0lysc0p3 +p0o9i8 +p0o9qw +p0oiuy +p0op0o +p0p0p0 +p0pc0rn +p0pc0rn1 +p0rc0di0 +p0rn0086 +p0rn0king11!! +p0rn0s +p0rn5t4r +p0rsche +p0rsche9 +p0tat0es +p0ve41r +p0w3r1ng +p0y099 +p1 +p10n33r +p10nek11 +p110681 +p122071p +p123456 +p12345p +p123p1 +p12yen +p13014 +p1378 +p13g07 +p13p0p +p1401414 +p1430pir +p1465b +p155wor4 +p17n14b8 +p18i330x +p191l +p195332 +p197825 +p19834 +p1a2c3 +p1a5t1c +p1anet +p1anp +p1c2jl3c +p1cc0l0 +p1ckle +p1ersc1en +p1l5ner +p1loto +p1mp +p1mp11n +p1mp3r0 +p1nt0 +p1o2i3u4 +p1o3kafg +p1p1l1n1 +p1p2p3 +p1pc1a +p1r4t3 +p1rates3 +p1t4g0r4 +p1trag3r +p1zK4 +p1zd3c +p20216972 +p21ras +p222002m +p230776 +p255mln +p260461 +p2664i +p27kjf3q +p2858503 +p2a0g0e0 +p2a2oagn +p2c2ckms +p2ckrmmc +p2d2d2 +p2death +p2erj +p2gyi +p2hcevxn +p2install +p2ital33 +p2lwl +p2mleybz +p2ooa +p2tdk +p2xen +p2xfn +p30b69 +p311e +p31697 +p322whhf +p33p33 +p33t4r +p34r5 +p3638z +p39mac +p3cmo +p3epfu +p3lrerz8 +p3n1s3s +p3nc1L +p3nd3x +p3nelope +p3nt460n +p3oples +p3p3159 +p3pjy +p3pw1234 +p3pwl +p3r3b4 +p3r3zoso +p3rk3l3! +p3rl4n +p3rriq +p3t3 +p3t3r +p3ta +p3tk0 +p3trucc1 +p3wp +p3x349 +p3x669 +p3x878 +p407d +p410588 +p410695 +p4248 +p4282w +p433w0rd +p44rd3kr4ch7 +p4510n04 +p455 +p4558ass +p455w0rd +p45c4 +p45sw0rd +p4645316 +p4684 +p470nfm4 +p4710k +p4832 +p4ck3t +p4cmelb +p4df00t +p4ebe +p4g3d0wn +p4h8i7l1 +p4kxo +p4l4c3 +p4nc4c3s +p4nn3m4nn +p4ol4 +p4p3r5 +p4r1s13 +p4r4d0ks +p4r4d0x +p4r4ply +p4slayer +p4ss +p4ssWd +p4ssw0rd +p4ssword +p4t533c +p4tribu +p4ulh3lp +p4uz3d +p4zzw3rd +p5200188 +p52080 +p54071 +p568802 +p56a7329 +p598763 +p5crusader +p5gD3pTt +p5oce +p5p5p5 +p5utceno +p608527 +p6146fuc +p615342 +p6477644 +p6525783 +p6722 +p679ziaz +p68cufnh +p699rxwg +p6cfh +p6o9m8i3 +p6ul +p6vui +p6y1bqwr +p706tr21 +p70kalle +p7101309 +p71mo +p7210120 +p751948 +p760930 +p76480 +p771920 +p7789517 +p7944782 +p7augey +p7d8n5k3 +p7yzi +p802701h +p8318183 +p84n31b7 +p8732241 +p886024 +p8auk +p8dzy6tx +p8eopias +p8i8c2k +p8iic +p8imd +p8kuh8 +p8nkr8ck +p8ssw0rd +p911231u +p91h358 +p9282001 +p99102 +p99ckg7 +p9c4d0 +p9cnm +p9cxp9jk +p9dir +p9fz7hnw +p9njt +p9nqrqux +p9s1f2n6 +p9waq +p@anther +pB665486 +pC231274 +pD4RuI +pD837 +pEligro17 +pEpKoS +pH34r +pK62qs +pLukas +pR5Ty +pReVeD +pSzJa +pUSIK1 +pUz1nK +pWneD +pXtk7p +pa +pa020596 +pa0311 +pa19ib75 +pa33w0rd +pa33word +pa468485 +pa48ta52 +pa55w0rd +pa55w0rd! +pa55word +pa58q6 +pa6fique +pa6s7nt +pa818144 +pa84p0 +pa88word +pa8989pa +pa8ras +pa968 +pa99mela +paaihdlo +paard85 +paashaas +paasword +pabaiga +pabandyk +pabe1612 +pabianice77 +pablaso +pablito +pabliuch +pablo +pablo +pablo alvarez +pablo0x +pablo2706 +pablo650 +pablo73 +pabloam +pablocalderon +pablopablo +pac0rue +pac18bh +paca +pacameje +pacarlos +pacco +pace +pacefork +pach5317 +pacha30 +pachecoj +pacin +pack140 +package +packard +packard112 +packeis2005 +packer +packers2010 +packh321 +pacm07 +pacman01 +pacman13 +paco +paco +paco4318 +pacomp42 +pacotaco +pacotoy +pacquita +pacsil +pact123 +pactaf +pacuvio +pacweims +paczek10 +pad0 +pad1 +pad61 +pad8 +padat23 +padawan +padcap28 +padda96 +paddan95 +paddeln +paddi7 +paddie +padding10 +paddle900 +paddlemo +paddy +paddy +paddy1682 +padee +padgett92 +padla +padla9p +padlock10 +pado +padre +padres78 +padro basauri +padu +paebli +paetzold +paexbom1 +pafaq +pafel01 +pafi95 +pafnet +pagan13 +pagano +page +page +page0000 +page2011 +page3042 +page3737 +pageall +pagedown +pagina25 +pagoweb +pagui1827 +paguy59 +pahbokoh +pahit2 +pahrue +pai +pai10 +paiboom +paiboynj +paidbeginner +paidboard +paidup +paige +paige454 +paikese +pailak1 +pailin +pain3456 +pain7182 +paindemon +painkiller6 +painkiller808 +paint57 +paintball +paintball1 +paintball66 +paintbox +painter +painthorse +paintmob +paintpad +pairdodu +paireau +pairmore +pairoj +paiste +paiximo +paj039 +paja +pajace2 +pajamb +pajarito +pajero +pakaay +pakepake +paker +pakerpaker +pakers16 +pakete +pakimo +pakistan +pakistani619 +pakistanos +pakito +pakkun +paklira +pakmadrm +paknam +pakopina +pakorn20 +paktum +pakua +pakwach +pal +pal007 +pal100 +pal13m0 +palacios +paladin00 +paladin97 +paladine7 +paladine88 +paladino +paladino19 +palagret +palanga +palani +palanka3 +palant10 +palantes2212 +palantyr +palapala00 +palav05 +palawan3 +palawar +pale +palecek3005 +paleck +palegym +palenie1 +palermo +palermo1 +palexey +palhack +palidaj1 +palidhje +palim3rg +palinka14 +palino1982 +palito +pallas +pallazza +palle +palle2109 +pallina01 +pallino1994 +palliser5 +pallmall +pallone +pallop123 +palluau +pallyrocks +palm1990 +palma346 +palmacobain +palmboom1 +palme +palmen2005 +palmer +palmer3 +palmerdragon +palmieri +palmtree4 +palmyra2 +paloauto +paloma +palomar +palomino126 +palomita +palopa +palopo +palotes +palover +palpall +palpress +palsit1 +paltin +palu1988 +pam +pam1ela2 +pam20web +pam5z +pamag13 +pamaje90 +pame666 +pameb40 +pamel +pamela +pamela +pamela jayne +pamela jean +pamela sue +pamela006 +pamela23 +pamelyn +pamg9yvg +pami +paminger +pamir1 +pamon2001 +pampa9286 +pamuk13 +pamwac +pan10man +pan15916 +panadeiro +panadol +panagiotis2005 +panard +panasonic +panasx10 +pancake +pancakes +pancakes424 +panch1t0 +panchii +panchito +pancho +pancy +panda18 +panda2601 +panda89 +pandafury +pandas +pandelis +pandelol +pandereta +pandhawa +pandi +pandora +pandora942 +pandos30 +pandura90 +panel1 +panel789 +panelos +panflash +pangare +pangolin01 +pangpop +pangya +panic1# +panic329 +panki1803 +pankies +pankihoi +pankrator +panlijie +panmerea +panmolen +panna.g +pannal +pannazita +pannelap +pannemans +pannen +pannenkoek +panneucha +panno456 +pano +panos +panpan13 +panpirag +panselit +pansen +pansenhead +pantalla2010 +pantarei +pantat83 +pantek +panteleimon +pantelis +panter1 +pantera +pantera68 +panterarips +panterd3 +panterik +panther +panthers +panthers2 +panthers699 +pantocras +pantofka +pantofl5 +pantone1 +pants123 +pany996 +panzehr +panzer +panzing7 +pao han +pao jo +pao123 +pao4926 +paoanto +paodw +paola +paolis +paolitadr +paolo +paolo +paophan +paox89 +pap3000 +papa +papa02 +papa0604 +papa12 +papa1955 +papa66 +papa9090 +papacosco +papagaj +papageigismo +papaheck +papain +papajulieta +papakind +papalox +papamama +papanas +papapa +papapdam +paparazo +paparazzi +papas002 +papas246 +papatapa +papatya +papaver +papaya +papaya0815 +papazisi +pape2000 +papegaai1 +papegaai1992 +papele +papele01 +papelito +papenbrock1 +paper1212 +paperclip +paperlake +papi1169 +papi52 +papichou +papier +papik12 +papik89 +papillon183 +papimega +papino +papipapo +papipol +papirus1 +papito +papito01 +papo748 +papoputo +papos +papotera +papou +pappa4152 +pappadi3 +pappaw +pappdom +papper32 +pappnase +pappy1992 +paprika86 +papu3163 +papuga +papula +papygnol +paq3paq +paqjonin +paquerette +paquita +par +par014 +par01a +par0l4 +par4golf +parabol +parabola2010 +parabolas +paracetamol +paradiesgruen +paradimi +paradine +paradis +paradise +paradiselost1 +paradosso +paradoxical1 +paradoxlive +paraf204 +parafern +paragon2748 +paraiba +paralama +paralelepipedo +paralipo +parallel +paralogo +paramecium +paramon +paranoica1 +paranoid +paranoidhoho +paranoik +paraply07 +parapunz +parashift12345 +parasitos +parasolka1990 +parathan +parcan +parchant +pardubice23 +pardus +paredes +parekoto +parepare +pareze +parigo +parijs +parine321 +parinte2 +paris +paris +paris10 +paris1774 +paris6942 +paris8 +pariscope +parisfr +parisparis +parispg +parissg +parisviaje +paritet +parizod +parjon +park4536 +parker +parker23 +parkerb +parkes +parkiet2 +parking +parkinson4 +parklake +parklane +parkour +parkourforever +parkourvk +parks +parkway613 +parkwood1 +parkwood9 +parky +parley +parma +parmar +parmdope +parmizan +parnum +parody4100 +parol +parol12 +parol90 +parola +parola02 +parola1134 +parola16 +parola58 +parola69 +parola77 +parolata13 +parole +parolenav +parolik +paroliy +parolka +parolka4 +paroxx33 +paroxy33 +parr65 +parrot10 +parrot23 +parrot99 +parsec12 +parsonrussell +partal +partenavia +partisan755 +partizan +partizani +partner2912 +partout +party +party03 +party123 +party14l +partyhat +partyka1 +partyline +partyon +partywipe +parucilla +parulekar +parus +parvanehs +parvez12 +parvin +parviz +pas1250 +pas2705 +pas3cal +pasa1153 +pasa1235 +pasamd80 +pasaroco +pasawicz +pasbien +pascal +pascal +pascal1 +pascal10 +pascal25 +pascal64 +pascale +pascha +pascha! +pascual +pascual garcia +pascw101 +pasgros +pash1234 +pasha +pashmina24 +pashteta +pasi123 +pasion5711 +pasiunia +pasja1 +paska +paska123 +paskal18 +pasmal +pasmik85 +pasmo +paso2001 +pasokka +pasone +pasonnic +pasot +paspebo5 +pasq233 +pasquael +pasquale +pasqualkevin +pass +pass! +pass0 +pass0707 +pass1 +pass1092 +pass11 +pass1111 +pass12 +pass123 +pass1231 +pass1234 +pass1256 +pass1301 +pass1979 +pass2 +pass2000 +pass2005 +pass2046 +pass2266 +pass235f +pass2468 +pass2479 +pass2529 +pass2727 +pass2web +pass321 +pass3811 +pass4263 +pass4513 +pass4aja +pass4dev +pass759 +pass8164 +pass8804 +pass@word1 +passanx +passat +passat18 +passat2430 +passat25 +passat52 +passau01 +passbouw +passcard13 +passciao +passcode +passcw +passdani +passdog +passdog7 +passdrh +passe +passe12 +passe34 +passed2me +passeepassee +passenger +passer +passi0n +passion +passipas +passive +passive1200 +passjjram +passjw1 +passlg +passme +passme2 +passmepal +passmik +passmod +passone +passp0rt +passpass +passpb +passphrase +passport +passprov +passsi +passss +passsword9 +passthing +passtime +passuord +passvwar +passw +passw0rd +passwd +passwd1 +password +password +password! +password1 +password1029 +password2 +password2009 +password2010 +password4 +password5 +password7727 +password8 +passwordbin +passwordcodes +passworddz +passworded +passwords +passwort +passwort. +passwort006 +passwort1 +passwort1103 +passwort31 +passwort9402 +passwrd +passwurd +passx +passzone +past46 +pasta +pasted +pastelli13 +pastille +pastmaja +pastor +pastorius +pastrulo +paswoord +pasword47 +pasztet72 +pat +pat123 +pat1453 +pat2003 +pat3 +pat3004 +pat51890 +pat948pa +patada +pataja +pataleta +patalini +patan101 +pataplop +patapouf +pataras +patat +patata +patate +patate87 +patates +patatos +patatra7 +patavina +patbra01 +patch +patch1969 +patch1989 +patch2518 +patchab3 +patcheen +patches +patches13 +patchwork1 +pate123 +pate78 +pateel333 +patel09 +patencik +patente +paternus14 +pati +patience +patience +patillo3 +patiparn +patirvik +patison +patito +patjudes +patkoe +patleev +patnable +pato1234 +patogh53 +patol +patolin +patoloco +patoloco80 +patologia +patolyn +patompong +pator +patoune +patr123 +patr1n +patranya +patras +patrially +patric +patrica +patrice +patrice +patricia +patricia +patricia ann +patricia lee +patricia86 +patricio +patrick +patrick +patrick grampy +patrick poivre +patrick1 +patrick1409 +patrick2626 +patrick62 +patrickbyrne +patriknilsson +patriot +patriotorange +patriots +patrizia +patroy33 +patrut87 +patryk +patryk08 +patryk2006 +patryk92 +patsan1 +patsen12 +patsku28 +patsy +patsy lee +patsy ruth +patsy678 +patt +patt0918 +pattaya +pattee +pattee1337 +pattes +patti +patti321 +patti700 +pattie +pattini +pattipussy +pattismith +patton#1 +patton8001 +patty +patty ann +patty lou +patty39 +pattye +patupatu +patuyo +patvico +patzi54 +pau002 +paublo +pauka55 +paul +paul +paul boensch +paul david +paul edwin +paul getty +paul keller +paul lawrence +paul12 +paul135 +paul1952 +paul1999 +paul1e1 +paul2108 +paul33 +paul850 +paul90 +paul909 +paula +paula030 +paulaanton +paulaner68 +paulap +paulasue +paulatherton +paulazed +paulchen +pauldi85 +paule +paulette +pauli001 +pauli675 +paulina +paulinaq +pauline +pauline +paulinka +paulino0219 +paulip +paulista +paulito7 +paulius +paulk24 +paulle +paulo +paulo +paulo cesar +paulo23 +paultref +paulus1127 +paulusmaximus +paulysure +paulyta +paupau +pauper3 +paurakel +pauselcd +pautab21 +pavefrat +pavel +pavel01 +pavelino +pavelk +pavement +pavetsu +pavic +pavilion +pavinverter +pavle +pavli090 +pavlinka +pavllo90 +pavtam07 +pavtam08 +pavv44 +pawcio1 +pawel +pawel +pawel121 +pawel123456789 +pawel80d +pawelek +pawelek1 +pawelm +pawelw1 +paweu +pawian +pawlodar +pawlowski3 +pawoot +pawprint +pawsafiq +pawspaws +pawus +pax +paxao +paxar +paxdp4 +paxton +pay +payable +paycom99 +payge512 +payless2 +payload9 +payne +payne123 +paynera +payton8099 +paz1back +paz219 +pazar453 +pazarac +pazarlee +pazcareb +pazida +pazis5263 +pazmir +paznecht +pazutoga +pazuzu +pazuzu68 +pazyamor +pazzwd1 +pb042091 +pb123123 +pb12345 +pb1602nj +pb6022 +pb88061 +pbMf50 +pbalum +pbdx3w3 +pbfan88 +pbipc +pbj1234 +pbjh77 +pbjk264 +pbmaxx +pbn0afg +pbn123 +pbo3x +pbsrea +pbtai +pbteam +pbuncamv +pbv4n +pbv51 +pbwenpe3 +pbyjdbq +pbyjy +pc071146 +pc123456 +pc1770p +pc2002cp +pc2007 +pc264017 +pc2hd91 +pc2rxwk9 +pc500963 +pc8bd4su +pc8us023 +pc9us8cd +pcadam +pcadsis +pcbags +pcberza +pcbinh +pcbk9 +pcbnr99 +pcbza +pcc033 +pccom02 +pcd3man0 +pcdent +pcdood +pcemk +pcgamer +pcgjmuat +pcgl2g +pcgroup +pchspchs +pcinsel +pcj907 +pcjanna +pckiller +pckopat +pclebo +pcm001 +pcm123456 +pcmaster +pcmcia +pcml4 +pcmpcm +pcnico +pcnitro +pcom666 +pcovg8xyy +pcp136 +pcp3act3 +pcp60 +pcpacco +pcpc123 +pcpcpc +pcplogin +pcpxy +pcqwe34 +pcsoft +pcss123 +pcstde +pcsv8q5e +pctmrc +pcvgboai +pcw123 +pcxgames +pczg44cs +pczuqy +pczyxfvd +pd2002 +pd2s5mfd +pd6xz29f +pd83xlo +pdc2007 +pdcr6243 +pdf911 +pdj1961 +pdj8k +pdkj5 +pdl123 +pdpd +pdpdpdpd +pds505 +pdvadm +pdx1c +pdxowned +pdxts +pdyluca +pe +pe0ple +pe225ter +pe50th +pe9s7 +peYs6 +pea42G +pea69rl +peabody +peac209 +peace +peace07 +peace3 +peacemaker +peacemaker01 +peaceman +peach12 +peaches +peaches +peaches1025 +peachey13 +peachie1 +peacli +peacock +peacock9914 +peajay2 +peanola +peanut +peanut2010 +peanut2t +peanut76 +peanutbutter +peanutz0 +peaoozy4 +peapeab +pearice1 +pearkiwi +pearl +pearl33 +pearl79 +pearr71 +peas754 +peau12 +peavey89 +pebbles +pebruari +pec274 +pecaodet +pecha2003 +pechocha +pechulin +peck90 +pecker +pecola +pecvon +peczak22 +ped1reng +ped43v91 +pedagogo +pedal +pedali16 +pedalpedal1 +pedepea +peder +peder123 +pederast +pedersen3656 +pedersen89 +pedett3 +pedi66 +pedice +pedikas +pedja +pedjam +pedosan +pedpol23 +pedra0 +pedrao +pedrinho80 +pedrito +pedrito1 +pedro +pedro +pedro diez +pedro paulo +pedro002 +pedro07 +pedro1 +pedro180 +pedro232 +pedro77 +pedro789 +pedrocecilia +pedroso +pee +pee146 +pee207 +peee5 +peekaboo +peelandy +peenis +peentje1 +peepee +peepee76 +peeper720 +peepooh +peer +peer1955 +peer1968 +peer33 +peerke45 +peerliebe +peeruenn +peesu10 +peewee +peg +peg1gar1 +pegah123456 +pegaso82 +pegasus +pegasus1122 +pegasus1989 +pegasus2725 +pegasuss +pegaz01 +pegggg +peggotty +peggt +peggy +peggy +peggy ann +peggy lee +peggy-ann +peggybaumann +peggyst +peghater +pegi +pegleg40 +pegnx80v +pegyhost2009 +pehassing +pehelwan +peichel1966 +peiki +peim212 +peimia +peixin +peja123 +pejku643 +pejmpejm +pekas +peke1596 +peki1908 +pekimilka +pelado +pelayo1989 +pele2003 +pelenka +peli65 +pelicans +pelikanuhr +pelin +pella2005 +pelle007 +pelle1996 +pellegrino +pellemies +pellemus +pelocho +pelocuk +pelomino +pelotudo +pelouche +pelucheck +pelucin +pelusita8 +peluz88 +pem4nch4 +pem91pup +pemarien +pemenang +pemibec +pempa81 +pemzovak +penboy +penchao +pencil +pencil1 +pencil13 +pencil48 +pencil99 +pencouch93 +pendejo +pendel2004 +pendergast12 +pendik +pendoor4 +pendulum2 +pene +penelope +penelope666 +penero46 +penfas0k +penfasok +penge0804 +penguin +penguins7849 +peni24 +penilewart +penina77 +penis +penis12 +penispenis +penissosse +penitencia82 +penksa81 +penn +penn37js +penner +penner01 +pennkim +pennstate +penny +penny986 +pennyowen +pennyparker +penor +penpen77 +penrice87 +penrod +penryjdp +penta5 +pentagram +pentagrama1 +pentax001 +pentelho +penteli9 +penthouse +penti13 +pentium +pentium1 +pentium2 +pentiun4 +pentragon +penwater38 +peopeo +people +peoplee99 +peopletv +pep +pepa +pepa25 +pepach88 +pepanek +pepanick +pepbiqoj +pepe +pepe +pepe03 +pepe1234 +pepe169 +pepe1lo +pepe2006 +pepe2015 +pepe2019 +pepe90pq +pepechi +pepeka +pepelfc +pepeoso +pepepe +peperino1 +peperoni +pepi +pepi1960 +pepi2000 +pepinillus +pepino +pepita +pepito +pepito!! +pepito43 +pepo +peponA +pepone +peppar +peppe1983 +peppeddu +pepper +pepper +pepper1 +pepper1985 +pepper25 +pepper81 +pepperme +peppermint +pepperoni16 +pepperpot +peppesba +peppie86 +peppino +peppino +peppo87 +peppy009 +pepsi +pepsi1 +pepsi5128 +pepsi91 +pepsiman +pepsimax +pepsirun +pepsis1337 +pepsodent1 +pepspeps +pepsys +pequenac +per +per9g74 +peragine1 +perales11 +peran1987 +perbekol +perbjarne +percito +percival +percy +percy7 +perdi +perdire +perdita +pere5114 +perec111 +perelka5 +pereve2 +perez +perez0s0 +perfect +perfect1 +perfectd +perfekt222 +perfetto +perform1 +performance +pergal +pergale +pergamo +perghh +pergola1 +peri51 +perica +perica +perico +pericoco +perike +perini +periode1 +perito +perk +perkele +perkeles +perker22 +perki67 +perkiomaki +perl007 +perla +perlaperla +perlaso1 +perlen00 +perlen2010 +perlenamira +perlenfee +perlenkoenig +perlenmaus +perlenmink +perlenpaula +perlite +permeti +permi55ion +pern7e5 +pernala0 +pernell +pernilla +pernille +pero +perolas +perolsson +perot94 +perpete1 +perra234 +perrette +perrier +perro +perro2038 +perro69 +perrox +perrucha +perry +perry676 +perryman87 +perschen +perseides +perses123 +perseus1 +persev +pershing +persik +persiles +persis +persius1993 +perso +persofyl +personal1 +persze +pert +perto27s +pertti +pertti12 +peru4n +perujin +perumov +perunperun +perverso +pes +pes01abc +pes1s +pescador123 +pescara +peschetz +peseweng +peski91 +pesoto123 +pest +pest1234 +pest5924 +pestelle38 +pet123 +pet1509 +pet15091 +pet456r +peta +petadeat +petalo12 +petalos1 +petanque +petar +petar +petardo +petarfx +petasse +petchara +petco1768 +pete +pete0408 +pete1978 +pete1992 +pete312 +peteR9 +petecane +petelica +peteno +peter +peter +peter hugo +peter lind +peter michael +peter-hugo +peter1 +peter108 +peter1958 +peter21 +peter3810 +peter420 +peterPan +peterb84 +petercham +petercxc +peterd1028 +peterek +peterete +petergudrun +peterh +peteris +peterle7 +petermm +peternj +petero2 +peterpan +peterpantsd +petersen +petersilie +petervg +petervinter +peterweb +petey1 +petged +petgulac +pethelli +peti93 +petibout +petike +petio +petipe +petit +petite gaby +petitmec +petko33 +petman27 +petotto +petr +petr007 +petr59 +petra +petra +petra maria +petra0306 +petra1 +petra33 +petrafi +petrahummel +petran +petrawilli +petre +petres +petrik +petrium8 +petrograd +petronas +petroudj +petrume +petrus +petruslo +petrwildt +petshopboys +petstpet +petteri95 +petterson +pettirosso +petty23 +petula +peturefe +petzit +peu609 +peu6c +peuade +peudriver +pew411 +pewe12 +pewfwsv +pewp55 +pexpb +peyek +peyk836 +peytondrew +pezer +pezho407 +pezwoxus +pezzo007 +pf221cc +pf244100 +pf40dt +pf706akz +pfalzd3 +pfanner +pfavullo +pfeffer +pfeifendeckel +pfeilar +pfeilgold +pferd13 +pfesas91 +pff123 +pfg08 +pfirsich +pfirst07 +pfisti +pflg8909 +pflhfkb +pflowbof +pfodbold +pforh111 +pfqxbr +pfrhsnj +pftypc +pfujhjlyjdf +pfunk887 +pfxoops +pfz92 +pfzkzh13 +pg +pg0dbout +pg1212 +pg3qm64q +pg576666 +pg7050 +pg966 +pgfrvs +pgjlbgay +pgjunior +pgkpgk +pgkzi +pgmc16mn +pgnuw +pgomez +pgrgc8 +pgsgsf +pgt4422 +pgterry +pgti205 +pgu7kv3a +pgup99 +pgur2lox +pgw74 +pgwind +pgwzs +pgz65 +pgzy6 +ph03n1 +ph03n1x +ph081462 +ph0enix +ph141888 +ph146751 +ph17m04 +ph19wy89 +ph1egm +ph1l1p5 +ph1lt0ng +ph24296 +ph33m8 +ph33r +ph34rag3 +ph34rb0t +ph3b35 +ph46za2f +ph4tead +ph5h2o +ph6h72g2 +ph8eu9md +ph8v +ph924008 +phaeton89 +phallanx2 +pham +pham phuoc +phamtvs +phantasm1c +phanter +phantom +phaola +phaplt +phara10 +pharao +pharbil +pharrell +phaseinit +phasenschnitt +phasetwo +phasma201 +phasmo +phat3117 +phat63 +phatgiao +phatia +phay93 +phazedd +phcphp +pheasant +phebeh +phebose +phedon +pheller +phelsum +phenix86 +phenny11 +phenoms22 +pheokl +pheung +phexe +phhnj49p +phi4425 +phibeta +phibie87 +phil +phil000 +phil121 +phil1912 +phil21 +phil2110 +phil3439 +phil413 +phil532 +phil5622 +phil65 +phil8469 +phil99 +philbert1975 +phililp +philine +philip +philip +philip martin +philipe +philipo +philipp +philipp1 +philipp1109 +philippa +philippe +philippe +philippe del +philips +philipsx3 +philkauf +phill +phillip +phillip +phillip martin +phillipa +phillipe +phillipestep +phillippe +phillips +phillis +phillut +philly1980 +philmore50 +philo +philo +philosophe +philssuck +philwelsh +phinae02 +phineaus +phiphi +phirmene +phischuk +phise@ +phiskee +phl2442 +phlp3450 +phm7cq +phmpss5 +phnncih7 +pho3n1x +pho51247 +phocea +phoebe +phoebee +phoebus +phoenix +phoenix#5 +phoenix0 +phoenix378 +phoenix68 +phoenix7 +phoenix91 +phoenix914 +phoeniy +phone +phone2395 +phong +phonghan +phongon +phongvh +phooey01 +photini +photo +photo12 +photo262 +photo2k6 +photodog +photoses +photoshop +photov2 +phoung +php +php0726 +php098 +php120 +php2nuke +php4ever +php4life +phpbb1 +phpbbcom +phpbtatm +phpcms +phpdean +phphph +phpibk +phpillon +phpkilla +phpnuke +phpnuke8 +phprule +phprulez +phpss +phpvar +phpwcms +phpwebsite +phr33d0m +phrazit +phre4k +phreak1368 +phreeze +phrozen +phshecag +phstiger +phuc +phuchang +phucket +phucking +phuduoi +phuduvn +phuk23 +phuocdai +phx6v3ww +phxadmin +phy8abab +phycho +phyh9p +phylis +phyliss +phyllis +phyllo +phyre123 +phz8ek5f +phzzhp +pi +pi110 +pi23qqte +pi2c5oek +pi314151 +pi314159 +pi314pi3 +pi31rdi +pi35pmfd +pi4agata +pi4k2ffe +pi51re +pi667 +pi7ka +pia +pia +pia986 +piaggio +piajana +pialack +pianicello +piano6103 +pianos +piathip +pibla +pic0se11 +pic46qos +pica +picabo1d +picaboo2 +picanick +picard +picard07 +picard6 +picasita +picasso +picasso123 +picasso8 +picboy +picci2007 +piccolo1 +piccolo3 +piccolooo +picestan +picgirl +pichal +pichel22 +pichita +pichula05 +picia92 +picike2 +picivivi +pick1056 +pick1426 +pick67 +pickaxe242 +pickit43 +pickle +pickle101 +pickles +pickles2 +picko92 +picnet +pico +pico64 +picojet +picori +picotto +picovina +picpic +picpus1 +picsou +picspy +pictregy +picture +pictures +picus +pida1234 +pidar741 +pidaraz +piddlezen +pidgeon88 +pidjey +pie +pieboy69 +pieces3 +piechna +pied +piedmont1 +pieforlife +pielman +pielsticker +pieman +pieniazek +piepatty +piepie +pieppiep +piepshow +pier +pier luigi +piera degli +pierce +pierced +piere +piere-ange +pierniki +piero +pieronews +pierre +pierre +pierre richard +pierre-loup +pierre25 +pierre9119 +pierrette +pierrick +pierrino +pierrobi +piers +piersing +pies +pies111 +pies666 +piesek +piesek21 +pieshop57 +piet +pieter +pieter +pieter0202 +pietime +pietje +pietr +pietrino +pietro +pietrucha15 +pietruck +pif49jok +pig +pig1495 +pigapoo +pigeon10 +piggeldy +piggley +piggy100 +pigi3043 +piglet +pigmavr4 +pignans83 +pignut +pigoitas +pigoumou +pigpics +pigpig7934 +pigreca +pigs1750 +pigsgohome +pigswill +pihasojy +piheaded +piis3141 +piita +piiv1707 +piixii +pijin +pijpen +pijpslet +pika82 +pikachU2 +pikachou +pikachu +pikachu1 +pikachu2 +pikachu2590 +pikachupik +pikaki8627 +pikamoon +pikapika +pikapoke +pikatel +pikbauer +pikelstr +pikeur102 +pikeyp +piki12 +pikiw +pikizzz +pikka +pikkia +pikkon +piknik123 +piko69 +pikopiko +piksna85 +piktas +pikulive +pilar +pilar +pilat +pilealle +pili0323 +pili2003 +pilietis +pilifans +pilifire +piligrim +pilino +piljmb +pillajo +pillar08 +pillboxed1 +pilldriver +pille +pille85 +piller +pillimc4 +pillow +pills999 +pilones +pilopilo +pilot123 +pilot2002 +pilota +pilote +pilote77 +piloter +pilotka +pilotman1 +pilou12 +pilsfreund +pilsine +pilsner +pilsner4 +piltdown +pilu87 +pilum +pim +pimboli +pimmel +pimp +pimp1234 +pimp3k +pimpdave +pimpf2000 +pimpi +pimpike +pimpim +pimpin +pimpin93 +pimpis +pimplude +pimpn247 +pimpon1 +pimpster987 +pims82 +pin1316 +pin1dog +pin5767 +pin6549 +pin9030 +pin9923 +pina +pina1 +pina325 +pinadela +pinarbaby +pinarnur +pinatesi +pinball +pincel +pinche01 +pinczery3 +pine +pineapple +pinetree +pineview06 +ping +ping207 +pingastt +pinger12345 +pingeye3 +pinglove +pingmac +pingos92 +pingplus +pingpong +pingpong09 +pingree +pingu434 +pingu444 +pingu5678 +pingui +pinguin1981 +pinguin53 +pinguine +pinguine1 +pinguins +pinhead +pinhead1992 +pinheiro1 +pinigai +pinioko +pink +pink103 +pink1967 +pinkas +pinkgold +pinki +pinki1233 +pinki1986 +pinkie +pinkpanther +pinktabard +pinky +pinky72 +pinkywiz +pino +pinocchio +pinopino +pinordb +pinpolly +pinscher +pinsel +pintas +pinte70 +pintela +pinto +pinto666 +pintos +pinus456 +pinyen0512 +pinyo +piol +piola +piolin +piolina +pion33r +pioneer +pioneerdog +pioneeriz +piopio5378 +piotek12 +piotoc +piotr +piotr +piotr4167 +piotr80 +piotr909 +piotr99 +piotrek1 +piotrek75 +piotrk +pioupiou +pioupipi +pip +pip1988 +pip1ngme +pipas3777 +pipe0910 +pipe2110 +pipepipe +piper +piper1983 +pipercub +pipes +pipicaca +pipieddy +pipilica +pipin12345 +pipio72 +pipiras +pipiripao +pipline +piplou01 +pipo2866 +pipo4289 +pipo994 +pipoland +pipoleta +pipona +pipop +pipotin +pipou +pipoxe +pippa +pippe +pippeli +pippi +pippo +pippo00 +pippo100 +pippo12 +pippo1994 +pippo85 +pippof +pippone +pipponet +pippozyx +pippozzo +pippuri8 +pippygirl +piquier1 +pir11lod +piraba +piramide +pirania +pirao +pirata74 +piratage +piratas +piratato +pirate +pirate50 +pirategood +pirates +pirateur +piratiko +pirh9458 +pirillo +pirita123 +pirito73 +piroku4 +piroozi +piros3 +piroshka +piroska +pirouli +pirtek +pirulin1 +pirumpon +pisamai +pisan +piscolas +pisdec19 +pisella +pishposh231 +pishroad +pisica +pisicel +pisicmic +pisit +piskopat +pisopiso +pispot +piss0r +pissant +pissant12 +pisscup +pisser +pisshole12 +pissoff +pistache +pistacho +pistillo +pistol420 +pistolino +piszczyk +pit123 +pit4560 +pita +pitbul +pitbull +pitbull1 +pitbulle +piter +piter83 +pithon +pitimbu +pitimini1956 +pitiyahu +pitlaika +pitorian +pitoufio +pitpalac +pitrus +pitt +pittbull +pitter13 +pittii +pittlk +pittmail +pittooth +pitty +pitufa +pitunia +pituxa +pitycu +pityhoop +piuloi +piupiu +piupiu92 +pius12 +pivacek101 +pivilloo +pivots10 +pivt7 +piw2y +piwipiwi +piwo +piwosz +piwugaby +pix0108 +pix265 +pixel79 +pixeli +pixelman +pixels +pixie500 +pixies +pixl +pixmaamilo +pixorro3 +piya +piyamatr +piyamatyr +piyanoot +piyht +piz +piz0da59 +pizan +pizani uno +pizda +pizda48 +pizdec +pizdez +pizdjec +pizz010 +pizza +pizza111 +pizza123 +pizza69 +pizza917 +pizzadox +pizzdezz +pizzulik +pizzy21 +pj101992 +pj1124 +pj2 +pj2698 +pj38q0v +pj3m42d +pj45693 +pj70219 +pjaj3841 +pjd9k +pjhhkg +pjj1968 +pjjnora +pjl4h2vu +pjlbrt +pjoedel +pjoego2x +pjok4me +pjokken +pjp4rvrz +pjq03r1 +pjque +pjra48cd +pjrz8 +pjsww +pjth2 +pjun8bgo +pjuske +pjv144 +pjymscw +pk012 +pk120774 +pk180876 +pk316pk +pk4pros +pk4tkp +pk5t8za +pkagv6fb +pkgolfcl +pkhase +pkingpking +pkk111 +pkkhpg +pkkolp +pklelias +pkli4jew +pkling +pkmainz +pkosa1 +pkr34020 +pkreddy +pks000ft +pkuwvw4y +pkxrex6 +pkyy5g2 +pkz1807 +pl +pl0op187 +pl0p7 +pl11pl +pl12ak13 +pl140190 +pl181271 +pl26123 +pl35ev50 +pl3yer +pl454kom +pl4yd4t3 +pl5462ab +pl606377 +pl6116ph +pl74h2hz +pl8jb54 +plXmen +place4226 +placebo +placek +placek890 +plachutta +placido +placton +plagen99 +plague20 +plaintext +plake9 +plamen +plamena +plamospa +plana92 +planescape +planet +planeta2001 +planeten123 +planets +planieux +planitz63 +planner +plano1182 +planoid +plant87 +planta2809 +planteon +plantss +plapla +plaqr14 +plarm6007 +plasma +plasmon +plassex +plast1c +plat12 +plata +platero9 +platin01 +platinum +platipus +platon +platon07 +platoon +platypus +plaud2310 +plaukai +play +play1980 +play4day +playa +playa123 +playax +playboy +playboy77 +playboya +playd0h +playdoll +playdown +player +player1 +player5189 +player6 +player88 +playerhatter +playerma +players +playground +playmade +playmaker +playmobil5 +playou +playplay +playstation +playstation2 +playsurf +playthegame +plaza300 +plaza84 +plazland +ple8n +please +please222 +pleasure66 +pledger +pleeck77 +pleffa +plejada69 +pleksne +plenilci +plesk +plet4504 +pletosu +pleuni +plexeuro +plexiglas +plexo2004 +plexou +plextor +pleymo +plfutura +plg2dm5d +pli896 +plicha9 +plicki +plihp9 +plijy1 +plikiboo +plikom +pliok14 +plioska +plippy1 +plitzko +pljugi +plkncj +plm098 +plm44 +plnycl +plo2por +plogil +ploja123 +plok3d +plokij +plokplok +plokplok3 +plomme +plomoplomo +plompom +plomy1 +plop +plop0201 +plop1263 +plopadc +plopinou +plopl +ploplo66 +plopp +plopper +plosken +plouc +plover +plowdog +ployploy1 +plpl9798 +pls1234 +plsm168 +plswork +plt5338 +pluems +pluesel +plug4fun +plugfire +pluisje1 +plum +plum1eria +plumber +plumbum707 +plumbum9 +plumlh +plur2c2m +pluricom +plus12 +plusdrei +plusgame +pluskis +pluslig +plusnet +plustwo +pluto999 +pluton +plutone +plutonium +plutzi +pluznica +plx4000k +plxplx +pm +pm02p013 +pm0543 +pm1-51 +pm1012 +pm11ioz5 +pm123456 +pm123456 +pm1933 +pm2000 +pm2255 +pm2345 +pm23511 +pm2355 +pm322pm +pm340203 +pm34f +pm3762 +pm3787 +pm3ellil +pm4858 +pm4all +pm5126 +pm54149 +pm6455 +pm6488 +pm72ah71 +pm89dp +pmac1905 +pmach126 +pmail0420 +pmart90 +pmc09 +pmdb10 +pmdreher +pmet01 +pmgvalwk +pmh12011 +pmi7vq72 +pmlj2713 +pmlokj +pmm127210 +pmoc987 +pmol2151 +pmp17w +pmpclaan +pms2008 +pmsa09 +pmsa3 +pmsm7961 +pmtrung +pmutoto +pmxsidnu +pmyx5 +pn2183 +pn28ybw3 +pnbcrq5h +pndbf +pnelope +png386xp +pnijps2l +pnkllr +pnsg +pnt +pntadmin +pntlyd +pntnc444 +pnut4283 +pnwqb2as +pnwxdkdh +pnxgld +pnzsv +po +po09iu87 +po0po0 +po1sson +po21wq +po242733 +po3413co +po3oktgt +po4dj5 +po5ez9 +po5wer6 +po8yosa +po901029 +poachr1 +poas123 +pob6atjl +pob944 +pobert +pobert +poc +pochilam +pochy +pociag1 +pocius +poco98 +pocobor1 +pocossi +poczta115 +poczta45 +pod2pora +podbize +poddington14 +poderen +podilato +podolcio +podpod3 +podrocks +poduszka +podzombie +poe0018b +poecilia +poekie +poep +poepert +poepje +poepke1 +poeple21 +poer +poes +poes01 +poespoes +poet46 +poetry714 +poetwo +poewyzyw +pof38gep +poffare +pofibre +pogiako1 +pogies14 +pogo007 +pogo24 +pogo56 +pogo818 +pogvek22 +pohl1977 +pohmiel +pohoda55555 +pohuj +poi +poi098 +poi123 +poi654 +poiana27 +poiedf +poiji +poika1987 +poikik +poikjh +poil69 +poilu +poilus +poimlk +pointer99 +pointofview +poipoi +poiqsd +poirel +poirier911 +poisened +poisive +poison1 +poison147 +poisson4 +poiu13 +poiu666 +poiu6789 +poiul7 +poiuqwer +poiuy +poiuy100 +poiuyt +poiuytre +poiuytrew1q +poiuz +poiuzt7 +pojejo +pojetr +pojince1 +pojojollo +pok3r +pok41 +poke +poke123 +pokecom +pokefag +pokehahn +pokemann +pokemaul +pokemon +pokemon1 +pokemon1264 +pokemon6 +pokemondigimon +pokemonman +poker342 +poker541 +pokeraider +pokerface1990 +pokermon +pokesc +pokesmot +pokey +pokeykim +pokie665 +pokisch +pokkaj3 +pokkers666 +pokqws1 +pokrop +pokudok +pol123 +pol1904 +pol217fi +pol45pl2 +polM16 +pola +polaco +polak1994 +polak2 +polaka214 +polake +poland +poland10 +poland122 +polanik9 +polar123 +polar27 +polarbear +polarbear41 +polarcup +polarice +polariod +polarn874 +polarn91 +polas666 +polat +polat123 +polatcem +polcom +polcsy +poldek +poldek55 +poldie +poldino +poldison +poldone +polen +polen39 +polenko +poleon +polewa12 +polgara +polgara24 +poli94 +polibuda1988 +police +police02 +police1 +police3 +police77 +policeplatform +policf1 +polich +polichco +policja12 +polidoto +poliete2 +poliglota1 +poliilop +poliisi +polimedi +polini +polip3 +polirulz +polis +polisen195 +polisi09 +polita64 +politik36 +polito +politsei +polizei10 +polizei695 +polj4m +polka +polka13 +polki +polki00 +polkipolki4 +polkmn +polkst +poll +poll0000 +pollari123 +polledit +polleke +pollen15 +poller1a +pollipod +pollito +pollitos +pollki15 +pollo +pollo123 +pollogio +pollop +pollow +polluted666 +pollux +pollux83 +pollux99 +polly +polly ann +polly002 +polly1 +pollying1 +pollykatz +polmili +polo +polo1234 +polo16v +polo33 +polo330 +polo356 +polo5678 +polo8618 +polo90 +polo998 +polo9n +polock34 +polof123 +pologti +poloklop +polommmi +polonaises +polonica +polopolo +polotie +polowanie1973 +polpoio9 +polpol11 +polpol17 +polpopolpo +polska +polska11 +polska12 +polska2 +polska45 +polska69 +polska99 +polster19 +polt07 +poltak +poludan +polupop +polux887 +polyak99 +polyanjou +polyard1 +polygraph +polyl1na +polynice +pom56av +pomata1970 +pomega +pomelo +pomeroy +pomiano +pomidorowa123 +pomiot24 +pomme +pomme12 +pomme5 +pommelsterra +pommes789 +pommesmayo +pomosien +pompeu3016 +pompie95 +pompiere +pompypompy +ponala +ponas +ponce123 +ponch +ponchi +ponder +pondus19 +pondus93 +ponfarr +ponfe +pong0991 +pongau +pongpong +poniedzialek1 +ponleu +ponpon +pons2332 +pont2840 +pontaeri +pontelo +ponterosa +pontiac1 +pontida +pony7831 +poo +poo +poo123 +poo29 +poobag +pooboy +pooch +poodle86 +poodles +poof00 +pooface +poofie +poofy +pooh +poohbear +poohbear1 +pook123 +pooker +pookie +pookie. +pookies1964 +pookles +pooklook +pool12 +poolgod +poom +pooman +poon01 +pooned +poonk11 +poop +poop10 +poop1209 +poop123 +poop2 +poop2oo4 +poop4poop +poop6439 +poopens +pooper +poophead +poopie1 +poopies +poopin +poopins +poopis +poopknot +pooplol +poopoo +poopoo1 +poopoosandwich +pooppoop +poopship +poopy +poopy123 +poopydoo +poopye +poopym +poopynou +poor0629 +poor0us +poostick +pootamal +pootie +pootle9842 +pootsop +pooville +poox1t +pop +pop1001 +pop263 +pop28kem +pop55 +pop70492 +popart007 +popartaru +popase +popbob +popcorn +popcorn5 +popcornx +pope +pope1974 +poperz0r +popes01 +popeye +popeye72 +popeye7985 +popeyou +popfree +popka +poplo1 +poplockk +popmusic +popo +popo0815 +popo1337 +popo200 +popo349 +popoclub +popocoro +popoff +popoficken +popohanf +popol +popolk +popoll +poponaim +popop +popopo +popopo123 +popopopo +poposex +popota10 +popov1 +popova +poppadom +poppen +poppen24 +popper98 +popper99 +poppett1 +poppin999 +poppins1 +poppins12 +poppler123 +poppop +poppy +poppy01 +poppy268 +poppyhead +poppypk +poprigayac +poprocks +pops1219 +pops25 +popscreens +popsi +popsikas +popsqualle +poptart +poptarts2 +poptrash +popup000 +popup777 +poquonok +poqw0912 +por31s +pora7822 +porada1 +porbeagle +porca000 +porcezov +porcodio +porcozio +pore77mx +poreoo +porfiria +poring +porivocare +porjus +pork12 +porkchop +porker +porkodio +porlie6 +porlock88 +porn +pornishot +porno +porno123 +pornoadsense +pornokuh +pornolover +pornoporno +pornostar +pornstar +pornstar878 +poro90 +porpor +porque09 +porr +porra +porro712 +porsas +porsche +porsche4 +porscheee +port7070 +porta90 +portable +portable. +portadown +portal +portal4321 +portalbomb +portales +porteb00 +porter +porter +portia +porticim +portland94 +portnoy +portnoy07 +porto +porto123 +portugal +portus +portwale +pos3aune +posage +posap +posaune1 +poseidon7 +poserko +poshka +posiblei +posika00 +posique +position +positivity +pospora4 +pospos +posset +possiot5 +post +post1ac +post4132 +posta321 +postal +postalservice +postboy +posten +posten32 +poster +posteule +postfach +postfach8087 +postgres +postie8264 +postit +postit75 +postkoop +postler +postler2002 +postmaster +postmod +postplat +postre123 +posttrauma +postwagen99 +posweno +pot2091 +potassium1 +potato +potatosalad +potcar +potchara +potent767 +potok514 +potomake +potosi08 +potpot +potran87 +potravka +potropaz +potsdam +potstirrer +potter +potter2231 +potter25 +potter4113 +potter865 +pottgbbr +pottgtes +potusss +pouarf +poubelle +poucinet +pouet +poukram +poul +poulain +poulou04 +poulsen100 +poulydor +poupette +poupic +poupouet +poupoune +pour +pourquoi +poussin21 +poussy +pouyou +pov252 +povadok +povfci9 +povijest1 +pow57pk +powa01 +powa235 +powaaa38 +powadmin +powalola +powalony +powblock +powder#1 +powell +powell +powell1 +power +power00 +power01 +power028 +power1 +power123 +power21 +power2705 +power447 +power666 +power820 +power8k +powerade88 +powerbar +powerc +powerdog1 +powerdvd +poweredge +powerful +powerhit +powerjulian +powerke +powerking +powerlk +powerman +powermax24 +powernet17 +powerof8 +poweron +powerpcx +powerpit +powerplay +powerplay1 +powerplay2 +powerr +powerr2 +powerround +powers +powers +powers1054 +powers54 +powershot620 +powerslave98 +powerstroke +poweruser +poweruser1970 +powmia13 +powwow311 +powwow94 +powys +poyraz +pozabek2 +pozipozi +pozitiv1 +pp030678 +pp189 +pp2001 +pp232323 +pp2au3 +pp362156 +pp36529 +pp4133cs +pp49bz3 +pp55pp +pp6466pp +pp7r4d3r +pp984958 +ppad3665 +pparker1 +ppass2p +ppatkoo +ppc4211 +ppcemex +ppci +ppcn5966 +ppd6200 +ppdbap +ppdiac +ppdjasin +ppdsmkoo +ppeacee1 +pperik +ppeteepp +ppetrov +ppf1h +ppggss1 +ppgie +ppgirls +pph719 +pplk +pplua +ppmsnpzl +ppnkamn +ppoiluj +ppoper +ppp +ppp144 +ppp876 +pppa +pppinote +pppolar +pppooo +pppp +pppppp +pppulsar +ppq8mt +ppqf1 +pproxi +ppsh2 +ppvariant +ppweifox +ppy2 +ppzx16 +pq1w2e3p +pq4tuu +pqcondor +pqdoll +pqhvyzv +pqjfe +pqkadmin +pqlia +pqn57mon +pqtcb +pqw1j +pqwkx +pqxr7 +pr0ddef +pr0ducer +pr0h0h0 +pr0mm3 +pr0n69 +pr0s911 +pr0sp3r +pr0st4t4 +pr0t0plasm +pr0t0x +pr0v3r65 +pr0x1ma +pr1204 +pr123456 +pr1ck +pr1m4r14 +pr1mo1 +pr1nc3ss +pr1t1t +pr2006sa +pr21io +pr22gt8y +pr2v80xx +pr3086 +pr3jqzf +pr3mi3r +pr4632 +pr5410 +pr5590 +pr77b6 +pr8601 +pra62553 +prachon +prachuab +prachy +pracker +practic2008 +pradal +praha +praisprais +prakas7h +prakito +prakti +praline +prallen1 +prama524 +pramukh84 +prana1212 +pranav007 +praneet +pranks16 +prapis +prapsu +prasanna +prasc +prase +prasert +prasic +pratchett +pratsch +pravi55 +prawda03 +praxis5423 +pray +pray4me +prcXa3 +prctsok +prdel +prdilts +prdssdrp +pre +pre63y +pre99is +preat +preben +prebulat +precelka +precious +precision +precision25 +predator +predator215 +predator67 +predi1 +predrag +preem1 +preetzer +prefab20 +prefi1ve +pregius +preist1 +prekik83 +prelouc +prelude +prem +premberg +premier +premier099 +premier1 +premio +premio1942 +premium +premnath1803 +premus03 +pren3491 +prendero666 +prenium +prensa +prensa01 +prenses +prentiss +prepaid9 +prepod2 +prepsa +pres7737 +presario +presario433 +presco +prescott +prescual +presea123 +presid +preside +presioni +presque +press30 +presto +presto22 +preston +preston +prestu +presuffi +pretegad +pretre +preussen +preved +prevenire +previa +prezdmm +prezes +prezes20 +prezident +prg2143 +prgmas05 +prgw390 +pribag +prick +prickeN +priekopa +priest +priestess +prijedor +prikken1 +prikken88 +prikolas +prillo27 +prima15 +primagames +primagt +primal +primal10 +primatom +primavera. +primax15 +primax1704 +prime +primel +primex +primin1 +primitive +primo +primo +primoryeru +primus +primus420 +prince +prince +prince11 +prince302 +prince83 +princess +princess +princess marie +princess7 +princessxin +princo +princo74 +pringles +prinko +prinomag +prins +print +printer +printing12 +prinz5 +prinzikatrin +priplus +pripps +pris7717 +prisca44 +priscilla +prism666 +prisma +prisma03 +priss87 +pritchard +prithvi +pritisum +pritt000 +priums +privacy +privat1983 +private +private1 +privateer +privato +prive +privilege +privlaka +prix345 +prizee +prizmic +prizrakut +prjc2501 +prkenko +pro +pro1 +pro1019 +pro1pass +pro2000 +pro20000 +pro4chle +pro5719 +proabc +proani +proba +probab +probador +probat12 +probegte +problem +problemo6 +probst +procedura +procesador5 +processing +processo +prochodite +procione +procopio +procyon +prodeo +prodigy +prodigy1994 +produrre +prodyZ +proe2003 +prof125 +prof2004 +prof5223 +profa +profanatore +profbas +professional +professor +professor +professor toru +proffs123 +profi131 +profile3708 +profit1 +profit2008 +profman +profocus34 +profond +profri +progamer +progen321 +progeria +progr15 +programming +programming +progress2010 +progressive +prohib12 +project +projekt1810 +projektor +projekty1 +projetr +prokayo +prokop +prolex +prolink1 +prolo123 +prologirl +promchuai +prometeo +prometheus +promise +promny +promo +promoeco +promojobs +promopromo +promotion +promqna +promsbac +promsin +promtt1033 +pron613 +pronoob +pronto +proof22 +proopolp +propags +propangas8 +proper +proper111 +properbo +proph233 +prophecy21 +prophet +propisovacka9 +propprop +props +prorad +proroll9 +prosiak123 +prosperguild +prospro +prost +prostak +prosto +prosto1 +protacio +protazy2 +proteccion1 +protected +protestbank +proteus1010 +protex123 +protium12 +proton18 +protonewpass +protopaladin +prototype +protouch +protz54 +protzen +proudsun +prout +prout00 +proute +proutish +proutprout +proutt +prov1023 +prova +provaci +proved +proview +proview1 +provin23 +provola +provost1337 +proweb +prowler +prowler1 +proword1 +proxima +proxy +proxyman +proxzy +proy8277 +proyecto99 +prqpfubs +prtscrn3 +prucek +prudence +prudencia +prueb +prueba +prueba00 +prueba1 +pruebagetty +pruebas +pruebas2 +pruebo +prugnolo1 +pruna123 +prunella +prupik +pruschuk +prutske +prutsor +pruw983 +prv6sr0n +prvtxavi +prwck +pryll1 +pryllida +prylosis +prynarm +przdevil +przemek +przemek12 +przemek12345 +przemek24 +przemek83 +przemo +przemo72 +przyroda +ps12359 +ps1391 +ps13cl4n +ps18386 +ps18b34z +ps291760 +ps2ps2 +ps34px11 +ps3rocks +ps4srq +ps600875 +ps6919 +ps700508 +ps7ncecc +ps980091 +psa +psadmew +psalm116 +psalm23 +psalm465 +psalms3419 +psar2598 +psauer +psb2007 +psbadmin +psbankru +pscriv +psd +pse468lr +pseb321 +psedvb51 +pseimm49 +pseudo12 +psfsalum +psgmod02 +pshoot +pshop666 +pshu1rjt +pshuga2 +psia +psicometria +psicov +psikolog +psikoloji +psikutas +psion +psion3c +psionpsion +psiuku7 +pskhgfkh +pslayers +pslwhsm3 +psmr1439 +psobb17 +psom1975 +psp1 +psp2007 +pspbg123 +pspfw +pspipod +psppass +psppsp +pspwkzjn +psr6700 +psrave +psrxmrlv +pssha +psswrd +pst417nq +pst55 +pstar4 +pstation +pstauto +psu1855 +psuecho +psuweyka +psvrabo +psw231 +psxpsx +psxzone +psy222 +psy2904 +psy787 +psych15 +psycha +psyche7 +psycho +psycho13 +psycho63 +psyco +psyco699 +psyduck +psyjuk1 +psykes09 +psylocke +psymix +psypro04 +psypsypsy +psyscho +psyturn +psywfpnm +psyzone +psz0stak +psz0stak +pszczola +pt060680 +pt4jr8xx +pt7664 +pta2580 +ptanne +ptcabc +ptcyba13 +ptdrcrew +ptear +ptg21294 +ptgray +pthlhtt +pthxek +ptigro +ptilou +ptlima +ptnh8 +ptoern +ptp9991 +ptr100 +ptr2205 +ptr270 +ptradmin +ptrcvu +pts2010 +ptskjk8r +pttw2300 +ptv973 +ptzdp4f +pu3rpty +pu7eu9np +pu8edo69 +puRe +puakin +puass +pubicpub +publ15h +public +public99 +publicar +publicite +publicsocks +pubqijog +pubs39 +pucak83 +pucar7aa +pucek132 +puch11 +puchatek +puchatek18 +puchg6 +puchiko +puchmaxi +puckel +puckie0303 +puckie1968 +puckito +puckman +pucky0 +puczes10 +puddles1 +pudel5323 +pudelwohl +pudgy1 +pudrete +puducu +pueblo89 +puerto18 +pueseso +puestas +puf38law +pufa121 +puff1502 +puff1992 +puffduff +puffhead +puffin99 +puffy +pufi +pufnstuf +pufpuf +pugdog +pugrules +pugsly +puiumic +puk +puke +pukeko1 +pukelise +puki +pukimai +pukinek +pukkie5 +puknash +pukpuk +puksu1 +pula +pula1234 +pulamea +pulamea3 +pulamea90 +pulcei +pulchra +pulcino2 +puleikis +pulg050 +pull3n +puller +puller88 +pulling +pullor +pulp0611 +pulp68 +pulpcity +puls +pulse2372 +pulsorec +pulverhaus +pulvin +puma0377 +puma12 +puma1407 +puma1989 +pumacat +pumadelight +pumatuyo +pumba +pumba009 +pumbpumb +pumitas +pummel +pump1ngs +pumpa786 +pumper12345 +pumperton +pumpgun +pumpk1n +pumpkin +pumpkin61 +pumppump +pumuckl +puna4532 +punair2 +punani +punany +puncho74 +puncika +pundeool +punia1 +puniito +punisher$ +punisher1 +punishments +puniu5 +puniya +punk80 +punkarea +punkass23 +punker45 +punkin +punkin2468 +punkrlz +punkrock +punkrock1 +punkster12 +punktiert +punkz +puntet +punti +puntinom +punto +punto55 +puntoss1 +puoskis +pupa +pupa123 +pupa159 +pupa7872 +pupauoga +pupava +pupetboy +pupkes +pupkin99 +pupospwp +puppaal +puppen32 +puppet01 +puppies +puppy +puppy1 +puppy1204 +puppy161 +pupsbaer +pupsen +pupser11 +pupsi +pupsik +pupuce +puqiotka +puravida +purdge1 +purdue66 +pure +pure1234 +pure520 +puregold +purehate +pureta +pureza273 +purgatory10 +purge223 +purnell +purple +purple2 +purplehaze +purpose1 +purrmember +purse6 +puruns +purwanto +purzel +purzel13 +pus02 +pus4dog +pusa +pusante +puschael +puschel +puschel0815 +puschelohr +puschi +puschy +pusd4t1n +pusekatt +push47 +pushkart +pushok +pusikitu +puslapis +pusling79 +puss1984 +pusser +pusser12 +pusspoop +pussy +pussy5 +pussycat +pussycat1 +pussypie +pussys +pussyss +pussyw +puszek +put0am0 +puta +putaelda +putaja +putanose +putarra +putero +putilla +putindet +putinwork +putka +puto +putos76 +putraman +putt89 +puttana +putte +puttputt1 +puttxD +putty +putz +putzel! +putzi123 +putzili +puukzn +puupuu +puvomo48 +puxlik +puxoge79 +puyol2008 +puzpetas +puzzel +puzzle +puzzola +pv075zsp +pv5o2wif +pv680539 +pv8jkzee +pva156 +pva26077 +pvaxx +pvbkn +pvbr4v0 +pvhhe1k1 +pvillar +pvilyou +pvision +pvk17s +pvl08771 +pvnrt123 +pvpao +pvqzhp +pvt1003 +pvt1122 +pvt5602 +pvt69s +pvtdceti +pvy0y1yv +pw +pw123 +pw1310gh +pw158715 +pw208 +pw21606 +pw2208 +pw3371 +pw4kimo +pw5291 +pw5sfkv7 +pw63city +pwcath88 +pwd +pwd1024 +pwd123 +pwd123! +pwd1981 +pwd2113 +pwdadm +pwdadmin +pwdlr01 +pwdo5jsa +pwfp455 +pwgps +pwi4598 +pwjimpw +pwls789 +pwluzun +pwn +pwnage +pwnd +pwne5caw +pwned +pwned1 +pwneda +pwnj00 +pwnmeyo +pwnstar +pwntpyth +pwnzered +pwpwpw +pwr +pws2004 +pwszpany +pwtest +pwwau +pwxjm +px06rox +px12jge +px150e +px27r5 +px394 +px3up469 +pxX3aT +pxbrandy +pxcvap +pxg5z7 +pxhez +pxkjlj8s +pxl4mn6 +pxngxxn +pxp24via +pxpe1zlj +pxswmz +pxw9872 +py05seky +py060982 +pycc +pyceruse +pycxenon +pyczi666 +pydaras +pyderas +pydstg +pyee1010 +pyeman +pyh4k +pyhkx +pyjama10 +pyjamas9 +pyk2g8a5 +pykiwe +pykooo0 +pyksat32 +pylly1996 +pyotr +pypypoy +pyr7d +pyramid +pyramid1 +pyramidula +pyrkas2 +pyroclasm4 +pyroman +pyromanic1 +pyrryke +pys1pvbu +pysiek +pythagoras +python49 +pythonr +pytlik +pyv7d +pyw9727 +pyx1s +pyyqzsur +pyzda +pz4kj4vs +pz4mFN +pz4n0tt1 +pz812800 +pzhawk +pzpr01 +pzyleyux +pzzg1299 +q +q0884559 +q0bs9k +q0crq +q0qdm +q0qsosui +q10q10 +q10wc5 +q11qq2 +q123123 +q123456 +q1234567 +q123w +q135p +q181400a +q1a2z3w4 +q1bsm +q1hursn1 +q1master +q1net +q1q1q1 +q1s3c5b7 +q1w2e3 +q1w2e3r4 +q1w3zny9 +q1xlc +q2007s4 +q23wert +q2ctf +q2dm666 +q2etp +q2hoa +q2la16 +q2n3055 +q2q2q2 +q2w3e4r +q2w3e4r5 +q2werty1 +q31w816x +q34avwq +q3aq3f +q3flxjfq +q3ftw +q3ihe8yr +q3niv +q3q3q3 +q3test1 +q3vla +q3w2atcc +q3wcp22 +q3xkw +q3yvh +q433714x +q437i5 +q456123 +q4ejt +q4o2dsgo +q4qsd +q4s5d6 +q5077 +q53566789 +q568j +q5982110 +q5cse2ut +q5q +q6087388 +q61h2spu +q6326609 +q65252411 +q661204q +q667e +q668m +q67j5gk +q69290 +q69699691 +q6liyycw +q7687823 +q774 +q785145 +q78x12 +q7966535 +q7a4s5w8 +q7p5kvyp +q7pdm9 +q7zsld1 +q803h +q8128649 +q81s83r +q854258 +q89q89 +q8BI +q8aop +q8cbj +q8eek +q8olf5 +q99tj11 +q9f3yhy +q9ip1g +q9tj9 +q9vbi +q9vnsjda +qA1WF +qDLJp2 +qExan +qQ63Km +qRV8AG +qa1zmsf +qa2old4u +qa5bp +qa993124 +qab8v +qabra222 +qaf761 +qafmuesq +qafxumam +qajulen +qal4500 +qallaf +qamkenem +qan959 +qaqaqaqs +qaqas959 +qarxrx +qasser +qast90x1 +qasw23ed +qaswed +qatar991 +qateam +qatify +qatilicu +qaw34uk +qaweim +qawsed +qawsed14 +qawsedrf +qaxv7qxd +qay +qayqay +qaywsx +qaywsx1 +qaywsx12 +qaywsxe +qaywsxed +qaywsxsa +qayxsw +qayxsw21 +qaz +qaz123 +qaz1259 +qaz12wsx +qaz21 +qaz3 +qaz32100 +qaz4321 +qaz729 +qazasd +qazbgt +qazedc +qazjd +qazokm +qazokmxcvbn +qazplm2 +qazplm5 +qazqaz +qazqaz322 +qaztw3sx +qazvfr +qazwsqx +qazwsx +qazwsx12 +qazwsx132 +qazwsx3 +qazwsx5892 +qazwsxbb +qazwsxdf +qazwsxed +qazx12 +qazxcv +qazxqazx +qazxsw +qazxsw1 +qazxsw3 +qazxswddd +qazz22 +qazzaq +qazzaq13 +qazzaq21 +qazzaq4e +qazzaq78 +qb54aj +qball3113 +qbb123 +qbbas +qbbbv +qbbp7omx +qbertz +qbg2v +qbhhdb +qblunt +qbmaster +qbpwk +qbq38ndc +qbqqp +qbs21 +qbxjy +qbynegf +qc1ss +qc6zy37m +qcgtjzr +qch2ey +qcpon +qcshutup +qcttcoyy +qcuy888b +qd4467 +qdc0quje +qddv7gnk +qdiyc +qdjw8x +qdnwep +qdsklm +qdu21 +qdv34v +qdwbqhu +qe37tgc +qebk7 +qedolame +qef7s +qefjosab +qefmf +qeg19sam +qegugehi +qeh98yod +qeiy4 +qej7sebt +qejca +qejpopeq +qekneqse +qelmpsh +qelmpsm +qelpdff +qeq +qeragip +qet1adg3 +qet789wr +qetsesif +qetuo +qetuo100 +qeuqiuto +qew12saz +qew5wykv +qew83yow +qewradsf +qewrsfdg +qex +qexwpq +qey6knu +qeytitoz +qf0uluz6 +qf621 +qfdwtdhz +qfec69 +qfelek +qfg4y +qfgpmz +qfi26260 +qfmv4 +qfqoh +qft11069 +qfteg +qftxx3 +qfuP +qgJoHE +qgc5m +qgdqxar +qghfv5st +qgiqm +qgodka +qgpbuckw +qgrrchsi +qguew +qh354 +qh6y8p +qh7d9im4 +qhbackup +qhf4a +qhme +qhoangyt +qhorkcd8 +qhp68ys0 +qhqp22tt +qhtdqfus +qhueqwjk +qhy7hz36 +qhzhb +qidficuk +qidsck +qig75 +qiiob +qik51cet +qik65kiy +qimahim +qimaw786 +qimf69 +qimlestb +qin8888 +qinghua +qinglang +qinkun12 +qionglai +qipba +qiqi1980 +qirb0 +qiscitut +qiu31aph +qiuye258 +qixeza +qj3yk92 +qjaafaun +qjan1 +qjcam +qjf1rp +qjfka8 +qjhq +qjhui +qjkrl +qjkx2w7y +qjqt5 +qjqzc +qjvzf +qjw45 +qjxmg +qjycaco +qjzue +qk2uxhhh +qk350777 +qkajanta +qkbo61s9 +qkbqkb +qkfh +qkjjr +qkol6 +qks5 +qksno +qkxe2 +qkz3s +qld6t +qlditm94 +qleveland +qlf1234 +qlf413 +qlfsav +qlhoofn +qlimax +qln7c +qlownage +qlr6183 +qluor +qlw8y4o +qm3lol +qm4132 +qm42ou12 +qm5tszcx +qm6q2v4b +qmail007 +qmark++ +qmazoo90 +qmc2l +qmfsxs +qmlr4571 +qmmaje23 +qmnnm +qmnsad +qmpzj +qn8h6dcw +qnbwl +qncve +qnh1014 +qnt774 +qntrwjgf +qnx +qnz1c +qo4m6 +qobzezah +qodinia +qofwezun +qol0vxb7 +qolfapol +qone321 +qoo54068 +qoo9p +qoojj123 +qopwumed +qoqqiyaw +qorropoj +qorxijuq +qosmio +qozi7401 +qp01lamz +qp30cm +qp3sc6tw +qp45nj19 +qp5al5 +qpa1 +qpa123 +qpa222 +qpalzm +qpalzm78 +qpec72q8 +qpecl +qpkr5 +qpmjs +qpmzwonx +qpqp2910 +qpwoea +qpwoei +qpwoei12 +qpwpep +qpx0l +qpxpqws +qpzm1 +qpzm12 +qpzm1379 +qpzmla +qq0225 +qq1122ww +qq1234 +qq323506 +qq331235 +qq711812 +qq80001 +qq9595qq +qqaayy11 +qqazxx +qqcoisa +qqdengqq +qqho3mx4 +qqk03 +qqmarket +qqmertqq +qqmlz +qqpipi +qqpz9nys +qqq +qqq15 +qqq333 +qqqaaa +qqqq +qqqq3112 +qqqqjjh +qqqqq +qqqqq6 +qqqqqq +qqqqqq08 +qqqqqqqq +qqqwe +qqqww567 +qqqwwe +qqryq +qqtest +qqwwqq +qr5003 +qradb +qrbik +qrcybb4 +qrd8l9ax +qre664ni +qrebica +qrh3r +qricbb +qrk6t +qrno +qrookie +qrt1hmhr +qrt240df +qrtalm71 +qrw0a +qry4v +qrz1h +qrz2h +qrzkavaj +qs2509 +qs53i9 +qs65ml45 +qsauiiay +qsc +qsc567 +qscazx +qscesz +qscgu +qscvb +qsdfgh07 +qsdfjklm +qsdqsd +qsecofr +qsecofr7 +qsefthu +qsir1968 +qsk58r +qsl100 +qsl62 +qsmmd +qsoko +qspiet5o +qss83awb +qswaefrd +qswdef +qswdefrg +qsyf4cc9 +qszawe +qt27juaq +qt3xvjy +qt74db +qt800103 +qtgejsr +qtju27aq +qtkge22i +qtpgr3 +qtq9jhlg +qtradmin +qtshd +qtsj8 +qtvszk +qtx5kasr +qtya0 +qtz2h +qu4rky +qu656er +qu7ae +quabsp +quack1 +quad02 +quad2500 +quad26 +quad8 +quadep +quadral! +quadral+ +quadral67 +quadrat +quaif1 +quake +quake2 +quake3 +quakeii +quaker +quakerz1 +quakes +quality +qualle +quanghuy +quangkey +quangpd +quano +quanten +quarkman +quartal7 +quartz +quartz13 +quasar +quasi +quasi1661 +quasi47 +quasi69 +quasimodo +quasoul +quatre +quattro +quattro4 +quaxixxx +qubesy +quc20tep +qucq6q +qudabxcr +que2hh +que888 +quechpro +quechua3 +quedal86 +queen +queen8 +queene +queenie +queenie01 +queens00 +queeny +queerasf +queflash +queguapo +queles13 +quelle +quelle.8 +quelle03 +quemelol +quenan91 +quengheo +quenhu +quent3492 +quente17 +quentin +quenty +queonda13 +queperro +quercus +quercy +querere +querias +queries +quert +querulanten +query757 +quesas +quesillo +quest +quest268 +quest77 +questar +question +question10 +queta +queteden +queue373 +quevis +qufsigac +quh93foy +quick44 +quick786 +quickinv +quickshot +quickspoon +quigon +quij0t3 +quikfire +quiller1 +quimera94 +quimolly +quincie +quincunx +quincy +quincy2020 +quincy3515 +quinn +quinn611 +quinnishot +quinquin +quint1 +quintin +quinto +quique +quiqui +quispequispe +quit +quiz2404 +quiznos352 +qujoma +quk86sew +quk87koq +qukarron +quku +qul97mog +qumeba23 +quocanh +quocanh1701 +quocduy +quocminh +quovadis +quoy6c +quq65fef +quq90goy +quqhg +quqozhsf +ququna2c +qus66 +qut22sex +quthakik +quuth +quutsch +quux +quwert +quynh +quynhanh +qvack1989 +qvadis +qvax0060 +qvcel +qvcxxz +qvf60 +qvf7m +qvgh9il +qvjsw +qvl214 +qvm294 +qvm2948 +qvmum2p8 +qvor55 +qvq0a +qvr770 +qvssbfjx +qvyuc +qw00468 +qw123123 +qw124578 +qw12ert +qw12qw12 +qw147852 +qw21fd34 +qw32k +qw34io78 +qw4ever +qw59erer +qw5at +qw666666 +qwERasDF +qwaqaq +qwas12 +qwas12zx +qwas159 +qwas9876 +qwasha +qwasqwas +qwasyx +qwaszx +qwaszxc +qwdf12 +qwdf355 +qwe +qwe00ewq +qwe10131 +qwe111 +qwe112 +qwe123 +qwe12345 +qwe124 +qwe1rty2 +qwe222 +qwe226 +qwe227 +qwe234 +qwe30qwe +qwe321 +qwe34226 +qwe753 +qwe789 +qwe: +qweasd +qweasd01 +qweasd1 +qweasd12 +qweasd71 +qweasd74 +qweasdfg +qweasdzx +qwedcvfrty +qwedcxza +qwedsa12 +qweedo +qweee +qweenos +qweer101 +qweewq +qweewq1 +qwem +qweqqweq +qweqwe +qweqwe1 +qweqwe995 +qwer +qwer12 +qwer1234 +qwer1y +qwer4321 +qwer45 +qwer48ty +qwer617 +qwer789 +qwerasdf +qwerfds +qwerler +qwerpoiu +qwerqwer +qwerrewq +qwert +qwert1 +qwert12 +qwert123 +qwert1y2 +qwert230 +qwert26 +qwert271 +qwert42 +qwert5 +qwert987 +qwerti +qwertik +qwertoff +qwerty +qwerty.7 +qwerty1 +qwerty11 +qwerty12 +qwerty126 +qwerty13 +qwerty15 +qwerty18 +qwerty1q +qwerty206 +qwerty22 +qwerty543 +qwerty56 +qwerty66 +qwerty6p +qwerty7 +qwerty90 +qwertyas +qwertyfille +qwertyqwerty +qwertyrulz +qwertysp +qwertyu +qwertyui +qwertyuiof +qwertz +qwertz12 +qwertz23 +qwertz34 +qwertz89 +qwertzgg +qwertzu +qwertzu8 +qwertzui +qwertzui66 +qwerzxcv +qwest111 +qwest2364 +qweszxc +qweszxc7 +qweveeq +qwezz +qwggtn44 +qwib5 +qwm321 +qwmuckt +qwop5566 +qwpapxbb +qwpyer +qwqqwq1 +qwqw +qwqwqw +qwqwqwqw +qwreas +qwrulz +qwsaqw +qwsaqwsa +qwsazx +qwsxdc +qwtre77 +qww5s +qwzxpo +qx24av12 +qx6700 +qx684 +qxadmin +qxdkb8 +qxewzc +qxh97 +qxhd3 +qxkj2 +qxs30 +qxv1pokv +qyefkypg +qypjnwkr +qyv1w +qyxv5 +qzDno +qza12b +qzb9mhht +qzj4yb67 +qzn6c +qznfpppp +qzpzrx10 +qzpzrx70 +qztbq +qzw8ketv +qzwxec +r +r +r002002r +r00f13s +r00t +r00t1ng +r00t3d +r00t9556 +r00tb33r +r00tbeer +r00ted +r00tn3t +r00tus3r +r012012h +r040178 +r041205m +r04drunn3r +r080570f +r0b +r0b1nd +r0b3rt0 +r0b3rt4 +r0bust +r0ck3t44 +r0ckf0rd +r0ckies +r0ckme +r0ckst4r +r0ckz0r +r0f7p1mp +r0fl2k +r0gUe +r0gji7bw +r0gueale +r0hw1ld1 +r0iber +r0k0k0 +r0l4nd0 +r0lling +r0llt0r +r0mmie +r0mu4ld0 +r0ot +r0prh +r0sebud +r0senberg +r0tt1s +r0vci +r0wky +r0xing +r0ysk1n3 +r100282 +r1100rt +r1200c +r12052001 +r12312667 +r123r123 +r12ic19o +r130876 +r1402u +r14789632 +r151cc +r152008 +r154633n +r15701992 +r16797z9 +r1984x9 +r1986g +r1b0s87 +r1chp0rt +r1d1ngjd +r1e0m8zi +r1f2l3m4 +r1gh7y +r1ihq +r1ll1b33 +r1m4n1 +r1o2f3l +r1o2t3a4 +r1o3b507 +r1o6c1k8 +r1ppl1ne +r1t0qu3 +r1t2y3 +r1twkdko +r1u1d1a1 +r1v3s7 +r1xem +r2202d +r220696j +r221221 +r221489b +r222d222 +r22idnf +r23g0be +r2455s +r276s +r2879166 +r29105 +r2a8s0t7 +r2aortsp +r2d2bf2 +r2d2c3p0 +r2d2c3po +r2d2r2d2 +r2d2xy +r2i5c +r2nBze +r2npozsq +r2o0x0y5 +r2r2l1r2 +r2ujw +r2vpr23i +r2x8iipq +r30xbA +r33su56v +r34g4n +r35ax9f +r369888 +r36m7ftb +r3725609 +r3a9m5bo +r3al0v3 +r3al1ty +r3d33m3r +r3d38bad +r3d4you +r3dal3rt +r3dbaron! +r3ddy +r3dew +r3df3r5et1$ +r3dman +r3dn0iz3 +r3dsh4rk +r3dst3rs +r3dst4r +r3dtr33 +r3e3sams +r3fr35h +r3g4w2g6 +r3ill3y +r3kb8za6 +r3kd76b8 +r3kgui9c +r3l04d3d +r3l0ad3d +r3l4xx +r3m3mber +r3mbrand +r3n31977 +r3nd0n4 +r3ol73 +r3p0sT +r3p4pitt +r3p5tm +r3p7m80 +r3pr6 +r3pt1l3 +r3spmd +r3t1r3d +r3tard +r3v3tahw +r3wt3 +r3xadmin +r3yb8 +r3zu +r41j1n +r421bp4 +r42tzzuw +r4353 +r4450279 +r4918w +r49442 +r4a1t9yu +r4bb +r4dagb +r4dius +r4gn0r4k +r4h42233 +r4h4YU +r4i5tlin +r4ktas +r4m424n +r4n37wo4 +r4yne4me +r534 +r53p27 +r55555 +r57 +r5749361 +r58zey9d +r5f9i34j +r5fud +r5i9z +r5jmb +r5nsp +r5rpp5yn +r5t6y7u8 +r5yw6dqt +r64ym4 +r669ook +r6defty9 +r6e45te +r6kyb4 +r6lwn +r6m8t4 +r6nwwgl3 +r6yamaha +r7105467 +r7381855 +r7499n +r74aptnk +r7636316 +r777r +r78gitvt +r7gj3nvu +r7ily +r7r9r10 +r7xwa0xt +r7zg2gpq +r8115832 +r8289509 +r84yq8 +r85cb3ig +r86684t9 +r88t56 +r896p +r8dars00 +r8i0ce3h +r8ich +r8lah8hn +r8ot7h +r8s6s9x3 +r8xk3s +r921414 +r921992 +r9315017 +r9371184 +r95gh13 +r98f4t +r9fww +r9inija +r9ochpng +r9tbw +r9tya +r9wp7 +rDHp7 +rEd8pC +rEsEt +rFTrjr +rKyli +rMpcpc +rUa000 +rVURK +ra +ra0210 +ra0lhn +ra0wqf +ra1226 +ra1234 +ra190597 +ra1asr +ra1nb0w +ra3xpvfu +ra53ns +ra562021 +ra77us +ra7ersux +ra7n40sc +raa10y18 +raaaving +rabanian +rabarbers +rabb1t1 +rabban +rabbe095 +rabbit +rabbit14 +rabbit72 +rabbit9809 +rabblerouser +rabhi467 +rabi +rabid360 +rabida4307 +rabino +rabota +rabrab +rabuf420 +rabuhina +racaloz +racc225 +race +racec210 +racecar +racer +racer04 +racer1531 +racer778 +racerace +racerx +racerx63 +racha +rachael +rachael1 +rache +rachel +rachel +rachel10 +rachel1015 +rachel7928 +rachel97 +rachele +rachelwu +rachida10 +rachidis +rachie33 +rachmatt +racin38 +racing +racivom +rack0516 +rack101b +racker1 +racki +rackpape +racman1 +racoiaws +racq +rad +rad57654 +rad76566 +rad7bert +rada +rada1546 +rada1810 +radai1r2 +radaman7 +radames +radapu +radar +radau +radaxs +radc0133 +rade +radecek +radek +radek1 +radeon1 +radhoine +radi100 +radiance +radiantj +radiation15 +radical3988 +radija +radiju90 +radio +radio +radio104 +radio123 +radioact689 +radiob +radiohead +radiojung +radioo +radios +radius11 +radj +radko +radmin +rado +radomiak +radouane +radoun55 +radovan +radovanp +radox +radsld01 +radson8780 +radstadt +radtke +radu +raduk +raduralu +radyocu +rae +rae dawn +rae8112 +raeanns7 +rael1963 +raelia33 +raerae +raeven +raf +raf742el +rafa +rafa1988 +rafa4095 +rafaeia +rafael +rafael +rafael luis +rafael11 +rafael54 +rafaela +rafaela +rafaeli +rafaelito +rafaelrivas +rafaelx +rafail +rafal1 +rafal123 +rafal22 +rafale87 +rafalin +rafanto +rafbel +rafcam +rafcio890 +rafeal +rafer +raff9242 +raffaele +raffaele +raffaule +raffi11 +raffian +raffiill +raffik77 +raffle +raffles +rafflestianjin +raffter +rafif +rafik +rafiki23 +rafikkifar +rafiku +rafirafi +rafknight +rafles +rafnat15 +rafoune +rafsta +rafta +rafucu94 +rafw23 +rag03 +rag9211 +ragabash1 +ragb54 +rage +rage79 +rageof +ragged +raggetts +ragi1140 +ragit245 +raglul +ragman1974 +ragnar +ragnarek +ragnarok +ragnarok7715 +ragnarokro +ragnhild +ragnolord +ragnor +rags +raguhn +ragusa12 +rahaf008 +rahaf10 +rahal +rahasia +rahasiax +rahay623 +rahbari +rahbari2 +rahim +rahim123 +rahimi +rahlus +rahman +rahmat +rahnema +rahpoom +rahrah +rahulmodi +rai2003 +raiben2781 +raid123 +raidchan +raiddkp +raiden +raider +raiders +raiders0220 +raidingrocks +raidwolves +raifer +raigeki +raigen666 +raihan +raika +railcar6 +railnet +railroad +raimstah +raimundo +rain +rain12 +rain187 +rain2bow +rain4est +rainbeaux +rainbow +rainbow +rainbow6 +raindance +raine321 +rainer +rainer werner +rainer123 +rainfall +raingard +rainn1 +rainonme +raisa +raist +raistlin +raiterra +raithor +raivis +raivo666 +raivyn +raizen +raizo +raj +raj0164 +raja1173 +raja123 +rajacheri +rajaraja +rajeev +rajesh +rajmus +rajnec +rajo9k +rajraj +rajsilwa +rajskeqx +rake +rake1562 +rakeem +raket007 +raketas +rakett22 +rakitan +rakmed69 +raknor +rakoepper +rakowskim1 +raks14 +raktas +rakuel +rakuen77 +ral5t +raleigh +raleigh +ralf +ralf +ralf0303 +ralf2007 +ralf4756 +ralfi007 +ralfs1488 +raligen +ralijs +ralitom +ralopib37 +ralph +ralph arthur +ralph-arthur +ralph6565 +ralphl +ralq +raltekes +raluca1981 +ram +ram john +rama +rama.. +ramacoti +ramadan25 +ramas +ramaz +ramazan +ramazzotti +rambaudi +ramble737373 +rambo +rambo1 +rambo12 +rambo123 +rambo14 +rambo238 +rambo349 +rambo494 +rambo555 +rambo595 +rambo65 +rambol +ramboslice +rame123 +ramen400 +ramenuna +ramesh55 +ramezan +ramgad +rami +rami112 +rami2968 +rami55 +ramidanus +ramiro +ramiro#1 +ramiro73 +ramis +ramis95 +ramisgay +ramiz +ramkol +ramlapv +ramll0 +ramm4stein +rammel +rammramm1 +ramnod36 +ramon +ramon +ramon01 +ramona +ramones +ramonnka +ramos111 +ramotowski1 +rampage1552 +rampan +rampass +rampking +ramram +ramrod +ramroom +rams1776 +ramsa64 +ramsags1 +ramsay +ramsdell21 +ramsey +ramsey1949 +ramsgate +ramshiv +ramsses +ramsus +ramthexa +ramulis +ramunas3 +ramunuba +ramyam14 +ramzey +ramzeyci +ran +ran111 +ran1er11 +ran56ran +ran7nik +ran82get +rana687 +ranad5 +ranbig +rancana6 +rance +rancho88 +rancid +rancom +rancor25 +rand +rand1234 +rand1245 +randall +randall edwin +randall208 +randee +randem1936 +randfont +randh1120 +randi +randichu +randidi +randilynn2006 +randle25 +randolph +random +random0412 +random1 +random3 +random3141 +randon73 +randori44 +randrandrand +randy +randy +randy norton +randy01 +randyc89 +ranequa +ranged05 +ranger +ranger275 +ranger2d +rangers +rangers1967 +ranhome +raniaafa +rankin +rankra +ranma12 +ranman34 +ranmars +ranoush +ransbank +ransom +ranvik +ranzengarde +ranzinger74 +ranzkopf +raouf ben +raoul +raoulraven +rap104 +rap1do +rap1ture +rapala +rapboy +rapci +rape +rapeher +rapeteo +rapfunzel +rapha86 +raphael +raphael +raphaelle +raphcv +raphi17 +rapi3401 +rapid +rapid0 +rapid333 +rapids32 +rapidx +rapitor +rapix +rapper +rappin +rappy1 +raps2000 +rapsgwg2 +rapsolja +rapsucks +raptor +raptor22 +raptor443 +rapture +rapture777 +rapture91 +rapunzel +rapurura +raqibul +raquel +raquel +rar +rarcudub +rareza34 +rarlaheh +rarpazog +rarr1188 +rarrar +rarry +rarulz +ras daniel +ras111 +ras8290 +rascal +raschede +rasdlipp +rasen2005 +raseng4n +rasengan +raser +rashel +rashelle +rashid +rashid +rashomon +rashu +rasika +rasillo +rasisue +raskob +rasmus +rasmus2007 +rasmusrasmus +rasmusrasmus1 +rasool +rasoraso +rasp808 +raspel +raspip +rasputin +raspy21 +rasras1802 +rasta +rasta1 +rastaa1 +rastafari +rastaman +rastamon +raster +rastik1979 +raswer +rasyte +rat1los +rat215 +rata81 +ratanaporn +ratboy +ratemal +rateqfv +ratescu +ratewe71 +rathe +ratilali +ratimp +ratin +ratina456 +ratirati +ratmchef +ratna +ratnitz +ratnoir +ratp +ratpack +ratrat +rats +rats11 +ratsplas +ratt007 +ratt92 +rattan +rattat00 +ratte +ratte07 +ratten123 +rattmaus +rattrap42 +rattrap55 +ratukas +rauban +raudihuhn +raufbold64 +raufon +rauhut +raul +raul +raul1984 +raul1994 +raulis +raulmini +raulraul +rauly +raumplan +rauni +raunze +raupe1951 +rausch +rausch09 +rausvajs +rautemusik +rav4 +rav66613 +rav84lag +ravager02 +ravand +rave1985 +raveland2 +raven +raven1622 +raven369 +raven842 +raven9 +ravend +ravenrdq +ravens +ravens30 +ravensden1967 +raversky +ravi +ravi +ravioli4 +ravit18y +ravith +raviv +ravnos12 +ravs1196 +ravulture +rawah96 +rawai69 +rawdeal +rawishhh +rawr +rawr!1 +rawradin +rawrkid +rawrness +rawrroar +rawrz232 +rawrzor +ray +ray +ray dennis +ray eberle +ray rainbow +ray7895 +ray9354 +ray99 +raya +rayaman +rayan0 +rayban121 +raycurt9 +raydal84 +raydtqwe +raye +rayearth +rayford +rayhan +rayila01 +rayj +rayleft +rayluz05 +rayman96 +raymane +raymond +raymond george +raymond maurel +raymond scott +raymond427 +raymonde +raymondf +raymundo +raynardd0 +raynel2004 +rayok3n1 +rayotech +rayray +rayray45 +rayriver +raysnet +raysseed +raytheon99 +rayxoop +raz +raz +raz0r13 +raz80iel +razagus +razavi1388 +razawa +razeqi +razerr +razi3210 +razicat +raziel +razlol +razor +razor111 +razor123 +razor250 +razorblade +razors123 +razq +razvanro +razz +razz13 +razzak +razzle +rb080808 +rb161266 +rb26dett +rb7dvdu5 +rba12345 +rba17u +rball7 +rbananas +rbanerjee +rbb5i +rbc92e8t +rbddss +rbedz +rbepn +rbevkf +rbg123 +rbhuele9 +rbkdicas +rbo2005 +rbr0828 +rbsc4nn +rbstro +rbtn2blp +rbu991 +rbv785 +rbvhs +rbwk49bs +rbx3690 +rbzds +rc0926 +rc261127 +rc26559 +rc3hm8 +rc478622 +rc8gbh +rca +rca123 +rcadia +rcain +rcarroll7 +rcb94kmb +rcconfig +rcepen17 +rcgaryh +rchqw55r +rclens59 +rclens62 +rclg7770 +rcloutier +rcnt3mp +rcpob +rcrc +rcsorg +rd10mtls +rd13ww +rd190485 +rd216003 +rd250655 +rd26ad12 +rd3294 +rd350 +rd8827 +rdbms +rdboro +rdeak +rdfc5546 +rdfccma1 +rdfcrdfc +rdfer +rdfrdf +rdi123 +rdl212121 +rdm240 +rdmdmvsa +rdmgf +rdp9u +rdpw99 +rdq3rdq6 +rdre576d +rds5pwd6 +rdsecu +rdsh +rdv55 +rdysss +rdzmrc90 +re +re-entry +re0202 +re070601 +re122112 +re1313re +re1409 +re2008ke +re333pe +re34ag +re4939 +re5i8 +re7231my +re75pe99 +re8ecca +re8mbe4r +re9416 +rea76 +reachout +react33 +read +readalert +readcheap +reading76 +readinggeek +readln2 +readthis +ready9845 +reainer1 +reaktant +real +real1991 +real2006 +real2202 +real333 +real4478 +real597 +realbyze +realcum +realee +realeros +realhack +realidad +realism +realiste +reality1 +reality657 +reality6789 +realize +realliving +realmatrix +realoser +realpunk +realschule +realschule1 +realsyn +realthree +realtor +realword +reanime +reanrean +reaper +reapper +rearagete +rease2976 +reath1 +reaven +reaver126 +reaver69 +reb +reb00t98 +reb104pe +reb1rth +reba +rebarmuskel +rebe1024 +rebe16 +rebeca88 +rebecca +rebecca +rebecka +rebekah666 +rebekka3 +rebekkas +rebekko +rebel +rebel +rebel101 +rebelist +rebeljko +rebelm +rebelplay +rebels70 +reberapo +rebmetpes9 +rebohcs +reboot +reboot203 +reborn91 +rebound1 +rebound35 +rebreb88 +rebs06 +rebus22 +rebusi0511 +recajito +recchi88 +reccos1209 +recel1980 +recep +recepuca +rechie0808 +rechner4me +recoba +recognize +recon +recondito +reconone +record +record20 +recordable +records +recover999 +red +red +red dust +red007 +red101ip +red123 +red12345 +red12lad +red1404 +red15box +red193 +red261 +red333 +red4sun +red69 +red7088 +red99 +reda +reda45 +redact01 +redaf6 +redakcja +redaktor7 +redalert +redarmy +redart +redback +redballs +redbean +redbear +redbird +redblack1 +redbone001 +redboxer +redbul +redbulcu +redbull1188 +redbull2010 +redcar77 +redciyiz +redclan +redd +redd0g +reddevil01 +reddevil84 +reddog +reddog02 +reddog451 +reddog90 +reddopex +reddragon +reddy +redeemer +redemption +redeon +redes +redeye +redfield +redfire +redfox1 +redfox1994 +redfox312 +redfox73 +redglass +redhack +redhands2 +redhat +redhat73 +redhead103 +redheels +redhot +redhotchilis +redhotki +redhqtio +redial71 +redical +redick43 +rediff +rediska +reditogo +redled +redline +redmane2 +redmedia +redmond +redmond +rednas1984 +redondo95 +redoxy +redpo20 +redpower +redrage3 +redragon +redrat +redred05 +redred44 +redrit +redrose90 +redrum +redrum256 +redrum42 +reds95 +redsis03 +redskins +redsoft +redsox +redsox32 +redsox95 +redtag66 +redtail66 +redvash +redw1ing +redwings +redwolf28 +redyns2830 +redytel +redzone213 +reebok +reebok11 +reebok12 +reece +reed +reed22 +reem1961 +reemreem +reena1957 +reene +reeneto +reenma +reesem3 +reet +reetu74 +reeves88 +refaco +refarer +refe0004 +refer514 +reffi01 +refill01 +reflexum +refrain +refref +refresh +refrigerio12 +refugee01 +refused +reg +reg15loh +regalo0 +regan +regen34 +regenbogen +regenwur +regere115 +regex$3 +reggae +reggie +reggio23 +regidor1337 +regime +regiment00 +regina +regina +regina1831 +regina3010 +reginald +reginald lal +reginaldo +regine +regine1923 +reginold +region +region10 +regis +regiseg +regismustdie +registr +regli55e +regliss +reglisse +regloh +regn00 +regnar +rego1966 +regomello +rehabcity +rehabdoc +rehavital +rehm1885 +rehn +rehn +rehn1995 +rehwinkel1 +rei0607 +reiGN1 +reibach +reich +reich33 +reichenburg +reichler +reid +reignover +reihino +reij648 +reiki111 +reiko +reimer +reimmalf +reinaldo +reinbeis +reinbitte +reine +reine3ke +reiner +reinh@rz +reinhard +reinhard1982 +reinhilde +reinhold +reinhold9027 +reini +reini11 +reinke85 +reinlinde +reinon +reinstedt +reiruli +reisach +reiselust +reisen +reiser +reishou1 +reitclub +reiten +reiterweg5 +reitze van der +rej589 +rejuanne +rek12345 +reka +rekaemi +rekha +rekiem +rekk0922 +rekkakuski11 +rekkemrekkem +reklama +reklamer +reko01 +rekors +reks123 +reksio +rektor89 +rel1206 +rela2003 +relana10 +relapsemercy +relashio +relax +relax42 +relegate22 +relentless90 +reley777 +relfoell +relhusog +relia +reliant3 +reliantk5 +relic +relican +relicoming +reliko +relisys +relja +rellob +relooc +reloop +relox113 +relssek4 +rem0307 +rem0955 +rem1012 +rem33213 +rem3416 +rem39mer +rem62874 +remal +remark +rembys +remco22 +remd36 +reme123 +remedy +remejas +rememb01 +remember +remi +remi1940 +remifa92 +remigny +remik123 +remik36 +remikoho +remind01 +remiremi +remix133 +remix99 +remo +remorse24 +remote +remote1 +remote77 +remoterra +remove +removed3 +removeme +rempie321 +remreg +remscheid +remsrjf +remstein +remulis +remulus +remus +remusbruch +remxafoa +remy +ren +ren589 +rena0907 +rena1802 +rena1971 +rena2109 +renacide +renacimiento +renard +renard10 +renat +renata +renata +renata07 +renata69 +renataz +renate +renate +renategreta +renatka1 +renato +renato +renato75 +renatum +renaud +renault +renault1024 +renault59 +renault9 +renca7 +rencontre +rendra +rene +rene +rene0099 +rene100 +rene1309 +rene1709 +rene1810 +rene1990 +rene1991 +rene2386 +renee +renee +renegade +renegade3182 +renegades +renegard2 +renegate41 +renekei +renerene +renfr6 +rengen +reni +reni9753 +renia09 +renie +renimama +rening95 +renita +reniulka +renja +renji +renji2 +renk967 +renky0815 +rennasm1 +rennen.9 +rennie44 +rennirt420 +rennoje +rennone +rennziege +reno5gtr +renoma00 +renre +rensberg1 +renshai2 +renst +rensta +rent69 +rent757 +rent798 +rent99 +rentaro +rentie +renualt +renzo +renzodal +repagest +repairman +repelteef +repent901 +repertuar +repiove +repl04 +replicaa1 +repooh +report123 +represente +repressalie +repse1 +repsol +repsolas +reptilie +reptymrf +republica +republik1 +repus111 +repus357 +repusvga +repz +req6j678 +requingua +rereirf +rerere +rereslow +res +resal06 +resari +resat987 +resc5480 +rescue +rescue12 +rescume +resdei +reseller +reserese +reservist +reset +reshack +resi2002 +resign +resita1700 +reskaqy +resoolon +resort9 +resource +rest12 +rest1987 +rest347 +restare +restart +restas +rested +restinpeace +restiono +restoration +restricted310 +restriction +resu +resu +resul +resultsre +ret5el +reta +retaggio5463 +retard +retard68 +retard9229 +retarded1 +retardedtoot +retep0209 +retep1106 +retfloha +rethcir77 +retherford1 +rethics +retiro +retlizah +retman +retonfey +retripal +retro12 +retro1612 +retro2 +retro666 +retro9 +retroactive +retrochecker +retrosal +retruler +retry +retry01 +retta +rettiwalk +retung +return3x +retuza +reuben +reuben1609 +reuel +reusa21 +reussite +reutel1 +reutlingen +reuven +reuven +rev01t +rev0ltec +rev1 +rev1234 +rev32jam +reva +revan112 +revas +revathi +revdk +reveal001 +revealcs +revelatio1 +revelator101 +revelution +reverence +reverend +revers +reverse +reves1 +revi4896 +reviewed1 +revilo1991 +revision +revision5 +revived +revn1cov +revolucion +revolution +revolutions +revolver12 +revoxx +rewaq91 +rewindx4 +rewizja +rewop +rewop2 +rewp123 +rewships +rewst +rewted +rewwer +rex +rex2001 +rex666 +rex911 +rex9869 +rexal1991 +rexemann +rexfile2 +rexie! +rexjex +rexmortem +rexonasport +rexrex +rexstout +rexxos2 +rey +rey22 +rey97 +reyd888 +reydon +reyelb +reyhan +reym2011 +reynaldo +reynamail +reyno07 +reyw38 +reyxll +rez512 +reza +reza502 +rezept15 +rezin1983 +rezistan +reznap01 +reznor +rezplz +rezso +rezzo +rezzo002 +rf1327 +rf2crf2c +rf4ever +rf6652 +rf72p299 +rf840310 +rf92sn +rfala177 +rfala22 +rfavt +rfb2w +rfcrfl84 +rfezk +rfgecnf +rfghjt +rfgpijk3 +rfhnbyrf +rfid123 +rfkmwbl +rfkzgbcf +rfllbsb2 +rfm3aznn +rfnjckft +rfnthbyf +rfryar1 +rftrft +rfvoc +rfvtgb +rfx983x +rfybcnhf +rg +rg0797 +rg1303 +rg218bcl +rg45079 +rg99bmxr +rgXEG +rgaspar +rgc2mje2 +rgfbpg +rgfx7 +rgg4v +rghuu +rglcgl +rgmg1199 +rgnit42 +rgo93kdo +rgp00r +rgp3685 +rgpkr3zh +rgr6pup +rgrace +rgrgrg1 +rgt8wrki +rgtkxx +rgybwx0 +rh0706 +rh081062 +rh1990 +rh36gx +rh5993 +rh640128 +rh72b5 +rhadmin +rhadmin1 +rhaetia +rhapsody +rharada +rhaya +rhbcnbyf +rhbjuty +rhce0 +rhcp2005 +rhcp2006 +rhcp2333 +rhcpnow +rhdisplay +rhea +rheims +rheinheim +rhetroval +rhetta +rhff2zd +rhhux +rhifun +rhino +rhino1 +rhino360 +rhinos +rhinos12 +rhkad79x +rhkg33 +rhm9w +rhnadmin +rhoades +rhod +rhoda +rhodan639 +rhodes +rhodos +rhodos99 +rhoe01 +rhollis1106 +rhonda +rhonda +rhphp69 +rhrmiyqz +rhrqef +rhtlrfhl +rhu6yh +rhuebear +rhy +rhyme725 +rhynern +rhys +rhyse07 +rhyzen +ri0704 +ri08297 +ri12co +ri2basac +ri3564 +ri3d5 +ri9010 +ria6vke4 +rialda +riam1234 +rian +rian675 +riano +riapime +riauriau +riba +riba49 +ribbon +ribena11 +ribery83 +ribi +riboze7 +ribust +ric +ric0006 +ric123 +rica +ricard +ricard81 +ricarda05 +ricarda234 +ricardo +ricardo +ricardo1 +riccardo +riccardo +ricco +rice55 +rice7107 +ricg95 +ricgab +rich +rich1952 +rich2929 +richami +richard +richard +richard farson +richard ford +richard landry +richard mc +richard paul +richard powers +richard1 +richard1031 +richard9909 +richardd1 +richardo +richards1910 +richardson#1 +richardt82 +richem +richen +richest +richey +richi +richi10 +richie +richmond +richmond132 +richter +richtig +richy +ricis +rick +rick +rick lee +rick1234 +rick1981 +rick33 +rickardt3 +rickey +rickhead1 +ricki +ricki16 +rickigirl +rickiti +rickmave +rickmon22 +ricko2 +rickrude +ricky +ricky210 +ricky72 +rickyzz +rico +rico +rico77 +rico8205 +ricoh200 +ricola4711 +ricolico +ricolol +ricorico +ricoud +rid574 +ridd +riddick85 +riddiger +riddle +riddler +ride02 +ride159 +riderteg +ridestore +ridges +ridin14 +ridtat55 +ridvan +rie +rieayla +riedel +rieka1 +riem5839 +rien2020 +rienib8m +riester +riever +rif06cms +rifah1 +rifatim +riffler123 +riffraff +rifk +rifkl0zi +rigewula +riggers1 +riggs +right +rightandleft +righteous +righto77 +rightpw +rightthing +rih36 +rih56xit +rih72kun +rihmsk +rihuaqb9 +riicky +riight +rija +rijeka01 +rijeka51 +rijk +rik +rik123 +rikakoh +rikalove +rike +riker +riker21 +riker6693 +riki0427 +riki7 +rikis4 +rikiya +rikke +rikketik +rikki +rikrof +rikrok69 +riksa123 +riku23 +rikyu12 +riley +riley1 +riley101 +riley666 +rileyhoe +rilray +rim59qah +rima +rima1960 +rima45 +rimalto +rimas +rimasm +rimben +riminder +rimmer3826 +rimsidi +rina +rinajonah +rinale +rinat13 +rincewind +rincewind01 +rinda +rinderlan +ringawy +ringer +ringil22 +ringley +ringo +ringo +ringofstars +ringonez +ringtone91 +rinkoo +rino2004 +rinoa +rinoas +rinson +rintinner +rintintin007 +rinu333 +rio315 +riobaze +riobravo +riodoro +riojude +rioneira +riot1234 +riotriot +rip +ripclaw69 +ripdimy +ripken123 +ripken1983 +ripley55 +ripollux +rippchen +rippe06 +ripper +ripper227 +ripperde +riptide27 +riptor +ripuli123 +ripv25fc +ripyou +riri1996 +risan123 +risbar56 +rischa485 +rise +risetti1 +rishi +rishinam +risi +risiko +riskakak +risky +risnur98 +riso1921 +risou +risqb0z +risskov12 +ristas17 +rita +rita1022 +ritababy +ritch +ritchie93 +ritek222 +riton +ritschie +ritsx102 +ritter +ritter1304 +ritter30 +ritual +ritute +ritz +riv3r +riva770 +rivacas +rivaldo +rivarms +rivendel +rivendell +river +river04 +rivera27 +rivero123 +riverway +rivka +rivuqa16 +riw02076 +rix42tej +rix5 +rixii +rixosi77 +riyadi +riz4me2 +riza37 +rizado25 +rizerize +rizla001 +rizzi20 +rj277 +rj45743 +rj4923 +rj7279 +rj8016 +rjb8383 +rjcnz +rjdhjd +rjdivad +rjfectt +rjfeqtv +rjfidkvn +rjg +rjgac8 +rjhjkm +rjirf +rjitxrf +rjjvt +rjkjmdam +rjll4 +rjm2618 +rjma1972 +rjn12yjr +rjn1591 +rjpogs +rjr72465 +rjtaylor +rjtfoh +rjx9r +rjybyjuf +rk020207 +rk0em +rk118612 +rk1504 +rk159b12 +rk23322 +rka9g +rkagel +rkempene +rkf8cdt +rkfljdrf +rkfrf +rklm2233 +rkloyal +rko! +rko316 +rko888 +rkonev +rkopd +rkp89ath +rkskekfk +rkzmip +rl02099 +rl1168a +rl1417 +rl1423 +rl150779 +rl1812 +rl1971 +rl1m1 +rl5114 +rl5900 +rl@ts +rlLol +rlTf6 +rladydtn +rlb3471 +rlc123 +rlc2378 +rld220 +rleeds +rlf0d3 +rlfr0 +rlh725 +rlhaley +rljfi +rlji73x +rljnj +rljxc +rll600 +rlmtv +rlp65mk1 +rlr2577 +rltmh +rlvyr5w7 +rlxj4 +rm053 +rm13903 +rm15 +rm1902 +rm1981 +rm1nhi8n +rm258393 +rm2ui3ik +rm350 +rm41711 +rm9426 +rma3t +rmadh +rmartin +rmbh1989 +rmc +rmc393 +rmchpe +rmdrjim +rmfslmcs +rmi04sp +rmimbf +rmjcee2e +rmk92 +rml2211 +rmmfkz97 +rmog5tuy +rmoore1 +rmpn382u +rmrwr114 +rmtwjb +rmunichs +rmvFaS +rmvqgxza +rn +rnav624 +rnb +rncbdcdg +rndhpe +rnetjqj2010! +rnf43va1 +rnnrlngn +rnnzahuj +rnoyf +rnpxaz +rnrwld +rnsxb +rnul7 +rnv0314 +rnvoz +rnweed +rnzu71 +ro007 +ro1999se +ro19eb60 +ro251142 +ro270694 +ro2ro123 +ro4s3n +ro55mac +ro5ut +ro6bb +ro8om +roRock +roache +road1022 +road123 +road1977 +roadkill +roadrunner +roam2006 +roan450 +roanoke09 +roar! +roast123 +roay +rob +rob1bob1 +rob215 +rob2405 +rob2525 +rob521 +rob789*@ +robaczek +robaczeq +robaki +robal83 +robalo +robartum +robb +robb8630 +robber +robbie +robbie +robbit +robby +robby +robby17 +robbyd12 +robbyd8973 +robdianna +robekken +rober7746 +roberg84 +robert +robert +robert alan +robert buddy +robert earl +robert easton +robert emmet +robert emmett +robert foster +robert keith +robert little +robert owen +robert rueben +robert05 +robert1 +robert19 +robert62 +robert713 +robert82 +robert86 +robert89 +robertO +roberta +roberta +robertdole +roberto +roberto +roberto54 +robertog +robertrobert +roberts +roberts +robertson +robertw83 +robest +robfpo +robi007 +robi123 +robi2211 +robi6600 +robida4152 +robiibor +robin +robin +robin pearson +robin* +robin1805 +robin921 +robin95 +robin987 +robinet +robinh +robinho +robinik +robinild +robinko +robinlee +robinsina +robinson +robinson +robinson1 +robinsonorder +robla16 +robmar3 +robo2907 +robob1284 +robocop +robocop94 +robokop +roborami +robot +robot56 +robotech +robotica +robotixs +robotnic +robotron1 +robots +robots12 +robsin +robtkm +roby0221 +roby33 +robyn +robynne +rocc12 +roccatan +rocco171 +rocco67 +rocco999 +roccobarocco +roccous +roces268 +rochade345 +rochahes +rochallor +rochdale +rochdi +rochelle +rochen +rocieras +rocinek +rocio +rocio12 +rocio20 +rocio569 +rociott +rock +rock +rock*1 +rock10 +rock123 +rock2213 +rockandroll +rockbottom +rockcaos +rockcity7 +rockenya +rocker06 +rocket +rocket093 +rocketman +rocketman66 +rockets +rocketss +rockfm +rockfort +rockgirl +rockhard +rockhurst10 +rockit +rockliffe +rockmans +rockme +rocknroll +rockon088 +rockonout +rocks +rockstar +rockstar1 +rockstar2004 +rockthat +rockweb +rockwell +rockwerk +rockwood4 +rocky +rocky1 +rocky11 +rocky224 +rocky72 +rockyford +rockyjessy +rockylol +rockypoo +rocoisme +rocxane +rod +rod1rod2 +rod325g9 +rod6901 +roda +roda61 +rodd +rodde321 +roddy +rodeappel +rodec +rodef072 +rodent01 +roderick +rodin2007 +rodindone +rodion +rodion +rodja +rodlid +rodney +rodney +rodo +rodolfo +rodric red +rodrigl2 +rodrigo +rodrigo +rodrigo4233 +rodriguez +rodvig43 +rody +rodzina123 +rodzinka131 +roede1991 +roehre20 +roeiboot +roeljuni +roemsc +roeschte +roesrain +rof1o1 +roffel33 +roffle +rofi123 +rofl +rofl12 +rofl123 +rofl2k4 +rofl4580 +rofl999 +roflage +roflkopf +rofllol +roflmao +roflpantofl +roflpimp +roflrofl +rofltest +rofltime +rofltrix +rofqcgt +rofrano +roftwilm +rogattem +rogelio +roger +roger +roger06 +rogerio +rogerpatel +rogers +rogierr +rogload +rogolin +rogue001 +rogue0607 +rogue7203 +roguebam +rogues90 +roguestro +rogukan +rohan105 +rohde9999 +rohee +rohff +rohin95 +rohini +rohm1 +rohzita +roidafou +roidv +roiroi45 +roiroi99 +roissy +roj2i2dr +rojadie +rojame +rojhuyit +roji +rojitas +rojo2006 +rojo321 +rojo77 +rojorojo +rojxovof +rok123 +rok2008 +rokad33 +rokas +rokbil +rokdavid +rokeia +rokerave +rokerin +rokguild +roki9619 +rokiah +rokiskis +rokko +rokky78 +roko01 +roko1948 +rokoroko +rokosz1 +roks_2008 +rokusan +rol06281 +rol1and +rol66rod +rol82 +rolada +roland +roland +rolandchang +rolando +rolandz6 +rolas +role0602 +rolenso +rolepg +roleplay +rolex76 +rolex91 +rolf +rolfe +rolfrm +roli2927 +roll57 +roll777 +rolla +rolla221 +rolland +rolland +rolle87 +rollen +roller +rolli0809 +rollin +rollin5624 +rolling +rollingstones +rolliterra +rollo +rollolady +rollroll +rolly +rolly129 +rolly1989 +rolmat +rolnik1 +rolodex +rolofel +rolovich +rolpyr +rolter#1 +roly1234 +rom +rom081 +rom1 +rom1619 +rom26420 +rom2990 +rom828 +roma +roma +roma02 +roma173 +roma1927 +roma1980 +romafanin +romaguera +romaif +romain +romain +romaine +romainfo +romamark +roman +roman +roman171 +roman5126 +roman7 +romana +romance +romane +romani52 +romani68 +romania +romanjames +romanko +romano +romano +romano90 +romans12 +romans86 +romantel +romantika593 +romanyabeta +romario +romaroma +romashka134 +romavlad +romaxt0r +rombos +romdiwej +rome +rome1234 +rome5847 +romek +romenco +romeo +romeo +romeo13 +romeo155 +romeo2002 +romeo444 +romeo88 +romera +romero +romester +romex71 +romi +romijan +romilly +romina +romina01 +romina91 +romio +romiromi +romisek +romleouf +rommel +rommel04 +rommel81 +rommie +romney +romo +romolo +romomo6 +romoos +romper666 +romster +romuald +romualdo +romulan1701 +romulus0 +romy +romy1980 +romy2004 +romy78 +ron +ron +ron1 +ron2812 +ron3882 +ron8122 +rona +ronahi74 +ronahi98 +ronak +ronald +ronald +ronald111 +ronaldo +ronaldo9 +ronalu +ronan +ronc67 +ronconee +roncorry +rondas +ronde21 +ronder +rondo +rondo +rondra +ronee +rones21 +rongolala +roni143 +roni1993 +ronimorag +ronin +ronin237 +ronin61 +ronit +ronja22 +ronjaronja2 +ronmotis +ronnie +ronnie +ronnie claire +ronny +ronny12 +ronnyd +ronnygoo +ronoloa +ronvauxx +ronwallace +rony +rony3323 +roo420 +rooboy99 +roodle69 +roody123 +roofio +rookee +rookie +rooknov +roolz +room112 +room21 +room210 +rooms011 +rooney +rooney +roooms +roope69 +roopess1 +roor1234 +rooroo76 +roos +roosen +root +root1 +root123 +root1234 +root1364 +root3480 +root5512 +root57 +root75009mdl! +root789 +root892 +rootas +rootbab +rootbeer +rootbeer08 +rootciel +rooter77 +roothack +roothwg +rootkill +rootkit +rootnano +rootoff +rootpass +rootpwd7 +rootroot +roots69 +rootskill +rootstump +rootworld +rooxai4y +rop42sol +ropa001 +ropalmie +ropeor +roperroper +ropert +ropi1 +ropniak +roptawei +ropz8 +roqaapcg +rorasara +rori2000 +rorian +rork2002 +roro2001 +roro55 +rorock13 +rorschach +rorshac1 +rorvik10 +rory +rory1992 +ros +rosa +rosa +rosa5565 +rosalba +rosalee5 +rosaleen +rosalessy +rosalie +rosalind +rosalinda +rosalvo +rosalyn +rosamond +rosamund +rosana +rosanegra89 +rosanna +rosanna +rosanne +rosaria +rosario +rosario +rosarot +rosaura +rosava +rosbif90 +rosco +roscoe +roscoe fatty +roscoe lee +rose +rose +rose marie +rose123 +rose3bud +roseanne +rosebudts +rosel +roselia +roseline +rosella +rosemarie +rosemary +rosemary +rosemoon +rosen. +rosenbaum62 +rosenda +rosenhirn +rosenjo +rosenkater +rosenrot +rosenrot8407 +rosepoint +roser +roserose +rosesword +rosete +rosetta +rosette +rosewood10 +roshan +roshini +rosi +rosi12 +rosi1284 +rosi2005 +rosi9 +rosiak14 +rosilawati +rosilind +rosina +rosine +rosine159 +rosinia123 +rosita +rosita +roska1 +roskis +rosl +roslamak +rosmery +rosnowo6 +rosolina +ross +ross +rossana +rossana san +rossano +rossc1 +rossgo +rossi +rossi +rossi051 +rossi46 +rossitsa +rosso +rostlaube +rostock70 +rosty0 +roswell +roswitha +roswitha +roswitha2905 +rosy +roszman +rot22 +rot3kcao +rota +rotadima +rotation? +rote3we4 +roteiro2 +rotfl23 +rotget +roth2010 +roth3000 +roth4 +rothaus +rothmans +rotho1 +roti45 +roto2320 +roto7391 +rotomach +rotop2 +rotsachtig1 +rott55 +rottencabbage +rotterdam +rotterdam1 +rotuj72 +rotweiss +rotzer1 +rotzfotz +rotznase +rou648te +roubaix +roubaix4 +roudaut +roufoimu +rouge1015 +roullezz +roundandround +roundlake +rousinn +rousseaux59 +route321 +route66 +router +router1987 +rouven +rouzijs +rovekate +rovela +rover1999 +rover33 +rover45 +rovercar +rovina18 +rovira78 +row59rop +rowado +rowan +rowan2596 +rowder1 +rowdy +roweco +rowell76 +rowely +rowena +rowena +rower22 +rowerek3 +rowit +rowley83 +rox +rox2007 +rox5d +roxaclub +roxana +roxana +roxana00 +roxana25 +roxanna +roxanne +roxas1205 +roxas333 +roxessio +roxette2004 +roxi35 +roxie30 +roxiroz +roxmisox +roxor123 +roxors11 +roxorzer +roxrox1 +roxside7 +roxur777 +roxxxor +roxy0707 +roxy3401 +roy +roy +roy50guq +royal +royal123 +royalart +royalcoder +royalcouncil +royalthomas +royaume +royce +roygiriq +royhan +royke1 +roz +roza +roza1946 +roza85 +rozelle +rozelle +rozerin +rozsika +rozvihan +rozwoj +rozxuraq +rp547841 +rp5918 +rp95baby +rpartida +rpbtp +rpc94w +rpdkwnmv +rpdnet +rpg +rpgmaker +rpkbb0f1 +rpleech +rpln1957 +rpmhop +rpmrpm +rpnxy +rpo351 +rprod99 +rprog2 +rprp1234 +rprprp +rptxfc +rpyrpy44 +rq358st +rq93kxzn +rqA +rqd7y3zx +rqhpwy2 +rqi6paww +rqiedbss +rqltc +rqnudel +rqzmrxlz +rr010301 +rr0ftn +rr123456 +rr243897 +rr24964 +rr251210 +rr489a +rr77dd77 +rr87mub5 +rr93age +rr9vem +rraammii +rrandy +rrcferdi +rrd296 +rreiber +rrer69 +rreuqgk2 +rrf007 +rrflj +rrmojca +rroaring +rroc +rrpvp +rrq12 +rrqbt +rrrrr22222 +rrrrrr +rrrrrrrrrrrr +rrt +rrtgroup +rruuddii +rrvv +rrx35hk7 +rs1255 +rs12tu34 +rs13kl +rs16 +rs190552 +rs20398w +rs2091 +rs4 +rs456321 +rs4x4 +rs5899 +rs8751 +rsa5599 +rsadmin +rsalazar2010 +rsauce +rsaurier +rsb5263 +rsc4ever +rscarsca +rscom57 +rsctrsct +rseqvomp +rserse +rsfcrl +rshbby +rshiel +rshikh +rsiah +rsimal09 +rsiman17 +rsjnj +rsk0800 +rsk416 +rsm3y +rsml +rsportH +rsqvt +rsr997 +rsrlz +rssp +rst589 +rstuv0x +rsurge +rsuswi63 +rsvp4wjj +rswami +rswclan +rszgq +rt +rt00176r +rt1000 +rt1808 +rt1r6 +rt300xy +rt34poi09 +rt6699 +rt6952a +rt78fvbn +rta +rtawil +rtb300 +rtcuqsjf +rtcwstar +rtdlo56t +rtdrtd +rtedgg +rterwe +rtf90asd +rtfmm123 +rtfyl12d +rtg123 +rtg9pt +rtgwi +rtj1009 +rtklom +rtl200 +rtlmop +rtlqh +rtmsf +rtp740 +rtpoop +rtppk2u6 +rtqc535 +rtr67nlf +rtr944a5 +rtsms +rtt156 +rtuhpq +rtuscala +rtvbnj43 +rtx35b +rtxT9kwXsys +rtxx316 +rtzgvfr +rtzjhgfc +ru336204 +ru4477ff +ru4ul4 +ru88in +ruDAdm +rub0vuxa +rubashag +rubber311 +rubberducky +rubbermaid +rube +rubelchen +ruben +ruben +ruben7196 +rubenelia +rubens +rubh1234 +rubi +rubicant7 +rubikon +rubin +rubin123 +rubin130 +rubinas +rubinho3595 +rubini2 +rubiwan +rubix1337 +ruby +ruby +ruby0908 +rubychef +rubygem +rubyred +ruck +rudarel +rude1979 +rudeboys +ruderude +rudesis +rudevil +rudi +rudi1989 +rudi286 +rudi33 +rudi90 +rudibr +rudiger +rudinus +rudolf +rudolf8864 +rudolfbc +rudolph +rudolpho +rudolpn +rudy +rudy del +rudy04 +rudy102 +rudy1709 +rudyboy +rudzki11 +rue +rueathat +ruebenglueck +ruecken100 +ruedacon +ruedi +ruediger +ruedupif +ruegen +rueli +ruepel +rufe +ruferto +ruff1s +ruffi +rufflesnine +ruffruff +ruffwood3 +rufguhew +rufi7811 +rufina11 +rufino +rufu5 +rufus +rufus109 +rufus697 +rufus74 +rufus990 +rug0811 +rugej58 +ruger +ruger01 +ruger223 +rugg1701 +rugge51(valle) +rugger2593 +ruggero +rugrats +rugrats1 +rugtezed +ruhareid +ruhruh +ruhsar +rui +ruicruz +ruiner616 +ruion911 +rujy8 +rukishi +rukiye +ruknic52 +ruko27 +rukus110 +rul0r +rula1976 +ruleacid +rulez +rulez92 +rulezkk +rullez +rullo +ruloff +ruls1k +rulsch +ruma +rumen33 +rumeysa +rumi654 +rumideia +rumkugel +rumlolen +rummel +rumoku +rumpel64 +rumpel9 +rumtz +run3ata +run9351 +run97470 +runa +runand +runar123 +runat +runaway +runaway5 +runaways1 +rundat4159 +rundofin +rundog1 +rundown9323 +rune +rune360 +rune59 +runekora +runepk +runeruda +runerun +runes +runes3 +runfree +runglawan +runinfos +runing +runing12 +runjhuns +runner +runnerup25 +running +runprogram +runricky +runrun +runup +ruotino +rupdomez +rupel1 +rupert +rupert00 +rupert1023 +rupert7419 +rupert83 +ruperto +ruppia +rupveqiz +ruqtadaz +rurari +ruriko +rurili +rurnikas +ruroni +ruru2002 +ruru2004 +rus12345 +rus4444 +rusek1942 +rush +rush +rush0011 +rush99 +rusher +rushlimb +rushlyn1 +rusho +rusich88 +ruskirok +ruslan +ruslan01 +ruslijab +rusmo089 +rusprus +russ +russ +russ3651 +russano +russel +russell +russell +russenweib +russian +russie +russinbulle +russn +russty +rustavi +rustee1614 +rustem +rustoned +rusty +rusty005 +rusty1 +rusty1984 +rustyboy +rustyhilt +rustytop +rut +rut15hep +ruta +rutanya +rute +rutger +ruth +ruth elma +ruthelma +ruthenium +rutherfj +ruthie +rutka123 +rutowski +rutra93 +rutten +ruudjeh +ruuska951 +ruveysa +ruwach91 +ruwmetez +ruy38 +ruzafa +ruzena +ruzgar21 +ruzica +rv5835 +rv72006 +rvans1 +rvc4m +rvd457 +rvdfhspi +rvdt +rvdv87 +rvf16z +rvf6n +rviov1 +rvjyw +rvkb2007 +rvmlrof +rvn47 +rvn61 +rvrsoft +rvtid +rvydo +rvzpdqg8 +rw141815 +rw1lunop +rw22zqcf +rw2k04 +rw326001 +rw551155 +rw6104 +rwad1805 +rwaijhqi +rwc123 +rwd95tvv +rwde8312 +rwefcgnp +rwerwe +rwg5o +rwin0913 +rwm2804 +rwm4n +rwnt1212 +rwqab +rwr2001 +rwss123 +rwt777 +rwvmnlnt +rwwbuw +rwxd4b +rwzpiude +rx117733 +rx265389 +rx6666 +rx72pT +rx8z3 +rxa1zdam +rxage +rxd550 +rxdjlg +rxfwqvv +rxg2v +rxi5p +rxj972 +rxjh2007 +rxmul +rxn5ag9 +rxnhvmyt +rxqnabw9 +rxrm6p4n +rxrxrx +rxssrgwj +rxvapz +ry0204 +ry55u6y8 +ryall +ryan +ryan +ryan1985 +ryan2205 +ryan9494 +ryanaxel +ryanbarry +ryancel +ryane75 +ryanfont +ryanhaines +ryankarl +ryanm123 +ryanryan +ryanryanryan +rybaby +rycerz +ryche33 +rycher6943 +ryden1234 +ryder +ryel3 +ryen1990 +ryjgbr +rylanjoseph +rylaowu +ryle007 +ryley03 +rylistic +rym2506 +rymbeach +rynerson69 +ryo +ryoko +ryoko3d +ryokowolf +ryoma1938 +ryonju +ryota +ryphen1 +rypunua +ryry12by +rysenok +rysiu1948 +ryssland1 +ryssland91 +rystro +ryszarda +ryt3c1 +ryt8811 +rytas +rytas123 +rytass +rytis1 +ryu +ryu1r +ryu335 +ryudo +ryuichi +ryuken +ryukku23 +ryusui +ryutara +ryyann +ryzard +ryzom5 +rz110877 +rz205drz +rza2gza +rzeznik1984 +rzml +rzor7 +rzpm6 +rzs903en +rzw7nhlj +rzym753 +révolte +s +s00700 +s0091649 +s0114223 +s021pcc +s03413 +s03T4 +s03T4l +s040916 +s04161986 +s053185 +s05lubs +s06089 +s0622 +s0815r +s0839028 +s0920166 +s0beit +s0cc3r +s0heil +s0k0nek +s0kpca +s0l00304 +s0l4c3 +s0l4ris +s0l69m0n +s0leiL +s0mmer74 +s0nic0ne +s0r0s3x +s0raresh +s0t9e0f5 +s0u5n0e +s0undx +s0urm1lk +s0v9d0l5 +s0w00d +s0xy00 +s1005777 +s10a69 +s110667s +s1111111 +s11211121 +s12345 +s123456 +s123456s +s123ha +s12700 +s129360 +s12t1987 +s1363b +s136988 +s13795b +s13795s +s141523s +s14399 +s145350 +s14a +s15792 +s168 +s16p243i +s172000 +s187203 +s1a2y3a4 +s1adxt5 +s1arah +s1brocks +s1ck01 +s1cr0d0g +s1d3walk +s1e9t8t3 +s1ebu +s1l2y3 +s1lv3r +s1lverec +s1lverstein +s1m0na +s1m2 +s1m2h3y4 +s1m7oret +s1mon +s1mpl3s +s1mpl3x +s1mple +s1mplus +s1mppl4n +s1mps0ns +s1n2i0r +s1nful +s1ng3r1 +s1njv +s1nk3z +s1o2n3y4 +s1o2u3 +s1on3d4u +s1p2f3c4 +s1qmq +s1rlovag +s1rxo +s1thl0rd +s1tr0na +s1y9r8a5 +s1zg6unl +s2000000 +s2004h +s200589 +s21286b +s218218 +s2194631 +s21sec +s2282 +s2293262 +s2332296 +s246810 +s2665578 +s270387g +s27f2d4 +s280791s +s2b9c2b6 +s2d3f4g5 +s2drocks +s2eha2ns +s2kpel +s2m8oret +s2mr15 +s2ms0k2m +s2tifa +s2vjv +s2woke +s2wq1br +s3 +s3 +s303c13 +s313na +s31ar0m +s3256899 +s32817 +s328aw +s3318s +s333d +s3353809 +s3371745 +s33ros3 +s3423fg4 +s346211 +s34sp0ng3 +s372awh +s3ash0r3 +s3cr3t +s3cuos +s3cur3 +s3cur3d +s3dje +s3ecjcb7 +s3har7k +s3hzs2 +s3jpf +s3k8g90g +s3n83j +s3ndok +s3nh4 +s3npm +s3ph +s3qhz +s3r3n1ty +s3rV1ces +s3rd4l4j +s3s38814 +s3s4m! +s3ud30 +s3xy +s3ypp +s400707b +s46p88 +s48556 +s49076 +s4c3sfny +s4d13c66 +s4ever +s4g0m1a +s4iql +s4kubou1 +s4l4m151 +s4l8e7 +s4lv4d0r +s4mst4g +s4msung +s4n4n3 +s4rcv +s4t16x9t +s4thr +s4xm1r05 +s4zgksrg +s504817k +s510300e +s512914m +s520520 +s521715q +s5224245 +s5307408 +s5522385 +s56580 +s5872071 +s5h3h953 +s5p2rx +s5w3g2w1 +s5x1ut +s605448 +s61308 +s6230s +s62594 +s62h35 +s6479049 +s6515145 +s65236523 +s65535 +s656377 +s690531 +s6930064 +s6awww +s6axj +s6ekaz +s6gy1cju +s6hvft +s6iocwcn +s6lbyo9y +s6sbfr33 +s7113249 +s72418 +s73205s +s7435d78 +s7496581 +s7511485 +s774433n +s7777c +s77j84 +s780l +s783135a +s78353 +s7878778 +s789a654 +s7929213 +s7d6cfgv +s7kc2hvv +s7or4x12 +s8037580 +s8051p +s81 +s82s4u +s8487796 +s8511005 +s8511112 +s854re +s8683625 +s8911614 +s89niper +s8dny +s8fuqekv +s8j18h54 +s8jntq +s8k10v25 +s8s25 +s8zmaz7k +s9029053 +s905c8i9 +s91163d +s9123148 +s9283d +s9340372 +s98651o +s987654t +s9fkx +s9jjs9jj +s9owq +s9r8gjez +s9rba +s9rht +sEMPER +sErvice +sHF1E +sHdW9 +sM1lL3 +sONNTAG +sOg00d +sPjMa1 +sRdiger +sSe +sT7uia +sWe3t +sa +sa-hacker +sa00sa +sa1008fr +sa110307 +sa1395 +sa140189 +sa160576 +sa1698 +sa1969 +sa196944 +sa21room +sa2223 +sa228566 +sa24ss5ss6 +sa2amnun +sa3323 +sa4ffdpf +sa5755 +sa600412 +sa6488 +sa7349 +sa798654 +sa8238 +sa8aim6a +sa9gd2ry +saNAne +saa1x5a2 +saab91 +saad +saad123 +saad1392 +saad65 +saad99 +saadet +saadie +saadon +saajan +saam +saar15 +saard +saari400 +saarinen! +saarkuh +saarneu +saasta95 +saay37 +sab +sab1209 +sab3a777 +saba1984 +saba4ok +sababurg +sabachka14 +sabado3 +sabaer02 +sabah39c +sabaidi +sabajoon +sabaka +sabamekon +saban123456 +sabandra +sabas +sabath68 +sabayon.4 +sabbat +sabbath136 +sabbi123 +sabek41 +sabelline1 +saber +saber2264 +sabie01 +sabifly +sabin4678 +sabina +sabina +sabina00 +sabine +sabine +sabine01 +sabine1287 +sabine2801 +sabinewagner +sabinex1 +sabinisa +sabinka +sabinkaa +sabinkaaa +sabira +sabira1 +sabire +sablan670 +sable6728 +sablier +sablong +sabmin12 +saboor39 +sabopass +sabor +saborea123 +sabra +sabre147 +sabre22 +sabres +sabres12 +sabri253 +sabrina +sabrina +sabrina lee +sabrina1 +sabrina2 +sabrinafischer +sabrinaj1 +sabrinaleo2009 +sabsab10 +sabse +sabuncu +saburi +saby12345 +saby97 +sacarella +sacateca +saccamas +saccharose +sacco89 +sacha +sacha182 +sachag51 +sachan10 +sachas +sacheen +sachem +sachi +sachiko +sachodi +sachou +sachse11 +sack13 +sack8330 +sacker4753 +sackjeseech +sacomme +sacq3i4c +sacred +sacredheart +sacrolol +sacupu6 +sad +sad3620 +sad3x +sada +sadakichi +sadax111 +saddahif +saddams +sade +sade1803 +sadebay2 +sadegh +sadfasdf +sadfdsf +sadff +sadhills +sadiakis +sadida69 +sadie +sadie +sadie0207 +sadie1 +sadie123 +sadiee08 +sadienic +sadikhov +sadiqps +sadist1981 +saditu +sadness +sadnils1 +sadoch26 +sadom123 +sadowski2 +sadri +sadrija. +sadsad +sadsss +sadukan1 +sadurano +sadush +sadust +saeed +saeed12345 +saeed9 +saeid +saeid123 +safak123 +safc27 +safe7834 +safem0de +safesafe +safetynet1 +safeword3 +saffron +safier +safiya +safk7 +saft123 +saft1337 +saftsack +saga +saga1021 +saga4263 +sagadap +sagamor +saganami +sagaonice +sagdalon +sage +sage1211 +sage14 +sage7598 +sagefreak +sagem1478 +sagem5 +sagesse +sagiett3 +sagitarius +sagitta +sagittarius +sagman22 +sagol +sagredo2 +sagss +sagtixah +sah22sah +sahap1 +sahar70 +sahar92b +sahara26 +saharora +sahbra +sahel93a +saher +sahib05 +sahika +sahin +sahip1 +sahist23 +sahl +sahlul +sahn +sahne0815 +sahnequark +saho +saholy67 +sahori +sahrawat +sahte +sahtiyan +sahtomos +sahunter +sai9Va +saiba +saibaa +saibon +saibot3787 +saibot55 +saichi18 +said +said abu +said90 +saida +saida86 +saidaa +saidaamor +saidenes +saiforce +sail +sail4fun +sailboat19 +sailor +sailormoon +saim1961 +saima +saimoo +sain0112 +saint +saint013 +saint4 +saint90 +saintmary +saintrose +saints9179 +sairob +saisailo +saispas +saitek808 +saiteke2 +saito01 +saitou831 +saiyan10 +saiyan1984 +saiz17 +saja1751 +sajsekoz +sajsexav +sajsld +sajt2006 +sajuni +sajus14 +saka23 +sakae +sakaihiu +sakaki1 +sakari89 +sakarindr +sakata7887 +sakda007 +sake123 +sakejade +saketo +sakgui10 +sakhr +sakicar +sakili7 +sakine +sakis18 +sakis1992 +sakis3182 +saknas236 +sakoche +sakorik +sakrami +saksun +sakti +sakura +sakura2 +sakura8830 +sakuya77 +sal +sal +sal7667 +sala207 +sala7 +sala765 +salaSANA +salaam +salaban1 +salabert57 +salac1313 +salad +saladino +salah +salai +salainen12 +salaisuus1 +salak +salak29 +salakkiz +salaklar +salam +salam110 +salam123456 +salam2004 +salam951 +salama +salama66 +salambalam +salami88 +salantur +salapao +salapas +salarium007 +salasana +salasnek +salata +salatbar +salaymeh +salaz12 +salazar +salbai +salchichon +saldos +sale023 +sale2002 +salechu2 +saleh +saleh407 +saleha +salehi +salehms +salem +salem +salem1 +salem999 +salemus +salenz +salepute +salernitana +sales +sales11 +salesware +salgoud +salida07 +salih +salih210 +salihbey +salim94 +salim96 +salimat +salimba +salimi +salimrh +salina +salinar +salinas +salino +salitos +salke04 +salkin901 +salko +salkol +salla +sallabea +salladim +sallama +salli +salloum95 +sally +sally +sally ann +sally anne +sally jane +sally1 +sally109 +sally192 +sally278 +sally3 +sally789 +sallyhund +sallys +salma157 +salmai +salman +salman +salman1 +salmar +salming54 +salmo119 +salnida6 +salo1salo +salo99 +salocin +salocin1 +salohond +salome +salomez4 +salomika +salomon5656 +salomon6 +salope +salope57 +sals1031 +salsa +salsa23 +salsa26 +salsa4all +salsasalsa +salsaz +salstead +saltarin +salter1337 +saltis +saltiv +saltmix +salty11 +salu2005 +saluki99 +salusalu +salut +salut258 +salutare +salutely +salutpopo +saluttoi +salvador +salvador +salvaiDB2 +salvatore +salvatore +salvia +salvis11 +salvo +salvo +salwani +salyyy +salzburg +salzsau +sam +sam +sam0819 +sam1230 +sam12376 +sam1306 +sam1972 +sam1gary +sam2003 +sam2006 +sam207 +sam307 +sam38559 +sam3owns +sam5 +sam58777 +sam6sung +sam726 +sam84cz2 +sam888 +samY +samaei +samah005 +samaia +samakh +samaki +samala12 +saman7 +samanta +samanth11 +samantha +samantha +samantha0258 +samantha1 +samantha718 +samapis +samas11 +samat. +samata5 +samaya +samayaya +samb3632 +samba +samba01 +samba1 +samba555 +sambal69 +sambo +sambo378 +samboosa +sambor0 +sambow +sambrona +samdougy +sameh100 +samerz +samesam +samesky +samet +samet66 +samfoot +samgii69 +sami +sami +sami0513 +sami2431 +sami3061 +sami55 +sami80 +sami9797 +samia +samiam +samiam +samiam12 +samick78 +samil123 +samiluv +samim +saminsay +samir +samir2210 +samito +samittu +samix432 +samjake +samler007 +samm +sammarei +sammee +sammel7buch +sammex +sammi +sammiesk +sammijo01 +samminus +sammissy +sammoud +sammtron +sammy +sammy +sammy kaye +sammy000 +sammy12 +sammy5454 +sammy6 +sammy6112 +sammy67 +sammy77 +samnexas +samo4302 +samo974 +samoa2010 +samoht +samoht64 +samoleti +samolot2 +samos +samouet +samovare +sampaio +sampo +samppa +sampsa89 +samra3 +samrat +samreen +samrules +samrulz2 +samsam +samsam32 +samsam90 +samsamay +samsami +samsom1997 +samson +samson +samson11 +samson67 +samsonic +samstone +samsun +samsung +samsung1 +samsung1973 +samsung2305 +samsung57 +samsungr +samtar23 +samtate +samtosh +samtour +samtron +samtron68 +samu35 +samual +samuca +samuel +samuel +samuel obiero +samuel ross +samuel297 +samuelsson95 +samuhy +samujuo +samukas +samurai +samurajs +samus14 +samus6689 +samy1504 +samy8812 +samyeli +samyjere +san +san +san+dra +san1234 +san2005 +san7hhzm +san9sun3 +sana1106 +sana123 +sana2007 +sanako27 +sanaloy +sanalsa +sanane +sanane1 +sanane12 +sanane2 +sanane80 +sananeaq +sananebe +sananee +sananex +sanapo +sanash4 +sanbiase +sancarjb +sanches12 +sanchez +sanchez1 +sanchit +sanchmur +sancho18 +sanchous +sanctuary +sanctus69 +sand +sand123 +sand5412 +sand78 +sand8990 +sandahl +sandahl123 +sandai +sandan +sandbox +sandbox8 +sandcastle +sandeep +sandeew +sander +sander30 +sanders +sanders +sandeskuala +sandhya +sandi1004 +sandi1312 +sandiego +sandineu +sandino +sandkuehler +sandman +sandmann1 +sando2710 +sandocan +sandor +sandpiper +sandra +sandra +sandra gale +sandra1402 +sandra1991 +sandra4d +sandra77 +sandrac +sandrachic +sandraich +sandralauten +sandre +sandrello +sandrina +sandrine +sandrine +sandrino +sandro +sandro +sandro1 +sandro294 +sandrock +sandu2 +sandwich1 +sandworm59 +sandy +sandy +sandy brown +sandy0675 +sandy1310 +sandykay +sandyone +sane +saneck +sanek780 +sanford +sanfrancisco +sang won park +sangai +sangaria +sangatsu +sangokas +sangoku +sangoku51 +sangreal +sangshin +sanguinis23 +sani10 +sani1705 +saniite +sanikue +sanilsanil +sanitarium666 +sanitarium88 +sanja +sanja610 +sanja87 +sanjok +sanjol +sanjolas +sanjuan +sanjuan987 +sanmael +sanmarcos349 +sanmiguel +sanmiung +sannag +sannane +sanne001 +sanne1979 +sanne3009 +sanny bin +sanok +sanook05 +sanoomas +sanosano +sanroman +sansao55 +sansbrat +sansibar1 +sansiro +sanson58 +sant +santa0402 +santa08m +santa123 +santa782 +santab7693 +santacruz +santaklaus +santamonica +santana +santanaracer +santander +santas +santi2510 +santiago +santiago +santiago gomez +santjoan +santo89 +santok34 +santony +santos +santoska +santrax +santrem +santuchos +sanurdu +sany0305 +sanya +sanyika +sanytel +sanyu +sanyu69 +sanz23 +sanzim +saol04 +saomay +saone01 +saopaulo +saorcelf +saoringo +saotome +sap0420m1n +sap61nud +sapfxp +saph123 +saphira1994 +sapi +sapirben +sapo10 +sapo2205 +sapof +sapper33 +sapphire +sapphire420 +sapphyre1 +sapqa +saquito +sara +sara +sara1234 +sara5422 +sarabande +sarabrina +saragosa79 +sarah +sarah +sarah jessica +sarah1 +sarah15 +sarah1975 +sarah2504 +sarah2608 +sarah272 +sarah2849 +sarah2k3 +sarah515 +sarahbine +sarahismine +sarahj. +sarahjan3 +sarahm +sarahp +sarahsarah +saraht +sarahw +saraja +sarajevo +saralinda +saralta +saramo +saran20 +saranrw +sarany +saras +sarasas +sarasota +saratoga2063 +saraya04 +saraybld +sarbaz +sardelka1 +sardin77 +sardinien +sardinien2 +sardukar +sarea123 +sareda +sareff +sarej1 +sarena +sargam23 +sarges +sargo +sargon1999 +sarhbe +sari +sari2002 +sariisa +sarina +sarinha +sarinka +sariole +sarita +saritf +sariuxas +sariyer34 +sarkis +sarlota +sarmad +sarman1 +sarnat50 +saro +saroma61 +sarotti1 +sarqelpox +sart57g +sartels1 +sarturn +sartz06 +saru1000 +saruman13 +saruman27 +sarumanco +sarumani +sarumen +sarzamin +sas1388 +sas1711 +sas37000 +sasa +sasa123 +sasafras311 +sasan +sasana520 +sasanqa +sasasa +sasasasa +sasasasa1 +sasaszabo +sasatr4 +sascdk +sascha +sascha05 +sascha21 +sascha25 +sascha73 +saschal +saschamaik +saschaw +saschga +saschi +sasdsx +sase2402 +saseaser +sasesa +sash979 +sasha +sasha +sasha01 +sasha09 +sasha22 +sasha6 +sashaw +sashdog +sasho7767 +sashosasho +sasiloveyou +sasima +sasithorn +saska210 +saskia +saskia cohen +saskia03 +saskia85 +sasman +sasmek +sasquash1 +sasr12 +sassas +sassek1 +sassie +sassoon +sassy +sassy1 +sassy326 +sassy7786 +sastera +sastrab +sasuke +sasuke08 +sasuke1011 +sasuke37 +sasuke49 +sasukeclan +saswatm +sat +sat +sat130 +sat1500 +sat4all +sata150 +sataan +satajet +satamun +satan +satan006 +satan1369 +satan2152 +satan665 +satan666 +satan6660 +satan696 +satan88 +satana +satanas +satanic +sataniza +satara123456 +satariel +satawneh +sateLit33 +satellite +satheen +sathid1 +sathiemo +sathit kerd +satie +satiko +satin001 +satish +sativa +satnam +satok +sator +satori4517 +satoshi +satriani +satriani! +satsat +satt1254 +sattan +satthu +satubang +saturas0 +saturn +saturn1 +saturn10 +saturn23 +saturn741 +saturn77 +saturne +saturnin +saturnino +saturnterra +satya +satyr666 +satyricon65 +sau.ber +sau02 +sau111 +sau4er +sau6son +saubercc +sauce123 +saucisson +saud2004 +saud4075 +sauer239 +sauerkraut +saufen +saufen16 +sauger123 +saugos +saul +saul0mon +saulis89 +saulius +saulosi +saulule +saulys +saulyza +saun +saundra +sauper23 +saurera +sauron +sausage +sausages +saustaffel +sautivet +sauv7777 +sauvignon +sav243 +sav3gv +sav674 +savage +savage775 +savannah +savas1986 +savast +savci9 +save2006 +save71 +save999 +saved2001 +savehsd1 +saveloy45 +saverien +saverio +saversex +savestar +savi86 +savid +savidan +savin314 +savinggrace +savini19 +savloh +savo32 +savojko +savpass1 +savvas +saw299 +saw2th +saw32007 +sawa123 +sawas121 +sawertzu +sawmasin +sawsan189 +sawsztyl +sawy +sawyer08 +sax +sax1206 +saxbios +saxgold +saxkspyh +saxman +saxman57 +saxo +saxoclar +saxophone08 +saxovts +saxpasse +saxy1231 +say0308 +say123 +saya1393 +saya3377 +sayant +sayavub +saydau2 +saydra06 +sayed1 +sayeh121 +sayers97 +sayfa256 +sayhtam +sayman +saymar372 +saynew21 +saysex6 +sayuri +sayuri005 +saz32x +sazuke33 +sb1083 +sb133126 +sb150388 +sb1533 +sb3364 +sb45tz +sb4608 +sb50157 +sb5200h +sb6m3ztt +sb75g2 +sb7900 +sb790000 +sbaf8szu +sbafo +sbap99 +sbassi11 +sbate123 +sbbg3808 +sbcue +sbe6y +sbf22246 +sbfnmyd +sbglee +sbh37qr +sbhs8137 +sbl19588 +sbluncus +sbmnwj +sbmsys1 +sbo05 +sboobi +sbpass +sbpropanzer911 +sbrimbo +sbrinzatore +sbrp8642 +sbseh +sbtt7aos +sbxp3m5v +sbxvkkl +sc +sc050270 +sc0rp101 +sc0tt +sc0tty +sc2569 +sc3107 +sc36 +sc4255 +sc5150 +sc590418 +sc62881 +sc666666 +sc7474 +sc747474 +sc762548 +sc7andy +scRunty4 +sca65877 +scaaba +scaface +scafati +scalar54 +scalascala1 +scalash +scaleo132 +scaleot1 +scalpell1 +scaly1 +scambiato91 +scamp4u +scamper77 +scampi00 +scania +scania4r +scanner +scantrax +scanzzz +scape7 +scapin +scaramouche1 +scarbae1 +scared +scarface +scarface79 +scarfu +scargate +scarlettka +scary12 +scaryboy +scarzz +scatman +scatsjkc +scave +scaven +scavenger +scawpa +scb +scbciap +scbern +scbtest +scbubble +scc11aa +scc4260 +sccs3355 +sccscc +scdlc +scdpscdp +scemo11 +scenebuy +sceptre19 +sceptre59 +sceva +scf1904 +scfcsc +scfill +scfs2587 +sch1911 +sch1alke +sch3209 +sch777 +schaaf +schaap113 +schabe6 +schach +schack4900 +schadzii +schaerf +schaggi +schakal +schaken +schala +schalimo +schalke +schalke2648 +schalke72 +schalkege +schalker +schalltag +schaltjahr +schaltung1 +schamsch +schaqe +scharfekrallen +schatten +schattenwelt +schatz +schatz07 +schatz15 +schatz82 +schatzi +schatzi87 +schauerterra +schavan +schayk +schecterc9 +schedel721 +schedlia +scheetje +schefftech +scheidung08 +schein702 +scheis +scheise +scheiss +scheiss7 +scheissdreck +scheisse +scheisse1 +schelde77 +scheppy +scherbe23 +schere +scheu1705 +scheumi +scheune +scheuni +scheuni +schiavi +schibo +schick +schicksal +schickse +schidlow +schiedel +schietzi +schiff99 +schifo2 +schijt +schiki +schila26 +schild13 +schildi +schildterra +schildu +schilla +schimmelreiter +schinken +schinnen +schiri +schisser +schizo +schlaegi +schlaf +schlafelk +schlaffer +schlagsahne2 +schlagwast +schlampe +schlange +schlappes +schlappi +schleichy +schleiden +schleie +schlesier74 +schlot +schlumpf +schlunz +schmal +schmausmaus +schmeck +schmiddi +schmidel54 +schmidt +schmit1993 +schmity44 +schmu2073 +schmuba +schmuck +schmuckalarm +schmucksm +schn3ck +schnabel +schnabelz +schnahu +schnak +schnappi +schnaps +schnaps0 +schnapsi +schnauzi +schnazzy +schnec6ke +schnecke +schnecke1501 +schnecke96 +schnee +schnee5 +schneeball +schneel +schnegge +schneider +schneider1 +schneider17 +schneise +schney +schniddi +schniposa1 +schnitzel +schnubbi +schnubby +schnubel +schnucki +schnuff +schnuffel +schnuffi +schnuffi2130 +schnuffl +schnuggi +schnuller +schnulz +schnuppe75 +schnurchel +schnurli +schnuzi +scho6666 +scho84 +schobi +schoemak +schoeni1 +schoepie +schogeil +schoggi +schoki +schoko +schola +scholes +scholle11 +schollie +schominu +schommy +schoneweg +schooby1 +school +school21 +schoolbus6 +schooz +schork3 +schorsch +schorsch58 +schorschle +schotte +schotter +schottland +schoufn +schrank +schranktisch +schraube +schrei +schreihals +schreiner +schrie23 +schroeder +schroeter1 +schrott0 +schrott123 +schrott3 +schtimm +schubert +schuby1 +schueler +schueler8 +schuhschnabel +schuld +schuldeigene +schule +schule6 +schule71 +schulerf +schulli +schulmaus +schultes +schultz2009 +schulz1997 +schumi +schumi255 +schumi45 +schumii1 +schurik +schusti +schutzengel5 +schuurtje13 +schw1975 +schwamal +schwanensee91 +schwanz +schwartz +schwarz +schwarz2009 +schwarzkittel +schwede0804 +schweden +schwedt +schweet +schwegi1 +schweigen13 +schwein +schwein72 +schweineficken +schweisser +schwelm +schweppes44 +schwerer +schwert +schwester +schwiez +schwimmer +schwindt +schwitter +schwul +sci3mef +sciak +sciarada +science +sciene +scienid3 +scientology +scierra67 +scifera +scika +scilla +scipioe4 +sciretti +sciruela +scirules +scirvies +scisci +sciscisr +scissor89 +scitc +sckl4725 +scm2108 +scmaster +scmf2005 +scmf3004 +scninja +sco3tt +scoala +scoda666 +scoey +scolopendra +scom73 +scooby +scooby01 +scooby2040 +scooby77 +scoobydoo +scoobydoo1 +scoobys +scoobysc +scoochow +scoomo +scoop +scoop99 +scoot0824 +scoot7328 +scooter +scooter +scooter9 +scootermania +scooterx +scooty +scorch87 +score147 +score419 +scoreboard1 +scorp +scorp02 +scorp1on +scorpi0n +scorpio +scorpio1 +scorpio321 +scorpion +scorpion1259 +scorpions +scorpj98 +scorpoe +scorps80 +scorpy +scot +scot04 +scotch2 +scotia2004 +scotland +scotland2013 +scots123 +scott +scott +scott0r +scott123 +scott727 +scott9601 +scotti +scotti123 +scottie329 +scottish1973 +scotty +scotty +scoum77 +scouse1 +scouser +scout +scout11 +scout123 +scout496 +scout820 +scout91 +scouting2! +scoutmaster +scouts4u +scouty111 +scov +scp1970 +scq783y1 +scqggbcx +scr0tums +scr1pt +scra2005 +scrabbl3! +scrabble +scramsaxe +scrapper +scrappy +scrappy64 +scrat1976 +scratch +scratch9 +scrdzp +scream +scream0813 +scream21 +scream4u +screem +screen +screwdriver +screwed +screwu123 +scrgm +scriabin2 +scribba1 +script +scripter +scriptodi +scriveno +scroggit +scroix06 +scroll122 +scrollan03 +scrollbar +scrolled +scrotalo +scroto +scrubari +scruff10 +scruff3440 +scruffy +scrum9half +scrvdvv +scs203157! +scsCw +scsadm +scsahhh +scscbh +scsd1234 +scsjbn65 +scswh20 +sct3ch +scuba +scuba7282 +scubax +scudetto +scully06 +scully87 +scully890 +scultror +scum1956 +scunthorpe85 +scurvyy +scus03 +scutatus0 +scveber +scvino +scyemen +scyfLs +scythemage +sd030593 +sd071386 +sd1111 +sd13dale +sd15cool +sd1978sd +sd1xnjbz +sd3656q +sd6t6 +sd98vb +sda +sda665 +sdao0311 +sdarkness +sdblader +sdd67 +sddcv +sddeef +sddl0464 +sddldz +sde +sde43w +sdefct +sdf +sdf4ever +sdfgas +sdfnokia +sdfsd123 +sdfsdf +sdfsdv3 +sdfsfsfs +sdfvbn +sdg +sdgadsg +sdgfadfd +sdgh5po +sdgnib16 +sdgv +sdhaker +sdheuy3b +sdi719 +sdiamant +sdilenni +sdingo +sdkfsdkf +sdkg0011 +sdklsdkl +sdl207 +sdladmin +sdlb7s3j +sdlop908 +sdmk +sdp4t +sdr567u +sdrif +sdrulez +sdsd +sdse14 +sdsu2009 +sdsweb +sdswhtgv +sdt7785 +sdt9n +sdtssts +sdude7 +sdums123 +sduzsi41 +sdy1398b +sdyp +se +se0189cu +se1132 +se11do12 +se1608 +se250184 +se2b7cfg +se2la3m +se311lam +se445oft +se5555xq +se7500cw2 +se781104 +se7en +se7ly4qy +se846179 +se86sc17 +seRGey +sea2007 +sea2008 +seaba55 +seabass +seacabo +seacroft1 +seadoo +seagate309 +seahorse1821 +sealand99 +sealion +sealreason +sealteam +seaman +seaman +seamus +sean +sean +sean hannon +sean o +sean1010 +sean1094 +sean1379 +sean1987 +sean8465 +seana9162 +seanieb +seanisgood +seanix12 +seanjohn +seanluca +seano +seanptc +seanrox2 +seantram +seantyas +seaquest +searay +searay41 +search +searush1 +seashore +seasickz +seaside65 +season +seasons57 +seatbelts +seattle37 +seaways +seawayse +seawolf7 +seb1204 +seb1978 +seb1979 +seb23022 +seb4211 +seba +seba26aa +seba503 +sebas91 +sebastard +sebasti0n +sebastian +sebastian +sebastian1 +sebastian505 +sebastien +sebastien +sebbe1991 +sebek123456 +sebhoune +sebie +sebieweb +sebino +sebiox +sebisebi +sebmeet1 +sebo13 +sebo92 +seboamy +seboss +seboxx +sebrain +sebruh82 +sebsta86 +sebthi73 +sebuke +sebulu +sebxsebx +sec4us +sec8r1ty +sec902 +secadmin +secaman +secap +sechs7 +seckin06 +secksii +seconda +secondbase +seconde +secondstory +secops +secosoft +secret +secret01 +secret1 +secret12 +secret63 +secret88 +secreta +secretword +secrit1 +secrsn31 +secsy +sector20 +secure +secure05 +secure77 +secure85 +secured +securite +security +security1 +secwar +sed1ti0n +sed51saz +seda1993 +sedat +sedatbaba +seddouk +sedena +sedenak +sedliak +sedmig +sedo123 +sedona19 +sedplk +sedrik1 +sedu33 +see12 +see604 +seeall +seecc31 +seeco7766 +seeder +seedplay +seedself +seegurke +seehof +seek01 +seeker77 +seekin +seekuh15 +seele +seelecta +seeleewa +seelenruhe +seelig619 +seemann +seemann2004 +seemelive +seena +seesam66 +seesaw11 +seesel anne +seestern +seeyaa +seezunge4 +sef123 +sefas123 +sefi +sefra +sefton +sefyreb +sega +sega12 +sega2929 +sega69 +segalsegal +segams +segare1245 +segbd88 +segeln65 +segne +segovia +segovia6 +segpatec +segredo +segtntd1 +segura1976 +segurin +seguro +seh638 +sehadet +sehekase +seher +seher1 +sehnsuct +sehrgay +sehrkalt +seibzehn +seidlbar +seidwitz +seif17 +seifensieder +seifong +seige123 +seigji +seiji +seila1404 +seilhac +seilram +seisa1u +seishiro +seitz1978 +seiv2007 +sejB5 +sejark1 +sejefi +sek1969 +sek68kus +sekai +sekai98 +sekas2000 +sekiagaa +sekine0426 +sekkfjo +sekmet +sekom +sekretariat1 +seksek +sektb1 +sekula63 +sel4436 +sela +selahattin +selali +selam +selam07 +selam123 +selamet +selamlar +selams +selamunaleykum +selaromj +selber +selcuk +selda +seldaa +seldpok +sele +select +select13 +select17 +select188 +select4 +selectv2 +seledkoff +selem +selena +selena +selene +selene1973 +self123 +selfbias99 +selfwind +seliasdf +selig +seligman +selim +selimabi +selin +selin12 +selina +selina +selina2005 +selinay +seliner +selito33 +sellect +selli1008 +selma +selmar +selmer +selmicro +selo71 +seloselo +selthin +seltoran +selva +selva +selvtnec +sem301 +sem8u +semah123 +semanur +semapisi +semarang +semarang5243 +semecka +semekup +semel +semicolon77 +semifinal06 +semih +semihim +semina +seminar +seminar1 +seminole +semk1966 +semka11 +semmel0906 +semmelrogge +semmesemme +semolinaubuntu +semonnn +semper13 +semperfi2109 +sempre7833 +semprol +sempron +semra +semtex010 +semyon +sen +sen1ben2 +sen6d +sena +senadh +senagt32 +senap1212 +senap1321 +senate +senath32 +senathor +senator78 +senatus +sency123 +senda +sendepoh +sendokon +sendrome +sendziuk +seneca +seneca12 +senechal +senegal +sener +senf12 +senfcreme +senfeier +seng1337 +sengul +senha +senha04 +senha3 +senhainvites +seni7634 +senichen +senih +seniunas +senizz +senk1994 +senki1 +senna1 +senna18 +senna1986 +senna85 +sennahoj +senning110 +senor +senox +sens6 +sensates +sensation +senseaw +sensei +sensei77 +sensei81 +senseless +senshi +sensilind +sensitive +sensiz +sensiz61 +sensizim +sensor7000 +sensual +senta +senta84 +sentenced +sentenza +sential +sentry20 +sentry45 +senty223 +senudsy1 +senveben +senzus +seoreign +seoul1973 +seoulkor +seow5665 +seowchew +sep11tj +sep5t +separation +sepat0ni +sepc9011 +sephirot +sephiroth +sephiroth20 +sephiroth267 +sephora +sepia +sepp +sepp1937 +sepp1966 +sepp1sepp +seppala92 +seppel0203 +sepper89 +seppi +seppl123 +seppo +seppo101 +seppold +seppsepp1 +seprom +sept1949 +sept1984 +sept1988 +sept1995 +sept1te4 +sept22aly +sept289 +september +september9 +septembre +septimus2539 +sepul1tura +sepya +ser +seradane +serap +seraph +seraphimnight +serato8049 +serbian +sercan +sercan48 +serdar +serebii +serega +serehcne +serena +serena +serenahu +serenim +serenity +serenity1 +serenity182 +serenity25 +serenity6 +sereno +serf1raz +serg1108 +serg1234 +serg1976 +serge +serge +serge henri +serge jaroff +serge08 +serge44 +sergeant +sergeant1 +sergei +sergej24 +sergejpachomow +sergent1 +serger +sergeui +sergi +sergi1985 +sergio +sergio +sergio1 +sergiopd +sergios3659 +sergiu +serguei +serhan +serhan98 +serhatne +serial +series7 +serif +serif +serios +serioserio +serious +serious1 +serjei +serjik +serkan +serkan27 +serkanbo +serkann +serkanoz +serknuss +sermarty +serok +serok1 +serolae +seron9653 +serp93 +serpant1 +serpass +serranodance +serres +serrssif +sersak +serseri +sersib +sersir +sersucap +serta2271 +sertac +sertom +sertulas +sertyui +serv3216 +servan +servant +servantesJ +server +server00 +server01 +server21 +server77 +servers +servest1999 +serveurmac +servicefh +serviciu +servo765 +servus +servus20 +serwis99 +serwus +ses4me +sesam +sesam! +sesam1609 +sesame56 +sesame69 +sesamogb +sese8891 +seses +sesifi81 +sesilson +sesmar13 +sesrip +sesshoma +sesso +sessue +sestal38 +setarkos +setec +seth +seth +seth0227 +seth0291 +seth0815 +seth16 +seth2185 +sethanon21 +sethie6 +setiawan +setigate +setiuli +setler513 +setlog +setm123 +setpass +setr8576 +setsu6 +setsuko +setsuna3 +setsuna86 +settat +setterdog +settimo7 +settled1 +setup +setup101 +seufzer1 +seul44 +seuratx1 +seutebet +sev11se +sev777en +seval +sevda +sevda +sevda789 +sevdaa +sevdalim +sevdam +sevdam16 +seve +seveN +seven +seven7 +seven7s +sevena +sevenby9 +sevenfun +sevenof9 +seventeen +seventy4 +seventy7 +sevenupp +severed75 +severin +severn +severo +severo +severus14 +sevgi34 +sevgilim +sevi +sevilia1 +sevim +seviyorum +sevmek23 +sevryn111 +sevsende +sew123 +sew46mir +sew660i +sewa23 +sewa2323 +sex +sex123 +sex1234 +sex4him +sex5969 +sex9112 +sexapple +sexblond +sexcort +sexcrypt +sexe74 +sexexx +sexfree +sexies +seximoon +seximus1 +sexopexo +sexpack +sexphh6g +sexpistols +sexpunk +sexroxya +sexs1818 +sexsex +sexshop +sextant +sexthzyp +sextime +sexualdog +sexuellrm +sexx +sexxsux1 +sexxxx +sexy +sexy3621 +sexy66 +sexy69 +sexyass +sexyboy +sexybutt +sexyer +sexyeyes +sexylady +sexylady2727 +sexylatn +sexyleto +sexyman +sexymen +sexymf +sexymoma +sexyredh +sexyskk +sexywow +sexz +seya4now +seyahmet +seybil +seydaaa +seyfi216 +seyfom74 +seylem +seyma98 +seymen2204 +seymour +seymour1990 +seyoo +sezai515 +sezaqw +sezaqwx +sezgin +sezgin13 +sf +sf0511 +sf123 +sf16258 +sf4377it +sfa1049 +sfaaa5p2 +sfabriz +sfantu +sfaradey +sfb1966 +sfd +sfd138 +sfdfgf +sfdhe78t +sfdhhd +sfdirq +sfdqo +sff2005 +sfgh12 +sfgsg +sfic2 +sfigato +sfirita +sfk99 +sflqv +sfnasty +sfnvatos +sfod1971 +sfora5905 +sforces0 +sfpl5 +sfposdfs +sfpxy219 +sfsgsw87 +sft11504 +sfv81frd +sfwwwu +sfyad +sg1630 +sg166rda +sg1886 +sg1995 +sg3ecl6k +sg5894 +sg7new4 +sg974559 +sga1075 +sgatjuh +sgc0m14n +sgc12345 +sgd14 +sgdb91 +sgdole +sgdymm +sgeao6 +sgeheim +sgfge +sgfv698 +sgfx +sghicena +sgi0014 +sgi9110 +sgirthr +sgjerek1 +sgkkkpdk +sglass1 +sgmm11 +sgno +sgo4769 +sgoc22 +sgp084 +sgpbyt +sgr2003 +sgrdaddy +sgverurc +sgwannabe +sgxeei +sh00er +sh060773 +sh080477 +sh090315 +sh0kagu +sh1111 +sh126013 +sh171294 +sh1n1ch1 +sh1sh8 +sh1shkabob +sh33p +sh3655 +sh38n32 +sh395858 +sh3uy +sh414256 +sh4k1r4 +sh4p4k +sh6syhue +sh6veb +sh8584 +sh94mkr +sha na +sha2909g +shabah +shabana +shabarap +shabgard +shabi11 +shad123 +shad2266 +shadab +shadab12 +shadai66 +shaddy +shade123 +shade662 +shade90 +shadi +shadnic +shado8226 +shadooke +shadow +shadow1 +shadow12 +shadow2385 +shadow30 +shadow327 +shadow3579 +shadow659 +shadow6753 +shadow7t +shadow831 +shadow9176 +shadowblood +shadowcat +shadowelf +shadowfaxx +shadowmp +shadows300 +shadowwalk +shadowwood1 +shadro11 +shady +shady08 +shady45 +shadyc +shadyfreak +shaerl1234 +shafey +shaft2 +shaftmaster +shageldi +shagfest +shaggenw1 +shaggs1 +shaggs321 +shaggy +shagrat +shagreen7 +shagshag +shahinio +shahmeel +shahram +shahyn +shahzadm +shai +shai4568 +shaiguy5 +shaina16 +shak123 +shakadia +shakal +shake +shaked +shakeera +shakeit +shakir10 +shakira +shakira +shakira1 +shakito +shakti +shaku8 +shakur96 +shalata +shaleba +shalfa1 +shalgamb +shalimp +shallah7047 +shalom +shalome +shaluta +shaman2012 +shaman79 +shamann +shamanrise +shamara +shamboub +shame1231 +shameem1 +shameless +shami123 +shamim1972 +shamman +shammy40 +shampoo21 +shamr0ck +shana +shanake +shandiin +shane +shane14 +shane2358 +shaneel +shanemz +shaner1210 +shanette +shaneusq +shang +shang +shani +shani +shanice +shanine +shaninja +shaniza +shankman12 +shann0n +shannan82 +shannara31 +shannara69 +shannen +shannen +shannon +shannon +shannon17 +shannon63 +shannon86 +shanon +shanshan +shanta +shanti +shanti1 +shantiserpens +shantishanti +shanty +shaogang +shaolin3219 +shaomi +shaoran +sharano +shard888 +sharda98 +shared +sharee +shareinv +sharen +shari +shari lee +sharina2 +sharise1211 +shark +shark999 +sharkbit123 +sharkey +sharkimy +sharkman +sharkoon +sharkos +sharky +sharlina +sharly +sharm02 +sharmar379 +sharmootah +sharno +sharon +sharon +sharon05 +sharp +sharp100 +sharpe187 +sharpnel +sharron +sharrwa +shartzer1 +shary +sharya +sharyl +sharyn +shashama +shashi +shashi +shasoul +shasta99 +shat +shat0n +shatbomb +shatkino +shaun +shaun2k +shauni01 +shawana +shawata3 +shawn +shawn2502 +shawn31 +shawna +shay +shay012s +shayank +shayispq +shayke +shayla32 +shayle +shayma +shaytaan +shazamm1 +shchavurska +shdjd +shdkwg68 +sheann1 +shearer +sheb +sheba +shebaak +shebba888 +sheboss +shecky +shedas14 +sheeba2231 +sheeba3 +sheeba929 +sheelana +sheena +sheenas1 +sheep2738 +sheep56 +sheep742 +sheeps233 +sheero +sheetan +sheetrock +sheffield +shehta +sheik +sheik renal +sheikhtm +sheila +sheila +sheila0821 +sheila0825 +sheila34 +sheilamaus +sheilasee +sheinsha +shekinah42 +shel1269 +shel1981 +shela1988 +shelagh +shelb4857 +shelby +shelby +shelby98 +sheldon +sheldoncooper +shelfdad +shell195 +shella +shelley +shelley +shellie +shellme1 +shellmi +shelly +shem +shema1 +shemale +shemily +shemina +shemp +shen +shen2hao +shen7435 +shengwei0906 +shenhua808 +shenjing +shental +shepard +shepard19 +shepard99 +sheperd1 +shephard2 +shepherdboy121 +sheppard +sheppb +shepperd +sheppherd +shera +sherbrooke12 +sheree +sheren21 +sherevs +sherian27 +sheridan +sheridan1971 +sherie +sherif +sheriff1 +sherilyn +sherlagh +sherloque +sherman +sherman1993 +sherri +sherrie +sherry +sherry +sherwood +shestko +shet2000 +sheva7777 +shevin +shezzley +shf2e +shfcessb +shh4ey +shi +shia +shia123 +shian0905 +shianne1 +shibby +shibby12 +shibbyman +shibumi3 +shiegen +shiekz +shiela +shield +shifraz +shift92 +shiftedmind +shigatse +shigeto +shih +shijing +shik +shiknius +shikong +shila +shila2402 +shilo5 +shiloff +shima +shimaa +shimakaze +shimara +shimen +shimkus2 +shimmer5 +shimmy +shimmy06 +shimon +shimshima +shimshon +shin +shin0305 +shin0656 +shin0815 +shin22 +shina +shinagle +shinben +shinchan +shinda90 +shine31 +shineman +shines4u +shinichi +shinji +shinji201 +shino321 +shinobi +shinobi530 +shinobu +shinorer +shinrei +shinsan +shinsuke +shinta +shintaro +shinty12 +shiny0045 +shinzen1 +shio7777 +shiori +ship +shiphead +shiprex1 +shipwreck +shiquis8 +shir +shira17 +shirak +shiranui5 +shirle +shirlene +shirley +shirley anne +shirley jo +shirley053 +shirley1 +shiro +shirwin +shiryuko +shisha +shishi +shit +shit4080 +shitara12 +shitfire11 +shitfuck +shithead +shithead1 +shithole22 +shitin +shitman +shitnip +shitshit +shitshop +shitters +shitty +shittyen +shitus +shiva948 +shivaaa +shivi1982 +shixadi +shixun1090 +shizumie +shizzle +shj27 +shkatov +shkbi +shktest +shlm0223 +shlomit +shlomo +shlomyd +shloog +shmekla +shmft564 +shmily213 +shmilyqh +shnctqxt +shnizzle +shnookie +shnorton +sho1978 +shoat12 +shobu +shock +shoeishoei +shoes +shoes1 +shoescouk +shoeshoe +shoetree +shoga +shogo +shogun +shogundude +shoichi +shokhov +shokofe +shola88 +shomar +shonadog +shonborn +shonut +shooder1 +shook up +shookem +shooter +shooting +shop +shopakz +shopass +shopenix +shopfox +shopfrosch +shopg010 +shoppass +shoppen04 +shoppen90 +shopper +shopping +shorsh +short786 +shortay +shorter? +shortpants +shorty +shorty02 +shorty1510 +shorty2 +shorty4657 +shorty8888 +shortyshorts +shoshana +shoshi44 +shot4427 +shotokai +shotokan +shotput31 +shotty +shoushou +showcase21 +shower8 +shownomercy +showstopper99 +showtime +shozzel +shpe12i +shpinger +shpnakj +shprehen +shr1mper +shrek +shrek +shrek2009 +shrek234 +shreka +shrevan +shrider10 +shriker2 +shrimp +shrk5902 +shrooms7 +shroud13 +shroud22 +shrubbery999 +shs099 +sht1010 +shtmjafi +shu0707 +shu098 +shubaka +shucks01 +shue6407 +shug +shug1966 +shuguz96 +shuha12 +shuher +shuhernl +shuji +shula +shula29 +shulgin +shuman82 +shumba007 +shunter12 +shuraga +shure +shureguy +shuriken +shurumm +shushuka +shuttle +shutup +shv4j +shved88 +shwvmz33 +shy2p +shyammas +shyan619 +shyl0ck1 +shypsena +shyshy1970 +shz25105 +si +si +si010401 +si060482 +si1122 +si210356 +si280666 +si4youth +si741564 +si90lu +sia1209 +siab123 +siafb12 +siagp2w +siam +sian +siao fong +siarkaos +siaupiau +sib9dcoh +sibalom +sibbipop +sibe4lon +sibel +sibele +siberler +sibirian1 +sibot000 +sibuscas +sibyl +sicarios123 +siccness9789 +sicde +sicher +sicher12 +sicher45 +sicher7 +sicherheit +sicherheit2006 +siciliano674 +sicilya +sick123 +sick2k +sickhead +sicknote +sicksick1 +sicle4305 +sicose +sicskate +sicsulol +sicutel +sid +sidaMD +sidalex8 +siddhartha +siddyboy +side123 +side76 +sideburns123 +sideepa +sideeyes +sidekick56 +sidekicks99 +sidemi +siders +sidewinder +sidewinder3 +sidfool +sidhu +sidi +sidmal +sidmeier +sidnancy +sidney +sidney +sidneybc +sidoniac +sidsid +sidy lamine +sie +siebel +siebels +sieben +siebren +siebzig7 +siedem73 +siedler3 +siedler7 +siefgried +siegedkp +siegen +siegenia +sieger17 +siegfried +siegfried1956 +siegfrit +sieghardt +siegheil +siegy +siehra73 +siem +siemasz1 +siemens +siemens2338 +siemens5 +siemenseq +siemka +sienarfs +sienkiel00 +sienna +sienna38 +sienpi89 +sier +siera218 +siercat +sierpc +sierra +sierra03 +sierra11 +sierrasz2 +siesie +siesseis +sif +sif68l +sifa1928 +sifon54321 +sifone28 +siforp +sifra +sifra001 +sifre55 +sig +sig +sig1rd2 +sigalm +sigaret +sigatftp +sigfrit +sigge +sigge1995 +siggen123 +siggi009 +siggi1994 +sigh797 +sigi +sigi +sigi0815 +sigi1312 +sigi235 +sigint2671 +sigipsr +sigko666 +sigma005 +sigma1102 +sigma245 +sigma761 +sigma99 +sigmabio +sigmaend +sigmasix +sigmundm +sign1296 +signa +signaL8 +signalex +signe +signo2007 +signum20 +signus +sigourney +sigrid +sigtor +sigurd +sigurd1342 +sigurd1929 +sigurddb +sigurdur +sih1t +sihaja +sihaya +sihbk +sija56 +sijak1 +sijan +sijaya +sik0904 +sikala +sikander +sikapipi +siken123 +sikerim +sikesike +sikijim +sikim +sikirou +sikk1987 +sikkens +sikkt +sikna +siko +sikor123 +sikoren +siktir19 +siktirx +sikyi123 +sil +sil1200 +sil1208 +sil582 +sil80bro +silaas +silac +silam58 +siland +silas +silas0411 +silas0711 +silas1991 +silasila23 +silber +silberberg +silbergrau +silberland +silberman +silence +silence! +silenced53 +silencegm +silencer +silent +silenthead +silenthl +silenthoof +silentia +silentium +silesia +siletly +silhana +silic0n +silicon3 +silikal +siling +silja2801 +silk +silk1296 +silkbundle +silke7 +silke85 +silkeagnes +silkes +silkil +silklegz +silkp +silkwolf +silky +silkyfairy +sillage +sillar09 +sille1993 +siller14 +sillesille +sillfer +silly88 +sillyiwe +silmarillion +silo1181 +silodon +silolila +silomat +silsolo +siltanen +siluck +silvaco +silvagni +silvaletti +silvan666 +silvana +silvana +silvanam +silvano +silver +silver +silver0418 +silver1 +silver1! +silver14 +silver1868 +silver21 +silver22 +silver2204 +silver4 +silver7 +silver95 +silverado76 +silvercat +silverdale +silverhand1 +silvern1 +silversting +silverstorm +silvertree1 +silverwolf +silvet +silvia +silvia +silvia45 +silvia69 +silvia74 +silvio9392 +silviona +silvisex +silvita +silvy47 +silwer1 +sily11 +sim2001 +sim9akhe +sima1212 +simacostel +simadmin +simala +simart +simba +simba1175 +simbadog +simbas01 +simbatay +simbazz +simbf88 +simbian1 +simbolyc +simbu2 +simbular +simco23 +simdrive +sime1947 +simeon3s +simeonovo +simgadom +simhome +simi06 +simi1974 +simisai +simkin10 +simmba6662 +simmdawg +simmons +simmy +simnova +simo +simo4321 +simo6969 +simomoni +simon +simon +simon. +simon09 +simon123 +simon2302 +simon777 +simon8304 +simona +simonafe +simonas +simonb +simone +simone +simone2555 +simone85 +simoneal +simonetta +simoneva +simonp5 +simonsays +simonsimon1 +simontee +simp +simpel2712 +simple +simple! +simple! +simple1 +simple64 +simples12 +simplet +simplet +simplex6 +simplypissed +simpsons +simruquj +sims1220 +sims14 +simsalabims +simsary +simsek +simshttp +simsim08 +simsom +simson11 +simsontuner +simtom +simtom11 +simulation +simulus1 +simuska +simzim2 +sin123 +sina +sinaah13 +sinabita +sinaco2 +sinan +sinansinan +sinara1983 +sinasina888 +since1923 +sincity +sinclair +sindar +sindee anne +sindikat +sindragoons +sinds1913 +sinead +sinead +sined +sinera07 +sinergy +sinetron +sinful420 +sinfulgirl +singaa +singapore +singe +singer +singer1264 +singh +singh +singh9381 +singing +single +single80 +singless +singleton +singrida +singulus +sinhvien +sinidodo +sinikka +sinisa +sinist3r +sinister +sinjin +sinkamba +sinkunas +sinletmein +sinmanos +sinmax +sinned +sinned1 +sinner +sinnvoll13 +sinot16 +sinovaka +sinoxlve +sinside +sintar +sintflut01 +sintia +sinuhe +sinyo123 +siobhan +siocor +siomi20 +sion tudor +sion45 +siouxfalls +siownage +sipacute +sipe91 +siperikas +sipil +sipil94 +sipke01 +sipot +sir +sir cedric +sir guy +sir harry +sir john +sir ralph +sir08mew +sir6735 +sira15 +sirachus +sirajo +sirama +sirap10 +sirchris +sirene +sirge123 +sirhack +sirhanry +sirhoyt +siri +siri123 +sirikira +sirikwan +sirion +siripen +siriporn1 +siriso22 +sirisuda +sirius +siriwat +siro1988 +sirobp +sirrush +sirschrat +sirt7awa +sirtaki +sirterra +sirto007 +sirun +siruquot +siry2075 +sis12009 +sis8mvgj +sisa +sisash3 +sisco +siscu +sisemen5 +sishuang +sisi +sisidra +sisilke +sisior2 +sisko +siskot0 +sislinet +sisse +sissi111 +sissis9112 +sisslan +sissy +sissy03 +sist24 +sistem +sistemas +sisterdesign +sisterhanna +sisu699 +siswa +sisxawuf +sit098 +sita666 +sitakas +site1112 +site1122 +site1234 +site2 +site2299 +site4you +sitecom +siteman +sitepainterweb +sitevertrieb +sith98 +sithlord +sithraven +sithx123 +siti1234 +sitos1991 +sitoxer +sitrep226 +sitsiofg +situstep +siuemens +siul9586 +siup6fla +siurblys +siurek13 +siv +sivad6 +sivari85 +sivaslim +siverts1 +sivil +siwek11 +siwy113 +six +six0r +sixcube +sixd +sixers05 +sixfoot3 +sixgun +sixletters +sixner +sixpack +sixpack911 +sixsix +sixstring +sixten +sixten0575 +sixten23 +sixto +sixty33 +sixty39 +sixty996 +sixxby9 +siyabend +siyadhu +siyitsai +sizedown +sizething +sizfikc +sizopabe +sizzoB +sj168520 +sj1m6 +sj2500 +sj348 +sjanah59 +sjanek +sjanina +sjaubu +sjb6592 +sjd123 +sjeffie +sjeng102 +sjettal +sjeufke1 +sji7788 +sjipning700 +sjlmccja +sjlusen +sjnm2kru +sjo1tt +sjogren81 +sjohn2k5 +sjokolade321 +sjq20006 +sjshark +sjsmit52 +sjuchka +sjunga99 +sk100178 +sk1234 +sk161220 +sk1979ba +sk1k1ty +sk1lager +sk2000 +sk3072 +sk4t1st4 +sk561024 +sk69psw +sk6aa +sk7mtdfe +sk84fun +sk8b0ard +sk8board +sk8er14 +sk8isgr8 +sk8life +sk8wax +ska565 +skabelon123 +skadmin +skafle +skaforum +skaganja +skaing8899 +skakavac +skakta +skal +skala55 +skalman990 +skalpell +skamak +skamander1 +skamctug +skame +skamp007 +skand13 +skandal +skandi +skankn00 +skansen1337 +skanskan +skarin82 +skary +skat3r +skat666 +skata +skata098 +skatan86 +skate123 +skate1996 +skate411 +skate76 +skateboard +skateboard1 +skateboarding +skaten +skaten0 +skaten88 +skater +skater0 +skater1 +skater10 +skater2 +skater85 +skates +skating +skatingz +skatta501 +skaven +skay1997 +skaylife +skazi +skc123 +skdbsk +skdn0H +skedar1 +skeet12345678 +skeetie3 +skeets +skeezer1991 +skejtak +skekino +skelda01 +skellingt0n +skelton +skentini +skeppis13 +sketch3073 +sketis +skezza +skfn7y3 +skfwk9 +ski239 +skibidab +skidoo +skidooer709 +skidrow +skiffex +skifff +skiing +skill +skill0r +skill1 +skill123456 +skilla1 +skille123 +skillet15 +skillet54 +skilling96 +skills +skillskill +skillx6 +skimble.7 +skimldf +skin88 +skinhead +skini88 +skinner +skinney ennis +skiowa +skip +skip001 +skip1178 +skipas +skipjsf +skipper +skippy2006 +skipster +skisnow +skistud1 +skit2114 +skitch +skitch99 +skitens +skithek2 +skitolle +skitormz +skitsoe +skitter90 +skittle +skittles +skitzo1 +skitzoid +skizoman +skkbio79 +sklave +skm10 +skm9xbmq +skmechef +skmmj914 +skoalls +skoda706 +skola190 +skolan1993 +skole44 +skolevej23 +skooba3 +skoog9411 +skoolbus +skoolhac +skorek1 +skorpian4 +skorpio +skorpion +skorpis +skorte1 +skorupka +skory123456789 +skosian1 +skotrulz +skovlunde123 +skowronek +skowyra1 +skpc04 +skrapid +skratt123 +skriskri +skrocken1234 +sks +sksclan +skserver +sktjsal5 +sku5493 +skua5547 +skubidu +skuisi715 +skuler +skull +skull219 +skull80 +skullfire2 +skully +skunk +skunk3321 +skunky +skupload +skurczens +skurri2 +skurwiel +skurwysyn +skurwysyn +skusim +skutte +skvarka22 +skvpg +skwp9 +sky +sky2hebe +sky500 +sky666 +sky7070 +sky8817 +skyalex +skyangel +skybug1 +skyclad1 +skydive79 +skydning01 +skye2012 +skye2107 +skye92 +skylab +skylar +skylee14 +skyline +skyline1801 +skyliner +skyload +skypop +skysky99 +skytomb +skyvis99 +skywalker +skywe2008 +skzj9 +skzm2a +sl032182 +sl0thr0p +sl1000 +sl1ckst3r +sl1lpis3 +sl30555 +sl42lj +sl4ck3r +sl7868 +sl@shd0t +slack +slacker +slacker520 +slacker87 +slackrlz +sladd1234 +slader +sladest +sladkaja +sladoled +sladur4e +slam23it +slamdunk010 +slamers1 +slamet +slammand +slammed098 +slane101 +slangee12 +slanger1 +slanina123 +slap2k +slapjack00 +slapjw +slappin123 +slappy +slapqm +slapshot +slaptas +slash14 +slash2424 +slash336 +slash68 +slash96 +slasher +slat23 +slatt +slatvseh +slaugter +slaurel +slav4o +slavas +slave1 +slave4xb +slavec +slaver15 +slaveto +slavie +slavka +slavko +slavko1 +slawa +slawek123456 +slawka +slawter12 +slay1980 +slayer +slayer13 +slayer363 +slayer66 +slayeris +slayerko +slayerr +slayerrt5 +slayers +slb6767 +slberg +sldk6412 +sldpop1s +slec700 +sleck91 +sledman +sleegers82 +sleep +sleepers +sleepwalker +sleepy +sleepytime +sleipnir1 +slessek +slet +sletslet +sleutel +slev5000 +slewww +slfcr200 +slfig81 +slicc6 +sliceu +slick1975 +slickster +slicky +slider +slider +slightlymad +slikeris +slikken +slim +slim +slim112 +slim1122 +slimbisi +slime993 +slimer +slimjims +slimline +slimmer16 +slimpies +slin7891 +slinger76 +slinkey +slip12 +slipcoat1723 +slipdc +slipkn0t +slipknot +slipknot857 +slipkorn +slipkorn9994 +slipmat +slipper008 +slippery78 +slipperynipple +slippinn +slither +slitif +sliva +slivata +sliver321 +slj2005 +slk55amg +sllim +sllxms +slmhosti +slmoitv +slniecko +slo11111 +sloane +slob2rob +slobberchops14 +slobjov +slobodan +sloboden +sloboz +slodka16 +slodka23 +sloeber +slofest +slogan120 +sloidd +slojno +slomka1 +sloneczko6 +sloniha +slonik85 +slonko29 +slons +sloper99 +slopez +sloppy +sloppyjo +slotech1 +slothy +slovar +slovenia +slowek07 +slower +slowi +slowinski1234 +slowpain +slp14q +slpbp +slqju +sls19882 +slsl7868 +slucham1 +slugger1 +sluggerkv +slugster +slunce01 +slunjko +slurpee +slurt +slwbwt2d +slxxa +sly464 +slyfer +slyfox +slzo101 +sm041063 +sm0ke1 +sm0oth +sm0rty +sm10595 +sm1274sr +sm1414 +sm17283 +sm1b1 +sm200879 +sm2703 +sm4857 +sm62612 +sm6741 +sm6gzl +sm722 +sm750p +sm753dfx +sm7864 +sm989786 +sm9ile +sma +sma3 +sma5710 +smac2c +smach13 +smachead +smackd0wn +smackdown +smacmic +smaffy +smaffy1 +smaffy11 +smail05 +smak1987 +smaka2002 +smal +smalikes +smalkar +small24 +small66 +smaller +smalltalk +smallville +smallz44 +smanc72 +smansa +smarna500 +smart +smart1 +smart140 +smart93 +smart941 +smartcdi +smartemr +smartftp +smartie0 +smarties +smartisar +smartlib +smarty +smarty82 +smasdsu +smash59 +smash96 +smashed111 +smashhopper +smasterk +smb2000 +smbbros1 +smbsmb3 +smc +smcanard +smdr7421 +smeac2111 +smeagol06 +smeagol3 +smeargle +smec1 +smecks +smeenk75 +smeerlap +smeg +smeggs +smeghead +smellitnoob +smellor1 +smenipass +smer141 +smeraldo88 +smerf789 +smergol +smero1 +smetsys +smf492 +smfeq +smg4ever +smgrules +smh1256 +smhdg123 +smhsbff +smi0104 +smidgen7 +smidt021 +smiffee +smigel +smiggy0 +smile +smile04 +smile05 +smile12 +smile14 +smile41 +smile66 +smilenow +smiley +smiley +smiley6 +smilez21 +smilla +smilla62 +smilodon +smily2112 +smimi911 +sminks +smirnoff +smith +smith +smith111 +smith1879 +smith95 +smithSon +smithi291 +smitty +smitty13 +smkuaa +smm_100250 +smmat123 +smmp2pve +smmr6693 +smnews +smobi467 +smoefel +smok01 +smoka666 +smoke +smoke123 +smoke2000 +smoke420 +smoke4me +smoke5183 +smokeit +smokeme +smoker19 +smokers99 +smokey +smokey +smokey05 +smokey1210 +smokey16 +smoki +smokie +smokinass +smoking +smolaczek +smolarek +smooch148 +smoogle +smoon235 +smooons7 +smoothie +smoothie777 +smor2ger +smor567 +smotan +smotty1 +smouy +smp001 +smp0856 +smr04 +smr1963 +smrann +smreo11 +sms +sms3000 +sms911 +smsa93 +smscan +smsm +smsnet75 +smstender +smt13g +smtpnl +smudge +smudgean +smudgeone +smudla +smuka4a +smuknx +smuld010 +smulhim +smultron1985 +smurf1 +smurfas +smurfenq +smurfl +smurfman +smurfs +smut69 +smuts99 +smutter1234 +smv21 +smvjfr32 +smwanl +smwid +smy1905 +smylie1983 +sn00gins +sn00kums +sn00py +sn0wbugs +sn0white +sn120200 +sn121587 +sn1ckers +sn3162 +sn3qjrwb +sn41008 +sn427582 +sn4321 +sn4tch +sn59kkwo +sn716368 +sna321 +snabbare1 +snad1 +snafu100 +snagg666 +snaiper +snak951 +snaka +snake +snake101 +snake123 +snake155 +snake309 +snake7377 +snakeben +snakeboy +snakeeye22 +snakemok +snakes +snakesnake +snamon +snap144 +snap1985 +snap2002 +snape! +snapefan +snaper +snapey81 +snapme +snappe1 +snapper +snapper647 +snapple +snare7 +snaredrum0 +snarf +snarf1 +snarkomat +snarling85 +snausages +snave8 +snbBfZYw +sneak82 +sneaky +sneakz0r +sned8142 +sneetch11 +snehurka +snejana +snemeis0 +snezana +snibbles +snic7912 +snicelis +snickers +snickers6 +snidam +sniff2092 +sniffer +snigel19 +snigelko +snikpoh1980 +snikt +sniper +sniper151 +snitz +snitzel +snivvy +snj1141 +snk +snkmtdrw +snkv +snl2snl2 +snl48o +snlismad +snm1015 +snmddxaw +snn4rop +snofla1 +snooby +snooker1 +snooky60 +snoopek +snoopie +snoops99 +snoopy +snoopy17 +snoopy4711 +snoopy57 +snoopy622 +snoopy8197 +snop +snoppstopp +snopy1 +snorgins +snorkel +snorkey2 +snorre148 +snort1 +snorunge +snotdude +snotunge +snoupdog +snoveris +snow +snow +snow teow +snow1111 +snowball +snowbird +snowboard +snowboarder +snowboarder777 +snowing11 +snowking9069 +snowlite +snowman +snowremo +snowws +snrub +snsaf +snse180 +snsshvdl +snub +snuben1981 +snuca05 +snuckle +snucky55 +snuff +snuffel1974 +snufflebubble +snuffles +snuffles350 +snuffy +snuggler +snuggles08 +snuitje +snujnqfa +snurre +snus2492 +snussnussnus +snutten1560 +snxmcc +snyder +snyggast66 +so +so +so08 +so0c2p +so118070 +so152be +so2000 +so2806go +so313 +so8m4 +soaclan +soad +soad3 +soad88 +soadq1w2 +soaisoai +soal02 +soapxml +soare +soas311 +sob14duv +sobaxix +sobdog +sobe1575 +sobelowe +soberbiker +soberbio87 +soberman +sobhane +sobhunen +soblue +sobolanu +soboll99 +sobrinos +sobvf +soc43v3r +socal06 +socal4248 +soccer +soccer12 +soccer33 +soccertrophy +soccor56 +socfle +sochaux +sochi2014 +social +socioeco +sockbat +socke1990 +sockeel1 +socker12 +socks +socnaunt +soco3104 +soco5577 +socofo +socola +socorro +socram619 +socrate +socrates +socrates +soczek +sodathis +sodatt +sodehd +sodom +sodoma +sodoma +sodomie +soeiner +soel +soep +soeplepel12 +soeren +soeren23 +soest17 +soet69 +soeursoeur +soeusei +sof2ftw +sof@ra +sofe +soffy1341 +sofia +sofia1 +sofia123 +sofiamia +sofiane +sofiko +soflug +soflyes +sofsof +soft!#% +soft1pl +soft21 +softarc +softball26 +softbear +softcake +softmgr +softokul +softpol +softultra +softw2007 +software +softy2002 +sofus2345 +sog2154 +sogdikiw +sogelub +sogrm3 +soh +sohaku +sohasem9 +sohbanet +sohbetdj +sohcahtoa64 +soheil25 +soheila +sohhan +sohil5 +soho1 +soho21 +sohoho +sohrab +sohreh +soia18 +soibien +soilla +soilwork92 +sojan424 +sojo3887 +sojusz23 +soka +sokgsbxw +soki +sokjes10 +sokoban04 +sokrates +sokrates22 +sokuan +sol +sol123 +sol1luna +sol1sol1 +sol2003 +sol8921 +sol8er +solace8 +solange +solange +solano97 +solar1 +solar89 +solar987 +solari21 +solaris +solaris4178 +solarsnares +solaster2 +solcito +soldat +soldat2 +soldera +solderen +soldier +soldier67 +soledad +soledad +solega +soleil +soleil16 +soleil66 +solela +solem1986 +solene +solenza +solete +soliar17 +solid +solideo +solidkm +solidwet +solina +solinux +solitaire +solitude +solitude1 +solixo +sollasi0 +solltek +sollyalt +solmaria +solmazz +solo-talent +solo12 +solo123 +solo1450 +solo2002 +solobar +solod7 +solodima +soloio +solome +solomio890 +solopisa +solovei +soloyo +solrac +solstice3 +solstice66 +soltane +soltero2 +soltice13 +soltix4 +soluces +solucion +solumiba +soluss +solveig +som14159 +som35tas +som38955 +som3rton +somakere +somarmic +somasion +somasu +somatika +sombat +somboon +sombra +sombra03 +sombradj +sombrita1 +somc123 +somchart +somchit +some9thing +somegoro +someone +somepass +something +something1 +somfatmy +somhau +somkid +somkuan +somlamka +sommaner +sommaren1 +sommer +sommer00 +sommer0053 +sommer08 +sommer1 +sommer11 +sommer12 +sommer43 +sommer63 +sommer75 +sommernacht24 +somone +somox39 +sompop +somrick +somsak +somster +somuch +son hoang +son1son1 +son2goku +son405 +sona +sonald +sonaldo1 +sonar +sonar784 +sonata +sonbicus +sondek12 +sonderbar +sondors +sondra +sondre2611 +sone3 +sonera +soneth1 +soney11 +song +songge +songkhla +songo +songohan +songokas +songoku +soni6nuk +sonia +sonia +sonia1988 +soniag +soniaisaba +sonian +sonic +sonic016 +sonic1 +sonic2122 +sonic2323 +sonicboom +sonicdog +sonicone +sonicsa1 +sonicx +sonike +soninha23 +sonique +sonja +sonja007 +sonja1972 +sonja68 +sonja88 +sonkung +sonne +sonne01 +sonne1 +sonne1966 +sonne321 +sonne33 +sonne333 +sonne39 +sonne78 +sonne90 +sonnenblume +sonnennebel +sonnenperle +sonnenschein +sonnensturm +sonnenwind49 +sonnet12 +sonnie +sonntagsonntag +sonny +sonny +sonny1067 +sonny123 +sonny94 +sonnya1 +sonoalex +sonofa66 +sonofad5 +sonofagun +sonolin +sonoma421 +sonora +sonrisas +sonserai +sonstiges +sonto6te +sony +sony06 +sony12 +sony1210 +sony123 +sony1989 +sony2005 +sony2021 +sony21 +sony280 +sony351 +sony5491 +sony7105 +sonya +sonya +sonya08 +sonyamd +sonycfg +sonycs +sonyk800 +sonyman +sonypsp +sonypsp1 +sonyt610 +sonyvaio +sonywood +soo +sooner69 +soosoo +sooti +sop909 +sopa +sopencos +soph66 +sopha +sophhh +sophia +sophie +sophie +sophie0311 +sophie2609 +sophieloreen +soprano3 +soqdjksf +soqor +sor1H +sora8006 +soraja222 +sorakamiya +sorani +sorapong +sorarules +soraya87 +sorbas +sorbet +sorceres +sorcier +sorciere +sorcio71 +sorebola +sorelle9195 +soren +soren2 +sorenson +sorhavuq +soria007 +soricel +sorin +sorina +sorinweb +sormba12 +sormiou +sornelia +soros123 +sorousow +sorrell +sorrow +sorsorde +sorteper321 +sorth1 +sortie9200 +sortman1 +sos +sos110 +sos99sos +sosf14 +soshadow +sosick +sosnov44 +soso +sosofly +sosogood +sosorry91 +sosorrydad +sosososo +soss1967 +sossa2185 +sosso +sosso +sossos +sostoned +sostupid +sosy81 +soth654l +sotired0 +sotiris +sotirog +sotkfkd +sotkfkdakstp +soto +sotos144 +sotoseko +sottomarino +sou4ze +souad +souad123 +souddism +soudiva +soufad1 +souglask +souheil +souheir +souieq +soukha +souleria +souless1222 +soulfire +soulfly +soulmah +soulmate +soulotss +soulshaka +soulsoul +soulsucht +soulvax +soumasouma +soumeya +soumia +soumitra +soun +sound +sound007 +soundaktuell +soundblaster +soundcontrol +soundfactory +soundoff +soundworks2 +soundx +soundy +soupcat +soupy01c +source +source01 +sourcec +souris +souris04 +souske +south +southbanks +southbeach +southby20 +southpark +southpark341 +southpaw1973 +southpole1 +souzadc +sov57lib +soveposer +sovereign +soviet +soviets1 +sovopu +sow17fuf +sowa33 +sox06x +sox73 +soxixa87 +soybello +soyelamo +soygay +soyjose +soyo01 +soyodep5 +soysauce +soyun10 +soyyo1 +soz01gif +soz22pop +soze +soze229 +soziales1 +sozqorav +sozz5 +sp +sp00ksh0w +sp00ky2 +sp00re +sp0614@dU026 +sp0902pn +sp12345 +sp1357 +sp13ice +sp1ace +sp1tf1re +sp20w8 +sp336153 +sp34yk77 +sp3admin +sp3c13s +sp45ra39 +sp654321 +sp85014 +sp926957 +sp979399 +spXXr +spa102 +spa555 +space +space123 +space171 +space1971 +space930 +spaceboy102 +spacec +spaced1178 +spaced8967 +spacefan +spacehog +spacekid +spacelab +spacematze +spacepla +spaces21 +spacewalker94 +spacir +spacken1 +spacker +spade cooley +spade23 +spadula +spagbol +spagetti +spaghetti +spahrky +spainagent +spak +spalding +spalis +spalux +spam1024 +spam1987 +spam2k +spam828 +spambot +spamfire +spamhead +spamjam +spammage +spamman +spammer +spandall +spanien +spanish +spank +spank1 +spanker +spanker101 +spankm3 +spanky +spanky +spanky1017 +spanky5191 +spanky70 +spanky9901 +spannend +spannermek +sparco13 +sparco14 +sparda +spargel +spargris123 +sparhawk01 +spark +sparke +sparky +sparky10 +sparky316 +sparkz +sparr0w +sparrow2009 +spart1423 +sparta007 +spartaco +spartacus +spartak5 +spartan +spartana51 +spartans91 +sparticus1 +sparton127 +spartus +sparxxx +spaso +spassvogel +spastic1 +spatula +spatz +spatz63 +spatzi +spatzier +spawn +spawn1218 +spawn123 +spawn153 +spawno +spawnyme +spc10377 +spd120as +spe567 +speak +spear3660 +spearhead89 +spears +spec +spec4154 +specht07 +specht79 +special +specialized +specialk2 +species +specka05 +speckbrot +spectral +spectre +spectre07 +spectrew +spectru1m +spectrum +spectrumterra +spectrun +speeches +speed +speed007 +speed2 +speed4590 +speed555 +speed848 +speedboot +speedman5 +speednet +speedo1103 +speedort +speedracer +speeds +speedwaj +speedx +speedx1 +speedy +speedy +speedy12 +speedy16 +speisen60 +speisepumpe +speka321 +spela +spelca +spellbound +spellcaster1 +spelldog +spelletjes +spenc7er +spencer +spencer +spencer1111 +spencer4 +spencert1 +spenglis +spens77 +sperepip +speriamo +sperimentare +speringo +spero +spevdo +speziranzen +spforum1 +spfr4evr +spfx2 +spg9764 +sphb +sphere +sphinx +sphinx12 +spi2007 +spicdude +spice1904 +spicey1990 +spicoli +spicrech +spicspic +spicy +spid923 +spider +spider1 +spider12 +spider9 +spidergear +spiderjz +spiderman +spiderman45 +spiderman7000 +spidernet +spidernet +spidey +spidey318 +spidey97 +spidii +spidy_88 +spiedy +spiegelglas +spiehel +spierdalaj +spiffers +spig0318 +spijker +spike +spike +spike1 +spike1704 +spike2210 +spike314 +spike5811 +spike911 +spikebot +spiked +spiken4 +spiker07 +spikerip +spikes87 +spillme8 +spinabifida +spindel93 +spinella +spinne +spinner +spinnweb +spinspin +spintec +spipek69 +spiq2088 +spiral +spirallife +spirit +spirit54 +spiritec +spirka +spiro9 +spiros +spirouxx +spissi +spistor +spitfire +spitfire500 +spitfire76 +spitszz +spitta123 +spitty +spitz007 +spitzbube +spizer +spj24 +spk +spkfer +spkms123 +spl00sh +spl1985 +spl4ever +splat +splatt +splatter88 +splave +spletnik +splhcb1967 +splicer100 +splin1 +splinter +splitems +splodie +sply8137 +splynter +spm7044ss +spmaan +spman234 +spn3iwb +spng0806 +spo812n +spock07 +spock197 +spock3000 +spock6969 +spoclota +spoiler +spokie +spoko15 +spol +spong81 +sponge +sponge91 +spontan +spony963 +spook1 +spooky0513 +spooling86 +spoon +spoon2 +spooner169 +spooning80 +spootnik +sporegame +sporkbat +sport89 +sportas +sportec +sporter12 +sportex +sporting +sportlich2 +sportrevue +sports +sportsmen +sportster +sporty91 +spot2005 +spotatea +spotcrna +spotfrog +spotisfu +spottiswoode +spotty +spotty1956 +spown +spp68788 +sppai +spq1box +spqr +spqr7777 +spr1994 +sprach3los +sprachtot +sprayarn +spree2 +sprenger +spring +spring +spring84 +sprinter06 +sprinterboy +sprite +sprung138 +spsqwerty +spts6767 +spu18dly +spudellis +spudnik1 +spudstr9 +spug4 +spunky +spunky76 +spupsel +spurs +spurs1983 +sputnik +spvggnw +spw3001 +spw3i +spwd1819 +spy007 +spyboy +spyder +spyder25 +spydy +spyfyes4 +spykids +spyros +spyuhlnt +sq094z +sq12uare +sq30lm1 +sq9lga +sqan1995 +sqatts +sqdayda +sqeadmin +sqfrr +sql03 +sqldebug +sqlpass +sqlroot +squ1rrel +squ1rt +squall +squalo +squash3k +squash70 +squashed +squashers11 +squeaky +squid5 +squidgy +squidsta +squigglesnout +squiggy66 +squire +squire02 +squirmypower +squirrel +squirt +squirt4 +squirtle +squirtpop +squirts2030 +squish1192 +squish12 +squizzy9 +sr012100 +sr1011 +sr2007 +sr20det +sr2685 +sr27665 +sr2dtoa2 +sr44d1t +sr562 +sr68bt26 +sr781210 +sr8442ik +srTG4e +sradmin +sraken5 +sral01 +sral2586 +sram +srautas +srbija +srbijaa +src +srcc272 +srd1701 +srdtvvcv +sredisce +sreela +sreshtaw +sretco +sretel10 +srf43d +srga927 +srghvxux +sri +sridhar +sril8nka +sriramana +srisalai +srisatya +sristone +sritrg18 +sriyani +srizpkme +srjfect +srjfeqt +srk90188 +srkasrka +srkjzg +srm9119 +srml +sro5447 +sroka333 +srs0192 +srs449 +srt460 +srteen +srupprec +srvpu +srw30k3 +srwffhzj +ss +ss004850 +ss0159 +ss04489 +ss100877 +ss1010 +ss1393 +ss1978 +ss1979bb +ss1989 +ss2215 +ss224006 +ss25145 +ss290101 +ss368md +ss4goten +ss528969 +ss600314 +ss651017 +ssahmen +ssanta0 +ssapdrow +ssbb44 +ssc4o +sscchina +sscw +ssd1961 +ssdc1701 +ssdd +ssddrr +sseebo +ssen0508 +ssenia +ssese1 +ssg2703 +ssgoku +ssgoosed +ssgwk +ssh +sshAP +sshcrack +ssi586 +ssi91282 +ssiergeK5 +ssijpyte +ssip455 +ssisere +ssj33ful +ssjgohan +ssjkenny +ssjpk05 +sskaio +sskfgbyt +ssla4874 +sslazio +ssmgh +ssmswfv7 +ssnoro +ssnr5 +ssooss +ssp3434 +sspfgh76 +sspoke +ssr2323 +ssrr55ff +sss113 +sss123 +sss54321 +sss666 +sss777 +sssa1488 +sssafin +sssfs +sssnake +sssqqqq +sssr00 +sssrabak +ssss +ssss12 +ssssss +ssssss1 +ssssssss +sst007 +ssta731 +sstarch +ssterra +sstws +ssupply +ssuugh +ssvrage +ssw0rses +ssx5922 +ssystem +sszzbb00 +st00lbag +st0ckt0n +st0x +st120683 +st123456 +st13st13 +st1968 +st1n +st21hw57 +st234508 +st250 +st313r +st32vb19 +st33l3y3 +st33lman +st357y +st3f4n0 +st3fan0 +st4186 +st4ff +st4rfl33t +st4rfury +st4rn5 +st4rt103 +st5095pc +st5384 +st851212 +st8993 +st96218 +sta217 +sta3war2 +staats +stabilo +stacey +stacey +stach +stachi1 +stacie +stack +stacker +stackerr +stacy +stada +stade1! +stadion1 +stadium +stadtpark5 +stafe123 +staff +staff07 +staff9 +staffelbach +stafford +stafraba +stagnes8180 +stagsmom +staher +stahlhandel +stahlhelm +staima +stainfo +stainless +stairway +stakor1234 +stalin +stalin1996 +stalin45 +stalin9 +stalker +stalker02 +stalking +stallfine +stallone +stalman +stamos +stampe545 +stamped33 +stampella +stamps44 +stan +stan123 +stananie +standard +standby2 +standore3 +stands +stane23 +stanek225 +stanely +stanford +stanhope +stanislas +stanislav +stanislaw +stanislaw123 +stanislawa +stankus99 +stanley +stanley +stanly +stanoba +stantler +stanton +stap7dou +staple +stapleton +stapleton +star +star0507 +star10 +star11 +star121 +star123 +star131 +star1314 +star35 +star4174 +star45 +star4545 +star5353 +star5re +star7576 +star770 +staracc +staras +starbuck573 +starch3r +starchild +starcomm1 +starcraft +starcsat +stardoll +stardust +staredit +starfire +starfish +starfleet +starfox +stargate +stargazer75 +stargod +stargold +stargrad7 +stargrup +starhack +starhead12 +stari331 +starinza +starjeu +starl1te +starlet2 +starlett +starletta +starlight +starlord +starman +starman25 +starmate +starmoon +starnine +staroffi +starovar +starpace +starquest +starr +stars +stars316 +starshade +starsky +start +start!! +start05 +start1 +start100 +start123 +start1n +start6 +starta15 +startr3k +startrek +startrek1 +startupM +starvation +starwars +starwars1 +starwars1952 +starwars415 +starwars5# +starweave +stary1992 +starzz +stas +stas2437 +stas404 +stas71ed +stasa +stasi2000 +stasi77 +stasia micula +staski +stat2365 +stata200 +statef4n +stathis +staticdo +station +statistik +statler85 +stats +statsvlf +status +status1982 +statusquo +staubsauger +stav1356 +staveden +stavens1 +stavrosa +stawicki83 +staypay +stayrad +stayrock +staytrue +stb1259 +stb98 +stbbid +stbgdc +stbha +stcqc99 +stdotcom +stds09 +ste +ste1337 +ste2662 +ste459 +ste4lth +steadfan +steadkandi +steadwater +steady +steakterra +stealer +stealstuff +stealth +stealth222 +stealth475 +steam261 +steam555 +steama88 +steamid +steampunk2010 +steaua +steaua1981 +steaua25 +steban10 +stecher2 +steclocr +stedra20 +stee9019 +steel +steel3rs +steele11 +steelers +steelers37 +steelkit +steelpen247 +steerain +stef1515 +stef1609 +stef19di +stef88 +stefan +stefan +stefan1 +stefan104 +stefan2 +stefan2485 +stefan7326 +stefanac +stefanalex +stefangrett +stefania +stefanie +stefanie +stefanie1 +stefanka# +stefano +stefano +stefano satta +stefanoi +stefanoner +stefanos +stefanos2 +stefant +stefanzweig +steff +steffany3 +steffen +steffen +steffi +steffi +steffi1803 +steffi2904 +steffim +steffou +steffu1 +steffusi +steftem +stefus +stefypad +stegano8 +steganos +stegmann! +stegvis1 +steigra +stein +stein2199 +steinchen1 +steiner3 +steingen +steinmeier2007 +steinmetz +steivip +stekelvis1 +stele8518 +stelif +stelio +stelios +stelios +stelita +stelitoy +stella +stella +stella! +stella$6 +stella12 +stella19 +stella2151 +stella78 +stella99 +stellan +stellar +stellita26 +stelly19 +stelrox +stem123 +stenakus +stenima +stenman92 +step2000 +stepan +stepbl4b +steph +steph333 +stephan +stephan +stephan09 +stephan2505 +stephan352 +stephan6139 +stephan91 +stephane +stephane +stephanie +stephanie +stephen +stephen +stephend111 +stephie3 +stephkl +stephon +stephp +stepin +stepin' +stepone +steppe3 +steppi +steps0815 +sterba44 +stereo11 +sterero +sterf +sterken01 +sterling +stern +stern00 +stern56 +sternchen +sternchen16 +sterne +sterne747 +sternentaenzer +sterner7 +sternkin +sternstern +sternstunde94 +sterntaler1968 +sternum33 +stery +stessie +steste +steubing44 +stevan +stevdive +steve +steve +steve patalay +steve100 +steve123 +steve421 +steve7 +steve8057 +steve911 +stevec21 +stevee +steveg0909 +steveg23 +stevej86 +stevelol +steven +steven +steven09 +steven1 +steven5485 +stevenson +stevenson1 +stever11 +stevevai +stevie1990 +stevning1998 +stevo +stevo9510 +stevocia +stewart +stewart29 +stewbaby +stewie08 +stexan +stf3103 +stg44 +stgcmsw +stgrand +stgta +sthukair +stian4040 +stianf +stick639 +stickje +stickley08 +sticks0105 +stickshoot +stides +stiegl2006 +stiernberg +stierstier +stierstier +stiffee +stiffi88 +stift +stig +stig2008 +stigger1990 +stiinta +stij523 +stik9901 +stikuwat +stilla +stillen12 +stillman +stillwaters +stimpy22 +stina +stine4ever +stineman84 +stinet. +sting321 +sting8074 +stinger1 +stinger82 +stinger9203 +stingray +stinka23 +stinken +stinker +stinkerbaer +stinki +stinky +stinky90 +stinkyb1 +stinnett93 +stiri +stirling +stirnlampe +stixy1989 +stjames1892 +stjuarts +stk12730 +stk1337 +stl904 +stlsd +stm539 +stmartin +stmppl +stn7421 +stneo11 +stnkwm33 +sto1pin +sto7i +stocazzo +stock24 +stockard +stocker +stocky +stoeproa +stoessel +stoet01 +stoffe23 +stoffel1973 +stoffels +stoffen2015 +stoffer +stogie12 +stoiko +stojadin1 +stojan +stokar +stokazzo +stoked1111 +stokke677 +stolaf +stole +stolec +stolec65 +stolica1 +stomper89 +stoncold +stone3hill +stone45 +stonebanks +stoneboy +stonecold +stonecutter70 +stonehunt +stoneman50 +stoner +stones +stones5327 +stonewall +stoney23 +stoney34 +stoney375 +stonkus +stonozka +stonyhahn +stool +stop2294 +stop5elf +stoper007 +stopfenheim +stopgo7 +stophack +stopnick +stopo100 +stopp1 +stoppock +storas6 +store4me +stork +stork16 +storm +storm1 +storm353 +storm427 +storm8778 +stormbringer5 +stormdancer666 +stormie21 +storming +stormlover +stormnether +storms +stormtrooper +stormwind14 +stormwind2 +stormy +story0512 +stoupin +stoyan +stoycho +stpierst +stprtc06 +stpwtpub +stqqttrr +str0ke +str0ke2 +str1der +str8351 +straae +strafed70 +strahil +straily4 +straipi +strait3 +straminke +strand +strandkant08 +strang3r +strange +strangew +strapaze +strasilo +strasza617 +strat2374 +stratford +stratos1 +stratos66 +strausS +stravinsky +strawberry +strawrats +strazimir +strcicda +stream1488 +streber +streepjescode +street +streetb +streetcar17 +streetec +streeter101 +streetlight12 +streig +strelka +strelnice +strelsa +strem404 +strength +strerath +stretch +streusel2 +strfi8er +stri4711 +stricki +strider +strike +strike3 +strike54321 +striker +striker06 +striker2 +strikestrike +string +string69 +string9 +stringaj +stringbean +stringer +strip1983 +strip2010 +stripe +stripes +strocca +strogg +stroker15 +strolchi +strolon +stromer +strong +strong7 +stront +strother +struan +structure17 +strule1982 +strumboth +strumiany2006 +struppi +strutter +strwrsjd +sts51l +sts8895 +stsrk98 +ststar +stsw2006 +stu +stu1424 +stuart +stuart edmond +stuart45 +stuart5 +stuat +stubbi12 +stubby +stucazz +stud +stud0049 +studek73 +student +student2910 +students +studentus +studi0524 +studio147 +studio33 +studio45 +studio54 +studiowork1 +studioworks +studium01 +studly6972 +studman47 +study2002 +stufenlos +stuff +stuffer +stuffz01 +stufowler +stuhl +stuhl40 +stuiterbal +stuk4itd +stummel66 +stumpjumper +stunner +stunt101 +stunts1 +stupid +stupide +stupidsam +stupsie +sture +sturgis +sturm +stuttgart +stux3891 +stuy9 +stw212ef +stwaiwfy +stwstw +stwuvme2 +sty332 +styalc +styla +style1 +stylegurl +styler +styles +styles187 +stylez21 +styljazz +stymie +styrene01 +styropian +stywukas +styx2003 +su +su ming +su1982 +su1tcse +su1zuki +su2480 +su2879 +su39ty10 +su3cl3 +su3m3n0w +su4alk +su4ka +su8166 +su90m +suMMon +suak +sualcr +sualk2007 +sualk33 +sualk3812 +sualkl +suan1337 +suax9h0o +sub056 +sub27087 +subaru +subaru67 +subaruduke +subat901 +subbbb +subbouh +subcar34 +subehan +subferox +subflcl +subg534 +subguy +subito +subito7 +subl1me1 +submariner +submillz +submit +submit93 +submufjo +subnormales +subotica +subsboy +subscap +subseven +subsotos +subtoky0 +subtone +suburbano +subvftw +subway2 +subwoofer +subyu +subzero +suc +suc86quw +suca3000 +succes +success +success2 +success2009 +success2232 +succhia +succubus11 +suce +sucettes +suceuse +suchart +suche09 +suchengi +suchira +sucht +suchyta +suck +suckcock +sucker +sucker1 +sucker88 +suckin90 +suckit +suckitup +suckme +suckpop +sucks +suckshop +suckt +suclave +sucocaju +sucre0 +sucrense +sud21413 +sudakas +sudayrc +sudckm +sudden00 +sudden05 +sudden6699 +suddenterror +suddz +sude2001 +sudemar +sudie +sudio820 +sudipghosh +sudo +sudoko89 +sue +sue ann +sue helen +sue jones +sue kiss +sue611 +sue7ellen +sueddeus +suedlicht +suegrito +suekaren1 +sueme63 +suenneli +sueno2 +sueone +suerte +suessa +suesssauer +sueze3 +sufdor74 +suffeli +sufferah +suffk0pp +sug4r# +sugar +sugar1 +sugarland +sugarman +sugarosas +sugarplum69 +suge2110 +suger159 +sugetima +suggest +sugie0 +sugipula +sugraa +suh910 +suhaib +suhi9946 +suhithar +suhjinko +suhrab +sui60412 +suicide +suicune +suigos +suihongkong +suikertante +suikoden3 +suipyh +suiranek +suirdua1 +suite420 +suitenes +sujata +sujatha +sujokro8 +sujucruw +sujuvade +suka +sukablet +sukabumi +sukafm +sukamelo +suker2502 +sukers +sukhyun9091 +suki21 +sukidayo +sukidesu +sukiswo +sukit1020 +sukkel +sukkels +sukmadik +sukomf +sukram +sukram73 +suksif1 +sukubus +sul44 +sulaliwan +suleika +sulekfak +sulik88 +sulin +sulizano +suljo +sulla1 +sulla8721 +sully +sully2140 +sullyman +sulo31 +sultan +sultan4d +sultana +sultansultan +sumara43 +sumarti +sumblink +sumeyye +sumi412 +sumie +sumipine +summ3r1w +summencl +summer +summer +summer06 +summer1 +summer11 +summer2 +summer2. +summer69 +summerbeoc +summers1986 +summit +summit7 +summoner1 +summonx +sumner +sumoka +sumpfbiber +sumse89 +sumthin +sumufr75 +sun +sun$shine +sun217 +sun42178 +sun4ever +sun78745 +sun7beam +sun8548 +sunamich +sunarto +sunaryo +sunce0000 +sunchild +sunci +sunckell +suncrimes +sund479 +sundance +sunday +sunday99 +sunder4457 +sundered +sunderland +sundin +sundown +sundown +sune +sune4378 +sunesen +sunfire +sunfire777 +sunfish +sunflower +sunglsw +sungodz +sungold +sungyuan +suni +sunie123 +sunil +sunil94 +sunitha89 +sunjoe +sunke888 +sunkee2009 +sunkiwi +sunlak +sunnarea +sunnie +sunny +sunny +sunny1225 +sunny15 +sunny4563 +sunny7006 +sunnyboy +sunnycar +sunnygrl +sunnysqueeze +suno +sunqldao +sunris3 +sunrise +sunrise2711 +sunriver +sunrui1 +sunsas +sunset +sunset11 +sunsetchill +sunshinas +sunshine +sunshine +sunshine sammy +sunshine2534 +sunshinekeanu +sunsum +suntech +suntem70 +suntis2009 +suntno1 +suntzu +sunup +sunyizoh +suog3 +suomi001 +suomi24 +suomis +sup +sup1nov3 +sup3rb3ast +supagoal +supahman +supaj00 +supajin +supasta +super +super007 +super08 +super1 +super11 +super12 +super2 +super36 +super369 +super4e +super678 +superali +superasd +superb +superb3u +superball300 +superballs1 +superbee +superbee70 +superbike77 +superboy +superc4t +supercala1 +supercan +supercarie +supercars7 +superdrops +superdubs +superduper +superduper8 +supere +superema +superfamer +superfly +superfring +superfunk +supergau +supergirl9 +supergreen2010 +superguy5 +superhans +superhero92 +superhqh +superi56 +superingo7 +superion +superionn1 +superiore +superiori +superjoan +superk +superk5 +superkalif +superline2 +superloch +supermaf +supermama0 +superman +superman3 +supermann +supermen +supermen2 +supermod +supernd +supernic +supernipple +supernova +superp +superq8 +superray +superscout2 +supersecret +supersonic +superss1 +superst4r +supersuper +supertag +supertasha +supertramp76 +supertrinity +superu10 +superuser +supervirus +superviseur +supervisor +suphan +suphan22 +suphansa nuang +suphavadee +supi9876 +supinfo +supjapo +suplingo +suporte +suppe +suppe34 +suppen +supper +supper07 +supper63 +supplier +support +support +suppwnc7 +supr3dif +supra +supra2 +supra2jz +supraman +supranee +supras20 +suprat67 +supratt1 +supratt5 +supreme +supsup +supw1mf +suqfmtmc +sur1viv +sur3l15 +sura +sura15 +surachart +suradej +suramare +surazal7 +surce333 +surdo +surelova +suresh +surf0620 +surf2surf +surface +surfaceg +surfboard +surfen +surfen87 +surfer +surfer8 +surfers99 +surfing +surfish +surfkhpv +surge7 +surhyux +surined3 +suriya +surnkl +surnx55p +surpriza1981 +surround +susa2005 +susacul +susan +susan +susan damante +susan player +susan1 +susan11 +susan2210 +susana +susana +susana27 +susane65 +susankai +susann777 +susanna +susannah +susannaz +susanne +susanne +susanne1403 +susanne2002 +susanne80 +susannefrieda +suschi +suse +suse +suseax3 +susedia +susel1310 +suser +sushi +sushi4u +sushi6 +sushi6119 +sushi89 +sushiheaven +susi +susi +susi1807 +susi3107 +susie +susie may +susimail +susiza +suskun +suslik88 +suso cecchi +susperia +sussanah +sussel +sussex25 +sustore +susu +susuchow +susuie +susuinmo +susujka +susuxphr +susy +susy0511 +susz18 +sut12bea +sut545 +sut7610 +sutV2x5f +sutek1 +sutekim1 +sutijitr +suting +sutrius +sutsko654 +suuchi +suuds +suvari +suvuwi +suwandi +suwin +suwin sawang +suwq5 +sux +sux0ry +suxanne creese +suxbad +suxlukam +suxul +suy9i +suyama77 +suyami +suyetta +suyfeser +suyn2 +suysobuf +suzan +suzan +suzana +suzana12 +suzana23 +suzanna +suzanne +suzbabe +suzee +suzett +suzi +suzi12 +suzi500 +suzibike +suzie +suzuki +suzuki0554 +suzuki2 +suzukino +suzukir1 +suzy +suzzie47 +sv2008 +sv2493 +sv3tl10 +sv45g +sv97747 +svajone +svale1992 +svalovec +svante2008 +svartella +svatopluk +svdntcs8 +svea11 +svecud +svedala +svedberg +sveikata +svein +svein sturia +svelta +sven +sven +sven bertil +sven erik +sven-bertil +sven.m +sven1 +sven1212 +sven1212 +sven2301 +sven2404 +svenbenb +svendepp +svenja +svennee +sveren +sverige +sverige007 +sverige2009 +sverigie +sveta +sveta532 +svetlakk +svetlana +svetlana0022 +svetlost +svetozar +svfid +svg1990 +svg62186 +svh56240 +sviesa +svilen +svimas +svinget31 +svininas +svitzer +svjetlana +svjetlo +svk +svkvmyd +svlasisb +svmacadam +svmauren +svmmst +svo85 +svolochi +svq01936 +svrpjygk +svs3wrib +svsakr48 +svt1kyla +svuhu5d6 +svvateam +svvn2000 +svw2004 +svyqthfu +sw00zh +sw10jcd +sw182sl +sw1ak47 +sw1ngl3 +sw2006 +sw2007aa +sw2007ab +sw232423 +sw280192 +sw33t9 +sw33tnes +sw3ed +sw3l0 +sw4by +sw550502 +sw881170 +swadmin +swahodac +swalker41 +swallow1337 +swampfox +swampy15 +swan2004 +swan5761 +swanky12 +swapfish +swarms +swasupr +swat10 +swat114 +swat141414 +swat47 +swatch +swatdawg +swatfly +swatigp +swatterb +swaty +sway13 +swayne +swb37 +swbcdt +swbt2001 +swbv001 +swcruise +swcw12 +swe1af +swea123 +swear4 +sweatshop +swedbank1450 +sweden +sweden131 +sweden22 +swedes73 +sweedish17 +sweemy +sweeney +sweeney66 +sweepp +sweet +sweet1183 +sweet302 +sweet456 +sweetass +sweetb12 +sweetgray2 +sweetie +sweetlife123 +sweetlife44 +sweetman +sweetp +sweetp221 +sweetrevenge +sweets65 +sweetschatz +sweetth +sweetwater2008 +sweety +sweety1610 +sweety48 +sweety85 +sweforce +sweh552 +swendm +sweter6 +swf0928 +swffcb +swiadomosc1 +swidnik0 +swiecie +swif11ih +swift456 +swilliams10 +swim83 +swimezy +swimmer +swimmer1 +swimmer9 +swimming +swimming10 +swimstar +swindon1 +swinea2006 +swineflu +swing99b +swinga13 +swinger +swingso +swingswing +swiproga +swirl1 +swishswish +swishx +swisp69 +swiss26 +swiss66 +swisslog +swisspwn +switch +swivadef +swkotor +swm316 +swmb2 +swms01 +swo420 +swoosie +sword01 +sword21 +swordcorp +swordfish +swordfish1 +swordmaster +swords00 +sworks88 +sworp +swp9a +swprimus +swrox76 +swrulez +swsswsg0 +swsw123 +swtu3777 +swud7z +swutoseh +swwdn +swxkym +swzzz +sx1234 +sx3b745jit +sx4fyb9h +sx4sx +sx888888 +sx88p0ur +sxbf7dha +sxcchick +sxdk6 +sxdoh +sxgabtd6 +sxmf5nah +sxqoazh4 +sxrwu +sxs112 +sxsysdie +sxta1sus +sxz0212 +sxzbwlb +sy +sy0273 +sy5ex +sy8phkm8 +syalala +syaoran +syaz85 +syb +sybex96 +sybil +sycharth +syd +syd +syd999 +sydegi +sydne +sydney +sydney1279 +sydney9023 +syed1214 +syed8080 +syedjon +syewy52x +syfthind +syhenry +syl +sylithus +sylle1122 +syllikan +sylt04 +sylt66 +sylt99 +sylva +sylvain +sylvain +sylvain1 +sylvester +sylvester +sylvia +sylvia +sylvia36 +sylviane +sylvie +sylvie +sylvio +sylwek89 +sylwester123 +sylwia04 +sylwia16 +sylwiag +sym4nt3k +symbios69 +symbios94 +symferon +sympa13 +symtru14 +synapse +sync +synched +syncmaster +synco567 +synctrow +syndagma +syndikat +synepex +synfcb04 +syngesangen +syniggaz +synq123 +syntax1980 +syntax76 +syntaxerror +synthetic +syntony +syphon111 +syphor +sypitki +syr44123 +syra +syra1234 +syrah2005 +syria29 +syrian78 +syrie1 +syrinx66 +syriusz5 +syrok1 +syron +syronada +syrus2000 +syruss +sys04yv1 +sys116 +sys124 +sys2006 +sys2008 +sys32 +sys5314 +sysadmin +sysai3 +sysco +sysdba +sysgod82 +sysios +sysl0gin +syslog +syslogin +sysmail4 +sysop68 +sysop98 +sysrq911 +syssi001 +systec +systeem +system +system0725 +system32 +system69 +system77 +system94 +system99 +systemf +systemout +systems +systemsoft +syswest +syvis2k6 +sywafa +sywx1020 +sywyxxxb +syys0301 +syzanne +syzygy666 +sz1903 +sz2923fq +sz957la6 +szabi981 +szabo +szaderas +szarpi +szarvas21 +szary12 +szati27 +szaz +szblogs +szcze +szczescie1 +szczupacze +szczurek1976 +szeder7 +szef182 +szefizna +szeix +szekla +szeol999 +szerk23 +szhljp +szifony +szinkron +szjdw888 +szkola12 +szkxtr +szlyv +szmisz +sznchg +szo0h +szociologia +szocke +szolov +szotokan +szpak123 +szt2m +sztdz5 +szuper +szuwarek +szuyq +szx1965 +szx96 +szymon +szymon. +szymon23 +szymonp +szzij9 +szzxxwr +t +t oney +t'ang juo +t00dles +t00ncez +t00rbe +t00tsval +t01kien +t0359917 +t06011977 +t0610i +t08715 +t0BXJ +t0d0r +t0iiv +t0k10 +t0k3 +t0ky076 +t0leng0 +t0m321 +t0m4t03z +t0mat0e +t0mt0m +t0ninh0 +t0ny!@ +t0p3t3 +t0paz +t0pgmdem +t0pnet +t0r2k +t0rat0ra +t0rn4d0 +t0rndah1 +t0tur1 +t0urach +t0wz4 +t1033051 +t123123 +t123456w +t12347 +t12e11r +t13ns +t140399k +t14m0 +t150b671 +t160277n +t16ebdcq +t17618 +t17n523 +t180695t +t198917 +t19a82 +t19k0572 +t1but1c0 +t1d3s +t1e2c3h4 +t1e2s3t4 +t1gg3r +t1gg3r57 +t1h2o3m4 +t1mb3r09 +t1meless +t1mt1m +t1ravjhj +t1son6t1 +t1tty +t2003o +t202d +t231071 +t23383t +t237237h +t259395 +t261288 +t2738x +t28405t +t29xP3 +t2bjpyvp +t2c4hkqu +t2e0s3t +t2hhqtfq +t2iggo3y +t2m1d2m +t2qwl +t2rxp3le +t31gl5 +t32175 +t3231m +t3324 +t33wurst +t34c4k3 +t34m0 +t34msp34 +t35l03 +t36irs8x +t3L4c0 +t3abc7g8 +t3chw153 +t3llabs +t3mp1234 +t3mp44 +t3rb4n6 +t3rm1n4l +t3rminal +t3st +t3st0f +t3st1ng +t3st1t +t3st3n +t3stt3st +t3y8ya2 +t3z41g +t40210 +t41ne +t44dwo00 +t45canal +t45h32b +t45oldmx +t467p +t46pxu7 +t4a4s9pj +t4auto +t4b4l3t +t4c0 +t4fdyjij +t4h2t9n1 +t4jwijwc +t4mp4h +t4pioc4 +t4r4n37 +t4t4m1 +t4tu455 +t4y2905a +t4zdvl +t4zsma7v +t501652 +t5239205 +t53fw62b +t56Tal +t5khvqac +t5m5h0m3 +t5neve +t5t6z6 +t5u5t +t5y6u7i8 +t6600013 +t681121 +t6lc09l +t6mage +t6ost +t6qwm +t6rexg +t6wepp8z +t730shez +t745100 +t762ja01 +t7830 +t7add +t7emgeuh +t7mjofcq +t7p5p3 +t7zaxzm5 +t8026 +t825 +t8533662 +t8769e +t88jd +t8dlz +t8fpq +t8hgnrun +t8mo7q +t8nooki +t8peg +t8qpd +t8qra +t8qtd +t8r8s1 +t8vu08yp +t900h901 +t904 +t9385999 +t944rgu7 +t959hc +t9616074 +t9700378 +t970713p +t9XYyCh132 +t9qe37p +t9xzr8ox +t9zlhoat +tBlc83 +tG97009 +tL1yzF +tMggo +tN3qND +tN5apW +tP@8Jr1qpLyW60 +ta112ppi +ta11limn +ta131166 +ta36ra +ta4414 +ta446299 +ta47lsog +ta4ta4 +ta6sti75 +ta6turne +ta74w286 +ta7895 +ta8cimpw +ta8sb +tab +tab0707 +tab222 +tab33ran +tabac38 +tabakvan +tabalu64 +tabaluga06 +tabasco +tabatha +tabby2166 +tabby2662 +tabea +tabea96 +tabeale +tabealina +tabitha +tabitha +tabletka +tabu30 +tabular +tac763 +tacapaca +taccitua +tacheles +tachko81 +tachonne +tacinr +tackle9 +tacnat +taco123 +taco26 +taco9 +tacofish +tacomadness +tacos13 +tacozz +tactac +tactelmk +tactical +tacticat +tacton +tad +tadanori +tadao +tadas +tadas112 +tadasaaa +tadasas +tadashi +tadass +tadata +tadbizub +tade +tadeusz +tadiran +tadisp +tadorek +tadpole +tadr04 +tadw21ql +tadzio +tae7g +taecok +taekwondo2 +taekwondo2009 +taelah +taerlyon +taeve +taex4 +taf15wht +taf58muq +tafaak +taffe +taffel +taffy +taffyj1 +tafi5488 +tafimamo +tafu1234 +tafunes +tagama +tagaming +tage +tageel +tagel +tagetes +taggart24 +tagged +taggy69 +tagkawayan +tagless +taglialegna +tagmarak +tagoni +tagueule +tah33tah +taha +tahariel +tahdemzz +tahereh99 +tahnee +tahntahn +tahuna +tahwoo +tai1210 +tai1968 +taiboo0 +taidrift +taiebb2t +taiga241 +taiger66 +taija +taiji +taika +taikomo +taikotaiko +tailer +tailgrab +tailor375 +taina +taina3 +taint +taint3d +taipan17 +taipan68 +taipanus +tair1988 +taisen +taishar +taiten1984 +taiuna1 +taiwan45 +taiyo +taj +taj56g +taj62cet +tajne +tajne666 +taju +taka1967 +taka1972 +takaaki +takahiro +takai11 +takalah2 +takamine +takao +takash +takashi +takata11 +takato +takator +takaya +takayama1 +take0911 +take1996 +take3 +take66 +takedown +takeit0 +takeit619 +takeiteasy +takekawa +takeoff +takeover +takero +takeshi +taketoshi +takis +takjero +takker +takkun +taks1987 +takshi +taksin +taktak +taktak1 +taktoja +takuma +takuzo +taky +tal +tala +tala99 +talaempe +talaie +talaj20 +talal +talasaar +talav3ra +talbert +talbog +talbog47 +talbot82 +taldo +talea220 +talena +talent05 +talent89 +talhi02 +talia +talia9978 +talion9 +talitakumi +talitha +talitha313 +taliwin +talkalot +talkers +talktome +tallada +tallagh1 +taller2006 +talley123 +tallguy +talli +talliban +tallo332 +tallulah +tally +tally07 +tally222 +tallyho22 +talmage1 +talmone +talo +talob1313 +talon95 +talor987 +talpa +talrash +talsperre +taltos +talvikux +talyak +talymara +talyn4ik +tam66tia +tama +tama69 +tamadmin +tamagotchi1 +tamair +tamaison +tamal79 +tamam +tamara +tamara +tamaram +tamare +tamarica +tamariss +tamas +tamaska +tamayin +tambergs +tambis +tambo390 +tamecy +tamer +tamere +tami +tami123 +tamiicq +tamiko +tamilpower +tamime +tamirel +tamiselo +tamito +tamiya01 +tamlin19 +tamlyn +tamma1234 +tammany +tammaxx +tamment +tammo595 +tammy +tammy +tammy123 +tammy6530 +tammyk97 +tamnoon +tamo +tamotsu17 +tampafl +tampan +tamsin +tamster +tamtam +tamtam01 +tamtawat +tamthanh +tamu2002 +tamvaley +tamytamb +tan +tan yan +tan.tris +tan1965 +tan2006 +tana +tanahair88 +tanalex +tanasi +tanatos7 +tancay +tand5 +tandberg12 +tandem04 +tandil +tandlds +tandra +tandreab1 +tandum2 +tandy +tanechka +tanelj +tang +tang +tang0921 +tang2010 +tangent2401 +tanger +tangina34 +tanglefoot1918 +tango +tango01 +tango1 +tango187 +tango24 +tango68 +tango8453 +tangofox +tangome +tangorules +tangotv +tangozulu +tangr1ng +tanguo98 +tangus58 +tania +tania +tania.r +tania53 +tanie +taniggaz +tanilas9 +tanis1 +tanis184 +tanis1988 +tanis2101 +tanitab +tanizi +tanja +tanja +tanja01 +tanja1 +tanja27 +tanjakick +tanjas23 +tanjasch +tanjo4712 +tank +tank228 +tank4525 +tank454 +tank88 +tankana +tankbrand +tankdriver +tanker +tanker013 +tankian +tankkobe +tankred +tanksalot +tankserv +tannen0726 +tannenbaum01 +tanner +tanner4371 +tanner68 +tanner89 +tano +tanopt +tanrip +tantalas +tanter23 +tantica +tanto +tantoo +tanusch +tanya +tanyarat +tanys16 +tanzber +tanzmarie +tanztanz +tao1980 +taoatg +taoaurich +taokhung +taouser +tap +tapen +tapetape +tapeteob +tapex5 +taping +tapiok +tapion69 +tapira23 +tapis +tapmls +tapot +tapout13 +tapout81 +tapremac +tapsa1634 +tapster +tapz +taq3Gf +taqqee +taquinas +tar1zan +tar8768 +tara +tara +tara3101 +tarace +tarace79 +taragi +tarah +taraldsen55 +tarallo +taraluna +taralynn9 +tarantel +tarantela999 +tarantella90 +tarara +tarass +taratara +tarawa32 +tarcisio +tardis +tarek +tarek +tarekhe +targa18 +target +targeted08 +targusbag +tarheels +tarick +tarija96 +tarik +tarik007 +tarika +tarimli +tarimode +tarimp86 +tarina +tariq3 +tarja1 +tarkan +tarkan12 +tarlooz +tarlouz +tarnat +tarnkappe +tarnowski +taron +taron123 +tarren +tarrin36 +tarsila1 +tarsis17 +tarsis5 +tarsuya +tart5ney +tartanss +tartuffe +tarumar +tarva +taryn01 +tarzan +tarzan76 +tas1492 +tas2te +tasawan +tasch123 +taschentuecher +tasdizel +tashcat +tashi420 +tashio +tasia +tasiemiec +tasinet +taskady +taslima +tasmal +tasmania +tasmian +taso0011 +tasos2008 +taspac +tassa +tassadar +tasse2002 +tasse44 +tassie +tassilo +tasso712 +tassssat +tastadr +tastatur +tasya +tat +tata123 +tata300 +tatahugo +tataindica +tatakae +tatanka +tataristan +tatata +tate +tatekun1 +tater456 +taterdoby +tatertot +tateya321 +tatiana +tatiana +taticu +tatilxx +tatino +tatis99 +tatita93 +tatjana +tatjana +tatjana2709 +tatkrazi +tatmibir +tato2312 +taton149 +tatoos69 +tatra +tatranka +tatsu +tatsuo +tatsuya +tatto +tattoo1828 +tattoo3s +tattooed13 +tattoomannen +tattoos1 +tatui123 +tatuine +tatum +tauchen +tauchen05 +taulant +taupman +tauren001 +tauro5 +taurus +taurus99 +tauser1234 +tav +tavares21 +tavasylu +taverne83 +tavihal +tavol +tavwd +tavy +taweesak +tawfic1985 +tawfik +tawheed1 +tawhid190 +tawney +tawni420 +tawny +tawodi123 +tax12ham +tax666 +taxan001 +taxatisy +taxeges +taxessuck +taxi1234 +taxi2305 +taxi555 +taxi9191 +taxibros +taxifrank +taxis +taxman +tay +tay25 +tayeb19 +tayfun +tayfur84 +taylan1 +taylor +taylor +taylor12345 +taylor30 +taylor80 +tayson +taytay0413 +taytay504 +tayyar +tayyip +taz +taz125 +taz19hip +taza +tazan +tazdevil +tazer1 +tazgirl +tazman +tazman37 +tazmanie +tazzioli +tb00211 +tb103100 +tb12893 +tb23627 +tb2512 +tb254 +tb44644 +tb711234 +tba +tba1974 +tba4ceo9 +tba810 +tbagr +tbarnes1 +tbbangin +tbcced +tbcvvidy +tbcy04 +tbelow +tbftl +tbh100 +tbh4eps +tbhans +tbhc42 +tbhnjucr +tbhtgjmk +tbhtuvcj +tbhvdux1 +tbj1953 +tbk0tv1 +tbk3rv +tbkralle +tbo6cmju +tbob1983 +tbones +tbotkb +tbsasd +tbttf123 +tbvbph +tbxrji +tc117 +tc13zzbr +tc156423 +tc354zq +tc378789 +tc7765 +tc9sebw4 +tcavmj +tcb71 +tccdb27 +tccrcr84 +tcdbpdx1 +tcfa2005 +tcffiweb +tcg999 +tchcnbu +tcheky +tchibo +tchikie +tchopdie +tcithcb2 +tckevin +tcl56j1 +tcm9850 +tcmnqpgt +tco990 +tcom4u +tcon6 +tcos123456 +tcppachi +tcpqbk +tcroot +tcsmidway +tcsmlan +tcsrxy +tctjnus +tcy88 +td2z5l8 +td497164 +td9914 +tda1553 +tda2003 +tdbehmjx +tdc1520 +tdc9311 +tdctmp +tde6g +tdf8004 +tdhgr1z9 +tdk144 +tdkyon +tdomr7zj +tdot7102 +tdp +tdr23qnw +tds2005 +tdub05 +tduck +tdunyhmg +tdutybqi +tdy +te011839 +te100sk4 +te12345 +te2002 +te38ja53 +te3li2a +te42460 +te42as11 +te51866 +te734ux +te8e8 +te8zgvhu +teRria71 +tea3361 +tea4me +tea4two +teabag123 +teabag4u +teach2008 +teacloth +teaiolga +team +team4d +teamcol1 +teamfbi +teamfg2r +teamgame +teamit +teamjedi +teammrt +teamngf +teamobethel +teamozn +teamstn +teamubi +teamwarlock +teamwolf +teamwork +teamx3us +teapot67 +tear1989 +tearaway +tearliss +teasharae +teasso +teatime82 +teazer +tebak9 +tebqfb +tebteb99 +tec1121 +tecague +teccaaum +tech +tech01 +tech17 +tech1701 +tech2005 +tech9921 +techa4 +techay02 +techdeck +techers6 +techl1ne +techmate +techn1cs +technics +technics2 +technics42 +techniker +techniks1 +techno +techno01 +techriva +techsupp +techtel +techwood2 +techyfreak +teckan06 +tecky +tecla +teclado410 +tecmath +tecnigas +tecnochamp +teco +tecra8k +ted +ted fiorito +ted051 +teda +tedbundy +tedd +tedde +teddies95 +teddy +teddy115 +teddy123 +teddy1968 +teddy222 +teddy404 +teddy987 +teddy992 +teddybear +teddys +teddyseeger +tedi +teditedi +tedo +tedshred +tedted69 +tee +teech0509 +teehee +teelbal +teelek +teemmer +teemp +teenne +teera1 +teewurst +teferi +teferi60 +teflon +teftak58 +teftch70 +teg12345 +teg4me +tegelane +teges +tegija +tegssk +tehillah +tehkaton +tehrandk +tehsex0r +tehw0w +tehzomgz +tei7zved +teiber20 +teinewas +teippi88 +teiubesc +teixeira +teizo +tek301 +tek4yzbg +tek94u +teka400 +tekacica +tekan159 +tekaskim +tekbelac +tekena +tekin22 +tekin35 +tekinnn +tekipew3 +tekirova +tekken +tekkenkk +tekker +tekkno +teklekku +tekme34 +tekniker +teknotekno +tekrif +teks1999 +tekster44 +tektek +tektumip +tekyol +tel3388 +tel3838 +tel4161 +tel42404497 +tel6815 +tel78234 +tel812 +tele01 +tele1caster +telecanoga +telecaster +telecomanda2 +telecono +telef321 +telefon +telefon25 +telefono1 +telefoon +telegraf25 +telekom1 +telem +telema1 +telemail +telemann +telenete +telerate +telescopio +teleskop1 +teleteta +televisa +television +telexmobil +telexsa +telia +telicorne +telint96 +telinu +telis650 +telitg91 +teljar +telkom +teller13 +telli +tellivar +tellocor +tellus +telly +telma +telmajel +telnetter +telon +telperion73 +telprod +telstra1 +telus01 +telvanni1 +tem2006 +temari45 +temath +tembel +temerarios +temeris +temjin +temmink +temmpy12 +temmuz +temnaya +temo +temp +temp000 +temp06 +temp0622 +temp09 +temp1048 +temp123 +temp1234 +temp321 +temp75 +temp887 +temp9852 +temp992 +tempe +tempel255 +tempelhof +tempest450 +templar +template +templeton22 +tempo +tempo6 +tempoeric +tempor +temporal +temporar1 +temporium +tempotempo +tempp4ss +temppass +temppass +temptemp +tempu +temr132 +temtem +temuco +ten11exp +ten987 +tena100 +tenchi +tenchu +tender99 +tenebrese +tenedos17 +teneke +tenen +tenerife1a +teng +tengelmann6 +tengukan +tenis +tenistib +tenjo1972 +tenman65 +tenmiles +tennaxia +tenneh +tennemann83 +tenniel +tennis +tennis1 +tennis46 +tennisjt +tennisman +tennisman1 +tennisrocks +tennissex +tennyson +tenor1320 +tenpole +tenserf +tenshi +tenso2 +tentacle1 +tenuki +tenxkali +teo5819 +teobald +teocratia +teodor +teodora +teodoro +teodosia +teofil +teoneu +teopao +teoteo01 +teoxo +tepeer18 +tepeo123 +teper +tepgw +tepjj4t1 +teplice10 +tepp149 +tepuclan +teq18pim +teq6o +teqj3n57 +teqt7 +tequiero +tequila +tequito +ter9191 +terabera +teran333 +terb41 +terbear3 +tercamod +tercedia +tere +tere1tere +teregova +terence +terenere +terens +teresa +teresa +teresa codling +teresa13 +teresa25 +teresa5 +teretere +tereto1471 +terez +terfrieden +teri +teri +tering78 +terje1991 +terlasck +terlin4213 +termbuh01 +termbuh02 +termbuh03 +termbuh04 +termbuh05 +termina +terminal32 +terminate +terminus6 +termixes +termolom +termos11 +termostat2211 +terpanpe +terps1core +terr## +terr0101 +terr231 +terr2k7 +terr@1 +terra008 +terra112 +terra1220 +terra1228 +terra123 +terra1786 +terra1956 +terra1958 +terra1998 +terra2003 +terra2005 +terra2227 +terra2k4 +terra3041 +terra4020 +terra4711 +terra486 +terra4ever +terra4u +terra4us +terra5033 +terra555 +terra573 +terra6764 +terra7 +terra722 +terra7654 +terra98 +terra9999 +terraT9 +terraassel +terrababbel +terrabone +terrabook +terrabox +terracamper +terrachef +terrachick +terracosmos +terracotta5 +terrafug +terrago21 +terragor +terraheidi +terraholger +terraize +terraleison +terrallib +terramaa +terramalb +terramate +terramia +terramike +terramohr +terramops +terran +terrance +terraner +terranick +terrapalme +terrapass +terrapass!! +terrapass05 +terrapass11 +terrapuppe +terraqwe +terrarabe +terrarek +terraricci +terrarost +terras+1 +terrasalo +terrashop +terrashopper +terrasocke +terrasono +terrasses +terratamtam +terratec +terratilo +terratim +terratoner +terrauser +terrawater +terrawebde +terraxxx +terrazer +terrazwanzig +terrell1 +terremoto +terrence +terrestre +terri +terri1 +terria79 +terridan +terrier98 +terrina09 +territorio +terro255 +terrodkp +terroid2302 +terror +terror28 +terror43 +terror88 +terrormachine +terrorshop +terry +terry +terry ann +terry the +terry2 +terry246 +terryll +tersen +terserah +tersus +tertius +teru +terus +terutoyo +tes123 +tes1udo +tes35nan +tesa1090 +tesa99 +tesciowa11 +tesco1018 +tesczk +tesedb23 +tesla +tesnoob +teson1981 +tess +tess +tess12a +tessa +tesse100 +tessera +tessie +tessie +test +test +test! +test*win +test000 +test01 +test05 +test07 +test0815 +test0mh +test1 +test1036 +test12 +test123 +test1234 +test124 +test125 +test13 +test1337 +test15 +test1947 +test1n6 +test1qaz +test2005 +test2009 +test21 +test23 +test2345 +test234g +test2t2t +test3 +test3105 +test321 +test33 +test432 +test4321 +test445 +test45 +test4me +test4now +test5 +test520 +test55 +test621 +test666 +test77 +test7788 +test79 +test88 +test9246 +test99 +test9cma +testa +testacct +testas +testas2 +testas97 +testcms +testcon +teste +teste123 +teste23 +testeabc +testecca +tested10 +testeh +testen +tester +tester12 +tester55 +tester56 +tester78 +testera2 +testere +testerriva +testest +testeteste +testeur +testfor +testhejsan +testi +testi123 +testicle +testicule +testimo69 +testin +testing +testingdkp +testkanin +testkunde +testme +testnb +testneta +testnick +testnoob +testo +testok +testone +testorus +testowe +testpass +testpasswd +testpw +testrish +teststr +teststring +testt +testtest +testtt +testung +testure +testus +testuser +testuser +testuser123 +testxx +tesudo +teszter +tetar +tetaza +tetchie +tether01 +tetik +tetilia +tetkoveg +tetomas browne +tetona19 +tetouani +tetra77 +tetrabyte +tetradka +tetris345 +tets +tetsu +tetsuhara +tetsuko +tetsuo +tetsuro +tetsuyo +tetsy +tettin +tetzuro +teufel +teufel20 +teufel24 +teufel33 +teufel7 +teuk +teukkala +teurerdrucker +teutonen +tevaite +tevbm +tevekkul1 +tevez +tevion +tevoleb +tevpuxat +tewlm +tex +texaco2000 +texans1991 +texas +texas jim +texas001 +texas2 +texas2k3 +texi00 +texsaco +text +textbox +textmarker +textmarker!! +textsc +textures +tezdodof +tezhmh6y +tezlaf +tezy123 +tezzaf +tezzan18 +tf1f2f3 +tf2237bj +tf23olu8 +tf251181 +tf4bek +tf9085ag +tf946a +tfatf1990 +tfatf345 +tfc913 +tfcvbg +tfdpw +tfh56 +tfhm35 +tfhsugs +tfiw3 +tfp0k +tftftf +tftotv +tfw5y +tfw7lgcp +tfwbwy77 +tfzm6 +tg123 +tg207900 +tg4dmt2 +tg656g +tg6ertm6 +tg6x4a62 +tgareed +tgb6yhn +tgbbgt +tgbikm6 +tgbtgb +tgbwt +tgbyhn +tgcompa +tgdm7635 +tgejsrj +tgeq7avp +tgf666 +tgf6d +tggdef +tghjk123 +tgirl78 +tgjnq +tgjz0 +tgkmgoii +tgl +tglefqp3 +tgnqqb +tgonissan +tgq2gue8 +tgr +tgre5 +tgropp +tgruet +tgs1896 +tgskw +tgsmd +tguruqpv +tgvui +tgyhuj13 +tgyuhdvj +tgzh78 +th +th0021 +th0mas12 +th0r4x3y +th0rns +th169005 +th1999 +th1nkw3b +th260875 +th281279 +th2quii +th3B0d +th3fuck +th3jdt +th3m4n +th3p4ss7 +th3ron +th4nk5 +th6500 +th6j8k89 +th93tn +thabmt +thaddeur1 +thaddeus +thadeu94 +thaeshia +thag4178 +thai123 +thai1402 +thai1on +thai2003 +thaikhoa +thailand +thais +thaism +thaitu13 +thaiwhite +thaler.0 +thales +thales76 +thalia +thalmus +thaman +thambu +thamila +than +thanatos506 +thanatos99 +thandi21 +thanessi +thangcu +thanhdc +thanhtamhc +thankgod777 +thanks +thankyou +thankyou6 +thankyou7303 +thanna +thanx123 +thanyarat +thao +thapa +tharamir +thargor +tharizzy +thasargo +thashit +thasos90 +thatsgay +thatsme +thatsme1 +thavary +thayer +thb0410 +thc100 +thc420 +thc43 +thcsvtt +thcthc +thdder11 +the +the0den +the1elf +the1one +the3dragon +the3the3 +the4252 +the4321 +the555 +the8ire +the995 +thea +theabyss +theahr +thealarm +theanilsen +theard +theater +theband +thebeatle1 +thebest4u +thebigbang +thebigs1 +thebird +thebird5 +theblac +theblack +thebnl +theboat +theboss +theboss77 +thebothy +theboys +thebro +thebstyo +thecakeisalie +thecats3 +theclan +thecocos +thecore +thecrunch +thecube +thecure +thecutie +theda +thedarks +thedead7 +thedeal +thedean +thedean1 +thedeath +thedoc +thedoors +thedream +theduke +thee3nde +theel888 +theemuts +theend55 +thefire +thefirm +theflood +thefox118 +thefr3ak +thefrog +theft +thegame +thegamer +thegers +theghost +thegizmo +thegoran +thegreat8092 +thegreattaco +thegreatzippo +theguide +thehacker1234 +thehax +thehead +theinferno +theisel +theiskanen +thejumpy +thek8080 +thekey06 +thekillers2 +theking +theking1995 +thekingishere +theklown +theldon13 +thelia88 +thelightguild +thelma +thelma12 +thelonious +thelopk +thelove +thema27 +themag +theman +theman12 +themaster +thematrix +thematz +themaw +themike +themoi09 +themoose +themora +themora7 +themp +thena +thenorb +thenumber1 +theo +theo0105 +theo1702 +theo52 +theoaman +theob +theobaja +theocom +theodirekt +theodor +theodor +theodora +theodore +theodore +theodoros +theoenzo +theofilos1980 +theoforever +theoharis +theologian1979 +theon +theona +theonepizza +theonly1 +theonly24 +theory2585 +thepapz +thepass +thepassword +thepchak +thepearl +thepig123 +thepyut +therain1 +therapie +therapists51 +theravada +therebel +thered1 +thereddemon +thereich +theres123 +theresa +theresa +theresa7 +theresa97 +theresamaurer +therese +therese +therider +therm +thermopylae1 +therock +therock17 +therock85 +theromix +theron +theroof +theroot8 +therrasa +therudy +thesaint +thesaints +thesaurus2 +theshark +theshit +thesims +thesism +thesnap +thespur +thestorm +thestronger +thesums +thetest +thethief +thetower +thetru7h +theus +theuser +thewall +thewolf +thexang1 +thexxx +theydid +thezip +thezone +thhhsy07 +thhk23 +thhs20 +thi2g4ou +thi8fro5 +thibault1909 +thiblama +thichhuy +thick +thidasao +thiefgol +thiele1013 +thien +thienan +thienquang +thierry +thierry +thievessuck +thiew6le +thifbhxv +thihiep +thiho5y +thijs +thil0293 +thillpa +thilor88 +thilyde +thimada +thimo +things +think! +think1 +think123 +think99 +thinkbig +thinkpad +thiongo +thira6160 +thirdeye +thirty +thirty30 +this +this99 +this99c +thisekim +thisis2 +thisisit +thisiskriegs +thisisme +thisissu +thitipong +thixhxnv +thjkg +thk02023 +thkh1006 +thl0502 +thluan26 +thm0zx57 +thmhcb +thoby27 +thokubi +thom +thom5635 +thomann1 +thomann22 +thomas +thomas +thomas browne +thomas peter +thomas0229 +thomas0922 +thomas114 +thomas1212 +thomas13 +thomas2475 +thomas26 +thomas3! +thomas31 +thomas3116 +thomas69 +thomas7913 +thomas84 +thomas87 +thomas9002 +thomas? +thomasa +thomascz +thomasralf +thomasrie +thomaswilli +thomay77 +thomaz175 +thommi25 +thommy +thommy +thompson1987 +thompstone +thomsen +thomy +thoni1603 +thonmou +thoobe +thophoenix +thor +thor0511 +thor1986 +thor1and +thor3200 +thor5500 +thor721 +thor77 +thora +thorall88 +thorbek9 +thorbjorn +thorby74 +thorcito +thored +thoren123 +thorino +thorium +thorlee1 +thorley +thornhold +thornton +thoroden +thoron01 +thorpe2 +thorsten +thorsten1 +thorty77 +thosadel +thosebastards +thotbot +thotho +thoto +thought +thousoa2 +thr1u3de +thr34yhw +thrall222 +thrall66 +thrall69 +thrasher1 +thrawn96 +three3 +threeforall +threegee +threepio717 +threnody1 +thrice +thrice5614 +thridday3 +thro5rip +throw1away +ths1sas2 +thschdb +tht +thtfpc +thtt2005 +thttit1 +thu4399 +thuan1505 +thuban1712 +thucky +thuesen123 +thugger +thuglif3 +thuglife29 +thuhien +thuhtha1 +thuk12 +thukm +thule74 +thumas +thumm +thumper +thumper011 +thumper70 +thun2taz +thun4 +thunda69 +thundd7 +thunder +thunder1959 +thunder49 +thundera1000 +thunderb09 +thunderbird +thundercats69 +thunderstaind +thundor +thuongmai +thuqlife +thuram +thurgau1 +thurnica +thurston +thury3326 +thusipe +thussy +thuy an +thuyden +thuyphuong +thvb5482 +thvs8426 +thw15 +thx11 +thx1138 +thx1631 +thx4910 +thx4axx +thx51183 +thxforno +thxthx +thyson0804 +thzthzthz +ti +ti19nk3a +ti2007if +ti29641 +ti2tan +ti500 +ti570913 +ti5ger +ti7690 +ti8mat +ti9n3t +tiad2008 +tiaelva +tiago2337 +tiamat +tiamo +tiamo123 +tian1985 +tianfang +tiantian +tiarni +tibbs30 +tiberia +tiberio +tibet2008 +tibet737 +tibetspaniel +tibi616 +tibia258 +tibili +tibis +tibo1603 +tibor +tibotibo +tibout +tibsun +tibsun85 +tibyvozm +ticafisa +tical421 +ticketpw +tickets +tickkid +tico +tico00 +ticoddia +tictac +tidalis +tiddies1 +tiddles12 +tiderlag +tides1 +tidlbbld +tidus +tieRney +tiedrope +tieger1 +tiehchen +tien +tien6881 +tienhoang +tier1con +tierra +tierrr5 +tiesto +tifelt67 +tiff7781 +tiffamb5 +tiffany +tiffany +tiffy817 +tiflolfb +tige +tiger +tiger +tiger01 +tiger1 +tiger107 +tiger123 +tiger167 +tiger1986 +tiger3 +tiger3120 +tiger334 +tiger44 +tiger55 +tiger571 +tiger6 +tiger728 +tiger999 +tigerboy +tigeress2 +tigerjun +tigerkatze04 +tigerkatze99 +tigerlein +tigerlilly27 +tigerlove +tigerman +tigerman007 +tigerpro400 +tigers +tigers1 +tigers34 +tigers4906 +tigers89 +tigers99 +tigershark007 +tigerter +tigga +tigga2403 +tigger +tigger +tigger11 +tigger1337 +tigger211 +tigger26 +tigger66 +tigger707 +tigger77 +tiggerente +tiggi2300 +tiggyfox +tight +tightwad +tiglath05 +tiglion +tignes96 +tigra1205 +tigran +tigre +tigre171717 +tigre250 +tigresse +tigris +tigrou +tigslam +tih16 +tihi +tijanag +tijger +tijgertje +tijgertje13 +tijn +tijo1234 +tijxiyer +tik2tak +tikaret0 +tiki +tikkasa +tikore00 +tikotiko +tikras +tiktik2 +tikva +til +til1bbr +tilababe +tilardis +tilayo +tilda +tilda1234 +tilde1 +tilitili1 +tilleul +tillf2 +tilli +tilli53 +tillia2 +tillie +tilltill1 +tilly +tillydog +tilman +tilo +tilongli +tilsa +tilt99 +tiltas77 +tiltinii +tiltrerr +tilvct +tim +tim +tim123 +tim14 +tim23899 +tim24 +tim3lin3 +tim6bod +tim8xfdq +tima +timaestro +timark +timasna +timber151 +timberden8 +timberw0lf +timbosen +time +time1313 +time2go +time2run +time393 +time4dvd +timecode +timefun2 +timegate +timelord83 +timeout12 +timer +timeset2 +timesink1 +timesleeper +timesliper +timesmine +timespli +timessers +timetokill +timewarp +timex002 +timgra +timi1710 +timict +timimi +timisgod +timisoara1900 +timitimi +timjan +timli +timlksss +timmaik +timmass +timmey +timmi +timmy +timmy1 +timmy123 +timmy3232 +timmyc +timo +timo +timo0377 +timo1234 +timo1405 +timo1993 +timo20 +timoas +timoboll +timokm +timolini +timon001 +timon86 +timona29 +timothy +timothy +timothy daniel +timothy71 +timothy8439 +timowe +timpe +timpieh +timppa +timsah +timsnarf +timtaler +timtest +timtim +timtom14 +timwp493 +tin768 +tina +tina +tina marie +tina1234 +tina2118 +tina36 +tinac +tinacade +tinacris +tinamarie +tinanina +tinapierre +tinarose +tinaseda +tinavaga +tinbubu +tinchair34 +tinchen63 +tincho23 +tindeja +tindorf +tindra23 +tine +tine +tine0425 +tine12 +tine3004 +tine77a +tinez +ting0312 +ting0ds +ting1020 +tinghir +tingi1282 +tingo5881 +tingod12 +tingot +tingtong +tingzhen +tinhorse841 +tinhyeu +tini82 +tinier64 +tiniwini +tinka2004 +tinker +tinker23 +tinkerbell +tinkerbell73 +tinkerbutt +tinktink +tino +tino +tino1403 +tinok +tinone71 +tinout +tinpen46 +tinrafu +tinrey +tinroofs +tinsun448 +tintable169 +tintatinta2 +tintin +tintin22 +tintin30 +tintinkid +tintinss +tinus753 +tinute +tiny +tiny sanford +tinyfins +tinylk00 +tinyva +tioedcom +tip +tipitipi +tipmis +tipo709 +tipp3 +tipper +tippex +tippi +tippi20 +tippman22 +tippoff +tippy +tippy3518 +tipsen +tipster2 +tiptawiq +tiptop +tipvirus +tiq25nif +tiquicia +tiraflan +tirana +tiraslune +tirebaba +tireir0n +tireiron +tirethar +tirick +tiriniti +tirmant +tirolel +tirpes4 +tirqikav +tirvib56 +tisa +tiscali +tisch +tische50 +tischler +tischtennis +tise +tish0920 +tisme09 +tissemand +tissit +tista73 +tit +tita +titan +titan77 +titanic1 +titanio. +titanis1 +titanium55 +titanix +titans +titans82 +titanus6 +titanw +titatovenaar +titbrune +titel +titeuf +titi +titi0712 +titi2010 +titi50 +titicaca +titichat +titifosi +titina +titisari +titm0use +tito +tito1979 +tito77 +tito98 +titof19 +titok10 +titokash +titolino +titopup +titos +titou +titou02 +titou357 +titoufou +titoun +titounne +titous +titout +titout66 +titpoty +titsunop +tittina +tittmann +tittou +tittybar +titualan +titus +titwank +tiucho +tiuneb +tiverton +tivins +tivoli2000 +tiw37fad +tiwelc7m +tix4321 +tixiam78 +tiy87doj +tiyjicid +tizatiza +tizcmg6w +tizi05 +tizi2004 +tiziana +tiziano +tizjeyat +tizniti +tizta +tizv0rvm +tizz8575 +tj1176 +tj120870 +tj12sonz +tj164 +tj2k9 +tj3c9g4 +tj492 +tj4cf32g +tj7890 +tj9801 +tjatja +tjbdms +tjc74084 +tjcombo +tjenare116 +tjh6099 +tjiang60 +tjingo +tjk3r +tjksys +tjo9jjgr +tjockast +tjoller +tjorban +tjordan1986 +tjorven +tjosan +tjriker +tjrxg +tjs09080 +tjt90 +tjzrxfw +tk02tera +tk050865 +tk141610 +tk310197 +tk3210 +tk421 +tk4211 +tk45jb +tk5820 +tk67ozan +tkatec1 +tkats05 +tkb81855 +tkd584 +tkd6420 +tkd823 +tkeon207 +tkgqiyj9 +tkhpbm1g +tkhue +tkittkit1 +tklove +tkmdb098 +tkme +tkn25gk +tknh665 +tkp +tkp1984 +tkp265a +tkppp +tkpubxu +tkr2c +tkscyber +tksn9a +tktktk +tktyf +tkw2f +tkzpnotk +tl074acn +tl100409 +tl1806 +tl429502 +tl441990 +tl4s +tl8bwang +tlc4u +tle1013 +tleeep +tlemtl +tlezhar +tlk204f +tll2006 +tlljttgw +tlm13000 +tlmstr99 +tlnchang +tlnewv5 +tloclthw +tlogar83 +tloj9 +tloknis +tlongl66 +tlow4 +tlp0609 +tlqpnr +tlr5xgpk +tls4ever +tlsclan +tlspass +tlt +tltj2004 +tlwb168 +tlx +tlxgx +tlxmlk76 +tlyttlyt +tlzoyup5 +tm +tm000 +tm1505 +tm23wp +tm4pass +tm6bu +tm946492 +tmaafm +tmakm +tmama +tman5150 +tmb003 +tmb1234 +tmb523 +tmbah +tmbg2005 +tmbuxqfw +tmchat +tmed33 +tmfhzs +tmftw03 +tmgrup +tmi7l201 +tmibfatd +tmicto +tmim4op +tmlcsh +tmltml +tmm003 +tmownzu +tmp +tmp1175 +tmp14c +tmp1907 +tmp2435 +tmp3456 +tmp5 +tmp6 +tmp8 +tmpfoilo +tmq14o +tmsgv +tmt0wtd1 +tmtbox69 +tmvndlp +tmwolfe1 +tmwsiy +tmx59230 +tn97ghpr +tnbgr +tnc9jkad +tnd4s +tne5985 +tnecinv2 +tnerber +tnerolf +tng2000 +tnhr2212 +tnilF +tnitgk +tnitgk15 +tnl +tno9v +tnowned +tnsf +tnt2428 +tnt4you +tntbest +tntm0kmk +tnv19 +tnwke +tnxu3j +tnzloxas +to man +to1fe2 +to2710ni +to305331 +to3r76vl +to43ad +to4vn +to55674 +to67655 +to7ZajQ848 +toad +toad222 +toadyu77 +toamas +toantu +toanuva +toanyeu +toast +toast100 +toaster +toasti +toastie +toasty +tob1 +toba1979 +tobacco +tobacco1984 +tobalo +tobase12 +tobbel +tobgun +tobi +tobi1903 +tobi1993 +tobi6001 +tobi94 +tobias +tobias +tobiasjensen +tobiasz90 +tobidog +tobie14 +tobilein +tobin1991 +tobintobin +tobita +toblerone100 +toboso44 +tobteam +tobtys +toby +toby +tobyas1 +toc-toc +tocama +tochamay +tocixe +tocoloco +tocool +tocraa89 +tocraz +toctoc +tod +tod123 +todama +today0823 +todayne +todd +todd +todd2411 +toddzy11 +todesengel666 +todesman +todhui21 +todiefor +todo1957 +todohux +todoit +todonte5 +todor007 +toeff123 +toefff +toeisom +toekruid5728 +toenies +toepl19 +tofast +tofeusz +toffee +toffik89 +toffylt +tofight +tofikk1 +tofkk +tofor2ws +tofudelivery +togashi00 +togo +togo +tohfaflo +tohleto +tohope924 +tohybkol +toilatoi +toilet +toille69 +toisgay +toiyeuem +tojestto +tojs +toka2345 +tokaca73 +tokaoka +tokay2003 +toke +toke101 +toke12 +toker1963 +tokeshi +tokimeku1 +tokky +tokmak +toko +toko666 +tokres +toktok +tokyo1 +tokyo47 +tol +tol19pun +tola +tola33 +tola89 +tolbert55 +toledo +toledo1 +toledo16 +toledo1971 +toledo71 +tolen4486 +tolete +tolf0280 +tolga +tolga41 +tolga88 +tolgahan +tolgalex +toli1235 +toliana +tolis +tolkien +tolkiendr +toll2toll +tolles +tollpatch +tolly88 +tolong +tolosa +tolosa31 +tolosh +tolotoss +tolpan69 +tolt5 +toluca1 +tolun +toly1993 +tom +tom +tom browne +tom marlow +tom001 +tom0847 +tom16888 +tom19val +tom35795 +tom5098 +tom55 +tom7 +toma +tomachu +tomahna +tomamas +tomandme +tomanike +tomarre +tomartomar +tomas +tomas +tomas1 +tomas112 +tomas18 +tomas31 +tomas9 +tomaselli +tomasito +tomasx +tomasz +tomasz +tomasz04 +tomasz3 +tomasz66 +tomaszek33 +tomat1337 +tomate +tomate9x +tomaten2591 +tomater1212 +tomato45 +tomaz +tombarry +tombino +tombol +tombstone +tombulaw +tomcat +tomcat4873 +tomcatb2 +tomce +tomcf +tomdc +tomdnk67 +tomedge +tomek +tomek082 +tomek1 +tomek123 +tomek2 +tomek736 +tomekk +tomekpq +tomer21 +tomerme +tomess +tomi +tomi-lee +tomi011 +tomi1 +tomi123 +tomi29 +tomi71 +tomi79 +tomiboy +tomicek2 +tomico99 +tomijons +tomik +tomimester +tomimo83 +tomis29 +tomislav33 +tomita99 +tomixx +tomjer +tomk9934 +tomke +tomkitty +tommaski +tommaso93 +tommi2005 +tommi2211 +tommi2709 +tommi33 +tommiker +tommy +tommy +tommy lee +tommy1963 +tommy20 +tommy2008 +tommy234 +tommy4116 +tommy66 +tommyboy +tommykeane +tommyv33 +tomnat12 +tomoe +tomoko +tomoko#1 +tomoks +tomorb +tomous +tompa35 +tompon91 +tompson +tomqu1 +tomselec +tomt +tomthumb +tomtit +tomto85 +tomtom +tomtom08 +tomtutte +tomvoi +tomy012 +tomyetle +tomz4a +tomzach1 +tomzi +tomzy63 +ton +ton1227 +toncat +toncsik +toncsili +tone +tone +tonedef +tonello +toner +toner966 +tonerboy +tong2003 +tongkou +tonglong +tongxu +toni +toni ann +toni123 +tonias1s +tonic +tonico +tonie +tonie edgar +toniel +toniishot +tonikill +tonimo +toninho22 +tonio +tonio +tonio111 +tonitina +tonitoni +tonje kamilla +tonko +tonkpils +tonne1509 +tonne5 +tonnerre +tonney99 +tono +tonoumas +tonoumou +tons +tontao +tonto822 +tonton +tonton051 +tonton59 +tonton82 +tontong +tontonq +tontotud +tonttu9498 +tonuonu +tonus +tony +tony +tony fox +tonyblare +tonybo +tonycody +tonygate +tonymelo +tonytony +tonyzhou +toobad +toocool +toocool2 +toogohome +toogood83 +toohals1 +took2518 +tookie +tool +tool1234 +toolate +tools +toon +toonarmy +toonice +toontje +toontown14 +toor +toor06 +toor124 +toorroot +tooru +tooters11 +toothbrush +toothless68 +toothpaste +toothpick1 +tooties23 +tootme99 +tootsman1 +top-secret +top10 +top123 +top2u +top56pot +topac51 +topaish +topas1313 +topaz +topaze42 +topbuzz +topcat +topdawg +topdog1 +toperhan +topex06 +topf +topfener +topgun +topgun11 +topgun21 +tophost +topkbn +topo13 +topografi +topola90 +topolino +topoloso +toppbuzz +topper6400 +toppond +topsecret +topsi +topsis +topspy +topsy +toptop77 +topvirus +tor +tor +tor2747 +tor8392 +tora +tora8610 +torada +torah +toralv +torana +toranaga120 +toranome +toratora +torax1 +torbali +torbellino +torben +torben87 +torbin +torbjorn +toreador +torello +torente +torfalle +torfbold +torffingen +torger1965 +torger20 +torgniol +torhen +tori12 +tori8888 +toriamos +torin +torin +torjus098 +torlan +tormenta +tormohun +tornade +tornado +torneo +tornero +tornike +toro1234 +toronto +toronto1 +toroon44 +toros +torpedo +torr3ro +torralba +torre +torre123 +torreip +torreira +torrence +torrent +torrents +torres15 +torres9 +torrez +torrin69 +torronto +torrox +torschel +torsen +torsoboy +torstan +torstein91 +torsten +torsten +torsten64 +torsten71 +torsten812 +tortay +torte19 +tortilla +tortillas +tortillon +tortina +tortloa2 +tortor +tortue +tortuga +tortugas +tortumlu +toru +torvald +tosapon +tosba46 +tosca123 +toscana +toscana01 +toscar84 +tosha1993 +toshi335 +toshia +toshiba +toshiba311 +toshio +toshiro +toshiro +toshiyuki +toshko74 +toshner5 +toskana +toskana77 +tosney12 +tosobka +toss51 +tosse411 +tossgirl +tost +tostpl +tosu +totaal +totaia3 +total +total90 +totala +totaldj +totalwar +tote +tote6666 +totejose +totem +totem1 +totem31 +totempaal +toterman +toto +toto +toto01 +toto0101 +toto1111 +toto1234 +toto22 +toto2983 +toto4000 +toto42 +toto43 +toto5678 +toto59 +totogoto +totokoma +totom59 +totong +totony +totopp +totopwo1 +totora2 +totti1 +totti10 +totti60 +tottigol +tou3Fs +touchboy +touche1 +touched3! +touchher +toufik +tougas007 +toughcookies +touhami1 +touj808 +toukokuu123 +toulon83 +toulouse +toun8590 +touranlb +tourisme +tournus71 +toutou00 +touxette +tov +tov37ter +tova +tovafisj +tovah +tove +tovkac +tow43rqz +towar +towari59 +towelove +tower +towere777 +towing98 +towman12 +towtow +tox150 +toxic +toxicity +toxkravi +toyah +toygar +toyjvid +toyka1166 +toyota +toyota370 +toyota93 +toyota98 +toypaj +toysrus1234 +toytoy +tozala +tozfekom +tp112192 +tp123456 +tp3ws +tp4m4 +tp64331 +tp666999 +tp852456 +tp987 +tpacap89 +tpb1988 +tpdkep0n +tpedsim +tpel2 +tpemis +tpferber +tphs14 +tpi4il +tpiris +tpkiller +tpkra +tplaner +tpldate +tpm1979 +tpnelson +tpt3666 +tptla +tpx8282 +tq123 +tq5q8j4h +tqb0y +tqiht +tqj7omis +tqmh4234 +tqnqm0ma +tqtrreqt +tqueel +tquif3pv +tquilpue +tr +tr00ster +tr021605 +tr030990 +tr0lley +tr0users +tr0y1775 +tr1299 +tr1d3nt +tr1ksr +tr1skele +tr1st4n1 +tr1v1um +tr2005 +tr2ucri9 +tr3state +tr4ck +tr4kt0r +tr553 +tr6rghr5 +tr7kqi4r +tr7stan +tra +tra1n1ng +trabaho +traben78 +trabzon +trace9366 +traceman +tracer +tracert +tracey +tracey +track27 +tracker +trackman5 +tracor72 +tracti0n +tracy +tracy +tracy camilla +trader +traenen +traerisi +traf2004 +trafdoc +traff1cs +trafo123 +traful77 +tragedia1 +tragedy94 +traicen +train001 +train01 +train19 +train6 +train9 +training04 +trainnut +trains +trainsim +trajanas +trak5763 +trakin +trako1691 +traks035 +traktor +traktor6320 +traktorsmajo +traladon +tralari +trall1337 +traltank +tram15 +trama123 +tramix123 +trampoline1992 +tramwaj +trance +trance01 +trancer1 +trancos +tranes91 +trang +trangden +tranio0216 +transa +transall +transam +transflow +transformers14 +transitman +transmen +transmul +transport +tranthi +trapcc12 +trapgod +trapid +trapone +trappedunder +trapper +trappluv +trapster +trasca100 +trash +trash133 +trasher +traskis +tratata +traubell1 +traud1207 +traudel2003 +traudich +traudt +trauerweide1 +trauma85 +traumad8 +traumflieger +traunstein +traunstein2000 +trauodub +traute +trav3ll0 +travedus +travel +travel19 +travelkills +traveller +travelmate +traverz +travian +travieso1234 +traviono +travis +travis1525 +trax1979 +traxew +traxli72 +traxman +tray13 +trayan +trayout +trazon1992 +trb4s +trd3122 +tre5pa55 +tre999nt +treaces +tread753 +treat +treatme1 +treazer +trebaja +trebas123 +trebev11 +trebm@l +treborts +trebron52 +trebvc +trecool +tred20 +tredan2k +tredit +tree +tree123 +tree1234 +tree3188 +treehouse +treenest +trees +trees21 +treesap +treese +treesrock +treetree +treff +trefoils +tregfdcb +trei26 +treiber666 +treinspoor +treizor +trek2003 +trek95 +trekers +trekken1 +trekkie08 +trekoclv +trekr +trelacasa +trelayna +trelos +trembita +tremere25 +tremoa +tremonia +tremono +tremsrj +trenare +trenato +trendlab +trenie49 +trennle +trent +trent192 +trental600 +trenza1990 +treo680 +trep108 +trepenne +treplex +treppe56 +treppe88 +trequan +trert +trescaro +trespass +tresyvau +tretre +tretti1963 +tretze15 +trev0301 +trevelin +trevica +treviro +trevon084 +trevor +trevordash +trevp +trewmir +trex0078 +trexny22 +trey +treyer89 +treyford1988 +trezza +trf13ry +trh682s +trhetrhe +tri8b +trial +trial1 +trial666 +triangle1 +triatlon +tribal +tribal6688 +tribal95 +triball2 +tribantr +tribbles2 +tribe420 +tribe9402 +tribute93 +triceps +trich +trici18 +tricia +tricia leigh +tricia04 +trick123 +trickortreat +trickster78 +tricksy1985 +tricktrick +tricky26 +tricolor +tricornio +triden28 +trident +triep0oh +trier07 +trieste +trieudo +trifit +triga2 +triger +trigger +trigger the +trigger1209 +triggy01 +trigun!2 +triinu +trikemike +triker123456 +trilau +trille +trillian3 +trilogy88 +trilon2006 +trin07 +trinajst +trine10 +trine24 +trini +trinidad +trinidad +triniti +triniti1 +trinitron +trinity +trinity05 +trinity2 +trinity3 +trinnike +trintrin +trionia +triops10 +trip0d +tripelmania +tripin +triple7 +tripleb1 +tripleh +triplennn +trippaz +trips007 +triroya +tris +tris9007 +trish +trish0695 +trish404 +trish912 +trisha +trishale +triskele12 +triskell +tristam +tristan +tristan1974 +tristock +tristram +tritech1 +tritko +triton4670 +triust4u +trivial13 +trivialik +trivikram +trixi659 +trixibandit +trixie +trixie +trixie88 +trixifelix +trixli01 +trixma +trk1997 +trlpe +trlrtl +trmedya +trmhartk +trmn8r +tro100 +troas +trobec +trobor +trock2210 +trockl20 +trodat4817 +troetelbeer +trofast +trofx +trogdor +troge1981 +troia +troika +troile +troisg +troja13 +trojan +trojan9 +trojanaz +trojanek +trojka1 +trokan +trolejbus +troleroo1 +troll08 +troll1 +trolldkp +trolldom +trolle1995 +trolllet +trombone6 +tromlitz +trommy +tromp +tron +tron1701 +troni33 +tronje +troop117 +troop192 +troop261 +troop677 +trooper +trophy1946 +tropi4l +tropica1 +tropicana2 +tropics2 +tropifal +tropoc +tropodo +trorikev +trortam +trottel09 +trotzdem62 +trotzo +trou69 +trouble maker +trouble37 +trouble62 +trovila +trow4665 +trowssap +troxia +troy +troy1966 +troyan39 +troyjb12 +trp09mad +trpi5725 +trriban0 +trrr1 +trs26077 +trscene +trsokpwo +trstno1 +trt4x4 +trtr5 +tru457 +tru6c +trublevr +truc +truciolo +truck +truck98 +trucker3 +truckers38 +trucks +trucksrus +tructruc +trucuz +trude +trudi +trudy +true +true +true12 +true73 +trueblue212 +trueblue92 +truelove +truethat +truiteto +trulben +trule336 +trulv123 +truman +truman87 +trumer +trumpet +trunks +trunks17 +trupaks +trusTme2 +trushca +trust +trust10 +trust2me +trust4me +trustme01 +trustmex +trustno1 +trustno2 +trusttrust +truth +truvaa +truxsp +truyen +trv5t +trva9 +trvipcom +trwibxotih +try2004 +try2hack +try654321 +try8ps45 +tryag +tryag1 +tryagain +tryagain87 +tryagainguild +tryf0n32 +tryit123 +trykker2 +trynagn +tryneun9 +trypes#1 +tryplex53 +tryroot +tryst678 +trythis +trythis1 +trz241w7 +trzebuska132 +trzidiot +ts00286 +ts0310 +ts1079 +ts1414 +ts150984 +ts1566 +ts1967 +ts260988 +ts2893 +ts300387 +ts3216 +ts3247 +ts463 +ts4kxyas +ts527001 +ts5823 +ts729972 +ts9yfzk +ts=!e4h +tsack +tsai +tsai0317 +tsai0335 +tsai0914 +tsai8052 +tsakos +tsang +tsanhan +tsao +tsaphir +tsartaria +tsbaigal +tschaka +tschechi +tschi +tschimmi +tschutschu +tsco06 +tsco17 +tscomfra +tsdancer +tsecret +tset3000 +tsfcy15j +tsg1h +tsg666 +tshat64 +tsiawd +tsid898 +tsilig +tsilla +tsilvap +tsinghua +tsjundo +tskessen +tsktsk +tsliebste +tsm0022 +tsmac007 +tsmoke81 +tsnitn +tsongher +tsoo2 +tsoodle +tsp3628 +tsp98489 +tspyxian +tsre6788 +tss10023 +tssr3335 +tsstss +tstd48 +tstus1 +tstvw84c +tsubasa86 +tsubasalol +tsubinou +tsud40 +tsui siu +tsumarani7 +tsunami +tsunehido +tsuneihiko +tsung +tsurani +tsuruko +tsurumak +tsurutaro +tsuta +tsutoma +tsutomu paul +tsuyo244 +tsuyoi333 +tsuyoshi +tsv1860 +tsv1900 +tsv77bb +tsvetana +tsvpp +tswk1906 +tsybms +tszzxxw +tt +tt001988 +tt009500 +tt030303 +tt08r0ck +tt100200 +tt123tt +tt14341 +tt1w5 +tt2 +tt2706 +tt55knu +tt579 +tta742 +ttads +ttdhqv +tteebb99 +ttel5071 +ttenn287 +tterrag14 +ttfs1983 +ttgg1123 +ttghgh11 +ttgold +tth06 +tthias +ttiimmoo +ttinclude +ttlk6 +ttm0000 +ttmilong +ttn2dne2 +ttocsnob +ttodkkc7 +ttotgotm +ttphong +ttqv2231 +ttsg +ttsg09 +ttszzxx +tttil5 +tttt +tttt1111 +ttttt +tttttt +tttyyy7 +ttubik +ttvqadc7 +ttvvlwwf +ttvvttvv +ttwlob99 +ttwoaini +ttyrjjuy +tu140782 +tu1970 +tu1997 +tu2709 +tu319826 +tu31bb82 +tu4a5na6 +tu54321 +tuamor +tuan +tuan76 +tuananh +tuananh1 +tuananh71 +tuantsc +tuapse666 +tuareg48 +tub49nad +tub9a +tubaboy3 +tubbi77 +tubbs1. +tubby hayes +tuben +tubis +tubithem +tuboop +tuborg +tubwup +tuc3ker +tuc87fes +tucaboy +tucanazo +tucho0 +tucho11 +tuck1010 +tuck123 +tuck1984 +tucker +tucker123 +tucker15 +tucker96 +tucket#1 +tuco1705 +tud105 +tudjofim +tudor +tudortea +tudwofix +tuedio +tuemmler123 +tuerkiye81 +tuesday +tueure +tufatu4 +tuff1 +tuffi01 +tugay +tugay +tugba19 +tugdir12 +tugrdcvs +tugriks +tuh77go +tuhkimo80 +tuhvocax +tui +tui13 +tuidog1 +tuillo +tujpigic +tukanong +tukh +tukicima +tuknaluk +tula +tulasek +tulaysel +tulda +tulic +tulinek +tulip00 +tulle123456789 +tullio +tullow +tully +tulopas +tuloxas +tulpen01 +tulpeter +tultaxax +tumadre +tuman123 +tuman145 +tumany +tumata +tumbavig +tumbles13 +tumemank +tummel618 +tummys +tumorapa +tumtum00 +tuna2469 +tunafish25 +tuncay +tuncay +tuncberk +tuncel +tunclale +tundrapig +tunes2cd +tuneup +tunfisch +tung +tung123 +tung1785 +tung9128 +tungaa +tungtai +tunifac +tuning +tuningxp +tunisan +tunizi +tunnel2000 +tunnele +tunning +tunninga +tunpem35 +tuo1juo +tuonganh +tuongaz +tuoyo +tupac03 +tupac5 +tupelo29 +tuphr123 +tuphrt +tupolev +tuppen04 +tupu +tuqueque +tur23ek +turakine +turan44 +turana +turandot +turb0s1 +turba +turbo +turbo0 +turbo000 +turbo1 +turbo100 +turbo911 +turboninja +turbores +turbox +turco50 +turd +turd1968 +turdmonk +ture +turgut +turgut +turhan +turi +turibio +turilli +turing +turion001 +turituri +turk +turk345 +turkawka664 +turkey +turkiewicz1 +turkix +turkiye +turkiyem +turkoman1 +turkum +turm1947 +turmana +turmel +turmple +turn-on +turna10 +turner +turner +turner8 +turnik +turnip +turnpike +turquia +turrach +turtest +turtle +turtle74 +turtlecupcake +turtles711 +turtles88 +turturean24 +turuncu +turyn22 +turyn8 +tus20rob +tusakill +tusanmaz +tuscan +tushing1 +tusiu13 +tuska1234 +tusken1234 +tusonic +tusse +tusseboy +tussi1990 +tussie06 +tusu45 +tusya1985 +tuta117 +tutan007 +tutbury1610 +tutcat +tuti +tuti14 +tutorial +tutta +tutte +tutti +tuttimaus +tuttomio +tutu +tutu8758 +tututu +tutututu +tuukka123 +tuuletin2 +tuuline +tuveux +tux4ever +tux4life +tuxarulz +tuxedo +tuxibx +tuxshome +tuxtail +tuxz0r +tuyen +tuyucux1 +tuyyo +tuzmebod +tv1000 +tv12345 +tv12nc4 +tv2006 +tv270783 +tv2kig1 +tv4free +tv6dg47r +tv76213 +tvaughan3294 +tvb +tvb493 +tvcabo +tvdl0381 +tvdlhk +tve656 +tve7dwx2 +tverdo +tvesday1 +tvetve +tvf700mh +tvf7g +tvflyers +tvilling +tvirus +tvjs9 +tvkeunuu +tvlkb +tvlquv +tvmacc +tvmidg18 +tvnpass +tvns2121 +tvqclll +tvqjehi +tvs0ss7c +tvs877 +tvst02 +tvszkx +tvt +tvtim +tvtittare +tvttb +tvug2wdw +tvwbgd6d +tvy9l +tvz092 +tvzbbs +tw000314 +tw1832 +tw1ne007 +tw260927 +tw44623 +tw4599 +tw610306 +tw666987 +tw76da89 +tw7qse5b +tw8 +tw902072 +twaddles +twb5540 +twbnm4u +tweak44 +tweak821 +tweakin +tweakit +tweba007 +tweeling +tweenies1 +tweenies45 +tweety +tweety14 +tweety2811 +tweeufo +tweezy +twente40 +twentyoa +tweny4 +twhor +twierdza +twigge27 +twigtmo +twilight +twilight3497 +twilo2000 +twinax +twingo411 +twinkelingen +twinkle +twinmoon +twins99 +twinsfxp +twinsno5 +twisted1 +twistees +twister +twisting +twitch09 +twitch25 +twix123 +twiztid +twjmax12 +twm1978 +twmission +twn9jkpo +twodogs +twodogss +twokids +twopac +twopac489 +twopeeps +tworca88 +twosdna +twotdtbq +twotwo +twoweeks +twoza +twsky122 +twybzys7 +tx1037 +tx1train +tx3oph +tx478nq +tx75161 +tx76262 +tx78621 +txbrlo +txdbqb +txemibu +txffu +txg1263 +txg2y +txm6g +txoxamvf +txp123456 +txr4r +txsgw +txuwapa +txw9a3fg +txxw +txxz8056 +ty +ty +ty0192 +ty118 +ty134081 +ty140680 +ty2ld +ty3600 +ty36mq +ty3wvq84 +ty451070 +ty59df +ty5zz +ty61692 +ty6351ro +ty6ft +ty888888 +ty8aq +tyacru +tyaisha1 +tyasdf12 +tycoon +tyeugdc +tygbuh +tyger411 +tygerblood +tyhs12 +tyhuju +tyhwth45 +tyk665 +tyke +tylamia +tyldo +tyler +tyler0187 +tyler0910 +tyler1210 +tyler1352 +tyler2236 +tyler8684 +tylerb33 +tylerd. +tylerlee +tylers1 +tylko24 +tylo1993 +tyluma +tymbark +tymbark15 +tyme013 +tymelyne +tyn6ser2 +tyne +tynyrara +typek813 +typemeta +typewriter5555 +typhoon +typo123 +typo1642 +typo2typo +typo3 +typo3X +typo4me +typobb +tyquan1987 +tyr768d +tyran067 +tyranny2008 +tyrant0307 +tyrbw +tyrell +tyrese2003 +tyrese2234 +tyrian6 +tyrkia05 +tyron1 +tyrone +tysd9405 +tysia02 +tysis +tyska610 +tyskie +tyson +tyson14 +tysony +tytan +tytxrg +tytyty +tyu1234 +tyu5381q +tyu729 +tyubnm56 +tyui36 +tyumen1993 +tyuntyi +tyuo456 +tyutyu +tyuuyt +tywyn +tyxxx +tz0n1n +tz220322 +tz6y32 +tz776677 +tza +tzan +tzanou +tzar2002 +tzav24 +tzfwr +tzh40xxx +tzibx +tzigare +tzimisce +tzine13 +tzscm1cj +tztzl +tzu5tzu +tzuiop12 +tzxvh +téméraire +u0159157 +u0486399 +u0spz2ze +u0vuq +u1234 +u12bme +u18732 +u19a5g3e +u1b5197g +u1hgg +u1scgedd +u1thhpt5 +u21w8e +u22ar7ex +u22u4nlz +u27410 +u27691 +u28elvs +u2NYJx +u2die2u +u2ezfdbv +u2ipod +u2rqg +u31b3hm +u3certs +u3gmp +u3q4teoc +u4011720 +u41xu61 +u4356 +u4370829 +u4670049 +u472bmt +u473z +u49po6 +u4eczck2 +u4th6agg +u4wgs +u4zhz +u52118 +u567sker +u5nwc37s +u5oanay +u5orr +u5sky +u5sun +u6232496 +u628f +u6587k +u67vbhsm +u6jjz +u6p5a4 +u6tfge +u6wutt4a +u6xgf +u6zna +u70314954 +u7610 +u7ST3h +u7b5m4k4 +u7csw +u7ttq +u85ct2 +u8beernuts +u8drq +u8dycp54 +u8izx4el +u8onetwo +u8short +u8t8e3nm +u906433 +u9262ws2 +u9416032 +u964hero +u9cptw6 +u9ddwrch +u9ppd +u9wby +uA14 +uFo +uHjvjd +uJjfP +uMDLw2 +uMLm8H +uNGmZg +ua5i2lfm +uaband01 +uachep +uae2020 +uaeuae +uafa1976 +uafwave +uagadugu +uan4evar +uaname +uaofzj83 +uap +uaq9rp97 +uareme03 +uat111kl +uatarp +uaz469 +ub149 +ub3535 +ub3fq +ub5ig +ub6ib9 +ub763 +ub7vc6 +ub9it42 +ub9it421 +uba1234 +ubahsaya +ubb80 +ubben6 +ubbpass +uber +uber123 +uberdruid +uberpass +uberuber +ubg63 +ubimnet +ubitch +ublartez +ubmnmy +ubo4life +ubon3499 +uboot +uborka1 +ubp2003 +ubqoo +ubud2 +ubufer +ubulopop +ubuntupower +ubvpv +ubvx8r2l +ubvy2002 +ubyx3 +uc0093 +uc1uc +uc25guq +uc5u1 +uc7ozopu +ucanc7ij +uccife +ucf9e +uciann +ucielp +ucille +ucisaja +ucla9218 +ucnp3 +ucoluk +ucrqg +ucrzs +uctionen +uculutou +ucv1n1 +ucv5o +ucxs911a +uczxtedf +ud0503 +ud1n6 +uda7rl +udaya7777 +udbhdr1 +uddevalla1 +udfej +udig97ks +udila49 +udjpzett +udkl1994 +udmag +udo +udobern3 +udomilz +udorn1975 +udqvv +udrea22 +udri +udsnvidf +uduak +udvanc1 +udx5r +udyeled +udzar9u5 +ue322438 +ue912 +uealdfyp +uebergabe +uebla159 +ueder1 +uefacup +uei199 +uej8m +uekqrby +uentyrod +ueoem +uet26sbt +uevdc +uewmr8lw +uexno +uf7ho +ufacity +ufb598 +ufbhy +ufbunvme +ufebrul +uff88bqz +uffe007 +uffe1336 +uffie! +uffzheim +ufhhz0xd +ufhl5 +ufhvjybrf +ufilmind +ufindus +ufis123 +ufm4f +ufmoag +ufojetu +ufoufo +ufoz2006 +ufrisbee +ufscar2009 +uft3ht3h +ufuk +ufuk12 +ufuk6955 +ufw8g +ufwtmtdh +ufycnths +ufylehfc +ug3piz +ug907 +ug9512 +ugMae +ugabuga +ugadawgs +ugay69 +ugcch +ugcud +ugets73 +uggla12 +ugi123 +ugiap10 +ugjdle3w +ugk939 +ugkrocks +uglol81 +ugluk13 +ugmun +ugnius +ugo +ugoal49 +ugotmail +ugoulburn +ugp67 +ugplyl96 +ugr8455 +ugrokotel +ugt7sm7s +uguessit +ugur +ugur1 +ugur10ur +uguu6f +ugw7ppfj +ugws8 +uh2829 +uh2c2303 +uh5yrq4b +uh98zg76 +uhall1986 +uhbe53 +uhfybwf +uhisgay +uhlenhorst11 +uhling +uhpd0 +uhr03 +uhrzeit90 +uhti1 +uhuhyeah +uhura5662 +uhxcl123 +uhxe7 +ui13mods +ui49900 +ui5j0p07 +ui7hutsn +uia123 +uidf4933 +uidsadw +uie983f9 +uihinuma +uikolas +uimaster +uimh891 +uindy +uiopuiop +uipeges0 +uisba +uitgaan +uitr498 +uitvoerder16 +uivce +uizo1ehw +uj294084 +uj2hijus +uj52 +ujcRINO341 +ujhjljr +ujjcrvsd +ujjeab5b +ujldw +ujnbrf +ujqv1a7g +ujs62mfv +ujsbale +ujserver +ujsriei8 +ujuu4xcj +ujvjcbre +ujvjctrb +uk191619 +uk310749 +ukQ +ukagukag +ukama +ukama0257 +ukb0n291 +ukb8ynun +ukbukbk +ukcdn7oo +ukd1532 +ukgrrt +ukodus24 +ukraine1979 +ukryty2 +uksuvaso +ukulele +ukurukur +ukwv633k +ul +ul0077 +ul366317 +ula +ulahozat +ulajka +ulas123 +ulatdaun +ulaula +ulaula49 +ulazak10 +uleczka +ulf +uli341 +ulicoten +ulilos +ulises100 +ulisses +ulk32tij +ulkayak +ulkucu98 +ulla +ulla1310 +ullabella +ullas1 +uller +ulli +ulli +ulli2005 +ullina +ullis +ullrich +ullrich +ulrich +ulrich +ulrik +ulrike +ulssamet +ulthwe +ultima +ultimaice +ultimate +ultimateend +ultimo +ultipk +ultor911 +ultra +ultra +ultra123 +ultracrim +ultraflash +ultramarino22 +ultramax +ultras90 +ultraviolence +uluklang +ulvia +ulysse +ulyssis998 +um +um0t38 +um0t3812 +um1337 +um190699 +um3556 +um9mze7k +um9rfrxr +uma +umar04 +umar2005 +umar4 +umareus +umarmung +umarramu +umax001 +umax1 +umaybb59 +umaybike +umbaumba +umbawhat +umbaya13 +umberto +umberto +umbertoo +umbimo +umble1234 +umbrella +umbsg +umcalex1 +ume1sho +umeboshi +umecabc +umit1965 +umizah89 +umj22pif +uml42pac +ummah +ummugul +ump +ump459mm +ump5kkzr +umpire30 +umpnyz +umrashed +umstadt73 +umt37xmn +umtsag +umv0d +umwcv +umyjjpf +un1deux2 +un1que +un200875 +un3be +un4saken +un5tm +un6249 +un8phvch +un98n378 +una +una +una4ever +uname +unatco +unbeliever +unbreakable +unc0nwar +unc4907 +unchik +uncle tom +unclegrab +uncleho +und0it +und3rdog +und8mi3l +undcyvonne +undead994 +undeath1 +undefeated +undefined +under +under12 +underbody +underdark123 +underdk7 +underground +underground69 +undergta +underhi1 +undernet +underpants +undertaker +undertaker99 +underwood +underworld +underworld1988 +underworld77 +undri +undying9 +une2351 +uneblonde +unerkann +unesah +uneune +unf34rt7 +unf666 +unforgiven +unfqugt2 +unga666 +ungarn13 +ungetuem +ungido +ungowwa +uni +uni1212 +unibibu +unic0m2 +unicaja +unicath +unico +unicopa +unicorn203 +unicorn7822 +unidad55 +uniextra +unifener +unihoc +uniibk +unikum22 +unionlabel +unip123 +unique +unique9368 +unitec +unitedkingdom +unitedok +unitplus +unitra1 +unity +unity1 +unity980 +unitydisplay +universa1 +universal +universe +university +universum +unix +unix1234 +unknow +unknown +unknown1 +unlady +unleash +unlkxy52 +unlocked +unluck +unn vibeke +unnita +uno +uno +uno23456 +unomismo +unplugged235 +unr1975 +unreal +unreal11 +unreal577 +unreal6260 +unrealp +unrealt +unrequired23 +unrraj +unrwaiso +unsa234 +unsafe +unsecure +unseenlegacy +unser88 +unskilled7 +unsound1234 +unsterblich72 +unter2002 +unterha5 +unterwasser +untitled2341 +untold101 +untouchables +unubayaz +unutma +unutulan +unverhoft2 +unwichtig +unyifa +unyzd +uo9sw0 +uoadmin +uoamse +uoarisa +uogames +uok25 +uokqc +uot1v2ke +up +up0Uc +up2lwe +up3jnlnm +upa0tonu +upabau5t +upadek1 +upc8wkjn +upd4t3 +update +update369 +updown +upearth +upengineer +upenro3m +upl04d3r +uplift007 +uplifted +upload +uploadd +uploader +uploter +upnet00 +upnik +upnslim +upo6qfc8 +upomnahi +upow8 +upperdan +upright2775 +uprising1989 +ups1819 +upsa2000 +upside +upspe1 +upubic2 +upused +upux67 +upvr7 +uq12345 +uq858 +uqkm3 +uqkpy +uqmgtwih +uqo6h +uqr0ck +uqre443 +uqz55 +uqzpd13 +uqzqpa +ur1987 +ur250379 +ur2s4tag +ur4zu +urabella +uracil00 +uraloren +urano6 +uranoob +uranus +uraqt10 +urartu45 +uray +urbagani +urban +urban +urban1324 +urbancik +urbanf0x +urbania2010 +urbannet +urbano +urbano14 +urbisa +urborg +urbutis +urcagax +uremail +uresh963 +ureyawi +urfali63 +urfalim +urgell17 +urgone +uri +uri2009_0318 +uriel +uriela +urielle +urineko +urku777 +urkunde +urkunden321 +urla10 +urlaub +urlaub+ +urmar +urmeli +urnameis +urnoob +urnpad6t +uroboros8813 +urokinas +urology1 +urquhart +ursel +ursina +ursula +ursula +ursula56 +ursulaoberst +urtkunde +uruguay +urumchi +urupd +urusanmu +urz4evah +us +us0304 +us149g3 +us332gr +us346034 +us4uk +us91com +us_arnaiz +usa +usa321 +usable86 +usagi +usagi1 +usagi70 +usair1 +usamaran +usammike +usamnet +usatour +usatuk +usausa +usbusb +uschall +uschi +uschi +uschner +usdkevin +usdym +use +use +use11use +usearch2 +used +used55 +usef321 +useful +usel +useless +useless1 +usenet11 +user +user001 +user0307 +user1 +user100 +user12 +user1234 +user125 +user2004 +user2345 +username +userpass +userxela +usescrt +usfdist +usfr2233 +ushebtit +ushh8bnk +ushi +ushio +ushj75us +ushouse +usibrank +usik1 +usj38sk2 +uskmyo +usm4nz +usman123 +usmc0922 +usmc13 +usmc1970 +usmc2076 +usmc4854 +usmc6541 +usmcdj04 +usmclub2 +usmcmarines +usmsrf +usmusm +usna2004 +usni3386 +usorim54 +usp +usrobotic +usrobotics56 +uss1701e +usslph11 +ust1020 +usta7264 +ustad +ustas +ustasb +ustc123 +ustlqd71 +usu +usu56vfx +usuario2 +usuario5 +usuart +usuck +usuyr +ut0a1201 +ut0pia +ut0wnz +ut1hc2ex +ut2003 +ut22c3 +ut28x17z +ut2k4ido +ut5xt5p8 +uta +utah0616 +utahgf +utaka +utankayu +utapeseu +utcntybz +ute +ute2006 +ute358 +uteijy +utente +uthen +uthffkbyf +uthless +utile +utilisateur +utj1ke6l +utklno +utku7121 +utkuutku +utm4321 +utopiae +utopie +utp9a +utpal +utpepepe +utrulez +utrw5 +utry123 +utschina +uttyx9ua +utvols +utvpuxcp +utvvxye +utxw5 +uu +uu1956 +uu3haxo +uu7nus +uu88uu88 +uu96gax +uubusliv +uuddlrlr +uudyl +uuhhuuuu +uuhkhx +uuiqr +uumbgkjw +uumvu +uupth4x +uurzg +uuscv4qg +uuuaaah +uuuuuuu8 +uuv17 +uuw8kayt +uuxfitho +uv2ulg +uv476 +uva +uvanra2w +uvastaff +uvdm8fgz +uveyk98 +uvlp8 +uvmrm +uvsce +uvxce +uw4dm1n +uw5805 +uwa70 +uwano123 +uwbep4c6 +uwc27yer +uwdada +uwdmq +uwdt2004 +uwe +uwe2004 +uwe3065 +uwealzen +uwecindy +uwem43 +uwex*uwex +uwgwk +uwish +uwj3b6l8 +uwkit +uwo67 +uwotb6ld +uwowned +uwp9qyx +uwrk6q +uxedmohv +uxelee95 +uxisrn +uxjy74ut +uxk1n +uxkarrhb +uxkrpb +uxtmq +uyar +uymqtwgp +uyn9vy8p +uysap123 +uythuyth +uz1oll1e +uzer +uzhfl +uziki2 +uziman13 +uzisadon +uzln3 +uzmancan +uzs1lv14 +uzsrk +uzt678sb +uztu6nmu +uzulo +uzumaki +uzun +uzunkutu +uzunsoft +uzwacken +uzzo4321 +v +v)H202Oo([T:9z +v00D00 +v00d001 +v00k6 +v00vee12 +v0cal1se +v0fa9 +v0h0p0d +v0lk0v +v0ll3y +v0lleyb4ll +v0lv0 +v0lvic +v0ogs +v0pw4ydd +v0qgvx +v0rtex +v0xsmr1 +v1014850 +v112233 +v123v +v128015l +v13lm4 +v172kas +v175hrkk +v1953 +v19533 +v1a3a +v1c12y +v1c1ous +v1c4d2 +v1ct0r +v1ct0r1a +v1deo +v1dvr +v1g0r +v1gorous +v1k801 +v1lander +v1ntage2 +v1o0ltje +v1pass +v1pers +v1v1ana +v1wty +v1x3n +v1xv1x +v1zuu +v21p5169 +v222222l +v22501942 +v2300243 +v23iv23i +v27465 +v27fted7 +v2amoazi +v2avmw8 +v2b4l5jm +v2eb4c34 +v2fhd +v2fopctz +v2h33r3j +v2hadm +v2k9i4ry +v2knc +v2qtr +v2s1qecf +v2s4hcfb +v2uufs3 +v33pn3ss +v3455863 +v34fg34 +v3688v +v37pk75p +v393 +v3ct0r +v3fgd54d +v3h3z7 +v3ldo +v3m9z1k6 +v3mqf859 +v3plu +v3rm0nt +v3rt1g0 +v3terra +v3treus +v3vx +v3xhosts +v3xx +v3y6th +v3yr0n +v4162959 +v434v +v45jd1pg +v45rf78s +v4av2r +v4bt1i +v4cheron +v4dcl +v4l3r4 +v4m4qjry +v4mp1r35 +v513500 +v53066 +v56dxriu +v56fcujc +v599w +v5aktzx8 +v5aqn +v5bi68dg +v5tku +v5v2s1 +v5voq +v5ylk +v6a4v5is +v6aos +v6asdwsx +v6kdc9u +v6zk4ibz +v6zr7t77 +v7242219 +v7257r3h +v7325080 +v733x070 +v774w +v777pbbr +v7878788 +v7cirp +v7izm +v7power +v7wr4h +v7z2hc8v +v809ksf +v892t +v8ilfmsy +v8r2424f +v8rk8hrs +v8vmow +v8zft +v901991 +v9067613 +v984379 +v9898988 +v9civ +v9gauu +v9gh6cc +v9ptqpyo +v9qw7h0w +v9wbb7 +vB2a16 +vBTEAM +vCard9 +vDZ0UE5756 +vFQmJ +vK4diw +vK57CN +vOOdoo +vUDn63 +va123 +va1k +va236904 +va2515is +va8298 +vaTA74 +vaav1985 +vacation +vaccarella +vacfck +vaches1 +vachier +vachulin +vaclav +vaclav001 +vaconst +vacsil +vacuumsalty +vad0604 +vader +vader121 +vader1994 +vader99 +vadersl1 +vadi +vadibo +vadim +vadim +vadim644 +vaea +vaerocks +vaffad +vaffanculo +vagabond3rz +vagenis +vagetta +vagiciqe +vagin +vaginamonkey +vaginer25 +vagonel +vaguelis +vagz2574 +vahan13 +vahid +vahida +vai0774 +vaida +vaidas +vaidute +vaikas +vain2008 +vainfiga +vainillabz +vaio69 +vaira +vairagi1 +vaisselle +vaitcu55 +vaivai +vajaan3 +vajlofoy +vajragur +vakama +vakero50 +vakhtang +vako +val +val007 +val0315 +val17zig +val1961 +val4kelv +valIno12 +valaikorn +valamikor +valan1 +valas2007 +valaur +valberg +valcacer +valde123 +valdek +valdez16 +valdez5642 +valdez79 +valdimir +valdis +valdovas +valduk +vale2604 +vale4593 +vale66 +valeca +valedicenose +valegio +valen1 +valencia +valencia1 +valenciana +valenok +valentin +valentina +valentine +valentine +valera +valera1984 +valeri +valeria +valeria +valeriaabigail +valerialupe +valerian +valerich +valerie +valerie +valerij +valerka +valery +valeska +valeska +valhala1976 +valhalla +vali +vali0573 +vali66 +valiant1 +valider +valiente123 +valimg32 +valimir7 +valio +valisint +valkata +valkir +valkyria +valkyrie +valkyrie70 +valla1412 +vallav +valle2007 +vallejo +valley +valley71 +valleyem1 +valmidas +valo12 +valora +valou6162 +valroot +valser +valsorya +valter +valtera +valth8 +valtoha +valtrugg +value +valuvr +valval17 +valverde +valvert3 +valy +vamapigi +vamisgod +vamos0733 +vamosla34 +vamp1res +vamp28 +vampire +vampire8256 +vampires +vampiri4 +vampiric1! +vampiro182 +vampyr +vamvam +vamvcoe +van +van44deb +van4yel +vanPelt28 +vanaalst +vanahmet +vanakat +vananir +vanasia +vanbaste +vance +vanda +vandai +vandai88 +vandal +vandal59 +vandeman +vandenis +vander +vandessel666 +vandofig +vandoren +vandread0 +vane5per +vanek26s +vanentino +vanessa +vanessa +vanessaa +vang +vang2003 +vang3lis +vang5 +vangal18 +vangard +vangelis +vangelis2801 +vangog +vangogh +vanhalen +vanila56 +vanilje1 +vanilla +vanilla +vanilla1 +vanilla3114 +vanilla8008 +vanille +vanillee +vanitas +vanitygaming +vanja +vankavanka +vankhanh +vanko9229 +vanliga3 +vanloozen117 +vanna +vanni +vannx +vanone +vanos033 +vanpelt +vans2004 +vanset +vansvans +vantica1 +vantrung +vanvan3 +vanvo5jo +vanymfbg +vaolamgi +vapiwudu +vapor281 +vaquette +varada40 +varadero +vararakn +varazur +varfor3 +varfor33 +varfor93 +varga666 +vargas +vargasin +varia06 +variklis +vario +variosystem +various87 +varius1331 +varlius +varnard +varsham +varsity17 +vartolu +varyor +vas +vas1957 +vasa +vasa1 +vasana +vasara +vasbjhjh +vasco1 +vasco65 +vasco80 +vaseduva +vasgert +vasher31 +vasikovs +vasil +vasil +vasile +vasiliki +vasilin +vasily +vasitas +vasko +vasko123 +vasocin +vasoft +vassar +vassil +vassili +vassily +vasso +vasyapoc +vaszko +vatdesec +vatea +vaterland +vatican12 +vato +vattern50 +vattic86 +vatvik8 +vatvik8d +vatwolf +vaucluse +vaugh +vaughan +vaughn +vaughn +vaujours +vault13 +vault1329 +vaur123 +vavhy +vazzago +vb130370 +vb2009 +vb4eva +vb62nldx +vb6ers +vb6terpf +vb78532 +vb8cqgg0 +vballl +vbbu7xma +vbcnvbcn +vbf97nea +vbfgroup +vbgore +vbhfrc +vbms +vbnhjafy +vbnlj +vbnnbv +vbr872 +vbravo +vbst56us +vbvo64gg +vc4dit1e +vc60584 +vc60ez +vc6volc8 +vca33cp +vcardoor +vcasirto +vcauge +vcbcbcb +vccode +vcd72414 +vcela +vcfzj +vciflik +vcjassi +vcpp2 +vcubc +vcwppw1 +vcxxn +vcxz +vczus +vd56huy6 +vddf12 +vddf2 +vdgsp +vdkb4251 +vdli +vdlid +vdm1nbqy +vdmadm13 +vdoble +vdolnk +vdp9e +vdszbz +vdtpic +vdunghyp +vdv1310 +vdv1702 +vdwaxc +vdy12 +vdz9y +ve22 +ve22ra +ve4688st +ve646269 +veb50hop +vecnec38 +vector +vector45 +vectra +vectra53 +veda +veda ann +vedantur +vedrana +veeco +veee8 +veelav +veemon +veerie +veerle123 +vefa +vefamube +vefepase +vega22 +veganero +vegard123 +vegas0808 +vege00 +vegeta +vegeta1 +vegeta17 +vegeta20 +vegeta21 +vegeta23 +vegeta84 +vegeta93 +vegetas +vegetash +vegeto +veggietable +veggvu +vegita182 +vegito +vegus323 +vehyoyb +veintapper +veintitres +veisivi +veiten +vej52nol +vejema +vejita5 +vekmrf +vektor2009 +velari +velasquez +veldhuis88 +velemir +velestur +veliger5 +velimir-bata +velipa +velizar +velko +velkyn +vellum1 +velma dawson +velnias +velns120 +velo2675 +velo2k9 +velocityraids +velodrom +velogios +velokvelok +veloz +vemkaepe +vemzvemz +ven0m +vencommm +vendetti04 +vendex +vendor +venema +venenciuc +venera +venerea +venetia +venets1977 +venezia +venezuela +vengeace +vengeance +vengeance2 +vengen14 +venise76 +venkai5 +venla1901 +venmezaq +venom1313 +venom78 +vent24 +ventanasxp +ventaweb +venter1 +ventilador79 +ventinho +ventura +venu5 +venus +venus3 +venus876 +venusina +venustus +venutech +vepm5p +vepwerac +veq44rap +ver3401 +ver8ung +vera +vera +vera-ellen +veraelke +verano +veras1194 +verast +verastra +veratu +verbatim +verbeek +vercettu +vercinge +verd2002 +verdaguer +verdamt8 +verde +verdel +verdena1 +verdeter +verdienst05 +verdijk1 +verdomme +verdoorn14 +verdu13 +verdus1974 +vereb01 +vereesa +verena +verena +verena1 +verevi +verflucht +verfuhrerin +vergabe1 +vergaser +verger50 +vergessen +vergil +vergilf1 +vergissE +vergisses +vergot22 +veri33 +verificare +verification +verina +verisosa +veritas +verity +verjaner +verkierd +verkina +verkt6y +verli979 +verman76 +vermillion0 +vern +vern1225 +vern5313 +verna +verne +vernel +vernon +vero1717 +verodant +verona +veronica +veronica +veronica420 +veronika +veronika +veronique +veronyui +verra200 +verree +versailles +versanet +version +version4 +versuch3 +versus +versus32 +versus83 +vertical1988 +vertimai +vertrigo +verty +verwenden +very10 +veryape3 +verygood +verylollo +verzella +veskoz +veslemoy +veslo +vespa79 +vestax187 +vestberg +vestel +vester +vester83 +vestigal77 +veszo +vetcool +veteran1971 +vetero8 +vetkim +vetkip +vetnek +vetruey +vette25 +vettelol +vetuliz +vetvet +veumf +veurtstr +vew95b3g +vex1 +veya7Res +veyisbey +veysel +veyyekuw +vezhefew +vf1000f2 +vf5vzen +vfab +vfbrulez +vfc +vfch054 +vfcnlfq +vfczyz +vfdhbrvk +vfhbfyf +vfhbyf +vfierr +vfif11 +vfind +vfitymrf +vfmjypxq +vfnhfc83 +vfnhtirf +vfnm +vfnthbfks1C +vfpoes +vfq7l +vfr800vt +vfran607 +vfrcusus +vfvfgfgf +vfvfvskf +vfvfyf +vfvr6o +vfwcw9l6 +vfz56 +vg14320d +vg2007 +vg321 +vg47bh56 +vge321 +vgeb298 +vgg68spg +vggqk +vgjhc6 +vgog +vgp106 +vgq7o +vgr025 +vgserver +vgta8 +vgv2000 +vgwdekdf +vgy4azta +vgyvgy +vgz7zgv +vgzy1lz7 +vh100257 +vh5150 +vh54vh +vh678xos +vh8zdgxj +vh9ktph +vhagar +vharaawx +vhcaiji +vhcs2 +vhemep +vhf24875 +vhflq2n4 +vhgshwgb +vhia2004 +vhif1 +vhkkkv +vhmhoja +vhqmh8 +vhr1m77m +vhvforum +vhvvw +vhz018 +vhzt9xav +vi +vi0ett +vi137137 +vi1737vi +vi34vi +vi55er +via +via014 +viable +viabr32 +viacheslav +viadinho +viado +vial6611 +vialactea22 +viand01 +vianen92 +viasta +vibeke +vibenuva +vibez +vic +vic +vic123 +vic521 +vicalvic +vicarios +vicben +vice +vicecity +vicente +vicente1 +vicente91 +viceregal +vicfirth8d +viciado18 +vicikvicik +viciodx +vicious +vicka +vicki +vicki raw +vicki713 +vickie +vickings +vickup77 +vicky +vicky03 +vicky1 +vicmie +vico +vico +vicpul +vict5963 +victhor +victor +victor +victor laplace +victor manuel +victor romero +victor san +victor sen +victor01 +victoria +victoria +victoria1157 +victorian87 +victory +victory +victory4 +victrola +victus2014 +vicwood1 +vicxan +vid2 +vida +vidahost +vidal +vide0 +vide0c0n +videl154 +video +video66 +videogame +videopin +videot +vidhzzz +vidlicka +vidolaem +vidosava +vidya123 +viedd514 +vienna +vier +vieri +viet!? +viet56 +vietcong +vietnam +vietnam65 +vietnamese14 +vietzslau +view +view1986 +viewer +viewsonic +viewsonic2 +viewsonic321 +viezlyss +vif32piy +vigan123 +vigato31 +viggi05 +viggo2509 +vigili +vigogeheim +vigor4me +vigorsol +vigro11 +vihur +vii7vi6 +vij1a +vikapika +vikas +vikernes +vikfu +viki +viki1988 +viking +viking66 +vikingas1 +vikingr +vikings +vikings28 +viktor +viktor +viktor2704 +viktor71 +viktoras +viktoria +viktorija +vilaiwan +vilasini +vilay +vilchen +vildan2 +vilgert +vilhelm1 +viliam +viljandi1 +villa114 +villa57 +villads1 +villaea +village +villagepeople +ville942 +villon +vilma +vilnatu +vilnius +vim +vimaju +vimimuju +vin123sc +vinPFS +vinc37 +vinc88 +vince +vince +vince78 +vincent +vincent +vincent1 +vincente +vincenzo +vincenzo +vincere +vinceremo +vinci +vincy91 +vindicati0n1 +vindows641 +vineet123 +vinegar +vinette +vinewein +vinhlong +vini*123 +vini1366 +vinicius +vinipux +vinivinci +vinmar11 +vinn21 +vinnette +vinni12 +vinnik +vinnymac +vino125 +vinod +vinson +vinton +vinvin +vio9t +viobunny +viola +viola +viola3108 +viola6 +violad +violagiglio +violator +violentj +violet +violet +violet kemble +violeta +violeta2002 +violetta +violetta +violin +violines +violino3595 +violinrules +viorel +viorel016 +vip1231 +vip1455 +vip35er +vipdown +viper +viper0 +viper007 +viper12 +viper405 +viper450 +viper579 +viper666 +viper770 +viperatti +viperplt +vipers +vipers1 +vipers46 +vipex11 +viponly +viprip +vipvip +vipvipv +virani82 +virgil +virgil02 +virgilie +virgilio +virgin +virgina +virginia +virginia +virginia lee +virginia true +virginie +virginie +virginio +virgo16 +virgos13 +virgos257 +virgosa2 +virgy +virma +virna +virna10 +virrej +virtigo7 +virtu0$0 +virtua07 +virtual +virtus12 +virus +virus111 +virus5858 +virus6181 +virus88 +virusanet +virusas +virusbug +virusno1 +virusos +virustec +viruswarnung +virusz +virve02 +virzafaz +vis +vis19464 +vis2426 +visa1315 +visa4073 +visage +visara +viscomi +viscount +viscount +viseu094 +vishal +vishal01 +vishanth +vishnu2 +visible +vision +vision3 +visiteur +visitor +vislab10 +vison123 +visops +visp123 +vissen18 +visser2005 +vissim +vista +vista00 +vista211 +vista383 +vista7 +vistaxp2 +visualc +visualp +visult +visxezod +viszati +vit +vit +vita +vita8973 +vitaaltera +vital +vital +vitale +vitale89 +vitaliano +vitalik +vitalo24 +vitaloca +vitaly +vitamehr +vitara +vitatron94 +vitaurus +vitez2006 +vito +vito +vito1310 +vitogi +vitoon +vitpa +vitpa +vitri +vittel +vittighed123 +vittman +vitto +vittorina +vittorio +vittra20 +vittu1902 +vitus +vitvar +vitya +viudanegra +viva13 +vivaamd +vivaboca +vivace28 +vivace33 +vivaimad +vivaldi248 +vivanco +vivanco2007 +vivarussia +vivastar +vivatel +vivean +viveca +vivedod +viveka +vivi +vivi +vivi622 +vivia +vivian +vivian +vivian14 +vivian83 +viviane +viviavot +vividodo +vivien +vivien +vivien22 +vivienn +vivienne +vivier +vivika +vivikawaii +vivitar99 +vivitron +vivko +vivlec61 +vivovivo +vivvo +viw6j +viwean9 +vixen +viyan +viyda +viyx2i +vizardmcr +vizebi +vizqj +vizra +vj1960 +vjadmin +vjagnv6 +vjdi7 +vjekoslav1 +vjfun +vjginga +vjhny837 +vjhzr21 +vji2002 +vjkjnjr +vjolt +vjs0207 +vjt27gs +vjw32 +vjw5257 +vk3ldb +vk4160 +vk4pfzk +vk83yja +vkcq6 +vkenan23 +vkhs73ee +vkinfn8r +vkkx7 +vknb6 +vkupload +vl4life +vl8bcgf4 +vlad +vlad01 +vlad1431 +vlad2000 +vlada +vladdy24 +vladek +vladikk +vladimir +vladimir +vladimircuando +vladis14 +vladislava +vladkodak +vladmir +vlag +vlaminck +vlandivar +vlatko +vlekkie +vlhurg +vlinder +vlkn1259 +vlmf30cd +vlmperle +vlog1756 +vloppy +vlpojeps +vlsiatm +vlynne +vm08873 +vm0ig +vm2005 +vm6932t7 +vm696969 +vma75 +vman9ulu +vmavma +vmfnub +vmh558 +vmhn3 +vmipass +vmj4958 +vmlrofq +vmnwy +vn367ri +vn5ajgre +vnPNtW +vndc79 +vnet1234 +vnhuaqin +vnk4z +vnkcfj +vnlbwk +vnn1920 +vnnbk1nh +vno40 +vnos +vnrulez +vnte6twg +vo4w524t +vo5r5y +vo6u6d +vo91967 +voau3580 +voba2905 +vocalizo1 +vocm06 +vocoder#2 +vocu3 +vodafone +vodafone1984 +vodafone2k2 +vodafone616 +vodi3899 +vodka +vodkilla +vodneva +vodoo +vodouedr +voerde22 +voetbal +voetballer +vofataso +vogalere +vogan2670 +vogel +vogel24 +vogelfrust +vogelnest +vogels +voglalab +vogon2001 +voice +voice369 +voiceid +voicu2828 +void9rt +voidvoid +voila +voila1564 +voilavoila +voiture +vojislav +vojsifud +vokkel +vokpum65 +voksab +vol123 +volant22 +volavia +volborg +volcom +volcom88 +volei +volej1 +volerama +voleur13 +volhnano +voli +voligot +volimte +volimte1 +volition85 +volk111 +volkan +volkan01 +volkanik +volkec +volkeqay +volker +volker +volker3552 +volker64 +volki006 +volkmann1124 +volkmar +volksbank +volksing +voll5idiot +vollegal +volley +volleyball +vollhong +vollidiot1986 +vollmond +vollneu +volly3838 +volodia +volodya123 +volomi +volpato +vols5641 +voltaire +voltaj +voltar69 +voltax +volter +volty +volume +volume16 +voluroqs +volver123 +volvo +volvo182 +volvo240 +volvo2774 +volvo61 +volvo75 +volvomd +volvos40 +volvov70 +vom8ct +vomavoma +vombato1$ +von +von7yuv +vondell +vondutch +vonetta +vonin +vonk +vonnie +vonsaber +voodoo +voodoo05 +voodoo2 +voodoo5 +voorhees +voorkeur +voort1 +voosen12 +voovvovo +vopxi +voqdqqxo +voqimuti +vor33jep +vorbarra +vorder07 +vorgarr +vorian +voridzag +vorlage +vorlice +voron379 +vorpal123 +vorpal76 +vorphalac +vorpor77 +vorst69 +vortex +vortex77 +vosa11 +vosner +vosonic +vospet24 +vosyokic +vote123 +vote1234 +votesforme +votz +vouk +voutenay +vouvray +vov53 +vovo +vovstat +voxfox +voxman +voxpuibr +voyager +voyager1 +vp0848 +vp16067 +vp3wh +vpcmrr +vpered +vpgrande +vpij4b24 +vpk6480 +vpkmf +vpnabaoh +vpracing +vproject +vpsa7470 +vptgcrjx +vpviu +vpwt6 +vq3ois9b +vq4z7m49 +vqoxyu2o +vqzw3 +vr1w17 +vr6golf3 +vracar +vragec19 +vranov37 +vrcc1605 +vrdi2005 +vrek12 +vrevkm75 +vrfbpz4 +vrider +vrijgezel +vrizal +vrod03 +vrolik +vrpfang +vrrulez +vrsx123 +vrucica +vs +vs35at2 +vs3qie2p +vsCvC +vsafety +vsaweb +vscbkf +vse3yepy +vsent0r +vsevolod +vsfeb +vsg2812 +vsiwkpw +vskubm3e +vsmicer +vsqn4vqp +vssp5zo4 +vszkxt +vszqgqyj +vt220 +vt45usr +vt66226 +vtcan04 +vtec +vtg60 +vtg9310 +vthang +vthctltc +vtms512 +vtrass +vtsndtf2 +vtsq7xc4 +vttgnn +vttuiz2 +vtuclan +vtuning +vtup626 +vtvtvtvt +vtxoyx +vty63ex5 +vtz8875 +vu5xg9nf +vu6cs +vu84vu84 +vuck74 +vudenu44 +vufum +vuh0czmi +vuhr7ws5 +vuhsdhmb +vuihgwdn +vukochas +vulcan99 +vulevu +vulnona +vultur +vuoshin +vuqaxis +vurich +vurucu +vussar +vuv59foq +vuv71toj +vuvrz +vuw37tad +vv +vv098067 +vv7z7fuz +vvZcaA +vvc1l +vvdfn +vve385c9 +vvjatu +vvlokq +vvnfrd22 +vvnow +vvrzr +vvs +vvs2m +vvsm15 +vvstaff +vvtteecc +vvuy93k +vvv123 +vvvv +vvvvv +vvxpfvxe +vw1303 +vw1h0n +vw202sr +vwar4d81 +vwertf23 +vwgolf +vwgolf3 +vwj9b +vwklubas +vwmircd +vwscan +vwvento +vwwfr6pt +vx29b34 +vx74d03 +vx78gt36 +vxbew +vxd33w33 +vxdg66 +vxficken +vxhpr0w2 +vxk4e +vxlai +vxpoison +vxt1azvx +vxtit +vxym1 +vy3ff +vy7502 +vy858585 +vyacheslav +vyb8m +vydrek +vyfvzoiw +vygoski +vyhu927p +vykere99 +vyola +vyrjfg +vyvian315 +vyyus +vz9999 +vzctmjth +vzeqffmu +vzhmd +vzhp5 +vzl7o +vzla3189 +vzmiu4eg +vzqiyny +vzrhu +vzt1k +vztemp +vztyt +vzu444 +vzwnsk +vzzynap2 +végéta +w +w007lfy +w00dz +w00fw00f +w00kiee +w00pass +w00t +w00t123 +w00table +w00tag3 +w00tage +w00teh +w00ttaa +w00tw00t +w01261961 +w01fm4n +w0hyr +w0l73rp +w0ldxx +w0llah +w0lves +w0mbat +w0mp13 +w0nder +w0rdd +w0rdup1 +w0rm +w0t4qa9u +w0tmhql7 +w0tzn3w +w10201993 +w1082386 +w11631s +w11dric3 +w131313 +w13644 +w14p16 +w152ak +w159753w +w1a2l3l4 +w1a2s3d4 +w1bbl3 +w1d2e300 +w1dvdv +w1fxw +w1gg4z +w1ldw0lf +w1lk1ns +w1ll1 +w1nand +w1nd0ws +w1oar +w1p3z75x +w1yonphq +w1yxd +w211 +w2210d +w230870 +w2409f +w2423113 +w266t +w26a4xi6 +w29091995 +w2e3r4 +w2e3r4t5 +w2ewr +w2hpn +w2kayiwm +w31ch0ng +w32419 +w32cpp4r +w33ahh +w3456789 +w352134w +w35i48t +w3952630 +w398bbw +w3a3pfpt +w3b4a1r +w3badm1n +w3bc0m +w3bf2br1 +w3bs1te +w3e4r5t6 +w3hfgrk +w3lc0m3 +w3lcom3 +w3mbl3y +w3nchy +w3r3wolf1 +w3rewolf +w3rp8 +w3rtw3rt +w3stvi3w +w3uvu +w3w4o5c3 +w4262833 +w448989 +w45ferf +w485473 +w4b5s6r +w4c5h8 +w4h1k +w4hsl +w4mmw +w4n4622 +w4nker +w4rd3n +w4re4gle +w4re72 +w4rwrfw3 +w4ter +w4v3tour +w4wtq +w5211314 +w52w171a +w5p91f +w61518 +w62xv +w671210 +w6868488 +w696a +w6eeujra +w6gpa +w6ntw +w6oz63oj +w725w +w7Jubi +w7ast10l +w7dh8b8x +w7mpu +w7nps +w7release +w7t4dpqk +w7zh3bhk +w800901g +w8089237 +w85632 +w8hxgd +w8urm +w8uwv +w946e +w95cih +w981151 +w9jhz +w9wjh +w@k@w@k@1 +wElove +wQh7qH +wWR5Mx +wa1985 +wa1dr0n +wa2468wa +wa310788 +wa35rs78 +wa3bz +wa5ht0n +waaf123 +waage +wabasha +wabaso12 +wachci39 +wachtwoord +wack0210 +wack7134 +wackokitty +wackoman +waclaw +wacmhber +wacquier +waddehadde +wade +wade wade +wade77 +wadeck +wadee33 +wader +wadilath +wadimje +wado2006 +wadonius +wadsworth +waegg1d +waeggfsh +wael101 +waeswaes +wafa71 +wafers +waffeke +wag1083 +wag19240 +wag1na +wag3969 +wag8ter +wagab122 +wagdsmin +waggoner +wagisnx +wagmbs23 +wagner +wagon33r +wagonette +wagons12 +wagonwright +wah4thin +wahe4p +waheeda +wahj123 +wahj1629 +wahlers +wahmyat +wahnsinn +wahnsinnterra +wahyu +wahyucf +wahyudi123 +waida123 +waidaz00 +waidaz12 +wainder +waiozx +wait +waiting +wajih +wakako +wakanase +wakawaka117 +wakawaka99 +wakeboard +wakeboard756 +wakeke1 +wako2608 +wakoko +wakowbay +wakvyvr +wal +wal1ays +wal94596 +wal981 +wala1182 +walawala +walawala +walazs22 +walberob +waldek2c +waldemar +waldemar +waldemor +walden11 +waldhecke +waldhirsch +waldi +waldi001 +waldiman +waldimar93 +waldo815 +waldorf +waldrose +walec26 +waleed +walek6 +waleria1 +walfisch4$ +walfss +walgreens +walgugta +walhalla! +walid08 +walid2203 +walidou +walker +walker +walkman +walkman1993 +walkon11 +wall +wallace +wallace1! +wallas +wallaya +waller +wallie +wallis +wallis13 +walloch1 +wallpaper7 +wally +walmart2010 +walmor +walnutta +walo +walo1493 +walo408 +walrus009 +walseth9b +walsie87 +walt +waltari1 +waltdisney +walter +walter +walter anthony +walter browne +walter soo +walter wolf +walter woolf +walter1 +walter5 +walterwolf +walther +walton +waltor +waltraut +waltrick +waltz2930 +walzer91 +wambo321 +wamp +wampair +wampe +wampir21 +wampire +wampp +wan +wan81300 +wan9ink +wana +wanadoo +wanch00 +wanchuan +wand +wanda +wanda1 +wandabert +wandelen +wanderer +wanderer4 +wandjuk +wang +wang123 +wang1688 +wang812 +wanger +wangling +wanglove +wangmeng +wangsta +wangterra +wangxlin +wangxwzl +wangyut2 +wania121 +wanker +wanker. +wanking +wanksta +wanku800 +wanless +wannabe1 +wannabe31 +wannabie +wannie +wanrltw +wans0ng +wansda +want +want2do +wanted +wantil +wantone1 +wantsex +wanttobe +wanxiao +waoola72 +waotda +wap5 +wapasoy +waqq +waqwaq +war208 +warbos +warcher +warcraft +warcraft0805 +warcraft1013 +warcraft3 +warcraft6699 +warcraft6707 +warcraftuser +warcry9999 +ward +ward bud +ward93 +wardle12 +wardman78 +wardog8412 +wareagel +wareagle65 +warewolf +warez +warez123 +warez321 +warez4u2 +warezik +warezz +warezzz +warf3n1x +wargames988 +wargasm +warhammer +warhammer +warhammer101 +warhammer4 +warhammer500 +warhawk12 +warhawk3015 +warhawks51 +warhol12 +warinc +wario95 +wark11 +warlock0704 +warlock16 +warlock305 +warlock9010 +warlockdps +warlocks14 +warlord234 +warmboi +warmhq +warner +warnerv +warning +warp2000 +warpance +warpig +warpride +warpsp33d +warpten2 +warr1974 +warrah38 +warrax01 +warredss +warren +warrior +warrior405 +warriorr +warriors21 +warrock +warset +warspite +warstein +warsteiner +warszawa +warszawa2102 +warszone +wartee +warthog +warty021 +warum2 +warumhannes +warw1zard +warwar +warwick +was422 +was4r3bp +wasabi +wasas017 +waschel +waschtl +waschtrommel +wasd +wasd123 +wasd90 +wasdwasd +wasedme +wasgeht +wasgeht1 +wasgeht1979 +wasgulli +wash1432 +washburn +washte1313 +wasist +wasp12 +wasp1982 +wasrednn +wassa100 +wassap +wasser +wasser09 +wasser1000 +wasser1b +wasser2 +wasser2005 +wasser9153 +wasser97 +wasserfall +wassermann1963 +wassermann23 +wasserwerk +wassim652 +wassup +wasted1337 +wasupio2 +waswas +wasxd878 +wasyl2006 +wasyliw +wat2526 +watashi1 +watch +watch2003 +watcher +watchout301 +watchvca +watcom +water +water123 +water3 +water50m +wateran +waterfall37 +waterfront +watergate715 +waterglass12 +waterhooft +waterkracht +waterloo833 +waterly1 +watermelon +waterpolo18 +waters1218 +waterville +waterx +watford +watras +watrpss +watson +watt2487 +wattan09 +watten +watter +watther +wattmos +watts1989 +watusi +waus1234 +wausauwi +waushare +wauti99 +wautzi +wauupv6 +wauupvq8 +wauwau +wauy0x +wava12 +wave1954 +wave4567 +waves +wawa1206 +wawa23 +wawa5332 +wawami +wawang +wawawa +wawawawa +waxinke +waxkuhen +waxy4pan +way26e00 +way2far +way2leet +way939 +wayder +wayland1899 +waylon +waynard +wayne +waynelin +wayway +waz2105 +wazhg9hv +wazig11 +wazoojd +wazupik +wazy10 +wazzup6y +wb123456 +wb1445 +wb1ecb +wb215956 +wb28se06 +wb4jvi +wb6xfihc +wb8rvm1 +wb9 +wbb24sr +wbcm99ta +wbconfig +wbcp289 +wbd2006 +wbdv2006 +wbgilman +wbj4zzmm +wbj8af4a +wbli0412 +wbljw +wbnm44 +wboici69 +wboie +wbqig +wbranteg +wbrown +wbrxp +wbs11 +wbu23rec +wbulk +wbxc3 +wc1281 +wc3 +wc5678 +wc805680 +wc9876 +wcb666 +wccR60 +wcgeist +wcgwcg +wch65423 +wchaim06 +wchinchillas +wcl8q +wcs87w +wct419 +wcug4pbu +wcviu +wcwwwf +wd087136 +wd2000 +wd2060 +wd40lub +wd821993 +wd9eri +wda321 +wdfhdq +wdgeft7 +wdig +wdijkhuis +wdj123 +wdjsncs +wdmm8899 +wdnkymys +wdrhdr77 +wdrtyu +wdujw2 +wduqm +wdwgfh +wdydg8 +we +we11ea1 +we123456 +we2be4 +we3214 +we3k2923 +we3koa6 +we3rfd +we4534rw +we4q +we5386 +we62yj2f +we970 +weakness +wealth4560 +wealthyk +weapgw +weapon2k +weareawesome +wearebig +wearecor +weareone +wearethe +wearethesaints +wearnes +weasel +weasel +weasle12 +weasley +weather432 +weaver +weavers +weaversds +weavile0 +weaz80 +web +web +web001az +web1010 +web12201 +web123 +web1238 +web1502 +web1bill +web20 +web2002 +web2005 +web2007 +web31aer +web3u +web3x +web43net +web541 +web55ter +web5673 +web687 +webadmin +webads +weban999 +webarpa +webaslan +webb +webb2639 +webb691 +webbs4790 +webcal01 +webcam +webcam18 +webcams +webcappe +webcarp +webcass +webci88 +webdav +webdevel +weberdvd +webergo +weberow +webex12 +webgame +webgarden +webgine +webgobe +webguy +webhot +webiando +webici +webifr +webinese +webintec +webis +webivo +webkaras +webkimia +webkulcs +webli +weblog +webmaster +webmaster2 +webmaster6 +webmaxx +webmcx +webmedia +webmi79 +webmin +webmom +webpahag +webpass +webpasswert +webphrae +webqaz01 +webs4all +websalud +webscott +webshit +website +website7 +webspace +webspell +webstaz7 +webster +webster8 +webstil +websuche +websvcs1 +webtemp +webvbnfr +webweb +webzone +wec33 +wecked +wector +wecvq2ht +wed0410 +wed61103 +wedad919 +wedding +wedg1974 +wedge99 +wedgwood +wedkop +wednesday +wednesday1 +wee willie +wee116 +wee1977 +wee6shap +weed +weed420 +weedas +weedbaum +weedhanf +weedhead9332 +weedles +weeds +weedsa +weedsmok +weedy +weedy13 +weegee +weegee1337 +weemaan5 +weener +weered +weerman +weetbix +weetniet +weetospw +weezer +weezerx +weezy1962 +wef02w5e +wefpok +wegner +wehack +wehafi12 +wei ping +wei520 +wei9hei6 +weiber +weibeweibe +weibin26 +weide1105 +weidendorf +weidlich +weigand09 +weigand2004 +weige88 +weih +weihnachten +weihnachtsmann +weijia0305 +weil.de +weiland1 +weile +weilert1 +weimarer +weiner +weingarten1 +weinheim +weinrebe +weiqin +weird +weird666 +weirdal +weiselli +weiss +weiss +weiss269 +weiwei90 +wej94 +wejherowo1 +wek38gos +weka +wektor1 +wekwek +wekwen +wel5come +wela1997 +welcom1e +welcome +welcome1 +welcome2 +welcome9 +welcomesx +weldensie +welder1 +welder259 +welding +weldon +welevelu +welford +welkina +welkom +welkom12 +well0530 +wella +wellcraft123 +welldone +wellen +wellerson15 +wellewahnsinn +wellhell +wellhung +wellington +wellington33 +wellmet69 +wellness55 +wellrat +welove +welovecs +weloyal +welshuk1 +welster100 +weltladen +weltmeister +weltshop +welweq +wemadeit89 +wembley1978 +wembly +wemean +wemfjr12 +wemi80 +wen +wen hsuch +wen3lin3 +wen71382 +wenadmin +wenbei12 +wencke +wencke +wende +wendel +wendell +wender +wendie jo +wendoree +wendrc +wenduine +wendxp +wendy +wendy3175 +weni1147 +weniger +wenislop +wenjong1 +wenn +wensley +went595 +wenzelwenzel +wenzi +weodin13 +weonmalo +weplog89 +wer123 +wer1234 +wer23ben +wer2good +wer432 +wera +wera2006 +werachai4444 +weraid +werbatex +werbung03 +werbung7935 +werd0814 +werder +werder5 +werdfoo +weredo +wereldbol88 +werewolf +werezexu +werfall +weristes +weristroh +werken1992 +werkstatt +wermaus +werner +werner +werner1958 +werner2000 +werney +werock51 +weron83 +weronika +weronika18 +weronka1 +werrewee +werribee1 +werruzuf +wers +werse0101 +wert00 +wert12 +wert13 +wert14 +wert2000 +wert5982 +werta +wertas +wertaser +werter +werters +wertf87 +wertfrei51 +werth111 +wertmail +werto +wertone1 +wertwert +werty +wertzu +wertzu12 +wertzui +wertzur +weruleuu +werzera +wes +weschgi +wesd54 +wesdr88 +wesel +wesela +wesker +wesley +wesley +wesleyan +wesma5510 +wesna123 +wespe5007 +wessam +wesselwerk +wesslingbo +wesson +west1008 +west1025 +west1234 +west382 +west3pig +west6391 +west7coast +westcott +wester17 +wester99 +westham +westham1 +westheim48 +westice +westinghouse2 +westlife +westly2244 +westman +westminster09 +westmoreland7 +westney +westnile +westpark +westrage +westrolls +westside +westside3 +westwest5 +westwood +westzzz +wesuck +wetdog78 +weteef1 +wetman33 +wetnare +wetoya +wetter06 +wetter1203 +wetter7997 +wetwilly +weula +wewe +wewewe +wewewe85 +wewlo +wex09vip +wexed25 +wexttt +wey5203 +weyler +wezin7 +wezzie86 +wf696kb +wf8909 +wfb369 +wfb79 +wfbie +wfbm1009 +wfc1907 +wflffpvh +wflst +wfp92372 +wfpatryk +wfr5k +wfrr2003 +wfsvqfxd +wfuckoff +wfxqm +wfyzcm +wfz2006 +wfzj4373 +wg112211 +wg191088 +wg33s5 +wg678 +wg6orql3 +wg7br2 +wgIFD +wga0x1 +wgarc +wgcandy +wgcw5rv7 +wgjemiux +wgkuvigc +wgmk2502 +wgrdwgrd +wgtb1978 +wguedes +wh0isg0d +wh0j00m +wh0wh0wh0 +wh100749 +wh1223ax +wh1234567 +wh1324 +wh1pp3t +wh1sdf +wh1tel10n +wh1zb4ng +wh33fun +wh3r3 +wh4tsup +wh4tsup2 +wh6690zk +whaaat89 +whachale +whadafug +whafhvcv +whaler05 +whastup +what +whatdo69 +whatever +whatever1 +whatever270 +whathell +whatiget +whatitis +whatk900 +whatpills +whatsup1232 +whatsupppp +whatthe23 +whatthehell +whatup +whatwhat +whb2b +whc2007 +whcsclan +whdpfhei +whe220 +wheaton +wheatus +whech0z +wheelchair +wheeler +wheeler +wheels +wheels00 +where65 +whereru3 +whg13 +whgoss +whgp0005 +whgp05 +whhsp44 +whi7eblaze +whiki2 +whinnynet +whip +whiplash +whiskey1 +whisky76 +whisper +whisper75 +whistenant724 +whistle +whistler +whiswhis +whit +white +white +white0102 +whitebunnie +whitecity +whitecow7 +whitehat +whiteice +whitenoob +whiterabbit86 +whiterabbit89 +whitering +whitesox26 +whitewbc +whitewolf +whitey +whitfield +whitford +whitman +whitmer3912 +whitney +whitney +whittle +whl007 +whlllhb +whm159 +whmngoc +whmsd098 +whoa1234 +whoami +whocares +whocares1 +whoisapi +whoislog +whoknows420 +whoopi +whoopy +whopper11 +whore +whosdman +whow +whowalks +whowhat7 +whowned +whpmbgax +whpns +whpo543 +whql4wha +whswhs +whtlion +whturtle +why2j +whyhello +whynot +whynot12 +whynot19 +whynow11 +whythat +whytt +wi kuki +wi103cz +wi60d8b9 +wi9867 +wiad3rk0 +wianw +wibb1le +wibble +wibble3 +wibble99 +wibblefish +wicanne +wiccae +wiccan +wichmann32 +wichser1 +wichser5 +wicht22 +wichte! +wichtig08 +wichura1212 +wick +wicked +wicked0553 +wicked7676 +wickediam +wickeltisch +wickham +wicklund +wickrema +wida00 +widawski +widdau +widder4 +widdles +wideout14 +wideread +widnau17 +widodi +widow +widow209 +wiedemar +wieden86 +wiefre +wiegand0201 +wiegc +wiegehts +wieimmer +wiekens +wieloryb +wien +wienczyclaw +wiepgy41 +wiesbaden96 +wiese14 +wiese2005 +wiesel91 +wiesgeht +wiesiek +wieslaw +wieslawa +wieslawaw +wiete274 +wieterra +wiewiorka9999 +wife +wife4 +wifebeater1234 +wifi1234 +wiflywifly +wiforum +wiggin666 +wiggles455 +wiggybig +wigry +wigwam55 +wigwam66 +wigzig +wihdaich +wiing +wiiwii1 +wijeratne +wikholm123 +wiki0000 +wiki0817 +wikila85 +wikka +wikosik +wikosol +wiktoria +wiky +wil +wil4u +wil6350 +wil671 +wil777 +wilaiwan +wilbert +wilbur +wilco690 +wild bill +wilda +wildbill0 +wildboar +wildboy +wildcard +wildcat +wilde1 +wilde54 +wilder66 +wildfire10 +wildhammer +wildlife32 +wildman19 +wildpigs +wildsilk +wildstar12 +wilduce +wile +wilette1991 +wiley +wilford +wilfred +wilfred +wilfred hyde +wilfredo +wilfrid +wilfrid hyde +wilfried +wilhelm +wilhelm +wilhelm300 +wilks0932 +will +will +will rogers +will00st8 +will1919 +will3450 +will99 +willage25 +willard +wille +willeke +willeke08 +willem +willem +willem1 +willem1610 +willeman90 +willerby +willi +willi1922 +willi? +william +william +william allen +william ash +william e +william gray +william lyon +william welsle +william184 +william529 +william825 +williamd +williams +williams6 +williard +willie +willie +willie25 +willimann1 +willing9191 +willioner +willis +willli +willnix +willoughby +willoughby87 +willow +willow +willow05 +willow125 +willow5162 +willowjw +willows05 +willroy69 +willsie24 +willster1 +willweb +willwill2 +willy +willy +willy1900 +willy2357 +willy52 +willy572 +willyden +wilma +wilma0823 +wilmi199 +wilson +wilson +wilson118 +wilson2 +wilster +wilton +wilx0 +wilxwz8l +wily1991 +wilzana +wim +wim1983 +wimille +wimpie +wimpie1 +win03ter +win0819 +win12 +win1251 +win2002 +win2233 +win2com +win34bbx +win3pi +win4sux +win95jb +wina9898 +winc0173 +winchester +wind7787 +winda22 +windaube +windcar +winddol +windeln +winderlow +windibus +windilon +windmage +windoes +windoof +windoom +window +window12 +windowclient12 +windows +windows +windows2 +windowsb +windsor05 +windsor3 +windsp7 +windurst +windwalker +windwind +windy44 +wine6631 +winegums94 +winfast +winfield +winfried +wing22 +winger123 +wingfield +wingit23 +wings +wings +wingwing +wingx0r1 +wingy manone +wingzero +wini +wini123 +winifred +winkiwinki +winky +winlsd +winmalm +winnatqm +winne +winne7714 +winner +winner1989 +winner24 +winner49 +winnetou21 +winni001 +winni1416 +winnie +winnie +winnie. +winnie12 +winnie1303 +winnie23 +winniethepooh +winnifred +winnipuh +winona +winora1 +winrar +winsda +winslow +winstick +winston +winston +winston62 +winsy002 +winter +winter +winter08 +winter1 +winter12 +winter22 +winter30 +winter456 +winter7659 +winter9 +winterland +winterlich +winters +winters04 +wintersonne01 +wintersun16 +wintesla +wintieva +wintik +wintjens2 +winxp123 +wipawadee +wipe1996 +wipe1out +wipeout +wipeout303 +wippra90 +wiptz +wiqid +wira2006 +wire001 +wirehead +wirek2 +wireless +wireless1 +wirlwind +wirnu +wirsindda +wirsing69 +wirst +wirtschaft +wischen8 +wisconsin +wisdom47 +wise1212 +wiseguy +wiseman214 +wiseone5 +wishable101 +wisher624 +wishezz +wishhouse +wishkah +wishmaster1 +wiskers1515 +wiskosa +wislander4 +wislaq +wisniewski3 +wiss88 +wissamos +wissem +wissen +wissia +wissou +wita53 +witch +witch1 +witch742 +witchhaven +witchinghour +witek +witeutoni +witewiger +without11 +witm06 +witold +witsch +witt01 +witt77 +witt9488 +wittyman +wiw123pl +wiwat +wiwaxia23 +wiweka123 +wixli66 +wixxbold +wixxer +wiz95 +wizard01 +wizard1 +wizards52 +wizbot1 +wizho117 +wizlock +wizo05 +wizzard +wizzdang +wizzi +wizzy2009 +wj0iv +wj10a7tt +wj1612 +wj5en9zp +wjabeoqt +wjabzp78 +wjazd123 +wjdgktkd +wjdgktkd&^*! +wji87187 +wjian917 +wjp7y +wjs1986 +wjsmc88m +wjtn4rk0 +wjwill2 +wjzzpst +wk1515 +wk999000 +wkHIY +wkOZT +wka +wkb12 +wkb66nzs +wkbslm +wkd3314 +wke71l +wkeimer +wkhhfniw +wko +wkplooau +wkqe3 +wkr444 +wkrtux +wkxctz +wl94s8nx +wla4579 +wlad100 +wladimir +wladimir +wladislaw +wladmir +wladyslaw +wladziu4 +wlafid +wlafiga +wlaroma +wlas89uk +wlasorca +wlcnova3 +wldmsdk +wledg +wljerome +wlk54568 +wlmdemo2 +wlmidek +wlmso +wlodzimierz +wlp78r +wlpm4 +wlq934 +wlr8j +wlrqt +wlsdz +wlswn83 +wlth3k +wlw1z +wlznv +wm2419 +wm3220 +wm4lou +wm628wm +wm7477 +wm8227 +wma1987 +wmarena +wmaslk91 +wmaster +wmc4sspa +wmcsl +wmdsdgr +wmf1955 +wmfbmp +wmlala +wmlbfvt1 +wmmzt +wmn1129 +wmpass82 +wmpcsm +wmqnq +wmqwmvl5 +wmr9h +wmraven +wmskxtb +wmt4370 +wmtpc2 +wmxler +wmzxczxc +wnalscpzm +wnba +wnbvcde +wneqy +wnerkie +wnevlb3 +wni1t47r +wniroy +wnqt3 +wnt40&W95 +wnxq0 +wnyd7 +wo12ailn +wo622630 +woSS +woai520 +woaicsj +woaiejia +woaimemories +woaini85 +woainia0 +woaiwl +woal. +woayni +wob50 +wobblesworth +wobkuwit +woche8 +woda11 +woda22 +wodan72 +wodka +wodka2309 +wodka603 +wodnymis +wodxoguf +woe6ie +woeter +wofa8773 +wohd77 +woirai +wojako +wojciech +wojs99 +wojtas07 +wojtas72 +wojtas75 +wojtaszek27 +wojtek +wojtek04 +wojtek1 +wojtek1994 +wojtek815 +wojtosz +wojtus1 +wok31kiy +wokaonba +wokdar +wol2117 +wolFen93 +wolf +wolf +wolf1234 +wolf1258 +wolf1986 +wolf221 +wolf3346 +wolf4020 +wolf4224 +wolf5678 +wolf7886 +wolfbat +wolfdata +wolfdbs +wolfdog56 +wolfe +wolfed777 +wolfenstein +wolffa +wolffseb +wolfgang +wolfgang +wolfgang7799 +wolfhund +wolfie502 +wolfman +wolfman23 +wolfmon1 +wolfpac +wolfrace +wolframator +wolfriku +wolfsaga +wolfsburg +wolfscho +wolfsmond +wolfstah +wolfsville +wolfwoelfe +wolke +wolke7 +wolle +wolle69 +wolley +wolley32 +wollff +wollny +woloszyn21 +wolperdinger +wolpi11 +wolscom +wolv96 +wolven +wolverine +wolvie00 +wolvie01 +wom4fly +wom65zit +wom7bat +womac1 +woman1 +woman1991 +wombat +wombat43 +wombat77 +women +womohida +wompateg +won +wonbin +wonderland +wong +wong ching +wong5979 +wongwoo4 +wonka6466 +woo +wood +wood +wood123 +wood666 +woodcock +woodie +woodle321 +woodone +woodrow +woodstock +woody +woody +woody111 +woody123 +woody44 +woody67 +woofwoof +wook123 +wookietreiber +wookwook1 +woolley85 +woopstar +wooribb3 +woorld01 +woosh +woosh0815 +woot +woot1woot +wootage +wootloot +wootney +wootwaffles +woozel +woozie +woozles +wopapla1 +wopner +woppel +wopwop +worben +word +wordfind +wordlife +wordpass +wordpass80 +words +worf1065 +worgen1 +work2005 +work4god +work4jpl +workable +workbench +workers232 +workhard +working2 +workingbitch +workit +worklol +workout1965 +workup2003 +world +worldcup +worldfax +worlds1234 +worldwide +worm +worm6668 +wormhole +worms123 +wormsnub +wormsruled +worracs +worradac +worthington +wortkenn +worwow +worxx777 +wosandra +woshale +woshiben +woshidir +wosky +woswos +wosys +wotHan +wotakou +wotan08 +wotizdiz +wotpower +wouter +wouter33 +wouter5720 +woutje +wow +wow1326 +wow159 +wow1957 +wow334 +wow3wow +wow4all +wow4me +wow4you +wow5696 +wow7777 +wow79wow +wow918 +wowa4487 +wowa7319 +wowaion +wowalicante +wowbrian +wowchina +wowfaith +wowfiles +wowfixe +wowgeht +wowheads +wowjanos +wowkaban +wowkat3 +wowkillers +wowlaertes +wowmaste +wowo +wowo09 +wowo1290 +wowopl +wowpass5 +wowrhbd +wowstellar +wowstory +wowwow +wowzers123 +woxrekem +woyao168 +wozpmnvq +wp2009wp +wp4712 +wp7pe +wp7undkj +wparfj6w +wpd911 +wphz206 +wpk001 +wplzpkdg +wpm001 +wpmolly1 +wpngr +wpnmd +wpo0a +wpp2000 +wps2000 +wpsh59 +wpzx9 +wpzzrgz +wq123 +wq1vtgk2 +wq750720 +wq771230 +wqUVHpvpKMVhl3 +wqaxsz +wqaze23 +wqh0303 +wqh0czzm +wqhfrpyb +wqjzmvso +wqn7s +wqrwz +wqs1o +wqvvlo +wqz5s +wr1t3r +wr1t3r3z +wr200m +wr510 +wr5368 +wr6ea +wraith1 +wraith24 +wraith764 +wrang622 +wrangler +wrc2903 +wrcwayne +wrestling +wrfhelp1 +wrgkmg26 +wriachie +wrieflu7 +wright +wright05 +wright25 +wrinkle7 +wrinkles35 +wripqmgc +write2me +writedyke +writer +wrk +wro3na7 +wroawlet +wroclaw +wroihaik +wrolosi +wrong07 +wrongock +wrongpwd +wrot887 +wrpost85 +wrsd6g +wrsv8 +wrtrbnjx +wruhicri +wrut +wrvmlro +wrvwrv +wry61x8 +ws123 +ws1488 +ws1564 +ws1z1 +ws34rf56 +ws3stt8q +ws40367 +ws4ice82 +ws797 +wsad1309 +wsad6624 +wsaddasw +wsadmin11 +wsandro +wsc2950kmk +wscg03 +wscgr +wsci4k3 +wscript +wscv66zu +wsdavid +wsddsw +wsdev01 +wseres19 +wsewolod +wsfx6vj +wsharks +wsib9 +wsip2007 +wskmori +wsmi8 +wsmwsm +wsnaji +wsop0409 +wsrf34 +wssg5508 +wst51 +wstcwpsa +wstmm191 +wstrulez +wsu +wsv123 +wsw01 +wsxcvbn +wsxcvbnm +wsxedc +wsxwsx +wt +wtadmin +wtaen +wtbxr +wtc7777 +wtd1803f +wtf +wtf3cc +wtfchen +wtfdruid +wtfff +wtfhax +wtfkaas +wtfwtf +wtfyou +wthxbm8t +wtmcross +wtmms118 +wto80 +wtok0 +wtr35egs +wtrawke +wtrfupqk +wts412 +wtsnxt +wtsr808 +wtypehf +wtzhcnjb +wu +wu wei +wu1234 +wu1618 +wu394bu +wu39cx +wu3r45 +wu73tuw +wu7dplem +wu9568 +wubelu +wubyou +wuczjgbb +wudi1994 +wudigess +wudyigi7 +wue1bdhg +wufan12345 +wuffwuff +wuj37dak +wujaszek1 +wujswujs +wulfgar06 +wullewuu +wulrv +wultrex +wunc61 +wunderbar +wunderbare12 +wunderlich +wunibald +wupc +wupote +wurgunum +wurmholz +wurmloch +wurmloch2605 +wurolu +wurscht3 +wurscht661 +wurshay +wurst +wurst5k +wurts11 +wurzel +wurzel8 +wurzelwinde +wusa +wuschel +wusel +wusel4you +wush123 +wuss6666 +wussieke +wussy28 +wut2828 +wutafuzz +wutang +wutang05 +wutang1 +wutang3 +wutup +wutzwitz +wuwfg +wuytens1 +wuzhi +wuzla +wv92wyjr +wvedina +wvgeta +wvgld +wvldc +wvonh286 +wvrpa +wvsvfe +wvv1a +wvw5111 +ww1501 +ww2510ww +ww29em4r +ww464535 +ww5683 +ww75dd62 +wwazubi +wwblt +wwcc02 +wwcrew +wwe +wweennaa +wweerrtt +wweess +wweraw +wweraw12 +wwewwf +wwewwr +wwf123 +wwf316 +wwf3wwf3 +wwfc1 +wwg4r +wwghy +wwhellqq +wwiterra +wwjd2008 +wwjd2009 +wwk8m +wwlpd45p +wwoollff +wwpau +wwplayaz +wwqt5 +wws5150 +wwssdada +www +www123 +www333 +wwwWET +wwwanquan +wwwaust +wwwcom +wwwcrou +wwwdent0 +wwwfena2 +wwwfuck +wwwildiz +wwwnghs +wwww +wwww311 +wwwww +wwwwww +wwwwwww +wwwx3k1p +wwwxwx +wwxls +wx +wx1kh2zy +wx6238 +wxc123 +wxc159 +wxcvbn +wxdya3 +wxf1985 +wxgriidl +wxpeng +wxr621 +wxxsv +wxy770 +wy4o5i +wyaft +wyatt +wyborowa +wybrani1 +wycho300 +wyckliffe56 +wycvin78 +wydadi +wydiys +wyekky +wyfzhq +wykatic +wyl321 +wylie +wylma +wyn +wyndham +wynn +wynne +wynonna +wypad +wyrley +wysinwyg +wyspys +wyu501 +wyupload +wyuxdjx +wywh2 +wzc1212 +wzd1h +wzeqhh7c +wzgrb3r +wzmeuzf5 +wzor +wzornet +wzqvg +wzy69 +wzyqz4gy +x +x00000 +x0110443 +x020885x +x045819 +x06y4jo3 +x078h1 +x0814 +x0815x +x091184x +x09pik +x0chimilc0 +x0dZnE +x0dri +x0hpc +x0l02 +x0nqj +x0r +x0wl +x0x0x0 +x0xpz +x1 +x102x +x11115555 +x11zry +x120180x +x123456x +x127my57 +x129p +x12m3b9 +x1311970 +x1337x +x163l +x1980320 +x1af4wg3 +x1d6uumc +x1gfj +x1j0vp2y +x1j2p3 +x1m3n4 +x1mjr +x1smoke +x1x1x1 +x1x4x7 +x1xyu +x2019ivl +x21348n +x2212153 +x25y2516 +x26x26 +x2efn +x2egm +x2ezu2h7 +x2ggp1i +x2jetski +x2uqc +x2woi +x2y6z2 +x30yt8g4 +x32bxwer +x349x +x34m6 +x35odfmh +x380m2gj +x3Z70y +x3c4v5 +x3glh +x3lala +x3lopy +x3mlinux +x3n0c1d3 +x3nd3g4 +x3ns34oz +x3q8ues +x3r0xppc +x3ron24g +x3rulz +x3sf0tv2 +x3v31ss +x3y58c6h +x43112 +x4321K +x456258x +x4756h +x48259 +x49wy3c2 +x4bcom +x4cd2pw +x4iym +x4k1pa +x4lccuno +x4mn926 +x4ndw +x4pi5i76 +x4q6d5c2 +x4tnwond +x4ujx +x4xux +x502p +x53k +x544x544 +x5711552 +x5ivy +x5rms +x5x5x5 +x5zers53 +x610428x +x66xd7q7 +x6926x +x6gpa +x6hmt +x6j934h +x6jsvwox +x6kbs3ka +x6mnse9v +x6nbm +x711008x +x729500x +x74ippjx +x784tury +x7bfr +x7hpw +x7hqaw +x7kdo +x7krc1x6 +x7q6a7fi +x7xrota +x810106h +x8192 +x87we78 +x8b7t0a8 +x8gexew8 +x8ue2oui +x8wvqy +x8zlw +x90lph +x9216632 +x93ke2i +x944xx +x953d +x95hg5qb +x99z7 +x9Da7b +x9c5f13 +x9hfrxxo +x9lol9zx +x9o3j5 +x9qlq +x9u12 +xD +xD123 +xDD +xFdLV +xHnYf6 +xJ3Cau +xKDAaoe623 +xLzVi +xPi4Ka +xPr00 +xU2a +xUxUxU +xWeeDx +xa +xa2lfsnr +xabie615 +xabier +xac1 +xad11gac +xadbkfhf +xadminz +xaewdz +xagitx +xaho0 +xain1064 +xaker +xakera +xakerfaq +xal0c +xalet2 +xalewa +xalhcnum +xam12345 +xamacaya +xamirp +xamku +xan des +xan10vur +xan2 +xana +xana2002 +xanaphia +xanat +xander +xander +xandine +xandros1 +xankete1 +xanon73 +xanten123 +xanth5 +xantha1l +xanthia +xap58yot +xapriox +xapuri +xar03ar +xaragoza +xardas +xardas11 +xardasix +xarea +xarnuz +xarock +xarxa9 +xasthur77 +xastv +xata49 +xatar187 +xatbl +xatm092 +xauvub +xavaska +xavi +xavi1 +xavi84 +xavier +xavier +xavier03 +xavier1 +xaviert +xavion12 +xavzaqob +xawqn +xaxa +xaxaxa +xaxik876 +xaxika +xaxkb +xaxy1234 +xaymio +xazvamic +xb7976sf +xbaeh +xbd6udh7 +xberlin +xbgonxn3 +xbikna +xblade2 +xbox +xbox360 +xboxhalo +xboxisn1 +xboxlive +xbsboss +xbslrxhw +xbt24 +xbyu2 +xbzvw +xc1038 +xc12345 +xc1690 +xc667 +xc700pol +xc972089 +xcaniche +xcb5255 +xcde32ws +xcel5op +xcenzb +xcerclex +xcguukej +xchacked +xchafs +xcj123 +xcliaa3l +xclre +xcniokn +xcnpf +xcolor2009 +xcomplexx +xcpk386w +xcqq1h +xcqytb +xcs3o +xcst5x +xctd6 +xcv25mn +xcvbxcvb +xcvx22 +xcxwbb56 +xd +xd191278 +xd3134sa +xd5489 +xd57t8 +xd7cefz3 +xd8esgp9 +xd95h +xd9616 +xdaemon1 +xdbe9o9r +xdcfvgb +xdeath +xdeltha +xdg678 +xdoomp13 +xdp842 +xdpadmin +xdpede83 +xdrd4N +xdrgnjil +xds31245 +xdskv +xduffy +xdxdxd +xdzore +xe123055 +xeQter +xea9f +xebdkk +xecti123 +xedap +xedbyc56 +xeemaibo +xekt69 +xela1031 +xela87 +xelaj +xelander +xelexian +xelios +xem808 +xemial +xen1mus +xena +xena57 +xenaares +xendi +xenfw +xenia5 +xeniap +xenios1 +xenofart +xenome +xenongay +xenosdef +xenosoft +xentric +xenu5 +xeon1337 +xep123 +xep624 +xepkyj3h +xerfusih +xeri01 +xero8821 +xerolann +xeromem1 +xershoxx +xerxes54 +xest315x +xetal04 +xetdaqep +xeuceibi +xevil336 +xey8zmp3 +xezb23mi +xf021636 +xf8albt9 +xfacti +xfcvgxc +xfdnkroz +xfear86 +xfer +xfgyf +xfhuu +xfiles +xfiles1669 +xfiola +xfischl +xfn0f +xforumx +xfr9bvbj +xfragile +xful5 +xfur54 +xfwqvvl +xg6o2vje +xg7106 +xgame +xgamex +xgcrules +xgiwyl +xgp15a2 +xgq447 +xgrocks +xgvk7 +xgvyu7xd +xgxn9562 +xgymy +xh056246 +xh0wrzcr +xh18ty +xh25mj0 +xhacker +xhahax +xhallo +xhanders +xhash +xhiv2007 +xhkbj +xhtc666 +xhxfer +xhxnt +xhxnv +xhxnveav +xhxvtsop +xi8no6va +xialei +xiamen +xian1987 +xian76 +xiangxiang +xiao +xiaoji8a +xiaoqi886 +xiaoqing8 +xiaotian123 +xiaoxian13 +xiaoxiao +xiaoxiao123456 +xiaoyan217 +xiaoyao5620 +xiaoyong775 +xiaozhu9 +xib20mum +xibgudid +xidzetlv +xies2lu9 +xifirst +xigang0934 +xigor +xigtazom +xihnuteh +xiir3ziu +xijgeyih +xik832 +xikumba +xila +xilefxilef +xilofon +xim21lth +ximenez92 +xinchao +xing8564 +xingchenli +xinitrc2 +xinqiao8 +xinye2599 +xinzhe +xio +xiocdpd +xiodf +xioramj +xipo18 +xiq315 +xiquen +xirbam +xircom56 +xisl1 +xit321 +xit7ztyv +xithogom +xiu +xiu1121 +xivbr101 +xivon57 +xiwaps +xiwuwi +xix0lina +xixa +xixi +xiy7pivj +xj3xxyr4 +xj6mbacf +xj900 +xj957605 +xjIlMj +xjb5jq2m +xjc038 +xjcs801 +xjh7jpe1 +xjis0603 +xjk0sdwf +xjkud +xjoo9 +xjp4w +xjqad +xjs12k +xjtyk2ck +xjy9ax +xk9uzfie +xkb232z +xkbot +xkcats +xkcd +xkdgawh +xker0017 +xker0043 +xkgq8 +xkr007 +xkrous00 +xksj112x +xkt7mf +xkth +xl4jarin +xl4life +xl8899 +xlasv13o +xlcp051 +xlcp5 +xlf123456 +xlieryo0 +xlii +xlindax +xlindurx +xlink +xljrz +xlmos128 +xlniai +xloxlo1 +xlp90tra +xlpr7 +xls2xml +xluxasx +xm1671 +xm1764xm +xm3151 +xm40421 +xmadmin +xmanxman +xmarekx +xmas2412 +xmbxmb +xmdmisai +xmen3 +xmencia +xmfmgh +xminus53 +xmog86gi +xms3do +xmypass +xnc1230 +xncccc7x +xnehu +xneox +xngay +xnlxi +xo251183 +xo89od83 +xoada +xoanmg +xobzakun +xocolata +xocyafus +xofomeb +xofxof +xogyacem +xohimz22 +xoizpkme +xokjabc +xol03lew +xolr5j +xom14cum +xombi798 +xomox +xone22 +xonline +xonzai +xoom254 +xopa9128 +xopom +xorax +xoriguer22 +xoron +xorpayez +xorrut +xort +xound +xowikw +xoxali +xoxota69 +xp0under +xp123456 +xp14589l +xp1507 +xp20 +xp21xp21 +xp2400 +xp2r6src +xp36834p +xp54q3p +xp591017 +xp6avejp +xp7ytp +xp84amd0 +xp995487 +xpaja01 +xpand21 +xpander923 +xpbsj +xpcjb +xpeac3x +xperian +xperte +xpgjxnf +xphoenix +xphome2 +xplants3 +xploit +xpmya9qs +xpozed +xpress +xps123 +xpst500 +xpto1976 +xpuforix +xpxblr +xpxpxp +xpxpxpxp +xpyqez5a +xpz28ife +xqczk +xqh42 +xqhore00 +xqing +xqrz +xqumb +xqyinshu +xr2do242 +xr400321 +xr8y29kb +xra5qdwR +xradz320 +xramyxr +xray1490 +xrdaae +xremove +xrider70 +xrl2890 +xrliidoi +xrmlla +xrmlla +xrokoxx +xrp298aa +xrpmq +xrtnsr +xs147851 +xs1zdcnk +xs281082 +xs2f3am7 +xs2sv +xs4NBB +xs54ed +xsag8800 +xsaihotx +xsara16v +xsatph4a +xsaves +xscalesx +xse32eel +xsepass +xsf888 +xshadow +xshaijing +xshsbxl5 +xshy520 +xshye +xsi23 +xsjadmin +xsjwcxp7 +xst4ever +xsw23edc +xswyaq +xsy +xszone +xt15rswb +xt937201 +xtatic1 +xtayz0ff +xtbhq +xtc09ktz +xtc123 +xtc123ab +xtc1928 +xtc2005 +xtc51 +xtcm4a +xte0w +xtehpass +xtest64 +xtfqk +xtku +xtm123 +xtore79 +xtr143 +xtr32pi3 +xtrafast +xtream10 +xtreme +xtreme06 +xtremsr +xtrfen +xtrim +xtrymex +xturanx +xtwrtwrt +xu1gu3 +xu5266 +xucl7 +xugurx +xuhebysa +xui1z +xujie +xujunsheng +xuk2331y +xulwbo12 +xundi +xupaky +xuprni25 +xuqu7 +xurhitiq +xuron74 +xusine2 +xut569 +xutmiker +xutong98 +xuvu8305 +xuwenxiang +xuy1 +xuyang647 +xuzukr +xv60d6dm +xvadmin +xvbmfwk7 +xvc4553 +xvcb45 +xvid +xvn7j +xvrcrppf +xwad01 +xwave007 +xwbh0res +xwbkeiz3 +xwesker +xwhhc7b +xwing +xwjweh76 +xwleo +xwonx1 +xworld00 +xwrvmlr +xwsqza21 +xwzss +xwzx298 +xx +xx000626 +xx008110 +xx00xx +xx0xx0 +xx1100 +xx1317 +xx15xx +xx1983xx +xx1986xx +xx221958 +xx2m3awy +xx4390xx +xx6yh +xx7071xx +xxXa +xxareaxx +xxcab21 +xxciko +xxgac +xxgswqas +xxixx +xxle +xxlj25 +xxljulia +xxlucyxx +xxlxxl +xxmgxx +xxn8vlta +xxnico00 +xxo555555 +xxrrxxrr +xxssxx +xxw8393 +xxwrvml +xxx +xxx000 +xxx0000 +xxx0107 +xxx1 +xxx123 +xxx123yy +xxx26 +xxx333 +xxx3669 +xxx444 +xxx666 +xxx69380 +xxx82 +xxxadmin +xxxdx +xxxeie +xxxgumle +xxxlars5 +xxxmario +xxxmd5 +xxxsex69 +xxxtnv1e +xxxx +xxxx66 +xxxxx +xxxxx123 +xxxxxx +xxxxxxa +xxxxxxx +xxxxxxxxxx +xxxxxy +xxyba1 +xxyy123 +xxzx007 +xxzxlwsg +xy0258 +xy050223 +xy3m7k7r +xy3m7k7x +xy5jpeg +xy9911aa +xybTGi +xydf2612 +xyfm5t3e +xylitol +xylomid +xymi5 +xynergy1 +xyotm +xyqa4pms +xyqhwggi +xysawq21 +xysl2 +xyteran +xython +xytoob +xyuo08 +xyuxu45 +xyy820221 +xyz +xyz1403 +xyz321 +xyz73e +xyzi68o +xyzpq13 +xyztuvw +xyzzy +xyzzy1 +xz +xz3kpL +xz725 +xzalvarado +xzax +xzbu1rbq +xzcl8 +xze2s +xzenn +xzgvnhrm +xzkgp +xznaifxz +xzndmy3 +xzone +xzppc +xzqbs +xzt4bqsu +xzvf +y +y sa +y'aiter +y**67**f +y-wing +y0078 +y01123 +y0222wbr +y0364nc +y0369401 +y0da719 +y0i68774 +y0m0mm4 +y0m4mm4 +y0shik0 +y0wrq +y0zhl +y11111x +y13qcagc +y13u5wrf +y142536 +y14jab +y19uhk27 +y1e1yu +y1hlj +y1thq +y1x2c3 +y1x34kh2 +y212gili +y26375 +y2643446 +y264t +y2a2j4us +y2b54qa +y2fst +y2k99 +y2kz101 +y3!!ow +y3275ysh +y33441x +y350k0k +y35y350k +y36pngvc +y37co86x +y3bustec +y3k9897 +y3kn0m +y3tpnvfd +y3vghcp +y3wjbhgc +y43ne2ke +y44yt3tu +y4ankee +y4n1k77 +y4raulhh +y4rr0cq +y4w3m +y4xhe +y4xqy +y4y7a9k5 +y5011173 +y52hdgzw +y5cusxj9 +y5pla +y5qt3x +y5rsts2 +y5vxe +y5x6dk8z +y5y5 +y6bxhyh +y6dpn +y6hxl +y6sxb +y71o36uk +y78ui90o +y7ent +y7gew +y7pab +y7u8i9 +y7y49rpf +y8343452 +y85gtf +y89s3p +y8kee2df +y8og7jqn +y8u3s0u5 +y8u68j +y8ynbyy +y9349 +y948f +y9b11ag1 +y9ebs3tp +y9hmm +y9u4p48y +y9wxa +yA540004 +yAeRMG +yCx5jK +yH6zu +yHD69o +yJ34m +yK2216 +yOAt +yQMNI +ySi5z +yZ4 +ya'acoy +ya0yg +ya241128 +ya25di07 +ya25fe07 +ya4laji +ya5ni +ya86pe07 +yaadmin +yaakov +yaali110 +yabba +yabch +yabka +yabuddy +yabyum +yacht club +yachuco +yacine +yacinh +yad16875 +yadi2007 +yadirita +yaeex +yaeleh +yaeraora +yafatta7 +yafg1 +yagamii +yagizhan +yagmur +yagmur64 +yago1965 +yah00 +yahaoui +yahoo +yahoo1 +yahoo2 +yahoocom +yahooo +yahtzee! +yahweh1990 +yaiba +yaiez9yw +yailer +yaivrhot +yak1988 +yak1ma +yakaleu +yakashi +yakauluc +yakesa +yakima +yakina +yakinton +yakkule +yakov +yakula +yakult +yakumo0815 +yakumo17 +yakumo2810 +yakumor +yakuza05 +yalan +yalcin +yale +yale90 +yalena +yalh +yalimmi +yallah +yalniz11 +yaltonay +yalyysl +yama1 +yamabushi007 +yamada +yamada84 +yamaha +yamaha66 +yamahar1 +yamahdi +yamalo +yamama +yaman +yamanh +yamani +yamashita +yamata pauli +yamato +yamato1a +yambf +yami +yamil +yamiyugi +yamoff +yamtge +yamu2480 +yamyam$3 +yamyen13 +yan +yan123 +yan6a +yana47 +yanah +yandex13 +yang +yang2004 +yang36 +yang8891 +yang8892 +yang8893 +yang8895 +yang8896 +yangyang +yanhamu +yanhui1130 +yanick66 +yanjun +yanke1012 +yankee +yankees +yankees1 +yankees1189 +yankees2 +yankim12 +yanks23 +yankton +yanlaz +yann +yann3ick +yannb +yannic +yannick +yannick +yannis +yannis77 +yannje +yano +yanstl +yanuar +yanxin +yaoka +yapbetit +yaphet +yaprakli +yaq123 +yaq12wsx +yaqbik +yaqbik13 +yaqoob99 +yaqqmd +yaqxsw +yara123 +yara2000 +yara8879 +yarak1 +yarakye +yarali83 +yarbay219 +yardi +yaren61 +yarengum +yarinnir +yarmouth +yaro1548 +yarrak +yarrak1 +yarrakye +yarunka +yas1981 +yasaka +yasakl1 +yasalsa +yasar +yasdc +yasebox +yaseen9 +yasemin +yaser +yashik3 +yashira +yashka +yasin +yasin110 +yasin51 +yasin562 +yasincan +yasmari +yasmin +yasmin098 +yasmina +yasminae +yasmine +yasosuke +yasper +yassar +yasser +yassin +yassine +yasuaki +yasuhiro +yasuko +yasuni +yasz1506 +yat632 +yatie2008 +yatoo123 +yaudr +yautja +yavas +yavdtvn4 +yawsasab +yawyaw +yax1o +yax70duw +yax749pq +yaxkehic +yay +yaya +yaya158 +yayalove +yayang +yayaya +yayla +yaylam +yaz1111 +yaz60wub +yazan +yazara +yazdim +yaze +yazeynab +yaztaz02 +yazyaz +yazzinec +yb198108 +yb4whs +yb8068 +ybdh +ybgur +ybird24 +ybkn11v1 +ybks1c2g +ybldz +ybmzs +ybnhjukbwthby +ybo0z +yboradyl +ybrbnrf +ybrroad +ybusj +ybz8818 +ycats +ycazh +ycbjbn +ycc14888 +yccl23 +yckmi +ycl0727 +yclakyz +ycli2539 +ycn015 +ycnwep8q +yctaodnt +ycux2nme +ycyom +yd1956 +ydHo7f +ydf +yditag +ydoi55oi +ydshit +ydwbezux +ydyo6640 +ydzvwgbf +ye07aa +ye4s1 +ye770208 +yeYe50 +yeacov +yeah +yeah2828 +yeahbuddy +yeahhand +yeahsure +year1956 +year1978 +year2008 +yeardesk1 +yeardley +yearight +yebega +yebesign +yebmizav +yecao +yecgaa +yedda12345 +yee tak +yefxorul +yegani07 +yehia +yehoram +yehuda +yehudi +yei302 +yeiby +yekatrina +yeknod +yekokume +yekpit +yelang +yelda +yelena +yellow +yellow10 +yellow1915 +yellow2 +yellow32 +yellow79 +yellow88 +yellow91 +yellowhorse84 +yellowmagna +yellows +yellowyellow +yelow03 +yelsew32 +yemebeni +yemin +yemisi +yemma +yen +yen26418 +yen81cam +yendun94 +yenglor +yeni +yeni2009 +yenko427 +yenny88 +yensid000 +yeoj76 +yepteam +yepyep +yera1277 +yerahy +yermum +yers4480 +yes +yes3sd5e +yes777 +yesaire1 +yesesaveta +yesha1 +yeshua1 +yesiam +yesihaso +yesilova1989 +yesim007 +yesmiss +yesmypw +yesnoyes +yesosee +yesqtr +yessurr +yestorty +yesz1yny +yet21u +yet5o +yetg6 +yeti +yetihead +yetkili +yetpou +yetvery +yeu28k +yeun2005 +yeung +yeusex01 +yevgeny +yevgheni +yeya +yeye5050 +yez38 +yf42xh94 +yf601108 +yf888171 +yfaxx +yfchills +yfdctulf +yfdsrb +yfenbkec +yfiajhev +yfirjhti +yfkw0op7 +yfloresa +yflzcerf +yfvujtio +yfyfyf +yg5ojryu +yg6ji +ygb404 +ygdKqG +ygflx +ygg48c +yggames +yggdrasil +ygijnnB818 +ygimzs +ygir +yglco +ygolohcysp1 +ygpen555 +ygrmonmu +ygvkp +yh244r +yh5697 +yh9679 +yharun +yhc2007 +yhevetol +yhgp232k +yhhey +yhjfo +yhltyhlt +yhn495 +yhn6u +yhn72km2 +yhntgb16 +yho23u +yhqqw +yhrwiq7 +yhte1nen +yhujyjh8 +yhwg3z +yhwyhw12 +yi +yi2006 +yi6iei3b +yiHACK +yiao0120 +yib04viw +yibaluma +yibnw +yicbaheq +yichao890 +yiftach +yigit885 +yigoga23 +yijgidov +yijian4480 +yikgelep +yikiabbg +yikim10 +yildo +yilong2002 +yiltay +yingoing +yingyang +yinyangers +yinyin520 +yiranyiran +yiswasex +yith8n3v +yitongss +yiv58gud +yiwdivuz +yixd6ee2 +yiyi +yiyi001 +yiyqadil +yj014 +yj791123 +yjd2a +yjdbrjd +yjdfgkfy +yjeu89h1 +yjk55rtw +yjke6 +yjmav +yjn501 +yjnnhmtd +yjs3e +yjsaiitx +yjsbg +yjsolruc +yjt9x4xm +yjyangjin +yjyh123 +yk1956 +yk77hftp +yk813813 +ykd05 +ykd93ur +ykh1c +ykhall +yknev67 +ykpass +ykq2ondo +ykqkd +ykumg +yl5565 +yl9700 +ylbang +yld3is7r +yliu078 +yllek2422 +yllspor +ylm213 +ylm3n +yln90p +ylnw8 +ylozsl +ylryst +ylucrlah +yluso +ylux3 +ylze8 +ylzy +ym0237 +ym12345 +ym2enywp +ym7fnekw +ym7oirj6 +ymaidb3c +ymassis +ymbtpg +ymc1 +ymer56 +ymeu +ymf4d +ymghg31 +ymlite +ymm3 +ymorymor +ymrdna2h +yn8y2un2 +ynattirb +ynbinich +yncl2615 +yndemli +yngver +yngwie666 +yngwiej1 +ynhomaru +ynlkecwc +ynotynot +ynrprmly +ynubl +ynzheng +yo +yo228cel +yo310090 +yo4qtugj +yo575 +yo68rc21 +yoan +yoanch +yoann87 +yoasia12 +yoav123 +yobbo1 +yobbo9 +yocjebix +yocon +yocrunch +yoda +yoda1209 +yoda69 +yodaca +yodaisy1 +yodatak +yodchai +yoditt +yoedeme +yoetpo +yof85xig +yogevbm8 +yogi +yogipol +yogo14 +yogui +yogurt +yoh2kaof +yohan +yohanan +yohannnn +yoichi +yoire07 +yok +yok111 +yoka +yokbok +yoki7331 +yokki +yokkim +yokmusun +yoko +yoko0212 +yokohama +yokovkyx +yokyokki +yola +yolafred +yolanda +yolanda +yolande +yolgezer +yoliesje +yolucho +yomaira +yomama +yoman +yoman666 +yoman7 +yomates +yomega +yomies +yomismo +yomvotr +yondo6 +yonet +yonetici +yonetim +yonghong +yongku37 +yoni +yoni30 +yonitito +yony +yoo +yoo3roo +yoomin1324 +yootha +yopiweb3 +yopla +yoplai +yops +yopsolo +yopyop +yoqqq +yoquese4669 +yorgo +york1922 +yorke +yorkisu +yort0909 +yoru69 +yose1234 +yosef +yosemite4me +yoseph +yoseyose +yoshi +yoshi92 +yoshidruid +yoshids +yoshiki +yoshiko +yoshime +yoshio +yoshipsp +yoshiwa1987 +yoshiyuki +yosoy1 +yospamm1 +yossef +yossi +yosteveo +yosuke +yosvftbd +yosyf7fq +yota600 +yotathai +yotetto +yotmai +you +you111 +you1946 +you1own1 +you2000 +you4pass +youareowned +youass +youcef +yougeek +youhhsaf +youka +youknow +youknow321 +youkoso +youma +youn2220 +younes123 +young114 +young78 +youngestgay +youngk +youngs44 +youngun +youngv +youngyou +younies +youownme +youpla +youpyoup +yourang +yourbaka +yourfart +youri +yourm4m4 +yourmama +yourmine +yourmom +yourmum +yours +yours007 +yousik123 +youssef +youssef +yousuck +yousux +youth828 +youthadmin +youthank +youthweb +youtube +youtube8 +yowzee +yoyi2389 +yoyl +yoyo +yoyo0512 +yoyo06 +yoyo14 +yoyo22 +yoyoyo +yoyoyo666 +yoz23896 +yoz8cxyw +yozfz7dj +yozgat +yp6dzg +yp899 +ypeguqah +ypfill +ypgw6h +ypmurf17 +yporacle +ypsmail +yq0qmxsn +yq419 +yqN9CU +yqb9pm +yqh0755 +yqhlym +yql-123456 +yqtbd +yqwj62 +yqz3rdt7 +yr3456 +yr4df3v345 +yr4veak +yr68716 +yrREK +yrdydydy +yrehcra +yrgt4mns +yrn5w +yronaz +yrr4s +yrrumnio +yrts6 +yrvfp +yry4n +yrz2177 +yrzazilr +ys02x08w +ys66ss +ys7sybaf +ysc0013 +yscr0 +ysdsds +yse47ujm +ysebaert +yser2185 +ysgrace +ysh10 +ysijumav +ysjjsl +yslin007 +ysp1978 +yspolin +ysrmq +yst93 +ysus +ysxab +ysyhljt +yt +yt2342 +yteysdfnm +ytf85zsb +ytiwttvo +ytjt +ytjxtv2 +ytlh14r +ytltjsk6 +ytn1f7xf +ytq0qwbi +ytrebil +ytrewq +ytrewq0987 +ytreza +ytsejam +ytsjg +ytuhtiys +ytz83 +yu +yu0152ka +yu020798 +yu0514 +yu23n +yu25ko07 +yu3t9 +yu3y1n9 +yu5678 +yu65147 +yuantaoy +yuav7 +yucatan +yucchan +yuchen1990 +yuckfou +yuckyuck +yud9my +yudel +yudi +yudik +yudistira +yuflRa +yugioh +yugioh0328 +yugioh1 +yugo1306 +yugo219 +yugo78 +yuhara +yuhu9584 +yui12345 +yuiop67890 +yujciyes +yuji +yujiro +yujiro11 +yujiviad +yukanakata +yuki +yukik +yukimura12345 +yukino +yukio ao +yuko +yukomori +yukon464 +yukon888 +yul +yulicdey +yulie187 +yulikssh +yulita159 +yum +yumc1234 +yumegt +yumen123 +yumen321 +yumen987 +yumi +yumiko +yumseng +yumyum +yuna1985 +yunalesca +yungh4ns +yungying +yunis822 +yunosuke +yunus +yunus571 +yunus66 +yunyun +yuominae +yupopa +yuppiene +yur3trax +yura +yureka +yuri +yurik745 +yuriko +yurpht +yurt1997 +yury +yus24veg +yus86l23 +yusuf +yusuf754 +yusufeli +yusufum +yusuke +yutopia +yuv01huz +yuvechi +yuwathida +yuwbj +yuwyikib +yuxa7t5 +yuxpavux +yuya +yuyao520 +yuyoska +yuyu1980 +yuzo +yv2004 +yvan +yvancha +yvarg247 +yveline +yves +yves1 +yves71 +yvespass +yvesyves +yvette +yvetter +yvfvb +yviquel +yvon +yvonne +yvonne +yvonne! +yvonne.. +yvonne17 +yvonne23 +yvonne63 +yvpaitam +yvscha +yvtokyo +yw123123 +yw19920 +ywa5115 +ywab1402 +ywhjia4f +ywidv +ywj7516 +ywjpheej +ywk50 +ywq0n +ywq788b7 +ywquge3 +ywsyls +yx123456 +yx231y +yx9trdc +yxc123yx +yxc150 +yxc741 +yxcvb1 +yxcvb234 +yxcvb321 +yxcvbn +yxcvbnm +yxcvbnmt +yxcxzvkt +yxd4m +yxdz2007 +yxgthx +yxn6r +yxnhl +yxpyy +yxriuq +yxtiqu5r +yxvrwq +yxxnf +yxxnv +yxz8464 +yxzs9s +yy112233 +yy1224 +yy1957 +yy232647 +yy740674 +yyakirsy +yyd +yyf5810440 +yyimap +yyj6b +yyjnj123 +yykkyykk +yylovely +yynnka +yyoquese +yyszkfqn +yyyiv +yyyyyy +yz2000 +yz429 +yz6u7q6k +yz80cc +yzIoD +yzb1845 +yzf750r +yzhkk +yzk98783 +yzksz +yzm1017 +yzmbhack +yzopr +yzq9a +yzs715bb +yzsoft +yzvyzv +yzwam +yzxl7 +yzxvu +yzyir1 +yzzjq +z +z*x*7*r* +z001349 +z051816 +z0777 +z0etwlka +z0gz0g +z0mb0c0m +z0mbie +z0qzu +z0salex +z0tqj +z0u51 +z0zkj +z1000 +z1012854 +z10h0101 +z10n7777 +z11982 +z11qnyzw +z12035791 +z123456z +z123klm9 +z12wxz12 +z130782 +z132241z +z13l0ny +z1SJIn +z1chia39 +z1e2u3s4 +z1ggy3 +z1khqhwt +z1lxp +z1mytu +z1on0101 +z1x2c3v4 +z1y2x3 +z1y4nt0p +z20071975 +z2110390 +z21x36h8 +z240286 +z253p +z260490 +z274943 +z2999S +z2anette +z2fif +z2g5u3l9 +z2sst +z32 +z329y +z38xd +z3b567 +z3bd48 +z3l1g +z3n0z3n0 +z3nfw +z3nit +z3onkelz +z3r0 +z3sr5 +z3srm +z3uspatr +z3xo6kl3 +z42BP +z43cfd18 +z43kbos +z45650 +z45668 +z491piz +z4PEfC +z4d0l +z4ph0d +z4r29v7s +z4v3i59i +z4wi0 +z50344345 +z5100751 +z5201314 +z54321 +z56ya34 +z5b9s7f3 +z5forum +z5hyky +z5s8p +z644c +z649387z +z655k666 +z666eaf4 +z66bker +z6dfyrnt +z6mbn +z6rqft +z6xkk +z71rodeo +z7502005 +z7895123 +z7Ky3L +z7hgtp1 +z7ktn +z7lsRjD857 +z7ltalp1 +z7lxi +z7mftgy4 +z7tnf +z7tyl +z7uyarj7 +z840918 +z8760075 +z8930179 +z89khz6 +z8Ub9r +z8auwi +z8bum4xc +z8g849 +z8mn18k +z8trj +z8wce +z935472 +z9680022 +z98me6e6 +z9966596 +z9a1os4 +z9e5e2fb +z9lxu +z9nxt +z9ufe2 +z9z9z9 +z9zfc +zEaK47 +zG8967 +zGAX15 +zGjytW +zHein +zHuQ13 +zMVTG6 +zP3T8 +zP5j3T +zU3k4 +zUoc6B +zXc12d +za +za2aco0l +za2zvzgr +za363548 +za3821 +za43pl +za5355 +za6498 +za900zaa +zaadcel +zab71822 +zaba +zabava87 +zabbi +zabbix +zabbixz +zabcd +zabeel +zabierz0w +zabizna +zabka1 +zablokowana +zabucco1 +zabugit6 +zabuxto +zabuza +zac1234 +zac51069 +zac712 +zac99tan +zacasno +zacaxx +zach +zach007 +zach12 +zach1829 +zach4613 +zachary +zachary +zachary120 +zachi +zack +zack +zack00 +zack1 +zack2698 +zackava +zackie69 +zacko2 +zacman +zacrifize +zaczaros +zadkiel379 +zadnika1 +zadszads +zaebali +zafer +zaferb +zaferter +zafira00 +zafira7 +zafirbel +zaftig +zag42 +zagato12 +zagatorz +zagbayou +zagifly +zaglebie +zaharia +zaharman +zaher123 +zaherzaher +zahidem +zahir82 +zahniya +zahrah +zahur321 +zaid +zaid +zaide silvia +zaidelov +zaidimas +zaidoun +zaika1988 +zaika45 +zaika84 +zaikki +zaira001 +zaivlis2 +zajacw74 +zajebancije100 +zajfucot +zak2395 +zak3mes +zakdoek12 +zakeagm5 +zakenn +zakhooi +zaki123 +zaki67 +zakir +zakjan +zakka1 +zaks3843 +zal1990 +zal9qoic +zala +zalaman +zalamar +zalaq +zale +zalgiris +zalim57 +zalimm +zaljub +zalman +zalohy +zalomon +zalupa +zalupa21 +zalzakis +zam3190 +zam3945 +zam45er +zaman +zamek1 +zamek456 +zami1982 +zamin93 +zamina24 +zamolxe +zamrud73 +zamudio123 +zamura +zan2007 +zana0111 +zana30 +zanardi1 +zand +zand2oo +zandalphon +zander +zander98 +zandrith +zane +zanino +zanipo +zanith42 +zanjan +zanna +zanna123 +zanoza +zanshin +zanybj +zao3mup +zaodsoft +zaonical +zaoug +zap101 +zap36336 +zap6750 +zapata10 +zapatero +zapatilla +zapato42 +zapcqdrf +zape +zapekas +zaphod3100 +zaphod714 +zaphodnz +zapiti +zapo +zapopass +zaporka +zapp078 +zapper +zapzap +zaq123 +zaq12wsx +zaq1xsw2 +zaq91vud +zaqWSXcdeRFV +zaqZXC +zaqw@1 +zaqwas +zaqwe123 +zaqwsx +zaqwsx22 +zaqxsw +zaqxsw12 +zaqyer +zaqzaq +zar123 +zar2004 +zar89hof +zara12 +zara2001 +zaragoza +zarah +zarama26 +zarasai +zarazarapm +zargotin +zarina +zarko +zarma3 +zarobiev +zarrouy +zary9279 +zarzecze +zasada666 +zasadym +zasadzka86 +zasalone +zasani +zase +zashzvll +zaslonka +zasna05 +zasu +zasu200 +zaswerd +zaszczyl +zatawu +zatax89 +zatchbell +zatopeca +zau251 +zauber +zauberer +zauberermerlin +zausel +zauvek +zavfor51 +zavinagi +zaviravi +zawada +zawbaqav +zawoja12 +zaxas123 +zaxscd +zaxscdvf +zaxse3r4 +zaxxzaxx +zaydgocl +zaygo +zaza12 +zaza123 +zaza2580 +zazaca +zazadaye +zazakaka +zazaza +zazazaza +zazd +zazenhausen +zb2zefxg +zb3log77 +zbcxj8nt +zbgztq +zbigniew +zbka49e3 +zbkkamzz +zblogger +zboard21 +zbor13 +zbouby +zbpaqws +zbrogg +zbych +zbyrf9nb +zbyszek +zbyszek123 +zbyszeq +zc0qefzv +zc1fnj5h +zcallin +zcao4p +zcbace +zcbj562o +zcbm37hj +zcd0j +zcg202 +zchaucar +zchbttco +zcj08 +zcjnn +zcraiding +zcshty +zcvom +zcx62 +zcxvvxcz +zcyfv +zczi9l9 +zd2508 +zd27ypt6 +zd2yggn5 +zd574q +zd6n7knn +zda216 +zdah9jw1 +zdanek +zdarov +zdekmir7 +zdenek +zdenka +zdeu8nyv +zdj9c +zdmax5 +zdnero +zdravko +zdrkaksi +zdupiaj +zdzichu +zdzislaw +zdzislaw22 +ze06032 +ze1960 +ze5200 +zea6y +zealot77 +zearlrob +zeaz +zeb +zebedee10 +zebedee77 +zebi123 +zebra111 +zebra3 +zebra728 +zebra7890 +zebu001 +zebulo66 +zebzeb +zecarlos22 +zecca +zechert1 +zed135 +zed1989 +zedalf +zedjatam +zeds12345 +zedtech +zedzed +zedzed9 +zeebani +zeev +zeffie +zeg +zehirr +zehra +zehrakiz +zehram +zehzwei +zeilen20 +zeitlinger +zeitreihe +zekeriya +zeki50 +zekic123 +zelazny +zelda +zelda +zelda1 +zelda16 +zelda23 +zelda717 +zelda94 +zeldaa +zeldaj3n +zeldarok +zeldin409 +zelenaki +zelipuka +zeljko +zelliewp +zelma vas +zelt +zemestan +zemlja1234 +zen123 +zen3 +zen7joke +zena +zenamarie1 +zenda1 +zender17 +zenek123 +zengels +zeni +zeni12 +zenica75 +zenigata +zennure +zenobe +zent0811 +zentiva +zentrall +zenxiyin +zenzen +zenzetsu +zenzivk +zeo333 +zepernick1964 +zepfan88 +zephine +zephira +zephyr +zephyr628 +zephyr66 +zepoqs +zeppelin +zeppo +zeppo47 +zepterone +zequiel +zeqz2 +zer0 +zer01 +zer0123 +zer0c00l +zera +zeratul +zeraw123 +zerba89a +zerberus48 +zerberus7 +zergadis +zergen +zerger88 +zergling +zerkalo +zerko33 +zerlotus +zermatt373 +zernicke +zero +zero +zero00000 +zero123 +zero16 +zero1979 +zero260 +zero83 +zerobug42 +zerocin4 +zerocool +zerofire +zerogish +zerohero +zerolol +zeromus3 +zerone +zeroone2099 +zeroonetwo +zerosee +zerozero +zerpurwm +zertva +zerty1 +zest2626 +zeszuf9 +zet1510 +zeta12 +zetou5 +zetzetzet +zeuqxikx +zeus +zeus123 +zeus1387 +zeus1488 +zeus1972 +zeus1976 +zeus1987 +zeus2004 +zeus2010 +zeus777 +zeus901 +zeuspoop +zeuss07 +zeuszeus +zewbin +zewtamer +zexxy +zexzypig +zey852ov +zey8edhk +zeynebim +zeynel +zeynep +zeynop +zeytin +zeze +zezegigi +zezima +zezima44 +zezizu99 +zezuzo +zfburner +zfdam007 +zfe8w +zfile74 +zfj0r +zfjcevr7 +zfsarina +zfwturei +zfxql +zg1953 +zg6qyfih +zga6u +zgaljici +zgambidi +zgc123 +zgc82dru +zgcshop +zgcyi +zgk9ztg9 +zgka9s2v +zgmMXB +zgmuar +zgred +zgu45wex +zgzpi3d6 +zh01m +zh3048 +zh9fg4g4 +zha0p +zhan +zhan +zhangjie +zhangye +zhangzjj +zhanna +zhaobin222 +zhaohuan +zhaoruqi +zhaoyun +zharfan1 +zhayank +zhb80 +zhe007 +zhe8668 +zhengjian +zhengnian +zhennanr +zheraprd +zhi251 +zhie2008 +zhirong89 +zhizhi +zhj +zhlh +zhnt3 +zhonghan +zhopa +zhou0421 +zhou6j9n +zhoubin +zhoukeyv +zhoupeng +zhouzhen +zhpduk +zhrmmo +zhu12530 +zhuguang +zhujun1990 +zhulove +zhulovepiggy +zhuocheng1981 +zhuren +zhushi +zhuzhu65 +zhxp +zi0mas +zi0n1952 +zi3012b8 +zi3105 +zi5ac +zia +zia5roen +ziad053 +ziad7854 +ziafat +zibann +zibartan +zibbi2 +zibhskta +zibi3y +zibomo +zibur +ziceku8 +zicke +zickzack +zicxeheg +zidane +zidane10 +zidi +zidongqu +ziege +ziege34 +ziegler9 +ziemniaki +ziertdfg +ziffern123 +zifora +ziga88 +zigani +ziggen1 +ziggy1123 +ziggy1996 +ziggy23 +ziggy3450 +ziggylet +ziggyru +zigino66 +zigmsn +zigo +zigomo1 +zihaha +zik +zika09 +zika10 +zikacha +zikapass +ziktr +zildjian1! +zildjian9199 +zilina +zilita4455 +zilla14 +zilog2 +zilogz80 +zimbrel +zimi4670 +zimka3kt +zimma +zimmer +zimmer531 +zimmer6 +zimmerer501 +zimmermann +zimmi666 +zimowa61 +zimw4 +zin +zina +zindan94 +zinfield +zinghema +zinka +zinkosk8 +zino +zinoran +zintex +ziocane +ziolo123 +ziom +ziomal +ziomas13 +ziomek +ziomek11 +zion +zion1234 +zioni4u +zionsusu +zioomal +zipbild +zipflood +zipipipi +zipp83 +zippage +zipped4u +zipper +zippi +zippity +zippo1 +zippo1209 +zippo34 +zippogal +zippy452 +zippy6 +ziprar +zipzop +ziqi4537 +zirdusis +zirgs +zirgtfdu +ziriax +zirka2468 +zirtapoz +zirvenet +zistei +ziswajql +zita +zither +zito +zitoon +zitoun +zitrone +zitrone4ever +ziutek2005 +ziva +zivkov1987 +zixinc00 +ziy202 +ziyad +ziyad123 +ziyad21 +ziyadah +ziza1983 +zj55DG +zj56 +zj730208 +zjarany1 +zjbk1kpq +zjc411 +zjg2x +zjmy5 +zjoz4d +zjs43a +zjwr6 +zjx23d +zjy1028 +zjzjvod +zk0815 +zk4rn +zk696969 +zkho9 +zkiab +zkinetix +zkjpgp +zkspwst +zkt4445 +zkxtre +zkxtrem +zky0v +zl0ba666 +zlO +zlamixam +zlandjsm +zlap +zlastis +zlata +zlatan +zlatka +zlatko +zlatniia +zlato +zlbw123 +zlcjg +zlfawi +zlhnn +zliNn +zlink54 +zlkh14 +zllama28 +zlpw0ker +zlu0woaw +zlu808 +zlzl001 +zm2o +zm475915 +zm64khey +zmajchi +zmalqp10 +zman35 +zmapstgm +zmaster +zmcc288 +zmdklffy +zmejs22 +zmek2 +zmgeqr56 +zmh276 +zmi2808 +zmiloveyou +zmkputwl +zml6665 +zmlernen +zmnct +zmo0516 +zmpdjfdv +zmwq +zmxncb +znam +znb0mmnx +znera +znhx1 +znkyky0 +znm958iw +zns786 +zntklgk +znxbcv +znznk10b +znzny +zo27web +zo49ka4l +zo5mptmj +zo6ka +zoanthus +zoaunne +zoazl +zob +zobelorg +zobelpad +zobidar +zobins +zobzob +zoc45gun +zocher69 +zocken +zocker2 +zocker66 +zocor18 +zodiac +zodiaczz +zodigi63 +zoe +zoedog +zoehope +zoeis3 +zoejoubi +zoelee999 +zoet1984 +zoetje22 +zoetjen +zof1wm3c +zoff2710 +zoffi99 +zofia +zofjzpof +zofta +zoh288 +zoheer +zohr2005 +zohra +zoia +zoidberg +zoidz +zoie2371 +zoiquer +zol1r +zolam +zolasz +zoldik +zolex +zolex242 +zolika +zoller +zolrac +zoltan +zoltan +zolton +zoluzi71 +zoly3em +zolya +zom +zomb021 +zombie +zombie7 +zombiee +zombies +zombik800 +zombrito +zomer123 +zomer2009 +zomfg +zomg +zomg111 +zomg321 +zomgness +zomgwtf +zon +zona1619 +zonac220 +zone1936 +zonefone +zonejeux +zonex +zonia +zonk0815 +zonk4423 +zonkbut +zonq +zoo +zoo25 +zooeycat +zoofil +zoofs +zooltar +zoom05 +zoom121 +zoom3000 +zoom911 +zooma3455 +zoombie +zoomone +zoomx5 +zooro +zoot03 +zooyork +zopzop +zoqyitex +zor +zor22rad +zor2glub +zora +zora1300 +zora616 +zorak321 +zorakill +zoraking +zoran +zorba1 +zorbaraj +zoretti +zorggg +zorgon2010 +zorjasdx +zorkin10 +zoro1414 +zorodin +zorqjc10 +zorrilla +zorrnige +zorro +zorro112 +zorro5122 +zorzet69 +zorzo +zosesas +zosia +zoto +zottegem +zottekot +zottel +zottellu +zotti0815 +zouaoui +zoubid +zouh1976 +zounds +zouzou +zouzou99 +zoya +zoykz +zoysnxiz +zoz46muz +zozier +zoziffe +zoznamenie +zozo26 +zozole +zozpiyem +zpawk789 +zpclean +zpkgc +zpqph +zps0wbk +zpwvxkrv +zq19vp +zq6969 +zq820815 +zqg5f6 +zqjed +zqpm2812 +zqzho +zqzq +zr5k3ebx +zr6ai8 +zr815t13 +zribupu8 +zrombany +zrowned +zrslib +zrt440 +zrubekhh +zrvvt +zrx852 +zrxfwqv +zrxk7fab +zrz330 +zs070593 +zs1111 +zs1383 +zs358451 +zsa zsa +zsabor +zsani +zsaxzsax +zschodcc +zse4rfvg +zserdx +zshjymz +zska53 +zslib213 +zsnpm0z6 +zspl71 +zss9393 +zsuzska1025 +zsw6bhu +zsxcde32 +zsxdcfvg +zsyhy +zt0803 +zt285150 +zt2d3grc +zt7i5m +ztavki53 +ztcikasj +ztcsk +ztdocs07 +ztech02 +ztenma +ztk2648m +ztk4758d +ztl33t +ztp207 +ztpesikb +ztu1463 +ztul38 +ztw2002 +ztyyby55 +zu0pzu +zu1btr +zu5ha +zu8k9ae5 +zubaida +zubilene +zubin123 +zucaru +zucchero +zucchino +zuccini34 +zuckerwasser +zud78vew +zudikas +zudxora +zufall2106 +zug333 +zugangcoyote +zugeli88 +zugropew +zugs2964 +zuhairi1 +zuhkq +zui9pui +zuia5069 +zuigplek +zuiiii +zuikis +zuj2j1a2 +zukata +zuke1370 +zukulu +zukunft06 +zuleika +zulema +zulianig +zulivo +zullaosu +zully +zulmatyt +zulu61 +zulu789 +zuma +zuma1971 +zumeo13 +zumin111 +zumpasswort +zumpi +zun99dpr +zuna +zunaid +zunami +zunsohib +zuntlan +zuonko +zuq8t +zuqgexac +zura2009 +zurab +zuraw9 +zurdito +zurdos +zurg1234 +zurinawati +zurits +zurna +zurna123 +zurtac +zus +zus8 +zusje +zutreni +zutrux99 +zuuuk +zuviel +zuwairi +zuwem12 +zuwetter +zuwtidop +zuxel +zuxonajy +zuzana +zuzana +zuzanna1 +zuzia1 +zuzinka +zvcucrew +zvdmmsdi +zvee +zvenig +zvezda +zvezdica +zvhatc +zvi +zvicd +zvl93d +zvonko +zvp3qlr0 +zvp4l30 +zvuloun +zvyeah +zwachtdh +zwack91 +zwaddern +zwe83 +zwecklos +zwei2zwei +zwei7as +zweige123 +zweivier +zweizwei +zwemmen1 +zwerg6 +zwerg62 +zwergen +zwerok +zwhh0 +zwick007 +zwie60 +zwiebelsche +zwierzak +zwilling21 +zwirbel02 +zwirek88 +zwirne +zwisler +zwj123 +zwmcrew +zwolen10 +zwspj +zwsxh +zwvd6kdh +zwyinbsu +zx12qw +zx1368 +zx1986 +zx198964 +zx2mc76m +zx300red +zx313074 +zx31zx +zx44bbpp +zx600r +zx671005 +zx6h1lmp +zx6jen +zx72pf +zx77qp90 +zx81 +zx9999 +zxOP12 +zxa1988 +zxasqw +zxc +zxc12345 +zxc132 +zxc159 +zxc321q +zxcas585 +zxcasdqwe5 +zxccxz +zxccxz19 +zxcdsa +zxcv +zxcv1234 +zxcv142 +zxcv4444 +zxcv57bn +zxcv8888 +zxcv9999 +zxcvasd +zxcvb +zxcvb123 +zxcvb6 +zxcvbn +zxcvbn666 +zxcvbnm +zxcvbnm016 +zxcvbnmz +zxcvzx +zxcvzxcv +zxczxc +zxczxc23 +zxd9689 +zxdfz +zxdl5 +zxi6y +zxl1977 +zxman +zxpo4iza +zxqwer +zxr712by +zxthink +zxtuv +zxxwrvm +zxy0518 +zxzxcc +zxzxzx +zxzz123 +zy12345 +zy159753 +zy3cbavj +zy5lcM +zy6uvyh +zyadm5 +zyanya +zyciee85 +zyf123 +zyga1961 +zygmunt +zygote420 +zygzak04 +zyjwsq +zykloid +zyklop +zykuti19 +zylxa5yh +zym53 +zymup8 +zynlf +zyos +zyr4jzy9 +zyrvjiux +zysansar +zysc0 +zyszka17 +zyt1r +zytyaqs9 +zyv226oi +zywiec +zyx007 +zyx23cls +zyxel600 +zyy111 +zyyvl +zyz7qanp +zyzhr +zz0812 +zz112233 +zz16302 +zz230810 +zz2564zz +zz4420 +zz44zz +zz4824 +zz5522 +zz6b7x +zz92120 +zz985747 +zzaa +zzabur +zzad666 +zzadmin +zzampa +zzazza +zzbk00 +zzchboyz +zzdzn +zzhhcks +zzk2100 +zzm5rd +zzmason +zznzbn +zzoizzz +zzpopzz +zzr600 +zzr900 +zzsk1 +zzt4t8zz +zztaojin +zztopzzz +zzurka +zzuui +zzww +zzx123456 +zzxazz +zzxxCC +zzxxwrv +zzy5v +zzz +zzz1p +zzz666bc +zzz72912 +zzz83x +zzzXXX +zzzpla83 +zzzz +zzzz1982 +zzzz9 +zzzzz +zzzzzm +zzzzzz +zzzzzzzzzz +zzzzzzzzzzz diff --git a/example0.hash b/example0.hash new file mode 100644 index 0000000000..0c73da2ed3 --- /dev/null +++ b/example0.hash @@ -0,0 +1,6494 @@ +000405dbc07c3b595fc87031af6f9879 +001e99bd69f0a582d39cca7284b60784 +0021ca52049c734ac0d3d6f92042abf7 +0028080e7fa8c81268ef340d7d692681 +002ace365a341e55de9d6387100b2c65 +002e95d82be30396fccd375ff23f8b4c +0034c5e418ae4f2eba590a16696edbb3 +003bb3beafbd8667163e19299433df83 +00428d94d9482d8c7037b6865521b3fd +004a019c7da04f3d24885bad984b4a43 +0057e62988e7c8fadc64a05e777d63ae +006bce282871ae13058036732ff54daa +0078a9714e988065ac5eb3c02ef247fb +007f821308da3eae495cffea6e35ce79 +007f8558448eba6c4f1d3fe33a0e52f7 +0080a085ad754f22b78827e7d686b5d8 +009665b6e9909adbc8c50a8d922f77d8 +009fb8f6b1dee37cfedd091a0b873be1 +00a6ff9bf56e5822e1dd39aa5ef5b36b +00aaeb611c8524dfdb7262bfd7b6f5c2 +00b187ed80cc514d385da863580991a4 +00ccc04ffaba08f275369e263da57408 +00d4f66b158e4476a19cc365c19fa241 +00d5d5fea0b87b535219dfce29411061 +00d62ce2bfc31a69e7e4f4d42bdfc1e6 +00d730903a6d7ef6447f053b48fc3b7d +00dbed750c1e760222c5b751efbbf5e5 +00f644693dde3a632f5bc6a13d136268 +01084b256a3ab84628e3161c9286de9f +010cbeaa6d609d2fb526606c0803101f +010fae4898685cf661888634f5f68453 +01230763e87102e62f2c874a570945d8 +012f9ec8f64b85644fc68f543a29b237 +0132fed90939abe6dd7b9b1e38da7544 +0133d8000b6c29ae202e838d778e8b91 +0142b84c7d5ab92691cf9e21fbca9a08 +014a88baafbaba61786e6bf28674a114 +016d4fab51520bbb50e88859e2638b6e +017597cf11437fc322ad79ceb00fdc87 +0176ccd8ce70187ae05786b0bf9b95e3 +017f836995e90f6e72156aa5907e6171 +018a96f9a8d356e40c442031a3bc96c3 +019084af565f33356f5ec776872bb290 +019940db3f50bc69790ff3fa6f91a08f +01a6411f4108b03f3d331ae8a6a3c319 +01a8bb63b0c52fb03cd81a50021848af +01ab02ef61575b2c8ec3f313e3579845 +01c6a87597063e1ee840a0421390361d +01c8328b1a72348a8795c65650a79622 +01f02bd1b6bbaeed9563a770e4123e44 +0204bfbbe8aaf05c6fb81715b15a13a0 +0228b4d217fdf3bee5baa1bbb36e210a +022bc78d6da5c3dfdfef1c167730d9f1 +02329c0228477ec9a6626e73e0312e7d +02347bee7fa44ff9146dd538489d01b6 +02440d87282f2802d16edb223c57e957 +024a1798ec23c9ee36a1e0232ebe8fa8 +024bfc9dc5bf68a36ea46ca35cab516d +025b4f3c5d220046ce0cffd07c4c7d9b +0275323d13fa45cd6436aa6519cfff2c +027689c6de01a5a1c1acd7c60128b996 +02808cf5933d0e2b97ac4f83257b2b3c +02836e2e692d9290e8050f088c7cb88c +0289505d81fba71708e032693d3db3f2 +028e12b58ca27778db7766220dd47c59 +02931d9b6146798c763d00e8d9d37b17 +029b1a5c1e553b3636b07ba7b6e74747 +029ebe30a1d1eb33fc5579b6aef2759d +02aa176a421d28381cfa5a7772aa749a +02d11829556bb58b17e87f50d44b5f27 +02d67d91b2638d986f0a8e0b9e553287 +02e377fd2654bd0a95de788a8a710e97 +02e929645f8660dd436610bbec520200 +02eff812ebde133315dbc8b0e07ae681 +02f7c4741d1ad85e970955109f290c44 +02fc80e939d087291ce68a81289b9f5b +02fd9270200f7984eda654c4f4abe328 +03021339f2765d27bd4e5ae8058f5b37 +0303dc7516a18c12f0bb347ee68777f6 +030e1c1b0e37ef7f705129de95869e8b +03142d53faac8c9ca3a8c61a5a68685b +033bd059282a8d6c10bd446a82752d0d +03474d49a2c875bdcb219f681ebe7523 +03491598fc8e79f4e18df927d496d9f4 +034c4e4b8d9c7ba2a4e9f097d24b6fdf +03784a2f2ff8df5294439b1f432a964f +039618d9bd96b3b52c1dab77053d8d12 +03a3613ccc78a61219a12537da8aedbb +03ccd934d1aba6cc68972967fbb1c84f +03d8b7b2d0d2276b740f3b3849cfd075 +03dd39b4c2cb8f2adb0d80e240d8440d +03e67839d0b96479d6cb266983d61733 +03f259ea18b3722b752e547210700c12 +04002fab2286361d05382349ee788d68 +0407b5991607afc75835093808d7b043 +041a4a688e69123b43c086a01df8e950 +04231d9667983c1175b0b4e8450e8424 +0426b809c0ee71d48407bc86461688d9 +042c859090610726ab3582ac5e15d660 +043ad2168ea28efb7f9f49d79b4c4a0b +04415fb67e310e12c009dce6c51dc3b9 +0444bb73f2b040f205563db0291a28af +044938d10e30b48078b7bdf447a3d362 +044c881ad84b16caa21fa8c66ac9e7d4 +045ba5d69740446296c82b9a25881a68 +0462046d393fab245b4ab186d35baa2e +046ebf33f3e984fe73f7d6edc15f8363 +0475d293c89f47d4ec562f29a675d86c +0486b6a3b542d1bb8dd20d89cb20f649 +048c8bda31a20584029d600bdb03109e +0497600d9b01d9e6f46facd4de34ab48 +0498d5bf96e223fb8c61e1c34f630fbe +049ed82a2d72da30a722141d0f81baef +04c2b40a74be9ed9df4867c6625022d2 +04cd75d5a949f99a23be6b15777f0976 +04cef3cf667bfffd95a8ce5f5cf5809e +04d60ef8baf8ff050688867eb1d4223c +04d8b2e5d46f72e3f738c85029a30743 +04eb4b525fbf5237dfe2017eb39bae9e +04fc6f136985829943b6462f75e30d60 +04ff3ec8a217f2de12da66a1e7151f84 +0506fe69ccede76786d998f5754bc9e8 +0514fec1d8561fa99f6682cd956cea62 +051583a5cebf7f3cb40f21cd957a02ce +0529de278cd51b39c61ce77d5285644a +052cb49e1558a7a4684a3a4de233b283 +052fcdb09fcbe155c5134de56805f5d6 +0538452be91845d6eb607e6853450922 +053af8ad4f810d364fe81eb783b0245c +05456fef001c7d1d5cd2a9ced30005bb +055bb73caec7310cca9816158e81ded3 +0562f0ef210db62641e6c3a5ab84765d +056f39edf7f0911f0308600a384d2e51 +05780b76bf806b4fd4116896d8f48582 +057888be1c6bfb83e38fd620600dfc85 +0579fd4d72e5cd5a2386cac329b01d61 +05886a8347326c29ed4bc8fb8857d5a5 +058d6224fa81b3b65b49792cca5fab0d +059a58a3efc914defa5731dd90d1315b +059f75ddf8068edca50a1f7d7fd866f4 +05a26ee0da87f3a1b553a6940f386922 +05a2da37495eb94ef94433d8cd10d482 +05a62f0c3049a893255598445135cbdc +05ac96cc6eabe948e6b2b02b696de3b0 +05b29b05049354dfe7e62b8b65f10044 +05b80f2fa28efc130370be69df29df28 +05b8c9c757b5185ebe4b90896ef07f48 +05bbcc5d55fff89653f62322275556d2 +05bc6c199d63680dac69e46c6cfa8985 +05c04e64497e59be1c0166255ea7c626 +05c1d7a9f998c201d9db7dd13f42201e +05c3fbbb0a0e48861dc8d86f2cea453e +05e5d8399e781facfe050e22e8d8792d +06157a926ba5f19da894a094d07859af +0626eaf550bec1cc626fc157d934492f +0635b188c0c4da59d94c41dd99ca7a93 +063737b561d5c89638a2502805b97fc9 +063ae28ca675936d04fb3450ab1a5231 +0641aaca5b489c4e07d7b3516b12e345 +064375cad00a9d7d8d65c07f2bcccc25 +0649c0ffbd7f88c002999861d015417b +064c55cc7feee2c334421935f7d6122f +0650377023951177ab74fb061b49e881 +0654c8af52ef76dd44f5783048eabff6 +06682f72a7646e98ef380b329136e7d6 +0671daf7f8691b3653bd48efff5b1e50 +0686009fb260e3084dc0c62b1da43114 +068d91c11d5bbc5fd1c171ead29989a5 +0693dc048d00d57e0687a3e3f6240850 +069efe8aea5ad84ebf3b8abf4c9f6a0f +06a21eb8c43b86dca18463996b119740 +06b7c8c2375e35d6f2d1273980c94acb +06ba879aa42abe428207431adf13bd74 +06c45da824b1423cf9177e579e8aa371 +06cd562bfbe200ff0bc5791592706d71 +06cf6a22d53ac832fc2100d1cb398657 +06e036ff28ab76c6da27d0c1938504b5 +06e82e4e0a12827d789b6505c7eae305 +06ee136026fe1a01a2ea021fa692a6a7 +070e0dbc304def63d8e22401ecf25258 +0716a5ef28c3f2c884656be1659f8fe2 +07379e50cf4f6328ba583406a255f8f4 +073b8cf7e769521b1aeafab30bbaf93c +073c27033034534759d3608fa8593628 +073c5cecc19b755981c8810a8a4bc70d +073ee5e4f864943e1bc4645df2e0cb61 +07453faa1739ad42289040a3442b51e6 +074d2fe55f28ff660a9fa4b4f19ba30a +074e8c4e2b64fc902f9b6ab19deb1970 +0752d065cf9e0e5282e8d83e79e04aea +0780456fc90b7c24a15555c3d085c508 +07ba32075ef70814b3fcfcbb4867d698 +07c1252862faff7a560ba64cbc945fe5 +07c7f8a5c1f72e8f6acbc34642f8cd90 +07dac32a0b7844ba3b3d3d7c27861aae +07e9898c85d970341f26cada3dc7e038 +07efd547647c710fb01dedcc51da27a3 +07fcf22c04a6594591771b7911f020e6 +080edffa146708f807ca3692b2a41365 +0816852eeeb3f2af9a081108439b7761 +081b16584446c13addcce3e9d1f916fa +081e7d21ad983251920be48043eab2f1 +082b1d22804a6715b4a883e6c2640500 +083e9670e76cedaaddb33e872d551407 +0856037e55257817b5584f6fed269014 +0857fd5fa210b3346e2f4504e44524b3 +0858edf667769a79e0e33a6c7d62a0bb +08590d829d22df50bcfe18b61c06601a +085f00ef9d574555768a08d59af1c551 +0874d2680361d31d710df9220b974f2e +087c5d27801adc3bd9e40649adbf2677 +088691755fb31753ef31e7d8d27226e2 +0886db5b38967a74906c32c88636cdfc +088ac4fe24e716fe9fe23ffd54edeb6f +089da57ef31b359053f9e3a40eeb8964 +08c492df40c4f05eeb1c2106761d547e +08c67038a1e18729a5599683194b4613 +08d53b818868f80f2da8d3b540d0102d +08ebf21c9a2f3030bc75d7bb46a1cd4f +08f19ecaf6ef6680b1dc27f92af32464 +091ee4c94e5d1cf5a28a2f12ad5f6483 +091efc96706c51c8ecfdcdf83f6869fe +09245c96253c2d30ee9bce75ef370d52 +092fd6c69e2ed55575857f0044068da3 +093db8ab2d8a301d6c05508e373f54b4 +0941973c55ee717306659b43cfe83b8c +0951bdbf10f9fb98833c3d0ae118fe62 +095ddfd947fd2dbee8177a783e66ce95 +0987646fba95bc43b65749baef68f75b +098786d03fd56dc1248e09fb9bc830f1 +098efa2d3c15887cbd9eed76ce1ab9cb +0999fb156c66e3d376cf42c15f11d33c +099eb996b5ce16ad7367ea3944c3505b +09ac2fbc7a911abbf91ca001c556987a +09acf2f27121b56f958105d00f205965 +09b058ad185ff011e3a20590c00f8567 +09b9c96d526f26f2fe2f5adb56402dbe +09c2afca4377a437196cad7193d6f5b6 +09cd70423e95f2d187719c1421a3a3d7 +09e5ab3209c44fad569a32112dcab617 +09e6e972a6c73e1e892d1c8ef3091171 +09e78d266eebd88a159004540ca2c3ac +09ea0bf1dc166473879b9f3218727a8f +09f46f1bb032c3bfc97d51c487b6755a +09fcc6a80e13ffc3b043f0ac80aea760 +0a0399b3675dc35b9bb279c8da1a7265 +0a0debbdb815186dc8169cfbada41e34 +0a11752d83a87d840f25e8b51a2d178a +0a136956595599bb1949a09379cdf413 +0a15f5eeb84b4b8702309e51395d3d26 +0a1a00bb75f34ff6b01e0b184c1155c2 +0a1fb81e42a55f3ceb75f550ef760c73 +0a20b1fb04da074aea0f2dcad034239d +0a24c746c992b19271af76cd3cae2295 +0a2e7c3db9c215c94bd8dfc93409926b +0a359db48fb91d8376ee75a43cb79040 +0a36a53b30f2f2c782092409f90bac51 +0a3edab1955f9bf2cf6f8a808456b89b +0a78d056498c7eea0f4320e649d5ff48 +0a8523bf08686d5b7eb8b1803bfe7797 +0a8fc16892d75b07992463145778c38e +0a98d12f2b51652f9bba1745a2784d4b +0aa35b7d14b65e882600f61e437b6f06 +0aa3a8341a3902600593757af8e06e23 +0aadeae7eb7445ad34de285acf6d2d6c +0ab7dea77ccfef176e6646d663823454 +0ac0bb86cabbda3cfa2262ee69b0d0d3 +0ac7726792b62b1e01f4afe50e9e00ec +0ac7a4e5fa8c3f1df381832dea2d3398 +0ac9e5e0b675a530a841a57020c8a301 +0acd25f5ec7dce979bc73d2269a7b100 +0ade82c164029c91dc317dbee02f3df5 +0b03a42164080f01c97bf2b674b53300 +0b072410df4675df927e1a6ad97654c5 +0b2b96ff8789d05a3a88046b8a51390a +0b3887b23e10663c077e574d70dc4572 +0b53d4dbdfc117a153f90b2653108493 +0b88ab5e5e4beb5f0d6bfabde814f5d2 +0b896f27b24636dc8aefc1e4284ebd68 +0b9d47afa8b9a5406c96e6051f77524a +0bab5c11f42632e5dac953e1e65cf68f +0bada3ae690d36c0906cf65c7c9b57cc +0bbbe4643eec0af0dd5daaf788936066 +0bbdf43319ff02c6aa69902f99c7b81e +0bbf4c7b69ac8832b489b841a3d1eeed +0bc868845ddb2570ab3c64ffa7d72c46 +0bce1060ae3887d59db91e6a1068de77 +0bd04546a88e7eb4fd381cfb86a28aad +0bd9f1e7045eef927619c0dba996a135 +0bdb08b31e86eb8dc4cd9eb614d417ef +0be1e6a9a089c20d8c474e55301ccfe4 +0bebdaa1d87c581d7c6ece3e5df4225e +0bfd34af749c27adac947f93d571b873 +0c0785f06a09700a55bed075347decea +0c0b89e0d7b3d03dde2e35d30379b70c +0c195f38460535c32ae635f05b07b3c2 +0c240f2104816cc81a2e8a552c451fad +0c329e762eb4452c7b5c1c0c95969e51 +0c36597fbee9d8276924ef8b60d3bd0f +0c43113e2ce827531a40002bfffe7000 +0c540fd4c3f6135fdb5748c2542af952 +0c57ba102addaef14ee0f31cac9b814e +0c59116779308b523969f9c60f38cef7 +0c5a0ac679360d87d783e6f6692a32f1 +0c5a2b87ee9e76fb34070deb22ca56f7 +0c6d0daa2993a7e2bae498b307b05311 +0c78354059099d75a38a2b79e489a0ad +0c8ec0b981e9d37e1ed2ef2f83662572 +0c929daca98af6347750bf495a60dfb9 +0c94e55a23249295faf2be591109c653 +0c98ef8152771a13dbffd60082c12824 +0c9afcde50de390826ed9ca131ccc79c +0ca84fa45042f2c53d6a7f01b2f45722 +0cb83b93be5e386b75c94bf0a3b0c791 +0cc98e56dbfa175d32d2f2c86ab5ac7a +0cd531ed0398638ec5b672f90171a7b0 +0cd7fb53fdc91f9fe9e24226d9591129 +0cf08026f11875381b65dbe6d5a8d504 +0cffff55f88b4ed113b31b1d14d78ee5 +0d06d533b07e73a7dcc3c6faa15ce7b9 +0d11c1074cb6709f6076cef1ce1c21a3 +0d21b566cc727e0cbe201c7af44e3871 +0d268ec2b50dc7e9939e94273f4b44c2 +0d2a5c82c8f556a7aa06456050bd9139 +0d2b83e353ddd0789689c06e67c59192 +0d2bcabae44d574c23af271a0153f972 +0d4d79bb960df2bc415104055ecafca9 +0d4e3530a22c76e161f06b95703d681a +0d50083c095fa9240bd162689db458d0 +0d5260b73ad5961fa3d43cecbe6ae09a +0d572aaedf0958ec833cb8677951c0c9 +0d5a2f77e6b4bac4581cd81b7e03df54 +0d62a1e38764641a549b937a8f6fcd03 +0d6e97549d730f5891a5cd8a08a83858 +0d81f9f6a2a286e2fc1ee6c1eedf2c71 +0d8b6832faf30ae38e64f86c8c8f8482 +0d9044491bb6e656edb8020b4e91403b +0da489110407919bfd497854ec110e14 +0da63779a8625de011dc59509caad5f4 +0db1fcc47897cf1733fa99441523f35b +0db927ebd539475fad485e3f472ac105 +0dcb37f6f5135699a5b586e5b0779c6d +0dd1f8c44a87f49f6452dae385cd1641 +0dd3007f70bba1add4098860a8c041b3 +0de278daa7b6cff83a08d566341e46df +0def7f23637843b15e519b1b6314c928 +0df7eafcc4174961a074c5d99f409619 +0e1b1f4776d45bec3aa89cc189e06cf7 +0e1cd8d9b9ff45e05d21586cb75aee0e +0e269273d998269d4edb0589406aaf54 +0e282f9d344d6f200a8b80333697d623 +0e2ebe1083385b93eb0e986744a07e21 +0e300eea17350214e4ae21c703070ad4 +0e3af0c9ed9a042951997c259c11872c +0e3fc2eacbf82e1af792df2041538fcd +0e447367d9433371ffc4da576513ab34 +0e4da88f2053d76d25d536cecbc1c0fb +0e5aea826919e7825dc4be8ce3406b74 +0e63e432982a7d74366109ef4c36e461 +0e95aa22592e39a4a9eeddcc75b464a5 +0eaeefffd5f1f285fe14f687c32c0ed7 +0ec20f22e24ddf94b356cb721c4e434e +0edb28ab8a4a95233031bf59c361f568 +0eefb51f92706ba0067ebe1c722fbf40 +0ef1bf5ef8aca6f79ce0c8d3035b06c5 +0efe8b9abdd93eb2cb9c67495df2c9b4 +0f0e1e237a667992966a7c2ce3671cb2 +0f16a34668f965a2e86546d8d76b3b55 +0f36323f6f11c9de1a614a69d32cefe6 +0f57c3d4a236bfa6fc74da2299286120 +0f59bd9a1543c3e1388267d4366a08c7 +0f6ea6b47e7cdf19cad5daeb73916db1 +0f9b8c755281c59e47664914e71ecc92 +0fa25854d594cc00ffa99c2ab87f76af +0fb7f1503fd5686b5b99843aa40c42e2 +0fbe8c0e3b11435b406d772440ed4cdb +0fe8fba945553e359afa9d096e5c414e +0fec1f0d70f6c1c59f548653a84620e6 +0ff55be5efacabf10aceced60f565bab +1002eca8fc260fb9d58145df3f43433c +1014fa6a55d61bfa2c0d71982ed4efad +10281973d6c27d107a66f209e6699f1c +10283b96d0eb6712c30e2e85ca85df4b +103b3f9ac89cfd5c2d10b8de8e82dd29 +10421b08994fa12737dc48e501f19f83 +10426e904460173df9e6858d2dc975bd +107cc51fec687956f6de600d41b97e6a +1088c85d9148cd2e5e5d612588a878a9 +1099e8bdc23214fc1414a3103efcc690 +109b4b3692b946bb49da10b63933ffe4 +109b95240bbacc03f9438d0e41be32f2 +109d830d0f315b0effdbe44a0eb8661a +10a88fb6a0a6acf23526d568d8e544d0 +10ad7b9fce683dd5fb69ca3f56e2fcef +10af6dffc1e35ecfc2ed1defc69613f2 +10b3038cfeff4614276af8e0b79aed71 +10b572f132a43002bbcb28437eeec4af +10bd8e62f22440a57193dd4a9af7e213 +10c76b9a287189b6f7f49c9403cf7da2 +10cbad6fda33c937aaf9b272cf7330ab +10cd6901f05518821513d9cb0573a9c0 +10ceaf9c37f6cb7a0f813fbad653bdca +10d9fc73cff6f446194faa83a1d7f677 +10dc7d27e9e08495e2090bf93b6cb0c8 +11022f5b9b26fc87b59494d4958ddb71 +11053815567a676b7ed80bd86f423610 +111a19bac9f27d29f267cd7cb14be35e +111ce02ead24d0b2f32c62b1cd8a67a7 +112b426b2f99dd1acd9cfd65e100f206 +112c146822b9e7f45133d9d90759d9f9 +11348b4bbb9d4937e2ecab7e0c5c4eb0 +1136781868c842c6e93f6cc3e2170c4b +114e4dceaca30479cf66ee5c0092404f +1158bf2b75d1645891718116970f49ae +1174656c1db7a2a0fa1b74fa5de9c334 +1174faa7498c4f62eb63f14981874b98 +118539d64842a61494d4367bb8620723 +118e57b1eecd61e54b502055d82aa57f +119a813e67f26dfdcce2a90ab1a82936 +11aa5b8ab803fce5c60dc3ccd1e2233d +11ab04c11415e4b2e6c3f731b9934e35 +11b77e88cbe690a2a35b458ee228428c +11c757bdec2ba2067edf2512536899f8 +11cf2f72b62397bf4bdb316fde20ecf5 +11d1344768de2b8eef15e4d76473ae3a +11d6955110fede2e50a8d17477a29186 +11f24befbd5f261257a38bc720be5c64 +12282011bc0b0d0980e06c17930ee673 +1245ccbfa33640463fcf73a09ff2ef85 +1250110d52b479642270e9b96cc3719f +1250f1f47af279f77cc88711f232d51d +125914fa92f61e7fa1ad39b2f9cf7a73 +125a99594142a469803ba530f5f2c9a3 +125c85f2830788b73591c07311c4dd31 +12615ff86cf4f303236df4f3e987b823 +12739dfd85dd62c56ec69b7da7c08815 +127dddc26b05761562db3079f3225230 +12864a3409ceff5626c706ecd740c4d0 +128c8aa67fec5b0512f1f86c9fd47986 +12a1a516bb00f914434a47a7069c0d11 +12a83a97c270976c9cfe90d0dbd70a39 +12b7ee7e58a38d9aeeeb8d7abd43eb67 +12bb0d8720549a99dfd005612ca42198 +12c1160e8172e35502a287be87a98918 +12c2608b018dd101880bb1fcb6969475 +12c53811edb28a822e6bbd2554180704 +12cd212164f314135b9233364d07e17b +12d522c72a28782050632e061a78f587 +12e08b8a9f5ddc99507cabe1f269685a +12f0f6355a50f657613219222902f2e7 +13026a5270839b462b47d08d75a0b248 +13137cc41d6b50432fd5c4347d47c7a2 +1314c13d20e26b2e5c4d24d1a3f2e8da +1330fe4aa0468941b94cfb81ee9f7032 +13315c11e13b0f95faef99397fd1acb8 +1338d01273275a43252d238d2887273a +134ea56dd9b727a1e1264b725aeca4de +13580aace3d2c307ad3a2e3f297c8941 +137f526e0093465a553b03aa5b02e4ef +138195d0b2945584aa0ef078a6b86781 +13841974c00e7613196481ad28bad5d5 +138fd9fd7142c26847f1ad3b5020047d +13a60e2145e4eb19b6e40907ad3fdec0 +13c53e12d71be20edbf5f8c235d6f71c +13d0da5edfe6158b69daabc7e1eb1fee +13d469c2b60c24143c36cd5b55517100 +13d52e4249286c44609d69de72dffb15 +13f397853b1a9e033b99feecdd675673 +13f9d624f7315f20b3b89d4995c634c6 +13ff67f00b39d2c6d6c0bb004a5e9f3b +1409b817ea4ebe62fc4168e16665702d +141a32d31169a9c10a48977418a032b2 +143346f039ae263215bf269130836aec +143931e56be4729d6191ae262e1e1cbc +1439469439fc333a10ca53b9719f0b23 +144c546bee00f794655ef78e3cffd7c6 +1458fe648145410be2d13af603ad53fb +1459ccf0940e63051d5a875a88acfaaf +145ea5084222e1e1b6211ebe581da271 +145efcaa459d17dbbb723f1eb818b243 +14698a367b1151dbaf03036daf671e2b +146dc5ff7a16eebf5b9af81162706e0a +1473fd60ef3f12f2a7fc20fc0af0f63b +147f3d282c0dc83b6e70e0fa5d21ea1c +148fbd95ba0e843427802538cc7cc323 +14a5c63ffee2ada49ce3a781f2822541 +14aa9c414971ab876434ca4af68d7c63 +14be1a9a21b479f81153a5ebe55ead45 +14c4bce5db9f6d37f1def18088beca8c +14c8efd7d7859cd0ea2ec34082331d96 +14e241f6e41884c70a9c17408344c8cb +14e5886072f9238e903754fcfc00aca3 +14f115e53f67d70792692b584e44b36d +150eb2e1f0b8956f53d8f26f009b795a +1521144eff30433faa46aaf7d9a016a5 +1527139564ea4d6430d62dd5845627a8 +15295eee0f3e842b25683743f473b7e9 +15303d9c703939433eb54fefaab9b238 +154475b585a0a313d3b6b5684a046686 +1547826171411b5ee6ccb0fffe171ff4 +154902df0c31ba1d1c454b2023e94b5c +1551d724333954977f67f319da74c62e +15669324d7cb7e93d12076ba9714cf84 +15689bfb638653cc51bc27910f624221 +1569f748f5a05cd37279588dcad7a883 +15736f17dc2a6751ea2d9a4cf60e3ac3 +1589a1467c3bcb79fa3314c25887853c +15991449a983e19e172f213904113587 +15a51e823c43476e8e84812a408c6477 +15b00f2aef27967de0fb60c62e6fe7c4 +15bc40da54f2245ba483ff26388e1f4c +15d8b903b4e10b4c2f1a602a9545a422 +15de31aec96db3daa52a779ff5e4de8d +15e148dd2fc92ae651f4013c64f55c16 +15e5f16c0c93542a70025a41ea873b71 +15f5128808d973c5a7ea807d2f08db6d +15fceaed0f2f9680d8f1cd8b81fecde8 +16047ee54aca465378dad944e16db886 +1624d71667e9998e0d7c7ce3139ba23b +162546480799de6f54c7152f127f4f36 +162b1976403c73698435594f5dbbb7de +164b075275b5ba68b161bacd6275472c +165ef3f31018d0ba4fba8e5e5589a4d1 +1660ed1d684f7dd3a9f0245c4a735f87 +16772518257267a08b53a0de2f0157d2 +169264aa32aea0669b395a42b9884444 +1698a8194d0cf08351507063bad32475 +16a1951aab49228b24f4475065b9733c +16bd68dd5ecfba8790f325645212c5a2 +16ca74dc848a1e470a1cd29d34a9e231 +16e873f5f3a3545e9d8bbd968b9709fa +16ed20ede6fc0b6a68497673e9649ae3 +1701f3f710255de625552cff4b840351 +170bc678a56c6592b01f1b28b1893435 +172e132f1128bf55414bf97ca6ee83a9 +172e8328388287a2b4404333fe2b115e +1731768c39b505929fc872e36d242696 +173710887db0779639cf6c86a7c17620 +173cf10c3cb7c02abd8eea756eaee1d9 +17429a00971580e2ec133e39f0d17fb6 +17462cd012f2bf52b200638301bb987c +1746d24022b858cb1ba0e65443f77331 +1753c922be9ff9c8093f3a7ed57b9fff +175a30b08c4da0006841e571bb442d7b +175f2f5e772e64f2292e810b473fb43f +177167391acc8f608ed2eb4570bb0804 +1772aee51d39e2f5fdc939c021b0a269 +17899704a8bf325ddad712345ed8f398 +178f022bf3a22260a1551ef4b81e1192 +179697409e0ae3752e7c426e97652db6 +17a2aebbc507b125401c44bff2f2f158 +17af06aebce5507b2ea85ff0ee50118d +17c7db2d5a1f18be9600920ac4f2f1c0 +17cb433e616a01c5628fcbdc93d49ac5 +17cf81d307520aaf9991ca63d945c0a5 +17cfe05bff5b28c6ddfa6894a3ae7165 +17db53e7862090a8d37d7786b6cd29a2 +17dc41724d23c23136095e5e68c642e0 +17dc5b31cfab9759d8ab3bf33b401484 +17df90164abf468159fce6097c199e23 +17e1a9143e600adccde43fd60f114d73 +17e697f2fb552bece83b602ae7456a65 +17e97e0cb1e766c3801d15125986c582 +17eacea24d06d8a56e4c3e532d494769 +17febff63377a529953274c176981f1e +1809bd4881b896ddc9e2e6b3258eb82d +181c45da701a343d1f265b1bc5e69b35 +181dfd1bd9e9b579dfe1fc85d0e14e50 +1826ed983db07aecd3557c1676d4b76a +18289d21956c825058b9f57c554b43ac +183403b7bbaf64bbf445d6f1f5b5415e +183a3d4ab322063003393fefe5a6717e +1862c1a2426604a15ae76227582610f1 +1865a8576d5ab81246bea0712ddefb7c +18741faaed396d1863b95f36b712646f +187655e4c9aff47ec2888f0cc2942efe +187fc6f128557c95ff89cf7a0f4d1098 +188b372e1a830965cde4d9c7b160fd0c +189578f458a839c401959959deaa5d6d +189b075b72b0c2631cb45b075631f64a +189c92550ac1ff30628fc8c3153ae787 +18badca1e7e67bd748168bf1f9195d19 +18c368fab3579a712ac28947d1406d50 +18c96baad185643e5afe2d089012a2e4 +18d534597119cad8a1e3a9b811b75be7 +18eb177aff94af8daa33da97d1f385b5 +18f76059c324aa3c4658c86378579494 +18fd1452607765528b8ebe8d708dc91d +19133962bccf57934b741ce6ca125ccd +1921106771e7fef885b7e5581ac5caec +192545b8231e533c2bce80e9818f7b39 +192a94022e5551d4fa1a843fb2dfdbd5 +193c69689d2c966e47ad070b46247b1b +194d13e1e097dd9fd51de8c8314d19b5 +196f064965eac9516e23bf6c72c165c5 +196f6e02c6dff0df44876cf0bd5b94f7 +1975f9e7689d7f01e94e10e7cd715e38 +1977f97796f4a30798cfab82f87f6b7f +197b1b1102b51b36685404b315da05df +1993d65bfeec6ffbdfcc2737dab44253 +19a5d141912af50eb0af192c152c5390 +19ac5d33941019b03bae7e619d7ed5d4 +19af261b7786d923baff4d39a11d6763 +19b48bbf2e8c3d152ef3345a647ff852 +19ce5752403bdde5066269f487a225ab +19d9d4aa970fdeca8ef212781f40f048 +19db88f51ba93a52d5ca046d8ebd26d6 +19db89bc20b38bc5c6b00cd9543844a3 +19e66eecbdac8b2aa42c92773468b75b +19ebb3b31f9fd40cd41ce78faad6e90c +19ee26d6c2ebc57f039b14aca0713f29 +19eebdf95f3227e03721227a16aca24c +1a1345c8defc36263192f4a358752562 +1a1a4fbd9b4489eb93c8d63ea472e6e9 +1a24b1f732c42064678df8095bd44b7c +1a3434380d8100ef01e5028b1c0fa962 +1a38b989543755281a984a578e4ae331 +1a3f3c398b992fa37b45c35ce56f6526 +1a43e1585f549ecc9e7e4efac3d41bb3 +1a5fe2d5f3f73539279172dae544e658 +1a73d63b39c065c5bb1812bc8ca53908 +1a7e4af2fd2ca352b41103e6ad40ca89 +1a8ee6e01782814b53b3a8d7fe5be39a +1a9a87be944f928e7f9666c5cd79d048 +1aa4e492b5360d606fb74ac6b72bf206 +1aa6c4a456c8382f9086fb75da00ad80 +1ab60051e758c0f557faade47adabaa3 +1ac99649e82f615588d878dbec1caec6 +1ae667880d82b1bc187b27a24421b913 +1af68a046b19d4246263b3fbfee10e08 +1b0229183eeec409e801c85dfee8139c +1b0f4e1d0503de834f1c181e590e2a9f +1b13410f47ad55c13c9f1438d3281abc +1b143fd693129e3965839cb64a711c0e +1b2534daa6175562bd9d70239c2d2ecb +1b276a15b4970818603302883216c93c +1b2aa3d38b143a1b71d7f118379917be +1b2e7c907e15fd7ebcddbca96afaa7cc +1b42c81e21bddbf50922609b97662d55 +1b44b141104ef857480960a4f7b30822 +1b4b466c756ee41d42246e518965a71c +1b5714ade488579312cdf58903867328 +1b603c9b27a2cfe90d1e8cf03cfef3c6 +1b699fab73d6b6dd9b71e8591e52320d +1b6d9a694d22faa34b18e225cdd3ddf8 +1b79987122f79b04ab9874704fef1758 +1b9317ac75ec4c350fd1c552903a78e2 +1b99b474d34ea25803cfa888d97ed54b +1ba73220ddf9cde9b1dfe644b945a181 +1bb4cbcafbcd08ffe888aa97951d8907 +1bb73049afc0c1133c560daaf85c44b1 +1bc0b88dbfbe5f5b9bf51f6a4b28f926 +1bca5953471feebc97347615041bc798 +1bce895640ed8a0994dfc2ec2dcae3d2 +1bd88424d0c28d66100cab12fca28e06 +1be29758298794a95c52b144308da1e6 +1bec5173265f107640bf9dff69308297 +1c169d299c94da7434970b7ff572c2e8 +1c1b50894770ebd31f19e5f5bdfa4c07 +1c220dcda9221e9a51b1aaf09ff5ef67 +1c348bc20cbc66ea913f0411e951cb40 +1c3642b109890eceda4ba6a922dcd91b +1c41a187f53ed9d44cccad68b3d613be +1c64162311ef57a4404556b5756723d0 +1c6b9e583b99dd02a6c9ce5f93ed32e8 +1c75a689347c8fc045300eb9382aa781 +1c7d81e2bef7210bfb38a50b25e9e0c0 +1c89e366830814b0bed3f15d005f8469 +1c8f19ba41b153a0b3d6fac48d4e5f5e +1c9226b6bf0c4582145076921237d17e +1ca945fb93d0e7902760b159d283ef30 +1cba4a1a29c0ae069c3e4dbd5b73d6a4 +1cd32dcb4e9fa9876128481e39a71d87 +1cd4faa133ad71273f376684c5589a0f +1cd876ff6e9cd9b5e9383253e35db520 +1cd9c2a250eaf72eb36a27f7d7d96b9f +1cdb2398856e6469f386c0380f20f41f +1cdc977609f0f3ff9f71a5d99a2736ac +1cdd213f621cd59b11c7b1fe9c46cf7a +1cdf78b3420434ba15875b761f1a7cd8 +1d052197b4ca07abf42389c0232be782 +1d0ee0e12b877207cb79827d479100db +1d12b2a04795339cbb08bbde86b5cf09 +1d1b2f08257d672ec2feb0fa6bd367d7 +1d413182a152dd836f8db38b2351f501 +1d473f3807df3c99fd357d524ba282a9 +1d4adfb0be0a4f5f94edb4d33ae07595 +1d4c4d6a99f0feb22b31322134b08bbe +1d4edc9972d393bfa517b4bf88c9b9a3 +1d76154309a3243c1e7e0bd543603656 +1d781281ea5d6b409eef8efe55ca33cb +1d824f57ae1b0a0831b826efa090558d +1d95c0d7ff431e0a1c1762b354bdc807 +1db212c9c76a7bafb8cb0d8a79f75380 +1db6c80f47b7d02aa48f30c792d915d5 +1dbbce0ee2606e96c711e2f82fc1fec7 +1dbc6453f99f05a653fdb33993d669a2 +1dc2b29cd42d51fa04551baac1ecb82d +1dca20e382b4b72e4d8ae172eb3dd2c6 +1dcb5b8a576fa38747a1027644dcf61e +1dcbf121b222e0311f19d95441553ddd +1de622d341c04c40acdbbfa419a0765d +1de917cae39275be2246855f1207a520 +1df11eb1000ab7dac68ef94c3f25dc09 +1df8522ef34114fe4fa9cfe7ae94be70 +1e1de788d51ad63a59c158d6af90982b +1e29ee23be3e401080e81baaafa12a3b +1e2c5cda9fb10e29a17a25bf88490ead +1e2de98430f5d1f4a371fea19a646418 +1e316eb44f2fdcc5df3f23a045a34b56 +1e5625f59b42c66b7e1e2179705e5cb1 +1e737f6e6eee315a5a681938e4b56aeb +1e8472b40da1807decdf45cfd4e371df +1e8f20c565f863f03d18f45ab46628fe +1e8f2cdd222c8b8c7263da5689e406f4 +1eb5bf29b515d28b0f2aa8ef58dfd939 +1ebb74fae2c1b71e3b592bdf73818fed +1ebfd6a02c589a35d682d7ccc0239bc6 +1ec61a55ac7f46b820dfa535b35d9c26 +1eed7b937561e1568ca62fc1f5eba166 +1ef082ef0bf3b6a514f0f63a772b331b +1ef5c1309d2e6256ee7d853cb3ff73f8 +1f02e8d3a56faf6eeb13b222538276ed +1f17e8b0e6d327e9f0ffb8193f386442 +1f2992879f26b5a64bb3647c19ef81ea +1f31529d646c2b6e0375786db585d7db +1f3c202a078a3b751bdf9eedbe0432e5 +1f3ed2a52405044a953ffb4d1cab199f +1f4000dec909625d1040300f90d7d864 +1f41da395b2605b96cc2011a837a12ea +1f46d84f25b6c352f1b1be86a0df096a +1f5d962cc65a8b0e7955a40099670ea3 +1f5f0d54ff7b622589c1a58627ae5ead +1f7ad41c9273e49ee4dfc370b25a50ff +1f8273dfeb18d1db168cabc6707492e4 +1facb3351b90385be5f344a976498ebe +1fbacffd2d4a7a4c23a86323ec85fadd +1fc6361dc8e6879e2ab1679f4109eaad +1fd4371b2dd1438b4a4fead9cf5bb565 +1fd69ca02c2464855f2a412d3634aade +1fe276111f122a140868d24b902acf5e +1ffe86d912096472b6ce8de8538c4330 +2013a23aa96e8c11329da164cdbd5411 +20195c38e5993a36093751b870bf6739 +2022b2e880aff85fb7a59d9ccbb41028 +2041b49606743298828a1e556832dee5 +2041fdab041832ea1ef025da23161480 +2044a645b9fe9627d63f2452a8d665a7 +20454a52fe8183221bd8e2d506878631 +204ba205b9b7db956f5c8569692d410b +204bff96d8299adfa6e49f381173bb49 +205b79f7ce24e7580e935f8f78a44bbc +205eab4e698c15c2d57bb56b689b4dff +205ec315527fd10932fcc55391d71ccd +205f89f54d0abb3350f03c1111be7272 +206aed5f183e4ddad99e6e3f029a5f68 +20772df8add5ccee39cf54a59999a0e2 +2087ab63ffd979b4160c8613a0d2ab31 +209087cf483d6d612072d451645e2aa6 +209497bfbe075bf4d2c79d2c0cdf012d +20a29048759c16322ade5df741c8d202 +20afee67e39b12277aa1ae3e013a1d6a +20b2124d376213e5eab0900ba5bff7bd +20b8254ea9b7fedfaf24312ecbd64f8c +20ca9821994e06e3e4c2af0e87cb56f1 +20d0ec49b6213613e65f167381957c89 +20db57ba79b26e06fb49692e539fcc58 +20df000dadab26db3542290820ee41e0 +20dfd402dd648312fd573aa2eb86e535 +20e15a81713575b1e90dca8965203275 +20f2ec78044b448f483ece4c07622a34 +20fa6d62a6c9eb3ae445eb207c63069d +20fb01914c7e00e703a427ccf9a826ca +20fbefe689aa4cdc52ccffbf45a2e6f9 +21018b8a542cee17e9c41a46fc0429ee +21112136e343ebf16d5b424b2eb9e88e +2112118263146683a195c374389510f7 +211d8de8cba080fb2549d0ed885b37f2 +213239ed6e523b315168ed01c97626c6 +21431901557b043316a100a243e6896b +2147ddfc98cf2794ba4c182f2480b9ca +214ea87941d5f320940878ab721b3297 +21524900510e5035a3a29fc285232dcc +217b907b1548ac021bc20ca45fb96027 +2182527bbb8309e44a9636f8c7ea17a3 +2183195ac4e14c0209d4ce1ab6281afa +219c203ce45254c93a4076f0ad27e427 +21a65156e194d1e8f5765a56f03a755e +21aee8d6f4dd044c1067246a909f35dd +21bec8e5d05c092bd62d79255af80780 +21bec9418c2a2246d6d45b026dfaaa62 +21d539ec21674a90cf534080823fd3fa +21dbc4fdf62d9fbca89222a6a36f6cc5 +21ead127c1a57e0407192e329b9070c7 +21ed6b52408982b0fbbce816ced54cb3 +21f33018a749cbefd0a96c9ef5efda77 +21fd2e80c902f3b10d97b2af86f704c7 +22016f1b27089b55a7dbb09b0be5a925 +220198c42c4162dd94c8b8d83f486d7f +2219fd020aa87769bfb5727f77ec1acb +221b3478cf032776eddd3105e8dacbaa +222345ece18d6bb1f35043081dbdd4c6 +224a03bf10ec4c8cfea9e5e4af3d20f4 +224bd3972394c7bd31c8ba29954d1ca2 +2256b0de24c05bafc71046d51af2e329 +22620b814be687b1e7926fae7b26c7be +226fd335a820bcb6cfc052c56def4926 +22704931e060245b98c2836bb88e75f7 +227746235bbb579ae08354e92552e1d1 +227eaf6a9d0013483a54b29b068d38be +22842959354614e462884498a1735bee +228730ca163df948ad72b1c76f67fa31 +22948f8db53f68cc7498595f134b7b7b +229f6dd4711f34908fc846d56443f239 +229f8b11e6dc0f99a63bac795290d6f4 +22a7b860992dd7c53e841656a191e23b +22aa786000e18c86e273a559ab2e26a8 +22ab27a0a8f4f0f0765acfd817f2c5ef +22b4b4aae10bf00b52cfbcc04073811e +22cea757b168d046397dc18a1698b7b2 +22d082a41140fc9d4b5a69fd4cf3a4c5 +22d8a61a35428aabf69f1d9879e23073 +22db59a96367dcd5e0e4e8143706e820 +22eaa0aa9f38745c4c8c4dbf73331b23 +22f7b686e31349551f64a6d1240de0bb +22fcdf570b21870bf14c8f544a670c8e +2310cb13f60f88863ba5ca54fa286917 +2314a8fbbf292e6dfa316126818f5664 +23177593cc93a3151b80c464ac668353 +2318aa3a5946aaad391c463163cf9734 +231c69dbb95e4090ffa46d8f160a69e5 +23301e1a5a564b81a2c48bd3391025d5 +234543c2a8699eff06d49e5c8a6c18fd +2345eb3b20dbd531daa4fc3238d776a4 +23524a12416808052367aff96a357478 +238db542ff17e1bd9652b8627a83bbfa +2394d2744570968aa4b968062c0db5c4 +23a3b27a3136f682f4e878b528697309 +23a92c83798ddf4abff1f9fe7ec6e193 +23b2190158d51677125a29a357c0741f +23b5ffdddd17daf5e404adb4b612c9f2 +23bd2003e39fde6085620d45329d9ac0 +23ce6de4b9d459869c9184321a0717aa +23d241ee5008678208fd1a750ad23d4d +23d536556dd5e77f4cbebaf35ead6dea +23df8e6b5f466c1f9f8f2afade71a5d2 +23ec7b17fd9e4d15f99aa7cb7ac7bbd2 +23f0fe5426f6b5653a5ac3781c4d3dea +23f679479e27d2b2ed8ce8c1310f247a +23fdd7c50d109349f5a9bb2c6de76d64 +240cac9348758c773ec1048e50560c34 +241f8aec1420a8250905cb8c7afe254c +242278fe5045d7915861bb086f94d48a +242640d81239f0d12dcd8be04ffecf55 +242c5999b387cd95e7e00f061c6a2166 +242deba0df4f15494ae2187d68553733 +243152e3136542f53a1848da2fe13fa1 +243eaa3763a69ddbb78ff1f2bde807d5 +24451efb8375de1725c7c04c8ff8fdfd +2446a41a803fca9e7211009f752fd607 +244a6f18c7c44100ac56d2b9108b4c7c +246e22ee5cd5c0ebfa64079708923e65 +2476faa4deca4bba6dc7fa26cde3e681 +24850469a8f806a4b1d7023e87c155b3 +2485bf904707f58b822a56a23f8493c4 +2487478e5cdaefc8e2498042edcdc4ec +24a93b31ce11d22ec36aa66f68e67338 +24aeaf0cb4a2ebfe06a8035256185e4b +24b5eedcf9d8bc3ba4dd9244572df08a +24befe9e9689eca251e201dac338c4e1 +24d40f5a72cc9235f7317cb7a5e06f93 +24da0233c203ccec245a5b3433f64b84 +24e02eb7e6f6b73fee7b717bce8db74e +24e6b60c751210e6de61adb09295845a +24f10397ea56516f629db2baef214b37 +24fd2cd6a319439ea2a21b85dc97f05d +25090375c19f44a7c262984f88cc239a +251388cc15fc6119e800949e1b96483a +25243ebaffe14aee539d4d6309c6caaf +2526fa0a777446c4a9826e26554541f5 +2528b49264f0e5e487eab658ac4b074c +254cfc646c693b04324faf77b190ef37 +254d3f6b90b40dda0ccec46bca0604f5 +2554e0b1eb9e9625ef8e3eead229690d +255616f6082b302f4f2981061f54bfc0 +255ad30b9028a823d33f8d0f1e629c74 +2577e73342ab0dad4c8bb65fdf8e5d3f +257d85ca851569ddc1139a9122ca7c62 +257fd046e7f718dcb6427c6a480d5d2e +25884cd0db47acf100ceff6f41929025 +25a43c02762c554a2a8ed51f15760de2 +25a5137dba121e25fbb8b0552b6f995a +25b8cab80cb1b3d6069c7a44dfbf00af +25b935330d36d767644384e844189e28 +25e0fffca6a2561033731ddd9739e07a +25f7d201a69dd3267feadd92b3ce832a +25f96fc0c144583a54a19a0c519852d1 +25fbc7cd08280acb0daf5f05cc7a0b1d +2610385de6cb5ead856a7fe71643dc0e +26176ff631ad885c84b3619c6316252d +261e47df40761054a5453d9ba9e9ad25 +2622c4dbf9f5efdb09d9d1e604b67050 +2625d1e0fad703ab96573998a88fa55a +26407aecbf4d6957ed61ff29ee61a830 +26444ce28dca3e54136cb88689c7a784 +2650ee58d58d4930fcfec04e17f7c432 +26705c965faf1f16de3db0eed5224751 +2681b1d3dc41f32f274de0988442a660 +269abffe3d730a5ddc58c1ebf1b35a4c +269bf3e48f6a61f311daaa7598612b8b +26a0d30d536342ba0528332c52bdee52 +26a569c877a2bd1e04a9ac811bf74a66 +26b2b54880180a04f8b723f317697fe1 +26bfb87e0ed4d3e7248c0261f2d5f803 +26c6375565f47fdce69ffc3cd8199153 +26d975b26c0a3a351eb945e4c5208a61 +26df25990ed7e803055d2b9f7d54e74c +26f40576a709d8f1928dea36a4b5a590 +26fec728b61083681308b2de3a48cb0e +270c9f51914f3c309c3ab53d4babdb49 +272024b3992ca4ee8131cd3815a1abdc +2736beefee1e89cbcecf1de5be0bcb4d +273ea88e2ea2309f3c4fed7622fd16d6 +27498ed7931f4ca3771c90ed037fb3ea +274c8dfeedf12c92e0e06a8815b8f9d5 +275c05abe4bce10ee3fdafbd48d2f93a +276a946aa86b894a2637d99691452483 +276dca1743b865306b7625caee31a60a +2775fdac6a43d4de0be874805911470f +277f774b7daa0de974effd2b8d374d5b +278ad3b6f738eac030378730b925cabf +278ca6f1da50b2c6d9fbf4ba552c6648 +279857f5fb3bdeb1d7599e6e2e5534cd +27b6ff08dc77de426328ad7b4e713029 +27b797965af03466041487f2a455fe52 +27baae560b5a638c6dbc9fd7b665c62f +27d285ce95c8416bc9bfb1289c9de244 +27e03722286f5580380ce55baa09b80c +27ebddd36e81cf387a65914abaa48408 +27f1061e86571c1219006b1688928ec9 +27f167e88d032a2636da4fd311673c9a +27f30d35697979c117b4ca50232fe24c +27fca91a45de3cab0becf4f259f6702a +28037cb525c153f4d7f6e9b1a4455450 +2803ad448aea896440bcc080a04f3053 +280932921893938d646351131c5c15c0 +28101376f5db31db8a67ad64d821575a +28126252cad27e6ee80e5eb000f927e6 +2815aa7a33656e1309e1f4bbd97628f9 +281606030df299846adb6d072d952607 +281a5da5628058b58c25aa26534975e7 +281d21fe9ef3989f06f6d407f62474df +2826f09da3f472241259a3ceaf7419d6 +282ecdcb02f57bb045aa2d79857de128 +282fdd5f9e90f0aa30ebd9288c1e0142 +2832480f6ed81a7f32af190350587f7a +2839e9cc221de31f3e8aba6522fb145b +28439298e1c7b163ce59966203693c58 +2845b6ea3b4b6070f250844dc13f925b +2858ca7cac829bbfd19154a6603ccb3c +285ac06698aebaccabfccf8561157f85 +2870bf41d2f4caaa5db28ef6a26e3b55 +288584ecbbc68697c983a1995a22dbf0 +28868678e8c59e27d13bad9dba937927 +288a4370f7a22477ea491e7c1c7dbe78 +28943cb27286d999fe7dd798b9a190da +289bb2b1777a61731f4f146e39868804 +28a48ab1007233695ef760b843c2e132 +28b281009fe8d24da70a7fa0cdcc0939 +28d125337c796582b662bde3281dac3d +28d6df59832d291d751aab5249d57e2b +28d77e3d2bed28c4899bb09a15ec2246 +28da5cf7d2299a80bbeee96cac550fdd +28e07634d04e5a12f7eb504f8b163c58 +28e21bc29f7289aa129a3713aa7c0c46 +28e251ccb0c5e782f3688d3ecc1c71f7 +28e2e3dea44bceb15a588b620ee9e49c +28ff36065c5154f9db1b8d357b2ee0ed +2905e8fbedeca28f892ce0c0fd06afc0 +290d4cd6fe8b924f461135bc3c7dba98 +29102e0effe4d9ee1763e0ad30fe6821 +29179fdc68053a75a909ec35666501a4 +292bf80ff902f18971347f20dca526f9 +292ecc1cf11dc341e073cbf61ec11ab5 +292f661124fda6feab3ab0d5583cd58d +29399e6bce8db4078705d63c84472c3c +293cf3fbc17fe41c2bb5a89fc9378852 +294f8edb412ff5d4869ce752bee78c94 +29537592e198c81a467f368082a20227 +295e08caa4dfc701d11b46bcfaa17fbe +2962b6173330fe90d182ed6ed6b68242 +2963142e97770750a048bd1fcefde4a7 +2965e3c1b71a310262b9523b09ab62e7 +29699ca97de192eb28a91dcdcaeb60c6 +297dfb32f0615280abeb0c12a45a1ac3 +2999f54a4f0e3a65449d23691bafaf3f +29dd5e07ee9dca6f0d72275980dad541 +29debba4b6db24a77ee98a4dd4338950 +29e14b026edd5c88a8024a4be82bd9c6 +29e4516ca8b1abbfb342a547bd6805a4 +2a12c9cad6d0b441160fe28429beb23c +2a13709ae5d78f5a372cdcb1a08f519e +2a2b13083db228484af2e2af9b8bcccd +2a3525bcc8096276698ce393bb672e29 +2a3c0fdb7e33861619cb60f6af048012 +2a3f3b0ee557c7ad76368aebd2b1f7b7 +2a43edc4db3106b998441a3271230f9c +2a59f9334b421ec7b588d248df74d8e8 +2a5d2be59e3eef54b8d5a3bafbb108a9 +2a60f585b58b19a942fc1e3e93a86291 +2a6ab281e31981a12495ddf0f70fd827 +2a6cd7b890f7c04928aed95179ede938 +2a7203e5497415fe6c43ba76d5c0de9d +2a7b974333b86e7fcc8913b0a8f4f622 +2a7da0156dc72c5b0385bdb1db987d52 +2a81e7f780498d118ce055c8ff124b30 +2a851b8a2c31a78be4105ec83d69d654 +2a88ff8239ee9f55b3290ba30df10bf1 +2aa580e2916025dc3a2d9c7638ab0d36 +2aa872801c210e977b8bcf8006a7dcbe +2aad754a15618d4ee6d29a0cf1a80a27 +2aaf52ed1c7c2f4139c407829a9f3d9b +2aba7096956ba527e0b6377daafc4dfb +2ac2bf298c2f395a55cdd18935e16182 +2ac67de0770853edd513f3fc2a3cc42d +2ac93bdbeea455431f18e78b9eb8c194 +2ace21b76104a7d430bb54eb41785e12 +2ae6aabbbb84b2d6b9ed8c29e01538fd +2afe3bb80ef6f3ded3ddad7a6d97f275 +2b06697e1ea3a72aaaaf391cdeb5e638 +2b11b67272f23ed98ed825e28fda4bd1 +2b2d4dea4cd376c1c49e6c39cd1926a4 +2b2e49440fcd69560cc55d999f2a2d72 +2b36657912a1b805f131dbdeb41746e5 +2b3bd1159eb7ac16bd9ddf2debfcc12e +2b3c02c98a73a3574e0d21639f7788f7 +2b3ec4cb21fc58b1175012c8414c6c64 +2b448968f31e52773ded570aa106d9ce +2b49bdb67e969ae4dadb9cf35e99779a +2b5f721e313933376095e5d949872b5e +2b60a9c471f567a7cbfd66002c6596ff +2b72a6c36bb0502a269888e19765d459 +2b942ad5912f2b65b782ce5e3cf690b5 +2b9e16619af55e6893b8bd6b752c151a +2ba2641c43b0299912009a34e5cec53e +2ba55ab4c9d3dfdab2058dfd4820037a +2bbc9fba7a9120a5fc67041df433410e +2bc0c24647adcec838f53ae5c7ba2342 +2bc7b829e6c77811aaf1eb9694ab4a9d +2bca3ae24706399b3a350855acb4c0fc +2bd36e16c1b91d169833b963c13cb62e +2bd73a8c52d13a2587752ff3526463cb +2bf0e514ed439bb3a3399c27b5708720 +2c114fba86b2008aa8b0cfa14e543408 +2c18ccd578e91f9ab7af1b65a7830f17 +2c3df67162bed1f8b9f217d23d006977 +2c3e308ed73529280dfbc4cae6fb70c3 +2c4fe9945c7077257b79965b2a4373d5 +2c56f6e094c89a8731d3baa9f8c9d0a6 +2c5be3740efabf1a3de7221cd8334d37 +2c5de3b22c4078205e8d3782e4cea72d +2c69bf4cba07b8501c20d095dbfaabf4 +2c6b9600b5b6461b79d07c9330ad81d4 +2c8523664bda253e7d263b99777f0d90 +2c85bcb57a6b9470457d8cd282cde5c1 +2c8e884e1bde87e70d450f6360822906 +2cb8a1b006e2df91eb588ce71db3ccee +2cbe377b62214552a4199a83f7662e23 +2cd03d1e9669932ebac133cc158850cf +2ce7c3536a213cc2fff4c5414f92ac0f +2cf398281e5441ec10dbedd15b76d17d +2cfa2287649975c0ab5621a77483bc8e +2cfd574d6868da8a6d268f05ee13cc24 +2d1552ce6f58e0c26f76ecca33ae8265 +2d1b16291187ba07cc627df976b11066 +2d20ba876f29b284016bc83ea79b454e +2d2227a82a7b629eb6a02b83b7f9e73b +2d26c87f283a1af35d7a0fe1276eda61 +2d341a145537359887a2bcdf9a719cda +2d3a1712e37a6a8acb07d3c0c1312ac3 +2d3e93e2752ce43611a5217d90c98206 +2d48e0eb70cac442b633e1cb44aea9a3 +2d4e888c34d85394500c075448cb352d +2d4fdf658ae7a8c026f0cb7ffd2028c0 +2d5322912085b1bc6faab9c1755bb534 +2d59291b57e4cf73dd81e5bf34ee1bd5 +2d6b9732d983ca96c8e5ff225db65372 +2d6cc2556454631258933883ec1e8f65 +2d7222879dfaf4ecde3a3169b0b34f0b +2d74df6cf686bf611c71f2ba73321d76 +2d84a3317e623a83760d042c25958c10 +2d8bd792e699401b2348c8ac5329e028 +2d8c2b5d7db18c7ceba3ae60b01b02b4 +2d8fb81d5ec4f3a51d238ad3b66ad8c3 +2d966fa3cc0d925c27ee2d0f0b556478 +2d967af3f4084ba46ab1921d16c67bb0 +2da015ebd5e92af5dd062672145f6093 +2db1457d4797eee2dcc416506ca2b426 +2db52eacebaf4812bfca10ac246c7533 +2dbe986c11d98b5ce46e81f4f9e4f598 +2dc3c3b2e12f5af469b241963cb32567 +2dc604a97b3ecc1fa4fc77f1ca7146a8 +2dc7828ca470cac1a0a26431d952e7e7 +2dc83ddf184a834ab287107ef75d646b +2dd8b94d5c89ec9717b34cfc28d0a017 +2dd9654b92a4ebe689785e40ec4fcab4 +2deec1869ba85bffbed70f374ed2a7c8 +2df2833b97c80f70007d6ef31589d9ce +2df8d0bbd5551f66aee149fc7d68c06c +2dfa023b45d69b5c28b316014990fc7f +2dfc24593910b320b906709b902df199 +2e0dfa733880d46825c25b3b1093d91c +2e0fc37bd785690610f60db40b7d73ac +2e1abe8bfc4a153fa2df6610ffd5a480 +2e3436ef296fabcade072d51dabfd1e5 +2e50197b8df807e0ac9c52ebc495bfd3 +2e59fd7ea1c663e6d7ba883a39ba447c +2e5e3b403efd8a0479e9e9c167aed30e +2e63e1f1afa28daf5555d2308751446c +2e6ea37ae450c1a9edcf695c3d751e63 +2e950f826ca7cce790a1538fc3739d29 +2eb219824277cf5a2c08baf65ae2f586 +2ebf3f18e6ba71beade7ae0efbbb86aa +2ec84f2c397b2d3115601f3ad517572c +2ee2b6390838a7789f95d96c6c842fd6 +2ee2b89c13652f13cb15c9edc91e5165 +2ee92ee194b785a1c06542c88d810121 +2eee402e7aab54ab87e82150d9b5a582 +2ef63b383aab9d862c78431430dbf3fb +2ef9a8b0810e23d1c7fb5a181a9b51ec +2f082624ceff3002fee289ceca47513c +2f199ccffb5ff04f68e2e529c54365e3 +2f1f5758627d597dde9d719e9e3a6134 +2f2ee43bdeaa19d038507125a000e509 +2f36b248eb1f3d50d2cd2a0400ca512a +2f45de59d09844c9f264b4e988e998f7 +2f4c51471d4b1cc44584f6feedbf823b +2f516da55f85b4aa81c3b4a6750cd08b +2f564b7da311a8b5b5643fc731be8470 +2f5cbe90001a0178ac7df3fad0d84a08 +2f5ec33b694d742fe5e2e554613270cb +2f5efc1466d508caf52f1c52df25d94e +2f622e54aefdfa57a08fcad57b349970 +2f6d48f62e6b1338227b31c8d5b12c55 +2f6de74dd0c31b4a84b217f8650f9b39 +2f7f0e93603eeb6adc49a28879fabab3 +2f9f9c9fb9987499641dc1c8cd3499d8 +2fc71580202cb1e946cbbaba1c615a47 +2fdb7f683cf5b5b5aacd9da1cee2219e +2fe654d3e8e0b5b302d48e924f2ce505 +2fec55e7a180fd987c488bab65edb7ec +2ff89438d6d32838f863af8288a42cc1 +2ff988aa316a0162d42b826b0ea70f0f +30052aac886fa12e1bccf3d68ab33da0 +300d0c6b32ddc1db8a74e41d407d5167 +301105cacfccebb55d398c311b95c6d6 +30110c54c4a088d3c2a1bc4a674d01df +3011812c3be9c322ab3840526c375fd0 +301877caa519feff318b8de38b706049 +301ec5758624945a654b4f0861c6dfbf +30444b023e865cb2acbcf6287fa412a5 +305841eecde7a6fb83a9a5da2a3124a9 +306d42905bbb3b89c5f916b955420f1e +30708a3c55e630c6809de0584021cdde +307498d1759cfb501c245dc4cb887a92 +30794de10d02d6a99784f67864ed3703 +30797936cb40f6b71f26c69e48f8290e +3081c3c87d7590080f9d8744f70010f3 +308cc6dbad1ed8f10fdcfda52ffb56cc +3092559aa5cd72096a80a8e75e7c636e +3092a642db82b3d9a4aac0a7e00adf33 +30a49691368de73eeb3893fe77175d76 +30bdf5ffdd13ae7808f7898f005ae590 +30c802e2984f2217a766b13898eeb2cf +30cb8372db2063a3fe3ed1ff8e26e625 +30d35b3eb8e3fa8301feb339206ff8b7 +30f58bb238c1973810bb2cd509e91f1c +30f6f677de6944f9b107853e9d0fcac1 +31169eade602556a36723ac21d113b95 +3121bc7383f54d45a534e4b231f0ab59 +31239f8044bf9ed101f914563272387b +31246a82d20178f1e12e6de805e1bc23 +312f49ac06725c5165d70ded16de6d9b +313687cf0fd108b91e3c213e4c64b757 +3139e37122cbb4ef5830db1183f78175 +313d96a8a184ca1db3d60bc721605061 +31474e15832272ec26159ebe1e0427b3 +31493f61651cebe05a16970c1e8f6d11 +315057ad51d3232c8330a84733889397 +31513ea622a9b4c4fa5731b3b8a04feb +315e74252c2bc6fb3206a3c545f2dc74 +315ed1b6b595ce0b523b860375fabaab +316d15c735498447a6d4f8b6a0b89672 +31715014967361110ec7f8c013d82425 +317d9f4caf388d7e7e497a8990ac0f2d +3187a8de8c80db0850a17c40a7cdeb30 +31a45aa71e2af26e6278ac5e6b49dc5a +31b14e78dde7e1dd0298d80470cc69b3 +31cf867800e57166719a5c8afeaf48dd +31dce09010467b8565ee6e5995a6b9b7 +31dddbc04733ecf9ff43111015c31dc2 +31e192fa914d72c0c3f9b5dfc8e3dc1f +31ee7802807c3f604ac91c24fc441b72 +32002596b0734e26d56027ff88fe9499 +320365598f41b665cbda51720f76885c +3205fa284350cab1c8832f97ac1abc69 +32334fe0bf9cf82333114574b69449a0 +323355bc7fe68671e65fc49596312435 +323444f8f5af333ccdeedf0da4a40953 +324edcc4b764521cf97c0e3d187ff40c +3254c23d8a7b7d7360c49c21a698dca4 +3278113d5630945d4a69f545a8555812 +328360b5d9c1602f6a1bb3cb1dd3cf46 +328b95d2d877ae37b739af8342bf75ea +329b0907e2f5ccfd72892af07bb2ba48 +32a987ee9c03fcfae8d332a03f07c57a +32ad966aa4e8e99465a5de4569a57e9e +32b09025795bf6955bd47233e60bc08a +32b32927151b2735def5546302b1fd7f +32b495618d34978d48ed02c0dcae4505 +32b9bbee60a847459cdb522749d68550 +32d2797980ddf0bba7683eb155cae73d +32d6d43dcfff3331f52fbcba38deecbe +32dbe919332a462fb255cf30d97857c9 +32e13715323a990c4e0c265f7dfb6061 +32e5e80bcde36d953bf5cd2902c1498a +32e658ae332efa08549f1109860098e4 +32fcdf44433c8603a6f76db4ffd9ba9e +3301076da789441cf24be4171ab37cdf +331d2c1976e78c44ea3c6c7016f92c8f +33280784297435258794428f7ab55db4 +33355d482a773b8e67fe4d25dc9bb212 +333e0b877deb58258a3cb6afa6d8649a +333e512153b99c24f1bbfd74861cac1a +333f4d21fe13fcec5705a8abab85d11b +335344766e13a762b427ff5bea75e7f7 +3368f0378a09b372792a9d298411e292 +33816b281068c44d19aece631ca9ab78 +3383cb875343a2027d5392ef8f118267 +338eb1163aa633306cddbce0b86c4b67 +3399f41e2fef173423f24fc9f41834a8 +339e14d543d58202158e2f575b8025a7 +339fb67a5321212d6b84aed527272c0f +33a2bb2edb9fc13fc11d0d927c94fe33 +33bedde2f90749001bb3240d2b47a68e +33c13161a6dc1508c30c411ab147202c +33c336400f75e439ae4ec51030a80a63 +33d039c0dfadda4f546dcb6f620ba2c6 +33dba7a671a1e876e46bcacb60e6aac0 +33dbcd845d2312052e049db1e0f4cfa4 +33ef37db24f3a27fb520847dcd549e9f +33f10153b28e3619d3cf56e3fc70e5fa +33fa4b4b36a54dbb4a019d3bd05b431b +33ff61cc8203d6f3c1937002ca0b90d7 +34015d14cfc084c6097047c384b1c33a +3409c4cf1b63bb5dd32f9caa93291054 +341a55f37e91bff869f76283f1b0bd27 +341b89b23d04e9354a683824d70358ac +341b9c7cc825b3d4c2840dfd1ab0506b +341bc61f1169d907675ab99925f15451 +34253d3c84ca8c15b1931eb2491655bf +3425b14aab5125d03d0c8adeca684445 +342fb5363b756cd40a01447c9088d405 +34371994f2af82bc6c4229f56d42fbdf +3438fd9d72e20f607f7a3264582f7d91 +34401135f428072a8fb13c442fd1cfba +344854839a9ce6ac90607a4d5bee91f6 +345d2d69fff260cb18f1d583534d276a +3467135436c7d0134b6d43816f37fa50 +3499ab7617aed40c9fa4b25a7967b83a +34a4ca0734e1df57bc3b99e9f51a328e +34b05ba0699b717cd1e8b2bd1db46aaf +34b9aec5fb01e35dffbddba185ae3dac +34da2c92ecb4c827e66b0e3cf633988c +34e3f2bab48576a1bb04c9c64b974b4a +34e48bd72e2da6b6cd813752bff719aa +34f425b65c9febe5b804cd44dd367903 +3513167954ee4e6dc7ed6a681f183166 +352cd2fcdf810bbb872c8aa0641bee38 +3531e8509e7881180983a65e262403d2 +3541e1702b3682d06e05799203c76bb0 +35493d4739de3e12ee52f8488152ef06 +3555f07b84acd3eec121fc74014909b6 +355c1e032803da4b6eba19a3aed742a0 +3567eb16b450397818bbda8a59a3993e +3569c425614751ff07057f5058c1f0d2 +357931f8eab0aeaf66f76dd3e439f3d7 +357c80d8aff1948834228d908134d8c0 +35829094917f0b69c39576afce373482 +3583a08c41bac1452fd8f5b520936e2c +359683418db047fb931df792da9f1933 +35989056dce438bed527fed0be7e1afd +359903c26a2da5e2e9077ec393a01647 +35a0ccde74bc444fbe297a834e8fa4cf +35a22c87e4507ebbe2a05a5a1f2b590a +35a244c8639fdf265297df9fca920416 +35cbddd2435ecffa7ca8c851e5e88629 +35cc2798f7a623ef6f43f6630d1b3b6f +35d3d14815cc44b28ea3c3e935bfe23b +35f28bfd5c39c0113298231dc4572924 +35f42aa04836bec8dc3fa253ea50c952 +360e486797da54aacac6a23ba32defa5 +362718c5c981a031b3acbb143379b838 +362b431f97b360b992c5ac8ee6e5e873 +36671a6f618a5d5522a1aec9650a2c10 +366e4732312482777207d48af2cdab32 +3688fa72969292b01d03a8fcd3489a10 +36922fc97febdd12de8d04f915c1d8c7 +3693eca28a8389fda5e38691ca6358cf +3693fa26261286a8283f23359ada6af8 +369611a49efa3981ef4e5734e60bab51 +36a82fa5c4035a3068f1a76291d8f246 +36c045f5936802a2d1dfaea97ba2c8af +36c4020404c77bce41b6e347e8b3ee47 +36cdad08b8b0156de44ad9ad311e8cab +36d374f80289941b1439795e8a2413c4 +36e7522e93e8b1ecd8e4b1409517b072 +36f073102c606cbbd7aef24b03e49c31 +36f28fe7f85541beda1fac18411d3357 +36f32b40b1fe27d14db7e8f51a5af4b4 +36fe74ea88410d58c197c6460850f67e +37027b5e3a55f79a519703c671921aed +3707aec51390af7546aabd0824f0f143 +371365d2254624fb7ae9072b147a0d44 +371901d06215653924f79dd87fa781d3 +371c0509bf713ad99a8f1376d9762f2a +37233b1f765312500c7ae83be5a20d4a +372733a9a92f74eff0b81b49ce1f725d +372b9e761a7b44d9cc39c541544d3454 +372c8cea034aaad4c09547cba3cb8467 +37343b589debc697e6286a5d1e58e4bf +37350193384d83fb485cd1cf0d103f70 +3737c01191dc66b6f756ba265b6b706b +3737f6bb9ae95b2a7dcf5b843b9bec60 +37499b2f8f0af5cd538b6cf0759e20b5 +3751654dd71899d91135270a0f32f45b +375c6b4584b3c76a5a7968097ff6d4da +37643b015742b4be681bd21a90b82713 +3767f4c9ff2419aff9f674951c36ad42 +376c2f382d9ed6bf577f97f9d0823edf +376f756f1ec027ff684180842c4135dd +376f9a59885cdc33c1e6d2a38faa5217 +37781dddaa24f103ed51716e793795be +3779e2a0acb7eb66e090cf42a64a8034 +377fbbe29057b71847aa77289739648f +379397b180da2ef23dbe3e6c969e1e48 +379b240d4d2485fa23e833d8e580e897 +379c8b6ceaad68b877833867a3bf9b5a +37ab8f91281e8cbb28f2a28b58e6bc99 +37aba73fb2a30548718159cc2eef0145 +37b31e6b28095b9a0193916ce8cdaad7 +37bf6842af2c23c8b3d5d86bd8fbbf99 +37c81e5f7376387d376a06910f4bf09b +37cbdbde7d8fa68bb293f9489ed22850 +37cc03792a6312c2552a5d247c423ae8 +37da3e773bc48469297299347faca8c7 +37f1387d2385d69517626e603831d263 +37f1a91c6a3f168acb262b521f1fb0a0 +37feb57ca912d11fc15c5969c18d8d61 +381963fb6f419b645bbcea3d835ea99c +3819f84ff69eab96e390816dba69481c +3820bd37ca16121f2f02e66e607dbbfe +38508b4ecb421af484c77e84e95f3eee +38638aef06d69621613c0c4b0ee0bb97 +3864b9c673c7e8cb4dc46103f4135b4c +3871c8d6113afe8647015d8badc3b7e2 +3876a069c605c131ab43c1cc04d5b0bb +387dbe379f6c4ce88c9bcfdc5af4ebdb +387e1dbedbb67547420824f4721f79b0 +387eb1a195f3f5dfebeb302a58985525 +3888352d1f49c354698b965c368cee7c +38af2e331bd99707c51b616edd308965 +38b076698e73012deb65939070992c8e +38bbd3fdeaafd75f7b240d0a31ff4e43 +38cffc6535b8842381eab3e05fffacde +38d26ee9ed36e1f654ae3a16989804ad +38d37c77dafc0c73159f77b34fa6ef2a +38dfdd09aa9cd8dbba0dc942acdd7c1f +38e08aacc231e90c015c856a217aa8bd +38fde7fc28c84d8ed82af595a3b155cf +390280ec9afcf4ace69103e1038f6de1 +390b89e026e283aabc651c6d1f7ec644 +390b9dc44611fc2bbcd082778ea0df23 +390cddce3e5c25a76bc1178a0dde6848 +392aeb6cbf052de3c99ef7ccd61c3015 +392af639d896741a33ae0b2f6dcb5c71 +392bf54ca21b20bbea0f833262aabf1d +392de6535824520e2d56aad6f358d232 +3947901a281c5abcd78cc2858eda305f +39491be97569e6cbea5dd5bcb683db34 +39888f38d64c340a94d27a6262f3c5f3 +399820654b47199fd8ce29b9dddfa83d +399d1bfb94deed96ed6db6434e87251d +39b413be22c5e05c82603b627ddf711b +39b6bf9a467d1e47273476db64915d6c +39ce0ab473b61c05805ef848f2f2be3e +39cfa602a9ac02ac8dadc43b1bb48b2e +39d0f8c3afa08ffdf4fca15b2221d6af +39d19b4c7bf1ec9a77c42e03f6c91532 +39d3d798d6a7963d274938fa4427041b +39d4793a880eb7f8522d9247bccd5a79 +39da8fb3258e963d9bc1435f0d8733bb +39f0766d6ca8c92b43d1bb7f20963e1b +39f27082cf60b14416e25c3d3db4deaf +39f5f7434690eeedda60edda48fe5b67 +39f9cd10d8accaf291ad485c28fdebf9 +39fd4ce043eae947ab4e4968a09efb0f +3a059a1de863c3c2363cc54f16947a0a +3a0ae9ab2ef0a9dd7aa3f3ccdd16b429 +3a21c3209aeed49e142fdc1b95b9e287 +3a242ace34a68fd381c8f32b2277df98 +3a27884615efe4635b90e08766e153e4 +3a2a6129c2923bb26b4fe655bbbdaf64 +3a34ab67803885ef9ee616f5e00b0d15 +3a34c0d85406d3cefbdc1e06e01bd09e +3a3f352a861e59820e8858f9e19dcfc7 +3a431d7c8fa828defee48bbdd98446ae +3a44f5eb2b601f988feb7a67041e7f62 +3a49906ebcd648a82c94e71544e8949e +3a56a7bbb5cbd3ed751dfe53806d034a +3a5aebc62763ec26339651df24f5ac05 +3a5bf59e328ebe32202bc4271b380206 +3a624258f80817414155be19d466bad5 +3a69e6e2ee2263914b45983580f9bb89 +3a6a6a602a0470b0454d13ae15fd30f0 +3a6d5d2f260fc4bb2355e9bc41167064 +3a7641135fd35d1281ac3d3297cc0a00 +3a825e5f1ca02ea9ff86200c88310a60 +3a876e4fabd6136511e7c41d61f746aa +3a892766f7ce315a89f6a2cf9e5be583 +3a980b421c1d48262e02c37ef2a896e3 +3aa6d7b42d22dd81d73d4b94a1fe9555 +3aa78e6de7bb064da73bdb54e8623a32 +3ac282b5aec68c38dfa0aeb9fec62895 +3ac4d46eda92ac8cbfe068e730dcb4f5 +3ac7e61450b9dec9511b39dbad58924b +3ad008ae9391757b39513e9da0f191e8 +3ad4dcda6b8d242382d83a6bc83e7143 +3add4ff1c74315ab6cd330adf63e4c05 +3ae0972b7837510a3cd91c1858ae7ffc +3afd6aa72681193aafff3c8d7d9c5c7b +3b09d3cf0e713ae580d795c8810ace79 +3b0bba23d05b77a702d08b9e294c8c65 +3b11a34cad40a3c6a3cd4c9b81dcd539 +3b1a56f61c5fe9989630213a9abefcd0 +3b23e8d1f867da71875b504d55a32735 +3b242b66387c0b8180931a20ad6c1197 +3b2f186b520fce1f24c178b1da3cbfba +3b41b93a6ab6336e42638ab24b95d3ce +3b6146b24feccdd139a83c9672c850a9 +3b651646532b65c37f1f6a8f662a2960 +3b6dd78d4736b292ca20d9963e085c44 +3b7c8533490b4cbe4242ebbf149c4b3c +3b88a17907a210c274ff58f180349bf1 +3b934bfd27a10e997bee9682b76d77e1 +3baa19aef124f1ce54b0532eec220aab +3baa3048651a65d1260eb521ab7c3bc0 +3bb6ce405f3a7620d8b8316df63f21fd +3bbd7fc7d221d041f568ca40cf43f1bb +3bc23f35eed3f448a297021fd6ef6747 +3bc66c7c7427eea03c0c73472326779e +3bc76229b1ef8c7d4067ff11d3094a98 +3bc9f07e7221a6837587751ca3769e92 +3bd2c0a68a0e8e9051d30d130e17e23f +3bd33e5467c42e2bd4068a3506e22457 +3bd6ed72939c75b172c639673932ef21 +3be589bf10c1c6b3a87a59209e5a8d90 +3be7c4089a20cc7c072f14a1de548590 +3bf3f8c6fb3b04c4a12310ea815790a9 +3c1f739b27be7c6b63894d6480f88f09 +3c2fb02d93e736fdc7da7dfa5c12962d +3c56fb9da631b6905959a1d829f6836f +3c58394274d3cb8c3b11fc025757ef67 +3c6733cda5703db944eb6f46f71a8ad5 +3c704be782eedf5468f04999d2443070 +3c7f6f1ee780b14d59d9ff46192ca0aa +3c992d82cc36b5c0de564f96d4cf927a +3cb1d82339afb4a8dd1bdf25b178cb67 +3cbc246347b627837d17697ec9c46bd1 +3cc417a38e4120ef8d123b735c43c576 +3cc42a8a10b30232c818026151a5fce1 +3cc5d9cca3eb36abdf86a223781ba4c2 +3ccb5589f564bf75f96637d9d414d7c8 +3cd0571d3fe22637bdc022f39dbf89fe +3cd47956858f04958ecdd031d248a40b +3cd652bda3ca64817ed90a866ff6eeee +3cda64fe80dacda3573108ad4c87e982 +3ce3ede5184032a9fd3ce82de11fc1f1 +3cf9d122097b04d17f45943a23f114ad +3d04fe9cde08c774098795f131853274 +3d10866081346f4de1a2e0c772324d88 +3d1cc1734e07509f1eb8ebac1c8c0989 +3d44edd9508942e7c554c66f76075245 +3d450ee4aab40abcb4b1bec4f8ff38b5 +3d47f73fa149b971cc3ef3477579ed4d +3d4c4e3d3e3b8ef2f1a93d16eff854a8 +3d56e238334a72a43c95634724d12a00 +3d5d08b77832c35477d626c7b3fdf9c1 +3d72c67ae26ba903ab7a7bae4905363b +3d7ee1d208fa16e420d1646814c22e9a +3d9058b931e36cd862cdf8f2d07baa48 +3d944db85cfbf699fb539436f32e4b5e +3d9ec4b4db5a40c5b32fc719b077f2da +3da4ea156dfd90ccec57ccdef3c86724 +3da8fecbf42bfb2d5ab4aa6ea3a3a1f1 +3da927e76b794279210ab6231137d52b +3da9d4d0f7cabe686b1274e2efaa9c06 +3dbdf52ac974f42a0c453e7bc8e9eb8b +3dcb206968d4c25afaf9f57a9e34a02e +3dcb59d0495b5a184815845dfd0ef5e6 +3dd3475460735b1b20bdac514d1bf7e5 +3de6d26d92f4212faa4d9428bb6f2fb4 +3de7db564ab4675791406af4ec231bfa +3de9761795c60d0c0c16aed2fe77ecd4 +3df2356166095d7c1d80b204e172dc45 +3dfa070979085450749ca65bb070118d +3e02efa959104b80d8a100e64d223e44 +3e06b9c58f861e5ee05ee65be342e970 +3e0eb3f0847134f37c7dea805e8cafc6 +3e0f1bb78e4eb10abb8b56b465ca8322 +3e12f7633c308bede513a18a34926bff +3e26e7744ff5119e679043c07a50fd43 +3e2dfae2aa872916340eb22d9e79f98c +3e329e507727e29646a7016aa71ed06b +3e33d66a31992e7cd9a81c03c1fc390a +3e3b4fb3bd31261183cf586c18d0482a +3e3cb908350e684af2657995522f1d28 +3e40d69a1c3e717fbab2755b2412dff2 +3e41ab4a31dfdf9d5cadf377de5074d6 +3e500ebe6e86a89ed5ca43d4c166d5c3 +3e6636ae18dcb2bd168b0463fdd9491e +3e6ba34087f059fdc8cf00d4f5904494 +3e74b35ee3431df018d9a01e2a4eb003 +3e751c0604a0cb9b13f9f798423d9e04 +3e7b9998bea713ae19f11241da9fc960 +3e8c548c270668e3d5b6bc593ca7826d +3e9ee90349aba43897baae624e77c49f +3ea511114e978bb23a86144d1046bc12 +3ea56c607a6ef376e54c50d9aa5e43d6 +3ea6bd34d5a10c140980b4fdce899f22 +3ead30fd2b2e1f5dd40da22ba0b35098 +3eb5c4c096742dd25b47af1b96559ed6 +3ebb3e4f63c226e67bdbeff6bcce7a8b +3ebf48b665a77830d6353d6b8727accb +3ec93b9802172a0b544ac8adc2294c23 +3ecefab5f7a6f7b0e7b1054f58ee24cb +3edd8844a1d065ca93752d23c69bc723 +3ee2d406f0130789f18650bdc3f87287 +3ee989c9765bb731281d98a100377e9e +3ef074d8b955ead5e139ed306ed2b50e +3ef495d7852902e7d536f690b10471c4 +3f035f458a502cf2f9c866a65f4be114 +3f096ea2df16aadccf039794818adefc +3f215305088aa27e40a6cd2f601a5fd3 +3f24063f073732f2a4d8d0b24a894806 +3f31c05414d194cd11e4c8c931b96fa9 +3f40859e0f69e7c722337e7fea8e760a +3f42d89ef8c536d9e47ec6b28419b340 +3f5243c15a352d7fa83635abb19f827c +3f6997d1936c36dbf6544add4fea9416 +3f74e1fb2cae0b7b1851e6fc0c4b54d7 +3f76438d1be734b556e8208900684da3 +3f78df0263d4fb8b17b311ad3cd63d07 +3f7928af7315b6dce38e71c2f7cd1886 +3f7b18a95de00e2fc2cc56131b2d3ac3 +3fa25ff9b594839a3688ea3c88b5f077 +3faccd6cc812bbfa2ff425777c4576ee +3fad9e45e1d55c6e1c3333657ff97de9 +3fb054cdb232fa00bf01ef230b802946 +3fc24a94843ac61ef961a522a9da3106 +3fcb4c843b0b7c1583e84ba40b552e4a +3fd392e928d5d8b59bfab8c13c728a72 +3fe9694f52d235a8eb01ea0fe6b4ed76 +3ff799919632d189f20ac7f8a4f73f0d +40052c0d2bf5c338bd12ac4c81ac77d8 +400c7e4691beaa6965f8775a8911339c +40203799d1eac4296cb550014a4aae4e +4029941a4d5120ed813f2d4b2c53529b +402a969be10cd12d3f838b4f32b19858 +402f28da548564a392459f29f1c148ca +4034e7d2966b3695fbae87dfd5630078 +403e10426efb95fa9e8b694f6f0438f6 +404141f9b4c445fd5c3dc011e92e6dcf +404a532928bdafac0fe72268d1c9a81a +40576e38e9caf18cc876010dc47476b5 +407c674d36157ed12a4b71d252856622 +408c25a7ce0d4c4c457283b1415c37aa +4090821820468ec8abfbec39edc44724 +40932144af7b6c06453ff08ba3d98263 +40990ea1ee9345e9f04156c4c80ef8d5 +40a1d54fd9d2de8b65b3ee5a9b061f66 +40ad292b224e42b2fa5c92a697c56b93 +40adb022894f8bed7da0119f7231a3ad +40b9b6d2b3d4040817d8b74929157ea1 +40be609db26b4c6e042c0c42136afb10 +40beb7efab6529216bcc91f3a8b05c9b +40c2d6ac4579c13d2c5c1857a0d50a0e +40cbe2cb55bd3627db66b887c5a1a036 +40d2b1a51c9474c3aa195cfcb8e96111 +40e4bf778ce1b08f17032846c98c5cb6 +40fa080f37ebc44a1053945542298fd6 +412862d944b2d46e094d3cb0a26aff64 +41314b2cbb33aaef0880780cbe7631c4 +413356892255889917df2de81cf22c2b +413a22bc836933213f3e9a8c59aec0e4 +414240e40030f3b4e2fc28870be0b9bf +4145153517455aee5ba5d3bc5e192d2c +414f48018271946c39e0643147f7f2c0 +415d4104801512e4422e831f65fd6503 +4163704d495b19f76d95e5638ccd9aa7 +4171a0a6f945e40fb3616f795d842f96 +417a64383ca2a4477725b025fe9c444f +417f227ece9184a8419bf08279e39466 +4199edc0cea0a762332788835cb23ccd +419c0b6a3ba09af06eaf70a4de9444d0 +41ab806a8fa4886e320b2e207a3a2182 +41ba7b671504072d29c2360529f9f32e +41bc29dfb9f4c2c98d4c0375047d9519 +41c2ae34969df395d863a8cc86f68fdf +41ca991b07a878ed73e96b4070427f55 +41d20ac302b646ba4af6c8104a20b8af +41d48db8dec6d1b53c31234ea06fc9f6 +41d92182aba6cf5449515600e515d46f +41e3317dd748f24be2693fe899ed30e0 +41f9d2dbeab7ff7f48c8e67428270bd4 +41fb2872b6e0c601d8d8c03aea753ab9 +4202e06139b11bc1e7c96487344aae15 +420491dd92c4b93020d759ac5dfa5379 +421f472ebdaa5083d81d9e04f7d30c4c +421f995493ec630c3e9a99757131d22f +42243c9a63fc518224120225fe332a50 +4225eb73a02d8dd022cfab9cbedb9147 +423958bb3624a68043353b04bc9135ee +423dbcd28edcbed5e4351ea59d0df7c3 +424a5491ad5c737ed0e9b933fc722782 +424ef7bf1137c8e464cc5a3c858aa394 +425125242bf6cd55995343a85014ce86 +4251430fd3ec7bf40d0db82dea4c2fcf +42520b520babaeb05b2b4c7d08a09774 +4252c8d5a209a4ca91cb6759420a7aeb +425c54536fdb3d2711b6891816d4d713 +425da75847c693d67b91bc14b3b85896 +425e897f77de61546e68296a6d04bb69 +4260c0312c5881c81df179b17a7a884c +426ab13886d851040a1a9a2ae0d080f1 +4282d86f0c300169ae84edce6c850395 +4299eb1fe8ac4c008bf136b9b73b3f69 +429a2410327531e7b6b4617dd8de86e1 +429c831e5bbae451456fb993481f55b7 +42a7eb12f25e9af854e300827efd71fe +42accd74530f68fed959b05d5ee0face +42b0e4b5de91ef383b5a1abbfde6c189 +42b0e87f3def9b307909c60d32757776 +42cceb8a0d3ca82b8fb6831f38e52a11 +42ce41595485c6015996a198248dc380 +42d1ced0c61d012c29a035b649926046 +42d340aa3d6674c5fe8d60a61c95fbf0 +42e06043851ffa0b714dd5f562b7a1d9 +42e53b4be3ec8388dbf053acd945e573 +42e9727a3ea696461391c27c0f2af3dc +42eb2fc5adf6a453248afc4aa4798019 +430043c560a212946ffaafd4b0245134 +4301279391f263733d615bf2f81f8882 +430177495880630361a9f7d311b7e366 +43073eac138b30c50bd1bed1571c7b2c +4318b1c8098a9b9108020d7360dc678e +431e85ff59ce250245b10c419cff1f29 +4333a287e9f0f9974a8f82c54d1b3ec6 +433929a38e8981f2272792227e410afa +43394cfcdae0b4746e694ae32fc3dddf +433a3bb31047bd78c28d56df126cab64 +433b5208183089d83e610d61b4e19bdb +434d2e09e853b7e0f71d59a3a839c8b5 +435039709ce245a222bc7d525792c10d +4350839f30700a1033699dfa8ef71384 +43542f4d8b71bcfa582965bf80db95e1 +436aa90a46d3eb542f96802aeee9d846 +436bbd6505d2b035c6e29b6efdc92aea +4376a02d65ba66c6a5e0a82f9b0cb382 +4377da373d33548d9bacfdaf7a0e09f6 +43939cc35278741389660cb59bd430ac +4395c5b5722ae82477f02252633ead55 +439eeb41e4598524657d03ce9e902e21 +43a4ba34e19288975529eb1b4b84c25a +43b2c39f5b366ae721e793154b002410 +43d7b51e8d28aa046962e4262b73ff82 +43dcfdc5d3aa51f5680061a91a218a40 +43f3527195324e71f19285ce46df8c3e +4403f6a2fd64e44a3bba8792e13e807d +4404aca0601b053d0d2f6b4721cea4d1 +44079fd78cf69cd588c40ad6d807002d +440f2619fe93ed40f059eaad13e4608d +4413fb7475ba70c518d7f00ed81aa0cf +443029d1c78fd63f7ce7fe3e8eef5f9a +4433fc2850a27a8aa8ddd0e6d13f5468 +443d12f6b7bc4830f7bce71ec74e480d +445ffb4729fc0714c80799451f4cba0b +447a737cc8f64c5b7293819c3d19d7b0 +447b02284767f63732750aee650f4a70 +4489e651a976df5a5771306e7631b0ff +448a833a4e3762d4828ebae4f6f44a54 +448acc028729c1c751fd38e16b033b4e +448ad7832c89a70b57e8198da791c789 +448ce3dcad8d60bbf7bef5d572e03336 +44903933a80b2f6fab16d404b4574cca +44c1edee02d56d43cbcbbd58f8c93367 +44c313a657cc00a6e875753a451c8439 +44d48eb26bb92a1e6e12561f787f33ad +44d9d5462229b92042b6ecfc58da8f02 +44e19215f5de76b8bc4121286b8fb365 +44e3d89a4908b0b6058bb765309ebb7a +44fd3db5d47859041536a9dfaf958346 +4508ed48238dfb0ef70eb3ba3f56ba34 +450a7251f3bd2ff0fea1fbfddcf4978c +4519e54383725e70b67efd56f32da442 +4521ec4895fcdea88ce008d1e2c8a049 +4525edb99374ad6d676d35fb219324a3 +4527963339c5b2431b80de8e2134b152 +4530687d193e86a1214091d1cfd17d97 +453fecab5b2af21c9bb0b48335104f46 +4557b85bcfbe7523c9a9efbf479941d5 +455f629ecac581003f97ea01f3848150 +458366b61391202754cfc19c54d06d98 +45866c33149c74de04f3e4f25940506c +4587cc1cc41e9901c69f8630ed659bbe +4588bea7f8ae72c7da5087c5a333516e +45a1aa1ee3d845f5bc4afc9f038a46e2 +45a1aec219675cbde3bd203e391c194d +45b7975906d3141f5c84004afbc23ab7 +45b8987eaf5d79463504c114e0463fe8 +45b8bfc9c34f0b5909055a28315a9cd0 +45d26fd39fe6dfd2601908f1c5401df5 +45d6349e7f64a4124586fd8de422633c +45e8bdfbc613023772d4c980d29abc72 +45ea16d2b981e4243dcaee39387884a2 +45eb6d3e4161ba947cb052090fb4a338 +45f73a6242e1cc8ac1d3e14dd47632d3 +460c4e587b809b05cf7e7b9dcd8e73c5 +4615702768861e01e7bcabb979281a9d +461a4910141579db9a32de62a69ff792 +461e1187c802eea2d54854ef757aa229 +461fdee613275704f0c15cebcccd4203 +4622e689cb719fde069757153f4f0f1a +4622fb9efac9026b3bd7007dacbe6ffd +4623cf8f38de6a70d7a6082c0bb2a607 +462781f4fd1c46e48f06edd6be60919c +4636eafc8f6bc5273cadea5c07f5be62 +463863f719b118a8be35a8d771ca1850 +464011ad2a01ab9c895bc50e37dab348 +464a1c42374978689a6c7d3e54551bb7 +464c2ced2ebe1bbbb487bf91dbf6cb94 +46513dc87f987321ea2fc8914be82c5e +465f61bd06f3f8f4192fe5a8207c87e0 +46781dcae1c9525f10e2c14867ec83e9 +4678204bde049402977ac8aef80cc114 +467976bdd5c0234978aabbd21f303e5c +46897c25d18550c49c84f54d45f98ae2 +46ad24399b236783131b6e05e7d278e0 +46d42b04794ebd0c2b8eb13bd9cc1c59 +46d94c73bc97764a3948171941e778cd +46db63685437e6ca44a99b80b577966c +46dc86803f197014a81cb3cad33dcbea +46dfacb1cb697fbf605cc90f469d6505 +46e1638be3c6389e1732d84959f6fac2 +46e5b86eb5197b31a6ba7cd70179fabc +46eea8c587b2aed00311b702779052ab +46ef3e8a700e30dfb4915741dc0f4322 +47064e71ccbf1b9eece71540be00fc39 +470be915ff6451b573f2bd49e023d31e +4711119b06cfeae6c2b2b97b60a4499d +47205a97283c8944e514fa41a8277b7e +472b9aa04925c5e126dae2c225e7d9c2 +47397d269db62f035ede90efb0c86e90 +473a82cd93739fa3737c62a2e5aba02c +475175fc6aaf315b6e31ed9412a9fee5 +47552f24da000bab1281a12f118c03c3 +476b6f8da2be64a30339775999962449 +4773725155bd6786fd16f32bf526d454 +478b07dddcb4bd852ae2f8bf10ec25e9 +478cc12c1524b4a78b75f36f1debf9ca +47970be8bcf7085b1ef1488487e876fa +47a2aa412f877a4f003e24ab37ad7653 +47a345cf9021ce2c39c481efe9e71382 +47a3a26f093aad359a027f43589b78ab +47a428bcf03dd6baaf90bab4bc01e98a +47ab2dc86ab964fb52ecdb6964e86410 +47ae877b3b9a06f85d4ee5a4961450a0 +47af6df20b0398e19c375f28ff30968a +47bb551b78a1322420b4a29a51c5ca01 +47d2fb5c6f7b1fd50a42aca7dd88ce47 +47d500412cb6df22edecfdeaf5c35dce +480034b343a04d145a914d7724ed7c6a +48044217cabc9390b0a10d90015a716a +4810e57fc73b63680c78d85321325cfd +4824319714d8477656a6cd909fe63e39 +4824ea856b439277f0d08bc5cf398326 +483876a24e16ca329300e585b7693d19 +4841bb0d5017147ec240791f30352d3d +48439d83198d18ad712478b31c4aa10f +485cc3dbd2a95c7b04c5121e12e63515 +4860136083fbef1a8b73fa0508e89419 +48657c7b0eebbe76de0bd0712ed6fe40 +486d55fd9979140b650af17a37710274 +486ef880957b922bfb3d300cda101de1 +487a3edc199070888e555c936ac5f17d +4896285e6b43cc2e97298438a0774c1c +489f06285126aac1f9bef9bedc06236b +48a6110b03d2868023b498bd80058c32 +48ad08ea879d5e38afed4717f78573d6 +48baff6b224e2bfdc5397e7b8844d2e7 +48bfcf7c2b99124aac1e8a90bc981cfe +48c5e5a9e9f724a7cf6281465a76082b +48c91d9cae0f5bf21084563d455575ec +48cc23e99c46c6cf04e0824bcfe270a3 +48e46df6c1e5233785978aa011068544 +48e47a4da540d467b33dda6cb4ef1f2d +48ecc10f1366e7d16b102a9be2926374 +48ed033f834ee1423d2e18b19034b496 +48f2064899478c034f36846ee1262dbf +48f41e296d4361b3634c775d559e608e +48fdc39675dfc4feac498cbbe83c6f66 +48ff9311bbba5274fb8459437e9620a8 +492dbde496f89ccb39e4c80a5ff39f54 +492f5d2e4c14d79ac7bf1ca81e9e11cb +49307516fda1a6b71ae01e5a0421f2af +493655c7b2da09b9d00116deaa8118eb +49376c7386d4ccbd3e381ad00a2b1d8e +493c88dc268335a097c6d9d727e65994 +494a0b58f126a84074d93cf16db88da2 +494b747da9c572784087595c8d64d2d2 +495137008d8ec65efe31bf7ff4e4fbaa +4959f826f5927884683f622b6834ee19 +496866f0cbd36e6dc8b28b2fa54e80b7 +4974bfeef0cf71d2ac79b794516e371d +4979e655b6ad59023fe055cbbade50bc +498924fe794e2e528837af064251a51b +498b2a4de66b19fc68cfad2cd19d0721 +498ccd3671e8db5e294b46ac5254c72b +49932e1ccf3b90c4ff6ab2b059ac4852 +499ea5bb95b99d09ddd43714bee017fd +49ba01168a38fdd58882e1bdc6683e82 +49c4da5704e5fad1f11e99caaa9ccf60 +49c9ef09e45b538c2031c77aaafe1a1d +49db8abb4c01e5cfcf28da83f6f54c44 +49de6e6881d2fe43be500c704a7818da +49e8980f7bcd8a4657e1b278d01073e3 +49e9a5600c0ee5e74d82fdadc02ced63 +49ee6f9c497551f4679c53596fbc5c0c +49f3c6e7f3736660fd0e5ba68909bde6 +4a1259ca9ec2fd9d2f571f888e3ab02a +4a39648c24f171368ec2334d81218c28 +4a466e1c8f1f418a56cd7b1e5747516a +4a4b007e914c27e031b135511bdd652e +4a56ce8b51346f567a1b4000f5a3ce8f +4a61ed6eda6976630b5ef6b5bc37cdcc +4a6bff8e6ef18e975a43733abece112f +4a980531c0a5478362183e386846f176 +4a990fb5b2a402033e60b6e61c6efb0b +4aac4ca58ec7b0c37258da7302423d2a +4ab776651aec837ac991cdc81935252a +4abe6c2bfc2b3e7a5734b32731431ec0 +4aca8adedf7c1b14d39b1388af09e036 +4acd105b62bb3501bf9a7a68c1823170 +4af94bd1fda15f117ef158bd2a3890aa +4affe7a7593256bf7c74a7285c72ca70 +4b003e2b017b67cf4da937b4a75480f3 +4b07c31ebc9107f5c2aebad0f5bcbc97 +4b0bcc896fab06570f8b45b7f8a561f4 +4b1b7513cc34ad4c859d5ef409dcd8d5 +4b439e4b479e74b6f7970c44767c8852 +4b44834d85c3d77210a27ed7c9b5d633 +4b5bcb6e0cbb2eacbd42b17958979938 +4b6f7f1e13d0eafe4fce87eeca412ddd +4b74c6b023b1aec0bd6b0bfa7a6b84e6 +4b77b8766ec6cc9a4c5025e963442dd9 +4b8109141376938346184a660b868113 +4b84c2d5e52af2ea0e554ad7ce36e103 +4b9125bc68cd108ac13126ddedd746aa +4b9ee0285ccf3175c97a6de4a865291f +4bbcaa6ba951d323c158115c61a3069e +4bce6a078b584f3b81db13f3d7101d3e +4bcec29c840851b5f22becf18fa3c24b +4bd0f8964382bfa9276032ffcc1d3b4e +4bd1ab5228792d6541189d8e980c43f3 +4be017c62c24473aca770150897c1cbc +4beab9bd2a2c7a44b84fbea0f5440b91 +4c0844b682451d6897ac19b9089dc0a5 +4c138e220895903f8110f7afa5dd6bf1 +4c19e326ef1e590c55b28a7408924eeb +4c217ce7f96ce066c44fb569709a3e4f +4c238f223e4c88eee5b59631639560b6 +4c28f13490026786475e5d0f0f72eb82 +4c2bc8a6ec6f4ba6109db049fa11543d +4c3631367e3a82195367b23b2557da3f +4c441929676f5ed7f5b12c4b74c2beb2 +4c478b54c109710e23417cbf2eed382e +4c4dc0ef888f2cb5452796e8b9975e73 +4c5dadd057fad0bd796b1d480462cd15 +4c72170c003e5286e52a2694854c0c3c +4c723b105364a9d6ace875e4dfd012c2 +4c7803c2acc61de98879b362be33e6b7 +4c83c68f0fcce11707a6b84e5c335c61 +4c8afa184e8cd92553d3b0e63f0773df +4c8c2e1cb180e1612694086952235e5b +4c9145ed04d33822179144ea55102947 +4c928ddb69173cd2a737d15cbc5140c7 +4c92f6789a9c24a2507c45a2477723f4 +4c9342f1ba29be5fb59b10f06a24c976 +4ca314640cfbd68e2b86e1702d7017af +4ca54825763cec2c1b8e21ec64be9ecd +4cb2b66e4125afe27768ef65fad05a60 +4cb59cb9ad31ebeeefd7721d7a675273 +4cc002a05ee1ded743ccf0798f74dce2 +4cd71bf212507bca9a39a85090c54df2 +4cefa5a331418878642e80ca9ecb5b05 +4cf0645c0c8eaef6407a0728af69f033 +4cfc7504d7715f77515eb91d158185e6 +4cfd96ad98f0c2e181a0a64cf1305f14 +4d0a89568525c2376c248f2b7f2ebb55 +4d163ee3071c7837d94d84d324554283 +4d1eb0058d7558973f3d8c6a1ef2480e +4d2aad3beaf1a2d9a8565ad6bdbf2448 +4d3a789eef62cacb93b4e6ddb1c1aa9e +4d3aea3c9739ba1cab52fac0b4eb44a3 +4d4001256f82bc5f9d027c1c0423fac2 +4d45783e32e7350db3e96575a2d8b24d +4d569a18c6fa26bbe351e6b2ac209e7b +4d73d5f033ca786cc5f1b2fdfc6e4bbf +4d7abe07faef8e889efab4c9d3d05ee5 +4d7c08558628e9faca640a95ad1b767b +4d7f635bccb9226f0fc0588620ef5ec1 +4d817be5f41b6729fa08413e86a1082e +4d8602fa4a30a32f44de70f6023f9183 +4d8ed0a83b642651309547f52deae299 +4d9b0930e303412a7f656a4be8526eea +4db2303730777ecd5908bb677ea59944 +4db3c405e6ad09a1ae85207f089b077a +4db6c2f3c9ac49e76a414a1d31702451 +4dbb08118f85c04bc9735c45dec1556d +4dbffc69787927bde906461309eceefa +4de855393cc8dab16333ca99f121e5e0 +4decb3194f86eb67afe6aaf55add368e +4df29c1e2ac744382a563d00b95e4571 +4df8b6a8bb99e87da9076661c8c054df +4dfd846907efeb18d448e4f3e81bf66a +4e027e1d87253be8dc9bba5a192c69a7 +4e0bca9b6c1cc352d19f63c2bf820627 +4e120e6745e2be4af12226d9073146d0 +4e37dc028b30519253b8a04ce7a92cba +4e4602cb32c40f3c7ede26a0132f1b8d +4e58378e36aa076ac868294005b9c3b3 +4e642ae4c0b5d07d0d771fae5472e716 +4e67c800e9e7e5e6f0940f585265cce8 +4e722a7eeb3fad79bfd0850fa24f9f40 +4e78ee531b54ffb4414a61aff65f56e0 +4e7df2a9093a3d70d18b3fad109d118b +4e8acd73b0f3573bc50f9d3cc121c882 +4ea680ec093b055d9b0801a777f9a19b +4ea7c4f3acd2c254c9ea59f1c5e897a6 +4ea880616faf9b27dc45c75866dbc9e8 +4ea8cd1475c89c3e0f21ef0dafeca284 +4eaa08b2f7b986d9afde928159ac2fdb +4eaa9e8523277cd5eb9d1b9f4b5673f4 +4eaaa7d28474d3abe9b37db469a78301 +4edc385194728f79f62b6729016bed67 +4ede7317343a21b6ca9274ff07aad33d +4ee8ee7ff598278c55091a9a4ea6cee9 +4eec4ba30262f1979f9a2a162f952726 +4eec987637516fba2854fa12d9b13df9 +4eef2c0024b3c647a234f6ab1cd7bbe7 +4ef11a30a45ee434fd035d9784403c23 +4f03a4b26ef744a3024f1c04159f41c7 +4f2296e018ceb04cb7e5e2c7f784179b +4f41d4ab6d4be78028b507973637b74b +4f4db1bb653dad3bee97a030164ba2b4 +4f4ff8354a009a96fb2a2c239d1653a2 +4f571e78a4ffb6018704de6ed4ace84c +4f61879505efcb0a9011b44e41e4870d +4f8617c7a8201748a3c611816d4cc50d +4f8bf4025433a2f0438287c61c957ac7 +4fafff5869cc084d7e1eea2dd34cf3f7 +4fb7d270c99d6c41fdb417f2fe987a59 +4fbbf739e0792dfa6b2d3454776be131 +4fbedc39e5beddb9acbfb156f1a15bf9 +4fbee77df16de50dd57729eed5fe28cf +4fc303d78c456a7aead2eb2d5de1228d +4fd4a59a8bcec1f2a77db673a066ac0d +4fe39e9a61aa1fa026ec21eacdebf47e +5006015606335b886ce7ed01e7abe87f +500694cc64858de1b0c26ab78780dc9e +500b704765c6a00dbfafc803486d4ea7 +500b890660ec7865f1f5e4f49ea1ab25 +500cc0f14316029e65ac03a2749de99b +5016d57ee33e47e0dc6ecbd12ef4da3c +5025d27adcf27adf9f0a3577c8def153 +502d4fc77de0c45d02486cdfd3ec8769 +5030a4a1ca0373d4472ac6af847c751d +503c24058d760511f90265379abc3a4c +503d49ba0592416c887210517d18f224 +504994bca01c8f8018c9a8685176164c +504a41ce7eaddd16e974668870a94321 +504a75e285720a275826881d3fbc2c79 +50569f93d3ec7f6042eac35ce00ca150 +506c47124843dfef9e604d226c80f35c +507157b28ac80c65905909c8af137575 +5075ea82477f3c777d4411e18b98c15c +507660f6485aa74d931aa711cc4611a0 +50778a398552f1c4fb868462e9b67c9c +507dbfd94487b783ff8656e32c051c7e +5081d0248c9964547710f7af4093bccd +50890ad4398dc9846ce286a8ab7325a5 +5089dff2f27efa04bf73d7bd513b35bd +508a1871eb4a86d305ce3e2fb735251f +508e5162234b1fc01cc4d2d057128ed0 +508f5e7749a1d6cb4374f92442f2e2cf +509349c1f711c4f0d304e348e1fdd958 +50938cfc2b83abe6e6b8eefd8b09514b +509e193439e6f7b2b4a9c23691bc3c09 +50aac2e284998539d2437f0e05b41102 +50abac514479cd14a2bfb868a3a5b0b3 +50aded76930284b65fceb652d6da64f2 +50b7e1bb145b8ac6a853e81139dc58dc +50ba04938893596b98ec53549cb5e8cc +50bcbd3148778955b5219f12890667a9 +50c003543d9b9b7ceaaf5a9a6dfa638d +50c1635b3ac6da49fe50428f8550b4a5 +50cceb9ab4e720227f1cd91bad576e73 +50dcc5e4521fe075f63aaaaa2aae4d57 +50dfe805152630d9e97b3e5824599e23 +50e15aeefa532aa7737af3866a37ad2e +50e77d021f4868fb962bbe2ac61b9560 +50f91d16dd8495267035f55790da9599 +5100e0c2e2ea1a0de48e0b2d28e25e17 +51016da0286219ad2d7cfe839d951d5d +510de649803ef411d3b7571dfcea5734 +51189267d9ee385c5d37e52f1cda20c2 +511e9fb2824168dfa1bddf3ed284165d +512f2d1861eb292c25cf1decf170d548 +5137295da41f4141f17885c521eb23a8 +514f9b3cdc0e79bf4e0969b9f68f660b +516213d16799f146a1399f60aac55cbe +5165524d4db6352a601af8797efa0879 +516702fc880bae6e67ea967e4dc2fa54 +51682f3a88101bbaf6d8d7bc7f6e8c39 +516e9b676243b39d0089bb75a719f437 +517b701f0015deb8504596e471fff31a +5180bc1eae839b5df27da48578c67931 +518489cf97ff6baa7ecdefa0e6690c88 +518c80839f12e994163292f1662d3212 +518e797339867e3b86bea174fef20fd2 +51a709984bed35dd1ffc96fd02d33aa9 +51b857f40ff36dabc97fd08d08fb9d63 +51c97327c3d2d2a5b54ed643c9cee176 +51de34bce746cdbd6e315223fe55e09b +51e6c4b85ad578c0326ae51d7759b019 +51eafa82855963d6e5a6db95207c624c +51f4bb55f6159866638a3661f315dd35 +51fa1a523e1f8e1edf8e80d02d3e8b1f +52080e701e6e1d7002655c2daa0dd1f1 +520a018ffffc4ab5f0b517583bce28b7 +520de1d6c2c12d8633d26ddd1fc59e0f +521f81f839bc13224a923e5f24bb431b +5221ffa74f1c46b55c8e796a8ad9fba3 +52395a0977c695c3d871864cfd8cf31b +523efe978adf889d93d62ac6dfa9a1ad +52400dc72a1a0428309ec72835ba0ef2 +524d6dacb8f5f26128b1a4ea5ea6bedc +52517d527a35f356bc9a596e4737d97a +5255893c4e75609114ec63ad6fc990f1 +5276f23962da83c8a2fb58e4a722f6fc +527b8ca5143edcdb2683b9dce9992581 +5281a6ba91126f3d4cff1ffdb85ac042 +529436397d4727b7ee786715af511bf2 +52c67c68c3173e73fd2314d3aaa0611c +52cf92694649991835a56030ee1ff3de +52deb5bd9d39416653a9b1380516bcf7 +52e49336220847be20e2e81496738f69 +52f527e7edb4a49d00b00ee4106ff93c +52f75c1a1851d035489eff4e7e9a6854 +52ffdc72097227cf4fdfdd1cb393839d +5301a4ef8b13471515f3a4e6d4b92c86 +53267f0d2d1effa83701accde5a9bc60 +5343a06e7e154ca75d1eac484e4349e2 +5344dc1172cc344d9c9c6dbd8706cbf8 +53462cacc6ea39f4396a66fcd3449b01 +534776a0e29321930cc0945812ba7390 +53484c7191d8ed38972608346b104e74 +534d5fe72b5a53fee788d5960e0bb323 +535bae0beb2fbcce491115f3cc53a92e +53662753ab10b02673ccc2cafed57b4f +536dfce6a57e479ee8f2d09a9f0d70ae +537418ed08024605834072a94f4ee7a4 +53a6e3b92d69dafd99e48868c261e241 +54002a8415c7bd19bc14c7bf068e5f74 +5402dc329dfa23e60f538bf26638e200 +5403df5ea8fdad8a6c3aaf97b5791006 +54074db103b3ba59f19b33989bccb0c6 +540937f2c65cd94e4b59630631b94e09 +540d739a697608e6d2f96794b2ac29ff +541354ea7260d436c39c15390843cb70 +541731bd06043d6f31ef240d4b56e853 +54209ce1aceab5d0d430c63c3743538a +5422303ae50b97cf61d0387270a70e8f +54241ccd9a915443286bb59581165fb5 +5429ccfef50fa5feca7506c00e7879ce +544151bc1c617953ccbc665ce668872b +544b27a20a0809da8269cbdac56bd4ec +545071f184223bfb324249660c8a3c22 +54514bf72a7ca3bdd2cdc31e312429d5 +545b8497c9b7c4246dd03ca2a9fb22f7 +545c0027ce5c00eef606a5c16743a4ae +5461d44c1f1c6abc5b89b66430abcac7 +5466d06b0d46bfe283b0f5824362cbd8 +546e9a6f497cf9518529e0de42423c9d +5470d87f91c338a233ca9b4321304fb6 +5489ea65cd80c983a0bad3964b6a0a9e +549f4f9db626b141ae94742d3e6e0ca7 +54a3808a83cba16ac24b80afd089de74 +54a5baf8313d0302dfb49de4e109cb15 +54ac7130e7b9bc0e9f977dcd73becb44 +54bcb6d58999d56ffc8d9f3626006585 +54ca5c212e53368fe8e113b7c91e8318 +54ccf62a5c6aaa8678aad14bb29f7e73 +54cd7c8b9d6a57cb796b7cc6fe053722 +54ceeb704766fded6acbb7da3c7c0aab +54d68b07c6075ff88e63e9c9e718811f +54dbea7f20ed0834338b73ac96600af2 +54e39483ad421acf6a86602336b3b27c +54e7a329cb7031d90b229e1ca5bd39d0 +54eb266a34064bff444dab3d982712de +54f94a2c6f73b9327cef954695e33b7b +55002afce46488b50dd5b3f5e9053835 +5509014975a068b54be0cb0ac35e9bbc +550d6ace1c7bb3efb060e251828f4e90 +550d80a6e79a47808d6cdb19c176d892 +551427daee3774007c4ef915071dd00b +551c516b8c0ba6b4a28623615a6a6adf +55274d4664820a3a809411e477dd8eb3 +552f4416afc1dbca1156f6aaa4cb950c +5536c404ac829e4444166b2656c48f6c +5538b84b6f7035fcdce5dca9dcc71fa4 +553a62e6d99359d45b17e731ceee67c6 +556dc403e36c64c53f30cd03b5fc894b +55714106caecff0eb5f649a3a6a5a87a +5588bf8b04b0a846fbb34a236b8335d3 +55be320ba2e6278a348da2a68719f30d +55c1f96035d9b434878fc7068cfe5f6d +55c1fc2bd8f72000f7e474b1149e4bf6 +55c7de4ad9cc036e690f2c34ea7a6281 +55d00fc2d8c194204304717a6d93230b +55d1df02e9198e215d5eac8519b0c162 +55d48c111dd4a3d8ab88f3814a9bc717 +55d8dadb8af2efaa1a3e36a2158bb8d0 +55e5228f790bc77218a9d280338215c5 +55ebc49b57947f8b4e4ec9b425b0ce35 +55f76c40827768b4d531135fadda0e0a +55fc71415b947b98c25935f439e8ed79 +561465874d591916f4c26b3249f79bf0 +5618e7e484cada2b4ac626d9e1842e17 +562c968651f2ce9c3a5f45d6acf69357 +5641903bd6950f58e1cc34e51077bcdb +56423c32a418cffb7cccad6752fb0900 +56521c2832d9b8be1756149528d550eb +5658348da94a7802a51db34349641ace +565c0654861f82372caddf80a9c94b4a +566d1fb87d3b501f5fb35d66ac05b157 +56a4fe5ddd0237764ac7acba4aef4465 +56b5a6efb0cb9ecd8faf33c441cf4a3e +56be3711909e0fe3c7eade2b4c1dad6c +56c9aea2c3d3af9611caa8ec8723ec90 +56d594010a44564b9f56c1247c4cb151 +56df6d28ce2aebcb3a6c1d73b87ab307 +56eac54249261ea92d37cd02b042e851 +56ed265197f4b5ac6088e86ccf6c74c1 +56fe41ac27d8dda52653d423f7a52e4f +570ab3d90d33b755b50fecda7edaa505 +571ec6aaf020606c967cbfa4d956356d +5728788ac7fa62ffd93e560e2da5f984 +572db1b4a4c9b443cfc5fa840f93421e +573418b8310306bfb96b1a00b2bcc752 +574c52c4468ee64317e6d044465e9ef8 +5767438e9bca8401002039d1becee271 +576aa5ec7123a01db1f3af05fe093d77 +576b1cd43e6bb5ef51201eafa499e30b +5774f5eddca651046e2aa7125b07d349 +5783a0266226e8cb1b5d8b0248338e35 +57887121ba0fe01b94b6309c6eece0e1 +57b485946faaebbd704e385ab8ea2922 +57b89d6741f4c232fcc254d35d2c35a9 +57bce3145aa12a1cfa8daba6a6a711d2 +57bf22a4cdc5ad9129a2347eb6ff4129 +57d65d5dffc671bd461cd4bd858dcd0c +57d77f6d9027a90c9ecafa4e260285cf +57dd547187e8a1222c3b928b68f73e3c +57df8e3018e01b55a32b759ac6d33a6b +57e828985ed1fa1cae76fc6ff9b53e51 +57f49826b06d6371ce8d28a272060a17 +58076a46635c9bd0651535a3973c1db4 +582233eba360beb179ec0df41d1b6ccc +5826875b97c16dd5b58682c80c50f42f +58292e501fd02aab45ef0be7924d985f +5829b9dd62acd14b9319c666d77e6960 +582be88d962fedd223b0cf5fcf386b74 +582cf8181b64a96b70e83e0e1c4100a3 +582ecb864f0abee34caf90f5fa6e7bfa +583acb7cb53e976e61f9c18682a5671c +583e6c934aa8d817cfa8e994ef087f68 +583e997c13b01c7a8a863060b8a7f02c +584152a170a5ca4a058ad84b16052a2a +584d85712c99dd9d1e0e82347c0c7ab5 +5853cc4e6edd3575567816c85f78a9c4 +585da9e49f29d79ab50f8ef7f8f5cfe4 +586322162410df75be0e9d8f4b2240d0 +58640215ca0e57219940892e8122a1e0 +5869b6850203f178ae186f938e062e80 +588f077e41358008764fdb8debe14c15 +588fc18bb746e9509f70f0897845c9a5 +5895a53d383d6998f297f3bc6a960372 +58a7538c925cb00b162946067829158b +58ae0f5a8f9a240cc1c49118acdbc3cf +58b53fc704e893c74cfcdb92d867568d +58c7539193c2471a41b8a880bbbb6f4e +58cb93a9dc19497f612baa3b865622bb +58cc06f180a0a93fcb6a80ca1233a617 +58da7ce4451faa0b05bf7986d4e49f89 +58dae756458c64c73c0f0d836ec854a1 +58eeafd8480863c5e19e19b030c6ceee +58f1a7b15e6862434b3e89a0c9b2bde3 +58f7d1357256e3014b1651fbf6d875e3 +58fc2d69fdf8d25ae21447985a96254f +590a646454c2f568de980cb1042303c6 +590f539312af87c342c5715c38186845 +5926d847f730127ee3e768400c73db27 +593810709faaf64a22cd5f0154d4cbfc +5952e93af4b36f7e4b263a2a78ec90e3 +595c6b2942cae518284970314c631e8b +5969ae29106260f3aa9c5e651e0ee93e +5980662bf29f5fca708d22750ad6a3c2 +5982cc068dc6b3e12191bf772afbe6d5 +59832821ffe9bded0949e3ead995b975 +5987bd6f2e7161676a9239cdece1d559 +599ff0b78d98b33eb116058a39515345 +59b48eef1d7337e86050306ffba149f8 +59ca9741f46d03f97ad97a3684c7b64f +59e2f769b2a2345857dc33dbc709e41b +59eb05195da84239aeb4bfe7cdeff8d2 +59fc555ced88f856b836e3088a988d32 +59ffcbfab2fa5f698dad8b17ce1629d6 +5a03222e7a3a9530339fb395774eac0b +5a1056fb8f70147f53b8873c847edb98 +5a1320e3978497780d9220a72b18fe20 +5a2c4645e141507b540bf9edcf2aaea0 +5a3e70c1864548a3e3578b212fc08a49 +5a4613d601defaa66ac6d20ef8eea63f +5a6309f41ef7205207a062e2229e3cbc +5a83edf48d92aa397b194fdfeea136d1 +5a9213d963bd77e89a90f82020ace5cc +5ac7d704288578b0125fedd699229c50 +5acc9b2dec501707683260deef4038b2 +5acdb532901806955fb0355111ac8d8d +5b04fec88a7563dad32ace45a3ac958f +5b0d3e5904a252f2317c7e6439e73967 +5b16117e51405d7b7acb89087a25cdd3 +5b18b7634af98f8578481707907f6aa4 +5b221869c9db9108c271067876f4a745 +5b2338c1af8eda7b44c7bceac6741f65 +5b25d66ad0a30a7e4753043810de48bb +5b3390e9290398b57d6399800d912ec8 +5b36fa643ecc4572f4fdabddc7287c4b +5b38de20f99c104d2259a55fcf235a1b +5b4094a38a0af052e3823c0c52ebc012 +5b51142ec35140d5a256dd6c961d7269 +5b5ab4de1adc4efe4d9e032e862bdd34 +5b736a8e6d77c4190a8920d6637d54a7 +5b95a4dd47a96b9b37217f33a10603ef +5b9c04158103c10253c82ed125294466 +5ba27824568625177fb2fffbb59289d5 +5ba32683e0fd487e1020ae2b901da1af +5bb8e9135ca16128bc39a35e24ce79f0 +5bc18720e32271043a279815f92a13e5 +5bd477af50540630604b97e82a9b81c0 +5bd71a3d86bdc67144126a0791cf7ddf +5bdd50d34452df896debd1163317a39c +5be4a34c048a4d4af2462679b7886151 +5bf7940324ce33e1a1763b33c1ba2561 +5c07f72242fed4667e15929d79212a30 +5c214b7b6668f5fdd4c8fecd060d450c +5c33bd35332302a490439408e67b1a41 +5c4189704d2a4d7a27200c5d8825db01 +5c4367f4a09dbf080316a72e1eb433f1 +5c5fdb12689642008d9c83a05b100eeb +5c6413f3a0fb883aa6f99e36d0d9ee19 +5c68458b3b82b61b0e2f73a224eb90c6 +5c69dc4eb4772472244bbfac6b453ed7 +5c6b6f03713b975b5bce5bdc655f9bbe +5c6ff789510ac735385c86f24751f095 +5c794610a38772ca29e1f967da93271a +5c7c9bd6386b6f0ecc47838350b7e4df +5c8216b54fb688422cd1bb8a37f78cd2 +5c8d221e52e710861ba22286f0bdb365 +5c93914ddde32db9d33fd9140c19e8db +5cb081c432c958d6c626616c78b3d7d5 +5cb13b44768841a64ca78827b660bfa9 +5cc579f9e9700a4c1effa14857ed5db8 +5cc6f39100cd08eaa53c5eccc5764343 +5cd848d72474449f1fd55e0729deed27 +5cda683e72bcea74c7c6232fc97c8892 +5cf058cd6dcd7d5dc6ea1f7186784e4e +5cf2e93c5933fd8acfb0f1efce402300 +5cf61d3aee6bb860a6cc4f6dc1a990d9 +5d2223dcdfc8d15becafc06c143d4d9d +5d2ce37099eff8827a703e7ac7608722 +5d31e9c4e37ecba312eaa724302fe6be +5d379f73d7f9d9564d0e52041dcc94ff +5d38b1033811a3d56aca7459ba75218d +5d3d9b6e562840170d74c09dc0aa037b +5d42c60edb805527013323526101378e +5d4889c61036f69d6b9332a1754ea9df +5d62d8501b09ba5fb588312565ef13ba +5d72107af0556322265aa33ca80bd2b3 +5d7a0f4877ad44dcf6c438715e76a508 +5d88a6793c7442967f5f19ca735100f9 +5d8d2fe6a62bb95cd5cf23a187be96d9 +5d8d6b0a725fe7d7c417f2f8f7a5b3fc +5dc854658fe0ba5f48a9b9f42b753c49 +5dd40b0d70d9c10903cd7bff38ad667a +5dd7ce2c734da6e3c815e4875991678c +5ddc39bed89b688d3f2ccc2a96167d55 +5dddf025c277f8f20e24bad55946ce91 +5ddf72e4c33265643c65248c4aeecd3d +5dec0a9c200b1089bd299d6b10612768 +5defaf5a6b65667ce7f7a0df3dd96647 +5e0b62ad4d8ebeddffa254a814752030 +5e25df58da82d8ebe024a5b488638b05 +5e373a82585f532b3b02fbd3deb966d9 +5e40d3d5489ef64bb433a7f89117de12 +5e489ac8c8141dbc7e792b86a5181a23 +5e4e52a4dce1f4243a2b0c934a08eb74 +5e546d219e368486a62788be91766ca2 +5e5828c277f461d6dc3fbb1eac4e2fa6 +5e62e3846d5020f7ae4cc7f756992e49 +5e69c8ee99daf0bb128bde3474242a51 +5e7069eae0931f5aea5ed96692e3d150 +5e7c161c61cd31c6df36d00dd607dcd9 +5e7cc11489d88b567b44fcda4ab195d7 +5e8862698a90c345e54f9672d9f174ec +5e8993643aac597d12797c2b9d7626c4 +5e8eab2b0a14ab7168fc3950e1821965 +5e940eecbb2867bf7ad61a9a3268d2af +5ea5e1e5ca41a5f20fdb57143f824476 +5ea624022e8650dd855f03557c1c6ca7 +5eaff5503e24d8b38ca1f1049fb13e25 +5eb326e42e00caececadc8279cde8e37 +5eb8f811664d4fa2fd52ef8969cdb15d +5eb922d6d70aec40cb12e175a1c786f2 +5ebf23f8a270876bd7f7d9aa826d683c +5ec74ea3dd61e01f974a7f5dd37630de +5ecb9d33362b1965bf6e6f00c2ea8836 +5ecc3315ce2e4e8e2bf609e7a914ec86 +5ed2497b90a6d57cce0a32460463503d +5eede014cfcc60c2e794e53828faedd6 +5ef1854316085302b05a03286640d846 +5efaf28f27ca46a32063d6edc1fb5464 +5eff23d872234919dfcb99ee8a8b361d +5f18b7f3f5c50fa3206a81e3004812c1 +5f236c3fd1570fb8b2595307a29a152a +5f2acdf256edac9ff90889662e05cdd7 +5f2b6525c97f8f84fc102f075f050c97 +5f2f82eed3736b7a836116ab250cb8a4 +5f2fe3c6bf6aa4cf419a88e0a0d3d20b +5f4e3ee4cacc67bd530581ec6abc2f54 +5f4fab06d49eba23a049b153b361d831 +5f596ab9ed21d27b956f6d7ead6f027f +5f7073a589f2aff758b56fff8f5e1bbc +5f785a536b7e63d025681ae286dfd289 +5f7abee3879895b16bcb513b900cbb10 +5f860f15a5aebb2333d85c6d81f75d69 +5f8c3e69d84a5b1941aee2cd774d626c +5f981ddb3638bffc5606c6e9698eca8f +5fa9f80912067078eb8a9a7ee2f2a0c1 +5fc0c318b232d8f7a433a21f733bcc07 +5fca1024dc5ecafe3a9909d9e29e912c +5fd18bd335b2395cf1a1a2a8ac41e2af +5fd5bb6f90770921289563ab8d3bedf4 +5fdf234d9561c7d414d9e8af9239a601 +5fe060febdc7259aaab62f2a1f4e264b +5fe29f8c25738eac3811d504d75e34e9 +5fea6c385afb3faddf0959cb2cd68262 +5ffc47992bcc3f5915556fa1ae7487c7 +6007da0e36a991b321912b852bf8dd25 +602416b5be0aac10c0471216330f975d +6039bf81a0b022f84e114d73b166c792 +603ad960bcfccb8a721a3c7026a27919 +6058bdddad03668fa523c7931fdeb335 +605c9c078e7e823cb56701ba478e0080 +6060aa01de6af317fa3cc75139c43c94 +607288ecdb1e573539aaca82260591e2 +6079b87437c393031f4c9df8099e7757 +607bde945d2c03a12739262248d4e696 +607d5d97b27c309c446ea4c203546b94 +60b39f63b9c6cd686e51ea0d2c5ff28a +60bc69ad0e0f49e04beddff510fa52ac +60c9af41701a3290780627f629ded2ea +60dfcbda60d8ae3fca137d9f445566c4 +60eb79cfae53cf6c1e7dc1d941f1faf7 +60f7a02a2865786654faf88f50402910 +60fcd53fbce2f237ce81eaa7bdf665be +6102e512fa635b202ab1a17bc0e37f68 +6104f54356a4bb70b529d43f22785dd1 +610a4102fd26e23d7b8efef8c7886efa +6110ecea46c8d1ccdc9a9320b2a39a48 +6115bebf6de788ab451369a45886080f +611fa08b4db6ac25e2231d3aeb6eed33 +61265fe5755b17757a5778579f3103fa +612ce20c8108b056211bafd881043f48 +612e75f1a4d8695e2af1b763338aa60f +612f444810d76cf6a4f9f4922a4ed3c2 +61456de598de3d0d3a07d22c44601ce7 +614699c530f6d724d1146a1bf039a36b +614e6cfe88a2ff5e81413bb04ccbf529 +6170ea455bf7fcfc86aae1c18cbcbe7c +617d82d26aaf22a3ed757ad94fc6c7e8 +619337f3d3cbb88693301c80b857ad1a +61a2bf501ac7b8807bc6d56b2b007044 +61a80c9c688507aeab4f3689c262c20e +61b301bed382cae7c442c05294bcb179 +61b4e05182151e413c5826997a89379a +61cbeb668af01215963d63da4a90cc39 +61e1b966c34891372a1a51a0e893c04f +61f60f682936ea04da70bbc5baa7b488 +6204c25cc866514d1971863c522756f5 +620da583c592279489fde7c14b45d973 +621da52b59fa07ded0a805685c453570 +62203c60ac72177dc83867418d1a882d +6244f09a33e442edd511a7b230ddc97e +624ab463cca6cd36d4635c076d07afab +62562a8d9cfd52eb01f467f301c1b657 +625c8fb34eca0190bea98d8733dbb5b5 +6281383fe4b2c2e2f92111c422b8a277 +62826b28dcb4ab9981d70d6d1720cec1 +629147b5354ea4185e2e9b59e6ae663a +629deda94f10216093f0e47c36b950e0 +62ac56d7698f70f34f1c8a23a8cf8082 +62d7fe43aa1fdf9102c967fb25885dd9 +62e40a8ab8bb4d3a63dc95d3c1b9ae8e +62e8be6160499cbd291c2823a0993df1 +62eefbe79bb3ac66b0d5b41c41a2fa39 +630811297719449f868f38ec6caa6bd4 +63087321a5dc554fc977aa015cfe520e +63096c2d473deef687957c24a3e2e3ef +6321d40bba42b5969620591281748c55 +633038e160df09a560dfe18bb2a6d451 +6333bda6266a0081ff66be5447862a24 +63362379b014285bc7518317d4e16dd0 +6349546dd726f3f0a3b8adcc4a651ec1 +634a516542d6e26312a61bcb1df4f882 +6352f25f40e3dcae6076ffcf0bd9eaa8 +635879e588fd37887acbd15fd75aa94c +63634fdda5c4ead83f0c11977f54ec4f +636d73d61a7bcd6f623bab6897674562 +6377e316f835931a0c7de50deea85fd6 +637d6c7b46d9b79070282a996ef83775 +6380d4a78cc61c2ff15a048a0a9dad35 +63a2b3933225c3e6eb9063110bd631a7 +63a534b9266b78d8fa0fc95c840801dc +63adae5ac7f7c365d910b7249959ff3a +63af54f143bd08246a78d371fc78eb25 +63b153c5c88f36cab666ba885b29edcc +63c2b4443bf5e8cdf816fda7b132b398 +63caa4fa90bcd6f31aeea014e2764801 +63d182f6305f4d24f34b135a4402e93e +63d1d6d239577e05168c3e572389a042 +63de5c59e00f37e4e0df5a136eba7a11 +640696b49608d4102edf5d6009bbd958 +640efd23f7321eef675811e0870a659f +641848ea745a0e7847e70e8c26b8129f +6427858fd8f0b8efc517050fadbad4a2 +643d2dbcef82ec89c8ec42ffc2529835 +64427685eaba6f1585b3297dd24311b9 +6448478a76181e4695c429097af6a665 +647d81faf2acc62955c48fb78f5629db +6491fb19b4cf88008df4eb48b61e4f17 +649797b14f0de3e5631e065cd38f7625 +64a1f5d352d8c918c1623f17c9f7ab75 +64a41eb11cc6d6267c3eebecfaa0daab +64b2b89b50bf03bdea295e02ec79ff1c +64b6473850cf0e845ee823602ec34b9b +64cacf080aee9c8b322c9342ecc786fd +64e3c0b34fd848bed6b213aec47812c1 +64f3fdeed231fa70017601b5b5a45a78 +64f9b85c23c7c7dba2b36cd4912f8b4d +6513c990b3c71b170ce45397ad15f3b2 +6531aefa01403553dca07f182dbe8c97 +653b91f4e26a9297f910a38b9a5ead03 +654552512e3ab97b78212bb1f264a1bd +65476e6c602c7cf8cd66e07408a69e9f +655a7968eb4262e5075ff3419082ccb1 +655f84524d649d3c499f8819cf22294d +65682927dad57e84a4ef2baf9b1354bd +65692a9c5c186d16693a786c738ec203 +65708b3e7a799f9fc5cb6f8d188ac3c1 +658ae8b10da9c3d133312e6205959002 +659ffc6ae41f101602bbe2f54d905df9 +65b7b1a45d09a4c5d46707d03a0e9c83 +65b7f4ceecfe9b90153ecabdf13e4612 +65cb6ecaca708ee2c9d1008f09d2055b +65e32c1866754ad2dff69e6eccc26ce0 +65efc873ce75474781c275f142b6c5c2 +65f731cc95c6368f42a3d8ef7e54bbf7 +6601232ec173da19aab59ea41b6efdcc +661afbf05348392a0acd1e96d57582b5 +6621485f37512056b735b4af11bc438a +662769cc2a752ddd4b38298f3e210af4 +662d471cfae58fae3536b8a53ec1f068 +66343b7ce9c64da8a2ad0fe997d2adb5 +66462b00d30d1ae53d4f3567e3d3c6c3 +664d256ad81cd524a199809b057e4402 +66616b298fae83dd71b6413bfab6f0fd +66629b1be1fa5b7ddd18410b4d5e72fa +66698f4268cba4367d2f0e72ef7a91cb +6675e561b3f6d06d7fcb62340a31c83d +667a48d4828dee23569766930afdd18b +669008e78dc374b15ca22880cb58a35d +66a135ea7614cf3c1bb138f6fce4b4c6 +66c24965909c6140b9c3818403f4323e +66c2cb974abb47de3071977433dacb4f +66cb021716aaf7c5b41a5ae72f56b6d5 +66cd330328e88f0d8987a3b6b28e7967 +66dd82163407fe31b369e194764a1202 +66dec649460b9ebfdb3f513c2985525c +66f5f326105d82a594be876d13832132 +66f7bada9df1acc7902693a52ad53a84 +66ffcc17df39d1447e2bb5e726108ea0 +6702a6a16993cbb16dd8851a19b0a0e9 +670678ca9f5888a78224b10207d7acaf +6719efff04710393cb9a9fe89fd6a734 +67222e0fd5d200d5af2c4975cdfa331c +67225abeee977c0cabf8cdab647e351a +67416c0cd13c65744d97a7e071327f15 +674c1a2c770462443c55aaa60c523b48 +67589bc52aa7b65f7807bcd08678fa5d +675b65bfbda604ac21201753f40bc73a +675bd35ef73ee3de7aeaae6e97c8ab01 +6762f31f8f1efe35a9917ef701df0686 +6778030225741f937c674fa87bcb4544 +67813b4bbdf7f45e91093675b96bcaf2 +67a4b54f496bf53ba9eae57acac771e4 +67a8d8d260ccc87a9273d25beebd620f +67b90a45198f2b89ec43b8f274f08132 +67bfb2e4d2fd4f5a5e4b5b984a736fbe +67cb19e0875591c86ffb2a8fb81bc7cb +67d81c47d9b639097ba478288379803b +67e05a55575c924529ba7685f3afe4e3 +68032a9390bfea00c2292e3a5ec4d7b0 +6804ee2d954ab817166b5004fb4f9e8b +680932195bb0218600a153a73b4800cc +680ac0bd33c00b128fcc097fd9094082 +68153c9a43e4b7ac60c527239cce9908 +68493d7de7be244fa51611aa209e9702 +685571b895bc5eae4b94bfddadc807fe +685c9f28725a43122dc08e7c70ec1d81 +6867476756abc50656c7bc13821fa470 +68789d81d4ab0e2858e9d87ac4e0d10e +68815dfbd032f3efec2e6db6c6ad60d8 +68b5411a5ab1675eed9ab842a628b540 +68b801b5f2a106acda570ed9a91e8fa8 +68ba2001dda568b47b1b9fbb5ce22442 +68beff167d755d93cbd8912b3633dff5 +68c90fed52f303a0cd70d587f9473070 +68d3ebaaa72add27052e0a3d7b57d596 +68d4655c6eaead19b5ade88682c58177 +68d7285577afefbe4e904644e8eb2bce +68f6fc06ddac7a53869bf15663fe63d3 +6905f79ceb335736410e172d2f75f8c0 +690be625b6216f59fbf07a474f6c057a +6923685d130e872b950928d5fb1060cd +6932081d12a9874acb3588bc7468c0a7 +69343ecddc3adcc140172f0e6c2773d8 +6935f68bdc917c422f68ccaccb80e91a +69369c8154212897a5f5a7f4aa63f3c2 +693e1da36f9efee4f0ccf515d4c8e7f6 +6940ec46cf42ea5dc91afd6f75b2d025 +694277e6bc726ef2fdd8c7b2c40b39bb +69439db9df2fc4abb21e190f4f68739f +6947929c7620c365be210752c5aba2d0 +694ed0d579f40a86f344a79c9b9a9b13 +6952b3475347bf79699c71561d61f05e +69560bc772653fea9ed178932546624e +69836eb4ba7fdacd149b846ae5720244 +69838aadeb7409b42c9118576fb24f4d +6991489996c108e2c343099a257cfc11 +699300e022d7253bd0e727e8730da115 +699588bb4c8f70c9d25c7fc50fabfbd0 +699f89a3f5a65b28e13f03900731e419 +69b462dc62c04a6312b061c8bea016c0 +69c75c243043abc72e81fb73e89d795f +69c9f58d295a39429dff3eaa6aa96138 +69cf8c108f18c78f2332f9e0b5a8f7b9 +69e0afb02bb43526312f580d6cca7b5a +69ed639e52393c8237cd7e7bdac69cd1 +69f74b7efce1c67f429b79e12d3799d9 +69faa2d0621945d29852aa88ee818f0c +69ffd417e3ca8f7afdbf2f3da47e8c25 +6a011daef4bb92e6c59f0d3dfdbab16e +6a0aefac4882c33f9353aab44da449d4 +6a194c42fe304cf7c4c0f7d002e5e20f +6a258aa5e97a1506108b3a2f7f6aa519 +6a33325d96068e2727658182b6bfffb9 +6a34d93d393e2d0816912e7360acbcd5 +6a4198b0232b5b2a7ee6083800775aec +6a4bf37edbc2ff7cd509e1fc36408a86 +6a4c2ce94bc9b3f27b5c994684bb41e5 +6a533e5e2cb45a295a895c3aba5f5cf3 +6a599dd43239b694104633a1f242ace5 +6a680c731b0947e59f929a0ce2ea0fff +6a748ba62a91d5a0491deb2b51a613ff +6a7bec68b9866a411251016ed58f6a82 +6a8f259d74d56ad313e17570a5b6d749 +6a95eb082ac111b3d92ced8f3abc57f2 +6a9a63a14e7303407df7926f6d14c9f9 +6a9d85e1f664663d0f43e8a1450a58ff +6aaa87bc4a98d2ea698ab67fce0abc5f +6ac223ddb3c2311cb31d484e95af4ce6 +6acc94fa57434920ef894ca69e220b89 +6ad17398dff1a06442d64346b91f309d +6ad72b5f8b2d39f8eba27f69588b43e1 +6addbd85fbc2011886deb1748eb0bef0 +6ae4dd9f237d82979ed040515a4be637 +6aeb0ec75896adf09d12e7758b2e5ddd +6af399fd52dd207889b4702f0dacfdbb +6afeba3e3749f630b1854b1a9a17ca63 +6b0f880a418cbdce9e01a39b84e4449a +6b1a1235182922a9d0f252d09c91dc58 +6b1d11d612a4b1bad63946ee508fdca8 +6b2af472f4a9f02a94ff466fd1f4910d +6b36a553c63ffc3cb813008cba4bd3ee +6b41455a79415d2a776deb40e4503812 +6b47c76ca7f8a1d122fdcef44be82a03 +6b49716b31783f41c86b52a749a14a00 +6b4cc9a6ea027820b969d46df72f1cf7 +6b4ddf1630cdf501cd32d4d9cf87d792 +6b52dd1bf1e0810edf300adf36cc8f1a +6b576027375ad4912263e95319f351bd +6b5cd6354fc8415864d6ef202a0698f0 +6b68bfa70fa672219dd6025b1fccb2c6 +6b6c87af8ccabfa682665994205372df +6b7985e16185659b9e0995421ae805e6 +6b813995c93e0b6c989cda9835e73588 +6b85552528fd066ae7e448baf9d16551 +6baefac470d2fb9650c82f22ee7307b7 +6bb1a2d7bc222874394465656634211f +6bb245f6a565f81c91247b5ecaa00438 +6bbba2ce24552d0405e30c31f97ae183 +6bc5a8c53065daca7dab7b84671ae2b9 +6bc94d460ab5aa2785d764ba5e984f39 +6bca14e7973c2747ee070ca13c93a6f6 +6bcf48744c297423a580f566049dd3a6 +6bd046fd854299327543bc69a1c68e7c +6bd584827d4af2418c28620d571af37c +6bdf035bcf4096c833dc034158a326d2 +6be8bcfc738dabb34f0f8b10d08aff5a +6bedf956ebbde11c2ed1205dc662b1a9 +6bff4c507157193b15bf94b74c41a919 +6c0656fe60806292a574ad17e12bf10e +6c095e131108f4fc8481b37d063299cf +6c11c0b71603b87a21aad1b4cd09bf8a +6c183742c4b3c0f3280c375700aafe9f +6c1b54e55327759182fe532f26c45634 +6c22c11e226e2303a07507f3bc1d2e13 +6c2ce994ad20c8275e0fbf02d89086a5 +6c2da7e1c96506cdfca7f43cb53778e5 +6c3b78db6cab38a1b74ea18158c7c91b +6c3c2f50de76d384db472058b9324ca6 +6c42ed014cfe409c1c5df3a5fecc5c9f +6c437720d358fc5e70f3fe04eb284f80 +6c58db6194f30ef202d61db2fea23ec2 +6c79b8187c884423b70f319fca4570ac +6ca3bf581c7649401e06eb1a2dc1538c +6ca58b93e96329f11a9c89a1c25f9352 +6ca78dc554fd522632899da86c5527af +6ca88983a4f76bad58bd8729f4ee7191 +6cb07bb9a1c921679cb83e80dfa32317 +6cbb0f051f8e30b9b18874150e684c92 +6cbb2ed9dcf53b549ced1f07f5eddb79 +6cc2f8679383c5e631ac8aa3d73506de +6cd1af8607c639e2ed8fc3735e4e52bd +6cde5cece0a195efcca731571712e301 +6cee45930e5c38f15ecc3dd50f7afb19 +6cf98f6aa1e26e36de6203672c906b20 +6d20129ef9b8a5f9e3aa4f2a6c096ca5 +6d223c2cf39110c925a5e57299ba3969 +6d24a3c3677d6afdb6bcdf72742cf685 +6d2a265523f980f77e65782c683d8bd1 +6d2f27d77e9dba1205f93c9264729794 +6d36c68bd327091837eaeb36f1ab1fa4 +6d6c57b249fe558fd1a2c8062a93d037 +6d6ec7efde32de1a83fb5d78a3ecf36f +6d819be205ed32e3a0f1972452abb110 +6d847f392b61072b77ce8cf12b8ca550 +6d85bb52e0e59e7843708fc23c423f48 +6d889501c6831d583eb6299a9216f967 +6d88a670d1dbfb786599b61c1cdc85f1 +6d9689364a74f08bc5ff9ddb4db18e9c +6da9cd459cad0c84677caf1485ecd2aa +6daacbe42c7543da2e45e3019b360fa4 +6dbe11599373a42534cd4f6e12c782c7 +6dcc801cb46410ba5de08762da37e7e1 +6dd7cf5b184c18c56b2147bdf474cde3 +6dd8d32f4c530c270f422e2964bc6f91 +6ddc61e78f334ab44c443498437cd755 +6ddd13c1fdbb401f7d759038fc7db9d8 +6de026bba7aef061988b789addcf3097 +6de8ff2d1337d31c0744fd6c44fab211 +6dea6bf9b1c64371f1d8d7d8e4d25248 +6ded1cc6f2ea25bb40dc96717e7aa549 +6def93735e9c7408348bd35c8ab4e6a0 +6df7865e6eab05b4d500d9fbf9c7762c +6df8327b5790b49dae58f1da9549ca92 +6dfb7b1f2dc1bbf134275aa55c8a367e +6e04d6d96789908b58e651a107fe243a +6e05bb474c838efc27362dda1b86ec2c +6e0806f1d7aee27318c2d2c791a6bae8 +6e16bce08954673cce93f29beabe349c +6e1e6463dc30afcea925638d554d3042 +6e1f3766c5ee8676d464fe9f69d052a7 +6e28ece32e4431304f6a03f4b15ad648 +6e3bc8ab7ce3555252e55310bbe47213 +6e50518299d7972ea5b704cad45ca940 +6e764649566b6ae809b6b377d890dc23 +6e7bb01f18dd8c58447d903aceb73e0e +6e815f11033377be86793d24f456f12c +6e89896e16d53d1133de7a21a7f09139 +6e8bb7488b1055aa04f8ac4a260f221b +6e8be2a0b34ecaa4396fa4db3d2b547a +6e8fc28f4aa77f27a09143e1dbd5b0f9 +6ea1b519fa2872f42faa21925d52a76a +6ea9a1915b06dda9e6394e344a6fffcb +6eb70d922ff895a6f0ef1d62afcc4ef5 +6ec0219bf300fa384aa46da073b604b5 +6ec54b38562a035d5523096fd742d4d9 +6ece6b571b3e5e2e86fcbc1ad389aebf +6ed85cd5a8a6168b288363732e97d4fd +6eea22b5be684118f107ef9b08d6d3b1 +6ef7e854a9f3577384603ec2f1835dc7 +6efe45f204e932fcf5665708a42dac52 +6f0845310a3b021daf806ec681515a22 +6f3448b874844e358cb111132b265971 +6f3dc161a0043f6250ce12b89a1bac4a +6f405591f8ec9930caa258be88949f67 +6f409d5d0c650b2c4de9756f3aac5c45 +6f4205c2dd865860088e0ce8905062d9 +6f4e70900577018ea3e3063715c66fb8 +6f5365e2c3ca54ceccbae567ce45f827 +6f537680f3fcdf6f16a3c4e2646aa971 +6f5d4083f90892ec4a81d35db8e79857 +6f63f3578e4176e3428fbde94da4415a +6f766151ed5a7c412f6671191118a9a7 +6f7b73e40faa151cec7170bb19284662 +6f80106d3f7fd6dc2dac90430596bf73 +6f881a9850c3817c8cb6b87d2365d905 +6f890692c975bce5d1ca9d1f9bbfbe86 +6f8a6533a22d2dff2d15041b3e3c01ee +6f8af267f98129d2e70b162ff86b13fe +6f8ec86da1bf271bb6645d974e1f3e9c +6fa0629a1a658029bcd0f3ff3eee37e6 +6fac836ec2ef6d4bfaf71774d23749f8 +6fbee6e7499454b8582d693b340af04d +6fd11e943450e3d8e17355d620010e30 +6fdc62b27218fbf6d1b25336229f06ea +6ff1bd57490132bd7421d219270d2acd +7004c1fe7581195144e631a73267b6e6 +700990d88227f87927d8285b39ec8bdb +7023aa757a20bcbf0adead986b5f97b6 +702913616a80f9d7d965c587a41b128b +703305c1610767f38d0038b401a9402e +70446b1494e44254e58502ad41d228b8 +704a2cbf1e0703890f79f7bdfd7c1919 +706060f959e0bfcfa28d5670b48a7ed1 +707032d27175e9622ed99ab8d93adcbf +707f71941774f0ed734108544ee3dd88 +70808521d8895e380353e2d744d6c8dd +708af33611e910f607ff4586340394d9 +708b254452e5a864122aa323d277b58b +70be6f1e87f4260942dbb17d51100900 +70dd5d74debcdab4a14eb9f804d67491 +70e2f54edad0c93e318167254f0b5bd3 +70f20bb5819ba9e3f054b872a2e783a3 +70fd67b9f60c4d9dd9913584cf489cad +70ff181c1b91f000ba713c1a6a3c7d73 +7104d4a5b6286ca2f0cf6e8a8c8aec5c +7120ee9563e6e887ed383913e2b0c545 +712cda63c114904b1ec244a44f4b1247 +713189116a1a3579928ac9a7629810e0 +71356ec118384deb712ffb0ca4870f9f +7137c6863c6af0ba132092b38a2fdb8f +713cab7e60b8593ddeff3bf9be85629b +71473562242a62b9afcac342cc5c711d +714dd033ac402b8f1c7abbf95e651069 +714e3676b1e91a936486f4b5de23e520 +71550b1ef701a4135f74f316c6339761 +71588752f5b531e78d800d279f7d15ce +716e537f1e3db5838ccb35d847c2ab4d +7177c9d1149263fd5b10281e12db97c0 +718287c39446d9f1d98a4921d4275bd8 +71a500f1b8c1cf3e041886b42ffd4675 +71a650bce3f743882489350447033cc3 +71b63c3c458c25365e56f0fa51958871 +71c2f174a1786323399aaae553f95bd2 +71c62d071d2be7da1767ac6e9e00cf2e +71de1974b8d5fb6761f1ee46e19ac090 +71e9332bebe8add5e6948368af779dc9 +71f1cf30c4b75577c12f2792cb5deebe +71fdb8afd356750c7ead409f91a81da5 +720796ecf00413e7d98e355913cd4071 +720ffda368e1c77008903b3a9602443b +7212e22add77ae1964f2cca13da9ca78 +72149fff52a014bd76f48065c48d7643 +722406f7a6ba4837a6b4d1a43aa8fc1a +7227e0a0245ec6d3c839455480704fdf +72513230e1f6f2b3497bcfc327c3d6ec +72517468d0043ebbb9c3b7b3f70cb77e +7255988c661e190f9e96fb72a71c835a +7261b0519aea76c76b9859c7e2bf5db7 +726fbf7032f2e0979dd9ddff2a882a66 +7277df6ab5e974729dfb7c544c6269d0 +728061b7598fa22c9b58b712f2def5de +72896fde89ac4ab4e8485dbca4da32b1 +728b1c08da47ffbc11867551dc0bf2d2 +72902b13f5b6837a901f8bea5b9f93e3 +7292a9c0872a1a8da1cf94f9ab8c380d +729b45fb8f6b11ea848987b4fc2b092c +729b936e5570d9d2f77c405b87577bad +72a0d14b13c511428f3c21cf6b8eb41d +72a27656eaac080aaba8f8ba43245c3b +72a48773cf96dc03f8005c0565e1cc6c +72ac448a6b44d8a241b0c0ca0da872ee +72d0d974c96f047ed50a1ca8e8fcb716 +72d5a035388342b11c0ca43923a1e06a +72e49a227de9116cea4b40ba27829f3b +72e52b9e0c31895391f097881301e031 +72f2b2ad49d7984eba4bdf5b8fc6487d +730933ee15df0a61534b9c29802fb4b1 +7319fdf632d2dbe44ea270324f929989 +731ffa72463307d0b70947c2f67d5157 +732700dea9501a8bf4fba01ed35db995 +73419509e7bdd49fe140500e41eff80e +7350f253d487372e4b33d361a356a868 +7351536d0d85918c9143175521100165 +735b9971ce510310b148bef9135d5e09 +735c812dee80e35d3a2f7c4031317934 +73655c5bb1e1fe1df5724cca2d6e2ef5 +737907f670afec8f6bd9352a3c55bf04 +737a0aeb1c5d117980919909819411bd +737d0a683783e72a7ce037c272f7c225 +73a98ec28a4734d3bf79d5bf189c65ef +73b02b54e4d8eca327be1be4df3c1b89 +73b9a8e7288bf0d7042e3a405b67670e +73d542a4be64f0c86faa6fcae31aa898 +73e4886b3e4a4815d09f214b31d68c23 +73efd2e835927a1e1c83ddf7e2f85c4e +73fc6d4ba44edd794b57279bc6f74723 +740305d9d712bae6322578eec20a10f8 +741702e401af1907a8d56210a30f597a +741f14c9ea2ff9d735a5eb472f1496ea +741fba1cf6d09deb255b1f4821da535b +7425dfddb4c193ffd3101153e4bed8b1 +742d59cf7f8e5d57a0be5d31cc37460f +74415439467cc8b0bc607279cd7dbcce +745c85844341eff2fe5aec3102dfd2ab +747be79e71896bd6ab3063518cbe6858 +747c8f7fbb766cf34bea925c9ad0473d +74831db1150b99bc7c71acccfea54156 +7487f0cbfa7beed741eae46ab134bdec +748fbb93ed099bfea7ab0fab331620d5 +749bcb99ca3596a12fc2a62c3eb6c606 +74a2163b54d22b58c44c7f7d23389eae +74a9657d43da20c2b00856b7c0661f37 +74acf935ec1fa25909f5abcb4f4794ae +74bfd9f2739691d36c28c9881c06b4ab +74c653ca3c7103b47b1b276545917f32 +74da8077567bd0420016a39ba0ace37a +74db0a9c61e1b02410e17ac199c86c7c +74de8fdade0ca3de951d3b7b1ff0a6e1 +74ed66b4aaa63bed4cc0649c675f6a73 +74f9cc23a8ef098fc2fc80ddb9848ef1 +74feb5561bbe3598225671892af8c268 +7507170c81257ca90acf14d689209894 +750bfc55d7dd167abba472c79ef59c2c +7512f70cc3eff33fd865af0a60b48bd9 +7526251bcf31678998af9b7eea9ff775 +752b1099be1d7a1904ad281b7ad1f9fc +752bb78c9828296e77b45dc67c7bba89 +7544daf9e82b62c771be263c8efe6605 +754e2bb3534991ffabf3a922d1a55cbc +754f2d376f0e93d4aefd6c31a12dc9fd +754fc11ba4740c229bb7882ad72c5a0e +7557625df5cdbcb1cd09d62292870e8b +755aa3ba2daa734b333413e62be0c770 +755cbb4142391be90042ee1fef2b7bb4 +7560c16678d3674b330a2b6e64776c97 +7576b2709c62884d85f4e6f97219895c +7576f43ed51ae958cd441bf82c5c0499 +758a13a1560e05494b5cd1b6ceec214d +758c2eb9a4d3ad467a45024fb69675b1 +75a4ddde027b3dc6301001955aedd4e3 +75c741b41660325d6d1dace262fd6f97 +75cbbc0cf0fd6ff680481454c0ddde93 +75d1796013b8642a6989cceff7c6c6c5 +75e13ee1b1257e9581d6a076ae0f0f67 +75e2f648ffa1969f8a0d35336500eede +75e3a2aa9310ce5ff8e766ca15d3d478 +760079b2212da861732039e40e6f472e +760fe57aeec3dd60ce413616122dde3c +761527cb9a5a24a768cb01dfc4dcae2d +76279f5897091c17e25fc51bf16e7607 +7637078ae5ef018b17586de90c6c5c52 +763939b64791eb725de5d5292aec2930 +764370407316b7cddc7f9c164f570600 +76495d996950621d9426144d29d55906 +7659b41d9d3616ebcdfda6708a408d01 +766150c5477185973bcf92c018bc3c9a +7662fd9d29f72a34ea573ccfc9a98fdc +766896da9a266e3ffbd5262e5a272706 +7668b00dab77c81d9f80e51bdbc2c5d5 +7677033ccef543b38b742ae1eedace10 +767dfeeb44d066bdf4862ece8cd29948 +7680c63bd21f6bd9e047777beacdeb11 +76828226764fc7efb9cace20ea59385a +7682a083995e7eea25e3843a328ce3bb +768ca2c9d2fd9d132c56d2aca86fbedc +768ebc1f4ecc1c4a034630240b7719bb +7692cb606b751bfc2fb65889463044d1 +7697c9cfc0d4b98a94ad8ca121b7de9f +769bf899b44c43826c38b051fff97e5a +76a520d48356b819a9876ce2f2ba21f4 +76ac1ade626706e17f9e852c93d3c2bc +76b0e132f3d2950e70f67c7f83bbbf8c +76b96fd34714ce3a868ea0b91ab1c419 +76c4a100e4d377d94fb59250e11ac34e +76d04d56a07baabf562d1dd0819c1767 +76d87cca50ea3ba8dd449eee6786a0d1 +770b9dbba9b80137d84d8158d27900f7 +77108d6b734f4f4e06639fced921b1fe +7713a77c7abd59590b1756d5c832df04 +771a17029ca3ef9dc2a85c719983875c +77501263fbaba677f61a76533b1cf95c +775a4919270af35747eda46e224d8219 +776f660bab365b13b790064a9f9f3886 +77719e24d4e842c8c87d91e73c7d1a8f +77738a9ac7dba7fbe37dfe2828749b76 +7773b7a6121eb15ae33dfe0c716a0085 +777ca56932290cb3a43ddb0634840003 +777dad98216a839e5f5871821a089fc8 +778b305aac4f41289f9ba4bd6221556e +778b51329881bcf03c84390b2aa7ee96 +779415d7a62df7fe1d7436a60fbfe5cc +7794ae2126d015b33ad93a9200dde106 +779659b9f9b2c2d1123e73f84e725fb6 +779a389a5a3d904f3d181e12fdad6799 +77a984c0b684503d434b210eb1211ee9 +77c355d4cbe29f8f02613ae2003359f3 +77cbdb375b9c10b8b0a9f6cf85e89a0e +77cc9498b49ad4f2c6172b88720c0638 +77d393b40c7c6fef898788382a22e39f +77d6ad4917820fd431d00e7252c6d40c +78151cd26138417c857640865083956e +781c1b04f1547d5c180c5f5fe9a270f8 +7822fe173d114631042c2bbe96e23a87 +7836f227346cf387012ed1875caa847c +784a5439e610b4710301860dd96fd1f0 +784b1f4435d9630385033d9bb0a98754 +785a1d85bd28c2a4e34240ed36643c33 +786af25a6e723e873d513f8962cc8a92 +786f7739c1ab5c73ce6a0cf1c38aee92 +788be70c8f284ab2df737962e6c5d51f +78a28c9f2eca380e8744f71abd9ce9ac +78a97e83d5c33ac062fabb0380957b1d +78ac9121b8564257a369b302b2064c8a +78c5a476724b7f10d7b2550c8b0c7248 +78d16d57de9e5995c187f52686ab39df +78e01123b0a39de94fde2754f795606c +78e26cf3fb21fac9ae4814feb5f5ca96 +78e52c06c5357a97e44d616a21321942 +7902e72ab2599b5d32292af8acf5cd11 +7911b2386f04ed9624bb62c1ee0d76f4 +79133189718beefee23d25d57a18ffd7 +79183355e530c279629a158ecda79bb2 +791de73ad8bdfbc3e62e54e3ac3c7f0f +7922e98031c2a182ee9eec575c20d00c +7928db4b992db4ba2311bca826d064d9 +794979d0c30faded03589e89a56f0e37 +795591ae96306a3d0b85fcbd0dcc2cf1 +796f00eee08558bf3f1a1990705239b3 +796fd9c12712df723aa161cd8db234c8 +79ab5625dbdc00c095e814d3b43ea309 +79b2a7e80aac149539f9550381fd4650 +79d6257103135c7f6a58f873a346bfce +79ed86a25e4af2aea1160cd786e5ea09 +79f6bb2c0bd9bffb0b136eaeb996a8bf +79f81b79756da1aea83baceccea783f4 +79fb3db472e0a2581c8b54600ef9e0e1 +7a00179527e4201bdc317fca5fa23d5a +7a090549368597f314dbed9ccc021d14 +7a0ef96a1642580df63dacbc5811aa70 +7a0f655a1b716954ac28c8e84720e1f9 +7a168fd72ea0e543dc549ab75ed0700c +7a1aadeecbe557df44bb33a7f2372272 +7a2084b85d6d8a4bf18e1c257eea9189 +7a387fe421c8b2dab4309364f962d82b +7a39c1ffc58f2781d5dd9c833d395470 +7a56b22b135936a3745bb22244481b66 +7a5d97241b4602f5a2fb83bb93e8314b +7a5f97a5bb237f0012613a6985e5e24e +7a64253e82470e4fbe39adab26414fd9 +7a663d141ea6909f9df6f7b1dc8e3796 +7a71aea6e7858fb3eda7685d0dbbb35e +7a75bbccc095fa4033891be741b44e97 +7a7a8220266f71f54f85685969ce999f +7a910e938e95cadffcba56c88cb2ddbc +7a91f80d81f517b3da8fcaf26f4a3e39 +7a9283d2f5ca1976a6691cd326a27efc +7a96e4f2822e466168ab6e6d9d7927f2 +7a9aecfcc8abaebfd139949f286e1217 +7aa44eeb4044267c3e76f06c8af9a978 +7aa54bfc087b1d69ce51034614a5d5eb +7aae2131a07a3ffba28d985f1f948da1 +7ab77b93f468866a55cddb3186a56502 +7ab9ef55267c04961ba680fd568cc630 +7ac012422969c2d39762112ac8b075a1 +7ac74b85753f5cee6c9446b103cc59e8 +7acc1ee0e147381d04ff27d7ab9c3740 +7acf8ec767289f1c4344430d8457c4b0 +7ad1ec966da83539597f3ce0f0e141a1 +7ae4e289f887499a70f30b77c9400315 +7af87b5a5e33bb700768a7034c7e45c5 +7af9bc0bc7a9c22735aac149cb10f555 +7b00afaad2b4012d92a88a4d61f92a26 +7b105bba9f9284ec74d8df33444dcb75 +7b132d92de4a715e5e9e9d746261ee9b +7b20de75b9f20a643ec236b6c684f59c +7b263b36205db8d7b92e85c5ef684890 +7b2aed95b5005df8369f4193b1523d41 +7b3237f644223380cb90fcfdc62c959c +7b361a664e11bce534546accfb50613a +7b452bfd36f2f6c157c126466d21dc6b +7b48a1c37c7b5d00221c83d86e6c94a8 +7b4a3947e6a3d4dabebd3b845964a66e +7b60d6b28dbaeff94cf446e7899255a5 +7b6d0540665fa3ee64e49ee17f4e8aae +7b6ff0bd32ca253d48f42cf36cc3fb4b +7b7d027ddc5776fcdeb41c4eff0b1669 +7b7d86cfe177925f31048be7bd203f32 +7b8c29065a6e30371f4924c2ab5cbc5f +7b9296ada9fc5c54455a79b242530a7c +7b94cffcfd2d6be3680c2d46c011a54a +7b9f3ad3b6e7b6b0e5822c770155128b +7bbfd58d68d3c452b921ca60eecf9f84 +7bc4506652d5263540d97bc02d4f7b11 +7bca84d6ec783b02251b73219497d842 +7bd3d1c7348c9d574b636cfb9c88c86b +7bd7a5d67c7aa347b746e01f8d3565cb +7bdd97586a56b450a25fcf859071046c +7be5c89d546bf49da8251815614a279a +7becb9424f38abff581f6f2a82ff436a +7bf7234ba9620f43cf43c87c13e9a4f6 +7bfc3490d20d9d0985b19829d2f59c32 +7c14e9da5441a3b542617a55691a075e +7c184332612107f6e532f40e321804ac +7c2826cc67833595ee6bfcf064daf21e +7c2c4a48cf5a73a55714e95ee9a0ecf2 +7c3c1976c7504748501b0b98611301cd +7c3dccad4d3bbb6f9972e3f419fb8965 +7c72ce2f00552d51b92a51646d3131f9 +7c83420323d84c6c4a840ae072966617 +7c894ae79aa0b4baaf0bd78978990e3e +7c896438a6e243a61688fc6667d66073 +7c8f8da246d5236d7c6b13311c7dbc46 +7c9da2a0b1d2df9245861b01117454c0 +7cb0d21bf4882ecdf99200a52a54a885 +7cb3bfe7615f8ff42c44f65570a5d908 +7cb545d26d64b0bf7bb9f40b61971d4a +7cc1e196cbfb6f8ddc3970250a568814 +7cc639f5c1290fdf3ae1a21497305a92 +7cd88fb7b7970224c6932e5e101a40ff +7cddcb3e4cc4e0b392697200b0a3e5e9 +7ce26fcf235bbdc49388373b7a6887b8 +7ce92123c8729c0e951c32f6d432222e +7cf916c2c3b5a86e712ea99f0c66fad1 +7cfc4a04d3a3c29b4897bcaccf9b8787 +7d061e85693cba9671669e0dab9e0cbd +7d0c000d72bb28a92f58a50f9a1d0b70 +7d17303236939c72ead962a24adda2d1 +7d2ebdf6730362e2eeb7101660a715c8 +7d3a3ee65df3b8aa4b916d49da06d1d0 +7d4c00674d43c60589035563b9027a8c +7d551aedd3d0d88e7d827923e964054a +7d5b81042a88b49d00aa19585b974d27 +7d627b0a2be0daf8e0ce3f0942f34e53 +7d81b743cb15d438a709fd4685c353fd +7d87f7e2bb0b038e907b92e553c252f3 +7da07ba948a3e091f0241b15ce8ab233 +7daa5720af1c46e3c861234079d5c3bc +7dad4d7e6d8ced43a084b689fc38bee9 +7dba737575f9610340c1f0b1377c4e5c +7dc13a5ea0cf475bd75cdca7f1947442 +7dc1f6dc859bdf81a8af95fd7368cb0b +7ddeebf8b83976e600174fa47858709c +7de11d61d3646004bcc9f2793338e155 +7dec8a288206ac7562cd8d1e27dca130 +7e0edb3cce23e811a87d85993d80d01f +7e10f5a63eae674d86190254f9b3bf78 +7e121b12fda3d9f68e3b8e05e3a654aa +7e2087afdf12fdca813cd886f8320e1b +7e2b8ab9ddb9fbfa6d2cb35b5d2ecae2 +7e5f475d2972be8259a785ac1b76b830 +7e63f1b04b872442618b499780a806f4 +7e64c4bd54e9fc717b7f42bb2d66214e +7e6d62d7600e557dab6de420aa164e5a +7e6e42fdb31a04b0ee0d8ebb8a4046d1 +7e7409db4011b5447475acccb55631d4 +7e91f5e55a6d26f62b9b7998e311104b +7e94a63a5834d0df64b0c4aa26f9d4b3 +7e98c47f50c8d2bbeb6641b90f5879c5 +7e9f2324ff2471577e2e87d20589e059 +7eac45b596169a23487784482d72fb5f +7eb18df0e999b1abf556be1dd38082a0 +7ebc81ac7bbfda9f82b1e9c8545ca997 +7ec547acc11ef896c7503904ccfac79f +7eca0ebc0f969779b9b23269d6703870 +7ed6eed1e3de0d975a8ce33e9df15066 +7ed7bdbc5250b872154af2fe4af97433 +7ee495b2e14d5f6cdf505e2da9fc3f79 +7f0ec6ad51734830ea255dbb95abe608 +7f152b074f55e8d167bc768af0e9d82f +7f175ea01c2642a5ed48c80c57f348e6 +7f2f58b4e3e999e0c789f4ae118c2a8f +7f3a3049d0fbd32b5a541c6d73a97729 +7f3df82e94294f5c4dec9a0a93775f3e +7f5eaadf0ebf07161e6a01f0601190f9 +7f644323e6edd3cdf633518408cfc925 +7f6a94d55ae6833329ea1d361299be21 +7f6d395e7e9aafbe2e9e8757918e5ad3 +7f6de2301f3276e2c28aea9583c2691f +7f6f47cbfd5ae72c5df9f046cee6d727 +7f83a790d7687d5b22b662186997b215 +7f8c720bc33156bd9925dbf678ccbf37 +7f9ca7e39de41bb7974d6ed1e68fe8fe +7f9ce635a7c6c344f3775b3b482cdbf8 +7f9e7237bdcea4439c1b29f430482f18 +7faca8b8c88a4ad508ff605a36822a2d +7faf8210f9599e52e044c958041e2211 +7fb61626009b25a7064662d8bb1c0ca9 +7fbca0ebc2670479f20fa1006c5b7f4e +7fd00bc09ff0ff0b206d9913614ab93f +7fd718d71e1a49aa388c63724075f496 +7fda92e7bd78c90c492e678689029c1b +7fec3203c97115eef9bea48341a6bc12 +7fecd70572e4923bd41d94e4592d3054 +7ff3c835165a152d9e6b3483fa0d4f64 +7ffc255608dff3ae1724f22c57b914d1 +8006b593f4369a38209f67a4ab951861 +801905b0a99c57e0019511c5f9ef9143 +801b84426c29f5605301e7eed54740ce +80218df61d967244cb6631a077db696e +802381dc024ff58ef2ab357fbef87e8e +802d790c8d96bfb3a1f0e7c026c4f9bc +8036d72c2d7afbdc602b97c039ea4640 +803799988f0a7161a7e07c663d8e3d4d +8042cec1b2054d1546dae50cb67c2614 +80441142a23d2c6bba73179f312a1218 +804b1dfb839ff85b713fa0b2499f36c2 +804b5d98c23fd835727fc7443496c4b4 +8053a723911cc5cb41ecd9ed9ddd4a58 +8053e36e93ee513bf70151ef753f055e +80568ecdb5b26eb9c9e4a428701e021c +80598d3b0fe2b7815e521fbf03ef1cb9 +806a998f33efaf792d4e723dfa72dafe +806abab1f6aea17dc17d2e3af8d9f9d9 +807318f3751443a2097eaace456ece5e +80738138201733dd576dba5e5ee96d4b +807e09bf969e295416ceca57f261d56b +8089fb78a8a86d42d18aa61a44a386a2 +808c1cdc65dce89976759ae64cefd47b +80a65d5d2911b35ee19dcc5f1edcbc99 +80af81b3ac59a5d7411ac82dca85e608 +80b794219026c829da71123399660768 +80c740ed0305922948ab058a0a5e62b2 +80d7af2a9e2f3b39d12ee9c36fbcd14a +80da63f33ce2b5f57de9c66e81f847ef +80eada2ac7ac9e4ecfb0f0f3d2db132e +80eca12900e3cc530c0434d03d828a8a +80ee848ddd4cc883ae15ed2680d9cbf6 +810cb8aebb438c6311f914cc67c30cab +8122377a957a22a6855f9dcb9619d5a3 +812fac4f18a95336c2e084c63a7272b7 +8130b3af84e14fd4ceb31283cecc97a1 +813e40066cfe6e5783ae0aa51ad6f60e +816691aec055aae10d337decbe58d8a2 +81766275293a70c64b19351e9637138c +8176b9c30f1ea98c189f39b42a6b5f4e +817885d2b278a84ee874a3dc35298758 +81879b7503aaf122211385e9d977fa08 +818bd5673618f5510469a783b6db36bb +818d0b1f404ee300b36837f100374e92 +818d108cb178f4affc2ab3a056db63e3 +8196ac074d61907c739d6f79f61f302e +81aaba6a6f39961671d16d4158f83d79 +81b6a0f2e2dad16b1b60aec9254001e7 +81bf42edf276d4bf599f62acb66b6ef1 +81bf441687202e4849626f037b59eb6c +81c2e7f6448e8e6a3264d1c07051cddd +81c35d9487eccd503d264500aaa6dbf0 +81cc0fe286b21fce064215d85ba45af4 +81d3306c99f2a084438a9723eb37bf3e +81d54aa70a69ad030aa0cc52d1673be3 +81d5595c730c2a875d327ce7f5a84779 +81e52477021fd285b5a985f12ce67ce5 +81f560a2857d6487ed86985ccf95e1e6 +820079d5ccdf6e725f612b72c404fa4d +8205219fbd01f11a7d085c8c5aaa1b37 +8205566bf37a6918d682d0ed332ed1f8 +82148390bdc78f8362a672d65cded385 +8214b0f87960091d899196c6befcc86b +8218b50df4dbced59ce781784764336a +8221761f1cde664888b95dfb0abeee93 +82290ca28e27da18203d3f218d079fd2 +8230afe409f969c080ed60df02ca7843 +82379b6783f6cb351a8ba0f8278407ce +823d101119bc72c1cdd0c9d27b03213a +8240c2ba2b72df80dca56a4e10a10a45 +82548c599136c17b48100bf35901e217 +825c460725ab417371f6581ced188700 +82692ddb05758b040b254980e79cab1e +827ba183ea8f2fe86616474d1f1b62f4 +82927eff5169ec12cb2b8bdbe5004125 +82996a25464ce2541b19605ff52c1e28 +82a5d29336801edc29c694e3effdba7f +82a73cde159c7fe06c5b6c8590789d9d +82c5c3cb0921859074d39f693f21cfc5 +82cad3781e1b958d7d8545701e60282b +82d1da9664dfae373ec8573d32ce1a35 +82db62fbd4165258019726d3379c0571 +82dd6eff59e721e331a37a4eb778a706 +82de7f5400f1f1c0cf4f15cb144e7e2b +82ee95899c8055834f381e803b398db7 +82f103298a409df4fd352971459227bf +82f279909dc9134f3a83c0566faf7dd6 +82f5c0cd7466eb52e46a2df305fcf718 +82fc7cf919af516fd67bba2c982f38f7 +831484c5d60e578135d584cf9792805f +831c4e201399dcac56385916f5bf76f1 +831e1e5c53025a7577561763d33fb8e3 +833525303fe4a55fd72deee3076b7196 +8346848cb6082b7d0b7f6bac335d551a +834856da1554c9bf9c0e03ab90251e55 +83550939c73c41250438dbca000507db +835e50c3fa185f4430e4ed2ff1ca4a13 +835fe44b6850152cab3ffa1ffc1e6b8f +8373a1e1c4f1fabdb399019b04579186 +838ca4b9dddeba7967d02959f25edcd9 +8392cddb72a59ef07282c0b0fcd34c6b +839335b19abd67633586074a0a971085 +839916940ad42afddbb8d7071a6932a0 +839ac21804dff496d8fff7c9d928d271 +839fb6dd3c54a5a1df9341e6d846df70 +83ae3f76b832d6de9ac9011f85697dd0 +83bf4e98a928a2f83269614d660be56b +83c106e148d044999076bbbfe703d0d4 +83d88b0bba6f637f5129317da720d4a3 +83f3c21c8d6b9d45f3968f28874f3513 +84144fb3b6d313a7a139929bf22d653c +843c5567cfb71b4b244290d5c9f13778 +844016a5a4e54517f9fa041fffafbdc8 +8452923f7f39eeaec79a896a348bf6c9 +847e8f9210afde3cccddb5c2867f798e +847eb7ecb1358d94cdf22c4c4f965713 +848c7b81e71155d8fc419882b25429de +849b75d29b704524d8d6558abcc2e46a +84a6eb560651cbf1f79def28fd72fdda +84a8ab20e4c572becb38e1dff80f5002 +84aa32b1ccee690fbd5c86be399cd289 +84aa3862abaccbbe807b8fcde483771b +84c9ee1f9dc991b393985bee95296301 +84d138deec48fc2e96c4d08b63373e29 +84dc0561341c0d3c3aa2118cc962b509 +84f5205b096cfc6c10fc34e763bcfd16 +84f55d1f1cef3ec16926dab8491032ef +84fe5add56aca584d24c2d9a1ac65a90 +84fe7af9587336d6ec2af0277bcb2e0a +850924baf3bdd4c59c77c7bbe57b21db +8509ef1d784833d6c19c4be8d3e6673c +850d058371a7387b07b9aa7e87e249c8 +8527c067e51b8df991e88a644d4a26c7 +852951a875e3f8a38530e9d416a81de9 +853b8c17bd41df62c93ea1dbf28e0ce4 +853f81ef5732d6a3ab127268f7efab51 +854df6de8c377a8c619342a5ad992860 +855b9c82fe88fe2227e884bf4278a0ac +8560546ecc295a92151d009392499f68 +858736f8c838d1c2f59dff41182c6aba +858b0459e8411fb8bc6c7eb1fc8d8ab6 +858fde25f5d5888f4e832ee429d28f8f +8598d40fe880887886fdbf122fa9ba70 +859a1c038c5de30095dfccc580950173 +85a11dceb0c3a08a8c4233d3a4c865d0 +85b2fe4e082af06e386e89d42a13531d +85bcf47df316d5ea1f095122fd0f987c +85be30c122340220a75df5aa6c102db3 +85be65ed2700bcc63815c0351e1db7b1 +85ca664b9de96a879760b47f8ff86ce8 +85d113b191689a5f991e96f6affa1b02 +85d9db557e463bc6bf651e5ff9568876 +85db2be8e4933390a101e8ce39f739c2 +85e08284eccb4ead51fb1040df46dc32 +85eb0da4423dc1ea45f55436e0bf2ab7 +85f1d23512f4f94e4cdc4b251260265c +86170b3518fc00f5a082b8e72b193793 +861b991089c7ffc88f35f5512f5aa598 +861d032f0b18e7d076c954d4cb395e90 +862812b8514110044d46eb40031c5f74 +862ae0621b5c599aa7df0c5be8a207e9 +8652dc1403c21a4246591b3b4d84759e +8653b938b111b2136ea6880f760bf975 +865be8c275aa2f7c472a815b39c0e2b9 +86644906abe5e291851a62ccd7b0615d +866747b86749988a5f0589be444da31d +86691899b4f31666b1571d05cef63389 +868e1a0804722650977bc02426d08e5a +869248340168169a9d6b6778fab8c276 +8696982f2236ce2bd9ad26ec44a3c96c +86b3c353e99921620eaa802e99bdb89b +86b53d34d68577c57c64f7f88e313721 +86b6f60dad8552dedfcb62896d086c4b +86bb3293a2dc2031db2883e61207988b +86c7a2252f86c34b6d99d790cd7fa0ae +86d3bc5436335ce3be44f4b8520c4506 +86d60a22051cc6973c10cd32d0bbd298 +86dab1a7c01ca82057103bce285dd7dd +86e25b0b2904fc28aadaa39c534ca520 +86f0c07d71255fad46e303b2a95a82b9 +86f7adf98a70600b03d7739df6b8153d +87063528d534deabcac62d3e05405733 +870c02ba889247993eb6d353e356b7bd +8711d6e5230b64876827a34047c1d976 +872abf79b578d7a85520c169bb2c8167 +872df0228764bf3db82e4c290653a701 +873748ae5a02d09ea5d6a779f162fe5e +8739cf0625b1b82b2ec681cc9c8aef26 +873b9cc064465f96bc5e27a06d3e6b20 +8751faa6f2a944af1b843c1489978c3f +875443ece538d3664daae39a8f0a37f0 +875cf9d21125faae7a928338dafce887 +875f6ecf11327eda227d1e87198cb06e +8766f5aea02d3804f001be4fbf441466 +87673b107ea351c820772731b340ec4a +878fdc21ac82d25f2e0d67886ff10752 +8793f2cb5d4b5b73f32de301bab63c50 +87976db815e33dbad405c33f1a26c75e +879c3e218d4b906eea83c19bf3a0c821 +87b9473397e0820295f6abefa0e7af08 +87d59359563ad38cf63c8beeaf97e23a +87e455f016dc405a007d0b7046556706 +87e72bc632861dc4bf59edd4f1fcda4d +87e92d9076bda13fa06838e1ed81832e +87ef5fefb6941dba6848f2c210fa368a +87f497760c98250a7692a9bda727276b +88027e2993f9ee94975d7367ef4aa426 +880a31bfaa2af1c8d4b9e9572f7c6aab +8817702216839c91daa8afcfa2fbe46b +88257d6a83a7a6ea943235907bb66447 +88258fb5f200ae4f23b59c05c3b843c5 +8826fc9000b177203871d1cd0931d76f +882dc3b8a1b6613515cc111cb69f6e08 +8835ae4a486d66366eca3eb98061e470 +883a273a701b8e1f53fbaab0f555505d +883a34c180cc63878f2e47789d9a9e7f +88585f82d4900f608cccfa5509a415bb +885a1f5503edbe4d7cf7ba869b26cc8b +886584c68cb1baa77689ce1413a057c5 +88916434f8ddf991669191bc476650cb +8895c332bef894d495f248712627775b +889a6bee9ebdd682e76c4a51f820031f +889c6ad7e4baca4e57cbc467037f2aa9 +88a491ff8416f84cabca5abe4126ddb9 +88a920042dd643f3e3a04feec277f52a +88c38a7f436bd13848038d83bfc574a9 +88d549ae27a73f1bc733fa0eb88fdac8 +88d640a8a6d0443b1307c91474e722ed +88e635523e4b18c91231902ddd30c5d1 +88eef7536b5d4ad7b2936ba811c392c8 +88f31a0e1b3d82421b26dba2e28caf37 +8911c16d48e0f33759e89950b30dcc75 +89171675bb6fbf532a0a41ae53b4bc06 +89178ad8798f090aa872d4ed9c3a5766 +89192f5761b117f5a7c120c23ca1ff2b +8923bf7d37898d9118bb89a9e83ac3d7 +892a07766813e424755cc478a35f15ac +892d99041784cef176e7c5b0265fb298 +8936e697d959e9525644cd28d9aac8e0 +8946bbfdb9a87c7cb13bf21fdc44634a +894fb8456eaeaf832d98d2721f261272 +896aa25424ea27d3304133878386fb4c +897821f57d27e0384a9a5aa473208b78 +89787cf25e4bbfd4b1190b23f878b1d8 +898267733f605cb4abe897f218997dd3 +898d49818960abb6617c5d7552a346c2 +898d51b046d6c8302b1d5f88f95b99d8 +89c5d376bdecb09fc9d4e894c96fad28 +89ceea36da123fd606db4a8075b96b56 +89f82d48211426556b39841732e41498 +89f87f9ab7a0f4d17f53ea329bbb04c3 +8a091333e74796017b8931fbb65b0e06 +8a0c52aabcf114f64d345c7eea5d798b +8a108fcf3d606a436ec840ad8cee5ba4 +8a15a6d43bcd226f8cf2e6bb0d593f42 +8a187d2b62b2ee0d2d55a09b6536ab39 +8a1db43bf0d2e4ea599148d3b2358d9c +8a212184b6cb5c074fc4d8835fd6a768 +8a306d77aa28e1f4d4a4f1e9eb16b6f2 +8a3feceb5bd41d17a8a9d0cd705df60d +8a41ea6e9f215912c8ce0cea92e81ebc +8a45b917e1c9c7004ba10d8e8e7c8e12 +8a4aa920b4eee22eb6d41a4ae5ec3a57 +8a5310a7077c24acaf21e7574349d850 +8a586a6ff428b5d98ac392c3f45ab8c3 +8a717984d2613893f9d3d38fe3e0f97b +8a79e9a93850fbfd6253f0f1421bf71e +8a7d16fd776b7e3ea2b324c177064e65 +8a805e9bf82a6098ed30d04885bf1ffb +8a8179e78fd005b074fa71851baa7248 +8a93ac8dd08bc13edb6a51ffc2e70094 +8a93bbb7bad69e4e67ffc68562b545e8 +8a99cfa4b3348699905c24a9553ee71e +8aa51f924e37f3fc9b3482a9e90b31b4 +8aada1ae5d1359ea09c3fc904cdd15ba +8ab03c9b0b06a2886e64696135d00530 +8ac2711a42920d36aa8c43e80bdadfec +8acfd61f30b310c087ddef5da7f4d3fd +8ad03f65af5eced888ae619e07d79f33 +8ad34f3e597225754beb9cb629e0ee65 +8adf4ebd7e479fb78efd00aa3e090dfc +8ae58daa7b038ed2870337755f5f2b1c +8aef6aed87cb9c26626ccea3dd5f34ed +8af0a5f64fdc071349db462db9ec189d +8af3bb16619573735450e58224ff6da5 +8afdbf48bb2c11cc54a4a22f9097da9c +8b009c11445a613903efd23edcd75488 +8b1f874e515f8b4874bd19df76c05dbb +8b23e1a704a5be846fe8d3569f0797c5 +8b25a437cd892e6e2680854a36bfeb79 +8b2fc23a3877cd90c852ede70cabd22f +8b321fe3d36955bb7386697e7dadf80b +8b4f45e70a7f33dc7af6736575d40ab6 +8b672269bb4ef839e55d0b1f5fee02f2 +8b6bd75386f34edab2aa5046d5d7c9ee +8b708715b4dfaad23ac3eba6bb1e6f86 +8b78aa94712927edecc6d30fa606e8fa +8b7e16b17e87043f16fbabf8883b180c +8b8aa57166781f2ef100fc7c5b90f596 +8b934d6a1ea50b43acc320c3d1efff94 +8b9b2106b4c1de99bfd966b0c2e5734f +8ba1beb734df72c061d506fc61958335 +8ba83d87f971786ebd907ffd0f42a1e2 +8ba8dccb4b7d9f9c5b7a05c7ae7ce847 +8baa7bda3cfa04f7a47f092d7a96f688 +8baac5b382c9929607b5e1f15f2c31cf +8bb9dae312cb503cfcc2966657e4711b +8bd65ec1b9ebe7dab1fb0732fd41d756 +8c0d31cadefef386ed4ebb2daf1b80be +8c0f7b9857f69f75ea1f32f0e1ed4c62 +8c1a049a9f37db1d9b98ca1356b78c25 +8c1dd3aca21ad9352327ac2572788b59 +8c2d76c0b661f9cb23f21991f5253b90 +8c33a8c9d760f50d3fbd09928a806b0e +8c36a9556146e63570471bfedb23e49f +8c4b8f05e3e1ece90d2e43d603f1778e +8c4ecce5c94e62eab15fb9e7553d80d7 +8c52aa2fdfce160e36d1341f43f8ba0a +8c57121073a7115d2980b7f5ce253b73 +8c5e6cecd2a833be6d86a639bbdd509d +8c6de0dadd0e3cdd992cd499ca0c25e3 +8c702d67b0c99998955b60906bad22b0 +8c7c2befedad50805e2ef0032d1c5a45 +8c80dd2e9a339093986489577494ada9 +8c981a29ddef48899bc647a511526b17 +8c9a03dd9d60f277bd006fbcbf10f18c +8ca5f96308b48f3e0304f107244bc9e8 +8cb350b2dfdcf3b13640de1e4a648397 +8cb5d310de1f555c94dc105deac80278 +8cd99fce825332fc8d8f550a736f3030 +8cdd5c46d3d586138ef403dbba6238eb +8ce6afc756a0f8312451ab03b6a66bbd +8ce8306b2a305b1969d051552a988dd3 +8cfc108479b8e67c8c296caa1d393a08 +8d099fa4976b3f278a616ffdf215d2f7 +8d12e2ea7985c8e3d507dfb752f2d339 +8d1510050e73710b5841bf7db9d470aa +8d1c780b2013d4daed0fcccbbc253c54 +8d1e147aa10b1ea5a02baf41e00ce333 +8d21fb9bcd3430d0b30018eb941a73b9 +8d232aef7d5665749435ee323820c200 +8d3205fb8e32860af2208f06365914a9 +8d3d036ed7b54f0ce03678a5c1dd2e49 +8d4316667e351aedc9bca4696150d8de +8d4a084ebade8b3b196e8bab8e1b6010 +8d4c6f382e3ddc4634c70bf1a211196c +8d59172700a9b34e1859ec94c7d1c0c0 +8d68f04ac1e44d1ff3fc581be270e490 +8d6a82c690ea5d1399fa99ab72865203 +8d9244539205de573af5e6f6c74f2a28 +8daae465a8727943d4dfdf352c06a32f +8db6930c25125e8cb6d27b01548a1187 +8dbd725514fc22bcd965cd0d9082fd26 +8dc3aa34c6c74bd4a89a60ee2e4b5030 +8dc4edfe3cacbafb26bf6cec0d263edb +8dcef183d9a86c594e45b9f9c6aea8a9 +8dd3bcf5dd3f6eb5c99102c98eec8c03 +8deae873c2ce28c9d26fa345218b52d6 +8df59e8cc2c1e40ecea886618070451e +8df5eb4520f6b33ef486139d592b3adb +8dfbae8edddaf11df01975a9062ece0f +8e0d96c900e9c7fbec864d2bbc67c393 +8e0eccb7d8242a3a811c7741e3609ce3 +8e0fe4b9597f3c991cc8efe4cd5a808f +8e10ed3bb25bb51ec7d81d3633b6027f +8e12b5e45e27502aba3562ad16e57253 +8e1b5ec0b535e852a9e0700f57be9c19 +8e2c2accdf6739404c6a8abf72d1c959 +8e34e115d53374d3b92d9b4089b33448 +8e351e30179a1bee78600b861aa81888 +8e3f67466523de963234e4c0db842701 +8e3feda11b56e995815009b8023c3ac7 +8e432c8847197d166251b79b05247d5d +8e455907b348bd12ba689c141220477b +8e576f5075971ba30ab21c0fe5ec7870 +8e5a9a6aa64c66dedae11ebf1f514dc0 +8e679a6ee7ad170c70a19dcba89b1a91 +8e7280daf2b78a75f11861d8bc66e79c +8e732d566f1496366f2c04bacf13c2de +8e94b0c8f7735e09aa8d99591e771ad1 +8e9789b8b788c530fdb4ce44be2188cc +8eb7af872bc746bf75681c4a9b367094 +8ebcb0e2cf79c54cbf3d92b564338605 +8ec24b2381971044f921e6d4f1e6779a +8ec449b84c280e80552af9864eff7030 +8ec6072d0d3f5270935944a068efe3ef +8ec6963eb3a70aa0b8fff7bdedc3d6f6 +8ec6b5002df9d7c3ce7f0fd0722c0cae +8ed6dd28c6d4b5a63e340a5e7ab95e64 +8eeb3592c1b583c3e99626357d0703a8 +8ef7d58049c0577954e564fb0a990e89 +8f0bb364caf28435242bdf085eef698a +8f0d9eb13943fe726e3100bfa62f11b0 +8f19c9d15d0ec7d45d3d5860f7a817a9 +8f2d1a82cd7993c27a630aa3cd862f41 +8f2d7ed9de605ce094e4fe91238a6ffa +8f2d932aac0fc562fcc97a1204c0a6da +8f42896fae19fef6478d2f6d91204ccc +8f470aef3a54264cfcdc43af1ae54f58 +8f52996b1e54be32c967a5f82368ad36 +8f5912a59b35ec3d8e8e4a51fb518d2c +8f59349f3ce189dfc1f5f29c3339cb98 +8f6741b736f89ec016bb915f150f219c +8f6fc5ebae7a65e95035eaccd34c75d2 +8f80ca8c8a8467210dd5d20493044a3c +8f8b1f8ea86ae45dc051fa9248002923 +8fa965a50a9adcdd2897623d0aaa9f21 +8fbda386ec5d77a1fe1d45401acd5bdf +8ff2191597596424c96e64d4d3a3337f +8ffd4f003ed1e0b6398987be79df6d35 +8ffdb28c4deeac3e21fa786d2b252916 +900511a878c19b8bfd351f1491feb0c7 +90101e179a8c98877ed852984e6befe9 +901fbe164e016fbb646fe4a754eee146 +902c87538581d021f76ccf11f15f2781 +903447abe9cfe5c7a59f684471fbb7b5 +90351055444b6ad517bc43f92ec413e5 +903ca478e3a552c84473ed0794abf7cd +90492c3f5b58cfe695327876d451ba4d +904eb74e2fcd104d69f79c1aaad84060 +9052e53db9ffa11133f7eade8b7bce0c +905f465c7f047d31a3224f1c7170b353 +908284cad11d0dafdc0282ea29b6f846 +9086afee9a7bb004dd3e7b474b9fcf0b +908a9862ebc6a3add8fcf021ea060be3 +909db068601b4f6e70332cfd82c22474 +90a88bdd50183515c05745dcadd4b4ef +90ae552b0cb66e9e8f5fed707dd01657 +90b34432dd6d0f99f2dbbd4d2c241686 +90d7669131a0260dbce990b60c1d9632 +90dbafcb824711f7084e75f48ecff8ac +90e042f3e2677c87e25536a0fa53f168 +90e360945a44d6c83848619c8e1879c7 +90e7146f982692b03aa23dcb3044a4c9 +90efa4abf389aaedb652ecb8313d024f +90f08460de1557c15f87953a43707b7d +90f1d24b400509f7156a945599ff537f +90f207a487aeb15cac4293778aefb512 +90fa8f3f17c2049d65e0a2063aea3c89 +910ad421da211862ec5448b0496d5d04 +910bb1f1ffa66b70bcb578aae6b64ab2 +91102d846727ab3b8ef42a2edd3af723 +9115fdb2de5403620066d8ffed3148c7 +911619dfe3113a7ae405c00c03a4594a +91172b5c3347c258458f97c25fd3d11f +91193d49431eee5cdfe62cf66cf4178f +912783635295dd9a8c487685aca02b2e +913b214a334d23dba39afe4d3ad79a78 +9152dab565eeed5a395a81f3921271a6 +915417b6a32aee180db6bb5f7cbbdee9 +916b008500e3e8fadb54a55a84ba8f11 +918c6c87a225db3ea69d80334107b1db +91aa6f40aa9c933d6d9cea1e9cc1ad41 +91ad67fd0229b282c123357bebb5dba7 +91b874c7599b1215c2325c8ea59a9ae6 +91bd83cb874989210c97b14321ed2efa +91d522d1ce24771f5373f191b544c575 +91d5a9fad61d5cc3e8249af3cb62f448 +91ea38cc720eea007c9548e8bc48b4fb +91eae0025ba47a1737d9afa119cdf2a8 +9206cab0783f5416899f8f722bd44ba8 +92087f2246c38d194d2cb083e8f88f34 +9212231ef322ca49c804b097a8ac7e02 +92188ddafe24addcef6a232e801ac573 +9219026b2d0a91ed0aeebfc7800826f2 +922b6a4864ad4a7cc6dc12c4b5d7921f +9234e160ff4c081f9e45dee1f099498b +92451aeee375b8d3743bde1eec2e57da +924f9a4d3224d3945323c9b339bba7fd +92543a8472a1260af69b6fa81762fa9b +9254e5950875a4e7f5e68723da175c2c +925559fd9079e3d3870a78879647360b +925a7e3e1178ac0d773c2a5e35bf7d29 +925b0035b623fec4c2fcc113fddea043 +925f7f918e06bbea7e8b96203764a824 +927b997d611fff098b397483f573f0ff +9282fcdf99253ab5415abb7771e8420a +9293663072b9c0173d268c885e738cac +929b35ff5b2c78cda912b0e3707bcb0a +92a140a5318679946be1060813090430 +92a2f83f7207cc9c5a6c6bc0063b8e20 +92ab756e1c4880df5135b3e0520697b4 +92b71f7d763b298af9a7473c95ca4897 +92bf8cecc06b21c1808897703eaa5028 +92bfb223947f87736317530884819484 +92c75c271bf1d530ea8db40999fd00e9 +92ce0cd081a5f617b5a40a5cd9e0a384 +92cf013a1a51e67a50cb1320b4669eb3 +92d70b3af784edd2829e7e597a62608e +92f302e15ec4df23817db37ac9f0fcba +9302e93f790a9772ae9d2b8b140b1cd3 +9309a5318a08e4dc1d14c9fbad92c11f +930f76a83468f35419301ccfea2962c1 +9312799e7314dd852478baffb857d319 +9315c7cd449c755c06401baa3b562380 +9317c8a0d099ea0277286c55af193dd3 +931f7fb61acd6f5ca29cc0ac71b87f5e +932d54ac3c3732c835c5125a45a33d11 +93431400b6d4e80d3f540c3ff7aca83c +934a8c02b6a0ec496f4772797e35e1ec +934ac01817940749af0368f9342ab0a3 +935edc1de7f11a37d246693079f7f214 +9364de5e99c1209b16553bb4eb2d2958 +936f64ab1d855c4e24581d45d474d97f +93729a8e4f7a001c9dad77bf142b2ab1 +93768931783a27ba1d07b0811199be09 +937a684461bd85f45023bdc68a50d648 +93804aa2e8ff97186488a6f3070c02d6 +93806487b7ed16aeeefa79a4fe209825 +93874433619186c89a1ec8f41600c5be +938ee213193e291b3c81a9a11bbc5f12 +939570e22afb840c56dd66470827d849 +93964fb97e21b207f0be330aa1b7f3a0 +939965507a91c9bc12ac101a9125994c +939a3927b2618fee4f9a1ab2af5cdbe0 +93aaee267f095c9eca22a9bb326877f4 +93acc9c87ecf93baea0b9aeb0491559a +93b651c3eb3de2bc9f7fb27bda5a137c +93c1706b4eefb72f2a08bdef2f6f6c83 +93c5e8b59affba9faeeb79cafdaf1302 +93c7b705a57b004795a40347370514e1 +93e3a430c916230d44aac1b3ead1d1e0 +93f0bef20a1580cec52fae381cbabfd1 +9418d947cfea0302ca44516d0d7443dc +941918c5b27b6435ba07c734ab36a54b +941c9ba48bf13a353a03371d7fbb8527 +941f6741dc63286e333832990ac3090f +943af8a1bc22ed6e7efae72baf1e1753 +9448767bbc70398c825c1fd4bff530fc +944e19066bc0ee8118ce2ed8a7b336e4 +945371c1ef98bedb23923dc1d2805285 +945af22616325f2c57455f9f4942c3da +9467274f26d24fb27a3a498f0b3913eb +9469c263c0a27be53b0c133eed8b1cb0 +94813179d64ff648bd3cf5094fb66365 +94985a57abc1a5702627b68f62a298f3 +94ad1dcb1fff77cf09b454711b72e220 +94d1360efd145f8c57870fa307880ca0 +94deb958e23dc0f4e081382bd23598c9 +94e6e9430ce40989277af0fa8bd38fd3 +94ee979522436872c85775057107271f +94f0428605fba211feb6b54837dae6a3 +95018bb6aba0eea889a8836a4349ec1e +9504b091514ac50874ef6bd027d42d87 +950ff5a1a51a31d74abf33f9165f3423 +952364d653a80ccd6216b8a7f609ed89 +952a1ec58edcc5de2fdc397513afe5bb +952db2deecf397edc0f986210199d743 +9533f14dc6f87dcfe07125321af56baf +95351ca26f7b954e7d903f7e28465278 +95455e08482d09016fa5a474c0c4802c +954832ea72fedea2a716de2390389f45 +9548fc2c82d13f3f232e1482b918cf08 +9556c991e9c056352ab091b1131224dc +955d7450799b51e18bfd23ad5887bb9c +95709efacef270ea417a0a1062cac14e +958c6624a597b039760663048f35798b +9590a1d608e083f2f256e7bc9da796be +95a00a5d54f1e9c36e7374ca4f9d30f0 +95b305e036fc182b02b52a493afe92e5 +95b5d4ec5283aa4d2837f3e16a8b316b +95bb0b71b7a0d2223e8b5af94b1fcbd0 +95bc7aa683fa36f91c478c8f07255830 +95c9e8c6b159170264aa7c329c275e20 +95cec372aafd95eb0fe828cb0ba4a57b +95e883066234bb404e40575cdfa8557b +95f520a54ce6febcb2c2a0d3219a581c +95f6cb9a37e33d1a19fa2470ab8f012c +960154ad47ae75f531d4a2abdb8bafaf +9604bef1355781b47a2fe5b14b98ba11 +9609d1a490d1262e8182e27e7837ac09 +960b5436764359a6ff3556b5eb5bbe90 +961ae2b47bd5255ca7eba35772b7670b +961f3870856a84c51880871228b26a4a +962fb160bdfd58a2978f0f6073a96d62 +963afd264d237f80082fabf8d5f7870f +9649c16f8b51cc2acac8f1620214eca2 +96554c63a681267cb6bec92f19c4eaa9 +965ad236b29dc5a8da54b4c5291293ec +967613c568c65cd0a5c1a9cf44df0d4d +96822ae01f265a3748122ea937f7e59a +968ec970ce9813d46ce24e21f1d3664b +969da5dd2f0b0a0990de820f516509ff +96a4db96d59f41ff96ac339331d80862 +96a51a549ae993425a860e43d292ecaf +96ae05e37a0270d9861e0fca9b58dea7 +96b236cbc1147a25b26488b48595978f +96b9c9c66054a62dc6bdeb9545fd0fe4 +96d3c439a3b885d264ad269e33d18ad0 +96d3d649b9bc3b2e04e0f19a18febe81 +96d8ae761eded0409032cce6f9a383dd +96daeb3ec8a8e2179a45c12c1c693032 +96eb1b655a3a8e20a18beb732b4346cd +96f6e19308b1be76b56639f100cd1cf1 +96f703cb2cbb598fda52348fd2544faa +971ee0af3bcd6afdaa6c379b57889a7c +9735a798c9fd5d228e8dab76a4be1e56 +973b343bca9eeadcb81236fa304e5ea5 +97471477454282de61a31aa1fc7cbb93 +9747da0102e8068c5965bce5b550f3ba +9756c56ef8c43c9ef0db9021c6b77e9c +975bd8d962084fbb961525a7b1c2e609 +975d655cc361f2e129a88bb5628193ce +976c37c5446e4997e9726a5946acba78 +976d7a74bbec628d8ec43419bd31fdd7 +97712371ce1967e5d5475ebbae1a272d +977493257492bd953714e1ed57a9ec40 +9778f533ca711b7b6b4c2ed03e339c7c +9781d1f223d478964412edf52d097bb9 +9783f9381e5d25bc9cf20b61ed650d07 +9788d67f7950b79665c7a75515e36280 +9789a523e839b62bf27141550ad497c7 +97b0d61453738e214c2580f109de3d8f +97bb72c653714948e8915f7263d3d9b0 +97c8005bfaac9a08f6f2932058699fb0 +97ccac83f39107597674c59aab01f884 +97ce18a94ad33fbb06161cffe0efe081 +97eabddfe4f5427569651c33d1f5585b +97eb1df1a952f65c6c78cfdb9d7120e2 +97eb73b012957a01e9ddf3dd0f522398 +97ee2031165a4bde740009d397dacdd6 +97ee6c72e9a66373cd26dbf66d018694 +97f54123faa84f1a05872ebc6ba02f3a +97f8040491cc8e200e5091f4453ffc3c +980309f5188477faaaf5a067f4154d0a +980db05c442960fe244f15b36e67a590 +981d8a92a3270a1813fa0d682fc8f7c1 +982830825d92e5027b95dc4414a48381 +98363bd0f618f84efc7fc40338043d3f +98367cf9c34055b9bba6b7607e595bd5 +98472ba4ef1bc72b5439bfa2ca2e545b +98475f260da40ffc0f0136aae43a0d4a +9847b5c94b3c5b3eb817d72c24cfe777 +986d4845b419cefc448104f181cbb799 +9874ac86e2824f434745f3d26c4b43a9 +9877e43a2f4eec3d8d53e612ac169751 +987f122cadf2b508545badb6a958866e +98824a0dbdd7ff79261e3b92879ebbed +988aa0c376544ae42e70cf4bba6c5420 +988ca528f962339e5c158aa730035d53 +989682e9939551d6456e559c650635d5 +989f8e26ca4ac31475a4140ec97a6442 +98a24760ccd74f79edf6d8f5291b1d02 +98a248020a1a67df218079fa39844c70 +98a62fe50411499f3ea4b2ac71af83a8 +98a84933e1b18b5c5d902c08baa81f3d +98aa6b3d5c0b6ebadb0aba5cf9c4bbd7 +98bd757c2125b85523667c7022e71a06 +98c3498b3144c2fcbda4b1376408bb80 +98c627ca129e64dfff3bf08fbaab6c86 +98c9a8488cc71acd1c486ae32b7778de +98cb4f9ec6243bcb123086d7a65a3bbf +98d903f52269822841eff4c8e2d08959 +98e1ab7b9e58b918113813943733d9e4 +98e7a1a5a1cc7a6b24e635a77c1d8e53 +98eca4605f5dc43ec06a07b644395c09 +98ece4e249e10f658abfdbd15f7c5cfd +98f7465a5043e66a682c8dcdd28c3c2e +991375053fe9c54426d5ef72ddc4cb5f +9918ad44351930ef050b3bc6c342ac88 +991b6942298cf884d1a8ca840dcbf1ae +991e2d8d61dfe9e4c63ecd8c8f15a3ab +991f4b736bd2d09451d6cb4b5b072b2c +991fad7e60480e1bc7061b78ead63904 +992d8fd87afafb6955a961f38cf9a606 +992fd66b4543e0ac23f3193d51b746ee +9932908e720e0d2528f547064bd4c898 +9939cb4c29b4f8a64d0e85fe646849d2 +993e116f0b637806b8d46992952b1b72 +9946cf37324ab79ac494a23eda7629b0 +9947cc423c03ca9197e5e7b34fbb51b6 +994dc10e328799e3038afd15390c4aea +995137f6d63a3905e63a99d937c213a8 +995aec693885cb51ba33a1b91b7671cb +995c32172e501c9acee2efbda69a4027 +996dfa285af74ed2af298a841e21b5da +997df43cb890b8bdf6280f3b47e03443 +9980f74b4d233c06cd665d53544e8657 +99873931d4a94abd167b50ca4aa93465 +998a1e2294a972e252a8132c71985841 +998d581790f2f7deecd11dc94f7d1c65 +998edc12ea1a27f13782c61f29d84acb +9990b0d7706ba3553b75a81b95243773 +9999c1f8d378716ee02e986e1ef54d4a +999b122695a73525f8a2d3970d51f814 +99a0603da78ef71b45cf392075a1006b +99a7b6e388e17b94f879bf18b108afa7 +99a9cfe1acd8b7c93480d4cbbd45a43a +99aa3d6032ec8af8feb324b4ce3a3150 +99b132c493c5db8ceea7b9da60eba7c6 +99b2ef6b8e5f6d3867f50ec180b9fa33 +99b54080ef7f9d5ae8aba9568a1e285a +99bed2c884bf2f67510fba789a563264 +99ca8f0255e6340ef809037f3439638c +99cf113d4ee1c3e560d929dd26f57cc6 +99e2ac4056dbeb9fc0342648052f3a82 +99f603246dbf55572648e489b8fe653a +9a10956e27b211fb1e8669fc3c6b054b +9a1676a1217fc88a0d410377f32a409f +9a1e5f95aac35f44d9e5f218b1ac8e3d +9a29846e09b53fc7bef3fa57a1e98a71 +9a29eec2486abbd55302203cd1a28df7 +9a2e23469a68c66fe661638bf77d55ee +9a45fca15a73582ccefb1d6305a1b11d +9a48299d93be273934901f9aac2e3e0b +9a4ba46a45d4269facdeb7e313c65e7d +9a4bc09374a4dc62e0a4c4be7a32b6da +9a57e33ecbd085d1e076ac7ef467e912 +9a64175a85bbb23ef89893b406d92442 +9a7e350bc820c2c0edd3843c3a297e42 +9a801910d6796c1a324e6e18b51f6993 +9a8b83c593f138d24b623af57c22da58 +9a8d78d20f287a9c0207a288b4455275 +9aab4528a0866a1dc9853c9098b8ef9b +9abac1069665b8f618bbc40bcf5f5931 +9abb7ee561e7c65901cf1d22857ea595 +9acb0c4f0e074b36f512d97cf847a37d +9ae02218dc9adc0a793d940350349fa9 +9ae24b7aa8b1763c2702479ec8a61528 +9ae6df655b0f8fbda67eca99b2d247ee +9ae8db9daeb2fc9906e10282da088bfe +9afd60ea259412a6215e98784904053b +9b0d178acb88d33e909bc91ae379dd53 +9b12d66e5707cc5ae1f2f727f597a429 +9b132e6dec7e8fb280ae9324074d2c2b +9b15d641c36b5f1f6dd83bf669c2853e +9b1ad138a3a8d6b4453bd28dce9c9e7e +9b2d1a75ddea7b7919ea74b5d1d4bf29 +9b2da8c374dae6d61e06784862e48e0a +9b3a663ff94f5eddbdb80bbade615074 +9b49f49e02ce0e682c97bcb52b5cb477 +9b4c54dc1e26c52881ae4a4defe1973d +9b77cb95114f16184b5fc3d328d4ae5d +9b7a0354b983fd35dc415dfbe8192c91 +9b7eb63ad8039093375f69054a25e62c +9b8f28c28ca94ea2bf2a494164e3ea9f +9ba976e5eaab7d53215b6e129acf4c40 +9bb67786d7d3645d85b317de9f82c2cb +9bd303473d1b363be986f1e77980b5c4 +9bd689a55b56c0a0a9e5161d1352d857 +9bebd2d11a6436bbea3ac955ee8d00e2 +9bef7d73b68be6894ec91f588f74dd59 +9c22f511dab552762fe201e765427a01 +9c3ce278df76d825aaf035fe6279cf5e +9c3f6207e1eea9382acf0faaa9d5d2e3 +9c5a6704f6981b07ad680b58f83cf241 +9c5da1ac94641aa50b4ced1ca96188a6 +9c5dea1eba05c091693d3c5473bcf272 +9c5ff15e947010a4332d9e87fb784b54 +9c693553547a6a4ae3753cbdc91d2a81 +9c7f7b476e9cebd0afa554913c976eb1 +9c8c59358ec8114bf418eafd3c8709e9 +9c97409335e979fa3c6a274284a906cb +9c9d273df58e3c876679e7b9c9794a7c +9ca459ac996daa5eb25f881ad8bad94e +9caaf4442acc85eaf5adb324062a3472 +9cad9582e67791497547db774910031b +9cae5af68bf64f63cc1dfbce5d2e785c +9cbb17d81e648875ad55d80e0f67a4d0 +9cccbf271719bff028689f470ad5c48b +9cd1aaf1e8beb226cd88f210e92c3fba +9cdbd1f21f28e5b2b67c4b4a62326819 +9cde33f778bea8340e9611310806f474 +9cdf123b65569ca3be28e8fec085c12e +9ce0fff166b5eee653fb3c291a7a6110 +9ce96ecc8be93556b05c935df459ca7d +9cf148ddc87b0db0e191e89d58789fd4 +9d0321e0d20c17c5c71f4b8e3c8e830e +9d0c86881d775b784863c561d1dfd7cc +9d10341bc0c99f61a84b68d74394af81 +9d136de055392ebd2b11053e362e1404 +9d26c7b40642b2fe75dbefdb5bfe3d2d +9d3130e2c67d4fbdd90b76847aac4444 +9d4ef319c36ae4ee19d2e62175fd6461 +9d55ec6b8a163f270ee71f308ac4f10b +9d68e983eb9f1cfc67b90b08b9d8e856 +9d6a72395d72b2bb5118b0262b138553 +9d6c9b0b92a14d3441e3f0aca0e11ac9 +9d7969b84464b74f2651bc01b1501635 +9d7dc7785dea7d9374c5a488a433f5d8 +9d8a46f0338c2d62abef77b6217ac43c +9d8c691c37f3e114e66a3330400d9ebb +9d92afe1f17d29770b099447f1e8ac26 +9da2bd2c47f95907b9932986513e902e +9dbec53c8b93af402729593de6513c55 +9dc9db7f015b367dcda6eadd2bc9c66c +9dd75dd64615b69fc48ace215745f600 +9ddbe0017d767560ed0fba20f63958e4 +9dde3a7ee8ee9715211b667392120e11 +9dde62b9bbd3299a889f35937dccf3a0 +9ddf7c1029014b70d04a6b2bec75b681 +9defb2730925030174d012c44ccbe889 +9df287c7a3a47fc3ab206ea34090ba16 +9e0b3f410cd17e45b9dc3adb4db77206 +9e1118eb170594c4d060bbfc0b34307f +9e12472b2c6d27ff005f0596f8b962df +9e15ac41a7b2ebd7021bc3f8352c4467 +9e20a053f9242b97546bb6009d2aa1e5 +9e2485b2445132ad6b7557446e9f6d9d +9e253f3f450a30063a0146f15cda91b9 +9e26c63443d43dcc1f36ffdf324647af +9e3c85beb647595da40d71b96f01d2b2 +9e3f67e78099f51c8eb2d72d8518dc95 +9e44dd311fc97408b0c6ff379305294f +9e4b8ac035ea15313afef2eafccce098 +9e5aa531aab58d43832dc2c43809e6e9 +9e5c374bf0a26f39dcfddca6d1ecac45 +9e66ce6c64d118e2b0cab3233466656f +9e7cea3d4115628fbbf0090d5b9c5268 +9e881374c244bf688498762bf12971c3 +9e960ecf83e26985a7aba2bd28a0bccf +9ea72a35b2e4e5f4f3e1478bfacf17d0 +9eb81087ebc2ead17b29a1bce775c5c2 +9ebda38f60b09365d05787758a8bf3d8 +9ec40536ec3a84313ca39267b0e426b1 +9ec990b0b5132ff130dcd02e6d0402c3 +9ecbf53c8216d3116d18de5b050c9bb3 +9ed5f6fafc8e7bc4aa3e04f23b2b325e +9ed885f63495681fc02604fa5e3164b3 +9ee441af523e449483651656ffe5e1a6 +9eea10ed8eaeb039686675ea6ddf68e7 +9ef6d1857f1c7a58c2d217a0aff257aa +9efd619a70d784b4c2834a247f9eff6f +9f0a3ca42e00e65c5a6f2d7ba75a2bda +9f1c2fd6aeabc0cfae77d2730ec2d233 +9f1d699498d12ecf048d82823492e5c6 +9f3c2da01b09bef680daf5e2a0d9b7d8 +9f3d28644cceb79d5c990f29351953c2 +9f49002c24fdf39d03d307a4266aaf32 +9f515958f2a4e2a6b4b5c09c86fc3daa +9f52b12d7127a5704460b72ebfe7147b +9f61314b623bc58ce2d97325a8bfd88b +9f6a3d29e7e8854c4134ca808d22824d +9f6c2fef01a774946cc74c305178a5f3 +9f74d2a1226444affc101058caa9100a +9f832f212997a9765ec2cd17fb9b181f +9f89c05237047a6e385f919c5abe5350 +9f8c15268cfe3ea09960ae40553b3433 +9f926e61be772e96bcfde77cec74bbf0 +9f940ab31535b599ea72a360fa345fa1 +9fad03dda4ce1aa4e4610f2a9bc41cc6 +9fad3753faa1b7ef1dcafdea26a9ddaa +9fbaf0e18254b2c068b17d829ed9956d +9fc4f5b08d5c1342e2710499705940d0 +9fc9d34e98bb4fe91d1879431a7b62c4 +9fcc7044eeb86ba75229b5e4fd19b07f +9fccb6d3e7bb6198579c462abeac247b +9fd3d386796be55d68cecabd4cce34fb +9fe3ae48ccdbcc4322efb52b74b37304 +9ff21c0e421c1f3252dcf260a2364d59 +a00f311f7e4344cf2d8f56bec714c5c5 +a02663547008a1c7c9b90c4539c0ebaf +a02ae2c13320b037132fc7214b4c8f50 +a02ba5e1ffafe7672353f10c0a559d2c +a078a91b61d301da2309866166021c3d +a078f2a4c4cd4c42ed235971e0adb22b +a079d31d1c00e54c78d1382743ba7f28 +a0817a1232411add6e8ea6437e41adfb +a0817b7be0f3a16d17882a08ce861df0 +a084ccc65ad53454c7f574af9537ce7b +a08b514b8893d956f24f5b205b61b039 +a08c354f925b2a9df839290c8903c1e9 +a0a1afbdd8e2124fc417685b5c80218c +a0a426f9a0dd1c44a19df49fc176d1fe +a0b10443529d7ac6550c993b058563d5 +a0bd161255f5f0c74ad6aa04e68b06a2 +a0c381fd3e11a76fe861f9aaa7d07fe7 +a0d361234dc5876ae87f19feb075ee48 +a0d4bf7873091059a1f2676d468c956f +a0daf871fe290798d3755a29585fa8c3 +a0dbd6e0b9f91a3ab24ef3f050303a1c +a0e0fd1769619cb1987c5aa313104eb1 +a0e244c34c7a1b71092dba888427d4ef +a0f2767e05bb85e1587e3ec1db32c8df +a0fd873e8d4d6ea19923f8be7a4909c7 +a10399d5d3ab542914c27684e850e683 +a116f141021abdb285e4b17d316c26c0 +a12c590bb5924b3a324699dbf26e3d0c +a12f0221fd9c298e9227843f9b721a64 +a14440a952ac97acecee1ac84a0d71a5 +a1496a9c5ef669ad6a9c104526639d8d +a1543532dfbec3ba955d582860706b67 +a15b1f04058d24fb4f4f0bf2d09649e1 +a181eec88ee26387b3cf47c910765a8b +a18cded03e62aa84d47c860f7174ccb2 +a1a626e9f6d5f2309a2f2699d0d24864 +a1a94f718a7bab52ee1b726630846ddd +a1ab1004c136ba89d9b19425e6d649c7 +a1da4ec1f7d54e71bc9f91990d39aed9 +a1de75471164f3b4c77167e527ffbe78 +a1e990ef882da3f9751515ff4fa6be7b +a1f699415e27815982c1febb726f8fe7 +a1ff39e99ca9a83c5cf34218c13f8d3d +a21cc2a182d3e975ef0b12d2c6d949b0 +a21f984aec9a5d0d81c4e4ab51afb1bd +a22c9a2359929c5ed39176a6e2a549ac +a23cab3cd4250174608bec421d2a36c7 +a26612de4023797a02961cf1ce801161 +a27ddf2ebf1a40c4ddc82e35d9d6eafe +a280a67721c2152d5974f4f7d62be6ef +a2829738c09ae8008815b83f453c9c5b +a2892e4950c989c7736bbe125812baf8 +a289fd0c65f11f9ec22ef818dc33b09b +a29ddd23cca8b01e464ccb70af9a6d98 +a2ab7e27f3770a07adfb8df92afc4950 +a2ad78b72e0c4eb62232b992029a8cbc +a2be15d09f8220a1bd07cf396865d5e2 +a2c9b3720bc5eeae1eddf80c49ac49a4 +a2ca88913e08aa241b531fde6ec7c7c2 +a2cc4eca8d0a938f0f0dda85bc7efdd0 +a2cf05f6378da33e992a5fa53ebf4a3e +a2dc53f412c1f124b1a3890edc33b406 +a2dd01d826cfeae564140e6dd813e6e0 +a2ee55c27d90e7bdb94360d2c215689c +a2f7010ed60bb4908f121427db131d43 +a30c65bea1e86552bc81b207ee5cd6e7 +a3116a56984fe854645648da8a246004 +a31ea4975cf3228f3c9d917640fd5ab9 +a3431bac5e388cf480c71b532ecdecd7 +a345d7b5f44216b452e266be5e381652 +a34dde38571d1eb52e4c3bb6ff002031 +a359a094a4ae97cc9c331025071147c2 +a36bab9f46b87078d677f841fa034f8e +a36da73af6bc207828bc81ce50696a20 +a388bee4c79a13c7dc58b1272791d342 +a38e18960dd20e079891b113a3b34833 +a38e2f2b20bac92ad170d64fc60acc6c +a3936ed04c10f219f5a169b68606b0e3 +a398f6df28590c218d2aff7345511256 +a39dc60783ee5cb97fa19ab03007073b +a3a058535295ec3d1f91ade899038b29 +a3a27791f157b365f21bbbf8caa9f8f1 +a3a38a45cb9427671f4ac9e4b5050994 +a3db239052e78f09e5f169e4583028dd +a3eb45b1a174c60bd9ac6212bcab0144 +a3fe7ad30b22d37e15907fc0a0e16278 +a4067d8c6a897b147b4b1178e49d7d23 +a40acefef8a744982aa3fbf1e8637899 +a40c20a16b72b264a970c78450c3c344 +a40efa0147fc25cbbb35f67491bd9077 +a4116e3c58af4a31269a00742fee1f06 +a4134473a5d6457b34349e50844d86ab +a418d6016d0fbae5e687cb7a936ba3c8 +a41ed05518cb7eca52be7f73f65a084e +a43ccf88b4647165f0e2770832553aad +a44585f60daa2aac47cb5cbc1779cebb +a4509454549221b743b4a5683dc732d7 +a45c7a4ff655b6b97ede9a595b4424c1 +a45db02457bdecd4b9ad537cd895880a +a46de3a17ea9c6b3bca3958189415cd9 +a4761ed996fbec761279df2092c6c4bd +a48a95272cba77969f0f0f14015fddbb +a48dd0f09abaf64324be83ce86414b5f +a48e773dff374333cc8c6d5d310e71e3 +a4a736796c5c7d0a1b8cbac8d2ba4059 +a4ac49cff511a8557e2ac9fc391f911f +a4bcc9f9b7677fc1443e92054409cf84 +a4bf29620bb32f40c3fc94ad1fc3537a +a4c118a97e94e7485349a20b055882ed +a4d22cc4dfbbadf476ec0e29b1b14578 +a4d7e7840c57ed275c6dcb8ac48b97de +a4dbfc5281efca5ab28cc5f2b8383ee5 +a4dc295a427b62b5633b807e92fbe272 +a4e5d78a05024ec5e109f73237f1585e +a4ede811bec5027fd3d5e9828742b103 +a4f8e16d9b7de4ab298d82c76e599856 +a5026796d27370875ab3eab1247ac234 +a519dee87887e911a891fa618bcffcc0 +a51f176de82dd58f0b0f6f269eddc3ce +a521f22b51b0514a7ad0be911a1ec871 +a5250a2174ddb320e2e09f45767cff37 +a5325e91775f4271fff56fa5b6461ddf +a54b35ab1abf1ae437dad96fb0f22c4b +a54fce214f6d3b88e5cd01c8a3fb1f18 +a55b14fc0d85531aad740ba43261466e +a566ef72cbecd5a7b7f3f2edbf5d7354 +a5707a73d8bd52292c497f81337b8ee9 +a573ee1ed7336198b1af2ae124f2239d +a5943a660ab587ad73c1fac08cd43afe +a5c0d51ed6178237b27965b3f7155a1b +a5c8fff79d7d9b707733a1164df14eda +a5c9837da132b0231574034eca500cd6 +a5ca08cba00d43d6eb3587a937108495 +a5dbbf9aee9d6d409f8e9ca5727c2455 +a5e6310c786cb63e8be281df1adb9524 +a5e6b2deb10297a5914787e3fe02d535 +a5eac687c2a84f863085f785898d5178 +a5ebbd0d05dccde3bedc52734a98c819 +a5f224600ffea4ffdead0cd03f8e9c85 +a5f4a8dbc9f9fea2c4000ed75a2128af +a601ba1bf2501021d85e0b41e5af30dd +a606e8a444464242a5d8c01957f00b59 +a60b296bdd3b26e4bf24300f9c843887 +a610851326ba6fd999a724470a047ab5 +a615c4063d0e05a5e886c3e2a1dbc652 +a6247929d9094c78ffb2f40ecc62d18d +a624e4018072bad25dd1ec15661587f7 +a62b30b117f41b0d284b65fcabd5f87e +a62f3e5edd1a8758906a28446d2f3ae9 +a63fbb2f57e5f158283c479e0d5dd23f +a642b18844929defa8beeaa400c0f029 +a64c75a93cc203a250eeeab210cb18f7 +a64d9a0507d05351581e13a5917c03ef +a64f4a12058c7c6d19d66d077487c593 +a64fd871e1e38c01b755349cacd9228d +a66478937c5c0f25e1ed21d30f441dd5 +a6760345bb18ee5146e009a3a9f30b37 +a6769869d30be4073ec362ad9f818049 +a682ad5b839109903ed0d34d3b9839a3 +a68e28c9e54b4d99d724732931b2b37e +a6a21c0a1f689ed48ff315c49883e1b2 +a6af9221e7afbaf1bdc5b1ec7ff038b4 +a6afd7a7cac33918862c6dd77bd1d0ab +a6bb4f9fbcc134007a1b88113d2c4c9c +a6bf403f8f3770469044015041caa336 +a6c47acc6da5cd869411806c4f99d60c +a6d09ab73a830e45b3c079244a3bb404 +a6f974b058141b01bd89d4466676058c +a709a80e83149cb1ec4df4de5dc7c577 +a70bb65737466ff67cdefde352692058 +a7152fa8af5cafca140d4096a25f8ab5 +a724caf40c80aa8fb5b288a02677e9a9 +a736d58b2ff4fb7f99529ef4298dd379 +a737398b535c166db27d35c1fb7be89f +a73d6af85ed412c2279d1a3d5c64bacb +a74b370b89e00ce1cf3eb7f0eaf9372e +a750b6177cd2ebf5b6261b609d0d0f06 +a751a4b2ded4a505820e00f08d96aa97 +a767513e90b1868019d61e8c4cfc71f5 +a7777d4c044cad0f3014106b77468278 +a783e77e095253f7f7570f94e306626a +a79e9acd6bded8d029b510ea37d5ffda +a7a0f44a574df84c55b9f7b5436c21b9 +a7a88c8251d8fcf968c22c990a052fe2 +a7ab5f12f9db5a1d07df3002cdec4f5f +a7b6adb31e98b4ad52339cd3bb4cba3f +a7d06d56aedf63b1779195a4ba08c77b +a7ed3017da632e3a3c453c1c7a42e179 +a7f16f47dc46def1c7f2941ff913ac9b +a7fa2124f529e77d863f2fbf169eecd7 +a7fafb579b846806fe14a3ccd46e1ec4 +a8029c981c4443b8adc4c532b4248091 +a806c993fccde596189ff54681b6451c +a80924b55fa29ab5c37e74e42c37f0fc +a8247ab9cc1624013d0db751e2a92819 +a82813fb8c89769df93f52bff88ff861 +a82c584c83e81b4443e39248260651f6 +a8319e701e007f4a6dc049ff545a8bf9 +a835b54dd7f18f3856fa24422cc07dd5 +a8487ba30eb628cbe24caa7c5c7894ba +a8490fc00e3f01c0bbd7a06341834a00 +a851bbc80a6e9395fcae8feb0f9115cf +a85d9c36a0a8fd2b2db13b25661a6d5b +a87208a1348c7fecd1c5da4245c49ea9 +a88dc48a3d472b00a9ec05cc468d52ab +a8a7dafa959cd53e99678d6fdd758955 +a8b639b48d490d23783721d42e5f96d8 +a8bfd9722e05c52489ce2422560a0219 +a8c2f14588523e48cb0a8ea3185bf0ac +a8cef1747ac12f16bb711dd3ff5bf88d +a8d619e0df13470dbcc5cb5979ee2b36 +a8d69bf70c24bd9a7b3433f922a86d9c +a8dc782af244a386986023470aa21b4c +a8dea9d38295f0261071ea8f8c9fd751 +a8ec69622c289a773d3bc8041700f085 +a8f8da519615621017136b2577f87896 +a8fb786b36da65efabb9a943977f3cc0 +a9012bdc64259341b29c97af5a7986f5 +a90550d71dc582d674d5403a053f2489 +a937cda31a40f129b1d3e4ef8adff391 +a93bc62ceac4802867c5af6f6806686e +a96233d7d46bf9e5989a06756196fe15 +a97510e84eedc2043450caeb7eca0116 +a9819c3ee3263aeeb8b24741b5797541 +a985bf0f200ff6ad8569111d913043e3 +a989c2fd4425ec3a1eeddd80ebe4921b +a997d7217ac34292f89f5e79078462b2 +a9983dd09995380f3214592da06840e3 +a999c36d04a17b274ae40d8ad9bda1ff +a9b654057a5dfce4d26b84002912371a +a9c3d4c2c3eaf7541f3919dae14f7d5a +a9c842a9fb37fdca67840ee147862f3e +a9d416e2b22b0cd718146dc83687cdef +a9d6fb3f9341174b3c8a4da119a9b262 +a9e6c2374425e6690ac3a6226a1383b6 +a9ee4d12fedcbd66f4c480aa428a7739 +a9f1b03d1e8cf0b6fa883eb72db3b686 +a9fdc4f9b9e03269e488fa06c940961f +a9fde324f9795f8520337de30acf59f1 +aa0efede56c897bd3817179cbf1ee001 +aa1361b8f78ad70d058199294638247f +aa1ce869d58da099b8c15859540ad220 +aa1d5f8d5ab7f98d29948a49d49c29b7 +aa54291b3d5f43679f567ff0165d24dd +aa5f7142d3019d7e5fd5d1bfa39ff7eb +aa63465c482c9a5548c4a76c8b5ffa0c +aa647c558134576cdab169c343b4af56 +aa6cfa5498fa7c9715e8f8da5bdd8518 +aa6d6fcaa225fcdff3605a9c2f3631bd +aa6edc243064d665ea1cdcb5351f2299 +aa6f860649549463eab486ccaa8ff94e +aa7e4a509af741ea6c3f141911e1ee18 +aa88ce6e9538ae472ac1867ef068abfa +aab47ea2f6940a84cfcb552d4aa00e81 +aac23b193453ed20a31b5f3e8f63eb88 +aad5f432df21a44791c92f20e65f3105 +aaea435e5e1e65b1f7adc3caff85f65a +aaea85e2b15ff739bb5d6da2e25125c3 +aaf098c34da1e0c1f5b67a46e8ffb9b0 +aaf34a6d058602942c845f26a8cce145 +aaf3bf45fca0a49a26d2c8c0b0c57e23 +aafe376631abe96bfe3e9c4b9f96ba44 +aafe9324904e08c7ce13ec3db773a109 +ab03351bb8f2e7f4a8c6409e6c8d2102 +ab13239a3fc7bb2e04805ab1f0f76efa +ab1a6c21858fc7dd4300e3b56dd8b7f6 +ab1e471bbc3b2bf07f25c5e9cc9b2e3b +ab342a8ba0808417467517e208b7a930 +ab43ffce846545414d21f464bc80afc2 +ab491cefdf032d2cb3d0a16d2a7bcece +ab52b9b336b0231f0d7b7d351bc512c7 +ab5d4c307825818e1008b619ce7f8ce2 +ab66d51a5fafb45fade9d8890ea01fff +ab8d7201d2106a546d77cf7ac356d621 +ab8e3887d21319c416eb6e6cb6edc21c +ab911068a34ef9166dea75ae7c591aff +ab970d69567c2c98a25a2effca121163 +ab9c9acd500b771356d9021f5d381efa +aba3175e6646dce9aada751acbc87153 +abb01b1e562279e0c4995fbd8f60f2cf +abb096625706f4899de861265b5d80bd +abc10433ec01e0a6c3e5db2c6e6de023 +abc3f57afa87e3bfd1be8adcf6fcd417 +abc6d35cb2e8612025b4cb5eeae85feb +abe86bc407c6d9e93d696303ae34d352 +abf68719c1641c26f5a64ff2e58a59a9 +ac0a438f233e582c7689ed6358acec45 +ac1b363cb10ef879d17811af95f37a23 +ac2191376e5d4067c9f0ade7a817e853 +ac24f85bc10f768494e0e6bbaef165d2 +ac26630fc33991496e1b4b9bf99a1791 +ac29b639abc290eaa3f51b19245b1edc +ac37874b87b75ce14629a7b8658dcb3d +ac46d76dd3dcfd17711b427d2d0a422f +ac4c190b3f811317f3479847c01666c6 +ac50dc4b5b3b8d5ea98e2b9e802aa358 +ac51fb0bfe09405a78cae3043e31131f +ac6152f6344311227824852ae2e51448 +ac68c662c7c7eae0ad30b6f56298de1c +ac697d94c0855858ac97737f48d6bbe2 +ac6ffa6fa2b77c1d314374c0fb6b48b4 +ac965cad1b369119a384d506c57c976a +aca2b5b9534431e10300744ef921b0c4 +aca93b5a3bda9d990a80475a0146b4fd +acadc906ecd2522c25ee3868c568b6e4 +acb80341d8be1472df8240f1840d5c4e +acbec43699b6f393a306d1fece690502 +acd753090dc380e8d43087fcaf08d228 +acdd918c9f0c1cfa90c42ca0c7d5de55 +ace2958b4a71019edb4bd1ed3a8bd567 +ace54394bc69bbddb662673d5304cc93 +ace83e25d9caa7bb876fa444ddc867df +ace9b9b27693a255b1bd0b5ad56f0cf9 +acee958304996eb3e27ca4f4497c22ce +acf679ec9fb7f9b4fbbb240233509c51 +ad1a4b2a16f6207283abbcdc3d5ec0a0 +ad203c5829fcb833e52ca082dea0f84c +ad2642598114a188885806d3d82b9a5b +ad26815d6ec1c3aac207801cd2f02b99 +ad2785cb599ea7f5a55164b872dfb16d +ad2fb94f1c174503a9188edcbb6df137 +ad3b84e3d99f595f8553a90f65456e02 +ad3dc0e94673e89e0e510c79d65f742a +ad3e7db827617670b7b8883c15fe4840 +ad434846b26df423795f923403cfc01d +ad54fdbf669ad8a558cf2a11b8a71edb +ad6564ac13d87062c4369856021d4995 +ad6583b6135295f5cede0a2f7c5ea453 +ad6fe6174374ac4194cf87a78ff50a56 +ad7278250939ec455ab851b0b7acf0be +ad87edbe10a7ba7a778a44f0cd9924bf +ad99b56f13743ac351d0f7fbeb4763da +adaabd9a6754c2781899614123982096 +adc361c9b0703e52270c779eb1dbf94e +adcb8c3509ee31e3254b09b8693de9bc +ade6d55c8b17ae345debb68ad1b6b08e +adf7974a09f26f1de2c8d6e7340f5703 +ae019c5c14dd39f5f2c64d263f6773fc +ae09509e1782d4ef273ac03b1ab908ec +ae1249751998d8086f697a81dad955c4 +ae2b4221046f6f05be1681f34210c1e9 +ae30f681102097bd86ecaeaf4f11b3fe +ae32047b57843683a489859b6e425269 +ae3b1e777b7e96c8e52eb8d25c09870b +ae3f09d2d57dd1e5db763eb855ccdf4c +ae4e82918fcb03e2b82909944defd122 +ae50f24ab2b67c126890cb3fc98c1223 +ae542db9b1d7a06ae28238209b04b6bb +ae6c2e512ba5203b19ad91d45e1880ce +ae6e2fb5a2e472ee831e9404203f36df +ae70116cfd4be83efb95ee6253ebd453 +ae79c6360594c1f6dfe3774362b69df2 +ae813b23e96f9b683a96da5993680815 +ae84fe6cab83770a6f60a23e7bc61666 +ae97c615f09dab4e13ca40c63b298df4 +aea42250a6e7e50fc430a97e26ce1b0b +aeb0659e25ae7de0a488d4584ae72761 +aeb57c1d6cc562062ed3b8aaed6fca75 +aec0e8dd7022801f5fbe750cf4a708be +aec7a3d60fb4922b0b3f5c37bf0e1452 +aed02e02b63730e018b4e4c150016ac4 +aee0f20ef38cd142b0ac515132a6b51c +aeefa08fa9643313a8d9531be55b47ef +aefa4484a8aca9e4acec23f9b46cb1a4 +af1b835d63ab639deb675374ddea0229 +af1effeee46405217516b6b87aaa1f8c +af2519d3d582846635f22e3c68530b65 +af32e5c356ff6a7fe7f7160d5130f0ce +af337eedb72ba47957a7d28e17bdf243 +af34e4bd8e649b2ac8e6ba889e53ae95 +af3babbfd0e8e5abe36ff4dcc2f67eb3 +af43ad370b0a3058b8744b06eb00c4b8 +af4e8844557ef1d1b7207b74921517b0 +af4fbe93d3ec51a5b88fcbe292f63a15 +af5c1a5d24563fc8570b2da9b6050f24 +af63d9a717663cbccee859122520cbe5 +af6cfd7d9a6c41754d452b9ab9409452 +af6f5ab83cb39d2433b12c7eec98d859 +af6f62a3fc1ead11bef2c48e1fb75be6 +af75faad019214a0f756846329c4d38f +af81ad723e3ef4ef84dc3e637264d1ae +af81cc70619ab9caf732f3b993d86b5d +af899ff4fef9f97493474bc14710ae2b +af997ac16dbc709949f30502440b9be4 +afa2dbcbe7b084df4a51bee53a65db24 +afa3661ce72b04834eccc047f523bb98 +afa5e4282abf5aefcad95782909d69ec +afb8daef84d259c4464992cdfeb5ad5b +afc955530fc42937b3df97a4a6b41f17 +afcba9de91d1ee7cd2d285746b82b434 +afd1ee4c7cfd80fa585874809a1175d2 +afded55da3b323836e04a78b05bd2fb9 +afdf70a82abd25903725833b8a3bb729 +afe4e1f068c4a59ae648de8449bafb74 +afe82b09ef280307250c135dcb2f3050 +afe830bef28552fcd0047f1755383d7e +afec8e42a98dda698f228b5ff75a39e2 +aff18f287390a674909242e67491b739 +aff6a67125f886623c0eeb68eb80a15d +b00ebef9499fe661966c161cfb9d516d +b0101d657be8dc27412004ff01445b19 +b02413de58cc02bcc9dabfe6c77cf480 +b0265b78a40c8a900ece2276a782105c +b0467c404976b0a9d0c09c0fab6a78c4 +b04c78ce5b2cc4da43e51ba9b10a1f10 +b0545467de307aff9279f5398beda246 +b060983c55f70832a2dcbb4e848630e8 +b0765c07f3b71cf97764a6d99dadeb60 +b07790d8da08b09ea1270fcb1d12f473 +b08843c8652271f0b022c577a731be11 +b08a05dd19875a94d2c0ef92fb891a22 +b08e4471cb05457f44aea8a4b4bda80a +b094b14027f9b01206cc3cdb1adeacef +b0a001e33e7bd8d39530aaa8fe2eb103 +b0a2ed5bfcea48a4ec2208f1cc4aa474 +b0a68402b8554cc8001b78673b7d47b7 +b0b3775dca18857213a4388063b46d6c +b0c096dc595bf08dee9e582c0459679a +b0c488ed15cf7e43050cc526e51fa4d0 +b0c89a4c136b6c932f72461e9d9101f9 +b0c9705c65e14d5cb9a1e28cfb96ffa9 +b0e81130a13ae0d723d08a1f86011c65 +b0e9fab89fcab69afaae4f8870b80a7c +b0eec718198b07698e40db1c7d11bc93 +b0f1ca1269fe07571b1f5d4bea08934d +b0fc2c737d37419a08d873b7c46c3b5b +b0fd25c1fb3eccfde2be8a1fbb532e83 +b10827cbc42c53e2eb50206e617533e4 +b10bbf87461443d2eecae96a4709843b +b1100d203466ce1956e3e287f4514434 +b11057a22ea7981f49f8e31bb44e67fc +b1181365bce0baef39f15e5d8923502c +b11ce6a021c1850531287d40a36ef8c4 +b125810bd69592a653effede048c2d88 +b1283494b7516e6ad4488e6c9112c7ce +b14ca7550dab1e7eb2faa2745a04366f +b151902ec73ded6fa5e0299aaf5ca70c +b15968dd1c6c3d7c7b2051fc16572752 +b186def2bd806a0739068e270c7c7a18 +b1898782c046d9c8bd86bb07c362d244 +b18f0e139bbe8439e4f6c0154cc8a05a +b1a448bd172c3a81086df06f3623f225 +b1a49a896a6dcbb696bb127209b1e915 +b1a58ad1f2ecf3ad356445a4a5a7534c +b1db2a099fae039212ac39c4afdacf00 +b1f2627168da620528541b0d6ee37a0a +b1f8524bd4d18fd3e31feaf20b1f9faa +b20c48906ec73b64239dcf3a9badc1d6 +b211274e60074fef99c1c70a6131163e +b21bd05423d680d7261bb8b0f9188c7d +b262aa2fa89e8aa98f2b2d36a601e76f +b2637d7c37876235be5896d5c96d8f32 +b264f831b89dc9d7a7fef0ee7a3394a5 +b267ccdc8a46bb19a8e7cf3f6ac0c968 +b26d31e33dbec2def32f8ed3ad390481 +b26da55442920330e9673d11e642a7cb +b27800b6b7115fb4b7a5ce271ec0a8b2 +b2986882ed9f2146a9327e8af13198ff +b29e882cb27f45378583009f901b2ea3 +b2a8606eef742b36e17f9687610879ee +b2ab87c4ae36442de0a2052aad58f17b +b2b59fe524470730b266067781375145 +b2bcf05db34121e08c139a588ad2a6b9 +b2d93f50b2dfd189b603e5f8696ab9a7 +b2d97c579cf03a54fde9860e8bbdf15a +b2d9d8364c97689350895523464926e8 +b2dfa1816eda939ce9ad94b6cf355399 +b2eee112d8c73642ac84fc022875ede8 +b2f18518c643c03e8080bf8270b0692e +b30581c15d9322a50acc9d280b36ca80 +b30a09a7a0595c033a561fe37db2e60f +b30e87a8739978c39a808dfa37083907 +b314ef2391ed3155b99e33cce0f7e395 +b319620d481aee7b1ff1319e438f4534 +b337cbfab3232ab080494e5a581d70b1 +b33b5e0e3610c96f50d25fe7c5a02e26 +b35723525bd5df44dd692729ecd706f1 +b35f52386ca4406be0953929ef38bd6b +b37e484ce71ca7a60a7d3ed766920089 +b3859a81a20175f56874aa10e993250c +b391b57d83b30c52517026f2e1b636da +b3950b9329f6c9fbf38214707b788a6f +b39e06622542833d066b7fcb244b93ed +b3a1bb706280c712e2b69e4de6afe863 +b3a8d3286f6d531d852659d45e2385af +b3b0821a9fc66eeb29c66ed2cadef71b +b3b37cfcd1627d7dc703e6b39ac61da9 +b3bf1962b33c775be9655de714a685d5 +b3dc6d6251dbcbc0bb3103587be30dce +b3e305b86b94c7abd47e583ad344bb7e +b3f506a368599ad3796a5178e1894284 +b4056d6f90c31c505cd4a99f822f007b +b4118ee851545eec1dcd7c15df690e1f +b41b85026467f4b01f152f1ebbcfb4f7 +b42e89828baecda02f2629b2c9d4ab59 +b42edead59f9296bb5033a152151a39e +b45c6d03795177e84be4f21b647f65e9 +b46395e531fd2a13bb715dcc63699c6c +b467b7bb74ce1413508646adb42f3547 +b489ed84c0e32e5e6f58e6e2ae6ff012 +b48b557da5b98b5f386e48953cf338f9 +b4a34b0ce43495deb38ccb0663cfe025 +b4b76eab6394e1d0763f9ec1c2ee1b07 +b4b9e1da760b45296ef3a8dabf8c368c +b4bd3e94f4a8f4b49c73e95e39cb275b +b4cccb5d899874a1f0acc4f4ee21469c +b4da68e55fdd86273e5dc84d64a939ce +b4dcff022128f7b44ebdae8b75c22f96 +b4fc7a214ee86977b2d5a00d0ded8804 +b50149fa9d1a0dc0ba626c33d8881852 +b506cb34fe237d54880dc4145b2c69e9 +b5081cb6d5afe5a675340a6950c13b79 +b50bf86f21a6c7ac636740781a727cea +b50c6c17119bdae9294a04b6088fa661 +b50f004520eec8acc860fe7c6cbbfb07 +b511ba57984d4bef75c9e4dad4450381 +b524f2f417f69fb44e1a5bd0687985cf +b528a0fbc274e39c492ee47336802402 +b52daedb07a3b734b8c8faed314cf025 +b536550d83679929d84e704a432ac291 +b536d2b4dd2e7f6b6249abe1da7719c8 +b53b904ff54f99b8ba1066e5796fd59f +b560151874501278b2cede76769ad321 +b5641b492efab87e16b5813e6c7f0260 +b579938732cea67bfe470a104e69717d +b579e7c1ebfc2081c56ef7526bc52f02 +b5b098da597be07569f6dd0a94c0e0a8 +b5b1d470e272562d9e72772354cc36c8 +b5c7af141f865363ae3fc4ad61404962 +b5d7651fd205079373d1687c694d3e0c +b5d7e9ac2c5fcb7825e503213c24f7b6 +b5e81c6dd34fea6d27941bcb08ba6ed4 +b5ed8cf85cdad9a372b549c0d6328b04 +b61e2317378b98659fbb07fc1e35052c +b6215b5eecdae7cecd8f06e4e73fad28 +b62d3521cda1c4bc4a18d7c314552755 +b63a9b8886b7ca6e395c18b7189d3d54 +b649f206759175f82205054e43be8bca +b64a48a2d27f1ed5b6ca7424f3883b7d +b64c1a9f7e7ca5aabb7b12598b4f033b +b6514b9e6aaca984d4ac7d34c7da249a +b651fbcd32cfb4339b65cb7d3c434b66 +b6537fd0d9a700f7e6685fe3ea903b25 +b65656c13aacd851b27013f3a0289baf +b6575aa00b5d3f9227292146b2bd507b +b6656fba876876a283973f112053bb4a +b66e21b6177f3c73b2e64c06ac5fa201 +b68f49cb82b9592e656065e5b3121e43 +b69696aa167b85295c4f3f21a02564e5 +b699f1cad414a31891c40fd4e49f616c +b69f04db79f8416361e0f9827662c072 +b69f737852ebb49af93c4f1c8e2126e6 +b6a62a3c9eb9c9f1c2a16dbb0608fed4 +b6a7d9402f8f8a28536a25142afbe5cd +b6af37e4d70076e3cfccc085c2b018d9 +b6c12947a59fa4b6729807705e373c3e +b6c5317760430b85b11a65d5ea2368f0 +b6ca4a29cdb685e386a172f79b0a3d95 +b6cb281c72e552f8868ce965bebb2e77 +b6d5ab7042493a8fb49f7008356b3a97 +b6d8975abf08135c42a7c88ec7d14097 +b6e8f1e63c2957b577af2620c66cf24f +b6eda6cc678d82a9b0bcdd555b910215 +b6f5a3b9891bab313c6f10a9e8d45e4b +b712e33ca8b5cf255809e80f18e6e04f +b719ac60a4a5c21932fdf2e7ce144b8c +b72462966fba202e44df2919cfe85702 +b72f0e09c199dda5fe807c4f7b42f2c3 +b74b5cd1c8fb8e3b68baa59ef8ec0c62 +b74c38195d346fede64f0243052052ae +b7507e4a70691bc2123c274430be25a5 +b76a8983b3b3e6d6721215993f7ec299 +b76bf8c47bef9ed2f21bafde462b2f9b +b779d4c7df615332f182386fa70121b1 +b7891bc69b428f27abe42d70c95cb260 +b78fda12417d0488f885cbba0661e4a7 +b79733323a9fcecff823ba061c1485ce +b79aea970304d5627d535faf58fee3a9 +b7a91a13cfabb6ee99a1c57d79da39a5 +b7b24331064c1de2f4a5cb98b6d044d9 +b7bc8faff178b0a578d439b718c486ec +b7c8384439c220fda3a461d0a50ec656 +b7ced0c01bf84f3db05a724462919fdb +b7d09cb439bcbe769bfed11fc2f4bdfb +b7e0bf369e9c7402bfcce3d63738e87c +b7e348d42ef1993e5dd161f71c80fef3 +b7e854b0eeb74740fae00e4f91c23a95 +b82b26dff806913d04afa30efe4c2c91 +b82c1b68f5e2fad1aafa8379048c1ac6 +b83b63f559808f43f39bb9c83fe92cfd +b83d9eaac3770921ebf6dd0c550619c7 +b84bd2ee2ed31bc1cd80f094036382f8 +b85209bc7754bdb486034e5cccd8e9f6 +b85486f0506c63d3b97ab11ac86dbdf1 +b85c3064e5a5faffc8427108ca8b9d25 +b860afbc39c3ecc7027c5c82d954e8cf +b870f6a9c1f38315f2dda1b4487ce00e +b877cc4d325c856980d9cfe2a2d0be05 +b87bcfe2f47919192d97819b7cfd46d5 +b87be805a32ea259cfe659c548e70dfc +b8863c158304556585fad4765c835eb4 +b888013506df2f5c11467a7662eab6a4 +b892d44a404cde3c8b031c182efb3a6f +b89f2921fe9e4d72aca9cae3b6ed47e4 +b8a02a9bcb5c6726ac742eb2b77271d8 +b8a687f80fab9c5db8edbd02087ebd7e +b8b79248f76f3e0685bc22a5a2cffbd4 +b8b81afb41d1f0d6dce015eef6c2fec1 +b8c28176913abb9067881eddbaa5e0b2 +b8cba04aea6bb928913fe0b8eb7aaae8 +b8d3bf597ab260c3737600b5edc4ff31 +b8de2d3f683254f4b6512ecda0227f7a +b8e46fce885908547d0d22123715e9ff +b8f2463b8d30d0c8ed3f7bbb5b20458a +b8f35c8b4d2dc33f4eaca6e0175e3cd2 +b8f5ec4c3df3d6d37333f88095bd6960 +b90162bcf14c846394ff9c7700b5af35 +b90b1ad091757c9f950e82c0cfe16c8e +b91d232ca73f76d64a9540fc31a2ad17 +b92dd2f21ca896fb91139a565a22b124 +b953961b5ea716903389672973b690a5 +b9566ea67c6e425a88f1fe1e7e7cba12 +b95808d6d02a0de36348e53a86e17a4e +b95fcba98cfe5db36c3a276a5138f883 +b96b24b385c88b7a0a21552409737424 +b96f7bf313dfdca31b1f70a3771f765f +b9864b4356fd46da77e97ba2ef29f50f +b988357376a289b44960e6e9c97ac895 +b9998bc2d856d99aa542ca82093c2d04 +b99d808f44df8446c68adee25c6a3cd1 +b9a8ebc30fd8f4cb62d6c0cf5a442e11 +b9b05f0f5b65c0f3e5855c23dc490aaf +b9b6373a561abac1693d42278644529b +b9c0b9108f352d57bf4f3419ee470f47 +b9c8c7814d9561221c89b752d3d7e8fc +b9cff07fc0602583d0e9b08045ffc167 +b9e0e8b72c6b269330d28aa9d701e613 +b9e407154884edda5ac05d4ea6b44e61 +b9e84eb899babb74e2e6aa220eaa4866 +b9e92cf867275bcaa37040c91d16c799 +b9f8dfe3700c63fea76ce6075b046a43 +b9f94148f0c93cd9f673b5198e3f79f1 +ba0131d03ae2a439d51d9226fccd8caf +ba114384cc2dbf2f2e3230b803afce86 +ba1bee09476e44509eafbb91fd5c65dc +ba20c3061bd92f37f09da6f5dcedf1cf +ba21920f47f76a76bcf6883d732773ae +ba3c7807de8bb38d6665e8f1275e57c0 +ba40b24eb183154000937796d9e749b4 +ba47b98f674e70164f8ddd7d85c5a5f6 +ba47c192b17e08408469698bf4007876 +ba4b876fc253f4f1445e58b6d55579a5 +ba4e7f7fb5a0d3a4ad03d7d1a373ce99 +ba6888749c7eaa8b66ab91000de718b8 +ba6cdb84182a6a1920c5cfab7ec09046 +ba6d26b01a5f38565691c0c3758fe6e8 +ba6ec2b5521257c98d6e991ce042612d +ba6f0144378da302d78c238d57b42265 +ba77051203c1e535d66519a6cb513c17 +ba8619d2bf1e47f9f96a29b92041b2c9 +ba96e271a677a02e6f9bab968c717368 +ba9a29a6b33104d7efc520848e2b57eb +baa792cf8134517f1eac783aca203111 +baabb6ecbf6602d0e9e4f48f8593a5c1 +bab6663e6ecc73838d8bcf51d6c1cc11 +bab73d929bc5f53cbfe3ac048e290065 +bac7e5e97a8686de56b6fb391d63e0e2 +bae70cf2baf104eee0f665dfa7bf0f6f +bb3470a4b64abe0d674fcf86a0548ad1 +bb424ed3aab377686d3b280554ca46b7 +bb470538d86a9a4794cd187efed52611 +bb497a5b70de5b67305d28c71d908e56 +bb4f764e8bdfebfea93674876315f3c8 +bb6b02fe55500805b10ea2648cea7eb7 +bb73f6f4dfde60661977a81f37a73a16 +bb7956046d3f567ed096e960fa2c088f +bb8045dbc94d5f2ea0eaed1e8d3f64c9 +bb8371defc6ea101fdf63dc93dcbc30b +bb9b210e027797fa4cd308a810625455 +bba2e721a30d05471815d13a111194c9 +bba366c0f2183a339d1853e879eb0433 +bba49acce239bb9dd0aa5e813ed15490 +bbb22cbd1f352be1de77d43d8d2315c0 +bbc499ba4b89572cd7099a2f9361424f +bbca738db80d36f45bf1b8cb70360847 +bbd2f209d23e4c0e9f6cb73a0ea24384 +bbd37129e97a8d08e3310290f530413e +bbd5d68ab848749c6d62491c2e3e9780 +bbda2011934e7b264bd83db8fc80bd3a +bbdead2cbfb246dd784981d6a6d8d182 +bbe4721ebdc91718f2381ffe005030f6 +bbe52efd74d6c8a399c3fa0b338b8d56 +bbea25915f9d81aadaa4f2c6df119f85 +bbfadefe3217d0381da1c7d911d1886e +bc1513f70a5f37a983929dc3d0f252b6 +bc283de7f8d57043f7149b19c9ff98ae +bc2aa2032f0a65484fcd4a7279341437 +bc3d8ff4add35dd71c0a87e007ac72b8 +bc53b570d6325960b5ac1f3632b62ad3 +bc5a99d3e948549b089cc5d500f0b326 +bc5f74e71dade17a545022b5d678b824 +bc6d0eabf165c98c99f57b13011c3c0f +bc6f41d98e9040f9f961dbaf2420ed41 +bc7337fcbf2de8d10f002ce0ef5e6f52 +bc741ec4a0af59caed3947288c7c1288 +bc7f2fb58754dec1141e5992cf15a70e +bc885af97b02ec478e1e3792586e17fc +bc8d16214a1cbe9db6b416391e897cce +bc9a8decbb0397962c560d68ba98b18b +bca98a0350becf555922e579d6e9f3e9 +bcb342065b2cc8ee22abf9ad332c70e4 +bcc4306e3301e7c348f3e52cd8adc65d +bcd8c50b737e5cfaf25f23de1614ceb4 +bce37d998ba7ca039302fd979063a0d6 +bcf55f7a8800ed179cf7822b66c18967 +bcfe29e3f83f8e052e5cea7749b8f2f2 +bd00e33dd335a05ddac184bf95bb2c12 +bd021e41bc58dbe772ab116bd8a1f345 +bd085cbdec8da8baac1d06920da2da9d +bd15a6c612ae097c6d8881017cec16ba +bd1c3b52d6f24c84e4c13a803e1e287b +bd228b33aa016516acd0ab9057031bcf +bd323feccfcbbaefd34c7ca841ec47ed +bd38af3ec7f2a14edc16f4d84da79583 +bd4ab874cddffc36e75ebf927f207ebd +bd4c599434573bcd58d4bad4c47e3cf5 +bd4f891afb981bcfb31c62da64417bb9 +bd67f97c41f37df5cd5bda23dedddffa +bd808e58611d73ca6981165029e58557 +bd83f3febd6e65fb4b43c3ebaa477659 +bd84743da847b48518d867f2c8526896 +bda092bb86dc87aba8f98f585a3c230b +bdba8fd530d685c9101e2f57fa996ab7 +bdbf3f8e57739897df74b1bda3303f34 +bdc39f39b9d21cb02051dab980dc2d2f +bdd03f08a08251021909a28b7fa1198a +bdd38247b23841bf7c901e227c5dd26b +bdd8f32ca8e8eace607af3fe28b16d64 +bde9aeb8fe8f20f2a21be9514fde2c60 +bdf1c38fe9156f550ce6ce28d93d8cc5 +bdf6373fc5e20cbdb8041c954869f18e +bdf68ea99229b02c08fa39967a42d7d2 +be036ceff8413d2e9fa4272f2f4cc956 +be06ea7b3073e1d5f8f19dcb29a5a5a2 +be0f3022fa38f95a7a2774d987ec23ea +be1af0e4295d57915dca67680b43d1b4 +be1c45ef773642d13564d90bb87631da +be23827284fabe8da1c1ba8c483bccb8 +be416c82295f9ab4aa718b5cbcafa6ae +be42b7ee34339ed57975a735f6266700 +be4b7a53b552f997d18b16d226ab379e +be6255feef5450db9c1c8e9ca6e883be +be63d0ab1cff774a101718ac26668fca +be643ee120251a9c4de689a191becf64 +be6b18bdc2890c27cd7369c07b944dd5 +be767f346c0076aa09516037548832f1 +be7a154ea859b7d08f6718e84cb9721f +be82758f0ff6e280ed20360c85ab9d4c +be85960cb0fe75bf0830f22a6add9861 +be9935745d82bbee64584da2de7ec6eb +bea11bd0e3f97051b274d52864d9ab19 +bea962b00d7ce4eaa488fd45d7881253 +beb05d927a4e0341d05e3f5c73f82e7d +beb371a1f6a6d1adee73b3fa1ea908ab +bebf3881551d426672668e50c43e32c8 +bebfb30d0b2935efcac6e8fd163df11a +bec77c8acdeaa7938ade5e205eb133c0 +becc1b4e40b88d61ebc3067d71ffe819 +bed9aee9fea88e61e5a4ae4b34fbb059 +beddf3704f209787b07ea0692c937892 +bee9e82bac778121b805a836484e4ae9 +bf02ca2c0125aa8bfc2db30b797a669f +bf06f452cf0534edd71ea4ec5d559091 +bf15695ced874defdc7abcfea4bef807 +bf15f5b46102c6e5b13b634bcd2fe8a8 +bf1ae8499c88901927fd31b88f2ea6f9 +bf1d5cfb607620dc192d3250594dcc5f +bf1e5e79e9a1e6d0f6bf34e8c984f78e +bf20c3745d33a2c0ab4f0aad97ae4de3 +bf3e90fffdcd2c8b2382baad2f80186f +bf5f616cc1b473097120c99a98a18385 +bf68d1d6f30c95cfd591a019e3f9e41e +bf6bde4cadfad861f3eabadfe8dc9827 +bf7390d9a2ca15aa0e50d3451883b916 +bf84cf82573d414ec8bfb08b72d58216 +bfa1885c642630fd1aaad69680043044 +bfa73ca82c61bbeb47a73f409bdff6da +bfb13ccef978e0fc753100698bf1a936 +bfbde0490d9e3756ee971b12b4fc332f +bfccf3b47d49b4ac26afc88ab761dc1e +bfdc72ea38999651e34a55847cc4c318 +bfe1559217c666c188d5cb7e9698587c +bfe773fa85302d3ce29a00a2255ac9de +bff4ba2894cedf1121882ed43f8c15c2 +bff5bf8132ce4e3bbdffa90110585b90 +bff6d4ecfd3cf1b2b27c0fa6d095ffe4 +bfff5077e297d8cdbd77c7951aaad1bf +c0195d10a65f64239f2e99faa4b0dffd +c01c4d4498e19807623312223c325b77 +c03f825116d51944b3b678736a7625f6 +c0405000bf22cb97a07e65a5cf3f37eb +c05acaa835383a5a414217ce9b32c02c +c05e11a395dd1408bc25fa12367a4028 +c05fb9298f332f590aa98bf0b34fc1ae +c09125f9c10a03df02cc85f411808db7 +c095c63b2ce10970db0982bde3512850 +c096a6dfc238166a6d25e2add4d6d813 +c09f8cd764c935e5b38523fe1e9215e6 +c0a8270c886112b91b7e685608689b66 +c0b4de0b7f9ec6ab9cd59c4ed352d71a +c0b88eeceb4ed077b0524340a13c2e2a +c0bdb767b31a31216ed351d9c0898314 +c0cbeb1b84cd8866b80db6e5b9be7cda +c0ccd48ff38c4938378d447ae9da399e +c0e43349c304e766c59b14f39c38e952 +c0e545ac23ffd8a6fbaacda19716ea11 +c0e87b9bd4758ee85a56e244be9792d3 +c0f0324519a6830d20d25cd5ef217d89 +c108d1e5f5ac64d0097fdf000be5784b +c10f8e8ccd3bfcbe116f406e49bfb5a1 +c1231b41c345a82c28e16f7ede83b738 +c12c18075f42960dfee71b9887c148dd +c13000f9ede6d01b26a81f8ed667bb8c +c15ce14b87d669b02f3711b6b88b1723 +c15dbbc40154b74dcd693d17b00f7303 +c1705b68875fbb90437c8475817d9802 +c1793d48af5bda6ae3994e8bbed785b2 +c182d856c4eae8f500e837ceb2ad171d +c1974a62f4d08a06c3dde4c9274b6c32 +c1a78508514698ee80e2363f611bee44 +c1aa7e631e020cbf724a0eb0ec12de83 +c1b9c8729cfb1ef448accdb94ef868aa +c1beff9569de8f2e06a7c2c6083e62e8 +c1c188de7070f102d9ff370f5e1b43ef +c1d3bea419a31dc17c3e1e4224316b4d +c1d61dee2556ce9c2a1c2b4526b37dd3 +c1e03fda41d32c677c8a2c593fffcef3 +c1e5cd6b053651d148c1de3b267c1bc5 +c1e716812b26b51ef576b338175c3a67 +c1f6d33b71f2130211689ccc0ca02006 +c201afed3c02ac85209d7e226f399cfb +c208baaa6bf2f64bf706d3dd21dabc94 +c20eb03458edb4372cea4b5f301d1028 +c219213c1f73d593eaf1aaeeacb4a7e6 +c22132a98927aaf6982a2536b83ec00e +c22996c8288a9b3c513f8607eb0d2395 +c24637e71407beb0fe07e219f2b6c88c +c24ba1b35ca0a1764d365f326f6ac5f6 +c24c664637fffe3cccbc3d04696b1aaf +c24cd10c99c4cee6fb774fe53f7c0eda +c25816ce4c1d7e4741745539143068c4 +c269e708fadb8a9a2bc6f4b21140b4c5 +c26caeeef2c3b7794b8ec59344ba5ca1 +c2720071548bbe21404928a4417736ff +c275df038368cecccfb50fc73f5fc682 +c2790f22d4580b25ddcb2b049c5ab83d +c298f5eb1f9e5ffa236b96c60a16f55f +c29930f398427ad265e77ac0b7c1e8ff +c2a2fdbbdda4572326e3d04121fcb674 +c2a31c12848cb6bb0ec28487fe7c969d +c2a74992c466427871b3249b59929e33 +c2b1aa9d277854df0222ce346e4e5e7f +c2b23aa6f77754e4a50137a86e1ec566 +c2b7d16a862e1b4c6d6dff5ff883b568 +c2bf4ff10765ee8aa1797cedefa370f1 +c2c19724706c4a652b9efbb408d0db1c +c2c70c91819deb718ed977b85b8e0bad +c2c9246cb99457bd2476c565698697b4 +c2cfbb913e67a64e7afd90fe709bfdd8 +c2d4acb613d7d9c35d693fc4ae100af3 +c2d5c3dd4bc127d90dd433c420c96e20 +c2d948bd41dbc050d6d0ca0357bd1984 +c2de8816e687bcfebb5153501604c47a +c2e27c3d9a6650e27454ca9fae27a017 +c2eb00dff77ec804b5eaa852225a19ef +c2f03cc458bb0d826731ddfe66876f77 +c3040a260393337fa73d10618e6f0ac6 +c305e295ba810b0327b2d2313b116a4b +c30605b4a223ce1d4774a1a143f14638 +c306d59dc55c0a5d12e26c4999823e6b +c315d47f9a778af46aa78b7b681866cb +c31b44475eeb5e182db8f2ea67fa1347 +c31be1fbde4ead2926a1c2b4f26eae47 +c331716870662ac398a535c53a1ca62b +c33191ed454dd0a08a90255263c60e5f +c3349f82e4725721b02c618493043118 +c34a8f4b0f46493d929e1044e7130594 +c3559fbcf15ecbd5db37de727769bb4d +c355b4d9768268df2d1941b86c3873fa +c3577db02eb8cf3eeaa7ff22d6232384 +c3760357d4a34a006f5eee4181b36f59 +c377689f0016143457e6dbfd5f78d26f +c37ce64a5f68192c9143282eb9b90c61 +c38898409c2924d9ef3848c6cca42d3f +c3ab409980f029231ef5231ed34f2a70 +c3b28f6ac320857ea90ea4050030da2f +c3bb2aae3a814727d4c84f8d221cbab9 +c3bfd81d000fa1f3d97f4288fec24771 +c3c6c4388dbc98e6f1f7671de1cc00c6 +c3d521b5ea80005a985237f084b7a2b3 +c3d561485b41918738b4ea8a10d8021e +c3de51734c8ca024f6bfef275e1dd108 +c419793244c3ea9495b38405199a322f +c42ea09309efae399b6635d673db9efe +c436494ec895c887eb267d7c7aae0a2c +c437be1a2efe245a9be8b300dc6d14e9 +c43d2d499c7f31a8938cfee908bc099b +c43f0aca4862d850462ef6dfe366b482 +c43fbb4857dc21589ad05b49a3a2c58b +c4531176bce0c236f68ff2c4aa3579c0 +c46efa2429caee1ad98581b462ff2435 +c47d84e7912d7af4419de4852f7a2000 +c48612b358374d647ce0dc54d64ffea1 +c49ac02c85b982d23d5851e397ee7153 +c4b04c411025b384ba36b4b6917d8ff3 +c4bc9d2cd3c45329b3b8dbbcbc0a3908 +c4cc2d118190fcf6227320a8c87f7183 +c4d2be2ba25aa0d025983434657c7c42 +c4e17c52c66109a45438b8ef4b06115b +c4e3b602e04a04f08a3f0e5ce3e77117 +c4fd267e232b2ea21988d8dcc7202a7a +c50f6f3eca40c70fbbdcaff3fab0e6f9 +c526ede9809fb0ee239f2362c7e2e591 +c529aed4300d5da7c117ce10270ccaed +c5364cfae807e274347d4ea339fc047f +c54213250f43c44f96e005ba3b713cb4 +c547c0b8f799be41f3b007739b7905e9 +c55961d3cbcbc41986168caa140e1526 +c55d7eb235812f4fbd95c56c041ccda5 +c56cf7c1b17ad019fcfbb217586eb4a2 +c58651a28511c2f1923ebc5e9300d363 +c591d17bbc70ed4a60baa12eed9718bd +c594e523c8158998fb413f06b2298042 +c5a98f6d8f9a92fd368c6d0aaffffe03 +c5af5f1667e7455256a6850c8a83dfd7 +c5b100481e19b4735f8eb6d0c62a29e4 +c5b357e7683f090082ca3abf69418c20 +c5b8494297f913008f269f38469a4b74 +c5c000c3ab56cf9a444d210c81812d2a +c5d1654d041a0ffd90638672b6c87c80 +c5d4360ae7103d0be23e0b9cd9dceb38 +c5e12e12fe024227bf35a539293cdbaa +c5e854bf9fb96ec6c7fe1c160c4e56e1 +c5f61a40bef2f3afe3b386dbd721248e +c5fc1c158ee2801ae60f1b08f20e6d06 +c6070c38ee76769955e4d6d1f3845e51 +c60d31ac627828462e81d60677a54a42 +c61aa07fce067891c652f66f8856b707 +c620ecb778240a2859e933df789a945f +c631381aa5b227ffefc2017c5751bff2 +c6319d4fc2579d26fae04eef74777d2f +c632e4fb2124b702e03ede8dd3e83583 +c63609e84ea53bd2a1a5c6a1d7ef64fe +c64584b0674e96fa16676582bf053b52 +c6783b91dcfa05b822166ce1b483a55b +c67c8c63c2c7757a6d74154d7cf5aa35 +c6813c17808733bdb97d7d96030762a4 +c682863c5a887254d020852a353d42d8 +c6839b52e64b226726b7db7480c21a54 +c69b06295a85e93bc8baaab8334b1b8a +c6a3a525c7b7f81630525ec2524bf279 +c6ad13def9486b873844162a9a5fe731 +c6b67865ae965eaf4f51b9473c006579 +c6c34eaf7493a30603c89b80b3d035c7 +c6cefc370ea6913398fc4ca9914e9d62 +c6db7c5e86bf8ca9574e280a321cf760 +c6dc872d7705b796e4b0f914d1530c22 +c6e086827ac01334aed8f72f0ea9a919 +c6e400022db1a669a8c33103dc2cc9df +c6fa647af128265d695e33489f4eb618 +c6fed278ccc89188e1b143a5247546bc +c71296142749d42856a952429c41fc0d +c72fb487b439e82d79c467b1864f1445 +c74d8fb1ccb093a3fd1e382fcf4c9aac +c757ac914f34cc0c06b0f16f852db002 +c7786a30f6b3a509204bf17cab8a0c43 +c779380e163ec30eb99bc9c2bc99a64e +c77ff2bb1bd5127e950baf139771e4e7 +c782cfb30be5386f2cead8f4cdf584b8 +c784fda52e809ba94c47c43b135b3b81 +c790e7442a73dff95f5c536801caf430 +c79f4f1f3d49af90a85a321fed103169 +c7b1dd36a04ad62583911a6b3e1b55a4 +c7bec929333946fa447cb5b61e468f2e +c7ccbcd24ae031ab4aea06f3bf88d830 +c7cdbd6ad2eedd5155957d46d1647d8e +c7d1732ccabf48b694c8d8a9d011a6fb +c7d956020b614de2dd7772d22cdd459f +c7deb1bd41b36d73d2aeb13078ce4c6b +c7ef41d17912471dd2382bffeb746d29 +c7faa7592e9230d7c7a00e45c50bbe89 +c7fc52ca1f82fc48263e955560e24ba4 +c80693e7f09211327d9f5c1a0ac0439b +c80fd63e62889e96481893c697943a7c +c81c78575389d9cac927598bf34ee274 +c82217d84fa7089e88076fb0a0180f1d +c8240b5a7c5f748ec1e381451acb6cd4 +c82d4bccaf9755bc711e96aa2ce41038 +c82d97391ecbc48ea8bc2251f7ce32ba +c82f03c1ebcbf7a3783bc663893bd727 +c82f8db6711472733932eecdc885848f +c833020e065611a9eb68e2e37922de74 +c865fbeb953e9618a9a7162a3823091e +c871c3ade888d4fadde51e166454a1d9 +c89107f067004417c1f192f7e7339899 +c8977848bccbeae92e39d90188635001 +c8a91f87f6b6ab687a2d67a50ac6c082 +c8b646f456d393b44ad6b4231353a91a +c8d3cc03396e1d81d423ecd3fe22c0ad +c8d980bf8f42bda93f826b249f993262 +c8f17c348c5ea37bc9f6014983ee6ec2 +c8f257a1cac5fcd519b3108694cdde31 +c8f738eb17709f3e00a97345933971bc +c908b54ec126f76a315f8910fa5d4095 +c90ef8135cfeec968364dfc3b6916170 +c91476dc405620363bdbf0318d19c891 +c929814aa7280973b3e8c87c06b84102 +c93852cdb7ac36d486dfb145295851fb +c94f64843fa8dbb53149dbe96df04496 +c9538f6a4e6832d6270cb53fee323dae +c959d364a9e1b1f0a5ecb8f6b79a8530 +c963d0e1041300ed4f771fa0e77fe34b +c965c1587b61a4361929b0fe66a618c4 +c9691d80a8a83a754b5714d53358aab4 +c96f3923eabf7ef7292562343bb25960 +c97302ca9a8a9f8d5013b1144cc838da +c97fcf80f76c559e010a57aa1c27b9e6 +c992fa34e84eff53373b99c3a3fc4847 +c9944c427745e47c3d53ed63a70658d1 +c99c247d4d3812be146f5d4e56c07f4a +c99e77ee9558a5874b4db413a6a2e430 +c9a34390354cdc593fae297a55d5b37a +c9a5c4f1111e7c16e7ec6f5f6472d7d4 +c9acb0ea476ac059c60d97332f320d3e +c9c8a008919366bf188edb91bce868c0 +c9d192a8ff613381549f59561bfe1ed2 +c9d2cb6c0d5411c8558c541c7be6602e +c9d852ab141a60811b42c6c823576bde +c9d968cb681d480183ee5f37990a1ac0 +c9f11844553a4fbcf463b24144c6fcc7 +ca065d958ccbb47c53bd72ea76d6ef5c +ca24ce9a3d6cd01e22799d99d5ebf999 +ca3b7c399f44b29a9141ccd721d227d0 +ca43462b3e1d65d3d8e70c48d64ee902 +ca4c679bb22a75bad552d7ed65527eee +ca4f00fa0f4a1de6ab74627eecfdaef5 +ca553198dadf60cf50affbb3f251411e +ca7b129b7767d76ee6114d924abaa589 +ca7e4e11fd7fd5c291e6ec183e12582d +ca926666e33a84c203bca5161017047f +ca98fcb909defcac679234f7db068638 +ca9a6b7394adb4a8a91e1ea69b431e81 +ca9d1fc592a3cfaa5ffe1bb5193c62fb +cab8547b2e0e05708f126bef4f9161a9 +cabf5d7d4631b2ded335e505b045f410 +cac3a0a5e6430693d10a74deaa372b41 +cad12c9e8a0115fcf9ffe0c138a4f423 +cadeb0393eef1b76bf7605d5b436ebf7 +cadef28393ea7d98ab690b691207d79d +caeb275f95a02a4e51773bc5313799db +caf288503850443c4aca4a2742c0826a +caf610833d4eb36413eb7d97378aa763 +caf6cf3b19f2b82bc38b16a15a5ffd1e +cb138924c98cc469583234dc00fd9c08 +cb31a10d9cf1eee78352d89bc6a9d94c +cb3272980f854edbcdcad160d3591c7b +cb3d9ff0cf9881e9a8ddb4b4075fea4f +cb40922894c17e6c4770ee8f574560aa +cb417a473a80434c9ee74bf497e94e7c +cb431ac903e23d7e813d68a65145db94 +cb4bc46223e2e5641413b684001d6afb +cb4dee6a98d07cbe4344640e647b626d +cb500d0ee91fe94643071d2245f4a2ae +cb61253a7a115605df115f8a666e1fe0 +cb660ff407729755b09c5a2be9d2047b +cb6e6b68d4489b99ce3f6d3cf124830d +cb9901bfb92facad81a1f9bb872e4824 +cb99d3d3e67ca600bd5f0db9e34a33f4 +cb9e751bcf449fab018c74ada98b89c2 +cba1da64c9e09603dbf1af24f49d5738 +cba40e2109a0ab9fda757fb388064275 +cba4b0f2a564733202de2b22cc32160d +cbaa5ee5d00e7cbb70b94da97667b8d2 +cbb2fa76600917c0efcd16710f87cea9 +cbb35a5b28d6a59fae122ac8bb65d409 +cbc38e43b53ab7f3d830cf7e6c660875 +cbd2ed14dab38fc791847a6e3750691e +cbd5811f5d4391f9cfbc12241f663be6 +cbd8074e171722efa2b3d14c59c1af8d +cbda8f272a7db25cb3c0f08141fc64db +cbdd2c7c1b8df20db2e6ce3fcaa4f01a +cbe4c8e5335dcbd18b5e445dddbf6565 +cbe9453bd90fd958a9160b01c620acc7 +cbecd0b88d11469f0a7d34faa820ca0d +cbf1d9c7aff6c4c242c72c50ae5da028 +cbf270d4bfca298cf006006e1af6d4cd +cbf2823cf477f65c61a31580b45fb2f7 +cc0eb11e24d6a72befcee92b3962006c +cc368032de708c5241acb2d9c048d564 +cc3e53f325b86cc6bc5889e49e6a7333 +cc4358fbb9a2db7543ae54fd2550efe9 +cc52a9c19ea40cc4c058a9a3c0c2eb72 +cc54bde270954260673d35aa5380521c +cc5b6a946506e46570449eb6affd3c25 +cc6fe99934e7ebfb8558c0a62a0d9083 +cc70308386c86b786e7241575530fc8e +cc94cbed732faa2dda46893731b6a3a9 +cc9c9b79c7609760483c7a53fbd55ec3 +cc9caeee56a662b153fb9c65a62515a0 +ccaa78a75311b6319087e11afc858cf1 +ccb00a39ea688f4e077f4a2801ca1b6a +ccb96cdbf1c9adaf407e4b475e3ccf1d +ccc8845cb36327a3c1513c9f9c0d2829 +ccd226a6b998497e9937f81d0bc9dd0e +ccd84af3987f1c3a7ae2034a202b0059 +ccda5674a0ad1937a46a6cae69c674bb +ccde3b2d1c9618f08323a653a38e40fc +ccfdbf73793ee003dbcc6bad8613c6be +cd027dc25ee0b92d298a5d6fb70c6017 +cd08b69d6092c78a8aa50ec9388aaac9 +cd1e6505408845ff2a349fe73710e20d +cd1edeb2119a153d124022451e2279c6 +cd2ba870b3db391cbc21e703da9494ef +cd3b56bbeb5eeab5fe8f9c402f0048a8 +cd412d40a2d45916e8aab6558ddcdbdf +cd4cb1a5d15ccee8c35b193395607508 +cd5789af4ec52fbdecc4fcc886423ccb +cd585b825b2efa6dcf28d75f121855bf +cd5914d113c37aac98d2842a51419256 +cd5bc7f810c256df044b5389b785d53f +cd5c3858b3bf2f521e5a5c0971259e1a +cd7dd15959119b0be1e03d8ec7ce23b5 +cd849afa608ebb5bc3185534a7b0e8b6 +cd9514c93b152e6d3caab421e9c0910b +cda041e4dfc09c15849c71b62556768b +cda09690417a06b54bcad3848681444f +cdb10d7580e9020313cab041e1d91d86 +cdb6bdcb7c92efdabdc349887e1e9a10 +cdbf77a962a5e84b9ebf72296773f9d4 +cdd0f98d4a68c8250ad59ab3ae2879c8 +cdd6113d13e610b6ba78d877b9a0ff17 +cddb835d16223de70c720f2b85f73568 +cddf9f31c48545a46528f5453c1d5a39 +cde8caefb08ec678279e1749275e2f89 +cde962e1d7861e10d1a90606c3c57075 +cdeeac49263ac28af1f0159a14b66ae9 +cdf03499ef30fab62802d967fbd5f99a +cdf717f02b6e97f9db5b8c0916449a6f +cdfcbcea301cdc453d0d97465682f400 +ce0bf717f3406abf231d0e294197491c +ce113eeb10f0e5c0d09d9beea9b6c564 +ce20056c1d1f756191e64a7066b2b0d0 +ce31d1b37fd56caa04415218323a3ac4 +ce375a970eec309c2821d70edd0dde2a +ce39df3ea28de473301dd53bcecdd1c8 +ce3d8fdba7cd304bb1cff333f57dec0f +ce408efeea2b8a714a45de94333463da +ce69b1b62d8ef061119ef1c4d945e479 +ce7000ef77600f4b0cc83104d57e2f44 +ce70740cf99f1a7bd47b6fa8ccf130a7 +ce73e5564380e82ad3bedd2b6947c344 +ce77c6980655fd77d45362cc81807f96 +ce86a289653974794139d993abc432c9 +ce8bfe71df7023f831e9715849a3183f +cea89a7ce7c0012e05c5330cb682546c +ceb1fee6f882731708847c3a6970f39e +ceb8bde5095ad4610f72c330364e669c +ceb9e6acaf1be4c283b69b552a19d7eb +ceba1f37c353c17038a63e4f8d370c0e +cebb911659b13bb7a9dd22d826f793ca +ceccd176727a5c4360765b3b689327ee +ced47b65cabf4b5db9b5c8ded1b5a5ba +ced71c3290522f5984b0e7312b1f3614 +cedd86910114a615da264c897f09c32d +cee3455a9e71ab468e3386661eec8ec5 +cef8c3f22191c3b0db9d94f51f715b8d +cf02adc84e2c4631b4838b4d41c72817 +cf163888c5877fc9e94b010fb5eee4dc +cf16c9b8f4130e6ae0408f2c17bbf1b9 +cf2362c6eecaf840189832b523a3036c +cf250a5f44440a1a892ea7e37f7245ac +cf30cf6cdf2a99220fafe8bf8b13b71f +cf38fe4f846096a2ea83a077d5e7df7c +cf498528f08242b53a4bca39d316a666 +cf566f94eb3748750466a1eaef0dc666 +cf58bcbcb86a9bdb796612fec8d8cff9 +cf5d4a4a802615d712eb2c8e646fae99 +cf61d5aed48e2c5d68c5e3d2eab03241 +cf959af45c012dd53aaa81de645147a2 +cf9f09a2ea4c4bf30b02f959cbd29e23 +cfa10a312e5848dec1c13e4382f30f02 +cfd8cdace1e457e1ebbe7004de413832 +cfe1d6b8c99d4ead1053162bbc6d9700 +cfe55e35de0b2a7f98aa365abaa275f0 +cfe6f974c1faa423f77df3aad87a5b05 +cff99571cd5b00f325c2feccb62dd209 +d001144ced1605ca3a3a60a00a748415 +d004015c84e95f2be8104b7d4e171bae +d00d4208e8c735aadcfc40b3eaa456d8 +d01b1cc24a7c6c71e75993eb59fc98b6 +d022b71accbd9054c8f2678647d1aec4 +d025adf6f51fce492d388d237b1d33c5 +d0352d26fa213532aa19ea2c59c78fec +d0480ff518e54b04db39339a4d2071b9 +d04882286ee5675dcc51322f149c1fed +d056e68ce2055cdfd1b473ea9ea6cc2f +d058301336ccc350705e221731896e6a +d05b83efa32ebaee1ce989ddcaa351ce +d064b5d6b826d96dd5335e861267ea7c +d0682fdc684e0df71d672010c0173e73 +d076da2394d6e45916fce4cde6fd879a +d07fcd8666284d54a3266b5288a01a60 +d0929678c0598488a57d680d8ff16f27 +d095082752b59c9e41ebe061582be0e6 +d097afd3665f23baf5cc3915586a8d72 +d0a031b2e5a5fe1c21911f1d2f2e9691 +d0a3fded74bbf94088605064d1404006 +d0ae6b1ce7c7a8efd0341054e81dcb22 +d0b6ab457ca9cf7999156d73d393320b +d0c9e7e860fb98866f7411593457baf7 +d0d0e85828227b0eb0be52d0b2ef0a93 +d0e6a989577781a62671cdc5d4a3ba95 +d0e7c92151db1a8429e5f2deb6db3a32 +d0ecc1d19a19e982af140eddd16ce450 +d0f33a4a6b5a6450d882405a6ad3f2b1 +d1034265f8cac9c83e2f4cec1916d714 +d110f8402c437b940d9c69fba247c93f +d129ac3c2a5a63ddeb5413c070ef67e5 +d12ee8c5e1d1552c44f952dd80a86054 +d15300632ed6dda7dc3b6571784212a7 +d154ee40fd03b2f068cadaca8155899f +d1560252615463a17175c7a3905fc489 +d158ab0176760c600023459856456a74 +d15c227e723b67e803c06d120f45900b +d164bd86cae22a3275f5080490520014 +d171b0fd28f61cc4ee0568a41635d382 +d173d041cd03f0f077757e266af5d37a +d194b1785c847cfe162ad0b98642adee +d1a19e334c14a3f52bb9d66991a484ef +d1a53773484188d1880dc5ef75ca53a4 +d1a677c2bc013a8b732dba84be95b038 +d1b597086622aa90611dbe4b87329f0c +d1bbdbdc2a38cddf83665a0ee233f34d +d1bde72b474c5e3bc1aed8a2026b1cc5 +d1c4ef5781c7812af56865faa494fcbf +d1da293efd8897e17e63ad01aa3b9cde +d1e6ecd91e354fc2d19f02aafb9bb8cc +d1f6c269aaaeebf25c5f2cda643ec982 +d1fb3b7d5a00f75b7879ab10f15313c2 +d215cdcd7e152324f4f5bd1c5eecffa2 +d22ad88ca8501d16caf37cabac1d3f19 +d23c19beb8847c4b2e8a2fcb1dfb8846 +d254a570d26842c83c0c3fe611ad92ad +d254bf8e94a33ff4abf936209ece7a9a +d255c79f7f17cf0c2676a4e25a153cbc +d25af86b0f7deeaf3f4701e1a7cfc865 +d26338a6e94b0586e416451605f38a0c +d273b78d1f5a79e0b8491f66579769d6 +d274920bee4d926defa8932a3d146718 +d27579c6bf0209063bcec884e0392b7a +d28452e9051995810fb7d85c44bbc2ac +d285c7d5d292f0db41ad8b67f56e72bb +d28e9112227f985b2c8942d962ec6bc8 +d290221f41ff70001cdd9f5000d968c4 +d29f05cda96e85104520b31d4b382ed8 +d2a92d0b635bdc8fd3df226b7084dc8c +d2ac32a7f671b121b16d2fd2c14dbc2d +d2d587ddfb87ea079a3a2a9402dc5419 +d2daea847a9b715446f06176138a06e3 +d2e12757b34d895815951023b962e77c +d2f9d4f8199c6d5c7310504d31e5c071 +d2fc6661b82ca1baa4e2eb291e315719 +d309fa56bb7f5152086437d3be53197f +d30cc4c60f4720b18788096957e0bdc5 +d3140a0882f67d853a94d3ce4dc6841f +d3186dc073017cff2f4057ff506f89d8 +d3217fa84014f6c8ea73596bfbd76403 +d326c8023c9d5193f225a4bd0ce5c2d6 +d345a846fe036af436d95ddb0aae317d +d34dd57bbb11ed596e1959f51347bd2a +d34e3a79896569b71ee68466b6521524 +d357fd68b6f5cc1bbd676f84d7ad5aa0 +d369e69568f4fa28a12f4870377432da +d3747ea1beb6ce49daa2c6a6f3bd7011 +d3793b81114937af4b3f901e39d3add3 +d37df3c8aa7ba09cafb144369bb4a5f8 +d38235443481f7dddb0a3d7845555c00 +d38a29074004de501242debb6a25f790 +d38bcbd027deabd0307fa6f2f55b2982 +d39e2b05608f4d836348ec933ed36a6c +d39f3a322959f93076c75788dbf3277f +d3b3d7429499fc4ec3736eb5cbee969a +d3b8cc2f33d17aadaddaec1cbc56f6a4 +d3bc24c88294c509a31ea0008edfa4ac +d3ed01bbcf79cc5cda1048e074e32ada +d40045e52d0ca58b4e2eb116d60f13e0 +d422c921c8a7eb3aacc472e89e72d7d5 +d4240c70124adb6af16426973d56f0e4 +d42927c7404c9c1e99796eb9cf42e4dc +d43a6b16d681bc349ea2d35c6780fc31 +d441b58fa6038154c3730e6e41693f77 +d445288fd02c5a46d363cd05d64fbd3d +d44d1defc33e7331472759a070cccac5 +d44efedb358a904b96c2d8194b6c1242 +d45215e226de10f3106c963d32d6856b +d455027f61dc96f68a7aa9e7005c7f78 +d4554e4eb4ce773b7b4dc2a6c1d94dad +d46527fd7bec1ba7a607cdff7db99946 +d46f79d01c302535cb335ffa01139f25 +d4783c67c4dd6344778ea9d8d2b21b77 +d484a6e2934d3ef587bc47bf4b404263 +d48d0efd3a1df20ca16b84d708dee07f +d4a07c0206c75545aadb003ede2ffdcd +d4a5a69a539c1101a6d653388887ca3e +d4a72b7fcda3e6db0878d8c7440939b3 +d4b725cf841f9d064c73989bfb2fcb10 +d4b757381fe917ec44cfc4acd897c977 +d4b90c25bf7ad45b60980a8d4e86122d +d4bbf7073e4e26580738ad4409890a7a +d4c70818a25b5a1a9b32aff0058dba9b +d4cb3f8a1bfb32bcfee05d1b3b8a2446 +d4d1a5a1619d778f3ef70a8d6cdc0ffe +d4d21e5b83b453711abd06a326d1a8ec +d4dd4712f9dd953f209e5706cc231f0c +d4e79b4978411c3cb9a60176405c50e2 +d4f02fd1ae5ac78cc889bb111b351b28 +d4f0d96be5fc5e662139658438ce2eff +d50807000e002e7d1efb63f5524ae3d2 +d51344f6a419b4c15692659f454482c5 +d515cae694f29b5e160559afa08430b8 +d51c10a36639c51a21d598737d781559 +d52a79945744dc0688aa7efab267e3bb +d52ac865bf4413fbc2831a458b7d61a8 +d52e1b41783c9f002bb2b7a5fbe545f3 +d56076fcf3e79d2f8f37f474813a8961 +d5703f91aa424c96537af1cf8c90b976 +d57a9a95eae10cbbd20d23d7f707a8a8 +d57c3cd993930ad8e0b8cf29f0d8ff43 +d583d439f466b62fcbc24d42219da2b6 +d587b3d6ebf51c41bf9124ec702dcd18 +d590df3d9dc5789c96b8df04c0f87925 +d59d1bcf405525c146c52644bdf5dff1 +d59eb1351b6f9bd6a8eb425bc93eef56 +d5ab46e351c71f4b2e5d6db28f5c8033 +d5d32413b9cbd9e712e39b5148bf5813 +d5d4254709280974956bfa4af411ed59 +d5de8bcf3dcce8a1092f5b922fcd0451 +d5df065b1ca2db6073dfa2e3edbd14da +d5e68cf769ea7be4655fc5a1d4bd094f +d5e6e7fb59dec9772c08572fe2669706 +d5e8a0324566e37785b1a1e8e3fa89b8 +d5ebb6664b458a3a13309378c22547f0 +d5efbf10770b4c26c9c57662830e8a3c +d5f802beff316a39552e1ecf0d0b791e +d5f91a8b3deb55ea391d1d70964516fa +d6108a7842624f22784456eee7a8fba2 +d611ae5a3d8e3f63392abea5f5f806ca +d611e89aef16231abe084350103f9b96 +d6124468da5573029c52ac13e8a4a9bc +d6129d2e81c4a53acc46cd1eb89415cf +d620cb449339aada319d5905e66d7924 +d6256b829ceed278defbc037d53534cd +d62d5497945b3f14ee06676888a4d775 +d62d5504a45f000a38fb78ab99a4d7f3 +d63d66e276b526fc8b795c9ab25323e6 +d642a6646944e4b42cfb08ee0f5e1e41 +d64d923b75d83471e71c51ad47199484 +d65a2a1d0d8f6523bbbc8ab09fe82c83 +d65f75c8d252b214203bb516984bcf2a +d66a5ca2e327386401657a25a0f9d324 +d67a784d9463e8997a86d8d9da60025a +d68d8bf9114fab5a78e8066feda8dac2 +d69b90de6b5c03a4d1b8134da384f459 +d6a2764a31d1d0a58844b0c2c5bff3d2 +d6b3b54e349bc24c24d3e103f796f4b0 +d6c938560c57830ef6973da7fdc050ae +d6d0e2d28acfa0493335a3cb6a1c929e +d6d3d92dbcbd48a09960632a48dcf9cc +d6d58374802438f491b70e48f7498161 +d6d618ccd0f8941263b9e0bb88e747d8 +d6dffcce24542b6dea6cfe237b4bbb96 +d6f0f6f52b512c7870f1869151e91c16 +d6f1a09ac50f7d821c0dcd06d555c23c +d6f2ff54906119d9b2d15425c92037b5 +d6fb4d419f4d8d63c3f74d0ee6b2a21c +d6fc2c145dbbb3cfd1be4a9649e81927 +d6fd79dec00c30f32c0e9ea2ed6cc69f +d712880753079d790dbedc1951f48d83 +d733c21be499bde2e7cd3d9379226cd9 +d7357b66044d99a0fa3830c16973f142 +d74315b04961238a19e4e3e5430d3bfc +d7441e9dabf325a948cd6da4be97d6b6 +d751263ae47ce6befacd62d14e7e3c9c +d76e71978b5e4d684b8c4be65c4d0e48 +d77a07d8643df8b91975c5f3f8a582ee +d7961f9df1ea1e7a1cfe3a7cec93462a +d79ea75449d7fb0aa56589a3800681e5 +d7a71743cadea48a20d18e7ee7e3a21d +d7c6880e5946fa95c80d444a9378de3b +d7c7846851885bfb8ce293786f28dc67 +d7c8ac981ebdc5cf21d38cc78fe16a48 +d7cba11fa373daccfa87d72c7fb3f5bd +d7cce962989332e75c18fc6eeb3e8135 +d7d19d603f1ebfe9abce61b2cd4d0109 +d7dcfda21e26e2e7f72258dde842a4d7 +d7e63d60c79025ee249635ece033e59d +d7e9db725db6d00770aeb38013ff4b21 +d7fdcf0a52d01ebb71bd5916db47c0cd +d81181bd92522b3f78c78f314df2fdbe +d814316be6304a5018035aa1fc333055 +d819eef797fa80ecaf6957b231a2b2bd +d8224e28717c500828ccdd84b7227b5f +d826bacfbe741524e5e419c8251e8fab +d82b45c2cc0efecb2a0916cbe1baf3a1 +d8399db09cf2c1732a93849c1def66ac +d83e4ad7716d15f45f764154530cf608 +d83f11d4ca82bfbc893c3bfb4af39152 +d8440eef2de0fa3c75e63f6e5832bfe2 +d84836ef46bf634b9e5d5c9238a1fe2b +d84ef3c5831ac8dbb133a0b0559f5275 +d855e57415a4dca928e7d492e92d3c29 +d859f09772ac9020a383f65cecf85e12 +d8677d9f5154a89deb25f82a3aef522e +d87046b52e0f46f6872a3f35ca2e3e5d +d8732491262984703b94ee9ca96eb1d6 +d880f8f52341928c413d2da92e286209 +d884c0bb9e125bd437b2cbaf08c3f429 +d88a40d60d54c77c3fbf55e40d4894b6 +d88daec795c355f344b02d9176dc9749 +d89a5884c43354732c13cb19c5d5b988 +d8a8da7fc00eb47e51df185da1a1d6bd +d8b3a0233e1224a843dd7ee0064ac8df +d8b8ed36104188bcb8ee6eb3151f2b6c +d8b9f34b1ab0d4e0d808fd62a4b5e298 +d8c803f70ed5273042652193e3b7195b +d8c819e7ed8f6c2e6cdcda5a835b9542 +d8c98dfd82e4d26a1925ecb4a8155777 +d8cea406f61136b8cf81ea0ac6578906 +d8d0ea3cebf3816087757cf35d6646ea +d8d313c6cb0bcf865c7e1a479dfc74b3 +d8dd8aa8bb76f8b7632f5a36dabf7a2f +d8ed71520310a5611fc37e70eb4fe991 +d8f32406635e19ee8970aaa300d09e2d +d8fce793c3688c1855b7f512aa7420ec +d8fea6248a49ee609369395e5694faf7 +d9057099c5f59c1b9d949df259d746be +d91ef7aa3b2d2909a3a9b0aacea80304 +d924241f4a147446c85068b3acc36f7a +d92e16840133ad1f0d1cc158e3544666 +d92e864835e3295d58876edaf6856332 +d9325b30b6c069135827b3a76a483cbb +d9363f168fa760873373aece7a7a1a4f +d9392bd59f7892a30795ba4b1cdd1d03 +d93958c90b1148c9de3d42d2d6d81f30 +d942e297bd0cf359ec44e2d2ee652539 +d9447000b57613aca2ee9e7ad5eb8e6a +d94a5c53a34f56fe83cad3025ee3bf9f +d9573a60eff843acb77b7332095f2a9c +d95935ee5c64f86a33a8d156a334b34a +d95d36514640818acfbe9b54c8dd5ea8 +d96abdf0a63c75c34fa74b65b335ab16 +d96f5765133d0c7544dd9ea102f3466b +d97dbd544e96efbb7b86211a38815ec1 +d98148724f980393d8d89aa4431b20cc +d9860fc025f402b544f0afd0f1553463 +d98636de4282bbb96af6d103ab63c0a5 +d98686783b296de15b8bc7c46d17feef +d9938f25cbd3b8f1d243c2f412dabcf7 +d9987fde642dbad6a8ff480e88b4e58a +d99c97c5e362a8d99e1b0b8f07ce1a82 +d9b6dbb1df08f8ca9b68a0f2906e4329 +d9d018e33c5638337e2096b1e5555b09 +d9d39bc496ab0e652c50fe0084526f02 +d9d457a63173545d875a930dd5fa45db +d9ddd01a9f6a890fddcb647ee176e829 +d9f29cf5486949461aacc04659dd1768 +da0da986f4ebe995260a983d12e861b4 +da1494c41a6c38dd569126723a9648ea +da3d252a53ccf89c8179737c6954f4a0 +da5071c2888dde7d624a019d01193178 +da5958f29fcaec591653335f24e29700 +da67939487027beec8b27c6fa79578bd +da737fdf55733aa6a754cf0782173775 +da8851dfca7fd0d59ca463f0c22665c7 +da8df5c8dbf584ac5f5d176abd228668 +da90d4777d890306bbfcd50fd1994340 +da9949d0c7a943b7e423f54d220111e3 +daa332d65e3aa9f4401ddaaa0bcbfaf2 +daa391f29fbbf7d41d037dd9f92bca75 +dab72bee915284751e42d4b77ddd0e6f +dab9103267a7b4d19bd51a41208e6323 +daba692c2481b4bfd660de4c66cdf1ab +dabc47f7759b968541a4212b0f12f6b3 +dac553a760f80c7ace18b4018598a28a +dadc0479b989075f91fa7dee66463cd8 +dadf7e87a37ee4282c2533a7d825a27f +dadfc447307b48da127abd0f03167b57 +dae18b4830b531f00085b58feef0bf8b +daf6aef9fd91a9a48debf308fee34917 +db040b0e2bb69fc4460047e215983504 +db08a7ef16adc5bf0071220698a88880 +db14c95a7a0196e857c2317acd39404f +db1ffb0eb5c0177705cbc364f5a5fbfd +db23c330a4ef122b9553e650273705f6 +db253562df1ab94028c96a5e538e27a1 +db2f6b4ee64306821a610883e67d6166 +db2fb1fd27ca88a595ddec35e29a023a +db33f3aa144803423b1fc99550cc387d +db372428acd2bc4e01d2fc864b01a6b3 +db3986ccf3a35a86d89b4f75b3493041 +db4f1914f5eab575e85ea5bd5b70dcec +db5406f8ae133bf191b78c815dbf5f07 +db66faf569e2fbef4d098dbdb32c937b +db70917595520e365ca81914414f1674 +db7b9fe452500ca24b8079bccee1d300 +db811b3713f761b4b56c0cc983297928 +db82bbe1a2f44af77e94803760675d0d +db8c541c9c6db48c1b4f3b7da37fac3c +dba2d7e517fc7afe2a17685e519cebd5 +dba497a367fafedb27c944260477fab3 +dbb4d8368a69bd0794f3c2e5e2ddd153 +dbbac35898019d27b13c94fdb5cc82cd +dbbb16042c69087519ffe73f0b3a655e +dbcadd33090283b3c324a325a4b442bf +dbe5fde1c06a7a1e9f93be1cd13c3689 +dbef57135837f730aa664a2fa1b0c02a +dbf1c3a80f025ffdb783586c5f36d0ff +dbf9bf6de848e82763b57bf95f00759a +dc126f5b1b935e903da8ac6db2624f74 +dc1ac11b5d0b76d3d3585b5ee865b82a +dc3728f1e840b75682bba90c7f517b54 +dc3cd2b1c1aa2310454f8143daa827d7 +dc455d8ca4e43f389c5d253cb612210f +dc48c3d4905acabc509507a3a45213f9 +dc52b204752b9287f1396eb5e9092289 +dc6cce17cfcfd209f1cb04ed3a3fea16 +dc7b1ed4163b2b009f452e6e770c4d79 +dc896eb90ca22e03c656c1249c6029d4 +dc939c435d58659aabede6cc6c735874 +dc9f8323b732782afd2b41ef41d5895f +dca5fe510699e8813bc0e1681b333b02 +dca99a315099795859d2377f33e265dc +dcb01afac2f517777583d56fc62c5aac +dcbc938e0f2de78bc42785b91824f91d +dcca2ed1630582435afa9d42ce361eb4 +dcca3a8966f0c779b9ca2c402afc60be +dceab730a498c12964018317f6501882 +dcec5f2aa70ff7c30afb14f78b33cfa1 +dcf10f3d459ed900a893f2d742915ea0 +dcf4a9a8cbd216d895fdd6de6dc86cb8 +dcf900fdc20e318d3007ad9adada3ba3 +dd0a8523c0dde90f7fe1c12733e0c918 +dd1a68d8de4d58b25cc903640b1459ea +dd1b336468ce1cc94dc52e38ae06fd33 +dd1db3f47f8d41a7296e72864938e2a0 +dd28e248688985e5c84736dc0437f109 +dd45bc51ce48fed7dd63b647abb2ebcd +dd5049b75dbfcd41d763d0fd8b155192 +dd59df6ce97de993be85fe85967404d9 +dd5fb8e075c8507f9828e0bf1f3e3338 +dd61e343389f173f9c00374c2aca273b +dd69aba7793974694ae5f3fd48b0cabb +dd6fd90916ef83abb2c133e5be76b304 +dd71e8416b71672cbdd0ad8ed762d5df +dd775d750c617c128313a8fae4d80e8a +dd7b4bcabbf977b3f05aba693613ae2c +dd82590db9d4615fe1c45833e0e80e9a +dd8b0afd21fea2e1d7520c1f33cdf6d1 +dd8bf3495558a989947ba1a0f76295db +dd8fd1de574ac68821c72ecc8a4cb415 +dda16802e85a6d7a836d27b00edb700f +ddbf55048d48fdccecf4ceec689d6e4b +ddc71faf8dcd5409f622721f45ff11e0 +ddeba015cc3ff2e7d97d763dc2c578be +ddf4d632c10be40c8b88a055bf43b9e1 +ddf8bdfac00df2c00e5a9da6db6f4f0d +ddfa0d96f92f10af4075661ebb7fefb6 +de05c4fc92ea3d3f5371419b6c7591db +de088d5468e327861b446e334b874a6a +de0915d002c684c097feb64f74448d61 +de0c1fb67d48c0bd487baca7c222463e +de0fc80865ded102dd01faa5a0e20630 +de184ac1bf5d070c784904be16dcb7cc +de239c52f2f46dfb9f28d3017d9e31be +de28d304f42e8793a081a503d9e65738 +de29343acd8b700ab9af5d9936f2f901 +de3523636578af35ef5d1f9b725952d6 +de3865a878de4a1a6b1258c7a5869866 +de3aaa6076cc17bf980f47fad063147f +de5fccd2da87a4fa81cf793cbc5928b7 +de67b32cb2a2f820a5a72bd6a44c1ec3 +de6d86c9ea373b035061f68bd3344e61 +de8dd2216df5f166361bd36749ae241a +dea7a3617d262cc913f2cc538c1f919b +deab918e142058c2bb10b4ff0f885192 +deb8351968659ee2434dbc6a485d9099 +ded27bbab64868aeeeec91f0dc31e69e +deef06dd274492fbfb44aba46775f2f6 +defc88d60ffbf406e2a5e297e3d98b89 +deff44bffb8683d46183da3496d45714 +df37e2cac6f3173ee2b7a7b663c01c8a +df389866c131eacb9e0519d88ce76488 +df3fc07f3f562c0f1f3e68056c709ab2 +df51001f923892727b885790e44eb23d +df57c0d6a7ae0e4a058c76fa69cc33a6 +df5b0027f99112342d2f0345a038410d +df5b9c36ccfcb6f97015204a8a4f2d52 +df614d64f0fbb54a535803d145ef22b5 +df6972d24a7bf663b5beb7f4d49c50e0 +df6cd39fc23882ac803db33010b141c1 +df71e02bf1d43a15f338d5e58ebb2f88 +df76bcf0db35a6037215f72aff9f3dbe +df76cfecf30e51cbec766cb17ba77bbb +df84eaed180dabb5959cdb19c2f0b73f +df8bea076c523f734456a8861e8ff660 +df9bc67a2f8e970616c28db598db736f +dfa498204da8a3902c35cf80369bdb61 +dfa77806b34fd45e222eeaf4c146538e +dfb253cc946cc0bb13066c05a625c90f +dfbab63e987503641f71fafb71de34c6 +dfc276141b88d99bfeb652d863b06211 +dfc46e99edb07abc5ecf834e47959e91 +dfc4da00391f6fb956ccbd1bb55d4daf +dfc6fd80c2993e4318b6c45202bb578b +dfdb14160ecc60a421e16d2534632335 +dfdf0cc2dea0a04c8baa5e774be0c0de +dfebf307c24e3be53710fe536241fcef +dff2b4bd783140b49c875e76c8a35f26 +e00065e5934f45546c776c9e171f85a7 +e02807116a3733b820b5b53833479561 +e0447b0baf80baa5288adc76d1c11a7d +e07ebde24849608796d6bac3d0ec360c +e0a0ba8f9b03763da360153b5fba3fd4 +e0a68d11d3b8413588ca22b80e3307f6 +e0b867facbb6c810ae8bf8a033f9398d +e0ba3177abf12f67b45843eb059312fe +e0d31a1d515f021ec9611fbca8948673 +e0e0e12b8acb2b0d8694c1809dd56ec1 +e0f03cb13e90101717571b6c8f616cb7 +e103a97532e85f1cee96bac083dc5154 +e11c594e6a2f4eb499cceadfca988595 +e1264fdddcbbb3990790600e1177c85a +e12b8cbdce1bc8a2cb23555ccaf3c1b1 +e141e1934285e537c88d0874c0a46ce9 +e143fc0b31eced6b6780b48f4f3ee906 +e1494c13fec73fc093e592a483d42be6 +e1496961ec397421cbe2aa23e100288c +e151194d1b7a64b21daefbb0b5d9c90e +e152a011b33aede9626ac4f90e36d092 +e153a0d5c292189d681863e93d3b5c1a +e163a0c795ff8727e15f92955e63eb93 +e168a67008824c5e7a034efc6944119a +e179790f624829f860b78970e716f46d +e189fb6da173831ebcd6152e2a6dc8e6 +e1966bcbb6f8a9d1cbec3197febadfab +e19befa3a2b178076a9cc93986beeed7 +e1a2b60832a1b6fc5b90487bc651a7b9 +e1a3c6e69e52429476ab485e2275719a +e1ac9dbc42e61d7bd27acd18ada270fb +e1ba5872d8e289fcfe5b6b74e52c6958 +e1cb03474ec024c60edc4281ca3663c3 +e1cd3a13ed98e56e940f6ac6e568ceed +e1d3fc235a025c95a1ee9165a6fee6cb +e1d4bda374a313ccc362509c021ee245 +e1d8aa5a7345a13e5f554b9c9d48137e +e1e6495a05ea41771ea6d92f1056b99d +e1ebccb4a9c23423266a7db2bb023614 +e1f070208de4262873a17fb3d8006398 +e1f097f0b2b67cda95bb92e20156d3c6 +e21146fce334443e2eeeed97c33b1366 +e211907115393fc22c436f6415647fce +e21ad1e79ae89576a2fb96e33932ba42 +e235d608ce22ac767cf673db45b8f319 +e245d26754d8286ba99f68c131a37008 +e24a1755db97187d64d1689898e2a57d +e2526281e1a685def65e21423cf8d131 +e2674a48070be278cb23602ea90e6771 +e274a21430179d69758fd1a1c95c6567 +e288014e3ab49a20c57bee18987a1d94 +e289a308ef8be9e70cb729d2263ceb8b +e28c7b6821e13a1f59599956d173cccc +e295b187df9ac8d275be6bf27cef25a9 +e29c041d150ebd8e07c42e5419f6c331 +e2a3f66b3de94593e2e0a6e5208b55af +e2ab323fa209fdf4ea36c4390bce6585 +e2c2896d6a672cd694835b0d58cab7e7 +e2c991d2adb387397721bf3a83a50669 +e2cc4d6962bc95c5badfdb0631b24700 +e2cf5d8f89a5ca402e6aaa7b8557505a +e2d0ff2616702a1ef29971dfaf18e325 +e2d2b2ec865698a5fb641929cbe4dd0f +e2d9ba19d6de1ae1db545958b775d907 +e2ea0aa92a83f924a43df4f9cb2c2fb9 +e2ea86fed95454d13eb061604db48a64 +e2ecf72d1741fe3a7c90d33ecac83fc0 +e2fa5cbcef855018e7d6cebdbb470be1 +e2fc3fb01a99a39e428c8d2412e2b053 +e2fe22dde408d4127384d19fab2fe54c +e3026de7bc18dc7b8e22f963a8346ab0 +e30db02257e019b84182f955468d1593 +e30e6a11fc6835c0428a029d97565c57 +e31870d67c5f7963b4489080f1985f73 +e31f49a468f258ebf8059b62adc22f57 +e3252e34720aff16845f35be4dbe4f55 +e328765fa173146a1bedf4dee07db99d +e32bde72801397a50b61d61de5396545 +e32be1d0bd912358f2e7c8c1a2c88a22 +e32e9fcadfa1c0e88c042b9ef0160344 +e34017d28fe60e441222a098253b7a12 +e365a16d8300f4036825a49ac732ccbb +e36cdb02a68374e23b7f9402e830292e +e3714017e677adc60585c0f8562be26b +e380d17ec5fde6befa154d767e4ae3b7 +e385096853e22aec613256b762e4e2d2 +e39d3cdd75d2be329ac2066b97a3c3d6 +e3a0177b66148f990b18bbce0a208527 +e3a1a3895621f6ff6d43eeaba6ee7bf9 +e3a8ac16c9353023620d1cfe4bffea82 +e3c20f5f5b38c4ec610fc59291553585 +e3c52607c81e8bcd396ceecafd26747c +e3cbc17db832c2b6ceefb3c2ccc952a7 +e3d4d6d831c756191e21448281643bd1 +e3e0236f8b78bf27bc3f2cfac82853d9 +e3e1cf5e83c6f553945a433c0864774c +e3ea7a3d678d8f4a3dd7f24bbc12420e +e40634779c8f12af529ea0307a2cd7e5 +e40c1d6583d8dee6ad2391aa6c0528c6 +e41107820c8b0dea60ee187ecf2e19e5 +e424101a8a2a7a5c636dbb8adf6dd632 +e438aa096de9939b12eaebf01ac2c674 +e446a283f88a5b9f2daa687896b45c31 +e44e554c4e498b15cbefdc550af9fad6 +e46b1434ce61d74ecb86c35a56201f69 +e48d8f30842657232bdadbc9284c7e52 +e49c6644bfbb47ea66971960e2b60d10 +e4a4d362260ecb2353f12b7b1acc9923 +e4a4d5562a96dffd30b03ede75f83d84 +e4ab93951f8b6525050da71483b9ec97 +e4abd10a76a0055f58b4af900a2563c2 +e4b6ad16eec542c05e8ca2add00bb956 +e4bf0553d1f3758a965a5fdf3b6c2c1a +e4c055639dedf1fa528135c02b942fad +e4c8f9e4f8b46099107d1d0ce1868279 +e4cad3329f9778b1a7c83d5e87ed8d9f +e4cea781a67d6695e08993245295b0eb +e4d2503a36ba3e9f58870eeaedd90cc9 +e4dc0c36d021c2d98ed390ad76e66967 +e4e1fed6c6e69495c21b914b14955798 +e4eb39f8179dfafb25ed3f80e7754604 +e4edf980ab5acf3d2b40726c6080aa9f +e4f2825e4157225880fc64d582de060a +e4f5ef6d624e63650cfacf02ab794d2f +e4f716222d6bb580cee05018ca4976e0 +e4fc6f898074b0666b557c98653be826 +e507482197ee11039feef5fc21428a00 +e51dd7cf7fb38b470af5134635b4a2fd +e52896eda41d179a2c3b86d87266ded1 +e537440fa4f10e7ce6299804a78ee952 +e545b597058da7c658643501d4e29099 +e547c7db2578db0d164dac7497079832 +e54d2ce4b48e1b6f9b147c0bbf4573cf +e54fedabb015fd610737ffeb7c4e8160 +e555bf3c0716c04046e75c733db02def +e557991e63fe18f5dc840cfb98ec76fc +e57172a8f562807183c40f6581bc6a52 +e589c717a9a21999168f0e4e093d1df5 +e58bdf0e1e9a68a68593561770ada79a +e593a00b5b8142bcb63bb67a7f2cd315 +e5997bd8c4820d4bab6b650e812e33ca +e5bcb7d060065d767e9b3a76a9cacec3 +e5c5f321a652536c70245008cc2199da +e5ce937a7ae5ae9d5783687fe5ce4fe8 +e5d26b81a5e67b1ed66d17d546527284 +e5d4f51fef29ecf551f50a7e09fb0c68 +e5d5e9e6c9f37cc6f326ac9191a931c7 +e5da2fa480026e93580ba2b67f844f9d +e5de42d09f51ae54d2f88b89499a7d5c +e5fb45c6f78974f70855627bc0aefba9 +e6011515bc6bc4463487f329db03223c +e63f9808e10654c2a71e5e0c5ea29eca +e658bc75b701e9d1e6c86c7f04683b00 +e664f549daf10682c9f964ec4fa9b870 +e667176c8d73df1606061a7809864d7a +e669736f331ab2d1eb854b6801a46d4e +e66bc48c6173d0aa259feffb7e510acb +e676482e5595c633c3b4107a0e3dd594 +e68349e4b8ff10afc15f24b83cdff841 +e691253bdabbf723a9644e0ed1a6d31b +e6936bf4a289834e59915f29af84874e +e696c130e334184fc170cb0a0f993dba +e697f09f82b2365e83226644c7b50859 +e6a29aafb992f491844ee46c1e791367 +e6aef01aa4374482e8ee5f51c98c4a99 +e6d15fec93cf469a733fd024b95d005a +e6d3e265a0bfa02d1065ac24a9435d7e +e6d6513895c217a620627492bd6d72b4 +e6da6d5eea35aeb6a07a3b853ddddf21 +e6ddc1dcad41d7c322d61597df998bf0 +e6deb4a5cb9c8e2250f87d48214b72a5 +e6e2bc327f1c194581e09a0820e0901a +e6f2dc3a85def8889462971a429db572 +e6f3dc264ee93946b6df62d7ce85263c +e6f59251fa827293e85ae63d54f26c55 +e720811c6ca2fb41d6ad1f7a65f0a803 +e720fd95cdfea3e017fa5714caa6ff56 +e721f12fd6fec78f1ba556687ebeb4a5 +e729a15dbe4886cdc195cc3ac1925275 +e73c3be67b16ad81edbce46d6cd5cac2 +e73c67a0ff072adc69adcf90b17481d5 +e74123479e82f7c94ffdaffbd5106e89 +e75eccfa241150465b0ab6573ac96c12 +e7645a0e28c54d48c42587351c0da51f +e7673c7b96bb312acfa2d3f4e4453235 +e76d1e7b3204d676eb2c4f5a6cb306eb +e77fa6932f9f726199c5c3c284c79e73 +e784f065d140bb552f788fd8fd5bc656 +e797e1c45062ce2169e452fbe4f3c46e +e79fde6713b4dc896c29781d84743d65 +e7ad0fdf9bfd05a01cb568abec6bbb9f +e7af5893d438ae6974cdd4ba2524dabf +e7b17fd7282fc27dd5204485fee3d9f3 +e7ba16841c79b21c36c267a60788b124 +e7bac0c2eaf3912d85a94df3121097d7 +e7d5208a96d4cda44fb4d264e921789b +e7d5faa5f1ec9d0d7868ba343b02e51b +e7d8c4a3bd5ad2bbb07b0579e3594cfc +e7ebe5dbd4e63cfc1a14eed0bfda8ccd +e7f54557c3363e27b0e1b65076915a79 +e7f94938dc37c5a2664302e8cd2bcf21 +e8022a6d1d13dc26a3a0f84f93f6176f +e806f4f4e5f91758b35580728813dad2 +e8173a9e1eee8d9995dea2e7d62be77b +e81dfe4358387564958696a3d334ccd9 +e82401a155eae3b08b62f115e11f4756 +e826edf3b035fd4c6294a791cf30d36e +e8315b5b407acd4e4f87a9063bc61407 +e83bf210ea0685a1b9d54705f2f033f1 +e83f1567d5f3212d9b10dad713db063c +e859fbd7bfd862e18a4b6c5a19cfe1bd +e85ae77ca614c8bb38b8620e9bcb6959 +e85e2d686059c0ba3c0a4e27ba5f4f98 +e861609767570603c5482cec91705556 +e86a8f7c90e91dce33d9cc5b7dc11734 +e87b197071107ffc2df013e0c8e71f31 +e885adb0ccaa20fad14b208707fa1342 +e888d31f01233447bda13c5659a9f517 +e88afb85e770e8346454ab239952ada0 +e89062d412fc4a10b8e33bbe049eae8a +e89b8e5640bc478f4bc96401091f0fc4 +e89d51e73267bb9ecf65fa1b02e979f9 +e8a0818100012c82bcdeea3fc1fa6197 +e8c395af4b89cf62d20aad6d7637e3c8 +e8c8c45879016c35a9381a227d227d1d +e8d61753dc4d25f2e36f0e92d4f611b2 +e8dfa6aa08829984968b022440c61bb0 +e8e36b2ec140002b335311b471eafdac +e8f81eeac9d33e5c6772ed4afb5acc7f +e8f8ffc827aa9ffb0bc21cc04a67bdc7 +e8fa7efe6e32878dac11f43354f61404 +e902d81270f3e9bcfece7f4d6a3bb45c +e9047ef9d3741775ef759e7a064c2ce2 +e904ad9380c383a3f832e12d5f509c0d +e909757d248a8fd53c4a1d8a2b5f73c5 +e90e80b8238330ce8c9ec10dc85e76f3 +e90fb7abc3a66704838e17056ac4eeec +e9142fc97359109af3dec9c95d9e2850 +e9168b5663d0ed15b6b65c8770862428 +e918f38d99e14eb27ebbe78da4d5db10 +e919c8590be03681da23217355cd39fe +e923e22b2386d2236bac28f572c62d7c +e95c2929570268da50cc0e1523926e80 +e964fb1515c22420d200e484dd435b81 +e9651eb875802dd3b2b1680da69c498f +e96f9d57662b8b2b232736e6f0323903 +e973fc5ba3f41964b28cbf1d3d3e7f5c +e9761ff075acdd923ae7c4d65f379c11 +e980176fdc6c049bc4035642c4f4b24c +e988349a7c9bdd4fb4b67fd30eb04495 +e98ce84140f9de160a62888b474a291d +e9922080ea46e284473b92f753aa3acf +e9a0dabc7820bd6df6e6d86229fd568c +e9a533cfd96d0efffa598d89e9cf718f +e9a6d3999a9d948ce42ee45593054d72 +e9a90c5a3940f0210719f876b7dc0557 +e9aa01f53e6c190638b43524bb545755 +e9b2b8612b400a6e17fe00b692a8ebe2 +e9b3e85520947a01355675195f8523e2 +e9b9edb6ff96ec1f05619a77eb9976b2 +e9ba6dadb60906e2e5c883274eabdcdc +e9beeec71b15fa5db2425af52901896c +e9c4ecbb8aea5f958be0b8a64d6e45cb +e9d23f1f1f741d7907da38ab6991a9dd +e9d46426ba6836a93fb2e8d1e191faae +e9d7a7d46e9e562539804da37454c0fc +e9d7d3714e07861845c6635d35ca69dd +e9ee9d670f5a22ede045b568afe4617d +e9eeb1b91ee93917ef6d15b4233c9649 +ea001f60a61848c24152b799c2f97d75 +ea04446913e869e6cdd89256301f0540 +ea0fdae94899e98a5ab7c777a9f3de0c +ea1a8f98100f58ba90eb12d7a33fe8c1 +ea1b13bb011649e0dae52b9a46a7e4f3 +ea23a31de49d119b130b7389d0dc8f55 +ea27d660253a2e6814259adf63a46ada +ea45d2d9a4ab535125efbd6f4abe0a4b +ea4c08250fe903bfc4d6a64432d79240 +ea4d031549abc0ee4c0d1122676a805a +ea70e95d22ff7d310db3dcf876475520 +ea72e80d1bb1f5dd915dff0af02028a0 +ea823f839b3e2d12843bd85d36c04ff1 +ea839eea7ecd251d3defb1cf3dfe3266 +ea8ad534b2e7725024979363da66f00c +ea8c83f484ade616912595653718b27c +eaa94c6b5ccd63abbba9efb012eef1ee +eaae9fab524c8da3a5b8c5c1e65e149f +eae3cb4dd674d99b02030f848d7e5548 +eaeaa31229f73ca222532e933b407aa1 +eb05f45e25b257c2402b0c55b41fe6cd +eb06c5b068e0cbbd00066effd4e3890b +eb07cf62ff402a9c961a63b30b7776df +eb08702744ba9e0e1a1837689bae697a +eb0c9d56498cdba19f4a7f2cb48fb7b0 +eb24841e2d4e369e535183ad5f4c6bb9 +eb274344458bd3042ef1831bf2c742f0 +eb27cf263b04c7aca8035ced28f6fcd7 +eb3192be3439ae184ff39d46a07792dc +eb3a29314bdc588ea58c294ba7f55203 +eb3c2636688035dadd27a2e23c3cc08c +eb42618d5355ac013d5c4142a4e0d9b0 +eb45b37e8822d689c126fb37647a05d2 +eb4de6f90dc12ab347f1700f3c7b5c00 +eb531446a3a0c919152657a7f47aa4de +eb5a40b30eb8e81401b82de51c58cf02 +eb5ef28683a29e17cbd18a082b1c56d9 +eb5fe53cd1a32164da9cb61361223646 +eb8179ee75d6fb5e255768057b8bd851 +eb820c190d3342e3536b50d2c7cf640e +eb84843cd17af39c80f7043b915f63a0 +eb876bf67372c8cfcd01e5a60b2385f3 +eb8a8e5f5a813edd21544346d6078af2 +eb9413c74b48f734bec9fa45969c2627 +eba939652398e78d1368ab417d02dae5 +ebad34f81f73d6da40bc3dda4891ef34 +ebaed36bb56b9e74fc7f5720055b3131 +ebb1a5b7283519fd45f9c2a0cbdbaa95 +ebbe52508c95d9b08b4cd90eaeaa54e3 +ebc31b82b5a1f33d241616c742526f8c +ebcfbb393c679458933e6bad05243e26 +ebd74af7b5e63a3c655676ce1f47d139 +ebf8e045851cd49e50dcb8f18deb8b08 +ec0962c15a328520b65d6172b8746774 +ec1607ca24f15eede479dd19e86b566b +ec1747980dbcea879cd8c6ef6ef30fb3 +ec18c8c51f24b788013c9efb9d69060f +ec1911a759b1f1fae32bb8f81e591e1d +ec1f5dce07c0d73a5064ac6266b470e3 +ec4aa065b1f5ca092731162c8e3aab0f +ec4b6d46e15465650eb6414db2b43ad6 +ec5283535b2a972d1d1901ab8a969d17 +ec622c4f903732ce9c43b15f292b311e +ec63358e67de79d419a7ad04886a1616 +ec6aceca10be0fd00d03c10fb2c56333 +ec701d2a0831a325dfacd7c71095619b +ec7ac8df2c9d1e0914a2d9eda1c84c9f +ec7d892cefea14afe9dd9bc8169509ec +ec804e8c3909726d19a5b4c65071fdae +ec826638fdc43e73b3f5de0c61c052a6 +ec927d236a5f483da08e25ea80886280 +eca7288c16f6972c1e937cad0b7d3833 +eca97e24042a9aafafba224fb46bbd6e +ecac4bfe4d0e32250ff54c0e455de1af +ecb40671b0fee7f52d479399c13d738c +ecbe4532b6f2f3b320f53efd13f00880 +ecc51fb232f16e67789cfd3d4b7a65c9 +ecc531cedadb9684f9cad8cb35fadd68 +ecda28080591a97f9aa2242a1c5a9276 +ecf67aa8ac4d07772d1254c5cb157bdb +ecff70b33c7e03cedf11f52d10d2f72f +ed01f3318b622d5acb3751ff9b376243 +ed0bcd4ffb8675bbd4352b6833e80b2d +ed212c5e175ccf6fad5097925a10f766 +ed2c3bbd794f230cbcfb72340ae16e7f +ed3359a4196085ad42750c5cecd3ef04 +ed3dbff9841939ab931408e41365594c +ed465e161384663b745ac69d9224c60b +ed4680db284e5961fe208cd9bc6fd7cf +ed4f2cf4eb6c233d222bda6deb1cc8b4 +ed69a9cd658afcc6b1fa32e102eb7f83 +ed6aa58d03520caf235e0d79fd15bfdf +ed6dcd440e2b0afb4c605721acac37cd +ed7459f2a57939538d71d8635c80c466 +ed8d3b9597d7d6688e9d2571c94aaab6 +ed9782127efa06104f3e37d38c9dd1ce +ed99b68bc7a550fe980559b766641d9e +ed9a9952c7796c1b8c3cc4952af7b067 +ed9b6bac559949c80bca9c1de2ec28de +edac9731d4d1bd4335c7900bd7c753f0 +edbb0226758550cb8f146bce31cfafac +edc8d705d90584f3cd230db6dfc8c98e +edd09b4d7196d49f315a18646c5c123c +edd8e81a08cd2234826eddc6f55071c5 +edf3ec43e58f7efb535f3fc6d358292f +ee0a85d63deb352eb3eed8f7ecc9c617 +ee1282a143b0c2dc5d2d7a2b5c720aeb +ee2475f5289993994de726e4c0ac8c93 +ee318f47a422b7a8b5553fe1627863c8 +ee34d5864d7dc27d389e8bdc2177fb45 +ee461a9ed556a0cb5e963baf18f4ad95 +ee48899c76f303427a8292de35f5c04f +ee4bcb59e62861560d43d7e1ac4c7433 +ee5867194d200e03c250650a772229e3 +ee6759873652ca8389453253876e45fa +ee74678bcbb553261851f3150aff2c4f +ee775e8b48b079624e5c4088a854b8cd +ee79ebcf2dc0b406664fb8ae3ec5e9fb +ee7b52872961958d5ae14a3a3427e614 +ee857a3237637ae5399e04976a6ea088 +ee8639ec6fa7f75494ce61af4b37bda4 +ee9a6d8ea532ae445565f7648247697f +eea2b1001611357986fffde91bb91bb9 +eeb4494964cd8d70ff472094e71d28f7 +eeb6c989f60b0fbd27dab17fd1cd6a79 +eebdd718733aa1ac9c8d2cdb8f94a233 +eeca4a56da814c9ac624580b63cc880f +eede8925d33624e28d37ec3b5c59b722 +eee3ed3b9e6cd1b1d35cf6634e77c06f +eee6d1242f3f422bd3a98f37336786ab +eee7889e33f3284a3473d875fa9a97d4 +eeebbbb0d214666749385f33746b5ea0 +eef66c61844c43b6c245867b2aec3960 +eef74b68c949dfd77c4e9e76a673e1d7 +eef7539b73bfb1728d7692f35f82c88d +ef09d3e705aa6ef85b4d6206e303ac35 +ef09f42cfb961096efccf08e8d397bb7 +ef0a6515dac6d1e27aa78599fcfefa33 +ef112d289cf5d389474d6490d99eddb5 +ef192c30a42c3e349ed3b6bdba6c7bcb +ef203508e16b6db09080629f94448669 +ef2193efdb322750d127226e2ecf4e0f +ef22325872240c347da2ffb3aa42d648 +ef31431759378fa55216ec65ffffcdb5 +ef3389dd25f3e1f87a0e7319080b3f4c +ef41f49fe0d432779bcb99681a837728 +ef44b90382e5461beda247da331cfd59 +ef4b526ffbb87b661ff930dfe4a1b403 +ef51e7d2c14cdc3a6a659263b5e01202 +ef5612ad047533bffdedb8aaa6ffbb0c +ef6575c9996c7c4abf1e1a5c1140a1c7 +ef72fc36b626e8d6c850c7c9a4c96fde +ef7817736a54a9b9bf5b2f7de6656d3c +ef7986770a6906fefa01a4d4751563ba +ef7bf33d48cd727322fdbba8275acf3d +ef876ec2c81e72499b1ef0a1213977a8 +efa8254c36ec4ec427b4e366042d09e1 +efaee96f893466b4935845b2fbac70a5 +efb9eb2b48378bfa17fd2357c3b7e0bb +efc00bf2b768a211914fccdfeed80d11 +efc57fded4314d880ccc50dcdc2159bc +efdd6e6df85153161c5e9a825c92a2a0 +eff35ae6c455872ed5b8291ad802fe1d +effea375bf6945b0b05ffd4a26e0607d +f01938a0a05b984622e8c7cfad8dafb7 +f02840f16bf7ffe9207f35a23508566b +f04166c0be01bdfc9b11902731a5785c +f0477fd2aa3d0a16f7a3a6b11884910e +f0587b2b68ee857909025d51cbad9519 +f07162117d6163120a948cb4c918d867 +f07714c9bd41140f067d6d5c9248f445 +f07c835f0549cdcbf4012438f10b70cd +f07d9671dabfdd0abf0c315e39a5dc55 +f08b03a664d232d0ada9af88031a5ea1 +f09847574d0b0c1f232e2536fd4a80bc +f0c3a2d1dfc3b6519fc4bce8470d21af +f0c5be02d57539b67f87b8654a488db6 +f0dc57f6c9ec5adb11202b230c2f1a74 +f0de15f4cb45a187c837d21fcb198515 +f0e1200cda60fce741eae431139e292e +f0e8d8a68d66f6941d8e4f0bd1820997 +f0ef6eff739490f23201497aa166765d +f0efdec9957561c512d0e40a6d6a85b3 +f0f3382bba90e40734a3c4dbe639ce7a +f0f4592ff6749da53c6c76b41f278a1d +f0fd5b7ce2d47c35dbd42510d0e99fc8 +f107a563dd5695915d61562a81c6ef2c +f122d955b0b5099f0ac6545ab86f0a90 +f124454611b999d5ed505f6b1518df5b +f12a7f3b17ae6bd4426298ebacaf4312 +f1325e63cd11d2a9fbff41e3455797e4 +f13c8e91b660ef816dbe2ba3ab340941 +f155dd12a70ddb0c43f0de4c2fb61f03 +f163da96e7898a079e912fa5ea815aff +f18d9dff3a7d9cf070018b182bae8ffd +f1947fe93039ac8a22c2128516a0e453 +f19f9df0edb3155b0e38780ef93a2ee8 +f1a586e6fb949859a684b9135533db80 +f1a9fab3a1abc05b581f8269b411dbbf +f1b913dc525f1a4c5fb6cfc3fca2127a +f1b9383ed859a08d0aa6fc9e1112c619 +f1c9a0cfdb1510b3201c7bd457cef9da +f1ccbf70523d586589a9a5a6a4ff5fc0 +f1cd9f546c7b4518a924c4de9efd1759 +f1d738a92c7d03a451aaa45cc7f8072f +f20265ecae639e646e1ff4352c0fc2e2 +f21665494bccd476b8f4e3ae916589c5 +f2168cee033d8f12b29627a4d9f49a56 +f216ce9f29fe35742fc5578ada18a1d1 +f232e70d05c763db6e54576e8efc6518 +f236291d2b287c54b0f4fdab7d33dbd5 +f23f7afd92ab78b2169df21eabcf8c92 +f2441813485540e94e8216f696d7654a +f25b60f17c6f4a003923d86ba34283c7 +f275d2febb8bd60569e3b1b89b93a8c9 +f28e3255c391219f7901502e37e2547a +f29377f280cb1bd9b22bcf2af7466277 +f2a76ce9601b4dbd1486bff6b6a1f9d0 +f2a784451db3d072394cd44ad3fc4698 +f2acf47b1a749fe6954bc34a613c9fc2 +f2ae14ff683f5749e7bd3debc77e2d1e +f2b6d7c3f559fc7ee5a58f4917dc47ea +f2b9ff19c6ebeaaca65ac38b1e585e38 +f2c41e51a722107a5e6269cc38ccab8e +f2d76f0d05e97858c24634cb641d917e +f2e80aabb0ed2ff8997f9437d7ee1326 +f2e84cd6d7ad1f1b4cbf4dc50c27b71f +f2f5020d959d0574b6a949a4a4dd1785 +f2f7e99044296b0c730392e62a3d8a91 +f313cffb24b45fd4bc66b999c291cb59 +f316681b7b8d9b3ee35320cd9c804904 +f319fdfd3d8efa097755057314d123f8 +f31d7a868fc691ba22045a81df933dc4 +f32dafefb080c3197c5daf5b1c62208c +f33c546707e7dc6d31c0d65ddba3a636 +f340e5b5f654b06ae88dc6e1667580a0 +f340edf4a510d8aa0e723e27ea905d76 +f34239da2b46e887c56608bb51f40889 +f34639c16d7aaeb6041febde7cd9cdd6 +f34742dae582b4695e4dc9ac161003c9 +f349eec2396a61b907fc7666e718ec83 +f34a5620ff3156911f6e8d2b7fdee08c +f34c8dcb06917949eb82687a477dc4a9 +f35e3d85169f5b743a28b1ade0e97142 +f363681b7f39ae4a283f09e4d8c48f0e +f36467e03adc8b6a825beedc4c093481 +f3680bd3a3682b98b114ab0dc475fa9f +f36dece127acd199f7b73f10e60509cf +f3718778e8f7f1ec6675671afa5986ef +f379402ec1b2e09d942e02cac7a1c84e +f3972222a7071a8e54145df6b34be4a3 +f397c4251d603760ba9415e2d1125705 +f39a1d366485ef492ce23d1610a62a37 +f39b2dff55068531f284a121d0d90a46 +f39d70a90050b6f4db7542c6890c5fe0 +f3a9c7176f7f4f96e4bceca9c4bd8860 +f3ac32b402cf05cad2e046178806638a +f3adf948ab759d35ac691417c8825046 +f3b0f8d9d45d0943cf5c4f636dac8fd3 +f3c9249bf3d023f394995e01a737dd75 +f3d99619ef55ae31423a1afec473499e +f3e5ac9251079de5f8e9ddbffc92a56c +f3e9e6824ca0c0787da4142528f88c70 +f3f25ed01adf742fec058fef77d4521a +f3f350872254f05700334d78e5542e7b +f3f46eb56aebef639428041342dbef65 +f3fead279f1cc89142dfcdadcce4a0ae +f40199f8001d16da6ff9b0254c70e000 +f40c6197ecbcc4ed31f5e574c6807c79 +f423eb7812574170f973c03cec534b0c +f427209a134bacfc575fb327c29c4afc +f430034c89ca3d24d0733be5591fb7e0 +f437bc8138f569577d00b361a27d6b4e +f4427a268c7c23ae89966c2b155a83bc +f4510d20b6b3f01db5cfb8de1310d41f +f457b984f1e4e4dacc77bd4ff4a85a4c +f46b606d8afbf5c5f22b8bb8fa0e00ec +f4719a14434de8f027ceb7d31fe9f6fb +f478b4af6c06461e78e921a0904f7398 +f47a22b0f65dad0a8902877c9f328b66 +f48380a4b6c779e1aa8c75e7775bd34b +f483845df47f03209c1ba8e94fabd9a3 +f48482730faa6b370f99dce0b7e94168 +f48763ac7978168bcb15df8083e5740a +f4a83e9c53d70559347c8f5804525e36 +f4a9cb127ccecb6ea8663a40a0bcbe66 +f4aa5f22c6ae544261933993e6ea8ca4 +f4c9aa200d0bdc997933920fb6cb6c8e +f4ce3eba752d71ce2899fb15b3ec411d +f4d57429809838739c86e7203bd706fb +f4e674ca7eb55173ecbaa59b9048db69 +f4eafff5fea9999db154a72bba1fb936 +f4f914284da0ee0e2db63361ba945857 +f4fcd9053e2d0f74cc53e243cfe0983e +f511c4ce52223414946c8dac211e2e04 +f52c812be970f20f426dd81b8e9160c6 +f53037c7ad6d6cd2d7baf803a84dd12d +f5350cf7c4ad9edceded9a221555a7da +f5383f9f375aac7ddfd83fb2311558d0 +f53bd7a577af0d878d7ebaf29dcd0209 +f55c671464c369523f41f97c31ab6ba4 +f5636e74da051e27073d410ba36bc8b9 +f567dc8dd393a7dd994390d71da78905 +f568c132f3a6eef09e9b8e0f1cd4e5df +f571bb4d7ed4ac15bfdcf3a9cec775a2 +f5761a743c379d011fc51a271fcc5f99 +f591ca90237b94c16582dbdb48b56e50 +f5957c5526c5bb49b3f233e9819c83cb +f59a92daa36efde15b8b0686ac932b59 +f59d68f230808989203f96ccc4d2a821 +f59eab4f431e820cd52ad6df2e83d84c +f5a9f57ddd71ce89ced57092aa9cc915 +f5ad0d193f171f042b2d04ad9e96c9a1 +f5ba76f2fbbf0f39b97ace8af9230c3c +f5c07fdf7341c2d411d6136383d3cdf0 +f5c2fb02ec7016465607f7e85b8dafc6 +f5ca178a0b6eb7705ac1877f98076872 +f5dafd7e3b7d484d4d821f71a59bce23 +f5e44e8ad2139e9e1255f6196a09b9af +f5ebb8773e2122e94ae4def136971620 +f5eed21d5b4a032c0aa82d243cb11bbd +f60394bc05875b02bcf4f5cdcbbda192 +f610d3f2f0da3c55c72f67462d3c79a0 +f616410227481916b51e247e3381cd27 +f62be4d42dc8c2ed78386c9045bfbe32 +f63018f186324eab3f7dac96b5abe0ee +f6406341346231755d4e94f933aea20a +f643142e19216b76b8250ffd70d0992d +f65a0a088268d8da9a08b07deeda3c1d +f669784bc42a92dff2929703e3a29169 +f66f67c1f9a7eb8017c044446de7fccb +f678366775ae313c8da5ba2f1798c14d +f69945c230c4bcfabd2aa6d4560415a0 +f6a1cb96341ba032388f19b58bc6b62f +f6a5109c2d7175dbedca9f877cf9a9b4 +f6a99340b75cd7433aaf31a4bb7c9038 +f6c2559f0eba9db7f41161fefe35d36e +f6cc92779537e7bb630b93e3ba43504d +f6eb00b168f034b84f36ee1f878917e4 +f6eec0ebd4221f387905dfdef71be1f1 +f6f5cdb12ca140cdb6fe9f333e2cddff +f6fce851cbc6d61d62a215edb7973a51 +f70f3dcd4cc5629242fca1a5e94ad365 +f71c4c43a7a1eb4f76020d8a62e4f300 +f72a6e89204f267d9db701ff31ff3749 +f72fbaffa3d5943b2ab6026abe749391 +f75ba644df11c8f6ab30d2c4cd7803f5 +f75c2ccbb1ead0334af29334333494a4 +f7672f23dc48de4e2f1973278419820f +f76a53d501e86a86b2af93a491d681e9 +f7719377a42b73b6e13b44bbb4aa6285 +f7736fdd16af4fc90daa7513ff7939ac +f7739e0212dc2b729b2c5354b8807a88 +f77bbc365638079d29908e502cefe490 +f782e495b01d6f7af9ee4d814a8a46f5 +f7858b133bc712a25ede913b4a5fa7ba +f78c7ce004ce10f0768b4f2d2bc94738 +f793a9501d70202a6251740010f126ba +f7a5d4a0b4603c41d11b78934f73402c +f7aee4a617694e448c13e56d620c76f3 +f7ba38df73d8ccd8099fc01c350e43cd +f7bb639bbba868018149ce68a441324d +f7bb7b606dcec261f727282fcce8d4a3 +f7c6af6ae8919d72d00d8acb8caff2e4 +f7d2877de1b8ed90152a7718ed2ebcd9 +f7da72b25fd24c05eee59bf55566f0f3 +f7df3b020d97a74c56f2a4178aa34b27 +f7e45149096e7c8686fd1868260eec78 +f7fb3e973acbe0fe7b04da2408fa1840 +f801363853a452c9bd96f8b1375c396d +f802cae2427d9a28789d36319d99ad3c +f8099abfcff052a8f8a08ef20f9237d0 +f812a33fb7bbfae326d085ba78e677c2 +f81747518c9c6a74272ab93d23012fab +f81e07c79512a07ae72b7d89ce8bf9de +f8201f12226c2a70c9fffdfc5b44bd0b +f83b004cb918b0b6f9db3c06c9ba5c98 +f8400ffdcbcd61eecf4b3c4cd68d8e45 +f841108a7577d7c0d185c67b9c36b036 +f84d05df80a7af30b36b130bf0f286af +f8533c29c89b43d66deb4f065fec6390 +f85c77563f78753085349fe108ee38da +f8619297cf157be217a99ac01d70a4ad +f8686f2dde3442b22166eac8bd0fa08b +f8768c462b7da02832b22b880505a234 +f8770dd2e870a48e709b91ca646c4c3b +f8784de0f047bcc50e7005b969acfe03 +f879d0501f8c0926dbf2790acaca363b +f87f3618a3d43be29d163720ad17638c +f8923354b329ed42c7b9563c987cf70c +f8a2052eff23ed2138bd7b9648c866db +f8a3bf14fbb465178f0e4ab37f24e067 +f8b1794c44054591f303a1644a48b384 +f8b2b7fa8df43439a1d7874249fc7568 +f8b332d35d661ad4a0fb0793e15766e3 +f8c4a6ef2aa6892b6526480050d3ef52 +f8cc212115ea8deefa784237c182dbf3 +f90d2e2549b5808b06e262a84e802df4 +f91c9acf748c71a43ded7cab52573554 +f9245dd8352a72a8737a4055cfcad251 +f946c9c7722eb2c6152f8e59b200c418 +f949c0aca95c68c47bf257361a829ad5 +f9516d7fc63585a623d3d2905dbc571e +f95e2f88764d148c0e6ac4afbef07a6f +f95f7a9bed4b663281fcc34d84d905a8 +f965fd7af94dc101cc00621f520cbf7e +f986cd8a66f57ed63f13aebae89a26a5 +f99239fa7875abffd6efa5f077743119 +f9accf48f13088cb816e6a2fff308096 +f9ad2d329263dadcb6644468d41eeb20 +f9b583f5c09dff9ca7f856d2f5bb6766 +f9c4535383010c3db99bad2a1c2feb04 +f9c5022e6200d822b5fd145fb281bd6b +f9d69699492d137788d46f2a79694314 +f9de7bd31e4afe37c7f8129343af0402 +f9e31073a9c455829a8d519162b23439 +f9e9568062c79390b0b6dfe3dc8737dd +f9f019608657e84f39afb1d6d88a5888 +f9ffd806a0afddeb248be7624b4df1ba +fa028d1822f8bd17c276cef92e122150 +fa0eb4aef1159757d1358549a59b2915 +fa2061fb1817f40e0320e1f4d39de944 +fa2065f9db4c3c3f532d0f3af93504a8 +fa217663892cfbfeb0c56f613171b292 +fa423d9109278a80c915c39a2a87b5a0 +fa53bf7b098a0fade82b02256260f688 +fa5dae401f09c54e79a890b0af530d54 +fa6dc41380906b8db7a7d5c01db6696f +fa73a390cb1951107b89f1cb2a438350 +fa7751fbd7ef1604720a3eeda4ab3aad +fa8a70f951543f95e7a5950dd8be8030 +fa99c2d099701faea10f05418891e564 +fa9a3371c5e82848ee611f4678b5fcb6 +faa4fd4aa418fa1ddd00f1e79fa48377 +faa509a91acdb0a5e0a287a05dc53800 +faa6340fd34c36499b725d6e5242862b +faa91447811f4e251dc8acf5955fe4c7 +faaa14c5e4eb743208037566d7e87677 +fab63847cc3e8c238c7653ac02805e90 +fabdeeedbf6023ed65774aa58960246c +fabed58bbcf02caa23679d3039521618 +fad0f12030be7637998d095f8e2cdb35 +fad8755ef5d4d0a4ab5269f5db0dc752 +fae089e8f99cb5f3b7e20e6b861243e1 +faf75fab7f1b6d794f3b9ab1e22579d4 +fb0142fe0e4b0fc2951dbca08725c03b +fb1384e71d3d1112eda4604870057e72 +fb1dbb15b7308d3b0d38168d32011663 +fb22a890845e757edfbf5f8cd2dba38a +fb274dc1c20a22586890c479724db25d +fb2d03798ae8f87164a67bddf9891f91 +fb2da69e103f9b7b6c4a87292e6c1937 +fb4907b45565b1e1589223c22859284b +fb4c31494ed60bd5b771c7a5f5952950 +fb4d4aa26ef8c8b23b9f42b5487d0b3d +fb559bdab585caf558e0c3e84460e691 +fb58058619514f814fa914e3d4e37c49 +fb60e29f6547273b9e212eebaf8f26ae +fb6b69d897beaf3d8567df00dbd7d574 +fb80568df198e5d69e0ff31d0b8be42e +fb81579aff93152fb92664bef2b88749 +fb8d2355bdae36f88b6a4f2ea0ebcea5 +fb9971d3d475bbcdc009ba67a67d9173 +fb9cdfae7439f581db4dcf2837c83733 +fba3a85f9e7ff7aac7c59f705e982049 +fba5478fa4743817cc3a2cab9c0625a9 +fbacb748584b0a58432ea10ac4b97ec0 +fbb1d47e0cda387d78bc81372451e73d +fbd3762f27502127985f5cf9ae25027b +fbea698b304d23be18162302789dba85 +fbecb852b9897012a2c903625015b520 +fbf6a2f40f55d991831e084e0cf01715 +fbfec36d579cfdcc17b77cc53b558cd3 +fc01e1decd3882f6e4a1b539b3dc5388 +fc028b106eb1d1c0e758313eff85e681 +fc0374b46b24cd572d7a088b934d308f +fc0bff7f680f3e54939bf4479f7e716f +fc0cfee123e8f6f6bc6617a8ab57147f +fc1225bfc852b1a66ccef9b08dd90cdf +fc31b4f85bab56edcd1be416a0613cad +fc378977ccaea9a810fd75302d2ac6dd +fc3d0a9d96d9a64722e05694033a8e05 +fc40b060c0f712d0ca6f9b02efae4190 +fc61bb1eb9388e5ed06aa632fb174c55 +fc682c7e6a9054fb8822980909d13f9a +fc6fee769723de6186552093c572462e +fc71fcd189a43ce2c61bed88ae91a278 +fc78a5e40f4fd596e5cf05b707e281b7 +fc7f6f7f041b8c99e45c63b4d1e56439 +fc907c5c048dd0f5a747c84f7b968bc5 +fc965f3dd07dec13bc834f24fa1b63f5 +fc9d69f87cade29af0363708694ff344 +fca02f40073e7c40c0424f7b6f0c25fd +fcb61edf6c7c85d53b6dd7fc8cf07ef0 +fcb64ef19c2a47c7fb00de4dad7ad672 +fcc3304d02b1ae024a064f8da62c736c +fcc720103d04b9b0c73424412bd72706 +fcca4b693a968da3b81b5f492ae2eb38 +fcd9cef1fc543037f72d4a38ee4eeb9d +fce62336c3bed578dc10039114dc691a +fcf789b94571490ea23c9a38d99f4ba6 +fcfae30c79d3ae0825de63fbf0ed4836 +fcff8f0a370caed1758639ef786033ff +fd1077eb9876afeabe6fe1a735f9856d +fd134347338c57f3e0dbffa8aa6ca5da +fd2f05b81c43624eb9a8f86a64faeb85 +fd343a0e668d5dbe76c37bbabbcd9180 +fd444770160f00388310988e8da34976 +fd6ae63fd4549d5321e43cfbab7573e8 +fd6e01de76bf9fec06628ac3e1ed632b +fd865ae6fa254d45eec030242b3c39d5 +fd879aa589b23018d5d9089b06d6f99a +fd899644f38392d114e4bfbf14426875 +fd8ad6a2f8cec68a8027e9654ddd9fa1 +fd8dcf1915c63df8c43fb3c42316059a +fd975301c0baff8b6e04c89615ffa0c8 +fd97cb31f63901150cdabb3418eff3fa +fda116e53f69380ebd7bd4fa2b008b27 +fda798164dbea35aa941111e14779cfc +fda7d042ed85dc0207bf63e046d5a398 +fdc2b094333d6cefa1a537643a841cec +fdc77b2dd2d9d55214c55b89a7797c3f +fdce486bf8cd6da448f04d82ef8da483 +fdd3e60d6e1e8ef022ed81f13088e3bf +fddb9bb39eed0ee1e8bfc6ea750914ab +fde19618f644e661019e6d5a00e0688d +fde85956f845c65b65aadfd2882714cd +fdf4007c4a58bf7bce335a18206a68e1 +fdfb906a42c64dd288bb3032a4d0828f +fdfbfd9be601c360a53a69b4fb5aa5ad +fe04373d23dabc853c21ba3c31988713 +fe12247c5bb307896018c8c2031c5022 +fe12870f65bbd2e5c323a01808fb2747 +fe19f3bf1b20bc0c97d91eba1eeb56dc +fe1ceb8a8071e0aad052b98e549ae3a5 +fe20edd5cabb7e66dc0a988639123f38 +fe29bffcb9508cb65c460d6a803278df +fe3da6f6519044f0a22c136247d9bc7b +fe406c66a48f4c2c8a3ca413ae6a1eed +fe50ed75b407a011d57d941d077e496c +fe524dd6ecb70c60f4294b48a5a41eb5 +fe650fd60ff65da594dee0e847e437ae +fe88f493c4e08825efb35367002231ff +fe9239e042d1b0d2015c2e62fda8d9ee +fe9293394979dcf25c70fe3b40fe8449 +fe95caa13af9d01e6074faeb669a6e6e +fea2bee6368f4841f6c8d31d474687ef +fea6aa60c5384ebfd2a91d18734daa81 +feb0b07b31a313c83ba0c39894010f94 +febd5444746e4e510e5a3bb8cd54807e +febdba081b7156c70e2141f86a9b26d6 +febf0d7e41595f37cfa58510b0d24f8b +fec27b63a453241af32e7449d5d887b0 +fec608b84c7c7a386e5891a121af5cad +fec6181e9aec49a1aafac4fd082c8c8c +fecadfab3ec34bf4b3d39079bfc2b540 +fece27a05bff76993f70e52d1952180b +fed1dba4fe33ca4fa67a87d0a9d95809 +fed698e710991d6101a81b5d09b28a3a +fedf63722b6bfc88ae267f6af7c30b9b +fee1c22d5abf836f2dcd631f01b1134a +fee7b05c348b41d5ff29d3128ce8adc1 +fee977adc34e249c3328554b292b230f +fef4240115cd0b68ce7f8d76fea7e8c8 +ff04b02185cf6149c65e85cd17a9cc50 +ff0a8bc289bbaecaa85e53e4913ff9a5 +ff0ba95f2478144c24d012081daefb87 +ff0c96003eb3021f2831afc30d4b1081 +ff1a24629dc85fd3e352657867b17fc5 +ff271392937d28d7eff2d0faefdb92cf +ff3dbcb5d3b4f5518357361a4e9f2367 +ff3f787d676b0fedfd5d896b6a8da377 +ff4161a9c60a10be098277eed66da733 +ff43c635057c5d6b71c06670c12c3024 +ff891088d44e1b616e0b34a2d3aa7986 +ff9524832a40043938c0fda28b3292cc +ff981be5f14cadb3c0b66826e5482308 +ffab18800c4c2b35abedee6795be8ef2 +ffc1ca720c067fa2b5db7b57ea5bd4ec +ffc7cde7f186388776fd4ee3b16d8d3c +ffc9484928a7887e80e85cc76241052f +ffd405a2ce78c69ad1f6c7a2c39bb692 +ffd9e9370df7519f37b107229b03e4ab +ffdde3aae78e1bef07ad41dd1bef670f +ffef942026f48b84892d2a223a99935c +fff1f2f2dcd5956ffeac4d768a07dbf0 +fffc441de116bb64079adbc7750dfa05 diff --git a/example400.hash b/example400.hash new file mode 100644 index 0000000000..14afdd3ad1 --- /dev/null +++ b/example400.hash @@ -0,0 +1 @@ +$H$9y5boZ2wsUlgl2tI6b5PrRoADzYfXD1 diff --git a/example500.hash b/example500.hash new file mode 100644 index 0000000000..c48290e321 --- /dev/null +++ b/example500.hash @@ -0,0 +1 @@ +$1$uOM6WNc4$r3ZGeSB11q6UUSILqek3J1 diff --git a/extra/rules_optimize/.lock b/extra/rules_optimize/.lock new file mode 100644 index 0000000000..e69de29bb2 diff --git a/extra/tab_completion/howto.txt b/extra/tab_completion/howto.txt new file mode 100644 index 0000000000..c82431c140 --- /dev/null +++ b/extra/tab_completion/howto.txt @@ -0,0 +1,4 @@ +run: +source ./install +OR +source ./oclHashcat64.sh # not working permanently (not working anymore after a reboot etc) diff --git a/extra/tab_completion/install b/extra/tab_completion/install new file mode 100755 index 0000000000..d757f511be --- /dev/null +++ b/extra/tab_completion/install @@ -0,0 +1,175 @@ +#!/bin/bash +# Programmable bash completion for oclHashcat / cudaHashcat +# this script was tested under ubuntu, please verify if on your +# distro /etc/bash_completion.d/ exists (otherwise it won't work) + +COMPGENSCRIPT=/etc/bash_completion +COMPGENFOLDER=${COMPGENSCRIPT}.d +COMPGENTARGET=${COMPGENFOLDER}/oclHashcat64.sh +BASHRC=~/.bashrc +ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" + +############################################################################# + +is_sourced () +{ + if [[ "${BASH_SOURCE[0]}" != "${0}" ]]; then + + SOURCED=0 + + else + + SOURCED=1 + + fi + + return ${SOURCED} +} + +source_completion () +{ + # load the completion into current shell + + if [ "${is_child}" -eq 1 ]; then + + if [ "${parent_sourced}" -eq 0 ]; then + + return 1 + + fi + + fi + + if [ "${was_sourced}" -eq 0 ]; then + + source "${COMPGENTARGET}" + # or + #source ${BASHRC} + + return 1 + + fi + + return 0 +} + +my_exit () +{ + if [ "${was_sourced}" -eq 0 ]; then + + return $1 + + else + + exit $1 + + fi +} + +is_root () +{ + if [ "$(id -g)" -eq 0 ]; then + + return 0 + + else + + return 1 + + fi +} + + +############################################################################# + +is_sourced +was_sourced=${?} + +ROOT_PARENT="$(cd ${ROOT}/.. && pwd)" + +# Check (install) permissions + +parent_sourced=0 +is_child=0 + +if ! is_root; then + + sudo ${BASH_SOURCE[0]} ${was_sourced} + + ret=${?} + + if [ "${ret}" -eq 0 ]; then + + source_completion + + fi + + my_exit ${ret} + return ${?} + +fi + +if [ -n "${1}" ] +then + + parent_sourced=${1} + is_child=1 + +fi + +if [ -f "${COMPGENFOLDER}" ] +then + + echo "The bash completion script file (${COMPGENSCRIPT}) could not be found" + echo "Please make sure that the distro 'bash-completion' package is installed (apt-get install it otherwise). EXIT" + my_exit 1 + return ${?} + +fi + +if [ -d "${COMPGENFOLDER}" ]; then + + # copy the script to target folder + + cp ${ROOT}/oclHashcat64.sh "${COMPGENTARGET}" + + # adjust paths to the main binaries of oclHashcat + + sed -ri "s!^(ROOT=).*!\1\"${ROOT_PARENT}\"!" "${COMPGENTARGET}" + + + # add the compgen to bashrc if not already there + + if ! egrep -q "^[^#]*\. *${COMPGENSCRIPT}" "${BASHRC}"; then + + cat >> "${BASHRC}" << EOF + +if [ -f "${COMPGENSCRIPT}" ]; then + + . ${COMPGENSCRIPT} + +fi + +EOF + + fi + + if source_completion; then + + echo "Bash completion scripts for oclHashcat were successfully installed, but since you didn't 'source' this file, you need to run:" + echo "source ${COMPGENTARGET} # or source ${BASHRC}" + echo + echo "in order to be able to use the tab completion within the current shell." + + fi + +else + + echo "The compgen script folder (${COMPGENFOLDER}) could NOT be found. EXIT" + my_exit 1 + return ${?} + +fi + +my_exit 0 +return ${?} diff --git a/extra/tab_completion/oclHashcat64.sh b/extra/tab_completion/oclHashcat64.sh new file mode 100644 index 0000000000..1b6994d534 --- /dev/null +++ b/extra/tab_completion/oclHashcat64.sh @@ -0,0 +1,745 @@ +OCLHASHCAT_ROOT="." + +# helper functions +_oclHashcat_get_permutations () +{ + local num_devices=${1} + oclHashcat_devices_permutation="" + + # Formula: Sum (k=1...num_devices) (num_devices! / (k! * (num_devices - k)!)) + # or ofc (2 ^ num_devices) - 1 + if [ "${num_devices}" -gt 0 ]; then + + oclHashcat_devices_permutation=$(seq 1 $num_devices) + + local k + + for k in $(seq 2 $num_devices); do + + if [ "${k}" -eq ${num_devices} ];then + + oclHashcat_devices_permutation="${oclHashcat_devices_permutation} $(seq 1 $num_devices | tr '\n' ',' | sed 's/, *$//')" + + else + + local j + local max_pos=$((num_devices - ${k} + 1)) + + for j in $(seq 1 ${max_pos}); do + + local max_value=$((j + ${k} - 1)) + + # init + local out_str="" + + local l + for l in $(seq ${j} ${max_value}); do + + if [ ${l} -gt ${j} ]; then + out_str=${out_str}, + fi + + out_str=${out_str}${l} + + done + + local chg_len=0 + local last=$((k - 1)) + local max_device=$((num_devices + 1)) + local pos_changed=0 + + while [ "${chg_len}" -lt ${last} ]; do + + local had_pos_changed=${pos_changed} + local old_chg_len=${chg_len} + + local idx=$(((k - chg_len))) + local cur_num=$(echo ${out_str} | cut -d, -f ${idx}) + local next_num=$((cur_num + 1)) + + if [ "${pos_changed}" -eq 0 ]; then + + oclHashcat_devices_permutation="${oclHashcat_devices_permutation} ${out_str}" + + else + + pos_changed=0 + + fi + + if [ "${next_num}" -lt ${max_device} -a "${next_num}" -le "${num_devices}" ]; then + + out_str=$(echo ${out_str} | sed "s/,${cur_num},/,${next_num},/;s/,${cur_num}\$/,${next_num}/") + + else + + pos_changed=1 + max_device=${cur_num} + chg_len=$((chg_len + 1)) + + fi + + if [ "${had_pos_changed}" -eq 1 ];then + + local changed=0 + local m + + for m in $(seq 1 ${old_chg_len}); do + + local reset_idx=$((k - ${old_chg_len} + ${m})) + local last_num=$(echo ${out_str} | cut -d, -f ${reset_idx}) + next_num=$((next_num + 1)) + + if [ "${next_num}" -lt ${max_device} -a "${next_num}" -le "${num_devices}" ]; then + + out_str=$(echo ${out_str} | sed "s/,${last_num},/,${next_num},/;s/,${last_num}\$/,${next_num}/") + max_device=$((next_num + 2)) + changed=$((changed + 1)) + + else + break + fi + + done + + if [ "${changed}" -gt 0 ]; then + + max_device=$((num_devices + 1)) + chg_len=0 + + fi + + fi + + done + + done + + fi + + done + fi +} + +_oclHashcat_gpu_devices () +{ + local num_devices=0 + + if which clinfo &> /dev/null; then + + num_devices=$(clinfo 2>/dev/null | grep -c CL_DEVICE_TYPE_GPU 2> /dev/null) + + elif which nvidia-smi &> /dev/null; then + + num_devices=$(nvidia-smi --list-gpus | wc -l) + + fi + + return ${num_devices} +} + +_oclHashcat_cpu_devices () +{ + local num_devices=0 + + if [ -f "/proc/cpuinfo" ]; then + + num_devices=$(cat /proc/cpuinfo | grep -c processor 2> /dev/null) + + fi + + return ${num_devices} +} + +_oclHashcat_contains () +{ + local haystack=${1} + local needle="${2}" + + if echo "${haystack}" | grep -q " ${needle} " 2> /dev/null; then + return 0 + elif echo "${haystack}" | grep -q "^${needle} " 2> /dev/null; then + return 0 + elif echo "${haystack}" | grep -q " ${needle}\$" 2> /dev/null; then + return 0 + fi + + return 1 +} + +_oclHashcat () +{ + local VERSION=1.20 + + local HASH_MODES="0 10 11 12 20 21 22 23 30 40 50 60 100 101 110 111 112 120 121 122 124 130 131 132 133 140 141 150 160 190 200 300 400 500 501 900 1000 1100 1400 1410 1420 1421 1430 1440 1441 1450 1460 1500 1600 1700 1710 1711 1720 1722 1730 1731 1740 1750 1760 1800 2100 2400 2410 2500 2600 2611 2612 2711 2811 3000 3100 3200 3710 3711 3800 4300 4400 4500 4700 4800 4900 5000 5100 5200 5300 5400 5500 5600 5700 5800 6000 6100 6211 6221 6231 6241 6300 6400 6500 6600 6700 6800 6900 7100 7200 7300 7400 7500 7600 7700 7800 7900 8000 8100 8200 8300 8400 8500 8600 8700 8900 9000 9100 9200 9300 9400 9500 9600 9700 9710 9720 9800 9810 9820 9900 10000 10100 10200 10300 10400 10410 10420 10500 10600 10700 10800 10900 11000 11100 11200 11300 11400 11500 11600 11700 11800 11900 12000 12100 12200 12300 12400 12500 12600" + local ATTACK_MODES="0 1 3 6 7" + local OUTFILE_FORMATS="1 2 3 4 5 6 7 8 9 10 11 12 13 14 15" + local BENCHMARK_MODE="0 1" + local DEBUG_MODE="1 2 3 4" + local WORKLOAD_PROFILE="1 2 3" + local GPU_ACCEL="1 8 16 24 32 40 48 56 64 62 80 88 96 104 112 120 128 136 144 152 160" + local GPU_LOOPS="8 16 32 64 128 256 512 1024" + local HIDDEN_FILES="exe|bin|pot|hcstat|dictstat|accepted|sh|cmd|bat|restore" + local HIDDEN_FILES_AGGRESIVE="exe|bin|pot|hcstat|dictstat|hcmask|hcchr|accepted|sh|cmd|restore" + local BUILD_IN_CHARSETS='?l ?u ?d ?a ?b ?s' + + local SHORT_OPTS="-m -a -V -v -h -b -t -o -p -c -d -w -n -u -j -k -r -g -1 -2 -3 -4 -i -s -l" + local LONG_OPTS="--hash-type --attack-mode --version --help --eula --quiet --benchmark --benchmark-mode --hex-salt --hex-wordlist --hex-charset --force --status --status-timer --status-automat --loopback --weak-hash-threshold --markov-hcstat --markov-disable --markov-classic --markov-threshold --runtime --session --restore --restore-disable --outfile --outfile-format --outfile-autohex-disable --outfile-check-timer --outfile-check-dir --separator --show --left --username --remove --remove-timer --potfile-disable --debug-mode --debug-file --induction-dir --segment-size --bitmap-min --bitmap-max --cpu-affinity --gpu-async --gpu-devices --workload-profile --gpu-accel --gpu-loops --gpu-temp-disable --gpu-temp-abort --gpu-temp-retain --powertune-enable --skip --limit --keyspace --rule-left --rule-right --rules-file --generate-rules --generate-rules-func-min --generate-rules-func-max --generate-rules-seed --rules-cleanup --custom-charset1 --custom-charset2 --custom-charset3 --custom-charset4 --increment --increment-min --increment-max --logfile-disable --scrypt-tmto --truecrypt-keyfiles" + local OPTIONS="-m -a -t -o -p -c -d -w -n -u -j -k -r -g -1 -2 -3 -4 -s -l --hash-type --attack-mode --benchmark-mode --status-timer --markov-hcstat --markov-threshold --runtime --session --timer --outfile --outfile-format --outfile-check-timer --outfile-check-dir --separator --remove-timer --debug-mode --debug-file --induction-dir --segment-size --bitmap-min --bitmap-max --cpu-affinity --gpu-devices --workload-profile --gpu-accel --gpu-loops --gpu-temp-abort --gpu-temp-retain -disable --skip --limit --rule-left --rule-right --rules-file --generate-rules --generate-rules-func-min --generate-rules-func-max --generate-rules-seed --custom-charset1 --custom-charset2 --custom-charset3 --custom-charset4 --increment-min --increment-max --scrypt-tmto --truecrypt-keyfiles" + + COMPREPLY=() + local cur="${COMP_WORDS[COMP_CWORD]}" + local prev="${COMP_WORDS[COMP_CWORD-1]}" + + # if cur is just '=', ignore the '=' and treat it as only the prev was provided + if [[ "${cur}" == '=' ]]; then + + cur="" + + elif [[ "${prev}" == '=' ]]; then + + if [ "${COMP_CWORD}" -gt 2 ]; then + + prev="${COMP_WORDS[COMP_CWORD-2]}" + + fi + + fi + + case "${prev}" in + + -m|--hash-type) + COMPREPLY=($(compgen -W "${HASH_MODES}" -- ${cur})) + return 0 + ;; + + -a|--attack-mode) + COMPREPLY=($(compgen -W "${ATTACK_MODES}" -- ${cur})) + return 0 + ;; + + --outfile-format) + COMPREPLY=($(compgen -W "${OUTFILE_FORMATS}" -- ${cur})) + return 0 + ;; + + --benchmark-mode) + COMPREPLY=($(compgen -W "${BENCHMARK_MODE}" -- ${cur})) + return 0 + ;; + + -w|--workload-profile) + COMPREPLY=($(compgen -W "${WORKLOAD_PROFILE}" -- ${cur})) + return 0 + ;; + + -n|--gpu-accel) + COMPREPLY=($(compgen -W "${GPU_ACCEL}" -- ${cur})) + return 0 + ;; + + -u|--gpu-loops) + COMPREPLY=($(compgen -W "${GPU_LOOPS}" -- ${cur})) + return 0 + ;; + + -o|--outfile|-r|--rules-file|--debug-file) + local files=$(ls -d ${cur}* 2> /dev/null | grep -Eiv '*\.('${HIDDEN_FILES_AGGRESIVE}')' 2> /dev/null) + COMPREPLY=($(compgen -W "${files}" -- ${cur})) # or $(compgen -f -X '*.+('${HIDDEN_FILES_AGGRESIVE}')' -- ${cur}) + return 0 + ;; + + --markov-hcstat) + local files=$(ls -d ${cur}* 2> /dev/null | grep -Eiv '*\.('${HIDDEN_FILES}')' 2> /dev/null) + COMPREPLY=($(compgen -W "${files}" -- ${cur})) # or $(compgen -f -X '*.+('${HIDDEN_FILES_AGGRESIVE}')' -- ${cur}) + return 0 + ;; + + -d|--gpu-devices) + _oclHashcat_gpu_devices + local num_devices=${?} + + _oclHashcat_get_permutations ${num_devices} + + COMPREPLY=($(compgen -W "${oclHashcat_devices_permutation}" -- ${cur})) + return 0 + ;; + + --cpu-affinity) + _oclHashcat_cpu_devices + local num_devices=${?} + + _oclHashcat_get_permutations ${num_devices} + + COMPREPLY=($(compgen -W "${oclHashcat_devices_permutation}" -- ${cur})) + return 0 + ;; + + -1|-2|-3|-4|--custom-charset1|--custom-charset2|--custom-charset3|--custom-charset4) + local mask=${BUILD_IN_CHARSETS} + + if [ -e "${cur}" ]; then # should be hcchr file (but not enforced) + + COMPREPLY=($(compgen -W "${cur}" -- ${cur})) + return 0 + + fi + + if [ -n "${cur}" ]; then + + local cur_var=$(echo "${cur}" | sed 's/\?$//') + + mask="${mask} ${cur_var}" + local h + for h in ${mask}; do + + if ! echo ${cur} | grep -q ${h} 2> /dev/null; then + + if echo ${cur} | grep -q '?a' 2> /dev/null; then + + if [[ "${h}" == "?l" ]] ; then + continue + elif [[ "${h}" == "?u" ]] ; then + continue + elif [[ "${h}" == "?d" ]] ; then + continue + elif [[ "${h}" == "?s" ]] ; then + continue + elif [[ "${h}" == "?b" ]] ; then + continue + fi + + fi + + mask="${mask} ${cur_var}${h}" + + fi + + done + fi + + local files=$(ls -d ${cur}* 2> /dev/null | grep -Eiv '*\.('${HIDDEN_FILES}')' 2> /dev/null) + + mask="${mask} ${files}" + + COMPREPLY=($(compgen -W "${mask}" -- ${cur})) + return 0 + ;; + + -t|-p|-c|-j|-k|-g| \ + --status-timer|--markov-threshold|--runtime|--session|--separator|--segment-size|--rule-left|--rule-right| \ + --gpu-temp-abort|--gpu-temp-retain|--generate-rules|--generate-rules-func-min|--generate-rules-func-max| \ + --increment-min|--increment-max|--remove-timer|--bitmap-min|--bitmap-max|--skip|--limit|--generate-rules-seed) + return 0 + ;; + + --debug-mode) + COMPREPLY=($(compgen -W "${DEBUG_MODE}" -- ${cur})) + return 0 + ;; + + --truecrypt-keyfiles) + # first: remove the quotes such that file matching is possible + + local cur_part0=$(echo "${cur}" | grep -Eo '^("|'"'"')') + + local cur_mod=$(echo "${cur}" | sed 's/^["'"'"']//') + local cur_part1=$(echo "${cur_mod}" | grep ',' 2> /dev/null | sed 's/^\(.*, *\)[^,]*$/\1/') + local cur_part2=$(echo "${cur_mod}" | sed 's/^.*, *\([^,]*\)$/\1/') + + # generate lines with the file name and a duplicate of it with a comma at the end + + local files=$(ls -d ${cur_part2}* 2> /dev/null | grep -Eiv '*\.('${HIDDEN_FILES_AGGRESIVE}')' 2> /dev/null | sed 's/^\(.*\)$/\1\n\1,\n/' | sed "s/^/${cur_part0}${cur_part1}/" | sed "s/$/${cur_part0}/") + COMPREPLY=($(compgen -W "${files}" -- ${cur})) + return 0 + + esac + + # allow also the VARIANTS w/o spaces + # we could use compgen -P prefix, but for some reason it doesn't seem to work always + + case "$cur" in + + -m*) + local hash_modes_var="$(echo -n "-m ${HASH_MODES}" | sed 's/ / -m/g')" + COMPREPLY=($(compgen -W "${hash_modes_var}" -- ${cur})) + return 0 + ;; + + -a*) + local attack_modes_var="$(echo -n "-a ${ATTACK_MODES}" | sed 's/ / -a/g')" + COMPREPLY=($(compgen -W "${attack_modes_var}" -- ${cur})) + return 0 + ;; + + -w*) + local workload_profile_var="$(echo -n "-w ${WORKLOAD_PROFILE}" | sed 's/ / -w/g')" + COMPREPLY=($(compgen -W "${workload_profile_var}" -- ${cur})) + return 0 + ;; + + -n*) + local gpu_accel_var="$(echo -n "-n ${GPU_ACCEL}" | sed 's/ / -n/g')" + COMPREPLY=($(compgen -W "${gpu_accel_var}" -- ${cur})) + return 0 + ;; + + -u*) + local gpu_loops_var="$(echo -n "-u ${GPU_LOOPS}" | sed 's/ / -u/g')" + COMPREPLY=($(compgen -W "${gpu_loops_var}" -- ${cur})) + return 0 + ;; + + -o*) + local outfile_var=$(ls -d ${cur:2}* 2> /dev/null | grep -Eiv '*\.('${HIDDEN_FILES_AGGRESIVE}')' 2> /dev/null) + outfile_var="$(echo -e "\n${outfile_var}" | sed 's/^/-o/g')" + COMPREPLY=($(compgen -W "${outfile_var}" -- ${cur})) + return 0 + ;; + + -r*) + local outfile_var=$(ls -d ${cur:2}* 2> /dev/null | grep -Eiv '*\.('${HIDDEN_FILES_AGGRESIVE}')' 2> /dev/null) + outfile_var="$(echo -e "\n${outfile_var}" | sed 's/^/-r/g')" + COMPREPLY=($(compgen -W "${outfile_var}" -- ${cur})) + return 0 + ;; + + -d*) + _oclHashcat_gpu_devices + local num_devices=${?} + + _oclHashcat_get_permutations ${num_devices} + + local gpu_devices_var="$(echo " "${oclHashcat_devices_permutation} | sed 's/ / -d/g')" + COMPREPLY=($(compgen -W "${gpu_devices_var}" -- ${cur})) + return 0 + ;; + esac + + # Complete options/switches (not the arguments) + + if [[ "${cur}" == -* ]]; then + + COMPREPLY=($(compgen -W "${SHORT_OPTS} ${LONG_OPTS}" -- ${cur})) + return 0 + + fi + + # additional parameter, no switch nor option but maybe hash file, dictionary, mask, directory + + # check if first option out of (hash.txt and dictionary|mask|directory) + # is first option iff: here + # is second option iff: COMP_CWORD > 2 and no switch before (-*) if no option afterwards (for mask -a 3, -a 6, -a 7 - but possible for dicts!) + + local h=1 + local no_opts=0 + local attack_mode=0 # also default of oclHashcat + local has_charset_1=0 + local has_charset_2=0 + local has_charset_3=0 + local has_charset_4=0 + + while [ ${h} -le ${COMP_CWORD} ]; do + + if [[ "${COMP_WORDS[h]}" == "-a" ]]; then + + attack_mode=${COMP_WORDS[$((h + 1))]} + + elif [[ "${COMP_WORDS[h]}" == -a* ]]; then + + attack_mode=${COMP_WORDS[h]:2} + + elif [[ "${COMP_WORDS[h]}" == "--attack-mode" ]]; then + + attack_mode=${COMP_WORDS[$((h + 1))]} + + elif [[ "${COMP_WORDS[h]}" == "-1" ]]; then + + has_charset_1=1 + + elif [[ "${COMP_WORDS[h]}" == "--custom-charset1" ]]; then + + has_charset_1=1 + + elif [[ "${COMP_WORDS[h]}" == "-2" ]]; then + + has_charset_2=1 + + elif [[ "${COMP_WORDS[h]}" == "--custom-charset2" ]]; then + + has_charset_2=1 + + elif [[ "${COMP_WORDS[h]}" == "-3" ]]; then + + has_charset_3=1 + + elif [[ "${COMP_WORDS[h]}" == "--custom-charset3" ]]; then + + has_charset_3=1 + + elif [[ "${COMP_WORDS[h]}" == "-4" ]]; then + + has_charset_4=1 + + elif [[ "${COMP_WORDS[h]}" == "--custom-charset4" ]]; then + + has_charset_4=1 + + fi + + if _oclHashcat_contains "${OPTIONS}" "${COMP_WORDS[h]}"; then + + h=$((h + 2)) + + else + + if ! _oclHashcat_contains "${LONG_OPTS}${SHORT_OPTS}" "${COMP_WORDS[h]}"; then + local variants="-m -a -w -n -u -o -r -d" + local skip=0 + local v + for v in ${variants}; do + + if [[ "${COMP_WORDS[h]:0:2}" == "${v}" ]]; then + skip=1 + fi + + done + + if [ "${skip}" -eq 0 ]; then + + no_opts=$((no_opts + 1)) + + fi + fi + + h=$((h + 1)) + + fi + + done + + case "${no_opts}" in + + 0) + return 0 + ;; + + 1) + local files=$(ls -d ${cur}* 2> /dev/null | grep -Eiv '*\.('${HIDDEN_FILES_AGGRESIVE}')' 2> /dev/null) + COMPREPLY=($(compgen -W "${files}" -- ${cur})) + return 0 + ;; + + *) + case "${attack_mode}" in + + 0) + # dict/directory are files here + local files=$(ls -d ${cur}* 2> /dev/null | grep -Eiv '*\.('${HIDDEN_FILES_AGGRESIVE}')' 2> /dev/null) + COMPREPLY=($(compgen -W "${files}" -- ${cur})) + return 0 + ;; + + 1) + if [ "${no_opts}" -gt 4 ]; then + return 0 + fi + + local files=$(ls -d ${cur}* 2> /dev/null | grep -Eiv '*\.('${HIDDEN_FILES_AGGRESIVE}')' 2> /dev/null) + COMPREPLY=($(compgen -W "${files}" -- ${cur})) + return 0 + ;; + + 3) + if [ "${no_opts}" -eq 2 ]; then + local mask=${BUILD_IN_CHARSETS} + + if [ "${has_charset_1}" -eq 1 ]; then + + mask="${mask} ?1" + + fi + + if [ "${has_charset_2}" -eq 1 ]; then + + mask="${mask} ?2" + + fi + + if [ "${has_charset_3}" -eq 1 ]; then + + mask="${mask} ?3" + + fi + + if [ "${has_charset_4}" -eq 1 ]; then + + mask="${mask} ?4" + + fi + + if [ -e "${cur}" ]; then # should be hcmask file (but not enforced) + + COMPREPLY=($(compgen -W "${cur}" -- ${cur})) + return 0 + + fi + + if [ -n "${cur}" ]; then + + local cur_var=$(echo "${cur}" | sed 's/\?$//') + + mask="${mask} ${cur_var}" + + local h + for h in ${mask}; do + + mask="${mask} ${cur_var}${h}" + + done + fi + + local files=$(ls -d ${cur}* 2> /dev/null | grep -Eiv '*\.('${HIDDEN_FILES}')' 2> /dev/null) + + mask="${mask} ${files}" + + COMPREPLY=($(compgen -W "${mask}" -- ${cur})) + return 0 + fi + ;; + + 6) + if [ "${no_opts}" -eq 2 ]; then + + local files=$(ls -d ${cur}* 2> /dev/null | grep -Eiv '*\.('${HIDDEN_FILES_AGGRESIVE}')' 2> /dev/null) + COMPREPLY=($(compgen -W "${files}" -- ${cur})) + + elif [ "${no_opts}" -eq 3 ]; then + local mask=${BUILD_IN_CHARSETS} + + if [ "${has_charset_1}" -eq 1 ]; then + + mask="${mask} ?1" + + fi + + if [ "${has_charset_2}" -eq 1 ]; then + + mask="${mask} ?2" + + fi + + if [ "${has_charset_3}" -eq 1 ]; then + + mask="${mask} ?3" + + fi + + if [ "${has_charset_4}" -eq 1 ]; then + + mask="${mask} ?4" + + fi + + if [ -e "${cur}" ]; then # should be hcmask file (but not enforced) + + COMPREPLY=($(compgen -W "${cur}" -- ${cur})) + return 0 + + fi + + if [ -n "${cur}" ]; then + + local cur_var=$(echo "${cur}" | sed 's/\?$//') + + mask="${mask} ${cur_var}" + + local h + for h in ${mask}; do + + mask="${mask} ${cur_var}${h}" + + done + fi + + local files=$(ls -d ${cur}* 2> /dev/null | grep -Eiv '*\.('${HIDDEN_FILES}')' 2> /dev/null) + + mask="${mask} ${files}" + + COMPREPLY=($(compgen -W "${mask}" -- ${cur})) + return 0 + + fi + ;; + + 7) + if [ "${no_opts}" -eq 2 ]; then + local mask=${BUILD_IN_CHARSETS} + + if [ "${has_charset_1}" -eq 1 ]; then + + mask="${mask} ?1" + + fi + + if [ "${has_charset_2}" -eq 1 ]; then + + mask="${mask} ?2" + + fi + + if [ "${has_charset_3}" -eq 1 ]; then + + mask="${mask} ?3" + + fi + + if [ "${has_charset_4}" -eq 1 ]; then + + mask="${mask} ?4" + + fi + + if [ -e "${cur}" ]; then # should be hcmask file (but not enforced) + + COMPREPLY=($(compgen -W "${cur}" -- ${cur})) + return 0 + + fi + + if [ -n "${cur}" ]; then + + local cur_var=$(echo "${cur}" | sed 's/\?$//') + + mask="${mask} ${cur_var}" + + local h + for h in ${mask}; do + + mask="${mask} ${cur_var}${h}" + + done + fi + + local files=$(ls -d ${cur}* 2> /dev/null | grep -Eiv '*\.('${HIDDEN_FILES}')' 2> /dev/null) + + mask="${mask} ${files}" + + COMPREPLY=($(compgen -W "${mask}" -- ${cur})) + return 0 + + elif [ "${no_opts}" -eq 3 ]; then + + local files=$(ls -d ${cur}* 2> /dev/null | grep -Eiv '*\.('${HIDDEN_FILES_AGGRESIVE}')' 2> /dev/null) + COMPREPLY=($(compgen -W "${files}" -- ${cur})) + return + + fi + ;; + + esac + + esac +} + +complete -F _oclHashcat -o filenames ${OCLHASHCAT_ROOT}/oclHashcat64.bin "${OCLHASHCAT_ROOT}"/oclHashcat32.bin "${OCLHASHCAT_ROOT}"/cudaHashcat64.bin "${OCLHASHCAT_ROOT}"/cudaHashcat32.bin diff --git a/hashcat.hcstat b/hashcat.hcstat new file mode 100644 index 0000000000..efbef712b4 Binary files /dev/null and b/hashcat.hcstat differ diff --git a/include/common.h b/include/common.h new file mode 100644 index 0000000000..8918d834e9 --- /dev/null +++ b/include/common.h @@ -0,0 +1,95 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#ifndef COMMON_H +#define COMMON_H + +#define _POSIX_SOURCE +#define _GNU_SOURCE +#define _FILE_OFFSET_BITS 64 +#define _CRT_SECURE_NO_WARNINGS + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#ifdef _POSIX +#include +#include +#include +#include + +#ifdef LINUX +#include +#endif + +#ifdef OSX +#include +#include +#endif + +typedef void *HM_LIB; +#endif + +#ifdef _WIN +#define WIN32_LEAN_AND_MEAN +#include +#include +#include +#include +#include +#include +#include + +typedef UINT8 uint8_t; +typedef UINT16 uint16_t; +typedef UINT32 uint32_t; +typedef UINT64 uint64_t; +typedef INT8 int8_t; +typedef INT16 int16_t; +typedef INT32 int32_t; +typedef INT64 int64_t; + +typedef UINT32 uint; +typedef UINT64 uint64_t; + +typedef HINSTANCE HM_LIB; +#endif + +#define SPEED_CACHE 128 +#define SPEED_MAXAGE 4096 + +#undef BUFSIZ +#define BUFSIZ 8192 + +/** + * functions + */ + +void log_out_nn (FILE *fp, const char *fmt, ...); +void log_info_nn (const char *fmt, ...); +void log_error_nn (const char *fmt, ...); + +void log_out (FILE *fp, const char *fmt, ...); +void log_info (const char *fmt, ...); +void log_error (const char *fmt, ...); + +#endif + +typedef uint32_t uint; // we should rename to u32, sooner or later, for consistency +typedef uint64_t u64; diff --git a/include/constants.h b/include/constants.h new file mode 100644 index 0000000000..0b39e5242a --- /dev/null +++ b/include/constants.h @@ -0,0 +1,757 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define COMBINATOR_MODE_BASE_LEFT 10001 +#define COMBINATOR_MODE_BASE_RIGHT 10002 + +#ifdef SHARED_H +#define _BCRYPT_ +#define _SHA1_ +#define _SHA256_ +#define _SHA384_ +#define _SHA512_ +#define _MD4_ +#define _MD5_ +#define _MD5H_ +#define _KECCAK_ +#define _RIPEMD160_ +#define _WHIRLPOOL_ +#define _SAPB_ +#define _CLOUDKEY_ +#define _OFFICE2013_ +#define _SIPHASH_ +#define _PDF17L8_ +#define _PBKDF2_MD5_ +#define _PBKDF2_SHA1_ +#define _PBKDF2_SHA256_ +#define _PBKDF2_SHA512_ +#define _RAR3_ +#endif + +#ifdef _SIPHASH_ +/** + * SipHash Constants + */ + +#define SIPHASHM_0 0x736f6d6570736575ull +#define SIPHASHM_1 0x646f72616e646f6dull +#define SIPHASHM_2 0x6c7967656e657261ull +#define SIPHASHM_3 0x7465646279746573ull +#endif + +#if defined _BCRYPT_ || defined _PSAFE2_ +/** + * bcrypt Constants + */ + +#define BCRYPTM_0 0x4F727068u +#define BCRYPTM_1 0x65616E42u +#define BCRYPTM_2 0x65686F6Cu +#define BCRYPTM_3 0x64657253u +#define BCRYPTM_4 0x63727944u +#define BCRYPTM_5 0x6F756274u +#endif + +#if defined _SHA1_ || defined _SAPG_ || defined _OFFICE2007_ || defined _OFFICE2010_ || defined _OLDOFFICE34_ || defined _ANDROIDFDE_ || defined _DCC2_ || defined _WPA_ || defined _MD5_SHA1_ || defined _SHA1_MD5_ || defined _PSAFE2_ || defined _LOTUS8_ || defined _PBKDF2_SHA1_ || defined _RAR3_ || defined _SHA256_SHA1_ +/** + * SHA1 Constants + */ + +#define SHA1M_A 0x67452301u +#define SHA1M_B 0xefcdab89u +#define SHA1M_C 0x98badcfeu +#define SHA1M_D 0x10325476u +#define SHA1M_E 0xc3d2e1f0u + +#define SHA1C00 0x5a827999u +#define SHA1C01 0x6ed9eba1u +#define SHA1C02 0x8f1bbcdcu +#define SHA1C03 0xca62c1d6u +#endif + +#if defined _SHA256_ || defined _PDF17L8_ || defined _SEVEN_ZIP_ || defined _ANDROIDFDE_ || defined _CLOUDKEY_ || defined _SCRYPT_ || defined _PBKDF2_SHA256_ || defined _SHA256_SHA1_ || defined _MS_DRSR_ +/** + * SHA256 Constants + */ + +#define SHA256M_A 0x6a09e667u +#define SHA256M_B 0xbb67ae85u +#define SHA256M_C 0x3c6ef372u +#define SHA256M_D 0xa54ff53au +#define SHA256M_E 0x510e527fu +#define SHA256M_F 0x9b05688cu +#define SHA256M_G 0x1f83d9abu +#define SHA256M_H 0x5be0cd19u + +#define SHA256C00 0x428a2f98u +#define SHA256C01 0x71374491u +#define SHA256C02 0xb5c0fbcfu +#define SHA256C03 0xe9b5dba5u +#define SHA256C04 0x3956c25bu +#define SHA256C05 0x59f111f1u +#define SHA256C06 0x923f82a4u +#define SHA256C07 0xab1c5ed5u +#define SHA256C08 0xd807aa98u +#define SHA256C09 0x12835b01u +#define SHA256C0a 0x243185beu +#define SHA256C0b 0x550c7dc3u +#define SHA256C0c 0x72be5d74u +#define SHA256C0d 0x80deb1feu +#define SHA256C0e 0x9bdc06a7u +#define SHA256C0f 0xc19bf174u +#define SHA256C10 0xe49b69c1u +#define SHA256C11 0xefbe4786u +#define SHA256C12 0x0fc19dc6u +#define SHA256C13 0x240ca1ccu +#define SHA256C14 0x2de92c6fu +#define SHA256C15 0x4a7484aau +#define SHA256C16 0x5cb0a9dcu +#define SHA256C17 0x76f988dau +#define SHA256C18 0x983e5152u +#define SHA256C19 0xa831c66du +#define SHA256C1a 0xb00327c8u +#define SHA256C1b 0xbf597fc7u +#define SHA256C1c 0xc6e00bf3u +#define SHA256C1d 0xd5a79147u +#define SHA256C1e 0x06ca6351u +#define SHA256C1f 0x14292967u +#define SHA256C20 0x27b70a85u +#define SHA256C21 0x2e1b2138u +#define SHA256C22 0x4d2c6dfcu +#define SHA256C23 0x53380d13u +#define SHA256C24 0x650a7354u +#define SHA256C25 0x766a0abbu +#define SHA256C26 0x81c2c92eu +#define SHA256C27 0x92722c85u +#define SHA256C28 0xa2bfe8a1u +#define SHA256C29 0xa81a664bu +#define SHA256C2a 0xc24b8b70u +#define SHA256C2b 0xc76c51a3u +#define SHA256C2c 0xd192e819u +#define SHA256C2d 0xd6990624u +#define SHA256C2e 0xf40e3585u +#define SHA256C2f 0x106aa070u +#define SHA256C30 0x19a4c116u +#define SHA256C31 0x1e376c08u +#define SHA256C32 0x2748774cu +#define SHA256C33 0x34b0bcb5u +#define SHA256C34 0x391c0cb3u +#define SHA256C35 0x4ed8aa4au +#define SHA256C36 0x5b9cca4fu +#define SHA256C37 0x682e6ff3u +#define SHA256C38 0x748f82eeu +#define SHA256C39 0x78a5636fu +#define SHA256C3a 0x84c87814u +#define SHA256C3b 0x8cc70208u +#define SHA256C3c 0x90befffau +#define SHA256C3d 0xa4506cebu +#define SHA256C3e 0xbef9a3f7u +#define SHA256C3f 0xc67178f2u +#endif + +#if defined _MD4_ || defined _DCC2_ || defined _NETNTLMV2_ || defined _KRB5PA_ || defined _MS_DRSR_ +/** + * MD4 Constants + */ + +#define MD4M_A 0x67452301u +#define MD4M_B 0xefcdab89u +#define MD4M_C 0x98badcfeu +#define MD4M_D 0x10325476u + +#define MD4S00 3u +#define MD4S01 7u +#define MD4S02 11u +#define MD4S03 19u +#define MD4S10 3u +#define MD4S11 5u +#define MD4S12 9u +#define MD4S13 13u +#define MD4S20 3u +#define MD4S21 9u +#define MD4S22 11u +#define MD4S23 15u + +#define MD4C00 0x00000000u +#define MD4C01 0x5a827999u +#define MD4C02 0x6ed9eba1u +#endif + +#if defined _MD5_ || defined _MD5H_ || defined _SAPB_ || defined _OLDOFFICE01_ || defined _WPA_ || defined _MD5_SHA1_ || defined _SHA1_MD5_ || defined _NETNTLMV2_ || defined _KRB5PA_ || defined _PBKDF2_MD5_ +/** + * MD5 Constants + */ + +#define MD5M_A 0x67452301u +#define MD5M_B 0xefcdab89u +#define MD5M_C 0x98badcfeu +#define MD5M_D 0x10325476u + +#define MD5S00 7u +#define MD5S01 12u +#define MD5S02 17u +#define MD5S03 22u +#define MD5S10 5u +#define MD5S11 9u +#define MD5S12 14u +#define MD5S13 20u +#define MD5S20 4u +#define MD5S21 11u +#define MD5S22 16u +#define MD5S23 23u +#define MD5S30 6u +#define MD5S31 10u +#define MD5S32 15u +#define MD5S33 21u + +#define MD5C00 0xd76aa478u +#define MD5C01 0xe8c7b756u +#define MD5C02 0x242070dbu +#define MD5C03 0xc1bdceeeu +#define MD5C04 0xf57c0fafu +#define MD5C05 0x4787c62au +#define MD5C06 0xa8304613u +#define MD5C07 0xfd469501u +#define MD5C08 0x698098d8u +#define MD5C09 0x8b44f7afu +#define MD5C0a 0xffff5bb1u +#define MD5C0b 0x895cd7beu +#define MD5C0c 0x6b901122u +#define MD5C0d 0xfd987193u +#define MD5C0e 0xa679438eu +#define MD5C0f 0x49b40821u +#define MD5C10 0xf61e2562u +#define MD5C11 0xc040b340u +#define MD5C12 0x265e5a51u +#define MD5C13 0xe9b6c7aau +#define MD5C14 0xd62f105du +#define MD5C15 0x02441453u +#define MD5C16 0xd8a1e681u +#define MD5C17 0xe7d3fbc8u +#define MD5C18 0x21e1cde6u +#define MD5C19 0xc33707d6u +#define MD5C1a 0xf4d50d87u +#define MD5C1b 0x455a14edu +#define MD5C1c 0xa9e3e905u +#define MD5C1d 0xfcefa3f8u +#define MD5C1e 0x676f02d9u +#define MD5C1f 0x8d2a4c8au +#define MD5C20 0xfffa3942u +#define MD5C21 0x8771f681u +#define MD5C22 0x6d9d6122u +#define MD5C23 0xfde5380cu +#define MD5C24 0xa4beea44u +#define MD5C25 0x4bdecfa9u +#define MD5C26 0xf6bb4b60u +#define MD5C27 0xbebfbc70u +#define MD5C28 0x289b7ec6u +#define MD5C29 0xeaa127fau +#define MD5C2a 0xd4ef3085u +#define MD5C2b 0x04881d05u +#define MD5C2c 0xd9d4d039u +#define MD5C2d 0xe6db99e5u +#define MD5C2e 0x1fa27cf8u +#define MD5C2f 0xc4ac5665u +#define MD5C30 0xf4292244u +#define MD5C31 0x432aff97u +#define MD5C32 0xab9423a7u +#define MD5C33 0xfc93a039u +#define MD5C34 0x655b59c3u +#define MD5C35 0x8f0ccc92u +#define MD5C36 0xffeff47du +#define MD5C37 0x85845dd1u +#define MD5C38 0x6fa87e4fu +#define MD5C39 0xfe2ce6e0u +#define MD5C3a 0xa3014314u +#define MD5C3b 0x4e0811a1u +#define MD5C3c 0xf7537e82u +#define MD5C3d 0xbd3af235u +#define MD5C3e 0x2ad7d2bbu +#define MD5C3f 0xeb86d391u +#endif + +#if defined _SHA384_ || defined _PDF17L8_ +/** + * SHA384 Constants (64 bits) + */ + +#define SHA384M_A 0xcbbb9d5dc1059ed8ull +#define SHA384M_B 0x629a292a367cd507ull +#define SHA384M_C 0x9159015a3070dd17ull +#define SHA384M_D 0x152fecd8f70e5939ull +#define SHA384M_E 0x67332667ffc00b31ull +#define SHA384M_F 0x8eb44a8768581511ull +#define SHA384M_G 0xdb0c2e0d64f98fa7ull +#define SHA384M_H 0x47b5481dbefa4fa4ull + +#define SHA384C00 0x428a2f98d728ae22ull +#define SHA384C01 0x7137449123ef65cdull +#define SHA384C02 0xb5c0fbcfec4d3b2full +#define SHA384C03 0xe9b5dba58189dbbcull +#define SHA384C04 0x3956c25bf348b538ull +#define SHA384C05 0x59f111f1b605d019ull +#define SHA384C06 0x923f82a4af194f9bull +#define SHA384C07 0xab1c5ed5da6d8118ull +#define SHA384C08 0xd807aa98a3030242ull +#define SHA384C09 0x12835b0145706fbeull +#define SHA384C0a 0x243185be4ee4b28cull +#define SHA384C0b 0x550c7dc3d5ffb4e2ull +#define SHA384C0c 0x72be5d74f27b896full +#define SHA384C0d 0x80deb1fe3b1696b1ull +#define SHA384C0e 0x9bdc06a725c71235ull +#define SHA384C0f 0xc19bf174cf692694ull +#define SHA384C10 0xe49b69c19ef14ad2ull +#define SHA384C11 0xefbe4786384f25e3ull +#define SHA384C12 0x0fc19dc68b8cd5b5ull +#define SHA384C13 0x240ca1cc77ac9c65ull +#define SHA384C14 0x2de92c6f592b0275ull +#define SHA384C15 0x4a7484aa6ea6e483ull +#define SHA384C16 0x5cb0a9dcbd41fbd4ull +#define SHA384C17 0x76f988da831153b5ull +#define SHA384C18 0x983e5152ee66dfabull +#define SHA384C19 0xa831c66d2db43210ull +#define SHA384C1a 0xb00327c898fb213full +#define SHA384C1b 0xbf597fc7beef0ee4ull +#define SHA384C1c 0xc6e00bf33da88fc2ull +#define SHA384C1d 0xd5a79147930aa725ull +#define SHA384C1e 0x06ca6351e003826full +#define SHA384C1f 0x142929670a0e6e70ull +#define SHA384C20 0x27b70a8546d22ffcull +#define SHA384C21 0x2e1b21385c26c926ull +#define SHA384C22 0x4d2c6dfc5ac42aedull +#define SHA384C23 0x53380d139d95b3dfull +#define SHA384C24 0x650a73548baf63deull +#define SHA384C25 0x766a0abb3c77b2a8ull +#define SHA384C26 0x81c2c92e47edaee6ull +#define SHA384C27 0x92722c851482353bull +#define SHA384C28 0xa2bfe8a14cf10364ull +#define SHA384C29 0xa81a664bbc423001ull +#define SHA384C2a 0xc24b8b70d0f89791ull +#define SHA384C2b 0xc76c51a30654be30ull +#define SHA384C2c 0xd192e819d6ef5218ull +#define SHA384C2d 0xd69906245565a910ull +#define SHA384C2e 0xf40e35855771202aull +#define SHA384C2f 0x106aa07032bbd1b8ull +#define SHA384C30 0x19a4c116b8d2d0c8ull +#define SHA384C31 0x1e376c085141ab53ull +#define SHA384C32 0x2748774cdf8eeb99ull +#define SHA384C33 0x34b0bcb5e19b48a8ull +#define SHA384C34 0x391c0cb3c5c95a63ull +#define SHA384C35 0x4ed8aa4ae3418acbull +#define SHA384C36 0x5b9cca4f7763e373ull +#define SHA384C37 0x682e6ff3d6b2b8a3ull +#define SHA384C38 0x748f82ee5defb2fcull +#define SHA384C39 0x78a5636f43172f60ull +#define SHA384C3a 0x84c87814a1f0ab72ull +#define SHA384C3b 0x8cc702081a6439ecull +#define SHA384C3c 0x90befffa23631e28ull +#define SHA384C3d 0xa4506cebde82bde9ull +#define SHA384C3e 0xbef9a3f7b2c67915ull +#define SHA384C3f 0xc67178f2e372532bull +#define SHA384C40 0xca273eceea26619cull +#define SHA384C41 0xd186b8c721c0c207ull +#define SHA384C42 0xeada7dd6cde0eb1eull +#define SHA384C43 0xf57d4f7fee6ed178ull +#define SHA384C44 0x06f067aa72176fbaull +#define SHA384C45 0x0a637dc5a2c898a6ull +#define SHA384C46 0x113f9804bef90daeull +#define SHA384C47 0x1b710b35131c471bull +#define SHA384C48 0x28db77f523047d84ull +#define SHA384C49 0x32caab7b40c72493ull +#define SHA384C4a 0x3c9ebe0a15c9bebcull +#define SHA384C4b 0x431d67c49c100d4cull +#define SHA384C4c 0x4cc5d4becb3e42b6ull +#define SHA384C4d 0x597f299cfc657e2aull +#define SHA384C4e 0x5fcb6fab3ad6faecull +#define SHA384C4f 0x6c44198c4a475817ull + +#endif + +#if defined _SHA512_ || defined _CLOUDKEY_ || defined _OFFICE2013_ || defined _PDF17L8_ || defined _PBKDF2_SHA512_ +/** + * SHA512 Constants (64 bits) + */ + +#define SHA512M_A 0x6a09e667f3bcc908ull +#define SHA512M_B 0xbb67ae8584caa73bull +#define SHA512M_C 0x3c6ef372fe94f82bull +#define SHA512M_D 0xa54ff53a5f1d36f1ull +#define SHA512M_E 0x510e527fade682d1ull +#define SHA512M_F 0x9b05688c2b3e6c1full +#define SHA512M_G 0x1f83d9abfb41bd6bull +#define SHA512M_H 0x5be0cd19137e2179ull + +#define SHA512C00 0x428a2f98d728ae22ull +#define SHA512C01 0x7137449123ef65cdull +#define SHA512C02 0xb5c0fbcfec4d3b2full +#define SHA512C03 0xe9b5dba58189dbbcull +#define SHA512C04 0x3956c25bf348b538ull +#define SHA512C05 0x59f111f1b605d019ull +#define SHA512C06 0x923f82a4af194f9bull +#define SHA512C07 0xab1c5ed5da6d8118ull +#define SHA512C08 0xd807aa98a3030242ull +#define SHA512C09 0x12835b0145706fbeull +#define SHA512C0a 0x243185be4ee4b28cull +#define SHA512C0b 0x550c7dc3d5ffb4e2ull +#define SHA512C0c 0x72be5d74f27b896full +#define SHA512C0d 0x80deb1fe3b1696b1ull +#define SHA512C0e 0x9bdc06a725c71235ull +#define SHA512C0f 0xc19bf174cf692694ull +#define SHA512C10 0xe49b69c19ef14ad2ull +#define SHA512C11 0xefbe4786384f25e3ull +#define SHA512C12 0x0fc19dc68b8cd5b5ull +#define SHA512C13 0x240ca1cc77ac9c65ull +#define SHA512C14 0x2de92c6f592b0275ull +#define SHA512C15 0x4a7484aa6ea6e483ull +#define SHA512C16 0x5cb0a9dcbd41fbd4ull +#define SHA512C17 0x76f988da831153b5ull +#define SHA512C18 0x983e5152ee66dfabull +#define SHA512C19 0xa831c66d2db43210ull +#define SHA512C1a 0xb00327c898fb213full +#define SHA512C1b 0xbf597fc7beef0ee4ull +#define SHA512C1c 0xc6e00bf33da88fc2ull +#define SHA512C1d 0xd5a79147930aa725ull +#define SHA512C1e 0x06ca6351e003826full +#define SHA512C1f 0x142929670a0e6e70ull +#define SHA512C20 0x27b70a8546d22ffcull +#define SHA512C21 0x2e1b21385c26c926ull +#define SHA512C22 0x4d2c6dfc5ac42aedull +#define SHA512C23 0x53380d139d95b3dfull +#define SHA512C24 0x650a73548baf63deull +#define SHA512C25 0x766a0abb3c77b2a8ull +#define SHA512C26 0x81c2c92e47edaee6ull +#define SHA512C27 0x92722c851482353bull +#define SHA512C28 0xa2bfe8a14cf10364ull +#define SHA512C29 0xa81a664bbc423001ull +#define SHA512C2a 0xc24b8b70d0f89791ull +#define SHA512C2b 0xc76c51a30654be30ull +#define SHA512C2c 0xd192e819d6ef5218ull +#define SHA512C2d 0xd69906245565a910ull +#define SHA512C2e 0xf40e35855771202aull +#define SHA512C2f 0x106aa07032bbd1b8ull +#define SHA512C30 0x19a4c116b8d2d0c8ull +#define SHA512C31 0x1e376c085141ab53ull +#define SHA512C32 0x2748774cdf8eeb99ull +#define SHA512C33 0x34b0bcb5e19b48a8ull +#define SHA512C34 0x391c0cb3c5c95a63ull +#define SHA512C35 0x4ed8aa4ae3418acbull +#define SHA512C36 0x5b9cca4f7763e373ull +#define SHA512C37 0x682e6ff3d6b2b8a3ull +#define SHA512C38 0x748f82ee5defb2fcull +#define SHA512C39 0x78a5636f43172f60ull +#define SHA512C3a 0x84c87814a1f0ab72ull +#define SHA512C3b 0x8cc702081a6439ecull +#define SHA512C3c 0x90befffa23631e28ull +#define SHA512C3d 0xa4506cebde82bde9ull +#define SHA512C3e 0xbef9a3f7b2c67915ull +#define SHA512C3f 0xc67178f2e372532bull +#define SHA512C40 0xca273eceea26619cull +#define SHA512C41 0xd186b8c721c0c207ull +#define SHA512C42 0xeada7dd6cde0eb1eull +#define SHA512C43 0xf57d4f7fee6ed178ull +#define SHA512C44 0x06f067aa72176fbaull +#define SHA512C45 0x0a637dc5a2c898a6ull +#define SHA512C46 0x113f9804bef90daeull +#define SHA512C47 0x1b710b35131c471bull +#define SHA512C48 0x28db77f523047d84ull +#define SHA512C49 0x32caab7b40c72493ull +#define SHA512C4a 0x3c9ebe0a15c9bebcull +#define SHA512C4b 0x431d67c49c100d4cull +#define SHA512C4c 0x4cc5d4becb3e42b6ull +#define SHA512C4d 0x597f299cfc657e2aull +#define SHA512C4e 0x5fcb6fab3ad6faecull +#define SHA512C4f 0x6c44198c4a475817ull + +#define SHA512REV0 0x5218a97a1b97e8a0ull +#define SHA512REV1 0x4334c1bea164f555ull + +#endif + +#ifdef _RIPEMD160_ +/** + * RIPEMD160 Constants + */ + +#define RIPEMD160M_A 0x67452301u +#define RIPEMD160M_B 0xefcdab89u +#define RIPEMD160M_C 0x98badcfeu +#define RIPEMD160M_D 0x10325476u +#define RIPEMD160M_E 0xc3d2e1f0u + +#define RIPEMD160C00 0x00000000u +#define RIPEMD160C10 0x5a827999u +#define RIPEMD160C20 0x6ed9eba1u +#define RIPEMD160C30 0x8f1bbcdcu +#define RIPEMD160C40 0xa953fd4eu +#define RIPEMD160C50 0x50a28be6u +#define RIPEMD160C60 0x5c4dd124u +#define RIPEMD160C70 0x6d703ef3u +#define RIPEMD160C80 0x7a6d76e9u +#define RIPEMD160C90 0x00000000u + +#define RIPEMD160S00 11u +#define RIPEMD160S01 14u +#define RIPEMD160S02 15u +#define RIPEMD160S03 12u +#define RIPEMD160S04 5u +#define RIPEMD160S05 8u +#define RIPEMD160S06 7u +#define RIPEMD160S07 9u +#define RIPEMD160S08 11u +#define RIPEMD160S09 13u +#define RIPEMD160S0A 14u +#define RIPEMD160S0B 15u +#define RIPEMD160S0C 6u +#define RIPEMD160S0D 7u +#define RIPEMD160S0E 9u +#define RIPEMD160S0F 8u + +#define RIPEMD160S10 7u +#define RIPEMD160S11 6u +#define RIPEMD160S12 8u +#define RIPEMD160S13 13u +#define RIPEMD160S14 11u +#define RIPEMD160S15 9u +#define RIPEMD160S16 7u +#define RIPEMD160S17 15u +#define RIPEMD160S18 7u +#define RIPEMD160S19 12u +#define RIPEMD160S1A 15u +#define RIPEMD160S1B 9u +#define RIPEMD160S1C 11u +#define RIPEMD160S1D 7u +#define RIPEMD160S1E 13u +#define RIPEMD160S1F 12u + +#define RIPEMD160S20 11u +#define RIPEMD160S21 13u +#define RIPEMD160S22 6u +#define RIPEMD160S23 7u +#define RIPEMD160S24 14u +#define RIPEMD160S25 9u +#define RIPEMD160S26 13u +#define RIPEMD160S27 15u +#define RIPEMD160S28 14u +#define RIPEMD160S29 8u +#define RIPEMD160S2A 13u +#define RIPEMD160S2B 6u +#define RIPEMD160S2C 5u +#define RIPEMD160S2D 12u +#define RIPEMD160S2E 7u +#define RIPEMD160S2F 5u + +#define RIPEMD160S30 11u +#define RIPEMD160S31 12u +#define RIPEMD160S32 14u +#define RIPEMD160S33 15u +#define RIPEMD160S34 14u +#define RIPEMD160S35 15u +#define RIPEMD160S36 9u +#define RIPEMD160S37 8u +#define RIPEMD160S38 9u +#define RIPEMD160S39 14u +#define RIPEMD160S3A 5u +#define RIPEMD160S3B 6u +#define RIPEMD160S3C 8u +#define RIPEMD160S3D 6u +#define RIPEMD160S3E 5u +#define RIPEMD160S3F 12u + +#define RIPEMD160S40 9u +#define RIPEMD160S41 15u +#define RIPEMD160S42 5u +#define RIPEMD160S43 11u +#define RIPEMD160S44 6u +#define RIPEMD160S45 8u +#define RIPEMD160S46 13u +#define RIPEMD160S47 12u +#define RIPEMD160S48 5u +#define RIPEMD160S49 12u +#define RIPEMD160S4A 13u +#define RIPEMD160S4B 14u +#define RIPEMD160S4C 11u +#define RIPEMD160S4D 8u +#define RIPEMD160S4E 5u +#define RIPEMD160S4F 6u + +#define RIPEMD160S50 8u +#define RIPEMD160S51 9u +#define RIPEMD160S52 9u +#define RIPEMD160S53 11u +#define RIPEMD160S54 13u +#define RIPEMD160S55 15u +#define RIPEMD160S56 15u +#define RIPEMD160S57 5u +#define RIPEMD160S58 7u +#define RIPEMD160S59 7u +#define RIPEMD160S5A 8u +#define RIPEMD160S5B 11u +#define RIPEMD160S5C 14u +#define RIPEMD160S5D 14u +#define RIPEMD160S5E 12u +#define RIPEMD160S5F 6u + +#define RIPEMD160S60 9u +#define RIPEMD160S61 13u +#define RIPEMD160S62 15u +#define RIPEMD160S63 7u +#define RIPEMD160S64 12u +#define RIPEMD160S65 8u +#define RIPEMD160S66 9u +#define RIPEMD160S67 11u +#define RIPEMD160S68 7u +#define RIPEMD160S69 7u +#define RIPEMD160S6A 12u +#define RIPEMD160S6B 7u +#define RIPEMD160S6C 6u +#define RIPEMD160S6D 15u +#define RIPEMD160S6E 13u +#define RIPEMD160S6F 11u + +#define RIPEMD160S70 9u +#define RIPEMD160S71 7u +#define RIPEMD160S72 15u +#define RIPEMD160S73 11u +#define RIPEMD160S74 8u +#define RIPEMD160S75 6u +#define RIPEMD160S76 6u +#define RIPEMD160S77 14u +#define RIPEMD160S78 12u +#define RIPEMD160S79 13u +#define RIPEMD160S7A 5u +#define RIPEMD160S7B 14u +#define RIPEMD160S7C 13u +#define RIPEMD160S7D 13u +#define RIPEMD160S7E 7u +#define RIPEMD160S7F 5u + +#define RIPEMD160S80 15u +#define RIPEMD160S81 5u +#define RIPEMD160S82 8u +#define RIPEMD160S83 11u +#define RIPEMD160S84 14u +#define RIPEMD160S85 14u +#define RIPEMD160S86 6u +#define RIPEMD160S87 14u +#define RIPEMD160S88 6u +#define RIPEMD160S89 9u +#define RIPEMD160S8A 12u +#define RIPEMD160S8B 9u +#define RIPEMD160S8C 12u +#define RIPEMD160S8D 5u +#define RIPEMD160S8E 15u +#define RIPEMD160S8F 8u + +#define RIPEMD160S90 8u +#define RIPEMD160S91 5u +#define RIPEMD160S92 12u +#define RIPEMD160S93 9u +#define RIPEMD160S94 12u +#define RIPEMD160S95 5u +#define RIPEMD160S96 14u +#define RIPEMD160S97 6u +#define RIPEMD160S98 8u +#define RIPEMD160S99 13u +#define RIPEMD160S9A 6u +#define RIPEMD160S9B 5u +#define RIPEMD160S9C 15u +#define RIPEMD160S9D 13u +#define RIPEMD160S9E 11u +#define RIPEMD160S9F 11u + +#endif + +#ifdef _KECCAK_ +/** + * KECCAK Constants + */ + +#define KECCAK_RNDC_00 0x0000000000000001 +#define KECCAK_RNDC_01 0x0000000000008082 +#define KECCAK_RNDC_02 0x000000000000808a +#define KECCAK_RNDC_03 0x0000000080008000 +#define KECCAK_RNDC_04 0x000000000000808b +#define KECCAK_RNDC_05 0x0000000080000001 +#define KECCAK_RNDC_06 0x0000000080008081 +#define KECCAK_RNDC_07 0x0000000000008009 +#define KECCAK_RNDC_08 0x000000000000008a +#define KECCAK_RNDC_09 0x0000000000000088 +#define KECCAK_RNDC_10 0x0000000080008009 +#define KECCAK_RNDC_11 0x000000008000000a +#define KECCAK_RNDC_12 0x000000008000808b +#define KECCAK_RNDC_13 0x000000000000008b +#define KECCAK_RNDC_14 0x0000000000008089 +#define KECCAK_RNDC_15 0x0000000000008003 +#define KECCAK_RNDC_16 0x0000000000008002 +#define KECCAK_RNDC_17 0x0000000000000080 +#define KECCAK_RNDC_18 0x000000000000800a +#define KECCAK_RNDC_19 0x000000008000000a +#define KECCAK_RNDC_20 0x0000000080008081 +#define KECCAK_RNDC_21 0x0000000000008080 +#define KECCAK_RNDC_22 0x0000000080000001 +#define KECCAK_RNDC_23 0x0000000080008008 + +#define KECCAK_PILN_00 10 +#define KECCAK_PILN_01 7 +#define KECCAK_PILN_02 11 +#define KECCAK_PILN_03 17 +#define KECCAK_PILN_04 18 +#define KECCAK_PILN_05 3 +#define KECCAK_PILN_06 5 +#define KECCAK_PILN_07 16 +#define KECCAK_PILN_08 8 +#define KECCAK_PILN_09 21 +#define KECCAK_PILN_10 24 +#define KECCAK_PILN_11 4 +#define KECCAK_PILN_12 15 +#define KECCAK_PILN_13 23 +#define KECCAK_PILN_14 19 +#define KECCAK_PILN_15 13 +#define KECCAK_PILN_16 12 +#define KECCAK_PILN_17 2 +#define KECCAK_PILN_18 20 +#define KECCAK_PILN_19 14 +#define KECCAK_PILN_20 22 +#define KECCAK_PILN_21 9 +#define KECCAK_PILN_22 6 +#define KECCAK_PILN_23 1 + +#define KECCAK_ROTC_00 1 +#define KECCAK_ROTC_01 3 +#define KECCAK_ROTC_02 6 +#define KECCAK_ROTC_03 10 +#define KECCAK_ROTC_04 15 +#define KECCAK_ROTC_05 21 +#define KECCAK_ROTC_06 28 +#define KECCAK_ROTC_07 36 +#define KECCAK_ROTC_08 45 +#define KECCAK_ROTC_09 55 +#define KECCAK_ROTC_10 2 +#define KECCAK_ROTC_11 14 +#define KECCAK_ROTC_12 27 +#define KECCAK_ROTC_13 41 +#define KECCAK_ROTC_14 56 +#define KECCAK_ROTC_15 8 +#define KECCAK_ROTC_16 25 +#define KECCAK_ROTC_17 43 +#define KECCAK_ROTC_18 62 +#define KECCAK_ROTC_19 18 +#define KECCAK_ROTC_20 39 +#define KECCAK_ROTC_21 61 +#define KECCAK_ROTC_22 20 +#define KECCAK_ROTC_23 44 + + +#endif + +#ifdef _MYSQL323_ +/** + * MYSQL323 Constants + */ + +#define MYSQL323_A 0x50305735 +#define MYSQL323_B 0x12345671 + +#endif diff --git a/include/cpu-aes.c b/include/cpu-aes.c new file mode 100644 index 0000000000..34879f0713 --- /dev/null +++ b/include/cpu-aes.c @@ -0,0 +1,1309 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +static const uint te0[256] = +{ + 0xc66363a5, 0xf87c7c84, 0xee777799, 0xf67b7b8d, + 0xfff2f20d, 0xd66b6bbd, 0xde6f6fb1, 0x91c5c554, + 0x60303050, 0x02010103, 0xce6767a9, 0x562b2b7d, + 0xe7fefe19, 0xb5d7d762, 0x4dababe6, 0xec76769a, + 0x8fcaca45, 0x1f82829d, 0x89c9c940, 0xfa7d7d87, + 0xeffafa15, 0xb25959eb, 0x8e4747c9, 0xfbf0f00b, + 0x41adadec, 0xb3d4d467, 0x5fa2a2fd, 0x45afafea, + 0x239c9cbf, 0x53a4a4f7, 0xe4727296, 0x9bc0c05b, + 0x75b7b7c2, 0xe1fdfd1c, 0x3d9393ae, 0x4c26266a, + 0x6c36365a, 0x7e3f3f41, 0xf5f7f702, 0x83cccc4f, + 0x6834345c, 0x51a5a5f4, 0xd1e5e534, 0xf9f1f108, + 0xe2717193, 0xabd8d873, 0x62313153, 0x2a15153f, + 0x0804040c, 0x95c7c752, 0x46232365, 0x9dc3c35e, + 0x30181828, 0x379696a1, 0x0a05050f, 0x2f9a9ab5, + 0x0e070709, 0x24121236, 0x1b80809b, 0xdfe2e23d, + 0xcdebeb26, 0x4e272769, 0x7fb2b2cd, 0xea75759f, + 0x1209091b, 0x1d83839e, 0x582c2c74, 0x341a1a2e, + 0x361b1b2d, 0xdc6e6eb2, 0xb45a5aee, 0x5ba0a0fb, + 0xa45252f6, 0x763b3b4d, 0xb7d6d661, 0x7db3b3ce, + 0x5229297b, 0xdde3e33e, 0x5e2f2f71, 0x13848497, + 0xa65353f5, 0xb9d1d168, 0x00000000, 0xc1eded2c, + 0x40202060, 0xe3fcfc1f, 0x79b1b1c8, 0xb65b5bed, + 0xd46a6abe, 0x8dcbcb46, 0x67bebed9, 0x7239394b, + 0x944a4ade, 0x984c4cd4, 0xb05858e8, 0x85cfcf4a, + 0xbbd0d06b, 0xc5efef2a, 0x4faaaae5, 0xedfbfb16, + 0x864343c5, 0x9a4d4dd7, 0x66333355, 0x11858594, + 0x8a4545cf, 0xe9f9f910, 0x04020206, 0xfe7f7f81, + 0xa05050f0, 0x783c3c44, 0x259f9fba, 0x4ba8a8e3, + 0xa25151f3, 0x5da3a3fe, 0x804040c0, 0x058f8f8a, + 0x3f9292ad, 0x219d9dbc, 0x70383848, 0xf1f5f504, + 0x63bcbcdf, 0x77b6b6c1, 0xafdada75, 0x42212163, + 0x20101030, 0xe5ffff1a, 0xfdf3f30e, 0xbfd2d26d, + 0x81cdcd4c, 0x180c0c14, 0x26131335, 0xc3ecec2f, + 0xbe5f5fe1, 0x359797a2, 0x884444cc, 0x2e171739, + 0x93c4c457, 0x55a7a7f2, 0xfc7e7e82, 0x7a3d3d47, + 0xc86464ac, 0xba5d5de7, 0x3219192b, 0xe6737395, + 0xc06060a0, 0x19818198, 0x9e4f4fd1, 0xa3dcdc7f, + 0x44222266, 0x542a2a7e, 0x3b9090ab, 0x0b888883, + 0x8c4646ca, 0xc7eeee29, 0x6bb8b8d3, 0x2814143c, + 0xa7dede79, 0xbc5e5ee2, 0x160b0b1d, 0xaddbdb76, + 0xdbe0e03b, 0x64323256, 0x743a3a4e, 0x140a0a1e, + 0x924949db, 0x0c06060a, 0x4824246c, 0xb85c5ce4, + 0x9fc2c25d, 0xbdd3d36e, 0x43acacef, 0xc46262a6, + 0x399191a8, 0x319595a4, 0xd3e4e437, 0xf279798b, + 0xd5e7e732, 0x8bc8c843, 0x6e373759, 0xda6d6db7, + 0x018d8d8c, 0xb1d5d564, 0x9c4e4ed2, 0x49a9a9e0, + 0xd86c6cb4, 0xac5656fa, 0xf3f4f407, 0xcfeaea25, + 0xca6565af, 0xf47a7a8e, 0x47aeaee9, 0x10080818, + 0x6fbabad5, 0xf0787888, 0x4a25256f, 0x5c2e2e72, + 0x381c1c24, 0x57a6a6f1, 0x73b4b4c7, 0x97c6c651, + 0xcbe8e823, 0xa1dddd7c, 0xe874749c, 0x3e1f1f21, + 0x964b4bdd, 0x61bdbddc, 0x0d8b8b86, 0x0f8a8a85, + 0xe0707090, 0x7c3e3e42, 0x71b5b5c4, 0xcc6666aa, + 0x904848d8, 0x06030305, 0xf7f6f601, 0x1c0e0e12, + 0xc26161a3, 0x6a35355f, 0xae5757f9, 0x69b9b9d0, + 0x17868691, 0x99c1c158, 0x3a1d1d27, 0x279e9eb9, + 0xd9e1e138, 0xebf8f813, 0x2b9898b3, 0x22111133, + 0xd26969bb, 0xa9d9d970, 0x078e8e89, 0x339494a7, + 0x2d9b9bb6, 0x3c1e1e22, 0x15878792, 0xc9e9e920, + 0x87cece49, 0xaa5555ff, 0x50282878, 0xa5dfdf7a, + 0x038c8c8f, 0x59a1a1f8, 0x09898980, 0x1a0d0d17, + 0x65bfbfda, 0xd7e6e631, 0x844242c6, 0xd06868b8, + 0x824141c3, 0x299999b0, 0x5a2d2d77, 0x1e0f0f11, + 0x7bb0b0cb, 0xa85454fc, 0x6dbbbbd6, 0x2c16163a, +}; + +static const uint te1[256] = +{ + 0xa5c66363, 0x84f87c7c, 0x99ee7777, 0x8df67b7b, + 0x0dfff2f2, 0xbdd66b6b, 0xb1de6f6f, 0x5491c5c5, + 0x50603030, 0x03020101, 0xa9ce6767, 0x7d562b2b, + 0x19e7fefe, 0x62b5d7d7, 0xe64dabab, 0x9aec7676, + 0x458fcaca, 0x9d1f8282, 0x4089c9c9, 0x87fa7d7d, + 0x15effafa, 0xebb25959, 0xc98e4747, 0x0bfbf0f0, + 0xec41adad, 0x67b3d4d4, 0xfd5fa2a2, 0xea45afaf, + 0xbf239c9c, 0xf753a4a4, 0x96e47272, 0x5b9bc0c0, + 0xc275b7b7, 0x1ce1fdfd, 0xae3d9393, 0x6a4c2626, + 0x5a6c3636, 0x417e3f3f, 0x02f5f7f7, 0x4f83cccc, + 0x5c683434, 0xf451a5a5, 0x34d1e5e5, 0x08f9f1f1, + 0x93e27171, 0x73abd8d8, 0x53623131, 0x3f2a1515, + 0x0c080404, 0x5295c7c7, 0x65462323, 0x5e9dc3c3, + 0x28301818, 0xa1379696, 0x0f0a0505, 0xb52f9a9a, + 0x090e0707, 0x36241212, 0x9b1b8080, 0x3ddfe2e2, + 0x26cdebeb, 0x694e2727, 0xcd7fb2b2, 0x9fea7575, + 0x1b120909, 0x9e1d8383, 0x74582c2c, 0x2e341a1a, + 0x2d361b1b, 0xb2dc6e6e, 0xeeb45a5a, 0xfb5ba0a0, + 0xf6a45252, 0x4d763b3b, 0x61b7d6d6, 0xce7db3b3, + 0x7b522929, 0x3edde3e3, 0x715e2f2f, 0x97138484, + 0xf5a65353, 0x68b9d1d1, 0x00000000, 0x2cc1eded, + 0x60402020, 0x1fe3fcfc, 0xc879b1b1, 0xedb65b5b, + 0xbed46a6a, 0x468dcbcb, 0xd967bebe, 0x4b723939, + 0xde944a4a, 0xd4984c4c, 0xe8b05858, 0x4a85cfcf, + 0x6bbbd0d0, 0x2ac5efef, 0xe54faaaa, 0x16edfbfb, + 0xc5864343, 0xd79a4d4d, 0x55663333, 0x94118585, + 0xcf8a4545, 0x10e9f9f9, 0x06040202, 0x81fe7f7f, + 0xf0a05050, 0x44783c3c, 0xba259f9f, 0xe34ba8a8, + 0xf3a25151, 0xfe5da3a3, 0xc0804040, 0x8a058f8f, + 0xad3f9292, 0xbc219d9d, 0x48703838, 0x04f1f5f5, + 0xdf63bcbc, 0xc177b6b6, 0x75afdada, 0x63422121, + 0x30201010, 0x1ae5ffff, 0x0efdf3f3, 0x6dbfd2d2, + 0x4c81cdcd, 0x14180c0c, 0x35261313, 0x2fc3ecec, + 0xe1be5f5f, 0xa2359797, 0xcc884444, 0x392e1717, + 0x5793c4c4, 0xf255a7a7, 0x82fc7e7e, 0x477a3d3d, + 0xacc86464, 0xe7ba5d5d, 0x2b321919, 0x95e67373, + 0xa0c06060, 0x98198181, 0xd19e4f4f, 0x7fa3dcdc, + 0x66442222, 0x7e542a2a, 0xab3b9090, 0x830b8888, + 0xca8c4646, 0x29c7eeee, 0xd36bb8b8, 0x3c281414, + 0x79a7dede, 0xe2bc5e5e, 0x1d160b0b, 0x76addbdb, + 0x3bdbe0e0, 0x56643232, 0x4e743a3a, 0x1e140a0a, + 0xdb924949, 0x0a0c0606, 0x6c482424, 0xe4b85c5c, + 0x5d9fc2c2, 0x6ebdd3d3, 0xef43acac, 0xa6c46262, + 0xa8399191, 0xa4319595, 0x37d3e4e4, 0x8bf27979, + 0x32d5e7e7, 0x438bc8c8, 0x596e3737, 0xb7da6d6d, + 0x8c018d8d, 0x64b1d5d5, 0xd29c4e4e, 0xe049a9a9, + 0xb4d86c6c, 0xfaac5656, 0x07f3f4f4, 0x25cfeaea, + 0xafca6565, 0x8ef47a7a, 0xe947aeae, 0x18100808, + 0xd56fbaba, 0x88f07878, 0x6f4a2525, 0x725c2e2e, + 0x24381c1c, 0xf157a6a6, 0xc773b4b4, 0x5197c6c6, + 0x23cbe8e8, 0x7ca1dddd, 0x9ce87474, 0x213e1f1f, + 0xdd964b4b, 0xdc61bdbd, 0x860d8b8b, 0x850f8a8a, + 0x90e07070, 0x427c3e3e, 0xc471b5b5, 0xaacc6666, + 0xd8904848, 0x05060303, 0x01f7f6f6, 0x121c0e0e, + 0xa3c26161, 0x5f6a3535, 0xf9ae5757, 0xd069b9b9, + 0x91178686, 0x5899c1c1, 0x273a1d1d, 0xb9279e9e, + 0x38d9e1e1, 0x13ebf8f8, 0xb32b9898, 0x33221111, + 0xbbd26969, 0x70a9d9d9, 0x89078e8e, 0xa7339494, + 0xb62d9b9b, 0x223c1e1e, 0x92158787, 0x20c9e9e9, + 0x4987cece, 0xffaa5555, 0x78502828, 0x7aa5dfdf, + 0x8f038c8c, 0xf859a1a1, 0x80098989, 0x171a0d0d, + 0xda65bfbf, 0x31d7e6e6, 0xc6844242, 0xb8d06868, + 0xc3824141, 0xb0299999, 0x775a2d2d, 0x111e0f0f, + 0xcb7bb0b0, 0xfca85454, 0xd66dbbbb, 0x3a2c1616, +}; + +static const uint te2[256] = +{ + 0x63a5c663, 0x7c84f87c, 0x7799ee77, 0x7b8df67b, + 0xf20dfff2, 0x6bbdd66b, 0x6fb1de6f, 0xc55491c5, + 0x30506030, 0x01030201, 0x67a9ce67, 0x2b7d562b, + 0xfe19e7fe, 0xd762b5d7, 0xabe64dab, 0x769aec76, + 0xca458fca, 0x829d1f82, 0xc94089c9, 0x7d87fa7d, + 0xfa15effa, 0x59ebb259, 0x47c98e47, 0xf00bfbf0, + 0xadec41ad, 0xd467b3d4, 0xa2fd5fa2, 0xafea45af, + 0x9cbf239c, 0xa4f753a4, 0x7296e472, 0xc05b9bc0, + 0xb7c275b7, 0xfd1ce1fd, 0x93ae3d93, 0x266a4c26, + 0x365a6c36, 0x3f417e3f, 0xf702f5f7, 0xcc4f83cc, + 0x345c6834, 0xa5f451a5, 0xe534d1e5, 0xf108f9f1, + 0x7193e271, 0xd873abd8, 0x31536231, 0x153f2a15, + 0x040c0804, 0xc75295c7, 0x23654623, 0xc35e9dc3, + 0x18283018, 0x96a13796, 0x050f0a05, 0x9ab52f9a, + 0x07090e07, 0x12362412, 0x809b1b80, 0xe23ddfe2, + 0xeb26cdeb, 0x27694e27, 0xb2cd7fb2, 0x759fea75, + 0x091b1209, 0x839e1d83, 0x2c74582c, 0x1a2e341a, + 0x1b2d361b, 0x6eb2dc6e, 0x5aeeb45a, 0xa0fb5ba0, + 0x52f6a452, 0x3b4d763b, 0xd661b7d6, 0xb3ce7db3, + 0x297b5229, 0xe33edde3, 0x2f715e2f, 0x84971384, + 0x53f5a653, 0xd168b9d1, 0x00000000, 0xed2cc1ed, + 0x20604020, 0xfc1fe3fc, 0xb1c879b1, 0x5bedb65b, + 0x6abed46a, 0xcb468dcb, 0xbed967be, 0x394b7239, + 0x4ade944a, 0x4cd4984c, 0x58e8b058, 0xcf4a85cf, + 0xd06bbbd0, 0xef2ac5ef, 0xaae54faa, 0xfb16edfb, + 0x43c58643, 0x4dd79a4d, 0x33556633, 0x85941185, + 0x45cf8a45, 0xf910e9f9, 0x02060402, 0x7f81fe7f, + 0x50f0a050, 0x3c44783c, 0x9fba259f, 0xa8e34ba8, + 0x51f3a251, 0xa3fe5da3, 0x40c08040, 0x8f8a058f, + 0x92ad3f92, 0x9dbc219d, 0x38487038, 0xf504f1f5, + 0xbcdf63bc, 0xb6c177b6, 0xda75afda, 0x21634221, + 0x10302010, 0xff1ae5ff, 0xf30efdf3, 0xd26dbfd2, + 0xcd4c81cd, 0x0c14180c, 0x13352613, 0xec2fc3ec, + 0x5fe1be5f, 0x97a23597, 0x44cc8844, 0x17392e17, + 0xc45793c4, 0xa7f255a7, 0x7e82fc7e, 0x3d477a3d, + 0x64acc864, 0x5de7ba5d, 0x192b3219, 0x7395e673, + 0x60a0c060, 0x81981981, 0x4fd19e4f, 0xdc7fa3dc, + 0x22664422, 0x2a7e542a, 0x90ab3b90, 0x88830b88, + 0x46ca8c46, 0xee29c7ee, 0xb8d36bb8, 0x143c2814, + 0xde79a7de, 0x5ee2bc5e, 0x0b1d160b, 0xdb76addb, + 0xe03bdbe0, 0x32566432, 0x3a4e743a, 0x0a1e140a, + 0x49db9249, 0x060a0c06, 0x246c4824, 0x5ce4b85c, + 0xc25d9fc2, 0xd36ebdd3, 0xacef43ac, 0x62a6c462, + 0x91a83991, 0x95a43195, 0xe437d3e4, 0x798bf279, + 0xe732d5e7, 0xc8438bc8, 0x37596e37, 0x6db7da6d, + 0x8d8c018d, 0xd564b1d5, 0x4ed29c4e, 0xa9e049a9, + 0x6cb4d86c, 0x56faac56, 0xf407f3f4, 0xea25cfea, + 0x65afca65, 0x7a8ef47a, 0xaee947ae, 0x08181008, + 0xbad56fba, 0x7888f078, 0x256f4a25, 0x2e725c2e, + 0x1c24381c, 0xa6f157a6, 0xb4c773b4, 0xc65197c6, + 0xe823cbe8, 0xdd7ca1dd, 0x749ce874, 0x1f213e1f, + 0x4bdd964b, 0xbddc61bd, 0x8b860d8b, 0x8a850f8a, + 0x7090e070, 0x3e427c3e, 0xb5c471b5, 0x66aacc66, + 0x48d89048, 0x03050603, 0xf601f7f6, 0x0e121c0e, + 0x61a3c261, 0x355f6a35, 0x57f9ae57, 0xb9d069b9, + 0x86911786, 0xc15899c1, 0x1d273a1d, 0x9eb9279e, + 0xe138d9e1, 0xf813ebf8, 0x98b32b98, 0x11332211, + 0x69bbd269, 0xd970a9d9, 0x8e89078e, 0x94a73394, + 0x9bb62d9b, 0x1e223c1e, 0x87921587, 0xe920c9e9, + 0xce4987ce, 0x55ffaa55, 0x28785028, 0xdf7aa5df, + 0x8c8f038c, 0xa1f859a1, 0x89800989, 0x0d171a0d, + 0xbfda65bf, 0xe631d7e6, 0x42c68442, 0x68b8d068, + 0x41c38241, 0x99b02999, 0x2d775a2d, 0x0f111e0f, + 0xb0cb7bb0, 0x54fca854, 0xbbd66dbb, 0x163a2c16, +}; + +static const uint te3[256] = +{ + 0x6363a5c6, 0x7c7c84f8, 0x777799ee, 0x7b7b8df6, + 0xf2f20dff, 0x6b6bbdd6, 0x6f6fb1de, 0xc5c55491, + 0x30305060, 0x01010302, 0x6767a9ce, 0x2b2b7d56, + 0xfefe19e7, 0xd7d762b5, 0xababe64d, 0x76769aec, + 0xcaca458f, 0x82829d1f, 0xc9c94089, 0x7d7d87fa, + 0xfafa15ef, 0x5959ebb2, 0x4747c98e, 0xf0f00bfb, + 0xadadec41, 0xd4d467b3, 0xa2a2fd5f, 0xafafea45, + 0x9c9cbf23, 0xa4a4f753, 0x727296e4, 0xc0c05b9b, + 0xb7b7c275, 0xfdfd1ce1, 0x9393ae3d, 0x26266a4c, + 0x36365a6c, 0x3f3f417e, 0xf7f702f5, 0xcccc4f83, + 0x34345c68, 0xa5a5f451, 0xe5e534d1, 0xf1f108f9, + 0x717193e2, 0xd8d873ab, 0x31315362, 0x15153f2a, + 0x04040c08, 0xc7c75295, 0x23236546, 0xc3c35e9d, + 0x18182830, 0x9696a137, 0x05050f0a, 0x9a9ab52f, + 0x0707090e, 0x12123624, 0x80809b1b, 0xe2e23ddf, + 0xebeb26cd, 0x2727694e, 0xb2b2cd7f, 0x75759fea, + 0x09091b12, 0x83839e1d, 0x2c2c7458, 0x1a1a2e34, + 0x1b1b2d36, 0x6e6eb2dc, 0x5a5aeeb4, 0xa0a0fb5b, + 0x5252f6a4, 0x3b3b4d76, 0xd6d661b7, 0xb3b3ce7d, + 0x29297b52, 0xe3e33edd, 0x2f2f715e, 0x84849713, + 0x5353f5a6, 0xd1d168b9, 0x00000000, 0xeded2cc1, + 0x20206040, 0xfcfc1fe3, 0xb1b1c879, 0x5b5bedb6, + 0x6a6abed4, 0xcbcb468d, 0xbebed967, 0x39394b72, + 0x4a4ade94, 0x4c4cd498, 0x5858e8b0, 0xcfcf4a85, + 0xd0d06bbb, 0xefef2ac5, 0xaaaae54f, 0xfbfb16ed, + 0x4343c586, 0x4d4dd79a, 0x33335566, 0x85859411, + 0x4545cf8a, 0xf9f910e9, 0x02020604, 0x7f7f81fe, + 0x5050f0a0, 0x3c3c4478, 0x9f9fba25, 0xa8a8e34b, + 0x5151f3a2, 0xa3a3fe5d, 0x4040c080, 0x8f8f8a05, + 0x9292ad3f, 0x9d9dbc21, 0x38384870, 0xf5f504f1, + 0xbcbcdf63, 0xb6b6c177, 0xdada75af, 0x21216342, + 0x10103020, 0xffff1ae5, 0xf3f30efd, 0xd2d26dbf, + 0xcdcd4c81, 0x0c0c1418, 0x13133526, 0xecec2fc3, + 0x5f5fe1be, 0x9797a235, 0x4444cc88, 0x1717392e, + 0xc4c45793, 0xa7a7f255, 0x7e7e82fc, 0x3d3d477a, + 0x6464acc8, 0x5d5de7ba, 0x19192b32, 0x737395e6, + 0x6060a0c0, 0x81819819, 0x4f4fd19e, 0xdcdc7fa3, + 0x22226644, 0x2a2a7e54, 0x9090ab3b, 0x8888830b, + 0x4646ca8c, 0xeeee29c7, 0xb8b8d36b, 0x14143c28, + 0xdede79a7, 0x5e5ee2bc, 0x0b0b1d16, 0xdbdb76ad, + 0xe0e03bdb, 0x32325664, 0x3a3a4e74, 0x0a0a1e14, + 0x4949db92, 0x06060a0c, 0x24246c48, 0x5c5ce4b8, + 0xc2c25d9f, 0xd3d36ebd, 0xacacef43, 0x6262a6c4, + 0x9191a839, 0x9595a431, 0xe4e437d3, 0x79798bf2, + 0xe7e732d5, 0xc8c8438b, 0x3737596e, 0x6d6db7da, + 0x8d8d8c01, 0xd5d564b1, 0x4e4ed29c, 0xa9a9e049, + 0x6c6cb4d8, 0x5656faac, 0xf4f407f3, 0xeaea25cf, + 0x6565afca, 0x7a7a8ef4, 0xaeaee947, 0x08081810, + 0xbabad56f, 0x787888f0, 0x25256f4a, 0x2e2e725c, + 0x1c1c2438, 0xa6a6f157, 0xb4b4c773, 0xc6c65197, + 0xe8e823cb, 0xdddd7ca1, 0x74749ce8, 0x1f1f213e, + 0x4b4bdd96, 0xbdbddc61, 0x8b8b860d, 0x8a8a850f, + 0x707090e0, 0x3e3e427c, 0xb5b5c471, 0x6666aacc, + 0x4848d890, 0x03030506, 0xf6f601f7, 0x0e0e121c, + 0x6161a3c2, 0x35355f6a, 0x5757f9ae, 0xb9b9d069, + 0x86869117, 0xc1c15899, 0x1d1d273a, 0x9e9eb927, + 0xe1e138d9, 0xf8f813eb, 0x9898b32b, 0x11113322, + 0x6969bbd2, 0xd9d970a9, 0x8e8e8907, 0x9494a733, + 0x9b9bb62d, 0x1e1e223c, 0x87879215, 0xe9e920c9, + 0xcece4987, 0x5555ffaa, 0x28287850, 0xdfdf7aa5, + 0x8c8c8f03, 0xa1a1f859, 0x89898009, 0x0d0d171a, + 0xbfbfda65, 0xe6e631d7, 0x4242c684, 0x6868b8d0, + 0x4141c382, 0x9999b029, 0x2d2d775a, 0x0f0f111e, + 0xb0b0cb7b, 0x5454fca8, 0xbbbbd66d, 0x16163a2c, +}; + +static const uint te4[256] = +{ + 0x63636363, 0x7c7c7c7c, 0x77777777, 0x7b7b7b7b, + 0xf2f2f2f2, 0x6b6b6b6b, 0x6f6f6f6f, 0xc5c5c5c5, + 0x30303030, 0x01010101, 0x67676767, 0x2b2b2b2b, + 0xfefefefe, 0xd7d7d7d7, 0xabababab, 0x76767676, + 0xcacacaca, 0x82828282, 0xc9c9c9c9, 0x7d7d7d7d, + 0xfafafafa, 0x59595959, 0x47474747, 0xf0f0f0f0, + 0xadadadad, 0xd4d4d4d4, 0xa2a2a2a2, 0xafafafaf, + 0x9c9c9c9c, 0xa4a4a4a4, 0x72727272, 0xc0c0c0c0, + 0xb7b7b7b7, 0xfdfdfdfd, 0x93939393, 0x26262626, + 0x36363636, 0x3f3f3f3f, 0xf7f7f7f7, 0xcccccccc, + 0x34343434, 0xa5a5a5a5, 0xe5e5e5e5, 0xf1f1f1f1, + 0x71717171, 0xd8d8d8d8, 0x31313131, 0x15151515, + 0x04040404, 0xc7c7c7c7, 0x23232323, 0xc3c3c3c3, + 0x18181818, 0x96969696, 0x05050505, 0x9a9a9a9a, + 0x07070707, 0x12121212, 0x80808080, 0xe2e2e2e2, + 0xebebebeb, 0x27272727, 0xb2b2b2b2, 0x75757575, + 0x09090909, 0x83838383, 0x2c2c2c2c, 0x1a1a1a1a, + 0x1b1b1b1b, 0x6e6e6e6e, 0x5a5a5a5a, 0xa0a0a0a0, + 0x52525252, 0x3b3b3b3b, 0xd6d6d6d6, 0xb3b3b3b3, + 0x29292929, 0xe3e3e3e3, 0x2f2f2f2f, 0x84848484, + 0x53535353, 0xd1d1d1d1, 0x00000000, 0xedededed, + 0x20202020, 0xfcfcfcfc, 0xb1b1b1b1, 0x5b5b5b5b, + 0x6a6a6a6a, 0xcbcbcbcb, 0xbebebebe, 0x39393939, + 0x4a4a4a4a, 0x4c4c4c4c, 0x58585858, 0xcfcfcfcf, + 0xd0d0d0d0, 0xefefefef, 0xaaaaaaaa, 0xfbfbfbfb, + 0x43434343, 0x4d4d4d4d, 0x33333333, 0x85858585, + 0x45454545, 0xf9f9f9f9, 0x02020202, 0x7f7f7f7f, + 0x50505050, 0x3c3c3c3c, 0x9f9f9f9f, 0xa8a8a8a8, + 0x51515151, 0xa3a3a3a3, 0x40404040, 0x8f8f8f8f, + 0x92929292, 0x9d9d9d9d, 0x38383838, 0xf5f5f5f5, + 0xbcbcbcbc, 0xb6b6b6b6, 0xdadadada, 0x21212121, + 0x10101010, 0xffffffff, 0xf3f3f3f3, 0xd2d2d2d2, + 0xcdcdcdcd, 0x0c0c0c0c, 0x13131313, 0xecececec, + 0x5f5f5f5f, 0x97979797, 0x44444444, 0x17171717, + 0xc4c4c4c4, 0xa7a7a7a7, 0x7e7e7e7e, 0x3d3d3d3d, + 0x64646464, 0x5d5d5d5d, 0x19191919, 0x73737373, + 0x60606060, 0x81818181, 0x4f4f4f4f, 0xdcdcdcdc, + 0x22222222, 0x2a2a2a2a, 0x90909090, 0x88888888, + 0x46464646, 0xeeeeeeee, 0xb8b8b8b8, 0x14141414, + 0xdededede, 0x5e5e5e5e, 0x0b0b0b0b, 0xdbdbdbdb, + 0xe0e0e0e0, 0x32323232, 0x3a3a3a3a, 0x0a0a0a0a, + 0x49494949, 0x06060606, 0x24242424, 0x5c5c5c5c, + 0xc2c2c2c2, 0xd3d3d3d3, 0xacacacac, 0x62626262, + 0x91919191, 0x95959595, 0xe4e4e4e4, 0x79797979, + 0xe7e7e7e7, 0xc8c8c8c8, 0x37373737, 0x6d6d6d6d, + 0x8d8d8d8d, 0xd5d5d5d5, 0x4e4e4e4e, 0xa9a9a9a9, + 0x6c6c6c6c, 0x56565656, 0xf4f4f4f4, 0xeaeaeaea, + 0x65656565, 0x7a7a7a7a, 0xaeaeaeae, 0x08080808, + 0xbabababa, 0x78787878, 0x25252525, 0x2e2e2e2e, + 0x1c1c1c1c, 0xa6a6a6a6, 0xb4b4b4b4, 0xc6c6c6c6, + 0xe8e8e8e8, 0xdddddddd, 0x74747474, 0x1f1f1f1f, + 0x4b4b4b4b, 0xbdbdbdbd, 0x8b8b8b8b, 0x8a8a8a8a, + 0x70707070, 0x3e3e3e3e, 0xb5b5b5b5, 0x66666666, + 0x48484848, 0x03030303, 0xf6f6f6f6, 0x0e0e0e0e, + 0x61616161, 0x35353535, 0x57575757, 0xb9b9b9b9, + 0x86868686, 0xc1c1c1c1, 0x1d1d1d1d, 0x9e9e9e9e, + 0xe1e1e1e1, 0xf8f8f8f8, 0x98989898, 0x11111111, + 0x69696969, 0xd9d9d9d9, 0x8e8e8e8e, 0x94949494, + 0x9b9b9b9b, 0x1e1e1e1e, 0x87878787, 0xe9e9e9e9, + 0xcececece, 0x55555555, 0x28282828, 0xdfdfdfdf, + 0x8c8c8c8c, 0xa1a1a1a1, 0x89898989, 0x0d0d0d0d, + 0xbfbfbfbf, 0xe6e6e6e6, 0x42424242, 0x68686868, + 0x41414141, 0x99999999, 0x2d2d2d2d, 0x0f0f0f0f, + 0xb0b0b0b0, 0x54545454, 0xbbbbbbbb, 0x16161616, +}; + +static const uint td0[256] = +{ + 0x51f4a750, 0x7e416553, 0x1a17a4c3, 0x3a275e96, + 0x3bab6bcb, 0x1f9d45f1, 0xacfa58ab, 0x4be30393, + 0x2030fa55, 0xad766df6, 0x88cc7691, 0xf5024c25, + 0x4fe5d7fc, 0xc52acbd7, 0x26354480, 0xb562a38f, + 0xdeb15a49, 0x25ba1b67, 0x45ea0e98, 0x5dfec0e1, + 0xc32f7502, 0x814cf012, 0x8d4697a3, 0x6bd3f9c6, + 0x038f5fe7, 0x15929c95, 0xbf6d7aeb, 0x955259da, + 0xd4be832d, 0x587421d3, 0x49e06929, 0x8ec9c844, + 0x75c2896a, 0xf48e7978, 0x99583e6b, 0x27b971dd, + 0xbee14fb6, 0xf088ad17, 0xc920ac66, 0x7dce3ab4, + 0x63df4a18, 0xe51a3182, 0x97513360, 0x62537f45, + 0xb16477e0, 0xbb6bae84, 0xfe81a01c, 0xf9082b94, + 0x70486858, 0x8f45fd19, 0x94de6c87, 0x527bf8b7, + 0xab73d323, 0x724b02e2, 0xe31f8f57, 0x6655ab2a, + 0xb2eb2807, 0x2fb5c203, 0x86c57b9a, 0xd33708a5, + 0x302887f2, 0x23bfa5b2, 0x02036aba, 0xed16825c, + 0x8acf1c2b, 0xa779b492, 0xf307f2f0, 0x4e69e2a1, + 0x65daf4cd, 0x0605bed5, 0xd134621f, 0xc4a6fe8a, + 0x342e539d, 0xa2f355a0, 0x058ae132, 0xa4f6eb75, + 0x0b83ec39, 0x4060efaa, 0x5e719f06, 0xbd6e1051, + 0x3e218af9, 0x96dd063d, 0xdd3e05ae, 0x4de6bd46, + 0x91548db5, 0x71c45d05, 0x0406d46f, 0x605015ff, + 0x1998fb24, 0xd6bde997, 0x894043cc, 0x67d99e77, + 0xb0e842bd, 0x07898b88, 0xe7195b38, 0x79c8eedb, + 0xa17c0a47, 0x7c420fe9, 0xf8841ec9, 0x00000000, + 0x09808683, 0x322bed48, 0x1e1170ac, 0x6c5a724e, + 0xfd0efffb, 0x0f853856, 0x3daed51e, 0x362d3927, + 0x0a0fd964, 0x685ca621, 0x9b5b54d1, 0x24362e3a, + 0x0c0a67b1, 0x9357e70f, 0xb4ee96d2, 0x1b9b919e, + 0x80c0c54f, 0x61dc20a2, 0x5a774b69, 0x1c121a16, + 0xe293ba0a, 0xc0a02ae5, 0x3c22e043, 0x121b171d, + 0x0e090d0b, 0xf28bc7ad, 0x2db6a8b9, 0x141ea9c8, + 0x57f11985, 0xaf75074c, 0xee99ddbb, 0xa37f60fd, + 0xf701269f, 0x5c72f5bc, 0x44663bc5, 0x5bfb7e34, + 0x8b432976, 0xcb23c6dc, 0xb6edfc68, 0xb8e4f163, + 0xd731dcca, 0x42638510, 0x13972240, 0x84c61120, + 0x854a247d, 0xd2bb3df8, 0xaef93211, 0xc729a16d, + 0x1d9e2f4b, 0xdcb230f3, 0x0d8652ec, 0x77c1e3d0, + 0x2bb3166c, 0xa970b999, 0x119448fa, 0x47e96422, + 0xa8fc8cc4, 0xa0f03f1a, 0x567d2cd8, 0x223390ef, + 0x87494ec7, 0xd938d1c1, 0x8ccaa2fe, 0x98d40b36, + 0xa6f581cf, 0xa57ade28, 0xdab78e26, 0x3fadbfa4, + 0x2c3a9de4, 0x5078920d, 0x6a5fcc9b, 0x547e4662, + 0xf68d13c2, 0x90d8b8e8, 0x2e39f75e, 0x82c3aff5, + 0x9f5d80be, 0x69d0937c, 0x6fd52da9, 0xcf2512b3, + 0xc8ac993b, 0x10187da7, 0xe89c636e, 0xdb3bbb7b, + 0xcd267809, 0x6e5918f4, 0xec9ab701, 0x834f9aa8, + 0xe6956e65, 0xaaffe67e, 0x21bccf08, 0xef15e8e6, + 0xbae79bd9, 0x4a6f36ce, 0xea9f09d4, 0x29b07cd6, + 0x31a4b2af, 0x2a3f2331, 0xc6a59430, 0x35a266c0, + 0x744ebc37, 0xfc82caa6, 0xe090d0b0, 0x33a7d815, + 0xf104984a, 0x41ecdaf7, 0x7fcd500e, 0x1791f62f, + 0x764dd68d, 0x43efb04d, 0xccaa4d54, 0xe49604df, + 0x9ed1b5e3, 0x4c6a881b, 0xc12c1fb8, 0x4665517f, + 0x9d5eea04, 0x018c355d, 0xfa877473, 0xfb0b412e, + 0xb3671d5a, 0x92dbd252, 0xe9105633, 0x6dd64713, + 0x9ad7618c, 0x37a10c7a, 0x59f8148e, 0xeb133c89, + 0xcea927ee, 0xb761c935, 0xe11ce5ed, 0x7a47b13c, + 0x9cd2df59, 0x55f2733f, 0x1814ce79, 0x73c737bf, + 0x53f7cdea, 0x5ffdaa5b, 0xdf3d6f14, 0x7844db86, + 0xcaaff381, 0xb968c43e, 0x3824342c, 0xc2a3405f, + 0x161dc372, 0xbce2250c, 0x283c498b, 0xff0d9541, + 0x39a80171, 0x080cb3de, 0xd8b4e49c, 0x6456c190, + 0x7bcb8461, 0xd532b670, 0x486c5c74, 0xd0b85742, +}; + +static const uint td1[256] = +{ + 0x5051f4a7, 0x537e4165, 0xc31a17a4, 0x963a275e, + 0xcb3bab6b, 0xf11f9d45, 0xabacfa58, 0x934be303, + 0x552030fa, 0xf6ad766d, 0x9188cc76, 0x25f5024c, + 0xfc4fe5d7, 0xd7c52acb, 0x80263544, 0x8fb562a3, + 0x49deb15a, 0x6725ba1b, 0x9845ea0e, 0xe15dfec0, + 0x02c32f75, 0x12814cf0, 0xa38d4697, 0xc66bd3f9, + 0xe7038f5f, 0x9515929c, 0xebbf6d7a, 0xda955259, + 0x2dd4be83, 0xd3587421, 0x2949e069, 0x448ec9c8, + 0x6a75c289, 0x78f48e79, 0x6b99583e, 0xdd27b971, + 0xb6bee14f, 0x17f088ad, 0x66c920ac, 0xb47dce3a, + 0x1863df4a, 0x82e51a31, 0x60975133, 0x4562537f, + 0xe0b16477, 0x84bb6bae, 0x1cfe81a0, 0x94f9082b, + 0x58704868, 0x198f45fd, 0x8794de6c, 0xb7527bf8, + 0x23ab73d3, 0xe2724b02, 0x57e31f8f, 0x2a6655ab, + 0x07b2eb28, 0x032fb5c2, 0x9a86c57b, 0xa5d33708, + 0xf2302887, 0xb223bfa5, 0xba02036a, 0x5ced1682, + 0x2b8acf1c, 0x92a779b4, 0xf0f307f2, 0xa14e69e2, + 0xcd65daf4, 0xd50605be, 0x1fd13462, 0x8ac4a6fe, + 0x9d342e53, 0xa0a2f355, 0x32058ae1, 0x75a4f6eb, + 0x390b83ec, 0xaa4060ef, 0x065e719f, 0x51bd6e10, + 0xf93e218a, 0x3d96dd06, 0xaedd3e05, 0x464de6bd, + 0xb591548d, 0x0571c45d, 0x6f0406d4, 0xff605015, + 0x241998fb, 0x97d6bde9, 0xcc894043, 0x7767d99e, + 0xbdb0e842, 0x8807898b, 0x38e7195b, 0xdb79c8ee, + 0x47a17c0a, 0xe97c420f, 0xc9f8841e, 0x00000000, + 0x83098086, 0x48322bed, 0xac1e1170, 0x4e6c5a72, + 0xfbfd0eff, 0x560f8538, 0x1e3daed5, 0x27362d39, + 0x640a0fd9, 0x21685ca6, 0xd19b5b54, 0x3a24362e, + 0xb10c0a67, 0x0f9357e7, 0xd2b4ee96, 0x9e1b9b91, + 0x4f80c0c5, 0xa261dc20, 0x695a774b, 0x161c121a, + 0x0ae293ba, 0xe5c0a02a, 0x433c22e0, 0x1d121b17, + 0x0b0e090d, 0xadf28bc7, 0xb92db6a8, 0xc8141ea9, + 0x8557f119, 0x4caf7507, 0xbbee99dd, 0xfda37f60, + 0x9ff70126, 0xbc5c72f5, 0xc544663b, 0x345bfb7e, + 0x768b4329, 0xdccb23c6, 0x68b6edfc, 0x63b8e4f1, + 0xcad731dc, 0x10426385, 0x40139722, 0x2084c611, + 0x7d854a24, 0xf8d2bb3d, 0x11aef932, 0x6dc729a1, + 0x4b1d9e2f, 0xf3dcb230, 0xec0d8652, 0xd077c1e3, + 0x6c2bb316, 0x99a970b9, 0xfa119448, 0x2247e964, + 0xc4a8fc8c, 0x1aa0f03f, 0xd8567d2c, 0xef223390, + 0xc787494e, 0xc1d938d1, 0xfe8ccaa2, 0x3698d40b, + 0xcfa6f581, 0x28a57ade, 0x26dab78e, 0xa43fadbf, + 0xe42c3a9d, 0x0d507892, 0x9b6a5fcc, 0x62547e46, + 0xc2f68d13, 0xe890d8b8, 0x5e2e39f7, 0xf582c3af, + 0xbe9f5d80, 0x7c69d093, 0xa96fd52d, 0xb3cf2512, + 0x3bc8ac99, 0xa710187d, 0x6ee89c63, 0x7bdb3bbb, + 0x09cd2678, 0xf46e5918, 0x01ec9ab7, 0xa8834f9a, + 0x65e6956e, 0x7eaaffe6, 0x0821bccf, 0xe6ef15e8, + 0xd9bae79b, 0xce4a6f36, 0xd4ea9f09, 0xd629b07c, + 0xaf31a4b2, 0x312a3f23, 0x30c6a594, 0xc035a266, + 0x37744ebc, 0xa6fc82ca, 0xb0e090d0, 0x1533a7d8, + 0x4af10498, 0xf741ecda, 0x0e7fcd50, 0x2f1791f6, + 0x8d764dd6, 0x4d43efb0, 0x54ccaa4d, 0xdfe49604, + 0xe39ed1b5, 0x1b4c6a88, 0xb8c12c1f, 0x7f466551, + 0x049d5eea, 0x5d018c35, 0x73fa8774, 0x2efb0b41, + 0x5ab3671d, 0x5292dbd2, 0x33e91056, 0x136dd647, + 0x8c9ad761, 0x7a37a10c, 0x8e59f814, 0x89eb133c, + 0xeecea927, 0x35b761c9, 0xede11ce5, 0x3c7a47b1, + 0x599cd2df, 0x3f55f273, 0x791814ce, 0xbf73c737, + 0xea53f7cd, 0x5b5ffdaa, 0x14df3d6f, 0x867844db, + 0x81caaff3, 0x3eb968c4, 0x2c382434, 0x5fc2a340, + 0x72161dc3, 0x0cbce225, 0x8b283c49, 0x41ff0d95, + 0x7139a801, 0xde080cb3, 0x9cd8b4e4, 0x906456c1, + 0x617bcb84, 0x70d532b6, 0x74486c5c, 0x42d0b857, +}; + +static const uint td2[256] = +{ + 0xa75051f4, 0x65537e41, 0xa4c31a17, 0x5e963a27, + 0x6bcb3bab, 0x45f11f9d, 0x58abacfa, 0x03934be3, + 0xfa552030, 0x6df6ad76, 0x769188cc, 0x4c25f502, + 0xd7fc4fe5, 0xcbd7c52a, 0x44802635, 0xa38fb562, + 0x5a49deb1, 0x1b6725ba, 0x0e9845ea, 0xc0e15dfe, + 0x7502c32f, 0xf012814c, 0x97a38d46, 0xf9c66bd3, + 0x5fe7038f, 0x9c951592, 0x7aebbf6d, 0x59da9552, + 0x832dd4be, 0x21d35874, 0x692949e0, 0xc8448ec9, + 0x896a75c2, 0x7978f48e, 0x3e6b9958, 0x71dd27b9, + 0x4fb6bee1, 0xad17f088, 0xac66c920, 0x3ab47dce, + 0x4a1863df, 0x3182e51a, 0x33609751, 0x7f456253, + 0x77e0b164, 0xae84bb6b, 0xa01cfe81, 0x2b94f908, + 0x68587048, 0xfd198f45, 0x6c8794de, 0xf8b7527b, + 0xd323ab73, 0x02e2724b, 0x8f57e31f, 0xab2a6655, + 0x2807b2eb, 0xc2032fb5, 0x7b9a86c5, 0x08a5d337, + 0x87f23028, 0xa5b223bf, 0x6aba0203, 0x825ced16, + 0x1c2b8acf, 0xb492a779, 0xf2f0f307, 0xe2a14e69, + 0xf4cd65da, 0xbed50605, 0x621fd134, 0xfe8ac4a6, + 0x539d342e, 0x55a0a2f3, 0xe132058a, 0xeb75a4f6, + 0xec390b83, 0xefaa4060, 0x9f065e71, 0x1051bd6e, + 0x8af93e21, 0x063d96dd, 0x05aedd3e, 0xbd464de6, + 0x8db59154, 0x5d0571c4, 0xd46f0406, 0x15ff6050, + 0xfb241998, 0xe997d6bd, 0x43cc8940, 0x9e7767d9, + 0x42bdb0e8, 0x8b880789, 0x5b38e719, 0xeedb79c8, + 0x0a47a17c, 0x0fe97c42, 0x1ec9f884, 0x00000000, + 0x86830980, 0xed48322b, 0x70ac1e11, 0x724e6c5a, + 0xfffbfd0e, 0x38560f85, 0xd51e3dae, 0x3927362d, + 0xd9640a0f, 0xa621685c, 0x54d19b5b, 0x2e3a2436, + 0x67b10c0a, 0xe70f9357, 0x96d2b4ee, 0x919e1b9b, + 0xc54f80c0, 0x20a261dc, 0x4b695a77, 0x1a161c12, + 0xba0ae293, 0x2ae5c0a0, 0xe0433c22, 0x171d121b, + 0x0d0b0e09, 0xc7adf28b, 0xa8b92db6, 0xa9c8141e, + 0x198557f1, 0x074caf75, 0xddbbee99, 0x60fda37f, + 0x269ff701, 0xf5bc5c72, 0x3bc54466, 0x7e345bfb, + 0x29768b43, 0xc6dccb23, 0xfc68b6ed, 0xf163b8e4, + 0xdccad731, 0x85104263, 0x22401397, 0x112084c6, + 0x247d854a, 0x3df8d2bb, 0x3211aef9, 0xa16dc729, + 0x2f4b1d9e, 0x30f3dcb2, 0x52ec0d86, 0xe3d077c1, + 0x166c2bb3, 0xb999a970, 0x48fa1194, 0x642247e9, + 0x8cc4a8fc, 0x3f1aa0f0, 0x2cd8567d, 0x90ef2233, + 0x4ec78749, 0xd1c1d938, 0xa2fe8cca, 0x0b3698d4, + 0x81cfa6f5, 0xde28a57a, 0x8e26dab7, 0xbfa43fad, + 0x9de42c3a, 0x920d5078, 0xcc9b6a5f, 0x4662547e, + 0x13c2f68d, 0xb8e890d8, 0xf75e2e39, 0xaff582c3, + 0x80be9f5d, 0x937c69d0, 0x2da96fd5, 0x12b3cf25, + 0x993bc8ac, 0x7da71018, 0x636ee89c, 0xbb7bdb3b, + 0x7809cd26, 0x18f46e59, 0xb701ec9a, 0x9aa8834f, + 0x6e65e695, 0xe67eaaff, 0xcf0821bc, 0xe8e6ef15, + 0x9bd9bae7, 0x36ce4a6f, 0x09d4ea9f, 0x7cd629b0, + 0xb2af31a4, 0x23312a3f, 0x9430c6a5, 0x66c035a2, + 0xbc37744e, 0xcaa6fc82, 0xd0b0e090, 0xd81533a7, + 0x984af104, 0xdaf741ec, 0x500e7fcd, 0xf62f1791, + 0xd68d764d, 0xb04d43ef, 0x4d54ccaa, 0x04dfe496, + 0xb5e39ed1, 0x881b4c6a, 0x1fb8c12c, 0x517f4665, + 0xea049d5e, 0x355d018c, 0x7473fa87, 0x412efb0b, + 0x1d5ab367, 0xd25292db, 0x5633e910, 0x47136dd6, + 0x618c9ad7, 0x0c7a37a1, 0x148e59f8, 0x3c89eb13, + 0x27eecea9, 0xc935b761, 0xe5ede11c, 0xb13c7a47, + 0xdf599cd2, 0x733f55f2, 0xce791814, 0x37bf73c7, + 0xcdea53f7, 0xaa5b5ffd, 0x6f14df3d, 0xdb867844, + 0xf381caaf, 0xc43eb968, 0x342c3824, 0x405fc2a3, + 0xc372161d, 0x250cbce2, 0x498b283c, 0x9541ff0d, + 0x017139a8, 0xb3de080c, 0xe49cd8b4, 0xc1906456, + 0x84617bcb, 0xb670d532, 0x5c74486c, 0x5742d0b8, +}; + +static const uint td3[256] = +{ + 0xf4a75051, 0x4165537e, 0x17a4c31a, 0x275e963a, + 0xab6bcb3b, 0x9d45f11f, 0xfa58abac, 0xe303934b, + 0x30fa5520, 0x766df6ad, 0xcc769188, 0x024c25f5, + 0xe5d7fc4f, 0x2acbd7c5, 0x35448026, 0x62a38fb5, + 0xb15a49de, 0xba1b6725, 0xea0e9845, 0xfec0e15d, + 0x2f7502c3, 0x4cf01281, 0x4697a38d, 0xd3f9c66b, + 0x8f5fe703, 0x929c9515, 0x6d7aebbf, 0x5259da95, + 0xbe832dd4, 0x7421d358, 0xe0692949, 0xc9c8448e, + 0xc2896a75, 0x8e7978f4, 0x583e6b99, 0xb971dd27, + 0xe14fb6be, 0x88ad17f0, 0x20ac66c9, 0xce3ab47d, + 0xdf4a1863, 0x1a3182e5, 0x51336097, 0x537f4562, + 0x6477e0b1, 0x6bae84bb, 0x81a01cfe, 0x082b94f9, + 0x48685870, 0x45fd198f, 0xde6c8794, 0x7bf8b752, + 0x73d323ab, 0x4b02e272, 0x1f8f57e3, 0x55ab2a66, + 0xeb2807b2, 0xb5c2032f, 0xc57b9a86, 0x3708a5d3, + 0x2887f230, 0xbfa5b223, 0x036aba02, 0x16825ced, + 0xcf1c2b8a, 0x79b492a7, 0x07f2f0f3, 0x69e2a14e, + 0xdaf4cd65, 0x05bed506, 0x34621fd1, 0xa6fe8ac4, + 0x2e539d34, 0xf355a0a2, 0x8ae13205, 0xf6eb75a4, + 0x83ec390b, 0x60efaa40, 0x719f065e, 0x6e1051bd, + 0x218af93e, 0xdd063d96, 0x3e05aedd, 0xe6bd464d, + 0x548db591, 0xc45d0571, 0x06d46f04, 0x5015ff60, + 0x98fb2419, 0xbde997d6, 0x4043cc89, 0xd99e7767, + 0xe842bdb0, 0x898b8807, 0x195b38e7, 0xc8eedb79, + 0x7c0a47a1, 0x420fe97c, 0x841ec9f8, 0x00000000, + 0x80868309, 0x2bed4832, 0x1170ac1e, 0x5a724e6c, + 0x0efffbfd, 0x8538560f, 0xaed51e3d, 0x2d392736, + 0x0fd9640a, 0x5ca62168, 0x5b54d19b, 0x362e3a24, + 0x0a67b10c, 0x57e70f93, 0xee96d2b4, 0x9b919e1b, + 0xc0c54f80, 0xdc20a261, 0x774b695a, 0x121a161c, + 0x93ba0ae2, 0xa02ae5c0, 0x22e0433c, 0x1b171d12, + 0x090d0b0e, 0x8bc7adf2, 0xb6a8b92d, 0x1ea9c814, + 0xf1198557, 0x75074caf, 0x99ddbbee, 0x7f60fda3, + 0x01269ff7, 0x72f5bc5c, 0x663bc544, 0xfb7e345b, + 0x4329768b, 0x23c6dccb, 0xedfc68b6, 0xe4f163b8, + 0x31dccad7, 0x63851042, 0x97224013, 0xc6112084, + 0x4a247d85, 0xbb3df8d2, 0xf93211ae, 0x29a16dc7, + 0x9e2f4b1d, 0xb230f3dc, 0x8652ec0d, 0xc1e3d077, + 0xb3166c2b, 0x70b999a9, 0x9448fa11, 0xe9642247, + 0xfc8cc4a8, 0xf03f1aa0, 0x7d2cd856, 0x3390ef22, + 0x494ec787, 0x38d1c1d9, 0xcaa2fe8c, 0xd40b3698, + 0xf581cfa6, 0x7ade28a5, 0xb78e26da, 0xadbfa43f, + 0x3a9de42c, 0x78920d50, 0x5fcc9b6a, 0x7e466254, + 0x8d13c2f6, 0xd8b8e890, 0x39f75e2e, 0xc3aff582, + 0x5d80be9f, 0xd0937c69, 0xd52da96f, 0x2512b3cf, + 0xac993bc8, 0x187da710, 0x9c636ee8, 0x3bbb7bdb, + 0x267809cd, 0x5918f46e, 0x9ab701ec, 0x4f9aa883, + 0x956e65e6, 0xffe67eaa, 0xbccf0821, 0x15e8e6ef, + 0xe79bd9ba, 0x6f36ce4a, 0x9f09d4ea, 0xb07cd629, + 0xa4b2af31, 0x3f23312a, 0xa59430c6, 0xa266c035, + 0x4ebc3774, 0x82caa6fc, 0x90d0b0e0, 0xa7d81533, + 0x04984af1, 0xecdaf741, 0xcd500e7f, 0x91f62f17, + 0x4dd68d76, 0xefb04d43, 0xaa4d54cc, 0x9604dfe4, + 0xd1b5e39e, 0x6a881b4c, 0x2c1fb8c1, 0x65517f46, + 0x5eea049d, 0x8c355d01, 0x877473fa, 0x0b412efb, + 0x671d5ab3, 0xdbd25292, 0x105633e9, 0xd647136d, + 0xd7618c9a, 0xa10c7a37, 0xf8148e59, 0x133c89eb, + 0xa927eece, 0x61c935b7, 0x1ce5ede1, 0x47b13c7a, + 0xd2df599c, 0xf2733f55, 0x14ce7918, 0xc737bf73, + 0xf7cdea53, 0xfdaa5b5f, 0x3d6f14df, 0x44db8678, + 0xaff381ca, 0x68c43eb9, 0x24342c38, 0xa3405fc2, + 0x1dc37216, 0xe2250cbc, 0x3c498b28, 0x0d9541ff, + 0xa8017139, 0x0cb3de08, 0xb4e49cd8, 0x56c19064, + 0xcb84617b, 0x32b670d5, 0x6c5c7448, 0xb85742d0, +}; + +static const uint td4[256] = +{ + 0x52525252, 0x09090909, 0x6a6a6a6a, 0xd5d5d5d5, + 0x30303030, 0x36363636, 0xa5a5a5a5, 0x38383838, + 0xbfbfbfbf, 0x40404040, 0xa3a3a3a3, 0x9e9e9e9e, + 0x81818181, 0xf3f3f3f3, 0xd7d7d7d7, 0xfbfbfbfb, + 0x7c7c7c7c, 0xe3e3e3e3, 0x39393939, 0x82828282, + 0x9b9b9b9b, 0x2f2f2f2f, 0xffffffff, 0x87878787, + 0x34343434, 0x8e8e8e8e, 0x43434343, 0x44444444, + 0xc4c4c4c4, 0xdededede, 0xe9e9e9e9, 0xcbcbcbcb, + 0x54545454, 0x7b7b7b7b, 0x94949494, 0x32323232, + 0xa6a6a6a6, 0xc2c2c2c2, 0x23232323, 0x3d3d3d3d, + 0xeeeeeeee, 0x4c4c4c4c, 0x95959595, 0x0b0b0b0b, + 0x42424242, 0xfafafafa, 0xc3c3c3c3, 0x4e4e4e4e, + 0x08080808, 0x2e2e2e2e, 0xa1a1a1a1, 0x66666666, + 0x28282828, 0xd9d9d9d9, 0x24242424, 0xb2b2b2b2, + 0x76767676, 0x5b5b5b5b, 0xa2a2a2a2, 0x49494949, + 0x6d6d6d6d, 0x8b8b8b8b, 0xd1d1d1d1, 0x25252525, + 0x72727272, 0xf8f8f8f8, 0xf6f6f6f6, 0x64646464, + 0x86868686, 0x68686868, 0x98989898, 0x16161616, + 0xd4d4d4d4, 0xa4a4a4a4, 0x5c5c5c5c, 0xcccccccc, + 0x5d5d5d5d, 0x65656565, 0xb6b6b6b6, 0x92929292, + 0x6c6c6c6c, 0x70707070, 0x48484848, 0x50505050, + 0xfdfdfdfd, 0xedededed, 0xb9b9b9b9, 0xdadadada, + 0x5e5e5e5e, 0x15151515, 0x46464646, 0x57575757, + 0xa7a7a7a7, 0x8d8d8d8d, 0x9d9d9d9d, 0x84848484, + 0x90909090, 0xd8d8d8d8, 0xabababab, 0x00000000, + 0x8c8c8c8c, 0xbcbcbcbc, 0xd3d3d3d3, 0x0a0a0a0a, + 0xf7f7f7f7, 0xe4e4e4e4, 0x58585858, 0x05050505, + 0xb8b8b8b8, 0xb3b3b3b3, 0x45454545, 0x06060606, + 0xd0d0d0d0, 0x2c2c2c2c, 0x1e1e1e1e, 0x8f8f8f8f, + 0xcacacaca, 0x3f3f3f3f, 0x0f0f0f0f, 0x02020202, + 0xc1c1c1c1, 0xafafafaf, 0xbdbdbdbd, 0x03030303, + 0x01010101, 0x13131313, 0x8a8a8a8a, 0x6b6b6b6b, + 0x3a3a3a3a, 0x91919191, 0x11111111, 0x41414141, + 0x4f4f4f4f, 0x67676767, 0xdcdcdcdc, 0xeaeaeaea, + 0x97979797, 0xf2f2f2f2, 0xcfcfcfcf, 0xcececece, + 0xf0f0f0f0, 0xb4b4b4b4, 0xe6e6e6e6, 0x73737373, + 0x96969696, 0xacacacac, 0x74747474, 0x22222222, + 0xe7e7e7e7, 0xadadadad, 0x35353535, 0x85858585, + 0xe2e2e2e2, 0xf9f9f9f9, 0x37373737, 0xe8e8e8e8, + 0x1c1c1c1c, 0x75757575, 0xdfdfdfdf, 0x6e6e6e6e, + 0x47474747, 0xf1f1f1f1, 0x1a1a1a1a, 0x71717171, + 0x1d1d1d1d, 0x29292929, 0xc5c5c5c5, 0x89898989, + 0x6f6f6f6f, 0xb7b7b7b7, 0x62626262, 0x0e0e0e0e, + 0xaaaaaaaa, 0x18181818, 0xbebebebe, 0x1b1b1b1b, + 0xfcfcfcfc, 0x56565656, 0x3e3e3e3e, 0x4b4b4b4b, + 0xc6c6c6c6, 0xd2d2d2d2, 0x79797979, 0x20202020, + 0x9a9a9a9a, 0xdbdbdbdb, 0xc0c0c0c0, 0xfefefefe, + 0x78787878, 0xcdcdcdcd, 0x5a5a5a5a, 0xf4f4f4f4, + 0x1f1f1f1f, 0xdddddddd, 0xa8a8a8a8, 0x33333333, + 0x88888888, 0x07070707, 0xc7c7c7c7, 0x31313131, + 0xb1b1b1b1, 0x12121212, 0x10101010, 0x59595959, + 0x27272727, 0x80808080, 0xecececec, 0x5f5f5f5f, + 0x60606060, 0x51515151, 0x7f7f7f7f, 0xa9a9a9a9, + 0x19191919, 0xb5b5b5b5, 0x4a4a4a4a, 0x0d0d0d0d, + 0x2d2d2d2d, 0xe5e5e5e5, 0x7a7a7a7a, 0x9f9f9f9f, + 0x93939393, 0xc9c9c9c9, 0x9c9c9c9c, 0xefefefef, + 0xa0a0a0a0, 0xe0e0e0e0, 0x3b3b3b3b, 0x4d4d4d4d, + 0xaeaeaeae, 0x2a2a2a2a, 0xf5f5f5f5, 0xb0b0b0b0, + 0xc8c8c8c8, 0xebebebeb, 0xbbbbbbbb, 0x3c3c3c3c, + 0x83838383, 0x53535353, 0x99999999, 0x61616161, + 0x17171717, 0x2b2b2b2b, 0x04040404, 0x7e7e7e7e, + 0xbabababa, 0x77777777, 0xd6d6d6d6, 0x26262626, + 0xe1e1e1e1, 0x69696969, 0x14141414, 0x63636363, + 0x55555555, 0x21212121, 0x0c0c0c0c, 0x7d7d7d7d, +}; + +static const uint rcon[] = +{ + 0x01000000, 0x02000000, 0x04000000, 0x08000000, + 0x10000000, 0x20000000, 0x40000000, 0x80000000, + 0x1b000000, 0x36000000, +}; + +// 128 bit + +static void AES128_ExpandKey (const uint *userkey, uint *rek) +{ + uint userkey_s[4]; + + userkey_s[0] = byte_swap_32 (userkey[0]); + userkey_s[1] = byte_swap_32 (userkey[1]); + userkey_s[2] = byte_swap_32 (userkey[2]); + userkey_s[3] = byte_swap_32 (userkey[3]); + + rek[0] = userkey_s[0]; + rek[1] = userkey_s[1]; + rek[2] = userkey_s[2]; + rek[3] = userkey_s[3]; + + int i; + int j; + + for (i = 0, j = 0; i < 10; i += 1, j += 4) + { + uint temp = rek[j + 3]; + + temp = (te2[(temp >> 16) & 0xff] & 0xff000000) + ^ (te3[(temp >> 8) & 0xff] & 0x00ff0000) + ^ (te0[(temp >> 0) & 0xff] & 0x0000ff00) + ^ (te1[(temp >> 24) & 0xff] & 0x000000ff); + + rek[j + 4] = rek[j + 0] + ^ temp + ^ rcon[i]; + + rek[j + 5] = rek[j + 1] ^ rek[j + 4]; + rek[j + 6] = rek[j + 2] ^ rek[j + 5]; + rek[j + 7] = rek[j + 3] ^ rek[j + 6]; + } +} + +static void AES128_InvertKey (uint *rdk) +{ + int i; + int j; + + for (i = 0, j = 40; i < j; i += 4, j -= 4) + { + uint temp; + + temp = rdk[i + 0]; rdk[i + 0] = rdk[j + 0]; rdk[j + 0] = temp; + temp = rdk[i + 1]; rdk[i + 1] = rdk[j + 1]; rdk[j + 1] = temp; + temp = rdk[i + 2]; rdk[i + 2] = rdk[j + 2]; rdk[j + 2] = temp; + temp = rdk[i + 3]; rdk[i + 3] = rdk[j + 3]; rdk[j + 3] = temp; + } + + for (i = 1, j = 4; i < 10; i += 1, j += 4) + { + rdk[j + 0] = + td0[te1[(rdk[j + 0] >> 24) & 0xff] & 0xff] ^ + td1[te1[(rdk[j + 0] >> 16) & 0xff] & 0xff] ^ + td2[te1[(rdk[j + 0] >> 8) & 0xff] & 0xff] ^ + td3[te1[(rdk[j + 0] >> 0) & 0xff] & 0xff]; + + rdk[j + 1] = + td0[te1[(rdk[j + 1] >> 24) & 0xff] & 0xff] ^ + td1[te1[(rdk[j + 1] >> 16) & 0xff] & 0xff] ^ + td2[te1[(rdk[j + 1] >> 8) & 0xff] & 0xff] ^ + td3[te1[(rdk[j + 1] >> 0) & 0xff] & 0xff]; + + rdk[j + 2] = + td0[te1[(rdk[j + 2] >> 24) & 0xff] & 0xff] ^ + td1[te1[(rdk[j + 2] >> 16) & 0xff] & 0xff] ^ + td2[te1[(rdk[j + 2] >> 8) & 0xff] & 0xff] ^ + td3[te1[(rdk[j + 2] >> 0) & 0xff] & 0xff]; + + rdk[j + 3] = + td0[te1[(rdk[j + 3] >> 24) & 0xff] & 0xff] ^ + td1[te1[(rdk[j + 3] >> 16) & 0xff] & 0xff] ^ + td2[te1[(rdk[j + 3] >> 8) & 0xff] & 0xff] ^ + td3[te1[(rdk[j + 3] >> 0) & 0xff] & 0xff]; + } +} + +static void AES128_encrypt (const uint *in, uint *out, const uint *rek) +{ + uint in_s[4]; + + in_s[0] = byte_swap_32 (in[0]); + in_s[1] = byte_swap_32 (in[1]); + in_s[2] = byte_swap_32 (in[2]); + in_s[3] = byte_swap_32 (in[3]); + + uint s0 = in_s[0] ^ rek[0]; + uint s1 = in_s[1] ^ rek[1]; + uint s2 = in_s[2] ^ rek[2]; + uint s3 = in_s[3] ^ rek[3]; + + uint t0; + uint t1; + uint t2; + uint t3; + + t0 = te0[s0 >> 24] ^ te1[(s1 >> 16) & 0xff] ^ te2[(s2 >> 8) & 0xff] ^ te3[s3 & 0xff] ^ rek[ 4]; + t1 = te0[s1 >> 24] ^ te1[(s2 >> 16) & 0xff] ^ te2[(s3 >> 8) & 0xff] ^ te3[s0 & 0xff] ^ rek[ 5]; + t2 = te0[s2 >> 24] ^ te1[(s3 >> 16) & 0xff] ^ te2[(s0 >> 8) & 0xff] ^ te3[s1 & 0xff] ^ rek[ 6]; + t3 = te0[s3 >> 24] ^ te1[(s0 >> 16) & 0xff] ^ te2[(s1 >> 8) & 0xff] ^ te3[s2 & 0xff] ^ rek[ 7]; + s0 = te0[t0 >> 24] ^ te1[(t1 >> 16) & 0xff] ^ te2[(t2 >> 8) & 0xff] ^ te3[t3 & 0xff] ^ rek[ 8]; + s1 = te0[t1 >> 24] ^ te1[(t2 >> 16) & 0xff] ^ te2[(t3 >> 8) & 0xff] ^ te3[t0 & 0xff] ^ rek[ 9]; + s2 = te0[t2 >> 24] ^ te1[(t3 >> 16) & 0xff] ^ te2[(t0 >> 8) & 0xff] ^ te3[t1 & 0xff] ^ rek[10]; + s3 = te0[t3 >> 24] ^ te1[(t0 >> 16) & 0xff] ^ te2[(t1 >> 8) & 0xff] ^ te3[t2 & 0xff] ^ rek[11]; + t0 = te0[s0 >> 24] ^ te1[(s1 >> 16) & 0xff] ^ te2[(s2 >> 8) & 0xff] ^ te3[s3 & 0xff] ^ rek[12]; + t1 = te0[s1 >> 24] ^ te1[(s2 >> 16) & 0xff] ^ te2[(s3 >> 8) & 0xff] ^ te3[s0 & 0xff] ^ rek[13]; + t2 = te0[s2 >> 24] ^ te1[(s3 >> 16) & 0xff] ^ te2[(s0 >> 8) & 0xff] ^ te3[s1 & 0xff] ^ rek[14]; + t3 = te0[s3 >> 24] ^ te1[(s0 >> 16) & 0xff] ^ te2[(s1 >> 8) & 0xff] ^ te3[s2 & 0xff] ^ rek[15]; + s0 = te0[t0 >> 24] ^ te1[(t1 >> 16) & 0xff] ^ te2[(t2 >> 8) & 0xff] ^ te3[t3 & 0xff] ^ rek[16]; + s1 = te0[t1 >> 24] ^ te1[(t2 >> 16) & 0xff] ^ te2[(t3 >> 8) & 0xff] ^ te3[t0 & 0xff] ^ rek[17]; + s2 = te0[t2 >> 24] ^ te1[(t3 >> 16) & 0xff] ^ te2[(t0 >> 8) & 0xff] ^ te3[t1 & 0xff] ^ rek[18]; + s3 = te0[t3 >> 24] ^ te1[(t0 >> 16) & 0xff] ^ te2[(t1 >> 8) & 0xff] ^ te3[t2 & 0xff] ^ rek[19]; + t0 = te0[s0 >> 24] ^ te1[(s1 >> 16) & 0xff] ^ te2[(s2 >> 8) & 0xff] ^ te3[s3 & 0xff] ^ rek[20]; + t1 = te0[s1 >> 24] ^ te1[(s2 >> 16) & 0xff] ^ te2[(s3 >> 8) & 0xff] ^ te3[s0 & 0xff] ^ rek[21]; + t2 = te0[s2 >> 24] ^ te1[(s3 >> 16) & 0xff] ^ te2[(s0 >> 8) & 0xff] ^ te3[s1 & 0xff] ^ rek[22]; + t3 = te0[s3 >> 24] ^ te1[(s0 >> 16) & 0xff] ^ te2[(s1 >> 8) & 0xff] ^ te3[s2 & 0xff] ^ rek[23]; + s0 = te0[t0 >> 24] ^ te1[(t1 >> 16) & 0xff] ^ te2[(t2 >> 8) & 0xff] ^ te3[t3 & 0xff] ^ rek[24]; + s1 = te0[t1 >> 24] ^ te1[(t2 >> 16) & 0xff] ^ te2[(t3 >> 8) & 0xff] ^ te3[t0 & 0xff] ^ rek[25]; + s2 = te0[t2 >> 24] ^ te1[(t3 >> 16) & 0xff] ^ te2[(t0 >> 8) & 0xff] ^ te3[t1 & 0xff] ^ rek[26]; + s3 = te0[t3 >> 24] ^ te1[(t0 >> 16) & 0xff] ^ te2[(t1 >> 8) & 0xff] ^ te3[t2 & 0xff] ^ rek[27]; + t0 = te0[s0 >> 24] ^ te1[(s1 >> 16) & 0xff] ^ te2[(s2 >> 8) & 0xff] ^ te3[s3 & 0xff] ^ rek[28]; + t1 = te0[s1 >> 24] ^ te1[(s2 >> 16) & 0xff] ^ te2[(s3 >> 8) & 0xff] ^ te3[s0 & 0xff] ^ rek[29]; + t2 = te0[s2 >> 24] ^ te1[(s3 >> 16) & 0xff] ^ te2[(s0 >> 8) & 0xff] ^ te3[s1 & 0xff] ^ rek[30]; + t3 = te0[s3 >> 24] ^ te1[(s0 >> 16) & 0xff] ^ te2[(s1 >> 8) & 0xff] ^ te3[s2 & 0xff] ^ rek[31]; + s0 = te0[t0 >> 24] ^ te1[(t1 >> 16) & 0xff] ^ te2[(t2 >> 8) & 0xff] ^ te3[t3 & 0xff] ^ rek[32]; + s1 = te0[t1 >> 24] ^ te1[(t2 >> 16) & 0xff] ^ te2[(t3 >> 8) & 0xff] ^ te3[t0 & 0xff] ^ rek[33]; + s2 = te0[t2 >> 24] ^ te1[(t3 >> 16) & 0xff] ^ te2[(t0 >> 8) & 0xff] ^ te3[t1 & 0xff] ^ rek[34]; + s3 = te0[t3 >> 24] ^ te1[(t0 >> 16) & 0xff] ^ te2[(t1 >> 8) & 0xff] ^ te3[t2 & 0xff] ^ rek[35]; + t0 = te0[s0 >> 24] ^ te1[(s1 >> 16) & 0xff] ^ te2[(s2 >> 8) & 0xff] ^ te3[s3 & 0xff] ^ rek[36]; + t1 = te0[s1 >> 24] ^ te1[(s2 >> 16) & 0xff] ^ te2[(s3 >> 8) & 0xff] ^ te3[s0 & 0xff] ^ rek[37]; + t2 = te0[s2 >> 24] ^ te1[(s3 >> 16) & 0xff] ^ te2[(s0 >> 8) & 0xff] ^ te3[s1 & 0xff] ^ rek[38]; + t3 = te0[s3 >> 24] ^ te1[(s0 >> 16) & 0xff] ^ te2[(s1 >> 8) & 0xff] ^ te3[s2 & 0xff] ^ rek[39]; + + out[0] = (te4[(t0 >> 24) & 0xff] & 0xff000000) + ^ (te4[(t1 >> 16) & 0xff] & 0x00ff0000) + ^ (te4[(t2 >> 8) & 0xff] & 0x0000ff00) + ^ (te4[(t3 >> 0) & 0xff] & 0x000000ff) + ^ rek[40]; + + out[1] = (te4[(t1 >> 24) & 0xff] & 0xff000000) + ^ (te4[(t2 >> 16) & 0xff] & 0x00ff0000) + ^ (te4[(t3 >> 8) & 0xff] & 0x0000ff00) + ^ (te4[(t0 >> 0) & 0xff] & 0x000000ff) + ^ rek[41]; + + out[2] = (te4[(t2 >> 24) & 0xff] & 0xff000000) + ^ (te4[(t3 >> 16) & 0xff] & 0x00ff0000) + ^ (te4[(t0 >> 8) & 0xff] & 0x0000ff00) + ^ (te4[(t1 >> 0) & 0xff] & 0x000000ff) + ^ rek[42]; + + out[3] = (te4[(t3 >> 24) & 0xff] & 0xff000000) + ^ (te4[(t0 >> 16) & 0xff] & 0x00ff0000) + ^ (te4[(t1 >> 8) & 0xff] & 0x0000ff00) + ^ (te4[(t2 >> 0) & 0xff] & 0x000000ff) + ^ rek[43]; + + out[0] = byte_swap_32 (out[0]); + out[1] = byte_swap_32 (out[1]); + out[2] = byte_swap_32 (out[2]); + out[3] = byte_swap_32 (out[3]); +} + +static void AES128_decrypt (const uint *in, uint *out, const uint *rdk) +{ + uint in_s[4]; + + in_s[0] = byte_swap_32 (in[0]); + in_s[1] = byte_swap_32 (in[1]); + in_s[2] = byte_swap_32 (in[2]); + in_s[3] = byte_swap_32 (in[3]); + + uint s0 = in_s[0] ^ rdk[0]; + uint s1 = in_s[1] ^ rdk[1]; + uint s2 = in_s[2] ^ rdk[2]; + uint s3 = in_s[3] ^ rdk[3]; + + uint t0; + uint t1; + uint t2; + uint t3; + + t0 = td0[s0 >> 24] ^ td1[(s3 >> 16) & 0xff] ^ td2[(s2 >> 8) & 0xff] ^ td3[s1 & 0xff] ^ rdk[ 4]; + t1 = td0[s1 >> 24] ^ td1[(s0 >> 16) & 0xff] ^ td2[(s3 >> 8) & 0xff] ^ td3[s2 & 0xff] ^ rdk[ 5]; + t2 = td0[s2 >> 24] ^ td1[(s1 >> 16) & 0xff] ^ td2[(s0 >> 8) & 0xff] ^ td3[s3 & 0xff] ^ rdk[ 6]; + t3 = td0[s3 >> 24] ^ td1[(s2 >> 16) & 0xff] ^ td2[(s1 >> 8) & 0xff] ^ td3[s0 & 0xff] ^ rdk[ 7]; + s0 = td0[t0 >> 24] ^ td1[(t3 >> 16) & 0xff] ^ td2[(t2 >> 8) & 0xff] ^ td3[t1 & 0xff] ^ rdk[ 8]; + s1 = td0[t1 >> 24] ^ td1[(t0 >> 16) & 0xff] ^ td2[(t3 >> 8) & 0xff] ^ td3[t2 & 0xff] ^ rdk[ 9]; + s2 = td0[t2 >> 24] ^ td1[(t1 >> 16) & 0xff] ^ td2[(t0 >> 8) & 0xff] ^ td3[t3 & 0xff] ^ rdk[10]; + s3 = td0[t3 >> 24] ^ td1[(t2 >> 16) & 0xff] ^ td2[(t1 >> 8) & 0xff] ^ td3[t0 & 0xff] ^ rdk[11]; + t0 = td0[s0 >> 24] ^ td1[(s3 >> 16) & 0xff] ^ td2[(s2 >> 8) & 0xff] ^ td3[s1 & 0xff] ^ rdk[12]; + t1 = td0[s1 >> 24] ^ td1[(s0 >> 16) & 0xff] ^ td2[(s3 >> 8) & 0xff] ^ td3[s2 & 0xff] ^ rdk[13]; + t2 = td0[s2 >> 24] ^ td1[(s1 >> 16) & 0xff] ^ td2[(s0 >> 8) & 0xff] ^ td3[s3 & 0xff] ^ rdk[14]; + t3 = td0[s3 >> 24] ^ td1[(s2 >> 16) & 0xff] ^ td2[(s1 >> 8) & 0xff] ^ td3[s0 & 0xff] ^ rdk[15]; + s0 = td0[t0 >> 24] ^ td1[(t3 >> 16) & 0xff] ^ td2[(t2 >> 8) & 0xff] ^ td3[t1 & 0xff] ^ rdk[16]; + s1 = td0[t1 >> 24] ^ td1[(t0 >> 16) & 0xff] ^ td2[(t3 >> 8) & 0xff] ^ td3[t2 & 0xff] ^ rdk[17]; + s2 = td0[t2 >> 24] ^ td1[(t1 >> 16) & 0xff] ^ td2[(t0 >> 8) & 0xff] ^ td3[t3 & 0xff] ^ rdk[18]; + s3 = td0[t3 >> 24] ^ td1[(t2 >> 16) & 0xff] ^ td2[(t1 >> 8) & 0xff] ^ td3[t0 & 0xff] ^ rdk[19]; + t0 = td0[s0 >> 24] ^ td1[(s3 >> 16) & 0xff] ^ td2[(s2 >> 8) & 0xff] ^ td3[s1 & 0xff] ^ rdk[20]; + t1 = td0[s1 >> 24] ^ td1[(s0 >> 16) & 0xff] ^ td2[(s3 >> 8) & 0xff] ^ td3[s2 & 0xff] ^ rdk[21]; + t2 = td0[s2 >> 24] ^ td1[(s1 >> 16) & 0xff] ^ td2[(s0 >> 8) & 0xff] ^ td3[s3 & 0xff] ^ rdk[22]; + t3 = td0[s3 >> 24] ^ td1[(s2 >> 16) & 0xff] ^ td2[(s1 >> 8) & 0xff] ^ td3[s0 & 0xff] ^ rdk[23]; + s0 = td0[t0 >> 24] ^ td1[(t3 >> 16) & 0xff] ^ td2[(t2 >> 8) & 0xff] ^ td3[t1 & 0xff] ^ rdk[24]; + s1 = td0[t1 >> 24] ^ td1[(t0 >> 16) & 0xff] ^ td2[(t3 >> 8) & 0xff] ^ td3[t2 & 0xff] ^ rdk[25]; + s2 = td0[t2 >> 24] ^ td1[(t1 >> 16) & 0xff] ^ td2[(t0 >> 8) & 0xff] ^ td3[t3 & 0xff] ^ rdk[26]; + s3 = td0[t3 >> 24] ^ td1[(t2 >> 16) & 0xff] ^ td2[(t1 >> 8) & 0xff] ^ td3[t0 & 0xff] ^ rdk[27]; + t0 = td0[s0 >> 24] ^ td1[(s3 >> 16) & 0xff] ^ td2[(s2 >> 8) & 0xff] ^ td3[s1 & 0xff] ^ rdk[28]; + t1 = td0[s1 >> 24] ^ td1[(s0 >> 16) & 0xff] ^ td2[(s3 >> 8) & 0xff] ^ td3[s2 & 0xff] ^ rdk[29]; + t2 = td0[s2 >> 24] ^ td1[(s1 >> 16) & 0xff] ^ td2[(s0 >> 8) & 0xff] ^ td3[s3 & 0xff] ^ rdk[30]; + t3 = td0[s3 >> 24] ^ td1[(s2 >> 16) & 0xff] ^ td2[(s1 >> 8) & 0xff] ^ td3[s0 & 0xff] ^ rdk[31]; + s0 = td0[t0 >> 24] ^ td1[(t3 >> 16) & 0xff] ^ td2[(t2 >> 8) & 0xff] ^ td3[t1 & 0xff] ^ rdk[32]; + s1 = td0[t1 >> 24] ^ td1[(t0 >> 16) & 0xff] ^ td2[(t3 >> 8) & 0xff] ^ td3[t2 & 0xff] ^ rdk[33]; + s2 = td0[t2 >> 24] ^ td1[(t1 >> 16) & 0xff] ^ td2[(t0 >> 8) & 0xff] ^ td3[t3 & 0xff] ^ rdk[34]; + s3 = td0[t3 >> 24] ^ td1[(t2 >> 16) & 0xff] ^ td2[(t1 >> 8) & 0xff] ^ td3[t0 & 0xff] ^ rdk[35]; + t0 = td0[s0 >> 24] ^ td1[(s3 >> 16) & 0xff] ^ td2[(s2 >> 8) & 0xff] ^ td3[s1 & 0xff] ^ rdk[36]; + t1 = td0[s1 >> 24] ^ td1[(s0 >> 16) & 0xff] ^ td2[(s3 >> 8) & 0xff] ^ td3[s2 & 0xff] ^ rdk[37]; + t2 = td0[s2 >> 24] ^ td1[(s1 >> 16) & 0xff] ^ td2[(s0 >> 8) & 0xff] ^ td3[s3 & 0xff] ^ rdk[38]; + t3 = td0[s3 >> 24] ^ td1[(s2 >> 16) & 0xff] ^ td2[(s1 >> 8) & 0xff] ^ td3[s0 & 0xff] ^ rdk[39]; + + out[0] = (td4[(t0 >> 24) & 0xff] & 0xff000000) + ^ (td4[(t3 >> 16) & 0xff] & 0x00ff0000) + ^ (td4[(t2 >> 8) & 0xff] & 0x0000ff00) + ^ (td4[(t1 >> 0) & 0xff] & 0x000000ff) + ^ rdk[40]; + + out[1] = (td4[(t1 >> 24) & 0xff] & 0xff000000) + ^ (td4[(t0 >> 16) & 0xff] & 0x00ff0000) + ^ (td4[(t3 >> 8) & 0xff] & 0x0000ff00) + ^ (td4[(t2 >> 0) & 0xff] & 0x000000ff) + ^ rdk[41]; + + out[2] = (td4[(t2 >> 24) & 0xff] & 0xff000000) + ^ (td4[(t1 >> 16) & 0xff] & 0x00ff0000) + ^ (td4[(t0 >> 8) & 0xff] & 0x0000ff00) + ^ (td4[(t3 >> 0) & 0xff] & 0x000000ff) + ^ rdk[42]; + + out[3] = (td4[(t3 >> 24) & 0xff] & 0xff000000) + ^ (td4[(t2 >> 16) & 0xff] & 0x00ff0000) + ^ (td4[(t1 >> 8) & 0xff] & 0x0000ff00) + ^ (td4[(t0 >> 0) & 0xff] & 0x000000ff) + ^ rdk[43]; + + out[0] = byte_swap_32 (out[0]); + out[1] = byte_swap_32 (out[1]); + out[2] = byte_swap_32 (out[2]); + out[3] = byte_swap_32 (out[3]); +} + +// 256 bit + +static void AES256_ExpandKey (const uint *userkey, uint *rek) +{ + uint userkey_s[8]; + + userkey_s[0] = byte_swap_32 (userkey[0]); + userkey_s[1] = byte_swap_32 (userkey[1]); + userkey_s[2] = byte_swap_32 (userkey[2]); + userkey_s[3] = byte_swap_32 (userkey[3]); + userkey_s[4] = byte_swap_32 (userkey[4]); + userkey_s[5] = byte_swap_32 (userkey[5]); + userkey_s[6] = byte_swap_32 (userkey[6]); + userkey_s[7] = byte_swap_32 (userkey[7]); + + rek[0] = userkey_s[0]; + rek[1] = userkey_s[1]; + rek[2] = userkey_s[2]; + rek[3] = userkey_s[3]; + rek[4] = userkey_s[4]; + rek[5] = userkey_s[5]; + rek[6] = userkey_s[6]; + rek[7] = userkey_s[7]; + + int i; + int j; + + i = 0; + j = 0; + + while (1) + { + uint temp = rek[j + 7]; + + rek[j + 8] = rek[j + 0] + ^ (te2[(temp >> 16) & 0xff] & 0xff000000) + ^ (te3[(temp >> 8) & 0xff] & 0x00ff0000) + ^ (te0[(temp >> 0) & 0xff] & 0x0000ff00) + ^ (te1[(temp >> 24) & 0xff] & 0x000000ff) + ^ rcon[i]; + + rek[j + 9] = rek[j + 1] ^ rek[j + 8]; + rek[j + 10] = rek[j + 2] ^ rek[j + 9]; + rek[j + 11] = rek[j + 3] ^ rek[j + 10]; + + if (++i == 7) break; + + temp = rek[j + 11]; + + rek[j + 12] = rek[j + 4] + ^ (te2[(temp >> 24) & 0xff] & 0xff000000) + ^ (te3[(temp >> 16) & 0xff] & 0x00ff0000) + ^ (te0[(temp >> 8) & 0xff] & 0x0000ff00) + ^ (te1[(temp >> 0) & 0xff] & 0x000000ff); + + rek[j + 13] = rek[j + 5] ^ rek[j + 12]; + rek[j + 14] = rek[j + 6] ^ rek[j + 13]; + rek[j + 15] = rek[j + 7] ^ rek[j + 14]; + + j += 8; + } +} + +static void AES256_InvertKey (uint *rdk) +{ + for (uint i = 0, j = 56; i < j; i += 4, j -= 4) + { + uint temp; + + temp = rdk[i + 0]; rdk[i + 0] = rdk[j + 0]; rdk[j + 0] = temp; + temp = rdk[i + 1]; rdk[i + 1] = rdk[j + 1]; rdk[j + 1] = temp; + temp = rdk[i + 2]; rdk[i + 2] = rdk[j + 2]; rdk[j + 2] = temp; + temp = rdk[i + 3]; rdk[i + 3] = rdk[j + 3]; rdk[j + 3] = temp; + } + + for (uint i = 1, j = 4; i < 14; i += 1, j += 4) + { + rdk[j + 0] = + td0[te1[(rdk[j + 0] >> 24) & 0xff] & 0xff] ^ + td1[te1[(rdk[j + 0] >> 16) & 0xff] & 0xff] ^ + td2[te1[(rdk[j + 0] >> 8) & 0xff] & 0xff] ^ + td3[te1[(rdk[j + 0] >> 0) & 0xff] & 0xff]; + + rdk[j + 1] = + td0[te1[(rdk[j + 1] >> 24) & 0xff] & 0xff] ^ + td1[te1[(rdk[j + 1] >> 16) & 0xff] & 0xff] ^ + td2[te1[(rdk[j + 1] >> 8) & 0xff] & 0xff] ^ + td3[te1[(rdk[j + 1] >> 0) & 0xff] & 0xff]; + + rdk[j + 2] = + td0[te1[(rdk[j + 2] >> 24) & 0xff] & 0xff] ^ + td1[te1[(rdk[j + 2] >> 16) & 0xff] & 0xff] ^ + td2[te1[(rdk[j + 2] >> 8) & 0xff] & 0xff] ^ + td3[te1[(rdk[j + 2] >> 0) & 0xff] & 0xff]; + + rdk[j + 3] = + td0[te1[(rdk[j + 3] >> 24) & 0xff] & 0xff] ^ + td1[te1[(rdk[j + 3] >> 16) & 0xff] & 0xff] ^ + td2[te1[(rdk[j + 3] >> 8) & 0xff] & 0xff] ^ + td3[te1[(rdk[j + 3] >> 0) & 0xff] & 0xff]; + } +} + +static void AES256_encrypt (const uint *in, uint *out, const uint *rek) +{ + uint in_s[4]; + + in_s[0] = byte_swap_32 (in[0]); + in_s[1] = byte_swap_32 (in[1]); + in_s[2] = byte_swap_32 (in[2]); + in_s[3] = byte_swap_32 (in[3]); + + uint s0 = in_s[0] ^ rek[0]; + uint s1 = in_s[1] ^ rek[1]; + uint s2 = in_s[2] ^ rek[2]; + uint s3 = in_s[3] ^ rek[3]; + + uint t0; + uint t1; + uint t2; + uint t3; + + t0 = te0[s0 >> 24] ^ te1[(s1 >> 16) & 0xff] ^ te2[(s2 >> 8) & 0xff] ^ te3[s3 & 0xff] ^ rek[ 4]; + t1 = te0[s1 >> 24] ^ te1[(s2 >> 16) & 0xff] ^ te2[(s3 >> 8) & 0xff] ^ te3[s0 & 0xff] ^ rek[ 5]; + t2 = te0[s2 >> 24] ^ te1[(s3 >> 16) & 0xff] ^ te2[(s0 >> 8) & 0xff] ^ te3[s1 & 0xff] ^ rek[ 6]; + t3 = te0[s3 >> 24] ^ te1[(s0 >> 16) & 0xff] ^ te2[(s1 >> 8) & 0xff] ^ te3[s2 & 0xff] ^ rek[ 7]; + s0 = te0[t0 >> 24] ^ te1[(t1 >> 16) & 0xff] ^ te2[(t2 >> 8) & 0xff] ^ te3[t3 & 0xff] ^ rek[ 8]; + s1 = te0[t1 >> 24] ^ te1[(t2 >> 16) & 0xff] ^ te2[(t3 >> 8) & 0xff] ^ te3[t0 & 0xff] ^ rek[ 9]; + s2 = te0[t2 >> 24] ^ te1[(t3 >> 16) & 0xff] ^ te2[(t0 >> 8) & 0xff] ^ te3[t1 & 0xff] ^ rek[10]; + s3 = te0[t3 >> 24] ^ te1[(t0 >> 16) & 0xff] ^ te2[(t1 >> 8) & 0xff] ^ te3[t2 & 0xff] ^ rek[11]; + t0 = te0[s0 >> 24] ^ te1[(s1 >> 16) & 0xff] ^ te2[(s2 >> 8) & 0xff] ^ te3[s3 & 0xff] ^ rek[12]; + t1 = te0[s1 >> 24] ^ te1[(s2 >> 16) & 0xff] ^ te2[(s3 >> 8) & 0xff] ^ te3[s0 & 0xff] ^ rek[13]; + t2 = te0[s2 >> 24] ^ te1[(s3 >> 16) & 0xff] ^ te2[(s0 >> 8) & 0xff] ^ te3[s1 & 0xff] ^ rek[14]; + t3 = te0[s3 >> 24] ^ te1[(s0 >> 16) & 0xff] ^ te2[(s1 >> 8) & 0xff] ^ te3[s2 & 0xff] ^ rek[15]; + s0 = te0[t0 >> 24] ^ te1[(t1 >> 16) & 0xff] ^ te2[(t2 >> 8) & 0xff] ^ te3[t3 & 0xff] ^ rek[16]; + s1 = te0[t1 >> 24] ^ te1[(t2 >> 16) & 0xff] ^ te2[(t3 >> 8) & 0xff] ^ te3[t0 & 0xff] ^ rek[17]; + s2 = te0[t2 >> 24] ^ te1[(t3 >> 16) & 0xff] ^ te2[(t0 >> 8) & 0xff] ^ te3[t1 & 0xff] ^ rek[18]; + s3 = te0[t3 >> 24] ^ te1[(t0 >> 16) & 0xff] ^ te2[(t1 >> 8) & 0xff] ^ te3[t2 & 0xff] ^ rek[19]; + t0 = te0[s0 >> 24] ^ te1[(s1 >> 16) & 0xff] ^ te2[(s2 >> 8) & 0xff] ^ te3[s3 & 0xff] ^ rek[20]; + t1 = te0[s1 >> 24] ^ te1[(s2 >> 16) & 0xff] ^ te2[(s3 >> 8) & 0xff] ^ te3[s0 & 0xff] ^ rek[21]; + t2 = te0[s2 >> 24] ^ te1[(s3 >> 16) & 0xff] ^ te2[(s0 >> 8) & 0xff] ^ te3[s1 & 0xff] ^ rek[22]; + t3 = te0[s3 >> 24] ^ te1[(s0 >> 16) & 0xff] ^ te2[(s1 >> 8) & 0xff] ^ te3[s2 & 0xff] ^ rek[23]; + s0 = te0[t0 >> 24] ^ te1[(t1 >> 16) & 0xff] ^ te2[(t2 >> 8) & 0xff] ^ te3[t3 & 0xff] ^ rek[24]; + s1 = te0[t1 >> 24] ^ te1[(t2 >> 16) & 0xff] ^ te2[(t3 >> 8) & 0xff] ^ te3[t0 & 0xff] ^ rek[25]; + s2 = te0[t2 >> 24] ^ te1[(t3 >> 16) & 0xff] ^ te2[(t0 >> 8) & 0xff] ^ te3[t1 & 0xff] ^ rek[26]; + s3 = te0[t3 >> 24] ^ te1[(t0 >> 16) & 0xff] ^ te2[(t1 >> 8) & 0xff] ^ te3[t2 & 0xff] ^ rek[27]; + t0 = te0[s0 >> 24] ^ te1[(s1 >> 16) & 0xff] ^ te2[(s2 >> 8) & 0xff] ^ te3[s3 & 0xff] ^ rek[28]; + t1 = te0[s1 >> 24] ^ te1[(s2 >> 16) & 0xff] ^ te2[(s3 >> 8) & 0xff] ^ te3[s0 & 0xff] ^ rek[29]; + t2 = te0[s2 >> 24] ^ te1[(s3 >> 16) & 0xff] ^ te2[(s0 >> 8) & 0xff] ^ te3[s1 & 0xff] ^ rek[30]; + t3 = te0[s3 >> 24] ^ te1[(s0 >> 16) & 0xff] ^ te2[(s1 >> 8) & 0xff] ^ te3[s2 & 0xff] ^ rek[31]; + s0 = te0[t0 >> 24] ^ te1[(t1 >> 16) & 0xff] ^ te2[(t2 >> 8) & 0xff] ^ te3[t3 & 0xff] ^ rek[32]; + s1 = te0[t1 >> 24] ^ te1[(t2 >> 16) & 0xff] ^ te2[(t3 >> 8) & 0xff] ^ te3[t0 & 0xff] ^ rek[33]; + s2 = te0[t2 >> 24] ^ te1[(t3 >> 16) & 0xff] ^ te2[(t0 >> 8) & 0xff] ^ te3[t1 & 0xff] ^ rek[34]; + s3 = te0[t3 >> 24] ^ te1[(t0 >> 16) & 0xff] ^ te2[(t1 >> 8) & 0xff] ^ te3[t2 & 0xff] ^ rek[35]; + t0 = te0[s0 >> 24] ^ te1[(s1 >> 16) & 0xff] ^ te2[(s2 >> 8) & 0xff] ^ te3[s3 & 0xff] ^ rek[36]; + t1 = te0[s1 >> 24] ^ te1[(s2 >> 16) & 0xff] ^ te2[(s3 >> 8) & 0xff] ^ te3[s0 & 0xff] ^ rek[37]; + t2 = te0[s2 >> 24] ^ te1[(s3 >> 16) & 0xff] ^ te2[(s0 >> 8) & 0xff] ^ te3[s1 & 0xff] ^ rek[38]; + t3 = te0[s3 >> 24] ^ te1[(s0 >> 16) & 0xff] ^ te2[(s1 >> 8) & 0xff] ^ te3[s2 & 0xff] ^ rek[39]; + s0 = te0[t0 >> 24] ^ te1[(t1 >> 16) & 0xff] ^ te2[(t2 >> 8) & 0xff] ^ te3[t3 & 0xff] ^ rek[40]; + s1 = te0[t1 >> 24] ^ te1[(t2 >> 16) & 0xff] ^ te2[(t3 >> 8) & 0xff] ^ te3[t0 & 0xff] ^ rek[41]; + s2 = te0[t2 >> 24] ^ te1[(t3 >> 16) & 0xff] ^ te2[(t0 >> 8) & 0xff] ^ te3[t1 & 0xff] ^ rek[42]; + s3 = te0[t3 >> 24] ^ te1[(t0 >> 16) & 0xff] ^ te2[(t1 >> 8) & 0xff] ^ te3[t2 & 0xff] ^ rek[43]; + t0 = te0[s0 >> 24] ^ te1[(s1 >> 16) & 0xff] ^ te2[(s2 >> 8) & 0xff] ^ te3[s3 & 0xff] ^ rek[44]; + t1 = te0[s1 >> 24] ^ te1[(s2 >> 16) & 0xff] ^ te2[(s3 >> 8) & 0xff] ^ te3[s0 & 0xff] ^ rek[45]; + t2 = te0[s2 >> 24] ^ te1[(s3 >> 16) & 0xff] ^ te2[(s0 >> 8) & 0xff] ^ te3[s1 & 0xff] ^ rek[46]; + t3 = te0[s3 >> 24] ^ te1[(s0 >> 16) & 0xff] ^ te2[(s1 >> 8) & 0xff] ^ te3[s2 & 0xff] ^ rek[47]; + s0 = te0[t0 >> 24] ^ te1[(t1 >> 16) & 0xff] ^ te2[(t2 >> 8) & 0xff] ^ te3[t3 & 0xff] ^ rek[48]; + s1 = te0[t1 >> 24] ^ te1[(t2 >> 16) & 0xff] ^ te2[(t3 >> 8) & 0xff] ^ te3[t0 & 0xff] ^ rek[49]; + s2 = te0[t2 >> 24] ^ te1[(t3 >> 16) & 0xff] ^ te2[(t0 >> 8) & 0xff] ^ te3[t1 & 0xff] ^ rek[50]; + s3 = te0[t3 >> 24] ^ te1[(t0 >> 16) & 0xff] ^ te2[(t1 >> 8) & 0xff] ^ te3[t2 & 0xff] ^ rek[51]; + t0 = te0[s0 >> 24] ^ te1[(s1 >> 16) & 0xff] ^ te2[(s2 >> 8) & 0xff] ^ te3[s3 & 0xff] ^ rek[52]; + t1 = te0[s1 >> 24] ^ te1[(s2 >> 16) & 0xff] ^ te2[(s3 >> 8) & 0xff] ^ te3[s0 & 0xff] ^ rek[53]; + t2 = te0[s2 >> 24] ^ te1[(s3 >> 16) & 0xff] ^ te2[(s0 >> 8) & 0xff] ^ te3[s1 & 0xff] ^ rek[54]; + t3 = te0[s3 >> 24] ^ te1[(s0 >> 16) & 0xff] ^ te2[(s1 >> 8) & 0xff] ^ te3[s2 & 0xff] ^ rek[55]; + + out[0] = (te4[(t0 >> 24) & 0xff] & 0xff000000) + ^ (te4[(t1 >> 16) & 0xff] & 0x00ff0000) + ^ (te4[(t2 >> 8) & 0xff] & 0x0000ff00) + ^ (te4[(t3 >> 0) & 0xff] & 0x000000ff) + ^ rek[56]; + + out[1] = (te4[(t1 >> 24) & 0xff] & 0xff000000) + ^ (te4[(t2 >> 16) & 0xff] & 0x00ff0000) + ^ (te4[(t3 >> 8) & 0xff] & 0x0000ff00) + ^ (te4[(t0 >> 0) & 0xff] & 0x000000ff) + ^ rek[57]; + + out[2] = (te4[(t2 >> 24) & 0xff] & 0xff000000) + ^ (te4[(t3 >> 16) & 0xff] & 0x00ff0000) + ^ (te4[(t0 >> 8) & 0xff] & 0x0000ff00) + ^ (te4[(t1 >> 0) & 0xff] & 0x000000ff) + ^ rek[58]; + + out[3] = (te4[(t3 >> 24) & 0xff] & 0xff000000) + ^ (te4[(t0 >> 16) & 0xff] & 0x00ff0000) + ^ (te4[(t1 >> 8) & 0xff] & 0x0000ff00) + ^ (te4[(t2 >> 0) & 0xff] & 0x000000ff) + ^ rek[59]; + + out[0] = byte_swap_32 (out[0]); + out[1] = byte_swap_32 (out[1]); + out[2] = byte_swap_32 (out[2]); + out[3] = byte_swap_32 (out[3]); +} + +static void AES256_decrypt (const uint *in, uint *out, const uint *rdk) +{ + uint in_s[4]; + + in_s[0] = byte_swap_32 (in[0]); + in_s[1] = byte_swap_32 (in[1]); + in_s[2] = byte_swap_32 (in[2]); + in_s[3] = byte_swap_32 (in[3]); + + uint s0 = in_s[0] ^ rdk[0]; + uint s1 = in_s[1] ^ rdk[1]; + uint s2 = in_s[2] ^ rdk[2]; + uint s3 = in_s[3] ^ rdk[3]; + + uint t0; + uint t1; + uint t2; + uint t3; + + t0 = td0[s0 >> 24] ^ td1[(s3 >> 16) & 0xff] ^ td2[(s2 >> 8) & 0xff] ^ td3[s1 & 0xff] ^ rdk[ 4]; + t1 = td0[s1 >> 24] ^ td1[(s0 >> 16) & 0xff] ^ td2[(s3 >> 8) & 0xff] ^ td3[s2 & 0xff] ^ rdk[ 5]; + t2 = td0[s2 >> 24] ^ td1[(s1 >> 16) & 0xff] ^ td2[(s0 >> 8) & 0xff] ^ td3[s3 & 0xff] ^ rdk[ 6]; + t3 = td0[s3 >> 24] ^ td1[(s2 >> 16) & 0xff] ^ td2[(s1 >> 8) & 0xff] ^ td3[s0 & 0xff] ^ rdk[ 7]; + s0 = td0[t0 >> 24] ^ td1[(t3 >> 16) & 0xff] ^ td2[(t2 >> 8) & 0xff] ^ td3[t1 & 0xff] ^ rdk[ 8]; + s1 = td0[t1 >> 24] ^ td1[(t0 >> 16) & 0xff] ^ td2[(t3 >> 8) & 0xff] ^ td3[t2 & 0xff] ^ rdk[ 9]; + s2 = td0[t2 >> 24] ^ td1[(t1 >> 16) & 0xff] ^ td2[(t0 >> 8) & 0xff] ^ td3[t3 & 0xff] ^ rdk[10]; + s3 = td0[t3 >> 24] ^ td1[(t2 >> 16) & 0xff] ^ td2[(t1 >> 8) & 0xff] ^ td3[t0 & 0xff] ^ rdk[11]; + t0 = td0[s0 >> 24] ^ td1[(s3 >> 16) & 0xff] ^ td2[(s2 >> 8) & 0xff] ^ td3[s1 & 0xff] ^ rdk[12]; + t1 = td0[s1 >> 24] ^ td1[(s0 >> 16) & 0xff] ^ td2[(s3 >> 8) & 0xff] ^ td3[s2 & 0xff] ^ rdk[13]; + t2 = td0[s2 >> 24] ^ td1[(s1 >> 16) & 0xff] ^ td2[(s0 >> 8) & 0xff] ^ td3[s3 & 0xff] ^ rdk[14]; + t3 = td0[s3 >> 24] ^ td1[(s2 >> 16) & 0xff] ^ td2[(s1 >> 8) & 0xff] ^ td3[s0 & 0xff] ^ rdk[15]; + s0 = td0[t0 >> 24] ^ td1[(t3 >> 16) & 0xff] ^ td2[(t2 >> 8) & 0xff] ^ td3[t1 & 0xff] ^ rdk[16]; + s1 = td0[t1 >> 24] ^ td1[(t0 >> 16) & 0xff] ^ td2[(t3 >> 8) & 0xff] ^ td3[t2 & 0xff] ^ rdk[17]; + s2 = td0[t2 >> 24] ^ td1[(t1 >> 16) & 0xff] ^ td2[(t0 >> 8) & 0xff] ^ td3[t3 & 0xff] ^ rdk[18]; + s3 = td0[t3 >> 24] ^ td1[(t2 >> 16) & 0xff] ^ td2[(t1 >> 8) & 0xff] ^ td3[t0 & 0xff] ^ rdk[19]; + t0 = td0[s0 >> 24] ^ td1[(s3 >> 16) & 0xff] ^ td2[(s2 >> 8) & 0xff] ^ td3[s1 & 0xff] ^ rdk[20]; + t1 = td0[s1 >> 24] ^ td1[(s0 >> 16) & 0xff] ^ td2[(s3 >> 8) & 0xff] ^ td3[s2 & 0xff] ^ rdk[21]; + t2 = td0[s2 >> 24] ^ td1[(s1 >> 16) & 0xff] ^ td2[(s0 >> 8) & 0xff] ^ td3[s3 & 0xff] ^ rdk[22]; + t3 = td0[s3 >> 24] ^ td1[(s2 >> 16) & 0xff] ^ td2[(s1 >> 8) & 0xff] ^ td3[s0 & 0xff] ^ rdk[23]; + s0 = td0[t0 >> 24] ^ td1[(t3 >> 16) & 0xff] ^ td2[(t2 >> 8) & 0xff] ^ td3[t1 & 0xff] ^ rdk[24]; + s1 = td0[t1 >> 24] ^ td1[(t0 >> 16) & 0xff] ^ td2[(t3 >> 8) & 0xff] ^ td3[t2 & 0xff] ^ rdk[25]; + s2 = td0[t2 >> 24] ^ td1[(t1 >> 16) & 0xff] ^ td2[(t0 >> 8) & 0xff] ^ td3[t3 & 0xff] ^ rdk[26]; + s3 = td0[t3 >> 24] ^ td1[(t2 >> 16) & 0xff] ^ td2[(t1 >> 8) & 0xff] ^ td3[t0 & 0xff] ^ rdk[27]; + t0 = td0[s0 >> 24] ^ td1[(s3 >> 16) & 0xff] ^ td2[(s2 >> 8) & 0xff] ^ td3[s1 & 0xff] ^ rdk[28]; + t1 = td0[s1 >> 24] ^ td1[(s0 >> 16) & 0xff] ^ td2[(s3 >> 8) & 0xff] ^ td3[s2 & 0xff] ^ rdk[29]; + t2 = td0[s2 >> 24] ^ td1[(s1 >> 16) & 0xff] ^ td2[(s0 >> 8) & 0xff] ^ td3[s3 & 0xff] ^ rdk[30]; + t3 = td0[s3 >> 24] ^ td1[(s2 >> 16) & 0xff] ^ td2[(s1 >> 8) & 0xff] ^ td3[s0 & 0xff] ^ rdk[31]; + s0 = td0[t0 >> 24] ^ td1[(t3 >> 16) & 0xff] ^ td2[(t2 >> 8) & 0xff] ^ td3[t1 & 0xff] ^ rdk[32]; + s1 = td0[t1 >> 24] ^ td1[(t0 >> 16) & 0xff] ^ td2[(t3 >> 8) & 0xff] ^ td3[t2 & 0xff] ^ rdk[33]; + s2 = td0[t2 >> 24] ^ td1[(t1 >> 16) & 0xff] ^ td2[(t0 >> 8) & 0xff] ^ td3[t3 & 0xff] ^ rdk[34]; + s3 = td0[t3 >> 24] ^ td1[(t2 >> 16) & 0xff] ^ td2[(t1 >> 8) & 0xff] ^ td3[t0 & 0xff] ^ rdk[35]; + t0 = td0[s0 >> 24] ^ td1[(s3 >> 16) & 0xff] ^ td2[(s2 >> 8) & 0xff] ^ td3[s1 & 0xff] ^ rdk[36]; + t1 = td0[s1 >> 24] ^ td1[(s0 >> 16) & 0xff] ^ td2[(s3 >> 8) & 0xff] ^ td3[s2 & 0xff] ^ rdk[37]; + t2 = td0[s2 >> 24] ^ td1[(s1 >> 16) & 0xff] ^ td2[(s0 >> 8) & 0xff] ^ td3[s3 & 0xff] ^ rdk[38]; + t3 = td0[s3 >> 24] ^ td1[(s2 >> 16) & 0xff] ^ td2[(s1 >> 8) & 0xff] ^ td3[s0 & 0xff] ^ rdk[39]; + s0 = td0[t0 >> 24] ^ td1[(t3 >> 16) & 0xff] ^ td2[(t2 >> 8) & 0xff] ^ td3[t1 & 0xff] ^ rdk[40]; + s1 = td0[t1 >> 24] ^ td1[(t0 >> 16) & 0xff] ^ td2[(t3 >> 8) & 0xff] ^ td3[t2 & 0xff] ^ rdk[41]; + s2 = td0[t2 >> 24] ^ td1[(t1 >> 16) & 0xff] ^ td2[(t0 >> 8) & 0xff] ^ td3[t3 & 0xff] ^ rdk[42]; + s3 = td0[t3 >> 24] ^ td1[(t2 >> 16) & 0xff] ^ td2[(t1 >> 8) & 0xff] ^ td3[t0 & 0xff] ^ rdk[43]; + t0 = td0[s0 >> 24] ^ td1[(s3 >> 16) & 0xff] ^ td2[(s2 >> 8) & 0xff] ^ td3[s1 & 0xff] ^ rdk[44]; + t1 = td0[s1 >> 24] ^ td1[(s0 >> 16) & 0xff] ^ td2[(s3 >> 8) & 0xff] ^ td3[s2 & 0xff] ^ rdk[45]; + t2 = td0[s2 >> 24] ^ td1[(s1 >> 16) & 0xff] ^ td2[(s0 >> 8) & 0xff] ^ td3[s3 & 0xff] ^ rdk[46]; + t3 = td0[s3 >> 24] ^ td1[(s2 >> 16) & 0xff] ^ td2[(s1 >> 8) & 0xff] ^ td3[s0 & 0xff] ^ rdk[47]; + s0 = td0[t0 >> 24] ^ td1[(t3 >> 16) & 0xff] ^ td2[(t2 >> 8) & 0xff] ^ td3[t1 & 0xff] ^ rdk[48]; + s1 = td0[t1 >> 24] ^ td1[(t0 >> 16) & 0xff] ^ td2[(t3 >> 8) & 0xff] ^ td3[t2 & 0xff] ^ rdk[49]; + s2 = td0[t2 >> 24] ^ td1[(t1 >> 16) & 0xff] ^ td2[(t0 >> 8) & 0xff] ^ td3[t3 & 0xff] ^ rdk[50]; + s3 = td0[t3 >> 24] ^ td1[(t2 >> 16) & 0xff] ^ td2[(t1 >> 8) & 0xff] ^ td3[t0 & 0xff] ^ rdk[51]; + t0 = td0[s0 >> 24] ^ td1[(s3 >> 16) & 0xff] ^ td2[(s2 >> 8) & 0xff] ^ td3[s1 & 0xff] ^ rdk[52]; + t1 = td0[s1 >> 24] ^ td1[(s0 >> 16) & 0xff] ^ td2[(s3 >> 8) & 0xff] ^ td3[s2 & 0xff] ^ rdk[53]; + t2 = td0[s2 >> 24] ^ td1[(s1 >> 16) & 0xff] ^ td2[(s0 >> 8) & 0xff] ^ td3[s3 & 0xff] ^ rdk[54]; + t3 = td0[s3 >> 24] ^ td1[(s2 >> 16) & 0xff] ^ td2[(s1 >> 8) & 0xff] ^ td3[s0 & 0xff] ^ rdk[55]; + + out[0] = (td4[(t0 >> 24) & 0xff] & 0xff000000) + ^ (td4[(t3 >> 16) & 0xff] & 0x00ff0000) + ^ (td4[(t2 >> 8) & 0xff] & 0x0000ff00) + ^ (td4[(t1 >> 0) & 0xff] & 0x000000ff) + ^ rdk[56]; + + out[1] = (td4[(t1 >> 24) & 0xff] & 0xff000000) + ^ (td4[(t0 >> 16) & 0xff] & 0x00ff0000) + ^ (td4[(t3 >> 8) & 0xff] & 0x0000ff00) + ^ (td4[(t2 >> 0) & 0xff] & 0x000000ff) + ^ rdk[57]; + + out[2] = (td4[(t2 >> 24) & 0xff] & 0xff000000) + ^ (td4[(t1 >> 16) & 0xff] & 0x00ff0000) + ^ (td4[(t0 >> 8) & 0xff] & 0x0000ff00) + ^ (td4[(t3 >> 0) & 0xff] & 0x000000ff) + ^ rdk[58]; + + out[3] = (td4[(t3 >> 24) & 0xff] & 0xff000000) + ^ (td4[(t2 >> 16) & 0xff] & 0x00ff0000) + ^ (td4[(t1 >> 8) & 0xff] & 0x0000ff00) + ^ (td4[(t0 >> 0) & 0xff] & 0x000000ff) + ^ rdk[59]; + + out[0] = byte_swap_32 (out[0]); + out[1] = byte_swap_32 (out[1]); + out[2] = byte_swap_32 (out[2]); + out[3] = byte_swap_32 (out[3]); +} + +// wrappers + +void AES_set_encrypt_key (unsigned char *key, int keysize, AES_KEY *aes_key) +{ + aes_key->bits = keysize; + + if (aes_key->bits == 128) + { + AES128_ExpandKey ((const uint *) key, aes_key->rek); + } + else if (aes_key->bits == 256) + { + AES256_ExpandKey ((const uint *) key, aes_key->rek); + } +} + +void AES_set_decrypt_key (unsigned char *key, int keysize, AES_KEY *aes_key) +{ + aes_key->bits = keysize; + + if (aes_key->bits == 128) + { + AES128_ExpandKey ((const uint *) key, aes_key->rdk); + + AES128_InvertKey (aes_key->rdk); + } + else if (aes_key->bits == 256) + { + AES256_ExpandKey ((const uint *) key, aes_key->rdk); + + AES256_InvertKey (aes_key->rdk); + } +} + +void AES_encrypt (AES_KEY *aes_key, char *input, char *output) +{ + if (aes_key->bits == 128) + { + AES128_encrypt ((const uint *) input, (uint *) output, aes_key->rek); + } + else if (aes_key->bits == 256) + { + AES256_encrypt ((const uint *) input, (uint *) output, aes_key->rek); + } +} + +void AES_decrypt (AES_KEY *aes_key, char *input, char *output) +{ + if (aes_key->bits == 128) + { + AES128_decrypt ((const uint *) input, (uint *) output, aes_key->rdk); + } + else if (aes_key->bits == 256) + { + AES256_decrypt ((const uint *) input, (uint *) output, aes_key->rdk); + } +} diff --git a/include/cpu-aes.h b/include/cpu-aes.h new file mode 100644 index 0000000000..88e6a38290 --- /dev/null +++ b/include/cpu-aes.h @@ -0,0 +1,27 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#ifndef AES_H +#define AES_H + +/* AES context. */ +typedef struct aes_context +{ + uint bits; + + uint rek[60]; + uint rdk[60]; + +} aes_context_t; + +typedef aes_context_t aes_ctx; + +#define AES_KEY aes_ctx +void AES_set_encrypt_key (unsigned char *key, int keysize, AES_KEY *aes_key); +void AES_set_decrypt_key (unsigned char *key, int keysize, AES_KEY *aes_key); +void AES_encrypt (AES_KEY *aes_key, char *input, char *output); +void AES_decrypt (AES_KEY *aes_key, char *input, char *output); + +#endif diff --git a/include/cpu-crc32.h b/include/cpu-crc32.h new file mode 100644 index 0000000000..22fca71792 --- /dev/null +++ b/include/cpu-crc32.h @@ -0,0 +1,72 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +static const uint crc32tab[256] = +{ + 0x00000000, 0x77073096, 0xee0e612c, 0x990951ba, + 0x076dc419, 0x706af48f, 0xe963a535, 0x9e6495a3, + 0x0edb8832, 0x79dcb8a4, 0xe0d5e91e, 0x97d2d988, + 0x09b64c2b, 0x7eb17cbd, 0xe7b82d07, 0x90bf1d91, + 0x1db71064, 0x6ab020f2, 0xf3b97148, 0x84be41de, + 0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7, + 0x136c9856, 0x646ba8c0, 0xfd62f97a, 0x8a65c9ec, + 0x14015c4f, 0x63066cd9, 0xfa0f3d63, 0x8d080df5, + 0x3b6e20c8, 0x4c69105e, 0xd56041e4, 0xa2677172, + 0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b, + 0x35b5a8fa, 0x42b2986c, 0xdbbbc9d6, 0xacbcf940, + 0x32d86ce3, 0x45df5c75, 0xdcd60dcf, 0xabd13d59, + 0x26d930ac, 0x51de003a, 0xc8d75180, 0xbfd06116, + 0x21b4f4b5, 0x56b3c423, 0xcfba9599, 0xb8bda50f, + 0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924, + 0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d, + 0x76dc4190, 0x01db7106, 0x98d220bc, 0xefd5102a, + 0x71b18589, 0x06b6b51f, 0x9fbfe4a5, 0xe8b8d433, + 0x7807c9a2, 0x0f00f934, 0x9609a88e, 0xe10e9818, + 0x7f6a0dbb, 0x086d3d2d, 0x91646c97, 0xe6635c01, + 0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e, + 0x6c0695ed, 0x1b01a57b, 0x8208f4c1, 0xf50fc457, + 0x65b0d9c6, 0x12b7e950, 0x8bbeb8ea, 0xfcb9887c, + 0x62dd1ddf, 0x15da2d49, 0x8cd37cf3, 0xfbd44c65, + 0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2, + 0x4adfa541, 0x3dd895d7, 0xa4d1c46d, 0xd3d6f4fb, + 0x4369e96a, 0x346ed9fc, 0xad678846, 0xda60b8d0, + 0x44042d73, 0x33031de5, 0xaa0a4c5f, 0xdd0d7cc9, + 0x5005713c, 0x270241aa, 0xbe0b1010, 0xc90c2086, + 0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f, + 0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4, + 0x59b33d17, 0x2eb40d81, 0xb7bd5c3b, 0xc0ba6cad, + 0xedb88320, 0x9abfb3b6, 0x03b6e20c, 0x74b1d29a, + 0xead54739, 0x9dd277af, 0x04db2615, 0x73dc1683, + 0xe3630b12, 0x94643b84, 0x0d6d6a3e, 0x7a6a5aa8, + 0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1, + 0xf00f9344, 0x8708a3d2, 0x1e01f268, 0x6906c2fe, + 0xf762575d, 0x806567cb, 0x196c3671, 0x6e6b06e7, + 0xfed41b76, 0x89d32be0, 0x10da7a5a, 0x67dd4acc, + 0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5, + 0xd6d6a3e8, 0xa1d1937e, 0x38d8c2c4, 0x4fdff252, + 0xd1bb67f1, 0xa6bc5767, 0x3fb506dd, 0x48b2364b, + 0xd80d2bda, 0xaf0a1b4c, 0x36034af6, 0x41047a60, + 0xdf60efc3, 0xa867df55, 0x316e8eef, 0x4669be79, + 0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236, + 0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f, + 0xc5ba3bbe, 0xb2bd0b28, 0x2bb45a92, 0x5cb36a04, + 0xc2d7ffa7, 0xb5d0cf31, 0x2cd99e8b, 0x5bdeae1d, + 0x9b64c2b0, 0xec63f226, 0x756aa39c, 0x026d930a, + 0x9c0906a9, 0xeb0e363f, 0x72076785, 0x05005713, + 0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38, + 0x92d28e9b, 0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21, + 0x86d3d2d4, 0xf1d4e242, 0x68ddb3f8, 0x1fda836e, + 0x81be16cd, 0xf6b9265b, 0x6fb077e1, 0x18b74777, + 0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c, + 0x8f659eff, 0xf862ae69, 0x616bffd3, 0x166ccf45, + 0xa00ae278, 0xd70dd2ee, 0x4e048354, 0x3903b3c2, + 0xa7672661, 0xd06016f7, 0x4969474d, 0x3e6e77db, + 0xaed16a4a, 0xd9d65adc, 0x40df0b66, 0x37d83bf0, + 0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9, + 0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6, + 0xbad03605, 0xcdd70693, 0x54de5729, 0x23d967bf, + 0xb3667a2e, 0xc4614ab8, 0x5d681b02, 0x2a6f2b94, + 0xb40bbe37, 0xc30c8ea1, 0x5a05df1b, 0x2d02ef8d +}; diff --git a/include/cpu-des.c b/include/cpu-des.c new file mode 100644 index 0000000000..46e0ef5761 --- /dev/null +++ b/include/cpu-des.c @@ -0,0 +1,457 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +static const uint c_SPtrans[8][64] = +{ + { + /* nibble 0 */ + 0x02080800, 0x00080000, 0x02000002, 0x02080802, + 0x02000000, 0x00080802, 0x00080002, 0x02000002, + 0x00080802, 0x02080800, 0x02080000, 0x00000802, + 0x02000802, 0x02000000, 0x00000000, 0x00080002, + 0x00080000, 0x00000002, 0x02000800, 0x00080800, + 0x02080802, 0x02080000, 0x00000802, 0x02000800, + 0x00000002, 0x00000800, 0x00080800, 0x02080002, + 0x00000800, 0x02000802, 0x02080002, 0x00000000, + 0x00000000, 0x02080802, 0x02000800, 0x00080002, + 0x02080800, 0x00080000, 0x00000802, 0x02000800, + 0x02080002, 0x00000800, 0x00080800, 0x02000002, + 0x00080802, 0x00000002, 0x02000002, 0x02080000, + 0x02080802, 0x00080800, 0x02080000, 0x02000802, + 0x02000000, 0x00000802, 0x00080002, 0x00000000, + 0x00080000, 0x02000000, 0x02000802, 0x02080800, + 0x00000002, 0x02080002, 0x00000800, 0x00080802, + }, + { + /* nibble 1 */ + 0x40108010, 0x00000000, 0x00108000, 0x40100000, + 0x40000010, 0x00008010, 0x40008000, 0x00108000, + 0x00008000, 0x40100010, 0x00000010, 0x40008000, + 0x00100010, 0x40108000, 0x40100000, 0x00000010, + 0x00100000, 0x40008010, 0x40100010, 0x00008000, + 0x00108010, 0x40000000, 0x00000000, 0x00100010, + 0x40008010, 0x00108010, 0x40108000, 0x40000010, + 0x40000000, 0x00100000, 0x00008010, 0x40108010, + 0x00100010, 0x40108000, 0x40008000, 0x00108010, + 0x40108010, 0x00100010, 0x40000010, 0x00000000, + 0x40000000, 0x00008010, 0x00100000, 0x40100010, + 0x00008000, 0x40000000, 0x00108010, 0x40008010, + 0x40108000, 0x00008000, 0x00000000, 0x40000010, + 0x00000010, 0x40108010, 0x00108000, 0x40100000, + 0x40100010, 0x00100000, 0x00008010, 0x40008000, + 0x40008010, 0x00000010, 0x40100000, 0x00108000, + }, + { + /* nibble 2 */ + 0x04000001, 0x04040100, 0x00000100, 0x04000101, + 0x00040001, 0x04000000, 0x04000101, 0x00040100, + 0x04000100, 0x00040000, 0x04040000, 0x00000001, + 0x04040101, 0x00000101, 0x00000001, 0x04040001, + 0x00000000, 0x00040001, 0x04040100, 0x00000100, + 0x00000101, 0x04040101, 0x00040000, 0x04000001, + 0x04040001, 0x04000100, 0x00040101, 0x04040000, + 0x00040100, 0x00000000, 0x04000000, 0x00040101, + 0x04040100, 0x00000100, 0x00000001, 0x00040000, + 0x00000101, 0x00040001, 0x04040000, 0x04000101, + 0x00000000, 0x04040100, 0x00040100, 0x04040001, + 0x00040001, 0x04000000, 0x04040101, 0x00000001, + 0x00040101, 0x04000001, 0x04000000, 0x04040101, + 0x00040000, 0x04000100, 0x04000101, 0x00040100, + 0x04000100, 0x00000000, 0x04040001, 0x00000101, + 0x04000001, 0x00040101, 0x00000100, 0x04040000, + }, + { + /* nibble 3 */ + 0x00401008, 0x10001000, 0x00000008, 0x10401008, + 0x00000000, 0x10400000, 0x10001008, 0x00400008, + 0x10401000, 0x10000008, 0x10000000, 0x00001008, + 0x10000008, 0x00401008, 0x00400000, 0x10000000, + 0x10400008, 0x00401000, 0x00001000, 0x00000008, + 0x00401000, 0x10001008, 0x10400000, 0x00001000, + 0x00001008, 0x00000000, 0x00400008, 0x10401000, + 0x10001000, 0x10400008, 0x10401008, 0x00400000, + 0x10400008, 0x00001008, 0x00400000, 0x10000008, + 0x00401000, 0x10001000, 0x00000008, 0x10400000, + 0x10001008, 0x00000000, 0x00001000, 0x00400008, + 0x00000000, 0x10400008, 0x10401000, 0x00001000, + 0x10000000, 0x10401008, 0x00401008, 0x00400000, + 0x10401008, 0x00000008, 0x10001000, 0x00401008, + 0x00400008, 0x00401000, 0x10400000, 0x10001008, + 0x00001008, 0x10000000, 0x10000008, 0x10401000, + }, + { + /* nibble 4 */ + 0x08000000, 0x00010000, 0x00000400, 0x08010420, + 0x08010020, 0x08000400, 0x00010420, 0x08010000, + 0x00010000, 0x00000020, 0x08000020, 0x00010400, + 0x08000420, 0x08010020, 0x08010400, 0x00000000, + 0x00010400, 0x08000000, 0x00010020, 0x00000420, + 0x08000400, 0x00010420, 0x00000000, 0x08000020, + 0x00000020, 0x08000420, 0x08010420, 0x00010020, + 0x08010000, 0x00000400, 0x00000420, 0x08010400, + 0x08010400, 0x08000420, 0x00010020, 0x08010000, + 0x00010000, 0x00000020, 0x08000020, 0x08000400, + 0x08000000, 0x00010400, 0x08010420, 0x00000000, + 0x00010420, 0x08000000, 0x00000400, 0x00010020, + 0x08000420, 0x00000400, 0x00000000, 0x08010420, + 0x08010020, 0x08010400, 0x00000420, 0x00010000, + 0x00010400, 0x08010020, 0x08000400, 0x00000420, + 0x00000020, 0x00010420, 0x08010000, 0x08000020, + }, + { + /* nibble 5 */ + 0x80000040, 0x00200040, 0x00000000, 0x80202000, + 0x00200040, 0x00002000, 0x80002040, 0x00200000, + 0x00002040, 0x80202040, 0x00202000, 0x80000000, + 0x80002000, 0x80000040, 0x80200000, 0x00202040, + 0x00200000, 0x80002040, 0x80200040, 0x00000000, + 0x00002000, 0x00000040, 0x80202000, 0x80200040, + 0x80202040, 0x80200000, 0x80000000, 0x00002040, + 0x00000040, 0x00202000, 0x00202040, 0x80002000, + 0x00002040, 0x80000000, 0x80002000, 0x00202040, + 0x80202000, 0x00200040, 0x00000000, 0x80002000, + 0x80000000, 0x00002000, 0x80200040, 0x00200000, + 0x00200040, 0x80202040, 0x00202000, 0x00000040, + 0x80202040, 0x00202000, 0x00200000, 0x80002040, + 0x80000040, 0x80200000, 0x00202040, 0x00000000, + 0x00002000, 0x80000040, 0x80002040, 0x80202000, + 0x80200000, 0x00002040, 0x00000040, 0x80200040, + }, + { + /* nibble 6 */ + 0x00004000, 0x00000200, 0x01000200, 0x01000004, + 0x01004204, 0x00004004, 0x00004200, 0x00000000, + 0x01000000, 0x01000204, 0x00000204, 0x01004000, + 0x00000004, 0x01004200, 0x01004000, 0x00000204, + 0x01000204, 0x00004000, 0x00004004, 0x01004204, + 0x00000000, 0x01000200, 0x01000004, 0x00004200, + 0x01004004, 0x00004204, 0x01004200, 0x00000004, + 0x00004204, 0x01004004, 0x00000200, 0x01000000, + 0x00004204, 0x01004000, 0x01004004, 0x00000204, + 0x00004000, 0x00000200, 0x01000000, 0x01004004, + 0x01000204, 0x00004204, 0x00004200, 0x00000000, + 0x00000200, 0x01000004, 0x00000004, 0x01000200, + 0x00000000, 0x01000204, 0x01000200, 0x00004200, + 0x00000204, 0x00004000, 0x01004204, 0x01000000, + 0x01004200, 0x00000004, 0x00004004, 0x01004204, + 0x01000004, 0x01004200, 0x01004000, 0x00004004, + }, + { + /* nibble 7 */ + 0x20800080, 0x20820000, 0x00020080, 0x00000000, + 0x20020000, 0x00800080, 0x20800000, 0x20820080, + 0x00000080, 0x20000000, 0x00820000, 0x00020080, + 0x00820080, 0x20020080, 0x20000080, 0x20800000, + 0x00020000, 0x00820080, 0x00800080, 0x20020000, + 0x20820080, 0x20000080, 0x00000000, 0x00820000, + 0x20000000, 0x00800000, 0x20020080, 0x20800080, + 0x00800000, 0x00020000, 0x20820000, 0x00000080, + 0x00800000, 0x00020000, 0x20000080, 0x20820080, + 0x00020080, 0x20000000, 0x00000000, 0x00820000, + 0x20800080, 0x20020080, 0x20020000, 0x00800080, + 0x20820000, 0x00000080, 0x00800080, 0x20020000, + 0x20820080, 0x00800000, 0x20800000, 0x20000080, + 0x00820000, 0x00020080, 0x20020080, 0x20800000, + 0x00000080, 0x20820000, 0x00820080, 0x00000000, + 0x20000000, 0x20800080, 0x00020000, 0x00820080, + }, +}; + +static const uint c_skb[8][64] = +{ + { + /* for C bits (numbered as per FIPS 46) 1 2 3 4 5 6 */ + 0x00000000, 0x00000010, 0x20000000, 0x20000010, + 0x00010000, 0x00010010, 0x20010000, 0x20010010, + 0x00000800, 0x00000810, 0x20000800, 0x20000810, + 0x00010800, 0x00010810, 0x20010800, 0x20010810, + 0x00000020, 0x00000030, 0x20000020, 0x20000030, + 0x00010020, 0x00010030, 0x20010020, 0x20010030, + 0x00000820, 0x00000830, 0x20000820, 0x20000830, + 0x00010820, 0x00010830, 0x20010820, 0x20010830, + 0x00080000, 0x00080010, 0x20080000, 0x20080010, + 0x00090000, 0x00090010, 0x20090000, 0x20090010, + 0x00080800, 0x00080810, 0x20080800, 0x20080810, + 0x00090800, 0x00090810, 0x20090800, 0x20090810, + 0x00080020, 0x00080030, 0x20080020, 0x20080030, + 0x00090020, 0x00090030, 0x20090020, 0x20090030, + 0x00080820, 0x00080830, 0x20080820, 0x20080830, + 0x00090820, 0x00090830, 0x20090820, 0x20090830, + }, + { + /* for C bits (numbered as per FIPS 46) 7 8 10 11 12 13 */ + 0x00000000, 0x02000000, 0x00002000, 0x02002000, + 0x00200000, 0x02200000, 0x00202000, 0x02202000, + 0x00000004, 0x02000004, 0x00002004, 0x02002004, + 0x00200004, 0x02200004, 0x00202004, 0x02202004, + 0x00000400, 0x02000400, 0x00002400, 0x02002400, + 0x00200400, 0x02200400, 0x00202400, 0x02202400, + 0x00000404, 0x02000404, 0x00002404, 0x02002404, + 0x00200404, 0x02200404, 0x00202404, 0x02202404, + 0x10000000, 0x12000000, 0x10002000, 0x12002000, + 0x10200000, 0x12200000, 0x10202000, 0x12202000, + 0x10000004, 0x12000004, 0x10002004, 0x12002004, + 0x10200004, 0x12200004, 0x10202004, 0x12202004, + 0x10000400, 0x12000400, 0x10002400, 0x12002400, + 0x10200400, 0x12200400, 0x10202400, 0x12202400, + 0x10000404, 0x12000404, 0x10002404, 0x12002404, + 0x10200404, 0x12200404, 0x10202404, 0x12202404, + }, + { + /* for C bits (numbered as per FIPS 46) 14 15 16 17 19 20 */ + 0x00000000, 0x00000001, 0x00040000, 0x00040001, + 0x01000000, 0x01000001, 0x01040000, 0x01040001, + 0x00000002, 0x00000003, 0x00040002, 0x00040003, + 0x01000002, 0x01000003, 0x01040002, 0x01040003, + 0x00000200, 0x00000201, 0x00040200, 0x00040201, + 0x01000200, 0x01000201, 0x01040200, 0x01040201, + 0x00000202, 0x00000203, 0x00040202, 0x00040203, + 0x01000202, 0x01000203, 0x01040202, 0x01040203, + 0x08000000, 0x08000001, 0x08040000, 0x08040001, + 0x09000000, 0x09000001, 0x09040000, 0x09040001, + 0x08000002, 0x08000003, 0x08040002, 0x08040003, + 0x09000002, 0x09000003, 0x09040002, 0x09040003, + 0x08000200, 0x08000201, 0x08040200, 0x08040201, + 0x09000200, 0x09000201, 0x09040200, 0x09040201, + 0x08000202, 0x08000203, 0x08040202, 0x08040203, + 0x09000202, 0x09000203, 0x09040202, 0x09040203, + }, + { + /* for C bits (numbered as per FIPS 46) 21 23 24 26 27 28 */ + 0x00000000, 0x00100000, 0x00000100, 0x00100100, + 0x00000008, 0x00100008, 0x00000108, 0x00100108, + 0x00001000, 0x00101000, 0x00001100, 0x00101100, + 0x00001008, 0x00101008, 0x00001108, 0x00101108, + 0x04000000, 0x04100000, 0x04000100, 0x04100100, + 0x04000008, 0x04100008, 0x04000108, 0x04100108, + 0x04001000, 0x04101000, 0x04001100, 0x04101100, + 0x04001008, 0x04101008, 0x04001108, 0x04101108, + 0x00020000, 0x00120000, 0x00020100, 0x00120100, + 0x00020008, 0x00120008, 0x00020108, 0x00120108, + 0x00021000, 0x00121000, 0x00021100, 0x00121100, + 0x00021008, 0x00121008, 0x00021108, 0x00121108, + 0x04020000, 0x04120000, 0x04020100, 0x04120100, + 0x04020008, 0x04120008, 0x04020108, 0x04120108, + 0x04021000, 0x04121000, 0x04021100, 0x04121100, + 0x04021008, 0x04121008, 0x04021108, 0x04121108, + }, + { + /* for D bits (numbered as per FIPS 46) 1 2 3 4 5 6 */ + 0x00000000, 0x10000000, 0x00010000, 0x10010000, + 0x00000004, 0x10000004, 0x00010004, 0x10010004, + 0x20000000, 0x30000000, 0x20010000, 0x30010000, + 0x20000004, 0x30000004, 0x20010004, 0x30010004, + 0x00100000, 0x10100000, 0x00110000, 0x10110000, + 0x00100004, 0x10100004, 0x00110004, 0x10110004, + 0x20100000, 0x30100000, 0x20110000, 0x30110000, + 0x20100004, 0x30100004, 0x20110004, 0x30110004, + 0x00001000, 0x10001000, 0x00011000, 0x10011000, + 0x00001004, 0x10001004, 0x00011004, 0x10011004, + 0x20001000, 0x30001000, 0x20011000, 0x30011000, + 0x20001004, 0x30001004, 0x20011004, 0x30011004, + 0x00101000, 0x10101000, 0x00111000, 0x10111000, + 0x00101004, 0x10101004, 0x00111004, 0x10111004, + 0x20101000, 0x30101000, 0x20111000, 0x30111000, + 0x20101004, 0x30101004, 0x20111004, 0x30111004, + }, + { + /* for D bits (numbered as per FIPS 46) 8 9 11 12 13 14 */ + 0x00000000, 0x08000000, 0x00000008, 0x08000008, + 0x00000400, 0x08000400, 0x00000408, 0x08000408, + 0x00020000, 0x08020000, 0x00020008, 0x08020008, + 0x00020400, 0x08020400, 0x00020408, 0x08020408, + 0x00000001, 0x08000001, 0x00000009, 0x08000009, + 0x00000401, 0x08000401, 0x00000409, 0x08000409, + 0x00020001, 0x08020001, 0x00020009, 0x08020009, + 0x00020401, 0x08020401, 0x00020409, 0x08020409, + 0x02000000, 0x0A000000, 0x02000008, 0x0A000008, + 0x02000400, 0x0A000400, 0x02000408, 0x0A000408, + 0x02020000, 0x0A020000, 0x02020008, 0x0A020008, + 0x02020400, 0x0A020400, 0x02020408, 0x0A020408, + 0x02000001, 0x0A000001, 0x02000009, 0x0A000009, + 0x02000401, 0x0A000401, 0x02000409, 0x0A000409, + 0x02020001, 0x0A020001, 0x02020009, 0x0A020009, + 0x02020401, 0x0A020401, 0x02020409, 0x0A020409, + }, + { + /* for D bits (numbered as per FIPS 46) 16 17 18 19 20 21 */ + 0x00000000, 0x00000100, 0x00080000, 0x00080100, + 0x01000000, 0x01000100, 0x01080000, 0x01080100, + 0x00000010, 0x00000110, 0x00080010, 0x00080110, + 0x01000010, 0x01000110, 0x01080010, 0x01080110, + 0x00200000, 0x00200100, 0x00280000, 0x00280100, + 0x01200000, 0x01200100, 0x01280000, 0x01280100, + 0x00200010, 0x00200110, 0x00280010, 0x00280110, + 0x01200010, 0x01200110, 0x01280010, 0x01280110, + 0x00000200, 0x00000300, 0x00080200, 0x00080300, + 0x01000200, 0x01000300, 0x01080200, 0x01080300, + 0x00000210, 0x00000310, 0x00080210, 0x00080310, + 0x01000210, 0x01000310, 0x01080210, 0x01080310, + 0x00200200, 0x00200300, 0x00280200, 0x00280300, + 0x01200200, 0x01200300, 0x01280200, 0x01280300, + 0x00200210, 0x00200310, 0x00280210, 0x00280310, + 0x01200210, 0x01200310, 0x01280210, 0x01280310, + }, + { + /* for D bits (numbered as per FIPS 46) 22 23 24 25 27 28 */ + 0x00000000, 0x04000000, 0x00040000, 0x04040000, + 0x00000002, 0x04000002, 0x00040002, 0x04040002, + 0x00002000, 0x04002000, 0x00042000, 0x04042000, + 0x00002002, 0x04002002, 0x00042002, 0x04042002, + 0x00000020, 0x04000020, 0x00040020, 0x04040020, + 0x00000022, 0x04000022, 0x00040022, 0x04040022, + 0x00002020, 0x04002020, 0x00042020, 0x04042020, + 0x00002022, 0x04002022, 0x00042022, 0x04042022, + 0x00000800, 0x04000800, 0x00040800, 0x04040800, + 0x00000802, 0x04000802, 0x00040802, 0x04040802, + 0x00002800, 0x04002800, 0x00042800, 0x04042800, + 0x00002802, 0x04002802, 0x00042802, 0x04042802, + 0x00000820, 0x04000820, 0x00040820, 0x04040820, + 0x00000822, 0x04000822, 0x00040822, 0x04040822, + 0x00002820, 0x04002820, 0x00042820, 0x04042820, + 0x00002822, 0x04002822, 0x00042822, 0x04042822 + } +}; + +#define PERM_OP(a,b,tt,n,m) \ +{ \ + tt = a >> n; \ + tt = tt ^ b; \ + tt = tt & m; \ + b = b ^ tt; \ + tt = tt << n; \ + a = a ^ tt; \ +} + +#define HPERM_OP(a,tt,n,m) \ +{ \ + tt = a << (16 + n); \ + tt = tt ^ a; \ + tt = tt & m; \ + a = a ^ tt; \ + tt = tt >> (16 + n); \ + a = a ^ tt; \ +} + +#define IP(l,r,tt) \ +{ \ + PERM_OP (r, l, tt, 4, 0x0f0f0f0f); \ + PERM_OP (l, r, tt, 16, 0x0000ffff); \ + PERM_OP (r, l, tt, 2, 0x33333333); \ + PERM_OP (l, r, tt, 8, 0x00ff00ff); \ + PERM_OP (r, l, tt, 1, 0x55555555); \ +} + +#define FP(l,r,tt) \ +{ \ + PERM_OP (l, r, tt, 1, 0x55555555); \ + PERM_OP (r, l, tt, 8, 0x00ff00ff); \ + PERM_OP (l, r, tt, 2, 0x33333333); \ + PERM_OP (r, l, tt, 16, 0x0000ffff); \ + PERM_OP (l, r, tt, 4, 0x0f0f0f0f); \ +} + +void _des_keysetup (uint data[2], uint Kc[16], uint Kd[16], const uint s_skb[8][64]) +{ + uint c = data[0]; + uint d = data[1]; + + uint tt; + + PERM_OP (d, c, tt, 4, 0x0f0f0f0f); + HPERM_OP (c, tt, 2, 0xcccc0000); + HPERM_OP (d, tt, 2, 0xcccc0000); + PERM_OP (d, c, tt, 1, 0x55555555); + PERM_OP (c, d, tt, 8, 0x00ff00ff); + PERM_OP (d, c, tt, 1, 0x55555555); + + d = ((d & 0x000000ff) << 16) + | ((d & 0x0000ff00) << 0) + | ((d & 0x00ff0000) >> 16) + | ((c & 0xf0000000) >> 4); + + c = c & 0x0fffffff; + + int i; + + for (i = 0; i < 16; i++) + { + const uint shifts3s0[16] = { 1, 1, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 1 }; + const uint shifts3s1[16] = { 27, 27, 26, 26, 26, 26, 26, 26, 27, 26, 26, 26, 26, 26, 26, 27 }; + + c = c >> shifts3s0[i] | c << shifts3s1[i]; + d = d >> shifts3s0[i] | d << shifts3s1[i]; + + c = c & 0x0fffffff; + d = d & 0x0fffffff; + + #define BOX(v,i,S) (S)[(i)][(v)] + + uint s = BOX ((( c >> 0) & 0x3f), 0, s_skb) + | BOX ((((c >> 6) & 0x03) + | ((c >> 7) & 0x3c)), 1, s_skb) + | BOX ((((c >> 13) & 0x0f) + | ((c >> 14) & 0x30)), 2, s_skb) + | BOX ((((c >> 20) & 0x01) + | ((c >> 21) & 0x06) + | ((c >> 22) & 0x38)), 3, s_skb); + + uint t = BOX ((( d >> 0) & 0x3f), 4, s_skb) + | BOX ((((d >> 7) & 0x03) + | ((d >> 8) & 0x3c)), 5, s_skb) + | BOX ((((d >> 15) & 0x3f)), 6, s_skb) + | BOX ((((d >> 21) & 0x0f) + | ((d >> 22) & 0x30)), 7, s_skb); + + Kc[i] = ((t << 16) | (s & 0x0000ffff)); + Kd[i] = ((s >> 16) | (t & 0xffff0000)); + + Kc[i] = ROTATE_LEFT (Kc[i], 2u); + Kd[i] = ROTATE_LEFT (Kd[i], 2u); + } +} + +void _des_encrypt (uint data[2], uint Kc[16], uint Kd[16], const uint s_SPtrans[8][64]) +{ + uint r = data[0]; + uint l = data[1]; + + uint tt; + + IP (r, l, tt); + + r = ROTATE_LEFT (r, 3u); + l = ROTATE_LEFT (l, 3u); + + int i; + + for (i = 0; i < 16; i++) + { + uint u = Kc[i] ^ r; + uint t = Kd[i] ^ ROTATE_LEFT (r, 28u); + + l ^= BOX (((u >> 2) & 0x3f), 0, s_SPtrans) + | BOX (((u >> 10) & 0x3f), 2, s_SPtrans) + | BOX (((u >> 18) & 0x3f), 4, s_SPtrans) + | BOX (((u >> 26) & 0x3f), 6, s_SPtrans) + | BOX (((t >> 2) & 0x3f), 1, s_SPtrans) + | BOX (((t >> 10) & 0x3f), 3, s_SPtrans) + | BOX (((t >> 18) & 0x3f), 5, s_SPtrans) + | BOX (((t >> 26) & 0x3f), 7, s_SPtrans); + + tt = l; + l = r; + r = tt; + } + + l = ROTATE_LEFT (l, 29u); + r = ROTATE_LEFT (r, 29u); + + FP (r, l, tt); + + data[0] = l; + data[1] = r; +} + diff --git a/include/cpu-md5.c b/include/cpu-md5.c new file mode 100644 index 0000000000..cfe3f4af31 --- /dev/null +++ b/include/cpu-md5.c @@ -0,0 +1,308 @@ +#define MAGIC_A 0x67452301 +#define MAGIC_B 0xefcdab89 +#define MAGIC_C 0x98badcfe +#define MAGIC_D 0x10325476 + +#define F(x, y, z) (((x) & (y)) | ((~x) & (z))) +#define G(x, y, z) (((x) & (z)) | ((y) & (~z))) +#define H(x, y, z) ((x) ^ (y) ^ (z)) +#define I(x, y, z) ((y) ^ ((x) | (~z))) + +#define FF(a, b, c, d, x, s, ac) \ + {(a) += F ((b), (c), (d)) + (x) + (ac); \ + (a) = rotl32 ((a), (s)); \ + (a) += (b); \ + } +#define GG(a, b, c, d, x, s, ac) \ + {(a) += G ((b), (c), (d)) + (x) + (ac); \ + (a) = rotl32 ((a), (s)); \ + (a) += (b); \ + } +#define HH(a, b, c, d, x, s, ac) \ + {(a) += H ((b), (c), (d)) + (x) + (ac); \ + (a) = rotl32 ((a), (s)); \ + (a) += (b); \ + } +#define II(a, b, c, d, x, s, ac) \ + {(a) += I ((b), (c), (d)) + (x) + (ac); \ + (a) = rotl32 ((a), (s)); \ + (a) += (b); \ + } + +void md5_64 (uint block[16], uint digest[4]) +{ + uint a = digest[0]; + uint b = digest[1]; + uint c = digest[2]; + uint d = digest[3]; + + #define S11 7 + #define S12 12 + #define S13 17 + #define S14 22 + + FF ( a, b, c, d, block[ 0], S11, 0xd76aa478); + FF ( d, a, b, c, block[ 1], S12, 0xe8c7b756); + FF ( c, d, a, b, block[ 2], S13, 0x242070db); + FF ( b, c, d, a, block[ 3], S14, 0xc1bdceee); + FF ( a, b, c, d, block[ 4], S11, 0xf57c0faf); + FF ( d, a, b, c, block[ 5], S12, 0x4787c62a); + FF ( c, d, a, b, block[ 6], S13, 0xa8304613); + FF ( b, c, d, a, block[ 7], S14, 0xfd469501); + FF ( a, b, c, d, block[ 8], S11, 0x698098d8); + FF ( d, a, b, c, block[ 9], S12, 0x8b44f7af); + FF ( c, d, a, b, block[10], S13, 0xffff5bb1); + FF ( b, c, d, a, block[11], S14, 0x895cd7be); + FF ( a, b, c, d, block[12], S11, 0x6b901122); + FF ( d, a, b, c, block[13], S12, 0xfd987193); + FF ( c, d, a, b, block[14], S13, 0xa679438e); + FF ( b, c, d, a, block[15], S14, 0x49b40821); + + #define S21 5 + #define S22 9 + #define S23 14 + #define S24 20 + + GG ( a, b, c, d, block[ 1], S21, 0xf61e2562); + GG ( d, a, b, c, block[ 6], S22, 0xc040b340); + GG ( c, d, a, b, block[11], S23, 0x265e5a51); + GG ( b, c, d, a, block[ 0], S24, 0xe9b6c7aa); + GG ( a, b, c, d, block[ 5], S21, 0xd62f105d); + GG ( d, a, b, c, block[10], S22, 0x02441453); + GG ( c, d, a, b, block[15], S23, 0xd8a1e681); + GG ( b, c, d, a, block[ 4], S24, 0xe7d3fbc8); + GG ( a, b, c, d, block[ 9], S21, 0x21e1cde6); + GG ( d, a, b, c, block[14], S22, 0xc33707d6); + GG ( c, d, a, b, block[ 3], S23, 0xf4d50d87); + GG ( b, c, d, a, block[ 8], S24, 0x455a14ed); + GG ( a, b, c, d, block[13], S21, 0xa9e3e905); + GG ( d, a, b, c, block[ 2], S22, 0xfcefa3f8); + GG ( c, d, a, b, block[ 7], S23, 0x676f02d9); + GG ( b, c, d, a, block[12], S24, 0x8d2a4c8a); + + #define S31 4 + #define S32 11 + #define S33 16 + #define S34 23 + + HH ( a, b, c, d, block[ 5], S31, 0xfffa3942); + HH ( d, a, b, c, block[ 8], S32, 0x8771f681); + HH ( c, d, a, b, block[11], S33, 0x6d9d6122); + HH ( b, c, d, a, block[14], S34, 0xfde5380c); + HH ( a, b, c, d, block[ 1], S31, 0xa4beea44); + HH ( d, a, b, c, block[ 4], S32, 0x4bdecfa9); + HH ( c, d, a, b, block[ 7], S33, 0xf6bb4b60); + HH ( b, c, d, a, block[10], S34, 0xbebfbc70); + HH ( a, b, c, d, block[13], S31, 0x289b7ec6); + HH ( d, a, b, c, block[ 0], S32, 0xeaa127fa); + HH ( c, d, a, b, block[ 3], S33, 0xd4ef3085); + HH ( b, c, d, a, block[ 6], S34, 0x04881d05); + HH ( a, b, c, d, block[ 9], S31, 0xd9d4d039); + HH ( d, a, b, c, block[12], S32, 0xe6db99e5); + HH ( c, d, a, b, block[15], S33, 0x1fa27cf8); + HH ( b, c, d, a, block[ 2], S34, 0xc4ac5665); + + #define S41 6 + #define S42 10 + #define S43 15 + #define S44 21 + + II ( a, b, c, d, block[ 0], S41, 0xf4292244); + II ( d, a, b, c, block[ 7], S42, 0x432aff97); + II ( c, d, a, b, block[14], S43, 0xab9423a7); + II ( b, c, d, a, block[ 5], S44, 0xfc93a039); + II ( a, b, c, d, block[12], S41, 0x655b59c3); + II ( d, a, b, c, block[ 3], S42, 0x8f0ccc92); + II ( c, d, a, b, block[10], S43, 0xffeff47d); + II ( b, c, d, a, block[ 1], S44, 0x85845dd1); + II ( a, b, c, d, block[ 8], S41, 0x6fa87e4f); + II ( d, a, b, c, block[15], S42, 0xfe2ce6e0); + II ( c, d, a, b, block[ 6], S43, 0xa3014314); + II ( b, c, d, a, block[13], S44, 0x4e0811a1); + II ( a, b, c, d, block[ 4], S41, 0xf7537e82); + II ( d, a, b, c, block[11], S42, 0xbd3af235); + II ( c, d, a, b, block[ 2], S43, 0x2ad7d2bb); + II ( b, c, d, a, block[ 9], S44, 0xeb86d391); + + digest[0] += a; + digest[1] += b; + digest[2] += c; + digest[3] += d; +} + +// only use this when really, really needed, SLOW + +void md5_complete_no_limit (uint digest[4], uint *plain, uint plain_len) +{ + uint a = MAGIC_A; + uint b = MAGIC_B; + uint c = MAGIC_C; + uint d = MAGIC_D; + + digest[0] = a; + digest[1] = b; + digest[2] = c; + digest[3] = d; + + uint r_a = digest[0]; + uint r_b = digest[1]; + uint r_c = digest[2]; + uint r_d = digest[3]; + + uint block[16]; + int block_total_len = 16 * 4; // sizeof (block) + + char *block_ptr = (char *) block; + char *plain_ptr = (char *) plain; + + // init + + int remaining_len = plain_len; + + // loop + + uint loop = 1; + + while (loop) + { + loop = (remaining_len > 55); + + int cur_len = MIN (block_total_len, remaining_len); + int copy_len = MAX (cur_len, 0); // should never be negative of course + + memcpy (block_ptr, plain_ptr, copy_len); + + // clear the remaining bytes of the block + + memset (block_ptr + copy_len, 0, block_total_len - copy_len); + + /* + * final block + */ + + // set 0x80 if neeeded + + if (cur_len >= 0) + { + if (cur_len != block_total_len) + { + block_ptr[copy_len] = 0x80; + } + } + + // set block[14] set to total_len + + if (! loop) block[14] = plain_len * 8; + + /* + * md5 () + */ + + #define S11 7 + #define S12 12 + #define S13 17 + #define S14 22 + + FF ( a, b, c, d, block[ 0], S11, 0xd76aa478); + FF ( d, a, b, c, block[ 1], S12, 0xe8c7b756); + FF ( c, d, a, b, block[ 2], S13, 0x242070db); + FF ( b, c, d, a, block[ 3], S14, 0xc1bdceee); + FF ( a, b, c, d, block[ 4], S11, 0xf57c0faf); + FF ( d, a, b, c, block[ 5], S12, 0x4787c62a); + FF ( c, d, a, b, block[ 6], S13, 0xa8304613); + FF ( b, c, d, a, block[ 7], S14, 0xfd469501); + FF ( a, b, c, d, block[ 8], S11, 0x698098d8); + FF ( d, a, b, c, block[ 9], S12, 0x8b44f7af); + FF ( c, d, a, b, block[10], S13, 0xffff5bb1); + FF ( b, c, d, a, block[11], S14, 0x895cd7be); + FF ( a, b, c, d, block[12], S11, 0x6b901122); + FF ( d, a, b, c, block[13], S12, 0xfd987193); + FF ( c, d, a, b, block[14], S13, 0xa679438e); + FF ( b, c, d, a, block[15], S14, 0x49b40821); + + #define S21 5 + #define S22 9 + #define S23 14 + #define S24 20 + + GG ( a, b, c, d, block[ 1], S21, 0xf61e2562); + GG ( d, a, b, c, block[ 6], S22, 0xc040b340); + GG ( c, d, a, b, block[11], S23, 0x265e5a51); + GG ( b, c, d, a, block[ 0], S24, 0xe9b6c7aa); + GG ( a, b, c, d, block[ 5], S21, 0xd62f105d); + GG ( d, a, b, c, block[10], S22, 0x02441453); + GG ( c, d, a, b, block[15], S23, 0xd8a1e681); + GG ( b, c, d, a, block[ 4], S24, 0xe7d3fbc8); + GG ( a, b, c, d, block[ 9], S21, 0x21e1cde6); + GG ( d, a, b, c, block[14], S22, 0xc33707d6); + GG ( c, d, a, b, block[ 3], S23, 0xf4d50d87); + GG ( b, c, d, a, block[ 8], S24, 0x455a14ed); + GG ( a, b, c, d, block[13], S21, 0xa9e3e905); + GG ( d, a, b, c, block[ 2], S22, 0xfcefa3f8); + GG ( c, d, a, b, block[ 7], S23, 0x676f02d9); + GG ( b, c, d, a, block[12], S24, 0x8d2a4c8a); + + #define S31 4 + #define S32 11 + #define S33 16 + #define S34 23 + + HH ( a, b, c, d, block[ 5], S31, 0xfffa3942); + HH ( d, a, b, c, block[ 8], S32, 0x8771f681); + HH ( c, d, a, b, block[11], S33, 0x6d9d6122); + HH ( b, c, d, a, block[14], S34, 0xfde5380c); + HH ( a, b, c, d, block[ 1], S31, 0xa4beea44); + HH ( d, a, b, c, block[ 4], S32, 0x4bdecfa9); + HH ( c, d, a, b, block[ 7], S33, 0xf6bb4b60); + HH ( b, c, d, a, block[10], S34, 0xbebfbc70); + HH ( a, b, c, d, block[13], S31, 0x289b7ec6); + HH ( d, a, b, c, block[ 0], S32, 0xeaa127fa); + HH ( c, d, a, b, block[ 3], S33, 0xd4ef3085); + HH ( b, c, d, a, block[ 6], S34, 0x04881d05); + HH ( a, b, c, d, block[ 9], S31, 0xd9d4d039); + HH ( d, a, b, c, block[12], S32, 0xe6db99e5); + HH ( c, d, a, b, block[15], S33, 0x1fa27cf8); + HH ( b, c, d, a, block[ 2], S34, 0xc4ac5665); + + #define S41 6 + #define S42 10 + #define S43 15 + #define S44 21 + + II ( a, b, c, d, block[ 0], S41, 0xf4292244); + II ( d, a, b, c, block[ 7], S42, 0x432aff97); + II ( c, d, a, b, block[14], S43, 0xab9423a7); + II ( b, c, d, a, block[ 5], S44, 0xfc93a039); + II ( a, b, c, d, block[12], S41, 0x655b59c3); + II ( d, a, b, c, block[ 3], S42, 0x8f0ccc92); + II ( c, d, a, b, block[10], S43, 0xffeff47d); + II ( b, c, d, a, block[ 1], S44, 0x85845dd1); + II ( a, b, c, d, block[ 8], S41, 0x6fa87e4f); + II ( d, a, b, c, block[15], S42, 0xfe2ce6e0); + II ( c, d, a, b, block[ 6], S43, 0xa3014314); + II ( b, c, d, a, block[13], S44, 0x4e0811a1); + II ( a, b, c, d, block[ 4], S41, 0xf7537e82); + II ( d, a, b, c, block[11], S42, 0xbd3af235); + II ( c, d, a, b, block[ 2], S43, 0x2ad7d2bb); + II ( b, c, d, a, block[ 9], S44, 0xeb86d391); + + remaining_len -= block_total_len; + + plain_ptr += 64; + + a += r_a; + b += r_b; + c += r_c; + d += r_d; + + digest[0] = a; + digest[1] = b; + digest[2] = c; + digest[3] = d; + + r_a = digest[0]; + r_b = digest[1]; + r_c = digest[2]; + r_d = digest[3]; + } +} diff --git a/include/cpu-sha256.c b/include/cpu-sha256.c new file mode 100644 index 0000000000..2f111f3229 --- /dev/null +++ b/include/cpu-sha256.c @@ -0,0 +1,136 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +void sha256_64 (uint block[16], uint digest[8]) +{ + #define SHIFT_RIGHT_32(x,n) ((x) >> (n)) + + #define SHA256_S0(x) (rotl32 ((x), 25u) ^ rotl32 ((x), 14u) ^ SHIFT_RIGHT_32 ((x), 3u)) + #define SHA256_S1(x) (rotl32 ((x), 15u) ^ rotl32 ((x), 13u) ^ SHIFT_RIGHT_32 ((x), 10u)) + #define SHA256_S2(x) (rotl32 ((x), 30u) ^ rotl32 ((x), 19u) ^ rotl32 ((x), 10u)) + #define SHA256_S3(x) (rotl32 ((x), 26u) ^ rotl32 ((x), 21u) ^ rotl32 ((x), 7u)) + + #define SHA256_F0(x,y,z) (((x) & (y)) | ((z) & ((x) ^ (y)))) + #define SHA256_F1(x,y,z) ((z) ^ ((x) & ((y) ^ (z)))) + + #define SHA256_F0o(x,y,z) (SHA256_F0 ((x), (y), (z))) + #define SHA256_F1o(x,y,z) (SHA256_F1 ((x), (y), (z))) + + #define SHA256_STEP(F0,F1,a,b,c,d,e,f,g,h,x,K) \ + { \ + h += K; \ + h += x; \ + h += SHA256_S3 (e); \ + h += F1 (e,f,g); \ + d += h; \ + h += SHA256_S2 (a); \ + h += F0 (a,b,c); \ + } + + #define SHA256_EXPAND(x,y,z,w) (SHA256_S1 (x) + y + SHA256_S0 (z) + w) + + uint w0_t = block[ 0]; + uint w1_t = block[ 1]; + uint w2_t = block[ 2]; + uint w3_t = block[ 3]; + uint w4_t = block[ 4]; + uint w5_t = block[ 5]; + uint w6_t = block[ 6]; + uint w7_t = block[ 7]; + uint w8_t = block[ 8]; + uint w9_t = block[ 9]; + uint wa_t = block[10]; + uint wb_t = block[11]; + uint wc_t = block[12]; + uint wd_t = block[13]; + uint we_t = block[14]; + uint wf_t = block[15]; + + uint a = digest[0]; + uint b = digest[1]; + uint c = digest[2]; + uint d = digest[3]; + uint e = digest[4]; + uint f = digest[5]; + uint g = digest[6]; + uint h = digest[7]; + + SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C00); + SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C01); + SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C02); + SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C03); + SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C04); + SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C05); + SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C06); + SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C07); + SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C08); + SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C09); + SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C0a); + SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C0b); + SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C0c); + SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C0d); + SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C0e); + SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C0f); + + w0_t = SHA256_EXPAND (we_t, w9_t, w1_t, w0_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C10); + w1_t = SHA256_EXPAND (wf_t, wa_t, w2_t, w1_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C11); + w2_t = SHA256_EXPAND (w0_t, wb_t, w3_t, w2_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C12); + w3_t = SHA256_EXPAND (w1_t, wc_t, w4_t, w3_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C13); + w4_t = SHA256_EXPAND (w2_t, wd_t, w5_t, w4_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C14); + w5_t = SHA256_EXPAND (w3_t, we_t, w6_t, w5_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C15); + w6_t = SHA256_EXPAND (w4_t, wf_t, w7_t, w6_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C16); + w7_t = SHA256_EXPAND (w5_t, w0_t, w8_t, w7_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C17); + w8_t = SHA256_EXPAND (w6_t, w1_t, w9_t, w8_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C18); + w9_t = SHA256_EXPAND (w7_t, w2_t, wa_t, w9_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C19); + wa_t = SHA256_EXPAND (w8_t, w3_t, wb_t, wa_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C1a); + wb_t = SHA256_EXPAND (w9_t, w4_t, wc_t, wb_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C1b); + wc_t = SHA256_EXPAND (wa_t, w5_t, wd_t, wc_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C1c); + wd_t = SHA256_EXPAND (wb_t, w6_t, we_t, wd_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C1d); + we_t = SHA256_EXPAND (wc_t, w7_t, wf_t, we_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C1e); + wf_t = SHA256_EXPAND (wd_t, w8_t, w0_t, wf_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C1f); + + w0_t = SHA256_EXPAND (we_t, w9_t, w1_t, w0_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C20); + w1_t = SHA256_EXPAND (wf_t, wa_t, w2_t, w1_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C21); + w2_t = SHA256_EXPAND (w0_t, wb_t, w3_t, w2_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C22); + w3_t = SHA256_EXPAND (w1_t, wc_t, w4_t, w3_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C23); + w4_t = SHA256_EXPAND (w2_t, wd_t, w5_t, w4_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C24); + w5_t = SHA256_EXPAND (w3_t, we_t, w6_t, w5_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C25); + w6_t = SHA256_EXPAND (w4_t, wf_t, w7_t, w6_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C26); + w7_t = SHA256_EXPAND (w5_t, w0_t, w8_t, w7_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C27); + w8_t = SHA256_EXPAND (w6_t, w1_t, w9_t, w8_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C28); + w9_t = SHA256_EXPAND (w7_t, w2_t, wa_t, w9_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C29); + wa_t = SHA256_EXPAND (w8_t, w3_t, wb_t, wa_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C2a); + wb_t = SHA256_EXPAND (w9_t, w4_t, wc_t, wb_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C2b); + wc_t = SHA256_EXPAND (wa_t, w5_t, wd_t, wc_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C2c); + wd_t = SHA256_EXPAND (wb_t, w6_t, we_t, wd_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C2d); + we_t = SHA256_EXPAND (wc_t, w7_t, wf_t, we_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C2e); + wf_t = SHA256_EXPAND (wd_t, w8_t, w0_t, wf_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C2f); + + w0_t = SHA256_EXPAND (we_t, w9_t, w1_t, w0_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C30); + w1_t = SHA256_EXPAND (wf_t, wa_t, w2_t, w1_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C31); + w2_t = SHA256_EXPAND (w0_t, wb_t, w3_t, w2_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C32); + w3_t = SHA256_EXPAND (w1_t, wc_t, w4_t, w3_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C33); + w4_t = SHA256_EXPAND (w2_t, wd_t, w5_t, w4_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C34); + w5_t = SHA256_EXPAND (w3_t, we_t, w6_t, w5_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C35); + w6_t = SHA256_EXPAND (w4_t, wf_t, w7_t, w6_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C36); + w7_t = SHA256_EXPAND (w5_t, w0_t, w8_t, w7_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C37); + w8_t = SHA256_EXPAND (w6_t, w1_t, w9_t, w8_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C38); + w9_t = SHA256_EXPAND (w7_t, w2_t, wa_t, w9_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C39); + wa_t = SHA256_EXPAND (w8_t, w3_t, wb_t, wa_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C3a); + wb_t = SHA256_EXPAND (w9_t, w4_t, wc_t, wb_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C3b); + wc_t = SHA256_EXPAND (wa_t, w5_t, wd_t, wc_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C3c); + wd_t = SHA256_EXPAND (wb_t, w6_t, we_t, wd_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C3d); + we_t = SHA256_EXPAND (wc_t, w7_t, wf_t, we_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C3e); + wf_t = SHA256_EXPAND (wd_t, w8_t, w0_t, wf_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C3f); + + digest[0] += a; + digest[1] += b; + digest[2] += c; + digest[3] += d; + digest[4] += e; + digest[5] += f; + digest[6] += g; + digest[7] += h; +} diff --git a/include/ext_ADL.h b/include/ext_ADL.h new file mode 100644 index 0000000000..82bad73bb6 --- /dev/null +++ b/include/ext_ADL.h @@ -0,0 +1,96 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#ifndef EXT_ADL_H +#define EXT_ADL_H + +#include + +// this is ugly but ADL requires the bool datatype + +typedef int bool; + +#include + +typedef int HM_ADAPTER; + +#ifdef _POSIX +void *GetProcAddress (void *pLibrary, const char *name); +#endif + +typedef struct +{ + ADLOD6StateInfo state; + ADLOD6PerformanceLevel level; + +} ADLOD6MemClockState; + +typedef int (*ADL_MAIN_CONTROL_DESTROY) (); +typedef int (*ADL_MAIN_CONTROL_CREATE) (ADL_MAIN_MALLOC_CALLBACK, int); +typedef int (*ADL_ADAPTER_NUMBEROFADAPTERS_GET) (int *); +typedef int (*ADL_ADAPTER_ADAPTERINFO_GET) (LPAdapterInfo, int); +typedef int (*ADL_DISPLAY_DISPLAYINFO_GET) (int, int *, ADLDisplayInfo **, int); +typedef int (*ADL_OVERDRIVE5_TEMPERATURE_GET) (int, int, ADLTemperature *); +typedef int (*ADL_OVERDRIVE6_TEMPERATURE_GET) (int, int *); +typedef int (*HC_ADL_OVERDRIVE5_CURRENTACTIVITY_GET) (int, ADLPMActivity *); +typedef int (*HC_ADL_OVERDRIVE5_THERMALDEVICES_ENUM) (int, int, ADLThermalControllerInfo *); +typedef int (*HC_ADL_ADAPTER_ID_GET) (int, int *); +typedef int (*HC_ADL_ADAPTER_VIDEOBIOSINFO_GET) (int, ADLBiosInfo *); +typedef int (*HC_ADL_OVERDRIVE5_FANSPEEDINFO_GET) (int, int, ADLFanSpeedInfo *); +typedef int (*ADL_OVERDRIVE5_FANSPEED_GET) (int, int, ADLFanSpeedValue *); +typedef int (*ADL_OVERDRIVE6_FANSPEED_GET) (int, ADLOD6FanSpeedInfo *); +typedef int (*ADL_OVERDRIVE5_FANSPEED_SET) (int, int, ADLFanSpeedValue *); +typedef int (*ADL_OVERDRIVE6_FANSPEED_SET) (int, ADLOD6FanSpeedValue *); +typedef int (*ADL_OVERDRIVE5_FANSPEEDTODEFAULT_SET) (int, int); +typedef int (*HC_ADL_OVERDRIVE5_ODPARAMETERS_GET) (int, ADLODParameters *); +typedef int (*HC_ADL_OVERDRIVE5_ODPERFORMANCELEVELS_GET) (int, int, ADLODPerformanceLevels *); +typedef int (*HC_ADL_OVERDRIVE5_ODPERFORMANCELEVELS_SET) (int, ADLODPerformanceLevels *); +typedef int (*HC_ADL_OVERDRIVE6_POWERCONTROL_SET) (int, int); +typedef int (*HC_ADL_OVERDRIVE6_POWERCONTROL_GET) (int, int *, int *); +typedef int (*HC_ADL_OVERDRIVE6_POWERCONTROLINFO_GET) (int, ADLOD6PowerControlInfo *); +typedef int (*ADL_ADAPTER_ACTIVE_GET) (int, int *); +typedef int (*ADL_DISPLAYENABLE_SET) (int, int *, int, int); +typedef int (*ADL_OVERDRIVE_CAPS) (int, int *, int *, int *); +typedef int (*ADL_OVERDRIVE6_CURRENTSTATUS_GET) (int, ADLOD6CurrentStatus *); +typedef int (*ADL_OVERDRIVE6_STATEINFO_GET) (int, int, ADLOD6MemClockState *); +typedef int (*ADL_OVERDRIVE6_CAPABILITIES_GET) (int, ADLOD6Capabilities *); +typedef int (*ADL_OVERDRIVE6_STATE_SET) (int, int, ADLOD6StateInfo *); +typedef int (*ADL_OVERDRIVE6_POWERCONTROL_CAPS) (int, int *); +typedef int (*ADL_OVERDRIVE6_TARGETTEMPERATUREDATA_GET) (int, int *, int *); + +int hc_ADL_Main_Control_Destroy (HM_LIB hDLL); +int hc_ADL_Main_Control_Create (HM_LIB hDLL, ADL_MAIN_MALLOC_CALLBACK callback, int iEnumConnectedAdapters); +int hc_ADL_Adapter_NumberOfAdapters_Get (HM_LIB hDLL, int *lpNumAdapters); +int hc_ADL_Adapter_AdapterInfo_Get (HM_LIB hDLL, LPAdapterInfo lpInfo, int iInputSize); +int hc_ADL_Display_DisplayInfo_Get (HM_LIB hDLL, int iAdapterIndex, int *iNumDisplays, ADLDisplayInfo **lppInfo, int iForceDetect); +int hc_ADL_Overdrive5_Temperature_Get (HM_LIB hDLL, int iAdapterIndex, int iThermalControllerIndex, ADLTemperature *lpTemperature); +int hc_ADL_Overdrive6_Temperature_Get (HM_LIB hDLL, int iAdapterIndex, int *iTemperature); +int hc_ADL_Overdrive_CurrentActivity_Get (HM_LIB hDLL, int iAdapterIndex, ADLPMActivity *lpActivity); +int hc_ADL_Overdrive_ThermalDevices_Enum (HM_LIB hDLL, int iAdapterIndex, int iThermalControllerIndex, ADLThermalControllerInfo *lpThermalControllerInfo); +int hc_ADL_Adapter_ID_Get (HM_LIB hDLL, int iAdapterIndex, int *lpAdapterID); +int hc_ADL_Adapter_VideoBiosInfo_Get (HM_LIB hDLL, int iAdapterIndex, ADLBiosInfo *lpBiosInfo); +int hc_ADL_Overdrive5_FanSpeedInfo_Get (HM_LIB hDLL, int iAdapterIndex, int iThermalControllerIndex, ADLFanSpeedInfo *lpFanSpeedInfo); +int hc_ADL_Overdrive5_FanSpeed_Get (HM_LIB hDLL, int iAdapterIndex, int iThermalControllerIndex, ADLFanSpeedValue *lpFanSpeedValue); +int hc_ADL_Overdrive6_FanSpeed_Get (HM_LIB hDLL, int iAdapterIndex, ADLOD6FanSpeedInfo *lpFanSpeedInfo); +int hc_ADL_Overdrive5_FanSpeed_Set (HM_LIB hDLL, int iAdapterIndex, int iThermalControllerIndex, ADLFanSpeedValue *lpFanSpeedValue); +int hc_ADL_Overdrive6_FanSpeed_Set (HM_LIB hDLL, int iAdapterIndex, ADLOD6FanSpeedValue *lpFanSpeedValue); +int hc_ADL_Overdrive5_FanSpeedToDefault_Set (HM_LIB hDLL, int iAdapterIndex, int iThermalControllerIndex); +int hc_ADL_Overdrive_ODParameters_Get (HM_LIB hDLL, int iAdapterIndex, ADLODParameters *lpOdParameters); +int hc_ADL_Overdrive_ODPerformanceLevels_Get (HM_LIB hDLL, int iAdapterIndex, int iDefault, ADLODPerformanceLevels *lpOdPerformanceLevels); +int hc_ADL_Overdrive_ODPerformanceLevels_Set (HM_LIB hDLL, int iAdapterIndex, ADLODPerformanceLevels *lpOdPerformanceLevels); +int hc_ADL_Overdrive_PowerControlInfo_Get (HM_LIB hDLL, int iAdapterIndex, ADLOD6PowerControlInfo *); +int hc_ADL_Overdrive_PowerControl_Get (HM_LIB hDLL, int iAdapterIndex, int *level); +int hc_ADL_Overdrive_PowerControl_Set (HM_LIB hDLL, int iAdapterIndex, int level); +int hc_ADL_Adapter_Active_Get (HM_LIB hDLL, int iAdapterIndex, int *lpStatus); +int hc_ADL_DisplayEnable_Set (HM_LIB hDLL, int iAdapterIndex, int *lpDisplayIndexList, int iDisplayListSize, int bPersistOnly); +int hc_ADL_Overdrive_Caps (HM_LIB hDLL, int iAdapterIndex, int *od_supported, int *od_enabled, int *od_version); +int hc_ADL_Overdrive_CurrentStatus_Get (HM_LIB hDLL, int iAdapterIndex, ADLOD6CurrentStatus *status); +int hc_ADL_Overdrive_StateInfo_Get (HM_LIB hDLL, int iAdapterIndex, int type, ADLOD6MemClockState *state); +int hc_ADL_Overdrive_Capabilities_Get (HM_LIB hDLL, int iAdapterIndex, ADLOD6Capabilities *caps); +int hc_ADL_Overdrive_State_Set (HM_LIB hDLL, int iAdapterIndex, int type, ADLOD6StateInfo *state); +int hc_ADL_Overdrive6_PowerControl_Caps (HM_LIB hDLL, int iAdapterIndex, int *lpSupported); +int hc_ADL_Overdrive6_TargetTemperatureData_Get (HM_LIB hDLL, int iAdapterIndex, int *cur_temp, int *default_temp); + +#endif diff --git a/include/ext_OpenCL.h b/include/ext_OpenCL.h new file mode 100644 index 0000000000..ccbc45aaa7 --- /dev/null +++ b/include/ext_OpenCL.h @@ -0,0 +1,53 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#ifndef EXT_OPENCL_H +#define EXT_OPENCL_H + +#include + +#ifdef OSX +#include +#endif + +#ifdef WIN +#include +// #include // used for CL_DEVICE_TOPOLOGY_AMD but broken for dual GPU +#endif + +#ifdef LINUX +#include +// #include // used for CL_DEVICE_TOPOLOGY_AMD but broken for dual GPU +#endif + +void hc_clBuildProgram (cl_program program, cl_uint num_devices, const cl_device_id *device_list, const char *options, void (CL_CALLBACK *pfn_notify) (cl_program program, void *user_data), void *user_data); +cl_mem hc_clCreateBuffer (cl_context context, cl_mem_flags flags, size_t size, void *host_ptr); +//cl_command_queue hc_clCreateCommandQueue (cl_context context, cl_device_id device, cl_command_queue_properties properties); +cl_command_queue hc_clCreateCommandQueueWithProperties (cl_context context, cl_device_id device, const cl_queue_properties *properties); +cl_context hc_clCreateContext (cl_context_properties *properties, cl_uint num_devices, const cl_device_id *devices, void (CL_CALLBACK *pfn_notify) (const char *, const void *, size_t, void *), void *user_data); +cl_kernel hc_clCreateKernel (cl_program program, const char *kernel_name); +cl_program hc_clCreateProgramWithSource (cl_context context, cl_uint count, const char **strings, const size_t *lengths); +cl_program hc_clCreateProgramWithBinary (cl_context context, cl_uint num_devices, const cl_device_id *device_list, const size_t *lengths, const unsigned char **binaries, cl_int *binary_status); +void hc_clEnqueueNDRangeKernel (cl_command_queue command_queue, cl_kernel kernel, cl_uint work_dim, const size_t *global_work_offset, const size_t *global_work_size, const size_t *local_work_size, cl_uint num_events_in_wait_list, const cl_event *event_wait_list, cl_event *event); +void hc_clEnqueueReadBuffer (cl_command_queue command_queue, cl_mem buffer, cl_bool blocking_read, size_t offset, size_t cb, void *ptr, cl_uint num_events_in_wait_list, const cl_event *event_wait_list, cl_event *event); +void hc_clEnqueueWriteBuffer (cl_command_queue command_queue, cl_mem buffer, cl_bool blocking_write, size_t offset, size_t cb, const void *ptr, cl_uint num_events_in_wait_list, const cl_event *event_wait_list, cl_event *event); +void hc_clEnqueueCopyBuffer (cl_command_queue command_queue, cl_mem src_buffer, cl_mem dst_buffer, size_t src_offset, size_t dst_offset, size_t cb, cl_uint num_events_in_wait_list, const cl_event *event_wait_list, cl_event *event); +void hc_clFlush (cl_command_queue command_queue); +void hc_clFinish (cl_command_queue command_queue); +void hc_clGetDeviceIDs (cl_platform_id platform, cl_device_type device_type, cl_uint num_entries, cl_device_id *devices, cl_uint *num_devices); +void hc_clGetDeviceInfo (cl_device_id device, cl_device_info param_name, size_t param_value_size, void *param_value, size_t *param_value_size_ret); +void hc_clGetPlatformIDs (cl_uint num_entries, cl_platform_id *platforms, cl_uint *num_platforms); +void hc_clGetPlatformInfo (cl_platform_id platform, cl_platform_info param_name, size_t param_value_size, void *param_value, size_t *param_value_size_ret); +void hc_clReleaseCommandQueue (cl_command_queue command_queue); +void hc_clReleaseContext (cl_context context); +void hc_clReleaseKernel (cl_kernel kernel); +void hc_clReleaseMemObject (cl_mem mem); +void hc_clReleaseProgram (cl_program program); +void hc_clSetKernelArg (cl_kernel kernel, cl_uint arg_index, size_t arg_size, const void *arg_value); +void *hc_clEnqueueMapBuffer (cl_command_queue command_queue, cl_mem buffer, cl_bool blocking_map, cl_map_flags map_flags, size_t offset, size_t cb, cl_uint num_events_in_wait_list, const cl_event *event_wait_list, cl_event *event); +void hc_clEnqueueUnmapMemObject (cl_command_queue command_queue, cl_mem memobj, void *mapped_ptr, cl_uint num_events_in_wait_list, const cl_event *event_wait_list, cl_event *event); +void hc_clEnqueueFillBuffer (cl_command_queue command_queue, cl_mem buffer, const void *pattern, size_t pattern_size, size_t offset, size_t size, cl_uint num_events_in_wait_list, const cl_event *event_wait_list, cl_event *event); + +#endif diff --git a/include/ext_cuda.h b/include/ext_cuda.h new file mode 100644 index 0000000000..c034e469c6 --- /dev/null +++ b/include/ext_cuda.h @@ -0,0 +1,60 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#ifndef EXT_CUDA_H +#define EXT_CUDA_H + +#include + +#include + +void hc_cuDeviceGetCount (int *count); +void hc_cuDeviceGet (CUdevice *device, int ordinal); +void hc_cuDeviceGetName (char *name, int len, CUdevice dev); +void hc_cuDeviceTotalMem (size_t *bytes, CUdevice dev); +void hc_cuDeviceGetAttribute (int *pi, CUdevice_attribute attrib, CUdevice dev); +void hc_cuCtxCreate (CUcontext *pctx, unsigned int flags, CUdevice dev); +void hc_cuMemAllocHost (void **pp, size_t bytesize); +void hc_cuMemAlloc (CUdeviceptr *dptr, size_t bytesize); +void hc_cuMemsetD8 (CUdeviceptr dstDevice, unsigned char uc, unsigned int N); +void hc_cuMemsetD32 (CUdeviceptr dstDevice, unsigned int ui, unsigned int N); +void hc_cuMemcpyDtoD (CUdeviceptr dstDevice, CUdeviceptr srcDevice, size_t ByteCount); +void hc_cuMemcpyDtoDAsync (CUdeviceptr dstDevice, CUdeviceptr srcDevice, size_t ByteCount, CUstream hStream); +void hc_cuMemcpyHtoD (CUdeviceptr dstDevice, const void *srcHost, size_t ByteCount); +void hc_cuMemcpyHtoDAsync (CUdeviceptr dstDevice, const void *srcHost, size_t ByteCount, CUstream hStream); +void hc_cuMemcpyDtoH (void *dstHost, CUdeviceptr srcDevice, size_t ByteCount); +void hc_cuMemcpyDtoHAsync (void *dstHost, CUdeviceptr srcDevice, size_t ByteCount, CUstream hStream); +void hc_cuEventCreate (CUevent *phEvent, unsigned int Flags); +void hc_cuStreamCreate (CUstream *phStream, unsigned int Flags); +void hc_cuDeviceComputeCapability (int *major, int *minor, CUdevice dev); +void hc_cuModuleLoad (CUmodule *module, const char *fname); +void hc_cuModuleLoadData (CUmodule *module, const void *image); +void hc_cuModuleGetFunction (CUfunction *hfunc, CUmodule hmod, const char *name); +void hc_cuFuncSetBlockShape (CUfunction hfunc, int x, int y, int z); +void hc_cuParamSetSize (CUfunction hfunc, unsigned int numbytes); +void hc_cuParamSetv (CUfunction hfunc, int offset, void *ptr, unsigned int numbytes); +void hc_cuParamSeti (CUfunction hfunc, int offset, unsigned int value); +void hc_cuModuleGetGlobal (CUdeviceptr *dptr, size_t *bytes, CUmodule hmod, const char *name); +void hc_cuCtxPopCurrent (CUcontext *pctx); +void hc_cuCtxPushCurrent (CUcontext ctx); +void hc_cuLaunchKernel (CUfunction f, unsigned int gridDimX, unsigned int gridDimY, unsigned int gridDimZ, unsigned int blockDimX, unsigned int blockDimY, unsigned int blockDimZ, unsigned int sharedMemBytes, CUstream hStream, void **kernelParams, void **extra); +void hc_cuLaunchGrid (CUfunction f, int grid_width, int grid_height); +void hc_cuLaunchGridAsync (CUfunction f, int grid_width, int grid_height, CUstream hStream); +void hc_cuEventSynchronize (CUevent hEvent); +void hc_cuStreamSynchronize (CUstream hStream); +void hc_cuMemFreeHost (void *p); +void hc_cuMemFree (CUdeviceptr dptr); +void hc_cuEventDestroy (CUevent hEvent); +void hc_cuStreamDestroy (CUstream hStream); +void hc_cuModuleUnload (CUmodule hmod); +void hc_cuCtxDestroy (CUcontext ctx); +void hc_cuCtxAttach (CUcontext *pctx, unsigned int flags); +void hc_cuCtxDetach (CUcontext ctx); +void hc_cuCtxSynchronize (void); +void hc_cuCtxSetCacheConfig (CUfunc_cache config); +void hc_cuDriverGetVersion (int *driverVersion); +void hc_cuModuleLoadDataEx (CUmodule *module, const void *image, unsigned int numOptions, CUjit_option *options, void **optionValues); + +#endif diff --git a/include/ext_dummy.h b/include/ext_dummy.h new file mode 100644 index 0000000000..fd923231b4 --- /dev/null +++ b/include/ext_dummy.h @@ -0,0 +1,13 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#ifndef EXT_SMI_H +#define EXT_SMI_H + +#include + +typedef int HM_ADAPTER; + +#endif diff --git a/include/ext_nvapi.h b/include/ext_nvapi.h new file mode 100644 index 0000000000..0d7a8fdadc --- /dev/null +++ b/include/ext_nvapi.h @@ -0,0 +1,64 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#ifndef EXT_NVAPI_H +#define EXT_NVAPI_H + +#include + +// Just annotations (they do nothing special) +#ifndef __success +#define __success(x) +#endif +#ifndef __in +#define __in +#endif +#ifndef __out +#define __out +#endif +#ifndef __in_ecount +#define __in_ecount(x) +#endif +#ifndef __out_ecount +#define __out_ecount(x) +#endif +#ifndef __in_opt +#define __in_opt +#endif +#ifndef __out_opt +#define __out_opt +#endif +#ifndef __inout +#define __inout +#endif +#ifndef __inout_opt +#define __inout_opt +#endif +#ifndef __inout_ecount +#define __inout_ecount(x) +#endif +#ifndef __inout_ecount_full +#define __inout_ecount_full(x) +#endif +#ifndef __inout_ecount_part_opt +#define __inout_ecount_part_opt(x,y) +#endif +#ifndef __inout_ecount_full_opt +#define __inout_ecount_full_opt(x,y) +#endif +#ifndef __out_ecount_full_opt +#define __out_ecount_full_opt(x) +#endif + +#include + +typedef NvPhysicalGpuHandle HM_ADAPTER; + +int hc_NvAPI_EnumPhysicalGPUs (NvPhysicalGpuHandle nvGPUHandle[NVAPI_MAX_PHYSICAL_GPUS], NvU32 *pGpuCount); +int hc_NvAPI_GPU_GetThermalSettings (NvPhysicalGpuHandle hPhysicalGpu, NvU32 sensorIndex, NV_GPU_THERMAL_SETTINGS *pThermalSettings); +int hc_NvAPI_GPU_GetTachReading (NvPhysicalGpuHandle hPhysicalGPU, NvU32 *pValue); +int hc_NvAPI_GPU_GetDynamicPstatesInfoEx (NvPhysicalGpuHandle hPhysicalGpu, NV_GPU_DYNAMIC_PSTATES_INFO_EX *pDynamicPstatesInfoEx); + +#endif diff --git a/include/ext_nvml.h b/include/ext_nvml.h new file mode 100644 index 0000000000..fb69097246 --- /dev/null +++ b/include/ext_nvml.h @@ -0,0 +1,24 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#ifndef EXT_NVML_H +#define EXT_NVML_H + +#include + +#include + +typedef nvmlDevice_t HM_ADAPTER; + +nvmlReturn_t hc_NVML_nvmlInit (void); +nvmlReturn_t hc_NVML_nvmlShutdown (void); +nvmlReturn_t hc_NVML_nvmlDeviceGetName (nvmlDevice_t device, char *name, unsigned int length); +nvmlReturn_t hc_NVML_nvmlDeviceGetHandleByIndex (unsigned int index, nvmlDevice_t *device); +nvmlReturn_t hc_NVML_nvmlDeviceGetTemperature (nvmlDevice_t device, nvmlTemperatureSensors_t sensorType, unsigned int *temp); +nvmlReturn_t hc_NVML_nvmlDeviceGetFanSpeed (nvmlDevice_t device, unsigned int *speed); +nvmlReturn_t hc_NVML_nvmlDeviceGetPowerUsage (nvmlDevice_t device, unsigned int *power); +nvmlReturn_t hc_NVML_nvmlDeviceGetUtilizationRates (nvmlDevice_t device, nvmlUtilization_t *utilization); + +#endif diff --git a/include/ext_smi.h b/include/ext_smi.h new file mode 100644 index 0000000000..4afaa8aea0 --- /dev/null +++ b/include/ext_smi.h @@ -0,0 +1,18 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#ifndef EXT_SMI_H +#define EXT_SMI_H + +#include + +#define SMI_OK 0 +#define SMI_NOBIN 1 + +typedef int HM_ADAPTER; + +int hc_nvidia_smi (int dev, int *temperature, int *gpu); + +#endif diff --git a/include/kernel_functions.c b/include/kernel_functions.c new file mode 100644 index 0000000000..6d1989b647 --- /dev/null +++ b/include/kernel_functions.c @@ -0,0 +1,346 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#if defined _MD4_ || defined _DCC2_ || defined _NETNTLMV2_ || defined _KRB5PA_ || defined _MS_DRSR_ +/** + * MD4 Functions + */ + +#if __CUDA_ARCH__ >= 500 +#define MD4_F(x,y,z) lut3_ca ((x), (y), (z)) +#define MD4_G(x,y,z) lut3_e8 ((x), (y), (z)) +#define MD4_H(x,y,z) lut3_96 ((x), (y), (z)) +#define MD4_H1(x,y,z) lut3_96 ((x), (y), (z)) +#define MD4_H2(x,y,z) lut3_96 ((x), (y), (z)) +#else +#define MD4_F(x,y,z) (((x) & (y)) | ((~(x)) & (z))) +#define MD4_G(x,y,z) (((x) & (y)) | ((x) & (z)) | ((y) & (z))) +#define MD4_H(x,y,z) ((x) ^ (y) ^ (z)) +#define MD4_H1(x,y,z) ((tmp2 = (x) ^ (y)) ^ (z)) +#define MD4_H2(x,y,z) ((x) ^ tmp2) +#endif + +#ifdef IS_AMD +#define MD4_Fo(x,y,z) (bitselect ((z), (y), (x))) +#define MD4_Go(x,y,z) (bitselect ((x), (y), ((x) ^ (z)))) +#else +#define MD4_Fo(x,y,z) (MD4_F((x), (y), (z))) +#define MD4_Go(x,y,z) (MD4_G((x), (y), (z))) +#endif + +#define MD4_STEP(f,a,b,c,d,x,K,s) \ +{ \ + a += K; \ + a += x; \ + a += f (b, c, d); \ + a = rotl32 (a, s); \ +} + +#define MD4_STEP0(f,a,b,c,d,K,s) \ +{ \ + a += K; \ + a += f (b, c, d); \ + a = rotl32 (a, s); \ +} + +#endif + +#if defined _MD5_ || defined _MD5H_ || defined _SAPB_ || defined _OLDOFFICE01_ || defined _WPA_ || defined _MD5_SHA1_ || defined _SHA1_MD5_ || defined _NETNTLMV2_ || defined _KRB5PA_ || defined _PBKDF2_MD5_ +/** + * MD5 Functions + */ + +#if __CUDA_ARCH__ >= 500 +#define MD5_F(x,y,z) lut3_ca ((x), (y), (z)) +#define MD5_G(x,y,z) lut3_e4 ((x), (y), (z)) +#define MD5_H(x,y,z) lut3_96 ((x), (y), (z)) +#define MD5_H1(x,y,z) lut3_96 ((x), (y), (z)) +#define MD5_H2(x,y,z) lut3_96 ((x), (y), (z)) +#else +#define MD5_F(x,y,z) ((z) ^ ((x) & ((y) ^ (z)))) +#define MD5_G(x,y,z) ((y) ^ ((z) & ((x) ^ (y)))) +#define MD5_H(x,y,z) ((x) ^ (y) ^ (z)) +#define MD5_H1(x,y,z) ((tmp2 = (x) ^ (y)) ^ (z)) +#define MD5_H2(x,y,z) ((x) ^ tmp2) +#endif + +#ifdef IS_AMD +#define MD5_I(x,y,z) (bitselect (0xffffffffU, (x), (z)) ^ (y)) +#else +#if __CUDA_ARCH__ >= 500 +#define MD5_I(x,y,z) lut3_39 ((x), (y), (z)) +#else +#define MD5_I(x,y,z) ((y) ^ ((x) | ~(z))) +#endif +#endif + +#ifdef IS_AMD +#define MD5_Fo(x,y,z) (bitselect ((z), (y), (x))) +#define MD5_Go(x,y,z) (bitselect ((y), (x), (z))) +#else +#define MD5_Fo(x,y,z) (MD5_F((x), (y), (z))) +#define MD5_Go(x,y,z) (MD5_G((x), (y), (z))) +#endif + +#define MD5_STEP(f,a,b,c,d,x,K,s) \ +{ \ + a += K; \ + a += x; \ + a += f (b, c, d); \ + a = rotl32 (a, s); \ + a += b; \ +} + +#define MD5_STEP0(f,a,b,c,d,K,s) \ +{ \ + a += K; \ + a += f (b, c, d); \ + a = rotl32 (a, s); \ + a += b; \ +} +#endif + +#if defined _SHA1_ || defined _SAPG_ || defined _OFFICE2007_ || defined _OFFICE2010_ || defined _OLDOFFICE34_ || defined _ANDROIDFDE_ || defined _DCC2_ || defined _WPA_ || defined _MD5_SHA1_ || defined _SHA1_MD5_ || defined _PSAFE2_ || defined _LOTUS8_ || defined _PBKDF2_SHA1_ || defined _RAR3_ || defined _SHA256_SHA1_ + +/** + * SHA1 Functions + */ + +#if __CUDA_ARCH__ >= 500 +#define SHA1_F0(x,y,z) lut3_ca ((x), (y), (z)) +#define SHA1_F1(x,y,z) lut3_96 ((x), (y), (z)) +#define SHA1_F2(x,y,z) lut3_e8 ((x), (y), (z)) +#else +#define SHA1_F0(x,y,z) ((z) ^ ((x) & ((y) ^ (z)))) +#define SHA1_F1(x,y,z) ((x) ^ (y) ^ (z)) +#define SHA1_F2(x,y,z) (((x) & (y)) | ((z) & ((x) ^ (y)))) +#endif + +#ifdef IS_AMD +#define SHA1_F0o(x,y,z) (bitselect ((z), (y), (x))) +#define SHA1_F2o(x,y,z) (bitselect ((x), (y), ((x) ^ (z)))) +#else +#define SHA1_F0o(x,y,z) (SHA1_F0 ((x), (y), (z))) +#define SHA1_F2o(x,y,z) (SHA1_F2 ((x), (y), (z))) +#endif + +#define SHA1_STEP(f,a,b,c,d,e,x) \ +{ \ + e += K; \ + e += x; \ + e += f (b, c, d); \ + e += rotl32 (a, 5u); \ + b = rotl32 (b, 30u); \ +} + +#define SHA1_STEP0(f,a,b,c,d,e,x) \ +{ \ + e += K; \ + e += f (b, c, d); \ + e += rotl32 (a, 5u); \ + b = rotl32 (b, 30u); \ +} + +#define SHA1_STEPX(f,a,b,c,d,e,x) \ +{ \ + e += x; \ + e += f (b, c, d); \ + e += rotl32 (a, 5u); \ + b = rotl32 (b, 30u); \ +} + +#define SHA1_STEP_PE(f,a,b,c,d,e,x) \ +{ \ + e += x; \ + e += f (b, c, d); \ + e += rotl32 (a, 5u); \ +} + +#define SHA1_STEP_PB(f,a,b,c,d,e,x) \ +{ \ + e += K; \ + b = rotl32 (b, 30u); \ +} +#endif + +#if defined _SHA256_ || defined _PDF17L8_ || defined _SEVEN_ZIP_ || defined _ANDROIDFDE_ || defined _CLOUDKEY_ || defined _SCRYPT_ || defined _PBKDF2_SHA256_ || defined _SHA256_SHA1_ || defined _MS_DRSR_ +/** + * SHA256 Functions + */ + +#define SHIFT_RIGHT_32(x,n) ((x) >> (n)) + +#define SHA256_S0(x) (rotl32 ((x), 25u) ^ rotl32 ((x), 14u) ^ SHIFT_RIGHT_32 ((x), 3u)) +#define SHA256_S1(x) (rotl32 ((x), 15u) ^ rotl32 ((x), 13u) ^ SHIFT_RIGHT_32 ((x), 10u)) +#define SHA256_S2(x) (rotl32 ((x), 30u) ^ rotl32 ((x), 19u) ^ rotl32 ((x), 10u)) +#define SHA256_S3(x) (rotl32 ((x), 26u) ^ rotl32 ((x), 21u) ^ rotl32 ((x), 7u)) + +#if __CUDA_ARCH__ >= 500 +#define SHA256_F0(x,y,z) lut3_e8 ((x), (y), (z)) +#define SHA256_F1(x,y,z) lut3_ca ((x), (y), (z)) +#else +#define SHA256_F0(x,y,z) (((x) & (y)) | ((z) & ((x) ^ (y)))) +#define SHA256_F1(x,y,z) ((z) ^ ((x) & ((y) ^ (z)))) +#endif + +#ifdef IS_AMD +#define SHA256_F0o(x,y,z) (bitselect ((x), (y), ((x) ^ (z)))) +#define SHA256_F1o(x,y,z) (bitselect ((z), (y), (x))) +#else +#define SHA256_F0o(x,y,z) (SHA256_F0 ((x), (y), (z))) +#define SHA256_F1o(x,y,z) (SHA256_F1 ((x), (y), (z))) +#endif + +#define SHA256_STEP(F0,F1,a,b,c,d,e,f,g,h,x,K) \ +{ \ + h += K; \ + h += x; \ + h += SHA256_S3 (e); \ + h += F1 (e,f,g); \ + d += h; \ + h += SHA256_S2 (a); \ + h += F0 (a,b,c); \ +} + +#define SHA256_EXPAND(x,y,z,w) (SHA256_S1 (x) + y + SHA256_S0 (z) + w) +#endif + + +#if defined _SHA384_ || defined _PDF17L8_ +/** + * SHA384 Functions + */ + +#define SHIFT_RIGHT_64(x,n) ((x) >> (n)) + +#define SHA384_S0(x) (rotr64 ((x), 28) ^ rotr64 ((x), 34) ^ rotr64 ((x), 39)) +#define SHA384_S1(x) (rotr64 ((x), 14) ^ rotr64 ((x), 18) ^ rotr64 ((x), 41)) +#define SHA384_S2(x) (rotr64 ((x), 1) ^ rotr64 ((x), 8) ^ SHIFT_RIGHT_64 ((x), 7)) +#define SHA384_S3(x) (rotr64 ((x), 19) ^ rotr64 ((x), 61) ^ SHIFT_RIGHT_64 ((x), 6)) + +#define SHA384_F0(x,y,z) ((z) ^ ((x) & ((y) ^ (z)))) +#define SHA384_F1(x,y,z) (((x) & (y)) | ((z) & ((x) ^ (y)))) + +#ifdef IS_AMD +#define SHA384_F0o(x,y,z) (bitselect ((z), (y), (x))) +#define SHA384_F1o(x,y,z) (bitselect ((x), (y), ((x) ^ (z)))) +#else +#define SHA384_F0o(x,y,z) (SHA384_F0 ((x), (y), (z))) +#define SHA384_F1o(x,y,z) (SHA384_F1 ((x), (y), (z))) +#endif + +#define SHA384_STEP(F0,F1,a,b,c,d,e,f,g,h,x,K) \ +{ \ + u64x temp0; \ + temp0 = K; \ + temp0 += x; \ + temp0 += h; \ + temp0 += SHA384_S1 (e); \ + temp0 += F0 (e, f, g); \ + d += temp0; \ + h = SHA384_S0 (a); \ + h += F1 (a, b, c); \ + h += temp0; \ +} + +#define SHA384_EXPAND(x,y,z,w) (SHA384_S3 (x) + y + SHA384_S2 (z) + w) +#endif + +#if defined _SHA512_ || defined _CLOUDKEY_ || defined _OFFICE2013_ || defined _PDF17L8_ || defined _PBKDF2_SHA512_ +/** + * SHA512 Functions + */ + +#define SHIFT_RIGHT_64(x,n) ((x) >> (n)) + +#define SHA512_S0(x) (rotr64 ((x), 28) ^ rotr64 ((x), 34) ^ rotr64 ((x), 39)) +#define SHA512_S1(x) (rotr64 ((x), 14) ^ rotr64 ((x), 18) ^ rotr64 ((x), 41)) +#define SHA512_S2(x) (rotr64 ((x), 1) ^ rotr64 ((x), 8) ^ SHIFT_RIGHT_64 ((x), 7)) +#define SHA512_S3(x) (rotr64 ((x), 19) ^ rotr64 ((x), 61) ^ SHIFT_RIGHT_64 ((x), 6)) + +#define SHA512_F0(x,y,z) ((z) ^ ((x) & ((y) ^ (z)))) +#define SHA512_F1(x,y,z) (((x) & (y)) | ((z) & ((x) ^ (y)))) + +#ifdef IS_AMD +#define SHA512_F0o(x,y,z) (bitselect ((z), (y), (x))) +#define SHA512_F1o(x,y,z) (bitselect ((x), (y), ((x) ^ (z)))) +#else +#define SHA512_F0o(x,y,z) (SHA512_F0 ((x), (y), (z))) +#define SHA512_F1o(x,y,z) (SHA512_F1 ((x), (y), (z))) +#endif + +#define SHA512_STEP(F0,F1,a,b,c,d,e,f,g,h,x,K) \ +{ \ + u64x temp0; \ + temp0 = K; \ + temp0 += x; \ + temp0 += h; \ + temp0 += SHA512_S1 (e); \ + temp0 += F0 (e, f, g); \ + d += temp0; \ + h = SHA512_S0 (a); \ + h += F1 (a, b, c); \ + h += temp0; \ +} + +#define SHA512_EXPAND(x,y,z,w) (SHA512_S3 (x) + y + SHA512_S2 (z) + w) + +#define SHA512_S2_WO(x) (rotate ((x), 64- 1ull) ^ rotate ((x), 64- 8ull) ^ SHIFT_RIGHT_64 ((x), 7)) +#define SHA512_S3_WO(x) (rotate ((x), 64-19ull) ^ rotate ((x), 64-61ull) ^ SHIFT_RIGHT_64 ((x), 6)) + +#define SHA512_EXPAND_WO(x,y,z,w) (SHA512_S3_WO (x) + y + SHA512_S2_WO (z) + w) +#endif + +#ifdef _RIPEMD160_ +/** + * RIPEMD160 Functions + */ + +#if __CUDA_ARCH__ >= 500 +#define RIPEMD160_F(x,y,z) lut3_96 ((x), (y), (z)) +#define RIPEMD160_G(x,y,z) lut3_ca ((x), (y), (z)) +#define RIPEMD160_H(x,y,z) lut3_59 ((x), (y), (z)) +#define RIPEMD160_I(x,y,z) lut3_e4 ((x), (y), (z)) +#define RIPEMD160_J(x,y,z) lut3_2d ((x), (y), (z)) +#else +#define RIPEMD160_F(x,y,z) ((x) ^ (y) ^ (z)) +#define RIPEMD160_G(x,y,z) ((z) ^ ((x) & ((y) ^ (z)))) /* x ? y : z */ +#define RIPEMD160_H(x,y,z) (((x) | ~(y)) ^ (z)) +#define RIPEMD160_I(x,y,z) ((y) ^ ((z) & ((x) ^ (y)))) /* z ? x : y */ +#define RIPEMD160_J(x,y,z) ((x) ^ ((y) | ~(z))) +#endif + +#ifdef IS_AMD +#define RIPEMD160_Go(x,y,z) (bitselect ((z), (y), (x))) +#define RIPEMD160_Io(x,y,z) (bitselect ((y), (x), (z))) +#else +#define RIPEMD160_Go(x,y,z) (RIPEMD160_G ((x), (y), (z))) +#define RIPEMD160_Io(x,y,z) (RIPEMD160_I ((x), (y), (z))) +#endif + +#define RIPEMD160_STEP(f,a,b,c,d,e,x,K,s) \ +{ \ + a += K; \ + a += x; \ + a += f (b, c, d); \ + a = rotl32 (a, s); \ + a += e; \ + c = rotl32 (c, 10u); \ +} + +#define ROTATE_LEFT_WORKAROUND_BUG(a,n) ((a << n) | (a >> (32 - n))) + +#define RIPEMD160_STEP_WORKAROUND_BUG(f,a,b,c,d,e,x,K,s) \ +{ \ + a += K; \ + a += x; \ + a += f (b, c, d); \ + a = ROTATE_LEFT_WORKAROUND_BUG (a, s); \ + a += e; \ + c = rotl32 (c, 10u); \ +} + +#endif + diff --git a/include/kernel_vendor.h b/include/kernel_vendor.h new file mode 100644 index 0000000000..ca76828bb3 --- /dev/null +++ b/include/kernel_vendor.h @@ -0,0 +1,110 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +/** + * vendor specific + */ + +#ifdef __GPU__ +#define IS_AMD +#endif + +#ifdef __CUDACC__ +#define IS_NV +#endif + +/** + * AMD specific + */ + +/* +#ifdef IS_AMD +#ifdef __ATI_RV710__ +#define VLIW1 +#elif __ATI_RV730__ +#define VLIW1 +#elif __ATI_RV770__ +#define VLIW4 +#elif __Barts__ +#define VLIW5 +#elif __BeaverCreek__ +#define VLIW5 +#elif __Caicos__ +#define VLIW5 +#elif __Capeverde__ +#define VLIW1 +#elif __Cayman__ +#define VLIW4 +#elif __Cedar__ +#define VLIW5 +#elif __Cypress__ +#define VLIW5 +#elif __Devastator__ +#define VLIW4 +#elif __Juniper__ +#define VLIW5 +#elif __Loveland__ +#define VLIW5 +#elif __Pitcairn__ +#define VLIW1 +#elif __Redwood__ +#define VLIW5 +#elif __Tahiti__ +#define VLIW1 +#elif __Turks__ +#define VLIW5 +#elif __Scrapper__ +#define VLIW4 +#elif __WinterPark__ +#define VLIW5 +#endif +#endif +*/ + +#ifdef IS_AMD + +#pragma OPENCL EXTENSION cl_khr_byte_addressable_store : enable + +#ifdef OSX + +#else + +#ifdef cl_amd_media_ops +#pragma OPENCL EXTENSION cl_amd_media_ops : enable +#endif + +#ifdef cl_amd_media_ops2 +#pragma OPENCL EXTENSION cl_amd_media_ops2 : enable +#endif + +#endif + +#endif + +#ifdef IS_NV +#ifdef sm_10 +#define VLIW1 +#elif sm_11 +#define VLIW1 +#elif sm_12 +#define VLIW1 +#elif sm_13 +#define VLIW1 +#elif sm_20 +#define VLIW1 +#elif sm_21 +#define VLIW2 +#elif sm_30 +#define VLIW2 +#elif sm_35 +#define VLIW2 +#elif sm_37 +#define VLIW2 +#elif sm_50 +#define VLIW2 +#elif sm_52 +#define VLIW2 +#endif +#endif diff --git a/include/rp_cpu.h b/include/rp_cpu.h new file mode 100644 index 0000000000..c5e25b870d --- /dev/null +++ b/include/rp_cpu.h @@ -0,0 +1,151 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define RP_RULE_BUFSIZ 0x100 + +#define RULE_RC_SYNTAX_ERROR -1 +#define RULE_RC_REJECT_ERROR -2 + +#define RULE_OP_MANGLE_NOOP ':' +#define RULE_OP_MANGLE_LREST 'l' +#define RULE_OP_MANGLE_UREST 'u' +#define RULE_OP_MANGLE_LREST_UFIRST 'c' +#define RULE_OP_MANGLE_UREST_LFIRST 'C' +#define RULE_OP_MANGLE_TREST 't' +#define RULE_OP_MANGLE_TOGGLE_AT 'T' +#define RULE_OP_MANGLE_REVERSE 'r' +#define RULE_OP_MANGLE_DUPEWORD 'd' +#define RULE_OP_MANGLE_DUPEWORD_TIMES 'p' +#define RULE_OP_MANGLE_REFLECT 'f' +#define RULE_OP_MANGLE_ROTATE_LEFT '{' +#define RULE_OP_MANGLE_ROTATE_RIGHT '}' +#define RULE_OP_MANGLE_APPEND '$' +#define RULE_OP_MANGLE_PREPEND '^' +#define RULE_OP_MANGLE_DELETE_FIRST '[' +#define RULE_OP_MANGLE_DELETE_LAST ']' +#define RULE_OP_MANGLE_DELETE_AT 'D' +#define RULE_OP_MANGLE_EXTRACT 'x' +#define RULE_OP_MANGLE_OMIT 'O' +#define RULE_OP_MANGLE_INSERT 'i' +#define RULE_OP_MANGLE_OVERSTRIKE 'o' +#define RULE_OP_MANGLE_TRUNCATE_AT '\'' +#define RULE_OP_MANGLE_REPLACE 's' +#define RULE_OP_MANGLE_PURGECHAR '@' +#define RULE_OP_MANGLE_TOGGLECASE_REC 'a' +#define RULE_OP_MANGLE_DUPECHAR_FIRST 'z' +#define RULE_OP_MANGLE_DUPECHAR_LAST 'Z' +#define RULE_OP_MANGLE_DUPECHAR_ALL 'q' +#define RULE_OP_MANGLE_EXTRACT_MEMORY 'X' +#define RULE_OP_MANGLE_APPEND_MEMORY '4' +#define RULE_OP_MANGLE_PREPEND_MEMORY '6' + +#define RULE_OP_MEMORIZE_WORD 'M' + +#define RULE_OP_REJECT_LESS '<' +#define RULE_OP_REJECT_GREATER '>' +#define RULE_OP_REJECT_CONTAIN '!' +#define RULE_OP_REJECT_NOT_CONTAIN '/' +#define RULE_OP_REJECT_EQUAL_FIRST '(' +#define RULE_OP_REJECT_EQUAL_LAST ')' +#define RULE_OP_REJECT_EQUAL_AT '=' +#define RULE_OP_REJECT_CONTAINS '%' +#define RULE_OP_REJECT_MEMORY 'Q' + +/* hashcat only */ +#define RULE_OP_MANGLE_SWITCH_FIRST 'k' +#define RULE_OP_MANGLE_SWITCH_LAST 'K' +#define RULE_OP_MANGLE_SWITCH_AT '*' +#define RULE_OP_MANGLE_CHR_SHIFTL 'L' +#define RULE_OP_MANGLE_CHR_SHIFTR 'R' +#define RULE_OP_MANGLE_CHR_INCR '+' +#define RULE_OP_MANGLE_CHR_DECR '-' +#define RULE_OP_MANGLE_REPLACE_NP1 '.' +#define RULE_OP_MANGLE_REPLACE_NM1 ',' +#define RULE_OP_MANGLE_DUPEBLOCK_FIRST 'y' +#define RULE_OP_MANGLE_DUPEBLOCK_LAST 'Y' +#define RULE_OP_MANGLE_TITLE 'E' + +static const char grp_op_nop[] = +{ + RULE_OP_MANGLE_LREST, + RULE_OP_MANGLE_UREST, + RULE_OP_MANGLE_LREST_UFIRST, + RULE_OP_MANGLE_UREST_LFIRST, + RULE_OP_MANGLE_TREST, + RULE_OP_MANGLE_REVERSE, + RULE_OP_MANGLE_DUPEWORD, + RULE_OP_MANGLE_REFLECT, + RULE_OP_MANGLE_DELETE_FIRST, + RULE_OP_MANGLE_DELETE_LAST, + RULE_OP_MANGLE_ROTATE_LEFT, + RULE_OP_MANGLE_ROTATE_RIGHT, + RULE_OP_MANGLE_SWITCH_FIRST, + RULE_OP_MANGLE_SWITCH_LAST, + RULE_OP_MANGLE_DUPECHAR_ALL, + RULE_OP_MANGLE_TITLE, + RULE_OP_MANGLE_APPEND_MEMORY, + RULE_OP_MANGLE_PREPEND_MEMORY, +}; + +static const char grp_op_pos_p0[] = +{ + RULE_OP_MANGLE_TOGGLE_AT, + RULE_OP_MANGLE_DELETE_AT, + RULE_OP_MANGLE_TRUNCATE_AT, + RULE_OP_MANGLE_CHR_INCR, + RULE_OP_MANGLE_CHR_DECR, + RULE_OP_MANGLE_CHR_SHIFTL, + RULE_OP_MANGLE_CHR_SHIFTR, + RULE_OP_MANGLE_REPLACE_NP1, + RULE_OP_MANGLE_REPLACE_NM1 +}; + +static const char grp_op_pos_p1[] = +{ + RULE_OP_MANGLE_DUPEWORD_TIMES, + RULE_OP_MANGLE_DUPECHAR_FIRST, + RULE_OP_MANGLE_DUPECHAR_LAST, + RULE_OP_MANGLE_DUPEBLOCK_FIRST, + RULE_OP_MANGLE_DUPEBLOCK_LAST +}; + +static const char grp_op_chr[] = +{ + RULE_OP_MANGLE_APPEND, + RULE_OP_MANGLE_PREPEND, + RULE_OP_MANGLE_PURGECHAR +}; + +static const char grp_op_chr_chr[] = +{ + RULE_OP_MANGLE_REPLACE +}; + +static const char grp_op_pos_chr[] = +{ + RULE_OP_MANGLE_INSERT, + RULE_OP_MANGLE_OVERSTRIKE +}; + +static const char grp_op_pos_pos0[] = +{ + RULE_OP_MANGLE_SWITCH_AT +}; + +static const char grp_op_pos_pos1[] = +{ + RULE_OP_MANGLE_EXTRACT, + RULE_OP_MANGLE_OMIT +}; + +static const char grp_op_pos1_pos2_pos3[] = +{ + RULE_OP_MANGLE_EXTRACT_MEMORY +}; + +static const char grp_pos[] = +{ + '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B' +}; diff --git a/include/rp_gpu.h b/include/rp_gpu.h new file mode 100644 index 0000000000..17849f208a --- /dev/null +++ b/include/rp_gpu.h @@ -0,0 +1,57 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define RULE_OP_MANGLE_NOOP ':' +#define RULE_OP_MANGLE_LREST 'l' +#define RULE_OP_MANGLE_UREST 'u' +#define RULE_OP_MANGLE_LREST_UFIRST 'c' +#define RULE_OP_MANGLE_UREST_LFIRST 'C' +#define RULE_OP_MANGLE_TREST 't' +#define RULE_OP_MANGLE_TOGGLE_AT 'T' +#define RULE_OP_MANGLE_REVERSE 'r' +#define RULE_OP_MANGLE_DUPEWORD 'd' +#define RULE_OP_MANGLE_DUPEWORD_TIMES 'p' +#define RULE_OP_MANGLE_REFLECT 'f' +#define RULE_OP_MANGLE_ROTATE_LEFT '{' +#define RULE_OP_MANGLE_ROTATE_RIGHT '}' +#define RULE_OP_MANGLE_APPEND '$' +#define RULE_OP_MANGLE_PREPEND '^' +#define RULE_OP_MANGLE_DELETE_FIRST '[' +#define RULE_OP_MANGLE_DELETE_LAST ']' +#define RULE_OP_MANGLE_DELETE_AT 'D' +#define RULE_OP_MANGLE_EXTRACT 'x' +#define RULE_OP_MANGLE_OMIT 'O' +#define RULE_OP_MANGLE_INSERT 'i' +#define RULE_OP_MANGLE_OVERSTRIKE 'o' +#define RULE_OP_MANGLE_TRUNCATE_AT '\'' +#define RULE_OP_MANGLE_REPLACE 's' +#define RULE_OP_MANGLE_PURGECHAR '@' +#define RULE_OP_MANGLE_TOGGLECASE_REC 'a' +#define RULE_OP_MANGLE_DUPECHAR_FIRST 'z' +#define RULE_OP_MANGLE_DUPECHAR_LAST 'Z' +#define RULE_OP_MANGLE_DUPECHAR_ALL 'q' + +#define RULE_OP_REJECT_LESS '<' +#define RULE_OP_REJECT_GREATER '>' +#define RULE_OP_REJECT_CONTAIN '!' +#define RULE_OP_REJECT_NOT_CONTAIN '/' +#define RULE_OP_REJECT_EQUAL_FIRST '(' +#define RULE_OP_REJECT_EQUAL_LAST ')' +#define RULE_OP_REJECT_EQUAL_AT '=' +#define RULE_OP_REJECT_CONTAINS '%' + +/* hashcat only */ +#define RULE_OP_MANGLE_SWITCH_FIRST 'k' +#define RULE_OP_MANGLE_SWITCH_LAST 'K' +#define RULE_OP_MANGLE_SWITCH_AT '*' +#define RULE_OP_MANGLE_CHR_SHIFTL 'L' +#define RULE_OP_MANGLE_CHR_SHIFTR 'R' +#define RULE_OP_MANGLE_CHR_INCR '+' +#define RULE_OP_MANGLE_CHR_DECR '-' +#define RULE_OP_MANGLE_REPLACE_NP1 '.' +#define RULE_OP_MANGLE_REPLACE_NM1 ',' +#define RULE_OP_MANGLE_DUPEBLOCK_FIRST 'y' +#define RULE_OP_MANGLE_DUPEBLOCK_LAST 'Y' +#define RULE_OP_MANGLE_TITLE 'E' diff --git a/include/rp_gpu_on_cpu.h b/include/rp_gpu_on_cpu.h new file mode 100644 index 0000000000..3099d86a1a --- /dev/null +++ b/include/rp_gpu_on_cpu.h @@ -0,0 +1,17 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#ifndef RP_CPU_H +#define RP_CPU_H + +#define swap_workaround(n) __builtin_bswap32(n) + +#include "common.h" +#include "rp_gpu.h" + +uint apply_rule (const uint name, const uint p0, const uint p1, uint32_t buf0[4], uint32_t buf1[4], const uint in_len); +uint apply_rules (uint *cmds, uint32_t buf0[4], uint32_t buf1[4], const uint len); + +#endif diff --git a/include/shared.h b/include/shared.h new file mode 100644 index 0000000000..4a987ac63c --- /dev/null +++ b/include/shared.h @@ -0,0 +1,2312 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#ifndef SHARED_H +#define SHARED_H + +#include +#include + +/** + * thread management + */ + +#ifdef _WIN +#define hc_timer_get(a,r) { hc_timer_t hr_freq; QueryPerformanceFrequency (&hr_freq); hc_timer_t hr_tmp; hc_timer_set (&hr_tmp); (r) = (double) ((double) (hr_tmp.QuadPart - (a).QuadPart) / (double) (hr_freq.QuadPart / 1000)); } +#define hc_timer_set(a) { QueryPerformanceCounter ((a)); } +#elif _POSIX +#define hc_timer_get(a,r) { hc_timer_t hr_tmp; hc_timer_set (&hr_tmp); (r) = (double) (((hr_tmp.tv_sec - (a).tv_sec) * 1000) + ((double) (hr_tmp.tv_usec - (a).tv_usec) / 1000)); } +#define hc_timer_set(a) { gettimeofday ((a), NULL); } +#endif + +#ifdef _WIN +#define hc_thread_create(t,f,a) t = CreateThread (NULL, 0, (LPTHREAD_START_ROUTINE) &f, a, 0, NULL) +#define hc_thread_wait(n,a) for (uint i = 0; i < n; i++) WaitForSingleObject ((a)[i], INFINITE) +#define hc_thread_exit(t) ExitThread (t) + +#define hc_thread_mutex_lock(m) EnterCriticalSection (&m) +#define hc_thread_mutex_unlock(m) LeaveCriticalSection (&m) +#define hc_thread_mutex_init(m) InitializeCriticalSection (&m) +#define hc_thread_mutex_delete(m) DeleteCriticalSection (&m) + +#elif _POSIX + +#define hc_thread_create(t,f,a) pthread_create (&t, NULL, f, a) +#define hc_thread_wait(n,a) for (uint i = 0; i < n; i++) pthread_join ((a)[i], NULL) +#define hc_thread_exit(t) pthread_exit (&t) + +#define hc_thread_mutex_lock(m) pthread_mutex_lock (&m) +#define hc_thread_mutex_unlock(m) pthread_mutex_unlock (&m) +#define hc_thread_mutex_init(m) pthread_mutex_init (&m, NULL) +#define hc_thread_mutex_delete(m) pthread_mutex_destroy (&m) + +#endif + +/** + * system stuff + */ + +#ifdef _WIN +#define hc_sleep(x) Sleep ((x) * 1000); +#elif _POSIX +#define hc_sleep(x) sleep ((x)); +#endif + +#ifdef _CUDA +#include +#elif _OCL +#include +#endif + +/** + * temperature management + */ + +#ifdef LINUX +#ifdef _CUDA +#include +#elif _OCL +#include +#endif +#endif + +#ifdef WIN +#ifdef _CUDA +#include +#elif _OCL +#include +#endif +#endif + +#ifdef OSX +#ifdef _CUDA +#include +#elif _OCL +#include +#endif +#endif + +/** + * shared stuff + */ + +#define ETC_MAX (60 * 60 * 24 * 365 * 10) + +#define DEVICES_MAX 128 + +#define CL_PLATFORMS_MAX 16 +#define CL_VENDOR_NV "NVIDIA Corporation" +#define CL_VENDOR_AMD "Advanced Micro Devices, Inc." +#define CL_VENDOR_SDS "Shiloh Distributed Solutions" +#define CL_VENDOR_APPLE "Apple" + +#define BLOCK_SIZE 64 + +#define CHARSIZ 0x100 +#define INFOSZ CHARSIZ + +#define SP_HCSTAT "hashcat.hcstat" +#define SP_PW_MIN 2 +#define SP_PW_MAX 64 +#define SP_ROOT_CNT (SP_PW_MAX * CHARSIZ) +#define SP_MARKOV_CNT (SP_PW_MAX * CHARSIZ * CHARSIZ) + +#define INDUCT_DIR "induct" +#define OUTFILES_DIR "outfiles" + +#define LOOPBACK_FILE "loopback" + +#define VENDOR_ID_AMD 4098 +#define VENDOR_ID_NV 4318 + +/** + * types + */ + +#ifdef _WIN +typedef LARGE_INTEGER hc_timer_t; +typedef HANDLE hc_thread_t; +typedef CRITICAL_SECTION hc_thread_mutex_t; +#elif _POSIX +typedef struct timeval hc_timer_t; +typedef pthread_t hc_thread_t; +typedef pthread_mutex_t hc_thread_mutex_t; +#endif + +#include +#include "rp_cpu.h" +#include "rp_gpu.h" + +/** + * valid project specific global stuff + */ + +extern const char *PROGNAME; +extern const char *VERSION_TXT; + +extern const uint VERSION_BIN; +extern const uint RESTORE_MIN; + +extern const char *EULA_TXT[]; +extern const char *USAGE_MINI[]; +extern const char *USAGE_BIG[]; + +extern const char *PROMPT; + +extern int SUPPRESS_OUTPUT; + +extern hc_thread_mutex_t mux_adl; +extern hc_thread_mutex_t mux_counter; +extern hc_thread_mutex_t mux_dispatcher; +extern hc_thread_mutex_t mux_display; + +/** + * password lengths supported + */ + +#define PW_LENGTH_MIN_0 0 +#define PW_LENGTH_MAX_0 55 +#define PW_LENGTH_MIN_400 0 +#define PW_LENGTH_MAX_400 40 +#define PW_LENGTH_MIN_500 0 +#define PW_LENGTH_MAX_500 15 +#define PW_LENGTH_MIN_1600 0 +#define PW_LENGTH_MAX_1600 15 +#define PW_LENGTH_MIN_1800 0 +#define PW_LENGTH_MAX_1800 15 +#define PW_LENGTH_MIN_2500 0 +#define PW_LENGTH_MAX_2500 64 +#define PW_LENGTH_MIN_6300 0 +#define PW_LENGTH_MAX_6300 15 +#define PW_LENGTH_MIN_7400 0 +#define PW_LENGTH_MAX_7400 15 + +/** + * gpu accel / loops macro + */ + +#define GPU_ACCEL_NV_0 128 +#define GPU_ACCEL_NV_10 128 +#define GPU_ACCEL_NV_11 128 +#define GPU_ACCEL_NV_12 128 +#define GPU_ACCEL_NV_20 64 +#define GPU_ACCEL_NV_21 64 +#define GPU_ACCEL_NV_22 64 +#define GPU_ACCEL_NV_23 64 +#define GPU_ACCEL_NV_30 128 +#define GPU_ACCEL_NV_40 64 +#define GPU_ACCEL_NV_50 64 +#define GPU_ACCEL_NV_60 64 +#define GPU_ACCEL_NV_100 64 +#define GPU_ACCEL_NV_101 64 +#define GPU_ACCEL_NV_110 64 +#define GPU_ACCEL_NV_111 64 +#define GPU_ACCEL_NV_112 64 +#define GPU_ACCEL_NV_120 64 +#define GPU_ACCEL_NV_121 64 +#define GPU_ACCEL_NV_122 64 +#define GPU_ACCEL_NV_124 64 +#define GPU_ACCEL_NV_130 64 +#define GPU_ACCEL_NV_131 64 +#define GPU_ACCEL_NV_132 64 +#define GPU_ACCEL_NV_133 64 +#define GPU_ACCEL_NV_140 64 +#define GPU_ACCEL_NV_141 64 +#define GPU_ACCEL_NV_150 64 +#define GPU_ACCEL_NV_160 64 +#define GPU_ACCEL_NV_190 64 +#define GPU_ACCEL_NV_200 64 +#define GPU_ACCEL_NV_300 64 +#define GPU_ACCEL_NV_400 8 +#define GPU_ACCEL_NV_500 8 +#define GPU_ACCEL_NV_501 8 +#define GPU_ACCEL_NV_900 128 +#define GPU_ACCEL_NV_910 128 +#define GPU_ACCEL_NV_1000 128 +#define GPU_ACCEL_NV_1100 64 +#define GPU_ACCEL_NV_1400 64 +#define GPU_ACCEL_NV_1410 64 +#define GPU_ACCEL_NV_1420 64 +#define GPU_ACCEL_NV_1421 64 +#define GPU_ACCEL_NV_1430 64 +#define GPU_ACCEL_NV_1440 64 +#define GPU_ACCEL_NV_1441 64 +#define GPU_ACCEL_NV_1450 32 +#define GPU_ACCEL_NV_1460 32 +#define GPU_ACCEL_NV_1500 16 +#define GPU_ACCEL_NV_1600 8 +#define GPU_ACCEL_NV_1700 64 +#define GPU_ACCEL_NV_1710 64 +#define GPU_ACCEL_NV_1711 64 +#define GPU_ACCEL_NV_1720 64 +#define GPU_ACCEL_NV_1722 64 +#define GPU_ACCEL_NV_1730 64 +#define GPU_ACCEL_NV_1731 64 +#define GPU_ACCEL_NV_1740 64 +#define GPU_ACCEL_NV_1750 32 +#define GPU_ACCEL_NV_1760 32 +#define GPU_ACCEL_NV_1800 2 +#define GPU_ACCEL_NV_2100 8 +#define GPU_ACCEL_NV_2400 64 +#define GPU_ACCEL_NV_2410 64 +#define GPU_ACCEL_NV_2500 8 +#define GPU_ACCEL_NV_2600 64 +#define GPU_ACCEL_NV_2611 64 +#define GPU_ACCEL_NV_2612 64 +#define GPU_ACCEL_NV_2711 64 +#define GPU_ACCEL_NV_2811 64 +#define GPU_ACCEL_NV_3000 64 +#define GPU_ACCEL_NV_3100 16 +#define GPU_ACCEL_NV_3200 2 +#define GPU_ACCEL_NV_3710 64 +#define GPU_ACCEL_NV_3711 64 +#define GPU_ACCEL_NV_3800 128 +#define GPU_ACCEL_NV_4300 64 +#define GPU_ACCEL_NV_4400 64 +#define GPU_ACCEL_NV_4500 64 +#define GPU_ACCEL_NV_4700 64 +#define GPU_ACCEL_NV_4800 128 +#define GPU_ACCEL_NV_4900 64 +#define GPU_ACCEL_NV_5000 64 +#define GPU_ACCEL_NV_5100 64 +#define GPU_ACCEL_NV_5200 8 +#define GPU_ACCEL_NV_5300 32 +#define GPU_ACCEL_NV_5400 32 +#define GPU_ACCEL_NV_5500 64 +#define GPU_ACCEL_NV_5600 8 +#define GPU_ACCEL_NV_5700 64 +#define GPU_ACCEL_NV_5800 8 +#define GPU_ACCEL_NV_6000 64 +#define GPU_ACCEL_NV_6100 8 +#define GPU_ACCEL_NV_6211 16 +#define GPU_ACCEL_NV_6212 8 +#define GPU_ACCEL_NV_6213 8 +#define GPU_ACCEL_NV_6221 4 +#define GPU_ACCEL_NV_6222 4 +#define GPU_ACCEL_NV_6223 4 +#define GPU_ACCEL_NV_6231 4 +#define GPU_ACCEL_NV_6232 4 +#define GPU_ACCEL_NV_6233 4 +#define GPU_ACCEL_NV_6241 32 +#define GPU_ACCEL_NV_6242 16 +#define GPU_ACCEL_NV_6243 16 +#define GPU_ACCEL_NV_6300 8 +#define GPU_ACCEL_NV_6400 8 +#define GPU_ACCEL_NV_6500 8 +#define GPU_ACCEL_NV_6600 8 +#define GPU_ACCEL_NV_6700 8 +#define GPU_ACCEL_NV_6800 8 +#define GPU_ACCEL_NV_6900 16 +#define GPU_ACCEL_NV_7100 2 +#define GPU_ACCEL_NV_7200 2 +#define GPU_ACCEL_NV_7300 64 +#define GPU_ACCEL_NV_7400 2 +#define GPU_ACCEL_NV_7500 8 +#define GPU_ACCEL_NV_7600 64 +#define GPU_ACCEL_NV_7700 16 +#define GPU_ACCEL_NV_7800 8 +#define GPU_ACCEL_NV_7900 2 +#define GPU_ACCEL_NV_8000 8 +#define GPU_ACCEL_NV_8100 64 +#define GPU_ACCEL_NV_8200 2 +#define GPU_ACCEL_NV_8300 64 +#define GPU_ACCEL_NV_8400 64 +#define GPU_ACCEL_NV_8500 64 +#define GPU_ACCEL_NV_8600 8 +#define GPU_ACCEL_NV_8700 8 +#define GPU_ACCEL_NV_8800 8 +#define GPU_ACCEL_NV_8900 4 +#define GPU_ACCEL_NV_9000 2 +#define GPU_ACCEL_NV_9100 8 +#define GPU_ACCEL_NV_9200 2 +#define GPU_ACCEL_NV_9300 4 +#define GPU_ACCEL_NV_9400 8 +#define GPU_ACCEL_NV_9500 8 +#define GPU_ACCEL_NV_9600 2 +#define GPU_ACCEL_NV_9700 8 +#define GPU_ACCEL_NV_9710 8 +#define GPU_ACCEL_NV_9720 8 +#define GPU_ACCEL_NV_9800 8 +#define GPU_ACCEL_NV_9810 8 +#define GPU_ACCEL_NV_9820 8 +#define GPU_ACCEL_NV_9900 64 +#define GPU_ACCEL_NV_10000 2 +#define GPU_ACCEL_NV_10100 128 +#define GPU_ACCEL_NV_10200 64 +#define GPU_ACCEL_NV_10300 8 +#define GPU_ACCEL_NV_10400 8 +#define GPU_ACCEL_NV_10410 8 +#define GPU_ACCEL_NV_10420 8 +#define GPU_ACCEL_NV_10500 64 +#define GPU_ACCEL_NV_10600 64 +#define GPU_ACCEL_NV_10700 1 +#define GPU_ACCEL_NV_10800 64 +#define GPU_ACCEL_NV_10900 2 +#define GPU_ACCEL_NV_11000 64 +#define GPU_ACCEL_NV_11100 64 +#define GPU_ACCEL_NV_11200 64 +#define GPU_ACCEL_NV_11300 2 +#define GPU_ACCEL_NV_11400 8 +#define GPU_ACCEL_NV_11500 128 +#define GPU_ACCEL_NV_11600 2 +#define GPU_ACCEL_NV_11700 4 +#define GPU_ACCEL_NV_11800 4 +#define GPU_ACCEL_NV_11900 2 +#define GPU_ACCEL_NV_12000 2 +#define GPU_ACCEL_NV_12100 2 +#define GPU_ACCEL_NV_12200 2 +#define GPU_ACCEL_NV_12300 2 +#define GPU_ACCEL_NV_12400 64 +#define GPU_ACCEL_NV_12500 8 +#define GPU_ACCEL_NV_12600 32 +#define GPU_ACCEL_NV_12700 64 +#define GPU_ACCEL_NV_12800 64 + +#define GPU_ACCEL_AMD_0 128 +#define GPU_ACCEL_AMD_10 128 +#define GPU_ACCEL_AMD_11 128 +#define GPU_ACCEL_AMD_12 128 +#define GPU_ACCEL_AMD_20 64 +#define GPU_ACCEL_AMD_21 64 +#define GPU_ACCEL_AMD_22 64 +#define GPU_ACCEL_AMD_23 64 +#define GPU_ACCEL_AMD_30 128 +#define GPU_ACCEL_AMD_40 64 +#define GPU_ACCEL_AMD_50 64 +#define GPU_ACCEL_AMD_60 64 +#define GPU_ACCEL_AMD_100 64 +#define GPU_ACCEL_AMD_101 64 +#define GPU_ACCEL_AMD_110 64 +#define GPU_ACCEL_AMD_111 64 +#define GPU_ACCEL_AMD_112 64 +#define GPU_ACCEL_AMD_120 64 +#define GPU_ACCEL_AMD_121 64 +#define GPU_ACCEL_AMD_122 64 +#define GPU_ACCEL_AMD_124 64 +#define GPU_ACCEL_AMD_130 64 +#define GPU_ACCEL_AMD_131 64 +#define GPU_ACCEL_AMD_132 64 +#define GPU_ACCEL_AMD_133 64 +#define GPU_ACCEL_AMD_140 64 +#define GPU_ACCEL_AMD_141 64 +#define GPU_ACCEL_AMD_150 64 +#define GPU_ACCEL_AMD_160 64 +#define GPU_ACCEL_AMD_190 64 +#define GPU_ACCEL_AMD_200 64 +#define GPU_ACCEL_AMD_300 64 +#define GPU_ACCEL_AMD_400 8 +#define GPU_ACCEL_AMD_500 8 +#define GPU_ACCEL_AMD_501 8 +#define GPU_ACCEL_AMD_900 128 +#define GPU_ACCEL_AMD_910 128 +#define GPU_ACCEL_AMD_1000 128 +#define GPU_ACCEL_AMD_1100 64 +#define GPU_ACCEL_AMD_1400 64 +#define GPU_ACCEL_AMD_1410 64 +#define GPU_ACCEL_AMD_1420 64 +#define GPU_ACCEL_AMD_1421 64 +#define GPU_ACCEL_AMD_1430 64 +#define GPU_ACCEL_AMD_1440 64 +#define GPU_ACCEL_AMD_1441 64 +#define GPU_ACCEL_AMD_1450 32 +#define GPU_ACCEL_AMD_1460 32 +#define GPU_ACCEL_AMD_1500 16 +#define GPU_ACCEL_AMD_1600 8 +#define GPU_ACCEL_AMD_1700 64 +#define GPU_ACCEL_AMD_1710 64 +#define GPU_ACCEL_AMD_1711 64 +#define GPU_ACCEL_AMD_1720 64 +#define GPU_ACCEL_AMD_1722 64 +#define GPU_ACCEL_AMD_1730 64 +#define GPU_ACCEL_AMD_1731 64 +#define GPU_ACCEL_AMD_1740 64 +#define GPU_ACCEL_AMD_1750 32 +#define GPU_ACCEL_AMD_1760 32 +#define GPU_ACCEL_AMD_1800 2 +#define GPU_ACCEL_AMD_2100 8 +#define GPU_ACCEL_AMD_2400 64 +#define GPU_ACCEL_AMD_2410 64 +#define GPU_ACCEL_AMD_2500 8 +#define GPU_ACCEL_AMD_2600 64 +#define GPU_ACCEL_AMD_2611 64 +#define GPU_ACCEL_AMD_2612 64 +#define GPU_ACCEL_AMD_2711 64 +#define GPU_ACCEL_AMD_2811 64 +#define GPU_ACCEL_AMD_3000 128 +#define GPU_ACCEL_AMD_3100 16 +#define GPU_ACCEL_AMD_3200 2 +#define GPU_ACCEL_AMD_3710 64 +#define GPU_ACCEL_AMD_3711 64 +#define GPU_ACCEL_AMD_3800 128 +#define GPU_ACCEL_AMD_4300 64 +#define GPU_ACCEL_AMD_4400 64 +#define GPU_ACCEL_AMD_4500 64 +#define GPU_ACCEL_AMD_4700 64 +#define GPU_ACCEL_AMD_4800 128 +#define GPU_ACCEL_AMD_4900 64 +#define GPU_ACCEL_AMD_5000 64 +#define GPU_ACCEL_AMD_5100 64 +#define GPU_ACCEL_AMD_5200 8 +#define GPU_ACCEL_AMD_5300 32 +#define GPU_ACCEL_AMD_5400 32 +#define GPU_ACCEL_AMD_5500 64 +#define GPU_ACCEL_AMD_5600 64 +#define GPU_ACCEL_AMD_5700 64 +#define GPU_ACCEL_AMD_5800 8 +#define GPU_ACCEL_AMD_6000 64 +#define GPU_ACCEL_AMD_6100 8 +#define GPU_ACCEL_AMD_6211 16 +#define GPU_ACCEL_AMD_6212 8 +#define GPU_ACCEL_AMD_6213 8 +#define GPU_ACCEL_AMD_6221 4 +#define GPU_ACCEL_AMD_6222 4 +#define GPU_ACCEL_AMD_6223 4 +#define GPU_ACCEL_AMD_6231 4 +#define GPU_ACCEL_AMD_6232 4 +#define GPU_ACCEL_AMD_6233 4 +#define GPU_ACCEL_AMD_6241 32 +#define GPU_ACCEL_AMD_6242 16 +#define GPU_ACCEL_AMD_6243 16 +#define GPU_ACCEL_AMD_6300 8 +#define GPU_ACCEL_AMD_6400 8 +#define GPU_ACCEL_AMD_6500 8 +#define GPU_ACCEL_AMD_6600 8 +#define GPU_ACCEL_AMD_6700 8 +#define GPU_ACCEL_AMD_6800 8 +#define GPU_ACCEL_AMD_6900 16 +#define GPU_ACCEL_AMD_7100 2 +#define GPU_ACCEL_AMD_7200 2 +#define GPU_ACCEL_AMD_7300 64 +#define GPU_ACCEL_AMD_7400 2 +#define GPU_ACCEL_AMD_7500 8 +#define GPU_ACCEL_AMD_7600 64 +#define GPU_ACCEL_AMD_7700 16 +#define GPU_ACCEL_AMD_7800 8 +#define GPU_ACCEL_AMD_7900 2 +#define GPU_ACCEL_AMD_8000 8 +#define GPU_ACCEL_AMD_8100 64 +#define GPU_ACCEL_AMD_8200 2 +#define GPU_ACCEL_AMD_8300 64 +#define GPU_ACCEL_AMD_8400 64 +#define GPU_ACCEL_AMD_8500 64 +#define GPU_ACCEL_AMD_8600 8 +#define GPU_ACCEL_AMD_8700 8 +#define GPU_ACCEL_AMD_8800 8 +#define GPU_ACCEL_AMD_8900 4 +#define GPU_ACCEL_AMD_9000 2 +#define GPU_ACCEL_AMD_9100 8 +#define GPU_ACCEL_AMD_9200 2 +#define GPU_ACCEL_AMD_9300 4 +#define GPU_ACCEL_AMD_9400 8 +#define GPU_ACCEL_AMD_9500 8 +#define GPU_ACCEL_AMD_9600 2 +#define GPU_ACCEL_AMD_9700 8 +#define GPU_ACCEL_AMD_9710 8 +#define GPU_ACCEL_AMD_9720 8 +#define GPU_ACCEL_AMD_9800 8 +#define GPU_ACCEL_AMD_9810 8 +#define GPU_ACCEL_AMD_9820 8 +#define GPU_ACCEL_AMD_9900 64 +#define GPU_ACCEL_AMD_10000 2 +#define GPU_ACCEL_AMD_10100 128 +#define GPU_ACCEL_AMD_10200 64 +#define GPU_ACCEL_AMD_10300 8 +#define GPU_ACCEL_AMD_10400 8 +#define GPU_ACCEL_AMD_10410 8 +#define GPU_ACCEL_AMD_10420 8 +#define GPU_ACCEL_AMD_10500 64 +#define GPU_ACCEL_AMD_10600 64 +#define GPU_ACCEL_AMD_10700 1 +#define GPU_ACCEL_AMD_10800 64 +#define GPU_ACCEL_AMD_10900 2 +#define GPU_ACCEL_AMD_11000 64 +#define GPU_ACCEL_AMD_11100 64 +#define GPU_ACCEL_AMD_11200 64 +#define GPU_ACCEL_AMD_11300 2 +#define GPU_ACCEL_AMD_11400 8 +#define GPU_ACCEL_AMD_11500 128 +#define GPU_ACCEL_AMD_11600 2 +#define GPU_ACCEL_AMD_11700 4 +#define GPU_ACCEL_AMD_11800 4 +#define GPU_ACCEL_AMD_11900 2 +#define GPU_ACCEL_AMD_12000 2 +#define GPU_ACCEL_AMD_12100 2 +#define GPU_ACCEL_AMD_12200 2 +#define GPU_ACCEL_AMD_12300 2 +#define GPU_ACCEL_AMD_12400 64 +#define GPU_ACCEL_AMD_12500 8 +#define GPU_ACCEL_AMD_12600 32 +#define GPU_ACCEL_AMD_12700 64 +#define GPU_ACCEL_AMD_12800 64 + +#define GPU_LOOPS_NV_0 512 +#define GPU_LOOPS_NV_10 512 +#define GPU_LOOPS_NV_11 512 +#define GPU_LOOPS_NV_12 512 +#define GPU_LOOPS_NV_20 128 +#define GPU_LOOPS_NV_21 128 +#define GPU_LOOPS_NV_22 128 +#define GPU_LOOPS_NV_23 128 +#define GPU_LOOPS_NV_30 512 +#define GPU_LOOPS_NV_40 128 +#define GPU_LOOPS_NV_50 64 +#define GPU_LOOPS_NV_60 64 +#define GPU_LOOPS_NV_100 128 +#define GPU_LOOPS_NV_101 128 +#define GPU_LOOPS_NV_110 128 +#define GPU_LOOPS_NV_111 128 +#define GPU_LOOPS_NV_112 128 +#define GPU_LOOPS_NV_120 64 +#define GPU_LOOPS_NV_121 64 +#define GPU_LOOPS_NV_122 64 +#define GPU_LOOPS_NV_124 64 +#define GPU_LOOPS_NV_130 64 +#define GPU_LOOPS_NV_131 64 +#define GPU_LOOPS_NV_132 64 +#define GPU_LOOPS_NV_133 64 +#define GPU_LOOPS_NV_140 64 +#define GPU_LOOPS_NV_141 64 +#define GPU_LOOPS_NV_150 32 +#define GPU_LOOPS_NV_160 32 +#define GPU_LOOPS_NV_190 64 +#define GPU_LOOPS_NV_200 64 +#define GPU_LOOPS_NV_300 64 +#define GPU_LOOPS_NV_400 256 +#define GPU_LOOPS_NV_500 200 +#define GPU_LOOPS_NV_501 200 +#define GPU_LOOPS_NV_900 512 +#define GPU_LOOPS_NV_910 512 +#define GPU_LOOPS_NV_1000 512 +#define GPU_LOOPS_NV_1100 256 +#define GPU_LOOPS_NV_1400 128 +#define GPU_LOOPS_NV_1410 128 +#define GPU_LOOPS_NV_1420 64 +#define GPU_LOOPS_NV_1421 64 +#define GPU_LOOPS_NV_1430 128 +#define GPU_LOOPS_NV_1440 64 +#define GPU_LOOPS_NV_1441 64 +#define GPU_LOOPS_NV_1450 16 +#define GPU_LOOPS_NV_1460 16 +#define GPU_LOOPS_NV_1500 512 +#define GPU_LOOPS_NV_1600 256 +#define GPU_LOOPS_NV_1700 32 +#define GPU_LOOPS_NV_1710 32 +#define GPU_LOOPS_NV_1711 32 +#define GPU_LOOPS_NV_1720 16 +#define GPU_LOOPS_NV_1722 16 +#define GPU_LOOPS_NV_1730 32 +#define GPU_LOOPS_NV_1731 32 +#define GPU_LOOPS_NV_1740 16 +#define GPU_LOOPS_NV_1750 16 +#define GPU_LOOPS_NV_1760 16 +#define GPU_LOOPS_NV_1800 200 +#define GPU_LOOPS_NV_2100 256 +#define GPU_LOOPS_NV_2400 512 +#define GPU_LOOPS_NV_2410 512 +#define GPU_LOOPS_NV_2500 256 +#define GPU_LOOPS_NV_2600 256 +#define GPU_LOOPS_NV_2611 256 +#define GPU_LOOPS_NV_2612 256 +#define GPU_LOOPS_NV_2711 128 +#define GPU_LOOPS_NV_2811 128 +#define GPU_LOOPS_NV_3000 512 +#define GPU_LOOPS_NV_3100 64 +#define GPU_LOOPS_NV_3200 16 +#define GPU_LOOPS_NV_3710 128 +#define GPU_LOOPS_NV_3711 128 +#define GPU_LOOPS_NV_3800 512 +#define GPU_LOOPS_NV_4300 256 +#define GPU_LOOPS_NV_4400 128 +#define GPU_LOOPS_NV_4500 128 +#define GPU_LOOPS_NV_4700 128 +#define GPU_LOOPS_NV_4800 512 +#define GPU_LOOPS_NV_4900 128 +#define GPU_LOOPS_NV_5000 16 +#define GPU_LOOPS_NV_5100 512 +#define GPU_LOOPS_NV_5200 256 +#define GPU_LOOPS_NV_5300 64 +#define GPU_LOOPS_NV_5400 64 +#define GPU_LOOPS_NV_5500 128 +#define GPU_LOOPS_NV_5600 128 +#define GPU_LOOPS_NV_5700 256 +#define GPU_LOOPS_NV_5800 256 +#define GPU_LOOPS_NV_6000 128 +#define GPU_LOOPS_NV_6100 64 +#define GPU_LOOPS_NV_6211 200 +#define GPU_LOOPS_NV_6212 200 +#define GPU_LOOPS_NV_6213 200 +#define GPU_LOOPS_NV_6221 200 +#define GPU_LOOPS_NV_6222 200 +#define GPU_LOOPS_NV_6223 200 +#define GPU_LOOPS_NV_6231 200 +#define GPU_LOOPS_NV_6232 200 +#define GPU_LOOPS_NV_6233 200 +#define GPU_LOOPS_NV_6241 200 +#define GPU_LOOPS_NV_6242 200 +#define GPU_LOOPS_NV_6243 200 +#define GPU_LOOPS_NV_6300 256 +#define GPU_LOOPS_NV_6400 256 +#define GPU_LOOPS_NV_6500 256 +#define GPU_LOOPS_NV_6600 200 +#define GPU_LOOPS_NV_6700 256 +#define GPU_LOOPS_NV_6800 200 +#define GPU_LOOPS_NV_6900 64 +#define GPU_LOOPS_NV_7100 256 +#define GPU_LOOPS_NV_7200 200 +#define GPU_LOOPS_NV_7300 32 +#define GPU_LOOPS_NV_7400 200 +#define GPU_LOOPS_NV_7500 32 +#define GPU_LOOPS_NV_7600 128 +#define GPU_LOOPS_NV_7700 128 +#define GPU_LOOPS_NV_7800 256 +#define GPU_LOOPS_NV_7900 128 +#define GPU_LOOPS_NV_8000 64 +#define GPU_LOOPS_NV_8100 64 +#define GPU_LOOPS_NV_8200 200 +#define GPU_LOOPS_NV_8300 64 +#define GPU_LOOPS_NV_8400 32 +#define GPU_LOOPS_NV_8500 128 +#define GPU_LOOPS_NV_8600 32 +#define GPU_LOOPS_NV_8700 32 +#define GPU_LOOPS_NV_8800 256 +#define GPU_LOOPS_NV_8900 1 +#define GPU_LOOPS_NV_9000 16 +#define GPU_LOOPS_NV_9100 256 +#define GPU_LOOPS_NV_9200 200 +#define GPU_LOOPS_NV_9300 1 +#define GPU_LOOPS_NV_9400 200 +#define GPU_LOOPS_NV_9500 200 +#define GPU_LOOPS_NV_9600 200 +#define GPU_LOOPS_NV_9700 200 +#define GPU_LOOPS_NV_9710 200 +#define GPU_LOOPS_NV_9720 200 +#define GPU_LOOPS_NV_9800 200 +#define GPU_LOOPS_NV_9810 200 +#define GPU_LOOPS_NV_9820 200 +#define GPU_LOOPS_NV_9900 512 +#define GPU_LOOPS_NV_10000 200 +#define GPU_LOOPS_NV_10100 512 +#define GPU_LOOPS_NV_10200 64 +#define GPU_LOOPS_NV_10300 128 +#define GPU_LOOPS_NV_10400 256 +#define GPU_LOOPS_NV_10410 256 +#define GPU_LOOPS_NV_10420 256 +#define GPU_LOOPS_NV_10500 64 +#define GPU_LOOPS_NV_10600 128 +#define GPU_LOOPS_NV_10700 64 +#define GPU_LOOPS_NV_10800 32 +#define GPU_LOOPS_NV_10900 200 +#define GPU_LOOPS_NV_11000 128 +#define GPU_LOOPS_NV_11100 128 +#define GPU_LOOPS_NV_11200 128 +#define GPU_LOOPS_NV_11300 256 +#define GPU_LOOPS_NV_11400 256 +#define GPU_LOOPS_NV_11500 512 +#define GPU_LOOPS_NV_11600 512 +#define GPU_LOOPS_NV_11700 64 +#define GPU_LOOPS_NV_11800 64 +#define GPU_LOOPS_NV_11900 200 +#define GPU_LOOPS_NV_12000 200 +#define GPU_LOOPS_NV_12100 200 +#define GPU_LOOPS_NV_12200 256 +#define GPU_LOOPS_NV_12300 256 +#define GPU_LOOPS_NV_12400 256 +#define GPU_LOOPS_NV_12500 256 +#define GPU_LOOPS_NV_12600 16 +#define GPU_LOOPS_NV_12700 10 +#define GPU_LOOPS_NV_12800 100 + +#define GPU_LOOPS_AMD_0 256 +#define GPU_LOOPS_AMD_10 256 +#define GPU_LOOPS_AMD_11 256 +#define GPU_LOOPS_AMD_12 256 +#define GPU_LOOPS_AMD_20 256 +#define GPU_LOOPS_AMD_21 256 +#define GPU_LOOPS_AMD_22 256 +#define GPU_LOOPS_AMD_23 256 +#define GPU_LOOPS_AMD_30 256 +#define GPU_LOOPS_AMD_40 256 +#define GPU_LOOPS_AMD_50 64 +#define GPU_LOOPS_AMD_60 64 +#define GPU_LOOPS_AMD_100 128 +#define GPU_LOOPS_AMD_101 128 +#define GPU_LOOPS_AMD_110 128 +#define GPU_LOOPS_AMD_111 128 +#define GPU_LOOPS_AMD_112 128 +#define GPU_LOOPS_AMD_120 128 +#define GPU_LOOPS_AMD_121 128 +#define GPU_LOOPS_AMD_122 128 +#define GPU_LOOPS_AMD_124 128 +#define GPU_LOOPS_AMD_130 128 +#define GPU_LOOPS_AMD_131 128 +#define GPU_LOOPS_AMD_132 128 +#define GPU_LOOPS_AMD_133 128 +#define GPU_LOOPS_AMD_140 128 +#define GPU_LOOPS_AMD_141 128 +#define GPU_LOOPS_AMD_150 64 +#define GPU_LOOPS_AMD_160 64 +#define GPU_LOOPS_AMD_190 128 +#define GPU_LOOPS_AMD_200 128 +#define GPU_LOOPS_AMD_300 64 +#define GPU_LOOPS_AMD_400 256 +#define GPU_LOOPS_AMD_500 256 +#define GPU_LOOPS_AMD_501 256 +#define GPU_LOOPS_AMD_900 256 +#define GPU_LOOPS_AMD_910 256 +#define GPU_LOOPS_AMD_1000 256 +#define GPU_LOOPS_AMD_1100 128 +#define GPU_LOOPS_AMD_1400 64 +#define GPU_LOOPS_AMD_1410 64 +#define GPU_LOOPS_AMD_1420 64 +#define GPU_LOOPS_AMD_1421 64 +#define GPU_LOOPS_AMD_1430 64 +#define GPU_LOOPS_AMD_1440 64 +#define GPU_LOOPS_AMD_1441 64 +#define GPU_LOOPS_AMD_1450 32 +#define GPU_LOOPS_AMD_1460 32 +#define GPU_LOOPS_AMD_1500 256 +#define GPU_LOOPS_AMD_1600 256 +#define GPU_LOOPS_AMD_1700 32 +#define GPU_LOOPS_AMD_1710 32 +#define GPU_LOOPS_AMD_1711 32 +#define GPU_LOOPS_AMD_1720 32 +#define GPU_LOOPS_AMD_1722 32 +#define GPU_LOOPS_AMD_1730 32 +#define GPU_LOOPS_AMD_1731 32 +#define GPU_LOOPS_AMD_1740 32 +#define GPU_LOOPS_AMD_1750 16 +#define GPU_LOOPS_AMD_1760 16 +#define GPU_LOOPS_AMD_1800 16 +#define GPU_LOOPS_AMD_2100 256 +#define GPU_LOOPS_AMD_2400 256 +#define GPU_LOOPS_AMD_2410 256 +#define GPU_LOOPS_AMD_2500 256 +#define GPU_LOOPS_AMD_2600 128 +#define GPU_LOOPS_AMD_2611 128 +#define GPU_LOOPS_AMD_2612 128 +#define GPU_LOOPS_AMD_2711 64 +#define GPU_LOOPS_AMD_2811 64 +#define GPU_LOOPS_AMD_3000 256 +#define GPU_LOOPS_AMD_3100 16 +#define GPU_LOOPS_AMD_3200 16 +#define GPU_LOOPS_AMD_3710 128 +#define GPU_LOOPS_AMD_3711 128 +#define GPU_LOOPS_AMD_3800 256 +#define GPU_LOOPS_AMD_4300 128 +#define GPU_LOOPS_AMD_4400 128 +#define GPU_LOOPS_AMD_4500 128 +#define GPU_LOOPS_AMD_4700 128 +#define GPU_LOOPS_AMD_4800 256 +#define GPU_LOOPS_AMD_4900 128 +#define GPU_LOOPS_AMD_5000 64 +#define GPU_LOOPS_AMD_5100 256 +#define GPU_LOOPS_AMD_5200 256 +#define GPU_LOOPS_AMD_5300 32 +#define GPU_LOOPS_AMD_5400 32 +#define GPU_LOOPS_AMD_5500 128 +#define GPU_LOOPS_AMD_5600 64 +#define GPU_LOOPS_AMD_5700 64 +#define GPU_LOOPS_AMD_5800 256 +#define GPU_LOOPS_AMD_6000 64 +#define GPU_LOOPS_AMD_6100 64 +#define GPU_LOOPS_AMD_6211 200 +#define GPU_LOOPS_AMD_6212 200 +#define GPU_LOOPS_AMD_6213 200 +#define GPU_LOOPS_AMD_6221 200 +#define GPU_LOOPS_AMD_6222 200 +#define GPU_LOOPS_AMD_6223 200 +#define GPU_LOOPS_AMD_6231 200 +#define GPU_LOOPS_AMD_6232 200 +#define GPU_LOOPS_AMD_6233 200 +#define GPU_LOOPS_AMD_6241 200 +#define GPU_LOOPS_AMD_6242 200 +#define GPU_LOOPS_AMD_6243 200 +#define GPU_LOOPS_AMD_6300 256 +#define GPU_LOOPS_AMD_6400 256 +#define GPU_LOOPS_AMD_6500 256 +#define GPU_LOOPS_AMD_6600 200 +#define GPU_LOOPS_AMD_6700 256 +#define GPU_LOOPS_AMD_6800 200 +#define GPU_LOOPS_AMD_6900 64 +#define GPU_LOOPS_AMD_7100 256 +#define GPU_LOOPS_AMD_7200 200 +#define GPU_LOOPS_AMD_7300 64 +#define GPU_LOOPS_AMD_7400 200 +#define GPU_LOOPS_AMD_7500 16 +#define GPU_LOOPS_AMD_7600 128 +#define GPU_LOOPS_AMD_7700 128 +#define GPU_LOOPS_AMD_7800 64 +#define GPU_LOOPS_AMD_7900 256 +#define GPU_LOOPS_AMD_8000 64 +#define GPU_LOOPS_AMD_8100 128 +#define GPU_LOOPS_AMD_8200 200 +#define GPU_LOOPS_AMD_8300 64 +#define GPU_LOOPS_AMD_8400 64 +#define GPU_LOOPS_AMD_8500 16 +#define GPU_LOOPS_AMD_8600 16 +#define GPU_LOOPS_AMD_8700 16 +#define GPU_LOOPS_AMD_8800 256 +#define GPU_LOOPS_AMD_8900 1 +#define GPU_LOOPS_AMD_9000 16 +#define GPU_LOOPS_AMD_9100 256 +#define GPU_LOOPS_AMD_9200 200 +#define GPU_LOOPS_AMD_9300 1 +#define GPU_LOOPS_AMD_9400 200 +#define GPU_LOOPS_AMD_9500 200 +#define GPU_LOOPS_AMD_9600 200 +#define GPU_LOOPS_AMD_9700 200 +#define GPU_LOOPS_AMD_9710 200 +#define GPU_LOOPS_AMD_9720 200 +#define GPU_LOOPS_AMD_9800 200 +#define GPU_LOOPS_AMD_9810 200 +#define GPU_LOOPS_AMD_9820 200 +#define GPU_LOOPS_AMD_9900 256 +#define GPU_LOOPS_AMD_10000 200 +#define GPU_LOOPS_AMD_10100 512 +#define GPU_LOOPS_AMD_10200 64 +#define GPU_LOOPS_AMD_10300 128 +#define GPU_LOOPS_AMD_10400 256 +#define GPU_LOOPS_AMD_10410 256 +#define GPU_LOOPS_AMD_10420 256 +#define GPU_LOOPS_AMD_10500 64 +#define GPU_LOOPS_AMD_10600 64 +#define GPU_LOOPS_AMD_10700 64 +#define GPU_LOOPS_AMD_10800 32 +#define GPU_LOOPS_AMD_10900 200 +#define GPU_LOOPS_AMD_11000 256 +#define GPU_LOOPS_AMD_11100 128 +#define GPU_LOOPS_AMD_11200 128 +#define GPU_LOOPS_AMD_11300 256 +#define GPU_LOOPS_AMD_11400 128 +#define GPU_LOOPS_AMD_11500 256 +#define GPU_LOOPS_AMD_11600 512 +#define GPU_LOOPS_AMD_11700 64 +#define GPU_LOOPS_AMD_11800 64 +#define GPU_LOOPS_AMD_11900 200 +#define GPU_LOOPS_AMD_12000 200 +#define GPU_LOOPS_AMD_12100 200 +#define GPU_LOOPS_AMD_12200 256 +#define GPU_LOOPS_AMD_12300 256 +#define GPU_LOOPS_AMD_12400 256 +#define GPU_LOOPS_AMD_12500 256 +#define GPU_LOOPS_AMD_12600 32 +#define GPU_LOOPS_AMD_12700 10 +#define GPU_LOOPS_AMD_12800 100 + +/** + * Strings + */ + +#define HT_00000 "MD5" +#define HT_00010 "md5($pass.$salt)" +#define HT_00020 "md5($salt.$pass)" +#define HT_00030 "md5(unicode($pass).$salt)" +#define HT_00040 "md5($salt.unicode($pass))" +#define HT_00050 "HMAC-MD5 (key = $pass)" +#define HT_00060 "HMAC-MD5 (key = $salt)" +#define HT_00100 "SHA1" +#define HT_00110 "sha1($pass.$salt)" +#define HT_00120 "sha1($salt.$pass)" +#define HT_00130 "sha1(unicode($pass).$salt)" +#define HT_00140 "sha1($salt.unicode($pass))" +#define HT_00150 "HMAC-SHA1 (key = $pass)" +#define HT_00160 "HMAC-SHA1 (key = $salt)" +#define HT_00190 "sha1(LinkedIn)" +#define HT_00200 "MySQL323" +#define HT_00300 "MySQL4.1/MySQL5" +#define HT_00400 "phpass, MD5(Wordpress), MD5(phpBB3), MD5(Joomla)" +#define HT_00500 "md5crypt, MD5(Unix), FreeBSD MD5, Cisco-IOS MD5" +#define HT_00501 "Juniper IVE" +#define HT_00900 "MD4" +#define HT_00910 "md4($pass.$salt)" +#define HT_01000 "NTLM" +#define HT_01100 "Domain Cached Credentials (DCC), MS Cache" +#define HT_01400 "SHA256" +#define HT_01410 "sha256($pass.$salt)" +#define HT_01420 "sha256($salt.$pass)" +#define HT_01430 "sha256(unicode($pass).$salt)" +#define HT_01440 "sha256($salt.$pass)" +#define HT_01450 "HMAC-SHA256 (key = $pass)" +#define HT_01460 "HMAC-SHA256 (key = $salt)" +#define HT_01500 "descrypt, DES(Unix), Traditional DES" +#define HT_01600 "md5apr1, MD5(APR), Apache MD5" +#define HT_01700 "SHA512" +#define HT_01710 "sha512($pass.$salt)" +#define HT_01720 "sha512($salt.$pass)" +#define HT_01730 "sha512(unicode($pass).$salt)" +#define HT_01740 "sha512($salt.unicode($pass))" +#define HT_01750 "HMAC-SHA512 (key = $pass)" +#define HT_01760 "HMAC-SHA512 (key = $salt)" +#define HT_01800 "sha512crypt, SHA512(Unix)" +#define HT_02100 "Domain Cached Credentials 2 (DCC2), MS Cache 2" +#define HT_02400 "Cisco-PIX MD5" +#define HT_02410 "Cisco-ASA MD5" +#define HT_02500 "WPA/WPA2" +#define HT_02600 "Double MD5" +#define HT_03000 "LM" +#define HT_03100 "Oracle H: Type (Oracle 7+)" +#define HT_03200 "bcrypt, Blowfish(OpenBSD)" +#define HT_03710 "md5($salt.md5($pass))" +#define HT_03711 "Mediawiki B type" +#define HT_03800 "md5($salt.$pass.$salt)" +#define HT_04300 "md5(strtoupper(md5($pass)))" +#define HT_04400 "md5(sha1($pass))" +#define HT_04500 "Double SHA1" +#define HT_04700 "sha1(md5($pass))" +#define HT_04800 "MD5(Chap), iSCSI CHAP authentication" +#define HT_04900 "sha1($salt.$pass.$salt)" +#define HT_05000 "SHA-3(Keccak)" +#define HT_05100 "Half MD5" +#define HT_05200 "Password Safe v3" +#define HT_05300 "IKE-PSK MD5" +#define HT_05400 "IKE-PSK SHA1" +#define HT_05500 "NetNTLMv1-VANILLA / NetNTLMv1+ESS" +#define HT_05600 "NetNTLMv2" +#define HT_05700 "Cisco-IOS SHA256" +#define HT_05800 "Android PIN" +#define HT_06000 "RipeMD160" +#define HT_06100 "Whirlpool" +#define HT_06300 "AIX {smd5}" +#define HT_06400 "AIX {ssha256}" +#define HT_06500 "AIX {ssha512}" +#define HT_06600 "1Password, agilekeychain" +#define HT_06700 "AIX {ssha1}" +#define HT_06800 "Lastpass" +#define HT_06900 "GOST R 34.11-94" +#define HT_07100 "OSX v10.8+" +#define HT_07200 "GRUB 2" +#define HT_07300 "IPMI2 RAKP HMAC-SHA1" +#define HT_07400 "sha256crypt, SHA256(Unix)" +#define HT_07500 "Kerberos 5 AS-REQ Pre-Auth etype 23" +#define HT_07600 "Redmine Project Management Web App" +#define HT_07700 "SAP CODVN B (BCODE)" +#define HT_07800 "SAP CODVN F/G (PASSCODE)" +#define HT_07900 "Drupal7" +#define HT_08000 "Sybase ASE" +#define HT_08100 "Citrix NetScaler" +#define HT_08200 "1Password, cloudkeychain" +#define HT_08300 "DNSSEC (NSEC3)" +#define HT_08400 "WBB3, Woltlab Burning Board 3" +#define HT_08500 "RACF" +#define HT_08600 "Lotus Notes/Domino 5" +#define HT_08700 "Lotus Notes/Domino 6" +#define HT_08800 "Android FDE <= 4.3" +#define HT_08900 "scrypt" +#define HT_09000 "Password Safe v2" +#define HT_09100 "Lotus Notes/Domino 8" +#define HT_09200 "Cisco $8$" +#define HT_09300 "Cisco $9$" +#define HT_09400 "Office 2007" +#define HT_09500 "Office 2010" +#define HT_09600 "Office 2013" +#define HT_09700 "MS Office <= 2003 MD5 + RC4, oldoffice$0, oldoffice$1" +#define HT_09710 "MS Office <= 2003 MD5 + RC4, collision-mode #1" +#define HT_09720 "MS Office <= 2003 MD5 + RC4, collision-mode #2" +#define HT_09800 "MS Office <= 2003 SHA1 + RC4, oldoffice$3, oldoffice$4" +#define HT_09810 "MS Office <= 2003 SHA1 + RC4, collision-mode #1" +#define HT_09820 "MS Office <= 2003 SHA1 + RC4, collision-mode #2" +#define HT_09900 "Radmin2" +#define HT_10000 "Django (PBKDF2-SHA256)" +#define HT_10100 "SipHash" +#define HT_10200 "Cram MD5" +#define HT_10300 "SAP CODVN H (PWDSALTEDHASH) iSSHA-1" +#define HT_10400 "PDF 1.1 - 1.3 (Acrobat 2 - 4)" +#define HT_10410 "PDF 1.1 - 1.3 (Acrobat 2 - 4) + collider-mode #1" +#define HT_10420 "PDF 1.1 - 1.3 (Acrobat 2 - 4) + collider-mode #2" +#define HT_10500 "PDF 1.4 - 1.6 (Acrobat 5 - 8)" +#define HT_10600 "PDF 1.7 Level 3 (Acrobat 9)" +#define HT_10700 "PDF 1.7 Level 8 (Acrobat 10 - 11)" +#define HT_10800 "SHA384" +#define HT_10900 "PBKDF2-HMAC-SHA256" +#define HT_11000 "PrestaShop" +#define HT_11100 "PostgreSQL Challenge-Response Authentication (MD5)" +#define HT_11200 "MySQL Challenge-Response Authentication (SHA1)" +#define HT_11300 "Bitcoin/Litecoin wallet.dat" +#define HT_11400 "SIP digest authentication (MD5)" +#define HT_11500 "CRC32" +#define HT_11600 "7-Zip" +#define HT_11700 "GOST R 34.11-2012 (Streebog) 256-bit" +#define HT_11800 "GOST R 34.11-2012 (Streebog) 512-bit" +#define HT_11900 "PBKDF2-HMAC-MD5" +#define HT_12000 "PBKDF2-HMAC-SHA1" +#define HT_12100 "PBKDF2-HMAC-SHA512" +#define HT_12200 "eCryptfs" +#define HT_12300 "Oracle T: Type (Oracle 12+)" +#define HT_12400 "BSDiCrypt, Extended DES" +#define HT_12500 "RAR3-hp" +#define HT_12600 "ColdFusion 10+" +#define HT_12700 "Blockchain, My Wallet" +#define HT_12800 "MS-AzureSync PBKDF2-HMAC-SHA256" + +#define HT_00011 "Joomla < 2.5.18" +#define HT_00012 "PostgreSQL" +#define HT_00021 "osCommerce, xt:Commerce" +#define HT_00022 "Juniper Netscreen/SSG (ScreenOS)" +#define HT_00023 "Skype" +#define HT_00101 "SHA-1(Base64), nsldap, Netscape LDAP SHA" +#define HT_00111 "SSHA-1(Base64), nsldaps, Netscape LDAP SSHA" +#define HT_00112 "Oracle S: Type (Oracle 11+)" +#define HT_00121 "SMF > v1.1" +#define HT_00122 "OSX v10.4, v10.5, v10.6" +#define HT_00124 "Django (SHA-1)" +#define HT_00131 "MSSQL(2000)" +#define HT_00132 "MSSQL(2005)" +#define HT_00133 "PeopleSoft" +#define HT_00141 "EPiServer 6.x < v4" +#define HT_01421 "hMailServer" +#define HT_01441 "EPiServer 6.x > v4" +#define HT_01711 "SSHA-512(Base64), LDAP {SSHA512}" +#define HT_01722 "OSX v10.7" +#define HT_01731 "MSSQL(2012)" +#define HT_02611 "vBulletin < v3.8.5" +#define HT_02612 "PHPS" +#define HT_02711 "vBulletin > v3.8.5" +#define HT_02811 "IPB2+, MyBB1.2+" +#define HT_06211 "TrueCrypt 5.0+ PBKDF2-HMAC-RipeMD160 + XTS 512 bit" +#define HT_06212 "TrueCrypt 5.0+ PBKDF2-HMAC-RipeMD160 + XTS 1024 bit" +#define HT_06213 "TrueCrypt 5.0+ PBKDF2-HMAC-RipeMD160 + XTS 1536 bit" +#define HT_06221 "TrueCrypt 5.0+ PBKDF2-HMAC-SHA512 + XTS 512 bit" +#define HT_06222 "TrueCrypt 5.0+ PBKDF2-HMAC-SHA512 + XTS 1024 bit" +#define HT_06223 "TrueCrypt 5.0+ PBKDF2-HMAC-SHA512 + XTS 1536 bit" +#define HT_06231 "TrueCrypt 5.0+ PBKDF2-HMAC-Whirlpool + XTS 512 bit" +#define HT_06232 "TrueCrypt 5.0+ PBKDF2-HMAC-Whirlpool + XTS 1024 bit" +#define HT_06233 "TrueCrypt 5.0+ PBKDF2-HMAC-Whirlpool + XTS 1536 bit" +#define HT_06241 "TrueCrypt 5.0+ PBKDF2-HMAC-RipeMD160 + XTS 512 bit + boot-mode" +#define HT_06242 "TrueCrypt 5.0+ PBKDF2-HMAC-RipeMD160 + XTS 1024 bit + boot-mode" +#define HT_06243 "TrueCrypt 5.0+ PBKDF2-HMAC-RipeMD160 + XTS 1536 bit + boot-mode" + +/** + * Outfile formats + */ + +#define OUTFILE_FMT_HASH (1 << 0) +#define OUTFILE_FMT_PLAIN (1 << 1) +#define OUTFILE_FMT_HEXPLAIN (1 << 2) +#define OUTFILE_FMT_CRACKPOS (1 << 3) + +/** + * algo specific + */ + +#define DISPLAY_LEN_MIN_0 32 +#define DISPLAY_LEN_MAX_0 32 +#define DISPLAY_LEN_MIN_10 32 + 1 + 0 +#define DISPLAY_LEN_MAX_10 32 + 1 + 51 +#define DISPLAY_LEN_MIN_10H 32 + 1 + 0 +#define DISPLAY_LEN_MAX_10H 32 + 1 + 102 +#define DISPLAY_LEN_MIN_20 32 + 1 + 0 +#define DISPLAY_LEN_MAX_20 32 + 1 + 31 +#define DISPLAY_LEN_MIN_20H 32 + 1 + 0 +#define DISPLAY_LEN_MAX_20H 32 + 1 + 62 +#define DISPLAY_LEN_MIN_50 32 + 1 + 0 +#define DISPLAY_LEN_MAX_50 32 + 1 + 51 +#define DISPLAY_LEN_MIN_50H 32 + 1 + 0 +#define DISPLAY_LEN_MAX_50H 32 + 1 + 102 +#define DISPLAY_LEN_MIN_100 40 +#define DISPLAY_LEN_MAX_100 40 +#define DISPLAY_LEN_MIN_110 40 + 1 + 0 +#define DISPLAY_LEN_MAX_110 40 + 1 + 51 +#define DISPLAY_LEN_MIN_110H 40 + 1 + 0 +#define DISPLAY_LEN_MAX_110H 40 + 1 + 102 +#define DISPLAY_LEN_MIN_120 40 + 1 + 0 +#define DISPLAY_LEN_MAX_120 40 + 1 + 31 +#define DISPLAY_LEN_MIN_120H 40 + 1 + 0 +#define DISPLAY_LEN_MAX_120H 40 + 1 + 62 +#define DISPLAY_LEN_MIN_150 40 + 1 + 0 +#define DISPLAY_LEN_MAX_150 40 + 1 + 51 +#define DISPLAY_LEN_MIN_150H 40 + 1 + 0 +#define DISPLAY_LEN_MAX_150H 40 + 1 + 102 +#define DISPLAY_LEN_MIN_190 40 +#define DISPLAY_LEN_MAX_190 40 +#define DISPLAY_LEN_MIN_200 16 +#define DISPLAY_LEN_MAX_200 16 +#define DISPLAY_LEN_MIN_300 40 +#define DISPLAY_LEN_MAX_300 40 +#define DISPLAY_LEN_MIN_400 34 +#define DISPLAY_LEN_MAX_400 34 +#define DISPLAY_LEN_MIN_500 3 + 1 + 0 + 22 +#define DISPLAY_LEN_MIN_501 104 +#define DISPLAY_LEN_MAX_500 3 + 1 + 8 + 22 +#define DISPLAY_LEN_MAX_501 104 +#define DISPLAY_LEN_MIN_900 32 +#define DISPLAY_LEN_MAX_900 32 +#define DISPLAY_LEN_MIN_910 32 + 1 + 0 +#define DISPLAY_LEN_MAX_910 32 + 1 + 51 +#define DISPLAY_LEN_MIN_910H 32 + 1 + 0 +#define DISPLAY_LEN_MAX_910H 32 + 1 + 102 +#define DISPLAY_LEN_MIN_1000 32 +#define DISPLAY_LEN_MAX_1000 32 +#define DISPLAY_LEN_MIN_1100 32 + 1 + 0 +#define DISPLAY_LEN_MAX_1100 32 + 1 + 19 +#define DISPLAY_LEN_MIN_1100H 32 + 1 + 0 +#define DISPLAY_LEN_MAX_1100H 32 + 1 + 38 +#define DISPLAY_LEN_MIN_1400 64 +#define DISPLAY_LEN_MAX_1400 64 +#define DISPLAY_LEN_MIN_1410 64 + 1 + 0 +#define DISPLAY_LEN_MAX_1410 64 + 1 + 51 +#define DISPLAY_LEN_MIN_1410H 64 + 1 + 0 +#define DISPLAY_LEN_MAX_1410H 64 + 1 + 102 +#define DISPLAY_LEN_MIN_1420 64 + 1 + 0 +#define DISPLAY_LEN_MAX_1420 64 + 1 + 16 +#define DISPLAY_LEN_MIN_1420H 64 + 1 + 0 +#define DISPLAY_LEN_MAX_1420H 64 + 1 + 32 +#define DISPLAY_LEN_MIN_1421 70 +#define DISPLAY_LEN_MAX_1421 70 +#define DISPLAY_LEN_MIN_1450 64 + 1 + 0 +#define DISPLAY_LEN_MAX_1450 64 + 1 + 51 +#define DISPLAY_LEN_MIN_1450H 64 + 1 + 0 +#define DISPLAY_LEN_MAX_1450H 64 + 1 + 102 +#define DISPLAY_LEN_MIN_1500 13 +#define DISPLAY_LEN_MAX_1500 13 +#define DISPLAY_LEN_MIN_1600 29 + 0 +#define DISPLAY_LEN_MAX_1600 29 + 8 +#define DISPLAY_LEN_MIN_1700 128 +#define DISPLAY_LEN_MAX_1700 128 +#define DISPLAY_LEN_MIN_1710 128 + 1 + 0 +#define DISPLAY_LEN_MAX_1710 128 + 1 + 51 +#define DISPLAY_LEN_MIN_1710H 128 + 1 + 0 +#define DISPLAY_LEN_MAX_1710H 128 + 1 + 102 +#define DISPLAY_LEN_MIN_1720 128 + 1 + 0 +#define DISPLAY_LEN_MAX_1720 128 + 1 + 16 +#define DISPLAY_LEN_MIN_1720H 128 + 1 + 0 +#define DISPLAY_LEN_MAX_1720H 128 + 1 + 32 +#define DISPLAY_LEN_MIN_1730 128 + 1 + 0 +#define DISPLAY_LEN_MAX_1730 128 + 1 + 16 +#define DISPLAY_LEN_MIN_1731 128 + 6 + 0 +#define DISPLAY_LEN_MAX_1731 128 + 6 + 16 +#define DISPLAY_LEN_MIN_1740 128 + 1 + 0 +#define DISPLAY_LEN_MAX_1740 128 + 1 + 16 +#define DISPLAY_LEN_MIN_1750 128 + 1 + 0 +#define DISPLAY_LEN_MAX_1750 128 + 1 + 51 +#define DISPLAY_LEN_MIN_1750H 128 + 1 + 0 +#define DISPLAY_LEN_MAX_1750H 128 + 1 + 102 +#define DISPLAY_LEN_MIN_1800 90 + 0 +#define DISPLAY_LEN_MAX_1800 90 + 16 +#define DISPLAY_LEN_MIN_2100 6 + 1 + 1 + 32 + 1 + 0 +#define DISPLAY_LEN_MAX_2100 6 + 5 + 1 + 32 + 1 + 19 +#define DISPLAY_LEN_MIN_2100H 6 + 1 + 1 + 32 + 1 + 0 +#define DISPLAY_LEN_MAX_2100H 6 + 5 + 1 + 32 + 1 + 38 +#define DISPLAY_LEN_MIN_2400 16 +#define DISPLAY_LEN_MAX_2400 16 +#define DISPLAY_LEN_MIN_2410 16 + 1 + 0 +#define DISPLAY_LEN_MAX_2410 16 + 1 + 16 +#define DISPLAY_LEN_MIN_2410H 16 + 1 + 0 +#define DISPLAY_LEN_MAX_2410H 16 + 1 + 32 +#define DISPLAY_LEN_MIN_2500 64 + 1 + 0 +#define DISPLAY_LEN_MAX_2500 64 + 1 + 15 +#define DISPLAY_LEN_MIN_2600 32 +#define DISPLAY_LEN_MAX_2600 32 +#define DISPLAY_LEN_MIN_3000 16 +#define DISPLAY_LEN_MAX_3000 16 +#define DISPLAY_LEN_MIN_3100 16 + 1 + 0 +#define DISPLAY_LEN_MAX_3100 16 + 1 + 30 +#define DISPLAY_LEN_MIN_3100H 16 + 1 + 0 +#define DISPLAY_LEN_MAX_3100H 16 + 1 + 60 +#define DISPLAY_LEN_MIN_3200 60 +#define DISPLAY_LEN_MAX_3200 60 +#define DISPLAY_LEN_MIN_3711 3 + 0 + 1 + 32 +#define DISPLAY_LEN_MAX_3711 3 + 31 + 1 + 32 +#define DISPLAY_LEN_MIN_4300 32 +#define DISPLAY_LEN_MAX_4300 32 +#define DISPLAY_LEN_MIN_4800 32 + 1 + 32 + 1 + 2 +#define DISPLAY_LEN_MAX_4800 32 + 1 + 32 + 1 + 2 +#define DISPLAY_LEN_MIN_5000 16 +#define DISPLAY_LEN_MAX_5000 400 +#define DISPLAY_LEN_MIN_5100 16 +#define DISPLAY_LEN_MAX_5100 16 +#define DISPLAY_LEN_MIN_5300 48 +#define DISPLAY_LEN_MAX_5300 1024 +#define DISPLAY_LEN_MIN_5400 56 +#define DISPLAY_LEN_MAX_5400 1024 +#define DISPLAY_LEN_MIN_5500 1 + 1 + 0 + 1 + 1 + 1 + 0 + 1 + 48 + 1 + 16 +#define DISPLAY_LEN_MAX_5500 60 + 1 + 0 + 1 + 45 + 1 + 48 + 1 + 48 + 1 + 16 +#define DISPLAY_LEN_MIN_5600 1 + 1 + 0 + 1 + 1 + 1 + 16 + 1 + 32 + 1 + 1 +#define DISPLAY_LEN_MAX_5600 60 + 1 + 0 + 1 + 45 + 1 + 16 + 1 + 32 + 1 + 1024 +#define DISPLAY_LEN_MIN_5700 43 +#define DISPLAY_LEN_MAX_5700 43 +#define DISPLAY_LEN_MIN_5800 40 + 1 + 1 +#define DISPLAY_LEN_MAX_5800 40 + 1 + 16 +#define DISPLAY_LEN_MIN_6000 40 +#define DISPLAY_LEN_MAX_6000 40 +#define DISPLAY_LEN_MIN_6100 128 +#define DISPLAY_LEN_MAX_6100 128 +#define DISPLAY_LEN_MIN_6300 6 + 1 + 8 + 22 +#define DISPLAY_LEN_MAX_6300 6 + 1 + 48 + 22 +#define DISPLAY_LEN_MIN_6400 9 + 2 + 1 + 16 + 1 + 43 +#define DISPLAY_LEN_MAX_6400 9 + 2 + 1 + 48 + 1 + 43 +#define DISPLAY_LEN_MIN_6500 9 + 2 + 1 + 16 + 1 + 86 +#define DISPLAY_LEN_MAX_6500 9 + 2 + 1 + 48 + 1 + 86 +#define DISPLAY_LEN_MIN_6600 1 + 1 + 16 + 1 + 2080 +#define DISPLAY_LEN_MAX_6600 6 + 1 + 16 + 1 + 2080 +#define DISPLAY_LEN_MIN_6700 7 + 2 + 1 + 16 + 1 + 27 +#define DISPLAY_LEN_MAX_6700 7 + 2 + 1 + 48 + 1 + 27 +#define DISPLAY_LEN_MIN_6800 32 + 1 + 1 + 1 + 0 +#define DISPLAY_LEN_MAX_6800 32 + 1 + 5 + 1 + 32 +#define DISPLAY_LEN_MIN_6900 64 +#define DISPLAY_LEN_MAX_6900 64 +#define DISPLAY_LEN_MIN_7100 4 + 2 + 1 + 64 + 1 + 128 +#define DISPLAY_LEN_MAX_7100 4 + 5 + 1 + 64 + 1 + 128 +#define DISPLAY_LEN_MIN_7200 19 + 1 + 1 + 1 + 128 +#define DISPLAY_LEN_MAX_7200 19 + 5 + 1 + 224 + 128 +#define DISPLAY_LEN_MIN_7300 64 + 1 + 40 +#define DISPLAY_LEN_MAX_7300 512 + 1 + 40 +#define DISPLAY_LEN_MIN_7400 47 + 0 +#define DISPLAY_LEN_MAX_7400 47 + 16 +#define DISPLAY_LEN_MIN_7500 1 + 6 + 1 + 2 + 1 + 0 + 1 + 0 + 1 + 0 + 1 + 72 + 32 +#define DISPLAY_LEN_MAX_7500 1 + 6 + 1 + 2 + 1 + 64 + 1 + 64 + 1 + 128 + 1 + 72 + 32 +#define DISPLAY_LEN_MIN_7700 1 + 1 + 16 +#define DISPLAY_LEN_MAX_7700 40 + 1 + 16 +#define DISPLAY_LEN_MIN_7800 1 + 1 + 40 +#define DISPLAY_LEN_MAX_7800 40 + 1 + 40 +#define DISPLAY_LEN_MIN_7900 3 + 1 + 8 + 43 +#define DISPLAY_LEN_MAX_7900 3 + 1 + 8 + 43 +#define DISPLAY_LEN_MIN_8000 2 + 4 + 16 + 64 +#define DISPLAY_LEN_MAX_8000 2 + 4 + 16 + 64 +#define DISPLAY_LEN_MIN_8100 1 + 8 + 40 +#define DISPLAY_LEN_MAX_8100 1 + 8 + 40 +#define DISPLAY_LEN_MIN_8200 64 + 1 + 32 + 1 + 1 + 1 + 1 +#define DISPLAY_LEN_MAX_8200 64 + 1 + 32 + 1 + 8 + 1 + 2048 +#define DISPLAY_LEN_MIN_8300 32 + 1 + 1 + 1 + 1 + 1 + 1 +#define DISPLAY_LEN_MAX_8300 32 + 1 + 32 + 1 + 32 + 1 + 5 +#define DISPLAY_LEN_MIN_8400 40 + 1 + 40 +#define DISPLAY_LEN_MAX_8400 40 + 1 + 40 +#define DISPLAY_LEN_MIN_8500 6 + 1 + 1 + 1 + 1 +#define DISPLAY_LEN_MAX_8500 6 + 1 + 8 + 1 + 16 +#define DISPLAY_LEN_MIN_8600 32 +#define DISPLAY_LEN_MAX_8600 32 +#define DISPLAY_LEN_MIN_8700 22 +#define DISPLAY_LEN_MAX_8700 22 +#define DISPLAY_LEN_MIN_8800 1 + 3 + 1 + 2 + 1 + 32 + 1 + 2 + 1 + 32 + 1 + 3072 +#define DISPLAY_LEN_MAX_8800 1 + 3 + 1 + 2 + 1 + 32 + 1 + 2 + 1 + 32 + 1 + 3072 +#define DISPLAY_LEN_MIN_8900 6 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 44 +#define DISPLAY_LEN_MAX_8900 6 + 1 + 6 + 1 + 2 + 1 + 2 + 1 + 45 + 1 + 44 +#define DISPLAY_LEN_MIN_9100 51 +#define DISPLAY_LEN_MAX_9100 51 +#define DISPLAY_LEN_MIN_9200 3 + 14 + 1 + 43 +#define DISPLAY_LEN_MAX_9200 3 + 14 + 1 + 43 +#define DISPLAY_LEN_MIN_9300 3 + 14 + 1 + 43 +#define DISPLAY_LEN_MAX_9300 3 + 14 + 1 + 43 +#define DISPLAY_LEN_MIN_9400 8 + 1 + 4 + 1 + 2 + 1 + 3 + 1 + 2 + 1 + 32 + 1 + 32 + 1 + 40 +#define DISPLAY_LEN_MAX_9400 8 + 1 + 4 + 1 + 2 + 1 + 3 + 1 + 2 + 1 + 32 + 1 + 32 + 1 + 40 +#define DISPLAY_LEN_MIN_9500 8 + 1 + 4 + 1 + 6 + 1 + 3 + 1 + 2 + 1 + 32 + 1 + 32 + 1 + 64 +#define DISPLAY_LEN_MAX_9500 8 + 1 + 4 + 1 + 6 + 1 + 3 + 1 + 2 + 1 + 32 + 1 + 32 + 1 + 64 +#define DISPLAY_LEN_MIN_9600 8 + 1 + 4 + 1 + 6 + 1 + 3 + 1 + 2 + 1 + 32 + 1 + 32 + 1 + 64 +#define DISPLAY_LEN_MAX_9600 8 + 1 + 4 + 1 + 6 + 1 + 3 + 1 + 2 + 1 + 32 + 1 + 32 + 1 + 64 +#define DISPLAY_LEN_MIN_9700 12 + 1 + 32 + 1 + 32 + 1 + 32 +#define DISPLAY_LEN_MAX_9700 12 + 1 + 32 + 1 + 32 + 1 + 32 +#define DISPLAY_LEN_MIN_9720 12 + 1 + 32 + 1 + 32 + 1 + 32 + 1 + 10 +#define DISPLAY_LEN_MAX_9720 12 + 1 + 32 + 1 + 32 + 1 + 32 + 1 + 10 +#define DISPLAY_LEN_MIN_9800 12 + 1 + 32 + 1 + 32 + 1 + 40 +#define DISPLAY_LEN_MAX_9800 12 + 1 + 32 + 1 + 32 + 1 + 40 +#define DISPLAY_LEN_MIN_9820 12 + 1 + 32 + 1 + 32 + 1 + 40 + 1 + 10 +#define DISPLAY_LEN_MAX_9820 12 + 1 + 32 + 1 + 32 + 1 + 40 + 1 + 10 +#define DISPLAY_LEN_MIN_9900 32 +#define DISPLAY_LEN_MAX_9900 32 +#define DISPLAY_LEN_MIN_10000 13 + 1 + 1 + 1 + 0 + 44 +#define DISPLAY_LEN_MAX_10000 13 + 1 + 6 + 1 + 15 + 44 +#define DISPLAY_LEN_MIN_10100 16 + 1 + 1 + 1 + 1 + 1 + 32 +#define DISPLAY_LEN_MAX_10100 16 + 1 + 1 + 1 + 1 + 1 + 32 +#define DISPLAY_LEN_MIN_10200 10 + 12 + 1 + 44 +#define DISPLAY_LEN_MAX_10200 10 + 76 + 1 + 132 +#define DISPLAY_LEN_MIN_10300 10 + 1 + 1 + 33 +#define DISPLAY_LEN_MAX_10300 10 + 5 + 1 + 49 +#define DISPLAY_LEN_MIN_10400 5 + 1 + 1 + 1 + 1 + 2 + 1 + 1 + 1 + 1 + 1 + 2 + 1 + 32 + 1 + 2 + 1 + 64 + 1 + 2 + 1 + 64 +#define DISPLAY_LEN_MAX_10400 5 + 1 + 1 + 1 + 1 + 2 + 1 + 5 + 1 + 1 + 1 + 2 + 1 + 32 + 1 + 2 + 1 + 64 + 1 + 2 + 1 + 64 +#define DISPLAY_LEN_MIN_10410 5 + 1 + 1 + 1 + 1 + 3 + 1 + 1 + 1 + 1 + 1 + 2 + 1 + 32 + 1 + 2 + 1 + 64 + 1 + 2 + 1 + 64 +#define DISPLAY_LEN_MAX_10410 5 + 1 + 1 + 1 + 1 + 3 + 1 + 5 + 1 + 1 + 1 + 2 + 1 + 32 + 1 + 2 + 1 + 64 + 1 + 2 + 1 + 64 +#define DISPLAY_LEN_MIN_10420 5 + 1 + 1 + 1 + 1 + 3 + 1 + 1 + 1 + 1 + 1 + 2 + 1 + 32 + 1 + 2 + 1 + 64 + 1 + 2 + 1 + 64 + 1 + 10 +#define DISPLAY_LEN_MAX_10420 5 + 1 + 1 + 1 + 1 + 3 + 1 + 5 + 1 + 1 + 1 + 2 + 1 + 32 + 1 + 2 + 1 + 64 + 1 + 2 + 1 + 64 + 1 + 10 +#define DISPLAY_LEN_MIN_10500 5 + 1 + 1 + 1 + 1 + 3 + 1 + 1 + 1 + 1 + 1 + 2 + 1 + 32 + 1 + 2 + 1 + 64 + 1 + 2 + 1 + 64 +#define DISPLAY_LEN_MAX_10500 5 + 1 + 1 + 1 + 1 + 3 + 1 + 5 + 1 + 1 + 1 + 2 + 1 + 64 + 1 + 2 + 1 + 64 + 1 + 2 + 1 + 64 +#define DISPLAY_LEN_MIN_10600 5 + 1 + 1 + 1 + 1 + 3 + 1 + 1 + 1 + 1 + 1 + 2 + 1 + 32 + 1 + 1 +#define DISPLAY_LEN_MAX_10600 5 + 1 + 1 + 1 + 1 + 3 + 1 + 5 + 1 + 1 + 1 + 2 + 1 + 32 + 1 + 1000 +#define DISPLAY_LEN_MIN_10700 5 + 1 + 1 + 1 + 1 + 3 + 1 + 1 + 1 + 1 + 1 + 2 + 1 + 32 + 1 + 1 +#define DISPLAY_LEN_MAX_10700 5 + 1 + 1 + 1 + 1 + 3 + 1 + 5 + 1 + 1 + 1 + 2 + 1 + 32 + 1 + 1000 +#define DISPLAY_LEN_MIN_10800 96 +#define DISPLAY_LEN_MAX_10800 96 +#define DISPLAY_LEN_MIN_10900 7 + 1 + 1 + 0 + 1 + 24 +#define DISPLAY_LEN_MAX_10900 7 + 6 + 1 + 64 + 1 + 88 +#define DISPLAY_LEN_MIN_11000 32 + 1 + 56 +#define DISPLAY_LEN_MAX_11000 32 + 1 + 56 +#define DISPLAY_LEN_MIN_11100 10 + 0 + 1 + 8 + 1 + 32 +#define DISPLAY_LEN_MAX_11100 10 + 32 + 1 + 8 + 1 + 32 +#define DISPLAY_LEN_MIN_11200 9 + 40 + 1 + 40 +#define DISPLAY_LEN_MAX_11200 9 + 40 + 1 + 40 +#define DISPLAY_LEN_MIN_11300 1 + 7 + 1 + 2 + 1 + 96 + 1 + 2 + 1 + 16 + 1 + 1 + 1 + 2 + 1 + 96 + 1 + 2 + 1 + 66 +#define DISPLAY_LEN_MAX_11300 1 + 7 + 1 + 2 + 1 + 96 + 1 + 2 + 1 + 16 + 1 + 6 + 1 + 2 + 1 + 96 + 1 + 2 + 1 + 66 +#define DISPLAY_LEN_MIN_11400 6 + 0 + 1 + 0 + 1 + 0 + 1 + 0 + 1 + 0 + 1 + 0 + 1 + 1 + 1 + 0 + 1 + 1 + 1 + 0 + 1 + 0 + 1 + 0 + 1 + 3 + 1 + 32 +#define DISPLAY_LEN_MAX_11400 6 + 512 + 1 + 512 + 1 + 116 + 1 + 116 + 1 + 246 + 1 + 245 + 1 + 246 + 1 + 245 + 1 + 50 + 1 + 50 + 1 + 50 + 1 + 50 + 1 + 3 + 1 + 32 +#define DISPLAY_LEN_MIN_11500 8 + 1 + 8 +#define DISPLAY_LEN_MAX_11500 8 + 1 + 8 +#define DISPLAY_LEN_MIN_11600 1 + 2 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 1 + 32 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 2 +#define DISPLAY_LEN_MAX_11600 1 + 2 + 1 + 1 + 1 + 2 + 1 + 1 + 1 + 64 + 1 + 1 + 1 + 32 + 1 + 10 + 1 + 3 + 1 + 3 + 1 + 768 +#define DISPLAY_LEN_MIN_11700 64 +#define DISPLAY_LEN_MAX_11700 64 +#define DISPLAY_LEN_MIN_11800 128 +#define DISPLAY_LEN_MAX_11800 128 +#define DISPLAY_LEN_MIN_11900 3 + 1 + 1 + 0 + 1 + 12 +#define DISPLAY_LEN_MAX_11900 3 + 6 + 1 + 64 + 1 + 88 +#define DISPLAY_LEN_MIN_12000 4 + 1 + 1 + 0 + 1 + 16 +#define DISPLAY_LEN_MAX_12000 4 + 6 + 1 + 64 + 1 + 88 +#define DISPLAY_LEN_MIN_12100 6 + 1 + 1 + 0 + 1 + 16 +#define DISPLAY_LEN_MAX_12100 6 + 6 + 1 + 64 + 1 + 88 +#define DISPLAY_LEN_MIN_12100 6 + 1 + 1 + 0 + 1 + 16 +#define DISPLAY_LEN_MAX_12100 6 + 6 + 1 + 64 + 1 + 88 +#define DISPLAY_LEN_MIN_12200 1 + 8 + 1 + 1 + 1 + 1 + 1 + 16 + 1 + 16 +#define DISPLAY_LEN_MAX_12200 1 + 8 + 1 + 1 + 1 + 1 + 1 + 16 + 1 + 16 +#define DISPLAY_LEN_MIN_12300 160 +#define DISPLAY_LEN_MAX_12300 160 +#define DISPLAY_LEN_MIN_12400 1 + 4 + 4 + 11 +#define DISPLAY_LEN_MAX_12400 1 + 4 + 4 + 11 +#define DISPLAY_LEN_MIN_12500 6 + 1 + 1 + 1 + 16 + 1 + 32 +#define DISPLAY_LEN_MAX_12500 6 + 1 + 1 + 1 + 16 + 1 + 32 +#define DISPLAY_LEN_MIN_12600 64 + 1 + 64 +#define DISPLAY_LEN_MAX_12600 64 + 1 + 64 +#define DISPLAY_LEN_MIN_12700 1 + 10 + 1 + 1 + 1 + 64 +#define DISPLAY_LEN_MAX_12700 1 + 10 + 1 + 5 + 1 + 20000 +#define DISPLAY_LEN_MIN_12800 11 + 1 + 20 + 1 + 1 + 1 + 64 +#define DISPLAY_LEN_MAX_12800 11 + 1 + 20 + 1 + 5 + 1 + 64 + +#define DISPLAY_LEN_MIN_11 32 + 1 + 16 +#define DISPLAY_LEN_MAX_11 32 + 1 + 32 +#define DISPLAY_LEN_MIN_11H 32 + 1 + 32 +#define DISPLAY_LEN_MAX_11H 32 + 1 + 64 +#define DISPLAY_LEN_MIN_12 32 + 1 + 1 +#define DISPLAY_LEN_MAX_12 32 + 1 + 32 +#define DISPLAY_LEN_MIN_12H 32 + 1 + 2 +#define DISPLAY_LEN_MAX_12H 32 + 1 + 64 +#define DISPLAY_LEN_MIN_21 32 + 1 + 1 +#define DISPLAY_LEN_MAX_21 32 + 1 + 15 +#define DISPLAY_LEN_MIN_21H 32 + 1 + 2 +#define DISPLAY_LEN_MAX_21H 32 + 1 + 30 +#define DISPLAY_LEN_MIN_22 30 + 1 + 1 +#define DISPLAY_LEN_MAX_22 30 + 1 + 15 +#define DISPLAY_LEN_MIN_22H 30 + 1 + 2 +#define DISPLAY_LEN_MAX_22H 30 + 1 + 30 +#define DISPLAY_LEN_MIN_23 32 + 1 + 0 +#define DISPLAY_LEN_MAX_23 32 + 1 + 23 +#define DISPLAY_LEN_MIN_101 5 + 28 +#define DISPLAY_LEN_MAX_101 5 + 28 +#define DISPLAY_LEN_MIN_111 6 + 28 + 0 +#define DISPLAY_LEN_MAX_111 6 + 28 + 40 +#define DISPLAY_LEN_MIN_112 40 + 1 + 20 +#define DISPLAY_LEN_MAX_112 40 + 1 + 20 +#define DISPLAY_LEN_MIN_121 40 + 1 + 1 +#define DISPLAY_LEN_MAX_121 40 + 1 + 32 +#define DISPLAY_LEN_MIN_121H 40 + 1 + 2 +#define DISPLAY_LEN_MAX_121H 40 + 1 + 64 +#define DISPLAY_LEN_MIN_122 8 + 40 +#define DISPLAY_LEN_MAX_122 8 + 40 +#define DISPLAY_LEN_MIN_124 4 + 1 + 0 + 1 + 40 +#define DISPLAY_LEN_MAX_124 4 + 1 + 32 + 1 + 40 +#define DISPLAY_LEN_MIN_131 6 + 8 + 80 +#define DISPLAY_LEN_MAX_131 6 + 8 + 80 +#define DISPLAY_LEN_MIN_132 6 + 8 + 40 +#define DISPLAY_LEN_MAX_132 6 + 8 + 40 +#define DISPLAY_LEN_MIN_133 28 +#define DISPLAY_LEN_MAX_133 28 +#define DISPLAY_LEN_MIN_141 14 + 0 + 1 + 28 +#define DISPLAY_LEN_MAX_141 14 + 44 + 1 + 28 +#define DISPLAY_LEN_MIN_1441 14 + 0 + 1 + 43 +#define DISPLAY_LEN_MAX_1441 14 + 24 + 1 + 43 +#define DISPLAY_LEN_MIN_1711 9 + 86 + 0 +#define DISPLAY_LEN_MAX_1711 9 + 86 + 68 +#define DISPLAY_LEN_MIN_1722 8 + 128 +#define DISPLAY_LEN_MAX_1722 8 + 128 +#define DISPLAY_LEN_MIN_2611 32 + 1 + 0 +#define DISPLAY_LEN_MAX_2611 32 + 1 + 23 +#define DISPLAY_LEN_MIN_2611H 32 + 1 + 0 +#define DISPLAY_LEN_MIN_2612 6 + 0 + 1 + 32 +#define DISPLAY_LEN_MAX_2611H 32 + 1 + 46 +#define DISPLAY_LEN_MAX_2612 6 + 46 + 1 + 32 +#define DISPLAY_LEN_MIN_2711 32 + 1 + 23 +#define DISPLAY_LEN_MAX_2711 32 + 1 + 31 +#define DISPLAY_LEN_MIN_2711H 32 + 1 + 46 +#define DISPLAY_LEN_MAX_2711H 32 + 1 + 62 +#define DISPLAY_LEN_MIN_2811 32 + 1 + 0 +#define DISPLAY_LEN_MAX_2811 32 + 1 + 31 +#define DISPLAY_LEN_MIN_2811H 32 + 1 + 0 +#define DISPLAY_LEN_MAX_2811H 32 + 1 + 62 +#define DISPLAY_LEN_MIN_7600 40 + 1 + 32 +#define DISPLAY_LEN_MAX_7600 40 + 1 + 32 + +#define HASH_TYPE_MD4 1 +#define HASH_TYPE_MD5 2 +#define HASH_TYPE_MD5H 3 +#define HASH_TYPE_SHA1 4 +#define HASH_TYPE_SHA256 5 +#define HASH_TYPE_SHA384 6 +#define HASH_TYPE_SHA512 7 +#define HASH_TYPE_DCC2 8 +#define HASH_TYPE_WPA 9 +#define HASH_TYPE_LM 10 +#define HASH_TYPE_DESCRYPT 11 +#define HASH_TYPE_ORACLEH 12 +#define HASH_TYPE_DESRACF 13 +#define HASH_TYPE_BCRYPT 14 +#define HASH_TYPE_KECCAK 15 +#define HASH_TYPE_NETNTLM 16 +#define HASH_TYPE_RIPEMD160 17 +#define HASH_TYPE_WHIRLPOOL 18 +#define HASH_TYPE_AES 19 +#define HASH_TYPE_GOST 20 +#define HASH_TYPE_KRB5PA 21 +#define HASH_TYPE_SAPB 22 +#define HASH_TYPE_SAPG 23 +#define HASH_TYPE_MYSQL 24 +#define HASH_TYPE_LOTUS5 25 +#define HASH_TYPE_LOTUS6 26 +#define HASH_TYPE_ANDROIDFDE 27 +#define HASH_TYPE_SCRYPT 28 +#define HASH_TYPE_LOTUS8 29 +#define HASH_TYPE_OFFICE2007 30 +#define HASH_TYPE_OFFICE2010 31 +#define HASH_TYPE_OFFICE2013 32 +#define HASH_TYPE_OLDOFFICE01 33 +#define HASH_TYPE_OLDOFFICE34 34 +#define HASH_TYPE_SIPHASH 35 +#define HASH_TYPE_PDFU16 36 +#define HASH_TYPE_PDFU32 37 +#define HASH_TYPE_PBKDF2_SHA256 38 +#define HASH_TYPE_BITCOIN_WALLET 39 +#define HASH_TYPE_CRC32 40 +#define HASH_TYPE_GOST_2012SBOG_256 41 +#define HASH_TYPE_GOST_2012SBOG_512 42 +#define HASH_TYPE_PBKDF2_MD5 43 +#define HASH_TYPE_PBKDF2_SHA1 44 +#define HASH_TYPE_PBKDF2_SHA512 45 +#define HASH_TYPE_ECRYPTFS 46 +#define HASH_TYPE_ORACLET 47 +#define HASH_TYPE_BSDICRYPT 48 +#define HASH_TYPE_RAR3HP 49 + +#define KERN_TYPE_MD5 0 +#define KERN_TYPE_MD5_PWSLT 10 +#define KERN_TYPE_MD5_SLTPW 20 +#define KERN_TYPE_MD5_PWUSLT 30 +#define KERN_TYPE_MD5_SLTPWU 40 +#define KERN_TYPE_HMACMD5_PW 50 +#define KERN_TYPE_HMACMD5_SLT 60 +#define KERN_TYPE_SHA1 100 +#define KERN_TYPE_SHA1_PWSLT 110 +#define KERN_TYPE_SHA1_SLTPW 120 +#define KERN_TYPE_SHA1_PWUSLT 130 +#define KERN_TYPE_SHA1_SLTPWU 140 +#define KERN_TYPE_HMACSHA1_PW 150 +#define KERN_TYPE_HMACSHA1_SLT 160 +#define KERN_TYPE_SHA1_LINKEDIN 190 +#define KERN_TYPE_MYSQL 200 +#define KERN_TYPE_MYSQL41 300 +#define KERN_TYPE_PHPASS 400 +#define KERN_TYPE_MD5CRYPT 500 +#define KERN_TYPE_MD4 900 +#define KERN_TYPE_MD4_PWU 1000 +#define KERN_TYPE_MD44_PWUSLT 1100 +#define KERN_TYPE_SHA256 1400 +#define KERN_TYPE_SHA256_PWSLT 1410 +#define KERN_TYPE_SHA256_SLTPW 1420 +#define KERN_TYPE_SHA256_PWUSLT 1430 +#define KERN_TYPE_SHA256_SLTPWU 1440 +#define KERN_TYPE_HMACSHA256_PW 1450 +#define KERN_TYPE_HMACSHA256_SLT 1460 +#define KERN_TYPE_DESCRYPT 1500 +#define KERN_TYPE_APR1CRYPT 1600 +#define KERN_TYPE_SHA512 1700 +#define KERN_TYPE_SHA512_PWSLT 1710 +#define KERN_TYPE_SHA512_SLTPW 1720 +#define KERN_TYPE_SHA512_PWSLTU 1730 +#define KERN_TYPE_SHA512_SLTPWU 1740 +#define KERN_TYPE_HMACSHA512_PW 1750 +#define KERN_TYPE_HMACSHA512_SLT 1760 +#define KERN_TYPE_SHA512CRYPT 1800 +#define KERN_TYPE_DCC2 2100 +#define KERN_TYPE_MD5PIX 2400 +#define KERN_TYPE_MD5ASA 2410 +#define KERN_TYPE_WPA 2500 +#define KERN_TYPE_MD55 2600 +#define KERN_TYPE_MD55_PWSLT1 2610 +#define KERN_TYPE_MD55_PWSLT2 2710 +#define KERN_TYPE_MD55_SLTPW 2810 +#define KERN_TYPE_LM 3000 +#define KERN_TYPE_ORACLEH 3100 +#define KERN_TYPE_BCRYPT 3200 +#define KERN_TYPE_MD5_SLT_MD5_PW 3710 +#define KERN_TYPE_MD5_SLT_PW_SLT 3800 +#define KERN_TYPE_MD5U5 4300 +#define KERN_TYPE_MD5U5_PWSLT1 4310 +#define KERN_TYPE_MD5_SHA1 4400 +#define KERN_TYPE_SHA11 4500 +#define KERN_TYPE_SHA1_MD5 4700 +#define KERN_TYPE_MD5_CHAP 4800 +#define KERN_TYPE_SHA1_SLT_PW_SLT 4900 +#define KERN_TYPE_KECCAK 5000 +#define KERN_TYPE_MD5H 5100 +#define KERN_TYPE_PSAFE3 5200 +#define KERN_TYPE_IKEPSK_MD5 5300 +#define KERN_TYPE_IKEPSK_SHA1 5400 +#define KERN_TYPE_NETNTLMv1 5500 +#define KERN_TYPE_NETNTLMv2 5600 +#define KERN_TYPE_ANDROIDPIN 5800 +#define KERN_TYPE_RIPEMD160 6000 +#define KERN_TYPE_WHIRLPOOL 6100 +#define KERN_TYPE_TCRIPEMD160_XTS512 6211 +#define KERN_TYPE_TCRIPEMD160_XTS1024 6212 +#define KERN_TYPE_TCRIPEMD160_XTS1536 6213 +#define KERN_TYPE_TCSHA512_XTS512 6221 +#define KERN_TYPE_TCSHA512_XTS1024 6222 +#define KERN_TYPE_TCSHA512_XTS1536 6223 +#define KERN_TYPE_TCWHIRLPOOL_XTS512 6231 +#define KERN_TYPE_TCWHIRLPOOL_XTS1024 6232 +#define KERN_TYPE_TCWHIRLPOOL_XTS1536 6233 +#define KERN_TYPE_MD5AIX 6300 +#define KERN_TYPE_SHA256AIX 6400 +#define KERN_TYPE_SHA512AIX 6500 +#define KERN_TYPE_AGILEKEY 6600 +#define KERN_TYPE_SHA1AIX 6700 +#define KERN_TYPE_LASTPASS 6800 +#define KERN_TYPE_GOST 6900 +#define KERN_TYPE_PBKDF2_SHA512 7100 +#define KERN_TYPE_RAKP 7300 +#define KERN_TYPE_SHA256CRYPT 7400 +#define KERN_TYPE_KRB5PA 7500 +#define KERN_TYPE_SHA1_SLT_SHA1_PW 7600 +#define KERN_TYPE_SAPB 7700 +#define KERN_TYPE_SAPG 7800 +#define KERN_TYPE_DRUPAL7 7900 +#define KERN_TYPE_SYBASEASE 8000 +#define KERN_TYPE_NETSCALER 8100 +#define KERN_TYPE_CLOUDKEY 8200 +#define KERN_TYPE_NSEC3 8300 +#define KERN_TYPE_WBB3 8400 +#define KERN_TYPE_RACF 8500 +#define KERN_TYPE_LOTUS5 8600 +#define KERN_TYPE_LOTUS6 8700 +#define KERN_TYPE_ANDROIDFDE 8800 +#define KERN_TYPE_SCRYPT 8900 +#define KERN_TYPE_PSAFE2 9000 +#define KERN_TYPE_LOTUS8 9100 +#define KERN_TYPE_OFFICE2007 9400 +#define KERN_TYPE_OFFICE2010 9500 +#define KERN_TYPE_OFFICE2013 9600 +#define KERN_TYPE_OLDOFFICE01 9700 +#define KERN_TYPE_OLDOFFICE01CM1 9710 +#define KERN_TYPE_OLDOFFICE01CM2 9720 +#define KERN_TYPE_OLDOFFICE34 9800 +#define KERN_TYPE_OLDOFFICE34CM1 9810 +#define KERN_TYPE_OLDOFFICE34CM2 9820 +#define KERN_TYPE_RADMIN2 9900 +#define KERN_TYPE_SIPHASH 10100 +#define KERN_TYPE_SAPH_SHA1 10300 +#define KERN_TYPE_PDF11 10400 +#define KERN_TYPE_PDF11CM1 10410 +#define KERN_TYPE_PDF11CM2 10420 +#define KERN_TYPE_PDF14 10500 +#define KERN_TYPE_PDF17L8 10700 +#define KERN_TYPE_SHA384 10800 +#define KERN_TYPE_PBKDF2_SHA256 10900 +#define KERN_TYPE_PRESTASHOP 11000 +#define KERN_TYPE_POSTGRESQL_AUTH 11100 +#define KERN_TYPE_MYSQL_AUTH 11200 +#define KERN_TYPE_BITCOIN_WALLET 11300 +#define KERN_TYPE_SIP_AUTH 11400 +#define KERN_TYPE_CRC32 11500 +#define KERN_TYPE_SEVEN_ZIP 11600 +#define KERN_TYPE_GOST_2012SBOG_256 11700 +#define KERN_TYPE_GOST_2012SBOG_512 11800 +#define KERN_TYPE_PBKDF2_MD5 11900 +#define KERN_TYPE_PBKDF2_SHA1 12000 +#define KERN_TYPE_ECRYPTFS 12200 +#define KERN_TYPE_ORACLET 12300 +#define KERN_TYPE_BSDICRYPT 12400 +#define KERN_TYPE_RAR3 12500 +#define KERN_TYPE_CF10 12600 +#define KERN_TYPE_MYWALLET 12700 +#define KERN_TYPE_MS_DRSR 12800 + +/** + * signatures + */ + +#define SIGNATURE_PHPASS1 "$P$" +#define SIGNATURE_PHPASS2 "$H$" +#define SIGNATURE_MD5CRYPT "$1$" +#define SIGNATURE_BCRYPT1 "$2a$" +#define SIGNATURE_BCRYPT2 "$2x$" +#define SIGNATURE_BCRYPT3 "$2y$" +#define SIGNATURE_SHA512CRYPT "$6$" +#define SIGNATURE_MD5APR1 "$apr1$" +#define SIGNATURE_MSSQL "0x0100" +#define SIGNATURE_MSSQL2012 "0x0200" +#define SIGNATURE_SHA1B64 "{SHA}" +#define SIGNATURE_SSHA1B64_lower "{ssha}" +#define SIGNATURE_SSHA1B64_upper "{SSHA}" +#define SIGNATURE_EPISERVER "$episerver$*0*" +#define SIGNATURE_EPISERVER4 "$episerver$*1*" +#define SIGNATURE_PSAFE3 "PWS3" +#define SIGNATURE_TRUECRYPT "TRUE" +#define SIGNATURE_MD5AIX "{smd5}" +#define SIGNATURE_SHA1AIX "{ssha1}" +#define SIGNATURE_SHA256AIX "{ssha256}" +#define SIGNATURE_SHA512AIX "{ssha512}" +#define SIGNATURE_SHA256CRYPT "$5$" +#define SIGNATURE_SHA512OSX "$ml$" +#define SIGNATURE_SHA512GRUB "grub.pbkdf2.sha512." +#define SIGNATURE_SHA512B64S "{SSHA512}" +#define SIGNATURE_KRB5PA "$krb5pa$23" +#define SIGNATURE_DRUPAL7 "$S$" +#define SIGNATURE_SYBASEASE "0xc007" +#define SIGNATURE_NETSCALER "1" +#define SIGNATURE_DCC2 "$DCC2$" +#define SIGNATURE_RACF "$racf$" +#define SIGNATURE_PHPS "$PHPS$" +#define SIGNATURE_MEDIAWIKI_B "$B$" +#define SIGNATURE_ANDROIDFDE "$fde$" +#define SIGNATURE_SCRYPT "SCRYPT" +#define SIGNATURE_CISCO8 "$8$" +#define SIGNATURE_CISCO9 "$9$" +#define SIGNATURE_OFFICE2007 "$office$" +#define SIGNATURE_OFFICE2010 "$office$" +#define SIGNATURE_OFFICE2013 "$office$" +#define SIGNATURE_OLDOFFICE0 "$oldoffice$0" +#define SIGNATURE_OLDOFFICE1 "$oldoffice$1" +#define SIGNATURE_OLDOFFICE3 "$oldoffice$3" +#define SIGNATURE_OLDOFFICE4 "$oldoffice$4" +#define SIGNATURE_DJANGOSHA1 "sha1$" +#define SIGNATURE_DJANGOPBKDF2 "pbkdf2_sha256$" +#define SIGNATURE_CRAM_MD5 "$cram_md5$" +#define SIGNATURE_SAPH_SHA1 "{x-issha, " +#define SIGNATURE_PDF "$pdf$" +#define SIGNATURE_PBKDF2_SHA256 "sha256:" +#define SIGNATURE_POSTGRESQL_AUTH "$postgres$" +#define SIGNATURE_MYSQL_AUTH "$mysqlna$" +#define SIGNATURE_BITCOIN_WALLET "$bitcoin$" +#define SIGNATURE_SIP_AUTH "$sip$*" +#define SIGNATURE_SEVEN_ZIP "$7z$" +#define SIGNATURE_PBKDF2_MD5 "md5:" +#define SIGNATURE_PBKDF2_SHA1 "sha1:" +#define SIGNATURE_PBKDF2_SHA512 "sha512:" +#define SIGNATURE_ECRYPTFS "$ecryptfs$" +#define SIGNATURE_BSDICRYPT "_" +#define SIGNATURE_RAR3 "$RAR3$" +#define SIGNATURE_MYWALLET "$blockchain$" +#define SIGNATURE_MS_DRSR "v1;PPH1_MD4" + +/** + * Default iteration numbers + */ + +#define ROUNDS_PHPASS (1 << 11) // $P$B +#define ROUNDS_DCC2 10240 +#define ROUNDS_WPA2 4096 +#define ROUNDS_BCRYPT (1 << 5) +#define ROUNDS_PSAFE3 2048 +#define ROUNDS_ANDROIDPIN 1024 +#define ROUNDS_TRUECRYPT_1K 1000 +#define ROUNDS_TRUECRYPT_2K 2000 +#define ROUNDS_SHA1AIX (1 << 6) +#define ROUNDS_SHA256AIX (1 << 6) +#define ROUNDS_SHA512AIX (1 << 6) +#define ROUNDS_MD5CRYPT 1000 +#define ROUNDS_SHA256CRYPT 5000 +#define ROUNDS_SHA512CRYPT 5000 +#define ROUNDS_GRUB 10000 +#define ROUNDS_SHA512OSX 35000 +#define ROUNDS_AGILEKEY 1000 +#define ROUNDS_LASTPASS 500 +#define ROUNDS_DRUPAL7 (1 << 14) // $S$C +#define ROUNDS_CLOUDKEY 40000 +#define ROUNDS_NSEC3 1 +#define ROUNDS_ANDROIDFDE 2000 +#define ROUNDS_PSAFE2 1000 +#define ROUNDS_LOTUS8 5000 +#define ROUNDS_CISCO8 20000 +#define ROUNDS_OFFICE2007 50000 +#define ROUNDS_OFFICE2010 100000 +#define ROUNDS_OFFICE2013 100000 +#define ROUNDS_DJANGOPBKDF2 20000 +#define ROUNDS_SAPH_SHA1 1024 +#define ROUNDS_PDF14 (50 + 20) +#define ROUNDS_PDF17L8 64 +#define ROUNDS_PBKDF2_SHA256 1000 +#define ROUNDS_BITCOIN_WALLET 200000 +#define ROUNDS_SEVEN_ZIP (1 << 19) +#define ROUNDS_PBKDF2_MD5 1000 +#define ROUNDS_PBKDF2_SHA1 1000 +#define ROUNDS_PBKDF2_SHA512 1000 +#define ROUNDS_ECRYPTFS 65536 +#define ROUNDS_ORACLET 4096 +#define ROUNDS_BSDICRYPT 2900 +#define ROUNDS_RAR3 262144 +#define ROUNDS_MYWALLET 10 +#define ROUNDS_MS_DRSR 100 + +/** + * salt types + */ + +#define SALT_TYPE_NONE 1 +#define SALT_TYPE_EMBEDDED 2 +#define SALT_TYPE_INTERN 3 +#define SALT_TYPE_EXTERN 4 +#define SALT_TYPE_VIRTUAL 5 + +/** + * optimizer options + */ + +#define OPTI_TYPE_ZERO_BYTE (1 << 1) +#define OPTI_TYPE_PRECOMPUTE_INIT (1 << 2) +#define OPTI_TYPE_PRECOMPUTE_MERKLE (1 << 3) +#define OPTI_TYPE_PRECOMPUTE_PERMUT (1 << 4) +#define OPTI_TYPE_MEET_IN_MIDDLE (1 << 5) +#define OPTI_TYPE_EARLY_SKIP (1 << 6) +#define OPTI_TYPE_NOT_SALTED (1 << 7) +#define OPTI_TYPE_NOT_ITERATED (1 << 8) +#define OPTI_TYPE_PREPENDED_SALT (1 << 9) +#define OPTI_TYPE_APPENDED_SALT (1 << 10) +#define OPTI_TYPE_SINGLE_HASH (1 << 11) +#define OPTI_TYPE_SINGLE_SALT (1 << 12) +#define OPTI_TYPE_BRUTE_FORCE (1 << 13) +#define OPTI_TYPE_SCALAR_MODE (1 << 14) +#define OPTI_TYPE_RAW_HASH (1 << 15) + +#define OPTI_STR_ZERO_BYTE "Zero-Byte" +#define OPTI_STR_PRECOMPUTE_INIT "Precompute-Init" +#define OPTI_STR_PRECOMPUTE_MERKLE "Precompute-Merkle-Demgard" +#define OPTI_STR_PRECOMPUTE_PERMUT "Precompute-Final-Permutation" +#define OPTI_STR_MEET_IN_MIDDLE "Meet-In-The-Middle" +#define OPTI_STR_EARLY_SKIP "Early-Skip" +#define OPTI_STR_NOT_SALTED "Not-Salted" +#define OPTI_STR_NOT_ITERATED "Not-Iterated" +#define OPTI_STR_PREPENDED_SALT "Prepended-Salt" +#define OPTI_STR_APPENDED_SALT "Appended-Salt" +#define OPTI_STR_SINGLE_HASH "Single-Hash" +#define OPTI_STR_SINGLE_SALT "Single-Salt" +#define OPTI_STR_BRUTE_FORCE "Brute-Force" +#define OPTI_STR_SCALAR_MODE "Scalar-Mode" +#define OPTI_STR_RAW_HASH "Raw-Hash" + +/** + * hash options + */ + +#define OPTS_TYPE_PT_UNICODE (1 << 0) +#define OPTS_TYPE_PT_UPPER (1 << 1) +#define OPTS_TYPE_PT_LOWER (1 << 2) +#define OPTS_TYPE_PT_ADD01 (1 << 3) +#define OPTS_TYPE_PT_ADD02 (1 << 4) +#define OPTS_TYPE_PT_ADD80 (1 << 5) +#define OPTS_TYPE_PT_ADDBITS14 (1 << 6) +#define OPTS_TYPE_PT_ADDBITS15 (1 << 7) +#define OPTS_TYPE_PT_GENERATE_LE (1 << 8) +#define OPTS_TYPE_PT_GENERATE_BE (1 << 9) +#define OPTS_TYPE_PT_NEVERCRACK (1 << 10) // if we want all possible results +#define OPTS_TYPE_PT_BITSLICE (1 << 11) +#define OPTS_TYPE_ST_UNICODE (1 << 12) +#define OPTS_TYPE_ST_UPPER (1 << 13) +#define OPTS_TYPE_ST_LOWER (1 << 14) +#define OPTS_TYPE_ST_ADD01 (1 << 15) +#define OPTS_TYPE_ST_ADD02 (1 << 16) +#define OPTS_TYPE_ST_ADD80 (1 << 17) +#define OPTS_TYPE_ST_ADDBITS14 (1 << 18) +#define OPTS_TYPE_ST_ADDBITS15 (1 << 19) +#define OPTS_TYPE_ST_GENERATE_LE (1 << 20) +#define OPTS_TYPE_ST_GENERATE_BE (1 << 21) +#define OPTS_TYPE_ST_HEX (1 << 22) +#define OPTS_TYPE_ST_BASE64 (1 << 23) +#define OPTS_TYPE_HASH_COPY (1 << 24) +#define OPTS_TYPE_HOOK12 (1 << 25) +#define OPTS_TYPE_HOOK23 (1 << 26) + +/** + * digests + */ + +#define DGST_SIZE_0 0 +#define DGST_SIZE_4_2 (2 * sizeof (uint)) // 8 +#define DGST_SIZE_4_4 (4 * sizeof (uint)) // 16 +#define DGST_SIZE_4_5 (5 * sizeof (uint)) // 20 +#define DGST_SIZE_4_6 (6 * sizeof (uint)) // 24 +#define DGST_SIZE_4_8 (8 * sizeof (uint)) // 32 +#define DGST_SIZE_4_16 (16 * sizeof (uint)) // 64 !!! +#define DGST_SIZE_4_32 (32 * sizeof (uint)) // 128 !!! +#define DGST_SIZE_4_64 (64 * sizeof (uint)) // 256 +#define DGST_SIZE_8_8 (8 * sizeof (uint64_t)) // 64 !!! +#define DGST_SIZE_8_16 (16 * sizeof (uint64_t)) // 128 !!! +#define DGST_SIZE_8_25 (25 * sizeof (uint64_t)) // 200 + +/** + * parser + */ + +#define PARSER_OK 0 +#define PARSER_COMMENT -1 +#define PARSER_GLOBAL_ZERO -2 +#define PARSER_GLOBAL_LENGTH -3 +#define PARSER_HASH_LENGTH -4 +#define PARSER_HASH_VALUE -5 +#define PARSER_SALT_LENGTH -6 +#define PARSER_SALT_VALUE -7 +#define PARSER_SALT_ITERATION -8 +#define PARSER_SEPARATOR_UNMATCHED -9 +#define PARSER_SIGNATURE_UNMATCHED -10 +#define PARSER_HCCAP_FILE_SIZE -11 +#define PARSER_HCCAP_EAPOL_SIZE -12 +#define PARSER_PSAFE2_FILE_SIZE -13 +#define PARSER_PSAFE3_FILE_SIZE -14 +#define PARSER_TC_FILE_SIZE -15 +#define PARSER_SIP_AUTH_DIRECTIVE -16 +#define PARSER_UNKNOWN_ERROR -255 + +#define PA_000 "OK" +#define PA_001 "Ignored due to comment" +#define PA_002 "Ignored due to zero length" +#define PA_003 "Line-length exception" +#define PA_004 "Hash-length exception" +#define PA_005 "Hash-value exception" +#define PA_006 "Salt-length exception" +#define PA_007 "Salt-value exception" +#define PA_008 "Salt-iteration count exception" +#define PA_009 "Separator unmatched" +#define PA_010 "Signature unmatched" +#define PA_011 "Invalid hccap filesize" +#define PA_012 "Invalid eapol size" +#define PA_013 "Invalid psafe2 filesize" +#define PA_014 "Invalid psafe3 filesize" +#define PA_015 "Invalid truecrypt filesize" +#define PA_016 "Invalid SIP directive, only MD5 is supported" +#define PA_255 "Unknown error" + +/** + * status + */ + +#define STATUS_STARTING 0 +#define STATUS_INIT 1 +#define STATUS_RUNNING 2 +#define STATUS_PAUSED 3 +#define STATUS_EXHAUSTED 4 +#define STATUS_CRACKED 5 +#define STATUS_ABORTED 6 +#define STATUS_QUIT 7 +#define STATUS_BYPASS 8 + +#define ST_0000 "Initializing" +#define ST_0001 "Starting" +#define ST_0002 "Running" +#define ST_0003 "Paused" +#define ST_0004 "Exhausted" +#define ST_0005 "Cracked" +#define ST_0006 "Aborted" +#define ST_0007 "Quit" +#define ST_0008 "Bypass" + +/** + * kernel types + */ + +#define KERN_RUN_MP 101 +#define KERN_RUN_MP_L 102 +#define KERN_RUN_MP_R 103 + +#define KERN_RUN_1 1000 +#define KERN_RUN_12 1500 +#define KERN_RUN_2 2000 +#define KERN_RUN_23 2500 +#define KERN_RUN_3 3000 + +/* + * functions + */ + +#define ROTATE_LEFT(a,n) rotl32 ((a), (n)) +#define ROTATE_RIGHT(a,n) rotr32 ((a), (n)) + +uint32_t rotl32 (const uint32_t a, const uint n); +uint32_t rotr32 (const uint32_t a, const uint n); +uint64_t rotl64 (const uint64_t a, const uint n); +uint64_t rotr64 (const uint64_t a, const uint n); + +void dump_hex (const char *s, size_t size); + +void truecrypt_crc32 (char *file, unsigned char keytab[64]); + +char *get_install_dir (const char *progname); + +uint get_vliw_by_compute_capability (const uint major, const uint minor); +uint get_vliw_by_device_name (const char *device_name); + +void *rulefind (const void *key, void *base, int nmemb, size_t size, int (*compar) (const void *, const void *)); + +int sort_by_mtime (const void *p1, const void *p2); +int sort_by_cpu_rule (const void *p1, const void *p2); +int sort_by_gpu_rule (const void *p1, const void *p2); +int sort_by_stringptr (const void *p1, const void *p2); +int sort_by_dictstat (const void *s1, const void *s2); +int sort_by_bitmap (const void *s1, const void *s2); + +int sort_by_pot (const void *v1, const void *v2); +int sort_by_hash (const void *v1, const void *v2); +int sort_by_hash_no_salt(const void *v1, const void *v2); +int sort_by_salt (const void *v1, const void *v2); +int sort_by_salt_buf (const void *v1, const void *v2); +int sort_by_hash_t_salt (const void *v1, const void *v2); +int sort_by_digest_4_2 (const void *v1, const void *v2); +int sort_by_digest_4_4 (const void *v1, const void *v2); +int sort_by_digest_4_5 (const void *v1, const void *v2); +int sort_by_digest_4_6 (const void *v1, const void *v2); +int sort_by_digest_4_8 (const void *v1, const void *v2); +int sort_by_digest_4_16 (const void *v1, const void *v2); +int sort_by_digest_4_32 (const void *v1, const void *v2); +int sort_by_digest_4_64 (const void *v1, const void *v2); +int sort_by_digest_8_8 (const void *v1, const void *v2); +int sort_by_digest_8_16 (const void *v1, const void *v2); +int sort_by_digest_8_25 (const void *v1, const void *v2); +int sort_by_digest_p0p1 (const void *v1, const void *v2); + +// special version for hccap (last 2 uints should be skipped where the digest is located) +int sort_by_hash_t_salt_hccap (const void *v1, const void *v2); + +char hex_convert (const char c); +char hex_to_char (const char hex[2]); +uint hex_to_uint (const char hex[8]); +uint64_t hex_to_uint64_t (const char hex[16]); + +void format_debug (char * debug_file, uint debug_mode, unsigned char *orig_plain_ptr, uint orig_plain_len, unsigned char *mod_plain_ptr, uint mod_plain_len, char *rule_buf, int rule_len); +void format_plain (FILE *fp, unsigned char *plain_ptr, uint plain_len, uint outfile_autohex); +void format_output (FILE *out_fp, char *out_buf, unsigned char *plain_ptr, const uint plain_len, const uint64_t crackpos, unsigned char *username, const uint user_len); +void handle_show_request (pot_t *pot, uint pot_cnt, char *input_buf, int input_len, hash_t *hashes_buf, int (*sort_by_pot) (const void *, const void *), FILE *out_fp); +void handle_left_request (pot_t *pot, uint pot_cnt, char *input_buf, int input_len, hash_t *hashes_buf, int (*sort_by_pot) (const void *, const void *), FILE *out_fp); +void handle_show_request_lm (pot_t *pot, uint pot_cnt, char *input_buf, int input_len, hash_t *hash_left, hash_t *hash_right, int (*sort_by_pot) (const void *, const void *), FILE *out_fp); +void handle_left_request_lm (pot_t *pot, uint pot_cnt, char *input_buf, int input_len, hash_t *hash_left, hash_t *hash_right, int (*sort_by_pot) (const void *, const void *), FILE *out_fp); + +uint devices_to_devicemask (char *gpu_devices); +uint get_random_num (uint min, uint max); +uint32_t mydivc32 (const uint32_t dividend, const uint32_t divisor); +uint64_t mydivc64 (const uint64_t dividend, const uint64_t divisor); + +void ascii_digest (char out_buf[1024], uint salt_pos, uint digest_pos); +void to_hccap_t (hccap_t *hccap, uint salt_pos, uint digest_pos); + +void format_speed_display (float val, char *buf, size_t len); +void format_timer_display (struct tm *tm, char *buf, size_t len); +void lowercase (char *buf, int len); +void uppercase (char *buf, int len); +int fgetl (FILE *fp, char *line_buf); +int in_superchop (char *buf); +char **scan_directory (const char *path); +int count_dictionaries (char **dictionary_files); +char *strparser (const uint parser_status); +char *stroptitype (const uint opti_type); +char *strhashtype (const uint hash_mode); +char *strstatus (const uint threads_status); +void status (); + +void *mycalloc (size_t nmemb, size_t size); +void myfree (void *ptr); +void *mymalloc (size_t size); +void *myrealloc (void *ptr, size_t oldsz, size_t add); +char *mystrdup (const char *s); + +char *logfile_generate_topid (); +char *logfile_generate_subid (); +void logfile_append (const char *fmt, ...); + +#ifdef _WIN +void fsync (int fd); +#endif + +#ifdef _CUDA +int hm_get_adapter_index (HM_ADAPTER nvGPUHandle[DEVICES_MAX]); +#endif + +#ifdef _OCL +int get_adapters_num (HM_LIB hm_dll, int *iNumberAdapters); + +int hm_get_device_num (HM_LIB hm_dll, HM_ADAPTER hm_adapter_index, int *hm_device_num); + +// void hm_get_opencl_busid_devid (hm_attrs_t *hm_device, uint opencl_num_devices, cl_device_id *devices); + +int hm_get_adapter_index (hm_attrs_t *hm_device, uint32_t *valid_adl_device_list, int num_adl_adapters, LPAdapterInfo lpAdapterInfo); + +LPAdapterInfo hm_get_adapter_info (HM_LIB hm_dll, int iNumberAdapters); + +uint32_t *hm_get_list_valid_adl_adapters (int iNumberAdapters, int *num_adl_adapters, LPAdapterInfo lpAdapterInfo); + +int hm_get_overdrive_version (HM_LIB hm_dll, hm_attrs_t *hm_device, uint32_t *valid_adl_device_list, int num_adl_adapters, LPAdapterInfo lpAdapterInfo); +int hm_check_fanspeed_control (HM_LIB hm_dll, hm_attrs_t *hm_device, uint32_t *valid_adl_device_list, int num_adl_adapters, LPAdapterInfo lpAdapterInfo); + +void hm_close (HM_LIB hm_dll); + +HM_LIB hm_init (); +#endif + +int hm_get_temperature_with_device_id (const uint device_id); +int hm_get_fanspeed_with_device_id (const uint device_id); +int hm_get_utilization_with_device_id (const uint device_id); + +int hm_set_fanspeed_with_device_id (const uint device_id, const int fanspeed); + +void myabort (); +void myquit (); + +uint set_gpu_accel (uint hash_mode); +uint set_gpu_loops (uint hash_mode); +void set_cpu_affinity (char *cpu_affinity); + +void eula_print (const char *progname); +void usage_mini_print (const char *progname); +void usage_big_print (const char *progname); + +void mp_css_to_uniq_tbl (uint css_cnt, cs_t *css, uint uniq_tbls[SP_PW_MAX][CHARSIZ]); +void mp_cut_at (char *mask, uint max); +void mp_exec (uint64_t val, char *buf, cs_t *css, int css_cnt); +cs_t *mp_gen_css (char *mask_buf, size_t mask_len, cs_t *mp_sys, cs_t *mp_usr, uint *css_cnt); +uint64_t mp_get_sum (uint css_cnt, cs_t *css); +void mp_setup_sys (cs_t *mp_sys); +void mp_setup_usr (cs_t *mp_sys, cs_t *mp_usr, char *buf, uint index); +void mp_reset_usr (cs_t *mp_usr, uint index); +char *mp_get_truncated_mask (char *mask_buf, size_t mask_len, uint len); + +uint64_t sp_get_sum (uint start, uint stop, cs_t *root_css_buf); +void sp_exec (uint64_t ctx, char *pw_buf, cs_t *root_css_buf, cs_t *markov_css_buf, uint start, uint stop); +int sp_comp_val (const void *p1, const void *p2); +void sp_setup_tbl (const char *install_dir, char *hcstat, uint disable, uint classic, hcstat_table_t *root_table_buf, hcstat_table_t *markov_table_buf); +void sp_tbl_to_css (hcstat_table_t *root_table_buf, hcstat_table_t *markov_table_buf, cs_t *root_css_buf, cs_t *markov_css_buf, uint threshold, uint uniq_tbls[SP_PW_MAX][CHARSIZ]); +void sp_stretch_markov (hcstat_table_t *in, hcstat_table_t *out); +void sp_stretch_root (hcstat_table_t *in, hcstat_table_t *out); + +uint byte_swap_32 (const uint n); +uint64_t byte_swap_64 (const uint64_t n); + +char hex_convert (const char c); + +int bcrypt_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf); +int cisco4_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf); +int dcc_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf); +int dcc2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf); +int descrypt_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf); +int episerver_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf); +int ipb2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf); +int joomla_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf); +int postgresql_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf); +int netscreen_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf); +int keccak_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf); +int lm_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf); +int md4_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf); +int md4s_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf); +int md5_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf); +int md5s_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf); +int md5half_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf); +int md5md5_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf); +int md5pix_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf); +int md5asa_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf); +int md5apr1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf); +int md5crypt_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf); +int mssql2000_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf); +int mssql2005_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf); +int netntlmv1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf); +int netntlmv2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf); +int oracleh_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf); +int oracles_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf); +int oraclet_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf); +int osc_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf); +int osx1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf); +int osx512_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf); +int phpass_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf); +int sha1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf); +int sha1linkedin_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf); +int sha1b64_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf); +int sha1b64s_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf); +int sha1s_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf); +int sha256_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf); +int sha256s_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf); +int sha384_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf); +int sha512_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf); +int sha512s_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf); +int sha512crypt_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf); +int smf_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf); +int vb3_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf); +int vb30_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf); +int wpa_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf); +int psafe2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf); +int psafe3_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf); +int ikepsk_md5_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf); +int ikepsk_sha1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf); +int androidpin_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf); +int ripemd160_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf); +int whirlpool_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf); +int truecrypt_parse_hash_1k (char *input_buf, uint input_len, hash_t *hash_buf); +int truecrypt_parse_hash_2k (char *input_buf, uint input_len, hash_t *hash_buf); +int md5aix_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf); +int sha256aix_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf); +int sha512aix_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf); +int agilekey_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf); +int sha1aix_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf); +int lastpass_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf); +int gost_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf); +int sha256crypt_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf); +int mssql2012_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf); +int sha512osx_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf); +int episerver4_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf); +int sha512grub_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf); +int sha512b64s_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf); +int hmacsha1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf); +int hmacsha256_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf); +int hmacsha512_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf); +int hmacmd5_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf); +int krb5pa_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf); +int sapb_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf); +int sapg_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf); +int drupal7_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf); +int sybasease_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf); +int mysql323_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf); +int rakp_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf); +int netscaler_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf); +int chap_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf); +int cloudkey_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf); +int nsec3_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf); +int wbb3_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf); +int racf_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf); +int lotus5_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf); +int lotus6_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf); +int lotus8_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf); +int hmailserver_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf); +int phps_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf); +int mediawiki_b_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf); +int peoplesoft_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf); +int skype_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf); +int androidfde_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf); +int scrypt_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf); +int juniper_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf); +int cisco8_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf); +int cisco9_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf); +int office2007_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf); +int office2010_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf); +int office2013_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf); +int oldoffice01_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf); +int oldoffice01cm1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf); +int oldoffice01cm2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf); +int oldoffice34_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf); +int oldoffice34cm1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf); +int oldoffice34cm2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf); +int radmin2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf); +int djangosha1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf); +int djangopbkdf2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf); +int siphash_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf); +int crammd5_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf); +int saph_sha1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf); +int redmine_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf); +int pdf11_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf); +int pdf11cm1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf); +int pdf11cm2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf); +int pdf14_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf); +int pdf17l3_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf); +int pdf17l8_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf); +int pbkdf2_sha256_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf); +int prestashop_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf); +int postgresql_auth_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf); +int mysql_auth_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf); +int bitcoin_wallet_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf); +int sip_auth_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf); +int crc32_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf); +int seven_zip_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf); +int gost2012sbog_256_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf); +int gost2012sbog_512_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf); +int pbkdf2_md5_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf); +int pbkdf2_sha1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf); +int pbkdf2_sha512_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf); +int ecryptfs_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf); +int bsdicrypt_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf); +int rar3hp_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf); +int cf10_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf); +int mywallet_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf); +int ms_drsr_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf); + +void load_kernel (const char *kernel_file, int num_devices, size_t *kernel_lengths, const unsigned char **kernel_sources); +void writeProgramBin (char *dst, unsigned char *binary, size_t binary_size); + +uint64_t get_lowest_words_done (); + +restore_data_t *init_restore (int argc, char **argv); +void read_restore (const char *eff_restore_file, restore_data_t *rd); +void write_restore (const char *new_restore_file, restore_data_t *rd); +void cycle_restore (); + +#ifdef WIN + +BOOL WINAPI sigHandler_default (DWORD sig); +BOOL WINAPI sigHandler_benchmark (DWORD sig); +void hc_signal (BOOL WINAPI (callback) (DWORD sig)); + +#else + +void sigHandler_default (int sig); +void sigHandler_benchmark (int sig); +void hc_signal (void c (int)); + +#endif + +typedef int bool; + +bool class_num (char c); +bool class_lower (char c); +bool class_upper (char c); +bool class_alpha (char c); + +int mangle_lrest (char arr[BLOCK_SIZE], int arr_len); +int mangle_urest (char arr[BLOCK_SIZE], int arr_len); +int mangle_trest (char arr[BLOCK_SIZE], int arr_len); +int mangle_reverse (char arr[BLOCK_SIZE], int arr_len); +int mangle_double (char arr[BLOCK_SIZE], int arr_len); +int mangle_double_times (char arr[BLOCK_SIZE], int arr_len, int times); +int mangle_reflect (char arr[BLOCK_SIZE], int arr_len); +int mangle_rotate_left (char arr[BLOCK_SIZE], int arr_len); +int mangle_rotate_right (char arr[BLOCK_SIZE], int arr_len); +int mangle_append (char arr[BLOCK_SIZE], int arr_len, char c); +int mangle_prepend (char arr[BLOCK_SIZE], int arr_len, char c); +int mangle_delete_at (char arr[BLOCK_SIZE], int arr_len, int upos); +int mangle_extract (char arr[BLOCK_SIZE], int arr_len, int upos, int ulen); +int mangle_omit (char arr[BLOCK_SIZE], int arr_len, int upos, int ulen); +int mangle_insert (char arr[BLOCK_SIZE], int arr_len, int upos, char c); +int mangle_overstrike (char arr[BLOCK_SIZE], int arr_len, int upos, char c); +int mangle_truncate_at (char arr[BLOCK_SIZE], int arr_len, int upos); +int mangle_replace (char arr[BLOCK_SIZE], int arr_len, char oldc, char newc); +int mangle_purgechar (char arr[BLOCK_SIZE], int arr_len, char c); +int mangle_dupeblock_prepend (char arr[BLOCK_SIZE], int arr_len, int ulen); +int mangle_dupeblock_append (char arr[BLOCK_SIZE], int arr_len, int ulen); +int mangle_dupechar_at (char arr[BLOCK_SIZE], int arr_len, int upos, int ulen); +int mangle_dupechar (char arr[BLOCK_SIZE], int arr_len); +int mangle_switch_at_check (char arr[BLOCK_SIZE], int arr_len, int upos, int upos2); +int mangle_switch_at (char arr[BLOCK_SIZE], int arr_len, int upos, int upos2); +int mangle_chr_shiftl (uint8_t arr[BLOCK_SIZE], int arr_len, int upos); +int mangle_chr_shiftr (uint8_t arr[BLOCK_SIZE], int arr_len, int upos); +int mangle_chr_incr (uint8_t arr[BLOCK_SIZE], int arr_len, int upos); +int mangle_chr_decr (uint8_t arr[BLOCK_SIZE], int arr_len, int upos); +int mangle_title (char arr[BLOCK_SIZE], int arr_len); + +int generate_random_rule (char rule_buf[RP_RULE_BUFSIZ], uint32_t rp_gen_func_min, uint32_t rp_gen_func_max); +int _old_apply_rule (char *rule, int rule_len, char in[BLOCK_SIZE], int in_len, char out[BLOCK_SIZE]); + +int cpu_rule_to_gpu_rule (char rule_buf[BUFSIZ], uint rule_len, gpu_rule_t *rule); +int gpu_rule_to_cpu_rule (char rule_buf[BUFSIZ], gpu_rule_t *rule); + +void *thread_gpu_watch (void *p); +void *thread_keypress (void *p); +void *thread_runtime (void *p); + +/** + * checksum for use on cpu + */ + +#include "cpu-crc32.h" + +/** + * ciphers for use on cpu + */ + +#include "cpu-aes.h" + +#endif diff --git a/include/types.h b/include/types.h new file mode 100644 index 0000000000..b7be9bc6d5 --- /dev/null +++ b/include/types.h @@ -0,0 +1,1247 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#ifndef TYPES_H +#define TYPES_H + +typedef struct +{ + uint salt_buf[16]; + uint salt_buf_pc[8]; + + uint salt_len; + uint salt_iter; + uint salt_sign[2]; + + uint keccak_mdlen; + uint truecrypt_mdlen; + + uint digests_cnt; + uint digests_done; + + uint digests_offset; + + uint scrypt_N; + uint scrypt_r; + uint scrypt_p; + uint scrypt_tmto; + uint scrypt_phy; + +} salt_t; + +typedef struct +{ + int V; + int R; + int P; + + int enc_md; + + uint id_buf[8]; + uint u_buf[32]; + uint o_buf[32]; + + int id_len; + int o_len; + int u_len; + + uint rc4key[2]; + uint rc4data[2]; + +} pdf_t; + +typedef struct +{ + uint pke[25]; + uint eapol[64]; + int eapol_size; + int keyver; + +} wpa_t; + +typedef struct +{ + uint cry_master_buf[64]; + uint ckey_buf[64]; + uint public_key_buf[64]; + + uint cry_master_len; + uint ckey_len; + uint public_key_len; + +} bitcoin_wallet_t; + +typedef struct +{ + uint salt_buf[30]; + uint salt_len; + + uint esalt_buf[38]; + uint esalt_len; + +} sip_t; + +typedef struct +{ + uint data[384]; + +} androidfde_t; + +typedef struct +{ + uint nr_buf[16]; + uint nr_len; + + uint msg_buf[128]; + uint msg_len; + +} ikepsk_t; + +typedef struct +{ + uint user_len; + uint domain_len; + uint srvchall_len; + uint clichall_len; + + uint userdomain_buf[64]; + uint chall_buf[256]; + +} netntlm_t; + +typedef struct +{ + uint user[16]; + uint realm[16]; + uint salt[32]; + uint timestamp[16]; + uint checksum[4]; + +} krb5pa_t; + +typedef struct +{ + uint salt_buf[16]; + uint data_buf[112]; + uint keyfile_buf[16]; + +} tc_t; + +typedef struct +{ + uint salt_buf[16]; + +} pbkdf2_md5_t; + +typedef struct +{ + uint salt_buf[16]; + +} pbkdf2_sha1_t; + +typedef struct +{ + uint salt_buf[16]; + +} pbkdf2_sha256_t; + +typedef struct +{ + uint salt_buf[32]; + +} pbkdf2_sha512_t; + +typedef struct +{ + uint8_t cipher[1040]; + +} agilekey_t; + +typedef struct +{ + uint salt_buf[128]; + uint salt_len; + +} rakp_t; + +typedef struct +{ + uint data_len; + uint data_buf[512]; + +} cloudkey_t; + +typedef struct +{ + uint encryptedVerifier[4]; + uint encryptedVerifierHash[5]; + + uint keySize; + +} office2007_t; + +typedef struct +{ + uint encryptedVerifier[4]; + uint encryptedVerifierHash[8]; + +} office2010_t; + +typedef struct +{ + uint encryptedVerifier[4]; + uint encryptedVerifierHash[8]; + +} office2013_t; + +typedef struct +{ + uint version; + uint encryptedVerifier[4]; + uint encryptedVerifierHash[4]; + uint rc4key[2]; + +} oldoffice01_t; + +typedef struct +{ + uint version; + uint encryptedVerifier[4]; + uint encryptedVerifierHash[5]; + uint rc4key[2]; + +} oldoffice34_t; + +typedef struct +{ + uint P[256]; + +} scrypt_tmp_t; + +typedef struct +{ + uint digest[4]; + uint out[4]; + +} pdf14_tmp_t; + +typedef struct +{ + union + { + uint dgst32[16]; + u64 dgst64[8]; + }; + + uint dgst_len; + uint W_len; + +} pdf17l8_tmp_t; + +typedef struct +{ + uint digest_buf[4]; + +} phpass_tmp_t; + +typedef struct +{ + uint digest_buf[4]; + +} md5crypt_tmp_t; + +typedef struct +{ + uint64_t l_alt_result[8]; + + uint64_t l_p_bytes[2]; + uint64_t l_s_bytes[2]; + +} sha512crypt_tmp_t; + +typedef struct +{ + uint alt_result[8]; + + uint p_bytes[4]; + uint s_bytes[4]; + +} sha256crypt_tmp_t; + +typedef struct +{ + uint ipad[5]; + uint opad[5]; + + uint dgst[10]; + uint out[10]; + +} wpa_tmp_t; + +typedef struct +{ + uint64_t dgst[8]; + +} bitcoin_wallet_tmp_t; + +typedef struct +{ + uint ipad[5]; + uint opad[5]; + + uint dgst[5]; + uint out[4]; + +} dcc2_tmp_t; + +typedef struct +{ + uint P[18]; + + uint S0[256]; + uint S1[256]; + uint S2[256]; + uint S3[256]; + +} bcrypt_tmp_t; + +typedef struct +{ + uint digest[2]; + + uint P[18]; + + uint S0[256]; + uint S1[256]; + uint S2[256]; + uint S3[256]; + +} pwsafe2_tmp_t; + +typedef struct +{ + uint digest_buf[8]; + +} pwsafe3_tmp_t; + +typedef struct +{ + uint digest_buf[5]; + +} androidpin_tmp_t; + +typedef struct +{ + uint ipad[5]; + uint opad[5]; + + uint dgst[10]; + uint out[10]; + +} androidfde_tmp_t; + +typedef struct +{ + uint ipad[16]; + uint opad[16]; + + uint dgst[64]; + uint out[64]; + +} tc_tmp_t; + +typedef struct +{ + uint64_t ipad[8]; + uint64_t opad[8]; + + uint64_t dgst[32]; + uint64_t out[32]; + +} tc64_tmp_t; + +typedef struct +{ + uint ipad[5]; + uint opad[5]; + + uint dgst[5]; + uint out[5]; + +} agilekey_tmp_t; + +typedef struct +{ + uint ipad[5]; + uint opad[5]; + + uint dgst1[5]; + uint out1[5]; + + uint dgst2[5]; + uint out2[5]; + +} mywallet_tmp_t; + +typedef struct +{ + uint ipad[5]; + uint opad[5]; + + uint dgst[5]; + uint out[5]; + +} sha1aix_tmp_t; + +typedef struct +{ + uint ipad[8]; + uint opad[8]; + + uint dgst[8]; + uint out[8]; + +} sha256aix_tmp_t; + +typedef struct +{ + uint64_t ipad[8]; + uint64_t opad[8]; + + uint64_t dgst[8]; + uint64_t out[8]; + +} sha512aix_tmp_t; + +typedef struct +{ + uint ipad[8]; + uint opad[8]; + + uint dgst[8]; + uint out[8]; + +} lastpass_tmp_t; + +typedef struct +{ + uint64_t digest_buf[8]; + +} drupal7_tmp_t; + +typedef struct +{ + uint ipad[5]; + uint opad[5]; + + uint dgst[5]; + uint out[5]; + +} lotus8_tmp_t; + +typedef struct +{ + uint out[5]; + +} office2007_tmp_t; + +typedef struct +{ + uint out[5]; + +} office2010_tmp_t; + +typedef struct +{ + uint64_t out[8]; + +} office2013_tmp_t; + +typedef struct +{ + uint digest_buf[5]; + +} saph_sha1_tmp_t; + +typedef struct +{ + uint32_t ipad[4]; + uint32_t opad[4]; + + uint32_t dgst[32]; + uint32_t out[32]; + +} pbkdf2_md5_tmp_t; + +typedef struct +{ + uint32_t ipad[5]; + uint32_t opad[5]; + + uint32_t dgst[32]; + uint32_t out[32]; + +} pbkdf2_sha1_tmp_t; + +typedef struct +{ + uint32_t ipad[8]; + uint32_t opad[8]; + + uint32_t dgst[32]; + uint32_t out[32]; + +} pbkdf2_sha256_tmp_t; + +typedef struct +{ + uint64_t ipad[8]; + uint64_t opad[8]; + + uint64_t dgst[16]; + uint64_t out[16]; + +} pbkdf2_sha512_tmp_t; + +typedef struct +{ + uint64_t out[8]; + +} ecryptfs_tmp_t; + +typedef struct +{ + uint64_t ipad[8]; + uint64_t opad[8]; + + uint64_t dgst[16]; + uint64_t out[16]; + +} oraclet_tmp_t; + +typedef struct +{ + uint block[16]; + + uint dgst[8]; + + uint block_len; + uint final_len; + +} seven_zip_tmp_t; + +typedef struct +{ + uint Kc[16]; + uint Kd[16]; + + uint iv[2]; + +} bsdicrypt_tmp_t; + +typedef struct +{ + uint dgst[17][5]; + +} rar3_tmp_t; + +typedef struct +{ + uint user[16]; + +} cram_md5_t; + +typedef struct +{ + uint iv_buf[4]; + uint iv_len; + + uint salt_buf[4]; + uint salt_len; + + uint crc; + + uint data_buf[96]; + uint data_len; + + uint unpack_size; + +} seven_zip_t; + +typedef struct +{ + char *user_name; + uint user_len; + +} user_t; + +typedef struct +{ + user_t *user; + char *orighash; + +} hashinfo_t; + +typedef struct +{ + void *digest; + salt_t *salt; + void *esalt; + int cracked; + hashinfo_t *hash_info; + +} hash_t; + +typedef struct +{ + uint key; + uint64_t val; + +} hcstat_table_t; + +typedef struct +{ + uint cs_buf[0x100]; + uint cs_len; + +} cs_t; + +typedef struct +{ + char essid[36]; + + unsigned char mac1[6]; + unsigned char mac2[6]; + unsigned char nonce1[32]; + unsigned char nonce2[32]; + + unsigned char eapol[256]; + int eapol_size; + + int keyver; + unsigned char keymic[16]; + +} hccap_t; + +typedef struct +{ + char signature[4]; + uint32_t salt_buf[8]; + uint32_t iterations; + uint32_t hash_buf[8]; + +} psafe3_t; + +typedef struct +{ + char plain_buf[256]; + int plain_len; + + hash_t hash; + +} pot_t; + +typedef struct +{ + uint64_t cnt; + + #ifdef _POSIX + struct stat stat; + #endif + + #ifdef _WIN + struct __stat64 stat; + #endif + +} dictstat_t; + +typedef struct +{ + uint len; + + char buf[0x100]; + +} cpu_rule_t; + +typedef struct +{ + uint cmds[15]; + +} gpu_rule_t; + +typedef struct +{ + union + { + uint8_t hc4[4][ 64]; + uint32_t hi4[4][ 16]; + uint64_t hl4[4][ 8]; + + uint8_t hc2[2][128]; + uint32_t hi2[2][ 32]; + uint64_t hl2[2][ 16]; + + uint8_t hc1[1][256]; + uint32_t hi1[1][ 64]; + uint64_t hl1[1][ 32]; + }; + + uint pw_len; + uint alignment_placeholder_1; + uint alignment_placeholder_2; + uint alignment_placeholder_3; + +} pw_t; + +typedef struct +{ + uint i; + +} bf_t; + +typedef struct +{ + uint b[32]; + +} bs_word_t; + +typedef struct +{ + uint i[8]; + + uint pw_len; + +} comb_t; + +typedef struct +{ + pw_t pw_buf; + + uint cnt; + +} pw_cache_t; + +typedef struct +{ + uint32_t version_bin; + char cwd[256]; + uint32_t pid; + + uint32_t dictpos; + uint32_t maskpos; + + uint64_t words_cur; + + uint32_t argc; + char **argv; + +} restore_data_t; + +typedef struct +{ + char *file_name; + long seek; + time_t ctime; + +} outfile_data_t; + +typedef struct +{ + char *buf; + uint32_t incr; + uint32_t avail; + uint32_t cnt; + uint32_t pos; + +} wl_data_t; + +typedef struct +{ + uint bitmap_shift; + uint collisions; + +} bitmap_result_t; + +#define CPT_BUF 0x20000 + +typedef struct +{ + uint cracked; + time_t timestamp; + +} cpt_t; + +/* +typedef struct +{ + uint plain_buf[16]; + uint plain_len; + +} plain_t; +*/ + +typedef struct +{ + uint gidvid; + uint il_pos; + +} plain_t; + +typedef struct +{ + uint word_buf[16]; + +} wordl_t; + +typedef struct +{ + uint word_buf[1]; + +} wordr_t; + +#define RULES_MAX 16 +#define PW_MIN 0 +#define PW_MAX 54 +#define PW_MAX1 (PW_MAX + 1) +#define PW_DICTMAX 31 +#define PW_DICTMAX1 (PW_DICTMAX + 1) + +struct __hc_device_param +{ + uint device_id; + + uint gpu_processors; + uint gpu_threads; + uint gpu_accel; + uint gpu_vector_width; + uint64_t gpu_maxmem_alloc; + uint gpu_power; // these both are based on their _user counterpart + uint gpu_blocks; // but are modified by autotuner and used inside crack loops + uint gpu_power_user; + uint gpu_blocks_user; + + uint size_pws; + uint size_tmps; + uint size_hooks; + uint size_root_css; + uint size_markov_css; + uint size_digests; + uint size_salts; + uint size_shown; + uint size_results; + uint size_plains; + + uint vect_size; + + uint (*pw_add) (struct __hc_device_param *, const uint8_t *, const uint); + + void (*pw_transpose) (const pw_t *, pw_t *); + + FILE *combs_fp; + comb_t *combs_buf; + + void *hooks_buf; + + pw_cache_t *pw_caches; + + pw_t *pws_buf; + uint pws_cnt; + uint64_t pw_cnt; + + uint64_t words_off; + uint64_t words_done; + + uint *result; + + uint outerloop_pos; + uint outerloop_left; + + uint innerloop_pos; + uint innerloop_left; + + uint speed_pos; + uint64_t speed_cnt[SPEED_CACHE]; + float speed_ms[SPEED_CACHE]; + hc_timer_t speed_rec[SPEED_CACHE]; + + hc_timer_t timer_speed; + + // device specific attributes starting + + #ifdef _CUDA + + int sm_major; + int sm_minor; + + CUdevice device; + + CUfunction function1; + CUfunction function12; + CUfunction function2; + CUfunction function23; + CUfunction function3; + CUfunction function_mp; + CUfunction function_mp_l; + CUfunction function_mp_r; + CUfunction function_amp; + CUfunction function_tb; + CUfunction function_tm; + + CUcontext context; + CUmodule module; + CUmodule module_mp; + CUmodule module_amp; + CUstream stream; + + CUdeviceptr d_pws_buf; + CUdeviceptr d_pws_amp_buf; + CUdeviceptr d_words_buf_l; + CUdeviceptr d_words_buf_r; + CUdeviceptr c_words_buf_r; + CUdeviceptr d_rules; + CUdeviceptr c_rules; + CUdeviceptr d_combs; + CUdeviceptr c_combs; + CUdeviceptr d_bfs; + CUdeviceptr c_bfs; + CUdeviceptr d_tm; + CUdeviceptr c_tm; + size_t c_bytes; + CUdeviceptr d_bitmap_s1_a; + CUdeviceptr d_bitmap_s1_b; + CUdeviceptr d_bitmap_s1_c; + CUdeviceptr d_bitmap_s1_d; + CUdeviceptr d_bitmap_s2_a; + CUdeviceptr d_bitmap_s2_b; + CUdeviceptr d_bitmap_s2_c; + CUdeviceptr d_bitmap_s2_d; + CUdeviceptr d_plain_bufs; + CUdeviceptr d_digests_buf; + CUdeviceptr d_digests_shown; + CUdeviceptr d_salt_bufs; + CUdeviceptr d_esalt_bufs; + CUdeviceptr d_bcrypt_bufs; + CUdeviceptr d_tmps; + CUdeviceptr d_hooks; + CUdeviceptr d_result; + CUdeviceptr d_scryptV_buf; + CUdeviceptr d_root_css_buf; + CUdeviceptr d_markov_css_buf; + + #elif _OCL + + char *device_name; + char *device_version; + char *driver_version; + + cl_device_id device; + + cl_kernel kernel1; + cl_kernel kernel12; + cl_kernel kernel2; + cl_kernel kernel23; + cl_kernel kernel3; + cl_kernel kernel_mp; + cl_kernel kernel_mp_l; + cl_kernel kernel_mp_r; + cl_kernel kernel_amp; + cl_kernel kernel_tb; + cl_kernel kernel_tm; + + cl_context context; + + cl_program program; + cl_program program_mp; + cl_program program_amp; + + cl_command_queue command_queue; + + cl_mem d_pws_buf; + cl_mem d_pws_amp_buf; + cl_mem d_words_buf_l; + cl_mem d_words_buf_r; + cl_mem d_rules; + cl_mem d_rules_c; + cl_mem d_combs; + cl_mem d_combs_c; + cl_mem d_bfs; + cl_mem d_bfs_c; + cl_mem d_tm_c; + cl_mem d_bitmap_s1_a; + cl_mem d_bitmap_s1_b; + cl_mem d_bitmap_s1_c; + cl_mem d_bitmap_s1_d; + cl_mem d_bitmap_s2_a; + cl_mem d_bitmap_s2_b; + cl_mem d_bitmap_s2_c; + cl_mem d_bitmap_s2_d; + cl_mem d_plain_bufs; + cl_mem d_digests_buf; + cl_mem d_digests_shown; + cl_mem d_salt_bufs; + cl_mem d_esalt_bufs; + cl_mem d_bcrypt_bufs; + cl_mem d_tmps; + cl_mem d_hooks; + cl_mem d_result; + cl_mem d_scryptV_buf; + cl_mem d_root_css_buf; + cl_mem d_markov_css_buf; + + #endif + + #define PARAMCNT 32 + + void *kernel_params[PARAMCNT]; + void *kernel_params_mp[PARAMCNT]; + void *kernel_params_mp_r[PARAMCNT]; + void *kernel_params_mp_l[PARAMCNT]; + void *kernel_params_amp[PARAMCNT]; + void *kernel_params_tb[PARAMCNT]; + void *kernel_params_tm[PARAMCNT]; + + uint32_t kernel_params_buf32[PARAMCNT]; + + uint32_t kernel_params_mp_buf32[PARAMCNT]; + uint64_t kernel_params_mp_buf64[PARAMCNT]; + + uint32_t kernel_params_mp_r_buf32[PARAMCNT]; + uint64_t kernel_params_mp_r_buf64[PARAMCNT]; + + uint32_t kernel_params_mp_l_buf32[PARAMCNT]; + uint64_t kernel_params_mp_l_buf64[PARAMCNT]; + + uint32_t kernel_params_amp_buf32[PARAMCNT]; + +}; + +typedef struct __hc_device_param hc_device_param_t; + +typedef struct +{ + HM_ADAPTER adapter_index; + + #ifdef _OCL + int od_version; + #endif + + int fan_supported; + + // int busid; // used for CL_DEVICE_TOPOLOGY_AMD but broken for dual GPUs + // int devid; // used for CL_DEVICE_TOPOLOGY_AMD but broken for dual GPUs + +} hm_attrs_t; + +typedef struct +{ + /** + * threads + */ + + uint devices_status; + uint devices_cnt; + hc_device_param_t *devices_param; + + uint gpu_blocks_all; + + /** + * attack specific + */ + + uint wordlist_mode; + uint hashlist_mode; + uint hashlist_format; + + uint attack_mode; + uint attack_kern; + uint attack_exec; + + uint gpu_rules_cnt; + gpu_rule_t *gpu_rules_buf; + + uint combs_mode; + uint combs_cnt; + + uint bfs_cnt; + + uint css_cnt; + cs_t *css_buf; + + cs_t *root_css_buf; + cs_t *markov_css_buf; + + char *rule_buf_l; + char *rule_buf_r; + int rule_len_l; + int rule_len_r; + + /** + * hardware watchdog + */ + + HM_LIB hm_dll; + hm_attrs_t hm_device[DEVICES_MAX]; + + /** + * hashes + */ + + uint digests_cnt; + uint digests_done; + uint digests_saved; + + void *digests_buf; + uint *digests_shown; + uint *digests_shown_tmp; + + uint salts_cnt; + uint salts_done; + + salt_t *salts_buf; + uint *salts_shown; + + void *esalts_buf; + + /** + * logging + */ + + uint logfile_disable; + char *logfile; + char *topid; + char *subid; + + /** + * crack-per-time + */ + + cpt_t cpt_buf[CPT_BUF]; + int cpt_pos; + time_t cpt_start; + uint64_t cpt_total; + + /** + * user + */ + + char *dictfile; + char *dictfile2; + char *mask; + uint maskcnt; + uint maskpos; + char *session; + char separator; + char *hashfile; + char *install_dir; + char *outfile; + uint outfile_format; + uint outfile_autohex; + uint outfile_check_timer; + char *eff_restore_file; + char *new_restore_file; + char *induction_directory; + char *outfile_check_directory; + uint loopback; + char *loopback_file; + uint restore; + uint restore_timer; + uint restore_disable; + uint status; + uint status_timer; + uint status_automat; + uint quiet; + uint force; + uint benchmark; + uint runtime; + uint remove; + uint remove_timer; + uint debug_mode; + char *debug_file; + uint hex_charset; + uint hex_salt; + uint hex_wordlist; + uint pw_min; + uint pw_max; + float gpu_blocks_div; + uint gpu_accel; + uint gpu_loops; + uint powertune_enable; + uint scrypt_tmto; + uint segment_size; + char *truecrypt_keyfiles; + + uint hash_mode; + uint hash_type; + uint kern_type; + uint opts_type; + uint salt_type; + uint esalt_size; + uint isSalted; + uint dgst_size; + uint opti_type; + uint dgst_pos0; + uint dgst_pos1; + uint dgst_pos2; + uint dgst_pos3; + + uint gpu_temp_disable; + uint gpu_temp_abort; + uint gpu_temp_retain; + + char **rp_files; + uint rp_files_cnt; + uint rp_gen; + uint rp_gen_seed; + + FILE *pot_fp; + + /** + * used for restore + */ + + uint64_t skip; + uint64_t limit; + + restore_data_t *rd; + + /** + * status, timer + */ + + time_t runtime_start; + time_t runtime_stop; + + time_t proc_start; + time_t proc_stop; + + uint64_t words_cnt; + uint64_t words_cur; + uint64_t words_base; + + uint64_t *words_progress_done; // progress number of words done per salt + uint64_t *words_progress_rejected; // progress number of words rejected per salt + uint64_t *words_progress_restored; // progress number of words restored per salt + + hc_timer_t timer_running; // timer on current dict + hc_timer_t timer_paused; // timer on current dict + + float ms_paused; // timer on current dict + + /** + * hash_info and username + */ + + hashinfo_t **hash_info; + uint username; + + int (*sort_by_digest) (const void *, const void *); + + int (*parse_func) (char *, uint, hash_t *); + +} hc_global_data_t; + +extern hc_global_data_t data; + +#endif diff --git a/kernels/.lock b/kernels/.lock new file mode 100644 index 0000000000..e69de29bb2 diff --git a/kernels/4098/.lock b/kernels/4098/.lock new file mode 100644 index 0000000000..e69de29bb2 diff --git a/kernels/4318/.lock b/kernels/4318/.lock new file mode 100644 index 0000000000..e69de29bb2 diff --git a/lib/OpenCL.def b/lib/OpenCL.def new file mode 100644 index 0000000000..1615c691db --- /dev/null +++ b/lib/OpenCL.def @@ -0,0 +1,84 @@ +LIBRARY "OpenCL.dll" +EXPORTS +clBuildProgram@24 +clCreateBuffer@24 +clCreateCommandQueue@20 +clCreateCommandQueueWithProperties@16 +clCreateContext@24 +clCreateContextFromType@24 +clCreateFromD3D10Buffer@20 +clCreateFromD3D9Buffer@24 +clCreateFromGLBuffer@20 +clCreateFromGLRenderbuffer@20 +clCreateFromGLTexture2D@28 +clCreateFromGLTexture3D@28 +clCreateImage2D@36 +clCreateImage3D@44 +clCreateImageFromD3D10Resource@20 +clCreateImageFromD3D9Resource@24 +clCreateKernel@12 +clCreateKernelsInProgram@16 +clCreateProgramWithBinary@28 +clCreateProgramWithSource@20 +clCreateSampler@20 +clEnqueueAcquireExternalObjects@24 +clEnqueueAcquireGLObjects@24 +clEnqueueBarrier@4 +clEnqueueCopyBuffer@36 +clEnqueueCopyBufferToImage@36 +clEnqueueCopyImage@36 +clEnqueueCopyImageToBuffer@36 +clEnqueueMapBuffer@44 +clEnqueueMapImage@52 +clEnqueueMarker@8 +clEnqueueNDRangeKernel@36 +clEnqueueNativeKernel@40 +clEnqueueReadBuffer@36 +clEnqueueReadImage@44 +clEnqueueReleaseExternalObjects@24 +clEnqueueReleaseGLObjects@24 +clEnqueueTask@20 +clEnqueueUnmapMemObject@24 +clEnqueueWaitForEvents@12 +clEnqueueWriteBuffer@36 +clEnqueueWriteImage@44 +clFinish@4 +clFlush@4 +clGetCommandQueueInfo@20 +clGetContextInfo@20 +clGetDeviceIDs@24 +clGetDeviceInfo@20 +clGetEventInfo@20 +clGetEventProfilingInfo@20 +clGetExtensionFunctionAddress@4 +clGetGLObjectInfo@12 +clGetGLTextureInfo@20 +clGetImageInfo@20 +clGetKernelInfo@20 +clGetKernelWorkGroupInfo@24 +clGetMemObjectInfo@20 +clGetPlatformIDs@12 +clGetPlatformInfo@20 +clGetProgramBuildInfo@24 +clGetProgramInfo@20 +clGetSamplerInfo@20 +clGetSupportedImageFormats@28 +clReleaseCommandQueue@4 +clReleaseContext@4 +clReleaseEvent@4 +clReleaseKernel@4 +clReleaseMemObject@4 +clReleaseProgram@4 +clReleaseSampler@4 +clRetainCommandQueue@4 +clRetainContext@4 +clRetainEvent@4 +clRetainKernel@4 +clRetainMemObject@4 +clRetainProgram@4 +clRetainSampler@4 +clSetCommandQueueProperty@20 +clSetKernelArg@16 +clUnloadCompiler@0 +clWaitForEvents@8 +clEnqueueFillBuffer@36 diff --git a/lib/OpenCL64.def b/lib/OpenCL64.def new file mode 100644 index 0000000000..5ab870c791 --- /dev/null +++ b/lib/OpenCL64.def @@ -0,0 +1,83 @@ +; +; Definition file of OpenCL.dll +; Automatic generated by gendef +; written by Kai Tietz 2008 +; +LIBRARY "OpenCL.dll" +EXPORTS +clBuildProgram +clCreateBuffer +clCreateCommandQueue +clCreateCommandQueueWithProperties +clCreateContext +clCreateContextFromType +clCreateFromGLBuffer +clCreateFromGLRenderbuffer +clCreateFromGLTexture2D +clCreateFromGLTexture3D +clCreateImage2D +clCreateImage3D +clCreateKernel +clCreateKernelsInProgram +clCreateProgramWithBinary +clCreateProgramWithSource +clCreateSampler +clEnqueueAcquireGLObjects +clEnqueueBarrier +clEnqueueCopyBuffer +clEnqueueCopyBufferToImage +clEnqueueCopyImage +clEnqueueCopyImageToBuffer +clEnqueueMapBuffer +clEnqueueMapImage +clEnqueueMarker +clEnqueueNDRangeKernel +clEnqueueNativeKernel +clEnqueueReadBuffer +clEnqueueReadImage +clEnqueueReleaseGLObjects +clEnqueueTask +clEnqueueUnmapMemObject +clEnqueueWaitForEvents +clEnqueueWriteBuffer +clEnqueueWriteImage +clFinish +clFlush +clGetCommandQueueInfo +clGetContextInfo +clGetDeviceIDs +clGetDeviceInfo +clGetEventInfo +clGetEventProfilingInfo +clGetExtensionFunctionAddress +clGetGLObjectInfo +clGetGLTextureInfo +clGetImageInfo +clGetKernelInfo +clGetKernelWorkGroupInfo +clGetMemObjectInfo +clGetPlatformIDs +clGetPlatformInfo +clGetProgramBuildInfo +clGetProgramInfo +clGetSamplerInfo +clGetSupportedImageFormats +clReleaseCommandQueue +clReleaseContext +clReleaseEvent +clReleaseKernel +clReleaseMemObject +clReleaseProgram +clReleaseSampler +clRetainCommandQueue +clRetainContext +clRetainEvent +clRetainKernel +clRetainMemObject +clRetainProgram +clRetainSampler +clSetCommandQueueProperty +clSetKernelArg +clUnloadCompiler +clWaitForEvents +clEnqueueFillBuffer diff --git a/lib/cuda.def b/lib/cuda.def new file mode 100644 index 0000000000..723812646d --- /dev/null +++ b/lib/cuda.def @@ -0,0 +1,268 @@ +; +; Definition file of nvcuda.dll +; Automatic generated by gendef +; written by Kai Tietz 2008 +; +LIBRARY "nvcuda.dll" +EXPORTS +clGetExtensionFunctionAddress@4 +clGetPlatformInfo@20 +cuArray3DCreate@8 +cuArray3DCreate_v2@8 +cuArray3DGetDescriptor@8 +cuArray3DGetDescriptor_v2@8 +cuArrayCreate@8 +cuArrayCreate_v2@8 +cuArrayDestroy@4 +cuArrayGetDescriptor@8 +cuArrayGetDescriptor_v2@8 +cuCtxAttach@8 +cuCtxCreate@12 +cuCtxCreate_v2@12 +cuCtxDestroy@4 +cuCtxDestroy_v2@4 +cuCtxDetach@4 +cuCtxDisablePeerAccess@4 +cuCtxEnablePeerAccess@8 +cuCtxGetApiVersion@8 +cuCtxGetCacheConfig@4 +cuCtxGetCurrent@4 +cuCtxGetDevice@4 +cuCtxGetLimit@8 +cuCtxPopCurrent@4 +cuCtxPopCurrent_v2@4 +cuCtxPushCurrent@4 +cuCtxPushCurrent_v2@4 +cuCtxSetCacheConfig@4 +cuCtxSetCurrent@4 +cuCtxSetLimit@8 +cuCtxSynchronize@0 +cuD3D10CtxCreate@16 +cuD3D10CtxCreateOnDevice@16 +cuD3D10CtxCreate_v2@16 +cuD3D10GetDevice@8 +cuD3D10GetDevices@20 +cuD3D10GetDirect3DDevice@4 +cuD3D10MapResources@8 +cuD3D10RegisterResource@8 +cuD3D10ResourceGetMappedArray@12 +cuD3D10ResourceGetMappedPitch@16 +cuD3D10ResourceGetMappedPitch_v2@16 +cuD3D10ResourceGetMappedPointer@12 +cuD3D10ResourceGetMappedPointer_v2@12 +cuD3D10ResourceGetMappedSize@0 +cuD3D10ResourceGetMappedSize_v2@12 +cuD3D10ResourceGetSurfaceDimensions@20 +cuD3D10ResourceGetSurfaceDimensions_v2@20 +cuD3D10ResourceSetMapFlags@8 +cuD3D10UnmapResources@8 +cuD3D10UnregisterResource@4 +cuD3D11CtxCreate@16 +cuD3D11CtxCreateOnDevice@16 +cuD3D11CtxCreate_v2@16 +cuD3D11GetDevice@8 +cuD3D11GetDevices@20 +cuD3D11GetDirect3DDevice@4 +cuD3D9Begin@4 +cuD3D9CtxCreate@16 +cuD3D9CtxCreateOnDevice@16 +cuD3D9CtxCreate_v2@16 +cuD3D9End +cuD3D9GetDevice@8 +cuD3D9GetDevices@20 +cuD3D9GetDirect3DDevice@4 +cuD3D9MapResources@8 +cuD3D9MapVertexBuffer@12 +cuD3D9MapVertexBuffer_v2@12 +cuD3D9RegisterResource@8 +cuD3D9RegisterVertexBuffer@4 +cuD3D9ResourceGetMappedArray@16 +cuD3D9ResourceGetMappedPitch@20 +cuD3D9ResourceGetMappedPitch_v2@20 +cuD3D9ResourceGetMappedPointer@16 +cuD3D9ResourceGetMappedPointer_v2@16 +cuD3D9ResourceGetMappedSize@16 +cuD3D9ResourceGetMappedSize_v2@16 +cuD3D9ResourceGetSurfaceDimensions@24 +cuD3D9ResourceGetSurfaceDimensions_v2@24 +cuD3D9ResourceSetMapFlags@8 +cuD3D9UnmapResources@8 +cuD3D9UnmapVertexBuffer@4 +cuD3D9UnregisterResource@4 +cuD3D9UnregisterVertexBuffer@4 +cuDeviceCanAccessPeer@12 +cuDeviceComputeCapability@12 +cuDeviceGet@8 +cuDeviceGetAttribute@12 +cuDeviceGetCount@4 +cuDeviceGetName@12 +cuDeviceGetProperties@8 +cuDeviceTotalMem@8 +cuDeviceTotalMem_v2@8 +cuDriverGetVersion@4 +cuEventCreate@8 +cuEventDestroy@4 +cuEventDestroy_v2@4 +cuEventElapsedTime@12 +cuEventQuery@4 +cuEventRecord@8 +cuEventSynchronize@4 +cuFuncGetAttribute@12 +cuFuncSetBlockShape@16 +cuFuncSetCacheConfig@8 +cuFuncSetSharedSize@8 +cuGLCtxCreate@12 +cuGLCtxCreate_v2@12 +cuGLInit +cuGLMapBufferObject@12 +cuGLMapBufferObjectAsync@16 +cuGLMapBufferObjectAsync_v2@16 +cuGLMapBufferObject_v2@12 +cuGLRegisterBufferObject@4 +cuGLSetBufferObjectMapFlags@8 +cuGLUnmapBufferObject@4 +cuGLUnmapBufferObjectAsync@8 +cuGLUnregisterBufferObject@4 +cuGetExportTable@8 +cuGraphicsD3D10RegisterResource@12 +cuGraphicsD3D11RegisterResource@12 +cuGraphicsD3D9RegisterResource@12 +cuGraphicsGLRegisterBuffer@12 +cuGraphicsGLRegisterImage@16 +cuGraphicsMapResources@12 +cuGraphicsResourceGetMappedPointer@12 +cuGraphicsResourceGetMappedPointer_v2@12 +cuGraphicsResourceSetMapFlags@8 +cuGraphicsSubResourceGetMappedArray@16 +cuGraphicsUnmapResources@12 +cuGraphicsUnregisterResource@4 +cuInit@4 +cuLaunch@4 +cuLaunchGrid@12 +cuLaunchGridAsync@16 +cuLaunchKernel@44 +cuMemAlloc@8 +cuMemAllocHost@8 +cuMemAllocHost_v2@8 +cuMemAllocPitch@20 +cuMemAllocPitch_v2@20 +cuMemAlloc_v2@8 +cuMemFree@4 +cuMemFreeHost@4 +cuMemFree_v2@4 +cuMemGetAddressRange@12 +cuMemGetAddressRange_v2@12 +cuMemGetInfo@8 +cuMemGetInfo_v2@8 +cuMemHostAlloc@12 +cuMemHostGetDevicePointer@12 +cuMemHostGetDevicePointer_v2@12 +cuMemHostGetFlags@8 +cuMemHostRegister@12 +cuMemHostUnregister@4 +cuMemcpy2D@4 +cuMemcpy2DAsync@8 +cuMemcpy2DAsync_v2@8 +cuMemcpy2DUnaligned@4 +cuMemcpy2DUnaligned_v2@4 +cuMemcpy2D_v2@4 +cuMemcpy3D@4 +cuMemcpy3DAsync@8 +cuMemcpy3DAsync_v2@8 +cuMemcpy3DPeer@4 +cuMemcpy3DPeerAsync@8 +cuMemcpy3D_v2@4 +cuMemcpy@12 +cuMemcpyAsync@16 +cuMemcpyAtoA@20 +cuMemcpyAtoA_v2@20 +cuMemcpyAtoD@16 +cuMemcpyAtoD_v2@16 +cuMemcpyAtoH@16 +cuMemcpyAtoHAsync@20 +cuMemcpyAtoHAsync_v2@20 +cuMemcpyAtoH_v2@16 +cuMemcpyDtoA@16 +cuMemcpyDtoA_v2@16 +cuMemcpyDtoD@12 +cuMemcpyDtoDAsync@16 +cuMemcpyDtoDAsync_v2@16 +cuMemcpyDtoD_v2@12 +cuMemcpyDtoH@12 +cuMemcpyDtoHAsync@16 +cuMemcpyDtoHAsync_v2@16 +cuMemcpyDtoH_v2@12 +cuMemcpyHtoA@16 +cuMemcpyHtoAAsync@20 +cuMemcpyHtoAAsync_v2@20 +cuMemcpyHtoA_v2@16 +cuMemcpyHtoD@12 +cuMemcpyHtoDAsync@16 +cuMemcpyHtoDAsync_v2@16 +cuMemcpyHtoD_v2@12 +cuMemcpyPeer@20 +cuMemcpyPeerAsync@24 +cuMemsetD16@12 +cuMemsetD16Async@16 +cuMemsetD16_v2@12 +cuMemsetD2D16@20 +cuMemsetD2D16Async@24 +cuMemsetD2D16_v2@20 +cuMemsetD2D32@20 +cuMemsetD2D32Async@24 +cuMemsetD2D32_v2@20 +cuMemsetD2D8@20 +cuMemsetD2D8Async@24 +cuMemsetD2D8_v2@20 +cuMemsetD32@12 +cuMemsetD32Async@16 +cuMemsetD32_v2@12 +cuMemsetD8@12 +cuMemsetD8Async@16 +cuMemsetD8_v2@12 +cuModuleGetFunction@12 +cuModuleGetGlobal@16 +cuModuleGetGlobal_v2@16 +cuModuleGetSurfRef@12 +cuModuleGetTexRef@12 +cuModuleLoad@8 +cuModuleLoadData@8 +cuModuleLoadDataEx@20 +cuModuleLoadFatBinary@8 +cuModuleUnload@4 +cuParamSetSize@8 +cuParamSetTexRef@12 +cuParamSetf@12 +cuParamSeti@12 +cuParamSetv@16 +cuPointerGetAttribute@12 +cuProfilerInitialize@12 +cuProfilerStart +cuProfilerStop +cuStreamCreate@8 +cuStreamDestroy@4 +cuStreamDestroy_v2@4 +cuStreamQuery@4 +cuStreamSynchronize@4 +cuStreamWaitEvent@12 +cuSurfRefGetArray@8 +cuSurfRefSetArray@12 +cuTexRefCreate@4 +cuTexRefDestroy@4 +cuTexRefGetAddress@8 +cuTexRefGetAddressMode@12 +cuTexRefGetAddress_v2@8 +cuTexRefGetArray@8 +cuTexRefGetFilterMode@8 +cuTexRefGetFlags@8 +cuTexRefGetFormat@12 +cuTexRefSetAddress2D@16 +cuTexRefSetAddress2D_v2@16 +cuTexRefSetAddress@16 +cuTexRefSetAddressMode@12 +cuTexRefSetAddress_v2@16 +cuTexRefSetArray@12 +cuTexRefSetFilterMode@8 +cuTexRefSetFlags@8 +cuTexRefSetFormat@12 +cuWGLGetDevice@8 diff --git a/lib/cuda64.def b/lib/cuda64.def new file mode 100644 index 0000000000..45cc7c5c60 --- /dev/null +++ b/lib/cuda64.def @@ -0,0 +1,268 @@ +; +; Definition file of nvcuda.dll +; Automatic generated by gendef +; written by Kai Tietz 2008 +; +LIBRARY "nvcuda.dll" +EXPORTS +clGetExtensionFunctionAddress +clGetPlatformInfo +cuArray3DCreate +cuArray3DCreate_v2 +cuArray3DGetDescriptor +cuArray3DGetDescriptor_v2 +cuArrayCreate +cuArrayCreate_v2 +cuArrayDestroy +cuArrayGetDescriptor +cuArrayGetDescriptor_v2 +cuCtxAttach +cuCtxCreate +cuCtxCreate_v2 +cuCtxDestroy +cuCtxDestroy_v2 +cuCtxDetach +cuCtxDisablePeerAccess +cuCtxEnablePeerAccess +cuCtxGetApiVersion +cuCtxGetCacheConfig +cuCtxGetCurrent +cuCtxGetDevice +cuCtxGetLimit +cuCtxPopCurrent +cuCtxPopCurrent_v2 +cuCtxPushCurrent +cuCtxPushCurrent_v2 +cuCtxSetCacheConfig +cuCtxSetCurrent +cuCtxSetLimit +cuCtxSynchronize +cuD3D10CtxCreate +cuD3D10CtxCreateOnDevice +cuD3D10CtxCreate_v2 +cuD3D10GetDevice +cuD3D10GetDevices +cuD3D10GetDirect3DDevice +cuD3D10MapResources +cuD3D10RegisterResource +cuD3D10ResourceGetMappedArray +cuD3D10ResourceGetMappedPitch +cuD3D10ResourceGetMappedPitch_v2 +cuD3D10ResourceGetMappedPointer +cuD3D10ResourceGetMappedPointer_v2 +cuD3D10ResourceGetMappedSize +cuD3D10ResourceGetMappedSize_v2 +cuD3D10ResourceGetSurfaceDimensions +cuD3D10ResourceGetSurfaceDimensions_v2 +cuD3D10ResourceSetMapFlags +cuD3D10UnmapResources +cuD3D10UnregisterResource +cuD3D11CtxCreate +cuD3D11CtxCreateOnDevice +cuD3D11CtxCreate_v2 +cuD3D11GetDevice +cuD3D11GetDevices +cuD3D11GetDirect3DDevice +cuD3D9Begin +cuD3D9CtxCreate +cuD3D9CtxCreateOnDevice +cuD3D9CtxCreate_v2 +cuD3D9End +cuD3D9GetDevice +cuD3D9GetDevices +cuD3D9GetDirect3DDevice +cuD3D9MapResources +cuD3D9MapVertexBuffer +cuD3D9MapVertexBuffer_v2 +cuD3D9RegisterResource +cuD3D9RegisterVertexBuffer +cuD3D9ResourceGetMappedArray +cuD3D9ResourceGetMappedPitch +cuD3D9ResourceGetMappedPitch_v2 +cuD3D9ResourceGetMappedPointer +cuD3D9ResourceGetMappedPointer_v2 +cuD3D9ResourceGetMappedSize +cuD3D9ResourceGetMappedSize_v2 +cuD3D9ResourceGetSurfaceDimensions +cuD3D9ResourceGetSurfaceDimensions_v2 +cuD3D9ResourceSetMapFlags +cuD3D9UnmapResources +cuD3D9UnmapVertexBuffer +cuD3D9UnregisterResource +cuD3D9UnregisterVertexBuffer +cuDeviceCanAccessPeer +cuDeviceComputeCapability +cuDeviceGet +cuDeviceGetAttribute +cuDeviceGetCount +cuDeviceGetName +cuDeviceGetProperties +cuDeviceTotalMem +cuDeviceTotalMem_v2 +cuDriverGetVersion +cuEventCreate +cuEventDestroy +cuEventDestroy_v2 +cuEventElapsedTime +cuEventQuery +cuEventRecord +cuEventSynchronize +cuFuncGetAttribute +cuFuncSetBlockShape +cuFuncSetCacheConfig +cuFuncSetSharedSize +cuGLCtxCreate +cuGLCtxCreate_v2 +cuGLInit +cuGLMapBufferObject +cuGLMapBufferObjectAsync +cuGLMapBufferObjectAsync_v2 +cuGLMapBufferObject_v2 +cuGLRegisterBufferObject +cuGLSetBufferObjectMapFlags +cuGLUnmapBufferObject +cuGLUnmapBufferObjectAsync +cuGLUnregisterBufferObject +cuGetExportTable +cuGraphicsD3D10RegisterResource +cuGraphicsD3D11RegisterResource +cuGraphicsD3D9RegisterResource +cuGraphicsGLRegisterBuffer +cuGraphicsGLRegisterImage +cuGraphicsMapResources +cuGraphicsResourceGetMappedPointer +cuGraphicsResourceGetMappedPointer_v2 +cuGraphicsResourceSetMapFlags +cuGraphicsSubResourceGetMappedArray +cuGraphicsUnmapResources +cuGraphicsUnregisterResource +cuInit +cuLaunch +cuLaunchGrid +cuLaunchGridAsync +cuLaunchKernel +cuMemAlloc +cuMemAllocHost +cuMemAllocHost_v2 +cuMemAllocPitch +cuMemAllocPitch_v2 +cuMemAlloc_v2 +cuMemFree +cuMemFreeHost +cuMemFree_v2 +cuMemGetAddressRange +cuMemGetAddressRange_v2 +cuMemGetInfo +cuMemGetInfo_v2 +cuMemHostAlloc +cuMemHostGetDevicePointer +cuMemHostGetDevicePointer_v2 +cuMemHostGetFlags +cuMemHostRegister +cuMemHostUnregister +cuMemcpy2D +cuMemcpy2DAsync +cuMemcpy2DAsync_v2 +cuMemcpy2DUnaligned +cuMemcpy2DUnaligned_v2 +cuMemcpy2D_v2 +cuMemcpy3D +cuMemcpy3DAsync +cuMemcpy3DAsync_v2 +cuMemcpy3DPeer +cuMemcpy3DPeerAsync +cuMemcpy3D_v2 +cuMemcpy +cuMemcpyAsync +cuMemcpyAtoA +cuMemcpyAtoA_v2 +cuMemcpyAtoD +cuMemcpyAtoD_v2 +cuMemcpyAtoH +cuMemcpyAtoHAsync +cuMemcpyAtoHAsync_v2 +cuMemcpyAtoH_v2 +cuMemcpyDtoA +cuMemcpyDtoA_v2 +cuMemcpyDtoD +cuMemcpyDtoDAsync +cuMemcpyDtoDAsync_v2 +cuMemcpyDtoD_v2 +cuMemcpyDtoH +cuMemcpyDtoHAsync +cuMemcpyDtoHAsync_v2 +cuMemcpyDtoH_v2 +cuMemcpyHtoA +cuMemcpyHtoAAsync +cuMemcpyHtoAAsync_v2 +cuMemcpyHtoA_v2 +cuMemcpyHtoD +cuMemcpyHtoDAsync +cuMemcpyHtoDAsync_v2 +cuMemcpyHtoD_v2 +cuMemcpyPeer +cuMemcpyPeerAsync +cuMemsetD16 +cuMemsetD16Async +cuMemsetD16_v2 +cuMemsetD2D16 +cuMemsetD2D16Async +cuMemsetD2D16_v2 +cuMemsetD2D32 +cuMemsetD2D32Async +cuMemsetD2D32_v2 +cuMemsetD2D8 +cuMemsetD2D8Async +cuMemsetD2D8_v2 +cuMemsetD32 +cuMemsetD32Async +cuMemsetD32_v2 +cuMemsetD8 +cuMemsetD8Async +cuMemsetD8_v2 +cuModuleGetFunction +cuModuleGetGlobal +cuModuleGetGlobal_v2 +cuModuleGetSurfRef +cuModuleGetTexRef +cuModuleLoad +cuModuleLoadData +cuModuleLoadDataEx +cuModuleLoadFatBinary +cuModuleUnload +cuParamSetSize +cuParamSetTexRef +cuParamSetf +cuParamSeti +cuParamSetv +cuPointerGetAttribute +cuProfilerInitialize +cuProfilerStart +cuProfilerStop +cuStreamCreate +cuStreamDestroy +cuStreamDestroy_v2 +cuStreamQuery +cuStreamSynchronize +cuStreamWaitEvent +cuSurfRefGetArray +cuSurfRefSetArray +cuTexRefCreate +cuTexRefDestroy +cuTexRefGetAddress +cuTexRefGetAddressMode +cuTexRefGetAddress_v2 +cuTexRefGetArray +cuTexRefGetFilterMode +cuTexRefGetFlags +cuTexRefGetFormat +cuTexRefSetAddress2D +cuTexRefSetAddress2D_v2 +cuTexRefSetAddress +cuTexRefSetAddressMode +cuTexRefSetAddress_v2 +cuTexRefSetArray +cuTexRefSetFilterMode +cuTexRefSetFlags +cuTexRefSetFormat +cuWGLGetDevice diff --git a/masks/8char-1l-1u-1d-1s-compliant.hcmask b/masks/8char-1l-1u-1d-1s-compliant.hcmask new file mode 100644 index 0000000000..5d875fe36c --- /dev/null +++ b/masks/8char-1l-1u-1d-1s-compliant.hcmask @@ -0,0 +1,40824 @@ +?d?d?d?d?d?l?u?s +?d?d?d?d?d?l?s?u +?d?d?d?d?d?u?l?s +?d?d?d?d?d?u?s?l +?d?d?d?d?d?s?l?u +?d?d?d?d?d?s?u?l +?d?d?d?d?l?d?u?s +?d?d?d?d?l?d?s?u +?d?d?d?d?l?l?u?s +?d?d?d?d?l?l?s?u +?d?d?d?d?l?u?d?s +?d?d?d?d?l?u?l?s +?d?d?d?d?l?u?u?s +?d?d?d?d?l?u?s?d +?d?d?d?d?l?u?s?l +?d?d?d?d?l?u?s?u +?d?d?d?d?l?u?s?s +?d?d?d?d?l?s?d?u +?d?d?d?d?l?s?l?u +?d?d?d?d?l?s?u?d +?d?d?d?d?l?s?u?l +?d?d?d?d?l?s?u?u +?d?d?d?d?l?s?u?s +?d?d?d?d?l?s?s?u +?d?d?d?d?u?d?l?s +?d?d?d?d?u?d?s?l +?d?d?d?d?u?l?d?s +?d?d?d?d?u?l?l?s +?d?d?d?d?u?l?u?s +?d?d?d?d?u?l?s?d +?d?d?d?d?u?l?s?l +?d?d?d?d?u?l?s?u +?d?d?d?d?u?l?s?s +?d?d?d?d?u?u?l?s +?d?d?d?d?u?u?s?l +?d?d?d?d?u?s?d?l +?d?d?d?d?u?s?l?d +?d?d?d?d?u?s?l?l +?d?d?d?d?u?s?l?u +?d?d?d?d?u?s?l?s +?d?d?d?d?u?s?u?l +?d?d?d?d?u?s?s?l +?d?d?d?d?s?d?l?u +?d?d?d?d?s?d?u?l +?d?d?d?d?s?l?d?u +?d?d?d?d?s?l?l?u +?d?d?d?d?s?l?u?d +?d?d?d?d?s?l?u?l +?d?d?d?d?s?l?u?u +?d?d?d?d?s?l?u?s +?d?d?d?d?s?l?s?u +?d?d?d?d?s?u?d?l +?d?d?d?d?s?u?l?d +?d?d?d?d?s?u?l?l +?d?d?d?d?s?u?l?u +?d?d?d?d?s?u?l?s +?d?d?d?d?s?u?u?l +?d?d?d?d?s?u?s?l +?d?d?d?d?s?s?l?u +?d?d?d?d?s?s?u?l +?d?d?d?l?d?d?u?s +?d?d?d?l?d?d?s?u +?d?d?d?l?d?l?u?s +?d?d?d?l?d?l?s?u +?d?d?d?l?d?u?d?s +?d?d?d?l?d?u?l?s +?d?d?d?l?d?u?u?s +?d?d?d?l?d?u?s?d +?d?d?d?l?d?u?s?l +?d?d?d?l?d?u?s?u +?d?d?d?l?d?u?s?s +?d?d?d?l?d?s?d?u +?d?d?d?l?d?s?l?u +?d?d?d?l?d?s?u?d +?d?d?d?l?d?s?u?l +?d?d?d?l?d?s?u?u +?d?d?d?l?d?s?u?s +?d?d?d?l?d?s?s?u +?d?d?d?l?l?d?u?s +?d?d?d?l?l?d?s?u +?d?d?d?l?l?l?u?s +?d?d?d?l?l?l?s?u +?d?d?d?l?l?u?d?s +?d?d?d?l?l?u?l?s +?d?d?d?l?l?u?u?s +?d?d?d?l?l?u?s?d +?d?d?d?l?l?u?s?l +?d?d?d?l?l?u?s?u +?d?d?d?l?l?u?s?s +?d?d?d?l?l?s?d?u +?d?d?d?l?l?s?l?u +?d?d?d?l?l?s?u?d +?d?d?d?l?l?s?u?l +?d?d?d?l?l?s?u?u +?d?d?d?l?l?s?u?s +?d?d?d?l?l?s?s?u +?d?d?d?l?u?d?d?s +?d?d?d?l?u?d?l?s +?d?d?d?l?u?d?u?s +?d?d?d?l?u?d?s?d +?d?d?d?l?u?d?s?l +?d?d?d?l?u?d?s?u +?d?d?d?l?u?d?s?s +?d?d?d?l?u?l?d?s +?d?d?d?l?u?l?l?s +?d?d?d?l?u?l?u?s +?d?d?d?l?u?l?s?d +?d?d?d?l?u?l?s?l +?d?d?d?l?u?l?s?u +?d?d?d?l?u?l?s?s +?d?d?d?l?u?u?d?s +?d?d?d?l?u?u?l?s +?d?d?d?l?u?u?u?s +?d?d?d?l?u?u?s?d +?d?d?d?l?u?u?s?l +?d?d?d?l?u?u?s?u +?d?d?d?l?u?u?s?s +?d?d?d?l?u?s?d?d +?d?d?d?l?u?s?d?l +?d?d?d?l?u?s?d?u +?d?d?d?l?u?s?d?s +?d?d?d?l?u?s?l?d +?d?d?d?l?u?s?l?l +?d?d?d?l?u?s?l?u +?d?d?d?l?u?s?l?s +?d?d?d?l?u?s?u?d +?d?d?d?l?u?s?u?l +?d?d?d?l?u?s?u?u +?d?d?d?l?u?s?u?s +?d?d?d?l?u?s?s?d +?d?d?d?l?u?s?s?l +?d?d?d?l?u?s?s?u +?d?d?d?l?u?s?s?s +?d?d?d?l?s?d?d?u +?d?d?d?l?s?d?l?u +?d?d?d?l?s?d?u?d +?d?d?d?l?s?d?u?l +?d?d?d?l?s?d?u?u +?d?d?d?l?s?d?u?s +?d?d?d?l?s?d?s?u +?d?d?d?l?s?l?d?u +?d?d?d?l?s?l?l?u +?d?d?d?l?s?l?u?d +?d?d?d?l?s?l?u?l +?d?d?d?l?s?l?u?u +?d?d?d?l?s?l?u?s +?d?d?d?l?s?l?s?u +?d?d?d?l?s?u?d?d +?d?d?d?l?s?u?d?l +?d?d?d?l?s?u?d?u +?d?d?d?l?s?u?d?s +?d?d?d?l?s?u?l?d +?d?d?d?l?s?u?l?l +?d?d?d?l?s?u?l?u +?d?d?d?l?s?u?l?s +?d?d?d?l?s?u?u?d +?d?d?d?l?s?u?u?l +?d?d?d?l?s?u?u?u +?d?d?d?l?s?u?u?s +?d?d?d?l?s?u?s?d +?d?d?d?l?s?u?s?l +?d?d?d?l?s?u?s?u +?d?d?d?l?s?u?s?s +?d?d?d?l?s?s?d?u +?d?d?d?l?s?s?l?u +?d?d?d?l?s?s?u?d +?d?d?d?l?s?s?u?l +?d?d?d?l?s?s?u?u +?d?d?d?l?s?s?u?s +?d?d?d?l?s?s?s?u +?d?d?d?u?d?d?l?s +?d?d?d?u?d?d?s?l +?d?d?d?u?d?l?d?s +?d?d?d?u?d?l?l?s +?d?d?d?u?d?l?u?s +?d?d?d?u?d?l?s?d +?d?d?d?u?d?l?s?l +?d?d?d?u?d?l?s?u +?d?d?d?u?d?l?s?s +?d?d?d?u?d?u?l?s +?d?d?d?u?d?u?s?l +?d?d?d?u?d?s?d?l +?d?d?d?u?d?s?l?d +?d?d?d?u?d?s?l?l +?d?d?d?u?d?s?l?u +?d?d?d?u?d?s?l?s +?d?d?d?u?d?s?u?l +?d?d?d?u?d?s?s?l +?d?d?d?u?l?d?d?s +?d?d?d?u?l?d?l?s +?d?d?d?u?l?d?u?s +?d?d?d?u?l?d?s?d +?d?d?d?u?l?d?s?l +?d?d?d?u?l?d?s?u +?d?d?d?u?l?d?s?s +?d?d?d?u?l?l?d?s +?d?d?d?u?l?l?l?s +?d?d?d?u?l?l?u?s +?d?d?d?u?l?l?s?d +?d?d?d?u?l?l?s?l +?d?d?d?u?l?l?s?u +?d?d?d?u?l?l?s?s +?d?d?d?u?l?u?d?s +?d?d?d?u?l?u?l?s +?d?d?d?u?l?u?u?s +?d?d?d?u?l?u?s?d +?d?d?d?u?l?u?s?l +?d?d?d?u?l?u?s?u +?d?d?d?u?l?u?s?s +?d?d?d?u?l?s?d?d +?d?d?d?u?l?s?d?l +?d?d?d?u?l?s?d?u +?d?d?d?u?l?s?d?s +?d?d?d?u?l?s?l?d +?d?d?d?u?l?s?l?l +?d?d?d?u?l?s?l?u +?d?d?d?u?l?s?l?s +?d?d?d?u?l?s?u?d +?d?d?d?u?l?s?u?l +?d?d?d?u?l?s?u?u +?d?d?d?u?l?s?u?s +?d?d?d?u?l?s?s?d +?d?d?d?u?l?s?s?l +?d?d?d?u?l?s?s?u +?d?d?d?u?l?s?s?s +?d?d?d?u?u?d?l?s +?d?d?d?u?u?d?s?l +?d?d?d?u?u?l?d?s +?d?d?d?u?u?l?l?s +?d?d?d?u?u?l?u?s +?d?d?d?u?u?l?s?d +?d?d?d?u?u?l?s?l +?d?d?d?u?u?l?s?u +?d?d?d?u?u?l?s?s +?d?d?d?u?u?u?l?s +?d?d?d?u?u?u?s?l +?d?d?d?u?u?s?d?l +?d?d?d?u?u?s?l?d +?d?d?d?u?u?s?l?l +?d?d?d?u?u?s?l?u +?d?d?d?u?u?s?l?s +?d?d?d?u?u?s?u?l +?d?d?d?u?u?s?s?l +?d?d?d?u?s?d?d?l +?d?d?d?u?s?d?l?d +?d?d?d?u?s?d?l?l +?d?d?d?u?s?d?l?u +?d?d?d?u?s?d?l?s +?d?d?d?u?s?d?u?l +?d?d?d?u?s?d?s?l +?d?d?d?u?s?l?d?d +?d?d?d?u?s?l?d?l +?d?d?d?u?s?l?d?u +?d?d?d?u?s?l?d?s +?d?d?d?u?s?l?l?d +?d?d?d?u?s?l?l?l +?d?d?d?u?s?l?l?u +?d?d?d?u?s?l?l?s +?d?d?d?u?s?l?u?d +?d?d?d?u?s?l?u?l +?d?d?d?u?s?l?u?u +?d?d?d?u?s?l?u?s +?d?d?d?u?s?l?s?d +?d?d?d?u?s?l?s?l +?d?d?d?u?s?l?s?u +?d?d?d?u?s?l?s?s +?d?d?d?u?s?u?d?l +?d?d?d?u?s?u?l?d +?d?d?d?u?s?u?l?l +?d?d?d?u?s?u?l?u +?d?d?d?u?s?u?l?s +?d?d?d?u?s?u?u?l +?d?d?d?u?s?u?s?l +?d?d?d?u?s?s?d?l +?d?d?d?u?s?s?l?d +?d?d?d?u?s?s?l?l +?d?d?d?u?s?s?l?u +?d?d?d?u?s?s?l?s +?d?d?d?u?s?s?u?l +?d?d?d?u?s?s?s?l +?d?d?d?s?d?d?l?u +?d?d?d?s?d?d?u?l +?d?d?d?s?d?l?d?u +?d?d?d?s?d?l?l?u +?d?d?d?s?d?l?u?d +?d?d?d?s?d?l?u?l +?d?d?d?s?d?l?u?u +?d?d?d?s?d?l?u?s +?d?d?d?s?d?l?s?u +?d?d?d?s?d?u?d?l +?d?d?d?s?d?u?l?d +?d?d?d?s?d?u?l?l +?d?d?d?s?d?u?l?u +?d?d?d?s?d?u?l?s +?d?d?d?s?d?u?u?l +?d?d?d?s?d?u?s?l +?d?d?d?s?d?s?l?u +?d?d?d?s?d?s?u?l +?d?d?d?s?l?d?d?u +?d?d?d?s?l?d?l?u +?d?d?d?s?l?d?u?d +?d?d?d?s?l?d?u?l +?d?d?d?s?l?d?u?u +?d?d?d?s?l?d?u?s +?d?d?d?s?l?d?s?u +?d?d?d?s?l?l?d?u +?d?d?d?s?l?l?l?u +?d?d?d?s?l?l?u?d +?d?d?d?s?l?l?u?l +?d?d?d?s?l?l?u?u +?d?d?d?s?l?l?u?s +?d?d?d?s?l?l?s?u +?d?d?d?s?l?u?d?d +?d?d?d?s?l?u?d?l +?d?d?d?s?l?u?d?u +?d?d?d?s?l?u?d?s +?d?d?d?s?l?u?l?d +?d?d?d?s?l?u?l?l +?d?d?d?s?l?u?l?u +?d?d?d?s?l?u?l?s +?d?d?d?s?l?u?u?d +?d?d?d?s?l?u?u?l +?d?d?d?s?l?u?u?u +?d?d?d?s?l?u?u?s +?d?d?d?s?l?u?s?d +?d?d?d?s?l?u?s?l +?d?d?d?s?l?u?s?u +?d?d?d?s?l?u?s?s +?d?d?d?s?l?s?d?u +?d?d?d?s?l?s?l?u +?d?d?d?s?l?s?u?d +?d?d?d?s?l?s?u?l +?d?d?d?s?l?s?u?u +?d?d?d?s?l?s?u?s +?d?d?d?s?l?s?s?u +?d?d?d?s?u?d?d?l +?d?d?d?s?u?d?l?d +?d?d?d?s?u?d?l?l +?d?d?d?s?u?d?l?u +?d?d?d?s?u?d?l?s +?d?d?d?s?u?d?u?l +?d?d?d?s?u?d?s?l +?d?d?d?s?u?l?d?d +?d?d?d?s?u?l?d?l +?d?d?d?s?u?l?d?u +?d?d?d?s?u?l?d?s +?d?d?d?s?u?l?l?d +?d?d?d?s?u?l?l?l +?d?d?d?s?u?l?l?u +?d?d?d?s?u?l?l?s +?d?d?d?s?u?l?u?d +?d?d?d?s?u?l?u?l +?d?d?d?s?u?l?u?u +?d?d?d?s?u?l?u?s +?d?d?d?s?u?l?s?d +?d?d?d?s?u?l?s?l +?d?d?d?s?u?l?s?u +?d?d?d?s?u?l?s?s +?d?d?d?s?u?u?d?l +?d?d?d?s?u?u?l?d +?d?d?d?s?u?u?l?l +?d?d?d?s?u?u?l?u +?d?d?d?s?u?u?l?s +?d?d?d?s?u?u?u?l +?d?d?d?s?u?u?s?l +?d?d?d?s?u?s?d?l +?d?d?d?s?u?s?l?d +?d?d?d?s?u?s?l?l +?d?d?d?s?u?s?l?u +?d?d?d?s?u?s?l?s +?d?d?d?s?u?s?u?l +?d?d?d?s?u?s?s?l +?d?d?d?s?s?d?l?u +?d?d?d?s?s?d?u?l +?d?d?d?s?s?l?d?u +?d?d?d?s?s?l?l?u +?d?d?d?s?s?l?u?d +?d?d?d?s?s?l?u?l +?d?d?d?s?s?l?u?u +?d?d?d?s?s?l?u?s +?d?d?d?s?s?l?s?u +?d?d?d?s?s?u?d?l +?d?d?d?s?s?u?l?d +?d?d?d?s?s?u?l?l +?d?d?d?s?s?u?l?u +?d?d?d?s?s?u?l?s +?d?d?d?s?s?u?u?l +?d?d?d?s?s?u?s?l +?d?d?d?s?s?s?l?u +?d?d?d?s?s?s?u?l +?d?d?l?d?d?d?u?s +?d?d?l?d?d?d?s?u +?d?d?l?d?d?l?u?s +?d?d?l?d?d?l?s?u +?d?d?l?d?d?u?d?s +?d?d?l?d?d?u?l?s +?d?d?l?d?d?u?u?s +?d?d?l?d?d?u?s?d +?d?d?l?d?d?u?s?l +?d?d?l?d?d?u?s?u +?d?d?l?d?d?u?s?s +?d?d?l?d?d?s?d?u +?d?d?l?d?d?s?l?u +?d?d?l?d?d?s?u?d +?d?d?l?d?d?s?u?l +?d?d?l?d?d?s?u?u +?d?d?l?d?d?s?u?s +?d?d?l?d?d?s?s?u +?d?d?l?d?l?d?u?s +?d?d?l?d?l?d?s?u +?d?d?l?d?l?l?u?s +?d?d?l?d?l?l?s?u +?d?d?l?d?l?u?d?s +?d?d?l?d?l?u?l?s +?d?d?l?d?l?u?u?s +?d?d?l?d?l?u?s?d +?d?d?l?d?l?u?s?l +?d?d?l?d?l?u?s?u +?d?d?l?d?l?u?s?s +?d?d?l?d?l?s?d?u +?d?d?l?d?l?s?l?u +?d?d?l?d?l?s?u?d +?d?d?l?d?l?s?u?l +?d?d?l?d?l?s?u?u +?d?d?l?d?l?s?u?s +?d?d?l?d?l?s?s?u +?d?d?l?d?u?d?d?s +?d?d?l?d?u?d?l?s +?d?d?l?d?u?d?u?s +?d?d?l?d?u?d?s?d +?d?d?l?d?u?d?s?l +?d?d?l?d?u?d?s?u +?d?d?l?d?u?d?s?s +?d?d?l?d?u?l?d?s +?d?d?l?d?u?l?l?s +?d?d?l?d?u?l?u?s +?d?d?l?d?u?l?s?d +?d?d?l?d?u?l?s?l +?d?d?l?d?u?l?s?u +?d?d?l?d?u?l?s?s +?d?d?l?d?u?u?d?s +?d?d?l?d?u?u?l?s +?d?d?l?d?u?u?u?s +?d?d?l?d?u?u?s?d +?d?d?l?d?u?u?s?l +?d?d?l?d?u?u?s?u +?d?d?l?d?u?u?s?s +?d?d?l?d?u?s?d?d +?d?d?l?d?u?s?d?l +?d?d?l?d?u?s?d?u +?d?d?l?d?u?s?d?s +?d?d?l?d?u?s?l?d +?d?d?l?d?u?s?l?l +?d?d?l?d?u?s?l?u +?d?d?l?d?u?s?l?s +?d?d?l?d?u?s?u?d +?d?d?l?d?u?s?u?l +?d?d?l?d?u?s?u?u +?d?d?l?d?u?s?u?s +?d?d?l?d?u?s?s?d +?d?d?l?d?u?s?s?l +?d?d?l?d?u?s?s?u +?d?d?l?d?u?s?s?s +?d?d?l?d?s?d?d?u +?d?d?l?d?s?d?l?u +?d?d?l?d?s?d?u?d +?d?d?l?d?s?d?u?l +?d?d?l?d?s?d?u?u +?d?d?l?d?s?d?u?s +?d?d?l?d?s?d?s?u +?d?d?l?d?s?l?d?u +?d?d?l?d?s?l?l?u +?d?d?l?d?s?l?u?d +?d?d?l?d?s?l?u?l +?d?d?l?d?s?l?u?u +?d?d?l?d?s?l?u?s +?d?d?l?d?s?l?s?u +?d?d?l?d?s?u?d?d +?d?d?l?d?s?u?d?l +?d?d?l?d?s?u?d?u +?d?d?l?d?s?u?d?s +?d?d?l?d?s?u?l?d +?d?d?l?d?s?u?l?l +?d?d?l?d?s?u?l?u +?d?d?l?d?s?u?l?s +?d?d?l?d?s?u?u?d +?d?d?l?d?s?u?u?l +?d?d?l?d?s?u?u?u +?d?d?l?d?s?u?u?s +?d?d?l?d?s?u?s?d +?d?d?l?d?s?u?s?l +?d?d?l?d?s?u?s?u +?d?d?l?d?s?u?s?s +?d?d?l?d?s?s?d?u +?d?d?l?d?s?s?l?u +?d?d?l?d?s?s?u?d +?d?d?l?d?s?s?u?l +?d?d?l?d?s?s?u?u +?d?d?l?d?s?s?u?s +?d?d?l?d?s?s?s?u +?d?d?l?l?d?d?u?s +?d?d?l?l?d?d?s?u +?d?d?l?l?d?l?u?s +?d?d?l?l?d?l?s?u +?d?d?l?l?d?u?d?s +?d?d?l?l?d?u?l?s +?d?d?l?l?d?u?u?s +?d?d?l?l?d?u?s?d +?d?d?l?l?d?u?s?l +?d?d?l?l?d?u?s?u +?d?d?l?l?d?u?s?s +?d?d?l?l?d?s?d?u +?d?d?l?l?d?s?l?u +?d?d?l?l?d?s?u?d +?d?d?l?l?d?s?u?l +?d?d?l?l?d?s?u?u +?d?d?l?l?d?s?u?s +?d?d?l?l?d?s?s?u +?d?d?l?l?l?d?u?s +?d?d?l?l?l?d?s?u +?d?d?l?l?l?l?u?s +?d?d?l?l?l?l?s?u +?d?d?l?l?l?u?d?s +?d?d?l?l?l?u?l?s +?d?d?l?l?l?u?u?s +?d?d?l?l?l?u?s?d +?d?d?l?l?l?u?s?l +?d?d?l?l?l?u?s?u +?d?d?l?l?l?u?s?s +?d?d?l?l?l?s?d?u +?d?d?l?l?l?s?l?u +?d?d?l?l?l?s?u?d +?d?d?l?l?l?s?u?l +?d?d?l?l?l?s?u?u +?d?d?l?l?l?s?u?s +?d?d?l?l?l?s?s?u +?d?d?l?l?u?d?d?s +?d?d?l?l?u?d?l?s +?d?d?l?l?u?d?u?s +?d?d?l?l?u?d?s?d +?d?d?l?l?u?d?s?l +?d?d?l?l?u?d?s?u +?d?d?l?l?u?d?s?s +?d?d?l?l?u?l?d?s +?d?d?l?l?u?l?l?s +?d?d?l?l?u?l?u?s +?d?d?l?l?u?l?s?d +?d?d?l?l?u?l?s?l +?d?d?l?l?u?l?s?u +?d?d?l?l?u?l?s?s +?d?d?l?l?u?u?d?s +?d?d?l?l?u?u?l?s +?d?d?l?l?u?u?u?s +?d?d?l?l?u?u?s?d +?d?d?l?l?u?u?s?l +?d?d?l?l?u?u?s?u +?d?d?l?l?u?u?s?s +?d?d?l?l?u?s?d?d +?d?d?l?l?u?s?d?l +?d?d?l?l?u?s?d?u +?d?d?l?l?u?s?d?s +?d?d?l?l?u?s?l?d +?d?d?l?l?u?s?l?l +?d?d?l?l?u?s?l?u +?d?d?l?l?u?s?l?s +?d?d?l?l?u?s?u?d +?d?d?l?l?u?s?u?l +?d?d?l?l?u?s?u?u +?d?d?l?l?u?s?u?s +?d?d?l?l?u?s?s?d +?d?d?l?l?u?s?s?l +?d?d?l?l?u?s?s?u +?d?d?l?l?u?s?s?s +?d?d?l?l?s?d?d?u +?d?d?l?l?s?d?l?u +?d?d?l?l?s?d?u?d +?d?d?l?l?s?d?u?l +?d?d?l?l?s?d?u?u +?d?d?l?l?s?d?u?s +?d?d?l?l?s?d?s?u +?d?d?l?l?s?l?d?u +?d?d?l?l?s?l?l?u +?d?d?l?l?s?l?u?d +?d?d?l?l?s?l?u?l +?d?d?l?l?s?l?u?u +?d?d?l?l?s?l?u?s +?d?d?l?l?s?l?s?u +?d?d?l?l?s?u?d?d +?d?d?l?l?s?u?d?l +?d?d?l?l?s?u?d?u +?d?d?l?l?s?u?d?s +?d?d?l?l?s?u?l?d +?d?d?l?l?s?u?l?l +?d?d?l?l?s?u?l?u +?d?d?l?l?s?u?l?s +?d?d?l?l?s?u?u?d +?d?d?l?l?s?u?u?l +?d?d?l?l?s?u?u?u +?d?d?l?l?s?u?u?s +?d?d?l?l?s?u?s?d +?d?d?l?l?s?u?s?l +?d?d?l?l?s?u?s?u +?d?d?l?l?s?u?s?s +?d?d?l?l?s?s?d?u +?d?d?l?l?s?s?l?u +?d?d?l?l?s?s?u?d +?d?d?l?l?s?s?u?l +?d?d?l?l?s?s?u?u +?d?d?l?l?s?s?u?s +?d?d?l?l?s?s?s?u +?d?d?l?u?d?d?d?s +?d?d?l?u?d?d?l?s +?d?d?l?u?d?d?u?s +?d?d?l?u?d?d?s?d +?d?d?l?u?d?d?s?l +?d?d?l?u?d?d?s?u +?d?d?l?u?d?d?s?s +?d?d?l?u?d?l?d?s +?d?d?l?u?d?l?l?s +?d?d?l?u?d?l?u?s +?d?d?l?u?d?l?s?d +?d?d?l?u?d?l?s?l +?d?d?l?u?d?l?s?u +?d?d?l?u?d?l?s?s +?d?d?l?u?d?u?d?s +?d?d?l?u?d?u?l?s +?d?d?l?u?d?u?u?s +?d?d?l?u?d?u?s?d +?d?d?l?u?d?u?s?l +?d?d?l?u?d?u?s?u +?d?d?l?u?d?u?s?s +?d?d?l?u?d?s?d?d +?d?d?l?u?d?s?d?l +?d?d?l?u?d?s?d?u +?d?d?l?u?d?s?d?s +?d?d?l?u?d?s?l?d +?d?d?l?u?d?s?l?l +?d?d?l?u?d?s?l?u +?d?d?l?u?d?s?l?s +?d?d?l?u?d?s?u?d +?d?d?l?u?d?s?u?l +?d?d?l?u?d?s?u?u +?d?d?l?u?d?s?u?s +?d?d?l?u?d?s?s?d +?d?d?l?u?d?s?s?l +?d?d?l?u?d?s?s?u +?d?d?l?u?d?s?s?s +?d?d?l?u?l?d?d?s +?d?d?l?u?l?d?l?s +?d?d?l?u?l?d?u?s +?d?d?l?u?l?d?s?d +?d?d?l?u?l?d?s?l +?d?d?l?u?l?d?s?u +?d?d?l?u?l?d?s?s +?d?d?l?u?l?l?d?s +?d?d?l?u?l?l?l?s +?d?d?l?u?l?l?u?s +?d?d?l?u?l?l?s?d +?d?d?l?u?l?l?s?l +?d?d?l?u?l?l?s?u +?d?d?l?u?l?l?s?s +?d?d?l?u?l?u?d?s +?d?d?l?u?l?u?l?s +?d?d?l?u?l?u?u?s +?d?d?l?u?l?u?s?d +?d?d?l?u?l?u?s?l +?d?d?l?u?l?u?s?u +?d?d?l?u?l?u?s?s +?d?d?l?u?l?s?d?d +?d?d?l?u?l?s?d?l +?d?d?l?u?l?s?d?u +?d?d?l?u?l?s?d?s +?d?d?l?u?l?s?l?d +?d?d?l?u?l?s?l?l +?d?d?l?u?l?s?l?u +?d?d?l?u?l?s?l?s +?d?d?l?u?l?s?u?d +?d?d?l?u?l?s?u?l +?d?d?l?u?l?s?u?u +?d?d?l?u?l?s?u?s +?d?d?l?u?l?s?s?d +?d?d?l?u?l?s?s?l +?d?d?l?u?l?s?s?u +?d?d?l?u?l?s?s?s +?d?d?l?u?u?d?d?s +?d?d?l?u?u?d?l?s +?d?d?l?u?u?d?u?s +?d?d?l?u?u?d?s?d +?d?d?l?u?u?d?s?l +?d?d?l?u?u?d?s?u +?d?d?l?u?u?d?s?s +?d?d?l?u?u?l?d?s +?d?d?l?u?u?l?l?s +?d?d?l?u?u?l?u?s +?d?d?l?u?u?l?s?d +?d?d?l?u?u?l?s?l +?d?d?l?u?u?l?s?u +?d?d?l?u?u?l?s?s +?d?d?l?u?u?u?d?s +?d?d?l?u?u?u?l?s +?d?d?l?u?u?u?u?s +?d?d?l?u?u?u?s?d +?d?d?l?u?u?u?s?l +?d?d?l?u?u?u?s?u +?d?d?l?u?u?u?s?s +?d?d?l?u?u?s?d?d +?d?d?l?u?u?s?d?l +?d?d?l?u?u?s?d?u +?d?d?l?u?u?s?d?s +?d?d?l?u?u?s?l?d +?d?d?l?u?u?s?l?l +?d?d?l?u?u?s?l?u +?d?d?l?u?u?s?l?s +?d?d?l?u?u?s?u?d +?d?d?l?u?u?s?u?l +?d?d?l?u?u?s?u?u +?d?d?l?u?u?s?u?s +?d?d?l?u?u?s?s?d +?d?d?l?u?u?s?s?l +?d?d?l?u?u?s?s?u +?d?d?l?u?u?s?s?s +?d?d?l?u?s?d?d?d +?d?d?l?u?s?d?d?l +?d?d?l?u?s?d?d?u +?d?d?l?u?s?d?d?s +?d?d?l?u?s?d?l?d +?d?d?l?u?s?d?l?l +?d?d?l?u?s?d?l?u +?d?d?l?u?s?d?l?s +?d?d?l?u?s?d?u?d +?d?d?l?u?s?d?u?l +?d?d?l?u?s?d?u?u +?d?d?l?u?s?d?u?s +?d?d?l?u?s?d?s?d +?d?d?l?u?s?d?s?l +?d?d?l?u?s?d?s?u +?d?d?l?u?s?d?s?s +?d?d?l?u?s?l?d?d +?d?d?l?u?s?l?d?l +?d?d?l?u?s?l?d?u +?d?d?l?u?s?l?d?s +?d?d?l?u?s?l?l?d +?d?d?l?u?s?l?l?l +?d?d?l?u?s?l?l?u +?d?d?l?u?s?l?l?s +?d?d?l?u?s?l?u?d +?d?d?l?u?s?l?u?l +?d?d?l?u?s?l?u?u +?d?d?l?u?s?l?u?s +?d?d?l?u?s?l?s?d +?d?d?l?u?s?l?s?l +?d?d?l?u?s?l?s?u +?d?d?l?u?s?l?s?s +?d?d?l?u?s?u?d?d +?d?d?l?u?s?u?d?l +?d?d?l?u?s?u?d?u +?d?d?l?u?s?u?d?s +?d?d?l?u?s?u?l?d +?d?d?l?u?s?u?l?l +?d?d?l?u?s?u?l?u +?d?d?l?u?s?u?l?s +?d?d?l?u?s?u?u?d +?d?d?l?u?s?u?u?l +?d?d?l?u?s?u?u?u +?d?d?l?u?s?u?u?s +?d?d?l?u?s?u?s?d +?d?d?l?u?s?u?s?l +?d?d?l?u?s?u?s?u +?d?d?l?u?s?u?s?s +?d?d?l?u?s?s?d?d +?d?d?l?u?s?s?d?l +?d?d?l?u?s?s?d?u +?d?d?l?u?s?s?d?s +?d?d?l?u?s?s?l?d +?d?d?l?u?s?s?l?l +?d?d?l?u?s?s?l?u +?d?d?l?u?s?s?l?s +?d?d?l?u?s?s?u?d +?d?d?l?u?s?s?u?l +?d?d?l?u?s?s?u?u +?d?d?l?u?s?s?u?s +?d?d?l?u?s?s?s?d +?d?d?l?u?s?s?s?l +?d?d?l?u?s?s?s?u +?d?d?l?u?s?s?s?s +?d?d?l?s?d?d?d?u +?d?d?l?s?d?d?l?u +?d?d?l?s?d?d?u?d +?d?d?l?s?d?d?u?l +?d?d?l?s?d?d?u?u +?d?d?l?s?d?d?u?s +?d?d?l?s?d?d?s?u +?d?d?l?s?d?l?d?u +?d?d?l?s?d?l?l?u +?d?d?l?s?d?l?u?d +?d?d?l?s?d?l?u?l +?d?d?l?s?d?l?u?u +?d?d?l?s?d?l?u?s +?d?d?l?s?d?l?s?u +?d?d?l?s?d?u?d?d +?d?d?l?s?d?u?d?l +?d?d?l?s?d?u?d?u +?d?d?l?s?d?u?d?s +?d?d?l?s?d?u?l?d +?d?d?l?s?d?u?l?l +?d?d?l?s?d?u?l?u +?d?d?l?s?d?u?l?s +?d?d?l?s?d?u?u?d +?d?d?l?s?d?u?u?l +?d?d?l?s?d?u?u?u +?d?d?l?s?d?u?u?s +?d?d?l?s?d?u?s?d +?d?d?l?s?d?u?s?l +?d?d?l?s?d?u?s?u +?d?d?l?s?d?u?s?s +?d?d?l?s?d?s?d?u +?d?d?l?s?d?s?l?u +?d?d?l?s?d?s?u?d +?d?d?l?s?d?s?u?l +?d?d?l?s?d?s?u?u +?d?d?l?s?d?s?u?s +?d?d?l?s?d?s?s?u +?d?d?l?s?l?d?d?u +?d?d?l?s?l?d?l?u +?d?d?l?s?l?d?u?d +?d?d?l?s?l?d?u?l +?d?d?l?s?l?d?u?u +?d?d?l?s?l?d?u?s +?d?d?l?s?l?d?s?u +?d?d?l?s?l?l?d?u +?d?d?l?s?l?l?l?u +?d?d?l?s?l?l?u?d +?d?d?l?s?l?l?u?l +?d?d?l?s?l?l?u?u +?d?d?l?s?l?l?u?s +?d?d?l?s?l?l?s?u +?d?d?l?s?l?u?d?d +?d?d?l?s?l?u?d?l +?d?d?l?s?l?u?d?u +?d?d?l?s?l?u?d?s +?d?d?l?s?l?u?l?d +?d?d?l?s?l?u?l?l +?d?d?l?s?l?u?l?u +?d?d?l?s?l?u?l?s +?d?d?l?s?l?u?u?d +?d?d?l?s?l?u?u?l +?d?d?l?s?l?u?u?u +?d?d?l?s?l?u?u?s +?d?d?l?s?l?u?s?d +?d?d?l?s?l?u?s?l +?d?d?l?s?l?u?s?u +?d?d?l?s?l?u?s?s +?d?d?l?s?l?s?d?u +?d?d?l?s?l?s?l?u +?d?d?l?s?l?s?u?d +?d?d?l?s?l?s?u?l +?d?d?l?s?l?s?u?u +?d?d?l?s?l?s?u?s +?d?d?l?s?l?s?s?u +?d?d?l?s?u?d?d?d +?d?d?l?s?u?d?d?l +?d?d?l?s?u?d?d?u +?d?d?l?s?u?d?d?s +?d?d?l?s?u?d?l?d +?d?d?l?s?u?d?l?l +?d?d?l?s?u?d?l?u +?d?d?l?s?u?d?l?s +?d?d?l?s?u?d?u?d +?d?d?l?s?u?d?u?l +?d?d?l?s?u?d?u?u +?d?d?l?s?u?d?u?s +?d?d?l?s?u?d?s?d +?d?d?l?s?u?d?s?l +?d?d?l?s?u?d?s?u +?d?d?l?s?u?d?s?s +?d?d?l?s?u?l?d?d +?d?d?l?s?u?l?d?l +?d?d?l?s?u?l?d?u +?d?d?l?s?u?l?d?s +?d?d?l?s?u?l?l?d +?d?d?l?s?u?l?l?l +?d?d?l?s?u?l?l?u +?d?d?l?s?u?l?l?s +?d?d?l?s?u?l?u?d +?d?d?l?s?u?l?u?l +?d?d?l?s?u?l?u?u +?d?d?l?s?u?l?u?s +?d?d?l?s?u?l?s?d +?d?d?l?s?u?l?s?l +?d?d?l?s?u?l?s?u +?d?d?l?s?u?l?s?s +?d?d?l?s?u?u?d?d +?d?d?l?s?u?u?d?l +?d?d?l?s?u?u?d?u +?d?d?l?s?u?u?d?s +?d?d?l?s?u?u?l?d +?d?d?l?s?u?u?l?l +?d?d?l?s?u?u?l?u +?d?d?l?s?u?u?l?s +?d?d?l?s?u?u?u?d +?d?d?l?s?u?u?u?l +?d?d?l?s?u?u?u?u +?d?d?l?s?u?u?u?s +?d?d?l?s?u?u?s?d +?d?d?l?s?u?u?s?l +?d?d?l?s?u?u?s?u +?d?d?l?s?u?u?s?s +?d?d?l?s?u?s?d?d +?d?d?l?s?u?s?d?l +?d?d?l?s?u?s?d?u +?d?d?l?s?u?s?d?s +?d?d?l?s?u?s?l?d +?d?d?l?s?u?s?l?l +?d?d?l?s?u?s?l?u +?d?d?l?s?u?s?l?s +?d?d?l?s?u?s?u?d +?d?d?l?s?u?s?u?l +?d?d?l?s?u?s?u?u +?d?d?l?s?u?s?u?s +?d?d?l?s?u?s?s?d +?d?d?l?s?u?s?s?l +?d?d?l?s?u?s?s?u +?d?d?l?s?u?s?s?s +?d?d?l?s?s?d?d?u +?d?d?l?s?s?d?l?u +?d?d?l?s?s?d?u?d +?d?d?l?s?s?d?u?l +?d?d?l?s?s?d?u?u +?d?d?l?s?s?d?u?s +?d?d?l?s?s?d?s?u +?d?d?l?s?s?l?d?u +?d?d?l?s?s?l?l?u +?d?d?l?s?s?l?u?d +?d?d?l?s?s?l?u?l +?d?d?l?s?s?l?u?u +?d?d?l?s?s?l?u?s +?d?d?l?s?s?l?s?u +?d?d?l?s?s?u?d?d +?d?d?l?s?s?u?d?l +?d?d?l?s?s?u?d?u +?d?d?l?s?s?u?d?s +?d?d?l?s?s?u?l?d +?d?d?l?s?s?u?l?l +?d?d?l?s?s?u?l?u +?d?d?l?s?s?u?l?s +?d?d?l?s?s?u?u?d +?d?d?l?s?s?u?u?l +?d?d?l?s?s?u?u?u +?d?d?l?s?s?u?u?s +?d?d?l?s?s?u?s?d +?d?d?l?s?s?u?s?l +?d?d?l?s?s?u?s?u +?d?d?l?s?s?u?s?s +?d?d?l?s?s?s?d?u +?d?d?l?s?s?s?l?u +?d?d?l?s?s?s?u?d +?d?d?l?s?s?s?u?l +?d?d?l?s?s?s?u?u +?d?d?l?s?s?s?u?s +?d?d?l?s?s?s?s?u +?d?d?u?d?d?d?l?s +?d?d?u?d?d?d?s?l +?d?d?u?d?d?l?d?s +?d?d?u?d?d?l?l?s +?d?d?u?d?d?l?u?s +?d?d?u?d?d?l?s?d +?d?d?u?d?d?l?s?l +?d?d?u?d?d?l?s?u +?d?d?u?d?d?l?s?s +?d?d?u?d?d?u?l?s +?d?d?u?d?d?u?s?l +?d?d?u?d?d?s?d?l +?d?d?u?d?d?s?l?d +?d?d?u?d?d?s?l?l +?d?d?u?d?d?s?l?u +?d?d?u?d?d?s?l?s +?d?d?u?d?d?s?u?l +?d?d?u?d?d?s?s?l +?d?d?u?d?l?d?d?s +?d?d?u?d?l?d?l?s +?d?d?u?d?l?d?u?s +?d?d?u?d?l?d?s?d +?d?d?u?d?l?d?s?l +?d?d?u?d?l?d?s?u +?d?d?u?d?l?d?s?s +?d?d?u?d?l?l?d?s +?d?d?u?d?l?l?l?s +?d?d?u?d?l?l?u?s +?d?d?u?d?l?l?s?d +?d?d?u?d?l?l?s?l +?d?d?u?d?l?l?s?u +?d?d?u?d?l?l?s?s +?d?d?u?d?l?u?d?s +?d?d?u?d?l?u?l?s +?d?d?u?d?l?u?u?s +?d?d?u?d?l?u?s?d +?d?d?u?d?l?u?s?l +?d?d?u?d?l?u?s?u +?d?d?u?d?l?u?s?s +?d?d?u?d?l?s?d?d +?d?d?u?d?l?s?d?l +?d?d?u?d?l?s?d?u +?d?d?u?d?l?s?d?s +?d?d?u?d?l?s?l?d +?d?d?u?d?l?s?l?l +?d?d?u?d?l?s?l?u +?d?d?u?d?l?s?l?s +?d?d?u?d?l?s?u?d +?d?d?u?d?l?s?u?l +?d?d?u?d?l?s?u?u +?d?d?u?d?l?s?u?s +?d?d?u?d?l?s?s?d +?d?d?u?d?l?s?s?l +?d?d?u?d?l?s?s?u +?d?d?u?d?l?s?s?s +?d?d?u?d?u?d?l?s +?d?d?u?d?u?d?s?l +?d?d?u?d?u?l?d?s +?d?d?u?d?u?l?l?s +?d?d?u?d?u?l?u?s +?d?d?u?d?u?l?s?d +?d?d?u?d?u?l?s?l +?d?d?u?d?u?l?s?u +?d?d?u?d?u?l?s?s +?d?d?u?d?u?u?l?s +?d?d?u?d?u?u?s?l +?d?d?u?d?u?s?d?l +?d?d?u?d?u?s?l?d +?d?d?u?d?u?s?l?l +?d?d?u?d?u?s?l?u +?d?d?u?d?u?s?l?s +?d?d?u?d?u?s?u?l +?d?d?u?d?u?s?s?l +?d?d?u?d?s?d?d?l +?d?d?u?d?s?d?l?d +?d?d?u?d?s?d?l?l +?d?d?u?d?s?d?l?u +?d?d?u?d?s?d?l?s +?d?d?u?d?s?d?u?l +?d?d?u?d?s?d?s?l +?d?d?u?d?s?l?d?d +?d?d?u?d?s?l?d?l +?d?d?u?d?s?l?d?u +?d?d?u?d?s?l?d?s +?d?d?u?d?s?l?l?d +?d?d?u?d?s?l?l?l +?d?d?u?d?s?l?l?u +?d?d?u?d?s?l?l?s +?d?d?u?d?s?l?u?d +?d?d?u?d?s?l?u?l +?d?d?u?d?s?l?u?u +?d?d?u?d?s?l?u?s +?d?d?u?d?s?l?s?d +?d?d?u?d?s?l?s?l +?d?d?u?d?s?l?s?u +?d?d?u?d?s?l?s?s +?d?d?u?d?s?u?d?l +?d?d?u?d?s?u?l?d +?d?d?u?d?s?u?l?l +?d?d?u?d?s?u?l?u +?d?d?u?d?s?u?l?s +?d?d?u?d?s?u?u?l +?d?d?u?d?s?u?s?l +?d?d?u?d?s?s?d?l +?d?d?u?d?s?s?l?d +?d?d?u?d?s?s?l?l +?d?d?u?d?s?s?l?u +?d?d?u?d?s?s?l?s +?d?d?u?d?s?s?u?l +?d?d?u?d?s?s?s?l +?d?d?u?l?d?d?d?s +?d?d?u?l?d?d?l?s +?d?d?u?l?d?d?u?s +?d?d?u?l?d?d?s?d +?d?d?u?l?d?d?s?l +?d?d?u?l?d?d?s?u +?d?d?u?l?d?d?s?s +?d?d?u?l?d?l?d?s +?d?d?u?l?d?l?l?s +?d?d?u?l?d?l?u?s +?d?d?u?l?d?l?s?d +?d?d?u?l?d?l?s?l +?d?d?u?l?d?l?s?u +?d?d?u?l?d?l?s?s +?d?d?u?l?d?u?d?s +?d?d?u?l?d?u?l?s +?d?d?u?l?d?u?u?s +?d?d?u?l?d?u?s?d +?d?d?u?l?d?u?s?l +?d?d?u?l?d?u?s?u +?d?d?u?l?d?u?s?s +?d?d?u?l?d?s?d?d +?d?d?u?l?d?s?d?l +?d?d?u?l?d?s?d?u +?d?d?u?l?d?s?d?s +?d?d?u?l?d?s?l?d +?d?d?u?l?d?s?l?l +?d?d?u?l?d?s?l?u +?d?d?u?l?d?s?l?s +?d?d?u?l?d?s?u?d +?d?d?u?l?d?s?u?l +?d?d?u?l?d?s?u?u +?d?d?u?l?d?s?u?s +?d?d?u?l?d?s?s?d +?d?d?u?l?d?s?s?l +?d?d?u?l?d?s?s?u +?d?d?u?l?d?s?s?s +?d?d?u?l?l?d?d?s +?d?d?u?l?l?d?l?s +?d?d?u?l?l?d?u?s +?d?d?u?l?l?d?s?d +?d?d?u?l?l?d?s?l +?d?d?u?l?l?d?s?u +?d?d?u?l?l?d?s?s +?d?d?u?l?l?l?d?s +?d?d?u?l?l?l?l?s +?d?d?u?l?l?l?u?s +?d?d?u?l?l?l?s?d +?d?d?u?l?l?l?s?l +?d?d?u?l?l?l?s?u +?d?d?u?l?l?l?s?s +?d?d?u?l?l?u?d?s +?d?d?u?l?l?u?l?s +?d?d?u?l?l?u?u?s +?d?d?u?l?l?u?s?d +?d?d?u?l?l?u?s?l +?d?d?u?l?l?u?s?u +?d?d?u?l?l?u?s?s +?d?d?u?l?l?s?d?d +?d?d?u?l?l?s?d?l +?d?d?u?l?l?s?d?u +?d?d?u?l?l?s?d?s +?d?d?u?l?l?s?l?d +?d?d?u?l?l?s?l?l +?d?d?u?l?l?s?l?u +?d?d?u?l?l?s?l?s +?d?d?u?l?l?s?u?d +?d?d?u?l?l?s?u?l +?d?d?u?l?l?s?u?u +?d?d?u?l?l?s?u?s +?d?d?u?l?l?s?s?d +?d?d?u?l?l?s?s?l +?d?d?u?l?l?s?s?u +?d?d?u?l?l?s?s?s +?d?d?u?l?u?d?d?s +?d?d?u?l?u?d?l?s +?d?d?u?l?u?d?u?s +?d?d?u?l?u?d?s?d +?d?d?u?l?u?d?s?l +?d?d?u?l?u?d?s?u +?d?d?u?l?u?d?s?s +?d?d?u?l?u?l?d?s +?d?d?u?l?u?l?l?s +?d?d?u?l?u?l?u?s +?d?d?u?l?u?l?s?d +?d?d?u?l?u?l?s?l +?d?d?u?l?u?l?s?u +?d?d?u?l?u?l?s?s +?d?d?u?l?u?u?d?s +?d?d?u?l?u?u?l?s +?d?d?u?l?u?u?u?s +?d?d?u?l?u?u?s?d +?d?d?u?l?u?u?s?l +?d?d?u?l?u?u?s?u +?d?d?u?l?u?u?s?s +?d?d?u?l?u?s?d?d +?d?d?u?l?u?s?d?l +?d?d?u?l?u?s?d?u +?d?d?u?l?u?s?d?s +?d?d?u?l?u?s?l?d +?d?d?u?l?u?s?l?l +?d?d?u?l?u?s?l?u +?d?d?u?l?u?s?l?s +?d?d?u?l?u?s?u?d +?d?d?u?l?u?s?u?l +?d?d?u?l?u?s?u?u +?d?d?u?l?u?s?u?s +?d?d?u?l?u?s?s?d +?d?d?u?l?u?s?s?l +?d?d?u?l?u?s?s?u +?d?d?u?l?u?s?s?s +?d?d?u?l?s?d?d?d +?d?d?u?l?s?d?d?l +?d?d?u?l?s?d?d?u +?d?d?u?l?s?d?d?s +?d?d?u?l?s?d?l?d +?d?d?u?l?s?d?l?l +?d?d?u?l?s?d?l?u +?d?d?u?l?s?d?l?s +?d?d?u?l?s?d?u?d +?d?d?u?l?s?d?u?l +?d?d?u?l?s?d?u?u +?d?d?u?l?s?d?u?s +?d?d?u?l?s?d?s?d +?d?d?u?l?s?d?s?l +?d?d?u?l?s?d?s?u +?d?d?u?l?s?d?s?s +?d?d?u?l?s?l?d?d +?d?d?u?l?s?l?d?l +?d?d?u?l?s?l?d?u +?d?d?u?l?s?l?d?s +?d?d?u?l?s?l?l?d +?d?d?u?l?s?l?l?l +?d?d?u?l?s?l?l?u +?d?d?u?l?s?l?l?s +?d?d?u?l?s?l?u?d +?d?d?u?l?s?l?u?l +?d?d?u?l?s?l?u?u +?d?d?u?l?s?l?u?s +?d?d?u?l?s?l?s?d +?d?d?u?l?s?l?s?l +?d?d?u?l?s?l?s?u +?d?d?u?l?s?l?s?s +?d?d?u?l?s?u?d?d +?d?d?u?l?s?u?d?l +?d?d?u?l?s?u?d?u +?d?d?u?l?s?u?d?s +?d?d?u?l?s?u?l?d +?d?d?u?l?s?u?l?l +?d?d?u?l?s?u?l?u +?d?d?u?l?s?u?l?s +?d?d?u?l?s?u?u?d +?d?d?u?l?s?u?u?l +?d?d?u?l?s?u?u?u +?d?d?u?l?s?u?u?s +?d?d?u?l?s?u?s?d +?d?d?u?l?s?u?s?l +?d?d?u?l?s?u?s?u +?d?d?u?l?s?u?s?s +?d?d?u?l?s?s?d?d +?d?d?u?l?s?s?d?l +?d?d?u?l?s?s?d?u +?d?d?u?l?s?s?d?s +?d?d?u?l?s?s?l?d +?d?d?u?l?s?s?l?l +?d?d?u?l?s?s?l?u +?d?d?u?l?s?s?l?s +?d?d?u?l?s?s?u?d +?d?d?u?l?s?s?u?l +?d?d?u?l?s?s?u?u +?d?d?u?l?s?s?u?s +?d?d?u?l?s?s?s?d +?d?d?u?l?s?s?s?l +?d?d?u?l?s?s?s?u +?d?d?u?l?s?s?s?s +?d?d?u?u?d?d?l?s +?d?d?u?u?d?d?s?l +?d?d?u?u?d?l?d?s +?d?d?u?u?d?l?l?s +?d?d?u?u?d?l?u?s +?d?d?u?u?d?l?s?d +?d?d?u?u?d?l?s?l +?d?d?u?u?d?l?s?u +?d?d?u?u?d?l?s?s +?d?d?u?u?d?u?l?s +?d?d?u?u?d?u?s?l +?d?d?u?u?d?s?d?l +?d?d?u?u?d?s?l?d +?d?d?u?u?d?s?l?l +?d?d?u?u?d?s?l?u +?d?d?u?u?d?s?l?s +?d?d?u?u?d?s?u?l +?d?d?u?u?d?s?s?l +?d?d?u?u?l?d?d?s +?d?d?u?u?l?d?l?s +?d?d?u?u?l?d?u?s +?d?d?u?u?l?d?s?d +?d?d?u?u?l?d?s?l +?d?d?u?u?l?d?s?u +?d?d?u?u?l?d?s?s +?d?d?u?u?l?l?d?s +?d?d?u?u?l?l?l?s +?d?d?u?u?l?l?u?s +?d?d?u?u?l?l?s?d +?d?d?u?u?l?l?s?l +?d?d?u?u?l?l?s?u +?d?d?u?u?l?l?s?s +?d?d?u?u?l?u?d?s +?d?d?u?u?l?u?l?s +?d?d?u?u?l?u?u?s +?d?d?u?u?l?u?s?d +?d?d?u?u?l?u?s?l +?d?d?u?u?l?u?s?u +?d?d?u?u?l?u?s?s +?d?d?u?u?l?s?d?d +?d?d?u?u?l?s?d?l +?d?d?u?u?l?s?d?u +?d?d?u?u?l?s?d?s +?d?d?u?u?l?s?l?d +?d?d?u?u?l?s?l?l +?d?d?u?u?l?s?l?u +?d?d?u?u?l?s?l?s +?d?d?u?u?l?s?u?d +?d?d?u?u?l?s?u?l +?d?d?u?u?l?s?u?u +?d?d?u?u?l?s?u?s +?d?d?u?u?l?s?s?d +?d?d?u?u?l?s?s?l +?d?d?u?u?l?s?s?u +?d?d?u?u?l?s?s?s +?d?d?u?u?u?d?l?s +?d?d?u?u?u?d?s?l +?d?d?u?u?u?l?d?s +?d?d?u?u?u?l?l?s +?d?d?u?u?u?l?u?s +?d?d?u?u?u?l?s?d +?d?d?u?u?u?l?s?l +?d?d?u?u?u?l?s?u +?d?d?u?u?u?l?s?s +?d?d?u?u?u?u?l?s +?d?d?u?u?u?u?s?l +?d?d?u?u?u?s?d?l +?d?d?u?u?u?s?l?d +?d?d?u?u?u?s?l?l +?d?d?u?u?u?s?l?u +?d?d?u?u?u?s?l?s +?d?d?u?u?u?s?u?l +?d?d?u?u?u?s?s?l +?d?d?u?u?s?d?d?l +?d?d?u?u?s?d?l?d +?d?d?u?u?s?d?l?l +?d?d?u?u?s?d?l?u +?d?d?u?u?s?d?l?s +?d?d?u?u?s?d?u?l +?d?d?u?u?s?d?s?l +?d?d?u?u?s?l?d?d +?d?d?u?u?s?l?d?l +?d?d?u?u?s?l?d?u +?d?d?u?u?s?l?d?s +?d?d?u?u?s?l?l?d +?d?d?u?u?s?l?l?l +?d?d?u?u?s?l?l?u +?d?d?u?u?s?l?l?s +?d?d?u?u?s?l?u?d +?d?d?u?u?s?l?u?l +?d?d?u?u?s?l?u?u +?d?d?u?u?s?l?u?s +?d?d?u?u?s?l?s?d +?d?d?u?u?s?l?s?l +?d?d?u?u?s?l?s?u +?d?d?u?u?s?l?s?s +?d?d?u?u?s?u?d?l +?d?d?u?u?s?u?l?d +?d?d?u?u?s?u?l?l +?d?d?u?u?s?u?l?u +?d?d?u?u?s?u?l?s +?d?d?u?u?s?u?u?l +?d?d?u?u?s?u?s?l +?d?d?u?u?s?s?d?l +?d?d?u?u?s?s?l?d +?d?d?u?u?s?s?l?l +?d?d?u?u?s?s?l?u +?d?d?u?u?s?s?l?s +?d?d?u?u?s?s?u?l +?d?d?u?u?s?s?s?l +?d?d?u?s?d?d?d?l +?d?d?u?s?d?d?l?d +?d?d?u?s?d?d?l?l +?d?d?u?s?d?d?l?u +?d?d?u?s?d?d?l?s +?d?d?u?s?d?d?u?l +?d?d?u?s?d?d?s?l +?d?d?u?s?d?l?d?d +?d?d?u?s?d?l?d?l +?d?d?u?s?d?l?d?u +?d?d?u?s?d?l?d?s +?d?d?u?s?d?l?l?d +?d?d?u?s?d?l?l?l +?d?d?u?s?d?l?l?u +?d?d?u?s?d?l?l?s +?d?d?u?s?d?l?u?d +?d?d?u?s?d?l?u?l +?d?d?u?s?d?l?u?u +?d?d?u?s?d?l?u?s +?d?d?u?s?d?l?s?d +?d?d?u?s?d?l?s?l +?d?d?u?s?d?l?s?u +?d?d?u?s?d?l?s?s +?d?d?u?s?d?u?d?l +?d?d?u?s?d?u?l?d +?d?d?u?s?d?u?l?l +?d?d?u?s?d?u?l?u +?d?d?u?s?d?u?l?s +?d?d?u?s?d?u?u?l +?d?d?u?s?d?u?s?l +?d?d?u?s?d?s?d?l +?d?d?u?s?d?s?l?d +?d?d?u?s?d?s?l?l +?d?d?u?s?d?s?l?u +?d?d?u?s?d?s?l?s +?d?d?u?s?d?s?u?l +?d?d?u?s?d?s?s?l +?d?d?u?s?l?d?d?d +?d?d?u?s?l?d?d?l +?d?d?u?s?l?d?d?u +?d?d?u?s?l?d?d?s +?d?d?u?s?l?d?l?d +?d?d?u?s?l?d?l?l +?d?d?u?s?l?d?l?u +?d?d?u?s?l?d?l?s +?d?d?u?s?l?d?u?d +?d?d?u?s?l?d?u?l +?d?d?u?s?l?d?u?u +?d?d?u?s?l?d?u?s +?d?d?u?s?l?d?s?d +?d?d?u?s?l?d?s?l +?d?d?u?s?l?d?s?u +?d?d?u?s?l?d?s?s +?d?d?u?s?l?l?d?d +?d?d?u?s?l?l?d?l +?d?d?u?s?l?l?d?u +?d?d?u?s?l?l?d?s +?d?d?u?s?l?l?l?d +?d?d?u?s?l?l?l?l +?d?d?u?s?l?l?l?u +?d?d?u?s?l?l?l?s +?d?d?u?s?l?l?u?d +?d?d?u?s?l?l?u?l +?d?d?u?s?l?l?u?u +?d?d?u?s?l?l?u?s +?d?d?u?s?l?l?s?d +?d?d?u?s?l?l?s?l +?d?d?u?s?l?l?s?u +?d?d?u?s?l?l?s?s +?d?d?u?s?l?u?d?d +?d?d?u?s?l?u?d?l +?d?d?u?s?l?u?d?u +?d?d?u?s?l?u?d?s +?d?d?u?s?l?u?l?d +?d?d?u?s?l?u?l?l +?d?d?u?s?l?u?l?u +?d?d?u?s?l?u?l?s +?d?d?u?s?l?u?u?d +?d?d?u?s?l?u?u?l +?d?d?u?s?l?u?u?u +?d?d?u?s?l?u?u?s +?d?d?u?s?l?u?s?d +?d?d?u?s?l?u?s?l +?d?d?u?s?l?u?s?u +?d?d?u?s?l?u?s?s +?d?d?u?s?l?s?d?d +?d?d?u?s?l?s?d?l +?d?d?u?s?l?s?d?u +?d?d?u?s?l?s?d?s +?d?d?u?s?l?s?l?d +?d?d?u?s?l?s?l?l +?d?d?u?s?l?s?l?u +?d?d?u?s?l?s?l?s +?d?d?u?s?l?s?u?d +?d?d?u?s?l?s?u?l +?d?d?u?s?l?s?u?u +?d?d?u?s?l?s?u?s +?d?d?u?s?l?s?s?d +?d?d?u?s?l?s?s?l +?d?d?u?s?l?s?s?u +?d?d?u?s?l?s?s?s +?d?d?u?s?u?d?d?l +?d?d?u?s?u?d?l?d +?d?d?u?s?u?d?l?l +?d?d?u?s?u?d?l?u +?d?d?u?s?u?d?l?s +?d?d?u?s?u?d?u?l +?d?d?u?s?u?d?s?l +?d?d?u?s?u?l?d?d +?d?d?u?s?u?l?d?l +?d?d?u?s?u?l?d?u +?d?d?u?s?u?l?d?s +?d?d?u?s?u?l?l?d +?d?d?u?s?u?l?l?l +?d?d?u?s?u?l?l?u +?d?d?u?s?u?l?l?s +?d?d?u?s?u?l?u?d +?d?d?u?s?u?l?u?l +?d?d?u?s?u?l?u?u +?d?d?u?s?u?l?u?s +?d?d?u?s?u?l?s?d +?d?d?u?s?u?l?s?l +?d?d?u?s?u?l?s?u +?d?d?u?s?u?l?s?s +?d?d?u?s?u?u?d?l +?d?d?u?s?u?u?l?d +?d?d?u?s?u?u?l?l +?d?d?u?s?u?u?l?u +?d?d?u?s?u?u?l?s +?d?d?u?s?u?u?u?l +?d?d?u?s?u?u?s?l +?d?d?u?s?u?s?d?l +?d?d?u?s?u?s?l?d +?d?d?u?s?u?s?l?l +?d?d?u?s?u?s?l?u +?d?d?u?s?u?s?l?s +?d?d?u?s?u?s?u?l +?d?d?u?s?u?s?s?l +?d?d?u?s?s?d?d?l +?d?d?u?s?s?d?l?d +?d?d?u?s?s?d?l?l +?d?d?u?s?s?d?l?u +?d?d?u?s?s?d?l?s +?d?d?u?s?s?d?u?l +?d?d?u?s?s?d?s?l +?d?d?u?s?s?l?d?d +?d?d?u?s?s?l?d?l +?d?d?u?s?s?l?d?u +?d?d?u?s?s?l?d?s +?d?d?u?s?s?l?l?d +?d?d?u?s?s?l?l?l +?d?d?u?s?s?l?l?u +?d?d?u?s?s?l?l?s +?d?d?u?s?s?l?u?d +?d?d?u?s?s?l?u?l +?d?d?u?s?s?l?u?u +?d?d?u?s?s?l?u?s +?d?d?u?s?s?l?s?d +?d?d?u?s?s?l?s?l +?d?d?u?s?s?l?s?u +?d?d?u?s?s?l?s?s +?d?d?u?s?s?u?d?l +?d?d?u?s?s?u?l?d +?d?d?u?s?s?u?l?l +?d?d?u?s?s?u?l?u +?d?d?u?s?s?u?l?s +?d?d?u?s?s?u?u?l +?d?d?u?s?s?u?s?l +?d?d?u?s?s?s?d?l +?d?d?u?s?s?s?l?d +?d?d?u?s?s?s?l?l +?d?d?u?s?s?s?l?u +?d?d?u?s?s?s?l?s +?d?d?u?s?s?s?u?l +?d?d?u?s?s?s?s?l +?d?d?s?d?d?d?l?u +?d?d?s?d?d?d?u?l +?d?d?s?d?d?l?d?u +?d?d?s?d?d?l?l?u +?d?d?s?d?d?l?u?d +?d?d?s?d?d?l?u?l +?d?d?s?d?d?l?u?u +?d?d?s?d?d?l?u?s +?d?d?s?d?d?l?s?u +?d?d?s?d?d?u?d?l +?d?d?s?d?d?u?l?d +?d?d?s?d?d?u?l?l +?d?d?s?d?d?u?l?u +?d?d?s?d?d?u?l?s +?d?d?s?d?d?u?u?l +?d?d?s?d?d?u?s?l +?d?d?s?d?d?s?l?u +?d?d?s?d?d?s?u?l +?d?d?s?d?l?d?d?u +?d?d?s?d?l?d?l?u +?d?d?s?d?l?d?u?d +?d?d?s?d?l?d?u?l +?d?d?s?d?l?d?u?u +?d?d?s?d?l?d?u?s +?d?d?s?d?l?d?s?u +?d?d?s?d?l?l?d?u +?d?d?s?d?l?l?l?u +?d?d?s?d?l?l?u?d +?d?d?s?d?l?l?u?l +?d?d?s?d?l?l?u?u +?d?d?s?d?l?l?u?s +?d?d?s?d?l?l?s?u +?d?d?s?d?l?u?d?d +?d?d?s?d?l?u?d?l +?d?d?s?d?l?u?d?u +?d?d?s?d?l?u?d?s +?d?d?s?d?l?u?l?d +?d?d?s?d?l?u?l?l +?d?d?s?d?l?u?l?u +?d?d?s?d?l?u?l?s +?d?d?s?d?l?u?u?d +?d?d?s?d?l?u?u?l +?d?d?s?d?l?u?u?u +?d?d?s?d?l?u?u?s +?d?d?s?d?l?u?s?d +?d?d?s?d?l?u?s?l +?d?d?s?d?l?u?s?u +?d?d?s?d?l?u?s?s +?d?d?s?d?l?s?d?u +?d?d?s?d?l?s?l?u +?d?d?s?d?l?s?u?d +?d?d?s?d?l?s?u?l +?d?d?s?d?l?s?u?u +?d?d?s?d?l?s?u?s +?d?d?s?d?l?s?s?u +?d?d?s?d?u?d?d?l +?d?d?s?d?u?d?l?d +?d?d?s?d?u?d?l?l +?d?d?s?d?u?d?l?u +?d?d?s?d?u?d?l?s +?d?d?s?d?u?d?u?l +?d?d?s?d?u?d?s?l +?d?d?s?d?u?l?d?d +?d?d?s?d?u?l?d?l +?d?d?s?d?u?l?d?u +?d?d?s?d?u?l?d?s +?d?d?s?d?u?l?l?d +?d?d?s?d?u?l?l?l +?d?d?s?d?u?l?l?u +?d?d?s?d?u?l?l?s +?d?d?s?d?u?l?u?d +?d?d?s?d?u?l?u?l +?d?d?s?d?u?l?u?u +?d?d?s?d?u?l?u?s +?d?d?s?d?u?l?s?d +?d?d?s?d?u?l?s?l +?d?d?s?d?u?l?s?u +?d?d?s?d?u?l?s?s +?d?d?s?d?u?u?d?l +?d?d?s?d?u?u?l?d +?d?d?s?d?u?u?l?l +?d?d?s?d?u?u?l?u +?d?d?s?d?u?u?l?s +?d?d?s?d?u?u?u?l +?d?d?s?d?u?u?s?l +?d?d?s?d?u?s?d?l +?d?d?s?d?u?s?l?d +?d?d?s?d?u?s?l?l +?d?d?s?d?u?s?l?u +?d?d?s?d?u?s?l?s +?d?d?s?d?u?s?u?l +?d?d?s?d?u?s?s?l +?d?d?s?d?s?d?l?u +?d?d?s?d?s?d?u?l +?d?d?s?d?s?l?d?u +?d?d?s?d?s?l?l?u +?d?d?s?d?s?l?u?d +?d?d?s?d?s?l?u?l +?d?d?s?d?s?l?u?u +?d?d?s?d?s?l?u?s +?d?d?s?d?s?l?s?u +?d?d?s?d?s?u?d?l +?d?d?s?d?s?u?l?d +?d?d?s?d?s?u?l?l +?d?d?s?d?s?u?l?u +?d?d?s?d?s?u?l?s +?d?d?s?d?s?u?u?l +?d?d?s?d?s?u?s?l +?d?d?s?d?s?s?l?u +?d?d?s?d?s?s?u?l +?d?d?s?l?d?d?d?u +?d?d?s?l?d?d?l?u +?d?d?s?l?d?d?u?d +?d?d?s?l?d?d?u?l +?d?d?s?l?d?d?u?u +?d?d?s?l?d?d?u?s +?d?d?s?l?d?d?s?u +?d?d?s?l?d?l?d?u +?d?d?s?l?d?l?l?u +?d?d?s?l?d?l?u?d +?d?d?s?l?d?l?u?l +?d?d?s?l?d?l?u?u +?d?d?s?l?d?l?u?s +?d?d?s?l?d?l?s?u +?d?d?s?l?d?u?d?d +?d?d?s?l?d?u?d?l +?d?d?s?l?d?u?d?u +?d?d?s?l?d?u?d?s +?d?d?s?l?d?u?l?d +?d?d?s?l?d?u?l?l +?d?d?s?l?d?u?l?u +?d?d?s?l?d?u?l?s +?d?d?s?l?d?u?u?d +?d?d?s?l?d?u?u?l +?d?d?s?l?d?u?u?u +?d?d?s?l?d?u?u?s +?d?d?s?l?d?u?s?d +?d?d?s?l?d?u?s?l +?d?d?s?l?d?u?s?u +?d?d?s?l?d?u?s?s +?d?d?s?l?d?s?d?u +?d?d?s?l?d?s?l?u +?d?d?s?l?d?s?u?d +?d?d?s?l?d?s?u?l +?d?d?s?l?d?s?u?u +?d?d?s?l?d?s?u?s +?d?d?s?l?d?s?s?u +?d?d?s?l?l?d?d?u +?d?d?s?l?l?d?l?u +?d?d?s?l?l?d?u?d +?d?d?s?l?l?d?u?l +?d?d?s?l?l?d?u?u +?d?d?s?l?l?d?u?s +?d?d?s?l?l?d?s?u +?d?d?s?l?l?l?d?u +?d?d?s?l?l?l?l?u +?d?d?s?l?l?l?u?d +?d?d?s?l?l?l?u?l +?d?d?s?l?l?l?u?u +?d?d?s?l?l?l?u?s +?d?d?s?l?l?l?s?u +?d?d?s?l?l?u?d?d +?d?d?s?l?l?u?d?l +?d?d?s?l?l?u?d?u +?d?d?s?l?l?u?d?s +?d?d?s?l?l?u?l?d +?d?d?s?l?l?u?l?l +?d?d?s?l?l?u?l?u +?d?d?s?l?l?u?l?s +?d?d?s?l?l?u?u?d +?d?d?s?l?l?u?u?l +?d?d?s?l?l?u?u?u +?d?d?s?l?l?u?u?s +?d?d?s?l?l?u?s?d +?d?d?s?l?l?u?s?l +?d?d?s?l?l?u?s?u +?d?d?s?l?l?u?s?s +?d?d?s?l?l?s?d?u +?d?d?s?l?l?s?l?u +?d?d?s?l?l?s?u?d +?d?d?s?l?l?s?u?l +?d?d?s?l?l?s?u?u +?d?d?s?l?l?s?u?s +?d?d?s?l?l?s?s?u +?d?d?s?l?u?d?d?d +?d?d?s?l?u?d?d?l +?d?d?s?l?u?d?d?u +?d?d?s?l?u?d?d?s +?d?d?s?l?u?d?l?d +?d?d?s?l?u?d?l?l +?d?d?s?l?u?d?l?u +?d?d?s?l?u?d?l?s +?d?d?s?l?u?d?u?d +?d?d?s?l?u?d?u?l +?d?d?s?l?u?d?u?u +?d?d?s?l?u?d?u?s +?d?d?s?l?u?d?s?d +?d?d?s?l?u?d?s?l +?d?d?s?l?u?d?s?u +?d?d?s?l?u?d?s?s +?d?d?s?l?u?l?d?d +?d?d?s?l?u?l?d?l +?d?d?s?l?u?l?d?u +?d?d?s?l?u?l?d?s +?d?d?s?l?u?l?l?d +?d?d?s?l?u?l?l?l +?d?d?s?l?u?l?l?u +?d?d?s?l?u?l?l?s +?d?d?s?l?u?l?u?d +?d?d?s?l?u?l?u?l +?d?d?s?l?u?l?u?u +?d?d?s?l?u?l?u?s +?d?d?s?l?u?l?s?d +?d?d?s?l?u?l?s?l +?d?d?s?l?u?l?s?u +?d?d?s?l?u?l?s?s +?d?d?s?l?u?u?d?d +?d?d?s?l?u?u?d?l +?d?d?s?l?u?u?d?u +?d?d?s?l?u?u?d?s +?d?d?s?l?u?u?l?d +?d?d?s?l?u?u?l?l +?d?d?s?l?u?u?l?u +?d?d?s?l?u?u?l?s +?d?d?s?l?u?u?u?d +?d?d?s?l?u?u?u?l +?d?d?s?l?u?u?u?u +?d?d?s?l?u?u?u?s +?d?d?s?l?u?u?s?d +?d?d?s?l?u?u?s?l +?d?d?s?l?u?u?s?u +?d?d?s?l?u?u?s?s +?d?d?s?l?u?s?d?d +?d?d?s?l?u?s?d?l +?d?d?s?l?u?s?d?u +?d?d?s?l?u?s?d?s +?d?d?s?l?u?s?l?d +?d?d?s?l?u?s?l?l +?d?d?s?l?u?s?l?u +?d?d?s?l?u?s?l?s +?d?d?s?l?u?s?u?d +?d?d?s?l?u?s?u?l +?d?d?s?l?u?s?u?u +?d?d?s?l?u?s?u?s +?d?d?s?l?u?s?s?d +?d?d?s?l?u?s?s?l +?d?d?s?l?u?s?s?u +?d?d?s?l?u?s?s?s +?d?d?s?l?s?d?d?u +?d?d?s?l?s?d?l?u +?d?d?s?l?s?d?u?d +?d?d?s?l?s?d?u?l +?d?d?s?l?s?d?u?u +?d?d?s?l?s?d?u?s +?d?d?s?l?s?d?s?u +?d?d?s?l?s?l?d?u +?d?d?s?l?s?l?l?u +?d?d?s?l?s?l?u?d +?d?d?s?l?s?l?u?l +?d?d?s?l?s?l?u?u +?d?d?s?l?s?l?u?s +?d?d?s?l?s?l?s?u +?d?d?s?l?s?u?d?d +?d?d?s?l?s?u?d?l +?d?d?s?l?s?u?d?u +?d?d?s?l?s?u?d?s +?d?d?s?l?s?u?l?d +?d?d?s?l?s?u?l?l +?d?d?s?l?s?u?l?u +?d?d?s?l?s?u?l?s +?d?d?s?l?s?u?u?d +?d?d?s?l?s?u?u?l +?d?d?s?l?s?u?u?u +?d?d?s?l?s?u?u?s +?d?d?s?l?s?u?s?d +?d?d?s?l?s?u?s?l +?d?d?s?l?s?u?s?u +?d?d?s?l?s?u?s?s +?d?d?s?l?s?s?d?u +?d?d?s?l?s?s?l?u +?d?d?s?l?s?s?u?d +?d?d?s?l?s?s?u?l +?d?d?s?l?s?s?u?u +?d?d?s?l?s?s?u?s +?d?d?s?l?s?s?s?u +?d?d?s?u?d?d?d?l +?d?d?s?u?d?d?l?d +?d?d?s?u?d?d?l?l +?d?d?s?u?d?d?l?u +?d?d?s?u?d?d?l?s +?d?d?s?u?d?d?u?l +?d?d?s?u?d?d?s?l +?d?d?s?u?d?l?d?d +?d?d?s?u?d?l?d?l +?d?d?s?u?d?l?d?u +?d?d?s?u?d?l?d?s +?d?d?s?u?d?l?l?d +?d?d?s?u?d?l?l?l +?d?d?s?u?d?l?l?u +?d?d?s?u?d?l?l?s +?d?d?s?u?d?l?u?d +?d?d?s?u?d?l?u?l +?d?d?s?u?d?l?u?u +?d?d?s?u?d?l?u?s +?d?d?s?u?d?l?s?d +?d?d?s?u?d?l?s?l +?d?d?s?u?d?l?s?u +?d?d?s?u?d?l?s?s +?d?d?s?u?d?u?d?l +?d?d?s?u?d?u?l?d +?d?d?s?u?d?u?l?l +?d?d?s?u?d?u?l?u +?d?d?s?u?d?u?l?s +?d?d?s?u?d?u?u?l +?d?d?s?u?d?u?s?l +?d?d?s?u?d?s?d?l +?d?d?s?u?d?s?l?d +?d?d?s?u?d?s?l?l +?d?d?s?u?d?s?l?u +?d?d?s?u?d?s?l?s +?d?d?s?u?d?s?u?l +?d?d?s?u?d?s?s?l +?d?d?s?u?l?d?d?d +?d?d?s?u?l?d?d?l +?d?d?s?u?l?d?d?u +?d?d?s?u?l?d?d?s +?d?d?s?u?l?d?l?d +?d?d?s?u?l?d?l?l +?d?d?s?u?l?d?l?u +?d?d?s?u?l?d?l?s +?d?d?s?u?l?d?u?d +?d?d?s?u?l?d?u?l +?d?d?s?u?l?d?u?u +?d?d?s?u?l?d?u?s +?d?d?s?u?l?d?s?d +?d?d?s?u?l?d?s?l +?d?d?s?u?l?d?s?u +?d?d?s?u?l?d?s?s +?d?d?s?u?l?l?d?d +?d?d?s?u?l?l?d?l +?d?d?s?u?l?l?d?u +?d?d?s?u?l?l?d?s +?d?d?s?u?l?l?l?d +?d?d?s?u?l?l?l?l +?d?d?s?u?l?l?l?u +?d?d?s?u?l?l?l?s +?d?d?s?u?l?l?u?d +?d?d?s?u?l?l?u?l +?d?d?s?u?l?l?u?u +?d?d?s?u?l?l?u?s +?d?d?s?u?l?l?s?d +?d?d?s?u?l?l?s?l +?d?d?s?u?l?l?s?u +?d?d?s?u?l?l?s?s +?d?d?s?u?l?u?d?d +?d?d?s?u?l?u?d?l +?d?d?s?u?l?u?d?u +?d?d?s?u?l?u?d?s +?d?d?s?u?l?u?l?d +?d?d?s?u?l?u?l?l +?d?d?s?u?l?u?l?u +?d?d?s?u?l?u?l?s +?d?d?s?u?l?u?u?d +?d?d?s?u?l?u?u?l +?d?d?s?u?l?u?u?u +?d?d?s?u?l?u?u?s +?d?d?s?u?l?u?s?d +?d?d?s?u?l?u?s?l +?d?d?s?u?l?u?s?u +?d?d?s?u?l?u?s?s +?d?d?s?u?l?s?d?d +?d?d?s?u?l?s?d?l +?d?d?s?u?l?s?d?u +?d?d?s?u?l?s?d?s +?d?d?s?u?l?s?l?d +?d?d?s?u?l?s?l?l +?d?d?s?u?l?s?l?u +?d?d?s?u?l?s?l?s +?d?d?s?u?l?s?u?d +?d?d?s?u?l?s?u?l +?d?d?s?u?l?s?u?u +?d?d?s?u?l?s?u?s +?d?d?s?u?l?s?s?d +?d?d?s?u?l?s?s?l +?d?d?s?u?l?s?s?u +?d?d?s?u?l?s?s?s +?d?d?s?u?u?d?d?l +?d?d?s?u?u?d?l?d +?d?d?s?u?u?d?l?l +?d?d?s?u?u?d?l?u +?d?d?s?u?u?d?l?s +?d?d?s?u?u?d?u?l +?d?d?s?u?u?d?s?l +?d?d?s?u?u?l?d?d +?d?d?s?u?u?l?d?l +?d?d?s?u?u?l?d?u +?d?d?s?u?u?l?d?s +?d?d?s?u?u?l?l?d +?d?d?s?u?u?l?l?l +?d?d?s?u?u?l?l?u +?d?d?s?u?u?l?l?s +?d?d?s?u?u?l?u?d +?d?d?s?u?u?l?u?l +?d?d?s?u?u?l?u?u +?d?d?s?u?u?l?u?s +?d?d?s?u?u?l?s?d +?d?d?s?u?u?l?s?l +?d?d?s?u?u?l?s?u +?d?d?s?u?u?l?s?s +?d?d?s?u?u?u?d?l +?d?d?s?u?u?u?l?d +?d?d?s?u?u?u?l?l +?d?d?s?u?u?u?l?u +?d?d?s?u?u?u?l?s +?d?d?s?u?u?u?u?l +?d?d?s?u?u?u?s?l +?d?d?s?u?u?s?d?l +?d?d?s?u?u?s?l?d +?d?d?s?u?u?s?l?l +?d?d?s?u?u?s?l?u +?d?d?s?u?u?s?l?s +?d?d?s?u?u?s?u?l +?d?d?s?u?u?s?s?l +?d?d?s?u?s?d?d?l +?d?d?s?u?s?d?l?d +?d?d?s?u?s?d?l?l +?d?d?s?u?s?d?l?u +?d?d?s?u?s?d?l?s +?d?d?s?u?s?d?u?l +?d?d?s?u?s?d?s?l +?d?d?s?u?s?l?d?d +?d?d?s?u?s?l?d?l +?d?d?s?u?s?l?d?u +?d?d?s?u?s?l?d?s +?d?d?s?u?s?l?l?d +?d?d?s?u?s?l?l?l +?d?d?s?u?s?l?l?u +?d?d?s?u?s?l?l?s +?d?d?s?u?s?l?u?d +?d?d?s?u?s?l?u?l +?d?d?s?u?s?l?u?u +?d?d?s?u?s?l?u?s +?d?d?s?u?s?l?s?d +?d?d?s?u?s?l?s?l +?d?d?s?u?s?l?s?u +?d?d?s?u?s?l?s?s +?d?d?s?u?s?u?d?l +?d?d?s?u?s?u?l?d +?d?d?s?u?s?u?l?l +?d?d?s?u?s?u?l?u +?d?d?s?u?s?u?l?s +?d?d?s?u?s?u?u?l +?d?d?s?u?s?u?s?l +?d?d?s?u?s?s?d?l +?d?d?s?u?s?s?l?d +?d?d?s?u?s?s?l?l +?d?d?s?u?s?s?l?u +?d?d?s?u?s?s?l?s +?d?d?s?u?s?s?u?l +?d?d?s?u?s?s?s?l +?d?d?s?s?d?d?l?u +?d?d?s?s?d?d?u?l +?d?d?s?s?d?l?d?u +?d?d?s?s?d?l?l?u +?d?d?s?s?d?l?u?d +?d?d?s?s?d?l?u?l +?d?d?s?s?d?l?u?u +?d?d?s?s?d?l?u?s +?d?d?s?s?d?l?s?u +?d?d?s?s?d?u?d?l +?d?d?s?s?d?u?l?d +?d?d?s?s?d?u?l?l +?d?d?s?s?d?u?l?u +?d?d?s?s?d?u?l?s +?d?d?s?s?d?u?u?l +?d?d?s?s?d?u?s?l +?d?d?s?s?d?s?l?u +?d?d?s?s?d?s?u?l +?d?d?s?s?l?d?d?u +?d?d?s?s?l?d?l?u +?d?d?s?s?l?d?u?d +?d?d?s?s?l?d?u?l +?d?d?s?s?l?d?u?u +?d?d?s?s?l?d?u?s +?d?d?s?s?l?d?s?u +?d?d?s?s?l?l?d?u +?d?d?s?s?l?l?l?u +?d?d?s?s?l?l?u?d +?d?d?s?s?l?l?u?l +?d?d?s?s?l?l?u?u +?d?d?s?s?l?l?u?s +?d?d?s?s?l?l?s?u +?d?d?s?s?l?u?d?d +?d?d?s?s?l?u?d?l +?d?d?s?s?l?u?d?u +?d?d?s?s?l?u?d?s +?d?d?s?s?l?u?l?d +?d?d?s?s?l?u?l?l +?d?d?s?s?l?u?l?u +?d?d?s?s?l?u?l?s +?d?d?s?s?l?u?u?d +?d?d?s?s?l?u?u?l +?d?d?s?s?l?u?u?u +?d?d?s?s?l?u?u?s +?d?d?s?s?l?u?s?d +?d?d?s?s?l?u?s?l +?d?d?s?s?l?u?s?u +?d?d?s?s?l?u?s?s +?d?d?s?s?l?s?d?u +?d?d?s?s?l?s?l?u +?d?d?s?s?l?s?u?d +?d?d?s?s?l?s?u?l +?d?d?s?s?l?s?u?u +?d?d?s?s?l?s?u?s +?d?d?s?s?l?s?s?u +?d?d?s?s?u?d?d?l +?d?d?s?s?u?d?l?d +?d?d?s?s?u?d?l?l +?d?d?s?s?u?d?l?u +?d?d?s?s?u?d?l?s +?d?d?s?s?u?d?u?l +?d?d?s?s?u?d?s?l +?d?d?s?s?u?l?d?d +?d?d?s?s?u?l?d?l +?d?d?s?s?u?l?d?u +?d?d?s?s?u?l?d?s +?d?d?s?s?u?l?l?d +?d?d?s?s?u?l?l?l +?d?d?s?s?u?l?l?u +?d?d?s?s?u?l?l?s +?d?d?s?s?u?l?u?d +?d?d?s?s?u?l?u?l +?d?d?s?s?u?l?u?u +?d?d?s?s?u?l?u?s +?d?d?s?s?u?l?s?d +?d?d?s?s?u?l?s?l +?d?d?s?s?u?l?s?u +?d?d?s?s?u?l?s?s +?d?d?s?s?u?u?d?l +?d?d?s?s?u?u?l?d +?d?d?s?s?u?u?l?l +?d?d?s?s?u?u?l?u +?d?d?s?s?u?u?l?s +?d?d?s?s?u?u?u?l +?d?d?s?s?u?u?s?l +?d?d?s?s?u?s?d?l +?d?d?s?s?u?s?l?d +?d?d?s?s?u?s?l?l +?d?d?s?s?u?s?l?u +?d?d?s?s?u?s?l?s +?d?d?s?s?u?s?u?l +?d?d?s?s?u?s?s?l +?d?d?s?s?s?d?l?u +?d?d?s?s?s?d?u?l +?d?d?s?s?s?l?d?u +?d?d?s?s?s?l?l?u +?d?d?s?s?s?l?u?d +?d?d?s?s?s?l?u?l +?d?d?s?s?s?l?u?u +?d?d?s?s?s?l?u?s +?d?d?s?s?s?l?s?u +?d?d?s?s?s?u?d?l +?d?d?s?s?s?u?l?d +?d?d?s?s?s?u?l?l +?d?d?s?s?s?u?l?u +?d?d?s?s?s?u?l?s +?d?d?s?s?s?u?u?l +?d?d?s?s?s?u?s?l +?d?d?s?s?s?s?l?u +?d?d?s?s?s?s?u?l +?d?l?d?d?d?d?u?s +?d?l?d?d?d?d?s?u +?d?l?d?d?d?l?u?s +?d?l?d?d?d?l?s?u +?d?l?d?d?d?u?d?s +?d?l?d?d?d?u?l?s +?d?l?d?d?d?u?u?s +?d?l?d?d?d?u?s?d +?d?l?d?d?d?u?s?l +?d?l?d?d?d?u?s?u +?d?l?d?d?d?u?s?s +?d?l?d?d?d?s?d?u +?d?l?d?d?d?s?l?u +?d?l?d?d?d?s?u?d +?d?l?d?d?d?s?u?l +?d?l?d?d?d?s?u?u +?d?l?d?d?d?s?u?s +?d?l?d?d?d?s?s?u +?d?l?d?d?l?d?u?s +?d?l?d?d?l?d?s?u +?d?l?d?d?l?l?u?s +?d?l?d?d?l?l?s?u +?d?l?d?d?l?u?d?s +?d?l?d?d?l?u?l?s +?d?l?d?d?l?u?u?s +?d?l?d?d?l?u?s?d +?d?l?d?d?l?u?s?l +?d?l?d?d?l?u?s?u +?d?l?d?d?l?u?s?s +?d?l?d?d?l?s?d?u +?d?l?d?d?l?s?l?u +?d?l?d?d?l?s?u?d +?d?l?d?d?l?s?u?l +?d?l?d?d?l?s?u?u +?d?l?d?d?l?s?u?s +?d?l?d?d?l?s?s?u +?d?l?d?d?u?d?d?s +?d?l?d?d?u?d?l?s +?d?l?d?d?u?d?u?s +?d?l?d?d?u?d?s?d +?d?l?d?d?u?d?s?l +?d?l?d?d?u?d?s?u +?d?l?d?d?u?d?s?s +?d?l?d?d?u?l?d?s +?d?l?d?d?u?l?l?s +?d?l?d?d?u?l?u?s +?d?l?d?d?u?l?s?d +?d?l?d?d?u?l?s?l +?d?l?d?d?u?l?s?u +?d?l?d?d?u?l?s?s +?d?l?d?d?u?u?d?s +?d?l?d?d?u?u?l?s +?d?l?d?d?u?u?u?s +?d?l?d?d?u?u?s?d +?d?l?d?d?u?u?s?l +?d?l?d?d?u?u?s?u +?d?l?d?d?u?u?s?s +?d?l?d?d?u?s?d?d +?d?l?d?d?u?s?d?l +?d?l?d?d?u?s?d?u +?d?l?d?d?u?s?d?s +?d?l?d?d?u?s?l?d +?d?l?d?d?u?s?l?l +?d?l?d?d?u?s?l?u +?d?l?d?d?u?s?l?s +?d?l?d?d?u?s?u?d +?d?l?d?d?u?s?u?l +?d?l?d?d?u?s?u?u +?d?l?d?d?u?s?u?s +?d?l?d?d?u?s?s?d +?d?l?d?d?u?s?s?l +?d?l?d?d?u?s?s?u +?d?l?d?d?u?s?s?s +?d?l?d?d?s?d?d?u +?d?l?d?d?s?d?l?u +?d?l?d?d?s?d?u?d +?d?l?d?d?s?d?u?l +?d?l?d?d?s?d?u?u +?d?l?d?d?s?d?u?s +?d?l?d?d?s?d?s?u +?d?l?d?d?s?l?d?u +?d?l?d?d?s?l?l?u +?d?l?d?d?s?l?u?d +?d?l?d?d?s?l?u?l +?d?l?d?d?s?l?u?u +?d?l?d?d?s?l?u?s +?d?l?d?d?s?l?s?u +?d?l?d?d?s?u?d?d +?d?l?d?d?s?u?d?l +?d?l?d?d?s?u?d?u +?d?l?d?d?s?u?d?s +?d?l?d?d?s?u?l?d +?d?l?d?d?s?u?l?l +?d?l?d?d?s?u?l?u +?d?l?d?d?s?u?l?s +?d?l?d?d?s?u?u?d +?d?l?d?d?s?u?u?l +?d?l?d?d?s?u?u?u +?d?l?d?d?s?u?u?s +?d?l?d?d?s?u?s?d +?d?l?d?d?s?u?s?l +?d?l?d?d?s?u?s?u +?d?l?d?d?s?u?s?s +?d?l?d?d?s?s?d?u +?d?l?d?d?s?s?l?u +?d?l?d?d?s?s?u?d +?d?l?d?d?s?s?u?l +?d?l?d?d?s?s?u?u +?d?l?d?d?s?s?u?s +?d?l?d?d?s?s?s?u +?d?l?d?l?d?d?u?s +?d?l?d?l?d?d?s?u +?d?l?d?l?d?l?u?s +?d?l?d?l?d?l?s?u +?d?l?d?l?d?u?d?s +?d?l?d?l?d?u?l?s +?d?l?d?l?d?u?u?s +?d?l?d?l?d?u?s?d +?d?l?d?l?d?u?s?l +?d?l?d?l?d?u?s?u +?d?l?d?l?d?u?s?s +?d?l?d?l?d?s?d?u +?d?l?d?l?d?s?l?u +?d?l?d?l?d?s?u?d +?d?l?d?l?d?s?u?l +?d?l?d?l?d?s?u?u +?d?l?d?l?d?s?u?s +?d?l?d?l?d?s?s?u +?d?l?d?l?l?d?u?s +?d?l?d?l?l?d?s?u +?d?l?d?l?l?l?u?s +?d?l?d?l?l?l?s?u +?d?l?d?l?l?u?d?s +?d?l?d?l?l?u?l?s +?d?l?d?l?l?u?u?s +?d?l?d?l?l?u?s?d +?d?l?d?l?l?u?s?l +?d?l?d?l?l?u?s?u +?d?l?d?l?l?u?s?s +?d?l?d?l?l?s?d?u +?d?l?d?l?l?s?l?u +?d?l?d?l?l?s?u?d +?d?l?d?l?l?s?u?l +?d?l?d?l?l?s?u?u +?d?l?d?l?l?s?u?s +?d?l?d?l?l?s?s?u +?d?l?d?l?u?d?d?s +?d?l?d?l?u?d?l?s +?d?l?d?l?u?d?u?s +?d?l?d?l?u?d?s?d +?d?l?d?l?u?d?s?l +?d?l?d?l?u?d?s?u +?d?l?d?l?u?d?s?s +?d?l?d?l?u?l?d?s +?d?l?d?l?u?l?l?s +?d?l?d?l?u?l?u?s +?d?l?d?l?u?l?s?d +?d?l?d?l?u?l?s?l +?d?l?d?l?u?l?s?u +?d?l?d?l?u?l?s?s +?d?l?d?l?u?u?d?s +?d?l?d?l?u?u?l?s +?d?l?d?l?u?u?u?s +?d?l?d?l?u?u?s?d +?d?l?d?l?u?u?s?l +?d?l?d?l?u?u?s?u +?d?l?d?l?u?u?s?s +?d?l?d?l?u?s?d?d +?d?l?d?l?u?s?d?l +?d?l?d?l?u?s?d?u +?d?l?d?l?u?s?d?s +?d?l?d?l?u?s?l?d +?d?l?d?l?u?s?l?l +?d?l?d?l?u?s?l?u +?d?l?d?l?u?s?l?s +?d?l?d?l?u?s?u?d +?d?l?d?l?u?s?u?l +?d?l?d?l?u?s?u?u +?d?l?d?l?u?s?u?s +?d?l?d?l?u?s?s?d +?d?l?d?l?u?s?s?l +?d?l?d?l?u?s?s?u +?d?l?d?l?u?s?s?s +?d?l?d?l?s?d?d?u +?d?l?d?l?s?d?l?u +?d?l?d?l?s?d?u?d +?d?l?d?l?s?d?u?l +?d?l?d?l?s?d?u?u +?d?l?d?l?s?d?u?s +?d?l?d?l?s?d?s?u +?d?l?d?l?s?l?d?u +?d?l?d?l?s?l?l?u +?d?l?d?l?s?l?u?d +?d?l?d?l?s?l?u?l +?d?l?d?l?s?l?u?u +?d?l?d?l?s?l?u?s +?d?l?d?l?s?l?s?u +?d?l?d?l?s?u?d?d +?d?l?d?l?s?u?d?l +?d?l?d?l?s?u?d?u +?d?l?d?l?s?u?d?s +?d?l?d?l?s?u?l?d +?d?l?d?l?s?u?l?l +?d?l?d?l?s?u?l?u +?d?l?d?l?s?u?l?s +?d?l?d?l?s?u?u?d +?d?l?d?l?s?u?u?l +?d?l?d?l?s?u?u?u +?d?l?d?l?s?u?u?s +?d?l?d?l?s?u?s?d +?d?l?d?l?s?u?s?l +?d?l?d?l?s?u?s?u +?d?l?d?l?s?u?s?s +?d?l?d?l?s?s?d?u +?d?l?d?l?s?s?l?u +?d?l?d?l?s?s?u?d +?d?l?d?l?s?s?u?l +?d?l?d?l?s?s?u?u +?d?l?d?l?s?s?u?s +?d?l?d?l?s?s?s?u +?d?l?d?u?d?d?d?s +?d?l?d?u?d?d?l?s +?d?l?d?u?d?d?u?s +?d?l?d?u?d?d?s?d +?d?l?d?u?d?d?s?l +?d?l?d?u?d?d?s?u +?d?l?d?u?d?d?s?s +?d?l?d?u?d?l?d?s +?d?l?d?u?d?l?l?s +?d?l?d?u?d?l?u?s +?d?l?d?u?d?l?s?d +?d?l?d?u?d?l?s?l +?d?l?d?u?d?l?s?u +?d?l?d?u?d?l?s?s +?d?l?d?u?d?u?d?s +?d?l?d?u?d?u?l?s +?d?l?d?u?d?u?u?s +?d?l?d?u?d?u?s?d +?d?l?d?u?d?u?s?l +?d?l?d?u?d?u?s?u +?d?l?d?u?d?u?s?s +?d?l?d?u?d?s?d?d +?d?l?d?u?d?s?d?l +?d?l?d?u?d?s?d?u +?d?l?d?u?d?s?d?s +?d?l?d?u?d?s?l?d +?d?l?d?u?d?s?l?l +?d?l?d?u?d?s?l?u +?d?l?d?u?d?s?l?s +?d?l?d?u?d?s?u?d +?d?l?d?u?d?s?u?l +?d?l?d?u?d?s?u?u +?d?l?d?u?d?s?u?s +?d?l?d?u?d?s?s?d +?d?l?d?u?d?s?s?l +?d?l?d?u?d?s?s?u +?d?l?d?u?d?s?s?s +?d?l?d?u?l?d?d?s +?d?l?d?u?l?d?l?s +?d?l?d?u?l?d?u?s +?d?l?d?u?l?d?s?d +?d?l?d?u?l?d?s?l +?d?l?d?u?l?d?s?u +?d?l?d?u?l?d?s?s +?d?l?d?u?l?l?d?s +?d?l?d?u?l?l?l?s +?d?l?d?u?l?l?u?s +?d?l?d?u?l?l?s?d +?d?l?d?u?l?l?s?l +?d?l?d?u?l?l?s?u +?d?l?d?u?l?l?s?s +?d?l?d?u?l?u?d?s +?d?l?d?u?l?u?l?s +?d?l?d?u?l?u?u?s +?d?l?d?u?l?u?s?d +?d?l?d?u?l?u?s?l +?d?l?d?u?l?u?s?u +?d?l?d?u?l?u?s?s +?d?l?d?u?l?s?d?d +?d?l?d?u?l?s?d?l +?d?l?d?u?l?s?d?u +?d?l?d?u?l?s?d?s +?d?l?d?u?l?s?l?d +?d?l?d?u?l?s?l?l +?d?l?d?u?l?s?l?u +?d?l?d?u?l?s?l?s +?d?l?d?u?l?s?u?d +?d?l?d?u?l?s?u?l +?d?l?d?u?l?s?u?u +?d?l?d?u?l?s?u?s +?d?l?d?u?l?s?s?d +?d?l?d?u?l?s?s?l +?d?l?d?u?l?s?s?u +?d?l?d?u?l?s?s?s +?d?l?d?u?u?d?d?s +?d?l?d?u?u?d?l?s +?d?l?d?u?u?d?u?s +?d?l?d?u?u?d?s?d +?d?l?d?u?u?d?s?l +?d?l?d?u?u?d?s?u +?d?l?d?u?u?d?s?s +?d?l?d?u?u?l?d?s +?d?l?d?u?u?l?l?s +?d?l?d?u?u?l?u?s +?d?l?d?u?u?l?s?d +?d?l?d?u?u?l?s?l +?d?l?d?u?u?l?s?u +?d?l?d?u?u?l?s?s +?d?l?d?u?u?u?d?s +?d?l?d?u?u?u?l?s +?d?l?d?u?u?u?u?s +?d?l?d?u?u?u?s?d +?d?l?d?u?u?u?s?l +?d?l?d?u?u?u?s?u +?d?l?d?u?u?u?s?s +?d?l?d?u?u?s?d?d +?d?l?d?u?u?s?d?l +?d?l?d?u?u?s?d?u +?d?l?d?u?u?s?d?s +?d?l?d?u?u?s?l?d +?d?l?d?u?u?s?l?l +?d?l?d?u?u?s?l?u +?d?l?d?u?u?s?l?s +?d?l?d?u?u?s?u?d +?d?l?d?u?u?s?u?l +?d?l?d?u?u?s?u?u +?d?l?d?u?u?s?u?s +?d?l?d?u?u?s?s?d +?d?l?d?u?u?s?s?l +?d?l?d?u?u?s?s?u +?d?l?d?u?u?s?s?s +?d?l?d?u?s?d?d?d +?d?l?d?u?s?d?d?l +?d?l?d?u?s?d?d?u +?d?l?d?u?s?d?d?s +?d?l?d?u?s?d?l?d +?d?l?d?u?s?d?l?l +?d?l?d?u?s?d?l?u +?d?l?d?u?s?d?l?s +?d?l?d?u?s?d?u?d +?d?l?d?u?s?d?u?l +?d?l?d?u?s?d?u?u +?d?l?d?u?s?d?u?s +?d?l?d?u?s?d?s?d +?d?l?d?u?s?d?s?l +?d?l?d?u?s?d?s?u +?d?l?d?u?s?d?s?s +?d?l?d?u?s?l?d?d +?d?l?d?u?s?l?d?l +?d?l?d?u?s?l?d?u +?d?l?d?u?s?l?d?s +?d?l?d?u?s?l?l?d +?d?l?d?u?s?l?l?l +?d?l?d?u?s?l?l?u +?d?l?d?u?s?l?l?s +?d?l?d?u?s?l?u?d +?d?l?d?u?s?l?u?l +?d?l?d?u?s?l?u?u +?d?l?d?u?s?l?u?s +?d?l?d?u?s?l?s?d +?d?l?d?u?s?l?s?l +?d?l?d?u?s?l?s?u +?d?l?d?u?s?l?s?s +?d?l?d?u?s?u?d?d +?d?l?d?u?s?u?d?l +?d?l?d?u?s?u?d?u +?d?l?d?u?s?u?d?s +?d?l?d?u?s?u?l?d +?d?l?d?u?s?u?l?l +?d?l?d?u?s?u?l?u +?d?l?d?u?s?u?l?s +?d?l?d?u?s?u?u?d +?d?l?d?u?s?u?u?l +?d?l?d?u?s?u?u?u +?d?l?d?u?s?u?u?s +?d?l?d?u?s?u?s?d +?d?l?d?u?s?u?s?l +?d?l?d?u?s?u?s?u +?d?l?d?u?s?u?s?s +?d?l?d?u?s?s?d?d +?d?l?d?u?s?s?d?l +?d?l?d?u?s?s?d?u +?d?l?d?u?s?s?d?s +?d?l?d?u?s?s?l?d +?d?l?d?u?s?s?l?l +?d?l?d?u?s?s?l?u +?d?l?d?u?s?s?l?s +?d?l?d?u?s?s?u?d +?d?l?d?u?s?s?u?l +?d?l?d?u?s?s?u?u +?d?l?d?u?s?s?u?s +?d?l?d?u?s?s?s?d +?d?l?d?u?s?s?s?l +?d?l?d?u?s?s?s?u +?d?l?d?u?s?s?s?s +?d?l?d?s?d?d?d?u +?d?l?d?s?d?d?l?u +?d?l?d?s?d?d?u?d +?d?l?d?s?d?d?u?l +?d?l?d?s?d?d?u?u +?d?l?d?s?d?d?u?s +?d?l?d?s?d?d?s?u +?d?l?d?s?d?l?d?u +?d?l?d?s?d?l?l?u +?d?l?d?s?d?l?u?d +?d?l?d?s?d?l?u?l +?d?l?d?s?d?l?u?u +?d?l?d?s?d?l?u?s +?d?l?d?s?d?l?s?u +?d?l?d?s?d?u?d?d +?d?l?d?s?d?u?d?l +?d?l?d?s?d?u?d?u +?d?l?d?s?d?u?d?s +?d?l?d?s?d?u?l?d +?d?l?d?s?d?u?l?l +?d?l?d?s?d?u?l?u +?d?l?d?s?d?u?l?s +?d?l?d?s?d?u?u?d +?d?l?d?s?d?u?u?l +?d?l?d?s?d?u?u?u +?d?l?d?s?d?u?u?s +?d?l?d?s?d?u?s?d +?d?l?d?s?d?u?s?l +?d?l?d?s?d?u?s?u +?d?l?d?s?d?u?s?s +?d?l?d?s?d?s?d?u +?d?l?d?s?d?s?l?u +?d?l?d?s?d?s?u?d +?d?l?d?s?d?s?u?l +?d?l?d?s?d?s?u?u +?d?l?d?s?d?s?u?s +?d?l?d?s?d?s?s?u +?d?l?d?s?l?d?d?u +?d?l?d?s?l?d?l?u +?d?l?d?s?l?d?u?d +?d?l?d?s?l?d?u?l +?d?l?d?s?l?d?u?u +?d?l?d?s?l?d?u?s +?d?l?d?s?l?d?s?u +?d?l?d?s?l?l?d?u +?d?l?d?s?l?l?l?u +?d?l?d?s?l?l?u?d +?d?l?d?s?l?l?u?l +?d?l?d?s?l?l?u?u +?d?l?d?s?l?l?u?s +?d?l?d?s?l?l?s?u +?d?l?d?s?l?u?d?d +?d?l?d?s?l?u?d?l +?d?l?d?s?l?u?d?u +?d?l?d?s?l?u?d?s +?d?l?d?s?l?u?l?d +?d?l?d?s?l?u?l?l +?d?l?d?s?l?u?l?u +?d?l?d?s?l?u?l?s +?d?l?d?s?l?u?u?d +?d?l?d?s?l?u?u?l +?d?l?d?s?l?u?u?u +?d?l?d?s?l?u?u?s +?d?l?d?s?l?u?s?d +?d?l?d?s?l?u?s?l +?d?l?d?s?l?u?s?u +?d?l?d?s?l?u?s?s +?d?l?d?s?l?s?d?u +?d?l?d?s?l?s?l?u +?d?l?d?s?l?s?u?d +?d?l?d?s?l?s?u?l +?d?l?d?s?l?s?u?u +?d?l?d?s?l?s?u?s +?d?l?d?s?l?s?s?u +?d?l?d?s?u?d?d?d +?d?l?d?s?u?d?d?l +?d?l?d?s?u?d?d?u +?d?l?d?s?u?d?d?s +?d?l?d?s?u?d?l?d +?d?l?d?s?u?d?l?l +?d?l?d?s?u?d?l?u +?d?l?d?s?u?d?l?s +?d?l?d?s?u?d?u?d +?d?l?d?s?u?d?u?l +?d?l?d?s?u?d?u?u +?d?l?d?s?u?d?u?s +?d?l?d?s?u?d?s?d +?d?l?d?s?u?d?s?l +?d?l?d?s?u?d?s?u +?d?l?d?s?u?d?s?s +?d?l?d?s?u?l?d?d +?d?l?d?s?u?l?d?l +?d?l?d?s?u?l?d?u +?d?l?d?s?u?l?d?s +?d?l?d?s?u?l?l?d +?d?l?d?s?u?l?l?l +?d?l?d?s?u?l?l?u +?d?l?d?s?u?l?l?s +?d?l?d?s?u?l?u?d +?d?l?d?s?u?l?u?l +?d?l?d?s?u?l?u?u +?d?l?d?s?u?l?u?s +?d?l?d?s?u?l?s?d +?d?l?d?s?u?l?s?l +?d?l?d?s?u?l?s?u +?d?l?d?s?u?l?s?s +?d?l?d?s?u?u?d?d +?d?l?d?s?u?u?d?l +?d?l?d?s?u?u?d?u +?d?l?d?s?u?u?d?s +?d?l?d?s?u?u?l?d +?d?l?d?s?u?u?l?l +?d?l?d?s?u?u?l?u +?d?l?d?s?u?u?l?s +?d?l?d?s?u?u?u?d +?d?l?d?s?u?u?u?l +?d?l?d?s?u?u?u?u +?d?l?d?s?u?u?u?s +?d?l?d?s?u?u?s?d +?d?l?d?s?u?u?s?l +?d?l?d?s?u?u?s?u +?d?l?d?s?u?u?s?s +?d?l?d?s?u?s?d?d +?d?l?d?s?u?s?d?l +?d?l?d?s?u?s?d?u +?d?l?d?s?u?s?d?s +?d?l?d?s?u?s?l?d +?d?l?d?s?u?s?l?l +?d?l?d?s?u?s?l?u +?d?l?d?s?u?s?l?s +?d?l?d?s?u?s?u?d +?d?l?d?s?u?s?u?l +?d?l?d?s?u?s?u?u +?d?l?d?s?u?s?u?s +?d?l?d?s?u?s?s?d +?d?l?d?s?u?s?s?l +?d?l?d?s?u?s?s?u +?d?l?d?s?u?s?s?s +?d?l?d?s?s?d?d?u +?d?l?d?s?s?d?l?u +?d?l?d?s?s?d?u?d +?d?l?d?s?s?d?u?l +?d?l?d?s?s?d?u?u +?d?l?d?s?s?d?u?s +?d?l?d?s?s?d?s?u +?d?l?d?s?s?l?d?u +?d?l?d?s?s?l?l?u +?d?l?d?s?s?l?u?d +?d?l?d?s?s?l?u?l +?d?l?d?s?s?l?u?u +?d?l?d?s?s?l?u?s +?d?l?d?s?s?l?s?u +?d?l?d?s?s?u?d?d +?d?l?d?s?s?u?d?l +?d?l?d?s?s?u?d?u +?d?l?d?s?s?u?d?s +?d?l?d?s?s?u?l?d +?d?l?d?s?s?u?l?l +?d?l?d?s?s?u?l?u +?d?l?d?s?s?u?l?s +?d?l?d?s?s?u?u?d +?d?l?d?s?s?u?u?l +?d?l?d?s?s?u?u?u +?d?l?d?s?s?u?u?s +?d?l?d?s?s?u?s?d +?d?l?d?s?s?u?s?l +?d?l?d?s?s?u?s?u +?d?l?d?s?s?u?s?s +?d?l?d?s?s?s?d?u +?d?l?d?s?s?s?l?u +?d?l?d?s?s?s?u?d +?d?l?d?s?s?s?u?l +?d?l?d?s?s?s?u?u +?d?l?d?s?s?s?u?s +?d?l?d?s?s?s?s?u +?d?l?l?d?d?d?u?s +?d?l?l?d?d?d?s?u +?d?l?l?d?d?l?u?s +?d?l?l?d?d?l?s?u +?d?l?l?d?d?u?d?s +?d?l?l?d?d?u?l?s +?d?l?l?d?d?u?u?s +?d?l?l?d?d?u?s?d +?d?l?l?d?d?u?s?l +?d?l?l?d?d?u?s?u +?d?l?l?d?d?u?s?s +?d?l?l?d?d?s?d?u +?d?l?l?d?d?s?l?u +?d?l?l?d?d?s?u?d +?d?l?l?d?d?s?u?l +?d?l?l?d?d?s?u?u +?d?l?l?d?d?s?u?s +?d?l?l?d?d?s?s?u +?d?l?l?d?l?d?u?s +?d?l?l?d?l?d?s?u +?d?l?l?d?l?l?u?s +?d?l?l?d?l?l?s?u +?d?l?l?d?l?u?d?s +?d?l?l?d?l?u?l?s +?d?l?l?d?l?u?u?s +?d?l?l?d?l?u?s?d +?d?l?l?d?l?u?s?l +?d?l?l?d?l?u?s?u +?d?l?l?d?l?u?s?s +?d?l?l?d?l?s?d?u +?d?l?l?d?l?s?l?u +?d?l?l?d?l?s?u?d +?d?l?l?d?l?s?u?l +?d?l?l?d?l?s?u?u +?d?l?l?d?l?s?u?s +?d?l?l?d?l?s?s?u +?d?l?l?d?u?d?d?s +?d?l?l?d?u?d?l?s +?d?l?l?d?u?d?u?s +?d?l?l?d?u?d?s?d +?d?l?l?d?u?d?s?l +?d?l?l?d?u?d?s?u +?d?l?l?d?u?d?s?s +?d?l?l?d?u?l?d?s +?d?l?l?d?u?l?l?s +?d?l?l?d?u?l?u?s +?d?l?l?d?u?l?s?d +?d?l?l?d?u?l?s?l +?d?l?l?d?u?l?s?u +?d?l?l?d?u?l?s?s +?d?l?l?d?u?u?d?s +?d?l?l?d?u?u?l?s +?d?l?l?d?u?u?u?s +?d?l?l?d?u?u?s?d +?d?l?l?d?u?u?s?l +?d?l?l?d?u?u?s?u +?d?l?l?d?u?u?s?s +?d?l?l?d?u?s?d?d +?d?l?l?d?u?s?d?l +?d?l?l?d?u?s?d?u +?d?l?l?d?u?s?d?s +?d?l?l?d?u?s?l?d +?d?l?l?d?u?s?l?l +?d?l?l?d?u?s?l?u +?d?l?l?d?u?s?l?s +?d?l?l?d?u?s?u?d +?d?l?l?d?u?s?u?l +?d?l?l?d?u?s?u?u +?d?l?l?d?u?s?u?s +?d?l?l?d?u?s?s?d +?d?l?l?d?u?s?s?l +?d?l?l?d?u?s?s?u +?d?l?l?d?u?s?s?s +?d?l?l?d?s?d?d?u +?d?l?l?d?s?d?l?u +?d?l?l?d?s?d?u?d +?d?l?l?d?s?d?u?l +?d?l?l?d?s?d?u?u +?d?l?l?d?s?d?u?s +?d?l?l?d?s?d?s?u +?d?l?l?d?s?l?d?u +?d?l?l?d?s?l?l?u +?d?l?l?d?s?l?u?d +?d?l?l?d?s?l?u?l +?d?l?l?d?s?l?u?u +?d?l?l?d?s?l?u?s +?d?l?l?d?s?l?s?u +?d?l?l?d?s?u?d?d +?d?l?l?d?s?u?d?l +?d?l?l?d?s?u?d?u +?d?l?l?d?s?u?d?s +?d?l?l?d?s?u?l?d +?d?l?l?d?s?u?l?l +?d?l?l?d?s?u?l?u +?d?l?l?d?s?u?l?s +?d?l?l?d?s?u?u?d +?d?l?l?d?s?u?u?l +?d?l?l?d?s?u?u?u +?d?l?l?d?s?u?u?s +?d?l?l?d?s?u?s?d +?d?l?l?d?s?u?s?l +?d?l?l?d?s?u?s?u +?d?l?l?d?s?u?s?s +?d?l?l?d?s?s?d?u +?d?l?l?d?s?s?l?u +?d?l?l?d?s?s?u?d +?d?l?l?d?s?s?u?l +?d?l?l?d?s?s?u?u +?d?l?l?d?s?s?u?s +?d?l?l?d?s?s?s?u +?d?l?l?l?d?d?u?s +?d?l?l?l?d?d?s?u +?d?l?l?l?d?l?u?s +?d?l?l?l?d?l?s?u +?d?l?l?l?d?u?d?s +?d?l?l?l?d?u?l?s +?d?l?l?l?d?u?u?s +?d?l?l?l?d?u?s?d +?d?l?l?l?d?u?s?l +?d?l?l?l?d?u?s?u +?d?l?l?l?d?u?s?s +?d?l?l?l?d?s?d?u +?d?l?l?l?d?s?l?u +?d?l?l?l?d?s?u?d +?d?l?l?l?d?s?u?l +?d?l?l?l?d?s?u?u +?d?l?l?l?d?s?u?s +?d?l?l?l?d?s?s?u +?d?l?l?l?l?d?u?s +?d?l?l?l?l?d?s?u +?d?l?l?l?l?l?u?s +?d?l?l?l?l?l?s?u +?d?l?l?l?l?u?d?s +?d?l?l?l?l?u?l?s +?d?l?l?l?l?u?u?s +?d?l?l?l?l?u?s?d +?d?l?l?l?l?u?s?l +?d?l?l?l?l?u?s?u +?d?l?l?l?l?u?s?s +?d?l?l?l?l?s?d?u +?d?l?l?l?l?s?l?u +?d?l?l?l?l?s?u?d +?d?l?l?l?l?s?u?l +?d?l?l?l?l?s?u?u +?d?l?l?l?l?s?u?s +?d?l?l?l?l?s?s?u +?d?l?l?l?u?d?d?s +?d?l?l?l?u?d?l?s +?d?l?l?l?u?d?u?s +?d?l?l?l?u?d?s?d +?d?l?l?l?u?d?s?l +?d?l?l?l?u?d?s?u +?d?l?l?l?u?d?s?s +?d?l?l?l?u?l?d?s +?d?l?l?l?u?l?l?s +?d?l?l?l?u?l?u?s +?d?l?l?l?u?l?s?d +?d?l?l?l?u?l?s?l +?d?l?l?l?u?l?s?u +?d?l?l?l?u?l?s?s +?d?l?l?l?u?u?d?s +?d?l?l?l?u?u?l?s +?d?l?l?l?u?u?u?s +?d?l?l?l?u?u?s?d +?d?l?l?l?u?u?s?l +?d?l?l?l?u?u?s?u +?d?l?l?l?u?u?s?s +?d?l?l?l?u?s?d?d +?d?l?l?l?u?s?d?l +?d?l?l?l?u?s?d?u +?d?l?l?l?u?s?d?s +?d?l?l?l?u?s?l?d +?d?l?l?l?u?s?l?l +?d?l?l?l?u?s?l?u +?d?l?l?l?u?s?l?s +?d?l?l?l?u?s?u?d +?d?l?l?l?u?s?u?l +?d?l?l?l?u?s?u?u +?d?l?l?l?u?s?u?s +?d?l?l?l?u?s?s?d +?d?l?l?l?u?s?s?l +?d?l?l?l?u?s?s?u +?d?l?l?l?u?s?s?s +?d?l?l?l?s?d?d?u +?d?l?l?l?s?d?l?u +?d?l?l?l?s?d?u?d +?d?l?l?l?s?d?u?l +?d?l?l?l?s?d?u?u +?d?l?l?l?s?d?u?s +?d?l?l?l?s?d?s?u +?d?l?l?l?s?l?d?u +?d?l?l?l?s?l?l?u +?d?l?l?l?s?l?u?d +?d?l?l?l?s?l?u?l +?d?l?l?l?s?l?u?u +?d?l?l?l?s?l?u?s +?d?l?l?l?s?l?s?u +?d?l?l?l?s?u?d?d +?d?l?l?l?s?u?d?l +?d?l?l?l?s?u?d?u +?d?l?l?l?s?u?d?s +?d?l?l?l?s?u?l?d +?d?l?l?l?s?u?l?l +?d?l?l?l?s?u?l?u +?d?l?l?l?s?u?l?s +?d?l?l?l?s?u?u?d +?d?l?l?l?s?u?u?l +?d?l?l?l?s?u?u?u +?d?l?l?l?s?u?u?s +?d?l?l?l?s?u?s?d +?d?l?l?l?s?u?s?l +?d?l?l?l?s?u?s?u +?d?l?l?l?s?u?s?s +?d?l?l?l?s?s?d?u +?d?l?l?l?s?s?l?u +?d?l?l?l?s?s?u?d +?d?l?l?l?s?s?u?l +?d?l?l?l?s?s?u?u +?d?l?l?l?s?s?u?s +?d?l?l?l?s?s?s?u +?d?l?l?u?d?d?d?s +?d?l?l?u?d?d?l?s +?d?l?l?u?d?d?u?s +?d?l?l?u?d?d?s?d +?d?l?l?u?d?d?s?l +?d?l?l?u?d?d?s?u +?d?l?l?u?d?d?s?s +?d?l?l?u?d?l?d?s +?d?l?l?u?d?l?l?s +?d?l?l?u?d?l?u?s +?d?l?l?u?d?l?s?d +?d?l?l?u?d?l?s?l +?d?l?l?u?d?l?s?u +?d?l?l?u?d?l?s?s +?d?l?l?u?d?u?d?s +?d?l?l?u?d?u?l?s +?d?l?l?u?d?u?u?s +?d?l?l?u?d?u?s?d +?d?l?l?u?d?u?s?l +?d?l?l?u?d?u?s?u +?d?l?l?u?d?u?s?s +?d?l?l?u?d?s?d?d +?d?l?l?u?d?s?d?l +?d?l?l?u?d?s?d?u +?d?l?l?u?d?s?d?s +?d?l?l?u?d?s?l?d +?d?l?l?u?d?s?l?l +?d?l?l?u?d?s?l?u +?d?l?l?u?d?s?l?s +?d?l?l?u?d?s?u?d +?d?l?l?u?d?s?u?l +?d?l?l?u?d?s?u?u +?d?l?l?u?d?s?u?s +?d?l?l?u?d?s?s?d +?d?l?l?u?d?s?s?l +?d?l?l?u?d?s?s?u +?d?l?l?u?d?s?s?s +?d?l?l?u?l?d?d?s +?d?l?l?u?l?d?l?s +?d?l?l?u?l?d?u?s +?d?l?l?u?l?d?s?d +?d?l?l?u?l?d?s?l +?d?l?l?u?l?d?s?u +?d?l?l?u?l?d?s?s +?d?l?l?u?l?l?d?s +?d?l?l?u?l?l?l?s +?d?l?l?u?l?l?u?s +?d?l?l?u?l?l?s?d +?d?l?l?u?l?l?s?l +?d?l?l?u?l?l?s?u +?d?l?l?u?l?l?s?s +?d?l?l?u?l?u?d?s +?d?l?l?u?l?u?l?s +?d?l?l?u?l?u?u?s +?d?l?l?u?l?u?s?d +?d?l?l?u?l?u?s?l +?d?l?l?u?l?u?s?u +?d?l?l?u?l?u?s?s +?d?l?l?u?l?s?d?d +?d?l?l?u?l?s?d?l +?d?l?l?u?l?s?d?u +?d?l?l?u?l?s?d?s +?d?l?l?u?l?s?l?d +?d?l?l?u?l?s?l?l +?d?l?l?u?l?s?l?u +?d?l?l?u?l?s?l?s +?d?l?l?u?l?s?u?d +?d?l?l?u?l?s?u?l +?d?l?l?u?l?s?u?u +?d?l?l?u?l?s?u?s +?d?l?l?u?l?s?s?d +?d?l?l?u?l?s?s?l +?d?l?l?u?l?s?s?u +?d?l?l?u?l?s?s?s +?d?l?l?u?u?d?d?s +?d?l?l?u?u?d?l?s +?d?l?l?u?u?d?u?s +?d?l?l?u?u?d?s?d +?d?l?l?u?u?d?s?l +?d?l?l?u?u?d?s?u +?d?l?l?u?u?d?s?s +?d?l?l?u?u?l?d?s +?d?l?l?u?u?l?l?s +?d?l?l?u?u?l?u?s +?d?l?l?u?u?l?s?d +?d?l?l?u?u?l?s?l +?d?l?l?u?u?l?s?u +?d?l?l?u?u?l?s?s +?d?l?l?u?u?u?d?s +?d?l?l?u?u?u?l?s +?d?l?l?u?u?u?u?s +?d?l?l?u?u?u?s?d +?d?l?l?u?u?u?s?l +?d?l?l?u?u?u?s?u +?d?l?l?u?u?u?s?s +?d?l?l?u?u?s?d?d +?d?l?l?u?u?s?d?l +?d?l?l?u?u?s?d?u +?d?l?l?u?u?s?d?s +?d?l?l?u?u?s?l?d +?d?l?l?u?u?s?l?l +?d?l?l?u?u?s?l?u +?d?l?l?u?u?s?l?s +?d?l?l?u?u?s?u?d +?d?l?l?u?u?s?u?l +?d?l?l?u?u?s?u?u +?d?l?l?u?u?s?u?s +?d?l?l?u?u?s?s?d +?d?l?l?u?u?s?s?l +?d?l?l?u?u?s?s?u +?d?l?l?u?u?s?s?s +?d?l?l?u?s?d?d?d +?d?l?l?u?s?d?d?l +?d?l?l?u?s?d?d?u +?d?l?l?u?s?d?d?s +?d?l?l?u?s?d?l?d +?d?l?l?u?s?d?l?l +?d?l?l?u?s?d?l?u +?d?l?l?u?s?d?l?s +?d?l?l?u?s?d?u?d +?d?l?l?u?s?d?u?l +?d?l?l?u?s?d?u?u +?d?l?l?u?s?d?u?s +?d?l?l?u?s?d?s?d +?d?l?l?u?s?d?s?l +?d?l?l?u?s?d?s?u +?d?l?l?u?s?d?s?s +?d?l?l?u?s?l?d?d +?d?l?l?u?s?l?d?l +?d?l?l?u?s?l?d?u +?d?l?l?u?s?l?d?s +?d?l?l?u?s?l?l?d +?d?l?l?u?s?l?l?l +?d?l?l?u?s?l?l?u +?d?l?l?u?s?l?l?s +?d?l?l?u?s?l?u?d +?d?l?l?u?s?l?u?l +?d?l?l?u?s?l?u?u +?d?l?l?u?s?l?u?s +?d?l?l?u?s?l?s?d +?d?l?l?u?s?l?s?l +?d?l?l?u?s?l?s?u +?d?l?l?u?s?l?s?s +?d?l?l?u?s?u?d?d +?d?l?l?u?s?u?d?l +?d?l?l?u?s?u?d?u +?d?l?l?u?s?u?d?s +?d?l?l?u?s?u?l?d +?d?l?l?u?s?u?l?l +?d?l?l?u?s?u?l?u +?d?l?l?u?s?u?l?s +?d?l?l?u?s?u?u?d +?d?l?l?u?s?u?u?l +?d?l?l?u?s?u?u?u +?d?l?l?u?s?u?u?s +?d?l?l?u?s?u?s?d +?d?l?l?u?s?u?s?l +?d?l?l?u?s?u?s?u +?d?l?l?u?s?u?s?s +?d?l?l?u?s?s?d?d +?d?l?l?u?s?s?d?l +?d?l?l?u?s?s?d?u +?d?l?l?u?s?s?d?s +?d?l?l?u?s?s?l?d +?d?l?l?u?s?s?l?l +?d?l?l?u?s?s?l?u +?d?l?l?u?s?s?l?s +?d?l?l?u?s?s?u?d +?d?l?l?u?s?s?u?l +?d?l?l?u?s?s?u?u +?d?l?l?u?s?s?u?s +?d?l?l?u?s?s?s?d +?d?l?l?u?s?s?s?l +?d?l?l?u?s?s?s?u +?d?l?l?u?s?s?s?s +?d?l?l?s?d?d?d?u +?d?l?l?s?d?d?l?u +?d?l?l?s?d?d?u?d +?d?l?l?s?d?d?u?l +?d?l?l?s?d?d?u?u +?d?l?l?s?d?d?u?s +?d?l?l?s?d?d?s?u +?d?l?l?s?d?l?d?u +?d?l?l?s?d?l?l?u +?d?l?l?s?d?l?u?d +?d?l?l?s?d?l?u?l +?d?l?l?s?d?l?u?u +?d?l?l?s?d?l?u?s +?d?l?l?s?d?l?s?u +?d?l?l?s?d?u?d?d +?d?l?l?s?d?u?d?l +?d?l?l?s?d?u?d?u +?d?l?l?s?d?u?d?s +?d?l?l?s?d?u?l?d +?d?l?l?s?d?u?l?l +?d?l?l?s?d?u?l?u +?d?l?l?s?d?u?l?s +?d?l?l?s?d?u?u?d +?d?l?l?s?d?u?u?l +?d?l?l?s?d?u?u?u +?d?l?l?s?d?u?u?s +?d?l?l?s?d?u?s?d +?d?l?l?s?d?u?s?l +?d?l?l?s?d?u?s?u +?d?l?l?s?d?u?s?s +?d?l?l?s?d?s?d?u +?d?l?l?s?d?s?l?u +?d?l?l?s?d?s?u?d +?d?l?l?s?d?s?u?l +?d?l?l?s?d?s?u?u +?d?l?l?s?d?s?u?s +?d?l?l?s?d?s?s?u +?d?l?l?s?l?d?d?u +?d?l?l?s?l?d?l?u +?d?l?l?s?l?d?u?d +?d?l?l?s?l?d?u?l +?d?l?l?s?l?d?u?u +?d?l?l?s?l?d?u?s +?d?l?l?s?l?d?s?u +?d?l?l?s?l?l?d?u +?d?l?l?s?l?l?l?u +?d?l?l?s?l?l?u?d +?d?l?l?s?l?l?u?l +?d?l?l?s?l?l?u?u +?d?l?l?s?l?l?u?s +?d?l?l?s?l?l?s?u +?d?l?l?s?l?u?d?d +?d?l?l?s?l?u?d?l +?d?l?l?s?l?u?d?u +?d?l?l?s?l?u?d?s +?d?l?l?s?l?u?l?d +?d?l?l?s?l?u?l?l +?d?l?l?s?l?u?l?u +?d?l?l?s?l?u?l?s +?d?l?l?s?l?u?u?d +?d?l?l?s?l?u?u?l +?d?l?l?s?l?u?u?u +?d?l?l?s?l?u?u?s +?d?l?l?s?l?u?s?d +?d?l?l?s?l?u?s?l +?d?l?l?s?l?u?s?u +?d?l?l?s?l?u?s?s +?d?l?l?s?l?s?d?u +?d?l?l?s?l?s?l?u +?d?l?l?s?l?s?u?d +?d?l?l?s?l?s?u?l +?d?l?l?s?l?s?u?u +?d?l?l?s?l?s?u?s +?d?l?l?s?l?s?s?u +?d?l?l?s?u?d?d?d +?d?l?l?s?u?d?d?l +?d?l?l?s?u?d?d?u +?d?l?l?s?u?d?d?s +?d?l?l?s?u?d?l?d +?d?l?l?s?u?d?l?l +?d?l?l?s?u?d?l?u +?d?l?l?s?u?d?l?s +?d?l?l?s?u?d?u?d +?d?l?l?s?u?d?u?l +?d?l?l?s?u?d?u?u +?d?l?l?s?u?d?u?s +?d?l?l?s?u?d?s?d +?d?l?l?s?u?d?s?l +?d?l?l?s?u?d?s?u +?d?l?l?s?u?d?s?s +?d?l?l?s?u?l?d?d +?d?l?l?s?u?l?d?l +?d?l?l?s?u?l?d?u +?d?l?l?s?u?l?d?s +?d?l?l?s?u?l?l?d +?d?l?l?s?u?l?l?l +?d?l?l?s?u?l?l?u +?d?l?l?s?u?l?l?s +?d?l?l?s?u?l?u?d +?d?l?l?s?u?l?u?l +?d?l?l?s?u?l?u?u +?d?l?l?s?u?l?u?s +?d?l?l?s?u?l?s?d +?d?l?l?s?u?l?s?l +?d?l?l?s?u?l?s?u +?d?l?l?s?u?l?s?s +?d?l?l?s?u?u?d?d +?d?l?l?s?u?u?d?l +?d?l?l?s?u?u?d?u +?d?l?l?s?u?u?d?s +?d?l?l?s?u?u?l?d +?d?l?l?s?u?u?l?l +?d?l?l?s?u?u?l?u +?d?l?l?s?u?u?l?s +?d?l?l?s?u?u?u?d +?d?l?l?s?u?u?u?l +?d?l?l?s?u?u?u?u +?d?l?l?s?u?u?u?s +?d?l?l?s?u?u?s?d +?d?l?l?s?u?u?s?l +?d?l?l?s?u?u?s?u +?d?l?l?s?u?u?s?s +?d?l?l?s?u?s?d?d +?d?l?l?s?u?s?d?l +?d?l?l?s?u?s?d?u +?d?l?l?s?u?s?d?s +?d?l?l?s?u?s?l?d +?d?l?l?s?u?s?l?l +?d?l?l?s?u?s?l?u +?d?l?l?s?u?s?l?s +?d?l?l?s?u?s?u?d +?d?l?l?s?u?s?u?l +?d?l?l?s?u?s?u?u +?d?l?l?s?u?s?u?s +?d?l?l?s?u?s?s?d +?d?l?l?s?u?s?s?l +?d?l?l?s?u?s?s?u +?d?l?l?s?u?s?s?s +?d?l?l?s?s?d?d?u +?d?l?l?s?s?d?l?u +?d?l?l?s?s?d?u?d +?d?l?l?s?s?d?u?l +?d?l?l?s?s?d?u?u +?d?l?l?s?s?d?u?s +?d?l?l?s?s?d?s?u +?d?l?l?s?s?l?d?u +?d?l?l?s?s?l?l?u +?d?l?l?s?s?l?u?d +?d?l?l?s?s?l?u?l +?d?l?l?s?s?l?u?u +?d?l?l?s?s?l?u?s +?d?l?l?s?s?l?s?u +?d?l?l?s?s?u?d?d +?d?l?l?s?s?u?d?l +?d?l?l?s?s?u?d?u +?d?l?l?s?s?u?d?s +?d?l?l?s?s?u?l?d +?d?l?l?s?s?u?l?l +?d?l?l?s?s?u?l?u +?d?l?l?s?s?u?l?s +?d?l?l?s?s?u?u?d +?d?l?l?s?s?u?u?l +?d?l?l?s?s?u?u?u +?d?l?l?s?s?u?u?s +?d?l?l?s?s?u?s?d +?d?l?l?s?s?u?s?l +?d?l?l?s?s?u?s?u +?d?l?l?s?s?u?s?s +?d?l?l?s?s?s?d?u +?d?l?l?s?s?s?l?u +?d?l?l?s?s?s?u?d +?d?l?l?s?s?s?u?l +?d?l?l?s?s?s?u?u +?d?l?l?s?s?s?u?s +?d?l?l?s?s?s?s?u +?d?l?u?d?d?d?d?s +?d?l?u?d?d?d?l?s +?d?l?u?d?d?d?u?s +?d?l?u?d?d?d?s?d +?d?l?u?d?d?d?s?l +?d?l?u?d?d?d?s?u +?d?l?u?d?d?d?s?s +?d?l?u?d?d?l?d?s +?d?l?u?d?d?l?l?s +?d?l?u?d?d?l?u?s +?d?l?u?d?d?l?s?d +?d?l?u?d?d?l?s?l +?d?l?u?d?d?l?s?u +?d?l?u?d?d?l?s?s +?d?l?u?d?d?u?d?s +?d?l?u?d?d?u?l?s +?d?l?u?d?d?u?u?s +?d?l?u?d?d?u?s?d +?d?l?u?d?d?u?s?l +?d?l?u?d?d?u?s?u +?d?l?u?d?d?u?s?s +?d?l?u?d?d?s?d?d +?d?l?u?d?d?s?d?l +?d?l?u?d?d?s?d?u +?d?l?u?d?d?s?d?s +?d?l?u?d?d?s?l?d +?d?l?u?d?d?s?l?l +?d?l?u?d?d?s?l?u +?d?l?u?d?d?s?l?s +?d?l?u?d?d?s?u?d +?d?l?u?d?d?s?u?l +?d?l?u?d?d?s?u?u +?d?l?u?d?d?s?u?s +?d?l?u?d?d?s?s?d +?d?l?u?d?d?s?s?l +?d?l?u?d?d?s?s?u +?d?l?u?d?d?s?s?s +?d?l?u?d?l?d?d?s +?d?l?u?d?l?d?l?s +?d?l?u?d?l?d?u?s +?d?l?u?d?l?d?s?d +?d?l?u?d?l?d?s?l +?d?l?u?d?l?d?s?u +?d?l?u?d?l?d?s?s +?d?l?u?d?l?l?d?s +?d?l?u?d?l?l?l?s +?d?l?u?d?l?l?u?s +?d?l?u?d?l?l?s?d +?d?l?u?d?l?l?s?l +?d?l?u?d?l?l?s?u +?d?l?u?d?l?l?s?s +?d?l?u?d?l?u?d?s +?d?l?u?d?l?u?l?s +?d?l?u?d?l?u?u?s +?d?l?u?d?l?u?s?d +?d?l?u?d?l?u?s?l +?d?l?u?d?l?u?s?u +?d?l?u?d?l?u?s?s +?d?l?u?d?l?s?d?d +?d?l?u?d?l?s?d?l +?d?l?u?d?l?s?d?u +?d?l?u?d?l?s?d?s +?d?l?u?d?l?s?l?d +?d?l?u?d?l?s?l?l +?d?l?u?d?l?s?l?u +?d?l?u?d?l?s?l?s +?d?l?u?d?l?s?u?d +?d?l?u?d?l?s?u?l +?d?l?u?d?l?s?u?u +?d?l?u?d?l?s?u?s +?d?l?u?d?l?s?s?d +?d?l?u?d?l?s?s?l +?d?l?u?d?l?s?s?u +?d?l?u?d?l?s?s?s +?d?l?u?d?u?d?d?s +?d?l?u?d?u?d?l?s +?d?l?u?d?u?d?u?s +?d?l?u?d?u?d?s?d +?d?l?u?d?u?d?s?l +?d?l?u?d?u?d?s?u +?d?l?u?d?u?d?s?s +?d?l?u?d?u?l?d?s +?d?l?u?d?u?l?l?s +?d?l?u?d?u?l?u?s +?d?l?u?d?u?l?s?d +?d?l?u?d?u?l?s?l +?d?l?u?d?u?l?s?u +?d?l?u?d?u?l?s?s +?d?l?u?d?u?u?d?s +?d?l?u?d?u?u?l?s +?d?l?u?d?u?u?u?s +?d?l?u?d?u?u?s?d +?d?l?u?d?u?u?s?l +?d?l?u?d?u?u?s?u +?d?l?u?d?u?u?s?s +?d?l?u?d?u?s?d?d +?d?l?u?d?u?s?d?l +?d?l?u?d?u?s?d?u +?d?l?u?d?u?s?d?s +?d?l?u?d?u?s?l?d +?d?l?u?d?u?s?l?l +?d?l?u?d?u?s?l?u +?d?l?u?d?u?s?l?s +?d?l?u?d?u?s?u?d +?d?l?u?d?u?s?u?l +?d?l?u?d?u?s?u?u +?d?l?u?d?u?s?u?s +?d?l?u?d?u?s?s?d +?d?l?u?d?u?s?s?l +?d?l?u?d?u?s?s?u +?d?l?u?d?u?s?s?s +?d?l?u?d?s?d?d?d +?d?l?u?d?s?d?d?l +?d?l?u?d?s?d?d?u +?d?l?u?d?s?d?d?s +?d?l?u?d?s?d?l?d +?d?l?u?d?s?d?l?l +?d?l?u?d?s?d?l?u +?d?l?u?d?s?d?l?s +?d?l?u?d?s?d?u?d +?d?l?u?d?s?d?u?l +?d?l?u?d?s?d?u?u +?d?l?u?d?s?d?u?s +?d?l?u?d?s?d?s?d +?d?l?u?d?s?d?s?l +?d?l?u?d?s?d?s?u +?d?l?u?d?s?d?s?s +?d?l?u?d?s?l?d?d +?d?l?u?d?s?l?d?l +?d?l?u?d?s?l?d?u +?d?l?u?d?s?l?d?s +?d?l?u?d?s?l?l?d +?d?l?u?d?s?l?l?l +?d?l?u?d?s?l?l?u +?d?l?u?d?s?l?l?s +?d?l?u?d?s?l?u?d +?d?l?u?d?s?l?u?l +?d?l?u?d?s?l?u?u +?d?l?u?d?s?l?u?s +?d?l?u?d?s?l?s?d +?d?l?u?d?s?l?s?l +?d?l?u?d?s?l?s?u +?d?l?u?d?s?l?s?s +?d?l?u?d?s?u?d?d +?d?l?u?d?s?u?d?l +?d?l?u?d?s?u?d?u +?d?l?u?d?s?u?d?s +?d?l?u?d?s?u?l?d +?d?l?u?d?s?u?l?l +?d?l?u?d?s?u?l?u +?d?l?u?d?s?u?l?s +?d?l?u?d?s?u?u?d +?d?l?u?d?s?u?u?l +?d?l?u?d?s?u?u?u +?d?l?u?d?s?u?u?s +?d?l?u?d?s?u?s?d +?d?l?u?d?s?u?s?l +?d?l?u?d?s?u?s?u +?d?l?u?d?s?u?s?s +?d?l?u?d?s?s?d?d +?d?l?u?d?s?s?d?l +?d?l?u?d?s?s?d?u +?d?l?u?d?s?s?d?s +?d?l?u?d?s?s?l?d +?d?l?u?d?s?s?l?l +?d?l?u?d?s?s?l?u +?d?l?u?d?s?s?l?s +?d?l?u?d?s?s?u?d +?d?l?u?d?s?s?u?l +?d?l?u?d?s?s?u?u +?d?l?u?d?s?s?u?s +?d?l?u?d?s?s?s?d +?d?l?u?d?s?s?s?l +?d?l?u?d?s?s?s?u +?d?l?u?d?s?s?s?s +?d?l?u?l?d?d?d?s +?d?l?u?l?d?d?l?s +?d?l?u?l?d?d?u?s +?d?l?u?l?d?d?s?d +?d?l?u?l?d?d?s?l +?d?l?u?l?d?d?s?u +?d?l?u?l?d?d?s?s +?d?l?u?l?d?l?d?s +?d?l?u?l?d?l?l?s +?d?l?u?l?d?l?u?s +?d?l?u?l?d?l?s?d +?d?l?u?l?d?l?s?l +?d?l?u?l?d?l?s?u +?d?l?u?l?d?l?s?s +?d?l?u?l?d?u?d?s +?d?l?u?l?d?u?l?s +?d?l?u?l?d?u?u?s +?d?l?u?l?d?u?s?d +?d?l?u?l?d?u?s?l +?d?l?u?l?d?u?s?u +?d?l?u?l?d?u?s?s +?d?l?u?l?d?s?d?d +?d?l?u?l?d?s?d?l +?d?l?u?l?d?s?d?u +?d?l?u?l?d?s?d?s +?d?l?u?l?d?s?l?d +?d?l?u?l?d?s?l?l +?d?l?u?l?d?s?l?u +?d?l?u?l?d?s?l?s +?d?l?u?l?d?s?u?d +?d?l?u?l?d?s?u?l +?d?l?u?l?d?s?u?u +?d?l?u?l?d?s?u?s +?d?l?u?l?d?s?s?d +?d?l?u?l?d?s?s?l +?d?l?u?l?d?s?s?u +?d?l?u?l?d?s?s?s +?d?l?u?l?l?d?d?s +?d?l?u?l?l?d?l?s +?d?l?u?l?l?d?u?s +?d?l?u?l?l?d?s?d +?d?l?u?l?l?d?s?l +?d?l?u?l?l?d?s?u +?d?l?u?l?l?d?s?s +?d?l?u?l?l?l?d?s +?d?l?u?l?l?l?l?s +?d?l?u?l?l?l?u?s +?d?l?u?l?l?l?s?d +?d?l?u?l?l?l?s?l +?d?l?u?l?l?l?s?u +?d?l?u?l?l?l?s?s +?d?l?u?l?l?u?d?s +?d?l?u?l?l?u?l?s +?d?l?u?l?l?u?u?s +?d?l?u?l?l?u?s?d +?d?l?u?l?l?u?s?l +?d?l?u?l?l?u?s?u +?d?l?u?l?l?u?s?s +?d?l?u?l?l?s?d?d +?d?l?u?l?l?s?d?l +?d?l?u?l?l?s?d?u +?d?l?u?l?l?s?d?s +?d?l?u?l?l?s?l?d +?d?l?u?l?l?s?l?l +?d?l?u?l?l?s?l?u +?d?l?u?l?l?s?l?s +?d?l?u?l?l?s?u?d +?d?l?u?l?l?s?u?l +?d?l?u?l?l?s?u?u +?d?l?u?l?l?s?u?s +?d?l?u?l?l?s?s?d +?d?l?u?l?l?s?s?l +?d?l?u?l?l?s?s?u +?d?l?u?l?l?s?s?s +?d?l?u?l?u?d?d?s +?d?l?u?l?u?d?l?s +?d?l?u?l?u?d?u?s +?d?l?u?l?u?d?s?d +?d?l?u?l?u?d?s?l +?d?l?u?l?u?d?s?u +?d?l?u?l?u?d?s?s +?d?l?u?l?u?l?d?s +?d?l?u?l?u?l?l?s +?d?l?u?l?u?l?u?s +?d?l?u?l?u?l?s?d +?d?l?u?l?u?l?s?l +?d?l?u?l?u?l?s?u +?d?l?u?l?u?l?s?s +?d?l?u?l?u?u?d?s +?d?l?u?l?u?u?l?s +?d?l?u?l?u?u?u?s +?d?l?u?l?u?u?s?d +?d?l?u?l?u?u?s?l +?d?l?u?l?u?u?s?u +?d?l?u?l?u?u?s?s +?d?l?u?l?u?s?d?d +?d?l?u?l?u?s?d?l +?d?l?u?l?u?s?d?u +?d?l?u?l?u?s?d?s +?d?l?u?l?u?s?l?d +?d?l?u?l?u?s?l?l +?d?l?u?l?u?s?l?u +?d?l?u?l?u?s?l?s +?d?l?u?l?u?s?u?d +?d?l?u?l?u?s?u?l +?d?l?u?l?u?s?u?u +?d?l?u?l?u?s?u?s +?d?l?u?l?u?s?s?d +?d?l?u?l?u?s?s?l +?d?l?u?l?u?s?s?u +?d?l?u?l?u?s?s?s +?d?l?u?l?s?d?d?d +?d?l?u?l?s?d?d?l +?d?l?u?l?s?d?d?u +?d?l?u?l?s?d?d?s +?d?l?u?l?s?d?l?d +?d?l?u?l?s?d?l?l +?d?l?u?l?s?d?l?u +?d?l?u?l?s?d?l?s +?d?l?u?l?s?d?u?d +?d?l?u?l?s?d?u?l +?d?l?u?l?s?d?u?u +?d?l?u?l?s?d?u?s +?d?l?u?l?s?d?s?d +?d?l?u?l?s?d?s?l +?d?l?u?l?s?d?s?u +?d?l?u?l?s?d?s?s +?d?l?u?l?s?l?d?d +?d?l?u?l?s?l?d?l +?d?l?u?l?s?l?d?u +?d?l?u?l?s?l?d?s +?d?l?u?l?s?l?l?d +?d?l?u?l?s?l?l?l +?d?l?u?l?s?l?l?u +?d?l?u?l?s?l?l?s +?d?l?u?l?s?l?u?d +?d?l?u?l?s?l?u?l +?d?l?u?l?s?l?u?u +?d?l?u?l?s?l?u?s +?d?l?u?l?s?l?s?d +?d?l?u?l?s?l?s?l +?d?l?u?l?s?l?s?u +?d?l?u?l?s?l?s?s +?d?l?u?l?s?u?d?d +?d?l?u?l?s?u?d?l +?d?l?u?l?s?u?d?u +?d?l?u?l?s?u?d?s +?d?l?u?l?s?u?l?d +?d?l?u?l?s?u?l?l +?d?l?u?l?s?u?l?u +?d?l?u?l?s?u?l?s +?d?l?u?l?s?u?u?d +?d?l?u?l?s?u?u?l +?d?l?u?l?s?u?u?u +?d?l?u?l?s?u?u?s +?d?l?u?l?s?u?s?d +?d?l?u?l?s?u?s?l +?d?l?u?l?s?u?s?u +?d?l?u?l?s?u?s?s +?d?l?u?l?s?s?d?d +?d?l?u?l?s?s?d?l +?d?l?u?l?s?s?d?u +?d?l?u?l?s?s?d?s +?d?l?u?l?s?s?l?d +?d?l?u?l?s?s?l?l +?d?l?u?l?s?s?l?u +?d?l?u?l?s?s?l?s +?d?l?u?l?s?s?u?d +?d?l?u?l?s?s?u?l +?d?l?u?l?s?s?u?u +?d?l?u?l?s?s?u?s +?d?l?u?l?s?s?s?d +?d?l?u?l?s?s?s?l +?d?l?u?l?s?s?s?u +?d?l?u?l?s?s?s?s +?d?l?u?u?d?d?d?s +?d?l?u?u?d?d?l?s +?d?l?u?u?d?d?u?s +?d?l?u?u?d?d?s?d +?d?l?u?u?d?d?s?l +?d?l?u?u?d?d?s?u +?d?l?u?u?d?d?s?s +?d?l?u?u?d?l?d?s +?d?l?u?u?d?l?l?s +?d?l?u?u?d?l?u?s +?d?l?u?u?d?l?s?d +?d?l?u?u?d?l?s?l +?d?l?u?u?d?l?s?u +?d?l?u?u?d?l?s?s +?d?l?u?u?d?u?d?s +?d?l?u?u?d?u?l?s +?d?l?u?u?d?u?u?s +?d?l?u?u?d?u?s?d +?d?l?u?u?d?u?s?l +?d?l?u?u?d?u?s?u +?d?l?u?u?d?u?s?s +?d?l?u?u?d?s?d?d +?d?l?u?u?d?s?d?l +?d?l?u?u?d?s?d?u +?d?l?u?u?d?s?d?s +?d?l?u?u?d?s?l?d +?d?l?u?u?d?s?l?l +?d?l?u?u?d?s?l?u +?d?l?u?u?d?s?l?s +?d?l?u?u?d?s?u?d +?d?l?u?u?d?s?u?l +?d?l?u?u?d?s?u?u +?d?l?u?u?d?s?u?s +?d?l?u?u?d?s?s?d +?d?l?u?u?d?s?s?l +?d?l?u?u?d?s?s?u +?d?l?u?u?d?s?s?s +?d?l?u?u?l?d?d?s +?d?l?u?u?l?d?l?s +?d?l?u?u?l?d?u?s +?d?l?u?u?l?d?s?d +?d?l?u?u?l?d?s?l +?d?l?u?u?l?d?s?u +?d?l?u?u?l?d?s?s +?d?l?u?u?l?l?d?s +?d?l?u?u?l?l?l?s +?d?l?u?u?l?l?u?s +?d?l?u?u?l?l?s?d +?d?l?u?u?l?l?s?l +?d?l?u?u?l?l?s?u +?d?l?u?u?l?l?s?s +?d?l?u?u?l?u?d?s +?d?l?u?u?l?u?l?s +?d?l?u?u?l?u?u?s +?d?l?u?u?l?u?s?d +?d?l?u?u?l?u?s?l +?d?l?u?u?l?u?s?u +?d?l?u?u?l?u?s?s +?d?l?u?u?l?s?d?d +?d?l?u?u?l?s?d?l +?d?l?u?u?l?s?d?u +?d?l?u?u?l?s?d?s +?d?l?u?u?l?s?l?d +?d?l?u?u?l?s?l?l +?d?l?u?u?l?s?l?u +?d?l?u?u?l?s?l?s +?d?l?u?u?l?s?u?d +?d?l?u?u?l?s?u?l +?d?l?u?u?l?s?u?u +?d?l?u?u?l?s?u?s +?d?l?u?u?l?s?s?d +?d?l?u?u?l?s?s?l +?d?l?u?u?l?s?s?u +?d?l?u?u?l?s?s?s +?d?l?u?u?u?d?d?s +?d?l?u?u?u?d?l?s +?d?l?u?u?u?d?u?s +?d?l?u?u?u?d?s?d +?d?l?u?u?u?d?s?l +?d?l?u?u?u?d?s?u +?d?l?u?u?u?d?s?s +?d?l?u?u?u?l?d?s +?d?l?u?u?u?l?l?s +?d?l?u?u?u?l?u?s +?d?l?u?u?u?l?s?d +?d?l?u?u?u?l?s?l +?d?l?u?u?u?l?s?u +?d?l?u?u?u?l?s?s +?d?l?u?u?u?u?d?s +?d?l?u?u?u?u?l?s +?d?l?u?u?u?u?u?s +?d?l?u?u?u?u?s?d +?d?l?u?u?u?u?s?l +?d?l?u?u?u?u?s?u +?d?l?u?u?u?u?s?s +?d?l?u?u?u?s?d?d +?d?l?u?u?u?s?d?l +?d?l?u?u?u?s?d?u +?d?l?u?u?u?s?d?s +?d?l?u?u?u?s?l?d +?d?l?u?u?u?s?l?l +?d?l?u?u?u?s?l?u +?d?l?u?u?u?s?l?s +?d?l?u?u?u?s?u?d +?d?l?u?u?u?s?u?l +?d?l?u?u?u?s?u?u +?d?l?u?u?u?s?u?s +?d?l?u?u?u?s?s?d +?d?l?u?u?u?s?s?l +?d?l?u?u?u?s?s?u +?d?l?u?u?u?s?s?s +?d?l?u?u?s?d?d?d +?d?l?u?u?s?d?d?l +?d?l?u?u?s?d?d?u +?d?l?u?u?s?d?d?s +?d?l?u?u?s?d?l?d +?d?l?u?u?s?d?l?l +?d?l?u?u?s?d?l?u +?d?l?u?u?s?d?l?s +?d?l?u?u?s?d?u?d +?d?l?u?u?s?d?u?l +?d?l?u?u?s?d?u?u +?d?l?u?u?s?d?u?s +?d?l?u?u?s?d?s?d +?d?l?u?u?s?d?s?l +?d?l?u?u?s?d?s?u +?d?l?u?u?s?d?s?s +?d?l?u?u?s?l?d?d +?d?l?u?u?s?l?d?l +?d?l?u?u?s?l?d?u +?d?l?u?u?s?l?d?s +?d?l?u?u?s?l?l?d +?d?l?u?u?s?l?l?l +?d?l?u?u?s?l?l?u +?d?l?u?u?s?l?l?s +?d?l?u?u?s?l?u?d +?d?l?u?u?s?l?u?l +?d?l?u?u?s?l?u?u +?d?l?u?u?s?l?u?s +?d?l?u?u?s?l?s?d +?d?l?u?u?s?l?s?l +?d?l?u?u?s?l?s?u +?d?l?u?u?s?l?s?s +?d?l?u?u?s?u?d?d +?d?l?u?u?s?u?d?l +?d?l?u?u?s?u?d?u +?d?l?u?u?s?u?d?s +?d?l?u?u?s?u?l?d +?d?l?u?u?s?u?l?l +?d?l?u?u?s?u?l?u +?d?l?u?u?s?u?l?s +?d?l?u?u?s?u?u?d +?d?l?u?u?s?u?u?l +?d?l?u?u?s?u?u?u +?d?l?u?u?s?u?u?s +?d?l?u?u?s?u?s?d +?d?l?u?u?s?u?s?l +?d?l?u?u?s?u?s?u +?d?l?u?u?s?u?s?s +?d?l?u?u?s?s?d?d +?d?l?u?u?s?s?d?l +?d?l?u?u?s?s?d?u +?d?l?u?u?s?s?d?s +?d?l?u?u?s?s?l?d +?d?l?u?u?s?s?l?l +?d?l?u?u?s?s?l?u +?d?l?u?u?s?s?l?s +?d?l?u?u?s?s?u?d +?d?l?u?u?s?s?u?l +?d?l?u?u?s?s?u?u +?d?l?u?u?s?s?u?s +?d?l?u?u?s?s?s?d +?d?l?u?u?s?s?s?l +?d?l?u?u?s?s?s?u +?d?l?u?u?s?s?s?s +?d?l?u?s?d?d?d?d +?d?l?u?s?d?d?d?l +?d?l?u?s?d?d?d?u +?d?l?u?s?d?d?d?s +?d?l?u?s?d?d?l?d +?d?l?u?s?d?d?l?l +?d?l?u?s?d?d?l?u +?d?l?u?s?d?d?l?s +?d?l?u?s?d?d?u?d +?d?l?u?s?d?d?u?l +?d?l?u?s?d?d?u?u +?d?l?u?s?d?d?u?s +?d?l?u?s?d?d?s?d +?d?l?u?s?d?d?s?l +?d?l?u?s?d?d?s?u +?d?l?u?s?d?d?s?s +?d?l?u?s?d?l?d?d +?d?l?u?s?d?l?d?l +?d?l?u?s?d?l?d?u +?d?l?u?s?d?l?d?s +?d?l?u?s?d?l?l?d +?d?l?u?s?d?l?l?l +?d?l?u?s?d?l?l?u +?d?l?u?s?d?l?l?s +?d?l?u?s?d?l?u?d +?d?l?u?s?d?l?u?l +?d?l?u?s?d?l?u?u +?d?l?u?s?d?l?u?s +?d?l?u?s?d?l?s?d +?d?l?u?s?d?l?s?l +?d?l?u?s?d?l?s?u +?d?l?u?s?d?l?s?s +?d?l?u?s?d?u?d?d +?d?l?u?s?d?u?d?l +?d?l?u?s?d?u?d?u +?d?l?u?s?d?u?d?s +?d?l?u?s?d?u?l?d +?d?l?u?s?d?u?l?l +?d?l?u?s?d?u?l?u +?d?l?u?s?d?u?l?s +?d?l?u?s?d?u?u?d +?d?l?u?s?d?u?u?l +?d?l?u?s?d?u?u?u +?d?l?u?s?d?u?u?s +?d?l?u?s?d?u?s?d +?d?l?u?s?d?u?s?l +?d?l?u?s?d?u?s?u +?d?l?u?s?d?u?s?s +?d?l?u?s?d?s?d?d +?d?l?u?s?d?s?d?l +?d?l?u?s?d?s?d?u +?d?l?u?s?d?s?d?s +?d?l?u?s?d?s?l?d +?d?l?u?s?d?s?l?l +?d?l?u?s?d?s?l?u +?d?l?u?s?d?s?l?s +?d?l?u?s?d?s?u?d +?d?l?u?s?d?s?u?l +?d?l?u?s?d?s?u?u +?d?l?u?s?d?s?u?s +?d?l?u?s?d?s?s?d +?d?l?u?s?d?s?s?l +?d?l?u?s?d?s?s?u +?d?l?u?s?d?s?s?s +?d?l?u?s?l?d?d?d +?d?l?u?s?l?d?d?l +?d?l?u?s?l?d?d?u +?d?l?u?s?l?d?d?s +?d?l?u?s?l?d?l?d +?d?l?u?s?l?d?l?l +?d?l?u?s?l?d?l?u +?d?l?u?s?l?d?l?s +?d?l?u?s?l?d?u?d +?d?l?u?s?l?d?u?l +?d?l?u?s?l?d?u?u +?d?l?u?s?l?d?u?s +?d?l?u?s?l?d?s?d +?d?l?u?s?l?d?s?l +?d?l?u?s?l?d?s?u +?d?l?u?s?l?d?s?s +?d?l?u?s?l?l?d?d +?d?l?u?s?l?l?d?l +?d?l?u?s?l?l?d?u +?d?l?u?s?l?l?d?s +?d?l?u?s?l?l?l?d +?d?l?u?s?l?l?l?l +?d?l?u?s?l?l?l?u +?d?l?u?s?l?l?l?s +?d?l?u?s?l?l?u?d +?d?l?u?s?l?l?u?l +?d?l?u?s?l?l?u?u +?d?l?u?s?l?l?u?s +?d?l?u?s?l?l?s?d +?d?l?u?s?l?l?s?l +?d?l?u?s?l?l?s?u +?d?l?u?s?l?l?s?s +?d?l?u?s?l?u?d?d +?d?l?u?s?l?u?d?l +?d?l?u?s?l?u?d?u +?d?l?u?s?l?u?d?s +?d?l?u?s?l?u?l?d +?d?l?u?s?l?u?l?l +?d?l?u?s?l?u?l?u +?d?l?u?s?l?u?l?s +?d?l?u?s?l?u?u?d +?d?l?u?s?l?u?u?l +?d?l?u?s?l?u?u?u +?d?l?u?s?l?u?u?s +?d?l?u?s?l?u?s?d +?d?l?u?s?l?u?s?l +?d?l?u?s?l?u?s?u +?d?l?u?s?l?u?s?s +?d?l?u?s?l?s?d?d +?d?l?u?s?l?s?d?l +?d?l?u?s?l?s?d?u +?d?l?u?s?l?s?d?s +?d?l?u?s?l?s?l?d +?d?l?u?s?l?s?l?l +?d?l?u?s?l?s?l?u +?d?l?u?s?l?s?l?s +?d?l?u?s?l?s?u?d +?d?l?u?s?l?s?u?l +?d?l?u?s?l?s?u?u +?d?l?u?s?l?s?u?s +?d?l?u?s?l?s?s?d +?d?l?u?s?l?s?s?l +?d?l?u?s?l?s?s?u +?d?l?u?s?l?s?s?s +?d?l?u?s?u?d?d?d +?d?l?u?s?u?d?d?l +?d?l?u?s?u?d?d?u +?d?l?u?s?u?d?d?s +?d?l?u?s?u?d?l?d +?d?l?u?s?u?d?l?l +?d?l?u?s?u?d?l?u +?d?l?u?s?u?d?l?s +?d?l?u?s?u?d?u?d +?d?l?u?s?u?d?u?l +?d?l?u?s?u?d?u?u +?d?l?u?s?u?d?u?s +?d?l?u?s?u?d?s?d +?d?l?u?s?u?d?s?l +?d?l?u?s?u?d?s?u +?d?l?u?s?u?d?s?s +?d?l?u?s?u?l?d?d +?d?l?u?s?u?l?d?l +?d?l?u?s?u?l?d?u +?d?l?u?s?u?l?d?s +?d?l?u?s?u?l?l?d +?d?l?u?s?u?l?l?l +?d?l?u?s?u?l?l?u +?d?l?u?s?u?l?l?s +?d?l?u?s?u?l?u?d +?d?l?u?s?u?l?u?l +?d?l?u?s?u?l?u?u +?d?l?u?s?u?l?u?s +?d?l?u?s?u?l?s?d +?d?l?u?s?u?l?s?l +?d?l?u?s?u?l?s?u +?d?l?u?s?u?l?s?s +?d?l?u?s?u?u?d?d +?d?l?u?s?u?u?d?l +?d?l?u?s?u?u?d?u +?d?l?u?s?u?u?d?s +?d?l?u?s?u?u?l?d +?d?l?u?s?u?u?l?l +?d?l?u?s?u?u?l?u +?d?l?u?s?u?u?l?s +?d?l?u?s?u?u?u?d +?d?l?u?s?u?u?u?l +?d?l?u?s?u?u?u?u +?d?l?u?s?u?u?u?s +?d?l?u?s?u?u?s?d +?d?l?u?s?u?u?s?l +?d?l?u?s?u?u?s?u +?d?l?u?s?u?u?s?s +?d?l?u?s?u?s?d?d +?d?l?u?s?u?s?d?l +?d?l?u?s?u?s?d?u +?d?l?u?s?u?s?d?s +?d?l?u?s?u?s?l?d +?d?l?u?s?u?s?l?l +?d?l?u?s?u?s?l?u +?d?l?u?s?u?s?l?s +?d?l?u?s?u?s?u?d +?d?l?u?s?u?s?u?l +?d?l?u?s?u?s?u?u +?d?l?u?s?u?s?u?s +?d?l?u?s?u?s?s?d +?d?l?u?s?u?s?s?l +?d?l?u?s?u?s?s?u +?d?l?u?s?u?s?s?s +?d?l?u?s?s?d?d?d +?d?l?u?s?s?d?d?l +?d?l?u?s?s?d?d?u +?d?l?u?s?s?d?d?s +?d?l?u?s?s?d?l?d +?d?l?u?s?s?d?l?l +?d?l?u?s?s?d?l?u +?d?l?u?s?s?d?l?s +?d?l?u?s?s?d?u?d +?d?l?u?s?s?d?u?l +?d?l?u?s?s?d?u?u +?d?l?u?s?s?d?u?s +?d?l?u?s?s?d?s?d +?d?l?u?s?s?d?s?l +?d?l?u?s?s?d?s?u +?d?l?u?s?s?d?s?s +?d?l?u?s?s?l?d?d +?d?l?u?s?s?l?d?l +?d?l?u?s?s?l?d?u +?d?l?u?s?s?l?d?s +?d?l?u?s?s?l?l?d +?d?l?u?s?s?l?l?l +?d?l?u?s?s?l?l?u +?d?l?u?s?s?l?l?s +?d?l?u?s?s?l?u?d +?d?l?u?s?s?l?u?l +?d?l?u?s?s?l?u?u +?d?l?u?s?s?l?u?s +?d?l?u?s?s?l?s?d +?d?l?u?s?s?l?s?l +?d?l?u?s?s?l?s?u +?d?l?u?s?s?l?s?s +?d?l?u?s?s?u?d?d +?d?l?u?s?s?u?d?l +?d?l?u?s?s?u?d?u +?d?l?u?s?s?u?d?s +?d?l?u?s?s?u?l?d +?d?l?u?s?s?u?l?l +?d?l?u?s?s?u?l?u +?d?l?u?s?s?u?l?s +?d?l?u?s?s?u?u?d +?d?l?u?s?s?u?u?l +?d?l?u?s?s?u?u?u +?d?l?u?s?s?u?u?s +?d?l?u?s?s?u?s?d +?d?l?u?s?s?u?s?l +?d?l?u?s?s?u?s?u +?d?l?u?s?s?u?s?s +?d?l?u?s?s?s?d?d +?d?l?u?s?s?s?d?l +?d?l?u?s?s?s?d?u +?d?l?u?s?s?s?d?s +?d?l?u?s?s?s?l?d +?d?l?u?s?s?s?l?l +?d?l?u?s?s?s?l?u +?d?l?u?s?s?s?l?s +?d?l?u?s?s?s?u?d +?d?l?u?s?s?s?u?l +?d?l?u?s?s?s?u?u +?d?l?u?s?s?s?u?s +?d?l?u?s?s?s?s?d +?d?l?u?s?s?s?s?l +?d?l?u?s?s?s?s?u +?d?l?u?s?s?s?s?s +?d?l?s?d?d?d?d?u +?d?l?s?d?d?d?l?u +?d?l?s?d?d?d?u?d +?d?l?s?d?d?d?u?l +?d?l?s?d?d?d?u?u +?d?l?s?d?d?d?u?s +?d?l?s?d?d?d?s?u +?d?l?s?d?d?l?d?u +?d?l?s?d?d?l?l?u +?d?l?s?d?d?l?u?d +?d?l?s?d?d?l?u?l +?d?l?s?d?d?l?u?u +?d?l?s?d?d?l?u?s +?d?l?s?d?d?l?s?u +?d?l?s?d?d?u?d?d +?d?l?s?d?d?u?d?l +?d?l?s?d?d?u?d?u +?d?l?s?d?d?u?d?s +?d?l?s?d?d?u?l?d +?d?l?s?d?d?u?l?l +?d?l?s?d?d?u?l?u +?d?l?s?d?d?u?l?s +?d?l?s?d?d?u?u?d +?d?l?s?d?d?u?u?l +?d?l?s?d?d?u?u?u +?d?l?s?d?d?u?u?s +?d?l?s?d?d?u?s?d +?d?l?s?d?d?u?s?l +?d?l?s?d?d?u?s?u +?d?l?s?d?d?u?s?s +?d?l?s?d?d?s?d?u +?d?l?s?d?d?s?l?u +?d?l?s?d?d?s?u?d +?d?l?s?d?d?s?u?l +?d?l?s?d?d?s?u?u +?d?l?s?d?d?s?u?s +?d?l?s?d?d?s?s?u +?d?l?s?d?l?d?d?u +?d?l?s?d?l?d?l?u +?d?l?s?d?l?d?u?d +?d?l?s?d?l?d?u?l +?d?l?s?d?l?d?u?u +?d?l?s?d?l?d?u?s +?d?l?s?d?l?d?s?u +?d?l?s?d?l?l?d?u +?d?l?s?d?l?l?l?u +?d?l?s?d?l?l?u?d +?d?l?s?d?l?l?u?l +?d?l?s?d?l?l?u?u +?d?l?s?d?l?l?u?s +?d?l?s?d?l?l?s?u +?d?l?s?d?l?u?d?d +?d?l?s?d?l?u?d?l +?d?l?s?d?l?u?d?u +?d?l?s?d?l?u?d?s +?d?l?s?d?l?u?l?d +?d?l?s?d?l?u?l?l +?d?l?s?d?l?u?l?u +?d?l?s?d?l?u?l?s +?d?l?s?d?l?u?u?d +?d?l?s?d?l?u?u?l +?d?l?s?d?l?u?u?u +?d?l?s?d?l?u?u?s +?d?l?s?d?l?u?s?d +?d?l?s?d?l?u?s?l +?d?l?s?d?l?u?s?u +?d?l?s?d?l?u?s?s +?d?l?s?d?l?s?d?u +?d?l?s?d?l?s?l?u +?d?l?s?d?l?s?u?d +?d?l?s?d?l?s?u?l +?d?l?s?d?l?s?u?u +?d?l?s?d?l?s?u?s +?d?l?s?d?l?s?s?u +?d?l?s?d?u?d?d?d +?d?l?s?d?u?d?d?l +?d?l?s?d?u?d?d?u +?d?l?s?d?u?d?d?s +?d?l?s?d?u?d?l?d +?d?l?s?d?u?d?l?l +?d?l?s?d?u?d?l?u +?d?l?s?d?u?d?l?s +?d?l?s?d?u?d?u?d +?d?l?s?d?u?d?u?l +?d?l?s?d?u?d?u?u +?d?l?s?d?u?d?u?s +?d?l?s?d?u?d?s?d +?d?l?s?d?u?d?s?l +?d?l?s?d?u?d?s?u +?d?l?s?d?u?d?s?s +?d?l?s?d?u?l?d?d +?d?l?s?d?u?l?d?l +?d?l?s?d?u?l?d?u +?d?l?s?d?u?l?d?s +?d?l?s?d?u?l?l?d +?d?l?s?d?u?l?l?l +?d?l?s?d?u?l?l?u +?d?l?s?d?u?l?l?s +?d?l?s?d?u?l?u?d +?d?l?s?d?u?l?u?l +?d?l?s?d?u?l?u?u +?d?l?s?d?u?l?u?s +?d?l?s?d?u?l?s?d +?d?l?s?d?u?l?s?l +?d?l?s?d?u?l?s?u +?d?l?s?d?u?l?s?s +?d?l?s?d?u?u?d?d +?d?l?s?d?u?u?d?l +?d?l?s?d?u?u?d?u +?d?l?s?d?u?u?d?s +?d?l?s?d?u?u?l?d +?d?l?s?d?u?u?l?l +?d?l?s?d?u?u?l?u +?d?l?s?d?u?u?l?s +?d?l?s?d?u?u?u?d +?d?l?s?d?u?u?u?l +?d?l?s?d?u?u?u?u +?d?l?s?d?u?u?u?s +?d?l?s?d?u?u?s?d +?d?l?s?d?u?u?s?l +?d?l?s?d?u?u?s?u +?d?l?s?d?u?u?s?s +?d?l?s?d?u?s?d?d +?d?l?s?d?u?s?d?l +?d?l?s?d?u?s?d?u +?d?l?s?d?u?s?d?s +?d?l?s?d?u?s?l?d +?d?l?s?d?u?s?l?l +?d?l?s?d?u?s?l?u +?d?l?s?d?u?s?l?s +?d?l?s?d?u?s?u?d +?d?l?s?d?u?s?u?l +?d?l?s?d?u?s?u?u +?d?l?s?d?u?s?u?s +?d?l?s?d?u?s?s?d +?d?l?s?d?u?s?s?l +?d?l?s?d?u?s?s?u +?d?l?s?d?u?s?s?s +?d?l?s?d?s?d?d?u +?d?l?s?d?s?d?l?u +?d?l?s?d?s?d?u?d +?d?l?s?d?s?d?u?l +?d?l?s?d?s?d?u?u +?d?l?s?d?s?d?u?s +?d?l?s?d?s?d?s?u +?d?l?s?d?s?l?d?u +?d?l?s?d?s?l?l?u +?d?l?s?d?s?l?u?d +?d?l?s?d?s?l?u?l +?d?l?s?d?s?l?u?u +?d?l?s?d?s?l?u?s +?d?l?s?d?s?l?s?u +?d?l?s?d?s?u?d?d +?d?l?s?d?s?u?d?l +?d?l?s?d?s?u?d?u +?d?l?s?d?s?u?d?s +?d?l?s?d?s?u?l?d +?d?l?s?d?s?u?l?l +?d?l?s?d?s?u?l?u +?d?l?s?d?s?u?l?s +?d?l?s?d?s?u?u?d +?d?l?s?d?s?u?u?l +?d?l?s?d?s?u?u?u +?d?l?s?d?s?u?u?s +?d?l?s?d?s?u?s?d +?d?l?s?d?s?u?s?l +?d?l?s?d?s?u?s?u +?d?l?s?d?s?u?s?s +?d?l?s?d?s?s?d?u +?d?l?s?d?s?s?l?u +?d?l?s?d?s?s?u?d +?d?l?s?d?s?s?u?l +?d?l?s?d?s?s?u?u +?d?l?s?d?s?s?u?s +?d?l?s?d?s?s?s?u +?d?l?s?l?d?d?d?u +?d?l?s?l?d?d?l?u +?d?l?s?l?d?d?u?d +?d?l?s?l?d?d?u?l +?d?l?s?l?d?d?u?u +?d?l?s?l?d?d?u?s +?d?l?s?l?d?d?s?u +?d?l?s?l?d?l?d?u +?d?l?s?l?d?l?l?u +?d?l?s?l?d?l?u?d +?d?l?s?l?d?l?u?l +?d?l?s?l?d?l?u?u +?d?l?s?l?d?l?u?s +?d?l?s?l?d?l?s?u +?d?l?s?l?d?u?d?d +?d?l?s?l?d?u?d?l +?d?l?s?l?d?u?d?u +?d?l?s?l?d?u?d?s +?d?l?s?l?d?u?l?d +?d?l?s?l?d?u?l?l +?d?l?s?l?d?u?l?u +?d?l?s?l?d?u?l?s +?d?l?s?l?d?u?u?d +?d?l?s?l?d?u?u?l +?d?l?s?l?d?u?u?u +?d?l?s?l?d?u?u?s +?d?l?s?l?d?u?s?d +?d?l?s?l?d?u?s?l +?d?l?s?l?d?u?s?u +?d?l?s?l?d?u?s?s +?d?l?s?l?d?s?d?u +?d?l?s?l?d?s?l?u +?d?l?s?l?d?s?u?d +?d?l?s?l?d?s?u?l +?d?l?s?l?d?s?u?u +?d?l?s?l?d?s?u?s +?d?l?s?l?d?s?s?u +?d?l?s?l?l?d?d?u +?d?l?s?l?l?d?l?u +?d?l?s?l?l?d?u?d +?d?l?s?l?l?d?u?l +?d?l?s?l?l?d?u?u +?d?l?s?l?l?d?u?s +?d?l?s?l?l?d?s?u +?d?l?s?l?l?l?d?u +?d?l?s?l?l?l?l?u +?d?l?s?l?l?l?u?d +?d?l?s?l?l?l?u?l +?d?l?s?l?l?l?u?u +?d?l?s?l?l?l?u?s +?d?l?s?l?l?l?s?u +?d?l?s?l?l?u?d?d +?d?l?s?l?l?u?d?l +?d?l?s?l?l?u?d?u +?d?l?s?l?l?u?d?s +?d?l?s?l?l?u?l?d +?d?l?s?l?l?u?l?l +?d?l?s?l?l?u?l?u +?d?l?s?l?l?u?l?s +?d?l?s?l?l?u?u?d +?d?l?s?l?l?u?u?l +?d?l?s?l?l?u?u?u +?d?l?s?l?l?u?u?s +?d?l?s?l?l?u?s?d +?d?l?s?l?l?u?s?l +?d?l?s?l?l?u?s?u +?d?l?s?l?l?u?s?s +?d?l?s?l?l?s?d?u +?d?l?s?l?l?s?l?u +?d?l?s?l?l?s?u?d +?d?l?s?l?l?s?u?l +?d?l?s?l?l?s?u?u +?d?l?s?l?l?s?u?s +?d?l?s?l?l?s?s?u +?d?l?s?l?u?d?d?d +?d?l?s?l?u?d?d?l +?d?l?s?l?u?d?d?u +?d?l?s?l?u?d?d?s +?d?l?s?l?u?d?l?d +?d?l?s?l?u?d?l?l +?d?l?s?l?u?d?l?u +?d?l?s?l?u?d?l?s +?d?l?s?l?u?d?u?d +?d?l?s?l?u?d?u?l +?d?l?s?l?u?d?u?u +?d?l?s?l?u?d?u?s +?d?l?s?l?u?d?s?d +?d?l?s?l?u?d?s?l +?d?l?s?l?u?d?s?u +?d?l?s?l?u?d?s?s +?d?l?s?l?u?l?d?d +?d?l?s?l?u?l?d?l +?d?l?s?l?u?l?d?u +?d?l?s?l?u?l?d?s +?d?l?s?l?u?l?l?d +?d?l?s?l?u?l?l?l +?d?l?s?l?u?l?l?u +?d?l?s?l?u?l?l?s +?d?l?s?l?u?l?u?d +?d?l?s?l?u?l?u?l +?d?l?s?l?u?l?u?u +?d?l?s?l?u?l?u?s +?d?l?s?l?u?l?s?d +?d?l?s?l?u?l?s?l +?d?l?s?l?u?l?s?u +?d?l?s?l?u?l?s?s +?d?l?s?l?u?u?d?d +?d?l?s?l?u?u?d?l +?d?l?s?l?u?u?d?u +?d?l?s?l?u?u?d?s +?d?l?s?l?u?u?l?d +?d?l?s?l?u?u?l?l +?d?l?s?l?u?u?l?u +?d?l?s?l?u?u?l?s +?d?l?s?l?u?u?u?d +?d?l?s?l?u?u?u?l +?d?l?s?l?u?u?u?u +?d?l?s?l?u?u?u?s +?d?l?s?l?u?u?s?d +?d?l?s?l?u?u?s?l +?d?l?s?l?u?u?s?u +?d?l?s?l?u?u?s?s +?d?l?s?l?u?s?d?d +?d?l?s?l?u?s?d?l +?d?l?s?l?u?s?d?u +?d?l?s?l?u?s?d?s +?d?l?s?l?u?s?l?d +?d?l?s?l?u?s?l?l +?d?l?s?l?u?s?l?u +?d?l?s?l?u?s?l?s +?d?l?s?l?u?s?u?d +?d?l?s?l?u?s?u?l +?d?l?s?l?u?s?u?u +?d?l?s?l?u?s?u?s +?d?l?s?l?u?s?s?d +?d?l?s?l?u?s?s?l +?d?l?s?l?u?s?s?u +?d?l?s?l?u?s?s?s +?d?l?s?l?s?d?d?u +?d?l?s?l?s?d?l?u +?d?l?s?l?s?d?u?d +?d?l?s?l?s?d?u?l +?d?l?s?l?s?d?u?u +?d?l?s?l?s?d?u?s +?d?l?s?l?s?d?s?u +?d?l?s?l?s?l?d?u +?d?l?s?l?s?l?l?u +?d?l?s?l?s?l?u?d +?d?l?s?l?s?l?u?l +?d?l?s?l?s?l?u?u +?d?l?s?l?s?l?u?s +?d?l?s?l?s?l?s?u +?d?l?s?l?s?u?d?d +?d?l?s?l?s?u?d?l +?d?l?s?l?s?u?d?u +?d?l?s?l?s?u?d?s +?d?l?s?l?s?u?l?d +?d?l?s?l?s?u?l?l +?d?l?s?l?s?u?l?u +?d?l?s?l?s?u?l?s +?d?l?s?l?s?u?u?d +?d?l?s?l?s?u?u?l +?d?l?s?l?s?u?u?u +?d?l?s?l?s?u?u?s +?d?l?s?l?s?u?s?d +?d?l?s?l?s?u?s?l +?d?l?s?l?s?u?s?u +?d?l?s?l?s?u?s?s +?d?l?s?l?s?s?d?u +?d?l?s?l?s?s?l?u +?d?l?s?l?s?s?u?d +?d?l?s?l?s?s?u?l +?d?l?s?l?s?s?u?u +?d?l?s?l?s?s?u?s +?d?l?s?l?s?s?s?u +?d?l?s?u?d?d?d?d +?d?l?s?u?d?d?d?l +?d?l?s?u?d?d?d?u +?d?l?s?u?d?d?d?s +?d?l?s?u?d?d?l?d +?d?l?s?u?d?d?l?l +?d?l?s?u?d?d?l?u +?d?l?s?u?d?d?l?s +?d?l?s?u?d?d?u?d +?d?l?s?u?d?d?u?l +?d?l?s?u?d?d?u?u +?d?l?s?u?d?d?u?s +?d?l?s?u?d?d?s?d +?d?l?s?u?d?d?s?l +?d?l?s?u?d?d?s?u +?d?l?s?u?d?d?s?s +?d?l?s?u?d?l?d?d +?d?l?s?u?d?l?d?l +?d?l?s?u?d?l?d?u +?d?l?s?u?d?l?d?s +?d?l?s?u?d?l?l?d +?d?l?s?u?d?l?l?l +?d?l?s?u?d?l?l?u +?d?l?s?u?d?l?l?s +?d?l?s?u?d?l?u?d +?d?l?s?u?d?l?u?l +?d?l?s?u?d?l?u?u +?d?l?s?u?d?l?u?s +?d?l?s?u?d?l?s?d +?d?l?s?u?d?l?s?l +?d?l?s?u?d?l?s?u +?d?l?s?u?d?l?s?s +?d?l?s?u?d?u?d?d +?d?l?s?u?d?u?d?l +?d?l?s?u?d?u?d?u +?d?l?s?u?d?u?d?s +?d?l?s?u?d?u?l?d +?d?l?s?u?d?u?l?l +?d?l?s?u?d?u?l?u +?d?l?s?u?d?u?l?s +?d?l?s?u?d?u?u?d +?d?l?s?u?d?u?u?l +?d?l?s?u?d?u?u?u +?d?l?s?u?d?u?u?s +?d?l?s?u?d?u?s?d +?d?l?s?u?d?u?s?l +?d?l?s?u?d?u?s?u +?d?l?s?u?d?u?s?s +?d?l?s?u?d?s?d?d +?d?l?s?u?d?s?d?l +?d?l?s?u?d?s?d?u +?d?l?s?u?d?s?d?s +?d?l?s?u?d?s?l?d +?d?l?s?u?d?s?l?l +?d?l?s?u?d?s?l?u +?d?l?s?u?d?s?l?s +?d?l?s?u?d?s?u?d +?d?l?s?u?d?s?u?l +?d?l?s?u?d?s?u?u +?d?l?s?u?d?s?u?s +?d?l?s?u?d?s?s?d +?d?l?s?u?d?s?s?l +?d?l?s?u?d?s?s?u +?d?l?s?u?d?s?s?s +?d?l?s?u?l?d?d?d +?d?l?s?u?l?d?d?l +?d?l?s?u?l?d?d?u +?d?l?s?u?l?d?d?s +?d?l?s?u?l?d?l?d +?d?l?s?u?l?d?l?l +?d?l?s?u?l?d?l?u +?d?l?s?u?l?d?l?s +?d?l?s?u?l?d?u?d +?d?l?s?u?l?d?u?l +?d?l?s?u?l?d?u?u +?d?l?s?u?l?d?u?s +?d?l?s?u?l?d?s?d +?d?l?s?u?l?d?s?l +?d?l?s?u?l?d?s?u +?d?l?s?u?l?d?s?s +?d?l?s?u?l?l?d?d +?d?l?s?u?l?l?d?l +?d?l?s?u?l?l?d?u +?d?l?s?u?l?l?d?s +?d?l?s?u?l?l?l?d +?d?l?s?u?l?l?l?l +?d?l?s?u?l?l?l?u +?d?l?s?u?l?l?l?s +?d?l?s?u?l?l?u?d +?d?l?s?u?l?l?u?l +?d?l?s?u?l?l?u?u +?d?l?s?u?l?l?u?s +?d?l?s?u?l?l?s?d +?d?l?s?u?l?l?s?l +?d?l?s?u?l?l?s?u +?d?l?s?u?l?l?s?s +?d?l?s?u?l?u?d?d +?d?l?s?u?l?u?d?l +?d?l?s?u?l?u?d?u +?d?l?s?u?l?u?d?s +?d?l?s?u?l?u?l?d +?d?l?s?u?l?u?l?l +?d?l?s?u?l?u?l?u +?d?l?s?u?l?u?l?s +?d?l?s?u?l?u?u?d +?d?l?s?u?l?u?u?l +?d?l?s?u?l?u?u?u +?d?l?s?u?l?u?u?s +?d?l?s?u?l?u?s?d +?d?l?s?u?l?u?s?l +?d?l?s?u?l?u?s?u +?d?l?s?u?l?u?s?s +?d?l?s?u?l?s?d?d +?d?l?s?u?l?s?d?l +?d?l?s?u?l?s?d?u +?d?l?s?u?l?s?d?s +?d?l?s?u?l?s?l?d +?d?l?s?u?l?s?l?l +?d?l?s?u?l?s?l?u +?d?l?s?u?l?s?l?s +?d?l?s?u?l?s?u?d +?d?l?s?u?l?s?u?l +?d?l?s?u?l?s?u?u +?d?l?s?u?l?s?u?s +?d?l?s?u?l?s?s?d +?d?l?s?u?l?s?s?l +?d?l?s?u?l?s?s?u +?d?l?s?u?l?s?s?s +?d?l?s?u?u?d?d?d +?d?l?s?u?u?d?d?l +?d?l?s?u?u?d?d?u +?d?l?s?u?u?d?d?s +?d?l?s?u?u?d?l?d +?d?l?s?u?u?d?l?l +?d?l?s?u?u?d?l?u +?d?l?s?u?u?d?l?s +?d?l?s?u?u?d?u?d +?d?l?s?u?u?d?u?l +?d?l?s?u?u?d?u?u +?d?l?s?u?u?d?u?s +?d?l?s?u?u?d?s?d +?d?l?s?u?u?d?s?l +?d?l?s?u?u?d?s?u +?d?l?s?u?u?d?s?s +?d?l?s?u?u?l?d?d +?d?l?s?u?u?l?d?l +?d?l?s?u?u?l?d?u +?d?l?s?u?u?l?d?s +?d?l?s?u?u?l?l?d +?d?l?s?u?u?l?l?l +?d?l?s?u?u?l?l?u +?d?l?s?u?u?l?l?s +?d?l?s?u?u?l?u?d +?d?l?s?u?u?l?u?l +?d?l?s?u?u?l?u?u +?d?l?s?u?u?l?u?s +?d?l?s?u?u?l?s?d +?d?l?s?u?u?l?s?l +?d?l?s?u?u?l?s?u +?d?l?s?u?u?l?s?s +?d?l?s?u?u?u?d?d +?d?l?s?u?u?u?d?l +?d?l?s?u?u?u?d?u +?d?l?s?u?u?u?d?s +?d?l?s?u?u?u?l?d +?d?l?s?u?u?u?l?l +?d?l?s?u?u?u?l?u +?d?l?s?u?u?u?l?s +?d?l?s?u?u?u?u?d +?d?l?s?u?u?u?u?l +?d?l?s?u?u?u?u?u +?d?l?s?u?u?u?u?s +?d?l?s?u?u?u?s?d +?d?l?s?u?u?u?s?l +?d?l?s?u?u?u?s?u +?d?l?s?u?u?u?s?s +?d?l?s?u?u?s?d?d +?d?l?s?u?u?s?d?l +?d?l?s?u?u?s?d?u +?d?l?s?u?u?s?d?s +?d?l?s?u?u?s?l?d +?d?l?s?u?u?s?l?l +?d?l?s?u?u?s?l?u +?d?l?s?u?u?s?l?s +?d?l?s?u?u?s?u?d +?d?l?s?u?u?s?u?l +?d?l?s?u?u?s?u?u +?d?l?s?u?u?s?u?s +?d?l?s?u?u?s?s?d +?d?l?s?u?u?s?s?l +?d?l?s?u?u?s?s?u +?d?l?s?u?u?s?s?s +?d?l?s?u?s?d?d?d +?d?l?s?u?s?d?d?l +?d?l?s?u?s?d?d?u +?d?l?s?u?s?d?d?s +?d?l?s?u?s?d?l?d +?d?l?s?u?s?d?l?l +?d?l?s?u?s?d?l?u +?d?l?s?u?s?d?l?s +?d?l?s?u?s?d?u?d +?d?l?s?u?s?d?u?l +?d?l?s?u?s?d?u?u +?d?l?s?u?s?d?u?s +?d?l?s?u?s?d?s?d +?d?l?s?u?s?d?s?l +?d?l?s?u?s?d?s?u +?d?l?s?u?s?d?s?s +?d?l?s?u?s?l?d?d +?d?l?s?u?s?l?d?l +?d?l?s?u?s?l?d?u +?d?l?s?u?s?l?d?s +?d?l?s?u?s?l?l?d +?d?l?s?u?s?l?l?l +?d?l?s?u?s?l?l?u +?d?l?s?u?s?l?l?s +?d?l?s?u?s?l?u?d +?d?l?s?u?s?l?u?l +?d?l?s?u?s?l?u?u +?d?l?s?u?s?l?u?s +?d?l?s?u?s?l?s?d +?d?l?s?u?s?l?s?l +?d?l?s?u?s?l?s?u +?d?l?s?u?s?l?s?s +?d?l?s?u?s?u?d?d +?d?l?s?u?s?u?d?l +?d?l?s?u?s?u?d?u +?d?l?s?u?s?u?d?s +?d?l?s?u?s?u?l?d +?d?l?s?u?s?u?l?l +?d?l?s?u?s?u?l?u +?d?l?s?u?s?u?l?s +?d?l?s?u?s?u?u?d +?d?l?s?u?s?u?u?l +?d?l?s?u?s?u?u?u +?d?l?s?u?s?u?u?s +?d?l?s?u?s?u?s?d +?d?l?s?u?s?u?s?l +?d?l?s?u?s?u?s?u +?d?l?s?u?s?u?s?s +?d?l?s?u?s?s?d?d +?d?l?s?u?s?s?d?l +?d?l?s?u?s?s?d?u +?d?l?s?u?s?s?d?s +?d?l?s?u?s?s?l?d +?d?l?s?u?s?s?l?l +?d?l?s?u?s?s?l?u +?d?l?s?u?s?s?l?s +?d?l?s?u?s?s?u?d +?d?l?s?u?s?s?u?l +?d?l?s?u?s?s?u?u +?d?l?s?u?s?s?u?s +?d?l?s?u?s?s?s?d +?d?l?s?u?s?s?s?l +?d?l?s?u?s?s?s?u +?d?l?s?u?s?s?s?s +?d?l?s?s?d?d?d?u +?d?l?s?s?d?d?l?u +?d?l?s?s?d?d?u?d +?d?l?s?s?d?d?u?l +?d?l?s?s?d?d?u?u +?d?l?s?s?d?d?u?s +?d?l?s?s?d?d?s?u +?d?l?s?s?d?l?d?u +?d?l?s?s?d?l?l?u +?d?l?s?s?d?l?u?d +?d?l?s?s?d?l?u?l +?d?l?s?s?d?l?u?u +?d?l?s?s?d?l?u?s +?d?l?s?s?d?l?s?u +?d?l?s?s?d?u?d?d +?d?l?s?s?d?u?d?l +?d?l?s?s?d?u?d?u +?d?l?s?s?d?u?d?s +?d?l?s?s?d?u?l?d +?d?l?s?s?d?u?l?l +?d?l?s?s?d?u?l?u +?d?l?s?s?d?u?l?s +?d?l?s?s?d?u?u?d +?d?l?s?s?d?u?u?l +?d?l?s?s?d?u?u?u +?d?l?s?s?d?u?u?s +?d?l?s?s?d?u?s?d +?d?l?s?s?d?u?s?l +?d?l?s?s?d?u?s?u +?d?l?s?s?d?u?s?s +?d?l?s?s?d?s?d?u +?d?l?s?s?d?s?l?u +?d?l?s?s?d?s?u?d +?d?l?s?s?d?s?u?l +?d?l?s?s?d?s?u?u +?d?l?s?s?d?s?u?s +?d?l?s?s?d?s?s?u +?d?l?s?s?l?d?d?u +?d?l?s?s?l?d?l?u +?d?l?s?s?l?d?u?d +?d?l?s?s?l?d?u?l +?d?l?s?s?l?d?u?u +?d?l?s?s?l?d?u?s +?d?l?s?s?l?d?s?u +?d?l?s?s?l?l?d?u +?d?l?s?s?l?l?l?u +?d?l?s?s?l?l?u?d +?d?l?s?s?l?l?u?l +?d?l?s?s?l?l?u?u +?d?l?s?s?l?l?u?s +?d?l?s?s?l?l?s?u +?d?l?s?s?l?u?d?d +?d?l?s?s?l?u?d?l +?d?l?s?s?l?u?d?u +?d?l?s?s?l?u?d?s +?d?l?s?s?l?u?l?d +?d?l?s?s?l?u?l?l +?d?l?s?s?l?u?l?u +?d?l?s?s?l?u?l?s +?d?l?s?s?l?u?u?d +?d?l?s?s?l?u?u?l +?d?l?s?s?l?u?u?u +?d?l?s?s?l?u?u?s +?d?l?s?s?l?u?s?d +?d?l?s?s?l?u?s?l +?d?l?s?s?l?u?s?u +?d?l?s?s?l?u?s?s +?d?l?s?s?l?s?d?u +?d?l?s?s?l?s?l?u +?d?l?s?s?l?s?u?d +?d?l?s?s?l?s?u?l +?d?l?s?s?l?s?u?u +?d?l?s?s?l?s?u?s +?d?l?s?s?l?s?s?u +?d?l?s?s?u?d?d?d +?d?l?s?s?u?d?d?l +?d?l?s?s?u?d?d?u +?d?l?s?s?u?d?d?s +?d?l?s?s?u?d?l?d +?d?l?s?s?u?d?l?l +?d?l?s?s?u?d?l?u +?d?l?s?s?u?d?l?s +?d?l?s?s?u?d?u?d +?d?l?s?s?u?d?u?l +?d?l?s?s?u?d?u?u +?d?l?s?s?u?d?u?s +?d?l?s?s?u?d?s?d +?d?l?s?s?u?d?s?l +?d?l?s?s?u?d?s?u +?d?l?s?s?u?d?s?s +?d?l?s?s?u?l?d?d +?d?l?s?s?u?l?d?l +?d?l?s?s?u?l?d?u +?d?l?s?s?u?l?d?s +?d?l?s?s?u?l?l?d +?d?l?s?s?u?l?l?l +?d?l?s?s?u?l?l?u +?d?l?s?s?u?l?l?s +?d?l?s?s?u?l?u?d +?d?l?s?s?u?l?u?l +?d?l?s?s?u?l?u?u +?d?l?s?s?u?l?u?s +?d?l?s?s?u?l?s?d +?d?l?s?s?u?l?s?l +?d?l?s?s?u?l?s?u +?d?l?s?s?u?l?s?s +?d?l?s?s?u?u?d?d +?d?l?s?s?u?u?d?l +?d?l?s?s?u?u?d?u +?d?l?s?s?u?u?d?s +?d?l?s?s?u?u?l?d +?d?l?s?s?u?u?l?l +?d?l?s?s?u?u?l?u +?d?l?s?s?u?u?l?s +?d?l?s?s?u?u?u?d +?d?l?s?s?u?u?u?l +?d?l?s?s?u?u?u?u +?d?l?s?s?u?u?u?s +?d?l?s?s?u?u?s?d +?d?l?s?s?u?u?s?l +?d?l?s?s?u?u?s?u +?d?l?s?s?u?u?s?s +?d?l?s?s?u?s?d?d +?d?l?s?s?u?s?d?l +?d?l?s?s?u?s?d?u +?d?l?s?s?u?s?d?s +?d?l?s?s?u?s?l?d +?d?l?s?s?u?s?l?l +?d?l?s?s?u?s?l?u +?d?l?s?s?u?s?l?s +?d?l?s?s?u?s?u?d +?d?l?s?s?u?s?u?l +?d?l?s?s?u?s?u?u +?d?l?s?s?u?s?u?s +?d?l?s?s?u?s?s?d +?d?l?s?s?u?s?s?l +?d?l?s?s?u?s?s?u +?d?l?s?s?u?s?s?s +?d?l?s?s?s?d?d?u +?d?l?s?s?s?d?l?u +?d?l?s?s?s?d?u?d +?d?l?s?s?s?d?u?l +?d?l?s?s?s?d?u?u +?d?l?s?s?s?d?u?s +?d?l?s?s?s?d?s?u +?d?l?s?s?s?l?d?u +?d?l?s?s?s?l?l?u +?d?l?s?s?s?l?u?d +?d?l?s?s?s?l?u?l +?d?l?s?s?s?l?u?u +?d?l?s?s?s?l?u?s +?d?l?s?s?s?l?s?u +?d?l?s?s?s?u?d?d +?d?l?s?s?s?u?d?l +?d?l?s?s?s?u?d?u +?d?l?s?s?s?u?d?s +?d?l?s?s?s?u?l?d +?d?l?s?s?s?u?l?l +?d?l?s?s?s?u?l?u +?d?l?s?s?s?u?l?s +?d?l?s?s?s?u?u?d +?d?l?s?s?s?u?u?l +?d?l?s?s?s?u?u?u +?d?l?s?s?s?u?u?s +?d?l?s?s?s?u?s?d +?d?l?s?s?s?u?s?l +?d?l?s?s?s?u?s?u +?d?l?s?s?s?u?s?s +?d?l?s?s?s?s?d?u +?d?l?s?s?s?s?l?u +?d?l?s?s?s?s?u?d +?d?l?s?s?s?s?u?l +?d?l?s?s?s?s?u?u +?d?l?s?s?s?s?u?s +?d?l?s?s?s?s?s?u +?d?u?d?d?d?d?l?s +?d?u?d?d?d?d?s?l +?d?u?d?d?d?l?d?s +?d?u?d?d?d?l?l?s +?d?u?d?d?d?l?u?s +?d?u?d?d?d?l?s?d +?d?u?d?d?d?l?s?l +?d?u?d?d?d?l?s?u +?d?u?d?d?d?l?s?s +?d?u?d?d?d?u?l?s +?d?u?d?d?d?u?s?l +?d?u?d?d?d?s?d?l +?d?u?d?d?d?s?l?d +?d?u?d?d?d?s?l?l +?d?u?d?d?d?s?l?u +?d?u?d?d?d?s?l?s +?d?u?d?d?d?s?u?l +?d?u?d?d?d?s?s?l +?d?u?d?d?l?d?d?s +?d?u?d?d?l?d?l?s +?d?u?d?d?l?d?u?s +?d?u?d?d?l?d?s?d +?d?u?d?d?l?d?s?l +?d?u?d?d?l?d?s?u +?d?u?d?d?l?d?s?s +?d?u?d?d?l?l?d?s +?d?u?d?d?l?l?l?s +?d?u?d?d?l?l?u?s +?d?u?d?d?l?l?s?d +?d?u?d?d?l?l?s?l +?d?u?d?d?l?l?s?u +?d?u?d?d?l?l?s?s +?d?u?d?d?l?u?d?s +?d?u?d?d?l?u?l?s +?d?u?d?d?l?u?u?s +?d?u?d?d?l?u?s?d +?d?u?d?d?l?u?s?l +?d?u?d?d?l?u?s?u +?d?u?d?d?l?u?s?s +?d?u?d?d?l?s?d?d +?d?u?d?d?l?s?d?l +?d?u?d?d?l?s?d?u +?d?u?d?d?l?s?d?s +?d?u?d?d?l?s?l?d +?d?u?d?d?l?s?l?l +?d?u?d?d?l?s?l?u +?d?u?d?d?l?s?l?s +?d?u?d?d?l?s?u?d +?d?u?d?d?l?s?u?l +?d?u?d?d?l?s?u?u +?d?u?d?d?l?s?u?s +?d?u?d?d?l?s?s?d +?d?u?d?d?l?s?s?l +?d?u?d?d?l?s?s?u +?d?u?d?d?l?s?s?s +?d?u?d?d?u?d?l?s +?d?u?d?d?u?d?s?l +?d?u?d?d?u?l?d?s +?d?u?d?d?u?l?l?s +?d?u?d?d?u?l?u?s +?d?u?d?d?u?l?s?d +?d?u?d?d?u?l?s?l +?d?u?d?d?u?l?s?u +?d?u?d?d?u?l?s?s +?d?u?d?d?u?u?l?s +?d?u?d?d?u?u?s?l +?d?u?d?d?u?s?d?l +?d?u?d?d?u?s?l?d +?d?u?d?d?u?s?l?l +?d?u?d?d?u?s?l?u +?d?u?d?d?u?s?l?s +?d?u?d?d?u?s?u?l +?d?u?d?d?u?s?s?l +?d?u?d?d?s?d?d?l +?d?u?d?d?s?d?l?d +?d?u?d?d?s?d?l?l +?d?u?d?d?s?d?l?u +?d?u?d?d?s?d?l?s +?d?u?d?d?s?d?u?l +?d?u?d?d?s?d?s?l +?d?u?d?d?s?l?d?d +?d?u?d?d?s?l?d?l +?d?u?d?d?s?l?d?u +?d?u?d?d?s?l?d?s +?d?u?d?d?s?l?l?d +?d?u?d?d?s?l?l?l +?d?u?d?d?s?l?l?u +?d?u?d?d?s?l?l?s +?d?u?d?d?s?l?u?d +?d?u?d?d?s?l?u?l +?d?u?d?d?s?l?u?u +?d?u?d?d?s?l?u?s +?d?u?d?d?s?l?s?d +?d?u?d?d?s?l?s?l +?d?u?d?d?s?l?s?u +?d?u?d?d?s?l?s?s +?d?u?d?d?s?u?d?l +?d?u?d?d?s?u?l?d +?d?u?d?d?s?u?l?l +?d?u?d?d?s?u?l?u +?d?u?d?d?s?u?l?s +?d?u?d?d?s?u?u?l +?d?u?d?d?s?u?s?l +?d?u?d?d?s?s?d?l +?d?u?d?d?s?s?l?d +?d?u?d?d?s?s?l?l +?d?u?d?d?s?s?l?u +?d?u?d?d?s?s?l?s +?d?u?d?d?s?s?u?l +?d?u?d?d?s?s?s?l +?d?u?d?l?d?d?d?s +?d?u?d?l?d?d?l?s +?d?u?d?l?d?d?u?s +?d?u?d?l?d?d?s?d +?d?u?d?l?d?d?s?l +?d?u?d?l?d?d?s?u +?d?u?d?l?d?d?s?s +?d?u?d?l?d?l?d?s +?d?u?d?l?d?l?l?s +?d?u?d?l?d?l?u?s +?d?u?d?l?d?l?s?d +?d?u?d?l?d?l?s?l +?d?u?d?l?d?l?s?u +?d?u?d?l?d?l?s?s +?d?u?d?l?d?u?d?s +?d?u?d?l?d?u?l?s +?d?u?d?l?d?u?u?s +?d?u?d?l?d?u?s?d +?d?u?d?l?d?u?s?l +?d?u?d?l?d?u?s?u +?d?u?d?l?d?u?s?s +?d?u?d?l?d?s?d?d +?d?u?d?l?d?s?d?l +?d?u?d?l?d?s?d?u +?d?u?d?l?d?s?d?s +?d?u?d?l?d?s?l?d +?d?u?d?l?d?s?l?l +?d?u?d?l?d?s?l?u +?d?u?d?l?d?s?l?s +?d?u?d?l?d?s?u?d +?d?u?d?l?d?s?u?l +?d?u?d?l?d?s?u?u +?d?u?d?l?d?s?u?s +?d?u?d?l?d?s?s?d +?d?u?d?l?d?s?s?l +?d?u?d?l?d?s?s?u +?d?u?d?l?d?s?s?s +?d?u?d?l?l?d?d?s +?d?u?d?l?l?d?l?s +?d?u?d?l?l?d?u?s +?d?u?d?l?l?d?s?d +?d?u?d?l?l?d?s?l +?d?u?d?l?l?d?s?u +?d?u?d?l?l?d?s?s +?d?u?d?l?l?l?d?s +?d?u?d?l?l?l?l?s +?d?u?d?l?l?l?u?s +?d?u?d?l?l?l?s?d +?d?u?d?l?l?l?s?l +?d?u?d?l?l?l?s?u +?d?u?d?l?l?l?s?s +?d?u?d?l?l?u?d?s +?d?u?d?l?l?u?l?s +?d?u?d?l?l?u?u?s +?d?u?d?l?l?u?s?d +?d?u?d?l?l?u?s?l +?d?u?d?l?l?u?s?u +?d?u?d?l?l?u?s?s +?d?u?d?l?l?s?d?d +?d?u?d?l?l?s?d?l +?d?u?d?l?l?s?d?u +?d?u?d?l?l?s?d?s +?d?u?d?l?l?s?l?d +?d?u?d?l?l?s?l?l +?d?u?d?l?l?s?l?u +?d?u?d?l?l?s?l?s +?d?u?d?l?l?s?u?d +?d?u?d?l?l?s?u?l +?d?u?d?l?l?s?u?u +?d?u?d?l?l?s?u?s +?d?u?d?l?l?s?s?d +?d?u?d?l?l?s?s?l +?d?u?d?l?l?s?s?u +?d?u?d?l?l?s?s?s +?d?u?d?l?u?d?d?s +?d?u?d?l?u?d?l?s +?d?u?d?l?u?d?u?s +?d?u?d?l?u?d?s?d +?d?u?d?l?u?d?s?l +?d?u?d?l?u?d?s?u +?d?u?d?l?u?d?s?s +?d?u?d?l?u?l?d?s +?d?u?d?l?u?l?l?s +?d?u?d?l?u?l?u?s +?d?u?d?l?u?l?s?d +?d?u?d?l?u?l?s?l +?d?u?d?l?u?l?s?u +?d?u?d?l?u?l?s?s +?d?u?d?l?u?u?d?s +?d?u?d?l?u?u?l?s +?d?u?d?l?u?u?u?s +?d?u?d?l?u?u?s?d +?d?u?d?l?u?u?s?l +?d?u?d?l?u?u?s?u +?d?u?d?l?u?u?s?s +?d?u?d?l?u?s?d?d +?d?u?d?l?u?s?d?l +?d?u?d?l?u?s?d?u +?d?u?d?l?u?s?d?s +?d?u?d?l?u?s?l?d +?d?u?d?l?u?s?l?l +?d?u?d?l?u?s?l?u +?d?u?d?l?u?s?l?s +?d?u?d?l?u?s?u?d +?d?u?d?l?u?s?u?l +?d?u?d?l?u?s?u?u +?d?u?d?l?u?s?u?s +?d?u?d?l?u?s?s?d +?d?u?d?l?u?s?s?l +?d?u?d?l?u?s?s?u +?d?u?d?l?u?s?s?s +?d?u?d?l?s?d?d?d +?d?u?d?l?s?d?d?l +?d?u?d?l?s?d?d?u +?d?u?d?l?s?d?d?s +?d?u?d?l?s?d?l?d +?d?u?d?l?s?d?l?l +?d?u?d?l?s?d?l?u +?d?u?d?l?s?d?l?s +?d?u?d?l?s?d?u?d +?d?u?d?l?s?d?u?l +?d?u?d?l?s?d?u?u +?d?u?d?l?s?d?u?s +?d?u?d?l?s?d?s?d +?d?u?d?l?s?d?s?l +?d?u?d?l?s?d?s?u +?d?u?d?l?s?d?s?s +?d?u?d?l?s?l?d?d +?d?u?d?l?s?l?d?l +?d?u?d?l?s?l?d?u +?d?u?d?l?s?l?d?s +?d?u?d?l?s?l?l?d +?d?u?d?l?s?l?l?l +?d?u?d?l?s?l?l?u +?d?u?d?l?s?l?l?s +?d?u?d?l?s?l?u?d +?d?u?d?l?s?l?u?l +?d?u?d?l?s?l?u?u +?d?u?d?l?s?l?u?s +?d?u?d?l?s?l?s?d +?d?u?d?l?s?l?s?l +?d?u?d?l?s?l?s?u +?d?u?d?l?s?l?s?s +?d?u?d?l?s?u?d?d +?d?u?d?l?s?u?d?l +?d?u?d?l?s?u?d?u +?d?u?d?l?s?u?d?s +?d?u?d?l?s?u?l?d +?d?u?d?l?s?u?l?l +?d?u?d?l?s?u?l?u +?d?u?d?l?s?u?l?s +?d?u?d?l?s?u?u?d +?d?u?d?l?s?u?u?l +?d?u?d?l?s?u?u?u +?d?u?d?l?s?u?u?s +?d?u?d?l?s?u?s?d +?d?u?d?l?s?u?s?l +?d?u?d?l?s?u?s?u +?d?u?d?l?s?u?s?s +?d?u?d?l?s?s?d?d +?d?u?d?l?s?s?d?l +?d?u?d?l?s?s?d?u +?d?u?d?l?s?s?d?s +?d?u?d?l?s?s?l?d +?d?u?d?l?s?s?l?l +?d?u?d?l?s?s?l?u +?d?u?d?l?s?s?l?s +?d?u?d?l?s?s?u?d +?d?u?d?l?s?s?u?l +?d?u?d?l?s?s?u?u +?d?u?d?l?s?s?u?s +?d?u?d?l?s?s?s?d +?d?u?d?l?s?s?s?l +?d?u?d?l?s?s?s?u +?d?u?d?l?s?s?s?s +?d?u?d?u?d?d?l?s +?d?u?d?u?d?d?s?l +?d?u?d?u?d?l?d?s +?d?u?d?u?d?l?l?s +?d?u?d?u?d?l?u?s +?d?u?d?u?d?l?s?d +?d?u?d?u?d?l?s?l +?d?u?d?u?d?l?s?u +?d?u?d?u?d?l?s?s +?d?u?d?u?d?u?l?s +?d?u?d?u?d?u?s?l +?d?u?d?u?d?s?d?l +?d?u?d?u?d?s?l?d +?d?u?d?u?d?s?l?l +?d?u?d?u?d?s?l?u +?d?u?d?u?d?s?l?s +?d?u?d?u?d?s?u?l +?d?u?d?u?d?s?s?l +?d?u?d?u?l?d?d?s +?d?u?d?u?l?d?l?s +?d?u?d?u?l?d?u?s +?d?u?d?u?l?d?s?d +?d?u?d?u?l?d?s?l +?d?u?d?u?l?d?s?u +?d?u?d?u?l?d?s?s +?d?u?d?u?l?l?d?s +?d?u?d?u?l?l?l?s +?d?u?d?u?l?l?u?s +?d?u?d?u?l?l?s?d +?d?u?d?u?l?l?s?l +?d?u?d?u?l?l?s?u +?d?u?d?u?l?l?s?s +?d?u?d?u?l?u?d?s +?d?u?d?u?l?u?l?s +?d?u?d?u?l?u?u?s +?d?u?d?u?l?u?s?d +?d?u?d?u?l?u?s?l +?d?u?d?u?l?u?s?u +?d?u?d?u?l?u?s?s +?d?u?d?u?l?s?d?d +?d?u?d?u?l?s?d?l +?d?u?d?u?l?s?d?u +?d?u?d?u?l?s?d?s +?d?u?d?u?l?s?l?d +?d?u?d?u?l?s?l?l +?d?u?d?u?l?s?l?u +?d?u?d?u?l?s?l?s +?d?u?d?u?l?s?u?d +?d?u?d?u?l?s?u?l +?d?u?d?u?l?s?u?u +?d?u?d?u?l?s?u?s +?d?u?d?u?l?s?s?d +?d?u?d?u?l?s?s?l +?d?u?d?u?l?s?s?u +?d?u?d?u?l?s?s?s +?d?u?d?u?u?d?l?s +?d?u?d?u?u?d?s?l +?d?u?d?u?u?l?d?s +?d?u?d?u?u?l?l?s +?d?u?d?u?u?l?u?s +?d?u?d?u?u?l?s?d +?d?u?d?u?u?l?s?l +?d?u?d?u?u?l?s?u +?d?u?d?u?u?l?s?s +?d?u?d?u?u?u?l?s +?d?u?d?u?u?u?s?l +?d?u?d?u?u?s?d?l +?d?u?d?u?u?s?l?d +?d?u?d?u?u?s?l?l +?d?u?d?u?u?s?l?u +?d?u?d?u?u?s?l?s +?d?u?d?u?u?s?u?l +?d?u?d?u?u?s?s?l +?d?u?d?u?s?d?d?l +?d?u?d?u?s?d?l?d +?d?u?d?u?s?d?l?l +?d?u?d?u?s?d?l?u +?d?u?d?u?s?d?l?s +?d?u?d?u?s?d?u?l +?d?u?d?u?s?d?s?l +?d?u?d?u?s?l?d?d +?d?u?d?u?s?l?d?l +?d?u?d?u?s?l?d?u +?d?u?d?u?s?l?d?s +?d?u?d?u?s?l?l?d +?d?u?d?u?s?l?l?l +?d?u?d?u?s?l?l?u +?d?u?d?u?s?l?l?s +?d?u?d?u?s?l?u?d +?d?u?d?u?s?l?u?l +?d?u?d?u?s?l?u?u +?d?u?d?u?s?l?u?s +?d?u?d?u?s?l?s?d +?d?u?d?u?s?l?s?l +?d?u?d?u?s?l?s?u +?d?u?d?u?s?l?s?s +?d?u?d?u?s?u?d?l +?d?u?d?u?s?u?l?d +?d?u?d?u?s?u?l?l +?d?u?d?u?s?u?l?u +?d?u?d?u?s?u?l?s +?d?u?d?u?s?u?u?l +?d?u?d?u?s?u?s?l +?d?u?d?u?s?s?d?l +?d?u?d?u?s?s?l?d +?d?u?d?u?s?s?l?l +?d?u?d?u?s?s?l?u +?d?u?d?u?s?s?l?s +?d?u?d?u?s?s?u?l +?d?u?d?u?s?s?s?l +?d?u?d?s?d?d?d?l +?d?u?d?s?d?d?l?d +?d?u?d?s?d?d?l?l +?d?u?d?s?d?d?l?u +?d?u?d?s?d?d?l?s +?d?u?d?s?d?d?u?l +?d?u?d?s?d?d?s?l +?d?u?d?s?d?l?d?d +?d?u?d?s?d?l?d?l +?d?u?d?s?d?l?d?u +?d?u?d?s?d?l?d?s +?d?u?d?s?d?l?l?d +?d?u?d?s?d?l?l?l +?d?u?d?s?d?l?l?u +?d?u?d?s?d?l?l?s +?d?u?d?s?d?l?u?d +?d?u?d?s?d?l?u?l +?d?u?d?s?d?l?u?u +?d?u?d?s?d?l?u?s +?d?u?d?s?d?l?s?d +?d?u?d?s?d?l?s?l +?d?u?d?s?d?l?s?u +?d?u?d?s?d?l?s?s +?d?u?d?s?d?u?d?l +?d?u?d?s?d?u?l?d +?d?u?d?s?d?u?l?l +?d?u?d?s?d?u?l?u +?d?u?d?s?d?u?l?s +?d?u?d?s?d?u?u?l +?d?u?d?s?d?u?s?l +?d?u?d?s?d?s?d?l +?d?u?d?s?d?s?l?d +?d?u?d?s?d?s?l?l +?d?u?d?s?d?s?l?u +?d?u?d?s?d?s?l?s +?d?u?d?s?d?s?u?l +?d?u?d?s?d?s?s?l +?d?u?d?s?l?d?d?d +?d?u?d?s?l?d?d?l +?d?u?d?s?l?d?d?u +?d?u?d?s?l?d?d?s +?d?u?d?s?l?d?l?d +?d?u?d?s?l?d?l?l +?d?u?d?s?l?d?l?u +?d?u?d?s?l?d?l?s +?d?u?d?s?l?d?u?d +?d?u?d?s?l?d?u?l +?d?u?d?s?l?d?u?u +?d?u?d?s?l?d?u?s +?d?u?d?s?l?d?s?d +?d?u?d?s?l?d?s?l +?d?u?d?s?l?d?s?u +?d?u?d?s?l?d?s?s +?d?u?d?s?l?l?d?d +?d?u?d?s?l?l?d?l +?d?u?d?s?l?l?d?u +?d?u?d?s?l?l?d?s +?d?u?d?s?l?l?l?d +?d?u?d?s?l?l?l?l +?d?u?d?s?l?l?l?u +?d?u?d?s?l?l?l?s +?d?u?d?s?l?l?u?d +?d?u?d?s?l?l?u?l +?d?u?d?s?l?l?u?u +?d?u?d?s?l?l?u?s +?d?u?d?s?l?l?s?d +?d?u?d?s?l?l?s?l +?d?u?d?s?l?l?s?u +?d?u?d?s?l?l?s?s +?d?u?d?s?l?u?d?d +?d?u?d?s?l?u?d?l +?d?u?d?s?l?u?d?u +?d?u?d?s?l?u?d?s +?d?u?d?s?l?u?l?d +?d?u?d?s?l?u?l?l +?d?u?d?s?l?u?l?u +?d?u?d?s?l?u?l?s +?d?u?d?s?l?u?u?d +?d?u?d?s?l?u?u?l +?d?u?d?s?l?u?u?u +?d?u?d?s?l?u?u?s +?d?u?d?s?l?u?s?d +?d?u?d?s?l?u?s?l +?d?u?d?s?l?u?s?u +?d?u?d?s?l?u?s?s +?d?u?d?s?l?s?d?d +?d?u?d?s?l?s?d?l +?d?u?d?s?l?s?d?u +?d?u?d?s?l?s?d?s +?d?u?d?s?l?s?l?d +?d?u?d?s?l?s?l?l +?d?u?d?s?l?s?l?u +?d?u?d?s?l?s?l?s +?d?u?d?s?l?s?u?d +?d?u?d?s?l?s?u?l +?d?u?d?s?l?s?u?u +?d?u?d?s?l?s?u?s +?d?u?d?s?l?s?s?d +?d?u?d?s?l?s?s?l +?d?u?d?s?l?s?s?u +?d?u?d?s?l?s?s?s +?d?u?d?s?u?d?d?l +?d?u?d?s?u?d?l?d +?d?u?d?s?u?d?l?l +?d?u?d?s?u?d?l?u +?d?u?d?s?u?d?l?s +?d?u?d?s?u?d?u?l +?d?u?d?s?u?d?s?l +?d?u?d?s?u?l?d?d +?d?u?d?s?u?l?d?l +?d?u?d?s?u?l?d?u +?d?u?d?s?u?l?d?s +?d?u?d?s?u?l?l?d +?d?u?d?s?u?l?l?l +?d?u?d?s?u?l?l?u +?d?u?d?s?u?l?l?s +?d?u?d?s?u?l?u?d +?d?u?d?s?u?l?u?l +?d?u?d?s?u?l?u?u +?d?u?d?s?u?l?u?s +?d?u?d?s?u?l?s?d +?d?u?d?s?u?l?s?l +?d?u?d?s?u?l?s?u +?d?u?d?s?u?l?s?s +?d?u?d?s?u?u?d?l +?d?u?d?s?u?u?l?d +?d?u?d?s?u?u?l?l +?d?u?d?s?u?u?l?u +?d?u?d?s?u?u?l?s +?d?u?d?s?u?u?u?l +?d?u?d?s?u?u?s?l +?d?u?d?s?u?s?d?l +?d?u?d?s?u?s?l?d +?d?u?d?s?u?s?l?l +?d?u?d?s?u?s?l?u +?d?u?d?s?u?s?l?s +?d?u?d?s?u?s?u?l +?d?u?d?s?u?s?s?l +?d?u?d?s?s?d?d?l +?d?u?d?s?s?d?l?d +?d?u?d?s?s?d?l?l +?d?u?d?s?s?d?l?u +?d?u?d?s?s?d?l?s +?d?u?d?s?s?d?u?l +?d?u?d?s?s?d?s?l +?d?u?d?s?s?l?d?d +?d?u?d?s?s?l?d?l +?d?u?d?s?s?l?d?u +?d?u?d?s?s?l?d?s +?d?u?d?s?s?l?l?d +?d?u?d?s?s?l?l?l +?d?u?d?s?s?l?l?u +?d?u?d?s?s?l?l?s +?d?u?d?s?s?l?u?d +?d?u?d?s?s?l?u?l +?d?u?d?s?s?l?u?u +?d?u?d?s?s?l?u?s +?d?u?d?s?s?l?s?d +?d?u?d?s?s?l?s?l +?d?u?d?s?s?l?s?u +?d?u?d?s?s?l?s?s +?d?u?d?s?s?u?d?l +?d?u?d?s?s?u?l?d +?d?u?d?s?s?u?l?l +?d?u?d?s?s?u?l?u +?d?u?d?s?s?u?l?s +?d?u?d?s?s?u?u?l +?d?u?d?s?s?u?s?l +?d?u?d?s?s?s?d?l +?d?u?d?s?s?s?l?d +?d?u?d?s?s?s?l?l +?d?u?d?s?s?s?l?u +?d?u?d?s?s?s?l?s +?d?u?d?s?s?s?u?l +?d?u?d?s?s?s?s?l +?d?u?l?d?d?d?d?s +?d?u?l?d?d?d?l?s +?d?u?l?d?d?d?u?s +?d?u?l?d?d?d?s?d +?d?u?l?d?d?d?s?l +?d?u?l?d?d?d?s?u +?d?u?l?d?d?d?s?s +?d?u?l?d?d?l?d?s +?d?u?l?d?d?l?l?s +?d?u?l?d?d?l?u?s +?d?u?l?d?d?l?s?d +?d?u?l?d?d?l?s?l +?d?u?l?d?d?l?s?u +?d?u?l?d?d?l?s?s +?d?u?l?d?d?u?d?s +?d?u?l?d?d?u?l?s +?d?u?l?d?d?u?u?s +?d?u?l?d?d?u?s?d +?d?u?l?d?d?u?s?l +?d?u?l?d?d?u?s?u +?d?u?l?d?d?u?s?s +?d?u?l?d?d?s?d?d +?d?u?l?d?d?s?d?l +?d?u?l?d?d?s?d?u +?d?u?l?d?d?s?d?s +?d?u?l?d?d?s?l?d +?d?u?l?d?d?s?l?l +?d?u?l?d?d?s?l?u +?d?u?l?d?d?s?l?s +?d?u?l?d?d?s?u?d +?d?u?l?d?d?s?u?l +?d?u?l?d?d?s?u?u +?d?u?l?d?d?s?u?s +?d?u?l?d?d?s?s?d +?d?u?l?d?d?s?s?l +?d?u?l?d?d?s?s?u +?d?u?l?d?d?s?s?s +?d?u?l?d?l?d?d?s +?d?u?l?d?l?d?l?s +?d?u?l?d?l?d?u?s +?d?u?l?d?l?d?s?d +?d?u?l?d?l?d?s?l +?d?u?l?d?l?d?s?u +?d?u?l?d?l?d?s?s +?d?u?l?d?l?l?d?s +?d?u?l?d?l?l?l?s +?d?u?l?d?l?l?u?s +?d?u?l?d?l?l?s?d +?d?u?l?d?l?l?s?l +?d?u?l?d?l?l?s?u +?d?u?l?d?l?l?s?s +?d?u?l?d?l?u?d?s +?d?u?l?d?l?u?l?s +?d?u?l?d?l?u?u?s +?d?u?l?d?l?u?s?d +?d?u?l?d?l?u?s?l +?d?u?l?d?l?u?s?u +?d?u?l?d?l?u?s?s +?d?u?l?d?l?s?d?d +?d?u?l?d?l?s?d?l +?d?u?l?d?l?s?d?u +?d?u?l?d?l?s?d?s +?d?u?l?d?l?s?l?d +?d?u?l?d?l?s?l?l +?d?u?l?d?l?s?l?u +?d?u?l?d?l?s?l?s +?d?u?l?d?l?s?u?d +?d?u?l?d?l?s?u?l +?d?u?l?d?l?s?u?u +?d?u?l?d?l?s?u?s +?d?u?l?d?l?s?s?d +?d?u?l?d?l?s?s?l +?d?u?l?d?l?s?s?u +?d?u?l?d?l?s?s?s +?d?u?l?d?u?d?d?s +?d?u?l?d?u?d?l?s +?d?u?l?d?u?d?u?s +?d?u?l?d?u?d?s?d +?d?u?l?d?u?d?s?l +?d?u?l?d?u?d?s?u +?d?u?l?d?u?d?s?s +?d?u?l?d?u?l?d?s +?d?u?l?d?u?l?l?s +?d?u?l?d?u?l?u?s +?d?u?l?d?u?l?s?d +?d?u?l?d?u?l?s?l +?d?u?l?d?u?l?s?u +?d?u?l?d?u?l?s?s +?d?u?l?d?u?u?d?s +?d?u?l?d?u?u?l?s +?d?u?l?d?u?u?u?s +?d?u?l?d?u?u?s?d +?d?u?l?d?u?u?s?l +?d?u?l?d?u?u?s?u +?d?u?l?d?u?u?s?s +?d?u?l?d?u?s?d?d +?d?u?l?d?u?s?d?l +?d?u?l?d?u?s?d?u +?d?u?l?d?u?s?d?s +?d?u?l?d?u?s?l?d +?d?u?l?d?u?s?l?l +?d?u?l?d?u?s?l?u +?d?u?l?d?u?s?l?s +?d?u?l?d?u?s?u?d +?d?u?l?d?u?s?u?l +?d?u?l?d?u?s?u?u +?d?u?l?d?u?s?u?s +?d?u?l?d?u?s?s?d +?d?u?l?d?u?s?s?l +?d?u?l?d?u?s?s?u +?d?u?l?d?u?s?s?s +?d?u?l?d?s?d?d?d +?d?u?l?d?s?d?d?l +?d?u?l?d?s?d?d?u +?d?u?l?d?s?d?d?s +?d?u?l?d?s?d?l?d +?d?u?l?d?s?d?l?l +?d?u?l?d?s?d?l?u +?d?u?l?d?s?d?l?s +?d?u?l?d?s?d?u?d +?d?u?l?d?s?d?u?l +?d?u?l?d?s?d?u?u +?d?u?l?d?s?d?u?s +?d?u?l?d?s?d?s?d +?d?u?l?d?s?d?s?l +?d?u?l?d?s?d?s?u +?d?u?l?d?s?d?s?s +?d?u?l?d?s?l?d?d +?d?u?l?d?s?l?d?l +?d?u?l?d?s?l?d?u +?d?u?l?d?s?l?d?s +?d?u?l?d?s?l?l?d +?d?u?l?d?s?l?l?l +?d?u?l?d?s?l?l?u +?d?u?l?d?s?l?l?s +?d?u?l?d?s?l?u?d +?d?u?l?d?s?l?u?l +?d?u?l?d?s?l?u?u +?d?u?l?d?s?l?u?s +?d?u?l?d?s?l?s?d +?d?u?l?d?s?l?s?l +?d?u?l?d?s?l?s?u +?d?u?l?d?s?l?s?s +?d?u?l?d?s?u?d?d +?d?u?l?d?s?u?d?l +?d?u?l?d?s?u?d?u +?d?u?l?d?s?u?d?s +?d?u?l?d?s?u?l?d +?d?u?l?d?s?u?l?l +?d?u?l?d?s?u?l?u +?d?u?l?d?s?u?l?s +?d?u?l?d?s?u?u?d +?d?u?l?d?s?u?u?l +?d?u?l?d?s?u?u?u +?d?u?l?d?s?u?u?s +?d?u?l?d?s?u?s?d +?d?u?l?d?s?u?s?l +?d?u?l?d?s?u?s?u +?d?u?l?d?s?u?s?s +?d?u?l?d?s?s?d?d +?d?u?l?d?s?s?d?l +?d?u?l?d?s?s?d?u +?d?u?l?d?s?s?d?s +?d?u?l?d?s?s?l?d +?d?u?l?d?s?s?l?l +?d?u?l?d?s?s?l?u +?d?u?l?d?s?s?l?s +?d?u?l?d?s?s?u?d +?d?u?l?d?s?s?u?l +?d?u?l?d?s?s?u?u +?d?u?l?d?s?s?u?s +?d?u?l?d?s?s?s?d +?d?u?l?d?s?s?s?l +?d?u?l?d?s?s?s?u +?d?u?l?d?s?s?s?s +?d?u?l?l?d?d?d?s +?d?u?l?l?d?d?l?s +?d?u?l?l?d?d?u?s +?d?u?l?l?d?d?s?d +?d?u?l?l?d?d?s?l +?d?u?l?l?d?d?s?u +?d?u?l?l?d?d?s?s +?d?u?l?l?d?l?d?s +?d?u?l?l?d?l?l?s +?d?u?l?l?d?l?u?s +?d?u?l?l?d?l?s?d +?d?u?l?l?d?l?s?l +?d?u?l?l?d?l?s?u +?d?u?l?l?d?l?s?s +?d?u?l?l?d?u?d?s +?d?u?l?l?d?u?l?s +?d?u?l?l?d?u?u?s +?d?u?l?l?d?u?s?d +?d?u?l?l?d?u?s?l +?d?u?l?l?d?u?s?u +?d?u?l?l?d?u?s?s +?d?u?l?l?d?s?d?d +?d?u?l?l?d?s?d?l +?d?u?l?l?d?s?d?u +?d?u?l?l?d?s?d?s +?d?u?l?l?d?s?l?d +?d?u?l?l?d?s?l?l +?d?u?l?l?d?s?l?u +?d?u?l?l?d?s?l?s +?d?u?l?l?d?s?u?d +?d?u?l?l?d?s?u?l +?d?u?l?l?d?s?u?u +?d?u?l?l?d?s?u?s +?d?u?l?l?d?s?s?d +?d?u?l?l?d?s?s?l +?d?u?l?l?d?s?s?u +?d?u?l?l?d?s?s?s +?d?u?l?l?l?d?d?s +?d?u?l?l?l?d?l?s +?d?u?l?l?l?d?u?s +?d?u?l?l?l?d?s?d +?d?u?l?l?l?d?s?l +?d?u?l?l?l?d?s?u +?d?u?l?l?l?d?s?s +?d?u?l?l?l?l?d?s +?d?u?l?l?l?l?l?s +?d?u?l?l?l?l?u?s +?d?u?l?l?l?l?s?d +?d?u?l?l?l?l?s?l +?d?u?l?l?l?l?s?u +?d?u?l?l?l?l?s?s +?d?u?l?l?l?u?d?s +?d?u?l?l?l?u?l?s +?d?u?l?l?l?u?u?s +?d?u?l?l?l?u?s?d +?d?u?l?l?l?u?s?l +?d?u?l?l?l?u?s?u +?d?u?l?l?l?u?s?s +?d?u?l?l?l?s?d?d +?d?u?l?l?l?s?d?l +?d?u?l?l?l?s?d?u +?d?u?l?l?l?s?d?s +?d?u?l?l?l?s?l?d +?d?u?l?l?l?s?l?l +?d?u?l?l?l?s?l?u +?d?u?l?l?l?s?l?s +?d?u?l?l?l?s?u?d +?d?u?l?l?l?s?u?l +?d?u?l?l?l?s?u?u +?d?u?l?l?l?s?u?s +?d?u?l?l?l?s?s?d +?d?u?l?l?l?s?s?l +?d?u?l?l?l?s?s?u +?d?u?l?l?l?s?s?s +?d?u?l?l?u?d?d?s +?d?u?l?l?u?d?l?s +?d?u?l?l?u?d?u?s +?d?u?l?l?u?d?s?d +?d?u?l?l?u?d?s?l +?d?u?l?l?u?d?s?u +?d?u?l?l?u?d?s?s +?d?u?l?l?u?l?d?s +?d?u?l?l?u?l?l?s +?d?u?l?l?u?l?u?s +?d?u?l?l?u?l?s?d +?d?u?l?l?u?l?s?l +?d?u?l?l?u?l?s?u +?d?u?l?l?u?l?s?s +?d?u?l?l?u?u?d?s +?d?u?l?l?u?u?l?s +?d?u?l?l?u?u?u?s +?d?u?l?l?u?u?s?d +?d?u?l?l?u?u?s?l +?d?u?l?l?u?u?s?u +?d?u?l?l?u?u?s?s +?d?u?l?l?u?s?d?d +?d?u?l?l?u?s?d?l +?d?u?l?l?u?s?d?u +?d?u?l?l?u?s?d?s +?d?u?l?l?u?s?l?d +?d?u?l?l?u?s?l?l +?d?u?l?l?u?s?l?u +?d?u?l?l?u?s?l?s +?d?u?l?l?u?s?u?d +?d?u?l?l?u?s?u?l +?d?u?l?l?u?s?u?u +?d?u?l?l?u?s?u?s +?d?u?l?l?u?s?s?d +?d?u?l?l?u?s?s?l +?d?u?l?l?u?s?s?u +?d?u?l?l?u?s?s?s +?d?u?l?l?s?d?d?d +?d?u?l?l?s?d?d?l +?d?u?l?l?s?d?d?u +?d?u?l?l?s?d?d?s +?d?u?l?l?s?d?l?d +?d?u?l?l?s?d?l?l +?d?u?l?l?s?d?l?u +?d?u?l?l?s?d?l?s +?d?u?l?l?s?d?u?d +?d?u?l?l?s?d?u?l +?d?u?l?l?s?d?u?u +?d?u?l?l?s?d?u?s +?d?u?l?l?s?d?s?d +?d?u?l?l?s?d?s?l +?d?u?l?l?s?d?s?u +?d?u?l?l?s?d?s?s +?d?u?l?l?s?l?d?d +?d?u?l?l?s?l?d?l +?d?u?l?l?s?l?d?u +?d?u?l?l?s?l?d?s +?d?u?l?l?s?l?l?d +?d?u?l?l?s?l?l?l +?d?u?l?l?s?l?l?u +?d?u?l?l?s?l?l?s +?d?u?l?l?s?l?u?d +?d?u?l?l?s?l?u?l +?d?u?l?l?s?l?u?u +?d?u?l?l?s?l?u?s +?d?u?l?l?s?l?s?d +?d?u?l?l?s?l?s?l +?d?u?l?l?s?l?s?u +?d?u?l?l?s?l?s?s +?d?u?l?l?s?u?d?d +?d?u?l?l?s?u?d?l +?d?u?l?l?s?u?d?u +?d?u?l?l?s?u?d?s +?d?u?l?l?s?u?l?d +?d?u?l?l?s?u?l?l +?d?u?l?l?s?u?l?u +?d?u?l?l?s?u?l?s +?d?u?l?l?s?u?u?d +?d?u?l?l?s?u?u?l +?d?u?l?l?s?u?u?u +?d?u?l?l?s?u?u?s +?d?u?l?l?s?u?s?d +?d?u?l?l?s?u?s?l +?d?u?l?l?s?u?s?u +?d?u?l?l?s?u?s?s +?d?u?l?l?s?s?d?d +?d?u?l?l?s?s?d?l +?d?u?l?l?s?s?d?u +?d?u?l?l?s?s?d?s +?d?u?l?l?s?s?l?d +?d?u?l?l?s?s?l?l +?d?u?l?l?s?s?l?u +?d?u?l?l?s?s?l?s +?d?u?l?l?s?s?u?d +?d?u?l?l?s?s?u?l +?d?u?l?l?s?s?u?u +?d?u?l?l?s?s?u?s +?d?u?l?l?s?s?s?d +?d?u?l?l?s?s?s?l +?d?u?l?l?s?s?s?u +?d?u?l?l?s?s?s?s +?d?u?l?u?d?d?d?s +?d?u?l?u?d?d?l?s +?d?u?l?u?d?d?u?s +?d?u?l?u?d?d?s?d +?d?u?l?u?d?d?s?l +?d?u?l?u?d?d?s?u +?d?u?l?u?d?d?s?s +?d?u?l?u?d?l?d?s +?d?u?l?u?d?l?l?s +?d?u?l?u?d?l?u?s +?d?u?l?u?d?l?s?d +?d?u?l?u?d?l?s?l +?d?u?l?u?d?l?s?u +?d?u?l?u?d?l?s?s +?d?u?l?u?d?u?d?s +?d?u?l?u?d?u?l?s +?d?u?l?u?d?u?u?s +?d?u?l?u?d?u?s?d +?d?u?l?u?d?u?s?l +?d?u?l?u?d?u?s?u +?d?u?l?u?d?u?s?s +?d?u?l?u?d?s?d?d +?d?u?l?u?d?s?d?l +?d?u?l?u?d?s?d?u +?d?u?l?u?d?s?d?s +?d?u?l?u?d?s?l?d +?d?u?l?u?d?s?l?l +?d?u?l?u?d?s?l?u +?d?u?l?u?d?s?l?s +?d?u?l?u?d?s?u?d +?d?u?l?u?d?s?u?l +?d?u?l?u?d?s?u?u +?d?u?l?u?d?s?u?s +?d?u?l?u?d?s?s?d +?d?u?l?u?d?s?s?l +?d?u?l?u?d?s?s?u +?d?u?l?u?d?s?s?s +?d?u?l?u?l?d?d?s +?d?u?l?u?l?d?l?s +?d?u?l?u?l?d?u?s +?d?u?l?u?l?d?s?d +?d?u?l?u?l?d?s?l +?d?u?l?u?l?d?s?u +?d?u?l?u?l?d?s?s +?d?u?l?u?l?l?d?s +?d?u?l?u?l?l?l?s +?d?u?l?u?l?l?u?s +?d?u?l?u?l?l?s?d +?d?u?l?u?l?l?s?l +?d?u?l?u?l?l?s?u +?d?u?l?u?l?l?s?s +?d?u?l?u?l?u?d?s +?d?u?l?u?l?u?l?s +?d?u?l?u?l?u?u?s +?d?u?l?u?l?u?s?d +?d?u?l?u?l?u?s?l +?d?u?l?u?l?u?s?u +?d?u?l?u?l?u?s?s +?d?u?l?u?l?s?d?d +?d?u?l?u?l?s?d?l +?d?u?l?u?l?s?d?u +?d?u?l?u?l?s?d?s +?d?u?l?u?l?s?l?d +?d?u?l?u?l?s?l?l +?d?u?l?u?l?s?l?u +?d?u?l?u?l?s?l?s +?d?u?l?u?l?s?u?d +?d?u?l?u?l?s?u?l +?d?u?l?u?l?s?u?u +?d?u?l?u?l?s?u?s +?d?u?l?u?l?s?s?d +?d?u?l?u?l?s?s?l +?d?u?l?u?l?s?s?u +?d?u?l?u?l?s?s?s +?d?u?l?u?u?d?d?s +?d?u?l?u?u?d?l?s +?d?u?l?u?u?d?u?s +?d?u?l?u?u?d?s?d +?d?u?l?u?u?d?s?l +?d?u?l?u?u?d?s?u +?d?u?l?u?u?d?s?s +?d?u?l?u?u?l?d?s +?d?u?l?u?u?l?l?s +?d?u?l?u?u?l?u?s +?d?u?l?u?u?l?s?d +?d?u?l?u?u?l?s?l +?d?u?l?u?u?l?s?u +?d?u?l?u?u?l?s?s +?d?u?l?u?u?u?d?s +?d?u?l?u?u?u?l?s +?d?u?l?u?u?u?u?s +?d?u?l?u?u?u?s?d +?d?u?l?u?u?u?s?l +?d?u?l?u?u?u?s?u +?d?u?l?u?u?u?s?s +?d?u?l?u?u?s?d?d +?d?u?l?u?u?s?d?l +?d?u?l?u?u?s?d?u +?d?u?l?u?u?s?d?s +?d?u?l?u?u?s?l?d +?d?u?l?u?u?s?l?l +?d?u?l?u?u?s?l?u +?d?u?l?u?u?s?l?s +?d?u?l?u?u?s?u?d +?d?u?l?u?u?s?u?l +?d?u?l?u?u?s?u?u +?d?u?l?u?u?s?u?s +?d?u?l?u?u?s?s?d +?d?u?l?u?u?s?s?l +?d?u?l?u?u?s?s?u +?d?u?l?u?u?s?s?s +?d?u?l?u?s?d?d?d +?d?u?l?u?s?d?d?l +?d?u?l?u?s?d?d?u +?d?u?l?u?s?d?d?s +?d?u?l?u?s?d?l?d +?d?u?l?u?s?d?l?l +?d?u?l?u?s?d?l?u +?d?u?l?u?s?d?l?s +?d?u?l?u?s?d?u?d +?d?u?l?u?s?d?u?l +?d?u?l?u?s?d?u?u +?d?u?l?u?s?d?u?s +?d?u?l?u?s?d?s?d +?d?u?l?u?s?d?s?l +?d?u?l?u?s?d?s?u +?d?u?l?u?s?d?s?s +?d?u?l?u?s?l?d?d +?d?u?l?u?s?l?d?l +?d?u?l?u?s?l?d?u +?d?u?l?u?s?l?d?s +?d?u?l?u?s?l?l?d +?d?u?l?u?s?l?l?l +?d?u?l?u?s?l?l?u +?d?u?l?u?s?l?l?s +?d?u?l?u?s?l?u?d +?d?u?l?u?s?l?u?l +?d?u?l?u?s?l?u?u +?d?u?l?u?s?l?u?s +?d?u?l?u?s?l?s?d +?d?u?l?u?s?l?s?l +?d?u?l?u?s?l?s?u +?d?u?l?u?s?l?s?s +?d?u?l?u?s?u?d?d +?d?u?l?u?s?u?d?l +?d?u?l?u?s?u?d?u +?d?u?l?u?s?u?d?s +?d?u?l?u?s?u?l?d +?d?u?l?u?s?u?l?l +?d?u?l?u?s?u?l?u +?d?u?l?u?s?u?l?s +?d?u?l?u?s?u?u?d +?d?u?l?u?s?u?u?l +?d?u?l?u?s?u?u?u +?d?u?l?u?s?u?u?s +?d?u?l?u?s?u?s?d +?d?u?l?u?s?u?s?l +?d?u?l?u?s?u?s?u +?d?u?l?u?s?u?s?s +?d?u?l?u?s?s?d?d +?d?u?l?u?s?s?d?l +?d?u?l?u?s?s?d?u +?d?u?l?u?s?s?d?s +?d?u?l?u?s?s?l?d +?d?u?l?u?s?s?l?l +?d?u?l?u?s?s?l?u +?d?u?l?u?s?s?l?s +?d?u?l?u?s?s?u?d +?d?u?l?u?s?s?u?l +?d?u?l?u?s?s?u?u +?d?u?l?u?s?s?u?s +?d?u?l?u?s?s?s?d +?d?u?l?u?s?s?s?l +?d?u?l?u?s?s?s?u +?d?u?l?u?s?s?s?s +?d?u?l?s?d?d?d?d +?d?u?l?s?d?d?d?l +?d?u?l?s?d?d?d?u +?d?u?l?s?d?d?d?s +?d?u?l?s?d?d?l?d +?d?u?l?s?d?d?l?l +?d?u?l?s?d?d?l?u +?d?u?l?s?d?d?l?s +?d?u?l?s?d?d?u?d +?d?u?l?s?d?d?u?l +?d?u?l?s?d?d?u?u +?d?u?l?s?d?d?u?s +?d?u?l?s?d?d?s?d +?d?u?l?s?d?d?s?l +?d?u?l?s?d?d?s?u +?d?u?l?s?d?d?s?s +?d?u?l?s?d?l?d?d +?d?u?l?s?d?l?d?l +?d?u?l?s?d?l?d?u +?d?u?l?s?d?l?d?s +?d?u?l?s?d?l?l?d +?d?u?l?s?d?l?l?l +?d?u?l?s?d?l?l?u +?d?u?l?s?d?l?l?s +?d?u?l?s?d?l?u?d +?d?u?l?s?d?l?u?l +?d?u?l?s?d?l?u?u +?d?u?l?s?d?l?u?s +?d?u?l?s?d?l?s?d +?d?u?l?s?d?l?s?l +?d?u?l?s?d?l?s?u +?d?u?l?s?d?l?s?s +?d?u?l?s?d?u?d?d +?d?u?l?s?d?u?d?l +?d?u?l?s?d?u?d?u +?d?u?l?s?d?u?d?s +?d?u?l?s?d?u?l?d +?d?u?l?s?d?u?l?l +?d?u?l?s?d?u?l?u +?d?u?l?s?d?u?l?s +?d?u?l?s?d?u?u?d +?d?u?l?s?d?u?u?l +?d?u?l?s?d?u?u?u +?d?u?l?s?d?u?u?s +?d?u?l?s?d?u?s?d +?d?u?l?s?d?u?s?l +?d?u?l?s?d?u?s?u +?d?u?l?s?d?u?s?s +?d?u?l?s?d?s?d?d +?d?u?l?s?d?s?d?l +?d?u?l?s?d?s?d?u +?d?u?l?s?d?s?d?s +?d?u?l?s?d?s?l?d +?d?u?l?s?d?s?l?l +?d?u?l?s?d?s?l?u +?d?u?l?s?d?s?l?s +?d?u?l?s?d?s?u?d +?d?u?l?s?d?s?u?l +?d?u?l?s?d?s?u?u +?d?u?l?s?d?s?u?s +?d?u?l?s?d?s?s?d +?d?u?l?s?d?s?s?l +?d?u?l?s?d?s?s?u +?d?u?l?s?d?s?s?s +?d?u?l?s?l?d?d?d +?d?u?l?s?l?d?d?l +?d?u?l?s?l?d?d?u +?d?u?l?s?l?d?d?s +?d?u?l?s?l?d?l?d +?d?u?l?s?l?d?l?l +?d?u?l?s?l?d?l?u +?d?u?l?s?l?d?l?s +?d?u?l?s?l?d?u?d +?d?u?l?s?l?d?u?l +?d?u?l?s?l?d?u?u +?d?u?l?s?l?d?u?s +?d?u?l?s?l?d?s?d +?d?u?l?s?l?d?s?l +?d?u?l?s?l?d?s?u +?d?u?l?s?l?d?s?s +?d?u?l?s?l?l?d?d +?d?u?l?s?l?l?d?l +?d?u?l?s?l?l?d?u +?d?u?l?s?l?l?d?s +?d?u?l?s?l?l?l?d +?d?u?l?s?l?l?l?l +?d?u?l?s?l?l?l?u +?d?u?l?s?l?l?l?s +?d?u?l?s?l?l?u?d +?d?u?l?s?l?l?u?l +?d?u?l?s?l?l?u?u +?d?u?l?s?l?l?u?s +?d?u?l?s?l?l?s?d +?d?u?l?s?l?l?s?l +?d?u?l?s?l?l?s?u +?d?u?l?s?l?l?s?s +?d?u?l?s?l?u?d?d +?d?u?l?s?l?u?d?l +?d?u?l?s?l?u?d?u +?d?u?l?s?l?u?d?s +?d?u?l?s?l?u?l?d +?d?u?l?s?l?u?l?l +?d?u?l?s?l?u?l?u +?d?u?l?s?l?u?l?s +?d?u?l?s?l?u?u?d +?d?u?l?s?l?u?u?l +?d?u?l?s?l?u?u?u +?d?u?l?s?l?u?u?s +?d?u?l?s?l?u?s?d +?d?u?l?s?l?u?s?l +?d?u?l?s?l?u?s?u +?d?u?l?s?l?u?s?s +?d?u?l?s?l?s?d?d +?d?u?l?s?l?s?d?l +?d?u?l?s?l?s?d?u +?d?u?l?s?l?s?d?s +?d?u?l?s?l?s?l?d +?d?u?l?s?l?s?l?l +?d?u?l?s?l?s?l?u +?d?u?l?s?l?s?l?s +?d?u?l?s?l?s?u?d +?d?u?l?s?l?s?u?l +?d?u?l?s?l?s?u?u +?d?u?l?s?l?s?u?s +?d?u?l?s?l?s?s?d +?d?u?l?s?l?s?s?l +?d?u?l?s?l?s?s?u +?d?u?l?s?l?s?s?s +?d?u?l?s?u?d?d?d +?d?u?l?s?u?d?d?l +?d?u?l?s?u?d?d?u +?d?u?l?s?u?d?d?s +?d?u?l?s?u?d?l?d +?d?u?l?s?u?d?l?l +?d?u?l?s?u?d?l?u +?d?u?l?s?u?d?l?s +?d?u?l?s?u?d?u?d +?d?u?l?s?u?d?u?l +?d?u?l?s?u?d?u?u +?d?u?l?s?u?d?u?s +?d?u?l?s?u?d?s?d +?d?u?l?s?u?d?s?l +?d?u?l?s?u?d?s?u +?d?u?l?s?u?d?s?s +?d?u?l?s?u?l?d?d +?d?u?l?s?u?l?d?l +?d?u?l?s?u?l?d?u +?d?u?l?s?u?l?d?s +?d?u?l?s?u?l?l?d +?d?u?l?s?u?l?l?l +?d?u?l?s?u?l?l?u +?d?u?l?s?u?l?l?s +?d?u?l?s?u?l?u?d +?d?u?l?s?u?l?u?l +?d?u?l?s?u?l?u?u +?d?u?l?s?u?l?u?s +?d?u?l?s?u?l?s?d +?d?u?l?s?u?l?s?l +?d?u?l?s?u?l?s?u +?d?u?l?s?u?l?s?s +?d?u?l?s?u?u?d?d +?d?u?l?s?u?u?d?l +?d?u?l?s?u?u?d?u +?d?u?l?s?u?u?d?s +?d?u?l?s?u?u?l?d +?d?u?l?s?u?u?l?l +?d?u?l?s?u?u?l?u +?d?u?l?s?u?u?l?s +?d?u?l?s?u?u?u?d +?d?u?l?s?u?u?u?l +?d?u?l?s?u?u?u?u +?d?u?l?s?u?u?u?s +?d?u?l?s?u?u?s?d +?d?u?l?s?u?u?s?l +?d?u?l?s?u?u?s?u +?d?u?l?s?u?u?s?s +?d?u?l?s?u?s?d?d +?d?u?l?s?u?s?d?l +?d?u?l?s?u?s?d?u +?d?u?l?s?u?s?d?s +?d?u?l?s?u?s?l?d +?d?u?l?s?u?s?l?l +?d?u?l?s?u?s?l?u +?d?u?l?s?u?s?l?s +?d?u?l?s?u?s?u?d +?d?u?l?s?u?s?u?l +?d?u?l?s?u?s?u?u +?d?u?l?s?u?s?u?s +?d?u?l?s?u?s?s?d +?d?u?l?s?u?s?s?l +?d?u?l?s?u?s?s?u +?d?u?l?s?u?s?s?s +?d?u?l?s?s?d?d?d +?d?u?l?s?s?d?d?l +?d?u?l?s?s?d?d?u +?d?u?l?s?s?d?d?s +?d?u?l?s?s?d?l?d +?d?u?l?s?s?d?l?l +?d?u?l?s?s?d?l?u +?d?u?l?s?s?d?l?s +?d?u?l?s?s?d?u?d +?d?u?l?s?s?d?u?l +?d?u?l?s?s?d?u?u +?d?u?l?s?s?d?u?s +?d?u?l?s?s?d?s?d +?d?u?l?s?s?d?s?l +?d?u?l?s?s?d?s?u +?d?u?l?s?s?d?s?s +?d?u?l?s?s?l?d?d +?d?u?l?s?s?l?d?l +?d?u?l?s?s?l?d?u +?d?u?l?s?s?l?d?s +?d?u?l?s?s?l?l?d +?d?u?l?s?s?l?l?l +?d?u?l?s?s?l?l?u +?d?u?l?s?s?l?l?s +?d?u?l?s?s?l?u?d +?d?u?l?s?s?l?u?l +?d?u?l?s?s?l?u?u +?d?u?l?s?s?l?u?s +?d?u?l?s?s?l?s?d +?d?u?l?s?s?l?s?l +?d?u?l?s?s?l?s?u +?d?u?l?s?s?l?s?s +?d?u?l?s?s?u?d?d +?d?u?l?s?s?u?d?l +?d?u?l?s?s?u?d?u +?d?u?l?s?s?u?d?s +?d?u?l?s?s?u?l?d +?d?u?l?s?s?u?l?l +?d?u?l?s?s?u?l?u +?d?u?l?s?s?u?l?s +?d?u?l?s?s?u?u?d +?d?u?l?s?s?u?u?l +?d?u?l?s?s?u?u?u +?d?u?l?s?s?u?u?s +?d?u?l?s?s?u?s?d +?d?u?l?s?s?u?s?l +?d?u?l?s?s?u?s?u +?d?u?l?s?s?u?s?s +?d?u?l?s?s?s?d?d +?d?u?l?s?s?s?d?l +?d?u?l?s?s?s?d?u +?d?u?l?s?s?s?d?s +?d?u?l?s?s?s?l?d +?d?u?l?s?s?s?l?l +?d?u?l?s?s?s?l?u +?d?u?l?s?s?s?l?s +?d?u?l?s?s?s?u?d +?d?u?l?s?s?s?u?l +?d?u?l?s?s?s?u?u +?d?u?l?s?s?s?u?s +?d?u?l?s?s?s?s?d +?d?u?l?s?s?s?s?l +?d?u?l?s?s?s?s?u +?d?u?l?s?s?s?s?s +?d?u?u?d?d?d?l?s +?d?u?u?d?d?d?s?l +?d?u?u?d?d?l?d?s +?d?u?u?d?d?l?l?s +?d?u?u?d?d?l?u?s +?d?u?u?d?d?l?s?d +?d?u?u?d?d?l?s?l +?d?u?u?d?d?l?s?u +?d?u?u?d?d?l?s?s +?d?u?u?d?d?u?l?s +?d?u?u?d?d?u?s?l +?d?u?u?d?d?s?d?l +?d?u?u?d?d?s?l?d +?d?u?u?d?d?s?l?l +?d?u?u?d?d?s?l?u +?d?u?u?d?d?s?l?s +?d?u?u?d?d?s?u?l +?d?u?u?d?d?s?s?l +?d?u?u?d?l?d?d?s +?d?u?u?d?l?d?l?s +?d?u?u?d?l?d?u?s +?d?u?u?d?l?d?s?d +?d?u?u?d?l?d?s?l +?d?u?u?d?l?d?s?u +?d?u?u?d?l?d?s?s +?d?u?u?d?l?l?d?s +?d?u?u?d?l?l?l?s +?d?u?u?d?l?l?u?s +?d?u?u?d?l?l?s?d +?d?u?u?d?l?l?s?l +?d?u?u?d?l?l?s?u +?d?u?u?d?l?l?s?s +?d?u?u?d?l?u?d?s +?d?u?u?d?l?u?l?s +?d?u?u?d?l?u?u?s +?d?u?u?d?l?u?s?d +?d?u?u?d?l?u?s?l +?d?u?u?d?l?u?s?u +?d?u?u?d?l?u?s?s +?d?u?u?d?l?s?d?d +?d?u?u?d?l?s?d?l +?d?u?u?d?l?s?d?u +?d?u?u?d?l?s?d?s +?d?u?u?d?l?s?l?d +?d?u?u?d?l?s?l?l +?d?u?u?d?l?s?l?u +?d?u?u?d?l?s?l?s +?d?u?u?d?l?s?u?d +?d?u?u?d?l?s?u?l +?d?u?u?d?l?s?u?u +?d?u?u?d?l?s?u?s +?d?u?u?d?l?s?s?d +?d?u?u?d?l?s?s?l +?d?u?u?d?l?s?s?u +?d?u?u?d?l?s?s?s +?d?u?u?d?u?d?l?s +?d?u?u?d?u?d?s?l +?d?u?u?d?u?l?d?s +?d?u?u?d?u?l?l?s +?d?u?u?d?u?l?u?s +?d?u?u?d?u?l?s?d +?d?u?u?d?u?l?s?l +?d?u?u?d?u?l?s?u +?d?u?u?d?u?l?s?s +?d?u?u?d?u?u?l?s +?d?u?u?d?u?u?s?l +?d?u?u?d?u?s?d?l +?d?u?u?d?u?s?l?d +?d?u?u?d?u?s?l?l +?d?u?u?d?u?s?l?u +?d?u?u?d?u?s?l?s +?d?u?u?d?u?s?u?l +?d?u?u?d?u?s?s?l +?d?u?u?d?s?d?d?l +?d?u?u?d?s?d?l?d +?d?u?u?d?s?d?l?l +?d?u?u?d?s?d?l?u +?d?u?u?d?s?d?l?s +?d?u?u?d?s?d?u?l +?d?u?u?d?s?d?s?l +?d?u?u?d?s?l?d?d +?d?u?u?d?s?l?d?l +?d?u?u?d?s?l?d?u +?d?u?u?d?s?l?d?s +?d?u?u?d?s?l?l?d +?d?u?u?d?s?l?l?l +?d?u?u?d?s?l?l?u +?d?u?u?d?s?l?l?s +?d?u?u?d?s?l?u?d +?d?u?u?d?s?l?u?l +?d?u?u?d?s?l?u?u +?d?u?u?d?s?l?u?s +?d?u?u?d?s?l?s?d +?d?u?u?d?s?l?s?l +?d?u?u?d?s?l?s?u +?d?u?u?d?s?l?s?s +?d?u?u?d?s?u?d?l +?d?u?u?d?s?u?l?d +?d?u?u?d?s?u?l?l +?d?u?u?d?s?u?l?u +?d?u?u?d?s?u?l?s +?d?u?u?d?s?u?u?l +?d?u?u?d?s?u?s?l +?d?u?u?d?s?s?d?l +?d?u?u?d?s?s?l?d +?d?u?u?d?s?s?l?l +?d?u?u?d?s?s?l?u +?d?u?u?d?s?s?l?s +?d?u?u?d?s?s?u?l +?d?u?u?d?s?s?s?l +?d?u?u?l?d?d?d?s +?d?u?u?l?d?d?l?s +?d?u?u?l?d?d?u?s +?d?u?u?l?d?d?s?d +?d?u?u?l?d?d?s?l +?d?u?u?l?d?d?s?u +?d?u?u?l?d?d?s?s +?d?u?u?l?d?l?d?s +?d?u?u?l?d?l?l?s +?d?u?u?l?d?l?u?s +?d?u?u?l?d?l?s?d +?d?u?u?l?d?l?s?l +?d?u?u?l?d?l?s?u +?d?u?u?l?d?l?s?s +?d?u?u?l?d?u?d?s +?d?u?u?l?d?u?l?s +?d?u?u?l?d?u?u?s +?d?u?u?l?d?u?s?d +?d?u?u?l?d?u?s?l +?d?u?u?l?d?u?s?u +?d?u?u?l?d?u?s?s +?d?u?u?l?d?s?d?d +?d?u?u?l?d?s?d?l +?d?u?u?l?d?s?d?u +?d?u?u?l?d?s?d?s +?d?u?u?l?d?s?l?d +?d?u?u?l?d?s?l?l +?d?u?u?l?d?s?l?u +?d?u?u?l?d?s?l?s +?d?u?u?l?d?s?u?d +?d?u?u?l?d?s?u?l +?d?u?u?l?d?s?u?u +?d?u?u?l?d?s?u?s +?d?u?u?l?d?s?s?d +?d?u?u?l?d?s?s?l +?d?u?u?l?d?s?s?u +?d?u?u?l?d?s?s?s +?d?u?u?l?l?d?d?s +?d?u?u?l?l?d?l?s +?d?u?u?l?l?d?u?s +?d?u?u?l?l?d?s?d +?d?u?u?l?l?d?s?l +?d?u?u?l?l?d?s?u +?d?u?u?l?l?d?s?s +?d?u?u?l?l?l?d?s +?d?u?u?l?l?l?l?s +?d?u?u?l?l?l?u?s +?d?u?u?l?l?l?s?d +?d?u?u?l?l?l?s?l +?d?u?u?l?l?l?s?u +?d?u?u?l?l?l?s?s +?d?u?u?l?l?u?d?s +?d?u?u?l?l?u?l?s +?d?u?u?l?l?u?u?s +?d?u?u?l?l?u?s?d +?d?u?u?l?l?u?s?l +?d?u?u?l?l?u?s?u +?d?u?u?l?l?u?s?s +?d?u?u?l?l?s?d?d +?d?u?u?l?l?s?d?l +?d?u?u?l?l?s?d?u +?d?u?u?l?l?s?d?s +?d?u?u?l?l?s?l?d +?d?u?u?l?l?s?l?l +?d?u?u?l?l?s?l?u +?d?u?u?l?l?s?l?s +?d?u?u?l?l?s?u?d +?d?u?u?l?l?s?u?l +?d?u?u?l?l?s?u?u +?d?u?u?l?l?s?u?s +?d?u?u?l?l?s?s?d +?d?u?u?l?l?s?s?l +?d?u?u?l?l?s?s?u +?d?u?u?l?l?s?s?s +?d?u?u?l?u?d?d?s +?d?u?u?l?u?d?l?s +?d?u?u?l?u?d?u?s +?d?u?u?l?u?d?s?d +?d?u?u?l?u?d?s?l +?d?u?u?l?u?d?s?u +?d?u?u?l?u?d?s?s +?d?u?u?l?u?l?d?s +?d?u?u?l?u?l?l?s +?d?u?u?l?u?l?u?s +?d?u?u?l?u?l?s?d +?d?u?u?l?u?l?s?l +?d?u?u?l?u?l?s?u +?d?u?u?l?u?l?s?s +?d?u?u?l?u?u?d?s +?d?u?u?l?u?u?l?s +?d?u?u?l?u?u?u?s +?d?u?u?l?u?u?s?d +?d?u?u?l?u?u?s?l +?d?u?u?l?u?u?s?u +?d?u?u?l?u?u?s?s +?d?u?u?l?u?s?d?d +?d?u?u?l?u?s?d?l +?d?u?u?l?u?s?d?u +?d?u?u?l?u?s?d?s +?d?u?u?l?u?s?l?d +?d?u?u?l?u?s?l?l +?d?u?u?l?u?s?l?u +?d?u?u?l?u?s?l?s +?d?u?u?l?u?s?u?d +?d?u?u?l?u?s?u?l +?d?u?u?l?u?s?u?u +?d?u?u?l?u?s?u?s +?d?u?u?l?u?s?s?d +?d?u?u?l?u?s?s?l +?d?u?u?l?u?s?s?u +?d?u?u?l?u?s?s?s +?d?u?u?l?s?d?d?d +?d?u?u?l?s?d?d?l +?d?u?u?l?s?d?d?u +?d?u?u?l?s?d?d?s +?d?u?u?l?s?d?l?d +?d?u?u?l?s?d?l?l +?d?u?u?l?s?d?l?u +?d?u?u?l?s?d?l?s +?d?u?u?l?s?d?u?d +?d?u?u?l?s?d?u?l +?d?u?u?l?s?d?u?u +?d?u?u?l?s?d?u?s +?d?u?u?l?s?d?s?d +?d?u?u?l?s?d?s?l +?d?u?u?l?s?d?s?u +?d?u?u?l?s?d?s?s +?d?u?u?l?s?l?d?d +?d?u?u?l?s?l?d?l +?d?u?u?l?s?l?d?u +?d?u?u?l?s?l?d?s +?d?u?u?l?s?l?l?d +?d?u?u?l?s?l?l?l +?d?u?u?l?s?l?l?u +?d?u?u?l?s?l?l?s +?d?u?u?l?s?l?u?d +?d?u?u?l?s?l?u?l +?d?u?u?l?s?l?u?u +?d?u?u?l?s?l?u?s +?d?u?u?l?s?l?s?d +?d?u?u?l?s?l?s?l +?d?u?u?l?s?l?s?u +?d?u?u?l?s?l?s?s +?d?u?u?l?s?u?d?d +?d?u?u?l?s?u?d?l +?d?u?u?l?s?u?d?u +?d?u?u?l?s?u?d?s +?d?u?u?l?s?u?l?d +?d?u?u?l?s?u?l?l +?d?u?u?l?s?u?l?u +?d?u?u?l?s?u?l?s +?d?u?u?l?s?u?u?d +?d?u?u?l?s?u?u?l +?d?u?u?l?s?u?u?u +?d?u?u?l?s?u?u?s +?d?u?u?l?s?u?s?d +?d?u?u?l?s?u?s?l +?d?u?u?l?s?u?s?u +?d?u?u?l?s?u?s?s +?d?u?u?l?s?s?d?d +?d?u?u?l?s?s?d?l +?d?u?u?l?s?s?d?u +?d?u?u?l?s?s?d?s +?d?u?u?l?s?s?l?d +?d?u?u?l?s?s?l?l +?d?u?u?l?s?s?l?u +?d?u?u?l?s?s?l?s +?d?u?u?l?s?s?u?d +?d?u?u?l?s?s?u?l +?d?u?u?l?s?s?u?u +?d?u?u?l?s?s?u?s +?d?u?u?l?s?s?s?d +?d?u?u?l?s?s?s?l +?d?u?u?l?s?s?s?u +?d?u?u?l?s?s?s?s +?d?u?u?u?d?d?l?s +?d?u?u?u?d?d?s?l +?d?u?u?u?d?l?d?s +?d?u?u?u?d?l?l?s +?d?u?u?u?d?l?u?s +?d?u?u?u?d?l?s?d +?d?u?u?u?d?l?s?l +?d?u?u?u?d?l?s?u +?d?u?u?u?d?l?s?s +?d?u?u?u?d?u?l?s +?d?u?u?u?d?u?s?l +?d?u?u?u?d?s?d?l +?d?u?u?u?d?s?l?d +?d?u?u?u?d?s?l?l +?d?u?u?u?d?s?l?u +?d?u?u?u?d?s?l?s +?d?u?u?u?d?s?u?l +?d?u?u?u?d?s?s?l +?d?u?u?u?l?d?d?s +?d?u?u?u?l?d?l?s +?d?u?u?u?l?d?u?s +?d?u?u?u?l?d?s?d +?d?u?u?u?l?d?s?l +?d?u?u?u?l?d?s?u +?d?u?u?u?l?d?s?s +?d?u?u?u?l?l?d?s +?d?u?u?u?l?l?l?s +?d?u?u?u?l?l?u?s +?d?u?u?u?l?l?s?d +?d?u?u?u?l?l?s?l +?d?u?u?u?l?l?s?u +?d?u?u?u?l?l?s?s +?d?u?u?u?l?u?d?s +?d?u?u?u?l?u?l?s +?d?u?u?u?l?u?u?s +?d?u?u?u?l?u?s?d +?d?u?u?u?l?u?s?l +?d?u?u?u?l?u?s?u +?d?u?u?u?l?u?s?s +?d?u?u?u?l?s?d?d +?d?u?u?u?l?s?d?l +?d?u?u?u?l?s?d?u +?d?u?u?u?l?s?d?s +?d?u?u?u?l?s?l?d +?d?u?u?u?l?s?l?l +?d?u?u?u?l?s?l?u +?d?u?u?u?l?s?l?s +?d?u?u?u?l?s?u?d +?d?u?u?u?l?s?u?l +?d?u?u?u?l?s?u?u +?d?u?u?u?l?s?u?s +?d?u?u?u?l?s?s?d +?d?u?u?u?l?s?s?l +?d?u?u?u?l?s?s?u +?d?u?u?u?l?s?s?s +?d?u?u?u?u?d?l?s +?d?u?u?u?u?d?s?l +?d?u?u?u?u?l?d?s +?d?u?u?u?u?l?l?s +?d?u?u?u?u?l?u?s +?d?u?u?u?u?l?s?d +?d?u?u?u?u?l?s?l +?d?u?u?u?u?l?s?u +?d?u?u?u?u?l?s?s +?d?u?u?u?u?u?l?s +?d?u?u?u?u?u?s?l +?d?u?u?u?u?s?d?l +?d?u?u?u?u?s?l?d +?d?u?u?u?u?s?l?l +?d?u?u?u?u?s?l?u +?d?u?u?u?u?s?l?s +?d?u?u?u?u?s?u?l +?d?u?u?u?u?s?s?l +?d?u?u?u?s?d?d?l +?d?u?u?u?s?d?l?d +?d?u?u?u?s?d?l?l +?d?u?u?u?s?d?l?u +?d?u?u?u?s?d?l?s +?d?u?u?u?s?d?u?l +?d?u?u?u?s?d?s?l +?d?u?u?u?s?l?d?d +?d?u?u?u?s?l?d?l +?d?u?u?u?s?l?d?u +?d?u?u?u?s?l?d?s +?d?u?u?u?s?l?l?d +?d?u?u?u?s?l?l?l +?d?u?u?u?s?l?l?u +?d?u?u?u?s?l?l?s +?d?u?u?u?s?l?u?d +?d?u?u?u?s?l?u?l +?d?u?u?u?s?l?u?u +?d?u?u?u?s?l?u?s +?d?u?u?u?s?l?s?d +?d?u?u?u?s?l?s?l +?d?u?u?u?s?l?s?u +?d?u?u?u?s?l?s?s +?d?u?u?u?s?u?d?l +?d?u?u?u?s?u?l?d +?d?u?u?u?s?u?l?l +?d?u?u?u?s?u?l?u +?d?u?u?u?s?u?l?s +?d?u?u?u?s?u?u?l +?d?u?u?u?s?u?s?l +?d?u?u?u?s?s?d?l +?d?u?u?u?s?s?l?d +?d?u?u?u?s?s?l?l +?d?u?u?u?s?s?l?u +?d?u?u?u?s?s?l?s +?d?u?u?u?s?s?u?l +?d?u?u?u?s?s?s?l +?d?u?u?s?d?d?d?l +?d?u?u?s?d?d?l?d +?d?u?u?s?d?d?l?l +?d?u?u?s?d?d?l?u +?d?u?u?s?d?d?l?s +?d?u?u?s?d?d?u?l +?d?u?u?s?d?d?s?l +?d?u?u?s?d?l?d?d +?d?u?u?s?d?l?d?l +?d?u?u?s?d?l?d?u +?d?u?u?s?d?l?d?s +?d?u?u?s?d?l?l?d +?d?u?u?s?d?l?l?l +?d?u?u?s?d?l?l?u +?d?u?u?s?d?l?l?s +?d?u?u?s?d?l?u?d +?d?u?u?s?d?l?u?l +?d?u?u?s?d?l?u?u +?d?u?u?s?d?l?u?s +?d?u?u?s?d?l?s?d +?d?u?u?s?d?l?s?l +?d?u?u?s?d?l?s?u +?d?u?u?s?d?l?s?s +?d?u?u?s?d?u?d?l +?d?u?u?s?d?u?l?d +?d?u?u?s?d?u?l?l +?d?u?u?s?d?u?l?u +?d?u?u?s?d?u?l?s +?d?u?u?s?d?u?u?l +?d?u?u?s?d?u?s?l +?d?u?u?s?d?s?d?l +?d?u?u?s?d?s?l?d +?d?u?u?s?d?s?l?l +?d?u?u?s?d?s?l?u +?d?u?u?s?d?s?l?s +?d?u?u?s?d?s?u?l +?d?u?u?s?d?s?s?l +?d?u?u?s?l?d?d?d +?d?u?u?s?l?d?d?l +?d?u?u?s?l?d?d?u +?d?u?u?s?l?d?d?s +?d?u?u?s?l?d?l?d +?d?u?u?s?l?d?l?l +?d?u?u?s?l?d?l?u +?d?u?u?s?l?d?l?s +?d?u?u?s?l?d?u?d +?d?u?u?s?l?d?u?l +?d?u?u?s?l?d?u?u +?d?u?u?s?l?d?u?s +?d?u?u?s?l?d?s?d +?d?u?u?s?l?d?s?l +?d?u?u?s?l?d?s?u +?d?u?u?s?l?d?s?s +?d?u?u?s?l?l?d?d +?d?u?u?s?l?l?d?l +?d?u?u?s?l?l?d?u +?d?u?u?s?l?l?d?s +?d?u?u?s?l?l?l?d +?d?u?u?s?l?l?l?l +?d?u?u?s?l?l?l?u +?d?u?u?s?l?l?l?s +?d?u?u?s?l?l?u?d +?d?u?u?s?l?l?u?l +?d?u?u?s?l?l?u?u +?d?u?u?s?l?l?u?s +?d?u?u?s?l?l?s?d +?d?u?u?s?l?l?s?l +?d?u?u?s?l?l?s?u +?d?u?u?s?l?l?s?s +?d?u?u?s?l?u?d?d +?d?u?u?s?l?u?d?l +?d?u?u?s?l?u?d?u +?d?u?u?s?l?u?d?s +?d?u?u?s?l?u?l?d +?d?u?u?s?l?u?l?l +?d?u?u?s?l?u?l?u +?d?u?u?s?l?u?l?s +?d?u?u?s?l?u?u?d +?d?u?u?s?l?u?u?l +?d?u?u?s?l?u?u?u +?d?u?u?s?l?u?u?s +?d?u?u?s?l?u?s?d +?d?u?u?s?l?u?s?l +?d?u?u?s?l?u?s?u +?d?u?u?s?l?u?s?s +?d?u?u?s?l?s?d?d +?d?u?u?s?l?s?d?l +?d?u?u?s?l?s?d?u +?d?u?u?s?l?s?d?s +?d?u?u?s?l?s?l?d +?d?u?u?s?l?s?l?l +?d?u?u?s?l?s?l?u +?d?u?u?s?l?s?l?s +?d?u?u?s?l?s?u?d +?d?u?u?s?l?s?u?l +?d?u?u?s?l?s?u?u +?d?u?u?s?l?s?u?s +?d?u?u?s?l?s?s?d +?d?u?u?s?l?s?s?l +?d?u?u?s?l?s?s?u +?d?u?u?s?l?s?s?s +?d?u?u?s?u?d?d?l +?d?u?u?s?u?d?l?d +?d?u?u?s?u?d?l?l +?d?u?u?s?u?d?l?u +?d?u?u?s?u?d?l?s +?d?u?u?s?u?d?u?l +?d?u?u?s?u?d?s?l +?d?u?u?s?u?l?d?d +?d?u?u?s?u?l?d?l +?d?u?u?s?u?l?d?u +?d?u?u?s?u?l?d?s +?d?u?u?s?u?l?l?d +?d?u?u?s?u?l?l?l +?d?u?u?s?u?l?l?u +?d?u?u?s?u?l?l?s +?d?u?u?s?u?l?u?d +?d?u?u?s?u?l?u?l +?d?u?u?s?u?l?u?u +?d?u?u?s?u?l?u?s +?d?u?u?s?u?l?s?d +?d?u?u?s?u?l?s?l +?d?u?u?s?u?l?s?u +?d?u?u?s?u?l?s?s +?d?u?u?s?u?u?d?l +?d?u?u?s?u?u?l?d +?d?u?u?s?u?u?l?l +?d?u?u?s?u?u?l?u +?d?u?u?s?u?u?l?s +?d?u?u?s?u?u?u?l +?d?u?u?s?u?u?s?l +?d?u?u?s?u?s?d?l +?d?u?u?s?u?s?l?d +?d?u?u?s?u?s?l?l +?d?u?u?s?u?s?l?u +?d?u?u?s?u?s?l?s +?d?u?u?s?u?s?u?l +?d?u?u?s?u?s?s?l +?d?u?u?s?s?d?d?l +?d?u?u?s?s?d?l?d +?d?u?u?s?s?d?l?l +?d?u?u?s?s?d?l?u +?d?u?u?s?s?d?l?s +?d?u?u?s?s?d?u?l +?d?u?u?s?s?d?s?l +?d?u?u?s?s?l?d?d +?d?u?u?s?s?l?d?l +?d?u?u?s?s?l?d?u +?d?u?u?s?s?l?d?s +?d?u?u?s?s?l?l?d +?d?u?u?s?s?l?l?l +?d?u?u?s?s?l?l?u +?d?u?u?s?s?l?l?s +?d?u?u?s?s?l?u?d +?d?u?u?s?s?l?u?l +?d?u?u?s?s?l?u?u +?d?u?u?s?s?l?u?s +?d?u?u?s?s?l?s?d +?d?u?u?s?s?l?s?l +?d?u?u?s?s?l?s?u +?d?u?u?s?s?l?s?s +?d?u?u?s?s?u?d?l +?d?u?u?s?s?u?l?d +?d?u?u?s?s?u?l?l +?d?u?u?s?s?u?l?u +?d?u?u?s?s?u?l?s +?d?u?u?s?s?u?u?l +?d?u?u?s?s?u?s?l +?d?u?u?s?s?s?d?l +?d?u?u?s?s?s?l?d +?d?u?u?s?s?s?l?l +?d?u?u?s?s?s?l?u +?d?u?u?s?s?s?l?s +?d?u?u?s?s?s?u?l +?d?u?u?s?s?s?s?l +?d?u?s?d?d?d?d?l +?d?u?s?d?d?d?l?d +?d?u?s?d?d?d?l?l +?d?u?s?d?d?d?l?u +?d?u?s?d?d?d?l?s +?d?u?s?d?d?d?u?l +?d?u?s?d?d?d?s?l +?d?u?s?d?d?l?d?d +?d?u?s?d?d?l?d?l +?d?u?s?d?d?l?d?u +?d?u?s?d?d?l?d?s +?d?u?s?d?d?l?l?d +?d?u?s?d?d?l?l?l +?d?u?s?d?d?l?l?u +?d?u?s?d?d?l?l?s +?d?u?s?d?d?l?u?d +?d?u?s?d?d?l?u?l +?d?u?s?d?d?l?u?u +?d?u?s?d?d?l?u?s +?d?u?s?d?d?l?s?d +?d?u?s?d?d?l?s?l +?d?u?s?d?d?l?s?u +?d?u?s?d?d?l?s?s +?d?u?s?d?d?u?d?l +?d?u?s?d?d?u?l?d +?d?u?s?d?d?u?l?l +?d?u?s?d?d?u?l?u +?d?u?s?d?d?u?l?s +?d?u?s?d?d?u?u?l +?d?u?s?d?d?u?s?l +?d?u?s?d?d?s?d?l +?d?u?s?d?d?s?l?d +?d?u?s?d?d?s?l?l +?d?u?s?d?d?s?l?u +?d?u?s?d?d?s?l?s +?d?u?s?d?d?s?u?l +?d?u?s?d?d?s?s?l +?d?u?s?d?l?d?d?d +?d?u?s?d?l?d?d?l +?d?u?s?d?l?d?d?u +?d?u?s?d?l?d?d?s +?d?u?s?d?l?d?l?d +?d?u?s?d?l?d?l?l +?d?u?s?d?l?d?l?u +?d?u?s?d?l?d?l?s +?d?u?s?d?l?d?u?d +?d?u?s?d?l?d?u?l +?d?u?s?d?l?d?u?u +?d?u?s?d?l?d?u?s +?d?u?s?d?l?d?s?d +?d?u?s?d?l?d?s?l +?d?u?s?d?l?d?s?u +?d?u?s?d?l?d?s?s +?d?u?s?d?l?l?d?d +?d?u?s?d?l?l?d?l +?d?u?s?d?l?l?d?u +?d?u?s?d?l?l?d?s +?d?u?s?d?l?l?l?d +?d?u?s?d?l?l?l?l +?d?u?s?d?l?l?l?u +?d?u?s?d?l?l?l?s +?d?u?s?d?l?l?u?d +?d?u?s?d?l?l?u?l +?d?u?s?d?l?l?u?u +?d?u?s?d?l?l?u?s +?d?u?s?d?l?l?s?d +?d?u?s?d?l?l?s?l +?d?u?s?d?l?l?s?u +?d?u?s?d?l?l?s?s +?d?u?s?d?l?u?d?d +?d?u?s?d?l?u?d?l +?d?u?s?d?l?u?d?u +?d?u?s?d?l?u?d?s +?d?u?s?d?l?u?l?d +?d?u?s?d?l?u?l?l +?d?u?s?d?l?u?l?u +?d?u?s?d?l?u?l?s +?d?u?s?d?l?u?u?d +?d?u?s?d?l?u?u?l +?d?u?s?d?l?u?u?u +?d?u?s?d?l?u?u?s +?d?u?s?d?l?u?s?d +?d?u?s?d?l?u?s?l +?d?u?s?d?l?u?s?u +?d?u?s?d?l?u?s?s +?d?u?s?d?l?s?d?d +?d?u?s?d?l?s?d?l +?d?u?s?d?l?s?d?u +?d?u?s?d?l?s?d?s +?d?u?s?d?l?s?l?d +?d?u?s?d?l?s?l?l +?d?u?s?d?l?s?l?u +?d?u?s?d?l?s?l?s +?d?u?s?d?l?s?u?d +?d?u?s?d?l?s?u?l +?d?u?s?d?l?s?u?u +?d?u?s?d?l?s?u?s +?d?u?s?d?l?s?s?d +?d?u?s?d?l?s?s?l +?d?u?s?d?l?s?s?u +?d?u?s?d?l?s?s?s +?d?u?s?d?u?d?d?l +?d?u?s?d?u?d?l?d +?d?u?s?d?u?d?l?l +?d?u?s?d?u?d?l?u +?d?u?s?d?u?d?l?s +?d?u?s?d?u?d?u?l +?d?u?s?d?u?d?s?l +?d?u?s?d?u?l?d?d +?d?u?s?d?u?l?d?l +?d?u?s?d?u?l?d?u +?d?u?s?d?u?l?d?s +?d?u?s?d?u?l?l?d +?d?u?s?d?u?l?l?l +?d?u?s?d?u?l?l?u +?d?u?s?d?u?l?l?s +?d?u?s?d?u?l?u?d +?d?u?s?d?u?l?u?l +?d?u?s?d?u?l?u?u +?d?u?s?d?u?l?u?s +?d?u?s?d?u?l?s?d +?d?u?s?d?u?l?s?l +?d?u?s?d?u?l?s?u +?d?u?s?d?u?l?s?s +?d?u?s?d?u?u?d?l +?d?u?s?d?u?u?l?d +?d?u?s?d?u?u?l?l +?d?u?s?d?u?u?l?u +?d?u?s?d?u?u?l?s +?d?u?s?d?u?u?u?l +?d?u?s?d?u?u?s?l +?d?u?s?d?u?s?d?l +?d?u?s?d?u?s?l?d +?d?u?s?d?u?s?l?l +?d?u?s?d?u?s?l?u +?d?u?s?d?u?s?l?s +?d?u?s?d?u?s?u?l +?d?u?s?d?u?s?s?l +?d?u?s?d?s?d?d?l +?d?u?s?d?s?d?l?d +?d?u?s?d?s?d?l?l +?d?u?s?d?s?d?l?u +?d?u?s?d?s?d?l?s +?d?u?s?d?s?d?u?l +?d?u?s?d?s?d?s?l +?d?u?s?d?s?l?d?d +?d?u?s?d?s?l?d?l +?d?u?s?d?s?l?d?u +?d?u?s?d?s?l?d?s +?d?u?s?d?s?l?l?d +?d?u?s?d?s?l?l?l +?d?u?s?d?s?l?l?u +?d?u?s?d?s?l?l?s +?d?u?s?d?s?l?u?d +?d?u?s?d?s?l?u?l +?d?u?s?d?s?l?u?u +?d?u?s?d?s?l?u?s +?d?u?s?d?s?l?s?d +?d?u?s?d?s?l?s?l +?d?u?s?d?s?l?s?u +?d?u?s?d?s?l?s?s +?d?u?s?d?s?u?d?l +?d?u?s?d?s?u?l?d +?d?u?s?d?s?u?l?l +?d?u?s?d?s?u?l?u +?d?u?s?d?s?u?l?s +?d?u?s?d?s?u?u?l +?d?u?s?d?s?u?s?l +?d?u?s?d?s?s?d?l +?d?u?s?d?s?s?l?d +?d?u?s?d?s?s?l?l +?d?u?s?d?s?s?l?u +?d?u?s?d?s?s?l?s +?d?u?s?d?s?s?u?l +?d?u?s?d?s?s?s?l +?d?u?s?l?d?d?d?d +?d?u?s?l?d?d?d?l +?d?u?s?l?d?d?d?u +?d?u?s?l?d?d?d?s +?d?u?s?l?d?d?l?d +?d?u?s?l?d?d?l?l +?d?u?s?l?d?d?l?u +?d?u?s?l?d?d?l?s +?d?u?s?l?d?d?u?d +?d?u?s?l?d?d?u?l +?d?u?s?l?d?d?u?u +?d?u?s?l?d?d?u?s +?d?u?s?l?d?d?s?d +?d?u?s?l?d?d?s?l +?d?u?s?l?d?d?s?u +?d?u?s?l?d?d?s?s +?d?u?s?l?d?l?d?d +?d?u?s?l?d?l?d?l +?d?u?s?l?d?l?d?u +?d?u?s?l?d?l?d?s +?d?u?s?l?d?l?l?d +?d?u?s?l?d?l?l?l +?d?u?s?l?d?l?l?u +?d?u?s?l?d?l?l?s +?d?u?s?l?d?l?u?d +?d?u?s?l?d?l?u?l +?d?u?s?l?d?l?u?u +?d?u?s?l?d?l?u?s +?d?u?s?l?d?l?s?d +?d?u?s?l?d?l?s?l +?d?u?s?l?d?l?s?u +?d?u?s?l?d?l?s?s +?d?u?s?l?d?u?d?d +?d?u?s?l?d?u?d?l +?d?u?s?l?d?u?d?u +?d?u?s?l?d?u?d?s +?d?u?s?l?d?u?l?d +?d?u?s?l?d?u?l?l +?d?u?s?l?d?u?l?u +?d?u?s?l?d?u?l?s +?d?u?s?l?d?u?u?d +?d?u?s?l?d?u?u?l +?d?u?s?l?d?u?u?u +?d?u?s?l?d?u?u?s +?d?u?s?l?d?u?s?d +?d?u?s?l?d?u?s?l +?d?u?s?l?d?u?s?u +?d?u?s?l?d?u?s?s +?d?u?s?l?d?s?d?d +?d?u?s?l?d?s?d?l +?d?u?s?l?d?s?d?u +?d?u?s?l?d?s?d?s +?d?u?s?l?d?s?l?d +?d?u?s?l?d?s?l?l +?d?u?s?l?d?s?l?u +?d?u?s?l?d?s?l?s +?d?u?s?l?d?s?u?d +?d?u?s?l?d?s?u?l +?d?u?s?l?d?s?u?u +?d?u?s?l?d?s?u?s +?d?u?s?l?d?s?s?d +?d?u?s?l?d?s?s?l +?d?u?s?l?d?s?s?u +?d?u?s?l?d?s?s?s +?d?u?s?l?l?d?d?d +?d?u?s?l?l?d?d?l +?d?u?s?l?l?d?d?u +?d?u?s?l?l?d?d?s +?d?u?s?l?l?d?l?d +?d?u?s?l?l?d?l?l +?d?u?s?l?l?d?l?u +?d?u?s?l?l?d?l?s +?d?u?s?l?l?d?u?d +?d?u?s?l?l?d?u?l +?d?u?s?l?l?d?u?u +?d?u?s?l?l?d?u?s +?d?u?s?l?l?d?s?d +?d?u?s?l?l?d?s?l +?d?u?s?l?l?d?s?u +?d?u?s?l?l?d?s?s +?d?u?s?l?l?l?d?d +?d?u?s?l?l?l?d?l +?d?u?s?l?l?l?d?u +?d?u?s?l?l?l?d?s +?d?u?s?l?l?l?l?d +?d?u?s?l?l?l?l?l +?d?u?s?l?l?l?l?u +?d?u?s?l?l?l?l?s +?d?u?s?l?l?l?u?d +?d?u?s?l?l?l?u?l +?d?u?s?l?l?l?u?u +?d?u?s?l?l?l?u?s +?d?u?s?l?l?l?s?d +?d?u?s?l?l?l?s?l +?d?u?s?l?l?l?s?u +?d?u?s?l?l?l?s?s +?d?u?s?l?l?u?d?d +?d?u?s?l?l?u?d?l +?d?u?s?l?l?u?d?u +?d?u?s?l?l?u?d?s +?d?u?s?l?l?u?l?d +?d?u?s?l?l?u?l?l +?d?u?s?l?l?u?l?u +?d?u?s?l?l?u?l?s +?d?u?s?l?l?u?u?d +?d?u?s?l?l?u?u?l +?d?u?s?l?l?u?u?u +?d?u?s?l?l?u?u?s +?d?u?s?l?l?u?s?d +?d?u?s?l?l?u?s?l +?d?u?s?l?l?u?s?u +?d?u?s?l?l?u?s?s +?d?u?s?l?l?s?d?d +?d?u?s?l?l?s?d?l +?d?u?s?l?l?s?d?u +?d?u?s?l?l?s?d?s +?d?u?s?l?l?s?l?d +?d?u?s?l?l?s?l?l +?d?u?s?l?l?s?l?u +?d?u?s?l?l?s?l?s +?d?u?s?l?l?s?u?d +?d?u?s?l?l?s?u?l +?d?u?s?l?l?s?u?u +?d?u?s?l?l?s?u?s +?d?u?s?l?l?s?s?d +?d?u?s?l?l?s?s?l +?d?u?s?l?l?s?s?u +?d?u?s?l?l?s?s?s +?d?u?s?l?u?d?d?d +?d?u?s?l?u?d?d?l +?d?u?s?l?u?d?d?u +?d?u?s?l?u?d?d?s +?d?u?s?l?u?d?l?d +?d?u?s?l?u?d?l?l +?d?u?s?l?u?d?l?u +?d?u?s?l?u?d?l?s +?d?u?s?l?u?d?u?d +?d?u?s?l?u?d?u?l +?d?u?s?l?u?d?u?u +?d?u?s?l?u?d?u?s +?d?u?s?l?u?d?s?d +?d?u?s?l?u?d?s?l +?d?u?s?l?u?d?s?u +?d?u?s?l?u?d?s?s +?d?u?s?l?u?l?d?d +?d?u?s?l?u?l?d?l +?d?u?s?l?u?l?d?u +?d?u?s?l?u?l?d?s +?d?u?s?l?u?l?l?d +?d?u?s?l?u?l?l?l +?d?u?s?l?u?l?l?u +?d?u?s?l?u?l?l?s +?d?u?s?l?u?l?u?d +?d?u?s?l?u?l?u?l +?d?u?s?l?u?l?u?u +?d?u?s?l?u?l?u?s +?d?u?s?l?u?l?s?d +?d?u?s?l?u?l?s?l +?d?u?s?l?u?l?s?u +?d?u?s?l?u?l?s?s +?d?u?s?l?u?u?d?d +?d?u?s?l?u?u?d?l +?d?u?s?l?u?u?d?u +?d?u?s?l?u?u?d?s +?d?u?s?l?u?u?l?d +?d?u?s?l?u?u?l?l +?d?u?s?l?u?u?l?u +?d?u?s?l?u?u?l?s +?d?u?s?l?u?u?u?d +?d?u?s?l?u?u?u?l +?d?u?s?l?u?u?u?u +?d?u?s?l?u?u?u?s +?d?u?s?l?u?u?s?d +?d?u?s?l?u?u?s?l +?d?u?s?l?u?u?s?u +?d?u?s?l?u?u?s?s +?d?u?s?l?u?s?d?d +?d?u?s?l?u?s?d?l +?d?u?s?l?u?s?d?u +?d?u?s?l?u?s?d?s +?d?u?s?l?u?s?l?d +?d?u?s?l?u?s?l?l +?d?u?s?l?u?s?l?u +?d?u?s?l?u?s?l?s +?d?u?s?l?u?s?u?d +?d?u?s?l?u?s?u?l +?d?u?s?l?u?s?u?u +?d?u?s?l?u?s?u?s +?d?u?s?l?u?s?s?d +?d?u?s?l?u?s?s?l +?d?u?s?l?u?s?s?u +?d?u?s?l?u?s?s?s +?d?u?s?l?s?d?d?d +?d?u?s?l?s?d?d?l +?d?u?s?l?s?d?d?u +?d?u?s?l?s?d?d?s +?d?u?s?l?s?d?l?d +?d?u?s?l?s?d?l?l +?d?u?s?l?s?d?l?u +?d?u?s?l?s?d?l?s +?d?u?s?l?s?d?u?d +?d?u?s?l?s?d?u?l +?d?u?s?l?s?d?u?u +?d?u?s?l?s?d?u?s +?d?u?s?l?s?d?s?d +?d?u?s?l?s?d?s?l +?d?u?s?l?s?d?s?u +?d?u?s?l?s?d?s?s +?d?u?s?l?s?l?d?d +?d?u?s?l?s?l?d?l +?d?u?s?l?s?l?d?u +?d?u?s?l?s?l?d?s +?d?u?s?l?s?l?l?d +?d?u?s?l?s?l?l?l +?d?u?s?l?s?l?l?u +?d?u?s?l?s?l?l?s +?d?u?s?l?s?l?u?d +?d?u?s?l?s?l?u?l +?d?u?s?l?s?l?u?u +?d?u?s?l?s?l?u?s +?d?u?s?l?s?l?s?d +?d?u?s?l?s?l?s?l +?d?u?s?l?s?l?s?u +?d?u?s?l?s?l?s?s +?d?u?s?l?s?u?d?d +?d?u?s?l?s?u?d?l +?d?u?s?l?s?u?d?u +?d?u?s?l?s?u?d?s +?d?u?s?l?s?u?l?d +?d?u?s?l?s?u?l?l +?d?u?s?l?s?u?l?u +?d?u?s?l?s?u?l?s +?d?u?s?l?s?u?u?d +?d?u?s?l?s?u?u?l +?d?u?s?l?s?u?u?u +?d?u?s?l?s?u?u?s +?d?u?s?l?s?u?s?d +?d?u?s?l?s?u?s?l +?d?u?s?l?s?u?s?u +?d?u?s?l?s?u?s?s +?d?u?s?l?s?s?d?d +?d?u?s?l?s?s?d?l +?d?u?s?l?s?s?d?u +?d?u?s?l?s?s?d?s +?d?u?s?l?s?s?l?d +?d?u?s?l?s?s?l?l +?d?u?s?l?s?s?l?u +?d?u?s?l?s?s?l?s +?d?u?s?l?s?s?u?d +?d?u?s?l?s?s?u?l +?d?u?s?l?s?s?u?u +?d?u?s?l?s?s?u?s +?d?u?s?l?s?s?s?d +?d?u?s?l?s?s?s?l +?d?u?s?l?s?s?s?u +?d?u?s?l?s?s?s?s +?d?u?s?u?d?d?d?l +?d?u?s?u?d?d?l?d +?d?u?s?u?d?d?l?l +?d?u?s?u?d?d?l?u +?d?u?s?u?d?d?l?s +?d?u?s?u?d?d?u?l +?d?u?s?u?d?d?s?l +?d?u?s?u?d?l?d?d +?d?u?s?u?d?l?d?l +?d?u?s?u?d?l?d?u +?d?u?s?u?d?l?d?s +?d?u?s?u?d?l?l?d +?d?u?s?u?d?l?l?l +?d?u?s?u?d?l?l?u +?d?u?s?u?d?l?l?s +?d?u?s?u?d?l?u?d +?d?u?s?u?d?l?u?l +?d?u?s?u?d?l?u?u +?d?u?s?u?d?l?u?s +?d?u?s?u?d?l?s?d +?d?u?s?u?d?l?s?l +?d?u?s?u?d?l?s?u +?d?u?s?u?d?l?s?s +?d?u?s?u?d?u?d?l +?d?u?s?u?d?u?l?d +?d?u?s?u?d?u?l?l +?d?u?s?u?d?u?l?u +?d?u?s?u?d?u?l?s +?d?u?s?u?d?u?u?l +?d?u?s?u?d?u?s?l +?d?u?s?u?d?s?d?l +?d?u?s?u?d?s?l?d +?d?u?s?u?d?s?l?l +?d?u?s?u?d?s?l?u +?d?u?s?u?d?s?l?s +?d?u?s?u?d?s?u?l +?d?u?s?u?d?s?s?l +?d?u?s?u?l?d?d?d +?d?u?s?u?l?d?d?l +?d?u?s?u?l?d?d?u +?d?u?s?u?l?d?d?s +?d?u?s?u?l?d?l?d +?d?u?s?u?l?d?l?l +?d?u?s?u?l?d?l?u +?d?u?s?u?l?d?l?s +?d?u?s?u?l?d?u?d +?d?u?s?u?l?d?u?l +?d?u?s?u?l?d?u?u +?d?u?s?u?l?d?u?s +?d?u?s?u?l?d?s?d +?d?u?s?u?l?d?s?l +?d?u?s?u?l?d?s?u +?d?u?s?u?l?d?s?s +?d?u?s?u?l?l?d?d +?d?u?s?u?l?l?d?l +?d?u?s?u?l?l?d?u +?d?u?s?u?l?l?d?s +?d?u?s?u?l?l?l?d +?d?u?s?u?l?l?l?l +?d?u?s?u?l?l?l?u +?d?u?s?u?l?l?l?s +?d?u?s?u?l?l?u?d +?d?u?s?u?l?l?u?l +?d?u?s?u?l?l?u?u +?d?u?s?u?l?l?u?s +?d?u?s?u?l?l?s?d +?d?u?s?u?l?l?s?l +?d?u?s?u?l?l?s?u +?d?u?s?u?l?l?s?s +?d?u?s?u?l?u?d?d +?d?u?s?u?l?u?d?l +?d?u?s?u?l?u?d?u +?d?u?s?u?l?u?d?s +?d?u?s?u?l?u?l?d +?d?u?s?u?l?u?l?l +?d?u?s?u?l?u?l?u +?d?u?s?u?l?u?l?s +?d?u?s?u?l?u?u?d +?d?u?s?u?l?u?u?l +?d?u?s?u?l?u?u?u +?d?u?s?u?l?u?u?s +?d?u?s?u?l?u?s?d +?d?u?s?u?l?u?s?l +?d?u?s?u?l?u?s?u +?d?u?s?u?l?u?s?s +?d?u?s?u?l?s?d?d +?d?u?s?u?l?s?d?l +?d?u?s?u?l?s?d?u +?d?u?s?u?l?s?d?s +?d?u?s?u?l?s?l?d +?d?u?s?u?l?s?l?l +?d?u?s?u?l?s?l?u +?d?u?s?u?l?s?l?s +?d?u?s?u?l?s?u?d +?d?u?s?u?l?s?u?l +?d?u?s?u?l?s?u?u +?d?u?s?u?l?s?u?s +?d?u?s?u?l?s?s?d +?d?u?s?u?l?s?s?l +?d?u?s?u?l?s?s?u +?d?u?s?u?l?s?s?s +?d?u?s?u?u?d?d?l +?d?u?s?u?u?d?l?d +?d?u?s?u?u?d?l?l +?d?u?s?u?u?d?l?u +?d?u?s?u?u?d?l?s +?d?u?s?u?u?d?u?l +?d?u?s?u?u?d?s?l +?d?u?s?u?u?l?d?d +?d?u?s?u?u?l?d?l +?d?u?s?u?u?l?d?u +?d?u?s?u?u?l?d?s +?d?u?s?u?u?l?l?d +?d?u?s?u?u?l?l?l +?d?u?s?u?u?l?l?u +?d?u?s?u?u?l?l?s +?d?u?s?u?u?l?u?d +?d?u?s?u?u?l?u?l +?d?u?s?u?u?l?u?u +?d?u?s?u?u?l?u?s +?d?u?s?u?u?l?s?d +?d?u?s?u?u?l?s?l +?d?u?s?u?u?l?s?u +?d?u?s?u?u?l?s?s +?d?u?s?u?u?u?d?l +?d?u?s?u?u?u?l?d +?d?u?s?u?u?u?l?l +?d?u?s?u?u?u?l?u +?d?u?s?u?u?u?l?s +?d?u?s?u?u?u?u?l +?d?u?s?u?u?u?s?l +?d?u?s?u?u?s?d?l +?d?u?s?u?u?s?l?d +?d?u?s?u?u?s?l?l +?d?u?s?u?u?s?l?u +?d?u?s?u?u?s?l?s +?d?u?s?u?u?s?u?l +?d?u?s?u?u?s?s?l +?d?u?s?u?s?d?d?l +?d?u?s?u?s?d?l?d +?d?u?s?u?s?d?l?l +?d?u?s?u?s?d?l?u +?d?u?s?u?s?d?l?s +?d?u?s?u?s?d?u?l +?d?u?s?u?s?d?s?l +?d?u?s?u?s?l?d?d +?d?u?s?u?s?l?d?l +?d?u?s?u?s?l?d?u +?d?u?s?u?s?l?d?s +?d?u?s?u?s?l?l?d +?d?u?s?u?s?l?l?l +?d?u?s?u?s?l?l?u +?d?u?s?u?s?l?l?s +?d?u?s?u?s?l?u?d +?d?u?s?u?s?l?u?l +?d?u?s?u?s?l?u?u +?d?u?s?u?s?l?u?s +?d?u?s?u?s?l?s?d +?d?u?s?u?s?l?s?l +?d?u?s?u?s?l?s?u +?d?u?s?u?s?l?s?s +?d?u?s?u?s?u?d?l +?d?u?s?u?s?u?l?d +?d?u?s?u?s?u?l?l +?d?u?s?u?s?u?l?u +?d?u?s?u?s?u?l?s +?d?u?s?u?s?u?u?l +?d?u?s?u?s?u?s?l +?d?u?s?u?s?s?d?l +?d?u?s?u?s?s?l?d +?d?u?s?u?s?s?l?l +?d?u?s?u?s?s?l?u +?d?u?s?u?s?s?l?s +?d?u?s?u?s?s?u?l +?d?u?s?u?s?s?s?l +?d?u?s?s?d?d?d?l +?d?u?s?s?d?d?l?d +?d?u?s?s?d?d?l?l +?d?u?s?s?d?d?l?u +?d?u?s?s?d?d?l?s +?d?u?s?s?d?d?u?l +?d?u?s?s?d?d?s?l +?d?u?s?s?d?l?d?d +?d?u?s?s?d?l?d?l +?d?u?s?s?d?l?d?u +?d?u?s?s?d?l?d?s +?d?u?s?s?d?l?l?d +?d?u?s?s?d?l?l?l +?d?u?s?s?d?l?l?u +?d?u?s?s?d?l?l?s +?d?u?s?s?d?l?u?d +?d?u?s?s?d?l?u?l +?d?u?s?s?d?l?u?u +?d?u?s?s?d?l?u?s +?d?u?s?s?d?l?s?d +?d?u?s?s?d?l?s?l +?d?u?s?s?d?l?s?u +?d?u?s?s?d?l?s?s +?d?u?s?s?d?u?d?l +?d?u?s?s?d?u?l?d +?d?u?s?s?d?u?l?l +?d?u?s?s?d?u?l?u +?d?u?s?s?d?u?l?s +?d?u?s?s?d?u?u?l +?d?u?s?s?d?u?s?l +?d?u?s?s?d?s?d?l +?d?u?s?s?d?s?l?d +?d?u?s?s?d?s?l?l +?d?u?s?s?d?s?l?u +?d?u?s?s?d?s?l?s +?d?u?s?s?d?s?u?l +?d?u?s?s?d?s?s?l +?d?u?s?s?l?d?d?d +?d?u?s?s?l?d?d?l +?d?u?s?s?l?d?d?u +?d?u?s?s?l?d?d?s +?d?u?s?s?l?d?l?d +?d?u?s?s?l?d?l?l +?d?u?s?s?l?d?l?u +?d?u?s?s?l?d?l?s +?d?u?s?s?l?d?u?d +?d?u?s?s?l?d?u?l +?d?u?s?s?l?d?u?u +?d?u?s?s?l?d?u?s +?d?u?s?s?l?d?s?d +?d?u?s?s?l?d?s?l +?d?u?s?s?l?d?s?u +?d?u?s?s?l?d?s?s +?d?u?s?s?l?l?d?d +?d?u?s?s?l?l?d?l +?d?u?s?s?l?l?d?u +?d?u?s?s?l?l?d?s +?d?u?s?s?l?l?l?d +?d?u?s?s?l?l?l?l +?d?u?s?s?l?l?l?u +?d?u?s?s?l?l?l?s +?d?u?s?s?l?l?u?d +?d?u?s?s?l?l?u?l +?d?u?s?s?l?l?u?u +?d?u?s?s?l?l?u?s +?d?u?s?s?l?l?s?d +?d?u?s?s?l?l?s?l +?d?u?s?s?l?l?s?u +?d?u?s?s?l?l?s?s +?d?u?s?s?l?u?d?d +?d?u?s?s?l?u?d?l +?d?u?s?s?l?u?d?u +?d?u?s?s?l?u?d?s +?d?u?s?s?l?u?l?d +?d?u?s?s?l?u?l?l +?d?u?s?s?l?u?l?u +?d?u?s?s?l?u?l?s +?d?u?s?s?l?u?u?d +?d?u?s?s?l?u?u?l +?d?u?s?s?l?u?u?u +?d?u?s?s?l?u?u?s +?d?u?s?s?l?u?s?d +?d?u?s?s?l?u?s?l +?d?u?s?s?l?u?s?u +?d?u?s?s?l?u?s?s +?d?u?s?s?l?s?d?d +?d?u?s?s?l?s?d?l +?d?u?s?s?l?s?d?u +?d?u?s?s?l?s?d?s +?d?u?s?s?l?s?l?d +?d?u?s?s?l?s?l?l +?d?u?s?s?l?s?l?u +?d?u?s?s?l?s?l?s +?d?u?s?s?l?s?u?d +?d?u?s?s?l?s?u?l +?d?u?s?s?l?s?u?u +?d?u?s?s?l?s?u?s +?d?u?s?s?l?s?s?d +?d?u?s?s?l?s?s?l +?d?u?s?s?l?s?s?u +?d?u?s?s?l?s?s?s +?d?u?s?s?u?d?d?l +?d?u?s?s?u?d?l?d +?d?u?s?s?u?d?l?l +?d?u?s?s?u?d?l?u +?d?u?s?s?u?d?l?s +?d?u?s?s?u?d?u?l +?d?u?s?s?u?d?s?l +?d?u?s?s?u?l?d?d +?d?u?s?s?u?l?d?l +?d?u?s?s?u?l?d?u +?d?u?s?s?u?l?d?s +?d?u?s?s?u?l?l?d +?d?u?s?s?u?l?l?l +?d?u?s?s?u?l?l?u +?d?u?s?s?u?l?l?s +?d?u?s?s?u?l?u?d +?d?u?s?s?u?l?u?l +?d?u?s?s?u?l?u?u +?d?u?s?s?u?l?u?s +?d?u?s?s?u?l?s?d +?d?u?s?s?u?l?s?l +?d?u?s?s?u?l?s?u +?d?u?s?s?u?l?s?s +?d?u?s?s?u?u?d?l +?d?u?s?s?u?u?l?d +?d?u?s?s?u?u?l?l +?d?u?s?s?u?u?l?u +?d?u?s?s?u?u?l?s +?d?u?s?s?u?u?u?l +?d?u?s?s?u?u?s?l +?d?u?s?s?u?s?d?l +?d?u?s?s?u?s?l?d +?d?u?s?s?u?s?l?l +?d?u?s?s?u?s?l?u +?d?u?s?s?u?s?l?s +?d?u?s?s?u?s?u?l +?d?u?s?s?u?s?s?l +?d?u?s?s?s?d?d?l +?d?u?s?s?s?d?l?d +?d?u?s?s?s?d?l?l +?d?u?s?s?s?d?l?u +?d?u?s?s?s?d?l?s +?d?u?s?s?s?d?u?l +?d?u?s?s?s?d?s?l +?d?u?s?s?s?l?d?d +?d?u?s?s?s?l?d?l +?d?u?s?s?s?l?d?u +?d?u?s?s?s?l?d?s +?d?u?s?s?s?l?l?d +?d?u?s?s?s?l?l?l +?d?u?s?s?s?l?l?u +?d?u?s?s?s?l?l?s +?d?u?s?s?s?l?u?d +?d?u?s?s?s?l?u?l +?d?u?s?s?s?l?u?u +?d?u?s?s?s?l?u?s +?d?u?s?s?s?l?s?d +?d?u?s?s?s?l?s?l +?d?u?s?s?s?l?s?u +?d?u?s?s?s?l?s?s +?d?u?s?s?s?u?d?l +?d?u?s?s?s?u?l?d +?d?u?s?s?s?u?l?l +?d?u?s?s?s?u?l?u +?d?u?s?s?s?u?l?s +?d?u?s?s?s?u?u?l +?d?u?s?s?s?u?s?l +?d?u?s?s?s?s?d?l +?d?u?s?s?s?s?l?d +?d?u?s?s?s?s?l?l +?d?u?s?s?s?s?l?u +?d?u?s?s?s?s?l?s +?d?u?s?s?s?s?u?l +?d?u?s?s?s?s?s?l +?d?s?d?d?d?d?l?u +?d?s?d?d?d?d?u?l +?d?s?d?d?d?l?d?u +?d?s?d?d?d?l?l?u +?d?s?d?d?d?l?u?d +?d?s?d?d?d?l?u?l +?d?s?d?d?d?l?u?u +?d?s?d?d?d?l?u?s +?d?s?d?d?d?l?s?u +?d?s?d?d?d?u?d?l +?d?s?d?d?d?u?l?d +?d?s?d?d?d?u?l?l +?d?s?d?d?d?u?l?u +?d?s?d?d?d?u?l?s +?d?s?d?d?d?u?u?l +?d?s?d?d?d?u?s?l +?d?s?d?d?d?s?l?u +?d?s?d?d?d?s?u?l +?d?s?d?d?l?d?d?u +?d?s?d?d?l?d?l?u +?d?s?d?d?l?d?u?d +?d?s?d?d?l?d?u?l +?d?s?d?d?l?d?u?u +?d?s?d?d?l?d?u?s +?d?s?d?d?l?d?s?u +?d?s?d?d?l?l?d?u +?d?s?d?d?l?l?l?u +?d?s?d?d?l?l?u?d +?d?s?d?d?l?l?u?l +?d?s?d?d?l?l?u?u +?d?s?d?d?l?l?u?s +?d?s?d?d?l?l?s?u +?d?s?d?d?l?u?d?d +?d?s?d?d?l?u?d?l +?d?s?d?d?l?u?d?u +?d?s?d?d?l?u?d?s +?d?s?d?d?l?u?l?d +?d?s?d?d?l?u?l?l +?d?s?d?d?l?u?l?u +?d?s?d?d?l?u?l?s +?d?s?d?d?l?u?u?d +?d?s?d?d?l?u?u?l +?d?s?d?d?l?u?u?u +?d?s?d?d?l?u?u?s +?d?s?d?d?l?u?s?d +?d?s?d?d?l?u?s?l +?d?s?d?d?l?u?s?u +?d?s?d?d?l?u?s?s +?d?s?d?d?l?s?d?u +?d?s?d?d?l?s?l?u +?d?s?d?d?l?s?u?d +?d?s?d?d?l?s?u?l +?d?s?d?d?l?s?u?u +?d?s?d?d?l?s?u?s +?d?s?d?d?l?s?s?u +?d?s?d?d?u?d?d?l +?d?s?d?d?u?d?l?d +?d?s?d?d?u?d?l?l +?d?s?d?d?u?d?l?u +?d?s?d?d?u?d?l?s +?d?s?d?d?u?d?u?l +?d?s?d?d?u?d?s?l +?d?s?d?d?u?l?d?d +?d?s?d?d?u?l?d?l +?d?s?d?d?u?l?d?u +?d?s?d?d?u?l?d?s +?d?s?d?d?u?l?l?d +?d?s?d?d?u?l?l?l +?d?s?d?d?u?l?l?u +?d?s?d?d?u?l?l?s +?d?s?d?d?u?l?u?d +?d?s?d?d?u?l?u?l +?d?s?d?d?u?l?u?u +?d?s?d?d?u?l?u?s +?d?s?d?d?u?l?s?d +?d?s?d?d?u?l?s?l +?d?s?d?d?u?l?s?u +?d?s?d?d?u?l?s?s +?d?s?d?d?u?u?d?l +?d?s?d?d?u?u?l?d +?d?s?d?d?u?u?l?l +?d?s?d?d?u?u?l?u +?d?s?d?d?u?u?l?s +?d?s?d?d?u?u?u?l +?d?s?d?d?u?u?s?l +?d?s?d?d?u?s?d?l +?d?s?d?d?u?s?l?d +?d?s?d?d?u?s?l?l +?d?s?d?d?u?s?l?u +?d?s?d?d?u?s?l?s +?d?s?d?d?u?s?u?l +?d?s?d?d?u?s?s?l +?d?s?d?d?s?d?l?u +?d?s?d?d?s?d?u?l +?d?s?d?d?s?l?d?u +?d?s?d?d?s?l?l?u +?d?s?d?d?s?l?u?d +?d?s?d?d?s?l?u?l +?d?s?d?d?s?l?u?u +?d?s?d?d?s?l?u?s +?d?s?d?d?s?l?s?u +?d?s?d?d?s?u?d?l +?d?s?d?d?s?u?l?d +?d?s?d?d?s?u?l?l +?d?s?d?d?s?u?l?u +?d?s?d?d?s?u?l?s +?d?s?d?d?s?u?u?l +?d?s?d?d?s?u?s?l +?d?s?d?d?s?s?l?u +?d?s?d?d?s?s?u?l +?d?s?d?l?d?d?d?u +?d?s?d?l?d?d?l?u +?d?s?d?l?d?d?u?d +?d?s?d?l?d?d?u?l +?d?s?d?l?d?d?u?u +?d?s?d?l?d?d?u?s +?d?s?d?l?d?d?s?u +?d?s?d?l?d?l?d?u +?d?s?d?l?d?l?l?u +?d?s?d?l?d?l?u?d +?d?s?d?l?d?l?u?l +?d?s?d?l?d?l?u?u +?d?s?d?l?d?l?u?s +?d?s?d?l?d?l?s?u +?d?s?d?l?d?u?d?d +?d?s?d?l?d?u?d?l +?d?s?d?l?d?u?d?u +?d?s?d?l?d?u?d?s +?d?s?d?l?d?u?l?d +?d?s?d?l?d?u?l?l +?d?s?d?l?d?u?l?u +?d?s?d?l?d?u?l?s +?d?s?d?l?d?u?u?d +?d?s?d?l?d?u?u?l +?d?s?d?l?d?u?u?u +?d?s?d?l?d?u?u?s +?d?s?d?l?d?u?s?d +?d?s?d?l?d?u?s?l +?d?s?d?l?d?u?s?u +?d?s?d?l?d?u?s?s +?d?s?d?l?d?s?d?u +?d?s?d?l?d?s?l?u +?d?s?d?l?d?s?u?d +?d?s?d?l?d?s?u?l +?d?s?d?l?d?s?u?u +?d?s?d?l?d?s?u?s +?d?s?d?l?d?s?s?u +?d?s?d?l?l?d?d?u +?d?s?d?l?l?d?l?u +?d?s?d?l?l?d?u?d +?d?s?d?l?l?d?u?l +?d?s?d?l?l?d?u?u +?d?s?d?l?l?d?u?s +?d?s?d?l?l?d?s?u +?d?s?d?l?l?l?d?u +?d?s?d?l?l?l?l?u +?d?s?d?l?l?l?u?d +?d?s?d?l?l?l?u?l +?d?s?d?l?l?l?u?u +?d?s?d?l?l?l?u?s +?d?s?d?l?l?l?s?u +?d?s?d?l?l?u?d?d +?d?s?d?l?l?u?d?l +?d?s?d?l?l?u?d?u +?d?s?d?l?l?u?d?s +?d?s?d?l?l?u?l?d +?d?s?d?l?l?u?l?l +?d?s?d?l?l?u?l?u +?d?s?d?l?l?u?l?s +?d?s?d?l?l?u?u?d +?d?s?d?l?l?u?u?l +?d?s?d?l?l?u?u?u +?d?s?d?l?l?u?u?s +?d?s?d?l?l?u?s?d +?d?s?d?l?l?u?s?l +?d?s?d?l?l?u?s?u +?d?s?d?l?l?u?s?s +?d?s?d?l?l?s?d?u +?d?s?d?l?l?s?l?u +?d?s?d?l?l?s?u?d +?d?s?d?l?l?s?u?l +?d?s?d?l?l?s?u?u +?d?s?d?l?l?s?u?s +?d?s?d?l?l?s?s?u +?d?s?d?l?u?d?d?d +?d?s?d?l?u?d?d?l +?d?s?d?l?u?d?d?u +?d?s?d?l?u?d?d?s +?d?s?d?l?u?d?l?d +?d?s?d?l?u?d?l?l +?d?s?d?l?u?d?l?u +?d?s?d?l?u?d?l?s +?d?s?d?l?u?d?u?d +?d?s?d?l?u?d?u?l +?d?s?d?l?u?d?u?u +?d?s?d?l?u?d?u?s +?d?s?d?l?u?d?s?d +?d?s?d?l?u?d?s?l +?d?s?d?l?u?d?s?u +?d?s?d?l?u?d?s?s +?d?s?d?l?u?l?d?d +?d?s?d?l?u?l?d?l +?d?s?d?l?u?l?d?u +?d?s?d?l?u?l?d?s +?d?s?d?l?u?l?l?d +?d?s?d?l?u?l?l?l +?d?s?d?l?u?l?l?u +?d?s?d?l?u?l?l?s +?d?s?d?l?u?l?u?d +?d?s?d?l?u?l?u?l +?d?s?d?l?u?l?u?u +?d?s?d?l?u?l?u?s +?d?s?d?l?u?l?s?d +?d?s?d?l?u?l?s?l +?d?s?d?l?u?l?s?u +?d?s?d?l?u?l?s?s +?d?s?d?l?u?u?d?d +?d?s?d?l?u?u?d?l +?d?s?d?l?u?u?d?u +?d?s?d?l?u?u?d?s +?d?s?d?l?u?u?l?d +?d?s?d?l?u?u?l?l +?d?s?d?l?u?u?l?u +?d?s?d?l?u?u?l?s +?d?s?d?l?u?u?u?d +?d?s?d?l?u?u?u?l +?d?s?d?l?u?u?u?u +?d?s?d?l?u?u?u?s +?d?s?d?l?u?u?s?d +?d?s?d?l?u?u?s?l +?d?s?d?l?u?u?s?u +?d?s?d?l?u?u?s?s +?d?s?d?l?u?s?d?d +?d?s?d?l?u?s?d?l +?d?s?d?l?u?s?d?u +?d?s?d?l?u?s?d?s +?d?s?d?l?u?s?l?d +?d?s?d?l?u?s?l?l +?d?s?d?l?u?s?l?u +?d?s?d?l?u?s?l?s +?d?s?d?l?u?s?u?d +?d?s?d?l?u?s?u?l +?d?s?d?l?u?s?u?u +?d?s?d?l?u?s?u?s +?d?s?d?l?u?s?s?d +?d?s?d?l?u?s?s?l +?d?s?d?l?u?s?s?u +?d?s?d?l?u?s?s?s +?d?s?d?l?s?d?d?u +?d?s?d?l?s?d?l?u +?d?s?d?l?s?d?u?d +?d?s?d?l?s?d?u?l +?d?s?d?l?s?d?u?u +?d?s?d?l?s?d?u?s +?d?s?d?l?s?d?s?u +?d?s?d?l?s?l?d?u +?d?s?d?l?s?l?l?u +?d?s?d?l?s?l?u?d +?d?s?d?l?s?l?u?l +?d?s?d?l?s?l?u?u +?d?s?d?l?s?l?u?s +?d?s?d?l?s?l?s?u +?d?s?d?l?s?u?d?d +?d?s?d?l?s?u?d?l +?d?s?d?l?s?u?d?u +?d?s?d?l?s?u?d?s +?d?s?d?l?s?u?l?d +?d?s?d?l?s?u?l?l +?d?s?d?l?s?u?l?u +?d?s?d?l?s?u?l?s +?d?s?d?l?s?u?u?d +?d?s?d?l?s?u?u?l +?d?s?d?l?s?u?u?u +?d?s?d?l?s?u?u?s +?d?s?d?l?s?u?s?d +?d?s?d?l?s?u?s?l +?d?s?d?l?s?u?s?u +?d?s?d?l?s?u?s?s +?d?s?d?l?s?s?d?u +?d?s?d?l?s?s?l?u +?d?s?d?l?s?s?u?d +?d?s?d?l?s?s?u?l +?d?s?d?l?s?s?u?u +?d?s?d?l?s?s?u?s +?d?s?d?l?s?s?s?u +?d?s?d?u?d?d?d?l +?d?s?d?u?d?d?l?d +?d?s?d?u?d?d?l?l +?d?s?d?u?d?d?l?u +?d?s?d?u?d?d?l?s +?d?s?d?u?d?d?u?l +?d?s?d?u?d?d?s?l +?d?s?d?u?d?l?d?d +?d?s?d?u?d?l?d?l +?d?s?d?u?d?l?d?u +?d?s?d?u?d?l?d?s +?d?s?d?u?d?l?l?d +?d?s?d?u?d?l?l?l +?d?s?d?u?d?l?l?u +?d?s?d?u?d?l?l?s +?d?s?d?u?d?l?u?d +?d?s?d?u?d?l?u?l +?d?s?d?u?d?l?u?u +?d?s?d?u?d?l?u?s +?d?s?d?u?d?l?s?d +?d?s?d?u?d?l?s?l +?d?s?d?u?d?l?s?u +?d?s?d?u?d?l?s?s +?d?s?d?u?d?u?d?l +?d?s?d?u?d?u?l?d +?d?s?d?u?d?u?l?l +?d?s?d?u?d?u?l?u +?d?s?d?u?d?u?l?s +?d?s?d?u?d?u?u?l +?d?s?d?u?d?u?s?l +?d?s?d?u?d?s?d?l +?d?s?d?u?d?s?l?d +?d?s?d?u?d?s?l?l +?d?s?d?u?d?s?l?u +?d?s?d?u?d?s?l?s +?d?s?d?u?d?s?u?l +?d?s?d?u?d?s?s?l +?d?s?d?u?l?d?d?d +?d?s?d?u?l?d?d?l +?d?s?d?u?l?d?d?u +?d?s?d?u?l?d?d?s +?d?s?d?u?l?d?l?d +?d?s?d?u?l?d?l?l +?d?s?d?u?l?d?l?u +?d?s?d?u?l?d?l?s +?d?s?d?u?l?d?u?d +?d?s?d?u?l?d?u?l +?d?s?d?u?l?d?u?u +?d?s?d?u?l?d?u?s +?d?s?d?u?l?d?s?d +?d?s?d?u?l?d?s?l +?d?s?d?u?l?d?s?u +?d?s?d?u?l?d?s?s +?d?s?d?u?l?l?d?d +?d?s?d?u?l?l?d?l +?d?s?d?u?l?l?d?u +?d?s?d?u?l?l?d?s +?d?s?d?u?l?l?l?d +?d?s?d?u?l?l?l?l +?d?s?d?u?l?l?l?u +?d?s?d?u?l?l?l?s +?d?s?d?u?l?l?u?d +?d?s?d?u?l?l?u?l +?d?s?d?u?l?l?u?u +?d?s?d?u?l?l?u?s +?d?s?d?u?l?l?s?d +?d?s?d?u?l?l?s?l +?d?s?d?u?l?l?s?u +?d?s?d?u?l?l?s?s +?d?s?d?u?l?u?d?d +?d?s?d?u?l?u?d?l +?d?s?d?u?l?u?d?u +?d?s?d?u?l?u?d?s +?d?s?d?u?l?u?l?d +?d?s?d?u?l?u?l?l +?d?s?d?u?l?u?l?u +?d?s?d?u?l?u?l?s +?d?s?d?u?l?u?u?d +?d?s?d?u?l?u?u?l +?d?s?d?u?l?u?u?u +?d?s?d?u?l?u?u?s +?d?s?d?u?l?u?s?d +?d?s?d?u?l?u?s?l +?d?s?d?u?l?u?s?u +?d?s?d?u?l?u?s?s +?d?s?d?u?l?s?d?d +?d?s?d?u?l?s?d?l +?d?s?d?u?l?s?d?u +?d?s?d?u?l?s?d?s +?d?s?d?u?l?s?l?d +?d?s?d?u?l?s?l?l +?d?s?d?u?l?s?l?u +?d?s?d?u?l?s?l?s +?d?s?d?u?l?s?u?d +?d?s?d?u?l?s?u?l +?d?s?d?u?l?s?u?u +?d?s?d?u?l?s?u?s +?d?s?d?u?l?s?s?d +?d?s?d?u?l?s?s?l +?d?s?d?u?l?s?s?u +?d?s?d?u?l?s?s?s +?d?s?d?u?u?d?d?l +?d?s?d?u?u?d?l?d +?d?s?d?u?u?d?l?l +?d?s?d?u?u?d?l?u +?d?s?d?u?u?d?l?s +?d?s?d?u?u?d?u?l +?d?s?d?u?u?d?s?l +?d?s?d?u?u?l?d?d +?d?s?d?u?u?l?d?l +?d?s?d?u?u?l?d?u +?d?s?d?u?u?l?d?s +?d?s?d?u?u?l?l?d +?d?s?d?u?u?l?l?l +?d?s?d?u?u?l?l?u +?d?s?d?u?u?l?l?s +?d?s?d?u?u?l?u?d +?d?s?d?u?u?l?u?l +?d?s?d?u?u?l?u?u +?d?s?d?u?u?l?u?s +?d?s?d?u?u?l?s?d +?d?s?d?u?u?l?s?l +?d?s?d?u?u?l?s?u +?d?s?d?u?u?l?s?s +?d?s?d?u?u?u?d?l +?d?s?d?u?u?u?l?d +?d?s?d?u?u?u?l?l +?d?s?d?u?u?u?l?u +?d?s?d?u?u?u?l?s +?d?s?d?u?u?u?u?l +?d?s?d?u?u?u?s?l +?d?s?d?u?u?s?d?l +?d?s?d?u?u?s?l?d +?d?s?d?u?u?s?l?l +?d?s?d?u?u?s?l?u +?d?s?d?u?u?s?l?s +?d?s?d?u?u?s?u?l +?d?s?d?u?u?s?s?l +?d?s?d?u?s?d?d?l +?d?s?d?u?s?d?l?d +?d?s?d?u?s?d?l?l +?d?s?d?u?s?d?l?u +?d?s?d?u?s?d?l?s +?d?s?d?u?s?d?u?l +?d?s?d?u?s?d?s?l +?d?s?d?u?s?l?d?d +?d?s?d?u?s?l?d?l +?d?s?d?u?s?l?d?u +?d?s?d?u?s?l?d?s +?d?s?d?u?s?l?l?d +?d?s?d?u?s?l?l?l +?d?s?d?u?s?l?l?u +?d?s?d?u?s?l?l?s +?d?s?d?u?s?l?u?d +?d?s?d?u?s?l?u?l +?d?s?d?u?s?l?u?u +?d?s?d?u?s?l?u?s +?d?s?d?u?s?l?s?d +?d?s?d?u?s?l?s?l +?d?s?d?u?s?l?s?u +?d?s?d?u?s?l?s?s +?d?s?d?u?s?u?d?l +?d?s?d?u?s?u?l?d +?d?s?d?u?s?u?l?l +?d?s?d?u?s?u?l?u +?d?s?d?u?s?u?l?s +?d?s?d?u?s?u?u?l +?d?s?d?u?s?u?s?l +?d?s?d?u?s?s?d?l +?d?s?d?u?s?s?l?d +?d?s?d?u?s?s?l?l +?d?s?d?u?s?s?l?u +?d?s?d?u?s?s?l?s +?d?s?d?u?s?s?u?l +?d?s?d?u?s?s?s?l +?d?s?d?s?d?d?l?u +?d?s?d?s?d?d?u?l +?d?s?d?s?d?l?d?u +?d?s?d?s?d?l?l?u +?d?s?d?s?d?l?u?d +?d?s?d?s?d?l?u?l +?d?s?d?s?d?l?u?u +?d?s?d?s?d?l?u?s +?d?s?d?s?d?l?s?u +?d?s?d?s?d?u?d?l +?d?s?d?s?d?u?l?d +?d?s?d?s?d?u?l?l +?d?s?d?s?d?u?l?u +?d?s?d?s?d?u?l?s +?d?s?d?s?d?u?u?l +?d?s?d?s?d?u?s?l +?d?s?d?s?d?s?l?u +?d?s?d?s?d?s?u?l +?d?s?d?s?l?d?d?u +?d?s?d?s?l?d?l?u +?d?s?d?s?l?d?u?d +?d?s?d?s?l?d?u?l +?d?s?d?s?l?d?u?u +?d?s?d?s?l?d?u?s +?d?s?d?s?l?d?s?u +?d?s?d?s?l?l?d?u +?d?s?d?s?l?l?l?u +?d?s?d?s?l?l?u?d +?d?s?d?s?l?l?u?l +?d?s?d?s?l?l?u?u +?d?s?d?s?l?l?u?s +?d?s?d?s?l?l?s?u +?d?s?d?s?l?u?d?d +?d?s?d?s?l?u?d?l +?d?s?d?s?l?u?d?u +?d?s?d?s?l?u?d?s +?d?s?d?s?l?u?l?d +?d?s?d?s?l?u?l?l +?d?s?d?s?l?u?l?u +?d?s?d?s?l?u?l?s +?d?s?d?s?l?u?u?d +?d?s?d?s?l?u?u?l +?d?s?d?s?l?u?u?u +?d?s?d?s?l?u?u?s +?d?s?d?s?l?u?s?d +?d?s?d?s?l?u?s?l +?d?s?d?s?l?u?s?u +?d?s?d?s?l?u?s?s +?d?s?d?s?l?s?d?u +?d?s?d?s?l?s?l?u +?d?s?d?s?l?s?u?d +?d?s?d?s?l?s?u?l +?d?s?d?s?l?s?u?u +?d?s?d?s?l?s?u?s +?d?s?d?s?l?s?s?u +?d?s?d?s?u?d?d?l +?d?s?d?s?u?d?l?d +?d?s?d?s?u?d?l?l +?d?s?d?s?u?d?l?u +?d?s?d?s?u?d?l?s +?d?s?d?s?u?d?u?l +?d?s?d?s?u?d?s?l +?d?s?d?s?u?l?d?d +?d?s?d?s?u?l?d?l +?d?s?d?s?u?l?d?u +?d?s?d?s?u?l?d?s +?d?s?d?s?u?l?l?d +?d?s?d?s?u?l?l?l +?d?s?d?s?u?l?l?u +?d?s?d?s?u?l?l?s +?d?s?d?s?u?l?u?d +?d?s?d?s?u?l?u?l +?d?s?d?s?u?l?u?u +?d?s?d?s?u?l?u?s +?d?s?d?s?u?l?s?d +?d?s?d?s?u?l?s?l +?d?s?d?s?u?l?s?u +?d?s?d?s?u?l?s?s +?d?s?d?s?u?u?d?l +?d?s?d?s?u?u?l?d +?d?s?d?s?u?u?l?l +?d?s?d?s?u?u?l?u +?d?s?d?s?u?u?l?s +?d?s?d?s?u?u?u?l +?d?s?d?s?u?u?s?l +?d?s?d?s?u?s?d?l +?d?s?d?s?u?s?l?d +?d?s?d?s?u?s?l?l +?d?s?d?s?u?s?l?u +?d?s?d?s?u?s?l?s +?d?s?d?s?u?s?u?l +?d?s?d?s?u?s?s?l +?d?s?d?s?s?d?l?u +?d?s?d?s?s?d?u?l +?d?s?d?s?s?l?d?u +?d?s?d?s?s?l?l?u +?d?s?d?s?s?l?u?d +?d?s?d?s?s?l?u?l +?d?s?d?s?s?l?u?u +?d?s?d?s?s?l?u?s +?d?s?d?s?s?l?s?u +?d?s?d?s?s?u?d?l +?d?s?d?s?s?u?l?d +?d?s?d?s?s?u?l?l +?d?s?d?s?s?u?l?u +?d?s?d?s?s?u?l?s +?d?s?d?s?s?u?u?l +?d?s?d?s?s?u?s?l +?d?s?d?s?s?s?l?u +?d?s?d?s?s?s?u?l +?d?s?l?d?d?d?d?u +?d?s?l?d?d?d?l?u +?d?s?l?d?d?d?u?d +?d?s?l?d?d?d?u?l +?d?s?l?d?d?d?u?u +?d?s?l?d?d?d?u?s +?d?s?l?d?d?d?s?u +?d?s?l?d?d?l?d?u +?d?s?l?d?d?l?l?u +?d?s?l?d?d?l?u?d +?d?s?l?d?d?l?u?l +?d?s?l?d?d?l?u?u +?d?s?l?d?d?l?u?s +?d?s?l?d?d?l?s?u +?d?s?l?d?d?u?d?d +?d?s?l?d?d?u?d?l +?d?s?l?d?d?u?d?u +?d?s?l?d?d?u?d?s +?d?s?l?d?d?u?l?d +?d?s?l?d?d?u?l?l +?d?s?l?d?d?u?l?u +?d?s?l?d?d?u?l?s +?d?s?l?d?d?u?u?d +?d?s?l?d?d?u?u?l +?d?s?l?d?d?u?u?u +?d?s?l?d?d?u?u?s +?d?s?l?d?d?u?s?d +?d?s?l?d?d?u?s?l +?d?s?l?d?d?u?s?u +?d?s?l?d?d?u?s?s +?d?s?l?d?d?s?d?u +?d?s?l?d?d?s?l?u +?d?s?l?d?d?s?u?d +?d?s?l?d?d?s?u?l +?d?s?l?d?d?s?u?u +?d?s?l?d?d?s?u?s +?d?s?l?d?d?s?s?u +?d?s?l?d?l?d?d?u +?d?s?l?d?l?d?l?u +?d?s?l?d?l?d?u?d +?d?s?l?d?l?d?u?l +?d?s?l?d?l?d?u?u +?d?s?l?d?l?d?u?s +?d?s?l?d?l?d?s?u +?d?s?l?d?l?l?d?u +?d?s?l?d?l?l?l?u +?d?s?l?d?l?l?u?d +?d?s?l?d?l?l?u?l +?d?s?l?d?l?l?u?u +?d?s?l?d?l?l?u?s +?d?s?l?d?l?l?s?u +?d?s?l?d?l?u?d?d +?d?s?l?d?l?u?d?l +?d?s?l?d?l?u?d?u +?d?s?l?d?l?u?d?s +?d?s?l?d?l?u?l?d +?d?s?l?d?l?u?l?l +?d?s?l?d?l?u?l?u +?d?s?l?d?l?u?l?s +?d?s?l?d?l?u?u?d +?d?s?l?d?l?u?u?l +?d?s?l?d?l?u?u?u +?d?s?l?d?l?u?u?s +?d?s?l?d?l?u?s?d +?d?s?l?d?l?u?s?l +?d?s?l?d?l?u?s?u +?d?s?l?d?l?u?s?s +?d?s?l?d?l?s?d?u +?d?s?l?d?l?s?l?u +?d?s?l?d?l?s?u?d +?d?s?l?d?l?s?u?l +?d?s?l?d?l?s?u?u +?d?s?l?d?l?s?u?s +?d?s?l?d?l?s?s?u +?d?s?l?d?u?d?d?d +?d?s?l?d?u?d?d?l +?d?s?l?d?u?d?d?u +?d?s?l?d?u?d?d?s +?d?s?l?d?u?d?l?d +?d?s?l?d?u?d?l?l +?d?s?l?d?u?d?l?u +?d?s?l?d?u?d?l?s +?d?s?l?d?u?d?u?d +?d?s?l?d?u?d?u?l +?d?s?l?d?u?d?u?u +?d?s?l?d?u?d?u?s +?d?s?l?d?u?d?s?d +?d?s?l?d?u?d?s?l +?d?s?l?d?u?d?s?u +?d?s?l?d?u?d?s?s +?d?s?l?d?u?l?d?d +?d?s?l?d?u?l?d?l +?d?s?l?d?u?l?d?u +?d?s?l?d?u?l?d?s +?d?s?l?d?u?l?l?d +?d?s?l?d?u?l?l?l +?d?s?l?d?u?l?l?u +?d?s?l?d?u?l?l?s +?d?s?l?d?u?l?u?d +?d?s?l?d?u?l?u?l +?d?s?l?d?u?l?u?u +?d?s?l?d?u?l?u?s +?d?s?l?d?u?l?s?d +?d?s?l?d?u?l?s?l +?d?s?l?d?u?l?s?u +?d?s?l?d?u?l?s?s +?d?s?l?d?u?u?d?d +?d?s?l?d?u?u?d?l +?d?s?l?d?u?u?d?u +?d?s?l?d?u?u?d?s +?d?s?l?d?u?u?l?d +?d?s?l?d?u?u?l?l +?d?s?l?d?u?u?l?u +?d?s?l?d?u?u?l?s +?d?s?l?d?u?u?u?d +?d?s?l?d?u?u?u?l +?d?s?l?d?u?u?u?u +?d?s?l?d?u?u?u?s +?d?s?l?d?u?u?s?d +?d?s?l?d?u?u?s?l +?d?s?l?d?u?u?s?u +?d?s?l?d?u?u?s?s +?d?s?l?d?u?s?d?d +?d?s?l?d?u?s?d?l +?d?s?l?d?u?s?d?u +?d?s?l?d?u?s?d?s +?d?s?l?d?u?s?l?d +?d?s?l?d?u?s?l?l +?d?s?l?d?u?s?l?u +?d?s?l?d?u?s?l?s +?d?s?l?d?u?s?u?d +?d?s?l?d?u?s?u?l +?d?s?l?d?u?s?u?u +?d?s?l?d?u?s?u?s +?d?s?l?d?u?s?s?d +?d?s?l?d?u?s?s?l +?d?s?l?d?u?s?s?u +?d?s?l?d?u?s?s?s +?d?s?l?d?s?d?d?u +?d?s?l?d?s?d?l?u +?d?s?l?d?s?d?u?d +?d?s?l?d?s?d?u?l +?d?s?l?d?s?d?u?u +?d?s?l?d?s?d?u?s +?d?s?l?d?s?d?s?u +?d?s?l?d?s?l?d?u +?d?s?l?d?s?l?l?u +?d?s?l?d?s?l?u?d +?d?s?l?d?s?l?u?l +?d?s?l?d?s?l?u?u +?d?s?l?d?s?l?u?s +?d?s?l?d?s?l?s?u +?d?s?l?d?s?u?d?d +?d?s?l?d?s?u?d?l +?d?s?l?d?s?u?d?u +?d?s?l?d?s?u?d?s +?d?s?l?d?s?u?l?d +?d?s?l?d?s?u?l?l +?d?s?l?d?s?u?l?u +?d?s?l?d?s?u?l?s +?d?s?l?d?s?u?u?d +?d?s?l?d?s?u?u?l +?d?s?l?d?s?u?u?u +?d?s?l?d?s?u?u?s +?d?s?l?d?s?u?s?d +?d?s?l?d?s?u?s?l +?d?s?l?d?s?u?s?u +?d?s?l?d?s?u?s?s +?d?s?l?d?s?s?d?u +?d?s?l?d?s?s?l?u +?d?s?l?d?s?s?u?d +?d?s?l?d?s?s?u?l +?d?s?l?d?s?s?u?u +?d?s?l?d?s?s?u?s +?d?s?l?d?s?s?s?u +?d?s?l?l?d?d?d?u +?d?s?l?l?d?d?l?u +?d?s?l?l?d?d?u?d +?d?s?l?l?d?d?u?l +?d?s?l?l?d?d?u?u +?d?s?l?l?d?d?u?s +?d?s?l?l?d?d?s?u +?d?s?l?l?d?l?d?u +?d?s?l?l?d?l?l?u +?d?s?l?l?d?l?u?d +?d?s?l?l?d?l?u?l +?d?s?l?l?d?l?u?u +?d?s?l?l?d?l?u?s +?d?s?l?l?d?l?s?u +?d?s?l?l?d?u?d?d +?d?s?l?l?d?u?d?l +?d?s?l?l?d?u?d?u +?d?s?l?l?d?u?d?s +?d?s?l?l?d?u?l?d +?d?s?l?l?d?u?l?l +?d?s?l?l?d?u?l?u +?d?s?l?l?d?u?l?s +?d?s?l?l?d?u?u?d +?d?s?l?l?d?u?u?l +?d?s?l?l?d?u?u?u +?d?s?l?l?d?u?u?s +?d?s?l?l?d?u?s?d +?d?s?l?l?d?u?s?l +?d?s?l?l?d?u?s?u +?d?s?l?l?d?u?s?s +?d?s?l?l?d?s?d?u +?d?s?l?l?d?s?l?u +?d?s?l?l?d?s?u?d +?d?s?l?l?d?s?u?l +?d?s?l?l?d?s?u?u +?d?s?l?l?d?s?u?s +?d?s?l?l?d?s?s?u +?d?s?l?l?l?d?d?u +?d?s?l?l?l?d?l?u +?d?s?l?l?l?d?u?d +?d?s?l?l?l?d?u?l +?d?s?l?l?l?d?u?u +?d?s?l?l?l?d?u?s +?d?s?l?l?l?d?s?u +?d?s?l?l?l?l?d?u +?d?s?l?l?l?l?l?u +?d?s?l?l?l?l?u?d +?d?s?l?l?l?l?u?l +?d?s?l?l?l?l?u?u +?d?s?l?l?l?l?u?s +?d?s?l?l?l?l?s?u +?d?s?l?l?l?u?d?d +?d?s?l?l?l?u?d?l +?d?s?l?l?l?u?d?u +?d?s?l?l?l?u?d?s +?d?s?l?l?l?u?l?d +?d?s?l?l?l?u?l?l +?d?s?l?l?l?u?l?u +?d?s?l?l?l?u?l?s +?d?s?l?l?l?u?u?d +?d?s?l?l?l?u?u?l +?d?s?l?l?l?u?u?u +?d?s?l?l?l?u?u?s +?d?s?l?l?l?u?s?d +?d?s?l?l?l?u?s?l +?d?s?l?l?l?u?s?u +?d?s?l?l?l?u?s?s +?d?s?l?l?l?s?d?u +?d?s?l?l?l?s?l?u +?d?s?l?l?l?s?u?d +?d?s?l?l?l?s?u?l +?d?s?l?l?l?s?u?u +?d?s?l?l?l?s?u?s +?d?s?l?l?l?s?s?u +?d?s?l?l?u?d?d?d +?d?s?l?l?u?d?d?l +?d?s?l?l?u?d?d?u +?d?s?l?l?u?d?d?s +?d?s?l?l?u?d?l?d +?d?s?l?l?u?d?l?l +?d?s?l?l?u?d?l?u +?d?s?l?l?u?d?l?s +?d?s?l?l?u?d?u?d +?d?s?l?l?u?d?u?l +?d?s?l?l?u?d?u?u +?d?s?l?l?u?d?u?s +?d?s?l?l?u?d?s?d +?d?s?l?l?u?d?s?l +?d?s?l?l?u?d?s?u +?d?s?l?l?u?d?s?s +?d?s?l?l?u?l?d?d +?d?s?l?l?u?l?d?l +?d?s?l?l?u?l?d?u +?d?s?l?l?u?l?d?s +?d?s?l?l?u?l?l?d +?d?s?l?l?u?l?l?l +?d?s?l?l?u?l?l?u +?d?s?l?l?u?l?l?s +?d?s?l?l?u?l?u?d +?d?s?l?l?u?l?u?l +?d?s?l?l?u?l?u?u +?d?s?l?l?u?l?u?s +?d?s?l?l?u?l?s?d +?d?s?l?l?u?l?s?l +?d?s?l?l?u?l?s?u +?d?s?l?l?u?l?s?s +?d?s?l?l?u?u?d?d +?d?s?l?l?u?u?d?l +?d?s?l?l?u?u?d?u +?d?s?l?l?u?u?d?s +?d?s?l?l?u?u?l?d +?d?s?l?l?u?u?l?l +?d?s?l?l?u?u?l?u +?d?s?l?l?u?u?l?s +?d?s?l?l?u?u?u?d +?d?s?l?l?u?u?u?l +?d?s?l?l?u?u?u?u +?d?s?l?l?u?u?u?s +?d?s?l?l?u?u?s?d +?d?s?l?l?u?u?s?l +?d?s?l?l?u?u?s?u +?d?s?l?l?u?u?s?s +?d?s?l?l?u?s?d?d +?d?s?l?l?u?s?d?l +?d?s?l?l?u?s?d?u +?d?s?l?l?u?s?d?s +?d?s?l?l?u?s?l?d +?d?s?l?l?u?s?l?l +?d?s?l?l?u?s?l?u +?d?s?l?l?u?s?l?s +?d?s?l?l?u?s?u?d +?d?s?l?l?u?s?u?l +?d?s?l?l?u?s?u?u +?d?s?l?l?u?s?u?s +?d?s?l?l?u?s?s?d +?d?s?l?l?u?s?s?l +?d?s?l?l?u?s?s?u +?d?s?l?l?u?s?s?s +?d?s?l?l?s?d?d?u +?d?s?l?l?s?d?l?u +?d?s?l?l?s?d?u?d +?d?s?l?l?s?d?u?l +?d?s?l?l?s?d?u?u +?d?s?l?l?s?d?u?s +?d?s?l?l?s?d?s?u +?d?s?l?l?s?l?d?u +?d?s?l?l?s?l?l?u +?d?s?l?l?s?l?u?d +?d?s?l?l?s?l?u?l +?d?s?l?l?s?l?u?u +?d?s?l?l?s?l?u?s +?d?s?l?l?s?l?s?u +?d?s?l?l?s?u?d?d +?d?s?l?l?s?u?d?l +?d?s?l?l?s?u?d?u +?d?s?l?l?s?u?d?s +?d?s?l?l?s?u?l?d +?d?s?l?l?s?u?l?l +?d?s?l?l?s?u?l?u +?d?s?l?l?s?u?l?s +?d?s?l?l?s?u?u?d +?d?s?l?l?s?u?u?l +?d?s?l?l?s?u?u?u +?d?s?l?l?s?u?u?s +?d?s?l?l?s?u?s?d +?d?s?l?l?s?u?s?l +?d?s?l?l?s?u?s?u +?d?s?l?l?s?u?s?s +?d?s?l?l?s?s?d?u +?d?s?l?l?s?s?l?u +?d?s?l?l?s?s?u?d +?d?s?l?l?s?s?u?l +?d?s?l?l?s?s?u?u +?d?s?l?l?s?s?u?s +?d?s?l?l?s?s?s?u +?d?s?l?u?d?d?d?d +?d?s?l?u?d?d?d?l +?d?s?l?u?d?d?d?u +?d?s?l?u?d?d?d?s +?d?s?l?u?d?d?l?d +?d?s?l?u?d?d?l?l +?d?s?l?u?d?d?l?u +?d?s?l?u?d?d?l?s +?d?s?l?u?d?d?u?d +?d?s?l?u?d?d?u?l +?d?s?l?u?d?d?u?u +?d?s?l?u?d?d?u?s +?d?s?l?u?d?d?s?d +?d?s?l?u?d?d?s?l +?d?s?l?u?d?d?s?u +?d?s?l?u?d?d?s?s +?d?s?l?u?d?l?d?d +?d?s?l?u?d?l?d?l +?d?s?l?u?d?l?d?u +?d?s?l?u?d?l?d?s +?d?s?l?u?d?l?l?d +?d?s?l?u?d?l?l?l +?d?s?l?u?d?l?l?u +?d?s?l?u?d?l?l?s +?d?s?l?u?d?l?u?d +?d?s?l?u?d?l?u?l +?d?s?l?u?d?l?u?u +?d?s?l?u?d?l?u?s +?d?s?l?u?d?l?s?d +?d?s?l?u?d?l?s?l +?d?s?l?u?d?l?s?u +?d?s?l?u?d?l?s?s +?d?s?l?u?d?u?d?d +?d?s?l?u?d?u?d?l +?d?s?l?u?d?u?d?u +?d?s?l?u?d?u?d?s +?d?s?l?u?d?u?l?d +?d?s?l?u?d?u?l?l +?d?s?l?u?d?u?l?u +?d?s?l?u?d?u?l?s +?d?s?l?u?d?u?u?d +?d?s?l?u?d?u?u?l +?d?s?l?u?d?u?u?u +?d?s?l?u?d?u?u?s +?d?s?l?u?d?u?s?d +?d?s?l?u?d?u?s?l +?d?s?l?u?d?u?s?u +?d?s?l?u?d?u?s?s +?d?s?l?u?d?s?d?d +?d?s?l?u?d?s?d?l +?d?s?l?u?d?s?d?u +?d?s?l?u?d?s?d?s +?d?s?l?u?d?s?l?d +?d?s?l?u?d?s?l?l +?d?s?l?u?d?s?l?u +?d?s?l?u?d?s?l?s +?d?s?l?u?d?s?u?d +?d?s?l?u?d?s?u?l +?d?s?l?u?d?s?u?u +?d?s?l?u?d?s?u?s +?d?s?l?u?d?s?s?d +?d?s?l?u?d?s?s?l +?d?s?l?u?d?s?s?u +?d?s?l?u?d?s?s?s +?d?s?l?u?l?d?d?d +?d?s?l?u?l?d?d?l +?d?s?l?u?l?d?d?u +?d?s?l?u?l?d?d?s +?d?s?l?u?l?d?l?d +?d?s?l?u?l?d?l?l +?d?s?l?u?l?d?l?u +?d?s?l?u?l?d?l?s +?d?s?l?u?l?d?u?d +?d?s?l?u?l?d?u?l +?d?s?l?u?l?d?u?u +?d?s?l?u?l?d?u?s +?d?s?l?u?l?d?s?d +?d?s?l?u?l?d?s?l +?d?s?l?u?l?d?s?u +?d?s?l?u?l?d?s?s +?d?s?l?u?l?l?d?d +?d?s?l?u?l?l?d?l +?d?s?l?u?l?l?d?u +?d?s?l?u?l?l?d?s +?d?s?l?u?l?l?l?d +?d?s?l?u?l?l?l?l +?d?s?l?u?l?l?l?u +?d?s?l?u?l?l?l?s +?d?s?l?u?l?l?u?d +?d?s?l?u?l?l?u?l +?d?s?l?u?l?l?u?u +?d?s?l?u?l?l?u?s +?d?s?l?u?l?l?s?d +?d?s?l?u?l?l?s?l +?d?s?l?u?l?l?s?u +?d?s?l?u?l?l?s?s +?d?s?l?u?l?u?d?d +?d?s?l?u?l?u?d?l +?d?s?l?u?l?u?d?u +?d?s?l?u?l?u?d?s +?d?s?l?u?l?u?l?d +?d?s?l?u?l?u?l?l +?d?s?l?u?l?u?l?u +?d?s?l?u?l?u?l?s +?d?s?l?u?l?u?u?d +?d?s?l?u?l?u?u?l +?d?s?l?u?l?u?u?u +?d?s?l?u?l?u?u?s +?d?s?l?u?l?u?s?d +?d?s?l?u?l?u?s?l +?d?s?l?u?l?u?s?u +?d?s?l?u?l?u?s?s +?d?s?l?u?l?s?d?d +?d?s?l?u?l?s?d?l +?d?s?l?u?l?s?d?u +?d?s?l?u?l?s?d?s +?d?s?l?u?l?s?l?d +?d?s?l?u?l?s?l?l +?d?s?l?u?l?s?l?u +?d?s?l?u?l?s?l?s +?d?s?l?u?l?s?u?d +?d?s?l?u?l?s?u?l +?d?s?l?u?l?s?u?u +?d?s?l?u?l?s?u?s +?d?s?l?u?l?s?s?d +?d?s?l?u?l?s?s?l +?d?s?l?u?l?s?s?u +?d?s?l?u?l?s?s?s +?d?s?l?u?u?d?d?d +?d?s?l?u?u?d?d?l +?d?s?l?u?u?d?d?u +?d?s?l?u?u?d?d?s +?d?s?l?u?u?d?l?d +?d?s?l?u?u?d?l?l +?d?s?l?u?u?d?l?u +?d?s?l?u?u?d?l?s +?d?s?l?u?u?d?u?d +?d?s?l?u?u?d?u?l +?d?s?l?u?u?d?u?u +?d?s?l?u?u?d?u?s +?d?s?l?u?u?d?s?d +?d?s?l?u?u?d?s?l +?d?s?l?u?u?d?s?u +?d?s?l?u?u?d?s?s +?d?s?l?u?u?l?d?d +?d?s?l?u?u?l?d?l +?d?s?l?u?u?l?d?u +?d?s?l?u?u?l?d?s +?d?s?l?u?u?l?l?d +?d?s?l?u?u?l?l?l +?d?s?l?u?u?l?l?u +?d?s?l?u?u?l?l?s +?d?s?l?u?u?l?u?d +?d?s?l?u?u?l?u?l +?d?s?l?u?u?l?u?u +?d?s?l?u?u?l?u?s +?d?s?l?u?u?l?s?d +?d?s?l?u?u?l?s?l +?d?s?l?u?u?l?s?u +?d?s?l?u?u?l?s?s +?d?s?l?u?u?u?d?d +?d?s?l?u?u?u?d?l +?d?s?l?u?u?u?d?u +?d?s?l?u?u?u?d?s +?d?s?l?u?u?u?l?d +?d?s?l?u?u?u?l?l +?d?s?l?u?u?u?l?u +?d?s?l?u?u?u?l?s +?d?s?l?u?u?u?u?d +?d?s?l?u?u?u?u?l +?d?s?l?u?u?u?u?u +?d?s?l?u?u?u?u?s +?d?s?l?u?u?u?s?d +?d?s?l?u?u?u?s?l +?d?s?l?u?u?u?s?u +?d?s?l?u?u?u?s?s +?d?s?l?u?u?s?d?d +?d?s?l?u?u?s?d?l +?d?s?l?u?u?s?d?u +?d?s?l?u?u?s?d?s +?d?s?l?u?u?s?l?d +?d?s?l?u?u?s?l?l +?d?s?l?u?u?s?l?u +?d?s?l?u?u?s?l?s +?d?s?l?u?u?s?u?d +?d?s?l?u?u?s?u?l +?d?s?l?u?u?s?u?u +?d?s?l?u?u?s?u?s +?d?s?l?u?u?s?s?d +?d?s?l?u?u?s?s?l +?d?s?l?u?u?s?s?u +?d?s?l?u?u?s?s?s +?d?s?l?u?s?d?d?d +?d?s?l?u?s?d?d?l +?d?s?l?u?s?d?d?u +?d?s?l?u?s?d?d?s +?d?s?l?u?s?d?l?d +?d?s?l?u?s?d?l?l +?d?s?l?u?s?d?l?u +?d?s?l?u?s?d?l?s +?d?s?l?u?s?d?u?d +?d?s?l?u?s?d?u?l +?d?s?l?u?s?d?u?u +?d?s?l?u?s?d?u?s +?d?s?l?u?s?d?s?d +?d?s?l?u?s?d?s?l +?d?s?l?u?s?d?s?u +?d?s?l?u?s?d?s?s +?d?s?l?u?s?l?d?d +?d?s?l?u?s?l?d?l +?d?s?l?u?s?l?d?u +?d?s?l?u?s?l?d?s +?d?s?l?u?s?l?l?d +?d?s?l?u?s?l?l?l +?d?s?l?u?s?l?l?u +?d?s?l?u?s?l?l?s +?d?s?l?u?s?l?u?d +?d?s?l?u?s?l?u?l +?d?s?l?u?s?l?u?u +?d?s?l?u?s?l?u?s +?d?s?l?u?s?l?s?d +?d?s?l?u?s?l?s?l +?d?s?l?u?s?l?s?u +?d?s?l?u?s?l?s?s +?d?s?l?u?s?u?d?d +?d?s?l?u?s?u?d?l +?d?s?l?u?s?u?d?u +?d?s?l?u?s?u?d?s +?d?s?l?u?s?u?l?d +?d?s?l?u?s?u?l?l +?d?s?l?u?s?u?l?u +?d?s?l?u?s?u?l?s +?d?s?l?u?s?u?u?d +?d?s?l?u?s?u?u?l +?d?s?l?u?s?u?u?u +?d?s?l?u?s?u?u?s +?d?s?l?u?s?u?s?d +?d?s?l?u?s?u?s?l +?d?s?l?u?s?u?s?u +?d?s?l?u?s?u?s?s +?d?s?l?u?s?s?d?d +?d?s?l?u?s?s?d?l +?d?s?l?u?s?s?d?u +?d?s?l?u?s?s?d?s +?d?s?l?u?s?s?l?d +?d?s?l?u?s?s?l?l +?d?s?l?u?s?s?l?u +?d?s?l?u?s?s?l?s +?d?s?l?u?s?s?u?d +?d?s?l?u?s?s?u?l +?d?s?l?u?s?s?u?u +?d?s?l?u?s?s?u?s +?d?s?l?u?s?s?s?d +?d?s?l?u?s?s?s?l +?d?s?l?u?s?s?s?u +?d?s?l?u?s?s?s?s +?d?s?l?s?d?d?d?u +?d?s?l?s?d?d?l?u +?d?s?l?s?d?d?u?d +?d?s?l?s?d?d?u?l +?d?s?l?s?d?d?u?u +?d?s?l?s?d?d?u?s +?d?s?l?s?d?d?s?u +?d?s?l?s?d?l?d?u +?d?s?l?s?d?l?l?u +?d?s?l?s?d?l?u?d +?d?s?l?s?d?l?u?l +?d?s?l?s?d?l?u?u +?d?s?l?s?d?l?u?s +?d?s?l?s?d?l?s?u +?d?s?l?s?d?u?d?d +?d?s?l?s?d?u?d?l +?d?s?l?s?d?u?d?u +?d?s?l?s?d?u?d?s +?d?s?l?s?d?u?l?d +?d?s?l?s?d?u?l?l +?d?s?l?s?d?u?l?u +?d?s?l?s?d?u?l?s +?d?s?l?s?d?u?u?d +?d?s?l?s?d?u?u?l +?d?s?l?s?d?u?u?u +?d?s?l?s?d?u?u?s +?d?s?l?s?d?u?s?d +?d?s?l?s?d?u?s?l +?d?s?l?s?d?u?s?u +?d?s?l?s?d?u?s?s +?d?s?l?s?d?s?d?u +?d?s?l?s?d?s?l?u +?d?s?l?s?d?s?u?d +?d?s?l?s?d?s?u?l +?d?s?l?s?d?s?u?u +?d?s?l?s?d?s?u?s +?d?s?l?s?d?s?s?u +?d?s?l?s?l?d?d?u +?d?s?l?s?l?d?l?u +?d?s?l?s?l?d?u?d +?d?s?l?s?l?d?u?l +?d?s?l?s?l?d?u?u +?d?s?l?s?l?d?u?s +?d?s?l?s?l?d?s?u +?d?s?l?s?l?l?d?u +?d?s?l?s?l?l?l?u +?d?s?l?s?l?l?u?d +?d?s?l?s?l?l?u?l +?d?s?l?s?l?l?u?u +?d?s?l?s?l?l?u?s +?d?s?l?s?l?l?s?u +?d?s?l?s?l?u?d?d +?d?s?l?s?l?u?d?l +?d?s?l?s?l?u?d?u +?d?s?l?s?l?u?d?s +?d?s?l?s?l?u?l?d +?d?s?l?s?l?u?l?l +?d?s?l?s?l?u?l?u +?d?s?l?s?l?u?l?s +?d?s?l?s?l?u?u?d +?d?s?l?s?l?u?u?l +?d?s?l?s?l?u?u?u +?d?s?l?s?l?u?u?s +?d?s?l?s?l?u?s?d +?d?s?l?s?l?u?s?l +?d?s?l?s?l?u?s?u +?d?s?l?s?l?u?s?s +?d?s?l?s?l?s?d?u +?d?s?l?s?l?s?l?u +?d?s?l?s?l?s?u?d +?d?s?l?s?l?s?u?l +?d?s?l?s?l?s?u?u +?d?s?l?s?l?s?u?s +?d?s?l?s?l?s?s?u +?d?s?l?s?u?d?d?d +?d?s?l?s?u?d?d?l +?d?s?l?s?u?d?d?u +?d?s?l?s?u?d?d?s +?d?s?l?s?u?d?l?d +?d?s?l?s?u?d?l?l +?d?s?l?s?u?d?l?u +?d?s?l?s?u?d?l?s +?d?s?l?s?u?d?u?d +?d?s?l?s?u?d?u?l +?d?s?l?s?u?d?u?u +?d?s?l?s?u?d?u?s +?d?s?l?s?u?d?s?d +?d?s?l?s?u?d?s?l +?d?s?l?s?u?d?s?u +?d?s?l?s?u?d?s?s +?d?s?l?s?u?l?d?d +?d?s?l?s?u?l?d?l +?d?s?l?s?u?l?d?u +?d?s?l?s?u?l?d?s +?d?s?l?s?u?l?l?d +?d?s?l?s?u?l?l?l +?d?s?l?s?u?l?l?u +?d?s?l?s?u?l?l?s +?d?s?l?s?u?l?u?d +?d?s?l?s?u?l?u?l +?d?s?l?s?u?l?u?u +?d?s?l?s?u?l?u?s +?d?s?l?s?u?l?s?d +?d?s?l?s?u?l?s?l +?d?s?l?s?u?l?s?u +?d?s?l?s?u?l?s?s +?d?s?l?s?u?u?d?d +?d?s?l?s?u?u?d?l +?d?s?l?s?u?u?d?u +?d?s?l?s?u?u?d?s +?d?s?l?s?u?u?l?d +?d?s?l?s?u?u?l?l +?d?s?l?s?u?u?l?u +?d?s?l?s?u?u?l?s +?d?s?l?s?u?u?u?d +?d?s?l?s?u?u?u?l +?d?s?l?s?u?u?u?u +?d?s?l?s?u?u?u?s +?d?s?l?s?u?u?s?d +?d?s?l?s?u?u?s?l +?d?s?l?s?u?u?s?u +?d?s?l?s?u?u?s?s +?d?s?l?s?u?s?d?d +?d?s?l?s?u?s?d?l +?d?s?l?s?u?s?d?u +?d?s?l?s?u?s?d?s +?d?s?l?s?u?s?l?d +?d?s?l?s?u?s?l?l +?d?s?l?s?u?s?l?u +?d?s?l?s?u?s?l?s +?d?s?l?s?u?s?u?d +?d?s?l?s?u?s?u?l +?d?s?l?s?u?s?u?u +?d?s?l?s?u?s?u?s +?d?s?l?s?u?s?s?d +?d?s?l?s?u?s?s?l +?d?s?l?s?u?s?s?u +?d?s?l?s?u?s?s?s +?d?s?l?s?s?d?d?u +?d?s?l?s?s?d?l?u +?d?s?l?s?s?d?u?d +?d?s?l?s?s?d?u?l +?d?s?l?s?s?d?u?u +?d?s?l?s?s?d?u?s +?d?s?l?s?s?d?s?u +?d?s?l?s?s?l?d?u +?d?s?l?s?s?l?l?u +?d?s?l?s?s?l?u?d +?d?s?l?s?s?l?u?l +?d?s?l?s?s?l?u?u +?d?s?l?s?s?l?u?s +?d?s?l?s?s?l?s?u +?d?s?l?s?s?u?d?d +?d?s?l?s?s?u?d?l +?d?s?l?s?s?u?d?u +?d?s?l?s?s?u?d?s +?d?s?l?s?s?u?l?d +?d?s?l?s?s?u?l?l +?d?s?l?s?s?u?l?u +?d?s?l?s?s?u?l?s +?d?s?l?s?s?u?u?d +?d?s?l?s?s?u?u?l +?d?s?l?s?s?u?u?u +?d?s?l?s?s?u?u?s +?d?s?l?s?s?u?s?d +?d?s?l?s?s?u?s?l +?d?s?l?s?s?u?s?u +?d?s?l?s?s?u?s?s +?d?s?l?s?s?s?d?u +?d?s?l?s?s?s?l?u +?d?s?l?s?s?s?u?d +?d?s?l?s?s?s?u?l +?d?s?l?s?s?s?u?u +?d?s?l?s?s?s?u?s +?d?s?l?s?s?s?s?u +?d?s?u?d?d?d?d?l +?d?s?u?d?d?d?l?d +?d?s?u?d?d?d?l?l +?d?s?u?d?d?d?l?u +?d?s?u?d?d?d?l?s +?d?s?u?d?d?d?u?l +?d?s?u?d?d?d?s?l +?d?s?u?d?d?l?d?d +?d?s?u?d?d?l?d?l +?d?s?u?d?d?l?d?u +?d?s?u?d?d?l?d?s +?d?s?u?d?d?l?l?d +?d?s?u?d?d?l?l?l +?d?s?u?d?d?l?l?u +?d?s?u?d?d?l?l?s +?d?s?u?d?d?l?u?d +?d?s?u?d?d?l?u?l +?d?s?u?d?d?l?u?u +?d?s?u?d?d?l?u?s +?d?s?u?d?d?l?s?d +?d?s?u?d?d?l?s?l +?d?s?u?d?d?l?s?u +?d?s?u?d?d?l?s?s +?d?s?u?d?d?u?d?l +?d?s?u?d?d?u?l?d +?d?s?u?d?d?u?l?l +?d?s?u?d?d?u?l?u +?d?s?u?d?d?u?l?s +?d?s?u?d?d?u?u?l +?d?s?u?d?d?u?s?l +?d?s?u?d?d?s?d?l +?d?s?u?d?d?s?l?d +?d?s?u?d?d?s?l?l +?d?s?u?d?d?s?l?u +?d?s?u?d?d?s?l?s +?d?s?u?d?d?s?u?l +?d?s?u?d?d?s?s?l +?d?s?u?d?l?d?d?d +?d?s?u?d?l?d?d?l +?d?s?u?d?l?d?d?u +?d?s?u?d?l?d?d?s +?d?s?u?d?l?d?l?d +?d?s?u?d?l?d?l?l +?d?s?u?d?l?d?l?u +?d?s?u?d?l?d?l?s +?d?s?u?d?l?d?u?d +?d?s?u?d?l?d?u?l +?d?s?u?d?l?d?u?u +?d?s?u?d?l?d?u?s +?d?s?u?d?l?d?s?d +?d?s?u?d?l?d?s?l +?d?s?u?d?l?d?s?u +?d?s?u?d?l?d?s?s +?d?s?u?d?l?l?d?d +?d?s?u?d?l?l?d?l +?d?s?u?d?l?l?d?u +?d?s?u?d?l?l?d?s +?d?s?u?d?l?l?l?d +?d?s?u?d?l?l?l?l +?d?s?u?d?l?l?l?u +?d?s?u?d?l?l?l?s +?d?s?u?d?l?l?u?d +?d?s?u?d?l?l?u?l +?d?s?u?d?l?l?u?u +?d?s?u?d?l?l?u?s +?d?s?u?d?l?l?s?d +?d?s?u?d?l?l?s?l +?d?s?u?d?l?l?s?u +?d?s?u?d?l?l?s?s +?d?s?u?d?l?u?d?d +?d?s?u?d?l?u?d?l +?d?s?u?d?l?u?d?u +?d?s?u?d?l?u?d?s +?d?s?u?d?l?u?l?d +?d?s?u?d?l?u?l?l +?d?s?u?d?l?u?l?u +?d?s?u?d?l?u?l?s +?d?s?u?d?l?u?u?d +?d?s?u?d?l?u?u?l +?d?s?u?d?l?u?u?u +?d?s?u?d?l?u?u?s +?d?s?u?d?l?u?s?d +?d?s?u?d?l?u?s?l +?d?s?u?d?l?u?s?u +?d?s?u?d?l?u?s?s +?d?s?u?d?l?s?d?d +?d?s?u?d?l?s?d?l +?d?s?u?d?l?s?d?u +?d?s?u?d?l?s?d?s +?d?s?u?d?l?s?l?d +?d?s?u?d?l?s?l?l +?d?s?u?d?l?s?l?u +?d?s?u?d?l?s?l?s +?d?s?u?d?l?s?u?d +?d?s?u?d?l?s?u?l +?d?s?u?d?l?s?u?u +?d?s?u?d?l?s?u?s +?d?s?u?d?l?s?s?d +?d?s?u?d?l?s?s?l +?d?s?u?d?l?s?s?u +?d?s?u?d?l?s?s?s +?d?s?u?d?u?d?d?l +?d?s?u?d?u?d?l?d +?d?s?u?d?u?d?l?l +?d?s?u?d?u?d?l?u +?d?s?u?d?u?d?l?s +?d?s?u?d?u?d?u?l +?d?s?u?d?u?d?s?l +?d?s?u?d?u?l?d?d +?d?s?u?d?u?l?d?l +?d?s?u?d?u?l?d?u +?d?s?u?d?u?l?d?s +?d?s?u?d?u?l?l?d +?d?s?u?d?u?l?l?l +?d?s?u?d?u?l?l?u +?d?s?u?d?u?l?l?s +?d?s?u?d?u?l?u?d +?d?s?u?d?u?l?u?l +?d?s?u?d?u?l?u?u +?d?s?u?d?u?l?u?s +?d?s?u?d?u?l?s?d +?d?s?u?d?u?l?s?l +?d?s?u?d?u?l?s?u +?d?s?u?d?u?l?s?s +?d?s?u?d?u?u?d?l +?d?s?u?d?u?u?l?d +?d?s?u?d?u?u?l?l +?d?s?u?d?u?u?l?u +?d?s?u?d?u?u?l?s +?d?s?u?d?u?u?u?l +?d?s?u?d?u?u?s?l +?d?s?u?d?u?s?d?l +?d?s?u?d?u?s?l?d +?d?s?u?d?u?s?l?l +?d?s?u?d?u?s?l?u +?d?s?u?d?u?s?l?s +?d?s?u?d?u?s?u?l +?d?s?u?d?u?s?s?l +?d?s?u?d?s?d?d?l +?d?s?u?d?s?d?l?d +?d?s?u?d?s?d?l?l +?d?s?u?d?s?d?l?u +?d?s?u?d?s?d?l?s +?d?s?u?d?s?d?u?l +?d?s?u?d?s?d?s?l +?d?s?u?d?s?l?d?d +?d?s?u?d?s?l?d?l +?d?s?u?d?s?l?d?u +?d?s?u?d?s?l?d?s +?d?s?u?d?s?l?l?d +?d?s?u?d?s?l?l?l +?d?s?u?d?s?l?l?u +?d?s?u?d?s?l?l?s +?d?s?u?d?s?l?u?d +?d?s?u?d?s?l?u?l +?d?s?u?d?s?l?u?u +?d?s?u?d?s?l?u?s +?d?s?u?d?s?l?s?d +?d?s?u?d?s?l?s?l +?d?s?u?d?s?l?s?u +?d?s?u?d?s?l?s?s +?d?s?u?d?s?u?d?l +?d?s?u?d?s?u?l?d +?d?s?u?d?s?u?l?l +?d?s?u?d?s?u?l?u +?d?s?u?d?s?u?l?s +?d?s?u?d?s?u?u?l +?d?s?u?d?s?u?s?l +?d?s?u?d?s?s?d?l +?d?s?u?d?s?s?l?d +?d?s?u?d?s?s?l?l +?d?s?u?d?s?s?l?u +?d?s?u?d?s?s?l?s +?d?s?u?d?s?s?u?l +?d?s?u?d?s?s?s?l +?d?s?u?l?d?d?d?d +?d?s?u?l?d?d?d?l +?d?s?u?l?d?d?d?u +?d?s?u?l?d?d?d?s +?d?s?u?l?d?d?l?d +?d?s?u?l?d?d?l?l +?d?s?u?l?d?d?l?u +?d?s?u?l?d?d?l?s +?d?s?u?l?d?d?u?d +?d?s?u?l?d?d?u?l +?d?s?u?l?d?d?u?u +?d?s?u?l?d?d?u?s +?d?s?u?l?d?d?s?d +?d?s?u?l?d?d?s?l +?d?s?u?l?d?d?s?u +?d?s?u?l?d?d?s?s +?d?s?u?l?d?l?d?d +?d?s?u?l?d?l?d?l +?d?s?u?l?d?l?d?u +?d?s?u?l?d?l?d?s +?d?s?u?l?d?l?l?d +?d?s?u?l?d?l?l?l +?d?s?u?l?d?l?l?u +?d?s?u?l?d?l?l?s +?d?s?u?l?d?l?u?d +?d?s?u?l?d?l?u?l +?d?s?u?l?d?l?u?u +?d?s?u?l?d?l?u?s +?d?s?u?l?d?l?s?d +?d?s?u?l?d?l?s?l +?d?s?u?l?d?l?s?u +?d?s?u?l?d?l?s?s +?d?s?u?l?d?u?d?d +?d?s?u?l?d?u?d?l +?d?s?u?l?d?u?d?u +?d?s?u?l?d?u?d?s +?d?s?u?l?d?u?l?d +?d?s?u?l?d?u?l?l +?d?s?u?l?d?u?l?u +?d?s?u?l?d?u?l?s +?d?s?u?l?d?u?u?d +?d?s?u?l?d?u?u?l +?d?s?u?l?d?u?u?u +?d?s?u?l?d?u?u?s +?d?s?u?l?d?u?s?d +?d?s?u?l?d?u?s?l +?d?s?u?l?d?u?s?u +?d?s?u?l?d?u?s?s +?d?s?u?l?d?s?d?d +?d?s?u?l?d?s?d?l +?d?s?u?l?d?s?d?u +?d?s?u?l?d?s?d?s +?d?s?u?l?d?s?l?d +?d?s?u?l?d?s?l?l +?d?s?u?l?d?s?l?u +?d?s?u?l?d?s?l?s +?d?s?u?l?d?s?u?d +?d?s?u?l?d?s?u?l +?d?s?u?l?d?s?u?u +?d?s?u?l?d?s?u?s +?d?s?u?l?d?s?s?d +?d?s?u?l?d?s?s?l +?d?s?u?l?d?s?s?u +?d?s?u?l?d?s?s?s +?d?s?u?l?l?d?d?d +?d?s?u?l?l?d?d?l +?d?s?u?l?l?d?d?u +?d?s?u?l?l?d?d?s +?d?s?u?l?l?d?l?d +?d?s?u?l?l?d?l?l +?d?s?u?l?l?d?l?u +?d?s?u?l?l?d?l?s +?d?s?u?l?l?d?u?d +?d?s?u?l?l?d?u?l +?d?s?u?l?l?d?u?u +?d?s?u?l?l?d?u?s +?d?s?u?l?l?d?s?d +?d?s?u?l?l?d?s?l +?d?s?u?l?l?d?s?u +?d?s?u?l?l?d?s?s +?d?s?u?l?l?l?d?d +?d?s?u?l?l?l?d?l +?d?s?u?l?l?l?d?u +?d?s?u?l?l?l?d?s +?d?s?u?l?l?l?l?d +?d?s?u?l?l?l?l?l +?d?s?u?l?l?l?l?u +?d?s?u?l?l?l?l?s +?d?s?u?l?l?l?u?d +?d?s?u?l?l?l?u?l +?d?s?u?l?l?l?u?u +?d?s?u?l?l?l?u?s +?d?s?u?l?l?l?s?d +?d?s?u?l?l?l?s?l +?d?s?u?l?l?l?s?u +?d?s?u?l?l?l?s?s +?d?s?u?l?l?u?d?d +?d?s?u?l?l?u?d?l +?d?s?u?l?l?u?d?u +?d?s?u?l?l?u?d?s +?d?s?u?l?l?u?l?d +?d?s?u?l?l?u?l?l +?d?s?u?l?l?u?l?u +?d?s?u?l?l?u?l?s +?d?s?u?l?l?u?u?d +?d?s?u?l?l?u?u?l +?d?s?u?l?l?u?u?u +?d?s?u?l?l?u?u?s +?d?s?u?l?l?u?s?d +?d?s?u?l?l?u?s?l +?d?s?u?l?l?u?s?u +?d?s?u?l?l?u?s?s +?d?s?u?l?l?s?d?d +?d?s?u?l?l?s?d?l +?d?s?u?l?l?s?d?u +?d?s?u?l?l?s?d?s +?d?s?u?l?l?s?l?d +?d?s?u?l?l?s?l?l +?d?s?u?l?l?s?l?u +?d?s?u?l?l?s?l?s +?d?s?u?l?l?s?u?d +?d?s?u?l?l?s?u?l +?d?s?u?l?l?s?u?u +?d?s?u?l?l?s?u?s +?d?s?u?l?l?s?s?d +?d?s?u?l?l?s?s?l +?d?s?u?l?l?s?s?u +?d?s?u?l?l?s?s?s +?d?s?u?l?u?d?d?d +?d?s?u?l?u?d?d?l +?d?s?u?l?u?d?d?u +?d?s?u?l?u?d?d?s +?d?s?u?l?u?d?l?d +?d?s?u?l?u?d?l?l +?d?s?u?l?u?d?l?u +?d?s?u?l?u?d?l?s +?d?s?u?l?u?d?u?d +?d?s?u?l?u?d?u?l +?d?s?u?l?u?d?u?u +?d?s?u?l?u?d?u?s +?d?s?u?l?u?d?s?d +?d?s?u?l?u?d?s?l +?d?s?u?l?u?d?s?u +?d?s?u?l?u?d?s?s +?d?s?u?l?u?l?d?d +?d?s?u?l?u?l?d?l +?d?s?u?l?u?l?d?u +?d?s?u?l?u?l?d?s +?d?s?u?l?u?l?l?d +?d?s?u?l?u?l?l?l +?d?s?u?l?u?l?l?u +?d?s?u?l?u?l?l?s +?d?s?u?l?u?l?u?d +?d?s?u?l?u?l?u?l +?d?s?u?l?u?l?u?u +?d?s?u?l?u?l?u?s +?d?s?u?l?u?l?s?d +?d?s?u?l?u?l?s?l +?d?s?u?l?u?l?s?u +?d?s?u?l?u?l?s?s +?d?s?u?l?u?u?d?d +?d?s?u?l?u?u?d?l +?d?s?u?l?u?u?d?u +?d?s?u?l?u?u?d?s +?d?s?u?l?u?u?l?d +?d?s?u?l?u?u?l?l +?d?s?u?l?u?u?l?u +?d?s?u?l?u?u?l?s +?d?s?u?l?u?u?u?d +?d?s?u?l?u?u?u?l +?d?s?u?l?u?u?u?u +?d?s?u?l?u?u?u?s +?d?s?u?l?u?u?s?d +?d?s?u?l?u?u?s?l +?d?s?u?l?u?u?s?u +?d?s?u?l?u?u?s?s +?d?s?u?l?u?s?d?d +?d?s?u?l?u?s?d?l +?d?s?u?l?u?s?d?u +?d?s?u?l?u?s?d?s +?d?s?u?l?u?s?l?d +?d?s?u?l?u?s?l?l +?d?s?u?l?u?s?l?u +?d?s?u?l?u?s?l?s +?d?s?u?l?u?s?u?d +?d?s?u?l?u?s?u?l +?d?s?u?l?u?s?u?u +?d?s?u?l?u?s?u?s +?d?s?u?l?u?s?s?d +?d?s?u?l?u?s?s?l +?d?s?u?l?u?s?s?u +?d?s?u?l?u?s?s?s +?d?s?u?l?s?d?d?d +?d?s?u?l?s?d?d?l +?d?s?u?l?s?d?d?u +?d?s?u?l?s?d?d?s +?d?s?u?l?s?d?l?d +?d?s?u?l?s?d?l?l +?d?s?u?l?s?d?l?u +?d?s?u?l?s?d?l?s +?d?s?u?l?s?d?u?d +?d?s?u?l?s?d?u?l +?d?s?u?l?s?d?u?u +?d?s?u?l?s?d?u?s +?d?s?u?l?s?d?s?d +?d?s?u?l?s?d?s?l +?d?s?u?l?s?d?s?u +?d?s?u?l?s?d?s?s +?d?s?u?l?s?l?d?d +?d?s?u?l?s?l?d?l +?d?s?u?l?s?l?d?u +?d?s?u?l?s?l?d?s +?d?s?u?l?s?l?l?d +?d?s?u?l?s?l?l?l +?d?s?u?l?s?l?l?u +?d?s?u?l?s?l?l?s +?d?s?u?l?s?l?u?d +?d?s?u?l?s?l?u?l +?d?s?u?l?s?l?u?u +?d?s?u?l?s?l?u?s +?d?s?u?l?s?l?s?d +?d?s?u?l?s?l?s?l +?d?s?u?l?s?l?s?u +?d?s?u?l?s?l?s?s +?d?s?u?l?s?u?d?d +?d?s?u?l?s?u?d?l +?d?s?u?l?s?u?d?u +?d?s?u?l?s?u?d?s +?d?s?u?l?s?u?l?d +?d?s?u?l?s?u?l?l +?d?s?u?l?s?u?l?u +?d?s?u?l?s?u?l?s +?d?s?u?l?s?u?u?d +?d?s?u?l?s?u?u?l +?d?s?u?l?s?u?u?u +?d?s?u?l?s?u?u?s +?d?s?u?l?s?u?s?d +?d?s?u?l?s?u?s?l +?d?s?u?l?s?u?s?u +?d?s?u?l?s?u?s?s +?d?s?u?l?s?s?d?d +?d?s?u?l?s?s?d?l +?d?s?u?l?s?s?d?u +?d?s?u?l?s?s?d?s +?d?s?u?l?s?s?l?d +?d?s?u?l?s?s?l?l +?d?s?u?l?s?s?l?u +?d?s?u?l?s?s?l?s +?d?s?u?l?s?s?u?d +?d?s?u?l?s?s?u?l +?d?s?u?l?s?s?u?u +?d?s?u?l?s?s?u?s +?d?s?u?l?s?s?s?d +?d?s?u?l?s?s?s?l +?d?s?u?l?s?s?s?u +?d?s?u?l?s?s?s?s +?d?s?u?u?d?d?d?l +?d?s?u?u?d?d?l?d +?d?s?u?u?d?d?l?l +?d?s?u?u?d?d?l?u +?d?s?u?u?d?d?l?s +?d?s?u?u?d?d?u?l +?d?s?u?u?d?d?s?l +?d?s?u?u?d?l?d?d +?d?s?u?u?d?l?d?l +?d?s?u?u?d?l?d?u +?d?s?u?u?d?l?d?s +?d?s?u?u?d?l?l?d +?d?s?u?u?d?l?l?l +?d?s?u?u?d?l?l?u +?d?s?u?u?d?l?l?s +?d?s?u?u?d?l?u?d +?d?s?u?u?d?l?u?l +?d?s?u?u?d?l?u?u +?d?s?u?u?d?l?u?s +?d?s?u?u?d?l?s?d +?d?s?u?u?d?l?s?l +?d?s?u?u?d?l?s?u +?d?s?u?u?d?l?s?s +?d?s?u?u?d?u?d?l +?d?s?u?u?d?u?l?d +?d?s?u?u?d?u?l?l +?d?s?u?u?d?u?l?u +?d?s?u?u?d?u?l?s +?d?s?u?u?d?u?u?l +?d?s?u?u?d?u?s?l +?d?s?u?u?d?s?d?l +?d?s?u?u?d?s?l?d +?d?s?u?u?d?s?l?l +?d?s?u?u?d?s?l?u +?d?s?u?u?d?s?l?s +?d?s?u?u?d?s?u?l +?d?s?u?u?d?s?s?l +?d?s?u?u?l?d?d?d +?d?s?u?u?l?d?d?l +?d?s?u?u?l?d?d?u +?d?s?u?u?l?d?d?s +?d?s?u?u?l?d?l?d +?d?s?u?u?l?d?l?l +?d?s?u?u?l?d?l?u +?d?s?u?u?l?d?l?s +?d?s?u?u?l?d?u?d +?d?s?u?u?l?d?u?l +?d?s?u?u?l?d?u?u +?d?s?u?u?l?d?u?s +?d?s?u?u?l?d?s?d +?d?s?u?u?l?d?s?l +?d?s?u?u?l?d?s?u +?d?s?u?u?l?d?s?s +?d?s?u?u?l?l?d?d +?d?s?u?u?l?l?d?l +?d?s?u?u?l?l?d?u +?d?s?u?u?l?l?d?s +?d?s?u?u?l?l?l?d +?d?s?u?u?l?l?l?l +?d?s?u?u?l?l?l?u +?d?s?u?u?l?l?l?s +?d?s?u?u?l?l?u?d +?d?s?u?u?l?l?u?l +?d?s?u?u?l?l?u?u +?d?s?u?u?l?l?u?s +?d?s?u?u?l?l?s?d +?d?s?u?u?l?l?s?l +?d?s?u?u?l?l?s?u +?d?s?u?u?l?l?s?s +?d?s?u?u?l?u?d?d +?d?s?u?u?l?u?d?l +?d?s?u?u?l?u?d?u +?d?s?u?u?l?u?d?s +?d?s?u?u?l?u?l?d +?d?s?u?u?l?u?l?l +?d?s?u?u?l?u?l?u +?d?s?u?u?l?u?l?s +?d?s?u?u?l?u?u?d +?d?s?u?u?l?u?u?l +?d?s?u?u?l?u?u?u +?d?s?u?u?l?u?u?s +?d?s?u?u?l?u?s?d +?d?s?u?u?l?u?s?l +?d?s?u?u?l?u?s?u +?d?s?u?u?l?u?s?s +?d?s?u?u?l?s?d?d +?d?s?u?u?l?s?d?l +?d?s?u?u?l?s?d?u +?d?s?u?u?l?s?d?s +?d?s?u?u?l?s?l?d +?d?s?u?u?l?s?l?l +?d?s?u?u?l?s?l?u +?d?s?u?u?l?s?l?s +?d?s?u?u?l?s?u?d +?d?s?u?u?l?s?u?l +?d?s?u?u?l?s?u?u +?d?s?u?u?l?s?u?s +?d?s?u?u?l?s?s?d +?d?s?u?u?l?s?s?l +?d?s?u?u?l?s?s?u +?d?s?u?u?l?s?s?s +?d?s?u?u?u?d?d?l +?d?s?u?u?u?d?l?d +?d?s?u?u?u?d?l?l +?d?s?u?u?u?d?l?u +?d?s?u?u?u?d?l?s +?d?s?u?u?u?d?u?l +?d?s?u?u?u?d?s?l +?d?s?u?u?u?l?d?d +?d?s?u?u?u?l?d?l +?d?s?u?u?u?l?d?u +?d?s?u?u?u?l?d?s +?d?s?u?u?u?l?l?d +?d?s?u?u?u?l?l?l +?d?s?u?u?u?l?l?u +?d?s?u?u?u?l?l?s +?d?s?u?u?u?l?u?d +?d?s?u?u?u?l?u?l +?d?s?u?u?u?l?u?u +?d?s?u?u?u?l?u?s +?d?s?u?u?u?l?s?d +?d?s?u?u?u?l?s?l +?d?s?u?u?u?l?s?u +?d?s?u?u?u?l?s?s +?d?s?u?u?u?u?d?l +?d?s?u?u?u?u?l?d +?d?s?u?u?u?u?l?l +?d?s?u?u?u?u?l?u +?d?s?u?u?u?u?l?s +?d?s?u?u?u?u?u?l +?d?s?u?u?u?u?s?l +?d?s?u?u?u?s?d?l +?d?s?u?u?u?s?l?d +?d?s?u?u?u?s?l?l +?d?s?u?u?u?s?l?u +?d?s?u?u?u?s?l?s +?d?s?u?u?u?s?u?l +?d?s?u?u?u?s?s?l +?d?s?u?u?s?d?d?l +?d?s?u?u?s?d?l?d +?d?s?u?u?s?d?l?l +?d?s?u?u?s?d?l?u +?d?s?u?u?s?d?l?s +?d?s?u?u?s?d?u?l +?d?s?u?u?s?d?s?l +?d?s?u?u?s?l?d?d +?d?s?u?u?s?l?d?l +?d?s?u?u?s?l?d?u +?d?s?u?u?s?l?d?s +?d?s?u?u?s?l?l?d +?d?s?u?u?s?l?l?l +?d?s?u?u?s?l?l?u +?d?s?u?u?s?l?l?s +?d?s?u?u?s?l?u?d +?d?s?u?u?s?l?u?l +?d?s?u?u?s?l?u?u +?d?s?u?u?s?l?u?s +?d?s?u?u?s?l?s?d +?d?s?u?u?s?l?s?l +?d?s?u?u?s?l?s?u +?d?s?u?u?s?l?s?s +?d?s?u?u?s?u?d?l +?d?s?u?u?s?u?l?d +?d?s?u?u?s?u?l?l +?d?s?u?u?s?u?l?u +?d?s?u?u?s?u?l?s +?d?s?u?u?s?u?u?l +?d?s?u?u?s?u?s?l +?d?s?u?u?s?s?d?l +?d?s?u?u?s?s?l?d +?d?s?u?u?s?s?l?l +?d?s?u?u?s?s?l?u +?d?s?u?u?s?s?l?s +?d?s?u?u?s?s?u?l +?d?s?u?u?s?s?s?l +?d?s?u?s?d?d?d?l +?d?s?u?s?d?d?l?d +?d?s?u?s?d?d?l?l +?d?s?u?s?d?d?l?u +?d?s?u?s?d?d?l?s +?d?s?u?s?d?d?u?l +?d?s?u?s?d?d?s?l +?d?s?u?s?d?l?d?d +?d?s?u?s?d?l?d?l +?d?s?u?s?d?l?d?u +?d?s?u?s?d?l?d?s +?d?s?u?s?d?l?l?d +?d?s?u?s?d?l?l?l +?d?s?u?s?d?l?l?u +?d?s?u?s?d?l?l?s +?d?s?u?s?d?l?u?d +?d?s?u?s?d?l?u?l +?d?s?u?s?d?l?u?u +?d?s?u?s?d?l?u?s +?d?s?u?s?d?l?s?d +?d?s?u?s?d?l?s?l +?d?s?u?s?d?l?s?u +?d?s?u?s?d?l?s?s +?d?s?u?s?d?u?d?l +?d?s?u?s?d?u?l?d +?d?s?u?s?d?u?l?l +?d?s?u?s?d?u?l?u +?d?s?u?s?d?u?l?s +?d?s?u?s?d?u?u?l +?d?s?u?s?d?u?s?l +?d?s?u?s?d?s?d?l +?d?s?u?s?d?s?l?d +?d?s?u?s?d?s?l?l +?d?s?u?s?d?s?l?u +?d?s?u?s?d?s?l?s +?d?s?u?s?d?s?u?l +?d?s?u?s?d?s?s?l +?d?s?u?s?l?d?d?d +?d?s?u?s?l?d?d?l +?d?s?u?s?l?d?d?u +?d?s?u?s?l?d?d?s +?d?s?u?s?l?d?l?d +?d?s?u?s?l?d?l?l +?d?s?u?s?l?d?l?u +?d?s?u?s?l?d?l?s +?d?s?u?s?l?d?u?d +?d?s?u?s?l?d?u?l +?d?s?u?s?l?d?u?u +?d?s?u?s?l?d?u?s +?d?s?u?s?l?d?s?d +?d?s?u?s?l?d?s?l +?d?s?u?s?l?d?s?u +?d?s?u?s?l?d?s?s +?d?s?u?s?l?l?d?d +?d?s?u?s?l?l?d?l +?d?s?u?s?l?l?d?u +?d?s?u?s?l?l?d?s +?d?s?u?s?l?l?l?d +?d?s?u?s?l?l?l?l +?d?s?u?s?l?l?l?u +?d?s?u?s?l?l?l?s +?d?s?u?s?l?l?u?d +?d?s?u?s?l?l?u?l +?d?s?u?s?l?l?u?u +?d?s?u?s?l?l?u?s +?d?s?u?s?l?l?s?d +?d?s?u?s?l?l?s?l +?d?s?u?s?l?l?s?u +?d?s?u?s?l?l?s?s +?d?s?u?s?l?u?d?d +?d?s?u?s?l?u?d?l +?d?s?u?s?l?u?d?u +?d?s?u?s?l?u?d?s +?d?s?u?s?l?u?l?d +?d?s?u?s?l?u?l?l +?d?s?u?s?l?u?l?u +?d?s?u?s?l?u?l?s +?d?s?u?s?l?u?u?d +?d?s?u?s?l?u?u?l +?d?s?u?s?l?u?u?u +?d?s?u?s?l?u?u?s +?d?s?u?s?l?u?s?d +?d?s?u?s?l?u?s?l +?d?s?u?s?l?u?s?u +?d?s?u?s?l?u?s?s +?d?s?u?s?l?s?d?d +?d?s?u?s?l?s?d?l +?d?s?u?s?l?s?d?u +?d?s?u?s?l?s?d?s +?d?s?u?s?l?s?l?d +?d?s?u?s?l?s?l?l +?d?s?u?s?l?s?l?u +?d?s?u?s?l?s?l?s +?d?s?u?s?l?s?u?d +?d?s?u?s?l?s?u?l +?d?s?u?s?l?s?u?u +?d?s?u?s?l?s?u?s +?d?s?u?s?l?s?s?d +?d?s?u?s?l?s?s?l +?d?s?u?s?l?s?s?u +?d?s?u?s?l?s?s?s +?d?s?u?s?u?d?d?l +?d?s?u?s?u?d?l?d +?d?s?u?s?u?d?l?l +?d?s?u?s?u?d?l?u +?d?s?u?s?u?d?l?s +?d?s?u?s?u?d?u?l +?d?s?u?s?u?d?s?l +?d?s?u?s?u?l?d?d +?d?s?u?s?u?l?d?l +?d?s?u?s?u?l?d?u +?d?s?u?s?u?l?d?s +?d?s?u?s?u?l?l?d +?d?s?u?s?u?l?l?l +?d?s?u?s?u?l?l?u +?d?s?u?s?u?l?l?s +?d?s?u?s?u?l?u?d +?d?s?u?s?u?l?u?l +?d?s?u?s?u?l?u?u +?d?s?u?s?u?l?u?s +?d?s?u?s?u?l?s?d +?d?s?u?s?u?l?s?l +?d?s?u?s?u?l?s?u +?d?s?u?s?u?l?s?s +?d?s?u?s?u?u?d?l +?d?s?u?s?u?u?l?d +?d?s?u?s?u?u?l?l +?d?s?u?s?u?u?l?u +?d?s?u?s?u?u?l?s +?d?s?u?s?u?u?u?l +?d?s?u?s?u?u?s?l +?d?s?u?s?u?s?d?l +?d?s?u?s?u?s?l?d +?d?s?u?s?u?s?l?l +?d?s?u?s?u?s?l?u +?d?s?u?s?u?s?l?s +?d?s?u?s?u?s?u?l +?d?s?u?s?u?s?s?l +?d?s?u?s?s?d?d?l +?d?s?u?s?s?d?l?d +?d?s?u?s?s?d?l?l +?d?s?u?s?s?d?l?u +?d?s?u?s?s?d?l?s +?d?s?u?s?s?d?u?l +?d?s?u?s?s?d?s?l +?d?s?u?s?s?l?d?d +?d?s?u?s?s?l?d?l +?d?s?u?s?s?l?d?u +?d?s?u?s?s?l?d?s +?d?s?u?s?s?l?l?d +?d?s?u?s?s?l?l?l +?d?s?u?s?s?l?l?u +?d?s?u?s?s?l?l?s +?d?s?u?s?s?l?u?d +?d?s?u?s?s?l?u?l +?d?s?u?s?s?l?u?u +?d?s?u?s?s?l?u?s +?d?s?u?s?s?l?s?d +?d?s?u?s?s?l?s?l +?d?s?u?s?s?l?s?u +?d?s?u?s?s?l?s?s +?d?s?u?s?s?u?d?l +?d?s?u?s?s?u?l?d +?d?s?u?s?s?u?l?l +?d?s?u?s?s?u?l?u +?d?s?u?s?s?u?l?s +?d?s?u?s?s?u?u?l +?d?s?u?s?s?u?s?l +?d?s?u?s?s?s?d?l +?d?s?u?s?s?s?l?d +?d?s?u?s?s?s?l?l +?d?s?u?s?s?s?l?u +?d?s?u?s?s?s?l?s +?d?s?u?s?s?s?u?l +?d?s?u?s?s?s?s?l +?d?s?s?d?d?d?l?u +?d?s?s?d?d?d?u?l +?d?s?s?d?d?l?d?u +?d?s?s?d?d?l?l?u +?d?s?s?d?d?l?u?d +?d?s?s?d?d?l?u?l +?d?s?s?d?d?l?u?u +?d?s?s?d?d?l?u?s +?d?s?s?d?d?l?s?u +?d?s?s?d?d?u?d?l +?d?s?s?d?d?u?l?d +?d?s?s?d?d?u?l?l +?d?s?s?d?d?u?l?u +?d?s?s?d?d?u?l?s +?d?s?s?d?d?u?u?l +?d?s?s?d?d?u?s?l +?d?s?s?d?d?s?l?u +?d?s?s?d?d?s?u?l +?d?s?s?d?l?d?d?u +?d?s?s?d?l?d?l?u +?d?s?s?d?l?d?u?d +?d?s?s?d?l?d?u?l +?d?s?s?d?l?d?u?u +?d?s?s?d?l?d?u?s +?d?s?s?d?l?d?s?u +?d?s?s?d?l?l?d?u +?d?s?s?d?l?l?l?u +?d?s?s?d?l?l?u?d +?d?s?s?d?l?l?u?l +?d?s?s?d?l?l?u?u +?d?s?s?d?l?l?u?s +?d?s?s?d?l?l?s?u +?d?s?s?d?l?u?d?d +?d?s?s?d?l?u?d?l +?d?s?s?d?l?u?d?u +?d?s?s?d?l?u?d?s +?d?s?s?d?l?u?l?d +?d?s?s?d?l?u?l?l +?d?s?s?d?l?u?l?u +?d?s?s?d?l?u?l?s +?d?s?s?d?l?u?u?d +?d?s?s?d?l?u?u?l +?d?s?s?d?l?u?u?u +?d?s?s?d?l?u?u?s +?d?s?s?d?l?u?s?d +?d?s?s?d?l?u?s?l +?d?s?s?d?l?u?s?u +?d?s?s?d?l?u?s?s +?d?s?s?d?l?s?d?u +?d?s?s?d?l?s?l?u +?d?s?s?d?l?s?u?d +?d?s?s?d?l?s?u?l +?d?s?s?d?l?s?u?u +?d?s?s?d?l?s?u?s +?d?s?s?d?l?s?s?u +?d?s?s?d?u?d?d?l +?d?s?s?d?u?d?l?d +?d?s?s?d?u?d?l?l +?d?s?s?d?u?d?l?u +?d?s?s?d?u?d?l?s +?d?s?s?d?u?d?u?l +?d?s?s?d?u?d?s?l +?d?s?s?d?u?l?d?d +?d?s?s?d?u?l?d?l +?d?s?s?d?u?l?d?u +?d?s?s?d?u?l?d?s +?d?s?s?d?u?l?l?d +?d?s?s?d?u?l?l?l +?d?s?s?d?u?l?l?u +?d?s?s?d?u?l?l?s +?d?s?s?d?u?l?u?d +?d?s?s?d?u?l?u?l +?d?s?s?d?u?l?u?u +?d?s?s?d?u?l?u?s +?d?s?s?d?u?l?s?d +?d?s?s?d?u?l?s?l +?d?s?s?d?u?l?s?u +?d?s?s?d?u?l?s?s +?d?s?s?d?u?u?d?l +?d?s?s?d?u?u?l?d +?d?s?s?d?u?u?l?l +?d?s?s?d?u?u?l?u +?d?s?s?d?u?u?l?s +?d?s?s?d?u?u?u?l +?d?s?s?d?u?u?s?l +?d?s?s?d?u?s?d?l +?d?s?s?d?u?s?l?d +?d?s?s?d?u?s?l?l +?d?s?s?d?u?s?l?u +?d?s?s?d?u?s?l?s +?d?s?s?d?u?s?u?l +?d?s?s?d?u?s?s?l +?d?s?s?d?s?d?l?u +?d?s?s?d?s?d?u?l +?d?s?s?d?s?l?d?u +?d?s?s?d?s?l?l?u +?d?s?s?d?s?l?u?d +?d?s?s?d?s?l?u?l +?d?s?s?d?s?l?u?u +?d?s?s?d?s?l?u?s +?d?s?s?d?s?l?s?u +?d?s?s?d?s?u?d?l +?d?s?s?d?s?u?l?d +?d?s?s?d?s?u?l?l +?d?s?s?d?s?u?l?u +?d?s?s?d?s?u?l?s +?d?s?s?d?s?u?u?l +?d?s?s?d?s?u?s?l +?d?s?s?d?s?s?l?u +?d?s?s?d?s?s?u?l +?d?s?s?l?d?d?d?u +?d?s?s?l?d?d?l?u +?d?s?s?l?d?d?u?d +?d?s?s?l?d?d?u?l +?d?s?s?l?d?d?u?u +?d?s?s?l?d?d?u?s +?d?s?s?l?d?d?s?u +?d?s?s?l?d?l?d?u +?d?s?s?l?d?l?l?u +?d?s?s?l?d?l?u?d +?d?s?s?l?d?l?u?l +?d?s?s?l?d?l?u?u +?d?s?s?l?d?l?u?s +?d?s?s?l?d?l?s?u +?d?s?s?l?d?u?d?d +?d?s?s?l?d?u?d?l +?d?s?s?l?d?u?d?u +?d?s?s?l?d?u?d?s +?d?s?s?l?d?u?l?d +?d?s?s?l?d?u?l?l +?d?s?s?l?d?u?l?u +?d?s?s?l?d?u?l?s +?d?s?s?l?d?u?u?d +?d?s?s?l?d?u?u?l +?d?s?s?l?d?u?u?u +?d?s?s?l?d?u?u?s +?d?s?s?l?d?u?s?d +?d?s?s?l?d?u?s?l +?d?s?s?l?d?u?s?u +?d?s?s?l?d?u?s?s +?d?s?s?l?d?s?d?u +?d?s?s?l?d?s?l?u +?d?s?s?l?d?s?u?d +?d?s?s?l?d?s?u?l +?d?s?s?l?d?s?u?u +?d?s?s?l?d?s?u?s +?d?s?s?l?d?s?s?u +?d?s?s?l?l?d?d?u +?d?s?s?l?l?d?l?u +?d?s?s?l?l?d?u?d +?d?s?s?l?l?d?u?l +?d?s?s?l?l?d?u?u +?d?s?s?l?l?d?u?s +?d?s?s?l?l?d?s?u +?d?s?s?l?l?l?d?u +?d?s?s?l?l?l?l?u +?d?s?s?l?l?l?u?d +?d?s?s?l?l?l?u?l +?d?s?s?l?l?l?u?u +?d?s?s?l?l?l?u?s +?d?s?s?l?l?l?s?u +?d?s?s?l?l?u?d?d +?d?s?s?l?l?u?d?l +?d?s?s?l?l?u?d?u +?d?s?s?l?l?u?d?s +?d?s?s?l?l?u?l?d +?d?s?s?l?l?u?l?l +?d?s?s?l?l?u?l?u +?d?s?s?l?l?u?l?s +?d?s?s?l?l?u?u?d +?d?s?s?l?l?u?u?l +?d?s?s?l?l?u?u?u +?d?s?s?l?l?u?u?s +?d?s?s?l?l?u?s?d +?d?s?s?l?l?u?s?l +?d?s?s?l?l?u?s?u +?d?s?s?l?l?u?s?s +?d?s?s?l?l?s?d?u +?d?s?s?l?l?s?l?u +?d?s?s?l?l?s?u?d +?d?s?s?l?l?s?u?l +?d?s?s?l?l?s?u?u +?d?s?s?l?l?s?u?s +?d?s?s?l?l?s?s?u +?d?s?s?l?u?d?d?d +?d?s?s?l?u?d?d?l +?d?s?s?l?u?d?d?u +?d?s?s?l?u?d?d?s +?d?s?s?l?u?d?l?d +?d?s?s?l?u?d?l?l +?d?s?s?l?u?d?l?u +?d?s?s?l?u?d?l?s +?d?s?s?l?u?d?u?d +?d?s?s?l?u?d?u?l +?d?s?s?l?u?d?u?u +?d?s?s?l?u?d?u?s +?d?s?s?l?u?d?s?d +?d?s?s?l?u?d?s?l +?d?s?s?l?u?d?s?u +?d?s?s?l?u?d?s?s +?d?s?s?l?u?l?d?d +?d?s?s?l?u?l?d?l +?d?s?s?l?u?l?d?u +?d?s?s?l?u?l?d?s +?d?s?s?l?u?l?l?d +?d?s?s?l?u?l?l?l +?d?s?s?l?u?l?l?u +?d?s?s?l?u?l?l?s +?d?s?s?l?u?l?u?d +?d?s?s?l?u?l?u?l +?d?s?s?l?u?l?u?u +?d?s?s?l?u?l?u?s +?d?s?s?l?u?l?s?d +?d?s?s?l?u?l?s?l +?d?s?s?l?u?l?s?u +?d?s?s?l?u?l?s?s +?d?s?s?l?u?u?d?d +?d?s?s?l?u?u?d?l +?d?s?s?l?u?u?d?u +?d?s?s?l?u?u?d?s +?d?s?s?l?u?u?l?d +?d?s?s?l?u?u?l?l +?d?s?s?l?u?u?l?u +?d?s?s?l?u?u?l?s +?d?s?s?l?u?u?u?d +?d?s?s?l?u?u?u?l +?d?s?s?l?u?u?u?u +?d?s?s?l?u?u?u?s +?d?s?s?l?u?u?s?d +?d?s?s?l?u?u?s?l +?d?s?s?l?u?u?s?u +?d?s?s?l?u?u?s?s +?d?s?s?l?u?s?d?d +?d?s?s?l?u?s?d?l +?d?s?s?l?u?s?d?u +?d?s?s?l?u?s?d?s +?d?s?s?l?u?s?l?d +?d?s?s?l?u?s?l?l +?d?s?s?l?u?s?l?u +?d?s?s?l?u?s?l?s +?d?s?s?l?u?s?u?d +?d?s?s?l?u?s?u?l +?d?s?s?l?u?s?u?u +?d?s?s?l?u?s?u?s +?d?s?s?l?u?s?s?d +?d?s?s?l?u?s?s?l +?d?s?s?l?u?s?s?u +?d?s?s?l?u?s?s?s +?d?s?s?l?s?d?d?u +?d?s?s?l?s?d?l?u +?d?s?s?l?s?d?u?d +?d?s?s?l?s?d?u?l +?d?s?s?l?s?d?u?u +?d?s?s?l?s?d?u?s +?d?s?s?l?s?d?s?u +?d?s?s?l?s?l?d?u +?d?s?s?l?s?l?l?u +?d?s?s?l?s?l?u?d +?d?s?s?l?s?l?u?l +?d?s?s?l?s?l?u?u +?d?s?s?l?s?l?u?s +?d?s?s?l?s?l?s?u +?d?s?s?l?s?u?d?d +?d?s?s?l?s?u?d?l +?d?s?s?l?s?u?d?u +?d?s?s?l?s?u?d?s +?d?s?s?l?s?u?l?d +?d?s?s?l?s?u?l?l +?d?s?s?l?s?u?l?u +?d?s?s?l?s?u?l?s +?d?s?s?l?s?u?u?d +?d?s?s?l?s?u?u?l +?d?s?s?l?s?u?u?u +?d?s?s?l?s?u?u?s +?d?s?s?l?s?u?s?d +?d?s?s?l?s?u?s?l +?d?s?s?l?s?u?s?u +?d?s?s?l?s?u?s?s +?d?s?s?l?s?s?d?u +?d?s?s?l?s?s?l?u +?d?s?s?l?s?s?u?d +?d?s?s?l?s?s?u?l +?d?s?s?l?s?s?u?u +?d?s?s?l?s?s?u?s +?d?s?s?l?s?s?s?u +?d?s?s?u?d?d?d?l +?d?s?s?u?d?d?l?d +?d?s?s?u?d?d?l?l +?d?s?s?u?d?d?l?u +?d?s?s?u?d?d?l?s +?d?s?s?u?d?d?u?l +?d?s?s?u?d?d?s?l +?d?s?s?u?d?l?d?d +?d?s?s?u?d?l?d?l +?d?s?s?u?d?l?d?u +?d?s?s?u?d?l?d?s +?d?s?s?u?d?l?l?d +?d?s?s?u?d?l?l?l +?d?s?s?u?d?l?l?u +?d?s?s?u?d?l?l?s +?d?s?s?u?d?l?u?d +?d?s?s?u?d?l?u?l +?d?s?s?u?d?l?u?u +?d?s?s?u?d?l?u?s +?d?s?s?u?d?l?s?d +?d?s?s?u?d?l?s?l +?d?s?s?u?d?l?s?u +?d?s?s?u?d?l?s?s +?d?s?s?u?d?u?d?l +?d?s?s?u?d?u?l?d +?d?s?s?u?d?u?l?l +?d?s?s?u?d?u?l?u +?d?s?s?u?d?u?l?s +?d?s?s?u?d?u?u?l +?d?s?s?u?d?u?s?l +?d?s?s?u?d?s?d?l +?d?s?s?u?d?s?l?d +?d?s?s?u?d?s?l?l +?d?s?s?u?d?s?l?u +?d?s?s?u?d?s?l?s +?d?s?s?u?d?s?u?l +?d?s?s?u?d?s?s?l +?d?s?s?u?l?d?d?d +?d?s?s?u?l?d?d?l +?d?s?s?u?l?d?d?u +?d?s?s?u?l?d?d?s +?d?s?s?u?l?d?l?d +?d?s?s?u?l?d?l?l +?d?s?s?u?l?d?l?u +?d?s?s?u?l?d?l?s +?d?s?s?u?l?d?u?d +?d?s?s?u?l?d?u?l +?d?s?s?u?l?d?u?u +?d?s?s?u?l?d?u?s +?d?s?s?u?l?d?s?d +?d?s?s?u?l?d?s?l +?d?s?s?u?l?d?s?u +?d?s?s?u?l?d?s?s +?d?s?s?u?l?l?d?d +?d?s?s?u?l?l?d?l +?d?s?s?u?l?l?d?u +?d?s?s?u?l?l?d?s +?d?s?s?u?l?l?l?d +?d?s?s?u?l?l?l?l +?d?s?s?u?l?l?l?u +?d?s?s?u?l?l?l?s +?d?s?s?u?l?l?u?d +?d?s?s?u?l?l?u?l +?d?s?s?u?l?l?u?u +?d?s?s?u?l?l?u?s +?d?s?s?u?l?l?s?d +?d?s?s?u?l?l?s?l +?d?s?s?u?l?l?s?u +?d?s?s?u?l?l?s?s +?d?s?s?u?l?u?d?d +?d?s?s?u?l?u?d?l +?d?s?s?u?l?u?d?u +?d?s?s?u?l?u?d?s +?d?s?s?u?l?u?l?d +?d?s?s?u?l?u?l?l +?d?s?s?u?l?u?l?u +?d?s?s?u?l?u?l?s +?d?s?s?u?l?u?u?d +?d?s?s?u?l?u?u?l +?d?s?s?u?l?u?u?u +?d?s?s?u?l?u?u?s +?d?s?s?u?l?u?s?d +?d?s?s?u?l?u?s?l +?d?s?s?u?l?u?s?u +?d?s?s?u?l?u?s?s +?d?s?s?u?l?s?d?d +?d?s?s?u?l?s?d?l +?d?s?s?u?l?s?d?u +?d?s?s?u?l?s?d?s +?d?s?s?u?l?s?l?d +?d?s?s?u?l?s?l?l +?d?s?s?u?l?s?l?u +?d?s?s?u?l?s?l?s +?d?s?s?u?l?s?u?d +?d?s?s?u?l?s?u?l +?d?s?s?u?l?s?u?u +?d?s?s?u?l?s?u?s +?d?s?s?u?l?s?s?d +?d?s?s?u?l?s?s?l +?d?s?s?u?l?s?s?u +?d?s?s?u?l?s?s?s +?d?s?s?u?u?d?d?l +?d?s?s?u?u?d?l?d +?d?s?s?u?u?d?l?l +?d?s?s?u?u?d?l?u +?d?s?s?u?u?d?l?s +?d?s?s?u?u?d?u?l +?d?s?s?u?u?d?s?l +?d?s?s?u?u?l?d?d +?d?s?s?u?u?l?d?l +?d?s?s?u?u?l?d?u +?d?s?s?u?u?l?d?s +?d?s?s?u?u?l?l?d +?d?s?s?u?u?l?l?l +?d?s?s?u?u?l?l?u +?d?s?s?u?u?l?l?s +?d?s?s?u?u?l?u?d +?d?s?s?u?u?l?u?l +?d?s?s?u?u?l?u?u +?d?s?s?u?u?l?u?s +?d?s?s?u?u?l?s?d +?d?s?s?u?u?l?s?l +?d?s?s?u?u?l?s?u +?d?s?s?u?u?l?s?s +?d?s?s?u?u?u?d?l +?d?s?s?u?u?u?l?d +?d?s?s?u?u?u?l?l +?d?s?s?u?u?u?l?u +?d?s?s?u?u?u?l?s +?d?s?s?u?u?u?u?l +?d?s?s?u?u?u?s?l +?d?s?s?u?u?s?d?l +?d?s?s?u?u?s?l?d +?d?s?s?u?u?s?l?l +?d?s?s?u?u?s?l?u +?d?s?s?u?u?s?l?s +?d?s?s?u?u?s?u?l +?d?s?s?u?u?s?s?l +?d?s?s?u?s?d?d?l +?d?s?s?u?s?d?l?d +?d?s?s?u?s?d?l?l +?d?s?s?u?s?d?l?u +?d?s?s?u?s?d?l?s +?d?s?s?u?s?d?u?l +?d?s?s?u?s?d?s?l +?d?s?s?u?s?l?d?d +?d?s?s?u?s?l?d?l +?d?s?s?u?s?l?d?u +?d?s?s?u?s?l?d?s +?d?s?s?u?s?l?l?d +?d?s?s?u?s?l?l?l +?d?s?s?u?s?l?l?u +?d?s?s?u?s?l?l?s +?d?s?s?u?s?l?u?d +?d?s?s?u?s?l?u?l +?d?s?s?u?s?l?u?u +?d?s?s?u?s?l?u?s +?d?s?s?u?s?l?s?d +?d?s?s?u?s?l?s?l +?d?s?s?u?s?l?s?u +?d?s?s?u?s?l?s?s +?d?s?s?u?s?u?d?l +?d?s?s?u?s?u?l?d +?d?s?s?u?s?u?l?l +?d?s?s?u?s?u?l?u +?d?s?s?u?s?u?l?s +?d?s?s?u?s?u?u?l +?d?s?s?u?s?u?s?l +?d?s?s?u?s?s?d?l +?d?s?s?u?s?s?l?d +?d?s?s?u?s?s?l?l +?d?s?s?u?s?s?l?u +?d?s?s?u?s?s?l?s +?d?s?s?u?s?s?u?l +?d?s?s?u?s?s?s?l +?d?s?s?s?d?d?l?u +?d?s?s?s?d?d?u?l +?d?s?s?s?d?l?d?u +?d?s?s?s?d?l?l?u +?d?s?s?s?d?l?u?d +?d?s?s?s?d?l?u?l +?d?s?s?s?d?l?u?u +?d?s?s?s?d?l?u?s +?d?s?s?s?d?l?s?u +?d?s?s?s?d?u?d?l +?d?s?s?s?d?u?l?d +?d?s?s?s?d?u?l?l +?d?s?s?s?d?u?l?u +?d?s?s?s?d?u?l?s +?d?s?s?s?d?u?u?l +?d?s?s?s?d?u?s?l +?d?s?s?s?d?s?l?u +?d?s?s?s?d?s?u?l +?d?s?s?s?l?d?d?u +?d?s?s?s?l?d?l?u +?d?s?s?s?l?d?u?d +?d?s?s?s?l?d?u?l +?d?s?s?s?l?d?u?u +?d?s?s?s?l?d?u?s +?d?s?s?s?l?d?s?u +?d?s?s?s?l?l?d?u +?d?s?s?s?l?l?l?u +?d?s?s?s?l?l?u?d +?d?s?s?s?l?l?u?l +?d?s?s?s?l?l?u?u +?d?s?s?s?l?l?u?s +?d?s?s?s?l?l?s?u +?d?s?s?s?l?u?d?d +?d?s?s?s?l?u?d?l +?d?s?s?s?l?u?d?u +?d?s?s?s?l?u?d?s +?d?s?s?s?l?u?l?d +?d?s?s?s?l?u?l?l +?d?s?s?s?l?u?l?u +?d?s?s?s?l?u?l?s +?d?s?s?s?l?u?u?d +?d?s?s?s?l?u?u?l +?d?s?s?s?l?u?u?u +?d?s?s?s?l?u?u?s +?d?s?s?s?l?u?s?d +?d?s?s?s?l?u?s?l +?d?s?s?s?l?u?s?u +?d?s?s?s?l?u?s?s +?d?s?s?s?l?s?d?u +?d?s?s?s?l?s?l?u +?d?s?s?s?l?s?u?d +?d?s?s?s?l?s?u?l +?d?s?s?s?l?s?u?u +?d?s?s?s?l?s?u?s +?d?s?s?s?l?s?s?u +?d?s?s?s?u?d?d?l +?d?s?s?s?u?d?l?d +?d?s?s?s?u?d?l?l +?d?s?s?s?u?d?l?u +?d?s?s?s?u?d?l?s +?d?s?s?s?u?d?u?l +?d?s?s?s?u?d?s?l +?d?s?s?s?u?l?d?d +?d?s?s?s?u?l?d?l +?d?s?s?s?u?l?d?u +?d?s?s?s?u?l?d?s +?d?s?s?s?u?l?l?d +?d?s?s?s?u?l?l?l +?d?s?s?s?u?l?l?u +?d?s?s?s?u?l?l?s +?d?s?s?s?u?l?u?d +?d?s?s?s?u?l?u?l +?d?s?s?s?u?l?u?u +?d?s?s?s?u?l?u?s +?d?s?s?s?u?l?s?d +?d?s?s?s?u?l?s?l +?d?s?s?s?u?l?s?u +?d?s?s?s?u?l?s?s +?d?s?s?s?u?u?d?l +?d?s?s?s?u?u?l?d +?d?s?s?s?u?u?l?l +?d?s?s?s?u?u?l?u +?d?s?s?s?u?u?l?s +?d?s?s?s?u?u?u?l +?d?s?s?s?u?u?s?l +?d?s?s?s?u?s?d?l +?d?s?s?s?u?s?l?d +?d?s?s?s?u?s?l?l +?d?s?s?s?u?s?l?u +?d?s?s?s?u?s?l?s +?d?s?s?s?u?s?u?l +?d?s?s?s?u?s?s?l +?d?s?s?s?s?d?l?u +?d?s?s?s?s?d?u?l +?d?s?s?s?s?l?d?u +?d?s?s?s?s?l?l?u +?d?s?s?s?s?l?u?d +?d?s?s?s?s?l?u?l +?d?s?s?s?s?l?u?u +?d?s?s?s?s?l?u?s +?d?s?s?s?s?l?s?u +?d?s?s?s?s?u?d?l +?d?s?s?s?s?u?l?d +?d?s?s?s?s?u?l?l +?d?s?s?s?s?u?l?u +?d?s?s?s?s?u?l?s +?d?s?s?s?s?u?u?l +?d?s?s?s?s?u?s?l +?d?s?s?s?s?s?l?u +?d?s?s?s?s?s?u?l +?l?d?d?d?d?d?u?s +?l?d?d?d?d?d?s?u +?l?d?d?d?d?l?u?s +?l?d?d?d?d?l?s?u +?l?d?d?d?d?u?d?s +?l?d?d?d?d?u?l?s +?l?d?d?d?d?u?u?s +?l?d?d?d?d?u?s?d +?l?d?d?d?d?u?s?l +?l?d?d?d?d?u?s?u +?l?d?d?d?d?u?s?s +?l?d?d?d?d?s?d?u +?l?d?d?d?d?s?l?u +?l?d?d?d?d?s?u?d +?l?d?d?d?d?s?u?l +?l?d?d?d?d?s?u?u +?l?d?d?d?d?s?u?s +?l?d?d?d?d?s?s?u +?l?d?d?d?l?d?u?s +?l?d?d?d?l?d?s?u +?l?d?d?d?l?l?u?s +?l?d?d?d?l?l?s?u +?l?d?d?d?l?u?d?s +?l?d?d?d?l?u?l?s +?l?d?d?d?l?u?u?s +?l?d?d?d?l?u?s?d +?l?d?d?d?l?u?s?l +?l?d?d?d?l?u?s?u +?l?d?d?d?l?u?s?s +?l?d?d?d?l?s?d?u +?l?d?d?d?l?s?l?u +?l?d?d?d?l?s?u?d +?l?d?d?d?l?s?u?l +?l?d?d?d?l?s?u?u +?l?d?d?d?l?s?u?s +?l?d?d?d?l?s?s?u +?l?d?d?d?u?d?d?s +?l?d?d?d?u?d?l?s +?l?d?d?d?u?d?u?s +?l?d?d?d?u?d?s?d +?l?d?d?d?u?d?s?l +?l?d?d?d?u?d?s?u +?l?d?d?d?u?d?s?s +?l?d?d?d?u?l?d?s +?l?d?d?d?u?l?l?s +?l?d?d?d?u?l?u?s +?l?d?d?d?u?l?s?d +?l?d?d?d?u?l?s?l +?l?d?d?d?u?l?s?u +?l?d?d?d?u?l?s?s +?l?d?d?d?u?u?d?s +?l?d?d?d?u?u?l?s +?l?d?d?d?u?u?u?s +?l?d?d?d?u?u?s?d +?l?d?d?d?u?u?s?l +?l?d?d?d?u?u?s?u +?l?d?d?d?u?u?s?s +?l?d?d?d?u?s?d?d +?l?d?d?d?u?s?d?l +?l?d?d?d?u?s?d?u +?l?d?d?d?u?s?d?s +?l?d?d?d?u?s?l?d +?l?d?d?d?u?s?l?l +?l?d?d?d?u?s?l?u +?l?d?d?d?u?s?l?s +?l?d?d?d?u?s?u?d +?l?d?d?d?u?s?u?l +?l?d?d?d?u?s?u?u +?l?d?d?d?u?s?u?s +?l?d?d?d?u?s?s?d +?l?d?d?d?u?s?s?l +?l?d?d?d?u?s?s?u +?l?d?d?d?u?s?s?s +?l?d?d?d?s?d?d?u +?l?d?d?d?s?d?l?u +?l?d?d?d?s?d?u?d +?l?d?d?d?s?d?u?l +?l?d?d?d?s?d?u?u +?l?d?d?d?s?d?u?s +?l?d?d?d?s?d?s?u +?l?d?d?d?s?l?d?u +?l?d?d?d?s?l?l?u +?l?d?d?d?s?l?u?d +?l?d?d?d?s?l?u?l +?l?d?d?d?s?l?u?u +?l?d?d?d?s?l?u?s +?l?d?d?d?s?l?s?u +?l?d?d?d?s?u?d?d +?l?d?d?d?s?u?d?l +?l?d?d?d?s?u?d?u +?l?d?d?d?s?u?d?s +?l?d?d?d?s?u?l?d +?l?d?d?d?s?u?l?l +?l?d?d?d?s?u?l?u +?l?d?d?d?s?u?l?s +?l?d?d?d?s?u?u?d +?l?d?d?d?s?u?u?l +?l?d?d?d?s?u?u?u +?l?d?d?d?s?u?u?s +?l?d?d?d?s?u?s?d +?l?d?d?d?s?u?s?l +?l?d?d?d?s?u?s?u +?l?d?d?d?s?u?s?s +?l?d?d?d?s?s?d?u +?l?d?d?d?s?s?l?u +?l?d?d?d?s?s?u?d +?l?d?d?d?s?s?u?l +?l?d?d?d?s?s?u?u +?l?d?d?d?s?s?u?s +?l?d?d?d?s?s?s?u +?l?d?d?l?d?d?u?s +?l?d?d?l?d?d?s?u +?l?d?d?l?d?l?u?s +?l?d?d?l?d?l?s?u +?l?d?d?l?d?u?d?s +?l?d?d?l?d?u?l?s +?l?d?d?l?d?u?u?s +?l?d?d?l?d?u?s?d +?l?d?d?l?d?u?s?l +?l?d?d?l?d?u?s?u +?l?d?d?l?d?u?s?s +?l?d?d?l?d?s?d?u +?l?d?d?l?d?s?l?u +?l?d?d?l?d?s?u?d +?l?d?d?l?d?s?u?l +?l?d?d?l?d?s?u?u +?l?d?d?l?d?s?u?s +?l?d?d?l?d?s?s?u +?l?d?d?l?l?d?u?s +?l?d?d?l?l?d?s?u +?l?d?d?l?l?l?u?s +?l?d?d?l?l?l?s?u +?l?d?d?l?l?u?d?s +?l?d?d?l?l?u?l?s +?l?d?d?l?l?u?u?s +?l?d?d?l?l?u?s?d +?l?d?d?l?l?u?s?l +?l?d?d?l?l?u?s?u +?l?d?d?l?l?u?s?s +?l?d?d?l?l?s?d?u +?l?d?d?l?l?s?l?u +?l?d?d?l?l?s?u?d +?l?d?d?l?l?s?u?l +?l?d?d?l?l?s?u?u +?l?d?d?l?l?s?u?s +?l?d?d?l?l?s?s?u +?l?d?d?l?u?d?d?s +?l?d?d?l?u?d?l?s +?l?d?d?l?u?d?u?s +?l?d?d?l?u?d?s?d +?l?d?d?l?u?d?s?l +?l?d?d?l?u?d?s?u +?l?d?d?l?u?d?s?s +?l?d?d?l?u?l?d?s +?l?d?d?l?u?l?l?s +?l?d?d?l?u?l?u?s +?l?d?d?l?u?l?s?d +?l?d?d?l?u?l?s?l +?l?d?d?l?u?l?s?u +?l?d?d?l?u?l?s?s +?l?d?d?l?u?u?d?s +?l?d?d?l?u?u?l?s +?l?d?d?l?u?u?u?s +?l?d?d?l?u?u?s?d +?l?d?d?l?u?u?s?l +?l?d?d?l?u?u?s?u +?l?d?d?l?u?u?s?s +?l?d?d?l?u?s?d?d +?l?d?d?l?u?s?d?l +?l?d?d?l?u?s?d?u +?l?d?d?l?u?s?d?s +?l?d?d?l?u?s?l?d +?l?d?d?l?u?s?l?l +?l?d?d?l?u?s?l?u +?l?d?d?l?u?s?l?s +?l?d?d?l?u?s?u?d +?l?d?d?l?u?s?u?l +?l?d?d?l?u?s?u?u +?l?d?d?l?u?s?u?s +?l?d?d?l?u?s?s?d +?l?d?d?l?u?s?s?l +?l?d?d?l?u?s?s?u +?l?d?d?l?u?s?s?s +?l?d?d?l?s?d?d?u +?l?d?d?l?s?d?l?u +?l?d?d?l?s?d?u?d +?l?d?d?l?s?d?u?l +?l?d?d?l?s?d?u?u +?l?d?d?l?s?d?u?s +?l?d?d?l?s?d?s?u +?l?d?d?l?s?l?d?u +?l?d?d?l?s?l?l?u +?l?d?d?l?s?l?u?d +?l?d?d?l?s?l?u?l +?l?d?d?l?s?l?u?u +?l?d?d?l?s?l?u?s +?l?d?d?l?s?l?s?u +?l?d?d?l?s?u?d?d +?l?d?d?l?s?u?d?l +?l?d?d?l?s?u?d?u +?l?d?d?l?s?u?d?s +?l?d?d?l?s?u?l?d +?l?d?d?l?s?u?l?l +?l?d?d?l?s?u?l?u +?l?d?d?l?s?u?l?s +?l?d?d?l?s?u?u?d +?l?d?d?l?s?u?u?l +?l?d?d?l?s?u?u?u +?l?d?d?l?s?u?u?s +?l?d?d?l?s?u?s?d +?l?d?d?l?s?u?s?l +?l?d?d?l?s?u?s?u +?l?d?d?l?s?u?s?s +?l?d?d?l?s?s?d?u +?l?d?d?l?s?s?l?u +?l?d?d?l?s?s?u?d +?l?d?d?l?s?s?u?l +?l?d?d?l?s?s?u?u +?l?d?d?l?s?s?u?s +?l?d?d?l?s?s?s?u +?l?d?d?u?d?d?d?s +?l?d?d?u?d?d?l?s +?l?d?d?u?d?d?u?s +?l?d?d?u?d?d?s?d +?l?d?d?u?d?d?s?l +?l?d?d?u?d?d?s?u +?l?d?d?u?d?d?s?s +?l?d?d?u?d?l?d?s +?l?d?d?u?d?l?l?s +?l?d?d?u?d?l?u?s +?l?d?d?u?d?l?s?d +?l?d?d?u?d?l?s?l +?l?d?d?u?d?l?s?u +?l?d?d?u?d?l?s?s +?l?d?d?u?d?u?d?s +?l?d?d?u?d?u?l?s +?l?d?d?u?d?u?u?s +?l?d?d?u?d?u?s?d +?l?d?d?u?d?u?s?l +?l?d?d?u?d?u?s?u +?l?d?d?u?d?u?s?s +?l?d?d?u?d?s?d?d +?l?d?d?u?d?s?d?l +?l?d?d?u?d?s?d?u +?l?d?d?u?d?s?d?s +?l?d?d?u?d?s?l?d +?l?d?d?u?d?s?l?l +?l?d?d?u?d?s?l?u +?l?d?d?u?d?s?l?s +?l?d?d?u?d?s?u?d +?l?d?d?u?d?s?u?l +?l?d?d?u?d?s?u?u +?l?d?d?u?d?s?u?s +?l?d?d?u?d?s?s?d +?l?d?d?u?d?s?s?l +?l?d?d?u?d?s?s?u +?l?d?d?u?d?s?s?s +?l?d?d?u?l?d?d?s +?l?d?d?u?l?d?l?s +?l?d?d?u?l?d?u?s +?l?d?d?u?l?d?s?d +?l?d?d?u?l?d?s?l +?l?d?d?u?l?d?s?u +?l?d?d?u?l?d?s?s +?l?d?d?u?l?l?d?s +?l?d?d?u?l?l?l?s +?l?d?d?u?l?l?u?s +?l?d?d?u?l?l?s?d +?l?d?d?u?l?l?s?l +?l?d?d?u?l?l?s?u +?l?d?d?u?l?l?s?s +?l?d?d?u?l?u?d?s +?l?d?d?u?l?u?l?s +?l?d?d?u?l?u?u?s +?l?d?d?u?l?u?s?d +?l?d?d?u?l?u?s?l +?l?d?d?u?l?u?s?u +?l?d?d?u?l?u?s?s +?l?d?d?u?l?s?d?d +?l?d?d?u?l?s?d?l +?l?d?d?u?l?s?d?u +?l?d?d?u?l?s?d?s +?l?d?d?u?l?s?l?d +?l?d?d?u?l?s?l?l +?l?d?d?u?l?s?l?u +?l?d?d?u?l?s?l?s +?l?d?d?u?l?s?u?d +?l?d?d?u?l?s?u?l +?l?d?d?u?l?s?u?u +?l?d?d?u?l?s?u?s +?l?d?d?u?l?s?s?d +?l?d?d?u?l?s?s?l +?l?d?d?u?l?s?s?u +?l?d?d?u?l?s?s?s +?l?d?d?u?u?d?d?s +?l?d?d?u?u?d?l?s +?l?d?d?u?u?d?u?s +?l?d?d?u?u?d?s?d +?l?d?d?u?u?d?s?l +?l?d?d?u?u?d?s?u +?l?d?d?u?u?d?s?s +?l?d?d?u?u?l?d?s +?l?d?d?u?u?l?l?s +?l?d?d?u?u?l?u?s +?l?d?d?u?u?l?s?d +?l?d?d?u?u?l?s?l +?l?d?d?u?u?l?s?u +?l?d?d?u?u?l?s?s +?l?d?d?u?u?u?d?s +?l?d?d?u?u?u?l?s +?l?d?d?u?u?u?u?s +?l?d?d?u?u?u?s?d +?l?d?d?u?u?u?s?l +?l?d?d?u?u?u?s?u +?l?d?d?u?u?u?s?s +?l?d?d?u?u?s?d?d +?l?d?d?u?u?s?d?l +?l?d?d?u?u?s?d?u +?l?d?d?u?u?s?d?s +?l?d?d?u?u?s?l?d +?l?d?d?u?u?s?l?l +?l?d?d?u?u?s?l?u +?l?d?d?u?u?s?l?s +?l?d?d?u?u?s?u?d +?l?d?d?u?u?s?u?l +?l?d?d?u?u?s?u?u +?l?d?d?u?u?s?u?s +?l?d?d?u?u?s?s?d +?l?d?d?u?u?s?s?l +?l?d?d?u?u?s?s?u +?l?d?d?u?u?s?s?s +?l?d?d?u?s?d?d?d +?l?d?d?u?s?d?d?l +?l?d?d?u?s?d?d?u +?l?d?d?u?s?d?d?s +?l?d?d?u?s?d?l?d +?l?d?d?u?s?d?l?l +?l?d?d?u?s?d?l?u +?l?d?d?u?s?d?l?s +?l?d?d?u?s?d?u?d +?l?d?d?u?s?d?u?l +?l?d?d?u?s?d?u?u +?l?d?d?u?s?d?u?s +?l?d?d?u?s?d?s?d +?l?d?d?u?s?d?s?l +?l?d?d?u?s?d?s?u +?l?d?d?u?s?d?s?s +?l?d?d?u?s?l?d?d +?l?d?d?u?s?l?d?l +?l?d?d?u?s?l?d?u +?l?d?d?u?s?l?d?s +?l?d?d?u?s?l?l?d +?l?d?d?u?s?l?l?l +?l?d?d?u?s?l?l?u +?l?d?d?u?s?l?l?s +?l?d?d?u?s?l?u?d +?l?d?d?u?s?l?u?l +?l?d?d?u?s?l?u?u +?l?d?d?u?s?l?u?s +?l?d?d?u?s?l?s?d +?l?d?d?u?s?l?s?l +?l?d?d?u?s?l?s?u +?l?d?d?u?s?l?s?s +?l?d?d?u?s?u?d?d +?l?d?d?u?s?u?d?l +?l?d?d?u?s?u?d?u +?l?d?d?u?s?u?d?s +?l?d?d?u?s?u?l?d +?l?d?d?u?s?u?l?l +?l?d?d?u?s?u?l?u +?l?d?d?u?s?u?l?s +?l?d?d?u?s?u?u?d +?l?d?d?u?s?u?u?l +?l?d?d?u?s?u?u?u +?l?d?d?u?s?u?u?s +?l?d?d?u?s?u?s?d +?l?d?d?u?s?u?s?l +?l?d?d?u?s?u?s?u +?l?d?d?u?s?u?s?s +?l?d?d?u?s?s?d?d +?l?d?d?u?s?s?d?l +?l?d?d?u?s?s?d?u +?l?d?d?u?s?s?d?s +?l?d?d?u?s?s?l?d +?l?d?d?u?s?s?l?l +?l?d?d?u?s?s?l?u +?l?d?d?u?s?s?l?s +?l?d?d?u?s?s?u?d +?l?d?d?u?s?s?u?l +?l?d?d?u?s?s?u?u +?l?d?d?u?s?s?u?s +?l?d?d?u?s?s?s?d +?l?d?d?u?s?s?s?l +?l?d?d?u?s?s?s?u +?l?d?d?u?s?s?s?s +?l?d?d?s?d?d?d?u +?l?d?d?s?d?d?l?u +?l?d?d?s?d?d?u?d +?l?d?d?s?d?d?u?l +?l?d?d?s?d?d?u?u +?l?d?d?s?d?d?u?s +?l?d?d?s?d?d?s?u +?l?d?d?s?d?l?d?u +?l?d?d?s?d?l?l?u +?l?d?d?s?d?l?u?d +?l?d?d?s?d?l?u?l +?l?d?d?s?d?l?u?u +?l?d?d?s?d?l?u?s +?l?d?d?s?d?l?s?u +?l?d?d?s?d?u?d?d +?l?d?d?s?d?u?d?l +?l?d?d?s?d?u?d?u +?l?d?d?s?d?u?d?s +?l?d?d?s?d?u?l?d +?l?d?d?s?d?u?l?l +?l?d?d?s?d?u?l?u +?l?d?d?s?d?u?l?s +?l?d?d?s?d?u?u?d +?l?d?d?s?d?u?u?l +?l?d?d?s?d?u?u?u +?l?d?d?s?d?u?u?s +?l?d?d?s?d?u?s?d +?l?d?d?s?d?u?s?l +?l?d?d?s?d?u?s?u +?l?d?d?s?d?u?s?s +?l?d?d?s?d?s?d?u +?l?d?d?s?d?s?l?u +?l?d?d?s?d?s?u?d +?l?d?d?s?d?s?u?l +?l?d?d?s?d?s?u?u +?l?d?d?s?d?s?u?s +?l?d?d?s?d?s?s?u +?l?d?d?s?l?d?d?u +?l?d?d?s?l?d?l?u +?l?d?d?s?l?d?u?d +?l?d?d?s?l?d?u?l +?l?d?d?s?l?d?u?u +?l?d?d?s?l?d?u?s +?l?d?d?s?l?d?s?u +?l?d?d?s?l?l?d?u +?l?d?d?s?l?l?l?u +?l?d?d?s?l?l?u?d +?l?d?d?s?l?l?u?l +?l?d?d?s?l?l?u?u +?l?d?d?s?l?l?u?s +?l?d?d?s?l?l?s?u +?l?d?d?s?l?u?d?d +?l?d?d?s?l?u?d?l +?l?d?d?s?l?u?d?u +?l?d?d?s?l?u?d?s +?l?d?d?s?l?u?l?d +?l?d?d?s?l?u?l?l +?l?d?d?s?l?u?l?u +?l?d?d?s?l?u?l?s +?l?d?d?s?l?u?u?d +?l?d?d?s?l?u?u?l +?l?d?d?s?l?u?u?u +?l?d?d?s?l?u?u?s +?l?d?d?s?l?u?s?d +?l?d?d?s?l?u?s?l +?l?d?d?s?l?u?s?u +?l?d?d?s?l?u?s?s +?l?d?d?s?l?s?d?u +?l?d?d?s?l?s?l?u +?l?d?d?s?l?s?u?d +?l?d?d?s?l?s?u?l +?l?d?d?s?l?s?u?u +?l?d?d?s?l?s?u?s +?l?d?d?s?l?s?s?u +?l?d?d?s?u?d?d?d +?l?d?d?s?u?d?d?l +?l?d?d?s?u?d?d?u +?l?d?d?s?u?d?d?s +?l?d?d?s?u?d?l?d +?l?d?d?s?u?d?l?l +?l?d?d?s?u?d?l?u +?l?d?d?s?u?d?l?s +?l?d?d?s?u?d?u?d +?l?d?d?s?u?d?u?l +?l?d?d?s?u?d?u?u +?l?d?d?s?u?d?u?s +?l?d?d?s?u?d?s?d +?l?d?d?s?u?d?s?l +?l?d?d?s?u?d?s?u +?l?d?d?s?u?d?s?s +?l?d?d?s?u?l?d?d +?l?d?d?s?u?l?d?l +?l?d?d?s?u?l?d?u +?l?d?d?s?u?l?d?s +?l?d?d?s?u?l?l?d +?l?d?d?s?u?l?l?l +?l?d?d?s?u?l?l?u +?l?d?d?s?u?l?l?s +?l?d?d?s?u?l?u?d +?l?d?d?s?u?l?u?l +?l?d?d?s?u?l?u?u +?l?d?d?s?u?l?u?s +?l?d?d?s?u?l?s?d +?l?d?d?s?u?l?s?l +?l?d?d?s?u?l?s?u +?l?d?d?s?u?l?s?s +?l?d?d?s?u?u?d?d +?l?d?d?s?u?u?d?l +?l?d?d?s?u?u?d?u +?l?d?d?s?u?u?d?s +?l?d?d?s?u?u?l?d +?l?d?d?s?u?u?l?l +?l?d?d?s?u?u?l?u +?l?d?d?s?u?u?l?s +?l?d?d?s?u?u?u?d +?l?d?d?s?u?u?u?l +?l?d?d?s?u?u?u?u +?l?d?d?s?u?u?u?s +?l?d?d?s?u?u?s?d +?l?d?d?s?u?u?s?l +?l?d?d?s?u?u?s?u +?l?d?d?s?u?u?s?s +?l?d?d?s?u?s?d?d +?l?d?d?s?u?s?d?l +?l?d?d?s?u?s?d?u +?l?d?d?s?u?s?d?s +?l?d?d?s?u?s?l?d +?l?d?d?s?u?s?l?l +?l?d?d?s?u?s?l?u +?l?d?d?s?u?s?l?s +?l?d?d?s?u?s?u?d +?l?d?d?s?u?s?u?l +?l?d?d?s?u?s?u?u +?l?d?d?s?u?s?u?s +?l?d?d?s?u?s?s?d +?l?d?d?s?u?s?s?l +?l?d?d?s?u?s?s?u +?l?d?d?s?u?s?s?s +?l?d?d?s?s?d?d?u +?l?d?d?s?s?d?l?u +?l?d?d?s?s?d?u?d +?l?d?d?s?s?d?u?l +?l?d?d?s?s?d?u?u +?l?d?d?s?s?d?u?s +?l?d?d?s?s?d?s?u +?l?d?d?s?s?l?d?u +?l?d?d?s?s?l?l?u +?l?d?d?s?s?l?u?d +?l?d?d?s?s?l?u?l +?l?d?d?s?s?l?u?u +?l?d?d?s?s?l?u?s +?l?d?d?s?s?l?s?u +?l?d?d?s?s?u?d?d +?l?d?d?s?s?u?d?l +?l?d?d?s?s?u?d?u +?l?d?d?s?s?u?d?s +?l?d?d?s?s?u?l?d +?l?d?d?s?s?u?l?l +?l?d?d?s?s?u?l?u +?l?d?d?s?s?u?l?s +?l?d?d?s?s?u?u?d +?l?d?d?s?s?u?u?l +?l?d?d?s?s?u?u?u +?l?d?d?s?s?u?u?s +?l?d?d?s?s?u?s?d +?l?d?d?s?s?u?s?l +?l?d?d?s?s?u?s?u +?l?d?d?s?s?u?s?s +?l?d?d?s?s?s?d?u +?l?d?d?s?s?s?l?u +?l?d?d?s?s?s?u?d +?l?d?d?s?s?s?u?l +?l?d?d?s?s?s?u?u +?l?d?d?s?s?s?u?s +?l?d?d?s?s?s?s?u +?l?d?l?d?d?d?u?s +?l?d?l?d?d?d?s?u +?l?d?l?d?d?l?u?s +?l?d?l?d?d?l?s?u +?l?d?l?d?d?u?d?s +?l?d?l?d?d?u?l?s +?l?d?l?d?d?u?u?s +?l?d?l?d?d?u?s?d +?l?d?l?d?d?u?s?l +?l?d?l?d?d?u?s?u +?l?d?l?d?d?u?s?s +?l?d?l?d?d?s?d?u +?l?d?l?d?d?s?l?u +?l?d?l?d?d?s?u?d +?l?d?l?d?d?s?u?l +?l?d?l?d?d?s?u?u +?l?d?l?d?d?s?u?s +?l?d?l?d?d?s?s?u +?l?d?l?d?l?d?u?s +?l?d?l?d?l?d?s?u +?l?d?l?d?l?l?u?s +?l?d?l?d?l?l?s?u +?l?d?l?d?l?u?d?s +?l?d?l?d?l?u?l?s +?l?d?l?d?l?u?u?s +?l?d?l?d?l?u?s?d +?l?d?l?d?l?u?s?l +?l?d?l?d?l?u?s?u +?l?d?l?d?l?u?s?s +?l?d?l?d?l?s?d?u +?l?d?l?d?l?s?l?u +?l?d?l?d?l?s?u?d +?l?d?l?d?l?s?u?l +?l?d?l?d?l?s?u?u +?l?d?l?d?l?s?u?s +?l?d?l?d?l?s?s?u +?l?d?l?d?u?d?d?s +?l?d?l?d?u?d?l?s +?l?d?l?d?u?d?u?s +?l?d?l?d?u?d?s?d +?l?d?l?d?u?d?s?l +?l?d?l?d?u?d?s?u +?l?d?l?d?u?d?s?s +?l?d?l?d?u?l?d?s +?l?d?l?d?u?l?l?s +?l?d?l?d?u?l?u?s +?l?d?l?d?u?l?s?d +?l?d?l?d?u?l?s?l +?l?d?l?d?u?l?s?u +?l?d?l?d?u?l?s?s +?l?d?l?d?u?u?d?s +?l?d?l?d?u?u?l?s +?l?d?l?d?u?u?u?s +?l?d?l?d?u?u?s?d +?l?d?l?d?u?u?s?l +?l?d?l?d?u?u?s?u +?l?d?l?d?u?u?s?s +?l?d?l?d?u?s?d?d +?l?d?l?d?u?s?d?l +?l?d?l?d?u?s?d?u +?l?d?l?d?u?s?d?s +?l?d?l?d?u?s?l?d +?l?d?l?d?u?s?l?l +?l?d?l?d?u?s?l?u +?l?d?l?d?u?s?l?s +?l?d?l?d?u?s?u?d +?l?d?l?d?u?s?u?l +?l?d?l?d?u?s?u?u +?l?d?l?d?u?s?u?s +?l?d?l?d?u?s?s?d +?l?d?l?d?u?s?s?l +?l?d?l?d?u?s?s?u +?l?d?l?d?u?s?s?s +?l?d?l?d?s?d?d?u +?l?d?l?d?s?d?l?u +?l?d?l?d?s?d?u?d +?l?d?l?d?s?d?u?l +?l?d?l?d?s?d?u?u +?l?d?l?d?s?d?u?s +?l?d?l?d?s?d?s?u +?l?d?l?d?s?l?d?u +?l?d?l?d?s?l?l?u +?l?d?l?d?s?l?u?d +?l?d?l?d?s?l?u?l +?l?d?l?d?s?l?u?u +?l?d?l?d?s?l?u?s +?l?d?l?d?s?l?s?u +?l?d?l?d?s?u?d?d +?l?d?l?d?s?u?d?l +?l?d?l?d?s?u?d?u +?l?d?l?d?s?u?d?s +?l?d?l?d?s?u?l?d +?l?d?l?d?s?u?l?l +?l?d?l?d?s?u?l?u +?l?d?l?d?s?u?l?s +?l?d?l?d?s?u?u?d +?l?d?l?d?s?u?u?l +?l?d?l?d?s?u?u?u +?l?d?l?d?s?u?u?s +?l?d?l?d?s?u?s?d +?l?d?l?d?s?u?s?l +?l?d?l?d?s?u?s?u +?l?d?l?d?s?u?s?s +?l?d?l?d?s?s?d?u +?l?d?l?d?s?s?l?u +?l?d?l?d?s?s?u?d +?l?d?l?d?s?s?u?l +?l?d?l?d?s?s?u?u +?l?d?l?d?s?s?u?s +?l?d?l?d?s?s?s?u +?l?d?l?l?d?d?u?s +?l?d?l?l?d?d?s?u +?l?d?l?l?d?l?u?s +?l?d?l?l?d?l?s?u +?l?d?l?l?d?u?d?s +?l?d?l?l?d?u?l?s +?l?d?l?l?d?u?u?s +?l?d?l?l?d?u?s?d +?l?d?l?l?d?u?s?l +?l?d?l?l?d?u?s?u +?l?d?l?l?d?u?s?s +?l?d?l?l?d?s?d?u +?l?d?l?l?d?s?l?u +?l?d?l?l?d?s?u?d +?l?d?l?l?d?s?u?l +?l?d?l?l?d?s?u?u +?l?d?l?l?d?s?u?s +?l?d?l?l?d?s?s?u +?l?d?l?l?l?d?u?s +?l?d?l?l?l?d?s?u +?l?d?l?l?l?l?u?s +?l?d?l?l?l?l?s?u +?l?d?l?l?l?u?d?s +?l?d?l?l?l?u?l?s +?l?d?l?l?l?u?u?s +?l?d?l?l?l?u?s?d +?l?d?l?l?l?u?s?l +?l?d?l?l?l?u?s?u +?l?d?l?l?l?u?s?s +?l?d?l?l?l?s?d?u +?l?d?l?l?l?s?l?u +?l?d?l?l?l?s?u?d +?l?d?l?l?l?s?u?l +?l?d?l?l?l?s?u?u +?l?d?l?l?l?s?u?s +?l?d?l?l?l?s?s?u +?l?d?l?l?u?d?d?s +?l?d?l?l?u?d?l?s +?l?d?l?l?u?d?u?s +?l?d?l?l?u?d?s?d +?l?d?l?l?u?d?s?l +?l?d?l?l?u?d?s?u +?l?d?l?l?u?d?s?s +?l?d?l?l?u?l?d?s +?l?d?l?l?u?l?l?s +?l?d?l?l?u?l?u?s +?l?d?l?l?u?l?s?d +?l?d?l?l?u?l?s?l +?l?d?l?l?u?l?s?u +?l?d?l?l?u?l?s?s +?l?d?l?l?u?u?d?s +?l?d?l?l?u?u?l?s +?l?d?l?l?u?u?u?s +?l?d?l?l?u?u?s?d +?l?d?l?l?u?u?s?l +?l?d?l?l?u?u?s?u +?l?d?l?l?u?u?s?s +?l?d?l?l?u?s?d?d +?l?d?l?l?u?s?d?l +?l?d?l?l?u?s?d?u +?l?d?l?l?u?s?d?s +?l?d?l?l?u?s?l?d +?l?d?l?l?u?s?l?l +?l?d?l?l?u?s?l?u +?l?d?l?l?u?s?l?s +?l?d?l?l?u?s?u?d +?l?d?l?l?u?s?u?l +?l?d?l?l?u?s?u?u +?l?d?l?l?u?s?u?s +?l?d?l?l?u?s?s?d +?l?d?l?l?u?s?s?l +?l?d?l?l?u?s?s?u +?l?d?l?l?u?s?s?s +?l?d?l?l?s?d?d?u +?l?d?l?l?s?d?l?u +?l?d?l?l?s?d?u?d +?l?d?l?l?s?d?u?l +?l?d?l?l?s?d?u?u +?l?d?l?l?s?d?u?s +?l?d?l?l?s?d?s?u +?l?d?l?l?s?l?d?u +?l?d?l?l?s?l?l?u +?l?d?l?l?s?l?u?d +?l?d?l?l?s?l?u?l +?l?d?l?l?s?l?u?u +?l?d?l?l?s?l?u?s +?l?d?l?l?s?l?s?u +?l?d?l?l?s?u?d?d +?l?d?l?l?s?u?d?l +?l?d?l?l?s?u?d?u +?l?d?l?l?s?u?d?s +?l?d?l?l?s?u?l?d +?l?d?l?l?s?u?l?l +?l?d?l?l?s?u?l?u +?l?d?l?l?s?u?l?s +?l?d?l?l?s?u?u?d +?l?d?l?l?s?u?u?l +?l?d?l?l?s?u?u?u +?l?d?l?l?s?u?u?s +?l?d?l?l?s?u?s?d +?l?d?l?l?s?u?s?l +?l?d?l?l?s?u?s?u +?l?d?l?l?s?u?s?s +?l?d?l?l?s?s?d?u +?l?d?l?l?s?s?l?u +?l?d?l?l?s?s?u?d +?l?d?l?l?s?s?u?l +?l?d?l?l?s?s?u?u +?l?d?l?l?s?s?u?s +?l?d?l?l?s?s?s?u +?l?d?l?u?d?d?d?s +?l?d?l?u?d?d?l?s +?l?d?l?u?d?d?u?s +?l?d?l?u?d?d?s?d +?l?d?l?u?d?d?s?l +?l?d?l?u?d?d?s?u +?l?d?l?u?d?d?s?s +?l?d?l?u?d?l?d?s +?l?d?l?u?d?l?l?s +?l?d?l?u?d?l?u?s +?l?d?l?u?d?l?s?d +?l?d?l?u?d?l?s?l +?l?d?l?u?d?l?s?u +?l?d?l?u?d?l?s?s +?l?d?l?u?d?u?d?s +?l?d?l?u?d?u?l?s +?l?d?l?u?d?u?u?s +?l?d?l?u?d?u?s?d +?l?d?l?u?d?u?s?l +?l?d?l?u?d?u?s?u +?l?d?l?u?d?u?s?s +?l?d?l?u?d?s?d?d +?l?d?l?u?d?s?d?l +?l?d?l?u?d?s?d?u +?l?d?l?u?d?s?d?s +?l?d?l?u?d?s?l?d +?l?d?l?u?d?s?l?l +?l?d?l?u?d?s?l?u +?l?d?l?u?d?s?l?s +?l?d?l?u?d?s?u?d +?l?d?l?u?d?s?u?l +?l?d?l?u?d?s?u?u +?l?d?l?u?d?s?u?s +?l?d?l?u?d?s?s?d +?l?d?l?u?d?s?s?l +?l?d?l?u?d?s?s?u +?l?d?l?u?d?s?s?s +?l?d?l?u?l?d?d?s +?l?d?l?u?l?d?l?s +?l?d?l?u?l?d?u?s +?l?d?l?u?l?d?s?d +?l?d?l?u?l?d?s?l +?l?d?l?u?l?d?s?u +?l?d?l?u?l?d?s?s +?l?d?l?u?l?l?d?s +?l?d?l?u?l?l?l?s +?l?d?l?u?l?l?u?s +?l?d?l?u?l?l?s?d +?l?d?l?u?l?l?s?l +?l?d?l?u?l?l?s?u +?l?d?l?u?l?l?s?s +?l?d?l?u?l?u?d?s +?l?d?l?u?l?u?l?s +?l?d?l?u?l?u?u?s +?l?d?l?u?l?u?s?d +?l?d?l?u?l?u?s?l +?l?d?l?u?l?u?s?u +?l?d?l?u?l?u?s?s +?l?d?l?u?l?s?d?d +?l?d?l?u?l?s?d?l +?l?d?l?u?l?s?d?u +?l?d?l?u?l?s?d?s +?l?d?l?u?l?s?l?d +?l?d?l?u?l?s?l?l +?l?d?l?u?l?s?l?u +?l?d?l?u?l?s?l?s +?l?d?l?u?l?s?u?d +?l?d?l?u?l?s?u?l +?l?d?l?u?l?s?u?u +?l?d?l?u?l?s?u?s +?l?d?l?u?l?s?s?d +?l?d?l?u?l?s?s?l +?l?d?l?u?l?s?s?u +?l?d?l?u?l?s?s?s +?l?d?l?u?u?d?d?s +?l?d?l?u?u?d?l?s +?l?d?l?u?u?d?u?s +?l?d?l?u?u?d?s?d +?l?d?l?u?u?d?s?l +?l?d?l?u?u?d?s?u +?l?d?l?u?u?d?s?s +?l?d?l?u?u?l?d?s +?l?d?l?u?u?l?l?s +?l?d?l?u?u?l?u?s +?l?d?l?u?u?l?s?d +?l?d?l?u?u?l?s?l +?l?d?l?u?u?l?s?u +?l?d?l?u?u?l?s?s +?l?d?l?u?u?u?d?s +?l?d?l?u?u?u?l?s +?l?d?l?u?u?u?u?s +?l?d?l?u?u?u?s?d +?l?d?l?u?u?u?s?l +?l?d?l?u?u?u?s?u +?l?d?l?u?u?u?s?s +?l?d?l?u?u?s?d?d +?l?d?l?u?u?s?d?l +?l?d?l?u?u?s?d?u +?l?d?l?u?u?s?d?s +?l?d?l?u?u?s?l?d +?l?d?l?u?u?s?l?l +?l?d?l?u?u?s?l?u +?l?d?l?u?u?s?l?s +?l?d?l?u?u?s?u?d +?l?d?l?u?u?s?u?l +?l?d?l?u?u?s?u?u +?l?d?l?u?u?s?u?s +?l?d?l?u?u?s?s?d +?l?d?l?u?u?s?s?l +?l?d?l?u?u?s?s?u +?l?d?l?u?u?s?s?s +?l?d?l?u?s?d?d?d +?l?d?l?u?s?d?d?l +?l?d?l?u?s?d?d?u +?l?d?l?u?s?d?d?s +?l?d?l?u?s?d?l?d +?l?d?l?u?s?d?l?l +?l?d?l?u?s?d?l?u +?l?d?l?u?s?d?l?s +?l?d?l?u?s?d?u?d +?l?d?l?u?s?d?u?l +?l?d?l?u?s?d?u?u +?l?d?l?u?s?d?u?s +?l?d?l?u?s?d?s?d +?l?d?l?u?s?d?s?l +?l?d?l?u?s?d?s?u +?l?d?l?u?s?d?s?s +?l?d?l?u?s?l?d?d +?l?d?l?u?s?l?d?l +?l?d?l?u?s?l?d?u +?l?d?l?u?s?l?d?s +?l?d?l?u?s?l?l?d +?l?d?l?u?s?l?l?l +?l?d?l?u?s?l?l?u +?l?d?l?u?s?l?l?s +?l?d?l?u?s?l?u?d +?l?d?l?u?s?l?u?l +?l?d?l?u?s?l?u?u +?l?d?l?u?s?l?u?s +?l?d?l?u?s?l?s?d +?l?d?l?u?s?l?s?l +?l?d?l?u?s?l?s?u +?l?d?l?u?s?l?s?s +?l?d?l?u?s?u?d?d +?l?d?l?u?s?u?d?l +?l?d?l?u?s?u?d?u +?l?d?l?u?s?u?d?s +?l?d?l?u?s?u?l?d +?l?d?l?u?s?u?l?l +?l?d?l?u?s?u?l?u +?l?d?l?u?s?u?l?s +?l?d?l?u?s?u?u?d +?l?d?l?u?s?u?u?l +?l?d?l?u?s?u?u?u +?l?d?l?u?s?u?u?s +?l?d?l?u?s?u?s?d +?l?d?l?u?s?u?s?l +?l?d?l?u?s?u?s?u +?l?d?l?u?s?u?s?s +?l?d?l?u?s?s?d?d +?l?d?l?u?s?s?d?l +?l?d?l?u?s?s?d?u +?l?d?l?u?s?s?d?s +?l?d?l?u?s?s?l?d +?l?d?l?u?s?s?l?l +?l?d?l?u?s?s?l?u +?l?d?l?u?s?s?l?s +?l?d?l?u?s?s?u?d +?l?d?l?u?s?s?u?l +?l?d?l?u?s?s?u?u +?l?d?l?u?s?s?u?s +?l?d?l?u?s?s?s?d +?l?d?l?u?s?s?s?l +?l?d?l?u?s?s?s?u +?l?d?l?u?s?s?s?s +?l?d?l?s?d?d?d?u +?l?d?l?s?d?d?l?u +?l?d?l?s?d?d?u?d +?l?d?l?s?d?d?u?l +?l?d?l?s?d?d?u?u +?l?d?l?s?d?d?u?s +?l?d?l?s?d?d?s?u +?l?d?l?s?d?l?d?u +?l?d?l?s?d?l?l?u +?l?d?l?s?d?l?u?d +?l?d?l?s?d?l?u?l +?l?d?l?s?d?l?u?u +?l?d?l?s?d?l?u?s +?l?d?l?s?d?l?s?u +?l?d?l?s?d?u?d?d +?l?d?l?s?d?u?d?l +?l?d?l?s?d?u?d?u +?l?d?l?s?d?u?d?s +?l?d?l?s?d?u?l?d +?l?d?l?s?d?u?l?l +?l?d?l?s?d?u?l?u +?l?d?l?s?d?u?l?s +?l?d?l?s?d?u?u?d +?l?d?l?s?d?u?u?l +?l?d?l?s?d?u?u?u +?l?d?l?s?d?u?u?s +?l?d?l?s?d?u?s?d +?l?d?l?s?d?u?s?l +?l?d?l?s?d?u?s?u +?l?d?l?s?d?u?s?s +?l?d?l?s?d?s?d?u +?l?d?l?s?d?s?l?u +?l?d?l?s?d?s?u?d +?l?d?l?s?d?s?u?l +?l?d?l?s?d?s?u?u +?l?d?l?s?d?s?u?s +?l?d?l?s?d?s?s?u +?l?d?l?s?l?d?d?u +?l?d?l?s?l?d?l?u +?l?d?l?s?l?d?u?d +?l?d?l?s?l?d?u?l +?l?d?l?s?l?d?u?u +?l?d?l?s?l?d?u?s +?l?d?l?s?l?d?s?u +?l?d?l?s?l?l?d?u +?l?d?l?s?l?l?l?u +?l?d?l?s?l?l?u?d +?l?d?l?s?l?l?u?l +?l?d?l?s?l?l?u?u +?l?d?l?s?l?l?u?s +?l?d?l?s?l?l?s?u +?l?d?l?s?l?u?d?d +?l?d?l?s?l?u?d?l +?l?d?l?s?l?u?d?u +?l?d?l?s?l?u?d?s +?l?d?l?s?l?u?l?d +?l?d?l?s?l?u?l?l +?l?d?l?s?l?u?l?u +?l?d?l?s?l?u?l?s +?l?d?l?s?l?u?u?d +?l?d?l?s?l?u?u?l +?l?d?l?s?l?u?u?u +?l?d?l?s?l?u?u?s +?l?d?l?s?l?u?s?d +?l?d?l?s?l?u?s?l +?l?d?l?s?l?u?s?u +?l?d?l?s?l?u?s?s +?l?d?l?s?l?s?d?u +?l?d?l?s?l?s?l?u +?l?d?l?s?l?s?u?d +?l?d?l?s?l?s?u?l +?l?d?l?s?l?s?u?u +?l?d?l?s?l?s?u?s +?l?d?l?s?l?s?s?u +?l?d?l?s?u?d?d?d +?l?d?l?s?u?d?d?l +?l?d?l?s?u?d?d?u +?l?d?l?s?u?d?d?s +?l?d?l?s?u?d?l?d +?l?d?l?s?u?d?l?l +?l?d?l?s?u?d?l?u +?l?d?l?s?u?d?l?s +?l?d?l?s?u?d?u?d +?l?d?l?s?u?d?u?l +?l?d?l?s?u?d?u?u +?l?d?l?s?u?d?u?s +?l?d?l?s?u?d?s?d +?l?d?l?s?u?d?s?l +?l?d?l?s?u?d?s?u +?l?d?l?s?u?d?s?s +?l?d?l?s?u?l?d?d +?l?d?l?s?u?l?d?l +?l?d?l?s?u?l?d?u +?l?d?l?s?u?l?d?s +?l?d?l?s?u?l?l?d +?l?d?l?s?u?l?l?l +?l?d?l?s?u?l?l?u +?l?d?l?s?u?l?l?s +?l?d?l?s?u?l?u?d +?l?d?l?s?u?l?u?l +?l?d?l?s?u?l?u?u +?l?d?l?s?u?l?u?s +?l?d?l?s?u?l?s?d +?l?d?l?s?u?l?s?l +?l?d?l?s?u?l?s?u +?l?d?l?s?u?l?s?s +?l?d?l?s?u?u?d?d +?l?d?l?s?u?u?d?l +?l?d?l?s?u?u?d?u +?l?d?l?s?u?u?d?s +?l?d?l?s?u?u?l?d +?l?d?l?s?u?u?l?l +?l?d?l?s?u?u?l?u +?l?d?l?s?u?u?l?s +?l?d?l?s?u?u?u?d +?l?d?l?s?u?u?u?l +?l?d?l?s?u?u?u?u +?l?d?l?s?u?u?u?s +?l?d?l?s?u?u?s?d +?l?d?l?s?u?u?s?l +?l?d?l?s?u?u?s?u +?l?d?l?s?u?u?s?s +?l?d?l?s?u?s?d?d +?l?d?l?s?u?s?d?l +?l?d?l?s?u?s?d?u +?l?d?l?s?u?s?d?s +?l?d?l?s?u?s?l?d +?l?d?l?s?u?s?l?l +?l?d?l?s?u?s?l?u +?l?d?l?s?u?s?l?s +?l?d?l?s?u?s?u?d +?l?d?l?s?u?s?u?l +?l?d?l?s?u?s?u?u +?l?d?l?s?u?s?u?s +?l?d?l?s?u?s?s?d +?l?d?l?s?u?s?s?l +?l?d?l?s?u?s?s?u +?l?d?l?s?u?s?s?s +?l?d?l?s?s?d?d?u +?l?d?l?s?s?d?l?u +?l?d?l?s?s?d?u?d +?l?d?l?s?s?d?u?l +?l?d?l?s?s?d?u?u +?l?d?l?s?s?d?u?s +?l?d?l?s?s?d?s?u +?l?d?l?s?s?l?d?u +?l?d?l?s?s?l?l?u +?l?d?l?s?s?l?u?d +?l?d?l?s?s?l?u?l +?l?d?l?s?s?l?u?u +?l?d?l?s?s?l?u?s +?l?d?l?s?s?l?s?u +?l?d?l?s?s?u?d?d +?l?d?l?s?s?u?d?l +?l?d?l?s?s?u?d?u +?l?d?l?s?s?u?d?s +?l?d?l?s?s?u?l?d +?l?d?l?s?s?u?l?l +?l?d?l?s?s?u?l?u +?l?d?l?s?s?u?l?s +?l?d?l?s?s?u?u?d +?l?d?l?s?s?u?u?l +?l?d?l?s?s?u?u?u +?l?d?l?s?s?u?u?s +?l?d?l?s?s?u?s?d +?l?d?l?s?s?u?s?l +?l?d?l?s?s?u?s?u +?l?d?l?s?s?u?s?s +?l?d?l?s?s?s?d?u +?l?d?l?s?s?s?l?u +?l?d?l?s?s?s?u?d +?l?d?l?s?s?s?u?l +?l?d?l?s?s?s?u?u +?l?d?l?s?s?s?u?s +?l?d?l?s?s?s?s?u +?l?d?u?d?d?d?d?s +?l?d?u?d?d?d?l?s +?l?d?u?d?d?d?u?s +?l?d?u?d?d?d?s?d +?l?d?u?d?d?d?s?l +?l?d?u?d?d?d?s?u +?l?d?u?d?d?d?s?s +?l?d?u?d?d?l?d?s +?l?d?u?d?d?l?l?s +?l?d?u?d?d?l?u?s +?l?d?u?d?d?l?s?d +?l?d?u?d?d?l?s?l +?l?d?u?d?d?l?s?u +?l?d?u?d?d?l?s?s +?l?d?u?d?d?u?d?s +?l?d?u?d?d?u?l?s +?l?d?u?d?d?u?u?s +?l?d?u?d?d?u?s?d +?l?d?u?d?d?u?s?l +?l?d?u?d?d?u?s?u +?l?d?u?d?d?u?s?s +?l?d?u?d?d?s?d?d +?l?d?u?d?d?s?d?l +?l?d?u?d?d?s?d?u +?l?d?u?d?d?s?d?s +?l?d?u?d?d?s?l?d +?l?d?u?d?d?s?l?l +?l?d?u?d?d?s?l?u +?l?d?u?d?d?s?l?s +?l?d?u?d?d?s?u?d +?l?d?u?d?d?s?u?l +?l?d?u?d?d?s?u?u +?l?d?u?d?d?s?u?s +?l?d?u?d?d?s?s?d +?l?d?u?d?d?s?s?l +?l?d?u?d?d?s?s?u +?l?d?u?d?d?s?s?s +?l?d?u?d?l?d?d?s +?l?d?u?d?l?d?l?s +?l?d?u?d?l?d?u?s +?l?d?u?d?l?d?s?d +?l?d?u?d?l?d?s?l +?l?d?u?d?l?d?s?u +?l?d?u?d?l?d?s?s +?l?d?u?d?l?l?d?s +?l?d?u?d?l?l?l?s +?l?d?u?d?l?l?u?s +?l?d?u?d?l?l?s?d +?l?d?u?d?l?l?s?l +?l?d?u?d?l?l?s?u +?l?d?u?d?l?l?s?s +?l?d?u?d?l?u?d?s +?l?d?u?d?l?u?l?s +?l?d?u?d?l?u?u?s +?l?d?u?d?l?u?s?d +?l?d?u?d?l?u?s?l +?l?d?u?d?l?u?s?u +?l?d?u?d?l?u?s?s +?l?d?u?d?l?s?d?d +?l?d?u?d?l?s?d?l +?l?d?u?d?l?s?d?u +?l?d?u?d?l?s?d?s +?l?d?u?d?l?s?l?d +?l?d?u?d?l?s?l?l +?l?d?u?d?l?s?l?u +?l?d?u?d?l?s?l?s +?l?d?u?d?l?s?u?d +?l?d?u?d?l?s?u?l +?l?d?u?d?l?s?u?u +?l?d?u?d?l?s?u?s +?l?d?u?d?l?s?s?d +?l?d?u?d?l?s?s?l +?l?d?u?d?l?s?s?u +?l?d?u?d?l?s?s?s +?l?d?u?d?u?d?d?s +?l?d?u?d?u?d?l?s +?l?d?u?d?u?d?u?s +?l?d?u?d?u?d?s?d +?l?d?u?d?u?d?s?l +?l?d?u?d?u?d?s?u +?l?d?u?d?u?d?s?s +?l?d?u?d?u?l?d?s +?l?d?u?d?u?l?l?s +?l?d?u?d?u?l?u?s +?l?d?u?d?u?l?s?d +?l?d?u?d?u?l?s?l +?l?d?u?d?u?l?s?u +?l?d?u?d?u?l?s?s +?l?d?u?d?u?u?d?s +?l?d?u?d?u?u?l?s +?l?d?u?d?u?u?u?s +?l?d?u?d?u?u?s?d +?l?d?u?d?u?u?s?l +?l?d?u?d?u?u?s?u +?l?d?u?d?u?u?s?s +?l?d?u?d?u?s?d?d +?l?d?u?d?u?s?d?l +?l?d?u?d?u?s?d?u +?l?d?u?d?u?s?d?s +?l?d?u?d?u?s?l?d +?l?d?u?d?u?s?l?l +?l?d?u?d?u?s?l?u +?l?d?u?d?u?s?l?s +?l?d?u?d?u?s?u?d +?l?d?u?d?u?s?u?l +?l?d?u?d?u?s?u?u +?l?d?u?d?u?s?u?s +?l?d?u?d?u?s?s?d +?l?d?u?d?u?s?s?l +?l?d?u?d?u?s?s?u +?l?d?u?d?u?s?s?s +?l?d?u?d?s?d?d?d +?l?d?u?d?s?d?d?l +?l?d?u?d?s?d?d?u +?l?d?u?d?s?d?d?s +?l?d?u?d?s?d?l?d +?l?d?u?d?s?d?l?l +?l?d?u?d?s?d?l?u +?l?d?u?d?s?d?l?s +?l?d?u?d?s?d?u?d +?l?d?u?d?s?d?u?l +?l?d?u?d?s?d?u?u +?l?d?u?d?s?d?u?s +?l?d?u?d?s?d?s?d +?l?d?u?d?s?d?s?l +?l?d?u?d?s?d?s?u +?l?d?u?d?s?d?s?s +?l?d?u?d?s?l?d?d +?l?d?u?d?s?l?d?l +?l?d?u?d?s?l?d?u +?l?d?u?d?s?l?d?s +?l?d?u?d?s?l?l?d +?l?d?u?d?s?l?l?l +?l?d?u?d?s?l?l?u +?l?d?u?d?s?l?l?s +?l?d?u?d?s?l?u?d +?l?d?u?d?s?l?u?l +?l?d?u?d?s?l?u?u +?l?d?u?d?s?l?u?s +?l?d?u?d?s?l?s?d +?l?d?u?d?s?l?s?l +?l?d?u?d?s?l?s?u +?l?d?u?d?s?l?s?s +?l?d?u?d?s?u?d?d +?l?d?u?d?s?u?d?l +?l?d?u?d?s?u?d?u +?l?d?u?d?s?u?d?s +?l?d?u?d?s?u?l?d +?l?d?u?d?s?u?l?l +?l?d?u?d?s?u?l?u +?l?d?u?d?s?u?l?s +?l?d?u?d?s?u?u?d +?l?d?u?d?s?u?u?l +?l?d?u?d?s?u?u?u +?l?d?u?d?s?u?u?s +?l?d?u?d?s?u?s?d +?l?d?u?d?s?u?s?l +?l?d?u?d?s?u?s?u +?l?d?u?d?s?u?s?s +?l?d?u?d?s?s?d?d +?l?d?u?d?s?s?d?l +?l?d?u?d?s?s?d?u +?l?d?u?d?s?s?d?s +?l?d?u?d?s?s?l?d +?l?d?u?d?s?s?l?l +?l?d?u?d?s?s?l?u +?l?d?u?d?s?s?l?s +?l?d?u?d?s?s?u?d +?l?d?u?d?s?s?u?l +?l?d?u?d?s?s?u?u +?l?d?u?d?s?s?u?s +?l?d?u?d?s?s?s?d +?l?d?u?d?s?s?s?l +?l?d?u?d?s?s?s?u +?l?d?u?d?s?s?s?s +?l?d?u?l?d?d?d?s +?l?d?u?l?d?d?l?s +?l?d?u?l?d?d?u?s +?l?d?u?l?d?d?s?d +?l?d?u?l?d?d?s?l +?l?d?u?l?d?d?s?u +?l?d?u?l?d?d?s?s +?l?d?u?l?d?l?d?s +?l?d?u?l?d?l?l?s +?l?d?u?l?d?l?u?s +?l?d?u?l?d?l?s?d +?l?d?u?l?d?l?s?l +?l?d?u?l?d?l?s?u +?l?d?u?l?d?l?s?s +?l?d?u?l?d?u?d?s +?l?d?u?l?d?u?l?s +?l?d?u?l?d?u?u?s +?l?d?u?l?d?u?s?d +?l?d?u?l?d?u?s?l +?l?d?u?l?d?u?s?u +?l?d?u?l?d?u?s?s +?l?d?u?l?d?s?d?d +?l?d?u?l?d?s?d?l +?l?d?u?l?d?s?d?u +?l?d?u?l?d?s?d?s +?l?d?u?l?d?s?l?d +?l?d?u?l?d?s?l?l +?l?d?u?l?d?s?l?u +?l?d?u?l?d?s?l?s +?l?d?u?l?d?s?u?d +?l?d?u?l?d?s?u?l +?l?d?u?l?d?s?u?u +?l?d?u?l?d?s?u?s +?l?d?u?l?d?s?s?d +?l?d?u?l?d?s?s?l +?l?d?u?l?d?s?s?u +?l?d?u?l?d?s?s?s +?l?d?u?l?l?d?d?s +?l?d?u?l?l?d?l?s +?l?d?u?l?l?d?u?s +?l?d?u?l?l?d?s?d +?l?d?u?l?l?d?s?l +?l?d?u?l?l?d?s?u +?l?d?u?l?l?d?s?s +?l?d?u?l?l?l?d?s +?l?d?u?l?l?l?l?s +?l?d?u?l?l?l?u?s +?l?d?u?l?l?l?s?d +?l?d?u?l?l?l?s?l +?l?d?u?l?l?l?s?u +?l?d?u?l?l?l?s?s +?l?d?u?l?l?u?d?s +?l?d?u?l?l?u?l?s +?l?d?u?l?l?u?u?s +?l?d?u?l?l?u?s?d +?l?d?u?l?l?u?s?l +?l?d?u?l?l?u?s?u +?l?d?u?l?l?u?s?s +?l?d?u?l?l?s?d?d +?l?d?u?l?l?s?d?l +?l?d?u?l?l?s?d?u +?l?d?u?l?l?s?d?s +?l?d?u?l?l?s?l?d +?l?d?u?l?l?s?l?l +?l?d?u?l?l?s?l?u +?l?d?u?l?l?s?l?s +?l?d?u?l?l?s?u?d +?l?d?u?l?l?s?u?l +?l?d?u?l?l?s?u?u +?l?d?u?l?l?s?u?s +?l?d?u?l?l?s?s?d +?l?d?u?l?l?s?s?l +?l?d?u?l?l?s?s?u +?l?d?u?l?l?s?s?s +?l?d?u?l?u?d?d?s +?l?d?u?l?u?d?l?s +?l?d?u?l?u?d?u?s +?l?d?u?l?u?d?s?d +?l?d?u?l?u?d?s?l +?l?d?u?l?u?d?s?u +?l?d?u?l?u?d?s?s +?l?d?u?l?u?l?d?s +?l?d?u?l?u?l?l?s +?l?d?u?l?u?l?u?s +?l?d?u?l?u?l?s?d +?l?d?u?l?u?l?s?l +?l?d?u?l?u?l?s?u +?l?d?u?l?u?l?s?s +?l?d?u?l?u?u?d?s +?l?d?u?l?u?u?l?s +?l?d?u?l?u?u?u?s +?l?d?u?l?u?u?s?d +?l?d?u?l?u?u?s?l +?l?d?u?l?u?u?s?u +?l?d?u?l?u?u?s?s +?l?d?u?l?u?s?d?d +?l?d?u?l?u?s?d?l +?l?d?u?l?u?s?d?u +?l?d?u?l?u?s?d?s +?l?d?u?l?u?s?l?d +?l?d?u?l?u?s?l?l +?l?d?u?l?u?s?l?u +?l?d?u?l?u?s?l?s +?l?d?u?l?u?s?u?d +?l?d?u?l?u?s?u?l +?l?d?u?l?u?s?u?u +?l?d?u?l?u?s?u?s +?l?d?u?l?u?s?s?d +?l?d?u?l?u?s?s?l +?l?d?u?l?u?s?s?u +?l?d?u?l?u?s?s?s +?l?d?u?l?s?d?d?d +?l?d?u?l?s?d?d?l +?l?d?u?l?s?d?d?u +?l?d?u?l?s?d?d?s +?l?d?u?l?s?d?l?d +?l?d?u?l?s?d?l?l +?l?d?u?l?s?d?l?u +?l?d?u?l?s?d?l?s +?l?d?u?l?s?d?u?d +?l?d?u?l?s?d?u?l +?l?d?u?l?s?d?u?u +?l?d?u?l?s?d?u?s +?l?d?u?l?s?d?s?d +?l?d?u?l?s?d?s?l +?l?d?u?l?s?d?s?u +?l?d?u?l?s?d?s?s +?l?d?u?l?s?l?d?d +?l?d?u?l?s?l?d?l +?l?d?u?l?s?l?d?u +?l?d?u?l?s?l?d?s +?l?d?u?l?s?l?l?d +?l?d?u?l?s?l?l?l +?l?d?u?l?s?l?l?u +?l?d?u?l?s?l?l?s +?l?d?u?l?s?l?u?d +?l?d?u?l?s?l?u?l +?l?d?u?l?s?l?u?u +?l?d?u?l?s?l?u?s +?l?d?u?l?s?l?s?d +?l?d?u?l?s?l?s?l +?l?d?u?l?s?l?s?u +?l?d?u?l?s?l?s?s +?l?d?u?l?s?u?d?d +?l?d?u?l?s?u?d?l +?l?d?u?l?s?u?d?u +?l?d?u?l?s?u?d?s +?l?d?u?l?s?u?l?d +?l?d?u?l?s?u?l?l +?l?d?u?l?s?u?l?u +?l?d?u?l?s?u?l?s +?l?d?u?l?s?u?u?d +?l?d?u?l?s?u?u?l +?l?d?u?l?s?u?u?u +?l?d?u?l?s?u?u?s +?l?d?u?l?s?u?s?d +?l?d?u?l?s?u?s?l +?l?d?u?l?s?u?s?u +?l?d?u?l?s?u?s?s +?l?d?u?l?s?s?d?d +?l?d?u?l?s?s?d?l +?l?d?u?l?s?s?d?u +?l?d?u?l?s?s?d?s +?l?d?u?l?s?s?l?d +?l?d?u?l?s?s?l?l +?l?d?u?l?s?s?l?u +?l?d?u?l?s?s?l?s +?l?d?u?l?s?s?u?d +?l?d?u?l?s?s?u?l +?l?d?u?l?s?s?u?u +?l?d?u?l?s?s?u?s +?l?d?u?l?s?s?s?d +?l?d?u?l?s?s?s?l +?l?d?u?l?s?s?s?u +?l?d?u?l?s?s?s?s +?l?d?u?u?d?d?d?s +?l?d?u?u?d?d?l?s +?l?d?u?u?d?d?u?s +?l?d?u?u?d?d?s?d +?l?d?u?u?d?d?s?l +?l?d?u?u?d?d?s?u +?l?d?u?u?d?d?s?s +?l?d?u?u?d?l?d?s +?l?d?u?u?d?l?l?s +?l?d?u?u?d?l?u?s +?l?d?u?u?d?l?s?d +?l?d?u?u?d?l?s?l +?l?d?u?u?d?l?s?u +?l?d?u?u?d?l?s?s +?l?d?u?u?d?u?d?s +?l?d?u?u?d?u?l?s +?l?d?u?u?d?u?u?s +?l?d?u?u?d?u?s?d +?l?d?u?u?d?u?s?l +?l?d?u?u?d?u?s?u +?l?d?u?u?d?u?s?s +?l?d?u?u?d?s?d?d +?l?d?u?u?d?s?d?l +?l?d?u?u?d?s?d?u +?l?d?u?u?d?s?d?s +?l?d?u?u?d?s?l?d +?l?d?u?u?d?s?l?l +?l?d?u?u?d?s?l?u +?l?d?u?u?d?s?l?s +?l?d?u?u?d?s?u?d +?l?d?u?u?d?s?u?l +?l?d?u?u?d?s?u?u +?l?d?u?u?d?s?u?s +?l?d?u?u?d?s?s?d +?l?d?u?u?d?s?s?l +?l?d?u?u?d?s?s?u +?l?d?u?u?d?s?s?s +?l?d?u?u?l?d?d?s +?l?d?u?u?l?d?l?s +?l?d?u?u?l?d?u?s +?l?d?u?u?l?d?s?d +?l?d?u?u?l?d?s?l +?l?d?u?u?l?d?s?u +?l?d?u?u?l?d?s?s +?l?d?u?u?l?l?d?s +?l?d?u?u?l?l?l?s +?l?d?u?u?l?l?u?s +?l?d?u?u?l?l?s?d +?l?d?u?u?l?l?s?l +?l?d?u?u?l?l?s?u +?l?d?u?u?l?l?s?s +?l?d?u?u?l?u?d?s +?l?d?u?u?l?u?l?s +?l?d?u?u?l?u?u?s +?l?d?u?u?l?u?s?d +?l?d?u?u?l?u?s?l +?l?d?u?u?l?u?s?u +?l?d?u?u?l?u?s?s +?l?d?u?u?l?s?d?d +?l?d?u?u?l?s?d?l +?l?d?u?u?l?s?d?u +?l?d?u?u?l?s?d?s +?l?d?u?u?l?s?l?d +?l?d?u?u?l?s?l?l +?l?d?u?u?l?s?l?u +?l?d?u?u?l?s?l?s +?l?d?u?u?l?s?u?d +?l?d?u?u?l?s?u?l +?l?d?u?u?l?s?u?u +?l?d?u?u?l?s?u?s +?l?d?u?u?l?s?s?d +?l?d?u?u?l?s?s?l +?l?d?u?u?l?s?s?u +?l?d?u?u?l?s?s?s +?l?d?u?u?u?d?d?s +?l?d?u?u?u?d?l?s +?l?d?u?u?u?d?u?s +?l?d?u?u?u?d?s?d +?l?d?u?u?u?d?s?l +?l?d?u?u?u?d?s?u +?l?d?u?u?u?d?s?s +?l?d?u?u?u?l?d?s +?l?d?u?u?u?l?l?s +?l?d?u?u?u?l?u?s +?l?d?u?u?u?l?s?d +?l?d?u?u?u?l?s?l +?l?d?u?u?u?l?s?u +?l?d?u?u?u?l?s?s +?l?d?u?u?u?u?d?s +?l?d?u?u?u?u?l?s +?l?d?u?u?u?u?u?s +?l?d?u?u?u?u?s?d +?l?d?u?u?u?u?s?l +?l?d?u?u?u?u?s?u +?l?d?u?u?u?u?s?s +?l?d?u?u?u?s?d?d +?l?d?u?u?u?s?d?l +?l?d?u?u?u?s?d?u +?l?d?u?u?u?s?d?s +?l?d?u?u?u?s?l?d +?l?d?u?u?u?s?l?l +?l?d?u?u?u?s?l?u +?l?d?u?u?u?s?l?s +?l?d?u?u?u?s?u?d +?l?d?u?u?u?s?u?l +?l?d?u?u?u?s?u?u +?l?d?u?u?u?s?u?s +?l?d?u?u?u?s?s?d +?l?d?u?u?u?s?s?l +?l?d?u?u?u?s?s?u +?l?d?u?u?u?s?s?s +?l?d?u?u?s?d?d?d +?l?d?u?u?s?d?d?l +?l?d?u?u?s?d?d?u +?l?d?u?u?s?d?d?s +?l?d?u?u?s?d?l?d +?l?d?u?u?s?d?l?l +?l?d?u?u?s?d?l?u +?l?d?u?u?s?d?l?s +?l?d?u?u?s?d?u?d +?l?d?u?u?s?d?u?l +?l?d?u?u?s?d?u?u +?l?d?u?u?s?d?u?s +?l?d?u?u?s?d?s?d +?l?d?u?u?s?d?s?l +?l?d?u?u?s?d?s?u +?l?d?u?u?s?d?s?s +?l?d?u?u?s?l?d?d +?l?d?u?u?s?l?d?l +?l?d?u?u?s?l?d?u +?l?d?u?u?s?l?d?s +?l?d?u?u?s?l?l?d +?l?d?u?u?s?l?l?l +?l?d?u?u?s?l?l?u +?l?d?u?u?s?l?l?s +?l?d?u?u?s?l?u?d +?l?d?u?u?s?l?u?l +?l?d?u?u?s?l?u?u +?l?d?u?u?s?l?u?s +?l?d?u?u?s?l?s?d +?l?d?u?u?s?l?s?l +?l?d?u?u?s?l?s?u +?l?d?u?u?s?l?s?s +?l?d?u?u?s?u?d?d +?l?d?u?u?s?u?d?l +?l?d?u?u?s?u?d?u +?l?d?u?u?s?u?d?s +?l?d?u?u?s?u?l?d +?l?d?u?u?s?u?l?l +?l?d?u?u?s?u?l?u +?l?d?u?u?s?u?l?s +?l?d?u?u?s?u?u?d +?l?d?u?u?s?u?u?l +?l?d?u?u?s?u?u?u +?l?d?u?u?s?u?u?s +?l?d?u?u?s?u?s?d +?l?d?u?u?s?u?s?l +?l?d?u?u?s?u?s?u +?l?d?u?u?s?u?s?s +?l?d?u?u?s?s?d?d +?l?d?u?u?s?s?d?l +?l?d?u?u?s?s?d?u +?l?d?u?u?s?s?d?s +?l?d?u?u?s?s?l?d +?l?d?u?u?s?s?l?l +?l?d?u?u?s?s?l?u +?l?d?u?u?s?s?l?s +?l?d?u?u?s?s?u?d +?l?d?u?u?s?s?u?l +?l?d?u?u?s?s?u?u +?l?d?u?u?s?s?u?s +?l?d?u?u?s?s?s?d +?l?d?u?u?s?s?s?l +?l?d?u?u?s?s?s?u +?l?d?u?u?s?s?s?s +?l?d?u?s?d?d?d?d +?l?d?u?s?d?d?d?l +?l?d?u?s?d?d?d?u +?l?d?u?s?d?d?d?s +?l?d?u?s?d?d?l?d +?l?d?u?s?d?d?l?l +?l?d?u?s?d?d?l?u +?l?d?u?s?d?d?l?s +?l?d?u?s?d?d?u?d +?l?d?u?s?d?d?u?l +?l?d?u?s?d?d?u?u +?l?d?u?s?d?d?u?s +?l?d?u?s?d?d?s?d +?l?d?u?s?d?d?s?l +?l?d?u?s?d?d?s?u +?l?d?u?s?d?d?s?s +?l?d?u?s?d?l?d?d +?l?d?u?s?d?l?d?l +?l?d?u?s?d?l?d?u +?l?d?u?s?d?l?d?s +?l?d?u?s?d?l?l?d +?l?d?u?s?d?l?l?l +?l?d?u?s?d?l?l?u +?l?d?u?s?d?l?l?s +?l?d?u?s?d?l?u?d +?l?d?u?s?d?l?u?l +?l?d?u?s?d?l?u?u +?l?d?u?s?d?l?u?s +?l?d?u?s?d?l?s?d +?l?d?u?s?d?l?s?l +?l?d?u?s?d?l?s?u +?l?d?u?s?d?l?s?s +?l?d?u?s?d?u?d?d +?l?d?u?s?d?u?d?l +?l?d?u?s?d?u?d?u +?l?d?u?s?d?u?d?s +?l?d?u?s?d?u?l?d +?l?d?u?s?d?u?l?l +?l?d?u?s?d?u?l?u +?l?d?u?s?d?u?l?s +?l?d?u?s?d?u?u?d +?l?d?u?s?d?u?u?l +?l?d?u?s?d?u?u?u +?l?d?u?s?d?u?u?s +?l?d?u?s?d?u?s?d +?l?d?u?s?d?u?s?l +?l?d?u?s?d?u?s?u +?l?d?u?s?d?u?s?s +?l?d?u?s?d?s?d?d +?l?d?u?s?d?s?d?l +?l?d?u?s?d?s?d?u +?l?d?u?s?d?s?d?s +?l?d?u?s?d?s?l?d +?l?d?u?s?d?s?l?l +?l?d?u?s?d?s?l?u +?l?d?u?s?d?s?l?s +?l?d?u?s?d?s?u?d +?l?d?u?s?d?s?u?l +?l?d?u?s?d?s?u?u +?l?d?u?s?d?s?u?s +?l?d?u?s?d?s?s?d +?l?d?u?s?d?s?s?l +?l?d?u?s?d?s?s?u +?l?d?u?s?d?s?s?s +?l?d?u?s?l?d?d?d +?l?d?u?s?l?d?d?l +?l?d?u?s?l?d?d?u +?l?d?u?s?l?d?d?s +?l?d?u?s?l?d?l?d +?l?d?u?s?l?d?l?l +?l?d?u?s?l?d?l?u +?l?d?u?s?l?d?l?s +?l?d?u?s?l?d?u?d +?l?d?u?s?l?d?u?l +?l?d?u?s?l?d?u?u +?l?d?u?s?l?d?u?s +?l?d?u?s?l?d?s?d +?l?d?u?s?l?d?s?l +?l?d?u?s?l?d?s?u +?l?d?u?s?l?d?s?s +?l?d?u?s?l?l?d?d +?l?d?u?s?l?l?d?l +?l?d?u?s?l?l?d?u +?l?d?u?s?l?l?d?s +?l?d?u?s?l?l?l?d +?l?d?u?s?l?l?l?l +?l?d?u?s?l?l?l?u +?l?d?u?s?l?l?l?s +?l?d?u?s?l?l?u?d +?l?d?u?s?l?l?u?l +?l?d?u?s?l?l?u?u +?l?d?u?s?l?l?u?s +?l?d?u?s?l?l?s?d +?l?d?u?s?l?l?s?l +?l?d?u?s?l?l?s?u +?l?d?u?s?l?l?s?s +?l?d?u?s?l?u?d?d +?l?d?u?s?l?u?d?l +?l?d?u?s?l?u?d?u +?l?d?u?s?l?u?d?s +?l?d?u?s?l?u?l?d +?l?d?u?s?l?u?l?l +?l?d?u?s?l?u?l?u +?l?d?u?s?l?u?l?s +?l?d?u?s?l?u?u?d +?l?d?u?s?l?u?u?l +?l?d?u?s?l?u?u?u +?l?d?u?s?l?u?u?s +?l?d?u?s?l?u?s?d +?l?d?u?s?l?u?s?l +?l?d?u?s?l?u?s?u +?l?d?u?s?l?u?s?s +?l?d?u?s?l?s?d?d +?l?d?u?s?l?s?d?l +?l?d?u?s?l?s?d?u +?l?d?u?s?l?s?d?s +?l?d?u?s?l?s?l?d +?l?d?u?s?l?s?l?l +?l?d?u?s?l?s?l?u +?l?d?u?s?l?s?l?s +?l?d?u?s?l?s?u?d +?l?d?u?s?l?s?u?l +?l?d?u?s?l?s?u?u +?l?d?u?s?l?s?u?s +?l?d?u?s?l?s?s?d +?l?d?u?s?l?s?s?l +?l?d?u?s?l?s?s?u +?l?d?u?s?l?s?s?s +?l?d?u?s?u?d?d?d +?l?d?u?s?u?d?d?l +?l?d?u?s?u?d?d?u +?l?d?u?s?u?d?d?s +?l?d?u?s?u?d?l?d +?l?d?u?s?u?d?l?l +?l?d?u?s?u?d?l?u +?l?d?u?s?u?d?l?s +?l?d?u?s?u?d?u?d +?l?d?u?s?u?d?u?l +?l?d?u?s?u?d?u?u +?l?d?u?s?u?d?u?s +?l?d?u?s?u?d?s?d +?l?d?u?s?u?d?s?l +?l?d?u?s?u?d?s?u +?l?d?u?s?u?d?s?s +?l?d?u?s?u?l?d?d +?l?d?u?s?u?l?d?l +?l?d?u?s?u?l?d?u +?l?d?u?s?u?l?d?s +?l?d?u?s?u?l?l?d +?l?d?u?s?u?l?l?l +?l?d?u?s?u?l?l?u +?l?d?u?s?u?l?l?s +?l?d?u?s?u?l?u?d +?l?d?u?s?u?l?u?l +?l?d?u?s?u?l?u?u +?l?d?u?s?u?l?u?s +?l?d?u?s?u?l?s?d +?l?d?u?s?u?l?s?l +?l?d?u?s?u?l?s?u +?l?d?u?s?u?l?s?s +?l?d?u?s?u?u?d?d +?l?d?u?s?u?u?d?l +?l?d?u?s?u?u?d?u +?l?d?u?s?u?u?d?s +?l?d?u?s?u?u?l?d +?l?d?u?s?u?u?l?l +?l?d?u?s?u?u?l?u +?l?d?u?s?u?u?l?s +?l?d?u?s?u?u?u?d +?l?d?u?s?u?u?u?l +?l?d?u?s?u?u?u?u +?l?d?u?s?u?u?u?s +?l?d?u?s?u?u?s?d +?l?d?u?s?u?u?s?l +?l?d?u?s?u?u?s?u +?l?d?u?s?u?u?s?s +?l?d?u?s?u?s?d?d +?l?d?u?s?u?s?d?l +?l?d?u?s?u?s?d?u +?l?d?u?s?u?s?d?s +?l?d?u?s?u?s?l?d +?l?d?u?s?u?s?l?l +?l?d?u?s?u?s?l?u +?l?d?u?s?u?s?l?s +?l?d?u?s?u?s?u?d +?l?d?u?s?u?s?u?l +?l?d?u?s?u?s?u?u +?l?d?u?s?u?s?u?s +?l?d?u?s?u?s?s?d +?l?d?u?s?u?s?s?l +?l?d?u?s?u?s?s?u +?l?d?u?s?u?s?s?s +?l?d?u?s?s?d?d?d +?l?d?u?s?s?d?d?l +?l?d?u?s?s?d?d?u +?l?d?u?s?s?d?d?s +?l?d?u?s?s?d?l?d +?l?d?u?s?s?d?l?l +?l?d?u?s?s?d?l?u +?l?d?u?s?s?d?l?s +?l?d?u?s?s?d?u?d +?l?d?u?s?s?d?u?l +?l?d?u?s?s?d?u?u +?l?d?u?s?s?d?u?s +?l?d?u?s?s?d?s?d +?l?d?u?s?s?d?s?l +?l?d?u?s?s?d?s?u +?l?d?u?s?s?d?s?s +?l?d?u?s?s?l?d?d +?l?d?u?s?s?l?d?l +?l?d?u?s?s?l?d?u +?l?d?u?s?s?l?d?s +?l?d?u?s?s?l?l?d +?l?d?u?s?s?l?l?l +?l?d?u?s?s?l?l?u +?l?d?u?s?s?l?l?s +?l?d?u?s?s?l?u?d +?l?d?u?s?s?l?u?l +?l?d?u?s?s?l?u?u +?l?d?u?s?s?l?u?s +?l?d?u?s?s?l?s?d +?l?d?u?s?s?l?s?l +?l?d?u?s?s?l?s?u +?l?d?u?s?s?l?s?s +?l?d?u?s?s?u?d?d +?l?d?u?s?s?u?d?l +?l?d?u?s?s?u?d?u +?l?d?u?s?s?u?d?s +?l?d?u?s?s?u?l?d +?l?d?u?s?s?u?l?l +?l?d?u?s?s?u?l?u +?l?d?u?s?s?u?l?s +?l?d?u?s?s?u?u?d +?l?d?u?s?s?u?u?l +?l?d?u?s?s?u?u?u +?l?d?u?s?s?u?u?s +?l?d?u?s?s?u?s?d +?l?d?u?s?s?u?s?l +?l?d?u?s?s?u?s?u +?l?d?u?s?s?u?s?s +?l?d?u?s?s?s?d?d +?l?d?u?s?s?s?d?l +?l?d?u?s?s?s?d?u +?l?d?u?s?s?s?d?s +?l?d?u?s?s?s?l?d +?l?d?u?s?s?s?l?l +?l?d?u?s?s?s?l?u +?l?d?u?s?s?s?l?s +?l?d?u?s?s?s?u?d +?l?d?u?s?s?s?u?l +?l?d?u?s?s?s?u?u +?l?d?u?s?s?s?u?s +?l?d?u?s?s?s?s?d +?l?d?u?s?s?s?s?l +?l?d?u?s?s?s?s?u +?l?d?u?s?s?s?s?s +?l?d?s?d?d?d?d?u +?l?d?s?d?d?d?l?u +?l?d?s?d?d?d?u?d +?l?d?s?d?d?d?u?l +?l?d?s?d?d?d?u?u +?l?d?s?d?d?d?u?s +?l?d?s?d?d?d?s?u +?l?d?s?d?d?l?d?u +?l?d?s?d?d?l?l?u +?l?d?s?d?d?l?u?d +?l?d?s?d?d?l?u?l +?l?d?s?d?d?l?u?u +?l?d?s?d?d?l?u?s +?l?d?s?d?d?l?s?u +?l?d?s?d?d?u?d?d +?l?d?s?d?d?u?d?l +?l?d?s?d?d?u?d?u +?l?d?s?d?d?u?d?s +?l?d?s?d?d?u?l?d +?l?d?s?d?d?u?l?l +?l?d?s?d?d?u?l?u +?l?d?s?d?d?u?l?s +?l?d?s?d?d?u?u?d +?l?d?s?d?d?u?u?l +?l?d?s?d?d?u?u?u +?l?d?s?d?d?u?u?s +?l?d?s?d?d?u?s?d +?l?d?s?d?d?u?s?l +?l?d?s?d?d?u?s?u +?l?d?s?d?d?u?s?s +?l?d?s?d?d?s?d?u +?l?d?s?d?d?s?l?u +?l?d?s?d?d?s?u?d +?l?d?s?d?d?s?u?l +?l?d?s?d?d?s?u?u +?l?d?s?d?d?s?u?s +?l?d?s?d?d?s?s?u +?l?d?s?d?l?d?d?u +?l?d?s?d?l?d?l?u +?l?d?s?d?l?d?u?d +?l?d?s?d?l?d?u?l +?l?d?s?d?l?d?u?u +?l?d?s?d?l?d?u?s +?l?d?s?d?l?d?s?u +?l?d?s?d?l?l?d?u +?l?d?s?d?l?l?l?u +?l?d?s?d?l?l?u?d +?l?d?s?d?l?l?u?l +?l?d?s?d?l?l?u?u +?l?d?s?d?l?l?u?s +?l?d?s?d?l?l?s?u +?l?d?s?d?l?u?d?d +?l?d?s?d?l?u?d?l +?l?d?s?d?l?u?d?u +?l?d?s?d?l?u?d?s +?l?d?s?d?l?u?l?d +?l?d?s?d?l?u?l?l +?l?d?s?d?l?u?l?u +?l?d?s?d?l?u?l?s +?l?d?s?d?l?u?u?d +?l?d?s?d?l?u?u?l +?l?d?s?d?l?u?u?u +?l?d?s?d?l?u?u?s +?l?d?s?d?l?u?s?d +?l?d?s?d?l?u?s?l +?l?d?s?d?l?u?s?u +?l?d?s?d?l?u?s?s +?l?d?s?d?l?s?d?u +?l?d?s?d?l?s?l?u +?l?d?s?d?l?s?u?d +?l?d?s?d?l?s?u?l +?l?d?s?d?l?s?u?u +?l?d?s?d?l?s?u?s +?l?d?s?d?l?s?s?u +?l?d?s?d?u?d?d?d +?l?d?s?d?u?d?d?l +?l?d?s?d?u?d?d?u +?l?d?s?d?u?d?d?s +?l?d?s?d?u?d?l?d +?l?d?s?d?u?d?l?l +?l?d?s?d?u?d?l?u +?l?d?s?d?u?d?l?s +?l?d?s?d?u?d?u?d +?l?d?s?d?u?d?u?l +?l?d?s?d?u?d?u?u +?l?d?s?d?u?d?u?s +?l?d?s?d?u?d?s?d +?l?d?s?d?u?d?s?l +?l?d?s?d?u?d?s?u +?l?d?s?d?u?d?s?s +?l?d?s?d?u?l?d?d +?l?d?s?d?u?l?d?l +?l?d?s?d?u?l?d?u +?l?d?s?d?u?l?d?s +?l?d?s?d?u?l?l?d +?l?d?s?d?u?l?l?l +?l?d?s?d?u?l?l?u +?l?d?s?d?u?l?l?s +?l?d?s?d?u?l?u?d +?l?d?s?d?u?l?u?l +?l?d?s?d?u?l?u?u +?l?d?s?d?u?l?u?s +?l?d?s?d?u?l?s?d +?l?d?s?d?u?l?s?l +?l?d?s?d?u?l?s?u +?l?d?s?d?u?l?s?s +?l?d?s?d?u?u?d?d +?l?d?s?d?u?u?d?l +?l?d?s?d?u?u?d?u +?l?d?s?d?u?u?d?s +?l?d?s?d?u?u?l?d +?l?d?s?d?u?u?l?l +?l?d?s?d?u?u?l?u +?l?d?s?d?u?u?l?s +?l?d?s?d?u?u?u?d +?l?d?s?d?u?u?u?l +?l?d?s?d?u?u?u?u +?l?d?s?d?u?u?u?s +?l?d?s?d?u?u?s?d +?l?d?s?d?u?u?s?l +?l?d?s?d?u?u?s?u +?l?d?s?d?u?u?s?s +?l?d?s?d?u?s?d?d +?l?d?s?d?u?s?d?l +?l?d?s?d?u?s?d?u +?l?d?s?d?u?s?d?s +?l?d?s?d?u?s?l?d +?l?d?s?d?u?s?l?l +?l?d?s?d?u?s?l?u +?l?d?s?d?u?s?l?s +?l?d?s?d?u?s?u?d +?l?d?s?d?u?s?u?l +?l?d?s?d?u?s?u?u +?l?d?s?d?u?s?u?s +?l?d?s?d?u?s?s?d +?l?d?s?d?u?s?s?l +?l?d?s?d?u?s?s?u +?l?d?s?d?u?s?s?s +?l?d?s?d?s?d?d?u +?l?d?s?d?s?d?l?u +?l?d?s?d?s?d?u?d +?l?d?s?d?s?d?u?l +?l?d?s?d?s?d?u?u +?l?d?s?d?s?d?u?s +?l?d?s?d?s?d?s?u +?l?d?s?d?s?l?d?u +?l?d?s?d?s?l?l?u +?l?d?s?d?s?l?u?d +?l?d?s?d?s?l?u?l +?l?d?s?d?s?l?u?u +?l?d?s?d?s?l?u?s +?l?d?s?d?s?l?s?u +?l?d?s?d?s?u?d?d +?l?d?s?d?s?u?d?l +?l?d?s?d?s?u?d?u +?l?d?s?d?s?u?d?s +?l?d?s?d?s?u?l?d +?l?d?s?d?s?u?l?l +?l?d?s?d?s?u?l?u +?l?d?s?d?s?u?l?s +?l?d?s?d?s?u?u?d +?l?d?s?d?s?u?u?l +?l?d?s?d?s?u?u?u +?l?d?s?d?s?u?u?s +?l?d?s?d?s?u?s?d +?l?d?s?d?s?u?s?l +?l?d?s?d?s?u?s?u +?l?d?s?d?s?u?s?s +?l?d?s?d?s?s?d?u +?l?d?s?d?s?s?l?u +?l?d?s?d?s?s?u?d +?l?d?s?d?s?s?u?l +?l?d?s?d?s?s?u?u +?l?d?s?d?s?s?u?s +?l?d?s?d?s?s?s?u +?l?d?s?l?d?d?d?u +?l?d?s?l?d?d?l?u +?l?d?s?l?d?d?u?d +?l?d?s?l?d?d?u?l +?l?d?s?l?d?d?u?u +?l?d?s?l?d?d?u?s +?l?d?s?l?d?d?s?u +?l?d?s?l?d?l?d?u +?l?d?s?l?d?l?l?u +?l?d?s?l?d?l?u?d +?l?d?s?l?d?l?u?l +?l?d?s?l?d?l?u?u +?l?d?s?l?d?l?u?s +?l?d?s?l?d?l?s?u +?l?d?s?l?d?u?d?d +?l?d?s?l?d?u?d?l +?l?d?s?l?d?u?d?u +?l?d?s?l?d?u?d?s +?l?d?s?l?d?u?l?d +?l?d?s?l?d?u?l?l +?l?d?s?l?d?u?l?u +?l?d?s?l?d?u?l?s +?l?d?s?l?d?u?u?d +?l?d?s?l?d?u?u?l +?l?d?s?l?d?u?u?u +?l?d?s?l?d?u?u?s +?l?d?s?l?d?u?s?d +?l?d?s?l?d?u?s?l +?l?d?s?l?d?u?s?u +?l?d?s?l?d?u?s?s +?l?d?s?l?d?s?d?u +?l?d?s?l?d?s?l?u +?l?d?s?l?d?s?u?d +?l?d?s?l?d?s?u?l +?l?d?s?l?d?s?u?u +?l?d?s?l?d?s?u?s +?l?d?s?l?d?s?s?u +?l?d?s?l?l?d?d?u +?l?d?s?l?l?d?l?u +?l?d?s?l?l?d?u?d +?l?d?s?l?l?d?u?l +?l?d?s?l?l?d?u?u +?l?d?s?l?l?d?u?s +?l?d?s?l?l?d?s?u +?l?d?s?l?l?l?d?u +?l?d?s?l?l?l?l?u +?l?d?s?l?l?l?u?d +?l?d?s?l?l?l?u?l +?l?d?s?l?l?l?u?u +?l?d?s?l?l?l?u?s +?l?d?s?l?l?l?s?u +?l?d?s?l?l?u?d?d +?l?d?s?l?l?u?d?l +?l?d?s?l?l?u?d?u +?l?d?s?l?l?u?d?s +?l?d?s?l?l?u?l?d +?l?d?s?l?l?u?l?l +?l?d?s?l?l?u?l?u +?l?d?s?l?l?u?l?s +?l?d?s?l?l?u?u?d +?l?d?s?l?l?u?u?l +?l?d?s?l?l?u?u?u +?l?d?s?l?l?u?u?s +?l?d?s?l?l?u?s?d +?l?d?s?l?l?u?s?l +?l?d?s?l?l?u?s?u +?l?d?s?l?l?u?s?s +?l?d?s?l?l?s?d?u +?l?d?s?l?l?s?l?u +?l?d?s?l?l?s?u?d +?l?d?s?l?l?s?u?l +?l?d?s?l?l?s?u?u +?l?d?s?l?l?s?u?s +?l?d?s?l?l?s?s?u +?l?d?s?l?u?d?d?d +?l?d?s?l?u?d?d?l +?l?d?s?l?u?d?d?u +?l?d?s?l?u?d?d?s +?l?d?s?l?u?d?l?d +?l?d?s?l?u?d?l?l +?l?d?s?l?u?d?l?u +?l?d?s?l?u?d?l?s +?l?d?s?l?u?d?u?d +?l?d?s?l?u?d?u?l +?l?d?s?l?u?d?u?u +?l?d?s?l?u?d?u?s +?l?d?s?l?u?d?s?d +?l?d?s?l?u?d?s?l +?l?d?s?l?u?d?s?u +?l?d?s?l?u?d?s?s +?l?d?s?l?u?l?d?d +?l?d?s?l?u?l?d?l +?l?d?s?l?u?l?d?u +?l?d?s?l?u?l?d?s +?l?d?s?l?u?l?l?d +?l?d?s?l?u?l?l?l +?l?d?s?l?u?l?l?u +?l?d?s?l?u?l?l?s +?l?d?s?l?u?l?u?d +?l?d?s?l?u?l?u?l +?l?d?s?l?u?l?u?u +?l?d?s?l?u?l?u?s +?l?d?s?l?u?l?s?d +?l?d?s?l?u?l?s?l +?l?d?s?l?u?l?s?u +?l?d?s?l?u?l?s?s +?l?d?s?l?u?u?d?d +?l?d?s?l?u?u?d?l +?l?d?s?l?u?u?d?u +?l?d?s?l?u?u?d?s +?l?d?s?l?u?u?l?d +?l?d?s?l?u?u?l?l +?l?d?s?l?u?u?l?u +?l?d?s?l?u?u?l?s +?l?d?s?l?u?u?u?d +?l?d?s?l?u?u?u?l +?l?d?s?l?u?u?u?u +?l?d?s?l?u?u?u?s +?l?d?s?l?u?u?s?d +?l?d?s?l?u?u?s?l +?l?d?s?l?u?u?s?u +?l?d?s?l?u?u?s?s +?l?d?s?l?u?s?d?d +?l?d?s?l?u?s?d?l +?l?d?s?l?u?s?d?u +?l?d?s?l?u?s?d?s +?l?d?s?l?u?s?l?d +?l?d?s?l?u?s?l?l +?l?d?s?l?u?s?l?u +?l?d?s?l?u?s?l?s +?l?d?s?l?u?s?u?d +?l?d?s?l?u?s?u?l +?l?d?s?l?u?s?u?u +?l?d?s?l?u?s?u?s +?l?d?s?l?u?s?s?d +?l?d?s?l?u?s?s?l +?l?d?s?l?u?s?s?u +?l?d?s?l?u?s?s?s +?l?d?s?l?s?d?d?u +?l?d?s?l?s?d?l?u +?l?d?s?l?s?d?u?d +?l?d?s?l?s?d?u?l +?l?d?s?l?s?d?u?u +?l?d?s?l?s?d?u?s +?l?d?s?l?s?d?s?u +?l?d?s?l?s?l?d?u +?l?d?s?l?s?l?l?u +?l?d?s?l?s?l?u?d +?l?d?s?l?s?l?u?l +?l?d?s?l?s?l?u?u +?l?d?s?l?s?l?u?s +?l?d?s?l?s?l?s?u +?l?d?s?l?s?u?d?d +?l?d?s?l?s?u?d?l +?l?d?s?l?s?u?d?u +?l?d?s?l?s?u?d?s +?l?d?s?l?s?u?l?d +?l?d?s?l?s?u?l?l +?l?d?s?l?s?u?l?u +?l?d?s?l?s?u?l?s +?l?d?s?l?s?u?u?d +?l?d?s?l?s?u?u?l +?l?d?s?l?s?u?u?u +?l?d?s?l?s?u?u?s +?l?d?s?l?s?u?s?d +?l?d?s?l?s?u?s?l +?l?d?s?l?s?u?s?u +?l?d?s?l?s?u?s?s +?l?d?s?l?s?s?d?u +?l?d?s?l?s?s?l?u +?l?d?s?l?s?s?u?d +?l?d?s?l?s?s?u?l +?l?d?s?l?s?s?u?u +?l?d?s?l?s?s?u?s +?l?d?s?l?s?s?s?u +?l?d?s?u?d?d?d?d +?l?d?s?u?d?d?d?l +?l?d?s?u?d?d?d?u +?l?d?s?u?d?d?d?s +?l?d?s?u?d?d?l?d +?l?d?s?u?d?d?l?l +?l?d?s?u?d?d?l?u +?l?d?s?u?d?d?l?s +?l?d?s?u?d?d?u?d +?l?d?s?u?d?d?u?l +?l?d?s?u?d?d?u?u +?l?d?s?u?d?d?u?s +?l?d?s?u?d?d?s?d +?l?d?s?u?d?d?s?l +?l?d?s?u?d?d?s?u +?l?d?s?u?d?d?s?s +?l?d?s?u?d?l?d?d +?l?d?s?u?d?l?d?l +?l?d?s?u?d?l?d?u +?l?d?s?u?d?l?d?s +?l?d?s?u?d?l?l?d +?l?d?s?u?d?l?l?l +?l?d?s?u?d?l?l?u +?l?d?s?u?d?l?l?s +?l?d?s?u?d?l?u?d +?l?d?s?u?d?l?u?l +?l?d?s?u?d?l?u?u +?l?d?s?u?d?l?u?s +?l?d?s?u?d?l?s?d +?l?d?s?u?d?l?s?l +?l?d?s?u?d?l?s?u +?l?d?s?u?d?l?s?s +?l?d?s?u?d?u?d?d +?l?d?s?u?d?u?d?l +?l?d?s?u?d?u?d?u +?l?d?s?u?d?u?d?s +?l?d?s?u?d?u?l?d +?l?d?s?u?d?u?l?l +?l?d?s?u?d?u?l?u +?l?d?s?u?d?u?l?s +?l?d?s?u?d?u?u?d +?l?d?s?u?d?u?u?l +?l?d?s?u?d?u?u?u +?l?d?s?u?d?u?u?s +?l?d?s?u?d?u?s?d +?l?d?s?u?d?u?s?l +?l?d?s?u?d?u?s?u +?l?d?s?u?d?u?s?s +?l?d?s?u?d?s?d?d +?l?d?s?u?d?s?d?l +?l?d?s?u?d?s?d?u +?l?d?s?u?d?s?d?s +?l?d?s?u?d?s?l?d +?l?d?s?u?d?s?l?l +?l?d?s?u?d?s?l?u +?l?d?s?u?d?s?l?s +?l?d?s?u?d?s?u?d +?l?d?s?u?d?s?u?l +?l?d?s?u?d?s?u?u +?l?d?s?u?d?s?u?s +?l?d?s?u?d?s?s?d +?l?d?s?u?d?s?s?l +?l?d?s?u?d?s?s?u +?l?d?s?u?d?s?s?s +?l?d?s?u?l?d?d?d +?l?d?s?u?l?d?d?l +?l?d?s?u?l?d?d?u +?l?d?s?u?l?d?d?s +?l?d?s?u?l?d?l?d +?l?d?s?u?l?d?l?l +?l?d?s?u?l?d?l?u +?l?d?s?u?l?d?l?s +?l?d?s?u?l?d?u?d +?l?d?s?u?l?d?u?l +?l?d?s?u?l?d?u?u +?l?d?s?u?l?d?u?s +?l?d?s?u?l?d?s?d +?l?d?s?u?l?d?s?l +?l?d?s?u?l?d?s?u +?l?d?s?u?l?d?s?s +?l?d?s?u?l?l?d?d +?l?d?s?u?l?l?d?l +?l?d?s?u?l?l?d?u +?l?d?s?u?l?l?d?s +?l?d?s?u?l?l?l?d +?l?d?s?u?l?l?l?l +?l?d?s?u?l?l?l?u +?l?d?s?u?l?l?l?s +?l?d?s?u?l?l?u?d +?l?d?s?u?l?l?u?l +?l?d?s?u?l?l?u?u +?l?d?s?u?l?l?u?s +?l?d?s?u?l?l?s?d +?l?d?s?u?l?l?s?l +?l?d?s?u?l?l?s?u +?l?d?s?u?l?l?s?s +?l?d?s?u?l?u?d?d +?l?d?s?u?l?u?d?l +?l?d?s?u?l?u?d?u +?l?d?s?u?l?u?d?s +?l?d?s?u?l?u?l?d +?l?d?s?u?l?u?l?l +?l?d?s?u?l?u?l?u +?l?d?s?u?l?u?l?s +?l?d?s?u?l?u?u?d +?l?d?s?u?l?u?u?l +?l?d?s?u?l?u?u?u +?l?d?s?u?l?u?u?s +?l?d?s?u?l?u?s?d +?l?d?s?u?l?u?s?l +?l?d?s?u?l?u?s?u +?l?d?s?u?l?u?s?s +?l?d?s?u?l?s?d?d +?l?d?s?u?l?s?d?l +?l?d?s?u?l?s?d?u +?l?d?s?u?l?s?d?s +?l?d?s?u?l?s?l?d +?l?d?s?u?l?s?l?l +?l?d?s?u?l?s?l?u +?l?d?s?u?l?s?l?s +?l?d?s?u?l?s?u?d +?l?d?s?u?l?s?u?l +?l?d?s?u?l?s?u?u +?l?d?s?u?l?s?u?s +?l?d?s?u?l?s?s?d +?l?d?s?u?l?s?s?l +?l?d?s?u?l?s?s?u +?l?d?s?u?l?s?s?s +?l?d?s?u?u?d?d?d +?l?d?s?u?u?d?d?l +?l?d?s?u?u?d?d?u +?l?d?s?u?u?d?d?s +?l?d?s?u?u?d?l?d +?l?d?s?u?u?d?l?l +?l?d?s?u?u?d?l?u +?l?d?s?u?u?d?l?s +?l?d?s?u?u?d?u?d +?l?d?s?u?u?d?u?l +?l?d?s?u?u?d?u?u +?l?d?s?u?u?d?u?s +?l?d?s?u?u?d?s?d +?l?d?s?u?u?d?s?l +?l?d?s?u?u?d?s?u +?l?d?s?u?u?d?s?s +?l?d?s?u?u?l?d?d +?l?d?s?u?u?l?d?l +?l?d?s?u?u?l?d?u +?l?d?s?u?u?l?d?s +?l?d?s?u?u?l?l?d +?l?d?s?u?u?l?l?l +?l?d?s?u?u?l?l?u +?l?d?s?u?u?l?l?s +?l?d?s?u?u?l?u?d +?l?d?s?u?u?l?u?l +?l?d?s?u?u?l?u?u +?l?d?s?u?u?l?u?s +?l?d?s?u?u?l?s?d +?l?d?s?u?u?l?s?l +?l?d?s?u?u?l?s?u +?l?d?s?u?u?l?s?s +?l?d?s?u?u?u?d?d +?l?d?s?u?u?u?d?l +?l?d?s?u?u?u?d?u +?l?d?s?u?u?u?d?s +?l?d?s?u?u?u?l?d +?l?d?s?u?u?u?l?l +?l?d?s?u?u?u?l?u +?l?d?s?u?u?u?l?s +?l?d?s?u?u?u?u?d +?l?d?s?u?u?u?u?l +?l?d?s?u?u?u?u?u +?l?d?s?u?u?u?u?s +?l?d?s?u?u?u?s?d +?l?d?s?u?u?u?s?l +?l?d?s?u?u?u?s?u +?l?d?s?u?u?u?s?s +?l?d?s?u?u?s?d?d +?l?d?s?u?u?s?d?l +?l?d?s?u?u?s?d?u +?l?d?s?u?u?s?d?s +?l?d?s?u?u?s?l?d +?l?d?s?u?u?s?l?l +?l?d?s?u?u?s?l?u +?l?d?s?u?u?s?l?s +?l?d?s?u?u?s?u?d +?l?d?s?u?u?s?u?l +?l?d?s?u?u?s?u?u +?l?d?s?u?u?s?u?s +?l?d?s?u?u?s?s?d +?l?d?s?u?u?s?s?l +?l?d?s?u?u?s?s?u +?l?d?s?u?u?s?s?s +?l?d?s?u?s?d?d?d +?l?d?s?u?s?d?d?l +?l?d?s?u?s?d?d?u +?l?d?s?u?s?d?d?s +?l?d?s?u?s?d?l?d +?l?d?s?u?s?d?l?l +?l?d?s?u?s?d?l?u +?l?d?s?u?s?d?l?s +?l?d?s?u?s?d?u?d +?l?d?s?u?s?d?u?l +?l?d?s?u?s?d?u?u +?l?d?s?u?s?d?u?s +?l?d?s?u?s?d?s?d +?l?d?s?u?s?d?s?l +?l?d?s?u?s?d?s?u +?l?d?s?u?s?d?s?s +?l?d?s?u?s?l?d?d +?l?d?s?u?s?l?d?l +?l?d?s?u?s?l?d?u +?l?d?s?u?s?l?d?s +?l?d?s?u?s?l?l?d +?l?d?s?u?s?l?l?l +?l?d?s?u?s?l?l?u +?l?d?s?u?s?l?l?s +?l?d?s?u?s?l?u?d +?l?d?s?u?s?l?u?l +?l?d?s?u?s?l?u?u +?l?d?s?u?s?l?u?s +?l?d?s?u?s?l?s?d +?l?d?s?u?s?l?s?l +?l?d?s?u?s?l?s?u +?l?d?s?u?s?l?s?s +?l?d?s?u?s?u?d?d +?l?d?s?u?s?u?d?l +?l?d?s?u?s?u?d?u +?l?d?s?u?s?u?d?s +?l?d?s?u?s?u?l?d +?l?d?s?u?s?u?l?l +?l?d?s?u?s?u?l?u +?l?d?s?u?s?u?l?s +?l?d?s?u?s?u?u?d +?l?d?s?u?s?u?u?l +?l?d?s?u?s?u?u?u +?l?d?s?u?s?u?u?s +?l?d?s?u?s?u?s?d +?l?d?s?u?s?u?s?l +?l?d?s?u?s?u?s?u +?l?d?s?u?s?u?s?s +?l?d?s?u?s?s?d?d +?l?d?s?u?s?s?d?l +?l?d?s?u?s?s?d?u +?l?d?s?u?s?s?d?s +?l?d?s?u?s?s?l?d +?l?d?s?u?s?s?l?l +?l?d?s?u?s?s?l?u +?l?d?s?u?s?s?l?s +?l?d?s?u?s?s?u?d +?l?d?s?u?s?s?u?l +?l?d?s?u?s?s?u?u +?l?d?s?u?s?s?u?s +?l?d?s?u?s?s?s?d +?l?d?s?u?s?s?s?l +?l?d?s?u?s?s?s?u +?l?d?s?u?s?s?s?s +?l?d?s?s?d?d?d?u +?l?d?s?s?d?d?l?u +?l?d?s?s?d?d?u?d +?l?d?s?s?d?d?u?l +?l?d?s?s?d?d?u?u +?l?d?s?s?d?d?u?s +?l?d?s?s?d?d?s?u +?l?d?s?s?d?l?d?u +?l?d?s?s?d?l?l?u +?l?d?s?s?d?l?u?d +?l?d?s?s?d?l?u?l +?l?d?s?s?d?l?u?u +?l?d?s?s?d?l?u?s +?l?d?s?s?d?l?s?u +?l?d?s?s?d?u?d?d +?l?d?s?s?d?u?d?l +?l?d?s?s?d?u?d?u +?l?d?s?s?d?u?d?s +?l?d?s?s?d?u?l?d +?l?d?s?s?d?u?l?l +?l?d?s?s?d?u?l?u +?l?d?s?s?d?u?l?s +?l?d?s?s?d?u?u?d +?l?d?s?s?d?u?u?l +?l?d?s?s?d?u?u?u +?l?d?s?s?d?u?u?s +?l?d?s?s?d?u?s?d +?l?d?s?s?d?u?s?l +?l?d?s?s?d?u?s?u +?l?d?s?s?d?u?s?s +?l?d?s?s?d?s?d?u +?l?d?s?s?d?s?l?u +?l?d?s?s?d?s?u?d +?l?d?s?s?d?s?u?l +?l?d?s?s?d?s?u?u +?l?d?s?s?d?s?u?s +?l?d?s?s?d?s?s?u +?l?d?s?s?l?d?d?u +?l?d?s?s?l?d?l?u +?l?d?s?s?l?d?u?d +?l?d?s?s?l?d?u?l +?l?d?s?s?l?d?u?u +?l?d?s?s?l?d?u?s +?l?d?s?s?l?d?s?u +?l?d?s?s?l?l?d?u +?l?d?s?s?l?l?l?u +?l?d?s?s?l?l?u?d +?l?d?s?s?l?l?u?l +?l?d?s?s?l?l?u?u +?l?d?s?s?l?l?u?s +?l?d?s?s?l?l?s?u +?l?d?s?s?l?u?d?d +?l?d?s?s?l?u?d?l +?l?d?s?s?l?u?d?u +?l?d?s?s?l?u?d?s +?l?d?s?s?l?u?l?d +?l?d?s?s?l?u?l?l +?l?d?s?s?l?u?l?u +?l?d?s?s?l?u?l?s +?l?d?s?s?l?u?u?d +?l?d?s?s?l?u?u?l +?l?d?s?s?l?u?u?u +?l?d?s?s?l?u?u?s +?l?d?s?s?l?u?s?d +?l?d?s?s?l?u?s?l +?l?d?s?s?l?u?s?u +?l?d?s?s?l?u?s?s +?l?d?s?s?l?s?d?u +?l?d?s?s?l?s?l?u +?l?d?s?s?l?s?u?d +?l?d?s?s?l?s?u?l +?l?d?s?s?l?s?u?u +?l?d?s?s?l?s?u?s +?l?d?s?s?l?s?s?u +?l?d?s?s?u?d?d?d +?l?d?s?s?u?d?d?l +?l?d?s?s?u?d?d?u +?l?d?s?s?u?d?d?s +?l?d?s?s?u?d?l?d +?l?d?s?s?u?d?l?l +?l?d?s?s?u?d?l?u +?l?d?s?s?u?d?l?s +?l?d?s?s?u?d?u?d +?l?d?s?s?u?d?u?l +?l?d?s?s?u?d?u?u +?l?d?s?s?u?d?u?s +?l?d?s?s?u?d?s?d +?l?d?s?s?u?d?s?l +?l?d?s?s?u?d?s?u +?l?d?s?s?u?d?s?s +?l?d?s?s?u?l?d?d +?l?d?s?s?u?l?d?l +?l?d?s?s?u?l?d?u +?l?d?s?s?u?l?d?s +?l?d?s?s?u?l?l?d +?l?d?s?s?u?l?l?l +?l?d?s?s?u?l?l?u +?l?d?s?s?u?l?l?s +?l?d?s?s?u?l?u?d +?l?d?s?s?u?l?u?l +?l?d?s?s?u?l?u?u +?l?d?s?s?u?l?u?s +?l?d?s?s?u?l?s?d +?l?d?s?s?u?l?s?l +?l?d?s?s?u?l?s?u +?l?d?s?s?u?l?s?s +?l?d?s?s?u?u?d?d +?l?d?s?s?u?u?d?l +?l?d?s?s?u?u?d?u +?l?d?s?s?u?u?d?s +?l?d?s?s?u?u?l?d +?l?d?s?s?u?u?l?l +?l?d?s?s?u?u?l?u +?l?d?s?s?u?u?l?s +?l?d?s?s?u?u?u?d +?l?d?s?s?u?u?u?l +?l?d?s?s?u?u?u?u +?l?d?s?s?u?u?u?s +?l?d?s?s?u?u?s?d +?l?d?s?s?u?u?s?l +?l?d?s?s?u?u?s?u +?l?d?s?s?u?u?s?s +?l?d?s?s?u?s?d?d +?l?d?s?s?u?s?d?l +?l?d?s?s?u?s?d?u +?l?d?s?s?u?s?d?s +?l?d?s?s?u?s?l?d +?l?d?s?s?u?s?l?l +?l?d?s?s?u?s?l?u +?l?d?s?s?u?s?l?s +?l?d?s?s?u?s?u?d +?l?d?s?s?u?s?u?l +?l?d?s?s?u?s?u?u +?l?d?s?s?u?s?u?s +?l?d?s?s?u?s?s?d +?l?d?s?s?u?s?s?l +?l?d?s?s?u?s?s?u +?l?d?s?s?u?s?s?s +?l?d?s?s?s?d?d?u +?l?d?s?s?s?d?l?u +?l?d?s?s?s?d?u?d +?l?d?s?s?s?d?u?l +?l?d?s?s?s?d?u?u +?l?d?s?s?s?d?u?s +?l?d?s?s?s?d?s?u +?l?d?s?s?s?l?d?u +?l?d?s?s?s?l?l?u +?l?d?s?s?s?l?u?d +?l?d?s?s?s?l?u?l +?l?d?s?s?s?l?u?u +?l?d?s?s?s?l?u?s +?l?d?s?s?s?l?s?u +?l?d?s?s?s?u?d?d +?l?d?s?s?s?u?d?l +?l?d?s?s?s?u?d?u +?l?d?s?s?s?u?d?s +?l?d?s?s?s?u?l?d +?l?d?s?s?s?u?l?l +?l?d?s?s?s?u?l?u +?l?d?s?s?s?u?l?s +?l?d?s?s?s?u?u?d +?l?d?s?s?s?u?u?l +?l?d?s?s?s?u?u?u +?l?d?s?s?s?u?u?s +?l?d?s?s?s?u?s?d +?l?d?s?s?s?u?s?l +?l?d?s?s?s?u?s?u +?l?d?s?s?s?u?s?s +?l?d?s?s?s?s?d?u +?l?d?s?s?s?s?l?u +?l?d?s?s?s?s?u?d +?l?d?s?s?s?s?u?l +?l?d?s?s?s?s?u?u +?l?d?s?s?s?s?u?s +?l?d?s?s?s?s?s?u +?l?l?d?d?d?d?u?s +?l?l?d?d?d?d?s?u +?l?l?d?d?d?l?u?s +?l?l?d?d?d?l?s?u +?l?l?d?d?d?u?d?s +?l?l?d?d?d?u?l?s +?l?l?d?d?d?u?u?s +?l?l?d?d?d?u?s?d +?l?l?d?d?d?u?s?l +?l?l?d?d?d?u?s?u +?l?l?d?d?d?u?s?s +?l?l?d?d?d?s?d?u +?l?l?d?d?d?s?l?u +?l?l?d?d?d?s?u?d +?l?l?d?d?d?s?u?l +?l?l?d?d?d?s?u?u +?l?l?d?d?d?s?u?s +?l?l?d?d?d?s?s?u +?l?l?d?d?l?d?u?s +?l?l?d?d?l?d?s?u +?l?l?d?d?l?l?u?s +?l?l?d?d?l?l?s?u +?l?l?d?d?l?u?d?s +?l?l?d?d?l?u?l?s +?l?l?d?d?l?u?u?s +?l?l?d?d?l?u?s?d +?l?l?d?d?l?u?s?l +?l?l?d?d?l?u?s?u +?l?l?d?d?l?u?s?s +?l?l?d?d?l?s?d?u +?l?l?d?d?l?s?l?u +?l?l?d?d?l?s?u?d +?l?l?d?d?l?s?u?l +?l?l?d?d?l?s?u?u +?l?l?d?d?l?s?u?s +?l?l?d?d?l?s?s?u +?l?l?d?d?u?d?d?s +?l?l?d?d?u?d?l?s +?l?l?d?d?u?d?u?s +?l?l?d?d?u?d?s?d +?l?l?d?d?u?d?s?l +?l?l?d?d?u?d?s?u +?l?l?d?d?u?d?s?s +?l?l?d?d?u?l?d?s +?l?l?d?d?u?l?l?s +?l?l?d?d?u?l?u?s +?l?l?d?d?u?l?s?d +?l?l?d?d?u?l?s?l +?l?l?d?d?u?l?s?u +?l?l?d?d?u?l?s?s +?l?l?d?d?u?u?d?s +?l?l?d?d?u?u?l?s +?l?l?d?d?u?u?u?s +?l?l?d?d?u?u?s?d +?l?l?d?d?u?u?s?l +?l?l?d?d?u?u?s?u +?l?l?d?d?u?u?s?s +?l?l?d?d?u?s?d?d +?l?l?d?d?u?s?d?l +?l?l?d?d?u?s?d?u +?l?l?d?d?u?s?d?s +?l?l?d?d?u?s?l?d +?l?l?d?d?u?s?l?l +?l?l?d?d?u?s?l?u +?l?l?d?d?u?s?l?s +?l?l?d?d?u?s?u?d +?l?l?d?d?u?s?u?l +?l?l?d?d?u?s?u?u +?l?l?d?d?u?s?u?s +?l?l?d?d?u?s?s?d +?l?l?d?d?u?s?s?l +?l?l?d?d?u?s?s?u +?l?l?d?d?u?s?s?s +?l?l?d?d?s?d?d?u +?l?l?d?d?s?d?l?u +?l?l?d?d?s?d?u?d +?l?l?d?d?s?d?u?l +?l?l?d?d?s?d?u?u +?l?l?d?d?s?d?u?s +?l?l?d?d?s?d?s?u +?l?l?d?d?s?l?d?u +?l?l?d?d?s?l?l?u +?l?l?d?d?s?l?u?d +?l?l?d?d?s?l?u?l +?l?l?d?d?s?l?u?u +?l?l?d?d?s?l?u?s +?l?l?d?d?s?l?s?u +?l?l?d?d?s?u?d?d +?l?l?d?d?s?u?d?l +?l?l?d?d?s?u?d?u +?l?l?d?d?s?u?d?s +?l?l?d?d?s?u?l?d +?l?l?d?d?s?u?l?l +?l?l?d?d?s?u?l?u +?l?l?d?d?s?u?l?s +?l?l?d?d?s?u?u?d +?l?l?d?d?s?u?u?l +?l?l?d?d?s?u?u?u +?l?l?d?d?s?u?u?s +?l?l?d?d?s?u?s?d +?l?l?d?d?s?u?s?l +?l?l?d?d?s?u?s?u +?l?l?d?d?s?u?s?s +?l?l?d?d?s?s?d?u +?l?l?d?d?s?s?l?u +?l?l?d?d?s?s?u?d +?l?l?d?d?s?s?u?l +?l?l?d?d?s?s?u?u +?l?l?d?d?s?s?u?s +?l?l?d?d?s?s?s?u +?l?l?d?l?d?d?u?s +?l?l?d?l?d?d?s?u +?l?l?d?l?d?l?u?s +?l?l?d?l?d?l?s?u +?l?l?d?l?d?u?d?s +?l?l?d?l?d?u?l?s +?l?l?d?l?d?u?u?s +?l?l?d?l?d?u?s?d +?l?l?d?l?d?u?s?l +?l?l?d?l?d?u?s?u +?l?l?d?l?d?u?s?s +?l?l?d?l?d?s?d?u +?l?l?d?l?d?s?l?u +?l?l?d?l?d?s?u?d +?l?l?d?l?d?s?u?l +?l?l?d?l?d?s?u?u +?l?l?d?l?d?s?u?s +?l?l?d?l?d?s?s?u +?l?l?d?l?l?d?u?s +?l?l?d?l?l?d?s?u +?l?l?d?l?l?l?u?s +?l?l?d?l?l?l?s?u +?l?l?d?l?l?u?d?s +?l?l?d?l?l?u?l?s +?l?l?d?l?l?u?u?s +?l?l?d?l?l?u?s?d +?l?l?d?l?l?u?s?l +?l?l?d?l?l?u?s?u +?l?l?d?l?l?u?s?s +?l?l?d?l?l?s?d?u +?l?l?d?l?l?s?l?u +?l?l?d?l?l?s?u?d +?l?l?d?l?l?s?u?l +?l?l?d?l?l?s?u?u +?l?l?d?l?l?s?u?s +?l?l?d?l?l?s?s?u +?l?l?d?l?u?d?d?s +?l?l?d?l?u?d?l?s +?l?l?d?l?u?d?u?s +?l?l?d?l?u?d?s?d +?l?l?d?l?u?d?s?l +?l?l?d?l?u?d?s?u +?l?l?d?l?u?d?s?s +?l?l?d?l?u?l?d?s +?l?l?d?l?u?l?l?s +?l?l?d?l?u?l?u?s +?l?l?d?l?u?l?s?d +?l?l?d?l?u?l?s?l +?l?l?d?l?u?l?s?u +?l?l?d?l?u?l?s?s +?l?l?d?l?u?u?d?s +?l?l?d?l?u?u?l?s +?l?l?d?l?u?u?u?s +?l?l?d?l?u?u?s?d +?l?l?d?l?u?u?s?l +?l?l?d?l?u?u?s?u +?l?l?d?l?u?u?s?s +?l?l?d?l?u?s?d?d +?l?l?d?l?u?s?d?l +?l?l?d?l?u?s?d?u +?l?l?d?l?u?s?d?s +?l?l?d?l?u?s?l?d +?l?l?d?l?u?s?l?l +?l?l?d?l?u?s?l?u +?l?l?d?l?u?s?l?s +?l?l?d?l?u?s?u?d +?l?l?d?l?u?s?u?l +?l?l?d?l?u?s?u?u +?l?l?d?l?u?s?u?s +?l?l?d?l?u?s?s?d +?l?l?d?l?u?s?s?l +?l?l?d?l?u?s?s?u +?l?l?d?l?u?s?s?s +?l?l?d?l?s?d?d?u +?l?l?d?l?s?d?l?u +?l?l?d?l?s?d?u?d +?l?l?d?l?s?d?u?l +?l?l?d?l?s?d?u?u +?l?l?d?l?s?d?u?s +?l?l?d?l?s?d?s?u +?l?l?d?l?s?l?d?u +?l?l?d?l?s?l?l?u +?l?l?d?l?s?l?u?d +?l?l?d?l?s?l?u?l +?l?l?d?l?s?l?u?u +?l?l?d?l?s?l?u?s +?l?l?d?l?s?l?s?u +?l?l?d?l?s?u?d?d +?l?l?d?l?s?u?d?l +?l?l?d?l?s?u?d?u +?l?l?d?l?s?u?d?s +?l?l?d?l?s?u?l?d +?l?l?d?l?s?u?l?l +?l?l?d?l?s?u?l?u +?l?l?d?l?s?u?l?s +?l?l?d?l?s?u?u?d +?l?l?d?l?s?u?u?l +?l?l?d?l?s?u?u?u +?l?l?d?l?s?u?u?s +?l?l?d?l?s?u?s?d +?l?l?d?l?s?u?s?l +?l?l?d?l?s?u?s?u +?l?l?d?l?s?u?s?s +?l?l?d?l?s?s?d?u +?l?l?d?l?s?s?l?u +?l?l?d?l?s?s?u?d +?l?l?d?l?s?s?u?l +?l?l?d?l?s?s?u?u +?l?l?d?l?s?s?u?s +?l?l?d?l?s?s?s?u +?l?l?d?u?d?d?d?s +?l?l?d?u?d?d?l?s +?l?l?d?u?d?d?u?s +?l?l?d?u?d?d?s?d +?l?l?d?u?d?d?s?l +?l?l?d?u?d?d?s?u +?l?l?d?u?d?d?s?s +?l?l?d?u?d?l?d?s +?l?l?d?u?d?l?l?s +?l?l?d?u?d?l?u?s +?l?l?d?u?d?l?s?d +?l?l?d?u?d?l?s?l +?l?l?d?u?d?l?s?u +?l?l?d?u?d?l?s?s +?l?l?d?u?d?u?d?s +?l?l?d?u?d?u?l?s +?l?l?d?u?d?u?u?s +?l?l?d?u?d?u?s?d +?l?l?d?u?d?u?s?l +?l?l?d?u?d?u?s?u +?l?l?d?u?d?u?s?s +?l?l?d?u?d?s?d?d +?l?l?d?u?d?s?d?l +?l?l?d?u?d?s?d?u +?l?l?d?u?d?s?d?s +?l?l?d?u?d?s?l?d +?l?l?d?u?d?s?l?l +?l?l?d?u?d?s?l?u +?l?l?d?u?d?s?l?s +?l?l?d?u?d?s?u?d +?l?l?d?u?d?s?u?l +?l?l?d?u?d?s?u?u +?l?l?d?u?d?s?u?s +?l?l?d?u?d?s?s?d +?l?l?d?u?d?s?s?l +?l?l?d?u?d?s?s?u +?l?l?d?u?d?s?s?s +?l?l?d?u?l?d?d?s +?l?l?d?u?l?d?l?s +?l?l?d?u?l?d?u?s +?l?l?d?u?l?d?s?d +?l?l?d?u?l?d?s?l +?l?l?d?u?l?d?s?u +?l?l?d?u?l?d?s?s +?l?l?d?u?l?l?d?s +?l?l?d?u?l?l?l?s +?l?l?d?u?l?l?u?s +?l?l?d?u?l?l?s?d +?l?l?d?u?l?l?s?l +?l?l?d?u?l?l?s?u +?l?l?d?u?l?l?s?s +?l?l?d?u?l?u?d?s +?l?l?d?u?l?u?l?s +?l?l?d?u?l?u?u?s +?l?l?d?u?l?u?s?d +?l?l?d?u?l?u?s?l +?l?l?d?u?l?u?s?u +?l?l?d?u?l?u?s?s +?l?l?d?u?l?s?d?d +?l?l?d?u?l?s?d?l +?l?l?d?u?l?s?d?u +?l?l?d?u?l?s?d?s +?l?l?d?u?l?s?l?d +?l?l?d?u?l?s?l?l +?l?l?d?u?l?s?l?u +?l?l?d?u?l?s?l?s +?l?l?d?u?l?s?u?d +?l?l?d?u?l?s?u?l +?l?l?d?u?l?s?u?u +?l?l?d?u?l?s?u?s +?l?l?d?u?l?s?s?d +?l?l?d?u?l?s?s?l +?l?l?d?u?l?s?s?u +?l?l?d?u?l?s?s?s +?l?l?d?u?u?d?d?s +?l?l?d?u?u?d?l?s +?l?l?d?u?u?d?u?s +?l?l?d?u?u?d?s?d +?l?l?d?u?u?d?s?l +?l?l?d?u?u?d?s?u +?l?l?d?u?u?d?s?s +?l?l?d?u?u?l?d?s +?l?l?d?u?u?l?l?s +?l?l?d?u?u?l?u?s +?l?l?d?u?u?l?s?d +?l?l?d?u?u?l?s?l +?l?l?d?u?u?l?s?u +?l?l?d?u?u?l?s?s +?l?l?d?u?u?u?d?s +?l?l?d?u?u?u?l?s +?l?l?d?u?u?u?u?s +?l?l?d?u?u?u?s?d +?l?l?d?u?u?u?s?l +?l?l?d?u?u?u?s?u +?l?l?d?u?u?u?s?s +?l?l?d?u?u?s?d?d +?l?l?d?u?u?s?d?l +?l?l?d?u?u?s?d?u +?l?l?d?u?u?s?d?s +?l?l?d?u?u?s?l?d +?l?l?d?u?u?s?l?l +?l?l?d?u?u?s?l?u +?l?l?d?u?u?s?l?s +?l?l?d?u?u?s?u?d +?l?l?d?u?u?s?u?l +?l?l?d?u?u?s?u?u +?l?l?d?u?u?s?u?s +?l?l?d?u?u?s?s?d +?l?l?d?u?u?s?s?l +?l?l?d?u?u?s?s?u +?l?l?d?u?u?s?s?s +?l?l?d?u?s?d?d?d +?l?l?d?u?s?d?d?l +?l?l?d?u?s?d?d?u +?l?l?d?u?s?d?d?s +?l?l?d?u?s?d?l?d +?l?l?d?u?s?d?l?l +?l?l?d?u?s?d?l?u +?l?l?d?u?s?d?l?s +?l?l?d?u?s?d?u?d +?l?l?d?u?s?d?u?l +?l?l?d?u?s?d?u?u +?l?l?d?u?s?d?u?s +?l?l?d?u?s?d?s?d +?l?l?d?u?s?d?s?l +?l?l?d?u?s?d?s?u +?l?l?d?u?s?d?s?s +?l?l?d?u?s?l?d?d +?l?l?d?u?s?l?d?l +?l?l?d?u?s?l?d?u +?l?l?d?u?s?l?d?s +?l?l?d?u?s?l?l?d +?l?l?d?u?s?l?l?l +?l?l?d?u?s?l?l?u +?l?l?d?u?s?l?l?s +?l?l?d?u?s?l?u?d +?l?l?d?u?s?l?u?l +?l?l?d?u?s?l?u?u +?l?l?d?u?s?l?u?s +?l?l?d?u?s?l?s?d +?l?l?d?u?s?l?s?l +?l?l?d?u?s?l?s?u +?l?l?d?u?s?l?s?s +?l?l?d?u?s?u?d?d +?l?l?d?u?s?u?d?l +?l?l?d?u?s?u?d?u +?l?l?d?u?s?u?d?s +?l?l?d?u?s?u?l?d +?l?l?d?u?s?u?l?l +?l?l?d?u?s?u?l?u +?l?l?d?u?s?u?l?s +?l?l?d?u?s?u?u?d +?l?l?d?u?s?u?u?l +?l?l?d?u?s?u?u?u +?l?l?d?u?s?u?u?s +?l?l?d?u?s?u?s?d +?l?l?d?u?s?u?s?l +?l?l?d?u?s?u?s?u +?l?l?d?u?s?u?s?s +?l?l?d?u?s?s?d?d +?l?l?d?u?s?s?d?l +?l?l?d?u?s?s?d?u +?l?l?d?u?s?s?d?s +?l?l?d?u?s?s?l?d +?l?l?d?u?s?s?l?l +?l?l?d?u?s?s?l?u +?l?l?d?u?s?s?l?s +?l?l?d?u?s?s?u?d +?l?l?d?u?s?s?u?l +?l?l?d?u?s?s?u?u +?l?l?d?u?s?s?u?s +?l?l?d?u?s?s?s?d +?l?l?d?u?s?s?s?l +?l?l?d?u?s?s?s?u +?l?l?d?u?s?s?s?s +?l?l?d?s?d?d?d?u +?l?l?d?s?d?d?l?u +?l?l?d?s?d?d?u?d +?l?l?d?s?d?d?u?l +?l?l?d?s?d?d?u?u +?l?l?d?s?d?d?u?s +?l?l?d?s?d?d?s?u +?l?l?d?s?d?l?d?u +?l?l?d?s?d?l?l?u +?l?l?d?s?d?l?u?d +?l?l?d?s?d?l?u?l +?l?l?d?s?d?l?u?u +?l?l?d?s?d?l?u?s +?l?l?d?s?d?l?s?u +?l?l?d?s?d?u?d?d +?l?l?d?s?d?u?d?l +?l?l?d?s?d?u?d?u +?l?l?d?s?d?u?d?s +?l?l?d?s?d?u?l?d +?l?l?d?s?d?u?l?l +?l?l?d?s?d?u?l?u +?l?l?d?s?d?u?l?s +?l?l?d?s?d?u?u?d +?l?l?d?s?d?u?u?l +?l?l?d?s?d?u?u?u +?l?l?d?s?d?u?u?s +?l?l?d?s?d?u?s?d +?l?l?d?s?d?u?s?l +?l?l?d?s?d?u?s?u +?l?l?d?s?d?u?s?s +?l?l?d?s?d?s?d?u +?l?l?d?s?d?s?l?u +?l?l?d?s?d?s?u?d +?l?l?d?s?d?s?u?l +?l?l?d?s?d?s?u?u +?l?l?d?s?d?s?u?s +?l?l?d?s?d?s?s?u +?l?l?d?s?l?d?d?u +?l?l?d?s?l?d?l?u +?l?l?d?s?l?d?u?d +?l?l?d?s?l?d?u?l +?l?l?d?s?l?d?u?u +?l?l?d?s?l?d?u?s +?l?l?d?s?l?d?s?u +?l?l?d?s?l?l?d?u +?l?l?d?s?l?l?l?u +?l?l?d?s?l?l?u?d +?l?l?d?s?l?l?u?l +?l?l?d?s?l?l?u?u +?l?l?d?s?l?l?u?s +?l?l?d?s?l?l?s?u +?l?l?d?s?l?u?d?d +?l?l?d?s?l?u?d?l +?l?l?d?s?l?u?d?u +?l?l?d?s?l?u?d?s +?l?l?d?s?l?u?l?d +?l?l?d?s?l?u?l?l +?l?l?d?s?l?u?l?u +?l?l?d?s?l?u?l?s +?l?l?d?s?l?u?u?d +?l?l?d?s?l?u?u?l +?l?l?d?s?l?u?u?u +?l?l?d?s?l?u?u?s +?l?l?d?s?l?u?s?d +?l?l?d?s?l?u?s?l +?l?l?d?s?l?u?s?u +?l?l?d?s?l?u?s?s +?l?l?d?s?l?s?d?u +?l?l?d?s?l?s?l?u +?l?l?d?s?l?s?u?d +?l?l?d?s?l?s?u?l +?l?l?d?s?l?s?u?u +?l?l?d?s?l?s?u?s +?l?l?d?s?l?s?s?u +?l?l?d?s?u?d?d?d +?l?l?d?s?u?d?d?l +?l?l?d?s?u?d?d?u +?l?l?d?s?u?d?d?s +?l?l?d?s?u?d?l?d +?l?l?d?s?u?d?l?l +?l?l?d?s?u?d?l?u +?l?l?d?s?u?d?l?s +?l?l?d?s?u?d?u?d +?l?l?d?s?u?d?u?l +?l?l?d?s?u?d?u?u +?l?l?d?s?u?d?u?s +?l?l?d?s?u?d?s?d +?l?l?d?s?u?d?s?l +?l?l?d?s?u?d?s?u +?l?l?d?s?u?d?s?s +?l?l?d?s?u?l?d?d +?l?l?d?s?u?l?d?l +?l?l?d?s?u?l?d?u +?l?l?d?s?u?l?d?s +?l?l?d?s?u?l?l?d +?l?l?d?s?u?l?l?l +?l?l?d?s?u?l?l?u +?l?l?d?s?u?l?l?s +?l?l?d?s?u?l?u?d +?l?l?d?s?u?l?u?l +?l?l?d?s?u?l?u?u +?l?l?d?s?u?l?u?s +?l?l?d?s?u?l?s?d +?l?l?d?s?u?l?s?l +?l?l?d?s?u?l?s?u +?l?l?d?s?u?l?s?s +?l?l?d?s?u?u?d?d +?l?l?d?s?u?u?d?l +?l?l?d?s?u?u?d?u +?l?l?d?s?u?u?d?s +?l?l?d?s?u?u?l?d +?l?l?d?s?u?u?l?l +?l?l?d?s?u?u?l?u +?l?l?d?s?u?u?l?s +?l?l?d?s?u?u?u?d +?l?l?d?s?u?u?u?l +?l?l?d?s?u?u?u?u +?l?l?d?s?u?u?u?s +?l?l?d?s?u?u?s?d +?l?l?d?s?u?u?s?l +?l?l?d?s?u?u?s?u +?l?l?d?s?u?u?s?s +?l?l?d?s?u?s?d?d +?l?l?d?s?u?s?d?l +?l?l?d?s?u?s?d?u +?l?l?d?s?u?s?d?s +?l?l?d?s?u?s?l?d +?l?l?d?s?u?s?l?l +?l?l?d?s?u?s?l?u +?l?l?d?s?u?s?l?s +?l?l?d?s?u?s?u?d +?l?l?d?s?u?s?u?l +?l?l?d?s?u?s?u?u +?l?l?d?s?u?s?u?s +?l?l?d?s?u?s?s?d +?l?l?d?s?u?s?s?l +?l?l?d?s?u?s?s?u +?l?l?d?s?u?s?s?s +?l?l?d?s?s?d?d?u +?l?l?d?s?s?d?l?u +?l?l?d?s?s?d?u?d +?l?l?d?s?s?d?u?l +?l?l?d?s?s?d?u?u +?l?l?d?s?s?d?u?s +?l?l?d?s?s?d?s?u +?l?l?d?s?s?l?d?u +?l?l?d?s?s?l?l?u +?l?l?d?s?s?l?u?d +?l?l?d?s?s?l?u?l +?l?l?d?s?s?l?u?u +?l?l?d?s?s?l?u?s +?l?l?d?s?s?l?s?u +?l?l?d?s?s?u?d?d +?l?l?d?s?s?u?d?l +?l?l?d?s?s?u?d?u +?l?l?d?s?s?u?d?s +?l?l?d?s?s?u?l?d +?l?l?d?s?s?u?l?l +?l?l?d?s?s?u?l?u +?l?l?d?s?s?u?l?s +?l?l?d?s?s?u?u?d +?l?l?d?s?s?u?u?l +?l?l?d?s?s?u?u?u +?l?l?d?s?s?u?u?s +?l?l?d?s?s?u?s?d +?l?l?d?s?s?u?s?l +?l?l?d?s?s?u?s?u +?l?l?d?s?s?u?s?s +?l?l?d?s?s?s?d?u +?l?l?d?s?s?s?l?u +?l?l?d?s?s?s?u?d +?l?l?d?s?s?s?u?l +?l?l?d?s?s?s?u?u +?l?l?d?s?s?s?u?s +?l?l?d?s?s?s?s?u +?l?l?l?d?d?d?u?s +?l?l?l?d?d?d?s?u +?l?l?l?d?d?l?u?s +?l?l?l?d?d?l?s?u +?l?l?l?d?d?u?d?s +?l?l?l?d?d?u?l?s +?l?l?l?d?d?u?u?s +?l?l?l?d?d?u?s?d +?l?l?l?d?d?u?s?l +?l?l?l?d?d?u?s?u +?l?l?l?d?d?u?s?s +?l?l?l?d?d?s?d?u +?l?l?l?d?d?s?l?u +?l?l?l?d?d?s?u?d +?l?l?l?d?d?s?u?l +?l?l?l?d?d?s?u?u +?l?l?l?d?d?s?u?s +?l?l?l?d?d?s?s?u +?l?l?l?d?l?d?u?s +?l?l?l?d?l?d?s?u +?l?l?l?d?l?l?u?s +?l?l?l?d?l?l?s?u +?l?l?l?d?l?u?d?s +?l?l?l?d?l?u?l?s +?l?l?l?d?l?u?u?s +?l?l?l?d?l?u?s?d +?l?l?l?d?l?u?s?l +?l?l?l?d?l?u?s?u +?l?l?l?d?l?u?s?s +?l?l?l?d?l?s?d?u +?l?l?l?d?l?s?l?u +?l?l?l?d?l?s?u?d +?l?l?l?d?l?s?u?l +?l?l?l?d?l?s?u?u +?l?l?l?d?l?s?u?s +?l?l?l?d?l?s?s?u +?l?l?l?d?u?d?d?s +?l?l?l?d?u?d?l?s +?l?l?l?d?u?d?u?s +?l?l?l?d?u?d?s?d +?l?l?l?d?u?d?s?l +?l?l?l?d?u?d?s?u +?l?l?l?d?u?d?s?s +?l?l?l?d?u?l?d?s +?l?l?l?d?u?l?l?s +?l?l?l?d?u?l?u?s +?l?l?l?d?u?l?s?d +?l?l?l?d?u?l?s?l +?l?l?l?d?u?l?s?u +?l?l?l?d?u?l?s?s +?l?l?l?d?u?u?d?s +?l?l?l?d?u?u?l?s +?l?l?l?d?u?u?u?s +?l?l?l?d?u?u?s?d +?l?l?l?d?u?u?s?l +?l?l?l?d?u?u?s?u +?l?l?l?d?u?u?s?s +?l?l?l?d?u?s?d?d +?l?l?l?d?u?s?d?l +?l?l?l?d?u?s?d?u +?l?l?l?d?u?s?d?s +?l?l?l?d?u?s?l?d +?l?l?l?d?u?s?l?l +?l?l?l?d?u?s?l?u +?l?l?l?d?u?s?l?s +?l?l?l?d?u?s?u?d +?l?l?l?d?u?s?u?l +?l?l?l?d?u?s?u?u +?l?l?l?d?u?s?u?s +?l?l?l?d?u?s?s?d +?l?l?l?d?u?s?s?l +?l?l?l?d?u?s?s?u +?l?l?l?d?u?s?s?s +?l?l?l?d?s?d?d?u +?l?l?l?d?s?d?l?u +?l?l?l?d?s?d?u?d +?l?l?l?d?s?d?u?l +?l?l?l?d?s?d?u?u +?l?l?l?d?s?d?u?s +?l?l?l?d?s?d?s?u +?l?l?l?d?s?l?d?u +?l?l?l?d?s?l?l?u +?l?l?l?d?s?l?u?d +?l?l?l?d?s?l?u?l +?l?l?l?d?s?l?u?u +?l?l?l?d?s?l?u?s +?l?l?l?d?s?l?s?u +?l?l?l?d?s?u?d?d +?l?l?l?d?s?u?d?l +?l?l?l?d?s?u?d?u +?l?l?l?d?s?u?d?s +?l?l?l?d?s?u?l?d +?l?l?l?d?s?u?l?l +?l?l?l?d?s?u?l?u +?l?l?l?d?s?u?l?s +?l?l?l?d?s?u?u?d +?l?l?l?d?s?u?u?l +?l?l?l?d?s?u?u?u +?l?l?l?d?s?u?u?s +?l?l?l?d?s?u?s?d +?l?l?l?d?s?u?s?l +?l?l?l?d?s?u?s?u +?l?l?l?d?s?u?s?s +?l?l?l?d?s?s?d?u +?l?l?l?d?s?s?l?u +?l?l?l?d?s?s?u?d +?l?l?l?d?s?s?u?l +?l?l?l?d?s?s?u?u +?l?l?l?d?s?s?u?s +?l?l?l?d?s?s?s?u +?l?l?l?l?d?d?u?s +?l?l?l?l?d?d?s?u +?l?l?l?l?d?l?u?s +?l?l?l?l?d?l?s?u +?l?l?l?l?d?u?d?s +?l?l?l?l?d?u?l?s +?l?l?l?l?d?u?u?s +?l?l?l?l?d?u?s?d +?l?l?l?l?d?u?s?l +?l?l?l?l?d?u?s?u +?l?l?l?l?d?u?s?s +?l?l?l?l?d?s?d?u +?l?l?l?l?d?s?l?u +?l?l?l?l?d?s?u?d +?l?l?l?l?d?s?u?l +?l?l?l?l?d?s?u?u +?l?l?l?l?d?s?u?s +?l?l?l?l?d?s?s?u +?l?l?l?l?l?d?u?s +?l?l?l?l?l?d?s?u +?l?l?l?l?l?u?d?s +?l?l?l?l?l?u?s?d +?l?l?l?l?l?s?d?u +?l?l?l?l?l?s?u?d +?l?l?l?l?u?d?d?s +?l?l?l?l?u?d?l?s +?l?l?l?l?u?d?u?s +?l?l?l?l?u?d?s?d +?l?l?l?l?u?d?s?l +?l?l?l?l?u?d?s?u +?l?l?l?l?u?d?s?s +?l?l?l?l?u?l?d?s +?l?l?l?l?u?l?s?d +?l?l?l?l?u?u?d?s +?l?l?l?l?u?u?s?d +?l?l?l?l?u?s?d?d +?l?l?l?l?u?s?d?l +?l?l?l?l?u?s?d?u +?l?l?l?l?u?s?d?s +?l?l?l?l?u?s?l?d +?l?l?l?l?u?s?u?d +?l?l?l?l?u?s?s?d +?l?l?l?l?s?d?d?u +?l?l?l?l?s?d?l?u +?l?l?l?l?s?d?u?d +?l?l?l?l?s?d?u?l +?l?l?l?l?s?d?u?u +?l?l?l?l?s?d?u?s +?l?l?l?l?s?d?s?u +?l?l?l?l?s?l?d?u +?l?l?l?l?s?l?u?d +?l?l?l?l?s?u?d?d +?l?l?l?l?s?u?d?l +?l?l?l?l?s?u?d?u +?l?l?l?l?s?u?d?s +?l?l?l?l?s?u?l?d +?l?l?l?l?s?u?u?d +?l?l?l?l?s?u?s?d +?l?l?l?l?s?s?d?u +?l?l?l?l?s?s?u?d +?l?l?l?u?d?d?d?s +?l?l?l?u?d?d?l?s +?l?l?l?u?d?d?u?s +?l?l?l?u?d?d?s?d +?l?l?l?u?d?d?s?l +?l?l?l?u?d?d?s?u +?l?l?l?u?d?d?s?s +?l?l?l?u?d?l?d?s +?l?l?l?u?d?l?l?s +?l?l?l?u?d?l?u?s +?l?l?l?u?d?l?s?d +?l?l?l?u?d?l?s?l +?l?l?l?u?d?l?s?u +?l?l?l?u?d?l?s?s +?l?l?l?u?d?u?d?s +?l?l?l?u?d?u?l?s +?l?l?l?u?d?u?u?s +?l?l?l?u?d?u?s?d +?l?l?l?u?d?u?s?l +?l?l?l?u?d?u?s?u +?l?l?l?u?d?u?s?s +?l?l?l?u?d?s?d?d +?l?l?l?u?d?s?d?l +?l?l?l?u?d?s?d?u +?l?l?l?u?d?s?d?s +?l?l?l?u?d?s?l?d +?l?l?l?u?d?s?l?l +?l?l?l?u?d?s?l?u +?l?l?l?u?d?s?l?s +?l?l?l?u?d?s?u?d +?l?l?l?u?d?s?u?l +?l?l?l?u?d?s?u?u +?l?l?l?u?d?s?u?s +?l?l?l?u?d?s?s?d +?l?l?l?u?d?s?s?l +?l?l?l?u?d?s?s?u +?l?l?l?u?d?s?s?s +?l?l?l?u?l?d?d?s +?l?l?l?u?l?d?l?s +?l?l?l?u?l?d?u?s +?l?l?l?u?l?d?s?d +?l?l?l?u?l?d?s?l +?l?l?l?u?l?d?s?u +?l?l?l?u?l?d?s?s +?l?l?l?u?l?l?d?s +?l?l?l?u?l?l?s?d +?l?l?l?u?l?u?d?s +?l?l?l?u?l?u?s?d +?l?l?l?u?l?s?d?d +?l?l?l?u?l?s?d?l +?l?l?l?u?l?s?d?u +?l?l?l?u?l?s?d?s +?l?l?l?u?l?s?l?d +?l?l?l?u?l?s?u?d +?l?l?l?u?l?s?s?d +?l?l?l?u?u?d?d?s +?l?l?l?u?u?d?l?s +?l?l?l?u?u?d?u?s +?l?l?l?u?u?d?s?d +?l?l?l?u?u?d?s?l +?l?l?l?u?u?d?s?u +?l?l?l?u?u?d?s?s +?l?l?l?u?u?l?d?s +?l?l?l?u?u?l?s?d +?l?l?l?u?u?u?d?s +?l?l?l?u?u?u?s?d +?l?l?l?u?u?s?d?d +?l?l?l?u?u?s?d?l +?l?l?l?u?u?s?d?u +?l?l?l?u?u?s?d?s +?l?l?l?u?u?s?l?d +?l?l?l?u?u?s?u?d +?l?l?l?u?u?s?s?d +?l?l?l?u?s?d?d?d +?l?l?l?u?s?d?d?l +?l?l?l?u?s?d?d?u +?l?l?l?u?s?d?d?s +?l?l?l?u?s?d?l?d +?l?l?l?u?s?d?l?l +?l?l?l?u?s?d?l?u +?l?l?l?u?s?d?l?s +?l?l?l?u?s?d?u?d +?l?l?l?u?s?d?u?l +?l?l?l?u?s?d?u?u +?l?l?l?u?s?d?u?s +?l?l?l?u?s?d?s?d +?l?l?l?u?s?d?s?l +?l?l?l?u?s?d?s?u +?l?l?l?u?s?d?s?s +?l?l?l?u?s?l?d?d +?l?l?l?u?s?l?d?l +?l?l?l?u?s?l?d?u +?l?l?l?u?s?l?d?s +?l?l?l?u?s?l?l?d +?l?l?l?u?s?l?u?d +?l?l?l?u?s?l?s?d +?l?l?l?u?s?u?d?d +?l?l?l?u?s?u?d?l +?l?l?l?u?s?u?d?u +?l?l?l?u?s?u?d?s +?l?l?l?u?s?u?l?d +?l?l?l?u?s?u?u?d +?l?l?l?u?s?u?s?d +?l?l?l?u?s?s?d?d +?l?l?l?u?s?s?d?l +?l?l?l?u?s?s?d?u +?l?l?l?u?s?s?d?s +?l?l?l?u?s?s?l?d +?l?l?l?u?s?s?u?d +?l?l?l?u?s?s?s?d +?l?l?l?s?d?d?d?u +?l?l?l?s?d?d?l?u +?l?l?l?s?d?d?u?d +?l?l?l?s?d?d?u?l +?l?l?l?s?d?d?u?u +?l?l?l?s?d?d?u?s +?l?l?l?s?d?d?s?u +?l?l?l?s?d?l?d?u +?l?l?l?s?d?l?l?u +?l?l?l?s?d?l?u?d +?l?l?l?s?d?l?u?l +?l?l?l?s?d?l?u?u +?l?l?l?s?d?l?u?s +?l?l?l?s?d?l?s?u +?l?l?l?s?d?u?d?d +?l?l?l?s?d?u?d?l +?l?l?l?s?d?u?d?u +?l?l?l?s?d?u?d?s +?l?l?l?s?d?u?l?d +?l?l?l?s?d?u?l?l +?l?l?l?s?d?u?l?u +?l?l?l?s?d?u?l?s +?l?l?l?s?d?u?u?d +?l?l?l?s?d?u?u?l +?l?l?l?s?d?u?u?u +?l?l?l?s?d?u?u?s +?l?l?l?s?d?u?s?d +?l?l?l?s?d?u?s?l +?l?l?l?s?d?u?s?u +?l?l?l?s?d?u?s?s +?l?l?l?s?d?s?d?u +?l?l?l?s?d?s?l?u +?l?l?l?s?d?s?u?d +?l?l?l?s?d?s?u?l +?l?l?l?s?d?s?u?u +?l?l?l?s?d?s?u?s +?l?l?l?s?d?s?s?u +?l?l?l?s?l?d?d?u +?l?l?l?s?l?d?l?u +?l?l?l?s?l?d?u?d +?l?l?l?s?l?d?u?l +?l?l?l?s?l?d?u?u +?l?l?l?s?l?d?u?s +?l?l?l?s?l?d?s?u +?l?l?l?s?l?l?d?u +?l?l?l?s?l?l?u?d +?l?l?l?s?l?u?d?d +?l?l?l?s?l?u?d?l +?l?l?l?s?l?u?d?u +?l?l?l?s?l?u?d?s +?l?l?l?s?l?u?l?d +?l?l?l?s?l?u?u?d +?l?l?l?s?l?u?s?d +?l?l?l?s?l?s?d?u +?l?l?l?s?l?s?u?d +?l?l?l?s?u?d?d?d +?l?l?l?s?u?d?d?l +?l?l?l?s?u?d?d?u +?l?l?l?s?u?d?d?s +?l?l?l?s?u?d?l?d +?l?l?l?s?u?d?l?l +?l?l?l?s?u?d?l?u +?l?l?l?s?u?d?l?s +?l?l?l?s?u?d?u?d +?l?l?l?s?u?d?u?l +?l?l?l?s?u?d?u?u +?l?l?l?s?u?d?u?s +?l?l?l?s?u?d?s?d +?l?l?l?s?u?d?s?l +?l?l?l?s?u?d?s?u +?l?l?l?s?u?d?s?s +?l?l?l?s?u?l?d?d +?l?l?l?s?u?l?d?l +?l?l?l?s?u?l?d?u +?l?l?l?s?u?l?d?s +?l?l?l?s?u?l?l?d +?l?l?l?s?u?l?u?d +?l?l?l?s?u?l?s?d +?l?l?l?s?u?u?d?d +?l?l?l?s?u?u?d?l +?l?l?l?s?u?u?d?u +?l?l?l?s?u?u?d?s +?l?l?l?s?u?u?l?d +?l?l?l?s?u?u?u?d +?l?l?l?s?u?u?s?d +?l?l?l?s?u?s?d?d +?l?l?l?s?u?s?d?l +?l?l?l?s?u?s?d?u +?l?l?l?s?u?s?d?s +?l?l?l?s?u?s?l?d +?l?l?l?s?u?s?u?d +?l?l?l?s?u?s?s?d +?l?l?l?s?s?d?d?u +?l?l?l?s?s?d?l?u +?l?l?l?s?s?d?u?d +?l?l?l?s?s?d?u?l +?l?l?l?s?s?d?u?u +?l?l?l?s?s?d?u?s +?l?l?l?s?s?d?s?u +?l?l?l?s?s?l?d?u +?l?l?l?s?s?l?u?d +?l?l?l?s?s?u?d?d +?l?l?l?s?s?u?d?l +?l?l?l?s?s?u?d?u +?l?l?l?s?s?u?d?s +?l?l?l?s?s?u?l?d +?l?l?l?s?s?u?u?d +?l?l?l?s?s?u?s?d +?l?l?l?s?s?s?d?u +?l?l?l?s?s?s?u?d +?l?l?u?d?d?d?d?s +?l?l?u?d?d?d?l?s +?l?l?u?d?d?d?u?s +?l?l?u?d?d?d?s?d +?l?l?u?d?d?d?s?l +?l?l?u?d?d?d?s?u +?l?l?u?d?d?d?s?s +?l?l?u?d?d?l?d?s +?l?l?u?d?d?l?l?s +?l?l?u?d?d?l?u?s +?l?l?u?d?d?l?s?d +?l?l?u?d?d?l?s?l +?l?l?u?d?d?l?s?u +?l?l?u?d?d?l?s?s +?l?l?u?d?d?u?d?s +?l?l?u?d?d?u?l?s +?l?l?u?d?d?u?u?s +?l?l?u?d?d?u?s?d +?l?l?u?d?d?u?s?l +?l?l?u?d?d?u?s?u +?l?l?u?d?d?u?s?s +?l?l?u?d?d?s?d?d +?l?l?u?d?d?s?d?l +?l?l?u?d?d?s?d?u +?l?l?u?d?d?s?d?s +?l?l?u?d?d?s?l?d +?l?l?u?d?d?s?l?l +?l?l?u?d?d?s?l?u +?l?l?u?d?d?s?l?s +?l?l?u?d?d?s?u?d +?l?l?u?d?d?s?u?l +?l?l?u?d?d?s?u?u +?l?l?u?d?d?s?u?s +?l?l?u?d?d?s?s?d +?l?l?u?d?d?s?s?l +?l?l?u?d?d?s?s?u +?l?l?u?d?d?s?s?s +?l?l?u?d?l?d?d?s +?l?l?u?d?l?d?l?s +?l?l?u?d?l?d?u?s +?l?l?u?d?l?d?s?d +?l?l?u?d?l?d?s?l +?l?l?u?d?l?d?s?u +?l?l?u?d?l?d?s?s +?l?l?u?d?l?l?d?s +?l?l?u?d?l?l?l?s +?l?l?u?d?l?l?u?s +?l?l?u?d?l?l?s?d +?l?l?u?d?l?l?s?l +?l?l?u?d?l?l?s?u +?l?l?u?d?l?l?s?s +?l?l?u?d?l?u?d?s +?l?l?u?d?l?u?l?s +?l?l?u?d?l?u?u?s +?l?l?u?d?l?u?s?d +?l?l?u?d?l?u?s?l +?l?l?u?d?l?u?s?u +?l?l?u?d?l?u?s?s +?l?l?u?d?l?s?d?d +?l?l?u?d?l?s?d?l +?l?l?u?d?l?s?d?u +?l?l?u?d?l?s?d?s +?l?l?u?d?l?s?l?d +?l?l?u?d?l?s?l?l +?l?l?u?d?l?s?l?u +?l?l?u?d?l?s?l?s +?l?l?u?d?l?s?u?d +?l?l?u?d?l?s?u?l +?l?l?u?d?l?s?u?u +?l?l?u?d?l?s?u?s +?l?l?u?d?l?s?s?d +?l?l?u?d?l?s?s?l +?l?l?u?d?l?s?s?u +?l?l?u?d?l?s?s?s +?l?l?u?d?u?d?d?s +?l?l?u?d?u?d?l?s +?l?l?u?d?u?d?u?s +?l?l?u?d?u?d?s?d +?l?l?u?d?u?d?s?l +?l?l?u?d?u?d?s?u +?l?l?u?d?u?d?s?s +?l?l?u?d?u?l?d?s +?l?l?u?d?u?l?l?s +?l?l?u?d?u?l?u?s +?l?l?u?d?u?l?s?d +?l?l?u?d?u?l?s?l +?l?l?u?d?u?l?s?u +?l?l?u?d?u?l?s?s +?l?l?u?d?u?u?d?s +?l?l?u?d?u?u?l?s +?l?l?u?d?u?u?u?s +?l?l?u?d?u?u?s?d +?l?l?u?d?u?u?s?l +?l?l?u?d?u?u?s?u +?l?l?u?d?u?u?s?s +?l?l?u?d?u?s?d?d +?l?l?u?d?u?s?d?l +?l?l?u?d?u?s?d?u +?l?l?u?d?u?s?d?s +?l?l?u?d?u?s?l?d +?l?l?u?d?u?s?l?l +?l?l?u?d?u?s?l?u +?l?l?u?d?u?s?l?s +?l?l?u?d?u?s?u?d +?l?l?u?d?u?s?u?l +?l?l?u?d?u?s?u?u +?l?l?u?d?u?s?u?s +?l?l?u?d?u?s?s?d +?l?l?u?d?u?s?s?l +?l?l?u?d?u?s?s?u +?l?l?u?d?u?s?s?s +?l?l?u?d?s?d?d?d +?l?l?u?d?s?d?d?l +?l?l?u?d?s?d?d?u +?l?l?u?d?s?d?d?s +?l?l?u?d?s?d?l?d +?l?l?u?d?s?d?l?l +?l?l?u?d?s?d?l?u +?l?l?u?d?s?d?l?s +?l?l?u?d?s?d?u?d +?l?l?u?d?s?d?u?l +?l?l?u?d?s?d?u?u +?l?l?u?d?s?d?u?s +?l?l?u?d?s?d?s?d +?l?l?u?d?s?d?s?l +?l?l?u?d?s?d?s?u +?l?l?u?d?s?d?s?s +?l?l?u?d?s?l?d?d +?l?l?u?d?s?l?d?l +?l?l?u?d?s?l?d?u +?l?l?u?d?s?l?d?s +?l?l?u?d?s?l?l?d +?l?l?u?d?s?l?l?l +?l?l?u?d?s?l?l?u +?l?l?u?d?s?l?l?s +?l?l?u?d?s?l?u?d +?l?l?u?d?s?l?u?l +?l?l?u?d?s?l?u?u +?l?l?u?d?s?l?u?s +?l?l?u?d?s?l?s?d +?l?l?u?d?s?l?s?l +?l?l?u?d?s?l?s?u +?l?l?u?d?s?l?s?s +?l?l?u?d?s?u?d?d +?l?l?u?d?s?u?d?l +?l?l?u?d?s?u?d?u +?l?l?u?d?s?u?d?s +?l?l?u?d?s?u?l?d +?l?l?u?d?s?u?l?l +?l?l?u?d?s?u?l?u +?l?l?u?d?s?u?l?s +?l?l?u?d?s?u?u?d +?l?l?u?d?s?u?u?l +?l?l?u?d?s?u?u?u +?l?l?u?d?s?u?u?s +?l?l?u?d?s?u?s?d +?l?l?u?d?s?u?s?l +?l?l?u?d?s?u?s?u +?l?l?u?d?s?u?s?s +?l?l?u?d?s?s?d?d +?l?l?u?d?s?s?d?l +?l?l?u?d?s?s?d?u +?l?l?u?d?s?s?d?s +?l?l?u?d?s?s?l?d +?l?l?u?d?s?s?l?l +?l?l?u?d?s?s?l?u +?l?l?u?d?s?s?l?s +?l?l?u?d?s?s?u?d +?l?l?u?d?s?s?u?l +?l?l?u?d?s?s?u?u +?l?l?u?d?s?s?u?s +?l?l?u?d?s?s?s?d +?l?l?u?d?s?s?s?l +?l?l?u?d?s?s?s?u +?l?l?u?d?s?s?s?s +?l?l?u?l?d?d?d?s +?l?l?u?l?d?d?l?s +?l?l?u?l?d?d?u?s +?l?l?u?l?d?d?s?d +?l?l?u?l?d?d?s?l +?l?l?u?l?d?d?s?u +?l?l?u?l?d?d?s?s +?l?l?u?l?d?l?d?s +?l?l?u?l?d?l?l?s +?l?l?u?l?d?l?u?s +?l?l?u?l?d?l?s?d +?l?l?u?l?d?l?s?l +?l?l?u?l?d?l?s?u +?l?l?u?l?d?l?s?s +?l?l?u?l?d?u?d?s +?l?l?u?l?d?u?l?s +?l?l?u?l?d?u?u?s +?l?l?u?l?d?u?s?d +?l?l?u?l?d?u?s?l +?l?l?u?l?d?u?s?u +?l?l?u?l?d?u?s?s +?l?l?u?l?d?s?d?d +?l?l?u?l?d?s?d?l +?l?l?u?l?d?s?d?u +?l?l?u?l?d?s?d?s +?l?l?u?l?d?s?l?d +?l?l?u?l?d?s?l?l +?l?l?u?l?d?s?l?u +?l?l?u?l?d?s?l?s +?l?l?u?l?d?s?u?d +?l?l?u?l?d?s?u?l +?l?l?u?l?d?s?u?u +?l?l?u?l?d?s?u?s +?l?l?u?l?d?s?s?d +?l?l?u?l?d?s?s?l +?l?l?u?l?d?s?s?u +?l?l?u?l?d?s?s?s +?l?l?u?l?l?d?d?s +?l?l?u?l?l?d?l?s +?l?l?u?l?l?d?u?s +?l?l?u?l?l?d?s?d +?l?l?u?l?l?d?s?l +?l?l?u?l?l?d?s?u +?l?l?u?l?l?d?s?s +?l?l?u?l?l?l?d?s +?l?l?u?l?l?l?s?d +?l?l?u?l?l?u?d?s +?l?l?u?l?l?u?s?d +?l?l?u?l?l?s?d?d +?l?l?u?l?l?s?d?l +?l?l?u?l?l?s?d?u +?l?l?u?l?l?s?d?s +?l?l?u?l?l?s?l?d +?l?l?u?l?l?s?u?d +?l?l?u?l?l?s?s?d +?l?l?u?l?u?d?d?s +?l?l?u?l?u?d?l?s +?l?l?u?l?u?d?u?s +?l?l?u?l?u?d?s?d +?l?l?u?l?u?d?s?l +?l?l?u?l?u?d?s?u +?l?l?u?l?u?d?s?s +?l?l?u?l?u?l?d?s +?l?l?u?l?u?l?s?d +?l?l?u?l?u?u?d?s +?l?l?u?l?u?u?s?d +?l?l?u?l?u?s?d?d +?l?l?u?l?u?s?d?l +?l?l?u?l?u?s?d?u +?l?l?u?l?u?s?d?s +?l?l?u?l?u?s?l?d +?l?l?u?l?u?s?u?d +?l?l?u?l?u?s?s?d +?l?l?u?l?s?d?d?d +?l?l?u?l?s?d?d?l +?l?l?u?l?s?d?d?u +?l?l?u?l?s?d?d?s +?l?l?u?l?s?d?l?d +?l?l?u?l?s?d?l?l +?l?l?u?l?s?d?l?u +?l?l?u?l?s?d?l?s +?l?l?u?l?s?d?u?d +?l?l?u?l?s?d?u?l +?l?l?u?l?s?d?u?u +?l?l?u?l?s?d?u?s +?l?l?u?l?s?d?s?d +?l?l?u?l?s?d?s?l +?l?l?u?l?s?d?s?u +?l?l?u?l?s?d?s?s +?l?l?u?l?s?l?d?d +?l?l?u?l?s?l?d?l +?l?l?u?l?s?l?d?u +?l?l?u?l?s?l?d?s +?l?l?u?l?s?l?l?d +?l?l?u?l?s?l?u?d +?l?l?u?l?s?l?s?d +?l?l?u?l?s?u?d?d +?l?l?u?l?s?u?d?l +?l?l?u?l?s?u?d?u +?l?l?u?l?s?u?d?s +?l?l?u?l?s?u?l?d +?l?l?u?l?s?u?u?d +?l?l?u?l?s?u?s?d +?l?l?u?l?s?s?d?d +?l?l?u?l?s?s?d?l +?l?l?u?l?s?s?d?u +?l?l?u?l?s?s?d?s +?l?l?u?l?s?s?l?d +?l?l?u?l?s?s?u?d +?l?l?u?l?s?s?s?d +?l?l?u?u?d?d?d?s +?l?l?u?u?d?d?l?s +?l?l?u?u?d?d?u?s +?l?l?u?u?d?d?s?d +?l?l?u?u?d?d?s?l +?l?l?u?u?d?d?s?u +?l?l?u?u?d?d?s?s +?l?l?u?u?d?l?d?s +?l?l?u?u?d?l?l?s +?l?l?u?u?d?l?u?s +?l?l?u?u?d?l?s?d +?l?l?u?u?d?l?s?l +?l?l?u?u?d?l?s?u +?l?l?u?u?d?l?s?s +?l?l?u?u?d?u?d?s +?l?l?u?u?d?u?l?s +?l?l?u?u?d?u?u?s +?l?l?u?u?d?u?s?d +?l?l?u?u?d?u?s?l +?l?l?u?u?d?u?s?u +?l?l?u?u?d?u?s?s +?l?l?u?u?d?s?d?d +?l?l?u?u?d?s?d?l +?l?l?u?u?d?s?d?u +?l?l?u?u?d?s?d?s +?l?l?u?u?d?s?l?d +?l?l?u?u?d?s?l?l +?l?l?u?u?d?s?l?u +?l?l?u?u?d?s?l?s +?l?l?u?u?d?s?u?d +?l?l?u?u?d?s?u?l +?l?l?u?u?d?s?u?u +?l?l?u?u?d?s?u?s +?l?l?u?u?d?s?s?d +?l?l?u?u?d?s?s?l +?l?l?u?u?d?s?s?u +?l?l?u?u?d?s?s?s +?l?l?u?u?l?d?d?s +?l?l?u?u?l?d?l?s +?l?l?u?u?l?d?u?s +?l?l?u?u?l?d?s?d +?l?l?u?u?l?d?s?l +?l?l?u?u?l?d?s?u +?l?l?u?u?l?d?s?s +?l?l?u?u?l?l?d?s +?l?l?u?u?l?l?s?d +?l?l?u?u?l?u?d?s +?l?l?u?u?l?u?s?d +?l?l?u?u?l?s?d?d +?l?l?u?u?l?s?d?l +?l?l?u?u?l?s?d?u +?l?l?u?u?l?s?d?s +?l?l?u?u?l?s?l?d +?l?l?u?u?l?s?u?d +?l?l?u?u?l?s?s?d +?l?l?u?u?u?d?d?s +?l?l?u?u?u?d?l?s +?l?l?u?u?u?d?u?s +?l?l?u?u?u?d?s?d +?l?l?u?u?u?d?s?l +?l?l?u?u?u?d?s?u +?l?l?u?u?u?d?s?s +?l?l?u?u?u?l?d?s +?l?l?u?u?u?l?s?d +?l?l?u?u?u?u?d?s +?l?l?u?u?u?u?s?d +?l?l?u?u?u?s?d?d +?l?l?u?u?u?s?d?l +?l?l?u?u?u?s?d?u +?l?l?u?u?u?s?d?s +?l?l?u?u?u?s?l?d +?l?l?u?u?u?s?u?d +?l?l?u?u?u?s?s?d +?l?l?u?u?s?d?d?d +?l?l?u?u?s?d?d?l +?l?l?u?u?s?d?d?u +?l?l?u?u?s?d?d?s +?l?l?u?u?s?d?l?d +?l?l?u?u?s?d?l?l +?l?l?u?u?s?d?l?u +?l?l?u?u?s?d?l?s +?l?l?u?u?s?d?u?d +?l?l?u?u?s?d?u?l +?l?l?u?u?s?d?u?u +?l?l?u?u?s?d?u?s +?l?l?u?u?s?d?s?d +?l?l?u?u?s?d?s?l +?l?l?u?u?s?d?s?u +?l?l?u?u?s?d?s?s +?l?l?u?u?s?l?d?d +?l?l?u?u?s?l?d?l +?l?l?u?u?s?l?d?u +?l?l?u?u?s?l?d?s +?l?l?u?u?s?l?l?d +?l?l?u?u?s?l?u?d +?l?l?u?u?s?l?s?d +?l?l?u?u?s?u?d?d +?l?l?u?u?s?u?d?l +?l?l?u?u?s?u?d?u +?l?l?u?u?s?u?d?s +?l?l?u?u?s?u?l?d +?l?l?u?u?s?u?u?d +?l?l?u?u?s?u?s?d +?l?l?u?u?s?s?d?d +?l?l?u?u?s?s?d?l +?l?l?u?u?s?s?d?u +?l?l?u?u?s?s?d?s +?l?l?u?u?s?s?l?d +?l?l?u?u?s?s?u?d +?l?l?u?u?s?s?s?d +?l?l?u?s?d?d?d?d +?l?l?u?s?d?d?d?l +?l?l?u?s?d?d?d?u +?l?l?u?s?d?d?d?s +?l?l?u?s?d?d?l?d +?l?l?u?s?d?d?l?l +?l?l?u?s?d?d?l?u +?l?l?u?s?d?d?l?s +?l?l?u?s?d?d?u?d +?l?l?u?s?d?d?u?l +?l?l?u?s?d?d?u?u +?l?l?u?s?d?d?u?s +?l?l?u?s?d?d?s?d +?l?l?u?s?d?d?s?l +?l?l?u?s?d?d?s?u +?l?l?u?s?d?d?s?s +?l?l?u?s?d?l?d?d +?l?l?u?s?d?l?d?l +?l?l?u?s?d?l?d?u +?l?l?u?s?d?l?d?s +?l?l?u?s?d?l?l?d +?l?l?u?s?d?l?l?l +?l?l?u?s?d?l?l?u +?l?l?u?s?d?l?l?s +?l?l?u?s?d?l?u?d +?l?l?u?s?d?l?u?l +?l?l?u?s?d?l?u?u +?l?l?u?s?d?l?u?s +?l?l?u?s?d?l?s?d +?l?l?u?s?d?l?s?l +?l?l?u?s?d?l?s?u +?l?l?u?s?d?l?s?s +?l?l?u?s?d?u?d?d +?l?l?u?s?d?u?d?l +?l?l?u?s?d?u?d?u +?l?l?u?s?d?u?d?s +?l?l?u?s?d?u?l?d +?l?l?u?s?d?u?l?l +?l?l?u?s?d?u?l?u +?l?l?u?s?d?u?l?s +?l?l?u?s?d?u?u?d +?l?l?u?s?d?u?u?l +?l?l?u?s?d?u?u?u +?l?l?u?s?d?u?u?s +?l?l?u?s?d?u?s?d +?l?l?u?s?d?u?s?l +?l?l?u?s?d?u?s?u +?l?l?u?s?d?u?s?s +?l?l?u?s?d?s?d?d +?l?l?u?s?d?s?d?l +?l?l?u?s?d?s?d?u +?l?l?u?s?d?s?d?s +?l?l?u?s?d?s?l?d +?l?l?u?s?d?s?l?l +?l?l?u?s?d?s?l?u +?l?l?u?s?d?s?l?s +?l?l?u?s?d?s?u?d +?l?l?u?s?d?s?u?l +?l?l?u?s?d?s?u?u +?l?l?u?s?d?s?u?s +?l?l?u?s?d?s?s?d +?l?l?u?s?d?s?s?l +?l?l?u?s?d?s?s?u +?l?l?u?s?d?s?s?s +?l?l?u?s?l?d?d?d +?l?l?u?s?l?d?d?l +?l?l?u?s?l?d?d?u +?l?l?u?s?l?d?d?s +?l?l?u?s?l?d?l?d +?l?l?u?s?l?d?l?l +?l?l?u?s?l?d?l?u +?l?l?u?s?l?d?l?s +?l?l?u?s?l?d?u?d +?l?l?u?s?l?d?u?l +?l?l?u?s?l?d?u?u +?l?l?u?s?l?d?u?s +?l?l?u?s?l?d?s?d +?l?l?u?s?l?d?s?l +?l?l?u?s?l?d?s?u +?l?l?u?s?l?d?s?s +?l?l?u?s?l?l?d?d +?l?l?u?s?l?l?d?l +?l?l?u?s?l?l?d?u +?l?l?u?s?l?l?d?s +?l?l?u?s?l?l?l?d +?l?l?u?s?l?l?u?d +?l?l?u?s?l?l?s?d +?l?l?u?s?l?u?d?d +?l?l?u?s?l?u?d?l +?l?l?u?s?l?u?d?u +?l?l?u?s?l?u?d?s +?l?l?u?s?l?u?l?d +?l?l?u?s?l?u?u?d +?l?l?u?s?l?u?s?d +?l?l?u?s?l?s?d?d +?l?l?u?s?l?s?d?l +?l?l?u?s?l?s?d?u +?l?l?u?s?l?s?d?s +?l?l?u?s?l?s?l?d +?l?l?u?s?l?s?u?d +?l?l?u?s?l?s?s?d +?l?l?u?s?u?d?d?d +?l?l?u?s?u?d?d?l +?l?l?u?s?u?d?d?u +?l?l?u?s?u?d?d?s +?l?l?u?s?u?d?l?d +?l?l?u?s?u?d?l?l +?l?l?u?s?u?d?l?u +?l?l?u?s?u?d?l?s +?l?l?u?s?u?d?u?d +?l?l?u?s?u?d?u?l +?l?l?u?s?u?d?u?u +?l?l?u?s?u?d?u?s +?l?l?u?s?u?d?s?d +?l?l?u?s?u?d?s?l +?l?l?u?s?u?d?s?u +?l?l?u?s?u?d?s?s +?l?l?u?s?u?l?d?d +?l?l?u?s?u?l?d?l +?l?l?u?s?u?l?d?u +?l?l?u?s?u?l?d?s +?l?l?u?s?u?l?l?d +?l?l?u?s?u?l?u?d +?l?l?u?s?u?l?s?d +?l?l?u?s?u?u?d?d +?l?l?u?s?u?u?d?l +?l?l?u?s?u?u?d?u +?l?l?u?s?u?u?d?s +?l?l?u?s?u?u?l?d +?l?l?u?s?u?u?u?d +?l?l?u?s?u?u?s?d +?l?l?u?s?u?s?d?d +?l?l?u?s?u?s?d?l +?l?l?u?s?u?s?d?u +?l?l?u?s?u?s?d?s +?l?l?u?s?u?s?l?d +?l?l?u?s?u?s?u?d +?l?l?u?s?u?s?s?d +?l?l?u?s?s?d?d?d +?l?l?u?s?s?d?d?l +?l?l?u?s?s?d?d?u +?l?l?u?s?s?d?d?s +?l?l?u?s?s?d?l?d +?l?l?u?s?s?d?l?l +?l?l?u?s?s?d?l?u +?l?l?u?s?s?d?l?s +?l?l?u?s?s?d?u?d +?l?l?u?s?s?d?u?l +?l?l?u?s?s?d?u?u +?l?l?u?s?s?d?u?s +?l?l?u?s?s?d?s?d +?l?l?u?s?s?d?s?l +?l?l?u?s?s?d?s?u +?l?l?u?s?s?d?s?s +?l?l?u?s?s?l?d?d +?l?l?u?s?s?l?d?l +?l?l?u?s?s?l?d?u +?l?l?u?s?s?l?d?s +?l?l?u?s?s?l?l?d +?l?l?u?s?s?l?u?d +?l?l?u?s?s?l?s?d +?l?l?u?s?s?u?d?d +?l?l?u?s?s?u?d?l +?l?l?u?s?s?u?d?u +?l?l?u?s?s?u?d?s +?l?l?u?s?s?u?l?d +?l?l?u?s?s?u?u?d +?l?l?u?s?s?u?s?d +?l?l?u?s?s?s?d?d +?l?l?u?s?s?s?d?l +?l?l?u?s?s?s?d?u +?l?l?u?s?s?s?d?s +?l?l?u?s?s?s?l?d +?l?l?u?s?s?s?u?d +?l?l?u?s?s?s?s?d +?l?l?s?d?d?d?d?u +?l?l?s?d?d?d?l?u +?l?l?s?d?d?d?u?d +?l?l?s?d?d?d?u?l +?l?l?s?d?d?d?u?u +?l?l?s?d?d?d?u?s +?l?l?s?d?d?d?s?u +?l?l?s?d?d?l?d?u +?l?l?s?d?d?l?l?u +?l?l?s?d?d?l?u?d +?l?l?s?d?d?l?u?l +?l?l?s?d?d?l?u?u +?l?l?s?d?d?l?u?s +?l?l?s?d?d?l?s?u +?l?l?s?d?d?u?d?d +?l?l?s?d?d?u?d?l +?l?l?s?d?d?u?d?u +?l?l?s?d?d?u?d?s +?l?l?s?d?d?u?l?d +?l?l?s?d?d?u?l?l +?l?l?s?d?d?u?l?u +?l?l?s?d?d?u?l?s +?l?l?s?d?d?u?u?d +?l?l?s?d?d?u?u?l +?l?l?s?d?d?u?u?u +?l?l?s?d?d?u?u?s +?l?l?s?d?d?u?s?d +?l?l?s?d?d?u?s?l +?l?l?s?d?d?u?s?u +?l?l?s?d?d?u?s?s +?l?l?s?d?d?s?d?u +?l?l?s?d?d?s?l?u +?l?l?s?d?d?s?u?d +?l?l?s?d?d?s?u?l +?l?l?s?d?d?s?u?u +?l?l?s?d?d?s?u?s +?l?l?s?d?d?s?s?u +?l?l?s?d?l?d?d?u +?l?l?s?d?l?d?l?u +?l?l?s?d?l?d?u?d +?l?l?s?d?l?d?u?l +?l?l?s?d?l?d?u?u +?l?l?s?d?l?d?u?s +?l?l?s?d?l?d?s?u +?l?l?s?d?l?l?d?u +?l?l?s?d?l?l?l?u +?l?l?s?d?l?l?u?d +?l?l?s?d?l?l?u?l +?l?l?s?d?l?l?u?u +?l?l?s?d?l?l?u?s +?l?l?s?d?l?l?s?u +?l?l?s?d?l?u?d?d +?l?l?s?d?l?u?d?l +?l?l?s?d?l?u?d?u +?l?l?s?d?l?u?d?s +?l?l?s?d?l?u?l?d +?l?l?s?d?l?u?l?l +?l?l?s?d?l?u?l?u +?l?l?s?d?l?u?l?s +?l?l?s?d?l?u?u?d +?l?l?s?d?l?u?u?l +?l?l?s?d?l?u?u?u +?l?l?s?d?l?u?u?s +?l?l?s?d?l?u?s?d +?l?l?s?d?l?u?s?l +?l?l?s?d?l?u?s?u +?l?l?s?d?l?u?s?s +?l?l?s?d?l?s?d?u +?l?l?s?d?l?s?l?u +?l?l?s?d?l?s?u?d +?l?l?s?d?l?s?u?l +?l?l?s?d?l?s?u?u +?l?l?s?d?l?s?u?s +?l?l?s?d?l?s?s?u +?l?l?s?d?u?d?d?d +?l?l?s?d?u?d?d?l +?l?l?s?d?u?d?d?u +?l?l?s?d?u?d?d?s +?l?l?s?d?u?d?l?d +?l?l?s?d?u?d?l?l +?l?l?s?d?u?d?l?u +?l?l?s?d?u?d?l?s +?l?l?s?d?u?d?u?d +?l?l?s?d?u?d?u?l +?l?l?s?d?u?d?u?u +?l?l?s?d?u?d?u?s +?l?l?s?d?u?d?s?d +?l?l?s?d?u?d?s?l +?l?l?s?d?u?d?s?u +?l?l?s?d?u?d?s?s +?l?l?s?d?u?l?d?d +?l?l?s?d?u?l?d?l +?l?l?s?d?u?l?d?u +?l?l?s?d?u?l?d?s +?l?l?s?d?u?l?l?d +?l?l?s?d?u?l?l?l +?l?l?s?d?u?l?l?u +?l?l?s?d?u?l?l?s +?l?l?s?d?u?l?u?d +?l?l?s?d?u?l?u?l +?l?l?s?d?u?l?u?u +?l?l?s?d?u?l?u?s +?l?l?s?d?u?l?s?d +?l?l?s?d?u?l?s?l +?l?l?s?d?u?l?s?u +?l?l?s?d?u?l?s?s +?l?l?s?d?u?u?d?d +?l?l?s?d?u?u?d?l +?l?l?s?d?u?u?d?u +?l?l?s?d?u?u?d?s +?l?l?s?d?u?u?l?d +?l?l?s?d?u?u?l?l +?l?l?s?d?u?u?l?u +?l?l?s?d?u?u?l?s +?l?l?s?d?u?u?u?d +?l?l?s?d?u?u?u?l +?l?l?s?d?u?u?u?u +?l?l?s?d?u?u?u?s +?l?l?s?d?u?u?s?d +?l?l?s?d?u?u?s?l +?l?l?s?d?u?u?s?u +?l?l?s?d?u?u?s?s +?l?l?s?d?u?s?d?d +?l?l?s?d?u?s?d?l +?l?l?s?d?u?s?d?u +?l?l?s?d?u?s?d?s +?l?l?s?d?u?s?l?d +?l?l?s?d?u?s?l?l +?l?l?s?d?u?s?l?u +?l?l?s?d?u?s?l?s +?l?l?s?d?u?s?u?d +?l?l?s?d?u?s?u?l +?l?l?s?d?u?s?u?u +?l?l?s?d?u?s?u?s +?l?l?s?d?u?s?s?d +?l?l?s?d?u?s?s?l +?l?l?s?d?u?s?s?u +?l?l?s?d?u?s?s?s +?l?l?s?d?s?d?d?u +?l?l?s?d?s?d?l?u +?l?l?s?d?s?d?u?d +?l?l?s?d?s?d?u?l +?l?l?s?d?s?d?u?u +?l?l?s?d?s?d?u?s +?l?l?s?d?s?d?s?u +?l?l?s?d?s?l?d?u +?l?l?s?d?s?l?l?u +?l?l?s?d?s?l?u?d +?l?l?s?d?s?l?u?l +?l?l?s?d?s?l?u?u +?l?l?s?d?s?l?u?s +?l?l?s?d?s?l?s?u +?l?l?s?d?s?u?d?d +?l?l?s?d?s?u?d?l +?l?l?s?d?s?u?d?u +?l?l?s?d?s?u?d?s +?l?l?s?d?s?u?l?d +?l?l?s?d?s?u?l?l +?l?l?s?d?s?u?l?u +?l?l?s?d?s?u?l?s +?l?l?s?d?s?u?u?d +?l?l?s?d?s?u?u?l +?l?l?s?d?s?u?u?u +?l?l?s?d?s?u?u?s +?l?l?s?d?s?u?s?d +?l?l?s?d?s?u?s?l +?l?l?s?d?s?u?s?u +?l?l?s?d?s?u?s?s +?l?l?s?d?s?s?d?u +?l?l?s?d?s?s?l?u +?l?l?s?d?s?s?u?d +?l?l?s?d?s?s?u?l +?l?l?s?d?s?s?u?u +?l?l?s?d?s?s?u?s +?l?l?s?d?s?s?s?u +?l?l?s?l?d?d?d?u +?l?l?s?l?d?d?l?u +?l?l?s?l?d?d?u?d +?l?l?s?l?d?d?u?l +?l?l?s?l?d?d?u?u +?l?l?s?l?d?d?u?s +?l?l?s?l?d?d?s?u +?l?l?s?l?d?l?d?u +?l?l?s?l?d?l?l?u +?l?l?s?l?d?l?u?d +?l?l?s?l?d?l?u?l +?l?l?s?l?d?l?u?u +?l?l?s?l?d?l?u?s +?l?l?s?l?d?l?s?u +?l?l?s?l?d?u?d?d +?l?l?s?l?d?u?d?l +?l?l?s?l?d?u?d?u +?l?l?s?l?d?u?d?s +?l?l?s?l?d?u?l?d +?l?l?s?l?d?u?l?l +?l?l?s?l?d?u?l?u +?l?l?s?l?d?u?l?s +?l?l?s?l?d?u?u?d +?l?l?s?l?d?u?u?l +?l?l?s?l?d?u?u?u +?l?l?s?l?d?u?u?s +?l?l?s?l?d?u?s?d +?l?l?s?l?d?u?s?l +?l?l?s?l?d?u?s?u +?l?l?s?l?d?u?s?s +?l?l?s?l?d?s?d?u +?l?l?s?l?d?s?l?u +?l?l?s?l?d?s?u?d +?l?l?s?l?d?s?u?l +?l?l?s?l?d?s?u?u +?l?l?s?l?d?s?u?s +?l?l?s?l?d?s?s?u +?l?l?s?l?l?d?d?u +?l?l?s?l?l?d?l?u +?l?l?s?l?l?d?u?d +?l?l?s?l?l?d?u?l +?l?l?s?l?l?d?u?u +?l?l?s?l?l?d?u?s +?l?l?s?l?l?d?s?u +?l?l?s?l?l?l?d?u +?l?l?s?l?l?l?u?d +?l?l?s?l?l?u?d?d +?l?l?s?l?l?u?d?l +?l?l?s?l?l?u?d?u +?l?l?s?l?l?u?d?s +?l?l?s?l?l?u?l?d +?l?l?s?l?l?u?u?d +?l?l?s?l?l?u?s?d +?l?l?s?l?l?s?d?u +?l?l?s?l?l?s?u?d +?l?l?s?l?u?d?d?d +?l?l?s?l?u?d?d?l +?l?l?s?l?u?d?d?u +?l?l?s?l?u?d?d?s +?l?l?s?l?u?d?l?d +?l?l?s?l?u?d?l?l +?l?l?s?l?u?d?l?u +?l?l?s?l?u?d?l?s +?l?l?s?l?u?d?u?d +?l?l?s?l?u?d?u?l +?l?l?s?l?u?d?u?u +?l?l?s?l?u?d?u?s +?l?l?s?l?u?d?s?d +?l?l?s?l?u?d?s?l +?l?l?s?l?u?d?s?u +?l?l?s?l?u?d?s?s +?l?l?s?l?u?l?d?d +?l?l?s?l?u?l?d?l +?l?l?s?l?u?l?d?u +?l?l?s?l?u?l?d?s +?l?l?s?l?u?l?l?d +?l?l?s?l?u?l?u?d +?l?l?s?l?u?l?s?d +?l?l?s?l?u?u?d?d +?l?l?s?l?u?u?d?l +?l?l?s?l?u?u?d?u +?l?l?s?l?u?u?d?s +?l?l?s?l?u?u?l?d +?l?l?s?l?u?u?u?d +?l?l?s?l?u?u?s?d +?l?l?s?l?u?s?d?d +?l?l?s?l?u?s?d?l +?l?l?s?l?u?s?d?u +?l?l?s?l?u?s?d?s +?l?l?s?l?u?s?l?d +?l?l?s?l?u?s?u?d +?l?l?s?l?u?s?s?d +?l?l?s?l?s?d?d?u +?l?l?s?l?s?d?l?u +?l?l?s?l?s?d?u?d +?l?l?s?l?s?d?u?l +?l?l?s?l?s?d?u?u +?l?l?s?l?s?d?u?s +?l?l?s?l?s?d?s?u +?l?l?s?l?s?l?d?u +?l?l?s?l?s?l?u?d +?l?l?s?l?s?u?d?d +?l?l?s?l?s?u?d?l +?l?l?s?l?s?u?d?u +?l?l?s?l?s?u?d?s +?l?l?s?l?s?u?l?d +?l?l?s?l?s?u?u?d +?l?l?s?l?s?u?s?d +?l?l?s?l?s?s?d?u +?l?l?s?l?s?s?u?d +?l?l?s?u?d?d?d?d +?l?l?s?u?d?d?d?l +?l?l?s?u?d?d?d?u +?l?l?s?u?d?d?d?s +?l?l?s?u?d?d?l?d +?l?l?s?u?d?d?l?l +?l?l?s?u?d?d?l?u +?l?l?s?u?d?d?l?s +?l?l?s?u?d?d?u?d +?l?l?s?u?d?d?u?l +?l?l?s?u?d?d?u?u +?l?l?s?u?d?d?u?s +?l?l?s?u?d?d?s?d +?l?l?s?u?d?d?s?l +?l?l?s?u?d?d?s?u +?l?l?s?u?d?d?s?s +?l?l?s?u?d?l?d?d +?l?l?s?u?d?l?d?l +?l?l?s?u?d?l?d?u +?l?l?s?u?d?l?d?s +?l?l?s?u?d?l?l?d +?l?l?s?u?d?l?l?l +?l?l?s?u?d?l?l?u +?l?l?s?u?d?l?l?s +?l?l?s?u?d?l?u?d +?l?l?s?u?d?l?u?l +?l?l?s?u?d?l?u?u +?l?l?s?u?d?l?u?s +?l?l?s?u?d?l?s?d +?l?l?s?u?d?l?s?l +?l?l?s?u?d?l?s?u +?l?l?s?u?d?l?s?s +?l?l?s?u?d?u?d?d +?l?l?s?u?d?u?d?l +?l?l?s?u?d?u?d?u +?l?l?s?u?d?u?d?s +?l?l?s?u?d?u?l?d +?l?l?s?u?d?u?l?l +?l?l?s?u?d?u?l?u +?l?l?s?u?d?u?l?s +?l?l?s?u?d?u?u?d +?l?l?s?u?d?u?u?l +?l?l?s?u?d?u?u?u +?l?l?s?u?d?u?u?s +?l?l?s?u?d?u?s?d +?l?l?s?u?d?u?s?l +?l?l?s?u?d?u?s?u +?l?l?s?u?d?u?s?s +?l?l?s?u?d?s?d?d +?l?l?s?u?d?s?d?l +?l?l?s?u?d?s?d?u +?l?l?s?u?d?s?d?s +?l?l?s?u?d?s?l?d +?l?l?s?u?d?s?l?l +?l?l?s?u?d?s?l?u +?l?l?s?u?d?s?l?s +?l?l?s?u?d?s?u?d +?l?l?s?u?d?s?u?l +?l?l?s?u?d?s?u?u +?l?l?s?u?d?s?u?s +?l?l?s?u?d?s?s?d +?l?l?s?u?d?s?s?l +?l?l?s?u?d?s?s?u +?l?l?s?u?d?s?s?s +?l?l?s?u?l?d?d?d +?l?l?s?u?l?d?d?l +?l?l?s?u?l?d?d?u +?l?l?s?u?l?d?d?s +?l?l?s?u?l?d?l?d +?l?l?s?u?l?d?l?l +?l?l?s?u?l?d?l?u +?l?l?s?u?l?d?l?s +?l?l?s?u?l?d?u?d +?l?l?s?u?l?d?u?l +?l?l?s?u?l?d?u?u +?l?l?s?u?l?d?u?s +?l?l?s?u?l?d?s?d +?l?l?s?u?l?d?s?l +?l?l?s?u?l?d?s?u +?l?l?s?u?l?d?s?s +?l?l?s?u?l?l?d?d +?l?l?s?u?l?l?d?l +?l?l?s?u?l?l?d?u +?l?l?s?u?l?l?d?s +?l?l?s?u?l?l?l?d +?l?l?s?u?l?l?u?d +?l?l?s?u?l?l?s?d +?l?l?s?u?l?u?d?d +?l?l?s?u?l?u?d?l +?l?l?s?u?l?u?d?u +?l?l?s?u?l?u?d?s +?l?l?s?u?l?u?l?d +?l?l?s?u?l?u?u?d +?l?l?s?u?l?u?s?d +?l?l?s?u?l?s?d?d +?l?l?s?u?l?s?d?l +?l?l?s?u?l?s?d?u +?l?l?s?u?l?s?d?s +?l?l?s?u?l?s?l?d +?l?l?s?u?l?s?u?d +?l?l?s?u?l?s?s?d +?l?l?s?u?u?d?d?d +?l?l?s?u?u?d?d?l +?l?l?s?u?u?d?d?u +?l?l?s?u?u?d?d?s +?l?l?s?u?u?d?l?d +?l?l?s?u?u?d?l?l +?l?l?s?u?u?d?l?u +?l?l?s?u?u?d?l?s +?l?l?s?u?u?d?u?d +?l?l?s?u?u?d?u?l +?l?l?s?u?u?d?u?u +?l?l?s?u?u?d?u?s +?l?l?s?u?u?d?s?d +?l?l?s?u?u?d?s?l +?l?l?s?u?u?d?s?u +?l?l?s?u?u?d?s?s +?l?l?s?u?u?l?d?d +?l?l?s?u?u?l?d?l +?l?l?s?u?u?l?d?u +?l?l?s?u?u?l?d?s +?l?l?s?u?u?l?l?d +?l?l?s?u?u?l?u?d +?l?l?s?u?u?l?s?d +?l?l?s?u?u?u?d?d +?l?l?s?u?u?u?d?l +?l?l?s?u?u?u?d?u +?l?l?s?u?u?u?d?s +?l?l?s?u?u?u?l?d +?l?l?s?u?u?u?u?d +?l?l?s?u?u?u?s?d +?l?l?s?u?u?s?d?d +?l?l?s?u?u?s?d?l +?l?l?s?u?u?s?d?u +?l?l?s?u?u?s?d?s +?l?l?s?u?u?s?l?d +?l?l?s?u?u?s?u?d +?l?l?s?u?u?s?s?d +?l?l?s?u?s?d?d?d +?l?l?s?u?s?d?d?l +?l?l?s?u?s?d?d?u +?l?l?s?u?s?d?d?s +?l?l?s?u?s?d?l?d +?l?l?s?u?s?d?l?l +?l?l?s?u?s?d?l?u +?l?l?s?u?s?d?l?s +?l?l?s?u?s?d?u?d +?l?l?s?u?s?d?u?l +?l?l?s?u?s?d?u?u +?l?l?s?u?s?d?u?s +?l?l?s?u?s?d?s?d +?l?l?s?u?s?d?s?l +?l?l?s?u?s?d?s?u +?l?l?s?u?s?d?s?s +?l?l?s?u?s?l?d?d +?l?l?s?u?s?l?d?l +?l?l?s?u?s?l?d?u +?l?l?s?u?s?l?d?s +?l?l?s?u?s?l?l?d +?l?l?s?u?s?l?u?d +?l?l?s?u?s?l?s?d +?l?l?s?u?s?u?d?d +?l?l?s?u?s?u?d?l +?l?l?s?u?s?u?d?u +?l?l?s?u?s?u?d?s +?l?l?s?u?s?u?l?d +?l?l?s?u?s?u?u?d +?l?l?s?u?s?u?s?d +?l?l?s?u?s?s?d?d +?l?l?s?u?s?s?d?l +?l?l?s?u?s?s?d?u +?l?l?s?u?s?s?d?s +?l?l?s?u?s?s?l?d +?l?l?s?u?s?s?u?d +?l?l?s?u?s?s?s?d +?l?l?s?s?d?d?d?u +?l?l?s?s?d?d?l?u +?l?l?s?s?d?d?u?d +?l?l?s?s?d?d?u?l +?l?l?s?s?d?d?u?u +?l?l?s?s?d?d?u?s +?l?l?s?s?d?d?s?u +?l?l?s?s?d?l?d?u +?l?l?s?s?d?l?l?u +?l?l?s?s?d?l?u?d +?l?l?s?s?d?l?u?l +?l?l?s?s?d?l?u?u +?l?l?s?s?d?l?u?s +?l?l?s?s?d?l?s?u +?l?l?s?s?d?u?d?d +?l?l?s?s?d?u?d?l +?l?l?s?s?d?u?d?u +?l?l?s?s?d?u?d?s +?l?l?s?s?d?u?l?d +?l?l?s?s?d?u?l?l +?l?l?s?s?d?u?l?u +?l?l?s?s?d?u?l?s +?l?l?s?s?d?u?u?d +?l?l?s?s?d?u?u?l +?l?l?s?s?d?u?u?u +?l?l?s?s?d?u?u?s +?l?l?s?s?d?u?s?d +?l?l?s?s?d?u?s?l +?l?l?s?s?d?u?s?u +?l?l?s?s?d?u?s?s +?l?l?s?s?d?s?d?u +?l?l?s?s?d?s?l?u +?l?l?s?s?d?s?u?d +?l?l?s?s?d?s?u?l +?l?l?s?s?d?s?u?u +?l?l?s?s?d?s?u?s +?l?l?s?s?d?s?s?u +?l?l?s?s?l?d?d?u +?l?l?s?s?l?d?l?u +?l?l?s?s?l?d?u?d +?l?l?s?s?l?d?u?l +?l?l?s?s?l?d?u?u +?l?l?s?s?l?d?u?s +?l?l?s?s?l?d?s?u +?l?l?s?s?l?l?d?u +?l?l?s?s?l?l?u?d +?l?l?s?s?l?u?d?d +?l?l?s?s?l?u?d?l +?l?l?s?s?l?u?d?u +?l?l?s?s?l?u?d?s +?l?l?s?s?l?u?l?d +?l?l?s?s?l?u?u?d +?l?l?s?s?l?u?s?d +?l?l?s?s?l?s?d?u +?l?l?s?s?l?s?u?d +?l?l?s?s?u?d?d?d +?l?l?s?s?u?d?d?l +?l?l?s?s?u?d?d?u +?l?l?s?s?u?d?d?s +?l?l?s?s?u?d?l?d +?l?l?s?s?u?d?l?l +?l?l?s?s?u?d?l?u +?l?l?s?s?u?d?l?s +?l?l?s?s?u?d?u?d +?l?l?s?s?u?d?u?l +?l?l?s?s?u?d?u?u +?l?l?s?s?u?d?u?s +?l?l?s?s?u?d?s?d +?l?l?s?s?u?d?s?l +?l?l?s?s?u?d?s?u +?l?l?s?s?u?d?s?s +?l?l?s?s?u?l?d?d +?l?l?s?s?u?l?d?l +?l?l?s?s?u?l?d?u +?l?l?s?s?u?l?d?s +?l?l?s?s?u?l?l?d +?l?l?s?s?u?l?u?d +?l?l?s?s?u?l?s?d +?l?l?s?s?u?u?d?d +?l?l?s?s?u?u?d?l +?l?l?s?s?u?u?d?u +?l?l?s?s?u?u?d?s +?l?l?s?s?u?u?l?d +?l?l?s?s?u?u?u?d +?l?l?s?s?u?u?s?d +?l?l?s?s?u?s?d?d +?l?l?s?s?u?s?d?l +?l?l?s?s?u?s?d?u +?l?l?s?s?u?s?d?s +?l?l?s?s?u?s?l?d +?l?l?s?s?u?s?u?d +?l?l?s?s?u?s?s?d +?l?l?s?s?s?d?d?u +?l?l?s?s?s?d?l?u +?l?l?s?s?s?d?u?d +?l?l?s?s?s?d?u?l +?l?l?s?s?s?d?u?u +?l?l?s?s?s?d?u?s +?l?l?s?s?s?d?s?u +?l?l?s?s?s?l?d?u +?l?l?s?s?s?l?u?d +?l?l?s?s?s?u?d?d +?l?l?s?s?s?u?d?l +?l?l?s?s?s?u?d?u +?l?l?s?s?s?u?d?s +?l?l?s?s?s?u?l?d +?l?l?s?s?s?u?u?d +?l?l?s?s?s?u?s?d +?l?l?s?s?s?s?d?u +?l?l?s?s?s?s?u?d +?l?u?d?d?d?d?d?s +?l?u?d?d?d?d?l?s +?l?u?d?d?d?d?u?s +?l?u?d?d?d?d?s?d +?l?u?d?d?d?d?s?l +?l?u?d?d?d?d?s?u +?l?u?d?d?d?d?s?s +?l?u?d?d?d?l?d?s +?l?u?d?d?d?l?l?s +?l?u?d?d?d?l?u?s +?l?u?d?d?d?l?s?d +?l?u?d?d?d?l?s?l +?l?u?d?d?d?l?s?u +?l?u?d?d?d?l?s?s +?l?u?d?d?d?u?d?s +?l?u?d?d?d?u?l?s +?l?u?d?d?d?u?u?s +?l?u?d?d?d?u?s?d +?l?u?d?d?d?u?s?l +?l?u?d?d?d?u?s?u +?l?u?d?d?d?u?s?s +?l?u?d?d?d?s?d?d +?l?u?d?d?d?s?d?l +?l?u?d?d?d?s?d?u +?l?u?d?d?d?s?d?s +?l?u?d?d?d?s?l?d +?l?u?d?d?d?s?l?l +?l?u?d?d?d?s?l?u +?l?u?d?d?d?s?l?s +?l?u?d?d?d?s?u?d +?l?u?d?d?d?s?u?l +?l?u?d?d?d?s?u?u +?l?u?d?d?d?s?u?s +?l?u?d?d?d?s?s?d +?l?u?d?d?d?s?s?l +?l?u?d?d?d?s?s?u +?l?u?d?d?d?s?s?s +?l?u?d?d?l?d?d?s +?l?u?d?d?l?d?l?s +?l?u?d?d?l?d?u?s +?l?u?d?d?l?d?s?d +?l?u?d?d?l?d?s?l +?l?u?d?d?l?d?s?u +?l?u?d?d?l?d?s?s +?l?u?d?d?l?l?d?s +?l?u?d?d?l?l?l?s +?l?u?d?d?l?l?u?s +?l?u?d?d?l?l?s?d +?l?u?d?d?l?l?s?l +?l?u?d?d?l?l?s?u +?l?u?d?d?l?l?s?s +?l?u?d?d?l?u?d?s +?l?u?d?d?l?u?l?s +?l?u?d?d?l?u?u?s +?l?u?d?d?l?u?s?d +?l?u?d?d?l?u?s?l +?l?u?d?d?l?u?s?u +?l?u?d?d?l?u?s?s +?l?u?d?d?l?s?d?d +?l?u?d?d?l?s?d?l +?l?u?d?d?l?s?d?u +?l?u?d?d?l?s?d?s +?l?u?d?d?l?s?l?d +?l?u?d?d?l?s?l?l +?l?u?d?d?l?s?l?u +?l?u?d?d?l?s?l?s +?l?u?d?d?l?s?u?d +?l?u?d?d?l?s?u?l +?l?u?d?d?l?s?u?u +?l?u?d?d?l?s?u?s +?l?u?d?d?l?s?s?d +?l?u?d?d?l?s?s?l +?l?u?d?d?l?s?s?u +?l?u?d?d?l?s?s?s +?l?u?d?d?u?d?d?s +?l?u?d?d?u?d?l?s +?l?u?d?d?u?d?u?s +?l?u?d?d?u?d?s?d +?l?u?d?d?u?d?s?l +?l?u?d?d?u?d?s?u +?l?u?d?d?u?d?s?s +?l?u?d?d?u?l?d?s +?l?u?d?d?u?l?l?s +?l?u?d?d?u?l?u?s +?l?u?d?d?u?l?s?d +?l?u?d?d?u?l?s?l +?l?u?d?d?u?l?s?u +?l?u?d?d?u?l?s?s +?l?u?d?d?u?u?d?s +?l?u?d?d?u?u?l?s +?l?u?d?d?u?u?u?s +?l?u?d?d?u?u?s?d +?l?u?d?d?u?u?s?l +?l?u?d?d?u?u?s?u +?l?u?d?d?u?u?s?s +?l?u?d?d?u?s?d?d +?l?u?d?d?u?s?d?l +?l?u?d?d?u?s?d?u +?l?u?d?d?u?s?d?s +?l?u?d?d?u?s?l?d +?l?u?d?d?u?s?l?l +?l?u?d?d?u?s?l?u +?l?u?d?d?u?s?l?s +?l?u?d?d?u?s?u?d +?l?u?d?d?u?s?u?l +?l?u?d?d?u?s?u?u +?l?u?d?d?u?s?u?s +?l?u?d?d?u?s?s?d +?l?u?d?d?u?s?s?l +?l?u?d?d?u?s?s?u +?l?u?d?d?u?s?s?s +?l?u?d?d?s?d?d?d +?l?u?d?d?s?d?d?l +?l?u?d?d?s?d?d?u +?l?u?d?d?s?d?d?s +?l?u?d?d?s?d?l?d +?l?u?d?d?s?d?l?l +?l?u?d?d?s?d?l?u +?l?u?d?d?s?d?l?s +?l?u?d?d?s?d?u?d +?l?u?d?d?s?d?u?l +?l?u?d?d?s?d?u?u +?l?u?d?d?s?d?u?s +?l?u?d?d?s?d?s?d +?l?u?d?d?s?d?s?l +?l?u?d?d?s?d?s?u +?l?u?d?d?s?d?s?s +?l?u?d?d?s?l?d?d +?l?u?d?d?s?l?d?l +?l?u?d?d?s?l?d?u +?l?u?d?d?s?l?d?s +?l?u?d?d?s?l?l?d +?l?u?d?d?s?l?l?l +?l?u?d?d?s?l?l?u +?l?u?d?d?s?l?l?s +?l?u?d?d?s?l?u?d +?l?u?d?d?s?l?u?l +?l?u?d?d?s?l?u?u +?l?u?d?d?s?l?u?s +?l?u?d?d?s?l?s?d +?l?u?d?d?s?l?s?l +?l?u?d?d?s?l?s?u +?l?u?d?d?s?l?s?s +?l?u?d?d?s?u?d?d +?l?u?d?d?s?u?d?l +?l?u?d?d?s?u?d?u +?l?u?d?d?s?u?d?s +?l?u?d?d?s?u?l?d +?l?u?d?d?s?u?l?l +?l?u?d?d?s?u?l?u +?l?u?d?d?s?u?l?s +?l?u?d?d?s?u?u?d +?l?u?d?d?s?u?u?l +?l?u?d?d?s?u?u?u +?l?u?d?d?s?u?u?s +?l?u?d?d?s?u?s?d +?l?u?d?d?s?u?s?l +?l?u?d?d?s?u?s?u +?l?u?d?d?s?u?s?s +?l?u?d?d?s?s?d?d +?l?u?d?d?s?s?d?l +?l?u?d?d?s?s?d?u +?l?u?d?d?s?s?d?s +?l?u?d?d?s?s?l?d +?l?u?d?d?s?s?l?l +?l?u?d?d?s?s?l?u +?l?u?d?d?s?s?l?s +?l?u?d?d?s?s?u?d +?l?u?d?d?s?s?u?l +?l?u?d?d?s?s?u?u +?l?u?d?d?s?s?u?s +?l?u?d?d?s?s?s?d +?l?u?d?d?s?s?s?l +?l?u?d?d?s?s?s?u +?l?u?d?d?s?s?s?s +?l?u?d?l?d?d?d?s +?l?u?d?l?d?d?l?s +?l?u?d?l?d?d?u?s +?l?u?d?l?d?d?s?d +?l?u?d?l?d?d?s?l +?l?u?d?l?d?d?s?u +?l?u?d?l?d?d?s?s +?l?u?d?l?d?l?d?s +?l?u?d?l?d?l?l?s +?l?u?d?l?d?l?u?s +?l?u?d?l?d?l?s?d +?l?u?d?l?d?l?s?l +?l?u?d?l?d?l?s?u +?l?u?d?l?d?l?s?s +?l?u?d?l?d?u?d?s +?l?u?d?l?d?u?l?s +?l?u?d?l?d?u?u?s +?l?u?d?l?d?u?s?d +?l?u?d?l?d?u?s?l +?l?u?d?l?d?u?s?u +?l?u?d?l?d?u?s?s +?l?u?d?l?d?s?d?d +?l?u?d?l?d?s?d?l +?l?u?d?l?d?s?d?u +?l?u?d?l?d?s?d?s +?l?u?d?l?d?s?l?d +?l?u?d?l?d?s?l?l +?l?u?d?l?d?s?l?u +?l?u?d?l?d?s?l?s +?l?u?d?l?d?s?u?d +?l?u?d?l?d?s?u?l +?l?u?d?l?d?s?u?u +?l?u?d?l?d?s?u?s +?l?u?d?l?d?s?s?d +?l?u?d?l?d?s?s?l +?l?u?d?l?d?s?s?u +?l?u?d?l?d?s?s?s +?l?u?d?l?l?d?d?s +?l?u?d?l?l?d?l?s +?l?u?d?l?l?d?u?s +?l?u?d?l?l?d?s?d +?l?u?d?l?l?d?s?l +?l?u?d?l?l?d?s?u +?l?u?d?l?l?d?s?s +?l?u?d?l?l?l?d?s +?l?u?d?l?l?l?l?s +?l?u?d?l?l?l?u?s +?l?u?d?l?l?l?s?d +?l?u?d?l?l?l?s?l +?l?u?d?l?l?l?s?u +?l?u?d?l?l?l?s?s +?l?u?d?l?l?u?d?s +?l?u?d?l?l?u?l?s +?l?u?d?l?l?u?u?s +?l?u?d?l?l?u?s?d +?l?u?d?l?l?u?s?l +?l?u?d?l?l?u?s?u +?l?u?d?l?l?u?s?s +?l?u?d?l?l?s?d?d +?l?u?d?l?l?s?d?l +?l?u?d?l?l?s?d?u +?l?u?d?l?l?s?d?s +?l?u?d?l?l?s?l?d +?l?u?d?l?l?s?l?l +?l?u?d?l?l?s?l?u +?l?u?d?l?l?s?l?s +?l?u?d?l?l?s?u?d +?l?u?d?l?l?s?u?l +?l?u?d?l?l?s?u?u +?l?u?d?l?l?s?u?s +?l?u?d?l?l?s?s?d +?l?u?d?l?l?s?s?l +?l?u?d?l?l?s?s?u +?l?u?d?l?l?s?s?s +?l?u?d?l?u?d?d?s +?l?u?d?l?u?d?l?s +?l?u?d?l?u?d?u?s +?l?u?d?l?u?d?s?d +?l?u?d?l?u?d?s?l +?l?u?d?l?u?d?s?u +?l?u?d?l?u?d?s?s +?l?u?d?l?u?l?d?s +?l?u?d?l?u?l?l?s +?l?u?d?l?u?l?u?s +?l?u?d?l?u?l?s?d +?l?u?d?l?u?l?s?l +?l?u?d?l?u?l?s?u +?l?u?d?l?u?l?s?s +?l?u?d?l?u?u?d?s +?l?u?d?l?u?u?l?s +?l?u?d?l?u?u?u?s +?l?u?d?l?u?u?s?d +?l?u?d?l?u?u?s?l +?l?u?d?l?u?u?s?u +?l?u?d?l?u?u?s?s +?l?u?d?l?u?s?d?d +?l?u?d?l?u?s?d?l +?l?u?d?l?u?s?d?u +?l?u?d?l?u?s?d?s +?l?u?d?l?u?s?l?d +?l?u?d?l?u?s?l?l +?l?u?d?l?u?s?l?u +?l?u?d?l?u?s?l?s +?l?u?d?l?u?s?u?d +?l?u?d?l?u?s?u?l +?l?u?d?l?u?s?u?u +?l?u?d?l?u?s?u?s +?l?u?d?l?u?s?s?d +?l?u?d?l?u?s?s?l +?l?u?d?l?u?s?s?u +?l?u?d?l?u?s?s?s +?l?u?d?l?s?d?d?d +?l?u?d?l?s?d?d?l +?l?u?d?l?s?d?d?u +?l?u?d?l?s?d?d?s +?l?u?d?l?s?d?l?d +?l?u?d?l?s?d?l?l +?l?u?d?l?s?d?l?u +?l?u?d?l?s?d?l?s +?l?u?d?l?s?d?u?d +?l?u?d?l?s?d?u?l +?l?u?d?l?s?d?u?u +?l?u?d?l?s?d?u?s +?l?u?d?l?s?d?s?d +?l?u?d?l?s?d?s?l +?l?u?d?l?s?d?s?u +?l?u?d?l?s?d?s?s +?l?u?d?l?s?l?d?d +?l?u?d?l?s?l?d?l +?l?u?d?l?s?l?d?u +?l?u?d?l?s?l?d?s +?l?u?d?l?s?l?l?d +?l?u?d?l?s?l?l?l +?l?u?d?l?s?l?l?u +?l?u?d?l?s?l?l?s +?l?u?d?l?s?l?u?d +?l?u?d?l?s?l?u?l +?l?u?d?l?s?l?u?u +?l?u?d?l?s?l?u?s +?l?u?d?l?s?l?s?d +?l?u?d?l?s?l?s?l +?l?u?d?l?s?l?s?u +?l?u?d?l?s?l?s?s +?l?u?d?l?s?u?d?d +?l?u?d?l?s?u?d?l +?l?u?d?l?s?u?d?u +?l?u?d?l?s?u?d?s +?l?u?d?l?s?u?l?d +?l?u?d?l?s?u?l?l +?l?u?d?l?s?u?l?u +?l?u?d?l?s?u?l?s +?l?u?d?l?s?u?u?d +?l?u?d?l?s?u?u?l +?l?u?d?l?s?u?u?u +?l?u?d?l?s?u?u?s +?l?u?d?l?s?u?s?d +?l?u?d?l?s?u?s?l +?l?u?d?l?s?u?s?u +?l?u?d?l?s?u?s?s +?l?u?d?l?s?s?d?d +?l?u?d?l?s?s?d?l +?l?u?d?l?s?s?d?u +?l?u?d?l?s?s?d?s +?l?u?d?l?s?s?l?d +?l?u?d?l?s?s?l?l +?l?u?d?l?s?s?l?u +?l?u?d?l?s?s?l?s +?l?u?d?l?s?s?u?d +?l?u?d?l?s?s?u?l +?l?u?d?l?s?s?u?u +?l?u?d?l?s?s?u?s +?l?u?d?l?s?s?s?d +?l?u?d?l?s?s?s?l +?l?u?d?l?s?s?s?u +?l?u?d?l?s?s?s?s +?l?u?d?u?d?d?d?s +?l?u?d?u?d?d?l?s +?l?u?d?u?d?d?u?s +?l?u?d?u?d?d?s?d +?l?u?d?u?d?d?s?l +?l?u?d?u?d?d?s?u +?l?u?d?u?d?d?s?s +?l?u?d?u?d?l?d?s +?l?u?d?u?d?l?l?s +?l?u?d?u?d?l?u?s +?l?u?d?u?d?l?s?d +?l?u?d?u?d?l?s?l +?l?u?d?u?d?l?s?u +?l?u?d?u?d?l?s?s +?l?u?d?u?d?u?d?s +?l?u?d?u?d?u?l?s +?l?u?d?u?d?u?u?s +?l?u?d?u?d?u?s?d +?l?u?d?u?d?u?s?l +?l?u?d?u?d?u?s?u +?l?u?d?u?d?u?s?s +?l?u?d?u?d?s?d?d +?l?u?d?u?d?s?d?l +?l?u?d?u?d?s?d?u +?l?u?d?u?d?s?d?s +?l?u?d?u?d?s?l?d +?l?u?d?u?d?s?l?l +?l?u?d?u?d?s?l?u +?l?u?d?u?d?s?l?s +?l?u?d?u?d?s?u?d +?l?u?d?u?d?s?u?l +?l?u?d?u?d?s?u?u +?l?u?d?u?d?s?u?s +?l?u?d?u?d?s?s?d +?l?u?d?u?d?s?s?l +?l?u?d?u?d?s?s?u +?l?u?d?u?d?s?s?s +?l?u?d?u?l?d?d?s +?l?u?d?u?l?d?l?s +?l?u?d?u?l?d?u?s +?l?u?d?u?l?d?s?d +?l?u?d?u?l?d?s?l +?l?u?d?u?l?d?s?u +?l?u?d?u?l?d?s?s +?l?u?d?u?l?l?d?s +?l?u?d?u?l?l?l?s +?l?u?d?u?l?l?u?s +?l?u?d?u?l?l?s?d +?l?u?d?u?l?l?s?l +?l?u?d?u?l?l?s?u +?l?u?d?u?l?l?s?s +?l?u?d?u?l?u?d?s +?l?u?d?u?l?u?l?s +?l?u?d?u?l?u?u?s +?l?u?d?u?l?u?s?d +?l?u?d?u?l?u?s?l +?l?u?d?u?l?u?s?u +?l?u?d?u?l?u?s?s +?l?u?d?u?l?s?d?d +?l?u?d?u?l?s?d?l +?l?u?d?u?l?s?d?u +?l?u?d?u?l?s?d?s +?l?u?d?u?l?s?l?d +?l?u?d?u?l?s?l?l +?l?u?d?u?l?s?l?u +?l?u?d?u?l?s?l?s +?l?u?d?u?l?s?u?d +?l?u?d?u?l?s?u?l +?l?u?d?u?l?s?u?u +?l?u?d?u?l?s?u?s +?l?u?d?u?l?s?s?d +?l?u?d?u?l?s?s?l +?l?u?d?u?l?s?s?u +?l?u?d?u?l?s?s?s +?l?u?d?u?u?d?d?s +?l?u?d?u?u?d?l?s +?l?u?d?u?u?d?u?s +?l?u?d?u?u?d?s?d +?l?u?d?u?u?d?s?l +?l?u?d?u?u?d?s?u +?l?u?d?u?u?d?s?s +?l?u?d?u?u?l?d?s +?l?u?d?u?u?l?l?s +?l?u?d?u?u?l?u?s +?l?u?d?u?u?l?s?d +?l?u?d?u?u?l?s?l +?l?u?d?u?u?l?s?u +?l?u?d?u?u?l?s?s +?l?u?d?u?u?u?d?s +?l?u?d?u?u?u?l?s +?l?u?d?u?u?u?u?s +?l?u?d?u?u?u?s?d +?l?u?d?u?u?u?s?l +?l?u?d?u?u?u?s?u +?l?u?d?u?u?u?s?s +?l?u?d?u?u?s?d?d +?l?u?d?u?u?s?d?l +?l?u?d?u?u?s?d?u +?l?u?d?u?u?s?d?s +?l?u?d?u?u?s?l?d +?l?u?d?u?u?s?l?l +?l?u?d?u?u?s?l?u +?l?u?d?u?u?s?l?s +?l?u?d?u?u?s?u?d +?l?u?d?u?u?s?u?l +?l?u?d?u?u?s?u?u +?l?u?d?u?u?s?u?s +?l?u?d?u?u?s?s?d +?l?u?d?u?u?s?s?l +?l?u?d?u?u?s?s?u +?l?u?d?u?u?s?s?s +?l?u?d?u?s?d?d?d +?l?u?d?u?s?d?d?l +?l?u?d?u?s?d?d?u +?l?u?d?u?s?d?d?s +?l?u?d?u?s?d?l?d +?l?u?d?u?s?d?l?l +?l?u?d?u?s?d?l?u +?l?u?d?u?s?d?l?s +?l?u?d?u?s?d?u?d +?l?u?d?u?s?d?u?l +?l?u?d?u?s?d?u?u +?l?u?d?u?s?d?u?s +?l?u?d?u?s?d?s?d +?l?u?d?u?s?d?s?l +?l?u?d?u?s?d?s?u +?l?u?d?u?s?d?s?s +?l?u?d?u?s?l?d?d +?l?u?d?u?s?l?d?l +?l?u?d?u?s?l?d?u +?l?u?d?u?s?l?d?s +?l?u?d?u?s?l?l?d +?l?u?d?u?s?l?l?l +?l?u?d?u?s?l?l?u +?l?u?d?u?s?l?l?s +?l?u?d?u?s?l?u?d +?l?u?d?u?s?l?u?l +?l?u?d?u?s?l?u?u +?l?u?d?u?s?l?u?s +?l?u?d?u?s?l?s?d +?l?u?d?u?s?l?s?l +?l?u?d?u?s?l?s?u +?l?u?d?u?s?l?s?s +?l?u?d?u?s?u?d?d +?l?u?d?u?s?u?d?l +?l?u?d?u?s?u?d?u +?l?u?d?u?s?u?d?s +?l?u?d?u?s?u?l?d +?l?u?d?u?s?u?l?l +?l?u?d?u?s?u?l?u +?l?u?d?u?s?u?l?s +?l?u?d?u?s?u?u?d +?l?u?d?u?s?u?u?l +?l?u?d?u?s?u?u?u +?l?u?d?u?s?u?u?s +?l?u?d?u?s?u?s?d +?l?u?d?u?s?u?s?l +?l?u?d?u?s?u?s?u +?l?u?d?u?s?u?s?s +?l?u?d?u?s?s?d?d +?l?u?d?u?s?s?d?l +?l?u?d?u?s?s?d?u +?l?u?d?u?s?s?d?s +?l?u?d?u?s?s?l?d +?l?u?d?u?s?s?l?l +?l?u?d?u?s?s?l?u +?l?u?d?u?s?s?l?s +?l?u?d?u?s?s?u?d +?l?u?d?u?s?s?u?l +?l?u?d?u?s?s?u?u +?l?u?d?u?s?s?u?s +?l?u?d?u?s?s?s?d +?l?u?d?u?s?s?s?l +?l?u?d?u?s?s?s?u +?l?u?d?u?s?s?s?s +?l?u?d?s?d?d?d?d +?l?u?d?s?d?d?d?l +?l?u?d?s?d?d?d?u +?l?u?d?s?d?d?d?s +?l?u?d?s?d?d?l?d +?l?u?d?s?d?d?l?l +?l?u?d?s?d?d?l?u +?l?u?d?s?d?d?l?s +?l?u?d?s?d?d?u?d +?l?u?d?s?d?d?u?l +?l?u?d?s?d?d?u?u +?l?u?d?s?d?d?u?s +?l?u?d?s?d?d?s?d +?l?u?d?s?d?d?s?l +?l?u?d?s?d?d?s?u +?l?u?d?s?d?d?s?s +?l?u?d?s?d?l?d?d +?l?u?d?s?d?l?d?l +?l?u?d?s?d?l?d?u +?l?u?d?s?d?l?d?s +?l?u?d?s?d?l?l?d +?l?u?d?s?d?l?l?l +?l?u?d?s?d?l?l?u +?l?u?d?s?d?l?l?s +?l?u?d?s?d?l?u?d +?l?u?d?s?d?l?u?l +?l?u?d?s?d?l?u?u +?l?u?d?s?d?l?u?s +?l?u?d?s?d?l?s?d +?l?u?d?s?d?l?s?l +?l?u?d?s?d?l?s?u +?l?u?d?s?d?l?s?s +?l?u?d?s?d?u?d?d +?l?u?d?s?d?u?d?l +?l?u?d?s?d?u?d?u +?l?u?d?s?d?u?d?s +?l?u?d?s?d?u?l?d +?l?u?d?s?d?u?l?l +?l?u?d?s?d?u?l?u +?l?u?d?s?d?u?l?s +?l?u?d?s?d?u?u?d +?l?u?d?s?d?u?u?l +?l?u?d?s?d?u?u?u +?l?u?d?s?d?u?u?s +?l?u?d?s?d?u?s?d +?l?u?d?s?d?u?s?l +?l?u?d?s?d?u?s?u +?l?u?d?s?d?u?s?s +?l?u?d?s?d?s?d?d +?l?u?d?s?d?s?d?l +?l?u?d?s?d?s?d?u +?l?u?d?s?d?s?d?s +?l?u?d?s?d?s?l?d +?l?u?d?s?d?s?l?l +?l?u?d?s?d?s?l?u +?l?u?d?s?d?s?l?s +?l?u?d?s?d?s?u?d +?l?u?d?s?d?s?u?l +?l?u?d?s?d?s?u?u +?l?u?d?s?d?s?u?s +?l?u?d?s?d?s?s?d +?l?u?d?s?d?s?s?l +?l?u?d?s?d?s?s?u +?l?u?d?s?d?s?s?s +?l?u?d?s?l?d?d?d +?l?u?d?s?l?d?d?l +?l?u?d?s?l?d?d?u +?l?u?d?s?l?d?d?s +?l?u?d?s?l?d?l?d +?l?u?d?s?l?d?l?l +?l?u?d?s?l?d?l?u +?l?u?d?s?l?d?l?s +?l?u?d?s?l?d?u?d +?l?u?d?s?l?d?u?l +?l?u?d?s?l?d?u?u +?l?u?d?s?l?d?u?s +?l?u?d?s?l?d?s?d +?l?u?d?s?l?d?s?l +?l?u?d?s?l?d?s?u +?l?u?d?s?l?d?s?s +?l?u?d?s?l?l?d?d +?l?u?d?s?l?l?d?l +?l?u?d?s?l?l?d?u +?l?u?d?s?l?l?d?s +?l?u?d?s?l?l?l?d +?l?u?d?s?l?l?l?l +?l?u?d?s?l?l?l?u +?l?u?d?s?l?l?l?s +?l?u?d?s?l?l?u?d +?l?u?d?s?l?l?u?l +?l?u?d?s?l?l?u?u +?l?u?d?s?l?l?u?s +?l?u?d?s?l?l?s?d +?l?u?d?s?l?l?s?l +?l?u?d?s?l?l?s?u +?l?u?d?s?l?l?s?s +?l?u?d?s?l?u?d?d +?l?u?d?s?l?u?d?l +?l?u?d?s?l?u?d?u +?l?u?d?s?l?u?d?s +?l?u?d?s?l?u?l?d +?l?u?d?s?l?u?l?l +?l?u?d?s?l?u?l?u +?l?u?d?s?l?u?l?s +?l?u?d?s?l?u?u?d +?l?u?d?s?l?u?u?l +?l?u?d?s?l?u?u?u +?l?u?d?s?l?u?u?s +?l?u?d?s?l?u?s?d +?l?u?d?s?l?u?s?l +?l?u?d?s?l?u?s?u +?l?u?d?s?l?u?s?s +?l?u?d?s?l?s?d?d +?l?u?d?s?l?s?d?l +?l?u?d?s?l?s?d?u +?l?u?d?s?l?s?d?s +?l?u?d?s?l?s?l?d +?l?u?d?s?l?s?l?l +?l?u?d?s?l?s?l?u +?l?u?d?s?l?s?l?s +?l?u?d?s?l?s?u?d +?l?u?d?s?l?s?u?l +?l?u?d?s?l?s?u?u +?l?u?d?s?l?s?u?s +?l?u?d?s?l?s?s?d +?l?u?d?s?l?s?s?l +?l?u?d?s?l?s?s?u +?l?u?d?s?l?s?s?s +?l?u?d?s?u?d?d?d +?l?u?d?s?u?d?d?l +?l?u?d?s?u?d?d?u +?l?u?d?s?u?d?d?s +?l?u?d?s?u?d?l?d +?l?u?d?s?u?d?l?l +?l?u?d?s?u?d?l?u +?l?u?d?s?u?d?l?s +?l?u?d?s?u?d?u?d +?l?u?d?s?u?d?u?l +?l?u?d?s?u?d?u?u +?l?u?d?s?u?d?u?s +?l?u?d?s?u?d?s?d +?l?u?d?s?u?d?s?l +?l?u?d?s?u?d?s?u +?l?u?d?s?u?d?s?s +?l?u?d?s?u?l?d?d +?l?u?d?s?u?l?d?l +?l?u?d?s?u?l?d?u +?l?u?d?s?u?l?d?s +?l?u?d?s?u?l?l?d +?l?u?d?s?u?l?l?l +?l?u?d?s?u?l?l?u +?l?u?d?s?u?l?l?s +?l?u?d?s?u?l?u?d +?l?u?d?s?u?l?u?l +?l?u?d?s?u?l?u?u +?l?u?d?s?u?l?u?s +?l?u?d?s?u?l?s?d +?l?u?d?s?u?l?s?l +?l?u?d?s?u?l?s?u +?l?u?d?s?u?l?s?s +?l?u?d?s?u?u?d?d +?l?u?d?s?u?u?d?l +?l?u?d?s?u?u?d?u +?l?u?d?s?u?u?d?s +?l?u?d?s?u?u?l?d +?l?u?d?s?u?u?l?l +?l?u?d?s?u?u?l?u +?l?u?d?s?u?u?l?s +?l?u?d?s?u?u?u?d +?l?u?d?s?u?u?u?l +?l?u?d?s?u?u?u?u +?l?u?d?s?u?u?u?s +?l?u?d?s?u?u?s?d +?l?u?d?s?u?u?s?l +?l?u?d?s?u?u?s?u +?l?u?d?s?u?u?s?s +?l?u?d?s?u?s?d?d +?l?u?d?s?u?s?d?l +?l?u?d?s?u?s?d?u +?l?u?d?s?u?s?d?s +?l?u?d?s?u?s?l?d +?l?u?d?s?u?s?l?l +?l?u?d?s?u?s?l?u +?l?u?d?s?u?s?l?s +?l?u?d?s?u?s?u?d +?l?u?d?s?u?s?u?l +?l?u?d?s?u?s?u?u +?l?u?d?s?u?s?u?s +?l?u?d?s?u?s?s?d +?l?u?d?s?u?s?s?l +?l?u?d?s?u?s?s?u +?l?u?d?s?u?s?s?s +?l?u?d?s?s?d?d?d +?l?u?d?s?s?d?d?l +?l?u?d?s?s?d?d?u +?l?u?d?s?s?d?d?s +?l?u?d?s?s?d?l?d +?l?u?d?s?s?d?l?l +?l?u?d?s?s?d?l?u +?l?u?d?s?s?d?l?s +?l?u?d?s?s?d?u?d +?l?u?d?s?s?d?u?l +?l?u?d?s?s?d?u?u +?l?u?d?s?s?d?u?s +?l?u?d?s?s?d?s?d +?l?u?d?s?s?d?s?l +?l?u?d?s?s?d?s?u +?l?u?d?s?s?d?s?s +?l?u?d?s?s?l?d?d +?l?u?d?s?s?l?d?l +?l?u?d?s?s?l?d?u +?l?u?d?s?s?l?d?s +?l?u?d?s?s?l?l?d +?l?u?d?s?s?l?l?l +?l?u?d?s?s?l?l?u +?l?u?d?s?s?l?l?s +?l?u?d?s?s?l?u?d +?l?u?d?s?s?l?u?l +?l?u?d?s?s?l?u?u +?l?u?d?s?s?l?u?s +?l?u?d?s?s?l?s?d +?l?u?d?s?s?l?s?l +?l?u?d?s?s?l?s?u +?l?u?d?s?s?l?s?s +?l?u?d?s?s?u?d?d +?l?u?d?s?s?u?d?l +?l?u?d?s?s?u?d?u +?l?u?d?s?s?u?d?s +?l?u?d?s?s?u?l?d +?l?u?d?s?s?u?l?l +?l?u?d?s?s?u?l?u +?l?u?d?s?s?u?l?s +?l?u?d?s?s?u?u?d +?l?u?d?s?s?u?u?l +?l?u?d?s?s?u?u?u +?l?u?d?s?s?u?u?s +?l?u?d?s?s?u?s?d +?l?u?d?s?s?u?s?l +?l?u?d?s?s?u?s?u +?l?u?d?s?s?u?s?s +?l?u?d?s?s?s?d?d +?l?u?d?s?s?s?d?l +?l?u?d?s?s?s?d?u +?l?u?d?s?s?s?d?s +?l?u?d?s?s?s?l?d +?l?u?d?s?s?s?l?l +?l?u?d?s?s?s?l?u +?l?u?d?s?s?s?l?s +?l?u?d?s?s?s?u?d +?l?u?d?s?s?s?u?l +?l?u?d?s?s?s?u?u +?l?u?d?s?s?s?u?s +?l?u?d?s?s?s?s?d +?l?u?d?s?s?s?s?l +?l?u?d?s?s?s?s?u +?l?u?d?s?s?s?s?s +?l?u?l?d?d?d?d?s +?l?u?l?d?d?d?l?s +?l?u?l?d?d?d?u?s +?l?u?l?d?d?d?s?d +?l?u?l?d?d?d?s?l +?l?u?l?d?d?d?s?u +?l?u?l?d?d?d?s?s +?l?u?l?d?d?l?d?s +?l?u?l?d?d?l?l?s +?l?u?l?d?d?l?u?s +?l?u?l?d?d?l?s?d +?l?u?l?d?d?l?s?l +?l?u?l?d?d?l?s?u +?l?u?l?d?d?l?s?s +?l?u?l?d?d?u?d?s +?l?u?l?d?d?u?l?s +?l?u?l?d?d?u?u?s +?l?u?l?d?d?u?s?d +?l?u?l?d?d?u?s?l +?l?u?l?d?d?u?s?u +?l?u?l?d?d?u?s?s +?l?u?l?d?d?s?d?d +?l?u?l?d?d?s?d?l +?l?u?l?d?d?s?d?u +?l?u?l?d?d?s?d?s +?l?u?l?d?d?s?l?d +?l?u?l?d?d?s?l?l +?l?u?l?d?d?s?l?u +?l?u?l?d?d?s?l?s +?l?u?l?d?d?s?u?d +?l?u?l?d?d?s?u?l +?l?u?l?d?d?s?u?u +?l?u?l?d?d?s?u?s +?l?u?l?d?d?s?s?d +?l?u?l?d?d?s?s?l +?l?u?l?d?d?s?s?u +?l?u?l?d?d?s?s?s +?l?u?l?d?l?d?d?s +?l?u?l?d?l?d?l?s +?l?u?l?d?l?d?u?s +?l?u?l?d?l?d?s?d +?l?u?l?d?l?d?s?l +?l?u?l?d?l?d?s?u +?l?u?l?d?l?d?s?s +?l?u?l?d?l?l?d?s +?l?u?l?d?l?l?l?s +?l?u?l?d?l?l?u?s +?l?u?l?d?l?l?s?d +?l?u?l?d?l?l?s?l +?l?u?l?d?l?l?s?u +?l?u?l?d?l?l?s?s +?l?u?l?d?l?u?d?s +?l?u?l?d?l?u?l?s +?l?u?l?d?l?u?u?s +?l?u?l?d?l?u?s?d +?l?u?l?d?l?u?s?l +?l?u?l?d?l?u?s?u +?l?u?l?d?l?u?s?s +?l?u?l?d?l?s?d?d +?l?u?l?d?l?s?d?l +?l?u?l?d?l?s?d?u +?l?u?l?d?l?s?d?s +?l?u?l?d?l?s?l?d +?l?u?l?d?l?s?l?l +?l?u?l?d?l?s?l?u +?l?u?l?d?l?s?l?s +?l?u?l?d?l?s?u?d +?l?u?l?d?l?s?u?l +?l?u?l?d?l?s?u?u +?l?u?l?d?l?s?u?s +?l?u?l?d?l?s?s?d +?l?u?l?d?l?s?s?l +?l?u?l?d?l?s?s?u +?l?u?l?d?l?s?s?s +?l?u?l?d?u?d?d?s +?l?u?l?d?u?d?l?s +?l?u?l?d?u?d?u?s +?l?u?l?d?u?d?s?d +?l?u?l?d?u?d?s?l +?l?u?l?d?u?d?s?u +?l?u?l?d?u?d?s?s +?l?u?l?d?u?l?d?s +?l?u?l?d?u?l?l?s +?l?u?l?d?u?l?u?s +?l?u?l?d?u?l?s?d +?l?u?l?d?u?l?s?l +?l?u?l?d?u?l?s?u +?l?u?l?d?u?l?s?s +?l?u?l?d?u?u?d?s +?l?u?l?d?u?u?l?s +?l?u?l?d?u?u?u?s +?l?u?l?d?u?u?s?d +?l?u?l?d?u?u?s?l +?l?u?l?d?u?u?s?u +?l?u?l?d?u?u?s?s +?l?u?l?d?u?s?d?d +?l?u?l?d?u?s?d?l +?l?u?l?d?u?s?d?u +?l?u?l?d?u?s?d?s +?l?u?l?d?u?s?l?d +?l?u?l?d?u?s?l?l +?l?u?l?d?u?s?l?u +?l?u?l?d?u?s?l?s +?l?u?l?d?u?s?u?d +?l?u?l?d?u?s?u?l +?l?u?l?d?u?s?u?u +?l?u?l?d?u?s?u?s +?l?u?l?d?u?s?s?d +?l?u?l?d?u?s?s?l +?l?u?l?d?u?s?s?u +?l?u?l?d?u?s?s?s +?l?u?l?d?s?d?d?d +?l?u?l?d?s?d?d?l +?l?u?l?d?s?d?d?u +?l?u?l?d?s?d?d?s +?l?u?l?d?s?d?l?d +?l?u?l?d?s?d?l?l +?l?u?l?d?s?d?l?u +?l?u?l?d?s?d?l?s +?l?u?l?d?s?d?u?d +?l?u?l?d?s?d?u?l +?l?u?l?d?s?d?u?u +?l?u?l?d?s?d?u?s +?l?u?l?d?s?d?s?d +?l?u?l?d?s?d?s?l +?l?u?l?d?s?d?s?u +?l?u?l?d?s?d?s?s +?l?u?l?d?s?l?d?d +?l?u?l?d?s?l?d?l +?l?u?l?d?s?l?d?u +?l?u?l?d?s?l?d?s +?l?u?l?d?s?l?l?d +?l?u?l?d?s?l?l?l +?l?u?l?d?s?l?l?u +?l?u?l?d?s?l?l?s +?l?u?l?d?s?l?u?d +?l?u?l?d?s?l?u?l +?l?u?l?d?s?l?u?u +?l?u?l?d?s?l?u?s +?l?u?l?d?s?l?s?d +?l?u?l?d?s?l?s?l +?l?u?l?d?s?l?s?u +?l?u?l?d?s?l?s?s +?l?u?l?d?s?u?d?d +?l?u?l?d?s?u?d?l +?l?u?l?d?s?u?d?u +?l?u?l?d?s?u?d?s +?l?u?l?d?s?u?l?d +?l?u?l?d?s?u?l?l +?l?u?l?d?s?u?l?u +?l?u?l?d?s?u?l?s +?l?u?l?d?s?u?u?d +?l?u?l?d?s?u?u?l +?l?u?l?d?s?u?u?u +?l?u?l?d?s?u?u?s +?l?u?l?d?s?u?s?d +?l?u?l?d?s?u?s?l +?l?u?l?d?s?u?s?u +?l?u?l?d?s?u?s?s +?l?u?l?d?s?s?d?d +?l?u?l?d?s?s?d?l +?l?u?l?d?s?s?d?u +?l?u?l?d?s?s?d?s +?l?u?l?d?s?s?l?d +?l?u?l?d?s?s?l?l +?l?u?l?d?s?s?l?u +?l?u?l?d?s?s?l?s +?l?u?l?d?s?s?u?d +?l?u?l?d?s?s?u?l +?l?u?l?d?s?s?u?u +?l?u?l?d?s?s?u?s +?l?u?l?d?s?s?s?d +?l?u?l?d?s?s?s?l +?l?u?l?d?s?s?s?u +?l?u?l?d?s?s?s?s +?l?u?l?l?d?d?d?s +?l?u?l?l?d?d?l?s +?l?u?l?l?d?d?u?s +?l?u?l?l?d?d?s?d +?l?u?l?l?d?d?s?l +?l?u?l?l?d?d?s?u +?l?u?l?l?d?d?s?s +?l?u?l?l?d?l?d?s +?l?u?l?l?d?l?l?s +?l?u?l?l?d?l?u?s +?l?u?l?l?d?l?s?d +?l?u?l?l?d?l?s?l +?l?u?l?l?d?l?s?u +?l?u?l?l?d?l?s?s +?l?u?l?l?d?u?d?s +?l?u?l?l?d?u?l?s +?l?u?l?l?d?u?u?s +?l?u?l?l?d?u?s?d +?l?u?l?l?d?u?s?l +?l?u?l?l?d?u?s?u +?l?u?l?l?d?u?s?s +?l?u?l?l?d?s?d?d +?l?u?l?l?d?s?d?l +?l?u?l?l?d?s?d?u +?l?u?l?l?d?s?d?s +?l?u?l?l?d?s?l?d +?l?u?l?l?d?s?l?l +?l?u?l?l?d?s?l?u +?l?u?l?l?d?s?l?s +?l?u?l?l?d?s?u?d +?l?u?l?l?d?s?u?l +?l?u?l?l?d?s?u?u +?l?u?l?l?d?s?u?s +?l?u?l?l?d?s?s?d +?l?u?l?l?d?s?s?l +?l?u?l?l?d?s?s?u +?l?u?l?l?d?s?s?s +?l?u?l?l?l?d?d?s +?l?u?l?l?l?d?l?s +?l?u?l?l?l?d?u?s +?l?u?l?l?l?d?s?d +?l?u?l?l?l?d?s?l +?l?u?l?l?l?d?s?u +?l?u?l?l?l?d?s?s +?l?u?l?l?l?l?d?s +?l?u?l?l?l?l?s?d +?l?u?l?l?l?u?d?s +?l?u?l?l?l?u?s?d +?l?u?l?l?l?s?d?d +?l?u?l?l?l?s?d?l +?l?u?l?l?l?s?d?u +?l?u?l?l?l?s?d?s +?l?u?l?l?l?s?l?d +?l?u?l?l?l?s?u?d +?l?u?l?l?l?s?s?d +?l?u?l?l?u?d?d?s +?l?u?l?l?u?d?l?s +?l?u?l?l?u?d?u?s +?l?u?l?l?u?d?s?d +?l?u?l?l?u?d?s?l +?l?u?l?l?u?d?s?u +?l?u?l?l?u?d?s?s +?l?u?l?l?u?l?d?s +?l?u?l?l?u?l?s?d +?l?u?l?l?u?u?d?s +?l?u?l?l?u?u?s?d +?l?u?l?l?u?s?d?d +?l?u?l?l?u?s?d?l +?l?u?l?l?u?s?d?u +?l?u?l?l?u?s?d?s +?l?u?l?l?u?s?l?d +?l?u?l?l?u?s?u?d +?l?u?l?l?u?s?s?d +?l?u?l?l?s?d?d?d +?l?u?l?l?s?d?d?l +?l?u?l?l?s?d?d?u +?l?u?l?l?s?d?d?s +?l?u?l?l?s?d?l?d +?l?u?l?l?s?d?l?l +?l?u?l?l?s?d?l?u +?l?u?l?l?s?d?l?s +?l?u?l?l?s?d?u?d +?l?u?l?l?s?d?u?l +?l?u?l?l?s?d?u?u +?l?u?l?l?s?d?u?s +?l?u?l?l?s?d?s?d +?l?u?l?l?s?d?s?l +?l?u?l?l?s?d?s?u +?l?u?l?l?s?d?s?s +?l?u?l?l?s?l?d?d +?l?u?l?l?s?l?d?l +?l?u?l?l?s?l?d?u +?l?u?l?l?s?l?d?s +?l?u?l?l?s?l?l?d +?l?u?l?l?s?l?u?d +?l?u?l?l?s?l?s?d +?l?u?l?l?s?u?d?d +?l?u?l?l?s?u?d?l +?l?u?l?l?s?u?d?u +?l?u?l?l?s?u?d?s +?l?u?l?l?s?u?l?d +?l?u?l?l?s?u?u?d +?l?u?l?l?s?u?s?d +?l?u?l?l?s?s?d?d +?l?u?l?l?s?s?d?l +?l?u?l?l?s?s?d?u +?l?u?l?l?s?s?d?s +?l?u?l?l?s?s?l?d +?l?u?l?l?s?s?u?d +?l?u?l?l?s?s?s?d +?l?u?l?u?d?d?d?s +?l?u?l?u?d?d?l?s +?l?u?l?u?d?d?u?s +?l?u?l?u?d?d?s?d +?l?u?l?u?d?d?s?l +?l?u?l?u?d?d?s?u +?l?u?l?u?d?d?s?s +?l?u?l?u?d?l?d?s +?l?u?l?u?d?l?l?s +?l?u?l?u?d?l?u?s +?l?u?l?u?d?l?s?d +?l?u?l?u?d?l?s?l +?l?u?l?u?d?l?s?u +?l?u?l?u?d?l?s?s +?l?u?l?u?d?u?d?s +?l?u?l?u?d?u?l?s +?l?u?l?u?d?u?u?s +?l?u?l?u?d?u?s?d +?l?u?l?u?d?u?s?l +?l?u?l?u?d?u?s?u +?l?u?l?u?d?u?s?s +?l?u?l?u?d?s?d?d +?l?u?l?u?d?s?d?l +?l?u?l?u?d?s?d?u +?l?u?l?u?d?s?d?s +?l?u?l?u?d?s?l?d +?l?u?l?u?d?s?l?l +?l?u?l?u?d?s?l?u +?l?u?l?u?d?s?l?s +?l?u?l?u?d?s?u?d +?l?u?l?u?d?s?u?l +?l?u?l?u?d?s?u?u +?l?u?l?u?d?s?u?s +?l?u?l?u?d?s?s?d +?l?u?l?u?d?s?s?l +?l?u?l?u?d?s?s?u +?l?u?l?u?d?s?s?s +?l?u?l?u?l?d?d?s +?l?u?l?u?l?d?l?s +?l?u?l?u?l?d?u?s +?l?u?l?u?l?d?s?d +?l?u?l?u?l?d?s?l +?l?u?l?u?l?d?s?u +?l?u?l?u?l?d?s?s +?l?u?l?u?l?l?d?s +?l?u?l?u?l?l?s?d +?l?u?l?u?l?u?d?s +?l?u?l?u?l?u?s?d +?l?u?l?u?l?s?d?d +?l?u?l?u?l?s?d?l +?l?u?l?u?l?s?d?u +?l?u?l?u?l?s?d?s +?l?u?l?u?l?s?l?d +?l?u?l?u?l?s?u?d +?l?u?l?u?l?s?s?d +?l?u?l?u?u?d?d?s +?l?u?l?u?u?d?l?s +?l?u?l?u?u?d?u?s +?l?u?l?u?u?d?s?d +?l?u?l?u?u?d?s?l +?l?u?l?u?u?d?s?u +?l?u?l?u?u?d?s?s +?l?u?l?u?u?l?d?s +?l?u?l?u?u?l?s?d +?l?u?l?u?u?u?d?s +?l?u?l?u?u?u?s?d +?l?u?l?u?u?s?d?d +?l?u?l?u?u?s?d?l +?l?u?l?u?u?s?d?u +?l?u?l?u?u?s?d?s +?l?u?l?u?u?s?l?d +?l?u?l?u?u?s?u?d +?l?u?l?u?u?s?s?d +?l?u?l?u?s?d?d?d +?l?u?l?u?s?d?d?l +?l?u?l?u?s?d?d?u +?l?u?l?u?s?d?d?s +?l?u?l?u?s?d?l?d +?l?u?l?u?s?d?l?l +?l?u?l?u?s?d?l?u +?l?u?l?u?s?d?l?s +?l?u?l?u?s?d?u?d +?l?u?l?u?s?d?u?l +?l?u?l?u?s?d?u?u +?l?u?l?u?s?d?u?s +?l?u?l?u?s?d?s?d +?l?u?l?u?s?d?s?l +?l?u?l?u?s?d?s?u +?l?u?l?u?s?d?s?s +?l?u?l?u?s?l?d?d +?l?u?l?u?s?l?d?l +?l?u?l?u?s?l?d?u +?l?u?l?u?s?l?d?s +?l?u?l?u?s?l?l?d +?l?u?l?u?s?l?u?d +?l?u?l?u?s?l?s?d +?l?u?l?u?s?u?d?d +?l?u?l?u?s?u?d?l +?l?u?l?u?s?u?d?u +?l?u?l?u?s?u?d?s +?l?u?l?u?s?u?l?d +?l?u?l?u?s?u?u?d +?l?u?l?u?s?u?s?d +?l?u?l?u?s?s?d?d +?l?u?l?u?s?s?d?l +?l?u?l?u?s?s?d?u +?l?u?l?u?s?s?d?s +?l?u?l?u?s?s?l?d +?l?u?l?u?s?s?u?d +?l?u?l?u?s?s?s?d +?l?u?l?s?d?d?d?d +?l?u?l?s?d?d?d?l +?l?u?l?s?d?d?d?u +?l?u?l?s?d?d?d?s +?l?u?l?s?d?d?l?d +?l?u?l?s?d?d?l?l +?l?u?l?s?d?d?l?u +?l?u?l?s?d?d?l?s +?l?u?l?s?d?d?u?d +?l?u?l?s?d?d?u?l +?l?u?l?s?d?d?u?u +?l?u?l?s?d?d?u?s +?l?u?l?s?d?d?s?d +?l?u?l?s?d?d?s?l +?l?u?l?s?d?d?s?u +?l?u?l?s?d?d?s?s +?l?u?l?s?d?l?d?d +?l?u?l?s?d?l?d?l +?l?u?l?s?d?l?d?u +?l?u?l?s?d?l?d?s +?l?u?l?s?d?l?l?d +?l?u?l?s?d?l?l?l +?l?u?l?s?d?l?l?u +?l?u?l?s?d?l?l?s +?l?u?l?s?d?l?u?d +?l?u?l?s?d?l?u?l +?l?u?l?s?d?l?u?u +?l?u?l?s?d?l?u?s +?l?u?l?s?d?l?s?d +?l?u?l?s?d?l?s?l +?l?u?l?s?d?l?s?u +?l?u?l?s?d?l?s?s +?l?u?l?s?d?u?d?d +?l?u?l?s?d?u?d?l +?l?u?l?s?d?u?d?u +?l?u?l?s?d?u?d?s +?l?u?l?s?d?u?l?d +?l?u?l?s?d?u?l?l +?l?u?l?s?d?u?l?u +?l?u?l?s?d?u?l?s +?l?u?l?s?d?u?u?d +?l?u?l?s?d?u?u?l +?l?u?l?s?d?u?u?u +?l?u?l?s?d?u?u?s +?l?u?l?s?d?u?s?d +?l?u?l?s?d?u?s?l +?l?u?l?s?d?u?s?u +?l?u?l?s?d?u?s?s +?l?u?l?s?d?s?d?d +?l?u?l?s?d?s?d?l +?l?u?l?s?d?s?d?u +?l?u?l?s?d?s?d?s +?l?u?l?s?d?s?l?d +?l?u?l?s?d?s?l?l +?l?u?l?s?d?s?l?u +?l?u?l?s?d?s?l?s +?l?u?l?s?d?s?u?d +?l?u?l?s?d?s?u?l +?l?u?l?s?d?s?u?u +?l?u?l?s?d?s?u?s +?l?u?l?s?d?s?s?d +?l?u?l?s?d?s?s?l +?l?u?l?s?d?s?s?u +?l?u?l?s?d?s?s?s +?l?u?l?s?l?d?d?d +?l?u?l?s?l?d?d?l +?l?u?l?s?l?d?d?u +?l?u?l?s?l?d?d?s +?l?u?l?s?l?d?l?d +?l?u?l?s?l?d?l?l +?l?u?l?s?l?d?l?u +?l?u?l?s?l?d?l?s +?l?u?l?s?l?d?u?d +?l?u?l?s?l?d?u?l +?l?u?l?s?l?d?u?u +?l?u?l?s?l?d?u?s +?l?u?l?s?l?d?s?d +?l?u?l?s?l?d?s?l +?l?u?l?s?l?d?s?u +?l?u?l?s?l?d?s?s +?l?u?l?s?l?l?d?d +?l?u?l?s?l?l?d?l +?l?u?l?s?l?l?d?u +?l?u?l?s?l?l?d?s +?l?u?l?s?l?l?l?d +?l?u?l?s?l?l?u?d +?l?u?l?s?l?l?s?d +?l?u?l?s?l?u?d?d +?l?u?l?s?l?u?d?l +?l?u?l?s?l?u?d?u +?l?u?l?s?l?u?d?s +?l?u?l?s?l?u?l?d +?l?u?l?s?l?u?u?d +?l?u?l?s?l?u?s?d +?l?u?l?s?l?s?d?d +?l?u?l?s?l?s?d?l +?l?u?l?s?l?s?d?u +?l?u?l?s?l?s?d?s +?l?u?l?s?l?s?l?d +?l?u?l?s?l?s?u?d +?l?u?l?s?l?s?s?d +?l?u?l?s?u?d?d?d +?l?u?l?s?u?d?d?l +?l?u?l?s?u?d?d?u +?l?u?l?s?u?d?d?s +?l?u?l?s?u?d?l?d +?l?u?l?s?u?d?l?l +?l?u?l?s?u?d?l?u +?l?u?l?s?u?d?l?s +?l?u?l?s?u?d?u?d +?l?u?l?s?u?d?u?l +?l?u?l?s?u?d?u?u +?l?u?l?s?u?d?u?s +?l?u?l?s?u?d?s?d +?l?u?l?s?u?d?s?l +?l?u?l?s?u?d?s?u +?l?u?l?s?u?d?s?s +?l?u?l?s?u?l?d?d +?l?u?l?s?u?l?d?l +?l?u?l?s?u?l?d?u +?l?u?l?s?u?l?d?s +?l?u?l?s?u?l?l?d +?l?u?l?s?u?l?u?d +?l?u?l?s?u?l?s?d +?l?u?l?s?u?u?d?d +?l?u?l?s?u?u?d?l +?l?u?l?s?u?u?d?u +?l?u?l?s?u?u?d?s +?l?u?l?s?u?u?l?d +?l?u?l?s?u?u?u?d +?l?u?l?s?u?u?s?d +?l?u?l?s?u?s?d?d +?l?u?l?s?u?s?d?l +?l?u?l?s?u?s?d?u +?l?u?l?s?u?s?d?s +?l?u?l?s?u?s?l?d +?l?u?l?s?u?s?u?d +?l?u?l?s?u?s?s?d +?l?u?l?s?s?d?d?d +?l?u?l?s?s?d?d?l +?l?u?l?s?s?d?d?u +?l?u?l?s?s?d?d?s +?l?u?l?s?s?d?l?d +?l?u?l?s?s?d?l?l +?l?u?l?s?s?d?l?u +?l?u?l?s?s?d?l?s +?l?u?l?s?s?d?u?d +?l?u?l?s?s?d?u?l +?l?u?l?s?s?d?u?u +?l?u?l?s?s?d?u?s +?l?u?l?s?s?d?s?d +?l?u?l?s?s?d?s?l +?l?u?l?s?s?d?s?u +?l?u?l?s?s?d?s?s +?l?u?l?s?s?l?d?d +?l?u?l?s?s?l?d?l +?l?u?l?s?s?l?d?u +?l?u?l?s?s?l?d?s +?l?u?l?s?s?l?l?d +?l?u?l?s?s?l?u?d +?l?u?l?s?s?l?s?d +?l?u?l?s?s?u?d?d +?l?u?l?s?s?u?d?l +?l?u?l?s?s?u?d?u +?l?u?l?s?s?u?d?s +?l?u?l?s?s?u?l?d +?l?u?l?s?s?u?u?d +?l?u?l?s?s?u?s?d +?l?u?l?s?s?s?d?d +?l?u?l?s?s?s?d?l +?l?u?l?s?s?s?d?u +?l?u?l?s?s?s?d?s +?l?u?l?s?s?s?l?d +?l?u?l?s?s?s?u?d +?l?u?l?s?s?s?s?d +?l?u?u?d?d?d?d?s +?l?u?u?d?d?d?l?s +?l?u?u?d?d?d?u?s +?l?u?u?d?d?d?s?d +?l?u?u?d?d?d?s?l +?l?u?u?d?d?d?s?u +?l?u?u?d?d?d?s?s +?l?u?u?d?d?l?d?s +?l?u?u?d?d?l?l?s +?l?u?u?d?d?l?u?s +?l?u?u?d?d?l?s?d +?l?u?u?d?d?l?s?l +?l?u?u?d?d?l?s?u +?l?u?u?d?d?l?s?s +?l?u?u?d?d?u?d?s +?l?u?u?d?d?u?l?s +?l?u?u?d?d?u?u?s +?l?u?u?d?d?u?s?d +?l?u?u?d?d?u?s?l +?l?u?u?d?d?u?s?u +?l?u?u?d?d?u?s?s +?l?u?u?d?d?s?d?d +?l?u?u?d?d?s?d?l +?l?u?u?d?d?s?d?u +?l?u?u?d?d?s?d?s +?l?u?u?d?d?s?l?d +?l?u?u?d?d?s?l?l +?l?u?u?d?d?s?l?u +?l?u?u?d?d?s?l?s +?l?u?u?d?d?s?u?d +?l?u?u?d?d?s?u?l +?l?u?u?d?d?s?u?u +?l?u?u?d?d?s?u?s +?l?u?u?d?d?s?s?d +?l?u?u?d?d?s?s?l +?l?u?u?d?d?s?s?u +?l?u?u?d?d?s?s?s +?l?u?u?d?l?d?d?s +?l?u?u?d?l?d?l?s +?l?u?u?d?l?d?u?s +?l?u?u?d?l?d?s?d +?l?u?u?d?l?d?s?l +?l?u?u?d?l?d?s?u +?l?u?u?d?l?d?s?s +?l?u?u?d?l?l?d?s +?l?u?u?d?l?l?l?s +?l?u?u?d?l?l?u?s +?l?u?u?d?l?l?s?d +?l?u?u?d?l?l?s?l +?l?u?u?d?l?l?s?u +?l?u?u?d?l?l?s?s +?l?u?u?d?l?u?d?s +?l?u?u?d?l?u?l?s +?l?u?u?d?l?u?u?s +?l?u?u?d?l?u?s?d +?l?u?u?d?l?u?s?l +?l?u?u?d?l?u?s?u +?l?u?u?d?l?u?s?s +?l?u?u?d?l?s?d?d +?l?u?u?d?l?s?d?l +?l?u?u?d?l?s?d?u +?l?u?u?d?l?s?d?s +?l?u?u?d?l?s?l?d +?l?u?u?d?l?s?l?l +?l?u?u?d?l?s?l?u +?l?u?u?d?l?s?l?s +?l?u?u?d?l?s?u?d +?l?u?u?d?l?s?u?l +?l?u?u?d?l?s?u?u +?l?u?u?d?l?s?u?s +?l?u?u?d?l?s?s?d +?l?u?u?d?l?s?s?l +?l?u?u?d?l?s?s?u +?l?u?u?d?l?s?s?s +?l?u?u?d?u?d?d?s +?l?u?u?d?u?d?l?s +?l?u?u?d?u?d?u?s +?l?u?u?d?u?d?s?d +?l?u?u?d?u?d?s?l +?l?u?u?d?u?d?s?u +?l?u?u?d?u?d?s?s +?l?u?u?d?u?l?d?s +?l?u?u?d?u?l?l?s +?l?u?u?d?u?l?u?s +?l?u?u?d?u?l?s?d +?l?u?u?d?u?l?s?l +?l?u?u?d?u?l?s?u +?l?u?u?d?u?l?s?s +?l?u?u?d?u?u?d?s +?l?u?u?d?u?u?l?s +?l?u?u?d?u?u?u?s +?l?u?u?d?u?u?s?d +?l?u?u?d?u?u?s?l +?l?u?u?d?u?u?s?u +?l?u?u?d?u?u?s?s +?l?u?u?d?u?s?d?d +?l?u?u?d?u?s?d?l +?l?u?u?d?u?s?d?u +?l?u?u?d?u?s?d?s +?l?u?u?d?u?s?l?d +?l?u?u?d?u?s?l?l +?l?u?u?d?u?s?l?u +?l?u?u?d?u?s?l?s +?l?u?u?d?u?s?u?d +?l?u?u?d?u?s?u?l +?l?u?u?d?u?s?u?u +?l?u?u?d?u?s?u?s +?l?u?u?d?u?s?s?d +?l?u?u?d?u?s?s?l +?l?u?u?d?u?s?s?u +?l?u?u?d?u?s?s?s +?l?u?u?d?s?d?d?d +?l?u?u?d?s?d?d?l +?l?u?u?d?s?d?d?u +?l?u?u?d?s?d?d?s +?l?u?u?d?s?d?l?d +?l?u?u?d?s?d?l?l +?l?u?u?d?s?d?l?u +?l?u?u?d?s?d?l?s +?l?u?u?d?s?d?u?d +?l?u?u?d?s?d?u?l +?l?u?u?d?s?d?u?u +?l?u?u?d?s?d?u?s +?l?u?u?d?s?d?s?d +?l?u?u?d?s?d?s?l +?l?u?u?d?s?d?s?u +?l?u?u?d?s?d?s?s +?l?u?u?d?s?l?d?d +?l?u?u?d?s?l?d?l +?l?u?u?d?s?l?d?u +?l?u?u?d?s?l?d?s +?l?u?u?d?s?l?l?d +?l?u?u?d?s?l?l?l +?l?u?u?d?s?l?l?u +?l?u?u?d?s?l?l?s +?l?u?u?d?s?l?u?d +?l?u?u?d?s?l?u?l +?l?u?u?d?s?l?u?u +?l?u?u?d?s?l?u?s +?l?u?u?d?s?l?s?d +?l?u?u?d?s?l?s?l +?l?u?u?d?s?l?s?u +?l?u?u?d?s?l?s?s +?l?u?u?d?s?u?d?d +?l?u?u?d?s?u?d?l +?l?u?u?d?s?u?d?u +?l?u?u?d?s?u?d?s +?l?u?u?d?s?u?l?d +?l?u?u?d?s?u?l?l +?l?u?u?d?s?u?l?u +?l?u?u?d?s?u?l?s +?l?u?u?d?s?u?u?d +?l?u?u?d?s?u?u?l +?l?u?u?d?s?u?u?u +?l?u?u?d?s?u?u?s +?l?u?u?d?s?u?s?d +?l?u?u?d?s?u?s?l +?l?u?u?d?s?u?s?u +?l?u?u?d?s?u?s?s +?l?u?u?d?s?s?d?d +?l?u?u?d?s?s?d?l +?l?u?u?d?s?s?d?u +?l?u?u?d?s?s?d?s +?l?u?u?d?s?s?l?d +?l?u?u?d?s?s?l?l +?l?u?u?d?s?s?l?u +?l?u?u?d?s?s?l?s +?l?u?u?d?s?s?u?d +?l?u?u?d?s?s?u?l +?l?u?u?d?s?s?u?u +?l?u?u?d?s?s?u?s +?l?u?u?d?s?s?s?d +?l?u?u?d?s?s?s?l +?l?u?u?d?s?s?s?u +?l?u?u?d?s?s?s?s +?l?u?u?l?d?d?d?s +?l?u?u?l?d?d?l?s +?l?u?u?l?d?d?u?s +?l?u?u?l?d?d?s?d +?l?u?u?l?d?d?s?l +?l?u?u?l?d?d?s?u +?l?u?u?l?d?d?s?s +?l?u?u?l?d?l?d?s +?l?u?u?l?d?l?l?s +?l?u?u?l?d?l?u?s +?l?u?u?l?d?l?s?d +?l?u?u?l?d?l?s?l +?l?u?u?l?d?l?s?u +?l?u?u?l?d?l?s?s +?l?u?u?l?d?u?d?s +?l?u?u?l?d?u?l?s +?l?u?u?l?d?u?u?s +?l?u?u?l?d?u?s?d +?l?u?u?l?d?u?s?l +?l?u?u?l?d?u?s?u +?l?u?u?l?d?u?s?s +?l?u?u?l?d?s?d?d +?l?u?u?l?d?s?d?l +?l?u?u?l?d?s?d?u +?l?u?u?l?d?s?d?s +?l?u?u?l?d?s?l?d +?l?u?u?l?d?s?l?l +?l?u?u?l?d?s?l?u +?l?u?u?l?d?s?l?s +?l?u?u?l?d?s?u?d +?l?u?u?l?d?s?u?l +?l?u?u?l?d?s?u?u +?l?u?u?l?d?s?u?s +?l?u?u?l?d?s?s?d +?l?u?u?l?d?s?s?l +?l?u?u?l?d?s?s?u +?l?u?u?l?d?s?s?s +?l?u?u?l?l?d?d?s +?l?u?u?l?l?d?l?s +?l?u?u?l?l?d?u?s +?l?u?u?l?l?d?s?d +?l?u?u?l?l?d?s?l +?l?u?u?l?l?d?s?u +?l?u?u?l?l?d?s?s +?l?u?u?l?l?l?d?s +?l?u?u?l?l?l?s?d +?l?u?u?l?l?u?d?s +?l?u?u?l?l?u?s?d +?l?u?u?l?l?s?d?d +?l?u?u?l?l?s?d?l +?l?u?u?l?l?s?d?u +?l?u?u?l?l?s?d?s +?l?u?u?l?l?s?l?d +?l?u?u?l?l?s?u?d +?l?u?u?l?l?s?s?d +?l?u?u?l?u?d?d?s +?l?u?u?l?u?d?l?s +?l?u?u?l?u?d?u?s +?l?u?u?l?u?d?s?d +?l?u?u?l?u?d?s?l +?l?u?u?l?u?d?s?u +?l?u?u?l?u?d?s?s +?l?u?u?l?u?l?d?s +?l?u?u?l?u?l?s?d +?l?u?u?l?u?u?d?s +?l?u?u?l?u?u?s?d +?l?u?u?l?u?s?d?d +?l?u?u?l?u?s?d?l +?l?u?u?l?u?s?d?u +?l?u?u?l?u?s?d?s +?l?u?u?l?u?s?l?d +?l?u?u?l?u?s?u?d +?l?u?u?l?u?s?s?d +?l?u?u?l?s?d?d?d +?l?u?u?l?s?d?d?l +?l?u?u?l?s?d?d?u +?l?u?u?l?s?d?d?s +?l?u?u?l?s?d?l?d +?l?u?u?l?s?d?l?l +?l?u?u?l?s?d?l?u +?l?u?u?l?s?d?l?s +?l?u?u?l?s?d?u?d +?l?u?u?l?s?d?u?l +?l?u?u?l?s?d?u?u +?l?u?u?l?s?d?u?s +?l?u?u?l?s?d?s?d +?l?u?u?l?s?d?s?l +?l?u?u?l?s?d?s?u +?l?u?u?l?s?d?s?s +?l?u?u?l?s?l?d?d +?l?u?u?l?s?l?d?l +?l?u?u?l?s?l?d?u +?l?u?u?l?s?l?d?s +?l?u?u?l?s?l?l?d +?l?u?u?l?s?l?u?d +?l?u?u?l?s?l?s?d +?l?u?u?l?s?u?d?d +?l?u?u?l?s?u?d?l +?l?u?u?l?s?u?d?u +?l?u?u?l?s?u?d?s +?l?u?u?l?s?u?l?d +?l?u?u?l?s?u?u?d +?l?u?u?l?s?u?s?d +?l?u?u?l?s?s?d?d +?l?u?u?l?s?s?d?l +?l?u?u?l?s?s?d?u +?l?u?u?l?s?s?d?s +?l?u?u?l?s?s?l?d +?l?u?u?l?s?s?u?d +?l?u?u?l?s?s?s?d +?l?u?u?u?d?d?d?s +?l?u?u?u?d?d?l?s +?l?u?u?u?d?d?u?s +?l?u?u?u?d?d?s?d +?l?u?u?u?d?d?s?l +?l?u?u?u?d?d?s?u +?l?u?u?u?d?d?s?s +?l?u?u?u?d?l?d?s +?l?u?u?u?d?l?l?s +?l?u?u?u?d?l?u?s +?l?u?u?u?d?l?s?d +?l?u?u?u?d?l?s?l +?l?u?u?u?d?l?s?u +?l?u?u?u?d?l?s?s +?l?u?u?u?d?u?d?s +?l?u?u?u?d?u?l?s +?l?u?u?u?d?u?u?s +?l?u?u?u?d?u?s?d +?l?u?u?u?d?u?s?l +?l?u?u?u?d?u?s?u +?l?u?u?u?d?u?s?s +?l?u?u?u?d?s?d?d +?l?u?u?u?d?s?d?l +?l?u?u?u?d?s?d?u +?l?u?u?u?d?s?d?s +?l?u?u?u?d?s?l?d +?l?u?u?u?d?s?l?l +?l?u?u?u?d?s?l?u +?l?u?u?u?d?s?l?s +?l?u?u?u?d?s?u?d +?l?u?u?u?d?s?u?l +?l?u?u?u?d?s?u?u +?l?u?u?u?d?s?u?s +?l?u?u?u?d?s?s?d +?l?u?u?u?d?s?s?l +?l?u?u?u?d?s?s?u +?l?u?u?u?d?s?s?s +?l?u?u?u?l?d?d?s +?l?u?u?u?l?d?l?s +?l?u?u?u?l?d?u?s +?l?u?u?u?l?d?s?d +?l?u?u?u?l?d?s?l +?l?u?u?u?l?d?s?u +?l?u?u?u?l?d?s?s +?l?u?u?u?l?l?d?s +?l?u?u?u?l?l?s?d +?l?u?u?u?l?u?d?s +?l?u?u?u?l?u?s?d +?l?u?u?u?l?s?d?d +?l?u?u?u?l?s?d?l +?l?u?u?u?l?s?d?u +?l?u?u?u?l?s?d?s +?l?u?u?u?l?s?l?d +?l?u?u?u?l?s?u?d +?l?u?u?u?l?s?s?d +?l?u?u?u?u?d?d?s +?l?u?u?u?u?d?l?s +?l?u?u?u?u?d?u?s +?l?u?u?u?u?d?s?d +?l?u?u?u?u?d?s?l +?l?u?u?u?u?d?s?u +?l?u?u?u?u?d?s?s +?l?u?u?u?u?l?d?s +?l?u?u?u?u?l?s?d +?l?u?u?u?u?u?d?s +?l?u?u?u?u?u?s?d +?l?u?u?u?u?s?d?d +?l?u?u?u?u?s?d?l +?l?u?u?u?u?s?d?u +?l?u?u?u?u?s?d?s +?l?u?u?u?u?s?l?d +?l?u?u?u?u?s?u?d +?l?u?u?u?u?s?s?d +?l?u?u?u?s?d?d?d +?l?u?u?u?s?d?d?l +?l?u?u?u?s?d?d?u +?l?u?u?u?s?d?d?s +?l?u?u?u?s?d?l?d +?l?u?u?u?s?d?l?l +?l?u?u?u?s?d?l?u +?l?u?u?u?s?d?l?s +?l?u?u?u?s?d?u?d +?l?u?u?u?s?d?u?l +?l?u?u?u?s?d?u?u +?l?u?u?u?s?d?u?s +?l?u?u?u?s?d?s?d +?l?u?u?u?s?d?s?l +?l?u?u?u?s?d?s?u +?l?u?u?u?s?d?s?s +?l?u?u?u?s?l?d?d +?l?u?u?u?s?l?d?l +?l?u?u?u?s?l?d?u +?l?u?u?u?s?l?d?s +?l?u?u?u?s?l?l?d +?l?u?u?u?s?l?u?d +?l?u?u?u?s?l?s?d +?l?u?u?u?s?u?d?d +?l?u?u?u?s?u?d?l +?l?u?u?u?s?u?d?u +?l?u?u?u?s?u?d?s +?l?u?u?u?s?u?l?d +?l?u?u?u?s?u?u?d +?l?u?u?u?s?u?s?d +?l?u?u?u?s?s?d?d +?l?u?u?u?s?s?d?l +?l?u?u?u?s?s?d?u +?l?u?u?u?s?s?d?s +?l?u?u?u?s?s?l?d +?l?u?u?u?s?s?u?d +?l?u?u?u?s?s?s?d +?l?u?u?s?d?d?d?d +?l?u?u?s?d?d?d?l +?l?u?u?s?d?d?d?u +?l?u?u?s?d?d?d?s +?l?u?u?s?d?d?l?d +?l?u?u?s?d?d?l?l +?l?u?u?s?d?d?l?u +?l?u?u?s?d?d?l?s +?l?u?u?s?d?d?u?d +?l?u?u?s?d?d?u?l +?l?u?u?s?d?d?u?u +?l?u?u?s?d?d?u?s +?l?u?u?s?d?d?s?d +?l?u?u?s?d?d?s?l +?l?u?u?s?d?d?s?u +?l?u?u?s?d?d?s?s +?l?u?u?s?d?l?d?d +?l?u?u?s?d?l?d?l +?l?u?u?s?d?l?d?u +?l?u?u?s?d?l?d?s +?l?u?u?s?d?l?l?d +?l?u?u?s?d?l?l?l +?l?u?u?s?d?l?l?u +?l?u?u?s?d?l?l?s +?l?u?u?s?d?l?u?d +?l?u?u?s?d?l?u?l +?l?u?u?s?d?l?u?u +?l?u?u?s?d?l?u?s +?l?u?u?s?d?l?s?d +?l?u?u?s?d?l?s?l +?l?u?u?s?d?l?s?u +?l?u?u?s?d?l?s?s +?l?u?u?s?d?u?d?d +?l?u?u?s?d?u?d?l +?l?u?u?s?d?u?d?u +?l?u?u?s?d?u?d?s +?l?u?u?s?d?u?l?d +?l?u?u?s?d?u?l?l +?l?u?u?s?d?u?l?u +?l?u?u?s?d?u?l?s +?l?u?u?s?d?u?u?d +?l?u?u?s?d?u?u?l +?l?u?u?s?d?u?u?u +?l?u?u?s?d?u?u?s +?l?u?u?s?d?u?s?d +?l?u?u?s?d?u?s?l +?l?u?u?s?d?u?s?u +?l?u?u?s?d?u?s?s +?l?u?u?s?d?s?d?d +?l?u?u?s?d?s?d?l +?l?u?u?s?d?s?d?u +?l?u?u?s?d?s?d?s +?l?u?u?s?d?s?l?d +?l?u?u?s?d?s?l?l +?l?u?u?s?d?s?l?u +?l?u?u?s?d?s?l?s +?l?u?u?s?d?s?u?d +?l?u?u?s?d?s?u?l +?l?u?u?s?d?s?u?u +?l?u?u?s?d?s?u?s +?l?u?u?s?d?s?s?d +?l?u?u?s?d?s?s?l +?l?u?u?s?d?s?s?u +?l?u?u?s?d?s?s?s +?l?u?u?s?l?d?d?d +?l?u?u?s?l?d?d?l +?l?u?u?s?l?d?d?u +?l?u?u?s?l?d?d?s +?l?u?u?s?l?d?l?d +?l?u?u?s?l?d?l?l +?l?u?u?s?l?d?l?u +?l?u?u?s?l?d?l?s +?l?u?u?s?l?d?u?d +?l?u?u?s?l?d?u?l +?l?u?u?s?l?d?u?u +?l?u?u?s?l?d?u?s +?l?u?u?s?l?d?s?d +?l?u?u?s?l?d?s?l +?l?u?u?s?l?d?s?u +?l?u?u?s?l?d?s?s +?l?u?u?s?l?l?d?d +?l?u?u?s?l?l?d?l +?l?u?u?s?l?l?d?u +?l?u?u?s?l?l?d?s +?l?u?u?s?l?l?l?d +?l?u?u?s?l?l?u?d +?l?u?u?s?l?l?s?d +?l?u?u?s?l?u?d?d +?l?u?u?s?l?u?d?l +?l?u?u?s?l?u?d?u +?l?u?u?s?l?u?d?s +?l?u?u?s?l?u?l?d +?l?u?u?s?l?u?u?d +?l?u?u?s?l?u?s?d +?l?u?u?s?l?s?d?d +?l?u?u?s?l?s?d?l +?l?u?u?s?l?s?d?u +?l?u?u?s?l?s?d?s +?l?u?u?s?l?s?l?d +?l?u?u?s?l?s?u?d +?l?u?u?s?l?s?s?d +?l?u?u?s?u?d?d?d +?l?u?u?s?u?d?d?l +?l?u?u?s?u?d?d?u +?l?u?u?s?u?d?d?s +?l?u?u?s?u?d?l?d +?l?u?u?s?u?d?l?l +?l?u?u?s?u?d?l?u +?l?u?u?s?u?d?l?s +?l?u?u?s?u?d?u?d +?l?u?u?s?u?d?u?l +?l?u?u?s?u?d?u?u +?l?u?u?s?u?d?u?s +?l?u?u?s?u?d?s?d +?l?u?u?s?u?d?s?l +?l?u?u?s?u?d?s?u +?l?u?u?s?u?d?s?s +?l?u?u?s?u?l?d?d +?l?u?u?s?u?l?d?l +?l?u?u?s?u?l?d?u +?l?u?u?s?u?l?d?s +?l?u?u?s?u?l?l?d +?l?u?u?s?u?l?u?d +?l?u?u?s?u?l?s?d +?l?u?u?s?u?u?d?d +?l?u?u?s?u?u?d?l +?l?u?u?s?u?u?d?u +?l?u?u?s?u?u?d?s +?l?u?u?s?u?u?l?d +?l?u?u?s?u?u?u?d +?l?u?u?s?u?u?s?d +?l?u?u?s?u?s?d?d +?l?u?u?s?u?s?d?l +?l?u?u?s?u?s?d?u +?l?u?u?s?u?s?d?s +?l?u?u?s?u?s?l?d +?l?u?u?s?u?s?u?d +?l?u?u?s?u?s?s?d +?l?u?u?s?s?d?d?d +?l?u?u?s?s?d?d?l +?l?u?u?s?s?d?d?u +?l?u?u?s?s?d?d?s +?l?u?u?s?s?d?l?d +?l?u?u?s?s?d?l?l +?l?u?u?s?s?d?l?u +?l?u?u?s?s?d?l?s +?l?u?u?s?s?d?u?d +?l?u?u?s?s?d?u?l +?l?u?u?s?s?d?u?u +?l?u?u?s?s?d?u?s +?l?u?u?s?s?d?s?d +?l?u?u?s?s?d?s?l +?l?u?u?s?s?d?s?u +?l?u?u?s?s?d?s?s +?l?u?u?s?s?l?d?d +?l?u?u?s?s?l?d?l +?l?u?u?s?s?l?d?u +?l?u?u?s?s?l?d?s +?l?u?u?s?s?l?l?d +?l?u?u?s?s?l?u?d +?l?u?u?s?s?l?s?d +?l?u?u?s?s?u?d?d +?l?u?u?s?s?u?d?l +?l?u?u?s?s?u?d?u +?l?u?u?s?s?u?d?s +?l?u?u?s?s?u?l?d +?l?u?u?s?s?u?u?d +?l?u?u?s?s?u?s?d +?l?u?u?s?s?s?d?d +?l?u?u?s?s?s?d?l +?l?u?u?s?s?s?d?u +?l?u?u?s?s?s?d?s +?l?u?u?s?s?s?l?d +?l?u?u?s?s?s?u?d +?l?u?u?s?s?s?s?d +?l?u?s?d?d?d?d?d +?l?u?s?d?d?d?d?l +?l?u?s?d?d?d?d?u +?l?u?s?d?d?d?d?s +?l?u?s?d?d?d?l?d +?l?u?s?d?d?d?l?l +?l?u?s?d?d?d?l?u +?l?u?s?d?d?d?l?s +?l?u?s?d?d?d?u?d +?l?u?s?d?d?d?u?l +?l?u?s?d?d?d?u?u +?l?u?s?d?d?d?u?s +?l?u?s?d?d?d?s?d +?l?u?s?d?d?d?s?l +?l?u?s?d?d?d?s?u +?l?u?s?d?d?d?s?s +?l?u?s?d?d?l?d?d +?l?u?s?d?d?l?d?l +?l?u?s?d?d?l?d?u +?l?u?s?d?d?l?d?s +?l?u?s?d?d?l?l?d +?l?u?s?d?d?l?l?l +?l?u?s?d?d?l?l?u +?l?u?s?d?d?l?l?s +?l?u?s?d?d?l?u?d +?l?u?s?d?d?l?u?l +?l?u?s?d?d?l?u?u +?l?u?s?d?d?l?u?s +?l?u?s?d?d?l?s?d +?l?u?s?d?d?l?s?l +?l?u?s?d?d?l?s?u +?l?u?s?d?d?l?s?s +?l?u?s?d?d?u?d?d +?l?u?s?d?d?u?d?l +?l?u?s?d?d?u?d?u +?l?u?s?d?d?u?d?s +?l?u?s?d?d?u?l?d +?l?u?s?d?d?u?l?l +?l?u?s?d?d?u?l?u +?l?u?s?d?d?u?l?s +?l?u?s?d?d?u?u?d +?l?u?s?d?d?u?u?l +?l?u?s?d?d?u?u?u +?l?u?s?d?d?u?u?s +?l?u?s?d?d?u?s?d +?l?u?s?d?d?u?s?l +?l?u?s?d?d?u?s?u +?l?u?s?d?d?u?s?s +?l?u?s?d?d?s?d?d +?l?u?s?d?d?s?d?l +?l?u?s?d?d?s?d?u +?l?u?s?d?d?s?d?s +?l?u?s?d?d?s?l?d +?l?u?s?d?d?s?l?l +?l?u?s?d?d?s?l?u +?l?u?s?d?d?s?l?s +?l?u?s?d?d?s?u?d +?l?u?s?d?d?s?u?l +?l?u?s?d?d?s?u?u +?l?u?s?d?d?s?u?s +?l?u?s?d?d?s?s?d +?l?u?s?d?d?s?s?l +?l?u?s?d?d?s?s?u +?l?u?s?d?d?s?s?s +?l?u?s?d?l?d?d?d +?l?u?s?d?l?d?d?l +?l?u?s?d?l?d?d?u +?l?u?s?d?l?d?d?s +?l?u?s?d?l?d?l?d +?l?u?s?d?l?d?l?l +?l?u?s?d?l?d?l?u +?l?u?s?d?l?d?l?s +?l?u?s?d?l?d?u?d +?l?u?s?d?l?d?u?l +?l?u?s?d?l?d?u?u +?l?u?s?d?l?d?u?s +?l?u?s?d?l?d?s?d +?l?u?s?d?l?d?s?l +?l?u?s?d?l?d?s?u +?l?u?s?d?l?d?s?s +?l?u?s?d?l?l?d?d +?l?u?s?d?l?l?d?l +?l?u?s?d?l?l?d?u +?l?u?s?d?l?l?d?s +?l?u?s?d?l?l?l?d +?l?u?s?d?l?l?l?l +?l?u?s?d?l?l?l?u +?l?u?s?d?l?l?l?s +?l?u?s?d?l?l?u?d +?l?u?s?d?l?l?u?l +?l?u?s?d?l?l?u?u +?l?u?s?d?l?l?u?s +?l?u?s?d?l?l?s?d +?l?u?s?d?l?l?s?l +?l?u?s?d?l?l?s?u +?l?u?s?d?l?l?s?s +?l?u?s?d?l?u?d?d +?l?u?s?d?l?u?d?l +?l?u?s?d?l?u?d?u +?l?u?s?d?l?u?d?s +?l?u?s?d?l?u?l?d +?l?u?s?d?l?u?l?l +?l?u?s?d?l?u?l?u +?l?u?s?d?l?u?l?s +?l?u?s?d?l?u?u?d +?l?u?s?d?l?u?u?l +?l?u?s?d?l?u?u?u +?l?u?s?d?l?u?u?s +?l?u?s?d?l?u?s?d +?l?u?s?d?l?u?s?l +?l?u?s?d?l?u?s?u +?l?u?s?d?l?u?s?s +?l?u?s?d?l?s?d?d +?l?u?s?d?l?s?d?l +?l?u?s?d?l?s?d?u +?l?u?s?d?l?s?d?s +?l?u?s?d?l?s?l?d +?l?u?s?d?l?s?l?l +?l?u?s?d?l?s?l?u +?l?u?s?d?l?s?l?s +?l?u?s?d?l?s?u?d +?l?u?s?d?l?s?u?l +?l?u?s?d?l?s?u?u +?l?u?s?d?l?s?u?s +?l?u?s?d?l?s?s?d +?l?u?s?d?l?s?s?l +?l?u?s?d?l?s?s?u +?l?u?s?d?l?s?s?s +?l?u?s?d?u?d?d?d +?l?u?s?d?u?d?d?l +?l?u?s?d?u?d?d?u +?l?u?s?d?u?d?d?s +?l?u?s?d?u?d?l?d +?l?u?s?d?u?d?l?l +?l?u?s?d?u?d?l?u +?l?u?s?d?u?d?l?s +?l?u?s?d?u?d?u?d +?l?u?s?d?u?d?u?l +?l?u?s?d?u?d?u?u +?l?u?s?d?u?d?u?s +?l?u?s?d?u?d?s?d +?l?u?s?d?u?d?s?l +?l?u?s?d?u?d?s?u +?l?u?s?d?u?d?s?s +?l?u?s?d?u?l?d?d +?l?u?s?d?u?l?d?l +?l?u?s?d?u?l?d?u +?l?u?s?d?u?l?d?s +?l?u?s?d?u?l?l?d +?l?u?s?d?u?l?l?l +?l?u?s?d?u?l?l?u +?l?u?s?d?u?l?l?s +?l?u?s?d?u?l?u?d +?l?u?s?d?u?l?u?l +?l?u?s?d?u?l?u?u +?l?u?s?d?u?l?u?s +?l?u?s?d?u?l?s?d +?l?u?s?d?u?l?s?l +?l?u?s?d?u?l?s?u +?l?u?s?d?u?l?s?s +?l?u?s?d?u?u?d?d +?l?u?s?d?u?u?d?l +?l?u?s?d?u?u?d?u +?l?u?s?d?u?u?d?s +?l?u?s?d?u?u?l?d +?l?u?s?d?u?u?l?l +?l?u?s?d?u?u?l?u +?l?u?s?d?u?u?l?s +?l?u?s?d?u?u?u?d +?l?u?s?d?u?u?u?l +?l?u?s?d?u?u?u?u +?l?u?s?d?u?u?u?s +?l?u?s?d?u?u?s?d +?l?u?s?d?u?u?s?l +?l?u?s?d?u?u?s?u +?l?u?s?d?u?u?s?s +?l?u?s?d?u?s?d?d +?l?u?s?d?u?s?d?l +?l?u?s?d?u?s?d?u +?l?u?s?d?u?s?d?s +?l?u?s?d?u?s?l?d +?l?u?s?d?u?s?l?l +?l?u?s?d?u?s?l?u +?l?u?s?d?u?s?l?s +?l?u?s?d?u?s?u?d +?l?u?s?d?u?s?u?l +?l?u?s?d?u?s?u?u +?l?u?s?d?u?s?u?s +?l?u?s?d?u?s?s?d +?l?u?s?d?u?s?s?l +?l?u?s?d?u?s?s?u +?l?u?s?d?u?s?s?s +?l?u?s?d?s?d?d?d +?l?u?s?d?s?d?d?l +?l?u?s?d?s?d?d?u +?l?u?s?d?s?d?d?s +?l?u?s?d?s?d?l?d +?l?u?s?d?s?d?l?l +?l?u?s?d?s?d?l?u +?l?u?s?d?s?d?l?s +?l?u?s?d?s?d?u?d +?l?u?s?d?s?d?u?l +?l?u?s?d?s?d?u?u +?l?u?s?d?s?d?u?s +?l?u?s?d?s?d?s?d +?l?u?s?d?s?d?s?l +?l?u?s?d?s?d?s?u +?l?u?s?d?s?d?s?s +?l?u?s?d?s?l?d?d +?l?u?s?d?s?l?d?l +?l?u?s?d?s?l?d?u +?l?u?s?d?s?l?d?s +?l?u?s?d?s?l?l?d +?l?u?s?d?s?l?l?l +?l?u?s?d?s?l?l?u +?l?u?s?d?s?l?l?s +?l?u?s?d?s?l?u?d +?l?u?s?d?s?l?u?l +?l?u?s?d?s?l?u?u +?l?u?s?d?s?l?u?s +?l?u?s?d?s?l?s?d +?l?u?s?d?s?l?s?l +?l?u?s?d?s?l?s?u +?l?u?s?d?s?l?s?s +?l?u?s?d?s?u?d?d +?l?u?s?d?s?u?d?l +?l?u?s?d?s?u?d?u +?l?u?s?d?s?u?d?s +?l?u?s?d?s?u?l?d +?l?u?s?d?s?u?l?l +?l?u?s?d?s?u?l?u +?l?u?s?d?s?u?l?s +?l?u?s?d?s?u?u?d +?l?u?s?d?s?u?u?l +?l?u?s?d?s?u?u?u +?l?u?s?d?s?u?u?s +?l?u?s?d?s?u?s?d +?l?u?s?d?s?u?s?l +?l?u?s?d?s?u?s?u +?l?u?s?d?s?u?s?s +?l?u?s?d?s?s?d?d +?l?u?s?d?s?s?d?l +?l?u?s?d?s?s?d?u +?l?u?s?d?s?s?d?s +?l?u?s?d?s?s?l?d +?l?u?s?d?s?s?l?l +?l?u?s?d?s?s?l?u +?l?u?s?d?s?s?l?s +?l?u?s?d?s?s?u?d +?l?u?s?d?s?s?u?l +?l?u?s?d?s?s?u?u +?l?u?s?d?s?s?u?s +?l?u?s?d?s?s?s?d +?l?u?s?d?s?s?s?l +?l?u?s?d?s?s?s?u +?l?u?s?d?s?s?s?s +?l?u?s?l?d?d?d?d +?l?u?s?l?d?d?d?l +?l?u?s?l?d?d?d?u +?l?u?s?l?d?d?d?s +?l?u?s?l?d?d?l?d +?l?u?s?l?d?d?l?l +?l?u?s?l?d?d?l?u +?l?u?s?l?d?d?l?s +?l?u?s?l?d?d?u?d +?l?u?s?l?d?d?u?l +?l?u?s?l?d?d?u?u +?l?u?s?l?d?d?u?s +?l?u?s?l?d?d?s?d +?l?u?s?l?d?d?s?l +?l?u?s?l?d?d?s?u +?l?u?s?l?d?d?s?s +?l?u?s?l?d?l?d?d +?l?u?s?l?d?l?d?l +?l?u?s?l?d?l?d?u +?l?u?s?l?d?l?d?s +?l?u?s?l?d?l?l?d +?l?u?s?l?d?l?l?l +?l?u?s?l?d?l?l?u +?l?u?s?l?d?l?l?s +?l?u?s?l?d?l?u?d +?l?u?s?l?d?l?u?l +?l?u?s?l?d?l?u?u +?l?u?s?l?d?l?u?s +?l?u?s?l?d?l?s?d +?l?u?s?l?d?l?s?l +?l?u?s?l?d?l?s?u +?l?u?s?l?d?l?s?s +?l?u?s?l?d?u?d?d +?l?u?s?l?d?u?d?l +?l?u?s?l?d?u?d?u +?l?u?s?l?d?u?d?s +?l?u?s?l?d?u?l?d +?l?u?s?l?d?u?l?l +?l?u?s?l?d?u?l?u +?l?u?s?l?d?u?l?s +?l?u?s?l?d?u?u?d +?l?u?s?l?d?u?u?l +?l?u?s?l?d?u?u?u +?l?u?s?l?d?u?u?s +?l?u?s?l?d?u?s?d +?l?u?s?l?d?u?s?l +?l?u?s?l?d?u?s?u +?l?u?s?l?d?u?s?s +?l?u?s?l?d?s?d?d +?l?u?s?l?d?s?d?l +?l?u?s?l?d?s?d?u +?l?u?s?l?d?s?d?s +?l?u?s?l?d?s?l?d +?l?u?s?l?d?s?l?l +?l?u?s?l?d?s?l?u +?l?u?s?l?d?s?l?s +?l?u?s?l?d?s?u?d +?l?u?s?l?d?s?u?l +?l?u?s?l?d?s?u?u +?l?u?s?l?d?s?u?s +?l?u?s?l?d?s?s?d +?l?u?s?l?d?s?s?l +?l?u?s?l?d?s?s?u +?l?u?s?l?d?s?s?s +?l?u?s?l?l?d?d?d +?l?u?s?l?l?d?d?l +?l?u?s?l?l?d?d?u +?l?u?s?l?l?d?d?s +?l?u?s?l?l?d?l?d +?l?u?s?l?l?d?l?l +?l?u?s?l?l?d?l?u +?l?u?s?l?l?d?l?s +?l?u?s?l?l?d?u?d +?l?u?s?l?l?d?u?l +?l?u?s?l?l?d?u?u +?l?u?s?l?l?d?u?s +?l?u?s?l?l?d?s?d +?l?u?s?l?l?d?s?l +?l?u?s?l?l?d?s?u +?l?u?s?l?l?d?s?s +?l?u?s?l?l?l?d?d +?l?u?s?l?l?l?d?l +?l?u?s?l?l?l?d?u +?l?u?s?l?l?l?d?s +?l?u?s?l?l?l?l?d +?l?u?s?l?l?l?u?d +?l?u?s?l?l?l?s?d +?l?u?s?l?l?u?d?d +?l?u?s?l?l?u?d?l +?l?u?s?l?l?u?d?u +?l?u?s?l?l?u?d?s +?l?u?s?l?l?u?l?d +?l?u?s?l?l?u?u?d +?l?u?s?l?l?u?s?d +?l?u?s?l?l?s?d?d +?l?u?s?l?l?s?d?l +?l?u?s?l?l?s?d?u +?l?u?s?l?l?s?d?s +?l?u?s?l?l?s?l?d +?l?u?s?l?l?s?u?d +?l?u?s?l?l?s?s?d +?l?u?s?l?u?d?d?d +?l?u?s?l?u?d?d?l +?l?u?s?l?u?d?d?u +?l?u?s?l?u?d?d?s +?l?u?s?l?u?d?l?d +?l?u?s?l?u?d?l?l +?l?u?s?l?u?d?l?u +?l?u?s?l?u?d?l?s +?l?u?s?l?u?d?u?d +?l?u?s?l?u?d?u?l +?l?u?s?l?u?d?u?u +?l?u?s?l?u?d?u?s +?l?u?s?l?u?d?s?d +?l?u?s?l?u?d?s?l +?l?u?s?l?u?d?s?u +?l?u?s?l?u?d?s?s +?l?u?s?l?u?l?d?d +?l?u?s?l?u?l?d?l +?l?u?s?l?u?l?d?u +?l?u?s?l?u?l?d?s +?l?u?s?l?u?l?l?d +?l?u?s?l?u?l?u?d +?l?u?s?l?u?l?s?d +?l?u?s?l?u?u?d?d +?l?u?s?l?u?u?d?l +?l?u?s?l?u?u?d?u +?l?u?s?l?u?u?d?s +?l?u?s?l?u?u?l?d +?l?u?s?l?u?u?u?d +?l?u?s?l?u?u?s?d +?l?u?s?l?u?s?d?d +?l?u?s?l?u?s?d?l +?l?u?s?l?u?s?d?u +?l?u?s?l?u?s?d?s +?l?u?s?l?u?s?l?d +?l?u?s?l?u?s?u?d +?l?u?s?l?u?s?s?d +?l?u?s?l?s?d?d?d +?l?u?s?l?s?d?d?l +?l?u?s?l?s?d?d?u +?l?u?s?l?s?d?d?s +?l?u?s?l?s?d?l?d +?l?u?s?l?s?d?l?l +?l?u?s?l?s?d?l?u +?l?u?s?l?s?d?l?s +?l?u?s?l?s?d?u?d +?l?u?s?l?s?d?u?l +?l?u?s?l?s?d?u?u +?l?u?s?l?s?d?u?s +?l?u?s?l?s?d?s?d +?l?u?s?l?s?d?s?l +?l?u?s?l?s?d?s?u +?l?u?s?l?s?d?s?s +?l?u?s?l?s?l?d?d +?l?u?s?l?s?l?d?l +?l?u?s?l?s?l?d?u +?l?u?s?l?s?l?d?s +?l?u?s?l?s?l?l?d +?l?u?s?l?s?l?u?d +?l?u?s?l?s?l?s?d +?l?u?s?l?s?u?d?d +?l?u?s?l?s?u?d?l +?l?u?s?l?s?u?d?u +?l?u?s?l?s?u?d?s +?l?u?s?l?s?u?l?d +?l?u?s?l?s?u?u?d +?l?u?s?l?s?u?s?d +?l?u?s?l?s?s?d?d +?l?u?s?l?s?s?d?l +?l?u?s?l?s?s?d?u +?l?u?s?l?s?s?d?s +?l?u?s?l?s?s?l?d +?l?u?s?l?s?s?u?d +?l?u?s?l?s?s?s?d +?l?u?s?u?d?d?d?d +?l?u?s?u?d?d?d?l +?l?u?s?u?d?d?d?u +?l?u?s?u?d?d?d?s +?l?u?s?u?d?d?l?d +?l?u?s?u?d?d?l?l +?l?u?s?u?d?d?l?u +?l?u?s?u?d?d?l?s +?l?u?s?u?d?d?u?d +?l?u?s?u?d?d?u?l +?l?u?s?u?d?d?u?u +?l?u?s?u?d?d?u?s +?l?u?s?u?d?d?s?d +?l?u?s?u?d?d?s?l +?l?u?s?u?d?d?s?u +?l?u?s?u?d?d?s?s +?l?u?s?u?d?l?d?d +?l?u?s?u?d?l?d?l +?l?u?s?u?d?l?d?u +?l?u?s?u?d?l?d?s +?l?u?s?u?d?l?l?d +?l?u?s?u?d?l?l?l +?l?u?s?u?d?l?l?u +?l?u?s?u?d?l?l?s +?l?u?s?u?d?l?u?d +?l?u?s?u?d?l?u?l +?l?u?s?u?d?l?u?u +?l?u?s?u?d?l?u?s +?l?u?s?u?d?l?s?d +?l?u?s?u?d?l?s?l +?l?u?s?u?d?l?s?u +?l?u?s?u?d?l?s?s +?l?u?s?u?d?u?d?d +?l?u?s?u?d?u?d?l +?l?u?s?u?d?u?d?u +?l?u?s?u?d?u?d?s +?l?u?s?u?d?u?l?d +?l?u?s?u?d?u?l?l +?l?u?s?u?d?u?l?u +?l?u?s?u?d?u?l?s +?l?u?s?u?d?u?u?d +?l?u?s?u?d?u?u?l +?l?u?s?u?d?u?u?u +?l?u?s?u?d?u?u?s +?l?u?s?u?d?u?s?d +?l?u?s?u?d?u?s?l +?l?u?s?u?d?u?s?u +?l?u?s?u?d?u?s?s +?l?u?s?u?d?s?d?d +?l?u?s?u?d?s?d?l +?l?u?s?u?d?s?d?u +?l?u?s?u?d?s?d?s +?l?u?s?u?d?s?l?d +?l?u?s?u?d?s?l?l +?l?u?s?u?d?s?l?u +?l?u?s?u?d?s?l?s +?l?u?s?u?d?s?u?d +?l?u?s?u?d?s?u?l +?l?u?s?u?d?s?u?u +?l?u?s?u?d?s?u?s +?l?u?s?u?d?s?s?d +?l?u?s?u?d?s?s?l +?l?u?s?u?d?s?s?u +?l?u?s?u?d?s?s?s +?l?u?s?u?l?d?d?d +?l?u?s?u?l?d?d?l +?l?u?s?u?l?d?d?u +?l?u?s?u?l?d?d?s +?l?u?s?u?l?d?l?d +?l?u?s?u?l?d?l?l +?l?u?s?u?l?d?l?u +?l?u?s?u?l?d?l?s +?l?u?s?u?l?d?u?d +?l?u?s?u?l?d?u?l +?l?u?s?u?l?d?u?u +?l?u?s?u?l?d?u?s +?l?u?s?u?l?d?s?d +?l?u?s?u?l?d?s?l +?l?u?s?u?l?d?s?u +?l?u?s?u?l?d?s?s +?l?u?s?u?l?l?d?d +?l?u?s?u?l?l?d?l +?l?u?s?u?l?l?d?u +?l?u?s?u?l?l?d?s +?l?u?s?u?l?l?l?d +?l?u?s?u?l?l?u?d +?l?u?s?u?l?l?s?d +?l?u?s?u?l?u?d?d +?l?u?s?u?l?u?d?l +?l?u?s?u?l?u?d?u +?l?u?s?u?l?u?d?s +?l?u?s?u?l?u?l?d +?l?u?s?u?l?u?u?d +?l?u?s?u?l?u?s?d +?l?u?s?u?l?s?d?d +?l?u?s?u?l?s?d?l +?l?u?s?u?l?s?d?u +?l?u?s?u?l?s?d?s +?l?u?s?u?l?s?l?d +?l?u?s?u?l?s?u?d +?l?u?s?u?l?s?s?d +?l?u?s?u?u?d?d?d +?l?u?s?u?u?d?d?l +?l?u?s?u?u?d?d?u +?l?u?s?u?u?d?d?s +?l?u?s?u?u?d?l?d +?l?u?s?u?u?d?l?l +?l?u?s?u?u?d?l?u +?l?u?s?u?u?d?l?s +?l?u?s?u?u?d?u?d +?l?u?s?u?u?d?u?l +?l?u?s?u?u?d?u?u +?l?u?s?u?u?d?u?s +?l?u?s?u?u?d?s?d +?l?u?s?u?u?d?s?l +?l?u?s?u?u?d?s?u +?l?u?s?u?u?d?s?s +?l?u?s?u?u?l?d?d +?l?u?s?u?u?l?d?l +?l?u?s?u?u?l?d?u +?l?u?s?u?u?l?d?s +?l?u?s?u?u?l?l?d +?l?u?s?u?u?l?u?d +?l?u?s?u?u?l?s?d +?l?u?s?u?u?u?d?d +?l?u?s?u?u?u?d?l +?l?u?s?u?u?u?d?u +?l?u?s?u?u?u?d?s +?l?u?s?u?u?u?l?d +?l?u?s?u?u?u?u?d +?l?u?s?u?u?u?s?d +?l?u?s?u?u?s?d?d +?l?u?s?u?u?s?d?l +?l?u?s?u?u?s?d?u +?l?u?s?u?u?s?d?s +?l?u?s?u?u?s?l?d +?l?u?s?u?u?s?u?d +?l?u?s?u?u?s?s?d +?l?u?s?u?s?d?d?d +?l?u?s?u?s?d?d?l +?l?u?s?u?s?d?d?u +?l?u?s?u?s?d?d?s +?l?u?s?u?s?d?l?d +?l?u?s?u?s?d?l?l +?l?u?s?u?s?d?l?u +?l?u?s?u?s?d?l?s +?l?u?s?u?s?d?u?d +?l?u?s?u?s?d?u?l +?l?u?s?u?s?d?u?u +?l?u?s?u?s?d?u?s +?l?u?s?u?s?d?s?d +?l?u?s?u?s?d?s?l +?l?u?s?u?s?d?s?u +?l?u?s?u?s?d?s?s +?l?u?s?u?s?l?d?d +?l?u?s?u?s?l?d?l +?l?u?s?u?s?l?d?u +?l?u?s?u?s?l?d?s +?l?u?s?u?s?l?l?d +?l?u?s?u?s?l?u?d +?l?u?s?u?s?l?s?d +?l?u?s?u?s?u?d?d +?l?u?s?u?s?u?d?l +?l?u?s?u?s?u?d?u +?l?u?s?u?s?u?d?s +?l?u?s?u?s?u?l?d +?l?u?s?u?s?u?u?d +?l?u?s?u?s?u?s?d +?l?u?s?u?s?s?d?d +?l?u?s?u?s?s?d?l +?l?u?s?u?s?s?d?u +?l?u?s?u?s?s?d?s +?l?u?s?u?s?s?l?d +?l?u?s?u?s?s?u?d +?l?u?s?u?s?s?s?d +?l?u?s?s?d?d?d?d +?l?u?s?s?d?d?d?l +?l?u?s?s?d?d?d?u +?l?u?s?s?d?d?d?s +?l?u?s?s?d?d?l?d +?l?u?s?s?d?d?l?l +?l?u?s?s?d?d?l?u +?l?u?s?s?d?d?l?s +?l?u?s?s?d?d?u?d +?l?u?s?s?d?d?u?l +?l?u?s?s?d?d?u?u +?l?u?s?s?d?d?u?s +?l?u?s?s?d?d?s?d +?l?u?s?s?d?d?s?l +?l?u?s?s?d?d?s?u +?l?u?s?s?d?d?s?s +?l?u?s?s?d?l?d?d +?l?u?s?s?d?l?d?l +?l?u?s?s?d?l?d?u +?l?u?s?s?d?l?d?s +?l?u?s?s?d?l?l?d +?l?u?s?s?d?l?l?l +?l?u?s?s?d?l?l?u +?l?u?s?s?d?l?l?s +?l?u?s?s?d?l?u?d +?l?u?s?s?d?l?u?l +?l?u?s?s?d?l?u?u +?l?u?s?s?d?l?u?s +?l?u?s?s?d?l?s?d +?l?u?s?s?d?l?s?l +?l?u?s?s?d?l?s?u +?l?u?s?s?d?l?s?s +?l?u?s?s?d?u?d?d +?l?u?s?s?d?u?d?l +?l?u?s?s?d?u?d?u +?l?u?s?s?d?u?d?s +?l?u?s?s?d?u?l?d +?l?u?s?s?d?u?l?l +?l?u?s?s?d?u?l?u +?l?u?s?s?d?u?l?s +?l?u?s?s?d?u?u?d +?l?u?s?s?d?u?u?l +?l?u?s?s?d?u?u?u +?l?u?s?s?d?u?u?s +?l?u?s?s?d?u?s?d +?l?u?s?s?d?u?s?l +?l?u?s?s?d?u?s?u +?l?u?s?s?d?u?s?s +?l?u?s?s?d?s?d?d +?l?u?s?s?d?s?d?l +?l?u?s?s?d?s?d?u +?l?u?s?s?d?s?d?s +?l?u?s?s?d?s?l?d +?l?u?s?s?d?s?l?l +?l?u?s?s?d?s?l?u +?l?u?s?s?d?s?l?s +?l?u?s?s?d?s?u?d +?l?u?s?s?d?s?u?l +?l?u?s?s?d?s?u?u +?l?u?s?s?d?s?u?s +?l?u?s?s?d?s?s?d +?l?u?s?s?d?s?s?l +?l?u?s?s?d?s?s?u +?l?u?s?s?d?s?s?s +?l?u?s?s?l?d?d?d +?l?u?s?s?l?d?d?l +?l?u?s?s?l?d?d?u +?l?u?s?s?l?d?d?s +?l?u?s?s?l?d?l?d +?l?u?s?s?l?d?l?l +?l?u?s?s?l?d?l?u +?l?u?s?s?l?d?l?s +?l?u?s?s?l?d?u?d +?l?u?s?s?l?d?u?l +?l?u?s?s?l?d?u?u +?l?u?s?s?l?d?u?s +?l?u?s?s?l?d?s?d +?l?u?s?s?l?d?s?l +?l?u?s?s?l?d?s?u +?l?u?s?s?l?d?s?s +?l?u?s?s?l?l?d?d +?l?u?s?s?l?l?d?l +?l?u?s?s?l?l?d?u +?l?u?s?s?l?l?d?s +?l?u?s?s?l?l?l?d +?l?u?s?s?l?l?u?d +?l?u?s?s?l?l?s?d +?l?u?s?s?l?u?d?d +?l?u?s?s?l?u?d?l +?l?u?s?s?l?u?d?u +?l?u?s?s?l?u?d?s +?l?u?s?s?l?u?l?d +?l?u?s?s?l?u?u?d +?l?u?s?s?l?u?s?d +?l?u?s?s?l?s?d?d +?l?u?s?s?l?s?d?l +?l?u?s?s?l?s?d?u +?l?u?s?s?l?s?d?s +?l?u?s?s?l?s?l?d +?l?u?s?s?l?s?u?d +?l?u?s?s?l?s?s?d +?l?u?s?s?u?d?d?d +?l?u?s?s?u?d?d?l +?l?u?s?s?u?d?d?u +?l?u?s?s?u?d?d?s +?l?u?s?s?u?d?l?d +?l?u?s?s?u?d?l?l +?l?u?s?s?u?d?l?u +?l?u?s?s?u?d?l?s +?l?u?s?s?u?d?u?d +?l?u?s?s?u?d?u?l +?l?u?s?s?u?d?u?u +?l?u?s?s?u?d?u?s +?l?u?s?s?u?d?s?d +?l?u?s?s?u?d?s?l +?l?u?s?s?u?d?s?u +?l?u?s?s?u?d?s?s +?l?u?s?s?u?l?d?d +?l?u?s?s?u?l?d?l +?l?u?s?s?u?l?d?u +?l?u?s?s?u?l?d?s +?l?u?s?s?u?l?l?d +?l?u?s?s?u?l?u?d +?l?u?s?s?u?l?s?d +?l?u?s?s?u?u?d?d +?l?u?s?s?u?u?d?l +?l?u?s?s?u?u?d?u +?l?u?s?s?u?u?d?s +?l?u?s?s?u?u?l?d +?l?u?s?s?u?u?u?d +?l?u?s?s?u?u?s?d +?l?u?s?s?u?s?d?d +?l?u?s?s?u?s?d?l +?l?u?s?s?u?s?d?u +?l?u?s?s?u?s?d?s +?l?u?s?s?u?s?l?d +?l?u?s?s?u?s?u?d +?l?u?s?s?u?s?s?d +?l?u?s?s?s?d?d?d +?l?u?s?s?s?d?d?l +?l?u?s?s?s?d?d?u +?l?u?s?s?s?d?d?s +?l?u?s?s?s?d?l?d +?l?u?s?s?s?d?l?l +?l?u?s?s?s?d?l?u +?l?u?s?s?s?d?l?s +?l?u?s?s?s?d?u?d +?l?u?s?s?s?d?u?l +?l?u?s?s?s?d?u?u +?l?u?s?s?s?d?u?s +?l?u?s?s?s?d?s?d +?l?u?s?s?s?d?s?l +?l?u?s?s?s?d?s?u +?l?u?s?s?s?d?s?s +?l?u?s?s?s?l?d?d +?l?u?s?s?s?l?d?l +?l?u?s?s?s?l?d?u +?l?u?s?s?s?l?d?s +?l?u?s?s?s?l?l?d +?l?u?s?s?s?l?u?d +?l?u?s?s?s?l?s?d +?l?u?s?s?s?u?d?d +?l?u?s?s?s?u?d?l +?l?u?s?s?s?u?d?u +?l?u?s?s?s?u?d?s +?l?u?s?s?s?u?l?d +?l?u?s?s?s?u?u?d +?l?u?s?s?s?u?s?d +?l?u?s?s?s?s?d?d +?l?u?s?s?s?s?d?l +?l?u?s?s?s?s?d?u +?l?u?s?s?s?s?d?s +?l?u?s?s?s?s?l?d +?l?u?s?s?s?s?u?d +?l?u?s?s?s?s?s?d +?l?s?d?d?d?d?d?u +?l?s?d?d?d?d?l?u +?l?s?d?d?d?d?u?d +?l?s?d?d?d?d?u?l +?l?s?d?d?d?d?u?u +?l?s?d?d?d?d?u?s +?l?s?d?d?d?d?s?u +?l?s?d?d?d?l?d?u +?l?s?d?d?d?l?l?u +?l?s?d?d?d?l?u?d +?l?s?d?d?d?l?u?l +?l?s?d?d?d?l?u?u +?l?s?d?d?d?l?u?s +?l?s?d?d?d?l?s?u +?l?s?d?d?d?u?d?d +?l?s?d?d?d?u?d?l +?l?s?d?d?d?u?d?u +?l?s?d?d?d?u?d?s +?l?s?d?d?d?u?l?d +?l?s?d?d?d?u?l?l +?l?s?d?d?d?u?l?u +?l?s?d?d?d?u?l?s +?l?s?d?d?d?u?u?d +?l?s?d?d?d?u?u?l +?l?s?d?d?d?u?u?u +?l?s?d?d?d?u?u?s +?l?s?d?d?d?u?s?d +?l?s?d?d?d?u?s?l +?l?s?d?d?d?u?s?u +?l?s?d?d?d?u?s?s +?l?s?d?d?d?s?d?u +?l?s?d?d?d?s?l?u +?l?s?d?d?d?s?u?d +?l?s?d?d?d?s?u?l +?l?s?d?d?d?s?u?u +?l?s?d?d?d?s?u?s +?l?s?d?d?d?s?s?u +?l?s?d?d?l?d?d?u +?l?s?d?d?l?d?l?u +?l?s?d?d?l?d?u?d +?l?s?d?d?l?d?u?l +?l?s?d?d?l?d?u?u +?l?s?d?d?l?d?u?s +?l?s?d?d?l?d?s?u +?l?s?d?d?l?l?d?u +?l?s?d?d?l?l?l?u +?l?s?d?d?l?l?u?d +?l?s?d?d?l?l?u?l +?l?s?d?d?l?l?u?u +?l?s?d?d?l?l?u?s +?l?s?d?d?l?l?s?u +?l?s?d?d?l?u?d?d +?l?s?d?d?l?u?d?l +?l?s?d?d?l?u?d?u +?l?s?d?d?l?u?d?s +?l?s?d?d?l?u?l?d +?l?s?d?d?l?u?l?l +?l?s?d?d?l?u?l?u +?l?s?d?d?l?u?l?s +?l?s?d?d?l?u?u?d +?l?s?d?d?l?u?u?l +?l?s?d?d?l?u?u?u +?l?s?d?d?l?u?u?s +?l?s?d?d?l?u?s?d +?l?s?d?d?l?u?s?l +?l?s?d?d?l?u?s?u +?l?s?d?d?l?u?s?s +?l?s?d?d?l?s?d?u +?l?s?d?d?l?s?l?u +?l?s?d?d?l?s?u?d +?l?s?d?d?l?s?u?l +?l?s?d?d?l?s?u?u +?l?s?d?d?l?s?u?s +?l?s?d?d?l?s?s?u +?l?s?d?d?u?d?d?d +?l?s?d?d?u?d?d?l +?l?s?d?d?u?d?d?u +?l?s?d?d?u?d?d?s +?l?s?d?d?u?d?l?d +?l?s?d?d?u?d?l?l +?l?s?d?d?u?d?l?u +?l?s?d?d?u?d?l?s +?l?s?d?d?u?d?u?d +?l?s?d?d?u?d?u?l +?l?s?d?d?u?d?u?u +?l?s?d?d?u?d?u?s +?l?s?d?d?u?d?s?d +?l?s?d?d?u?d?s?l +?l?s?d?d?u?d?s?u +?l?s?d?d?u?d?s?s +?l?s?d?d?u?l?d?d +?l?s?d?d?u?l?d?l +?l?s?d?d?u?l?d?u +?l?s?d?d?u?l?d?s +?l?s?d?d?u?l?l?d +?l?s?d?d?u?l?l?l +?l?s?d?d?u?l?l?u +?l?s?d?d?u?l?l?s +?l?s?d?d?u?l?u?d +?l?s?d?d?u?l?u?l +?l?s?d?d?u?l?u?u +?l?s?d?d?u?l?u?s +?l?s?d?d?u?l?s?d +?l?s?d?d?u?l?s?l +?l?s?d?d?u?l?s?u +?l?s?d?d?u?l?s?s +?l?s?d?d?u?u?d?d +?l?s?d?d?u?u?d?l +?l?s?d?d?u?u?d?u +?l?s?d?d?u?u?d?s +?l?s?d?d?u?u?l?d +?l?s?d?d?u?u?l?l +?l?s?d?d?u?u?l?u +?l?s?d?d?u?u?l?s +?l?s?d?d?u?u?u?d +?l?s?d?d?u?u?u?l +?l?s?d?d?u?u?u?u +?l?s?d?d?u?u?u?s +?l?s?d?d?u?u?s?d +?l?s?d?d?u?u?s?l +?l?s?d?d?u?u?s?u +?l?s?d?d?u?u?s?s +?l?s?d?d?u?s?d?d +?l?s?d?d?u?s?d?l +?l?s?d?d?u?s?d?u +?l?s?d?d?u?s?d?s +?l?s?d?d?u?s?l?d +?l?s?d?d?u?s?l?l +?l?s?d?d?u?s?l?u +?l?s?d?d?u?s?l?s +?l?s?d?d?u?s?u?d +?l?s?d?d?u?s?u?l +?l?s?d?d?u?s?u?u +?l?s?d?d?u?s?u?s +?l?s?d?d?u?s?s?d +?l?s?d?d?u?s?s?l +?l?s?d?d?u?s?s?u +?l?s?d?d?u?s?s?s +?l?s?d?d?s?d?d?u +?l?s?d?d?s?d?l?u +?l?s?d?d?s?d?u?d +?l?s?d?d?s?d?u?l +?l?s?d?d?s?d?u?u +?l?s?d?d?s?d?u?s +?l?s?d?d?s?d?s?u +?l?s?d?d?s?l?d?u +?l?s?d?d?s?l?l?u +?l?s?d?d?s?l?u?d +?l?s?d?d?s?l?u?l +?l?s?d?d?s?l?u?u +?l?s?d?d?s?l?u?s +?l?s?d?d?s?l?s?u +?l?s?d?d?s?u?d?d +?l?s?d?d?s?u?d?l +?l?s?d?d?s?u?d?u +?l?s?d?d?s?u?d?s +?l?s?d?d?s?u?l?d +?l?s?d?d?s?u?l?l +?l?s?d?d?s?u?l?u +?l?s?d?d?s?u?l?s +?l?s?d?d?s?u?u?d +?l?s?d?d?s?u?u?l +?l?s?d?d?s?u?u?u +?l?s?d?d?s?u?u?s +?l?s?d?d?s?u?s?d +?l?s?d?d?s?u?s?l +?l?s?d?d?s?u?s?u +?l?s?d?d?s?u?s?s +?l?s?d?d?s?s?d?u +?l?s?d?d?s?s?l?u +?l?s?d?d?s?s?u?d +?l?s?d?d?s?s?u?l +?l?s?d?d?s?s?u?u +?l?s?d?d?s?s?u?s +?l?s?d?d?s?s?s?u +?l?s?d?l?d?d?d?u +?l?s?d?l?d?d?l?u +?l?s?d?l?d?d?u?d +?l?s?d?l?d?d?u?l +?l?s?d?l?d?d?u?u +?l?s?d?l?d?d?u?s +?l?s?d?l?d?d?s?u +?l?s?d?l?d?l?d?u +?l?s?d?l?d?l?l?u +?l?s?d?l?d?l?u?d +?l?s?d?l?d?l?u?l +?l?s?d?l?d?l?u?u +?l?s?d?l?d?l?u?s +?l?s?d?l?d?l?s?u +?l?s?d?l?d?u?d?d +?l?s?d?l?d?u?d?l +?l?s?d?l?d?u?d?u +?l?s?d?l?d?u?d?s +?l?s?d?l?d?u?l?d +?l?s?d?l?d?u?l?l +?l?s?d?l?d?u?l?u +?l?s?d?l?d?u?l?s +?l?s?d?l?d?u?u?d +?l?s?d?l?d?u?u?l +?l?s?d?l?d?u?u?u +?l?s?d?l?d?u?u?s +?l?s?d?l?d?u?s?d +?l?s?d?l?d?u?s?l +?l?s?d?l?d?u?s?u +?l?s?d?l?d?u?s?s +?l?s?d?l?d?s?d?u +?l?s?d?l?d?s?l?u +?l?s?d?l?d?s?u?d +?l?s?d?l?d?s?u?l +?l?s?d?l?d?s?u?u +?l?s?d?l?d?s?u?s +?l?s?d?l?d?s?s?u +?l?s?d?l?l?d?d?u +?l?s?d?l?l?d?l?u +?l?s?d?l?l?d?u?d +?l?s?d?l?l?d?u?l +?l?s?d?l?l?d?u?u +?l?s?d?l?l?d?u?s +?l?s?d?l?l?d?s?u +?l?s?d?l?l?l?d?u +?l?s?d?l?l?l?l?u +?l?s?d?l?l?l?u?d +?l?s?d?l?l?l?u?l +?l?s?d?l?l?l?u?u +?l?s?d?l?l?l?u?s +?l?s?d?l?l?l?s?u +?l?s?d?l?l?u?d?d +?l?s?d?l?l?u?d?l +?l?s?d?l?l?u?d?u +?l?s?d?l?l?u?d?s +?l?s?d?l?l?u?l?d +?l?s?d?l?l?u?l?l +?l?s?d?l?l?u?l?u +?l?s?d?l?l?u?l?s +?l?s?d?l?l?u?u?d +?l?s?d?l?l?u?u?l +?l?s?d?l?l?u?u?u +?l?s?d?l?l?u?u?s +?l?s?d?l?l?u?s?d +?l?s?d?l?l?u?s?l +?l?s?d?l?l?u?s?u +?l?s?d?l?l?u?s?s +?l?s?d?l?l?s?d?u +?l?s?d?l?l?s?l?u +?l?s?d?l?l?s?u?d +?l?s?d?l?l?s?u?l +?l?s?d?l?l?s?u?u +?l?s?d?l?l?s?u?s +?l?s?d?l?l?s?s?u +?l?s?d?l?u?d?d?d +?l?s?d?l?u?d?d?l +?l?s?d?l?u?d?d?u +?l?s?d?l?u?d?d?s +?l?s?d?l?u?d?l?d +?l?s?d?l?u?d?l?l +?l?s?d?l?u?d?l?u +?l?s?d?l?u?d?l?s +?l?s?d?l?u?d?u?d +?l?s?d?l?u?d?u?l +?l?s?d?l?u?d?u?u +?l?s?d?l?u?d?u?s +?l?s?d?l?u?d?s?d +?l?s?d?l?u?d?s?l +?l?s?d?l?u?d?s?u +?l?s?d?l?u?d?s?s +?l?s?d?l?u?l?d?d +?l?s?d?l?u?l?d?l +?l?s?d?l?u?l?d?u +?l?s?d?l?u?l?d?s +?l?s?d?l?u?l?l?d +?l?s?d?l?u?l?l?l +?l?s?d?l?u?l?l?u +?l?s?d?l?u?l?l?s +?l?s?d?l?u?l?u?d +?l?s?d?l?u?l?u?l +?l?s?d?l?u?l?u?u +?l?s?d?l?u?l?u?s +?l?s?d?l?u?l?s?d +?l?s?d?l?u?l?s?l +?l?s?d?l?u?l?s?u +?l?s?d?l?u?l?s?s +?l?s?d?l?u?u?d?d +?l?s?d?l?u?u?d?l +?l?s?d?l?u?u?d?u +?l?s?d?l?u?u?d?s +?l?s?d?l?u?u?l?d +?l?s?d?l?u?u?l?l +?l?s?d?l?u?u?l?u +?l?s?d?l?u?u?l?s +?l?s?d?l?u?u?u?d +?l?s?d?l?u?u?u?l +?l?s?d?l?u?u?u?u +?l?s?d?l?u?u?u?s +?l?s?d?l?u?u?s?d +?l?s?d?l?u?u?s?l +?l?s?d?l?u?u?s?u +?l?s?d?l?u?u?s?s +?l?s?d?l?u?s?d?d +?l?s?d?l?u?s?d?l +?l?s?d?l?u?s?d?u +?l?s?d?l?u?s?d?s +?l?s?d?l?u?s?l?d +?l?s?d?l?u?s?l?l +?l?s?d?l?u?s?l?u +?l?s?d?l?u?s?l?s +?l?s?d?l?u?s?u?d +?l?s?d?l?u?s?u?l +?l?s?d?l?u?s?u?u +?l?s?d?l?u?s?u?s +?l?s?d?l?u?s?s?d +?l?s?d?l?u?s?s?l +?l?s?d?l?u?s?s?u +?l?s?d?l?u?s?s?s +?l?s?d?l?s?d?d?u +?l?s?d?l?s?d?l?u +?l?s?d?l?s?d?u?d +?l?s?d?l?s?d?u?l +?l?s?d?l?s?d?u?u +?l?s?d?l?s?d?u?s +?l?s?d?l?s?d?s?u +?l?s?d?l?s?l?d?u +?l?s?d?l?s?l?l?u +?l?s?d?l?s?l?u?d +?l?s?d?l?s?l?u?l +?l?s?d?l?s?l?u?u +?l?s?d?l?s?l?u?s +?l?s?d?l?s?l?s?u +?l?s?d?l?s?u?d?d +?l?s?d?l?s?u?d?l +?l?s?d?l?s?u?d?u +?l?s?d?l?s?u?d?s +?l?s?d?l?s?u?l?d +?l?s?d?l?s?u?l?l +?l?s?d?l?s?u?l?u +?l?s?d?l?s?u?l?s +?l?s?d?l?s?u?u?d +?l?s?d?l?s?u?u?l +?l?s?d?l?s?u?u?u +?l?s?d?l?s?u?u?s +?l?s?d?l?s?u?s?d +?l?s?d?l?s?u?s?l +?l?s?d?l?s?u?s?u +?l?s?d?l?s?u?s?s +?l?s?d?l?s?s?d?u +?l?s?d?l?s?s?l?u +?l?s?d?l?s?s?u?d +?l?s?d?l?s?s?u?l +?l?s?d?l?s?s?u?u +?l?s?d?l?s?s?u?s +?l?s?d?l?s?s?s?u +?l?s?d?u?d?d?d?d +?l?s?d?u?d?d?d?l +?l?s?d?u?d?d?d?u +?l?s?d?u?d?d?d?s +?l?s?d?u?d?d?l?d +?l?s?d?u?d?d?l?l +?l?s?d?u?d?d?l?u +?l?s?d?u?d?d?l?s +?l?s?d?u?d?d?u?d +?l?s?d?u?d?d?u?l +?l?s?d?u?d?d?u?u +?l?s?d?u?d?d?u?s +?l?s?d?u?d?d?s?d +?l?s?d?u?d?d?s?l +?l?s?d?u?d?d?s?u +?l?s?d?u?d?d?s?s +?l?s?d?u?d?l?d?d +?l?s?d?u?d?l?d?l +?l?s?d?u?d?l?d?u +?l?s?d?u?d?l?d?s +?l?s?d?u?d?l?l?d +?l?s?d?u?d?l?l?l +?l?s?d?u?d?l?l?u +?l?s?d?u?d?l?l?s +?l?s?d?u?d?l?u?d +?l?s?d?u?d?l?u?l +?l?s?d?u?d?l?u?u +?l?s?d?u?d?l?u?s +?l?s?d?u?d?l?s?d +?l?s?d?u?d?l?s?l +?l?s?d?u?d?l?s?u +?l?s?d?u?d?l?s?s +?l?s?d?u?d?u?d?d +?l?s?d?u?d?u?d?l +?l?s?d?u?d?u?d?u +?l?s?d?u?d?u?d?s +?l?s?d?u?d?u?l?d +?l?s?d?u?d?u?l?l +?l?s?d?u?d?u?l?u +?l?s?d?u?d?u?l?s +?l?s?d?u?d?u?u?d +?l?s?d?u?d?u?u?l +?l?s?d?u?d?u?u?u +?l?s?d?u?d?u?u?s +?l?s?d?u?d?u?s?d +?l?s?d?u?d?u?s?l +?l?s?d?u?d?u?s?u +?l?s?d?u?d?u?s?s +?l?s?d?u?d?s?d?d +?l?s?d?u?d?s?d?l +?l?s?d?u?d?s?d?u +?l?s?d?u?d?s?d?s +?l?s?d?u?d?s?l?d +?l?s?d?u?d?s?l?l +?l?s?d?u?d?s?l?u +?l?s?d?u?d?s?l?s +?l?s?d?u?d?s?u?d +?l?s?d?u?d?s?u?l +?l?s?d?u?d?s?u?u +?l?s?d?u?d?s?u?s +?l?s?d?u?d?s?s?d +?l?s?d?u?d?s?s?l +?l?s?d?u?d?s?s?u +?l?s?d?u?d?s?s?s +?l?s?d?u?l?d?d?d +?l?s?d?u?l?d?d?l +?l?s?d?u?l?d?d?u +?l?s?d?u?l?d?d?s +?l?s?d?u?l?d?l?d +?l?s?d?u?l?d?l?l +?l?s?d?u?l?d?l?u +?l?s?d?u?l?d?l?s +?l?s?d?u?l?d?u?d +?l?s?d?u?l?d?u?l +?l?s?d?u?l?d?u?u +?l?s?d?u?l?d?u?s +?l?s?d?u?l?d?s?d +?l?s?d?u?l?d?s?l +?l?s?d?u?l?d?s?u +?l?s?d?u?l?d?s?s +?l?s?d?u?l?l?d?d +?l?s?d?u?l?l?d?l +?l?s?d?u?l?l?d?u +?l?s?d?u?l?l?d?s +?l?s?d?u?l?l?l?d +?l?s?d?u?l?l?l?l +?l?s?d?u?l?l?l?u +?l?s?d?u?l?l?l?s +?l?s?d?u?l?l?u?d +?l?s?d?u?l?l?u?l +?l?s?d?u?l?l?u?u +?l?s?d?u?l?l?u?s +?l?s?d?u?l?l?s?d +?l?s?d?u?l?l?s?l +?l?s?d?u?l?l?s?u +?l?s?d?u?l?l?s?s +?l?s?d?u?l?u?d?d +?l?s?d?u?l?u?d?l +?l?s?d?u?l?u?d?u +?l?s?d?u?l?u?d?s +?l?s?d?u?l?u?l?d +?l?s?d?u?l?u?l?l +?l?s?d?u?l?u?l?u +?l?s?d?u?l?u?l?s +?l?s?d?u?l?u?u?d +?l?s?d?u?l?u?u?l +?l?s?d?u?l?u?u?u +?l?s?d?u?l?u?u?s +?l?s?d?u?l?u?s?d +?l?s?d?u?l?u?s?l +?l?s?d?u?l?u?s?u +?l?s?d?u?l?u?s?s +?l?s?d?u?l?s?d?d +?l?s?d?u?l?s?d?l +?l?s?d?u?l?s?d?u +?l?s?d?u?l?s?d?s +?l?s?d?u?l?s?l?d +?l?s?d?u?l?s?l?l +?l?s?d?u?l?s?l?u +?l?s?d?u?l?s?l?s +?l?s?d?u?l?s?u?d +?l?s?d?u?l?s?u?l +?l?s?d?u?l?s?u?u +?l?s?d?u?l?s?u?s +?l?s?d?u?l?s?s?d +?l?s?d?u?l?s?s?l +?l?s?d?u?l?s?s?u +?l?s?d?u?l?s?s?s +?l?s?d?u?u?d?d?d +?l?s?d?u?u?d?d?l +?l?s?d?u?u?d?d?u +?l?s?d?u?u?d?d?s +?l?s?d?u?u?d?l?d +?l?s?d?u?u?d?l?l +?l?s?d?u?u?d?l?u +?l?s?d?u?u?d?l?s +?l?s?d?u?u?d?u?d +?l?s?d?u?u?d?u?l +?l?s?d?u?u?d?u?u +?l?s?d?u?u?d?u?s +?l?s?d?u?u?d?s?d +?l?s?d?u?u?d?s?l +?l?s?d?u?u?d?s?u +?l?s?d?u?u?d?s?s +?l?s?d?u?u?l?d?d +?l?s?d?u?u?l?d?l +?l?s?d?u?u?l?d?u +?l?s?d?u?u?l?d?s +?l?s?d?u?u?l?l?d +?l?s?d?u?u?l?l?l +?l?s?d?u?u?l?l?u +?l?s?d?u?u?l?l?s +?l?s?d?u?u?l?u?d +?l?s?d?u?u?l?u?l +?l?s?d?u?u?l?u?u +?l?s?d?u?u?l?u?s +?l?s?d?u?u?l?s?d +?l?s?d?u?u?l?s?l +?l?s?d?u?u?l?s?u +?l?s?d?u?u?l?s?s +?l?s?d?u?u?u?d?d +?l?s?d?u?u?u?d?l +?l?s?d?u?u?u?d?u +?l?s?d?u?u?u?d?s +?l?s?d?u?u?u?l?d +?l?s?d?u?u?u?l?l +?l?s?d?u?u?u?l?u +?l?s?d?u?u?u?l?s +?l?s?d?u?u?u?u?d +?l?s?d?u?u?u?u?l +?l?s?d?u?u?u?u?u +?l?s?d?u?u?u?u?s +?l?s?d?u?u?u?s?d +?l?s?d?u?u?u?s?l +?l?s?d?u?u?u?s?u +?l?s?d?u?u?u?s?s +?l?s?d?u?u?s?d?d +?l?s?d?u?u?s?d?l +?l?s?d?u?u?s?d?u +?l?s?d?u?u?s?d?s +?l?s?d?u?u?s?l?d +?l?s?d?u?u?s?l?l +?l?s?d?u?u?s?l?u +?l?s?d?u?u?s?l?s +?l?s?d?u?u?s?u?d +?l?s?d?u?u?s?u?l +?l?s?d?u?u?s?u?u +?l?s?d?u?u?s?u?s +?l?s?d?u?u?s?s?d +?l?s?d?u?u?s?s?l +?l?s?d?u?u?s?s?u +?l?s?d?u?u?s?s?s +?l?s?d?u?s?d?d?d +?l?s?d?u?s?d?d?l +?l?s?d?u?s?d?d?u +?l?s?d?u?s?d?d?s +?l?s?d?u?s?d?l?d +?l?s?d?u?s?d?l?l +?l?s?d?u?s?d?l?u +?l?s?d?u?s?d?l?s +?l?s?d?u?s?d?u?d +?l?s?d?u?s?d?u?l +?l?s?d?u?s?d?u?u +?l?s?d?u?s?d?u?s +?l?s?d?u?s?d?s?d +?l?s?d?u?s?d?s?l +?l?s?d?u?s?d?s?u +?l?s?d?u?s?d?s?s +?l?s?d?u?s?l?d?d +?l?s?d?u?s?l?d?l +?l?s?d?u?s?l?d?u +?l?s?d?u?s?l?d?s +?l?s?d?u?s?l?l?d +?l?s?d?u?s?l?l?l +?l?s?d?u?s?l?l?u +?l?s?d?u?s?l?l?s +?l?s?d?u?s?l?u?d +?l?s?d?u?s?l?u?l +?l?s?d?u?s?l?u?u +?l?s?d?u?s?l?u?s +?l?s?d?u?s?l?s?d +?l?s?d?u?s?l?s?l +?l?s?d?u?s?l?s?u +?l?s?d?u?s?l?s?s +?l?s?d?u?s?u?d?d +?l?s?d?u?s?u?d?l +?l?s?d?u?s?u?d?u +?l?s?d?u?s?u?d?s +?l?s?d?u?s?u?l?d +?l?s?d?u?s?u?l?l +?l?s?d?u?s?u?l?u +?l?s?d?u?s?u?l?s +?l?s?d?u?s?u?u?d +?l?s?d?u?s?u?u?l +?l?s?d?u?s?u?u?u +?l?s?d?u?s?u?u?s +?l?s?d?u?s?u?s?d +?l?s?d?u?s?u?s?l +?l?s?d?u?s?u?s?u +?l?s?d?u?s?u?s?s +?l?s?d?u?s?s?d?d +?l?s?d?u?s?s?d?l +?l?s?d?u?s?s?d?u +?l?s?d?u?s?s?d?s +?l?s?d?u?s?s?l?d +?l?s?d?u?s?s?l?l +?l?s?d?u?s?s?l?u +?l?s?d?u?s?s?l?s +?l?s?d?u?s?s?u?d +?l?s?d?u?s?s?u?l +?l?s?d?u?s?s?u?u +?l?s?d?u?s?s?u?s +?l?s?d?u?s?s?s?d +?l?s?d?u?s?s?s?l +?l?s?d?u?s?s?s?u +?l?s?d?u?s?s?s?s +?l?s?d?s?d?d?d?u +?l?s?d?s?d?d?l?u +?l?s?d?s?d?d?u?d +?l?s?d?s?d?d?u?l +?l?s?d?s?d?d?u?u +?l?s?d?s?d?d?u?s +?l?s?d?s?d?d?s?u +?l?s?d?s?d?l?d?u +?l?s?d?s?d?l?l?u +?l?s?d?s?d?l?u?d +?l?s?d?s?d?l?u?l +?l?s?d?s?d?l?u?u +?l?s?d?s?d?l?u?s +?l?s?d?s?d?l?s?u +?l?s?d?s?d?u?d?d +?l?s?d?s?d?u?d?l +?l?s?d?s?d?u?d?u +?l?s?d?s?d?u?d?s +?l?s?d?s?d?u?l?d +?l?s?d?s?d?u?l?l +?l?s?d?s?d?u?l?u +?l?s?d?s?d?u?l?s +?l?s?d?s?d?u?u?d +?l?s?d?s?d?u?u?l +?l?s?d?s?d?u?u?u +?l?s?d?s?d?u?u?s +?l?s?d?s?d?u?s?d +?l?s?d?s?d?u?s?l +?l?s?d?s?d?u?s?u +?l?s?d?s?d?u?s?s +?l?s?d?s?d?s?d?u +?l?s?d?s?d?s?l?u +?l?s?d?s?d?s?u?d +?l?s?d?s?d?s?u?l +?l?s?d?s?d?s?u?u +?l?s?d?s?d?s?u?s +?l?s?d?s?d?s?s?u +?l?s?d?s?l?d?d?u +?l?s?d?s?l?d?l?u +?l?s?d?s?l?d?u?d +?l?s?d?s?l?d?u?l +?l?s?d?s?l?d?u?u +?l?s?d?s?l?d?u?s +?l?s?d?s?l?d?s?u +?l?s?d?s?l?l?d?u +?l?s?d?s?l?l?l?u +?l?s?d?s?l?l?u?d +?l?s?d?s?l?l?u?l +?l?s?d?s?l?l?u?u +?l?s?d?s?l?l?u?s +?l?s?d?s?l?l?s?u +?l?s?d?s?l?u?d?d +?l?s?d?s?l?u?d?l +?l?s?d?s?l?u?d?u +?l?s?d?s?l?u?d?s +?l?s?d?s?l?u?l?d +?l?s?d?s?l?u?l?l +?l?s?d?s?l?u?l?u +?l?s?d?s?l?u?l?s +?l?s?d?s?l?u?u?d +?l?s?d?s?l?u?u?l +?l?s?d?s?l?u?u?u +?l?s?d?s?l?u?u?s +?l?s?d?s?l?u?s?d +?l?s?d?s?l?u?s?l +?l?s?d?s?l?u?s?u +?l?s?d?s?l?u?s?s +?l?s?d?s?l?s?d?u +?l?s?d?s?l?s?l?u +?l?s?d?s?l?s?u?d +?l?s?d?s?l?s?u?l +?l?s?d?s?l?s?u?u +?l?s?d?s?l?s?u?s +?l?s?d?s?l?s?s?u +?l?s?d?s?u?d?d?d +?l?s?d?s?u?d?d?l +?l?s?d?s?u?d?d?u +?l?s?d?s?u?d?d?s +?l?s?d?s?u?d?l?d +?l?s?d?s?u?d?l?l +?l?s?d?s?u?d?l?u +?l?s?d?s?u?d?l?s +?l?s?d?s?u?d?u?d +?l?s?d?s?u?d?u?l +?l?s?d?s?u?d?u?u +?l?s?d?s?u?d?u?s +?l?s?d?s?u?d?s?d +?l?s?d?s?u?d?s?l +?l?s?d?s?u?d?s?u +?l?s?d?s?u?d?s?s +?l?s?d?s?u?l?d?d +?l?s?d?s?u?l?d?l +?l?s?d?s?u?l?d?u +?l?s?d?s?u?l?d?s +?l?s?d?s?u?l?l?d +?l?s?d?s?u?l?l?l +?l?s?d?s?u?l?l?u +?l?s?d?s?u?l?l?s +?l?s?d?s?u?l?u?d +?l?s?d?s?u?l?u?l +?l?s?d?s?u?l?u?u +?l?s?d?s?u?l?u?s +?l?s?d?s?u?l?s?d +?l?s?d?s?u?l?s?l +?l?s?d?s?u?l?s?u +?l?s?d?s?u?l?s?s +?l?s?d?s?u?u?d?d +?l?s?d?s?u?u?d?l +?l?s?d?s?u?u?d?u +?l?s?d?s?u?u?d?s +?l?s?d?s?u?u?l?d +?l?s?d?s?u?u?l?l +?l?s?d?s?u?u?l?u +?l?s?d?s?u?u?l?s +?l?s?d?s?u?u?u?d +?l?s?d?s?u?u?u?l +?l?s?d?s?u?u?u?u +?l?s?d?s?u?u?u?s +?l?s?d?s?u?u?s?d +?l?s?d?s?u?u?s?l +?l?s?d?s?u?u?s?u +?l?s?d?s?u?u?s?s +?l?s?d?s?u?s?d?d +?l?s?d?s?u?s?d?l +?l?s?d?s?u?s?d?u +?l?s?d?s?u?s?d?s +?l?s?d?s?u?s?l?d +?l?s?d?s?u?s?l?l +?l?s?d?s?u?s?l?u +?l?s?d?s?u?s?l?s +?l?s?d?s?u?s?u?d +?l?s?d?s?u?s?u?l +?l?s?d?s?u?s?u?u +?l?s?d?s?u?s?u?s +?l?s?d?s?u?s?s?d +?l?s?d?s?u?s?s?l +?l?s?d?s?u?s?s?u +?l?s?d?s?u?s?s?s +?l?s?d?s?s?d?d?u +?l?s?d?s?s?d?l?u +?l?s?d?s?s?d?u?d +?l?s?d?s?s?d?u?l +?l?s?d?s?s?d?u?u +?l?s?d?s?s?d?u?s +?l?s?d?s?s?d?s?u +?l?s?d?s?s?l?d?u +?l?s?d?s?s?l?l?u +?l?s?d?s?s?l?u?d +?l?s?d?s?s?l?u?l +?l?s?d?s?s?l?u?u +?l?s?d?s?s?l?u?s +?l?s?d?s?s?l?s?u +?l?s?d?s?s?u?d?d +?l?s?d?s?s?u?d?l +?l?s?d?s?s?u?d?u +?l?s?d?s?s?u?d?s +?l?s?d?s?s?u?l?d +?l?s?d?s?s?u?l?l +?l?s?d?s?s?u?l?u +?l?s?d?s?s?u?l?s +?l?s?d?s?s?u?u?d +?l?s?d?s?s?u?u?l +?l?s?d?s?s?u?u?u +?l?s?d?s?s?u?u?s +?l?s?d?s?s?u?s?d +?l?s?d?s?s?u?s?l +?l?s?d?s?s?u?s?u +?l?s?d?s?s?u?s?s +?l?s?d?s?s?s?d?u +?l?s?d?s?s?s?l?u +?l?s?d?s?s?s?u?d +?l?s?d?s?s?s?u?l +?l?s?d?s?s?s?u?u +?l?s?d?s?s?s?u?s +?l?s?d?s?s?s?s?u +?l?s?l?d?d?d?d?u +?l?s?l?d?d?d?l?u +?l?s?l?d?d?d?u?d +?l?s?l?d?d?d?u?l +?l?s?l?d?d?d?u?u +?l?s?l?d?d?d?u?s +?l?s?l?d?d?d?s?u +?l?s?l?d?d?l?d?u +?l?s?l?d?d?l?l?u +?l?s?l?d?d?l?u?d +?l?s?l?d?d?l?u?l +?l?s?l?d?d?l?u?u +?l?s?l?d?d?l?u?s +?l?s?l?d?d?l?s?u +?l?s?l?d?d?u?d?d +?l?s?l?d?d?u?d?l +?l?s?l?d?d?u?d?u +?l?s?l?d?d?u?d?s +?l?s?l?d?d?u?l?d +?l?s?l?d?d?u?l?l +?l?s?l?d?d?u?l?u +?l?s?l?d?d?u?l?s +?l?s?l?d?d?u?u?d +?l?s?l?d?d?u?u?l +?l?s?l?d?d?u?u?u +?l?s?l?d?d?u?u?s +?l?s?l?d?d?u?s?d +?l?s?l?d?d?u?s?l +?l?s?l?d?d?u?s?u +?l?s?l?d?d?u?s?s +?l?s?l?d?d?s?d?u +?l?s?l?d?d?s?l?u +?l?s?l?d?d?s?u?d +?l?s?l?d?d?s?u?l +?l?s?l?d?d?s?u?u +?l?s?l?d?d?s?u?s +?l?s?l?d?d?s?s?u +?l?s?l?d?l?d?d?u +?l?s?l?d?l?d?l?u +?l?s?l?d?l?d?u?d +?l?s?l?d?l?d?u?l +?l?s?l?d?l?d?u?u +?l?s?l?d?l?d?u?s +?l?s?l?d?l?d?s?u +?l?s?l?d?l?l?d?u +?l?s?l?d?l?l?l?u +?l?s?l?d?l?l?u?d +?l?s?l?d?l?l?u?l +?l?s?l?d?l?l?u?u +?l?s?l?d?l?l?u?s +?l?s?l?d?l?l?s?u +?l?s?l?d?l?u?d?d +?l?s?l?d?l?u?d?l +?l?s?l?d?l?u?d?u +?l?s?l?d?l?u?d?s +?l?s?l?d?l?u?l?d +?l?s?l?d?l?u?l?l +?l?s?l?d?l?u?l?u +?l?s?l?d?l?u?l?s +?l?s?l?d?l?u?u?d +?l?s?l?d?l?u?u?l +?l?s?l?d?l?u?u?u +?l?s?l?d?l?u?u?s +?l?s?l?d?l?u?s?d +?l?s?l?d?l?u?s?l +?l?s?l?d?l?u?s?u +?l?s?l?d?l?u?s?s +?l?s?l?d?l?s?d?u +?l?s?l?d?l?s?l?u +?l?s?l?d?l?s?u?d +?l?s?l?d?l?s?u?l +?l?s?l?d?l?s?u?u +?l?s?l?d?l?s?u?s +?l?s?l?d?l?s?s?u +?l?s?l?d?u?d?d?d +?l?s?l?d?u?d?d?l +?l?s?l?d?u?d?d?u +?l?s?l?d?u?d?d?s +?l?s?l?d?u?d?l?d +?l?s?l?d?u?d?l?l +?l?s?l?d?u?d?l?u +?l?s?l?d?u?d?l?s +?l?s?l?d?u?d?u?d +?l?s?l?d?u?d?u?l +?l?s?l?d?u?d?u?u +?l?s?l?d?u?d?u?s +?l?s?l?d?u?d?s?d +?l?s?l?d?u?d?s?l +?l?s?l?d?u?d?s?u +?l?s?l?d?u?d?s?s +?l?s?l?d?u?l?d?d +?l?s?l?d?u?l?d?l +?l?s?l?d?u?l?d?u +?l?s?l?d?u?l?d?s +?l?s?l?d?u?l?l?d +?l?s?l?d?u?l?l?l +?l?s?l?d?u?l?l?u +?l?s?l?d?u?l?l?s +?l?s?l?d?u?l?u?d +?l?s?l?d?u?l?u?l +?l?s?l?d?u?l?u?u +?l?s?l?d?u?l?u?s +?l?s?l?d?u?l?s?d +?l?s?l?d?u?l?s?l +?l?s?l?d?u?l?s?u +?l?s?l?d?u?l?s?s +?l?s?l?d?u?u?d?d +?l?s?l?d?u?u?d?l +?l?s?l?d?u?u?d?u +?l?s?l?d?u?u?d?s +?l?s?l?d?u?u?l?d +?l?s?l?d?u?u?l?l +?l?s?l?d?u?u?l?u +?l?s?l?d?u?u?l?s +?l?s?l?d?u?u?u?d +?l?s?l?d?u?u?u?l +?l?s?l?d?u?u?u?u +?l?s?l?d?u?u?u?s +?l?s?l?d?u?u?s?d +?l?s?l?d?u?u?s?l +?l?s?l?d?u?u?s?u +?l?s?l?d?u?u?s?s +?l?s?l?d?u?s?d?d +?l?s?l?d?u?s?d?l +?l?s?l?d?u?s?d?u +?l?s?l?d?u?s?d?s +?l?s?l?d?u?s?l?d +?l?s?l?d?u?s?l?l +?l?s?l?d?u?s?l?u +?l?s?l?d?u?s?l?s +?l?s?l?d?u?s?u?d +?l?s?l?d?u?s?u?l +?l?s?l?d?u?s?u?u +?l?s?l?d?u?s?u?s +?l?s?l?d?u?s?s?d +?l?s?l?d?u?s?s?l +?l?s?l?d?u?s?s?u +?l?s?l?d?u?s?s?s +?l?s?l?d?s?d?d?u +?l?s?l?d?s?d?l?u +?l?s?l?d?s?d?u?d +?l?s?l?d?s?d?u?l +?l?s?l?d?s?d?u?u +?l?s?l?d?s?d?u?s +?l?s?l?d?s?d?s?u +?l?s?l?d?s?l?d?u +?l?s?l?d?s?l?l?u +?l?s?l?d?s?l?u?d +?l?s?l?d?s?l?u?l +?l?s?l?d?s?l?u?u +?l?s?l?d?s?l?u?s +?l?s?l?d?s?l?s?u +?l?s?l?d?s?u?d?d +?l?s?l?d?s?u?d?l +?l?s?l?d?s?u?d?u +?l?s?l?d?s?u?d?s +?l?s?l?d?s?u?l?d +?l?s?l?d?s?u?l?l +?l?s?l?d?s?u?l?u +?l?s?l?d?s?u?l?s +?l?s?l?d?s?u?u?d +?l?s?l?d?s?u?u?l +?l?s?l?d?s?u?u?u +?l?s?l?d?s?u?u?s +?l?s?l?d?s?u?s?d +?l?s?l?d?s?u?s?l +?l?s?l?d?s?u?s?u +?l?s?l?d?s?u?s?s +?l?s?l?d?s?s?d?u +?l?s?l?d?s?s?l?u +?l?s?l?d?s?s?u?d +?l?s?l?d?s?s?u?l +?l?s?l?d?s?s?u?u +?l?s?l?d?s?s?u?s +?l?s?l?d?s?s?s?u +?l?s?l?l?d?d?d?u +?l?s?l?l?d?d?l?u +?l?s?l?l?d?d?u?d +?l?s?l?l?d?d?u?l +?l?s?l?l?d?d?u?u +?l?s?l?l?d?d?u?s +?l?s?l?l?d?d?s?u +?l?s?l?l?d?l?d?u +?l?s?l?l?d?l?l?u +?l?s?l?l?d?l?u?d +?l?s?l?l?d?l?u?l +?l?s?l?l?d?l?u?u +?l?s?l?l?d?l?u?s +?l?s?l?l?d?l?s?u +?l?s?l?l?d?u?d?d +?l?s?l?l?d?u?d?l +?l?s?l?l?d?u?d?u +?l?s?l?l?d?u?d?s +?l?s?l?l?d?u?l?d +?l?s?l?l?d?u?l?l +?l?s?l?l?d?u?l?u +?l?s?l?l?d?u?l?s +?l?s?l?l?d?u?u?d +?l?s?l?l?d?u?u?l +?l?s?l?l?d?u?u?u +?l?s?l?l?d?u?u?s +?l?s?l?l?d?u?s?d +?l?s?l?l?d?u?s?l +?l?s?l?l?d?u?s?u +?l?s?l?l?d?u?s?s +?l?s?l?l?d?s?d?u +?l?s?l?l?d?s?l?u +?l?s?l?l?d?s?u?d +?l?s?l?l?d?s?u?l +?l?s?l?l?d?s?u?u +?l?s?l?l?d?s?u?s +?l?s?l?l?d?s?s?u +?l?s?l?l?l?d?d?u +?l?s?l?l?l?d?l?u +?l?s?l?l?l?d?u?d +?l?s?l?l?l?d?u?l +?l?s?l?l?l?d?u?u +?l?s?l?l?l?d?u?s +?l?s?l?l?l?d?s?u +?l?s?l?l?l?l?d?u +?l?s?l?l?l?l?u?d +?l?s?l?l?l?u?d?d +?l?s?l?l?l?u?d?l +?l?s?l?l?l?u?d?u +?l?s?l?l?l?u?d?s +?l?s?l?l?l?u?l?d +?l?s?l?l?l?u?u?d +?l?s?l?l?l?u?s?d +?l?s?l?l?l?s?d?u +?l?s?l?l?l?s?u?d +?l?s?l?l?u?d?d?d +?l?s?l?l?u?d?d?l +?l?s?l?l?u?d?d?u +?l?s?l?l?u?d?d?s +?l?s?l?l?u?d?l?d +?l?s?l?l?u?d?l?l +?l?s?l?l?u?d?l?u +?l?s?l?l?u?d?l?s +?l?s?l?l?u?d?u?d +?l?s?l?l?u?d?u?l +?l?s?l?l?u?d?u?u +?l?s?l?l?u?d?u?s +?l?s?l?l?u?d?s?d +?l?s?l?l?u?d?s?l +?l?s?l?l?u?d?s?u +?l?s?l?l?u?d?s?s +?l?s?l?l?u?l?d?d +?l?s?l?l?u?l?d?l +?l?s?l?l?u?l?d?u +?l?s?l?l?u?l?d?s +?l?s?l?l?u?l?l?d +?l?s?l?l?u?l?u?d +?l?s?l?l?u?l?s?d +?l?s?l?l?u?u?d?d +?l?s?l?l?u?u?d?l +?l?s?l?l?u?u?d?u +?l?s?l?l?u?u?d?s +?l?s?l?l?u?u?l?d +?l?s?l?l?u?u?u?d +?l?s?l?l?u?u?s?d +?l?s?l?l?u?s?d?d +?l?s?l?l?u?s?d?l +?l?s?l?l?u?s?d?u +?l?s?l?l?u?s?d?s +?l?s?l?l?u?s?l?d +?l?s?l?l?u?s?u?d +?l?s?l?l?u?s?s?d +?l?s?l?l?s?d?d?u +?l?s?l?l?s?d?l?u +?l?s?l?l?s?d?u?d +?l?s?l?l?s?d?u?l +?l?s?l?l?s?d?u?u +?l?s?l?l?s?d?u?s +?l?s?l?l?s?d?s?u +?l?s?l?l?s?l?d?u +?l?s?l?l?s?l?u?d +?l?s?l?l?s?u?d?d +?l?s?l?l?s?u?d?l +?l?s?l?l?s?u?d?u +?l?s?l?l?s?u?d?s +?l?s?l?l?s?u?l?d +?l?s?l?l?s?u?u?d +?l?s?l?l?s?u?s?d +?l?s?l?l?s?s?d?u +?l?s?l?l?s?s?u?d +?l?s?l?u?d?d?d?d +?l?s?l?u?d?d?d?l +?l?s?l?u?d?d?d?u +?l?s?l?u?d?d?d?s +?l?s?l?u?d?d?l?d +?l?s?l?u?d?d?l?l +?l?s?l?u?d?d?l?u +?l?s?l?u?d?d?l?s +?l?s?l?u?d?d?u?d +?l?s?l?u?d?d?u?l +?l?s?l?u?d?d?u?u +?l?s?l?u?d?d?u?s +?l?s?l?u?d?d?s?d +?l?s?l?u?d?d?s?l +?l?s?l?u?d?d?s?u +?l?s?l?u?d?d?s?s +?l?s?l?u?d?l?d?d +?l?s?l?u?d?l?d?l +?l?s?l?u?d?l?d?u +?l?s?l?u?d?l?d?s +?l?s?l?u?d?l?l?d +?l?s?l?u?d?l?l?l +?l?s?l?u?d?l?l?u +?l?s?l?u?d?l?l?s +?l?s?l?u?d?l?u?d +?l?s?l?u?d?l?u?l +?l?s?l?u?d?l?u?u +?l?s?l?u?d?l?u?s +?l?s?l?u?d?l?s?d +?l?s?l?u?d?l?s?l +?l?s?l?u?d?l?s?u +?l?s?l?u?d?l?s?s +?l?s?l?u?d?u?d?d +?l?s?l?u?d?u?d?l +?l?s?l?u?d?u?d?u +?l?s?l?u?d?u?d?s +?l?s?l?u?d?u?l?d +?l?s?l?u?d?u?l?l +?l?s?l?u?d?u?l?u +?l?s?l?u?d?u?l?s +?l?s?l?u?d?u?u?d +?l?s?l?u?d?u?u?l +?l?s?l?u?d?u?u?u +?l?s?l?u?d?u?u?s +?l?s?l?u?d?u?s?d +?l?s?l?u?d?u?s?l +?l?s?l?u?d?u?s?u +?l?s?l?u?d?u?s?s +?l?s?l?u?d?s?d?d +?l?s?l?u?d?s?d?l +?l?s?l?u?d?s?d?u +?l?s?l?u?d?s?d?s +?l?s?l?u?d?s?l?d +?l?s?l?u?d?s?l?l +?l?s?l?u?d?s?l?u +?l?s?l?u?d?s?l?s +?l?s?l?u?d?s?u?d +?l?s?l?u?d?s?u?l +?l?s?l?u?d?s?u?u +?l?s?l?u?d?s?u?s +?l?s?l?u?d?s?s?d +?l?s?l?u?d?s?s?l +?l?s?l?u?d?s?s?u +?l?s?l?u?d?s?s?s +?l?s?l?u?l?d?d?d +?l?s?l?u?l?d?d?l +?l?s?l?u?l?d?d?u +?l?s?l?u?l?d?d?s +?l?s?l?u?l?d?l?d +?l?s?l?u?l?d?l?l +?l?s?l?u?l?d?l?u +?l?s?l?u?l?d?l?s +?l?s?l?u?l?d?u?d +?l?s?l?u?l?d?u?l +?l?s?l?u?l?d?u?u +?l?s?l?u?l?d?u?s +?l?s?l?u?l?d?s?d +?l?s?l?u?l?d?s?l +?l?s?l?u?l?d?s?u +?l?s?l?u?l?d?s?s +?l?s?l?u?l?l?d?d +?l?s?l?u?l?l?d?l +?l?s?l?u?l?l?d?u +?l?s?l?u?l?l?d?s +?l?s?l?u?l?l?l?d +?l?s?l?u?l?l?u?d +?l?s?l?u?l?l?s?d +?l?s?l?u?l?u?d?d +?l?s?l?u?l?u?d?l +?l?s?l?u?l?u?d?u +?l?s?l?u?l?u?d?s +?l?s?l?u?l?u?l?d +?l?s?l?u?l?u?u?d +?l?s?l?u?l?u?s?d +?l?s?l?u?l?s?d?d +?l?s?l?u?l?s?d?l +?l?s?l?u?l?s?d?u +?l?s?l?u?l?s?d?s +?l?s?l?u?l?s?l?d +?l?s?l?u?l?s?u?d +?l?s?l?u?l?s?s?d +?l?s?l?u?u?d?d?d +?l?s?l?u?u?d?d?l +?l?s?l?u?u?d?d?u +?l?s?l?u?u?d?d?s +?l?s?l?u?u?d?l?d +?l?s?l?u?u?d?l?l +?l?s?l?u?u?d?l?u +?l?s?l?u?u?d?l?s +?l?s?l?u?u?d?u?d +?l?s?l?u?u?d?u?l +?l?s?l?u?u?d?u?u +?l?s?l?u?u?d?u?s +?l?s?l?u?u?d?s?d +?l?s?l?u?u?d?s?l +?l?s?l?u?u?d?s?u +?l?s?l?u?u?d?s?s +?l?s?l?u?u?l?d?d +?l?s?l?u?u?l?d?l +?l?s?l?u?u?l?d?u +?l?s?l?u?u?l?d?s +?l?s?l?u?u?l?l?d +?l?s?l?u?u?l?u?d +?l?s?l?u?u?l?s?d +?l?s?l?u?u?u?d?d +?l?s?l?u?u?u?d?l +?l?s?l?u?u?u?d?u +?l?s?l?u?u?u?d?s +?l?s?l?u?u?u?l?d +?l?s?l?u?u?u?u?d +?l?s?l?u?u?u?s?d +?l?s?l?u?u?s?d?d +?l?s?l?u?u?s?d?l +?l?s?l?u?u?s?d?u +?l?s?l?u?u?s?d?s +?l?s?l?u?u?s?l?d +?l?s?l?u?u?s?u?d +?l?s?l?u?u?s?s?d +?l?s?l?u?s?d?d?d +?l?s?l?u?s?d?d?l +?l?s?l?u?s?d?d?u +?l?s?l?u?s?d?d?s +?l?s?l?u?s?d?l?d +?l?s?l?u?s?d?l?l +?l?s?l?u?s?d?l?u +?l?s?l?u?s?d?l?s +?l?s?l?u?s?d?u?d +?l?s?l?u?s?d?u?l +?l?s?l?u?s?d?u?u +?l?s?l?u?s?d?u?s +?l?s?l?u?s?d?s?d +?l?s?l?u?s?d?s?l +?l?s?l?u?s?d?s?u +?l?s?l?u?s?d?s?s +?l?s?l?u?s?l?d?d +?l?s?l?u?s?l?d?l +?l?s?l?u?s?l?d?u +?l?s?l?u?s?l?d?s +?l?s?l?u?s?l?l?d +?l?s?l?u?s?l?u?d +?l?s?l?u?s?l?s?d +?l?s?l?u?s?u?d?d +?l?s?l?u?s?u?d?l +?l?s?l?u?s?u?d?u +?l?s?l?u?s?u?d?s +?l?s?l?u?s?u?l?d +?l?s?l?u?s?u?u?d +?l?s?l?u?s?u?s?d +?l?s?l?u?s?s?d?d +?l?s?l?u?s?s?d?l +?l?s?l?u?s?s?d?u +?l?s?l?u?s?s?d?s +?l?s?l?u?s?s?l?d +?l?s?l?u?s?s?u?d +?l?s?l?u?s?s?s?d +?l?s?l?s?d?d?d?u +?l?s?l?s?d?d?l?u +?l?s?l?s?d?d?u?d +?l?s?l?s?d?d?u?l +?l?s?l?s?d?d?u?u +?l?s?l?s?d?d?u?s +?l?s?l?s?d?d?s?u +?l?s?l?s?d?l?d?u +?l?s?l?s?d?l?l?u +?l?s?l?s?d?l?u?d +?l?s?l?s?d?l?u?l +?l?s?l?s?d?l?u?u +?l?s?l?s?d?l?u?s +?l?s?l?s?d?l?s?u +?l?s?l?s?d?u?d?d +?l?s?l?s?d?u?d?l +?l?s?l?s?d?u?d?u +?l?s?l?s?d?u?d?s +?l?s?l?s?d?u?l?d +?l?s?l?s?d?u?l?l +?l?s?l?s?d?u?l?u +?l?s?l?s?d?u?l?s +?l?s?l?s?d?u?u?d +?l?s?l?s?d?u?u?l +?l?s?l?s?d?u?u?u +?l?s?l?s?d?u?u?s +?l?s?l?s?d?u?s?d +?l?s?l?s?d?u?s?l +?l?s?l?s?d?u?s?u +?l?s?l?s?d?u?s?s +?l?s?l?s?d?s?d?u +?l?s?l?s?d?s?l?u +?l?s?l?s?d?s?u?d +?l?s?l?s?d?s?u?l +?l?s?l?s?d?s?u?u +?l?s?l?s?d?s?u?s +?l?s?l?s?d?s?s?u +?l?s?l?s?l?d?d?u +?l?s?l?s?l?d?l?u +?l?s?l?s?l?d?u?d +?l?s?l?s?l?d?u?l +?l?s?l?s?l?d?u?u +?l?s?l?s?l?d?u?s +?l?s?l?s?l?d?s?u +?l?s?l?s?l?l?d?u +?l?s?l?s?l?l?u?d +?l?s?l?s?l?u?d?d +?l?s?l?s?l?u?d?l +?l?s?l?s?l?u?d?u +?l?s?l?s?l?u?d?s +?l?s?l?s?l?u?l?d +?l?s?l?s?l?u?u?d +?l?s?l?s?l?u?s?d +?l?s?l?s?l?s?d?u +?l?s?l?s?l?s?u?d +?l?s?l?s?u?d?d?d +?l?s?l?s?u?d?d?l +?l?s?l?s?u?d?d?u +?l?s?l?s?u?d?d?s +?l?s?l?s?u?d?l?d +?l?s?l?s?u?d?l?l +?l?s?l?s?u?d?l?u +?l?s?l?s?u?d?l?s +?l?s?l?s?u?d?u?d +?l?s?l?s?u?d?u?l +?l?s?l?s?u?d?u?u +?l?s?l?s?u?d?u?s +?l?s?l?s?u?d?s?d +?l?s?l?s?u?d?s?l +?l?s?l?s?u?d?s?u +?l?s?l?s?u?d?s?s +?l?s?l?s?u?l?d?d +?l?s?l?s?u?l?d?l +?l?s?l?s?u?l?d?u +?l?s?l?s?u?l?d?s +?l?s?l?s?u?l?l?d +?l?s?l?s?u?l?u?d +?l?s?l?s?u?l?s?d +?l?s?l?s?u?u?d?d +?l?s?l?s?u?u?d?l +?l?s?l?s?u?u?d?u +?l?s?l?s?u?u?d?s +?l?s?l?s?u?u?l?d +?l?s?l?s?u?u?u?d +?l?s?l?s?u?u?s?d +?l?s?l?s?u?s?d?d +?l?s?l?s?u?s?d?l +?l?s?l?s?u?s?d?u +?l?s?l?s?u?s?d?s +?l?s?l?s?u?s?l?d +?l?s?l?s?u?s?u?d +?l?s?l?s?u?s?s?d +?l?s?l?s?s?d?d?u +?l?s?l?s?s?d?l?u +?l?s?l?s?s?d?u?d +?l?s?l?s?s?d?u?l +?l?s?l?s?s?d?u?u +?l?s?l?s?s?d?u?s +?l?s?l?s?s?d?s?u +?l?s?l?s?s?l?d?u +?l?s?l?s?s?l?u?d +?l?s?l?s?s?u?d?d +?l?s?l?s?s?u?d?l +?l?s?l?s?s?u?d?u +?l?s?l?s?s?u?d?s +?l?s?l?s?s?u?l?d +?l?s?l?s?s?u?u?d +?l?s?l?s?s?u?s?d +?l?s?l?s?s?s?d?u +?l?s?l?s?s?s?u?d +?l?s?u?d?d?d?d?d +?l?s?u?d?d?d?d?l +?l?s?u?d?d?d?d?u +?l?s?u?d?d?d?d?s +?l?s?u?d?d?d?l?d +?l?s?u?d?d?d?l?l +?l?s?u?d?d?d?l?u +?l?s?u?d?d?d?l?s +?l?s?u?d?d?d?u?d +?l?s?u?d?d?d?u?l +?l?s?u?d?d?d?u?u +?l?s?u?d?d?d?u?s +?l?s?u?d?d?d?s?d +?l?s?u?d?d?d?s?l +?l?s?u?d?d?d?s?u +?l?s?u?d?d?d?s?s +?l?s?u?d?d?l?d?d +?l?s?u?d?d?l?d?l +?l?s?u?d?d?l?d?u +?l?s?u?d?d?l?d?s +?l?s?u?d?d?l?l?d +?l?s?u?d?d?l?l?l +?l?s?u?d?d?l?l?u +?l?s?u?d?d?l?l?s +?l?s?u?d?d?l?u?d +?l?s?u?d?d?l?u?l +?l?s?u?d?d?l?u?u +?l?s?u?d?d?l?u?s +?l?s?u?d?d?l?s?d +?l?s?u?d?d?l?s?l +?l?s?u?d?d?l?s?u +?l?s?u?d?d?l?s?s +?l?s?u?d?d?u?d?d +?l?s?u?d?d?u?d?l +?l?s?u?d?d?u?d?u +?l?s?u?d?d?u?d?s +?l?s?u?d?d?u?l?d +?l?s?u?d?d?u?l?l +?l?s?u?d?d?u?l?u +?l?s?u?d?d?u?l?s +?l?s?u?d?d?u?u?d +?l?s?u?d?d?u?u?l +?l?s?u?d?d?u?u?u +?l?s?u?d?d?u?u?s +?l?s?u?d?d?u?s?d +?l?s?u?d?d?u?s?l +?l?s?u?d?d?u?s?u +?l?s?u?d?d?u?s?s +?l?s?u?d?d?s?d?d +?l?s?u?d?d?s?d?l +?l?s?u?d?d?s?d?u +?l?s?u?d?d?s?d?s +?l?s?u?d?d?s?l?d +?l?s?u?d?d?s?l?l +?l?s?u?d?d?s?l?u +?l?s?u?d?d?s?l?s +?l?s?u?d?d?s?u?d +?l?s?u?d?d?s?u?l +?l?s?u?d?d?s?u?u +?l?s?u?d?d?s?u?s +?l?s?u?d?d?s?s?d +?l?s?u?d?d?s?s?l +?l?s?u?d?d?s?s?u +?l?s?u?d?d?s?s?s +?l?s?u?d?l?d?d?d +?l?s?u?d?l?d?d?l +?l?s?u?d?l?d?d?u +?l?s?u?d?l?d?d?s +?l?s?u?d?l?d?l?d +?l?s?u?d?l?d?l?l +?l?s?u?d?l?d?l?u +?l?s?u?d?l?d?l?s +?l?s?u?d?l?d?u?d +?l?s?u?d?l?d?u?l +?l?s?u?d?l?d?u?u +?l?s?u?d?l?d?u?s +?l?s?u?d?l?d?s?d +?l?s?u?d?l?d?s?l +?l?s?u?d?l?d?s?u +?l?s?u?d?l?d?s?s +?l?s?u?d?l?l?d?d +?l?s?u?d?l?l?d?l +?l?s?u?d?l?l?d?u +?l?s?u?d?l?l?d?s +?l?s?u?d?l?l?l?d +?l?s?u?d?l?l?l?l +?l?s?u?d?l?l?l?u +?l?s?u?d?l?l?l?s +?l?s?u?d?l?l?u?d +?l?s?u?d?l?l?u?l +?l?s?u?d?l?l?u?u +?l?s?u?d?l?l?u?s +?l?s?u?d?l?l?s?d +?l?s?u?d?l?l?s?l +?l?s?u?d?l?l?s?u +?l?s?u?d?l?l?s?s +?l?s?u?d?l?u?d?d +?l?s?u?d?l?u?d?l +?l?s?u?d?l?u?d?u +?l?s?u?d?l?u?d?s +?l?s?u?d?l?u?l?d +?l?s?u?d?l?u?l?l +?l?s?u?d?l?u?l?u +?l?s?u?d?l?u?l?s +?l?s?u?d?l?u?u?d +?l?s?u?d?l?u?u?l +?l?s?u?d?l?u?u?u +?l?s?u?d?l?u?u?s +?l?s?u?d?l?u?s?d +?l?s?u?d?l?u?s?l +?l?s?u?d?l?u?s?u +?l?s?u?d?l?u?s?s +?l?s?u?d?l?s?d?d +?l?s?u?d?l?s?d?l +?l?s?u?d?l?s?d?u +?l?s?u?d?l?s?d?s +?l?s?u?d?l?s?l?d +?l?s?u?d?l?s?l?l +?l?s?u?d?l?s?l?u +?l?s?u?d?l?s?l?s +?l?s?u?d?l?s?u?d +?l?s?u?d?l?s?u?l +?l?s?u?d?l?s?u?u +?l?s?u?d?l?s?u?s +?l?s?u?d?l?s?s?d +?l?s?u?d?l?s?s?l +?l?s?u?d?l?s?s?u +?l?s?u?d?l?s?s?s +?l?s?u?d?u?d?d?d +?l?s?u?d?u?d?d?l +?l?s?u?d?u?d?d?u +?l?s?u?d?u?d?d?s +?l?s?u?d?u?d?l?d +?l?s?u?d?u?d?l?l +?l?s?u?d?u?d?l?u +?l?s?u?d?u?d?l?s +?l?s?u?d?u?d?u?d +?l?s?u?d?u?d?u?l +?l?s?u?d?u?d?u?u +?l?s?u?d?u?d?u?s +?l?s?u?d?u?d?s?d +?l?s?u?d?u?d?s?l +?l?s?u?d?u?d?s?u +?l?s?u?d?u?d?s?s +?l?s?u?d?u?l?d?d +?l?s?u?d?u?l?d?l +?l?s?u?d?u?l?d?u +?l?s?u?d?u?l?d?s +?l?s?u?d?u?l?l?d +?l?s?u?d?u?l?l?l +?l?s?u?d?u?l?l?u +?l?s?u?d?u?l?l?s +?l?s?u?d?u?l?u?d +?l?s?u?d?u?l?u?l +?l?s?u?d?u?l?u?u +?l?s?u?d?u?l?u?s +?l?s?u?d?u?l?s?d +?l?s?u?d?u?l?s?l +?l?s?u?d?u?l?s?u +?l?s?u?d?u?l?s?s +?l?s?u?d?u?u?d?d +?l?s?u?d?u?u?d?l +?l?s?u?d?u?u?d?u +?l?s?u?d?u?u?d?s +?l?s?u?d?u?u?l?d +?l?s?u?d?u?u?l?l +?l?s?u?d?u?u?l?u +?l?s?u?d?u?u?l?s +?l?s?u?d?u?u?u?d +?l?s?u?d?u?u?u?l +?l?s?u?d?u?u?u?u +?l?s?u?d?u?u?u?s +?l?s?u?d?u?u?s?d +?l?s?u?d?u?u?s?l +?l?s?u?d?u?u?s?u +?l?s?u?d?u?u?s?s +?l?s?u?d?u?s?d?d +?l?s?u?d?u?s?d?l +?l?s?u?d?u?s?d?u +?l?s?u?d?u?s?d?s +?l?s?u?d?u?s?l?d +?l?s?u?d?u?s?l?l +?l?s?u?d?u?s?l?u +?l?s?u?d?u?s?l?s +?l?s?u?d?u?s?u?d +?l?s?u?d?u?s?u?l +?l?s?u?d?u?s?u?u +?l?s?u?d?u?s?u?s +?l?s?u?d?u?s?s?d +?l?s?u?d?u?s?s?l +?l?s?u?d?u?s?s?u +?l?s?u?d?u?s?s?s +?l?s?u?d?s?d?d?d +?l?s?u?d?s?d?d?l +?l?s?u?d?s?d?d?u +?l?s?u?d?s?d?d?s +?l?s?u?d?s?d?l?d +?l?s?u?d?s?d?l?l +?l?s?u?d?s?d?l?u +?l?s?u?d?s?d?l?s +?l?s?u?d?s?d?u?d +?l?s?u?d?s?d?u?l +?l?s?u?d?s?d?u?u +?l?s?u?d?s?d?u?s +?l?s?u?d?s?d?s?d +?l?s?u?d?s?d?s?l +?l?s?u?d?s?d?s?u +?l?s?u?d?s?d?s?s +?l?s?u?d?s?l?d?d +?l?s?u?d?s?l?d?l +?l?s?u?d?s?l?d?u +?l?s?u?d?s?l?d?s +?l?s?u?d?s?l?l?d +?l?s?u?d?s?l?l?l +?l?s?u?d?s?l?l?u +?l?s?u?d?s?l?l?s +?l?s?u?d?s?l?u?d +?l?s?u?d?s?l?u?l +?l?s?u?d?s?l?u?u +?l?s?u?d?s?l?u?s +?l?s?u?d?s?l?s?d +?l?s?u?d?s?l?s?l +?l?s?u?d?s?l?s?u +?l?s?u?d?s?l?s?s +?l?s?u?d?s?u?d?d +?l?s?u?d?s?u?d?l +?l?s?u?d?s?u?d?u +?l?s?u?d?s?u?d?s +?l?s?u?d?s?u?l?d +?l?s?u?d?s?u?l?l +?l?s?u?d?s?u?l?u +?l?s?u?d?s?u?l?s +?l?s?u?d?s?u?u?d +?l?s?u?d?s?u?u?l +?l?s?u?d?s?u?u?u +?l?s?u?d?s?u?u?s +?l?s?u?d?s?u?s?d +?l?s?u?d?s?u?s?l +?l?s?u?d?s?u?s?u +?l?s?u?d?s?u?s?s +?l?s?u?d?s?s?d?d +?l?s?u?d?s?s?d?l +?l?s?u?d?s?s?d?u +?l?s?u?d?s?s?d?s +?l?s?u?d?s?s?l?d +?l?s?u?d?s?s?l?l +?l?s?u?d?s?s?l?u +?l?s?u?d?s?s?l?s +?l?s?u?d?s?s?u?d +?l?s?u?d?s?s?u?l +?l?s?u?d?s?s?u?u +?l?s?u?d?s?s?u?s +?l?s?u?d?s?s?s?d +?l?s?u?d?s?s?s?l +?l?s?u?d?s?s?s?u +?l?s?u?d?s?s?s?s +?l?s?u?l?d?d?d?d +?l?s?u?l?d?d?d?l +?l?s?u?l?d?d?d?u +?l?s?u?l?d?d?d?s +?l?s?u?l?d?d?l?d +?l?s?u?l?d?d?l?l +?l?s?u?l?d?d?l?u +?l?s?u?l?d?d?l?s +?l?s?u?l?d?d?u?d +?l?s?u?l?d?d?u?l +?l?s?u?l?d?d?u?u +?l?s?u?l?d?d?u?s +?l?s?u?l?d?d?s?d +?l?s?u?l?d?d?s?l +?l?s?u?l?d?d?s?u +?l?s?u?l?d?d?s?s +?l?s?u?l?d?l?d?d +?l?s?u?l?d?l?d?l +?l?s?u?l?d?l?d?u +?l?s?u?l?d?l?d?s +?l?s?u?l?d?l?l?d +?l?s?u?l?d?l?l?l +?l?s?u?l?d?l?l?u +?l?s?u?l?d?l?l?s +?l?s?u?l?d?l?u?d +?l?s?u?l?d?l?u?l +?l?s?u?l?d?l?u?u +?l?s?u?l?d?l?u?s +?l?s?u?l?d?l?s?d +?l?s?u?l?d?l?s?l +?l?s?u?l?d?l?s?u +?l?s?u?l?d?l?s?s +?l?s?u?l?d?u?d?d +?l?s?u?l?d?u?d?l +?l?s?u?l?d?u?d?u +?l?s?u?l?d?u?d?s +?l?s?u?l?d?u?l?d +?l?s?u?l?d?u?l?l +?l?s?u?l?d?u?l?u +?l?s?u?l?d?u?l?s +?l?s?u?l?d?u?u?d +?l?s?u?l?d?u?u?l +?l?s?u?l?d?u?u?u +?l?s?u?l?d?u?u?s +?l?s?u?l?d?u?s?d +?l?s?u?l?d?u?s?l +?l?s?u?l?d?u?s?u +?l?s?u?l?d?u?s?s +?l?s?u?l?d?s?d?d +?l?s?u?l?d?s?d?l +?l?s?u?l?d?s?d?u +?l?s?u?l?d?s?d?s +?l?s?u?l?d?s?l?d +?l?s?u?l?d?s?l?l +?l?s?u?l?d?s?l?u +?l?s?u?l?d?s?l?s +?l?s?u?l?d?s?u?d +?l?s?u?l?d?s?u?l +?l?s?u?l?d?s?u?u +?l?s?u?l?d?s?u?s +?l?s?u?l?d?s?s?d +?l?s?u?l?d?s?s?l +?l?s?u?l?d?s?s?u +?l?s?u?l?d?s?s?s +?l?s?u?l?l?d?d?d +?l?s?u?l?l?d?d?l +?l?s?u?l?l?d?d?u +?l?s?u?l?l?d?d?s +?l?s?u?l?l?d?l?d +?l?s?u?l?l?d?l?l +?l?s?u?l?l?d?l?u +?l?s?u?l?l?d?l?s +?l?s?u?l?l?d?u?d +?l?s?u?l?l?d?u?l +?l?s?u?l?l?d?u?u +?l?s?u?l?l?d?u?s +?l?s?u?l?l?d?s?d +?l?s?u?l?l?d?s?l +?l?s?u?l?l?d?s?u +?l?s?u?l?l?d?s?s +?l?s?u?l?l?l?d?d +?l?s?u?l?l?l?d?l +?l?s?u?l?l?l?d?u +?l?s?u?l?l?l?d?s +?l?s?u?l?l?l?l?d +?l?s?u?l?l?l?u?d +?l?s?u?l?l?l?s?d +?l?s?u?l?l?u?d?d +?l?s?u?l?l?u?d?l +?l?s?u?l?l?u?d?u +?l?s?u?l?l?u?d?s +?l?s?u?l?l?u?l?d +?l?s?u?l?l?u?u?d +?l?s?u?l?l?u?s?d +?l?s?u?l?l?s?d?d +?l?s?u?l?l?s?d?l +?l?s?u?l?l?s?d?u +?l?s?u?l?l?s?d?s +?l?s?u?l?l?s?l?d +?l?s?u?l?l?s?u?d +?l?s?u?l?l?s?s?d +?l?s?u?l?u?d?d?d +?l?s?u?l?u?d?d?l +?l?s?u?l?u?d?d?u +?l?s?u?l?u?d?d?s +?l?s?u?l?u?d?l?d +?l?s?u?l?u?d?l?l +?l?s?u?l?u?d?l?u +?l?s?u?l?u?d?l?s +?l?s?u?l?u?d?u?d +?l?s?u?l?u?d?u?l +?l?s?u?l?u?d?u?u +?l?s?u?l?u?d?u?s +?l?s?u?l?u?d?s?d +?l?s?u?l?u?d?s?l +?l?s?u?l?u?d?s?u +?l?s?u?l?u?d?s?s +?l?s?u?l?u?l?d?d +?l?s?u?l?u?l?d?l +?l?s?u?l?u?l?d?u +?l?s?u?l?u?l?d?s +?l?s?u?l?u?l?l?d +?l?s?u?l?u?l?u?d +?l?s?u?l?u?l?s?d +?l?s?u?l?u?u?d?d +?l?s?u?l?u?u?d?l +?l?s?u?l?u?u?d?u +?l?s?u?l?u?u?d?s +?l?s?u?l?u?u?l?d +?l?s?u?l?u?u?u?d +?l?s?u?l?u?u?s?d +?l?s?u?l?u?s?d?d +?l?s?u?l?u?s?d?l +?l?s?u?l?u?s?d?u +?l?s?u?l?u?s?d?s +?l?s?u?l?u?s?l?d +?l?s?u?l?u?s?u?d +?l?s?u?l?u?s?s?d +?l?s?u?l?s?d?d?d +?l?s?u?l?s?d?d?l +?l?s?u?l?s?d?d?u +?l?s?u?l?s?d?d?s +?l?s?u?l?s?d?l?d +?l?s?u?l?s?d?l?l +?l?s?u?l?s?d?l?u +?l?s?u?l?s?d?l?s +?l?s?u?l?s?d?u?d +?l?s?u?l?s?d?u?l +?l?s?u?l?s?d?u?u +?l?s?u?l?s?d?u?s +?l?s?u?l?s?d?s?d +?l?s?u?l?s?d?s?l +?l?s?u?l?s?d?s?u +?l?s?u?l?s?d?s?s +?l?s?u?l?s?l?d?d +?l?s?u?l?s?l?d?l +?l?s?u?l?s?l?d?u +?l?s?u?l?s?l?d?s +?l?s?u?l?s?l?l?d +?l?s?u?l?s?l?u?d +?l?s?u?l?s?l?s?d +?l?s?u?l?s?u?d?d +?l?s?u?l?s?u?d?l +?l?s?u?l?s?u?d?u +?l?s?u?l?s?u?d?s +?l?s?u?l?s?u?l?d +?l?s?u?l?s?u?u?d +?l?s?u?l?s?u?s?d +?l?s?u?l?s?s?d?d +?l?s?u?l?s?s?d?l +?l?s?u?l?s?s?d?u +?l?s?u?l?s?s?d?s +?l?s?u?l?s?s?l?d +?l?s?u?l?s?s?u?d +?l?s?u?l?s?s?s?d +?l?s?u?u?d?d?d?d +?l?s?u?u?d?d?d?l +?l?s?u?u?d?d?d?u +?l?s?u?u?d?d?d?s +?l?s?u?u?d?d?l?d +?l?s?u?u?d?d?l?l +?l?s?u?u?d?d?l?u +?l?s?u?u?d?d?l?s +?l?s?u?u?d?d?u?d +?l?s?u?u?d?d?u?l +?l?s?u?u?d?d?u?u +?l?s?u?u?d?d?u?s +?l?s?u?u?d?d?s?d +?l?s?u?u?d?d?s?l +?l?s?u?u?d?d?s?u +?l?s?u?u?d?d?s?s +?l?s?u?u?d?l?d?d +?l?s?u?u?d?l?d?l +?l?s?u?u?d?l?d?u +?l?s?u?u?d?l?d?s +?l?s?u?u?d?l?l?d +?l?s?u?u?d?l?l?l +?l?s?u?u?d?l?l?u +?l?s?u?u?d?l?l?s +?l?s?u?u?d?l?u?d +?l?s?u?u?d?l?u?l +?l?s?u?u?d?l?u?u +?l?s?u?u?d?l?u?s +?l?s?u?u?d?l?s?d +?l?s?u?u?d?l?s?l +?l?s?u?u?d?l?s?u +?l?s?u?u?d?l?s?s +?l?s?u?u?d?u?d?d +?l?s?u?u?d?u?d?l +?l?s?u?u?d?u?d?u +?l?s?u?u?d?u?d?s +?l?s?u?u?d?u?l?d +?l?s?u?u?d?u?l?l +?l?s?u?u?d?u?l?u +?l?s?u?u?d?u?l?s +?l?s?u?u?d?u?u?d +?l?s?u?u?d?u?u?l +?l?s?u?u?d?u?u?u +?l?s?u?u?d?u?u?s +?l?s?u?u?d?u?s?d +?l?s?u?u?d?u?s?l +?l?s?u?u?d?u?s?u +?l?s?u?u?d?u?s?s +?l?s?u?u?d?s?d?d +?l?s?u?u?d?s?d?l +?l?s?u?u?d?s?d?u +?l?s?u?u?d?s?d?s +?l?s?u?u?d?s?l?d +?l?s?u?u?d?s?l?l +?l?s?u?u?d?s?l?u +?l?s?u?u?d?s?l?s +?l?s?u?u?d?s?u?d +?l?s?u?u?d?s?u?l +?l?s?u?u?d?s?u?u +?l?s?u?u?d?s?u?s +?l?s?u?u?d?s?s?d +?l?s?u?u?d?s?s?l +?l?s?u?u?d?s?s?u +?l?s?u?u?d?s?s?s +?l?s?u?u?l?d?d?d +?l?s?u?u?l?d?d?l +?l?s?u?u?l?d?d?u +?l?s?u?u?l?d?d?s +?l?s?u?u?l?d?l?d +?l?s?u?u?l?d?l?l +?l?s?u?u?l?d?l?u +?l?s?u?u?l?d?l?s +?l?s?u?u?l?d?u?d +?l?s?u?u?l?d?u?l +?l?s?u?u?l?d?u?u +?l?s?u?u?l?d?u?s +?l?s?u?u?l?d?s?d +?l?s?u?u?l?d?s?l +?l?s?u?u?l?d?s?u +?l?s?u?u?l?d?s?s +?l?s?u?u?l?l?d?d +?l?s?u?u?l?l?d?l +?l?s?u?u?l?l?d?u +?l?s?u?u?l?l?d?s +?l?s?u?u?l?l?l?d +?l?s?u?u?l?l?u?d +?l?s?u?u?l?l?s?d +?l?s?u?u?l?u?d?d +?l?s?u?u?l?u?d?l +?l?s?u?u?l?u?d?u +?l?s?u?u?l?u?d?s +?l?s?u?u?l?u?l?d +?l?s?u?u?l?u?u?d +?l?s?u?u?l?u?s?d +?l?s?u?u?l?s?d?d +?l?s?u?u?l?s?d?l +?l?s?u?u?l?s?d?u +?l?s?u?u?l?s?d?s +?l?s?u?u?l?s?l?d +?l?s?u?u?l?s?u?d +?l?s?u?u?l?s?s?d +?l?s?u?u?u?d?d?d +?l?s?u?u?u?d?d?l +?l?s?u?u?u?d?d?u +?l?s?u?u?u?d?d?s +?l?s?u?u?u?d?l?d +?l?s?u?u?u?d?l?l +?l?s?u?u?u?d?l?u +?l?s?u?u?u?d?l?s +?l?s?u?u?u?d?u?d +?l?s?u?u?u?d?u?l +?l?s?u?u?u?d?u?u +?l?s?u?u?u?d?u?s +?l?s?u?u?u?d?s?d +?l?s?u?u?u?d?s?l +?l?s?u?u?u?d?s?u +?l?s?u?u?u?d?s?s +?l?s?u?u?u?l?d?d +?l?s?u?u?u?l?d?l +?l?s?u?u?u?l?d?u +?l?s?u?u?u?l?d?s +?l?s?u?u?u?l?l?d +?l?s?u?u?u?l?u?d +?l?s?u?u?u?l?s?d +?l?s?u?u?u?u?d?d +?l?s?u?u?u?u?d?l +?l?s?u?u?u?u?d?u +?l?s?u?u?u?u?d?s +?l?s?u?u?u?u?l?d +?l?s?u?u?u?u?u?d +?l?s?u?u?u?u?s?d +?l?s?u?u?u?s?d?d +?l?s?u?u?u?s?d?l +?l?s?u?u?u?s?d?u +?l?s?u?u?u?s?d?s +?l?s?u?u?u?s?l?d +?l?s?u?u?u?s?u?d +?l?s?u?u?u?s?s?d +?l?s?u?u?s?d?d?d +?l?s?u?u?s?d?d?l +?l?s?u?u?s?d?d?u +?l?s?u?u?s?d?d?s +?l?s?u?u?s?d?l?d +?l?s?u?u?s?d?l?l +?l?s?u?u?s?d?l?u +?l?s?u?u?s?d?l?s +?l?s?u?u?s?d?u?d +?l?s?u?u?s?d?u?l +?l?s?u?u?s?d?u?u +?l?s?u?u?s?d?u?s +?l?s?u?u?s?d?s?d +?l?s?u?u?s?d?s?l +?l?s?u?u?s?d?s?u +?l?s?u?u?s?d?s?s +?l?s?u?u?s?l?d?d +?l?s?u?u?s?l?d?l +?l?s?u?u?s?l?d?u +?l?s?u?u?s?l?d?s +?l?s?u?u?s?l?l?d +?l?s?u?u?s?l?u?d +?l?s?u?u?s?l?s?d +?l?s?u?u?s?u?d?d +?l?s?u?u?s?u?d?l +?l?s?u?u?s?u?d?u +?l?s?u?u?s?u?d?s +?l?s?u?u?s?u?l?d +?l?s?u?u?s?u?u?d +?l?s?u?u?s?u?s?d +?l?s?u?u?s?s?d?d +?l?s?u?u?s?s?d?l +?l?s?u?u?s?s?d?u +?l?s?u?u?s?s?d?s +?l?s?u?u?s?s?l?d +?l?s?u?u?s?s?u?d +?l?s?u?u?s?s?s?d +?l?s?u?s?d?d?d?d +?l?s?u?s?d?d?d?l +?l?s?u?s?d?d?d?u +?l?s?u?s?d?d?d?s +?l?s?u?s?d?d?l?d +?l?s?u?s?d?d?l?l +?l?s?u?s?d?d?l?u +?l?s?u?s?d?d?l?s +?l?s?u?s?d?d?u?d +?l?s?u?s?d?d?u?l +?l?s?u?s?d?d?u?u +?l?s?u?s?d?d?u?s +?l?s?u?s?d?d?s?d +?l?s?u?s?d?d?s?l +?l?s?u?s?d?d?s?u +?l?s?u?s?d?d?s?s +?l?s?u?s?d?l?d?d +?l?s?u?s?d?l?d?l +?l?s?u?s?d?l?d?u +?l?s?u?s?d?l?d?s +?l?s?u?s?d?l?l?d +?l?s?u?s?d?l?l?l +?l?s?u?s?d?l?l?u +?l?s?u?s?d?l?l?s +?l?s?u?s?d?l?u?d +?l?s?u?s?d?l?u?l +?l?s?u?s?d?l?u?u +?l?s?u?s?d?l?u?s +?l?s?u?s?d?l?s?d +?l?s?u?s?d?l?s?l +?l?s?u?s?d?l?s?u +?l?s?u?s?d?l?s?s +?l?s?u?s?d?u?d?d +?l?s?u?s?d?u?d?l +?l?s?u?s?d?u?d?u +?l?s?u?s?d?u?d?s +?l?s?u?s?d?u?l?d +?l?s?u?s?d?u?l?l +?l?s?u?s?d?u?l?u +?l?s?u?s?d?u?l?s +?l?s?u?s?d?u?u?d +?l?s?u?s?d?u?u?l +?l?s?u?s?d?u?u?u +?l?s?u?s?d?u?u?s +?l?s?u?s?d?u?s?d +?l?s?u?s?d?u?s?l +?l?s?u?s?d?u?s?u +?l?s?u?s?d?u?s?s +?l?s?u?s?d?s?d?d +?l?s?u?s?d?s?d?l +?l?s?u?s?d?s?d?u +?l?s?u?s?d?s?d?s +?l?s?u?s?d?s?l?d +?l?s?u?s?d?s?l?l +?l?s?u?s?d?s?l?u +?l?s?u?s?d?s?l?s +?l?s?u?s?d?s?u?d +?l?s?u?s?d?s?u?l +?l?s?u?s?d?s?u?u +?l?s?u?s?d?s?u?s +?l?s?u?s?d?s?s?d +?l?s?u?s?d?s?s?l +?l?s?u?s?d?s?s?u +?l?s?u?s?d?s?s?s +?l?s?u?s?l?d?d?d +?l?s?u?s?l?d?d?l +?l?s?u?s?l?d?d?u +?l?s?u?s?l?d?d?s +?l?s?u?s?l?d?l?d +?l?s?u?s?l?d?l?l +?l?s?u?s?l?d?l?u +?l?s?u?s?l?d?l?s +?l?s?u?s?l?d?u?d +?l?s?u?s?l?d?u?l +?l?s?u?s?l?d?u?u +?l?s?u?s?l?d?u?s +?l?s?u?s?l?d?s?d +?l?s?u?s?l?d?s?l +?l?s?u?s?l?d?s?u +?l?s?u?s?l?d?s?s +?l?s?u?s?l?l?d?d +?l?s?u?s?l?l?d?l +?l?s?u?s?l?l?d?u +?l?s?u?s?l?l?d?s +?l?s?u?s?l?l?l?d +?l?s?u?s?l?l?u?d +?l?s?u?s?l?l?s?d +?l?s?u?s?l?u?d?d +?l?s?u?s?l?u?d?l +?l?s?u?s?l?u?d?u +?l?s?u?s?l?u?d?s +?l?s?u?s?l?u?l?d +?l?s?u?s?l?u?u?d +?l?s?u?s?l?u?s?d +?l?s?u?s?l?s?d?d +?l?s?u?s?l?s?d?l +?l?s?u?s?l?s?d?u +?l?s?u?s?l?s?d?s +?l?s?u?s?l?s?l?d +?l?s?u?s?l?s?u?d +?l?s?u?s?l?s?s?d +?l?s?u?s?u?d?d?d +?l?s?u?s?u?d?d?l +?l?s?u?s?u?d?d?u +?l?s?u?s?u?d?d?s +?l?s?u?s?u?d?l?d +?l?s?u?s?u?d?l?l +?l?s?u?s?u?d?l?u +?l?s?u?s?u?d?l?s +?l?s?u?s?u?d?u?d +?l?s?u?s?u?d?u?l +?l?s?u?s?u?d?u?u +?l?s?u?s?u?d?u?s +?l?s?u?s?u?d?s?d +?l?s?u?s?u?d?s?l +?l?s?u?s?u?d?s?u +?l?s?u?s?u?d?s?s +?l?s?u?s?u?l?d?d +?l?s?u?s?u?l?d?l +?l?s?u?s?u?l?d?u +?l?s?u?s?u?l?d?s +?l?s?u?s?u?l?l?d +?l?s?u?s?u?l?u?d +?l?s?u?s?u?l?s?d +?l?s?u?s?u?u?d?d +?l?s?u?s?u?u?d?l +?l?s?u?s?u?u?d?u +?l?s?u?s?u?u?d?s +?l?s?u?s?u?u?l?d +?l?s?u?s?u?u?u?d +?l?s?u?s?u?u?s?d +?l?s?u?s?u?s?d?d +?l?s?u?s?u?s?d?l +?l?s?u?s?u?s?d?u +?l?s?u?s?u?s?d?s +?l?s?u?s?u?s?l?d +?l?s?u?s?u?s?u?d +?l?s?u?s?u?s?s?d +?l?s?u?s?s?d?d?d +?l?s?u?s?s?d?d?l +?l?s?u?s?s?d?d?u +?l?s?u?s?s?d?d?s +?l?s?u?s?s?d?l?d +?l?s?u?s?s?d?l?l +?l?s?u?s?s?d?l?u +?l?s?u?s?s?d?l?s +?l?s?u?s?s?d?u?d +?l?s?u?s?s?d?u?l +?l?s?u?s?s?d?u?u +?l?s?u?s?s?d?u?s +?l?s?u?s?s?d?s?d +?l?s?u?s?s?d?s?l +?l?s?u?s?s?d?s?u +?l?s?u?s?s?d?s?s +?l?s?u?s?s?l?d?d +?l?s?u?s?s?l?d?l +?l?s?u?s?s?l?d?u +?l?s?u?s?s?l?d?s +?l?s?u?s?s?l?l?d +?l?s?u?s?s?l?u?d +?l?s?u?s?s?l?s?d +?l?s?u?s?s?u?d?d +?l?s?u?s?s?u?d?l +?l?s?u?s?s?u?d?u +?l?s?u?s?s?u?d?s +?l?s?u?s?s?u?l?d +?l?s?u?s?s?u?u?d +?l?s?u?s?s?u?s?d +?l?s?u?s?s?s?d?d +?l?s?u?s?s?s?d?l +?l?s?u?s?s?s?d?u +?l?s?u?s?s?s?d?s +?l?s?u?s?s?s?l?d +?l?s?u?s?s?s?u?d +?l?s?u?s?s?s?s?d +?l?s?s?d?d?d?d?u +?l?s?s?d?d?d?l?u +?l?s?s?d?d?d?u?d +?l?s?s?d?d?d?u?l +?l?s?s?d?d?d?u?u +?l?s?s?d?d?d?u?s +?l?s?s?d?d?d?s?u +?l?s?s?d?d?l?d?u +?l?s?s?d?d?l?l?u +?l?s?s?d?d?l?u?d +?l?s?s?d?d?l?u?l +?l?s?s?d?d?l?u?u +?l?s?s?d?d?l?u?s +?l?s?s?d?d?l?s?u +?l?s?s?d?d?u?d?d +?l?s?s?d?d?u?d?l +?l?s?s?d?d?u?d?u +?l?s?s?d?d?u?d?s +?l?s?s?d?d?u?l?d +?l?s?s?d?d?u?l?l +?l?s?s?d?d?u?l?u +?l?s?s?d?d?u?l?s +?l?s?s?d?d?u?u?d +?l?s?s?d?d?u?u?l +?l?s?s?d?d?u?u?u +?l?s?s?d?d?u?u?s +?l?s?s?d?d?u?s?d +?l?s?s?d?d?u?s?l +?l?s?s?d?d?u?s?u +?l?s?s?d?d?u?s?s +?l?s?s?d?d?s?d?u +?l?s?s?d?d?s?l?u +?l?s?s?d?d?s?u?d +?l?s?s?d?d?s?u?l +?l?s?s?d?d?s?u?u +?l?s?s?d?d?s?u?s +?l?s?s?d?d?s?s?u +?l?s?s?d?l?d?d?u +?l?s?s?d?l?d?l?u +?l?s?s?d?l?d?u?d +?l?s?s?d?l?d?u?l +?l?s?s?d?l?d?u?u +?l?s?s?d?l?d?u?s +?l?s?s?d?l?d?s?u +?l?s?s?d?l?l?d?u +?l?s?s?d?l?l?l?u +?l?s?s?d?l?l?u?d +?l?s?s?d?l?l?u?l +?l?s?s?d?l?l?u?u +?l?s?s?d?l?l?u?s +?l?s?s?d?l?l?s?u +?l?s?s?d?l?u?d?d +?l?s?s?d?l?u?d?l +?l?s?s?d?l?u?d?u +?l?s?s?d?l?u?d?s +?l?s?s?d?l?u?l?d +?l?s?s?d?l?u?l?l +?l?s?s?d?l?u?l?u +?l?s?s?d?l?u?l?s +?l?s?s?d?l?u?u?d +?l?s?s?d?l?u?u?l +?l?s?s?d?l?u?u?u +?l?s?s?d?l?u?u?s +?l?s?s?d?l?u?s?d +?l?s?s?d?l?u?s?l +?l?s?s?d?l?u?s?u +?l?s?s?d?l?u?s?s +?l?s?s?d?l?s?d?u +?l?s?s?d?l?s?l?u +?l?s?s?d?l?s?u?d +?l?s?s?d?l?s?u?l +?l?s?s?d?l?s?u?u +?l?s?s?d?l?s?u?s +?l?s?s?d?l?s?s?u +?l?s?s?d?u?d?d?d +?l?s?s?d?u?d?d?l +?l?s?s?d?u?d?d?u +?l?s?s?d?u?d?d?s +?l?s?s?d?u?d?l?d +?l?s?s?d?u?d?l?l +?l?s?s?d?u?d?l?u +?l?s?s?d?u?d?l?s +?l?s?s?d?u?d?u?d +?l?s?s?d?u?d?u?l +?l?s?s?d?u?d?u?u +?l?s?s?d?u?d?u?s +?l?s?s?d?u?d?s?d +?l?s?s?d?u?d?s?l +?l?s?s?d?u?d?s?u +?l?s?s?d?u?d?s?s +?l?s?s?d?u?l?d?d +?l?s?s?d?u?l?d?l +?l?s?s?d?u?l?d?u +?l?s?s?d?u?l?d?s +?l?s?s?d?u?l?l?d +?l?s?s?d?u?l?l?l +?l?s?s?d?u?l?l?u +?l?s?s?d?u?l?l?s +?l?s?s?d?u?l?u?d +?l?s?s?d?u?l?u?l +?l?s?s?d?u?l?u?u +?l?s?s?d?u?l?u?s +?l?s?s?d?u?l?s?d +?l?s?s?d?u?l?s?l +?l?s?s?d?u?l?s?u +?l?s?s?d?u?l?s?s +?l?s?s?d?u?u?d?d +?l?s?s?d?u?u?d?l +?l?s?s?d?u?u?d?u +?l?s?s?d?u?u?d?s +?l?s?s?d?u?u?l?d +?l?s?s?d?u?u?l?l +?l?s?s?d?u?u?l?u +?l?s?s?d?u?u?l?s +?l?s?s?d?u?u?u?d +?l?s?s?d?u?u?u?l +?l?s?s?d?u?u?u?u +?l?s?s?d?u?u?u?s +?l?s?s?d?u?u?s?d +?l?s?s?d?u?u?s?l +?l?s?s?d?u?u?s?u +?l?s?s?d?u?u?s?s +?l?s?s?d?u?s?d?d +?l?s?s?d?u?s?d?l +?l?s?s?d?u?s?d?u +?l?s?s?d?u?s?d?s +?l?s?s?d?u?s?l?d +?l?s?s?d?u?s?l?l +?l?s?s?d?u?s?l?u +?l?s?s?d?u?s?l?s +?l?s?s?d?u?s?u?d +?l?s?s?d?u?s?u?l +?l?s?s?d?u?s?u?u +?l?s?s?d?u?s?u?s +?l?s?s?d?u?s?s?d +?l?s?s?d?u?s?s?l +?l?s?s?d?u?s?s?u +?l?s?s?d?u?s?s?s +?l?s?s?d?s?d?d?u +?l?s?s?d?s?d?l?u +?l?s?s?d?s?d?u?d +?l?s?s?d?s?d?u?l +?l?s?s?d?s?d?u?u +?l?s?s?d?s?d?u?s +?l?s?s?d?s?d?s?u +?l?s?s?d?s?l?d?u +?l?s?s?d?s?l?l?u +?l?s?s?d?s?l?u?d +?l?s?s?d?s?l?u?l +?l?s?s?d?s?l?u?u +?l?s?s?d?s?l?u?s +?l?s?s?d?s?l?s?u +?l?s?s?d?s?u?d?d +?l?s?s?d?s?u?d?l +?l?s?s?d?s?u?d?u +?l?s?s?d?s?u?d?s +?l?s?s?d?s?u?l?d +?l?s?s?d?s?u?l?l +?l?s?s?d?s?u?l?u +?l?s?s?d?s?u?l?s +?l?s?s?d?s?u?u?d +?l?s?s?d?s?u?u?l +?l?s?s?d?s?u?u?u +?l?s?s?d?s?u?u?s +?l?s?s?d?s?u?s?d +?l?s?s?d?s?u?s?l +?l?s?s?d?s?u?s?u +?l?s?s?d?s?u?s?s +?l?s?s?d?s?s?d?u +?l?s?s?d?s?s?l?u +?l?s?s?d?s?s?u?d +?l?s?s?d?s?s?u?l +?l?s?s?d?s?s?u?u +?l?s?s?d?s?s?u?s +?l?s?s?d?s?s?s?u +?l?s?s?l?d?d?d?u +?l?s?s?l?d?d?l?u +?l?s?s?l?d?d?u?d +?l?s?s?l?d?d?u?l +?l?s?s?l?d?d?u?u +?l?s?s?l?d?d?u?s +?l?s?s?l?d?d?s?u +?l?s?s?l?d?l?d?u +?l?s?s?l?d?l?l?u +?l?s?s?l?d?l?u?d +?l?s?s?l?d?l?u?l +?l?s?s?l?d?l?u?u +?l?s?s?l?d?l?u?s +?l?s?s?l?d?l?s?u +?l?s?s?l?d?u?d?d +?l?s?s?l?d?u?d?l +?l?s?s?l?d?u?d?u +?l?s?s?l?d?u?d?s +?l?s?s?l?d?u?l?d +?l?s?s?l?d?u?l?l +?l?s?s?l?d?u?l?u +?l?s?s?l?d?u?l?s +?l?s?s?l?d?u?u?d +?l?s?s?l?d?u?u?l +?l?s?s?l?d?u?u?u +?l?s?s?l?d?u?u?s +?l?s?s?l?d?u?s?d +?l?s?s?l?d?u?s?l +?l?s?s?l?d?u?s?u +?l?s?s?l?d?u?s?s +?l?s?s?l?d?s?d?u +?l?s?s?l?d?s?l?u +?l?s?s?l?d?s?u?d +?l?s?s?l?d?s?u?l +?l?s?s?l?d?s?u?u +?l?s?s?l?d?s?u?s +?l?s?s?l?d?s?s?u +?l?s?s?l?l?d?d?u +?l?s?s?l?l?d?l?u +?l?s?s?l?l?d?u?d +?l?s?s?l?l?d?u?l +?l?s?s?l?l?d?u?u +?l?s?s?l?l?d?u?s +?l?s?s?l?l?d?s?u +?l?s?s?l?l?l?d?u +?l?s?s?l?l?l?u?d +?l?s?s?l?l?u?d?d +?l?s?s?l?l?u?d?l +?l?s?s?l?l?u?d?u +?l?s?s?l?l?u?d?s +?l?s?s?l?l?u?l?d +?l?s?s?l?l?u?u?d +?l?s?s?l?l?u?s?d +?l?s?s?l?l?s?d?u +?l?s?s?l?l?s?u?d +?l?s?s?l?u?d?d?d +?l?s?s?l?u?d?d?l +?l?s?s?l?u?d?d?u +?l?s?s?l?u?d?d?s +?l?s?s?l?u?d?l?d +?l?s?s?l?u?d?l?l +?l?s?s?l?u?d?l?u +?l?s?s?l?u?d?l?s +?l?s?s?l?u?d?u?d +?l?s?s?l?u?d?u?l +?l?s?s?l?u?d?u?u +?l?s?s?l?u?d?u?s +?l?s?s?l?u?d?s?d +?l?s?s?l?u?d?s?l +?l?s?s?l?u?d?s?u +?l?s?s?l?u?d?s?s +?l?s?s?l?u?l?d?d +?l?s?s?l?u?l?d?l +?l?s?s?l?u?l?d?u +?l?s?s?l?u?l?d?s +?l?s?s?l?u?l?l?d +?l?s?s?l?u?l?u?d +?l?s?s?l?u?l?s?d +?l?s?s?l?u?u?d?d +?l?s?s?l?u?u?d?l +?l?s?s?l?u?u?d?u +?l?s?s?l?u?u?d?s +?l?s?s?l?u?u?l?d +?l?s?s?l?u?u?u?d +?l?s?s?l?u?u?s?d +?l?s?s?l?u?s?d?d +?l?s?s?l?u?s?d?l +?l?s?s?l?u?s?d?u +?l?s?s?l?u?s?d?s +?l?s?s?l?u?s?l?d +?l?s?s?l?u?s?u?d +?l?s?s?l?u?s?s?d +?l?s?s?l?s?d?d?u +?l?s?s?l?s?d?l?u +?l?s?s?l?s?d?u?d +?l?s?s?l?s?d?u?l +?l?s?s?l?s?d?u?u +?l?s?s?l?s?d?u?s +?l?s?s?l?s?d?s?u +?l?s?s?l?s?l?d?u +?l?s?s?l?s?l?u?d +?l?s?s?l?s?u?d?d +?l?s?s?l?s?u?d?l +?l?s?s?l?s?u?d?u +?l?s?s?l?s?u?d?s +?l?s?s?l?s?u?l?d +?l?s?s?l?s?u?u?d +?l?s?s?l?s?u?s?d +?l?s?s?l?s?s?d?u +?l?s?s?l?s?s?u?d +?l?s?s?u?d?d?d?d +?l?s?s?u?d?d?d?l +?l?s?s?u?d?d?d?u +?l?s?s?u?d?d?d?s +?l?s?s?u?d?d?l?d +?l?s?s?u?d?d?l?l +?l?s?s?u?d?d?l?u +?l?s?s?u?d?d?l?s +?l?s?s?u?d?d?u?d +?l?s?s?u?d?d?u?l +?l?s?s?u?d?d?u?u +?l?s?s?u?d?d?u?s +?l?s?s?u?d?d?s?d +?l?s?s?u?d?d?s?l +?l?s?s?u?d?d?s?u +?l?s?s?u?d?d?s?s +?l?s?s?u?d?l?d?d +?l?s?s?u?d?l?d?l +?l?s?s?u?d?l?d?u +?l?s?s?u?d?l?d?s +?l?s?s?u?d?l?l?d +?l?s?s?u?d?l?l?l +?l?s?s?u?d?l?l?u +?l?s?s?u?d?l?l?s +?l?s?s?u?d?l?u?d +?l?s?s?u?d?l?u?l +?l?s?s?u?d?l?u?u +?l?s?s?u?d?l?u?s +?l?s?s?u?d?l?s?d +?l?s?s?u?d?l?s?l +?l?s?s?u?d?l?s?u +?l?s?s?u?d?l?s?s +?l?s?s?u?d?u?d?d +?l?s?s?u?d?u?d?l +?l?s?s?u?d?u?d?u +?l?s?s?u?d?u?d?s +?l?s?s?u?d?u?l?d +?l?s?s?u?d?u?l?l +?l?s?s?u?d?u?l?u +?l?s?s?u?d?u?l?s +?l?s?s?u?d?u?u?d +?l?s?s?u?d?u?u?l +?l?s?s?u?d?u?u?u +?l?s?s?u?d?u?u?s +?l?s?s?u?d?u?s?d +?l?s?s?u?d?u?s?l +?l?s?s?u?d?u?s?u +?l?s?s?u?d?u?s?s +?l?s?s?u?d?s?d?d +?l?s?s?u?d?s?d?l +?l?s?s?u?d?s?d?u +?l?s?s?u?d?s?d?s +?l?s?s?u?d?s?l?d +?l?s?s?u?d?s?l?l +?l?s?s?u?d?s?l?u +?l?s?s?u?d?s?l?s +?l?s?s?u?d?s?u?d +?l?s?s?u?d?s?u?l +?l?s?s?u?d?s?u?u +?l?s?s?u?d?s?u?s +?l?s?s?u?d?s?s?d +?l?s?s?u?d?s?s?l +?l?s?s?u?d?s?s?u +?l?s?s?u?d?s?s?s +?l?s?s?u?l?d?d?d +?l?s?s?u?l?d?d?l +?l?s?s?u?l?d?d?u +?l?s?s?u?l?d?d?s +?l?s?s?u?l?d?l?d +?l?s?s?u?l?d?l?l +?l?s?s?u?l?d?l?u +?l?s?s?u?l?d?l?s +?l?s?s?u?l?d?u?d +?l?s?s?u?l?d?u?l +?l?s?s?u?l?d?u?u +?l?s?s?u?l?d?u?s +?l?s?s?u?l?d?s?d +?l?s?s?u?l?d?s?l +?l?s?s?u?l?d?s?u +?l?s?s?u?l?d?s?s +?l?s?s?u?l?l?d?d +?l?s?s?u?l?l?d?l +?l?s?s?u?l?l?d?u +?l?s?s?u?l?l?d?s +?l?s?s?u?l?l?l?d +?l?s?s?u?l?l?u?d +?l?s?s?u?l?l?s?d +?l?s?s?u?l?u?d?d +?l?s?s?u?l?u?d?l +?l?s?s?u?l?u?d?u +?l?s?s?u?l?u?d?s +?l?s?s?u?l?u?l?d +?l?s?s?u?l?u?u?d +?l?s?s?u?l?u?s?d +?l?s?s?u?l?s?d?d +?l?s?s?u?l?s?d?l +?l?s?s?u?l?s?d?u +?l?s?s?u?l?s?d?s +?l?s?s?u?l?s?l?d +?l?s?s?u?l?s?u?d +?l?s?s?u?l?s?s?d +?l?s?s?u?u?d?d?d +?l?s?s?u?u?d?d?l +?l?s?s?u?u?d?d?u +?l?s?s?u?u?d?d?s +?l?s?s?u?u?d?l?d +?l?s?s?u?u?d?l?l +?l?s?s?u?u?d?l?u +?l?s?s?u?u?d?l?s +?l?s?s?u?u?d?u?d +?l?s?s?u?u?d?u?l +?l?s?s?u?u?d?u?u +?l?s?s?u?u?d?u?s +?l?s?s?u?u?d?s?d +?l?s?s?u?u?d?s?l +?l?s?s?u?u?d?s?u +?l?s?s?u?u?d?s?s +?l?s?s?u?u?l?d?d +?l?s?s?u?u?l?d?l +?l?s?s?u?u?l?d?u +?l?s?s?u?u?l?d?s +?l?s?s?u?u?l?l?d +?l?s?s?u?u?l?u?d +?l?s?s?u?u?l?s?d +?l?s?s?u?u?u?d?d +?l?s?s?u?u?u?d?l +?l?s?s?u?u?u?d?u +?l?s?s?u?u?u?d?s +?l?s?s?u?u?u?l?d +?l?s?s?u?u?u?u?d +?l?s?s?u?u?u?s?d +?l?s?s?u?u?s?d?d +?l?s?s?u?u?s?d?l +?l?s?s?u?u?s?d?u +?l?s?s?u?u?s?d?s +?l?s?s?u?u?s?l?d +?l?s?s?u?u?s?u?d +?l?s?s?u?u?s?s?d +?l?s?s?u?s?d?d?d +?l?s?s?u?s?d?d?l +?l?s?s?u?s?d?d?u +?l?s?s?u?s?d?d?s +?l?s?s?u?s?d?l?d +?l?s?s?u?s?d?l?l +?l?s?s?u?s?d?l?u +?l?s?s?u?s?d?l?s +?l?s?s?u?s?d?u?d +?l?s?s?u?s?d?u?l +?l?s?s?u?s?d?u?u +?l?s?s?u?s?d?u?s +?l?s?s?u?s?d?s?d +?l?s?s?u?s?d?s?l +?l?s?s?u?s?d?s?u +?l?s?s?u?s?d?s?s +?l?s?s?u?s?l?d?d +?l?s?s?u?s?l?d?l +?l?s?s?u?s?l?d?u +?l?s?s?u?s?l?d?s +?l?s?s?u?s?l?l?d +?l?s?s?u?s?l?u?d +?l?s?s?u?s?l?s?d +?l?s?s?u?s?u?d?d +?l?s?s?u?s?u?d?l +?l?s?s?u?s?u?d?u +?l?s?s?u?s?u?d?s +?l?s?s?u?s?u?l?d +?l?s?s?u?s?u?u?d +?l?s?s?u?s?u?s?d +?l?s?s?u?s?s?d?d +?l?s?s?u?s?s?d?l +?l?s?s?u?s?s?d?u +?l?s?s?u?s?s?d?s +?l?s?s?u?s?s?l?d +?l?s?s?u?s?s?u?d +?l?s?s?u?s?s?s?d +?l?s?s?s?d?d?d?u +?l?s?s?s?d?d?l?u +?l?s?s?s?d?d?u?d +?l?s?s?s?d?d?u?l +?l?s?s?s?d?d?u?u +?l?s?s?s?d?d?u?s +?l?s?s?s?d?d?s?u +?l?s?s?s?d?l?d?u +?l?s?s?s?d?l?l?u +?l?s?s?s?d?l?u?d +?l?s?s?s?d?l?u?l +?l?s?s?s?d?l?u?u +?l?s?s?s?d?l?u?s +?l?s?s?s?d?l?s?u +?l?s?s?s?d?u?d?d +?l?s?s?s?d?u?d?l +?l?s?s?s?d?u?d?u +?l?s?s?s?d?u?d?s +?l?s?s?s?d?u?l?d +?l?s?s?s?d?u?l?l +?l?s?s?s?d?u?l?u +?l?s?s?s?d?u?l?s +?l?s?s?s?d?u?u?d +?l?s?s?s?d?u?u?l +?l?s?s?s?d?u?u?u +?l?s?s?s?d?u?u?s +?l?s?s?s?d?u?s?d +?l?s?s?s?d?u?s?l +?l?s?s?s?d?u?s?u +?l?s?s?s?d?u?s?s +?l?s?s?s?d?s?d?u +?l?s?s?s?d?s?l?u +?l?s?s?s?d?s?u?d +?l?s?s?s?d?s?u?l +?l?s?s?s?d?s?u?u +?l?s?s?s?d?s?u?s +?l?s?s?s?d?s?s?u +?l?s?s?s?l?d?d?u +?l?s?s?s?l?d?l?u +?l?s?s?s?l?d?u?d +?l?s?s?s?l?d?u?l +?l?s?s?s?l?d?u?u +?l?s?s?s?l?d?u?s +?l?s?s?s?l?d?s?u +?l?s?s?s?l?l?d?u +?l?s?s?s?l?l?u?d +?l?s?s?s?l?u?d?d +?l?s?s?s?l?u?d?l +?l?s?s?s?l?u?d?u +?l?s?s?s?l?u?d?s +?l?s?s?s?l?u?l?d +?l?s?s?s?l?u?u?d +?l?s?s?s?l?u?s?d +?l?s?s?s?l?s?d?u +?l?s?s?s?l?s?u?d +?l?s?s?s?u?d?d?d +?l?s?s?s?u?d?d?l +?l?s?s?s?u?d?d?u +?l?s?s?s?u?d?d?s +?l?s?s?s?u?d?l?d +?l?s?s?s?u?d?l?l +?l?s?s?s?u?d?l?u +?l?s?s?s?u?d?l?s +?l?s?s?s?u?d?u?d +?l?s?s?s?u?d?u?l +?l?s?s?s?u?d?u?u +?l?s?s?s?u?d?u?s +?l?s?s?s?u?d?s?d +?l?s?s?s?u?d?s?l +?l?s?s?s?u?d?s?u +?l?s?s?s?u?d?s?s +?l?s?s?s?u?l?d?d +?l?s?s?s?u?l?d?l +?l?s?s?s?u?l?d?u +?l?s?s?s?u?l?d?s +?l?s?s?s?u?l?l?d +?l?s?s?s?u?l?u?d +?l?s?s?s?u?l?s?d +?l?s?s?s?u?u?d?d +?l?s?s?s?u?u?d?l +?l?s?s?s?u?u?d?u +?l?s?s?s?u?u?d?s +?l?s?s?s?u?u?l?d +?l?s?s?s?u?u?u?d +?l?s?s?s?u?u?s?d +?l?s?s?s?u?s?d?d +?l?s?s?s?u?s?d?l +?l?s?s?s?u?s?d?u +?l?s?s?s?u?s?d?s +?l?s?s?s?u?s?l?d +?l?s?s?s?u?s?u?d +?l?s?s?s?u?s?s?d +?l?s?s?s?s?d?d?u +?l?s?s?s?s?d?l?u +?l?s?s?s?s?d?u?d +?l?s?s?s?s?d?u?l +?l?s?s?s?s?d?u?u +?l?s?s?s?s?d?u?s +?l?s?s?s?s?d?s?u +?l?s?s?s?s?l?d?u +?l?s?s?s?s?l?u?d +?l?s?s?s?s?u?d?d +?l?s?s?s?s?u?d?l +?l?s?s?s?s?u?d?u +?l?s?s?s?s?u?d?s +?l?s?s?s?s?u?l?d +?l?s?s?s?s?u?u?d +?l?s?s?s?s?u?s?d +?l?s?s?s?s?s?d?u +?l?s?s?s?s?s?u?d +?u?d?d?d?d?d?l?s +?u?d?d?d?d?d?s?l +?u?d?d?d?d?l?d?s +?u?d?d?d?d?l?l?s +?u?d?d?d?d?l?u?s +?u?d?d?d?d?l?s?d +?u?d?d?d?d?l?s?l +?u?d?d?d?d?l?s?u +?u?d?d?d?d?l?s?s +?u?d?d?d?d?u?l?s +?u?d?d?d?d?u?s?l +?u?d?d?d?d?s?d?l +?u?d?d?d?d?s?l?d +?u?d?d?d?d?s?l?l +?u?d?d?d?d?s?l?u +?u?d?d?d?d?s?l?s +?u?d?d?d?d?s?u?l +?u?d?d?d?d?s?s?l +?u?d?d?d?l?d?d?s +?u?d?d?d?l?d?l?s +?u?d?d?d?l?d?u?s +?u?d?d?d?l?d?s?d +?u?d?d?d?l?d?s?l +?u?d?d?d?l?d?s?u +?u?d?d?d?l?d?s?s +?u?d?d?d?l?l?d?s +?u?d?d?d?l?l?l?s +?u?d?d?d?l?l?u?s +?u?d?d?d?l?l?s?d +?u?d?d?d?l?l?s?l +?u?d?d?d?l?l?s?u +?u?d?d?d?l?l?s?s +?u?d?d?d?l?u?d?s +?u?d?d?d?l?u?l?s +?u?d?d?d?l?u?u?s +?u?d?d?d?l?u?s?d +?u?d?d?d?l?u?s?l +?u?d?d?d?l?u?s?u +?u?d?d?d?l?u?s?s +?u?d?d?d?l?s?d?d +?u?d?d?d?l?s?d?l +?u?d?d?d?l?s?d?u +?u?d?d?d?l?s?d?s +?u?d?d?d?l?s?l?d +?u?d?d?d?l?s?l?l +?u?d?d?d?l?s?l?u +?u?d?d?d?l?s?l?s +?u?d?d?d?l?s?u?d +?u?d?d?d?l?s?u?l +?u?d?d?d?l?s?u?u +?u?d?d?d?l?s?u?s +?u?d?d?d?l?s?s?d +?u?d?d?d?l?s?s?l +?u?d?d?d?l?s?s?u +?u?d?d?d?l?s?s?s +?u?d?d?d?u?d?l?s +?u?d?d?d?u?d?s?l +?u?d?d?d?u?l?d?s +?u?d?d?d?u?l?l?s +?u?d?d?d?u?l?u?s +?u?d?d?d?u?l?s?d +?u?d?d?d?u?l?s?l +?u?d?d?d?u?l?s?u +?u?d?d?d?u?l?s?s +?u?d?d?d?u?u?l?s +?u?d?d?d?u?u?s?l +?u?d?d?d?u?s?d?l +?u?d?d?d?u?s?l?d +?u?d?d?d?u?s?l?l +?u?d?d?d?u?s?l?u +?u?d?d?d?u?s?l?s +?u?d?d?d?u?s?u?l +?u?d?d?d?u?s?s?l +?u?d?d?d?s?d?d?l +?u?d?d?d?s?d?l?d +?u?d?d?d?s?d?l?l +?u?d?d?d?s?d?l?u +?u?d?d?d?s?d?l?s +?u?d?d?d?s?d?u?l +?u?d?d?d?s?d?s?l +?u?d?d?d?s?l?d?d +?u?d?d?d?s?l?d?l +?u?d?d?d?s?l?d?u +?u?d?d?d?s?l?d?s +?u?d?d?d?s?l?l?d +?u?d?d?d?s?l?l?l +?u?d?d?d?s?l?l?u +?u?d?d?d?s?l?l?s +?u?d?d?d?s?l?u?d +?u?d?d?d?s?l?u?l +?u?d?d?d?s?l?u?u +?u?d?d?d?s?l?u?s +?u?d?d?d?s?l?s?d +?u?d?d?d?s?l?s?l +?u?d?d?d?s?l?s?u +?u?d?d?d?s?l?s?s +?u?d?d?d?s?u?d?l +?u?d?d?d?s?u?l?d +?u?d?d?d?s?u?l?l +?u?d?d?d?s?u?l?u +?u?d?d?d?s?u?l?s +?u?d?d?d?s?u?u?l +?u?d?d?d?s?u?s?l +?u?d?d?d?s?s?d?l +?u?d?d?d?s?s?l?d +?u?d?d?d?s?s?l?l +?u?d?d?d?s?s?l?u +?u?d?d?d?s?s?l?s +?u?d?d?d?s?s?u?l +?u?d?d?d?s?s?s?l +?u?d?d?l?d?d?d?s +?u?d?d?l?d?d?l?s +?u?d?d?l?d?d?u?s +?u?d?d?l?d?d?s?d +?u?d?d?l?d?d?s?l +?u?d?d?l?d?d?s?u +?u?d?d?l?d?d?s?s +?u?d?d?l?d?l?d?s +?u?d?d?l?d?l?l?s +?u?d?d?l?d?l?u?s +?u?d?d?l?d?l?s?d +?u?d?d?l?d?l?s?l +?u?d?d?l?d?l?s?u +?u?d?d?l?d?l?s?s +?u?d?d?l?d?u?d?s +?u?d?d?l?d?u?l?s +?u?d?d?l?d?u?u?s +?u?d?d?l?d?u?s?d +?u?d?d?l?d?u?s?l +?u?d?d?l?d?u?s?u +?u?d?d?l?d?u?s?s +?u?d?d?l?d?s?d?d +?u?d?d?l?d?s?d?l +?u?d?d?l?d?s?d?u +?u?d?d?l?d?s?d?s +?u?d?d?l?d?s?l?d +?u?d?d?l?d?s?l?l +?u?d?d?l?d?s?l?u +?u?d?d?l?d?s?l?s +?u?d?d?l?d?s?u?d +?u?d?d?l?d?s?u?l +?u?d?d?l?d?s?u?u +?u?d?d?l?d?s?u?s +?u?d?d?l?d?s?s?d +?u?d?d?l?d?s?s?l +?u?d?d?l?d?s?s?u +?u?d?d?l?d?s?s?s +?u?d?d?l?l?d?d?s +?u?d?d?l?l?d?l?s +?u?d?d?l?l?d?u?s +?u?d?d?l?l?d?s?d +?u?d?d?l?l?d?s?l +?u?d?d?l?l?d?s?u +?u?d?d?l?l?d?s?s +?u?d?d?l?l?l?d?s +?u?d?d?l?l?l?l?s +?u?d?d?l?l?l?u?s +?u?d?d?l?l?l?s?d +?u?d?d?l?l?l?s?l +?u?d?d?l?l?l?s?u +?u?d?d?l?l?l?s?s +?u?d?d?l?l?u?d?s +?u?d?d?l?l?u?l?s +?u?d?d?l?l?u?u?s +?u?d?d?l?l?u?s?d +?u?d?d?l?l?u?s?l +?u?d?d?l?l?u?s?u +?u?d?d?l?l?u?s?s +?u?d?d?l?l?s?d?d +?u?d?d?l?l?s?d?l +?u?d?d?l?l?s?d?u +?u?d?d?l?l?s?d?s +?u?d?d?l?l?s?l?d +?u?d?d?l?l?s?l?l +?u?d?d?l?l?s?l?u +?u?d?d?l?l?s?l?s +?u?d?d?l?l?s?u?d +?u?d?d?l?l?s?u?l +?u?d?d?l?l?s?u?u +?u?d?d?l?l?s?u?s +?u?d?d?l?l?s?s?d +?u?d?d?l?l?s?s?l +?u?d?d?l?l?s?s?u +?u?d?d?l?l?s?s?s +?u?d?d?l?u?d?d?s +?u?d?d?l?u?d?l?s +?u?d?d?l?u?d?u?s +?u?d?d?l?u?d?s?d +?u?d?d?l?u?d?s?l +?u?d?d?l?u?d?s?u +?u?d?d?l?u?d?s?s +?u?d?d?l?u?l?d?s +?u?d?d?l?u?l?l?s +?u?d?d?l?u?l?u?s +?u?d?d?l?u?l?s?d +?u?d?d?l?u?l?s?l +?u?d?d?l?u?l?s?u +?u?d?d?l?u?l?s?s +?u?d?d?l?u?u?d?s +?u?d?d?l?u?u?l?s +?u?d?d?l?u?u?u?s +?u?d?d?l?u?u?s?d +?u?d?d?l?u?u?s?l +?u?d?d?l?u?u?s?u +?u?d?d?l?u?u?s?s +?u?d?d?l?u?s?d?d +?u?d?d?l?u?s?d?l +?u?d?d?l?u?s?d?u +?u?d?d?l?u?s?d?s +?u?d?d?l?u?s?l?d +?u?d?d?l?u?s?l?l +?u?d?d?l?u?s?l?u +?u?d?d?l?u?s?l?s +?u?d?d?l?u?s?u?d +?u?d?d?l?u?s?u?l +?u?d?d?l?u?s?u?u +?u?d?d?l?u?s?u?s +?u?d?d?l?u?s?s?d +?u?d?d?l?u?s?s?l +?u?d?d?l?u?s?s?u +?u?d?d?l?u?s?s?s +?u?d?d?l?s?d?d?d +?u?d?d?l?s?d?d?l +?u?d?d?l?s?d?d?u +?u?d?d?l?s?d?d?s +?u?d?d?l?s?d?l?d +?u?d?d?l?s?d?l?l +?u?d?d?l?s?d?l?u +?u?d?d?l?s?d?l?s +?u?d?d?l?s?d?u?d +?u?d?d?l?s?d?u?l +?u?d?d?l?s?d?u?u +?u?d?d?l?s?d?u?s +?u?d?d?l?s?d?s?d +?u?d?d?l?s?d?s?l +?u?d?d?l?s?d?s?u +?u?d?d?l?s?d?s?s +?u?d?d?l?s?l?d?d +?u?d?d?l?s?l?d?l +?u?d?d?l?s?l?d?u +?u?d?d?l?s?l?d?s +?u?d?d?l?s?l?l?d +?u?d?d?l?s?l?l?l +?u?d?d?l?s?l?l?u +?u?d?d?l?s?l?l?s +?u?d?d?l?s?l?u?d +?u?d?d?l?s?l?u?l +?u?d?d?l?s?l?u?u +?u?d?d?l?s?l?u?s +?u?d?d?l?s?l?s?d +?u?d?d?l?s?l?s?l +?u?d?d?l?s?l?s?u +?u?d?d?l?s?l?s?s +?u?d?d?l?s?u?d?d +?u?d?d?l?s?u?d?l +?u?d?d?l?s?u?d?u +?u?d?d?l?s?u?d?s +?u?d?d?l?s?u?l?d +?u?d?d?l?s?u?l?l +?u?d?d?l?s?u?l?u +?u?d?d?l?s?u?l?s +?u?d?d?l?s?u?u?d +?u?d?d?l?s?u?u?l +?u?d?d?l?s?u?u?u +?u?d?d?l?s?u?u?s +?u?d?d?l?s?u?s?d +?u?d?d?l?s?u?s?l +?u?d?d?l?s?u?s?u +?u?d?d?l?s?u?s?s +?u?d?d?l?s?s?d?d +?u?d?d?l?s?s?d?l +?u?d?d?l?s?s?d?u +?u?d?d?l?s?s?d?s +?u?d?d?l?s?s?l?d +?u?d?d?l?s?s?l?l +?u?d?d?l?s?s?l?u +?u?d?d?l?s?s?l?s +?u?d?d?l?s?s?u?d +?u?d?d?l?s?s?u?l +?u?d?d?l?s?s?u?u +?u?d?d?l?s?s?u?s +?u?d?d?l?s?s?s?d +?u?d?d?l?s?s?s?l +?u?d?d?l?s?s?s?u +?u?d?d?l?s?s?s?s +?u?d?d?u?d?d?l?s +?u?d?d?u?d?d?s?l +?u?d?d?u?d?l?d?s +?u?d?d?u?d?l?l?s +?u?d?d?u?d?l?u?s +?u?d?d?u?d?l?s?d +?u?d?d?u?d?l?s?l +?u?d?d?u?d?l?s?u +?u?d?d?u?d?l?s?s +?u?d?d?u?d?u?l?s +?u?d?d?u?d?u?s?l +?u?d?d?u?d?s?d?l +?u?d?d?u?d?s?l?d +?u?d?d?u?d?s?l?l +?u?d?d?u?d?s?l?u +?u?d?d?u?d?s?l?s +?u?d?d?u?d?s?u?l +?u?d?d?u?d?s?s?l +?u?d?d?u?l?d?d?s +?u?d?d?u?l?d?l?s +?u?d?d?u?l?d?u?s +?u?d?d?u?l?d?s?d +?u?d?d?u?l?d?s?l +?u?d?d?u?l?d?s?u +?u?d?d?u?l?d?s?s +?u?d?d?u?l?l?d?s +?u?d?d?u?l?l?l?s +?u?d?d?u?l?l?u?s +?u?d?d?u?l?l?s?d +?u?d?d?u?l?l?s?l +?u?d?d?u?l?l?s?u +?u?d?d?u?l?l?s?s +?u?d?d?u?l?u?d?s +?u?d?d?u?l?u?l?s +?u?d?d?u?l?u?u?s +?u?d?d?u?l?u?s?d +?u?d?d?u?l?u?s?l +?u?d?d?u?l?u?s?u +?u?d?d?u?l?u?s?s +?u?d?d?u?l?s?d?d +?u?d?d?u?l?s?d?l +?u?d?d?u?l?s?d?u +?u?d?d?u?l?s?d?s +?u?d?d?u?l?s?l?d +?u?d?d?u?l?s?l?l +?u?d?d?u?l?s?l?u +?u?d?d?u?l?s?l?s +?u?d?d?u?l?s?u?d +?u?d?d?u?l?s?u?l +?u?d?d?u?l?s?u?u +?u?d?d?u?l?s?u?s +?u?d?d?u?l?s?s?d +?u?d?d?u?l?s?s?l +?u?d?d?u?l?s?s?u +?u?d?d?u?l?s?s?s +?u?d?d?u?u?d?l?s +?u?d?d?u?u?d?s?l +?u?d?d?u?u?l?d?s +?u?d?d?u?u?l?l?s +?u?d?d?u?u?l?u?s +?u?d?d?u?u?l?s?d +?u?d?d?u?u?l?s?l +?u?d?d?u?u?l?s?u +?u?d?d?u?u?l?s?s +?u?d?d?u?u?u?l?s +?u?d?d?u?u?u?s?l +?u?d?d?u?u?s?d?l +?u?d?d?u?u?s?l?d +?u?d?d?u?u?s?l?l +?u?d?d?u?u?s?l?u +?u?d?d?u?u?s?l?s +?u?d?d?u?u?s?u?l +?u?d?d?u?u?s?s?l +?u?d?d?u?s?d?d?l +?u?d?d?u?s?d?l?d +?u?d?d?u?s?d?l?l +?u?d?d?u?s?d?l?u +?u?d?d?u?s?d?l?s +?u?d?d?u?s?d?u?l +?u?d?d?u?s?d?s?l +?u?d?d?u?s?l?d?d +?u?d?d?u?s?l?d?l +?u?d?d?u?s?l?d?u +?u?d?d?u?s?l?d?s +?u?d?d?u?s?l?l?d +?u?d?d?u?s?l?l?l +?u?d?d?u?s?l?l?u +?u?d?d?u?s?l?l?s +?u?d?d?u?s?l?u?d +?u?d?d?u?s?l?u?l +?u?d?d?u?s?l?u?u +?u?d?d?u?s?l?u?s +?u?d?d?u?s?l?s?d +?u?d?d?u?s?l?s?l +?u?d?d?u?s?l?s?u +?u?d?d?u?s?l?s?s +?u?d?d?u?s?u?d?l +?u?d?d?u?s?u?l?d +?u?d?d?u?s?u?l?l +?u?d?d?u?s?u?l?u +?u?d?d?u?s?u?l?s +?u?d?d?u?s?u?u?l +?u?d?d?u?s?u?s?l +?u?d?d?u?s?s?d?l +?u?d?d?u?s?s?l?d +?u?d?d?u?s?s?l?l +?u?d?d?u?s?s?l?u +?u?d?d?u?s?s?l?s +?u?d?d?u?s?s?u?l +?u?d?d?u?s?s?s?l +?u?d?d?s?d?d?d?l +?u?d?d?s?d?d?l?d +?u?d?d?s?d?d?l?l +?u?d?d?s?d?d?l?u +?u?d?d?s?d?d?l?s +?u?d?d?s?d?d?u?l +?u?d?d?s?d?d?s?l +?u?d?d?s?d?l?d?d +?u?d?d?s?d?l?d?l +?u?d?d?s?d?l?d?u +?u?d?d?s?d?l?d?s +?u?d?d?s?d?l?l?d +?u?d?d?s?d?l?l?l +?u?d?d?s?d?l?l?u +?u?d?d?s?d?l?l?s +?u?d?d?s?d?l?u?d +?u?d?d?s?d?l?u?l +?u?d?d?s?d?l?u?u +?u?d?d?s?d?l?u?s +?u?d?d?s?d?l?s?d +?u?d?d?s?d?l?s?l +?u?d?d?s?d?l?s?u +?u?d?d?s?d?l?s?s +?u?d?d?s?d?u?d?l +?u?d?d?s?d?u?l?d +?u?d?d?s?d?u?l?l +?u?d?d?s?d?u?l?u +?u?d?d?s?d?u?l?s +?u?d?d?s?d?u?u?l +?u?d?d?s?d?u?s?l +?u?d?d?s?d?s?d?l +?u?d?d?s?d?s?l?d +?u?d?d?s?d?s?l?l +?u?d?d?s?d?s?l?u +?u?d?d?s?d?s?l?s +?u?d?d?s?d?s?u?l +?u?d?d?s?d?s?s?l +?u?d?d?s?l?d?d?d +?u?d?d?s?l?d?d?l +?u?d?d?s?l?d?d?u +?u?d?d?s?l?d?d?s +?u?d?d?s?l?d?l?d +?u?d?d?s?l?d?l?l +?u?d?d?s?l?d?l?u +?u?d?d?s?l?d?l?s +?u?d?d?s?l?d?u?d +?u?d?d?s?l?d?u?l +?u?d?d?s?l?d?u?u +?u?d?d?s?l?d?u?s +?u?d?d?s?l?d?s?d +?u?d?d?s?l?d?s?l +?u?d?d?s?l?d?s?u +?u?d?d?s?l?d?s?s +?u?d?d?s?l?l?d?d +?u?d?d?s?l?l?d?l +?u?d?d?s?l?l?d?u +?u?d?d?s?l?l?d?s +?u?d?d?s?l?l?l?d +?u?d?d?s?l?l?l?l +?u?d?d?s?l?l?l?u +?u?d?d?s?l?l?l?s +?u?d?d?s?l?l?u?d +?u?d?d?s?l?l?u?l +?u?d?d?s?l?l?u?u +?u?d?d?s?l?l?u?s +?u?d?d?s?l?l?s?d +?u?d?d?s?l?l?s?l +?u?d?d?s?l?l?s?u +?u?d?d?s?l?l?s?s +?u?d?d?s?l?u?d?d +?u?d?d?s?l?u?d?l +?u?d?d?s?l?u?d?u +?u?d?d?s?l?u?d?s +?u?d?d?s?l?u?l?d +?u?d?d?s?l?u?l?l +?u?d?d?s?l?u?l?u +?u?d?d?s?l?u?l?s +?u?d?d?s?l?u?u?d +?u?d?d?s?l?u?u?l +?u?d?d?s?l?u?u?u +?u?d?d?s?l?u?u?s +?u?d?d?s?l?u?s?d +?u?d?d?s?l?u?s?l +?u?d?d?s?l?u?s?u +?u?d?d?s?l?u?s?s +?u?d?d?s?l?s?d?d +?u?d?d?s?l?s?d?l +?u?d?d?s?l?s?d?u +?u?d?d?s?l?s?d?s +?u?d?d?s?l?s?l?d +?u?d?d?s?l?s?l?l +?u?d?d?s?l?s?l?u +?u?d?d?s?l?s?l?s +?u?d?d?s?l?s?u?d +?u?d?d?s?l?s?u?l +?u?d?d?s?l?s?u?u +?u?d?d?s?l?s?u?s +?u?d?d?s?l?s?s?d +?u?d?d?s?l?s?s?l +?u?d?d?s?l?s?s?u +?u?d?d?s?l?s?s?s +?u?d?d?s?u?d?d?l +?u?d?d?s?u?d?l?d +?u?d?d?s?u?d?l?l +?u?d?d?s?u?d?l?u +?u?d?d?s?u?d?l?s +?u?d?d?s?u?d?u?l +?u?d?d?s?u?d?s?l +?u?d?d?s?u?l?d?d +?u?d?d?s?u?l?d?l +?u?d?d?s?u?l?d?u +?u?d?d?s?u?l?d?s +?u?d?d?s?u?l?l?d +?u?d?d?s?u?l?l?l +?u?d?d?s?u?l?l?u +?u?d?d?s?u?l?l?s +?u?d?d?s?u?l?u?d +?u?d?d?s?u?l?u?l +?u?d?d?s?u?l?u?u +?u?d?d?s?u?l?u?s +?u?d?d?s?u?l?s?d +?u?d?d?s?u?l?s?l +?u?d?d?s?u?l?s?u +?u?d?d?s?u?l?s?s +?u?d?d?s?u?u?d?l +?u?d?d?s?u?u?l?d +?u?d?d?s?u?u?l?l +?u?d?d?s?u?u?l?u +?u?d?d?s?u?u?l?s +?u?d?d?s?u?u?u?l +?u?d?d?s?u?u?s?l +?u?d?d?s?u?s?d?l +?u?d?d?s?u?s?l?d +?u?d?d?s?u?s?l?l +?u?d?d?s?u?s?l?u +?u?d?d?s?u?s?l?s +?u?d?d?s?u?s?u?l +?u?d?d?s?u?s?s?l +?u?d?d?s?s?d?d?l +?u?d?d?s?s?d?l?d +?u?d?d?s?s?d?l?l +?u?d?d?s?s?d?l?u +?u?d?d?s?s?d?l?s +?u?d?d?s?s?d?u?l +?u?d?d?s?s?d?s?l +?u?d?d?s?s?l?d?d +?u?d?d?s?s?l?d?l +?u?d?d?s?s?l?d?u +?u?d?d?s?s?l?d?s +?u?d?d?s?s?l?l?d +?u?d?d?s?s?l?l?l +?u?d?d?s?s?l?l?u +?u?d?d?s?s?l?l?s +?u?d?d?s?s?l?u?d +?u?d?d?s?s?l?u?l +?u?d?d?s?s?l?u?u +?u?d?d?s?s?l?u?s +?u?d?d?s?s?l?s?d +?u?d?d?s?s?l?s?l +?u?d?d?s?s?l?s?u +?u?d?d?s?s?l?s?s +?u?d?d?s?s?u?d?l +?u?d?d?s?s?u?l?d +?u?d?d?s?s?u?l?l +?u?d?d?s?s?u?l?u +?u?d?d?s?s?u?l?s +?u?d?d?s?s?u?u?l +?u?d?d?s?s?u?s?l +?u?d?d?s?s?s?d?l +?u?d?d?s?s?s?l?d +?u?d?d?s?s?s?l?l +?u?d?d?s?s?s?l?u +?u?d?d?s?s?s?l?s +?u?d?d?s?s?s?u?l +?u?d?d?s?s?s?s?l +?u?d?l?d?d?d?d?s +?u?d?l?d?d?d?l?s +?u?d?l?d?d?d?u?s +?u?d?l?d?d?d?s?d +?u?d?l?d?d?d?s?l +?u?d?l?d?d?d?s?u +?u?d?l?d?d?d?s?s +?u?d?l?d?d?l?d?s +?u?d?l?d?d?l?l?s +?u?d?l?d?d?l?u?s +?u?d?l?d?d?l?s?d +?u?d?l?d?d?l?s?l +?u?d?l?d?d?l?s?u +?u?d?l?d?d?l?s?s +?u?d?l?d?d?u?d?s +?u?d?l?d?d?u?l?s +?u?d?l?d?d?u?u?s +?u?d?l?d?d?u?s?d +?u?d?l?d?d?u?s?l +?u?d?l?d?d?u?s?u +?u?d?l?d?d?u?s?s +?u?d?l?d?d?s?d?d +?u?d?l?d?d?s?d?l +?u?d?l?d?d?s?d?u +?u?d?l?d?d?s?d?s +?u?d?l?d?d?s?l?d +?u?d?l?d?d?s?l?l +?u?d?l?d?d?s?l?u +?u?d?l?d?d?s?l?s +?u?d?l?d?d?s?u?d +?u?d?l?d?d?s?u?l +?u?d?l?d?d?s?u?u +?u?d?l?d?d?s?u?s +?u?d?l?d?d?s?s?d +?u?d?l?d?d?s?s?l +?u?d?l?d?d?s?s?u +?u?d?l?d?d?s?s?s +?u?d?l?d?l?d?d?s +?u?d?l?d?l?d?l?s +?u?d?l?d?l?d?u?s +?u?d?l?d?l?d?s?d +?u?d?l?d?l?d?s?l +?u?d?l?d?l?d?s?u +?u?d?l?d?l?d?s?s +?u?d?l?d?l?l?d?s +?u?d?l?d?l?l?l?s +?u?d?l?d?l?l?u?s +?u?d?l?d?l?l?s?d +?u?d?l?d?l?l?s?l +?u?d?l?d?l?l?s?u +?u?d?l?d?l?l?s?s +?u?d?l?d?l?u?d?s +?u?d?l?d?l?u?l?s +?u?d?l?d?l?u?u?s +?u?d?l?d?l?u?s?d +?u?d?l?d?l?u?s?l +?u?d?l?d?l?u?s?u +?u?d?l?d?l?u?s?s +?u?d?l?d?l?s?d?d +?u?d?l?d?l?s?d?l +?u?d?l?d?l?s?d?u +?u?d?l?d?l?s?d?s +?u?d?l?d?l?s?l?d +?u?d?l?d?l?s?l?l +?u?d?l?d?l?s?l?u +?u?d?l?d?l?s?l?s +?u?d?l?d?l?s?u?d +?u?d?l?d?l?s?u?l +?u?d?l?d?l?s?u?u +?u?d?l?d?l?s?u?s +?u?d?l?d?l?s?s?d +?u?d?l?d?l?s?s?l +?u?d?l?d?l?s?s?u +?u?d?l?d?l?s?s?s +?u?d?l?d?u?d?d?s +?u?d?l?d?u?d?l?s +?u?d?l?d?u?d?u?s +?u?d?l?d?u?d?s?d +?u?d?l?d?u?d?s?l +?u?d?l?d?u?d?s?u +?u?d?l?d?u?d?s?s +?u?d?l?d?u?l?d?s +?u?d?l?d?u?l?l?s +?u?d?l?d?u?l?u?s +?u?d?l?d?u?l?s?d +?u?d?l?d?u?l?s?l +?u?d?l?d?u?l?s?u +?u?d?l?d?u?l?s?s +?u?d?l?d?u?u?d?s +?u?d?l?d?u?u?l?s +?u?d?l?d?u?u?u?s +?u?d?l?d?u?u?s?d +?u?d?l?d?u?u?s?l +?u?d?l?d?u?u?s?u +?u?d?l?d?u?u?s?s +?u?d?l?d?u?s?d?d +?u?d?l?d?u?s?d?l +?u?d?l?d?u?s?d?u +?u?d?l?d?u?s?d?s +?u?d?l?d?u?s?l?d +?u?d?l?d?u?s?l?l +?u?d?l?d?u?s?l?u +?u?d?l?d?u?s?l?s +?u?d?l?d?u?s?u?d +?u?d?l?d?u?s?u?l +?u?d?l?d?u?s?u?u +?u?d?l?d?u?s?u?s +?u?d?l?d?u?s?s?d +?u?d?l?d?u?s?s?l +?u?d?l?d?u?s?s?u +?u?d?l?d?u?s?s?s +?u?d?l?d?s?d?d?d +?u?d?l?d?s?d?d?l +?u?d?l?d?s?d?d?u +?u?d?l?d?s?d?d?s +?u?d?l?d?s?d?l?d +?u?d?l?d?s?d?l?l +?u?d?l?d?s?d?l?u +?u?d?l?d?s?d?l?s +?u?d?l?d?s?d?u?d +?u?d?l?d?s?d?u?l +?u?d?l?d?s?d?u?u +?u?d?l?d?s?d?u?s +?u?d?l?d?s?d?s?d +?u?d?l?d?s?d?s?l +?u?d?l?d?s?d?s?u +?u?d?l?d?s?d?s?s +?u?d?l?d?s?l?d?d +?u?d?l?d?s?l?d?l +?u?d?l?d?s?l?d?u +?u?d?l?d?s?l?d?s +?u?d?l?d?s?l?l?d +?u?d?l?d?s?l?l?l +?u?d?l?d?s?l?l?u +?u?d?l?d?s?l?l?s +?u?d?l?d?s?l?u?d +?u?d?l?d?s?l?u?l +?u?d?l?d?s?l?u?u +?u?d?l?d?s?l?u?s +?u?d?l?d?s?l?s?d +?u?d?l?d?s?l?s?l +?u?d?l?d?s?l?s?u +?u?d?l?d?s?l?s?s +?u?d?l?d?s?u?d?d +?u?d?l?d?s?u?d?l +?u?d?l?d?s?u?d?u +?u?d?l?d?s?u?d?s +?u?d?l?d?s?u?l?d +?u?d?l?d?s?u?l?l +?u?d?l?d?s?u?l?u +?u?d?l?d?s?u?l?s +?u?d?l?d?s?u?u?d +?u?d?l?d?s?u?u?l +?u?d?l?d?s?u?u?u +?u?d?l?d?s?u?u?s +?u?d?l?d?s?u?s?d +?u?d?l?d?s?u?s?l +?u?d?l?d?s?u?s?u +?u?d?l?d?s?u?s?s +?u?d?l?d?s?s?d?d +?u?d?l?d?s?s?d?l +?u?d?l?d?s?s?d?u +?u?d?l?d?s?s?d?s +?u?d?l?d?s?s?l?d +?u?d?l?d?s?s?l?l +?u?d?l?d?s?s?l?u +?u?d?l?d?s?s?l?s +?u?d?l?d?s?s?u?d +?u?d?l?d?s?s?u?l +?u?d?l?d?s?s?u?u +?u?d?l?d?s?s?u?s +?u?d?l?d?s?s?s?d +?u?d?l?d?s?s?s?l +?u?d?l?d?s?s?s?u +?u?d?l?d?s?s?s?s +?u?d?l?l?d?d?d?s +?u?d?l?l?d?d?l?s +?u?d?l?l?d?d?u?s +?u?d?l?l?d?d?s?d +?u?d?l?l?d?d?s?l +?u?d?l?l?d?d?s?u +?u?d?l?l?d?d?s?s +?u?d?l?l?d?l?d?s +?u?d?l?l?d?l?l?s +?u?d?l?l?d?l?u?s +?u?d?l?l?d?l?s?d +?u?d?l?l?d?l?s?l +?u?d?l?l?d?l?s?u +?u?d?l?l?d?l?s?s +?u?d?l?l?d?u?d?s +?u?d?l?l?d?u?l?s +?u?d?l?l?d?u?u?s +?u?d?l?l?d?u?s?d +?u?d?l?l?d?u?s?l +?u?d?l?l?d?u?s?u +?u?d?l?l?d?u?s?s +?u?d?l?l?d?s?d?d +?u?d?l?l?d?s?d?l +?u?d?l?l?d?s?d?u +?u?d?l?l?d?s?d?s +?u?d?l?l?d?s?l?d +?u?d?l?l?d?s?l?l +?u?d?l?l?d?s?l?u +?u?d?l?l?d?s?l?s +?u?d?l?l?d?s?u?d +?u?d?l?l?d?s?u?l +?u?d?l?l?d?s?u?u +?u?d?l?l?d?s?u?s +?u?d?l?l?d?s?s?d +?u?d?l?l?d?s?s?l +?u?d?l?l?d?s?s?u +?u?d?l?l?d?s?s?s +?u?d?l?l?l?d?d?s +?u?d?l?l?l?d?l?s +?u?d?l?l?l?d?u?s +?u?d?l?l?l?d?s?d +?u?d?l?l?l?d?s?l +?u?d?l?l?l?d?s?u +?u?d?l?l?l?d?s?s +?u?d?l?l?l?l?d?s +?u?d?l?l?l?l?l?s +?u?d?l?l?l?l?u?s +?u?d?l?l?l?l?s?d +?u?d?l?l?l?l?s?l +?u?d?l?l?l?l?s?u +?u?d?l?l?l?l?s?s +?u?d?l?l?l?u?d?s +?u?d?l?l?l?u?l?s +?u?d?l?l?l?u?u?s +?u?d?l?l?l?u?s?d +?u?d?l?l?l?u?s?l +?u?d?l?l?l?u?s?u +?u?d?l?l?l?u?s?s +?u?d?l?l?l?s?d?d +?u?d?l?l?l?s?d?l +?u?d?l?l?l?s?d?u +?u?d?l?l?l?s?d?s +?u?d?l?l?l?s?l?d +?u?d?l?l?l?s?l?l +?u?d?l?l?l?s?l?u +?u?d?l?l?l?s?l?s +?u?d?l?l?l?s?u?d +?u?d?l?l?l?s?u?l +?u?d?l?l?l?s?u?u +?u?d?l?l?l?s?u?s +?u?d?l?l?l?s?s?d +?u?d?l?l?l?s?s?l +?u?d?l?l?l?s?s?u +?u?d?l?l?l?s?s?s +?u?d?l?l?u?d?d?s +?u?d?l?l?u?d?l?s +?u?d?l?l?u?d?u?s +?u?d?l?l?u?d?s?d +?u?d?l?l?u?d?s?l +?u?d?l?l?u?d?s?u +?u?d?l?l?u?d?s?s +?u?d?l?l?u?l?d?s +?u?d?l?l?u?l?l?s +?u?d?l?l?u?l?u?s +?u?d?l?l?u?l?s?d +?u?d?l?l?u?l?s?l +?u?d?l?l?u?l?s?u +?u?d?l?l?u?l?s?s +?u?d?l?l?u?u?d?s +?u?d?l?l?u?u?l?s +?u?d?l?l?u?u?u?s +?u?d?l?l?u?u?s?d +?u?d?l?l?u?u?s?l +?u?d?l?l?u?u?s?u +?u?d?l?l?u?u?s?s +?u?d?l?l?u?s?d?d +?u?d?l?l?u?s?d?l +?u?d?l?l?u?s?d?u +?u?d?l?l?u?s?d?s +?u?d?l?l?u?s?l?d +?u?d?l?l?u?s?l?l +?u?d?l?l?u?s?l?u +?u?d?l?l?u?s?l?s +?u?d?l?l?u?s?u?d +?u?d?l?l?u?s?u?l +?u?d?l?l?u?s?u?u +?u?d?l?l?u?s?u?s +?u?d?l?l?u?s?s?d +?u?d?l?l?u?s?s?l +?u?d?l?l?u?s?s?u +?u?d?l?l?u?s?s?s +?u?d?l?l?s?d?d?d +?u?d?l?l?s?d?d?l +?u?d?l?l?s?d?d?u +?u?d?l?l?s?d?d?s +?u?d?l?l?s?d?l?d +?u?d?l?l?s?d?l?l +?u?d?l?l?s?d?l?u +?u?d?l?l?s?d?l?s +?u?d?l?l?s?d?u?d +?u?d?l?l?s?d?u?l +?u?d?l?l?s?d?u?u +?u?d?l?l?s?d?u?s +?u?d?l?l?s?d?s?d +?u?d?l?l?s?d?s?l +?u?d?l?l?s?d?s?u +?u?d?l?l?s?d?s?s +?u?d?l?l?s?l?d?d +?u?d?l?l?s?l?d?l +?u?d?l?l?s?l?d?u +?u?d?l?l?s?l?d?s +?u?d?l?l?s?l?l?d +?u?d?l?l?s?l?l?l +?u?d?l?l?s?l?l?u +?u?d?l?l?s?l?l?s +?u?d?l?l?s?l?u?d +?u?d?l?l?s?l?u?l +?u?d?l?l?s?l?u?u +?u?d?l?l?s?l?u?s +?u?d?l?l?s?l?s?d +?u?d?l?l?s?l?s?l +?u?d?l?l?s?l?s?u +?u?d?l?l?s?l?s?s +?u?d?l?l?s?u?d?d +?u?d?l?l?s?u?d?l +?u?d?l?l?s?u?d?u +?u?d?l?l?s?u?d?s +?u?d?l?l?s?u?l?d +?u?d?l?l?s?u?l?l +?u?d?l?l?s?u?l?u +?u?d?l?l?s?u?l?s +?u?d?l?l?s?u?u?d +?u?d?l?l?s?u?u?l +?u?d?l?l?s?u?u?u +?u?d?l?l?s?u?u?s +?u?d?l?l?s?u?s?d +?u?d?l?l?s?u?s?l +?u?d?l?l?s?u?s?u +?u?d?l?l?s?u?s?s +?u?d?l?l?s?s?d?d +?u?d?l?l?s?s?d?l +?u?d?l?l?s?s?d?u +?u?d?l?l?s?s?d?s +?u?d?l?l?s?s?l?d +?u?d?l?l?s?s?l?l +?u?d?l?l?s?s?l?u +?u?d?l?l?s?s?l?s +?u?d?l?l?s?s?u?d +?u?d?l?l?s?s?u?l +?u?d?l?l?s?s?u?u +?u?d?l?l?s?s?u?s +?u?d?l?l?s?s?s?d +?u?d?l?l?s?s?s?l +?u?d?l?l?s?s?s?u +?u?d?l?l?s?s?s?s +?u?d?l?u?d?d?d?s +?u?d?l?u?d?d?l?s +?u?d?l?u?d?d?u?s +?u?d?l?u?d?d?s?d +?u?d?l?u?d?d?s?l +?u?d?l?u?d?d?s?u +?u?d?l?u?d?d?s?s +?u?d?l?u?d?l?d?s +?u?d?l?u?d?l?l?s +?u?d?l?u?d?l?u?s +?u?d?l?u?d?l?s?d +?u?d?l?u?d?l?s?l +?u?d?l?u?d?l?s?u +?u?d?l?u?d?l?s?s +?u?d?l?u?d?u?d?s +?u?d?l?u?d?u?l?s +?u?d?l?u?d?u?u?s +?u?d?l?u?d?u?s?d +?u?d?l?u?d?u?s?l +?u?d?l?u?d?u?s?u +?u?d?l?u?d?u?s?s +?u?d?l?u?d?s?d?d +?u?d?l?u?d?s?d?l +?u?d?l?u?d?s?d?u +?u?d?l?u?d?s?d?s +?u?d?l?u?d?s?l?d +?u?d?l?u?d?s?l?l +?u?d?l?u?d?s?l?u +?u?d?l?u?d?s?l?s +?u?d?l?u?d?s?u?d +?u?d?l?u?d?s?u?l +?u?d?l?u?d?s?u?u +?u?d?l?u?d?s?u?s +?u?d?l?u?d?s?s?d +?u?d?l?u?d?s?s?l +?u?d?l?u?d?s?s?u +?u?d?l?u?d?s?s?s +?u?d?l?u?l?d?d?s +?u?d?l?u?l?d?l?s +?u?d?l?u?l?d?u?s +?u?d?l?u?l?d?s?d +?u?d?l?u?l?d?s?l +?u?d?l?u?l?d?s?u +?u?d?l?u?l?d?s?s +?u?d?l?u?l?l?d?s +?u?d?l?u?l?l?l?s +?u?d?l?u?l?l?u?s +?u?d?l?u?l?l?s?d +?u?d?l?u?l?l?s?l +?u?d?l?u?l?l?s?u +?u?d?l?u?l?l?s?s +?u?d?l?u?l?u?d?s +?u?d?l?u?l?u?l?s +?u?d?l?u?l?u?u?s +?u?d?l?u?l?u?s?d +?u?d?l?u?l?u?s?l +?u?d?l?u?l?u?s?u +?u?d?l?u?l?u?s?s +?u?d?l?u?l?s?d?d +?u?d?l?u?l?s?d?l +?u?d?l?u?l?s?d?u +?u?d?l?u?l?s?d?s +?u?d?l?u?l?s?l?d +?u?d?l?u?l?s?l?l +?u?d?l?u?l?s?l?u +?u?d?l?u?l?s?l?s +?u?d?l?u?l?s?u?d +?u?d?l?u?l?s?u?l +?u?d?l?u?l?s?u?u +?u?d?l?u?l?s?u?s +?u?d?l?u?l?s?s?d +?u?d?l?u?l?s?s?l +?u?d?l?u?l?s?s?u +?u?d?l?u?l?s?s?s +?u?d?l?u?u?d?d?s +?u?d?l?u?u?d?l?s +?u?d?l?u?u?d?u?s +?u?d?l?u?u?d?s?d +?u?d?l?u?u?d?s?l +?u?d?l?u?u?d?s?u +?u?d?l?u?u?d?s?s +?u?d?l?u?u?l?d?s +?u?d?l?u?u?l?l?s +?u?d?l?u?u?l?u?s +?u?d?l?u?u?l?s?d +?u?d?l?u?u?l?s?l +?u?d?l?u?u?l?s?u +?u?d?l?u?u?l?s?s +?u?d?l?u?u?u?d?s +?u?d?l?u?u?u?l?s +?u?d?l?u?u?u?u?s +?u?d?l?u?u?u?s?d +?u?d?l?u?u?u?s?l +?u?d?l?u?u?u?s?u +?u?d?l?u?u?u?s?s +?u?d?l?u?u?s?d?d +?u?d?l?u?u?s?d?l +?u?d?l?u?u?s?d?u +?u?d?l?u?u?s?d?s +?u?d?l?u?u?s?l?d +?u?d?l?u?u?s?l?l +?u?d?l?u?u?s?l?u +?u?d?l?u?u?s?l?s +?u?d?l?u?u?s?u?d +?u?d?l?u?u?s?u?l +?u?d?l?u?u?s?u?u +?u?d?l?u?u?s?u?s +?u?d?l?u?u?s?s?d +?u?d?l?u?u?s?s?l +?u?d?l?u?u?s?s?u +?u?d?l?u?u?s?s?s +?u?d?l?u?s?d?d?d +?u?d?l?u?s?d?d?l +?u?d?l?u?s?d?d?u +?u?d?l?u?s?d?d?s +?u?d?l?u?s?d?l?d +?u?d?l?u?s?d?l?l +?u?d?l?u?s?d?l?u +?u?d?l?u?s?d?l?s +?u?d?l?u?s?d?u?d +?u?d?l?u?s?d?u?l +?u?d?l?u?s?d?u?u +?u?d?l?u?s?d?u?s +?u?d?l?u?s?d?s?d +?u?d?l?u?s?d?s?l +?u?d?l?u?s?d?s?u +?u?d?l?u?s?d?s?s +?u?d?l?u?s?l?d?d +?u?d?l?u?s?l?d?l +?u?d?l?u?s?l?d?u +?u?d?l?u?s?l?d?s +?u?d?l?u?s?l?l?d +?u?d?l?u?s?l?l?l +?u?d?l?u?s?l?l?u +?u?d?l?u?s?l?l?s +?u?d?l?u?s?l?u?d +?u?d?l?u?s?l?u?l +?u?d?l?u?s?l?u?u +?u?d?l?u?s?l?u?s +?u?d?l?u?s?l?s?d +?u?d?l?u?s?l?s?l +?u?d?l?u?s?l?s?u +?u?d?l?u?s?l?s?s +?u?d?l?u?s?u?d?d +?u?d?l?u?s?u?d?l +?u?d?l?u?s?u?d?u +?u?d?l?u?s?u?d?s +?u?d?l?u?s?u?l?d +?u?d?l?u?s?u?l?l +?u?d?l?u?s?u?l?u +?u?d?l?u?s?u?l?s +?u?d?l?u?s?u?u?d +?u?d?l?u?s?u?u?l +?u?d?l?u?s?u?u?u +?u?d?l?u?s?u?u?s +?u?d?l?u?s?u?s?d +?u?d?l?u?s?u?s?l +?u?d?l?u?s?u?s?u +?u?d?l?u?s?u?s?s +?u?d?l?u?s?s?d?d +?u?d?l?u?s?s?d?l +?u?d?l?u?s?s?d?u +?u?d?l?u?s?s?d?s +?u?d?l?u?s?s?l?d +?u?d?l?u?s?s?l?l +?u?d?l?u?s?s?l?u +?u?d?l?u?s?s?l?s +?u?d?l?u?s?s?u?d +?u?d?l?u?s?s?u?l +?u?d?l?u?s?s?u?u +?u?d?l?u?s?s?u?s +?u?d?l?u?s?s?s?d +?u?d?l?u?s?s?s?l +?u?d?l?u?s?s?s?u +?u?d?l?u?s?s?s?s +?u?d?l?s?d?d?d?d +?u?d?l?s?d?d?d?l +?u?d?l?s?d?d?d?u +?u?d?l?s?d?d?d?s +?u?d?l?s?d?d?l?d +?u?d?l?s?d?d?l?l +?u?d?l?s?d?d?l?u +?u?d?l?s?d?d?l?s +?u?d?l?s?d?d?u?d +?u?d?l?s?d?d?u?l +?u?d?l?s?d?d?u?u +?u?d?l?s?d?d?u?s +?u?d?l?s?d?d?s?d +?u?d?l?s?d?d?s?l +?u?d?l?s?d?d?s?u +?u?d?l?s?d?d?s?s +?u?d?l?s?d?l?d?d +?u?d?l?s?d?l?d?l +?u?d?l?s?d?l?d?u +?u?d?l?s?d?l?d?s +?u?d?l?s?d?l?l?d +?u?d?l?s?d?l?l?l +?u?d?l?s?d?l?l?u +?u?d?l?s?d?l?l?s +?u?d?l?s?d?l?u?d +?u?d?l?s?d?l?u?l +?u?d?l?s?d?l?u?u +?u?d?l?s?d?l?u?s +?u?d?l?s?d?l?s?d +?u?d?l?s?d?l?s?l +?u?d?l?s?d?l?s?u +?u?d?l?s?d?l?s?s +?u?d?l?s?d?u?d?d +?u?d?l?s?d?u?d?l +?u?d?l?s?d?u?d?u +?u?d?l?s?d?u?d?s +?u?d?l?s?d?u?l?d +?u?d?l?s?d?u?l?l +?u?d?l?s?d?u?l?u +?u?d?l?s?d?u?l?s +?u?d?l?s?d?u?u?d +?u?d?l?s?d?u?u?l +?u?d?l?s?d?u?u?u +?u?d?l?s?d?u?u?s +?u?d?l?s?d?u?s?d +?u?d?l?s?d?u?s?l +?u?d?l?s?d?u?s?u +?u?d?l?s?d?u?s?s +?u?d?l?s?d?s?d?d +?u?d?l?s?d?s?d?l +?u?d?l?s?d?s?d?u +?u?d?l?s?d?s?d?s +?u?d?l?s?d?s?l?d +?u?d?l?s?d?s?l?l +?u?d?l?s?d?s?l?u +?u?d?l?s?d?s?l?s +?u?d?l?s?d?s?u?d +?u?d?l?s?d?s?u?l +?u?d?l?s?d?s?u?u +?u?d?l?s?d?s?u?s +?u?d?l?s?d?s?s?d +?u?d?l?s?d?s?s?l +?u?d?l?s?d?s?s?u +?u?d?l?s?d?s?s?s +?u?d?l?s?l?d?d?d +?u?d?l?s?l?d?d?l +?u?d?l?s?l?d?d?u +?u?d?l?s?l?d?d?s +?u?d?l?s?l?d?l?d +?u?d?l?s?l?d?l?l +?u?d?l?s?l?d?l?u +?u?d?l?s?l?d?l?s +?u?d?l?s?l?d?u?d +?u?d?l?s?l?d?u?l +?u?d?l?s?l?d?u?u +?u?d?l?s?l?d?u?s +?u?d?l?s?l?d?s?d +?u?d?l?s?l?d?s?l +?u?d?l?s?l?d?s?u +?u?d?l?s?l?d?s?s +?u?d?l?s?l?l?d?d +?u?d?l?s?l?l?d?l +?u?d?l?s?l?l?d?u +?u?d?l?s?l?l?d?s +?u?d?l?s?l?l?l?d +?u?d?l?s?l?l?l?l +?u?d?l?s?l?l?l?u +?u?d?l?s?l?l?l?s +?u?d?l?s?l?l?u?d +?u?d?l?s?l?l?u?l +?u?d?l?s?l?l?u?u +?u?d?l?s?l?l?u?s +?u?d?l?s?l?l?s?d +?u?d?l?s?l?l?s?l +?u?d?l?s?l?l?s?u +?u?d?l?s?l?l?s?s +?u?d?l?s?l?u?d?d +?u?d?l?s?l?u?d?l +?u?d?l?s?l?u?d?u +?u?d?l?s?l?u?d?s +?u?d?l?s?l?u?l?d +?u?d?l?s?l?u?l?l +?u?d?l?s?l?u?l?u +?u?d?l?s?l?u?l?s +?u?d?l?s?l?u?u?d +?u?d?l?s?l?u?u?l +?u?d?l?s?l?u?u?u +?u?d?l?s?l?u?u?s +?u?d?l?s?l?u?s?d +?u?d?l?s?l?u?s?l +?u?d?l?s?l?u?s?u +?u?d?l?s?l?u?s?s +?u?d?l?s?l?s?d?d +?u?d?l?s?l?s?d?l +?u?d?l?s?l?s?d?u +?u?d?l?s?l?s?d?s +?u?d?l?s?l?s?l?d +?u?d?l?s?l?s?l?l +?u?d?l?s?l?s?l?u +?u?d?l?s?l?s?l?s +?u?d?l?s?l?s?u?d +?u?d?l?s?l?s?u?l +?u?d?l?s?l?s?u?u +?u?d?l?s?l?s?u?s +?u?d?l?s?l?s?s?d +?u?d?l?s?l?s?s?l +?u?d?l?s?l?s?s?u +?u?d?l?s?l?s?s?s +?u?d?l?s?u?d?d?d +?u?d?l?s?u?d?d?l +?u?d?l?s?u?d?d?u +?u?d?l?s?u?d?d?s +?u?d?l?s?u?d?l?d +?u?d?l?s?u?d?l?l +?u?d?l?s?u?d?l?u +?u?d?l?s?u?d?l?s +?u?d?l?s?u?d?u?d +?u?d?l?s?u?d?u?l +?u?d?l?s?u?d?u?u +?u?d?l?s?u?d?u?s +?u?d?l?s?u?d?s?d +?u?d?l?s?u?d?s?l +?u?d?l?s?u?d?s?u +?u?d?l?s?u?d?s?s +?u?d?l?s?u?l?d?d +?u?d?l?s?u?l?d?l +?u?d?l?s?u?l?d?u +?u?d?l?s?u?l?d?s +?u?d?l?s?u?l?l?d +?u?d?l?s?u?l?l?l +?u?d?l?s?u?l?l?u +?u?d?l?s?u?l?l?s +?u?d?l?s?u?l?u?d +?u?d?l?s?u?l?u?l +?u?d?l?s?u?l?u?u +?u?d?l?s?u?l?u?s +?u?d?l?s?u?l?s?d +?u?d?l?s?u?l?s?l +?u?d?l?s?u?l?s?u +?u?d?l?s?u?l?s?s +?u?d?l?s?u?u?d?d +?u?d?l?s?u?u?d?l +?u?d?l?s?u?u?d?u +?u?d?l?s?u?u?d?s +?u?d?l?s?u?u?l?d +?u?d?l?s?u?u?l?l +?u?d?l?s?u?u?l?u +?u?d?l?s?u?u?l?s +?u?d?l?s?u?u?u?d +?u?d?l?s?u?u?u?l +?u?d?l?s?u?u?u?u +?u?d?l?s?u?u?u?s +?u?d?l?s?u?u?s?d +?u?d?l?s?u?u?s?l +?u?d?l?s?u?u?s?u +?u?d?l?s?u?u?s?s +?u?d?l?s?u?s?d?d +?u?d?l?s?u?s?d?l +?u?d?l?s?u?s?d?u +?u?d?l?s?u?s?d?s +?u?d?l?s?u?s?l?d +?u?d?l?s?u?s?l?l +?u?d?l?s?u?s?l?u +?u?d?l?s?u?s?l?s +?u?d?l?s?u?s?u?d +?u?d?l?s?u?s?u?l +?u?d?l?s?u?s?u?u +?u?d?l?s?u?s?u?s +?u?d?l?s?u?s?s?d +?u?d?l?s?u?s?s?l +?u?d?l?s?u?s?s?u +?u?d?l?s?u?s?s?s +?u?d?l?s?s?d?d?d +?u?d?l?s?s?d?d?l +?u?d?l?s?s?d?d?u +?u?d?l?s?s?d?d?s +?u?d?l?s?s?d?l?d +?u?d?l?s?s?d?l?l +?u?d?l?s?s?d?l?u +?u?d?l?s?s?d?l?s +?u?d?l?s?s?d?u?d +?u?d?l?s?s?d?u?l +?u?d?l?s?s?d?u?u +?u?d?l?s?s?d?u?s +?u?d?l?s?s?d?s?d +?u?d?l?s?s?d?s?l +?u?d?l?s?s?d?s?u +?u?d?l?s?s?d?s?s +?u?d?l?s?s?l?d?d +?u?d?l?s?s?l?d?l +?u?d?l?s?s?l?d?u +?u?d?l?s?s?l?d?s +?u?d?l?s?s?l?l?d +?u?d?l?s?s?l?l?l +?u?d?l?s?s?l?l?u +?u?d?l?s?s?l?l?s +?u?d?l?s?s?l?u?d +?u?d?l?s?s?l?u?l +?u?d?l?s?s?l?u?u +?u?d?l?s?s?l?u?s +?u?d?l?s?s?l?s?d +?u?d?l?s?s?l?s?l +?u?d?l?s?s?l?s?u +?u?d?l?s?s?l?s?s +?u?d?l?s?s?u?d?d +?u?d?l?s?s?u?d?l +?u?d?l?s?s?u?d?u +?u?d?l?s?s?u?d?s +?u?d?l?s?s?u?l?d +?u?d?l?s?s?u?l?l +?u?d?l?s?s?u?l?u +?u?d?l?s?s?u?l?s +?u?d?l?s?s?u?u?d +?u?d?l?s?s?u?u?l +?u?d?l?s?s?u?u?u +?u?d?l?s?s?u?u?s +?u?d?l?s?s?u?s?d +?u?d?l?s?s?u?s?l +?u?d?l?s?s?u?s?u +?u?d?l?s?s?u?s?s +?u?d?l?s?s?s?d?d +?u?d?l?s?s?s?d?l +?u?d?l?s?s?s?d?u +?u?d?l?s?s?s?d?s +?u?d?l?s?s?s?l?d +?u?d?l?s?s?s?l?l +?u?d?l?s?s?s?l?u +?u?d?l?s?s?s?l?s +?u?d?l?s?s?s?u?d +?u?d?l?s?s?s?u?l +?u?d?l?s?s?s?u?u +?u?d?l?s?s?s?u?s +?u?d?l?s?s?s?s?d +?u?d?l?s?s?s?s?l +?u?d?l?s?s?s?s?u +?u?d?l?s?s?s?s?s +?u?d?u?d?d?d?l?s +?u?d?u?d?d?d?s?l +?u?d?u?d?d?l?d?s +?u?d?u?d?d?l?l?s +?u?d?u?d?d?l?u?s +?u?d?u?d?d?l?s?d +?u?d?u?d?d?l?s?l +?u?d?u?d?d?l?s?u +?u?d?u?d?d?l?s?s +?u?d?u?d?d?u?l?s +?u?d?u?d?d?u?s?l +?u?d?u?d?d?s?d?l +?u?d?u?d?d?s?l?d +?u?d?u?d?d?s?l?l +?u?d?u?d?d?s?l?u +?u?d?u?d?d?s?l?s +?u?d?u?d?d?s?u?l +?u?d?u?d?d?s?s?l +?u?d?u?d?l?d?d?s +?u?d?u?d?l?d?l?s +?u?d?u?d?l?d?u?s +?u?d?u?d?l?d?s?d +?u?d?u?d?l?d?s?l +?u?d?u?d?l?d?s?u +?u?d?u?d?l?d?s?s +?u?d?u?d?l?l?d?s +?u?d?u?d?l?l?l?s +?u?d?u?d?l?l?u?s +?u?d?u?d?l?l?s?d +?u?d?u?d?l?l?s?l +?u?d?u?d?l?l?s?u +?u?d?u?d?l?l?s?s +?u?d?u?d?l?u?d?s +?u?d?u?d?l?u?l?s +?u?d?u?d?l?u?u?s +?u?d?u?d?l?u?s?d +?u?d?u?d?l?u?s?l +?u?d?u?d?l?u?s?u +?u?d?u?d?l?u?s?s +?u?d?u?d?l?s?d?d +?u?d?u?d?l?s?d?l +?u?d?u?d?l?s?d?u +?u?d?u?d?l?s?d?s +?u?d?u?d?l?s?l?d +?u?d?u?d?l?s?l?l +?u?d?u?d?l?s?l?u +?u?d?u?d?l?s?l?s +?u?d?u?d?l?s?u?d +?u?d?u?d?l?s?u?l +?u?d?u?d?l?s?u?u +?u?d?u?d?l?s?u?s +?u?d?u?d?l?s?s?d +?u?d?u?d?l?s?s?l +?u?d?u?d?l?s?s?u +?u?d?u?d?l?s?s?s +?u?d?u?d?u?d?l?s +?u?d?u?d?u?d?s?l +?u?d?u?d?u?l?d?s +?u?d?u?d?u?l?l?s +?u?d?u?d?u?l?u?s +?u?d?u?d?u?l?s?d +?u?d?u?d?u?l?s?l +?u?d?u?d?u?l?s?u +?u?d?u?d?u?l?s?s +?u?d?u?d?u?u?l?s +?u?d?u?d?u?u?s?l +?u?d?u?d?u?s?d?l +?u?d?u?d?u?s?l?d +?u?d?u?d?u?s?l?l +?u?d?u?d?u?s?l?u +?u?d?u?d?u?s?l?s +?u?d?u?d?u?s?u?l +?u?d?u?d?u?s?s?l +?u?d?u?d?s?d?d?l +?u?d?u?d?s?d?l?d +?u?d?u?d?s?d?l?l +?u?d?u?d?s?d?l?u +?u?d?u?d?s?d?l?s +?u?d?u?d?s?d?u?l +?u?d?u?d?s?d?s?l +?u?d?u?d?s?l?d?d +?u?d?u?d?s?l?d?l +?u?d?u?d?s?l?d?u +?u?d?u?d?s?l?d?s +?u?d?u?d?s?l?l?d +?u?d?u?d?s?l?l?l +?u?d?u?d?s?l?l?u +?u?d?u?d?s?l?l?s +?u?d?u?d?s?l?u?d +?u?d?u?d?s?l?u?l +?u?d?u?d?s?l?u?u +?u?d?u?d?s?l?u?s +?u?d?u?d?s?l?s?d +?u?d?u?d?s?l?s?l +?u?d?u?d?s?l?s?u +?u?d?u?d?s?l?s?s +?u?d?u?d?s?u?d?l +?u?d?u?d?s?u?l?d +?u?d?u?d?s?u?l?l +?u?d?u?d?s?u?l?u +?u?d?u?d?s?u?l?s +?u?d?u?d?s?u?u?l +?u?d?u?d?s?u?s?l +?u?d?u?d?s?s?d?l +?u?d?u?d?s?s?l?d +?u?d?u?d?s?s?l?l +?u?d?u?d?s?s?l?u +?u?d?u?d?s?s?l?s +?u?d?u?d?s?s?u?l +?u?d?u?d?s?s?s?l +?u?d?u?l?d?d?d?s +?u?d?u?l?d?d?l?s +?u?d?u?l?d?d?u?s +?u?d?u?l?d?d?s?d +?u?d?u?l?d?d?s?l +?u?d?u?l?d?d?s?u +?u?d?u?l?d?d?s?s +?u?d?u?l?d?l?d?s +?u?d?u?l?d?l?l?s +?u?d?u?l?d?l?u?s +?u?d?u?l?d?l?s?d +?u?d?u?l?d?l?s?l +?u?d?u?l?d?l?s?u +?u?d?u?l?d?l?s?s +?u?d?u?l?d?u?d?s +?u?d?u?l?d?u?l?s +?u?d?u?l?d?u?u?s +?u?d?u?l?d?u?s?d +?u?d?u?l?d?u?s?l +?u?d?u?l?d?u?s?u +?u?d?u?l?d?u?s?s +?u?d?u?l?d?s?d?d +?u?d?u?l?d?s?d?l +?u?d?u?l?d?s?d?u +?u?d?u?l?d?s?d?s +?u?d?u?l?d?s?l?d +?u?d?u?l?d?s?l?l +?u?d?u?l?d?s?l?u +?u?d?u?l?d?s?l?s +?u?d?u?l?d?s?u?d +?u?d?u?l?d?s?u?l +?u?d?u?l?d?s?u?u +?u?d?u?l?d?s?u?s +?u?d?u?l?d?s?s?d +?u?d?u?l?d?s?s?l +?u?d?u?l?d?s?s?u +?u?d?u?l?d?s?s?s +?u?d?u?l?l?d?d?s +?u?d?u?l?l?d?l?s +?u?d?u?l?l?d?u?s +?u?d?u?l?l?d?s?d +?u?d?u?l?l?d?s?l +?u?d?u?l?l?d?s?u +?u?d?u?l?l?d?s?s +?u?d?u?l?l?l?d?s +?u?d?u?l?l?l?l?s +?u?d?u?l?l?l?u?s +?u?d?u?l?l?l?s?d +?u?d?u?l?l?l?s?l +?u?d?u?l?l?l?s?u +?u?d?u?l?l?l?s?s +?u?d?u?l?l?u?d?s +?u?d?u?l?l?u?l?s +?u?d?u?l?l?u?u?s +?u?d?u?l?l?u?s?d +?u?d?u?l?l?u?s?l +?u?d?u?l?l?u?s?u +?u?d?u?l?l?u?s?s +?u?d?u?l?l?s?d?d +?u?d?u?l?l?s?d?l +?u?d?u?l?l?s?d?u +?u?d?u?l?l?s?d?s +?u?d?u?l?l?s?l?d +?u?d?u?l?l?s?l?l +?u?d?u?l?l?s?l?u +?u?d?u?l?l?s?l?s +?u?d?u?l?l?s?u?d +?u?d?u?l?l?s?u?l +?u?d?u?l?l?s?u?u +?u?d?u?l?l?s?u?s +?u?d?u?l?l?s?s?d +?u?d?u?l?l?s?s?l +?u?d?u?l?l?s?s?u +?u?d?u?l?l?s?s?s +?u?d?u?l?u?d?d?s +?u?d?u?l?u?d?l?s +?u?d?u?l?u?d?u?s +?u?d?u?l?u?d?s?d +?u?d?u?l?u?d?s?l +?u?d?u?l?u?d?s?u +?u?d?u?l?u?d?s?s +?u?d?u?l?u?l?d?s +?u?d?u?l?u?l?l?s +?u?d?u?l?u?l?u?s +?u?d?u?l?u?l?s?d +?u?d?u?l?u?l?s?l +?u?d?u?l?u?l?s?u +?u?d?u?l?u?l?s?s +?u?d?u?l?u?u?d?s +?u?d?u?l?u?u?l?s +?u?d?u?l?u?u?u?s +?u?d?u?l?u?u?s?d +?u?d?u?l?u?u?s?l +?u?d?u?l?u?u?s?u +?u?d?u?l?u?u?s?s +?u?d?u?l?u?s?d?d +?u?d?u?l?u?s?d?l +?u?d?u?l?u?s?d?u +?u?d?u?l?u?s?d?s +?u?d?u?l?u?s?l?d +?u?d?u?l?u?s?l?l +?u?d?u?l?u?s?l?u +?u?d?u?l?u?s?l?s +?u?d?u?l?u?s?u?d +?u?d?u?l?u?s?u?l +?u?d?u?l?u?s?u?u +?u?d?u?l?u?s?u?s +?u?d?u?l?u?s?s?d +?u?d?u?l?u?s?s?l +?u?d?u?l?u?s?s?u +?u?d?u?l?u?s?s?s +?u?d?u?l?s?d?d?d +?u?d?u?l?s?d?d?l +?u?d?u?l?s?d?d?u +?u?d?u?l?s?d?d?s +?u?d?u?l?s?d?l?d +?u?d?u?l?s?d?l?l +?u?d?u?l?s?d?l?u +?u?d?u?l?s?d?l?s +?u?d?u?l?s?d?u?d +?u?d?u?l?s?d?u?l +?u?d?u?l?s?d?u?u +?u?d?u?l?s?d?u?s +?u?d?u?l?s?d?s?d +?u?d?u?l?s?d?s?l +?u?d?u?l?s?d?s?u +?u?d?u?l?s?d?s?s +?u?d?u?l?s?l?d?d +?u?d?u?l?s?l?d?l +?u?d?u?l?s?l?d?u +?u?d?u?l?s?l?d?s +?u?d?u?l?s?l?l?d +?u?d?u?l?s?l?l?l +?u?d?u?l?s?l?l?u +?u?d?u?l?s?l?l?s +?u?d?u?l?s?l?u?d +?u?d?u?l?s?l?u?l +?u?d?u?l?s?l?u?u +?u?d?u?l?s?l?u?s +?u?d?u?l?s?l?s?d +?u?d?u?l?s?l?s?l +?u?d?u?l?s?l?s?u +?u?d?u?l?s?l?s?s +?u?d?u?l?s?u?d?d +?u?d?u?l?s?u?d?l +?u?d?u?l?s?u?d?u +?u?d?u?l?s?u?d?s +?u?d?u?l?s?u?l?d +?u?d?u?l?s?u?l?l +?u?d?u?l?s?u?l?u +?u?d?u?l?s?u?l?s +?u?d?u?l?s?u?u?d +?u?d?u?l?s?u?u?l +?u?d?u?l?s?u?u?u +?u?d?u?l?s?u?u?s +?u?d?u?l?s?u?s?d +?u?d?u?l?s?u?s?l +?u?d?u?l?s?u?s?u +?u?d?u?l?s?u?s?s +?u?d?u?l?s?s?d?d +?u?d?u?l?s?s?d?l +?u?d?u?l?s?s?d?u +?u?d?u?l?s?s?d?s +?u?d?u?l?s?s?l?d +?u?d?u?l?s?s?l?l +?u?d?u?l?s?s?l?u +?u?d?u?l?s?s?l?s +?u?d?u?l?s?s?u?d +?u?d?u?l?s?s?u?l +?u?d?u?l?s?s?u?u +?u?d?u?l?s?s?u?s +?u?d?u?l?s?s?s?d +?u?d?u?l?s?s?s?l +?u?d?u?l?s?s?s?u +?u?d?u?l?s?s?s?s +?u?d?u?u?d?d?l?s +?u?d?u?u?d?d?s?l +?u?d?u?u?d?l?d?s +?u?d?u?u?d?l?l?s +?u?d?u?u?d?l?u?s +?u?d?u?u?d?l?s?d +?u?d?u?u?d?l?s?l +?u?d?u?u?d?l?s?u +?u?d?u?u?d?l?s?s +?u?d?u?u?d?u?l?s +?u?d?u?u?d?u?s?l +?u?d?u?u?d?s?d?l +?u?d?u?u?d?s?l?d +?u?d?u?u?d?s?l?l +?u?d?u?u?d?s?l?u +?u?d?u?u?d?s?l?s +?u?d?u?u?d?s?u?l +?u?d?u?u?d?s?s?l +?u?d?u?u?l?d?d?s +?u?d?u?u?l?d?l?s +?u?d?u?u?l?d?u?s +?u?d?u?u?l?d?s?d +?u?d?u?u?l?d?s?l +?u?d?u?u?l?d?s?u +?u?d?u?u?l?d?s?s +?u?d?u?u?l?l?d?s +?u?d?u?u?l?l?l?s +?u?d?u?u?l?l?u?s +?u?d?u?u?l?l?s?d +?u?d?u?u?l?l?s?l +?u?d?u?u?l?l?s?u +?u?d?u?u?l?l?s?s +?u?d?u?u?l?u?d?s +?u?d?u?u?l?u?l?s +?u?d?u?u?l?u?u?s +?u?d?u?u?l?u?s?d +?u?d?u?u?l?u?s?l +?u?d?u?u?l?u?s?u +?u?d?u?u?l?u?s?s +?u?d?u?u?l?s?d?d +?u?d?u?u?l?s?d?l +?u?d?u?u?l?s?d?u +?u?d?u?u?l?s?d?s +?u?d?u?u?l?s?l?d +?u?d?u?u?l?s?l?l +?u?d?u?u?l?s?l?u +?u?d?u?u?l?s?l?s +?u?d?u?u?l?s?u?d +?u?d?u?u?l?s?u?l +?u?d?u?u?l?s?u?u +?u?d?u?u?l?s?u?s +?u?d?u?u?l?s?s?d +?u?d?u?u?l?s?s?l +?u?d?u?u?l?s?s?u +?u?d?u?u?l?s?s?s +?u?d?u?u?u?d?l?s +?u?d?u?u?u?d?s?l +?u?d?u?u?u?l?d?s +?u?d?u?u?u?l?l?s +?u?d?u?u?u?l?u?s +?u?d?u?u?u?l?s?d +?u?d?u?u?u?l?s?l +?u?d?u?u?u?l?s?u +?u?d?u?u?u?l?s?s +?u?d?u?u?u?u?l?s +?u?d?u?u?u?u?s?l +?u?d?u?u?u?s?d?l +?u?d?u?u?u?s?l?d +?u?d?u?u?u?s?l?l +?u?d?u?u?u?s?l?u +?u?d?u?u?u?s?l?s +?u?d?u?u?u?s?u?l +?u?d?u?u?u?s?s?l +?u?d?u?u?s?d?d?l +?u?d?u?u?s?d?l?d +?u?d?u?u?s?d?l?l +?u?d?u?u?s?d?l?u +?u?d?u?u?s?d?l?s +?u?d?u?u?s?d?u?l +?u?d?u?u?s?d?s?l +?u?d?u?u?s?l?d?d +?u?d?u?u?s?l?d?l +?u?d?u?u?s?l?d?u +?u?d?u?u?s?l?d?s +?u?d?u?u?s?l?l?d +?u?d?u?u?s?l?l?l +?u?d?u?u?s?l?l?u +?u?d?u?u?s?l?l?s +?u?d?u?u?s?l?u?d +?u?d?u?u?s?l?u?l +?u?d?u?u?s?l?u?u +?u?d?u?u?s?l?u?s +?u?d?u?u?s?l?s?d +?u?d?u?u?s?l?s?l +?u?d?u?u?s?l?s?u +?u?d?u?u?s?l?s?s +?u?d?u?u?s?u?d?l +?u?d?u?u?s?u?l?d +?u?d?u?u?s?u?l?l +?u?d?u?u?s?u?l?u +?u?d?u?u?s?u?l?s +?u?d?u?u?s?u?u?l +?u?d?u?u?s?u?s?l +?u?d?u?u?s?s?d?l +?u?d?u?u?s?s?l?d +?u?d?u?u?s?s?l?l +?u?d?u?u?s?s?l?u +?u?d?u?u?s?s?l?s +?u?d?u?u?s?s?u?l +?u?d?u?u?s?s?s?l +?u?d?u?s?d?d?d?l +?u?d?u?s?d?d?l?d +?u?d?u?s?d?d?l?l +?u?d?u?s?d?d?l?u +?u?d?u?s?d?d?l?s +?u?d?u?s?d?d?u?l +?u?d?u?s?d?d?s?l +?u?d?u?s?d?l?d?d +?u?d?u?s?d?l?d?l +?u?d?u?s?d?l?d?u +?u?d?u?s?d?l?d?s +?u?d?u?s?d?l?l?d +?u?d?u?s?d?l?l?l +?u?d?u?s?d?l?l?u +?u?d?u?s?d?l?l?s +?u?d?u?s?d?l?u?d +?u?d?u?s?d?l?u?l +?u?d?u?s?d?l?u?u +?u?d?u?s?d?l?u?s +?u?d?u?s?d?l?s?d +?u?d?u?s?d?l?s?l +?u?d?u?s?d?l?s?u +?u?d?u?s?d?l?s?s +?u?d?u?s?d?u?d?l +?u?d?u?s?d?u?l?d +?u?d?u?s?d?u?l?l +?u?d?u?s?d?u?l?u +?u?d?u?s?d?u?l?s +?u?d?u?s?d?u?u?l +?u?d?u?s?d?u?s?l +?u?d?u?s?d?s?d?l +?u?d?u?s?d?s?l?d +?u?d?u?s?d?s?l?l +?u?d?u?s?d?s?l?u +?u?d?u?s?d?s?l?s +?u?d?u?s?d?s?u?l +?u?d?u?s?d?s?s?l +?u?d?u?s?l?d?d?d +?u?d?u?s?l?d?d?l +?u?d?u?s?l?d?d?u +?u?d?u?s?l?d?d?s +?u?d?u?s?l?d?l?d +?u?d?u?s?l?d?l?l +?u?d?u?s?l?d?l?u +?u?d?u?s?l?d?l?s +?u?d?u?s?l?d?u?d +?u?d?u?s?l?d?u?l +?u?d?u?s?l?d?u?u +?u?d?u?s?l?d?u?s +?u?d?u?s?l?d?s?d +?u?d?u?s?l?d?s?l +?u?d?u?s?l?d?s?u +?u?d?u?s?l?d?s?s +?u?d?u?s?l?l?d?d +?u?d?u?s?l?l?d?l +?u?d?u?s?l?l?d?u +?u?d?u?s?l?l?d?s +?u?d?u?s?l?l?l?d +?u?d?u?s?l?l?l?l +?u?d?u?s?l?l?l?u +?u?d?u?s?l?l?l?s +?u?d?u?s?l?l?u?d +?u?d?u?s?l?l?u?l +?u?d?u?s?l?l?u?u +?u?d?u?s?l?l?u?s +?u?d?u?s?l?l?s?d +?u?d?u?s?l?l?s?l +?u?d?u?s?l?l?s?u +?u?d?u?s?l?l?s?s +?u?d?u?s?l?u?d?d +?u?d?u?s?l?u?d?l +?u?d?u?s?l?u?d?u +?u?d?u?s?l?u?d?s +?u?d?u?s?l?u?l?d +?u?d?u?s?l?u?l?l +?u?d?u?s?l?u?l?u +?u?d?u?s?l?u?l?s +?u?d?u?s?l?u?u?d +?u?d?u?s?l?u?u?l +?u?d?u?s?l?u?u?u +?u?d?u?s?l?u?u?s +?u?d?u?s?l?u?s?d +?u?d?u?s?l?u?s?l +?u?d?u?s?l?u?s?u +?u?d?u?s?l?u?s?s +?u?d?u?s?l?s?d?d +?u?d?u?s?l?s?d?l +?u?d?u?s?l?s?d?u +?u?d?u?s?l?s?d?s +?u?d?u?s?l?s?l?d +?u?d?u?s?l?s?l?l +?u?d?u?s?l?s?l?u +?u?d?u?s?l?s?l?s +?u?d?u?s?l?s?u?d +?u?d?u?s?l?s?u?l +?u?d?u?s?l?s?u?u +?u?d?u?s?l?s?u?s +?u?d?u?s?l?s?s?d +?u?d?u?s?l?s?s?l +?u?d?u?s?l?s?s?u +?u?d?u?s?l?s?s?s +?u?d?u?s?u?d?d?l +?u?d?u?s?u?d?l?d +?u?d?u?s?u?d?l?l +?u?d?u?s?u?d?l?u +?u?d?u?s?u?d?l?s +?u?d?u?s?u?d?u?l +?u?d?u?s?u?d?s?l +?u?d?u?s?u?l?d?d +?u?d?u?s?u?l?d?l +?u?d?u?s?u?l?d?u +?u?d?u?s?u?l?d?s +?u?d?u?s?u?l?l?d +?u?d?u?s?u?l?l?l +?u?d?u?s?u?l?l?u +?u?d?u?s?u?l?l?s +?u?d?u?s?u?l?u?d +?u?d?u?s?u?l?u?l +?u?d?u?s?u?l?u?u +?u?d?u?s?u?l?u?s +?u?d?u?s?u?l?s?d +?u?d?u?s?u?l?s?l +?u?d?u?s?u?l?s?u +?u?d?u?s?u?l?s?s +?u?d?u?s?u?u?d?l +?u?d?u?s?u?u?l?d +?u?d?u?s?u?u?l?l +?u?d?u?s?u?u?l?u +?u?d?u?s?u?u?l?s +?u?d?u?s?u?u?u?l +?u?d?u?s?u?u?s?l +?u?d?u?s?u?s?d?l +?u?d?u?s?u?s?l?d +?u?d?u?s?u?s?l?l +?u?d?u?s?u?s?l?u +?u?d?u?s?u?s?l?s +?u?d?u?s?u?s?u?l +?u?d?u?s?u?s?s?l +?u?d?u?s?s?d?d?l +?u?d?u?s?s?d?l?d +?u?d?u?s?s?d?l?l +?u?d?u?s?s?d?l?u +?u?d?u?s?s?d?l?s +?u?d?u?s?s?d?u?l +?u?d?u?s?s?d?s?l +?u?d?u?s?s?l?d?d +?u?d?u?s?s?l?d?l +?u?d?u?s?s?l?d?u +?u?d?u?s?s?l?d?s +?u?d?u?s?s?l?l?d +?u?d?u?s?s?l?l?l +?u?d?u?s?s?l?l?u +?u?d?u?s?s?l?l?s +?u?d?u?s?s?l?u?d +?u?d?u?s?s?l?u?l +?u?d?u?s?s?l?u?u +?u?d?u?s?s?l?u?s +?u?d?u?s?s?l?s?d +?u?d?u?s?s?l?s?l +?u?d?u?s?s?l?s?u +?u?d?u?s?s?l?s?s +?u?d?u?s?s?u?d?l +?u?d?u?s?s?u?l?d +?u?d?u?s?s?u?l?l +?u?d?u?s?s?u?l?u +?u?d?u?s?s?u?l?s +?u?d?u?s?s?u?u?l +?u?d?u?s?s?u?s?l +?u?d?u?s?s?s?d?l +?u?d?u?s?s?s?l?d +?u?d?u?s?s?s?l?l +?u?d?u?s?s?s?l?u +?u?d?u?s?s?s?l?s +?u?d?u?s?s?s?u?l +?u?d?u?s?s?s?s?l +?u?d?s?d?d?d?d?l +?u?d?s?d?d?d?l?d +?u?d?s?d?d?d?l?l +?u?d?s?d?d?d?l?u +?u?d?s?d?d?d?l?s +?u?d?s?d?d?d?u?l +?u?d?s?d?d?d?s?l +?u?d?s?d?d?l?d?d +?u?d?s?d?d?l?d?l +?u?d?s?d?d?l?d?u +?u?d?s?d?d?l?d?s +?u?d?s?d?d?l?l?d +?u?d?s?d?d?l?l?l +?u?d?s?d?d?l?l?u +?u?d?s?d?d?l?l?s +?u?d?s?d?d?l?u?d +?u?d?s?d?d?l?u?l +?u?d?s?d?d?l?u?u +?u?d?s?d?d?l?u?s +?u?d?s?d?d?l?s?d +?u?d?s?d?d?l?s?l +?u?d?s?d?d?l?s?u +?u?d?s?d?d?l?s?s +?u?d?s?d?d?u?d?l +?u?d?s?d?d?u?l?d +?u?d?s?d?d?u?l?l +?u?d?s?d?d?u?l?u +?u?d?s?d?d?u?l?s +?u?d?s?d?d?u?u?l +?u?d?s?d?d?u?s?l +?u?d?s?d?d?s?d?l +?u?d?s?d?d?s?l?d +?u?d?s?d?d?s?l?l +?u?d?s?d?d?s?l?u +?u?d?s?d?d?s?l?s +?u?d?s?d?d?s?u?l +?u?d?s?d?d?s?s?l +?u?d?s?d?l?d?d?d +?u?d?s?d?l?d?d?l +?u?d?s?d?l?d?d?u +?u?d?s?d?l?d?d?s +?u?d?s?d?l?d?l?d +?u?d?s?d?l?d?l?l +?u?d?s?d?l?d?l?u +?u?d?s?d?l?d?l?s +?u?d?s?d?l?d?u?d +?u?d?s?d?l?d?u?l +?u?d?s?d?l?d?u?u +?u?d?s?d?l?d?u?s +?u?d?s?d?l?d?s?d +?u?d?s?d?l?d?s?l +?u?d?s?d?l?d?s?u +?u?d?s?d?l?d?s?s +?u?d?s?d?l?l?d?d +?u?d?s?d?l?l?d?l +?u?d?s?d?l?l?d?u +?u?d?s?d?l?l?d?s +?u?d?s?d?l?l?l?d +?u?d?s?d?l?l?l?l +?u?d?s?d?l?l?l?u +?u?d?s?d?l?l?l?s +?u?d?s?d?l?l?u?d +?u?d?s?d?l?l?u?l +?u?d?s?d?l?l?u?u +?u?d?s?d?l?l?u?s +?u?d?s?d?l?l?s?d +?u?d?s?d?l?l?s?l +?u?d?s?d?l?l?s?u +?u?d?s?d?l?l?s?s +?u?d?s?d?l?u?d?d +?u?d?s?d?l?u?d?l +?u?d?s?d?l?u?d?u +?u?d?s?d?l?u?d?s +?u?d?s?d?l?u?l?d +?u?d?s?d?l?u?l?l +?u?d?s?d?l?u?l?u +?u?d?s?d?l?u?l?s +?u?d?s?d?l?u?u?d +?u?d?s?d?l?u?u?l +?u?d?s?d?l?u?u?u +?u?d?s?d?l?u?u?s +?u?d?s?d?l?u?s?d +?u?d?s?d?l?u?s?l +?u?d?s?d?l?u?s?u +?u?d?s?d?l?u?s?s +?u?d?s?d?l?s?d?d +?u?d?s?d?l?s?d?l +?u?d?s?d?l?s?d?u +?u?d?s?d?l?s?d?s +?u?d?s?d?l?s?l?d +?u?d?s?d?l?s?l?l +?u?d?s?d?l?s?l?u +?u?d?s?d?l?s?l?s +?u?d?s?d?l?s?u?d +?u?d?s?d?l?s?u?l +?u?d?s?d?l?s?u?u +?u?d?s?d?l?s?u?s +?u?d?s?d?l?s?s?d +?u?d?s?d?l?s?s?l +?u?d?s?d?l?s?s?u +?u?d?s?d?l?s?s?s +?u?d?s?d?u?d?d?l +?u?d?s?d?u?d?l?d +?u?d?s?d?u?d?l?l +?u?d?s?d?u?d?l?u +?u?d?s?d?u?d?l?s +?u?d?s?d?u?d?u?l +?u?d?s?d?u?d?s?l +?u?d?s?d?u?l?d?d +?u?d?s?d?u?l?d?l +?u?d?s?d?u?l?d?u +?u?d?s?d?u?l?d?s +?u?d?s?d?u?l?l?d +?u?d?s?d?u?l?l?l +?u?d?s?d?u?l?l?u +?u?d?s?d?u?l?l?s +?u?d?s?d?u?l?u?d +?u?d?s?d?u?l?u?l +?u?d?s?d?u?l?u?u +?u?d?s?d?u?l?u?s +?u?d?s?d?u?l?s?d +?u?d?s?d?u?l?s?l +?u?d?s?d?u?l?s?u +?u?d?s?d?u?l?s?s +?u?d?s?d?u?u?d?l +?u?d?s?d?u?u?l?d +?u?d?s?d?u?u?l?l +?u?d?s?d?u?u?l?u +?u?d?s?d?u?u?l?s +?u?d?s?d?u?u?u?l +?u?d?s?d?u?u?s?l +?u?d?s?d?u?s?d?l +?u?d?s?d?u?s?l?d +?u?d?s?d?u?s?l?l +?u?d?s?d?u?s?l?u +?u?d?s?d?u?s?l?s +?u?d?s?d?u?s?u?l +?u?d?s?d?u?s?s?l +?u?d?s?d?s?d?d?l +?u?d?s?d?s?d?l?d +?u?d?s?d?s?d?l?l +?u?d?s?d?s?d?l?u +?u?d?s?d?s?d?l?s +?u?d?s?d?s?d?u?l +?u?d?s?d?s?d?s?l +?u?d?s?d?s?l?d?d +?u?d?s?d?s?l?d?l +?u?d?s?d?s?l?d?u +?u?d?s?d?s?l?d?s +?u?d?s?d?s?l?l?d +?u?d?s?d?s?l?l?l +?u?d?s?d?s?l?l?u +?u?d?s?d?s?l?l?s +?u?d?s?d?s?l?u?d +?u?d?s?d?s?l?u?l +?u?d?s?d?s?l?u?u +?u?d?s?d?s?l?u?s +?u?d?s?d?s?l?s?d +?u?d?s?d?s?l?s?l +?u?d?s?d?s?l?s?u +?u?d?s?d?s?l?s?s +?u?d?s?d?s?u?d?l +?u?d?s?d?s?u?l?d +?u?d?s?d?s?u?l?l +?u?d?s?d?s?u?l?u +?u?d?s?d?s?u?l?s +?u?d?s?d?s?u?u?l +?u?d?s?d?s?u?s?l +?u?d?s?d?s?s?d?l +?u?d?s?d?s?s?l?d +?u?d?s?d?s?s?l?l +?u?d?s?d?s?s?l?u +?u?d?s?d?s?s?l?s +?u?d?s?d?s?s?u?l +?u?d?s?d?s?s?s?l +?u?d?s?l?d?d?d?d +?u?d?s?l?d?d?d?l +?u?d?s?l?d?d?d?u +?u?d?s?l?d?d?d?s +?u?d?s?l?d?d?l?d +?u?d?s?l?d?d?l?l +?u?d?s?l?d?d?l?u +?u?d?s?l?d?d?l?s +?u?d?s?l?d?d?u?d +?u?d?s?l?d?d?u?l +?u?d?s?l?d?d?u?u +?u?d?s?l?d?d?u?s +?u?d?s?l?d?d?s?d +?u?d?s?l?d?d?s?l +?u?d?s?l?d?d?s?u +?u?d?s?l?d?d?s?s +?u?d?s?l?d?l?d?d +?u?d?s?l?d?l?d?l +?u?d?s?l?d?l?d?u +?u?d?s?l?d?l?d?s +?u?d?s?l?d?l?l?d +?u?d?s?l?d?l?l?l +?u?d?s?l?d?l?l?u +?u?d?s?l?d?l?l?s +?u?d?s?l?d?l?u?d +?u?d?s?l?d?l?u?l +?u?d?s?l?d?l?u?u +?u?d?s?l?d?l?u?s +?u?d?s?l?d?l?s?d +?u?d?s?l?d?l?s?l +?u?d?s?l?d?l?s?u +?u?d?s?l?d?l?s?s +?u?d?s?l?d?u?d?d +?u?d?s?l?d?u?d?l +?u?d?s?l?d?u?d?u +?u?d?s?l?d?u?d?s +?u?d?s?l?d?u?l?d +?u?d?s?l?d?u?l?l +?u?d?s?l?d?u?l?u +?u?d?s?l?d?u?l?s +?u?d?s?l?d?u?u?d +?u?d?s?l?d?u?u?l +?u?d?s?l?d?u?u?u +?u?d?s?l?d?u?u?s +?u?d?s?l?d?u?s?d +?u?d?s?l?d?u?s?l +?u?d?s?l?d?u?s?u +?u?d?s?l?d?u?s?s +?u?d?s?l?d?s?d?d +?u?d?s?l?d?s?d?l +?u?d?s?l?d?s?d?u +?u?d?s?l?d?s?d?s +?u?d?s?l?d?s?l?d +?u?d?s?l?d?s?l?l +?u?d?s?l?d?s?l?u +?u?d?s?l?d?s?l?s +?u?d?s?l?d?s?u?d +?u?d?s?l?d?s?u?l +?u?d?s?l?d?s?u?u +?u?d?s?l?d?s?u?s +?u?d?s?l?d?s?s?d +?u?d?s?l?d?s?s?l +?u?d?s?l?d?s?s?u +?u?d?s?l?d?s?s?s +?u?d?s?l?l?d?d?d +?u?d?s?l?l?d?d?l +?u?d?s?l?l?d?d?u +?u?d?s?l?l?d?d?s +?u?d?s?l?l?d?l?d +?u?d?s?l?l?d?l?l +?u?d?s?l?l?d?l?u +?u?d?s?l?l?d?l?s +?u?d?s?l?l?d?u?d +?u?d?s?l?l?d?u?l +?u?d?s?l?l?d?u?u +?u?d?s?l?l?d?u?s +?u?d?s?l?l?d?s?d +?u?d?s?l?l?d?s?l +?u?d?s?l?l?d?s?u +?u?d?s?l?l?d?s?s +?u?d?s?l?l?l?d?d +?u?d?s?l?l?l?d?l +?u?d?s?l?l?l?d?u +?u?d?s?l?l?l?d?s +?u?d?s?l?l?l?l?d +?u?d?s?l?l?l?l?l +?u?d?s?l?l?l?l?u +?u?d?s?l?l?l?l?s +?u?d?s?l?l?l?u?d +?u?d?s?l?l?l?u?l +?u?d?s?l?l?l?u?u +?u?d?s?l?l?l?u?s +?u?d?s?l?l?l?s?d +?u?d?s?l?l?l?s?l +?u?d?s?l?l?l?s?u +?u?d?s?l?l?l?s?s +?u?d?s?l?l?u?d?d +?u?d?s?l?l?u?d?l +?u?d?s?l?l?u?d?u +?u?d?s?l?l?u?d?s +?u?d?s?l?l?u?l?d +?u?d?s?l?l?u?l?l +?u?d?s?l?l?u?l?u +?u?d?s?l?l?u?l?s +?u?d?s?l?l?u?u?d +?u?d?s?l?l?u?u?l +?u?d?s?l?l?u?u?u +?u?d?s?l?l?u?u?s +?u?d?s?l?l?u?s?d +?u?d?s?l?l?u?s?l +?u?d?s?l?l?u?s?u +?u?d?s?l?l?u?s?s +?u?d?s?l?l?s?d?d +?u?d?s?l?l?s?d?l +?u?d?s?l?l?s?d?u +?u?d?s?l?l?s?d?s +?u?d?s?l?l?s?l?d +?u?d?s?l?l?s?l?l +?u?d?s?l?l?s?l?u +?u?d?s?l?l?s?l?s +?u?d?s?l?l?s?u?d +?u?d?s?l?l?s?u?l +?u?d?s?l?l?s?u?u +?u?d?s?l?l?s?u?s +?u?d?s?l?l?s?s?d +?u?d?s?l?l?s?s?l +?u?d?s?l?l?s?s?u +?u?d?s?l?l?s?s?s +?u?d?s?l?u?d?d?d +?u?d?s?l?u?d?d?l +?u?d?s?l?u?d?d?u +?u?d?s?l?u?d?d?s +?u?d?s?l?u?d?l?d +?u?d?s?l?u?d?l?l +?u?d?s?l?u?d?l?u +?u?d?s?l?u?d?l?s +?u?d?s?l?u?d?u?d +?u?d?s?l?u?d?u?l +?u?d?s?l?u?d?u?u +?u?d?s?l?u?d?u?s +?u?d?s?l?u?d?s?d +?u?d?s?l?u?d?s?l +?u?d?s?l?u?d?s?u +?u?d?s?l?u?d?s?s +?u?d?s?l?u?l?d?d +?u?d?s?l?u?l?d?l +?u?d?s?l?u?l?d?u +?u?d?s?l?u?l?d?s +?u?d?s?l?u?l?l?d +?u?d?s?l?u?l?l?l +?u?d?s?l?u?l?l?u +?u?d?s?l?u?l?l?s +?u?d?s?l?u?l?u?d +?u?d?s?l?u?l?u?l +?u?d?s?l?u?l?u?u +?u?d?s?l?u?l?u?s +?u?d?s?l?u?l?s?d +?u?d?s?l?u?l?s?l +?u?d?s?l?u?l?s?u +?u?d?s?l?u?l?s?s +?u?d?s?l?u?u?d?d +?u?d?s?l?u?u?d?l +?u?d?s?l?u?u?d?u +?u?d?s?l?u?u?d?s +?u?d?s?l?u?u?l?d +?u?d?s?l?u?u?l?l +?u?d?s?l?u?u?l?u +?u?d?s?l?u?u?l?s +?u?d?s?l?u?u?u?d +?u?d?s?l?u?u?u?l +?u?d?s?l?u?u?u?u +?u?d?s?l?u?u?u?s +?u?d?s?l?u?u?s?d +?u?d?s?l?u?u?s?l +?u?d?s?l?u?u?s?u +?u?d?s?l?u?u?s?s +?u?d?s?l?u?s?d?d +?u?d?s?l?u?s?d?l +?u?d?s?l?u?s?d?u +?u?d?s?l?u?s?d?s +?u?d?s?l?u?s?l?d +?u?d?s?l?u?s?l?l +?u?d?s?l?u?s?l?u +?u?d?s?l?u?s?l?s +?u?d?s?l?u?s?u?d +?u?d?s?l?u?s?u?l +?u?d?s?l?u?s?u?u +?u?d?s?l?u?s?u?s +?u?d?s?l?u?s?s?d +?u?d?s?l?u?s?s?l +?u?d?s?l?u?s?s?u +?u?d?s?l?u?s?s?s +?u?d?s?l?s?d?d?d +?u?d?s?l?s?d?d?l +?u?d?s?l?s?d?d?u +?u?d?s?l?s?d?d?s +?u?d?s?l?s?d?l?d +?u?d?s?l?s?d?l?l +?u?d?s?l?s?d?l?u +?u?d?s?l?s?d?l?s +?u?d?s?l?s?d?u?d +?u?d?s?l?s?d?u?l +?u?d?s?l?s?d?u?u +?u?d?s?l?s?d?u?s +?u?d?s?l?s?d?s?d +?u?d?s?l?s?d?s?l +?u?d?s?l?s?d?s?u +?u?d?s?l?s?d?s?s +?u?d?s?l?s?l?d?d +?u?d?s?l?s?l?d?l +?u?d?s?l?s?l?d?u +?u?d?s?l?s?l?d?s +?u?d?s?l?s?l?l?d +?u?d?s?l?s?l?l?l +?u?d?s?l?s?l?l?u +?u?d?s?l?s?l?l?s +?u?d?s?l?s?l?u?d +?u?d?s?l?s?l?u?l +?u?d?s?l?s?l?u?u +?u?d?s?l?s?l?u?s +?u?d?s?l?s?l?s?d +?u?d?s?l?s?l?s?l +?u?d?s?l?s?l?s?u +?u?d?s?l?s?l?s?s +?u?d?s?l?s?u?d?d +?u?d?s?l?s?u?d?l +?u?d?s?l?s?u?d?u +?u?d?s?l?s?u?d?s +?u?d?s?l?s?u?l?d +?u?d?s?l?s?u?l?l +?u?d?s?l?s?u?l?u +?u?d?s?l?s?u?l?s +?u?d?s?l?s?u?u?d +?u?d?s?l?s?u?u?l +?u?d?s?l?s?u?u?u +?u?d?s?l?s?u?u?s +?u?d?s?l?s?u?s?d +?u?d?s?l?s?u?s?l +?u?d?s?l?s?u?s?u +?u?d?s?l?s?u?s?s +?u?d?s?l?s?s?d?d +?u?d?s?l?s?s?d?l +?u?d?s?l?s?s?d?u +?u?d?s?l?s?s?d?s +?u?d?s?l?s?s?l?d +?u?d?s?l?s?s?l?l +?u?d?s?l?s?s?l?u +?u?d?s?l?s?s?l?s +?u?d?s?l?s?s?u?d +?u?d?s?l?s?s?u?l +?u?d?s?l?s?s?u?u +?u?d?s?l?s?s?u?s +?u?d?s?l?s?s?s?d +?u?d?s?l?s?s?s?l +?u?d?s?l?s?s?s?u +?u?d?s?l?s?s?s?s +?u?d?s?u?d?d?d?l +?u?d?s?u?d?d?l?d +?u?d?s?u?d?d?l?l +?u?d?s?u?d?d?l?u +?u?d?s?u?d?d?l?s +?u?d?s?u?d?d?u?l +?u?d?s?u?d?d?s?l +?u?d?s?u?d?l?d?d +?u?d?s?u?d?l?d?l +?u?d?s?u?d?l?d?u +?u?d?s?u?d?l?d?s +?u?d?s?u?d?l?l?d +?u?d?s?u?d?l?l?l +?u?d?s?u?d?l?l?u +?u?d?s?u?d?l?l?s +?u?d?s?u?d?l?u?d +?u?d?s?u?d?l?u?l +?u?d?s?u?d?l?u?u +?u?d?s?u?d?l?u?s +?u?d?s?u?d?l?s?d +?u?d?s?u?d?l?s?l +?u?d?s?u?d?l?s?u +?u?d?s?u?d?l?s?s +?u?d?s?u?d?u?d?l +?u?d?s?u?d?u?l?d +?u?d?s?u?d?u?l?l +?u?d?s?u?d?u?l?u +?u?d?s?u?d?u?l?s +?u?d?s?u?d?u?u?l +?u?d?s?u?d?u?s?l +?u?d?s?u?d?s?d?l +?u?d?s?u?d?s?l?d +?u?d?s?u?d?s?l?l +?u?d?s?u?d?s?l?u +?u?d?s?u?d?s?l?s +?u?d?s?u?d?s?u?l +?u?d?s?u?d?s?s?l +?u?d?s?u?l?d?d?d +?u?d?s?u?l?d?d?l +?u?d?s?u?l?d?d?u +?u?d?s?u?l?d?d?s +?u?d?s?u?l?d?l?d +?u?d?s?u?l?d?l?l +?u?d?s?u?l?d?l?u +?u?d?s?u?l?d?l?s +?u?d?s?u?l?d?u?d +?u?d?s?u?l?d?u?l +?u?d?s?u?l?d?u?u +?u?d?s?u?l?d?u?s +?u?d?s?u?l?d?s?d +?u?d?s?u?l?d?s?l +?u?d?s?u?l?d?s?u +?u?d?s?u?l?d?s?s +?u?d?s?u?l?l?d?d +?u?d?s?u?l?l?d?l +?u?d?s?u?l?l?d?u +?u?d?s?u?l?l?d?s +?u?d?s?u?l?l?l?d +?u?d?s?u?l?l?l?l +?u?d?s?u?l?l?l?u +?u?d?s?u?l?l?l?s +?u?d?s?u?l?l?u?d +?u?d?s?u?l?l?u?l +?u?d?s?u?l?l?u?u +?u?d?s?u?l?l?u?s +?u?d?s?u?l?l?s?d +?u?d?s?u?l?l?s?l +?u?d?s?u?l?l?s?u +?u?d?s?u?l?l?s?s +?u?d?s?u?l?u?d?d +?u?d?s?u?l?u?d?l +?u?d?s?u?l?u?d?u +?u?d?s?u?l?u?d?s +?u?d?s?u?l?u?l?d +?u?d?s?u?l?u?l?l +?u?d?s?u?l?u?l?u +?u?d?s?u?l?u?l?s +?u?d?s?u?l?u?u?d +?u?d?s?u?l?u?u?l +?u?d?s?u?l?u?u?u +?u?d?s?u?l?u?u?s +?u?d?s?u?l?u?s?d +?u?d?s?u?l?u?s?l +?u?d?s?u?l?u?s?u +?u?d?s?u?l?u?s?s +?u?d?s?u?l?s?d?d +?u?d?s?u?l?s?d?l +?u?d?s?u?l?s?d?u +?u?d?s?u?l?s?d?s +?u?d?s?u?l?s?l?d +?u?d?s?u?l?s?l?l +?u?d?s?u?l?s?l?u +?u?d?s?u?l?s?l?s +?u?d?s?u?l?s?u?d +?u?d?s?u?l?s?u?l +?u?d?s?u?l?s?u?u +?u?d?s?u?l?s?u?s +?u?d?s?u?l?s?s?d +?u?d?s?u?l?s?s?l +?u?d?s?u?l?s?s?u +?u?d?s?u?l?s?s?s +?u?d?s?u?u?d?d?l +?u?d?s?u?u?d?l?d +?u?d?s?u?u?d?l?l +?u?d?s?u?u?d?l?u +?u?d?s?u?u?d?l?s +?u?d?s?u?u?d?u?l +?u?d?s?u?u?d?s?l +?u?d?s?u?u?l?d?d +?u?d?s?u?u?l?d?l +?u?d?s?u?u?l?d?u +?u?d?s?u?u?l?d?s +?u?d?s?u?u?l?l?d +?u?d?s?u?u?l?l?l +?u?d?s?u?u?l?l?u +?u?d?s?u?u?l?l?s +?u?d?s?u?u?l?u?d +?u?d?s?u?u?l?u?l +?u?d?s?u?u?l?u?u +?u?d?s?u?u?l?u?s +?u?d?s?u?u?l?s?d +?u?d?s?u?u?l?s?l +?u?d?s?u?u?l?s?u +?u?d?s?u?u?l?s?s +?u?d?s?u?u?u?d?l +?u?d?s?u?u?u?l?d +?u?d?s?u?u?u?l?l +?u?d?s?u?u?u?l?u +?u?d?s?u?u?u?l?s +?u?d?s?u?u?u?u?l +?u?d?s?u?u?u?s?l +?u?d?s?u?u?s?d?l +?u?d?s?u?u?s?l?d +?u?d?s?u?u?s?l?l +?u?d?s?u?u?s?l?u +?u?d?s?u?u?s?l?s +?u?d?s?u?u?s?u?l +?u?d?s?u?u?s?s?l +?u?d?s?u?s?d?d?l +?u?d?s?u?s?d?l?d +?u?d?s?u?s?d?l?l +?u?d?s?u?s?d?l?u +?u?d?s?u?s?d?l?s +?u?d?s?u?s?d?u?l +?u?d?s?u?s?d?s?l +?u?d?s?u?s?l?d?d +?u?d?s?u?s?l?d?l +?u?d?s?u?s?l?d?u +?u?d?s?u?s?l?d?s +?u?d?s?u?s?l?l?d +?u?d?s?u?s?l?l?l +?u?d?s?u?s?l?l?u +?u?d?s?u?s?l?l?s +?u?d?s?u?s?l?u?d +?u?d?s?u?s?l?u?l +?u?d?s?u?s?l?u?u +?u?d?s?u?s?l?u?s +?u?d?s?u?s?l?s?d +?u?d?s?u?s?l?s?l +?u?d?s?u?s?l?s?u +?u?d?s?u?s?l?s?s +?u?d?s?u?s?u?d?l +?u?d?s?u?s?u?l?d +?u?d?s?u?s?u?l?l +?u?d?s?u?s?u?l?u +?u?d?s?u?s?u?l?s +?u?d?s?u?s?u?u?l +?u?d?s?u?s?u?s?l +?u?d?s?u?s?s?d?l +?u?d?s?u?s?s?l?d +?u?d?s?u?s?s?l?l +?u?d?s?u?s?s?l?u +?u?d?s?u?s?s?l?s +?u?d?s?u?s?s?u?l +?u?d?s?u?s?s?s?l +?u?d?s?s?d?d?d?l +?u?d?s?s?d?d?l?d +?u?d?s?s?d?d?l?l +?u?d?s?s?d?d?l?u +?u?d?s?s?d?d?l?s +?u?d?s?s?d?d?u?l +?u?d?s?s?d?d?s?l +?u?d?s?s?d?l?d?d +?u?d?s?s?d?l?d?l +?u?d?s?s?d?l?d?u +?u?d?s?s?d?l?d?s +?u?d?s?s?d?l?l?d +?u?d?s?s?d?l?l?l +?u?d?s?s?d?l?l?u +?u?d?s?s?d?l?l?s +?u?d?s?s?d?l?u?d +?u?d?s?s?d?l?u?l +?u?d?s?s?d?l?u?u +?u?d?s?s?d?l?u?s +?u?d?s?s?d?l?s?d +?u?d?s?s?d?l?s?l +?u?d?s?s?d?l?s?u +?u?d?s?s?d?l?s?s +?u?d?s?s?d?u?d?l +?u?d?s?s?d?u?l?d +?u?d?s?s?d?u?l?l +?u?d?s?s?d?u?l?u +?u?d?s?s?d?u?l?s +?u?d?s?s?d?u?u?l +?u?d?s?s?d?u?s?l +?u?d?s?s?d?s?d?l +?u?d?s?s?d?s?l?d +?u?d?s?s?d?s?l?l +?u?d?s?s?d?s?l?u +?u?d?s?s?d?s?l?s +?u?d?s?s?d?s?u?l +?u?d?s?s?d?s?s?l +?u?d?s?s?l?d?d?d +?u?d?s?s?l?d?d?l +?u?d?s?s?l?d?d?u +?u?d?s?s?l?d?d?s +?u?d?s?s?l?d?l?d +?u?d?s?s?l?d?l?l +?u?d?s?s?l?d?l?u +?u?d?s?s?l?d?l?s +?u?d?s?s?l?d?u?d +?u?d?s?s?l?d?u?l +?u?d?s?s?l?d?u?u +?u?d?s?s?l?d?u?s +?u?d?s?s?l?d?s?d +?u?d?s?s?l?d?s?l +?u?d?s?s?l?d?s?u +?u?d?s?s?l?d?s?s +?u?d?s?s?l?l?d?d +?u?d?s?s?l?l?d?l +?u?d?s?s?l?l?d?u +?u?d?s?s?l?l?d?s +?u?d?s?s?l?l?l?d +?u?d?s?s?l?l?l?l +?u?d?s?s?l?l?l?u +?u?d?s?s?l?l?l?s +?u?d?s?s?l?l?u?d +?u?d?s?s?l?l?u?l +?u?d?s?s?l?l?u?u +?u?d?s?s?l?l?u?s +?u?d?s?s?l?l?s?d +?u?d?s?s?l?l?s?l +?u?d?s?s?l?l?s?u +?u?d?s?s?l?l?s?s +?u?d?s?s?l?u?d?d +?u?d?s?s?l?u?d?l +?u?d?s?s?l?u?d?u +?u?d?s?s?l?u?d?s +?u?d?s?s?l?u?l?d +?u?d?s?s?l?u?l?l +?u?d?s?s?l?u?l?u +?u?d?s?s?l?u?l?s +?u?d?s?s?l?u?u?d +?u?d?s?s?l?u?u?l +?u?d?s?s?l?u?u?u +?u?d?s?s?l?u?u?s +?u?d?s?s?l?u?s?d +?u?d?s?s?l?u?s?l +?u?d?s?s?l?u?s?u +?u?d?s?s?l?u?s?s +?u?d?s?s?l?s?d?d +?u?d?s?s?l?s?d?l +?u?d?s?s?l?s?d?u +?u?d?s?s?l?s?d?s +?u?d?s?s?l?s?l?d +?u?d?s?s?l?s?l?l +?u?d?s?s?l?s?l?u +?u?d?s?s?l?s?l?s +?u?d?s?s?l?s?u?d +?u?d?s?s?l?s?u?l +?u?d?s?s?l?s?u?u +?u?d?s?s?l?s?u?s +?u?d?s?s?l?s?s?d +?u?d?s?s?l?s?s?l +?u?d?s?s?l?s?s?u +?u?d?s?s?l?s?s?s +?u?d?s?s?u?d?d?l +?u?d?s?s?u?d?l?d +?u?d?s?s?u?d?l?l +?u?d?s?s?u?d?l?u +?u?d?s?s?u?d?l?s +?u?d?s?s?u?d?u?l +?u?d?s?s?u?d?s?l +?u?d?s?s?u?l?d?d +?u?d?s?s?u?l?d?l +?u?d?s?s?u?l?d?u +?u?d?s?s?u?l?d?s +?u?d?s?s?u?l?l?d +?u?d?s?s?u?l?l?l +?u?d?s?s?u?l?l?u +?u?d?s?s?u?l?l?s +?u?d?s?s?u?l?u?d +?u?d?s?s?u?l?u?l +?u?d?s?s?u?l?u?u +?u?d?s?s?u?l?u?s +?u?d?s?s?u?l?s?d +?u?d?s?s?u?l?s?l +?u?d?s?s?u?l?s?u +?u?d?s?s?u?l?s?s +?u?d?s?s?u?u?d?l +?u?d?s?s?u?u?l?d +?u?d?s?s?u?u?l?l +?u?d?s?s?u?u?l?u +?u?d?s?s?u?u?l?s +?u?d?s?s?u?u?u?l +?u?d?s?s?u?u?s?l +?u?d?s?s?u?s?d?l +?u?d?s?s?u?s?l?d +?u?d?s?s?u?s?l?l +?u?d?s?s?u?s?l?u +?u?d?s?s?u?s?l?s +?u?d?s?s?u?s?u?l +?u?d?s?s?u?s?s?l +?u?d?s?s?s?d?d?l +?u?d?s?s?s?d?l?d +?u?d?s?s?s?d?l?l +?u?d?s?s?s?d?l?u +?u?d?s?s?s?d?l?s +?u?d?s?s?s?d?u?l +?u?d?s?s?s?d?s?l +?u?d?s?s?s?l?d?d +?u?d?s?s?s?l?d?l +?u?d?s?s?s?l?d?u +?u?d?s?s?s?l?d?s +?u?d?s?s?s?l?l?d +?u?d?s?s?s?l?l?l +?u?d?s?s?s?l?l?u +?u?d?s?s?s?l?l?s +?u?d?s?s?s?l?u?d +?u?d?s?s?s?l?u?l +?u?d?s?s?s?l?u?u +?u?d?s?s?s?l?u?s +?u?d?s?s?s?l?s?d +?u?d?s?s?s?l?s?l +?u?d?s?s?s?l?s?u +?u?d?s?s?s?l?s?s +?u?d?s?s?s?u?d?l +?u?d?s?s?s?u?l?d +?u?d?s?s?s?u?l?l +?u?d?s?s?s?u?l?u +?u?d?s?s?s?u?l?s +?u?d?s?s?s?u?u?l +?u?d?s?s?s?u?s?l +?u?d?s?s?s?s?d?l +?u?d?s?s?s?s?l?d +?u?d?s?s?s?s?l?l +?u?d?s?s?s?s?l?u +?u?d?s?s?s?s?l?s +?u?d?s?s?s?s?u?l +?u?d?s?s?s?s?s?l +?u?l?d?d?d?d?d?s +?u?l?d?d?d?d?l?s +?u?l?d?d?d?d?u?s +?u?l?d?d?d?d?s?d +?u?l?d?d?d?d?s?l +?u?l?d?d?d?d?s?u +?u?l?d?d?d?d?s?s +?u?l?d?d?d?l?d?s +?u?l?d?d?d?l?l?s +?u?l?d?d?d?l?u?s +?u?l?d?d?d?l?s?d +?u?l?d?d?d?l?s?l +?u?l?d?d?d?l?s?u +?u?l?d?d?d?l?s?s +?u?l?d?d?d?u?d?s +?u?l?d?d?d?u?l?s +?u?l?d?d?d?u?u?s +?u?l?d?d?d?u?s?d +?u?l?d?d?d?u?s?l +?u?l?d?d?d?u?s?u +?u?l?d?d?d?u?s?s +?u?l?d?d?d?s?d?d +?u?l?d?d?d?s?d?l +?u?l?d?d?d?s?d?u +?u?l?d?d?d?s?d?s +?u?l?d?d?d?s?l?d +?u?l?d?d?d?s?l?l +?u?l?d?d?d?s?l?u +?u?l?d?d?d?s?l?s +?u?l?d?d?d?s?u?d +?u?l?d?d?d?s?u?l +?u?l?d?d?d?s?u?u +?u?l?d?d?d?s?u?s +?u?l?d?d?d?s?s?d +?u?l?d?d?d?s?s?l +?u?l?d?d?d?s?s?u +?u?l?d?d?d?s?s?s +?u?l?d?d?l?d?d?s +?u?l?d?d?l?d?l?s +?u?l?d?d?l?d?u?s +?u?l?d?d?l?d?s?d +?u?l?d?d?l?d?s?l +?u?l?d?d?l?d?s?u +?u?l?d?d?l?d?s?s +?u?l?d?d?l?l?d?s +?u?l?d?d?l?l?l?s +?u?l?d?d?l?l?u?s +?u?l?d?d?l?l?s?d +?u?l?d?d?l?l?s?l +?u?l?d?d?l?l?s?u +?u?l?d?d?l?l?s?s +?u?l?d?d?l?u?d?s +?u?l?d?d?l?u?l?s +?u?l?d?d?l?u?u?s +?u?l?d?d?l?u?s?d +?u?l?d?d?l?u?s?l +?u?l?d?d?l?u?s?u +?u?l?d?d?l?u?s?s +?u?l?d?d?l?s?d?d +?u?l?d?d?l?s?d?l +?u?l?d?d?l?s?d?u +?u?l?d?d?l?s?d?s +?u?l?d?d?l?s?l?d +?u?l?d?d?l?s?l?l +?u?l?d?d?l?s?l?u +?u?l?d?d?l?s?l?s +?u?l?d?d?l?s?u?d +?u?l?d?d?l?s?u?l +?u?l?d?d?l?s?u?u +?u?l?d?d?l?s?u?s +?u?l?d?d?l?s?s?d +?u?l?d?d?l?s?s?l +?u?l?d?d?l?s?s?u +?u?l?d?d?l?s?s?s +?u?l?d?d?u?d?d?s +?u?l?d?d?u?d?l?s +?u?l?d?d?u?d?u?s +?u?l?d?d?u?d?s?d +?u?l?d?d?u?d?s?l +?u?l?d?d?u?d?s?u +?u?l?d?d?u?d?s?s +?u?l?d?d?u?l?d?s +?u?l?d?d?u?l?l?s +?u?l?d?d?u?l?u?s +?u?l?d?d?u?l?s?d +?u?l?d?d?u?l?s?l +?u?l?d?d?u?l?s?u +?u?l?d?d?u?l?s?s +?u?l?d?d?u?u?d?s +?u?l?d?d?u?u?l?s +?u?l?d?d?u?u?u?s +?u?l?d?d?u?u?s?d +?u?l?d?d?u?u?s?l +?u?l?d?d?u?u?s?u +?u?l?d?d?u?u?s?s +?u?l?d?d?u?s?d?d +?u?l?d?d?u?s?d?l +?u?l?d?d?u?s?d?u +?u?l?d?d?u?s?d?s +?u?l?d?d?u?s?l?d +?u?l?d?d?u?s?l?l +?u?l?d?d?u?s?l?u +?u?l?d?d?u?s?l?s +?u?l?d?d?u?s?u?d +?u?l?d?d?u?s?u?l +?u?l?d?d?u?s?u?u +?u?l?d?d?u?s?u?s +?u?l?d?d?u?s?s?d +?u?l?d?d?u?s?s?l +?u?l?d?d?u?s?s?u +?u?l?d?d?u?s?s?s +?u?l?d?d?s?d?d?d +?u?l?d?d?s?d?d?l +?u?l?d?d?s?d?d?u +?u?l?d?d?s?d?d?s +?u?l?d?d?s?d?l?d +?u?l?d?d?s?d?l?l +?u?l?d?d?s?d?l?u +?u?l?d?d?s?d?l?s +?u?l?d?d?s?d?u?d +?u?l?d?d?s?d?u?l +?u?l?d?d?s?d?u?u +?u?l?d?d?s?d?u?s +?u?l?d?d?s?d?s?d +?u?l?d?d?s?d?s?l +?u?l?d?d?s?d?s?u +?u?l?d?d?s?d?s?s +?u?l?d?d?s?l?d?d +?u?l?d?d?s?l?d?l +?u?l?d?d?s?l?d?u +?u?l?d?d?s?l?d?s +?u?l?d?d?s?l?l?d +?u?l?d?d?s?l?l?l +?u?l?d?d?s?l?l?u +?u?l?d?d?s?l?l?s +?u?l?d?d?s?l?u?d +?u?l?d?d?s?l?u?l +?u?l?d?d?s?l?u?u +?u?l?d?d?s?l?u?s +?u?l?d?d?s?l?s?d +?u?l?d?d?s?l?s?l +?u?l?d?d?s?l?s?u +?u?l?d?d?s?l?s?s +?u?l?d?d?s?u?d?d +?u?l?d?d?s?u?d?l +?u?l?d?d?s?u?d?u +?u?l?d?d?s?u?d?s +?u?l?d?d?s?u?l?d +?u?l?d?d?s?u?l?l +?u?l?d?d?s?u?l?u +?u?l?d?d?s?u?l?s +?u?l?d?d?s?u?u?d +?u?l?d?d?s?u?u?l +?u?l?d?d?s?u?u?u +?u?l?d?d?s?u?u?s +?u?l?d?d?s?u?s?d +?u?l?d?d?s?u?s?l +?u?l?d?d?s?u?s?u +?u?l?d?d?s?u?s?s +?u?l?d?d?s?s?d?d +?u?l?d?d?s?s?d?l +?u?l?d?d?s?s?d?u +?u?l?d?d?s?s?d?s +?u?l?d?d?s?s?l?d +?u?l?d?d?s?s?l?l +?u?l?d?d?s?s?l?u +?u?l?d?d?s?s?l?s +?u?l?d?d?s?s?u?d +?u?l?d?d?s?s?u?l +?u?l?d?d?s?s?u?u +?u?l?d?d?s?s?u?s +?u?l?d?d?s?s?s?d +?u?l?d?d?s?s?s?l +?u?l?d?d?s?s?s?u +?u?l?d?d?s?s?s?s +?u?l?d?l?d?d?d?s +?u?l?d?l?d?d?l?s +?u?l?d?l?d?d?u?s +?u?l?d?l?d?d?s?d +?u?l?d?l?d?d?s?l +?u?l?d?l?d?d?s?u +?u?l?d?l?d?d?s?s +?u?l?d?l?d?l?d?s +?u?l?d?l?d?l?l?s +?u?l?d?l?d?l?u?s +?u?l?d?l?d?l?s?d +?u?l?d?l?d?l?s?l +?u?l?d?l?d?l?s?u +?u?l?d?l?d?l?s?s +?u?l?d?l?d?u?d?s +?u?l?d?l?d?u?l?s +?u?l?d?l?d?u?u?s +?u?l?d?l?d?u?s?d +?u?l?d?l?d?u?s?l +?u?l?d?l?d?u?s?u +?u?l?d?l?d?u?s?s +?u?l?d?l?d?s?d?d +?u?l?d?l?d?s?d?l +?u?l?d?l?d?s?d?u +?u?l?d?l?d?s?d?s +?u?l?d?l?d?s?l?d +?u?l?d?l?d?s?l?l +?u?l?d?l?d?s?l?u +?u?l?d?l?d?s?l?s +?u?l?d?l?d?s?u?d +?u?l?d?l?d?s?u?l +?u?l?d?l?d?s?u?u +?u?l?d?l?d?s?u?s +?u?l?d?l?d?s?s?d +?u?l?d?l?d?s?s?l +?u?l?d?l?d?s?s?u +?u?l?d?l?d?s?s?s +?u?l?d?l?l?d?d?s +?u?l?d?l?l?d?l?s +?u?l?d?l?l?d?u?s +?u?l?d?l?l?d?s?d +?u?l?d?l?l?d?s?l +?u?l?d?l?l?d?s?u +?u?l?d?l?l?d?s?s +?u?l?d?l?l?l?d?s +?u?l?d?l?l?l?l?s +?u?l?d?l?l?l?u?s +?u?l?d?l?l?l?s?d +?u?l?d?l?l?l?s?l +?u?l?d?l?l?l?s?u +?u?l?d?l?l?l?s?s +?u?l?d?l?l?u?d?s +?u?l?d?l?l?u?l?s +?u?l?d?l?l?u?u?s +?u?l?d?l?l?u?s?d +?u?l?d?l?l?u?s?l +?u?l?d?l?l?u?s?u +?u?l?d?l?l?u?s?s +?u?l?d?l?l?s?d?d +?u?l?d?l?l?s?d?l +?u?l?d?l?l?s?d?u +?u?l?d?l?l?s?d?s +?u?l?d?l?l?s?l?d +?u?l?d?l?l?s?l?l +?u?l?d?l?l?s?l?u +?u?l?d?l?l?s?l?s +?u?l?d?l?l?s?u?d +?u?l?d?l?l?s?u?l +?u?l?d?l?l?s?u?u +?u?l?d?l?l?s?u?s +?u?l?d?l?l?s?s?d +?u?l?d?l?l?s?s?l +?u?l?d?l?l?s?s?u +?u?l?d?l?l?s?s?s +?u?l?d?l?u?d?d?s +?u?l?d?l?u?d?l?s +?u?l?d?l?u?d?u?s +?u?l?d?l?u?d?s?d +?u?l?d?l?u?d?s?l +?u?l?d?l?u?d?s?u +?u?l?d?l?u?d?s?s +?u?l?d?l?u?l?d?s +?u?l?d?l?u?l?l?s +?u?l?d?l?u?l?u?s +?u?l?d?l?u?l?s?d +?u?l?d?l?u?l?s?l +?u?l?d?l?u?l?s?u +?u?l?d?l?u?l?s?s +?u?l?d?l?u?u?d?s +?u?l?d?l?u?u?l?s +?u?l?d?l?u?u?u?s +?u?l?d?l?u?u?s?d +?u?l?d?l?u?u?s?l +?u?l?d?l?u?u?s?u +?u?l?d?l?u?u?s?s +?u?l?d?l?u?s?d?d +?u?l?d?l?u?s?d?l +?u?l?d?l?u?s?d?u +?u?l?d?l?u?s?d?s +?u?l?d?l?u?s?l?d +?u?l?d?l?u?s?l?l +?u?l?d?l?u?s?l?u +?u?l?d?l?u?s?l?s +?u?l?d?l?u?s?u?d +?u?l?d?l?u?s?u?l +?u?l?d?l?u?s?u?u +?u?l?d?l?u?s?u?s +?u?l?d?l?u?s?s?d +?u?l?d?l?u?s?s?l +?u?l?d?l?u?s?s?u +?u?l?d?l?u?s?s?s +?u?l?d?l?s?d?d?d +?u?l?d?l?s?d?d?l +?u?l?d?l?s?d?d?u +?u?l?d?l?s?d?d?s +?u?l?d?l?s?d?l?d +?u?l?d?l?s?d?l?l +?u?l?d?l?s?d?l?u +?u?l?d?l?s?d?l?s +?u?l?d?l?s?d?u?d +?u?l?d?l?s?d?u?l +?u?l?d?l?s?d?u?u +?u?l?d?l?s?d?u?s +?u?l?d?l?s?d?s?d +?u?l?d?l?s?d?s?l +?u?l?d?l?s?d?s?u +?u?l?d?l?s?d?s?s +?u?l?d?l?s?l?d?d +?u?l?d?l?s?l?d?l +?u?l?d?l?s?l?d?u +?u?l?d?l?s?l?d?s +?u?l?d?l?s?l?l?d +?u?l?d?l?s?l?l?l +?u?l?d?l?s?l?l?u +?u?l?d?l?s?l?l?s +?u?l?d?l?s?l?u?d +?u?l?d?l?s?l?u?l +?u?l?d?l?s?l?u?u +?u?l?d?l?s?l?u?s +?u?l?d?l?s?l?s?d +?u?l?d?l?s?l?s?l +?u?l?d?l?s?l?s?u +?u?l?d?l?s?l?s?s +?u?l?d?l?s?u?d?d +?u?l?d?l?s?u?d?l +?u?l?d?l?s?u?d?u +?u?l?d?l?s?u?d?s +?u?l?d?l?s?u?l?d +?u?l?d?l?s?u?l?l +?u?l?d?l?s?u?l?u +?u?l?d?l?s?u?l?s +?u?l?d?l?s?u?u?d +?u?l?d?l?s?u?u?l +?u?l?d?l?s?u?u?u +?u?l?d?l?s?u?u?s +?u?l?d?l?s?u?s?d +?u?l?d?l?s?u?s?l +?u?l?d?l?s?u?s?u +?u?l?d?l?s?u?s?s +?u?l?d?l?s?s?d?d +?u?l?d?l?s?s?d?l +?u?l?d?l?s?s?d?u +?u?l?d?l?s?s?d?s +?u?l?d?l?s?s?l?d +?u?l?d?l?s?s?l?l +?u?l?d?l?s?s?l?u +?u?l?d?l?s?s?l?s +?u?l?d?l?s?s?u?d +?u?l?d?l?s?s?u?l +?u?l?d?l?s?s?u?u +?u?l?d?l?s?s?u?s +?u?l?d?l?s?s?s?d +?u?l?d?l?s?s?s?l +?u?l?d?l?s?s?s?u +?u?l?d?l?s?s?s?s +?u?l?d?u?d?d?d?s +?u?l?d?u?d?d?l?s +?u?l?d?u?d?d?u?s +?u?l?d?u?d?d?s?d +?u?l?d?u?d?d?s?l +?u?l?d?u?d?d?s?u +?u?l?d?u?d?d?s?s +?u?l?d?u?d?l?d?s +?u?l?d?u?d?l?l?s +?u?l?d?u?d?l?u?s +?u?l?d?u?d?l?s?d +?u?l?d?u?d?l?s?l +?u?l?d?u?d?l?s?u +?u?l?d?u?d?l?s?s +?u?l?d?u?d?u?d?s +?u?l?d?u?d?u?l?s +?u?l?d?u?d?u?u?s +?u?l?d?u?d?u?s?d +?u?l?d?u?d?u?s?l +?u?l?d?u?d?u?s?u +?u?l?d?u?d?u?s?s +?u?l?d?u?d?s?d?d +?u?l?d?u?d?s?d?l +?u?l?d?u?d?s?d?u +?u?l?d?u?d?s?d?s +?u?l?d?u?d?s?l?d +?u?l?d?u?d?s?l?l +?u?l?d?u?d?s?l?u +?u?l?d?u?d?s?l?s +?u?l?d?u?d?s?u?d +?u?l?d?u?d?s?u?l +?u?l?d?u?d?s?u?u +?u?l?d?u?d?s?u?s +?u?l?d?u?d?s?s?d +?u?l?d?u?d?s?s?l +?u?l?d?u?d?s?s?u +?u?l?d?u?d?s?s?s +?u?l?d?u?l?d?d?s +?u?l?d?u?l?d?l?s +?u?l?d?u?l?d?u?s +?u?l?d?u?l?d?s?d +?u?l?d?u?l?d?s?l +?u?l?d?u?l?d?s?u +?u?l?d?u?l?d?s?s +?u?l?d?u?l?l?d?s +?u?l?d?u?l?l?l?s +?u?l?d?u?l?l?u?s +?u?l?d?u?l?l?s?d +?u?l?d?u?l?l?s?l +?u?l?d?u?l?l?s?u +?u?l?d?u?l?l?s?s +?u?l?d?u?l?u?d?s +?u?l?d?u?l?u?l?s +?u?l?d?u?l?u?u?s +?u?l?d?u?l?u?s?d +?u?l?d?u?l?u?s?l +?u?l?d?u?l?u?s?u +?u?l?d?u?l?u?s?s +?u?l?d?u?l?s?d?d +?u?l?d?u?l?s?d?l +?u?l?d?u?l?s?d?u +?u?l?d?u?l?s?d?s +?u?l?d?u?l?s?l?d +?u?l?d?u?l?s?l?l +?u?l?d?u?l?s?l?u +?u?l?d?u?l?s?l?s +?u?l?d?u?l?s?u?d +?u?l?d?u?l?s?u?l +?u?l?d?u?l?s?u?u +?u?l?d?u?l?s?u?s +?u?l?d?u?l?s?s?d +?u?l?d?u?l?s?s?l +?u?l?d?u?l?s?s?u +?u?l?d?u?l?s?s?s +?u?l?d?u?u?d?d?s +?u?l?d?u?u?d?l?s +?u?l?d?u?u?d?u?s +?u?l?d?u?u?d?s?d +?u?l?d?u?u?d?s?l +?u?l?d?u?u?d?s?u +?u?l?d?u?u?d?s?s +?u?l?d?u?u?l?d?s +?u?l?d?u?u?l?l?s +?u?l?d?u?u?l?u?s +?u?l?d?u?u?l?s?d +?u?l?d?u?u?l?s?l +?u?l?d?u?u?l?s?u +?u?l?d?u?u?l?s?s +?u?l?d?u?u?u?d?s +?u?l?d?u?u?u?l?s +?u?l?d?u?u?u?u?s +?u?l?d?u?u?u?s?d +?u?l?d?u?u?u?s?l +?u?l?d?u?u?u?s?u +?u?l?d?u?u?u?s?s +?u?l?d?u?u?s?d?d +?u?l?d?u?u?s?d?l +?u?l?d?u?u?s?d?u +?u?l?d?u?u?s?d?s +?u?l?d?u?u?s?l?d +?u?l?d?u?u?s?l?l +?u?l?d?u?u?s?l?u +?u?l?d?u?u?s?l?s +?u?l?d?u?u?s?u?d +?u?l?d?u?u?s?u?l +?u?l?d?u?u?s?u?u +?u?l?d?u?u?s?u?s +?u?l?d?u?u?s?s?d +?u?l?d?u?u?s?s?l +?u?l?d?u?u?s?s?u +?u?l?d?u?u?s?s?s +?u?l?d?u?s?d?d?d +?u?l?d?u?s?d?d?l +?u?l?d?u?s?d?d?u +?u?l?d?u?s?d?d?s +?u?l?d?u?s?d?l?d +?u?l?d?u?s?d?l?l +?u?l?d?u?s?d?l?u +?u?l?d?u?s?d?l?s +?u?l?d?u?s?d?u?d +?u?l?d?u?s?d?u?l +?u?l?d?u?s?d?u?u +?u?l?d?u?s?d?u?s +?u?l?d?u?s?d?s?d +?u?l?d?u?s?d?s?l +?u?l?d?u?s?d?s?u +?u?l?d?u?s?d?s?s +?u?l?d?u?s?l?d?d +?u?l?d?u?s?l?d?l +?u?l?d?u?s?l?d?u +?u?l?d?u?s?l?d?s +?u?l?d?u?s?l?l?d +?u?l?d?u?s?l?l?l +?u?l?d?u?s?l?l?u +?u?l?d?u?s?l?l?s +?u?l?d?u?s?l?u?d +?u?l?d?u?s?l?u?l +?u?l?d?u?s?l?u?u +?u?l?d?u?s?l?u?s +?u?l?d?u?s?l?s?d +?u?l?d?u?s?l?s?l +?u?l?d?u?s?l?s?u +?u?l?d?u?s?l?s?s +?u?l?d?u?s?u?d?d +?u?l?d?u?s?u?d?l +?u?l?d?u?s?u?d?u +?u?l?d?u?s?u?d?s +?u?l?d?u?s?u?l?d +?u?l?d?u?s?u?l?l +?u?l?d?u?s?u?l?u +?u?l?d?u?s?u?l?s +?u?l?d?u?s?u?u?d +?u?l?d?u?s?u?u?l +?u?l?d?u?s?u?u?u +?u?l?d?u?s?u?u?s +?u?l?d?u?s?u?s?d +?u?l?d?u?s?u?s?l +?u?l?d?u?s?u?s?u +?u?l?d?u?s?u?s?s +?u?l?d?u?s?s?d?d +?u?l?d?u?s?s?d?l +?u?l?d?u?s?s?d?u +?u?l?d?u?s?s?d?s +?u?l?d?u?s?s?l?d +?u?l?d?u?s?s?l?l +?u?l?d?u?s?s?l?u +?u?l?d?u?s?s?l?s +?u?l?d?u?s?s?u?d +?u?l?d?u?s?s?u?l +?u?l?d?u?s?s?u?u +?u?l?d?u?s?s?u?s +?u?l?d?u?s?s?s?d +?u?l?d?u?s?s?s?l +?u?l?d?u?s?s?s?u +?u?l?d?u?s?s?s?s +?u?l?d?s?d?d?d?d +?u?l?d?s?d?d?d?l +?u?l?d?s?d?d?d?u +?u?l?d?s?d?d?d?s +?u?l?d?s?d?d?l?d +?u?l?d?s?d?d?l?l +?u?l?d?s?d?d?l?u +?u?l?d?s?d?d?l?s +?u?l?d?s?d?d?u?d +?u?l?d?s?d?d?u?l +?u?l?d?s?d?d?u?u +?u?l?d?s?d?d?u?s +?u?l?d?s?d?d?s?d +?u?l?d?s?d?d?s?l +?u?l?d?s?d?d?s?u +?u?l?d?s?d?d?s?s +?u?l?d?s?d?l?d?d +?u?l?d?s?d?l?d?l +?u?l?d?s?d?l?d?u +?u?l?d?s?d?l?d?s +?u?l?d?s?d?l?l?d +?u?l?d?s?d?l?l?l +?u?l?d?s?d?l?l?u +?u?l?d?s?d?l?l?s +?u?l?d?s?d?l?u?d +?u?l?d?s?d?l?u?l +?u?l?d?s?d?l?u?u +?u?l?d?s?d?l?u?s +?u?l?d?s?d?l?s?d +?u?l?d?s?d?l?s?l +?u?l?d?s?d?l?s?u +?u?l?d?s?d?l?s?s +?u?l?d?s?d?u?d?d +?u?l?d?s?d?u?d?l +?u?l?d?s?d?u?d?u +?u?l?d?s?d?u?d?s +?u?l?d?s?d?u?l?d +?u?l?d?s?d?u?l?l +?u?l?d?s?d?u?l?u +?u?l?d?s?d?u?l?s +?u?l?d?s?d?u?u?d +?u?l?d?s?d?u?u?l +?u?l?d?s?d?u?u?u +?u?l?d?s?d?u?u?s +?u?l?d?s?d?u?s?d +?u?l?d?s?d?u?s?l +?u?l?d?s?d?u?s?u +?u?l?d?s?d?u?s?s +?u?l?d?s?d?s?d?d +?u?l?d?s?d?s?d?l +?u?l?d?s?d?s?d?u +?u?l?d?s?d?s?d?s +?u?l?d?s?d?s?l?d +?u?l?d?s?d?s?l?l +?u?l?d?s?d?s?l?u +?u?l?d?s?d?s?l?s +?u?l?d?s?d?s?u?d +?u?l?d?s?d?s?u?l +?u?l?d?s?d?s?u?u +?u?l?d?s?d?s?u?s +?u?l?d?s?d?s?s?d +?u?l?d?s?d?s?s?l +?u?l?d?s?d?s?s?u +?u?l?d?s?d?s?s?s +?u?l?d?s?l?d?d?d +?u?l?d?s?l?d?d?l +?u?l?d?s?l?d?d?u +?u?l?d?s?l?d?d?s +?u?l?d?s?l?d?l?d +?u?l?d?s?l?d?l?l +?u?l?d?s?l?d?l?u +?u?l?d?s?l?d?l?s +?u?l?d?s?l?d?u?d +?u?l?d?s?l?d?u?l +?u?l?d?s?l?d?u?u +?u?l?d?s?l?d?u?s +?u?l?d?s?l?d?s?d +?u?l?d?s?l?d?s?l +?u?l?d?s?l?d?s?u +?u?l?d?s?l?d?s?s +?u?l?d?s?l?l?d?d +?u?l?d?s?l?l?d?l +?u?l?d?s?l?l?d?u +?u?l?d?s?l?l?d?s +?u?l?d?s?l?l?l?d +?u?l?d?s?l?l?l?l +?u?l?d?s?l?l?l?u +?u?l?d?s?l?l?l?s +?u?l?d?s?l?l?u?d +?u?l?d?s?l?l?u?l +?u?l?d?s?l?l?u?u +?u?l?d?s?l?l?u?s +?u?l?d?s?l?l?s?d +?u?l?d?s?l?l?s?l +?u?l?d?s?l?l?s?u +?u?l?d?s?l?l?s?s +?u?l?d?s?l?u?d?d +?u?l?d?s?l?u?d?l +?u?l?d?s?l?u?d?u +?u?l?d?s?l?u?d?s +?u?l?d?s?l?u?l?d +?u?l?d?s?l?u?l?l +?u?l?d?s?l?u?l?u +?u?l?d?s?l?u?l?s +?u?l?d?s?l?u?u?d +?u?l?d?s?l?u?u?l +?u?l?d?s?l?u?u?u +?u?l?d?s?l?u?u?s +?u?l?d?s?l?u?s?d +?u?l?d?s?l?u?s?l +?u?l?d?s?l?u?s?u +?u?l?d?s?l?u?s?s +?u?l?d?s?l?s?d?d +?u?l?d?s?l?s?d?l +?u?l?d?s?l?s?d?u +?u?l?d?s?l?s?d?s +?u?l?d?s?l?s?l?d +?u?l?d?s?l?s?l?l +?u?l?d?s?l?s?l?u +?u?l?d?s?l?s?l?s +?u?l?d?s?l?s?u?d +?u?l?d?s?l?s?u?l +?u?l?d?s?l?s?u?u +?u?l?d?s?l?s?u?s +?u?l?d?s?l?s?s?d +?u?l?d?s?l?s?s?l +?u?l?d?s?l?s?s?u +?u?l?d?s?l?s?s?s +?u?l?d?s?u?d?d?d +?u?l?d?s?u?d?d?l +?u?l?d?s?u?d?d?u +?u?l?d?s?u?d?d?s +?u?l?d?s?u?d?l?d +?u?l?d?s?u?d?l?l +?u?l?d?s?u?d?l?u +?u?l?d?s?u?d?l?s +?u?l?d?s?u?d?u?d +?u?l?d?s?u?d?u?l +?u?l?d?s?u?d?u?u +?u?l?d?s?u?d?u?s +?u?l?d?s?u?d?s?d +?u?l?d?s?u?d?s?l +?u?l?d?s?u?d?s?u +?u?l?d?s?u?d?s?s +?u?l?d?s?u?l?d?d +?u?l?d?s?u?l?d?l +?u?l?d?s?u?l?d?u +?u?l?d?s?u?l?d?s +?u?l?d?s?u?l?l?d +?u?l?d?s?u?l?l?l +?u?l?d?s?u?l?l?u +?u?l?d?s?u?l?l?s +?u?l?d?s?u?l?u?d +?u?l?d?s?u?l?u?l +?u?l?d?s?u?l?u?u +?u?l?d?s?u?l?u?s +?u?l?d?s?u?l?s?d +?u?l?d?s?u?l?s?l +?u?l?d?s?u?l?s?u +?u?l?d?s?u?l?s?s +?u?l?d?s?u?u?d?d +?u?l?d?s?u?u?d?l +?u?l?d?s?u?u?d?u +?u?l?d?s?u?u?d?s +?u?l?d?s?u?u?l?d +?u?l?d?s?u?u?l?l +?u?l?d?s?u?u?l?u +?u?l?d?s?u?u?l?s +?u?l?d?s?u?u?u?d +?u?l?d?s?u?u?u?l +?u?l?d?s?u?u?u?u +?u?l?d?s?u?u?u?s +?u?l?d?s?u?u?s?d +?u?l?d?s?u?u?s?l +?u?l?d?s?u?u?s?u +?u?l?d?s?u?u?s?s +?u?l?d?s?u?s?d?d +?u?l?d?s?u?s?d?l +?u?l?d?s?u?s?d?u +?u?l?d?s?u?s?d?s +?u?l?d?s?u?s?l?d +?u?l?d?s?u?s?l?l +?u?l?d?s?u?s?l?u +?u?l?d?s?u?s?l?s +?u?l?d?s?u?s?u?d +?u?l?d?s?u?s?u?l +?u?l?d?s?u?s?u?u +?u?l?d?s?u?s?u?s +?u?l?d?s?u?s?s?d +?u?l?d?s?u?s?s?l +?u?l?d?s?u?s?s?u +?u?l?d?s?u?s?s?s +?u?l?d?s?s?d?d?d +?u?l?d?s?s?d?d?l +?u?l?d?s?s?d?d?u +?u?l?d?s?s?d?d?s +?u?l?d?s?s?d?l?d +?u?l?d?s?s?d?l?l +?u?l?d?s?s?d?l?u +?u?l?d?s?s?d?l?s +?u?l?d?s?s?d?u?d +?u?l?d?s?s?d?u?l +?u?l?d?s?s?d?u?u +?u?l?d?s?s?d?u?s +?u?l?d?s?s?d?s?d +?u?l?d?s?s?d?s?l +?u?l?d?s?s?d?s?u +?u?l?d?s?s?d?s?s +?u?l?d?s?s?l?d?d +?u?l?d?s?s?l?d?l +?u?l?d?s?s?l?d?u +?u?l?d?s?s?l?d?s +?u?l?d?s?s?l?l?d +?u?l?d?s?s?l?l?l +?u?l?d?s?s?l?l?u +?u?l?d?s?s?l?l?s +?u?l?d?s?s?l?u?d +?u?l?d?s?s?l?u?l +?u?l?d?s?s?l?u?u +?u?l?d?s?s?l?u?s +?u?l?d?s?s?l?s?d +?u?l?d?s?s?l?s?l +?u?l?d?s?s?l?s?u +?u?l?d?s?s?l?s?s +?u?l?d?s?s?u?d?d +?u?l?d?s?s?u?d?l +?u?l?d?s?s?u?d?u +?u?l?d?s?s?u?d?s +?u?l?d?s?s?u?l?d +?u?l?d?s?s?u?l?l +?u?l?d?s?s?u?l?u +?u?l?d?s?s?u?l?s +?u?l?d?s?s?u?u?d +?u?l?d?s?s?u?u?l +?u?l?d?s?s?u?u?u +?u?l?d?s?s?u?u?s +?u?l?d?s?s?u?s?d +?u?l?d?s?s?u?s?l +?u?l?d?s?s?u?s?u +?u?l?d?s?s?u?s?s +?u?l?d?s?s?s?d?d +?u?l?d?s?s?s?d?l +?u?l?d?s?s?s?d?u +?u?l?d?s?s?s?d?s +?u?l?d?s?s?s?l?d +?u?l?d?s?s?s?l?l +?u?l?d?s?s?s?l?u +?u?l?d?s?s?s?l?s +?u?l?d?s?s?s?u?d +?u?l?d?s?s?s?u?l +?u?l?d?s?s?s?u?u +?u?l?d?s?s?s?u?s +?u?l?d?s?s?s?s?d +?u?l?d?s?s?s?s?l +?u?l?d?s?s?s?s?u +?u?l?d?s?s?s?s?s +?u?l?l?d?d?d?d?s +?u?l?l?d?d?d?l?s +?u?l?l?d?d?d?u?s +?u?l?l?d?d?d?s?d +?u?l?l?d?d?d?s?l +?u?l?l?d?d?d?s?u +?u?l?l?d?d?d?s?s +?u?l?l?d?d?l?d?s +?u?l?l?d?d?l?l?s +?u?l?l?d?d?l?u?s +?u?l?l?d?d?l?s?d +?u?l?l?d?d?l?s?l +?u?l?l?d?d?l?s?u +?u?l?l?d?d?l?s?s +?u?l?l?d?d?u?d?s +?u?l?l?d?d?u?l?s +?u?l?l?d?d?u?u?s +?u?l?l?d?d?u?s?d +?u?l?l?d?d?u?s?l +?u?l?l?d?d?u?s?u +?u?l?l?d?d?u?s?s +?u?l?l?d?d?s?d?d +?u?l?l?d?d?s?d?l +?u?l?l?d?d?s?d?u +?u?l?l?d?d?s?d?s +?u?l?l?d?d?s?l?d +?u?l?l?d?d?s?l?l +?u?l?l?d?d?s?l?u +?u?l?l?d?d?s?l?s +?u?l?l?d?d?s?u?d +?u?l?l?d?d?s?u?l +?u?l?l?d?d?s?u?u +?u?l?l?d?d?s?u?s +?u?l?l?d?d?s?s?d +?u?l?l?d?d?s?s?l +?u?l?l?d?d?s?s?u +?u?l?l?d?d?s?s?s +?u?l?l?d?l?d?d?s +?u?l?l?d?l?d?l?s +?u?l?l?d?l?d?u?s +?u?l?l?d?l?d?s?d +?u?l?l?d?l?d?s?l +?u?l?l?d?l?d?s?u +?u?l?l?d?l?d?s?s +?u?l?l?d?l?l?d?s +?u?l?l?d?l?l?l?s +?u?l?l?d?l?l?u?s +?u?l?l?d?l?l?s?d +?u?l?l?d?l?l?s?l +?u?l?l?d?l?l?s?u +?u?l?l?d?l?l?s?s +?u?l?l?d?l?u?d?s +?u?l?l?d?l?u?l?s +?u?l?l?d?l?u?u?s +?u?l?l?d?l?u?s?d +?u?l?l?d?l?u?s?l +?u?l?l?d?l?u?s?u +?u?l?l?d?l?u?s?s +?u?l?l?d?l?s?d?d +?u?l?l?d?l?s?d?l +?u?l?l?d?l?s?d?u +?u?l?l?d?l?s?d?s +?u?l?l?d?l?s?l?d +?u?l?l?d?l?s?l?l +?u?l?l?d?l?s?l?u +?u?l?l?d?l?s?l?s +?u?l?l?d?l?s?u?d +?u?l?l?d?l?s?u?l +?u?l?l?d?l?s?u?u +?u?l?l?d?l?s?u?s +?u?l?l?d?l?s?s?d +?u?l?l?d?l?s?s?l +?u?l?l?d?l?s?s?u +?u?l?l?d?l?s?s?s +?u?l?l?d?u?d?d?s +?u?l?l?d?u?d?l?s +?u?l?l?d?u?d?u?s +?u?l?l?d?u?d?s?d +?u?l?l?d?u?d?s?l +?u?l?l?d?u?d?s?u +?u?l?l?d?u?d?s?s +?u?l?l?d?u?l?d?s +?u?l?l?d?u?l?l?s +?u?l?l?d?u?l?u?s +?u?l?l?d?u?l?s?d +?u?l?l?d?u?l?s?l +?u?l?l?d?u?l?s?u +?u?l?l?d?u?l?s?s +?u?l?l?d?u?u?d?s +?u?l?l?d?u?u?l?s +?u?l?l?d?u?u?u?s +?u?l?l?d?u?u?s?d +?u?l?l?d?u?u?s?l +?u?l?l?d?u?u?s?u +?u?l?l?d?u?u?s?s +?u?l?l?d?u?s?d?d +?u?l?l?d?u?s?d?l +?u?l?l?d?u?s?d?u +?u?l?l?d?u?s?d?s +?u?l?l?d?u?s?l?d +?u?l?l?d?u?s?l?l +?u?l?l?d?u?s?l?u +?u?l?l?d?u?s?l?s +?u?l?l?d?u?s?u?d +?u?l?l?d?u?s?u?l +?u?l?l?d?u?s?u?u +?u?l?l?d?u?s?u?s +?u?l?l?d?u?s?s?d +?u?l?l?d?u?s?s?l +?u?l?l?d?u?s?s?u +?u?l?l?d?u?s?s?s +?u?l?l?d?s?d?d?d +?u?l?l?d?s?d?d?l +?u?l?l?d?s?d?d?u +?u?l?l?d?s?d?d?s +?u?l?l?d?s?d?l?d +?u?l?l?d?s?d?l?l +?u?l?l?d?s?d?l?u +?u?l?l?d?s?d?l?s +?u?l?l?d?s?d?u?d +?u?l?l?d?s?d?u?l +?u?l?l?d?s?d?u?u +?u?l?l?d?s?d?u?s +?u?l?l?d?s?d?s?d +?u?l?l?d?s?d?s?l +?u?l?l?d?s?d?s?u +?u?l?l?d?s?d?s?s +?u?l?l?d?s?l?d?d +?u?l?l?d?s?l?d?l +?u?l?l?d?s?l?d?u +?u?l?l?d?s?l?d?s +?u?l?l?d?s?l?l?d +?u?l?l?d?s?l?l?l +?u?l?l?d?s?l?l?u +?u?l?l?d?s?l?l?s +?u?l?l?d?s?l?u?d +?u?l?l?d?s?l?u?l +?u?l?l?d?s?l?u?u +?u?l?l?d?s?l?u?s +?u?l?l?d?s?l?s?d +?u?l?l?d?s?l?s?l +?u?l?l?d?s?l?s?u +?u?l?l?d?s?l?s?s +?u?l?l?d?s?u?d?d +?u?l?l?d?s?u?d?l +?u?l?l?d?s?u?d?u +?u?l?l?d?s?u?d?s +?u?l?l?d?s?u?l?d +?u?l?l?d?s?u?l?l +?u?l?l?d?s?u?l?u +?u?l?l?d?s?u?l?s +?u?l?l?d?s?u?u?d +?u?l?l?d?s?u?u?l +?u?l?l?d?s?u?u?u +?u?l?l?d?s?u?u?s +?u?l?l?d?s?u?s?d +?u?l?l?d?s?u?s?l +?u?l?l?d?s?u?s?u +?u?l?l?d?s?u?s?s +?u?l?l?d?s?s?d?d +?u?l?l?d?s?s?d?l +?u?l?l?d?s?s?d?u +?u?l?l?d?s?s?d?s +?u?l?l?d?s?s?l?d +?u?l?l?d?s?s?l?l +?u?l?l?d?s?s?l?u +?u?l?l?d?s?s?l?s +?u?l?l?d?s?s?u?d +?u?l?l?d?s?s?u?l +?u?l?l?d?s?s?u?u +?u?l?l?d?s?s?u?s +?u?l?l?d?s?s?s?d +?u?l?l?d?s?s?s?l +?u?l?l?d?s?s?s?u +?u?l?l?d?s?s?s?s +?u?l?l?l?d?d?d?s +?u?l?l?l?d?d?l?s +?u?l?l?l?d?d?u?s +?u?l?l?l?d?d?s?d +?u?l?l?l?d?d?s?l +?u?l?l?l?d?d?s?u +?u?l?l?l?d?d?s?s +?u?l?l?l?d?l?d?s +?u?l?l?l?d?l?l?s +?u?l?l?l?d?l?u?s +?u?l?l?l?d?l?s?d +?u?l?l?l?d?l?s?l +?u?l?l?l?d?l?s?u +?u?l?l?l?d?l?s?s +?u?l?l?l?d?u?d?s +?u?l?l?l?d?u?l?s +?u?l?l?l?d?u?u?s +?u?l?l?l?d?u?s?d +?u?l?l?l?d?u?s?l +?u?l?l?l?d?u?s?u +?u?l?l?l?d?u?s?s +?u?l?l?l?d?s?d?d +?u?l?l?l?d?s?d?l +?u?l?l?l?d?s?d?u +?u?l?l?l?d?s?d?s +?u?l?l?l?d?s?l?d +?u?l?l?l?d?s?l?l +?u?l?l?l?d?s?l?u +?u?l?l?l?d?s?l?s +?u?l?l?l?d?s?u?d +?u?l?l?l?d?s?u?l +?u?l?l?l?d?s?u?u +?u?l?l?l?d?s?u?s +?u?l?l?l?d?s?s?d +?u?l?l?l?d?s?s?l +?u?l?l?l?d?s?s?u +?u?l?l?l?d?s?s?s +?u?l?l?l?l?d?d?s +?u?l?l?l?l?d?l?s +?u?l?l?l?l?d?u?s +?u?l?l?l?l?d?s?d +?u?l?l?l?l?d?s?l +?u?l?l?l?l?d?s?u +?u?l?l?l?l?d?s?s +?u?l?l?l?l?l?d?s +?u?l?l?l?l?l?s?d +?u?l?l?l?l?u?d?s +?u?l?l?l?l?u?s?d +?u?l?l?l?l?s?d?d +?u?l?l?l?l?s?d?l +?u?l?l?l?l?s?d?u +?u?l?l?l?l?s?d?s +?u?l?l?l?l?s?l?d +?u?l?l?l?l?s?u?d +?u?l?l?l?l?s?s?d +?u?l?l?l?u?d?d?s +?u?l?l?l?u?d?l?s +?u?l?l?l?u?d?u?s +?u?l?l?l?u?d?s?d +?u?l?l?l?u?d?s?l +?u?l?l?l?u?d?s?u +?u?l?l?l?u?d?s?s +?u?l?l?l?u?l?d?s +?u?l?l?l?u?l?s?d +?u?l?l?l?u?u?d?s +?u?l?l?l?u?u?s?d +?u?l?l?l?u?s?d?d +?u?l?l?l?u?s?d?l +?u?l?l?l?u?s?d?u +?u?l?l?l?u?s?d?s +?u?l?l?l?u?s?l?d +?u?l?l?l?u?s?u?d +?u?l?l?l?u?s?s?d +?u?l?l?l?s?d?d?d +?u?l?l?l?s?d?d?l +?u?l?l?l?s?d?d?u +?u?l?l?l?s?d?d?s +?u?l?l?l?s?d?l?d +?u?l?l?l?s?d?l?l +?u?l?l?l?s?d?l?u +?u?l?l?l?s?d?l?s +?u?l?l?l?s?d?u?d +?u?l?l?l?s?d?u?l +?u?l?l?l?s?d?u?u +?u?l?l?l?s?d?u?s +?u?l?l?l?s?d?s?d +?u?l?l?l?s?d?s?l +?u?l?l?l?s?d?s?u +?u?l?l?l?s?d?s?s +?u?l?l?l?s?l?d?d +?u?l?l?l?s?l?d?l +?u?l?l?l?s?l?d?u +?u?l?l?l?s?l?d?s +?u?l?l?l?s?l?l?d +?u?l?l?l?s?l?u?d +?u?l?l?l?s?l?s?d +?u?l?l?l?s?u?d?d +?u?l?l?l?s?u?d?l +?u?l?l?l?s?u?d?u +?u?l?l?l?s?u?d?s +?u?l?l?l?s?u?l?d +?u?l?l?l?s?u?u?d +?u?l?l?l?s?u?s?d +?u?l?l?l?s?s?d?d +?u?l?l?l?s?s?d?l +?u?l?l?l?s?s?d?u +?u?l?l?l?s?s?d?s +?u?l?l?l?s?s?l?d +?u?l?l?l?s?s?u?d +?u?l?l?l?s?s?s?d +?u?l?l?u?d?d?d?s +?u?l?l?u?d?d?l?s +?u?l?l?u?d?d?u?s +?u?l?l?u?d?d?s?d +?u?l?l?u?d?d?s?l +?u?l?l?u?d?d?s?u +?u?l?l?u?d?d?s?s +?u?l?l?u?d?l?d?s +?u?l?l?u?d?l?l?s +?u?l?l?u?d?l?u?s +?u?l?l?u?d?l?s?d +?u?l?l?u?d?l?s?l +?u?l?l?u?d?l?s?u +?u?l?l?u?d?l?s?s +?u?l?l?u?d?u?d?s +?u?l?l?u?d?u?l?s +?u?l?l?u?d?u?u?s +?u?l?l?u?d?u?s?d +?u?l?l?u?d?u?s?l +?u?l?l?u?d?u?s?u +?u?l?l?u?d?u?s?s +?u?l?l?u?d?s?d?d +?u?l?l?u?d?s?d?l +?u?l?l?u?d?s?d?u +?u?l?l?u?d?s?d?s +?u?l?l?u?d?s?l?d +?u?l?l?u?d?s?l?l +?u?l?l?u?d?s?l?u +?u?l?l?u?d?s?l?s +?u?l?l?u?d?s?u?d +?u?l?l?u?d?s?u?l +?u?l?l?u?d?s?u?u +?u?l?l?u?d?s?u?s +?u?l?l?u?d?s?s?d +?u?l?l?u?d?s?s?l +?u?l?l?u?d?s?s?u +?u?l?l?u?d?s?s?s +?u?l?l?u?l?d?d?s +?u?l?l?u?l?d?l?s +?u?l?l?u?l?d?u?s +?u?l?l?u?l?d?s?d +?u?l?l?u?l?d?s?l +?u?l?l?u?l?d?s?u +?u?l?l?u?l?d?s?s +?u?l?l?u?l?l?d?s +?u?l?l?u?l?l?s?d +?u?l?l?u?l?u?d?s +?u?l?l?u?l?u?s?d +?u?l?l?u?l?s?d?d +?u?l?l?u?l?s?d?l +?u?l?l?u?l?s?d?u +?u?l?l?u?l?s?d?s +?u?l?l?u?l?s?l?d +?u?l?l?u?l?s?u?d +?u?l?l?u?l?s?s?d +?u?l?l?u?u?d?d?s +?u?l?l?u?u?d?l?s +?u?l?l?u?u?d?u?s +?u?l?l?u?u?d?s?d +?u?l?l?u?u?d?s?l +?u?l?l?u?u?d?s?u +?u?l?l?u?u?d?s?s +?u?l?l?u?u?l?d?s +?u?l?l?u?u?l?s?d +?u?l?l?u?u?u?d?s +?u?l?l?u?u?u?s?d +?u?l?l?u?u?s?d?d +?u?l?l?u?u?s?d?l +?u?l?l?u?u?s?d?u +?u?l?l?u?u?s?d?s +?u?l?l?u?u?s?l?d +?u?l?l?u?u?s?u?d +?u?l?l?u?u?s?s?d +?u?l?l?u?s?d?d?d +?u?l?l?u?s?d?d?l +?u?l?l?u?s?d?d?u +?u?l?l?u?s?d?d?s +?u?l?l?u?s?d?l?d +?u?l?l?u?s?d?l?l +?u?l?l?u?s?d?l?u +?u?l?l?u?s?d?l?s +?u?l?l?u?s?d?u?d +?u?l?l?u?s?d?u?l +?u?l?l?u?s?d?u?u +?u?l?l?u?s?d?u?s +?u?l?l?u?s?d?s?d +?u?l?l?u?s?d?s?l +?u?l?l?u?s?d?s?u +?u?l?l?u?s?d?s?s +?u?l?l?u?s?l?d?d +?u?l?l?u?s?l?d?l +?u?l?l?u?s?l?d?u +?u?l?l?u?s?l?d?s +?u?l?l?u?s?l?l?d +?u?l?l?u?s?l?u?d +?u?l?l?u?s?l?s?d +?u?l?l?u?s?u?d?d +?u?l?l?u?s?u?d?l +?u?l?l?u?s?u?d?u +?u?l?l?u?s?u?d?s +?u?l?l?u?s?u?l?d +?u?l?l?u?s?u?u?d +?u?l?l?u?s?u?s?d +?u?l?l?u?s?s?d?d +?u?l?l?u?s?s?d?l +?u?l?l?u?s?s?d?u +?u?l?l?u?s?s?d?s +?u?l?l?u?s?s?l?d +?u?l?l?u?s?s?u?d +?u?l?l?u?s?s?s?d +?u?l?l?s?d?d?d?d +?u?l?l?s?d?d?d?l +?u?l?l?s?d?d?d?u +?u?l?l?s?d?d?d?s +?u?l?l?s?d?d?l?d +?u?l?l?s?d?d?l?l +?u?l?l?s?d?d?l?u +?u?l?l?s?d?d?l?s +?u?l?l?s?d?d?u?d +?u?l?l?s?d?d?u?l +?u?l?l?s?d?d?u?u +?u?l?l?s?d?d?u?s +?u?l?l?s?d?d?s?d +?u?l?l?s?d?d?s?l +?u?l?l?s?d?d?s?u +?u?l?l?s?d?d?s?s +?u?l?l?s?d?l?d?d +?u?l?l?s?d?l?d?l +?u?l?l?s?d?l?d?u +?u?l?l?s?d?l?d?s +?u?l?l?s?d?l?l?d +?u?l?l?s?d?l?l?l +?u?l?l?s?d?l?l?u +?u?l?l?s?d?l?l?s +?u?l?l?s?d?l?u?d +?u?l?l?s?d?l?u?l +?u?l?l?s?d?l?u?u +?u?l?l?s?d?l?u?s +?u?l?l?s?d?l?s?d +?u?l?l?s?d?l?s?l +?u?l?l?s?d?l?s?u +?u?l?l?s?d?l?s?s +?u?l?l?s?d?u?d?d +?u?l?l?s?d?u?d?l +?u?l?l?s?d?u?d?u +?u?l?l?s?d?u?d?s +?u?l?l?s?d?u?l?d +?u?l?l?s?d?u?l?l +?u?l?l?s?d?u?l?u +?u?l?l?s?d?u?l?s +?u?l?l?s?d?u?u?d +?u?l?l?s?d?u?u?l +?u?l?l?s?d?u?u?u +?u?l?l?s?d?u?u?s +?u?l?l?s?d?u?s?d +?u?l?l?s?d?u?s?l +?u?l?l?s?d?u?s?u +?u?l?l?s?d?u?s?s +?u?l?l?s?d?s?d?d +?u?l?l?s?d?s?d?l +?u?l?l?s?d?s?d?u +?u?l?l?s?d?s?d?s +?u?l?l?s?d?s?l?d +?u?l?l?s?d?s?l?l +?u?l?l?s?d?s?l?u +?u?l?l?s?d?s?l?s +?u?l?l?s?d?s?u?d +?u?l?l?s?d?s?u?l +?u?l?l?s?d?s?u?u +?u?l?l?s?d?s?u?s +?u?l?l?s?d?s?s?d +?u?l?l?s?d?s?s?l +?u?l?l?s?d?s?s?u +?u?l?l?s?d?s?s?s +?u?l?l?s?l?d?d?d +?u?l?l?s?l?d?d?l +?u?l?l?s?l?d?d?u +?u?l?l?s?l?d?d?s +?u?l?l?s?l?d?l?d +?u?l?l?s?l?d?l?l +?u?l?l?s?l?d?l?u +?u?l?l?s?l?d?l?s +?u?l?l?s?l?d?u?d +?u?l?l?s?l?d?u?l +?u?l?l?s?l?d?u?u +?u?l?l?s?l?d?u?s +?u?l?l?s?l?d?s?d +?u?l?l?s?l?d?s?l +?u?l?l?s?l?d?s?u +?u?l?l?s?l?d?s?s +?u?l?l?s?l?l?d?d +?u?l?l?s?l?l?d?l +?u?l?l?s?l?l?d?u +?u?l?l?s?l?l?d?s +?u?l?l?s?l?l?l?d +?u?l?l?s?l?l?u?d +?u?l?l?s?l?l?s?d +?u?l?l?s?l?u?d?d +?u?l?l?s?l?u?d?l +?u?l?l?s?l?u?d?u +?u?l?l?s?l?u?d?s +?u?l?l?s?l?u?l?d +?u?l?l?s?l?u?u?d +?u?l?l?s?l?u?s?d +?u?l?l?s?l?s?d?d +?u?l?l?s?l?s?d?l +?u?l?l?s?l?s?d?u +?u?l?l?s?l?s?d?s +?u?l?l?s?l?s?l?d +?u?l?l?s?l?s?u?d +?u?l?l?s?l?s?s?d +?u?l?l?s?u?d?d?d +?u?l?l?s?u?d?d?l +?u?l?l?s?u?d?d?u +?u?l?l?s?u?d?d?s +?u?l?l?s?u?d?l?d +?u?l?l?s?u?d?l?l +?u?l?l?s?u?d?l?u +?u?l?l?s?u?d?l?s +?u?l?l?s?u?d?u?d +?u?l?l?s?u?d?u?l +?u?l?l?s?u?d?u?u +?u?l?l?s?u?d?u?s +?u?l?l?s?u?d?s?d +?u?l?l?s?u?d?s?l +?u?l?l?s?u?d?s?u +?u?l?l?s?u?d?s?s +?u?l?l?s?u?l?d?d +?u?l?l?s?u?l?d?l +?u?l?l?s?u?l?d?u +?u?l?l?s?u?l?d?s +?u?l?l?s?u?l?l?d +?u?l?l?s?u?l?u?d +?u?l?l?s?u?l?s?d +?u?l?l?s?u?u?d?d +?u?l?l?s?u?u?d?l +?u?l?l?s?u?u?d?u +?u?l?l?s?u?u?d?s +?u?l?l?s?u?u?l?d +?u?l?l?s?u?u?u?d +?u?l?l?s?u?u?s?d +?u?l?l?s?u?s?d?d +?u?l?l?s?u?s?d?l +?u?l?l?s?u?s?d?u +?u?l?l?s?u?s?d?s +?u?l?l?s?u?s?l?d +?u?l?l?s?u?s?u?d +?u?l?l?s?u?s?s?d +?u?l?l?s?s?d?d?d +?u?l?l?s?s?d?d?l +?u?l?l?s?s?d?d?u +?u?l?l?s?s?d?d?s +?u?l?l?s?s?d?l?d +?u?l?l?s?s?d?l?l +?u?l?l?s?s?d?l?u +?u?l?l?s?s?d?l?s +?u?l?l?s?s?d?u?d +?u?l?l?s?s?d?u?l +?u?l?l?s?s?d?u?u +?u?l?l?s?s?d?u?s +?u?l?l?s?s?d?s?d +?u?l?l?s?s?d?s?l +?u?l?l?s?s?d?s?u +?u?l?l?s?s?d?s?s +?u?l?l?s?s?l?d?d +?u?l?l?s?s?l?d?l +?u?l?l?s?s?l?d?u +?u?l?l?s?s?l?d?s +?u?l?l?s?s?l?l?d +?u?l?l?s?s?l?u?d +?u?l?l?s?s?l?s?d +?u?l?l?s?s?u?d?d +?u?l?l?s?s?u?d?l +?u?l?l?s?s?u?d?u +?u?l?l?s?s?u?d?s +?u?l?l?s?s?u?l?d +?u?l?l?s?s?u?u?d +?u?l?l?s?s?u?s?d +?u?l?l?s?s?s?d?d +?u?l?l?s?s?s?d?l +?u?l?l?s?s?s?d?u +?u?l?l?s?s?s?d?s +?u?l?l?s?s?s?l?d +?u?l?l?s?s?s?u?d +?u?l?l?s?s?s?s?d +?u?l?u?d?d?d?d?s +?u?l?u?d?d?d?l?s +?u?l?u?d?d?d?u?s +?u?l?u?d?d?d?s?d +?u?l?u?d?d?d?s?l +?u?l?u?d?d?d?s?u +?u?l?u?d?d?d?s?s +?u?l?u?d?d?l?d?s +?u?l?u?d?d?l?l?s +?u?l?u?d?d?l?u?s +?u?l?u?d?d?l?s?d +?u?l?u?d?d?l?s?l +?u?l?u?d?d?l?s?u +?u?l?u?d?d?l?s?s +?u?l?u?d?d?u?d?s +?u?l?u?d?d?u?l?s +?u?l?u?d?d?u?u?s +?u?l?u?d?d?u?s?d +?u?l?u?d?d?u?s?l +?u?l?u?d?d?u?s?u +?u?l?u?d?d?u?s?s +?u?l?u?d?d?s?d?d +?u?l?u?d?d?s?d?l +?u?l?u?d?d?s?d?u +?u?l?u?d?d?s?d?s +?u?l?u?d?d?s?l?d +?u?l?u?d?d?s?l?l +?u?l?u?d?d?s?l?u +?u?l?u?d?d?s?l?s +?u?l?u?d?d?s?u?d +?u?l?u?d?d?s?u?l +?u?l?u?d?d?s?u?u +?u?l?u?d?d?s?u?s +?u?l?u?d?d?s?s?d +?u?l?u?d?d?s?s?l +?u?l?u?d?d?s?s?u +?u?l?u?d?d?s?s?s +?u?l?u?d?l?d?d?s +?u?l?u?d?l?d?l?s +?u?l?u?d?l?d?u?s +?u?l?u?d?l?d?s?d +?u?l?u?d?l?d?s?l +?u?l?u?d?l?d?s?u +?u?l?u?d?l?d?s?s +?u?l?u?d?l?l?d?s +?u?l?u?d?l?l?l?s +?u?l?u?d?l?l?u?s +?u?l?u?d?l?l?s?d +?u?l?u?d?l?l?s?l +?u?l?u?d?l?l?s?u +?u?l?u?d?l?l?s?s +?u?l?u?d?l?u?d?s +?u?l?u?d?l?u?l?s +?u?l?u?d?l?u?u?s +?u?l?u?d?l?u?s?d +?u?l?u?d?l?u?s?l +?u?l?u?d?l?u?s?u +?u?l?u?d?l?u?s?s +?u?l?u?d?l?s?d?d +?u?l?u?d?l?s?d?l +?u?l?u?d?l?s?d?u +?u?l?u?d?l?s?d?s +?u?l?u?d?l?s?l?d +?u?l?u?d?l?s?l?l +?u?l?u?d?l?s?l?u +?u?l?u?d?l?s?l?s +?u?l?u?d?l?s?u?d +?u?l?u?d?l?s?u?l +?u?l?u?d?l?s?u?u +?u?l?u?d?l?s?u?s +?u?l?u?d?l?s?s?d +?u?l?u?d?l?s?s?l +?u?l?u?d?l?s?s?u +?u?l?u?d?l?s?s?s +?u?l?u?d?u?d?d?s +?u?l?u?d?u?d?l?s +?u?l?u?d?u?d?u?s +?u?l?u?d?u?d?s?d +?u?l?u?d?u?d?s?l +?u?l?u?d?u?d?s?u +?u?l?u?d?u?d?s?s +?u?l?u?d?u?l?d?s +?u?l?u?d?u?l?l?s +?u?l?u?d?u?l?u?s +?u?l?u?d?u?l?s?d +?u?l?u?d?u?l?s?l +?u?l?u?d?u?l?s?u +?u?l?u?d?u?l?s?s +?u?l?u?d?u?u?d?s +?u?l?u?d?u?u?l?s +?u?l?u?d?u?u?u?s +?u?l?u?d?u?u?s?d +?u?l?u?d?u?u?s?l +?u?l?u?d?u?u?s?u +?u?l?u?d?u?u?s?s +?u?l?u?d?u?s?d?d +?u?l?u?d?u?s?d?l +?u?l?u?d?u?s?d?u +?u?l?u?d?u?s?d?s +?u?l?u?d?u?s?l?d +?u?l?u?d?u?s?l?l +?u?l?u?d?u?s?l?u +?u?l?u?d?u?s?l?s +?u?l?u?d?u?s?u?d +?u?l?u?d?u?s?u?l +?u?l?u?d?u?s?u?u +?u?l?u?d?u?s?u?s +?u?l?u?d?u?s?s?d +?u?l?u?d?u?s?s?l +?u?l?u?d?u?s?s?u +?u?l?u?d?u?s?s?s +?u?l?u?d?s?d?d?d +?u?l?u?d?s?d?d?l +?u?l?u?d?s?d?d?u +?u?l?u?d?s?d?d?s +?u?l?u?d?s?d?l?d +?u?l?u?d?s?d?l?l +?u?l?u?d?s?d?l?u +?u?l?u?d?s?d?l?s +?u?l?u?d?s?d?u?d +?u?l?u?d?s?d?u?l +?u?l?u?d?s?d?u?u +?u?l?u?d?s?d?u?s +?u?l?u?d?s?d?s?d +?u?l?u?d?s?d?s?l +?u?l?u?d?s?d?s?u +?u?l?u?d?s?d?s?s +?u?l?u?d?s?l?d?d +?u?l?u?d?s?l?d?l +?u?l?u?d?s?l?d?u +?u?l?u?d?s?l?d?s +?u?l?u?d?s?l?l?d +?u?l?u?d?s?l?l?l +?u?l?u?d?s?l?l?u +?u?l?u?d?s?l?l?s +?u?l?u?d?s?l?u?d +?u?l?u?d?s?l?u?l +?u?l?u?d?s?l?u?u +?u?l?u?d?s?l?u?s +?u?l?u?d?s?l?s?d +?u?l?u?d?s?l?s?l +?u?l?u?d?s?l?s?u +?u?l?u?d?s?l?s?s +?u?l?u?d?s?u?d?d +?u?l?u?d?s?u?d?l +?u?l?u?d?s?u?d?u +?u?l?u?d?s?u?d?s +?u?l?u?d?s?u?l?d +?u?l?u?d?s?u?l?l +?u?l?u?d?s?u?l?u +?u?l?u?d?s?u?l?s +?u?l?u?d?s?u?u?d +?u?l?u?d?s?u?u?l +?u?l?u?d?s?u?u?u +?u?l?u?d?s?u?u?s +?u?l?u?d?s?u?s?d +?u?l?u?d?s?u?s?l +?u?l?u?d?s?u?s?u +?u?l?u?d?s?u?s?s +?u?l?u?d?s?s?d?d +?u?l?u?d?s?s?d?l +?u?l?u?d?s?s?d?u +?u?l?u?d?s?s?d?s +?u?l?u?d?s?s?l?d +?u?l?u?d?s?s?l?l +?u?l?u?d?s?s?l?u +?u?l?u?d?s?s?l?s +?u?l?u?d?s?s?u?d +?u?l?u?d?s?s?u?l +?u?l?u?d?s?s?u?u +?u?l?u?d?s?s?u?s +?u?l?u?d?s?s?s?d +?u?l?u?d?s?s?s?l +?u?l?u?d?s?s?s?u +?u?l?u?d?s?s?s?s +?u?l?u?l?d?d?d?s +?u?l?u?l?d?d?l?s +?u?l?u?l?d?d?u?s +?u?l?u?l?d?d?s?d +?u?l?u?l?d?d?s?l +?u?l?u?l?d?d?s?u +?u?l?u?l?d?d?s?s +?u?l?u?l?d?l?d?s +?u?l?u?l?d?l?l?s +?u?l?u?l?d?l?u?s +?u?l?u?l?d?l?s?d +?u?l?u?l?d?l?s?l +?u?l?u?l?d?l?s?u +?u?l?u?l?d?l?s?s +?u?l?u?l?d?u?d?s +?u?l?u?l?d?u?l?s +?u?l?u?l?d?u?u?s +?u?l?u?l?d?u?s?d +?u?l?u?l?d?u?s?l +?u?l?u?l?d?u?s?u +?u?l?u?l?d?u?s?s +?u?l?u?l?d?s?d?d +?u?l?u?l?d?s?d?l +?u?l?u?l?d?s?d?u +?u?l?u?l?d?s?d?s +?u?l?u?l?d?s?l?d +?u?l?u?l?d?s?l?l +?u?l?u?l?d?s?l?u +?u?l?u?l?d?s?l?s +?u?l?u?l?d?s?u?d +?u?l?u?l?d?s?u?l +?u?l?u?l?d?s?u?u +?u?l?u?l?d?s?u?s +?u?l?u?l?d?s?s?d +?u?l?u?l?d?s?s?l +?u?l?u?l?d?s?s?u +?u?l?u?l?d?s?s?s +?u?l?u?l?l?d?d?s +?u?l?u?l?l?d?l?s +?u?l?u?l?l?d?u?s +?u?l?u?l?l?d?s?d +?u?l?u?l?l?d?s?l +?u?l?u?l?l?d?s?u +?u?l?u?l?l?d?s?s +?u?l?u?l?l?l?d?s +?u?l?u?l?l?l?s?d +?u?l?u?l?l?u?d?s +?u?l?u?l?l?u?s?d +?u?l?u?l?l?s?d?d +?u?l?u?l?l?s?d?l +?u?l?u?l?l?s?d?u +?u?l?u?l?l?s?d?s +?u?l?u?l?l?s?l?d +?u?l?u?l?l?s?u?d +?u?l?u?l?l?s?s?d +?u?l?u?l?u?d?d?s +?u?l?u?l?u?d?l?s +?u?l?u?l?u?d?u?s +?u?l?u?l?u?d?s?d +?u?l?u?l?u?d?s?l +?u?l?u?l?u?d?s?u +?u?l?u?l?u?d?s?s +?u?l?u?l?u?l?d?s +?u?l?u?l?u?l?s?d +?u?l?u?l?u?u?d?s +?u?l?u?l?u?u?s?d +?u?l?u?l?u?s?d?d +?u?l?u?l?u?s?d?l +?u?l?u?l?u?s?d?u +?u?l?u?l?u?s?d?s +?u?l?u?l?u?s?l?d +?u?l?u?l?u?s?u?d +?u?l?u?l?u?s?s?d +?u?l?u?l?s?d?d?d +?u?l?u?l?s?d?d?l +?u?l?u?l?s?d?d?u +?u?l?u?l?s?d?d?s +?u?l?u?l?s?d?l?d +?u?l?u?l?s?d?l?l +?u?l?u?l?s?d?l?u +?u?l?u?l?s?d?l?s +?u?l?u?l?s?d?u?d +?u?l?u?l?s?d?u?l +?u?l?u?l?s?d?u?u +?u?l?u?l?s?d?u?s +?u?l?u?l?s?d?s?d +?u?l?u?l?s?d?s?l +?u?l?u?l?s?d?s?u +?u?l?u?l?s?d?s?s +?u?l?u?l?s?l?d?d +?u?l?u?l?s?l?d?l +?u?l?u?l?s?l?d?u +?u?l?u?l?s?l?d?s +?u?l?u?l?s?l?l?d +?u?l?u?l?s?l?u?d +?u?l?u?l?s?l?s?d +?u?l?u?l?s?u?d?d +?u?l?u?l?s?u?d?l +?u?l?u?l?s?u?d?u +?u?l?u?l?s?u?d?s +?u?l?u?l?s?u?l?d +?u?l?u?l?s?u?u?d +?u?l?u?l?s?u?s?d +?u?l?u?l?s?s?d?d +?u?l?u?l?s?s?d?l +?u?l?u?l?s?s?d?u +?u?l?u?l?s?s?d?s +?u?l?u?l?s?s?l?d +?u?l?u?l?s?s?u?d +?u?l?u?l?s?s?s?d +?u?l?u?u?d?d?d?s +?u?l?u?u?d?d?l?s +?u?l?u?u?d?d?u?s +?u?l?u?u?d?d?s?d +?u?l?u?u?d?d?s?l +?u?l?u?u?d?d?s?u +?u?l?u?u?d?d?s?s +?u?l?u?u?d?l?d?s +?u?l?u?u?d?l?l?s +?u?l?u?u?d?l?u?s +?u?l?u?u?d?l?s?d +?u?l?u?u?d?l?s?l +?u?l?u?u?d?l?s?u +?u?l?u?u?d?l?s?s +?u?l?u?u?d?u?d?s +?u?l?u?u?d?u?l?s +?u?l?u?u?d?u?u?s +?u?l?u?u?d?u?s?d +?u?l?u?u?d?u?s?l +?u?l?u?u?d?u?s?u +?u?l?u?u?d?u?s?s +?u?l?u?u?d?s?d?d +?u?l?u?u?d?s?d?l +?u?l?u?u?d?s?d?u +?u?l?u?u?d?s?d?s +?u?l?u?u?d?s?l?d +?u?l?u?u?d?s?l?l +?u?l?u?u?d?s?l?u +?u?l?u?u?d?s?l?s +?u?l?u?u?d?s?u?d +?u?l?u?u?d?s?u?l +?u?l?u?u?d?s?u?u +?u?l?u?u?d?s?u?s +?u?l?u?u?d?s?s?d +?u?l?u?u?d?s?s?l +?u?l?u?u?d?s?s?u +?u?l?u?u?d?s?s?s +?u?l?u?u?l?d?d?s +?u?l?u?u?l?d?l?s +?u?l?u?u?l?d?u?s +?u?l?u?u?l?d?s?d +?u?l?u?u?l?d?s?l +?u?l?u?u?l?d?s?u +?u?l?u?u?l?d?s?s +?u?l?u?u?l?l?d?s +?u?l?u?u?l?l?s?d +?u?l?u?u?l?u?d?s +?u?l?u?u?l?u?s?d +?u?l?u?u?l?s?d?d +?u?l?u?u?l?s?d?l +?u?l?u?u?l?s?d?u +?u?l?u?u?l?s?d?s +?u?l?u?u?l?s?l?d +?u?l?u?u?l?s?u?d +?u?l?u?u?l?s?s?d +?u?l?u?u?u?d?d?s +?u?l?u?u?u?d?l?s +?u?l?u?u?u?d?u?s +?u?l?u?u?u?d?s?d +?u?l?u?u?u?d?s?l +?u?l?u?u?u?d?s?u +?u?l?u?u?u?d?s?s +?u?l?u?u?u?l?d?s +?u?l?u?u?u?l?s?d +?u?l?u?u?u?u?d?s +?u?l?u?u?u?u?s?d +?u?l?u?u?u?s?d?d +?u?l?u?u?u?s?d?l +?u?l?u?u?u?s?d?u +?u?l?u?u?u?s?d?s +?u?l?u?u?u?s?l?d +?u?l?u?u?u?s?u?d +?u?l?u?u?u?s?s?d +?u?l?u?u?s?d?d?d +?u?l?u?u?s?d?d?l +?u?l?u?u?s?d?d?u +?u?l?u?u?s?d?d?s +?u?l?u?u?s?d?l?d +?u?l?u?u?s?d?l?l +?u?l?u?u?s?d?l?u +?u?l?u?u?s?d?l?s +?u?l?u?u?s?d?u?d +?u?l?u?u?s?d?u?l +?u?l?u?u?s?d?u?u +?u?l?u?u?s?d?u?s +?u?l?u?u?s?d?s?d +?u?l?u?u?s?d?s?l +?u?l?u?u?s?d?s?u +?u?l?u?u?s?d?s?s +?u?l?u?u?s?l?d?d +?u?l?u?u?s?l?d?l +?u?l?u?u?s?l?d?u +?u?l?u?u?s?l?d?s +?u?l?u?u?s?l?l?d +?u?l?u?u?s?l?u?d +?u?l?u?u?s?l?s?d +?u?l?u?u?s?u?d?d +?u?l?u?u?s?u?d?l +?u?l?u?u?s?u?d?u +?u?l?u?u?s?u?d?s +?u?l?u?u?s?u?l?d +?u?l?u?u?s?u?u?d +?u?l?u?u?s?u?s?d +?u?l?u?u?s?s?d?d +?u?l?u?u?s?s?d?l +?u?l?u?u?s?s?d?u +?u?l?u?u?s?s?d?s +?u?l?u?u?s?s?l?d +?u?l?u?u?s?s?u?d +?u?l?u?u?s?s?s?d +?u?l?u?s?d?d?d?d +?u?l?u?s?d?d?d?l +?u?l?u?s?d?d?d?u +?u?l?u?s?d?d?d?s +?u?l?u?s?d?d?l?d +?u?l?u?s?d?d?l?l +?u?l?u?s?d?d?l?u +?u?l?u?s?d?d?l?s +?u?l?u?s?d?d?u?d +?u?l?u?s?d?d?u?l +?u?l?u?s?d?d?u?u +?u?l?u?s?d?d?u?s +?u?l?u?s?d?d?s?d +?u?l?u?s?d?d?s?l +?u?l?u?s?d?d?s?u +?u?l?u?s?d?d?s?s +?u?l?u?s?d?l?d?d +?u?l?u?s?d?l?d?l +?u?l?u?s?d?l?d?u +?u?l?u?s?d?l?d?s +?u?l?u?s?d?l?l?d +?u?l?u?s?d?l?l?l +?u?l?u?s?d?l?l?u +?u?l?u?s?d?l?l?s +?u?l?u?s?d?l?u?d +?u?l?u?s?d?l?u?l +?u?l?u?s?d?l?u?u +?u?l?u?s?d?l?u?s +?u?l?u?s?d?l?s?d +?u?l?u?s?d?l?s?l +?u?l?u?s?d?l?s?u +?u?l?u?s?d?l?s?s +?u?l?u?s?d?u?d?d +?u?l?u?s?d?u?d?l +?u?l?u?s?d?u?d?u +?u?l?u?s?d?u?d?s +?u?l?u?s?d?u?l?d +?u?l?u?s?d?u?l?l +?u?l?u?s?d?u?l?u +?u?l?u?s?d?u?l?s +?u?l?u?s?d?u?u?d +?u?l?u?s?d?u?u?l +?u?l?u?s?d?u?u?u +?u?l?u?s?d?u?u?s +?u?l?u?s?d?u?s?d +?u?l?u?s?d?u?s?l +?u?l?u?s?d?u?s?u +?u?l?u?s?d?u?s?s +?u?l?u?s?d?s?d?d +?u?l?u?s?d?s?d?l +?u?l?u?s?d?s?d?u +?u?l?u?s?d?s?d?s +?u?l?u?s?d?s?l?d +?u?l?u?s?d?s?l?l +?u?l?u?s?d?s?l?u +?u?l?u?s?d?s?l?s +?u?l?u?s?d?s?u?d +?u?l?u?s?d?s?u?l +?u?l?u?s?d?s?u?u +?u?l?u?s?d?s?u?s +?u?l?u?s?d?s?s?d +?u?l?u?s?d?s?s?l +?u?l?u?s?d?s?s?u +?u?l?u?s?d?s?s?s +?u?l?u?s?l?d?d?d +?u?l?u?s?l?d?d?l +?u?l?u?s?l?d?d?u +?u?l?u?s?l?d?d?s +?u?l?u?s?l?d?l?d +?u?l?u?s?l?d?l?l +?u?l?u?s?l?d?l?u +?u?l?u?s?l?d?l?s +?u?l?u?s?l?d?u?d +?u?l?u?s?l?d?u?l +?u?l?u?s?l?d?u?u +?u?l?u?s?l?d?u?s +?u?l?u?s?l?d?s?d +?u?l?u?s?l?d?s?l +?u?l?u?s?l?d?s?u +?u?l?u?s?l?d?s?s +?u?l?u?s?l?l?d?d +?u?l?u?s?l?l?d?l +?u?l?u?s?l?l?d?u +?u?l?u?s?l?l?d?s +?u?l?u?s?l?l?l?d +?u?l?u?s?l?l?u?d +?u?l?u?s?l?l?s?d +?u?l?u?s?l?u?d?d +?u?l?u?s?l?u?d?l +?u?l?u?s?l?u?d?u +?u?l?u?s?l?u?d?s +?u?l?u?s?l?u?l?d +?u?l?u?s?l?u?u?d +?u?l?u?s?l?u?s?d +?u?l?u?s?l?s?d?d +?u?l?u?s?l?s?d?l +?u?l?u?s?l?s?d?u +?u?l?u?s?l?s?d?s +?u?l?u?s?l?s?l?d +?u?l?u?s?l?s?u?d +?u?l?u?s?l?s?s?d +?u?l?u?s?u?d?d?d +?u?l?u?s?u?d?d?l +?u?l?u?s?u?d?d?u +?u?l?u?s?u?d?d?s +?u?l?u?s?u?d?l?d +?u?l?u?s?u?d?l?l +?u?l?u?s?u?d?l?u +?u?l?u?s?u?d?l?s +?u?l?u?s?u?d?u?d +?u?l?u?s?u?d?u?l +?u?l?u?s?u?d?u?u +?u?l?u?s?u?d?u?s +?u?l?u?s?u?d?s?d +?u?l?u?s?u?d?s?l +?u?l?u?s?u?d?s?u +?u?l?u?s?u?d?s?s +?u?l?u?s?u?l?d?d +?u?l?u?s?u?l?d?l +?u?l?u?s?u?l?d?u +?u?l?u?s?u?l?d?s +?u?l?u?s?u?l?l?d +?u?l?u?s?u?l?u?d +?u?l?u?s?u?l?s?d +?u?l?u?s?u?u?d?d +?u?l?u?s?u?u?d?l +?u?l?u?s?u?u?d?u +?u?l?u?s?u?u?d?s +?u?l?u?s?u?u?l?d +?u?l?u?s?u?u?u?d +?u?l?u?s?u?u?s?d +?u?l?u?s?u?s?d?d +?u?l?u?s?u?s?d?l +?u?l?u?s?u?s?d?u +?u?l?u?s?u?s?d?s +?u?l?u?s?u?s?l?d +?u?l?u?s?u?s?u?d +?u?l?u?s?u?s?s?d +?u?l?u?s?s?d?d?d +?u?l?u?s?s?d?d?l +?u?l?u?s?s?d?d?u +?u?l?u?s?s?d?d?s +?u?l?u?s?s?d?l?d +?u?l?u?s?s?d?l?l +?u?l?u?s?s?d?l?u +?u?l?u?s?s?d?l?s +?u?l?u?s?s?d?u?d +?u?l?u?s?s?d?u?l +?u?l?u?s?s?d?u?u +?u?l?u?s?s?d?u?s +?u?l?u?s?s?d?s?d +?u?l?u?s?s?d?s?l +?u?l?u?s?s?d?s?u +?u?l?u?s?s?d?s?s +?u?l?u?s?s?l?d?d +?u?l?u?s?s?l?d?l +?u?l?u?s?s?l?d?u +?u?l?u?s?s?l?d?s +?u?l?u?s?s?l?l?d +?u?l?u?s?s?l?u?d +?u?l?u?s?s?l?s?d +?u?l?u?s?s?u?d?d +?u?l?u?s?s?u?d?l +?u?l?u?s?s?u?d?u +?u?l?u?s?s?u?d?s +?u?l?u?s?s?u?l?d +?u?l?u?s?s?u?u?d +?u?l?u?s?s?u?s?d +?u?l?u?s?s?s?d?d +?u?l?u?s?s?s?d?l +?u?l?u?s?s?s?d?u +?u?l?u?s?s?s?d?s +?u?l?u?s?s?s?l?d +?u?l?u?s?s?s?u?d +?u?l?u?s?s?s?s?d +?u?l?s?d?d?d?d?d +?u?l?s?d?d?d?d?l +?u?l?s?d?d?d?d?u +?u?l?s?d?d?d?d?s +?u?l?s?d?d?d?l?d +?u?l?s?d?d?d?l?l +?u?l?s?d?d?d?l?u +?u?l?s?d?d?d?l?s +?u?l?s?d?d?d?u?d +?u?l?s?d?d?d?u?l +?u?l?s?d?d?d?u?u +?u?l?s?d?d?d?u?s +?u?l?s?d?d?d?s?d +?u?l?s?d?d?d?s?l +?u?l?s?d?d?d?s?u +?u?l?s?d?d?d?s?s +?u?l?s?d?d?l?d?d +?u?l?s?d?d?l?d?l +?u?l?s?d?d?l?d?u +?u?l?s?d?d?l?d?s +?u?l?s?d?d?l?l?d +?u?l?s?d?d?l?l?l +?u?l?s?d?d?l?l?u +?u?l?s?d?d?l?l?s +?u?l?s?d?d?l?u?d +?u?l?s?d?d?l?u?l +?u?l?s?d?d?l?u?u +?u?l?s?d?d?l?u?s +?u?l?s?d?d?l?s?d +?u?l?s?d?d?l?s?l +?u?l?s?d?d?l?s?u +?u?l?s?d?d?l?s?s +?u?l?s?d?d?u?d?d +?u?l?s?d?d?u?d?l +?u?l?s?d?d?u?d?u +?u?l?s?d?d?u?d?s +?u?l?s?d?d?u?l?d +?u?l?s?d?d?u?l?l +?u?l?s?d?d?u?l?u +?u?l?s?d?d?u?l?s +?u?l?s?d?d?u?u?d +?u?l?s?d?d?u?u?l +?u?l?s?d?d?u?u?u +?u?l?s?d?d?u?u?s +?u?l?s?d?d?u?s?d +?u?l?s?d?d?u?s?l +?u?l?s?d?d?u?s?u +?u?l?s?d?d?u?s?s +?u?l?s?d?d?s?d?d +?u?l?s?d?d?s?d?l +?u?l?s?d?d?s?d?u +?u?l?s?d?d?s?d?s +?u?l?s?d?d?s?l?d +?u?l?s?d?d?s?l?l +?u?l?s?d?d?s?l?u +?u?l?s?d?d?s?l?s +?u?l?s?d?d?s?u?d +?u?l?s?d?d?s?u?l +?u?l?s?d?d?s?u?u +?u?l?s?d?d?s?u?s +?u?l?s?d?d?s?s?d +?u?l?s?d?d?s?s?l +?u?l?s?d?d?s?s?u +?u?l?s?d?d?s?s?s +?u?l?s?d?l?d?d?d +?u?l?s?d?l?d?d?l +?u?l?s?d?l?d?d?u +?u?l?s?d?l?d?d?s +?u?l?s?d?l?d?l?d +?u?l?s?d?l?d?l?l +?u?l?s?d?l?d?l?u +?u?l?s?d?l?d?l?s +?u?l?s?d?l?d?u?d +?u?l?s?d?l?d?u?l +?u?l?s?d?l?d?u?u +?u?l?s?d?l?d?u?s +?u?l?s?d?l?d?s?d +?u?l?s?d?l?d?s?l +?u?l?s?d?l?d?s?u +?u?l?s?d?l?d?s?s +?u?l?s?d?l?l?d?d +?u?l?s?d?l?l?d?l +?u?l?s?d?l?l?d?u +?u?l?s?d?l?l?d?s +?u?l?s?d?l?l?l?d +?u?l?s?d?l?l?l?l +?u?l?s?d?l?l?l?u +?u?l?s?d?l?l?l?s +?u?l?s?d?l?l?u?d +?u?l?s?d?l?l?u?l +?u?l?s?d?l?l?u?u +?u?l?s?d?l?l?u?s +?u?l?s?d?l?l?s?d +?u?l?s?d?l?l?s?l +?u?l?s?d?l?l?s?u +?u?l?s?d?l?l?s?s +?u?l?s?d?l?u?d?d +?u?l?s?d?l?u?d?l +?u?l?s?d?l?u?d?u +?u?l?s?d?l?u?d?s +?u?l?s?d?l?u?l?d +?u?l?s?d?l?u?l?l +?u?l?s?d?l?u?l?u +?u?l?s?d?l?u?l?s +?u?l?s?d?l?u?u?d +?u?l?s?d?l?u?u?l +?u?l?s?d?l?u?u?u +?u?l?s?d?l?u?u?s +?u?l?s?d?l?u?s?d +?u?l?s?d?l?u?s?l +?u?l?s?d?l?u?s?u +?u?l?s?d?l?u?s?s +?u?l?s?d?l?s?d?d +?u?l?s?d?l?s?d?l +?u?l?s?d?l?s?d?u +?u?l?s?d?l?s?d?s +?u?l?s?d?l?s?l?d +?u?l?s?d?l?s?l?l +?u?l?s?d?l?s?l?u +?u?l?s?d?l?s?l?s +?u?l?s?d?l?s?u?d +?u?l?s?d?l?s?u?l +?u?l?s?d?l?s?u?u +?u?l?s?d?l?s?u?s +?u?l?s?d?l?s?s?d +?u?l?s?d?l?s?s?l +?u?l?s?d?l?s?s?u +?u?l?s?d?l?s?s?s +?u?l?s?d?u?d?d?d +?u?l?s?d?u?d?d?l +?u?l?s?d?u?d?d?u +?u?l?s?d?u?d?d?s +?u?l?s?d?u?d?l?d +?u?l?s?d?u?d?l?l +?u?l?s?d?u?d?l?u +?u?l?s?d?u?d?l?s +?u?l?s?d?u?d?u?d +?u?l?s?d?u?d?u?l +?u?l?s?d?u?d?u?u +?u?l?s?d?u?d?u?s +?u?l?s?d?u?d?s?d +?u?l?s?d?u?d?s?l +?u?l?s?d?u?d?s?u +?u?l?s?d?u?d?s?s +?u?l?s?d?u?l?d?d +?u?l?s?d?u?l?d?l +?u?l?s?d?u?l?d?u +?u?l?s?d?u?l?d?s +?u?l?s?d?u?l?l?d +?u?l?s?d?u?l?l?l +?u?l?s?d?u?l?l?u +?u?l?s?d?u?l?l?s +?u?l?s?d?u?l?u?d +?u?l?s?d?u?l?u?l +?u?l?s?d?u?l?u?u +?u?l?s?d?u?l?u?s +?u?l?s?d?u?l?s?d +?u?l?s?d?u?l?s?l +?u?l?s?d?u?l?s?u +?u?l?s?d?u?l?s?s +?u?l?s?d?u?u?d?d +?u?l?s?d?u?u?d?l +?u?l?s?d?u?u?d?u +?u?l?s?d?u?u?d?s +?u?l?s?d?u?u?l?d +?u?l?s?d?u?u?l?l +?u?l?s?d?u?u?l?u +?u?l?s?d?u?u?l?s +?u?l?s?d?u?u?u?d +?u?l?s?d?u?u?u?l +?u?l?s?d?u?u?u?u +?u?l?s?d?u?u?u?s +?u?l?s?d?u?u?s?d +?u?l?s?d?u?u?s?l +?u?l?s?d?u?u?s?u +?u?l?s?d?u?u?s?s +?u?l?s?d?u?s?d?d +?u?l?s?d?u?s?d?l +?u?l?s?d?u?s?d?u +?u?l?s?d?u?s?d?s +?u?l?s?d?u?s?l?d +?u?l?s?d?u?s?l?l +?u?l?s?d?u?s?l?u +?u?l?s?d?u?s?l?s +?u?l?s?d?u?s?u?d +?u?l?s?d?u?s?u?l +?u?l?s?d?u?s?u?u +?u?l?s?d?u?s?u?s +?u?l?s?d?u?s?s?d +?u?l?s?d?u?s?s?l +?u?l?s?d?u?s?s?u +?u?l?s?d?u?s?s?s +?u?l?s?d?s?d?d?d +?u?l?s?d?s?d?d?l +?u?l?s?d?s?d?d?u +?u?l?s?d?s?d?d?s +?u?l?s?d?s?d?l?d +?u?l?s?d?s?d?l?l +?u?l?s?d?s?d?l?u +?u?l?s?d?s?d?l?s +?u?l?s?d?s?d?u?d +?u?l?s?d?s?d?u?l +?u?l?s?d?s?d?u?u +?u?l?s?d?s?d?u?s +?u?l?s?d?s?d?s?d +?u?l?s?d?s?d?s?l +?u?l?s?d?s?d?s?u +?u?l?s?d?s?d?s?s +?u?l?s?d?s?l?d?d +?u?l?s?d?s?l?d?l +?u?l?s?d?s?l?d?u +?u?l?s?d?s?l?d?s +?u?l?s?d?s?l?l?d +?u?l?s?d?s?l?l?l +?u?l?s?d?s?l?l?u +?u?l?s?d?s?l?l?s +?u?l?s?d?s?l?u?d +?u?l?s?d?s?l?u?l +?u?l?s?d?s?l?u?u +?u?l?s?d?s?l?u?s +?u?l?s?d?s?l?s?d +?u?l?s?d?s?l?s?l +?u?l?s?d?s?l?s?u +?u?l?s?d?s?l?s?s +?u?l?s?d?s?u?d?d +?u?l?s?d?s?u?d?l +?u?l?s?d?s?u?d?u +?u?l?s?d?s?u?d?s +?u?l?s?d?s?u?l?d +?u?l?s?d?s?u?l?l +?u?l?s?d?s?u?l?u +?u?l?s?d?s?u?l?s +?u?l?s?d?s?u?u?d +?u?l?s?d?s?u?u?l +?u?l?s?d?s?u?u?u +?u?l?s?d?s?u?u?s +?u?l?s?d?s?u?s?d +?u?l?s?d?s?u?s?l +?u?l?s?d?s?u?s?u +?u?l?s?d?s?u?s?s +?u?l?s?d?s?s?d?d +?u?l?s?d?s?s?d?l +?u?l?s?d?s?s?d?u +?u?l?s?d?s?s?d?s +?u?l?s?d?s?s?l?d +?u?l?s?d?s?s?l?l +?u?l?s?d?s?s?l?u +?u?l?s?d?s?s?l?s +?u?l?s?d?s?s?u?d +?u?l?s?d?s?s?u?l +?u?l?s?d?s?s?u?u +?u?l?s?d?s?s?u?s +?u?l?s?d?s?s?s?d +?u?l?s?d?s?s?s?l +?u?l?s?d?s?s?s?u +?u?l?s?d?s?s?s?s +?u?l?s?l?d?d?d?d +?u?l?s?l?d?d?d?l +?u?l?s?l?d?d?d?u +?u?l?s?l?d?d?d?s +?u?l?s?l?d?d?l?d +?u?l?s?l?d?d?l?l +?u?l?s?l?d?d?l?u +?u?l?s?l?d?d?l?s +?u?l?s?l?d?d?u?d +?u?l?s?l?d?d?u?l +?u?l?s?l?d?d?u?u +?u?l?s?l?d?d?u?s +?u?l?s?l?d?d?s?d +?u?l?s?l?d?d?s?l +?u?l?s?l?d?d?s?u +?u?l?s?l?d?d?s?s +?u?l?s?l?d?l?d?d +?u?l?s?l?d?l?d?l +?u?l?s?l?d?l?d?u +?u?l?s?l?d?l?d?s +?u?l?s?l?d?l?l?d +?u?l?s?l?d?l?l?l +?u?l?s?l?d?l?l?u +?u?l?s?l?d?l?l?s +?u?l?s?l?d?l?u?d +?u?l?s?l?d?l?u?l +?u?l?s?l?d?l?u?u +?u?l?s?l?d?l?u?s +?u?l?s?l?d?l?s?d +?u?l?s?l?d?l?s?l +?u?l?s?l?d?l?s?u +?u?l?s?l?d?l?s?s +?u?l?s?l?d?u?d?d +?u?l?s?l?d?u?d?l +?u?l?s?l?d?u?d?u +?u?l?s?l?d?u?d?s +?u?l?s?l?d?u?l?d +?u?l?s?l?d?u?l?l +?u?l?s?l?d?u?l?u +?u?l?s?l?d?u?l?s +?u?l?s?l?d?u?u?d +?u?l?s?l?d?u?u?l +?u?l?s?l?d?u?u?u +?u?l?s?l?d?u?u?s +?u?l?s?l?d?u?s?d +?u?l?s?l?d?u?s?l +?u?l?s?l?d?u?s?u +?u?l?s?l?d?u?s?s +?u?l?s?l?d?s?d?d +?u?l?s?l?d?s?d?l +?u?l?s?l?d?s?d?u +?u?l?s?l?d?s?d?s +?u?l?s?l?d?s?l?d +?u?l?s?l?d?s?l?l +?u?l?s?l?d?s?l?u +?u?l?s?l?d?s?l?s +?u?l?s?l?d?s?u?d +?u?l?s?l?d?s?u?l +?u?l?s?l?d?s?u?u +?u?l?s?l?d?s?u?s +?u?l?s?l?d?s?s?d +?u?l?s?l?d?s?s?l +?u?l?s?l?d?s?s?u +?u?l?s?l?d?s?s?s +?u?l?s?l?l?d?d?d +?u?l?s?l?l?d?d?l +?u?l?s?l?l?d?d?u +?u?l?s?l?l?d?d?s +?u?l?s?l?l?d?l?d +?u?l?s?l?l?d?l?l +?u?l?s?l?l?d?l?u +?u?l?s?l?l?d?l?s +?u?l?s?l?l?d?u?d +?u?l?s?l?l?d?u?l +?u?l?s?l?l?d?u?u +?u?l?s?l?l?d?u?s +?u?l?s?l?l?d?s?d +?u?l?s?l?l?d?s?l +?u?l?s?l?l?d?s?u +?u?l?s?l?l?d?s?s +?u?l?s?l?l?l?d?d +?u?l?s?l?l?l?d?l +?u?l?s?l?l?l?d?u +?u?l?s?l?l?l?d?s +?u?l?s?l?l?l?l?d +?u?l?s?l?l?l?u?d +?u?l?s?l?l?l?s?d +?u?l?s?l?l?u?d?d +?u?l?s?l?l?u?d?l +?u?l?s?l?l?u?d?u +?u?l?s?l?l?u?d?s +?u?l?s?l?l?u?l?d +?u?l?s?l?l?u?u?d +?u?l?s?l?l?u?s?d +?u?l?s?l?l?s?d?d +?u?l?s?l?l?s?d?l +?u?l?s?l?l?s?d?u +?u?l?s?l?l?s?d?s +?u?l?s?l?l?s?l?d +?u?l?s?l?l?s?u?d +?u?l?s?l?l?s?s?d +?u?l?s?l?u?d?d?d +?u?l?s?l?u?d?d?l +?u?l?s?l?u?d?d?u +?u?l?s?l?u?d?d?s +?u?l?s?l?u?d?l?d +?u?l?s?l?u?d?l?l +?u?l?s?l?u?d?l?u +?u?l?s?l?u?d?l?s +?u?l?s?l?u?d?u?d +?u?l?s?l?u?d?u?l +?u?l?s?l?u?d?u?u +?u?l?s?l?u?d?u?s +?u?l?s?l?u?d?s?d +?u?l?s?l?u?d?s?l +?u?l?s?l?u?d?s?u +?u?l?s?l?u?d?s?s +?u?l?s?l?u?l?d?d +?u?l?s?l?u?l?d?l +?u?l?s?l?u?l?d?u +?u?l?s?l?u?l?d?s +?u?l?s?l?u?l?l?d +?u?l?s?l?u?l?u?d +?u?l?s?l?u?l?s?d +?u?l?s?l?u?u?d?d +?u?l?s?l?u?u?d?l +?u?l?s?l?u?u?d?u +?u?l?s?l?u?u?d?s +?u?l?s?l?u?u?l?d +?u?l?s?l?u?u?u?d +?u?l?s?l?u?u?s?d +?u?l?s?l?u?s?d?d +?u?l?s?l?u?s?d?l +?u?l?s?l?u?s?d?u +?u?l?s?l?u?s?d?s +?u?l?s?l?u?s?l?d +?u?l?s?l?u?s?u?d +?u?l?s?l?u?s?s?d +?u?l?s?l?s?d?d?d +?u?l?s?l?s?d?d?l +?u?l?s?l?s?d?d?u +?u?l?s?l?s?d?d?s +?u?l?s?l?s?d?l?d +?u?l?s?l?s?d?l?l +?u?l?s?l?s?d?l?u +?u?l?s?l?s?d?l?s +?u?l?s?l?s?d?u?d +?u?l?s?l?s?d?u?l +?u?l?s?l?s?d?u?u +?u?l?s?l?s?d?u?s +?u?l?s?l?s?d?s?d +?u?l?s?l?s?d?s?l +?u?l?s?l?s?d?s?u +?u?l?s?l?s?d?s?s +?u?l?s?l?s?l?d?d +?u?l?s?l?s?l?d?l +?u?l?s?l?s?l?d?u +?u?l?s?l?s?l?d?s +?u?l?s?l?s?l?l?d +?u?l?s?l?s?l?u?d +?u?l?s?l?s?l?s?d +?u?l?s?l?s?u?d?d +?u?l?s?l?s?u?d?l +?u?l?s?l?s?u?d?u +?u?l?s?l?s?u?d?s +?u?l?s?l?s?u?l?d +?u?l?s?l?s?u?u?d +?u?l?s?l?s?u?s?d +?u?l?s?l?s?s?d?d +?u?l?s?l?s?s?d?l +?u?l?s?l?s?s?d?u +?u?l?s?l?s?s?d?s +?u?l?s?l?s?s?l?d +?u?l?s?l?s?s?u?d +?u?l?s?l?s?s?s?d +?u?l?s?u?d?d?d?d +?u?l?s?u?d?d?d?l +?u?l?s?u?d?d?d?u +?u?l?s?u?d?d?d?s +?u?l?s?u?d?d?l?d +?u?l?s?u?d?d?l?l +?u?l?s?u?d?d?l?u +?u?l?s?u?d?d?l?s +?u?l?s?u?d?d?u?d +?u?l?s?u?d?d?u?l +?u?l?s?u?d?d?u?u +?u?l?s?u?d?d?u?s +?u?l?s?u?d?d?s?d +?u?l?s?u?d?d?s?l +?u?l?s?u?d?d?s?u +?u?l?s?u?d?d?s?s +?u?l?s?u?d?l?d?d +?u?l?s?u?d?l?d?l +?u?l?s?u?d?l?d?u +?u?l?s?u?d?l?d?s +?u?l?s?u?d?l?l?d +?u?l?s?u?d?l?l?l +?u?l?s?u?d?l?l?u +?u?l?s?u?d?l?l?s +?u?l?s?u?d?l?u?d +?u?l?s?u?d?l?u?l +?u?l?s?u?d?l?u?u +?u?l?s?u?d?l?u?s +?u?l?s?u?d?l?s?d +?u?l?s?u?d?l?s?l +?u?l?s?u?d?l?s?u +?u?l?s?u?d?l?s?s +?u?l?s?u?d?u?d?d +?u?l?s?u?d?u?d?l +?u?l?s?u?d?u?d?u +?u?l?s?u?d?u?d?s +?u?l?s?u?d?u?l?d +?u?l?s?u?d?u?l?l +?u?l?s?u?d?u?l?u +?u?l?s?u?d?u?l?s +?u?l?s?u?d?u?u?d +?u?l?s?u?d?u?u?l +?u?l?s?u?d?u?u?u +?u?l?s?u?d?u?u?s +?u?l?s?u?d?u?s?d +?u?l?s?u?d?u?s?l +?u?l?s?u?d?u?s?u +?u?l?s?u?d?u?s?s +?u?l?s?u?d?s?d?d +?u?l?s?u?d?s?d?l +?u?l?s?u?d?s?d?u +?u?l?s?u?d?s?d?s +?u?l?s?u?d?s?l?d +?u?l?s?u?d?s?l?l +?u?l?s?u?d?s?l?u +?u?l?s?u?d?s?l?s +?u?l?s?u?d?s?u?d +?u?l?s?u?d?s?u?l +?u?l?s?u?d?s?u?u +?u?l?s?u?d?s?u?s +?u?l?s?u?d?s?s?d +?u?l?s?u?d?s?s?l +?u?l?s?u?d?s?s?u +?u?l?s?u?d?s?s?s +?u?l?s?u?l?d?d?d +?u?l?s?u?l?d?d?l +?u?l?s?u?l?d?d?u +?u?l?s?u?l?d?d?s +?u?l?s?u?l?d?l?d +?u?l?s?u?l?d?l?l +?u?l?s?u?l?d?l?u +?u?l?s?u?l?d?l?s +?u?l?s?u?l?d?u?d +?u?l?s?u?l?d?u?l +?u?l?s?u?l?d?u?u +?u?l?s?u?l?d?u?s +?u?l?s?u?l?d?s?d +?u?l?s?u?l?d?s?l +?u?l?s?u?l?d?s?u +?u?l?s?u?l?d?s?s +?u?l?s?u?l?l?d?d +?u?l?s?u?l?l?d?l +?u?l?s?u?l?l?d?u +?u?l?s?u?l?l?d?s +?u?l?s?u?l?l?l?d +?u?l?s?u?l?l?u?d +?u?l?s?u?l?l?s?d +?u?l?s?u?l?u?d?d +?u?l?s?u?l?u?d?l +?u?l?s?u?l?u?d?u +?u?l?s?u?l?u?d?s +?u?l?s?u?l?u?l?d +?u?l?s?u?l?u?u?d +?u?l?s?u?l?u?s?d +?u?l?s?u?l?s?d?d +?u?l?s?u?l?s?d?l +?u?l?s?u?l?s?d?u +?u?l?s?u?l?s?d?s +?u?l?s?u?l?s?l?d +?u?l?s?u?l?s?u?d +?u?l?s?u?l?s?s?d +?u?l?s?u?u?d?d?d +?u?l?s?u?u?d?d?l +?u?l?s?u?u?d?d?u +?u?l?s?u?u?d?d?s +?u?l?s?u?u?d?l?d +?u?l?s?u?u?d?l?l +?u?l?s?u?u?d?l?u +?u?l?s?u?u?d?l?s +?u?l?s?u?u?d?u?d +?u?l?s?u?u?d?u?l +?u?l?s?u?u?d?u?u +?u?l?s?u?u?d?u?s +?u?l?s?u?u?d?s?d +?u?l?s?u?u?d?s?l +?u?l?s?u?u?d?s?u +?u?l?s?u?u?d?s?s +?u?l?s?u?u?l?d?d +?u?l?s?u?u?l?d?l +?u?l?s?u?u?l?d?u +?u?l?s?u?u?l?d?s +?u?l?s?u?u?l?l?d +?u?l?s?u?u?l?u?d +?u?l?s?u?u?l?s?d +?u?l?s?u?u?u?d?d +?u?l?s?u?u?u?d?l +?u?l?s?u?u?u?d?u +?u?l?s?u?u?u?d?s +?u?l?s?u?u?u?l?d +?u?l?s?u?u?u?u?d +?u?l?s?u?u?u?s?d +?u?l?s?u?u?s?d?d +?u?l?s?u?u?s?d?l +?u?l?s?u?u?s?d?u +?u?l?s?u?u?s?d?s +?u?l?s?u?u?s?l?d +?u?l?s?u?u?s?u?d +?u?l?s?u?u?s?s?d +?u?l?s?u?s?d?d?d +?u?l?s?u?s?d?d?l +?u?l?s?u?s?d?d?u +?u?l?s?u?s?d?d?s +?u?l?s?u?s?d?l?d +?u?l?s?u?s?d?l?l +?u?l?s?u?s?d?l?u +?u?l?s?u?s?d?l?s +?u?l?s?u?s?d?u?d +?u?l?s?u?s?d?u?l +?u?l?s?u?s?d?u?u +?u?l?s?u?s?d?u?s +?u?l?s?u?s?d?s?d +?u?l?s?u?s?d?s?l +?u?l?s?u?s?d?s?u +?u?l?s?u?s?d?s?s +?u?l?s?u?s?l?d?d +?u?l?s?u?s?l?d?l +?u?l?s?u?s?l?d?u +?u?l?s?u?s?l?d?s +?u?l?s?u?s?l?l?d +?u?l?s?u?s?l?u?d +?u?l?s?u?s?l?s?d +?u?l?s?u?s?u?d?d +?u?l?s?u?s?u?d?l +?u?l?s?u?s?u?d?u +?u?l?s?u?s?u?d?s +?u?l?s?u?s?u?l?d +?u?l?s?u?s?u?u?d +?u?l?s?u?s?u?s?d +?u?l?s?u?s?s?d?d +?u?l?s?u?s?s?d?l +?u?l?s?u?s?s?d?u +?u?l?s?u?s?s?d?s +?u?l?s?u?s?s?l?d +?u?l?s?u?s?s?u?d +?u?l?s?u?s?s?s?d +?u?l?s?s?d?d?d?d +?u?l?s?s?d?d?d?l +?u?l?s?s?d?d?d?u +?u?l?s?s?d?d?d?s +?u?l?s?s?d?d?l?d +?u?l?s?s?d?d?l?l +?u?l?s?s?d?d?l?u +?u?l?s?s?d?d?l?s +?u?l?s?s?d?d?u?d +?u?l?s?s?d?d?u?l +?u?l?s?s?d?d?u?u +?u?l?s?s?d?d?u?s +?u?l?s?s?d?d?s?d +?u?l?s?s?d?d?s?l +?u?l?s?s?d?d?s?u +?u?l?s?s?d?d?s?s +?u?l?s?s?d?l?d?d +?u?l?s?s?d?l?d?l +?u?l?s?s?d?l?d?u +?u?l?s?s?d?l?d?s +?u?l?s?s?d?l?l?d +?u?l?s?s?d?l?l?l +?u?l?s?s?d?l?l?u +?u?l?s?s?d?l?l?s +?u?l?s?s?d?l?u?d +?u?l?s?s?d?l?u?l +?u?l?s?s?d?l?u?u +?u?l?s?s?d?l?u?s +?u?l?s?s?d?l?s?d +?u?l?s?s?d?l?s?l +?u?l?s?s?d?l?s?u +?u?l?s?s?d?l?s?s +?u?l?s?s?d?u?d?d +?u?l?s?s?d?u?d?l +?u?l?s?s?d?u?d?u +?u?l?s?s?d?u?d?s +?u?l?s?s?d?u?l?d +?u?l?s?s?d?u?l?l +?u?l?s?s?d?u?l?u +?u?l?s?s?d?u?l?s +?u?l?s?s?d?u?u?d +?u?l?s?s?d?u?u?l +?u?l?s?s?d?u?u?u +?u?l?s?s?d?u?u?s +?u?l?s?s?d?u?s?d +?u?l?s?s?d?u?s?l +?u?l?s?s?d?u?s?u +?u?l?s?s?d?u?s?s +?u?l?s?s?d?s?d?d +?u?l?s?s?d?s?d?l +?u?l?s?s?d?s?d?u +?u?l?s?s?d?s?d?s +?u?l?s?s?d?s?l?d +?u?l?s?s?d?s?l?l +?u?l?s?s?d?s?l?u +?u?l?s?s?d?s?l?s +?u?l?s?s?d?s?u?d +?u?l?s?s?d?s?u?l +?u?l?s?s?d?s?u?u +?u?l?s?s?d?s?u?s +?u?l?s?s?d?s?s?d +?u?l?s?s?d?s?s?l +?u?l?s?s?d?s?s?u +?u?l?s?s?d?s?s?s +?u?l?s?s?l?d?d?d +?u?l?s?s?l?d?d?l +?u?l?s?s?l?d?d?u +?u?l?s?s?l?d?d?s +?u?l?s?s?l?d?l?d +?u?l?s?s?l?d?l?l +?u?l?s?s?l?d?l?u +?u?l?s?s?l?d?l?s +?u?l?s?s?l?d?u?d +?u?l?s?s?l?d?u?l +?u?l?s?s?l?d?u?u +?u?l?s?s?l?d?u?s +?u?l?s?s?l?d?s?d +?u?l?s?s?l?d?s?l +?u?l?s?s?l?d?s?u +?u?l?s?s?l?d?s?s +?u?l?s?s?l?l?d?d +?u?l?s?s?l?l?d?l +?u?l?s?s?l?l?d?u +?u?l?s?s?l?l?d?s +?u?l?s?s?l?l?l?d +?u?l?s?s?l?l?u?d +?u?l?s?s?l?l?s?d +?u?l?s?s?l?u?d?d +?u?l?s?s?l?u?d?l +?u?l?s?s?l?u?d?u +?u?l?s?s?l?u?d?s +?u?l?s?s?l?u?l?d +?u?l?s?s?l?u?u?d +?u?l?s?s?l?u?s?d +?u?l?s?s?l?s?d?d +?u?l?s?s?l?s?d?l +?u?l?s?s?l?s?d?u +?u?l?s?s?l?s?d?s +?u?l?s?s?l?s?l?d +?u?l?s?s?l?s?u?d +?u?l?s?s?l?s?s?d +?u?l?s?s?u?d?d?d +?u?l?s?s?u?d?d?l +?u?l?s?s?u?d?d?u +?u?l?s?s?u?d?d?s +?u?l?s?s?u?d?l?d +?u?l?s?s?u?d?l?l +?u?l?s?s?u?d?l?u +?u?l?s?s?u?d?l?s +?u?l?s?s?u?d?u?d +?u?l?s?s?u?d?u?l +?u?l?s?s?u?d?u?u +?u?l?s?s?u?d?u?s +?u?l?s?s?u?d?s?d +?u?l?s?s?u?d?s?l +?u?l?s?s?u?d?s?u +?u?l?s?s?u?d?s?s +?u?l?s?s?u?l?d?d +?u?l?s?s?u?l?d?l +?u?l?s?s?u?l?d?u +?u?l?s?s?u?l?d?s +?u?l?s?s?u?l?l?d +?u?l?s?s?u?l?u?d +?u?l?s?s?u?l?s?d +?u?l?s?s?u?u?d?d +?u?l?s?s?u?u?d?l +?u?l?s?s?u?u?d?u +?u?l?s?s?u?u?d?s +?u?l?s?s?u?u?l?d +?u?l?s?s?u?u?u?d +?u?l?s?s?u?u?s?d +?u?l?s?s?u?s?d?d +?u?l?s?s?u?s?d?l +?u?l?s?s?u?s?d?u +?u?l?s?s?u?s?d?s +?u?l?s?s?u?s?l?d +?u?l?s?s?u?s?u?d +?u?l?s?s?u?s?s?d +?u?l?s?s?s?d?d?d +?u?l?s?s?s?d?d?l +?u?l?s?s?s?d?d?u +?u?l?s?s?s?d?d?s +?u?l?s?s?s?d?l?d +?u?l?s?s?s?d?l?l +?u?l?s?s?s?d?l?u +?u?l?s?s?s?d?l?s +?u?l?s?s?s?d?u?d +?u?l?s?s?s?d?u?l +?u?l?s?s?s?d?u?u +?u?l?s?s?s?d?u?s +?u?l?s?s?s?d?s?d +?u?l?s?s?s?d?s?l +?u?l?s?s?s?d?s?u +?u?l?s?s?s?d?s?s +?u?l?s?s?s?l?d?d +?u?l?s?s?s?l?d?l +?u?l?s?s?s?l?d?u +?u?l?s?s?s?l?d?s +?u?l?s?s?s?l?l?d +?u?l?s?s?s?l?u?d +?u?l?s?s?s?l?s?d +?u?l?s?s?s?u?d?d +?u?l?s?s?s?u?d?l +?u?l?s?s?s?u?d?u +?u?l?s?s?s?u?d?s +?u?l?s?s?s?u?l?d +?u?l?s?s?s?u?u?d +?u?l?s?s?s?u?s?d +?u?l?s?s?s?s?d?d +?u?l?s?s?s?s?d?l +?u?l?s?s?s?s?d?u +?u?l?s?s?s?s?d?s +?u?l?s?s?s?s?l?d +?u?l?s?s?s?s?u?d +?u?l?s?s?s?s?s?d +?u?u?d?d?d?d?l?s +?u?u?d?d?d?d?s?l +?u?u?d?d?d?l?d?s +?u?u?d?d?d?l?l?s +?u?u?d?d?d?l?u?s +?u?u?d?d?d?l?s?d +?u?u?d?d?d?l?s?l +?u?u?d?d?d?l?s?u +?u?u?d?d?d?l?s?s +?u?u?d?d?d?u?l?s +?u?u?d?d?d?u?s?l +?u?u?d?d?d?s?d?l +?u?u?d?d?d?s?l?d +?u?u?d?d?d?s?l?l +?u?u?d?d?d?s?l?u +?u?u?d?d?d?s?l?s +?u?u?d?d?d?s?u?l +?u?u?d?d?d?s?s?l +?u?u?d?d?l?d?d?s +?u?u?d?d?l?d?l?s +?u?u?d?d?l?d?u?s +?u?u?d?d?l?d?s?d +?u?u?d?d?l?d?s?l +?u?u?d?d?l?d?s?u +?u?u?d?d?l?d?s?s +?u?u?d?d?l?l?d?s +?u?u?d?d?l?l?l?s +?u?u?d?d?l?l?u?s +?u?u?d?d?l?l?s?d +?u?u?d?d?l?l?s?l +?u?u?d?d?l?l?s?u +?u?u?d?d?l?l?s?s +?u?u?d?d?l?u?d?s +?u?u?d?d?l?u?l?s +?u?u?d?d?l?u?u?s +?u?u?d?d?l?u?s?d +?u?u?d?d?l?u?s?l +?u?u?d?d?l?u?s?u +?u?u?d?d?l?u?s?s +?u?u?d?d?l?s?d?d +?u?u?d?d?l?s?d?l +?u?u?d?d?l?s?d?u +?u?u?d?d?l?s?d?s +?u?u?d?d?l?s?l?d +?u?u?d?d?l?s?l?l +?u?u?d?d?l?s?l?u +?u?u?d?d?l?s?l?s +?u?u?d?d?l?s?u?d +?u?u?d?d?l?s?u?l +?u?u?d?d?l?s?u?u +?u?u?d?d?l?s?u?s +?u?u?d?d?l?s?s?d +?u?u?d?d?l?s?s?l +?u?u?d?d?l?s?s?u +?u?u?d?d?l?s?s?s +?u?u?d?d?u?d?l?s +?u?u?d?d?u?d?s?l +?u?u?d?d?u?l?d?s +?u?u?d?d?u?l?l?s +?u?u?d?d?u?l?u?s +?u?u?d?d?u?l?s?d +?u?u?d?d?u?l?s?l +?u?u?d?d?u?l?s?u +?u?u?d?d?u?l?s?s +?u?u?d?d?u?u?l?s +?u?u?d?d?u?u?s?l +?u?u?d?d?u?s?d?l +?u?u?d?d?u?s?l?d +?u?u?d?d?u?s?l?l +?u?u?d?d?u?s?l?u +?u?u?d?d?u?s?l?s +?u?u?d?d?u?s?u?l +?u?u?d?d?u?s?s?l +?u?u?d?d?s?d?d?l +?u?u?d?d?s?d?l?d +?u?u?d?d?s?d?l?l +?u?u?d?d?s?d?l?u +?u?u?d?d?s?d?l?s +?u?u?d?d?s?d?u?l +?u?u?d?d?s?d?s?l +?u?u?d?d?s?l?d?d +?u?u?d?d?s?l?d?l +?u?u?d?d?s?l?d?u +?u?u?d?d?s?l?d?s +?u?u?d?d?s?l?l?d +?u?u?d?d?s?l?l?l +?u?u?d?d?s?l?l?u +?u?u?d?d?s?l?l?s +?u?u?d?d?s?l?u?d +?u?u?d?d?s?l?u?l +?u?u?d?d?s?l?u?u +?u?u?d?d?s?l?u?s +?u?u?d?d?s?l?s?d +?u?u?d?d?s?l?s?l +?u?u?d?d?s?l?s?u +?u?u?d?d?s?l?s?s +?u?u?d?d?s?u?d?l +?u?u?d?d?s?u?l?d +?u?u?d?d?s?u?l?l +?u?u?d?d?s?u?l?u +?u?u?d?d?s?u?l?s +?u?u?d?d?s?u?u?l +?u?u?d?d?s?u?s?l +?u?u?d?d?s?s?d?l +?u?u?d?d?s?s?l?d +?u?u?d?d?s?s?l?l +?u?u?d?d?s?s?l?u +?u?u?d?d?s?s?l?s +?u?u?d?d?s?s?u?l +?u?u?d?d?s?s?s?l +?u?u?d?l?d?d?d?s +?u?u?d?l?d?d?l?s +?u?u?d?l?d?d?u?s +?u?u?d?l?d?d?s?d +?u?u?d?l?d?d?s?l +?u?u?d?l?d?d?s?u +?u?u?d?l?d?d?s?s +?u?u?d?l?d?l?d?s +?u?u?d?l?d?l?l?s +?u?u?d?l?d?l?u?s +?u?u?d?l?d?l?s?d +?u?u?d?l?d?l?s?l +?u?u?d?l?d?l?s?u +?u?u?d?l?d?l?s?s +?u?u?d?l?d?u?d?s +?u?u?d?l?d?u?l?s +?u?u?d?l?d?u?u?s +?u?u?d?l?d?u?s?d +?u?u?d?l?d?u?s?l +?u?u?d?l?d?u?s?u +?u?u?d?l?d?u?s?s +?u?u?d?l?d?s?d?d +?u?u?d?l?d?s?d?l +?u?u?d?l?d?s?d?u +?u?u?d?l?d?s?d?s +?u?u?d?l?d?s?l?d +?u?u?d?l?d?s?l?l +?u?u?d?l?d?s?l?u +?u?u?d?l?d?s?l?s +?u?u?d?l?d?s?u?d +?u?u?d?l?d?s?u?l +?u?u?d?l?d?s?u?u +?u?u?d?l?d?s?u?s +?u?u?d?l?d?s?s?d +?u?u?d?l?d?s?s?l +?u?u?d?l?d?s?s?u +?u?u?d?l?d?s?s?s +?u?u?d?l?l?d?d?s +?u?u?d?l?l?d?l?s +?u?u?d?l?l?d?u?s +?u?u?d?l?l?d?s?d +?u?u?d?l?l?d?s?l +?u?u?d?l?l?d?s?u +?u?u?d?l?l?d?s?s +?u?u?d?l?l?l?d?s +?u?u?d?l?l?l?l?s +?u?u?d?l?l?l?u?s +?u?u?d?l?l?l?s?d +?u?u?d?l?l?l?s?l +?u?u?d?l?l?l?s?u +?u?u?d?l?l?l?s?s +?u?u?d?l?l?u?d?s +?u?u?d?l?l?u?l?s +?u?u?d?l?l?u?u?s +?u?u?d?l?l?u?s?d +?u?u?d?l?l?u?s?l +?u?u?d?l?l?u?s?u +?u?u?d?l?l?u?s?s +?u?u?d?l?l?s?d?d +?u?u?d?l?l?s?d?l +?u?u?d?l?l?s?d?u +?u?u?d?l?l?s?d?s +?u?u?d?l?l?s?l?d +?u?u?d?l?l?s?l?l +?u?u?d?l?l?s?l?u +?u?u?d?l?l?s?l?s +?u?u?d?l?l?s?u?d +?u?u?d?l?l?s?u?l +?u?u?d?l?l?s?u?u +?u?u?d?l?l?s?u?s +?u?u?d?l?l?s?s?d +?u?u?d?l?l?s?s?l +?u?u?d?l?l?s?s?u +?u?u?d?l?l?s?s?s +?u?u?d?l?u?d?d?s +?u?u?d?l?u?d?l?s +?u?u?d?l?u?d?u?s +?u?u?d?l?u?d?s?d +?u?u?d?l?u?d?s?l +?u?u?d?l?u?d?s?u +?u?u?d?l?u?d?s?s +?u?u?d?l?u?l?d?s +?u?u?d?l?u?l?l?s +?u?u?d?l?u?l?u?s +?u?u?d?l?u?l?s?d +?u?u?d?l?u?l?s?l +?u?u?d?l?u?l?s?u +?u?u?d?l?u?l?s?s +?u?u?d?l?u?u?d?s +?u?u?d?l?u?u?l?s +?u?u?d?l?u?u?u?s +?u?u?d?l?u?u?s?d +?u?u?d?l?u?u?s?l +?u?u?d?l?u?u?s?u +?u?u?d?l?u?u?s?s +?u?u?d?l?u?s?d?d +?u?u?d?l?u?s?d?l +?u?u?d?l?u?s?d?u +?u?u?d?l?u?s?d?s +?u?u?d?l?u?s?l?d +?u?u?d?l?u?s?l?l +?u?u?d?l?u?s?l?u +?u?u?d?l?u?s?l?s +?u?u?d?l?u?s?u?d +?u?u?d?l?u?s?u?l +?u?u?d?l?u?s?u?u +?u?u?d?l?u?s?u?s +?u?u?d?l?u?s?s?d +?u?u?d?l?u?s?s?l +?u?u?d?l?u?s?s?u +?u?u?d?l?u?s?s?s +?u?u?d?l?s?d?d?d +?u?u?d?l?s?d?d?l +?u?u?d?l?s?d?d?u +?u?u?d?l?s?d?d?s +?u?u?d?l?s?d?l?d +?u?u?d?l?s?d?l?l +?u?u?d?l?s?d?l?u +?u?u?d?l?s?d?l?s +?u?u?d?l?s?d?u?d +?u?u?d?l?s?d?u?l +?u?u?d?l?s?d?u?u +?u?u?d?l?s?d?u?s +?u?u?d?l?s?d?s?d +?u?u?d?l?s?d?s?l +?u?u?d?l?s?d?s?u +?u?u?d?l?s?d?s?s +?u?u?d?l?s?l?d?d +?u?u?d?l?s?l?d?l +?u?u?d?l?s?l?d?u +?u?u?d?l?s?l?d?s +?u?u?d?l?s?l?l?d +?u?u?d?l?s?l?l?l +?u?u?d?l?s?l?l?u +?u?u?d?l?s?l?l?s +?u?u?d?l?s?l?u?d +?u?u?d?l?s?l?u?l +?u?u?d?l?s?l?u?u +?u?u?d?l?s?l?u?s +?u?u?d?l?s?l?s?d +?u?u?d?l?s?l?s?l +?u?u?d?l?s?l?s?u +?u?u?d?l?s?l?s?s +?u?u?d?l?s?u?d?d +?u?u?d?l?s?u?d?l +?u?u?d?l?s?u?d?u +?u?u?d?l?s?u?d?s +?u?u?d?l?s?u?l?d +?u?u?d?l?s?u?l?l +?u?u?d?l?s?u?l?u +?u?u?d?l?s?u?l?s +?u?u?d?l?s?u?u?d +?u?u?d?l?s?u?u?l +?u?u?d?l?s?u?u?u +?u?u?d?l?s?u?u?s +?u?u?d?l?s?u?s?d +?u?u?d?l?s?u?s?l +?u?u?d?l?s?u?s?u +?u?u?d?l?s?u?s?s +?u?u?d?l?s?s?d?d +?u?u?d?l?s?s?d?l +?u?u?d?l?s?s?d?u +?u?u?d?l?s?s?d?s +?u?u?d?l?s?s?l?d +?u?u?d?l?s?s?l?l +?u?u?d?l?s?s?l?u +?u?u?d?l?s?s?l?s +?u?u?d?l?s?s?u?d +?u?u?d?l?s?s?u?l +?u?u?d?l?s?s?u?u +?u?u?d?l?s?s?u?s +?u?u?d?l?s?s?s?d +?u?u?d?l?s?s?s?l +?u?u?d?l?s?s?s?u +?u?u?d?l?s?s?s?s +?u?u?d?u?d?d?l?s +?u?u?d?u?d?d?s?l +?u?u?d?u?d?l?d?s +?u?u?d?u?d?l?l?s +?u?u?d?u?d?l?u?s +?u?u?d?u?d?l?s?d +?u?u?d?u?d?l?s?l +?u?u?d?u?d?l?s?u +?u?u?d?u?d?l?s?s +?u?u?d?u?d?u?l?s +?u?u?d?u?d?u?s?l +?u?u?d?u?d?s?d?l +?u?u?d?u?d?s?l?d +?u?u?d?u?d?s?l?l +?u?u?d?u?d?s?l?u +?u?u?d?u?d?s?l?s +?u?u?d?u?d?s?u?l +?u?u?d?u?d?s?s?l +?u?u?d?u?l?d?d?s +?u?u?d?u?l?d?l?s +?u?u?d?u?l?d?u?s +?u?u?d?u?l?d?s?d +?u?u?d?u?l?d?s?l +?u?u?d?u?l?d?s?u +?u?u?d?u?l?d?s?s +?u?u?d?u?l?l?d?s +?u?u?d?u?l?l?l?s +?u?u?d?u?l?l?u?s +?u?u?d?u?l?l?s?d +?u?u?d?u?l?l?s?l +?u?u?d?u?l?l?s?u +?u?u?d?u?l?l?s?s +?u?u?d?u?l?u?d?s +?u?u?d?u?l?u?l?s +?u?u?d?u?l?u?u?s +?u?u?d?u?l?u?s?d +?u?u?d?u?l?u?s?l +?u?u?d?u?l?u?s?u +?u?u?d?u?l?u?s?s +?u?u?d?u?l?s?d?d +?u?u?d?u?l?s?d?l +?u?u?d?u?l?s?d?u +?u?u?d?u?l?s?d?s +?u?u?d?u?l?s?l?d +?u?u?d?u?l?s?l?l +?u?u?d?u?l?s?l?u +?u?u?d?u?l?s?l?s +?u?u?d?u?l?s?u?d +?u?u?d?u?l?s?u?l +?u?u?d?u?l?s?u?u +?u?u?d?u?l?s?u?s +?u?u?d?u?l?s?s?d +?u?u?d?u?l?s?s?l +?u?u?d?u?l?s?s?u +?u?u?d?u?l?s?s?s +?u?u?d?u?u?d?l?s +?u?u?d?u?u?d?s?l +?u?u?d?u?u?l?d?s +?u?u?d?u?u?l?l?s +?u?u?d?u?u?l?u?s +?u?u?d?u?u?l?s?d +?u?u?d?u?u?l?s?l +?u?u?d?u?u?l?s?u +?u?u?d?u?u?l?s?s +?u?u?d?u?u?u?l?s +?u?u?d?u?u?u?s?l +?u?u?d?u?u?s?d?l +?u?u?d?u?u?s?l?d +?u?u?d?u?u?s?l?l +?u?u?d?u?u?s?l?u +?u?u?d?u?u?s?l?s +?u?u?d?u?u?s?u?l +?u?u?d?u?u?s?s?l +?u?u?d?u?s?d?d?l +?u?u?d?u?s?d?l?d +?u?u?d?u?s?d?l?l +?u?u?d?u?s?d?l?u +?u?u?d?u?s?d?l?s +?u?u?d?u?s?d?u?l +?u?u?d?u?s?d?s?l +?u?u?d?u?s?l?d?d +?u?u?d?u?s?l?d?l +?u?u?d?u?s?l?d?u +?u?u?d?u?s?l?d?s +?u?u?d?u?s?l?l?d +?u?u?d?u?s?l?l?l +?u?u?d?u?s?l?l?u +?u?u?d?u?s?l?l?s +?u?u?d?u?s?l?u?d +?u?u?d?u?s?l?u?l +?u?u?d?u?s?l?u?u +?u?u?d?u?s?l?u?s +?u?u?d?u?s?l?s?d +?u?u?d?u?s?l?s?l +?u?u?d?u?s?l?s?u +?u?u?d?u?s?l?s?s +?u?u?d?u?s?u?d?l +?u?u?d?u?s?u?l?d +?u?u?d?u?s?u?l?l +?u?u?d?u?s?u?l?u +?u?u?d?u?s?u?l?s +?u?u?d?u?s?u?u?l +?u?u?d?u?s?u?s?l +?u?u?d?u?s?s?d?l +?u?u?d?u?s?s?l?d +?u?u?d?u?s?s?l?l +?u?u?d?u?s?s?l?u +?u?u?d?u?s?s?l?s +?u?u?d?u?s?s?u?l +?u?u?d?u?s?s?s?l +?u?u?d?s?d?d?d?l +?u?u?d?s?d?d?l?d +?u?u?d?s?d?d?l?l +?u?u?d?s?d?d?l?u +?u?u?d?s?d?d?l?s +?u?u?d?s?d?d?u?l +?u?u?d?s?d?d?s?l +?u?u?d?s?d?l?d?d +?u?u?d?s?d?l?d?l +?u?u?d?s?d?l?d?u +?u?u?d?s?d?l?d?s +?u?u?d?s?d?l?l?d +?u?u?d?s?d?l?l?l +?u?u?d?s?d?l?l?u +?u?u?d?s?d?l?l?s +?u?u?d?s?d?l?u?d +?u?u?d?s?d?l?u?l +?u?u?d?s?d?l?u?u +?u?u?d?s?d?l?u?s +?u?u?d?s?d?l?s?d +?u?u?d?s?d?l?s?l +?u?u?d?s?d?l?s?u +?u?u?d?s?d?l?s?s +?u?u?d?s?d?u?d?l +?u?u?d?s?d?u?l?d +?u?u?d?s?d?u?l?l +?u?u?d?s?d?u?l?u +?u?u?d?s?d?u?l?s +?u?u?d?s?d?u?u?l +?u?u?d?s?d?u?s?l +?u?u?d?s?d?s?d?l +?u?u?d?s?d?s?l?d +?u?u?d?s?d?s?l?l +?u?u?d?s?d?s?l?u +?u?u?d?s?d?s?l?s +?u?u?d?s?d?s?u?l +?u?u?d?s?d?s?s?l +?u?u?d?s?l?d?d?d +?u?u?d?s?l?d?d?l +?u?u?d?s?l?d?d?u +?u?u?d?s?l?d?d?s +?u?u?d?s?l?d?l?d +?u?u?d?s?l?d?l?l +?u?u?d?s?l?d?l?u +?u?u?d?s?l?d?l?s +?u?u?d?s?l?d?u?d +?u?u?d?s?l?d?u?l +?u?u?d?s?l?d?u?u +?u?u?d?s?l?d?u?s +?u?u?d?s?l?d?s?d +?u?u?d?s?l?d?s?l +?u?u?d?s?l?d?s?u +?u?u?d?s?l?d?s?s +?u?u?d?s?l?l?d?d +?u?u?d?s?l?l?d?l +?u?u?d?s?l?l?d?u +?u?u?d?s?l?l?d?s +?u?u?d?s?l?l?l?d +?u?u?d?s?l?l?l?l +?u?u?d?s?l?l?l?u +?u?u?d?s?l?l?l?s +?u?u?d?s?l?l?u?d +?u?u?d?s?l?l?u?l +?u?u?d?s?l?l?u?u +?u?u?d?s?l?l?u?s +?u?u?d?s?l?l?s?d +?u?u?d?s?l?l?s?l +?u?u?d?s?l?l?s?u +?u?u?d?s?l?l?s?s +?u?u?d?s?l?u?d?d +?u?u?d?s?l?u?d?l +?u?u?d?s?l?u?d?u +?u?u?d?s?l?u?d?s +?u?u?d?s?l?u?l?d +?u?u?d?s?l?u?l?l +?u?u?d?s?l?u?l?u +?u?u?d?s?l?u?l?s +?u?u?d?s?l?u?u?d +?u?u?d?s?l?u?u?l +?u?u?d?s?l?u?u?u +?u?u?d?s?l?u?u?s +?u?u?d?s?l?u?s?d +?u?u?d?s?l?u?s?l +?u?u?d?s?l?u?s?u +?u?u?d?s?l?u?s?s +?u?u?d?s?l?s?d?d +?u?u?d?s?l?s?d?l +?u?u?d?s?l?s?d?u +?u?u?d?s?l?s?d?s +?u?u?d?s?l?s?l?d +?u?u?d?s?l?s?l?l +?u?u?d?s?l?s?l?u +?u?u?d?s?l?s?l?s +?u?u?d?s?l?s?u?d +?u?u?d?s?l?s?u?l +?u?u?d?s?l?s?u?u +?u?u?d?s?l?s?u?s +?u?u?d?s?l?s?s?d +?u?u?d?s?l?s?s?l +?u?u?d?s?l?s?s?u +?u?u?d?s?l?s?s?s +?u?u?d?s?u?d?d?l +?u?u?d?s?u?d?l?d +?u?u?d?s?u?d?l?l +?u?u?d?s?u?d?l?u +?u?u?d?s?u?d?l?s +?u?u?d?s?u?d?u?l +?u?u?d?s?u?d?s?l +?u?u?d?s?u?l?d?d +?u?u?d?s?u?l?d?l +?u?u?d?s?u?l?d?u +?u?u?d?s?u?l?d?s +?u?u?d?s?u?l?l?d +?u?u?d?s?u?l?l?l +?u?u?d?s?u?l?l?u +?u?u?d?s?u?l?l?s +?u?u?d?s?u?l?u?d +?u?u?d?s?u?l?u?l +?u?u?d?s?u?l?u?u +?u?u?d?s?u?l?u?s +?u?u?d?s?u?l?s?d +?u?u?d?s?u?l?s?l +?u?u?d?s?u?l?s?u +?u?u?d?s?u?l?s?s +?u?u?d?s?u?u?d?l +?u?u?d?s?u?u?l?d +?u?u?d?s?u?u?l?l +?u?u?d?s?u?u?l?u +?u?u?d?s?u?u?l?s +?u?u?d?s?u?u?u?l +?u?u?d?s?u?u?s?l +?u?u?d?s?u?s?d?l +?u?u?d?s?u?s?l?d +?u?u?d?s?u?s?l?l +?u?u?d?s?u?s?l?u +?u?u?d?s?u?s?l?s +?u?u?d?s?u?s?u?l +?u?u?d?s?u?s?s?l +?u?u?d?s?s?d?d?l +?u?u?d?s?s?d?l?d +?u?u?d?s?s?d?l?l +?u?u?d?s?s?d?l?u +?u?u?d?s?s?d?l?s +?u?u?d?s?s?d?u?l +?u?u?d?s?s?d?s?l +?u?u?d?s?s?l?d?d +?u?u?d?s?s?l?d?l +?u?u?d?s?s?l?d?u +?u?u?d?s?s?l?d?s +?u?u?d?s?s?l?l?d +?u?u?d?s?s?l?l?l +?u?u?d?s?s?l?l?u +?u?u?d?s?s?l?l?s +?u?u?d?s?s?l?u?d +?u?u?d?s?s?l?u?l +?u?u?d?s?s?l?u?u +?u?u?d?s?s?l?u?s +?u?u?d?s?s?l?s?d +?u?u?d?s?s?l?s?l +?u?u?d?s?s?l?s?u +?u?u?d?s?s?l?s?s +?u?u?d?s?s?u?d?l +?u?u?d?s?s?u?l?d +?u?u?d?s?s?u?l?l +?u?u?d?s?s?u?l?u +?u?u?d?s?s?u?l?s +?u?u?d?s?s?u?u?l +?u?u?d?s?s?u?s?l +?u?u?d?s?s?s?d?l +?u?u?d?s?s?s?l?d +?u?u?d?s?s?s?l?l +?u?u?d?s?s?s?l?u +?u?u?d?s?s?s?l?s +?u?u?d?s?s?s?u?l +?u?u?d?s?s?s?s?l +?u?u?l?d?d?d?d?s +?u?u?l?d?d?d?l?s +?u?u?l?d?d?d?u?s +?u?u?l?d?d?d?s?d +?u?u?l?d?d?d?s?l +?u?u?l?d?d?d?s?u +?u?u?l?d?d?d?s?s +?u?u?l?d?d?l?d?s +?u?u?l?d?d?l?l?s +?u?u?l?d?d?l?u?s +?u?u?l?d?d?l?s?d +?u?u?l?d?d?l?s?l +?u?u?l?d?d?l?s?u +?u?u?l?d?d?l?s?s +?u?u?l?d?d?u?d?s +?u?u?l?d?d?u?l?s +?u?u?l?d?d?u?u?s +?u?u?l?d?d?u?s?d +?u?u?l?d?d?u?s?l +?u?u?l?d?d?u?s?u +?u?u?l?d?d?u?s?s +?u?u?l?d?d?s?d?d +?u?u?l?d?d?s?d?l +?u?u?l?d?d?s?d?u +?u?u?l?d?d?s?d?s +?u?u?l?d?d?s?l?d +?u?u?l?d?d?s?l?l +?u?u?l?d?d?s?l?u +?u?u?l?d?d?s?l?s +?u?u?l?d?d?s?u?d +?u?u?l?d?d?s?u?l +?u?u?l?d?d?s?u?u +?u?u?l?d?d?s?u?s +?u?u?l?d?d?s?s?d +?u?u?l?d?d?s?s?l +?u?u?l?d?d?s?s?u +?u?u?l?d?d?s?s?s +?u?u?l?d?l?d?d?s +?u?u?l?d?l?d?l?s +?u?u?l?d?l?d?u?s +?u?u?l?d?l?d?s?d +?u?u?l?d?l?d?s?l +?u?u?l?d?l?d?s?u +?u?u?l?d?l?d?s?s +?u?u?l?d?l?l?d?s +?u?u?l?d?l?l?l?s +?u?u?l?d?l?l?u?s +?u?u?l?d?l?l?s?d +?u?u?l?d?l?l?s?l +?u?u?l?d?l?l?s?u +?u?u?l?d?l?l?s?s +?u?u?l?d?l?u?d?s +?u?u?l?d?l?u?l?s +?u?u?l?d?l?u?u?s +?u?u?l?d?l?u?s?d +?u?u?l?d?l?u?s?l +?u?u?l?d?l?u?s?u +?u?u?l?d?l?u?s?s +?u?u?l?d?l?s?d?d +?u?u?l?d?l?s?d?l +?u?u?l?d?l?s?d?u +?u?u?l?d?l?s?d?s +?u?u?l?d?l?s?l?d +?u?u?l?d?l?s?l?l +?u?u?l?d?l?s?l?u +?u?u?l?d?l?s?l?s +?u?u?l?d?l?s?u?d +?u?u?l?d?l?s?u?l +?u?u?l?d?l?s?u?u +?u?u?l?d?l?s?u?s +?u?u?l?d?l?s?s?d +?u?u?l?d?l?s?s?l +?u?u?l?d?l?s?s?u +?u?u?l?d?l?s?s?s +?u?u?l?d?u?d?d?s +?u?u?l?d?u?d?l?s +?u?u?l?d?u?d?u?s +?u?u?l?d?u?d?s?d +?u?u?l?d?u?d?s?l +?u?u?l?d?u?d?s?u +?u?u?l?d?u?d?s?s +?u?u?l?d?u?l?d?s +?u?u?l?d?u?l?l?s +?u?u?l?d?u?l?u?s +?u?u?l?d?u?l?s?d +?u?u?l?d?u?l?s?l +?u?u?l?d?u?l?s?u +?u?u?l?d?u?l?s?s +?u?u?l?d?u?u?d?s +?u?u?l?d?u?u?l?s +?u?u?l?d?u?u?u?s +?u?u?l?d?u?u?s?d +?u?u?l?d?u?u?s?l +?u?u?l?d?u?u?s?u +?u?u?l?d?u?u?s?s +?u?u?l?d?u?s?d?d +?u?u?l?d?u?s?d?l +?u?u?l?d?u?s?d?u +?u?u?l?d?u?s?d?s +?u?u?l?d?u?s?l?d +?u?u?l?d?u?s?l?l +?u?u?l?d?u?s?l?u +?u?u?l?d?u?s?l?s +?u?u?l?d?u?s?u?d +?u?u?l?d?u?s?u?l +?u?u?l?d?u?s?u?u +?u?u?l?d?u?s?u?s +?u?u?l?d?u?s?s?d +?u?u?l?d?u?s?s?l +?u?u?l?d?u?s?s?u +?u?u?l?d?u?s?s?s +?u?u?l?d?s?d?d?d +?u?u?l?d?s?d?d?l +?u?u?l?d?s?d?d?u +?u?u?l?d?s?d?d?s +?u?u?l?d?s?d?l?d +?u?u?l?d?s?d?l?l +?u?u?l?d?s?d?l?u +?u?u?l?d?s?d?l?s +?u?u?l?d?s?d?u?d +?u?u?l?d?s?d?u?l +?u?u?l?d?s?d?u?u +?u?u?l?d?s?d?u?s +?u?u?l?d?s?d?s?d +?u?u?l?d?s?d?s?l +?u?u?l?d?s?d?s?u +?u?u?l?d?s?d?s?s +?u?u?l?d?s?l?d?d +?u?u?l?d?s?l?d?l +?u?u?l?d?s?l?d?u +?u?u?l?d?s?l?d?s +?u?u?l?d?s?l?l?d +?u?u?l?d?s?l?l?l +?u?u?l?d?s?l?l?u +?u?u?l?d?s?l?l?s +?u?u?l?d?s?l?u?d +?u?u?l?d?s?l?u?l +?u?u?l?d?s?l?u?u +?u?u?l?d?s?l?u?s +?u?u?l?d?s?l?s?d +?u?u?l?d?s?l?s?l +?u?u?l?d?s?l?s?u +?u?u?l?d?s?l?s?s +?u?u?l?d?s?u?d?d +?u?u?l?d?s?u?d?l +?u?u?l?d?s?u?d?u +?u?u?l?d?s?u?d?s +?u?u?l?d?s?u?l?d +?u?u?l?d?s?u?l?l +?u?u?l?d?s?u?l?u +?u?u?l?d?s?u?l?s +?u?u?l?d?s?u?u?d +?u?u?l?d?s?u?u?l +?u?u?l?d?s?u?u?u +?u?u?l?d?s?u?u?s +?u?u?l?d?s?u?s?d +?u?u?l?d?s?u?s?l +?u?u?l?d?s?u?s?u +?u?u?l?d?s?u?s?s +?u?u?l?d?s?s?d?d +?u?u?l?d?s?s?d?l +?u?u?l?d?s?s?d?u +?u?u?l?d?s?s?d?s +?u?u?l?d?s?s?l?d +?u?u?l?d?s?s?l?l +?u?u?l?d?s?s?l?u +?u?u?l?d?s?s?l?s +?u?u?l?d?s?s?u?d +?u?u?l?d?s?s?u?l +?u?u?l?d?s?s?u?u +?u?u?l?d?s?s?u?s +?u?u?l?d?s?s?s?d +?u?u?l?d?s?s?s?l +?u?u?l?d?s?s?s?u +?u?u?l?d?s?s?s?s +?u?u?l?l?d?d?d?s +?u?u?l?l?d?d?l?s +?u?u?l?l?d?d?u?s +?u?u?l?l?d?d?s?d +?u?u?l?l?d?d?s?l +?u?u?l?l?d?d?s?u +?u?u?l?l?d?d?s?s +?u?u?l?l?d?l?d?s +?u?u?l?l?d?l?l?s +?u?u?l?l?d?l?u?s +?u?u?l?l?d?l?s?d +?u?u?l?l?d?l?s?l +?u?u?l?l?d?l?s?u +?u?u?l?l?d?l?s?s +?u?u?l?l?d?u?d?s +?u?u?l?l?d?u?l?s +?u?u?l?l?d?u?u?s +?u?u?l?l?d?u?s?d +?u?u?l?l?d?u?s?l +?u?u?l?l?d?u?s?u +?u?u?l?l?d?u?s?s +?u?u?l?l?d?s?d?d +?u?u?l?l?d?s?d?l +?u?u?l?l?d?s?d?u +?u?u?l?l?d?s?d?s +?u?u?l?l?d?s?l?d +?u?u?l?l?d?s?l?l +?u?u?l?l?d?s?l?u +?u?u?l?l?d?s?l?s +?u?u?l?l?d?s?u?d +?u?u?l?l?d?s?u?l +?u?u?l?l?d?s?u?u +?u?u?l?l?d?s?u?s +?u?u?l?l?d?s?s?d +?u?u?l?l?d?s?s?l +?u?u?l?l?d?s?s?u +?u?u?l?l?d?s?s?s +?u?u?l?l?l?d?d?s +?u?u?l?l?l?d?l?s +?u?u?l?l?l?d?u?s +?u?u?l?l?l?d?s?d +?u?u?l?l?l?d?s?l +?u?u?l?l?l?d?s?u +?u?u?l?l?l?d?s?s +?u?u?l?l?l?l?d?s +?u?u?l?l?l?l?s?d +?u?u?l?l?l?u?d?s +?u?u?l?l?l?u?s?d +?u?u?l?l?l?s?d?d +?u?u?l?l?l?s?d?l +?u?u?l?l?l?s?d?u +?u?u?l?l?l?s?d?s +?u?u?l?l?l?s?l?d +?u?u?l?l?l?s?u?d +?u?u?l?l?l?s?s?d +?u?u?l?l?u?d?d?s +?u?u?l?l?u?d?l?s +?u?u?l?l?u?d?u?s +?u?u?l?l?u?d?s?d +?u?u?l?l?u?d?s?l +?u?u?l?l?u?d?s?u +?u?u?l?l?u?d?s?s +?u?u?l?l?u?l?d?s +?u?u?l?l?u?l?s?d +?u?u?l?l?u?u?d?s +?u?u?l?l?u?u?s?d +?u?u?l?l?u?s?d?d +?u?u?l?l?u?s?d?l +?u?u?l?l?u?s?d?u +?u?u?l?l?u?s?d?s +?u?u?l?l?u?s?l?d +?u?u?l?l?u?s?u?d +?u?u?l?l?u?s?s?d +?u?u?l?l?s?d?d?d +?u?u?l?l?s?d?d?l +?u?u?l?l?s?d?d?u +?u?u?l?l?s?d?d?s +?u?u?l?l?s?d?l?d +?u?u?l?l?s?d?l?l +?u?u?l?l?s?d?l?u +?u?u?l?l?s?d?l?s +?u?u?l?l?s?d?u?d +?u?u?l?l?s?d?u?l +?u?u?l?l?s?d?u?u +?u?u?l?l?s?d?u?s +?u?u?l?l?s?d?s?d +?u?u?l?l?s?d?s?l +?u?u?l?l?s?d?s?u +?u?u?l?l?s?d?s?s +?u?u?l?l?s?l?d?d +?u?u?l?l?s?l?d?l +?u?u?l?l?s?l?d?u +?u?u?l?l?s?l?d?s +?u?u?l?l?s?l?l?d +?u?u?l?l?s?l?u?d +?u?u?l?l?s?l?s?d +?u?u?l?l?s?u?d?d +?u?u?l?l?s?u?d?l +?u?u?l?l?s?u?d?u +?u?u?l?l?s?u?d?s +?u?u?l?l?s?u?l?d +?u?u?l?l?s?u?u?d +?u?u?l?l?s?u?s?d +?u?u?l?l?s?s?d?d +?u?u?l?l?s?s?d?l +?u?u?l?l?s?s?d?u +?u?u?l?l?s?s?d?s +?u?u?l?l?s?s?l?d +?u?u?l?l?s?s?u?d +?u?u?l?l?s?s?s?d +?u?u?l?u?d?d?d?s +?u?u?l?u?d?d?l?s +?u?u?l?u?d?d?u?s +?u?u?l?u?d?d?s?d +?u?u?l?u?d?d?s?l +?u?u?l?u?d?d?s?u +?u?u?l?u?d?d?s?s +?u?u?l?u?d?l?d?s +?u?u?l?u?d?l?l?s +?u?u?l?u?d?l?u?s +?u?u?l?u?d?l?s?d +?u?u?l?u?d?l?s?l +?u?u?l?u?d?l?s?u +?u?u?l?u?d?l?s?s +?u?u?l?u?d?u?d?s +?u?u?l?u?d?u?l?s +?u?u?l?u?d?u?u?s +?u?u?l?u?d?u?s?d +?u?u?l?u?d?u?s?l +?u?u?l?u?d?u?s?u +?u?u?l?u?d?u?s?s +?u?u?l?u?d?s?d?d +?u?u?l?u?d?s?d?l +?u?u?l?u?d?s?d?u +?u?u?l?u?d?s?d?s +?u?u?l?u?d?s?l?d +?u?u?l?u?d?s?l?l +?u?u?l?u?d?s?l?u +?u?u?l?u?d?s?l?s +?u?u?l?u?d?s?u?d +?u?u?l?u?d?s?u?l +?u?u?l?u?d?s?u?u +?u?u?l?u?d?s?u?s +?u?u?l?u?d?s?s?d +?u?u?l?u?d?s?s?l +?u?u?l?u?d?s?s?u +?u?u?l?u?d?s?s?s +?u?u?l?u?l?d?d?s +?u?u?l?u?l?d?l?s +?u?u?l?u?l?d?u?s +?u?u?l?u?l?d?s?d +?u?u?l?u?l?d?s?l +?u?u?l?u?l?d?s?u +?u?u?l?u?l?d?s?s +?u?u?l?u?l?l?d?s +?u?u?l?u?l?l?s?d +?u?u?l?u?l?u?d?s +?u?u?l?u?l?u?s?d +?u?u?l?u?l?s?d?d +?u?u?l?u?l?s?d?l +?u?u?l?u?l?s?d?u +?u?u?l?u?l?s?d?s +?u?u?l?u?l?s?l?d +?u?u?l?u?l?s?u?d +?u?u?l?u?l?s?s?d +?u?u?l?u?u?d?d?s +?u?u?l?u?u?d?l?s +?u?u?l?u?u?d?u?s +?u?u?l?u?u?d?s?d +?u?u?l?u?u?d?s?l +?u?u?l?u?u?d?s?u +?u?u?l?u?u?d?s?s +?u?u?l?u?u?l?d?s +?u?u?l?u?u?l?s?d +?u?u?l?u?u?u?d?s +?u?u?l?u?u?u?s?d +?u?u?l?u?u?s?d?d +?u?u?l?u?u?s?d?l +?u?u?l?u?u?s?d?u +?u?u?l?u?u?s?d?s +?u?u?l?u?u?s?l?d +?u?u?l?u?u?s?u?d +?u?u?l?u?u?s?s?d +?u?u?l?u?s?d?d?d +?u?u?l?u?s?d?d?l +?u?u?l?u?s?d?d?u +?u?u?l?u?s?d?d?s +?u?u?l?u?s?d?l?d +?u?u?l?u?s?d?l?l +?u?u?l?u?s?d?l?u +?u?u?l?u?s?d?l?s +?u?u?l?u?s?d?u?d +?u?u?l?u?s?d?u?l +?u?u?l?u?s?d?u?u +?u?u?l?u?s?d?u?s +?u?u?l?u?s?d?s?d +?u?u?l?u?s?d?s?l +?u?u?l?u?s?d?s?u +?u?u?l?u?s?d?s?s +?u?u?l?u?s?l?d?d +?u?u?l?u?s?l?d?l +?u?u?l?u?s?l?d?u +?u?u?l?u?s?l?d?s +?u?u?l?u?s?l?l?d +?u?u?l?u?s?l?u?d +?u?u?l?u?s?l?s?d +?u?u?l?u?s?u?d?d +?u?u?l?u?s?u?d?l +?u?u?l?u?s?u?d?u +?u?u?l?u?s?u?d?s +?u?u?l?u?s?u?l?d +?u?u?l?u?s?u?u?d +?u?u?l?u?s?u?s?d +?u?u?l?u?s?s?d?d +?u?u?l?u?s?s?d?l +?u?u?l?u?s?s?d?u +?u?u?l?u?s?s?d?s +?u?u?l?u?s?s?l?d +?u?u?l?u?s?s?u?d +?u?u?l?u?s?s?s?d +?u?u?l?s?d?d?d?d +?u?u?l?s?d?d?d?l +?u?u?l?s?d?d?d?u +?u?u?l?s?d?d?d?s +?u?u?l?s?d?d?l?d +?u?u?l?s?d?d?l?l +?u?u?l?s?d?d?l?u +?u?u?l?s?d?d?l?s +?u?u?l?s?d?d?u?d +?u?u?l?s?d?d?u?l +?u?u?l?s?d?d?u?u +?u?u?l?s?d?d?u?s +?u?u?l?s?d?d?s?d +?u?u?l?s?d?d?s?l +?u?u?l?s?d?d?s?u +?u?u?l?s?d?d?s?s +?u?u?l?s?d?l?d?d +?u?u?l?s?d?l?d?l +?u?u?l?s?d?l?d?u +?u?u?l?s?d?l?d?s +?u?u?l?s?d?l?l?d +?u?u?l?s?d?l?l?l +?u?u?l?s?d?l?l?u +?u?u?l?s?d?l?l?s +?u?u?l?s?d?l?u?d +?u?u?l?s?d?l?u?l +?u?u?l?s?d?l?u?u +?u?u?l?s?d?l?u?s +?u?u?l?s?d?l?s?d +?u?u?l?s?d?l?s?l +?u?u?l?s?d?l?s?u +?u?u?l?s?d?l?s?s +?u?u?l?s?d?u?d?d +?u?u?l?s?d?u?d?l +?u?u?l?s?d?u?d?u +?u?u?l?s?d?u?d?s +?u?u?l?s?d?u?l?d +?u?u?l?s?d?u?l?l +?u?u?l?s?d?u?l?u +?u?u?l?s?d?u?l?s +?u?u?l?s?d?u?u?d +?u?u?l?s?d?u?u?l +?u?u?l?s?d?u?u?u +?u?u?l?s?d?u?u?s +?u?u?l?s?d?u?s?d +?u?u?l?s?d?u?s?l +?u?u?l?s?d?u?s?u +?u?u?l?s?d?u?s?s +?u?u?l?s?d?s?d?d +?u?u?l?s?d?s?d?l +?u?u?l?s?d?s?d?u +?u?u?l?s?d?s?d?s +?u?u?l?s?d?s?l?d +?u?u?l?s?d?s?l?l +?u?u?l?s?d?s?l?u +?u?u?l?s?d?s?l?s +?u?u?l?s?d?s?u?d +?u?u?l?s?d?s?u?l +?u?u?l?s?d?s?u?u +?u?u?l?s?d?s?u?s +?u?u?l?s?d?s?s?d +?u?u?l?s?d?s?s?l +?u?u?l?s?d?s?s?u +?u?u?l?s?d?s?s?s +?u?u?l?s?l?d?d?d +?u?u?l?s?l?d?d?l +?u?u?l?s?l?d?d?u +?u?u?l?s?l?d?d?s +?u?u?l?s?l?d?l?d +?u?u?l?s?l?d?l?l +?u?u?l?s?l?d?l?u +?u?u?l?s?l?d?l?s +?u?u?l?s?l?d?u?d +?u?u?l?s?l?d?u?l +?u?u?l?s?l?d?u?u +?u?u?l?s?l?d?u?s +?u?u?l?s?l?d?s?d +?u?u?l?s?l?d?s?l +?u?u?l?s?l?d?s?u +?u?u?l?s?l?d?s?s +?u?u?l?s?l?l?d?d +?u?u?l?s?l?l?d?l +?u?u?l?s?l?l?d?u +?u?u?l?s?l?l?d?s +?u?u?l?s?l?l?l?d +?u?u?l?s?l?l?u?d +?u?u?l?s?l?l?s?d +?u?u?l?s?l?u?d?d +?u?u?l?s?l?u?d?l +?u?u?l?s?l?u?d?u +?u?u?l?s?l?u?d?s +?u?u?l?s?l?u?l?d +?u?u?l?s?l?u?u?d +?u?u?l?s?l?u?s?d +?u?u?l?s?l?s?d?d +?u?u?l?s?l?s?d?l +?u?u?l?s?l?s?d?u +?u?u?l?s?l?s?d?s +?u?u?l?s?l?s?l?d +?u?u?l?s?l?s?u?d +?u?u?l?s?l?s?s?d +?u?u?l?s?u?d?d?d +?u?u?l?s?u?d?d?l +?u?u?l?s?u?d?d?u +?u?u?l?s?u?d?d?s +?u?u?l?s?u?d?l?d +?u?u?l?s?u?d?l?l +?u?u?l?s?u?d?l?u +?u?u?l?s?u?d?l?s +?u?u?l?s?u?d?u?d +?u?u?l?s?u?d?u?l +?u?u?l?s?u?d?u?u +?u?u?l?s?u?d?u?s +?u?u?l?s?u?d?s?d +?u?u?l?s?u?d?s?l +?u?u?l?s?u?d?s?u +?u?u?l?s?u?d?s?s +?u?u?l?s?u?l?d?d +?u?u?l?s?u?l?d?l +?u?u?l?s?u?l?d?u +?u?u?l?s?u?l?d?s +?u?u?l?s?u?l?l?d +?u?u?l?s?u?l?u?d +?u?u?l?s?u?l?s?d +?u?u?l?s?u?u?d?d +?u?u?l?s?u?u?d?l +?u?u?l?s?u?u?d?u +?u?u?l?s?u?u?d?s +?u?u?l?s?u?u?l?d +?u?u?l?s?u?u?u?d +?u?u?l?s?u?u?s?d +?u?u?l?s?u?s?d?d +?u?u?l?s?u?s?d?l +?u?u?l?s?u?s?d?u +?u?u?l?s?u?s?d?s +?u?u?l?s?u?s?l?d +?u?u?l?s?u?s?u?d +?u?u?l?s?u?s?s?d +?u?u?l?s?s?d?d?d +?u?u?l?s?s?d?d?l +?u?u?l?s?s?d?d?u +?u?u?l?s?s?d?d?s +?u?u?l?s?s?d?l?d +?u?u?l?s?s?d?l?l +?u?u?l?s?s?d?l?u +?u?u?l?s?s?d?l?s +?u?u?l?s?s?d?u?d +?u?u?l?s?s?d?u?l +?u?u?l?s?s?d?u?u +?u?u?l?s?s?d?u?s +?u?u?l?s?s?d?s?d +?u?u?l?s?s?d?s?l +?u?u?l?s?s?d?s?u +?u?u?l?s?s?d?s?s +?u?u?l?s?s?l?d?d +?u?u?l?s?s?l?d?l +?u?u?l?s?s?l?d?u +?u?u?l?s?s?l?d?s +?u?u?l?s?s?l?l?d +?u?u?l?s?s?l?u?d +?u?u?l?s?s?l?s?d +?u?u?l?s?s?u?d?d +?u?u?l?s?s?u?d?l +?u?u?l?s?s?u?d?u +?u?u?l?s?s?u?d?s +?u?u?l?s?s?u?l?d +?u?u?l?s?s?u?u?d +?u?u?l?s?s?u?s?d +?u?u?l?s?s?s?d?d +?u?u?l?s?s?s?d?l +?u?u?l?s?s?s?d?u +?u?u?l?s?s?s?d?s +?u?u?l?s?s?s?l?d +?u?u?l?s?s?s?u?d +?u?u?l?s?s?s?s?d +?u?u?u?d?d?d?l?s +?u?u?u?d?d?d?s?l +?u?u?u?d?d?l?d?s +?u?u?u?d?d?l?l?s +?u?u?u?d?d?l?u?s +?u?u?u?d?d?l?s?d +?u?u?u?d?d?l?s?l +?u?u?u?d?d?l?s?u +?u?u?u?d?d?l?s?s +?u?u?u?d?d?u?l?s +?u?u?u?d?d?u?s?l +?u?u?u?d?d?s?d?l +?u?u?u?d?d?s?l?d +?u?u?u?d?d?s?l?l +?u?u?u?d?d?s?l?u +?u?u?u?d?d?s?l?s +?u?u?u?d?d?s?u?l +?u?u?u?d?d?s?s?l +?u?u?u?d?l?d?d?s +?u?u?u?d?l?d?l?s +?u?u?u?d?l?d?u?s +?u?u?u?d?l?d?s?d +?u?u?u?d?l?d?s?l +?u?u?u?d?l?d?s?u +?u?u?u?d?l?d?s?s +?u?u?u?d?l?l?d?s +?u?u?u?d?l?l?l?s +?u?u?u?d?l?l?u?s +?u?u?u?d?l?l?s?d +?u?u?u?d?l?l?s?l +?u?u?u?d?l?l?s?u +?u?u?u?d?l?l?s?s +?u?u?u?d?l?u?d?s +?u?u?u?d?l?u?l?s +?u?u?u?d?l?u?u?s +?u?u?u?d?l?u?s?d +?u?u?u?d?l?u?s?l +?u?u?u?d?l?u?s?u +?u?u?u?d?l?u?s?s +?u?u?u?d?l?s?d?d +?u?u?u?d?l?s?d?l +?u?u?u?d?l?s?d?u +?u?u?u?d?l?s?d?s +?u?u?u?d?l?s?l?d +?u?u?u?d?l?s?l?l +?u?u?u?d?l?s?l?u +?u?u?u?d?l?s?l?s +?u?u?u?d?l?s?u?d +?u?u?u?d?l?s?u?l +?u?u?u?d?l?s?u?u +?u?u?u?d?l?s?u?s +?u?u?u?d?l?s?s?d +?u?u?u?d?l?s?s?l +?u?u?u?d?l?s?s?u +?u?u?u?d?l?s?s?s +?u?u?u?d?u?d?l?s +?u?u?u?d?u?d?s?l +?u?u?u?d?u?l?d?s +?u?u?u?d?u?l?l?s +?u?u?u?d?u?l?u?s +?u?u?u?d?u?l?s?d +?u?u?u?d?u?l?s?l +?u?u?u?d?u?l?s?u +?u?u?u?d?u?l?s?s +?u?u?u?d?u?u?l?s +?u?u?u?d?u?u?s?l +?u?u?u?d?u?s?d?l +?u?u?u?d?u?s?l?d +?u?u?u?d?u?s?l?l +?u?u?u?d?u?s?l?u +?u?u?u?d?u?s?l?s +?u?u?u?d?u?s?u?l +?u?u?u?d?u?s?s?l +?u?u?u?d?s?d?d?l +?u?u?u?d?s?d?l?d +?u?u?u?d?s?d?l?l +?u?u?u?d?s?d?l?u +?u?u?u?d?s?d?l?s +?u?u?u?d?s?d?u?l +?u?u?u?d?s?d?s?l +?u?u?u?d?s?l?d?d +?u?u?u?d?s?l?d?l +?u?u?u?d?s?l?d?u +?u?u?u?d?s?l?d?s +?u?u?u?d?s?l?l?d +?u?u?u?d?s?l?l?l +?u?u?u?d?s?l?l?u +?u?u?u?d?s?l?l?s +?u?u?u?d?s?l?u?d +?u?u?u?d?s?l?u?l +?u?u?u?d?s?l?u?u +?u?u?u?d?s?l?u?s +?u?u?u?d?s?l?s?d +?u?u?u?d?s?l?s?l +?u?u?u?d?s?l?s?u +?u?u?u?d?s?l?s?s +?u?u?u?d?s?u?d?l +?u?u?u?d?s?u?l?d +?u?u?u?d?s?u?l?l +?u?u?u?d?s?u?l?u +?u?u?u?d?s?u?l?s +?u?u?u?d?s?u?u?l +?u?u?u?d?s?u?s?l +?u?u?u?d?s?s?d?l +?u?u?u?d?s?s?l?d +?u?u?u?d?s?s?l?l +?u?u?u?d?s?s?l?u +?u?u?u?d?s?s?l?s +?u?u?u?d?s?s?u?l +?u?u?u?d?s?s?s?l +?u?u?u?l?d?d?d?s +?u?u?u?l?d?d?l?s +?u?u?u?l?d?d?u?s +?u?u?u?l?d?d?s?d +?u?u?u?l?d?d?s?l +?u?u?u?l?d?d?s?u +?u?u?u?l?d?d?s?s +?u?u?u?l?d?l?d?s +?u?u?u?l?d?l?l?s +?u?u?u?l?d?l?u?s +?u?u?u?l?d?l?s?d +?u?u?u?l?d?l?s?l +?u?u?u?l?d?l?s?u +?u?u?u?l?d?l?s?s +?u?u?u?l?d?u?d?s +?u?u?u?l?d?u?l?s +?u?u?u?l?d?u?u?s +?u?u?u?l?d?u?s?d +?u?u?u?l?d?u?s?l +?u?u?u?l?d?u?s?u +?u?u?u?l?d?u?s?s +?u?u?u?l?d?s?d?d +?u?u?u?l?d?s?d?l +?u?u?u?l?d?s?d?u +?u?u?u?l?d?s?d?s +?u?u?u?l?d?s?l?d +?u?u?u?l?d?s?l?l +?u?u?u?l?d?s?l?u +?u?u?u?l?d?s?l?s +?u?u?u?l?d?s?u?d +?u?u?u?l?d?s?u?l +?u?u?u?l?d?s?u?u +?u?u?u?l?d?s?u?s +?u?u?u?l?d?s?s?d +?u?u?u?l?d?s?s?l +?u?u?u?l?d?s?s?u +?u?u?u?l?d?s?s?s +?u?u?u?l?l?d?d?s +?u?u?u?l?l?d?l?s +?u?u?u?l?l?d?u?s +?u?u?u?l?l?d?s?d +?u?u?u?l?l?d?s?l +?u?u?u?l?l?d?s?u +?u?u?u?l?l?d?s?s +?u?u?u?l?l?l?d?s +?u?u?u?l?l?l?s?d +?u?u?u?l?l?u?d?s +?u?u?u?l?l?u?s?d +?u?u?u?l?l?s?d?d +?u?u?u?l?l?s?d?l +?u?u?u?l?l?s?d?u +?u?u?u?l?l?s?d?s +?u?u?u?l?l?s?l?d +?u?u?u?l?l?s?u?d +?u?u?u?l?l?s?s?d +?u?u?u?l?u?d?d?s +?u?u?u?l?u?d?l?s +?u?u?u?l?u?d?u?s +?u?u?u?l?u?d?s?d +?u?u?u?l?u?d?s?l +?u?u?u?l?u?d?s?u +?u?u?u?l?u?d?s?s +?u?u?u?l?u?l?d?s +?u?u?u?l?u?l?s?d +?u?u?u?l?u?u?d?s +?u?u?u?l?u?u?s?d +?u?u?u?l?u?s?d?d +?u?u?u?l?u?s?d?l +?u?u?u?l?u?s?d?u +?u?u?u?l?u?s?d?s +?u?u?u?l?u?s?l?d +?u?u?u?l?u?s?u?d +?u?u?u?l?u?s?s?d +?u?u?u?l?s?d?d?d +?u?u?u?l?s?d?d?l +?u?u?u?l?s?d?d?u +?u?u?u?l?s?d?d?s +?u?u?u?l?s?d?l?d +?u?u?u?l?s?d?l?l +?u?u?u?l?s?d?l?u +?u?u?u?l?s?d?l?s +?u?u?u?l?s?d?u?d +?u?u?u?l?s?d?u?l +?u?u?u?l?s?d?u?u +?u?u?u?l?s?d?u?s +?u?u?u?l?s?d?s?d +?u?u?u?l?s?d?s?l +?u?u?u?l?s?d?s?u +?u?u?u?l?s?d?s?s +?u?u?u?l?s?l?d?d +?u?u?u?l?s?l?d?l +?u?u?u?l?s?l?d?u +?u?u?u?l?s?l?d?s +?u?u?u?l?s?l?l?d +?u?u?u?l?s?l?u?d +?u?u?u?l?s?l?s?d +?u?u?u?l?s?u?d?d +?u?u?u?l?s?u?d?l +?u?u?u?l?s?u?d?u +?u?u?u?l?s?u?d?s +?u?u?u?l?s?u?l?d +?u?u?u?l?s?u?u?d +?u?u?u?l?s?u?s?d +?u?u?u?l?s?s?d?d +?u?u?u?l?s?s?d?l +?u?u?u?l?s?s?d?u +?u?u?u?l?s?s?d?s +?u?u?u?l?s?s?l?d +?u?u?u?l?s?s?u?d +?u?u?u?l?s?s?s?d +?u?u?u?u?d?d?l?s +?u?u?u?u?d?d?s?l +?u?u?u?u?d?l?d?s +?u?u?u?u?d?l?l?s +?u?u?u?u?d?l?u?s +?u?u?u?u?d?l?s?d +?u?u?u?u?d?l?s?l +?u?u?u?u?d?l?s?u +?u?u?u?u?d?l?s?s +?u?u?u?u?d?u?l?s +?u?u?u?u?d?u?s?l +?u?u?u?u?d?s?d?l +?u?u?u?u?d?s?l?d +?u?u?u?u?d?s?l?l +?u?u?u?u?d?s?l?u +?u?u?u?u?d?s?l?s +?u?u?u?u?d?s?u?l +?u?u?u?u?d?s?s?l +?u?u?u?u?l?d?d?s +?u?u?u?u?l?d?l?s +?u?u?u?u?l?d?u?s +?u?u?u?u?l?d?s?d +?u?u?u?u?l?d?s?l +?u?u?u?u?l?d?s?u +?u?u?u?u?l?d?s?s +?u?u?u?u?l?l?d?s +?u?u?u?u?l?l?s?d +?u?u?u?u?l?u?d?s +?u?u?u?u?l?u?s?d +?u?u?u?u?l?s?d?d +?u?u?u?u?l?s?d?l +?u?u?u?u?l?s?d?u +?u?u?u?u?l?s?d?s +?u?u?u?u?l?s?l?d +?u?u?u?u?l?s?u?d +?u?u?u?u?l?s?s?d +?u?u?u?u?u?d?l?s +?u?u?u?u?u?d?s?l +?u?u?u?u?u?l?d?s +?u?u?u?u?u?l?s?d +?u?u?u?u?u?s?d?l +?u?u?u?u?u?s?l?d +?u?u?u?u?s?d?d?l +?u?u?u?u?s?d?l?d +?u?u?u?u?s?d?l?l +?u?u?u?u?s?d?l?u +?u?u?u?u?s?d?l?s +?u?u?u?u?s?d?u?l +?u?u?u?u?s?d?s?l +?u?u?u?u?s?l?d?d +?u?u?u?u?s?l?d?l +?u?u?u?u?s?l?d?u +?u?u?u?u?s?l?d?s +?u?u?u?u?s?l?l?d +?u?u?u?u?s?l?u?d +?u?u?u?u?s?l?s?d +?u?u?u?u?s?u?d?l +?u?u?u?u?s?u?l?d +?u?u?u?u?s?s?d?l +?u?u?u?u?s?s?l?d +?u?u?u?s?d?d?d?l +?u?u?u?s?d?d?l?d +?u?u?u?s?d?d?l?l +?u?u?u?s?d?d?l?u +?u?u?u?s?d?d?l?s +?u?u?u?s?d?d?u?l +?u?u?u?s?d?d?s?l +?u?u?u?s?d?l?d?d +?u?u?u?s?d?l?d?l +?u?u?u?s?d?l?d?u +?u?u?u?s?d?l?d?s +?u?u?u?s?d?l?l?d +?u?u?u?s?d?l?l?l +?u?u?u?s?d?l?l?u +?u?u?u?s?d?l?l?s +?u?u?u?s?d?l?u?d +?u?u?u?s?d?l?u?l +?u?u?u?s?d?l?u?u +?u?u?u?s?d?l?u?s +?u?u?u?s?d?l?s?d +?u?u?u?s?d?l?s?l +?u?u?u?s?d?l?s?u +?u?u?u?s?d?l?s?s +?u?u?u?s?d?u?d?l +?u?u?u?s?d?u?l?d +?u?u?u?s?d?u?l?l +?u?u?u?s?d?u?l?u +?u?u?u?s?d?u?l?s +?u?u?u?s?d?u?u?l +?u?u?u?s?d?u?s?l +?u?u?u?s?d?s?d?l +?u?u?u?s?d?s?l?d +?u?u?u?s?d?s?l?l +?u?u?u?s?d?s?l?u +?u?u?u?s?d?s?l?s +?u?u?u?s?d?s?u?l +?u?u?u?s?d?s?s?l +?u?u?u?s?l?d?d?d +?u?u?u?s?l?d?d?l +?u?u?u?s?l?d?d?u +?u?u?u?s?l?d?d?s +?u?u?u?s?l?d?l?d +?u?u?u?s?l?d?l?l +?u?u?u?s?l?d?l?u +?u?u?u?s?l?d?l?s +?u?u?u?s?l?d?u?d +?u?u?u?s?l?d?u?l +?u?u?u?s?l?d?u?u +?u?u?u?s?l?d?u?s +?u?u?u?s?l?d?s?d +?u?u?u?s?l?d?s?l +?u?u?u?s?l?d?s?u +?u?u?u?s?l?d?s?s +?u?u?u?s?l?l?d?d +?u?u?u?s?l?l?d?l +?u?u?u?s?l?l?d?u +?u?u?u?s?l?l?d?s +?u?u?u?s?l?l?l?d +?u?u?u?s?l?l?u?d +?u?u?u?s?l?l?s?d +?u?u?u?s?l?u?d?d +?u?u?u?s?l?u?d?l +?u?u?u?s?l?u?d?u +?u?u?u?s?l?u?d?s +?u?u?u?s?l?u?l?d +?u?u?u?s?l?u?u?d +?u?u?u?s?l?u?s?d +?u?u?u?s?l?s?d?d +?u?u?u?s?l?s?d?l +?u?u?u?s?l?s?d?u +?u?u?u?s?l?s?d?s +?u?u?u?s?l?s?l?d +?u?u?u?s?l?s?u?d +?u?u?u?s?l?s?s?d +?u?u?u?s?u?d?d?l +?u?u?u?s?u?d?l?d +?u?u?u?s?u?d?l?l +?u?u?u?s?u?d?l?u +?u?u?u?s?u?d?l?s +?u?u?u?s?u?d?u?l +?u?u?u?s?u?d?s?l +?u?u?u?s?u?l?d?d +?u?u?u?s?u?l?d?l +?u?u?u?s?u?l?d?u +?u?u?u?s?u?l?d?s +?u?u?u?s?u?l?l?d +?u?u?u?s?u?l?u?d +?u?u?u?s?u?l?s?d +?u?u?u?s?u?u?d?l +?u?u?u?s?u?u?l?d +?u?u?u?s?u?s?d?l +?u?u?u?s?u?s?l?d +?u?u?u?s?s?d?d?l +?u?u?u?s?s?d?l?d +?u?u?u?s?s?d?l?l +?u?u?u?s?s?d?l?u +?u?u?u?s?s?d?l?s +?u?u?u?s?s?d?u?l +?u?u?u?s?s?d?s?l +?u?u?u?s?s?l?d?d +?u?u?u?s?s?l?d?l +?u?u?u?s?s?l?d?u +?u?u?u?s?s?l?d?s +?u?u?u?s?s?l?l?d +?u?u?u?s?s?l?u?d +?u?u?u?s?s?l?s?d +?u?u?u?s?s?u?d?l +?u?u?u?s?s?u?l?d +?u?u?u?s?s?s?d?l +?u?u?u?s?s?s?l?d +?u?u?s?d?d?d?d?l +?u?u?s?d?d?d?l?d +?u?u?s?d?d?d?l?l +?u?u?s?d?d?d?l?u +?u?u?s?d?d?d?l?s +?u?u?s?d?d?d?u?l +?u?u?s?d?d?d?s?l +?u?u?s?d?d?l?d?d +?u?u?s?d?d?l?d?l +?u?u?s?d?d?l?d?u +?u?u?s?d?d?l?d?s +?u?u?s?d?d?l?l?d +?u?u?s?d?d?l?l?l +?u?u?s?d?d?l?l?u +?u?u?s?d?d?l?l?s +?u?u?s?d?d?l?u?d +?u?u?s?d?d?l?u?l +?u?u?s?d?d?l?u?u +?u?u?s?d?d?l?u?s +?u?u?s?d?d?l?s?d +?u?u?s?d?d?l?s?l +?u?u?s?d?d?l?s?u +?u?u?s?d?d?l?s?s +?u?u?s?d?d?u?d?l +?u?u?s?d?d?u?l?d +?u?u?s?d?d?u?l?l +?u?u?s?d?d?u?l?u +?u?u?s?d?d?u?l?s +?u?u?s?d?d?u?u?l +?u?u?s?d?d?u?s?l +?u?u?s?d?d?s?d?l +?u?u?s?d?d?s?l?d +?u?u?s?d?d?s?l?l +?u?u?s?d?d?s?l?u +?u?u?s?d?d?s?l?s +?u?u?s?d?d?s?u?l +?u?u?s?d?d?s?s?l +?u?u?s?d?l?d?d?d +?u?u?s?d?l?d?d?l +?u?u?s?d?l?d?d?u +?u?u?s?d?l?d?d?s +?u?u?s?d?l?d?l?d +?u?u?s?d?l?d?l?l +?u?u?s?d?l?d?l?u +?u?u?s?d?l?d?l?s +?u?u?s?d?l?d?u?d +?u?u?s?d?l?d?u?l +?u?u?s?d?l?d?u?u +?u?u?s?d?l?d?u?s +?u?u?s?d?l?d?s?d +?u?u?s?d?l?d?s?l +?u?u?s?d?l?d?s?u +?u?u?s?d?l?d?s?s +?u?u?s?d?l?l?d?d +?u?u?s?d?l?l?d?l +?u?u?s?d?l?l?d?u +?u?u?s?d?l?l?d?s +?u?u?s?d?l?l?l?d +?u?u?s?d?l?l?l?l +?u?u?s?d?l?l?l?u +?u?u?s?d?l?l?l?s +?u?u?s?d?l?l?u?d +?u?u?s?d?l?l?u?l +?u?u?s?d?l?l?u?u +?u?u?s?d?l?l?u?s +?u?u?s?d?l?l?s?d +?u?u?s?d?l?l?s?l +?u?u?s?d?l?l?s?u +?u?u?s?d?l?l?s?s +?u?u?s?d?l?u?d?d +?u?u?s?d?l?u?d?l +?u?u?s?d?l?u?d?u +?u?u?s?d?l?u?d?s +?u?u?s?d?l?u?l?d +?u?u?s?d?l?u?l?l +?u?u?s?d?l?u?l?u +?u?u?s?d?l?u?l?s +?u?u?s?d?l?u?u?d +?u?u?s?d?l?u?u?l +?u?u?s?d?l?u?u?u +?u?u?s?d?l?u?u?s +?u?u?s?d?l?u?s?d +?u?u?s?d?l?u?s?l +?u?u?s?d?l?u?s?u +?u?u?s?d?l?u?s?s +?u?u?s?d?l?s?d?d +?u?u?s?d?l?s?d?l +?u?u?s?d?l?s?d?u +?u?u?s?d?l?s?d?s +?u?u?s?d?l?s?l?d +?u?u?s?d?l?s?l?l +?u?u?s?d?l?s?l?u +?u?u?s?d?l?s?l?s +?u?u?s?d?l?s?u?d +?u?u?s?d?l?s?u?l +?u?u?s?d?l?s?u?u +?u?u?s?d?l?s?u?s +?u?u?s?d?l?s?s?d +?u?u?s?d?l?s?s?l +?u?u?s?d?l?s?s?u +?u?u?s?d?l?s?s?s +?u?u?s?d?u?d?d?l +?u?u?s?d?u?d?l?d +?u?u?s?d?u?d?l?l +?u?u?s?d?u?d?l?u +?u?u?s?d?u?d?l?s +?u?u?s?d?u?d?u?l +?u?u?s?d?u?d?s?l +?u?u?s?d?u?l?d?d +?u?u?s?d?u?l?d?l +?u?u?s?d?u?l?d?u +?u?u?s?d?u?l?d?s +?u?u?s?d?u?l?l?d +?u?u?s?d?u?l?l?l +?u?u?s?d?u?l?l?u +?u?u?s?d?u?l?l?s +?u?u?s?d?u?l?u?d +?u?u?s?d?u?l?u?l +?u?u?s?d?u?l?u?u +?u?u?s?d?u?l?u?s +?u?u?s?d?u?l?s?d +?u?u?s?d?u?l?s?l +?u?u?s?d?u?l?s?u +?u?u?s?d?u?l?s?s +?u?u?s?d?u?u?d?l +?u?u?s?d?u?u?l?d +?u?u?s?d?u?u?l?l +?u?u?s?d?u?u?l?u +?u?u?s?d?u?u?l?s +?u?u?s?d?u?u?u?l +?u?u?s?d?u?u?s?l +?u?u?s?d?u?s?d?l +?u?u?s?d?u?s?l?d +?u?u?s?d?u?s?l?l +?u?u?s?d?u?s?l?u +?u?u?s?d?u?s?l?s +?u?u?s?d?u?s?u?l +?u?u?s?d?u?s?s?l +?u?u?s?d?s?d?d?l +?u?u?s?d?s?d?l?d +?u?u?s?d?s?d?l?l +?u?u?s?d?s?d?l?u +?u?u?s?d?s?d?l?s +?u?u?s?d?s?d?u?l +?u?u?s?d?s?d?s?l +?u?u?s?d?s?l?d?d +?u?u?s?d?s?l?d?l +?u?u?s?d?s?l?d?u +?u?u?s?d?s?l?d?s +?u?u?s?d?s?l?l?d +?u?u?s?d?s?l?l?l +?u?u?s?d?s?l?l?u +?u?u?s?d?s?l?l?s +?u?u?s?d?s?l?u?d +?u?u?s?d?s?l?u?l +?u?u?s?d?s?l?u?u +?u?u?s?d?s?l?u?s +?u?u?s?d?s?l?s?d +?u?u?s?d?s?l?s?l +?u?u?s?d?s?l?s?u +?u?u?s?d?s?l?s?s +?u?u?s?d?s?u?d?l +?u?u?s?d?s?u?l?d +?u?u?s?d?s?u?l?l +?u?u?s?d?s?u?l?u +?u?u?s?d?s?u?l?s +?u?u?s?d?s?u?u?l +?u?u?s?d?s?u?s?l +?u?u?s?d?s?s?d?l +?u?u?s?d?s?s?l?d +?u?u?s?d?s?s?l?l +?u?u?s?d?s?s?l?u +?u?u?s?d?s?s?l?s +?u?u?s?d?s?s?u?l +?u?u?s?d?s?s?s?l +?u?u?s?l?d?d?d?d +?u?u?s?l?d?d?d?l +?u?u?s?l?d?d?d?u +?u?u?s?l?d?d?d?s +?u?u?s?l?d?d?l?d +?u?u?s?l?d?d?l?l +?u?u?s?l?d?d?l?u +?u?u?s?l?d?d?l?s +?u?u?s?l?d?d?u?d +?u?u?s?l?d?d?u?l +?u?u?s?l?d?d?u?u +?u?u?s?l?d?d?u?s +?u?u?s?l?d?d?s?d +?u?u?s?l?d?d?s?l +?u?u?s?l?d?d?s?u +?u?u?s?l?d?d?s?s +?u?u?s?l?d?l?d?d +?u?u?s?l?d?l?d?l +?u?u?s?l?d?l?d?u +?u?u?s?l?d?l?d?s +?u?u?s?l?d?l?l?d +?u?u?s?l?d?l?l?l +?u?u?s?l?d?l?l?u +?u?u?s?l?d?l?l?s +?u?u?s?l?d?l?u?d +?u?u?s?l?d?l?u?l +?u?u?s?l?d?l?u?u +?u?u?s?l?d?l?u?s +?u?u?s?l?d?l?s?d +?u?u?s?l?d?l?s?l +?u?u?s?l?d?l?s?u +?u?u?s?l?d?l?s?s +?u?u?s?l?d?u?d?d +?u?u?s?l?d?u?d?l +?u?u?s?l?d?u?d?u +?u?u?s?l?d?u?d?s +?u?u?s?l?d?u?l?d +?u?u?s?l?d?u?l?l +?u?u?s?l?d?u?l?u +?u?u?s?l?d?u?l?s +?u?u?s?l?d?u?u?d +?u?u?s?l?d?u?u?l +?u?u?s?l?d?u?u?u +?u?u?s?l?d?u?u?s +?u?u?s?l?d?u?s?d +?u?u?s?l?d?u?s?l +?u?u?s?l?d?u?s?u +?u?u?s?l?d?u?s?s +?u?u?s?l?d?s?d?d +?u?u?s?l?d?s?d?l +?u?u?s?l?d?s?d?u +?u?u?s?l?d?s?d?s +?u?u?s?l?d?s?l?d +?u?u?s?l?d?s?l?l +?u?u?s?l?d?s?l?u +?u?u?s?l?d?s?l?s +?u?u?s?l?d?s?u?d +?u?u?s?l?d?s?u?l +?u?u?s?l?d?s?u?u +?u?u?s?l?d?s?u?s +?u?u?s?l?d?s?s?d +?u?u?s?l?d?s?s?l +?u?u?s?l?d?s?s?u +?u?u?s?l?d?s?s?s +?u?u?s?l?l?d?d?d +?u?u?s?l?l?d?d?l +?u?u?s?l?l?d?d?u +?u?u?s?l?l?d?d?s +?u?u?s?l?l?d?l?d +?u?u?s?l?l?d?l?l +?u?u?s?l?l?d?l?u +?u?u?s?l?l?d?l?s +?u?u?s?l?l?d?u?d +?u?u?s?l?l?d?u?l +?u?u?s?l?l?d?u?u +?u?u?s?l?l?d?u?s +?u?u?s?l?l?d?s?d +?u?u?s?l?l?d?s?l +?u?u?s?l?l?d?s?u +?u?u?s?l?l?d?s?s +?u?u?s?l?l?l?d?d +?u?u?s?l?l?l?d?l +?u?u?s?l?l?l?d?u +?u?u?s?l?l?l?d?s +?u?u?s?l?l?l?l?d +?u?u?s?l?l?l?u?d +?u?u?s?l?l?l?s?d +?u?u?s?l?l?u?d?d +?u?u?s?l?l?u?d?l +?u?u?s?l?l?u?d?u +?u?u?s?l?l?u?d?s +?u?u?s?l?l?u?l?d +?u?u?s?l?l?u?u?d +?u?u?s?l?l?u?s?d +?u?u?s?l?l?s?d?d +?u?u?s?l?l?s?d?l +?u?u?s?l?l?s?d?u +?u?u?s?l?l?s?d?s +?u?u?s?l?l?s?l?d +?u?u?s?l?l?s?u?d +?u?u?s?l?l?s?s?d +?u?u?s?l?u?d?d?d +?u?u?s?l?u?d?d?l +?u?u?s?l?u?d?d?u +?u?u?s?l?u?d?d?s +?u?u?s?l?u?d?l?d +?u?u?s?l?u?d?l?l +?u?u?s?l?u?d?l?u +?u?u?s?l?u?d?l?s +?u?u?s?l?u?d?u?d +?u?u?s?l?u?d?u?l +?u?u?s?l?u?d?u?u +?u?u?s?l?u?d?u?s +?u?u?s?l?u?d?s?d +?u?u?s?l?u?d?s?l +?u?u?s?l?u?d?s?u +?u?u?s?l?u?d?s?s +?u?u?s?l?u?l?d?d +?u?u?s?l?u?l?d?l +?u?u?s?l?u?l?d?u +?u?u?s?l?u?l?d?s +?u?u?s?l?u?l?l?d +?u?u?s?l?u?l?u?d +?u?u?s?l?u?l?s?d +?u?u?s?l?u?u?d?d +?u?u?s?l?u?u?d?l +?u?u?s?l?u?u?d?u +?u?u?s?l?u?u?d?s +?u?u?s?l?u?u?l?d +?u?u?s?l?u?u?u?d +?u?u?s?l?u?u?s?d +?u?u?s?l?u?s?d?d +?u?u?s?l?u?s?d?l +?u?u?s?l?u?s?d?u +?u?u?s?l?u?s?d?s +?u?u?s?l?u?s?l?d +?u?u?s?l?u?s?u?d +?u?u?s?l?u?s?s?d +?u?u?s?l?s?d?d?d +?u?u?s?l?s?d?d?l +?u?u?s?l?s?d?d?u +?u?u?s?l?s?d?d?s +?u?u?s?l?s?d?l?d +?u?u?s?l?s?d?l?l +?u?u?s?l?s?d?l?u +?u?u?s?l?s?d?l?s +?u?u?s?l?s?d?u?d +?u?u?s?l?s?d?u?l +?u?u?s?l?s?d?u?u +?u?u?s?l?s?d?u?s +?u?u?s?l?s?d?s?d +?u?u?s?l?s?d?s?l +?u?u?s?l?s?d?s?u +?u?u?s?l?s?d?s?s +?u?u?s?l?s?l?d?d +?u?u?s?l?s?l?d?l +?u?u?s?l?s?l?d?u +?u?u?s?l?s?l?d?s +?u?u?s?l?s?l?l?d +?u?u?s?l?s?l?u?d +?u?u?s?l?s?l?s?d +?u?u?s?l?s?u?d?d +?u?u?s?l?s?u?d?l +?u?u?s?l?s?u?d?u +?u?u?s?l?s?u?d?s +?u?u?s?l?s?u?l?d +?u?u?s?l?s?u?u?d +?u?u?s?l?s?u?s?d +?u?u?s?l?s?s?d?d +?u?u?s?l?s?s?d?l +?u?u?s?l?s?s?d?u +?u?u?s?l?s?s?d?s +?u?u?s?l?s?s?l?d +?u?u?s?l?s?s?u?d +?u?u?s?l?s?s?s?d +?u?u?s?u?d?d?d?l +?u?u?s?u?d?d?l?d +?u?u?s?u?d?d?l?l +?u?u?s?u?d?d?l?u +?u?u?s?u?d?d?l?s +?u?u?s?u?d?d?u?l +?u?u?s?u?d?d?s?l +?u?u?s?u?d?l?d?d +?u?u?s?u?d?l?d?l +?u?u?s?u?d?l?d?u +?u?u?s?u?d?l?d?s +?u?u?s?u?d?l?l?d +?u?u?s?u?d?l?l?l +?u?u?s?u?d?l?l?u +?u?u?s?u?d?l?l?s +?u?u?s?u?d?l?u?d +?u?u?s?u?d?l?u?l +?u?u?s?u?d?l?u?u +?u?u?s?u?d?l?u?s +?u?u?s?u?d?l?s?d +?u?u?s?u?d?l?s?l +?u?u?s?u?d?l?s?u +?u?u?s?u?d?l?s?s +?u?u?s?u?d?u?d?l +?u?u?s?u?d?u?l?d +?u?u?s?u?d?u?l?l +?u?u?s?u?d?u?l?u +?u?u?s?u?d?u?l?s +?u?u?s?u?d?u?u?l +?u?u?s?u?d?u?s?l +?u?u?s?u?d?s?d?l +?u?u?s?u?d?s?l?d +?u?u?s?u?d?s?l?l +?u?u?s?u?d?s?l?u +?u?u?s?u?d?s?l?s +?u?u?s?u?d?s?u?l +?u?u?s?u?d?s?s?l +?u?u?s?u?l?d?d?d +?u?u?s?u?l?d?d?l +?u?u?s?u?l?d?d?u +?u?u?s?u?l?d?d?s +?u?u?s?u?l?d?l?d +?u?u?s?u?l?d?l?l +?u?u?s?u?l?d?l?u +?u?u?s?u?l?d?l?s +?u?u?s?u?l?d?u?d +?u?u?s?u?l?d?u?l +?u?u?s?u?l?d?u?u +?u?u?s?u?l?d?u?s +?u?u?s?u?l?d?s?d +?u?u?s?u?l?d?s?l +?u?u?s?u?l?d?s?u +?u?u?s?u?l?d?s?s +?u?u?s?u?l?l?d?d +?u?u?s?u?l?l?d?l +?u?u?s?u?l?l?d?u +?u?u?s?u?l?l?d?s +?u?u?s?u?l?l?l?d +?u?u?s?u?l?l?u?d +?u?u?s?u?l?l?s?d +?u?u?s?u?l?u?d?d +?u?u?s?u?l?u?d?l +?u?u?s?u?l?u?d?u +?u?u?s?u?l?u?d?s +?u?u?s?u?l?u?l?d +?u?u?s?u?l?u?u?d +?u?u?s?u?l?u?s?d +?u?u?s?u?l?s?d?d +?u?u?s?u?l?s?d?l +?u?u?s?u?l?s?d?u +?u?u?s?u?l?s?d?s +?u?u?s?u?l?s?l?d +?u?u?s?u?l?s?u?d +?u?u?s?u?l?s?s?d +?u?u?s?u?u?d?d?l +?u?u?s?u?u?d?l?d +?u?u?s?u?u?d?l?l +?u?u?s?u?u?d?l?u +?u?u?s?u?u?d?l?s +?u?u?s?u?u?d?u?l +?u?u?s?u?u?d?s?l +?u?u?s?u?u?l?d?d +?u?u?s?u?u?l?d?l +?u?u?s?u?u?l?d?u +?u?u?s?u?u?l?d?s +?u?u?s?u?u?l?l?d +?u?u?s?u?u?l?u?d +?u?u?s?u?u?l?s?d +?u?u?s?u?u?u?d?l +?u?u?s?u?u?u?l?d +?u?u?s?u?u?s?d?l +?u?u?s?u?u?s?l?d +?u?u?s?u?s?d?d?l +?u?u?s?u?s?d?l?d +?u?u?s?u?s?d?l?l +?u?u?s?u?s?d?l?u +?u?u?s?u?s?d?l?s +?u?u?s?u?s?d?u?l +?u?u?s?u?s?d?s?l +?u?u?s?u?s?l?d?d +?u?u?s?u?s?l?d?l +?u?u?s?u?s?l?d?u +?u?u?s?u?s?l?d?s +?u?u?s?u?s?l?l?d +?u?u?s?u?s?l?u?d +?u?u?s?u?s?l?s?d +?u?u?s?u?s?u?d?l +?u?u?s?u?s?u?l?d +?u?u?s?u?s?s?d?l +?u?u?s?u?s?s?l?d +?u?u?s?s?d?d?d?l +?u?u?s?s?d?d?l?d +?u?u?s?s?d?d?l?l +?u?u?s?s?d?d?l?u +?u?u?s?s?d?d?l?s +?u?u?s?s?d?d?u?l +?u?u?s?s?d?d?s?l +?u?u?s?s?d?l?d?d +?u?u?s?s?d?l?d?l +?u?u?s?s?d?l?d?u +?u?u?s?s?d?l?d?s +?u?u?s?s?d?l?l?d +?u?u?s?s?d?l?l?l +?u?u?s?s?d?l?l?u +?u?u?s?s?d?l?l?s +?u?u?s?s?d?l?u?d +?u?u?s?s?d?l?u?l +?u?u?s?s?d?l?u?u +?u?u?s?s?d?l?u?s +?u?u?s?s?d?l?s?d +?u?u?s?s?d?l?s?l +?u?u?s?s?d?l?s?u +?u?u?s?s?d?l?s?s +?u?u?s?s?d?u?d?l +?u?u?s?s?d?u?l?d +?u?u?s?s?d?u?l?l +?u?u?s?s?d?u?l?u +?u?u?s?s?d?u?l?s +?u?u?s?s?d?u?u?l +?u?u?s?s?d?u?s?l +?u?u?s?s?d?s?d?l +?u?u?s?s?d?s?l?d +?u?u?s?s?d?s?l?l +?u?u?s?s?d?s?l?u +?u?u?s?s?d?s?l?s +?u?u?s?s?d?s?u?l +?u?u?s?s?d?s?s?l +?u?u?s?s?l?d?d?d +?u?u?s?s?l?d?d?l +?u?u?s?s?l?d?d?u +?u?u?s?s?l?d?d?s +?u?u?s?s?l?d?l?d +?u?u?s?s?l?d?l?l +?u?u?s?s?l?d?l?u +?u?u?s?s?l?d?l?s +?u?u?s?s?l?d?u?d +?u?u?s?s?l?d?u?l +?u?u?s?s?l?d?u?u +?u?u?s?s?l?d?u?s +?u?u?s?s?l?d?s?d +?u?u?s?s?l?d?s?l +?u?u?s?s?l?d?s?u +?u?u?s?s?l?d?s?s +?u?u?s?s?l?l?d?d +?u?u?s?s?l?l?d?l +?u?u?s?s?l?l?d?u +?u?u?s?s?l?l?d?s +?u?u?s?s?l?l?l?d +?u?u?s?s?l?l?u?d +?u?u?s?s?l?l?s?d +?u?u?s?s?l?u?d?d +?u?u?s?s?l?u?d?l +?u?u?s?s?l?u?d?u +?u?u?s?s?l?u?d?s +?u?u?s?s?l?u?l?d +?u?u?s?s?l?u?u?d +?u?u?s?s?l?u?s?d +?u?u?s?s?l?s?d?d +?u?u?s?s?l?s?d?l +?u?u?s?s?l?s?d?u +?u?u?s?s?l?s?d?s +?u?u?s?s?l?s?l?d +?u?u?s?s?l?s?u?d +?u?u?s?s?l?s?s?d +?u?u?s?s?u?d?d?l +?u?u?s?s?u?d?l?d +?u?u?s?s?u?d?l?l +?u?u?s?s?u?d?l?u +?u?u?s?s?u?d?l?s +?u?u?s?s?u?d?u?l +?u?u?s?s?u?d?s?l +?u?u?s?s?u?l?d?d +?u?u?s?s?u?l?d?l +?u?u?s?s?u?l?d?u +?u?u?s?s?u?l?d?s +?u?u?s?s?u?l?l?d +?u?u?s?s?u?l?u?d +?u?u?s?s?u?l?s?d +?u?u?s?s?u?u?d?l +?u?u?s?s?u?u?l?d +?u?u?s?s?u?s?d?l +?u?u?s?s?u?s?l?d +?u?u?s?s?s?d?d?l +?u?u?s?s?s?d?l?d +?u?u?s?s?s?d?l?l +?u?u?s?s?s?d?l?u +?u?u?s?s?s?d?l?s +?u?u?s?s?s?d?u?l +?u?u?s?s?s?d?s?l +?u?u?s?s?s?l?d?d +?u?u?s?s?s?l?d?l +?u?u?s?s?s?l?d?u +?u?u?s?s?s?l?d?s +?u?u?s?s?s?l?l?d +?u?u?s?s?s?l?u?d +?u?u?s?s?s?l?s?d +?u?u?s?s?s?u?d?l +?u?u?s?s?s?u?l?d +?u?u?s?s?s?s?d?l +?u?u?s?s?s?s?l?d +?u?s?d?d?d?d?d?l +?u?s?d?d?d?d?l?d +?u?s?d?d?d?d?l?l +?u?s?d?d?d?d?l?u +?u?s?d?d?d?d?l?s +?u?s?d?d?d?d?u?l +?u?s?d?d?d?d?s?l +?u?s?d?d?d?l?d?d +?u?s?d?d?d?l?d?l +?u?s?d?d?d?l?d?u +?u?s?d?d?d?l?d?s +?u?s?d?d?d?l?l?d +?u?s?d?d?d?l?l?l +?u?s?d?d?d?l?l?u +?u?s?d?d?d?l?l?s +?u?s?d?d?d?l?u?d +?u?s?d?d?d?l?u?l +?u?s?d?d?d?l?u?u +?u?s?d?d?d?l?u?s +?u?s?d?d?d?l?s?d +?u?s?d?d?d?l?s?l +?u?s?d?d?d?l?s?u +?u?s?d?d?d?l?s?s +?u?s?d?d?d?u?d?l +?u?s?d?d?d?u?l?d +?u?s?d?d?d?u?l?l +?u?s?d?d?d?u?l?u +?u?s?d?d?d?u?l?s +?u?s?d?d?d?u?u?l +?u?s?d?d?d?u?s?l +?u?s?d?d?d?s?d?l +?u?s?d?d?d?s?l?d +?u?s?d?d?d?s?l?l +?u?s?d?d?d?s?l?u +?u?s?d?d?d?s?l?s +?u?s?d?d?d?s?u?l +?u?s?d?d?d?s?s?l +?u?s?d?d?l?d?d?d +?u?s?d?d?l?d?d?l +?u?s?d?d?l?d?d?u +?u?s?d?d?l?d?d?s +?u?s?d?d?l?d?l?d +?u?s?d?d?l?d?l?l +?u?s?d?d?l?d?l?u +?u?s?d?d?l?d?l?s +?u?s?d?d?l?d?u?d +?u?s?d?d?l?d?u?l +?u?s?d?d?l?d?u?u +?u?s?d?d?l?d?u?s +?u?s?d?d?l?d?s?d +?u?s?d?d?l?d?s?l +?u?s?d?d?l?d?s?u +?u?s?d?d?l?d?s?s +?u?s?d?d?l?l?d?d +?u?s?d?d?l?l?d?l +?u?s?d?d?l?l?d?u +?u?s?d?d?l?l?d?s +?u?s?d?d?l?l?l?d +?u?s?d?d?l?l?l?l +?u?s?d?d?l?l?l?u +?u?s?d?d?l?l?l?s +?u?s?d?d?l?l?u?d +?u?s?d?d?l?l?u?l +?u?s?d?d?l?l?u?u +?u?s?d?d?l?l?u?s +?u?s?d?d?l?l?s?d +?u?s?d?d?l?l?s?l +?u?s?d?d?l?l?s?u +?u?s?d?d?l?l?s?s +?u?s?d?d?l?u?d?d +?u?s?d?d?l?u?d?l +?u?s?d?d?l?u?d?u +?u?s?d?d?l?u?d?s +?u?s?d?d?l?u?l?d +?u?s?d?d?l?u?l?l +?u?s?d?d?l?u?l?u +?u?s?d?d?l?u?l?s +?u?s?d?d?l?u?u?d +?u?s?d?d?l?u?u?l +?u?s?d?d?l?u?u?u +?u?s?d?d?l?u?u?s +?u?s?d?d?l?u?s?d +?u?s?d?d?l?u?s?l +?u?s?d?d?l?u?s?u +?u?s?d?d?l?u?s?s +?u?s?d?d?l?s?d?d +?u?s?d?d?l?s?d?l +?u?s?d?d?l?s?d?u +?u?s?d?d?l?s?d?s +?u?s?d?d?l?s?l?d +?u?s?d?d?l?s?l?l +?u?s?d?d?l?s?l?u +?u?s?d?d?l?s?l?s +?u?s?d?d?l?s?u?d +?u?s?d?d?l?s?u?l +?u?s?d?d?l?s?u?u +?u?s?d?d?l?s?u?s +?u?s?d?d?l?s?s?d +?u?s?d?d?l?s?s?l +?u?s?d?d?l?s?s?u +?u?s?d?d?l?s?s?s +?u?s?d?d?u?d?d?l +?u?s?d?d?u?d?l?d +?u?s?d?d?u?d?l?l +?u?s?d?d?u?d?l?u +?u?s?d?d?u?d?l?s +?u?s?d?d?u?d?u?l +?u?s?d?d?u?d?s?l +?u?s?d?d?u?l?d?d +?u?s?d?d?u?l?d?l +?u?s?d?d?u?l?d?u +?u?s?d?d?u?l?d?s +?u?s?d?d?u?l?l?d +?u?s?d?d?u?l?l?l +?u?s?d?d?u?l?l?u +?u?s?d?d?u?l?l?s +?u?s?d?d?u?l?u?d +?u?s?d?d?u?l?u?l +?u?s?d?d?u?l?u?u +?u?s?d?d?u?l?u?s +?u?s?d?d?u?l?s?d +?u?s?d?d?u?l?s?l +?u?s?d?d?u?l?s?u +?u?s?d?d?u?l?s?s +?u?s?d?d?u?u?d?l +?u?s?d?d?u?u?l?d +?u?s?d?d?u?u?l?l +?u?s?d?d?u?u?l?u +?u?s?d?d?u?u?l?s +?u?s?d?d?u?u?u?l +?u?s?d?d?u?u?s?l +?u?s?d?d?u?s?d?l +?u?s?d?d?u?s?l?d +?u?s?d?d?u?s?l?l +?u?s?d?d?u?s?l?u +?u?s?d?d?u?s?l?s +?u?s?d?d?u?s?u?l +?u?s?d?d?u?s?s?l +?u?s?d?d?s?d?d?l +?u?s?d?d?s?d?l?d +?u?s?d?d?s?d?l?l +?u?s?d?d?s?d?l?u +?u?s?d?d?s?d?l?s +?u?s?d?d?s?d?u?l +?u?s?d?d?s?d?s?l +?u?s?d?d?s?l?d?d +?u?s?d?d?s?l?d?l +?u?s?d?d?s?l?d?u +?u?s?d?d?s?l?d?s +?u?s?d?d?s?l?l?d +?u?s?d?d?s?l?l?l +?u?s?d?d?s?l?l?u +?u?s?d?d?s?l?l?s +?u?s?d?d?s?l?u?d +?u?s?d?d?s?l?u?l +?u?s?d?d?s?l?u?u +?u?s?d?d?s?l?u?s +?u?s?d?d?s?l?s?d +?u?s?d?d?s?l?s?l +?u?s?d?d?s?l?s?u +?u?s?d?d?s?l?s?s +?u?s?d?d?s?u?d?l +?u?s?d?d?s?u?l?d +?u?s?d?d?s?u?l?l +?u?s?d?d?s?u?l?u +?u?s?d?d?s?u?l?s +?u?s?d?d?s?u?u?l +?u?s?d?d?s?u?s?l +?u?s?d?d?s?s?d?l +?u?s?d?d?s?s?l?d +?u?s?d?d?s?s?l?l +?u?s?d?d?s?s?l?u +?u?s?d?d?s?s?l?s +?u?s?d?d?s?s?u?l +?u?s?d?d?s?s?s?l +?u?s?d?l?d?d?d?d +?u?s?d?l?d?d?d?l +?u?s?d?l?d?d?d?u +?u?s?d?l?d?d?d?s +?u?s?d?l?d?d?l?d +?u?s?d?l?d?d?l?l +?u?s?d?l?d?d?l?u +?u?s?d?l?d?d?l?s +?u?s?d?l?d?d?u?d +?u?s?d?l?d?d?u?l +?u?s?d?l?d?d?u?u +?u?s?d?l?d?d?u?s +?u?s?d?l?d?d?s?d +?u?s?d?l?d?d?s?l +?u?s?d?l?d?d?s?u +?u?s?d?l?d?d?s?s +?u?s?d?l?d?l?d?d +?u?s?d?l?d?l?d?l +?u?s?d?l?d?l?d?u +?u?s?d?l?d?l?d?s +?u?s?d?l?d?l?l?d +?u?s?d?l?d?l?l?l +?u?s?d?l?d?l?l?u +?u?s?d?l?d?l?l?s +?u?s?d?l?d?l?u?d +?u?s?d?l?d?l?u?l +?u?s?d?l?d?l?u?u +?u?s?d?l?d?l?u?s +?u?s?d?l?d?l?s?d +?u?s?d?l?d?l?s?l +?u?s?d?l?d?l?s?u +?u?s?d?l?d?l?s?s +?u?s?d?l?d?u?d?d +?u?s?d?l?d?u?d?l +?u?s?d?l?d?u?d?u +?u?s?d?l?d?u?d?s +?u?s?d?l?d?u?l?d +?u?s?d?l?d?u?l?l +?u?s?d?l?d?u?l?u +?u?s?d?l?d?u?l?s +?u?s?d?l?d?u?u?d +?u?s?d?l?d?u?u?l +?u?s?d?l?d?u?u?u +?u?s?d?l?d?u?u?s +?u?s?d?l?d?u?s?d +?u?s?d?l?d?u?s?l +?u?s?d?l?d?u?s?u +?u?s?d?l?d?u?s?s +?u?s?d?l?d?s?d?d +?u?s?d?l?d?s?d?l +?u?s?d?l?d?s?d?u +?u?s?d?l?d?s?d?s +?u?s?d?l?d?s?l?d +?u?s?d?l?d?s?l?l +?u?s?d?l?d?s?l?u +?u?s?d?l?d?s?l?s +?u?s?d?l?d?s?u?d +?u?s?d?l?d?s?u?l +?u?s?d?l?d?s?u?u +?u?s?d?l?d?s?u?s +?u?s?d?l?d?s?s?d +?u?s?d?l?d?s?s?l +?u?s?d?l?d?s?s?u +?u?s?d?l?d?s?s?s +?u?s?d?l?l?d?d?d +?u?s?d?l?l?d?d?l +?u?s?d?l?l?d?d?u +?u?s?d?l?l?d?d?s +?u?s?d?l?l?d?l?d +?u?s?d?l?l?d?l?l +?u?s?d?l?l?d?l?u +?u?s?d?l?l?d?l?s +?u?s?d?l?l?d?u?d +?u?s?d?l?l?d?u?l +?u?s?d?l?l?d?u?u +?u?s?d?l?l?d?u?s +?u?s?d?l?l?d?s?d +?u?s?d?l?l?d?s?l +?u?s?d?l?l?d?s?u +?u?s?d?l?l?d?s?s +?u?s?d?l?l?l?d?d +?u?s?d?l?l?l?d?l +?u?s?d?l?l?l?d?u +?u?s?d?l?l?l?d?s +?u?s?d?l?l?l?l?d +?u?s?d?l?l?l?l?l +?u?s?d?l?l?l?l?u +?u?s?d?l?l?l?l?s +?u?s?d?l?l?l?u?d +?u?s?d?l?l?l?u?l +?u?s?d?l?l?l?u?u +?u?s?d?l?l?l?u?s +?u?s?d?l?l?l?s?d +?u?s?d?l?l?l?s?l +?u?s?d?l?l?l?s?u +?u?s?d?l?l?l?s?s +?u?s?d?l?l?u?d?d +?u?s?d?l?l?u?d?l +?u?s?d?l?l?u?d?u +?u?s?d?l?l?u?d?s +?u?s?d?l?l?u?l?d +?u?s?d?l?l?u?l?l +?u?s?d?l?l?u?l?u +?u?s?d?l?l?u?l?s +?u?s?d?l?l?u?u?d +?u?s?d?l?l?u?u?l +?u?s?d?l?l?u?u?u +?u?s?d?l?l?u?u?s +?u?s?d?l?l?u?s?d +?u?s?d?l?l?u?s?l +?u?s?d?l?l?u?s?u +?u?s?d?l?l?u?s?s +?u?s?d?l?l?s?d?d +?u?s?d?l?l?s?d?l +?u?s?d?l?l?s?d?u +?u?s?d?l?l?s?d?s +?u?s?d?l?l?s?l?d +?u?s?d?l?l?s?l?l +?u?s?d?l?l?s?l?u +?u?s?d?l?l?s?l?s +?u?s?d?l?l?s?u?d +?u?s?d?l?l?s?u?l +?u?s?d?l?l?s?u?u +?u?s?d?l?l?s?u?s +?u?s?d?l?l?s?s?d +?u?s?d?l?l?s?s?l +?u?s?d?l?l?s?s?u +?u?s?d?l?l?s?s?s +?u?s?d?l?u?d?d?d +?u?s?d?l?u?d?d?l +?u?s?d?l?u?d?d?u +?u?s?d?l?u?d?d?s +?u?s?d?l?u?d?l?d +?u?s?d?l?u?d?l?l +?u?s?d?l?u?d?l?u +?u?s?d?l?u?d?l?s +?u?s?d?l?u?d?u?d +?u?s?d?l?u?d?u?l +?u?s?d?l?u?d?u?u +?u?s?d?l?u?d?u?s +?u?s?d?l?u?d?s?d +?u?s?d?l?u?d?s?l +?u?s?d?l?u?d?s?u +?u?s?d?l?u?d?s?s +?u?s?d?l?u?l?d?d +?u?s?d?l?u?l?d?l +?u?s?d?l?u?l?d?u +?u?s?d?l?u?l?d?s +?u?s?d?l?u?l?l?d +?u?s?d?l?u?l?l?l +?u?s?d?l?u?l?l?u +?u?s?d?l?u?l?l?s +?u?s?d?l?u?l?u?d +?u?s?d?l?u?l?u?l +?u?s?d?l?u?l?u?u +?u?s?d?l?u?l?u?s +?u?s?d?l?u?l?s?d +?u?s?d?l?u?l?s?l +?u?s?d?l?u?l?s?u +?u?s?d?l?u?l?s?s +?u?s?d?l?u?u?d?d +?u?s?d?l?u?u?d?l +?u?s?d?l?u?u?d?u +?u?s?d?l?u?u?d?s +?u?s?d?l?u?u?l?d +?u?s?d?l?u?u?l?l +?u?s?d?l?u?u?l?u +?u?s?d?l?u?u?l?s +?u?s?d?l?u?u?u?d +?u?s?d?l?u?u?u?l +?u?s?d?l?u?u?u?u +?u?s?d?l?u?u?u?s +?u?s?d?l?u?u?s?d +?u?s?d?l?u?u?s?l +?u?s?d?l?u?u?s?u +?u?s?d?l?u?u?s?s +?u?s?d?l?u?s?d?d +?u?s?d?l?u?s?d?l +?u?s?d?l?u?s?d?u +?u?s?d?l?u?s?d?s +?u?s?d?l?u?s?l?d +?u?s?d?l?u?s?l?l +?u?s?d?l?u?s?l?u +?u?s?d?l?u?s?l?s +?u?s?d?l?u?s?u?d +?u?s?d?l?u?s?u?l +?u?s?d?l?u?s?u?u +?u?s?d?l?u?s?u?s +?u?s?d?l?u?s?s?d +?u?s?d?l?u?s?s?l +?u?s?d?l?u?s?s?u +?u?s?d?l?u?s?s?s +?u?s?d?l?s?d?d?d +?u?s?d?l?s?d?d?l +?u?s?d?l?s?d?d?u +?u?s?d?l?s?d?d?s +?u?s?d?l?s?d?l?d +?u?s?d?l?s?d?l?l +?u?s?d?l?s?d?l?u +?u?s?d?l?s?d?l?s +?u?s?d?l?s?d?u?d +?u?s?d?l?s?d?u?l +?u?s?d?l?s?d?u?u +?u?s?d?l?s?d?u?s +?u?s?d?l?s?d?s?d +?u?s?d?l?s?d?s?l +?u?s?d?l?s?d?s?u +?u?s?d?l?s?d?s?s +?u?s?d?l?s?l?d?d +?u?s?d?l?s?l?d?l +?u?s?d?l?s?l?d?u +?u?s?d?l?s?l?d?s +?u?s?d?l?s?l?l?d +?u?s?d?l?s?l?l?l +?u?s?d?l?s?l?l?u +?u?s?d?l?s?l?l?s +?u?s?d?l?s?l?u?d +?u?s?d?l?s?l?u?l +?u?s?d?l?s?l?u?u +?u?s?d?l?s?l?u?s +?u?s?d?l?s?l?s?d +?u?s?d?l?s?l?s?l +?u?s?d?l?s?l?s?u +?u?s?d?l?s?l?s?s +?u?s?d?l?s?u?d?d +?u?s?d?l?s?u?d?l +?u?s?d?l?s?u?d?u +?u?s?d?l?s?u?d?s +?u?s?d?l?s?u?l?d +?u?s?d?l?s?u?l?l +?u?s?d?l?s?u?l?u +?u?s?d?l?s?u?l?s +?u?s?d?l?s?u?u?d +?u?s?d?l?s?u?u?l +?u?s?d?l?s?u?u?u +?u?s?d?l?s?u?u?s +?u?s?d?l?s?u?s?d +?u?s?d?l?s?u?s?l +?u?s?d?l?s?u?s?u +?u?s?d?l?s?u?s?s +?u?s?d?l?s?s?d?d +?u?s?d?l?s?s?d?l +?u?s?d?l?s?s?d?u +?u?s?d?l?s?s?d?s +?u?s?d?l?s?s?l?d +?u?s?d?l?s?s?l?l +?u?s?d?l?s?s?l?u +?u?s?d?l?s?s?l?s +?u?s?d?l?s?s?u?d +?u?s?d?l?s?s?u?l +?u?s?d?l?s?s?u?u +?u?s?d?l?s?s?u?s +?u?s?d?l?s?s?s?d +?u?s?d?l?s?s?s?l +?u?s?d?l?s?s?s?u +?u?s?d?l?s?s?s?s +?u?s?d?u?d?d?d?l +?u?s?d?u?d?d?l?d +?u?s?d?u?d?d?l?l +?u?s?d?u?d?d?l?u +?u?s?d?u?d?d?l?s +?u?s?d?u?d?d?u?l +?u?s?d?u?d?d?s?l +?u?s?d?u?d?l?d?d +?u?s?d?u?d?l?d?l +?u?s?d?u?d?l?d?u +?u?s?d?u?d?l?d?s +?u?s?d?u?d?l?l?d +?u?s?d?u?d?l?l?l +?u?s?d?u?d?l?l?u +?u?s?d?u?d?l?l?s +?u?s?d?u?d?l?u?d +?u?s?d?u?d?l?u?l +?u?s?d?u?d?l?u?u +?u?s?d?u?d?l?u?s +?u?s?d?u?d?l?s?d +?u?s?d?u?d?l?s?l +?u?s?d?u?d?l?s?u +?u?s?d?u?d?l?s?s +?u?s?d?u?d?u?d?l +?u?s?d?u?d?u?l?d +?u?s?d?u?d?u?l?l +?u?s?d?u?d?u?l?u +?u?s?d?u?d?u?l?s +?u?s?d?u?d?u?u?l +?u?s?d?u?d?u?s?l +?u?s?d?u?d?s?d?l +?u?s?d?u?d?s?l?d +?u?s?d?u?d?s?l?l +?u?s?d?u?d?s?l?u +?u?s?d?u?d?s?l?s +?u?s?d?u?d?s?u?l +?u?s?d?u?d?s?s?l +?u?s?d?u?l?d?d?d +?u?s?d?u?l?d?d?l +?u?s?d?u?l?d?d?u +?u?s?d?u?l?d?d?s +?u?s?d?u?l?d?l?d +?u?s?d?u?l?d?l?l +?u?s?d?u?l?d?l?u +?u?s?d?u?l?d?l?s +?u?s?d?u?l?d?u?d +?u?s?d?u?l?d?u?l +?u?s?d?u?l?d?u?u +?u?s?d?u?l?d?u?s +?u?s?d?u?l?d?s?d +?u?s?d?u?l?d?s?l +?u?s?d?u?l?d?s?u +?u?s?d?u?l?d?s?s +?u?s?d?u?l?l?d?d +?u?s?d?u?l?l?d?l +?u?s?d?u?l?l?d?u +?u?s?d?u?l?l?d?s +?u?s?d?u?l?l?l?d +?u?s?d?u?l?l?l?l +?u?s?d?u?l?l?l?u +?u?s?d?u?l?l?l?s +?u?s?d?u?l?l?u?d +?u?s?d?u?l?l?u?l +?u?s?d?u?l?l?u?u +?u?s?d?u?l?l?u?s +?u?s?d?u?l?l?s?d +?u?s?d?u?l?l?s?l +?u?s?d?u?l?l?s?u +?u?s?d?u?l?l?s?s +?u?s?d?u?l?u?d?d +?u?s?d?u?l?u?d?l +?u?s?d?u?l?u?d?u +?u?s?d?u?l?u?d?s +?u?s?d?u?l?u?l?d +?u?s?d?u?l?u?l?l +?u?s?d?u?l?u?l?u +?u?s?d?u?l?u?l?s +?u?s?d?u?l?u?u?d +?u?s?d?u?l?u?u?l +?u?s?d?u?l?u?u?u +?u?s?d?u?l?u?u?s +?u?s?d?u?l?u?s?d +?u?s?d?u?l?u?s?l +?u?s?d?u?l?u?s?u +?u?s?d?u?l?u?s?s +?u?s?d?u?l?s?d?d +?u?s?d?u?l?s?d?l +?u?s?d?u?l?s?d?u +?u?s?d?u?l?s?d?s +?u?s?d?u?l?s?l?d +?u?s?d?u?l?s?l?l +?u?s?d?u?l?s?l?u +?u?s?d?u?l?s?l?s +?u?s?d?u?l?s?u?d +?u?s?d?u?l?s?u?l +?u?s?d?u?l?s?u?u +?u?s?d?u?l?s?u?s +?u?s?d?u?l?s?s?d +?u?s?d?u?l?s?s?l +?u?s?d?u?l?s?s?u +?u?s?d?u?l?s?s?s +?u?s?d?u?u?d?d?l +?u?s?d?u?u?d?l?d +?u?s?d?u?u?d?l?l +?u?s?d?u?u?d?l?u +?u?s?d?u?u?d?l?s +?u?s?d?u?u?d?u?l +?u?s?d?u?u?d?s?l +?u?s?d?u?u?l?d?d +?u?s?d?u?u?l?d?l +?u?s?d?u?u?l?d?u +?u?s?d?u?u?l?d?s +?u?s?d?u?u?l?l?d +?u?s?d?u?u?l?l?l +?u?s?d?u?u?l?l?u +?u?s?d?u?u?l?l?s +?u?s?d?u?u?l?u?d +?u?s?d?u?u?l?u?l +?u?s?d?u?u?l?u?u +?u?s?d?u?u?l?u?s +?u?s?d?u?u?l?s?d +?u?s?d?u?u?l?s?l +?u?s?d?u?u?l?s?u +?u?s?d?u?u?l?s?s +?u?s?d?u?u?u?d?l +?u?s?d?u?u?u?l?d +?u?s?d?u?u?u?l?l +?u?s?d?u?u?u?l?u +?u?s?d?u?u?u?l?s +?u?s?d?u?u?u?u?l +?u?s?d?u?u?u?s?l +?u?s?d?u?u?s?d?l +?u?s?d?u?u?s?l?d +?u?s?d?u?u?s?l?l +?u?s?d?u?u?s?l?u +?u?s?d?u?u?s?l?s +?u?s?d?u?u?s?u?l +?u?s?d?u?u?s?s?l +?u?s?d?u?s?d?d?l +?u?s?d?u?s?d?l?d +?u?s?d?u?s?d?l?l +?u?s?d?u?s?d?l?u +?u?s?d?u?s?d?l?s +?u?s?d?u?s?d?u?l +?u?s?d?u?s?d?s?l +?u?s?d?u?s?l?d?d +?u?s?d?u?s?l?d?l +?u?s?d?u?s?l?d?u +?u?s?d?u?s?l?d?s +?u?s?d?u?s?l?l?d +?u?s?d?u?s?l?l?l +?u?s?d?u?s?l?l?u +?u?s?d?u?s?l?l?s +?u?s?d?u?s?l?u?d +?u?s?d?u?s?l?u?l +?u?s?d?u?s?l?u?u +?u?s?d?u?s?l?u?s +?u?s?d?u?s?l?s?d +?u?s?d?u?s?l?s?l +?u?s?d?u?s?l?s?u +?u?s?d?u?s?l?s?s +?u?s?d?u?s?u?d?l +?u?s?d?u?s?u?l?d +?u?s?d?u?s?u?l?l +?u?s?d?u?s?u?l?u +?u?s?d?u?s?u?l?s +?u?s?d?u?s?u?u?l +?u?s?d?u?s?u?s?l +?u?s?d?u?s?s?d?l +?u?s?d?u?s?s?l?d +?u?s?d?u?s?s?l?l +?u?s?d?u?s?s?l?u +?u?s?d?u?s?s?l?s +?u?s?d?u?s?s?u?l +?u?s?d?u?s?s?s?l +?u?s?d?s?d?d?d?l +?u?s?d?s?d?d?l?d +?u?s?d?s?d?d?l?l +?u?s?d?s?d?d?l?u +?u?s?d?s?d?d?l?s +?u?s?d?s?d?d?u?l +?u?s?d?s?d?d?s?l +?u?s?d?s?d?l?d?d +?u?s?d?s?d?l?d?l +?u?s?d?s?d?l?d?u +?u?s?d?s?d?l?d?s +?u?s?d?s?d?l?l?d +?u?s?d?s?d?l?l?l +?u?s?d?s?d?l?l?u +?u?s?d?s?d?l?l?s +?u?s?d?s?d?l?u?d +?u?s?d?s?d?l?u?l +?u?s?d?s?d?l?u?u +?u?s?d?s?d?l?u?s +?u?s?d?s?d?l?s?d +?u?s?d?s?d?l?s?l +?u?s?d?s?d?l?s?u +?u?s?d?s?d?l?s?s +?u?s?d?s?d?u?d?l +?u?s?d?s?d?u?l?d +?u?s?d?s?d?u?l?l +?u?s?d?s?d?u?l?u +?u?s?d?s?d?u?l?s +?u?s?d?s?d?u?u?l +?u?s?d?s?d?u?s?l +?u?s?d?s?d?s?d?l +?u?s?d?s?d?s?l?d +?u?s?d?s?d?s?l?l +?u?s?d?s?d?s?l?u +?u?s?d?s?d?s?l?s +?u?s?d?s?d?s?u?l +?u?s?d?s?d?s?s?l +?u?s?d?s?l?d?d?d +?u?s?d?s?l?d?d?l +?u?s?d?s?l?d?d?u +?u?s?d?s?l?d?d?s +?u?s?d?s?l?d?l?d +?u?s?d?s?l?d?l?l +?u?s?d?s?l?d?l?u +?u?s?d?s?l?d?l?s +?u?s?d?s?l?d?u?d +?u?s?d?s?l?d?u?l +?u?s?d?s?l?d?u?u +?u?s?d?s?l?d?u?s +?u?s?d?s?l?d?s?d +?u?s?d?s?l?d?s?l +?u?s?d?s?l?d?s?u +?u?s?d?s?l?d?s?s +?u?s?d?s?l?l?d?d +?u?s?d?s?l?l?d?l +?u?s?d?s?l?l?d?u +?u?s?d?s?l?l?d?s +?u?s?d?s?l?l?l?d +?u?s?d?s?l?l?l?l +?u?s?d?s?l?l?l?u +?u?s?d?s?l?l?l?s +?u?s?d?s?l?l?u?d +?u?s?d?s?l?l?u?l +?u?s?d?s?l?l?u?u +?u?s?d?s?l?l?u?s +?u?s?d?s?l?l?s?d +?u?s?d?s?l?l?s?l +?u?s?d?s?l?l?s?u +?u?s?d?s?l?l?s?s +?u?s?d?s?l?u?d?d +?u?s?d?s?l?u?d?l +?u?s?d?s?l?u?d?u +?u?s?d?s?l?u?d?s +?u?s?d?s?l?u?l?d +?u?s?d?s?l?u?l?l +?u?s?d?s?l?u?l?u +?u?s?d?s?l?u?l?s +?u?s?d?s?l?u?u?d +?u?s?d?s?l?u?u?l +?u?s?d?s?l?u?u?u +?u?s?d?s?l?u?u?s +?u?s?d?s?l?u?s?d +?u?s?d?s?l?u?s?l +?u?s?d?s?l?u?s?u +?u?s?d?s?l?u?s?s +?u?s?d?s?l?s?d?d +?u?s?d?s?l?s?d?l +?u?s?d?s?l?s?d?u +?u?s?d?s?l?s?d?s +?u?s?d?s?l?s?l?d +?u?s?d?s?l?s?l?l +?u?s?d?s?l?s?l?u +?u?s?d?s?l?s?l?s +?u?s?d?s?l?s?u?d +?u?s?d?s?l?s?u?l +?u?s?d?s?l?s?u?u +?u?s?d?s?l?s?u?s +?u?s?d?s?l?s?s?d +?u?s?d?s?l?s?s?l +?u?s?d?s?l?s?s?u +?u?s?d?s?l?s?s?s +?u?s?d?s?u?d?d?l +?u?s?d?s?u?d?l?d +?u?s?d?s?u?d?l?l +?u?s?d?s?u?d?l?u +?u?s?d?s?u?d?l?s +?u?s?d?s?u?d?u?l +?u?s?d?s?u?d?s?l +?u?s?d?s?u?l?d?d +?u?s?d?s?u?l?d?l +?u?s?d?s?u?l?d?u +?u?s?d?s?u?l?d?s +?u?s?d?s?u?l?l?d +?u?s?d?s?u?l?l?l +?u?s?d?s?u?l?l?u +?u?s?d?s?u?l?l?s +?u?s?d?s?u?l?u?d +?u?s?d?s?u?l?u?l +?u?s?d?s?u?l?u?u +?u?s?d?s?u?l?u?s +?u?s?d?s?u?l?s?d +?u?s?d?s?u?l?s?l +?u?s?d?s?u?l?s?u +?u?s?d?s?u?l?s?s +?u?s?d?s?u?u?d?l +?u?s?d?s?u?u?l?d +?u?s?d?s?u?u?l?l +?u?s?d?s?u?u?l?u +?u?s?d?s?u?u?l?s +?u?s?d?s?u?u?u?l +?u?s?d?s?u?u?s?l +?u?s?d?s?u?s?d?l +?u?s?d?s?u?s?l?d +?u?s?d?s?u?s?l?l +?u?s?d?s?u?s?l?u +?u?s?d?s?u?s?l?s +?u?s?d?s?u?s?u?l +?u?s?d?s?u?s?s?l +?u?s?d?s?s?d?d?l +?u?s?d?s?s?d?l?d +?u?s?d?s?s?d?l?l +?u?s?d?s?s?d?l?u +?u?s?d?s?s?d?l?s +?u?s?d?s?s?d?u?l +?u?s?d?s?s?d?s?l +?u?s?d?s?s?l?d?d +?u?s?d?s?s?l?d?l +?u?s?d?s?s?l?d?u +?u?s?d?s?s?l?d?s +?u?s?d?s?s?l?l?d +?u?s?d?s?s?l?l?l +?u?s?d?s?s?l?l?u +?u?s?d?s?s?l?l?s +?u?s?d?s?s?l?u?d +?u?s?d?s?s?l?u?l +?u?s?d?s?s?l?u?u +?u?s?d?s?s?l?u?s +?u?s?d?s?s?l?s?d +?u?s?d?s?s?l?s?l +?u?s?d?s?s?l?s?u +?u?s?d?s?s?l?s?s +?u?s?d?s?s?u?d?l +?u?s?d?s?s?u?l?d +?u?s?d?s?s?u?l?l +?u?s?d?s?s?u?l?u +?u?s?d?s?s?u?l?s +?u?s?d?s?s?u?u?l +?u?s?d?s?s?u?s?l +?u?s?d?s?s?s?d?l +?u?s?d?s?s?s?l?d +?u?s?d?s?s?s?l?l +?u?s?d?s?s?s?l?u +?u?s?d?s?s?s?l?s +?u?s?d?s?s?s?u?l +?u?s?d?s?s?s?s?l +?u?s?l?d?d?d?d?d +?u?s?l?d?d?d?d?l +?u?s?l?d?d?d?d?u +?u?s?l?d?d?d?d?s +?u?s?l?d?d?d?l?d +?u?s?l?d?d?d?l?l +?u?s?l?d?d?d?l?u +?u?s?l?d?d?d?l?s +?u?s?l?d?d?d?u?d +?u?s?l?d?d?d?u?l +?u?s?l?d?d?d?u?u +?u?s?l?d?d?d?u?s +?u?s?l?d?d?d?s?d +?u?s?l?d?d?d?s?l +?u?s?l?d?d?d?s?u +?u?s?l?d?d?d?s?s +?u?s?l?d?d?l?d?d +?u?s?l?d?d?l?d?l +?u?s?l?d?d?l?d?u +?u?s?l?d?d?l?d?s +?u?s?l?d?d?l?l?d +?u?s?l?d?d?l?l?l +?u?s?l?d?d?l?l?u +?u?s?l?d?d?l?l?s +?u?s?l?d?d?l?u?d +?u?s?l?d?d?l?u?l +?u?s?l?d?d?l?u?u +?u?s?l?d?d?l?u?s +?u?s?l?d?d?l?s?d +?u?s?l?d?d?l?s?l +?u?s?l?d?d?l?s?u +?u?s?l?d?d?l?s?s +?u?s?l?d?d?u?d?d +?u?s?l?d?d?u?d?l +?u?s?l?d?d?u?d?u +?u?s?l?d?d?u?d?s +?u?s?l?d?d?u?l?d +?u?s?l?d?d?u?l?l +?u?s?l?d?d?u?l?u +?u?s?l?d?d?u?l?s +?u?s?l?d?d?u?u?d +?u?s?l?d?d?u?u?l +?u?s?l?d?d?u?u?u +?u?s?l?d?d?u?u?s +?u?s?l?d?d?u?s?d +?u?s?l?d?d?u?s?l +?u?s?l?d?d?u?s?u +?u?s?l?d?d?u?s?s +?u?s?l?d?d?s?d?d +?u?s?l?d?d?s?d?l +?u?s?l?d?d?s?d?u +?u?s?l?d?d?s?d?s +?u?s?l?d?d?s?l?d +?u?s?l?d?d?s?l?l +?u?s?l?d?d?s?l?u +?u?s?l?d?d?s?l?s +?u?s?l?d?d?s?u?d +?u?s?l?d?d?s?u?l +?u?s?l?d?d?s?u?u +?u?s?l?d?d?s?u?s +?u?s?l?d?d?s?s?d +?u?s?l?d?d?s?s?l +?u?s?l?d?d?s?s?u +?u?s?l?d?d?s?s?s +?u?s?l?d?l?d?d?d +?u?s?l?d?l?d?d?l +?u?s?l?d?l?d?d?u +?u?s?l?d?l?d?d?s +?u?s?l?d?l?d?l?d +?u?s?l?d?l?d?l?l +?u?s?l?d?l?d?l?u +?u?s?l?d?l?d?l?s +?u?s?l?d?l?d?u?d +?u?s?l?d?l?d?u?l +?u?s?l?d?l?d?u?u +?u?s?l?d?l?d?u?s +?u?s?l?d?l?d?s?d +?u?s?l?d?l?d?s?l +?u?s?l?d?l?d?s?u +?u?s?l?d?l?d?s?s +?u?s?l?d?l?l?d?d +?u?s?l?d?l?l?d?l +?u?s?l?d?l?l?d?u +?u?s?l?d?l?l?d?s +?u?s?l?d?l?l?l?d +?u?s?l?d?l?l?l?l +?u?s?l?d?l?l?l?u +?u?s?l?d?l?l?l?s +?u?s?l?d?l?l?u?d +?u?s?l?d?l?l?u?l +?u?s?l?d?l?l?u?u +?u?s?l?d?l?l?u?s +?u?s?l?d?l?l?s?d +?u?s?l?d?l?l?s?l +?u?s?l?d?l?l?s?u +?u?s?l?d?l?l?s?s +?u?s?l?d?l?u?d?d +?u?s?l?d?l?u?d?l +?u?s?l?d?l?u?d?u +?u?s?l?d?l?u?d?s +?u?s?l?d?l?u?l?d +?u?s?l?d?l?u?l?l +?u?s?l?d?l?u?l?u +?u?s?l?d?l?u?l?s +?u?s?l?d?l?u?u?d +?u?s?l?d?l?u?u?l +?u?s?l?d?l?u?u?u +?u?s?l?d?l?u?u?s +?u?s?l?d?l?u?s?d +?u?s?l?d?l?u?s?l +?u?s?l?d?l?u?s?u +?u?s?l?d?l?u?s?s +?u?s?l?d?l?s?d?d +?u?s?l?d?l?s?d?l +?u?s?l?d?l?s?d?u +?u?s?l?d?l?s?d?s +?u?s?l?d?l?s?l?d +?u?s?l?d?l?s?l?l +?u?s?l?d?l?s?l?u +?u?s?l?d?l?s?l?s +?u?s?l?d?l?s?u?d +?u?s?l?d?l?s?u?l +?u?s?l?d?l?s?u?u +?u?s?l?d?l?s?u?s +?u?s?l?d?l?s?s?d +?u?s?l?d?l?s?s?l +?u?s?l?d?l?s?s?u +?u?s?l?d?l?s?s?s +?u?s?l?d?u?d?d?d +?u?s?l?d?u?d?d?l +?u?s?l?d?u?d?d?u +?u?s?l?d?u?d?d?s +?u?s?l?d?u?d?l?d +?u?s?l?d?u?d?l?l +?u?s?l?d?u?d?l?u +?u?s?l?d?u?d?l?s +?u?s?l?d?u?d?u?d +?u?s?l?d?u?d?u?l +?u?s?l?d?u?d?u?u +?u?s?l?d?u?d?u?s +?u?s?l?d?u?d?s?d +?u?s?l?d?u?d?s?l +?u?s?l?d?u?d?s?u +?u?s?l?d?u?d?s?s +?u?s?l?d?u?l?d?d +?u?s?l?d?u?l?d?l +?u?s?l?d?u?l?d?u +?u?s?l?d?u?l?d?s +?u?s?l?d?u?l?l?d +?u?s?l?d?u?l?l?l +?u?s?l?d?u?l?l?u +?u?s?l?d?u?l?l?s +?u?s?l?d?u?l?u?d +?u?s?l?d?u?l?u?l +?u?s?l?d?u?l?u?u +?u?s?l?d?u?l?u?s +?u?s?l?d?u?l?s?d +?u?s?l?d?u?l?s?l +?u?s?l?d?u?l?s?u +?u?s?l?d?u?l?s?s +?u?s?l?d?u?u?d?d +?u?s?l?d?u?u?d?l +?u?s?l?d?u?u?d?u +?u?s?l?d?u?u?d?s +?u?s?l?d?u?u?l?d +?u?s?l?d?u?u?l?l +?u?s?l?d?u?u?l?u +?u?s?l?d?u?u?l?s +?u?s?l?d?u?u?u?d +?u?s?l?d?u?u?u?l +?u?s?l?d?u?u?u?u +?u?s?l?d?u?u?u?s +?u?s?l?d?u?u?s?d +?u?s?l?d?u?u?s?l +?u?s?l?d?u?u?s?u +?u?s?l?d?u?u?s?s +?u?s?l?d?u?s?d?d +?u?s?l?d?u?s?d?l +?u?s?l?d?u?s?d?u +?u?s?l?d?u?s?d?s +?u?s?l?d?u?s?l?d +?u?s?l?d?u?s?l?l +?u?s?l?d?u?s?l?u +?u?s?l?d?u?s?l?s +?u?s?l?d?u?s?u?d +?u?s?l?d?u?s?u?l +?u?s?l?d?u?s?u?u +?u?s?l?d?u?s?u?s +?u?s?l?d?u?s?s?d +?u?s?l?d?u?s?s?l +?u?s?l?d?u?s?s?u +?u?s?l?d?u?s?s?s +?u?s?l?d?s?d?d?d +?u?s?l?d?s?d?d?l +?u?s?l?d?s?d?d?u +?u?s?l?d?s?d?d?s +?u?s?l?d?s?d?l?d +?u?s?l?d?s?d?l?l +?u?s?l?d?s?d?l?u +?u?s?l?d?s?d?l?s +?u?s?l?d?s?d?u?d +?u?s?l?d?s?d?u?l +?u?s?l?d?s?d?u?u +?u?s?l?d?s?d?u?s +?u?s?l?d?s?d?s?d +?u?s?l?d?s?d?s?l +?u?s?l?d?s?d?s?u +?u?s?l?d?s?d?s?s +?u?s?l?d?s?l?d?d +?u?s?l?d?s?l?d?l +?u?s?l?d?s?l?d?u +?u?s?l?d?s?l?d?s +?u?s?l?d?s?l?l?d +?u?s?l?d?s?l?l?l +?u?s?l?d?s?l?l?u +?u?s?l?d?s?l?l?s +?u?s?l?d?s?l?u?d +?u?s?l?d?s?l?u?l +?u?s?l?d?s?l?u?u +?u?s?l?d?s?l?u?s +?u?s?l?d?s?l?s?d +?u?s?l?d?s?l?s?l +?u?s?l?d?s?l?s?u +?u?s?l?d?s?l?s?s +?u?s?l?d?s?u?d?d +?u?s?l?d?s?u?d?l +?u?s?l?d?s?u?d?u +?u?s?l?d?s?u?d?s +?u?s?l?d?s?u?l?d +?u?s?l?d?s?u?l?l +?u?s?l?d?s?u?l?u +?u?s?l?d?s?u?l?s +?u?s?l?d?s?u?u?d +?u?s?l?d?s?u?u?l +?u?s?l?d?s?u?u?u +?u?s?l?d?s?u?u?s +?u?s?l?d?s?u?s?d +?u?s?l?d?s?u?s?l +?u?s?l?d?s?u?s?u +?u?s?l?d?s?u?s?s +?u?s?l?d?s?s?d?d +?u?s?l?d?s?s?d?l +?u?s?l?d?s?s?d?u +?u?s?l?d?s?s?d?s +?u?s?l?d?s?s?l?d +?u?s?l?d?s?s?l?l +?u?s?l?d?s?s?l?u +?u?s?l?d?s?s?l?s +?u?s?l?d?s?s?u?d +?u?s?l?d?s?s?u?l +?u?s?l?d?s?s?u?u +?u?s?l?d?s?s?u?s +?u?s?l?d?s?s?s?d +?u?s?l?d?s?s?s?l +?u?s?l?d?s?s?s?u +?u?s?l?d?s?s?s?s +?u?s?l?l?d?d?d?d +?u?s?l?l?d?d?d?l +?u?s?l?l?d?d?d?u +?u?s?l?l?d?d?d?s +?u?s?l?l?d?d?l?d +?u?s?l?l?d?d?l?l +?u?s?l?l?d?d?l?u +?u?s?l?l?d?d?l?s +?u?s?l?l?d?d?u?d +?u?s?l?l?d?d?u?l +?u?s?l?l?d?d?u?u +?u?s?l?l?d?d?u?s +?u?s?l?l?d?d?s?d +?u?s?l?l?d?d?s?l +?u?s?l?l?d?d?s?u +?u?s?l?l?d?d?s?s +?u?s?l?l?d?l?d?d +?u?s?l?l?d?l?d?l +?u?s?l?l?d?l?d?u +?u?s?l?l?d?l?d?s +?u?s?l?l?d?l?l?d +?u?s?l?l?d?l?l?l +?u?s?l?l?d?l?l?u +?u?s?l?l?d?l?l?s +?u?s?l?l?d?l?u?d +?u?s?l?l?d?l?u?l +?u?s?l?l?d?l?u?u +?u?s?l?l?d?l?u?s +?u?s?l?l?d?l?s?d +?u?s?l?l?d?l?s?l +?u?s?l?l?d?l?s?u +?u?s?l?l?d?l?s?s +?u?s?l?l?d?u?d?d +?u?s?l?l?d?u?d?l +?u?s?l?l?d?u?d?u +?u?s?l?l?d?u?d?s +?u?s?l?l?d?u?l?d +?u?s?l?l?d?u?l?l +?u?s?l?l?d?u?l?u +?u?s?l?l?d?u?l?s +?u?s?l?l?d?u?u?d +?u?s?l?l?d?u?u?l +?u?s?l?l?d?u?u?u +?u?s?l?l?d?u?u?s +?u?s?l?l?d?u?s?d +?u?s?l?l?d?u?s?l +?u?s?l?l?d?u?s?u +?u?s?l?l?d?u?s?s +?u?s?l?l?d?s?d?d +?u?s?l?l?d?s?d?l +?u?s?l?l?d?s?d?u +?u?s?l?l?d?s?d?s +?u?s?l?l?d?s?l?d +?u?s?l?l?d?s?l?l +?u?s?l?l?d?s?l?u +?u?s?l?l?d?s?l?s +?u?s?l?l?d?s?u?d +?u?s?l?l?d?s?u?l +?u?s?l?l?d?s?u?u +?u?s?l?l?d?s?u?s +?u?s?l?l?d?s?s?d +?u?s?l?l?d?s?s?l +?u?s?l?l?d?s?s?u +?u?s?l?l?d?s?s?s +?u?s?l?l?l?d?d?d +?u?s?l?l?l?d?d?l +?u?s?l?l?l?d?d?u +?u?s?l?l?l?d?d?s +?u?s?l?l?l?d?l?d +?u?s?l?l?l?d?l?l +?u?s?l?l?l?d?l?u +?u?s?l?l?l?d?l?s +?u?s?l?l?l?d?u?d +?u?s?l?l?l?d?u?l +?u?s?l?l?l?d?u?u +?u?s?l?l?l?d?u?s +?u?s?l?l?l?d?s?d +?u?s?l?l?l?d?s?l +?u?s?l?l?l?d?s?u +?u?s?l?l?l?d?s?s +?u?s?l?l?l?l?d?d +?u?s?l?l?l?l?d?l +?u?s?l?l?l?l?d?u +?u?s?l?l?l?l?d?s +?u?s?l?l?l?l?l?d +?u?s?l?l?l?l?u?d +?u?s?l?l?l?l?s?d +?u?s?l?l?l?u?d?d +?u?s?l?l?l?u?d?l +?u?s?l?l?l?u?d?u +?u?s?l?l?l?u?d?s +?u?s?l?l?l?u?l?d +?u?s?l?l?l?u?u?d +?u?s?l?l?l?u?s?d +?u?s?l?l?l?s?d?d +?u?s?l?l?l?s?d?l +?u?s?l?l?l?s?d?u +?u?s?l?l?l?s?d?s +?u?s?l?l?l?s?l?d +?u?s?l?l?l?s?u?d +?u?s?l?l?l?s?s?d +?u?s?l?l?u?d?d?d +?u?s?l?l?u?d?d?l +?u?s?l?l?u?d?d?u +?u?s?l?l?u?d?d?s +?u?s?l?l?u?d?l?d +?u?s?l?l?u?d?l?l +?u?s?l?l?u?d?l?u +?u?s?l?l?u?d?l?s +?u?s?l?l?u?d?u?d +?u?s?l?l?u?d?u?l +?u?s?l?l?u?d?u?u +?u?s?l?l?u?d?u?s +?u?s?l?l?u?d?s?d +?u?s?l?l?u?d?s?l +?u?s?l?l?u?d?s?u +?u?s?l?l?u?d?s?s +?u?s?l?l?u?l?d?d +?u?s?l?l?u?l?d?l +?u?s?l?l?u?l?d?u +?u?s?l?l?u?l?d?s +?u?s?l?l?u?l?l?d +?u?s?l?l?u?l?u?d +?u?s?l?l?u?l?s?d +?u?s?l?l?u?u?d?d +?u?s?l?l?u?u?d?l +?u?s?l?l?u?u?d?u +?u?s?l?l?u?u?d?s +?u?s?l?l?u?u?l?d +?u?s?l?l?u?u?u?d +?u?s?l?l?u?u?s?d +?u?s?l?l?u?s?d?d +?u?s?l?l?u?s?d?l +?u?s?l?l?u?s?d?u +?u?s?l?l?u?s?d?s +?u?s?l?l?u?s?l?d +?u?s?l?l?u?s?u?d +?u?s?l?l?u?s?s?d +?u?s?l?l?s?d?d?d +?u?s?l?l?s?d?d?l +?u?s?l?l?s?d?d?u +?u?s?l?l?s?d?d?s +?u?s?l?l?s?d?l?d +?u?s?l?l?s?d?l?l +?u?s?l?l?s?d?l?u +?u?s?l?l?s?d?l?s +?u?s?l?l?s?d?u?d +?u?s?l?l?s?d?u?l +?u?s?l?l?s?d?u?u +?u?s?l?l?s?d?u?s +?u?s?l?l?s?d?s?d +?u?s?l?l?s?d?s?l +?u?s?l?l?s?d?s?u +?u?s?l?l?s?d?s?s +?u?s?l?l?s?l?d?d +?u?s?l?l?s?l?d?l +?u?s?l?l?s?l?d?u +?u?s?l?l?s?l?d?s +?u?s?l?l?s?l?l?d +?u?s?l?l?s?l?u?d +?u?s?l?l?s?l?s?d +?u?s?l?l?s?u?d?d +?u?s?l?l?s?u?d?l +?u?s?l?l?s?u?d?u +?u?s?l?l?s?u?d?s +?u?s?l?l?s?u?l?d +?u?s?l?l?s?u?u?d +?u?s?l?l?s?u?s?d +?u?s?l?l?s?s?d?d +?u?s?l?l?s?s?d?l +?u?s?l?l?s?s?d?u +?u?s?l?l?s?s?d?s +?u?s?l?l?s?s?l?d +?u?s?l?l?s?s?u?d +?u?s?l?l?s?s?s?d +?u?s?l?u?d?d?d?d +?u?s?l?u?d?d?d?l +?u?s?l?u?d?d?d?u +?u?s?l?u?d?d?d?s +?u?s?l?u?d?d?l?d +?u?s?l?u?d?d?l?l +?u?s?l?u?d?d?l?u +?u?s?l?u?d?d?l?s +?u?s?l?u?d?d?u?d +?u?s?l?u?d?d?u?l +?u?s?l?u?d?d?u?u +?u?s?l?u?d?d?u?s +?u?s?l?u?d?d?s?d +?u?s?l?u?d?d?s?l +?u?s?l?u?d?d?s?u +?u?s?l?u?d?d?s?s +?u?s?l?u?d?l?d?d +?u?s?l?u?d?l?d?l +?u?s?l?u?d?l?d?u +?u?s?l?u?d?l?d?s +?u?s?l?u?d?l?l?d +?u?s?l?u?d?l?l?l +?u?s?l?u?d?l?l?u +?u?s?l?u?d?l?l?s +?u?s?l?u?d?l?u?d +?u?s?l?u?d?l?u?l +?u?s?l?u?d?l?u?u +?u?s?l?u?d?l?u?s +?u?s?l?u?d?l?s?d +?u?s?l?u?d?l?s?l +?u?s?l?u?d?l?s?u +?u?s?l?u?d?l?s?s +?u?s?l?u?d?u?d?d +?u?s?l?u?d?u?d?l +?u?s?l?u?d?u?d?u +?u?s?l?u?d?u?d?s +?u?s?l?u?d?u?l?d +?u?s?l?u?d?u?l?l +?u?s?l?u?d?u?l?u +?u?s?l?u?d?u?l?s +?u?s?l?u?d?u?u?d +?u?s?l?u?d?u?u?l +?u?s?l?u?d?u?u?u +?u?s?l?u?d?u?u?s +?u?s?l?u?d?u?s?d +?u?s?l?u?d?u?s?l +?u?s?l?u?d?u?s?u +?u?s?l?u?d?u?s?s +?u?s?l?u?d?s?d?d +?u?s?l?u?d?s?d?l +?u?s?l?u?d?s?d?u +?u?s?l?u?d?s?d?s +?u?s?l?u?d?s?l?d +?u?s?l?u?d?s?l?l +?u?s?l?u?d?s?l?u +?u?s?l?u?d?s?l?s +?u?s?l?u?d?s?u?d +?u?s?l?u?d?s?u?l +?u?s?l?u?d?s?u?u +?u?s?l?u?d?s?u?s +?u?s?l?u?d?s?s?d +?u?s?l?u?d?s?s?l +?u?s?l?u?d?s?s?u +?u?s?l?u?d?s?s?s +?u?s?l?u?l?d?d?d +?u?s?l?u?l?d?d?l +?u?s?l?u?l?d?d?u +?u?s?l?u?l?d?d?s +?u?s?l?u?l?d?l?d +?u?s?l?u?l?d?l?l +?u?s?l?u?l?d?l?u +?u?s?l?u?l?d?l?s +?u?s?l?u?l?d?u?d +?u?s?l?u?l?d?u?l +?u?s?l?u?l?d?u?u +?u?s?l?u?l?d?u?s +?u?s?l?u?l?d?s?d +?u?s?l?u?l?d?s?l +?u?s?l?u?l?d?s?u +?u?s?l?u?l?d?s?s +?u?s?l?u?l?l?d?d +?u?s?l?u?l?l?d?l +?u?s?l?u?l?l?d?u +?u?s?l?u?l?l?d?s +?u?s?l?u?l?l?l?d +?u?s?l?u?l?l?u?d +?u?s?l?u?l?l?s?d +?u?s?l?u?l?u?d?d +?u?s?l?u?l?u?d?l +?u?s?l?u?l?u?d?u +?u?s?l?u?l?u?d?s +?u?s?l?u?l?u?l?d +?u?s?l?u?l?u?u?d +?u?s?l?u?l?u?s?d +?u?s?l?u?l?s?d?d +?u?s?l?u?l?s?d?l +?u?s?l?u?l?s?d?u +?u?s?l?u?l?s?d?s +?u?s?l?u?l?s?l?d +?u?s?l?u?l?s?u?d +?u?s?l?u?l?s?s?d +?u?s?l?u?u?d?d?d +?u?s?l?u?u?d?d?l +?u?s?l?u?u?d?d?u +?u?s?l?u?u?d?d?s +?u?s?l?u?u?d?l?d +?u?s?l?u?u?d?l?l +?u?s?l?u?u?d?l?u +?u?s?l?u?u?d?l?s +?u?s?l?u?u?d?u?d +?u?s?l?u?u?d?u?l +?u?s?l?u?u?d?u?u +?u?s?l?u?u?d?u?s +?u?s?l?u?u?d?s?d +?u?s?l?u?u?d?s?l +?u?s?l?u?u?d?s?u +?u?s?l?u?u?d?s?s +?u?s?l?u?u?l?d?d +?u?s?l?u?u?l?d?l +?u?s?l?u?u?l?d?u +?u?s?l?u?u?l?d?s +?u?s?l?u?u?l?l?d +?u?s?l?u?u?l?u?d +?u?s?l?u?u?l?s?d +?u?s?l?u?u?u?d?d +?u?s?l?u?u?u?d?l +?u?s?l?u?u?u?d?u +?u?s?l?u?u?u?d?s +?u?s?l?u?u?u?l?d +?u?s?l?u?u?u?u?d +?u?s?l?u?u?u?s?d +?u?s?l?u?u?s?d?d +?u?s?l?u?u?s?d?l +?u?s?l?u?u?s?d?u +?u?s?l?u?u?s?d?s +?u?s?l?u?u?s?l?d +?u?s?l?u?u?s?u?d +?u?s?l?u?u?s?s?d +?u?s?l?u?s?d?d?d +?u?s?l?u?s?d?d?l +?u?s?l?u?s?d?d?u +?u?s?l?u?s?d?d?s +?u?s?l?u?s?d?l?d +?u?s?l?u?s?d?l?l +?u?s?l?u?s?d?l?u +?u?s?l?u?s?d?l?s +?u?s?l?u?s?d?u?d +?u?s?l?u?s?d?u?l +?u?s?l?u?s?d?u?u +?u?s?l?u?s?d?u?s +?u?s?l?u?s?d?s?d +?u?s?l?u?s?d?s?l +?u?s?l?u?s?d?s?u +?u?s?l?u?s?d?s?s +?u?s?l?u?s?l?d?d +?u?s?l?u?s?l?d?l +?u?s?l?u?s?l?d?u +?u?s?l?u?s?l?d?s +?u?s?l?u?s?l?l?d +?u?s?l?u?s?l?u?d +?u?s?l?u?s?l?s?d +?u?s?l?u?s?u?d?d +?u?s?l?u?s?u?d?l +?u?s?l?u?s?u?d?u +?u?s?l?u?s?u?d?s +?u?s?l?u?s?u?l?d +?u?s?l?u?s?u?u?d +?u?s?l?u?s?u?s?d +?u?s?l?u?s?s?d?d +?u?s?l?u?s?s?d?l +?u?s?l?u?s?s?d?u +?u?s?l?u?s?s?d?s +?u?s?l?u?s?s?l?d +?u?s?l?u?s?s?u?d +?u?s?l?u?s?s?s?d +?u?s?l?s?d?d?d?d +?u?s?l?s?d?d?d?l +?u?s?l?s?d?d?d?u +?u?s?l?s?d?d?d?s +?u?s?l?s?d?d?l?d +?u?s?l?s?d?d?l?l +?u?s?l?s?d?d?l?u +?u?s?l?s?d?d?l?s +?u?s?l?s?d?d?u?d +?u?s?l?s?d?d?u?l +?u?s?l?s?d?d?u?u +?u?s?l?s?d?d?u?s +?u?s?l?s?d?d?s?d +?u?s?l?s?d?d?s?l +?u?s?l?s?d?d?s?u +?u?s?l?s?d?d?s?s +?u?s?l?s?d?l?d?d +?u?s?l?s?d?l?d?l +?u?s?l?s?d?l?d?u +?u?s?l?s?d?l?d?s +?u?s?l?s?d?l?l?d +?u?s?l?s?d?l?l?l +?u?s?l?s?d?l?l?u +?u?s?l?s?d?l?l?s +?u?s?l?s?d?l?u?d +?u?s?l?s?d?l?u?l +?u?s?l?s?d?l?u?u +?u?s?l?s?d?l?u?s +?u?s?l?s?d?l?s?d +?u?s?l?s?d?l?s?l +?u?s?l?s?d?l?s?u +?u?s?l?s?d?l?s?s +?u?s?l?s?d?u?d?d +?u?s?l?s?d?u?d?l +?u?s?l?s?d?u?d?u +?u?s?l?s?d?u?d?s +?u?s?l?s?d?u?l?d +?u?s?l?s?d?u?l?l +?u?s?l?s?d?u?l?u +?u?s?l?s?d?u?l?s +?u?s?l?s?d?u?u?d +?u?s?l?s?d?u?u?l +?u?s?l?s?d?u?u?u +?u?s?l?s?d?u?u?s +?u?s?l?s?d?u?s?d +?u?s?l?s?d?u?s?l +?u?s?l?s?d?u?s?u +?u?s?l?s?d?u?s?s +?u?s?l?s?d?s?d?d +?u?s?l?s?d?s?d?l +?u?s?l?s?d?s?d?u +?u?s?l?s?d?s?d?s +?u?s?l?s?d?s?l?d +?u?s?l?s?d?s?l?l +?u?s?l?s?d?s?l?u +?u?s?l?s?d?s?l?s +?u?s?l?s?d?s?u?d +?u?s?l?s?d?s?u?l +?u?s?l?s?d?s?u?u +?u?s?l?s?d?s?u?s +?u?s?l?s?d?s?s?d +?u?s?l?s?d?s?s?l +?u?s?l?s?d?s?s?u +?u?s?l?s?d?s?s?s +?u?s?l?s?l?d?d?d +?u?s?l?s?l?d?d?l +?u?s?l?s?l?d?d?u +?u?s?l?s?l?d?d?s +?u?s?l?s?l?d?l?d +?u?s?l?s?l?d?l?l +?u?s?l?s?l?d?l?u +?u?s?l?s?l?d?l?s +?u?s?l?s?l?d?u?d +?u?s?l?s?l?d?u?l +?u?s?l?s?l?d?u?u +?u?s?l?s?l?d?u?s +?u?s?l?s?l?d?s?d +?u?s?l?s?l?d?s?l +?u?s?l?s?l?d?s?u +?u?s?l?s?l?d?s?s +?u?s?l?s?l?l?d?d +?u?s?l?s?l?l?d?l +?u?s?l?s?l?l?d?u +?u?s?l?s?l?l?d?s +?u?s?l?s?l?l?l?d +?u?s?l?s?l?l?u?d +?u?s?l?s?l?l?s?d +?u?s?l?s?l?u?d?d +?u?s?l?s?l?u?d?l +?u?s?l?s?l?u?d?u +?u?s?l?s?l?u?d?s +?u?s?l?s?l?u?l?d +?u?s?l?s?l?u?u?d +?u?s?l?s?l?u?s?d +?u?s?l?s?l?s?d?d +?u?s?l?s?l?s?d?l +?u?s?l?s?l?s?d?u +?u?s?l?s?l?s?d?s +?u?s?l?s?l?s?l?d +?u?s?l?s?l?s?u?d +?u?s?l?s?l?s?s?d +?u?s?l?s?u?d?d?d +?u?s?l?s?u?d?d?l +?u?s?l?s?u?d?d?u +?u?s?l?s?u?d?d?s +?u?s?l?s?u?d?l?d +?u?s?l?s?u?d?l?l +?u?s?l?s?u?d?l?u +?u?s?l?s?u?d?l?s +?u?s?l?s?u?d?u?d +?u?s?l?s?u?d?u?l +?u?s?l?s?u?d?u?u +?u?s?l?s?u?d?u?s +?u?s?l?s?u?d?s?d +?u?s?l?s?u?d?s?l +?u?s?l?s?u?d?s?u +?u?s?l?s?u?d?s?s +?u?s?l?s?u?l?d?d +?u?s?l?s?u?l?d?l +?u?s?l?s?u?l?d?u +?u?s?l?s?u?l?d?s +?u?s?l?s?u?l?l?d +?u?s?l?s?u?l?u?d +?u?s?l?s?u?l?s?d +?u?s?l?s?u?u?d?d +?u?s?l?s?u?u?d?l +?u?s?l?s?u?u?d?u +?u?s?l?s?u?u?d?s +?u?s?l?s?u?u?l?d +?u?s?l?s?u?u?u?d +?u?s?l?s?u?u?s?d +?u?s?l?s?u?s?d?d +?u?s?l?s?u?s?d?l +?u?s?l?s?u?s?d?u +?u?s?l?s?u?s?d?s +?u?s?l?s?u?s?l?d +?u?s?l?s?u?s?u?d +?u?s?l?s?u?s?s?d +?u?s?l?s?s?d?d?d +?u?s?l?s?s?d?d?l +?u?s?l?s?s?d?d?u +?u?s?l?s?s?d?d?s +?u?s?l?s?s?d?l?d +?u?s?l?s?s?d?l?l +?u?s?l?s?s?d?l?u +?u?s?l?s?s?d?l?s +?u?s?l?s?s?d?u?d +?u?s?l?s?s?d?u?l +?u?s?l?s?s?d?u?u +?u?s?l?s?s?d?u?s +?u?s?l?s?s?d?s?d +?u?s?l?s?s?d?s?l +?u?s?l?s?s?d?s?u +?u?s?l?s?s?d?s?s +?u?s?l?s?s?l?d?d +?u?s?l?s?s?l?d?l +?u?s?l?s?s?l?d?u +?u?s?l?s?s?l?d?s +?u?s?l?s?s?l?l?d +?u?s?l?s?s?l?u?d +?u?s?l?s?s?l?s?d +?u?s?l?s?s?u?d?d +?u?s?l?s?s?u?d?l +?u?s?l?s?s?u?d?u +?u?s?l?s?s?u?d?s +?u?s?l?s?s?u?l?d +?u?s?l?s?s?u?u?d +?u?s?l?s?s?u?s?d +?u?s?l?s?s?s?d?d +?u?s?l?s?s?s?d?l +?u?s?l?s?s?s?d?u +?u?s?l?s?s?s?d?s +?u?s?l?s?s?s?l?d +?u?s?l?s?s?s?u?d +?u?s?l?s?s?s?s?d +?u?s?u?d?d?d?d?l +?u?s?u?d?d?d?l?d +?u?s?u?d?d?d?l?l +?u?s?u?d?d?d?l?u +?u?s?u?d?d?d?l?s +?u?s?u?d?d?d?u?l +?u?s?u?d?d?d?s?l +?u?s?u?d?d?l?d?d +?u?s?u?d?d?l?d?l +?u?s?u?d?d?l?d?u +?u?s?u?d?d?l?d?s +?u?s?u?d?d?l?l?d +?u?s?u?d?d?l?l?l +?u?s?u?d?d?l?l?u +?u?s?u?d?d?l?l?s +?u?s?u?d?d?l?u?d +?u?s?u?d?d?l?u?l +?u?s?u?d?d?l?u?u +?u?s?u?d?d?l?u?s +?u?s?u?d?d?l?s?d +?u?s?u?d?d?l?s?l +?u?s?u?d?d?l?s?u +?u?s?u?d?d?l?s?s +?u?s?u?d?d?u?d?l +?u?s?u?d?d?u?l?d +?u?s?u?d?d?u?l?l +?u?s?u?d?d?u?l?u +?u?s?u?d?d?u?l?s +?u?s?u?d?d?u?u?l +?u?s?u?d?d?u?s?l +?u?s?u?d?d?s?d?l +?u?s?u?d?d?s?l?d +?u?s?u?d?d?s?l?l +?u?s?u?d?d?s?l?u +?u?s?u?d?d?s?l?s +?u?s?u?d?d?s?u?l +?u?s?u?d?d?s?s?l +?u?s?u?d?l?d?d?d +?u?s?u?d?l?d?d?l +?u?s?u?d?l?d?d?u +?u?s?u?d?l?d?d?s +?u?s?u?d?l?d?l?d +?u?s?u?d?l?d?l?l +?u?s?u?d?l?d?l?u +?u?s?u?d?l?d?l?s +?u?s?u?d?l?d?u?d +?u?s?u?d?l?d?u?l +?u?s?u?d?l?d?u?u +?u?s?u?d?l?d?u?s +?u?s?u?d?l?d?s?d +?u?s?u?d?l?d?s?l +?u?s?u?d?l?d?s?u +?u?s?u?d?l?d?s?s +?u?s?u?d?l?l?d?d +?u?s?u?d?l?l?d?l +?u?s?u?d?l?l?d?u +?u?s?u?d?l?l?d?s +?u?s?u?d?l?l?l?d +?u?s?u?d?l?l?l?l +?u?s?u?d?l?l?l?u +?u?s?u?d?l?l?l?s +?u?s?u?d?l?l?u?d +?u?s?u?d?l?l?u?l +?u?s?u?d?l?l?u?u +?u?s?u?d?l?l?u?s +?u?s?u?d?l?l?s?d +?u?s?u?d?l?l?s?l +?u?s?u?d?l?l?s?u +?u?s?u?d?l?l?s?s +?u?s?u?d?l?u?d?d +?u?s?u?d?l?u?d?l +?u?s?u?d?l?u?d?u +?u?s?u?d?l?u?d?s +?u?s?u?d?l?u?l?d +?u?s?u?d?l?u?l?l +?u?s?u?d?l?u?l?u +?u?s?u?d?l?u?l?s +?u?s?u?d?l?u?u?d +?u?s?u?d?l?u?u?l +?u?s?u?d?l?u?u?u +?u?s?u?d?l?u?u?s +?u?s?u?d?l?u?s?d +?u?s?u?d?l?u?s?l +?u?s?u?d?l?u?s?u +?u?s?u?d?l?u?s?s +?u?s?u?d?l?s?d?d +?u?s?u?d?l?s?d?l +?u?s?u?d?l?s?d?u +?u?s?u?d?l?s?d?s +?u?s?u?d?l?s?l?d +?u?s?u?d?l?s?l?l +?u?s?u?d?l?s?l?u +?u?s?u?d?l?s?l?s +?u?s?u?d?l?s?u?d +?u?s?u?d?l?s?u?l +?u?s?u?d?l?s?u?u +?u?s?u?d?l?s?u?s +?u?s?u?d?l?s?s?d +?u?s?u?d?l?s?s?l +?u?s?u?d?l?s?s?u +?u?s?u?d?l?s?s?s +?u?s?u?d?u?d?d?l +?u?s?u?d?u?d?l?d +?u?s?u?d?u?d?l?l +?u?s?u?d?u?d?l?u +?u?s?u?d?u?d?l?s +?u?s?u?d?u?d?u?l +?u?s?u?d?u?d?s?l +?u?s?u?d?u?l?d?d +?u?s?u?d?u?l?d?l +?u?s?u?d?u?l?d?u +?u?s?u?d?u?l?d?s +?u?s?u?d?u?l?l?d +?u?s?u?d?u?l?l?l +?u?s?u?d?u?l?l?u +?u?s?u?d?u?l?l?s +?u?s?u?d?u?l?u?d +?u?s?u?d?u?l?u?l +?u?s?u?d?u?l?u?u +?u?s?u?d?u?l?u?s +?u?s?u?d?u?l?s?d +?u?s?u?d?u?l?s?l +?u?s?u?d?u?l?s?u +?u?s?u?d?u?l?s?s +?u?s?u?d?u?u?d?l +?u?s?u?d?u?u?l?d +?u?s?u?d?u?u?l?l +?u?s?u?d?u?u?l?u +?u?s?u?d?u?u?l?s +?u?s?u?d?u?u?u?l +?u?s?u?d?u?u?s?l +?u?s?u?d?u?s?d?l +?u?s?u?d?u?s?l?d +?u?s?u?d?u?s?l?l +?u?s?u?d?u?s?l?u +?u?s?u?d?u?s?l?s +?u?s?u?d?u?s?u?l +?u?s?u?d?u?s?s?l +?u?s?u?d?s?d?d?l +?u?s?u?d?s?d?l?d +?u?s?u?d?s?d?l?l +?u?s?u?d?s?d?l?u +?u?s?u?d?s?d?l?s +?u?s?u?d?s?d?u?l +?u?s?u?d?s?d?s?l +?u?s?u?d?s?l?d?d +?u?s?u?d?s?l?d?l +?u?s?u?d?s?l?d?u +?u?s?u?d?s?l?d?s +?u?s?u?d?s?l?l?d +?u?s?u?d?s?l?l?l +?u?s?u?d?s?l?l?u +?u?s?u?d?s?l?l?s +?u?s?u?d?s?l?u?d +?u?s?u?d?s?l?u?l +?u?s?u?d?s?l?u?u +?u?s?u?d?s?l?u?s +?u?s?u?d?s?l?s?d +?u?s?u?d?s?l?s?l +?u?s?u?d?s?l?s?u +?u?s?u?d?s?l?s?s +?u?s?u?d?s?u?d?l +?u?s?u?d?s?u?l?d +?u?s?u?d?s?u?l?l +?u?s?u?d?s?u?l?u +?u?s?u?d?s?u?l?s +?u?s?u?d?s?u?u?l +?u?s?u?d?s?u?s?l +?u?s?u?d?s?s?d?l +?u?s?u?d?s?s?l?d +?u?s?u?d?s?s?l?l +?u?s?u?d?s?s?l?u +?u?s?u?d?s?s?l?s +?u?s?u?d?s?s?u?l +?u?s?u?d?s?s?s?l +?u?s?u?l?d?d?d?d +?u?s?u?l?d?d?d?l +?u?s?u?l?d?d?d?u +?u?s?u?l?d?d?d?s +?u?s?u?l?d?d?l?d +?u?s?u?l?d?d?l?l +?u?s?u?l?d?d?l?u +?u?s?u?l?d?d?l?s +?u?s?u?l?d?d?u?d +?u?s?u?l?d?d?u?l +?u?s?u?l?d?d?u?u +?u?s?u?l?d?d?u?s +?u?s?u?l?d?d?s?d +?u?s?u?l?d?d?s?l +?u?s?u?l?d?d?s?u +?u?s?u?l?d?d?s?s +?u?s?u?l?d?l?d?d +?u?s?u?l?d?l?d?l +?u?s?u?l?d?l?d?u +?u?s?u?l?d?l?d?s +?u?s?u?l?d?l?l?d +?u?s?u?l?d?l?l?l +?u?s?u?l?d?l?l?u +?u?s?u?l?d?l?l?s +?u?s?u?l?d?l?u?d +?u?s?u?l?d?l?u?l +?u?s?u?l?d?l?u?u +?u?s?u?l?d?l?u?s +?u?s?u?l?d?l?s?d +?u?s?u?l?d?l?s?l +?u?s?u?l?d?l?s?u +?u?s?u?l?d?l?s?s +?u?s?u?l?d?u?d?d +?u?s?u?l?d?u?d?l +?u?s?u?l?d?u?d?u +?u?s?u?l?d?u?d?s +?u?s?u?l?d?u?l?d +?u?s?u?l?d?u?l?l +?u?s?u?l?d?u?l?u +?u?s?u?l?d?u?l?s +?u?s?u?l?d?u?u?d +?u?s?u?l?d?u?u?l +?u?s?u?l?d?u?u?u +?u?s?u?l?d?u?u?s +?u?s?u?l?d?u?s?d +?u?s?u?l?d?u?s?l +?u?s?u?l?d?u?s?u +?u?s?u?l?d?u?s?s +?u?s?u?l?d?s?d?d +?u?s?u?l?d?s?d?l +?u?s?u?l?d?s?d?u +?u?s?u?l?d?s?d?s +?u?s?u?l?d?s?l?d +?u?s?u?l?d?s?l?l +?u?s?u?l?d?s?l?u +?u?s?u?l?d?s?l?s +?u?s?u?l?d?s?u?d +?u?s?u?l?d?s?u?l +?u?s?u?l?d?s?u?u +?u?s?u?l?d?s?u?s +?u?s?u?l?d?s?s?d +?u?s?u?l?d?s?s?l +?u?s?u?l?d?s?s?u +?u?s?u?l?d?s?s?s +?u?s?u?l?l?d?d?d +?u?s?u?l?l?d?d?l +?u?s?u?l?l?d?d?u +?u?s?u?l?l?d?d?s +?u?s?u?l?l?d?l?d +?u?s?u?l?l?d?l?l +?u?s?u?l?l?d?l?u +?u?s?u?l?l?d?l?s +?u?s?u?l?l?d?u?d +?u?s?u?l?l?d?u?l +?u?s?u?l?l?d?u?u +?u?s?u?l?l?d?u?s +?u?s?u?l?l?d?s?d +?u?s?u?l?l?d?s?l +?u?s?u?l?l?d?s?u +?u?s?u?l?l?d?s?s +?u?s?u?l?l?l?d?d +?u?s?u?l?l?l?d?l +?u?s?u?l?l?l?d?u +?u?s?u?l?l?l?d?s +?u?s?u?l?l?l?l?d +?u?s?u?l?l?l?u?d +?u?s?u?l?l?l?s?d +?u?s?u?l?l?u?d?d +?u?s?u?l?l?u?d?l +?u?s?u?l?l?u?d?u +?u?s?u?l?l?u?d?s +?u?s?u?l?l?u?l?d +?u?s?u?l?l?u?u?d +?u?s?u?l?l?u?s?d +?u?s?u?l?l?s?d?d +?u?s?u?l?l?s?d?l +?u?s?u?l?l?s?d?u +?u?s?u?l?l?s?d?s +?u?s?u?l?l?s?l?d +?u?s?u?l?l?s?u?d +?u?s?u?l?l?s?s?d +?u?s?u?l?u?d?d?d +?u?s?u?l?u?d?d?l +?u?s?u?l?u?d?d?u +?u?s?u?l?u?d?d?s +?u?s?u?l?u?d?l?d +?u?s?u?l?u?d?l?l +?u?s?u?l?u?d?l?u +?u?s?u?l?u?d?l?s +?u?s?u?l?u?d?u?d +?u?s?u?l?u?d?u?l +?u?s?u?l?u?d?u?u +?u?s?u?l?u?d?u?s +?u?s?u?l?u?d?s?d +?u?s?u?l?u?d?s?l +?u?s?u?l?u?d?s?u +?u?s?u?l?u?d?s?s +?u?s?u?l?u?l?d?d +?u?s?u?l?u?l?d?l +?u?s?u?l?u?l?d?u +?u?s?u?l?u?l?d?s +?u?s?u?l?u?l?l?d +?u?s?u?l?u?l?u?d +?u?s?u?l?u?l?s?d +?u?s?u?l?u?u?d?d +?u?s?u?l?u?u?d?l +?u?s?u?l?u?u?d?u +?u?s?u?l?u?u?d?s +?u?s?u?l?u?u?l?d +?u?s?u?l?u?u?u?d +?u?s?u?l?u?u?s?d +?u?s?u?l?u?s?d?d +?u?s?u?l?u?s?d?l +?u?s?u?l?u?s?d?u +?u?s?u?l?u?s?d?s +?u?s?u?l?u?s?l?d +?u?s?u?l?u?s?u?d +?u?s?u?l?u?s?s?d +?u?s?u?l?s?d?d?d +?u?s?u?l?s?d?d?l +?u?s?u?l?s?d?d?u +?u?s?u?l?s?d?d?s +?u?s?u?l?s?d?l?d +?u?s?u?l?s?d?l?l +?u?s?u?l?s?d?l?u +?u?s?u?l?s?d?l?s +?u?s?u?l?s?d?u?d +?u?s?u?l?s?d?u?l +?u?s?u?l?s?d?u?u +?u?s?u?l?s?d?u?s +?u?s?u?l?s?d?s?d +?u?s?u?l?s?d?s?l +?u?s?u?l?s?d?s?u +?u?s?u?l?s?d?s?s +?u?s?u?l?s?l?d?d +?u?s?u?l?s?l?d?l +?u?s?u?l?s?l?d?u +?u?s?u?l?s?l?d?s +?u?s?u?l?s?l?l?d +?u?s?u?l?s?l?u?d +?u?s?u?l?s?l?s?d +?u?s?u?l?s?u?d?d +?u?s?u?l?s?u?d?l +?u?s?u?l?s?u?d?u +?u?s?u?l?s?u?d?s +?u?s?u?l?s?u?l?d +?u?s?u?l?s?u?u?d +?u?s?u?l?s?u?s?d +?u?s?u?l?s?s?d?d +?u?s?u?l?s?s?d?l +?u?s?u?l?s?s?d?u +?u?s?u?l?s?s?d?s +?u?s?u?l?s?s?l?d +?u?s?u?l?s?s?u?d +?u?s?u?l?s?s?s?d +?u?s?u?u?d?d?d?l +?u?s?u?u?d?d?l?d +?u?s?u?u?d?d?l?l +?u?s?u?u?d?d?l?u +?u?s?u?u?d?d?l?s +?u?s?u?u?d?d?u?l +?u?s?u?u?d?d?s?l +?u?s?u?u?d?l?d?d +?u?s?u?u?d?l?d?l +?u?s?u?u?d?l?d?u +?u?s?u?u?d?l?d?s +?u?s?u?u?d?l?l?d +?u?s?u?u?d?l?l?l +?u?s?u?u?d?l?l?u +?u?s?u?u?d?l?l?s +?u?s?u?u?d?l?u?d +?u?s?u?u?d?l?u?l +?u?s?u?u?d?l?u?u +?u?s?u?u?d?l?u?s +?u?s?u?u?d?l?s?d +?u?s?u?u?d?l?s?l +?u?s?u?u?d?l?s?u +?u?s?u?u?d?l?s?s +?u?s?u?u?d?u?d?l +?u?s?u?u?d?u?l?d +?u?s?u?u?d?u?l?l +?u?s?u?u?d?u?l?u +?u?s?u?u?d?u?l?s +?u?s?u?u?d?u?u?l +?u?s?u?u?d?u?s?l +?u?s?u?u?d?s?d?l +?u?s?u?u?d?s?l?d +?u?s?u?u?d?s?l?l +?u?s?u?u?d?s?l?u +?u?s?u?u?d?s?l?s +?u?s?u?u?d?s?u?l +?u?s?u?u?d?s?s?l +?u?s?u?u?l?d?d?d +?u?s?u?u?l?d?d?l +?u?s?u?u?l?d?d?u +?u?s?u?u?l?d?d?s +?u?s?u?u?l?d?l?d +?u?s?u?u?l?d?l?l +?u?s?u?u?l?d?l?u +?u?s?u?u?l?d?l?s +?u?s?u?u?l?d?u?d +?u?s?u?u?l?d?u?l +?u?s?u?u?l?d?u?u +?u?s?u?u?l?d?u?s +?u?s?u?u?l?d?s?d +?u?s?u?u?l?d?s?l +?u?s?u?u?l?d?s?u +?u?s?u?u?l?d?s?s +?u?s?u?u?l?l?d?d +?u?s?u?u?l?l?d?l +?u?s?u?u?l?l?d?u +?u?s?u?u?l?l?d?s +?u?s?u?u?l?l?l?d +?u?s?u?u?l?l?u?d +?u?s?u?u?l?l?s?d +?u?s?u?u?l?u?d?d +?u?s?u?u?l?u?d?l +?u?s?u?u?l?u?d?u +?u?s?u?u?l?u?d?s +?u?s?u?u?l?u?l?d +?u?s?u?u?l?u?u?d +?u?s?u?u?l?u?s?d +?u?s?u?u?l?s?d?d +?u?s?u?u?l?s?d?l +?u?s?u?u?l?s?d?u +?u?s?u?u?l?s?d?s +?u?s?u?u?l?s?l?d +?u?s?u?u?l?s?u?d +?u?s?u?u?l?s?s?d +?u?s?u?u?u?d?d?l +?u?s?u?u?u?d?l?d +?u?s?u?u?u?d?l?l +?u?s?u?u?u?d?l?u +?u?s?u?u?u?d?l?s +?u?s?u?u?u?d?u?l +?u?s?u?u?u?d?s?l +?u?s?u?u?u?l?d?d +?u?s?u?u?u?l?d?l +?u?s?u?u?u?l?d?u +?u?s?u?u?u?l?d?s +?u?s?u?u?u?l?l?d +?u?s?u?u?u?l?u?d +?u?s?u?u?u?l?s?d +?u?s?u?u?u?u?d?l +?u?s?u?u?u?u?l?d +?u?s?u?u?u?s?d?l +?u?s?u?u?u?s?l?d +?u?s?u?u?s?d?d?l +?u?s?u?u?s?d?l?d +?u?s?u?u?s?d?l?l +?u?s?u?u?s?d?l?u +?u?s?u?u?s?d?l?s +?u?s?u?u?s?d?u?l +?u?s?u?u?s?d?s?l +?u?s?u?u?s?l?d?d +?u?s?u?u?s?l?d?l +?u?s?u?u?s?l?d?u +?u?s?u?u?s?l?d?s +?u?s?u?u?s?l?l?d +?u?s?u?u?s?l?u?d +?u?s?u?u?s?l?s?d +?u?s?u?u?s?u?d?l +?u?s?u?u?s?u?l?d +?u?s?u?u?s?s?d?l +?u?s?u?u?s?s?l?d +?u?s?u?s?d?d?d?l +?u?s?u?s?d?d?l?d +?u?s?u?s?d?d?l?l +?u?s?u?s?d?d?l?u +?u?s?u?s?d?d?l?s +?u?s?u?s?d?d?u?l +?u?s?u?s?d?d?s?l +?u?s?u?s?d?l?d?d +?u?s?u?s?d?l?d?l +?u?s?u?s?d?l?d?u +?u?s?u?s?d?l?d?s +?u?s?u?s?d?l?l?d +?u?s?u?s?d?l?l?l +?u?s?u?s?d?l?l?u +?u?s?u?s?d?l?l?s +?u?s?u?s?d?l?u?d +?u?s?u?s?d?l?u?l +?u?s?u?s?d?l?u?u +?u?s?u?s?d?l?u?s +?u?s?u?s?d?l?s?d +?u?s?u?s?d?l?s?l +?u?s?u?s?d?l?s?u +?u?s?u?s?d?l?s?s +?u?s?u?s?d?u?d?l +?u?s?u?s?d?u?l?d +?u?s?u?s?d?u?l?l +?u?s?u?s?d?u?l?u +?u?s?u?s?d?u?l?s +?u?s?u?s?d?u?u?l +?u?s?u?s?d?u?s?l +?u?s?u?s?d?s?d?l +?u?s?u?s?d?s?l?d +?u?s?u?s?d?s?l?l +?u?s?u?s?d?s?l?u +?u?s?u?s?d?s?l?s +?u?s?u?s?d?s?u?l +?u?s?u?s?d?s?s?l +?u?s?u?s?l?d?d?d +?u?s?u?s?l?d?d?l +?u?s?u?s?l?d?d?u +?u?s?u?s?l?d?d?s +?u?s?u?s?l?d?l?d +?u?s?u?s?l?d?l?l +?u?s?u?s?l?d?l?u +?u?s?u?s?l?d?l?s +?u?s?u?s?l?d?u?d +?u?s?u?s?l?d?u?l +?u?s?u?s?l?d?u?u +?u?s?u?s?l?d?u?s +?u?s?u?s?l?d?s?d +?u?s?u?s?l?d?s?l +?u?s?u?s?l?d?s?u +?u?s?u?s?l?d?s?s +?u?s?u?s?l?l?d?d +?u?s?u?s?l?l?d?l +?u?s?u?s?l?l?d?u +?u?s?u?s?l?l?d?s +?u?s?u?s?l?l?l?d +?u?s?u?s?l?l?u?d +?u?s?u?s?l?l?s?d +?u?s?u?s?l?u?d?d +?u?s?u?s?l?u?d?l +?u?s?u?s?l?u?d?u +?u?s?u?s?l?u?d?s +?u?s?u?s?l?u?l?d +?u?s?u?s?l?u?u?d +?u?s?u?s?l?u?s?d +?u?s?u?s?l?s?d?d +?u?s?u?s?l?s?d?l +?u?s?u?s?l?s?d?u +?u?s?u?s?l?s?d?s +?u?s?u?s?l?s?l?d +?u?s?u?s?l?s?u?d +?u?s?u?s?l?s?s?d +?u?s?u?s?u?d?d?l +?u?s?u?s?u?d?l?d +?u?s?u?s?u?d?l?l +?u?s?u?s?u?d?l?u +?u?s?u?s?u?d?l?s +?u?s?u?s?u?d?u?l +?u?s?u?s?u?d?s?l +?u?s?u?s?u?l?d?d +?u?s?u?s?u?l?d?l +?u?s?u?s?u?l?d?u +?u?s?u?s?u?l?d?s +?u?s?u?s?u?l?l?d +?u?s?u?s?u?l?u?d +?u?s?u?s?u?l?s?d +?u?s?u?s?u?u?d?l +?u?s?u?s?u?u?l?d +?u?s?u?s?u?s?d?l +?u?s?u?s?u?s?l?d +?u?s?u?s?s?d?d?l +?u?s?u?s?s?d?l?d +?u?s?u?s?s?d?l?l +?u?s?u?s?s?d?l?u +?u?s?u?s?s?d?l?s +?u?s?u?s?s?d?u?l +?u?s?u?s?s?d?s?l +?u?s?u?s?s?l?d?d +?u?s?u?s?s?l?d?l +?u?s?u?s?s?l?d?u +?u?s?u?s?s?l?d?s +?u?s?u?s?s?l?l?d +?u?s?u?s?s?l?u?d +?u?s?u?s?s?l?s?d +?u?s?u?s?s?u?d?l +?u?s?u?s?s?u?l?d +?u?s?u?s?s?s?d?l +?u?s?u?s?s?s?l?d +?u?s?s?d?d?d?d?l +?u?s?s?d?d?d?l?d +?u?s?s?d?d?d?l?l +?u?s?s?d?d?d?l?u +?u?s?s?d?d?d?l?s +?u?s?s?d?d?d?u?l +?u?s?s?d?d?d?s?l +?u?s?s?d?d?l?d?d +?u?s?s?d?d?l?d?l +?u?s?s?d?d?l?d?u +?u?s?s?d?d?l?d?s +?u?s?s?d?d?l?l?d +?u?s?s?d?d?l?l?l +?u?s?s?d?d?l?l?u +?u?s?s?d?d?l?l?s +?u?s?s?d?d?l?u?d +?u?s?s?d?d?l?u?l +?u?s?s?d?d?l?u?u +?u?s?s?d?d?l?u?s +?u?s?s?d?d?l?s?d +?u?s?s?d?d?l?s?l +?u?s?s?d?d?l?s?u +?u?s?s?d?d?l?s?s +?u?s?s?d?d?u?d?l +?u?s?s?d?d?u?l?d +?u?s?s?d?d?u?l?l +?u?s?s?d?d?u?l?u +?u?s?s?d?d?u?l?s +?u?s?s?d?d?u?u?l +?u?s?s?d?d?u?s?l +?u?s?s?d?d?s?d?l +?u?s?s?d?d?s?l?d +?u?s?s?d?d?s?l?l +?u?s?s?d?d?s?l?u +?u?s?s?d?d?s?l?s +?u?s?s?d?d?s?u?l +?u?s?s?d?d?s?s?l +?u?s?s?d?l?d?d?d +?u?s?s?d?l?d?d?l +?u?s?s?d?l?d?d?u +?u?s?s?d?l?d?d?s +?u?s?s?d?l?d?l?d +?u?s?s?d?l?d?l?l +?u?s?s?d?l?d?l?u +?u?s?s?d?l?d?l?s +?u?s?s?d?l?d?u?d +?u?s?s?d?l?d?u?l +?u?s?s?d?l?d?u?u +?u?s?s?d?l?d?u?s +?u?s?s?d?l?d?s?d +?u?s?s?d?l?d?s?l +?u?s?s?d?l?d?s?u +?u?s?s?d?l?d?s?s +?u?s?s?d?l?l?d?d +?u?s?s?d?l?l?d?l +?u?s?s?d?l?l?d?u +?u?s?s?d?l?l?d?s +?u?s?s?d?l?l?l?d +?u?s?s?d?l?l?l?l +?u?s?s?d?l?l?l?u +?u?s?s?d?l?l?l?s +?u?s?s?d?l?l?u?d +?u?s?s?d?l?l?u?l +?u?s?s?d?l?l?u?u +?u?s?s?d?l?l?u?s +?u?s?s?d?l?l?s?d +?u?s?s?d?l?l?s?l +?u?s?s?d?l?l?s?u +?u?s?s?d?l?l?s?s +?u?s?s?d?l?u?d?d +?u?s?s?d?l?u?d?l +?u?s?s?d?l?u?d?u +?u?s?s?d?l?u?d?s +?u?s?s?d?l?u?l?d +?u?s?s?d?l?u?l?l +?u?s?s?d?l?u?l?u +?u?s?s?d?l?u?l?s +?u?s?s?d?l?u?u?d +?u?s?s?d?l?u?u?l +?u?s?s?d?l?u?u?u +?u?s?s?d?l?u?u?s +?u?s?s?d?l?u?s?d +?u?s?s?d?l?u?s?l +?u?s?s?d?l?u?s?u +?u?s?s?d?l?u?s?s +?u?s?s?d?l?s?d?d +?u?s?s?d?l?s?d?l +?u?s?s?d?l?s?d?u +?u?s?s?d?l?s?d?s +?u?s?s?d?l?s?l?d +?u?s?s?d?l?s?l?l +?u?s?s?d?l?s?l?u +?u?s?s?d?l?s?l?s +?u?s?s?d?l?s?u?d +?u?s?s?d?l?s?u?l +?u?s?s?d?l?s?u?u +?u?s?s?d?l?s?u?s +?u?s?s?d?l?s?s?d +?u?s?s?d?l?s?s?l +?u?s?s?d?l?s?s?u +?u?s?s?d?l?s?s?s +?u?s?s?d?u?d?d?l +?u?s?s?d?u?d?l?d +?u?s?s?d?u?d?l?l +?u?s?s?d?u?d?l?u +?u?s?s?d?u?d?l?s +?u?s?s?d?u?d?u?l +?u?s?s?d?u?d?s?l +?u?s?s?d?u?l?d?d +?u?s?s?d?u?l?d?l +?u?s?s?d?u?l?d?u +?u?s?s?d?u?l?d?s +?u?s?s?d?u?l?l?d +?u?s?s?d?u?l?l?l +?u?s?s?d?u?l?l?u +?u?s?s?d?u?l?l?s +?u?s?s?d?u?l?u?d +?u?s?s?d?u?l?u?l +?u?s?s?d?u?l?u?u +?u?s?s?d?u?l?u?s +?u?s?s?d?u?l?s?d +?u?s?s?d?u?l?s?l +?u?s?s?d?u?l?s?u +?u?s?s?d?u?l?s?s +?u?s?s?d?u?u?d?l +?u?s?s?d?u?u?l?d +?u?s?s?d?u?u?l?l +?u?s?s?d?u?u?l?u +?u?s?s?d?u?u?l?s +?u?s?s?d?u?u?u?l +?u?s?s?d?u?u?s?l +?u?s?s?d?u?s?d?l +?u?s?s?d?u?s?l?d +?u?s?s?d?u?s?l?l +?u?s?s?d?u?s?l?u +?u?s?s?d?u?s?l?s +?u?s?s?d?u?s?u?l +?u?s?s?d?u?s?s?l +?u?s?s?d?s?d?d?l +?u?s?s?d?s?d?l?d +?u?s?s?d?s?d?l?l +?u?s?s?d?s?d?l?u +?u?s?s?d?s?d?l?s +?u?s?s?d?s?d?u?l +?u?s?s?d?s?d?s?l +?u?s?s?d?s?l?d?d +?u?s?s?d?s?l?d?l +?u?s?s?d?s?l?d?u +?u?s?s?d?s?l?d?s +?u?s?s?d?s?l?l?d +?u?s?s?d?s?l?l?l +?u?s?s?d?s?l?l?u +?u?s?s?d?s?l?l?s +?u?s?s?d?s?l?u?d +?u?s?s?d?s?l?u?l +?u?s?s?d?s?l?u?u +?u?s?s?d?s?l?u?s +?u?s?s?d?s?l?s?d +?u?s?s?d?s?l?s?l +?u?s?s?d?s?l?s?u +?u?s?s?d?s?l?s?s +?u?s?s?d?s?u?d?l +?u?s?s?d?s?u?l?d +?u?s?s?d?s?u?l?l +?u?s?s?d?s?u?l?u +?u?s?s?d?s?u?l?s +?u?s?s?d?s?u?u?l +?u?s?s?d?s?u?s?l +?u?s?s?d?s?s?d?l +?u?s?s?d?s?s?l?d +?u?s?s?d?s?s?l?l +?u?s?s?d?s?s?l?u +?u?s?s?d?s?s?l?s +?u?s?s?d?s?s?u?l +?u?s?s?d?s?s?s?l +?u?s?s?l?d?d?d?d +?u?s?s?l?d?d?d?l +?u?s?s?l?d?d?d?u +?u?s?s?l?d?d?d?s +?u?s?s?l?d?d?l?d +?u?s?s?l?d?d?l?l +?u?s?s?l?d?d?l?u +?u?s?s?l?d?d?l?s +?u?s?s?l?d?d?u?d +?u?s?s?l?d?d?u?l +?u?s?s?l?d?d?u?u +?u?s?s?l?d?d?u?s +?u?s?s?l?d?d?s?d +?u?s?s?l?d?d?s?l +?u?s?s?l?d?d?s?u +?u?s?s?l?d?d?s?s +?u?s?s?l?d?l?d?d +?u?s?s?l?d?l?d?l +?u?s?s?l?d?l?d?u +?u?s?s?l?d?l?d?s +?u?s?s?l?d?l?l?d +?u?s?s?l?d?l?l?l +?u?s?s?l?d?l?l?u +?u?s?s?l?d?l?l?s +?u?s?s?l?d?l?u?d +?u?s?s?l?d?l?u?l +?u?s?s?l?d?l?u?u +?u?s?s?l?d?l?u?s +?u?s?s?l?d?l?s?d +?u?s?s?l?d?l?s?l +?u?s?s?l?d?l?s?u +?u?s?s?l?d?l?s?s +?u?s?s?l?d?u?d?d +?u?s?s?l?d?u?d?l +?u?s?s?l?d?u?d?u +?u?s?s?l?d?u?d?s +?u?s?s?l?d?u?l?d +?u?s?s?l?d?u?l?l +?u?s?s?l?d?u?l?u +?u?s?s?l?d?u?l?s +?u?s?s?l?d?u?u?d +?u?s?s?l?d?u?u?l +?u?s?s?l?d?u?u?u +?u?s?s?l?d?u?u?s +?u?s?s?l?d?u?s?d +?u?s?s?l?d?u?s?l +?u?s?s?l?d?u?s?u +?u?s?s?l?d?u?s?s +?u?s?s?l?d?s?d?d +?u?s?s?l?d?s?d?l +?u?s?s?l?d?s?d?u +?u?s?s?l?d?s?d?s +?u?s?s?l?d?s?l?d +?u?s?s?l?d?s?l?l +?u?s?s?l?d?s?l?u +?u?s?s?l?d?s?l?s +?u?s?s?l?d?s?u?d +?u?s?s?l?d?s?u?l +?u?s?s?l?d?s?u?u +?u?s?s?l?d?s?u?s +?u?s?s?l?d?s?s?d +?u?s?s?l?d?s?s?l +?u?s?s?l?d?s?s?u +?u?s?s?l?d?s?s?s +?u?s?s?l?l?d?d?d +?u?s?s?l?l?d?d?l +?u?s?s?l?l?d?d?u +?u?s?s?l?l?d?d?s +?u?s?s?l?l?d?l?d +?u?s?s?l?l?d?l?l +?u?s?s?l?l?d?l?u +?u?s?s?l?l?d?l?s +?u?s?s?l?l?d?u?d +?u?s?s?l?l?d?u?l +?u?s?s?l?l?d?u?u +?u?s?s?l?l?d?u?s +?u?s?s?l?l?d?s?d +?u?s?s?l?l?d?s?l +?u?s?s?l?l?d?s?u +?u?s?s?l?l?d?s?s +?u?s?s?l?l?l?d?d +?u?s?s?l?l?l?d?l +?u?s?s?l?l?l?d?u +?u?s?s?l?l?l?d?s +?u?s?s?l?l?l?l?d +?u?s?s?l?l?l?u?d +?u?s?s?l?l?l?s?d +?u?s?s?l?l?u?d?d +?u?s?s?l?l?u?d?l +?u?s?s?l?l?u?d?u +?u?s?s?l?l?u?d?s +?u?s?s?l?l?u?l?d +?u?s?s?l?l?u?u?d +?u?s?s?l?l?u?s?d +?u?s?s?l?l?s?d?d +?u?s?s?l?l?s?d?l +?u?s?s?l?l?s?d?u +?u?s?s?l?l?s?d?s +?u?s?s?l?l?s?l?d +?u?s?s?l?l?s?u?d +?u?s?s?l?l?s?s?d +?u?s?s?l?u?d?d?d +?u?s?s?l?u?d?d?l +?u?s?s?l?u?d?d?u +?u?s?s?l?u?d?d?s +?u?s?s?l?u?d?l?d +?u?s?s?l?u?d?l?l +?u?s?s?l?u?d?l?u +?u?s?s?l?u?d?l?s +?u?s?s?l?u?d?u?d +?u?s?s?l?u?d?u?l +?u?s?s?l?u?d?u?u +?u?s?s?l?u?d?u?s +?u?s?s?l?u?d?s?d +?u?s?s?l?u?d?s?l +?u?s?s?l?u?d?s?u +?u?s?s?l?u?d?s?s +?u?s?s?l?u?l?d?d +?u?s?s?l?u?l?d?l +?u?s?s?l?u?l?d?u +?u?s?s?l?u?l?d?s +?u?s?s?l?u?l?l?d +?u?s?s?l?u?l?u?d +?u?s?s?l?u?l?s?d +?u?s?s?l?u?u?d?d +?u?s?s?l?u?u?d?l +?u?s?s?l?u?u?d?u +?u?s?s?l?u?u?d?s +?u?s?s?l?u?u?l?d +?u?s?s?l?u?u?u?d +?u?s?s?l?u?u?s?d +?u?s?s?l?u?s?d?d +?u?s?s?l?u?s?d?l +?u?s?s?l?u?s?d?u +?u?s?s?l?u?s?d?s +?u?s?s?l?u?s?l?d +?u?s?s?l?u?s?u?d +?u?s?s?l?u?s?s?d +?u?s?s?l?s?d?d?d +?u?s?s?l?s?d?d?l +?u?s?s?l?s?d?d?u +?u?s?s?l?s?d?d?s +?u?s?s?l?s?d?l?d +?u?s?s?l?s?d?l?l +?u?s?s?l?s?d?l?u +?u?s?s?l?s?d?l?s +?u?s?s?l?s?d?u?d +?u?s?s?l?s?d?u?l +?u?s?s?l?s?d?u?u +?u?s?s?l?s?d?u?s +?u?s?s?l?s?d?s?d +?u?s?s?l?s?d?s?l +?u?s?s?l?s?d?s?u +?u?s?s?l?s?d?s?s +?u?s?s?l?s?l?d?d +?u?s?s?l?s?l?d?l +?u?s?s?l?s?l?d?u +?u?s?s?l?s?l?d?s +?u?s?s?l?s?l?l?d +?u?s?s?l?s?l?u?d +?u?s?s?l?s?l?s?d +?u?s?s?l?s?u?d?d +?u?s?s?l?s?u?d?l +?u?s?s?l?s?u?d?u +?u?s?s?l?s?u?d?s +?u?s?s?l?s?u?l?d +?u?s?s?l?s?u?u?d +?u?s?s?l?s?u?s?d +?u?s?s?l?s?s?d?d +?u?s?s?l?s?s?d?l +?u?s?s?l?s?s?d?u +?u?s?s?l?s?s?d?s +?u?s?s?l?s?s?l?d +?u?s?s?l?s?s?u?d +?u?s?s?l?s?s?s?d +?u?s?s?u?d?d?d?l +?u?s?s?u?d?d?l?d +?u?s?s?u?d?d?l?l +?u?s?s?u?d?d?l?u +?u?s?s?u?d?d?l?s +?u?s?s?u?d?d?u?l +?u?s?s?u?d?d?s?l +?u?s?s?u?d?l?d?d +?u?s?s?u?d?l?d?l +?u?s?s?u?d?l?d?u +?u?s?s?u?d?l?d?s +?u?s?s?u?d?l?l?d +?u?s?s?u?d?l?l?l +?u?s?s?u?d?l?l?u +?u?s?s?u?d?l?l?s +?u?s?s?u?d?l?u?d +?u?s?s?u?d?l?u?l +?u?s?s?u?d?l?u?u +?u?s?s?u?d?l?u?s +?u?s?s?u?d?l?s?d +?u?s?s?u?d?l?s?l +?u?s?s?u?d?l?s?u +?u?s?s?u?d?l?s?s +?u?s?s?u?d?u?d?l +?u?s?s?u?d?u?l?d +?u?s?s?u?d?u?l?l +?u?s?s?u?d?u?l?u +?u?s?s?u?d?u?l?s +?u?s?s?u?d?u?u?l +?u?s?s?u?d?u?s?l +?u?s?s?u?d?s?d?l +?u?s?s?u?d?s?l?d +?u?s?s?u?d?s?l?l +?u?s?s?u?d?s?l?u +?u?s?s?u?d?s?l?s +?u?s?s?u?d?s?u?l +?u?s?s?u?d?s?s?l +?u?s?s?u?l?d?d?d +?u?s?s?u?l?d?d?l +?u?s?s?u?l?d?d?u +?u?s?s?u?l?d?d?s +?u?s?s?u?l?d?l?d +?u?s?s?u?l?d?l?l +?u?s?s?u?l?d?l?u +?u?s?s?u?l?d?l?s +?u?s?s?u?l?d?u?d +?u?s?s?u?l?d?u?l +?u?s?s?u?l?d?u?u +?u?s?s?u?l?d?u?s +?u?s?s?u?l?d?s?d +?u?s?s?u?l?d?s?l +?u?s?s?u?l?d?s?u +?u?s?s?u?l?d?s?s +?u?s?s?u?l?l?d?d +?u?s?s?u?l?l?d?l +?u?s?s?u?l?l?d?u +?u?s?s?u?l?l?d?s +?u?s?s?u?l?l?l?d +?u?s?s?u?l?l?u?d +?u?s?s?u?l?l?s?d +?u?s?s?u?l?u?d?d +?u?s?s?u?l?u?d?l +?u?s?s?u?l?u?d?u +?u?s?s?u?l?u?d?s +?u?s?s?u?l?u?l?d +?u?s?s?u?l?u?u?d +?u?s?s?u?l?u?s?d +?u?s?s?u?l?s?d?d +?u?s?s?u?l?s?d?l +?u?s?s?u?l?s?d?u +?u?s?s?u?l?s?d?s +?u?s?s?u?l?s?l?d +?u?s?s?u?l?s?u?d +?u?s?s?u?l?s?s?d +?u?s?s?u?u?d?d?l +?u?s?s?u?u?d?l?d +?u?s?s?u?u?d?l?l +?u?s?s?u?u?d?l?u +?u?s?s?u?u?d?l?s +?u?s?s?u?u?d?u?l +?u?s?s?u?u?d?s?l +?u?s?s?u?u?l?d?d +?u?s?s?u?u?l?d?l +?u?s?s?u?u?l?d?u +?u?s?s?u?u?l?d?s +?u?s?s?u?u?l?l?d +?u?s?s?u?u?l?u?d +?u?s?s?u?u?l?s?d +?u?s?s?u?u?u?d?l +?u?s?s?u?u?u?l?d +?u?s?s?u?u?s?d?l +?u?s?s?u?u?s?l?d +?u?s?s?u?s?d?d?l +?u?s?s?u?s?d?l?d +?u?s?s?u?s?d?l?l +?u?s?s?u?s?d?l?u +?u?s?s?u?s?d?l?s +?u?s?s?u?s?d?u?l +?u?s?s?u?s?d?s?l +?u?s?s?u?s?l?d?d +?u?s?s?u?s?l?d?l +?u?s?s?u?s?l?d?u +?u?s?s?u?s?l?d?s +?u?s?s?u?s?l?l?d +?u?s?s?u?s?l?u?d +?u?s?s?u?s?l?s?d +?u?s?s?u?s?u?d?l +?u?s?s?u?s?u?l?d +?u?s?s?u?s?s?d?l +?u?s?s?u?s?s?l?d +?u?s?s?s?d?d?d?l +?u?s?s?s?d?d?l?d +?u?s?s?s?d?d?l?l +?u?s?s?s?d?d?l?u +?u?s?s?s?d?d?l?s +?u?s?s?s?d?d?u?l +?u?s?s?s?d?d?s?l +?u?s?s?s?d?l?d?d +?u?s?s?s?d?l?d?l +?u?s?s?s?d?l?d?u +?u?s?s?s?d?l?d?s +?u?s?s?s?d?l?l?d +?u?s?s?s?d?l?l?l +?u?s?s?s?d?l?l?u +?u?s?s?s?d?l?l?s +?u?s?s?s?d?l?u?d +?u?s?s?s?d?l?u?l +?u?s?s?s?d?l?u?u +?u?s?s?s?d?l?u?s +?u?s?s?s?d?l?s?d +?u?s?s?s?d?l?s?l +?u?s?s?s?d?l?s?u +?u?s?s?s?d?l?s?s +?u?s?s?s?d?u?d?l +?u?s?s?s?d?u?l?d +?u?s?s?s?d?u?l?l +?u?s?s?s?d?u?l?u +?u?s?s?s?d?u?l?s +?u?s?s?s?d?u?u?l +?u?s?s?s?d?u?s?l +?u?s?s?s?d?s?d?l +?u?s?s?s?d?s?l?d +?u?s?s?s?d?s?l?l +?u?s?s?s?d?s?l?u +?u?s?s?s?d?s?l?s +?u?s?s?s?d?s?u?l +?u?s?s?s?d?s?s?l +?u?s?s?s?l?d?d?d +?u?s?s?s?l?d?d?l +?u?s?s?s?l?d?d?u +?u?s?s?s?l?d?d?s +?u?s?s?s?l?d?l?d +?u?s?s?s?l?d?l?l +?u?s?s?s?l?d?l?u +?u?s?s?s?l?d?l?s +?u?s?s?s?l?d?u?d +?u?s?s?s?l?d?u?l +?u?s?s?s?l?d?u?u +?u?s?s?s?l?d?u?s +?u?s?s?s?l?d?s?d +?u?s?s?s?l?d?s?l +?u?s?s?s?l?d?s?u +?u?s?s?s?l?d?s?s +?u?s?s?s?l?l?d?d +?u?s?s?s?l?l?d?l +?u?s?s?s?l?l?d?u +?u?s?s?s?l?l?d?s +?u?s?s?s?l?l?l?d +?u?s?s?s?l?l?u?d +?u?s?s?s?l?l?s?d +?u?s?s?s?l?u?d?d +?u?s?s?s?l?u?d?l +?u?s?s?s?l?u?d?u +?u?s?s?s?l?u?d?s +?u?s?s?s?l?u?l?d +?u?s?s?s?l?u?u?d +?u?s?s?s?l?u?s?d +?u?s?s?s?l?s?d?d +?u?s?s?s?l?s?d?l +?u?s?s?s?l?s?d?u +?u?s?s?s?l?s?d?s +?u?s?s?s?l?s?l?d +?u?s?s?s?l?s?u?d +?u?s?s?s?l?s?s?d +?u?s?s?s?u?d?d?l +?u?s?s?s?u?d?l?d +?u?s?s?s?u?d?l?l +?u?s?s?s?u?d?l?u +?u?s?s?s?u?d?l?s +?u?s?s?s?u?d?u?l +?u?s?s?s?u?d?s?l +?u?s?s?s?u?l?d?d +?u?s?s?s?u?l?d?l +?u?s?s?s?u?l?d?u +?u?s?s?s?u?l?d?s +?u?s?s?s?u?l?l?d +?u?s?s?s?u?l?u?d +?u?s?s?s?u?l?s?d +?u?s?s?s?u?u?d?l +?u?s?s?s?u?u?l?d +?u?s?s?s?u?s?d?l +?u?s?s?s?u?s?l?d +?u?s?s?s?s?d?d?l +?u?s?s?s?s?d?l?d +?u?s?s?s?s?d?l?l +?u?s?s?s?s?d?l?u +?u?s?s?s?s?d?l?s +?u?s?s?s?s?d?u?l +?u?s?s?s?s?d?s?l +?u?s?s?s?s?l?d?d +?u?s?s?s?s?l?d?l +?u?s?s?s?s?l?d?u +?u?s?s?s?s?l?d?s +?u?s?s?s?s?l?l?d +?u?s?s?s?s?l?u?d +?u?s?s?s?s?l?s?d +?u?s?s?s?s?u?d?l +?u?s?s?s?s?u?l?d +?u?s?s?s?s?s?d?l +?u?s?s?s?s?s?l?d +?s?d?d?d?d?d?l?u +?s?d?d?d?d?d?u?l +?s?d?d?d?d?l?d?u +?s?d?d?d?d?l?l?u +?s?d?d?d?d?l?u?d +?s?d?d?d?d?l?u?l +?s?d?d?d?d?l?u?u +?s?d?d?d?d?l?u?s +?s?d?d?d?d?l?s?u +?s?d?d?d?d?u?d?l +?s?d?d?d?d?u?l?d +?s?d?d?d?d?u?l?l +?s?d?d?d?d?u?l?u +?s?d?d?d?d?u?l?s +?s?d?d?d?d?u?u?l +?s?d?d?d?d?u?s?l +?s?d?d?d?d?s?l?u +?s?d?d?d?d?s?u?l +?s?d?d?d?l?d?d?u +?s?d?d?d?l?d?l?u +?s?d?d?d?l?d?u?d +?s?d?d?d?l?d?u?l +?s?d?d?d?l?d?u?u +?s?d?d?d?l?d?u?s +?s?d?d?d?l?d?s?u +?s?d?d?d?l?l?d?u +?s?d?d?d?l?l?l?u +?s?d?d?d?l?l?u?d +?s?d?d?d?l?l?u?l +?s?d?d?d?l?l?u?u +?s?d?d?d?l?l?u?s +?s?d?d?d?l?l?s?u +?s?d?d?d?l?u?d?d +?s?d?d?d?l?u?d?l +?s?d?d?d?l?u?d?u +?s?d?d?d?l?u?d?s +?s?d?d?d?l?u?l?d +?s?d?d?d?l?u?l?l +?s?d?d?d?l?u?l?u +?s?d?d?d?l?u?l?s +?s?d?d?d?l?u?u?d +?s?d?d?d?l?u?u?l +?s?d?d?d?l?u?u?u +?s?d?d?d?l?u?u?s +?s?d?d?d?l?u?s?d +?s?d?d?d?l?u?s?l +?s?d?d?d?l?u?s?u +?s?d?d?d?l?u?s?s +?s?d?d?d?l?s?d?u +?s?d?d?d?l?s?l?u +?s?d?d?d?l?s?u?d +?s?d?d?d?l?s?u?l +?s?d?d?d?l?s?u?u +?s?d?d?d?l?s?u?s +?s?d?d?d?l?s?s?u +?s?d?d?d?u?d?d?l +?s?d?d?d?u?d?l?d +?s?d?d?d?u?d?l?l +?s?d?d?d?u?d?l?u +?s?d?d?d?u?d?l?s +?s?d?d?d?u?d?u?l +?s?d?d?d?u?d?s?l +?s?d?d?d?u?l?d?d +?s?d?d?d?u?l?d?l +?s?d?d?d?u?l?d?u +?s?d?d?d?u?l?d?s +?s?d?d?d?u?l?l?d +?s?d?d?d?u?l?l?l +?s?d?d?d?u?l?l?u +?s?d?d?d?u?l?l?s +?s?d?d?d?u?l?u?d +?s?d?d?d?u?l?u?l +?s?d?d?d?u?l?u?u +?s?d?d?d?u?l?u?s +?s?d?d?d?u?l?s?d +?s?d?d?d?u?l?s?l +?s?d?d?d?u?l?s?u +?s?d?d?d?u?l?s?s +?s?d?d?d?u?u?d?l +?s?d?d?d?u?u?l?d +?s?d?d?d?u?u?l?l +?s?d?d?d?u?u?l?u +?s?d?d?d?u?u?l?s +?s?d?d?d?u?u?u?l +?s?d?d?d?u?u?s?l +?s?d?d?d?u?s?d?l +?s?d?d?d?u?s?l?d +?s?d?d?d?u?s?l?l +?s?d?d?d?u?s?l?u +?s?d?d?d?u?s?l?s +?s?d?d?d?u?s?u?l +?s?d?d?d?u?s?s?l +?s?d?d?d?s?d?l?u +?s?d?d?d?s?d?u?l +?s?d?d?d?s?l?d?u +?s?d?d?d?s?l?l?u +?s?d?d?d?s?l?u?d +?s?d?d?d?s?l?u?l +?s?d?d?d?s?l?u?u +?s?d?d?d?s?l?u?s +?s?d?d?d?s?l?s?u +?s?d?d?d?s?u?d?l +?s?d?d?d?s?u?l?d +?s?d?d?d?s?u?l?l +?s?d?d?d?s?u?l?u +?s?d?d?d?s?u?l?s +?s?d?d?d?s?u?u?l +?s?d?d?d?s?u?s?l +?s?d?d?d?s?s?l?u +?s?d?d?d?s?s?u?l +?s?d?d?l?d?d?d?u +?s?d?d?l?d?d?l?u +?s?d?d?l?d?d?u?d +?s?d?d?l?d?d?u?l +?s?d?d?l?d?d?u?u +?s?d?d?l?d?d?u?s +?s?d?d?l?d?d?s?u +?s?d?d?l?d?l?d?u +?s?d?d?l?d?l?l?u +?s?d?d?l?d?l?u?d +?s?d?d?l?d?l?u?l +?s?d?d?l?d?l?u?u +?s?d?d?l?d?l?u?s +?s?d?d?l?d?l?s?u +?s?d?d?l?d?u?d?d +?s?d?d?l?d?u?d?l +?s?d?d?l?d?u?d?u +?s?d?d?l?d?u?d?s +?s?d?d?l?d?u?l?d +?s?d?d?l?d?u?l?l +?s?d?d?l?d?u?l?u +?s?d?d?l?d?u?l?s +?s?d?d?l?d?u?u?d +?s?d?d?l?d?u?u?l +?s?d?d?l?d?u?u?u +?s?d?d?l?d?u?u?s +?s?d?d?l?d?u?s?d +?s?d?d?l?d?u?s?l +?s?d?d?l?d?u?s?u +?s?d?d?l?d?u?s?s +?s?d?d?l?d?s?d?u +?s?d?d?l?d?s?l?u +?s?d?d?l?d?s?u?d +?s?d?d?l?d?s?u?l +?s?d?d?l?d?s?u?u +?s?d?d?l?d?s?u?s +?s?d?d?l?d?s?s?u +?s?d?d?l?l?d?d?u +?s?d?d?l?l?d?l?u +?s?d?d?l?l?d?u?d +?s?d?d?l?l?d?u?l +?s?d?d?l?l?d?u?u +?s?d?d?l?l?d?u?s +?s?d?d?l?l?d?s?u +?s?d?d?l?l?l?d?u +?s?d?d?l?l?l?l?u +?s?d?d?l?l?l?u?d +?s?d?d?l?l?l?u?l +?s?d?d?l?l?l?u?u +?s?d?d?l?l?l?u?s +?s?d?d?l?l?l?s?u +?s?d?d?l?l?u?d?d +?s?d?d?l?l?u?d?l +?s?d?d?l?l?u?d?u +?s?d?d?l?l?u?d?s +?s?d?d?l?l?u?l?d +?s?d?d?l?l?u?l?l +?s?d?d?l?l?u?l?u +?s?d?d?l?l?u?l?s +?s?d?d?l?l?u?u?d +?s?d?d?l?l?u?u?l +?s?d?d?l?l?u?u?u +?s?d?d?l?l?u?u?s +?s?d?d?l?l?u?s?d +?s?d?d?l?l?u?s?l +?s?d?d?l?l?u?s?u +?s?d?d?l?l?u?s?s +?s?d?d?l?l?s?d?u +?s?d?d?l?l?s?l?u +?s?d?d?l?l?s?u?d +?s?d?d?l?l?s?u?l +?s?d?d?l?l?s?u?u +?s?d?d?l?l?s?u?s +?s?d?d?l?l?s?s?u +?s?d?d?l?u?d?d?d +?s?d?d?l?u?d?d?l +?s?d?d?l?u?d?d?u +?s?d?d?l?u?d?d?s +?s?d?d?l?u?d?l?d +?s?d?d?l?u?d?l?l +?s?d?d?l?u?d?l?u +?s?d?d?l?u?d?l?s +?s?d?d?l?u?d?u?d +?s?d?d?l?u?d?u?l +?s?d?d?l?u?d?u?u +?s?d?d?l?u?d?u?s +?s?d?d?l?u?d?s?d +?s?d?d?l?u?d?s?l +?s?d?d?l?u?d?s?u +?s?d?d?l?u?d?s?s +?s?d?d?l?u?l?d?d +?s?d?d?l?u?l?d?l +?s?d?d?l?u?l?d?u +?s?d?d?l?u?l?d?s +?s?d?d?l?u?l?l?d +?s?d?d?l?u?l?l?l +?s?d?d?l?u?l?l?u +?s?d?d?l?u?l?l?s +?s?d?d?l?u?l?u?d +?s?d?d?l?u?l?u?l +?s?d?d?l?u?l?u?u +?s?d?d?l?u?l?u?s +?s?d?d?l?u?l?s?d +?s?d?d?l?u?l?s?l +?s?d?d?l?u?l?s?u +?s?d?d?l?u?l?s?s +?s?d?d?l?u?u?d?d +?s?d?d?l?u?u?d?l +?s?d?d?l?u?u?d?u +?s?d?d?l?u?u?d?s +?s?d?d?l?u?u?l?d +?s?d?d?l?u?u?l?l +?s?d?d?l?u?u?l?u +?s?d?d?l?u?u?l?s +?s?d?d?l?u?u?u?d +?s?d?d?l?u?u?u?l +?s?d?d?l?u?u?u?u +?s?d?d?l?u?u?u?s +?s?d?d?l?u?u?s?d +?s?d?d?l?u?u?s?l +?s?d?d?l?u?u?s?u +?s?d?d?l?u?u?s?s +?s?d?d?l?u?s?d?d +?s?d?d?l?u?s?d?l +?s?d?d?l?u?s?d?u +?s?d?d?l?u?s?d?s +?s?d?d?l?u?s?l?d +?s?d?d?l?u?s?l?l +?s?d?d?l?u?s?l?u +?s?d?d?l?u?s?l?s +?s?d?d?l?u?s?u?d +?s?d?d?l?u?s?u?l +?s?d?d?l?u?s?u?u +?s?d?d?l?u?s?u?s +?s?d?d?l?u?s?s?d +?s?d?d?l?u?s?s?l +?s?d?d?l?u?s?s?u +?s?d?d?l?u?s?s?s +?s?d?d?l?s?d?d?u +?s?d?d?l?s?d?l?u +?s?d?d?l?s?d?u?d +?s?d?d?l?s?d?u?l +?s?d?d?l?s?d?u?u +?s?d?d?l?s?d?u?s +?s?d?d?l?s?d?s?u +?s?d?d?l?s?l?d?u +?s?d?d?l?s?l?l?u +?s?d?d?l?s?l?u?d +?s?d?d?l?s?l?u?l +?s?d?d?l?s?l?u?u +?s?d?d?l?s?l?u?s +?s?d?d?l?s?l?s?u +?s?d?d?l?s?u?d?d +?s?d?d?l?s?u?d?l +?s?d?d?l?s?u?d?u +?s?d?d?l?s?u?d?s +?s?d?d?l?s?u?l?d +?s?d?d?l?s?u?l?l +?s?d?d?l?s?u?l?u +?s?d?d?l?s?u?l?s +?s?d?d?l?s?u?u?d +?s?d?d?l?s?u?u?l +?s?d?d?l?s?u?u?u +?s?d?d?l?s?u?u?s +?s?d?d?l?s?u?s?d +?s?d?d?l?s?u?s?l +?s?d?d?l?s?u?s?u +?s?d?d?l?s?u?s?s +?s?d?d?l?s?s?d?u +?s?d?d?l?s?s?l?u +?s?d?d?l?s?s?u?d +?s?d?d?l?s?s?u?l +?s?d?d?l?s?s?u?u +?s?d?d?l?s?s?u?s +?s?d?d?l?s?s?s?u +?s?d?d?u?d?d?d?l +?s?d?d?u?d?d?l?d +?s?d?d?u?d?d?l?l +?s?d?d?u?d?d?l?u +?s?d?d?u?d?d?l?s +?s?d?d?u?d?d?u?l +?s?d?d?u?d?d?s?l +?s?d?d?u?d?l?d?d +?s?d?d?u?d?l?d?l +?s?d?d?u?d?l?d?u +?s?d?d?u?d?l?d?s +?s?d?d?u?d?l?l?d +?s?d?d?u?d?l?l?l +?s?d?d?u?d?l?l?u +?s?d?d?u?d?l?l?s +?s?d?d?u?d?l?u?d +?s?d?d?u?d?l?u?l +?s?d?d?u?d?l?u?u +?s?d?d?u?d?l?u?s +?s?d?d?u?d?l?s?d +?s?d?d?u?d?l?s?l +?s?d?d?u?d?l?s?u +?s?d?d?u?d?l?s?s +?s?d?d?u?d?u?d?l +?s?d?d?u?d?u?l?d +?s?d?d?u?d?u?l?l +?s?d?d?u?d?u?l?u +?s?d?d?u?d?u?l?s +?s?d?d?u?d?u?u?l +?s?d?d?u?d?u?s?l +?s?d?d?u?d?s?d?l +?s?d?d?u?d?s?l?d +?s?d?d?u?d?s?l?l +?s?d?d?u?d?s?l?u +?s?d?d?u?d?s?l?s +?s?d?d?u?d?s?u?l +?s?d?d?u?d?s?s?l +?s?d?d?u?l?d?d?d +?s?d?d?u?l?d?d?l +?s?d?d?u?l?d?d?u +?s?d?d?u?l?d?d?s +?s?d?d?u?l?d?l?d +?s?d?d?u?l?d?l?l +?s?d?d?u?l?d?l?u +?s?d?d?u?l?d?l?s +?s?d?d?u?l?d?u?d +?s?d?d?u?l?d?u?l +?s?d?d?u?l?d?u?u +?s?d?d?u?l?d?u?s +?s?d?d?u?l?d?s?d +?s?d?d?u?l?d?s?l +?s?d?d?u?l?d?s?u +?s?d?d?u?l?d?s?s +?s?d?d?u?l?l?d?d +?s?d?d?u?l?l?d?l +?s?d?d?u?l?l?d?u +?s?d?d?u?l?l?d?s +?s?d?d?u?l?l?l?d +?s?d?d?u?l?l?l?l +?s?d?d?u?l?l?l?u +?s?d?d?u?l?l?l?s +?s?d?d?u?l?l?u?d +?s?d?d?u?l?l?u?l +?s?d?d?u?l?l?u?u +?s?d?d?u?l?l?u?s +?s?d?d?u?l?l?s?d +?s?d?d?u?l?l?s?l +?s?d?d?u?l?l?s?u +?s?d?d?u?l?l?s?s +?s?d?d?u?l?u?d?d +?s?d?d?u?l?u?d?l +?s?d?d?u?l?u?d?u +?s?d?d?u?l?u?d?s +?s?d?d?u?l?u?l?d +?s?d?d?u?l?u?l?l +?s?d?d?u?l?u?l?u +?s?d?d?u?l?u?l?s +?s?d?d?u?l?u?u?d +?s?d?d?u?l?u?u?l +?s?d?d?u?l?u?u?u +?s?d?d?u?l?u?u?s +?s?d?d?u?l?u?s?d +?s?d?d?u?l?u?s?l +?s?d?d?u?l?u?s?u +?s?d?d?u?l?u?s?s +?s?d?d?u?l?s?d?d +?s?d?d?u?l?s?d?l +?s?d?d?u?l?s?d?u +?s?d?d?u?l?s?d?s +?s?d?d?u?l?s?l?d +?s?d?d?u?l?s?l?l +?s?d?d?u?l?s?l?u +?s?d?d?u?l?s?l?s +?s?d?d?u?l?s?u?d +?s?d?d?u?l?s?u?l +?s?d?d?u?l?s?u?u +?s?d?d?u?l?s?u?s +?s?d?d?u?l?s?s?d +?s?d?d?u?l?s?s?l +?s?d?d?u?l?s?s?u +?s?d?d?u?l?s?s?s +?s?d?d?u?u?d?d?l +?s?d?d?u?u?d?l?d +?s?d?d?u?u?d?l?l +?s?d?d?u?u?d?l?u +?s?d?d?u?u?d?l?s +?s?d?d?u?u?d?u?l +?s?d?d?u?u?d?s?l +?s?d?d?u?u?l?d?d +?s?d?d?u?u?l?d?l +?s?d?d?u?u?l?d?u +?s?d?d?u?u?l?d?s +?s?d?d?u?u?l?l?d +?s?d?d?u?u?l?l?l +?s?d?d?u?u?l?l?u +?s?d?d?u?u?l?l?s +?s?d?d?u?u?l?u?d +?s?d?d?u?u?l?u?l +?s?d?d?u?u?l?u?u +?s?d?d?u?u?l?u?s +?s?d?d?u?u?l?s?d +?s?d?d?u?u?l?s?l +?s?d?d?u?u?l?s?u +?s?d?d?u?u?l?s?s +?s?d?d?u?u?u?d?l +?s?d?d?u?u?u?l?d +?s?d?d?u?u?u?l?l +?s?d?d?u?u?u?l?u +?s?d?d?u?u?u?l?s +?s?d?d?u?u?u?u?l +?s?d?d?u?u?u?s?l +?s?d?d?u?u?s?d?l +?s?d?d?u?u?s?l?d +?s?d?d?u?u?s?l?l +?s?d?d?u?u?s?l?u +?s?d?d?u?u?s?l?s +?s?d?d?u?u?s?u?l +?s?d?d?u?u?s?s?l +?s?d?d?u?s?d?d?l +?s?d?d?u?s?d?l?d +?s?d?d?u?s?d?l?l +?s?d?d?u?s?d?l?u +?s?d?d?u?s?d?l?s +?s?d?d?u?s?d?u?l +?s?d?d?u?s?d?s?l +?s?d?d?u?s?l?d?d +?s?d?d?u?s?l?d?l +?s?d?d?u?s?l?d?u +?s?d?d?u?s?l?d?s +?s?d?d?u?s?l?l?d +?s?d?d?u?s?l?l?l +?s?d?d?u?s?l?l?u +?s?d?d?u?s?l?l?s +?s?d?d?u?s?l?u?d +?s?d?d?u?s?l?u?l +?s?d?d?u?s?l?u?u +?s?d?d?u?s?l?u?s +?s?d?d?u?s?l?s?d +?s?d?d?u?s?l?s?l +?s?d?d?u?s?l?s?u +?s?d?d?u?s?l?s?s +?s?d?d?u?s?u?d?l +?s?d?d?u?s?u?l?d +?s?d?d?u?s?u?l?l +?s?d?d?u?s?u?l?u +?s?d?d?u?s?u?l?s +?s?d?d?u?s?u?u?l +?s?d?d?u?s?u?s?l +?s?d?d?u?s?s?d?l +?s?d?d?u?s?s?l?d +?s?d?d?u?s?s?l?l +?s?d?d?u?s?s?l?u +?s?d?d?u?s?s?l?s +?s?d?d?u?s?s?u?l +?s?d?d?u?s?s?s?l +?s?d?d?s?d?d?l?u +?s?d?d?s?d?d?u?l +?s?d?d?s?d?l?d?u +?s?d?d?s?d?l?l?u +?s?d?d?s?d?l?u?d +?s?d?d?s?d?l?u?l +?s?d?d?s?d?l?u?u +?s?d?d?s?d?l?u?s +?s?d?d?s?d?l?s?u +?s?d?d?s?d?u?d?l +?s?d?d?s?d?u?l?d +?s?d?d?s?d?u?l?l +?s?d?d?s?d?u?l?u +?s?d?d?s?d?u?l?s +?s?d?d?s?d?u?u?l +?s?d?d?s?d?u?s?l +?s?d?d?s?d?s?l?u +?s?d?d?s?d?s?u?l +?s?d?d?s?l?d?d?u +?s?d?d?s?l?d?l?u +?s?d?d?s?l?d?u?d +?s?d?d?s?l?d?u?l +?s?d?d?s?l?d?u?u +?s?d?d?s?l?d?u?s +?s?d?d?s?l?d?s?u +?s?d?d?s?l?l?d?u +?s?d?d?s?l?l?l?u +?s?d?d?s?l?l?u?d +?s?d?d?s?l?l?u?l +?s?d?d?s?l?l?u?u +?s?d?d?s?l?l?u?s +?s?d?d?s?l?l?s?u +?s?d?d?s?l?u?d?d +?s?d?d?s?l?u?d?l +?s?d?d?s?l?u?d?u +?s?d?d?s?l?u?d?s +?s?d?d?s?l?u?l?d +?s?d?d?s?l?u?l?l +?s?d?d?s?l?u?l?u +?s?d?d?s?l?u?l?s +?s?d?d?s?l?u?u?d +?s?d?d?s?l?u?u?l +?s?d?d?s?l?u?u?u +?s?d?d?s?l?u?u?s +?s?d?d?s?l?u?s?d +?s?d?d?s?l?u?s?l +?s?d?d?s?l?u?s?u +?s?d?d?s?l?u?s?s +?s?d?d?s?l?s?d?u +?s?d?d?s?l?s?l?u +?s?d?d?s?l?s?u?d +?s?d?d?s?l?s?u?l +?s?d?d?s?l?s?u?u +?s?d?d?s?l?s?u?s +?s?d?d?s?l?s?s?u +?s?d?d?s?u?d?d?l +?s?d?d?s?u?d?l?d +?s?d?d?s?u?d?l?l +?s?d?d?s?u?d?l?u +?s?d?d?s?u?d?l?s +?s?d?d?s?u?d?u?l +?s?d?d?s?u?d?s?l +?s?d?d?s?u?l?d?d +?s?d?d?s?u?l?d?l +?s?d?d?s?u?l?d?u +?s?d?d?s?u?l?d?s +?s?d?d?s?u?l?l?d +?s?d?d?s?u?l?l?l +?s?d?d?s?u?l?l?u +?s?d?d?s?u?l?l?s +?s?d?d?s?u?l?u?d +?s?d?d?s?u?l?u?l +?s?d?d?s?u?l?u?u +?s?d?d?s?u?l?u?s +?s?d?d?s?u?l?s?d +?s?d?d?s?u?l?s?l +?s?d?d?s?u?l?s?u +?s?d?d?s?u?l?s?s +?s?d?d?s?u?u?d?l +?s?d?d?s?u?u?l?d +?s?d?d?s?u?u?l?l +?s?d?d?s?u?u?l?u +?s?d?d?s?u?u?l?s +?s?d?d?s?u?u?u?l +?s?d?d?s?u?u?s?l +?s?d?d?s?u?s?d?l +?s?d?d?s?u?s?l?d +?s?d?d?s?u?s?l?l +?s?d?d?s?u?s?l?u +?s?d?d?s?u?s?l?s +?s?d?d?s?u?s?u?l +?s?d?d?s?u?s?s?l +?s?d?d?s?s?d?l?u +?s?d?d?s?s?d?u?l +?s?d?d?s?s?l?d?u +?s?d?d?s?s?l?l?u +?s?d?d?s?s?l?u?d +?s?d?d?s?s?l?u?l +?s?d?d?s?s?l?u?u +?s?d?d?s?s?l?u?s +?s?d?d?s?s?l?s?u +?s?d?d?s?s?u?d?l +?s?d?d?s?s?u?l?d +?s?d?d?s?s?u?l?l +?s?d?d?s?s?u?l?u +?s?d?d?s?s?u?l?s +?s?d?d?s?s?u?u?l +?s?d?d?s?s?u?s?l +?s?d?d?s?s?s?l?u +?s?d?d?s?s?s?u?l +?s?d?l?d?d?d?d?u +?s?d?l?d?d?d?l?u +?s?d?l?d?d?d?u?d +?s?d?l?d?d?d?u?l +?s?d?l?d?d?d?u?u +?s?d?l?d?d?d?u?s +?s?d?l?d?d?d?s?u +?s?d?l?d?d?l?d?u +?s?d?l?d?d?l?l?u +?s?d?l?d?d?l?u?d +?s?d?l?d?d?l?u?l +?s?d?l?d?d?l?u?u +?s?d?l?d?d?l?u?s +?s?d?l?d?d?l?s?u +?s?d?l?d?d?u?d?d +?s?d?l?d?d?u?d?l +?s?d?l?d?d?u?d?u +?s?d?l?d?d?u?d?s +?s?d?l?d?d?u?l?d +?s?d?l?d?d?u?l?l +?s?d?l?d?d?u?l?u +?s?d?l?d?d?u?l?s +?s?d?l?d?d?u?u?d +?s?d?l?d?d?u?u?l +?s?d?l?d?d?u?u?u +?s?d?l?d?d?u?u?s +?s?d?l?d?d?u?s?d +?s?d?l?d?d?u?s?l +?s?d?l?d?d?u?s?u +?s?d?l?d?d?u?s?s +?s?d?l?d?d?s?d?u +?s?d?l?d?d?s?l?u +?s?d?l?d?d?s?u?d +?s?d?l?d?d?s?u?l +?s?d?l?d?d?s?u?u +?s?d?l?d?d?s?u?s +?s?d?l?d?d?s?s?u +?s?d?l?d?l?d?d?u +?s?d?l?d?l?d?l?u +?s?d?l?d?l?d?u?d +?s?d?l?d?l?d?u?l +?s?d?l?d?l?d?u?u +?s?d?l?d?l?d?u?s +?s?d?l?d?l?d?s?u +?s?d?l?d?l?l?d?u +?s?d?l?d?l?l?l?u +?s?d?l?d?l?l?u?d +?s?d?l?d?l?l?u?l +?s?d?l?d?l?l?u?u +?s?d?l?d?l?l?u?s +?s?d?l?d?l?l?s?u +?s?d?l?d?l?u?d?d +?s?d?l?d?l?u?d?l +?s?d?l?d?l?u?d?u +?s?d?l?d?l?u?d?s +?s?d?l?d?l?u?l?d +?s?d?l?d?l?u?l?l +?s?d?l?d?l?u?l?u +?s?d?l?d?l?u?l?s +?s?d?l?d?l?u?u?d +?s?d?l?d?l?u?u?l +?s?d?l?d?l?u?u?u +?s?d?l?d?l?u?u?s +?s?d?l?d?l?u?s?d +?s?d?l?d?l?u?s?l +?s?d?l?d?l?u?s?u +?s?d?l?d?l?u?s?s +?s?d?l?d?l?s?d?u +?s?d?l?d?l?s?l?u +?s?d?l?d?l?s?u?d +?s?d?l?d?l?s?u?l +?s?d?l?d?l?s?u?u +?s?d?l?d?l?s?u?s +?s?d?l?d?l?s?s?u +?s?d?l?d?u?d?d?d +?s?d?l?d?u?d?d?l +?s?d?l?d?u?d?d?u +?s?d?l?d?u?d?d?s +?s?d?l?d?u?d?l?d +?s?d?l?d?u?d?l?l +?s?d?l?d?u?d?l?u +?s?d?l?d?u?d?l?s +?s?d?l?d?u?d?u?d +?s?d?l?d?u?d?u?l +?s?d?l?d?u?d?u?u +?s?d?l?d?u?d?u?s +?s?d?l?d?u?d?s?d +?s?d?l?d?u?d?s?l +?s?d?l?d?u?d?s?u +?s?d?l?d?u?d?s?s +?s?d?l?d?u?l?d?d +?s?d?l?d?u?l?d?l +?s?d?l?d?u?l?d?u +?s?d?l?d?u?l?d?s +?s?d?l?d?u?l?l?d +?s?d?l?d?u?l?l?l +?s?d?l?d?u?l?l?u +?s?d?l?d?u?l?l?s +?s?d?l?d?u?l?u?d +?s?d?l?d?u?l?u?l +?s?d?l?d?u?l?u?u +?s?d?l?d?u?l?u?s +?s?d?l?d?u?l?s?d +?s?d?l?d?u?l?s?l +?s?d?l?d?u?l?s?u +?s?d?l?d?u?l?s?s +?s?d?l?d?u?u?d?d +?s?d?l?d?u?u?d?l +?s?d?l?d?u?u?d?u +?s?d?l?d?u?u?d?s +?s?d?l?d?u?u?l?d +?s?d?l?d?u?u?l?l +?s?d?l?d?u?u?l?u +?s?d?l?d?u?u?l?s +?s?d?l?d?u?u?u?d +?s?d?l?d?u?u?u?l +?s?d?l?d?u?u?u?u +?s?d?l?d?u?u?u?s +?s?d?l?d?u?u?s?d +?s?d?l?d?u?u?s?l +?s?d?l?d?u?u?s?u +?s?d?l?d?u?u?s?s +?s?d?l?d?u?s?d?d +?s?d?l?d?u?s?d?l +?s?d?l?d?u?s?d?u +?s?d?l?d?u?s?d?s +?s?d?l?d?u?s?l?d +?s?d?l?d?u?s?l?l +?s?d?l?d?u?s?l?u +?s?d?l?d?u?s?l?s +?s?d?l?d?u?s?u?d +?s?d?l?d?u?s?u?l +?s?d?l?d?u?s?u?u +?s?d?l?d?u?s?u?s +?s?d?l?d?u?s?s?d +?s?d?l?d?u?s?s?l +?s?d?l?d?u?s?s?u +?s?d?l?d?u?s?s?s +?s?d?l?d?s?d?d?u +?s?d?l?d?s?d?l?u +?s?d?l?d?s?d?u?d +?s?d?l?d?s?d?u?l +?s?d?l?d?s?d?u?u +?s?d?l?d?s?d?u?s +?s?d?l?d?s?d?s?u +?s?d?l?d?s?l?d?u +?s?d?l?d?s?l?l?u +?s?d?l?d?s?l?u?d +?s?d?l?d?s?l?u?l +?s?d?l?d?s?l?u?u +?s?d?l?d?s?l?u?s +?s?d?l?d?s?l?s?u +?s?d?l?d?s?u?d?d +?s?d?l?d?s?u?d?l +?s?d?l?d?s?u?d?u +?s?d?l?d?s?u?d?s +?s?d?l?d?s?u?l?d +?s?d?l?d?s?u?l?l +?s?d?l?d?s?u?l?u +?s?d?l?d?s?u?l?s +?s?d?l?d?s?u?u?d +?s?d?l?d?s?u?u?l +?s?d?l?d?s?u?u?u +?s?d?l?d?s?u?u?s +?s?d?l?d?s?u?s?d +?s?d?l?d?s?u?s?l +?s?d?l?d?s?u?s?u +?s?d?l?d?s?u?s?s +?s?d?l?d?s?s?d?u +?s?d?l?d?s?s?l?u +?s?d?l?d?s?s?u?d +?s?d?l?d?s?s?u?l +?s?d?l?d?s?s?u?u +?s?d?l?d?s?s?u?s +?s?d?l?d?s?s?s?u +?s?d?l?l?d?d?d?u +?s?d?l?l?d?d?l?u +?s?d?l?l?d?d?u?d +?s?d?l?l?d?d?u?l +?s?d?l?l?d?d?u?u +?s?d?l?l?d?d?u?s +?s?d?l?l?d?d?s?u +?s?d?l?l?d?l?d?u +?s?d?l?l?d?l?l?u +?s?d?l?l?d?l?u?d +?s?d?l?l?d?l?u?l +?s?d?l?l?d?l?u?u +?s?d?l?l?d?l?u?s +?s?d?l?l?d?l?s?u +?s?d?l?l?d?u?d?d +?s?d?l?l?d?u?d?l +?s?d?l?l?d?u?d?u +?s?d?l?l?d?u?d?s +?s?d?l?l?d?u?l?d +?s?d?l?l?d?u?l?l +?s?d?l?l?d?u?l?u +?s?d?l?l?d?u?l?s +?s?d?l?l?d?u?u?d +?s?d?l?l?d?u?u?l +?s?d?l?l?d?u?u?u +?s?d?l?l?d?u?u?s +?s?d?l?l?d?u?s?d +?s?d?l?l?d?u?s?l +?s?d?l?l?d?u?s?u +?s?d?l?l?d?u?s?s +?s?d?l?l?d?s?d?u +?s?d?l?l?d?s?l?u +?s?d?l?l?d?s?u?d +?s?d?l?l?d?s?u?l +?s?d?l?l?d?s?u?u +?s?d?l?l?d?s?u?s +?s?d?l?l?d?s?s?u +?s?d?l?l?l?d?d?u +?s?d?l?l?l?d?l?u +?s?d?l?l?l?d?u?d +?s?d?l?l?l?d?u?l +?s?d?l?l?l?d?u?u +?s?d?l?l?l?d?u?s +?s?d?l?l?l?d?s?u +?s?d?l?l?l?l?d?u +?s?d?l?l?l?l?l?u +?s?d?l?l?l?l?u?d +?s?d?l?l?l?l?u?l +?s?d?l?l?l?l?u?u +?s?d?l?l?l?l?u?s +?s?d?l?l?l?l?s?u +?s?d?l?l?l?u?d?d +?s?d?l?l?l?u?d?l +?s?d?l?l?l?u?d?u +?s?d?l?l?l?u?d?s +?s?d?l?l?l?u?l?d +?s?d?l?l?l?u?l?l +?s?d?l?l?l?u?l?u +?s?d?l?l?l?u?l?s +?s?d?l?l?l?u?u?d +?s?d?l?l?l?u?u?l +?s?d?l?l?l?u?u?u +?s?d?l?l?l?u?u?s +?s?d?l?l?l?u?s?d +?s?d?l?l?l?u?s?l +?s?d?l?l?l?u?s?u +?s?d?l?l?l?u?s?s +?s?d?l?l?l?s?d?u +?s?d?l?l?l?s?l?u +?s?d?l?l?l?s?u?d +?s?d?l?l?l?s?u?l +?s?d?l?l?l?s?u?u +?s?d?l?l?l?s?u?s +?s?d?l?l?l?s?s?u +?s?d?l?l?u?d?d?d +?s?d?l?l?u?d?d?l +?s?d?l?l?u?d?d?u +?s?d?l?l?u?d?d?s +?s?d?l?l?u?d?l?d +?s?d?l?l?u?d?l?l +?s?d?l?l?u?d?l?u +?s?d?l?l?u?d?l?s +?s?d?l?l?u?d?u?d +?s?d?l?l?u?d?u?l +?s?d?l?l?u?d?u?u +?s?d?l?l?u?d?u?s +?s?d?l?l?u?d?s?d +?s?d?l?l?u?d?s?l +?s?d?l?l?u?d?s?u +?s?d?l?l?u?d?s?s +?s?d?l?l?u?l?d?d +?s?d?l?l?u?l?d?l +?s?d?l?l?u?l?d?u +?s?d?l?l?u?l?d?s +?s?d?l?l?u?l?l?d +?s?d?l?l?u?l?l?l +?s?d?l?l?u?l?l?u +?s?d?l?l?u?l?l?s +?s?d?l?l?u?l?u?d +?s?d?l?l?u?l?u?l +?s?d?l?l?u?l?u?u +?s?d?l?l?u?l?u?s +?s?d?l?l?u?l?s?d +?s?d?l?l?u?l?s?l +?s?d?l?l?u?l?s?u +?s?d?l?l?u?l?s?s +?s?d?l?l?u?u?d?d +?s?d?l?l?u?u?d?l +?s?d?l?l?u?u?d?u +?s?d?l?l?u?u?d?s +?s?d?l?l?u?u?l?d +?s?d?l?l?u?u?l?l +?s?d?l?l?u?u?l?u +?s?d?l?l?u?u?l?s +?s?d?l?l?u?u?u?d +?s?d?l?l?u?u?u?l +?s?d?l?l?u?u?u?u +?s?d?l?l?u?u?u?s +?s?d?l?l?u?u?s?d +?s?d?l?l?u?u?s?l +?s?d?l?l?u?u?s?u +?s?d?l?l?u?u?s?s +?s?d?l?l?u?s?d?d +?s?d?l?l?u?s?d?l +?s?d?l?l?u?s?d?u +?s?d?l?l?u?s?d?s +?s?d?l?l?u?s?l?d +?s?d?l?l?u?s?l?l +?s?d?l?l?u?s?l?u +?s?d?l?l?u?s?l?s +?s?d?l?l?u?s?u?d +?s?d?l?l?u?s?u?l +?s?d?l?l?u?s?u?u +?s?d?l?l?u?s?u?s +?s?d?l?l?u?s?s?d +?s?d?l?l?u?s?s?l +?s?d?l?l?u?s?s?u +?s?d?l?l?u?s?s?s +?s?d?l?l?s?d?d?u +?s?d?l?l?s?d?l?u +?s?d?l?l?s?d?u?d +?s?d?l?l?s?d?u?l +?s?d?l?l?s?d?u?u +?s?d?l?l?s?d?u?s +?s?d?l?l?s?d?s?u +?s?d?l?l?s?l?d?u +?s?d?l?l?s?l?l?u +?s?d?l?l?s?l?u?d +?s?d?l?l?s?l?u?l +?s?d?l?l?s?l?u?u +?s?d?l?l?s?l?u?s +?s?d?l?l?s?l?s?u +?s?d?l?l?s?u?d?d +?s?d?l?l?s?u?d?l +?s?d?l?l?s?u?d?u +?s?d?l?l?s?u?d?s +?s?d?l?l?s?u?l?d +?s?d?l?l?s?u?l?l +?s?d?l?l?s?u?l?u +?s?d?l?l?s?u?l?s +?s?d?l?l?s?u?u?d +?s?d?l?l?s?u?u?l +?s?d?l?l?s?u?u?u +?s?d?l?l?s?u?u?s +?s?d?l?l?s?u?s?d +?s?d?l?l?s?u?s?l +?s?d?l?l?s?u?s?u +?s?d?l?l?s?u?s?s +?s?d?l?l?s?s?d?u +?s?d?l?l?s?s?l?u +?s?d?l?l?s?s?u?d +?s?d?l?l?s?s?u?l +?s?d?l?l?s?s?u?u +?s?d?l?l?s?s?u?s +?s?d?l?l?s?s?s?u +?s?d?l?u?d?d?d?d +?s?d?l?u?d?d?d?l +?s?d?l?u?d?d?d?u +?s?d?l?u?d?d?d?s +?s?d?l?u?d?d?l?d +?s?d?l?u?d?d?l?l +?s?d?l?u?d?d?l?u +?s?d?l?u?d?d?l?s +?s?d?l?u?d?d?u?d +?s?d?l?u?d?d?u?l +?s?d?l?u?d?d?u?u +?s?d?l?u?d?d?u?s +?s?d?l?u?d?d?s?d +?s?d?l?u?d?d?s?l +?s?d?l?u?d?d?s?u +?s?d?l?u?d?d?s?s +?s?d?l?u?d?l?d?d +?s?d?l?u?d?l?d?l +?s?d?l?u?d?l?d?u +?s?d?l?u?d?l?d?s +?s?d?l?u?d?l?l?d +?s?d?l?u?d?l?l?l +?s?d?l?u?d?l?l?u +?s?d?l?u?d?l?l?s +?s?d?l?u?d?l?u?d +?s?d?l?u?d?l?u?l +?s?d?l?u?d?l?u?u +?s?d?l?u?d?l?u?s +?s?d?l?u?d?l?s?d +?s?d?l?u?d?l?s?l +?s?d?l?u?d?l?s?u +?s?d?l?u?d?l?s?s +?s?d?l?u?d?u?d?d +?s?d?l?u?d?u?d?l +?s?d?l?u?d?u?d?u +?s?d?l?u?d?u?d?s +?s?d?l?u?d?u?l?d +?s?d?l?u?d?u?l?l +?s?d?l?u?d?u?l?u +?s?d?l?u?d?u?l?s +?s?d?l?u?d?u?u?d +?s?d?l?u?d?u?u?l +?s?d?l?u?d?u?u?u +?s?d?l?u?d?u?u?s +?s?d?l?u?d?u?s?d +?s?d?l?u?d?u?s?l +?s?d?l?u?d?u?s?u +?s?d?l?u?d?u?s?s +?s?d?l?u?d?s?d?d +?s?d?l?u?d?s?d?l +?s?d?l?u?d?s?d?u +?s?d?l?u?d?s?d?s +?s?d?l?u?d?s?l?d +?s?d?l?u?d?s?l?l +?s?d?l?u?d?s?l?u +?s?d?l?u?d?s?l?s +?s?d?l?u?d?s?u?d +?s?d?l?u?d?s?u?l +?s?d?l?u?d?s?u?u +?s?d?l?u?d?s?u?s +?s?d?l?u?d?s?s?d +?s?d?l?u?d?s?s?l +?s?d?l?u?d?s?s?u +?s?d?l?u?d?s?s?s +?s?d?l?u?l?d?d?d +?s?d?l?u?l?d?d?l +?s?d?l?u?l?d?d?u +?s?d?l?u?l?d?d?s +?s?d?l?u?l?d?l?d +?s?d?l?u?l?d?l?l +?s?d?l?u?l?d?l?u +?s?d?l?u?l?d?l?s +?s?d?l?u?l?d?u?d +?s?d?l?u?l?d?u?l +?s?d?l?u?l?d?u?u +?s?d?l?u?l?d?u?s +?s?d?l?u?l?d?s?d +?s?d?l?u?l?d?s?l +?s?d?l?u?l?d?s?u +?s?d?l?u?l?d?s?s +?s?d?l?u?l?l?d?d +?s?d?l?u?l?l?d?l +?s?d?l?u?l?l?d?u +?s?d?l?u?l?l?d?s +?s?d?l?u?l?l?l?d +?s?d?l?u?l?l?l?l +?s?d?l?u?l?l?l?u +?s?d?l?u?l?l?l?s +?s?d?l?u?l?l?u?d +?s?d?l?u?l?l?u?l +?s?d?l?u?l?l?u?u +?s?d?l?u?l?l?u?s +?s?d?l?u?l?l?s?d +?s?d?l?u?l?l?s?l +?s?d?l?u?l?l?s?u +?s?d?l?u?l?l?s?s +?s?d?l?u?l?u?d?d +?s?d?l?u?l?u?d?l +?s?d?l?u?l?u?d?u +?s?d?l?u?l?u?d?s +?s?d?l?u?l?u?l?d +?s?d?l?u?l?u?l?l +?s?d?l?u?l?u?l?u +?s?d?l?u?l?u?l?s +?s?d?l?u?l?u?u?d +?s?d?l?u?l?u?u?l +?s?d?l?u?l?u?u?u +?s?d?l?u?l?u?u?s +?s?d?l?u?l?u?s?d +?s?d?l?u?l?u?s?l +?s?d?l?u?l?u?s?u +?s?d?l?u?l?u?s?s +?s?d?l?u?l?s?d?d +?s?d?l?u?l?s?d?l +?s?d?l?u?l?s?d?u +?s?d?l?u?l?s?d?s +?s?d?l?u?l?s?l?d +?s?d?l?u?l?s?l?l +?s?d?l?u?l?s?l?u +?s?d?l?u?l?s?l?s +?s?d?l?u?l?s?u?d +?s?d?l?u?l?s?u?l +?s?d?l?u?l?s?u?u +?s?d?l?u?l?s?u?s +?s?d?l?u?l?s?s?d +?s?d?l?u?l?s?s?l +?s?d?l?u?l?s?s?u +?s?d?l?u?l?s?s?s +?s?d?l?u?u?d?d?d +?s?d?l?u?u?d?d?l +?s?d?l?u?u?d?d?u +?s?d?l?u?u?d?d?s +?s?d?l?u?u?d?l?d +?s?d?l?u?u?d?l?l +?s?d?l?u?u?d?l?u +?s?d?l?u?u?d?l?s +?s?d?l?u?u?d?u?d +?s?d?l?u?u?d?u?l +?s?d?l?u?u?d?u?u +?s?d?l?u?u?d?u?s +?s?d?l?u?u?d?s?d +?s?d?l?u?u?d?s?l +?s?d?l?u?u?d?s?u +?s?d?l?u?u?d?s?s +?s?d?l?u?u?l?d?d +?s?d?l?u?u?l?d?l +?s?d?l?u?u?l?d?u +?s?d?l?u?u?l?d?s +?s?d?l?u?u?l?l?d +?s?d?l?u?u?l?l?l +?s?d?l?u?u?l?l?u +?s?d?l?u?u?l?l?s +?s?d?l?u?u?l?u?d +?s?d?l?u?u?l?u?l +?s?d?l?u?u?l?u?u +?s?d?l?u?u?l?u?s +?s?d?l?u?u?l?s?d +?s?d?l?u?u?l?s?l +?s?d?l?u?u?l?s?u +?s?d?l?u?u?l?s?s +?s?d?l?u?u?u?d?d +?s?d?l?u?u?u?d?l +?s?d?l?u?u?u?d?u +?s?d?l?u?u?u?d?s +?s?d?l?u?u?u?l?d +?s?d?l?u?u?u?l?l +?s?d?l?u?u?u?l?u +?s?d?l?u?u?u?l?s +?s?d?l?u?u?u?u?d +?s?d?l?u?u?u?u?l +?s?d?l?u?u?u?u?u +?s?d?l?u?u?u?u?s +?s?d?l?u?u?u?s?d +?s?d?l?u?u?u?s?l +?s?d?l?u?u?u?s?u +?s?d?l?u?u?u?s?s +?s?d?l?u?u?s?d?d +?s?d?l?u?u?s?d?l +?s?d?l?u?u?s?d?u +?s?d?l?u?u?s?d?s +?s?d?l?u?u?s?l?d +?s?d?l?u?u?s?l?l +?s?d?l?u?u?s?l?u +?s?d?l?u?u?s?l?s +?s?d?l?u?u?s?u?d +?s?d?l?u?u?s?u?l +?s?d?l?u?u?s?u?u +?s?d?l?u?u?s?u?s +?s?d?l?u?u?s?s?d +?s?d?l?u?u?s?s?l +?s?d?l?u?u?s?s?u +?s?d?l?u?u?s?s?s +?s?d?l?u?s?d?d?d +?s?d?l?u?s?d?d?l +?s?d?l?u?s?d?d?u +?s?d?l?u?s?d?d?s +?s?d?l?u?s?d?l?d +?s?d?l?u?s?d?l?l +?s?d?l?u?s?d?l?u +?s?d?l?u?s?d?l?s +?s?d?l?u?s?d?u?d +?s?d?l?u?s?d?u?l +?s?d?l?u?s?d?u?u +?s?d?l?u?s?d?u?s +?s?d?l?u?s?d?s?d +?s?d?l?u?s?d?s?l +?s?d?l?u?s?d?s?u +?s?d?l?u?s?d?s?s +?s?d?l?u?s?l?d?d +?s?d?l?u?s?l?d?l +?s?d?l?u?s?l?d?u +?s?d?l?u?s?l?d?s +?s?d?l?u?s?l?l?d +?s?d?l?u?s?l?l?l +?s?d?l?u?s?l?l?u +?s?d?l?u?s?l?l?s +?s?d?l?u?s?l?u?d +?s?d?l?u?s?l?u?l +?s?d?l?u?s?l?u?u +?s?d?l?u?s?l?u?s +?s?d?l?u?s?l?s?d +?s?d?l?u?s?l?s?l +?s?d?l?u?s?l?s?u +?s?d?l?u?s?l?s?s +?s?d?l?u?s?u?d?d +?s?d?l?u?s?u?d?l +?s?d?l?u?s?u?d?u +?s?d?l?u?s?u?d?s +?s?d?l?u?s?u?l?d +?s?d?l?u?s?u?l?l +?s?d?l?u?s?u?l?u +?s?d?l?u?s?u?l?s +?s?d?l?u?s?u?u?d +?s?d?l?u?s?u?u?l +?s?d?l?u?s?u?u?u +?s?d?l?u?s?u?u?s +?s?d?l?u?s?u?s?d +?s?d?l?u?s?u?s?l +?s?d?l?u?s?u?s?u +?s?d?l?u?s?u?s?s +?s?d?l?u?s?s?d?d +?s?d?l?u?s?s?d?l +?s?d?l?u?s?s?d?u +?s?d?l?u?s?s?d?s +?s?d?l?u?s?s?l?d +?s?d?l?u?s?s?l?l +?s?d?l?u?s?s?l?u +?s?d?l?u?s?s?l?s +?s?d?l?u?s?s?u?d +?s?d?l?u?s?s?u?l +?s?d?l?u?s?s?u?u +?s?d?l?u?s?s?u?s +?s?d?l?u?s?s?s?d +?s?d?l?u?s?s?s?l +?s?d?l?u?s?s?s?u +?s?d?l?u?s?s?s?s +?s?d?l?s?d?d?d?u +?s?d?l?s?d?d?l?u +?s?d?l?s?d?d?u?d +?s?d?l?s?d?d?u?l +?s?d?l?s?d?d?u?u +?s?d?l?s?d?d?u?s +?s?d?l?s?d?d?s?u +?s?d?l?s?d?l?d?u +?s?d?l?s?d?l?l?u +?s?d?l?s?d?l?u?d +?s?d?l?s?d?l?u?l +?s?d?l?s?d?l?u?u +?s?d?l?s?d?l?u?s +?s?d?l?s?d?l?s?u +?s?d?l?s?d?u?d?d +?s?d?l?s?d?u?d?l +?s?d?l?s?d?u?d?u +?s?d?l?s?d?u?d?s +?s?d?l?s?d?u?l?d +?s?d?l?s?d?u?l?l +?s?d?l?s?d?u?l?u +?s?d?l?s?d?u?l?s +?s?d?l?s?d?u?u?d +?s?d?l?s?d?u?u?l +?s?d?l?s?d?u?u?u +?s?d?l?s?d?u?u?s +?s?d?l?s?d?u?s?d +?s?d?l?s?d?u?s?l +?s?d?l?s?d?u?s?u +?s?d?l?s?d?u?s?s +?s?d?l?s?d?s?d?u +?s?d?l?s?d?s?l?u +?s?d?l?s?d?s?u?d +?s?d?l?s?d?s?u?l +?s?d?l?s?d?s?u?u +?s?d?l?s?d?s?u?s +?s?d?l?s?d?s?s?u +?s?d?l?s?l?d?d?u +?s?d?l?s?l?d?l?u +?s?d?l?s?l?d?u?d +?s?d?l?s?l?d?u?l +?s?d?l?s?l?d?u?u +?s?d?l?s?l?d?u?s +?s?d?l?s?l?d?s?u +?s?d?l?s?l?l?d?u +?s?d?l?s?l?l?l?u +?s?d?l?s?l?l?u?d +?s?d?l?s?l?l?u?l +?s?d?l?s?l?l?u?u +?s?d?l?s?l?l?u?s +?s?d?l?s?l?l?s?u +?s?d?l?s?l?u?d?d +?s?d?l?s?l?u?d?l +?s?d?l?s?l?u?d?u +?s?d?l?s?l?u?d?s +?s?d?l?s?l?u?l?d +?s?d?l?s?l?u?l?l +?s?d?l?s?l?u?l?u +?s?d?l?s?l?u?l?s +?s?d?l?s?l?u?u?d +?s?d?l?s?l?u?u?l +?s?d?l?s?l?u?u?u +?s?d?l?s?l?u?u?s +?s?d?l?s?l?u?s?d +?s?d?l?s?l?u?s?l +?s?d?l?s?l?u?s?u +?s?d?l?s?l?u?s?s +?s?d?l?s?l?s?d?u +?s?d?l?s?l?s?l?u +?s?d?l?s?l?s?u?d +?s?d?l?s?l?s?u?l +?s?d?l?s?l?s?u?u +?s?d?l?s?l?s?u?s +?s?d?l?s?l?s?s?u +?s?d?l?s?u?d?d?d +?s?d?l?s?u?d?d?l +?s?d?l?s?u?d?d?u +?s?d?l?s?u?d?d?s +?s?d?l?s?u?d?l?d +?s?d?l?s?u?d?l?l +?s?d?l?s?u?d?l?u +?s?d?l?s?u?d?l?s +?s?d?l?s?u?d?u?d +?s?d?l?s?u?d?u?l +?s?d?l?s?u?d?u?u +?s?d?l?s?u?d?u?s +?s?d?l?s?u?d?s?d +?s?d?l?s?u?d?s?l +?s?d?l?s?u?d?s?u +?s?d?l?s?u?d?s?s +?s?d?l?s?u?l?d?d +?s?d?l?s?u?l?d?l +?s?d?l?s?u?l?d?u +?s?d?l?s?u?l?d?s +?s?d?l?s?u?l?l?d +?s?d?l?s?u?l?l?l +?s?d?l?s?u?l?l?u +?s?d?l?s?u?l?l?s +?s?d?l?s?u?l?u?d +?s?d?l?s?u?l?u?l +?s?d?l?s?u?l?u?u +?s?d?l?s?u?l?u?s +?s?d?l?s?u?l?s?d +?s?d?l?s?u?l?s?l +?s?d?l?s?u?l?s?u +?s?d?l?s?u?l?s?s +?s?d?l?s?u?u?d?d +?s?d?l?s?u?u?d?l +?s?d?l?s?u?u?d?u +?s?d?l?s?u?u?d?s +?s?d?l?s?u?u?l?d +?s?d?l?s?u?u?l?l +?s?d?l?s?u?u?l?u +?s?d?l?s?u?u?l?s +?s?d?l?s?u?u?u?d +?s?d?l?s?u?u?u?l +?s?d?l?s?u?u?u?u +?s?d?l?s?u?u?u?s +?s?d?l?s?u?u?s?d +?s?d?l?s?u?u?s?l +?s?d?l?s?u?u?s?u +?s?d?l?s?u?u?s?s +?s?d?l?s?u?s?d?d +?s?d?l?s?u?s?d?l +?s?d?l?s?u?s?d?u +?s?d?l?s?u?s?d?s +?s?d?l?s?u?s?l?d +?s?d?l?s?u?s?l?l +?s?d?l?s?u?s?l?u +?s?d?l?s?u?s?l?s +?s?d?l?s?u?s?u?d +?s?d?l?s?u?s?u?l +?s?d?l?s?u?s?u?u +?s?d?l?s?u?s?u?s +?s?d?l?s?u?s?s?d +?s?d?l?s?u?s?s?l +?s?d?l?s?u?s?s?u +?s?d?l?s?u?s?s?s +?s?d?l?s?s?d?d?u +?s?d?l?s?s?d?l?u +?s?d?l?s?s?d?u?d +?s?d?l?s?s?d?u?l +?s?d?l?s?s?d?u?u +?s?d?l?s?s?d?u?s +?s?d?l?s?s?d?s?u +?s?d?l?s?s?l?d?u +?s?d?l?s?s?l?l?u +?s?d?l?s?s?l?u?d +?s?d?l?s?s?l?u?l +?s?d?l?s?s?l?u?u +?s?d?l?s?s?l?u?s +?s?d?l?s?s?l?s?u +?s?d?l?s?s?u?d?d +?s?d?l?s?s?u?d?l +?s?d?l?s?s?u?d?u +?s?d?l?s?s?u?d?s +?s?d?l?s?s?u?l?d +?s?d?l?s?s?u?l?l +?s?d?l?s?s?u?l?u +?s?d?l?s?s?u?l?s +?s?d?l?s?s?u?u?d +?s?d?l?s?s?u?u?l +?s?d?l?s?s?u?u?u +?s?d?l?s?s?u?u?s +?s?d?l?s?s?u?s?d +?s?d?l?s?s?u?s?l +?s?d?l?s?s?u?s?u +?s?d?l?s?s?u?s?s +?s?d?l?s?s?s?d?u +?s?d?l?s?s?s?l?u +?s?d?l?s?s?s?u?d +?s?d?l?s?s?s?u?l +?s?d?l?s?s?s?u?u +?s?d?l?s?s?s?u?s +?s?d?l?s?s?s?s?u +?s?d?u?d?d?d?d?l +?s?d?u?d?d?d?l?d +?s?d?u?d?d?d?l?l +?s?d?u?d?d?d?l?u +?s?d?u?d?d?d?l?s +?s?d?u?d?d?d?u?l +?s?d?u?d?d?d?s?l +?s?d?u?d?d?l?d?d +?s?d?u?d?d?l?d?l +?s?d?u?d?d?l?d?u +?s?d?u?d?d?l?d?s +?s?d?u?d?d?l?l?d +?s?d?u?d?d?l?l?l +?s?d?u?d?d?l?l?u +?s?d?u?d?d?l?l?s +?s?d?u?d?d?l?u?d +?s?d?u?d?d?l?u?l +?s?d?u?d?d?l?u?u +?s?d?u?d?d?l?u?s +?s?d?u?d?d?l?s?d +?s?d?u?d?d?l?s?l +?s?d?u?d?d?l?s?u +?s?d?u?d?d?l?s?s +?s?d?u?d?d?u?d?l +?s?d?u?d?d?u?l?d +?s?d?u?d?d?u?l?l +?s?d?u?d?d?u?l?u +?s?d?u?d?d?u?l?s +?s?d?u?d?d?u?u?l +?s?d?u?d?d?u?s?l +?s?d?u?d?d?s?d?l +?s?d?u?d?d?s?l?d +?s?d?u?d?d?s?l?l +?s?d?u?d?d?s?l?u +?s?d?u?d?d?s?l?s +?s?d?u?d?d?s?u?l +?s?d?u?d?d?s?s?l +?s?d?u?d?l?d?d?d +?s?d?u?d?l?d?d?l +?s?d?u?d?l?d?d?u +?s?d?u?d?l?d?d?s +?s?d?u?d?l?d?l?d +?s?d?u?d?l?d?l?l +?s?d?u?d?l?d?l?u +?s?d?u?d?l?d?l?s +?s?d?u?d?l?d?u?d +?s?d?u?d?l?d?u?l +?s?d?u?d?l?d?u?u +?s?d?u?d?l?d?u?s +?s?d?u?d?l?d?s?d +?s?d?u?d?l?d?s?l +?s?d?u?d?l?d?s?u +?s?d?u?d?l?d?s?s +?s?d?u?d?l?l?d?d +?s?d?u?d?l?l?d?l +?s?d?u?d?l?l?d?u +?s?d?u?d?l?l?d?s +?s?d?u?d?l?l?l?d +?s?d?u?d?l?l?l?l +?s?d?u?d?l?l?l?u +?s?d?u?d?l?l?l?s +?s?d?u?d?l?l?u?d +?s?d?u?d?l?l?u?l +?s?d?u?d?l?l?u?u +?s?d?u?d?l?l?u?s +?s?d?u?d?l?l?s?d +?s?d?u?d?l?l?s?l +?s?d?u?d?l?l?s?u +?s?d?u?d?l?l?s?s +?s?d?u?d?l?u?d?d +?s?d?u?d?l?u?d?l +?s?d?u?d?l?u?d?u +?s?d?u?d?l?u?d?s +?s?d?u?d?l?u?l?d +?s?d?u?d?l?u?l?l +?s?d?u?d?l?u?l?u +?s?d?u?d?l?u?l?s +?s?d?u?d?l?u?u?d +?s?d?u?d?l?u?u?l +?s?d?u?d?l?u?u?u +?s?d?u?d?l?u?u?s +?s?d?u?d?l?u?s?d +?s?d?u?d?l?u?s?l +?s?d?u?d?l?u?s?u +?s?d?u?d?l?u?s?s +?s?d?u?d?l?s?d?d +?s?d?u?d?l?s?d?l +?s?d?u?d?l?s?d?u +?s?d?u?d?l?s?d?s +?s?d?u?d?l?s?l?d +?s?d?u?d?l?s?l?l +?s?d?u?d?l?s?l?u +?s?d?u?d?l?s?l?s +?s?d?u?d?l?s?u?d +?s?d?u?d?l?s?u?l +?s?d?u?d?l?s?u?u +?s?d?u?d?l?s?u?s +?s?d?u?d?l?s?s?d +?s?d?u?d?l?s?s?l +?s?d?u?d?l?s?s?u +?s?d?u?d?l?s?s?s +?s?d?u?d?u?d?d?l +?s?d?u?d?u?d?l?d +?s?d?u?d?u?d?l?l +?s?d?u?d?u?d?l?u +?s?d?u?d?u?d?l?s +?s?d?u?d?u?d?u?l +?s?d?u?d?u?d?s?l +?s?d?u?d?u?l?d?d +?s?d?u?d?u?l?d?l +?s?d?u?d?u?l?d?u +?s?d?u?d?u?l?d?s +?s?d?u?d?u?l?l?d +?s?d?u?d?u?l?l?l +?s?d?u?d?u?l?l?u +?s?d?u?d?u?l?l?s +?s?d?u?d?u?l?u?d +?s?d?u?d?u?l?u?l +?s?d?u?d?u?l?u?u +?s?d?u?d?u?l?u?s +?s?d?u?d?u?l?s?d +?s?d?u?d?u?l?s?l +?s?d?u?d?u?l?s?u +?s?d?u?d?u?l?s?s +?s?d?u?d?u?u?d?l +?s?d?u?d?u?u?l?d +?s?d?u?d?u?u?l?l +?s?d?u?d?u?u?l?u +?s?d?u?d?u?u?l?s +?s?d?u?d?u?u?u?l +?s?d?u?d?u?u?s?l +?s?d?u?d?u?s?d?l +?s?d?u?d?u?s?l?d +?s?d?u?d?u?s?l?l +?s?d?u?d?u?s?l?u +?s?d?u?d?u?s?l?s +?s?d?u?d?u?s?u?l +?s?d?u?d?u?s?s?l +?s?d?u?d?s?d?d?l +?s?d?u?d?s?d?l?d +?s?d?u?d?s?d?l?l +?s?d?u?d?s?d?l?u +?s?d?u?d?s?d?l?s +?s?d?u?d?s?d?u?l +?s?d?u?d?s?d?s?l +?s?d?u?d?s?l?d?d +?s?d?u?d?s?l?d?l +?s?d?u?d?s?l?d?u +?s?d?u?d?s?l?d?s +?s?d?u?d?s?l?l?d +?s?d?u?d?s?l?l?l +?s?d?u?d?s?l?l?u +?s?d?u?d?s?l?l?s +?s?d?u?d?s?l?u?d +?s?d?u?d?s?l?u?l +?s?d?u?d?s?l?u?u +?s?d?u?d?s?l?u?s +?s?d?u?d?s?l?s?d +?s?d?u?d?s?l?s?l +?s?d?u?d?s?l?s?u +?s?d?u?d?s?l?s?s +?s?d?u?d?s?u?d?l +?s?d?u?d?s?u?l?d +?s?d?u?d?s?u?l?l +?s?d?u?d?s?u?l?u +?s?d?u?d?s?u?l?s +?s?d?u?d?s?u?u?l +?s?d?u?d?s?u?s?l +?s?d?u?d?s?s?d?l +?s?d?u?d?s?s?l?d +?s?d?u?d?s?s?l?l +?s?d?u?d?s?s?l?u +?s?d?u?d?s?s?l?s +?s?d?u?d?s?s?u?l +?s?d?u?d?s?s?s?l +?s?d?u?l?d?d?d?d +?s?d?u?l?d?d?d?l +?s?d?u?l?d?d?d?u +?s?d?u?l?d?d?d?s +?s?d?u?l?d?d?l?d +?s?d?u?l?d?d?l?l +?s?d?u?l?d?d?l?u +?s?d?u?l?d?d?l?s +?s?d?u?l?d?d?u?d +?s?d?u?l?d?d?u?l +?s?d?u?l?d?d?u?u +?s?d?u?l?d?d?u?s +?s?d?u?l?d?d?s?d +?s?d?u?l?d?d?s?l +?s?d?u?l?d?d?s?u +?s?d?u?l?d?d?s?s +?s?d?u?l?d?l?d?d +?s?d?u?l?d?l?d?l +?s?d?u?l?d?l?d?u +?s?d?u?l?d?l?d?s +?s?d?u?l?d?l?l?d +?s?d?u?l?d?l?l?l +?s?d?u?l?d?l?l?u +?s?d?u?l?d?l?l?s +?s?d?u?l?d?l?u?d +?s?d?u?l?d?l?u?l +?s?d?u?l?d?l?u?u +?s?d?u?l?d?l?u?s +?s?d?u?l?d?l?s?d +?s?d?u?l?d?l?s?l +?s?d?u?l?d?l?s?u +?s?d?u?l?d?l?s?s +?s?d?u?l?d?u?d?d +?s?d?u?l?d?u?d?l +?s?d?u?l?d?u?d?u +?s?d?u?l?d?u?d?s +?s?d?u?l?d?u?l?d +?s?d?u?l?d?u?l?l +?s?d?u?l?d?u?l?u +?s?d?u?l?d?u?l?s +?s?d?u?l?d?u?u?d +?s?d?u?l?d?u?u?l +?s?d?u?l?d?u?u?u +?s?d?u?l?d?u?u?s +?s?d?u?l?d?u?s?d +?s?d?u?l?d?u?s?l +?s?d?u?l?d?u?s?u +?s?d?u?l?d?u?s?s +?s?d?u?l?d?s?d?d +?s?d?u?l?d?s?d?l +?s?d?u?l?d?s?d?u +?s?d?u?l?d?s?d?s +?s?d?u?l?d?s?l?d +?s?d?u?l?d?s?l?l +?s?d?u?l?d?s?l?u +?s?d?u?l?d?s?l?s +?s?d?u?l?d?s?u?d +?s?d?u?l?d?s?u?l +?s?d?u?l?d?s?u?u +?s?d?u?l?d?s?u?s +?s?d?u?l?d?s?s?d +?s?d?u?l?d?s?s?l +?s?d?u?l?d?s?s?u +?s?d?u?l?d?s?s?s +?s?d?u?l?l?d?d?d +?s?d?u?l?l?d?d?l +?s?d?u?l?l?d?d?u +?s?d?u?l?l?d?d?s +?s?d?u?l?l?d?l?d +?s?d?u?l?l?d?l?l +?s?d?u?l?l?d?l?u +?s?d?u?l?l?d?l?s +?s?d?u?l?l?d?u?d +?s?d?u?l?l?d?u?l +?s?d?u?l?l?d?u?u +?s?d?u?l?l?d?u?s +?s?d?u?l?l?d?s?d +?s?d?u?l?l?d?s?l +?s?d?u?l?l?d?s?u +?s?d?u?l?l?d?s?s +?s?d?u?l?l?l?d?d +?s?d?u?l?l?l?d?l +?s?d?u?l?l?l?d?u +?s?d?u?l?l?l?d?s +?s?d?u?l?l?l?l?d +?s?d?u?l?l?l?l?l +?s?d?u?l?l?l?l?u +?s?d?u?l?l?l?l?s +?s?d?u?l?l?l?u?d +?s?d?u?l?l?l?u?l +?s?d?u?l?l?l?u?u +?s?d?u?l?l?l?u?s +?s?d?u?l?l?l?s?d +?s?d?u?l?l?l?s?l +?s?d?u?l?l?l?s?u +?s?d?u?l?l?l?s?s +?s?d?u?l?l?u?d?d +?s?d?u?l?l?u?d?l +?s?d?u?l?l?u?d?u +?s?d?u?l?l?u?d?s +?s?d?u?l?l?u?l?d +?s?d?u?l?l?u?l?l +?s?d?u?l?l?u?l?u +?s?d?u?l?l?u?l?s +?s?d?u?l?l?u?u?d +?s?d?u?l?l?u?u?l +?s?d?u?l?l?u?u?u +?s?d?u?l?l?u?u?s +?s?d?u?l?l?u?s?d +?s?d?u?l?l?u?s?l +?s?d?u?l?l?u?s?u +?s?d?u?l?l?u?s?s +?s?d?u?l?l?s?d?d +?s?d?u?l?l?s?d?l +?s?d?u?l?l?s?d?u +?s?d?u?l?l?s?d?s +?s?d?u?l?l?s?l?d +?s?d?u?l?l?s?l?l +?s?d?u?l?l?s?l?u +?s?d?u?l?l?s?l?s +?s?d?u?l?l?s?u?d +?s?d?u?l?l?s?u?l +?s?d?u?l?l?s?u?u +?s?d?u?l?l?s?u?s +?s?d?u?l?l?s?s?d +?s?d?u?l?l?s?s?l +?s?d?u?l?l?s?s?u +?s?d?u?l?l?s?s?s +?s?d?u?l?u?d?d?d +?s?d?u?l?u?d?d?l +?s?d?u?l?u?d?d?u +?s?d?u?l?u?d?d?s +?s?d?u?l?u?d?l?d +?s?d?u?l?u?d?l?l +?s?d?u?l?u?d?l?u +?s?d?u?l?u?d?l?s +?s?d?u?l?u?d?u?d +?s?d?u?l?u?d?u?l +?s?d?u?l?u?d?u?u +?s?d?u?l?u?d?u?s +?s?d?u?l?u?d?s?d +?s?d?u?l?u?d?s?l +?s?d?u?l?u?d?s?u +?s?d?u?l?u?d?s?s +?s?d?u?l?u?l?d?d +?s?d?u?l?u?l?d?l +?s?d?u?l?u?l?d?u +?s?d?u?l?u?l?d?s +?s?d?u?l?u?l?l?d +?s?d?u?l?u?l?l?l +?s?d?u?l?u?l?l?u +?s?d?u?l?u?l?l?s +?s?d?u?l?u?l?u?d +?s?d?u?l?u?l?u?l +?s?d?u?l?u?l?u?u +?s?d?u?l?u?l?u?s +?s?d?u?l?u?l?s?d +?s?d?u?l?u?l?s?l +?s?d?u?l?u?l?s?u +?s?d?u?l?u?l?s?s +?s?d?u?l?u?u?d?d +?s?d?u?l?u?u?d?l +?s?d?u?l?u?u?d?u +?s?d?u?l?u?u?d?s +?s?d?u?l?u?u?l?d +?s?d?u?l?u?u?l?l +?s?d?u?l?u?u?l?u +?s?d?u?l?u?u?l?s +?s?d?u?l?u?u?u?d +?s?d?u?l?u?u?u?l +?s?d?u?l?u?u?u?u +?s?d?u?l?u?u?u?s +?s?d?u?l?u?u?s?d +?s?d?u?l?u?u?s?l +?s?d?u?l?u?u?s?u +?s?d?u?l?u?u?s?s +?s?d?u?l?u?s?d?d +?s?d?u?l?u?s?d?l +?s?d?u?l?u?s?d?u +?s?d?u?l?u?s?d?s +?s?d?u?l?u?s?l?d +?s?d?u?l?u?s?l?l +?s?d?u?l?u?s?l?u +?s?d?u?l?u?s?l?s +?s?d?u?l?u?s?u?d +?s?d?u?l?u?s?u?l +?s?d?u?l?u?s?u?u +?s?d?u?l?u?s?u?s +?s?d?u?l?u?s?s?d +?s?d?u?l?u?s?s?l +?s?d?u?l?u?s?s?u +?s?d?u?l?u?s?s?s +?s?d?u?l?s?d?d?d +?s?d?u?l?s?d?d?l +?s?d?u?l?s?d?d?u +?s?d?u?l?s?d?d?s +?s?d?u?l?s?d?l?d +?s?d?u?l?s?d?l?l +?s?d?u?l?s?d?l?u +?s?d?u?l?s?d?l?s +?s?d?u?l?s?d?u?d +?s?d?u?l?s?d?u?l +?s?d?u?l?s?d?u?u +?s?d?u?l?s?d?u?s +?s?d?u?l?s?d?s?d +?s?d?u?l?s?d?s?l +?s?d?u?l?s?d?s?u +?s?d?u?l?s?d?s?s +?s?d?u?l?s?l?d?d +?s?d?u?l?s?l?d?l +?s?d?u?l?s?l?d?u +?s?d?u?l?s?l?d?s +?s?d?u?l?s?l?l?d +?s?d?u?l?s?l?l?l +?s?d?u?l?s?l?l?u +?s?d?u?l?s?l?l?s +?s?d?u?l?s?l?u?d +?s?d?u?l?s?l?u?l +?s?d?u?l?s?l?u?u +?s?d?u?l?s?l?u?s +?s?d?u?l?s?l?s?d +?s?d?u?l?s?l?s?l +?s?d?u?l?s?l?s?u +?s?d?u?l?s?l?s?s +?s?d?u?l?s?u?d?d +?s?d?u?l?s?u?d?l +?s?d?u?l?s?u?d?u +?s?d?u?l?s?u?d?s +?s?d?u?l?s?u?l?d +?s?d?u?l?s?u?l?l +?s?d?u?l?s?u?l?u +?s?d?u?l?s?u?l?s +?s?d?u?l?s?u?u?d +?s?d?u?l?s?u?u?l +?s?d?u?l?s?u?u?u +?s?d?u?l?s?u?u?s +?s?d?u?l?s?u?s?d +?s?d?u?l?s?u?s?l +?s?d?u?l?s?u?s?u +?s?d?u?l?s?u?s?s +?s?d?u?l?s?s?d?d +?s?d?u?l?s?s?d?l +?s?d?u?l?s?s?d?u +?s?d?u?l?s?s?d?s +?s?d?u?l?s?s?l?d +?s?d?u?l?s?s?l?l +?s?d?u?l?s?s?l?u +?s?d?u?l?s?s?l?s +?s?d?u?l?s?s?u?d +?s?d?u?l?s?s?u?l +?s?d?u?l?s?s?u?u +?s?d?u?l?s?s?u?s +?s?d?u?l?s?s?s?d +?s?d?u?l?s?s?s?l +?s?d?u?l?s?s?s?u +?s?d?u?l?s?s?s?s +?s?d?u?u?d?d?d?l +?s?d?u?u?d?d?l?d +?s?d?u?u?d?d?l?l +?s?d?u?u?d?d?l?u +?s?d?u?u?d?d?l?s +?s?d?u?u?d?d?u?l +?s?d?u?u?d?d?s?l +?s?d?u?u?d?l?d?d +?s?d?u?u?d?l?d?l +?s?d?u?u?d?l?d?u +?s?d?u?u?d?l?d?s +?s?d?u?u?d?l?l?d +?s?d?u?u?d?l?l?l +?s?d?u?u?d?l?l?u +?s?d?u?u?d?l?l?s +?s?d?u?u?d?l?u?d +?s?d?u?u?d?l?u?l +?s?d?u?u?d?l?u?u +?s?d?u?u?d?l?u?s +?s?d?u?u?d?l?s?d +?s?d?u?u?d?l?s?l +?s?d?u?u?d?l?s?u +?s?d?u?u?d?l?s?s +?s?d?u?u?d?u?d?l +?s?d?u?u?d?u?l?d +?s?d?u?u?d?u?l?l +?s?d?u?u?d?u?l?u +?s?d?u?u?d?u?l?s +?s?d?u?u?d?u?u?l +?s?d?u?u?d?u?s?l +?s?d?u?u?d?s?d?l +?s?d?u?u?d?s?l?d +?s?d?u?u?d?s?l?l +?s?d?u?u?d?s?l?u +?s?d?u?u?d?s?l?s +?s?d?u?u?d?s?u?l +?s?d?u?u?d?s?s?l +?s?d?u?u?l?d?d?d +?s?d?u?u?l?d?d?l +?s?d?u?u?l?d?d?u +?s?d?u?u?l?d?d?s +?s?d?u?u?l?d?l?d +?s?d?u?u?l?d?l?l +?s?d?u?u?l?d?l?u +?s?d?u?u?l?d?l?s +?s?d?u?u?l?d?u?d +?s?d?u?u?l?d?u?l +?s?d?u?u?l?d?u?u +?s?d?u?u?l?d?u?s +?s?d?u?u?l?d?s?d +?s?d?u?u?l?d?s?l +?s?d?u?u?l?d?s?u +?s?d?u?u?l?d?s?s +?s?d?u?u?l?l?d?d +?s?d?u?u?l?l?d?l +?s?d?u?u?l?l?d?u +?s?d?u?u?l?l?d?s +?s?d?u?u?l?l?l?d +?s?d?u?u?l?l?l?l +?s?d?u?u?l?l?l?u +?s?d?u?u?l?l?l?s +?s?d?u?u?l?l?u?d +?s?d?u?u?l?l?u?l +?s?d?u?u?l?l?u?u +?s?d?u?u?l?l?u?s +?s?d?u?u?l?l?s?d +?s?d?u?u?l?l?s?l +?s?d?u?u?l?l?s?u +?s?d?u?u?l?l?s?s +?s?d?u?u?l?u?d?d +?s?d?u?u?l?u?d?l +?s?d?u?u?l?u?d?u +?s?d?u?u?l?u?d?s +?s?d?u?u?l?u?l?d +?s?d?u?u?l?u?l?l +?s?d?u?u?l?u?l?u +?s?d?u?u?l?u?l?s +?s?d?u?u?l?u?u?d +?s?d?u?u?l?u?u?l +?s?d?u?u?l?u?u?u +?s?d?u?u?l?u?u?s +?s?d?u?u?l?u?s?d +?s?d?u?u?l?u?s?l +?s?d?u?u?l?u?s?u +?s?d?u?u?l?u?s?s +?s?d?u?u?l?s?d?d +?s?d?u?u?l?s?d?l +?s?d?u?u?l?s?d?u +?s?d?u?u?l?s?d?s +?s?d?u?u?l?s?l?d +?s?d?u?u?l?s?l?l +?s?d?u?u?l?s?l?u +?s?d?u?u?l?s?l?s +?s?d?u?u?l?s?u?d +?s?d?u?u?l?s?u?l +?s?d?u?u?l?s?u?u +?s?d?u?u?l?s?u?s +?s?d?u?u?l?s?s?d +?s?d?u?u?l?s?s?l +?s?d?u?u?l?s?s?u +?s?d?u?u?l?s?s?s +?s?d?u?u?u?d?d?l +?s?d?u?u?u?d?l?d +?s?d?u?u?u?d?l?l +?s?d?u?u?u?d?l?u +?s?d?u?u?u?d?l?s +?s?d?u?u?u?d?u?l +?s?d?u?u?u?d?s?l +?s?d?u?u?u?l?d?d +?s?d?u?u?u?l?d?l +?s?d?u?u?u?l?d?u +?s?d?u?u?u?l?d?s +?s?d?u?u?u?l?l?d +?s?d?u?u?u?l?l?l +?s?d?u?u?u?l?l?u +?s?d?u?u?u?l?l?s +?s?d?u?u?u?l?u?d +?s?d?u?u?u?l?u?l +?s?d?u?u?u?l?u?u +?s?d?u?u?u?l?u?s +?s?d?u?u?u?l?s?d +?s?d?u?u?u?l?s?l +?s?d?u?u?u?l?s?u +?s?d?u?u?u?l?s?s +?s?d?u?u?u?u?d?l +?s?d?u?u?u?u?l?d +?s?d?u?u?u?u?l?l +?s?d?u?u?u?u?l?u +?s?d?u?u?u?u?l?s +?s?d?u?u?u?u?u?l +?s?d?u?u?u?u?s?l +?s?d?u?u?u?s?d?l +?s?d?u?u?u?s?l?d +?s?d?u?u?u?s?l?l +?s?d?u?u?u?s?l?u +?s?d?u?u?u?s?l?s +?s?d?u?u?u?s?u?l +?s?d?u?u?u?s?s?l +?s?d?u?u?s?d?d?l +?s?d?u?u?s?d?l?d +?s?d?u?u?s?d?l?l +?s?d?u?u?s?d?l?u +?s?d?u?u?s?d?l?s +?s?d?u?u?s?d?u?l +?s?d?u?u?s?d?s?l +?s?d?u?u?s?l?d?d +?s?d?u?u?s?l?d?l +?s?d?u?u?s?l?d?u +?s?d?u?u?s?l?d?s +?s?d?u?u?s?l?l?d +?s?d?u?u?s?l?l?l +?s?d?u?u?s?l?l?u +?s?d?u?u?s?l?l?s +?s?d?u?u?s?l?u?d +?s?d?u?u?s?l?u?l +?s?d?u?u?s?l?u?u +?s?d?u?u?s?l?u?s +?s?d?u?u?s?l?s?d +?s?d?u?u?s?l?s?l +?s?d?u?u?s?l?s?u +?s?d?u?u?s?l?s?s +?s?d?u?u?s?u?d?l +?s?d?u?u?s?u?l?d +?s?d?u?u?s?u?l?l +?s?d?u?u?s?u?l?u +?s?d?u?u?s?u?l?s +?s?d?u?u?s?u?u?l +?s?d?u?u?s?u?s?l +?s?d?u?u?s?s?d?l +?s?d?u?u?s?s?l?d +?s?d?u?u?s?s?l?l +?s?d?u?u?s?s?l?u +?s?d?u?u?s?s?l?s +?s?d?u?u?s?s?u?l +?s?d?u?u?s?s?s?l +?s?d?u?s?d?d?d?l +?s?d?u?s?d?d?l?d +?s?d?u?s?d?d?l?l +?s?d?u?s?d?d?l?u +?s?d?u?s?d?d?l?s +?s?d?u?s?d?d?u?l +?s?d?u?s?d?d?s?l +?s?d?u?s?d?l?d?d +?s?d?u?s?d?l?d?l +?s?d?u?s?d?l?d?u +?s?d?u?s?d?l?d?s +?s?d?u?s?d?l?l?d +?s?d?u?s?d?l?l?l +?s?d?u?s?d?l?l?u +?s?d?u?s?d?l?l?s +?s?d?u?s?d?l?u?d +?s?d?u?s?d?l?u?l +?s?d?u?s?d?l?u?u +?s?d?u?s?d?l?u?s +?s?d?u?s?d?l?s?d +?s?d?u?s?d?l?s?l +?s?d?u?s?d?l?s?u +?s?d?u?s?d?l?s?s +?s?d?u?s?d?u?d?l +?s?d?u?s?d?u?l?d +?s?d?u?s?d?u?l?l +?s?d?u?s?d?u?l?u +?s?d?u?s?d?u?l?s +?s?d?u?s?d?u?u?l +?s?d?u?s?d?u?s?l +?s?d?u?s?d?s?d?l +?s?d?u?s?d?s?l?d +?s?d?u?s?d?s?l?l +?s?d?u?s?d?s?l?u +?s?d?u?s?d?s?l?s +?s?d?u?s?d?s?u?l +?s?d?u?s?d?s?s?l +?s?d?u?s?l?d?d?d +?s?d?u?s?l?d?d?l +?s?d?u?s?l?d?d?u +?s?d?u?s?l?d?d?s +?s?d?u?s?l?d?l?d +?s?d?u?s?l?d?l?l +?s?d?u?s?l?d?l?u +?s?d?u?s?l?d?l?s +?s?d?u?s?l?d?u?d +?s?d?u?s?l?d?u?l +?s?d?u?s?l?d?u?u +?s?d?u?s?l?d?u?s +?s?d?u?s?l?d?s?d +?s?d?u?s?l?d?s?l +?s?d?u?s?l?d?s?u +?s?d?u?s?l?d?s?s +?s?d?u?s?l?l?d?d +?s?d?u?s?l?l?d?l +?s?d?u?s?l?l?d?u +?s?d?u?s?l?l?d?s +?s?d?u?s?l?l?l?d +?s?d?u?s?l?l?l?l +?s?d?u?s?l?l?l?u +?s?d?u?s?l?l?l?s +?s?d?u?s?l?l?u?d +?s?d?u?s?l?l?u?l +?s?d?u?s?l?l?u?u +?s?d?u?s?l?l?u?s +?s?d?u?s?l?l?s?d +?s?d?u?s?l?l?s?l +?s?d?u?s?l?l?s?u +?s?d?u?s?l?l?s?s +?s?d?u?s?l?u?d?d +?s?d?u?s?l?u?d?l +?s?d?u?s?l?u?d?u +?s?d?u?s?l?u?d?s +?s?d?u?s?l?u?l?d +?s?d?u?s?l?u?l?l +?s?d?u?s?l?u?l?u +?s?d?u?s?l?u?l?s +?s?d?u?s?l?u?u?d +?s?d?u?s?l?u?u?l +?s?d?u?s?l?u?u?u +?s?d?u?s?l?u?u?s +?s?d?u?s?l?u?s?d +?s?d?u?s?l?u?s?l +?s?d?u?s?l?u?s?u +?s?d?u?s?l?u?s?s +?s?d?u?s?l?s?d?d +?s?d?u?s?l?s?d?l +?s?d?u?s?l?s?d?u +?s?d?u?s?l?s?d?s +?s?d?u?s?l?s?l?d +?s?d?u?s?l?s?l?l +?s?d?u?s?l?s?l?u +?s?d?u?s?l?s?l?s +?s?d?u?s?l?s?u?d +?s?d?u?s?l?s?u?l +?s?d?u?s?l?s?u?u +?s?d?u?s?l?s?u?s +?s?d?u?s?l?s?s?d +?s?d?u?s?l?s?s?l +?s?d?u?s?l?s?s?u +?s?d?u?s?l?s?s?s +?s?d?u?s?u?d?d?l +?s?d?u?s?u?d?l?d +?s?d?u?s?u?d?l?l +?s?d?u?s?u?d?l?u +?s?d?u?s?u?d?l?s +?s?d?u?s?u?d?u?l +?s?d?u?s?u?d?s?l +?s?d?u?s?u?l?d?d +?s?d?u?s?u?l?d?l +?s?d?u?s?u?l?d?u +?s?d?u?s?u?l?d?s +?s?d?u?s?u?l?l?d +?s?d?u?s?u?l?l?l +?s?d?u?s?u?l?l?u +?s?d?u?s?u?l?l?s +?s?d?u?s?u?l?u?d +?s?d?u?s?u?l?u?l +?s?d?u?s?u?l?u?u +?s?d?u?s?u?l?u?s +?s?d?u?s?u?l?s?d +?s?d?u?s?u?l?s?l +?s?d?u?s?u?l?s?u +?s?d?u?s?u?l?s?s +?s?d?u?s?u?u?d?l +?s?d?u?s?u?u?l?d +?s?d?u?s?u?u?l?l +?s?d?u?s?u?u?l?u +?s?d?u?s?u?u?l?s +?s?d?u?s?u?u?u?l +?s?d?u?s?u?u?s?l +?s?d?u?s?u?s?d?l +?s?d?u?s?u?s?l?d +?s?d?u?s?u?s?l?l +?s?d?u?s?u?s?l?u +?s?d?u?s?u?s?l?s +?s?d?u?s?u?s?u?l +?s?d?u?s?u?s?s?l +?s?d?u?s?s?d?d?l +?s?d?u?s?s?d?l?d +?s?d?u?s?s?d?l?l +?s?d?u?s?s?d?l?u +?s?d?u?s?s?d?l?s +?s?d?u?s?s?d?u?l +?s?d?u?s?s?d?s?l +?s?d?u?s?s?l?d?d +?s?d?u?s?s?l?d?l +?s?d?u?s?s?l?d?u +?s?d?u?s?s?l?d?s +?s?d?u?s?s?l?l?d +?s?d?u?s?s?l?l?l +?s?d?u?s?s?l?l?u +?s?d?u?s?s?l?l?s +?s?d?u?s?s?l?u?d +?s?d?u?s?s?l?u?l +?s?d?u?s?s?l?u?u +?s?d?u?s?s?l?u?s +?s?d?u?s?s?l?s?d +?s?d?u?s?s?l?s?l +?s?d?u?s?s?l?s?u +?s?d?u?s?s?l?s?s +?s?d?u?s?s?u?d?l +?s?d?u?s?s?u?l?d +?s?d?u?s?s?u?l?l +?s?d?u?s?s?u?l?u +?s?d?u?s?s?u?l?s +?s?d?u?s?s?u?u?l +?s?d?u?s?s?u?s?l +?s?d?u?s?s?s?d?l +?s?d?u?s?s?s?l?d +?s?d?u?s?s?s?l?l +?s?d?u?s?s?s?l?u +?s?d?u?s?s?s?l?s +?s?d?u?s?s?s?u?l +?s?d?u?s?s?s?s?l +?s?d?s?d?d?d?l?u +?s?d?s?d?d?d?u?l +?s?d?s?d?d?l?d?u +?s?d?s?d?d?l?l?u +?s?d?s?d?d?l?u?d +?s?d?s?d?d?l?u?l +?s?d?s?d?d?l?u?u +?s?d?s?d?d?l?u?s +?s?d?s?d?d?l?s?u +?s?d?s?d?d?u?d?l +?s?d?s?d?d?u?l?d +?s?d?s?d?d?u?l?l +?s?d?s?d?d?u?l?u +?s?d?s?d?d?u?l?s +?s?d?s?d?d?u?u?l +?s?d?s?d?d?u?s?l +?s?d?s?d?d?s?l?u +?s?d?s?d?d?s?u?l +?s?d?s?d?l?d?d?u +?s?d?s?d?l?d?l?u +?s?d?s?d?l?d?u?d +?s?d?s?d?l?d?u?l +?s?d?s?d?l?d?u?u +?s?d?s?d?l?d?u?s +?s?d?s?d?l?d?s?u +?s?d?s?d?l?l?d?u +?s?d?s?d?l?l?l?u +?s?d?s?d?l?l?u?d +?s?d?s?d?l?l?u?l +?s?d?s?d?l?l?u?u +?s?d?s?d?l?l?u?s +?s?d?s?d?l?l?s?u +?s?d?s?d?l?u?d?d +?s?d?s?d?l?u?d?l +?s?d?s?d?l?u?d?u +?s?d?s?d?l?u?d?s +?s?d?s?d?l?u?l?d +?s?d?s?d?l?u?l?l +?s?d?s?d?l?u?l?u +?s?d?s?d?l?u?l?s +?s?d?s?d?l?u?u?d +?s?d?s?d?l?u?u?l +?s?d?s?d?l?u?u?u +?s?d?s?d?l?u?u?s +?s?d?s?d?l?u?s?d +?s?d?s?d?l?u?s?l +?s?d?s?d?l?u?s?u +?s?d?s?d?l?u?s?s +?s?d?s?d?l?s?d?u +?s?d?s?d?l?s?l?u +?s?d?s?d?l?s?u?d +?s?d?s?d?l?s?u?l +?s?d?s?d?l?s?u?u +?s?d?s?d?l?s?u?s +?s?d?s?d?l?s?s?u +?s?d?s?d?u?d?d?l +?s?d?s?d?u?d?l?d +?s?d?s?d?u?d?l?l +?s?d?s?d?u?d?l?u +?s?d?s?d?u?d?l?s +?s?d?s?d?u?d?u?l +?s?d?s?d?u?d?s?l +?s?d?s?d?u?l?d?d +?s?d?s?d?u?l?d?l +?s?d?s?d?u?l?d?u +?s?d?s?d?u?l?d?s +?s?d?s?d?u?l?l?d +?s?d?s?d?u?l?l?l +?s?d?s?d?u?l?l?u +?s?d?s?d?u?l?l?s +?s?d?s?d?u?l?u?d +?s?d?s?d?u?l?u?l +?s?d?s?d?u?l?u?u +?s?d?s?d?u?l?u?s +?s?d?s?d?u?l?s?d +?s?d?s?d?u?l?s?l +?s?d?s?d?u?l?s?u +?s?d?s?d?u?l?s?s +?s?d?s?d?u?u?d?l +?s?d?s?d?u?u?l?d +?s?d?s?d?u?u?l?l +?s?d?s?d?u?u?l?u +?s?d?s?d?u?u?l?s +?s?d?s?d?u?u?u?l +?s?d?s?d?u?u?s?l +?s?d?s?d?u?s?d?l +?s?d?s?d?u?s?l?d +?s?d?s?d?u?s?l?l +?s?d?s?d?u?s?l?u +?s?d?s?d?u?s?l?s +?s?d?s?d?u?s?u?l +?s?d?s?d?u?s?s?l +?s?d?s?d?s?d?l?u +?s?d?s?d?s?d?u?l +?s?d?s?d?s?l?d?u +?s?d?s?d?s?l?l?u +?s?d?s?d?s?l?u?d +?s?d?s?d?s?l?u?l +?s?d?s?d?s?l?u?u +?s?d?s?d?s?l?u?s +?s?d?s?d?s?l?s?u +?s?d?s?d?s?u?d?l +?s?d?s?d?s?u?l?d +?s?d?s?d?s?u?l?l +?s?d?s?d?s?u?l?u +?s?d?s?d?s?u?l?s +?s?d?s?d?s?u?u?l +?s?d?s?d?s?u?s?l +?s?d?s?d?s?s?l?u +?s?d?s?d?s?s?u?l +?s?d?s?l?d?d?d?u +?s?d?s?l?d?d?l?u +?s?d?s?l?d?d?u?d +?s?d?s?l?d?d?u?l +?s?d?s?l?d?d?u?u +?s?d?s?l?d?d?u?s +?s?d?s?l?d?d?s?u +?s?d?s?l?d?l?d?u +?s?d?s?l?d?l?l?u +?s?d?s?l?d?l?u?d +?s?d?s?l?d?l?u?l +?s?d?s?l?d?l?u?u +?s?d?s?l?d?l?u?s +?s?d?s?l?d?l?s?u +?s?d?s?l?d?u?d?d +?s?d?s?l?d?u?d?l +?s?d?s?l?d?u?d?u +?s?d?s?l?d?u?d?s +?s?d?s?l?d?u?l?d +?s?d?s?l?d?u?l?l +?s?d?s?l?d?u?l?u +?s?d?s?l?d?u?l?s +?s?d?s?l?d?u?u?d +?s?d?s?l?d?u?u?l +?s?d?s?l?d?u?u?u +?s?d?s?l?d?u?u?s +?s?d?s?l?d?u?s?d +?s?d?s?l?d?u?s?l +?s?d?s?l?d?u?s?u +?s?d?s?l?d?u?s?s +?s?d?s?l?d?s?d?u +?s?d?s?l?d?s?l?u +?s?d?s?l?d?s?u?d +?s?d?s?l?d?s?u?l +?s?d?s?l?d?s?u?u +?s?d?s?l?d?s?u?s +?s?d?s?l?d?s?s?u +?s?d?s?l?l?d?d?u +?s?d?s?l?l?d?l?u +?s?d?s?l?l?d?u?d +?s?d?s?l?l?d?u?l +?s?d?s?l?l?d?u?u +?s?d?s?l?l?d?u?s +?s?d?s?l?l?d?s?u +?s?d?s?l?l?l?d?u +?s?d?s?l?l?l?l?u +?s?d?s?l?l?l?u?d +?s?d?s?l?l?l?u?l +?s?d?s?l?l?l?u?u +?s?d?s?l?l?l?u?s +?s?d?s?l?l?l?s?u +?s?d?s?l?l?u?d?d +?s?d?s?l?l?u?d?l +?s?d?s?l?l?u?d?u +?s?d?s?l?l?u?d?s +?s?d?s?l?l?u?l?d +?s?d?s?l?l?u?l?l +?s?d?s?l?l?u?l?u +?s?d?s?l?l?u?l?s +?s?d?s?l?l?u?u?d +?s?d?s?l?l?u?u?l +?s?d?s?l?l?u?u?u +?s?d?s?l?l?u?u?s +?s?d?s?l?l?u?s?d +?s?d?s?l?l?u?s?l +?s?d?s?l?l?u?s?u +?s?d?s?l?l?u?s?s +?s?d?s?l?l?s?d?u +?s?d?s?l?l?s?l?u +?s?d?s?l?l?s?u?d +?s?d?s?l?l?s?u?l +?s?d?s?l?l?s?u?u +?s?d?s?l?l?s?u?s +?s?d?s?l?l?s?s?u +?s?d?s?l?u?d?d?d +?s?d?s?l?u?d?d?l +?s?d?s?l?u?d?d?u +?s?d?s?l?u?d?d?s +?s?d?s?l?u?d?l?d +?s?d?s?l?u?d?l?l +?s?d?s?l?u?d?l?u +?s?d?s?l?u?d?l?s +?s?d?s?l?u?d?u?d +?s?d?s?l?u?d?u?l +?s?d?s?l?u?d?u?u +?s?d?s?l?u?d?u?s +?s?d?s?l?u?d?s?d +?s?d?s?l?u?d?s?l +?s?d?s?l?u?d?s?u +?s?d?s?l?u?d?s?s +?s?d?s?l?u?l?d?d +?s?d?s?l?u?l?d?l +?s?d?s?l?u?l?d?u +?s?d?s?l?u?l?d?s +?s?d?s?l?u?l?l?d +?s?d?s?l?u?l?l?l +?s?d?s?l?u?l?l?u +?s?d?s?l?u?l?l?s +?s?d?s?l?u?l?u?d +?s?d?s?l?u?l?u?l +?s?d?s?l?u?l?u?u +?s?d?s?l?u?l?u?s +?s?d?s?l?u?l?s?d +?s?d?s?l?u?l?s?l +?s?d?s?l?u?l?s?u +?s?d?s?l?u?l?s?s +?s?d?s?l?u?u?d?d +?s?d?s?l?u?u?d?l +?s?d?s?l?u?u?d?u +?s?d?s?l?u?u?d?s +?s?d?s?l?u?u?l?d +?s?d?s?l?u?u?l?l +?s?d?s?l?u?u?l?u +?s?d?s?l?u?u?l?s +?s?d?s?l?u?u?u?d +?s?d?s?l?u?u?u?l +?s?d?s?l?u?u?u?u +?s?d?s?l?u?u?u?s +?s?d?s?l?u?u?s?d +?s?d?s?l?u?u?s?l +?s?d?s?l?u?u?s?u +?s?d?s?l?u?u?s?s +?s?d?s?l?u?s?d?d +?s?d?s?l?u?s?d?l +?s?d?s?l?u?s?d?u +?s?d?s?l?u?s?d?s +?s?d?s?l?u?s?l?d +?s?d?s?l?u?s?l?l +?s?d?s?l?u?s?l?u +?s?d?s?l?u?s?l?s +?s?d?s?l?u?s?u?d +?s?d?s?l?u?s?u?l +?s?d?s?l?u?s?u?u +?s?d?s?l?u?s?u?s +?s?d?s?l?u?s?s?d +?s?d?s?l?u?s?s?l +?s?d?s?l?u?s?s?u +?s?d?s?l?u?s?s?s +?s?d?s?l?s?d?d?u +?s?d?s?l?s?d?l?u +?s?d?s?l?s?d?u?d +?s?d?s?l?s?d?u?l +?s?d?s?l?s?d?u?u +?s?d?s?l?s?d?u?s +?s?d?s?l?s?d?s?u +?s?d?s?l?s?l?d?u +?s?d?s?l?s?l?l?u +?s?d?s?l?s?l?u?d +?s?d?s?l?s?l?u?l +?s?d?s?l?s?l?u?u +?s?d?s?l?s?l?u?s +?s?d?s?l?s?l?s?u +?s?d?s?l?s?u?d?d +?s?d?s?l?s?u?d?l +?s?d?s?l?s?u?d?u +?s?d?s?l?s?u?d?s +?s?d?s?l?s?u?l?d +?s?d?s?l?s?u?l?l +?s?d?s?l?s?u?l?u +?s?d?s?l?s?u?l?s +?s?d?s?l?s?u?u?d +?s?d?s?l?s?u?u?l +?s?d?s?l?s?u?u?u +?s?d?s?l?s?u?u?s +?s?d?s?l?s?u?s?d +?s?d?s?l?s?u?s?l +?s?d?s?l?s?u?s?u +?s?d?s?l?s?u?s?s +?s?d?s?l?s?s?d?u +?s?d?s?l?s?s?l?u +?s?d?s?l?s?s?u?d +?s?d?s?l?s?s?u?l +?s?d?s?l?s?s?u?u +?s?d?s?l?s?s?u?s +?s?d?s?l?s?s?s?u +?s?d?s?u?d?d?d?l +?s?d?s?u?d?d?l?d +?s?d?s?u?d?d?l?l +?s?d?s?u?d?d?l?u +?s?d?s?u?d?d?l?s +?s?d?s?u?d?d?u?l +?s?d?s?u?d?d?s?l +?s?d?s?u?d?l?d?d +?s?d?s?u?d?l?d?l +?s?d?s?u?d?l?d?u +?s?d?s?u?d?l?d?s +?s?d?s?u?d?l?l?d +?s?d?s?u?d?l?l?l +?s?d?s?u?d?l?l?u +?s?d?s?u?d?l?l?s +?s?d?s?u?d?l?u?d +?s?d?s?u?d?l?u?l +?s?d?s?u?d?l?u?u +?s?d?s?u?d?l?u?s +?s?d?s?u?d?l?s?d +?s?d?s?u?d?l?s?l +?s?d?s?u?d?l?s?u +?s?d?s?u?d?l?s?s +?s?d?s?u?d?u?d?l +?s?d?s?u?d?u?l?d +?s?d?s?u?d?u?l?l +?s?d?s?u?d?u?l?u +?s?d?s?u?d?u?l?s +?s?d?s?u?d?u?u?l +?s?d?s?u?d?u?s?l +?s?d?s?u?d?s?d?l +?s?d?s?u?d?s?l?d +?s?d?s?u?d?s?l?l +?s?d?s?u?d?s?l?u +?s?d?s?u?d?s?l?s +?s?d?s?u?d?s?u?l +?s?d?s?u?d?s?s?l +?s?d?s?u?l?d?d?d +?s?d?s?u?l?d?d?l +?s?d?s?u?l?d?d?u +?s?d?s?u?l?d?d?s +?s?d?s?u?l?d?l?d +?s?d?s?u?l?d?l?l +?s?d?s?u?l?d?l?u +?s?d?s?u?l?d?l?s +?s?d?s?u?l?d?u?d +?s?d?s?u?l?d?u?l +?s?d?s?u?l?d?u?u +?s?d?s?u?l?d?u?s +?s?d?s?u?l?d?s?d +?s?d?s?u?l?d?s?l +?s?d?s?u?l?d?s?u +?s?d?s?u?l?d?s?s +?s?d?s?u?l?l?d?d +?s?d?s?u?l?l?d?l +?s?d?s?u?l?l?d?u +?s?d?s?u?l?l?d?s +?s?d?s?u?l?l?l?d +?s?d?s?u?l?l?l?l +?s?d?s?u?l?l?l?u +?s?d?s?u?l?l?l?s +?s?d?s?u?l?l?u?d +?s?d?s?u?l?l?u?l +?s?d?s?u?l?l?u?u +?s?d?s?u?l?l?u?s +?s?d?s?u?l?l?s?d +?s?d?s?u?l?l?s?l +?s?d?s?u?l?l?s?u +?s?d?s?u?l?l?s?s +?s?d?s?u?l?u?d?d +?s?d?s?u?l?u?d?l +?s?d?s?u?l?u?d?u +?s?d?s?u?l?u?d?s +?s?d?s?u?l?u?l?d +?s?d?s?u?l?u?l?l +?s?d?s?u?l?u?l?u +?s?d?s?u?l?u?l?s +?s?d?s?u?l?u?u?d +?s?d?s?u?l?u?u?l +?s?d?s?u?l?u?u?u +?s?d?s?u?l?u?u?s +?s?d?s?u?l?u?s?d +?s?d?s?u?l?u?s?l +?s?d?s?u?l?u?s?u +?s?d?s?u?l?u?s?s +?s?d?s?u?l?s?d?d +?s?d?s?u?l?s?d?l +?s?d?s?u?l?s?d?u +?s?d?s?u?l?s?d?s +?s?d?s?u?l?s?l?d +?s?d?s?u?l?s?l?l +?s?d?s?u?l?s?l?u +?s?d?s?u?l?s?l?s +?s?d?s?u?l?s?u?d +?s?d?s?u?l?s?u?l +?s?d?s?u?l?s?u?u +?s?d?s?u?l?s?u?s +?s?d?s?u?l?s?s?d +?s?d?s?u?l?s?s?l +?s?d?s?u?l?s?s?u +?s?d?s?u?l?s?s?s +?s?d?s?u?u?d?d?l +?s?d?s?u?u?d?l?d +?s?d?s?u?u?d?l?l +?s?d?s?u?u?d?l?u +?s?d?s?u?u?d?l?s +?s?d?s?u?u?d?u?l +?s?d?s?u?u?d?s?l +?s?d?s?u?u?l?d?d +?s?d?s?u?u?l?d?l +?s?d?s?u?u?l?d?u +?s?d?s?u?u?l?d?s +?s?d?s?u?u?l?l?d +?s?d?s?u?u?l?l?l +?s?d?s?u?u?l?l?u +?s?d?s?u?u?l?l?s +?s?d?s?u?u?l?u?d +?s?d?s?u?u?l?u?l +?s?d?s?u?u?l?u?u +?s?d?s?u?u?l?u?s +?s?d?s?u?u?l?s?d +?s?d?s?u?u?l?s?l +?s?d?s?u?u?l?s?u +?s?d?s?u?u?l?s?s +?s?d?s?u?u?u?d?l +?s?d?s?u?u?u?l?d +?s?d?s?u?u?u?l?l +?s?d?s?u?u?u?l?u +?s?d?s?u?u?u?l?s +?s?d?s?u?u?u?u?l +?s?d?s?u?u?u?s?l +?s?d?s?u?u?s?d?l +?s?d?s?u?u?s?l?d +?s?d?s?u?u?s?l?l +?s?d?s?u?u?s?l?u +?s?d?s?u?u?s?l?s +?s?d?s?u?u?s?u?l +?s?d?s?u?u?s?s?l +?s?d?s?u?s?d?d?l +?s?d?s?u?s?d?l?d +?s?d?s?u?s?d?l?l +?s?d?s?u?s?d?l?u +?s?d?s?u?s?d?l?s +?s?d?s?u?s?d?u?l +?s?d?s?u?s?d?s?l +?s?d?s?u?s?l?d?d +?s?d?s?u?s?l?d?l +?s?d?s?u?s?l?d?u +?s?d?s?u?s?l?d?s +?s?d?s?u?s?l?l?d +?s?d?s?u?s?l?l?l +?s?d?s?u?s?l?l?u +?s?d?s?u?s?l?l?s +?s?d?s?u?s?l?u?d +?s?d?s?u?s?l?u?l +?s?d?s?u?s?l?u?u +?s?d?s?u?s?l?u?s +?s?d?s?u?s?l?s?d +?s?d?s?u?s?l?s?l +?s?d?s?u?s?l?s?u +?s?d?s?u?s?l?s?s +?s?d?s?u?s?u?d?l +?s?d?s?u?s?u?l?d +?s?d?s?u?s?u?l?l +?s?d?s?u?s?u?l?u +?s?d?s?u?s?u?l?s +?s?d?s?u?s?u?u?l +?s?d?s?u?s?u?s?l +?s?d?s?u?s?s?d?l +?s?d?s?u?s?s?l?d +?s?d?s?u?s?s?l?l +?s?d?s?u?s?s?l?u +?s?d?s?u?s?s?l?s +?s?d?s?u?s?s?u?l +?s?d?s?u?s?s?s?l +?s?d?s?s?d?d?l?u +?s?d?s?s?d?d?u?l +?s?d?s?s?d?l?d?u +?s?d?s?s?d?l?l?u +?s?d?s?s?d?l?u?d +?s?d?s?s?d?l?u?l +?s?d?s?s?d?l?u?u +?s?d?s?s?d?l?u?s +?s?d?s?s?d?l?s?u +?s?d?s?s?d?u?d?l +?s?d?s?s?d?u?l?d +?s?d?s?s?d?u?l?l +?s?d?s?s?d?u?l?u +?s?d?s?s?d?u?l?s +?s?d?s?s?d?u?u?l +?s?d?s?s?d?u?s?l +?s?d?s?s?d?s?l?u +?s?d?s?s?d?s?u?l +?s?d?s?s?l?d?d?u +?s?d?s?s?l?d?l?u +?s?d?s?s?l?d?u?d +?s?d?s?s?l?d?u?l +?s?d?s?s?l?d?u?u +?s?d?s?s?l?d?u?s +?s?d?s?s?l?d?s?u +?s?d?s?s?l?l?d?u +?s?d?s?s?l?l?l?u +?s?d?s?s?l?l?u?d +?s?d?s?s?l?l?u?l +?s?d?s?s?l?l?u?u +?s?d?s?s?l?l?u?s +?s?d?s?s?l?l?s?u +?s?d?s?s?l?u?d?d +?s?d?s?s?l?u?d?l +?s?d?s?s?l?u?d?u +?s?d?s?s?l?u?d?s +?s?d?s?s?l?u?l?d +?s?d?s?s?l?u?l?l +?s?d?s?s?l?u?l?u +?s?d?s?s?l?u?l?s +?s?d?s?s?l?u?u?d +?s?d?s?s?l?u?u?l +?s?d?s?s?l?u?u?u +?s?d?s?s?l?u?u?s +?s?d?s?s?l?u?s?d +?s?d?s?s?l?u?s?l +?s?d?s?s?l?u?s?u +?s?d?s?s?l?u?s?s +?s?d?s?s?l?s?d?u +?s?d?s?s?l?s?l?u +?s?d?s?s?l?s?u?d +?s?d?s?s?l?s?u?l +?s?d?s?s?l?s?u?u +?s?d?s?s?l?s?u?s +?s?d?s?s?l?s?s?u +?s?d?s?s?u?d?d?l +?s?d?s?s?u?d?l?d +?s?d?s?s?u?d?l?l +?s?d?s?s?u?d?l?u +?s?d?s?s?u?d?l?s +?s?d?s?s?u?d?u?l +?s?d?s?s?u?d?s?l +?s?d?s?s?u?l?d?d +?s?d?s?s?u?l?d?l +?s?d?s?s?u?l?d?u +?s?d?s?s?u?l?d?s +?s?d?s?s?u?l?l?d +?s?d?s?s?u?l?l?l +?s?d?s?s?u?l?l?u +?s?d?s?s?u?l?l?s +?s?d?s?s?u?l?u?d +?s?d?s?s?u?l?u?l +?s?d?s?s?u?l?u?u +?s?d?s?s?u?l?u?s +?s?d?s?s?u?l?s?d +?s?d?s?s?u?l?s?l +?s?d?s?s?u?l?s?u +?s?d?s?s?u?l?s?s +?s?d?s?s?u?u?d?l +?s?d?s?s?u?u?l?d +?s?d?s?s?u?u?l?l +?s?d?s?s?u?u?l?u +?s?d?s?s?u?u?l?s +?s?d?s?s?u?u?u?l +?s?d?s?s?u?u?s?l +?s?d?s?s?u?s?d?l +?s?d?s?s?u?s?l?d +?s?d?s?s?u?s?l?l +?s?d?s?s?u?s?l?u +?s?d?s?s?u?s?l?s +?s?d?s?s?u?s?u?l +?s?d?s?s?u?s?s?l +?s?d?s?s?s?d?l?u +?s?d?s?s?s?d?u?l +?s?d?s?s?s?l?d?u +?s?d?s?s?s?l?l?u +?s?d?s?s?s?l?u?d +?s?d?s?s?s?l?u?l +?s?d?s?s?s?l?u?u +?s?d?s?s?s?l?u?s +?s?d?s?s?s?l?s?u +?s?d?s?s?s?u?d?l +?s?d?s?s?s?u?l?d +?s?d?s?s?s?u?l?l +?s?d?s?s?s?u?l?u +?s?d?s?s?s?u?l?s +?s?d?s?s?s?u?u?l +?s?d?s?s?s?u?s?l +?s?d?s?s?s?s?l?u +?s?d?s?s?s?s?u?l +?s?l?d?d?d?d?d?u +?s?l?d?d?d?d?l?u +?s?l?d?d?d?d?u?d +?s?l?d?d?d?d?u?l +?s?l?d?d?d?d?u?u +?s?l?d?d?d?d?u?s +?s?l?d?d?d?d?s?u +?s?l?d?d?d?l?d?u +?s?l?d?d?d?l?l?u +?s?l?d?d?d?l?u?d +?s?l?d?d?d?l?u?l +?s?l?d?d?d?l?u?u +?s?l?d?d?d?l?u?s +?s?l?d?d?d?l?s?u +?s?l?d?d?d?u?d?d +?s?l?d?d?d?u?d?l +?s?l?d?d?d?u?d?u +?s?l?d?d?d?u?d?s +?s?l?d?d?d?u?l?d +?s?l?d?d?d?u?l?l +?s?l?d?d?d?u?l?u +?s?l?d?d?d?u?l?s +?s?l?d?d?d?u?u?d +?s?l?d?d?d?u?u?l +?s?l?d?d?d?u?u?u +?s?l?d?d?d?u?u?s +?s?l?d?d?d?u?s?d +?s?l?d?d?d?u?s?l +?s?l?d?d?d?u?s?u +?s?l?d?d?d?u?s?s +?s?l?d?d?d?s?d?u +?s?l?d?d?d?s?l?u +?s?l?d?d?d?s?u?d +?s?l?d?d?d?s?u?l +?s?l?d?d?d?s?u?u +?s?l?d?d?d?s?u?s +?s?l?d?d?d?s?s?u +?s?l?d?d?l?d?d?u +?s?l?d?d?l?d?l?u +?s?l?d?d?l?d?u?d +?s?l?d?d?l?d?u?l +?s?l?d?d?l?d?u?u +?s?l?d?d?l?d?u?s +?s?l?d?d?l?d?s?u +?s?l?d?d?l?l?d?u +?s?l?d?d?l?l?l?u +?s?l?d?d?l?l?u?d +?s?l?d?d?l?l?u?l +?s?l?d?d?l?l?u?u +?s?l?d?d?l?l?u?s +?s?l?d?d?l?l?s?u +?s?l?d?d?l?u?d?d +?s?l?d?d?l?u?d?l +?s?l?d?d?l?u?d?u +?s?l?d?d?l?u?d?s +?s?l?d?d?l?u?l?d +?s?l?d?d?l?u?l?l +?s?l?d?d?l?u?l?u +?s?l?d?d?l?u?l?s +?s?l?d?d?l?u?u?d +?s?l?d?d?l?u?u?l +?s?l?d?d?l?u?u?u +?s?l?d?d?l?u?u?s +?s?l?d?d?l?u?s?d +?s?l?d?d?l?u?s?l +?s?l?d?d?l?u?s?u +?s?l?d?d?l?u?s?s +?s?l?d?d?l?s?d?u +?s?l?d?d?l?s?l?u +?s?l?d?d?l?s?u?d +?s?l?d?d?l?s?u?l +?s?l?d?d?l?s?u?u +?s?l?d?d?l?s?u?s +?s?l?d?d?l?s?s?u +?s?l?d?d?u?d?d?d +?s?l?d?d?u?d?d?l +?s?l?d?d?u?d?d?u +?s?l?d?d?u?d?d?s +?s?l?d?d?u?d?l?d +?s?l?d?d?u?d?l?l +?s?l?d?d?u?d?l?u +?s?l?d?d?u?d?l?s +?s?l?d?d?u?d?u?d +?s?l?d?d?u?d?u?l +?s?l?d?d?u?d?u?u +?s?l?d?d?u?d?u?s +?s?l?d?d?u?d?s?d +?s?l?d?d?u?d?s?l +?s?l?d?d?u?d?s?u +?s?l?d?d?u?d?s?s +?s?l?d?d?u?l?d?d +?s?l?d?d?u?l?d?l +?s?l?d?d?u?l?d?u +?s?l?d?d?u?l?d?s +?s?l?d?d?u?l?l?d +?s?l?d?d?u?l?l?l +?s?l?d?d?u?l?l?u +?s?l?d?d?u?l?l?s +?s?l?d?d?u?l?u?d +?s?l?d?d?u?l?u?l +?s?l?d?d?u?l?u?u +?s?l?d?d?u?l?u?s +?s?l?d?d?u?l?s?d +?s?l?d?d?u?l?s?l +?s?l?d?d?u?l?s?u +?s?l?d?d?u?l?s?s +?s?l?d?d?u?u?d?d +?s?l?d?d?u?u?d?l +?s?l?d?d?u?u?d?u +?s?l?d?d?u?u?d?s +?s?l?d?d?u?u?l?d +?s?l?d?d?u?u?l?l +?s?l?d?d?u?u?l?u +?s?l?d?d?u?u?l?s +?s?l?d?d?u?u?u?d +?s?l?d?d?u?u?u?l +?s?l?d?d?u?u?u?u +?s?l?d?d?u?u?u?s +?s?l?d?d?u?u?s?d +?s?l?d?d?u?u?s?l +?s?l?d?d?u?u?s?u +?s?l?d?d?u?u?s?s +?s?l?d?d?u?s?d?d +?s?l?d?d?u?s?d?l +?s?l?d?d?u?s?d?u +?s?l?d?d?u?s?d?s +?s?l?d?d?u?s?l?d +?s?l?d?d?u?s?l?l +?s?l?d?d?u?s?l?u +?s?l?d?d?u?s?l?s +?s?l?d?d?u?s?u?d +?s?l?d?d?u?s?u?l +?s?l?d?d?u?s?u?u +?s?l?d?d?u?s?u?s +?s?l?d?d?u?s?s?d +?s?l?d?d?u?s?s?l +?s?l?d?d?u?s?s?u +?s?l?d?d?u?s?s?s +?s?l?d?d?s?d?d?u +?s?l?d?d?s?d?l?u +?s?l?d?d?s?d?u?d +?s?l?d?d?s?d?u?l +?s?l?d?d?s?d?u?u +?s?l?d?d?s?d?u?s +?s?l?d?d?s?d?s?u +?s?l?d?d?s?l?d?u +?s?l?d?d?s?l?l?u +?s?l?d?d?s?l?u?d +?s?l?d?d?s?l?u?l +?s?l?d?d?s?l?u?u +?s?l?d?d?s?l?u?s +?s?l?d?d?s?l?s?u +?s?l?d?d?s?u?d?d +?s?l?d?d?s?u?d?l +?s?l?d?d?s?u?d?u +?s?l?d?d?s?u?d?s +?s?l?d?d?s?u?l?d +?s?l?d?d?s?u?l?l +?s?l?d?d?s?u?l?u +?s?l?d?d?s?u?l?s +?s?l?d?d?s?u?u?d +?s?l?d?d?s?u?u?l +?s?l?d?d?s?u?u?u +?s?l?d?d?s?u?u?s +?s?l?d?d?s?u?s?d +?s?l?d?d?s?u?s?l +?s?l?d?d?s?u?s?u +?s?l?d?d?s?u?s?s +?s?l?d?d?s?s?d?u +?s?l?d?d?s?s?l?u +?s?l?d?d?s?s?u?d +?s?l?d?d?s?s?u?l +?s?l?d?d?s?s?u?u +?s?l?d?d?s?s?u?s +?s?l?d?d?s?s?s?u +?s?l?d?l?d?d?d?u +?s?l?d?l?d?d?l?u +?s?l?d?l?d?d?u?d +?s?l?d?l?d?d?u?l +?s?l?d?l?d?d?u?u +?s?l?d?l?d?d?u?s +?s?l?d?l?d?d?s?u +?s?l?d?l?d?l?d?u +?s?l?d?l?d?l?l?u +?s?l?d?l?d?l?u?d +?s?l?d?l?d?l?u?l +?s?l?d?l?d?l?u?u +?s?l?d?l?d?l?u?s +?s?l?d?l?d?l?s?u +?s?l?d?l?d?u?d?d +?s?l?d?l?d?u?d?l +?s?l?d?l?d?u?d?u +?s?l?d?l?d?u?d?s +?s?l?d?l?d?u?l?d +?s?l?d?l?d?u?l?l +?s?l?d?l?d?u?l?u +?s?l?d?l?d?u?l?s +?s?l?d?l?d?u?u?d +?s?l?d?l?d?u?u?l +?s?l?d?l?d?u?u?u +?s?l?d?l?d?u?u?s +?s?l?d?l?d?u?s?d +?s?l?d?l?d?u?s?l +?s?l?d?l?d?u?s?u +?s?l?d?l?d?u?s?s +?s?l?d?l?d?s?d?u +?s?l?d?l?d?s?l?u +?s?l?d?l?d?s?u?d +?s?l?d?l?d?s?u?l +?s?l?d?l?d?s?u?u +?s?l?d?l?d?s?u?s +?s?l?d?l?d?s?s?u +?s?l?d?l?l?d?d?u +?s?l?d?l?l?d?l?u +?s?l?d?l?l?d?u?d +?s?l?d?l?l?d?u?l +?s?l?d?l?l?d?u?u +?s?l?d?l?l?d?u?s +?s?l?d?l?l?d?s?u +?s?l?d?l?l?l?d?u +?s?l?d?l?l?l?l?u +?s?l?d?l?l?l?u?d +?s?l?d?l?l?l?u?l +?s?l?d?l?l?l?u?u +?s?l?d?l?l?l?u?s +?s?l?d?l?l?l?s?u +?s?l?d?l?l?u?d?d +?s?l?d?l?l?u?d?l +?s?l?d?l?l?u?d?u +?s?l?d?l?l?u?d?s +?s?l?d?l?l?u?l?d +?s?l?d?l?l?u?l?l +?s?l?d?l?l?u?l?u +?s?l?d?l?l?u?l?s +?s?l?d?l?l?u?u?d +?s?l?d?l?l?u?u?l +?s?l?d?l?l?u?u?u +?s?l?d?l?l?u?u?s +?s?l?d?l?l?u?s?d +?s?l?d?l?l?u?s?l +?s?l?d?l?l?u?s?u +?s?l?d?l?l?u?s?s +?s?l?d?l?l?s?d?u +?s?l?d?l?l?s?l?u +?s?l?d?l?l?s?u?d +?s?l?d?l?l?s?u?l +?s?l?d?l?l?s?u?u +?s?l?d?l?l?s?u?s +?s?l?d?l?l?s?s?u +?s?l?d?l?u?d?d?d +?s?l?d?l?u?d?d?l +?s?l?d?l?u?d?d?u +?s?l?d?l?u?d?d?s +?s?l?d?l?u?d?l?d +?s?l?d?l?u?d?l?l +?s?l?d?l?u?d?l?u +?s?l?d?l?u?d?l?s +?s?l?d?l?u?d?u?d +?s?l?d?l?u?d?u?l +?s?l?d?l?u?d?u?u +?s?l?d?l?u?d?u?s +?s?l?d?l?u?d?s?d +?s?l?d?l?u?d?s?l +?s?l?d?l?u?d?s?u +?s?l?d?l?u?d?s?s +?s?l?d?l?u?l?d?d +?s?l?d?l?u?l?d?l +?s?l?d?l?u?l?d?u +?s?l?d?l?u?l?d?s +?s?l?d?l?u?l?l?d +?s?l?d?l?u?l?l?l +?s?l?d?l?u?l?l?u +?s?l?d?l?u?l?l?s +?s?l?d?l?u?l?u?d +?s?l?d?l?u?l?u?l +?s?l?d?l?u?l?u?u +?s?l?d?l?u?l?u?s +?s?l?d?l?u?l?s?d +?s?l?d?l?u?l?s?l +?s?l?d?l?u?l?s?u +?s?l?d?l?u?l?s?s +?s?l?d?l?u?u?d?d +?s?l?d?l?u?u?d?l +?s?l?d?l?u?u?d?u +?s?l?d?l?u?u?d?s +?s?l?d?l?u?u?l?d +?s?l?d?l?u?u?l?l +?s?l?d?l?u?u?l?u +?s?l?d?l?u?u?l?s +?s?l?d?l?u?u?u?d +?s?l?d?l?u?u?u?l +?s?l?d?l?u?u?u?u +?s?l?d?l?u?u?u?s +?s?l?d?l?u?u?s?d +?s?l?d?l?u?u?s?l +?s?l?d?l?u?u?s?u +?s?l?d?l?u?u?s?s +?s?l?d?l?u?s?d?d +?s?l?d?l?u?s?d?l +?s?l?d?l?u?s?d?u +?s?l?d?l?u?s?d?s +?s?l?d?l?u?s?l?d +?s?l?d?l?u?s?l?l +?s?l?d?l?u?s?l?u +?s?l?d?l?u?s?l?s +?s?l?d?l?u?s?u?d +?s?l?d?l?u?s?u?l +?s?l?d?l?u?s?u?u +?s?l?d?l?u?s?u?s +?s?l?d?l?u?s?s?d +?s?l?d?l?u?s?s?l +?s?l?d?l?u?s?s?u +?s?l?d?l?u?s?s?s +?s?l?d?l?s?d?d?u +?s?l?d?l?s?d?l?u +?s?l?d?l?s?d?u?d +?s?l?d?l?s?d?u?l +?s?l?d?l?s?d?u?u +?s?l?d?l?s?d?u?s +?s?l?d?l?s?d?s?u +?s?l?d?l?s?l?d?u +?s?l?d?l?s?l?l?u +?s?l?d?l?s?l?u?d +?s?l?d?l?s?l?u?l +?s?l?d?l?s?l?u?u +?s?l?d?l?s?l?u?s +?s?l?d?l?s?l?s?u +?s?l?d?l?s?u?d?d +?s?l?d?l?s?u?d?l +?s?l?d?l?s?u?d?u +?s?l?d?l?s?u?d?s +?s?l?d?l?s?u?l?d +?s?l?d?l?s?u?l?l +?s?l?d?l?s?u?l?u +?s?l?d?l?s?u?l?s +?s?l?d?l?s?u?u?d +?s?l?d?l?s?u?u?l +?s?l?d?l?s?u?u?u +?s?l?d?l?s?u?u?s +?s?l?d?l?s?u?s?d +?s?l?d?l?s?u?s?l +?s?l?d?l?s?u?s?u +?s?l?d?l?s?u?s?s +?s?l?d?l?s?s?d?u +?s?l?d?l?s?s?l?u +?s?l?d?l?s?s?u?d +?s?l?d?l?s?s?u?l +?s?l?d?l?s?s?u?u +?s?l?d?l?s?s?u?s +?s?l?d?l?s?s?s?u +?s?l?d?u?d?d?d?d +?s?l?d?u?d?d?d?l +?s?l?d?u?d?d?d?u +?s?l?d?u?d?d?d?s +?s?l?d?u?d?d?l?d +?s?l?d?u?d?d?l?l +?s?l?d?u?d?d?l?u +?s?l?d?u?d?d?l?s +?s?l?d?u?d?d?u?d +?s?l?d?u?d?d?u?l +?s?l?d?u?d?d?u?u +?s?l?d?u?d?d?u?s +?s?l?d?u?d?d?s?d +?s?l?d?u?d?d?s?l +?s?l?d?u?d?d?s?u +?s?l?d?u?d?d?s?s +?s?l?d?u?d?l?d?d +?s?l?d?u?d?l?d?l +?s?l?d?u?d?l?d?u +?s?l?d?u?d?l?d?s +?s?l?d?u?d?l?l?d +?s?l?d?u?d?l?l?l +?s?l?d?u?d?l?l?u +?s?l?d?u?d?l?l?s +?s?l?d?u?d?l?u?d +?s?l?d?u?d?l?u?l +?s?l?d?u?d?l?u?u +?s?l?d?u?d?l?u?s +?s?l?d?u?d?l?s?d +?s?l?d?u?d?l?s?l +?s?l?d?u?d?l?s?u +?s?l?d?u?d?l?s?s +?s?l?d?u?d?u?d?d +?s?l?d?u?d?u?d?l +?s?l?d?u?d?u?d?u +?s?l?d?u?d?u?d?s +?s?l?d?u?d?u?l?d +?s?l?d?u?d?u?l?l +?s?l?d?u?d?u?l?u +?s?l?d?u?d?u?l?s +?s?l?d?u?d?u?u?d +?s?l?d?u?d?u?u?l +?s?l?d?u?d?u?u?u +?s?l?d?u?d?u?u?s +?s?l?d?u?d?u?s?d +?s?l?d?u?d?u?s?l +?s?l?d?u?d?u?s?u +?s?l?d?u?d?u?s?s +?s?l?d?u?d?s?d?d +?s?l?d?u?d?s?d?l +?s?l?d?u?d?s?d?u +?s?l?d?u?d?s?d?s +?s?l?d?u?d?s?l?d +?s?l?d?u?d?s?l?l +?s?l?d?u?d?s?l?u +?s?l?d?u?d?s?l?s +?s?l?d?u?d?s?u?d +?s?l?d?u?d?s?u?l +?s?l?d?u?d?s?u?u +?s?l?d?u?d?s?u?s +?s?l?d?u?d?s?s?d +?s?l?d?u?d?s?s?l +?s?l?d?u?d?s?s?u +?s?l?d?u?d?s?s?s +?s?l?d?u?l?d?d?d +?s?l?d?u?l?d?d?l +?s?l?d?u?l?d?d?u +?s?l?d?u?l?d?d?s +?s?l?d?u?l?d?l?d +?s?l?d?u?l?d?l?l +?s?l?d?u?l?d?l?u +?s?l?d?u?l?d?l?s +?s?l?d?u?l?d?u?d +?s?l?d?u?l?d?u?l +?s?l?d?u?l?d?u?u +?s?l?d?u?l?d?u?s +?s?l?d?u?l?d?s?d +?s?l?d?u?l?d?s?l +?s?l?d?u?l?d?s?u +?s?l?d?u?l?d?s?s +?s?l?d?u?l?l?d?d +?s?l?d?u?l?l?d?l +?s?l?d?u?l?l?d?u +?s?l?d?u?l?l?d?s +?s?l?d?u?l?l?l?d +?s?l?d?u?l?l?l?l +?s?l?d?u?l?l?l?u +?s?l?d?u?l?l?l?s +?s?l?d?u?l?l?u?d +?s?l?d?u?l?l?u?l +?s?l?d?u?l?l?u?u +?s?l?d?u?l?l?u?s +?s?l?d?u?l?l?s?d +?s?l?d?u?l?l?s?l +?s?l?d?u?l?l?s?u +?s?l?d?u?l?l?s?s +?s?l?d?u?l?u?d?d +?s?l?d?u?l?u?d?l +?s?l?d?u?l?u?d?u +?s?l?d?u?l?u?d?s +?s?l?d?u?l?u?l?d +?s?l?d?u?l?u?l?l +?s?l?d?u?l?u?l?u +?s?l?d?u?l?u?l?s +?s?l?d?u?l?u?u?d +?s?l?d?u?l?u?u?l +?s?l?d?u?l?u?u?u +?s?l?d?u?l?u?u?s +?s?l?d?u?l?u?s?d +?s?l?d?u?l?u?s?l +?s?l?d?u?l?u?s?u +?s?l?d?u?l?u?s?s +?s?l?d?u?l?s?d?d +?s?l?d?u?l?s?d?l +?s?l?d?u?l?s?d?u +?s?l?d?u?l?s?d?s +?s?l?d?u?l?s?l?d +?s?l?d?u?l?s?l?l +?s?l?d?u?l?s?l?u +?s?l?d?u?l?s?l?s +?s?l?d?u?l?s?u?d +?s?l?d?u?l?s?u?l +?s?l?d?u?l?s?u?u +?s?l?d?u?l?s?u?s +?s?l?d?u?l?s?s?d +?s?l?d?u?l?s?s?l +?s?l?d?u?l?s?s?u +?s?l?d?u?l?s?s?s +?s?l?d?u?u?d?d?d +?s?l?d?u?u?d?d?l +?s?l?d?u?u?d?d?u +?s?l?d?u?u?d?d?s +?s?l?d?u?u?d?l?d +?s?l?d?u?u?d?l?l +?s?l?d?u?u?d?l?u +?s?l?d?u?u?d?l?s +?s?l?d?u?u?d?u?d +?s?l?d?u?u?d?u?l +?s?l?d?u?u?d?u?u +?s?l?d?u?u?d?u?s +?s?l?d?u?u?d?s?d +?s?l?d?u?u?d?s?l +?s?l?d?u?u?d?s?u +?s?l?d?u?u?d?s?s +?s?l?d?u?u?l?d?d +?s?l?d?u?u?l?d?l +?s?l?d?u?u?l?d?u +?s?l?d?u?u?l?d?s +?s?l?d?u?u?l?l?d +?s?l?d?u?u?l?l?l +?s?l?d?u?u?l?l?u +?s?l?d?u?u?l?l?s +?s?l?d?u?u?l?u?d +?s?l?d?u?u?l?u?l +?s?l?d?u?u?l?u?u +?s?l?d?u?u?l?u?s +?s?l?d?u?u?l?s?d +?s?l?d?u?u?l?s?l +?s?l?d?u?u?l?s?u +?s?l?d?u?u?l?s?s +?s?l?d?u?u?u?d?d +?s?l?d?u?u?u?d?l +?s?l?d?u?u?u?d?u +?s?l?d?u?u?u?d?s +?s?l?d?u?u?u?l?d +?s?l?d?u?u?u?l?l +?s?l?d?u?u?u?l?u +?s?l?d?u?u?u?l?s +?s?l?d?u?u?u?u?d +?s?l?d?u?u?u?u?l +?s?l?d?u?u?u?u?u +?s?l?d?u?u?u?u?s +?s?l?d?u?u?u?s?d +?s?l?d?u?u?u?s?l +?s?l?d?u?u?u?s?u +?s?l?d?u?u?u?s?s +?s?l?d?u?u?s?d?d +?s?l?d?u?u?s?d?l +?s?l?d?u?u?s?d?u +?s?l?d?u?u?s?d?s +?s?l?d?u?u?s?l?d +?s?l?d?u?u?s?l?l +?s?l?d?u?u?s?l?u +?s?l?d?u?u?s?l?s +?s?l?d?u?u?s?u?d +?s?l?d?u?u?s?u?l +?s?l?d?u?u?s?u?u +?s?l?d?u?u?s?u?s +?s?l?d?u?u?s?s?d +?s?l?d?u?u?s?s?l +?s?l?d?u?u?s?s?u +?s?l?d?u?u?s?s?s +?s?l?d?u?s?d?d?d +?s?l?d?u?s?d?d?l +?s?l?d?u?s?d?d?u +?s?l?d?u?s?d?d?s +?s?l?d?u?s?d?l?d +?s?l?d?u?s?d?l?l +?s?l?d?u?s?d?l?u +?s?l?d?u?s?d?l?s +?s?l?d?u?s?d?u?d +?s?l?d?u?s?d?u?l +?s?l?d?u?s?d?u?u +?s?l?d?u?s?d?u?s +?s?l?d?u?s?d?s?d +?s?l?d?u?s?d?s?l +?s?l?d?u?s?d?s?u +?s?l?d?u?s?d?s?s +?s?l?d?u?s?l?d?d +?s?l?d?u?s?l?d?l +?s?l?d?u?s?l?d?u +?s?l?d?u?s?l?d?s +?s?l?d?u?s?l?l?d +?s?l?d?u?s?l?l?l +?s?l?d?u?s?l?l?u +?s?l?d?u?s?l?l?s +?s?l?d?u?s?l?u?d +?s?l?d?u?s?l?u?l +?s?l?d?u?s?l?u?u +?s?l?d?u?s?l?u?s +?s?l?d?u?s?l?s?d +?s?l?d?u?s?l?s?l +?s?l?d?u?s?l?s?u +?s?l?d?u?s?l?s?s +?s?l?d?u?s?u?d?d +?s?l?d?u?s?u?d?l +?s?l?d?u?s?u?d?u +?s?l?d?u?s?u?d?s +?s?l?d?u?s?u?l?d +?s?l?d?u?s?u?l?l +?s?l?d?u?s?u?l?u +?s?l?d?u?s?u?l?s +?s?l?d?u?s?u?u?d +?s?l?d?u?s?u?u?l +?s?l?d?u?s?u?u?u +?s?l?d?u?s?u?u?s +?s?l?d?u?s?u?s?d +?s?l?d?u?s?u?s?l +?s?l?d?u?s?u?s?u +?s?l?d?u?s?u?s?s +?s?l?d?u?s?s?d?d +?s?l?d?u?s?s?d?l +?s?l?d?u?s?s?d?u +?s?l?d?u?s?s?d?s +?s?l?d?u?s?s?l?d +?s?l?d?u?s?s?l?l +?s?l?d?u?s?s?l?u +?s?l?d?u?s?s?l?s +?s?l?d?u?s?s?u?d +?s?l?d?u?s?s?u?l +?s?l?d?u?s?s?u?u +?s?l?d?u?s?s?u?s +?s?l?d?u?s?s?s?d +?s?l?d?u?s?s?s?l +?s?l?d?u?s?s?s?u +?s?l?d?u?s?s?s?s +?s?l?d?s?d?d?d?u +?s?l?d?s?d?d?l?u +?s?l?d?s?d?d?u?d +?s?l?d?s?d?d?u?l +?s?l?d?s?d?d?u?u +?s?l?d?s?d?d?u?s +?s?l?d?s?d?d?s?u +?s?l?d?s?d?l?d?u +?s?l?d?s?d?l?l?u +?s?l?d?s?d?l?u?d +?s?l?d?s?d?l?u?l +?s?l?d?s?d?l?u?u +?s?l?d?s?d?l?u?s +?s?l?d?s?d?l?s?u +?s?l?d?s?d?u?d?d +?s?l?d?s?d?u?d?l +?s?l?d?s?d?u?d?u +?s?l?d?s?d?u?d?s +?s?l?d?s?d?u?l?d +?s?l?d?s?d?u?l?l +?s?l?d?s?d?u?l?u +?s?l?d?s?d?u?l?s +?s?l?d?s?d?u?u?d +?s?l?d?s?d?u?u?l +?s?l?d?s?d?u?u?u +?s?l?d?s?d?u?u?s +?s?l?d?s?d?u?s?d +?s?l?d?s?d?u?s?l +?s?l?d?s?d?u?s?u +?s?l?d?s?d?u?s?s +?s?l?d?s?d?s?d?u +?s?l?d?s?d?s?l?u +?s?l?d?s?d?s?u?d +?s?l?d?s?d?s?u?l +?s?l?d?s?d?s?u?u +?s?l?d?s?d?s?u?s +?s?l?d?s?d?s?s?u +?s?l?d?s?l?d?d?u +?s?l?d?s?l?d?l?u +?s?l?d?s?l?d?u?d +?s?l?d?s?l?d?u?l +?s?l?d?s?l?d?u?u +?s?l?d?s?l?d?u?s +?s?l?d?s?l?d?s?u +?s?l?d?s?l?l?d?u +?s?l?d?s?l?l?l?u +?s?l?d?s?l?l?u?d +?s?l?d?s?l?l?u?l +?s?l?d?s?l?l?u?u +?s?l?d?s?l?l?u?s +?s?l?d?s?l?l?s?u +?s?l?d?s?l?u?d?d +?s?l?d?s?l?u?d?l +?s?l?d?s?l?u?d?u +?s?l?d?s?l?u?d?s +?s?l?d?s?l?u?l?d +?s?l?d?s?l?u?l?l +?s?l?d?s?l?u?l?u +?s?l?d?s?l?u?l?s +?s?l?d?s?l?u?u?d +?s?l?d?s?l?u?u?l +?s?l?d?s?l?u?u?u +?s?l?d?s?l?u?u?s +?s?l?d?s?l?u?s?d +?s?l?d?s?l?u?s?l +?s?l?d?s?l?u?s?u +?s?l?d?s?l?u?s?s +?s?l?d?s?l?s?d?u +?s?l?d?s?l?s?l?u +?s?l?d?s?l?s?u?d +?s?l?d?s?l?s?u?l +?s?l?d?s?l?s?u?u +?s?l?d?s?l?s?u?s +?s?l?d?s?l?s?s?u +?s?l?d?s?u?d?d?d +?s?l?d?s?u?d?d?l +?s?l?d?s?u?d?d?u +?s?l?d?s?u?d?d?s +?s?l?d?s?u?d?l?d +?s?l?d?s?u?d?l?l +?s?l?d?s?u?d?l?u +?s?l?d?s?u?d?l?s +?s?l?d?s?u?d?u?d +?s?l?d?s?u?d?u?l +?s?l?d?s?u?d?u?u +?s?l?d?s?u?d?u?s +?s?l?d?s?u?d?s?d +?s?l?d?s?u?d?s?l +?s?l?d?s?u?d?s?u +?s?l?d?s?u?d?s?s +?s?l?d?s?u?l?d?d +?s?l?d?s?u?l?d?l +?s?l?d?s?u?l?d?u +?s?l?d?s?u?l?d?s +?s?l?d?s?u?l?l?d +?s?l?d?s?u?l?l?l +?s?l?d?s?u?l?l?u +?s?l?d?s?u?l?l?s +?s?l?d?s?u?l?u?d +?s?l?d?s?u?l?u?l +?s?l?d?s?u?l?u?u +?s?l?d?s?u?l?u?s +?s?l?d?s?u?l?s?d +?s?l?d?s?u?l?s?l +?s?l?d?s?u?l?s?u +?s?l?d?s?u?l?s?s +?s?l?d?s?u?u?d?d +?s?l?d?s?u?u?d?l +?s?l?d?s?u?u?d?u +?s?l?d?s?u?u?d?s +?s?l?d?s?u?u?l?d +?s?l?d?s?u?u?l?l +?s?l?d?s?u?u?l?u +?s?l?d?s?u?u?l?s +?s?l?d?s?u?u?u?d +?s?l?d?s?u?u?u?l +?s?l?d?s?u?u?u?u +?s?l?d?s?u?u?u?s +?s?l?d?s?u?u?s?d +?s?l?d?s?u?u?s?l +?s?l?d?s?u?u?s?u +?s?l?d?s?u?u?s?s +?s?l?d?s?u?s?d?d +?s?l?d?s?u?s?d?l +?s?l?d?s?u?s?d?u +?s?l?d?s?u?s?d?s +?s?l?d?s?u?s?l?d +?s?l?d?s?u?s?l?l +?s?l?d?s?u?s?l?u +?s?l?d?s?u?s?l?s +?s?l?d?s?u?s?u?d +?s?l?d?s?u?s?u?l +?s?l?d?s?u?s?u?u +?s?l?d?s?u?s?u?s +?s?l?d?s?u?s?s?d +?s?l?d?s?u?s?s?l +?s?l?d?s?u?s?s?u +?s?l?d?s?u?s?s?s +?s?l?d?s?s?d?d?u +?s?l?d?s?s?d?l?u +?s?l?d?s?s?d?u?d +?s?l?d?s?s?d?u?l +?s?l?d?s?s?d?u?u +?s?l?d?s?s?d?u?s +?s?l?d?s?s?d?s?u +?s?l?d?s?s?l?d?u +?s?l?d?s?s?l?l?u +?s?l?d?s?s?l?u?d +?s?l?d?s?s?l?u?l +?s?l?d?s?s?l?u?u +?s?l?d?s?s?l?u?s +?s?l?d?s?s?l?s?u +?s?l?d?s?s?u?d?d +?s?l?d?s?s?u?d?l +?s?l?d?s?s?u?d?u +?s?l?d?s?s?u?d?s +?s?l?d?s?s?u?l?d +?s?l?d?s?s?u?l?l +?s?l?d?s?s?u?l?u +?s?l?d?s?s?u?l?s +?s?l?d?s?s?u?u?d +?s?l?d?s?s?u?u?l +?s?l?d?s?s?u?u?u +?s?l?d?s?s?u?u?s +?s?l?d?s?s?u?s?d +?s?l?d?s?s?u?s?l +?s?l?d?s?s?u?s?u +?s?l?d?s?s?u?s?s +?s?l?d?s?s?s?d?u +?s?l?d?s?s?s?l?u +?s?l?d?s?s?s?u?d +?s?l?d?s?s?s?u?l +?s?l?d?s?s?s?u?u +?s?l?d?s?s?s?u?s +?s?l?d?s?s?s?s?u +?s?l?l?d?d?d?d?u +?s?l?l?d?d?d?l?u +?s?l?l?d?d?d?u?d +?s?l?l?d?d?d?u?l +?s?l?l?d?d?d?u?u +?s?l?l?d?d?d?u?s +?s?l?l?d?d?d?s?u +?s?l?l?d?d?l?d?u +?s?l?l?d?d?l?l?u +?s?l?l?d?d?l?u?d +?s?l?l?d?d?l?u?l +?s?l?l?d?d?l?u?u +?s?l?l?d?d?l?u?s +?s?l?l?d?d?l?s?u +?s?l?l?d?d?u?d?d +?s?l?l?d?d?u?d?l +?s?l?l?d?d?u?d?u +?s?l?l?d?d?u?d?s +?s?l?l?d?d?u?l?d +?s?l?l?d?d?u?l?l +?s?l?l?d?d?u?l?u +?s?l?l?d?d?u?l?s +?s?l?l?d?d?u?u?d +?s?l?l?d?d?u?u?l +?s?l?l?d?d?u?u?u +?s?l?l?d?d?u?u?s +?s?l?l?d?d?u?s?d +?s?l?l?d?d?u?s?l +?s?l?l?d?d?u?s?u +?s?l?l?d?d?u?s?s +?s?l?l?d?d?s?d?u +?s?l?l?d?d?s?l?u +?s?l?l?d?d?s?u?d +?s?l?l?d?d?s?u?l +?s?l?l?d?d?s?u?u +?s?l?l?d?d?s?u?s +?s?l?l?d?d?s?s?u +?s?l?l?d?l?d?d?u +?s?l?l?d?l?d?l?u +?s?l?l?d?l?d?u?d +?s?l?l?d?l?d?u?l +?s?l?l?d?l?d?u?u +?s?l?l?d?l?d?u?s +?s?l?l?d?l?d?s?u +?s?l?l?d?l?l?d?u +?s?l?l?d?l?l?l?u +?s?l?l?d?l?l?u?d +?s?l?l?d?l?l?u?l +?s?l?l?d?l?l?u?u +?s?l?l?d?l?l?u?s +?s?l?l?d?l?l?s?u +?s?l?l?d?l?u?d?d +?s?l?l?d?l?u?d?l +?s?l?l?d?l?u?d?u +?s?l?l?d?l?u?d?s +?s?l?l?d?l?u?l?d +?s?l?l?d?l?u?l?l +?s?l?l?d?l?u?l?u +?s?l?l?d?l?u?l?s +?s?l?l?d?l?u?u?d +?s?l?l?d?l?u?u?l +?s?l?l?d?l?u?u?u +?s?l?l?d?l?u?u?s +?s?l?l?d?l?u?s?d +?s?l?l?d?l?u?s?l +?s?l?l?d?l?u?s?u +?s?l?l?d?l?u?s?s +?s?l?l?d?l?s?d?u +?s?l?l?d?l?s?l?u +?s?l?l?d?l?s?u?d +?s?l?l?d?l?s?u?l +?s?l?l?d?l?s?u?u +?s?l?l?d?l?s?u?s +?s?l?l?d?l?s?s?u +?s?l?l?d?u?d?d?d +?s?l?l?d?u?d?d?l +?s?l?l?d?u?d?d?u +?s?l?l?d?u?d?d?s +?s?l?l?d?u?d?l?d +?s?l?l?d?u?d?l?l +?s?l?l?d?u?d?l?u +?s?l?l?d?u?d?l?s +?s?l?l?d?u?d?u?d +?s?l?l?d?u?d?u?l +?s?l?l?d?u?d?u?u +?s?l?l?d?u?d?u?s +?s?l?l?d?u?d?s?d +?s?l?l?d?u?d?s?l +?s?l?l?d?u?d?s?u +?s?l?l?d?u?d?s?s +?s?l?l?d?u?l?d?d +?s?l?l?d?u?l?d?l +?s?l?l?d?u?l?d?u +?s?l?l?d?u?l?d?s +?s?l?l?d?u?l?l?d +?s?l?l?d?u?l?l?l +?s?l?l?d?u?l?l?u +?s?l?l?d?u?l?l?s +?s?l?l?d?u?l?u?d +?s?l?l?d?u?l?u?l +?s?l?l?d?u?l?u?u +?s?l?l?d?u?l?u?s +?s?l?l?d?u?l?s?d +?s?l?l?d?u?l?s?l +?s?l?l?d?u?l?s?u +?s?l?l?d?u?l?s?s +?s?l?l?d?u?u?d?d +?s?l?l?d?u?u?d?l +?s?l?l?d?u?u?d?u +?s?l?l?d?u?u?d?s +?s?l?l?d?u?u?l?d +?s?l?l?d?u?u?l?l +?s?l?l?d?u?u?l?u +?s?l?l?d?u?u?l?s +?s?l?l?d?u?u?u?d +?s?l?l?d?u?u?u?l +?s?l?l?d?u?u?u?u +?s?l?l?d?u?u?u?s +?s?l?l?d?u?u?s?d +?s?l?l?d?u?u?s?l +?s?l?l?d?u?u?s?u +?s?l?l?d?u?u?s?s +?s?l?l?d?u?s?d?d +?s?l?l?d?u?s?d?l +?s?l?l?d?u?s?d?u +?s?l?l?d?u?s?d?s +?s?l?l?d?u?s?l?d +?s?l?l?d?u?s?l?l +?s?l?l?d?u?s?l?u +?s?l?l?d?u?s?l?s +?s?l?l?d?u?s?u?d +?s?l?l?d?u?s?u?l +?s?l?l?d?u?s?u?u +?s?l?l?d?u?s?u?s +?s?l?l?d?u?s?s?d +?s?l?l?d?u?s?s?l +?s?l?l?d?u?s?s?u +?s?l?l?d?u?s?s?s +?s?l?l?d?s?d?d?u +?s?l?l?d?s?d?l?u +?s?l?l?d?s?d?u?d +?s?l?l?d?s?d?u?l +?s?l?l?d?s?d?u?u +?s?l?l?d?s?d?u?s +?s?l?l?d?s?d?s?u +?s?l?l?d?s?l?d?u +?s?l?l?d?s?l?l?u +?s?l?l?d?s?l?u?d +?s?l?l?d?s?l?u?l +?s?l?l?d?s?l?u?u +?s?l?l?d?s?l?u?s +?s?l?l?d?s?l?s?u +?s?l?l?d?s?u?d?d +?s?l?l?d?s?u?d?l +?s?l?l?d?s?u?d?u +?s?l?l?d?s?u?d?s +?s?l?l?d?s?u?l?d +?s?l?l?d?s?u?l?l +?s?l?l?d?s?u?l?u +?s?l?l?d?s?u?l?s +?s?l?l?d?s?u?u?d +?s?l?l?d?s?u?u?l +?s?l?l?d?s?u?u?u +?s?l?l?d?s?u?u?s +?s?l?l?d?s?u?s?d +?s?l?l?d?s?u?s?l +?s?l?l?d?s?u?s?u +?s?l?l?d?s?u?s?s +?s?l?l?d?s?s?d?u +?s?l?l?d?s?s?l?u +?s?l?l?d?s?s?u?d +?s?l?l?d?s?s?u?l +?s?l?l?d?s?s?u?u +?s?l?l?d?s?s?u?s +?s?l?l?d?s?s?s?u +?s?l?l?l?d?d?d?u +?s?l?l?l?d?d?l?u +?s?l?l?l?d?d?u?d +?s?l?l?l?d?d?u?l +?s?l?l?l?d?d?u?u +?s?l?l?l?d?d?u?s +?s?l?l?l?d?d?s?u +?s?l?l?l?d?l?d?u +?s?l?l?l?d?l?l?u +?s?l?l?l?d?l?u?d +?s?l?l?l?d?l?u?l +?s?l?l?l?d?l?u?u +?s?l?l?l?d?l?u?s +?s?l?l?l?d?l?s?u +?s?l?l?l?d?u?d?d +?s?l?l?l?d?u?d?l +?s?l?l?l?d?u?d?u +?s?l?l?l?d?u?d?s +?s?l?l?l?d?u?l?d +?s?l?l?l?d?u?l?l +?s?l?l?l?d?u?l?u +?s?l?l?l?d?u?l?s +?s?l?l?l?d?u?u?d +?s?l?l?l?d?u?u?l +?s?l?l?l?d?u?u?u +?s?l?l?l?d?u?u?s +?s?l?l?l?d?u?s?d +?s?l?l?l?d?u?s?l +?s?l?l?l?d?u?s?u +?s?l?l?l?d?u?s?s +?s?l?l?l?d?s?d?u +?s?l?l?l?d?s?l?u +?s?l?l?l?d?s?u?d +?s?l?l?l?d?s?u?l +?s?l?l?l?d?s?u?u +?s?l?l?l?d?s?u?s +?s?l?l?l?d?s?s?u +?s?l?l?l?l?d?d?u +?s?l?l?l?l?d?l?u +?s?l?l?l?l?d?u?d +?s?l?l?l?l?d?u?l +?s?l?l?l?l?d?u?u +?s?l?l?l?l?d?u?s +?s?l?l?l?l?d?s?u +?s?l?l?l?l?l?d?u +?s?l?l?l?l?l?u?d +?s?l?l?l?l?u?d?d +?s?l?l?l?l?u?d?l +?s?l?l?l?l?u?d?u +?s?l?l?l?l?u?d?s +?s?l?l?l?l?u?l?d +?s?l?l?l?l?u?u?d +?s?l?l?l?l?u?s?d +?s?l?l?l?l?s?d?u +?s?l?l?l?l?s?u?d +?s?l?l?l?u?d?d?d +?s?l?l?l?u?d?d?l +?s?l?l?l?u?d?d?u +?s?l?l?l?u?d?d?s +?s?l?l?l?u?d?l?d +?s?l?l?l?u?d?l?l +?s?l?l?l?u?d?l?u +?s?l?l?l?u?d?l?s +?s?l?l?l?u?d?u?d +?s?l?l?l?u?d?u?l +?s?l?l?l?u?d?u?u +?s?l?l?l?u?d?u?s +?s?l?l?l?u?d?s?d +?s?l?l?l?u?d?s?l +?s?l?l?l?u?d?s?u +?s?l?l?l?u?d?s?s +?s?l?l?l?u?l?d?d +?s?l?l?l?u?l?d?l +?s?l?l?l?u?l?d?u +?s?l?l?l?u?l?d?s +?s?l?l?l?u?l?l?d +?s?l?l?l?u?l?u?d +?s?l?l?l?u?l?s?d +?s?l?l?l?u?u?d?d +?s?l?l?l?u?u?d?l +?s?l?l?l?u?u?d?u +?s?l?l?l?u?u?d?s +?s?l?l?l?u?u?l?d +?s?l?l?l?u?u?u?d +?s?l?l?l?u?u?s?d +?s?l?l?l?u?s?d?d +?s?l?l?l?u?s?d?l +?s?l?l?l?u?s?d?u +?s?l?l?l?u?s?d?s +?s?l?l?l?u?s?l?d +?s?l?l?l?u?s?u?d +?s?l?l?l?u?s?s?d +?s?l?l?l?s?d?d?u +?s?l?l?l?s?d?l?u +?s?l?l?l?s?d?u?d +?s?l?l?l?s?d?u?l +?s?l?l?l?s?d?u?u +?s?l?l?l?s?d?u?s +?s?l?l?l?s?d?s?u +?s?l?l?l?s?l?d?u +?s?l?l?l?s?l?u?d +?s?l?l?l?s?u?d?d +?s?l?l?l?s?u?d?l +?s?l?l?l?s?u?d?u +?s?l?l?l?s?u?d?s +?s?l?l?l?s?u?l?d +?s?l?l?l?s?u?u?d +?s?l?l?l?s?u?s?d +?s?l?l?l?s?s?d?u +?s?l?l?l?s?s?u?d +?s?l?l?u?d?d?d?d +?s?l?l?u?d?d?d?l +?s?l?l?u?d?d?d?u +?s?l?l?u?d?d?d?s +?s?l?l?u?d?d?l?d +?s?l?l?u?d?d?l?l +?s?l?l?u?d?d?l?u +?s?l?l?u?d?d?l?s +?s?l?l?u?d?d?u?d +?s?l?l?u?d?d?u?l +?s?l?l?u?d?d?u?u +?s?l?l?u?d?d?u?s +?s?l?l?u?d?d?s?d +?s?l?l?u?d?d?s?l +?s?l?l?u?d?d?s?u +?s?l?l?u?d?d?s?s +?s?l?l?u?d?l?d?d +?s?l?l?u?d?l?d?l +?s?l?l?u?d?l?d?u +?s?l?l?u?d?l?d?s +?s?l?l?u?d?l?l?d +?s?l?l?u?d?l?l?l +?s?l?l?u?d?l?l?u +?s?l?l?u?d?l?l?s +?s?l?l?u?d?l?u?d +?s?l?l?u?d?l?u?l +?s?l?l?u?d?l?u?u +?s?l?l?u?d?l?u?s +?s?l?l?u?d?l?s?d +?s?l?l?u?d?l?s?l +?s?l?l?u?d?l?s?u +?s?l?l?u?d?l?s?s +?s?l?l?u?d?u?d?d +?s?l?l?u?d?u?d?l +?s?l?l?u?d?u?d?u +?s?l?l?u?d?u?d?s +?s?l?l?u?d?u?l?d +?s?l?l?u?d?u?l?l +?s?l?l?u?d?u?l?u +?s?l?l?u?d?u?l?s +?s?l?l?u?d?u?u?d +?s?l?l?u?d?u?u?l +?s?l?l?u?d?u?u?u +?s?l?l?u?d?u?u?s +?s?l?l?u?d?u?s?d +?s?l?l?u?d?u?s?l +?s?l?l?u?d?u?s?u +?s?l?l?u?d?u?s?s +?s?l?l?u?d?s?d?d +?s?l?l?u?d?s?d?l +?s?l?l?u?d?s?d?u +?s?l?l?u?d?s?d?s +?s?l?l?u?d?s?l?d +?s?l?l?u?d?s?l?l +?s?l?l?u?d?s?l?u +?s?l?l?u?d?s?l?s +?s?l?l?u?d?s?u?d +?s?l?l?u?d?s?u?l +?s?l?l?u?d?s?u?u +?s?l?l?u?d?s?u?s +?s?l?l?u?d?s?s?d +?s?l?l?u?d?s?s?l +?s?l?l?u?d?s?s?u +?s?l?l?u?d?s?s?s +?s?l?l?u?l?d?d?d +?s?l?l?u?l?d?d?l +?s?l?l?u?l?d?d?u +?s?l?l?u?l?d?d?s +?s?l?l?u?l?d?l?d +?s?l?l?u?l?d?l?l +?s?l?l?u?l?d?l?u +?s?l?l?u?l?d?l?s +?s?l?l?u?l?d?u?d +?s?l?l?u?l?d?u?l +?s?l?l?u?l?d?u?u +?s?l?l?u?l?d?u?s +?s?l?l?u?l?d?s?d +?s?l?l?u?l?d?s?l +?s?l?l?u?l?d?s?u +?s?l?l?u?l?d?s?s +?s?l?l?u?l?l?d?d +?s?l?l?u?l?l?d?l +?s?l?l?u?l?l?d?u +?s?l?l?u?l?l?d?s +?s?l?l?u?l?l?l?d +?s?l?l?u?l?l?u?d +?s?l?l?u?l?l?s?d +?s?l?l?u?l?u?d?d +?s?l?l?u?l?u?d?l +?s?l?l?u?l?u?d?u +?s?l?l?u?l?u?d?s +?s?l?l?u?l?u?l?d +?s?l?l?u?l?u?u?d +?s?l?l?u?l?u?s?d +?s?l?l?u?l?s?d?d +?s?l?l?u?l?s?d?l +?s?l?l?u?l?s?d?u +?s?l?l?u?l?s?d?s +?s?l?l?u?l?s?l?d +?s?l?l?u?l?s?u?d +?s?l?l?u?l?s?s?d +?s?l?l?u?u?d?d?d +?s?l?l?u?u?d?d?l +?s?l?l?u?u?d?d?u +?s?l?l?u?u?d?d?s +?s?l?l?u?u?d?l?d +?s?l?l?u?u?d?l?l +?s?l?l?u?u?d?l?u +?s?l?l?u?u?d?l?s +?s?l?l?u?u?d?u?d +?s?l?l?u?u?d?u?l +?s?l?l?u?u?d?u?u +?s?l?l?u?u?d?u?s +?s?l?l?u?u?d?s?d +?s?l?l?u?u?d?s?l +?s?l?l?u?u?d?s?u +?s?l?l?u?u?d?s?s +?s?l?l?u?u?l?d?d +?s?l?l?u?u?l?d?l +?s?l?l?u?u?l?d?u +?s?l?l?u?u?l?d?s +?s?l?l?u?u?l?l?d +?s?l?l?u?u?l?u?d +?s?l?l?u?u?l?s?d +?s?l?l?u?u?u?d?d +?s?l?l?u?u?u?d?l +?s?l?l?u?u?u?d?u +?s?l?l?u?u?u?d?s +?s?l?l?u?u?u?l?d +?s?l?l?u?u?u?u?d +?s?l?l?u?u?u?s?d +?s?l?l?u?u?s?d?d +?s?l?l?u?u?s?d?l +?s?l?l?u?u?s?d?u +?s?l?l?u?u?s?d?s +?s?l?l?u?u?s?l?d +?s?l?l?u?u?s?u?d +?s?l?l?u?u?s?s?d +?s?l?l?u?s?d?d?d +?s?l?l?u?s?d?d?l +?s?l?l?u?s?d?d?u +?s?l?l?u?s?d?d?s +?s?l?l?u?s?d?l?d +?s?l?l?u?s?d?l?l +?s?l?l?u?s?d?l?u +?s?l?l?u?s?d?l?s +?s?l?l?u?s?d?u?d +?s?l?l?u?s?d?u?l +?s?l?l?u?s?d?u?u +?s?l?l?u?s?d?u?s +?s?l?l?u?s?d?s?d +?s?l?l?u?s?d?s?l +?s?l?l?u?s?d?s?u +?s?l?l?u?s?d?s?s +?s?l?l?u?s?l?d?d +?s?l?l?u?s?l?d?l +?s?l?l?u?s?l?d?u +?s?l?l?u?s?l?d?s +?s?l?l?u?s?l?l?d +?s?l?l?u?s?l?u?d +?s?l?l?u?s?l?s?d +?s?l?l?u?s?u?d?d +?s?l?l?u?s?u?d?l +?s?l?l?u?s?u?d?u +?s?l?l?u?s?u?d?s +?s?l?l?u?s?u?l?d +?s?l?l?u?s?u?u?d +?s?l?l?u?s?u?s?d +?s?l?l?u?s?s?d?d +?s?l?l?u?s?s?d?l +?s?l?l?u?s?s?d?u +?s?l?l?u?s?s?d?s +?s?l?l?u?s?s?l?d +?s?l?l?u?s?s?u?d +?s?l?l?u?s?s?s?d +?s?l?l?s?d?d?d?u +?s?l?l?s?d?d?l?u +?s?l?l?s?d?d?u?d +?s?l?l?s?d?d?u?l +?s?l?l?s?d?d?u?u +?s?l?l?s?d?d?u?s +?s?l?l?s?d?d?s?u +?s?l?l?s?d?l?d?u +?s?l?l?s?d?l?l?u +?s?l?l?s?d?l?u?d +?s?l?l?s?d?l?u?l +?s?l?l?s?d?l?u?u +?s?l?l?s?d?l?u?s +?s?l?l?s?d?l?s?u +?s?l?l?s?d?u?d?d +?s?l?l?s?d?u?d?l +?s?l?l?s?d?u?d?u +?s?l?l?s?d?u?d?s +?s?l?l?s?d?u?l?d +?s?l?l?s?d?u?l?l +?s?l?l?s?d?u?l?u +?s?l?l?s?d?u?l?s +?s?l?l?s?d?u?u?d +?s?l?l?s?d?u?u?l +?s?l?l?s?d?u?u?u +?s?l?l?s?d?u?u?s +?s?l?l?s?d?u?s?d +?s?l?l?s?d?u?s?l +?s?l?l?s?d?u?s?u +?s?l?l?s?d?u?s?s +?s?l?l?s?d?s?d?u +?s?l?l?s?d?s?l?u +?s?l?l?s?d?s?u?d +?s?l?l?s?d?s?u?l +?s?l?l?s?d?s?u?u +?s?l?l?s?d?s?u?s +?s?l?l?s?d?s?s?u +?s?l?l?s?l?d?d?u +?s?l?l?s?l?d?l?u +?s?l?l?s?l?d?u?d +?s?l?l?s?l?d?u?l +?s?l?l?s?l?d?u?u +?s?l?l?s?l?d?u?s +?s?l?l?s?l?d?s?u +?s?l?l?s?l?l?d?u +?s?l?l?s?l?l?u?d +?s?l?l?s?l?u?d?d +?s?l?l?s?l?u?d?l +?s?l?l?s?l?u?d?u +?s?l?l?s?l?u?d?s +?s?l?l?s?l?u?l?d +?s?l?l?s?l?u?u?d +?s?l?l?s?l?u?s?d +?s?l?l?s?l?s?d?u +?s?l?l?s?l?s?u?d +?s?l?l?s?u?d?d?d +?s?l?l?s?u?d?d?l +?s?l?l?s?u?d?d?u +?s?l?l?s?u?d?d?s +?s?l?l?s?u?d?l?d +?s?l?l?s?u?d?l?l +?s?l?l?s?u?d?l?u +?s?l?l?s?u?d?l?s +?s?l?l?s?u?d?u?d +?s?l?l?s?u?d?u?l +?s?l?l?s?u?d?u?u +?s?l?l?s?u?d?u?s +?s?l?l?s?u?d?s?d +?s?l?l?s?u?d?s?l +?s?l?l?s?u?d?s?u +?s?l?l?s?u?d?s?s +?s?l?l?s?u?l?d?d +?s?l?l?s?u?l?d?l +?s?l?l?s?u?l?d?u +?s?l?l?s?u?l?d?s +?s?l?l?s?u?l?l?d +?s?l?l?s?u?l?u?d +?s?l?l?s?u?l?s?d +?s?l?l?s?u?u?d?d +?s?l?l?s?u?u?d?l +?s?l?l?s?u?u?d?u +?s?l?l?s?u?u?d?s +?s?l?l?s?u?u?l?d +?s?l?l?s?u?u?u?d +?s?l?l?s?u?u?s?d +?s?l?l?s?u?s?d?d +?s?l?l?s?u?s?d?l +?s?l?l?s?u?s?d?u +?s?l?l?s?u?s?d?s +?s?l?l?s?u?s?l?d +?s?l?l?s?u?s?u?d +?s?l?l?s?u?s?s?d +?s?l?l?s?s?d?d?u +?s?l?l?s?s?d?l?u +?s?l?l?s?s?d?u?d +?s?l?l?s?s?d?u?l +?s?l?l?s?s?d?u?u +?s?l?l?s?s?d?u?s +?s?l?l?s?s?d?s?u +?s?l?l?s?s?l?d?u +?s?l?l?s?s?l?u?d +?s?l?l?s?s?u?d?d +?s?l?l?s?s?u?d?l +?s?l?l?s?s?u?d?u +?s?l?l?s?s?u?d?s +?s?l?l?s?s?u?l?d +?s?l?l?s?s?u?u?d +?s?l?l?s?s?u?s?d +?s?l?l?s?s?s?d?u +?s?l?l?s?s?s?u?d +?s?l?u?d?d?d?d?d +?s?l?u?d?d?d?d?l +?s?l?u?d?d?d?d?u +?s?l?u?d?d?d?d?s +?s?l?u?d?d?d?l?d +?s?l?u?d?d?d?l?l +?s?l?u?d?d?d?l?u +?s?l?u?d?d?d?l?s +?s?l?u?d?d?d?u?d +?s?l?u?d?d?d?u?l +?s?l?u?d?d?d?u?u +?s?l?u?d?d?d?u?s +?s?l?u?d?d?d?s?d +?s?l?u?d?d?d?s?l +?s?l?u?d?d?d?s?u +?s?l?u?d?d?d?s?s +?s?l?u?d?d?l?d?d +?s?l?u?d?d?l?d?l +?s?l?u?d?d?l?d?u +?s?l?u?d?d?l?d?s +?s?l?u?d?d?l?l?d +?s?l?u?d?d?l?l?l +?s?l?u?d?d?l?l?u +?s?l?u?d?d?l?l?s +?s?l?u?d?d?l?u?d +?s?l?u?d?d?l?u?l +?s?l?u?d?d?l?u?u +?s?l?u?d?d?l?u?s +?s?l?u?d?d?l?s?d +?s?l?u?d?d?l?s?l +?s?l?u?d?d?l?s?u +?s?l?u?d?d?l?s?s +?s?l?u?d?d?u?d?d +?s?l?u?d?d?u?d?l +?s?l?u?d?d?u?d?u +?s?l?u?d?d?u?d?s +?s?l?u?d?d?u?l?d +?s?l?u?d?d?u?l?l +?s?l?u?d?d?u?l?u +?s?l?u?d?d?u?l?s +?s?l?u?d?d?u?u?d +?s?l?u?d?d?u?u?l +?s?l?u?d?d?u?u?u +?s?l?u?d?d?u?u?s +?s?l?u?d?d?u?s?d +?s?l?u?d?d?u?s?l +?s?l?u?d?d?u?s?u +?s?l?u?d?d?u?s?s +?s?l?u?d?d?s?d?d +?s?l?u?d?d?s?d?l +?s?l?u?d?d?s?d?u +?s?l?u?d?d?s?d?s +?s?l?u?d?d?s?l?d +?s?l?u?d?d?s?l?l +?s?l?u?d?d?s?l?u +?s?l?u?d?d?s?l?s +?s?l?u?d?d?s?u?d +?s?l?u?d?d?s?u?l +?s?l?u?d?d?s?u?u +?s?l?u?d?d?s?u?s +?s?l?u?d?d?s?s?d +?s?l?u?d?d?s?s?l +?s?l?u?d?d?s?s?u +?s?l?u?d?d?s?s?s +?s?l?u?d?l?d?d?d +?s?l?u?d?l?d?d?l +?s?l?u?d?l?d?d?u +?s?l?u?d?l?d?d?s +?s?l?u?d?l?d?l?d +?s?l?u?d?l?d?l?l +?s?l?u?d?l?d?l?u +?s?l?u?d?l?d?l?s +?s?l?u?d?l?d?u?d +?s?l?u?d?l?d?u?l +?s?l?u?d?l?d?u?u +?s?l?u?d?l?d?u?s +?s?l?u?d?l?d?s?d +?s?l?u?d?l?d?s?l +?s?l?u?d?l?d?s?u +?s?l?u?d?l?d?s?s +?s?l?u?d?l?l?d?d +?s?l?u?d?l?l?d?l +?s?l?u?d?l?l?d?u +?s?l?u?d?l?l?d?s +?s?l?u?d?l?l?l?d +?s?l?u?d?l?l?l?l +?s?l?u?d?l?l?l?u +?s?l?u?d?l?l?l?s +?s?l?u?d?l?l?u?d +?s?l?u?d?l?l?u?l +?s?l?u?d?l?l?u?u +?s?l?u?d?l?l?u?s +?s?l?u?d?l?l?s?d +?s?l?u?d?l?l?s?l +?s?l?u?d?l?l?s?u +?s?l?u?d?l?l?s?s +?s?l?u?d?l?u?d?d +?s?l?u?d?l?u?d?l +?s?l?u?d?l?u?d?u +?s?l?u?d?l?u?d?s +?s?l?u?d?l?u?l?d +?s?l?u?d?l?u?l?l +?s?l?u?d?l?u?l?u +?s?l?u?d?l?u?l?s +?s?l?u?d?l?u?u?d +?s?l?u?d?l?u?u?l +?s?l?u?d?l?u?u?u +?s?l?u?d?l?u?u?s +?s?l?u?d?l?u?s?d +?s?l?u?d?l?u?s?l +?s?l?u?d?l?u?s?u +?s?l?u?d?l?u?s?s +?s?l?u?d?l?s?d?d +?s?l?u?d?l?s?d?l +?s?l?u?d?l?s?d?u +?s?l?u?d?l?s?d?s +?s?l?u?d?l?s?l?d +?s?l?u?d?l?s?l?l +?s?l?u?d?l?s?l?u +?s?l?u?d?l?s?l?s +?s?l?u?d?l?s?u?d +?s?l?u?d?l?s?u?l +?s?l?u?d?l?s?u?u +?s?l?u?d?l?s?u?s +?s?l?u?d?l?s?s?d +?s?l?u?d?l?s?s?l +?s?l?u?d?l?s?s?u +?s?l?u?d?l?s?s?s +?s?l?u?d?u?d?d?d +?s?l?u?d?u?d?d?l +?s?l?u?d?u?d?d?u +?s?l?u?d?u?d?d?s +?s?l?u?d?u?d?l?d +?s?l?u?d?u?d?l?l +?s?l?u?d?u?d?l?u +?s?l?u?d?u?d?l?s +?s?l?u?d?u?d?u?d +?s?l?u?d?u?d?u?l +?s?l?u?d?u?d?u?u +?s?l?u?d?u?d?u?s +?s?l?u?d?u?d?s?d +?s?l?u?d?u?d?s?l +?s?l?u?d?u?d?s?u +?s?l?u?d?u?d?s?s +?s?l?u?d?u?l?d?d +?s?l?u?d?u?l?d?l +?s?l?u?d?u?l?d?u +?s?l?u?d?u?l?d?s +?s?l?u?d?u?l?l?d +?s?l?u?d?u?l?l?l +?s?l?u?d?u?l?l?u +?s?l?u?d?u?l?l?s +?s?l?u?d?u?l?u?d +?s?l?u?d?u?l?u?l +?s?l?u?d?u?l?u?u +?s?l?u?d?u?l?u?s +?s?l?u?d?u?l?s?d +?s?l?u?d?u?l?s?l +?s?l?u?d?u?l?s?u +?s?l?u?d?u?l?s?s +?s?l?u?d?u?u?d?d +?s?l?u?d?u?u?d?l +?s?l?u?d?u?u?d?u +?s?l?u?d?u?u?d?s +?s?l?u?d?u?u?l?d +?s?l?u?d?u?u?l?l +?s?l?u?d?u?u?l?u +?s?l?u?d?u?u?l?s +?s?l?u?d?u?u?u?d +?s?l?u?d?u?u?u?l +?s?l?u?d?u?u?u?u +?s?l?u?d?u?u?u?s +?s?l?u?d?u?u?s?d +?s?l?u?d?u?u?s?l +?s?l?u?d?u?u?s?u +?s?l?u?d?u?u?s?s +?s?l?u?d?u?s?d?d +?s?l?u?d?u?s?d?l +?s?l?u?d?u?s?d?u +?s?l?u?d?u?s?d?s +?s?l?u?d?u?s?l?d +?s?l?u?d?u?s?l?l +?s?l?u?d?u?s?l?u +?s?l?u?d?u?s?l?s +?s?l?u?d?u?s?u?d +?s?l?u?d?u?s?u?l +?s?l?u?d?u?s?u?u +?s?l?u?d?u?s?u?s +?s?l?u?d?u?s?s?d +?s?l?u?d?u?s?s?l +?s?l?u?d?u?s?s?u +?s?l?u?d?u?s?s?s +?s?l?u?d?s?d?d?d +?s?l?u?d?s?d?d?l +?s?l?u?d?s?d?d?u +?s?l?u?d?s?d?d?s +?s?l?u?d?s?d?l?d +?s?l?u?d?s?d?l?l +?s?l?u?d?s?d?l?u +?s?l?u?d?s?d?l?s +?s?l?u?d?s?d?u?d +?s?l?u?d?s?d?u?l +?s?l?u?d?s?d?u?u +?s?l?u?d?s?d?u?s +?s?l?u?d?s?d?s?d +?s?l?u?d?s?d?s?l +?s?l?u?d?s?d?s?u +?s?l?u?d?s?d?s?s +?s?l?u?d?s?l?d?d +?s?l?u?d?s?l?d?l +?s?l?u?d?s?l?d?u +?s?l?u?d?s?l?d?s +?s?l?u?d?s?l?l?d +?s?l?u?d?s?l?l?l +?s?l?u?d?s?l?l?u +?s?l?u?d?s?l?l?s +?s?l?u?d?s?l?u?d +?s?l?u?d?s?l?u?l +?s?l?u?d?s?l?u?u +?s?l?u?d?s?l?u?s +?s?l?u?d?s?l?s?d +?s?l?u?d?s?l?s?l +?s?l?u?d?s?l?s?u +?s?l?u?d?s?l?s?s +?s?l?u?d?s?u?d?d +?s?l?u?d?s?u?d?l +?s?l?u?d?s?u?d?u +?s?l?u?d?s?u?d?s +?s?l?u?d?s?u?l?d +?s?l?u?d?s?u?l?l +?s?l?u?d?s?u?l?u +?s?l?u?d?s?u?l?s +?s?l?u?d?s?u?u?d +?s?l?u?d?s?u?u?l +?s?l?u?d?s?u?u?u +?s?l?u?d?s?u?u?s +?s?l?u?d?s?u?s?d +?s?l?u?d?s?u?s?l +?s?l?u?d?s?u?s?u +?s?l?u?d?s?u?s?s +?s?l?u?d?s?s?d?d +?s?l?u?d?s?s?d?l +?s?l?u?d?s?s?d?u +?s?l?u?d?s?s?d?s +?s?l?u?d?s?s?l?d +?s?l?u?d?s?s?l?l +?s?l?u?d?s?s?l?u +?s?l?u?d?s?s?l?s +?s?l?u?d?s?s?u?d +?s?l?u?d?s?s?u?l +?s?l?u?d?s?s?u?u +?s?l?u?d?s?s?u?s +?s?l?u?d?s?s?s?d +?s?l?u?d?s?s?s?l +?s?l?u?d?s?s?s?u +?s?l?u?d?s?s?s?s +?s?l?u?l?d?d?d?d +?s?l?u?l?d?d?d?l +?s?l?u?l?d?d?d?u +?s?l?u?l?d?d?d?s +?s?l?u?l?d?d?l?d +?s?l?u?l?d?d?l?l +?s?l?u?l?d?d?l?u +?s?l?u?l?d?d?l?s +?s?l?u?l?d?d?u?d +?s?l?u?l?d?d?u?l +?s?l?u?l?d?d?u?u +?s?l?u?l?d?d?u?s +?s?l?u?l?d?d?s?d +?s?l?u?l?d?d?s?l +?s?l?u?l?d?d?s?u +?s?l?u?l?d?d?s?s +?s?l?u?l?d?l?d?d +?s?l?u?l?d?l?d?l +?s?l?u?l?d?l?d?u +?s?l?u?l?d?l?d?s +?s?l?u?l?d?l?l?d +?s?l?u?l?d?l?l?l +?s?l?u?l?d?l?l?u +?s?l?u?l?d?l?l?s +?s?l?u?l?d?l?u?d +?s?l?u?l?d?l?u?l +?s?l?u?l?d?l?u?u +?s?l?u?l?d?l?u?s +?s?l?u?l?d?l?s?d +?s?l?u?l?d?l?s?l +?s?l?u?l?d?l?s?u +?s?l?u?l?d?l?s?s +?s?l?u?l?d?u?d?d +?s?l?u?l?d?u?d?l +?s?l?u?l?d?u?d?u +?s?l?u?l?d?u?d?s +?s?l?u?l?d?u?l?d +?s?l?u?l?d?u?l?l +?s?l?u?l?d?u?l?u +?s?l?u?l?d?u?l?s +?s?l?u?l?d?u?u?d +?s?l?u?l?d?u?u?l +?s?l?u?l?d?u?u?u +?s?l?u?l?d?u?u?s +?s?l?u?l?d?u?s?d +?s?l?u?l?d?u?s?l +?s?l?u?l?d?u?s?u +?s?l?u?l?d?u?s?s +?s?l?u?l?d?s?d?d +?s?l?u?l?d?s?d?l +?s?l?u?l?d?s?d?u +?s?l?u?l?d?s?d?s +?s?l?u?l?d?s?l?d +?s?l?u?l?d?s?l?l +?s?l?u?l?d?s?l?u +?s?l?u?l?d?s?l?s +?s?l?u?l?d?s?u?d +?s?l?u?l?d?s?u?l +?s?l?u?l?d?s?u?u +?s?l?u?l?d?s?u?s +?s?l?u?l?d?s?s?d +?s?l?u?l?d?s?s?l +?s?l?u?l?d?s?s?u +?s?l?u?l?d?s?s?s +?s?l?u?l?l?d?d?d +?s?l?u?l?l?d?d?l +?s?l?u?l?l?d?d?u +?s?l?u?l?l?d?d?s +?s?l?u?l?l?d?l?d +?s?l?u?l?l?d?l?l +?s?l?u?l?l?d?l?u +?s?l?u?l?l?d?l?s +?s?l?u?l?l?d?u?d +?s?l?u?l?l?d?u?l +?s?l?u?l?l?d?u?u +?s?l?u?l?l?d?u?s +?s?l?u?l?l?d?s?d +?s?l?u?l?l?d?s?l +?s?l?u?l?l?d?s?u +?s?l?u?l?l?d?s?s +?s?l?u?l?l?l?d?d +?s?l?u?l?l?l?d?l +?s?l?u?l?l?l?d?u +?s?l?u?l?l?l?d?s +?s?l?u?l?l?l?l?d +?s?l?u?l?l?l?u?d +?s?l?u?l?l?l?s?d +?s?l?u?l?l?u?d?d +?s?l?u?l?l?u?d?l +?s?l?u?l?l?u?d?u +?s?l?u?l?l?u?d?s +?s?l?u?l?l?u?l?d +?s?l?u?l?l?u?u?d +?s?l?u?l?l?u?s?d +?s?l?u?l?l?s?d?d +?s?l?u?l?l?s?d?l +?s?l?u?l?l?s?d?u +?s?l?u?l?l?s?d?s +?s?l?u?l?l?s?l?d +?s?l?u?l?l?s?u?d +?s?l?u?l?l?s?s?d +?s?l?u?l?u?d?d?d +?s?l?u?l?u?d?d?l +?s?l?u?l?u?d?d?u +?s?l?u?l?u?d?d?s +?s?l?u?l?u?d?l?d +?s?l?u?l?u?d?l?l +?s?l?u?l?u?d?l?u +?s?l?u?l?u?d?l?s +?s?l?u?l?u?d?u?d +?s?l?u?l?u?d?u?l +?s?l?u?l?u?d?u?u +?s?l?u?l?u?d?u?s +?s?l?u?l?u?d?s?d +?s?l?u?l?u?d?s?l +?s?l?u?l?u?d?s?u +?s?l?u?l?u?d?s?s +?s?l?u?l?u?l?d?d +?s?l?u?l?u?l?d?l +?s?l?u?l?u?l?d?u +?s?l?u?l?u?l?d?s +?s?l?u?l?u?l?l?d +?s?l?u?l?u?l?u?d +?s?l?u?l?u?l?s?d +?s?l?u?l?u?u?d?d +?s?l?u?l?u?u?d?l +?s?l?u?l?u?u?d?u +?s?l?u?l?u?u?d?s +?s?l?u?l?u?u?l?d +?s?l?u?l?u?u?u?d +?s?l?u?l?u?u?s?d +?s?l?u?l?u?s?d?d +?s?l?u?l?u?s?d?l +?s?l?u?l?u?s?d?u +?s?l?u?l?u?s?d?s +?s?l?u?l?u?s?l?d +?s?l?u?l?u?s?u?d +?s?l?u?l?u?s?s?d +?s?l?u?l?s?d?d?d +?s?l?u?l?s?d?d?l +?s?l?u?l?s?d?d?u +?s?l?u?l?s?d?d?s +?s?l?u?l?s?d?l?d +?s?l?u?l?s?d?l?l +?s?l?u?l?s?d?l?u +?s?l?u?l?s?d?l?s +?s?l?u?l?s?d?u?d +?s?l?u?l?s?d?u?l +?s?l?u?l?s?d?u?u +?s?l?u?l?s?d?u?s +?s?l?u?l?s?d?s?d +?s?l?u?l?s?d?s?l +?s?l?u?l?s?d?s?u +?s?l?u?l?s?d?s?s +?s?l?u?l?s?l?d?d +?s?l?u?l?s?l?d?l +?s?l?u?l?s?l?d?u +?s?l?u?l?s?l?d?s +?s?l?u?l?s?l?l?d +?s?l?u?l?s?l?u?d +?s?l?u?l?s?l?s?d +?s?l?u?l?s?u?d?d +?s?l?u?l?s?u?d?l +?s?l?u?l?s?u?d?u +?s?l?u?l?s?u?d?s +?s?l?u?l?s?u?l?d +?s?l?u?l?s?u?u?d +?s?l?u?l?s?u?s?d +?s?l?u?l?s?s?d?d +?s?l?u?l?s?s?d?l +?s?l?u?l?s?s?d?u +?s?l?u?l?s?s?d?s +?s?l?u?l?s?s?l?d +?s?l?u?l?s?s?u?d +?s?l?u?l?s?s?s?d +?s?l?u?u?d?d?d?d +?s?l?u?u?d?d?d?l +?s?l?u?u?d?d?d?u +?s?l?u?u?d?d?d?s +?s?l?u?u?d?d?l?d +?s?l?u?u?d?d?l?l +?s?l?u?u?d?d?l?u +?s?l?u?u?d?d?l?s +?s?l?u?u?d?d?u?d +?s?l?u?u?d?d?u?l +?s?l?u?u?d?d?u?u +?s?l?u?u?d?d?u?s +?s?l?u?u?d?d?s?d +?s?l?u?u?d?d?s?l +?s?l?u?u?d?d?s?u +?s?l?u?u?d?d?s?s +?s?l?u?u?d?l?d?d +?s?l?u?u?d?l?d?l +?s?l?u?u?d?l?d?u +?s?l?u?u?d?l?d?s +?s?l?u?u?d?l?l?d +?s?l?u?u?d?l?l?l +?s?l?u?u?d?l?l?u +?s?l?u?u?d?l?l?s +?s?l?u?u?d?l?u?d +?s?l?u?u?d?l?u?l +?s?l?u?u?d?l?u?u +?s?l?u?u?d?l?u?s +?s?l?u?u?d?l?s?d +?s?l?u?u?d?l?s?l +?s?l?u?u?d?l?s?u +?s?l?u?u?d?l?s?s +?s?l?u?u?d?u?d?d +?s?l?u?u?d?u?d?l +?s?l?u?u?d?u?d?u +?s?l?u?u?d?u?d?s +?s?l?u?u?d?u?l?d +?s?l?u?u?d?u?l?l +?s?l?u?u?d?u?l?u +?s?l?u?u?d?u?l?s +?s?l?u?u?d?u?u?d +?s?l?u?u?d?u?u?l +?s?l?u?u?d?u?u?u +?s?l?u?u?d?u?u?s +?s?l?u?u?d?u?s?d +?s?l?u?u?d?u?s?l +?s?l?u?u?d?u?s?u +?s?l?u?u?d?u?s?s +?s?l?u?u?d?s?d?d +?s?l?u?u?d?s?d?l +?s?l?u?u?d?s?d?u +?s?l?u?u?d?s?d?s +?s?l?u?u?d?s?l?d +?s?l?u?u?d?s?l?l +?s?l?u?u?d?s?l?u +?s?l?u?u?d?s?l?s +?s?l?u?u?d?s?u?d +?s?l?u?u?d?s?u?l +?s?l?u?u?d?s?u?u +?s?l?u?u?d?s?u?s +?s?l?u?u?d?s?s?d +?s?l?u?u?d?s?s?l +?s?l?u?u?d?s?s?u +?s?l?u?u?d?s?s?s +?s?l?u?u?l?d?d?d +?s?l?u?u?l?d?d?l +?s?l?u?u?l?d?d?u +?s?l?u?u?l?d?d?s +?s?l?u?u?l?d?l?d +?s?l?u?u?l?d?l?l +?s?l?u?u?l?d?l?u +?s?l?u?u?l?d?l?s +?s?l?u?u?l?d?u?d +?s?l?u?u?l?d?u?l +?s?l?u?u?l?d?u?u +?s?l?u?u?l?d?u?s +?s?l?u?u?l?d?s?d +?s?l?u?u?l?d?s?l +?s?l?u?u?l?d?s?u +?s?l?u?u?l?d?s?s +?s?l?u?u?l?l?d?d +?s?l?u?u?l?l?d?l +?s?l?u?u?l?l?d?u +?s?l?u?u?l?l?d?s +?s?l?u?u?l?l?l?d +?s?l?u?u?l?l?u?d +?s?l?u?u?l?l?s?d +?s?l?u?u?l?u?d?d +?s?l?u?u?l?u?d?l +?s?l?u?u?l?u?d?u +?s?l?u?u?l?u?d?s +?s?l?u?u?l?u?l?d +?s?l?u?u?l?u?u?d +?s?l?u?u?l?u?s?d +?s?l?u?u?l?s?d?d +?s?l?u?u?l?s?d?l +?s?l?u?u?l?s?d?u +?s?l?u?u?l?s?d?s +?s?l?u?u?l?s?l?d +?s?l?u?u?l?s?u?d +?s?l?u?u?l?s?s?d +?s?l?u?u?u?d?d?d +?s?l?u?u?u?d?d?l +?s?l?u?u?u?d?d?u +?s?l?u?u?u?d?d?s +?s?l?u?u?u?d?l?d +?s?l?u?u?u?d?l?l +?s?l?u?u?u?d?l?u +?s?l?u?u?u?d?l?s +?s?l?u?u?u?d?u?d +?s?l?u?u?u?d?u?l +?s?l?u?u?u?d?u?u +?s?l?u?u?u?d?u?s +?s?l?u?u?u?d?s?d +?s?l?u?u?u?d?s?l +?s?l?u?u?u?d?s?u +?s?l?u?u?u?d?s?s +?s?l?u?u?u?l?d?d +?s?l?u?u?u?l?d?l +?s?l?u?u?u?l?d?u +?s?l?u?u?u?l?d?s +?s?l?u?u?u?l?l?d +?s?l?u?u?u?l?u?d +?s?l?u?u?u?l?s?d +?s?l?u?u?u?u?d?d +?s?l?u?u?u?u?d?l +?s?l?u?u?u?u?d?u +?s?l?u?u?u?u?d?s +?s?l?u?u?u?u?l?d +?s?l?u?u?u?u?u?d +?s?l?u?u?u?u?s?d +?s?l?u?u?u?s?d?d +?s?l?u?u?u?s?d?l +?s?l?u?u?u?s?d?u +?s?l?u?u?u?s?d?s +?s?l?u?u?u?s?l?d +?s?l?u?u?u?s?u?d +?s?l?u?u?u?s?s?d +?s?l?u?u?s?d?d?d +?s?l?u?u?s?d?d?l +?s?l?u?u?s?d?d?u +?s?l?u?u?s?d?d?s +?s?l?u?u?s?d?l?d +?s?l?u?u?s?d?l?l +?s?l?u?u?s?d?l?u +?s?l?u?u?s?d?l?s +?s?l?u?u?s?d?u?d +?s?l?u?u?s?d?u?l +?s?l?u?u?s?d?u?u +?s?l?u?u?s?d?u?s +?s?l?u?u?s?d?s?d +?s?l?u?u?s?d?s?l +?s?l?u?u?s?d?s?u +?s?l?u?u?s?d?s?s +?s?l?u?u?s?l?d?d +?s?l?u?u?s?l?d?l +?s?l?u?u?s?l?d?u +?s?l?u?u?s?l?d?s +?s?l?u?u?s?l?l?d +?s?l?u?u?s?l?u?d +?s?l?u?u?s?l?s?d +?s?l?u?u?s?u?d?d +?s?l?u?u?s?u?d?l +?s?l?u?u?s?u?d?u +?s?l?u?u?s?u?d?s +?s?l?u?u?s?u?l?d +?s?l?u?u?s?u?u?d +?s?l?u?u?s?u?s?d +?s?l?u?u?s?s?d?d +?s?l?u?u?s?s?d?l +?s?l?u?u?s?s?d?u +?s?l?u?u?s?s?d?s +?s?l?u?u?s?s?l?d +?s?l?u?u?s?s?u?d +?s?l?u?u?s?s?s?d +?s?l?u?s?d?d?d?d +?s?l?u?s?d?d?d?l +?s?l?u?s?d?d?d?u +?s?l?u?s?d?d?d?s +?s?l?u?s?d?d?l?d +?s?l?u?s?d?d?l?l +?s?l?u?s?d?d?l?u +?s?l?u?s?d?d?l?s +?s?l?u?s?d?d?u?d +?s?l?u?s?d?d?u?l +?s?l?u?s?d?d?u?u +?s?l?u?s?d?d?u?s +?s?l?u?s?d?d?s?d +?s?l?u?s?d?d?s?l +?s?l?u?s?d?d?s?u +?s?l?u?s?d?d?s?s +?s?l?u?s?d?l?d?d +?s?l?u?s?d?l?d?l +?s?l?u?s?d?l?d?u +?s?l?u?s?d?l?d?s +?s?l?u?s?d?l?l?d +?s?l?u?s?d?l?l?l +?s?l?u?s?d?l?l?u +?s?l?u?s?d?l?l?s +?s?l?u?s?d?l?u?d +?s?l?u?s?d?l?u?l +?s?l?u?s?d?l?u?u +?s?l?u?s?d?l?u?s +?s?l?u?s?d?l?s?d +?s?l?u?s?d?l?s?l +?s?l?u?s?d?l?s?u +?s?l?u?s?d?l?s?s +?s?l?u?s?d?u?d?d +?s?l?u?s?d?u?d?l +?s?l?u?s?d?u?d?u +?s?l?u?s?d?u?d?s +?s?l?u?s?d?u?l?d +?s?l?u?s?d?u?l?l +?s?l?u?s?d?u?l?u +?s?l?u?s?d?u?l?s +?s?l?u?s?d?u?u?d +?s?l?u?s?d?u?u?l +?s?l?u?s?d?u?u?u +?s?l?u?s?d?u?u?s +?s?l?u?s?d?u?s?d +?s?l?u?s?d?u?s?l +?s?l?u?s?d?u?s?u +?s?l?u?s?d?u?s?s +?s?l?u?s?d?s?d?d +?s?l?u?s?d?s?d?l +?s?l?u?s?d?s?d?u +?s?l?u?s?d?s?d?s +?s?l?u?s?d?s?l?d +?s?l?u?s?d?s?l?l +?s?l?u?s?d?s?l?u +?s?l?u?s?d?s?l?s +?s?l?u?s?d?s?u?d +?s?l?u?s?d?s?u?l +?s?l?u?s?d?s?u?u +?s?l?u?s?d?s?u?s +?s?l?u?s?d?s?s?d +?s?l?u?s?d?s?s?l +?s?l?u?s?d?s?s?u +?s?l?u?s?d?s?s?s +?s?l?u?s?l?d?d?d +?s?l?u?s?l?d?d?l +?s?l?u?s?l?d?d?u +?s?l?u?s?l?d?d?s +?s?l?u?s?l?d?l?d +?s?l?u?s?l?d?l?l +?s?l?u?s?l?d?l?u +?s?l?u?s?l?d?l?s +?s?l?u?s?l?d?u?d +?s?l?u?s?l?d?u?l +?s?l?u?s?l?d?u?u +?s?l?u?s?l?d?u?s +?s?l?u?s?l?d?s?d +?s?l?u?s?l?d?s?l +?s?l?u?s?l?d?s?u +?s?l?u?s?l?d?s?s +?s?l?u?s?l?l?d?d +?s?l?u?s?l?l?d?l +?s?l?u?s?l?l?d?u +?s?l?u?s?l?l?d?s +?s?l?u?s?l?l?l?d +?s?l?u?s?l?l?u?d +?s?l?u?s?l?l?s?d +?s?l?u?s?l?u?d?d +?s?l?u?s?l?u?d?l +?s?l?u?s?l?u?d?u +?s?l?u?s?l?u?d?s +?s?l?u?s?l?u?l?d +?s?l?u?s?l?u?u?d +?s?l?u?s?l?u?s?d +?s?l?u?s?l?s?d?d +?s?l?u?s?l?s?d?l +?s?l?u?s?l?s?d?u +?s?l?u?s?l?s?d?s +?s?l?u?s?l?s?l?d +?s?l?u?s?l?s?u?d +?s?l?u?s?l?s?s?d +?s?l?u?s?u?d?d?d +?s?l?u?s?u?d?d?l +?s?l?u?s?u?d?d?u +?s?l?u?s?u?d?d?s +?s?l?u?s?u?d?l?d +?s?l?u?s?u?d?l?l +?s?l?u?s?u?d?l?u +?s?l?u?s?u?d?l?s +?s?l?u?s?u?d?u?d +?s?l?u?s?u?d?u?l +?s?l?u?s?u?d?u?u +?s?l?u?s?u?d?u?s +?s?l?u?s?u?d?s?d +?s?l?u?s?u?d?s?l +?s?l?u?s?u?d?s?u +?s?l?u?s?u?d?s?s +?s?l?u?s?u?l?d?d +?s?l?u?s?u?l?d?l +?s?l?u?s?u?l?d?u +?s?l?u?s?u?l?d?s +?s?l?u?s?u?l?l?d +?s?l?u?s?u?l?u?d +?s?l?u?s?u?l?s?d +?s?l?u?s?u?u?d?d +?s?l?u?s?u?u?d?l +?s?l?u?s?u?u?d?u +?s?l?u?s?u?u?d?s +?s?l?u?s?u?u?l?d +?s?l?u?s?u?u?u?d +?s?l?u?s?u?u?s?d +?s?l?u?s?u?s?d?d +?s?l?u?s?u?s?d?l +?s?l?u?s?u?s?d?u +?s?l?u?s?u?s?d?s +?s?l?u?s?u?s?l?d +?s?l?u?s?u?s?u?d +?s?l?u?s?u?s?s?d +?s?l?u?s?s?d?d?d +?s?l?u?s?s?d?d?l +?s?l?u?s?s?d?d?u +?s?l?u?s?s?d?d?s +?s?l?u?s?s?d?l?d +?s?l?u?s?s?d?l?l +?s?l?u?s?s?d?l?u +?s?l?u?s?s?d?l?s +?s?l?u?s?s?d?u?d +?s?l?u?s?s?d?u?l +?s?l?u?s?s?d?u?u +?s?l?u?s?s?d?u?s +?s?l?u?s?s?d?s?d +?s?l?u?s?s?d?s?l +?s?l?u?s?s?d?s?u +?s?l?u?s?s?d?s?s +?s?l?u?s?s?l?d?d +?s?l?u?s?s?l?d?l +?s?l?u?s?s?l?d?u +?s?l?u?s?s?l?d?s +?s?l?u?s?s?l?l?d +?s?l?u?s?s?l?u?d +?s?l?u?s?s?l?s?d +?s?l?u?s?s?u?d?d +?s?l?u?s?s?u?d?l +?s?l?u?s?s?u?d?u +?s?l?u?s?s?u?d?s +?s?l?u?s?s?u?l?d +?s?l?u?s?s?u?u?d +?s?l?u?s?s?u?s?d +?s?l?u?s?s?s?d?d +?s?l?u?s?s?s?d?l +?s?l?u?s?s?s?d?u +?s?l?u?s?s?s?d?s +?s?l?u?s?s?s?l?d +?s?l?u?s?s?s?u?d +?s?l?u?s?s?s?s?d +?s?l?s?d?d?d?d?u +?s?l?s?d?d?d?l?u +?s?l?s?d?d?d?u?d +?s?l?s?d?d?d?u?l +?s?l?s?d?d?d?u?u +?s?l?s?d?d?d?u?s +?s?l?s?d?d?d?s?u +?s?l?s?d?d?l?d?u +?s?l?s?d?d?l?l?u +?s?l?s?d?d?l?u?d +?s?l?s?d?d?l?u?l +?s?l?s?d?d?l?u?u +?s?l?s?d?d?l?u?s +?s?l?s?d?d?l?s?u +?s?l?s?d?d?u?d?d +?s?l?s?d?d?u?d?l +?s?l?s?d?d?u?d?u +?s?l?s?d?d?u?d?s +?s?l?s?d?d?u?l?d +?s?l?s?d?d?u?l?l +?s?l?s?d?d?u?l?u +?s?l?s?d?d?u?l?s +?s?l?s?d?d?u?u?d +?s?l?s?d?d?u?u?l +?s?l?s?d?d?u?u?u +?s?l?s?d?d?u?u?s +?s?l?s?d?d?u?s?d +?s?l?s?d?d?u?s?l +?s?l?s?d?d?u?s?u +?s?l?s?d?d?u?s?s +?s?l?s?d?d?s?d?u +?s?l?s?d?d?s?l?u +?s?l?s?d?d?s?u?d +?s?l?s?d?d?s?u?l +?s?l?s?d?d?s?u?u +?s?l?s?d?d?s?u?s +?s?l?s?d?d?s?s?u +?s?l?s?d?l?d?d?u +?s?l?s?d?l?d?l?u +?s?l?s?d?l?d?u?d +?s?l?s?d?l?d?u?l +?s?l?s?d?l?d?u?u +?s?l?s?d?l?d?u?s +?s?l?s?d?l?d?s?u +?s?l?s?d?l?l?d?u +?s?l?s?d?l?l?l?u +?s?l?s?d?l?l?u?d +?s?l?s?d?l?l?u?l +?s?l?s?d?l?l?u?u +?s?l?s?d?l?l?u?s +?s?l?s?d?l?l?s?u +?s?l?s?d?l?u?d?d +?s?l?s?d?l?u?d?l +?s?l?s?d?l?u?d?u +?s?l?s?d?l?u?d?s +?s?l?s?d?l?u?l?d +?s?l?s?d?l?u?l?l +?s?l?s?d?l?u?l?u +?s?l?s?d?l?u?l?s +?s?l?s?d?l?u?u?d +?s?l?s?d?l?u?u?l +?s?l?s?d?l?u?u?u +?s?l?s?d?l?u?u?s +?s?l?s?d?l?u?s?d +?s?l?s?d?l?u?s?l +?s?l?s?d?l?u?s?u +?s?l?s?d?l?u?s?s +?s?l?s?d?l?s?d?u +?s?l?s?d?l?s?l?u +?s?l?s?d?l?s?u?d +?s?l?s?d?l?s?u?l +?s?l?s?d?l?s?u?u +?s?l?s?d?l?s?u?s +?s?l?s?d?l?s?s?u +?s?l?s?d?u?d?d?d +?s?l?s?d?u?d?d?l +?s?l?s?d?u?d?d?u +?s?l?s?d?u?d?d?s +?s?l?s?d?u?d?l?d +?s?l?s?d?u?d?l?l +?s?l?s?d?u?d?l?u +?s?l?s?d?u?d?l?s +?s?l?s?d?u?d?u?d +?s?l?s?d?u?d?u?l +?s?l?s?d?u?d?u?u +?s?l?s?d?u?d?u?s +?s?l?s?d?u?d?s?d +?s?l?s?d?u?d?s?l +?s?l?s?d?u?d?s?u +?s?l?s?d?u?d?s?s +?s?l?s?d?u?l?d?d +?s?l?s?d?u?l?d?l +?s?l?s?d?u?l?d?u +?s?l?s?d?u?l?d?s +?s?l?s?d?u?l?l?d +?s?l?s?d?u?l?l?l +?s?l?s?d?u?l?l?u +?s?l?s?d?u?l?l?s +?s?l?s?d?u?l?u?d +?s?l?s?d?u?l?u?l +?s?l?s?d?u?l?u?u +?s?l?s?d?u?l?u?s +?s?l?s?d?u?l?s?d +?s?l?s?d?u?l?s?l +?s?l?s?d?u?l?s?u +?s?l?s?d?u?l?s?s +?s?l?s?d?u?u?d?d +?s?l?s?d?u?u?d?l +?s?l?s?d?u?u?d?u +?s?l?s?d?u?u?d?s +?s?l?s?d?u?u?l?d +?s?l?s?d?u?u?l?l +?s?l?s?d?u?u?l?u +?s?l?s?d?u?u?l?s +?s?l?s?d?u?u?u?d +?s?l?s?d?u?u?u?l +?s?l?s?d?u?u?u?u +?s?l?s?d?u?u?u?s +?s?l?s?d?u?u?s?d +?s?l?s?d?u?u?s?l +?s?l?s?d?u?u?s?u +?s?l?s?d?u?u?s?s +?s?l?s?d?u?s?d?d +?s?l?s?d?u?s?d?l +?s?l?s?d?u?s?d?u +?s?l?s?d?u?s?d?s +?s?l?s?d?u?s?l?d +?s?l?s?d?u?s?l?l +?s?l?s?d?u?s?l?u +?s?l?s?d?u?s?l?s +?s?l?s?d?u?s?u?d +?s?l?s?d?u?s?u?l +?s?l?s?d?u?s?u?u +?s?l?s?d?u?s?u?s +?s?l?s?d?u?s?s?d +?s?l?s?d?u?s?s?l +?s?l?s?d?u?s?s?u +?s?l?s?d?u?s?s?s +?s?l?s?d?s?d?d?u +?s?l?s?d?s?d?l?u +?s?l?s?d?s?d?u?d +?s?l?s?d?s?d?u?l +?s?l?s?d?s?d?u?u +?s?l?s?d?s?d?u?s +?s?l?s?d?s?d?s?u +?s?l?s?d?s?l?d?u +?s?l?s?d?s?l?l?u +?s?l?s?d?s?l?u?d +?s?l?s?d?s?l?u?l +?s?l?s?d?s?l?u?u +?s?l?s?d?s?l?u?s +?s?l?s?d?s?l?s?u +?s?l?s?d?s?u?d?d +?s?l?s?d?s?u?d?l +?s?l?s?d?s?u?d?u +?s?l?s?d?s?u?d?s +?s?l?s?d?s?u?l?d +?s?l?s?d?s?u?l?l +?s?l?s?d?s?u?l?u +?s?l?s?d?s?u?l?s +?s?l?s?d?s?u?u?d +?s?l?s?d?s?u?u?l +?s?l?s?d?s?u?u?u +?s?l?s?d?s?u?u?s +?s?l?s?d?s?u?s?d +?s?l?s?d?s?u?s?l +?s?l?s?d?s?u?s?u +?s?l?s?d?s?u?s?s +?s?l?s?d?s?s?d?u +?s?l?s?d?s?s?l?u +?s?l?s?d?s?s?u?d +?s?l?s?d?s?s?u?l +?s?l?s?d?s?s?u?u +?s?l?s?d?s?s?u?s +?s?l?s?d?s?s?s?u +?s?l?s?l?d?d?d?u +?s?l?s?l?d?d?l?u +?s?l?s?l?d?d?u?d +?s?l?s?l?d?d?u?l +?s?l?s?l?d?d?u?u +?s?l?s?l?d?d?u?s +?s?l?s?l?d?d?s?u +?s?l?s?l?d?l?d?u +?s?l?s?l?d?l?l?u +?s?l?s?l?d?l?u?d +?s?l?s?l?d?l?u?l +?s?l?s?l?d?l?u?u +?s?l?s?l?d?l?u?s +?s?l?s?l?d?l?s?u +?s?l?s?l?d?u?d?d +?s?l?s?l?d?u?d?l +?s?l?s?l?d?u?d?u +?s?l?s?l?d?u?d?s +?s?l?s?l?d?u?l?d +?s?l?s?l?d?u?l?l +?s?l?s?l?d?u?l?u +?s?l?s?l?d?u?l?s +?s?l?s?l?d?u?u?d +?s?l?s?l?d?u?u?l +?s?l?s?l?d?u?u?u +?s?l?s?l?d?u?u?s +?s?l?s?l?d?u?s?d +?s?l?s?l?d?u?s?l +?s?l?s?l?d?u?s?u +?s?l?s?l?d?u?s?s +?s?l?s?l?d?s?d?u +?s?l?s?l?d?s?l?u +?s?l?s?l?d?s?u?d +?s?l?s?l?d?s?u?l +?s?l?s?l?d?s?u?u +?s?l?s?l?d?s?u?s +?s?l?s?l?d?s?s?u +?s?l?s?l?l?d?d?u +?s?l?s?l?l?d?l?u +?s?l?s?l?l?d?u?d +?s?l?s?l?l?d?u?l +?s?l?s?l?l?d?u?u +?s?l?s?l?l?d?u?s +?s?l?s?l?l?d?s?u +?s?l?s?l?l?l?d?u +?s?l?s?l?l?l?u?d +?s?l?s?l?l?u?d?d +?s?l?s?l?l?u?d?l +?s?l?s?l?l?u?d?u +?s?l?s?l?l?u?d?s +?s?l?s?l?l?u?l?d +?s?l?s?l?l?u?u?d +?s?l?s?l?l?u?s?d +?s?l?s?l?l?s?d?u +?s?l?s?l?l?s?u?d +?s?l?s?l?u?d?d?d +?s?l?s?l?u?d?d?l +?s?l?s?l?u?d?d?u +?s?l?s?l?u?d?d?s +?s?l?s?l?u?d?l?d +?s?l?s?l?u?d?l?l +?s?l?s?l?u?d?l?u +?s?l?s?l?u?d?l?s +?s?l?s?l?u?d?u?d +?s?l?s?l?u?d?u?l +?s?l?s?l?u?d?u?u +?s?l?s?l?u?d?u?s +?s?l?s?l?u?d?s?d +?s?l?s?l?u?d?s?l +?s?l?s?l?u?d?s?u +?s?l?s?l?u?d?s?s +?s?l?s?l?u?l?d?d +?s?l?s?l?u?l?d?l +?s?l?s?l?u?l?d?u +?s?l?s?l?u?l?d?s +?s?l?s?l?u?l?l?d +?s?l?s?l?u?l?u?d +?s?l?s?l?u?l?s?d +?s?l?s?l?u?u?d?d +?s?l?s?l?u?u?d?l +?s?l?s?l?u?u?d?u +?s?l?s?l?u?u?d?s +?s?l?s?l?u?u?l?d +?s?l?s?l?u?u?u?d +?s?l?s?l?u?u?s?d +?s?l?s?l?u?s?d?d +?s?l?s?l?u?s?d?l +?s?l?s?l?u?s?d?u +?s?l?s?l?u?s?d?s +?s?l?s?l?u?s?l?d +?s?l?s?l?u?s?u?d +?s?l?s?l?u?s?s?d +?s?l?s?l?s?d?d?u +?s?l?s?l?s?d?l?u +?s?l?s?l?s?d?u?d +?s?l?s?l?s?d?u?l +?s?l?s?l?s?d?u?u +?s?l?s?l?s?d?u?s +?s?l?s?l?s?d?s?u +?s?l?s?l?s?l?d?u +?s?l?s?l?s?l?u?d +?s?l?s?l?s?u?d?d +?s?l?s?l?s?u?d?l +?s?l?s?l?s?u?d?u +?s?l?s?l?s?u?d?s +?s?l?s?l?s?u?l?d +?s?l?s?l?s?u?u?d +?s?l?s?l?s?u?s?d +?s?l?s?l?s?s?d?u +?s?l?s?l?s?s?u?d +?s?l?s?u?d?d?d?d +?s?l?s?u?d?d?d?l +?s?l?s?u?d?d?d?u +?s?l?s?u?d?d?d?s +?s?l?s?u?d?d?l?d +?s?l?s?u?d?d?l?l +?s?l?s?u?d?d?l?u +?s?l?s?u?d?d?l?s +?s?l?s?u?d?d?u?d +?s?l?s?u?d?d?u?l +?s?l?s?u?d?d?u?u +?s?l?s?u?d?d?u?s +?s?l?s?u?d?d?s?d +?s?l?s?u?d?d?s?l +?s?l?s?u?d?d?s?u +?s?l?s?u?d?d?s?s +?s?l?s?u?d?l?d?d +?s?l?s?u?d?l?d?l +?s?l?s?u?d?l?d?u +?s?l?s?u?d?l?d?s +?s?l?s?u?d?l?l?d +?s?l?s?u?d?l?l?l +?s?l?s?u?d?l?l?u +?s?l?s?u?d?l?l?s +?s?l?s?u?d?l?u?d +?s?l?s?u?d?l?u?l +?s?l?s?u?d?l?u?u +?s?l?s?u?d?l?u?s +?s?l?s?u?d?l?s?d +?s?l?s?u?d?l?s?l +?s?l?s?u?d?l?s?u +?s?l?s?u?d?l?s?s +?s?l?s?u?d?u?d?d +?s?l?s?u?d?u?d?l +?s?l?s?u?d?u?d?u +?s?l?s?u?d?u?d?s +?s?l?s?u?d?u?l?d +?s?l?s?u?d?u?l?l +?s?l?s?u?d?u?l?u +?s?l?s?u?d?u?l?s +?s?l?s?u?d?u?u?d +?s?l?s?u?d?u?u?l +?s?l?s?u?d?u?u?u +?s?l?s?u?d?u?u?s +?s?l?s?u?d?u?s?d +?s?l?s?u?d?u?s?l +?s?l?s?u?d?u?s?u +?s?l?s?u?d?u?s?s +?s?l?s?u?d?s?d?d +?s?l?s?u?d?s?d?l +?s?l?s?u?d?s?d?u +?s?l?s?u?d?s?d?s +?s?l?s?u?d?s?l?d +?s?l?s?u?d?s?l?l +?s?l?s?u?d?s?l?u +?s?l?s?u?d?s?l?s +?s?l?s?u?d?s?u?d +?s?l?s?u?d?s?u?l +?s?l?s?u?d?s?u?u +?s?l?s?u?d?s?u?s +?s?l?s?u?d?s?s?d +?s?l?s?u?d?s?s?l +?s?l?s?u?d?s?s?u +?s?l?s?u?d?s?s?s +?s?l?s?u?l?d?d?d +?s?l?s?u?l?d?d?l +?s?l?s?u?l?d?d?u +?s?l?s?u?l?d?d?s +?s?l?s?u?l?d?l?d +?s?l?s?u?l?d?l?l +?s?l?s?u?l?d?l?u +?s?l?s?u?l?d?l?s +?s?l?s?u?l?d?u?d +?s?l?s?u?l?d?u?l +?s?l?s?u?l?d?u?u +?s?l?s?u?l?d?u?s +?s?l?s?u?l?d?s?d +?s?l?s?u?l?d?s?l +?s?l?s?u?l?d?s?u +?s?l?s?u?l?d?s?s +?s?l?s?u?l?l?d?d +?s?l?s?u?l?l?d?l +?s?l?s?u?l?l?d?u +?s?l?s?u?l?l?d?s +?s?l?s?u?l?l?l?d +?s?l?s?u?l?l?u?d +?s?l?s?u?l?l?s?d +?s?l?s?u?l?u?d?d +?s?l?s?u?l?u?d?l +?s?l?s?u?l?u?d?u +?s?l?s?u?l?u?d?s +?s?l?s?u?l?u?l?d +?s?l?s?u?l?u?u?d +?s?l?s?u?l?u?s?d +?s?l?s?u?l?s?d?d +?s?l?s?u?l?s?d?l +?s?l?s?u?l?s?d?u +?s?l?s?u?l?s?d?s +?s?l?s?u?l?s?l?d +?s?l?s?u?l?s?u?d +?s?l?s?u?l?s?s?d +?s?l?s?u?u?d?d?d +?s?l?s?u?u?d?d?l +?s?l?s?u?u?d?d?u +?s?l?s?u?u?d?d?s +?s?l?s?u?u?d?l?d +?s?l?s?u?u?d?l?l +?s?l?s?u?u?d?l?u +?s?l?s?u?u?d?l?s +?s?l?s?u?u?d?u?d +?s?l?s?u?u?d?u?l +?s?l?s?u?u?d?u?u +?s?l?s?u?u?d?u?s +?s?l?s?u?u?d?s?d +?s?l?s?u?u?d?s?l +?s?l?s?u?u?d?s?u +?s?l?s?u?u?d?s?s +?s?l?s?u?u?l?d?d +?s?l?s?u?u?l?d?l +?s?l?s?u?u?l?d?u +?s?l?s?u?u?l?d?s +?s?l?s?u?u?l?l?d +?s?l?s?u?u?l?u?d +?s?l?s?u?u?l?s?d +?s?l?s?u?u?u?d?d +?s?l?s?u?u?u?d?l +?s?l?s?u?u?u?d?u +?s?l?s?u?u?u?d?s +?s?l?s?u?u?u?l?d +?s?l?s?u?u?u?u?d +?s?l?s?u?u?u?s?d +?s?l?s?u?u?s?d?d +?s?l?s?u?u?s?d?l +?s?l?s?u?u?s?d?u +?s?l?s?u?u?s?d?s +?s?l?s?u?u?s?l?d +?s?l?s?u?u?s?u?d +?s?l?s?u?u?s?s?d +?s?l?s?u?s?d?d?d +?s?l?s?u?s?d?d?l +?s?l?s?u?s?d?d?u +?s?l?s?u?s?d?d?s +?s?l?s?u?s?d?l?d +?s?l?s?u?s?d?l?l +?s?l?s?u?s?d?l?u +?s?l?s?u?s?d?l?s +?s?l?s?u?s?d?u?d +?s?l?s?u?s?d?u?l +?s?l?s?u?s?d?u?u +?s?l?s?u?s?d?u?s +?s?l?s?u?s?d?s?d +?s?l?s?u?s?d?s?l +?s?l?s?u?s?d?s?u +?s?l?s?u?s?d?s?s +?s?l?s?u?s?l?d?d +?s?l?s?u?s?l?d?l +?s?l?s?u?s?l?d?u +?s?l?s?u?s?l?d?s +?s?l?s?u?s?l?l?d +?s?l?s?u?s?l?u?d +?s?l?s?u?s?l?s?d +?s?l?s?u?s?u?d?d +?s?l?s?u?s?u?d?l +?s?l?s?u?s?u?d?u +?s?l?s?u?s?u?d?s +?s?l?s?u?s?u?l?d +?s?l?s?u?s?u?u?d +?s?l?s?u?s?u?s?d +?s?l?s?u?s?s?d?d +?s?l?s?u?s?s?d?l +?s?l?s?u?s?s?d?u +?s?l?s?u?s?s?d?s +?s?l?s?u?s?s?l?d +?s?l?s?u?s?s?u?d +?s?l?s?u?s?s?s?d +?s?l?s?s?d?d?d?u +?s?l?s?s?d?d?l?u +?s?l?s?s?d?d?u?d +?s?l?s?s?d?d?u?l +?s?l?s?s?d?d?u?u +?s?l?s?s?d?d?u?s +?s?l?s?s?d?d?s?u +?s?l?s?s?d?l?d?u +?s?l?s?s?d?l?l?u +?s?l?s?s?d?l?u?d +?s?l?s?s?d?l?u?l +?s?l?s?s?d?l?u?u +?s?l?s?s?d?l?u?s +?s?l?s?s?d?l?s?u +?s?l?s?s?d?u?d?d +?s?l?s?s?d?u?d?l +?s?l?s?s?d?u?d?u +?s?l?s?s?d?u?d?s +?s?l?s?s?d?u?l?d +?s?l?s?s?d?u?l?l +?s?l?s?s?d?u?l?u +?s?l?s?s?d?u?l?s +?s?l?s?s?d?u?u?d +?s?l?s?s?d?u?u?l +?s?l?s?s?d?u?u?u +?s?l?s?s?d?u?u?s +?s?l?s?s?d?u?s?d +?s?l?s?s?d?u?s?l +?s?l?s?s?d?u?s?u +?s?l?s?s?d?u?s?s +?s?l?s?s?d?s?d?u +?s?l?s?s?d?s?l?u +?s?l?s?s?d?s?u?d +?s?l?s?s?d?s?u?l +?s?l?s?s?d?s?u?u +?s?l?s?s?d?s?u?s +?s?l?s?s?d?s?s?u +?s?l?s?s?l?d?d?u +?s?l?s?s?l?d?l?u +?s?l?s?s?l?d?u?d +?s?l?s?s?l?d?u?l +?s?l?s?s?l?d?u?u +?s?l?s?s?l?d?u?s +?s?l?s?s?l?d?s?u +?s?l?s?s?l?l?d?u +?s?l?s?s?l?l?u?d +?s?l?s?s?l?u?d?d +?s?l?s?s?l?u?d?l +?s?l?s?s?l?u?d?u +?s?l?s?s?l?u?d?s +?s?l?s?s?l?u?l?d +?s?l?s?s?l?u?u?d +?s?l?s?s?l?u?s?d +?s?l?s?s?l?s?d?u +?s?l?s?s?l?s?u?d +?s?l?s?s?u?d?d?d +?s?l?s?s?u?d?d?l +?s?l?s?s?u?d?d?u +?s?l?s?s?u?d?d?s +?s?l?s?s?u?d?l?d +?s?l?s?s?u?d?l?l +?s?l?s?s?u?d?l?u +?s?l?s?s?u?d?l?s +?s?l?s?s?u?d?u?d +?s?l?s?s?u?d?u?l +?s?l?s?s?u?d?u?u +?s?l?s?s?u?d?u?s +?s?l?s?s?u?d?s?d +?s?l?s?s?u?d?s?l +?s?l?s?s?u?d?s?u +?s?l?s?s?u?d?s?s +?s?l?s?s?u?l?d?d +?s?l?s?s?u?l?d?l +?s?l?s?s?u?l?d?u +?s?l?s?s?u?l?d?s +?s?l?s?s?u?l?l?d +?s?l?s?s?u?l?u?d +?s?l?s?s?u?l?s?d +?s?l?s?s?u?u?d?d +?s?l?s?s?u?u?d?l +?s?l?s?s?u?u?d?u +?s?l?s?s?u?u?d?s +?s?l?s?s?u?u?l?d +?s?l?s?s?u?u?u?d +?s?l?s?s?u?u?s?d +?s?l?s?s?u?s?d?d +?s?l?s?s?u?s?d?l +?s?l?s?s?u?s?d?u +?s?l?s?s?u?s?d?s +?s?l?s?s?u?s?l?d +?s?l?s?s?u?s?u?d +?s?l?s?s?u?s?s?d +?s?l?s?s?s?d?d?u +?s?l?s?s?s?d?l?u +?s?l?s?s?s?d?u?d +?s?l?s?s?s?d?u?l +?s?l?s?s?s?d?u?u +?s?l?s?s?s?d?u?s +?s?l?s?s?s?d?s?u +?s?l?s?s?s?l?d?u +?s?l?s?s?s?l?u?d +?s?l?s?s?s?u?d?d +?s?l?s?s?s?u?d?l +?s?l?s?s?s?u?d?u +?s?l?s?s?s?u?d?s +?s?l?s?s?s?u?l?d +?s?l?s?s?s?u?u?d +?s?l?s?s?s?u?s?d +?s?l?s?s?s?s?d?u +?s?l?s?s?s?s?u?d +?s?u?d?d?d?d?d?l +?s?u?d?d?d?d?l?d +?s?u?d?d?d?d?l?l +?s?u?d?d?d?d?l?u +?s?u?d?d?d?d?l?s +?s?u?d?d?d?d?u?l +?s?u?d?d?d?d?s?l +?s?u?d?d?d?l?d?d +?s?u?d?d?d?l?d?l +?s?u?d?d?d?l?d?u +?s?u?d?d?d?l?d?s +?s?u?d?d?d?l?l?d +?s?u?d?d?d?l?l?l +?s?u?d?d?d?l?l?u +?s?u?d?d?d?l?l?s +?s?u?d?d?d?l?u?d +?s?u?d?d?d?l?u?l +?s?u?d?d?d?l?u?u +?s?u?d?d?d?l?u?s +?s?u?d?d?d?l?s?d +?s?u?d?d?d?l?s?l +?s?u?d?d?d?l?s?u +?s?u?d?d?d?l?s?s +?s?u?d?d?d?u?d?l +?s?u?d?d?d?u?l?d +?s?u?d?d?d?u?l?l +?s?u?d?d?d?u?l?u +?s?u?d?d?d?u?l?s +?s?u?d?d?d?u?u?l +?s?u?d?d?d?u?s?l +?s?u?d?d?d?s?d?l +?s?u?d?d?d?s?l?d +?s?u?d?d?d?s?l?l +?s?u?d?d?d?s?l?u +?s?u?d?d?d?s?l?s +?s?u?d?d?d?s?u?l +?s?u?d?d?d?s?s?l +?s?u?d?d?l?d?d?d +?s?u?d?d?l?d?d?l +?s?u?d?d?l?d?d?u +?s?u?d?d?l?d?d?s +?s?u?d?d?l?d?l?d +?s?u?d?d?l?d?l?l +?s?u?d?d?l?d?l?u +?s?u?d?d?l?d?l?s +?s?u?d?d?l?d?u?d +?s?u?d?d?l?d?u?l +?s?u?d?d?l?d?u?u +?s?u?d?d?l?d?u?s +?s?u?d?d?l?d?s?d +?s?u?d?d?l?d?s?l +?s?u?d?d?l?d?s?u +?s?u?d?d?l?d?s?s +?s?u?d?d?l?l?d?d +?s?u?d?d?l?l?d?l +?s?u?d?d?l?l?d?u +?s?u?d?d?l?l?d?s +?s?u?d?d?l?l?l?d +?s?u?d?d?l?l?l?l +?s?u?d?d?l?l?l?u +?s?u?d?d?l?l?l?s +?s?u?d?d?l?l?u?d +?s?u?d?d?l?l?u?l +?s?u?d?d?l?l?u?u +?s?u?d?d?l?l?u?s +?s?u?d?d?l?l?s?d +?s?u?d?d?l?l?s?l +?s?u?d?d?l?l?s?u +?s?u?d?d?l?l?s?s +?s?u?d?d?l?u?d?d +?s?u?d?d?l?u?d?l +?s?u?d?d?l?u?d?u +?s?u?d?d?l?u?d?s +?s?u?d?d?l?u?l?d +?s?u?d?d?l?u?l?l +?s?u?d?d?l?u?l?u +?s?u?d?d?l?u?l?s +?s?u?d?d?l?u?u?d +?s?u?d?d?l?u?u?l +?s?u?d?d?l?u?u?u +?s?u?d?d?l?u?u?s +?s?u?d?d?l?u?s?d +?s?u?d?d?l?u?s?l +?s?u?d?d?l?u?s?u +?s?u?d?d?l?u?s?s +?s?u?d?d?l?s?d?d +?s?u?d?d?l?s?d?l +?s?u?d?d?l?s?d?u +?s?u?d?d?l?s?d?s +?s?u?d?d?l?s?l?d +?s?u?d?d?l?s?l?l +?s?u?d?d?l?s?l?u +?s?u?d?d?l?s?l?s +?s?u?d?d?l?s?u?d +?s?u?d?d?l?s?u?l +?s?u?d?d?l?s?u?u +?s?u?d?d?l?s?u?s +?s?u?d?d?l?s?s?d +?s?u?d?d?l?s?s?l +?s?u?d?d?l?s?s?u +?s?u?d?d?l?s?s?s +?s?u?d?d?u?d?d?l +?s?u?d?d?u?d?l?d +?s?u?d?d?u?d?l?l +?s?u?d?d?u?d?l?u +?s?u?d?d?u?d?l?s +?s?u?d?d?u?d?u?l +?s?u?d?d?u?d?s?l +?s?u?d?d?u?l?d?d +?s?u?d?d?u?l?d?l +?s?u?d?d?u?l?d?u +?s?u?d?d?u?l?d?s +?s?u?d?d?u?l?l?d +?s?u?d?d?u?l?l?l +?s?u?d?d?u?l?l?u +?s?u?d?d?u?l?l?s +?s?u?d?d?u?l?u?d +?s?u?d?d?u?l?u?l +?s?u?d?d?u?l?u?u +?s?u?d?d?u?l?u?s +?s?u?d?d?u?l?s?d +?s?u?d?d?u?l?s?l +?s?u?d?d?u?l?s?u +?s?u?d?d?u?l?s?s +?s?u?d?d?u?u?d?l +?s?u?d?d?u?u?l?d +?s?u?d?d?u?u?l?l +?s?u?d?d?u?u?l?u +?s?u?d?d?u?u?l?s +?s?u?d?d?u?u?u?l +?s?u?d?d?u?u?s?l +?s?u?d?d?u?s?d?l +?s?u?d?d?u?s?l?d +?s?u?d?d?u?s?l?l +?s?u?d?d?u?s?l?u +?s?u?d?d?u?s?l?s +?s?u?d?d?u?s?u?l +?s?u?d?d?u?s?s?l +?s?u?d?d?s?d?d?l +?s?u?d?d?s?d?l?d +?s?u?d?d?s?d?l?l +?s?u?d?d?s?d?l?u +?s?u?d?d?s?d?l?s +?s?u?d?d?s?d?u?l +?s?u?d?d?s?d?s?l +?s?u?d?d?s?l?d?d +?s?u?d?d?s?l?d?l +?s?u?d?d?s?l?d?u +?s?u?d?d?s?l?d?s +?s?u?d?d?s?l?l?d +?s?u?d?d?s?l?l?l +?s?u?d?d?s?l?l?u +?s?u?d?d?s?l?l?s +?s?u?d?d?s?l?u?d +?s?u?d?d?s?l?u?l +?s?u?d?d?s?l?u?u +?s?u?d?d?s?l?u?s +?s?u?d?d?s?l?s?d +?s?u?d?d?s?l?s?l +?s?u?d?d?s?l?s?u +?s?u?d?d?s?l?s?s +?s?u?d?d?s?u?d?l +?s?u?d?d?s?u?l?d +?s?u?d?d?s?u?l?l +?s?u?d?d?s?u?l?u +?s?u?d?d?s?u?l?s +?s?u?d?d?s?u?u?l +?s?u?d?d?s?u?s?l +?s?u?d?d?s?s?d?l +?s?u?d?d?s?s?l?d +?s?u?d?d?s?s?l?l +?s?u?d?d?s?s?l?u +?s?u?d?d?s?s?l?s +?s?u?d?d?s?s?u?l +?s?u?d?d?s?s?s?l +?s?u?d?l?d?d?d?d +?s?u?d?l?d?d?d?l +?s?u?d?l?d?d?d?u +?s?u?d?l?d?d?d?s +?s?u?d?l?d?d?l?d +?s?u?d?l?d?d?l?l +?s?u?d?l?d?d?l?u +?s?u?d?l?d?d?l?s +?s?u?d?l?d?d?u?d +?s?u?d?l?d?d?u?l +?s?u?d?l?d?d?u?u +?s?u?d?l?d?d?u?s +?s?u?d?l?d?d?s?d +?s?u?d?l?d?d?s?l +?s?u?d?l?d?d?s?u +?s?u?d?l?d?d?s?s +?s?u?d?l?d?l?d?d +?s?u?d?l?d?l?d?l +?s?u?d?l?d?l?d?u +?s?u?d?l?d?l?d?s +?s?u?d?l?d?l?l?d +?s?u?d?l?d?l?l?l +?s?u?d?l?d?l?l?u +?s?u?d?l?d?l?l?s +?s?u?d?l?d?l?u?d +?s?u?d?l?d?l?u?l +?s?u?d?l?d?l?u?u +?s?u?d?l?d?l?u?s +?s?u?d?l?d?l?s?d +?s?u?d?l?d?l?s?l +?s?u?d?l?d?l?s?u +?s?u?d?l?d?l?s?s +?s?u?d?l?d?u?d?d +?s?u?d?l?d?u?d?l +?s?u?d?l?d?u?d?u +?s?u?d?l?d?u?d?s +?s?u?d?l?d?u?l?d +?s?u?d?l?d?u?l?l +?s?u?d?l?d?u?l?u +?s?u?d?l?d?u?l?s +?s?u?d?l?d?u?u?d +?s?u?d?l?d?u?u?l +?s?u?d?l?d?u?u?u +?s?u?d?l?d?u?u?s +?s?u?d?l?d?u?s?d +?s?u?d?l?d?u?s?l +?s?u?d?l?d?u?s?u +?s?u?d?l?d?u?s?s +?s?u?d?l?d?s?d?d +?s?u?d?l?d?s?d?l +?s?u?d?l?d?s?d?u +?s?u?d?l?d?s?d?s +?s?u?d?l?d?s?l?d +?s?u?d?l?d?s?l?l +?s?u?d?l?d?s?l?u +?s?u?d?l?d?s?l?s +?s?u?d?l?d?s?u?d +?s?u?d?l?d?s?u?l +?s?u?d?l?d?s?u?u +?s?u?d?l?d?s?u?s +?s?u?d?l?d?s?s?d +?s?u?d?l?d?s?s?l +?s?u?d?l?d?s?s?u +?s?u?d?l?d?s?s?s +?s?u?d?l?l?d?d?d +?s?u?d?l?l?d?d?l +?s?u?d?l?l?d?d?u +?s?u?d?l?l?d?d?s +?s?u?d?l?l?d?l?d +?s?u?d?l?l?d?l?l +?s?u?d?l?l?d?l?u +?s?u?d?l?l?d?l?s +?s?u?d?l?l?d?u?d +?s?u?d?l?l?d?u?l +?s?u?d?l?l?d?u?u +?s?u?d?l?l?d?u?s +?s?u?d?l?l?d?s?d +?s?u?d?l?l?d?s?l +?s?u?d?l?l?d?s?u +?s?u?d?l?l?d?s?s +?s?u?d?l?l?l?d?d +?s?u?d?l?l?l?d?l +?s?u?d?l?l?l?d?u +?s?u?d?l?l?l?d?s +?s?u?d?l?l?l?l?d +?s?u?d?l?l?l?l?l +?s?u?d?l?l?l?l?u +?s?u?d?l?l?l?l?s +?s?u?d?l?l?l?u?d +?s?u?d?l?l?l?u?l +?s?u?d?l?l?l?u?u +?s?u?d?l?l?l?u?s +?s?u?d?l?l?l?s?d +?s?u?d?l?l?l?s?l +?s?u?d?l?l?l?s?u +?s?u?d?l?l?l?s?s +?s?u?d?l?l?u?d?d +?s?u?d?l?l?u?d?l +?s?u?d?l?l?u?d?u +?s?u?d?l?l?u?d?s +?s?u?d?l?l?u?l?d +?s?u?d?l?l?u?l?l +?s?u?d?l?l?u?l?u +?s?u?d?l?l?u?l?s +?s?u?d?l?l?u?u?d +?s?u?d?l?l?u?u?l +?s?u?d?l?l?u?u?u +?s?u?d?l?l?u?u?s +?s?u?d?l?l?u?s?d +?s?u?d?l?l?u?s?l +?s?u?d?l?l?u?s?u +?s?u?d?l?l?u?s?s +?s?u?d?l?l?s?d?d +?s?u?d?l?l?s?d?l +?s?u?d?l?l?s?d?u +?s?u?d?l?l?s?d?s +?s?u?d?l?l?s?l?d +?s?u?d?l?l?s?l?l +?s?u?d?l?l?s?l?u +?s?u?d?l?l?s?l?s +?s?u?d?l?l?s?u?d +?s?u?d?l?l?s?u?l +?s?u?d?l?l?s?u?u +?s?u?d?l?l?s?u?s +?s?u?d?l?l?s?s?d +?s?u?d?l?l?s?s?l +?s?u?d?l?l?s?s?u +?s?u?d?l?l?s?s?s +?s?u?d?l?u?d?d?d +?s?u?d?l?u?d?d?l +?s?u?d?l?u?d?d?u +?s?u?d?l?u?d?d?s +?s?u?d?l?u?d?l?d +?s?u?d?l?u?d?l?l +?s?u?d?l?u?d?l?u +?s?u?d?l?u?d?l?s +?s?u?d?l?u?d?u?d +?s?u?d?l?u?d?u?l +?s?u?d?l?u?d?u?u +?s?u?d?l?u?d?u?s +?s?u?d?l?u?d?s?d +?s?u?d?l?u?d?s?l +?s?u?d?l?u?d?s?u +?s?u?d?l?u?d?s?s +?s?u?d?l?u?l?d?d +?s?u?d?l?u?l?d?l +?s?u?d?l?u?l?d?u +?s?u?d?l?u?l?d?s +?s?u?d?l?u?l?l?d +?s?u?d?l?u?l?l?l +?s?u?d?l?u?l?l?u +?s?u?d?l?u?l?l?s +?s?u?d?l?u?l?u?d +?s?u?d?l?u?l?u?l +?s?u?d?l?u?l?u?u +?s?u?d?l?u?l?u?s +?s?u?d?l?u?l?s?d +?s?u?d?l?u?l?s?l +?s?u?d?l?u?l?s?u +?s?u?d?l?u?l?s?s +?s?u?d?l?u?u?d?d +?s?u?d?l?u?u?d?l +?s?u?d?l?u?u?d?u +?s?u?d?l?u?u?d?s +?s?u?d?l?u?u?l?d +?s?u?d?l?u?u?l?l +?s?u?d?l?u?u?l?u +?s?u?d?l?u?u?l?s +?s?u?d?l?u?u?u?d +?s?u?d?l?u?u?u?l +?s?u?d?l?u?u?u?u +?s?u?d?l?u?u?u?s +?s?u?d?l?u?u?s?d +?s?u?d?l?u?u?s?l +?s?u?d?l?u?u?s?u +?s?u?d?l?u?u?s?s +?s?u?d?l?u?s?d?d +?s?u?d?l?u?s?d?l +?s?u?d?l?u?s?d?u +?s?u?d?l?u?s?d?s +?s?u?d?l?u?s?l?d +?s?u?d?l?u?s?l?l +?s?u?d?l?u?s?l?u +?s?u?d?l?u?s?l?s +?s?u?d?l?u?s?u?d +?s?u?d?l?u?s?u?l +?s?u?d?l?u?s?u?u +?s?u?d?l?u?s?u?s +?s?u?d?l?u?s?s?d +?s?u?d?l?u?s?s?l +?s?u?d?l?u?s?s?u +?s?u?d?l?u?s?s?s +?s?u?d?l?s?d?d?d +?s?u?d?l?s?d?d?l +?s?u?d?l?s?d?d?u +?s?u?d?l?s?d?d?s +?s?u?d?l?s?d?l?d +?s?u?d?l?s?d?l?l +?s?u?d?l?s?d?l?u +?s?u?d?l?s?d?l?s +?s?u?d?l?s?d?u?d +?s?u?d?l?s?d?u?l +?s?u?d?l?s?d?u?u +?s?u?d?l?s?d?u?s +?s?u?d?l?s?d?s?d +?s?u?d?l?s?d?s?l +?s?u?d?l?s?d?s?u +?s?u?d?l?s?d?s?s +?s?u?d?l?s?l?d?d +?s?u?d?l?s?l?d?l +?s?u?d?l?s?l?d?u +?s?u?d?l?s?l?d?s +?s?u?d?l?s?l?l?d +?s?u?d?l?s?l?l?l +?s?u?d?l?s?l?l?u +?s?u?d?l?s?l?l?s +?s?u?d?l?s?l?u?d +?s?u?d?l?s?l?u?l +?s?u?d?l?s?l?u?u +?s?u?d?l?s?l?u?s +?s?u?d?l?s?l?s?d +?s?u?d?l?s?l?s?l +?s?u?d?l?s?l?s?u +?s?u?d?l?s?l?s?s +?s?u?d?l?s?u?d?d +?s?u?d?l?s?u?d?l +?s?u?d?l?s?u?d?u +?s?u?d?l?s?u?d?s +?s?u?d?l?s?u?l?d +?s?u?d?l?s?u?l?l +?s?u?d?l?s?u?l?u +?s?u?d?l?s?u?l?s +?s?u?d?l?s?u?u?d +?s?u?d?l?s?u?u?l +?s?u?d?l?s?u?u?u +?s?u?d?l?s?u?u?s +?s?u?d?l?s?u?s?d +?s?u?d?l?s?u?s?l +?s?u?d?l?s?u?s?u +?s?u?d?l?s?u?s?s +?s?u?d?l?s?s?d?d +?s?u?d?l?s?s?d?l +?s?u?d?l?s?s?d?u +?s?u?d?l?s?s?d?s +?s?u?d?l?s?s?l?d +?s?u?d?l?s?s?l?l +?s?u?d?l?s?s?l?u +?s?u?d?l?s?s?l?s +?s?u?d?l?s?s?u?d +?s?u?d?l?s?s?u?l +?s?u?d?l?s?s?u?u +?s?u?d?l?s?s?u?s +?s?u?d?l?s?s?s?d +?s?u?d?l?s?s?s?l +?s?u?d?l?s?s?s?u +?s?u?d?l?s?s?s?s +?s?u?d?u?d?d?d?l +?s?u?d?u?d?d?l?d +?s?u?d?u?d?d?l?l +?s?u?d?u?d?d?l?u +?s?u?d?u?d?d?l?s +?s?u?d?u?d?d?u?l +?s?u?d?u?d?d?s?l +?s?u?d?u?d?l?d?d +?s?u?d?u?d?l?d?l +?s?u?d?u?d?l?d?u +?s?u?d?u?d?l?d?s +?s?u?d?u?d?l?l?d +?s?u?d?u?d?l?l?l +?s?u?d?u?d?l?l?u +?s?u?d?u?d?l?l?s +?s?u?d?u?d?l?u?d +?s?u?d?u?d?l?u?l +?s?u?d?u?d?l?u?u +?s?u?d?u?d?l?u?s +?s?u?d?u?d?l?s?d +?s?u?d?u?d?l?s?l +?s?u?d?u?d?l?s?u +?s?u?d?u?d?l?s?s +?s?u?d?u?d?u?d?l +?s?u?d?u?d?u?l?d +?s?u?d?u?d?u?l?l +?s?u?d?u?d?u?l?u +?s?u?d?u?d?u?l?s +?s?u?d?u?d?u?u?l +?s?u?d?u?d?u?s?l +?s?u?d?u?d?s?d?l +?s?u?d?u?d?s?l?d +?s?u?d?u?d?s?l?l +?s?u?d?u?d?s?l?u +?s?u?d?u?d?s?l?s +?s?u?d?u?d?s?u?l +?s?u?d?u?d?s?s?l +?s?u?d?u?l?d?d?d +?s?u?d?u?l?d?d?l +?s?u?d?u?l?d?d?u +?s?u?d?u?l?d?d?s +?s?u?d?u?l?d?l?d +?s?u?d?u?l?d?l?l +?s?u?d?u?l?d?l?u +?s?u?d?u?l?d?l?s +?s?u?d?u?l?d?u?d +?s?u?d?u?l?d?u?l +?s?u?d?u?l?d?u?u +?s?u?d?u?l?d?u?s +?s?u?d?u?l?d?s?d +?s?u?d?u?l?d?s?l +?s?u?d?u?l?d?s?u +?s?u?d?u?l?d?s?s +?s?u?d?u?l?l?d?d +?s?u?d?u?l?l?d?l +?s?u?d?u?l?l?d?u +?s?u?d?u?l?l?d?s +?s?u?d?u?l?l?l?d +?s?u?d?u?l?l?l?l +?s?u?d?u?l?l?l?u +?s?u?d?u?l?l?l?s +?s?u?d?u?l?l?u?d +?s?u?d?u?l?l?u?l +?s?u?d?u?l?l?u?u +?s?u?d?u?l?l?u?s +?s?u?d?u?l?l?s?d +?s?u?d?u?l?l?s?l +?s?u?d?u?l?l?s?u +?s?u?d?u?l?l?s?s +?s?u?d?u?l?u?d?d +?s?u?d?u?l?u?d?l +?s?u?d?u?l?u?d?u +?s?u?d?u?l?u?d?s +?s?u?d?u?l?u?l?d +?s?u?d?u?l?u?l?l +?s?u?d?u?l?u?l?u +?s?u?d?u?l?u?l?s +?s?u?d?u?l?u?u?d +?s?u?d?u?l?u?u?l +?s?u?d?u?l?u?u?u +?s?u?d?u?l?u?u?s +?s?u?d?u?l?u?s?d +?s?u?d?u?l?u?s?l +?s?u?d?u?l?u?s?u +?s?u?d?u?l?u?s?s +?s?u?d?u?l?s?d?d +?s?u?d?u?l?s?d?l +?s?u?d?u?l?s?d?u +?s?u?d?u?l?s?d?s +?s?u?d?u?l?s?l?d +?s?u?d?u?l?s?l?l +?s?u?d?u?l?s?l?u +?s?u?d?u?l?s?l?s +?s?u?d?u?l?s?u?d +?s?u?d?u?l?s?u?l +?s?u?d?u?l?s?u?u +?s?u?d?u?l?s?u?s +?s?u?d?u?l?s?s?d +?s?u?d?u?l?s?s?l +?s?u?d?u?l?s?s?u +?s?u?d?u?l?s?s?s +?s?u?d?u?u?d?d?l +?s?u?d?u?u?d?l?d +?s?u?d?u?u?d?l?l +?s?u?d?u?u?d?l?u +?s?u?d?u?u?d?l?s +?s?u?d?u?u?d?u?l +?s?u?d?u?u?d?s?l +?s?u?d?u?u?l?d?d +?s?u?d?u?u?l?d?l +?s?u?d?u?u?l?d?u +?s?u?d?u?u?l?d?s +?s?u?d?u?u?l?l?d +?s?u?d?u?u?l?l?l +?s?u?d?u?u?l?l?u +?s?u?d?u?u?l?l?s +?s?u?d?u?u?l?u?d +?s?u?d?u?u?l?u?l +?s?u?d?u?u?l?u?u +?s?u?d?u?u?l?u?s +?s?u?d?u?u?l?s?d +?s?u?d?u?u?l?s?l +?s?u?d?u?u?l?s?u +?s?u?d?u?u?l?s?s +?s?u?d?u?u?u?d?l +?s?u?d?u?u?u?l?d +?s?u?d?u?u?u?l?l +?s?u?d?u?u?u?l?u +?s?u?d?u?u?u?l?s +?s?u?d?u?u?u?u?l +?s?u?d?u?u?u?s?l +?s?u?d?u?u?s?d?l +?s?u?d?u?u?s?l?d +?s?u?d?u?u?s?l?l +?s?u?d?u?u?s?l?u +?s?u?d?u?u?s?l?s +?s?u?d?u?u?s?u?l +?s?u?d?u?u?s?s?l +?s?u?d?u?s?d?d?l +?s?u?d?u?s?d?l?d +?s?u?d?u?s?d?l?l +?s?u?d?u?s?d?l?u +?s?u?d?u?s?d?l?s +?s?u?d?u?s?d?u?l +?s?u?d?u?s?d?s?l +?s?u?d?u?s?l?d?d +?s?u?d?u?s?l?d?l +?s?u?d?u?s?l?d?u +?s?u?d?u?s?l?d?s +?s?u?d?u?s?l?l?d +?s?u?d?u?s?l?l?l +?s?u?d?u?s?l?l?u +?s?u?d?u?s?l?l?s +?s?u?d?u?s?l?u?d +?s?u?d?u?s?l?u?l +?s?u?d?u?s?l?u?u +?s?u?d?u?s?l?u?s +?s?u?d?u?s?l?s?d +?s?u?d?u?s?l?s?l +?s?u?d?u?s?l?s?u +?s?u?d?u?s?l?s?s +?s?u?d?u?s?u?d?l +?s?u?d?u?s?u?l?d +?s?u?d?u?s?u?l?l +?s?u?d?u?s?u?l?u +?s?u?d?u?s?u?l?s +?s?u?d?u?s?u?u?l +?s?u?d?u?s?u?s?l +?s?u?d?u?s?s?d?l +?s?u?d?u?s?s?l?d +?s?u?d?u?s?s?l?l +?s?u?d?u?s?s?l?u +?s?u?d?u?s?s?l?s +?s?u?d?u?s?s?u?l +?s?u?d?u?s?s?s?l +?s?u?d?s?d?d?d?l +?s?u?d?s?d?d?l?d +?s?u?d?s?d?d?l?l +?s?u?d?s?d?d?l?u +?s?u?d?s?d?d?l?s +?s?u?d?s?d?d?u?l +?s?u?d?s?d?d?s?l +?s?u?d?s?d?l?d?d +?s?u?d?s?d?l?d?l +?s?u?d?s?d?l?d?u +?s?u?d?s?d?l?d?s +?s?u?d?s?d?l?l?d +?s?u?d?s?d?l?l?l +?s?u?d?s?d?l?l?u +?s?u?d?s?d?l?l?s +?s?u?d?s?d?l?u?d +?s?u?d?s?d?l?u?l +?s?u?d?s?d?l?u?u +?s?u?d?s?d?l?u?s +?s?u?d?s?d?l?s?d +?s?u?d?s?d?l?s?l +?s?u?d?s?d?l?s?u +?s?u?d?s?d?l?s?s +?s?u?d?s?d?u?d?l +?s?u?d?s?d?u?l?d +?s?u?d?s?d?u?l?l +?s?u?d?s?d?u?l?u +?s?u?d?s?d?u?l?s +?s?u?d?s?d?u?u?l +?s?u?d?s?d?u?s?l +?s?u?d?s?d?s?d?l +?s?u?d?s?d?s?l?d +?s?u?d?s?d?s?l?l +?s?u?d?s?d?s?l?u +?s?u?d?s?d?s?l?s +?s?u?d?s?d?s?u?l +?s?u?d?s?d?s?s?l +?s?u?d?s?l?d?d?d +?s?u?d?s?l?d?d?l +?s?u?d?s?l?d?d?u +?s?u?d?s?l?d?d?s +?s?u?d?s?l?d?l?d +?s?u?d?s?l?d?l?l +?s?u?d?s?l?d?l?u +?s?u?d?s?l?d?l?s +?s?u?d?s?l?d?u?d +?s?u?d?s?l?d?u?l +?s?u?d?s?l?d?u?u +?s?u?d?s?l?d?u?s +?s?u?d?s?l?d?s?d +?s?u?d?s?l?d?s?l +?s?u?d?s?l?d?s?u +?s?u?d?s?l?d?s?s +?s?u?d?s?l?l?d?d +?s?u?d?s?l?l?d?l +?s?u?d?s?l?l?d?u +?s?u?d?s?l?l?d?s +?s?u?d?s?l?l?l?d +?s?u?d?s?l?l?l?l +?s?u?d?s?l?l?l?u +?s?u?d?s?l?l?l?s +?s?u?d?s?l?l?u?d +?s?u?d?s?l?l?u?l +?s?u?d?s?l?l?u?u +?s?u?d?s?l?l?u?s +?s?u?d?s?l?l?s?d +?s?u?d?s?l?l?s?l +?s?u?d?s?l?l?s?u +?s?u?d?s?l?l?s?s +?s?u?d?s?l?u?d?d +?s?u?d?s?l?u?d?l +?s?u?d?s?l?u?d?u +?s?u?d?s?l?u?d?s +?s?u?d?s?l?u?l?d +?s?u?d?s?l?u?l?l +?s?u?d?s?l?u?l?u +?s?u?d?s?l?u?l?s +?s?u?d?s?l?u?u?d +?s?u?d?s?l?u?u?l +?s?u?d?s?l?u?u?u +?s?u?d?s?l?u?u?s +?s?u?d?s?l?u?s?d +?s?u?d?s?l?u?s?l +?s?u?d?s?l?u?s?u +?s?u?d?s?l?u?s?s +?s?u?d?s?l?s?d?d +?s?u?d?s?l?s?d?l +?s?u?d?s?l?s?d?u +?s?u?d?s?l?s?d?s +?s?u?d?s?l?s?l?d +?s?u?d?s?l?s?l?l +?s?u?d?s?l?s?l?u +?s?u?d?s?l?s?l?s +?s?u?d?s?l?s?u?d +?s?u?d?s?l?s?u?l +?s?u?d?s?l?s?u?u +?s?u?d?s?l?s?u?s +?s?u?d?s?l?s?s?d +?s?u?d?s?l?s?s?l +?s?u?d?s?l?s?s?u +?s?u?d?s?l?s?s?s +?s?u?d?s?u?d?d?l +?s?u?d?s?u?d?l?d +?s?u?d?s?u?d?l?l +?s?u?d?s?u?d?l?u +?s?u?d?s?u?d?l?s +?s?u?d?s?u?d?u?l +?s?u?d?s?u?d?s?l +?s?u?d?s?u?l?d?d +?s?u?d?s?u?l?d?l +?s?u?d?s?u?l?d?u +?s?u?d?s?u?l?d?s +?s?u?d?s?u?l?l?d +?s?u?d?s?u?l?l?l +?s?u?d?s?u?l?l?u +?s?u?d?s?u?l?l?s +?s?u?d?s?u?l?u?d +?s?u?d?s?u?l?u?l +?s?u?d?s?u?l?u?u +?s?u?d?s?u?l?u?s +?s?u?d?s?u?l?s?d +?s?u?d?s?u?l?s?l +?s?u?d?s?u?l?s?u +?s?u?d?s?u?l?s?s +?s?u?d?s?u?u?d?l +?s?u?d?s?u?u?l?d +?s?u?d?s?u?u?l?l +?s?u?d?s?u?u?l?u +?s?u?d?s?u?u?l?s +?s?u?d?s?u?u?u?l +?s?u?d?s?u?u?s?l +?s?u?d?s?u?s?d?l +?s?u?d?s?u?s?l?d +?s?u?d?s?u?s?l?l +?s?u?d?s?u?s?l?u +?s?u?d?s?u?s?l?s +?s?u?d?s?u?s?u?l +?s?u?d?s?u?s?s?l +?s?u?d?s?s?d?d?l +?s?u?d?s?s?d?l?d +?s?u?d?s?s?d?l?l +?s?u?d?s?s?d?l?u +?s?u?d?s?s?d?l?s +?s?u?d?s?s?d?u?l +?s?u?d?s?s?d?s?l +?s?u?d?s?s?l?d?d +?s?u?d?s?s?l?d?l +?s?u?d?s?s?l?d?u +?s?u?d?s?s?l?d?s +?s?u?d?s?s?l?l?d +?s?u?d?s?s?l?l?l +?s?u?d?s?s?l?l?u +?s?u?d?s?s?l?l?s +?s?u?d?s?s?l?u?d +?s?u?d?s?s?l?u?l +?s?u?d?s?s?l?u?u +?s?u?d?s?s?l?u?s +?s?u?d?s?s?l?s?d +?s?u?d?s?s?l?s?l +?s?u?d?s?s?l?s?u +?s?u?d?s?s?l?s?s +?s?u?d?s?s?u?d?l +?s?u?d?s?s?u?l?d +?s?u?d?s?s?u?l?l +?s?u?d?s?s?u?l?u +?s?u?d?s?s?u?l?s +?s?u?d?s?s?u?u?l +?s?u?d?s?s?u?s?l +?s?u?d?s?s?s?d?l +?s?u?d?s?s?s?l?d +?s?u?d?s?s?s?l?l +?s?u?d?s?s?s?l?u +?s?u?d?s?s?s?l?s +?s?u?d?s?s?s?u?l +?s?u?d?s?s?s?s?l +?s?u?l?d?d?d?d?d +?s?u?l?d?d?d?d?l +?s?u?l?d?d?d?d?u +?s?u?l?d?d?d?d?s +?s?u?l?d?d?d?l?d +?s?u?l?d?d?d?l?l +?s?u?l?d?d?d?l?u +?s?u?l?d?d?d?l?s +?s?u?l?d?d?d?u?d +?s?u?l?d?d?d?u?l +?s?u?l?d?d?d?u?u +?s?u?l?d?d?d?u?s +?s?u?l?d?d?d?s?d +?s?u?l?d?d?d?s?l +?s?u?l?d?d?d?s?u +?s?u?l?d?d?d?s?s +?s?u?l?d?d?l?d?d +?s?u?l?d?d?l?d?l +?s?u?l?d?d?l?d?u +?s?u?l?d?d?l?d?s +?s?u?l?d?d?l?l?d +?s?u?l?d?d?l?l?l +?s?u?l?d?d?l?l?u +?s?u?l?d?d?l?l?s +?s?u?l?d?d?l?u?d +?s?u?l?d?d?l?u?l +?s?u?l?d?d?l?u?u +?s?u?l?d?d?l?u?s +?s?u?l?d?d?l?s?d +?s?u?l?d?d?l?s?l +?s?u?l?d?d?l?s?u +?s?u?l?d?d?l?s?s +?s?u?l?d?d?u?d?d +?s?u?l?d?d?u?d?l +?s?u?l?d?d?u?d?u +?s?u?l?d?d?u?d?s +?s?u?l?d?d?u?l?d +?s?u?l?d?d?u?l?l +?s?u?l?d?d?u?l?u +?s?u?l?d?d?u?l?s +?s?u?l?d?d?u?u?d +?s?u?l?d?d?u?u?l +?s?u?l?d?d?u?u?u +?s?u?l?d?d?u?u?s +?s?u?l?d?d?u?s?d +?s?u?l?d?d?u?s?l +?s?u?l?d?d?u?s?u +?s?u?l?d?d?u?s?s +?s?u?l?d?d?s?d?d +?s?u?l?d?d?s?d?l +?s?u?l?d?d?s?d?u +?s?u?l?d?d?s?d?s +?s?u?l?d?d?s?l?d +?s?u?l?d?d?s?l?l +?s?u?l?d?d?s?l?u +?s?u?l?d?d?s?l?s +?s?u?l?d?d?s?u?d +?s?u?l?d?d?s?u?l +?s?u?l?d?d?s?u?u +?s?u?l?d?d?s?u?s +?s?u?l?d?d?s?s?d +?s?u?l?d?d?s?s?l +?s?u?l?d?d?s?s?u +?s?u?l?d?d?s?s?s +?s?u?l?d?l?d?d?d +?s?u?l?d?l?d?d?l +?s?u?l?d?l?d?d?u +?s?u?l?d?l?d?d?s +?s?u?l?d?l?d?l?d +?s?u?l?d?l?d?l?l +?s?u?l?d?l?d?l?u +?s?u?l?d?l?d?l?s +?s?u?l?d?l?d?u?d +?s?u?l?d?l?d?u?l +?s?u?l?d?l?d?u?u +?s?u?l?d?l?d?u?s +?s?u?l?d?l?d?s?d +?s?u?l?d?l?d?s?l +?s?u?l?d?l?d?s?u +?s?u?l?d?l?d?s?s +?s?u?l?d?l?l?d?d +?s?u?l?d?l?l?d?l +?s?u?l?d?l?l?d?u +?s?u?l?d?l?l?d?s +?s?u?l?d?l?l?l?d +?s?u?l?d?l?l?l?l +?s?u?l?d?l?l?l?u +?s?u?l?d?l?l?l?s +?s?u?l?d?l?l?u?d +?s?u?l?d?l?l?u?l +?s?u?l?d?l?l?u?u +?s?u?l?d?l?l?u?s +?s?u?l?d?l?l?s?d +?s?u?l?d?l?l?s?l +?s?u?l?d?l?l?s?u +?s?u?l?d?l?l?s?s +?s?u?l?d?l?u?d?d +?s?u?l?d?l?u?d?l +?s?u?l?d?l?u?d?u +?s?u?l?d?l?u?d?s +?s?u?l?d?l?u?l?d +?s?u?l?d?l?u?l?l +?s?u?l?d?l?u?l?u +?s?u?l?d?l?u?l?s +?s?u?l?d?l?u?u?d +?s?u?l?d?l?u?u?l +?s?u?l?d?l?u?u?u +?s?u?l?d?l?u?u?s +?s?u?l?d?l?u?s?d +?s?u?l?d?l?u?s?l +?s?u?l?d?l?u?s?u +?s?u?l?d?l?u?s?s +?s?u?l?d?l?s?d?d +?s?u?l?d?l?s?d?l +?s?u?l?d?l?s?d?u +?s?u?l?d?l?s?d?s +?s?u?l?d?l?s?l?d +?s?u?l?d?l?s?l?l +?s?u?l?d?l?s?l?u +?s?u?l?d?l?s?l?s +?s?u?l?d?l?s?u?d +?s?u?l?d?l?s?u?l +?s?u?l?d?l?s?u?u +?s?u?l?d?l?s?u?s +?s?u?l?d?l?s?s?d +?s?u?l?d?l?s?s?l +?s?u?l?d?l?s?s?u +?s?u?l?d?l?s?s?s +?s?u?l?d?u?d?d?d +?s?u?l?d?u?d?d?l +?s?u?l?d?u?d?d?u +?s?u?l?d?u?d?d?s +?s?u?l?d?u?d?l?d +?s?u?l?d?u?d?l?l +?s?u?l?d?u?d?l?u +?s?u?l?d?u?d?l?s +?s?u?l?d?u?d?u?d +?s?u?l?d?u?d?u?l +?s?u?l?d?u?d?u?u +?s?u?l?d?u?d?u?s +?s?u?l?d?u?d?s?d +?s?u?l?d?u?d?s?l +?s?u?l?d?u?d?s?u +?s?u?l?d?u?d?s?s +?s?u?l?d?u?l?d?d +?s?u?l?d?u?l?d?l +?s?u?l?d?u?l?d?u +?s?u?l?d?u?l?d?s +?s?u?l?d?u?l?l?d +?s?u?l?d?u?l?l?l +?s?u?l?d?u?l?l?u +?s?u?l?d?u?l?l?s +?s?u?l?d?u?l?u?d +?s?u?l?d?u?l?u?l +?s?u?l?d?u?l?u?u +?s?u?l?d?u?l?u?s +?s?u?l?d?u?l?s?d +?s?u?l?d?u?l?s?l +?s?u?l?d?u?l?s?u +?s?u?l?d?u?l?s?s +?s?u?l?d?u?u?d?d +?s?u?l?d?u?u?d?l +?s?u?l?d?u?u?d?u +?s?u?l?d?u?u?d?s +?s?u?l?d?u?u?l?d +?s?u?l?d?u?u?l?l +?s?u?l?d?u?u?l?u +?s?u?l?d?u?u?l?s +?s?u?l?d?u?u?u?d +?s?u?l?d?u?u?u?l +?s?u?l?d?u?u?u?u +?s?u?l?d?u?u?u?s +?s?u?l?d?u?u?s?d +?s?u?l?d?u?u?s?l +?s?u?l?d?u?u?s?u +?s?u?l?d?u?u?s?s +?s?u?l?d?u?s?d?d +?s?u?l?d?u?s?d?l +?s?u?l?d?u?s?d?u +?s?u?l?d?u?s?d?s +?s?u?l?d?u?s?l?d +?s?u?l?d?u?s?l?l +?s?u?l?d?u?s?l?u +?s?u?l?d?u?s?l?s +?s?u?l?d?u?s?u?d +?s?u?l?d?u?s?u?l +?s?u?l?d?u?s?u?u +?s?u?l?d?u?s?u?s +?s?u?l?d?u?s?s?d +?s?u?l?d?u?s?s?l +?s?u?l?d?u?s?s?u +?s?u?l?d?u?s?s?s +?s?u?l?d?s?d?d?d +?s?u?l?d?s?d?d?l +?s?u?l?d?s?d?d?u +?s?u?l?d?s?d?d?s +?s?u?l?d?s?d?l?d +?s?u?l?d?s?d?l?l +?s?u?l?d?s?d?l?u +?s?u?l?d?s?d?l?s +?s?u?l?d?s?d?u?d +?s?u?l?d?s?d?u?l +?s?u?l?d?s?d?u?u +?s?u?l?d?s?d?u?s +?s?u?l?d?s?d?s?d +?s?u?l?d?s?d?s?l +?s?u?l?d?s?d?s?u +?s?u?l?d?s?d?s?s +?s?u?l?d?s?l?d?d +?s?u?l?d?s?l?d?l +?s?u?l?d?s?l?d?u +?s?u?l?d?s?l?d?s +?s?u?l?d?s?l?l?d +?s?u?l?d?s?l?l?l +?s?u?l?d?s?l?l?u +?s?u?l?d?s?l?l?s +?s?u?l?d?s?l?u?d +?s?u?l?d?s?l?u?l +?s?u?l?d?s?l?u?u +?s?u?l?d?s?l?u?s +?s?u?l?d?s?l?s?d +?s?u?l?d?s?l?s?l +?s?u?l?d?s?l?s?u +?s?u?l?d?s?l?s?s +?s?u?l?d?s?u?d?d +?s?u?l?d?s?u?d?l +?s?u?l?d?s?u?d?u +?s?u?l?d?s?u?d?s +?s?u?l?d?s?u?l?d +?s?u?l?d?s?u?l?l +?s?u?l?d?s?u?l?u +?s?u?l?d?s?u?l?s +?s?u?l?d?s?u?u?d +?s?u?l?d?s?u?u?l +?s?u?l?d?s?u?u?u +?s?u?l?d?s?u?u?s +?s?u?l?d?s?u?s?d +?s?u?l?d?s?u?s?l +?s?u?l?d?s?u?s?u +?s?u?l?d?s?u?s?s +?s?u?l?d?s?s?d?d +?s?u?l?d?s?s?d?l +?s?u?l?d?s?s?d?u +?s?u?l?d?s?s?d?s +?s?u?l?d?s?s?l?d +?s?u?l?d?s?s?l?l +?s?u?l?d?s?s?l?u +?s?u?l?d?s?s?l?s +?s?u?l?d?s?s?u?d +?s?u?l?d?s?s?u?l +?s?u?l?d?s?s?u?u +?s?u?l?d?s?s?u?s +?s?u?l?d?s?s?s?d +?s?u?l?d?s?s?s?l +?s?u?l?d?s?s?s?u +?s?u?l?d?s?s?s?s +?s?u?l?l?d?d?d?d +?s?u?l?l?d?d?d?l +?s?u?l?l?d?d?d?u +?s?u?l?l?d?d?d?s +?s?u?l?l?d?d?l?d +?s?u?l?l?d?d?l?l +?s?u?l?l?d?d?l?u +?s?u?l?l?d?d?l?s +?s?u?l?l?d?d?u?d +?s?u?l?l?d?d?u?l +?s?u?l?l?d?d?u?u +?s?u?l?l?d?d?u?s +?s?u?l?l?d?d?s?d +?s?u?l?l?d?d?s?l +?s?u?l?l?d?d?s?u +?s?u?l?l?d?d?s?s +?s?u?l?l?d?l?d?d +?s?u?l?l?d?l?d?l +?s?u?l?l?d?l?d?u +?s?u?l?l?d?l?d?s +?s?u?l?l?d?l?l?d +?s?u?l?l?d?l?l?l +?s?u?l?l?d?l?l?u +?s?u?l?l?d?l?l?s +?s?u?l?l?d?l?u?d +?s?u?l?l?d?l?u?l +?s?u?l?l?d?l?u?u +?s?u?l?l?d?l?u?s +?s?u?l?l?d?l?s?d +?s?u?l?l?d?l?s?l +?s?u?l?l?d?l?s?u +?s?u?l?l?d?l?s?s +?s?u?l?l?d?u?d?d +?s?u?l?l?d?u?d?l +?s?u?l?l?d?u?d?u +?s?u?l?l?d?u?d?s +?s?u?l?l?d?u?l?d +?s?u?l?l?d?u?l?l +?s?u?l?l?d?u?l?u +?s?u?l?l?d?u?l?s +?s?u?l?l?d?u?u?d +?s?u?l?l?d?u?u?l +?s?u?l?l?d?u?u?u +?s?u?l?l?d?u?u?s +?s?u?l?l?d?u?s?d +?s?u?l?l?d?u?s?l +?s?u?l?l?d?u?s?u +?s?u?l?l?d?u?s?s +?s?u?l?l?d?s?d?d +?s?u?l?l?d?s?d?l +?s?u?l?l?d?s?d?u +?s?u?l?l?d?s?d?s +?s?u?l?l?d?s?l?d +?s?u?l?l?d?s?l?l +?s?u?l?l?d?s?l?u +?s?u?l?l?d?s?l?s +?s?u?l?l?d?s?u?d +?s?u?l?l?d?s?u?l +?s?u?l?l?d?s?u?u +?s?u?l?l?d?s?u?s +?s?u?l?l?d?s?s?d +?s?u?l?l?d?s?s?l +?s?u?l?l?d?s?s?u +?s?u?l?l?d?s?s?s +?s?u?l?l?l?d?d?d +?s?u?l?l?l?d?d?l +?s?u?l?l?l?d?d?u +?s?u?l?l?l?d?d?s +?s?u?l?l?l?d?l?d +?s?u?l?l?l?d?l?l +?s?u?l?l?l?d?l?u +?s?u?l?l?l?d?l?s +?s?u?l?l?l?d?u?d +?s?u?l?l?l?d?u?l +?s?u?l?l?l?d?u?u +?s?u?l?l?l?d?u?s +?s?u?l?l?l?d?s?d +?s?u?l?l?l?d?s?l +?s?u?l?l?l?d?s?u +?s?u?l?l?l?d?s?s +?s?u?l?l?l?l?d?d +?s?u?l?l?l?l?d?l +?s?u?l?l?l?l?d?u +?s?u?l?l?l?l?d?s +?s?u?l?l?l?l?l?d +?s?u?l?l?l?l?u?d +?s?u?l?l?l?l?s?d +?s?u?l?l?l?u?d?d +?s?u?l?l?l?u?d?l +?s?u?l?l?l?u?d?u +?s?u?l?l?l?u?d?s +?s?u?l?l?l?u?l?d +?s?u?l?l?l?u?u?d +?s?u?l?l?l?u?s?d +?s?u?l?l?l?s?d?d +?s?u?l?l?l?s?d?l +?s?u?l?l?l?s?d?u +?s?u?l?l?l?s?d?s +?s?u?l?l?l?s?l?d +?s?u?l?l?l?s?u?d +?s?u?l?l?l?s?s?d +?s?u?l?l?u?d?d?d +?s?u?l?l?u?d?d?l +?s?u?l?l?u?d?d?u +?s?u?l?l?u?d?d?s +?s?u?l?l?u?d?l?d +?s?u?l?l?u?d?l?l +?s?u?l?l?u?d?l?u +?s?u?l?l?u?d?l?s +?s?u?l?l?u?d?u?d +?s?u?l?l?u?d?u?l +?s?u?l?l?u?d?u?u +?s?u?l?l?u?d?u?s +?s?u?l?l?u?d?s?d +?s?u?l?l?u?d?s?l +?s?u?l?l?u?d?s?u +?s?u?l?l?u?d?s?s +?s?u?l?l?u?l?d?d +?s?u?l?l?u?l?d?l +?s?u?l?l?u?l?d?u +?s?u?l?l?u?l?d?s +?s?u?l?l?u?l?l?d +?s?u?l?l?u?l?u?d +?s?u?l?l?u?l?s?d +?s?u?l?l?u?u?d?d +?s?u?l?l?u?u?d?l +?s?u?l?l?u?u?d?u +?s?u?l?l?u?u?d?s +?s?u?l?l?u?u?l?d +?s?u?l?l?u?u?u?d +?s?u?l?l?u?u?s?d +?s?u?l?l?u?s?d?d +?s?u?l?l?u?s?d?l +?s?u?l?l?u?s?d?u +?s?u?l?l?u?s?d?s +?s?u?l?l?u?s?l?d +?s?u?l?l?u?s?u?d +?s?u?l?l?u?s?s?d +?s?u?l?l?s?d?d?d +?s?u?l?l?s?d?d?l +?s?u?l?l?s?d?d?u +?s?u?l?l?s?d?d?s +?s?u?l?l?s?d?l?d +?s?u?l?l?s?d?l?l +?s?u?l?l?s?d?l?u +?s?u?l?l?s?d?l?s +?s?u?l?l?s?d?u?d +?s?u?l?l?s?d?u?l +?s?u?l?l?s?d?u?u +?s?u?l?l?s?d?u?s +?s?u?l?l?s?d?s?d +?s?u?l?l?s?d?s?l +?s?u?l?l?s?d?s?u +?s?u?l?l?s?d?s?s +?s?u?l?l?s?l?d?d +?s?u?l?l?s?l?d?l +?s?u?l?l?s?l?d?u +?s?u?l?l?s?l?d?s +?s?u?l?l?s?l?l?d +?s?u?l?l?s?l?u?d +?s?u?l?l?s?l?s?d +?s?u?l?l?s?u?d?d +?s?u?l?l?s?u?d?l +?s?u?l?l?s?u?d?u +?s?u?l?l?s?u?d?s +?s?u?l?l?s?u?l?d +?s?u?l?l?s?u?u?d +?s?u?l?l?s?u?s?d +?s?u?l?l?s?s?d?d +?s?u?l?l?s?s?d?l +?s?u?l?l?s?s?d?u +?s?u?l?l?s?s?d?s +?s?u?l?l?s?s?l?d +?s?u?l?l?s?s?u?d +?s?u?l?l?s?s?s?d +?s?u?l?u?d?d?d?d +?s?u?l?u?d?d?d?l +?s?u?l?u?d?d?d?u +?s?u?l?u?d?d?d?s +?s?u?l?u?d?d?l?d +?s?u?l?u?d?d?l?l +?s?u?l?u?d?d?l?u +?s?u?l?u?d?d?l?s +?s?u?l?u?d?d?u?d +?s?u?l?u?d?d?u?l +?s?u?l?u?d?d?u?u +?s?u?l?u?d?d?u?s +?s?u?l?u?d?d?s?d +?s?u?l?u?d?d?s?l +?s?u?l?u?d?d?s?u +?s?u?l?u?d?d?s?s +?s?u?l?u?d?l?d?d +?s?u?l?u?d?l?d?l +?s?u?l?u?d?l?d?u +?s?u?l?u?d?l?d?s +?s?u?l?u?d?l?l?d +?s?u?l?u?d?l?l?l +?s?u?l?u?d?l?l?u +?s?u?l?u?d?l?l?s +?s?u?l?u?d?l?u?d +?s?u?l?u?d?l?u?l +?s?u?l?u?d?l?u?u +?s?u?l?u?d?l?u?s +?s?u?l?u?d?l?s?d +?s?u?l?u?d?l?s?l +?s?u?l?u?d?l?s?u +?s?u?l?u?d?l?s?s +?s?u?l?u?d?u?d?d +?s?u?l?u?d?u?d?l +?s?u?l?u?d?u?d?u +?s?u?l?u?d?u?d?s +?s?u?l?u?d?u?l?d +?s?u?l?u?d?u?l?l +?s?u?l?u?d?u?l?u +?s?u?l?u?d?u?l?s +?s?u?l?u?d?u?u?d +?s?u?l?u?d?u?u?l +?s?u?l?u?d?u?u?u +?s?u?l?u?d?u?u?s +?s?u?l?u?d?u?s?d +?s?u?l?u?d?u?s?l +?s?u?l?u?d?u?s?u +?s?u?l?u?d?u?s?s +?s?u?l?u?d?s?d?d +?s?u?l?u?d?s?d?l +?s?u?l?u?d?s?d?u +?s?u?l?u?d?s?d?s +?s?u?l?u?d?s?l?d +?s?u?l?u?d?s?l?l +?s?u?l?u?d?s?l?u +?s?u?l?u?d?s?l?s +?s?u?l?u?d?s?u?d +?s?u?l?u?d?s?u?l +?s?u?l?u?d?s?u?u +?s?u?l?u?d?s?u?s +?s?u?l?u?d?s?s?d +?s?u?l?u?d?s?s?l +?s?u?l?u?d?s?s?u +?s?u?l?u?d?s?s?s +?s?u?l?u?l?d?d?d +?s?u?l?u?l?d?d?l +?s?u?l?u?l?d?d?u +?s?u?l?u?l?d?d?s +?s?u?l?u?l?d?l?d +?s?u?l?u?l?d?l?l +?s?u?l?u?l?d?l?u +?s?u?l?u?l?d?l?s +?s?u?l?u?l?d?u?d +?s?u?l?u?l?d?u?l +?s?u?l?u?l?d?u?u +?s?u?l?u?l?d?u?s +?s?u?l?u?l?d?s?d +?s?u?l?u?l?d?s?l +?s?u?l?u?l?d?s?u +?s?u?l?u?l?d?s?s +?s?u?l?u?l?l?d?d +?s?u?l?u?l?l?d?l +?s?u?l?u?l?l?d?u +?s?u?l?u?l?l?d?s +?s?u?l?u?l?l?l?d +?s?u?l?u?l?l?u?d +?s?u?l?u?l?l?s?d +?s?u?l?u?l?u?d?d +?s?u?l?u?l?u?d?l +?s?u?l?u?l?u?d?u +?s?u?l?u?l?u?d?s +?s?u?l?u?l?u?l?d +?s?u?l?u?l?u?u?d +?s?u?l?u?l?u?s?d +?s?u?l?u?l?s?d?d +?s?u?l?u?l?s?d?l +?s?u?l?u?l?s?d?u +?s?u?l?u?l?s?d?s +?s?u?l?u?l?s?l?d +?s?u?l?u?l?s?u?d +?s?u?l?u?l?s?s?d +?s?u?l?u?u?d?d?d +?s?u?l?u?u?d?d?l +?s?u?l?u?u?d?d?u +?s?u?l?u?u?d?d?s +?s?u?l?u?u?d?l?d +?s?u?l?u?u?d?l?l +?s?u?l?u?u?d?l?u +?s?u?l?u?u?d?l?s +?s?u?l?u?u?d?u?d +?s?u?l?u?u?d?u?l +?s?u?l?u?u?d?u?u +?s?u?l?u?u?d?u?s +?s?u?l?u?u?d?s?d +?s?u?l?u?u?d?s?l +?s?u?l?u?u?d?s?u +?s?u?l?u?u?d?s?s +?s?u?l?u?u?l?d?d +?s?u?l?u?u?l?d?l +?s?u?l?u?u?l?d?u +?s?u?l?u?u?l?d?s +?s?u?l?u?u?l?l?d +?s?u?l?u?u?l?u?d +?s?u?l?u?u?l?s?d +?s?u?l?u?u?u?d?d +?s?u?l?u?u?u?d?l +?s?u?l?u?u?u?d?u +?s?u?l?u?u?u?d?s +?s?u?l?u?u?u?l?d +?s?u?l?u?u?u?u?d +?s?u?l?u?u?u?s?d +?s?u?l?u?u?s?d?d +?s?u?l?u?u?s?d?l +?s?u?l?u?u?s?d?u +?s?u?l?u?u?s?d?s +?s?u?l?u?u?s?l?d +?s?u?l?u?u?s?u?d +?s?u?l?u?u?s?s?d +?s?u?l?u?s?d?d?d +?s?u?l?u?s?d?d?l +?s?u?l?u?s?d?d?u +?s?u?l?u?s?d?d?s +?s?u?l?u?s?d?l?d +?s?u?l?u?s?d?l?l +?s?u?l?u?s?d?l?u +?s?u?l?u?s?d?l?s +?s?u?l?u?s?d?u?d +?s?u?l?u?s?d?u?l +?s?u?l?u?s?d?u?u +?s?u?l?u?s?d?u?s +?s?u?l?u?s?d?s?d +?s?u?l?u?s?d?s?l +?s?u?l?u?s?d?s?u +?s?u?l?u?s?d?s?s +?s?u?l?u?s?l?d?d +?s?u?l?u?s?l?d?l +?s?u?l?u?s?l?d?u +?s?u?l?u?s?l?d?s +?s?u?l?u?s?l?l?d +?s?u?l?u?s?l?u?d +?s?u?l?u?s?l?s?d +?s?u?l?u?s?u?d?d +?s?u?l?u?s?u?d?l +?s?u?l?u?s?u?d?u +?s?u?l?u?s?u?d?s +?s?u?l?u?s?u?l?d +?s?u?l?u?s?u?u?d +?s?u?l?u?s?u?s?d +?s?u?l?u?s?s?d?d +?s?u?l?u?s?s?d?l +?s?u?l?u?s?s?d?u +?s?u?l?u?s?s?d?s +?s?u?l?u?s?s?l?d +?s?u?l?u?s?s?u?d +?s?u?l?u?s?s?s?d +?s?u?l?s?d?d?d?d +?s?u?l?s?d?d?d?l +?s?u?l?s?d?d?d?u +?s?u?l?s?d?d?d?s +?s?u?l?s?d?d?l?d +?s?u?l?s?d?d?l?l +?s?u?l?s?d?d?l?u +?s?u?l?s?d?d?l?s +?s?u?l?s?d?d?u?d +?s?u?l?s?d?d?u?l +?s?u?l?s?d?d?u?u +?s?u?l?s?d?d?u?s +?s?u?l?s?d?d?s?d +?s?u?l?s?d?d?s?l +?s?u?l?s?d?d?s?u +?s?u?l?s?d?d?s?s +?s?u?l?s?d?l?d?d +?s?u?l?s?d?l?d?l +?s?u?l?s?d?l?d?u +?s?u?l?s?d?l?d?s +?s?u?l?s?d?l?l?d +?s?u?l?s?d?l?l?l +?s?u?l?s?d?l?l?u +?s?u?l?s?d?l?l?s +?s?u?l?s?d?l?u?d +?s?u?l?s?d?l?u?l +?s?u?l?s?d?l?u?u +?s?u?l?s?d?l?u?s +?s?u?l?s?d?l?s?d +?s?u?l?s?d?l?s?l +?s?u?l?s?d?l?s?u +?s?u?l?s?d?l?s?s +?s?u?l?s?d?u?d?d +?s?u?l?s?d?u?d?l +?s?u?l?s?d?u?d?u +?s?u?l?s?d?u?d?s +?s?u?l?s?d?u?l?d +?s?u?l?s?d?u?l?l +?s?u?l?s?d?u?l?u +?s?u?l?s?d?u?l?s +?s?u?l?s?d?u?u?d +?s?u?l?s?d?u?u?l +?s?u?l?s?d?u?u?u +?s?u?l?s?d?u?u?s +?s?u?l?s?d?u?s?d +?s?u?l?s?d?u?s?l +?s?u?l?s?d?u?s?u +?s?u?l?s?d?u?s?s +?s?u?l?s?d?s?d?d +?s?u?l?s?d?s?d?l +?s?u?l?s?d?s?d?u +?s?u?l?s?d?s?d?s +?s?u?l?s?d?s?l?d +?s?u?l?s?d?s?l?l +?s?u?l?s?d?s?l?u +?s?u?l?s?d?s?l?s +?s?u?l?s?d?s?u?d +?s?u?l?s?d?s?u?l +?s?u?l?s?d?s?u?u +?s?u?l?s?d?s?u?s +?s?u?l?s?d?s?s?d +?s?u?l?s?d?s?s?l +?s?u?l?s?d?s?s?u +?s?u?l?s?d?s?s?s +?s?u?l?s?l?d?d?d +?s?u?l?s?l?d?d?l +?s?u?l?s?l?d?d?u +?s?u?l?s?l?d?d?s +?s?u?l?s?l?d?l?d +?s?u?l?s?l?d?l?l +?s?u?l?s?l?d?l?u +?s?u?l?s?l?d?l?s +?s?u?l?s?l?d?u?d +?s?u?l?s?l?d?u?l +?s?u?l?s?l?d?u?u +?s?u?l?s?l?d?u?s +?s?u?l?s?l?d?s?d +?s?u?l?s?l?d?s?l +?s?u?l?s?l?d?s?u +?s?u?l?s?l?d?s?s +?s?u?l?s?l?l?d?d +?s?u?l?s?l?l?d?l +?s?u?l?s?l?l?d?u +?s?u?l?s?l?l?d?s +?s?u?l?s?l?l?l?d +?s?u?l?s?l?l?u?d +?s?u?l?s?l?l?s?d +?s?u?l?s?l?u?d?d +?s?u?l?s?l?u?d?l +?s?u?l?s?l?u?d?u +?s?u?l?s?l?u?d?s +?s?u?l?s?l?u?l?d +?s?u?l?s?l?u?u?d +?s?u?l?s?l?u?s?d +?s?u?l?s?l?s?d?d +?s?u?l?s?l?s?d?l +?s?u?l?s?l?s?d?u +?s?u?l?s?l?s?d?s +?s?u?l?s?l?s?l?d +?s?u?l?s?l?s?u?d +?s?u?l?s?l?s?s?d +?s?u?l?s?u?d?d?d +?s?u?l?s?u?d?d?l +?s?u?l?s?u?d?d?u +?s?u?l?s?u?d?d?s +?s?u?l?s?u?d?l?d +?s?u?l?s?u?d?l?l +?s?u?l?s?u?d?l?u +?s?u?l?s?u?d?l?s +?s?u?l?s?u?d?u?d +?s?u?l?s?u?d?u?l +?s?u?l?s?u?d?u?u +?s?u?l?s?u?d?u?s +?s?u?l?s?u?d?s?d +?s?u?l?s?u?d?s?l +?s?u?l?s?u?d?s?u +?s?u?l?s?u?d?s?s +?s?u?l?s?u?l?d?d +?s?u?l?s?u?l?d?l +?s?u?l?s?u?l?d?u +?s?u?l?s?u?l?d?s +?s?u?l?s?u?l?l?d +?s?u?l?s?u?l?u?d +?s?u?l?s?u?l?s?d +?s?u?l?s?u?u?d?d +?s?u?l?s?u?u?d?l +?s?u?l?s?u?u?d?u +?s?u?l?s?u?u?d?s +?s?u?l?s?u?u?l?d +?s?u?l?s?u?u?u?d +?s?u?l?s?u?u?s?d +?s?u?l?s?u?s?d?d +?s?u?l?s?u?s?d?l +?s?u?l?s?u?s?d?u +?s?u?l?s?u?s?d?s +?s?u?l?s?u?s?l?d +?s?u?l?s?u?s?u?d +?s?u?l?s?u?s?s?d +?s?u?l?s?s?d?d?d +?s?u?l?s?s?d?d?l +?s?u?l?s?s?d?d?u +?s?u?l?s?s?d?d?s +?s?u?l?s?s?d?l?d +?s?u?l?s?s?d?l?l +?s?u?l?s?s?d?l?u +?s?u?l?s?s?d?l?s +?s?u?l?s?s?d?u?d +?s?u?l?s?s?d?u?l +?s?u?l?s?s?d?u?u +?s?u?l?s?s?d?u?s +?s?u?l?s?s?d?s?d +?s?u?l?s?s?d?s?l +?s?u?l?s?s?d?s?u +?s?u?l?s?s?d?s?s +?s?u?l?s?s?l?d?d +?s?u?l?s?s?l?d?l +?s?u?l?s?s?l?d?u +?s?u?l?s?s?l?d?s +?s?u?l?s?s?l?l?d +?s?u?l?s?s?l?u?d +?s?u?l?s?s?l?s?d +?s?u?l?s?s?u?d?d +?s?u?l?s?s?u?d?l +?s?u?l?s?s?u?d?u +?s?u?l?s?s?u?d?s +?s?u?l?s?s?u?l?d +?s?u?l?s?s?u?u?d +?s?u?l?s?s?u?s?d +?s?u?l?s?s?s?d?d +?s?u?l?s?s?s?d?l +?s?u?l?s?s?s?d?u +?s?u?l?s?s?s?d?s +?s?u?l?s?s?s?l?d +?s?u?l?s?s?s?u?d +?s?u?l?s?s?s?s?d +?s?u?u?d?d?d?d?l +?s?u?u?d?d?d?l?d +?s?u?u?d?d?d?l?l +?s?u?u?d?d?d?l?u +?s?u?u?d?d?d?l?s +?s?u?u?d?d?d?u?l +?s?u?u?d?d?d?s?l +?s?u?u?d?d?l?d?d +?s?u?u?d?d?l?d?l +?s?u?u?d?d?l?d?u +?s?u?u?d?d?l?d?s +?s?u?u?d?d?l?l?d +?s?u?u?d?d?l?l?l +?s?u?u?d?d?l?l?u +?s?u?u?d?d?l?l?s +?s?u?u?d?d?l?u?d +?s?u?u?d?d?l?u?l +?s?u?u?d?d?l?u?u +?s?u?u?d?d?l?u?s +?s?u?u?d?d?l?s?d +?s?u?u?d?d?l?s?l +?s?u?u?d?d?l?s?u +?s?u?u?d?d?l?s?s +?s?u?u?d?d?u?d?l +?s?u?u?d?d?u?l?d +?s?u?u?d?d?u?l?l +?s?u?u?d?d?u?l?u +?s?u?u?d?d?u?l?s +?s?u?u?d?d?u?u?l +?s?u?u?d?d?u?s?l +?s?u?u?d?d?s?d?l +?s?u?u?d?d?s?l?d +?s?u?u?d?d?s?l?l +?s?u?u?d?d?s?l?u +?s?u?u?d?d?s?l?s +?s?u?u?d?d?s?u?l +?s?u?u?d?d?s?s?l +?s?u?u?d?l?d?d?d +?s?u?u?d?l?d?d?l +?s?u?u?d?l?d?d?u +?s?u?u?d?l?d?d?s +?s?u?u?d?l?d?l?d +?s?u?u?d?l?d?l?l +?s?u?u?d?l?d?l?u +?s?u?u?d?l?d?l?s +?s?u?u?d?l?d?u?d +?s?u?u?d?l?d?u?l +?s?u?u?d?l?d?u?u +?s?u?u?d?l?d?u?s +?s?u?u?d?l?d?s?d +?s?u?u?d?l?d?s?l +?s?u?u?d?l?d?s?u +?s?u?u?d?l?d?s?s +?s?u?u?d?l?l?d?d +?s?u?u?d?l?l?d?l +?s?u?u?d?l?l?d?u +?s?u?u?d?l?l?d?s +?s?u?u?d?l?l?l?d +?s?u?u?d?l?l?l?l +?s?u?u?d?l?l?l?u +?s?u?u?d?l?l?l?s +?s?u?u?d?l?l?u?d +?s?u?u?d?l?l?u?l +?s?u?u?d?l?l?u?u +?s?u?u?d?l?l?u?s +?s?u?u?d?l?l?s?d +?s?u?u?d?l?l?s?l +?s?u?u?d?l?l?s?u +?s?u?u?d?l?l?s?s +?s?u?u?d?l?u?d?d +?s?u?u?d?l?u?d?l +?s?u?u?d?l?u?d?u +?s?u?u?d?l?u?d?s +?s?u?u?d?l?u?l?d +?s?u?u?d?l?u?l?l +?s?u?u?d?l?u?l?u +?s?u?u?d?l?u?l?s +?s?u?u?d?l?u?u?d +?s?u?u?d?l?u?u?l +?s?u?u?d?l?u?u?u +?s?u?u?d?l?u?u?s +?s?u?u?d?l?u?s?d +?s?u?u?d?l?u?s?l +?s?u?u?d?l?u?s?u +?s?u?u?d?l?u?s?s +?s?u?u?d?l?s?d?d +?s?u?u?d?l?s?d?l +?s?u?u?d?l?s?d?u +?s?u?u?d?l?s?d?s +?s?u?u?d?l?s?l?d +?s?u?u?d?l?s?l?l +?s?u?u?d?l?s?l?u +?s?u?u?d?l?s?l?s +?s?u?u?d?l?s?u?d +?s?u?u?d?l?s?u?l +?s?u?u?d?l?s?u?u +?s?u?u?d?l?s?u?s +?s?u?u?d?l?s?s?d +?s?u?u?d?l?s?s?l +?s?u?u?d?l?s?s?u +?s?u?u?d?l?s?s?s +?s?u?u?d?u?d?d?l +?s?u?u?d?u?d?l?d +?s?u?u?d?u?d?l?l +?s?u?u?d?u?d?l?u +?s?u?u?d?u?d?l?s +?s?u?u?d?u?d?u?l +?s?u?u?d?u?d?s?l +?s?u?u?d?u?l?d?d +?s?u?u?d?u?l?d?l +?s?u?u?d?u?l?d?u +?s?u?u?d?u?l?d?s +?s?u?u?d?u?l?l?d +?s?u?u?d?u?l?l?l +?s?u?u?d?u?l?l?u +?s?u?u?d?u?l?l?s +?s?u?u?d?u?l?u?d +?s?u?u?d?u?l?u?l +?s?u?u?d?u?l?u?u +?s?u?u?d?u?l?u?s +?s?u?u?d?u?l?s?d +?s?u?u?d?u?l?s?l +?s?u?u?d?u?l?s?u +?s?u?u?d?u?l?s?s +?s?u?u?d?u?u?d?l +?s?u?u?d?u?u?l?d +?s?u?u?d?u?u?l?l +?s?u?u?d?u?u?l?u +?s?u?u?d?u?u?l?s +?s?u?u?d?u?u?u?l +?s?u?u?d?u?u?s?l +?s?u?u?d?u?s?d?l +?s?u?u?d?u?s?l?d +?s?u?u?d?u?s?l?l +?s?u?u?d?u?s?l?u +?s?u?u?d?u?s?l?s +?s?u?u?d?u?s?u?l +?s?u?u?d?u?s?s?l +?s?u?u?d?s?d?d?l +?s?u?u?d?s?d?l?d +?s?u?u?d?s?d?l?l +?s?u?u?d?s?d?l?u +?s?u?u?d?s?d?l?s +?s?u?u?d?s?d?u?l +?s?u?u?d?s?d?s?l +?s?u?u?d?s?l?d?d +?s?u?u?d?s?l?d?l +?s?u?u?d?s?l?d?u +?s?u?u?d?s?l?d?s +?s?u?u?d?s?l?l?d +?s?u?u?d?s?l?l?l +?s?u?u?d?s?l?l?u +?s?u?u?d?s?l?l?s +?s?u?u?d?s?l?u?d +?s?u?u?d?s?l?u?l +?s?u?u?d?s?l?u?u +?s?u?u?d?s?l?u?s +?s?u?u?d?s?l?s?d +?s?u?u?d?s?l?s?l +?s?u?u?d?s?l?s?u +?s?u?u?d?s?l?s?s +?s?u?u?d?s?u?d?l +?s?u?u?d?s?u?l?d +?s?u?u?d?s?u?l?l +?s?u?u?d?s?u?l?u +?s?u?u?d?s?u?l?s +?s?u?u?d?s?u?u?l +?s?u?u?d?s?u?s?l +?s?u?u?d?s?s?d?l +?s?u?u?d?s?s?l?d +?s?u?u?d?s?s?l?l +?s?u?u?d?s?s?l?u +?s?u?u?d?s?s?l?s +?s?u?u?d?s?s?u?l +?s?u?u?d?s?s?s?l +?s?u?u?l?d?d?d?d +?s?u?u?l?d?d?d?l +?s?u?u?l?d?d?d?u +?s?u?u?l?d?d?d?s +?s?u?u?l?d?d?l?d +?s?u?u?l?d?d?l?l +?s?u?u?l?d?d?l?u +?s?u?u?l?d?d?l?s +?s?u?u?l?d?d?u?d +?s?u?u?l?d?d?u?l +?s?u?u?l?d?d?u?u +?s?u?u?l?d?d?u?s +?s?u?u?l?d?d?s?d +?s?u?u?l?d?d?s?l +?s?u?u?l?d?d?s?u +?s?u?u?l?d?d?s?s +?s?u?u?l?d?l?d?d +?s?u?u?l?d?l?d?l +?s?u?u?l?d?l?d?u +?s?u?u?l?d?l?d?s +?s?u?u?l?d?l?l?d +?s?u?u?l?d?l?l?l +?s?u?u?l?d?l?l?u +?s?u?u?l?d?l?l?s +?s?u?u?l?d?l?u?d +?s?u?u?l?d?l?u?l +?s?u?u?l?d?l?u?u +?s?u?u?l?d?l?u?s +?s?u?u?l?d?l?s?d +?s?u?u?l?d?l?s?l +?s?u?u?l?d?l?s?u +?s?u?u?l?d?l?s?s +?s?u?u?l?d?u?d?d +?s?u?u?l?d?u?d?l +?s?u?u?l?d?u?d?u +?s?u?u?l?d?u?d?s +?s?u?u?l?d?u?l?d +?s?u?u?l?d?u?l?l +?s?u?u?l?d?u?l?u +?s?u?u?l?d?u?l?s +?s?u?u?l?d?u?u?d +?s?u?u?l?d?u?u?l +?s?u?u?l?d?u?u?u +?s?u?u?l?d?u?u?s +?s?u?u?l?d?u?s?d +?s?u?u?l?d?u?s?l +?s?u?u?l?d?u?s?u +?s?u?u?l?d?u?s?s +?s?u?u?l?d?s?d?d +?s?u?u?l?d?s?d?l +?s?u?u?l?d?s?d?u +?s?u?u?l?d?s?d?s +?s?u?u?l?d?s?l?d +?s?u?u?l?d?s?l?l +?s?u?u?l?d?s?l?u +?s?u?u?l?d?s?l?s +?s?u?u?l?d?s?u?d +?s?u?u?l?d?s?u?l +?s?u?u?l?d?s?u?u +?s?u?u?l?d?s?u?s +?s?u?u?l?d?s?s?d +?s?u?u?l?d?s?s?l +?s?u?u?l?d?s?s?u +?s?u?u?l?d?s?s?s +?s?u?u?l?l?d?d?d +?s?u?u?l?l?d?d?l +?s?u?u?l?l?d?d?u +?s?u?u?l?l?d?d?s +?s?u?u?l?l?d?l?d +?s?u?u?l?l?d?l?l +?s?u?u?l?l?d?l?u +?s?u?u?l?l?d?l?s +?s?u?u?l?l?d?u?d +?s?u?u?l?l?d?u?l +?s?u?u?l?l?d?u?u +?s?u?u?l?l?d?u?s +?s?u?u?l?l?d?s?d +?s?u?u?l?l?d?s?l +?s?u?u?l?l?d?s?u +?s?u?u?l?l?d?s?s +?s?u?u?l?l?l?d?d +?s?u?u?l?l?l?d?l +?s?u?u?l?l?l?d?u +?s?u?u?l?l?l?d?s +?s?u?u?l?l?l?l?d +?s?u?u?l?l?l?u?d +?s?u?u?l?l?l?s?d +?s?u?u?l?l?u?d?d +?s?u?u?l?l?u?d?l +?s?u?u?l?l?u?d?u +?s?u?u?l?l?u?d?s +?s?u?u?l?l?u?l?d +?s?u?u?l?l?u?u?d +?s?u?u?l?l?u?s?d +?s?u?u?l?l?s?d?d +?s?u?u?l?l?s?d?l +?s?u?u?l?l?s?d?u +?s?u?u?l?l?s?d?s +?s?u?u?l?l?s?l?d +?s?u?u?l?l?s?u?d +?s?u?u?l?l?s?s?d +?s?u?u?l?u?d?d?d +?s?u?u?l?u?d?d?l +?s?u?u?l?u?d?d?u +?s?u?u?l?u?d?d?s +?s?u?u?l?u?d?l?d +?s?u?u?l?u?d?l?l +?s?u?u?l?u?d?l?u +?s?u?u?l?u?d?l?s +?s?u?u?l?u?d?u?d +?s?u?u?l?u?d?u?l +?s?u?u?l?u?d?u?u +?s?u?u?l?u?d?u?s +?s?u?u?l?u?d?s?d +?s?u?u?l?u?d?s?l +?s?u?u?l?u?d?s?u +?s?u?u?l?u?d?s?s +?s?u?u?l?u?l?d?d +?s?u?u?l?u?l?d?l +?s?u?u?l?u?l?d?u +?s?u?u?l?u?l?d?s +?s?u?u?l?u?l?l?d +?s?u?u?l?u?l?u?d +?s?u?u?l?u?l?s?d +?s?u?u?l?u?u?d?d +?s?u?u?l?u?u?d?l +?s?u?u?l?u?u?d?u +?s?u?u?l?u?u?d?s +?s?u?u?l?u?u?l?d +?s?u?u?l?u?u?u?d +?s?u?u?l?u?u?s?d +?s?u?u?l?u?s?d?d +?s?u?u?l?u?s?d?l +?s?u?u?l?u?s?d?u +?s?u?u?l?u?s?d?s +?s?u?u?l?u?s?l?d +?s?u?u?l?u?s?u?d +?s?u?u?l?u?s?s?d +?s?u?u?l?s?d?d?d +?s?u?u?l?s?d?d?l +?s?u?u?l?s?d?d?u +?s?u?u?l?s?d?d?s +?s?u?u?l?s?d?l?d +?s?u?u?l?s?d?l?l +?s?u?u?l?s?d?l?u +?s?u?u?l?s?d?l?s +?s?u?u?l?s?d?u?d +?s?u?u?l?s?d?u?l +?s?u?u?l?s?d?u?u +?s?u?u?l?s?d?u?s +?s?u?u?l?s?d?s?d +?s?u?u?l?s?d?s?l +?s?u?u?l?s?d?s?u +?s?u?u?l?s?d?s?s +?s?u?u?l?s?l?d?d +?s?u?u?l?s?l?d?l +?s?u?u?l?s?l?d?u +?s?u?u?l?s?l?d?s +?s?u?u?l?s?l?l?d +?s?u?u?l?s?l?u?d +?s?u?u?l?s?l?s?d +?s?u?u?l?s?u?d?d +?s?u?u?l?s?u?d?l +?s?u?u?l?s?u?d?u +?s?u?u?l?s?u?d?s +?s?u?u?l?s?u?l?d +?s?u?u?l?s?u?u?d +?s?u?u?l?s?u?s?d +?s?u?u?l?s?s?d?d +?s?u?u?l?s?s?d?l +?s?u?u?l?s?s?d?u +?s?u?u?l?s?s?d?s +?s?u?u?l?s?s?l?d +?s?u?u?l?s?s?u?d +?s?u?u?l?s?s?s?d +?s?u?u?u?d?d?d?l +?s?u?u?u?d?d?l?d +?s?u?u?u?d?d?l?l +?s?u?u?u?d?d?l?u +?s?u?u?u?d?d?l?s +?s?u?u?u?d?d?u?l +?s?u?u?u?d?d?s?l +?s?u?u?u?d?l?d?d +?s?u?u?u?d?l?d?l +?s?u?u?u?d?l?d?u +?s?u?u?u?d?l?d?s +?s?u?u?u?d?l?l?d +?s?u?u?u?d?l?l?l +?s?u?u?u?d?l?l?u +?s?u?u?u?d?l?l?s +?s?u?u?u?d?l?u?d +?s?u?u?u?d?l?u?l +?s?u?u?u?d?l?u?u +?s?u?u?u?d?l?u?s +?s?u?u?u?d?l?s?d +?s?u?u?u?d?l?s?l +?s?u?u?u?d?l?s?u +?s?u?u?u?d?l?s?s +?s?u?u?u?d?u?d?l +?s?u?u?u?d?u?l?d +?s?u?u?u?d?u?l?l +?s?u?u?u?d?u?l?u +?s?u?u?u?d?u?l?s +?s?u?u?u?d?u?u?l +?s?u?u?u?d?u?s?l +?s?u?u?u?d?s?d?l +?s?u?u?u?d?s?l?d +?s?u?u?u?d?s?l?l +?s?u?u?u?d?s?l?u +?s?u?u?u?d?s?l?s +?s?u?u?u?d?s?u?l +?s?u?u?u?d?s?s?l +?s?u?u?u?l?d?d?d +?s?u?u?u?l?d?d?l +?s?u?u?u?l?d?d?u +?s?u?u?u?l?d?d?s +?s?u?u?u?l?d?l?d +?s?u?u?u?l?d?l?l +?s?u?u?u?l?d?l?u +?s?u?u?u?l?d?l?s +?s?u?u?u?l?d?u?d +?s?u?u?u?l?d?u?l +?s?u?u?u?l?d?u?u +?s?u?u?u?l?d?u?s +?s?u?u?u?l?d?s?d +?s?u?u?u?l?d?s?l +?s?u?u?u?l?d?s?u +?s?u?u?u?l?d?s?s +?s?u?u?u?l?l?d?d +?s?u?u?u?l?l?d?l +?s?u?u?u?l?l?d?u +?s?u?u?u?l?l?d?s +?s?u?u?u?l?l?l?d +?s?u?u?u?l?l?u?d +?s?u?u?u?l?l?s?d +?s?u?u?u?l?u?d?d +?s?u?u?u?l?u?d?l +?s?u?u?u?l?u?d?u +?s?u?u?u?l?u?d?s +?s?u?u?u?l?u?l?d +?s?u?u?u?l?u?u?d +?s?u?u?u?l?u?s?d +?s?u?u?u?l?s?d?d +?s?u?u?u?l?s?d?l +?s?u?u?u?l?s?d?u +?s?u?u?u?l?s?d?s +?s?u?u?u?l?s?l?d +?s?u?u?u?l?s?u?d +?s?u?u?u?l?s?s?d +?s?u?u?u?u?d?d?l +?s?u?u?u?u?d?l?d +?s?u?u?u?u?d?l?l +?s?u?u?u?u?d?l?u +?s?u?u?u?u?d?l?s +?s?u?u?u?u?d?u?l +?s?u?u?u?u?d?s?l +?s?u?u?u?u?l?d?d +?s?u?u?u?u?l?d?l +?s?u?u?u?u?l?d?u +?s?u?u?u?u?l?d?s +?s?u?u?u?u?l?l?d +?s?u?u?u?u?l?u?d +?s?u?u?u?u?l?s?d +?s?u?u?u?u?u?d?l +?s?u?u?u?u?u?l?d +?s?u?u?u?u?s?d?l +?s?u?u?u?u?s?l?d +?s?u?u?u?s?d?d?l +?s?u?u?u?s?d?l?d +?s?u?u?u?s?d?l?l +?s?u?u?u?s?d?l?u +?s?u?u?u?s?d?l?s +?s?u?u?u?s?d?u?l +?s?u?u?u?s?d?s?l +?s?u?u?u?s?l?d?d +?s?u?u?u?s?l?d?l +?s?u?u?u?s?l?d?u +?s?u?u?u?s?l?d?s +?s?u?u?u?s?l?l?d +?s?u?u?u?s?l?u?d +?s?u?u?u?s?l?s?d +?s?u?u?u?s?u?d?l +?s?u?u?u?s?u?l?d +?s?u?u?u?s?s?d?l +?s?u?u?u?s?s?l?d +?s?u?u?s?d?d?d?l +?s?u?u?s?d?d?l?d +?s?u?u?s?d?d?l?l +?s?u?u?s?d?d?l?u +?s?u?u?s?d?d?l?s +?s?u?u?s?d?d?u?l +?s?u?u?s?d?d?s?l +?s?u?u?s?d?l?d?d +?s?u?u?s?d?l?d?l +?s?u?u?s?d?l?d?u +?s?u?u?s?d?l?d?s +?s?u?u?s?d?l?l?d +?s?u?u?s?d?l?l?l +?s?u?u?s?d?l?l?u +?s?u?u?s?d?l?l?s +?s?u?u?s?d?l?u?d +?s?u?u?s?d?l?u?l +?s?u?u?s?d?l?u?u +?s?u?u?s?d?l?u?s +?s?u?u?s?d?l?s?d +?s?u?u?s?d?l?s?l +?s?u?u?s?d?l?s?u +?s?u?u?s?d?l?s?s +?s?u?u?s?d?u?d?l +?s?u?u?s?d?u?l?d +?s?u?u?s?d?u?l?l +?s?u?u?s?d?u?l?u +?s?u?u?s?d?u?l?s +?s?u?u?s?d?u?u?l +?s?u?u?s?d?u?s?l +?s?u?u?s?d?s?d?l +?s?u?u?s?d?s?l?d +?s?u?u?s?d?s?l?l +?s?u?u?s?d?s?l?u +?s?u?u?s?d?s?l?s +?s?u?u?s?d?s?u?l +?s?u?u?s?d?s?s?l +?s?u?u?s?l?d?d?d +?s?u?u?s?l?d?d?l +?s?u?u?s?l?d?d?u +?s?u?u?s?l?d?d?s +?s?u?u?s?l?d?l?d +?s?u?u?s?l?d?l?l +?s?u?u?s?l?d?l?u +?s?u?u?s?l?d?l?s +?s?u?u?s?l?d?u?d +?s?u?u?s?l?d?u?l +?s?u?u?s?l?d?u?u +?s?u?u?s?l?d?u?s +?s?u?u?s?l?d?s?d +?s?u?u?s?l?d?s?l +?s?u?u?s?l?d?s?u +?s?u?u?s?l?d?s?s +?s?u?u?s?l?l?d?d +?s?u?u?s?l?l?d?l +?s?u?u?s?l?l?d?u +?s?u?u?s?l?l?d?s +?s?u?u?s?l?l?l?d +?s?u?u?s?l?l?u?d +?s?u?u?s?l?l?s?d +?s?u?u?s?l?u?d?d +?s?u?u?s?l?u?d?l +?s?u?u?s?l?u?d?u +?s?u?u?s?l?u?d?s +?s?u?u?s?l?u?l?d +?s?u?u?s?l?u?u?d +?s?u?u?s?l?u?s?d +?s?u?u?s?l?s?d?d +?s?u?u?s?l?s?d?l +?s?u?u?s?l?s?d?u +?s?u?u?s?l?s?d?s +?s?u?u?s?l?s?l?d +?s?u?u?s?l?s?u?d +?s?u?u?s?l?s?s?d +?s?u?u?s?u?d?d?l +?s?u?u?s?u?d?l?d +?s?u?u?s?u?d?l?l +?s?u?u?s?u?d?l?u +?s?u?u?s?u?d?l?s +?s?u?u?s?u?d?u?l +?s?u?u?s?u?d?s?l +?s?u?u?s?u?l?d?d +?s?u?u?s?u?l?d?l +?s?u?u?s?u?l?d?u +?s?u?u?s?u?l?d?s +?s?u?u?s?u?l?l?d +?s?u?u?s?u?l?u?d +?s?u?u?s?u?l?s?d +?s?u?u?s?u?u?d?l +?s?u?u?s?u?u?l?d +?s?u?u?s?u?s?d?l +?s?u?u?s?u?s?l?d +?s?u?u?s?s?d?d?l +?s?u?u?s?s?d?l?d +?s?u?u?s?s?d?l?l +?s?u?u?s?s?d?l?u +?s?u?u?s?s?d?l?s +?s?u?u?s?s?d?u?l +?s?u?u?s?s?d?s?l +?s?u?u?s?s?l?d?d +?s?u?u?s?s?l?d?l +?s?u?u?s?s?l?d?u +?s?u?u?s?s?l?d?s +?s?u?u?s?s?l?l?d +?s?u?u?s?s?l?u?d +?s?u?u?s?s?l?s?d +?s?u?u?s?s?u?d?l +?s?u?u?s?s?u?l?d +?s?u?u?s?s?s?d?l +?s?u?u?s?s?s?l?d +?s?u?s?d?d?d?d?l +?s?u?s?d?d?d?l?d +?s?u?s?d?d?d?l?l +?s?u?s?d?d?d?l?u +?s?u?s?d?d?d?l?s +?s?u?s?d?d?d?u?l +?s?u?s?d?d?d?s?l +?s?u?s?d?d?l?d?d +?s?u?s?d?d?l?d?l +?s?u?s?d?d?l?d?u +?s?u?s?d?d?l?d?s +?s?u?s?d?d?l?l?d +?s?u?s?d?d?l?l?l +?s?u?s?d?d?l?l?u +?s?u?s?d?d?l?l?s +?s?u?s?d?d?l?u?d +?s?u?s?d?d?l?u?l +?s?u?s?d?d?l?u?u +?s?u?s?d?d?l?u?s +?s?u?s?d?d?l?s?d +?s?u?s?d?d?l?s?l +?s?u?s?d?d?l?s?u +?s?u?s?d?d?l?s?s +?s?u?s?d?d?u?d?l +?s?u?s?d?d?u?l?d +?s?u?s?d?d?u?l?l +?s?u?s?d?d?u?l?u +?s?u?s?d?d?u?l?s +?s?u?s?d?d?u?u?l +?s?u?s?d?d?u?s?l +?s?u?s?d?d?s?d?l +?s?u?s?d?d?s?l?d +?s?u?s?d?d?s?l?l +?s?u?s?d?d?s?l?u +?s?u?s?d?d?s?l?s +?s?u?s?d?d?s?u?l +?s?u?s?d?d?s?s?l +?s?u?s?d?l?d?d?d +?s?u?s?d?l?d?d?l +?s?u?s?d?l?d?d?u +?s?u?s?d?l?d?d?s +?s?u?s?d?l?d?l?d +?s?u?s?d?l?d?l?l +?s?u?s?d?l?d?l?u +?s?u?s?d?l?d?l?s +?s?u?s?d?l?d?u?d +?s?u?s?d?l?d?u?l +?s?u?s?d?l?d?u?u +?s?u?s?d?l?d?u?s +?s?u?s?d?l?d?s?d +?s?u?s?d?l?d?s?l +?s?u?s?d?l?d?s?u +?s?u?s?d?l?d?s?s +?s?u?s?d?l?l?d?d +?s?u?s?d?l?l?d?l +?s?u?s?d?l?l?d?u +?s?u?s?d?l?l?d?s +?s?u?s?d?l?l?l?d +?s?u?s?d?l?l?l?l +?s?u?s?d?l?l?l?u +?s?u?s?d?l?l?l?s +?s?u?s?d?l?l?u?d +?s?u?s?d?l?l?u?l +?s?u?s?d?l?l?u?u +?s?u?s?d?l?l?u?s +?s?u?s?d?l?l?s?d +?s?u?s?d?l?l?s?l +?s?u?s?d?l?l?s?u +?s?u?s?d?l?l?s?s +?s?u?s?d?l?u?d?d +?s?u?s?d?l?u?d?l +?s?u?s?d?l?u?d?u +?s?u?s?d?l?u?d?s +?s?u?s?d?l?u?l?d +?s?u?s?d?l?u?l?l +?s?u?s?d?l?u?l?u +?s?u?s?d?l?u?l?s +?s?u?s?d?l?u?u?d +?s?u?s?d?l?u?u?l +?s?u?s?d?l?u?u?u +?s?u?s?d?l?u?u?s +?s?u?s?d?l?u?s?d +?s?u?s?d?l?u?s?l +?s?u?s?d?l?u?s?u +?s?u?s?d?l?u?s?s +?s?u?s?d?l?s?d?d +?s?u?s?d?l?s?d?l +?s?u?s?d?l?s?d?u +?s?u?s?d?l?s?d?s +?s?u?s?d?l?s?l?d +?s?u?s?d?l?s?l?l +?s?u?s?d?l?s?l?u +?s?u?s?d?l?s?l?s +?s?u?s?d?l?s?u?d +?s?u?s?d?l?s?u?l +?s?u?s?d?l?s?u?u +?s?u?s?d?l?s?u?s +?s?u?s?d?l?s?s?d +?s?u?s?d?l?s?s?l +?s?u?s?d?l?s?s?u +?s?u?s?d?l?s?s?s +?s?u?s?d?u?d?d?l +?s?u?s?d?u?d?l?d +?s?u?s?d?u?d?l?l +?s?u?s?d?u?d?l?u +?s?u?s?d?u?d?l?s +?s?u?s?d?u?d?u?l +?s?u?s?d?u?d?s?l +?s?u?s?d?u?l?d?d +?s?u?s?d?u?l?d?l +?s?u?s?d?u?l?d?u +?s?u?s?d?u?l?d?s +?s?u?s?d?u?l?l?d +?s?u?s?d?u?l?l?l +?s?u?s?d?u?l?l?u +?s?u?s?d?u?l?l?s +?s?u?s?d?u?l?u?d +?s?u?s?d?u?l?u?l +?s?u?s?d?u?l?u?u +?s?u?s?d?u?l?u?s +?s?u?s?d?u?l?s?d +?s?u?s?d?u?l?s?l +?s?u?s?d?u?l?s?u +?s?u?s?d?u?l?s?s +?s?u?s?d?u?u?d?l +?s?u?s?d?u?u?l?d +?s?u?s?d?u?u?l?l +?s?u?s?d?u?u?l?u +?s?u?s?d?u?u?l?s +?s?u?s?d?u?u?u?l +?s?u?s?d?u?u?s?l +?s?u?s?d?u?s?d?l +?s?u?s?d?u?s?l?d +?s?u?s?d?u?s?l?l +?s?u?s?d?u?s?l?u +?s?u?s?d?u?s?l?s +?s?u?s?d?u?s?u?l +?s?u?s?d?u?s?s?l +?s?u?s?d?s?d?d?l +?s?u?s?d?s?d?l?d +?s?u?s?d?s?d?l?l +?s?u?s?d?s?d?l?u +?s?u?s?d?s?d?l?s +?s?u?s?d?s?d?u?l +?s?u?s?d?s?d?s?l +?s?u?s?d?s?l?d?d +?s?u?s?d?s?l?d?l +?s?u?s?d?s?l?d?u +?s?u?s?d?s?l?d?s +?s?u?s?d?s?l?l?d +?s?u?s?d?s?l?l?l +?s?u?s?d?s?l?l?u +?s?u?s?d?s?l?l?s +?s?u?s?d?s?l?u?d +?s?u?s?d?s?l?u?l +?s?u?s?d?s?l?u?u +?s?u?s?d?s?l?u?s +?s?u?s?d?s?l?s?d +?s?u?s?d?s?l?s?l +?s?u?s?d?s?l?s?u +?s?u?s?d?s?l?s?s +?s?u?s?d?s?u?d?l +?s?u?s?d?s?u?l?d +?s?u?s?d?s?u?l?l +?s?u?s?d?s?u?l?u +?s?u?s?d?s?u?l?s +?s?u?s?d?s?u?u?l +?s?u?s?d?s?u?s?l +?s?u?s?d?s?s?d?l +?s?u?s?d?s?s?l?d +?s?u?s?d?s?s?l?l +?s?u?s?d?s?s?l?u +?s?u?s?d?s?s?l?s +?s?u?s?d?s?s?u?l +?s?u?s?d?s?s?s?l +?s?u?s?l?d?d?d?d +?s?u?s?l?d?d?d?l +?s?u?s?l?d?d?d?u +?s?u?s?l?d?d?d?s +?s?u?s?l?d?d?l?d +?s?u?s?l?d?d?l?l +?s?u?s?l?d?d?l?u +?s?u?s?l?d?d?l?s +?s?u?s?l?d?d?u?d +?s?u?s?l?d?d?u?l +?s?u?s?l?d?d?u?u +?s?u?s?l?d?d?u?s +?s?u?s?l?d?d?s?d +?s?u?s?l?d?d?s?l +?s?u?s?l?d?d?s?u +?s?u?s?l?d?d?s?s +?s?u?s?l?d?l?d?d +?s?u?s?l?d?l?d?l +?s?u?s?l?d?l?d?u +?s?u?s?l?d?l?d?s +?s?u?s?l?d?l?l?d +?s?u?s?l?d?l?l?l +?s?u?s?l?d?l?l?u +?s?u?s?l?d?l?l?s +?s?u?s?l?d?l?u?d +?s?u?s?l?d?l?u?l +?s?u?s?l?d?l?u?u +?s?u?s?l?d?l?u?s +?s?u?s?l?d?l?s?d +?s?u?s?l?d?l?s?l +?s?u?s?l?d?l?s?u +?s?u?s?l?d?l?s?s +?s?u?s?l?d?u?d?d +?s?u?s?l?d?u?d?l +?s?u?s?l?d?u?d?u +?s?u?s?l?d?u?d?s +?s?u?s?l?d?u?l?d +?s?u?s?l?d?u?l?l +?s?u?s?l?d?u?l?u +?s?u?s?l?d?u?l?s +?s?u?s?l?d?u?u?d +?s?u?s?l?d?u?u?l +?s?u?s?l?d?u?u?u +?s?u?s?l?d?u?u?s +?s?u?s?l?d?u?s?d +?s?u?s?l?d?u?s?l +?s?u?s?l?d?u?s?u +?s?u?s?l?d?u?s?s +?s?u?s?l?d?s?d?d +?s?u?s?l?d?s?d?l +?s?u?s?l?d?s?d?u +?s?u?s?l?d?s?d?s +?s?u?s?l?d?s?l?d +?s?u?s?l?d?s?l?l +?s?u?s?l?d?s?l?u +?s?u?s?l?d?s?l?s +?s?u?s?l?d?s?u?d +?s?u?s?l?d?s?u?l +?s?u?s?l?d?s?u?u +?s?u?s?l?d?s?u?s +?s?u?s?l?d?s?s?d +?s?u?s?l?d?s?s?l +?s?u?s?l?d?s?s?u +?s?u?s?l?d?s?s?s +?s?u?s?l?l?d?d?d +?s?u?s?l?l?d?d?l +?s?u?s?l?l?d?d?u +?s?u?s?l?l?d?d?s +?s?u?s?l?l?d?l?d +?s?u?s?l?l?d?l?l +?s?u?s?l?l?d?l?u +?s?u?s?l?l?d?l?s +?s?u?s?l?l?d?u?d +?s?u?s?l?l?d?u?l +?s?u?s?l?l?d?u?u +?s?u?s?l?l?d?u?s +?s?u?s?l?l?d?s?d +?s?u?s?l?l?d?s?l +?s?u?s?l?l?d?s?u +?s?u?s?l?l?d?s?s +?s?u?s?l?l?l?d?d +?s?u?s?l?l?l?d?l +?s?u?s?l?l?l?d?u +?s?u?s?l?l?l?d?s +?s?u?s?l?l?l?l?d +?s?u?s?l?l?l?u?d +?s?u?s?l?l?l?s?d +?s?u?s?l?l?u?d?d +?s?u?s?l?l?u?d?l +?s?u?s?l?l?u?d?u +?s?u?s?l?l?u?d?s +?s?u?s?l?l?u?l?d +?s?u?s?l?l?u?u?d +?s?u?s?l?l?u?s?d +?s?u?s?l?l?s?d?d +?s?u?s?l?l?s?d?l +?s?u?s?l?l?s?d?u +?s?u?s?l?l?s?d?s +?s?u?s?l?l?s?l?d +?s?u?s?l?l?s?u?d +?s?u?s?l?l?s?s?d +?s?u?s?l?u?d?d?d +?s?u?s?l?u?d?d?l +?s?u?s?l?u?d?d?u +?s?u?s?l?u?d?d?s +?s?u?s?l?u?d?l?d +?s?u?s?l?u?d?l?l +?s?u?s?l?u?d?l?u +?s?u?s?l?u?d?l?s +?s?u?s?l?u?d?u?d +?s?u?s?l?u?d?u?l +?s?u?s?l?u?d?u?u +?s?u?s?l?u?d?u?s +?s?u?s?l?u?d?s?d +?s?u?s?l?u?d?s?l +?s?u?s?l?u?d?s?u +?s?u?s?l?u?d?s?s +?s?u?s?l?u?l?d?d +?s?u?s?l?u?l?d?l +?s?u?s?l?u?l?d?u +?s?u?s?l?u?l?d?s +?s?u?s?l?u?l?l?d +?s?u?s?l?u?l?u?d +?s?u?s?l?u?l?s?d +?s?u?s?l?u?u?d?d +?s?u?s?l?u?u?d?l +?s?u?s?l?u?u?d?u +?s?u?s?l?u?u?d?s +?s?u?s?l?u?u?l?d +?s?u?s?l?u?u?u?d +?s?u?s?l?u?u?s?d +?s?u?s?l?u?s?d?d +?s?u?s?l?u?s?d?l +?s?u?s?l?u?s?d?u +?s?u?s?l?u?s?d?s +?s?u?s?l?u?s?l?d +?s?u?s?l?u?s?u?d +?s?u?s?l?u?s?s?d +?s?u?s?l?s?d?d?d +?s?u?s?l?s?d?d?l +?s?u?s?l?s?d?d?u +?s?u?s?l?s?d?d?s +?s?u?s?l?s?d?l?d +?s?u?s?l?s?d?l?l +?s?u?s?l?s?d?l?u +?s?u?s?l?s?d?l?s +?s?u?s?l?s?d?u?d +?s?u?s?l?s?d?u?l +?s?u?s?l?s?d?u?u +?s?u?s?l?s?d?u?s +?s?u?s?l?s?d?s?d +?s?u?s?l?s?d?s?l +?s?u?s?l?s?d?s?u +?s?u?s?l?s?d?s?s +?s?u?s?l?s?l?d?d +?s?u?s?l?s?l?d?l +?s?u?s?l?s?l?d?u +?s?u?s?l?s?l?d?s +?s?u?s?l?s?l?l?d +?s?u?s?l?s?l?u?d +?s?u?s?l?s?l?s?d +?s?u?s?l?s?u?d?d +?s?u?s?l?s?u?d?l +?s?u?s?l?s?u?d?u +?s?u?s?l?s?u?d?s +?s?u?s?l?s?u?l?d +?s?u?s?l?s?u?u?d +?s?u?s?l?s?u?s?d +?s?u?s?l?s?s?d?d +?s?u?s?l?s?s?d?l +?s?u?s?l?s?s?d?u +?s?u?s?l?s?s?d?s +?s?u?s?l?s?s?l?d +?s?u?s?l?s?s?u?d +?s?u?s?l?s?s?s?d +?s?u?s?u?d?d?d?l +?s?u?s?u?d?d?l?d +?s?u?s?u?d?d?l?l +?s?u?s?u?d?d?l?u +?s?u?s?u?d?d?l?s +?s?u?s?u?d?d?u?l +?s?u?s?u?d?d?s?l +?s?u?s?u?d?l?d?d +?s?u?s?u?d?l?d?l +?s?u?s?u?d?l?d?u +?s?u?s?u?d?l?d?s +?s?u?s?u?d?l?l?d +?s?u?s?u?d?l?l?l +?s?u?s?u?d?l?l?u +?s?u?s?u?d?l?l?s +?s?u?s?u?d?l?u?d +?s?u?s?u?d?l?u?l +?s?u?s?u?d?l?u?u +?s?u?s?u?d?l?u?s +?s?u?s?u?d?l?s?d +?s?u?s?u?d?l?s?l +?s?u?s?u?d?l?s?u +?s?u?s?u?d?l?s?s +?s?u?s?u?d?u?d?l +?s?u?s?u?d?u?l?d +?s?u?s?u?d?u?l?l +?s?u?s?u?d?u?l?u +?s?u?s?u?d?u?l?s +?s?u?s?u?d?u?u?l +?s?u?s?u?d?u?s?l +?s?u?s?u?d?s?d?l +?s?u?s?u?d?s?l?d +?s?u?s?u?d?s?l?l +?s?u?s?u?d?s?l?u +?s?u?s?u?d?s?l?s +?s?u?s?u?d?s?u?l +?s?u?s?u?d?s?s?l +?s?u?s?u?l?d?d?d +?s?u?s?u?l?d?d?l +?s?u?s?u?l?d?d?u +?s?u?s?u?l?d?d?s +?s?u?s?u?l?d?l?d +?s?u?s?u?l?d?l?l +?s?u?s?u?l?d?l?u +?s?u?s?u?l?d?l?s +?s?u?s?u?l?d?u?d +?s?u?s?u?l?d?u?l +?s?u?s?u?l?d?u?u +?s?u?s?u?l?d?u?s +?s?u?s?u?l?d?s?d +?s?u?s?u?l?d?s?l +?s?u?s?u?l?d?s?u +?s?u?s?u?l?d?s?s +?s?u?s?u?l?l?d?d +?s?u?s?u?l?l?d?l +?s?u?s?u?l?l?d?u +?s?u?s?u?l?l?d?s +?s?u?s?u?l?l?l?d +?s?u?s?u?l?l?u?d +?s?u?s?u?l?l?s?d +?s?u?s?u?l?u?d?d +?s?u?s?u?l?u?d?l +?s?u?s?u?l?u?d?u +?s?u?s?u?l?u?d?s +?s?u?s?u?l?u?l?d +?s?u?s?u?l?u?u?d +?s?u?s?u?l?u?s?d +?s?u?s?u?l?s?d?d +?s?u?s?u?l?s?d?l +?s?u?s?u?l?s?d?u +?s?u?s?u?l?s?d?s +?s?u?s?u?l?s?l?d +?s?u?s?u?l?s?u?d +?s?u?s?u?l?s?s?d +?s?u?s?u?u?d?d?l +?s?u?s?u?u?d?l?d +?s?u?s?u?u?d?l?l +?s?u?s?u?u?d?l?u +?s?u?s?u?u?d?l?s +?s?u?s?u?u?d?u?l +?s?u?s?u?u?d?s?l +?s?u?s?u?u?l?d?d +?s?u?s?u?u?l?d?l +?s?u?s?u?u?l?d?u +?s?u?s?u?u?l?d?s +?s?u?s?u?u?l?l?d +?s?u?s?u?u?l?u?d +?s?u?s?u?u?l?s?d +?s?u?s?u?u?u?d?l +?s?u?s?u?u?u?l?d +?s?u?s?u?u?s?d?l +?s?u?s?u?u?s?l?d +?s?u?s?u?s?d?d?l +?s?u?s?u?s?d?l?d +?s?u?s?u?s?d?l?l +?s?u?s?u?s?d?l?u +?s?u?s?u?s?d?l?s +?s?u?s?u?s?d?u?l +?s?u?s?u?s?d?s?l +?s?u?s?u?s?l?d?d +?s?u?s?u?s?l?d?l +?s?u?s?u?s?l?d?u +?s?u?s?u?s?l?d?s +?s?u?s?u?s?l?l?d +?s?u?s?u?s?l?u?d +?s?u?s?u?s?l?s?d +?s?u?s?u?s?u?d?l +?s?u?s?u?s?u?l?d +?s?u?s?u?s?s?d?l +?s?u?s?u?s?s?l?d +?s?u?s?s?d?d?d?l +?s?u?s?s?d?d?l?d +?s?u?s?s?d?d?l?l +?s?u?s?s?d?d?l?u +?s?u?s?s?d?d?l?s +?s?u?s?s?d?d?u?l +?s?u?s?s?d?d?s?l +?s?u?s?s?d?l?d?d +?s?u?s?s?d?l?d?l +?s?u?s?s?d?l?d?u +?s?u?s?s?d?l?d?s +?s?u?s?s?d?l?l?d +?s?u?s?s?d?l?l?l +?s?u?s?s?d?l?l?u +?s?u?s?s?d?l?l?s +?s?u?s?s?d?l?u?d +?s?u?s?s?d?l?u?l +?s?u?s?s?d?l?u?u +?s?u?s?s?d?l?u?s +?s?u?s?s?d?l?s?d +?s?u?s?s?d?l?s?l +?s?u?s?s?d?l?s?u +?s?u?s?s?d?l?s?s +?s?u?s?s?d?u?d?l +?s?u?s?s?d?u?l?d +?s?u?s?s?d?u?l?l +?s?u?s?s?d?u?l?u +?s?u?s?s?d?u?l?s +?s?u?s?s?d?u?u?l +?s?u?s?s?d?u?s?l +?s?u?s?s?d?s?d?l +?s?u?s?s?d?s?l?d +?s?u?s?s?d?s?l?l +?s?u?s?s?d?s?l?u +?s?u?s?s?d?s?l?s +?s?u?s?s?d?s?u?l +?s?u?s?s?d?s?s?l +?s?u?s?s?l?d?d?d +?s?u?s?s?l?d?d?l +?s?u?s?s?l?d?d?u +?s?u?s?s?l?d?d?s +?s?u?s?s?l?d?l?d +?s?u?s?s?l?d?l?l +?s?u?s?s?l?d?l?u +?s?u?s?s?l?d?l?s +?s?u?s?s?l?d?u?d +?s?u?s?s?l?d?u?l +?s?u?s?s?l?d?u?u +?s?u?s?s?l?d?u?s +?s?u?s?s?l?d?s?d +?s?u?s?s?l?d?s?l +?s?u?s?s?l?d?s?u +?s?u?s?s?l?d?s?s +?s?u?s?s?l?l?d?d +?s?u?s?s?l?l?d?l +?s?u?s?s?l?l?d?u +?s?u?s?s?l?l?d?s +?s?u?s?s?l?l?l?d +?s?u?s?s?l?l?u?d +?s?u?s?s?l?l?s?d +?s?u?s?s?l?u?d?d +?s?u?s?s?l?u?d?l +?s?u?s?s?l?u?d?u +?s?u?s?s?l?u?d?s +?s?u?s?s?l?u?l?d +?s?u?s?s?l?u?u?d +?s?u?s?s?l?u?s?d +?s?u?s?s?l?s?d?d +?s?u?s?s?l?s?d?l +?s?u?s?s?l?s?d?u +?s?u?s?s?l?s?d?s +?s?u?s?s?l?s?l?d +?s?u?s?s?l?s?u?d +?s?u?s?s?l?s?s?d +?s?u?s?s?u?d?d?l +?s?u?s?s?u?d?l?d +?s?u?s?s?u?d?l?l +?s?u?s?s?u?d?l?u +?s?u?s?s?u?d?l?s +?s?u?s?s?u?d?u?l +?s?u?s?s?u?d?s?l +?s?u?s?s?u?l?d?d +?s?u?s?s?u?l?d?l +?s?u?s?s?u?l?d?u +?s?u?s?s?u?l?d?s +?s?u?s?s?u?l?l?d +?s?u?s?s?u?l?u?d +?s?u?s?s?u?l?s?d +?s?u?s?s?u?u?d?l +?s?u?s?s?u?u?l?d +?s?u?s?s?u?s?d?l +?s?u?s?s?u?s?l?d +?s?u?s?s?s?d?d?l +?s?u?s?s?s?d?l?d +?s?u?s?s?s?d?l?l +?s?u?s?s?s?d?l?u +?s?u?s?s?s?d?l?s +?s?u?s?s?s?d?u?l +?s?u?s?s?s?d?s?l +?s?u?s?s?s?l?d?d +?s?u?s?s?s?l?d?l +?s?u?s?s?s?l?d?u +?s?u?s?s?s?l?d?s +?s?u?s?s?s?l?l?d +?s?u?s?s?s?l?u?d +?s?u?s?s?s?l?s?d +?s?u?s?s?s?u?d?l +?s?u?s?s?s?u?l?d +?s?u?s?s?s?s?d?l +?s?u?s?s?s?s?l?d +?s?s?d?d?d?d?l?u +?s?s?d?d?d?d?u?l +?s?s?d?d?d?l?d?u +?s?s?d?d?d?l?l?u +?s?s?d?d?d?l?u?d +?s?s?d?d?d?l?u?l +?s?s?d?d?d?l?u?u +?s?s?d?d?d?l?u?s +?s?s?d?d?d?l?s?u +?s?s?d?d?d?u?d?l +?s?s?d?d?d?u?l?d +?s?s?d?d?d?u?l?l +?s?s?d?d?d?u?l?u +?s?s?d?d?d?u?l?s +?s?s?d?d?d?u?u?l +?s?s?d?d?d?u?s?l +?s?s?d?d?d?s?l?u +?s?s?d?d?d?s?u?l +?s?s?d?d?l?d?d?u +?s?s?d?d?l?d?l?u +?s?s?d?d?l?d?u?d +?s?s?d?d?l?d?u?l +?s?s?d?d?l?d?u?u +?s?s?d?d?l?d?u?s +?s?s?d?d?l?d?s?u +?s?s?d?d?l?l?d?u +?s?s?d?d?l?l?l?u +?s?s?d?d?l?l?u?d +?s?s?d?d?l?l?u?l +?s?s?d?d?l?l?u?u +?s?s?d?d?l?l?u?s +?s?s?d?d?l?l?s?u +?s?s?d?d?l?u?d?d +?s?s?d?d?l?u?d?l +?s?s?d?d?l?u?d?u +?s?s?d?d?l?u?d?s +?s?s?d?d?l?u?l?d +?s?s?d?d?l?u?l?l +?s?s?d?d?l?u?l?u +?s?s?d?d?l?u?l?s +?s?s?d?d?l?u?u?d +?s?s?d?d?l?u?u?l +?s?s?d?d?l?u?u?u +?s?s?d?d?l?u?u?s +?s?s?d?d?l?u?s?d +?s?s?d?d?l?u?s?l +?s?s?d?d?l?u?s?u +?s?s?d?d?l?u?s?s +?s?s?d?d?l?s?d?u +?s?s?d?d?l?s?l?u +?s?s?d?d?l?s?u?d +?s?s?d?d?l?s?u?l +?s?s?d?d?l?s?u?u +?s?s?d?d?l?s?u?s +?s?s?d?d?l?s?s?u +?s?s?d?d?u?d?d?l +?s?s?d?d?u?d?l?d +?s?s?d?d?u?d?l?l +?s?s?d?d?u?d?l?u +?s?s?d?d?u?d?l?s +?s?s?d?d?u?d?u?l +?s?s?d?d?u?d?s?l +?s?s?d?d?u?l?d?d +?s?s?d?d?u?l?d?l +?s?s?d?d?u?l?d?u +?s?s?d?d?u?l?d?s +?s?s?d?d?u?l?l?d +?s?s?d?d?u?l?l?l +?s?s?d?d?u?l?l?u +?s?s?d?d?u?l?l?s +?s?s?d?d?u?l?u?d +?s?s?d?d?u?l?u?l +?s?s?d?d?u?l?u?u +?s?s?d?d?u?l?u?s +?s?s?d?d?u?l?s?d +?s?s?d?d?u?l?s?l +?s?s?d?d?u?l?s?u +?s?s?d?d?u?l?s?s +?s?s?d?d?u?u?d?l +?s?s?d?d?u?u?l?d +?s?s?d?d?u?u?l?l +?s?s?d?d?u?u?l?u +?s?s?d?d?u?u?l?s +?s?s?d?d?u?u?u?l +?s?s?d?d?u?u?s?l +?s?s?d?d?u?s?d?l +?s?s?d?d?u?s?l?d +?s?s?d?d?u?s?l?l +?s?s?d?d?u?s?l?u +?s?s?d?d?u?s?l?s +?s?s?d?d?u?s?u?l +?s?s?d?d?u?s?s?l +?s?s?d?d?s?d?l?u +?s?s?d?d?s?d?u?l +?s?s?d?d?s?l?d?u +?s?s?d?d?s?l?l?u +?s?s?d?d?s?l?u?d +?s?s?d?d?s?l?u?l +?s?s?d?d?s?l?u?u +?s?s?d?d?s?l?u?s +?s?s?d?d?s?l?s?u +?s?s?d?d?s?u?d?l +?s?s?d?d?s?u?l?d +?s?s?d?d?s?u?l?l +?s?s?d?d?s?u?l?u +?s?s?d?d?s?u?l?s +?s?s?d?d?s?u?u?l +?s?s?d?d?s?u?s?l +?s?s?d?d?s?s?l?u +?s?s?d?d?s?s?u?l +?s?s?d?l?d?d?d?u +?s?s?d?l?d?d?l?u +?s?s?d?l?d?d?u?d +?s?s?d?l?d?d?u?l +?s?s?d?l?d?d?u?u +?s?s?d?l?d?d?u?s +?s?s?d?l?d?d?s?u +?s?s?d?l?d?l?d?u +?s?s?d?l?d?l?l?u +?s?s?d?l?d?l?u?d +?s?s?d?l?d?l?u?l +?s?s?d?l?d?l?u?u +?s?s?d?l?d?l?u?s +?s?s?d?l?d?l?s?u +?s?s?d?l?d?u?d?d +?s?s?d?l?d?u?d?l +?s?s?d?l?d?u?d?u +?s?s?d?l?d?u?d?s +?s?s?d?l?d?u?l?d +?s?s?d?l?d?u?l?l +?s?s?d?l?d?u?l?u +?s?s?d?l?d?u?l?s +?s?s?d?l?d?u?u?d +?s?s?d?l?d?u?u?l +?s?s?d?l?d?u?u?u +?s?s?d?l?d?u?u?s +?s?s?d?l?d?u?s?d +?s?s?d?l?d?u?s?l +?s?s?d?l?d?u?s?u +?s?s?d?l?d?u?s?s +?s?s?d?l?d?s?d?u +?s?s?d?l?d?s?l?u +?s?s?d?l?d?s?u?d +?s?s?d?l?d?s?u?l +?s?s?d?l?d?s?u?u +?s?s?d?l?d?s?u?s +?s?s?d?l?d?s?s?u +?s?s?d?l?l?d?d?u +?s?s?d?l?l?d?l?u +?s?s?d?l?l?d?u?d +?s?s?d?l?l?d?u?l +?s?s?d?l?l?d?u?u +?s?s?d?l?l?d?u?s +?s?s?d?l?l?d?s?u +?s?s?d?l?l?l?d?u +?s?s?d?l?l?l?l?u +?s?s?d?l?l?l?u?d +?s?s?d?l?l?l?u?l +?s?s?d?l?l?l?u?u +?s?s?d?l?l?l?u?s +?s?s?d?l?l?l?s?u +?s?s?d?l?l?u?d?d +?s?s?d?l?l?u?d?l +?s?s?d?l?l?u?d?u +?s?s?d?l?l?u?d?s +?s?s?d?l?l?u?l?d +?s?s?d?l?l?u?l?l +?s?s?d?l?l?u?l?u +?s?s?d?l?l?u?l?s +?s?s?d?l?l?u?u?d +?s?s?d?l?l?u?u?l +?s?s?d?l?l?u?u?u +?s?s?d?l?l?u?u?s +?s?s?d?l?l?u?s?d +?s?s?d?l?l?u?s?l +?s?s?d?l?l?u?s?u +?s?s?d?l?l?u?s?s +?s?s?d?l?l?s?d?u +?s?s?d?l?l?s?l?u +?s?s?d?l?l?s?u?d +?s?s?d?l?l?s?u?l +?s?s?d?l?l?s?u?u +?s?s?d?l?l?s?u?s +?s?s?d?l?l?s?s?u +?s?s?d?l?u?d?d?d +?s?s?d?l?u?d?d?l +?s?s?d?l?u?d?d?u +?s?s?d?l?u?d?d?s +?s?s?d?l?u?d?l?d +?s?s?d?l?u?d?l?l +?s?s?d?l?u?d?l?u +?s?s?d?l?u?d?l?s +?s?s?d?l?u?d?u?d +?s?s?d?l?u?d?u?l +?s?s?d?l?u?d?u?u +?s?s?d?l?u?d?u?s +?s?s?d?l?u?d?s?d +?s?s?d?l?u?d?s?l +?s?s?d?l?u?d?s?u +?s?s?d?l?u?d?s?s +?s?s?d?l?u?l?d?d +?s?s?d?l?u?l?d?l +?s?s?d?l?u?l?d?u +?s?s?d?l?u?l?d?s +?s?s?d?l?u?l?l?d +?s?s?d?l?u?l?l?l +?s?s?d?l?u?l?l?u +?s?s?d?l?u?l?l?s +?s?s?d?l?u?l?u?d +?s?s?d?l?u?l?u?l +?s?s?d?l?u?l?u?u +?s?s?d?l?u?l?u?s +?s?s?d?l?u?l?s?d +?s?s?d?l?u?l?s?l +?s?s?d?l?u?l?s?u +?s?s?d?l?u?l?s?s +?s?s?d?l?u?u?d?d +?s?s?d?l?u?u?d?l +?s?s?d?l?u?u?d?u +?s?s?d?l?u?u?d?s +?s?s?d?l?u?u?l?d +?s?s?d?l?u?u?l?l +?s?s?d?l?u?u?l?u +?s?s?d?l?u?u?l?s +?s?s?d?l?u?u?u?d +?s?s?d?l?u?u?u?l +?s?s?d?l?u?u?u?u +?s?s?d?l?u?u?u?s +?s?s?d?l?u?u?s?d +?s?s?d?l?u?u?s?l +?s?s?d?l?u?u?s?u +?s?s?d?l?u?u?s?s +?s?s?d?l?u?s?d?d +?s?s?d?l?u?s?d?l +?s?s?d?l?u?s?d?u +?s?s?d?l?u?s?d?s +?s?s?d?l?u?s?l?d +?s?s?d?l?u?s?l?l +?s?s?d?l?u?s?l?u +?s?s?d?l?u?s?l?s +?s?s?d?l?u?s?u?d +?s?s?d?l?u?s?u?l +?s?s?d?l?u?s?u?u +?s?s?d?l?u?s?u?s +?s?s?d?l?u?s?s?d +?s?s?d?l?u?s?s?l +?s?s?d?l?u?s?s?u +?s?s?d?l?u?s?s?s +?s?s?d?l?s?d?d?u +?s?s?d?l?s?d?l?u +?s?s?d?l?s?d?u?d +?s?s?d?l?s?d?u?l +?s?s?d?l?s?d?u?u +?s?s?d?l?s?d?u?s +?s?s?d?l?s?d?s?u +?s?s?d?l?s?l?d?u +?s?s?d?l?s?l?l?u +?s?s?d?l?s?l?u?d +?s?s?d?l?s?l?u?l +?s?s?d?l?s?l?u?u +?s?s?d?l?s?l?u?s +?s?s?d?l?s?l?s?u +?s?s?d?l?s?u?d?d +?s?s?d?l?s?u?d?l +?s?s?d?l?s?u?d?u +?s?s?d?l?s?u?d?s +?s?s?d?l?s?u?l?d +?s?s?d?l?s?u?l?l +?s?s?d?l?s?u?l?u +?s?s?d?l?s?u?l?s +?s?s?d?l?s?u?u?d +?s?s?d?l?s?u?u?l +?s?s?d?l?s?u?u?u +?s?s?d?l?s?u?u?s +?s?s?d?l?s?u?s?d +?s?s?d?l?s?u?s?l +?s?s?d?l?s?u?s?u +?s?s?d?l?s?u?s?s +?s?s?d?l?s?s?d?u +?s?s?d?l?s?s?l?u +?s?s?d?l?s?s?u?d +?s?s?d?l?s?s?u?l +?s?s?d?l?s?s?u?u +?s?s?d?l?s?s?u?s +?s?s?d?l?s?s?s?u +?s?s?d?u?d?d?d?l +?s?s?d?u?d?d?l?d +?s?s?d?u?d?d?l?l +?s?s?d?u?d?d?l?u +?s?s?d?u?d?d?l?s +?s?s?d?u?d?d?u?l +?s?s?d?u?d?d?s?l +?s?s?d?u?d?l?d?d +?s?s?d?u?d?l?d?l +?s?s?d?u?d?l?d?u +?s?s?d?u?d?l?d?s +?s?s?d?u?d?l?l?d +?s?s?d?u?d?l?l?l +?s?s?d?u?d?l?l?u +?s?s?d?u?d?l?l?s +?s?s?d?u?d?l?u?d +?s?s?d?u?d?l?u?l +?s?s?d?u?d?l?u?u +?s?s?d?u?d?l?u?s +?s?s?d?u?d?l?s?d +?s?s?d?u?d?l?s?l +?s?s?d?u?d?l?s?u +?s?s?d?u?d?l?s?s +?s?s?d?u?d?u?d?l +?s?s?d?u?d?u?l?d +?s?s?d?u?d?u?l?l +?s?s?d?u?d?u?l?u +?s?s?d?u?d?u?l?s +?s?s?d?u?d?u?u?l +?s?s?d?u?d?u?s?l +?s?s?d?u?d?s?d?l +?s?s?d?u?d?s?l?d +?s?s?d?u?d?s?l?l +?s?s?d?u?d?s?l?u +?s?s?d?u?d?s?l?s +?s?s?d?u?d?s?u?l +?s?s?d?u?d?s?s?l +?s?s?d?u?l?d?d?d +?s?s?d?u?l?d?d?l +?s?s?d?u?l?d?d?u +?s?s?d?u?l?d?d?s +?s?s?d?u?l?d?l?d +?s?s?d?u?l?d?l?l +?s?s?d?u?l?d?l?u +?s?s?d?u?l?d?l?s +?s?s?d?u?l?d?u?d +?s?s?d?u?l?d?u?l +?s?s?d?u?l?d?u?u +?s?s?d?u?l?d?u?s +?s?s?d?u?l?d?s?d +?s?s?d?u?l?d?s?l +?s?s?d?u?l?d?s?u +?s?s?d?u?l?d?s?s +?s?s?d?u?l?l?d?d +?s?s?d?u?l?l?d?l +?s?s?d?u?l?l?d?u +?s?s?d?u?l?l?d?s +?s?s?d?u?l?l?l?d +?s?s?d?u?l?l?l?l +?s?s?d?u?l?l?l?u +?s?s?d?u?l?l?l?s +?s?s?d?u?l?l?u?d +?s?s?d?u?l?l?u?l +?s?s?d?u?l?l?u?u +?s?s?d?u?l?l?u?s +?s?s?d?u?l?l?s?d +?s?s?d?u?l?l?s?l +?s?s?d?u?l?l?s?u +?s?s?d?u?l?l?s?s +?s?s?d?u?l?u?d?d +?s?s?d?u?l?u?d?l +?s?s?d?u?l?u?d?u +?s?s?d?u?l?u?d?s +?s?s?d?u?l?u?l?d +?s?s?d?u?l?u?l?l +?s?s?d?u?l?u?l?u +?s?s?d?u?l?u?l?s +?s?s?d?u?l?u?u?d +?s?s?d?u?l?u?u?l +?s?s?d?u?l?u?u?u +?s?s?d?u?l?u?u?s +?s?s?d?u?l?u?s?d +?s?s?d?u?l?u?s?l +?s?s?d?u?l?u?s?u +?s?s?d?u?l?u?s?s +?s?s?d?u?l?s?d?d +?s?s?d?u?l?s?d?l +?s?s?d?u?l?s?d?u +?s?s?d?u?l?s?d?s +?s?s?d?u?l?s?l?d +?s?s?d?u?l?s?l?l +?s?s?d?u?l?s?l?u +?s?s?d?u?l?s?l?s +?s?s?d?u?l?s?u?d +?s?s?d?u?l?s?u?l +?s?s?d?u?l?s?u?u +?s?s?d?u?l?s?u?s +?s?s?d?u?l?s?s?d +?s?s?d?u?l?s?s?l +?s?s?d?u?l?s?s?u +?s?s?d?u?l?s?s?s +?s?s?d?u?u?d?d?l +?s?s?d?u?u?d?l?d +?s?s?d?u?u?d?l?l +?s?s?d?u?u?d?l?u +?s?s?d?u?u?d?l?s +?s?s?d?u?u?d?u?l +?s?s?d?u?u?d?s?l +?s?s?d?u?u?l?d?d +?s?s?d?u?u?l?d?l +?s?s?d?u?u?l?d?u +?s?s?d?u?u?l?d?s +?s?s?d?u?u?l?l?d +?s?s?d?u?u?l?l?l +?s?s?d?u?u?l?l?u +?s?s?d?u?u?l?l?s +?s?s?d?u?u?l?u?d +?s?s?d?u?u?l?u?l +?s?s?d?u?u?l?u?u +?s?s?d?u?u?l?u?s +?s?s?d?u?u?l?s?d +?s?s?d?u?u?l?s?l +?s?s?d?u?u?l?s?u +?s?s?d?u?u?l?s?s +?s?s?d?u?u?u?d?l +?s?s?d?u?u?u?l?d +?s?s?d?u?u?u?l?l +?s?s?d?u?u?u?l?u +?s?s?d?u?u?u?l?s +?s?s?d?u?u?u?u?l +?s?s?d?u?u?u?s?l +?s?s?d?u?u?s?d?l +?s?s?d?u?u?s?l?d +?s?s?d?u?u?s?l?l +?s?s?d?u?u?s?l?u +?s?s?d?u?u?s?l?s +?s?s?d?u?u?s?u?l +?s?s?d?u?u?s?s?l +?s?s?d?u?s?d?d?l +?s?s?d?u?s?d?l?d +?s?s?d?u?s?d?l?l +?s?s?d?u?s?d?l?u +?s?s?d?u?s?d?l?s +?s?s?d?u?s?d?u?l +?s?s?d?u?s?d?s?l +?s?s?d?u?s?l?d?d +?s?s?d?u?s?l?d?l +?s?s?d?u?s?l?d?u +?s?s?d?u?s?l?d?s +?s?s?d?u?s?l?l?d +?s?s?d?u?s?l?l?l +?s?s?d?u?s?l?l?u +?s?s?d?u?s?l?l?s +?s?s?d?u?s?l?u?d +?s?s?d?u?s?l?u?l +?s?s?d?u?s?l?u?u +?s?s?d?u?s?l?u?s +?s?s?d?u?s?l?s?d +?s?s?d?u?s?l?s?l +?s?s?d?u?s?l?s?u +?s?s?d?u?s?l?s?s +?s?s?d?u?s?u?d?l +?s?s?d?u?s?u?l?d +?s?s?d?u?s?u?l?l +?s?s?d?u?s?u?l?u +?s?s?d?u?s?u?l?s +?s?s?d?u?s?u?u?l +?s?s?d?u?s?u?s?l +?s?s?d?u?s?s?d?l +?s?s?d?u?s?s?l?d +?s?s?d?u?s?s?l?l +?s?s?d?u?s?s?l?u +?s?s?d?u?s?s?l?s +?s?s?d?u?s?s?u?l +?s?s?d?u?s?s?s?l +?s?s?d?s?d?d?l?u +?s?s?d?s?d?d?u?l +?s?s?d?s?d?l?d?u +?s?s?d?s?d?l?l?u +?s?s?d?s?d?l?u?d +?s?s?d?s?d?l?u?l +?s?s?d?s?d?l?u?u +?s?s?d?s?d?l?u?s +?s?s?d?s?d?l?s?u +?s?s?d?s?d?u?d?l +?s?s?d?s?d?u?l?d +?s?s?d?s?d?u?l?l +?s?s?d?s?d?u?l?u +?s?s?d?s?d?u?l?s +?s?s?d?s?d?u?u?l +?s?s?d?s?d?u?s?l +?s?s?d?s?d?s?l?u +?s?s?d?s?d?s?u?l +?s?s?d?s?l?d?d?u +?s?s?d?s?l?d?l?u +?s?s?d?s?l?d?u?d +?s?s?d?s?l?d?u?l +?s?s?d?s?l?d?u?u +?s?s?d?s?l?d?u?s +?s?s?d?s?l?d?s?u +?s?s?d?s?l?l?d?u +?s?s?d?s?l?l?l?u +?s?s?d?s?l?l?u?d +?s?s?d?s?l?l?u?l +?s?s?d?s?l?l?u?u +?s?s?d?s?l?l?u?s +?s?s?d?s?l?l?s?u +?s?s?d?s?l?u?d?d +?s?s?d?s?l?u?d?l +?s?s?d?s?l?u?d?u +?s?s?d?s?l?u?d?s +?s?s?d?s?l?u?l?d +?s?s?d?s?l?u?l?l +?s?s?d?s?l?u?l?u +?s?s?d?s?l?u?l?s +?s?s?d?s?l?u?u?d +?s?s?d?s?l?u?u?l +?s?s?d?s?l?u?u?u +?s?s?d?s?l?u?u?s +?s?s?d?s?l?u?s?d +?s?s?d?s?l?u?s?l +?s?s?d?s?l?u?s?u +?s?s?d?s?l?u?s?s +?s?s?d?s?l?s?d?u +?s?s?d?s?l?s?l?u +?s?s?d?s?l?s?u?d +?s?s?d?s?l?s?u?l +?s?s?d?s?l?s?u?u +?s?s?d?s?l?s?u?s +?s?s?d?s?l?s?s?u +?s?s?d?s?u?d?d?l +?s?s?d?s?u?d?l?d +?s?s?d?s?u?d?l?l +?s?s?d?s?u?d?l?u +?s?s?d?s?u?d?l?s +?s?s?d?s?u?d?u?l +?s?s?d?s?u?d?s?l +?s?s?d?s?u?l?d?d +?s?s?d?s?u?l?d?l +?s?s?d?s?u?l?d?u +?s?s?d?s?u?l?d?s +?s?s?d?s?u?l?l?d +?s?s?d?s?u?l?l?l +?s?s?d?s?u?l?l?u +?s?s?d?s?u?l?l?s +?s?s?d?s?u?l?u?d +?s?s?d?s?u?l?u?l +?s?s?d?s?u?l?u?u +?s?s?d?s?u?l?u?s +?s?s?d?s?u?l?s?d +?s?s?d?s?u?l?s?l +?s?s?d?s?u?l?s?u +?s?s?d?s?u?l?s?s +?s?s?d?s?u?u?d?l +?s?s?d?s?u?u?l?d +?s?s?d?s?u?u?l?l +?s?s?d?s?u?u?l?u +?s?s?d?s?u?u?l?s +?s?s?d?s?u?u?u?l +?s?s?d?s?u?u?s?l +?s?s?d?s?u?s?d?l +?s?s?d?s?u?s?l?d +?s?s?d?s?u?s?l?l +?s?s?d?s?u?s?l?u +?s?s?d?s?u?s?l?s +?s?s?d?s?u?s?u?l +?s?s?d?s?u?s?s?l +?s?s?d?s?s?d?l?u +?s?s?d?s?s?d?u?l +?s?s?d?s?s?l?d?u +?s?s?d?s?s?l?l?u +?s?s?d?s?s?l?u?d +?s?s?d?s?s?l?u?l +?s?s?d?s?s?l?u?u +?s?s?d?s?s?l?u?s +?s?s?d?s?s?l?s?u +?s?s?d?s?s?u?d?l +?s?s?d?s?s?u?l?d +?s?s?d?s?s?u?l?l +?s?s?d?s?s?u?l?u +?s?s?d?s?s?u?l?s +?s?s?d?s?s?u?u?l +?s?s?d?s?s?u?s?l +?s?s?d?s?s?s?l?u +?s?s?d?s?s?s?u?l +?s?s?l?d?d?d?d?u +?s?s?l?d?d?d?l?u +?s?s?l?d?d?d?u?d +?s?s?l?d?d?d?u?l +?s?s?l?d?d?d?u?u +?s?s?l?d?d?d?u?s +?s?s?l?d?d?d?s?u +?s?s?l?d?d?l?d?u +?s?s?l?d?d?l?l?u +?s?s?l?d?d?l?u?d +?s?s?l?d?d?l?u?l +?s?s?l?d?d?l?u?u +?s?s?l?d?d?l?u?s +?s?s?l?d?d?l?s?u +?s?s?l?d?d?u?d?d +?s?s?l?d?d?u?d?l +?s?s?l?d?d?u?d?u +?s?s?l?d?d?u?d?s +?s?s?l?d?d?u?l?d +?s?s?l?d?d?u?l?l +?s?s?l?d?d?u?l?u +?s?s?l?d?d?u?l?s +?s?s?l?d?d?u?u?d +?s?s?l?d?d?u?u?l +?s?s?l?d?d?u?u?u +?s?s?l?d?d?u?u?s +?s?s?l?d?d?u?s?d +?s?s?l?d?d?u?s?l +?s?s?l?d?d?u?s?u +?s?s?l?d?d?u?s?s +?s?s?l?d?d?s?d?u +?s?s?l?d?d?s?l?u +?s?s?l?d?d?s?u?d +?s?s?l?d?d?s?u?l +?s?s?l?d?d?s?u?u +?s?s?l?d?d?s?u?s +?s?s?l?d?d?s?s?u +?s?s?l?d?l?d?d?u +?s?s?l?d?l?d?l?u +?s?s?l?d?l?d?u?d +?s?s?l?d?l?d?u?l +?s?s?l?d?l?d?u?u +?s?s?l?d?l?d?u?s +?s?s?l?d?l?d?s?u +?s?s?l?d?l?l?d?u +?s?s?l?d?l?l?l?u +?s?s?l?d?l?l?u?d +?s?s?l?d?l?l?u?l +?s?s?l?d?l?l?u?u +?s?s?l?d?l?l?u?s +?s?s?l?d?l?l?s?u +?s?s?l?d?l?u?d?d +?s?s?l?d?l?u?d?l +?s?s?l?d?l?u?d?u +?s?s?l?d?l?u?d?s +?s?s?l?d?l?u?l?d +?s?s?l?d?l?u?l?l +?s?s?l?d?l?u?l?u +?s?s?l?d?l?u?l?s +?s?s?l?d?l?u?u?d +?s?s?l?d?l?u?u?l +?s?s?l?d?l?u?u?u +?s?s?l?d?l?u?u?s +?s?s?l?d?l?u?s?d +?s?s?l?d?l?u?s?l +?s?s?l?d?l?u?s?u +?s?s?l?d?l?u?s?s +?s?s?l?d?l?s?d?u +?s?s?l?d?l?s?l?u +?s?s?l?d?l?s?u?d +?s?s?l?d?l?s?u?l +?s?s?l?d?l?s?u?u +?s?s?l?d?l?s?u?s +?s?s?l?d?l?s?s?u +?s?s?l?d?u?d?d?d +?s?s?l?d?u?d?d?l +?s?s?l?d?u?d?d?u +?s?s?l?d?u?d?d?s +?s?s?l?d?u?d?l?d +?s?s?l?d?u?d?l?l +?s?s?l?d?u?d?l?u +?s?s?l?d?u?d?l?s +?s?s?l?d?u?d?u?d +?s?s?l?d?u?d?u?l +?s?s?l?d?u?d?u?u +?s?s?l?d?u?d?u?s +?s?s?l?d?u?d?s?d +?s?s?l?d?u?d?s?l +?s?s?l?d?u?d?s?u +?s?s?l?d?u?d?s?s +?s?s?l?d?u?l?d?d +?s?s?l?d?u?l?d?l +?s?s?l?d?u?l?d?u +?s?s?l?d?u?l?d?s +?s?s?l?d?u?l?l?d +?s?s?l?d?u?l?l?l +?s?s?l?d?u?l?l?u +?s?s?l?d?u?l?l?s +?s?s?l?d?u?l?u?d +?s?s?l?d?u?l?u?l +?s?s?l?d?u?l?u?u +?s?s?l?d?u?l?u?s +?s?s?l?d?u?l?s?d +?s?s?l?d?u?l?s?l +?s?s?l?d?u?l?s?u +?s?s?l?d?u?l?s?s +?s?s?l?d?u?u?d?d +?s?s?l?d?u?u?d?l +?s?s?l?d?u?u?d?u +?s?s?l?d?u?u?d?s +?s?s?l?d?u?u?l?d +?s?s?l?d?u?u?l?l +?s?s?l?d?u?u?l?u +?s?s?l?d?u?u?l?s +?s?s?l?d?u?u?u?d +?s?s?l?d?u?u?u?l +?s?s?l?d?u?u?u?u +?s?s?l?d?u?u?u?s +?s?s?l?d?u?u?s?d +?s?s?l?d?u?u?s?l +?s?s?l?d?u?u?s?u +?s?s?l?d?u?u?s?s +?s?s?l?d?u?s?d?d +?s?s?l?d?u?s?d?l +?s?s?l?d?u?s?d?u +?s?s?l?d?u?s?d?s +?s?s?l?d?u?s?l?d +?s?s?l?d?u?s?l?l +?s?s?l?d?u?s?l?u +?s?s?l?d?u?s?l?s +?s?s?l?d?u?s?u?d +?s?s?l?d?u?s?u?l +?s?s?l?d?u?s?u?u +?s?s?l?d?u?s?u?s +?s?s?l?d?u?s?s?d +?s?s?l?d?u?s?s?l +?s?s?l?d?u?s?s?u +?s?s?l?d?u?s?s?s +?s?s?l?d?s?d?d?u +?s?s?l?d?s?d?l?u +?s?s?l?d?s?d?u?d +?s?s?l?d?s?d?u?l +?s?s?l?d?s?d?u?u +?s?s?l?d?s?d?u?s +?s?s?l?d?s?d?s?u +?s?s?l?d?s?l?d?u +?s?s?l?d?s?l?l?u +?s?s?l?d?s?l?u?d +?s?s?l?d?s?l?u?l +?s?s?l?d?s?l?u?u +?s?s?l?d?s?l?u?s +?s?s?l?d?s?l?s?u +?s?s?l?d?s?u?d?d +?s?s?l?d?s?u?d?l +?s?s?l?d?s?u?d?u +?s?s?l?d?s?u?d?s +?s?s?l?d?s?u?l?d +?s?s?l?d?s?u?l?l +?s?s?l?d?s?u?l?u +?s?s?l?d?s?u?l?s +?s?s?l?d?s?u?u?d +?s?s?l?d?s?u?u?l +?s?s?l?d?s?u?u?u +?s?s?l?d?s?u?u?s +?s?s?l?d?s?u?s?d +?s?s?l?d?s?u?s?l +?s?s?l?d?s?u?s?u +?s?s?l?d?s?u?s?s +?s?s?l?d?s?s?d?u +?s?s?l?d?s?s?l?u +?s?s?l?d?s?s?u?d +?s?s?l?d?s?s?u?l +?s?s?l?d?s?s?u?u +?s?s?l?d?s?s?u?s +?s?s?l?d?s?s?s?u +?s?s?l?l?d?d?d?u +?s?s?l?l?d?d?l?u +?s?s?l?l?d?d?u?d +?s?s?l?l?d?d?u?l +?s?s?l?l?d?d?u?u +?s?s?l?l?d?d?u?s +?s?s?l?l?d?d?s?u +?s?s?l?l?d?l?d?u +?s?s?l?l?d?l?l?u +?s?s?l?l?d?l?u?d +?s?s?l?l?d?l?u?l +?s?s?l?l?d?l?u?u +?s?s?l?l?d?l?u?s +?s?s?l?l?d?l?s?u +?s?s?l?l?d?u?d?d +?s?s?l?l?d?u?d?l +?s?s?l?l?d?u?d?u +?s?s?l?l?d?u?d?s +?s?s?l?l?d?u?l?d +?s?s?l?l?d?u?l?l +?s?s?l?l?d?u?l?u +?s?s?l?l?d?u?l?s +?s?s?l?l?d?u?u?d +?s?s?l?l?d?u?u?l +?s?s?l?l?d?u?u?u +?s?s?l?l?d?u?u?s +?s?s?l?l?d?u?s?d +?s?s?l?l?d?u?s?l +?s?s?l?l?d?u?s?u +?s?s?l?l?d?u?s?s +?s?s?l?l?d?s?d?u +?s?s?l?l?d?s?l?u +?s?s?l?l?d?s?u?d +?s?s?l?l?d?s?u?l +?s?s?l?l?d?s?u?u +?s?s?l?l?d?s?u?s +?s?s?l?l?d?s?s?u +?s?s?l?l?l?d?d?u +?s?s?l?l?l?d?l?u +?s?s?l?l?l?d?u?d +?s?s?l?l?l?d?u?l +?s?s?l?l?l?d?u?u +?s?s?l?l?l?d?u?s +?s?s?l?l?l?d?s?u +?s?s?l?l?l?l?d?u +?s?s?l?l?l?l?u?d +?s?s?l?l?l?u?d?d +?s?s?l?l?l?u?d?l +?s?s?l?l?l?u?d?u +?s?s?l?l?l?u?d?s +?s?s?l?l?l?u?l?d +?s?s?l?l?l?u?u?d +?s?s?l?l?l?u?s?d +?s?s?l?l?l?s?d?u +?s?s?l?l?l?s?u?d +?s?s?l?l?u?d?d?d +?s?s?l?l?u?d?d?l +?s?s?l?l?u?d?d?u +?s?s?l?l?u?d?d?s +?s?s?l?l?u?d?l?d +?s?s?l?l?u?d?l?l +?s?s?l?l?u?d?l?u +?s?s?l?l?u?d?l?s +?s?s?l?l?u?d?u?d +?s?s?l?l?u?d?u?l +?s?s?l?l?u?d?u?u +?s?s?l?l?u?d?u?s +?s?s?l?l?u?d?s?d +?s?s?l?l?u?d?s?l +?s?s?l?l?u?d?s?u +?s?s?l?l?u?d?s?s +?s?s?l?l?u?l?d?d +?s?s?l?l?u?l?d?l +?s?s?l?l?u?l?d?u +?s?s?l?l?u?l?d?s +?s?s?l?l?u?l?l?d +?s?s?l?l?u?l?u?d +?s?s?l?l?u?l?s?d +?s?s?l?l?u?u?d?d +?s?s?l?l?u?u?d?l +?s?s?l?l?u?u?d?u +?s?s?l?l?u?u?d?s +?s?s?l?l?u?u?l?d +?s?s?l?l?u?u?u?d +?s?s?l?l?u?u?s?d +?s?s?l?l?u?s?d?d +?s?s?l?l?u?s?d?l +?s?s?l?l?u?s?d?u +?s?s?l?l?u?s?d?s +?s?s?l?l?u?s?l?d +?s?s?l?l?u?s?u?d +?s?s?l?l?u?s?s?d +?s?s?l?l?s?d?d?u +?s?s?l?l?s?d?l?u +?s?s?l?l?s?d?u?d +?s?s?l?l?s?d?u?l +?s?s?l?l?s?d?u?u +?s?s?l?l?s?d?u?s +?s?s?l?l?s?d?s?u +?s?s?l?l?s?l?d?u +?s?s?l?l?s?l?u?d +?s?s?l?l?s?u?d?d +?s?s?l?l?s?u?d?l +?s?s?l?l?s?u?d?u +?s?s?l?l?s?u?d?s +?s?s?l?l?s?u?l?d +?s?s?l?l?s?u?u?d +?s?s?l?l?s?u?s?d +?s?s?l?l?s?s?d?u +?s?s?l?l?s?s?u?d +?s?s?l?u?d?d?d?d +?s?s?l?u?d?d?d?l +?s?s?l?u?d?d?d?u +?s?s?l?u?d?d?d?s +?s?s?l?u?d?d?l?d +?s?s?l?u?d?d?l?l +?s?s?l?u?d?d?l?u +?s?s?l?u?d?d?l?s +?s?s?l?u?d?d?u?d +?s?s?l?u?d?d?u?l +?s?s?l?u?d?d?u?u +?s?s?l?u?d?d?u?s +?s?s?l?u?d?d?s?d +?s?s?l?u?d?d?s?l +?s?s?l?u?d?d?s?u +?s?s?l?u?d?d?s?s +?s?s?l?u?d?l?d?d +?s?s?l?u?d?l?d?l +?s?s?l?u?d?l?d?u +?s?s?l?u?d?l?d?s +?s?s?l?u?d?l?l?d +?s?s?l?u?d?l?l?l +?s?s?l?u?d?l?l?u +?s?s?l?u?d?l?l?s +?s?s?l?u?d?l?u?d +?s?s?l?u?d?l?u?l +?s?s?l?u?d?l?u?u +?s?s?l?u?d?l?u?s +?s?s?l?u?d?l?s?d +?s?s?l?u?d?l?s?l +?s?s?l?u?d?l?s?u +?s?s?l?u?d?l?s?s +?s?s?l?u?d?u?d?d +?s?s?l?u?d?u?d?l +?s?s?l?u?d?u?d?u +?s?s?l?u?d?u?d?s +?s?s?l?u?d?u?l?d +?s?s?l?u?d?u?l?l +?s?s?l?u?d?u?l?u +?s?s?l?u?d?u?l?s +?s?s?l?u?d?u?u?d +?s?s?l?u?d?u?u?l +?s?s?l?u?d?u?u?u +?s?s?l?u?d?u?u?s +?s?s?l?u?d?u?s?d +?s?s?l?u?d?u?s?l +?s?s?l?u?d?u?s?u +?s?s?l?u?d?u?s?s +?s?s?l?u?d?s?d?d +?s?s?l?u?d?s?d?l +?s?s?l?u?d?s?d?u +?s?s?l?u?d?s?d?s +?s?s?l?u?d?s?l?d +?s?s?l?u?d?s?l?l +?s?s?l?u?d?s?l?u +?s?s?l?u?d?s?l?s +?s?s?l?u?d?s?u?d +?s?s?l?u?d?s?u?l +?s?s?l?u?d?s?u?u +?s?s?l?u?d?s?u?s +?s?s?l?u?d?s?s?d +?s?s?l?u?d?s?s?l +?s?s?l?u?d?s?s?u +?s?s?l?u?d?s?s?s +?s?s?l?u?l?d?d?d +?s?s?l?u?l?d?d?l +?s?s?l?u?l?d?d?u +?s?s?l?u?l?d?d?s +?s?s?l?u?l?d?l?d +?s?s?l?u?l?d?l?l +?s?s?l?u?l?d?l?u +?s?s?l?u?l?d?l?s +?s?s?l?u?l?d?u?d +?s?s?l?u?l?d?u?l +?s?s?l?u?l?d?u?u +?s?s?l?u?l?d?u?s +?s?s?l?u?l?d?s?d +?s?s?l?u?l?d?s?l +?s?s?l?u?l?d?s?u +?s?s?l?u?l?d?s?s +?s?s?l?u?l?l?d?d +?s?s?l?u?l?l?d?l +?s?s?l?u?l?l?d?u +?s?s?l?u?l?l?d?s +?s?s?l?u?l?l?l?d +?s?s?l?u?l?l?u?d +?s?s?l?u?l?l?s?d +?s?s?l?u?l?u?d?d +?s?s?l?u?l?u?d?l +?s?s?l?u?l?u?d?u +?s?s?l?u?l?u?d?s +?s?s?l?u?l?u?l?d +?s?s?l?u?l?u?u?d +?s?s?l?u?l?u?s?d +?s?s?l?u?l?s?d?d +?s?s?l?u?l?s?d?l +?s?s?l?u?l?s?d?u +?s?s?l?u?l?s?d?s +?s?s?l?u?l?s?l?d +?s?s?l?u?l?s?u?d +?s?s?l?u?l?s?s?d +?s?s?l?u?u?d?d?d +?s?s?l?u?u?d?d?l +?s?s?l?u?u?d?d?u +?s?s?l?u?u?d?d?s +?s?s?l?u?u?d?l?d +?s?s?l?u?u?d?l?l +?s?s?l?u?u?d?l?u +?s?s?l?u?u?d?l?s +?s?s?l?u?u?d?u?d +?s?s?l?u?u?d?u?l +?s?s?l?u?u?d?u?u +?s?s?l?u?u?d?u?s +?s?s?l?u?u?d?s?d +?s?s?l?u?u?d?s?l +?s?s?l?u?u?d?s?u +?s?s?l?u?u?d?s?s +?s?s?l?u?u?l?d?d +?s?s?l?u?u?l?d?l +?s?s?l?u?u?l?d?u +?s?s?l?u?u?l?d?s +?s?s?l?u?u?l?l?d +?s?s?l?u?u?l?u?d +?s?s?l?u?u?l?s?d +?s?s?l?u?u?u?d?d +?s?s?l?u?u?u?d?l +?s?s?l?u?u?u?d?u +?s?s?l?u?u?u?d?s +?s?s?l?u?u?u?l?d +?s?s?l?u?u?u?u?d +?s?s?l?u?u?u?s?d +?s?s?l?u?u?s?d?d +?s?s?l?u?u?s?d?l +?s?s?l?u?u?s?d?u +?s?s?l?u?u?s?d?s +?s?s?l?u?u?s?l?d +?s?s?l?u?u?s?u?d +?s?s?l?u?u?s?s?d +?s?s?l?u?s?d?d?d +?s?s?l?u?s?d?d?l +?s?s?l?u?s?d?d?u +?s?s?l?u?s?d?d?s +?s?s?l?u?s?d?l?d +?s?s?l?u?s?d?l?l +?s?s?l?u?s?d?l?u +?s?s?l?u?s?d?l?s +?s?s?l?u?s?d?u?d +?s?s?l?u?s?d?u?l +?s?s?l?u?s?d?u?u +?s?s?l?u?s?d?u?s +?s?s?l?u?s?d?s?d +?s?s?l?u?s?d?s?l +?s?s?l?u?s?d?s?u +?s?s?l?u?s?d?s?s +?s?s?l?u?s?l?d?d +?s?s?l?u?s?l?d?l +?s?s?l?u?s?l?d?u +?s?s?l?u?s?l?d?s +?s?s?l?u?s?l?l?d +?s?s?l?u?s?l?u?d +?s?s?l?u?s?l?s?d +?s?s?l?u?s?u?d?d +?s?s?l?u?s?u?d?l +?s?s?l?u?s?u?d?u +?s?s?l?u?s?u?d?s +?s?s?l?u?s?u?l?d +?s?s?l?u?s?u?u?d +?s?s?l?u?s?u?s?d +?s?s?l?u?s?s?d?d +?s?s?l?u?s?s?d?l +?s?s?l?u?s?s?d?u +?s?s?l?u?s?s?d?s +?s?s?l?u?s?s?l?d +?s?s?l?u?s?s?u?d +?s?s?l?u?s?s?s?d +?s?s?l?s?d?d?d?u +?s?s?l?s?d?d?l?u +?s?s?l?s?d?d?u?d +?s?s?l?s?d?d?u?l +?s?s?l?s?d?d?u?u +?s?s?l?s?d?d?u?s +?s?s?l?s?d?d?s?u +?s?s?l?s?d?l?d?u +?s?s?l?s?d?l?l?u +?s?s?l?s?d?l?u?d +?s?s?l?s?d?l?u?l +?s?s?l?s?d?l?u?u +?s?s?l?s?d?l?u?s +?s?s?l?s?d?l?s?u +?s?s?l?s?d?u?d?d +?s?s?l?s?d?u?d?l +?s?s?l?s?d?u?d?u +?s?s?l?s?d?u?d?s +?s?s?l?s?d?u?l?d +?s?s?l?s?d?u?l?l +?s?s?l?s?d?u?l?u +?s?s?l?s?d?u?l?s +?s?s?l?s?d?u?u?d +?s?s?l?s?d?u?u?l +?s?s?l?s?d?u?u?u +?s?s?l?s?d?u?u?s +?s?s?l?s?d?u?s?d +?s?s?l?s?d?u?s?l +?s?s?l?s?d?u?s?u +?s?s?l?s?d?u?s?s +?s?s?l?s?d?s?d?u +?s?s?l?s?d?s?l?u +?s?s?l?s?d?s?u?d +?s?s?l?s?d?s?u?l +?s?s?l?s?d?s?u?u +?s?s?l?s?d?s?u?s +?s?s?l?s?d?s?s?u +?s?s?l?s?l?d?d?u +?s?s?l?s?l?d?l?u +?s?s?l?s?l?d?u?d +?s?s?l?s?l?d?u?l +?s?s?l?s?l?d?u?u +?s?s?l?s?l?d?u?s +?s?s?l?s?l?d?s?u +?s?s?l?s?l?l?d?u +?s?s?l?s?l?l?u?d +?s?s?l?s?l?u?d?d +?s?s?l?s?l?u?d?l +?s?s?l?s?l?u?d?u +?s?s?l?s?l?u?d?s +?s?s?l?s?l?u?l?d +?s?s?l?s?l?u?u?d +?s?s?l?s?l?u?s?d +?s?s?l?s?l?s?d?u +?s?s?l?s?l?s?u?d +?s?s?l?s?u?d?d?d +?s?s?l?s?u?d?d?l +?s?s?l?s?u?d?d?u +?s?s?l?s?u?d?d?s +?s?s?l?s?u?d?l?d +?s?s?l?s?u?d?l?l +?s?s?l?s?u?d?l?u +?s?s?l?s?u?d?l?s +?s?s?l?s?u?d?u?d +?s?s?l?s?u?d?u?l +?s?s?l?s?u?d?u?u +?s?s?l?s?u?d?u?s +?s?s?l?s?u?d?s?d +?s?s?l?s?u?d?s?l +?s?s?l?s?u?d?s?u +?s?s?l?s?u?d?s?s +?s?s?l?s?u?l?d?d +?s?s?l?s?u?l?d?l +?s?s?l?s?u?l?d?u +?s?s?l?s?u?l?d?s +?s?s?l?s?u?l?l?d +?s?s?l?s?u?l?u?d +?s?s?l?s?u?l?s?d +?s?s?l?s?u?u?d?d +?s?s?l?s?u?u?d?l +?s?s?l?s?u?u?d?u +?s?s?l?s?u?u?d?s +?s?s?l?s?u?u?l?d +?s?s?l?s?u?u?u?d +?s?s?l?s?u?u?s?d +?s?s?l?s?u?s?d?d +?s?s?l?s?u?s?d?l +?s?s?l?s?u?s?d?u +?s?s?l?s?u?s?d?s +?s?s?l?s?u?s?l?d +?s?s?l?s?u?s?u?d +?s?s?l?s?u?s?s?d +?s?s?l?s?s?d?d?u +?s?s?l?s?s?d?l?u +?s?s?l?s?s?d?u?d +?s?s?l?s?s?d?u?l +?s?s?l?s?s?d?u?u +?s?s?l?s?s?d?u?s +?s?s?l?s?s?d?s?u +?s?s?l?s?s?l?d?u +?s?s?l?s?s?l?u?d +?s?s?l?s?s?u?d?d +?s?s?l?s?s?u?d?l +?s?s?l?s?s?u?d?u +?s?s?l?s?s?u?d?s +?s?s?l?s?s?u?l?d +?s?s?l?s?s?u?u?d +?s?s?l?s?s?u?s?d +?s?s?l?s?s?s?d?u +?s?s?l?s?s?s?u?d +?s?s?u?d?d?d?d?l +?s?s?u?d?d?d?l?d +?s?s?u?d?d?d?l?l +?s?s?u?d?d?d?l?u +?s?s?u?d?d?d?l?s +?s?s?u?d?d?d?u?l +?s?s?u?d?d?d?s?l +?s?s?u?d?d?l?d?d +?s?s?u?d?d?l?d?l +?s?s?u?d?d?l?d?u +?s?s?u?d?d?l?d?s +?s?s?u?d?d?l?l?d +?s?s?u?d?d?l?l?l +?s?s?u?d?d?l?l?u +?s?s?u?d?d?l?l?s +?s?s?u?d?d?l?u?d +?s?s?u?d?d?l?u?l +?s?s?u?d?d?l?u?u +?s?s?u?d?d?l?u?s +?s?s?u?d?d?l?s?d +?s?s?u?d?d?l?s?l +?s?s?u?d?d?l?s?u +?s?s?u?d?d?l?s?s +?s?s?u?d?d?u?d?l +?s?s?u?d?d?u?l?d +?s?s?u?d?d?u?l?l +?s?s?u?d?d?u?l?u +?s?s?u?d?d?u?l?s +?s?s?u?d?d?u?u?l +?s?s?u?d?d?u?s?l +?s?s?u?d?d?s?d?l +?s?s?u?d?d?s?l?d +?s?s?u?d?d?s?l?l +?s?s?u?d?d?s?l?u +?s?s?u?d?d?s?l?s +?s?s?u?d?d?s?u?l +?s?s?u?d?d?s?s?l +?s?s?u?d?l?d?d?d +?s?s?u?d?l?d?d?l +?s?s?u?d?l?d?d?u +?s?s?u?d?l?d?d?s +?s?s?u?d?l?d?l?d +?s?s?u?d?l?d?l?l +?s?s?u?d?l?d?l?u +?s?s?u?d?l?d?l?s +?s?s?u?d?l?d?u?d +?s?s?u?d?l?d?u?l +?s?s?u?d?l?d?u?u +?s?s?u?d?l?d?u?s +?s?s?u?d?l?d?s?d +?s?s?u?d?l?d?s?l +?s?s?u?d?l?d?s?u +?s?s?u?d?l?d?s?s +?s?s?u?d?l?l?d?d +?s?s?u?d?l?l?d?l +?s?s?u?d?l?l?d?u +?s?s?u?d?l?l?d?s +?s?s?u?d?l?l?l?d +?s?s?u?d?l?l?l?l +?s?s?u?d?l?l?l?u +?s?s?u?d?l?l?l?s +?s?s?u?d?l?l?u?d +?s?s?u?d?l?l?u?l +?s?s?u?d?l?l?u?u +?s?s?u?d?l?l?u?s +?s?s?u?d?l?l?s?d +?s?s?u?d?l?l?s?l +?s?s?u?d?l?l?s?u +?s?s?u?d?l?l?s?s +?s?s?u?d?l?u?d?d +?s?s?u?d?l?u?d?l +?s?s?u?d?l?u?d?u +?s?s?u?d?l?u?d?s +?s?s?u?d?l?u?l?d +?s?s?u?d?l?u?l?l +?s?s?u?d?l?u?l?u +?s?s?u?d?l?u?l?s +?s?s?u?d?l?u?u?d +?s?s?u?d?l?u?u?l +?s?s?u?d?l?u?u?u +?s?s?u?d?l?u?u?s +?s?s?u?d?l?u?s?d +?s?s?u?d?l?u?s?l +?s?s?u?d?l?u?s?u +?s?s?u?d?l?u?s?s +?s?s?u?d?l?s?d?d +?s?s?u?d?l?s?d?l +?s?s?u?d?l?s?d?u +?s?s?u?d?l?s?d?s +?s?s?u?d?l?s?l?d +?s?s?u?d?l?s?l?l +?s?s?u?d?l?s?l?u +?s?s?u?d?l?s?l?s +?s?s?u?d?l?s?u?d +?s?s?u?d?l?s?u?l +?s?s?u?d?l?s?u?u +?s?s?u?d?l?s?u?s +?s?s?u?d?l?s?s?d +?s?s?u?d?l?s?s?l +?s?s?u?d?l?s?s?u +?s?s?u?d?l?s?s?s +?s?s?u?d?u?d?d?l +?s?s?u?d?u?d?l?d +?s?s?u?d?u?d?l?l +?s?s?u?d?u?d?l?u +?s?s?u?d?u?d?l?s +?s?s?u?d?u?d?u?l +?s?s?u?d?u?d?s?l +?s?s?u?d?u?l?d?d +?s?s?u?d?u?l?d?l +?s?s?u?d?u?l?d?u +?s?s?u?d?u?l?d?s +?s?s?u?d?u?l?l?d +?s?s?u?d?u?l?l?l +?s?s?u?d?u?l?l?u +?s?s?u?d?u?l?l?s +?s?s?u?d?u?l?u?d +?s?s?u?d?u?l?u?l +?s?s?u?d?u?l?u?u +?s?s?u?d?u?l?u?s +?s?s?u?d?u?l?s?d +?s?s?u?d?u?l?s?l +?s?s?u?d?u?l?s?u +?s?s?u?d?u?l?s?s +?s?s?u?d?u?u?d?l +?s?s?u?d?u?u?l?d +?s?s?u?d?u?u?l?l +?s?s?u?d?u?u?l?u +?s?s?u?d?u?u?l?s +?s?s?u?d?u?u?u?l +?s?s?u?d?u?u?s?l +?s?s?u?d?u?s?d?l +?s?s?u?d?u?s?l?d +?s?s?u?d?u?s?l?l +?s?s?u?d?u?s?l?u +?s?s?u?d?u?s?l?s +?s?s?u?d?u?s?u?l +?s?s?u?d?u?s?s?l +?s?s?u?d?s?d?d?l +?s?s?u?d?s?d?l?d +?s?s?u?d?s?d?l?l +?s?s?u?d?s?d?l?u +?s?s?u?d?s?d?l?s +?s?s?u?d?s?d?u?l +?s?s?u?d?s?d?s?l +?s?s?u?d?s?l?d?d +?s?s?u?d?s?l?d?l +?s?s?u?d?s?l?d?u +?s?s?u?d?s?l?d?s +?s?s?u?d?s?l?l?d +?s?s?u?d?s?l?l?l +?s?s?u?d?s?l?l?u +?s?s?u?d?s?l?l?s +?s?s?u?d?s?l?u?d +?s?s?u?d?s?l?u?l +?s?s?u?d?s?l?u?u +?s?s?u?d?s?l?u?s +?s?s?u?d?s?l?s?d +?s?s?u?d?s?l?s?l +?s?s?u?d?s?l?s?u +?s?s?u?d?s?l?s?s +?s?s?u?d?s?u?d?l +?s?s?u?d?s?u?l?d +?s?s?u?d?s?u?l?l +?s?s?u?d?s?u?l?u +?s?s?u?d?s?u?l?s +?s?s?u?d?s?u?u?l +?s?s?u?d?s?u?s?l +?s?s?u?d?s?s?d?l +?s?s?u?d?s?s?l?d +?s?s?u?d?s?s?l?l +?s?s?u?d?s?s?l?u +?s?s?u?d?s?s?l?s +?s?s?u?d?s?s?u?l +?s?s?u?d?s?s?s?l +?s?s?u?l?d?d?d?d +?s?s?u?l?d?d?d?l +?s?s?u?l?d?d?d?u +?s?s?u?l?d?d?d?s +?s?s?u?l?d?d?l?d +?s?s?u?l?d?d?l?l +?s?s?u?l?d?d?l?u +?s?s?u?l?d?d?l?s +?s?s?u?l?d?d?u?d +?s?s?u?l?d?d?u?l +?s?s?u?l?d?d?u?u +?s?s?u?l?d?d?u?s +?s?s?u?l?d?d?s?d +?s?s?u?l?d?d?s?l +?s?s?u?l?d?d?s?u +?s?s?u?l?d?d?s?s +?s?s?u?l?d?l?d?d +?s?s?u?l?d?l?d?l +?s?s?u?l?d?l?d?u +?s?s?u?l?d?l?d?s +?s?s?u?l?d?l?l?d +?s?s?u?l?d?l?l?l +?s?s?u?l?d?l?l?u +?s?s?u?l?d?l?l?s +?s?s?u?l?d?l?u?d +?s?s?u?l?d?l?u?l +?s?s?u?l?d?l?u?u +?s?s?u?l?d?l?u?s +?s?s?u?l?d?l?s?d +?s?s?u?l?d?l?s?l +?s?s?u?l?d?l?s?u +?s?s?u?l?d?l?s?s +?s?s?u?l?d?u?d?d +?s?s?u?l?d?u?d?l +?s?s?u?l?d?u?d?u +?s?s?u?l?d?u?d?s +?s?s?u?l?d?u?l?d +?s?s?u?l?d?u?l?l +?s?s?u?l?d?u?l?u +?s?s?u?l?d?u?l?s +?s?s?u?l?d?u?u?d +?s?s?u?l?d?u?u?l +?s?s?u?l?d?u?u?u +?s?s?u?l?d?u?u?s +?s?s?u?l?d?u?s?d +?s?s?u?l?d?u?s?l +?s?s?u?l?d?u?s?u +?s?s?u?l?d?u?s?s +?s?s?u?l?d?s?d?d +?s?s?u?l?d?s?d?l +?s?s?u?l?d?s?d?u +?s?s?u?l?d?s?d?s +?s?s?u?l?d?s?l?d +?s?s?u?l?d?s?l?l +?s?s?u?l?d?s?l?u +?s?s?u?l?d?s?l?s +?s?s?u?l?d?s?u?d +?s?s?u?l?d?s?u?l +?s?s?u?l?d?s?u?u +?s?s?u?l?d?s?u?s +?s?s?u?l?d?s?s?d +?s?s?u?l?d?s?s?l +?s?s?u?l?d?s?s?u +?s?s?u?l?d?s?s?s +?s?s?u?l?l?d?d?d +?s?s?u?l?l?d?d?l +?s?s?u?l?l?d?d?u +?s?s?u?l?l?d?d?s +?s?s?u?l?l?d?l?d +?s?s?u?l?l?d?l?l +?s?s?u?l?l?d?l?u +?s?s?u?l?l?d?l?s +?s?s?u?l?l?d?u?d +?s?s?u?l?l?d?u?l +?s?s?u?l?l?d?u?u +?s?s?u?l?l?d?u?s +?s?s?u?l?l?d?s?d +?s?s?u?l?l?d?s?l +?s?s?u?l?l?d?s?u +?s?s?u?l?l?d?s?s +?s?s?u?l?l?l?d?d +?s?s?u?l?l?l?d?l +?s?s?u?l?l?l?d?u +?s?s?u?l?l?l?d?s +?s?s?u?l?l?l?l?d +?s?s?u?l?l?l?u?d +?s?s?u?l?l?l?s?d +?s?s?u?l?l?u?d?d +?s?s?u?l?l?u?d?l +?s?s?u?l?l?u?d?u +?s?s?u?l?l?u?d?s +?s?s?u?l?l?u?l?d +?s?s?u?l?l?u?u?d +?s?s?u?l?l?u?s?d +?s?s?u?l?l?s?d?d +?s?s?u?l?l?s?d?l +?s?s?u?l?l?s?d?u +?s?s?u?l?l?s?d?s +?s?s?u?l?l?s?l?d +?s?s?u?l?l?s?u?d +?s?s?u?l?l?s?s?d +?s?s?u?l?u?d?d?d +?s?s?u?l?u?d?d?l +?s?s?u?l?u?d?d?u +?s?s?u?l?u?d?d?s +?s?s?u?l?u?d?l?d +?s?s?u?l?u?d?l?l +?s?s?u?l?u?d?l?u +?s?s?u?l?u?d?l?s +?s?s?u?l?u?d?u?d +?s?s?u?l?u?d?u?l +?s?s?u?l?u?d?u?u +?s?s?u?l?u?d?u?s +?s?s?u?l?u?d?s?d +?s?s?u?l?u?d?s?l +?s?s?u?l?u?d?s?u +?s?s?u?l?u?d?s?s +?s?s?u?l?u?l?d?d +?s?s?u?l?u?l?d?l +?s?s?u?l?u?l?d?u +?s?s?u?l?u?l?d?s +?s?s?u?l?u?l?l?d +?s?s?u?l?u?l?u?d +?s?s?u?l?u?l?s?d +?s?s?u?l?u?u?d?d +?s?s?u?l?u?u?d?l +?s?s?u?l?u?u?d?u +?s?s?u?l?u?u?d?s +?s?s?u?l?u?u?l?d +?s?s?u?l?u?u?u?d +?s?s?u?l?u?u?s?d +?s?s?u?l?u?s?d?d +?s?s?u?l?u?s?d?l +?s?s?u?l?u?s?d?u +?s?s?u?l?u?s?d?s +?s?s?u?l?u?s?l?d +?s?s?u?l?u?s?u?d +?s?s?u?l?u?s?s?d +?s?s?u?l?s?d?d?d +?s?s?u?l?s?d?d?l +?s?s?u?l?s?d?d?u +?s?s?u?l?s?d?d?s +?s?s?u?l?s?d?l?d +?s?s?u?l?s?d?l?l +?s?s?u?l?s?d?l?u +?s?s?u?l?s?d?l?s +?s?s?u?l?s?d?u?d +?s?s?u?l?s?d?u?l +?s?s?u?l?s?d?u?u +?s?s?u?l?s?d?u?s +?s?s?u?l?s?d?s?d +?s?s?u?l?s?d?s?l +?s?s?u?l?s?d?s?u +?s?s?u?l?s?d?s?s +?s?s?u?l?s?l?d?d +?s?s?u?l?s?l?d?l +?s?s?u?l?s?l?d?u +?s?s?u?l?s?l?d?s +?s?s?u?l?s?l?l?d +?s?s?u?l?s?l?u?d +?s?s?u?l?s?l?s?d +?s?s?u?l?s?u?d?d +?s?s?u?l?s?u?d?l +?s?s?u?l?s?u?d?u +?s?s?u?l?s?u?d?s +?s?s?u?l?s?u?l?d +?s?s?u?l?s?u?u?d +?s?s?u?l?s?u?s?d +?s?s?u?l?s?s?d?d +?s?s?u?l?s?s?d?l +?s?s?u?l?s?s?d?u +?s?s?u?l?s?s?d?s +?s?s?u?l?s?s?l?d +?s?s?u?l?s?s?u?d +?s?s?u?l?s?s?s?d +?s?s?u?u?d?d?d?l +?s?s?u?u?d?d?l?d +?s?s?u?u?d?d?l?l +?s?s?u?u?d?d?l?u +?s?s?u?u?d?d?l?s +?s?s?u?u?d?d?u?l +?s?s?u?u?d?d?s?l +?s?s?u?u?d?l?d?d +?s?s?u?u?d?l?d?l +?s?s?u?u?d?l?d?u +?s?s?u?u?d?l?d?s +?s?s?u?u?d?l?l?d +?s?s?u?u?d?l?l?l +?s?s?u?u?d?l?l?u +?s?s?u?u?d?l?l?s +?s?s?u?u?d?l?u?d +?s?s?u?u?d?l?u?l +?s?s?u?u?d?l?u?u +?s?s?u?u?d?l?u?s +?s?s?u?u?d?l?s?d +?s?s?u?u?d?l?s?l +?s?s?u?u?d?l?s?u +?s?s?u?u?d?l?s?s +?s?s?u?u?d?u?d?l +?s?s?u?u?d?u?l?d +?s?s?u?u?d?u?l?l +?s?s?u?u?d?u?l?u +?s?s?u?u?d?u?l?s +?s?s?u?u?d?u?u?l +?s?s?u?u?d?u?s?l +?s?s?u?u?d?s?d?l +?s?s?u?u?d?s?l?d +?s?s?u?u?d?s?l?l +?s?s?u?u?d?s?l?u +?s?s?u?u?d?s?l?s +?s?s?u?u?d?s?u?l +?s?s?u?u?d?s?s?l +?s?s?u?u?l?d?d?d +?s?s?u?u?l?d?d?l +?s?s?u?u?l?d?d?u +?s?s?u?u?l?d?d?s +?s?s?u?u?l?d?l?d +?s?s?u?u?l?d?l?l +?s?s?u?u?l?d?l?u +?s?s?u?u?l?d?l?s +?s?s?u?u?l?d?u?d +?s?s?u?u?l?d?u?l +?s?s?u?u?l?d?u?u +?s?s?u?u?l?d?u?s +?s?s?u?u?l?d?s?d +?s?s?u?u?l?d?s?l +?s?s?u?u?l?d?s?u +?s?s?u?u?l?d?s?s +?s?s?u?u?l?l?d?d +?s?s?u?u?l?l?d?l +?s?s?u?u?l?l?d?u +?s?s?u?u?l?l?d?s +?s?s?u?u?l?l?l?d +?s?s?u?u?l?l?u?d +?s?s?u?u?l?l?s?d +?s?s?u?u?l?u?d?d +?s?s?u?u?l?u?d?l +?s?s?u?u?l?u?d?u +?s?s?u?u?l?u?d?s +?s?s?u?u?l?u?l?d +?s?s?u?u?l?u?u?d +?s?s?u?u?l?u?s?d +?s?s?u?u?l?s?d?d +?s?s?u?u?l?s?d?l +?s?s?u?u?l?s?d?u +?s?s?u?u?l?s?d?s +?s?s?u?u?l?s?l?d +?s?s?u?u?l?s?u?d +?s?s?u?u?l?s?s?d +?s?s?u?u?u?d?d?l +?s?s?u?u?u?d?l?d +?s?s?u?u?u?d?l?l +?s?s?u?u?u?d?l?u +?s?s?u?u?u?d?l?s +?s?s?u?u?u?d?u?l +?s?s?u?u?u?d?s?l +?s?s?u?u?u?l?d?d +?s?s?u?u?u?l?d?l +?s?s?u?u?u?l?d?u +?s?s?u?u?u?l?d?s +?s?s?u?u?u?l?l?d +?s?s?u?u?u?l?u?d +?s?s?u?u?u?l?s?d +?s?s?u?u?u?u?d?l +?s?s?u?u?u?u?l?d +?s?s?u?u?u?s?d?l +?s?s?u?u?u?s?l?d +?s?s?u?u?s?d?d?l +?s?s?u?u?s?d?l?d +?s?s?u?u?s?d?l?l +?s?s?u?u?s?d?l?u +?s?s?u?u?s?d?l?s +?s?s?u?u?s?d?u?l +?s?s?u?u?s?d?s?l +?s?s?u?u?s?l?d?d +?s?s?u?u?s?l?d?l +?s?s?u?u?s?l?d?u +?s?s?u?u?s?l?d?s +?s?s?u?u?s?l?l?d +?s?s?u?u?s?l?u?d +?s?s?u?u?s?l?s?d +?s?s?u?u?s?u?d?l +?s?s?u?u?s?u?l?d +?s?s?u?u?s?s?d?l +?s?s?u?u?s?s?l?d +?s?s?u?s?d?d?d?l +?s?s?u?s?d?d?l?d +?s?s?u?s?d?d?l?l +?s?s?u?s?d?d?l?u +?s?s?u?s?d?d?l?s +?s?s?u?s?d?d?u?l +?s?s?u?s?d?d?s?l +?s?s?u?s?d?l?d?d +?s?s?u?s?d?l?d?l +?s?s?u?s?d?l?d?u +?s?s?u?s?d?l?d?s +?s?s?u?s?d?l?l?d +?s?s?u?s?d?l?l?l +?s?s?u?s?d?l?l?u +?s?s?u?s?d?l?l?s +?s?s?u?s?d?l?u?d +?s?s?u?s?d?l?u?l +?s?s?u?s?d?l?u?u +?s?s?u?s?d?l?u?s +?s?s?u?s?d?l?s?d +?s?s?u?s?d?l?s?l +?s?s?u?s?d?l?s?u +?s?s?u?s?d?l?s?s +?s?s?u?s?d?u?d?l +?s?s?u?s?d?u?l?d +?s?s?u?s?d?u?l?l +?s?s?u?s?d?u?l?u +?s?s?u?s?d?u?l?s +?s?s?u?s?d?u?u?l +?s?s?u?s?d?u?s?l +?s?s?u?s?d?s?d?l +?s?s?u?s?d?s?l?d +?s?s?u?s?d?s?l?l +?s?s?u?s?d?s?l?u +?s?s?u?s?d?s?l?s +?s?s?u?s?d?s?u?l +?s?s?u?s?d?s?s?l +?s?s?u?s?l?d?d?d +?s?s?u?s?l?d?d?l +?s?s?u?s?l?d?d?u +?s?s?u?s?l?d?d?s +?s?s?u?s?l?d?l?d +?s?s?u?s?l?d?l?l +?s?s?u?s?l?d?l?u +?s?s?u?s?l?d?l?s +?s?s?u?s?l?d?u?d +?s?s?u?s?l?d?u?l +?s?s?u?s?l?d?u?u +?s?s?u?s?l?d?u?s +?s?s?u?s?l?d?s?d +?s?s?u?s?l?d?s?l +?s?s?u?s?l?d?s?u +?s?s?u?s?l?d?s?s +?s?s?u?s?l?l?d?d +?s?s?u?s?l?l?d?l +?s?s?u?s?l?l?d?u +?s?s?u?s?l?l?d?s +?s?s?u?s?l?l?l?d +?s?s?u?s?l?l?u?d +?s?s?u?s?l?l?s?d +?s?s?u?s?l?u?d?d +?s?s?u?s?l?u?d?l +?s?s?u?s?l?u?d?u +?s?s?u?s?l?u?d?s +?s?s?u?s?l?u?l?d +?s?s?u?s?l?u?u?d +?s?s?u?s?l?u?s?d +?s?s?u?s?l?s?d?d +?s?s?u?s?l?s?d?l +?s?s?u?s?l?s?d?u +?s?s?u?s?l?s?d?s +?s?s?u?s?l?s?l?d +?s?s?u?s?l?s?u?d +?s?s?u?s?l?s?s?d +?s?s?u?s?u?d?d?l +?s?s?u?s?u?d?l?d +?s?s?u?s?u?d?l?l +?s?s?u?s?u?d?l?u +?s?s?u?s?u?d?l?s +?s?s?u?s?u?d?u?l +?s?s?u?s?u?d?s?l +?s?s?u?s?u?l?d?d +?s?s?u?s?u?l?d?l +?s?s?u?s?u?l?d?u +?s?s?u?s?u?l?d?s +?s?s?u?s?u?l?l?d +?s?s?u?s?u?l?u?d +?s?s?u?s?u?l?s?d +?s?s?u?s?u?u?d?l +?s?s?u?s?u?u?l?d +?s?s?u?s?u?s?d?l +?s?s?u?s?u?s?l?d +?s?s?u?s?s?d?d?l +?s?s?u?s?s?d?l?d +?s?s?u?s?s?d?l?l +?s?s?u?s?s?d?l?u +?s?s?u?s?s?d?l?s +?s?s?u?s?s?d?u?l +?s?s?u?s?s?d?s?l +?s?s?u?s?s?l?d?d +?s?s?u?s?s?l?d?l +?s?s?u?s?s?l?d?u +?s?s?u?s?s?l?d?s +?s?s?u?s?s?l?l?d +?s?s?u?s?s?l?u?d +?s?s?u?s?s?l?s?d +?s?s?u?s?s?u?d?l +?s?s?u?s?s?u?l?d +?s?s?u?s?s?s?d?l +?s?s?u?s?s?s?l?d +?s?s?s?d?d?d?l?u +?s?s?s?d?d?d?u?l +?s?s?s?d?d?l?d?u +?s?s?s?d?d?l?l?u +?s?s?s?d?d?l?u?d +?s?s?s?d?d?l?u?l +?s?s?s?d?d?l?u?u +?s?s?s?d?d?l?u?s +?s?s?s?d?d?l?s?u +?s?s?s?d?d?u?d?l +?s?s?s?d?d?u?l?d +?s?s?s?d?d?u?l?l +?s?s?s?d?d?u?l?u +?s?s?s?d?d?u?l?s +?s?s?s?d?d?u?u?l +?s?s?s?d?d?u?s?l +?s?s?s?d?d?s?l?u +?s?s?s?d?d?s?u?l +?s?s?s?d?l?d?d?u +?s?s?s?d?l?d?l?u +?s?s?s?d?l?d?u?d +?s?s?s?d?l?d?u?l +?s?s?s?d?l?d?u?u +?s?s?s?d?l?d?u?s +?s?s?s?d?l?d?s?u +?s?s?s?d?l?l?d?u +?s?s?s?d?l?l?l?u +?s?s?s?d?l?l?u?d +?s?s?s?d?l?l?u?l +?s?s?s?d?l?l?u?u +?s?s?s?d?l?l?u?s +?s?s?s?d?l?l?s?u +?s?s?s?d?l?u?d?d +?s?s?s?d?l?u?d?l +?s?s?s?d?l?u?d?u +?s?s?s?d?l?u?d?s +?s?s?s?d?l?u?l?d +?s?s?s?d?l?u?l?l +?s?s?s?d?l?u?l?u +?s?s?s?d?l?u?l?s +?s?s?s?d?l?u?u?d +?s?s?s?d?l?u?u?l +?s?s?s?d?l?u?u?u +?s?s?s?d?l?u?u?s +?s?s?s?d?l?u?s?d +?s?s?s?d?l?u?s?l +?s?s?s?d?l?u?s?u +?s?s?s?d?l?u?s?s +?s?s?s?d?l?s?d?u +?s?s?s?d?l?s?l?u +?s?s?s?d?l?s?u?d +?s?s?s?d?l?s?u?l +?s?s?s?d?l?s?u?u +?s?s?s?d?l?s?u?s +?s?s?s?d?l?s?s?u +?s?s?s?d?u?d?d?l +?s?s?s?d?u?d?l?d +?s?s?s?d?u?d?l?l +?s?s?s?d?u?d?l?u +?s?s?s?d?u?d?l?s +?s?s?s?d?u?d?u?l +?s?s?s?d?u?d?s?l +?s?s?s?d?u?l?d?d +?s?s?s?d?u?l?d?l +?s?s?s?d?u?l?d?u +?s?s?s?d?u?l?d?s +?s?s?s?d?u?l?l?d +?s?s?s?d?u?l?l?l +?s?s?s?d?u?l?l?u +?s?s?s?d?u?l?l?s +?s?s?s?d?u?l?u?d +?s?s?s?d?u?l?u?l +?s?s?s?d?u?l?u?u +?s?s?s?d?u?l?u?s +?s?s?s?d?u?l?s?d +?s?s?s?d?u?l?s?l +?s?s?s?d?u?l?s?u +?s?s?s?d?u?l?s?s +?s?s?s?d?u?u?d?l +?s?s?s?d?u?u?l?d +?s?s?s?d?u?u?l?l +?s?s?s?d?u?u?l?u +?s?s?s?d?u?u?l?s +?s?s?s?d?u?u?u?l +?s?s?s?d?u?u?s?l +?s?s?s?d?u?s?d?l +?s?s?s?d?u?s?l?d +?s?s?s?d?u?s?l?l +?s?s?s?d?u?s?l?u +?s?s?s?d?u?s?l?s +?s?s?s?d?u?s?u?l +?s?s?s?d?u?s?s?l +?s?s?s?d?s?d?l?u +?s?s?s?d?s?d?u?l +?s?s?s?d?s?l?d?u +?s?s?s?d?s?l?l?u +?s?s?s?d?s?l?u?d +?s?s?s?d?s?l?u?l +?s?s?s?d?s?l?u?u +?s?s?s?d?s?l?u?s +?s?s?s?d?s?l?s?u +?s?s?s?d?s?u?d?l +?s?s?s?d?s?u?l?d +?s?s?s?d?s?u?l?l +?s?s?s?d?s?u?l?u +?s?s?s?d?s?u?l?s +?s?s?s?d?s?u?u?l +?s?s?s?d?s?u?s?l +?s?s?s?d?s?s?l?u +?s?s?s?d?s?s?u?l +?s?s?s?l?d?d?d?u +?s?s?s?l?d?d?l?u +?s?s?s?l?d?d?u?d +?s?s?s?l?d?d?u?l +?s?s?s?l?d?d?u?u +?s?s?s?l?d?d?u?s +?s?s?s?l?d?d?s?u +?s?s?s?l?d?l?d?u +?s?s?s?l?d?l?l?u +?s?s?s?l?d?l?u?d +?s?s?s?l?d?l?u?l +?s?s?s?l?d?l?u?u +?s?s?s?l?d?l?u?s +?s?s?s?l?d?l?s?u +?s?s?s?l?d?u?d?d +?s?s?s?l?d?u?d?l +?s?s?s?l?d?u?d?u +?s?s?s?l?d?u?d?s +?s?s?s?l?d?u?l?d +?s?s?s?l?d?u?l?l +?s?s?s?l?d?u?l?u +?s?s?s?l?d?u?l?s +?s?s?s?l?d?u?u?d +?s?s?s?l?d?u?u?l +?s?s?s?l?d?u?u?u +?s?s?s?l?d?u?u?s +?s?s?s?l?d?u?s?d +?s?s?s?l?d?u?s?l +?s?s?s?l?d?u?s?u +?s?s?s?l?d?u?s?s +?s?s?s?l?d?s?d?u +?s?s?s?l?d?s?l?u +?s?s?s?l?d?s?u?d +?s?s?s?l?d?s?u?l +?s?s?s?l?d?s?u?u +?s?s?s?l?d?s?u?s +?s?s?s?l?d?s?s?u +?s?s?s?l?l?d?d?u +?s?s?s?l?l?d?l?u +?s?s?s?l?l?d?u?d +?s?s?s?l?l?d?u?l +?s?s?s?l?l?d?u?u +?s?s?s?l?l?d?u?s +?s?s?s?l?l?d?s?u +?s?s?s?l?l?l?d?u +?s?s?s?l?l?l?u?d +?s?s?s?l?l?u?d?d +?s?s?s?l?l?u?d?l +?s?s?s?l?l?u?d?u +?s?s?s?l?l?u?d?s +?s?s?s?l?l?u?l?d +?s?s?s?l?l?u?u?d +?s?s?s?l?l?u?s?d +?s?s?s?l?l?s?d?u +?s?s?s?l?l?s?u?d +?s?s?s?l?u?d?d?d +?s?s?s?l?u?d?d?l +?s?s?s?l?u?d?d?u +?s?s?s?l?u?d?d?s +?s?s?s?l?u?d?l?d +?s?s?s?l?u?d?l?l +?s?s?s?l?u?d?l?u +?s?s?s?l?u?d?l?s +?s?s?s?l?u?d?u?d +?s?s?s?l?u?d?u?l +?s?s?s?l?u?d?u?u +?s?s?s?l?u?d?u?s +?s?s?s?l?u?d?s?d +?s?s?s?l?u?d?s?l +?s?s?s?l?u?d?s?u +?s?s?s?l?u?d?s?s +?s?s?s?l?u?l?d?d +?s?s?s?l?u?l?d?l +?s?s?s?l?u?l?d?u +?s?s?s?l?u?l?d?s +?s?s?s?l?u?l?l?d +?s?s?s?l?u?l?u?d +?s?s?s?l?u?l?s?d +?s?s?s?l?u?u?d?d +?s?s?s?l?u?u?d?l +?s?s?s?l?u?u?d?u +?s?s?s?l?u?u?d?s +?s?s?s?l?u?u?l?d +?s?s?s?l?u?u?u?d +?s?s?s?l?u?u?s?d +?s?s?s?l?u?s?d?d +?s?s?s?l?u?s?d?l +?s?s?s?l?u?s?d?u +?s?s?s?l?u?s?d?s +?s?s?s?l?u?s?l?d +?s?s?s?l?u?s?u?d +?s?s?s?l?u?s?s?d +?s?s?s?l?s?d?d?u +?s?s?s?l?s?d?l?u +?s?s?s?l?s?d?u?d +?s?s?s?l?s?d?u?l +?s?s?s?l?s?d?u?u +?s?s?s?l?s?d?u?s +?s?s?s?l?s?d?s?u +?s?s?s?l?s?l?d?u +?s?s?s?l?s?l?u?d +?s?s?s?l?s?u?d?d +?s?s?s?l?s?u?d?l +?s?s?s?l?s?u?d?u +?s?s?s?l?s?u?d?s +?s?s?s?l?s?u?l?d +?s?s?s?l?s?u?u?d +?s?s?s?l?s?u?s?d +?s?s?s?l?s?s?d?u +?s?s?s?l?s?s?u?d +?s?s?s?u?d?d?d?l +?s?s?s?u?d?d?l?d +?s?s?s?u?d?d?l?l +?s?s?s?u?d?d?l?u +?s?s?s?u?d?d?l?s +?s?s?s?u?d?d?u?l +?s?s?s?u?d?d?s?l +?s?s?s?u?d?l?d?d +?s?s?s?u?d?l?d?l +?s?s?s?u?d?l?d?u +?s?s?s?u?d?l?d?s +?s?s?s?u?d?l?l?d +?s?s?s?u?d?l?l?l +?s?s?s?u?d?l?l?u +?s?s?s?u?d?l?l?s +?s?s?s?u?d?l?u?d +?s?s?s?u?d?l?u?l +?s?s?s?u?d?l?u?u +?s?s?s?u?d?l?u?s +?s?s?s?u?d?l?s?d +?s?s?s?u?d?l?s?l +?s?s?s?u?d?l?s?u +?s?s?s?u?d?l?s?s +?s?s?s?u?d?u?d?l +?s?s?s?u?d?u?l?d +?s?s?s?u?d?u?l?l +?s?s?s?u?d?u?l?u +?s?s?s?u?d?u?l?s +?s?s?s?u?d?u?u?l +?s?s?s?u?d?u?s?l +?s?s?s?u?d?s?d?l +?s?s?s?u?d?s?l?d +?s?s?s?u?d?s?l?l +?s?s?s?u?d?s?l?u +?s?s?s?u?d?s?l?s +?s?s?s?u?d?s?u?l +?s?s?s?u?d?s?s?l +?s?s?s?u?l?d?d?d +?s?s?s?u?l?d?d?l +?s?s?s?u?l?d?d?u +?s?s?s?u?l?d?d?s +?s?s?s?u?l?d?l?d +?s?s?s?u?l?d?l?l +?s?s?s?u?l?d?l?u +?s?s?s?u?l?d?l?s +?s?s?s?u?l?d?u?d +?s?s?s?u?l?d?u?l +?s?s?s?u?l?d?u?u +?s?s?s?u?l?d?u?s +?s?s?s?u?l?d?s?d +?s?s?s?u?l?d?s?l +?s?s?s?u?l?d?s?u +?s?s?s?u?l?d?s?s +?s?s?s?u?l?l?d?d +?s?s?s?u?l?l?d?l +?s?s?s?u?l?l?d?u +?s?s?s?u?l?l?d?s +?s?s?s?u?l?l?l?d +?s?s?s?u?l?l?u?d +?s?s?s?u?l?l?s?d +?s?s?s?u?l?u?d?d +?s?s?s?u?l?u?d?l +?s?s?s?u?l?u?d?u +?s?s?s?u?l?u?d?s +?s?s?s?u?l?u?l?d +?s?s?s?u?l?u?u?d +?s?s?s?u?l?u?s?d +?s?s?s?u?l?s?d?d +?s?s?s?u?l?s?d?l +?s?s?s?u?l?s?d?u +?s?s?s?u?l?s?d?s +?s?s?s?u?l?s?l?d +?s?s?s?u?l?s?u?d +?s?s?s?u?l?s?s?d +?s?s?s?u?u?d?d?l +?s?s?s?u?u?d?l?d +?s?s?s?u?u?d?l?l +?s?s?s?u?u?d?l?u +?s?s?s?u?u?d?l?s +?s?s?s?u?u?d?u?l +?s?s?s?u?u?d?s?l +?s?s?s?u?u?l?d?d +?s?s?s?u?u?l?d?l +?s?s?s?u?u?l?d?u +?s?s?s?u?u?l?d?s +?s?s?s?u?u?l?l?d +?s?s?s?u?u?l?u?d +?s?s?s?u?u?l?s?d +?s?s?s?u?u?u?d?l +?s?s?s?u?u?u?l?d +?s?s?s?u?u?s?d?l +?s?s?s?u?u?s?l?d +?s?s?s?u?s?d?d?l +?s?s?s?u?s?d?l?d +?s?s?s?u?s?d?l?l +?s?s?s?u?s?d?l?u +?s?s?s?u?s?d?l?s +?s?s?s?u?s?d?u?l +?s?s?s?u?s?d?s?l +?s?s?s?u?s?l?d?d +?s?s?s?u?s?l?d?l +?s?s?s?u?s?l?d?u +?s?s?s?u?s?l?d?s +?s?s?s?u?s?l?l?d +?s?s?s?u?s?l?u?d +?s?s?s?u?s?l?s?d +?s?s?s?u?s?u?d?l +?s?s?s?u?s?u?l?d +?s?s?s?u?s?s?d?l +?s?s?s?u?s?s?l?d +?s?s?s?s?d?d?l?u +?s?s?s?s?d?d?u?l +?s?s?s?s?d?l?d?u +?s?s?s?s?d?l?l?u +?s?s?s?s?d?l?u?d +?s?s?s?s?d?l?u?l +?s?s?s?s?d?l?u?u +?s?s?s?s?d?l?u?s +?s?s?s?s?d?l?s?u +?s?s?s?s?d?u?d?l +?s?s?s?s?d?u?l?d +?s?s?s?s?d?u?l?l +?s?s?s?s?d?u?l?u +?s?s?s?s?d?u?l?s +?s?s?s?s?d?u?u?l +?s?s?s?s?d?u?s?l +?s?s?s?s?d?s?l?u +?s?s?s?s?d?s?u?l +?s?s?s?s?l?d?d?u +?s?s?s?s?l?d?l?u +?s?s?s?s?l?d?u?d +?s?s?s?s?l?d?u?l +?s?s?s?s?l?d?u?u +?s?s?s?s?l?d?u?s +?s?s?s?s?l?d?s?u +?s?s?s?s?l?l?d?u +?s?s?s?s?l?l?u?d +?s?s?s?s?l?u?d?d +?s?s?s?s?l?u?d?l +?s?s?s?s?l?u?d?u +?s?s?s?s?l?u?d?s +?s?s?s?s?l?u?l?d +?s?s?s?s?l?u?u?d +?s?s?s?s?l?u?s?d +?s?s?s?s?l?s?d?u +?s?s?s?s?l?s?u?d +?s?s?s?s?u?d?d?l +?s?s?s?s?u?d?l?d +?s?s?s?s?u?d?l?l +?s?s?s?s?u?d?l?u +?s?s?s?s?u?d?l?s +?s?s?s?s?u?d?u?l +?s?s?s?s?u?d?s?l +?s?s?s?s?u?l?d?d +?s?s?s?s?u?l?d?l +?s?s?s?s?u?l?d?u +?s?s?s?s?u?l?d?s +?s?s?s?s?u?l?l?d +?s?s?s?s?u?l?u?d +?s?s?s?s?u?l?s?d +?s?s?s?s?u?u?d?l +?s?s?s?s?u?u?l?d +?s?s?s?s?u?s?d?l +?s?s?s?s?u?s?l?d +?s?s?s?s?s?d?l?u +?s?s?s?s?s?d?u?l +?s?s?s?s?s?l?d?u +?s?s?s?s?s?l?u?d +?s?s?s?s?s?u?d?l +?s?s?s?s?s?u?l?d diff --git a/masks/8char-1l-1u-1d-1s-noncompliant.hcmask b/masks/8char-1l-1u-1d-1s-noncompliant.hcmask new file mode 100644 index 0000000000..ef6a697926 --- /dev/null +++ b/masks/8char-1l-1u-1d-1s-noncompliant.hcmask @@ -0,0 +1,24712 @@ +?d?d?d?d?d?d?d?d +?d?d?d?d?d?d?d?l +?d?d?d?d?d?d?d?u +?d?d?d?d?d?d?d?s +?d?d?d?d?d?d?l?d +?d?d?d?d?d?d?l?l +?d?d?d?d?d?d?l?u +?d?d?d?d?d?d?l?s +?d?d?d?d?d?d?u?d +?d?d?d?d?d?d?u?l +?d?d?d?d?d?d?u?u +?d?d?d?d?d?d?u?s +?d?d?d?d?d?d?s?d +?d?d?d?d?d?d?s?l +?d?d?d?d?d?d?s?u +?d?d?d?d?d?d?s?s +?d?d?d?d?d?l?d?d +?d?d?d?d?d?l?d?l +?d?d?d?d?d?l?d?u +?d?d?d?d?d?l?d?s +?d?d?d?d?d?l?l?d +?d?d?d?d?d?l?l?l +?d?d?d?d?d?l?l?u +?d?d?d?d?d?l?l?s +?d?d?d?d?d?l?u?d +?d?d?d?d?d?l?u?l +?d?d?d?d?d?l?u?u +?d?d?d?d?d?l?s?d +?d?d?d?d?d?l?s?l +?d?d?d?d?d?l?s?s +?d?d?d?d?d?u?d?d +?d?d?d?d?d?u?d?l +?d?d?d?d?d?u?d?u +?d?d?d?d?d?u?d?s +?d?d?d?d?d?u?l?d +?d?d?d?d?d?u?l?l +?d?d?d?d?d?u?l?u +?d?d?d?d?d?u?u?d +?d?d?d?d?d?u?u?l +?d?d?d?d?d?u?u?u +?d?d?d?d?d?u?u?s +?d?d?d?d?d?u?s?d +?d?d?d?d?d?u?s?u +?d?d?d?d?d?u?s?s +?d?d?d?d?d?s?d?d +?d?d?d?d?d?s?d?l +?d?d?d?d?d?s?d?u +?d?d?d?d?d?s?d?s +?d?d?d?d?d?s?l?d +?d?d?d?d?d?s?l?l +?d?d?d?d?d?s?l?s +?d?d?d?d?d?s?u?d +?d?d?d?d?d?s?u?u +?d?d?d?d?d?s?u?s +?d?d?d?d?d?s?s?d +?d?d?d?d?d?s?s?l +?d?d?d?d?d?s?s?u +?d?d?d?d?d?s?s?s +?d?d?d?d?l?d?d?d +?d?d?d?d?l?d?d?l +?d?d?d?d?l?d?d?u +?d?d?d?d?l?d?d?s +?d?d?d?d?l?d?l?d +?d?d?d?d?l?d?l?l +?d?d?d?d?l?d?l?u +?d?d?d?d?l?d?l?s +?d?d?d?d?l?d?u?d +?d?d?d?d?l?d?u?l +?d?d?d?d?l?d?u?u +?d?d?d?d?l?d?s?d +?d?d?d?d?l?d?s?l +?d?d?d?d?l?d?s?s +?d?d?d?d?l?l?d?d +?d?d?d?d?l?l?d?l +?d?d?d?d?l?l?d?u +?d?d?d?d?l?l?d?s +?d?d?d?d?l?l?l?d +?d?d?d?d?l?l?l?l +?d?d?d?d?l?l?l?u +?d?d?d?d?l?l?l?s +?d?d?d?d?l?l?u?d +?d?d?d?d?l?l?u?l +?d?d?d?d?l?l?u?u +?d?d?d?d?l?l?s?d +?d?d?d?d?l?l?s?l +?d?d?d?d?l?l?s?s +?d?d?d?d?l?u?d?d +?d?d?d?d?l?u?d?l +?d?d?d?d?l?u?d?u +?d?d?d?d?l?u?l?d +?d?d?d?d?l?u?l?l +?d?d?d?d?l?u?l?u +?d?d?d?d?l?u?u?d +?d?d?d?d?l?u?u?l +?d?d?d?d?l?u?u?u +?d?d?d?d?l?s?d?d +?d?d?d?d?l?s?d?l +?d?d?d?d?l?s?d?s +?d?d?d?d?l?s?l?d +?d?d?d?d?l?s?l?l +?d?d?d?d?l?s?l?s +?d?d?d?d?l?s?s?d +?d?d?d?d?l?s?s?l +?d?d?d?d?l?s?s?s +?d?d?d?d?u?d?d?d +?d?d?d?d?u?d?d?l +?d?d?d?d?u?d?d?u +?d?d?d?d?u?d?d?s +?d?d?d?d?u?d?l?d +?d?d?d?d?u?d?l?l +?d?d?d?d?u?d?l?u +?d?d?d?d?u?d?u?d +?d?d?d?d?u?d?u?l +?d?d?d?d?u?d?u?u +?d?d?d?d?u?d?u?s +?d?d?d?d?u?d?s?d +?d?d?d?d?u?d?s?u +?d?d?d?d?u?d?s?s +?d?d?d?d?u?l?d?d +?d?d?d?d?u?l?d?l +?d?d?d?d?u?l?d?u +?d?d?d?d?u?l?l?d +?d?d?d?d?u?l?l?l +?d?d?d?d?u?l?l?u +?d?d?d?d?u?l?u?d +?d?d?d?d?u?l?u?l +?d?d?d?d?u?l?u?u +?d?d?d?d?u?u?d?d +?d?d?d?d?u?u?d?l +?d?d?d?d?u?u?d?u +?d?d?d?d?u?u?d?s +?d?d?d?d?u?u?l?d +?d?d?d?d?u?u?l?l +?d?d?d?d?u?u?l?u +?d?d?d?d?u?u?u?d +?d?d?d?d?u?u?u?l +?d?d?d?d?u?u?u?u +?d?d?d?d?u?u?u?s +?d?d?d?d?u?u?s?d +?d?d?d?d?u?u?s?u +?d?d?d?d?u?u?s?s +?d?d?d?d?u?s?d?d +?d?d?d?d?u?s?d?u +?d?d?d?d?u?s?d?s +?d?d?d?d?u?s?u?d +?d?d?d?d?u?s?u?u +?d?d?d?d?u?s?u?s +?d?d?d?d?u?s?s?d +?d?d?d?d?u?s?s?u +?d?d?d?d?u?s?s?s +?d?d?d?d?s?d?d?d +?d?d?d?d?s?d?d?l +?d?d?d?d?s?d?d?u +?d?d?d?d?s?d?d?s +?d?d?d?d?s?d?l?d +?d?d?d?d?s?d?l?l +?d?d?d?d?s?d?l?s +?d?d?d?d?s?d?u?d +?d?d?d?d?s?d?u?u +?d?d?d?d?s?d?u?s +?d?d?d?d?s?d?s?d +?d?d?d?d?s?d?s?l +?d?d?d?d?s?d?s?u +?d?d?d?d?s?d?s?s +?d?d?d?d?s?l?d?d +?d?d?d?d?s?l?d?l +?d?d?d?d?s?l?d?s +?d?d?d?d?s?l?l?d +?d?d?d?d?s?l?l?l +?d?d?d?d?s?l?l?s +?d?d?d?d?s?l?s?d +?d?d?d?d?s?l?s?l +?d?d?d?d?s?l?s?s +?d?d?d?d?s?u?d?d +?d?d?d?d?s?u?d?u +?d?d?d?d?s?u?d?s +?d?d?d?d?s?u?u?d +?d?d?d?d?s?u?u?u +?d?d?d?d?s?u?u?s +?d?d?d?d?s?u?s?d +?d?d?d?d?s?u?s?u +?d?d?d?d?s?u?s?s +?d?d?d?d?s?s?d?d +?d?d?d?d?s?s?d?l +?d?d?d?d?s?s?d?u +?d?d?d?d?s?s?d?s +?d?d?d?d?s?s?l?d +?d?d?d?d?s?s?l?l +?d?d?d?d?s?s?l?s +?d?d?d?d?s?s?u?d +?d?d?d?d?s?s?u?u +?d?d?d?d?s?s?u?s +?d?d?d?d?s?s?s?d +?d?d?d?d?s?s?s?l +?d?d?d?d?s?s?s?u +?d?d?d?d?s?s?s?s +?d?d?d?l?d?d?d?d +?d?d?d?l?d?d?d?l +?d?d?d?l?d?d?d?u +?d?d?d?l?d?d?d?s +?d?d?d?l?d?d?l?d +?d?d?d?l?d?d?l?l +?d?d?d?l?d?d?l?u +?d?d?d?l?d?d?l?s +?d?d?d?l?d?d?u?d +?d?d?d?l?d?d?u?l +?d?d?d?l?d?d?u?u +?d?d?d?l?d?d?s?d +?d?d?d?l?d?d?s?l +?d?d?d?l?d?d?s?s +?d?d?d?l?d?l?d?d +?d?d?d?l?d?l?d?l +?d?d?d?l?d?l?d?u +?d?d?d?l?d?l?d?s +?d?d?d?l?d?l?l?d +?d?d?d?l?d?l?l?l +?d?d?d?l?d?l?l?u +?d?d?d?l?d?l?l?s +?d?d?d?l?d?l?u?d +?d?d?d?l?d?l?u?l +?d?d?d?l?d?l?u?u +?d?d?d?l?d?l?s?d +?d?d?d?l?d?l?s?l +?d?d?d?l?d?l?s?s +?d?d?d?l?d?u?d?d +?d?d?d?l?d?u?d?l +?d?d?d?l?d?u?d?u +?d?d?d?l?d?u?l?d +?d?d?d?l?d?u?l?l +?d?d?d?l?d?u?l?u +?d?d?d?l?d?u?u?d +?d?d?d?l?d?u?u?l +?d?d?d?l?d?u?u?u +?d?d?d?l?d?s?d?d +?d?d?d?l?d?s?d?l +?d?d?d?l?d?s?d?s +?d?d?d?l?d?s?l?d +?d?d?d?l?d?s?l?l +?d?d?d?l?d?s?l?s +?d?d?d?l?d?s?s?d +?d?d?d?l?d?s?s?l +?d?d?d?l?d?s?s?s +?d?d?d?l?l?d?d?d +?d?d?d?l?l?d?d?l +?d?d?d?l?l?d?d?u +?d?d?d?l?l?d?d?s +?d?d?d?l?l?d?l?d +?d?d?d?l?l?d?l?l +?d?d?d?l?l?d?l?u +?d?d?d?l?l?d?l?s +?d?d?d?l?l?d?u?d +?d?d?d?l?l?d?u?l +?d?d?d?l?l?d?u?u +?d?d?d?l?l?d?s?d +?d?d?d?l?l?d?s?l +?d?d?d?l?l?d?s?s +?d?d?d?l?l?l?d?d +?d?d?d?l?l?l?d?l +?d?d?d?l?l?l?d?u +?d?d?d?l?l?l?d?s +?d?d?d?l?l?l?l?d +?d?d?d?l?l?l?l?l +?d?d?d?l?l?l?l?u +?d?d?d?l?l?l?l?s +?d?d?d?l?l?l?u?d +?d?d?d?l?l?l?u?l +?d?d?d?l?l?l?u?u +?d?d?d?l?l?l?s?d +?d?d?d?l?l?l?s?l +?d?d?d?l?l?l?s?s +?d?d?d?l?l?u?d?d +?d?d?d?l?l?u?d?l +?d?d?d?l?l?u?d?u +?d?d?d?l?l?u?l?d +?d?d?d?l?l?u?l?l +?d?d?d?l?l?u?l?u +?d?d?d?l?l?u?u?d +?d?d?d?l?l?u?u?l +?d?d?d?l?l?u?u?u +?d?d?d?l?l?s?d?d +?d?d?d?l?l?s?d?l +?d?d?d?l?l?s?d?s +?d?d?d?l?l?s?l?d +?d?d?d?l?l?s?l?l +?d?d?d?l?l?s?l?s +?d?d?d?l?l?s?s?d +?d?d?d?l?l?s?s?l +?d?d?d?l?l?s?s?s +?d?d?d?l?u?d?d?d +?d?d?d?l?u?d?d?l +?d?d?d?l?u?d?d?u +?d?d?d?l?u?d?l?d +?d?d?d?l?u?d?l?l +?d?d?d?l?u?d?l?u +?d?d?d?l?u?d?u?d +?d?d?d?l?u?d?u?l +?d?d?d?l?u?d?u?u +?d?d?d?l?u?l?d?d +?d?d?d?l?u?l?d?l +?d?d?d?l?u?l?d?u +?d?d?d?l?u?l?l?d +?d?d?d?l?u?l?l?l +?d?d?d?l?u?l?l?u +?d?d?d?l?u?l?u?d +?d?d?d?l?u?l?u?l +?d?d?d?l?u?l?u?u +?d?d?d?l?u?u?d?d +?d?d?d?l?u?u?d?l +?d?d?d?l?u?u?d?u +?d?d?d?l?u?u?l?d +?d?d?d?l?u?u?l?l +?d?d?d?l?u?u?l?u +?d?d?d?l?u?u?u?d +?d?d?d?l?u?u?u?l +?d?d?d?l?u?u?u?u +?d?d?d?l?s?d?d?d +?d?d?d?l?s?d?d?l +?d?d?d?l?s?d?d?s +?d?d?d?l?s?d?l?d +?d?d?d?l?s?d?l?l +?d?d?d?l?s?d?l?s +?d?d?d?l?s?d?s?d +?d?d?d?l?s?d?s?l +?d?d?d?l?s?d?s?s +?d?d?d?l?s?l?d?d +?d?d?d?l?s?l?d?l +?d?d?d?l?s?l?d?s +?d?d?d?l?s?l?l?d +?d?d?d?l?s?l?l?l +?d?d?d?l?s?l?l?s +?d?d?d?l?s?l?s?d +?d?d?d?l?s?l?s?l +?d?d?d?l?s?l?s?s +?d?d?d?l?s?s?d?d +?d?d?d?l?s?s?d?l +?d?d?d?l?s?s?d?s +?d?d?d?l?s?s?l?d +?d?d?d?l?s?s?l?l +?d?d?d?l?s?s?l?s +?d?d?d?l?s?s?s?d +?d?d?d?l?s?s?s?l +?d?d?d?l?s?s?s?s +?d?d?d?u?d?d?d?d +?d?d?d?u?d?d?d?l +?d?d?d?u?d?d?d?u +?d?d?d?u?d?d?d?s +?d?d?d?u?d?d?l?d +?d?d?d?u?d?d?l?l +?d?d?d?u?d?d?l?u +?d?d?d?u?d?d?u?d +?d?d?d?u?d?d?u?l +?d?d?d?u?d?d?u?u +?d?d?d?u?d?d?u?s +?d?d?d?u?d?d?s?d +?d?d?d?u?d?d?s?u +?d?d?d?u?d?d?s?s +?d?d?d?u?d?l?d?d +?d?d?d?u?d?l?d?l +?d?d?d?u?d?l?d?u +?d?d?d?u?d?l?l?d +?d?d?d?u?d?l?l?l +?d?d?d?u?d?l?l?u +?d?d?d?u?d?l?u?d +?d?d?d?u?d?l?u?l +?d?d?d?u?d?l?u?u +?d?d?d?u?d?u?d?d +?d?d?d?u?d?u?d?l +?d?d?d?u?d?u?d?u +?d?d?d?u?d?u?d?s +?d?d?d?u?d?u?l?d +?d?d?d?u?d?u?l?l +?d?d?d?u?d?u?l?u +?d?d?d?u?d?u?u?d +?d?d?d?u?d?u?u?l +?d?d?d?u?d?u?u?u +?d?d?d?u?d?u?u?s +?d?d?d?u?d?u?s?d +?d?d?d?u?d?u?s?u +?d?d?d?u?d?u?s?s +?d?d?d?u?d?s?d?d +?d?d?d?u?d?s?d?u +?d?d?d?u?d?s?d?s +?d?d?d?u?d?s?u?d +?d?d?d?u?d?s?u?u +?d?d?d?u?d?s?u?s +?d?d?d?u?d?s?s?d +?d?d?d?u?d?s?s?u +?d?d?d?u?d?s?s?s +?d?d?d?u?l?d?d?d +?d?d?d?u?l?d?d?l +?d?d?d?u?l?d?d?u +?d?d?d?u?l?d?l?d +?d?d?d?u?l?d?l?l +?d?d?d?u?l?d?l?u +?d?d?d?u?l?d?u?d +?d?d?d?u?l?d?u?l +?d?d?d?u?l?d?u?u +?d?d?d?u?l?l?d?d +?d?d?d?u?l?l?d?l +?d?d?d?u?l?l?d?u +?d?d?d?u?l?l?l?d +?d?d?d?u?l?l?l?l +?d?d?d?u?l?l?l?u +?d?d?d?u?l?l?u?d +?d?d?d?u?l?l?u?l +?d?d?d?u?l?l?u?u +?d?d?d?u?l?u?d?d +?d?d?d?u?l?u?d?l +?d?d?d?u?l?u?d?u +?d?d?d?u?l?u?l?d +?d?d?d?u?l?u?l?l +?d?d?d?u?l?u?l?u +?d?d?d?u?l?u?u?d +?d?d?d?u?l?u?u?l +?d?d?d?u?l?u?u?u +?d?d?d?u?u?d?d?d +?d?d?d?u?u?d?d?l +?d?d?d?u?u?d?d?u +?d?d?d?u?u?d?d?s +?d?d?d?u?u?d?l?d +?d?d?d?u?u?d?l?l +?d?d?d?u?u?d?l?u +?d?d?d?u?u?d?u?d +?d?d?d?u?u?d?u?l +?d?d?d?u?u?d?u?u +?d?d?d?u?u?d?u?s +?d?d?d?u?u?d?s?d +?d?d?d?u?u?d?s?u +?d?d?d?u?u?d?s?s +?d?d?d?u?u?l?d?d +?d?d?d?u?u?l?d?l +?d?d?d?u?u?l?d?u +?d?d?d?u?u?l?l?d +?d?d?d?u?u?l?l?l +?d?d?d?u?u?l?l?u +?d?d?d?u?u?l?u?d +?d?d?d?u?u?l?u?l +?d?d?d?u?u?l?u?u +?d?d?d?u?u?u?d?d +?d?d?d?u?u?u?d?l +?d?d?d?u?u?u?d?u +?d?d?d?u?u?u?d?s +?d?d?d?u?u?u?l?d +?d?d?d?u?u?u?l?l +?d?d?d?u?u?u?l?u +?d?d?d?u?u?u?u?d +?d?d?d?u?u?u?u?l +?d?d?d?u?u?u?u?u +?d?d?d?u?u?u?u?s +?d?d?d?u?u?u?s?d +?d?d?d?u?u?u?s?u +?d?d?d?u?u?u?s?s +?d?d?d?u?u?s?d?d +?d?d?d?u?u?s?d?u +?d?d?d?u?u?s?d?s +?d?d?d?u?u?s?u?d +?d?d?d?u?u?s?u?u +?d?d?d?u?u?s?u?s +?d?d?d?u?u?s?s?d +?d?d?d?u?u?s?s?u +?d?d?d?u?u?s?s?s +?d?d?d?u?s?d?d?d +?d?d?d?u?s?d?d?u +?d?d?d?u?s?d?d?s +?d?d?d?u?s?d?u?d +?d?d?d?u?s?d?u?u +?d?d?d?u?s?d?u?s +?d?d?d?u?s?d?s?d +?d?d?d?u?s?d?s?u +?d?d?d?u?s?d?s?s +?d?d?d?u?s?u?d?d +?d?d?d?u?s?u?d?u +?d?d?d?u?s?u?d?s +?d?d?d?u?s?u?u?d +?d?d?d?u?s?u?u?u +?d?d?d?u?s?u?u?s +?d?d?d?u?s?u?s?d +?d?d?d?u?s?u?s?u +?d?d?d?u?s?u?s?s +?d?d?d?u?s?s?d?d +?d?d?d?u?s?s?d?u +?d?d?d?u?s?s?d?s +?d?d?d?u?s?s?u?d +?d?d?d?u?s?s?u?u +?d?d?d?u?s?s?u?s +?d?d?d?u?s?s?s?d +?d?d?d?u?s?s?s?u +?d?d?d?u?s?s?s?s +?d?d?d?s?d?d?d?d +?d?d?d?s?d?d?d?l +?d?d?d?s?d?d?d?u +?d?d?d?s?d?d?d?s +?d?d?d?s?d?d?l?d +?d?d?d?s?d?d?l?l +?d?d?d?s?d?d?l?s +?d?d?d?s?d?d?u?d +?d?d?d?s?d?d?u?u +?d?d?d?s?d?d?u?s +?d?d?d?s?d?d?s?d +?d?d?d?s?d?d?s?l +?d?d?d?s?d?d?s?u +?d?d?d?s?d?d?s?s +?d?d?d?s?d?l?d?d +?d?d?d?s?d?l?d?l +?d?d?d?s?d?l?d?s +?d?d?d?s?d?l?l?d +?d?d?d?s?d?l?l?l +?d?d?d?s?d?l?l?s +?d?d?d?s?d?l?s?d +?d?d?d?s?d?l?s?l +?d?d?d?s?d?l?s?s +?d?d?d?s?d?u?d?d +?d?d?d?s?d?u?d?u +?d?d?d?s?d?u?d?s +?d?d?d?s?d?u?u?d +?d?d?d?s?d?u?u?u +?d?d?d?s?d?u?u?s +?d?d?d?s?d?u?s?d +?d?d?d?s?d?u?s?u +?d?d?d?s?d?u?s?s +?d?d?d?s?d?s?d?d +?d?d?d?s?d?s?d?l +?d?d?d?s?d?s?d?u +?d?d?d?s?d?s?d?s +?d?d?d?s?d?s?l?d +?d?d?d?s?d?s?l?l +?d?d?d?s?d?s?l?s +?d?d?d?s?d?s?u?d +?d?d?d?s?d?s?u?u +?d?d?d?s?d?s?u?s +?d?d?d?s?d?s?s?d +?d?d?d?s?d?s?s?l +?d?d?d?s?d?s?s?u +?d?d?d?s?d?s?s?s +?d?d?d?s?l?d?d?d +?d?d?d?s?l?d?d?l +?d?d?d?s?l?d?d?s +?d?d?d?s?l?d?l?d +?d?d?d?s?l?d?l?l +?d?d?d?s?l?d?l?s +?d?d?d?s?l?d?s?d +?d?d?d?s?l?d?s?l +?d?d?d?s?l?d?s?s +?d?d?d?s?l?l?d?d +?d?d?d?s?l?l?d?l +?d?d?d?s?l?l?d?s +?d?d?d?s?l?l?l?d +?d?d?d?s?l?l?l?l +?d?d?d?s?l?l?l?s +?d?d?d?s?l?l?s?d +?d?d?d?s?l?l?s?l +?d?d?d?s?l?l?s?s +?d?d?d?s?l?s?d?d +?d?d?d?s?l?s?d?l +?d?d?d?s?l?s?d?s +?d?d?d?s?l?s?l?d +?d?d?d?s?l?s?l?l +?d?d?d?s?l?s?l?s +?d?d?d?s?l?s?s?d +?d?d?d?s?l?s?s?l +?d?d?d?s?l?s?s?s +?d?d?d?s?u?d?d?d +?d?d?d?s?u?d?d?u +?d?d?d?s?u?d?d?s +?d?d?d?s?u?d?u?d +?d?d?d?s?u?d?u?u +?d?d?d?s?u?d?u?s +?d?d?d?s?u?d?s?d +?d?d?d?s?u?d?s?u +?d?d?d?s?u?d?s?s +?d?d?d?s?u?u?d?d +?d?d?d?s?u?u?d?u +?d?d?d?s?u?u?d?s +?d?d?d?s?u?u?u?d +?d?d?d?s?u?u?u?u +?d?d?d?s?u?u?u?s +?d?d?d?s?u?u?s?d +?d?d?d?s?u?u?s?u +?d?d?d?s?u?u?s?s +?d?d?d?s?u?s?d?d +?d?d?d?s?u?s?d?u +?d?d?d?s?u?s?d?s +?d?d?d?s?u?s?u?d +?d?d?d?s?u?s?u?u +?d?d?d?s?u?s?u?s +?d?d?d?s?u?s?s?d +?d?d?d?s?u?s?s?u +?d?d?d?s?u?s?s?s +?d?d?d?s?s?d?d?d +?d?d?d?s?s?d?d?l +?d?d?d?s?s?d?d?u +?d?d?d?s?s?d?d?s +?d?d?d?s?s?d?l?d +?d?d?d?s?s?d?l?l +?d?d?d?s?s?d?l?s +?d?d?d?s?s?d?u?d +?d?d?d?s?s?d?u?u +?d?d?d?s?s?d?u?s +?d?d?d?s?s?d?s?d +?d?d?d?s?s?d?s?l +?d?d?d?s?s?d?s?u +?d?d?d?s?s?d?s?s +?d?d?d?s?s?l?d?d +?d?d?d?s?s?l?d?l +?d?d?d?s?s?l?d?s +?d?d?d?s?s?l?l?d +?d?d?d?s?s?l?l?l +?d?d?d?s?s?l?l?s +?d?d?d?s?s?l?s?d +?d?d?d?s?s?l?s?l +?d?d?d?s?s?l?s?s +?d?d?d?s?s?u?d?d +?d?d?d?s?s?u?d?u +?d?d?d?s?s?u?d?s +?d?d?d?s?s?u?u?d +?d?d?d?s?s?u?u?u +?d?d?d?s?s?u?u?s +?d?d?d?s?s?u?s?d +?d?d?d?s?s?u?s?u +?d?d?d?s?s?u?s?s +?d?d?d?s?s?s?d?d +?d?d?d?s?s?s?d?l +?d?d?d?s?s?s?d?u +?d?d?d?s?s?s?d?s +?d?d?d?s?s?s?l?d +?d?d?d?s?s?s?l?l +?d?d?d?s?s?s?l?s +?d?d?d?s?s?s?u?d +?d?d?d?s?s?s?u?u +?d?d?d?s?s?s?u?s +?d?d?d?s?s?s?s?d +?d?d?d?s?s?s?s?l +?d?d?d?s?s?s?s?u +?d?d?d?s?s?s?s?s +?d?d?l?d?d?d?d?d +?d?d?l?d?d?d?d?l +?d?d?l?d?d?d?d?u +?d?d?l?d?d?d?d?s +?d?d?l?d?d?d?l?d +?d?d?l?d?d?d?l?l +?d?d?l?d?d?d?l?u +?d?d?l?d?d?d?l?s +?d?d?l?d?d?d?u?d +?d?d?l?d?d?d?u?l +?d?d?l?d?d?d?u?u +?d?d?l?d?d?d?s?d +?d?d?l?d?d?d?s?l +?d?d?l?d?d?d?s?s +?d?d?l?d?d?l?d?d +?d?d?l?d?d?l?d?l +?d?d?l?d?d?l?d?u +?d?d?l?d?d?l?d?s +?d?d?l?d?d?l?l?d +?d?d?l?d?d?l?l?l +?d?d?l?d?d?l?l?u +?d?d?l?d?d?l?l?s +?d?d?l?d?d?l?u?d +?d?d?l?d?d?l?u?l +?d?d?l?d?d?l?u?u +?d?d?l?d?d?l?s?d +?d?d?l?d?d?l?s?l +?d?d?l?d?d?l?s?s +?d?d?l?d?d?u?d?d +?d?d?l?d?d?u?d?l +?d?d?l?d?d?u?d?u +?d?d?l?d?d?u?l?d +?d?d?l?d?d?u?l?l +?d?d?l?d?d?u?l?u +?d?d?l?d?d?u?u?d +?d?d?l?d?d?u?u?l +?d?d?l?d?d?u?u?u +?d?d?l?d?d?s?d?d +?d?d?l?d?d?s?d?l +?d?d?l?d?d?s?d?s +?d?d?l?d?d?s?l?d +?d?d?l?d?d?s?l?l +?d?d?l?d?d?s?l?s +?d?d?l?d?d?s?s?d +?d?d?l?d?d?s?s?l +?d?d?l?d?d?s?s?s +?d?d?l?d?l?d?d?d +?d?d?l?d?l?d?d?l +?d?d?l?d?l?d?d?u +?d?d?l?d?l?d?d?s +?d?d?l?d?l?d?l?d +?d?d?l?d?l?d?l?l +?d?d?l?d?l?d?l?u +?d?d?l?d?l?d?l?s +?d?d?l?d?l?d?u?d +?d?d?l?d?l?d?u?l +?d?d?l?d?l?d?u?u +?d?d?l?d?l?d?s?d +?d?d?l?d?l?d?s?l +?d?d?l?d?l?d?s?s +?d?d?l?d?l?l?d?d +?d?d?l?d?l?l?d?l +?d?d?l?d?l?l?d?u +?d?d?l?d?l?l?d?s +?d?d?l?d?l?l?l?d +?d?d?l?d?l?l?l?l +?d?d?l?d?l?l?l?u +?d?d?l?d?l?l?l?s +?d?d?l?d?l?l?u?d +?d?d?l?d?l?l?u?l +?d?d?l?d?l?l?u?u +?d?d?l?d?l?l?s?d +?d?d?l?d?l?l?s?l +?d?d?l?d?l?l?s?s +?d?d?l?d?l?u?d?d +?d?d?l?d?l?u?d?l +?d?d?l?d?l?u?d?u +?d?d?l?d?l?u?l?d +?d?d?l?d?l?u?l?l +?d?d?l?d?l?u?l?u +?d?d?l?d?l?u?u?d +?d?d?l?d?l?u?u?l +?d?d?l?d?l?u?u?u +?d?d?l?d?l?s?d?d +?d?d?l?d?l?s?d?l +?d?d?l?d?l?s?d?s +?d?d?l?d?l?s?l?d +?d?d?l?d?l?s?l?l +?d?d?l?d?l?s?l?s +?d?d?l?d?l?s?s?d +?d?d?l?d?l?s?s?l +?d?d?l?d?l?s?s?s +?d?d?l?d?u?d?d?d +?d?d?l?d?u?d?d?l +?d?d?l?d?u?d?d?u +?d?d?l?d?u?d?l?d +?d?d?l?d?u?d?l?l +?d?d?l?d?u?d?l?u +?d?d?l?d?u?d?u?d +?d?d?l?d?u?d?u?l +?d?d?l?d?u?d?u?u +?d?d?l?d?u?l?d?d +?d?d?l?d?u?l?d?l +?d?d?l?d?u?l?d?u +?d?d?l?d?u?l?l?d +?d?d?l?d?u?l?l?l +?d?d?l?d?u?l?l?u +?d?d?l?d?u?l?u?d +?d?d?l?d?u?l?u?l +?d?d?l?d?u?l?u?u +?d?d?l?d?u?u?d?d +?d?d?l?d?u?u?d?l +?d?d?l?d?u?u?d?u +?d?d?l?d?u?u?l?d +?d?d?l?d?u?u?l?l +?d?d?l?d?u?u?l?u +?d?d?l?d?u?u?u?d +?d?d?l?d?u?u?u?l +?d?d?l?d?u?u?u?u +?d?d?l?d?s?d?d?d +?d?d?l?d?s?d?d?l +?d?d?l?d?s?d?d?s +?d?d?l?d?s?d?l?d +?d?d?l?d?s?d?l?l +?d?d?l?d?s?d?l?s +?d?d?l?d?s?d?s?d +?d?d?l?d?s?d?s?l +?d?d?l?d?s?d?s?s +?d?d?l?d?s?l?d?d +?d?d?l?d?s?l?d?l +?d?d?l?d?s?l?d?s +?d?d?l?d?s?l?l?d +?d?d?l?d?s?l?l?l +?d?d?l?d?s?l?l?s +?d?d?l?d?s?l?s?d +?d?d?l?d?s?l?s?l +?d?d?l?d?s?l?s?s +?d?d?l?d?s?s?d?d +?d?d?l?d?s?s?d?l +?d?d?l?d?s?s?d?s +?d?d?l?d?s?s?l?d +?d?d?l?d?s?s?l?l +?d?d?l?d?s?s?l?s +?d?d?l?d?s?s?s?d +?d?d?l?d?s?s?s?l +?d?d?l?d?s?s?s?s +?d?d?l?l?d?d?d?d +?d?d?l?l?d?d?d?l +?d?d?l?l?d?d?d?u +?d?d?l?l?d?d?d?s +?d?d?l?l?d?d?l?d +?d?d?l?l?d?d?l?l +?d?d?l?l?d?d?l?u +?d?d?l?l?d?d?l?s +?d?d?l?l?d?d?u?d +?d?d?l?l?d?d?u?l +?d?d?l?l?d?d?u?u +?d?d?l?l?d?d?s?d +?d?d?l?l?d?d?s?l +?d?d?l?l?d?d?s?s +?d?d?l?l?d?l?d?d +?d?d?l?l?d?l?d?l +?d?d?l?l?d?l?d?u +?d?d?l?l?d?l?d?s +?d?d?l?l?d?l?l?d +?d?d?l?l?d?l?l?l +?d?d?l?l?d?l?l?u +?d?d?l?l?d?l?l?s +?d?d?l?l?d?l?u?d +?d?d?l?l?d?l?u?l +?d?d?l?l?d?l?u?u +?d?d?l?l?d?l?s?d +?d?d?l?l?d?l?s?l +?d?d?l?l?d?l?s?s +?d?d?l?l?d?u?d?d +?d?d?l?l?d?u?d?l +?d?d?l?l?d?u?d?u +?d?d?l?l?d?u?l?d +?d?d?l?l?d?u?l?l +?d?d?l?l?d?u?l?u +?d?d?l?l?d?u?u?d +?d?d?l?l?d?u?u?l +?d?d?l?l?d?u?u?u +?d?d?l?l?d?s?d?d +?d?d?l?l?d?s?d?l +?d?d?l?l?d?s?d?s +?d?d?l?l?d?s?l?d +?d?d?l?l?d?s?l?l +?d?d?l?l?d?s?l?s +?d?d?l?l?d?s?s?d +?d?d?l?l?d?s?s?l +?d?d?l?l?d?s?s?s +?d?d?l?l?l?d?d?d +?d?d?l?l?l?d?d?l +?d?d?l?l?l?d?d?u +?d?d?l?l?l?d?d?s +?d?d?l?l?l?d?l?d +?d?d?l?l?l?d?l?l +?d?d?l?l?l?d?l?u +?d?d?l?l?l?d?l?s +?d?d?l?l?l?d?u?d +?d?d?l?l?l?d?u?l +?d?d?l?l?l?d?u?u +?d?d?l?l?l?d?s?d +?d?d?l?l?l?d?s?l +?d?d?l?l?l?d?s?s +?d?d?l?l?l?l?d?d +?d?d?l?l?l?l?d?l +?d?d?l?l?l?l?d?u +?d?d?l?l?l?l?d?s +?d?d?l?l?l?l?l?d +?d?d?l?l?l?l?l?l +?d?d?l?l?l?l?l?u +?d?d?l?l?l?l?l?s +?d?d?l?l?l?l?u?d +?d?d?l?l?l?l?u?l +?d?d?l?l?l?l?u?u +?d?d?l?l?l?l?s?d +?d?d?l?l?l?l?s?l +?d?d?l?l?l?l?s?s +?d?d?l?l?l?u?d?d +?d?d?l?l?l?u?d?l +?d?d?l?l?l?u?d?u +?d?d?l?l?l?u?l?d +?d?d?l?l?l?u?l?l +?d?d?l?l?l?u?l?u +?d?d?l?l?l?u?u?d +?d?d?l?l?l?u?u?l +?d?d?l?l?l?u?u?u +?d?d?l?l?l?s?d?d +?d?d?l?l?l?s?d?l +?d?d?l?l?l?s?d?s +?d?d?l?l?l?s?l?d +?d?d?l?l?l?s?l?l +?d?d?l?l?l?s?l?s +?d?d?l?l?l?s?s?d +?d?d?l?l?l?s?s?l +?d?d?l?l?l?s?s?s +?d?d?l?l?u?d?d?d +?d?d?l?l?u?d?d?l +?d?d?l?l?u?d?d?u +?d?d?l?l?u?d?l?d +?d?d?l?l?u?d?l?l +?d?d?l?l?u?d?l?u +?d?d?l?l?u?d?u?d +?d?d?l?l?u?d?u?l +?d?d?l?l?u?d?u?u +?d?d?l?l?u?l?d?d +?d?d?l?l?u?l?d?l +?d?d?l?l?u?l?d?u +?d?d?l?l?u?l?l?d +?d?d?l?l?u?l?l?l +?d?d?l?l?u?l?l?u +?d?d?l?l?u?l?u?d +?d?d?l?l?u?l?u?l +?d?d?l?l?u?l?u?u +?d?d?l?l?u?u?d?d +?d?d?l?l?u?u?d?l +?d?d?l?l?u?u?d?u +?d?d?l?l?u?u?l?d +?d?d?l?l?u?u?l?l +?d?d?l?l?u?u?l?u +?d?d?l?l?u?u?u?d +?d?d?l?l?u?u?u?l +?d?d?l?l?u?u?u?u +?d?d?l?l?s?d?d?d +?d?d?l?l?s?d?d?l +?d?d?l?l?s?d?d?s +?d?d?l?l?s?d?l?d +?d?d?l?l?s?d?l?l +?d?d?l?l?s?d?l?s +?d?d?l?l?s?d?s?d +?d?d?l?l?s?d?s?l +?d?d?l?l?s?d?s?s +?d?d?l?l?s?l?d?d +?d?d?l?l?s?l?d?l +?d?d?l?l?s?l?d?s +?d?d?l?l?s?l?l?d +?d?d?l?l?s?l?l?l +?d?d?l?l?s?l?l?s +?d?d?l?l?s?l?s?d +?d?d?l?l?s?l?s?l +?d?d?l?l?s?l?s?s +?d?d?l?l?s?s?d?d +?d?d?l?l?s?s?d?l +?d?d?l?l?s?s?d?s +?d?d?l?l?s?s?l?d +?d?d?l?l?s?s?l?l +?d?d?l?l?s?s?l?s +?d?d?l?l?s?s?s?d +?d?d?l?l?s?s?s?l +?d?d?l?l?s?s?s?s +?d?d?l?u?d?d?d?d +?d?d?l?u?d?d?d?l +?d?d?l?u?d?d?d?u +?d?d?l?u?d?d?l?d +?d?d?l?u?d?d?l?l +?d?d?l?u?d?d?l?u +?d?d?l?u?d?d?u?d +?d?d?l?u?d?d?u?l +?d?d?l?u?d?d?u?u +?d?d?l?u?d?l?d?d +?d?d?l?u?d?l?d?l +?d?d?l?u?d?l?d?u +?d?d?l?u?d?l?l?d +?d?d?l?u?d?l?l?l +?d?d?l?u?d?l?l?u +?d?d?l?u?d?l?u?d +?d?d?l?u?d?l?u?l +?d?d?l?u?d?l?u?u +?d?d?l?u?d?u?d?d +?d?d?l?u?d?u?d?l +?d?d?l?u?d?u?d?u +?d?d?l?u?d?u?l?d +?d?d?l?u?d?u?l?l +?d?d?l?u?d?u?l?u +?d?d?l?u?d?u?u?d +?d?d?l?u?d?u?u?l +?d?d?l?u?d?u?u?u +?d?d?l?u?l?d?d?d +?d?d?l?u?l?d?d?l +?d?d?l?u?l?d?d?u +?d?d?l?u?l?d?l?d +?d?d?l?u?l?d?l?l +?d?d?l?u?l?d?l?u +?d?d?l?u?l?d?u?d +?d?d?l?u?l?d?u?l +?d?d?l?u?l?d?u?u +?d?d?l?u?l?l?d?d +?d?d?l?u?l?l?d?l +?d?d?l?u?l?l?d?u +?d?d?l?u?l?l?l?d +?d?d?l?u?l?l?l?l +?d?d?l?u?l?l?l?u +?d?d?l?u?l?l?u?d +?d?d?l?u?l?l?u?l +?d?d?l?u?l?l?u?u +?d?d?l?u?l?u?d?d +?d?d?l?u?l?u?d?l +?d?d?l?u?l?u?d?u +?d?d?l?u?l?u?l?d +?d?d?l?u?l?u?l?l +?d?d?l?u?l?u?l?u +?d?d?l?u?l?u?u?d +?d?d?l?u?l?u?u?l +?d?d?l?u?l?u?u?u +?d?d?l?u?u?d?d?d +?d?d?l?u?u?d?d?l +?d?d?l?u?u?d?d?u +?d?d?l?u?u?d?l?d +?d?d?l?u?u?d?l?l +?d?d?l?u?u?d?l?u +?d?d?l?u?u?d?u?d +?d?d?l?u?u?d?u?l +?d?d?l?u?u?d?u?u +?d?d?l?u?u?l?d?d +?d?d?l?u?u?l?d?l +?d?d?l?u?u?l?d?u +?d?d?l?u?u?l?l?d +?d?d?l?u?u?l?l?l +?d?d?l?u?u?l?l?u +?d?d?l?u?u?l?u?d +?d?d?l?u?u?l?u?l +?d?d?l?u?u?l?u?u +?d?d?l?u?u?u?d?d +?d?d?l?u?u?u?d?l +?d?d?l?u?u?u?d?u +?d?d?l?u?u?u?l?d +?d?d?l?u?u?u?l?l +?d?d?l?u?u?u?l?u +?d?d?l?u?u?u?u?d +?d?d?l?u?u?u?u?l +?d?d?l?u?u?u?u?u +?d?d?l?s?d?d?d?d +?d?d?l?s?d?d?d?l +?d?d?l?s?d?d?d?s +?d?d?l?s?d?d?l?d +?d?d?l?s?d?d?l?l +?d?d?l?s?d?d?l?s +?d?d?l?s?d?d?s?d +?d?d?l?s?d?d?s?l +?d?d?l?s?d?d?s?s +?d?d?l?s?d?l?d?d +?d?d?l?s?d?l?d?l +?d?d?l?s?d?l?d?s +?d?d?l?s?d?l?l?d +?d?d?l?s?d?l?l?l +?d?d?l?s?d?l?l?s +?d?d?l?s?d?l?s?d +?d?d?l?s?d?l?s?l +?d?d?l?s?d?l?s?s +?d?d?l?s?d?s?d?d +?d?d?l?s?d?s?d?l +?d?d?l?s?d?s?d?s +?d?d?l?s?d?s?l?d +?d?d?l?s?d?s?l?l +?d?d?l?s?d?s?l?s +?d?d?l?s?d?s?s?d +?d?d?l?s?d?s?s?l +?d?d?l?s?d?s?s?s +?d?d?l?s?l?d?d?d +?d?d?l?s?l?d?d?l +?d?d?l?s?l?d?d?s +?d?d?l?s?l?d?l?d +?d?d?l?s?l?d?l?l +?d?d?l?s?l?d?l?s +?d?d?l?s?l?d?s?d +?d?d?l?s?l?d?s?l +?d?d?l?s?l?d?s?s +?d?d?l?s?l?l?d?d +?d?d?l?s?l?l?d?l +?d?d?l?s?l?l?d?s +?d?d?l?s?l?l?l?d +?d?d?l?s?l?l?l?l +?d?d?l?s?l?l?l?s +?d?d?l?s?l?l?s?d +?d?d?l?s?l?l?s?l +?d?d?l?s?l?l?s?s +?d?d?l?s?l?s?d?d +?d?d?l?s?l?s?d?l +?d?d?l?s?l?s?d?s +?d?d?l?s?l?s?l?d +?d?d?l?s?l?s?l?l +?d?d?l?s?l?s?l?s +?d?d?l?s?l?s?s?d +?d?d?l?s?l?s?s?l +?d?d?l?s?l?s?s?s +?d?d?l?s?s?d?d?d +?d?d?l?s?s?d?d?l +?d?d?l?s?s?d?d?s +?d?d?l?s?s?d?l?d +?d?d?l?s?s?d?l?l +?d?d?l?s?s?d?l?s +?d?d?l?s?s?d?s?d +?d?d?l?s?s?d?s?l +?d?d?l?s?s?d?s?s +?d?d?l?s?s?l?d?d +?d?d?l?s?s?l?d?l +?d?d?l?s?s?l?d?s +?d?d?l?s?s?l?l?d +?d?d?l?s?s?l?l?l +?d?d?l?s?s?l?l?s +?d?d?l?s?s?l?s?d +?d?d?l?s?s?l?s?l +?d?d?l?s?s?l?s?s +?d?d?l?s?s?s?d?d +?d?d?l?s?s?s?d?l +?d?d?l?s?s?s?d?s +?d?d?l?s?s?s?l?d +?d?d?l?s?s?s?l?l +?d?d?l?s?s?s?l?s +?d?d?l?s?s?s?s?d +?d?d?l?s?s?s?s?l +?d?d?l?s?s?s?s?s +?d?d?u?d?d?d?d?d +?d?d?u?d?d?d?d?l +?d?d?u?d?d?d?d?u +?d?d?u?d?d?d?d?s +?d?d?u?d?d?d?l?d +?d?d?u?d?d?d?l?l +?d?d?u?d?d?d?l?u +?d?d?u?d?d?d?u?d +?d?d?u?d?d?d?u?l +?d?d?u?d?d?d?u?u +?d?d?u?d?d?d?u?s +?d?d?u?d?d?d?s?d +?d?d?u?d?d?d?s?u +?d?d?u?d?d?d?s?s +?d?d?u?d?d?l?d?d +?d?d?u?d?d?l?d?l +?d?d?u?d?d?l?d?u +?d?d?u?d?d?l?l?d +?d?d?u?d?d?l?l?l +?d?d?u?d?d?l?l?u +?d?d?u?d?d?l?u?d +?d?d?u?d?d?l?u?l +?d?d?u?d?d?l?u?u +?d?d?u?d?d?u?d?d +?d?d?u?d?d?u?d?l +?d?d?u?d?d?u?d?u +?d?d?u?d?d?u?d?s +?d?d?u?d?d?u?l?d +?d?d?u?d?d?u?l?l +?d?d?u?d?d?u?l?u +?d?d?u?d?d?u?u?d +?d?d?u?d?d?u?u?l +?d?d?u?d?d?u?u?u +?d?d?u?d?d?u?u?s +?d?d?u?d?d?u?s?d +?d?d?u?d?d?u?s?u +?d?d?u?d?d?u?s?s +?d?d?u?d?d?s?d?d +?d?d?u?d?d?s?d?u +?d?d?u?d?d?s?d?s +?d?d?u?d?d?s?u?d +?d?d?u?d?d?s?u?u +?d?d?u?d?d?s?u?s +?d?d?u?d?d?s?s?d +?d?d?u?d?d?s?s?u +?d?d?u?d?d?s?s?s +?d?d?u?d?l?d?d?d +?d?d?u?d?l?d?d?l +?d?d?u?d?l?d?d?u +?d?d?u?d?l?d?l?d +?d?d?u?d?l?d?l?l +?d?d?u?d?l?d?l?u +?d?d?u?d?l?d?u?d +?d?d?u?d?l?d?u?l +?d?d?u?d?l?d?u?u +?d?d?u?d?l?l?d?d +?d?d?u?d?l?l?d?l +?d?d?u?d?l?l?d?u +?d?d?u?d?l?l?l?d +?d?d?u?d?l?l?l?l +?d?d?u?d?l?l?l?u +?d?d?u?d?l?l?u?d +?d?d?u?d?l?l?u?l +?d?d?u?d?l?l?u?u +?d?d?u?d?l?u?d?d +?d?d?u?d?l?u?d?l +?d?d?u?d?l?u?d?u +?d?d?u?d?l?u?l?d +?d?d?u?d?l?u?l?l +?d?d?u?d?l?u?l?u +?d?d?u?d?l?u?u?d +?d?d?u?d?l?u?u?l +?d?d?u?d?l?u?u?u +?d?d?u?d?u?d?d?d +?d?d?u?d?u?d?d?l +?d?d?u?d?u?d?d?u +?d?d?u?d?u?d?d?s +?d?d?u?d?u?d?l?d +?d?d?u?d?u?d?l?l +?d?d?u?d?u?d?l?u +?d?d?u?d?u?d?u?d +?d?d?u?d?u?d?u?l +?d?d?u?d?u?d?u?u +?d?d?u?d?u?d?u?s +?d?d?u?d?u?d?s?d +?d?d?u?d?u?d?s?u +?d?d?u?d?u?d?s?s +?d?d?u?d?u?l?d?d +?d?d?u?d?u?l?d?l +?d?d?u?d?u?l?d?u +?d?d?u?d?u?l?l?d +?d?d?u?d?u?l?l?l +?d?d?u?d?u?l?l?u +?d?d?u?d?u?l?u?d +?d?d?u?d?u?l?u?l +?d?d?u?d?u?l?u?u +?d?d?u?d?u?u?d?d +?d?d?u?d?u?u?d?l +?d?d?u?d?u?u?d?u +?d?d?u?d?u?u?d?s +?d?d?u?d?u?u?l?d +?d?d?u?d?u?u?l?l +?d?d?u?d?u?u?l?u +?d?d?u?d?u?u?u?d +?d?d?u?d?u?u?u?l +?d?d?u?d?u?u?u?u +?d?d?u?d?u?u?u?s +?d?d?u?d?u?u?s?d +?d?d?u?d?u?u?s?u +?d?d?u?d?u?u?s?s +?d?d?u?d?u?s?d?d +?d?d?u?d?u?s?d?u +?d?d?u?d?u?s?d?s +?d?d?u?d?u?s?u?d +?d?d?u?d?u?s?u?u +?d?d?u?d?u?s?u?s +?d?d?u?d?u?s?s?d +?d?d?u?d?u?s?s?u +?d?d?u?d?u?s?s?s +?d?d?u?d?s?d?d?d +?d?d?u?d?s?d?d?u +?d?d?u?d?s?d?d?s +?d?d?u?d?s?d?u?d +?d?d?u?d?s?d?u?u +?d?d?u?d?s?d?u?s +?d?d?u?d?s?d?s?d +?d?d?u?d?s?d?s?u +?d?d?u?d?s?d?s?s +?d?d?u?d?s?u?d?d +?d?d?u?d?s?u?d?u +?d?d?u?d?s?u?d?s +?d?d?u?d?s?u?u?d +?d?d?u?d?s?u?u?u +?d?d?u?d?s?u?u?s +?d?d?u?d?s?u?s?d +?d?d?u?d?s?u?s?u +?d?d?u?d?s?u?s?s +?d?d?u?d?s?s?d?d +?d?d?u?d?s?s?d?u +?d?d?u?d?s?s?d?s +?d?d?u?d?s?s?u?d +?d?d?u?d?s?s?u?u +?d?d?u?d?s?s?u?s +?d?d?u?d?s?s?s?d +?d?d?u?d?s?s?s?u +?d?d?u?d?s?s?s?s +?d?d?u?l?d?d?d?d +?d?d?u?l?d?d?d?l +?d?d?u?l?d?d?d?u +?d?d?u?l?d?d?l?d +?d?d?u?l?d?d?l?l +?d?d?u?l?d?d?l?u +?d?d?u?l?d?d?u?d +?d?d?u?l?d?d?u?l +?d?d?u?l?d?d?u?u +?d?d?u?l?d?l?d?d +?d?d?u?l?d?l?d?l +?d?d?u?l?d?l?d?u +?d?d?u?l?d?l?l?d +?d?d?u?l?d?l?l?l +?d?d?u?l?d?l?l?u +?d?d?u?l?d?l?u?d +?d?d?u?l?d?l?u?l +?d?d?u?l?d?l?u?u +?d?d?u?l?d?u?d?d +?d?d?u?l?d?u?d?l +?d?d?u?l?d?u?d?u +?d?d?u?l?d?u?l?d +?d?d?u?l?d?u?l?l +?d?d?u?l?d?u?l?u +?d?d?u?l?d?u?u?d +?d?d?u?l?d?u?u?l +?d?d?u?l?d?u?u?u +?d?d?u?l?l?d?d?d +?d?d?u?l?l?d?d?l +?d?d?u?l?l?d?d?u +?d?d?u?l?l?d?l?d +?d?d?u?l?l?d?l?l +?d?d?u?l?l?d?l?u +?d?d?u?l?l?d?u?d +?d?d?u?l?l?d?u?l +?d?d?u?l?l?d?u?u +?d?d?u?l?l?l?d?d +?d?d?u?l?l?l?d?l +?d?d?u?l?l?l?d?u +?d?d?u?l?l?l?l?d +?d?d?u?l?l?l?l?l +?d?d?u?l?l?l?l?u +?d?d?u?l?l?l?u?d +?d?d?u?l?l?l?u?l +?d?d?u?l?l?l?u?u +?d?d?u?l?l?u?d?d +?d?d?u?l?l?u?d?l +?d?d?u?l?l?u?d?u +?d?d?u?l?l?u?l?d +?d?d?u?l?l?u?l?l +?d?d?u?l?l?u?l?u +?d?d?u?l?l?u?u?d +?d?d?u?l?l?u?u?l +?d?d?u?l?l?u?u?u +?d?d?u?l?u?d?d?d +?d?d?u?l?u?d?d?l +?d?d?u?l?u?d?d?u +?d?d?u?l?u?d?l?d +?d?d?u?l?u?d?l?l +?d?d?u?l?u?d?l?u +?d?d?u?l?u?d?u?d +?d?d?u?l?u?d?u?l +?d?d?u?l?u?d?u?u +?d?d?u?l?u?l?d?d +?d?d?u?l?u?l?d?l +?d?d?u?l?u?l?d?u +?d?d?u?l?u?l?l?d +?d?d?u?l?u?l?l?l +?d?d?u?l?u?l?l?u +?d?d?u?l?u?l?u?d +?d?d?u?l?u?l?u?l +?d?d?u?l?u?l?u?u +?d?d?u?l?u?u?d?d +?d?d?u?l?u?u?d?l +?d?d?u?l?u?u?d?u +?d?d?u?l?u?u?l?d +?d?d?u?l?u?u?l?l +?d?d?u?l?u?u?l?u +?d?d?u?l?u?u?u?d +?d?d?u?l?u?u?u?l +?d?d?u?l?u?u?u?u +?d?d?u?u?d?d?d?d +?d?d?u?u?d?d?d?l +?d?d?u?u?d?d?d?u +?d?d?u?u?d?d?d?s +?d?d?u?u?d?d?l?d +?d?d?u?u?d?d?l?l +?d?d?u?u?d?d?l?u +?d?d?u?u?d?d?u?d +?d?d?u?u?d?d?u?l +?d?d?u?u?d?d?u?u +?d?d?u?u?d?d?u?s +?d?d?u?u?d?d?s?d +?d?d?u?u?d?d?s?u +?d?d?u?u?d?d?s?s +?d?d?u?u?d?l?d?d +?d?d?u?u?d?l?d?l +?d?d?u?u?d?l?d?u +?d?d?u?u?d?l?l?d +?d?d?u?u?d?l?l?l +?d?d?u?u?d?l?l?u +?d?d?u?u?d?l?u?d +?d?d?u?u?d?l?u?l +?d?d?u?u?d?l?u?u +?d?d?u?u?d?u?d?d +?d?d?u?u?d?u?d?l +?d?d?u?u?d?u?d?u +?d?d?u?u?d?u?d?s +?d?d?u?u?d?u?l?d +?d?d?u?u?d?u?l?l +?d?d?u?u?d?u?l?u +?d?d?u?u?d?u?u?d +?d?d?u?u?d?u?u?l +?d?d?u?u?d?u?u?u +?d?d?u?u?d?u?u?s +?d?d?u?u?d?u?s?d +?d?d?u?u?d?u?s?u +?d?d?u?u?d?u?s?s +?d?d?u?u?d?s?d?d +?d?d?u?u?d?s?d?u +?d?d?u?u?d?s?d?s +?d?d?u?u?d?s?u?d +?d?d?u?u?d?s?u?u +?d?d?u?u?d?s?u?s +?d?d?u?u?d?s?s?d +?d?d?u?u?d?s?s?u +?d?d?u?u?d?s?s?s +?d?d?u?u?l?d?d?d +?d?d?u?u?l?d?d?l +?d?d?u?u?l?d?d?u +?d?d?u?u?l?d?l?d +?d?d?u?u?l?d?l?l +?d?d?u?u?l?d?l?u +?d?d?u?u?l?d?u?d +?d?d?u?u?l?d?u?l +?d?d?u?u?l?d?u?u +?d?d?u?u?l?l?d?d +?d?d?u?u?l?l?d?l +?d?d?u?u?l?l?d?u +?d?d?u?u?l?l?l?d +?d?d?u?u?l?l?l?l +?d?d?u?u?l?l?l?u +?d?d?u?u?l?l?u?d +?d?d?u?u?l?l?u?l +?d?d?u?u?l?l?u?u +?d?d?u?u?l?u?d?d +?d?d?u?u?l?u?d?l +?d?d?u?u?l?u?d?u +?d?d?u?u?l?u?l?d +?d?d?u?u?l?u?l?l +?d?d?u?u?l?u?l?u +?d?d?u?u?l?u?u?d +?d?d?u?u?l?u?u?l +?d?d?u?u?l?u?u?u +?d?d?u?u?u?d?d?d +?d?d?u?u?u?d?d?l +?d?d?u?u?u?d?d?u +?d?d?u?u?u?d?d?s +?d?d?u?u?u?d?l?d +?d?d?u?u?u?d?l?l +?d?d?u?u?u?d?l?u +?d?d?u?u?u?d?u?d +?d?d?u?u?u?d?u?l +?d?d?u?u?u?d?u?u +?d?d?u?u?u?d?u?s +?d?d?u?u?u?d?s?d +?d?d?u?u?u?d?s?u +?d?d?u?u?u?d?s?s +?d?d?u?u?u?l?d?d +?d?d?u?u?u?l?d?l +?d?d?u?u?u?l?d?u +?d?d?u?u?u?l?l?d +?d?d?u?u?u?l?l?l +?d?d?u?u?u?l?l?u +?d?d?u?u?u?l?u?d +?d?d?u?u?u?l?u?l +?d?d?u?u?u?l?u?u +?d?d?u?u?u?u?d?d +?d?d?u?u?u?u?d?l +?d?d?u?u?u?u?d?u +?d?d?u?u?u?u?d?s +?d?d?u?u?u?u?l?d +?d?d?u?u?u?u?l?l +?d?d?u?u?u?u?l?u +?d?d?u?u?u?u?u?d +?d?d?u?u?u?u?u?l +?d?d?u?u?u?u?u?u +?d?d?u?u?u?u?u?s +?d?d?u?u?u?u?s?d +?d?d?u?u?u?u?s?u +?d?d?u?u?u?u?s?s +?d?d?u?u?u?s?d?d +?d?d?u?u?u?s?d?u +?d?d?u?u?u?s?d?s +?d?d?u?u?u?s?u?d +?d?d?u?u?u?s?u?u +?d?d?u?u?u?s?u?s +?d?d?u?u?u?s?s?d +?d?d?u?u?u?s?s?u +?d?d?u?u?u?s?s?s +?d?d?u?u?s?d?d?d +?d?d?u?u?s?d?d?u +?d?d?u?u?s?d?d?s +?d?d?u?u?s?d?u?d +?d?d?u?u?s?d?u?u +?d?d?u?u?s?d?u?s +?d?d?u?u?s?d?s?d +?d?d?u?u?s?d?s?u +?d?d?u?u?s?d?s?s +?d?d?u?u?s?u?d?d +?d?d?u?u?s?u?d?u +?d?d?u?u?s?u?d?s +?d?d?u?u?s?u?u?d +?d?d?u?u?s?u?u?u +?d?d?u?u?s?u?u?s +?d?d?u?u?s?u?s?d +?d?d?u?u?s?u?s?u +?d?d?u?u?s?u?s?s +?d?d?u?u?s?s?d?d +?d?d?u?u?s?s?d?u +?d?d?u?u?s?s?d?s +?d?d?u?u?s?s?u?d +?d?d?u?u?s?s?u?u +?d?d?u?u?s?s?u?s +?d?d?u?u?s?s?s?d +?d?d?u?u?s?s?s?u +?d?d?u?u?s?s?s?s +?d?d?u?s?d?d?d?d +?d?d?u?s?d?d?d?u +?d?d?u?s?d?d?d?s +?d?d?u?s?d?d?u?d +?d?d?u?s?d?d?u?u +?d?d?u?s?d?d?u?s +?d?d?u?s?d?d?s?d +?d?d?u?s?d?d?s?u +?d?d?u?s?d?d?s?s +?d?d?u?s?d?u?d?d +?d?d?u?s?d?u?d?u +?d?d?u?s?d?u?d?s +?d?d?u?s?d?u?u?d +?d?d?u?s?d?u?u?u +?d?d?u?s?d?u?u?s +?d?d?u?s?d?u?s?d +?d?d?u?s?d?u?s?u +?d?d?u?s?d?u?s?s +?d?d?u?s?d?s?d?d +?d?d?u?s?d?s?d?u +?d?d?u?s?d?s?d?s +?d?d?u?s?d?s?u?d +?d?d?u?s?d?s?u?u +?d?d?u?s?d?s?u?s +?d?d?u?s?d?s?s?d +?d?d?u?s?d?s?s?u +?d?d?u?s?d?s?s?s +?d?d?u?s?u?d?d?d +?d?d?u?s?u?d?d?u +?d?d?u?s?u?d?d?s +?d?d?u?s?u?d?u?d +?d?d?u?s?u?d?u?u +?d?d?u?s?u?d?u?s +?d?d?u?s?u?d?s?d +?d?d?u?s?u?d?s?u +?d?d?u?s?u?d?s?s +?d?d?u?s?u?u?d?d +?d?d?u?s?u?u?d?u +?d?d?u?s?u?u?d?s +?d?d?u?s?u?u?u?d +?d?d?u?s?u?u?u?u +?d?d?u?s?u?u?u?s +?d?d?u?s?u?u?s?d +?d?d?u?s?u?u?s?u +?d?d?u?s?u?u?s?s +?d?d?u?s?u?s?d?d +?d?d?u?s?u?s?d?u +?d?d?u?s?u?s?d?s +?d?d?u?s?u?s?u?d +?d?d?u?s?u?s?u?u +?d?d?u?s?u?s?u?s +?d?d?u?s?u?s?s?d +?d?d?u?s?u?s?s?u +?d?d?u?s?u?s?s?s +?d?d?u?s?s?d?d?d +?d?d?u?s?s?d?d?u +?d?d?u?s?s?d?d?s +?d?d?u?s?s?d?u?d +?d?d?u?s?s?d?u?u +?d?d?u?s?s?d?u?s +?d?d?u?s?s?d?s?d +?d?d?u?s?s?d?s?u +?d?d?u?s?s?d?s?s +?d?d?u?s?s?u?d?d +?d?d?u?s?s?u?d?u +?d?d?u?s?s?u?d?s +?d?d?u?s?s?u?u?d +?d?d?u?s?s?u?u?u +?d?d?u?s?s?u?u?s +?d?d?u?s?s?u?s?d +?d?d?u?s?s?u?s?u +?d?d?u?s?s?u?s?s +?d?d?u?s?s?s?d?d +?d?d?u?s?s?s?d?u +?d?d?u?s?s?s?d?s +?d?d?u?s?s?s?u?d +?d?d?u?s?s?s?u?u +?d?d?u?s?s?s?u?s +?d?d?u?s?s?s?s?d +?d?d?u?s?s?s?s?u +?d?d?u?s?s?s?s?s +?d?d?s?d?d?d?d?d +?d?d?s?d?d?d?d?l +?d?d?s?d?d?d?d?u +?d?d?s?d?d?d?d?s +?d?d?s?d?d?d?l?d +?d?d?s?d?d?d?l?l +?d?d?s?d?d?d?l?s +?d?d?s?d?d?d?u?d +?d?d?s?d?d?d?u?u +?d?d?s?d?d?d?u?s +?d?d?s?d?d?d?s?d +?d?d?s?d?d?d?s?l +?d?d?s?d?d?d?s?u +?d?d?s?d?d?d?s?s +?d?d?s?d?d?l?d?d +?d?d?s?d?d?l?d?l +?d?d?s?d?d?l?d?s +?d?d?s?d?d?l?l?d +?d?d?s?d?d?l?l?l +?d?d?s?d?d?l?l?s +?d?d?s?d?d?l?s?d +?d?d?s?d?d?l?s?l +?d?d?s?d?d?l?s?s +?d?d?s?d?d?u?d?d +?d?d?s?d?d?u?d?u +?d?d?s?d?d?u?d?s +?d?d?s?d?d?u?u?d +?d?d?s?d?d?u?u?u +?d?d?s?d?d?u?u?s +?d?d?s?d?d?u?s?d +?d?d?s?d?d?u?s?u +?d?d?s?d?d?u?s?s +?d?d?s?d?d?s?d?d +?d?d?s?d?d?s?d?l +?d?d?s?d?d?s?d?u +?d?d?s?d?d?s?d?s +?d?d?s?d?d?s?l?d +?d?d?s?d?d?s?l?l +?d?d?s?d?d?s?l?s +?d?d?s?d?d?s?u?d +?d?d?s?d?d?s?u?u +?d?d?s?d?d?s?u?s +?d?d?s?d?d?s?s?d +?d?d?s?d?d?s?s?l +?d?d?s?d?d?s?s?u +?d?d?s?d?d?s?s?s +?d?d?s?d?l?d?d?d +?d?d?s?d?l?d?d?l +?d?d?s?d?l?d?d?s +?d?d?s?d?l?d?l?d +?d?d?s?d?l?d?l?l +?d?d?s?d?l?d?l?s +?d?d?s?d?l?d?s?d +?d?d?s?d?l?d?s?l +?d?d?s?d?l?d?s?s +?d?d?s?d?l?l?d?d +?d?d?s?d?l?l?d?l +?d?d?s?d?l?l?d?s +?d?d?s?d?l?l?l?d +?d?d?s?d?l?l?l?l +?d?d?s?d?l?l?l?s +?d?d?s?d?l?l?s?d +?d?d?s?d?l?l?s?l +?d?d?s?d?l?l?s?s +?d?d?s?d?l?s?d?d +?d?d?s?d?l?s?d?l +?d?d?s?d?l?s?d?s +?d?d?s?d?l?s?l?d +?d?d?s?d?l?s?l?l +?d?d?s?d?l?s?l?s +?d?d?s?d?l?s?s?d +?d?d?s?d?l?s?s?l +?d?d?s?d?l?s?s?s +?d?d?s?d?u?d?d?d +?d?d?s?d?u?d?d?u +?d?d?s?d?u?d?d?s +?d?d?s?d?u?d?u?d +?d?d?s?d?u?d?u?u +?d?d?s?d?u?d?u?s +?d?d?s?d?u?d?s?d +?d?d?s?d?u?d?s?u +?d?d?s?d?u?d?s?s +?d?d?s?d?u?u?d?d +?d?d?s?d?u?u?d?u +?d?d?s?d?u?u?d?s +?d?d?s?d?u?u?u?d +?d?d?s?d?u?u?u?u +?d?d?s?d?u?u?u?s +?d?d?s?d?u?u?s?d +?d?d?s?d?u?u?s?u +?d?d?s?d?u?u?s?s +?d?d?s?d?u?s?d?d +?d?d?s?d?u?s?d?u +?d?d?s?d?u?s?d?s +?d?d?s?d?u?s?u?d +?d?d?s?d?u?s?u?u +?d?d?s?d?u?s?u?s +?d?d?s?d?u?s?s?d +?d?d?s?d?u?s?s?u +?d?d?s?d?u?s?s?s +?d?d?s?d?s?d?d?d +?d?d?s?d?s?d?d?l +?d?d?s?d?s?d?d?u +?d?d?s?d?s?d?d?s +?d?d?s?d?s?d?l?d +?d?d?s?d?s?d?l?l +?d?d?s?d?s?d?l?s +?d?d?s?d?s?d?u?d +?d?d?s?d?s?d?u?u +?d?d?s?d?s?d?u?s +?d?d?s?d?s?d?s?d +?d?d?s?d?s?d?s?l +?d?d?s?d?s?d?s?u +?d?d?s?d?s?d?s?s +?d?d?s?d?s?l?d?d +?d?d?s?d?s?l?d?l +?d?d?s?d?s?l?d?s +?d?d?s?d?s?l?l?d +?d?d?s?d?s?l?l?l +?d?d?s?d?s?l?l?s +?d?d?s?d?s?l?s?d +?d?d?s?d?s?l?s?l +?d?d?s?d?s?l?s?s +?d?d?s?d?s?u?d?d +?d?d?s?d?s?u?d?u +?d?d?s?d?s?u?d?s +?d?d?s?d?s?u?u?d +?d?d?s?d?s?u?u?u +?d?d?s?d?s?u?u?s +?d?d?s?d?s?u?s?d +?d?d?s?d?s?u?s?u +?d?d?s?d?s?u?s?s +?d?d?s?d?s?s?d?d +?d?d?s?d?s?s?d?l +?d?d?s?d?s?s?d?u +?d?d?s?d?s?s?d?s +?d?d?s?d?s?s?l?d +?d?d?s?d?s?s?l?l +?d?d?s?d?s?s?l?s +?d?d?s?d?s?s?u?d +?d?d?s?d?s?s?u?u +?d?d?s?d?s?s?u?s +?d?d?s?d?s?s?s?d +?d?d?s?d?s?s?s?l +?d?d?s?d?s?s?s?u +?d?d?s?d?s?s?s?s +?d?d?s?l?d?d?d?d +?d?d?s?l?d?d?d?l +?d?d?s?l?d?d?d?s +?d?d?s?l?d?d?l?d +?d?d?s?l?d?d?l?l +?d?d?s?l?d?d?l?s +?d?d?s?l?d?d?s?d +?d?d?s?l?d?d?s?l +?d?d?s?l?d?d?s?s +?d?d?s?l?d?l?d?d +?d?d?s?l?d?l?d?l +?d?d?s?l?d?l?d?s +?d?d?s?l?d?l?l?d +?d?d?s?l?d?l?l?l +?d?d?s?l?d?l?l?s +?d?d?s?l?d?l?s?d +?d?d?s?l?d?l?s?l +?d?d?s?l?d?l?s?s +?d?d?s?l?d?s?d?d +?d?d?s?l?d?s?d?l +?d?d?s?l?d?s?d?s +?d?d?s?l?d?s?l?d +?d?d?s?l?d?s?l?l +?d?d?s?l?d?s?l?s +?d?d?s?l?d?s?s?d +?d?d?s?l?d?s?s?l +?d?d?s?l?d?s?s?s +?d?d?s?l?l?d?d?d +?d?d?s?l?l?d?d?l +?d?d?s?l?l?d?d?s +?d?d?s?l?l?d?l?d +?d?d?s?l?l?d?l?l +?d?d?s?l?l?d?l?s +?d?d?s?l?l?d?s?d +?d?d?s?l?l?d?s?l +?d?d?s?l?l?d?s?s +?d?d?s?l?l?l?d?d +?d?d?s?l?l?l?d?l +?d?d?s?l?l?l?d?s +?d?d?s?l?l?l?l?d +?d?d?s?l?l?l?l?l +?d?d?s?l?l?l?l?s +?d?d?s?l?l?l?s?d +?d?d?s?l?l?l?s?l +?d?d?s?l?l?l?s?s +?d?d?s?l?l?s?d?d +?d?d?s?l?l?s?d?l +?d?d?s?l?l?s?d?s +?d?d?s?l?l?s?l?d +?d?d?s?l?l?s?l?l +?d?d?s?l?l?s?l?s +?d?d?s?l?l?s?s?d +?d?d?s?l?l?s?s?l +?d?d?s?l?l?s?s?s +?d?d?s?l?s?d?d?d +?d?d?s?l?s?d?d?l +?d?d?s?l?s?d?d?s +?d?d?s?l?s?d?l?d +?d?d?s?l?s?d?l?l +?d?d?s?l?s?d?l?s +?d?d?s?l?s?d?s?d +?d?d?s?l?s?d?s?l +?d?d?s?l?s?d?s?s +?d?d?s?l?s?l?d?d +?d?d?s?l?s?l?d?l +?d?d?s?l?s?l?d?s +?d?d?s?l?s?l?l?d +?d?d?s?l?s?l?l?l +?d?d?s?l?s?l?l?s +?d?d?s?l?s?l?s?d +?d?d?s?l?s?l?s?l +?d?d?s?l?s?l?s?s +?d?d?s?l?s?s?d?d +?d?d?s?l?s?s?d?l +?d?d?s?l?s?s?d?s +?d?d?s?l?s?s?l?d +?d?d?s?l?s?s?l?l +?d?d?s?l?s?s?l?s +?d?d?s?l?s?s?s?d +?d?d?s?l?s?s?s?l +?d?d?s?l?s?s?s?s +?d?d?s?u?d?d?d?d +?d?d?s?u?d?d?d?u +?d?d?s?u?d?d?d?s +?d?d?s?u?d?d?u?d +?d?d?s?u?d?d?u?u +?d?d?s?u?d?d?u?s +?d?d?s?u?d?d?s?d +?d?d?s?u?d?d?s?u +?d?d?s?u?d?d?s?s +?d?d?s?u?d?u?d?d +?d?d?s?u?d?u?d?u +?d?d?s?u?d?u?d?s +?d?d?s?u?d?u?u?d +?d?d?s?u?d?u?u?u +?d?d?s?u?d?u?u?s +?d?d?s?u?d?u?s?d +?d?d?s?u?d?u?s?u +?d?d?s?u?d?u?s?s +?d?d?s?u?d?s?d?d +?d?d?s?u?d?s?d?u +?d?d?s?u?d?s?d?s +?d?d?s?u?d?s?u?d +?d?d?s?u?d?s?u?u +?d?d?s?u?d?s?u?s +?d?d?s?u?d?s?s?d +?d?d?s?u?d?s?s?u +?d?d?s?u?d?s?s?s +?d?d?s?u?u?d?d?d +?d?d?s?u?u?d?d?u +?d?d?s?u?u?d?d?s +?d?d?s?u?u?d?u?d +?d?d?s?u?u?d?u?u +?d?d?s?u?u?d?u?s +?d?d?s?u?u?d?s?d +?d?d?s?u?u?d?s?u +?d?d?s?u?u?d?s?s +?d?d?s?u?u?u?d?d +?d?d?s?u?u?u?d?u +?d?d?s?u?u?u?d?s +?d?d?s?u?u?u?u?d +?d?d?s?u?u?u?u?u +?d?d?s?u?u?u?u?s +?d?d?s?u?u?u?s?d +?d?d?s?u?u?u?s?u +?d?d?s?u?u?u?s?s +?d?d?s?u?u?s?d?d +?d?d?s?u?u?s?d?u +?d?d?s?u?u?s?d?s +?d?d?s?u?u?s?u?d +?d?d?s?u?u?s?u?u +?d?d?s?u?u?s?u?s +?d?d?s?u?u?s?s?d +?d?d?s?u?u?s?s?u +?d?d?s?u?u?s?s?s +?d?d?s?u?s?d?d?d +?d?d?s?u?s?d?d?u +?d?d?s?u?s?d?d?s +?d?d?s?u?s?d?u?d +?d?d?s?u?s?d?u?u +?d?d?s?u?s?d?u?s +?d?d?s?u?s?d?s?d +?d?d?s?u?s?d?s?u +?d?d?s?u?s?d?s?s +?d?d?s?u?s?u?d?d +?d?d?s?u?s?u?d?u +?d?d?s?u?s?u?d?s +?d?d?s?u?s?u?u?d +?d?d?s?u?s?u?u?u +?d?d?s?u?s?u?u?s +?d?d?s?u?s?u?s?d +?d?d?s?u?s?u?s?u +?d?d?s?u?s?u?s?s +?d?d?s?u?s?s?d?d +?d?d?s?u?s?s?d?u +?d?d?s?u?s?s?d?s +?d?d?s?u?s?s?u?d +?d?d?s?u?s?s?u?u +?d?d?s?u?s?s?u?s +?d?d?s?u?s?s?s?d +?d?d?s?u?s?s?s?u +?d?d?s?u?s?s?s?s +?d?d?s?s?d?d?d?d +?d?d?s?s?d?d?d?l +?d?d?s?s?d?d?d?u +?d?d?s?s?d?d?d?s +?d?d?s?s?d?d?l?d +?d?d?s?s?d?d?l?l +?d?d?s?s?d?d?l?s +?d?d?s?s?d?d?u?d +?d?d?s?s?d?d?u?u +?d?d?s?s?d?d?u?s +?d?d?s?s?d?d?s?d +?d?d?s?s?d?d?s?l +?d?d?s?s?d?d?s?u +?d?d?s?s?d?d?s?s +?d?d?s?s?d?l?d?d +?d?d?s?s?d?l?d?l +?d?d?s?s?d?l?d?s +?d?d?s?s?d?l?l?d +?d?d?s?s?d?l?l?l +?d?d?s?s?d?l?l?s +?d?d?s?s?d?l?s?d +?d?d?s?s?d?l?s?l +?d?d?s?s?d?l?s?s +?d?d?s?s?d?u?d?d +?d?d?s?s?d?u?d?u +?d?d?s?s?d?u?d?s +?d?d?s?s?d?u?u?d +?d?d?s?s?d?u?u?u +?d?d?s?s?d?u?u?s +?d?d?s?s?d?u?s?d +?d?d?s?s?d?u?s?u +?d?d?s?s?d?u?s?s +?d?d?s?s?d?s?d?d +?d?d?s?s?d?s?d?l +?d?d?s?s?d?s?d?u +?d?d?s?s?d?s?d?s +?d?d?s?s?d?s?l?d +?d?d?s?s?d?s?l?l +?d?d?s?s?d?s?l?s +?d?d?s?s?d?s?u?d +?d?d?s?s?d?s?u?u +?d?d?s?s?d?s?u?s +?d?d?s?s?d?s?s?d +?d?d?s?s?d?s?s?l +?d?d?s?s?d?s?s?u +?d?d?s?s?d?s?s?s +?d?d?s?s?l?d?d?d +?d?d?s?s?l?d?d?l +?d?d?s?s?l?d?d?s +?d?d?s?s?l?d?l?d +?d?d?s?s?l?d?l?l +?d?d?s?s?l?d?l?s +?d?d?s?s?l?d?s?d +?d?d?s?s?l?d?s?l +?d?d?s?s?l?d?s?s +?d?d?s?s?l?l?d?d +?d?d?s?s?l?l?d?l +?d?d?s?s?l?l?d?s +?d?d?s?s?l?l?l?d +?d?d?s?s?l?l?l?l +?d?d?s?s?l?l?l?s +?d?d?s?s?l?l?s?d +?d?d?s?s?l?l?s?l +?d?d?s?s?l?l?s?s +?d?d?s?s?l?s?d?d +?d?d?s?s?l?s?d?l +?d?d?s?s?l?s?d?s +?d?d?s?s?l?s?l?d +?d?d?s?s?l?s?l?l +?d?d?s?s?l?s?l?s +?d?d?s?s?l?s?s?d +?d?d?s?s?l?s?s?l +?d?d?s?s?l?s?s?s +?d?d?s?s?u?d?d?d +?d?d?s?s?u?d?d?u +?d?d?s?s?u?d?d?s +?d?d?s?s?u?d?u?d +?d?d?s?s?u?d?u?u +?d?d?s?s?u?d?u?s +?d?d?s?s?u?d?s?d +?d?d?s?s?u?d?s?u +?d?d?s?s?u?d?s?s +?d?d?s?s?u?u?d?d +?d?d?s?s?u?u?d?u +?d?d?s?s?u?u?d?s +?d?d?s?s?u?u?u?d +?d?d?s?s?u?u?u?u +?d?d?s?s?u?u?u?s +?d?d?s?s?u?u?s?d +?d?d?s?s?u?u?s?u +?d?d?s?s?u?u?s?s +?d?d?s?s?u?s?d?d +?d?d?s?s?u?s?d?u +?d?d?s?s?u?s?d?s +?d?d?s?s?u?s?u?d +?d?d?s?s?u?s?u?u +?d?d?s?s?u?s?u?s +?d?d?s?s?u?s?s?d +?d?d?s?s?u?s?s?u +?d?d?s?s?u?s?s?s +?d?d?s?s?s?d?d?d +?d?d?s?s?s?d?d?l +?d?d?s?s?s?d?d?u +?d?d?s?s?s?d?d?s +?d?d?s?s?s?d?l?d +?d?d?s?s?s?d?l?l +?d?d?s?s?s?d?l?s +?d?d?s?s?s?d?u?d +?d?d?s?s?s?d?u?u +?d?d?s?s?s?d?u?s +?d?d?s?s?s?d?s?d +?d?d?s?s?s?d?s?l +?d?d?s?s?s?d?s?u +?d?d?s?s?s?d?s?s +?d?d?s?s?s?l?d?d +?d?d?s?s?s?l?d?l +?d?d?s?s?s?l?d?s +?d?d?s?s?s?l?l?d +?d?d?s?s?s?l?l?l +?d?d?s?s?s?l?l?s +?d?d?s?s?s?l?s?d +?d?d?s?s?s?l?s?l +?d?d?s?s?s?l?s?s +?d?d?s?s?s?u?d?d +?d?d?s?s?s?u?d?u +?d?d?s?s?s?u?d?s +?d?d?s?s?s?u?u?d +?d?d?s?s?s?u?u?u +?d?d?s?s?s?u?u?s +?d?d?s?s?s?u?s?d +?d?d?s?s?s?u?s?u +?d?d?s?s?s?u?s?s +?d?d?s?s?s?s?d?d +?d?d?s?s?s?s?d?l +?d?d?s?s?s?s?d?u +?d?d?s?s?s?s?d?s +?d?d?s?s?s?s?l?d +?d?d?s?s?s?s?l?l +?d?d?s?s?s?s?l?s +?d?d?s?s?s?s?u?d +?d?d?s?s?s?s?u?u +?d?d?s?s?s?s?u?s +?d?d?s?s?s?s?s?d +?d?d?s?s?s?s?s?l +?d?d?s?s?s?s?s?u +?d?d?s?s?s?s?s?s +?d?l?d?d?d?d?d?d +?d?l?d?d?d?d?d?l +?d?l?d?d?d?d?d?u +?d?l?d?d?d?d?d?s +?d?l?d?d?d?d?l?d +?d?l?d?d?d?d?l?l +?d?l?d?d?d?d?l?u +?d?l?d?d?d?d?l?s +?d?l?d?d?d?d?u?d +?d?l?d?d?d?d?u?l +?d?l?d?d?d?d?u?u +?d?l?d?d?d?d?s?d +?d?l?d?d?d?d?s?l +?d?l?d?d?d?d?s?s +?d?l?d?d?d?l?d?d +?d?l?d?d?d?l?d?l +?d?l?d?d?d?l?d?u +?d?l?d?d?d?l?d?s +?d?l?d?d?d?l?l?d +?d?l?d?d?d?l?l?l +?d?l?d?d?d?l?l?u +?d?l?d?d?d?l?l?s +?d?l?d?d?d?l?u?d +?d?l?d?d?d?l?u?l +?d?l?d?d?d?l?u?u +?d?l?d?d?d?l?s?d +?d?l?d?d?d?l?s?l +?d?l?d?d?d?l?s?s +?d?l?d?d?d?u?d?d +?d?l?d?d?d?u?d?l +?d?l?d?d?d?u?d?u +?d?l?d?d?d?u?l?d +?d?l?d?d?d?u?l?l +?d?l?d?d?d?u?l?u +?d?l?d?d?d?u?u?d +?d?l?d?d?d?u?u?l +?d?l?d?d?d?u?u?u +?d?l?d?d?d?s?d?d +?d?l?d?d?d?s?d?l +?d?l?d?d?d?s?d?s +?d?l?d?d?d?s?l?d +?d?l?d?d?d?s?l?l +?d?l?d?d?d?s?l?s +?d?l?d?d?d?s?s?d +?d?l?d?d?d?s?s?l +?d?l?d?d?d?s?s?s +?d?l?d?d?l?d?d?d +?d?l?d?d?l?d?d?l +?d?l?d?d?l?d?d?u +?d?l?d?d?l?d?d?s +?d?l?d?d?l?d?l?d +?d?l?d?d?l?d?l?l +?d?l?d?d?l?d?l?u +?d?l?d?d?l?d?l?s +?d?l?d?d?l?d?u?d +?d?l?d?d?l?d?u?l +?d?l?d?d?l?d?u?u +?d?l?d?d?l?d?s?d +?d?l?d?d?l?d?s?l +?d?l?d?d?l?d?s?s +?d?l?d?d?l?l?d?d +?d?l?d?d?l?l?d?l +?d?l?d?d?l?l?d?u +?d?l?d?d?l?l?d?s +?d?l?d?d?l?l?l?d +?d?l?d?d?l?l?l?l +?d?l?d?d?l?l?l?u +?d?l?d?d?l?l?l?s +?d?l?d?d?l?l?u?d +?d?l?d?d?l?l?u?l +?d?l?d?d?l?l?u?u +?d?l?d?d?l?l?s?d +?d?l?d?d?l?l?s?l +?d?l?d?d?l?l?s?s +?d?l?d?d?l?u?d?d +?d?l?d?d?l?u?d?l +?d?l?d?d?l?u?d?u +?d?l?d?d?l?u?l?d +?d?l?d?d?l?u?l?l +?d?l?d?d?l?u?l?u +?d?l?d?d?l?u?u?d +?d?l?d?d?l?u?u?l +?d?l?d?d?l?u?u?u +?d?l?d?d?l?s?d?d +?d?l?d?d?l?s?d?l +?d?l?d?d?l?s?d?s +?d?l?d?d?l?s?l?d +?d?l?d?d?l?s?l?l +?d?l?d?d?l?s?l?s +?d?l?d?d?l?s?s?d +?d?l?d?d?l?s?s?l +?d?l?d?d?l?s?s?s +?d?l?d?d?u?d?d?d +?d?l?d?d?u?d?d?l +?d?l?d?d?u?d?d?u +?d?l?d?d?u?d?l?d +?d?l?d?d?u?d?l?l +?d?l?d?d?u?d?l?u +?d?l?d?d?u?d?u?d +?d?l?d?d?u?d?u?l +?d?l?d?d?u?d?u?u +?d?l?d?d?u?l?d?d +?d?l?d?d?u?l?d?l +?d?l?d?d?u?l?d?u +?d?l?d?d?u?l?l?d +?d?l?d?d?u?l?l?l +?d?l?d?d?u?l?l?u +?d?l?d?d?u?l?u?d +?d?l?d?d?u?l?u?l +?d?l?d?d?u?l?u?u +?d?l?d?d?u?u?d?d +?d?l?d?d?u?u?d?l +?d?l?d?d?u?u?d?u +?d?l?d?d?u?u?l?d +?d?l?d?d?u?u?l?l +?d?l?d?d?u?u?l?u +?d?l?d?d?u?u?u?d +?d?l?d?d?u?u?u?l +?d?l?d?d?u?u?u?u +?d?l?d?d?s?d?d?d +?d?l?d?d?s?d?d?l +?d?l?d?d?s?d?d?s +?d?l?d?d?s?d?l?d +?d?l?d?d?s?d?l?l +?d?l?d?d?s?d?l?s +?d?l?d?d?s?d?s?d +?d?l?d?d?s?d?s?l +?d?l?d?d?s?d?s?s +?d?l?d?d?s?l?d?d +?d?l?d?d?s?l?d?l +?d?l?d?d?s?l?d?s +?d?l?d?d?s?l?l?d +?d?l?d?d?s?l?l?l +?d?l?d?d?s?l?l?s +?d?l?d?d?s?l?s?d +?d?l?d?d?s?l?s?l +?d?l?d?d?s?l?s?s +?d?l?d?d?s?s?d?d +?d?l?d?d?s?s?d?l +?d?l?d?d?s?s?d?s +?d?l?d?d?s?s?l?d +?d?l?d?d?s?s?l?l +?d?l?d?d?s?s?l?s +?d?l?d?d?s?s?s?d +?d?l?d?d?s?s?s?l +?d?l?d?d?s?s?s?s +?d?l?d?l?d?d?d?d +?d?l?d?l?d?d?d?l +?d?l?d?l?d?d?d?u +?d?l?d?l?d?d?d?s +?d?l?d?l?d?d?l?d +?d?l?d?l?d?d?l?l +?d?l?d?l?d?d?l?u +?d?l?d?l?d?d?l?s +?d?l?d?l?d?d?u?d +?d?l?d?l?d?d?u?l +?d?l?d?l?d?d?u?u +?d?l?d?l?d?d?s?d +?d?l?d?l?d?d?s?l +?d?l?d?l?d?d?s?s +?d?l?d?l?d?l?d?d +?d?l?d?l?d?l?d?l +?d?l?d?l?d?l?d?u +?d?l?d?l?d?l?d?s +?d?l?d?l?d?l?l?d +?d?l?d?l?d?l?l?l +?d?l?d?l?d?l?l?u +?d?l?d?l?d?l?l?s +?d?l?d?l?d?l?u?d +?d?l?d?l?d?l?u?l +?d?l?d?l?d?l?u?u +?d?l?d?l?d?l?s?d +?d?l?d?l?d?l?s?l +?d?l?d?l?d?l?s?s +?d?l?d?l?d?u?d?d +?d?l?d?l?d?u?d?l +?d?l?d?l?d?u?d?u +?d?l?d?l?d?u?l?d +?d?l?d?l?d?u?l?l +?d?l?d?l?d?u?l?u +?d?l?d?l?d?u?u?d +?d?l?d?l?d?u?u?l +?d?l?d?l?d?u?u?u +?d?l?d?l?d?s?d?d +?d?l?d?l?d?s?d?l +?d?l?d?l?d?s?d?s +?d?l?d?l?d?s?l?d +?d?l?d?l?d?s?l?l +?d?l?d?l?d?s?l?s +?d?l?d?l?d?s?s?d +?d?l?d?l?d?s?s?l +?d?l?d?l?d?s?s?s +?d?l?d?l?l?d?d?d +?d?l?d?l?l?d?d?l +?d?l?d?l?l?d?d?u +?d?l?d?l?l?d?d?s +?d?l?d?l?l?d?l?d +?d?l?d?l?l?d?l?l +?d?l?d?l?l?d?l?u +?d?l?d?l?l?d?l?s +?d?l?d?l?l?d?u?d +?d?l?d?l?l?d?u?l +?d?l?d?l?l?d?u?u +?d?l?d?l?l?d?s?d +?d?l?d?l?l?d?s?l +?d?l?d?l?l?d?s?s +?d?l?d?l?l?l?d?d +?d?l?d?l?l?l?d?l +?d?l?d?l?l?l?d?u +?d?l?d?l?l?l?d?s +?d?l?d?l?l?l?l?d +?d?l?d?l?l?l?l?l +?d?l?d?l?l?l?l?u +?d?l?d?l?l?l?l?s +?d?l?d?l?l?l?u?d +?d?l?d?l?l?l?u?l +?d?l?d?l?l?l?u?u +?d?l?d?l?l?l?s?d +?d?l?d?l?l?l?s?l +?d?l?d?l?l?l?s?s +?d?l?d?l?l?u?d?d +?d?l?d?l?l?u?d?l +?d?l?d?l?l?u?d?u +?d?l?d?l?l?u?l?d +?d?l?d?l?l?u?l?l +?d?l?d?l?l?u?l?u +?d?l?d?l?l?u?u?d +?d?l?d?l?l?u?u?l +?d?l?d?l?l?u?u?u +?d?l?d?l?l?s?d?d +?d?l?d?l?l?s?d?l +?d?l?d?l?l?s?d?s +?d?l?d?l?l?s?l?d +?d?l?d?l?l?s?l?l +?d?l?d?l?l?s?l?s +?d?l?d?l?l?s?s?d +?d?l?d?l?l?s?s?l +?d?l?d?l?l?s?s?s +?d?l?d?l?u?d?d?d +?d?l?d?l?u?d?d?l +?d?l?d?l?u?d?d?u +?d?l?d?l?u?d?l?d +?d?l?d?l?u?d?l?l +?d?l?d?l?u?d?l?u +?d?l?d?l?u?d?u?d +?d?l?d?l?u?d?u?l +?d?l?d?l?u?d?u?u +?d?l?d?l?u?l?d?d +?d?l?d?l?u?l?d?l +?d?l?d?l?u?l?d?u +?d?l?d?l?u?l?l?d +?d?l?d?l?u?l?l?l +?d?l?d?l?u?l?l?u +?d?l?d?l?u?l?u?d +?d?l?d?l?u?l?u?l +?d?l?d?l?u?l?u?u +?d?l?d?l?u?u?d?d +?d?l?d?l?u?u?d?l +?d?l?d?l?u?u?d?u +?d?l?d?l?u?u?l?d +?d?l?d?l?u?u?l?l +?d?l?d?l?u?u?l?u +?d?l?d?l?u?u?u?d +?d?l?d?l?u?u?u?l +?d?l?d?l?u?u?u?u +?d?l?d?l?s?d?d?d +?d?l?d?l?s?d?d?l +?d?l?d?l?s?d?d?s +?d?l?d?l?s?d?l?d +?d?l?d?l?s?d?l?l +?d?l?d?l?s?d?l?s +?d?l?d?l?s?d?s?d +?d?l?d?l?s?d?s?l +?d?l?d?l?s?d?s?s +?d?l?d?l?s?l?d?d +?d?l?d?l?s?l?d?l +?d?l?d?l?s?l?d?s +?d?l?d?l?s?l?l?d +?d?l?d?l?s?l?l?l +?d?l?d?l?s?l?l?s +?d?l?d?l?s?l?s?d +?d?l?d?l?s?l?s?l +?d?l?d?l?s?l?s?s +?d?l?d?l?s?s?d?d +?d?l?d?l?s?s?d?l +?d?l?d?l?s?s?d?s +?d?l?d?l?s?s?l?d +?d?l?d?l?s?s?l?l +?d?l?d?l?s?s?l?s +?d?l?d?l?s?s?s?d +?d?l?d?l?s?s?s?l +?d?l?d?l?s?s?s?s +?d?l?d?u?d?d?d?d +?d?l?d?u?d?d?d?l +?d?l?d?u?d?d?d?u +?d?l?d?u?d?d?l?d +?d?l?d?u?d?d?l?l +?d?l?d?u?d?d?l?u +?d?l?d?u?d?d?u?d +?d?l?d?u?d?d?u?l +?d?l?d?u?d?d?u?u +?d?l?d?u?d?l?d?d +?d?l?d?u?d?l?d?l +?d?l?d?u?d?l?d?u +?d?l?d?u?d?l?l?d +?d?l?d?u?d?l?l?l +?d?l?d?u?d?l?l?u +?d?l?d?u?d?l?u?d +?d?l?d?u?d?l?u?l +?d?l?d?u?d?l?u?u +?d?l?d?u?d?u?d?d +?d?l?d?u?d?u?d?l +?d?l?d?u?d?u?d?u +?d?l?d?u?d?u?l?d +?d?l?d?u?d?u?l?l +?d?l?d?u?d?u?l?u +?d?l?d?u?d?u?u?d +?d?l?d?u?d?u?u?l +?d?l?d?u?d?u?u?u +?d?l?d?u?l?d?d?d +?d?l?d?u?l?d?d?l +?d?l?d?u?l?d?d?u +?d?l?d?u?l?d?l?d +?d?l?d?u?l?d?l?l +?d?l?d?u?l?d?l?u +?d?l?d?u?l?d?u?d +?d?l?d?u?l?d?u?l +?d?l?d?u?l?d?u?u +?d?l?d?u?l?l?d?d +?d?l?d?u?l?l?d?l +?d?l?d?u?l?l?d?u +?d?l?d?u?l?l?l?d +?d?l?d?u?l?l?l?l +?d?l?d?u?l?l?l?u +?d?l?d?u?l?l?u?d +?d?l?d?u?l?l?u?l +?d?l?d?u?l?l?u?u +?d?l?d?u?l?u?d?d +?d?l?d?u?l?u?d?l +?d?l?d?u?l?u?d?u +?d?l?d?u?l?u?l?d +?d?l?d?u?l?u?l?l +?d?l?d?u?l?u?l?u +?d?l?d?u?l?u?u?d +?d?l?d?u?l?u?u?l +?d?l?d?u?l?u?u?u +?d?l?d?u?u?d?d?d +?d?l?d?u?u?d?d?l +?d?l?d?u?u?d?d?u +?d?l?d?u?u?d?l?d +?d?l?d?u?u?d?l?l +?d?l?d?u?u?d?l?u +?d?l?d?u?u?d?u?d +?d?l?d?u?u?d?u?l +?d?l?d?u?u?d?u?u +?d?l?d?u?u?l?d?d +?d?l?d?u?u?l?d?l +?d?l?d?u?u?l?d?u +?d?l?d?u?u?l?l?d +?d?l?d?u?u?l?l?l +?d?l?d?u?u?l?l?u +?d?l?d?u?u?l?u?d +?d?l?d?u?u?l?u?l +?d?l?d?u?u?l?u?u +?d?l?d?u?u?u?d?d +?d?l?d?u?u?u?d?l +?d?l?d?u?u?u?d?u +?d?l?d?u?u?u?l?d +?d?l?d?u?u?u?l?l +?d?l?d?u?u?u?l?u +?d?l?d?u?u?u?u?d +?d?l?d?u?u?u?u?l +?d?l?d?u?u?u?u?u +?d?l?d?s?d?d?d?d +?d?l?d?s?d?d?d?l +?d?l?d?s?d?d?d?s +?d?l?d?s?d?d?l?d +?d?l?d?s?d?d?l?l +?d?l?d?s?d?d?l?s +?d?l?d?s?d?d?s?d +?d?l?d?s?d?d?s?l +?d?l?d?s?d?d?s?s +?d?l?d?s?d?l?d?d +?d?l?d?s?d?l?d?l +?d?l?d?s?d?l?d?s +?d?l?d?s?d?l?l?d +?d?l?d?s?d?l?l?l +?d?l?d?s?d?l?l?s +?d?l?d?s?d?l?s?d +?d?l?d?s?d?l?s?l +?d?l?d?s?d?l?s?s +?d?l?d?s?d?s?d?d +?d?l?d?s?d?s?d?l +?d?l?d?s?d?s?d?s +?d?l?d?s?d?s?l?d +?d?l?d?s?d?s?l?l +?d?l?d?s?d?s?l?s +?d?l?d?s?d?s?s?d +?d?l?d?s?d?s?s?l +?d?l?d?s?d?s?s?s +?d?l?d?s?l?d?d?d +?d?l?d?s?l?d?d?l +?d?l?d?s?l?d?d?s +?d?l?d?s?l?d?l?d +?d?l?d?s?l?d?l?l +?d?l?d?s?l?d?l?s +?d?l?d?s?l?d?s?d +?d?l?d?s?l?d?s?l +?d?l?d?s?l?d?s?s +?d?l?d?s?l?l?d?d +?d?l?d?s?l?l?d?l +?d?l?d?s?l?l?d?s +?d?l?d?s?l?l?l?d +?d?l?d?s?l?l?l?l +?d?l?d?s?l?l?l?s +?d?l?d?s?l?l?s?d +?d?l?d?s?l?l?s?l +?d?l?d?s?l?l?s?s +?d?l?d?s?l?s?d?d +?d?l?d?s?l?s?d?l +?d?l?d?s?l?s?d?s +?d?l?d?s?l?s?l?d +?d?l?d?s?l?s?l?l +?d?l?d?s?l?s?l?s +?d?l?d?s?l?s?s?d +?d?l?d?s?l?s?s?l +?d?l?d?s?l?s?s?s +?d?l?d?s?s?d?d?d +?d?l?d?s?s?d?d?l +?d?l?d?s?s?d?d?s +?d?l?d?s?s?d?l?d +?d?l?d?s?s?d?l?l +?d?l?d?s?s?d?l?s +?d?l?d?s?s?d?s?d +?d?l?d?s?s?d?s?l +?d?l?d?s?s?d?s?s +?d?l?d?s?s?l?d?d +?d?l?d?s?s?l?d?l +?d?l?d?s?s?l?d?s +?d?l?d?s?s?l?l?d +?d?l?d?s?s?l?l?l +?d?l?d?s?s?l?l?s +?d?l?d?s?s?l?s?d +?d?l?d?s?s?l?s?l +?d?l?d?s?s?l?s?s +?d?l?d?s?s?s?d?d +?d?l?d?s?s?s?d?l +?d?l?d?s?s?s?d?s +?d?l?d?s?s?s?l?d +?d?l?d?s?s?s?l?l +?d?l?d?s?s?s?l?s +?d?l?d?s?s?s?s?d +?d?l?d?s?s?s?s?l +?d?l?d?s?s?s?s?s +?d?l?l?d?d?d?d?d +?d?l?l?d?d?d?d?l +?d?l?l?d?d?d?d?u +?d?l?l?d?d?d?d?s +?d?l?l?d?d?d?l?d +?d?l?l?d?d?d?l?l +?d?l?l?d?d?d?l?u +?d?l?l?d?d?d?l?s +?d?l?l?d?d?d?u?d +?d?l?l?d?d?d?u?l +?d?l?l?d?d?d?u?u +?d?l?l?d?d?d?s?d +?d?l?l?d?d?d?s?l +?d?l?l?d?d?d?s?s +?d?l?l?d?d?l?d?d +?d?l?l?d?d?l?d?l +?d?l?l?d?d?l?d?u +?d?l?l?d?d?l?d?s +?d?l?l?d?d?l?l?d +?d?l?l?d?d?l?l?l +?d?l?l?d?d?l?l?u +?d?l?l?d?d?l?l?s +?d?l?l?d?d?l?u?d +?d?l?l?d?d?l?u?l +?d?l?l?d?d?l?u?u +?d?l?l?d?d?l?s?d +?d?l?l?d?d?l?s?l +?d?l?l?d?d?l?s?s +?d?l?l?d?d?u?d?d +?d?l?l?d?d?u?d?l +?d?l?l?d?d?u?d?u +?d?l?l?d?d?u?l?d +?d?l?l?d?d?u?l?l +?d?l?l?d?d?u?l?u +?d?l?l?d?d?u?u?d +?d?l?l?d?d?u?u?l +?d?l?l?d?d?u?u?u +?d?l?l?d?d?s?d?d +?d?l?l?d?d?s?d?l +?d?l?l?d?d?s?d?s +?d?l?l?d?d?s?l?d +?d?l?l?d?d?s?l?l +?d?l?l?d?d?s?l?s +?d?l?l?d?d?s?s?d +?d?l?l?d?d?s?s?l +?d?l?l?d?d?s?s?s +?d?l?l?d?l?d?d?d +?d?l?l?d?l?d?d?l +?d?l?l?d?l?d?d?u +?d?l?l?d?l?d?d?s +?d?l?l?d?l?d?l?d +?d?l?l?d?l?d?l?l +?d?l?l?d?l?d?l?u +?d?l?l?d?l?d?l?s +?d?l?l?d?l?d?u?d +?d?l?l?d?l?d?u?l +?d?l?l?d?l?d?u?u +?d?l?l?d?l?d?s?d +?d?l?l?d?l?d?s?l +?d?l?l?d?l?d?s?s +?d?l?l?d?l?l?d?d +?d?l?l?d?l?l?d?l +?d?l?l?d?l?l?d?u +?d?l?l?d?l?l?d?s +?d?l?l?d?l?l?l?d +?d?l?l?d?l?l?l?l +?d?l?l?d?l?l?l?u +?d?l?l?d?l?l?l?s +?d?l?l?d?l?l?u?d +?d?l?l?d?l?l?u?l +?d?l?l?d?l?l?u?u +?d?l?l?d?l?l?s?d +?d?l?l?d?l?l?s?l +?d?l?l?d?l?l?s?s +?d?l?l?d?l?u?d?d +?d?l?l?d?l?u?d?l +?d?l?l?d?l?u?d?u +?d?l?l?d?l?u?l?d +?d?l?l?d?l?u?l?l +?d?l?l?d?l?u?l?u +?d?l?l?d?l?u?u?d +?d?l?l?d?l?u?u?l +?d?l?l?d?l?u?u?u +?d?l?l?d?l?s?d?d +?d?l?l?d?l?s?d?l +?d?l?l?d?l?s?d?s +?d?l?l?d?l?s?l?d +?d?l?l?d?l?s?l?l +?d?l?l?d?l?s?l?s +?d?l?l?d?l?s?s?d +?d?l?l?d?l?s?s?l +?d?l?l?d?l?s?s?s +?d?l?l?d?u?d?d?d +?d?l?l?d?u?d?d?l +?d?l?l?d?u?d?d?u +?d?l?l?d?u?d?l?d +?d?l?l?d?u?d?l?l +?d?l?l?d?u?d?l?u +?d?l?l?d?u?d?u?d +?d?l?l?d?u?d?u?l +?d?l?l?d?u?d?u?u +?d?l?l?d?u?l?d?d +?d?l?l?d?u?l?d?l +?d?l?l?d?u?l?d?u +?d?l?l?d?u?l?l?d +?d?l?l?d?u?l?l?l +?d?l?l?d?u?l?l?u +?d?l?l?d?u?l?u?d +?d?l?l?d?u?l?u?l +?d?l?l?d?u?l?u?u +?d?l?l?d?u?u?d?d +?d?l?l?d?u?u?d?l +?d?l?l?d?u?u?d?u +?d?l?l?d?u?u?l?d +?d?l?l?d?u?u?l?l +?d?l?l?d?u?u?l?u +?d?l?l?d?u?u?u?d +?d?l?l?d?u?u?u?l +?d?l?l?d?u?u?u?u +?d?l?l?d?s?d?d?d +?d?l?l?d?s?d?d?l +?d?l?l?d?s?d?d?s +?d?l?l?d?s?d?l?d +?d?l?l?d?s?d?l?l +?d?l?l?d?s?d?l?s +?d?l?l?d?s?d?s?d +?d?l?l?d?s?d?s?l +?d?l?l?d?s?d?s?s +?d?l?l?d?s?l?d?d +?d?l?l?d?s?l?d?l +?d?l?l?d?s?l?d?s +?d?l?l?d?s?l?l?d +?d?l?l?d?s?l?l?l +?d?l?l?d?s?l?l?s +?d?l?l?d?s?l?s?d +?d?l?l?d?s?l?s?l +?d?l?l?d?s?l?s?s +?d?l?l?d?s?s?d?d +?d?l?l?d?s?s?d?l +?d?l?l?d?s?s?d?s +?d?l?l?d?s?s?l?d +?d?l?l?d?s?s?l?l +?d?l?l?d?s?s?l?s +?d?l?l?d?s?s?s?d +?d?l?l?d?s?s?s?l +?d?l?l?d?s?s?s?s +?d?l?l?l?d?d?d?d +?d?l?l?l?d?d?d?l +?d?l?l?l?d?d?d?u +?d?l?l?l?d?d?d?s +?d?l?l?l?d?d?l?d +?d?l?l?l?d?d?l?l +?d?l?l?l?d?d?l?u +?d?l?l?l?d?d?l?s +?d?l?l?l?d?d?u?d +?d?l?l?l?d?d?u?l +?d?l?l?l?d?d?u?u +?d?l?l?l?d?d?s?d +?d?l?l?l?d?d?s?l +?d?l?l?l?d?d?s?s +?d?l?l?l?d?l?d?d +?d?l?l?l?d?l?d?l +?d?l?l?l?d?l?d?u +?d?l?l?l?d?l?d?s +?d?l?l?l?d?l?l?d +?d?l?l?l?d?l?l?l +?d?l?l?l?d?l?l?u +?d?l?l?l?d?l?l?s +?d?l?l?l?d?l?u?d +?d?l?l?l?d?l?u?l +?d?l?l?l?d?l?u?u +?d?l?l?l?d?l?s?d +?d?l?l?l?d?l?s?l +?d?l?l?l?d?l?s?s +?d?l?l?l?d?u?d?d +?d?l?l?l?d?u?d?l +?d?l?l?l?d?u?d?u +?d?l?l?l?d?u?l?d +?d?l?l?l?d?u?l?l +?d?l?l?l?d?u?l?u +?d?l?l?l?d?u?u?d +?d?l?l?l?d?u?u?l +?d?l?l?l?d?u?u?u +?d?l?l?l?d?s?d?d +?d?l?l?l?d?s?d?l +?d?l?l?l?d?s?d?s +?d?l?l?l?d?s?l?d +?d?l?l?l?d?s?l?l +?d?l?l?l?d?s?l?s +?d?l?l?l?d?s?s?d +?d?l?l?l?d?s?s?l +?d?l?l?l?d?s?s?s +?d?l?l?l?l?d?d?d +?d?l?l?l?l?d?d?l +?d?l?l?l?l?d?d?u +?d?l?l?l?l?d?d?s +?d?l?l?l?l?d?l?d +?d?l?l?l?l?d?l?l +?d?l?l?l?l?d?l?u +?d?l?l?l?l?d?l?s +?d?l?l?l?l?d?u?d +?d?l?l?l?l?d?u?l +?d?l?l?l?l?d?u?u +?d?l?l?l?l?d?s?d +?d?l?l?l?l?d?s?l +?d?l?l?l?l?d?s?s +?d?l?l?l?l?l?d?d +?d?l?l?l?l?l?d?l +?d?l?l?l?l?l?d?u +?d?l?l?l?l?l?d?s +?d?l?l?l?l?l?l?d +?d?l?l?l?l?l?l?l +?d?l?l?l?l?l?l?u +?d?l?l?l?l?l?l?s +?d?l?l?l?l?l?u?d +?d?l?l?l?l?l?u?l +?d?l?l?l?l?l?u?u +?d?l?l?l?l?l?s?d +?d?l?l?l?l?l?s?l +?d?l?l?l?l?l?s?s +?d?l?l?l?l?u?d?d +?d?l?l?l?l?u?d?l +?d?l?l?l?l?u?d?u +?d?l?l?l?l?u?l?d +?d?l?l?l?l?u?l?l +?d?l?l?l?l?u?l?u +?d?l?l?l?l?u?u?d +?d?l?l?l?l?u?u?l +?d?l?l?l?l?u?u?u +?d?l?l?l?l?s?d?d +?d?l?l?l?l?s?d?l +?d?l?l?l?l?s?d?s +?d?l?l?l?l?s?l?d +?d?l?l?l?l?s?l?l +?d?l?l?l?l?s?l?s +?d?l?l?l?l?s?s?d +?d?l?l?l?l?s?s?l +?d?l?l?l?l?s?s?s +?d?l?l?l?u?d?d?d +?d?l?l?l?u?d?d?l +?d?l?l?l?u?d?d?u +?d?l?l?l?u?d?l?d +?d?l?l?l?u?d?l?l +?d?l?l?l?u?d?l?u +?d?l?l?l?u?d?u?d +?d?l?l?l?u?d?u?l +?d?l?l?l?u?d?u?u +?d?l?l?l?u?l?d?d +?d?l?l?l?u?l?d?l +?d?l?l?l?u?l?d?u +?d?l?l?l?u?l?l?d +?d?l?l?l?u?l?l?l +?d?l?l?l?u?l?l?u +?d?l?l?l?u?l?u?d +?d?l?l?l?u?l?u?l +?d?l?l?l?u?l?u?u +?d?l?l?l?u?u?d?d +?d?l?l?l?u?u?d?l +?d?l?l?l?u?u?d?u +?d?l?l?l?u?u?l?d +?d?l?l?l?u?u?l?l +?d?l?l?l?u?u?l?u +?d?l?l?l?u?u?u?d +?d?l?l?l?u?u?u?l +?d?l?l?l?u?u?u?u +?d?l?l?l?s?d?d?d +?d?l?l?l?s?d?d?l +?d?l?l?l?s?d?d?s +?d?l?l?l?s?d?l?d +?d?l?l?l?s?d?l?l +?d?l?l?l?s?d?l?s +?d?l?l?l?s?d?s?d +?d?l?l?l?s?d?s?l +?d?l?l?l?s?d?s?s +?d?l?l?l?s?l?d?d +?d?l?l?l?s?l?d?l +?d?l?l?l?s?l?d?s +?d?l?l?l?s?l?l?d +?d?l?l?l?s?l?l?l +?d?l?l?l?s?l?l?s +?d?l?l?l?s?l?s?d +?d?l?l?l?s?l?s?l +?d?l?l?l?s?l?s?s +?d?l?l?l?s?s?d?d +?d?l?l?l?s?s?d?l +?d?l?l?l?s?s?d?s +?d?l?l?l?s?s?l?d +?d?l?l?l?s?s?l?l +?d?l?l?l?s?s?l?s +?d?l?l?l?s?s?s?d +?d?l?l?l?s?s?s?l +?d?l?l?l?s?s?s?s +?d?l?l?u?d?d?d?d +?d?l?l?u?d?d?d?l +?d?l?l?u?d?d?d?u +?d?l?l?u?d?d?l?d +?d?l?l?u?d?d?l?l +?d?l?l?u?d?d?l?u +?d?l?l?u?d?d?u?d +?d?l?l?u?d?d?u?l +?d?l?l?u?d?d?u?u +?d?l?l?u?d?l?d?d +?d?l?l?u?d?l?d?l +?d?l?l?u?d?l?d?u +?d?l?l?u?d?l?l?d +?d?l?l?u?d?l?l?l +?d?l?l?u?d?l?l?u +?d?l?l?u?d?l?u?d +?d?l?l?u?d?l?u?l +?d?l?l?u?d?l?u?u +?d?l?l?u?d?u?d?d +?d?l?l?u?d?u?d?l +?d?l?l?u?d?u?d?u +?d?l?l?u?d?u?l?d +?d?l?l?u?d?u?l?l +?d?l?l?u?d?u?l?u +?d?l?l?u?d?u?u?d +?d?l?l?u?d?u?u?l +?d?l?l?u?d?u?u?u +?d?l?l?u?l?d?d?d +?d?l?l?u?l?d?d?l +?d?l?l?u?l?d?d?u +?d?l?l?u?l?d?l?d +?d?l?l?u?l?d?l?l +?d?l?l?u?l?d?l?u +?d?l?l?u?l?d?u?d +?d?l?l?u?l?d?u?l +?d?l?l?u?l?d?u?u +?d?l?l?u?l?l?d?d +?d?l?l?u?l?l?d?l +?d?l?l?u?l?l?d?u +?d?l?l?u?l?l?l?d +?d?l?l?u?l?l?l?l +?d?l?l?u?l?l?l?u +?d?l?l?u?l?l?u?d +?d?l?l?u?l?l?u?l +?d?l?l?u?l?l?u?u +?d?l?l?u?l?u?d?d +?d?l?l?u?l?u?d?l +?d?l?l?u?l?u?d?u +?d?l?l?u?l?u?l?d +?d?l?l?u?l?u?l?l +?d?l?l?u?l?u?l?u +?d?l?l?u?l?u?u?d +?d?l?l?u?l?u?u?l +?d?l?l?u?l?u?u?u +?d?l?l?u?u?d?d?d +?d?l?l?u?u?d?d?l +?d?l?l?u?u?d?d?u +?d?l?l?u?u?d?l?d +?d?l?l?u?u?d?l?l +?d?l?l?u?u?d?l?u +?d?l?l?u?u?d?u?d +?d?l?l?u?u?d?u?l +?d?l?l?u?u?d?u?u +?d?l?l?u?u?l?d?d +?d?l?l?u?u?l?d?l +?d?l?l?u?u?l?d?u +?d?l?l?u?u?l?l?d +?d?l?l?u?u?l?l?l +?d?l?l?u?u?l?l?u +?d?l?l?u?u?l?u?d +?d?l?l?u?u?l?u?l +?d?l?l?u?u?l?u?u +?d?l?l?u?u?u?d?d +?d?l?l?u?u?u?d?l +?d?l?l?u?u?u?d?u +?d?l?l?u?u?u?l?d +?d?l?l?u?u?u?l?l +?d?l?l?u?u?u?l?u +?d?l?l?u?u?u?u?d +?d?l?l?u?u?u?u?l +?d?l?l?u?u?u?u?u +?d?l?l?s?d?d?d?d +?d?l?l?s?d?d?d?l +?d?l?l?s?d?d?d?s +?d?l?l?s?d?d?l?d +?d?l?l?s?d?d?l?l +?d?l?l?s?d?d?l?s +?d?l?l?s?d?d?s?d +?d?l?l?s?d?d?s?l +?d?l?l?s?d?d?s?s +?d?l?l?s?d?l?d?d +?d?l?l?s?d?l?d?l +?d?l?l?s?d?l?d?s +?d?l?l?s?d?l?l?d +?d?l?l?s?d?l?l?l +?d?l?l?s?d?l?l?s +?d?l?l?s?d?l?s?d +?d?l?l?s?d?l?s?l +?d?l?l?s?d?l?s?s +?d?l?l?s?d?s?d?d +?d?l?l?s?d?s?d?l +?d?l?l?s?d?s?d?s +?d?l?l?s?d?s?l?d +?d?l?l?s?d?s?l?l +?d?l?l?s?d?s?l?s +?d?l?l?s?d?s?s?d +?d?l?l?s?d?s?s?l +?d?l?l?s?d?s?s?s +?d?l?l?s?l?d?d?d +?d?l?l?s?l?d?d?l +?d?l?l?s?l?d?d?s +?d?l?l?s?l?d?l?d +?d?l?l?s?l?d?l?l +?d?l?l?s?l?d?l?s +?d?l?l?s?l?d?s?d +?d?l?l?s?l?d?s?l +?d?l?l?s?l?d?s?s +?d?l?l?s?l?l?d?d +?d?l?l?s?l?l?d?l +?d?l?l?s?l?l?d?s +?d?l?l?s?l?l?l?d +?d?l?l?s?l?l?l?l +?d?l?l?s?l?l?l?s +?d?l?l?s?l?l?s?d +?d?l?l?s?l?l?s?l +?d?l?l?s?l?l?s?s +?d?l?l?s?l?s?d?d +?d?l?l?s?l?s?d?l +?d?l?l?s?l?s?d?s +?d?l?l?s?l?s?l?d +?d?l?l?s?l?s?l?l +?d?l?l?s?l?s?l?s +?d?l?l?s?l?s?s?d +?d?l?l?s?l?s?s?l +?d?l?l?s?l?s?s?s +?d?l?l?s?s?d?d?d +?d?l?l?s?s?d?d?l +?d?l?l?s?s?d?d?s +?d?l?l?s?s?d?l?d +?d?l?l?s?s?d?l?l +?d?l?l?s?s?d?l?s +?d?l?l?s?s?d?s?d +?d?l?l?s?s?d?s?l +?d?l?l?s?s?d?s?s +?d?l?l?s?s?l?d?d +?d?l?l?s?s?l?d?l +?d?l?l?s?s?l?d?s +?d?l?l?s?s?l?l?d +?d?l?l?s?s?l?l?l +?d?l?l?s?s?l?l?s +?d?l?l?s?s?l?s?d +?d?l?l?s?s?l?s?l +?d?l?l?s?s?l?s?s +?d?l?l?s?s?s?d?d +?d?l?l?s?s?s?d?l +?d?l?l?s?s?s?d?s +?d?l?l?s?s?s?l?d +?d?l?l?s?s?s?l?l +?d?l?l?s?s?s?l?s +?d?l?l?s?s?s?s?d +?d?l?l?s?s?s?s?l +?d?l?l?s?s?s?s?s +?d?l?u?d?d?d?d?d +?d?l?u?d?d?d?d?l +?d?l?u?d?d?d?d?u +?d?l?u?d?d?d?l?d +?d?l?u?d?d?d?l?l +?d?l?u?d?d?d?l?u +?d?l?u?d?d?d?u?d +?d?l?u?d?d?d?u?l +?d?l?u?d?d?d?u?u +?d?l?u?d?d?l?d?d +?d?l?u?d?d?l?d?l +?d?l?u?d?d?l?d?u +?d?l?u?d?d?l?l?d +?d?l?u?d?d?l?l?l +?d?l?u?d?d?l?l?u +?d?l?u?d?d?l?u?d +?d?l?u?d?d?l?u?l +?d?l?u?d?d?l?u?u +?d?l?u?d?d?u?d?d +?d?l?u?d?d?u?d?l +?d?l?u?d?d?u?d?u +?d?l?u?d?d?u?l?d +?d?l?u?d?d?u?l?l +?d?l?u?d?d?u?l?u +?d?l?u?d?d?u?u?d +?d?l?u?d?d?u?u?l +?d?l?u?d?d?u?u?u +?d?l?u?d?l?d?d?d +?d?l?u?d?l?d?d?l +?d?l?u?d?l?d?d?u +?d?l?u?d?l?d?l?d +?d?l?u?d?l?d?l?l +?d?l?u?d?l?d?l?u +?d?l?u?d?l?d?u?d +?d?l?u?d?l?d?u?l +?d?l?u?d?l?d?u?u +?d?l?u?d?l?l?d?d +?d?l?u?d?l?l?d?l +?d?l?u?d?l?l?d?u +?d?l?u?d?l?l?l?d +?d?l?u?d?l?l?l?l +?d?l?u?d?l?l?l?u +?d?l?u?d?l?l?u?d +?d?l?u?d?l?l?u?l +?d?l?u?d?l?l?u?u +?d?l?u?d?l?u?d?d +?d?l?u?d?l?u?d?l +?d?l?u?d?l?u?d?u +?d?l?u?d?l?u?l?d +?d?l?u?d?l?u?l?l +?d?l?u?d?l?u?l?u +?d?l?u?d?l?u?u?d +?d?l?u?d?l?u?u?l +?d?l?u?d?l?u?u?u +?d?l?u?d?u?d?d?d +?d?l?u?d?u?d?d?l +?d?l?u?d?u?d?d?u +?d?l?u?d?u?d?l?d +?d?l?u?d?u?d?l?l +?d?l?u?d?u?d?l?u +?d?l?u?d?u?d?u?d +?d?l?u?d?u?d?u?l +?d?l?u?d?u?d?u?u +?d?l?u?d?u?l?d?d +?d?l?u?d?u?l?d?l +?d?l?u?d?u?l?d?u +?d?l?u?d?u?l?l?d +?d?l?u?d?u?l?l?l +?d?l?u?d?u?l?l?u +?d?l?u?d?u?l?u?d +?d?l?u?d?u?l?u?l +?d?l?u?d?u?l?u?u +?d?l?u?d?u?u?d?d +?d?l?u?d?u?u?d?l +?d?l?u?d?u?u?d?u +?d?l?u?d?u?u?l?d +?d?l?u?d?u?u?l?l +?d?l?u?d?u?u?l?u +?d?l?u?d?u?u?u?d +?d?l?u?d?u?u?u?l +?d?l?u?d?u?u?u?u +?d?l?u?l?d?d?d?d +?d?l?u?l?d?d?d?l +?d?l?u?l?d?d?d?u +?d?l?u?l?d?d?l?d +?d?l?u?l?d?d?l?l +?d?l?u?l?d?d?l?u +?d?l?u?l?d?d?u?d +?d?l?u?l?d?d?u?l +?d?l?u?l?d?d?u?u +?d?l?u?l?d?l?d?d +?d?l?u?l?d?l?d?l +?d?l?u?l?d?l?d?u +?d?l?u?l?d?l?l?d +?d?l?u?l?d?l?l?l +?d?l?u?l?d?l?l?u +?d?l?u?l?d?l?u?d +?d?l?u?l?d?l?u?l +?d?l?u?l?d?l?u?u +?d?l?u?l?d?u?d?d +?d?l?u?l?d?u?d?l +?d?l?u?l?d?u?d?u +?d?l?u?l?d?u?l?d +?d?l?u?l?d?u?l?l +?d?l?u?l?d?u?l?u +?d?l?u?l?d?u?u?d +?d?l?u?l?d?u?u?l +?d?l?u?l?d?u?u?u +?d?l?u?l?l?d?d?d +?d?l?u?l?l?d?d?l +?d?l?u?l?l?d?d?u +?d?l?u?l?l?d?l?d +?d?l?u?l?l?d?l?l +?d?l?u?l?l?d?l?u +?d?l?u?l?l?d?u?d +?d?l?u?l?l?d?u?l +?d?l?u?l?l?d?u?u +?d?l?u?l?l?l?d?d +?d?l?u?l?l?l?d?l +?d?l?u?l?l?l?d?u +?d?l?u?l?l?l?l?d +?d?l?u?l?l?l?l?l +?d?l?u?l?l?l?l?u +?d?l?u?l?l?l?u?d +?d?l?u?l?l?l?u?l +?d?l?u?l?l?l?u?u +?d?l?u?l?l?u?d?d +?d?l?u?l?l?u?d?l +?d?l?u?l?l?u?d?u +?d?l?u?l?l?u?l?d +?d?l?u?l?l?u?l?l +?d?l?u?l?l?u?l?u +?d?l?u?l?l?u?u?d +?d?l?u?l?l?u?u?l +?d?l?u?l?l?u?u?u +?d?l?u?l?u?d?d?d +?d?l?u?l?u?d?d?l +?d?l?u?l?u?d?d?u +?d?l?u?l?u?d?l?d +?d?l?u?l?u?d?l?l +?d?l?u?l?u?d?l?u +?d?l?u?l?u?d?u?d +?d?l?u?l?u?d?u?l +?d?l?u?l?u?d?u?u +?d?l?u?l?u?l?d?d +?d?l?u?l?u?l?d?l +?d?l?u?l?u?l?d?u +?d?l?u?l?u?l?l?d +?d?l?u?l?u?l?l?l +?d?l?u?l?u?l?l?u +?d?l?u?l?u?l?u?d +?d?l?u?l?u?l?u?l +?d?l?u?l?u?l?u?u +?d?l?u?l?u?u?d?d +?d?l?u?l?u?u?d?l +?d?l?u?l?u?u?d?u +?d?l?u?l?u?u?l?d +?d?l?u?l?u?u?l?l +?d?l?u?l?u?u?l?u +?d?l?u?l?u?u?u?d +?d?l?u?l?u?u?u?l +?d?l?u?l?u?u?u?u +?d?l?u?u?d?d?d?d +?d?l?u?u?d?d?d?l +?d?l?u?u?d?d?d?u +?d?l?u?u?d?d?l?d +?d?l?u?u?d?d?l?l +?d?l?u?u?d?d?l?u +?d?l?u?u?d?d?u?d +?d?l?u?u?d?d?u?l +?d?l?u?u?d?d?u?u +?d?l?u?u?d?l?d?d +?d?l?u?u?d?l?d?l +?d?l?u?u?d?l?d?u +?d?l?u?u?d?l?l?d +?d?l?u?u?d?l?l?l +?d?l?u?u?d?l?l?u +?d?l?u?u?d?l?u?d +?d?l?u?u?d?l?u?l +?d?l?u?u?d?l?u?u +?d?l?u?u?d?u?d?d +?d?l?u?u?d?u?d?l +?d?l?u?u?d?u?d?u +?d?l?u?u?d?u?l?d +?d?l?u?u?d?u?l?l +?d?l?u?u?d?u?l?u +?d?l?u?u?d?u?u?d +?d?l?u?u?d?u?u?l +?d?l?u?u?d?u?u?u +?d?l?u?u?l?d?d?d +?d?l?u?u?l?d?d?l +?d?l?u?u?l?d?d?u +?d?l?u?u?l?d?l?d +?d?l?u?u?l?d?l?l +?d?l?u?u?l?d?l?u +?d?l?u?u?l?d?u?d +?d?l?u?u?l?d?u?l +?d?l?u?u?l?d?u?u +?d?l?u?u?l?l?d?d +?d?l?u?u?l?l?d?l +?d?l?u?u?l?l?d?u +?d?l?u?u?l?l?l?d +?d?l?u?u?l?l?l?l +?d?l?u?u?l?l?l?u +?d?l?u?u?l?l?u?d +?d?l?u?u?l?l?u?l +?d?l?u?u?l?l?u?u +?d?l?u?u?l?u?d?d +?d?l?u?u?l?u?d?l +?d?l?u?u?l?u?d?u +?d?l?u?u?l?u?l?d +?d?l?u?u?l?u?l?l +?d?l?u?u?l?u?l?u +?d?l?u?u?l?u?u?d +?d?l?u?u?l?u?u?l +?d?l?u?u?l?u?u?u +?d?l?u?u?u?d?d?d +?d?l?u?u?u?d?d?l +?d?l?u?u?u?d?d?u +?d?l?u?u?u?d?l?d +?d?l?u?u?u?d?l?l +?d?l?u?u?u?d?l?u +?d?l?u?u?u?d?u?d +?d?l?u?u?u?d?u?l +?d?l?u?u?u?d?u?u +?d?l?u?u?u?l?d?d +?d?l?u?u?u?l?d?l +?d?l?u?u?u?l?d?u +?d?l?u?u?u?l?l?d +?d?l?u?u?u?l?l?l +?d?l?u?u?u?l?l?u +?d?l?u?u?u?l?u?d +?d?l?u?u?u?l?u?l +?d?l?u?u?u?l?u?u +?d?l?u?u?u?u?d?d +?d?l?u?u?u?u?d?l +?d?l?u?u?u?u?d?u +?d?l?u?u?u?u?l?d +?d?l?u?u?u?u?l?l +?d?l?u?u?u?u?l?u +?d?l?u?u?u?u?u?d +?d?l?u?u?u?u?u?l +?d?l?u?u?u?u?u?u +?d?l?s?d?d?d?d?d +?d?l?s?d?d?d?d?l +?d?l?s?d?d?d?d?s +?d?l?s?d?d?d?l?d +?d?l?s?d?d?d?l?l +?d?l?s?d?d?d?l?s +?d?l?s?d?d?d?s?d +?d?l?s?d?d?d?s?l +?d?l?s?d?d?d?s?s +?d?l?s?d?d?l?d?d +?d?l?s?d?d?l?d?l +?d?l?s?d?d?l?d?s +?d?l?s?d?d?l?l?d +?d?l?s?d?d?l?l?l +?d?l?s?d?d?l?l?s +?d?l?s?d?d?l?s?d +?d?l?s?d?d?l?s?l +?d?l?s?d?d?l?s?s +?d?l?s?d?d?s?d?d +?d?l?s?d?d?s?d?l +?d?l?s?d?d?s?d?s +?d?l?s?d?d?s?l?d +?d?l?s?d?d?s?l?l +?d?l?s?d?d?s?l?s +?d?l?s?d?d?s?s?d +?d?l?s?d?d?s?s?l +?d?l?s?d?d?s?s?s +?d?l?s?d?l?d?d?d +?d?l?s?d?l?d?d?l +?d?l?s?d?l?d?d?s +?d?l?s?d?l?d?l?d +?d?l?s?d?l?d?l?l +?d?l?s?d?l?d?l?s +?d?l?s?d?l?d?s?d +?d?l?s?d?l?d?s?l +?d?l?s?d?l?d?s?s +?d?l?s?d?l?l?d?d +?d?l?s?d?l?l?d?l +?d?l?s?d?l?l?d?s +?d?l?s?d?l?l?l?d +?d?l?s?d?l?l?l?l +?d?l?s?d?l?l?l?s +?d?l?s?d?l?l?s?d +?d?l?s?d?l?l?s?l +?d?l?s?d?l?l?s?s +?d?l?s?d?l?s?d?d +?d?l?s?d?l?s?d?l +?d?l?s?d?l?s?d?s +?d?l?s?d?l?s?l?d +?d?l?s?d?l?s?l?l +?d?l?s?d?l?s?l?s +?d?l?s?d?l?s?s?d +?d?l?s?d?l?s?s?l +?d?l?s?d?l?s?s?s +?d?l?s?d?s?d?d?d +?d?l?s?d?s?d?d?l +?d?l?s?d?s?d?d?s +?d?l?s?d?s?d?l?d +?d?l?s?d?s?d?l?l +?d?l?s?d?s?d?l?s +?d?l?s?d?s?d?s?d +?d?l?s?d?s?d?s?l +?d?l?s?d?s?d?s?s +?d?l?s?d?s?l?d?d +?d?l?s?d?s?l?d?l +?d?l?s?d?s?l?d?s +?d?l?s?d?s?l?l?d +?d?l?s?d?s?l?l?l +?d?l?s?d?s?l?l?s +?d?l?s?d?s?l?s?d +?d?l?s?d?s?l?s?l +?d?l?s?d?s?l?s?s +?d?l?s?d?s?s?d?d +?d?l?s?d?s?s?d?l +?d?l?s?d?s?s?d?s +?d?l?s?d?s?s?l?d +?d?l?s?d?s?s?l?l +?d?l?s?d?s?s?l?s +?d?l?s?d?s?s?s?d +?d?l?s?d?s?s?s?l +?d?l?s?d?s?s?s?s +?d?l?s?l?d?d?d?d +?d?l?s?l?d?d?d?l +?d?l?s?l?d?d?d?s +?d?l?s?l?d?d?l?d +?d?l?s?l?d?d?l?l +?d?l?s?l?d?d?l?s +?d?l?s?l?d?d?s?d +?d?l?s?l?d?d?s?l +?d?l?s?l?d?d?s?s +?d?l?s?l?d?l?d?d +?d?l?s?l?d?l?d?l +?d?l?s?l?d?l?d?s +?d?l?s?l?d?l?l?d +?d?l?s?l?d?l?l?l +?d?l?s?l?d?l?l?s +?d?l?s?l?d?l?s?d +?d?l?s?l?d?l?s?l +?d?l?s?l?d?l?s?s +?d?l?s?l?d?s?d?d +?d?l?s?l?d?s?d?l +?d?l?s?l?d?s?d?s +?d?l?s?l?d?s?l?d +?d?l?s?l?d?s?l?l +?d?l?s?l?d?s?l?s +?d?l?s?l?d?s?s?d +?d?l?s?l?d?s?s?l +?d?l?s?l?d?s?s?s +?d?l?s?l?l?d?d?d +?d?l?s?l?l?d?d?l +?d?l?s?l?l?d?d?s +?d?l?s?l?l?d?l?d +?d?l?s?l?l?d?l?l +?d?l?s?l?l?d?l?s +?d?l?s?l?l?d?s?d +?d?l?s?l?l?d?s?l +?d?l?s?l?l?d?s?s +?d?l?s?l?l?l?d?d +?d?l?s?l?l?l?d?l +?d?l?s?l?l?l?d?s +?d?l?s?l?l?l?l?d +?d?l?s?l?l?l?l?l +?d?l?s?l?l?l?l?s +?d?l?s?l?l?l?s?d +?d?l?s?l?l?l?s?l +?d?l?s?l?l?l?s?s +?d?l?s?l?l?s?d?d +?d?l?s?l?l?s?d?l +?d?l?s?l?l?s?d?s +?d?l?s?l?l?s?l?d +?d?l?s?l?l?s?l?l +?d?l?s?l?l?s?l?s +?d?l?s?l?l?s?s?d +?d?l?s?l?l?s?s?l +?d?l?s?l?l?s?s?s +?d?l?s?l?s?d?d?d +?d?l?s?l?s?d?d?l +?d?l?s?l?s?d?d?s +?d?l?s?l?s?d?l?d +?d?l?s?l?s?d?l?l +?d?l?s?l?s?d?l?s +?d?l?s?l?s?d?s?d +?d?l?s?l?s?d?s?l +?d?l?s?l?s?d?s?s +?d?l?s?l?s?l?d?d +?d?l?s?l?s?l?d?l +?d?l?s?l?s?l?d?s +?d?l?s?l?s?l?l?d +?d?l?s?l?s?l?l?l +?d?l?s?l?s?l?l?s +?d?l?s?l?s?l?s?d +?d?l?s?l?s?l?s?l +?d?l?s?l?s?l?s?s +?d?l?s?l?s?s?d?d +?d?l?s?l?s?s?d?l +?d?l?s?l?s?s?d?s +?d?l?s?l?s?s?l?d +?d?l?s?l?s?s?l?l +?d?l?s?l?s?s?l?s +?d?l?s?l?s?s?s?d +?d?l?s?l?s?s?s?l +?d?l?s?l?s?s?s?s +?d?l?s?s?d?d?d?d +?d?l?s?s?d?d?d?l +?d?l?s?s?d?d?d?s +?d?l?s?s?d?d?l?d +?d?l?s?s?d?d?l?l +?d?l?s?s?d?d?l?s +?d?l?s?s?d?d?s?d +?d?l?s?s?d?d?s?l +?d?l?s?s?d?d?s?s +?d?l?s?s?d?l?d?d +?d?l?s?s?d?l?d?l +?d?l?s?s?d?l?d?s +?d?l?s?s?d?l?l?d +?d?l?s?s?d?l?l?l +?d?l?s?s?d?l?l?s +?d?l?s?s?d?l?s?d +?d?l?s?s?d?l?s?l +?d?l?s?s?d?l?s?s +?d?l?s?s?d?s?d?d +?d?l?s?s?d?s?d?l +?d?l?s?s?d?s?d?s +?d?l?s?s?d?s?l?d +?d?l?s?s?d?s?l?l +?d?l?s?s?d?s?l?s +?d?l?s?s?d?s?s?d +?d?l?s?s?d?s?s?l +?d?l?s?s?d?s?s?s +?d?l?s?s?l?d?d?d +?d?l?s?s?l?d?d?l +?d?l?s?s?l?d?d?s +?d?l?s?s?l?d?l?d +?d?l?s?s?l?d?l?l +?d?l?s?s?l?d?l?s +?d?l?s?s?l?d?s?d +?d?l?s?s?l?d?s?l +?d?l?s?s?l?d?s?s +?d?l?s?s?l?l?d?d +?d?l?s?s?l?l?d?l +?d?l?s?s?l?l?d?s +?d?l?s?s?l?l?l?d +?d?l?s?s?l?l?l?l +?d?l?s?s?l?l?l?s +?d?l?s?s?l?l?s?d +?d?l?s?s?l?l?s?l +?d?l?s?s?l?l?s?s +?d?l?s?s?l?s?d?d +?d?l?s?s?l?s?d?l +?d?l?s?s?l?s?d?s +?d?l?s?s?l?s?l?d +?d?l?s?s?l?s?l?l +?d?l?s?s?l?s?l?s +?d?l?s?s?l?s?s?d +?d?l?s?s?l?s?s?l +?d?l?s?s?l?s?s?s +?d?l?s?s?s?d?d?d +?d?l?s?s?s?d?d?l +?d?l?s?s?s?d?d?s +?d?l?s?s?s?d?l?d +?d?l?s?s?s?d?l?l +?d?l?s?s?s?d?l?s +?d?l?s?s?s?d?s?d +?d?l?s?s?s?d?s?l +?d?l?s?s?s?d?s?s +?d?l?s?s?s?l?d?d +?d?l?s?s?s?l?d?l +?d?l?s?s?s?l?d?s +?d?l?s?s?s?l?l?d +?d?l?s?s?s?l?l?l +?d?l?s?s?s?l?l?s +?d?l?s?s?s?l?s?d +?d?l?s?s?s?l?s?l +?d?l?s?s?s?l?s?s +?d?l?s?s?s?s?d?d +?d?l?s?s?s?s?d?l +?d?l?s?s?s?s?d?s +?d?l?s?s?s?s?l?d +?d?l?s?s?s?s?l?l +?d?l?s?s?s?s?l?s +?d?l?s?s?s?s?s?d +?d?l?s?s?s?s?s?l +?d?l?s?s?s?s?s?s +?d?u?d?d?d?d?d?d +?d?u?d?d?d?d?d?l +?d?u?d?d?d?d?d?u +?d?u?d?d?d?d?d?s +?d?u?d?d?d?d?l?d +?d?u?d?d?d?d?l?l +?d?u?d?d?d?d?l?u +?d?u?d?d?d?d?u?d +?d?u?d?d?d?d?u?l +?d?u?d?d?d?d?u?u +?d?u?d?d?d?d?u?s +?d?u?d?d?d?d?s?d +?d?u?d?d?d?d?s?u +?d?u?d?d?d?d?s?s +?d?u?d?d?d?l?d?d +?d?u?d?d?d?l?d?l +?d?u?d?d?d?l?d?u +?d?u?d?d?d?l?l?d +?d?u?d?d?d?l?l?l +?d?u?d?d?d?l?l?u +?d?u?d?d?d?l?u?d +?d?u?d?d?d?l?u?l +?d?u?d?d?d?l?u?u +?d?u?d?d?d?u?d?d +?d?u?d?d?d?u?d?l +?d?u?d?d?d?u?d?u +?d?u?d?d?d?u?d?s +?d?u?d?d?d?u?l?d +?d?u?d?d?d?u?l?l +?d?u?d?d?d?u?l?u +?d?u?d?d?d?u?u?d +?d?u?d?d?d?u?u?l +?d?u?d?d?d?u?u?u +?d?u?d?d?d?u?u?s +?d?u?d?d?d?u?s?d +?d?u?d?d?d?u?s?u +?d?u?d?d?d?u?s?s +?d?u?d?d?d?s?d?d +?d?u?d?d?d?s?d?u +?d?u?d?d?d?s?d?s +?d?u?d?d?d?s?u?d +?d?u?d?d?d?s?u?u +?d?u?d?d?d?s?u?s +?d?u?d?d?d?s?s?d +?d?u?d?d?d?s?s?u +?d?u?d?d?d?s?s?s +?d?u?d?d?l?d?d?d +?d?u?d?d?l?d?d?l +?d?u?d?d?l?d?d?u +?d?u?d?d?l?d?l?d +?d?u?d?d?l?d?l?l +?d?u?d?d?l?d?l?u +?d?u?d?d?l?d?u?d +?d?u?d?d?l?d?u?l +?d?u?d?d?l?d?u?u +?d?u?d?d?l?l?d?d +?d?u?d?d?l?l?d?l +?d?u?d?d?l?l?d?u +?d?u?d?d?l?l?l?d +?d?u?d?d?l?l?l?l +?d?u?d?d?l?l?l?u +?d?u?d?d?l?l?u?d +?d?u?d?d?l?l?u?l +?d?u?d?d?l?l?u?u +?d?u?d?d?l?u?d?d +?d?u?d?d?l?u?d?l +?d?u?d?d?l?u?d?u +?d?u?d?d?l?u?l?d +?d?u?d?d?l?u?l?l +?d?u?d?d?l?u?l?u +?d?u?d?d?l?u?u?d +?d?u?d?d?l?u?u?l +?d?u?d?d?l?u?u?u +?d?u?d?d?u?d?d?d +?d?u?d?d?u?d?d?l +?d?u?d?d?u?d?d?u +?d?u?d?d?u?d?d?s +?d?u?d?d?u?d?l?d +?d?u?d?d?u?d?l?l +?d?u?d?d?u?d?l?u +?d?u?d?d?u?d?u?d +?d?u?d?d?u?d?u?l +?d?u?d?d?u?d?u?u +?d?u?d?d?u?d?u?s +?d?u?d?d?u?d?s?d +?d?u?d?d?u?d?s?u +?d?u?d?d?u?d?s?s +?d?u?d?d?u?l?d?d +?d?u?d?d?u?l?d?l +?d?u?d?d?u?l?d?u +?d?u?d?d?u?l?l?d +?d?u?d?d?u?l?l?l +?d?u?d?d?u?l?l?u +?d?u?d?d?u?l?u?d +?d?u?d?d?u?l?u?l +?d?u?d?d?u?l?u?u +?d?u?d?d?u?u?d?d +?d?u?d?d?u?u?d?l +?d?u?d?d?u?u?d?u +?d?u?d?d?u?u?d?s +?d?u?d?d?u?u?l?d +?d?u?d?d?u?u?l?l +?d?u?d?d?u?u?l?u +?d?u?d?d?u?u?u?d +?d?u?d?d?u?u?u?l +?d?u?d?d?u?u?u?u +?d?u?d?d?u?u?u?s +?d?u?d?d?u?u?s?d +?d?u?d?d?u?u?s?u +?d?u?d?d?u?u?s?s +?d?u?d?d?u?s?d?d +?d?u?d?d?u?s?d?u +?d?u?d?d?u?s?d?s +?d?u?d?d?u?s?u?d +?d?u?d?d?u?s?u?u +?d?u?d?d?u?s?u?s +?d?u?d?d?u?s?s?d +?d?u?d?d?u?s?s?u +?d?u?d?d?u?s?s?s +?d?u?d?d?s?d?d?d +?d?u?d?d?s?d?d?u +?d?u?d?d?s?d?d?s +?d?u?d?d?s?d?u?d +?d?u?d?d?s?d?u?u +?d?u?d?d?s?d?u?s +?d?u?d?d?s?d?s?d +?d?u?d?d?s?d?s?u +?d?u?d?d?s?d?s?s +?d?u?d?d?s?u?d?d +?d?u?d?d?s?u?d?u +?d?u?d?d?s?u?d?s +?d?u?d?d?s?u?u?d +?d?u?d?d?s?u?u?u +?d?u?d?d?s?u?u?s +?d?u?d?d?s?u?s?d +?d?u?d?d?s?u?s?u +?d?u?d?d?s?u?s?s +?d?u?d?d?s?s?d?d +?d?u?d?d?s?s?d?u +?d?u?d?d?s?s?d?s +?d?u?d?d?s?s?u?d +?d?u?d?d?s?s?u?u +?d?u?d?d?s?s?u?s +?d?u?d?d?s?s?s?d +?d?u?d?d?s?s?s?u +?d?u?d?d?s?s?s?s +?d?u?d?l?d?d?d?d +?d?u?d?l?d?d?d?l +?d?u?d?l?d?d?d?u +?d?u?d?l?d?d?l?d +?d?u?d?l?d?d?l?l +?d?u?d?l?d?d?l?u +?d?u?d?l?d?d?u?d +?d?u?d?l?d?d?u?l +?d?u?d?l?d?d?u?u +?d?u?d?l?d?l?d?d +?d?u?d?l?d?l?d?l +?d?u?d?l?d?l?d?u +?d?u?d?l?d?l?l?d +?d?u?d?l?d?l?l?l +?d?u?d?l?d?l?l?u +?d?u?d?l?d?l?u?d +?d?u?d?l?d?l?u?l +?d?u?d?l?d?l?u?u +?d?u?d?l?d?u?d?d +?d?u?d?l?d?u?d?l +?d?u?d?l?d?u?d?u +?d?u?d?l?d?u?l?d +?d?u?d?l?d?u?l?l +?d?u?d?l?d?u?l?u +?d?u?d?l?d?u?u?d +?d?u?d?l?d?u?u?l +?d?u?d?l?d?u?u?u +?d?u?d?l?l?d?d?d +?d?u?d?l?l?d?d?l +?d?u?d?l?l?d?d?u +?d?u?d?l?l?d?l?d +?d?u?d?l?l?d?l?l +?d?u?d?l?l?d?l?u +?d?u?d?l?l?d?u?d +?d?u?d?l?l?d?u?l +?d?u?d?l?l?d?u?u +?d?u?d?l?l?l?d?d +?d?u?d?l?l?l?d?l +?d?u?d?l?l?l?d?u +?d?u?d?l?l?l?l?d +?d?u?d?l?l?l?l?l +?d?u?d?l?l?l?l?u +?d?u?d?l?l?l?u?d +?d?u?d?l?l?l?u?l +?d?u?d?l?l?l?u?u +?d?u?d?l?l?u?d?d +?d?u?d?l?l?u?d?l +?d?u?d?l?l?u?d?u +?d?u?d?l?l?u?l?d +?d?u?d?l?l?u?l?l +?d?u?d?l?l?u?l?u +?d?u?d?l?l?u?u?d +?d?u?d?l?l?u?u?l +?d?u?d?l?l?u?u?u +?d?u?d?l?u?d?d?d +?d?u?d?l?u?d?d?l +?d?u?d?l?u?d?d?u +?d?u?d?l?u?d?l?d +?d?u?d?l?u?d?l?l +?d?u?d?l?u?d?l?u +?d?u?d?l?u?d?u?d +?d?u?d?l?u?d?u?l +?d?u?d?l?u?d?u?u +?d?u?d?l?u?l?d?d +?d?u?d?l?u?l?d?l +?d?u?d?l?u?l?d?u +?d?u?d?l?u?l?l?d +?d?u?d?l?u?l?l?l +?d?u?d?l?u?l?l?u +?d?u?d?l?u?l?u?d +?d?u?d?l?u?l?u?l +?d?u?d?l?u?l?u?u +?d?u?d?l?u?u?d?d +?d?u?d?l?u?u?d?l +?d?u?d?l?u?u?d?u +?d?u?d?l?u?u?l?d +?d?u?d?l?u?u?l?l +?d?u?d?l?u?u?l?u +?d?u?d?l?u?u?u?d +?d?u?d?l?u?u?u?l +?d?u?d?l?u?u?u?u +?d?u?d?u?d?d?d?d +?d?u?d?u?d?d?d?l +?d?u?d?u?d?d?d?u +?d?u?d?u?d?d?d?s +?d?u?d?u?d?d?l?d +?d?u?d?u?d?d?l?l +?d?u?d?u?d?d?l?u +?d?u?d?u?d?d?u?d +?d?u?d?u?d?d?u?l +?d?u?d?u?d?d?u?u +?d?u?d?u?d?d?u?s +?d?u?d?u?d?d?s?d +?d?u?d?u?d?d?s?u +?d?u?d?u?d?d?s?s +?d?u?d?u?d?l?d?d +?d?u?d?u?d?l?d?l +?d?u?d?u?d?l?d?u +?d?u?d?u?d?l?l?d +?d?u?d?u?d?l?l?l +?d?u?d?u?d?l?l?u +?d?u?d?u?d?l?u?d +?d?u?d?u?d?l?u?l +?d?u?d?u?d?l?u?u +?d?u?d?u?d?u?d?d +?d?u?d?u?d?u?d?l +?d?u?d?u?d?u?d?u +?d?u?d?u?d?u?d?s +?d?u?d?u?d?u?l?d +?d?u?d?u?d?u?l?l +?d?u?d?u?d?u?l?u +?d?u?d?u?d?u?u?d +?d?u?d?u?d?u?u?l +?d?u?d?u?d?u?u?u +?d?u?d?u?d?u?u?s +?d?u?d?u?d?u?s?d +?d?u?d?u?d?u?s?u +?d?u?d?u?d?u?s?s +?d?u?d?u?d?s?d?d +?d?u?d?u?d?s?d?u +?d?u?d?u?d?s?d?s +?d?u?d?u?d?s?u?d +?d?u?d?u?d?s?u?u +?d?u?d?u?d?s?u?s +?d?u?d?u?d?s?s?d +?d?u?d?u?d?s?s?u +?d?u?d?u?d?s?s?s +?d?u?d?u?l?d?d?d +?d?u?d?u?l?d?d?l +?d?u?d?u?l?d?d?u +?d?u?d?u?l?d?l?d +?d?u?d?u?l?d?l?l +?d?u?d?u?l?d?l?u +?d?u?d?u?l?d?u?d +?d?u?d?u?l?d?u?l +?d?u?d?u?l?d?u?u +?d?u?d?u?l?l?d?d +?d?u?d?u?l?l?d?l +?d?u?d?u?l?l?d?u +?d?u?d?u?l?l?l?d +?d?u?d?u?l?l?l?l +?d?u?d?u?l?l?l?u +?d?u?d?u?l?l?u?d +?d?u?d?u?l?l?u?l +?d?u?d?u?l?l?u?u +?d?u?d?u?l?u?d?d +?d?u?d?u?l?u?d?l +?d?u?d?u?l?u?d?u +?d?u?d?u?l?u?l?d +?d?u?d?u?l?u?l?l +?d?u?d?u?l?u?l?u +?d?u?d?u?l?u?u?d +?d?u?d?u?l?u?u?l +?d?u?d?u?l?u?u?u +?d?u?d?u?u?d?d?d +?d?u?d?u?u?d?d?l +?d?u?d?u?u?d?d?u +?d?u?d?u?u?d?d?s +?d?u?d?u?u?d?l?d +?d?u?d?u?u?d?l?l +?d?u?d?u?u?d?l?u +?d?u?d?u?u?d?u?d +?d?u?d?u?u?d?u?l +?d?u?d?u?u?d?u?u +?d?u?d?u?u?d?u?s +?d?u?d?u?u?d?s?d +?d?u?d?u?u?d?s?u +?d?u?d?u?u?d?s?s +?d?u?d?u?u?l?d?d +?d?u?d?u?u?l?d?l +?d?u?d?u?u?l?d?u +?d?u?d?u?u?l?l?d +?d?u?d?u?u?l?l?l +?d?u?d?u?u?l?l?u +?d?u?d?u?u?l?u?d +?d?u?d?u?u?l?u?l +?d?u?d?u?u?l?u?u +?d?u?d?u?u?u?d?d +?d?u?d?u?u?u?d?l +?d?u?d?u?u?u?d?u +?d?u?d?u?u?u?d?s +?d?u?d?u?u?u?l?d +?d?u?d?u?u?u?l?l +?d?u?d?u?u?u?l?u +?d?u?d?u?u?u?u?d +?d?u?d?u?u?u?u?l +?d?u?d?u?u?u?u?u +?d?u?d?u?u?u?u?s +?d?u?d?u?u?u?s?d +?d?u?d?u?u?u?s?u +?d?u?d?u?u?u?s?s +?d?u?d?u?u?s?d?d +?d?u?d?u?u?s?d?u +?d?u?d?u?u?s?d?s +?d?u?d?u?u?s?u?d +?d?u?d?u?u?s?u?u +?d?u?d?u?u?s?u?s +?d?u?d?u?u?s?s?d +?d?u?d?u?u?s?s?u +?d?u?d?u?u?s?s?s +?d?u?d?u?s?d?d?d +?d?u?d?u?s?d?d?u +?d?u?d?u?s?d?d?s +?d?u?d?u?s?d?u?d +?d?u?d?u?s?d?u?u +?d?u?d?u?s?d?u?s +?d?u?d?u?s?d?s?d +?d?u?d?u?s?d?s?u +?d?u?d?u?s?d?s?s +?d?u?d?u?s?u?d?d +?d?u?d?u?s?u?d?u +?d?u?d?u?s?u?d?s +?d?u?d?u?s?u?u?d +?d?u?d?u?s?u?u?u +?d?u?d?u?s?u?u?s +?d?u?d?u?s?u?s?d +?d?u?d?u?s?u?s?u +?d?u?d?u?s?u?s?s +?d?u?d?u?s?s?d?d +?d?u?d?u?s?s?d?u +?d?u?d?u?s?s?d?s +?d?u?d?u?s?s?u?d +?d?u?d?u?s?s?u?u +?d?u?d?u?s?s?u?s +?d?u?d?u?s?s?s?d +?d?u?d?u?s?s?s?u +?d?u?d?u?s?s?s?s +?d?u?d?s?d?d?d?d +?d?u?d?s?d?d?d?u +?d?u?d?s?d?d?d?s +?d?u?d?s?d?d?u?d +?d?u?d?s?d?d?u?u +?d?u?d?s?d?d?u?s +?d?u?d?s?d?d?s?d +?d?u?d?s?d?d?s?u +?d?u?d?s?d?d?s?s +?d?u?d?s?d?u?d?d +?d?u?d?s?d?u?d?u +?d?u?d?s?d?u?d?s +?d?u?d?s?d?u?u?d +?d?u?d?s?d?u?u?u +?d?u?d?s?d?u?u?s +?d?u?d?s?d?u?s?d +?d?u?d?s?d?u?s?u +?d?u?d?s?d?u?s?s +?d?u?d?s?d?s?d?d +?d?u?d?s?d?s?d?u +?d?u?d?s?d?s?d?s +?d?u?d?s?d?s?u?d +?d?u?d?s?d?s?u?u +?d?u?d?s?d?s?u?s +?d?u?d?s?d?s?s?d +?d?u?d?s?d?s?s?u +?d?u?d?s?d?s?s?s +?d?u?d?s?u?d?d?d +?d?u?d?s?u?d?d?u +?d?u?d?s?u?d?d?s +?d?u?d?s?u?d?u?d +?d?u?d?s?u?d?u?u +?d?u?d?s?u?d?u?s +?d?u?d?s?u?d?s?d +?d?u?d?s?u?d?s?u +?d?u?d?s?u?d?s?s +?d?u?d?s?u?u?d?d +?d?u?d?s?u?u?d?u +?d?u?d?s?u?u?d?s +?d?u?d?s?u?u?u?d +?d?u?d?s?u?u?u?u +?d?u?d?s?u?u?u?s +?d?u?d?s?u?u?s?d +?d?u?d?s?u?u?s?u +?d?u?d?s?u?u?s?s +?d?u?d?s?u?s?d?d +?d?u?d?s?u?s?d?u +?d?u?d?s?u?s?d?s +?d?u?d?s?u?s?u?d +?d?u?d?s?u?s?u?u +?d?u?d?s?u?s?u?s +?d?u?d?s?u?s?s?d +?d?u?d?s?u?s?s?u +?d?u?d?s?u?s?s?s +?d?u?d?s?s?d?d?d +?d?u?d?s?s?d?d?u +?d?u?d?s?s?d?d?s +?d?u?d?s?s?d?u?d +?d?u?d?s?s?d?u?u +?d?u?d?s?s?d?u?s +?d?u?d?s?s?d?s?d +?d?u?d?s?s?d?s?u +?d?u?d?s?s?d?s?s +?d?u?d?s?s?u?d?d +?d?u?d?s?s?u?d?u +?d?u?d?s?s?u?d?s +?d?u?d?s?s?u?u?d +?d?u?d?s?s?u?u?u +?d?u?d?s?s?u?u?s +?d?u?d?s?s?u?s?d +?d?u?d?s?s?u?s?u +?d?u?d?s?s?u?s?s +?d?u?d?s?s?s?d?d +?d?u?d?s?s?s?d?u +?d?u?d?s?s?s?d?s +?d?u?d?s?s?s?u?d +?d?u?d?s?s?s?u?u +?d?u?d?s?s?s?u?s +?d?u?d?s?s?s?s?d +?d?u?d?s?s?s?s?u +?d?u?d?s?s?s?s?s +?d?u?l?d?d?d?d?d +?d?u?l?d?d?d?d?l +?d?u?l?d?d?d?d?u +?d?u?l?d?d?d?l?d +?d?u?l?d?d?d?l?l +?d?u?l?d?d?d?l?u +?d?u?l?d?d?d?u?d +?d?u?l?d?d?d?u?l +?d?u?l?d?d?d?u?u +?d?u?l?d?d?l?d?d +?d?u?l?d?d?l?d?l +?d?u?l?d?d?l?d?u +?d?u?l?d?d?l?l?d +?d?u?l?d?d?l?l?l +?d?u?l?d?d?l?l?u +?d?u?l?d?d?l?u?d +?d?u?l?d?d?l?u?l +?d?u?l?d?d?l?u?u +?d?u?l?d?d?u?d?d +?d?u?l?d?d?u?d?l +?d?u?l?d?d?u?d?u +?d?u?l?d?d?u?l?d +?d?u?l?d?d?u?l?l +?d?u?l?d?d?u?l?u +?d?u?l?d?d?u?u?d +?d?u?l?d?d?u?u?l +?d?u?l?d?d?u?u?u +?d?u?l?d?l?d?d?d +?d?u?l?d?l?d?d?l +?d?u?l?d?l?d?d?u +?d?u?l?d?l?d?l?d +?d?u?l?d?l?d?l?l +?d?u?l?d?l?d?l?u +?d?u?l?d?l?d?u?d +?d?u?l?d?l?d?u?l +?d?u?l?d?l?d?u?u +?d?u?l?d?l?l?d?d +?d?u?l?d?l?l?d?l +?d?u?l?d?l?l?d?u +?d?u?l?d?l?l?l?d +?d?u?l?d?l?l?l?l +?d?u?l?d?l?l?l?u +?d?u?l?d?l?l?u?d +?d?u?l?d?l?l?u?l +?d?u?l?d?l?l?u?u +?d?u?l?d?l?u?d?d +?d?u?l?d?l?u?d?l +?d?u?l?d?l?u?d?u +?d?u?l?d?l?u?l?d +?d?u?l?d?l?u?l?l +?d?u?l?d?l?u?l?u +?d?u?l?d?l?u?u?d +?d?u?l?d?l?u?u?l +?d?u?l?d?l?u?u?u +?d?u?l?d?u?d?d?d +?d?u?l?d?u?d?d?l +?d?u?l?d?u?d?d?u +?d?u?l?d?u?d?l?d +?d?u?l?d?u?d?l?l +?d?u?l?d?u?d?l?u +?d?u?l?d?u?d?u?d +?d?u?l?d?u?d?u?l +?d?u?l?d?u?d?u?u +?d?u?l?d?u?l?d?d +?d?u?l?d?u?l?d?l +?d?u?l?d?u?l?d?u +?d?u?l?d?u?l?l?d +?d?u?l?d?u?l?l?l +?d?u?l?d?u?l?l?u +?d?u?l?d?u?l?u?d +?d?u?l?d?u?l?u?l +?d?u?l?d?u?l?u?u +?d?u?l?d?u?u?d?d +?d?u?l?d?u?u?d?l +?d?u?l?d?u?u?d?u +?d?u?l?d?u?u?l?d +?d?u?l?d?u?u?l?l +?d?u?l?d?u?u?l?u +?d?u?l?d?u?u?u?d +?d?u?l?d?u?u?u?l +?d?u?l?d?u?u?u?u +?d?u?l?l?d?d?d?d +?d?u?l?l?d?d?d?l +?d?u?l?l?d?d?d?u +?d?u?l?l?d?d?l?d +?d?u?l?l?d?d?l?l +?d?u?l?l?d?d?l?u +?d?u?l?l?d?d?u?d +?d?u?l?l?d?d?u?l +?d?u?l?l?d?d?u?u +?d?u?l?l?d?l?d?d +?d?u?l?l?d?l?d?l +?d?u?l?l?d?l?d?u +?d?u?l?l?d?l?l?d +?d?u?l?l?d?l?l?l +?d?u?l?l?d?l?l?u +?d?u?l?l?d?l?u?d +?d?u?l?l?d?l?u?l +?d?u?l?l?d?l?u?u +?d?u?l?l?d?u?d?d +?d?u?l?l?d?u?d?l +?d?u?l?l?d?u?d?u +?d?u?l?l?d?u?l?d +?d?u?l?l?d?u?l?l +?d?u?l?l?d?u?l?u +?d?u?l?l?d?u?u?d +?d?u?l?l?d?u?u?l +?d?u?l?l?d?u?u?u +?d?u?l?l?l?d?d?d +?d?u?l?l?l?d?d?l +?d?u?l?l?l?d?d?u +?d?u?l?l?l?d?l?d +?d?u?l?l?l?d?l?l +?d?u?l?l?l?d?l?u +?d?u?l?l?l?d?u?d +?d?u?l?l?l?d?u?l +?d?u?l?l?l?d?u?u +?d?u?l?l?l?l?d?d +?d?u?l?l?l?l?d?l +?d?u?l?l?l?l?d?u +?d?u?l?l?l?l?l?d +?d?u?l?l?l?l?l?l +?d?u?l?l?l?l?l?u +?d?u?l?l?l?l?u?d +?d?u?l?l?l?l?u?l +?d?u?l?l?l?l?u?u +?d?u?l?l?l?u?d?d +?d?u?l?l?l?u?d?l +?d?u?l?l?l?u?d?u +?d?u?l?l?l?u?l?d +?d?u?l?l?l?u?l?l +?d?u?l?l?l?u?l?u +?d?u?l?l?l?u?u?d +?d?u?l?l?l?u?u?l +?d?u?l?l?l?u?u?u +?d?u?l?l?u?d?d?d +?d?u?l?l?u?d?d?l +?d?u?l?l?u?d?d?u +?d?u?l?l?u?d?l?d +?d?u?l?l?u?d?l?l +?d?u?l?l?u?d?l?u +?d?u?l?l?u?d?u?d +?d?u?l?l?u?d?u?l +?d?u?l?l?u?d?u?u +?d?u?l?l?u?l?d?d +?d?u?l?l?u?l?d?l +?d?u?l?l?u?l?d?u +?d?u?l?l?u?l?l?d +?d?u?l?l?u?l?l?l +?d?u?l?l?u?l?l?u +?d?u?l?l?u?l?u?d +?d?u?l?l?u?l?u?l +?d?u?l?l?u?l?u?u +?d?u?l?l?u?u?d?d +?d?u?l?l?u?u?d?l +?d?u?l?l?u?u?d?u +?d?u?l?l?u?u?l?d +?d?u?l?l?u?u?l?l +?d?u?l?l?u?u?l?u +?d?u?l?l?u?u?u?d +?d?u?l?l?u?u?u?l +?d?u?l?l?u?u?u?u +?d?u?l?u?d?d?d?d +?d?u?l?u?d?d?d?l +?d?u?l?u?d?d?d?u +?d?u?l?u?d?d?l?d +?d?u?l?u?d?d?l?l +?d?u?l?u?d?d?l?u +?d?u?l?u?d?d?u?d +?d?u?l?u?d?d?u?l +?d?u?l?u?d?d?u?u +?d?u?l?u?d?l?d?d +?d?u?l?u?d?l?d?l +?d?u?l?u?d?l?d?u +?d?u?l?u?d?l?l?d +?d?u?l?u?d?l?l?l +?d?u?l?u?d?l?l?u +?d?u?l?u?d?l?u?d +?d?u?l?u?d?l?u?l +?d?u?l?u?d?l?u?u +?d?u?l?u?d?u?d?d +?d?u?l?u?d?u?d?l +?d?u?l?u?d?u?d?u +?d?u?l?u?d?u?l?d +?d?u?l?u?d?u?l?l +?d?u?l?u?d?u?l?u +?d?u?l?u?d?u?u?d +?d?u?l?u?d?u?u?l +?d?u?l?u?d?u?u?u +?d?u?l?u?l?d?d?d +?d?u?l?u?l?d?d?l +?d?u?l?u?l?d?d?u +?d?u?l?u?l?d?l?d +?d?u?l?u?l?d?l?l +?d?u?l?u?l?d?l?u +?d?u?l?u?l?d?u?d +?d?u?l?u?l?d?u?l +?d?u?l?u?l?d?u?u +?d?u?l?u?l?l?d?d +?d?u?l?u?l?l?d?l +?d?u?l?u?l?l?d?u +?d?u?l?u?l?l?l?d +?d?u?l?u?l?l?l?l +?d?u?l?u?l?l?l?u +?d?u?l?u?l?l?u?d +?d?u?l?u?l?l?u?l +?d?u?l?u?l?l?u?u +?d?u?l?u?l?u?d?d +?d?u?l?u?l?u?d?l +?d?u?l?u?l?u?d?u +?d?u?l?u?l?u?l?d +?d?u?l?u?l?u?l?l +?d?u?l?u?l?u?l?u +?d?u?l?u?l?u?u?d +?d?u?l?u?l?u?u?l +?d?u?l?u?l?u?u?u +?d?u?l?u?u?d?d?d +?d?u?l?u?u?d?d?l +?d?u?l?u?u?d?d?u +?d?u?l?u?u?d?l?d +?d?u?l?u?u?d?l?l +?d?u?l?u?u?d?l?u +?d?u?l?u?u?d?u?d +?d?u?l?u?u?d?u?l +?d?u?l?u?u?d?u?u +?d?u?l?u?u?l?d?d +?d?u?l?u?u?l?d?l +?d?u?l?u?u?l?d?u +?d?u?l?u?u?l?l?d +?d?u?l?u?u?l?l?l +?d?u?l?u?u?l?l?u +?d?u?l?u?u?l?u?d +?d?u?l?u?u?l?u?l +?d?u?l?u?u?l?u?u +?d?u?l?u?u?u?d?d +?d?u?l?u?u?u?d?l +?d?u?l?u?u?u?d?u +?d?u?l?u?u?u?l?d +?d?u?l?u?u?u?l?l +?d?u?l?u?u?u?l?u +?d?u?l?u?u?u?u?d +?d?u?l?u?u?u?u?l +?d?u?l?u?u?u?u?u +?d?u?u?d?d?d?d?d +?d?u?u?d?d?d?d?l +?d?u?u?d?d?d?d?u +?d?u?u?d?d?d?d?s +?d?u?u?d?d?d?l?d +?d?u?u?d?d?d?l?l +?d?u?u?d?d?d?l?u +?d?u?u?d?d?d?u?d +?d?u?u?d?d?d?u?l +?d?u?u?d?d?d?u?u +?d?u?u?d?d?d?u?s +?d?u?u?d?d?d?s?d +?d?u?u?d?d?d?s?u +?d?u?u?d?d?d?s?s +?d?u?u?d?d?l?d?d +?d?u?u?d?d?l?d?l +?d?u?u?d?d?l?d?u +?d?u?u?d?d?l?l?d +?d?u?u?d?d?l?l?l +?d?u?u?d?d?l?l?u +?d?u?u?d?d?l?u?d +?d?u?u?d?d?l?u?l +?d?u?u?d?d?l?u?u +?d?u?u?d?d?u?d?d +?d?u?u?d?d?u?d?l +?d?u?u?d?d?u?d?u +?d?u?u?d?d?u?d?s +?d?u?u?d?d?u?l?d +?d?u?u?d?d?u?l?l +?d?u?u?d?d?u?l?u +?d?u?u?d?d?u?u?d +?d?u?u?d?d?u?u?l +?d?u?u?d?d?u?u?u +?d?u?u?d?d?u?u?s +?d?u?u?d?d?u?s?d +?d?u?u?d?d?u?s?u +?d?u?u?d?d?u?s?s +?d?u?u?d?d?s?d?d +?d?u?u?d?d?s?d?u +?d?u?u?d?d?s?d?s +?d?u?u?d?d?s?u?d +?d?u?u?d?d?s?u?u +?d?u?u?d?d?s?u?s +?d?u?u?d?d?s?s?d +?d?u?u?d?d?s?s?u +?d?u?u?d?d?s?s?s +?d?u?u?d?l?d?d?d +?d?u?u?d?l?d?d?l +?d?u?u?d?l?d?d?u +?d?u?u?d?l?d?l?d +?d?u?u?d?l?d?l?l +?d?u?u?d?l?d?l?u +?d?u?u?d?l?d?u?d +?d?u?u?d?l?d?u?l +?d?u?u?d?l?d?u?u +?d?u?u?d?l?l?d?d +?d?u?u?d?l?l?d?l +?d?u?u?d?l?l?d?u +?d?u?u?d?l?l?l?d +?d?u?u?d?l?l?l?l +?d?u?u?d?l?l?l?u +?d?u?u?d?l?l?u?d +?d?u?u?d?l?l?u?l +?d?u?u?d?l?l?u?u +?d?u?u?d?l?u?d?d +?d?u?u?d?l?u?d?l +?d?u?u?d?l?u?d?u +?d?u?u?d?l?u?l?d +?d?u?u?d?l?u?l?l +?d?u?u?d?l?u?l?u +?d?u?u?d?l?u?u?d +?d?u?u?d?l?u?u?l +?d?u?u?d?l?u?u?u +?d?u?u?d?u?d?d?d +?d?u?u?d?u?d?d?l +?d?u?u?d?u?d?d?u +?d?u?u?d?u?d?d?s +?d?u?u?d?u?d?l?d +?d?u?u?d?u?d?l?l +?d?u?u?d?u?d?l?u +?d?u?u?d?u?d?u?d +?d?u?u?d?u?d?u?l +?d?u?u?d?u?d?u?u +?d?u?u?d?u?d?u?s +?d?u?u?d?u?d?s?d +?d?u?u?d?u?d?s?u +?d?u?u?d?u?d?s?s +?d?u?u?d?u?l?d?d +?d?u?u?d?u?l?d?l +?d?u?u?d?u?l?d?u +?d?u?u?d?u?l?l?d +?d?u?u?d?u?l?l?l +?d?u?u?d?u?l?l?u +?d?u?u?d?u?l?u?d +?d?u?u?d?u?l?u?l +?d?u?u?d?u?l?u?u +?d?u?u?d?u?u?d?d +?d?u?u?d?u?u?d?l +?d?u?u?d?u?u?d?u +?d?u?u?d?u?u?d?s +?d?u?u?d?u?u?l?d +?d?u?u?d?u?u?l?l +?d?u?u?d?u?u?l?u +?d?u?u?d?u?u?u?d +?d?u?u?d?u?u?u?l +?d?u?u?d?u?u?u?u +?d?u?u?d?u?u?u?s +?d?u?u?d?u?u?s?d +?d?u?u?d?u?u?s?u +?d?u?u?d?u?u?s?s +?d?u?u?d?u?s?d?d +?d?u?u?d?u?s?d?u +?d?u?u?d?u?s?d?s +?d?u?u?d?u?s?u?d +?d?u?u?d?u?s?u?u +?d?u?u?d?u?s?u?s +?d?u?u?d?u?s?s?d +?d?u?u?d?u?s?s?u +?d?u?u?d?u?s?s?s +?d?u?u?d?s?d?d?d +?d?u?u?d?s?d?d?u +?d?u?u?d?s?d?d?s +?d?u?u?d?s?d?u?d +?d?u?u?d?s?d?u?u +?d?u?u?d?s?d?u?s +?d?u?u?d?s?d?s?d +?d?u?u?d?s?d?s?u +?d?u?u?d?s?d?s?s +?d?u?u?d?s?u?d?d +?d?u?u?d?s?u?d?u +?d?u?u?d?s?u?d?s +?d?u?u?d?s?u?u?d +?d?u?u?d?s?u?u?u +?d?u?u?d?s?u?u?s +?d?u?u?d?s?u?s?d +?d?u?u?d?s?u?s?u +?d?u?u?d?s?u?s?s +?d?u?u?d?s?s?d?d +?d?u?u?d?s?s?d?u +?d?u?u?d?s?s?d?s +?d?u?u?d?s?s?u?d +?d?u?u?d?s?s?u?u +?d?u?u?d?s?s?u?s +?d?u?u?d?s?s?s?d +?d?u?u?d?s?s?s?u +?d?u?u?d?s?s?s?s +?d?u?u?l?d?d?d?d +?d?u?u?l?d?d?d?l +?d?u?u?l?d?d?d?u +?d?u?u?l?d?d?l?d +?d?u?u?l?d?d?l?l +?d?u?u?l?d?d?l?u +?d?u?u?l?d?d?u?d +?d?u?u?l?d?d?u?l +?d?u?u?l?d?d?u?u +?d?u?u?l?d?l?d?d +?d?u?u?l?d?l?d?l +?d?u?u?l?d?l?d?u +?d?u?u?l?d?l?l?d +?d?u?u?l?d?l?l?l +?d?u?u?l?d?l?l?u +?d?u?u?l?d?l?u?d +?d?u?u?l?d?l?u?l +?d?u?u?l?d?l?u?u +?d?u?u?l?d?u?d?d +?d?u?u?l?d?u?d?l +?d?u?u?l?d?u?d?u +?d?u?u?l?d?u?l?d +?d?u?u?l?d?u?l?l +?d?u?u?l?d?u?l?u +?d?u?u?l?d?u?u?d +?d?u?u?l?d?u?u?l +?d?u?u?l?d?u?u?u +?d?u?u?l?l?d?d?d +?d?u?u?l?l?d?d?l +?d?u?u?l?l?d?d?u +?d?u?u?l?l?d?l?d +?d?u?u?l?l?d?l?l +?d?u?u?l?l?d?l?u +?d?u?u?l?l?d?u?d +?d?u?u?l?l?d?u?l +?d?u?u?l?l?d?u?u +?d?u?u?l?l?l?d?d +?d?u?u?l?l?l?d?l +?d?u?u?l?l?l?d?u +?d?u?u?l?l?l?l?d +?d?u?u?l?l?l?l?l +?d?u?u?l?l?l?l?u +?d?u?u?l?l?l?u?d +?d?u?u?l?l?l?u?l +?d?u?u?l?l?l?u?u +?d?u?u?l?l?u?d?d +?d?u?u?l?l?u?d?l +?d?u?u?l?l?u?d?u +?d?u?u?l?l?u?l?d +?d?u?u?l?l?u?l?l +?d?u?u?l?l?u?l?u +?d?u?u?l?l?u?u?d +?d?u?u?l?l?u?u?l +?d?u?u?l?l?u?u?u +?d?u?u?l?u?d?d?d +?d?u?u?l?u?d?d?l +?d?u?u?l?u?d?d?u +?d?u?u?l?u?d?l?d +?d?u?u?l?u?d?l?l +?d?u?u?l?u?d?l?u +?d?u?u?l?u?d?u?d +?d?u?u?l?u?d?u?l +?d?u?u?l?u?d?u?u +?d?u?u?l?u?l?d?d +?d?u?u?l?u?l?d?l +?d?u?u?l?u?l?d?u +?d?u?u?l?u?l?l?d +?d?u?u?l?u?l?l?l +?d?u?u?l?u?l?l?u +?d?u?u?l?u?l?u?d +?d?u?u?l?u?l?u?l +?d?u?u?l?u?l?u?u +?d?u?u?l?u?u?d?d +?d?u?u?l?u?u?d?l +?d?u?u?l?u?u?d?u +?d?u?u?l?u?u?l?d +?d?u?u?l?u?u?l?l +?d?u?u?l?u?u?l?u +?d?u?u?l?u?u?u?d +?d?u?u?l?u?u?u?l +?d?u?u?l?u?u?u?u +?d?u?u?u?d?d?d?d +?d?u?u?u?d?d?d?l +?d?u?u?u?d?d?d?u +?d?u?u?u?d?d?d?s +?d?u?u?u?d?d?l?d +?d?u?u?u?d?d?l?l +?d?u?u?u?d?d?l?u +?d?u?u?u?d?d?u?d +?d?u?u?u?d?d?u?l +?d?u?u?u?d?d?u?u +?d?u?u?u?d?d?u?s +?d?u?u?u?d?d?s?d +?d?u?u?u?d?d?s?u +?d?u?u?u?d?d?s?s +?d?u?u?u?d?l?d?d +?d?u?u?u?d?l?d?l +?d?u?u?u?d?l?d?u +?d?u?u?u?d?l?l?d +?d?u?u?u?d?l?l?l +?d?u?u?u?d?l?l?u +?d?u?u?u?d?l?u?d +?d?u?u?u?d?l?u?l +?d?u?u?u?d?l?u?u +?d?u?u?u?d?u?d?d +?d?u?u?u?d?u?d?l +?d?u?u?u?d?u?d?u +?d?u?u?u?d?u?d?s +?d?u?u?u?d?u?l?d +?d?u?u?u?d?u?l?l +?d?u?u?u?d?u?l?u +?d?u?u?u?d?u?u?d +?d?u?u?u?d?u?u?l +?d?u?u?u?d?u?u?u +?d?u?u?u?d?u?u?s +?d?u?u?u?d?u?s?d +?d?u?u?u?d?u?s?u +?d?u?u?u?d?u?s?s +?d?u?u?u?d?s?d?d +?d?u?u?u?d?s?d?u +?d?u?u?u?d?s?d?s +?d?u?u?u?d?s?u?d +?d?u?u?u?d?s?u?u +?d?u?u?u?d?s?u?s +?d?u?u?u?d?s?s?d +?d?u?u?u?d?s?s?u +?d?u?u?u?d?s?s?s +?d?u?u?u?l?d?d?d +?d?u?u?u?l?d?d?l +?d?u?u?u?l?d?d?u +?d?u?u?u?l?d?l?d +?d?u?u?u?l?d?l?l +?d?u?u?u?l?d?l?u +?d?u?u?u?l?d?u?d +?d?u?u?u?l?d?u?l +?d?u?u?u?l?d?u?u +?d?u?u?u?l?l?d?d +?d?u?u?u?l?l?d?l +?d?u?u?u?l?l?d?u +?d?u?u?u?l?l?l?d +?d?u?u?u?l?l?l?l +?d?u?u?u?l?l?l?u +?d?u?u?u?l?l?u?d +?d?u?u?u?l?l?u?l +?d?u?u?u?l?l?u?u +?d?u?u?u?l?u?d?d +?d?u?u?u?l?u?d?l +?d?u?u?u?l?u?d?u +?d?u?u?u?l?u?l?d +?d?u?u?u?l?u?l?l +?d?u?u?u?l?u?l?u +?d?u?u?u?l?u?u?d +?d?u?u?u?l?u?u?l +?d?u?u?u?l?u?u?u +?d?u?u?u?u?d?d?d +?d?u?u?u?u?d?d?l +?d?u?u?u?u?d?d?u +?d?u?u?u?u?d?d?s +?d?u?u?u?u?d?l?d +?d?u?u?u?u?d?l?l +?d?u?u?u?u?d?l?u +?d?u?u?u?u?d?u?d +?d?u?u?u?u?d?u?l +?d?u?u?u?u?d?u?u +?d?u?u?u?u?d?u?s +?d?u?u?u?u?d?s?d +?d?u?u?u?u?d?s?u +?d?u?u?u?u?d?s?s +?d?u?u?u?u?l?d?d +?d?u?u?u?u?l?d?l +?d?u?u?u?u?l?d?u +?d?u?u?u?u?l?l?d +?d?u?u?u?u?l?l?l +?d?u?u?u?u?l?l?u +?d?u?u?u?u?l?u?d +?d?u?u?u?u?l?u?l +?d?u?u?u?u?l?u?u +?d?u?u?u?u?u?d?d +?d?u?u?u?u?u?d?l +?d?u?u?u?u?u?d?u +?d?u?u?u?u?u?d?s +?d?u?u?u?u?u?l?d +?d?u?u?u?u?u?l?l +?d?u?u?u?u?u?l?u +?d?u?u?u?u?u?u?d +?d?u?u?u?u?u?u?l +?d?u?u?u?u?u?u?u +?d?u?u?u?u?u?u?s +?d?u?u?u?u?u?s?d +?d?u?u?u?u?u?s?u +?d?u?u?u?u?u?s?s +?d?u?u?u?u?s?d?d +?d?u?u?u?u?s?d?u +?d?u?u?u?u?s?d?s +?d?u?u?u?u?s?u?d +?d?u?u?u?u?s?u?u +?d?u?u?u?u?s?u?s +?d?u?u?u?u?s?s?d +?d?u?u?u?u?s?s?u +?d?u?u?u?u?s?s?s +?d?u?u?u?s?d?d?d +?d?u?u?u?s?d?d?u +?d?u?u?u?s?d?d?s +?d?u?u?u?s?d?u?d +?d?u?u?u?s?d?u?u +?d?u?u?u?s?d?u?s +?d?u?u?u?s?d?s?d +?d?u?u?u?s?d?s?u +?d?u?u?u?s?d?s?s +?d?u?u?u?s?u?d?d +?d?u?u?u?s?u?d?u +?d?u?u?u?s?u?d?s +?d?u?u?u?s?u?u?d +?d?u?u?u?s?u?u?u +?d?u?u?u?s?u?u?s +?d?u?u?u?s?u?s?d +?d?u?u?u?s?u?s?u +?d?u?u?u?s?u?s?s +?d?u?u?u?s?s?d?d +?d?u?u?u?s?s?d?u +?d?u?u?u?s?s?d?s +?d?u?u?u?s?s?u?d +?d?u?u?u?s?s?u?u +?d?u?u?u?s?s?u?s +?d?u?u?u?s?s?s?d +?d?u?u?u?s?s?s?u +?d?u?u?u?s?s?s?s +?d?u?u?s?d?d?d?d +?d?u?u?s?d?d?d?u +?d?u?u?s?d?d?d?s +?d?u?u?s?d?d?u?d +?d?u?u?s?d?d?u?u +?d?u?u?s?d?d?u?s +?d?u?u?s?d?d?s?d +?d?u?u?s?d?d?s?u +?d?u?u?s?d?d?s?s +?d?u?u?s?d?u?d?d +?d?u?u?s?d?u?d?u +?d?u?u?s?d?u?d?s +?d?u?u?s?d?u?u?d +?d?u?u?s?d?u?u?u +?d?u?u?s?d?u?u?s +?d?u?u?s?d?u?s?d +?d?u?u?s?d?u?s?u +?d?u?u?s?d?u?s?s +?d?u?u?s?d?s?d?d +?d?u?u?s?d?s?d?u +?d?u?u?s?d?s?d?s +?d?u?u?s?d?s?u?d +?d?u?u?s?d?s?u?u +?d?u?u?s?d?s?u?s +?d?u?u?s?d?s?s?d +?d?u?u?s?d?s?s?u +?d?u?u?s?d?s?s?s +?d?u?u?s?u?d?d?d +?d?u?u?s?u?d?d?u +?d?u?u?s?u?d?d?s +?d?u?u?s?u?d?u?d +?d?u?u?s?u?d?u?u +?d?u?u?s?u?d?u?s +?d?u?u?s?u?d?s?d +?d?u?u?s?u?d?s?u +?d?u?u?s?u?d?s?s +?d?u?u?s?u?u?d?d +?d?u?u?s?u?u?d?u +?d?u?u?s?u?u?d?s +?d?u?u?s?u?u?u?d +?d?u?u?s?u?u?u?u +?d?u?u?s?u?u?u?s +?d?u?u?s?u?u?s?d +?d?u?u?s?u?u?s?u +?d?u?u?s?u?u?s?s +?d?u?u?s?u?s?d?d +?d?u?u?s?u?s?d?u +?d?u?u?s?u?s?d?s +?d?u?u?s?u?s?u?d +?d?u?u?s?u?s?u?u +?d?u?u?s?u?s?u?s +?d?u?u?s?u?s?s?d +?d?u?u?s?u?s?s?u +?d?u?u?s?u?s?s?s +?d?u?u?s?s?d?d?d +?d?u?u?s?s?d?d?u +?d?u?u?s?s?d?d?s +?d?u?u?s?s?d?u?d +?d?u?u?s?s?d?u?u +?d?u?u?s?s?d?u?s +?d?u?u?s?s?d?s?d +?d?u?u?s?s?d?s?u +?d?u?u?s?s?d?s?s +?d?u?u?s?s?u?d?d +?d?u?u?s?s?u?d?u +?d?u?u?s?s?u?d?s +?d?u?u?s?s?u?u?d +?d?u?u?s?s?u?u?u +?d?u?u?s?s?u?u?s +?d?u?u?s?s?u?s?d +?d?u?u?s?s?u?s?u +?d?u?u?s?s?u?s?s +?d?u?u?s?s?s?d?d +?d?u?u?s?s?s?d?u +?d?u?u?s?s?s?d?s +?d?u?u?s?s?s?u?d +?d?u?u?s?s?s?u?u +?d?u?u?s?s?s?u?s +?d?u?u?s?s?s?s?d +?d?u?u?s?s?s?s?u +?d?u?u?s?s?s?s?s +?d?u?s?d?d?d?d?d +?d?u?s?d?d?d?d?u +?d?u?s?d?d?d?d?s +?d?u?s?d?d?d?u?d +?d?u?s?d?d?d?u?u +?d?u?s?d?d?d?u?s +?d?u?s?d?d?d?s?d +?d?u?s?d?d?d?s?u +?d?u?s?d?d?d?s?s +?d?u?s?d?d?u?d?d +?d?u?s?d?d?u?d?u +?d?u?s?d?d?u?d?s +?d?u?s?d?d?u?u?d +?d?u?s?d?d?u?u?u +?d?u?s?d?d?u?u?s +?d?u?s?d?d?u?s?d +?d?u?s?d?d?u?s?u +?d?u?s?d?d?u?s?s +?d?u?s?d?d?s?d?d +?d?u?s?d?d?s?d?u +?d?u?s?d?d?s?d?s +?d?u?s?d?d?s?u?d +?d?u?s?d?d?s?u?u +?d?u?s?d?d?s?u?s +?d?u?s?d?d?s?s?d +?d?u?s?d?d?s?s?u +?d?u?s?d?d?s?s?s +?d?u?s?d?u?d?d?d +?d?u?s?d?u?d?d?u +?d?u?s?d?u?d?d?s +?d?u?s?d?u?d?u?d +?d?u?s?d?u?d?u?u +?d?u?s?d?u?d?u?s +?d?u?s?d?u?d?s?d +?d?u?s?d?u?d?s?u +?d?u?s?d?u?d?s?s +?d?u?s?d?u?u?d?d +?d?u?s?d?u?u?d?u +?d?u?s?d?u?u?d?s +?d?u?s?d?u?u?u?d +?d?u?s?d?u?u?u?u +?d?u?s?d?u?u?u?s +?d?u?s?d?u?u?s?d +?d?u?s?d?u?u?s?u +?d?u?s?d?u?u?s?s +?d?u?s?d?u?s?d?d +?d?u?s?d?u?s?d?u +?d?u?s?d?u?s?d?s +?d?u?s?d?u?s?u?d +?d?u?s?d?u?s?u?u +?d?u?s?d?u?s?u?s +?d?u?s?d?u?s?s?d +?d?u?s?d?u?s?s?u +?d?u?s?d?u?s?s?s +?d?u?s?d?s?d?d?d +?d?u?s?d?s?d?d?u +?d?u?s?d?s?d?d?s +?d?u?s?d?s?d?u?d +?d?u?s?d?s?d?u?u +?d?u?s?d?s?d?u?s +?d?u?s?d?s?d?s?d +?d?u?s?d?s?d?s?u +?d?u?s?d?s?d?s?s +?d?u?s?d?s?u?d?d +?d?u?s?d?s?u?d?u +?d?u?s?d?s?u?d?s +?d?u?s?d?s?u?u?d +?d?u?s?d?s?u?u?u +?d?u?s?d?s?u?u?s +?d?u?s?d?s?u?s?d +?d?u?s?d?s?u?s?u +?d?u?s?d?s?u?s?s +?d?u?s?d?s?s?d?d +?d?u?s?d?s?s?d?u +?d?u?s?d?s?s?d?s +?d?u?s?d?s?s?u?d +?d?u?s?d?s?s?u?u +?d?u?s?d?s?s?u?s +?d?u?s?d?s?s?s?d +?d?u?s?d?s?s?s?u +?d?u?s?d?s?s?s?s +?d?u?s?u?d?d?d?d +?d?u?s?u?d?d?d?u +?d?u?s?u?d?d?d?s +?d?u?s?u?d?d?u?d +?d?u?s?u?d?d?u?u +?d?u?s?u?d?d?u?s +?d?u?s?u?d?d?s?d +?d?u?s?u?d?d?s?u +?d?u?s?u?d?d?s?s +?d?u?s?u?d?u?d?d +?d?u?s?u?d?u?d?u +?d?u?s?u?d?u?d?s +?d?u?s?u?d?u?u?d +?d?u?s?u?d?u?u?u +?d?u?s?u?d?u?u?s +?d?u?s?u?d?u?s?d +?d?u?s?u?d?u?s?u +?d?u?s?u?d?u?s?s +?d?u?s?u?d?s?d?d +?d?u?s?u?d?s?d?u +?d?u?s?u?d?s?d?s +?d?u?s?u?d?s?u?d +?d?u?s?u?d?s?u?u +?d?u?s?u?d?s?u?s +?d?u?s?u?d?s?s?d +?d?u?s?u?d?s?s?u +?d?u?s?u?d?s?s?s +?d?u?s?u?u?d?d?d +?d?u?s?u?u?d?d?u +?d?u?s?u?u?d?d?s +?d?u?s?u?u?d?u?d +?d?u?s?u?u?d?u?u +?d?u?s?u?u?d?u?s +?d?u?s?u?u?d?s?d +?d?u?s?u?u?d?s?u +?d?u?s?u?u?d?s?s +?d?u?s?u?u?u?d?d +?d?u?s?u?u?u?d?u +?d?u?s?u?u?u?d?s +?d?u?s?u?u?u?u?d +?d?u?s?u?u?u?u?u +?d?u?s?u?u?u?u?s +?d?u?s?u?u?u?s?d +?d?u?s?u?u?u?s?u +?d?u?s?u?u?u?s?s +?d?u?s?u?u?s?d?d +?d?u?s?u?u?s?d?u +?d?u?s?u?u?s?d?s +?d?u?s?u?u?s?u?d +?d?u?s?u?u?s?u?u +?d?u?s?u?u?s?u?s +?d?u?s?u?u?s?s?d +?d?u?s?u?u?s?s?u +?d?u?s?u?u?s?s?s +?d?u?s?u?s?d?d?d +?d?u?s?u?s?d?d?u +?d?u?s?u?s?d?d?s +?d?u?s?u?s?d?u?d +?d?u?s?u?s?d?u?u +?d?u?s?u?s?d?u?s +?d?u?s?u?s?d?s?d +?d?u?s?u?s?d?s?u +?d?u?s?u?s?d?s?s +?d?u?s?u?s?u?d?d +?d?u?s?u?s?u?d?u +?d?u?s?u?s?u?d?s +?d?u?s?u?s?u?u?d +?d?u?s?u?s?u?u?u +?d?u?s?u?s?u?u?s +?d?u?s?u?s?u?s?d +?d?u?s?u?s?u?s?u +?d?u?s?u?s?u?s?s +?d?u?s?u?s?s?d?d +?d?u?s?u?s?s?d?u +?d?u?s?u?s?s?d?s +?d?u?s?u?s?s?u?d +?d?u?s?u?s?s?u?u +?d?u?s?u?s?s?u?s +?d?u?s?u?s?s?s?d +?d?u?s?u?s?s?s?u +?d?u?s?u?s?s?s?s +?d?u?s?s?d?d?d?d +?d?u?s?s?d?d?d?u +?d?u?s?s?d?d?d?s +?d?u?s?s?d?d?u?d +?d?u?s?s?d?d?u?u +?d?u?s?s?d?d?u?s +?d?u?s?s?d?d?s?d +?d?u?s?s?d?d?s?u +?d?u?s?s?d?d?s?s +?d?u?s?s?d?u?d?d +?d?u?s?s?d?u?d?u +?d?u?s?s?d?u?d?s +?d?u?s?s?d?u?u?d +?d?u?s?s?d?u?u?u +?d?u?s?s?d?u?u?s +?d?u?s?s?d?u?s?d +?d?u?s?s?d?u?s?u +?d?u?s?s?d?u?s?s +?d?u?s?s?d?s?d?d +?d?u?s?s?d?s?d?u +?d?u?s?s?d?s?d?s +?d?u?s?s?d?s?u?d +?d?u?s?s?d?s?u?u +?d?u?s?s?d?s?u?s +?d?u?s?s?d?s?s?d +?d?u?s?s?d?s?s?u +?d?u?s?s?d?s?s?s +?d?u?s?s?u?d?d?d +?d?u?s?s?u?d?d?u +?d?u?s?s?u?d?d?s +?d?u?s?s?u?d?u?d +?d?u?s?s?u?d?u?u +?d?u?s?s?u?d?u?s +?d?u?s?s?u?d?s?d +?d?u?s?s?u?d?s?u +?d?u?s?s?u?d?s?s +?d?u?s?s?u?u?d?d +?d?u?s?s?u?u?d?u +?d?u?s?s?u?u?d?s +?d?u?s?s?u?u?u?d +?d?u?s?s?u?u?u?u +?d?u?s?s?u?u?u?s +?d?u?s?s?u?u?s?d +?d?u?s?s?u?u?s?u +?d?u?s?s?u?u?s?s +?d?u?s?s?u?s?d?d +?d?u?s?s?u?s?d?u +?d?u?s?s?u?s?d?s +?d?u?s?s?u?s?u?d +?d?u?s?s?u?s?u?u +?d?u?s?s?u?s?u?s +?d?u?s?s?u?s?s?d +?d?u?s?s?u?s?s?u +?d?u?s?s?u?s?s?s +?d?u?s?s?s?d?d?d +?d?u?s?s?s?d?d?u +?d?u?s?s?s?d?d?s +?d?u?s?s?s?d?u?d +?d?u?s?s?s?d?u?u +?d?u?s?s?s?d?u?s +?d?u?s?s?s?d?s?d +?d?u?s?s?s?d?s?u +?d?u?s?s?s?d?s?s +?d?u?s?s?s?u?d?d +?d?u?s?s?s?u?d?u +?d?u?s?s?s?u?d?s +?d?u?s?s?s?u?u?d +?d?u?s?s?s?u?u?u +?d?u?s?s?s?u?u?s +?d?u?s?s?s?u?s?d +?d?u?s?s?s?u?s?u +?d?u?s?s?s?u?s?s +?d?u?s?s?s?s?d?d +?d?u?s?s?s?s?d?u +?d?u?s?s?s?s?d?s +?d?u?s?s?s?s?u?d +?d?u?s?s?s?s?u?u +?d?u?s?s?s?s?u?s +?d?u?s?s?s?s?s?d +?d?u?s?s?s?s?s?u +?d?u?s?s?s?s?s?s +?d?s?d?d?d?d?d?d +?d?s?d?d?d?d?d?l +?d?s?d?d?d?d?d?u +?d?s?d?d?d?d?d?s +?d?s?d?d?d?d?l?d +?d?s?d?d?d?d?l?l +?d?s?d?d?d?d?l?s +?d?s?d?d?d?d?u?d +?d?s?d?d?d?d?u?u +?d?s?d?d?d?d?u?s +?d?s?d?d?d?d?s?d +?d?s?d?d?d?d?s?l +?d?s?d?d?d?d?s?u +?d?s?d?d?d?d?s?s +?d?s?d?d?d?l?d?d +?d?s?d?d?d?l?d?l +?d?s?d?d?d?l?d?s +?d?s?d?d?d?l?l?d +?d?s?d?d?d?l?l?l +?d?s?d?d?d?l?l?s +?d?s?d?d?d?l?s?d +?d?s?d?d?d?l?s?l +?d?s?d?d?d?l?s?s +?d?s?d?d?d?u?d?d +?d?s?d?d?d?u?d?u +?d?s?d?d?d?u?d?s +?d?s?d?d?d?u?u?d +?d?s?d?d?d?u?u?u +?d?s?d?d?d?u?u?s +?d?s?d?d?d?u?s?d +?d?s?d?d?d?u?s?u +?d?s?d?d?d?u?s?s +?d?s?d?d?d?s?d?d +?d?s?d?d?d?s?d?l +?d?s?d?d?d?s?d?u +?d?s?d?d?d?s?d?s +?d?s?d?d?d?s?l?d +?d?s?d?d?d?s?l?l +?d?s?d?d?d?s?l?s +?d?s?d?d?d?s?u?d +?d?s?d?d?d?s?u?u +?d?s?d?d?d?s?u?s +?d?s?d?d?d?s?s?d +?d?s?d?d?d?s?s?l +?d?s?d?d?d?s?s?u +?d?s?d?d?d?s?s?s +?d?s?d?d?l?d?d?d +?d?s?d?d?l?d?d?l +?d?s?d?d?l?d?d?s +?d?s?d?d?l?d?l?d +?d?s?d?d?l?d?l?l +?d?s?d?d?l?d?l?s +?d?s?d?d?l?d?s?d +?d?s?d?d?l?d?s?l +?d?s?d?d?l?d?s?s +?d?s?d?d?l?l?d?d +?d?s?d?d?l?l?d?l +?d?s?d?d?l?l?d?s +?d?s?d?d?l?l?l?d +?d?s?d?d?l?l?l?l +?d?s?d?d?l?l?l?s +?d?s?d?d?l?l?s?d +?d?s?d?d?l?l?s?l +?d?s?d?d?l?l?s?s +?d?s?d?d?l?s?d?d +?d?s?d?d?l?s?d?l +?d?s?d?d?l?s?d?s +?d?s?d?d?l?s?l?d +?d?s?d?d?l?s?l?l +?d?s?d?d?l?s?l?s +?d?s?d?d?l?s?s?d +?d?s?d?d?l?s?s?l +?d?s?d?d?l?s?s?s +?d?s?d?d?u?d?d?d +?d?s?d?d?u?d?d?u +?d?s?d?d?u?d?d?s +?d?s?d?d?u?d?u?d +?d?s?d?d?u?d?u?u +?d?s?d?d?u?d?u?s +?d?s?d?d?u?d?s?d +?d?s?d?d?u?d?s?u +?d?s?d?d?u?d?s?s +?d?s?d?d?u?u?d?d +?d?s?d?d?u?u?d?u +?d?s?d?d?u?u?d?s +?d?s?d?d?u?u?u?d +?d?s?d?d?u?u?u?u +?d?s?d?d?u?u?u?s +?d?s?d?d?u?u?s?d +?d?s?d?d?u?u?s?u +?d?s?d?d?u?u?s?s +?d?s?d?d?u?s?d?d +?d?s?d?d?u?s?d?u +?d?s?d?d?u?s?d?s +?d?s?d?d?u?s?u?d +?d?s?d?d?u?s?u?u +?d?s?d?d?u?s?u?s +?d?s?d?d?u?s?s?d +?d?s?d?d?u?s?s?u +?d?s?d?d?u?s?s?s +?d?s?d?d?s?d?d?d +?d?s?d?d?s?d?d?l +?d?s?d?d?s?d?d?u +?d?s?d?d?s?d?d?s +?d?s?d?d?s?d?l?d +?d?s?d?d?s?d?l?l +?d?s?d?d?s?d?l?s +?d?s?d?d?s?d?u?d +?d?s?d?d?s?d?u?u +?d?s?d?d?s?d?u?s +?d?s?d?d?s?d?s?d +?d?s?d?d?s?d?s?l +?d?s?d?d?s?d?s?u +?d?s?d?d?s?d?s?s +?d?s?d?d?s?l?d?d +?d?s?d?d?s?l?d?l +?d?s?d?d?s?l?d?s +?d?s?d?d?s?l?l?d +?d?s?d?d?s?l?l?l +?d?s?d?d?s?l?l?s +?d?s?d?d?s?l?s?d +?d?s?d?d?s?l?s?l +?d?s?d?d?s?l?s?s +?d?s?d?d?s?u?d?d +?d?s?d?d?s?u?d?u +?d?s?d?d?s?u?d?s +?d?s?d?d?s?u?u?d +?d?s?d?d?s?u?u?u +?d?s?d?d?s?u?u?s +?d?s?d?d?s?u?s?d +?d?s?d?d?s?u?s?u +?d?s?d?d?s?u?s?s +?d?s?d?d?s?s?d?d +?d?s?d?d?s?s?d?l +?d?s?d?d?s?s?d?u +?d?s?d?d?s?s?d?s +?d?s?d?d?s?s?l?d +?d?s?d?d?s?s?l?l +?d?s?d?d?s?s?l?s +?d?s?d?d?s?s?u?d +?d?s?d?d?s?s?u?u +?d?s?d?d?s?s?u?s +?d?s?d?d?s?s?s?d +?d?s?d?d?s?s?s?l +?d?s?d?d?s?s?s?u +?d?s?d?d?s?s?s?s +?d?s?d?l?d?d?d?d +?d?s?d?l?d?d?d?l +?d?s?d?l?d?d?d?s +?d?s?d?l?d?d?l?d +?d?s?d?l?d?d?l?l +?d?s?d?l?d?d?l?s +?d?s?d?l?d?d?s?d +?d?s?d?l?d?d?s?l +?d?s?d?l?d?d?s?s +?d?s?d?l?d?l?d?d +?d?s?d?l?d?l?d?l +?d?s?d?l?d?l?d?s +?d?s?d?l?d?l?l?d +?d?s?d?l?d?l?l?l +?d?s?d?l?d?l?l?s +?d?s?d?l?d?l?s?d +?d?s?d?l?d?l?s?l +?d?s?d?l?d?l?s?s +?d?s?d?l?d?s?d?d +?d?s?d?l?d?s?d?l +?d?s?d?l?d?s?d?s +?d?s?d?l?d?s?l?d +?d?s?d?l?d?s?l?l +?d?s?d?l?d?s?l?s +?d?s?d?l?d?s?s?d +?d?s?d?l?d?s?s?l +?d?s?d?l?d?s?s?s +?d?s?d?l?l?d?d?d +?d?s?d?l?l?d?d?l +?d?s?d?l?l?d?d?s +?d?s?d?l?l?d?l?d +?d?s?d?l?l?d?l?l +?d?s?d?l?l?d?l?s +?d?s?d?l?l?d?s?d +?d?s?d?l?l?d?s?l +?d?s?d?l?l?d?s?s +?d?s?d?l?l?l?d?d +?d?s?d?l?l?l?d?l +?d?s?d?l?l?l?d?s +?d?s?d?l?l?l?l?d +?d?s?d?l?l?l?l?l +?d?s?d?l?l?l?l?s +?d?s?d?l?l?l?s?d +?d?s?d?l?l?l?s?l +?d?s?d?l?l?l?s?s +?d?s?d?l?l?s?d?d +?d?s?d?l?l?s?d?l +?d?s?d?l?l?s?d?s +?d?s?d?l?l?s?l?d +?d?s?d?l?l?s?l?l +?d?s?d?l?l?s?l?s +?d?s?d?l?l?s?s?d +?d?s?d?l?l?s?s?l +?d?s?d?l?l?s?s?s +?d?s?d?l?s?d?d?d +?d?s?d?l?s?d?d?l +?d?s?d?l?s?d?d?s +?d?s?d?l?s?d?l?d +?d?s?d?l?s?d?l?l +?d?s?d?l?s?d?l?s +?d?s?d?l?s?d?s?d +?d?s?d?l?s?d?s?l +?d?s?d?l?s?d?s?s +?d?s?d?l?s?l?d?d +?d?s?d?l?s?l?d?l +?d?s?d?l?s?l?d?s +?d?s?d?l?s?l?l?d +?d?s?d?l?s?l?l?l +?d?s?d?l?s?l?l?s +?d?s?d?l?s?l?s?d +?d?s?d?l?s?l?s?l +?d?s?d?l?s?l?s?s +?d?s?d?l?s?s?d?d +?d?s?d?l?s?s?d?l +?d?s?d?l?s?s?d?s +?d?s?d?l?s?s?l?d +?d?s?d?l?s?s?l?l +?d?s?d?l?s?s?l?s +?d?s?d?l?s?s?s?d +?d?s?d?l?s?s?s?l +?d?s?d?l?s?s?s?s +?d?s?d?u?d?d?d?d +?d?s?d?u?d?d?d?u +?d?s?d?u?d?d?d?s +?d?s?d?u?d?d?u?d +?d?s?d?u?d?d?u?u +?d?s?d?u?d?d?u?s +?d?s?d?u?d?d?s?d +?d?s?d?u?d?d?s?u +?d?s?d?u?d?d?s?s +?d?s?d?u?d?u?d?d +?d?s?d?u?d?u?d?u +?d?s?d?u?d?u?d?s +?d?s?d?u?d?u?u?d +?d?s?d?u?d?u?u?u +?d?s?d?u?d?u?u?s +?d?s?d?u?d?u?s?d +?d?s?d?u?d?u?s?u +?d?s?d?u?d?u?s?s +?d?s?d?u?d?s?d?d +?d?s?d?u?d?s?d?u +?d?s?d?u?d?s?d?s +?d?s?d?u?d?s?u?d +?d?s?d?u?d?s?u?u +?d?s?d?u?d?s?u?s +?d?s?d?u?d?s?s?d +?d?s?d?u?d?s?s?u +?d?s?d?u?d?s?s?s +?d?s?d?u?u?d?d?d +?d?s?d?u?u?d?d?u +?d?s?d?u?u?d?d?s +?d?s?d?u?u?d?u?d +?d?s?d?u?u?d?u?u +?d?s?d?u?u?d?u?s +?d?s?d?u?u?d?s?d +?d?s?d?u?u?d?s?u +?d?s?d?u?u?d?s?s +?d?s?d?u?u?u?d?d +?d?s?d?u?u?u?d?u +?d?s?d?u?u?u?d?s +?d?s?d?u?u?u?u?d +?d?s?d?u?u?u?u?u +?d?s?d?u?u?u?u?s +?d?s?d?u?u?u?s?d +?d?s?d?u?u?u?s?u +?d?s?d?u?u?u?s?s +?d?s?d?u?u?s?d?d +?d?s?d?u?u?s?d?u +?d?s?d?u?u?s?d?s +?d?s?d?u?u?s?u?d +?d?s?d?u?u?s?u?u +?d?s?d?u?u?s?u?s +?d?s?d?u?u?s?s?d +?d?s?d?u?u?s?s?u +?d?s?d?u?u?s?s?s +?d?s?d?u?s?d?d?d +?d?s?d?u?s?d?d?u +?d?s?d?u?s?d?d?s +?d?s?d?u?s?d?u?d +?d?s?d?u?s?d?u?u +?d?s?d?u?s?d?u?s +?d?s?d?u?s?d?s?d +?d?s?d?u?s?d?s?u +?d?s?d?u?s?d?s?s +?d?s?d?u?s?u?d?d +?d?s?d?u?s?u?d?u +?d?s?d?u?s?u?d?s +?d?s?d?u?s?u?u?d +?d?s?d?u?s?u?u?u +?d?s?d?u?s?u?u?s +?d?s?d?u?s?u?s?d +?d?s?d?u?s?u?s?u +?d?s?d?u?s?u?s?s +?d?s?d?u?s?s?d?d +?d?s?d?u?s?s?d?u +?d?s?d?u?s?s?d?s +?d?s?d?u?s?s?u?d +?d?s?d?u?s?s?u?u +?d?s?d?u?s?s?u?s +?d?s?d?u?s?s?s?d +?d?s?d?u?s?s?s?u +?d?s?d?u?s?s?s?s +?d?s?d?s?d?d?d?d +?d?s?d?s?d?d?d?l +?d?s?d?s?d?d?d?u +?d?s?d?s?d?d?d?s +?d?s?d?s?d?d?l?d +?d?s?d?s?d?d?l?l +?d?s?d?s?d?d?l?s +?d?s?d?s?d?d?u?d +?d?s?d?s?d?d?u?u +?d?s?d?s?d?d?u?s +?d?s?d?s?d?d?s?d +?d?s?d?s?d?d?s?l +?d?s?d?s?d?d?s?u +?d?s?d?s?d?d?s?s +?d?s?d?s?d?l?d?d +?d?s?d?s?d?l?d?l +?d?s?d?s?d?l?d?s +?d?s?d?s?d?l?l?d +?d?s?d?s?d?l?l?l +?d?s?d?s?d?l?l?s +?d?s?d?s?d?l?s?d +?d?s?d?s?d?l?s?l +?d?s?d?s?d?l?s?s +?d?s?d?s?d?u?d?d +?d?s?d?s?d?u?d?u +?d?s?d?s?d?u?d?s +?d?s?d?s?d?u?u?d +?d?s?d?s?d?u?u?u +?d?s?d?s?d?u?u?s +?d?s?d?s?d?u?s?d +?d?s?d?s?d?u?s?u +?d?s?d?s?d?u?s?s +?d?s?d?s?d?s?d?d +?d?s?d?s?d?s?d?l +?d?s?d?s?d?s?d?u +?d?s?d?s?d?s?d?s +?d?s?d?s?d?s?l?d +?d?s?d?s?d?s?l?l +?d?s?d?s?d?s?l?s +?d?s?d?s?d?s?u?d +?d?s?d?s?d?s?u?u +?d?s?d?s?d?s?u?s +?d?s?d?s?d?s?s?d +?d?s?d?s?d?s?s?l +?d?s?d?s?d?s?s?u +?d?s?d?s?d?s?s?s +?d?s?d?s?l?d?d?d +?d?s?d?s?l?d?d?l +?d?s?d?s?l?d?d?s +?d?s?d?s?l?d?l?d +?d?s?d?s?l?d?l?l +?d?s?d?s?l?d?l?s +?d?s?d?s?l?d?s?d +?d?s?d?s?l?d?s?l +?d?s?d?s?l?d?s?s +?d?s?d?s?l?l?d?d +?d?s?d?s?l?l?d?l +?d?s?d?s?l?l?d?s +?d?s?d?s?l?l?l?d +?d?s?d?s?l?l?l?l +?d?s?d?s?l?l?l?s +?d?s?d?s?l?l?s?d +?d?s?d?s?l?l?s?l +?d?s?d?s?l?l?s?s +?d?s?d?s?l?s?d?d +?d?s?d?s?l?s?d?l +?d?s?d?s?l?s?d?s +?d?s?d?s?l?s?l?d +?d?s?d?s?l?s?l?l +?d?s?d?s?l?s?l?s +?d?s?d?s?l?s?s?d +?d?s?d?s?l?s?s?l +?d?s?d?s?l?s?s?s +?d?s?d?s?u?d?d?d +?d?s?d?s?u?d?d?u +?d?s?d?s?u?d?d?s +?d?s?d?s?u?d?u?d +?d?s?d?s?u?d?u?u +?d?s?d?s?u?d?u?s +?d?s?d?s?u?d?s?d +?d?s?d?s?u?d?s?u +?d?s?d?s?u?d?s?s +?d?s?d?s?u?u?d?d +?d?s?d?s?u?u?d?u +?d?s?d?s?u?u?d?s +?d?s?d?s?u?u?u?d +?d?s?d?s?u?u?u?u +?d?s?d?s?u?u?u?s +?d?s?d?s?u?u?s?d +?d?s?d?s?u?u?s?u +?d?s?d?s?u?u?s?s +?d?s?d?s?u?s?d?d +?d?s?d?s?u?s?d?u +?d?s?d?s?u?s?d?s +?d?s?d?s?u?s?u?d +?d?s?d?s?u?s?u?u +?d?s?d?s?u?s?u?s +?d?s?d?s?u?s?s?d +?d?s?d?s?u?s?s?u +?d?s?d?s?u?s?s?s +?d?s?d?s?s?d?d?d +?d?s?d?s?s?d?d?l +?d?s?d?s?s?d?d?u +?d?s?d?s?s?d?d?s +?d?s?d?s?s?d?l?d +?d?s?d?s?s?d?l?l +?d?s?d?s?s?d?l?s +?d?s?d?s?s?d?u?d +?d?s?d?s?s?d?u?u +?d?s?d?s?s?d?u?s +?d?s?d?s?s?d?s?d +?d?s?d?s?s?d?s?l +?d?s?d?s?s?d?s?u +?d?s?d?s?s?d?s?s +?d?s?d?s?s?l?d?d +?d?s?d?s?s?l?d?l +?d?s?d?s?s?l?d?s +?d?s?d?s?s?l?l?d +?d?s?d?s?s?l?l?l +?d?s?d?s?s?l?l?s +?d?s?d?s?s?l?s?d +?d?s?d?s?s?l?s?l +?d?s?d?s?s?l?s?s +?d?s?d?s?s?u?d?d +?d?s?d?s?s?u?d?u +?d?s?d?s?s?u?d?s +?d?s?d?s?s?u?u?d +?d?s?d?s?s?u?u?u +?d?s?d?s?s?u?u?s +?d?s?d?s?s?u?s?d +?d?s?d?s?s?u?s?u +?d?s?d?s?s?u?s?s +?d?s?d?s?s?s?d?d +?d?s?d?s?s?s?d?l +?d?s?d?s?s?s?d?u +?d?s?d?s?s?s?d?s +?d?s?d?s?s?s?l?d +?d?s?d?s?s?s?l?l +?d?s?d?s?s?s?l?s +?d?s?d?s?s?s?u?d +?d?s?d?s?s?s?u?u +?d?s?d?s?s?s?u?s +?d?s?d?s?s?s?s?d +?d?s?d?s?s?s?s?l +?d?s?d?s?s?s?s?u +?d?s?d?s?s?s?s?s +?d?s?l?d?d?d?d?d +?d?s?l?d?d?d?d?l +?d?s?l?d?d?d?d?s +?d?s?l?d?d?d?l?d +?d?s?l?d?d?d?l?l +?d?s?l?d?d?d?l?s +?d?s?l?d?d?d?s?d +?d?s?l?d?d?d?s?l +?d?s?l?d?d?d?s?s +?d?s?l?d?d?l?d?d +?d?s?l?d?d?l?d?l +?d?s?l?d?d?l?d?s +?d?s?l?d?d?l?l?d +?d?s?l?d?d?l?l?l +?d?s?l?d?d?l?l?s +?d?s?l?d?d?l?s?d +?d?s?l?d?d?l?s?l +?d?s?l?d?d?l?s?s +?d?s?l?d?d?s?d?d +?d?s?l?d?d?s?d?l +?d?s?l?d?d?s?d?s +?d?s?l?d?d?s?l?d +?d?s?l?d?d?s?l?l +?d?s?l?d?d?s?l?s +?d?s?l?d?d?s?s?d +?d?s?l?d?d?s?s?l +?d?s?l?d?d?s?s?s +?d?s?l?d?l?d?d?d +?d?s?l?d?l?d?d?l +?d?s?l?d?l?d?d?s +?d?s?l?d?l?d?l?d +?d?s?l?d?l?d?l?l +?d?s?l?d?l?d?l?s +?d?s?l?d?l?d?s?d +?d?s?l?d?l?d?s?l +?d?s?l?d?l?d?s?s +?d?s?l?d?l?l?d?d +?d?s?l?d?l?l?d?l +?d?s?l?d?l?l?d?s +?d?s?l?d?l?l?l?d +?d?s?l?d?l?l?l?l +?d?s?l?d?l?l?l?s +?d?s?l?d?l?l?s?d +?d?s?l?d?l?l?s?l +?d?s?l?d?l?l?s?s +?d?s?l?d?l?s?d?d +?d?s?l?d?l?s?d?l +?d?s?l?d?l?s?d?s +?d?s?l?d?l?s?l?d +?d?s?l?d?l?s?l?l +?d?s?l?d?l?s?l?s +?d?s?l?d?l?s?s?d +?d?s?l?d?l?s?s?l +?d?s?l?d?l?s?s?s +?d?s?l?d?s?d?d?d +?d?s?l?d?s?d?d?l +?d?s?l?d?s?d?d?s +?d?s?l?d?s?d?l?d +?d?s?l?d?s?d?l?l +?d?s?l?d?s?d?l?s +?d?s?l?d?s?d?s?d +?d?s?l?d?s?d?s?l +?d?s?l?d?s?d?s?s +?d?s?l?d?s?l?d?d +?d?s?l?d?s?l?d?l +?d?s?l?d?s?l?d?s +?d?s?l?d?s?l?l?d +?d?s?l?d?s?l?l?l +?d?s?l?d?s?l?l?s +?d?s?l?d?s?l?s?d +?d?s?l?d?s?l?s?l +?d?s?l?d?s?l?s?s +?d?s?l?d?s?s?d?d +?d?s?l?d?s?s?d?l +?d?s?l?d?s?s?d?s +?d?s?l?d?s?s?l?d +?d?s?l?d?s?s?l?l +?d?s?l?d?s?s?l?s +?d?s?l?d?s?s?s?d +?d?s?l?d?s?s?s?l +?d?s?l?d?s?s?s?s +?d?s?l?l?d?d?d?d +?d?s?l?l?d?d?d?l +?d?s?l?l?d?d?d?s +?d?s?l?l?d?d?l?d +?d?s?l?l?d?d?l?l +?d?s?l?l?d?d?l?s +?d?s?l?l?d?d?s?d +?d?s?l?l?d?d?s?l +?d?s?l?l?d?d?s?s +?d?s?l?l?d?l?d?d +?d?s?l?l?d?l?d?l +?d?s?l?l?d?l?d?s +?d?s?l?l?d?l?l?d +?d?s?l?l?d?l?l?l +?d?s?l?l?d?l?l?s +?d?s?l?l?d?l?s?d +?d?s?l?l?d?l?s?l +?d?s?l?l?d?l?s?s +?d?s?l?l?d?s?d?d +?d?s?l?l?d?s?d?l +?d?s?l?l?d?s?d?s +?d?s?l?l?d?s?l?d +?d?s?l?l?d?s?l?l +?d?s?l?l?d?s?l?s +?d?s?l?l?d?s?s?d +?d?s?l?l?d?s?s?l +?d?s?l?l?d?s?s?s +?d?s?l?l?l?d?d?d +?d?s?l?l?l?d?d?l +?d?s?l?l?l?d?d?s +?d?s?l?l?l?d?l?d +?d?s?l?l?l?d?l?l +?d?s?l?l?l?d?l?s +?d?s?l?l?l?d?s?d +?d?s?l?l?l?d?s?l +?d?s?l?l?l?d?s?s +?d?s?l?l?l?l?d?d +?d?s?l?l?l?l?d?l +?d?s?l?l?l?l?d?s +?d?s?l?l?l?l?l?d +?d?s?l?l?l?l?l?l +?d?s?l?l?l?l?l?s +?d?s?l?l?l?l?s?d +?d?s?l?l?l?l?s?l +?d?s?l?l?l?l?s?s +?d?s?l?l?l?s?d?d +?d?s?l?l?l?s?d?l +?d?s?l?l?l?s?d?s +?d?s?l?l?l?s?l?d +?d?s?l?l?l?s?l?l +?d?s?l?l?l?s?l?s +?d?s?l?l?l?s?s?d +?d?s?l?l?l?s?s?l +?d?s?l?l?l?s?s?s +?d?s?l?l?s?d?d?d +?d?s?l?l?s?d?d?l +?d?s?l?l?s?d?d?s +?d?s?l?l?s?d?l?d +?d?s?l?l?s?d?l?l +?d?s?l?l?s?d?l?s +?d?s?l?l?s?d?s?d +?d?s?l?l?s?d?s?l +?d?s?l?l?s?d?s?s +?d?s?l?l?s?l?d?d +?d?s?l?l?s?l?d?l +?d?s?l?l?s?l?d?s +?d?s?l?l?s?l?l?d +?d?s?l?l?s?l?l?l +?d?s?l?l?s?l?l?s +?d?s?l?l?s?l?s?d +?d?s?l?l?s?l?s?l +?d?s?l?l?s?l?s?s +?d?s?l?l?s?s?d?d +?d?s?l?l?s?s?d?l +?d?s?l?l?s?s?d?s +?d?s?l?l?s?s?l?d +?d?s?l?l?s?s?l?l +?d?s?l?l?s?s?l?s +?d?s?l?l?s?s?s?d +?d?s?l?l?s?s?s?l +?d?s?l?l?s?s?s?s +?d?s?l?s?d?d?d?d +?d?s?l?s?d?d?d?l +?d?s?l?s?d?d?d?s +?d?s?l?s?d?d?l?d +?d?s?l?s?d?d?l?l +?d?s?l?s?d?d?l?s +?d?s?l?s?d?d?s?d +?d?s?l?s?d?d?s?l +?d?s?l?s?d?d?s?s +?d?s?l?s?d?l?d?d +?d?s?l?s?d?l?d?l +?d?s?l?s?d?l?d?s +?d?s?l?s?d?l?l?d +?d?s?l?s?d?l?l?l +?d?s?l?s?d?l?l?s +?d?s?l?s?d?l?s?d +?d?s?l?s?d?l?s?l +?d?s?l?s?d?l?s?s +?d?s?l?s?d?s?d?d +?d?s?l?s?d?s?d?l +?d?s?l?s?d?s?d?s +?d?s?l?s?d?s?l?d +?d?s?l?s?d?s?l?l +?d?s?l?s?d?s?l?s +?d?s?l?s?d?s?s?d +?d?s?l?s?d?s?s?l +?d?s?l?s?d?s?s?s +?d?s?l?s?l?d?d?d +?d?s?l?s?l?d?d?l +?d?s?l?s?l?d?d?s +?d?s?l?s?l?d?l?d +?d?s?l?s?l?d?l?l +?d?s?l?s?l?d?l?s +?d?s?l?s?l?d?s?d +?d?s?l?s?l?d?s?l +?d?s?l?s?l?d?s?s +?d?s?l?s?l?l?d?d +?d?s?l?s?l?l?d?l +?d?s?l?s?l?l?d?s +?d?s?l?s?l?l?l?d +?d?s?l?s?l?l?l?l +?d?s?l?s?l?l?l?s +?d?s?l?s?l?l?s?d +?d?s?l?s?l?l?s?l +?d?s?l?s?l?l?s?s +?d?s?l?s?l?s?d?d +?d?s?l?s?l?s?d?l +?d?s?l?s?l?s?d?s +?d?s?l?s?l?s?l?d +?d?s?l?s?l?s?l?l +?d?s?l?s?l?s?l?s +?d?s?l?s?l?s?s?d +?d?s?l?s?l?s?s?l +?d?s?l?s?l?s?s?s +?d?s?l?s?s?d?d?d +?d?s?l?s?s?d?d?l +?d?s?l?s?s?d?d?s +?d?s?l?s?s?d?l?d +?d?s?l?s?s?d?l?l +?d?s?l?s?s?d?l?s +?d?s?l?s?s?d?s?d +?d?s?l?s?s?d?s?l +?d?s?l?s?s?d?s?s +?d?s?l?s?s?l?d?d +?d?s?l?s?s?l?d?l +?d?s?l?s?s?l?d?s +?d?s?l?s?s?l?l?d +?d?s?l?s?s?l?l?l +?d?s?l?s?s?l?l?s +?d?s?l?s?s?l?s?d +?d?s?l?s?s?l?s?l +?d?s?l?s?s?l?s?s +?d?s?l?s?s?s?d?d +?d?s?l?s?s?s?d?l +?d?s?l?s?s?s?d?s +?d?s?l?s?s?s?l?d +?d?s?l?s?s?s?l?l +?d?s?l?s?s?s?l?s +?d?s?l?s?s?s?s?d +?d?s?l?s?s?s?s?l +?d?s?l?s?s?s?s?s +?d?s?u?d?d?d?d?d +?d?s?u?d?d?d?d?u +?d?s?u?d?d?d?d?s +?d?s?u?d?d?d?u?d +?d?s?u?d?d?d?u?u +?d?s?u?d?d?d?u?s +?d?s?u?d?d?d?s?d +?d?s?u?d?d?d?s?u +?d?s?u?d?d?d?s?s +?d?s?u?d?d?u?d?d +?d?s?u?d?d?u?d?u +?d?s?u?d?d?u?d?s +?d?s?u?d?d?u?u?d +?d?s?u?d?d?u?u?u +?d?s?u?d?d?u?u?s +?d?s?u?d?d?u?s?d +?d?s?u?d?d?u?s?u +?d?s?u?d?d?u?s?s +?d?s?u?d?d?s?d?d +?d?s?u?d?d?s?d?u +?d?s?u?d?d?s?d?s +?d?s?u?d?d?s?u?d +?d?s?u?d?d?s?u?u +?d?s?u?d?d?s?u?s +?d?s?u?d?d?s?s?d +?d?s?u?d?d?s?s?u +?d?s?u?d?d?s?s?s +?d?s?u?d?u?d?d?d +?d?s?u?d?u?d?d?u +?d?s?u?d?u?d?d?s +?d?s?u?d?u?d?u?d +?d?s?u?d?u?d?u?u +?d?s?u?d?u?d?u?s +?d?s?u?d?u?d?s?d +?d?s?u?d?u?d?s?u +?d?s?u?d?u?d?s?s +?d?s?u?d?u?u?d?d +?d?s?u?d?u?u?d?u +?d?s?u?d?u?u?d?s +?d?s?u?d?u?u?u?d +?d?s?u?d?u?u?u?u +?d?s?u?d?u?u?u?s +?d?s?u?d?u?u?s?d +?d?s?u?d?u?u?s?u +?d?s?u?d?u?u?s?s +?d?s?u?d?u?s?d?d +?d?s?u?d?u?s?d?u +?d?s?u?d?u?s?d?s +?d?s?u?d?u?s?u?d +?d?s?u?d?u?s?u?u +?d?s?u?d?u?s?u?s +?d?s?u?d?u?s?s?d +?d?s?u?d?u?s?s?u +?d?s?u?d?u?s?s?s +?d?s?u?d?s?d?d?d +?d?s?u?d?s?d?d?u +?d?s?u?d?s?d?d?s +?d?s?u?d?s?d?u?d +?d?s?u?d?s?d?u?u +?d?s?u?d?s?d?u?s +?d?s?u?d?s?d?s?d +?d?s?u?d?s?d?s?u +?d?s?u?d?s?d?s?s +?d?s?u?d?s?u?d?d +?d?s?u?d?s?u?d?u +?d?s?u?d?s?u?d?s +?d?s?u?d?s?u?u?d +?d?s?u?d?s?u?u?u +?d?s?u?d?s?u?u?s +?d?s?u?d?s?u?s?d +?d?s?u?d?s?u?s?u +?d?s?u?d?s?u?s?s +?d?s?u?d?s?s?d?d +?d?s?u?d?s?s?d?u +?d?s?u?d?s?s?d?s +?d?s?u?d?s?s?u?d +?d?s?u?d?s?s?u?u +?d?s?u?d?s?s?u?s +?d?s?u?d?s?s?s?d +?d?s?u?d?s?s?s?u +?d?s?u?d?s?s?s?s +?d?s?u?u?d?d?d?d +?d?s?u?u?d?d?d?u +?d?s?u?u?d?d?d?s +?d?s?u?u?d?d?u?d +?d?s?u?u?d?d?u?u +?d?s?u?u?d?d?u?s +?d?s?u?u?d?d?s?d +?d?s?u?u?d?d?s?u +?d?s?u?u?d?d?s?s +?d?s?u?u?d?u?d?d +?d?s?u?u?d?u?d?u +?d?s?u?u?d?u?d?s +?d?s?u?u?d?u?u?d +?d?s?u?u?d?u?u?u +?d?s?u?u?d?u?u?s +?d?s?u?u?d?u?s?d +?d?s?u?u?d?u?s?u +?d?s?u?u?d?u?s?s +?d?s?u?u?d?s?d?d +?d?s?u?u?d?s?d?u +?d?s?u?u?d?s?d?s +?d?s?u?u?d?s?u?d +?d?s?u?u?d?s?u?u +?d?s?u?u?d?s?u?s +?d?s?u?u?d?s?s?d +?d?s?u?u?d?s?s?u +?d?s?u?u?d?s?s?s +?d?s?u?u?u?d?d?d +?d?s?u?u?u?d?d?u +?d?s?u?u?u?d?d?s +?d?s?u?u?u?d?u?d +?d?s?u?u?u?d?u?u +?d?s?u?u?u?d?u?s +?d?s?u?u?u?d?s?d +?d?s?u?u?u?d?s?u +?d?s?u?u?u?d?s?s +?d?s?u?u?u?u?d?d +?d?s?u?u?u?u?d?u +?d?s?u?u?u?u?d?s +?d?s?u?u?u?u?u?d +?d?s?u?u?u?u?u?u +?d?s?u?u?u?u?u?s +?d?s?u?u?u?u?s?d +?d?s?u?u?u?u?s?u +?d?s?u?u?u?u?s?s +?d?s?u?u?u?s?d?d +?d?s?u?u?u?s?d?u +?d?s?u?u?u?s?d?s +?d?s?u?u?u?s?u?d +?d?s?u?u?u?s?u?u +?d?s?u?u?u?s?u?s +?d?s?u?u?u?s?s?d +?d?s?u?u?u?s?s?u +?d?s?u?u?u?s?s?s +?d?s?u?u?s?d?d?d +?d?s?u?u?s?d?d?u +?d?s?u?u?s?d?d?s +?d?s?u?u?s?d?u?d +?d?s?u?u?s?d?u?u +?d?s?u?u?s?d?u?s +?d?s?u?u?s?d?s?d +?d?s?u?u?s?d?s?u +?d?s?u?u?s?d?s?s +?d?s?u?u?s?u?d?d +?d?s?u?u?s?u?d?u +?d?s?u?u?s?u?d?s +?d?s?u?u?s?u?u?d +?d?s?u?u?s?u?u?u +?d?s?u?u?s?u?u?s +?d?s?u?u?s?u?s?d +?d?s?u?u?s?u?s?u +?d?s?u?u?s?u?s?s +?d?s?u?u?s?s?d?d +?d?s?u?u?s?s?d?u +?d?s?u?u?s?s?d?s +?d?s?u?u?s?s?u?d +?d?s?u?u?s?s?u?u +?d?s?u?u?s?s?u?s +?d?s?u?u?s?s?s?d +?d?s?u?u?s?s?s?u +?d?s?u?u?s?s?s?s +?d?s?u?s?d?d?d?d +?d?s?u?s?d?d?d?u +?d?s?u?s?d?d?d?s +?d?s?u?s?d?d?u?d +?d?s?u?s?d?d?u?u +?d?s?u?s?d?d?u?s +?d?s?u?s?d?d?s?d +?d?s?u?s?d?d?s?u +?d?s?u?s?d?d?s?s +?d?s?u?s?d?u?d?d +?d?s?u?s?d?u?d?u +?d?s?u?s?d?u?d?s +?d?s?u?s?d?u?u?d +?d?s?u?s?d?u?u?u +?d?s?u?s?d?u?u?s +?d?s?u?s?d?u?s?d +?d?s?u?s?d?u?s?u +?d?s?u?s?d?u?s?s +?d?s?u?s?d?s?d?d +?d?s?u?s?d?s?d?u +?d?s?u?s?d?s?d?s +?d?s?u?s?d?s?u?d +?d?s?u?s?d?s?u?u +?d?s?u?s?d?s?u?s +?d?s?u?s?d?s?s?d +?d?s?u?s?d?s?s?u +?d?s?u?s?d?s?s?s +?d?s?u?s?u?d?d?d +?d?s?u?s?u?d?d?u +?d?s?u?s?u?d?d?s +?d?s?u?s?u?d?u?d +?d?s?u?s?u?d?u?u +?d?s?u?s?u?d?u?s +?d?s?u?s?u?d?s?d +?d?s?u?s?u?d?s?u +?d?s?u?s?u?d?s?s +?d?s?u?s?u?u?d?d +?d?s?u?s?u?u?d?u +?d?s?u?s?u?u?d?s +?d?s?u?s?u?u?u?d +?d?s?u?s?u?u?u?u +?d?s?u?s?u?u?u?s +?d?s?u?s?u?u?s?d +?d?s?u?s?u?u?s?u +?d?s?u?s?u?u?s?s +?d?s?u?s?u?s?d?d +?d?s?u?s?u?s?d?u +?d?s?u?s?u?s?d?s +?d?s?u?s?u?s?u?d +?d?s?u?s?u?s?u?u +?d?s?u?s?u?s?u?s +?d?s?u?s?u?s?s?d +?d?s?u?s?u?s?s?u +?d?s?u?s?u?s?s?s +?d?s?u?s?s?d?d?d +?d?s?u?s?s?d?d?u +?d?s?u?s?s?d?d?s +?d?s?u?s?s?d?u?d +?d?s?u?s?s?d?u?u +?d?s?u?s?s?d?u?s +?d?s?u?s?s?d?s?d +?d?s?u?s?s?d?s?u +?d?s?u?s?s?d?s?s +?d?s?u?s?s?u?d?d +?d?s?u?s?s?u?d?u +?d?s?u?s?s?u?d?s +?d?s?u?s?s?u?u?d +?d?s?u?s?s?u?u?u +?d?s?u?s?s?u?u?s +?d?s?u?s?s?u?s?d +?d?s?u?s?s?u?s?u +?d?s?u?s?s?u?s?s +?d?s?u?s?s?s?d?d +?d?s?u?s?s?s?d?u +?d?s?u?s?s?s?d?s +?d?s?u?s?s?s?u?d +?d?s?u?s?s?s?u?u +?d?s?u?s?s?s?u?s +?d?s?u?s?s?s?s?d +?d?s?u?s?s?s?s?u +?d?s?u?s?s?s?s?s +?d?s?s?d?d?d?d?d +?d?s?s?d?d?d?d?l +?d?s?s?d?d?d?d?u +?d?s?s?d?d?d?d?s +?d?s?s?d?d?d?l?d +?d?s?s?d?d?d?l?l +?d?s?s?d?d?d?l?s +?d?s?s?d?d?d?u?d +?d?s?s?d?d?d?u?u +?d?s?s?d?d?d?u?s +?d?s?s?d?d?d?s?d +?d?s?s?d?d?d?s?l +?d?s?s?d?d?d?s?u +?d?s?s?d?d?d?s?s +?d?s?s?d?d?l?d?d +?d?s?s?d?d?l?d?l +?d?s?s?d?d?l?d?s +?d?s?s?d?d?l?l?d +?d?s?s?d?d?l?l?l +?d?s?s?d?d?l?l?s +?d?s?s?d?d?l?s?d +?d?s?s?d?d?l?s?l +?d?s?s?d?d?l?s?s +?d?s?s?d?d?u?d?d +?d?s?s?d?d?u?d?u +?d?s?s?d?d?u?d?s +?d?s?s?d?d?u?u?d +?d?s?s?d?d?u?u?u +?d?s?s?d?d?u?u?s +?d?s?s?d?d?u?s?d +?d?s?s?d?d?u?s?u +?d?s?s?d?d?u?s?s +?d?s?s?d?d?s?d?d +?d?s?s?d?d?s?d?l +?d?s?s?d?d?s?d?u +?d?s?s?d?d?s?d?s +?d?s?s?d?d?s?l?d +?d?s?s?d?d?s?l?l +?d?s?s?d?d?s?l?s +?d?s?s?d?d?s?u?d +?d?s?s?d?d?s?u?u +?d?s?s?d?d?s?u?s +?d?s?s?d?d?s?s?d +?d?s?s?d?d?s?s?l +?d?s?s?d?d?s?s?u +?d?s?s?d?d?s?s?s +?d?s?s?d?l?d?d?d +?d?s?s?d?l?d?d?l +?d?s?s?d?l?d?d?s +?d?s?s?d?l?d?l?d +?d?s?s?d?l?d?l?l +?d?s?s?d?l?d?l?s +?d?s?s?d?l?d?s?d +?d?s?s?d?l?d?s?l +?d?s?s?d?l?d?s?s +?d?s?s?d?l?l?d?d +?d?s?s?d?l?l?d?l +?d?s?s?d?l?l?d?s +?d?s?s?d?l?l?l?d +?d?s?s?d?l?l?l?l +?d?s?s?d?l?l?l?s +?d?s?s?d?l?l?s?d +?d?s?s?d?l?l?s?l +?d?s?s?d?l?l?s?s +?d?s?s?d?l?s?d?d +?d?s?s?d?l?s?d?l +?d?s?s?d?l?s?d?s +?d?s?s?d?l?s?l?d +?d?s?s?d?l?s?l?l +?d?s?s?d?l?s?l?s +?d?s?s?d?l?s?s?d +?d?s?s?d?l?s?s?l +?d?s?s?d?l?s?s?s +?d?s?s?d?u?d?d?d +?d?s?s?d?u?d?d?u +?d?s?s?d?u?d?d?s +?d?s?s?d?u?d?u?d +?d?s?s?d?u?d?u?u +?d?s?s?d?u?d?u?s +?d?s?s?d?u?d?s?d +?d?s?s?d?u?d?s?u +?d?s?s?d?u?d?s?s +?d?s?s?d?u?u?d?d +?d?s?s?d?u?u?d?u +?d?s?s?d?u?u?d?s +?d?s?s?d?u?u?u?d +?d?s?s?d?u?u?u?u +?d?s?s?d?u?u?u?s +?d?s?s?d?u?u?s?d +?d?s?s?d?u?u?s?u +?d?s?s?d?u?u?s?s +?d?s?s?d?u?s?d?d +?d?s?s?d?u?s?d?u +?d?s?s?d?u?s?d?s +?d?s?s?d?u?s?u?d +?d?s?s?d?u?s?u?u +?d?s?s?d?u?s?u?s +?d?s?s?d?u?s?s?d +?d?s?s?d?u?s?s?u +?d?s?s?d?u?s?s?s +?d?s?s?d?s?d?d?d +?d?s?s?d?s?d?d?l +?d?s?s?d?s?d?d?u +?d?s?s?d?s?d?d?s +?d?s?s?d?s?d?l?d +?d?s?s?d?s?d?l?l +?d?s?s?d?s?d?l?s +?d?s?s?d?s?d?u?d +?d?s?s?d?s?d?u?u +?d?s?s?d?s?d?u?s +?d?s?s?d?s?d?s?d +?d?s?s?d?s?d?s?l +?d?s?s?d?s?d?s?u +?d?s?s?d?s?d?s?s +?d?s?s?d?s?l?d?d +?d?s?s?d?s?l?d?l +?d?s?s?d?s?l?d?s +?d?s?s?d?s?l?l?d +?d?s?s?d?s?l?l?l +?d?s?s?d?s?l?l?s +?d?s?s?d?s?l?s?d +?d?s?s?d?s?l?s?l +?d?s?s?d?s?l?s?s +?d?s?s?d?s?u?d?d +?d?s?s?d?s?u?d?u +?d?s?s?d?s?u?d?s +?d?s?s?d?s?u?u?d +?d?s?s?d?s?u?u?u +?d?s?s?d?s?u?u?s +?d?s?s?d?s?u?s?d +?d?s?s?d?s?u?s?u +?d?s?s?d?s?u?s?s +?d?s?s?d?s?s?d?d +?d?s?s?d?s?s?d?l +?d?s?s?d?s?s?d?u +?d?s?s?d?s?s?d?s +?d?s?s?d?s?s?l?d +?d?s?s?d?s?s?l?l +?d?s?s?d?s?s?l?s +?d?s?s?d?s?s?u?d +?d?s?s?d?s?s?u?u +?d?s?s?d?s?s?u?s +?d?s?s?d?s?s?s?d +?d?s?s?d?s?s?s?l +?d?s?s?d?s?s?s?u +?d?s?s?d?s?s?s?s +?d?s?s?l?d?d?d?d +?d?s?s?l?d?d?d?l +?d?s?s?l?d?d?d?s +?d?s?s?l?d?d?l?d +?d?s?s?l?d?d?l?l +?d?s?s?l?d?d?l?s +?d?s?s?l?d?d?s?d +?d?s?s?l?d?d?s?l +?d?s?s?l?d?d?s?s +?d?s?s?l?d?l?d?d +?d?s?s?l?d?l?d?l +?d?s?s?l?d?l?d?s +?d?s?s?l?d?l?l?d +?d?s?s?l?d?l?l?l +?d?s?s?l?d?l?l?s +?d?s?s?l?d?l?s?d +?d?s?s?l?d?l?s?l +?d?s?s?l?d?l?s?s +?d?s?s?l?d?s?d?d +?d?s?s?l?d?s?d?l +?d?s?s?l?d?s?d?s +?d?s?s?l?d?s?l?d +?d?s?s?l?d?s?l?l +?d?s?s?l?d?s?l?s +?d?s?s?l?d?s?s?d +?d?s?s?l?d?s?s?l +?d?s?s?l?d?s?s?s +?d?s?s?l?l?d?d?d +?d?s?s?l?l?d?d?l +?d?s?s?l?l?d?d?s +?d?s?s?l?l?d?l?d +?d?s?s?l?l?d?l?l +?d?s?s?l?l?d?l?s +?d?s?s?l?l?d?s?d +?d?s?s?l?l?d?s?l +?d?s?s?l?l?d?s?s +?d?s?s?l?l?l?d?d +?d?s?s?l?l?l?d?l +?d?s?s?l?l?l?d?s +?d?s?s?l?l?l?l?d +?d?s?s?l?l?l?l?l +?d?s?s?l?l?l?l?s +?d?s?s?l?l?l?s?d +?d?s?s?l?l?l?s?l +?d?s?s?l?l?l?s?s +?d?s?s?l?l?s?d?d +?d?s?s?l?l?s?d?l +?d?s?s?l?l?s?d?s +?d?s?s?l?l?s?l?d +?d?s?s?l?l?s?l?l +?d?s?s?l?l?s?l?s +?d?s?s?l?l?s?s?d +?d?s?s?l?l?s?s?l +?d?s?s?l?l?s?s?s +?d?s?s?l?s?d?d?d +?d?s?s?l?s?d?d?l +?d?s?s?l?s?d?d?s +?d?s?s?l?s?d?l?d +?d?s?s?l?s?d?l?l +?d?s?s?l?s?d?l?s +?d?s?s?l?s?d?s?d +?d?s?s?l?s?d?s?l +?d?s?s?l?s?d?s?s +?d?s?s?l?s?l?d?d +?d?s?s?l?s?l?d?l +?d?s?s?l?s?l?d?s +?d?s?s?l?s?l?l?d +?d?s?s?l?s?l?l?l +?d?s?s?l?s?l?l?s +?d?s?s?l?s?l?s?d +?d?s?s?l?s?l?s?l +?d?s?s?l?s?l?s?s +?d?s?s?l?s?s?d?d +?d?s?s?l?s?s?d?l +?d?s?s?l?s?s?d?s +?d?s?s?l?s?s?l?d +?d?s?s?l?s?s?l?l +?d?s?s?l?s?s?l?s +?d?s?s?l?s?s?s?d +?d?s?s?l?s?s?s?l +?d?s?s?l?s?s?s?s +?d?s?s?u?d?d?d?d +?d?s?s?u?d?d?d?u +?d?s?s?u?d?d?d?s +?d?s?s?u?d?d?u?d +?d?s?s?u?d?d?u?u +?d?s?s?u?d?d?u?s +?d?s?s?u?d?d?s?d +?d?s?s?u?d?d?s?u +?d?s?s?u?d?d?s?s +?d?s?s?u?d?u?d?d +?d?s?s?u?d?u?d?u +?d?s?s?u?d?u?d?s +?d?s?s?u?d?u?u?d +?d?s?s?u?d?u?u?u +?d?s?s?u?d?u?u?s +?d?s?s?u?d?u?s?d +?d?s?s?u?d?u?s?u +?d?s?s?u?d?u?s?s +?d?s?s?u?d?s?d?d +?d?s?s?u?d?s?d?u +?d?s?s?u?d?s?d?s +?d?s?s?u?d?s?u?d +?d?s?s?u?d?s?u?u +?d?s?s?u?d?s?u?s +?d?s?s?u?d?s?s?d +?d?s?s?u?d?s?s?u +?d?s?s?u?d?s?s?s +?d?s?s?u?u?d?d?d +?d?s?s?u?u?d?d?u +?d?s?s?u?u?d?d?s +?d?s?s?u?u?d?u?d +?d?s?s?u?u?d?u?u +?d?s?s?u?u?d?u?s +?d?s?s?u?u?d?s?d +?d?s?s?u?u?d?s?u +?d?s?s?u?u?d?s?s +?d?s?s?u?u?u?d?d +?d?s?s?u?u?u?d?u +?d?s?s?u?u?u?d?s +?d?s?s?u?u?u?u?d +?d?s?s?u?u?u?u?u +?d?s?s?u?u?u?u?s +?d?s?s?u?u?u?s?d +?d?s?s?u?u?u?s?u +?d?s?s?u?u?u?s?s +?d?s?s?u?u?s?d?d +?d?s?s?u?u?s?d?u +?d?s?s?u?u?s?d?s +?d?s?s?u?u?s?u?d +?d?s?s?u?u?s?u?u +?d?s?s?u?u?s?u?s +?d?s?s?u?u?s?s?d +?d?s?s?u?u?s?s?u +?d?s?s?u?u?s?s?s +?d?s?s?u?s?d?d?d +?d?s?s?u?s?d?d?u +?d?s?s?u?s?d?d?s +?d?s?s?u?s?d?u?d +?d?s?s?u?s?d?u?u +?d?s?s?u?s?d?u?s +?d?s?s?u?s?d?s?d +?d?s?s?u?s?d?s?u +?d?s?s?u?s?d?s?s +?d?s?s?u?s?u?d?d +?d?s?s?u?s?u?d?u +?d?s?s?u?s?u?d?s +?d?s?s?u?s?u?u?d +?d?s?s?u?s?u?u?u +?d?s?s?u?s?u?u?s +?d?s?s?u?s?u?s?d +?d?s?s?u?s?u?s?u +?d?s?s?u?s?u?s?s +?d?s?s?u?s?s?d?d +?d?s?s?u?s?s?d?u +?d?s?s?u?s?s?d?s +?d?s?s?u?s?s?u?d +?d?s?s?u?s?s?u?u +?d?s?s?u?s?s?u?s +?d?s?s?u?s?s?s?d +?d?s?s?u?s?s?s?u +?d?s?s?u?s?s?s?s +?d?s?s?s?d?d?d?d +?d?s?s?s?d?d?d?l +?d?s?s?s?d?d?d?u +?d?s?s?s?d?d?d?s +?d?s?s?s?d?d?l?d +?d?s?s?s?d?d?l?l +?d?s?s?s?d?d?l?s +?d?s?s?s?d?d?u?d +?d?s?s?s?d?d?u?u +?d?s?s?s?d?d?u?s +?d?s?s?s?d?d?s?d +?d?s?s?s?d?d?s?l +?d?s?s?s?d?d?s?u +?d?s?s?s?d?d?s?s +?d?s?s?s?d?l?d?d +?d?s?s?s?d?l?d?l +?d?s?s?s?d?l?d?s +?d?s?s?s?d?l?l?d +?d?s?s?s?d?l?l?l +?d?s?s?s?d?l?l?s +?d?s?s?s?d?l?s?d +?d?s?s?s?d?l?s?l +?d?s?s?s?d?l?s?s +?d?s?s?s?d?u?d?d +?d?s?s?s?d?u?d?u +?d?s?s?s?d?u?d?s +?d?s?s?s?d?u?u?d +?d?s?s?s?d?u?u?u +?d?s?s?s?d?u?u?s +?d?s?s?s?d?u?s?d +?d?s?s?s?d?u?s?u +?d?s?s?s?d?u?s?s +?d?s?s?s?d?s?d?d +?d?s?s?s?d?s?d?l +?d?s?s?s?d?s?d?u +?d?s?s?s?d?s?d?s +?d?s?s?s?d?s?l?d +?d?s?s?s?d?s?l?l +?d?s?s?s?d?s?l?s +?d?s?s?s?d?s?u?d +?d?s?s?s?d?s?u?u +?d?s?s?s?d?s?u?s +?d?s?s?s?d?s?s?d +?d?s?s?s?d?s?s?l +?d?s?s?s?d?s?s?u +?d?s?s?s?d?s?s?s +?d?s?s?s?l?d?d?d +?d?s?s?s?l?d?d?l +?d?s?s?s?l?d?d?s +?d?s?s?s?l?d?l?d +?d?s?s?s?l?d?l?l +?d?s?s?s?l?d?l?s +?d?s?s?s?l?d?s?d +?d?s?s?s?l?d?s?l +?d?s?s?s?l?d?s?s +?d?s?s?s?l?l?d?d +?d?s?s?s?l?l?d?l +?d?s?s?s?l?l?d?s +?d?s?s?s?l?l?l?d +?d?s?s?s?l?l?l?l +?d?s?s?s?l?l?l?s +?d?s?s?s?l?l?s?d +?d?s?s?s?l?l?s?l +?d?s?s?s?l?l?s?s +?d?s?s?s?l?s?d?d +?d?s?s?s?l?s?d?l +?d?s?s?s?l?s?d?s +?d?s?s?s?l?s?l?d +?d?s?s?s?l?s?l?l +?d?s?s?s?l?s?l?s +?d?s?s?s?l?s?s?d +?d?s?s?s?l?s?s?l +?d?s?s?s?l?s?s?s +?d?s?s?s?u?d?d?d +?d?s?s?s?u?d?d?u +?d?s?s?s?u?d?d?s +?d?s?s?s?u?d?u?d +?d?s?s?s?u?d?u?u +?d?s?s?s?u?d?u?s +?d?s?s?s?u?d?s?d +?d?s?s?s?u?d?s?u +?d?s?s?s?u?d?s?s +?d?s?s?s?u?u?d?d +?d?s?s?s?u?u?d?u +?d?s?s?s?u?u?d?s +?d?s?s?s?u?u?u?d +?d?s?s?s?u?u?u?u +?d?s?s?s?u?u?u?s +?d?s?s?s?u?u?s?d +?d?s?s?s?u?u?s?u +?d?s?s?s?u?u?s?s +?d?s?s?s?u?s?d?d +?d?s?s?s?u?s?d?u +?d?s?s?s?u?s?d?s +?d?s?s?s?u?s?u?d +?d?s?s?s?u?s?u?u +?d?s?s?s?u?s?u?s +?d?s?s?s?u?s?s?d +?d?s?s?s?u?s?s?u +?d?s?s?s?u?s?s?s +?d?s?s?s?s?d?d?d +?d?s?s?s?s?d?d?l +?d?s?s?s?s?d?d?u +?d?s?s?s?s?d?d?s +?d?s?s?s?s?d?l?d +?d?s?s?s?s?d?l?l +?d?s?s?s?s?d?l?s +?d?s?s?s?s?d?u?d +?d?s?s?s?s?d?u?u +?d?s?s?s?s?d?u?s +?d?s?s?s?s?d?s?d +?d?s?s?s?s?d?s?l +?d?s?s?s?s?d?s?u +?d?s?s?s?s?d?s?s +?d?s?s?s?s?l?d?d +?d?s?s?s?s?l?d?l +?d?s?s?s?s?l?d?s +?d?s?s?s?s?l?l?d +?d?s?s?s?s?l?l?l +?d?s?s?s?s?l?l?s +?d?s?s?s?s?l?s?d +?d?s?s?s?s?l?s?l +?d?s?s?s?s?l?s?s +?d?s?s?s?s?u?d?d +?d?s?s?s?s?u?d?u +?d?s?s?s?s?u?d?s +?d?s?s?s?s?u?u?d +?d?s?s?s?s?u?u?u +?d?s?s?s?s?u?u?s +?d?s?s?s?s?u?s?d +?d?s?s?s?s?u?s?u +?d?s?s?s?s?u?s?s +?d?s?s?s?s?s?d?d +?d?s?s?s?s?s?d?l +?d?s?s?s?s?s?d?u +?d?s?s?s?s?s?d?s +?d?s?s?s?s?s?l?d +?d?s?s?s?s?s?l?l +?d?s?s?s?s?s?l?s +?d?s?s?s?s?s?u?d +?d?s?s?s?s?s?u?u +?d?s?s?s?s?s?u?s +?d?s?s?s?s?s?s?d +?d?s?s?s?s?s?s?l +?d?s?s?s?s?s?s?u +?d?s?s?s?s?s?s?s +?l?d?d?d?d?d?d?d +?l?d?d?d?d?d?d?l +?l?d?d?d?d?d?d?u +?l?d?d?d?d?d?d?s +?l?d?d?d?d?d?l?d +?l?d?d?d?d?d?l?l +?l?d?d?d?d?d?l?u +?l?d?d?d?d?d?l?s +?l?d?d?d?d?d?u?d +?l?d?d?d?d?d?u?l +?l?d?d?d?d?d?u?u +?l?d?d?d?d?d?s?d +?l?d?d?d?d?d?s?l +?l?d?d?d?d?d?s?s +?l?d?d?d?d?l?d?d +?l?d?d?d?d?l?d?l +?l?d?d?d?d?l?d?u +?l?d?d?d?d?l?d?s +?l?d?d?d?d?l?l?d +?l?d?d?d?d?l?l?l +?l?d?d?d?d?l?l?u +?l?d?d?d?d?l?l?s +?l?d?d?d?d?l?u?d +?l?d?d?d?d?l?u?l +?l?d?d?d?d?l?u?u +?l?d?d?d?d?l?s?d +?l?d?d?d?d?l?s?l +?l?d?d?d?d?l?s?s +?l?d?d?d?d?u?d?d +?l?d?d?d?d?u?d?l +?l?d?d?d?d?u?d?u +?l?d?d?d?d?u?l?d +?l?d?d?d?d?u?l?l +?l?d?d?d?d?u?l?u +?l?d?d?d?d?u?u?d +?l?d?d?d?d?u?u?l +?l?d?d?d?d?u?u?u +?l?d?d?d?d?s?d?d +?l?d?d?d?d?s?d?l +?l?d?d?d?d?s?d?s +?l?d?d?d?d?s?l?d +?l?d?d?d?d?s?l?l +?l?d?d?d?d?s?l?s +?l?d?d?d?d?s?s?d +?l?d?d?d?d?s?s?l +?l?d?d?d?d?s?s?s +?l?d?d?d?l?d?d?d +?l?d?d?d?l?d?d?l +?l?d?d?d?l?d?d?u +?l?d?d?d?l?d?d?s +?l?d?d?d?l?d?l?d +?l?d?d?d?l?d?l?l +?l?d?d?d?l?d?l?u +?l?d?d?d?l?d?l?s +?l?d?d?d?l?d?u?d +?l?d?d?d?l?d?u?l +?l?d?d?d?l?d?u?u +?l?d?d?d?l?d?s?d +?l?d?d?d?l?d?s?l +?l?d?d?d?l?d?s?s +?l?d?d?d?l?l?d?d +?l?d?d?d?l?l?d?l +?l?d?d?d?l?l?d?u +?l?d?d?d?l?l?d?s +?l?d?d?d?l?l?l?d +?l?d?d?d?l?l?l?l +?l?d?d?d?l?l?l?u +?l?d?d?d?l?l?l?s +?l?d?d?d?l?l?u?d +?l?d?d?d?l?l?u?l +?l?d?d?d?l?l?u?u +?l?d?d?d?l?l?s?d +?l?d?d?d?l?l?s?l +?l?d?d?d?l?l?s?s +?l?d?d?d?l?u?d?d +?l?d?d?d?l?u?d?l +?l?d?d?d?l?u?d?u +?l?d?d?d?l?u?l?d +?l?d?d?d?l?u?l?l +?l?d?d?d?l?u?l?u +?l?d?d?d?l?u?u?d +?l?d?d?d?l?u?u?l +?l?d?d?d?l?u?u?u +?l?d?d?d?l?s?d?d +?l?d?d?d?l?s?d?l +?l?d?d?d?l?s?d?s +?l?d?d?d?l?s?l?d +?l?d?d?d?l?s?l?l +?l?d?d?d?l?s?l?s +?l?d?d?d?l?s?s?d +?l?d?d?d?l?s?s?l +?l?d?d?d?l?s?s?s +?l?d?d?d?u?d?d?d +?l?d?d?d?u?d?d?l +?l?d?d?d?u?d?d?u +?l?d?d?d?u?d?l?d +?l?d?d?d?u?d?l?l +?l?d?d?d?u?d?l?u +?l?d?d?d?u?d?u?d +?l?d?d?d?u?d?u?l +?l?d?d?d?u?d?u?u +?l?d?d?d?u?l?d?d +?l?d?d?d?u?l?d?l +?l?d?d?d?u?l?d?u +?l?d?d?d?u?l?l?d +?l?d?d?d?u?l?l?l +?l?d?d?d?u?l?l?u +?l?d?d?d?u?l?u?d +?l?d?d?d?u?l?u?l +?l?d?d?d?u?l?u?u +?l?d?d?d?u?u?d?d +?l?d?d?d?u?u?d?l +?l?d?d?d?u?u?d?u +?l?d?d?d?u?u?l?d +?l?d?d?d?u?u?l?l +?l?d?d?d?u?u?l?u +?l?d?d?d?u?u?u?d +?l?d?d?d?u?u?u?l +?l?d?d?d?u?u?u?u +?l?d?d?d?s?d?d?d +?l?d?d?d?s?d?d?l +?l?d?d?d?s?d?d?s +?l?d?d?d?s?d?l?d +?l?d?d?d?s?d?l?l +?l?d?d?d?s?d?l?s +?l?d?d?d?s?d?s?d +?l?d?d?d?s?d?s?l +?l?d?d?d?s?d?s?s +?l?d?d?d?s?l?d?d +?l?d?d?d?s?l?d?l +?l?d?d?d?s?l?d?s +?l?d?d?d?s?l?l?d +?l?d?d?d?s?l?l?l +?l?d?d?d?s?l?l?s +?l?d?d?d?s?l?s?d +?l?d?d?d?s?l?s?l +?l?d?d?d?s?l?s?s +?l?d?d?d?s?s?d?d +?l?d?d?d?s?s?d?l +?l?d?d?d?s?s?d?s +?l?d?d?d?s?s?l?d +?l?d?d?d?s?s?l?l +?l?d?d?d?s?s?l?s +?l?d?d?d?s?s?s?d +?l?d?d?d?s?s?s?l +?l?d?d?d?s?s?s?s +?l?d?d?l?d?d?d?d +?l?d?d?l?d?d?d?l +?l?d?d?l?d?d?d?u +?l?d?d?l?d?d?d?s +?l?d?d?l?d?d?l?d +?l?d?d?l?d?d?l?l +?l?d?d?l?d?d?l?u +?l?d?d?l?d?d?l?s +?l?d?d?l?d?d?u?d +?l?d?d?l?d?d?u?l +?l?d?d?l?d?d?u?u +?l?d?d?l?d?d?s?d +?l?d?d?l?d?d?s?l +?l?d?d?l?d?d?s?s +?l?d?d?l?d?l?d?d +?l?d?d?l?d?l?d?l +?l?d?d?l?d?l?d?u +?l?d?d?l?d?l?d?s +?l?d?d?l?d?l?l?d +?l?d?d?l?d?l?l?l +?l?d?d?l?d?l?l?u +?l?d?d?l?d?l?l?s +?l?d?d?l?d?l?u?d +?l?d?d?l?d?l?u?l +?l?d?d?l?d?l?u?u +?l?d?d?l?d?l?s?d +?l?d?d?l?d?l?s?l +?l?d?d?l?d?l?s?s +?l?d?d?l?d?u?d?d +?l?d?d?l?d?u?d?l +?l?d?d?l?d?u?d?u +?l?d?d?l?d?u?l?d +?l?d?d?l?d?u?l?l +?l?d?d?l?d?u?l?u +?l?d?d?l?d?u?u?d +?l?d?d?l?d?u?u?l +?l?d?d?l?d?u?u?u +?l?d?d?l?d?s?d?d +?l?d?d?l?d?s?d?l +?l?d?d?l?d?s?d?s +?l?d?d?l?d?s?l?d +?l?d?d?l?d?s?l?l +?l?d?d?l?d?s?l?s +?l?d?d?l?d?s?s?d +?l?d?d?l?d?s?s?l +?l?d?d?l?d?s?s?s +?l?d?d?l?l?d?d?d +?l?d?d?l?l?d?d?l +?l?d?d?l?l?d?d?u +?l?d?d?l?l?d?d?s +?l?d?d?l?l?d?l?d +?l?d?d?l?l?d?l?l +?l?d?d?l?l?d?l?u +?l?d?d?l?l?d?l?s +?l?d?d?l?l?d?u?d +?l?d?d?l?l?d?u?l +?l?d?d?l?l?d?u?u +?l?d?d?l?l?d?s?d +?l?d?d?l?l?d?s?l +?l?d?d?l?l?d?s?s +?l?d?d?l?l?l?d?d +?l?d?d?l?l?l?d?l +?l?d?d?l?l?l?d?u +?l?d?d?l?l?l?d?s +?l?d?d?l?l?l?l?d +?l?d?d?l?l?l?l?l +?l?d?d?l?l?l?l?u +?l?d?d?l?l?l?l?s +?l?d?d?l?l?l?u?d +?l?d?d?l?l?l?u?l +?l?d?d?l?l?l?u?u +?l?d?d?l?l?l?s?d +?l?d?d?l?l?l?s?l +?l?d?d?l?l?l?s?s +?l?d?d?l?l?u?d?d +?l?d?d?l?l?u?d?l +?l?d?d?l?l?u?d?u +?l?d?d?l?l?u?l?d +?l?d?d?l?l?u?l?l +?l?d?d?l?l?u?l?u +?l?d?d?l?l?u?u?d +?l?d?d?l?l?u?u?l +?l?d?d?l?l?u?u?u +?l?d?d?l?l?s?d?d +?l?d?d?l?l?s?d?l +?l?d?d?l?l?s?d?s +?l?d?d?l?l?s?l?d +?l?d?d?l?l?s?l?l +?l?d?d?l?l?s?l?s +?l?d?d?l?l?s?s?d +?l?d?d?l?l?s?s?l +?l?d?d?l?l?s?s?s +?l?d?d?l?u?d?d?d +?l?d?d?l?u?d?d?l +?l?d?d?l?u?d?d?u +?l?d?d?l?u?d?l?d +?l?d?d?l?u?d?l?l +?l?d?d?l?u?d?l?u +?l?d?d?l?u?d?u?d +?l?d?d?l?u?d?u?l +?l?d?d?l?u?d?u?u +?l?d?d?l?u?l?d?d +?l?d?d?l?u?l?d?l +?l?d?d?l?u?l?d?u +?l?d?d?l?u?l?l?d +?l?d?d?l?u?l?l?l +?l?d?d?l?u?l?l?u +?l?d?d?l?u?l?u?d +?l?d?d?l?u?l?u?l +?l?d?d?l?u?l?u?u +?l?d?d?l?u?u?d?d +?l?d?d?l?u?u?d?l +?l?d?d?l?u?u?d?u +?l?d?d?l?u?u?l?d +?l?d?d?l?u?u?l?l +?l?d?d?l?u?u?l?u +?l?d?d?l?u?u?u?d +?l?d?d?l?u?u?u?l +?l?d?d?l?u?u?u?u +?l?d?d?l?s?d?d?d +?l?d?d?l?s?d?d?l +?l?d?d?l?s?d?d?s +?l?d?d?l?s?d?l?d +?l?d?d?l?s?d?l?l +?l?d?d?l?s?d?l?s +?l?d?d?l?s?d?s?d +?l?d?d?l?s?d?s?l +?l?d?d?l?s?d?s?s +?l?d?d?l?s?l?d?d +?l?d?d?l?s?l?d?l +?l?d?d?l?s?l?d?s +?l?d?d?l?s?l?l?d +?l?d?d?l?s?l?l?l +?l?d?d?l?s?l?l?s +?l?d?d?l?s?l?s?d +?l?d?d?l?s?l?s?l +?l?d?d?l?s?l?s?s +?l?d?d?l?s?s?d?d +?l?d?d?l?s?s?d?l +?l?d?d?l?s?s?d?s +?l?d?d?l?s?s?l?d +?l?d?d?l?s?s?l?l +?l?d?d?l?s?s?l?s +?l?d?d?l?s?s?s?d +?l?d?d?l?s?s?s?l +?l?d?d?l?s?s?s?s +?l?d?d?u?d?d?d?d +?l?d?d?u?d?d?d?l +?l?d?d?u?d?d?d?u +?l?d?d?u?d?d?l?d +?l?d?d?u?d?d?l?l +?l?d?d?u?d?d?l?u +?l?d?d?u?d?d?u?d +?l?d?d?u?d?d?u?l +?l?d?d?u?d?d?u?u +?l?d?d?u?d?l?d?d +?l?d?d?u?d?l?d?l +?l?d?d?u?d?l?d?u +?l?d?d?u?d?l?l?d +?l?d?d?u?d?l?l?l +?l?d?d?u?d?l?l?u +?l?d?d?u?d?l?u?d +?l?d?d?u?d?l?u?l +?l?d?d?u?d?l?u?u +?l?d?d?u?d?u?d?d +?l?d?d?u?d?u?d?l +?l?d?d?u?d?u?d?u +?l?d?d?u?d?u?l?d +?l?d?d?u?d?u?l?l +?l?d?d?u?d?u?l?u +?l?d?d?u?d?u?u?d +?l?d?d?u?d?u?u?l +?l?d?d?u?d?u?u?u +?l?d?d?u?l?d?d?d +?l?d?d?u?l?d?d?l +?l?d?d?u?l?d?d?u +?l?d?d?u?l?d?l?d +?l?d?d?u?l?d?l?l +?l?d?d?u?l?d?l?u +?l?d?d?u?l?d?u?d +?l?d?d?u?l?d?u?l +?l?d?d?u?l?d?u?u +?l?d?d?u?l?l?d?d +?l?d?d?u?l?l?d?l +?l?d?d?u?l?l?d?u +?l?d?d?u?l?l?l?d +?l?d?d?u?l?l?l?l +?l?d?d?u?l?l?l?u +?l?d?d?u?l?l?u?d +?l?d?d?u?l?l?u?l +?l?d?d?u?l?l?u?u +?l?d?d?u?l?u?d?d +?l?d?d?u?l?u?d?l +?l?d?d?u?l?u?d?u +?l?d?d?u?l?u?l?d +?l?d?d?u?l?u?l?l +?l?d?d?u?l?u?l?u +?l?d?d?u?l?u?u?d +?l?d?d?u?l?u?u?l +?l?d?d?u?l?u?u?u +?l?d?d?u?u?d?d?d +?l?d?d?u?u?d?d?l +?l?d?d?u?u?d?d?u +?l?d?d?u?u?d?l?d +?l?d?d?u?u?d?l?l +?l?d?d?u?u?d?l?u +?l?d?d?u?u?d?u?d +?l?d?d?u?u?d?u?l +?l?d?d?u?u?d?u?u +?l?d?d?u?u?l?d?d +?l?d?d?u?u?l?d?l +?l?d?d?u?u?l?d?u +?l?d?d?u?u?l?l?d +?l?d?d?u?u?l?l?l +?l?d?d?u?u?l?l?u +?l?d?d?u?u?l?u?d +?l?d?d?u?u?l?u?l +?l?d?d?u?u?l?u?u +?l?d?d?u?u?u?d?d +?l?d?d?u?u?u?d?l +?l?d?d?u?u?u?d?u +?l?d?d?u?u?u?l?d +?l?d?d?u?u?u?l?l +?l?d?d?u?u?u?l?u +?l?d?d?u?u?u?u?d +?l?d?d?u?u?u?u?l +?l?d?d?u?u?u?u?u +?l?d?d?s?d?d?d?d +?l?d?d?s?d?d?d?l +?l?d?d?s?d?d?d?s +?l?d?d?s?d?d?l?d +?l?d?d?s?d?d?l?l +?l?d?d?s?d?d?l?s +?l?d?d?s?d?d?s?d +?l?d?d?s?d?d?s?l +?l?d?d?s?d?d?s?s +?l?d?d?s?d?l?d?d +?l?d?d?s?d?l?d?l +?l?d?d?s?d?l?d?s +?l?d?d?s?d?l?l?d +?l?d?d?s?d?l?l?l +?l?d?d?s?d?l?l?s +?l?d?d?s?d?l?s?d +?l?d?d?s?d?l?s?l +?l?d?d?s?d?l?s?s +?l?d?d?s?d?s?d?d +?l?d?d?s?d?s?d?l +?l?d?d?s?d?s?d?s +?l?d?d?s?d?s?l?d +?l?d?d?s?d?s?l?l +?l?d?d?s?d?s?l?s +?l?d?d?s?d?s?s?d +?l?d?d?s?d?s?s?l +?l?d?d?s?d?s?s?s +?l?d?d?s?l?d?d?d +?l?d?d?s?l?d?d?l +?l?d?d?s?l?d?d?s +?l?d?d?s?l?d?l?d +?l?d?d?s?l?d?l?l +?l?d?d?s?l?d?l?s +?l?d?d?s?l?d?s?d +?l?d?d?s?l?d?s?l +?l?d?d?s?l?d?s?s +?l?d?d?s?l?l?d?d +?l?d?d?s?l?l?d?l +?l?d?d?s?l?l?d?s +?l?d?d?s?l?l?l?d +?l?d?d?s?l?l?l?l +?l?d?d?s?l?l?l?s +?l?d?d?s?l?l?s?d +?l?d?d?s?l?l?s?l +?l?d?d?s?l?l?s?s +?l?d?d?s?l?s?d?d +?l?d?d?s?l?s?d?l +?l?d?d?s?l?s?d?s +?l?d?d?s?l?s?l?d +?l?d?d?s?l?s?l?l +?l?d?d?s?l?s?l?s +?l?d?d?s?l?s?s?d +?l?d?d?s?l?s?s?l +?l?d?d?s?l?s?s?s +?l?d?d?s?s?d?d?d +?l?d?d?s?s?d?d?l +?l?d?d?s?s?d?d?s +?l?d?d?s?s?d?l?d +?l?d?d?s?s?d?l?l +?l?d?d?s?s?d?l?s +?l?d?d?s?s?d?s?d +?l?d?d?s?s?d?s?l +?l?d?d?s?s?d?s?s +?l?d?d?s?s?l?d?d +?l?d?d?s?s?l?d?l +?l?d?d?s?s?l?d?s +?l?d?d?s?s?l?l?d +?l?d?d?s?s?l?l?l +?l?d?d?s?s?l?l?s +?l?d?d?s?s?l?s?d +?l?d?d?s?s?l?s?l +?l?d?d?s?s?l?s?s +?l?d?d?s?s?s?d?d +?l?d?d?s?s?s?d?l +?l?d?d?s?s?s?d?s +?l?d?d?s?s?s?l?d +?l?d?d?s?s?s?l?l +?l?d?d?s?s?s?l?s +?l?d?d?s?s?s?s?d +?l?d?d?s?s?s?s?l +?l?d?d?s?s?s?s?s +?l?d?l?d?d?d?d?d +?l?d?l?d?d?d?d?l +?l?d?l?d?d?d?d?u +?l?d?l?d?d?d?d?s +?l?d?l?d?d?d?l?d +?l?d?l?d?d?d?l?l +?l?d?l?d?d?d?l?u +?l?d?l?d?d?d?l?s +?l?d?l?d?d?d?u?d +?l?d?l?d?d?d?u?l +?l?d?l?d?d?d?u?u +?l?d?l?d?d?d?s?d +?l?d?l?d?d?d?s?l +?l?d?l?d?d?d?s?s +?l?d?l?d?d?l?d?d +?l?d?l?d?d?l?d?l +?l?d?l?d?d?l?d?u +?l?d?l?d?d?l?d?s +?l?d?l?d?d?l?l?d +?l?d?l?d?d?l?l?l +?l?d?l?d?d?l?l?u +?l?d?l?d?d?l?l?s +?l?d?l?d?d?l?u?d +?l?d?l?d?d?l?u?l +?l?d?l?d?d?l?u?u +?l?d?l?d?d?l?s?d +?l?d?l?d?d?l?s?l +?l?d?l?d?d?l?s?s +?l?d?l?d?d?u?d?d +?l?d?l?d?d?u?d?l +?l?d?l?d?d?u?d?u +?l?d?l?d?d?u?l?d +?l?d?l?d?d?u?l?l +?l?d?l?d?d?u?l?u +?l?d?l?d?d?u?u?d +?l?d?l?d?d?u?u?l +?l?d?l?d?d?u?u?u +?l?d?l?d?d?s?d?d +?l?d?l?d?d?s?d?l +?l?d?l?d?d?s?d?s +?l?d?l?d?d?s?l?d +?l?d?l?d?d?s?l?l +?l?d?l?d?d?s?l?s +?l?d?l?d?d?s?s?d +?l?d?l?d?d?s?s?l +?l?d?l?d?d?s?s?s +?l?d?l?d?l?d?d?d +?l?d?l?d?l?d?d?l +?l?d?l?d?l?d?d?u +?l?d?l?d?l?d?d?s +?l?d?l?d?l?d?l?d +?l?d?l?d?l?d?l?l +?l?d?l?d?l?d?l?u +?l?d?l?d?l?d?l?s +?l?d?l?d?l?d?u?d +?l?d?l?d?l?d?u?l +?l?d?l?d?l?d?u?u +?l?d?l?d?l?d?s?d +?l?d?l?d?l?d?s?l +?l?d?l?d?l?d?s?s +?l?d?l?d?l?l?d?d +?l?d?l?d?l?l?d?l +?l?d?l?d?l?l?d?u +?l?d?l?d?l?l?d?s +?l?d?l?d?l?l?l?d +?l?d?l?d?l?l?l?l +?l?d?l?d?l?l?l?u +?l?d?l?d?l?l?l?s +?l?d?l?d?l?l?u?d +?l?d?l?d?l?l?u?l +?l?d?l?d?l?l?u?u +?l?d?l?d?l?l?s?d +?l?d?l?d?l?l?s?l +?l?d?l?d?l?l?s?s +?l?d?l?d?l?u?d?d +?l?d?l?d?l?u?d?l +?l?d?l?d?l?u?d?u +?l?d?l?d?l?u?l?d +?l?d?l?d?l?u?l?l +?l?d?l?d?l?u?l?u +?l?d?l?d?l?u?u?d +?l?d?l?d?l?u?u?l +?l?d?l?d?l?u?u?u +?l?d?l?d?l?s?d?d +?l?d?l?d?l?s?d?l +?l?d?l?d?l?s?d?s +?l?d?l?d?l?s?l?d +?l?d?l?d?l?s?l?l +?l?d?l?d?l?s?l?s +?l?d?l?d?l?s?s?d +?l?d?l?d?l?s?s?l +?l?d?l?d?l?s?s?s +?l?d?l?d?u?d?d?d +?l?d?l?d?u?d?d?l +?l?d?l?d?u?d?d?u +?l?d?l?d?u?d?l?d +?l?d?l?d?u?d?l?l +?l?d?l?d?u?d?l?u +?l?d?l?d?u?d?u?d +?l?d?l?d?u?d?u?l +?l?d?l?d?u?d?u?u +?l?d?l?d?u?l?d?d +?l?d?l?d?u?l?d?l +?l?d?l?d?u?l?d?u +?l?d?l?d?u?l?l?d +?l?d?l?d?u?l?l?l +?l?d?l?d?u?l?l?u +?l?d?l?d?u?l?u?d +?l?d?l?d?u?l?u?l +?l?d?l?d?u?l?u?u +?l?d?l?d?u?u?d?d +?l?d?l?d?u?u?d?l +?l?d?l?d?u?u?d?u +?l?d?l?d?u?u?l?d +?l?d?l?d?u?u?l?l +?l?d?l?d?u?u?l?u +?l?d?l?d?u?u?u?d +?l?d?l?d?u?u?u?l +?l?d?l?d?u?u?u?u +?l?d?l?d?s?d?d?d +?l?d?l?d?s?d?d?l +?l?d?l?d?s?d?d?s +?l?d?l?d?s?d?l?d +?l?d?l?d?s?d?l?l +?l?d?l?d?s?d?l?s +?l?d?l?d?s?d?s?d +?l?d?l?d?s?d?s?l +?l?d?l?d?s?d?s?s +?l?d?l?d?s?l?d?d +?l?d?l?d?s?l?d?l +?l?d?l?d?s?l?d?s +?l?d?l?d?s?l?l?d +?l?d?l?d?s?l?l?l +?l?d?l?d?s?l?l?s +?l?d?l?d?s?l?s?d +?l?d?l?d?s?l?s?l +?l?d?l?d?s?l?s?s +?l?d?l?d?s?s?d?d +?l?d?l?d?s?s?d?l +?l?d?l?d?s?s?d?s +?l?d?l?d?s?s?l?d +?l?d?l?d?s?s?l?l +?l?d?l?d?s?s?l?s +?l?d?l?d?s?s?s?d +?l?d?l?d?s?s?s?l +?l?d?l?d?s?s?s?s +?l?d?l?l?d?d?d?d +?l?d?l?l?d?d?d?l +?l?d?l?l?d?d?d?u +?l?d?l?l?d?d?d?s +?l?d?l?l?d?d?l?d +?l?d?l?l?d?d?l?l +?l?d?l?l?d?d?l?u +?l?d?l?l?d?d?l?s +?l?d?l?l?d?d?u?d +?l?d?l?l?d?d?u?l +?l?d?l?l?d?d?u?u +?l?d?l?l?d?d?s?d +?l?d?l?l?d?d?s?l +?l?d?l?l?d?d?s?s +?l?d?l?l?d?l?d?d +?l?d?l?l?d?l?d?l +?l?d?l?l?d?l?d?u +?l?d?l?l?d?l?d?s +?l?d?l?l?d?l?l?d +?l?d?l?l?d?l?l?l +?l?d?l?l?d?l?l?u +?l?d?l?l?d?l?l?s +?l?d?l?l?d?l?u?d +?l?d?l?l?d?l?u?l +?l?d?l?l?d?l?u?u +?l?d?l?l?d?l?s?d +?l?d?l?l?d?l?s?l +?l?d?l?l?d?l?s?s +?l?d?l?l?d?u?d?d +?l?d?l?l?d?u?d?l +?l?d?l?l?d?u?d?u +?l?d?l?l?d?u?l?d +?l?d?l?l?d?u?l?l +?l?d?l?l?d?u?l?u +?l?d?l?l?d?u?u?d +?l?d?l?l?d?u?u?l +?l?d?l?l?d?u?u?u +?l?d?l?l?d?s?d?d +?l?d?l?l?d?s?d?l +?l?d?l?l?d?s?d?s +?l?d?l?l?d?s?l?d +?l?d?l?l?d?s?l?l +?l?d?l?l?d?s?l?s +?l?d?l?l?d?s?s?d +?l?d?l?l?d?s?s?l +?l?d?l?l?d?s?s?s +?l?d?l?l?l?d?d?d +?l?d?l?l?l?d?d?l +?l?d?l?l?l?d?d?u +?l?d?l?l?l?d?d?s +?l?d?l?l?l?d?l?d +?l?d?l?l?l?d?l?l +?l?d?l?l?l?d?l?u +?l?d?l?l?l?d?l?s +?l?d?l?l?l?d?u?d +?l?d?l?l?l?d?u?l +?l?d?l?l?l?d?u?u +?l?d?l?l?l?d?s?d +?l?d?l?l?l?d?s?l +?l?d?l?l?l?d?s?s +?l?d?l?l?l?l?d?d +?l?d?l?l?l?l?d?l +?l?d?l?l?l?l?d?u +?l?d?l?l?l?l?d?s +?l?d?l?l?l?l?l?d +?l?d?l?l?l?l?l?l +?l?d?l?l?l?l?l?u +?l?d?l?l?l?l?l?s +?l?d?l?l?l?l?u?d +?l?d?l?l?l?l?u?l +?l?d?l?l?l?l?u?u +?l?d?l?l?l?l?s?d +?l?d?l?l?l?l?s?l +?l?d?l?l?l?l?s?s +?l?d?l?l?l?u?d?d +?l?d?l?l?l?u?d?l +?l?d?l?l?l?u?d?u +?l?d?l?l?l?u?l?d +?l?d?l?l?l?u?l?l +?l?d?l?l?l?u?l?u +?l?d?l?l?l?u?u?d +?l?d?l?l?l?u?u?l +?l?d?l?l?l?u?u?u +?l?d?l?l?l?s?d?d +?l?d?l?l?l?s?d?l +?l?d?l?l?l?s?d?s +?l?d?l?l?l?s?l?d +?l?d?l?l?l?s?l?l +?l?d?l?l?l?s?l?s +?l?d?l?l?l?s?s?d +?l?d?l?l?l?s?s?l +?l?d?l?l?l?s?s?s +?l?d?l?l?u?d?d?d +?l?d?l?l?u?d?d?l +?l?d?l?l?u?d?d?u +?l?d?l?l?u?d?l?d +?l?d?l?l?u?d?l?l +?l?d?l?l?u?d?l?u +?l?d?l?l?u?d?u?d +?l?d?l?l?u?d?u?l +?l?d?l?l?u?d?u?u +?l?d?l?l?u?l?d?d +?l?d?l?l?u?l?d?l +?l?d?l?l?u?l?d?u +?l?d?l?l?u?l?l?d +?l?d?l?l?u?l?l?l +?l?d?l?l?u?l?l?u +?l?d?l?l?u?l?u?d +?l?d?l?l?u?l?u?l +?l?d?l?l?u?l?u?u +?l?d?l?l?u?u?d?d +?l?d?l?l?u?u?d?l +?l?d?l?l?u?u?d?u +?l?d?l?l?u?u?l?d +?l?d?l?l?u?u?l?l +?l?d?l?l?u?u?l?u +?l?d?l?l?u?u?u?d +?l?d?l?l?u?u?u?l +?l?d?l?l?u?u?u?u +?l?d?l?l?s?d?d?d +?l?d?l?l?s?d?d?l +?l?d?l?l?s?d?d?s +?l?d?l?l?s?d?l?d +?l?d?l?l?s?d?l?l +?l?d?l?l?s?d?l?s +?l?d?l?l?s?d?s?d +?l?d?l?l?s?d?s?l +?l?d?l?l?s?d?s?s +?l?d?l?l?s?l?d?d +?l?d?l?l?s?l?d?l +?l?d?l?l?s?l?d?s +?l?d?l?l?s?l?l?d +?l?d?l?l?s?l?l?l +?l?d?l?l?s?l?l?s +?l?d?l?l?s?l?s?d +?l?d?l?l?s?l?s?l +?l?d?l?l?s?l?s?s +?l?d?l?l?s?s?d?d +?l?d?l?l?s?s?d?l +?l?d?l?l?s?s?d?s +?l?d?l?l?s?s?l?d +?l?d?l?l?s?s?l?l +?l?d?l?l?s?s?l?s +?l?d?l?l?s?s?s?d +?l?d?l?l?s?s?s?l +?l?d?l?l?s?s?s?s +?l?d?l?u?d?d?d?d +?l?d?l?u?d?d?d?l +?l?d?l?u?d?d?d?u +?l?d?l?u?d?d?l?d +?l?d?l?u?d?d?l?l +?l?d?l?u?d?d?l?u +?l?d?l?u?d?d?u?d +?l?d?l?u?d?d?u?l +?l?d?l?u?d?d?u?u +?l?d?l?u?d?l?d?d +?l?d?l?u?d?l?d?l +?l?d?l?u?d?l?d?u +?l?d?l?u?d?l?l?d +?l?d?l?u?d?l?l?l +?l?d?l?u?d?l?l?u +?l?d?l?u?d?l?u?d +?l?d?l?u?d?l?u?l +?l?d?l?u?d?l?u?u +?l?d?l?u?d?u?d?d +?l?d?l?u?d?u?d?l +?l?d?l?u?d?u?d?u +?l?d?l?u?d?u?l?d +?l?d?l?u?d?u?l?l +?l?d?l?u?d?u?l?u +?l?d?l?u?d?u?u?d +?l?d?l?u?d?u?u?l +?l?d?l?u?d?u?u?u +?l?d?l?u?l?d?d?d +?l?d?l?u?l?d?d?l +?l?d?l?u?l?d?d?u +?l?d?l?u?l?d?l?d +?l?d?l?u?l?d?l?l +?l?d?l?u?l?d?l?u +?l?d?l?u?l?d?u?d +?l?d?l?u?l?d?u?l +?l?d?l?u?l?d?u?u +?l?d?l?u?l?l?d?d +?l?d?l?u?l?l?d?l +?l?d?l?u?l?l?d?u +?l?d?l?u?l?l?l?d +?l?d?l?u?l?l?l?l +?l?d?l?u?l?l?l?u +?l?d?l?u?l?l?u?d +?l?d?l?u?l?l?u?l +?l?d?l?u?l?l?u?u +?l?d?l?u?l?u?d?d +?l?d?l?u?l?u?d?l +?l?d?l?u?l?u?d?u +?l?d?l?u?l?u?l?d +?l?d?l?u?l?u?l?l +?l?d?l?u?l?u?l?u +?l?d?l?u?l?u?u?d +?l?d?l?u?l?u?u?l +?l?d?l?u?l?u?u?u +?l?d?l?u?u?d?d?d +?l?d?l?u?u?d?d?l +?l?d?l?u?u?d?d?u +?l?d?l?u?u?d?l?d +?l?d?l?u?u?d?l?l +?l?d?l?u?u?d?l?u +?l?d?l?u?u?d?u?d +?l?d?l?u?u?d?u?l +?l?d?l?u?u?d?u?u +?l?d?l?u?u?l?d?d +?l?d?l?u?u?l?d?l +?l?d?l?u?u?l?d?u +?l?d?l?u?u?l?l?d +?l?d?l?u?u?l?l?l +?l?d?l?u?u?l?l?u +?l?d?l?u?u?l?u?d +?l?d?l?u?u?l?u?l +?l?d?l?u?u?l?u?u +?l?d?l?u?u?u?d?d +?l?d?l?u?u?u?d?l +?l?d?l?u?u?u?d?u +?l?d?l?u?u?u?l?d +?l?d?l?u?u?u?l?l +?l?d?l?u?u?u?l?u +?l?d?l?u?u?u?u?d +?l?d?l?u?u?u?u?l +?l?d?l?u?u?u?u?u +?l?d?l?s?d?d?d?d +?l?d?l?s?d?d?d?l +?l?d?l?s?d?d?d?s +?l?d?l?s?d?d?l?d +?l?d?l?s?d?d?l?l +?l?d?l?s?d?d?l?s +?l?d?l?s?d?d?s?d +?l?d?l?s?d?d?s?l +?l?d?l?s?d?d?s?s +?l?d?l?s?d?l?d?d +?l?d?l?s?d?l?d?l +?l?d?l?s?d?l?d?s +?l?d?l?s?d?l?l?d +?l?d?l?s?d?l?l?l +?l?d?l?s?d?l?l?s +?l?d?l?s?d?l?s?d +?l?d?l?s?d?l?s?l +?l?d?l?s?d?l?s?s +?l?d?l?s?d?s?d?d +?l?d?l?s?d?s?d?l +?l?d?l?s?d?s?d?s +?l?d?l?s?d?s?l?d +?l?d?l?s?d?s?l?l +?l?d?l?s?d?s?l?s +?l?d?l?s?d?s?s?d +?l?d?l?s?d?s?s?l +?l?d?l?s?d?s?s?s +?l?d?l?s?l?d?d?d +?l?d?l?s?l?d?d?l +?l?d?l?s?l?d?d?s +?l?d?l?s?l?d?l?d +?l?d?l?s?l?d?l?l +?l?d?l?s?l?d?l?s +?l?d?l?s?l?d?s?d +?l?d?l?s?l?d?s?l +?l?d?l?s?l?d?s?s +?l?d?l?s?l?l?d?d +?l?d?l?s?l?l?d?l +?l?d?l?s?l?l?d?s +?l?d?l?s?l?l?l?d +?l?d?l?s?l?l?l?l +?l?d?l?s?l?l?l?s +?l?d?l?s?l?l?s?d +?l?d?l?s?l?l?s?l +?l?d?l?s?l?l?s?s +?l?d?l?s?l?s?d?d +?l?d?l?s?l?s?d?l +?l?d?l?s?l?s?d?s +?l?d?l?s?l?s?l?d +?l?d?l?s?l?s?l?l +?l?d?l?s?l?s?l?s +?l?d?l?s?l?s?s?d +?l?d?l?s?l?s?s?l +?l?d?l?s?l?s?s?s +?l?d?l?s?s?d?d?d +?l?d?l?s?s?d?d?l +?l?d?l?s?s?d?d?s +?l?d?l?s?s?d?l?d +?l?d?l?s?s?d?l?l +?l?d?l?s?s?d?l?s +?l?d?l?s?s?d?s?d +?l?d?l?s?s?d?s?l +?l?d?l?s?s?d?s?s +?l?d?l?s?s?l?d?d +?l?d?l?s?s?l?d?l +?l?d?l?s?s?l?d?s +?l?d?l?s?s?l?l?d +?l?d?l?s?s?l?l?l +?l?d?l?s?s?l?l?s +?l?d?l?s?s?l?s?d +?l?d?l?s?s?l?s?l +?l?d?l?s?s?l?s?s +?l?d?l?s?s?s?d?d +?l?d?l?s?s?s?d?l +?l?d?l?s?s?s?d?s +?l?d?l?s?s?s?l?d +?l?d?l?s?s?s?l?l +?l?d?l?s?s?s?l?s +?l?d?l?s?s?s?s?d +?l?d?l?s?s?s?s?l +?l?d?l?s?s?s?s?s +?l?d?u?d?d?d?d?d +?l?d?u?d?d?d?d?l +?l?d?u?d?d?d?d?u +?l?d?u?d?d?d?l?d +?l?d?u?d?d?d?l?l +?l?d?u?d?d?d?l?u +?l?d?u?d?d?d?u?d +?l?d?u?d?d?d?u?l +?l?d?u?d?d?d?u?u +?l?d?u?d?d?l?d?d +?l?d?u?d?d?l?d?l +?l?d?u?d?d?l?d?u +?l?d?u?d?d?l?l?d +?l?d?u?d?d?l?l?l +?l?d?u?d?d?l?l?u +?l?d?u?d?d?l?u?d +?l?d?u?d?d?l?u?l +?l?d?u?d?d?l?u?u +?l?d?u?d?d?u?d?d +?l?d?u?d?d?u?d?l +?l?d?u?d?d?u?d?u +?l?d?u?d?d?u?l?d +?l?d?u?d?d?u?l?l +?l?d?u?d?d?u?l?u +?l?d?u?d?d?u?u?d +?l?d?u?d?d?u?u?l +?l?d?u?d?d?u?u?u +?l?d?u?d?l?d?d?d +?l?d?u?d?l?d?d?l +?l?d?u?d?l?d?d?u +?l?d?u?d?l?d?l?d +?l?d?u?d?l?d?l?l +?l?d?u?d?l?d?l?u +?l?d?u?d?l?d?u?d +?l?d?u?d?l?d?u?l +?l?d?u?d?l?d?u?u +?l?d?u?d?l?l?d?d +?l?d?u?d?l?l?d?l +?l?d?u?d?l?l?d?u +?l?d?u?d?l?l?l?d +?l?d?u?d?l?l?l?l +?l?d?u?d?l?l?l?u +?l?d?u?d?l?l?u?d +?l?d?u?d?l?l?u?l +?l?d?u?d?l?l?u?u +?l?d?u?d?l?u?d?d +?l?d?u?d?l?u?d?l +?l?d?u?d?l?u?d?u +?l?d?u?d?l?u?l?d +?l?d?u?d?l?u?l?l +?l?d?u?d?l?u?l?u +?l?d?u?d?l?u?u?d +?l?d?u?d?l?u?u?l +?l?d?u?d?l?u?u?u +?l?d?u?d?u?d?d?d +?l?d?u?d?u?d?d?l +?l?d?u?d?u?d?d?u +?l?d?u?d?u?d?l?d +?l?d?u?d?u?d?l?l +?l?d?u?d?u?d?l?u +?l?d?u?d?u?d?u?d +?l?d?u?d?u?d?u?l +?l?d?u?d?u?d?u?u +?l?d?u?d?u?l?d?d +?l?d?u?d?u?l?d?l +?l?d?u?d?u?l?d?u +?l?d?u?d?u?l?l?d +?l?d?u?d?u?l?l?l +?l?d?u?d?u?l?l?u +?l?d?u?d?u?l?u?d +?l?d?u?d?u?l?u?l +?l?d?u?d?u?l?u?u +?l?d?u?d?u?u?d?d +?l?d?u?d?u?u?d?l +?l?d?u?d?u?u?d?u +?l?d?u?d?u?u?l?d +?l?d?u?d?u?u?l?l +?l?d?u?d?u?u?l?u +?l?d?u?d?u?u?u?d +?l?d?u?d?u?u?u?l +?l?d?u?d?u?u?u?u +?l?d?u?l?d?d?d?d +?l?d?u?l?d?d?d?l +?l?d?u?l?d?d?d?u +?l?d?u?l?d?d?l?d +?l?d?u?l?d?d?l?l +?l?d?u?l?d?d?l?u +?l?d?u?l?d?d?u?d +?l?d?u?l?d?d?u?l +?l?d?u?l?d?d?u?u +?l?d?u?l?d?l?d?d +?l?d?u?l?d?l?d?l +?l?d?u?l?d?l?d?u +?l?d?u?l?d?l?l?d +?l?d?u?l?d?l?l?l +?l?d?u?l?d?l?l?u +?l?d?u?l?d?l?u?d +?l?d?u?l?d?l?u?l +?l?d?u?l?d?l?u?u +?l?d?u?l?d?u?d?d +?l?d?u?l?d?u?d?l +?l?d?u?l?d?u?d?u +?l?d?u?l?d?u?l?d +?l?d?u?l?d?u?l?l +?l?d?u?l?d?u?l?u +?l?d?u?l?d?u?u?d +?l?d?u?l?d?u?u?l +?l?d?u?l?d?u?u?u +?l?d?u?l?l?d?d?d +?l?d?u?l?l?d?d?l +?l?d?u?l?l?d?d?u +?l?d?u?l?l?d?l?d +?l?d?u?l?l?d?l?l +?l?d?u?l?l?d?l?u +?l?d?u?l?l?d?u?d +?l?d?u?l?l?d?u?l +?l?d?u?l?l?d?u?u +?l?d?u?l?l?l?d?d +?l?d?u?l?l?l?d?l +?l?d?u?l?l?l?d?u +?l?d?u?l?l?l?l?d +?l?d?u?l?l?l?l?l +?l?d?u?l?l?l?l?u +?l?d?u?l?l?l?u?d +?l?d?u?l?l?l?u?l +?l?d?u?l?l?l?u?u +?l?d?u?l?l?u?d?d +?l?d?u?l?l?u?d?l +?l?d?u?l?l?u?d?u +?l?d?u?l?l?u?l?d +?l?d?u?l?l?u?l?l +?l?d?u?l?l?u?l?u +?l?d?u?l?l?u?u?d +?l?d?u?l?l?u?u?l +?l?d?u?l?l?u?u?u +?l?d?u?l?u?d?d?d +?l?d?u?l?u?d?d?l +?l?d?u?l?u?d?d?u +?l?d?u?l?u?d?l?d +?l?d?u?l?u?d?l?l +?l?d?u?l?u?d?l?u +?l?d?u?l?u?d?u?d +?l?d?u?l?u?d?u?l +?l?d?u?l?u?d?u?u +?l?d?u?l?u?l?d?d +?l?d?u?l?u?l?d?l +?l?d?u?l?u?l?d?u +?l?d?u?l?u?l?l?d +?l?d?u?l?u?l?l?l +?l?d?u?l?u?l?l?u +?l?d?u?l?u?l?u?d +?l?d?u?l?u?l?u?l +?l?d?u?l?u?l?u?u +?l?d?u?l?u?u?d?d +?l?d?u?l?u?u?d?l +?l?d?u?l?u?u?d?u +?l?d?u?l?u?u?l?d +?l?d?u?l?u?u?l?l +?l?d?u?l?u?u?l?u +?l?d?u?l?u?u?u?d +?l?d?u?l?u?u?u?l +?l?d?u?l?u?u?u?u +?l?d?u?u?d?d?d?d +?l?d?u?u?d?d?d?l +?l?d?u?u?d?d?d?u +?l?d?u?u?d?d?l?d +?l?d?u?u?d?d?l?l +?l?d?u?u?d?d?l?u +?l?d?u?u?d?d?u?d +?l?d?u?u?d?d?u?l +?l?d?u?u?d?d?u?u +?l?d?u?u?d?l?d?d +?l?d?u?u?d?l?d?l +?l?d?u?u?d?l?d?u +?l?d?u?u?d?l?l?d +?l?d?u?u?d?l?l?l +?l?d?u?u?d?l?l?u +?l?d?u?u?d?l?u?d +?l?d?u?u?d?l?u?l +?l?d?u?u?d?l?u?u +?l?d?u?u?d?u?d?d +?l?d?u?u?d?u?d?l +?l?d?u?u?d?u?d?u +?l?d?u?u?d?u?l?d +?l?d?u?u?d?u?l?l +?l?d?u?u?d?u?l?u +?l?d?u?u?d?u?u?d +?l?d?u?u?d?u?u?l +?l?d?u?u?d?u?u?u +?l?d?u?u?l?d?d?d +?l?d?u?u?l?d?d?l +?l?d?u?u?l?d?d?u +?l?d?u?u?l?d?l?d +?l?d?u?u?l?d?l?l +?l?d?u?u?l?d?l?u +?l?d?u?u?l?d?u?d +?l?d?u?u?l?d?u?l +?l?d?u?u?l?d?u?u +?l?d?u?u?l?l?d?d +?l?d?u?u?l?l?d?l +?l?d?u?u?l?l?d?u +?l?d?u?u?l?l?l?d +?l?d?u?u?l?l?l?l +?l?d?u?u?l?l?l?u +?l?d?u?u?l?l?u?d +?l?d?u?u?l?l?u?l +?l?d?u?u?l?l?u?u +?l?d?u?u?l?u?d?d +?l?d?u?u?l?u?d?l +?l?d?u?u?l?u?d?u +?l?d?u?u?l?u?l?d +?l?d?u?u?l?u?l?l +?l?d?u?u?l?u?l?u +?l?d?u?u?l?u?u?d +?l?d?u?u?l?u?u?l +?l?d?u?u?l?u?u?u +?l?d?u?u?u?d?d?d +?l?d?u?u?u?d?d?l +?l?d?u?u?u?d?d?u +?l?d?u?u?u?d?l?d +?l?d?u?u?u?d?l?l +?l?d?u?u?u?d?l?u +?l?d?u?u?u?d?u?d +?l?d?u?u?u?d?u?l +?l?d?u?u?u?d?u?u +?l?d?u?u?u?l?d?d +?l?d?u?u?u?l?d?l +?l?d?u?u?u?l?d?u +?l?d?u?u?u?l?l?d +?l?d?u?u?u?l?l?l +?l?d?u?u?u?l?l?u +?l?d?u?u?u?l?u?d +?l?d?u?u?u?l?u?l +?l?d?u?u?u?l?u?u +?l?d?u?u?u?u?d?d +?l?d?u?u?u?u?d?l +?l?d?u?u?u?u?d?u +?l?d?u?u?u?u?l?d +?l?d?u?u?u?u?l?l +?l?d?u?u?u?u?l?u +?l?d?u?u?u?u?u?d +?l?d?u?u?u?u?u?l +?l?d?u?u?u?u?u?u +?l?d?s?d?d?d?d?d +?l?d?s?d?d?d?d?l +?l?d?s?d?d?d?d?s +?l?d?s?d?d?d?l?d +?l?d?s?d?d?d?l?l +?l?d?s?d?d?d?l?s +?l?d?s?d?d?d?s?d +?l?d?s?d?d?d?s?l +?l?d?s?d?d?d?s?s +?l?d?s?d?d?l?d?d +?l?d?s?d?d?l?d?l +?l?d?s?d?d?l?d?s +?l?d?s?d?d?l?l?d +?l?d?s?d?d?l?l?l +?l?d?s?d?d?l?l?s +?l?d?s?d?d?l?s?d +?l?d?s?d?d?l?s?l +?l?d?s?d?d?l?s?s +?l?d?s?d?d?s?d?d +?l?d?s?d?d?s?d?l +?l?d?s?d?d?s?d?s +?l?d?s?d?d?s?l?d +?l?d?s?d?d?s?l?l +?l?d?s?d?d?s?l?s +?l?d?s?d?d?s?s?d +?l?d?s?d?d?s?s?l +?l?d?s?d?d?s?s?s +?l?d?s?d?l?d?d?d +?l?d?s?d?l?d?d?l +?l?d?s?d?l?d?d?s +?l?d?s?d?l?d?l?d +?l?d?s?d?l?d?l?l +?l?d?s?d?l?d?l?s +?l?d?s?d?l?d?s?d +?l?d?s?d?l?d?s?l +?l?d?s?d?l?d?s?s +?l?d?s?d?l?l?d?d +?l?d?s?d?l?l?d?l +?l?d?s?d?l?l?d?s +?l?d?s?d?l?l?l?d +?l?d?s?d?l?l?l?l +?l?d?s?d?l?l?l?s +?l?d?s?d?l?l?s?d +?l?d?s?d?l?l?s?l +?l?d?s?d?l?l?s?s +?l?d?s?d?l?s?d?d +?l?d?s?d?l?s?d?l +?l?d?s?d?l?s?d?s +?l?d?s?d?l?s?l?d +?l?d?s?d?l?s?l?l +?l?d?s?d?l?s?l?s +?l?d?s?d?l?s?s?d +?l?d?s?d?l?s?s?l +?l?d?s?d?l?s?s?s +?l?d?s?d?s?d?d?d +?l?d?s?d?s?d?d?l +?l?d?s?d?s?d?d?s +?l?d?s?d?s?d?l?d +?l?d?s?d?s?d?l?l +?l?d?s?d?s?d?l?s +?l?d?s?d?s?d?s?d +?l?d?s?d?s?d?s?l +?l?d?s?d?s?d?s?s +?l?d?s?d?s?l?d?d +?l?d?s?d?s?l?d?l +?l?d?s?d?s?l?d?s +?l?d?s?d?s?l?l?d +?l?d?s?d?s?l?l?l +?l?d?s?d?s?l?l?s +?l?d?s?d?s?l?s?d +?l?d?s?d?s?l?s?l +?l?d?s?d?s?l?s?s +?l?d?s?d?s?s?d?d +?l?d?s?d?s?s?d?l +?l?d?s?d?s?s?d?s +?l?d?s?d?s?s?l?d +?l?d?s?d?s?s?l?l +?l?d?s?d?s?s?l?s +?l?d?s?d?s?s?s?d +?l?d?s?d?s?s?s?l +?l?d?s?d?s?s?s?s +?l?d?s?l?d?d?d?d +?l?d?s?l?d?d?d?l +?l?d?s?l?d?d?d?s +?l?d?s?l?d?d?l?d +?l?d?s?l?d?d?l?l +?l?d?s?l?d?d?l?s +?l?d?s?l?d?d?s?d +?l?d?s?l?d?d?s?l +?l?d?s?l?d?d?s?s +?l?d?s?l?d?l?d?d +?l?d?s?l?d?l?d?l +?l?d?s?l?d?l?d?s +?l?d?s?l?d?l?l?d +?l?d?s?l?d?l?l?l +?l?d?s?l?d?l?l?s +?l?d?s?l?d?l?s?d +?l?d?s?l?d?l?s?l +?l?d?s?l?d?l?s?s +?l?d?s?l?d?s?d?d +?l?d?s?l?d?s?d?l +?l?d?s?l?d?s?d?s +?l?d?s?l?d?s?l?d +?l?d?s?l?d?s?l?l +?l?d?s?l?d?s?l?s +?l?d?s?l?d?s?s?d +?l?d?s?l?d?s?s?l +?l?d?s?l?d?s?s?s +?l?d?s?l?l?d?d?d +?l?d?s?l?l?d?d?l +?l?d?s?l?l?d?d?s +?l?d?s?l?l?d?l?d +?l?d?s?l?l?d?l?l +?l?d?s?l?l?d?l?s +?l?d?s?l?l?d?s?d +?l?d?s?l?l?d?s?l +?l?d?s?l?l?d?s?s +?l?d?s?l?l?l?d?d +?l?d?s?l?l?l?d?l +?l?d?s?l?l?l?d?s +?l?d?s?l?l?l?l?d +?l?d?s?l?l?l?l?l +?l?d?s?l?l?l?l?s +?l?d?s?l?l?l?s?d +?l?d?s?l?l?l?s?l +?l?d?s?l?l?l?s?s +?l?d?s?l?l?s?d?d +?l?d?s?l?l?s?d?l +?l?d?s?l?l?s?d?s +?l?d?s?l?l?s?l?d +?l?d?s?l?l?s?l?l +?l?d?s?l?l?s?l?s +?l?d?s?l?l?s?s?d +?l?d?s?l?l?s?s?l +?l?d?s?l?l?s?s?s +?l?d?s?l?s?d?d?d +?l?d?s?l?s?d?d?l +?l?d?s?l?s?d?d?s +?l?d?s?l?s?d?l?d +?l?d?s?l?s?d?l?l +?l?d?s?l?s?d?l?s +?l?d?s?l?s?d?s?d +?l?d?s?l?s?d?s?l +?l?d?s?l?s?d?s?s +?l?d?s?l?s?l?d?d +?l?d?s?l?s?l?d?l +?l?d?s?l?s?l?d?s +?l?d?s?l?s?l?l?d +?l?d?s?l?s?l?l?l +?l?d?s?l?s?l?l?s +?l?d?s?l?s?l?s?d +?l?d?s?l?s?l?s?l +?l?d?s?l?s?l?s?s +?l?d?s?l?s?s?d?d +?l?d?s?l?s?s?d?l +?l?d?s?l?s?s?d?s +?l?d?s?l?s?s?l?d +?l?d?s?l?s?s?l?l +?l?d?s?l?s?s?l?s +?l?d?s?l?s?s?s?d +?l?d?s?l?s?s?s?l +?l?d?s?l?s?s?s?s +?l?d?s?s?d?d?d?d +?l?d?s?s?d?d?d?l +?l?d?s?s?d?d?d?s +?l?d?s?s?d?d?l?d +?l?d?s?s?d?d?l?l +?l?d?s?s?d?d?l?s +?l?d?s?s?d?d?s?d +?l?d?s?s?d?d?s?l +?l?d?s?s?d?d?s?s +?l?d?s?s?d?l?d?d +?l?d?s?s?d?l?d?l +?l?d?s?s?d?l?d?s +?l?d?s?s?d?l?l?d +?l?d?s?s?d?l?l?l +?l?d?s?s?d?l?l?s +?l?d?s?s?d?l?s?d +?l?d?s?s?d?l?s?l +?l?d?s?s?d?l?s?s +?l?d?s?s?d?s?d?d +?l?d?s?s?d?s?d?l +?l?d?s?s?d?s?d?s +?l?d?s?s?d?s?l?d +?l?d?s?s?d?s?l?l +?l?d?s?s?d?s?l?s +?l?d?s?s?d?s?s?d +?l?d?s?s?d?s?s?l +?l?d?s?s?d?s?s?s +?l?d?s?s?l?d?d?d +?l?d?s?s?l?d?d?l +?l?d?s?s?l?d?d?s +?l?d?s?s?l?d?l?d +?l?d?s?s?l?d?l?l +?l?d?s?s?l?d?l?s +?l?d?s?s?l?d?s?d +?l?d?s?s?l?d?s?l +?l?d?s?s?l?d?s?s +?l?d?s?s?l?l?d?d +?l?d?s?s?l?l?d?l +?l?d?s?s?l?l?d?s +?l?d?s?s?l?l?l?d +?l?d?s?s?l?l?l?l +?l?d?s?s?l?l?l?s +?l?d?s?s?l?l?s?d +?l?d?s?s?l?l?s?l +?l?d?s?s?l?l?s?s +?l?d?s?s?l?s?d?d +?l?d?s?s?l?s?d?l +?l?d?s?s?l?s?d?s +?l?d?s?s?l?s?l?d +?l?d?s?s?l?s?l?l +?l?d?s?s?l?s?l?s +?l?d?s?s?l?s?s?d +?l?d?s?s?l?s?s?l +?l?d?s?s?l?s?s?s +?l?d?s?s?s?d?d?d +?l?d?s?s?s?d?d?l +?l?d?s?s?s?d?d?s +?l?d?s?s?s?d?l?d +?l?d?s?s?s?d?l?l +?l?d?s?s?s?d?l?s +?l?d?s?s?s?d?s?d +?l?d?s?s?s?d?s?l +?l?d?s?s?s?d?s?s +?l?d?s?s?s?l?d?d +?l?d?s?s?s?l?d?l +?l?d?s?s?s?l?d?s +?l?d?s?s?s?l?l?d +?l?d?s?s?s?l?l?l +?l?d?s?s?s?l?l?s +?l?d?s?s?s?l?s?d +?l?d?s?s?s?l?s?l +?l?d?s?s?s?l?s?s +?l?d?s?s?s?s?d?d +?l?d?s?s?s?s?d?l +?l?d?s?s?s?s?d?s +?l?d?s?s?s?s?l?d +?l?d?s?s?s?s?l?l +?l?d?s?s?s?s?l?s +?l?d?s?s?s?s?s?d +?l?d?s?s?s?s?s?l +?l?d?s?s?s?s?s?s +?l?l?d?d?d?d?d?d +?l?l?d?d?d?d?d?l +?l?l?d?d?d?d?d?u +?l?l?d?d?d?d?d?s +?l?l?d?d?d?d?l?d +?l?l?d?d?d?d?l?l +?l?l?d?d?d?d?l?u +?l?l?d?d?d?d?l?s +?l?l?d?d?d?d?u?d +?l?l?d?d?d?d?u?l +?l?l?d?d?d?d?u?u +?l?l?d?d?d?d?s?d +?l?l?d?d?d?d?s?l +?l?l?d?d?d?d?s?s +?l?l?d?d?d?l?d?d +?l?l?d?d?d?l?d?l +?l?l?d?d?d?l?d?u +?l?l?d?d?d?l?d?s +?l?l?d?d?d?l?l?d +?l?l?d?d?d?l?l?l +?l?l?d?d?d?l?l?u +?l?l?d?d?d?l?l?s +?l?l?d?d?d?l?u?d +?l?l?d?d?d?l?u?l +?l?l?d?d?d?l?u?u +?l?l?d?d?d?l?s?d +?l?l?d?d?d?l?s?l +?l?l?d?d?d?l?s?s +?l?l?d?d?d?u?d?d +?l?l?d?d?d?u?d?l +?l?l?d?d?d?u?d?u +?l?l?d?d?d?u?l?d +?l?l?d?d?d?u?l?l +?l?l?d?d?d?u?l?u +?l?l?d?d?d?u?u?d +?l?l?d?d?d?u?u?l +?l?l?d?d?d?u?u?u +?l?l?d?d?d?s?d?d +?l?l?d?d?d?s?d?l +?l?l?d?d?d?s?d?s +?l?l?d?d?d?s?l?d +?l?l?d?d?d?s?l?l +?l?l?d?d?d?s?l?s +?l?l?d?d?d?s?s?d +?l?l?d?d?d?s?s?l +?l?l?d?d?d?s?s?s +?l?l?d?d?l?d?d?d +?l?l?d?d?l?d?d?l +?l?l?d?d?l?d?d?u +?l?l?d?d?l?d?d?s +?l?l?d?d?l?d?l?d +?l?l?d?d?l?d?l?l +?l?l?d?d?l?d?l?u +?l?l?d?d?l?d?l?s +?l?l?d?d?l?d?u?d +?l?l?d?d?l?d?u?l +?l?l?d?d?l?d?u?u +?l?l?d?d?l?d?s?d +?l?l?d?d?l?d?s?l +?l?l?d?d?l?d?s?s +?l?l?d?d?l?l?d?d +?l?l?d?d?l?l?d?l +?l?l?d?d?l?l?d?u +?l?l?d?d?l?l?d?s +?l?l?d?d?l?l?l?d +?l?l?d?d?l?l?l?l +?l?l?d?d?l?l?l?u +?l?l?d?d?l?l?l?s +?l?l?d?d?l?l?u?d +?l?l?d?d?l?l?u?l +?l?l?d?d?l?l?u?u +?l?l?d?d?l?l?s?d +?l?l?d?d?l?l?s?l +?l?l?d?d?l?l?s?s +?l?l?d?d?l?u?d?d +?l?l?d?d?l?u?d?l +?l?l?d?d?l?u?d?u +?l?l?d?d?l?u?l?d +?l?l?d?d?l?u?l?l +?l?l?d?d?l?u?l?u +?l?l?d?d?l?u?u?d +?l?l?d?d?l?u?u?l +?l?l?d?d?l?u?u?u +?l?l?d?d?l?s?d?d +?l?l?d?d?l?s?d?l +?l?l?d?d?l?s?d?s +?l?l?d?d?l?s?l?d +?l?l?d?d?l?s?l?l +?l?l?d?d?l?s?l?s +?l?l?d?d?l?s?s?d +?l?l?d?d?l?s?s?l +?l?l?d?d?l?s?s?s +?l?l?d?d?u?d?d?d +?l?l?d?d?u?d?d?l +?l?l?d?d?u?d?d?u +?l?l?d?d?u?d?l?d +?l?l?d?d?u?d?l?l +?l?l?d?d?u?d?l?u +?l?l?d?d?u?d?u?d +?l?l?d?d?u?d?u?l +?l?l?d?d?u?d?u?u +?l?l?d?d?u?l?d?d +?l?l?d?d?u?l?d?l +?l?l?d?d?u?l?d?u +?l?l?d?d?u?l?l?d +?l?l?d?d?u?l?l?l +?l?l?d?d?u?l?l?u +?l?l?d?d?u?l?u?d +?l?l?d?d?u?l?u?l +?l?l?d?d?u?l?u?u +?l?l?d?d?u?u?d?d +?l?l?d?d?u?u?d?l +?l?l?d?d?u?u?d?u +?l?l?d?d?u?u?l?d +?l?l?d?d?u?u?l?l +?l?l?d?d?u?u?l?u +?l?l?d?d?u?u?u?d +?l?l?d?d?u?u?u?l +?l?l?d?d?u?u?u?u +?l?l?d?d?s?d?d?d +?l?l?d?d?s?d?d?l +?l?l?d?d?s?d?d?s +?l?l?d?d?s?d?l?d +?l?l?d?d?s?d?l?l +?l?l?d?d?s?d?l?s +?l?l?d?d?s?d?s?d +?l?l?d?d?s?d?s?l +?l?l?d?d?s?d?s?s +?l?l?d?d?s?l?d?d +?l?l?d?d?s?l?d?l +?l?l?d?d?s?l?d?s +?l?l?d?d?s?l?l?d +?l?l?d?d?s?l?l?l +?l?l?d?d?s?l?l?s +?l?l?d?d?s?l?s?d +?l?l?d?d?s?l?s?l +?l?l?d?d?s?l?s?s +?l?l?d?d?s?s?d?d +?l?l?d?d?s?s?d?l +?l?l?d?d?s?s?d?s +?l?l?d?d?s?s?l?d +?l?l?d?d?s?s?l?l +?l?l?d?d?s?s?l?s +?l?l?d?d?s?s?s?d +?l?l?d?d?s?s?s?l +?l?l?d?d?s?s?s?s +?l?l?d?l?d?d?d?d +?l?l?d?l?d?d?d?l +?l?l?d?l?d?d?d?u +?l?l?d?l?d?d?d?s +?l?l?d?l?d?d?l?d +?l?l?d?l?d?d?l?l +?l?l?d?l?d?d?l?u +?l?l?d?l?d?d?l?s +?l?l?d?l?d?d?u?d +?l?l?d?l?d?d?u?l +?l?l?d?l?d?d?u?u +?l?l?d?l?d?d?s?d +?l?l?d?l?d?d?s?l +?l?l?d?l?d?d?s?s +?l?l?d?l?d?l?d?d +?l?l?d?l?d?l?d?l +?l?l?d?l?d?l?d?u +?l?l?d?l?d?l?d?s +?l?l?d?l?d?l?l?d +?l?l?d?l?d?l?l?l +?l?l?d?l?d?l?l?u +?l?l?d?l?d?l?l?s +?l?l?d?l?d?l?u?d +?l?l?d?l?d?l?u?l +?l?l?d?l?d?l?u?u +?l?l?d?l?d?l?s?d +?l?l?d?l?d?l?s?l +?l?l?d?l?d?l?s?s +?l?l?d?l?d?u?d?d +?l?l?d?l?d?u?d?l +?l?l?d?l?d?u?d?u +?l?l?d?l?d?u?l?d +?l?l?d?l?d?u?l?l +?l?l?d?l?d?u?l?u +?l?l?d?l?d?u?u?d +?l?l?d?l?d?u?u?l +?l?l?d?l?d?u?u?u +?l?l?d?l?d?s?d?d +?l?l?d?l?d?s?d?l +?l?l?d?l?d?s?d?s +?l?l?d?l?d?s?l?d +?l?l?d?l?d?s?l?l +?l?l?d?l?d?s?l?s +?l?l?d?l?d?s?s?d +?l?l?d?l?d?s?s?l +?l?l?d?l?d?s?s?s +?l?l?d?l?l?d?d?d +?l?l?d?l?l?d?d?l +?l?l?d?l?l?d?d?u +?l?l?d?l?l?d?d?s +?l?l?d?l?l?d?l?d +?l?l?d?l?l?d?l?l +?l?l?d?l?l?d?l?u +?l?l?d?l?l?d?l?s +?l?l?d?l?l?d?u?d +?l?l?d?l?l?d?u?l +?l?l?d?l?l?d?u?u +?l?l?d?l?l?d?s?d +?l?l?d?l?l?d?s?l +?l?l?d?l?l?d?s?s +?l?l?d?l?l?l?d?d +?l?l?d?l?l?l?d?l +?l?l?d?l?l?l?d?u +?l?l?d?l?l?l?d?s +?l?l?d?l?l?l?l?d +?l?l?d?l?l?l?l?l +?l?l?d?l?l?l?l?u +?l?l?d?l?l?l?l?s +?l?l?d?l?l?l?u?d +?l?l?d?l?l?l?u?l +?l?l?d?l?l?l?u?u +?l?l?d?l?l?l?s?d +?l?l?d?l?l?l?s?l +?l?l?d?l?l?l?s?s +?l?l?d?l?l?u?d?d +?l?l?d?l?l?u?d?l +?l?l?d?l?l?u?d?u +?l?l?d?l?l?u?l?d +?l?l?d?l?l?u?l?l +?l?l?d?l?l?u?l?u +?l?l?d?l?l?u?u?d +?l?l?d?l?l?u?u?l +?l?l?d?l?l?u?u?u +?l?l?d?l?l?s?d?d +?l?l?d?l?l?s?d?l +?l?l?d?l?l?s?d?s +?l?l?d?l?l?s?l?d +?l?l?d?l?l?s?l?l +?l?l?d?l?l?s?l?s +?l?l?d?l?l?s?s?d +?l?l?d?l?l?s?s?l +?l?l?d?l?l?s?s?s +?l?l?d?l?u?d?d?d +?l?l?d?l?u?d?d?l +?l?l?d?l?u?d?d?u +?l?l?d?l?u?d?l?d +?l?l?d?l?u?d?l?l +?l?l?d?l?u?d?l?u +?l?l?d?l?u?d?u?d +?l?l?d?l?u?d?u?l +?l?l?d?l?u?d?u?u +?l?l?d?l?u?l?d?d +?l?l?d?l?u?l?d?l +?l?l?d?l?u?l?d?u +?l?l?d?l?u?l?l?d +?l?l?d?l?u?l?l?l +?l?l?d?l?u?l?l?u +?l?l?d?l?u?l?u?d +?l?l?d?l?u?l?u?l +?l?l?d?l?u?l?u?u +?l?l?d?l?u?u?d?d +?l?l?d?l?u?u?d?l +?l?l?d?l?u?u?d?u +?l?l?d?l?u?u?l?d +?l?l?d?l?u?u?l?l +?l?l?d?l?u?u?l?u +?l?l?d?l?u?u?u?d +?l?l?d?l?u?u?u?l +?l?l?d?l?u?u?u?u +?l?l?d?l?s?d?d?d +?l?l?d?l?s?d?d?l +?l?l?d?l?s?d?d?s +?l?l?d?l?s?d?l?d +?l?l?d?l?s?d?l?l +?l?l?d?l?s?d?l?s +?l?l?d?l?s?d?s?d +?l?l?d?l?s?d?s?l +?l?l?d?l?s?d?s?s +?l?l?d?l?s?l?d?d +?l?l?d?l?s?l?d?l +?l?l?d?l?s?l?d?s +?l?l?d?l?s?l?l?d +?l?l?d?l?s?l?l?l +?l?l?d?l?s?l?l?s +?l?l?d?l?s?l?s?d +?l?l?d?l?s?l?s?l +?l?l?d?l?s?l?s?s +?l?l?d?l?s?s?d?d +?l?l?d?l?s?s?d?l +?l?l?d?l?s?s?d?s +?l?l?d?l?s?s?l?d +?l?l?d?l?s?s?l?l +?l?l?d?l?s?s?l?s +?l?l?d?l?s?s?s?d +?l?l?d?l?s?s?s?l +?l?l?d?l?s?s?s?s +?l?l?d?u?d?d?d?d +?l?l?d?u?d?d?d?l +?l?l?d?u?d?d?d?u +?l?l?d?u?d?d?l?d +?l?l?d?u?d?d?l?l +?l?l?d?u?d?d?l?u +?l?l?d?u?d?d?u?d +?l?l?d?u?d?d?u?l +?l?l?d?u?d?d?u?u +?l?l?d?u?d?l?d?d +?l?l?d?u?d?l?d?l +?l?l?d?u?d?l?d?u +?l?l?d?u?d?l?l?d +?l?l?d?u?d?l?l?l +?l?l?d?u?d?l?l?u +?l?l?d?u?d?l?u?d +?l?l?d?u?d?l?u?l +?l?l?d?u?d?l?u?u +?l?l?d?u?d?u?d?d +?l?l?d?u?d?u?d?l +?l?l?d?u?d?u?d?u +?l?l?d?u?d?u?l?d +?l?l?d?u?d?u?l?l +?l?l?d?u?d?u?l?u +?l?l?d?u?d?u?u?d +?l?l?d?u?d?u?u?l +?l?l?d?u?d?u?u?u +?l?l?d?u?l?d?d?d +?l?l?d?u?l?d?d?l +?l?l?d?u?l?d?d?u +?l?l?d?u?l?d?l?d +?l?l?d?u?l?d?l?l +?l?l?d?u?l?d?l?u +?l?l?d?u?l?d?u?d +?l?l?d?u?l?d?u?l +?l?l?d?u?l?d?u?u +?l?l?d?u?l?l?d?d +?l?l?d?u?l?l?d?l +?l?l?d?u?l?l?d?u +?l?l?d?u?l?l?l?d +?l?l?d?u?l?l?l?l +?l?l?d?u?l?l?l?u +?l?l?d?u?l?l?u?d +?l?l?d?u?l?l?u?l +?l?l?d?u?l?l?u?u +?l?l?d?u?l?u?d?d +?l?l?d?u?l?u?d?l +?l?l?d?u?l?u?d?u +?l?l?d?u?l?u?l?d +?l?l?d?u?l?u?l?l +?l?l?d?u?l?u?l?u +?l?l?d?u?l?u?u?d +?l?l?d?u?l?u?u?l +?l?l?d?u?l?u?u?u +?l?l?d?u?u?d?d?d +?l?l?d?u?u?d?d?l +?l?l?d?u?u?d?d?u +?l?l?d?u?u?d?l?d +?l?l?d?u?u?d?l?l +?l?l?d?u?u?d?l?u +?l?l?d?u?u?d?u?d +?l?l?d?u?u?d?u?l +?l?l?d?u?u?d?u?u +?l?l?d?u?u?l?d?d +?l?l?d?u?u?l?d?l +?l?l?d?u?u?l?d?u +?l?l?d?u?u?l?l?d +?l?l?d?u?u?l?l?l +?l?l?d?u?u?l?l?u +?l?l?d?u?u?l?u?d +?l?l?d?u?u?l?u?l +?l?l?d?u?u?l?u?u +?l?l?d?u?u?u?d?d +?l?l?d?u?u?u?d?l +?l?l?d?u?u?u?d?u +?l?l?d?u?u?u?l?d +?l?l?d?u?u?u?l?l +?l?l?d?u?u?u?l?u +?l?l?d?u?u?u?u?d +?l?l?d?u?u?u?u?l +?l?l?d?u?u?u?u?u +?l?l?d?s?d?d?d?d +?l?l?d?s?d?d?d?l +?l?l?d?s?d?d?d?s +?l?l?d?s?d?d?l?d +?l?l?d?s?d?d?l?l +?l?l?d?s?d?d?l?s +?l?l?d?s?d?d?s?d +?l?l?d?s?d?d?s?l +?l?l?d?s?d?d?s?s +?l?l?d?s?d?l?d?d +?l?l?d?s?d?l?d?l +?l?l?d?s?d?l?d?s +?l?l?d?s?d?l?l?d +?l?l?d?s?d?l?l?l +?l?l?d?s?d?l?l?s +?l?l?d?s?d?l?s?d +?l?l?d?s?d?l?s?l +?l?l?d?s?d?l?s?s +?l?l?d?s?d?s?d?d +?l?l?d?s?d?s?d?l +?l?l?d?s?d?s?d?s +?l?l?d?s?d?s?l?d +?l?l?d?s?d?s?l?l +?l?l?d?s?d?s?l?s +?l?l?d?s?d?s?s?d +?l?l?d?s?d?s?s?l +?l?l?d?s?d?s?s?s +?l?l?d?s?l?d?d?d +?l?l?d?s?l?d?d?l +?l?l?d?s?l?d?d?s +?l?l?d?s?l?d?l?d +?l?l?d?s?l?d?l?l +?l?l?d?s?l?d?l?s +?l?l?d?s?l?d?s?d +?l?l?d?s?l?d?s?l +?l?l?d?s?l?d?s?s +?l?l?d?s?l?l?d?d +?l?l?d?s?l?l?d?l +?l?l?d?s?l?l?d?s +?l?l?d?s?l?l?l?d +?l?l?d?s?l?l?l?l +?l?l?d?s?l?l?l?s +?l?l?d?s?l?l?s?d +?l?l?d?s?l?l?s?l +?l?l?d?s?l?l?s?s +?l?l?d?s?l?s?d?d +?l?l?d?s?l?s?d?l +?l?l?d?s?l?s?d?s +?l?l?d?s?l?s?l?d +?l?l?d?s?l?s?l?l +?l?l?d?s?l?s?l?s +?l?l?d?s?l?s?s?d +?l?l?d?s?l?s?s?l +?l?l?d?s?l?s?s?s +?l?l?d?s?s?d?d?d +?l?l?d?s?s?d?d?l +?l?l?d?s?s?d?d?s +?l?l?d?s?s?d?l?d +?l?l?d?s?s?d?l?l +?l?l?d?s?s?d?l?s +?l?l?d?s?s?d?s?d +?l?l?d?s?s?d?s?l +?l?l?d?s?s?d?s?s +?l?l?d?s?s?l?d?d +?l?l?d?s?s?l?d?l +?l?l?d?s?s?l?d?s +?l?l?d?s?s?l?l?d +?l?l?d?s?s?l?l?l +?l?l?d?s?s?l?l?s +?l?l?d?s?s?l?s?d +?l?l?d?s?s?l?s?l +?l?l?d?s?s?l?s?s +?l?l?d?s?s?s?d?d +?l?l?d?s?s?s?d?l +?l?l?d?s?s?s?d?s +?l?l?d?s?s?s?l?d +?l?l?d?s?s?s?l?l +?l?l?d?s?s?s?l?s +?l?l?d?s?s?s?s?d +?l?l?d?s?s?s?s?l +?l?l?d?s?s?s?s?s +?l?l?l?d?d?d?d?d +?l?l?l?d?d?d?d?l +?l?l?l?d?d?d?d?u +?l?l?l?d?d?d?d?s +?l?l?l?d?d?d?l?d +?l?l?l?d?d?d?l?l +?l?l?l?d?d?d?l?u +?l?l?l?d?d?d?l?s +?l?l?l?d?d?d?u?d +?l?l?l?d?d?d?u?l +?l?l?l?d?d?d?u?u +?l?l?l?d?d?d?s?d +?l?l?l?d?d?d?s?l +?l?l?l?d?d?d?s?s +?l?l?l?d?d?l?d?d +?l?l?l?d?d?l?d?l +?l?l?l?d?d?l?d?u +?l?l?l?d?d?l?d?s +?l?l?l?d?d?l?l?d +?l?l?l?d?d?l?l?l +?l?l?l?d?d?l?l?u +?l?l?l?d?d?l?l?s +?l?l?l?d?d?l?u?d +?l?l?l?d?d?l?u?l +?l?l?l?d?d?l?u?u +?l?l?l?d?d?l?s?d +?l?l?l?d?d?l?s?l +?l?l?l?d?d?l?s?s +?l?l?l?d?d?u?d?d +?l?l?l?d?d?u?d?l +?l?l?l?d?d?u?d?u +?l?l?l?d?d?u?l?d +?l?l?l?d?d?u?l?l +?l?l?l?d?d?u?l?u +?l?l?l?d?d?u?u?d +?l?l?l?d?d?u?u?l +?l?l?l?d?d?u?u?u +?l?l?l?d?d?s?d?d +?l?l?l?d?d?s?d?l +?l?l?l?d?d?s?d?s +?l?l?l?d?d?s?l?d +?l?l?l?d?d?s?l?l +?l?l?l?d?d?s?l?s +?l?l?l?d?d?s?s?d +?l?l?l?d?d?s?s?l +?l?l?l?d?d?s?s?s +?l?l?l?d?l?d?d?d +?l?l?l?d?l?d?d?l +?l?l?l?d?l?d?d?u +?l?l?l?d?l?d?d?s +?l?l?l?d?l?d?l?d +?l?l?l?d?l?d?l?l +?l?l?l?d?l?d?l?u +?l?l?l?d?l?d?l?s +?l?l?l?d?l?d?u?d +?l?l?l?d?l?d?u?l +?l?l?l?d?l?d?u?u +?l?l?l?d?l?d?s?d +?l?l?l?d?l?d?s?l +?l?l?l?d?l?d?s?s +?l?l?l?d?l?l?d?d +?l?l?l?d?l?l?d?l +?l?l?l?d?l?l?d?u +?l?l?l?d?l?l?d?s +?l?l?l?d?l?l?l?d +?l?l?l?d?l?l?l?l +?l?l?l?d?l?l?l?u +?l?l?l?d?l?l?l?s +?l?l?l?d?l?l?u?d +?l?l?l?d?l?l?u?l +?l?l?l?d?l?l?u?u +?l?l?l?d?l?l?s?d +?l?l?l?d?l?l?s?l +?l?l?l?d?l?l?s?s +?l?l?l?d?l?u?d?d +?l?l?l?d?l?u?d?l +?l?l?l?d?l?u?d?u +?l?l?l?d?l?u?l?d +?l?l?l?d?l?u?l?l +?l?l?l?d?l?u?l?u +?l?l?l?d?l?u?u?d +?l?l?l?d?l?u?u?l +?l?l?l?d?l?u?u?u +?l?l?l?d?l?s?d?d +?l?l?l?d?l?s?d?l +?l?l?l?d?l?s?d?s +?l?l?l?d?l?s?l?d +?l?l?l?d?l?s?l?l +?l?l?l?d?l?s?l?s +?l?l?l?d?l?s?s?d +?l?l?l?d?l?s?s?l +?l?l?l?d?l?s?s?s +?l?l?l?d?u?d?d?d +?l?l?l?d?u?d?d?l +?l?l?l?d?u?d?d?u +?l?l?l?d?u?d?l?d +?l?l?l?d?u?d?l?l +?l?l?l?d?u?d?l?u +?l?l?l?d?u?d?u?d +?l?l?l?d?u?d?u?l +?l?l?l?d?u?d?u?u +?l?l?l?d?u?l?d?d +?l?l?l?d?u?l?d?l +?l?l?l?d?u?l?d?u +?l?l?l?d?u?l?l?d +?l?l?l?d?u?l?l?l +?l?l?l?d?u?l?l?u +?l?l?l?d?u?l?u?d +?l?l?l?d?u?l?u?l +?l?l?l?d?u?l?u?u +?l?l?l?d?u?u?d?d +?l?l?l?d?u?u?d?l +?l?l?l?d?u?u?d?u +?l?l?l?d?u?u?l?d +?l?l?l?d?u?u?l?l +?l?l?l?d?u?u?l?u +?l?l?l?d?u?u?u?d +?l?l?l?d?u?u?u?l +?l?l?l?d?u?u?u?u +?l?l?l?d?s?d?d?d +?l?l?l?d?s?d?d?l +?l?l?l?d?s?d?d?s +?l?l?l?d?s?d?l?d +?l?l?l?d?s?d?l?l +?l?l?l?d?s?d?l?s +?l?l?l?d?s?d?s?d +?l?l?l?d?s?d?s?l +?l?l?l?d?s?d?s?s +?l?l?l?d?s?l?d?d +?l?l?l?d?s?l?d?l +?l?l?l?d?s?l?d?s +?l?l?l?d?s?l?l?d +?l?l?l?d?s?l?l?l +?l?l?l?d?s?l?l?s +?l?l?l?d?s?l?s?d +?l?l?l?d?s?l?s?l +?l?l?l?d?s?l?s?s +?l?l?l?d?s?s?d?d +?l?l?l?d?s?s?d?l +?l?l?l?d?s?s?d?s +?l?l?l?d?s?s?l?d +?l?l?l?d?s?s?l?l +?l?l?l?d?s?s?l?s +?l?l?l?d?s?s?s?d +?l?l?l?d?s?s?s?l +?l?l?l?d?s?s?s?s +?l?l?l?l?d?d?d?d +?l?l?l?l?d?d?d?l +?l?l?l?l?d?d?d?u +?l?l?l?l?d?d?d?s +?l?l?l?l?d?d?l?d +?l?l?l?l?d?d?l?l +?l?l?l?l?d?d?l?u +?l?l?l?l?d?d?l?s +?l?l?l?l?d?d?u?d +?l?l?l?l?d?d?u?l +?l?l?l?l?d?d?u?u +?l?l?l?l?d?d?s?d +?l?l?l?l?d?d?s?l +?l?l?l?l?d?d?s?s +?l?l?l?l?d?l?d?d +?l?l?l?l?d?l?d?l +?l?l?l?l?d?l?d?u +?l?l?l?l?d?l?d?s +?l?l?l?l?d?l?l?d +?l?l?l?l?d?l?l?l +?l?l?l?l?d?l?l?u +?l?l?l?l?d?l?l?s +?l?l?l?l?d?l?u?d +?l?l?l?l?d?l?u?l +?l?l?l?l?d?l?u?u +?l?l?l?l?d?l?s?d +?l?l?l?l?d?l?s?l +?l?l?l?l?d?l?s?s +?l?l?l?l?d?u?d?d +?l?l?l?l?d?u?d?l +?l?l?l?l?d?u?d?u +?l?l?l?l?d?u?l?d +?l?l?l?l?d?u?l?l +?l?l?l?l?d?u?l?u +?l?l?l?l?d?u?u?d +?l?l?l?l?d?u?u?l +?l?l?l?l?d?u?u?u +?l?l?l?l?d?s?d?d +?l?l?l?l?d?s?d?l +?l?l?l?l?d?s?d?s +?l?l?l?l?d?s?l?d +?l?l?l?l?d?s?l?l +?l?l?l?l?d?s?l?s +?l?l?l?l?d?s?s?d +?l?l?l?l?d?s?s?l +?l?l?l?l?d?s?s?s +?l?l?l?l?l?d?d?d +?l?l?l?l?l?d?d?l +?l?l?l?l?l?d?d?u +?l?l?l?l?l?d?d?s +?l?l?l?l?l?d?l?d +?l?l?l?l?l?d?l?l +?l?l?l?l?l?d?l?u +?l?l?l?l?l?d?l?s +?l?l?l?l?l?d?u?d +?l?l?l?l?l?d?u?l +?l?l?l?l?l?d?u?u +?l?l?l?l?l?d?s?d +?l?l?l?l?l?d?s?l +?l?l?l?l?l?d?s?s +?l?l?l?l?l?l?d?d +?l?l?l?l?l?l?d?l +?l?l?l?l?l?l?d?u +?l?l?l?l?l?l?d?s +?l?l?l?l?l?l?l?d +?l?l?l?l?l?l?l?l +?l?l?l?l?l?l?l?u +?l?l?l?l?l?l?l?s +?l?l?l?l?l?l?u?d +?l?l?l?l?l?l?u?l +?l?l?l?l?l?l?u?u +?l?l?l?l?l?l?u?s +?l?l?l?l?l?l?s?d +?l?l?l?l?l?l?s?l +?l?l?l?l?l?l?s?u +?l?l?l?l?l?l?s?s +?l?l?l?l?l?u?d?d +?l?l?l?l?l?u?d?l +?l?l?l?l?l?u?d?u +?l?l?l?l?l?u?l?d +?l?l?l?l?l?u?l?l +?l?l?l?l?l?u?l?u +?l?l?l?l?l?u?l?s +?l?l?l?l?l?u?u?d +?l?l?l?l?l?u?u?l +?l?l?l?l?l?u?u?u +?l?l?l?l?l?u?u?s +?l?l?l?l?l?u?s?l +?l?l?l?l?l?u?s?u +?l?l?l?l?l?u?s?s +?l?l?l?l?l?s?d?d +?l?l?l?l?l?s?d?l +?l?l?l?l?l?s?d?s +?l?l?l?l?l?s?l?d +?l?l?l?l?l?s?l?l +?l?l?l?l?l?s?l?u +?l?l?l?l?l?s?l?s +?l?l?l?l?l?s?u?l +?l?l?l?l?l?s?u?u +?l?l?l?l?l?s?u?s +?l?l?l?l?l?s?s?d +?l?l?l?l?l?s?s?l +?l?l?l?l?l?s?s?u +?l?l?l?l?l?s?s?s +?l?l?l?l?u?d?d?d +?l?l?l?l?u?d?d?l +?l?l?l?l?u?d?d?u +?l?l?l?l?u?d?l?d +?l?l?l?l?u?d?l?l +?l?l?l?l?u?d?l?u +?l?l?l?l?u?d?u?d +?l?l?l?l?u?d?u?l +?l?l?l?l?u?d?u?u +?l?l?l?l?u?l?d?d +?l?l?l?l?u?l?d?l +?l?l?l?l?u?l?d?u +?l?l?l?l?u?l?l?d +?l?l?l?l?u?l?l?l +?l?l?l?l?u?l?l?u +?l?l?l?l?u?l?l?s +?l?l?l?l?u?l?u?d +?l?l?l?l?u?l?u?l +?l?l?l?l?u?l?u?u +?l?l?l?l?u?l?u?s +?l?l?l?l?u?l?s?l +?l?l?l?l?u?l?s?u +?l?l?l?l?u?l?s?s +?l?l?l?l?u?u?d?d +?l?l?l?l?u?u?d?l +?l?l?l?l?u?u?d?u +?l?l?l?l?u?u?l?d +?l?l?l?l?u?u?l?l +?l?l?l?l?u?u?l?u +?l?l?l?l?u?u?l?s +?l?l?l?l?u?u?u?d +?l?l?l?l?u?u?u?l +?l?l?l?l?u?u?u?u +?l?l?l?l?u?u?u?s +?l?l?l?l?u?u?s?l +?l?l?l?l?u?u?s?u +?l?l?l?l?u?u?s?s +?l?l?l?l?u?s?l?l +?l?l?l?l?u?s?l?u +?l?l?l?l?u?s?l?s +?l?l?l?l?u?s?u?l +?l?l?l?l?u?s?u?u +?l?l?l?l?u?s?u?s +?l?l?l?l?u?s?s?l +?l?l?l?l?u?s?s?u +?l?l?l?l?u?s?s?s +?l?l?l?l?s?d?d?d +?l?l?l?l?s?d?d?l +?l?l?l?l?s?d?d?s +?l?l?l?l?s?d?l?d +?l?l?l?l?s?d?l?l +?l?l?l?l?s?d?l?s +?l?l?l?l?s?d?s?d +?l?l?l?l?s?d?s?l +?l?l?l?l?s?d?s?s +?l?l?l?l?s?l?d?d +?l?l?l?l?s?l?d?l +?l?l?l?l?s?l?d?s +?l?l?l?l?s?l?l?d +?l?l?l?l?s?l?l?l +?l?l?l?l?s?l?l?u +?l?l?l?l?s?l?l?s +?l?l?l?l?s?l?u?l +?l?l?l?l?s?l?u?u +?l?l?l?l?s?l?u?s +?l?l?l?l?s?l?s?d +?l?l?l?l?s?l?s?l +?l?l?l?l?s?l?s?u +?l?l?l?l?s?l?s?s +?l?l?l?l?s?u?l?l +?l?l?l?l?s?u?l?u +?l?l?l?l?s?u?l?s +?l?l?l?l?s?u?u?l +?l?l?l?l?s?u?u?u +?l?l?l?l?s?u?u?s +?l?l?l?l?s?u?s?l +?l?l?l?l?s?u?s?u +?l?l?l?l?s?u?s?s +?l?l?l?l?s?s?d?d +?l?l?l?l?s?s?d?l +?l?l?l?l?s?s?d?s +?l?l?l?l?s?s?l?d +?l?l?l?l?s?s?l?l +?l?l?l?l?s?s?l?u +?l?l?l?l?s?s?l?s +?l?l?l?l?s?s?u?l +?l?l?l?l?s?s?u?u +?l?l?l?l?s?s?u?s +?l?l?l?l?s?s?s?d +?l?l?l?l?s?s?s?l +?l?l?l?l?s?s?s?u +?l?l?l?l?s?s?s?s +?l?l?l?u?d?d?d?d +?l?l?l?u?d?d?d?l +?l?l?l?u?d?d?d?u +?l?l?l?u?d?d?l?d +?l?l?l?u?d?d?l?l +?l?l?l?u?d?d?l?u +?l?l?l?u?d?d?u?d +?l?l?l?u?d?d?u?l +?l?l?l?u?d?d?u?u +?l?l?l?u?d?l?d?d +?l?l?l?u?d?l?d?l +?l?l?l?u?d?l?d?u +?l?l?l?u?d?l?l?d +?l?l?l?u?d?l?l?l +?l?l?l?u?d?l?l?u +?l?l?l?u?d?l?u?d +?l?l?l?u?d?l?u?l +?l?l?l?u?d?l?u?u +?l?l?l?u?d?u?d?d +?l?l?l?u?d?u?d?l +?l?l?l?u?d?u?d?u +?l?l?l?u?d?u?l?d +?l?l?l?u?d?u?l?l +?l?l?l?u?d?u?l?u +?l?l?l?u?d?u?u?d +?l?l?l?u?d?u?u?l +?l?l?l?u?d?u?u?u +?l?l?l?u?l?d?d?d +?l?l?l?u?l?d?d?l +?l?l?l?u?l?d?d?u +?l?l?l?u?l?d?l?d +?l?l?l?u?l?d?l?l +?l?l?l?u?l?d?l?u +?l?l?l?u?l?d?u?d +?l?l?l?u?l?d?u?l +?l?l?l?u?l?d?u?u +?l?l?l?u?l?l?d?d +?l?l?l?u?l?l?d?l +?l?l?l?u?l?l?d?u +?l?l?l?u?l?l?l?d +?l?l?l?u?l?l?l?l +?l?l?l?u?l?l?l?u +?l?l?l?u?l?l?l?s +?l?l?l?u?l?l?u?d +?l?l?l?u?l?l?u?l +?l?l?l?u?l?l?u?u +?l?l?l?u?l?l?u?s +?l?l?l?u?l?l?s?l +?l?l?l?u?l?l?s?u +?l?l?l?u?l?l?s?s +?l?l?l?u?l?u?d?d +?l?l?l?u?l?u?d?l +?l?l?l?u?l?u?d?u +?l?l?l?u?l?u?l?d +?l?l?l?u?l?u?l?l +?l?l?l?u?l?u?l?u +?l?l?l?u?l?u?l?s +?l?l?l?u?l?u?u?d +?l?l?l?u?l?u?u?l +?l?l?l?u?l?u?u?u +?l?l?l?u?l?u?u?s +?l?l?l?u?l?u?s?l +?l?l?l?u?l?u?s?u +?l?l?l?u?l?u?s?s +?l?l?l?u?l?s?l?l +?l?l?l?u?l?s?l?u +?l?l?l?u?l?s?l?s +?l?l?l?u?l?s?u?l +?l?l?l?u?l?s?u?u +?l?l?l?u?l?s?u?s +?l?l?l?u?l?s?s?l +?l?l?l?u?l?s?s?u +?l?l?l?u?l?s?s?s +?l?l?l?u?u?d?d?d +?l?l?l?u?u?d?d?l +?l?l?l?u?u?d?d?u +?l?l?l?u?u?d?l?d +?l?l?l?u?u?d?l?l +?l?l?l?u?u?d?l?u +?l?l?l?u?u?d?u?d +?l?l?l?u?u?d?u?l +?l?l?l?u?u?d?u?u +?l?l?l?u?u?l?d?d +?l?l?l?u?u?l?d?l +?l?l?l?u?u?l?d?u +?l?l?l?u?u?l?l?d +?l?l?l?u?u?l?l?l +?l?l?l?u?u?l?l?u +?l?l?l?u?u?l?l?s +?l?l?l?u?u?l?u?d +?l?l?l?u?u?l?u?l +?l?l?l?u?u?l?u?u +?l?l?l?u?u?l?u?s +?l?l?l?u?u?l?s?l +?l?l?l?u?u?l?s?u +?l?l?l?u?u?l?s?s +?l?l?l?u?u?u?d?d +?l?l?l?u?u?u?d?l +?l?l?l?u?u?u?d?u +?l?l?l?u?u?u?l?d +?l?l?l?u?u?u?l?l +?l?l?l?u?u?u?l?u +?l?l?l?u?u?u?l?s +?l?l?l?u?u?u?u?d +?l?l?l?u?u?u?u?l +?l?l?l?u?u?u?u?u +?l?l?l?u?u?u?u?s +?l?l?l?u?u?u?s?l +?l?l?l?u?u?u?s?u +?l?l?l?u?u?u?s?s +?l?l?l?u?u?s?l?l +?l?l?l?u?u?s?l?u +?l?l?l?u?u?s?l?s +?l?l?l?u?u?s?u?l +?l?l?l?u?u?s?u?u +?l?l?l?u?u?s?u?s +?l?l?l?u?u?s?s?l +?l?l?l?u?u?s?s?u +?l?l?l?u?u?s?s?s +?l?l?l?u?s?l?l?l +?l?l?l?u?s?l?l?u +?l?l?l?u?s?l?l?s +?l?l?l?u?s?l?u?l +?l?l?l?u?s?l?u?u +?l?l?l?u?s?l?u?s +?l?l?l?u?s?l?s?l +?l?l?l?u?s?l?s?u +?l?l?l?u?s?l?s?s +?l?l?l?u?s?u?l?l +?l?l?l?u?s?u?l?u +?l?l?l?u?s?u?l?s +?l?l?l?u?s?u?u?l +?l?l?l?u?s?u?u?u +?l?l?l?u?s?u?u?s +?l?l?l?u?s?u?s?l +?l?l?l?u?s?u?s?u +?l?l?l?u?s?u?s?s +?l?l?l?u?s?s?l?l +?l?l?l?u?s?s?l?u +?l?l?l?u?s?s?l?s +?l?l?l?u?s?s?u?l +?l?l?l?u?s?s?u?u +?l?l?l?u?s?s?u?s +?l?l?l?u?s?s?s?l +?l?l?l?u?s?s?s?u +?l?l?l?u?s?s?s?s +?l?l?l?s?d?d?d?d +?l?l?l?s?d?d?d?l +?l?l?l?s?d?d?d?s +?l?l?l?s?d?d?l?d +?l?l?l?s?d?d?l?l +?l?l?l?s?d?d?l?s +?l?l?l?s?d?d?s?d +?l?l?l?s?d?d?s?l +?l?l?l?s?d?d?s?s +?l?l?l?s?d?l?d?d +?l?l?l?s?d?l?d?l +?l?l?l?s?d?l?d?s +?l?l?l?s?d?l?l?d +?l?l?l?s?d?l?l?l +?l?l?l?s?d?l?l?s +?l?l?l?s?d?l?s?d +?l?l?l?s?d?l?s?l +?l?l?l?s?d?l?s?s +?l?l?l?s?d?s?d?d +?l?l?l?s?d?s?d?l +?l?l?l?s?d?s?d?s +?l?l?l?s?d?s?l?d +?l?l?l?s?d?s?l?l +?l?l?l?s?d?s?l?s +?l?l?l?s?d?s?s?d +?l?l?l?s?d?s?s?l +?l?l?l?s?d?s?s?s +?l?l?l?s?l?d?d?d +?l?l?l?s?l?d?d?l +?l?l?l?s?l?d?d?s +?l?l?l?s?l?d?l?d +?l?l?l?s?l?d?l?l +?l?l?l?s?l?d?l?s +?l?l?l?s?l?d?s?d +?l?l?l?s?l?d?s?l +?l?l?l?s?l?d?s?s +?l?l?l?s?l?l?d?d +?l?l?l?s?l?l?d?l +?l?l?l?s?l?l?d?s +?l?l?l?s?l?l?l?d +?l?l?l?s?l?l?l?l +?l?l?l?s?l?l?l?u +?l?l?l?s?l?l?l?s +?l?l?l?s?l?l?u?l +?l?l?l?s?l?l?u?u +?l?l?l?s?l?l?u?s +?l?l?l?s?l?l?s?d +?l?l?l?s?l?l?s?l +?l?l?l?s?l?l?s?u +?l?l?l?s?l?l?s?s +?l?l?l?s?l?u?l?l +?l?l?l?s?l?u?l?u +?l?l?l?s?l?u?l?s +?l?l?l?s?l?u?u?l +?l?l?l?s?l?u?u?u +?l?l?l?s?l?u?u?s +?l?l?l?s?l?u?s?l +?l?l?l?s?l?u?s?u +?l?l?l?s?l?u?s?s +?l?l?l?s?l?s?d?d +?l?l?l?s?l?s?d?l +?l?l?l?s?l?s?d?s +?l?l?l?s?l?s?l?d +?l?l?l?s?l?s?l?l +?l?l?l?s?l?s?l?u +?l?l?l?s?l?s?l?s +?l?l?l?s?l?s?u?l +?l?l?l?s?l?s?u?u +?l?l?l?s?l?s?u?s +?l?l?l?s?l?s?s?d +?l?l?l?s?l?s?s?l +?l?l?l?s?l?s?s?u +?l?l?l?s?l?s?s?s +?l?l?l?s?u?l?l?l +?l?l?l?s?u?l?l?u +?l?l?l?s?u?l?l?s +?l?l?l?s?u?l?u?l +?l?l?l?s?u?l?u?u +?l?l?l?s?u?l?u?s +?l?l?l?s?u?l?s?l +?l?l?l?s?u?l?s?u +?l?l?l?s?u?l?s?s +?l?l?l?s?u?u?l?l +?l?l?l?s?u?u?l?u +?l?l?l?s?u?u?l?s +?l?l?l?s?u?u?u?l +?l?l?l?s?u?u?u?u +?l?l?l?s?u?u?u?s +?l?l?l?s?u?u?s?l +?l?l?l?s?u?u?s?u +?l?l?l?s?u?u?s?s +?l?l?l?s?u?s?l?l +?l?l?l?s?u?s?l?u +?l?l?l?s?u?s?l?s +?l?l?l?s?u?s?u?l +?l?l?l?s?u?s?u?u +?l?l?l?s?u?s?u?s +?l?l?l?s?u?s?s?l +?l?l?l?s?u?s?s?u +?l?l?l?s?u?s?s?s +?l?l?l?s?s?d?d?d +?l?l?l?s?s?d?d?l +?l?l?l?s?s?d?d?s +?l?l?l?s?s?d?l?d +?l?l?l?s?s?d?l?l +?l?l?l?s?s?d?l?s +?l?l?l?s?s?d?s?d +?l?l?l?s?s?d?s?l +?l?l?l?s?s?d?s?s +?l?l?l?s?s?l?d?d +?l?l?l?s?s?l?d?l +?l?l?l?s?s?l?d?s +?l?l?l?s?s?l?l?d +?l?l?l?s?s?l?l?l +?l?l?l?s?s?l?l?u +?l?l?l?s?s?l?l?s +?l?l?l?s?s?l?u?l +?l?l?l?s?s?l?u?u +?l?l?l?s?s?l?u?s +?l?l?l?s?s?l?s?d +?l?l?l?s?s?l?s?l +?l?l?l?s?s?l?s?u +?l?l?l?s?s?l?s?s +?l?l?l?s?s?u?l?l +?l?l?l?s?s?u?l?u +?l?l?l?s?s?u?l?s +?l?l?l?s?s?u?u?l +?l?l?l?s?s?u?u?u +?l?l?l?s?s?u?u?s +?l?l?l?s?s?u?s?l +?l?l?l?s?s?u?s?u +?l?l?l?s?s?u?s?s +?l?l?l?s?s?s?d?d +?l?l?l?s?s?s?d?l +?l?l?l?s?s?s?d?s +?l?l?l?s?s?s?l?d +?l?l?l?s?s?s?l?l +?l?l?l?s?s?s?l?u +?l?l?l?s?s?s?l?s +?l?l?l?s?s?s?u?l +?l?l?l?s?s?s?u?u +?l?l?l?s?s?s?u?s +?l?l?l?s?s?s?s?d +?l?l?l?s?s?s?s?l +?l?l?l?s?s?s?s?u +?l?l?l?s?s?s?s?s +?l?l?u?d?d?d?d?d +?l?l?u?d?d?d?d?l +?l?l?u?d?d?d?d?u +?l?l?u?d?d?d?l?d +?l?l?u?d?d?d?l?l +?l?l?u?d?d?d?l?u +?l?l?u?d?d?d?u?d +?l?l?u?d?d?d?u?l +?l?l?u?d?d?d?u?u +?l?l?u?d?d?l?d?d +?l?l?u?d?d?l?d?l +?l?l?u?d?d?l?d?u +?l?l?u?d?d?l?l?d +?l?l?u?d?d?l?l?l +?l?l?u?d?d?l?l?u +?l?l?u?d?d?l?u?d +?l?l?u?d?d?l?u?l +?l?l?u?d?d?l?u?u +?l?l?u?d?d?u?d?d +?l?l?u?d?d?u?d?l +?l?l?u?d?d?u?d?u +?l?l?u?d?d?u?l?d +?l?l?u?d?d?u?l?l +?l?l?u?d?d?u?l?u +?l?l?u?d?d?u?u?d +?l?l?u?d?d?u?u?l +?l?l?u?d?d?u?u?u +?l?l?u?d?l?d?d?d +?l?l?u?d?l?d?d?l +?l?l?u?d?l?d?d?u +?l?l?u?d?l?d?l?d +?l?l?u?d?l?d?l?l +?l?l?u?d?l?d?l?u +?l?l?u?d?l?d?u?d +?l?l?u?d?l?d?u?l +?l?l?u?d?l?d?u?u +?l?l?u?d?l?l?d?d +?l?l?u?d?l?l?d?l +?l?l?u?d?l?l?d?u +?l?l?u?d?l?l?l?d +?l?l?u?d?l?l?l?l +?l?l?u?d?l?l?l?u +?l?l?u?d?l?l?u?d +?l?l?u?d?l?l?u?l +?l?l?u?d?l?l?u?u +?l?l?u?d?l?u?d?d +?l?l?u?d?l?u?d?l +?l?l?u?d?l?u?d?u +?l?l?u?d?l?u?l?d +?l?l?u?d?l?u?l?l +?l?l?u?d?l?u?l?u +?l?l?u?d?l?u?u?d +?l?l?u?d?l?u?u?l +?l?l?u?d?l?u?u?u +?l?l?u?d?u?d?d?d +?l?l?u?d?u?d?d?l +?l?l?u?d?u?d?d?u +?l?l?u?d?u?d?l?d +?l?l?u?d?u?d?l?l +?l?l?u?d?u?d?l?u +?l?l?u?d?u?d?u?d +?l?l?u?d?u?d?u?l +?l?l?u?d?u?d?u?u +?l?l?u?d?u?l?d?d +?l?l?u?d?u?l?d?l +?l?l?u?d?u?l?d?u +?l?l?u?d?u?l?l?d +?l?l?u?d?u?l?l?l +?l?l?u?d?u?l?l?u +?l?l?u?d?u?l?u?d +?l?l?u?d?u?l?u?l +?l?l?u?d?u?l?u?u +?l?l?u?d?u?u?d?d +?l?l?u?d?u?u?d?l +?l?l?u?d?u?u?d?u +?l?l?u?d?u?u?l?d +?l?l?u?d?u?u?l?l +?l?l?u?d?u?u?l?u +?l?l?u?d?u?u?u?d +?l?l?u?d?u?u?u?l +?l?l?u?d?u?u?u?u +?l?l?u?l?d?d?d?d +?l?l?u?l?d?d?d?l +?l?l?u?l?d?d?d?u +?l?l?u?l?d?d?l?d +?l?l?u?l?d?d?l?l +?l?l?u?l?d?d?l?u +?l?l?u?l?d?d?u?d +?l?l?u?l?d?d?u?l +?l?l?u?l?d?d?u?u +?l?l?u?l?d?l?d?d +?l?l?u?l?d?l?d?l +?l?l?u?l?d?l?d?u +?l?l?u?l?d?l?l?d +?l?l?u?l?d?l?l?l +?l?l?u?l?d?l?l?u +?l?l?u?l?d?l?u?d +?l?l?u?l?d?l?u?l +?l?l?u?l?d?l?u?u +?l?l?u?l?d?u?d?d +?l?l?u?l?d?u?d?l +?l?l?u?l?d?u?d?u +?l?l?u?l?d?u?l?d +?l?l?u?l?d?u?l?l +?l?l?u?l?d?u?l?u +?l?l?u?l?d?u?u?d +?l?l?u?l?d?u?u?l +?l?l?u?l?d?u?u?u +?l?l?u?l?l?d?d?d +?l?l?u?l?l?d?d?l +?l?l?u?l?l?d?d?u +?l?l?u?l?l?d?l?d +?l?l?u?l?l?d?l?l +?l?l?u?l?l?d?l?u +?l?l?u?l?l?d?u?d +?l?l?u?l?l?d?u?l +?l?l?u?l?l?d?u?u +?l?l?u?l?l?l?d?d +?l?l?u?l?l?l?d?l +?l?l?u?l?l?l?d?u +?l?l?u?l?l?l?l?d +?l?l?u?l?l?l?l?l +?l?l?u?l?l?l?l?u +?l?l?u?l?l?l?l?s +?l?l?u?l?l?l?u?d +?l?l?u?l?l?l?u?l +?l?l?u?l?l?l?u?u +?l?l?u?l?l?l?u?s +?l?l?u?l?l?l?s?l +?l?l?u?l?l?l?s?u +?l?l?u?l?l?l?s?s +?l?l?u?l?l?u?d?d +?l?l?u?l?l?u?d?l +?l?l?u?l?l?u?d?u +?l?l?u?l?l?u?l?d +?l?l?u?l?l?u?l?l +?l?l?u?l?l?u?l?u +?l?l?u?l?l?u?l?s +?l?l?u?l?l?u?u?d +?l?l?u?l?l?u?u?l +?l?l?u?l?l?u?u?u +?l?l?u?l?l?u?u?s +?l?l?u?l?l?u?s?l +?l?l?u?l?l?u?s?u +?l?l?u?l?l?u?s?s +?l?l?u?l?l?s?l?l +?l?l?u?l?l?s?l?u +?l?l?u?l?l?s?l?s +?l?l?u?l?l?s?u?l +?l?l?u?l?l?s?u?u +?l?l?u?l?l?s?u?s +?l?l?u?l?l?s?s?l +?l?l?u?l?l?s?s?u +?l?l?u?l?l?s?s?s +?l?l?u?l?u?d?d?d +?l?l?u?l?u?d?d?l +?l?l?u?l?u?d?d?u +?l?l?u?l?u?d?l?d +?l?l?u?l?u?d?l?l +?l?l?u?l?u?d?l?u +?l?l?u?l?u?d?u?d +?l?l?u?l?u?d?u?l +?l?l?u?l?u?d?u?u +?l?l?u?l?u?l?d?d +?l?l?u?l?u?l?d?l +?l?l?u?l?u?l?d?u +?l?l?u?l?u?l?l?d +?l?l?u?l?u?l?l?l +?l?l?u?l?u?l?l?u +?l?l?u?l?u?l?l?s +?l?l?u?l?u?l?u?d +?l?l?u?l?u?l?u?l +?l?l?u?l?u?l?u?u +?l?l?u?l?u?l?u?s +?l?l?u?l?u?l?s?l +?l?l?u?l?u?l?s?u +?l?l?u?l?u?l?s?s +?l?l?u?l?u?u?d?d +?l?l?u?l?u?u?d?l +?l?l?u?l?u?u?d?u +?l?l?u?l?u?u?l?d +?l?l?u?l?u?u?l?l +?l?l?u?l?u?u?l?u +?l?l?u?l?u?u?l?s +?l?l?u?l?u?u?u?d +?l?l?u?l?u?u?u?l +?l?l?u?l?u?u?u?u +?l?l?u?l?u?u?u?s +?l?l?u?l?u?u?s?l +?l?l?u?l?u?u?s?u +?l?l?u?l?u?u?s?s +?l?l?u?l?u?s?l?l +?l?l?u?l?u?s?l?u +?l?l?u?l?u?s?l?s +?l?l?u?l?u?s?u?l +?l?l?u?l?u?s?u?u +?l?l?u?l?u?s?u?s +?l?l?u?l?u?s?s?l +?l?l?u?l?u?s?s?u +?l?l?u?l?u?s?s?s +?l?l?u?l?s?l?l?l +?l?l?u?l?s?l?l?u +?l?l?u?l?s?l?l?s +?l?l?u?l?s?l?u?l +?l?l?u?l?s?l?u?u +?l?l?u?l?s?l?u?s +?l?l?u?l?s?l?s?l +?l?l?u?l?s?l?s?u +?l?l?u?l?s?l?s?s +?l?l?u?l?s?u?l?l +?l?l?u?l?s?u?l?u +?l?l?u?l?s?u?l?s +?l?l?u?l?s?u?u?l +?l?l?u?l?s?u?u?u +?l?l?u?l?s?u?u?s +?l?l?u?l?s?u?s?l +?l?l?u?l?s?u?s?u +?l?l?u?l?s?u?s?s +?l?l?u?l?s?s?l?l +?l?l?u?l?s?s?l?u +?l?l?u?l?s?s?l?s +?l?l?u?l?s?s?u?l +?l?l?u?l?s?s?u?u +?l?l?u?l?s?s?u?s +?l?l?u?l?s?s?s?l +?l?l?u?l?s?s?s?u +?l?l?u?l?s?s?s?s +?l?l?u?u?d?d?d?d +?l?l?u?u?d?d?d?l +?l?l?u?u?d?d?d?u +?l?l?u?u?d?d?l?d +?l?l?u?u?d?d?l?l +?l?l?u?u?d?d?l?u +?l?l?u?u?d?d?u?d +?l?l?u?u?d?d?u?l +?l?l?u?u?d?d?u?u +?l?l?u?u?d?l?d?d +?l?l?u?u?d?l?d?l +?l?l?u?u?d?l?d?u +?l?l?u?u?d?l?l?d +?l?l?u?u?d?l?l?l +?l?l?u?u?d?l?l?u +?l?l?u?u?d?l?u?d +?l?l?u?u?d?l?u?l +?l?l?u?u?d?l?u?u +?l?l?u?u?d?u?d?d +?l?l?u?u?d?u?d?l +?l?l?u?u?d?u?d?u +?l?l?u?u?d?u?l?d +?l?l?u?u?d?u?l?l +?l?l?u?u?d?u?l?u +?l?l?u?u?d?u?u?d +?l?l?u?u?d?u?u?l +?l?l?u?u?d?u?u?u +?l?l?u?u?l?d?d?d +?l?l?u?u?l?d?d?l +?l?l?u?u?l?d?d?u +?l?l?u?u?l?d?l?d +?l?l?u?u?l?d?l?l +?l?l?u?u?l?d?l?u +?l?l?u?u?l?d?u?d +?l?l?u?u?l?d?u?l +?l?l?u?u?l?d?u?u +?l?l?u?u?l?l?d?d +?l?l?u?u?l?l?d?l +?l?l?u?u?l?l?d?u +?l?l?u?u?l?l?l?d +?l?l?u?u?l?l?l?l +?l?l?u?u?l?l?l?u +?l?l?u?u?l?l?l?s +?l?l?u?u?l?l?u?d +?l?l?u?u?l?l?u?l +?l?l?u?u?l?l?u?u +?l?l?u?u?l?l?u?s +?l?l?u?u?l?l?s?l +?l?l?u?u?l?l?s?u +?l?l?u?u?l?l?s?s +?l?l?u?u?l?u?d?d +?l?l?u?u?l?u?d?l +?l?l?u?u?l?u?d?u +?l?l?u?u?l?u?l?d +?l?l?u?u?l?u?l?l +?l?l?u?u?l?u?l?u +?l?l?u?u?l?u?l?s +?l?l?u?u?l?u?u?d +?l?l?u?u?l?u?u?l +?l?l?u?u?l?u?u?u +?l?l?u?u?l?u?u?s +?l?l?u?u?l?u?s?l +?l?l?u?u?l?u?s?u +?l?l?u?u?l?u?s?s +?l?l?u?u?l?s?l?l +?l?l?u?u?l?s?l?u +?l?l?u?u?l?s?l?s +?l?l?u?u?l?s?u?l +?l?l?u?u?l?s?u?u +?l?l?u?u?l?s?u?s +?l?l?u?u?l?s?s?l +?l?l?u?u?l?s?s?u +?l?l?u?u?l?s?s?s +?l?l?u?u?u?d?d?d +?l?l?u?u?u?d?d?l +?l?l?u?u?u?d?d?u +?l?l?u?u?u?d?l?d +?l?l?u?u?u?d?l?l +?l?l?u?u?u?d?l?u +?l?l?u?u?u?d?u?d +?l?l?u?u?u?d?u?l +?l?l?u?u?u?d?u?u +?l?l?u?u?u?l?d?d +?l?l?u?u?u?l?d?l +?l?l?u?u?u?l?d?u +?l?l?u?u?u?l?l?d +?l?l?u?u?u?l?l?l +?l?l?u?u?u?l?l?u +?l?l?u?u?u?l?l?s +?l?l?u?u?u?l?u?d +?l?l?u?u?u?l?u?l +?l?l?u?u?u?l?u?u +?l?l?u?u?u?l?u?s +?l?l?u?u?u?l?s?l +?l?l?u?u?u?l?s?u +?l?l?u?u?u?l?s?s +?l?l?u?u?u?u?d?d +?l?l?u?u?u?u?d?l +?l?l?u?u?u?u?d?u +?l?l?u?u?u?u?l?d +?l?l?u?u?u?u?l?l +?l?l?u?u?u?u?l?u +?l?l?u?u?u?u?l?s +?l?l?u?u?u?u?u?d +?l?l?u?u?u?u?u?l +?l?l?u?u?u?u?u?u +?l?l?u?u?u?u?u?s +?l?l?u?u?u?u?s?l +?l?l?u?u?u?u?s?u +?l?l?u?u?u?u?s?s +?l?l?u?u?u?s?l?l +?l?l?u?u?u?s?l?u +?l?l?u?u?u?s?l?s +?l?l?u?u?u?s?u?l +?l?l?u?u?u?s?u?u +?l?l?u?u?u?s?u?s +?l?l?u?u?u?s?s?l +?l?l?u?u?u?s?s?u +?l?l?u?u?u?s?s?s +?l?l?u?u?s?l?l?l +?l?l?u?u?s?l?l?u +?l?l?u?u?s?l?l?s +?l?l?u?u?s?l?u?l +?l?l?u?u?s?l?u?u +?l?l?u?u?s?l?u?s +?l?l?u?u?s?l?s?l +?l?l?u?u?s?l?s?u +?l?l?u?u?s?l?s?s +?l?l?u?u?s?u?l?l +?l?l?u?u?s?u?l?u +?l?l?u?u?s?u?l?s +?l?l?u?u?s?u?u?l +?l?l?u?u?s?u?u?u +?l?l?u?u?s?u?u?s +?l?l?u?u?s?u?s?l +?l?l?u?u?s?u?s?u +?l?l?u?u?s?u?s?s +?l?l?u?u?s?s?l?l +?l?l?u?u?s?s?l?u +?l?l?u?u?s?s?l?s +?l?l?u?u?s?s?u?l +?l?l?u?u?s?s?u?u +?l?l?u?u?s?s?u?s +?l?l?u?u?s?s?s?l +?l?l?u?u?s?s?s?u +?l?l?u?u?s?s?s?s +?l?l?u?s?l?l?l?l +?l?l?u?s?l?l?l?u +?l?l?u?s?l?l?l?s +?l?l?u?s?l?l?u?l +?l?l?u?s?l?l?u?u +?l?l?u?s?l?l?u?s +?l?l?u?s?l?l?s?l +?l?l?u?s?l?l?s?u +?l?l?u?s?l?l?s?s +?l?l?u?s?l?u?l?l +?l?l?u?s?l?u?l?u +?l?l?u?s?l?u?l?s +?l?l?u?s?l?u?u?l +?l?l?u?s?l?u?u?u +?l?l?u?s?l?u?u?s +?l?l?u?s?l?u?s?l +?l?l?u?s?l?u?s?u +?l?l?u?s?l?u?s?s +?l?l?u?s?l?s?l?l +?l?l?u?s?l?s?l?u +?l?l?u?s?l?s?l?s +?l?l?u?s?l?s?u?l +?l?l?u?s?l?s?u?u +?l?l?u?s?l?s?u?s +?l?l?u?s?l?s?s?l +?l?l?u?s?l?s?s?u +?l?l?u?s?l?s?s?s +?l?l?u?s?u?l?l?l +?l?l?u?s?u?l?l?u +?l?l?u?s?u?l?l?s +?l?l?u?s?u?l?u?l +?l?l?u?s?u?l?u?u +?l?l?u?s?u?l?u?s +?l?l?u?s?u?l?s?l +?l?l?u?s?u?l?s?u +?l?l?u?s?u?l?s?s +?l?l?u?s?u?u?l?l +?l?l?u?s?u?u?l?u +?l?l?u?s?u?u?l?s +?l?l?u?s?u?u?u?l +?l?l?u?s?u?u?u?u +?l?l?u?s?u?u?u?s +?l?l?u?s?u?u?s?l +?l?l?u?s?u?u?s?u +?l?l?u?s?u?u?s?s +?l?l?u?s?u?s?l?l +?l?l?u?s?u?s?l?u +?l?l?u?s?u?s?l?s +?l?l?u?s?u?s?u?l +?l?l?u?s?u?s?u?u +?l?l?u?s?u?s?u?s +?l?l?u?s?u?s?s?l +?l?l?u?s?u?s?s?u +?l?l?u?s?u?s?s?s +?l?l?u?s?s?l?l?l +?l?l?u?s?s?l?l?u +?l?l?u?s?s?l?l?s +?l?l?u?s?s?l?u?l +?l?l?u?s?s?l?u?u +?l?l?u?s?s?l?u?s +?l?l?u?s?s?l?s?l +?l?l?u?s?s?l?s?u +?l?l?u?s?s?l?s?s +?l?l?u?s?s?u?l?l +?l?l?u?s?s?u?l?u +?l?l?u?s?s?u?l?s +?l?l?u?s?s?u?u?l +?l?l?u?s?s?u?u?u +?l?l?u?s?s?u?u?s +?l?l?u?s?s?u?s?l +?l?l?u?s?s?u?s?u +?l?l?u?s?s?u?s?s +?l?l?u?s?s?s?l?l +?l?l?u?s?s?s?l?u +?l?l?u?s?s?s?l?s +?l?l?u?s?s?s?u?l +?l?l?u?s?s?s?u?u +?l?l?u?s?s?s?u?s +?l?l?u?s?s?s?s?l +?l?l?u?s?s?s?s?u +?l?l?u?s?s?s?s?s +?l?l?s?d?d?d?d?d +?l?l?s?d?d?d?d?l +?l?l?s?d?d?d?d?s +?l?l?s?d?d?d?l?d +?l?l?s?d?d?d?l?l +?l?l?s?d?d?d?l?s +?l?l?s?d?d?d?s?d +?l?l?s?d?d?d?s?l +?l?l?s?d?d?d?s?s +?l?l?s?d?d?l?d?d +?l?l?s?d?d?l?d?l +?l?l?s?d?d?l?d?s +?l?l?s?d?d?l?l?d +?l?l?s?d?d?l?l?l +?l?l?s?d?d?l?l?s +?l?l?s?d?d?l?s?d +?l?l?s?d?d?l?s?l +?l?l?s?d?d?l?s?s +?l?l?s?d?d?s?d?d +?l?l?s?d?d?s?d?l +?l?l?s?d?d?s?d?s +?l?l?s?d?d?s?l?d +?l?l?s?d?d?s?l?l +?l?l?s?d?d?s?l?s +?l?l?s?d?d?s?s?d +?l?l?s?d?d?s?s?l +?l?l?s?d?d?s?s?s +?l?l?s?d?l?d?d?d +?l?l?s?d?l?d?d?l +?l?l?s?d?l?d?d?s +?l?l?s?d?l?d?l?d +?l?l?s?d?l?d?l?l +?l?l?s?d?l?d?l?s +?l?l?s?d?l?d?s?d +?l?l?s?d?l?d?s?l +?l?l?s?d?l?d?s?s +?l?l?s?d?l?l?d?d +?l?l?s?d?l?l?d?l +?l?l?s?d?l?l?d?s +?l?l?s?d?l?l?l?d +?l?l?s?d?l?l?l?l +?l?l?s?d?l?l?l?s +?l?l?s?d?l?l?s?d +?l?l?s?d?l?l?s?l +?l?l?s?d?l?l?s?s +?l?l?s?d?l?s?d?d +?l?l?s?d?l?s?d?l +?l?l?s?d?l?s?d?s +?l?l?s?d?l?s?l?d +?l?l?s?d?l?s?l?l +?l?l?s?d?l?s?l?s +?l?l?s?d?l?s?s?d +?l?l?s?d?l?s?s?l +?l?l?s?d?l?s?s?s +?l?l?s?d?s?d?d?d +?l?l?s?d?s?d?d?l +?l?l?s?d?s?d?d?s +?l?l?s?d?s?d?l?d +?l?l?s?d?s?d?l?l +?l?l?s?d?s?d?l?s +?l?l?s?d?s?d?s?d +?l?l?s?d?s?d?s?l +?l?l?s?d?s?d?s?s +?l?l?s?d?s?l?d?d +?l?l?s?d?s?l?d?l +?l?l?s?d?s?l?d?s +?l?l?s?d?s?l?l?d +?l?l?s?d?s?l?l?l +?l?l?s?d?s?l?l?s +?l?l?s?d?s?l?s?d +?l?l?s?d?s?l?s?l +?l?l?s?d?s?l?s?s +?l?l?s?d?s?s?d?d +?l?l?s?d?s?s?d?l +?l?l?s?d?s?s?d?s +?l?l?s?d?s?s?l?d +?l?l?s?d?s?s?l?l +?l?l?s?d?s?s?l?s +?l?l?s?d?s?s?s?d +?l?l?s?d?s?s?s?l +?l?l?s?d?s?s?s?s +?l?l?s?l?d?d?d?d +?l?l?s?l?d?d?d?l +?l?l?s?l?d?d?d?s +?l?l?s?l?d?d?l?d +?l?l?s?l?d?d?l?l +?l?l?s?l?d?d?l?s +?l?l?s?l?d?d?s?d +?l?l?s?l?d?d?s?l +?l?l?s?l?d?d?s?s +?l?l?s?l?d?l?d?d +?l?l?s?l?d?l?d?l +?l?l?s?l?d?l?d?s +?l?l?s?l?d?l?l?d +?l?l?s?l?d?l?l?l +?l?l?s?l?d?l?l?s +?l?l?s?l?d?l?s?d +?l?l?s?l?d?l?s?l +?l?l?s?l?d?l?s?s +?l?l?s?l?d?s?d?d +?l?l?s?l?d?s?d?l +?l?l?s?l?d?s?d?s +?l?l?s?l?d?s?l?d +?l?l?s?l?d?s?l?l +?l?l?s?l?d?s?l?s +?l?l?s?l?d?s?s?d +?l?l?s?l?d?s?s?l +?l?l?s?l?d?s?s?s +?l?l?s?l?l?d?d?d +?l?l?s?l?l?d?d?l +?l?l?s?l?l?d?d?s +?l?l?s?l?l?d?l?d +?l?l?s?l?l?d?l?l +?l?l?s?l?l?d?l?s +?l?l?s?l?l?d?s?d +?l?l?s?l?l?d?s?l +?l?l?s?l?l?d?s?s +?l?l?s?l?l?l?d?d +?l?l?s?l?l?l?d?l +?l?l?s?l?l?l?d?s +?l?l?s?l?l?l?l?d +?l?l?s?l?l?l?l?l +?l?l?s?l?l?l?l?u +?l?l?s?l?l?l?l?s +?l?l?s?l?l?l?u?l +?l?l?s?l?l?l?u?u +?l?l?s?l?l?l?u?s +?l?l?s?l?l?l?s?d +?l?l?s?l?l?l?s?l +?l?l?s?l?l?l?s?u +?l?l?s?l?l?l?s?s +?l?l?s?l?l?u?l?l +?l?l?s?l?l?u?l?u +?l?l?s?l?l?u?l?s +?l?l?s?l?l?u?u?l +?l?l?s?l?l?u?u?u +?l?l?s?l?l?u?u?s +?l?l?s?l?l?u?s?l +?l?l?s?l?l?u?s?u +?l?l?s?l?l?u?s?s +?l?l?s?l?l?s?d?d +?l?l?s?l?l?s?d?l +?l?l?s?l?l?s?d?s +?l?l?s?l?l?s?l?d +?l?l?s?l?l?s?l?l +?l?l?s?l?l?s?l?u +?l?l?s?l?l?s?l?s +?l?l?s?l?l?s?u?l +?l?l?s?l?l?s?u?u +?l?l?s?l?l?s?u?s +?l?l?s?l?l?s?s?d +?l?l?s?l?l?s?s?l +?l?l?s?l?l?s?s?u +?l?l?s?l?l?s?s?s +?l?l?s?l?u?l?l?l +?l?l?s?l?u?l?l?u +?l?l?s?l?u?l?l?s +?l?l?s?l?u?l?u?l +?l?l?s?l?u?l?u?u +?l?l?s?l?u?l?u?s +?l?l?s?l?u?l?s?l +?l?l?s?l?u?l?s?u +?l?l?s?l?u?l?s?s +?l?l?s?l?u?u?l?l +?l?l?s?l?u?u?l?u +?l?l?s?l?u?u?l?s +?l?l?s?l?u?u?u?l +?l?l?s?l?u?u?u?u +?l?l?s?l?u?u?u?s +?l?l?s?l?u?u?s?l +?l?l?s?l?u?u?s?u +?l?l?s?l?u?u?s?s +?l?l?s?l?u?s?l?l +?l?l?s?l?u?s?l?u +?l?l?s?l?u?s?l?s +?l?l?s?l?u?s?u?l +?l?l?s?l?u?s?u?u +?l?l?s?l?u?s?u?s +?l?l?s?l?u?s?s?l +?l?l?s?l?u?s?s?u +?l?l?s?l?u?s?s?s +?l?l?s?l?s?d?d?d +?l?l?s?l?s?d?d?l +?l?l?s?l?s?d?d?s +?l?l?s?l?s?d?l?d +?l?l?s?l?s?d?l?l +?l?l?s?l?s?d?l?s +?l?l?s?l?s?d?s?d +?l?l?s?l?s?d?s?l +?l?l?s?l?s?d?s?s +?l?l?s?l?s?l?d?d +?l?l?s?l?s?l?d?l +?l?l?s?l?s?l?d?s +?l?l?s?l?s?l?l?d +?l?l?s?l?s?l?l?l +?l?l?s?l?s?l?l?u +?l?l?s?l?s?l?l?s +?l?l?s?l?s?l?u?l +?l?l?s?l?s?l?u?u +?l?l?s?l?s?l?u?s +?l?l?s?l?s?l?s?d +?l?l?s?l?s?l?s?l +?l?l?s?l?s?l?s?u +?l?l?s?l?s?l?s?s +?l?l?s?l?s?u?l?l +?l?l?s?l?s?u?l?u +?l?l?s?l?s?u?l?s +?l?l?s?l?s?u?u?l +?l?l?s?l?s?u?u?u +?l?l?s?l?s?u?u?s +?l?l?s?l?s?u?s?l +?l?l?s?l?s?u?s?u +?l?l?s?l?s?u?s?s +?l?l?s?l?s?s?d?d +?l?l?s?l?s?s?d?l +?l?l?s?l?s?s?d?s +?l?l?s?l?s?s?l?d +?l?l?s?l?s?s?l?l +?l?l?s?l?s?s?l?u +?l?l?s?l?s?s?l?s +?l?l?s?l?s?s?u?l +?l?l?s?l?s?s?u?u +?l?l?s?l?s?s?u?s +?l?l?s?l?s?s?s?d +?l?l?s?l?s?s?s?l +?l?l?s?l?s?s?s?u +?l?l?s?l?s?s?s?s +?l?l?s?u?l?l?l?l +?l?l?s?u?l?l?l?u +?l?l?s?u?l?l?l?s +?l?l?s?u?l?l?u?l +?l?l?s?u?l?l?u?u +?l?l?s?u?l?l?u?s +?l?l?s?u?l?l?s?l +?l?l?s?u?l?l?s?u +?l?l?s?u?l?l?s?s +?l?l?s?u?l?u?l?l +?l?l?s?u?l?u?l?u +?l?l?s?u?l?u?l?s +?l?l?s?u?l?u?u?l +?l?l?s?u?l?u?u?u +?l?l?s?u?l?u?u?s +?l?l?s?u?l?u?s?l +?l?l?s?u?l?u?s?u +?l?l?s?u?l?u?s?s +?l?l?s?u?l?s?l?l +?l?l?s?u?l?s?l?u +?l?l?s?u?l?s?l?s +?l?l?s?u?l?s?u?l +?l?l?s?u?l?s?u?u +?l?l?s?u?l?s?u?s +?l?l?s?u?l?s?s?l +?l?l?s?u?l?s?s?u +?l?l?s?u?l?s?s?s +?l?l?s?u?u?l?l?l +?l?l?s?u?u?l?l?u +?l?l?s?u?u?l?l?s +?l?l?s?u?u?l?u?l +?l?l?s?u?u?l?u?u +?l?l?s?u?u?l?u?s +?l?l?s?u?u?l?s?l +?l?l?s?u?u?l?s?u +?l?l?s?u?u?l?s?s +?l?l?s?u?u?u?l?l +?l?l?s?u?u?u?l?u +?l?l?s?u?u?u?l?s +?l?l?s?u?u?u?u?l +?l?l?s?u?u?u?u?u +?l?l?s?u?u?u?u?s +?l?l?s?u?u?u?s?l +?l?l?s?u?u?u?s?u +?l?l?s?u?u?u?s?s +?l?l?s?u?u?s?l?l +?l?l?s?u?u?s?l?u +?l?l?s?u?u?s?l?s +?l?l?s?u?u?s?u?l +?l?l?s?u?u?s?u?u +?l?l?s?u?u?s?u?s +?l?l?s?u?u?s?s?l +?l?l?s?u?u?s?s?u +?l?l?s?u?u?s?s?s +?l?l?s?u?s?l?l?l +?l?l?s?u?s?l?l?u +?l?l?s?u?s?l?l?s +?l?l?s?u?s?l?u?l +?l?l?s?u?s?l?u?u +?l?l?s?u?s?l?u?s +?l?l?s?u?s?l?s?l +?l?l?s?u?s?l?s?u +?l?l?s?u?s?l?s?s +?l?l?s?u?s?u?l?l +?l?l?s?u?s?u?l?u +?l?l?s?u?s?u?l?s +?l?l?s?u?s?u?u?l +?l?l?s?u?s?u?u?u +?l?l?s?u?s?u?u?s +?l?l?s?u?s?u?s?l +?l?l?s?u?s?u?s?u +?l?l?s?u?s?u?s?s +?l?l?s?u?s?s?l?l +?l?l?s?u?s?s?l?u +?l?l?s?u?s?s?l?s +?l?l?s?u?s?s?u?l +?l?l?s?u?s?s?u?u +?l?l?s?u?s?s?u?s +?l?l?s?u?s?s?s?l +?l?l?s?u?s?s?s?u +?l?l?s?u?s?s?s?s +?l?l?s?s?d?d?d?d +?l?l?s?s?d?d?d?l +?l?l?s?s?d?d?d?s +?l?l?s?s?d?d?l?d +?l?l?s?s?d?d?l?l +?l?l?s?s?d?d?l?s +?l?l?s?s?d?d?s?d +?l?l?s?s?d?d?s?l +?l?l?s?s?d?d?s?s +?l?l?s?s?d?l?d?d +?l?l?s?s?d?l?d?l +?l?l?s?s?d?l?d?s +?l?l?s?s?d?l?l?d +?l?l?s?s?d?l?l?l +?l?l?s?s?d?l?l?s +?l?l?s?s?d?l?s?d +?l?l?s?s?d?l?s?l +?l?l?s?s?d?l?s?s +?l?l?s?s?d?s?d?d +?l?l?s?s?d?s?d?l +?l?l?s?s?d?s?d?s +?l?l?s?s?d?s?l?d +?l?l?s?s?d?s?l?l +?l?l?s?s?d?s?l?s +?l?l?s?s?d?s?s?d +?l?l?s?s?d?s?s?l +?l?l?s?s?d?s?s?s +?l?l?s?s?l?d?d?d +?l?l?s?s?l?d?d?l +?l?l?s?s?l?d?d?s +?l?l?s?s?l?d?l?d +?l?l?s?s?l?d?l?l +?l?l?s?s?l?d?l?s +?l?l?s?s?l?d?s?d +?l?l?s?s?l?d?s?l +?l?l?s?s?l?d?s?s +?l?l?s?s?l?l?d?d +?l?l?s?s?l?l?d?l +?l?l?s?s?l?l?d?s +?l?l?s?s?l?l?l?d +?l?l?s?s?l?l?l?l +?l?l?s?s?l?l?l?u +?l?l?s?s?l?l?l?s +?l?l?s?s?l?l?u?l +?l?l?s?s?l?l?u?u +?l?l?s?s?l?l?u?s +?l?l?s?s?l?l?s?d +?l?l?s?s?l?l?s?l +?l?l?s?s?l?l?s?u +?l?l?s?s?l?l?s?s +?l?l?s?s?l?u?l?l +?l?l?s?s?l?u?l?u +?l?l?s?s?l?u?l?s +?l?l?s?s?l?u?u?l +?l?l?s?s?l?u?u?u +?l?l?s?s?l?u?u?s +?l?l?s?s?l?u?s?l +?l?l?s?s?l?u?s?u +?l?l?s?s?l?u?s?s +?l?l?s?s?l?s?d?d +?l?l?s?s?l?s?d?l +?l?l?s?s?l?s?d?s +?l?l?s?s?l?s?l?d +?l?l?s?s?l?s?l?l +?l?l?s?s?l?s?l?u +?l?l?s?s?l?s?l?s +?l?l?s?s?l?s?u?l +?l?l?s?s?l?s?u?u +?l?l?s?s?l?s?u?s +?l?l?s?s?l?s?s?d +?l?l?s?s?l?s?s?l +?l?l?s?s?l?s?s?u +?l?l?s?s?l?s?s?s +?l?l?s?s?u?l?l?l +?l?l?s?s?u?l?l?u +?l?l?s?s?u?l?l?s +?l?l?s?s?u?l?u?l +?l?l?s?s?u?l?u?u +?l?l?s?s?u?l?u?s +?l?l?s?s?u?l?s?l +?l?l?s?s?u?l?s?u +?l?l?s?s?u?l?s?s +?l?l?s?s?u?u?l?l +?l?l?s?s?u?u?l?u +?l?l?s?s?u?u?l?s +?l?l?s?s?u?u?u?l +?l?l?s?s?u?u?u?u +?l?l?s?s?u?u?u?s +?l?l?s?s?u?u?s?l +?l?l?s?s?u?u?s?u +?l?l?s?s?u?u?s?s +?l?l?s?s?u?s?l?l +?l?l?s?s?u?s?l?u +?l?l?s?s?u?s?l?s +?l?l?s?s?u?s?u?l +?l?l?s?s?u?s?u?u +?l?l?s?s?u?s?u?s +?l?l?s?s?u?s?s?l +?l?l?s?s?u?s?s?u +?l?l?s?s?u?s?s?s +?l?l?s?s?s?d?d?d +?l?l?s?s?s?d?d?l +?l?l?s?s?s?d?d?s +?l?l?s?s?s?d?l?d +?l?l?s?s?s?d?l?l +?l?l?s?s?s?d?l?s +?l?l?s?s?s?d?s?d +?l?l?s?s?s?d?s?l +?l?l?s?s?s?d?s?s +?l?l?s?s?s?l?d?d +?l?l?s?s?s?l?d?l +?l?l?s?s?s?l?d?s +?l?l?s?s?s?l?l?d +?l?l?s?s?s?l?l?l +?l?l?s?s?s?l?l?u +?l?l?s?s?s?l?l?s +?l?l?s?s?s?l?u?l +?l?l?s?s?s?l?u?u +?l?l?s?s?s?l?u?s +?l?l?s?s?s?l?s?d +?l?l?s?s?s?l?s?l +?l?l?s?s?s?l?s?u +?l?l?s?s?s?l?s?s +?l?l?s?s?s?u?l?l +?l?l?s?s?s?u?l?u +?l?l?s?s?s?u?l?s +?l?l?s?s?s?u?u?l +?l?l?s?s?s?u?u?u +?l?l?s?s?s?u?u?s +?l?l?s?s?s?u?s?l +?l?l?s?s?s?u?s?u +?l?l?s?s?s?u?s?s +?l?l?s?s?s?s?d?d +?l?l?s?s?s?s?d?l +?l?l?s?s?s?s?d?s +?l?l?s?s?s?s?l?d +?l?l?s?s?s?s?l?l +?l?l?s?s?s?s?l?u +?l?l?s?s?s?s?l?s +?l?l?s?s?s?s?u?l +?l?l?s?s?s?s?u?u +?l?l?s?s?s?s?u?s +?l?l?s?s?s?s?s?d +?l?l?s?s?s?s?s?l +?l?l?s?s?s?s?s?u +?l?l?s?s?s?s?s?s +?l?u?d?d?d?d?d?d +?l?u?d?d?d?d?d?l +?l?u?d?d?d?d?d?u +?l?u?d?d?d?d?l?d +?l?u?d?d?d?d?l?l +?l?u?d?d?d?d?l?u +?l?u?d?d?d?d?u?d +?l?u?d?d?d?d?u?l +?l?u?d?d?d?d?u?u +?l?u?d?d?d?l?d?d +?l?u?d?d?d?l?d?l +?l?u?d?d?d?l?d?u +?l?u?d?d?d?l?l?d +?l?u?d?d?d?l?l?l +?l?u?d?d?d?l?l?u +?l?u?d?d?d?l?u?d +?l?u?d?d?d?l?u?l +?l?u?d?d?d?l?u?u +?l?u?d?d?d?u?d?d +?l?u?d?d?d?u?d?l +?l?u?d?d?d?u?d?u +?l?u?d?d?d?u?l?d +?l?u?d?d?d?u?l?l +?l?u?d?d?d?u?l?u +?l?u?d?d?d?u?u?d +?l?u?d?d?d?u?u?l +?l?u?d?d?d?u?u?u +?l?u?d?d?l?d?d?d +?l?u?d?d?l?d?d?l +?l?u?d?d?l?d?d?u +?l?u?d?d?l?d?l?d +?l?u?d?d?l?d?l?l +?l?u?d?d?l?d?l?u +?l?u?d?d?l?d?u?d +?l?u?d?d?l?d?u?l +?l?u?d?d?l?d?u?u +?l?u?d?d?l?l?d?d +?l?u?d?d?l?l?d?l +?l?u?d?d?l?l?d?u +?l?u?d?d?l?l?l?d +?l?u?d?d?l?l?l?l +?l?u?d?d?l?l?l?u +?l?u?d?d?l?l?u?d +?l?u?d?d?l?l?u?l +?l?u?d?d?l?l?u?u +?l?u?d?d?l?u?d?d +?l?u?d?d?l?u?d?l +?l?u?d?d?l?u?d?u +?l?u?d?d?l?u?l?d +?l?u?d?d?l?u?l?l +?l?u?d?d?l?u?l?u +?l?u?d?d?l?u?u?d +?l?u?d?d?l?u?u?l +?l?u?d?d?l?u?u?u +?l?u?d?d?u?d?d?d +?l?u?d?d?u?d?d?l +?l?u?d?d?u?d?d?u +?l?u?d?d?u?d?l?d +?l?u?d?d?u?d?l?l +?l?u?d?d?u?d?l?u +?l?u?d?d?u?d?u?d +?l?u?d?d?u?d?u?l +?l?u?d?d?u?d?u?u +?l?u?d?d?u?l?d?d +?l?u?d?d?u?l?d?l +?l?u?d?d?u?l?d?u +?l?u?d?d?u?l?l?d +?l?u?d?d?u?l?l?l +?l?u?d?d?u?l?l?u +?l?u?d?d?u?l?u?d +?l?u?d?d?u?l?u?l +?l?u?d?d?u?l?u?u +?l?u?d?d?u?u?d?d +?l?u?d?d?u?u?d?l +?l?u?d?d?u?u?d?u +?l?u?d?d?u?u?l?d +?l?u?d?d?u?u?l?l +?l?u?d?d?u?u?l?u +?l?u?d?d?u?u?u?d +?l?u?d?d?u?u?u?l +?l?u?d?d?u?u?u?u +?l?u?d?l?d?d?d?d +?l?u?d?l?d?d?d?l +?l?u?d?l?d?d?d?u +?l?u?d?l?d?d?l?d +?l?u?d?l?d?d?l?l +?l?u?d?l?d?d?l?u +?l?u?d?l?d?d?u?d +?l?u?d?l?d?d?u?l +?l?u?d?l?d?d?u?u +?l?u?d?l?d?l?d?d +?l?u?d?l?d?l?d?l +?l?u?d?l?d?l?d?u +?l?u?d?l?d?l?l?d +?l?u?d?l?d?l?l?l +?l?u?d?l?d?l?l?u +?l?u?d?l?d?l?u?d +?l?u?d?l?d?l?u?l +?l?u?d?l?d?l?u?u +?l?u?d?l?d?u?d?d +?l?u?d?l?d?u?d?l +?l?u?d?l?d?u?d?u +?l?u?d?l?d?u?l?d +?l?u?d?l?d?u?l?l +?l?u?d?l?d?u?l?u +?l?u?d?l?d?u?u?d +?l?u?d?l?d?u?u?l +?l?u?d?l?d?u?u?u +?l?u?d?l?l?d?d?d +?l?u?d?l?l?d?d?l +?l?u?d?l?l?d?d?u +?l?u?d?l?l?d?l?d +?l?u?d?l?l?d?l?l +?l?u?d?l?l?d?l?u +?l?u?d?l?l?d?u?d +?l?u?d?l?l?d?u?l +?l?u?d?l?l?d?u?u +?l?u?d?l?l?l?d?d +?l?u?d?l?l?l?d?l +?l?u?d?l?l?l?d?u +?l?u?d?l?l?l?l?d +?l?u?d?l?l?l?l?l +?l?u?d?l?l?l?l?u +?l?u?d?l?l?l?u?d +?l?u?d?l?l?l?u?l +?l?u?d?l?l?l?u?u +?l?u?d?l?l?u?d?d +?l?u?d?l?l?u?d?l +?l?u?d?l?l?u?d?u +?l?u?d?l?l?u?l?d +?l?u?d?l?l?u?l?l +?l?u?d?l?l?u?l?u +?l?u?d?l?l?u?u?d +?l?u?d?l?l?u?u?l +?l?u?d?l?l?u?u?u +?l?u?d?l?u?d?d?d +?l?u?d?l?u?d?d?l +?l?u?d?l?u?d?d?u +?l?u?d?l?u?d?l?d +?l?u?d?l?u?d?l?l +?l?u?d?l?u?d?l?u +?l?u?d?l?u?d?u?d +?l?u?d?l?u?d?u?l +?l?u?d?l?u?d?u?u +?l?u?d?l?u?l?d?d +?l?u?d?l?u?l?d?l +?l?u?d?l?u?l?d?u +?l?u?d?l?u?l?l?d +?l?u?d?l?u?l?l?l +?l?u?d?l?u?l?l?u +?l?u?d?l?u?l?u?d +?l?u?d?l?u?l?u?l +?l?u?d?l?u?l?u?u +?l?u?d?l?u?u?d?d +?l?u?d?l?u?u?d?l +?l?u?d?l?u?u?d?u +?l?u?d?l?u?u?l?d +?l?u?d?l?u?u?l?l +?l?u?d?l?u?u?l?u +?l?u?d?l?u?u?u?d +?l?u?d?l?u?u?u?l +?l?u?d?l?u?u?u?u +?l?u?d?u?d?d?d?d +?l?u?d?u?d?d?d?l +?l?u?d?u?d?d?d?u +?l?u?d?u?d?d?l?d +?l?u?d?u?d?d?l?l +?l?u?d?u?d?d?l?u +?l?u?d?u?d?d?u?d +?l?u?d?u?d?d?u?l +?l?u?d?u?d?d?u?u +?l?u?d?u?d?l?d?d +?l?u?d?u?d?l?d?l +?l?u?d?u?d?l?d?u +?l?u?d?u?d?l?l?d +?l?u?d?u?d?l?l?l +?l?u?d?u?d?l?l?u +?l?u?d?u?d?l?u?d +?l?u?d?u?d?l?u?l +?l?u?d?u?d?l?u?u +?l?u?d?u?d?u?d?d +?l?u?d?u?d?u?d?l +?l?u?d?u?d?u?d?u +?l?u?d?u?d?u?l?d +?l?u?d?u?d?u?l?l +?l?u?d?u?d?u?l?u +?l?u?d?u?d?u?u?d +?l?u?d?u?d?u?u?l +?l?u?d?u?d?u?u?u +?l?u?d?u?l?d?d?d +?l?u?d?u?l?d?d?l +?l?u?d?u?l?d?d?u +?l?u?d?u?l?d?l?d +?l?u?d?u?l?d?l?l +?l?u?d?u?l?d?l?u +?l?u?d?u?l?d?u?d +?l?u?d?u?l?d?u?l +?l?u?d?u?l?d?u?u +?l?u?d?u?l?l?d?d +?l?u?d?u?l?l?d?l +?l?u?d?u?l?l?d?u +?l?u?d?u?l?l?l?d +?l?u?d?u?l?l?l?l +?l?u?d?u?l?l?l?u +?l?u?d?u?l?l?u?d +?l?u?d?u?l?l?u?l +?l?u?d?u?l?l?u?u +?l?u?d?u?l?u?d?d +?l?u?d?u?l?u?d?l +?l?u?d?u?l?u?d?u +?l?u?d?u?l?u?l?d +?l?u?d?u?l?u?l?l +?l?u?d?u?l?u?l?u +?l?u?d?u?l?u?u?d +?l?u?d?u?l?u?u?l +?l?u?d?u?l?u?u?u +?l?u?d?u?u?d?d?d +?l?u?d?u?u?d?d?l +?l?u?d?u?u?d?d?u +?l?u?d?u?u?d?l?d +?l?u?d?u?u?d?l?l +?l?u?d?u?u?d?l?u +?l?u?d?u?u?d?u?d +?l?u?d?u?u?d?u?l +?l?u?d?u?u?d?u?u +?l?u?d?u?u?l?d?d +?l?u?d?u?u?l?d?l +?l?u?d?u?u?l?d?u +?l?u?d?u?u?l?l?d +?l?u?d?u?u?l?l?l +?l?u?d?u?u?l?l?u +?l?u?d?u?u?l?u?d +?l?u?d?u?u?l?u?l +?l?u?d?u?u?l?u?u +?l?u?d?u?u?u?d?d +?l?u?d?u?u?u?d?l +?l?u?d?u?u?u?d?u +?l?u?d?u?u?u?l?d +?l?u?d?u?u?u?l?l +?l?u?d?u?u?u?l?u +?l?u?d?u?u?u?u?d +?l?u?d?u?u?u?u?l +?l?u?d?u?u?u?u?u +?l?u?l?d?d?d?d?d +?l?u?l?d?d?d?d?l +?l?u?l?d?d?d?d?u +?l?u?l?d?d?d?l?d +?l?u?l?d?d?d?l?l +?l?u?l?d?d?d?l?u +?l?u?l?d?d?d?u?d +?l?u?l?d?d?d?u?l +?l?u?l?d?d?d?u?u +?l?u?l?d?d?l?d?d +?l?u?l?d?d?l?d?l +?l?u?l?d?d?l?d?u +?l?u?l?d?d?l?l?d +?l?u?l?d?d?l?l?l +?l?u?l?d?d?l?l?u +?l?u?l?d?d?l?u?d +?l?u?l?d?d?l?u?l +?l?u?l?d?d?l?u?u +?l?u?l?d?d?u?d?d +?l?u?l?d?d?u?d?l +?l?u?l?d?d?u?d?u +?l?u?l?d?d?u?l?d +?l?u?l?d?d?u?l?l +?l?u?l?d?d?u?l?u +?l?u?l?d?d?u?u?d +?l?u?l?d?d?u?u?l +?l?u?l?d?d?u?u?u +?l?u?l?d?l?d?d?d +?l?u?l?d?l?d?d?l +?l?u?l?d?l?d?d?u +?l?u?l?d?l?d?l?d +?l?u?l?d?l?d?l?l +?l?u?l?d?l?d?l?u +?l?u?l?d?l?d?u?d +?l?u?l?d?l?d?u?l +?l?u?l?d?l?d?u?u +?l?u?l?d?l?l?d?d +?l?u?l?d?l?l?d?l +?l?u?l?d?l?l?d?u +?l?u?l?d?l?l?l?d +?l?u?l?d?l?l?l?l +?l?u?l?d?l?l?l?u +?l?u?l?d?l?l?u?d +?l?u?l?d?l?l?u?l +?l?u?l?d?l?l?u?u +?l?u?l?d?l?u?d?d +?l?u?l?d?l?u?d?l +?l?u?l?d?l?u?d?u +?l?u?l?d?l?u?l?d +?l?u?l?d?l?u?l?l +?l?u?l?d?l?u?l?u +?l?u?l?d?l?u?u?d +?l?u?l?d?l?u?u?l +?l?u?l?d?l?u?u?u +?l?u?l?d?u?d?d?d +?l?u?l?d?u?d?d?l +?l?u?l?d?u?d?d?u +?l?u?l?d?u?d?l?d +?l?u?l?d?u?d?l?l +?l?u?l?d?u?d?l?u +?l?u?l?d?u?d?u?d +?l?u?l?d?u?d?u?l +?l?u?l?d?u?d?u?u +?l?u?l?d?u?l?d?d +?l?u?l?d?u?l?d?l +?l?u?l?d?u?l?d?u +?l?u?l?d?u?l?l?d +?l?u?l?d?u?l?l?l +?l?u?l?d?u?l?l?u +?l?u?l?d?u?l?u?d +?l?u?l?d?u?l?u?l +?l?u?l?d?u?l?u?u +?l?u?l?d?u?u?d?d +?l?u?l?d?u?u?d?l +?l?u?l?d?u?u?d?u +?l?u?l?d?u?u?l?d +?l?u?l?d?u?u?l?l +?l?u?l?d?u?u?l?u +?l?u?l?d?u?u?u?d +?l?u?l?d?u?u?u?l +?l?u?l?d?u?u?u?u +?l?u?l?l?d?d?d?d +?l?u?l?l?d?d?d?l +?l?u?l?l?d?d?d?u +?l?u?l?l?d?d?l?d +?l?u?l?l?d?d?l?l +?l?u?l?l?d?d?l?u +?l?u?l?l?d?d?u?d +?l?u?l?l?d?d?u?l +?l?u?l?l?d?d?u?u +?l?u?l?l?d?l?d?d +?l?u?l?l?d?l?d?l +?l?u?l?l?d?l?d?u +?l?u?l?l?d?l?l?d +?l?u?l?l?d?l?l?l +?l?u?l?l?d?l?l?u +?l?u?l?l?d?l?u?d +?l?u?l?l?d?l?u?l +?l?u?l?l?d?l?u?u +?l?u?l?l?d?u?d?d +?l?u?l?l?d?u?d?l +?l?u?l?l?d?u?d?u +?l?u?l?l?d?u?l?d +?l?u?l?l?d?u?l?l +?l?u?l?l?d?u?l?u +?l?u?l?l?d?u?u?d +?l?u?l?l?d?u?u?l +?l?u?l?l?d?u?u?u +?l?u?l?l?l?d?d?d +?l?u?l?l?l?d?d?l +?l?u?l?l?l?d?d?u +?l?u?l?l?l?d?l?d +?l?u?l?l?l?d?l?l +?l?u?l?l?l?d?l?u +?l?u?l?l?l?d?u?d +?l?u?l?l?l?d?u?l +?l?u?l?l?l?d?u?u +?l?u?l?l?l?l?d?d +?l?u?l?l?l?l?d?l +?l?u?l?l?l?l?d?u +?l?u?l?l?l?l?l?d +?l?u?l?l?l?l?l?l +?l?u?l?l?l?l?l?u +?l?u?l?l?l?l?l?s +?l?u?l?l?l?l?u?d +?l?u?l?l?l?l?u?l +?l?u?l?l?l?l?u?u +?l?u?l?l?l?l?u?s +?l?u?l?l?l?l?s?l +?l?u?l?l?l?l?s?u +?l?u?l?l?l?l?s?s +?l?u?l?l?l?u?d?d +?l?u?l?l?l?u?d?l +?l?u?l?l?l?u?d?u +?l?u?l?l?l?u?l?d +?l?u?l?l?l?u?l?l +?l?u?l?l?l?u?l?u +?l?u?l?l?l?u?l?s +?l?u?l?l?l?u?u?d +?l?u?l?l?l?u?u?l +?l?u?l?l?l?u?u?u +?l?u?l?l?l?u?u?s +?l?u?l?l?l?u?s?l +?l?u?l?l?l?u?s?u +?l?u?l?l?l?u?s?s +?l?u?l?l?l?s?l?l +?l?u?l?l?l?s?l?u +?l?u?l?l?l?s?l?s +?l?u?l?l?l?s?u?l +?l?u?l?l?l?s?u?u +?l?u?l?l?l?s?u?s +?l?u?l?l?l?s?s?l +?l?u?l?l?l?s?s?u +?l?u?l?l?l?s?s?s +?l?u?l?l?u?d?d?d +?l?u?l?l?u?d?d?l +?l?u?l?l?u?d?d?u +?l?u?l?l?u?d?l?d +?l?u?l?l?u?d?l?l +?l?u?l?l?u?d?l?u +?l?u?l?l?u?d?u?d +?l?u?l?l?u?d?u?l +?l?u?l?l?u?d?u?u +?l?u?l?l?u?l?d?d +?l?u?l?l?u?l?d?l +?l?u?l?l?u?l?d?u +?l?u?l?l?u?l?l?d +?l?u?l?l?u?l?l?l +?l?u?l?l?u?l?l?u +?l?u?l?l?u?l?l?s +?l?u?l?l?u?l?u?d +?l?u?l?l?u?l?u?l +?l?u?l?l?u?l?u?u +?l?u?l?l?u?l?u?s +?l?u?l?l?u?l?s?l +?l?u?l?l?u?l?s?u +?l?u?l?l?u?l?s?s +?l?u?l?l?u?u?d?d +?l?u?l?l?u?u?d?l +?l?u?l?l?u?u?d?u +?l?u?l?l?u?u?l?d +?l?u?l?l?u?u?l?l +?l?u?l?l?u?u?l?u +?l?u?l?l?u?u?l?s +?l?u?l?l?u?u?u?d +?l?u?l?l?u?u?u?l +?l?u?l?l?u?u?u?u +?l?u?l?l?u?u?u?s +?l?u?l?l?u?u?s?l +?l?u?l?l?u?u?s?u +?l?u?l?l?u?u?s?s +?l?u?l?l?u?s?l?l +?l?u?l?l?u?s?l?u +?l?u?l?l?u?s?l?s +?l?u?l?l?u?s?u?l +?l?u?l?l?u?s?u?u +?l?u?l?l?u?s?u?s +?l?u?l?l?u?s?s?l +?l?u?l?l?u?s?s?u +?l?u?l?l?u?s?s?s +?l?u?l?l?s?l?l?l +?l?u?l?l?s?l?l?u +?l?u?l?l?s?l?l?s +?l?u?l?l?s?l?u?l +?l?u?l?l?s?l?u?u +?l?u?l?l?s?l?u?s +?l?u?l?l?s?l?s?l +?l?u?l?l?s?l?s?u +?l?u?l?l?s?l?s?s +?l?u?l?l?s?u?l?l +?l?u?l?l?s?u?l?u +?l?u?l?l?s?u?l?s +?l?u?l?l?s?u?u?l +?l?u?l?l?s?u?u?u +?l?u?l?l?s?u?u?s +?l?u?l?l?s?u?s?l +?l?u?l?l?s?u?s?u +?l?u?l?l?s?u?s?s +?l?u?l?l?s?s?l?l +?l?u?l?l?s?s?l?u +?l?u?l?l?s?s?l?s +?l?u?l?l?s?s?u?l +?l?u?l?l?s?s?u?u +?l?u?l?l?s?s?u?s +?l?u?l?l?s?s?s?l +?l?u?l?l?s?s?s?u +?l?u?l?l?s?s?s?s +?l?u?l?u?d?d?d?d +?l?u?l?u?d?d?d?l +?l?u?l?u?d?d?d?u +?l?u?l?u?d?d?l?d +?l?u?l?u?d?d?l?l +?l?u?l?u?d?d?l?u +?l?u?l?u?d?d?u?d +?l?u?l?u?d?d?u?l +?l?u?l?u?d?d?u?u +?l?u?l?u?d?l?d?d +?l?u?l?u?d?l?d?l +?l?u?l?u?d?l?d?u +?l?u?l?u?d?l?l?d +?l?u?l?u?d?l?l?l +?l?u?l?u?d?l?l?u +?l?u?l?u?d?l?u?d +?l?u?l?u?d?l?u?l +?l?u?l?u?d?l?u?u +?l?u?l?u?d?u?d?d +?l?u?l?u?d?u?d?l +?l?u?l?u?d?u?d?u +?l?u?l?u?d?u?l?d +?l?u?l?u?d?u?l?l +?l?u?l?u?d?u?l?u +?l?u?l?u?d?u?u?d +?l?u?l?u?d?u?u?l +?l?u?l?u?d?u?u?u +?l?u?l?u?l?d?d?d +?l?u?l?u?l?d?d?l +?l?u?l?u?l?d?d?u +?l?u?l?u?l?d?l?d +?l?u?l?u?l?d?l?l +?l?u?l?u?l?d?l?u +?l?u?l?u?l?d?u?d +?l?u?l?u?l?d?u?l +?l?u?l?u?l?d?u?u +?l?u?l?u?l?l?d?d +?l?u?l?u?l?l?d?l +?l?u?l?u?l?l?d?u +?l?u?l?u?l?l?l?d +?l?u?l?u?l?l?l?l +?l?u?l?u?l?l?l?u +?l?u?l?u?l?l?l?s +?l?u?l?u?l?l?u?d +?l?u?l?u?l?l?u?l +?l?u?l?u?l?l?u?u +?l?u?l?u?l?l?u?s +?l?u?l?u?l?l?s?l +?l?u?l?u?l?l?s?u +?l?u?l?u?l?l?s?s +?l?u?l?u?l?u?d?d +?l?u?l?u?l?u?d?l +?l?u?l?u?l?u?d?u +?l?u?l?u?l?u?l?d +?l?u?l?u?l?u?l?l +?l?u?l?u?l?u?l?u +?l?u?l?u?l?u?l?s +?l?u?l?u?l?u?u?d +?l?u?l?u?l?u?u?l +?l?u?l?u?l?u?u?u +?l?u?l?u?l?u?u?s +?l?u?l?u?l?u?s?l +?l?u?l?u?l?u?s?u +?l?u?l?u?l?u?s?s +?l?u?l?u?l?s?l?l +?l?u?l?u?l?s?l?u +?l?u?l?u?l?s?l?s +?l?u?l?u?l?s?u?l +?l?u?l?u?l?s?u?u +?l?u?l?u?l?s?u?s +?l?u?l?u?l?s?s?l +?l?u?l?u?l?s?s?u +?l?u?l?u?l?s?s?s +?l?u?l?u?u?d?d?d +?l?u?l?u?u?d?d?l +?l?u?l?u?u?d?d?u +?l?u?l?u?u?d?l?d +?l?u?l?u?u?d?l?l +?l?u?l?u?u?d?l?u +?l?u?l?u?u?d?u?d +?l?u?l?u?u?d?u?l +?l?u?l?u?u?d?u?u +?l?u?l?u?u?l?d?d +?l?u?l?u?u?l?d?l +?l?u?l?u?u?l?d?u +?l?u?l?u?u?l?l?d +?l?u?l?u?u?l?l?l +?l?u?l?u?u?l?l?u +?l?u?l?u?u?l?l?s +?l?u?l?u?u?l?u?d +?l?u?l?u?u?l?u?l +?l?u?l?u?u?l?u?u +?l?u?l?u?u?l?u?s +?l?u?l?u?u?l?s?l +?l?u?l?u?u?l?s?u +?l?u?l?u?u?l?s?s +?l?u?l?u?u?u?d?d +?l?u?l?u?u?u?d?l +?l?u?l?u?u?u?d?u +?l?u?l?u?u?u?l?d +?l?u?l?u?u?u?l?l +?l?u?l?u?u?u?l?u +?l?u?l?u?u?u?l?s +?l?u?l?u?u?u?u?d +?l?u?l?u?u?u?u?l +?l?u?l?u?u?u?u?u +?l?u?l?u?u?u?u?s +?l?u?l?u?u?u?s?l +?l?u?l?u?u?u?s?u +?l?u?l?u?u?u?s?s +?l?u?l?u?u?s?l?l +?l?u?l?u?u?s?l?u +?l?u?l?u?u?s?l?s +?l?u?l?u?u?s?u?l +?l?u?l?u?u?s?u?u +?l?u?l?u?u?s?u?s +?l?u?l?u?u?s?s?l +?l?u?l?u?u?s?s?u +?l?u?l?u?u?s?s?s +?l?u?l?u?s?l?l?l +?l?u?l?u?s?l?l?u +?l?u?l?u?s?l?l?s +?l?u?l?u?s?l?u?l +?l?u?l?u?s?l?u?u +?l?u?l?u?s?l?u?s +?l?u?l?u?s?l?s?l +?l?u?l?u?s?l?s?u +?l?u?l?u?s?l?s?s +?l?u?l?u?s?u?l?l +?l?u?l?u?s?u?l?u +?l?u?l?u?s?u?l?s +?l?u?l?u?s?u?u?l +?l?u?l?u?s?u?u?u +?l?u?l?u?s?u?u?s +?l?u?l?u?s?u?s?l +?l?u?l?u?s?u?s?u +?l?u?l?u?s?u?s?s +?l?u?l?u?s?s?l?l +?l?u?l?u?s?s?l?u +?l?u?l?u?s?s?l?s +?l?u?l?u?s?s?u?l +?l?u?l?u?s?s?u?u +?l?u?l?u?s?s?u?s +?l?u?l?u?s?s?s?l +?l?u?l?u?s?s?s?u +?l?u?l?u?s?s?s?s +?l?u?l?s?l?l?l?l +?l?u?l?s?l?l?l?u +?l?u?l?s?l?l?l?s +?l?u?l?s?l?l?u?l +?l?u?l?s?l?l?u?u +?l?u?l?s?l?l?u?s +?l?u?l?s?l?l?s?l +?l?u?l?s?l?l?s?u +?l?u?l?s?l?l?s?s +?l?u?l?s?l?u?l?l +?l?u?l?s?l?u?l?u +?l?u?l?s?l?u?l?s +?l?u?l?s?l?u?u?l +?l?u?l?s?l?u?u?u +?l?u?l?s?l?u?u?s +?l?u?l?s?l?u?s?l +?l?u?l?s?l?u?s?u +?l?u?l?s?l?u?s?s +?l?u?l?s?l?s?l?l +?l?u?l?s?l?s?l?u +?l?u?l?s?l?s?l?s +?l?u?l?s?l?s?u?l +?l?u?l?s?l?s?u?u +?l?u?l?s?l?s?u?s +?l?u?l?s?l?s?s?l +?l?u?l?s?l?s?s?u +?l?u?l?s?l?s?s?s +?l?u?l?s?u?l?l?l +?l?u?l?s?u?l?l?u +?l?u?l?s?u?l?l?s +?l?u?l?s?u?l?u?l +?l?u?l?s?u?l?u?u +?l?u?l?s?u?l?u?s +?l?u?l?s?u?l?s?l +?l?u?l?s?u?l?s?u +?l?u?l?s?u?l?s?s +?l?u?l?s?u?u?l?l +?l?u?l?s?u?u?l?u +?l?u?l?s?u?u?l?s +?l?u?l?s?u?u?u?l +?l?u?l?s?u?u?u?u +?l?u?l?s?u?u?u?s +?l?u?l?s?u?u?s?l +?l?u?l?s?u?u?s?u +?l?u?l?s?u?u?s?s +?l?u?l?s?u?s?l?l +?l?u?l?s?u?s?l?u +?l?u?l?s?u?s?l?s +?l?u?l?s?u?s?u?l +?l?u?l?s?u?s?u?u +?l?u?l?s?u?s?u?s +?l?u?l?s?u?s?s?l +?l?u?l?s?u?s?s?u +?l?u?l?s?u?s?s?s +?l?u?l?s?s?l?l?l +?l?u?l?s?s?l?l?u +?l?u?l?s?s?l?l?s +?l?u?l?s?s?l?u?l +?l?u?l?s?s?l?u?u +?l?u?l?s?s?l?u?s +?l?u?l?s?s?l?s?l +?l?u?l?s?s?l?s?u +?l?u?l?s?s?l?s?s +?l?u?l?s?s?u?l?l +?l?u?l?s?s?u?l?u +?l?u?l?s?s?u?l?s +?l?u?l?s?s?u?u?l +?l?u?l?s?s?u?u?u +?l?u?l?s?s?u?u?s +?l?u?l?s?s?u?s?l +?l?u?l?s?s?u?s?u +?l?u?l?s?s?u?s?s +?l?u?l?s?s?s?l?l +?l?u?l?s?s?s?l?u +?l?u?l?s?s?s?l?s +?l?u?l?s?s?s?u?l +?l?u?l?s?s?s?u?u +?l?u?l?s?s?s?u?s +?l?u?l?s?s?s?s?l +?l?u?l?s?s?s?s?u +?l?u?l?s?s?s?s?s +?l?u?u?d?d?d?d?d +?l?u?u?d?d?d?d?l +?l?u?u?d?d?d?d?u +?l?u?u?d?d?d?l?d +?l?u?u?d?d?d?l?l +?l?u?u?d?d?d?l?u +?l?u?u?d?d?d?u?d +?l?u?u?d?d?d?u?l +?l?u?u?d?d?d?u?u +?l?u?u?d?d?l?d?d +?l?u?u?d?d?l?d?l +?l?u?u?d?d?l?d?u +?l?u?u?d?d?l?l?d +?l?u?u?d?d?l?l?l +?l?u?u?d?d?l?l?u +?l?u?u?d?d?l?u?d +?l?u?u?d?d?l?u?l +?l?u?u?d?d?l?u?u +?l?u?u?d?d?u?d?d +?l?u?u?d?d?u?d?l +?l?u?u?d?d?u?d?u +?l?u?u?d?d?u?l?d +?l?u?u?d?d?u?l?l +?l?u?u?d?d?u?l?u +?l?u?u?d?d?u?u?d +?l?u?u?d?d?u?u?l +?l?u?u?d?d?u?u?u +?l?u?u?d?l?d?d?d +?l?u?u?d?l?d?d?l +?l?u?u?d?l?d?d?u +?l?u?u?d?l?d?l?d +?l?u?u?d?l?d?l?l +?l?u?u?d?l?d?l?u +?l?u?u?d?l?d?u?d +?l?u?u?d?l?d?u?l +?l?u?u?d?l?d?u?u +?l?u?u?d?l?l?d?d +?l?u?u?d?l?l?d?l +?l?u?u?d?l?l?d?u +?l?u?u?d?l?l?l?d +?l?u?u?d?l?l?l?l +?l?u?u?d?l?l?l?u +?l?u?u?d?l?l?u?d +?l?u?u?d?l?l?u?l +?l?u?u?d?l?l?u?u +?l?u?u?d?l?u?d?d +?l?u?u?d?l?u?d?l +?l?u?u?d?l?u?d?u +?l?u?u?d?l?u?l?d +?l?u?u?d?l?u?l?l +?l?u?u?d?l?u?l?u +?l?u?u?d?l?u?u?d +?l?u?u?d?l?u?u?l +?l?u?u?d?l?u?u?u +?l?u?u?d?u?d?d?d +?l?u?u?d?u?d?d?l +?l?u?u?d?u?d?d?u +?l?u?u?d?u?d?l?d +?l?u?u?d?u?d?l?l +?l?u?u?d?u?d?l?u +?l?u?u?d?u?d?u?d +?l?u?u?d?u?d?u?l +?l?u?u?d?u?d?u?u +?l?u?u?d?u?l?d?d +?l?u?u?d?u?l?d?l +?l?u?u?d?u?l?d?u +?l?u?u?d?u?l?l?d +?l?u?u?d?u?l?l?l +?l?u?u?d?u?l?l?u +?l?u?u?d?u?l?u?d +?l?u?u?d?u?l?u?l +?l?u?u?d?u?l?u?u +?l?u?u?d?u?u?d?d +?l?u?u?d?u?u?d?l +?l?u?u?d?u?u?d?u +?l?u?u?d?u?u?l?d +?l?u?u?d?u?u?l?l +?l?u?u?d?u?u?l?u +?l?u?u?d?u?u?u?d +?l?u?u?d?u?u?u?l +?l?u?u?d?u?u?u?u +?l?u?u?l?d?d?d?d +?l?u?u?l?d?d?d?l +?l?u?u?l?d?d?d?u +?l?u?u?l?d?d?l?d +?l?u?u?l?d?d?l?l +?l?u?u?l?d?d?l?u +?l?u?u?l?d?d?u?d +?l?u?u?l?d?d?u?l +?l?u?u?l?d?d?u?u +?l?u?u?l?d?l?d?d +?l?u?u?l?d?l?d?l +?l?u?u?l?d?l?d?u +?l?u?u?l?d?l?l?d +?l?u?u?l?d?l?l?l +?l?u?u?l?d?l?l?u +?l?u?u?l?d?l?u?d +?l?u?u?l?d?l?u?l +?l?u?u?l?d?l?u?u +?l?u?u?l?d?u?d?d +?l?u?u?l?d?u?d?l +?l?u?u?l?d?u?d?u +?l?u?u?l?d?u?l?d +?l?u?u?l?d?u?l?l +?l?u?u?l?d?u?l?u +?l?u?u?l?d?u?u?d +?l?u?u?l?d?u?u?l +?l?u?u?l?d?u?u?u +?l?u?u?l?l?d?d?d +?l?u?u?l?l?d?d?l +?l?u?u?l?l?d?d?u +?l?u?u?l?l?d?l?d +?l?u?u?l?l?d?l?l +?l?u?u?l?l?d?l?u +?l?u?u?l?l?d?u?d +?l?u?u?l?l?d?u?l +?l?u?u?l?l?d?u?u +?l?u?u?l?l?l?d?d +?l?u?u?l?l?l?d?l +?l?u?u?l?l?l?d?u +?l?u?u?l?l?l?l?d +?l?u?u?l?l?l?l?l +?l?u?u?l?l?l?l?u +?l?u?u?l?l?l?l?s +?l?u?u?l?l?l?u?d +?l?u?u?l?l?l?u?l +?l?u?u?l?l?l?u?u +?l?u?u?l?l?l?u?s +?l?u?u?l?l?l?s?l +?l?u?u?l?l?l?s?u +?l?u?u?l?l?l?s?s +?l?u?u?l?l?u?d?d +?l?u?u?l?l?u?d?l +?l?u?u?l?l?u?d?u +?l?u?u?l?l?u?l?d +?l?u?u?l?l?u?l?l +?l?u?u?l?l?u?l?u +?l?u?u?l?l?u?l?s +?l?u?u?l?l?u?u?d +?l?u?u?l?l?u?u?l +?l?u?u?l?l?u?u?u +?l?u?u?l?l?u?u?s +?l?u?u?l?l?u?s?l +?l?u?u?l?l?u?s?u +?l?u?u?l?l?u?s?s +?l?u?u?l?l?s?l?l +?l?u?u?l?l?s?l?u +?l?u?u?l?l?s?l?s +?l?u?u?l?l?s?u?l +?l?u?u?l?l?s?u?u +?l?u?u?l?l?s?u?s +?l?u?u?l?l?s?s?l +?l?u?u?l?l?s?s?u +?l?u?u?l?l?s?s?s +?l?u?u?l?u?d?d?d +?l?u?u?l?u?d?d?l +?l?u?u?l?u?d?d?u +?l?u?u?l?u?d?l?d +?l?u?u?l?u?d?l?l +?l?u?u?l?u?d?l?u +?l?u?u?l?u?d?u?d +?l?u?u?l?u?d?u?l +?l?u?u?l?u?d?u?u +?l?u?u?l?u?l?d?d +?l?u?u?l?u?l?d?l +?l?u?u?l?u?l?d?u +?l?u?u?l?u?l?l?d +?l?u?u?l?u?l?l?l +?l?u?u?l?u?l?l?u +?l?u?u?l?u?l?l?s +?l?u?u?l?u?l?u?d +?l?u?u?l?u?l?u?l +?l?u?u?l?u?l?u?u +?l?u?u?l?u?l?u?s +?l?u?u?l?u?l?s?l +?l?u?u?l?u?l?s?u +?l?u?u?l?u?l?s?s +?l?u?u?l?u?u?d?d +?l?u?u?l?u?u?d?l +?l?u?u?l?u?u?d?u +?l?u?u?l?u?u?l?d +?l?u?u?l?u?u?l?l +?l?u?u?l?u?u?l?u +?l?u?u?l?u?u?l?s +?l?u?u?l?u?u?u?d +?l?u?u?l?u?u?u?l +?l?u?u?l?u?u?u?u +?l?u?u?l?u?u?u?s +?l?u?u?l?u?u?s?l +?l?u?u?l?u?u?s?u +?l?u?u?l?u?u?s?s +?l?u?u?l?u?s?l?l +?l?u?u?l?u?s?l?u +?l?u?u?l?u?s?l?s +?l?u?u?l?u?s?u?l +?l?u?u?l?u?s?u?u +?l?u?u?l?u?s?u?s +?l?u?u?l?u?s?s?l +?l?u?u?l?u?s?s?u +?l?u?u?l?u?s?s?s +?l?u?u?l?s?l?l?l +?l?u?u?l?s?l?l?u +?l?u?u?l?s?l?l?s +?l?u?u?l?s?l?u?l +?l?u?u?l?s?l?u?u +?l?u?u?l?s?l?u?s +?l?u?u?l?s?l?s?l +?l?u?u?l?s?l?s?u +?l?u?u?l?s?l?s?s +?l?u?u?l?s?u?l?l +?l?u?u?l?s?u?l?u +?l?u?u?l?s?u?l?s +?l?u?u?l?s?u?u?l +?l?u?u?l?s?u?u?u +?l?u?u?l?s?u?u?s +?l?u?u?l?s?u?s?l +?l?u?u?l?s?u?s?u +?l?u?u?l?s?u?s?s +?l?u?u?l?s?s?l?l +?l?u?u?l?s?s?l?u +?l?u?u?l?s?s?l?s +?l?u?u?l?s?s?u?l +?l?u?u?l?s?s?u?u +?l?u?u?l?s?s?u?s +?l?u?u?l?s?s?s?l +?l?u?u?l?s?s?s?u +?l?u?u?l?s?s?s?s +?l?u?u?u?d?d?d?d +?l?u?u?u?d?d?d?l +?l?u?u?u?d?d?d?u +?l?u?u?u?d?d?l?d +?l?u?u?u?d?d?l?l +?l?u?u?u?d?d?l?u +?l?u?u?u?d?d?u?d +?l?u?u?u?d?d?u?l +?l?u?u?u?d?d?u?u +?l?u?u?u?d?l?d?d +?l?u?u?u?d?l?d?l +?l?u?u?u?d?l?d?u +?l?u?u?u?d?l?l?d +?l?u?u?u?d?l?l?l +?l?u?u?u?d?l?l?u +?l?u?u?u?d?l?u?d +?l?u?u?u?d?l?u?l +?l?u?u?u?d?l?u?u +?l?u?u?u?d?u?d?d +?l?u?u?u?d?u?d?l +?l?u?u?u?d?u?d?u +?l?u?u?u?d?u?l?d +?l?u?u?u?d?u?l?l +?l?u?u?u?d?u?l?u +?l?u?u?u?d?u?u?d +?l?u?u?u?d?u?u?l +?l?u?u?u?d?u?u?u +?l?u?u?u?l?d?d?d +?l?u?u?u?l?d?d?l +?l?u?u?u?l?d?d?u +?l?u?u?u?l?d?l?d +?l?u?u?u?l?d?l?l +?l?u?u?u?l?d?l?u +?l?u?u?u?l?d?u?d +?l?u?u?u?l?d?u?l +?l?u?u?u?l?d?u?u +?l?u?u?u?l?l?d?d +?l?u?u?u?l?l?d?l +?l?u?u?u?l?l?d?u +?l?u?u?u?l?l?l?d +?l?u?u?u?l?l?l?l +?l?u?u?u?l?l?l?u +?l?u?u?u?l?l?l?s +?l?u?u?u?l?l?u?d +?l?u?u?u?l?l?u?l +?l?u?u?u?l?l?u?u +?l?u?u?u?l?l?u?s +?l?u?u?u?l?l?s?l +?l?u?u?u?l?l?s?u +?l?u?u?u?l?l?s?s +?l?u?u?u?l?u?d?d +?l?u?u?u?l?u?d?l +?l?u?u?u?l?u?d?u +?l?u?u?u?l?u?l?d +?l?u?u?u?l?u?l?l +?l?u?u?u?l?u?l?u +?l?u?u?u?l?u?l?s +?l?u?u?u?l?u?u?d +?l?u?u?u?l?u?u?l +?l?u?u?u?l?u?u?u +?l?u?u?u?l?u?u?s +?l?u?u?u?l?u?s?l +?l?u?u?u?l?u?s?u +?l?u?u?u?l?u?s?s +?l?u?u?u?l?s?l?l +?l?u?u?u?l?s?l?u +?l?u?u?u?l?s?l?s +?l?u?u?u?l?s?u?l +?l?u?u?u?l?s?u?u +?l?u?u?u?l?s?u?s +?l?u?u?u?l?s?s?l +?l?u?u?u?l?s?s?u +?l?u?u?u?l?s?s?s +?l?u?u?u?u?d?d?d +?l?u?u?u?u?d?d?l +?l?u?u?u?u?d?d?u +?l?u?u?u?u?d?l?d +?l?u?u?u?u?d?l?l +?l?u?u?u?u?d?l?u +?l?u?u?u?u?d?u?d +?l?u?u?u?u?d?u?l +?l?u?u?u?u?d?u?u +?l?u?u?u?u?l?d?d +?l?u?u?u?u?l?d?l +?l?u?u?u?u?l?d?u +?l?u?u?u?u?l?l?d +?l?u?u?u?u?l?l?l +?l?u?u?u?u?l?l?u +?l?u?u?u?u?l?l?s +?l?u?u?u?u?l?u?d +?l?u?u?u?u?l?u?l +?l?u?u?u?u?l?u?u +?l?u?u?u?u?l?u?s +?l?u?u?u?u?l?s?l +?l?u?u?u?u?l?s?u +?l?u?u?u?u?l?s?s +?l?u?u?u?u?u?d?d +?l?u?u?u?u?u?d?l +?l?u?u?u?u?u?d?u +?l?u?u?u?u?u?l?d +?l?u?u?u?u?u?l?l +?l?u?u?u?u?u?l?u +?l?u?u?u?u?u?l?s +?l?u?u?u?u?u?u?d +?l?u?u?u?u?u?u?l +?l?u?u?u?u?u?u?u +?l?u?u?u?u?u?u?s +?l?u?u?u?u?u?s?l +?l?u?u?u?u?u?s?u +?l?u?u?u?u?u?s?s +?l?u?u?u?u?s?l?l +?l?u?u?u?u?s?l?u +?l?u?u?u?u?s?l?s +?l?u?u?u?u?s?u?l +?l?u?u?u?u?s?u?u +?l?u?u?u?u?s?u?s +?l?u?u?u?u?s?s?l +?l?u?u?u?u?s?s?u +?l?u?u?u?u?s?s?s +?l?u?u?u?s?l?l?l +?l?u?u?u?s?l?l?u +?l?u?u?u?s?l?l?s +?l?u?u?u?s?l?u?l +?l?u?u?u?s?l?u?u +?l?u?u?u?s?l?u?s +?l?u?u?u?s?l?s?l +?l?u?u?u?s?l?s?u +?l?u?u?u?s?l?s?s +?l?u?u?u?s?u?l?l +?l?u?u?u?s?u?l?u +?l?u?u?u?s?u?l?s +?l?u?u?u?s?u?u?l +?l?u?u?u?s?u?u?u +?l?u?u?u?s?u?u?s +?l?u?u?u?s?u?s?l +?l?u?u?u?s?u?s?u +?l?u?u?u?s?u?s?s +?l?u?u?u?s?s?l?l +?l?u?u?u?s?s?l?u +?l?u?u?u?s?s?l?s +?l?u?u?u?s?s?u?l +?l?u?u?u?s?s?u?u +?l?u?u?u?s?s?u?s +?l?u?u?u?s?s?s?l +?l?u?u?u?s?s?s?u +?l?u?u?u?s?s?s?s +?l?u?u?s?l?l?l?l +?l?u?u?s?l?l?l?u +?l?u?u?s?l?l?l?s +?l?u?u?s?l?l?u?l +?l?u?u?s?l?l?u?u +?l?u?u?s?l?l?u?s +?l?u?u?s?l?l?s?l +?l?u?u?s?l?l?s?u +?l?u?u?s?l?l?s?s +?l?u?u?s?l?u?l?l +?l?u?u?s?l?u?l?u +?l?u?u?s?l?u?l?s +?l?u?u?s?l?u?u?l +?l?u?u?s?l?u?u?u +?l?u?u?s?l?u?u?s +?l?u?u?s?l?u?s?l +?l?u?u?s?l?u?s?u +?l?u?u?s?l?u?s?s +?l?u?u?s?l?s?l?l +?l?u?u?s?l?s?l?u +?l?u?u?s?l?s?l?s +?l?u?u?s?l?s?u?l +?l?u?u?s?l?s?u?u +?l?u?u?s?l?s?u?s +?l?u?u?s?l?s?s?l +?l?u?u?s?l?s?s?u +?l?u?u?s?l?s?s?s +?l?u?u?s?u?l?l?l +?l?u?u?s?u?l?l?u +?l?u?u?s?u?l?l?s +?l?u?u?s?u?l?u?l +?l?u?u?s?u?l?u?u +?l?u?u?s?u?l?u?s +?l?u?u?s?u?l?s?l +?l?u?u?s?u?l?s?u +?l?u?u?s?u?l?s?s +?l?u?u?s?u?u?l?l +?l?u?u?s?u?u?l?u +?l?u?u?s?u?u?l?s +?l?u?u?s?u?u?u?l +?l?u?u?s?u?u?u?u +?l?u?u?s?u?u?u?s +?l?u?u?s?u?u?s?l +?l?u?u?s?u?u?s?u +?l?u?u?s?u?u?s?s +?l?u?u?s?u?s?l?l +?l?u?u?s?u?s?l?u +?l?u?u?s?u?s?l?s +?l?u?u?s?u?s?u?l +?l?u?u?s?u?s?u?u +?l?u?u?s?u?s?u?s +?l?u?u?s?u?s?s?l +?l?u?u?s?u?s?s?u +?l?u?u?s?u?s?s?s +?l?u?u?s?s?l?l?l +?l?u?u?s?s?l?l?u +?l?u?u?s?s?l?l?s +?l?u?u?s?s?l?u?l +?l?u?u?s?s?l?u?u +?l?u?u?s?s?l?u?s +?l?u?u?s?s?l?s?l +?l?u?u?s?s?l?s?u +?l?u?u?s?s?l?s?s +?l?u?u?s?s?u?l?l +?l?u?u?s?s?u?l?u +?l?u?u?s?s?u?l?s +?l?u?u?s?s?u?u?l +?l?u?u?s?s?u?u?u +?l?u?u?s?s?u?u?s +?l?u?u?s?s?u?s?l +?l?u?u?s?s?u?s?u +?l?u?u?s?s?u?s?s +?l?u?u?s?s?s?l?l +?l?u?u?s?s?s?l?u +?l?u?u?s?s?s?l?s +?l?u?u?s?s?s?u?l +?l?u?u?s?s?s?u?u +?l?u?u?s?s?s?u?s +?l?u?u?s?s?s?s?l +?l?u?u?s?s?s?s?u +?l?u?u?s?s?s?s?s +?l?u?s?l?l?l?l?l +?l?u?s?l?l?l?l?u +?l?u?s?l?l?l?l?s +?l?u?s?l?l?l?u?l +?l?u?s?l?l?l?u?u +?l?u?s?l?l?l?u?s +?l?u?s?l?l?l?s?l +?l?u?s?l?l?l?s?u +?l?u?s?l?l?l?s?s +?l?u?s?l?l?u?l?l +?l?u?s?l?l?u?l?u +?l?u?s?l?l?u?l?s +?l?u?s?l?l?u?u?l +?l?u?s?l?l?u?u?u +?l?u?s?l?l?u?u?s +?l?u?s?l?l?u?s?l +?l?u?s?l?l?u?s?u +?l?u?s?l?l?u?s?s +?l?u?s?l?l?s?l?l +?l?u?s?l?l?s?l?u +?l?u?s?l?l?s?l?s +?l?u?s?l?l?s?u?l +?l?u?s?l?l?s?u?u +?l?u?s?l?l?s?u?s +?l?u?s?l?l?s?s?l +?l?u?s?l?l?s?s?u +?l?u?s?l?l?s?s?s +?l?u?s?l?u?l?l?l +?l?u?s?l?u?l?l?u +?l?u?s?l?u?l?l?s +?l?u?s?l?u?l?u?l +?l?u?s?l?u?l?u?u +?l?u?s?l?u?l?u?s +?l?u?s?l?u?l?s?l +?l?u?s?l?u?l?s?u +?l?u?s?l?u?l?s?s +?l?u?s?l?u?u?l?l +?l?u?s?l?u?u?l?u +?l?u?s?l?u?u?l?s +?l?u?s?l?u?u?u?l +?l?u?s?l?u?u?u?u +?l?u?s?l?u?u?u?s +?l?u?s?l?u?u?s?l +?l?u?s?l?u?u?s?u +?l?u?s?l?u?u?s?s +?l?u?s?l?u?s?l?l +?l?u?s?l?u?s?l?u +?l?u?s?l?u?s?l?s +?l?u?s?l?u?s?u?l +?l?u?s?l?u?s?u?u +?l?u?s?l?u?s?u?s +?l?u?s?l?u?s?s?l +?l?u?s?l?u?s?s?u +?l?u?s?l?u?s?s?s +?l?u?s?l?s?l?l?l +?l?u?s?l?s?l?l?u +?l?u?s?l?s?l?l?s +?l?u?s?l?s?l?u?l +?l?u?s?l?s?l?u?u +?l?u?s?l?s?l?u?s +?l?u?s?l?s?l?s?l +?l?u?s?l?s?l?s?u +?l?u?s?l?s?l?s?s +?l?u?s?l?s?u?l?l +?l?u?s?l?s?u?l?u +?l?u?s?l?s?u?l?s +?l?u?s?l?s?u?u?l +?l?u?s?l?s?u?u?u +?l?u?s?l?s?u?u?s +?l?u?s?l?s?u?s?l +?l?u?s?l?s?u?s?u +?l?u?s?l?s?u?s?s +?l?u?s?l?s?s?l?l +?l?u?s?l?s?s?l?u +?l?u?s?l?s?s?l?s +?l?u?s?l?s?s?u?l +?l?u?s?l?s?s?u?u +?l?u?s?l?s?s?u?s +?l?u?s?l?s?s?s?l +?l?u?s?l?s?s?s?u +?l?u?s?l?s?s?s?s +?l?u?s?u?l?l?l?l +?l?u?s?u?l?l?l?u +?l?u?s?u?l?l?l?s +?l?u?s?u?l?l?u?l +?l?u?s?u?l?l?u?u +?l?u?s?u?l?l?u?s +?l?u?s?u?l?l?s?l +?l?u?s?u?l?l?s?u +?l?u?s?u?l?l?s?s +?l?u?s?u?l?u?l?l +?l?u?s?u?l?u?l?u +?l?u?s?u?l?u?l?s +?l?u?s?u?l?u?u?l +?l?u?s?u?l?u?u?u +?l?u?s?u?l?u?u?s +?l?u?s?u?l?u?s?l +?l?u?s?u?l?u?s?u +?l?u?s?u?l?u?s?s +?l?u?s?u?l?s?l?l +?l?u?s?u?l?s?l?u +?l?u?s?u?l?s?l?s +?l?u?s?u?l?s?u?l +?l?u?s?u?l?s?u?u +?l?u?s?u?l?s?u?s +?l?u?s?u?l?s?s?l +?l?u?s?u?l?s?s?u +?l?u?s?u?l?s?s?s +?l?u?s?u?u?l?l?l +?l?u?s?u?u?l?l?u +?l?u?s?u?u?l?l?s +?l?u?s?u?u?l?u?l +?l?u?s?u?u?l?u?u +?l?u?s?u?u?l?u?s +?l?u?s?u?u?l?s?l +?l?u?s?u?u?l?s?u +?l?u?s?u?u?l?s?s +?l?u?s?u?u?u?l?l +?l?u?s?u?u?u?l?u +?l?u?s?u?u?u?l?s +?l?u?s?u?u?u?u?l +?l?u?s?u?u?u?u?u +?l?u?s?u?u?u?u?s +?l?u?s?u?u?u?s?l +?l?u?s?u?u?u?s?u +?l?u?s?u?u?u?s?s +?l?u?s?u?u?s?l?l +?l?u?s?u?u?s?l?u +?l?u?s?u?u?s?l?s +?l?u?s?u?u?s?u?l +?l?u?s?u?u?s?u?u +?l?u?s?u?u?s?u?s +?l?u?s?u?u?s?s?l +?l?u?s?u?u?s?s?u +?l?u?s?u?u?s?s?s +?l?u?s?u?s?l?l?l +?l?u?s?u?s?l?l?u +?l?u?s?u?s?l?l?s +?l?u?s?u?s?l?u?l +?l?u?s?u?s?l?u?u +?l?u?s?u?s?l?u?s +?l?u?s?u?s?l?s?l +?l?u?s?u?s?l?s?u +?l?u?s?u?s?l?s?s +?l?u?s?u?s?u?l?l +?l?u?s?u?s?u?l?u +?l?u?s?u?s?u?l?s +?l?u?s?u?s?u?u?l +?l?u?s?u?s?u?u?u +?l?u?s?u?s?u?u?s +?l?u?s?u?s?u?s?l +?l?u?s?u?s?u?s?u +?l?u?s?u?s?u?s?s +?l?u?s?u?s?s?l?l +?l?u?s?u?s?s?l?u +?l?u?s?u?s?s?l?s +?l?u?s?u?s?s?u?l +?l?u?s?u?s?s?u?u +?l?u?s?u?s?s?u?s +?l?u?s?u?s?s?s?l +?l?u?s?u?s?s?s?u +?l?u?s?u?s?s?s?s +?l?u?s?s?l?l?l?l +?l?u?s?s?l?l?l?u +?l?u?s?s?l?l?l?s +?l?u?s?s?l?l?u?l +?l?u?s?s?l?l?u?u +?l?u?s?s?l?l?u?s +?l?u?s?s?l?l?s?l +?l?u?s?s?l?l?s?u +?l?u?s?s?l?l?s?s +?l?u?s?s?l?u?l?l +?l?u?s?s?l?u?l?u +?l?u?s?s?l?u?l?s +?l?u?s?s?l?u?u?l +?l?u?s?s?l?u?u?u +?l?u?s?s?l?u?u?s +?l?u?s?s?l?u?s?l +?l?u?s?s?l?u?s?u +?l?u?s?s?l?u?s?s +?l?u?s?s?l?s?l?l +?l?u?s?s?l?s?l?u +?l?u?s?s?l?s?l?s +?l?u?s?s?l?s?u?l +?l?u?s?s?l?s?u?u +?l?u?s?s?l?s?u?s +?l?u?s?s?l?s?s?l +?l?u?s?s?l?s?s?u +?l?u?s?s?l?s?s?s +?l?u?s?s?u?l?l?l +?l?u?s?s?u?l?l?u +?l?u?s?s?u?l?l?s +?l?u?s?s?u?l?u?l +?l?u?s?s?u?l?u?u +?l?u?s?s?u?l?u?s +?l?u?s?s?u?l?s?l +?l?u?s?s?u?l?s?u +?l?u?s?s?u?l?s?s +?l?u?s?s?u?u?l?l +?l?u?s?s?u?u?l?u +?l?u?s?s?u?u?l?s +?l?u?s?s?u?u?u?l +?l?u?s?s?u?u?u?u +?l?u?s?s?u?u?u?s +?l?u?s?s?u?u?s?l +?l?u?s?s?u?u?s?u +?l?u?s?s?u?u?s?s +?l?u?s?s?u?s?l?l +?l?u?s?s?u?s?l?u +?l?u?s?s?u?s?l?s +?l?u?s?s?u?s?u?l +?l?u?s?s?u?s?u?u +?l?u?s?s?u?s?u?s +?l?u?s?s?u?s?s?l +?l?u?s?s?u?s?s?u +?l?u?s?s?u?s?s?s +?l?u?s?s?s?l?l?l +?l?u?s?s?s?l?l?u +?l?u?s?s?s?l?l?s +?l?u?s?s?s?l?u?l +?l?u?s?s?s?l?u?u +?l?u?s?s?s?l?u?s +?l?u?s?s?s?l?s?l +?l?u?s?s?s?l?s?u +?l?u?s?s?s?l?s?s +?l?u?s?s?s?u?l?l +?l?u?s?s?s?u?l?u +?l?u?s?s?s?u?l?s +?l?u?s?s?s?u?u?l +?l?u?s?s?s?u?u?u +?l?u?s?s?s?u?u?s +?l?u?s?s?s?u?s?l +?l?u?s?s?s?u?s?u +?l?u?s?s?s?u?s?s +?l?u?s?s?s?s?l?l +?l?u?s?s?s?s?l?u +?l?u?s?s?s?s?l?s +?l?u?s?s?s?s?u?l +?l?u?s?s?s?s?u?u +?l?u?s?s?s?s?u?s +?l?u?s?s?s?s?s?l +?l?u?s?s?s?s?s?u +?l?u?s?s?s?s?s?s +?l?s?d?d?d?d?d?d +?l?s?d?d?d?d?d?l +?l?s?d?d?d?d?d?s +?l?s?d?d?d?d?l?d +?l?s?d?d?d?d?l?l +?l?s?d?d?d?d?l?s +?l?s?d?d?d?d?s?d +?l?s?d?d?d?d?s?l +?l?s?d?d?d?d?s?s +?l?s?d?d?d?l?d?d +?l?s?d?d?d?l?d?l +?l?s?d?d?d?l?d?s +?l?s?d?d?d?l?l?d +?l?s?d?d?d?l?l?l +?l?s?d?d?d?l?l?s +?l?s?d?d?d?l?s?d +?l?s?d?d?d?l?s?l +?l?s?d?d?d?l?s?s +?l?s?d?d?d?s?d?d +?l?s?d?d?d?s?d?l +?l?s?d?d?d?s?d?s +?l?s?d?d?d?s?l?d +?l?s?d?d?d?s?l?l +?l?s?d?d?d?s?l?s +?l?s?d?d?d?s?s?d +?l?s?d?d?d?s?s?l +?l?s?d?d?d?s?s?s +?l?s?d?d?l?d?d?d +?l?s?d?d?l?d?d?l +?l?s?d?d?l?d?d?s +?l?s?d?d?l?d?l?d +?l?s?d?d?l?d?l?l +?l?s?d?d?l?d?l?s +?l?s?d?d?l?d?s?d +?l?s?d?d?l?d?s?l +?l?s?d?d?l?d?s?s +?l?s?d?d?l?l?d?d +?l?s?d?d?l?l?d?l +?l?s?d?d?l?l?d?s +?l?s?d?d?l?l?l?d +?l?s?d?d?l?l?l?l +?l?s?d?d?l?l?l?s +?l?s?d?d?l?l?s?d +?l?s?d?d?l?l?s?l +?l?s?d?d?l?l?s?s +?l?s?d?d?l?s?d?d +?l?s?d?d?l?s?d?l +?l?s?d?d?l?s?d?s +?l?s?d?d?l?s?l?d +?l?s?d?d?l?s?l?l +?l?s?d?d?l?s?l?s +?l?s?d?d?l?s?s?d +?l?s?d?d?l?s?s?l +?l?s?d?d?l?s?s?s +?l?s?d?d?s?d?d?d +?l?s?d?d?s?d?d?l +?l?s?d?d?s?d?d?s +?l?s?d?d?s?d?l?d +?l?s?d?d?s?d?l?l +?l?s?d?d?s?d?l?s +?l?s?d?d?s?d?s?d +?l?s?d?d?s?d?s?l +?l?s?d?d?s?d?s?s +?l?s?d?d?s?l?d?d +?l?s?d?d?s?l?d?l +?l?s?d?d?s?l?d?s +?l?s?d?d?s?l?l?d +?l?s?d?d?s?l?l?l +?l?s?d?d?s?l?l?s +?l?s?d?d?s?l?s?d +?l?s?d?d?s?l?s?l +?l?s?d?d?s?l?s?s +?l?s?d?d?s?s?d?d +?l?s?d?d?s?s?d?l +?l?s?d?d?s?s?d?s +?l?s?d?d?s?s?l?d +?l?s?d?d?s?s?l?l +?l?s?d?d?s?s?l?s +?l?s?d?d?s?s?s?d +?l?s?d?d?s?s?s?l +?l?s?d?d?s?s?s?s +?l?s?d?l?d?d?d?d +?l?s?d?l?d?d?d?l +?l?s?d?l?d?d?d?s +?l?s?d?l?d?d?l?d +?l?s?d?l?d?d?l?l +?l?s?d?l?d?d?l?s +?l?s?d?l?d?d?s?d +?l?s?d?l?d?d?s?l +?l?s?d?l?d?d?s?s +?l?s?d?l?d?l?d?d +?l?s?d?l?d?l?d?l +?l?s?d?l?d?l?d?s +?l?s?d?l?d?l?l?d +?l?s?d?l?d?l?l?l +?l?s?d?l?d?l?l?s +?l?s?d?l?d?l?s?d +?l?s?d?l?d?l?s?l +?l?s?d?l?d?l?s?s +?l?s?d?l?d?s?d?d +?l?s?d?l?d?s?d?l +?l?s?d?l?d?s?d?s +?l?s?d?l?d?s?l?d +?l?s?d?l?d?s?l?l +?l?s?d?l?d?s?l?s +?l?s?d?l?d?s?s?d +?l?s?d?l?d?s?s?l +?l?s?d?l?d?s?s?s +?l?s?d?l?l?d?d?d +?l?s?d?l?l?d?d?l +?l?s?d?l?l?d?d?s +?l?s?d?l?l?d?l?d +?l?s?d?l?l?d?l?l +?l?s?d?l?l?d?l?s +?l?s?d?l?l?d?s?d +?l?s?d?l?l?d?s?l +?l?s?d?l?l?d?s?s +?l?s?d?l?l?l?d?d +?l?s?d?l?l?l?d?l +?l?s?d?l?l?l?d?s +?l?s?d?l?l?l?l?d +?l?s?d?l?l?l?l?l +?l?s?d?l?l?l?l?s +?l?s?d?l?l?l?s?d +?l?s?d?l?l?l?s?l +?l?s?d?l?l?l?s?s +?l?s?d?l?l?s?d?d +?l?s?d?l?l?s?d?l +?l?s?d?l?l?s?d?s +?l?s?d?l?l?s?l?d +?l?s?d?l?l?s?l?l +?l?s?d?l?l?s?l?s +?l?s?d?l?l?s?s?d +?l?s?d?l?l?s?s?l +?l?s?d?l?l?s?s?s +?l?s?d?l?s?d?d?d +?l?s?d?l?s?d?d?l +?l?s?d?l?s?d?d?s +?l?s?d?l?s?d?l?d +?l?s?d?l?s?d?l?l +?l?s?d?l?s?d?l?s +?l?s?d?l?s?d?s?d +?l?s?d?l?s?d?s?l +?l?s?d?l?s?d?s?s +?l?s?d?l?s?l?d?d +?l?s?d?l?s?l?d?l +?l?s?d?l?s?l?d?s +?l?s?d?l?s?l?l?d +?l?s?d?l?s?l?l?l +?l?s?d?l?s?l?l?s +?l?s?d?l?s?l?s?d +?l?s?d?l?s?l?s?l +?l?s?d?l?s?l?s?s +?l?s?d?l?s?s?d?d +?l?s?d?l?s?s?d?l +?l?s?d?l?s?s?d?s +?l?s?d?l?s?s?l?d +?l?s?d?l?s?s?l?l +?l?s?d?l?s?s?l?s +?l?s?d?l?s?s?s?d +?l?s?d?l?s?s?s?l +?l?s?d?l?s?s?s?s +?l?s?d?s?d?d?d?d +?l?s?d?s?d?d?d?l +?l?s?d?s?d?d?d?s +?l?s?d?s?d?d?l?d +?l?s?d?s?d?d?l?l +?l?s?d?s?d?d?l?s +?l?s?d?s?d?d?s?d +?l?s?d?s?d?d?s?l +?l?s?d?s?d?d?s?s +?l?s?d?s?d?l?d?d +?l?s?d?s?d?l?d?l +?l?s?d?s?d?l?d?s +?l?s?d?s?d?l?l?d +?l?s?d?s?d?l?l?l +?l?s?d?s?d?l?l?s +?l?s?d?s?d?l?s?d +?l?s?d?s?d?l?s?l +?l?s?d?s?d?l?s?s +?l?s?d?s?d?s?d?d +?l?s?d?s?d?s?d?l +?l?s?d?s?d?s?d?s +?l?s?d?s?d?s?l?d +?l?s?d?s?d?s?l?l +?l?s?d?s?d?s?l?s +?l?s?d?s?d?s?s?d +?l?s?d?s?d?s?s?l +?l?s?d?s?d?s?s?s +?l?s?d?s?l?d?d?d +?l?s?d?s?l?d?d?l +?l?s?d?s?l?d?d?s +?l?s?d?s?l?d?l?d +?l?s?d?s?l?d?l?l +?l?s?d?s?l?d?l?s +?l?s?d?s?l?d?s?d +?l?s?d?s?l?d?s?l +?l?s?d?s?l?d?s?s +?l?s?d?s?l?l?d?d +?l?s?d?s?l?l?d?l +?l?s?d?s?l?l?d?s +?l?s?d?s?l?l?l?d +?l?s?d?s?l?l?l?l +?l?s?d?s?l?l?l?s +?l?s?d?s?l?l?s?d +?l?s?d?s?l?l?s?l +?l?s?d?s?l?l?s?s +?l?s?d?s?l?s?d?d +?l?s?d?s?l?s?d?l +?l?s?d?s?l?s?d?s +?l?s?d?s?l?s?l?d +?l?s?d?s?l?s?l?l +?l?s?d?s?l?s?l?s +?l?s?d?s?l?s?s?d +?l?s?d?s?l?s?s?l +?l?s?d?s?l?s?s?s +?l?s?d?s?s?d?d?d +?l?s?d?s?s?d?d?l +?l?s?d?s?s?d?d?s +?l?s?d?s?s?d?l?d +?l?s?d?s?s?d?l?l +?l?s?d?s?s?d?l?s +?l?s?d?s?s?d?s?d +?l?s?d?s?s?d?s?l +?l?s?d?s?s?d?s?s +?l?s?d?s?s?l?d?d +?l?s?d?s?s?l?d?l +?l?s?d?s?s?l?d?s +?l?s?d?s?s?l?l?d +?l?s?d?s?s?l?l?l +?l?s?d?s?s?l?l?s +?l?s?d?s?s?l?s?d +?l?s?d?s?s?l?s?l +?l?s?d?s?s?l?s?s +?l?s?d?s?s?s?d?d +?l?s?d?s?s?s?d?l +?l?s?d?s?s?s?d?s +?l?s?d?s?s?s?l?d +?l?s?d?s?s?s?l?l +?l?s?d?s?s?s?l?s +?l?s?d?s?s?s?s?d +?l?s?d?s?s?s?s?l +?l?s?d?s?s?s?s?s +?l?s?l?d?d?d?d?d +?l?s?l?d?d?d?d?l +?l?s?l?d?d?d?d?s +?l?s?l?d?d?d?l?d +?l?s?l?d?d?d?l?l +?l?s?l?d?d?d?l?s +?l?s?l?d?d?d?s?d +?l?s?l?d?d?d?s?l +?l?s?l?d?d?d?s?s +?l?s?l?d?d?l?d?d +?l?s?l?d?d?l?d?l +?l?s?l?d?d?l?d?s +?l?s?l?d?d?l?l?d +?l?s?l?d?d?l?l?l +?l?s?l?d?d?l?l?s +?l?s?l?d?d?l?s?d +?l?s?l?d?d?l?s?l +?l?s?l?d?d?l?s?s +?l?s?l?d?d?s?d?d +?l?s?l?d?d?s?d?l +?l?s?l?d?d?s?d?s +?l?s?l?d?d?s?l?d +?l?s?l?d?d?s?l?l +?l?s?l?d?d?s?l?s +?l?s?l?d?d?s?s?d +?l?s?l?d?d?s?s?l +?l?s?l?d?d?s?s?s +?l?s?l?d?l?d?d?d +?l?s?l?d?l?d?d?l +?l?s?l?d?l?d?d?s +?l?s?l?d?l?d?l?d +?l?s?l?d?l?d?l?l +?l?s?l?d?l?d?l?s +?l?s?l?d?l?d?s?d +?l?s?l?d?l?d?s?l +?l?s?l?d?l?d?s?s +?l?s?l?d?l?l?d?d +?l?s?l?d?l?l?d?l +?l?s?l?d?l?l?d?s +?l?s?l?d?l?l?l?d +?l?s?l?d?l?l?l?l +?l?s?l?d?l?l?l?s +?l?s?l?d?l?l?s?d +?l?s?l?d?l?l?s?l +?l?s?l?d?l?l?s?s +?l?s?l?d?l?s?d?d +?l?s?l?d?l?s?d?l +?l?s?l?d?l?s?d?s +?l?s?l?d?l?s?l?d +?l?s?l?d?l?s?l?l +?l?s?l?d?l?s?l?s +?l?s?l?d?l?s?s?d +?l?s?l?d?l?s?s?l +?l?s?l?d?l?s?s?s +?l?s?l?d?s?d?d?d +?l?s?l?d?s?d?d?l +?l?s?l?d?s?d?d?s +?l?s?l?d?s?d?l?d +?l?s?l?d?s?d?l?l +?l?s?l?d?s?d?l?s +?l?s?l?d?s?d?s?d +?l?s?l?d?s?d?s?l +?l?s?l?d?s?d?s?s +?l?s?l?d?s?l?d?d +?l?s?l?d?s?l?d?l +?l?s?l?d?s?l?d?s +?l?s?l?d?s?l?l?d +?l?s?l?d?s?l?l?l +?l?s?l?d?s?l?l?s +?l?s?l?d?s?l?s?d +?l?s?l?d?s?l?s?l +?l?s?l?d?s?l?s?s +?l?s?l?d?s?s?d?d +?l?s?l?d?s?s?d?l +?l?s?l?d?s?s?d?s +?l?s?l?d?s?s?l?d +?l?s?l?d?s?s?l?l +?l?s?l?d?s?s?l?s +?l?s?l?d?s?s?s?d +?l?s?l?d?s?s?s?l +?l?s?l?d?s?s?s?s +?l?s?l?l?d?d?d?d +?l?s?l?l?d?d?d?l +?l?s?l?l?d?d?d?s +?l?s?l?l?d?d?l?d +?l?s?l?l?d?d?l?l +?l?s?l?l?d?d?l?s +?l?s?l?l?d?d?s?d +?l?s?l?l?d?d?s?l +?l?s?l?l?d?d?s?s +?l?s?l?l?d?l?d?d +?l?s?l?l?d?l?d?l +?l?s?l?l?d?l?d?s +?l?s?l?l?d?l?l?d +?l?s?l?l?d?l?l?l +?l?s?l?l?d?l?l?s +?l?s?l?l?d?l?s?d +?l?s?l?l?d?l?s?l +?l?s?l?l?d?l?s?s +?l?s?l?l?d?s?d?d +?l?s?l?l?d?s?d?l +?l?s?l?l?d?s?d?s +?l?s?l?l?d?s?l?d +?l?s?l?l?d?s?l?l +?l?s?l?l?d?s?l?s +?l?s?l?l?d?s?s?d +?l?s?l?l?d?s?s?l +?l?s?l?l?d?s?s?s +?l?s?l?l?l?d?d?d +?l?s?l?l?l?d?d?l +?l?s?l?l?l?d?d?s +?l?s?l?l?l?d?l?d +?l?s?l?l?l?d?l?l +?l?s?l?l?l?d?l?s +?l?s?l?l?l?d?s?d +?l?s?l?l?l?d?s?l +?l?s?l?l?l?d?s?s +?l?s?l?l?l?l?d?d +?l?s?l?l?l?l?d?l +?l?s?l?l?l?l?d?s +?l?s?l?l?l?l?l?d +?l?s?l?l?l?l?l?l +?l?s?l?l?l?l?l?u +?l?s?l?l?l?l?l?s +?l?s?l?l?l?l?u?l +?l?s?l?l?l?l?u?u +?l?s?l?l?l?l?u?s +?l?s?l?l?l?l?s?d +?l?s?l?l?l?l?s?l +?l?s?l?l?l?l?s?u +?l?s?l?l?l?l?s?s +?l?s?l?l?l?u?l?l +?l?s?l?l?l?u?l?u +?l?s?l?l?l?u?l?s +?l?s?l?l?l?u?u?l +?l?s?l?l?l?u?u?u +?l?s?l?l?l?u?u?s +?l?s?l?l?l?u?s?l +?l?s?l?l?l?u?s?u +?l?s?l?l?l?u?s?s +?l?s?l?l?l?s?d?d +?l?s?l?l?l?s?d?l +?l?s?l?l?l?s?d?s +?l?s?l?l?l?s?l?d +?l?s?l?l?l?s?l?l +?l?s?l?l?l?s?l?u +?l?s?l?l?l?s?l?s +?l?s?l?l?l?s?u?l +?l?s?l?l?l?s?u?u +?l?s?l?l?l?s?u?s +?l?s?l?l?l?s?s?d +?l?s?l?l?l?s?s?l +?l?s?l?l?l?s?s?u +?l?s?l?l?l?s?s?s +?l?s?l?l?u?l?l?l +?l?s?l?l?u?l?l?u +?l?s?l?l?u?l?l?s +?l?s?l?l?u?l?u?l +?l?s?l?l?u?l?u?u +?l?s?l?l?u?l?u?s +?l?s?l?l?u?l?s?l +?l?s?l?l?u?l?s?u +?l?s?l?l?u?l?s?s +?l?s?l?l?u?u?l?l +?l?s?l?l?u?u?l?u +?l?s?l?l?u?u?l?s +?l?s?l?l?u?u?u?l +?l?s?l?l?u?u?u?u +?l?s?l?l?u?u?u?s +?l?s?l?l?u?u?s?l +?l?s?l?l?u?u?s?u +?l?s?l?l?u?u?s?s +?l?s?l?l?u?s?l?l +?l?s?l?l?u?s?l?u +?l?s?l?l?u?s?l?s +?l?s?l?l?u?s?u?l +?l?s?l?l?u?s?u?u +?l?s?l?l?u?s?u?s +?l?s?l?l?u?s?s?l +?l?s?l?l?u?s?s?u +?l?s?l?l?u?s?s?s +?l?s?l?l?s?d?d?d +?l?s?l?l?s?d?d?l +?l?s?l?l?s?d?d?s +?l?s?l?l?s?d?l?d +?l?s?l?l?s?d?l?l +?l?s?l?l?s?d?l?s +?l?s?l?l?s?d?s?d +?l?s?l?l?s?d?s?l +?l?s?l?l?s?d?s?s +?l?s?l?l?s?l?d?d +?l?s?l?l?s?l?d?l +?l?s?l?l?s?l?d?s +?l?s?l?l?s?l?l?d +?l?s?l?l?s?l?l?l +?l?s?l?l?s?l?l?u +?l?s?l?l?s?l?l?s +?l?s?l?l?s?l?u?l +?l?s?l?l?s?l?u?u +?l?s?l?l?s?l?u?s +?l?s?l?l?s?l?s?d +?l?s?l?l?s?l?s?l +?l?s?l?l?s?l?s?u +?l?s?l?l?s?l?s?s +?l?s?l?l?s?u?l?l +?l?s?l?l?s?u?l?u +?l?s?l?l?s?u?l?s +?l?s?l?l?s?u?u?l +?l?s?l?l?s?u?u?u +?l?s?l?l?s?u?u?s +?l?s?l?l?s?u?s?l +?l?s?l?l?s?u?s?u +?l?s?l?l?s?u?s?s +?l?s?l?l?s?s?d?d +?l?s?l?l?s?s?d?l +?l?s?l?l?s?s?d?s +?l?s?l?l?s?s?l?d +?l?s?l?l?s?s?l?l +?l?s?l?l?s?s?l?u +?l?s?l?l?s?s?l?s +?l?s?l?l?s?s?u?l +?l?s?l?l?s?s?u?u +?l?s?l?l?s?s?u?s +?l?s?l?l?s?s?s?d +?l?s?l?l?s?s?s?l +?l?s?l?l?s?s?s?u +?l?s?l?l?s?s?s?s +?l?s?l?u?l?l?l?l +?l?s?l?u?l?l?l?u +?l?s?l?u?l?l?l?s +?l?s?l?u?l?l?u?l +?l?s?l?u?l?l?u?u +?l?s?l?u?l?l?u?s +?l?s?l?u?l?l?s?l +?l?s?l?u?l?l?s?u +?l?s?l?u?l?l?s?s +?l?s?l?u?l?u?l?l +?l?s?l?u?l?u?l?u +?l?s?l?u?l?u?l?s +?l?s?l?u?l?u?u?l +?l?s?l?u?l?u?u?u +?l?s?l?u?l?u?u?s +?l?s?l?u?l?u?s?l +?l?s?l?u?l?u?s?u +?l?s?l?u?l?u?s?s +?l?s?l?u?l?s?l?l +?l?s?l?u?l?s?l?u +?l?s?l?u?l?s?l?s +?l?s?l?u?l?s?u?l +?l?s?l?u?l?s?u?u +?l?s?l?u?l?s?u?s +?l?s?l?u?l?s?s?l +?l?s?l?u?l?s?s?u +?l?s?l?u?l?s?s?s +?l?s?l?u?u?l?l?l +?l?s?l?u?u?l?l?u +?l?s?l?u?u?l?l?s +?l?s?l?u?u?l?u?l +?l?s?l?u?u?l?u?u +?l?s?l?u?u?l?u?s +?l?s?l?u?u?l?s?l +?l?s?l?u?u?l?s?u +?l?s?l?u?u?l?s?s +?l?s?l?u?u?u?l?l +?l?s?l?u?u?u?l?u +?l?s?l?u?u?u?l?s +?l?s?l?u?u?u?u?l +?l?s?l?u?u?u?u?u +?l?s?l?u?u?u?u?s +?l?s?l?u?u?u?s?l +?l?s?l?u?u?u?s?u +?l?s?l?u?u?u?s?s +?l?s?l?u?u?s?l?l +?l?s?l?u?u?s?l?u +?l?s?l?u?u?s?l?s +?l?s?l?u?u?s?u?l +?l?s?l?u?u?s?u?u +?l?s?l?u?u?s?u?s +?l?s?l?u?u?s?s?l +?l?s?l?u?u?s?s?u +?l?s?l?u?u?s?s?s +?l?s?l?u?s?l?l?l +?l?s?l?u?s?l?l?u +?l?s?l?u?s?l?l?s +?l?s?l?u?s?l?u?l +?l?s?l?u?s?l?u?u +?l?s?l?u?s?l?u?s +?l?s?l?u?s?l?s?l +?l?s?l?u?s?l?s?u +?l?s?l?u?s?l?s?s +?l?s?l?u?s?u?l?l +?l?s?l?u?s?u?l?u +?l?s?l?u?s?u?l?s +?l?s?l?u?s?u?u?l +?l?s?l?u?s?u?u?u +?l?s?l?u?s?u?u?s +?l?s?l?u?s?u?s?l +?l?s?l?u?s?u?s?u +?l?s?l?u?s?u?s?s +?l?s?l?u?s?s?l?l +?l?s?l?u?s?s?l?u +?l?s?l?u?s?s?l?s +?l?s?l?u?s?s?u?l +?l?s?l?u?s?s?u?u +?l?s?l?u?s?s?u?s +?l?s?l?u?s?s?s?l +?l?s?l?u?s?s?s?u +?l?s?l?u?s?s?s?s +?l?s?l?s?d?d?d?d +?l?s?l?s?d?d?d?l +?l?s?l?s?d?d?d?s +?l?s?l?s?d?d?l?d +?l?s?l?s?d?d?l?l +?l?s?l?s?d?d?l?s +?l?s?l?s?d?d?s?d +?l?s?l?s?d?d?s?l +?l?s?l?s?d?d?s?s +?l?s?l?s?d?l?d?d +?l?s?l?s?d?l?d?l +?l?s?l?s?d?l?d?s +?l?s?l?s?d?l?l?d +?l?s?l?s?d?l?l?l +?l?s?l?s?d?l?l?s +?l?s?l?s?d?l?s?d +?l?s?l?s?d?l?s?l +?l?s?l?s?d?l?s?s +?l?s?l?s?d?s?d?d +?l?s?l?s?d?s?d?l +?l?s?l?s?d?s?d?s +?l?s?l?s?d?s?l?d +?l?s?l?s?d?s?l?l +?l?s?l?s?d?s?l?s +?l?s?l?s?d?s?s?d +?l?s?l?s?d?s?s?l +?l?s?l?s?d?s?s?s +?l?s?l?s?l?d?d?d +?l?s?l?s?l?d?d?l +?l?s?l?s?l?d?d?s +?l?s?l?s?l?d?l?d +?l?s?l?s?l?d?l?l +?l?s?l?s?l?d?l?s +?l?s?l?s?l?d?s?d +?l?s?l?s?l?d?s?l +?l?s?l?s?l?d?s?s +?l?s?l?s?l?l?d?d +?l?s?l?s?l?l?d?l +?l?s?l?s?l?l?d?s +?l?s?l?s?l?l?l?d +?l?s?l?s?l?l?l?l +?l?s?l?s?l?l?l?u +?l?s?l?s?l?l?l?s +?l?s?l?s?l?l?u?l +?l?s?l?s?l?l?u?u +?l?s?l?s?l?l?u?s +?l?s?l?s?l?l?s?d +?l?s?l?s?l?l?s?l +?l?s?l?s?l?l?s?u +?l?s?l?s?l?l?s?s +?l?s?l?s?l?u?l?l +?l?s?l?s?l?u?l?u +?l?s?l?s?l?u?l?s +?l?s?l?s?l?u?u?l +?l?s?l?s?l?u?u?u +?l?s?l?s?l?u?u?s +?l?s?l?s?l?u?s?l +?l?s?l?s?l?u?s?u +?l?s?l?s?l?u?s?s +?l?s?l?s?l?s?d?d +?l?s?l?s?l?s?d?l +?l?s?l?s?l?s?d?s +?l?s?l?s?l?s?l?d +?l?s?l?s?l?s?l?l +?l?s?l?s?l?s?l?u +?l?s?l?s?l?s?l?s +?l?s?l?s?l?s?u?l +?l?s?l?s?l?s?u?u +?l?s?l?s?l?s?u?s +?l?s?l?s?l?s?s?d +?l?s?l?s?l?s?s?l +?l?s?l?s?l?s?s?u +?l?s?l?s?l?s?s?s +?l?s?l?s?u?l?l?l +?l?s?l?s?u?l?l?u +?l?s?l?s?u?l?l?s +?l?s?l?s?u?l?u?l +?l?s?l?s?u?l?u?u +?l?s?l?s?u?l?u?s +?l?s?l?s?u?l?s?l +?l?s?l?s?u?l?s?u +?l?s?l?s?u?l?s?s +?l?s?l?s?u?u?l?l +?l?s?l?s?u?u?l?u +?l?s?l?s?u?u?l?s +?l?s?l?s?u?u?u?l +?l?s?l?s?u?u?u?u +?l?s?l?s?u?u?u?s +?l?s?l?s?u?u?s?l +?l?s?l?s?u?u?s?u +?l?s?l?s?u?u?s?s +?l?s?l?s?u?s?l?l +?l?s?l?s?u?s?l?u +?l?s?l?s?u?s?l?s +?l?s?l?s?u?s?u?l +?l?s?l?s?u?s?u?u +?l?s?l?s?u?s?u?s +?l?s?l?s?u?s?s?l +?l?s?l?s?u?s?s?u +?l?s?l?s?u?s?s?s +?l?s?l?s?s?d?d?d +?l?s?l?s?s?d?d?l +?l?s?l?s?s?d?d?s +?l?s?l?s?s?d?l?d +?l?s?l?s?s?d?l?l +?l?s?l?s?s?d?l?s +?l?s?l?s?s?d?s?d +?l?s?l?s?s?d?s?l +?l?s?l?s?s?d?s?s +?l?s?l?s?s?l?d?d +?l?s?l?s?s?l?d?l +?l?s?l?s?s?l?d?s +?l?s?l?s?s?l?l?d +?l?s?l?s?s?l?l?l +?l?s?l?s?s?l?l?u +?l?s?l?s?s?l?l?s +?l?s?l?s?s?l?u?l +?l?s?l?s?s?l?u?u +?l?s?l?s?s?l?u?s +?l?s?l?s?s?l?s?d +?l?s?l?s?s?l?s?l +?l?s?l?s?s?l?s?u +?l?s?l?s?s?l?s?s +?l?s?l?s?s?u?l?l +?l?s?l?s?s?u?l?u +?l?s?l?s?s?u?l?s +?l?s?l?s?s?u?u?l +?l?s?l?s?s?u?u?u +?l?s?l?s?s?u?u?s +?l?s?l?s?s?u?s?l +?l?s?l?s?s?u?s?u +?l?s?l?s?s?u?s?s +?l?s?l?s?s?s?d?d +?l?s?l?s?s?s?d?l +?l?s?l?s?s?s?d?s +?l?s?l?s?s?s?l?d +?l?s?l?s?s?s?l?l +?l?s?l?s?s?s?l?u +?l?s?l?s?s?s?l?s +?l?s?l?s?s?s?u?l +?l?s?l?s?s?s?u?u +?l?s?l?s?s?s?u?s +?l?s?l?s?s?s?s?d +?l?s?l?s?s?s?s?l +?l?s?l?s?s?s?s?u +?l?s?l?s?s?s?s?s +?l?s?u?l?l?l?l?l +?l?s?u?l?l?l?l?u +?l?s?u?l?l?l?l?s +?l?s?u?l?l?l?u?l +?l?s?u?l?l?l?u?u +?l?s?u?l?l?l?u?s +?l?s?u?l?l?l?s?l +?l?s?u?l?l?l?s?u +?l?s?u?l?l?l?s?s +?l?s?u?l?l?u?l?l +?l?s?u?l?l?u?l?u +?l?s?u?l?l?u?l?s +?l?s?u?l?l?u?u?l +?l?s?u?l?l?u?u?u +?l?s?u?l?l?u?u?s +?l?s?u?l?l?u?s?l +?l?s?u?l?l?u?s?u +?l?s?u?l?l?u?s?s +?l?s?u?l?l?s?l?l +?l?s?u?l?l?s?l?u +?l?s?u?l?l?s?l?s +?l?s?u?l?l?s?u?l +?l?s?u?l?l?s?u?u +?l?s?u?l?l?s?u?s +?l?s?u?l?l?s?s?l +?l?s?u?l?l?s?s?u +?l?s?u?l?l?s?s?s +?l?s?u?l?u?l?l?l +?l?s?u?l?u?l?l?u +?l?s?u?l?u?l?l?s +?l?s?u?l?u?l?u?l +?l?s?u?l?u?l?u?u +?l?s?u?l?u?l?u?s +?l?s?u?l?u?l?s?l +?l?s?u?l?u?l?s?u +?l?s?u?l?u?l?s?s +?l?s?u?l?u?u?l?l +?l?s?u?l?u?u?l?u +?l?s?u?l?u?u?l?s +?l?s?u?l?u?u?u?l +?l?s?u?l?u?u?u?u +?l?s?u?l?u?u?u?s +?l?s?u?l?u?u?s?l +?l?s?u?l?u?u?s?u +?l?s?u?l?u?u?s?s +?l?s?u?l?u?s?l?l +?l?s?u?l?u?s?l?u +?l?s?u?l?u?s?l?s +?l?s?u?l?u?s?u?l +?l?s?u?l?u?s?u?u +?l?s?u?l?u?s?u?s +?l?s?u?l?u?s?s?l +?l?s?u?l?u?s?s?u +?l?s?u?l?u?s?s?s +?l?s?u?l?s?l?l?l +?l?s?u?l?s?l?l?u +?l?s?u?l?s?l?l?s +?l?s?u?l?s?l?u?l +?l?s?u?l?s?l?u?u +?l?s?u?l?s?l?u?s +?l?s?u?l?s?l?s?l +?l?s?u?l?s?l?s?u +?l?s?u?l?s?l?s?s +?l?s?u?l?s?u?l?l +?l?s?u?l?s?u?l?u +?l?s?u?l?s?u?l?s +?l?s?u?l?s?u?u?l +?l?s?u?l?s?u?u?u +?l?s?u?l?s?u?u?s +?l?s?u?l?s?u?s?l +?l?s?u?l?s?u?s?u +?l?s?u?l?s?u?s?s +?l?s?u?l?s?s?l?l +?l?s?u?l?s?s?l?u +?l?s?u?l?s?s?l?s +?l?s?u?l?s?s?u?l +?l?s?u?l?s?s?u?u +?l?s?u?l?s?s?u?s +?l?s?u?l?s?s?s?l +?l?s?u?l?s?s?s?u +?l?s?u?l?s?s?s?s +?l?s?u?u?l?l?l?l +?l?s?u?u?l?l?l?u +?l?s?u?u?l?l?l?s +?l?s?u?u?l?l?u?l +?l?s?u?u?l?l?u?u +?l?s?u?u?l?l?u?s +?l?s?u?u?l?l?s?l +?l?s?u?u?l?l?s?u +?l?s?u?u?l?l?s?s +?l?s?u?u?l?u?l?l +?l?s?u?u?l?u?l?u +?l?s?u?u?l?u?l?s +?l?s?u?u?l?u?u?l +?l?s?u?u?l?u?u?u +?l?s?u?u?l?u?u?s +?l?s?u?u?l?u?s?l +?l?s?u?u?l?u?s?u +?l?s?u?u?l?u?s?s +?l?s?u?u?l?s?l?l +?l?s?u?u?l?s?l?u +?l?s?u?u?l?s?l?s +?l?s?u?u?l?s?u?l +?l?s?u?u?l?s?u?u +?l?s?u?u?l?s?u?s +?l?s?u?u?l?s?s?l +?l?s?u?u?l?s?s?u +?l?s?u?u?l?s?s?s +?l?s?u?u?u?l?l?l +?l?s?u?u?u?l?l?u +?l?s?u?u?u?l?l?s +?l?s?u?u?u?l?u?l +?l?s?u?u?u?l?u?u +?l?s?u?u?u?l?u?s +?l?s?u?u?u?l?s?l +?l?s?u?u?u?l?s?u +?l?s?u?u?u?l?s?s +?l?s?u?u?u?u?l?l +?l?s?u?u?u?u?l?u +?l?s?u?u?u?u?l?s +?l?s?u?u?u?u?u?l +?l?s?u?u?u?u?u?u +?l?s?u?u?u?u?u?s +?l?s?u?u?u?u?s?l +?l?s?u?u?u?u?s?u +?l?s?u?u?u?u?s?s +?l?s?u?u?u?s?l?l +?l?s?u?u?u?s?l?u +?l?s?u?u?u?s?l?s +?l?s?u?u?u?s?u?l +?l?s?u?u?u?s?u?u +?l?s?u?u?u?s?u?s +?l?s?u?u?u?s?s?l +?l?s?u?u?u?s?s?u +?l?s?u?u?u?s?s?s +?l?s?u?u?s?l?l?l +?l?s?u?u?s?l?l?u +?l?s?u?u?s?l?l?s +?l?s?u?u?s?l?u?l +?l?s?u?u?s?l?u?u +?l?s?u?u?s?l?u?s +?l?s?u?u?s?l?s?l +?l?s?u?u?s?l?s?u +?l?s?u?u?s?l?s?s +?l?s?u?u?s?u?l?l +?l?s?u?u?s?u?l?u +?l?s?u?u?s?u?l?s +?l?s?u?u?s?u?u?l +?l?s?u?u?s?u?u?u +?l?s?u?u?s?u?u?s +?l?s?u?u?s?u?s?l +?l?s?u?u?s?u?s?u +?l?s?u?u?s?u?s?s +?l?s?u?u?s?s?l?l +?l?s?u?u?s?s?l?u +?l?s?u?u?s?s?l?s +?l?s?u?u?s?s?u?l +?l?s?u?u?s?s?u?u +?l?s?u?u?s?s?u?s +?l?s?u?u?s?s?s?l +?l?s?u?u?s?s?s?u +?l?s?u?u?s?s?s?s +?l?s?u?s?l?l?l?l +?l?s?u?s?l?l?l?u +?l?s?u?s?l?l?l?s +?l?s?u?s?l?l?u?l +?l?s?u?s?l?l?u?u +?l?s?u?s?l?l?u?s +?l?s?u?s?l?l?s?l +?l?s?u?s?l?l?s?u +?l?s?u?s?l?l?s?s +?l?s?u?s?l?u?l?l +?l?s?u?s?l?u?l?u +?l?s?u?s?l?u?l?s +?l?s?u?s?l?u?u?l +?l?s?u?s?l?u?u?u +?l?s?u?s?l?u?u?s +?l?s?u?s?l?u?s?l +?l?s?u?s?l?u?s?u +?l?s?u?s?l?u?s?s +?l?s?u?s?l?s?l?l +?l?s?u?s?l?s?l?u +?l?s?u?s?l?s?l?s +?l?s?u?s?l?s?u?l +?l?s?u?s?l?s?u?u +?l?s?u?s?l?s?u?s +?l?s?u?s?l?s?s?l +?l?s?u?s?l?s?s?u +?l?s?u?s?l?s?s?s +?l?s?u?s?u?l?l?l +?l?s?u?s?u?l?l?u +?l?s?u?s?u?l?l?s +?l?s?u?s?u?l?u?l +?l?s?u?s?u?l?u?u +?l?s?u?s?u?l?u?s +?l?s?u?s?u?l?s?l +?l?s?u?s?u?l?s?u +?l?s?u?s?u?l?s?s +?l?s?u?s?u?u?l?l +?l?s?u?s?u?u?l?u +?l?s?u?s?u?u?l?s +?l?s?u?s?u?u?u?l +?l?s?u?s?u?u?u?u +?l?s?u?s?u?u?u?s +?l?s?u?s?u?u?s?l +?l?s?u?s?u?u?s?u +?l?s?u?s?u?u?s?s +?l?s?u?s?u?s?l?l +?l?s?u?s?u?s?l?u +?l?s?u?s?u?s?l?s +?l?s?u?s?u?s?u?l +?l?s?u?s?u?s?u?u +?l?s?u?s?u?s?u?s +?l?s?u?s?u?s?s?l +?l?s?u?s?u?s?s?u +?l?s?u?s?u?s?s?s +?l?s?u?s?s?l?l?l +?l?s?u?s?s?l?l?u +?l?s?u?s?s?l?l?s +?l?s?u?s?s?l?u?l +?l?s?u?s?s?l?u?u +?l?s?u?s?s?l?u?s +?l?s?u?s?s?l?s?l +?l?s?u?s?s?l?s?u +?l?s?u?s?s?l?s?s +?l?s?u?s?s?u?l?l +?l?s?u?s?s?u?l?u +?l?s?u?s?s?u?l?s +?l?s?u?s?s?u?u?l +?l?s?u?s?s?u?u?u +?l?s?u?s?s?u?u?s +?l?s?u?s?s?u?s?l +?l?s?u?s?s?u?s?u +?l?s?u?s?s?u?s?s +?l?s?u?s?s?s?l?l +?l?s?u?s?s?s?l?u +?l?s?u?s?s?s?l?s +?l?s?u?s?s?s?u?l +?l?s?u?s?s?s?u?u +?l?s?u?s?s?s?u?s +?l?s?u?s?s?s?s?l +?l?s?u?s?s?s?s?u +?l?s?u?s?s?s?s?s +?l?s?s?d?d?d?d?d +?l?s?s?d?d?d?d?l +?l?s?s?d?d?d?d?s +?l?s?s?d?d?d?l?d +?l?s?s?d?d?d?l?l +?l?s?s?d?d?d?l?s +?l?s?s?d?d?d?s?d +?l?s?s?d?d?d?s?l +?l?s?s?d?d?d?s?s +?l?s?s?d?d?l?d?d +?l?s?s?d?d?l?d?l +?l?s?s?d?d?l?d?s +?l?s?s?d?d?l?l?d +?l?s?s?d?d?l?l?l +?l?s?s?d?d?l?l?s +?l?s?s?d?d?l?s?d +?l?s?s?d?d?l?s?l +?l?s?s?d?d?l?s?s +?l?s?s?d?d?s?d?d +?l?s?s?d?d?s?d?l +?l?s?s?d?d?s?d?s +?l?s?s?d?d?s?l?d +?l?s?s?d?d?s?l?l +?l?s?s?d?d?s?l?s +?l?s?s?d?d?s?s?d +?l?s?s?d?d?s?s?l +?l?s?s?d?d?s?s?s +?l?s?s?d?l?d?d?d +?l?s?s?d?l?d?d?l +?l?s?s?d?l?d?d?s +?l?s?s?d?l?d?l?d +?l?s?s?d?l?d?l?l +?l?s?s?d?l?d?l?s +?l?s?s?d?l?d?s?d +?l?s?s?d?l?d?s?l +?l?s?s?d?l?d?s?s +?l?s?s?d?l?l?d?d +?l?s?s?d?l?l?d?l +?l?s?s?d?l?l?d?s +?l?s?s?d?l?l?l?d +?l?s?s?d?l?l?l?l +?l?s?s?d?l?l?l?s +?l?s?s?d?l?l?s?d +?l?s?s?d?l?l?s?l +?l?s?s?d?l?l?s?s +?l?s?s?d?l?s?d?d +?l?s?s?d?l?s?d?l +?l?s?s?d?l?s?d?s +?l?s?s?d?l?s?l?d +?l?s?s?d?l?s?l?l +?l?s?s?d?l?s?l?s +?l?s?s?d?l?s?s?d +?l?s?s?d?l?s?s?l +?l?s?s?d?l?s?s?s +?l?s?s?d?s?d?d?d +?l?s?s?d?s?d?d?l +?l?s?s?d?s?d?d?s +?l?s?s?d?s?d?l?d +?l?s?s?d?s?d?l?l +?l?s?s?d?s?d?l?s +?l?s?s?d?s?d?s?d +?l?s?s?d?s?d?s?l +?l?s?s?d?s?d?s?s +?l?s?s?d?s?l?d?d +?l?s?s?d?s?l?d?l +?l?s?s?d?s?l?d?s +?l?s?s?d?s?l?l?d +?l?s?s?d?s?l?l?l +?l?s?s?d?s?l?l?s +?l?s?s?d?s?l?s?d +?l?s?s?d?s?l?s?l +?l?s?s?d?s?l?s?s +?l?s?s?d?s?s?d?d +?l?s?s?d?s?s?d?l +?l?s?s?d?s?s?d?s +?l?s?s?d?s?s?l?d +?l?s?s?d?s?s?l?l +?l?s?s?d?s?s?l?s +?l?s?s?d?s?s?s?d +?l?s?s?d?s?s?s?l +?l?s?s?d?s?s?s?s +?l?s?s?l?d?d?d?d +?l?s?s?l?d?d?d?l +?l?s?s?l?d?d?d?s +?l?s?s?l?d?d?l?d +?l?s?s?l?d?d?l?l +?l?s?s?l?d?d?l?s +?l?s?s?l?d?d?s?d +?l?s?s?l?d?d?s?l +?l?s?s?l?d?d?s?s +?l?s?s?l?d?l?d?d +?l?s?s?l?d?l?d?l +?l?s?s?l?d?l?d?s +?l?s?s?l?d?l?l?d +?l?s?s?l?d?l?l?l +?l?s?s?l?d?l?l?s +?l?s?s?l?d?l?s?d +?l?s?s?l?d?l?s?l +?l?s?s?l?d?l?s?s +?l?s?s?l?d?s?d?d +?l?s?s?l?d?s?d?l +?l?s?s?l?d?s?d?s +?l?s?s?l?d?s?l?d +?l?s?s?l?d?s?l?l +?l?s?s?l?d?s?l?s +?l?s?s?l?d?s?s?d +?l?s?s?l?d?s?s?l +?l?s?s?l?d?s?s?s +?l?s?s?l?l?d?d?d +?l?s?s?l?l?d?d?l +?l?s?s?l?l?d?d?s +?l?s?s?l?l?d?l?d +?l?s?s?l?l?d?l?l +?l?s?s?l?l?d?l?s +?l?s?s?l?l?d?s?d +?l?s?s?l?l?d?s?l +?l?s?s?l?l?d?s?s +?l?s?s?l?l?l?d?d +?l?s?s?l?l?l?d?l +?l?s?s?l?l?l?d?s +?l?s?s?l?l?l?l?d +?l?s?s?l?l?l?l?l +?l?s?s?l?l?l?l?u +?l?s?s?l?l?l?l?s +?l?s?s?l?l?l?u?l +?l?s?s?l?l?l?u?u +?l?s?s?l?l?l?u?s +?l?s?s?l?l?l?s?d +?l?s?s?l?l?l?s?l +?l?s?s?l?l?l?s?u +?l?s?s?l?l?l?s?s +?l?s?s?l?l?u?l?l +?l?s?s?l?l?u?l?u +?l?s?s?l?l?u?l?s +?l?s?s?l?l?u?u?l +?l?s?s?l?l?u?u?u +?l?s?s?l?l?u?u?s +?l?s?s?l?l?u?s?l +?l?s?s?l?l?u?s?u +?l?s?s?l?l?u?s?s +?l?s?s?l?l?s?d?d +?l?s?s?l?l?s?d?l +?l?s?s?l?l?s?d?s +?l?s?s?l?l?s?l?d +?l?s?s?l?l?s?l?l +?l?s?s?l?l?s?l?u +?l?s?s?l?l?s?l?s +?l?s?s?l?l?s?u?l +?l?s?s?l?l?s?u?u +?l?s?s?l?l?s?u?s +?l?s?s?l?l?s?s?d +?l?s?s?l?l?s?s?l +?l?s?s?l?l?s?s?u +?l?s?s?l?l?s?s?s +?l?s?s?l?u?l?l?l +?l?s?s?l?u?l?l?u +?l?s?s?l?u?l?l?s +?l?s?s?l?u?l?u?l +?l?s?s?l?u?l?u?u +?l?s?s?l?u?l?u?s +?l?s?s?l?u?l?s?l +?l?s?s?l?u?l?s?u +?l?s?s?l?u?l?s?s +?l?s?s?l?u?u?l?l +?l?s?s?l?u?u?l?u +?l?s?s?l?u?u?l?s +?l?s?s?l?u?u?u?l +?l?s?s?l?u?u?u?u +?l?s?s?l?u?u?u?s +?l?s?s?l?u?u?s?l +?l?s?s?l?u?u?s?u +?l?s?s?l?u?u?s?s +?l?s?s?l?u?s?l?l +?l?s?s?l?u?s?l?u +?l?s?s?l?u?s?l?s +?l?s?s?l?u?s?u?l +?l?s?s?l?u?s?u?u +?l?s?s?l?u?s?u?s +?l?s?s?l?u?s?s?l +?l?s?s?l?u?s?s?u +?l?s?s?l?u?s?s?s +?l?s?s?l?s?d?d?d +?l?s?s?l?s?d?d?l +?l?s?s?l?s?d?d?s +?l?s?s?l?s?d?l?d +?l?s?s?l?s?d?l?l +?l?s?s?l?s?d?l?s +?l?s?s?l?s?d?s?d +?l?s?s?l?s?d?s?l +?l?s?s?l?s?d?s?s +?l?s?s?l?s?l?d?d +?l?s?s?l?s?l?d?l +?l?s?s?l?s?l?d?s +?l?s?s?l?s?l?l?d +?l?s?s?l?s?l?l?l +?l?s?s?l?s?l?l?u +?l?s?s?l?s?l?l?s +?l?s?s?l?s?l?u?l +?l?s?s?l?s?l?u?u +?l?s?s?l?s?l?u?s +?l?s?s?l?s?l?s?d +?l?s?s?l?s?l?s?l +?l?s?s?l?s?l?s?u +?l?s?s?l?s?l?s?s +?l?s?s?l?s?u?l?l +?l?s?s?l?s?u?l?u +?l?s?s?l?s?u?l?s +?l?s?s?l?s?u?u?l +?l?s?s?l?s?u?u?u +?l?s?s?l?s?u?u?s +?l?s?s?l?s?u?s?l +?l?s?s?l?s?u?s?u +?l?s?s?l?s?u?s?s +?l?s?s?l?s?s?d?d +?l?s?s?l?s?s?d?l +?l?s?s?l?s?s?d?s +?l?s?s?l?s?s?l?d +?l?s?s?l?s?s?l?l +?l?s?s?l?s?s?l?u +?l?s?s?l?s?s?l?s +?l?s?s?l?s?s?u?l +?l?s?s?l?s?s?u?u +?l?s?s?l?s?s?u?s +?l?s?s?l?s?s?s?d +?l?s?s?l?s?s?s?l +?l?s?s?l?s?s?s?u +?l?s?s?l?s?s?s?s +?l?s?s?u?l?l?l?l +?l?s?s?u?l?l?l?u +?l?s?s?u?l?l?l?s +?l?s?s?u?l?l?u?l +?l?s?s?u?l?l?u?u +?l?s?s?u?l?l?u?s +?l?s?s?u?l?l?s?l +?l?s?s?u?l?l?s?u +?l?s?s?u?l?l?s?s +?l?s?s?u?l?u?l?l +?l?s?s?u?l?u?l?u +?l?s?s?u?l?u?l?s +?l?s?s?u?l?u?u?l +?l?s?s?u?l?u?u?u +?l?s?s?u?l?u?u?s +?l?s?s?u?l?u?s?l +?l?s?s?u?l?u?s?u +?l?s?s?u?l?u?s?s +?l?s?s?u?l?s?l?l +?l?s?s?u?l?s?l?u +?l?s?s?u?l?s?l?s +?l?s?s?u?l?s?u?l +?l?s?s?u?l?s?u?u +?l?s?s?u?l?s?u?s +?l?s?s?u?l?s?s?l +?l?s?s?u?l?s?s?u +?l?s?s?u?l?s?s?s +?l?s?s?u?u?l?l?l +?l?s?s?u?u?l?l?u +?l?s?s?u?u?l?l?s +?l?s?s?u?u?l?u?l +?l?s?s?u?u?l?u?u +?l?s?s?u?u?l?u?s +?l?s?s?u?u?l?s?l +?l?s?s?u?u?l?s?u +?l?s?s?u?u?l?s?s +?l?s?s?u?u?u?l?l +?l?s?s?u?u?u?l?u +?l?s?s?u?u?u?l?s +?l?s?s?u?u?u?u?l +?l?s?s?u?u?u?u?u +?l?s?s?u?u?u?u?s +?l?s?s?u?u?u?s?l +?l?s?s?u?u?u?s?u +?l?s?s?u?u?u?s?s +?l?s?s?u?u?s?l?l +?l?s?s?u?u?s?l?u +?l?s?s?u?u?s?l?s +?l?s?s?u?u?s?u?l +?l?s?s?u?u?s?u?u +?l?s?s?u?u?s?u?s +?l?s?s?u?u?s?s?l +?l?s?s?u?u?s?s?u +?l?s?s?u?u?s?s?s +?l?s?s?u?s?l?l?l +?l?s?s?u?s?l?l?u +?l?s?s?u?s?l?l?s +?l?s?s?u?s?l?u?l +?l?s?s?u?s?l?u?u +?l?s?s?u?s?l?u?s +?l?s?s?u?s?l?s?l +?l?s?s?u?s?l?s?u +?l?s?s?u?s?l?s?s +?l?s?s?u?s?u?l?l +?l?s?s?u?s?u?l?u +?l?s?s?u?s?u?l?s +?l?s?s?u?s?u?u?l +?l?s?s?u?s?u?u?u +?l?s?s?u?s?u?u?s +?l?s?s?u?s?u?s?l +?l?s?s?u?s?u?s?u +?l?s?s?u?s?u?s?s +?l?s?s?u?s?s?l?l +?l?s?s?u?s?s?l?u +?l?s?s?u?s?s?l?s +?l?s?s?u?s?s?u?l +?l?s?s?u?s?s?u?u +?l?s?s?u?s?s?u?s +?l?s?s?u?s?s?s?l +?l?s?s?u?s?s?s?u +?l?s?s?u?s?s?s?s +?l?s?s?s?d?d?d?d +?l?s?s?s?d?d?d?l +?l?s?s?s?d?d?d?s +?l?s?s?s?d?d?l?d +?l?s?s?s?d?d?l?l +?l?s?s?s?d?d?l?s +?l?s?s?s?d?d?s?d +?l?s?s?s?d?d?s?l +?l?s?s?s?d?d?s?s +?l?s?s?s?d?l?d?d +?l?s?s?s?d?l?d?l +?l?s?s?s?d?l?d?s +?l?s?s?s?d?l?l?d +?l?s?s?s?d?l?l?l +?l?s?s?s?d?l?l?s +?l?s?s?s?d?l?s?d +?l?s?s?s?d?l?s?l +?l?s?s?s?d?l?s?s +?l?s?s?s?d?s?d?d +?l?s?s?s?d?s?d?l +?l?s?s?s?d?s?d?s +?l?s?s?s?d?s?l?d +?l?s?s?s?d?s?l?l +?l?s?s?s?d?s?l?s +?l?s?s?s?d?s?s?d +?l?s?s?s?d?s?s?l +?l?s?s?s?d?s?s?s +?l?s?s?s?l?d?d?d +?l?s?s?s?l?d?d?l +?l?s?s?s?l?d?d?s +?l?s?s?s?l?d?l?d +?l?s?s?s?l?d?l?l +?l?s?s?s?l?d?l?s +?l?s?s?s?l?d?s?d +?l?s?s?s?l?d?s?l +?l?s?s?s?l?d?s?s +?l?s?s?s?l?l?d?d +?l?s?s?s?l?l?d?l +?l?s?s?s?l?l?d?s +?l?s?s?s?l?l?l?d +?l?s?s?s?l?l?l?l +?l?s?s?s?l?l?l?u +?l?s?s?s?l?l?l?s +?l?s?s?s?l?l?u?l +?l?s?s?s?l?l?u?u +?l?s?s?s?l?l?u?s +?l?s?s?s?l?l?s?d +?l?s?s?s?l?l?s?l +?l?s?s?s?l?l?s?u +?l?s?s?s?l?l?s?s +?l?s?s?s?l?u?l?l +?l?s?s?s?l?u?l?u +?l?s?s?s?l?u?l?s +?l?s?s?s?l?u?u?l +?l?s?s?s?l?u?u?u +?l?s?s?s?l?u?u?s +?l?s?s?s?l?u?s?l +?l?s?s?s?l?u?s?u +?l?s?s?s?l?u?s?s +?l?s?s?s?l?s?d?d +?l?s?s?s?l?s?d?l +?l?s?s?s?l?s?d?s +?l?s?s?s?l?s?l?d +?l?s?s?s?l?s?l?l +?l?s?s?s?l?s?l?u +?l?s?s?s?l?s?l?s +?l?s?s?s?l?s?u?l +?l?s?s?s?l?s?u?u +?l?s?s?s?l?s?u?s +?l?s?s?s?l?s?s?d +?l?s?s?s?l?s?s?l +?l?s?s?s?l?s?s?u +?l?s?s?s?l?s?s?s +?l?s?s?s?u?l?l?l +?l?s?s?s?u?l?l?u +?l?s?s?s?u?l?l?s +?l?s?s?s?u?l?u?l +?l?s?s?s?u?l?u?u +?l?s?s?s?u?l?u?s +?l?s?s?s?u?l?s?l +?l?s?s?s?u?l?s?u +?l?s?s?s?u?l?s?s +?l?s?s?s?u?u?l?l +?l?s?s?s?u?u?l?u +?l?s?s?s?u?u?l?s +?l?s?s?s?u?u?u?l +?l?s?s?s?u?u?u?u +?l?s?s?s?u?u?u?s +?l?s?s?s?u?u?s?l +?l?s?s?s?u?u?s?u +?l?s?s?s?u?u?s?s +?l?s?s?s?u?s?l?l +?l?s?s?s?u?s?l?u +?l?s?s?s?u?s?l?s +?l?s?s?s?u?s?u?l +?l?s?s?s?u?s?u?u +?l?s?s?s?u?s?u?s +?l?s?s?s?u?s?s?l +?l?s?s?s?u?s?s?u +?l?s?s?s?u?s?s?s +?l?s?s?s?s?d?d?d +?l?s?s?s?s?d?d?l +?l?s?s?s?s?d?d?s +?l?s?s?s?s?d?l?d +?l?s?s?s?s?d?l?l +?l?s?s?s?s?d?l?s +?l?s?s?s?s?d?s?d +?l?s?s?s?s?d?s?l +?l?s?s?s?s?d?s?s +?l?s?s?s?s?l?d?d +?l?s?s?s?s?l?d?l +?l?s?s?s?s?l?d?s +?l?s?s?s?s?l?l?d +?l?s?s?s?s?l?l?l +?l?s?s?s?s?l?l?u +?l?s?s?s?s?l?l?s +?l?s?s?s?s?l?u?l +?l?s?s?s?s?l?u?u +?l?s?s?s?s?l?u?s +?l?s?s?s?s?l?s?d +?l?s?s?s?s?l?s?l +?l?s?s?s?s?l?s?u +?l?s?s?s?s?l?s?s +?l?s?s?s?s?u?l?l +?l?s?s?s?s?u?l?u +?l?s?s?s?s?u?l?s +?l?s?s?s?s?u?u?l +?l?s?s?s?s?u?u?u +?l?s?s?s?s?u?u?s +?l?s?s?s?s?u?s?l +?l?s?s?s?s?u?s?u +?l?s?s?s?s?u?s?s +?l?s?s?s?s?s?d?d +?l?s?s?s?s?s?d?l +?l?s?s?s?s?s?d?s +?l?s?s?s?s?s?l?d +?l?s?s?s?s?s?l?l +?l?s?s?s?s?s?l?u +?l?s?s?s?s?s?l?s +?l?s?s?s?s?s?u?l +?l?s?s?s?s?s?u?u +?l?s?s?s?s?s?u?s +?l?s?s?s?s?s?s?d +?l?s?s?s?s?s?s?l +?l?s?s?s?s?s?s?u +?l?s?s?s?s?s?s?s +?u?d?d?d?d?d?d?d +?u?d?d?d?d?d?d?l +?u?d?d?d?d?d?d?u +?u?d?d?d?d?d?d?s +?u?d?d?d?d?d?l?d +?u?d?d?d?d?d?l?l +?u?d?d?d?d?d?l?u +?u?d?d?d?d?d?u?d +?u?d?d?d?d?d?u?l +?u?d?d?d?d?d?u?u +?u?d?d?d?d?d?u?s +?u?d?d?d?d?d?s?d +?u?d?d?d?d?d?s?u +?u?d?d?d?d?d?s?s +?u?d?d?d?d?l?d?d +?u?d?d?d?d?l?d?l +?u?d?d?d?d?l?d?u +?u?d?d?d?d?l?l?d +?u?d?d?d?d?l?l?l +?u?d?d?d?d?l?l?u +?u?d?d?d?d?l?u?d +?u?d?d?d?d?l?u?l +?u?d?d?d?d?l?u?u +?u?d?d?d?d?u?d?d +?u?d?d?d?d?u?d?l +?u?d?d?d?d?u?d?u +?u?d?d?d?d?u?d?s +?u?d?d?d?d?u?l?d +?u?d?d?d?d?u?l?l +?u?d?d?d?d?u?l?u +?u?d?d?d?d?u?u?d +?u?d?d?d?d?u?u?l +?u?d?d?d?d?u?u?u +?u?d?d?d?d?u?u?s +?u?d?d?d?d?u?s?d +?u?d?d?d?d?u?s?u +?u?d?d?d?d?u?s?s +?u?d?d?d?d?s?d?d +?u?d?d?d?d?s?d?u +?u?d?d?d?d?s?d?s +?u?d?d?d?d?s?u?d +?u?d?d?d?d?s?u?u +?u?d?d?d?d?s?u?s +?u?d?d?d?d?s?s?d +?u?d?d?d?d?s?s?u +?u?d?d?d?d?s?s?s +?u?d?d?d?l?d?d?d +?u?d?d?d?l?d?d?l +?u?d?d?d?l?d?d?u +?u?d?d?d?l?d?l?d +?u?d?d?d?l?d?l?l +?u?d?d?d?l?d?l?u +?u?d?d?d?l?d?u?d +?u?d?d?d?l?d?u?l +?u?d?d?d?l?d?u?u +?u?d?d?d?l?l?d?d +?u?d?d?d?l?l?d?l +?u?d?d?d?l?l?d?u +?u?d?d?d?l?l?l?d +?u?d?d?d?l?l?l?l +?u?d?d?d?l?l?l?u +?u?d?d?d?l?l?u?d +?u?d?d?d?l?l?u?l +?u?d?d?d?l?l?u?u +?u?d?d?d?l?u?d?d +?u?d?d?d?l?u?d?l +?u?d?d?d?l?u?d?u +?u?d?d?d?l?u?l?d +?u?d?d?d?l?u?l?l +?u?d?d?d?l?u?l?u +?u?d?d?d?l?u?u?d +?u?d?d?d?l?u?u?l +?u?d?d?d?l?u?u?u +?u?d?d?d?u?d?d?d +?u?d?d?d?u?d?d?l +?u?d?d?d?u?d?d?u +?u?d?d?d?u?d?d?s +?u?d?d?d?u?d?l?d +?u?d?d?d?u?d?l?l +?u?d?d?d?u?d?l?u +?u?d?d?d?u?d?u?d +?u?d?d?d?u?d?u?l +?u?d?d?d?u?d?u?u +?u?d?d?d?u?d?u?s +?u?d?d?d?u?d?s?d +?u?d?d?d?u?d?s?u +?u?d?d?d?u?d?s?s +?u?d?d?d?u?l?d?d +?u?d?d?d?u?l?d?l +?u?d?d?d?u?l?d?u +?u?d?d?d?u?l?l?d +?u?d?d?d?u?l?l?l +?u?d?d?d?u?l?l?u +?u?d?d?d?u?l?u?d +?u?d?d?d?u?l?u?l +?u?d?d?d?u?l?u?u +?u?d?d?d?u?u?d?d +?u?d?d?d?u?u?d?l +?u?d?d?d?u?u?d?u +?u?d?d?d?u?u?d?s +?u?d?d?d?u?u?l?d +?u?d?d?d?u?u?l?l +?u?d?d?d?u?u?l?u +?u?d?d?d?u?u?u?d +?u?d?d?d?u?u?u?l +?u?d?d?d?u?u?u?u +?u?d?d?d?u?u?u?s +?u?d?d?d?u?u?s?d +?u?d?d?d?u?u?s?u +?u?d?d?d?u?u?s?s +?u?d?d?d?u?s?d?d +?u?d?d?d?u?s?d?u +?u?d?d?d?u?s?d?s +?u?d?d?d?u?s?u?d +?u?d?d?d?u?s?u?u +?u?d?d?d?u?s?u?s +?u?d?d?d?u?s?s?d +?u?d?d?d?u?s?s?u +?u?d?d?d?u?s?s?s +?u?d?d?d?s?d?d?d +?u?d?d?d?s?d?d?u +?u?d?d?d?s?d?d?s +?u?d?d?d?s?d?u?d +?u?d?d?d?s?d?u?u +?u?d?d?d?s?d?u?s +?u?d?d?d?s?d?s?d +?u?d?d?d?s?d?s?u +?u?d?d?d?s?d?s?s +?u?d?d?d?s?u?d?d +?u?d?d?d?s?u?d?u +?u?d?d?d?s?u?d?s +?u?d?d?d?s?u?u?d +?u?d?d?d?s?u?u?u +?u?d?d?d?s?u?u?s +?u?d?d?d?s?u?s?d +?u?d?d?d?s?u?s?u +?u?d?d?d?s?u?s?s +?u?d?d?d?s?s?d?d +?u?d?d?d?s?s?d?u +?u?d?d?d?s?s?d?s +?u?d?d?d?s?s?u?d +?u?d?d?d?s?s?u?u +?u?d?d?d?s?s?u?s +?u?d?d?d?s?s?s?d +?u?d?d?d?s?s?s?u +?u?d?d?d?s?s?s?s +?u?d?d?l?d?d?d?d +?u?d?d?l?d?d?d?l +?u?d?d?l?d?d?d?u +?u?d?d?l?d?d?l?d +?u?d?d?l?d?d?l?l +?u?d?d?l?d?d?l?u +?u?d?d?l?d?d?u?d +?u?d?d?l?d?d?u?l +?u?d?d?l?d?d?u?u +?u?d?d?l?d?l?d?d +?u?d?d?l?d?l?d?l +?u?d?d?l?d?l?d?u +?u?d?d?l?d?l?l?d +?u?d?d?l?d?l?l?l +?u?d?d?l?d?l?l?u +?u?d?d?l?d?l?u?d +?u?d?d?l?d?l?u?l +?u?d?d?l?d?l?u?u +?u?d?d?l?d?u?d?d +?u?d?d?l?d?u?d?l +?u?d?d?l?d?u?d?u +?u?d?d?l?d?u?l?d +?u?d?d?l?d?u?l?l +?u?d?d?l?d?u?l?u +?u?d?d?l?d?u?u?d +?u?d?d?l?d?u?u?l +?u?d?d?l?d?u?u?u +?u?d?d?l?l?d?d?d +?u?d?d?l?l?d?d?l +?u?d?d?l?l?d?d?u +?u?d?d?l?l?d?l?d +?u?d?d?l?l?d?l?l +?u?d?d?l?l?d?l?u +?u?d?d?l?l?d?u?d +?u?d?d?l?l?d?u?l +?u?d?d?l?l?d?u?u +?u?d?d?l?l?l?d?d +?u?d?d?l?l?l?d?l +?u?d?d?l?l?l?d?u +?u?d?d?l?l?l?l?d +?u?d?d?l?l?l?l?l +?u?d?d?l?l?l?l?u +?u?d?d?l?l?l?u?d +?u?d?d?l?l?l?u?l +?u?d?d?l?l?l?u?u +?u?d?d?l?l?u?d?d +?u?d?d?l?l?u?d?l +?u?d?d?l?l?u?d?u +?u?d?d?l?l?u?l?d +?u?d?d?l?l?u?l?l +?u?d?d?l?l?u?l?u +?u?d?d?l?l?u?u?d +?u?d?d?l?l?u?u?l +?u?d?d?l?l?u?u?u +?u?d?d?l?u?d?d?d +?u?d?d?l?u?d?d?l +?u?d?d?l?u?d?d?u +?u?d?d?l?u?d?l?d +?u?d?d?l?u?d?l?l +?u?d?d?l?u?d?l?u +?u?d?d?l?u?d?u?d +?u?d?d?l?u?d?u?l +?u?d?d?l?u?d?u?u +?u?d?d?l?u?l?d?d +?u?d?d?l?u?l?d?l +?u?d?d?l?u?l?d?u +?u?d?d?l?u?l?l?d +?u?d?d?l?u?l?l?l +?u?d?d?l?u?l?l?u +?u?d?d?l?u?l?u?d +?u?d?d?l?u?l?u?l +?u?d?d?l?u?l?u?u +?u?d?d?l?u?u?d?d +?u?d?d?l?u?u?d?l +?u?d?d?l?u?u?d?u +?u?d?d?l?u?u?l?d +?u?d?d?l?u?u?l?l +?u?d?d?l?u?u?l?u +?u?d?d?l?u?u?u?d +?u?d?d?l?u?u?u?l +?u?d?d?l?u?u?u?u +?u?d?d?u?d?d?d?d +?u?d?d?u?d?d?d?l +?u?d?d?u?d?d?d?u +?u?d?d?u?d?d?d?s +?u?d?d?u?d?d?l?d +?u?d?d?u?d?d?l?l +?u?d?d?u?d?d?l?u +?u?d?d?u?d?d?u?d +?u?d?d?u?d?d?u?l +?u?d?d?u?d?d?u?u +?u?d?d?u?d?d?u?s +?u?d?d?u?d?d?s?d +?u?d?d?u?d?d?s?u +?u?d?d?u?d?d?s?s +?u?d?d?u?d?l?d?d +?u?d?d?u?d?l?d?l +?u?d?d?u?d?l?d?u +?u?d?d?u?d?l?l?d +?u?d?d?u?d?l?l?l +?u?d?d?u?d?l?l?u +?u?d?d?u?d?l?u?d +?u?d?d?u?d?l?u?l +?u?d?d?u?d?l?u?u +?u?d?d?u?d?u?d?d +?u?d?d?u?d?u?d?l +?u?d?d?u?d?u?d?u +?u?d?d?u?d?u?d?s +?u?d?d?u?d?u?l?d +?u?d?d?u?d?u?l?l +?u?d?d?u?d?u?l?u +?u?d?d?u?d?u?u?d +?u?d?d?u?d?u?u?l +?u?d?d?u?d?u?u?u +?u?d?d?u?d?u?u?s +?u?d?d?u?d?u?s?d +?u?d?d?u?d?u?s?u +?u?d?d?u?d?u?s?s +?u?d?d?u?d?s?d?d +?u?d?d?u?d?s?d?u +?u?d?d?u?d?s?d?s +?u?d?d?u?d?s?u?d +?u?d?d?u?d?s?u?u +?u?d?d?u?d?s?u?s +?u?d?d?u?d?s?s?d +?u?d?d?u?d?s?s?u +?u?d?d?u?d?s?s?s +?u?d?d?u?l?d?d?d +?u?d?d?u?l?d?d?l +?u?d?d?u?l?d?d?u +?u?d?d?u?l?d?l?d +?u?d?d?u?l?d?l?l +?u?d?d?u?l?d?l?u +?u?d?d?u?l?d?u?d +?u?d?d?u?l?d?u?l +?u?d?d?u?l?d?u?u +?u?d?d?u?l?l?d?d +?u?d?d?u?l?l?d?l +?u?d?d?u?l?l?d?u +?u?d?d?u?l?l?l?d +?u?d?d?u?l?l?l?l +?u?d?d?u?l?l?l?u +?u?d?d?u?l?l?u?d +?u?d?d?u?l?l?u?l +?u?d?d?u?l?l?u?u +?u?d?d?u?l?u?d?d +?u?d?d?u?l?u?d?l +?u?d?d?u?l?u?d?u +?u?d?d?u?l?u?l?d +?u?d?d?u?l?u?l?l +?u?d?d?u?l?u?l?u +?u?d?d?u?l?u?u?d +?u?d?d?u?l?u?u?l +?u?d?d?u?l?u?u?u +?u?d?d?u?u?d?d?d +?u?d?d?u?u?d?d?l +?u?d?d?u?u?d?d?u +?u?d?d?u?u?d?d?s +?u?d?d?u?u?d?l?d +?u?d?d?u?u?d?l?l +?u?d?d?u?u?d?l?u +?u?d?d?u?u?d?u?d +?u?d?d?u?u?d?u?l +?u?d?d?u?u?d?u?u +?u?d?d?u?u?d?u?s +?u?d?d?u?u?d?s?d +?u?d?d?u?u?d?s?u +?u?d?d?u?u?d?s?s +?u?d?d?u?u?l?d?d +?u?d?d?u?u?l?d?l +?u?d?d?u?u?l?d?u +?u?d?d?u?u?l?l?d +?u?d?d?u?u?l?l?l +?u?d?d?u?u?l?l?u +?u?d?d?u?u?l?u?d +?u?d?d?u?u?l?u?l +?u?d?d?u?u?l?u?u +?u?d?d?u?u?u?d?d +?u?d?d?u?u?u?d?l +?u?d?d?u?u?u?d?u +?u?d?d?u?u?u?d?s +?u?d?d?u?u?u?l?d +?u?d?d?u?u?u?l?l +?u?d?d?u?u?u?l?u +?u?d?d?u?u?u?u?d +?u?d?d?u?u?u?u?l +?u?d?d?u?u?u?u?u +?u?d?d?u?u?u?u?s +?u?d?d?u?u?u?s?d +?u?d?d?u?u?u?s?u +?u?d?d?u?u?u?s?s +?u?d?d?u?u?s?d?d +?u?d?d?u?u?s?d?u +?u?d?d?u?u?s?d?s +?u?d?d?u?u?s?u?d +?u?d?d?u?u?s?u?u +?u?d?d?u?u?s?u?s +?u?d?d?u?u?s?s?d +?u?d?d?u?u?s?s?u +?u?d?d?u?u?s?s?s +?u?d?d?u?s?d?d?d +?u?d?d?u?s?d?d?u +?u?d?d?u?s?d?d?s +?u?d?d?u?s?d?u?d +?u?d?d?u?s?d?u?u +?u?d?d?u?s?d?u?s +?u?d?d?u?s?d?s?d +?u?d?d?u?s?d?s?u +?u?d?d?u?s?d?s?s +?u?d?d?u?s?u?d?d +?u?d?d?u?s?u?d?u +?u?d?d?u?s?u?d?s +?u?d?d?u?s?u?u?d +?u?d?d?u?s?u?u?u +?u?d?d?u?s?u?u?s +?u?d?d?u?s?u?s?d +?u?d?d?u?s?u?s?u +?u?d?d?u?s?u?s?s +?u?d?d?u?s?s?d?d +?u?d?d?u?s?s?d?u +?u?d?d?u?s?s?d?s +?u?d?d?u?s?s?u?d +?u?d?d?u?s?s?u?u +?u?d?d?u?s?s?u?s +?u?d?d?u?s?s?s?d +?u?d?d?u?s?s?s?u +?u?d?d?u?s?s?s?s +?u?d?d?s?d?d?d?d +?u?d?d?s?d?d?d?u +?u?d?d?s?d?d?d?s +?u?d?d?s?d?d?u?d +?u?d?d?s?d?d?u?u +?u?d?d?s?d?d?u?s +?u?d?d?s?d?d?s?d +?u?d?d?s?d?d?s?u +?u?d?d?s?d?d?s?s +?u?d?d?s?d?u?d?d +?u?d?d?s?d?u?d?u +?u?d?d?s?d?u?d?s +?u?d?d?s?d?u?u?d +?u?d?d?s?d?u?u?u +?u?d?d?s?d?u?u?s +?u?d?d?s?d?u?s?d +?u?d?d?s?d?u?s?u +?u?d?d?s?d?u?s?s +?u?d?d?s?d?s?d?d +?u?d?d?s?d?s?d?u +?u?d?d?s?d?s?d?s +?u?d?d?s?d?s?u?d +?u?d?d?s?d?s?u?u +?u?d?d?s?d?s?u?s +?u?d?d?s?d?s?s?d +?u?d?d?s?d?s?s?u +?u?d?d?s?d?s?s?s +?u?d?d?s?u?d?d?d +?u?d?d?s?u?d?d?u +?u?d?d?s?u?d?d?s +?u?d?d?s?u?d?u?d +?u?d?d?s?u?d?u?u +?u?d?d?s?u?d?u?s +?u?d?d?s?u?d?s?d +?u?d?d?s?u?d?s?u +?u?d?d?s?u?d?s?s +?u?d?d?s?u?u?d?d +?u?d?d?s?u?u?d?u +?u?d?d?s?u?u?d?s +?u?d?d?s?u?u?u?d +?u?d?d?s?u?u?u?u +?u?d?d?s?u?u?u?s +?u?d?d?s?u?u?s?d +?u?d?d?s?u?u?s?u +?u?d?d?s?u?u?s?s +?u?d?d?s?u?s?d?d +?u?d?d?s?u?s?d?u +?u?d?d?s?u?s?d?s +?u?d?d?s?u?s?u?d +?u?d?d?s?u?s?u?u +?u?d?d?s?u?s?u?s +?u?d?d?s?u?s?s?d +?u?d?d?s?u?s?s?u +?u?d?d?s?u?s?s?s +?u?d?d?s?s?d?d?d +?u?d?d?s?s?d?d?u +?u?d?d?s?s?d?d?s +?u?d?d?s?s?d?u?d +?u?d?d?s?s?d?u?u +?u?d?d?s?s?d?u?s +?u?d?d?s?s?d?s?d +?u?d?d?s?s?d?s?u +?u?d?d?s?s?d?s?s +?u?d?d?s?s?u?d?d +?u?d?d?s?s?u?d?u +?u?d?d?s?s?u?d?s +?u?d?d?s?s?u?u?d +?u?d?d?s?s?u?u?u +?u?d?d?s?s?u?u?s +?u?d?d?s?s?u?s?d +?u?d?d?s?s?u?s?u +?u?d?d?s?s?u?s?s +?u?d?d?s?s?s?d?d +?u?d?d?s?s?s?d?u +?u?d?d?s?s?s?d?s +?u?d?d?s?s?s?u?d +?u?d?d?s?s?s?u?u +?u?d?d?s?s?s?u?s +?u?d?d?s?s?s?s?d +?u?d?d?s?s?s?s?u +?u?d?d?s?s?s?s?s +?u?d?l?d?d?d?d?d +?u?d?l?d?d?d?d?l +?u?d?l?d?d?d?d?u +?u?d?l?d?d?d?l?d +?u?d?l?d?d?d?l?l +?u?d?l?d?d?d?l?u +?u?d?l?d?d?d?u?d +?u?d?l?d?d?d?u?l +?u?d?l?d?d?d?u?u +?u?d?l?d?d?l?d?d +?u?d?l?d?d?l?d?l +?u?d?l?d?d?l?d?u +?u?d?l?d?d?l?l?d +?u?d?l?d?d?l?l?l +?u?d?l?d?d?l?l?u +?u?d?l?d?d?l?u?d +?u?d?l?d?d?l?u?l +?u?d?l?d?d?l?u?u +?u?d?l?d?d?u?d?d +?u?d?l?d?d?u?d?l +?u?d?l?d?d?u?d?u +?u?d?l?d?d?u?l?d +?u?d?l?d?d?u?l?l +?u?d?l?d?d?u?l?u +?u?d?l?d?d?u?u?d +?u?d?l?d?d?u?u?l +?u?d?l?d?d?u?u?u +?u?d?l?d?l?d?d?d +?u?d?l?d?l?d?d?l +?u?d?l?d?l?d?d?u +?u?d?l?d?l?d?l?d +?u?d?l?d?l?d?l?l +?u?d?l?d?l?d?l?u +?u?d?l?d?l?d?u?d +?u?d?l?d?l?d?u?l +?u?d?l?d?l?d?u?u +?u?d?l?d?l?l?d?d +?u?d?l?d?l?l?d?l +?u?d?l?d?l?l?d?u +?u?d?l?d?l?l?l?d +?u?d?l?d?l?l?l?l +?u?d?l?d?l?l?l?u +?u?d?l?d?l?l?u?d +?u?d?l?d?l?l?u?l +?u?d?l?d?l?l?u?u +?u?d?l?d?l?u?d?d +?u?d?l?d?l?u?d?l +?u?d?l?d?l?u?d?u +?u?d?l?d?l?u?l?d +?u?d?l?d?l?u?l?l +?u?d?l?d?l?u?l?u +?u?d?l?d?l?u?u?d +?u?d?l?d?l?u?u?l +?u?d?l?d?l?u?u?u +?u?d?l?d?u?d?d?d +?u?d?l?d?u?d?d?l +?u?d?l?d?u?d?d?u +?u?d?l?d?u?d?l?d +?u?d?l?d?u?d?l?l +?u?d?l?d?u?d?l?u +?u?d?l?d?u?d?u?d +?u?d?l?d?u?d?u?l +?u?d?l?d?u?d?u?u +?u?d?l?d?u?l?d?d +?u?d?l?d?u?l?d?l +?u?d?l?d?u?l?d?u +?u?d?l?d?u?l?l?d +?u?d?l?d?u?l?l?l +?u?d?l?d?u?l?l?u +?u?d?l?d?u?l?u?d +?u?d?l?d?u?l?u?l +?u?d?l?d?u?l?u?u +?u?d?l?d?u?u?d?d +?u?d?l?d?u?u?d?l +?u?d?l?d?u?u?d?u +?u?d?l?d?u?u?l?d +?u?d?l?d?u?u?l?l +?u?d?l?d?u?u?l?u +?u?d?l?d?u?u?u?d +?u?d?l?d?u?u?u?l +?u?d?l?d?u?u?u?u +?u?d?l?l?d?d?d?d +?u?d?l?l?d?d?d?l +?u?d?l?l?d?d?d?u +?u?d?l?l?d?d?l?d +?u?d?l?l?d?d?l?l +?u?d?l?l?d?d?l?u +?u?d?l?l?d?d?u?d +?u?d?l?l?d?d?u?l +?u?d?l?l?d?d?u?u +?u?d?l?l?d?l?d?d +?u?d?l?l?d?l?d?l +?u?d?l?l?d?l?d?u +?u?d?l?l?d?l?l?d +?u?d?l?l?d?l?l?l +?u?d?l?l?d?l?l?u +?u?d?l?l?d?l?u?d +?u?d?l?l?d?l?u?l +?u?d?l?l?d?l?u?u +?u?d?l?l?d?u?d?d +?u?d?l?l?d?u?d?l +?u?d?l?l?d?u?d?u +?u?d?l?l?d?u?l?d +?u?d?l?l?d?u?l?l +?u?d?l?l?d?u?l?u +?u?d?l?l?d?u?u?d +?u?d?l?l?d?u?u?l +?u?d?l?l?d?u?u?u +?u?d?l?l?l?d?d?d +?u?d?l?l?l?d?d?l +?u?d?l?l?l?d?d?u +?u?d?l?l?l?d?l?d +?u?d?l?l?l?d?l?l +?u?d?l?l?l?d?l?u +?u?d?l?l?l?d?u?d +?u?d?l?l?l?d?u?l +?u?d?l?l?l?d?u?u +?u?d?l?l?l?l?d?d +?u?d?l?l?l?l?d?l +?u?d?l?l?l?l?d?u +?u?d?l?l?l?l?l?d +?u?d?l?l?l?l?l?l +?u?d?l?l?l?l?l?u +?u?d?l?l?l?l?u?d +?u?d?l?l?l?l?u?l +?u?d?l?l?l?l?u?u +?u?d?l?l?l?u?d?d +?u?d?l?l?l?u?d?l +?u?d?l?l?l?u?d?u +?u?d?l?l?l?u?l?d +?u?d?l?l?l?u?l?l +?u?d?l?l?l?u?l?u +?u?d?l?l?l?u?u?d +?u?d?l?l?l?u?u?l +?u?d?l?l?l?u?u?u +?u?d?l?l?u?d?d?d +?u?d?l?l?u?d?d?l +?u?d?l?l?u?d?d?u +?u?d?l?l?u?d?l?d +?u?d?l?l?u?d?l?l +?u?d?l?l?u?d?l?u +?u?d?l?l?u?d?u?d +?u?d?l?l?u?d?u?l +?u?d?l?l?u?d?u?u +?u?d?l?l?u?l?d?d +?u?d?l?l?u?l?d?l +?u?d?l?l?u?l?d?u +?u?d?l?l?u?l?l?d +?u?d?l?l?u?l?l?l +?u?d?l?l?u?l?l?u +?u?d?l?l?u?l?u?d +?u?d?l?l?u?l?u?l +?u?d?l?l?u?l?u?u +?u?d?l?l?u?u?d?d +?u?d?l?l?u?u?d?l +?u?d?l?l?u?u?d?u +?u?d?l?l?u?u?l?d +?u?d?l?l?u?u?l?l +?u?d?l?l?u?u?l?u +?u?d?l?l?u?u?u?d +?u?d?l?l?u?u?u?l +?u?d?l?l?u?u?u?u +?u?d?l?u?d?d?d?d +?u?d?l?u?d?d?d?l +?u?d?l?u?d?d?d?u +?u?d?l?u?d?d?l?d +?u?d?l?u?d?d?l?l +?u?d?l?u?d?d?l?u +?u?d?l?u?d?d?u?d +?u?d?l?u?d?d?u?l +?u?d?l?u?d?d?u?u +?u?d?l?u?d?l?d?d +?u?d?l?u?d?l?d?l +?u?d?l?u?d?l?d?u +?u?d?l?u?d?l?l?d +?u?d?l?u?d?l?l?l +?u?d?l?u?d?l?l?u +?u?d?l?u?d?l?u?d +?u?d?l?u?d?l?u?l +?u?d?l?u?d?l?u?u +?u?d?l?u?d?u?d?d +?u?d?l?u?d?u?d?l +?u?d?l?u?d?u?d?u +?u?d?l?u?d?u?l?d +?u?d?l?u?d?u?l?l +?u?d?l?u?d?u?l?u +?u?d?l?u?d?u?u?d +?u?d?l?u?d?u?u?l +?u?d?l?u?d?u?u?u +?u?d?l?u?l?d?d?d +?u?d?l?u?l?d?d?l +?u?d?l?u?l?d?d?u +?u?d?l?u?l?d?l?d +?u?d?l?u?l?d?l?l +?u?d?l?u?l?d?l?u +?u?d?l?u?l?d?u?d +?u?d?l?u?l?d?u?l +?u?d?l?u?l?d?u?u +?u?d?l?u?l?l?d?d +?u?d?l?u?l?l?d?l +?u?d?l?u?l?l?d?u +?u?d?l?u?l?l?l?d +?u?d?l?u?l?l?l?l +?u?d?l?u?l?l?l?u +?u?d?l?u?l?l?u?d +?u?d?l?u?l?l?u?l +?u?d?l?u?l?l?u?u +?u?d?l?u?l?u?d?d +?u?d?l?u?l?u?d?l +?u?d?l?u?l?u?d?u +?u?d?l?u?l?u?l?d +?u?d?l?u?l?u?l?l +?u?d?l?u?l?u?l?u +?u?d?l?u?l?u?u?d +?u?d?l?u?l?u?u?l +?u?d?l?u?l?u?u?u +?u?d?l?u?u?d?d?d +?u?d?l?u?u?d?d?l +?u?d?l?u?u?d?d?u +?u?d?l?u?u?d?l?d +?u?d?l?u?u?d?l?l +?u?d?l?u?u?d?l?u +?u?d?l?u?u?d?u?d +?u?d?l?u?u?d?u?l +?u?d?l?u?u?d?u?u +?u?d?l?u?u?l?d?d +?u?d?l?u?u?l?d?l +?u?d?l?u?u?l?d?u +?u?d?l?u?u?l?l?d +?u?d?l?u?u?l?l?l +?u?d?l?u?u?l?l?u +?u?d?l?u?u?l?u?d +?u?d?l?u?u?l?u?l +?u?d?l?u?u?l?u?u +?u?d?l?u?u?u?d?d +?u?d?l?u?u?u?d?l +?u?d?l?u?u?u?d?u +?u?d?l?u?u?u?l?d +?u?d?l?u?u?u?l?l +?u?d?l?u?u?u?l?u +?u?d?l?u?u?u?u?d +?u?d?l?u?u?u?u?l +?u?d?l?u?u?u?u?u +?u?d?u?d?d?d?d?d +?u?d?u?d?d?d?d?l +?u?d?u?d?d?d?d?u +?u?d?u?d?d?d?d?s +?u?d?u?d?d?d?l?d +?u?d?u?d?d?d?l?l +?u?d?u?d?d?d?l?u +?u?d?u?d?d?d?u?d +?u?d?u?d?d?d?u?l +?u?d?u?d?d?d?u?u +?u?d?u?d?d?d?u?s +?u?d?u?d?d?d?s?d +?u?d?u?d?d?d?s?u +?u?d?u?d?d?d?s?s +?u?d?u?d?d?l?d?d +?u?d?u?d?d?l?d?l +?u?d?u?d?d?l?d?u +?u?d?u?d?d?l?l?d +?u?d?u?d?d?l?l?l +?u?d?u?d?d?l?l?u +?u?d?u?d?d?l?u?d +?u?d?u?d?d?l?u?l +?u?d?u?d?d?l?u?u +?u?d?u?d?d?u?d?d +?u?d?u?d?d?u?d?l +?u?d?u?d?d?u?d?u +?u?d?u?d?d?u?d?s +?u?d?u?d?d?u?l?d +?u?d?u?d?d?u?l?l +?u?d?u?d?d?u?l?u +?u?d?u?d?d?u?u?d +?u?d?u?d?d?u?u?l +?u?d?u?d?d?u?u?u +?u?d?u?d?d?u?u?s +?u?d?u?d?d?u?s?d +?u?d?u?d?d?u?s?u +?u?d?u?d?d?u?s?s +?u?d?u?d?d?s?d?d +?u?d?u?d?d?s?d?u +?u?d?u?d?d?s?d?s +?u?d?u?d?d?s?u?d +?u?d?u?d?d?s?u?u +?u?d?u?d?d?s?u?s +?u?d?u?d?d?s?s?d +?u?d?u?d?d?s?s?u +?u?d?u?d?d?s?s?s +?u?d?u?d?l?d?d?d +?u?d?u?d?l?d?d?l +?u?d?u?d?l?d?d?u +?u?d?u?d?l?d?l?d +?u?d?u?d?l?d?l?l +?u?d?u?d?l?d?l?u +?u?d?u?d?l?d?u?d +?u?d?u?d?l?d?u?l +?u?d?u?d?l?d?u?u +?u?d?u?d?l?l?d?d +?u?d?u?d?l?l?d?l +?u?d?u?d?l?l?d?u +?u?d?u?d?l?l?l?d +?u?d?u?d?l?l?l?l +?u?d?u?d?l?l?l?u +?u?d?u?d?l?l?u?d +?u?d?u?d?l?l?u?l +?u?d?u?d?l?l?u?u +?u?d?u?d?l?u?d?d +?u?d?u?d?l?u?d?l +?u?d?u?d?l?u?d?u +?u?d?u?d?l?u?l?d +?u?d?u?d?l?u?l?l +?u?d?u?d?l?u?l?u +?u?d?u?d?l?u?u?d +?u?d?u?d?l?u?u?l +?u?d?u?d?l?u?u?u +?u?d?u?d?u?d?d?d +?u?d?u?d?u?d?d?l +?u?d?u?d?u?d?d?u +?u?d?u?d?u?d?d?s +?u?d?u?d?u?d?l?d +?u?d?u?d?u?d?l?l +?u?d?u?d?u?d?l?u +?u?d?u?d?u?d?u?d +?u?d?u?d?u?d?u?l +?u?d?u?d?u?d?u?u +?u?d?u?d?u?d?u?s +?u?d?u?d?u?d?s?d +?u?d?u?d?u?d?s?u +?u?d?u?d?u?d?s?s +?u?d?u?d?u?l?d?d +?u?d?u?d?u?l?d?l +?u?d?u?d?u?l?d?u +?u?d?u?d?u?l?l?d +?u?d?u?d?u?l?l?l +?u?d?u?d?u?l?l?u +?u?d?u?d?u?l?u?d +?u?d?u?d?u?l?u?l +?u?d?u?d?u?l?u?u +?u?d?u?d?u?u?d?d +?u?d?u?d?u?u?d?l +?u?d?u?d?u?u?d?u +?u?d?u?d?u?u?d?s +?u?d?u?d?u?u?l?d +?u?d?u?d?u?u?l?l +?u?d?u?d?u?u?l?u +?u?d?u?d?u?u?u?d +?u?d?u?d?u?u?u?l +?u?d?u?d?u?u?u?u +?u?d?u?d?u?u?u?s +?u?d?u?d?u?u?s?d +?u?d?u?d?u?u?s?u +?u?d?u?d?u?u?s?s +?u?d?u?d?u?s?d?d +?u?d?u?d?u?s?d?u +?u?d?u?d?u?s?d?s +?u?d?u?d?u?s?u?d +?u?d?u?d?u?s?u?u +?u?d?u?d?u?s?u?s +?u?d?u?d?u?s?s?d +?u?d?u?d?u?s?s?u +?u?d?u?d?u?s?s?s +?u?d?u?d?s?d?d?d +?u?d?u?d?s?d?d?u +?u?d?u?d?s?d?d?s +?u?d?u?d?s?d?u?d +?u?d?u?d?s?d?u?u +?u?d?u?d?s?d?u?s +?u?d?u?d?s?d?s?d +?u?d?u?d?s?d?s?u +?u?d?u?d?s?d?s?s +?u?d?u?d?s?u?d?d +?u?d?u?d?s?u?d?u +?u?d?u?d?s?u?d?s +?u?d?u?d?s?u?u?d +?u?d?u?d?s?u?u?u +?u?d?u?d?s?u?u?s +?u?d?u?d?s?u?s?d +?u?d?u?d?s?u?s?u +?u?d?u?d?s?u?s?s +?u?d?u?d?s?s?d?d +?u?d?u?d?s?s?d?u +?u?d?u?d?s?s?d?s +?u?d?u?d?s?s?u?d +?u?d?u?d?s?s?u?u +?u?d?u?d?s?s?u?s +?u?d?u?d?s?s?s?d +?u?d?u?d?s?s?s?u +?u?d?u?d?s?s?s?s +?u?d?u?l?d?d?d?d +?u?d?u?l?d?d?d?l +?u?d?u?l?d?d?d?u +?u?d?u?l?d?d?l?d +?u?d?u?l?d?d?l?l +?u?d?u?l?d?d?l?u +?u?d?u?l?d?d?u?d +?u?d?u?l?d?d?u?l +?u?d?u?l?d?d?u?u +?u?d?u?l?d?l?d?d +?u?d?u?l?d?l?d?l +?u?d?u?l?d?l?d?u +?u?d?u?l?d?l?l?d +?u?d?u?l?d?l?l?l +?u?d?u?l?d?l?l?u +?u?d?u?l?d?l?u?d +?u?d?u?l?d?l?u?l +?u?d?u?l?d?l?u?u +?u?d?u?l?d?u?d?d +?u?d?u?l?d?u?d?l +?u?d?u?l?d?u?d?u +?u?d?u?l?d?u?l?d +?u?d?u?l?d?u?l?l +?u?d?u?l?d?u?l?u +?u?d?u?l?d?u?u?d +?u?d?u?l?d?u?u?l +?u?d?u?l?d?u?u?u +?u?d?u?l?l?d?d?d +?u?d?u?l?l?d?d?l +?u?d?u?l?l?d?d?u +?u?d?u?l?l?d?l?d +?u?d?u?l?l?d?l?l +?u?d?u?l?l?d?l?u +?u?d?u?l?l?d?u?d +?u?d?u?l?l?d?u?l +?u?d?u?l?l?d?u?u +?u?d?u?l?l?l?d?d +?u?d?u?l?l?l?d?l +?u?d?u?l?l?l?d?u +?u?d?u?l?l?l?l?d +?u?d?u?l?l?l?l?l +?u?d?u?l?l?l?l?u +?u?d?u?l?l?l?u?d +?u?d?u?l?l?l?u?l +?u?d?u?l?l?l?u?u +?u?d?u?l?l?u?d?d +?u?d?u?l?l?u?d?l +?u?d?u?l?l?u?d?u +?u?d?u?l?l?u?l?d +?u?d?u?l?l?u?l?l +?u?d?u?l?l?u?l?u +?u?d?u?l?l?u?u?d +?u?d?u?l?l?u?u?l +?u?d?u?l?l?u?u?u +?u?d?u?l?u?d?d?d +?u?d?u?l?u?d?d?l +?u?d?u?l?u?d?d?u +?u?d?u?l?u?d?l?d +?u?d?u?l?u?d?l?l +?u?d?u?l?u?d?l?u +?u?d?u?l?u?d?u?d +?u?d?u?l?u?d?u?l +?u?d?u?l?u?d?u?u +?u?d?u?l?u?l?d?d +?u?d?u?l?u?l?d?l +?u?d?u?l?u?l?d?u +?u?d?u?l?u?l?l?d +?u?d?u?l?u?l?l?l +?u?d?u?l?u?l?l?u +?u?d?u?l?u?l?u?d +?u?d?u?l?u?l?u?l +?u?d?u?l?u?l?u?u +?u?d?u?l?u?u?d?d +?u?d?u?l?u?u?d?l +?u?d?u?l?u?u?d?u +?u?d?u?l?u?u?l?d +?u?d?u?l?u?u?l?l +?u?d?u?l?u?u?l?u +?u?d?u?l?u?u?u?d +?u?d?u?l?u?u?u?l +?u?d?u?l?u?u?u?u +?u?d?u?u?d?d?d?d +?u?d?u?u?d?d?d?l +?u?d?u?u?d?d?d?u +?u?d?u?u?d?d?d?s +?u?d?u?u?d?d?l?d +?u?d?u?u?d?d?l?l +?u?d?u?u?d?d?l?u +?u?d?u?u?d?d?u?d +?u?d?u?u?d?d?u?l +?u?d?u?u?d?d?u?u +?u?d?u?u?d?d?u?s +?u?d?u?u?d?d?s?d +?u?d?u?u?d?d?s?u +?u?d?u?u?d?d?s?s +?u?d?u?u?d?l?d?d +?u?d?u?u?d?l?d?l +?u?d?u?u?d?l?d?u +?u?d?u?u?d?l?l?d +?u?d?u?u?d?l?l?l +?u?d?u?u?d?l?l?u +?u?d?u?u?d?l?u?d +?u?d?u?u?d?l?u?l +?u?d?u?u?d?l?u?u +?u?d?u?u?d?u?d?d +?u?d?u?u?d?u?d?l +?u?d?u?u?d?u?d?u +?u?d?u?u?d?u?d?s +?u?d?u?u?d?u?l?d +?u?d?u?u?d?u?l?l +?u?d?u?u?d?u?l?u +?u?d?u?u?d?u?u?d +?u?d?u?u?d?u?u?l +?u?d?u?u?d?u?u?u +?u?d?u?u?d?u?u?s +?u?d?u?u?d?u?s?d +?u?d?u?u?d?u?s?u +?u?d?u?u?d?u?s?s +?u?d?u?u?d?s?d?d +?u?d?u?u?d?s?d?u +?u?d?u?u?d?s?d?s +?u?d?u?u?d?s?u?d +?u?d?u?u?d?s?u?u +?u?d?u?u?d?s?u?s +?u?d?u?u?d?s?s?d +?u?d?u?u?d?s?s?u +?u?d?u?u?d?s?s?s +?u?d?u?u?l?d?d?d +?u?d?u?u?l?d?d?l +?u?d?u?u?l?d?d?u +?u?d?u?u?l?d?l?d +?u?d?u?u?l?d?l?l +?u?d?u?u?l?d?l?u +?u?d?u?u?l?d?u?d +?u?d?u?u?l?d?u?l +?u?d?u?u?l?d?u?u +?u?d?u?u?l?l?d?d +?u?d?u?u?l?l?d?l +?u?d?u?u?l?l?d?u +?u?d?u?u?l?l?l?d +?u?d?u?u?l?l?l?l +?u?d?u?u?l?l?l?u +?u?d?u?u?l?l?u?d +?u?d?u?u?l?l?u?l +?u?d?u?u?l?l?u?u +?u?d?u?u?l?u?d?d +?u?d?u?u?l?u?d?l +?u?d?u?u?l?u?d?u +?u?d?u?u?l?u?l?d +?u?d?u?u?l?u?l?l +?u?d?u?u?l?u?l?u +?u?d?u?u?l?u?u?d +?u?d?u?u?l?u?u?l +?u?d?u?u?l?u?u?u +?u?d?u?u?u?d?d?d +?u?d?u?u?u?d?d?l +?u?d?u?u?u?d?d?u +?u?d?u?u?u?d?d?s +?u?d?u?u?u?d?l?d +?u?d?u?u?u?d?l?l +?u?d?u?u?u?d?l?u +?u?d?u?u?u?d?u?d +?u?d?u?u?u?d?u?l +?u?d?u?u?u?d?u?u +?u?d?u?u?u?d?u?s +?u?d?u?u?u?d?s?d +?u?d?u?u?u?d?s?u +?u?d?u?u?u?d?s?s +?u?d?u?u?u?l?d?d +?u?d?u?u?u?l?d?l +?u?d?u?u?u?l?d?u +?u?d?u?u?u?l?l?d +?u?d?u?u?u?l?l?l +?u?d?u?u?u?l?l?u +?u?d?u?u?u?l?u?d +?u?d?u?u?u?l?u?l +?u?d?u?u?u?l?u?u +?u?d?u?u?u?u?d?d +?u?d?u?u?u?u?d?l +?u?d?u?u?u?u?d?u +?u?d?u?u?u?u?d?s +?u?d?u?u?u?u?l?d +?u?d?u?u?u?u?l?l +?u?d?u?u?u?u?l?u +?u?d?u?u?u?u?u?d +?u?d?u?u?u?u?u?l +?u?d?u?u?u?u?u?u +?u?d?u?u?u?u?u?s +?u?d?u?u?u?u?s?d +?u?d?u?u?u?u?s?u +?u?d?u?u?u?u?s?s +?u?d?u?u?u?s?d?d +?u?d?u?u?u?s?d?u +?u?d?u?u?u?s?d?s +?u?d?u?u?u?s?u?d +?u?d?u?u?u?s?u?u +?u?d?u?u?u?s?u?s +?u?d?u?u?u?s?s?d +?u?d?u?u?u?s?s?u +?u?d?u?u?u?s?s?s +?u?d?u?u?s?d?d?d +?u?d?u?u?s?d?d?u +?u?d?u?u?s?d?d?s +?u?d?u?u?s?d?u?d +?u?d?u?u?s?d?u?u +?u?d?u?u?s?d?u?s +?u?d?u?u?s?d?s?d +?u?d?u?u?s?d?s?u +?u?d?u?u?s?d?s?s +?u?d?u?u?s?u?d?d +?u?d?u?u?s?u?d?u +?u?d?u?u?s?u?d?s +?u?d?u?u?s?u?u?d +?u?d?u?u?s?u?u?u +?u?d?u?u?s?u?u?s +?u?d?u?u?s?u?s?d +?u?d?u?u?s?u?s?u +?u?d?u?u?s?u?s?s +?u?d?u?u?s?s?d?d +?u?d?u?u?s?s?d?u +?u?d?u?u?s?s?d?s +?u?d?u?u?s?s?u?d +?u?d?u?u?s?s?u?u +?u?d?u?u?s?s?u?s +?u?d?u?u?s?s?s?d +?u?d?u?u?s?s?s?u +?u?d?u?u?s?s?s?s +?u?d?u?s?d?d?d?d +?u?d?u?s?d?d?d?u +?u?d?u?s?d?d?d?s +?u?d?u?s?d?d?u?d +?u?d?u?s?d?d?u?u +?u?d?u?s?d?d?u?s +?u?d?u?s?d?d?s?d +?u?d?u?s?d?d?s?u +?u?d?u?s?d?d?s?s +?u?d?u?s?d?u?d?d +?u?d?u?s?d?u?d?u +?u?d?u?s?d?u?d?s +?u?d?u?s?d?u?u?d +?u?d?u?s?d?u?u?u +?u?d?u?s?d?u?u?s +?u?d?u?s?d?u?s?d +?u?d?u?s?d?u?s?u +?u?d?u?s?d?u?s?s +?u?d?u?s?d?s?d?d +?u?d?u?s?d?s?d?u +?u?d?u?s?d?s?d?s +?u?d?u?s?d?s?u?d +?u?d?u?s?d?s?u?u +?u?d?u?s?d?s?u?s +?u?d?u?s?d?s?s?d +?u?d?u?s?d?s?s?u +?u?d?u?s?d?s?s?s +?u?d?u?s?u?d?d?d +?u?d?u?s?u?d?d?u +?u?d?u?s?u?d?d?s +?u?d?u?s?u?d?u?d +?u?d?u?s?u?d?u?u +?u?d?u?s?u?d?u?s +?u?d?u?s?u?d?s?d +?u?d?u?s?u?d?s?u +?u?d?u?s?u?d?s?s +?u?d?u?s?u?u?d?d +?u?d?u?s?u?u?d?u +?u?d?u?s?u?u?d?s +?u?d?u?s?u?u?u?d +?u?d?u?s?u?u?u?u +?u?d?u?s?u?u?u?s +?u?d?u?s?u?u?s?d +?u?d?u?s?u?u?s?u +?u?d?u?s?u?u?s?s +?u?d?u?s?u?s?d?d +?u?d?u?s?u?s?d?u +?u?d?u?s?u?s?d?s +?u?d?u?s?u?s?u?d +?u?d?u?s?u?s?u?u +?u?d?u?s?u?s?u?s +?u?d?u?s?u?s?s?d +?u?d?u?s?u?s?s?u +?u?d?u?s?u?s?s?s +?u?d?u?s?s?d?d?d +?u?d?u?s?s?d?d?u +?u?d?u?s?s?d?d?s +?u?d?u?s?s?d?u?d +?u?d?u?s?s?d?u?u +?u?d?u?s?s?d?u?s +?u?d?u?s?s?d?s?d +?u?d?u?s?s?d?s?u +?u?d?u?s?s?d?s?s +?u?d?u?s?s?u?d?d +?u?d?u?s?s?u?d?u +?u?d?u?s?s?u?d?s +?u?d?u?s?s?u?u?d +?u?d?u?s?s?u?u?u +?u?d?u?s?s?u?u?s +?u?d?u?s?s?u?s?d +?u?d?u?s?s?u?s?u +?u?d?u?s?s?u?s?s +?u?d?u?s?s?s?d?d +?u?d?u?s?s?s?d?u +?u?d?u?s?s?s?d?s +?u?d?u?s?s?s?u?d +?u?d?u?s?s?s?u?u +?u?d?u?s?s?s?u?s +?u?d?u?s?s?s?s?d +?u?d?u?s?s?s?s?u +?u?d?u?s?s?s?s?s +?u?d?s?d?d?d?d?d +?u?d?s?d?d?d?d?u +?u?d?s?d?d?d?d?s +?u?d?s?d?d?d?u?d +?u?d?s?d?d?d?u?u +?u?d?s?d?d?d?u?s +?u?d?s?d?d?d?s?d +?u?d?s?d?d?d?s?u +?u?d?s?d?d?d?s?s +?u?d?s?d?d?u?d?d +?u?d?s?d?d?u?d?u +?u?d?s?d?d?u?d?s +?u?d?s?d?d?u?u?d +?u?d?s?d?d?u?u?u +?u?d?s?d?d?u?u?s +?u?d?s?d?d?u?s?d +?u?d?s?d?d?u?s?u +?u?d?s?d?d?u?s?s +?u?d?s?d?d?s?d?d +?u?d?s?d?d?s?d?u +?u?d?s?d?d?s?d?s +?u?d?s?d?d?s?u?d +?u?d?s?d?d?s?u?u +?u?d?s?d?d?s?u?s +?u?d?s?d?d?s?s?d +?u?d?s?d?d?s?s?u +?u?d?s?d?d?s?s?s +?u?d?s?d?u?d?d?d +?u?d?s?d?u?d?d?u +?u?d?s?d?u?d?d?s +?u?d?s?d?u?d?u?d +?u?d?s?d?u?d?u?u +?u?d?s?d?u?d?u?s +?u?d?s?d?u?d?s?d +?u?d?s?d?u?d?s?u +?u?d?s?d?u?d?s?s +?u?d?s?d?u?u?d?d +?u?d?s?d?u?u?d?u +?u?d?s?d?u?u?d?s +?u?d?s?d?u?u?u?d +?u?d?s?d?u?u?u?u +?u?d?s?d?u?u?u?s +?u?d?s?d?u?u?s?d +?u?d?s?d?u?u?s?u +?u?d?s?d?u?u?s?s +?u?d?s?d?u?s?d?d +?u?d?s?d?u?s?d?u +?u?d?s?d?u?s?d?s +?u?d?s?d?u?s?u?d +?u?d?s?d?u?s?u?u +?u?d?s?d?u?s?u?s +?u?d?s?d?u?s?s?d +?u?d?s?d?u?s?s?u +?u?d?s?d?u?s?s?s +?u?d?s?d?s?d?d?d +?u?d?s?d?s?d?d?u +?u?d?s?d?s?d?d?s +?u?d?s?d?s?d?u?d +?u?d?s?d?s?d?u?u +?u?d?s?d?s?d?u?s +?u?d?s?d?s?d?s?d +?u?d?s?d?s?d?s?u +?u?d?s?d?s?d?s?s +?u?d?s?d?s?u?d?d +?u?d?s?d?s?u?d?u +?u?d?s?d?s?u?d?s +?u?d?s?d?s?u?u?d +?u?d?s?d?s?u?u?u +?u?d?s?d?s?u?u?s +?u?d?s?d?s?u?s?d +?u?d?s?d?s?u?s?u +?u?d?s?d?s?u?s?s +?u?d?s?d?s?s?d?d +?u?d?s?d?s?s?d?u +?u?d?s?d?s?s?d?s +?u?d?s?d?s?s?u?d +?u?d?s?d?s?s?u?u +?u?d?s?d?s?s?u?s +?u?d?s?d?s?s?s?d +?u?d?s?d?s?s?s?u +?u?d?s?d?s?s?s?s +?u?d?s?u?d?d?d?d +?u?d?s?u?d?d?d?u +?u?d?s?u?d?d?d?s +?u?d?s?u?d?d?u?d +?u?d?s?u?d?d?u?u +?u?d?s?u?d?d?u?s +?u?d?s?u?d?d?s?d +?u?d?s?u?d?d?s?u +?u?d?s?u?d?d?s?s +?u?d?s?u?d?u?d?d +?u?d?s?u?d?u?d?u +?u?d?s?u?d?u?d?s +?u?d?s?u?d?u?u?d +?u?d?s?u?d?u?u?u +?u?d?s?u?d?u?u?s +?u?d?s?u?d?u?s?d +?u?d?s?u?d?u?s?u +?u?d?s?u?d?u?s?s +?u?d?s?u?d?s?d?d +?u?d?s?u?d?s?d?u +?u?d?s?u?d?s?d?s +?u?d?s?u?d?s?u?d +?u?d?s?u?d?s?u?u +?u?d?s?u?d?s?u?s +?u?d?s?u?d?s?s?d +?u?d?s?u?d?s?s?u +?u?d?s?u?d?s?s?s +?u?d?s?u?u?d?d?d +?u?d?s?u?u?d?d?u +?u?d?s?u?u?d?d?s +?u?d?s?u?u?d?u?d +?u?d?s?u?u?d?u?u +?u?d?s?u?u?d?u?s +?u?d?s?u?u?d?s?d +?u?d?s?u?u?d?s?u +?u?d?s?u?u?d?s?s +?u?d?s?u?u?u?d?d +?u?d?s?u?u?u?d?u +?u?d?s?u?u?u?d?s +?u?d?s?u?u?u?u?d +?u?d?s?u?u?u?u?u +?u?d?s?u?u?u?u?s +?u?d?s?u?u?u?s?d +?u?d?s?u?u?u?s?u +?u?d?s?u?u?u?s?s +?u?d?s?u?u?s?d?d +?u?d?s?u?u?s?d?u +?u?d?s?u?u?s?d?s +?u?d?s?u?u?s?u?d +?u?d?s?u?u?s?u?u +?u?d?s?u?u?s?u?s +?u?d?s?u?u?s?s?d +?u?d?s?u?u?s?s?u +?u?d?s?u?u?s?s?s +?u?d?s?u?s?d?d?d +?u?d?s?u?s?d?d?u +?u?d?s?u?s?d?d?s +?u?d?s?u?s?d?u?d +?u?d?s?u?s?d?u?u +?u?d?s?u?s?d?u?s +?u?d?s?u?s?d?s?d +?u?d?s?u?s?d?s?u +?u?d?s?u?s?d?s?s +?u?d?s?u?s?u?d?d +?u?d?s?u?s?u?d?u +?u?d?s?u?s?u?d?s +?u?d?s?u?s?u?u?d +?u?d?s?u?s?u?u?u +?u?d?s?u?s?u?u?s +?u?d?s?u?s?u?s?d +?u?d?s?u?s?u?s?u +?u?d?s?u?s?u?s?s +?u?d?s?u?s?s?d?d +?u?d?s?u?s?s?d?u +?u?d?s?u?s?s?d?s +?u?d?s?u?s?s?u?d +?u?d?s?u?s?s?u?u +?u?d?s?u?s?s?u?s +?u?d?s?u?s?s?s?d +?u?d?s?u?s?s?s?u +?u?d?s?u?s?s?s?s +?u?d?s?s?d?d?d?d +?u?d?s?s?d?d?d?u +?u?d?s?s?d?d?d?s +?u?d?s?s?d?d?u?d +?u?d?s?s?d?d?u?u +?u?d?s?s?d?d?u?s +?u?d?s?s?d?d?s?d +?u?d?s?s?d?d?s?u +?u?d?s?s?d?d?s?s +?u?d?s?s?d?u?d?d +?u?d?s?s?d?u?d?u +?u?d?s?s?d?u?d?s +?u?d?s?s?d?u?u?d +?u?d?s?s?d?u?u?u +?u?d?s?s?d?u?u?s +?u?d?s?s?d?u?s?d +?u?d?s?s?d?u?s?u +?u?d?s?s?d?u?s?s +?u?d?s?s?d?s?d?d +?u?d?s?s?d?s?d?u +?u?d?s?s?d?s?d?s +?u?d?s?s?d?s?u?d +?u?d?s?s?d?s?u?u +?u?d?s?s?d?s?u?s +?u?d?s?s?d?s?s?d +?u?d?s?s?d?s?s?u +?u?d?s?s?d?s?s?s +?u?d?s?s?u?d?d?d +?u?d?s?s?u?d?d?u +?u?d?s?s?u?d?d?s +?u?d?s?s?u?d?u?d +?u?d?s?s?u?d?u?u +?u?d?s?s?u?d?u?s +?u?d?s?s?u?d?s?d +?u?d?s?s?u?d?s?u +?u?d?s?s?u?d?s?s +?u?d?s?s?u?u?d?d +?u?d?s?s?u?u?d?u +?u?d?s?s?u?u?d?s +?u?d?s?s?u?u?u?d +?u?d?s?s?u?u?u?u +?u?d?s?s?u?u?u?s +?u?d?s?s?u?u?s?d +?u?d?s?s?u?u?s?u +?u?d?s?s?u?u?s?s +?u?d?s?s?u?s?d?d +?u?d?s?s?u?s?d?u +?u?d?s?s?u?s?d?s +?u?d?s?s?u?s?u?d +?u?d?s?s?u?s?u?u +?u?d?s?s?u?s?u?s +?u?d?s?s?u?s?s?d +?u?d?s?s?u?s?s?u +?u?d?s?s?u?s?s?s +?u?d?s?s?s?d?d?d +?u?d?s?s?s?d?d?u +?u?d?s?s?s?d?d?s +?u?d?s?s?s?d?u?d +?u?d?s?s?s?d?u?u +?u?d?s?s?s?d?u?s +?u?d?s?s?s?d?s?d +?u?d?s?s?s?d?s?u +?u?d?s?s?s?d?s?s +?u?d?s?s?s?u?d?d +?u?d?s?s?s?u?d?u +?u?d?s?s?s?u?d?s +?u?d?s?s?s?u?u?d +?u?d?s?s?s?u?u?u +?u?d?s?s?s?u?u?s +?u?d?s?s?s?u?s?d +?u?d?s?s?s?u?s?u +?u?d?s?s?s?u?s?s +?u?d?s?s?s?s?d?d +?u?d?s?s?s?s?d?u +?u?d?s?s?s?s?d?s +?u?d?s?s?s?s?u?d +?u?d?s?s?s?s?u?u +?u?d?s?s?s?s?u?s +?u?d?s?s?s?s?s?d +?u?d?s?s?s?s?s?u +?u?d?s?s?s?s?s?s +?u?l?d?d?d?d?d?d +?u?l?d?d?d?d?d?l +?u?l?d?d?d?d?d?u +?u?l?d?d?d?d?l?d +?u?l?d?d?d?d?l?l +?u?l?d?d?d?d?l?u +?u?l?d?d?d?d?u?d +?u?l?d?d?d?d?u?l +?u?l?d?d?d?d?u?u +?u?l?d?d?d?l?d?d +?u?l?d?d?d?l?d?l +?u?l?d?d?d?l?d?u +?u?l?d?d?d?l?l?d +?u?l?d?d?d?l?l?l +?u?l?d?d?d?l?l?u +?u?l?d?d?d?l?u?d +?u?l?d?d?d?l?u?l +?u?l?d?d?d?l?u?u +?u?l?d?d?d?u?d?d +?u?l?d?d?d?u?d?l +?u?l?d?d?d?u?d?u +?u?l?d?d?d?u?l?d +?u?l?d?d?d?u?l?l +?u?l?d?d?d?u?l?u +?u?l?d?d?d?u?u?d +?u?l?d?d?d?u?u?l +?u?l?d?d?d?u?u?u +?u?l?d?d?l?d?d?d +?u?l?d?d?l?d?d?l +?u?l?d?d?l?d?d?u +?u?l?d?d?l?d?l?d +?u?l?d?d?l?d?l?l +?u?l?d?d?l?d?l?u +?u?l?d?d?l?d?u?d +?u?l?d?d?l?d?u?l +?u?l?d?d?l?d?u?u +?u?l?d?d?l?l?d?d +?u?l?d?d?l?l?d?l +?u?l?d?d?l?l?d?u +?u?l?d?d?l?l?l?d +?u?l?d?d?l?l?l?l +?u?l?d?d?l?l?l?u +?u?l?d?d?l?l?u?d +?u?l?d?d?l?l?u?l +?u?l?d?d?l?l?u?u +?u?l?d?d?l?u?d?d +?u?l?d?d?l?u?d?l +?u?l?d?d?l?u?d?u +?u?l?d?d?l?u?l?d +?u?l?d?d?l?u?l?l +?u?l?d?d?l?u?l?u +?u?l?d?d?l?u?u?d +?u?l?d?d?l?u?u?l +?u?l?d?d?l?u?u?u +?u?l?d?d?u?d?d?d +?u?l?d?d?u?d?d?l +?u?l?d?d?u?d?d?u +?u?l?d?d?u?d?l?d +?u?l?d?d?u?d?l?l +?u?l?d?d?u?d?l?u +?u?l?d?d?u?d?u?d +?u?l?d?d?u?d?u?l +?u?l?d?d?u?d?u?u +?u?l?d?d?u?l?d?d +?u?l?d?d?u?l?d?l +?u?l?d?d?u?l?d?u +?u?l?d?d?u?l?l?d +?u?l?d?d?u?l?l?l +?u?l?d?d?u?l?l?u +?u?l?d?d?u?l?u?d +?u?l?d?d?u?l?u?l +?u?l?d?d?u?l?u?u +?u?l?d?d?u?u?d?d +?u?l?d?d?u?u?d?l +?u?l?d?d?u?u?d?u +?u?l?d?d?u?u?l?d +?u?l?d?d?u?u?l?l +?u?l?d?d?u?u?l?u +?u?l?d?d?u?u?u?d +?u?l?d?d?u?u?u?l +?u?l?d?d?u?u?u?u +?u?l?d?l?d?d?d?d +?u?l?d?l?d?d?d?l +?u?l?d?l?d?d?d?u +?u?l?d?l?d?d?l?d +?u?l?d?l?d?d?l?l +?u?l?d?l?d?d?l?u +?u?l?d?l?d?d?u?d +?u?l?d?l?d?d?u?l +?u?l?d?l?d?d?u?u +?u?l?d?l?d?l?d?d +?u?l?d?l?d?l?d?l +?u?l?d?l?d?l?d?u +?u?l?d?l?d?l?l?d +?u?l?d?l?d?l?l?l +?u?l?d?l?d?l?l?u +?u?l?d?l?d?l?u?d +?u?l?d?l?d?l?u?l +?u?l?d?l?d?l?u?u +?u?l?d?l?d?u?d?d +?u?l?d?l?d?u?d?l +?u?l?d?l?d?u?d?u +?u?l?d?l?d?u?l?d +?u?l?d?l?d?u?l?l +?u?l?d?l?d?u?l?u +?u?l?d?l?d?u?u?d +?u?l?d?l?d?u?u?l +?u?l?d?l?d?u?u?u +?u?l?d?l?l?d?d?d +?u?l?d?l?l?d?d?l +?u?l?d?l?l?d?d?u +?u?l?d?l?l?d?l?d +?u?l?d?l?l?d?l?l +?u?l?d?l?l?d?l?u +?u?l?d?l?l?d?u?d +?u?l?d?l?l?d?u?l +?u?l?d?l?l?d?u?u +?u?l?d?l?l?l?d?d +?u?l?d?l?l?l?d?l +?u?l?d?l?l?l?d?u +?u?l?d?l?l?l?l?d +?u?l?d?l?l?l?l?l +?u?l?d?l?l?l?l?u +?u?l?d?l?l?l?u?d +?u?l?d?l?l?l?u?l +?u?l?d?l?l?l?u?u +?u?l?d?l?l?u?d?d +?u?l?d?l?l?u?d?l +?u?l?d?l?l?u?d?u +?u?l?d?l?l?u?l?d +?u?l?d?l?l?u?l?l +?u?l?d?l?l?u?l?u +?u?l?d?l?l?u?u?d +?u?l?d?l?l?u?u?l +?u?l?d?l?l?u?u?u +?u?l?d?l?u?d?d?d +?u?l?d?l?u?d?d?l +?u?l?d?l?u?d?d?u +?u?l?d?l?u?d?l?d +?u?l?d?l?u?d?l?l +?u?l?d?l?u?d?l?u +?u?l?d?l?u?d?u?d +?u?l?d?l?u?d?u?l +?u?l?d?l?u?d?u?u +?u?l?d?l?u?l?d?d +?u?l?d?l?u?l?d?l +?u?l?d?l?u?l?d?u +?u?l?d?l?u?l?l?d +?u?l?d?l?u?l?l?l +?u?l?d?l?u?l?l?u +?u?l?d?l?u?l?u?d +?u?l?d?l?u?l?u?l +?u?l?d?l?u?l?u?u +?u?l?d?l?u?u?d?d +?u?l?d?l?u?u?d?l +?u?l?d?l?u?u?d?u +?u?l?d?l?u?u?l?d +?u?l?d?l?u?u?l?l +?u?l?d?l?u?u?l?u +?u?l?d?l?u?u?u?d +?u?l?d?l?u?u?u?l +?u?l?d?l?u?u?u?u +?u?l?d?u?d?d?d?d +?u?l?d?u?d?d?d?l +?u?l?d?u?d?d?d?u +?u?l?d?u?d?d?l?d +?u?l?d?u?d?d?l?l +?u?l?d?u?d?d?l?u +?u?l?d?u?d?d?u?d +?u?l?d?u?d?d?u?l +?u?l?d?u?d?d?u?u +?u?l?d?u?d?l?d?d +?u?l?d?u?d?l?d?l +?u?l?d?u?d?l?d?u +?u?l?d?u?d?l?l?d +?u?l?d?u?d?l?l?l +?u?l?d?u?d?l?l?u +?u?l?d?u?d?l?u?d +?u?l?d?u?d?l?u?l +?u?l?d?u?d?l?u?u +?u?l?d?u?d?u?d?d +?u?l?d?u?d?u?d?l +?u?l?d?u?d?u?d?u +?u?l?d?u?d?u?l?d +?u?l?d?u?d?u?l?l +?u?l?d?u?d?u?l?u +?u?l?d?u?d?u?u?d +?u?l?d?u?d?u?u?l +?u?l?d?u?d?u?u?u +?u?l?d?u?l?d?d?d +?u?l?d?u?l?d?d?l +?u?l?d?u?l?d?d?u +?u?l?d?u?l?d?l?d +?u?l?d?u?l?d?l?l +?u?l?d?u?l?d?l?u +?u?l?d?u?l?d?u?d +?u?l?d?u?l?d?u?l +?u?l?d?u?l?d?u?u +?u?l?d?u?l?l?d?d +?u?l?d?u?l?l?d?l +?u?l?d?u?l?l?d?u +?u?l?d?u?l?l?l?d +?u?l?d?u?l?l?l?l +?u?l?d?u?l?l?l?u +?u?l?d?u?l?l?u?d +?u?l?d?u?l?l?u?l +?u?l?d?u?l?l?u?u +?u?l?d?u?l?u?d?d +?u?l?d?u?l?u?d?l +?u?l?d?u?l?u?d?u +?u?l?d?u?l?u?l?d +?u?l?d?u?l?u?l?l +?u?l?d?u?l?u?l?u +?u?l?d?u?l?u?u?d +?u?l?d?u?l?u?u?l +?u?l?d?u?l?u?u?u +?u?l?d?u?u?d?d?d +?u?l?d?u?u?d?d?l +?u?l?d?u?u?d?d?u +?u?l?d?u?u?d?l?d +?u?l?d?u?u?d?l?l +?u?l?d?u?u?d?l?u +?u?l?d?u?u?d?u?d +?u?l?d?u?u?d?u?l +?u?l?d?u?u?d?u?u +?u?l?d?u?u?l?d?d +?u?l?d?u?u?l?d?l +?u?l?d?u?u?l?d?u +?u?l?d?u?u?l?l?d +?u?l?d?u?u?l?l?l +?u?l?d?u?u?l?l?u +?u?l?d?u?u?l?u?d +?u?l?d?u?u?l?u?l +?u?l?d?u?u?l?u?u +?u?l?d?u?u?u?d?d +?u?l?d?u?u?u?d?l +?u?l?d?u?u?u?d?u +?u?l?d?u?u?u?l?d +?u?l?d?u?u?u?l?l +?u?l?d?u?u?u?l?u +?u?l?d?u?u?u?u?d +?u?l?d?u?u?u?u?l +?u?l?d?u?u?u?u?u +?u?l?l?d?d?d?d?d +?u?l?l?d?d?d?d?l +?u?l?l?d?d?d?d?u +?u?l?l?d?d?d?l?d +?u?l?l?d?d?d?l?l +?u?l?l?d?d?d?l?u +?u?l?l?d?d?d?u?d +?u?l?l?d?d?d?u?l +?u?l?l?d?d?d?u?u +?u?l?l?d?d?l?d?d +?u?l?l?d?d?l?d?l +?u?l?l?d?d?l?d?u +?u?l?l?d?d?l?l?d +?u?l?l?d?d?l?l?l +?u?l?l?d?d?l?l?u +?u?l?l?d?d?l?u?d +?u?l?l?d?d?l?u?l +?u?l?l?d?d?l?u?u +?u?l?l?d?d?u?d?d +?u?l?l?d?d?u?d?l +?u?l?l?d?d?u?d?u +?u?l?l?d?d?u?l?d +?u?l?l?d?d?u?l?l +?u?l?l?d?d?u?l?u +?u?l?l?d?d?u?u?d +?u?l?l?d?d?u?u?l +?u?l?l?d?d?u?u?u +?u?l?l?d?l?d?d?d +?u?l?l?d?l?d?d?l +?u?l?l?d?l?d?d?u +?u?l?l?d?l?d?l?d +?u?l?l?d?l?d?l?l +?u?l?l?d?l?d?l?u +?u?l?l?d?l?d?u?d +?u?l?l?d?l?d?u?l +?u?l?l?d?l?d?u?u +?u?l?l?d?l?l?d?d +?u?l?l?d?l?l?d?l +?u?l?l?d?l?l?d?u +?u?l?l?d?l?l?l?d +?u?l?l?d?l?l?l?l +?u?l?l?d?l?l?l?u +?u?l?l?d?l?l?u?d +?u?l?l?d?l?l?u?l +?u?l?l?d?l?l?u?u +?u?l?l?d?l?u?d?d +?u?l?l?d?l?u?d?l +?u?l?l?d?l?u?d?u +?u?l?l?d?l?u?l?d +?u?l?l?d?l?u?l?l +?u?l?l?d?l?u?l?u +?u?l?l?d?l?u?u?d +?u?l?l?d?l?u?u?l +?u?l?l?d?l?u?u?u +?u?l?l?d?u?d?d?d +?u?l?l?d?u?d?d?l +?u?l?l?d?u?d?d?u +?u?l?l?d?u?d?l?d +?u?l?l?d?u?d?l?l +?u?l?l?d?u?d?l?u +?u?l?l?d?u?d?u?d +?u?l?l?d?u?d?u?l +?u?l?l?d?u?d?u?u +?u?l?l?d?u?l?d?d +?u?l?l?d?u?l?d?l +?u?l?l?d?u?l?d?u +?u?l?l?d?u?l?l?d +?u?l?l?d?u?l?l?l +?u?l?l?d?u?l?l?u +?u?l?l?d?u?l?u?d +?u?l?l?d?u?l?u?l +?u?l?l?d?u?l?u?u +?u?l?l?d?u?u?d?d +?u?l?l?d?u?u?d?l +?u?l?l?d?u?u?d?u +?u?l?l?d?u?u?l?d +?u?l?l?d?u?u?l?l +?u?l?l?d?u?u?l?u +?u?l?l?d?u?u?u?d +?u?l?l?d?u?u?u?l +?u?l?l?d?u?u?u?u +?u?l?l?l?d?d?d?d +?u?l?l?l?d?d?d?l +?u?l?l?l?d?d?d?u +?u?l?l?l?d?d?l?d +?u?l?l?l?d?d?l?l +?u?l?l?l?d?d?l?u +?u?l?l?l?d?d?u?d +?u?l?l?l?d?d?u?l +?u?l?l?l?d?d?u?u +?u?l?l?l?d?l?d?d +?u?l?l?l?d?l?d?l +?u?l?l?l?d?l?d?u +?u?l?l?l?d?l?l?d +?u?l?l?l?d?l?l?l +?u?l?l?l?d?l?l?u +?u?l?l?l?d?l?u?d +?u?l?l?l?d?l?u?l +?u?l?l?l?d?l?u?u +?u?l?l?l?d?u?d?d +?u?l?l?l?d?u?d?l +?u?l?l?l?d?u?d?u +?u?l?l?l?d?u?l?d +?u?l?l?l?d?u?l?l +?u?l?l?l?d?u?l?u +?u?l?l?l?d?u?u?d +?u?l?l?l?d?u?u?l +?u?l?l?l?d?u?u?u +?u?l?l?l?l?d?d?d +?u?l?l?l?l?d?d?l +?u?l?l?l?l?d?d?u +?u?l?l?l?l?d?l?d +?u?l?l?l?l?d?l?l +?u?l?l?l?l?d?l?u +?u?l?l?l?l?d?u?d +?u?l?l?l?l?d?u?l +?u?l?l?l?l?d?u?u +?u?l?l?l?l?l?d?d +?u?l?l?l?l?l?d?l +?u?l?l?l?l?l?d?u +?u?l?l?l?l?l?l?d +?u?l?l?l?l?l?l?l +?u?l?l?l?l?l?l?u +?u?l?l?l?l?l?l?s +?u?l?l?l?l?l?u?d +?u?l?l?l?l?l?u?l +?u?l?l?l?l?l?u?u +?u?l?l?l?l?l?u?s +?u?l?l?l?l?l?s?l +?u?l?l?l?l?l?s?u +?u?l?l?l?l?l?s?s +?u?l?l?l?l?u?d?d +?u?l?l?l?l?u?d?l +?u?l?l?l?l?u?d?u +?u?l?l?l?l?u?l?d +?u?l?l?l?l?u?l?l +?u?l?l?l?l?u?l?u +?u?l?l?l?l?u?l?s +?u?l?l?l?l?u?u?d +?u?l?l?l?l?u?u?l +?u?l?l?l?l?u?u?u +?u?l?l?l?l?u?u?s +?u?l?l?l?l?u?s?l +?u?l?l?l?l?u?s?u +?u?l?l?l?l?u?s?s +?u?l?l?l?l?s?l?l +?u?l?l?l?l?s?l?u +?u?l?l?l?l?s?l?s +?u?l?l?l?l?s?u?l +?u?l?l?l?l?s?u?u +?u?l?l?l?l?s?u?s +?u?l?l?l?l?s?s?l +?u?l?l?l?l?s?s?u +?u?l?l?l?l?s?s?s +?u?l?l?l?u?d?d?d +?u?l?l?l?u?d?d?l +?u?l?l?l?u?d?d?u +?u?l?l?l?u?d?l?d +?u?l?l?l?u?d?l?l +?u?l?l?l?u?d?l?u +?u?l?l?l?u?d?u?d +?u?l?l?l?u?d?u?l +?u?l?l?l?u?d?u?u +?u?l?l?l?u?l?d?d +?u?l?l?l?u?l?d?l +?u?l?l?l?u?l?d?u +?u?l?l?l?u?l?l?d +?u?l?l?l?u?l?l?l +?u?l?l?l?u?l?l?u +?u?l?l?l?u?l?l?s +?u?l?l?l?u?l?u?d +?u?l?l?l?u?l?u?l +?u?l?l?l?u?l?u?u +?u?l?l?l?u?l?u?s +?u?l?l?l?u?l?s?l +?u?l?l?l?u?l?s?u +?u?l?l?l?u?l?s?s +?u?l?l?l?u?u?d?d +?u?l?l?l?u?u?d?l +?u?l?l?l?u?u?d?u +?u?l?l?l?u?u?l?d +?u?l?l?l?u?u?l?l +?u?l?l?l?u?u?l?u +?u?l?l?l?u?u?l?s +?u?l?l?l?u?u?u?d +?u?l?l?l?u?u?u?l +?u?l?l?l?u?u?u?u +?u?l?l?l?u?u?u?s +?u?l?l?l?u?u?s?l +?u?l?l?l?u?u?s?u +?u?l?l?l?u?u?s?s +?u?l?l?l?u?s?l?l +?u?l?l?l?u?s?l?u +?u?l?l?l?u?s?l?s +?u?l?l?l?u?s?u?l +?u?l?l?l?u?s?u?u +?u?l?l?l?u?s?u?s +?u?l?l?l?u?s?s?l +?u?l?l?l?u?s?s?u +?u?l?l?l?u?s?s?s +?u?l?l?l?s?l?l?l +?u?l?l?l?s?l?l?u +?u?l?l?l?s?l?l?s +?u?l?l?l?s?l?u?l +?u?l?l?l?s?l?u?u +?u?l?l?l?s?l?u?s +?u?l?l?l?s?l?s?l +?u?l?l?l?s?l?s?u +?u?l?l?l?s?l?s?s +?u?l?l?l?s?u?l?l +?u?l?l?l?s?u?l?u +?u?l?l?l?s?u?l?s +?u?l?l?l?s?u?u?l +?u?l?l?l?s?u?u?u +?u?l?l?l?s?u?u?s +?u?l?l?l?s?u?s?l +?u?l?l?l?s?u?s?u +?u?l?l?l?s?u?s?s +?u?l?l?l?s?s?l?l +?u?l?l?l?s?s?l?u +?u?l?l?l?s?s?l?s +?u?l?l?l?s?s?u?l +?u?l?l?l?s?s?u?u +?u?l?l?l?s?s?u?s +?u?l?l?l?s?s?s?l +?u?l?l?l?s?s?s?u +?u?l?l?l?s?s?s?s +?u?l?l?u?d?d?d?d +?u?l?l?u?d?d?d?l +?u?l?l?u?d?d?d?u +?u?l?l?u?d?d?l?d +?u?l?l?u?d?d?l?l +?u?l?l?u?d?d?l?u +?u?l?l?u?d?d?u?d +?u?l?l?u?d?d?u?l +?u?l?l?u?d?d?u?u +?u?l?l?u?d?l?d?d +?u?l?l?u?d?l?d?l +?u?l?l?u?d?l?d?u +?u?l?l?u?d?l?l?d +?u?l?l?u?d?l?l?l +?u?l?l?u?d?l?l?u +?u?l?l?u?d?l?u?d +?u?l?l?u?d?l?u?l +?u?l?l?u?d?l?u?u +?u?l?l?u?d?u?d?d +?u?l?l?u?d?u?d?l +?u?l?l?u?d?u?d?u +?u?l?l?u?d?u?l?d +?u?l?l?u?d?u?l?l +?u?l?l?u?d?u?l?u +?u?l?l?u?d?u?u?d +?u?l?l?u?d?u?u?l +?u?l?l?u?d?u?u?u +?u?l?l?u?l?d?d?d +?u?l?l?u?l?d?d?l +?u?l?l?u?l?d?d?u +?u?l?l?u?l?d?l?d +?u?l?l?u?l?d?l?l +?u?l?l?u?l?d?l?u +?u?l?l?u?l?d?u?d +?u?l?l?u?l?d?u?l +?u?l?l?u?l?d?u?u +?u?l?l?u?l?l?d?d +?u?l?l?u?l?l?d?l +?u?l?l?u?l?l?d?u +?u?l?l?u?l?l?l?d +?u?l?l?u?l?l?l?l +?u?l?l?u?l?l?l?u +?u?l?l?u?l?l?l?s +?u?l?l?u?l?l?u?d +?u?l?l?u?l?l?u?l +?u?l?l?u?l?l?u?u +?u?l?l?u?l?l?u?s +?u?l?l?u?l?l?s?l +?u?l?l?u?l?l?s?u +?u?l?l?u?l?l?s?s +?u?l?l?u?l?u?d?d +?u?l?l?u?l?u?d?l +?u?l?l?u?l?u?d?u +?u?l?l?u?l?u?l?d +?u?l?l?u?l?u?l?l +?u?l?l?u?l?u?l?u +?u?l?l?u?l?u?l?s +?u?l?l?u?l?u?u?d +?u?l?l?u?l?u?u?l +?u?l?l?u?l?u?u?u +?u?l?l?u?l?u?u?s +?u?l?l?u?l?u?s?l +?u?l?l?u?l?u?s?u +?u?l?l?u?l?u?s?s +?u?l?l?u?l?s?l?l +?u?l?l?u?l?s?l?u +?u?l?l?u?l?s?l?s +?u?l?l?u?l?s?u?l +?u?l?l?u?l?s?u?u +?u?l?l?u?l?s?u?s +?u?l?l?u?l?s?s?l +?u?l?l?u?l?s?s?u +?u?l?l?u?l?s?s?s +?u?l?l?u?u?d?d?d +?u?l?l?u?u?d?d?l +?u?l?l?u?u?d?d?u +?u?l?l?u?u?d?l?d +?u?l?l?u?u?d?l?l +?u?l?l?u?u?d?l?u +?u?l?l?u?u?d?u?d +?u?l?l?u?u?d?u?l +?u?l?l?u?u?d?u?u +?u?l?l?u?u?l?d?d +?u?l?l?u?u?l?d?l +?u?l?l?u?u?l?d?u +?u?l?l?u?u?l?l?d +?u?l?l?u?u?l?l?l +?u?l?l?u?u?l?l?u +?u?l?l?u?u?l?l?s +?u?l?l?u?u?l?u?d +?u?l?l?u?u?l?u?l +?u?l?l?u?u?l?u?u +?u?l?l?u?u?l?u?s +?u?l?l?u?u?l?s?l +?u?l?l?u?u?l?s?u +?u?l?l?u?u?l?s?s +?u?l?l?u?u?u?d?d +?u?l?l?u?u?u?d?l +?u?l?l?u?u?u?d?u +?u?l?l?u?u?u?l?d +?u?l?l?u?u?u?l?l +?u?l?l?u?u?u?l?u +?u?l?l?u?u?u?l?s +?u?l?l?u?u?u?u?d +?u?l?l?u?u?u?u?l +?u?l?l?u?u?u?u?u +?u?l?l?u?u?u?u?s +?u?l?l?u?u?u?s?l +?u?l?l?u?u?u?s?u +?u?l?l?u?u?u?s?s +?u?l?l?u?u?s?l?l +?u?l?l?u?u?s?l?u +?u?l?l?u?u?s?l?s +?u?l?l?u?u?s?u?l +?u?l?l?u?u?s?u?u +?u?l?l?u?u?s?u?s +?u?l?l?u?u?s?s?l +?u?l?l?u?u?s?s?u +?u?l?l?u?u?s?s?s +?u?l?l?u?s?l?l?l +?u?l?l?u?s?l?l?u +?u?l?l?u?s?l?l?s +?u?l?l?u?s?l?u?l +?u?l?l?u?s?l?u?u +?u?l?l?u?s?l?u?s +?u?l?l?u?s?l?s?l +?u?l?l?u?s?l?s?u +?u?l?l?u?s?l?s?s +?u?l?l?u?s?u?l?l +?u?l?l?u?s?u?l?u +?u?l?l?u?s?u?l?s +?u?l?l?u?s?u?u?l +?u?l?l?u?s?u?u?u +?u?l?l?u?s?u?u?s +?u?l?l?u?s?u?s?l +?u?l?l?u?s?u?s?u +?u?l?l?u?s?u?s?s +?u?l?l?u?s?s?l?l +?u?l?l?u?s?s?l?u +?u?l?l?u?s?s?l?s +?u?l?l?u?s?s?u?l +?u?l?l?u?s?s?u?u +?u?l?l?u?s?s?u?s +?u?l?l?u?s?s?s?l +?u?l?l?u?s?s?s?u +?u?l?l?u?s?s?s?s +?u?l?l?s?l?l?l?l +?u?l?l?s?l?l?l?u +?u?l?l?s?l?l?l?s +?u?l?l?s?l?l?u?l +?u?l?l?s?l?l?u?u +?u?l?l?s?l?l?u?s +?u?l?l?s?l?l?s?l +?u?l?l?s?l?l?s?u +?u?l?l?s?l?l?s?s +?u?l?l?s?l?u?l?l +?u?l?l?s?l?u?l?u +?u?l?l?s?l?u?l?s +?u?l?l?s?l?u?u?l +?u?l?l?s?l?u?u?u +?u?l?l?s?l?u?u?s +?u?l?l?s?l?u?s?l +?u?l?l?s?l?u?s?u +?u?l?l?s?l?u?s?s +?u?l?l?s?l?s?l?l +?u?l?l?s?l?s?l?u +?u?l?l?s?l?s?l?s +?u?l?l?s?l?s?u?l +?u?l?l?s?l?s?u?u +?u?l?l?s?l?s?u?s +?u?l?l?s?l?s?s?l +?u?l?l?s?l?s?s?u +?u?l?l?s?l?s?s?s +?u?l?l?s?u?l?l?l +?u?l?l?s?u?l?l?u +?u?l?l?s?u?l?l?s +?u?l?l?s?u?l?u?l +?u?l?l?s?u?l?u?u +?u?l?l?s?u?l?u?s +?u?l?l?s?u?l?s?l +?u?l?l?s?u?l?s?u +?u?l?l?s?u?l?s?s +?u?l?l?s?u?u?l?l +?u?l?l?s?u?u?l?u +?u?l?l?s?u?u?l?s +?u?l?l?s?u?u?u?l +?u?l?l?s?u?u?u?u +?u?l?l?s?u?u?u?s +?u?l?l?s?u?u?s?l +?u?l?l?s?u?u?s?u +?u?l?l?s?u?u?s?s +?u?l?l?s?u?s?l?l +?u?l?l?s?u?s?l?u +?u?l?l?s?u?s?l?s +?u?l?l?s?u?s?u?l +?u?l?l?s?u?s?u?u +?u?l?l?s?u?s?u?s +?u?l?l?s?u?s?s?l +?u?l?l?s?u?s?s?u +?u?l?l?s?u?s?s?s +?u?l?l?s?s?l?l?l +?u?l?l?s?s?l?l?u +?u?l?l?s?s?l?l?s +?u?l?l?s?s?l?u?l +?u?l?l?s?s?l?u?u +?u?l?l?s?s?l?u?s +?u?l?l?s?s?l?s?l +?u?l?l?s?s?l?s?u +?u?l?l?s?s?l?s?s +?u?l?l?s?s?u?l?l +?u?l?l?s?s?u?l?u +?u?l?l?s?s?u?l?s +?u?l?l?s?s?u?u?l +?u?l?l?s?s?u?u?u +?u?l?l?s?s?u?u?s +?u?l?l?s?s?u?s?l +?u?l?l?s?s?u?s?u +?u?l?l?s?s?u?s?s +?u?l?l?s?s?s?l?l +?u?l?l?s?s?s?l?u +?u?l?l?s?s?s?l?s +?u?l?l?s?s?s?u?l +?u?l?l?s?s?s?u?u +?u?l?l?s?s?s?u?s +?u?l?l?s?s?s?s?l +?u?l?l?s?s?s?s?u +?u?l?l?s?s?s?s?s +?u?l?u?d?d?d?d?d +?u?l?u?d?d?d?d?l +?u?l?u?d?d?d?d?u +?u?l?u?d?d?d?l?d +?u?l?u?d?d?d?l?l +?u?l?u?d?d?d?l?u +?u?l?u?d?d?d?u?d +?u?l?u?d?d?d?u?l +?u?l?u?d?d?d?u?u +?u?l?u?d?d?l?d?d +?u?l?u?d?d?l?d?l +?u?l?u?d?d?l?d?u +?u?l?u?d?d?l?l?d +?u?l?u?d?d?l?l?l +?u?l?u?d?d?l?l?u +?u?l?u?d?d?l?u?d +?u?l?u?d?d?l?u?l +?u?l?u?d?d?l?u?u +?u?l?u?d?d?u?d?d +?u?l?u?d?d?u?d?l +?u?l?u?d?d?u?d?u +?u?l?u?d?d?u?l?d +?u?l?u?d?d?u?l?l +?u?l?u?d?d?u?l?u +?u?l?u?d?d?u?u?d +?u?l?u?d?d?u?u?l +?u?l?u?d?d?u?u?u +?u?l?u?d?l?d?d?d +?u?l?u?d?l?d?d?l +?u?l?u?d?l?d?d?u +?u?l?u?d?l?d?l?d +?u?l?u?d?l?d?l?l +?u?l?u?d?l?d?l?u +?u?l?u?d?l?d?u?d +?u?l?u?d?l?d?u?l +?u?l?u?d?l?d?u?u +?u?l?u?d?l?l?d?d +?u?l?u?d?l?l?d?l +?u?l?u?d?l?l?d?u +?u?l?u?d?l?l?l?d +?u?l?u?d?l?l?l?l +?u?l?u?d?l?l?l?u +?u?l?u?d?l?l?u?d +?u?l?u?d?l?l?u?l +?u?l?u?d?l?l?u?u +?u?l?u?d?l?u?d?d +?u?l?u?d?l?u?d?l +?u?l?u?d?l?u?d?u +?u?l?u?d?l?u?l?d +?u?l?u?d?l?u?l?l +?u?l?u?d?l?u?l?u +?u?l?u?d?l?u?u?d +?u?l?u?d?l?u?u?l +?u?l?u?d?l?u?u?u +?u?l?u?d?u?d?d?d +?u?l?u?d?u?d?d?l +?u?l?u?d?u?d?d?u +?u?l?u?d?u?d?l?d +?u?l?u?d?u?d?l?l +?u?l?u?d?u?d?l?u +?u?l?u?d?u?d?u?d +?u?l?u?d?u?d?u?l +?u?l?u?d?u?d?u?u +?u?l?u?d?u?l?d?d +?u?l?u?d?u?l?d?l +?u?l?u?d?u?l?d?u +?u?l?u?d?u?l?l?d +?u?l?u?d?u?l?l?l +?u?l?u?d?u?l?l?u +?u?l?u?d?u?l?u?d +?u?l?u?d?u?l?u?l +?u?l?u?d?u?l?u?u +?u?l?u?d?u?u?d?d +?u?l?u?d?u?u?d?l +?u?l?u?d?u?u?d?u +?u?l?u?d?u?u?l?d +?u?l?u?d?u?u?l?l +?u?l?u?d?u?u?l?u +?u?l?u?d?u?u?u?d +?u?l?u?d?u?u?u?l +?u?l?u?d?u?u?u?u +?u?l?u?l?d?d?d?d +?u?l?u?l?d?d?d?l +?u?l?u?l?d?d?d?u +?u?l?u?l?d?d?l?d +?u?l?u?l?d?d?l?l +?u?l?u?l?d?d?l?u +?u?l?u?l?d?d?u?d +?u?l?u?l?d?d?u?l +?u?l?u?l?d?d?u?u +?u?l?u?l?d?l?d?d +?u?l?u?l?d?l?d?l +?u?l?u?l?d?l?d?u +?u?l?u?l?d?l?l?d +?u?l?u?l?d?l?l?l +?u?l?u?l?d?l?l?u +?u?l?u?l?d?l?u?d +?u?l?u?l?d?l?u?l +?u?l?u?l?d?l?u?u +?u?l?u?l?d?u?d?d +?u?l?u?l?d?u?d?l +?u?l?u?l?d?u?d?u +?u?l?u?l?d?u?l?d +?u?l?u?l?d?u?l?l +?u?l?u?l?d?u?l?u +?u?l?u?l?d?u?u?d +?u?l?u?l?d?u?u?l +?u?l?u?l?d?u?u?u +?u?l?u?l?l?d?d?d +?u?l?u?l?l?d?d?l +?u?l?u?l?l?d?d?u +?u?l?u?l?l?d?l?d +?u?l?u?l?l?d?l?l +?u?l?u?l?l?d?l?u +?u?l?u?l?l?d?u?d +?u?l?u?l?l?d?u?l +?u?l?u?l?l?d?u?u +?u?l?u?l?l?l?d?d +?u?l?u?l?l?l?d?l +?u?l?u?l?l?l?d?u +?u?l?u?l?l?l?l?d +?u?l?u?l?l?l?l?l +?u?l?u?l?l?l?l?u +?u?l?u?l?l?l?l?s +?u?l?u?l?l?l?u?d +?u?l?u?l?l?l?u?l +?u?l?u?l?l?l?u?u +?u?l?u?l?l?l?u?s +?u?l?u?l?l?l?s?l +?u?l?u?l?l?l?s?u +?u?l?u?l?l?l?s?s +?u?l?u?l?l?u?d?d +?u?l?u?l?l?u?d?l +?u?l?u?l?l?u?d?u +?u?l?u?l?l?u?l?d +?u?l?u?l?l?u?l?l +?u?l?u?l?l?u?l?u +?u?l?u?l?l?u?l?s +?u?l?u?l?l?u?u?d +?u?l?u?l?l?u?u?l +?u?l?u?l?l?u?u?u +?u?l?u?l?l?u?u?s +?u?l?u?l?l?u?s?l +?u?l?u?l?l?u?s?u +?u?l?u?l?l?u?s?s +?u?l?u?l?l?s?l?l +?u?l?u?l?l?s?l?u +?u?l?u?l?l?s?l?s +?u?l?u?l?l?s?u?l +?u?l?u?l?l?s?u?u +?u?l?u?l?l?s?u?s +?u?l?u?l?l?s?s?l +?u?l?u?l?l?s?s?u +?u?l?u?l?l?s?s?s +?u?l?u?l?u?d?d?d +?u?l?u?l?u?d?d?l +?u?l?u?l?u?d?d?u +?u?l?u?l?u?d?l?d +?u?l?u?l?u?d?l?l +?u?l?u?l?u?d?l?u +?u?l?u?l?u?d?u?d +?u?l?u?l?u?d?u?l +?u?l?u?l?u?d?u?u +?u?l?u?l?u?l?d?d +?u?l?u?l?u?l?d?l +?u?l?u?l?u?l?d?u +?u?l?u?l?u?l?l?d +?u?l?u?l?u?l?l?l +?u?l?u?l?u?l?l?u +?u?l?u?l?u?l?l?s +?u?l?u?l?u?l?u?d +?u?l?u?l?u?l?u?l +?u?l?u?l?u?l?u?u +?u?l?u?l?u?l?u?s +?u?l?u?l?u?l?s?l +?u?l?u?l?u?l?s?u +?u?l?u?l?u?l?s?s +?u?l?u?l?u?u?d?d +?u?l?u?l?u?u?d?l +?u?l?u?l?u?u?d?u +?u?l?u?l?u?u?l?d +?u?l?u?l?u?u?l?l +?u?l?u?l?u?u?l?u +?u?l?u?l?u?u?l?s +?u?l?u?l?u?u?u?d +?u?l?u?l?u?u?u?l +?u?l?u?l?u?u?u?u +?u?l?u?l?u?u?u?s +?u?l?u?l?u?u?s?l +?u?l?u?l?u?u?s?u +?u?l?u?l?u?u?s?s +?u?l?u?l?u?s?l?l +?u?l?u?l?u?s?l?u +?u?l?u?l?u?s?l?s +?u?l?u?l?u?s?u?l +?u?l?u?l?u?s?u?u +?u?l?u?l?u?s?u?s +?u?l?u?l?u?s?s?l +?u?l?u?l?u?s?s?u +?u?l?u?l?u?s?s?s +?u?l?u?l?s?l?l?l +?u?l?u?l?s?l?l?u +?u?l?u?l?s?l?l?s +?u?l?u?l?s?l?u?l +?u?l?u?l?s?l?u?u +?u?l?u?l?s?l?u?s +?u?l?u?l?s?l?s?l +?u?l?u?l?s?l?s?u +?u?l?u?l?s?l?s?s +?u?l?u?l?s?u?l?l +?u?l?u?l?s?u?l?u +?u?l?u?l?s?u?l?s +?u?l?u?l?s?u?u?l +?u?l?u?l?s?u?u?u +?u?l?u?l?s?u?u?s +?u?l?u?l?s?u?s?l +?u?l?u?l?s?u?s?u +?u?l?u?l?s?u?s?s +?u?l?u?l?s?s?l?l +?u?l?u?l?s?s?l?u +?u?l?u?l?s?s?l?s +?u?l?u?l?s?s?u?l +?u?l?u?l?s?s?u?u +?u?l?u?l?s?s?u?s +?u?l?u?l?s?s?s?l +?u?l?u?l?s?s?s?u +?u?l?u?l?s?s?s?s +?u?l?u?u?d?d?d?d +?u?l?u?u?d?d?d?l +?u?l?u?u?d?d?d?u +?u?l?u?u?d?d?l?d +?u?l?u?u?d?d?l?l +?u?l?u?u?d?d?l?u +?u?l?u?u?d?d?u?d +?u?l?u?u?d?d?u?l +?u?l?u?u?d?d?u?u +?u?l?u?u?d?l?d?d +?u?l?u?u?d?l?d?l +?u?l?u?u?d?l?d?u +?u?l?u?u?d?l?l?d +?u?l?u?u?d?l?l?l +?u?l?u?u?d?l?l?u +?u?l?u?u?d?l?u?d +?u?l?u?u?d?l?u?l +?u?l?u?u?d?l?u?u +?u?l?u?u?d?u?d?d +?u?l?u?u?d?u?d?l +?u?l?u?u?d?u?d?u +?u?l?u?u?d?u?l?d +?u?l?u?u?d?u?l?l +?u?l?u?u?d?u?l?u +?u?l?u?u?d?u?u?d +?u?l?u?u?d?u?u?l +?u?l?u?u?d?u?u?u +?u?l?u?u?l?d?d?d +?u?l?u?u?l?d?d?l +?u?l?u?u?l?d?d?u +?u?l?u?u?l?d?l?d +?u?l?u?u?l?d?l?l +?u?l?u?u?l?d?l?u +?u?l?u?u?l?d?u?d +?u?l?u?u?l?d?u?l +?u?l?u?u?l?d?u?u +?u?l?u?u?l?l?d?d +?u?l?u?u?l?l?d?l +?u?l?u?u?l?l?d?u +?u?l?u?u?l?l?l?d +?u?l?u?u?l?l?l?l +?u?l?u?u?l?l?l?u +?u?l?u?u?l?l?l?s +?u?l?u?u?l?l?u?d +?u?l?u?u?l?l?u?l +?u?l?u?u?l?l?u?u +?u?l?u?u?l?l?u?s +?u?l?u?u?l?l?s?l +?u?l?u?u?l?l?s?u +?u?l?u?u?l?l?s?s +?u?l?u?u?l?u?d?d +?u?l?u?u?l?u?d?l +?u?l?u?u?l?u?d?u +?u?l?u?u?l?u?l?d +?u?l?u?u?l?u?l?l +?u?l?u?u?l?u?l?u +?u?l?u?u?l?u?l?s +?u?l?u?u?l?u?u?d +?u?l?u?u?l?u?u?l +?u?l?u?u?l?u?u?u +?u?l?u?u?l?u?u?s +?u?l?u?u?l?u?s?l +?u?l?u?u?l?u?s?u +?u?l?u?u?l?u?s?s +?u?l?u?u?l?s?l?l +?u?l?u?u?l?s?l?u +?u?l?u?u?l?s?l?s +?u?l?u?u?l?s?u?l +?u?l?u?u?l?s?u?u +?u?l?u?u?l?s?u?s +?u?l?u?u?l?s?s?l +?u?l?u?u?l?s?s?u +?u?l?u?u?l?s?s?s +?u?l?u?u?u?d?d?d +?u?l?u?u?u?d?d?l +?u?l?u?u?u?d?d?u +?u?l?u?u?u?d?l?d +?u?l?u?u?u?d?l?l +?u?l?u?u?u?d?l?u +?u?l?u?u?u?d?u?d +?u?l?u?u?u?d?u?l +?u?l?u?u?u?d?u?u +?u?l?u?u?u?l?d?d +?u?l?u?u?u?l?d?l +?u?l?u?u?u?l?d?u +?u?l?u?u?u?l?l?d +?u?l?u?u?u?l?l?l +?u?l?u?u?u?l?l?u +?u?l?u?u?u?l?l?s +?u?l?u?u?u?l?u?d +?u?l?u?u?u?l?u?l +?u?l?u?u?u?l?u?u +?u?l?u?u?u?l?u?s +?u?l?u?u?u?l?s?l +?u?l?u?u?u?l?s?u +?u?l?u?u?u?l?s?s +?u?l?u?u?u?u?d?d +?u?l?u?u?u?u?d?l +?u?l?u?u?u?u?d?u +?u?l?u?u?u?u?l?d +?u?l?u?u?u?u?l?l +?u?l?u?u?u?u?l?u +?u?l?u?u?u?u?l?s +?u?l?u?u?u?u?u?d +?u?l?u?u?u?u?u?l +?u?l?u?u?u?u?u?u +?u?l?u?u?u?u?u?s +?u?l?u?u?u?u?s?l +?u?l?u?u?u?u?s?u +?u?l?u?u?u?u?s?s +?u?l?u?u?u?s?l?l +?u?l?u?u?u?s?l?u +?u?l?u?u?u?s?l?s +?u?l?u?u?u?s?u?l +?u?l?u?u?u?s?u?u +?u?l?u?u?u?s?u?s +?u?l?u?u?u?s?s?l +?u?l?u?u?u?s?s?u +?u?l?u?u?u?s?s?s +?u?l?u?u?s?l?l?l +?u?l?u?u?s?l?l?u +?u?l?u?u?s?l?l?s +?u?l?u?u?s?l?u?l +?u?l?u?u?s?l?u?u +?u?l?u?u?s?l?u?s +?u?l?u?u?s?l?s?l +?u?l?u?u?s?l?s?u +?u?l?u?u?s?l?s?s +?u?l?u?u?s?u?l?l +?u?l?u?u?s?u?l?u +?u?l?u?u?s?u?l?s +?u?l?u?u?s?u?u?l +?u?l?u?u?s?u?u?u +?u?l?u?u?s?u?u?s +?u?l?u?u?s?u?s?l +?u?l?u?u?s?u?s?u +?u?l?u?u?s?u?s?s +?u?l?u?u?s?s?l?l +?u?l?u?u?s?s?l?u +?u?l?u?u?s?s?l?s +?u?l?u?u?s?s?u?l +?u?l?u?u?s?s?u?u +?u?l?u?u?s?s?u?s +?u?l?u?u?s?s?s?l +?u?l?u?u?s?s?s?u +?u?l?u?u?s?s?s?s +?u?l?u?s?l?l?l?l +?u?l?u?s?l?l?l?u +?u?l?u?s?l?l?l?s +?u?l?u?s?l?l?u?l +?u?l?u?s?l?l?u?u +?u?l?u?s?l?l?u?s +?u?l?u?s?l?l?s?l +?u?l?u?s?l?l?s?u +?u?l?u?s?l?l?s?s +?u?l?u?s?l?u?l?l +?u?l?u?s?l?u?l?u +?u?l?u?s?l?u?l?s +?u?l?u?s?l?u?u?l +?u?l?u?s?l?u?u?u +?u?l?u?s?l?u?u?s +?u?l?u?s?l?u?s?l +?u?l?u?s?l?u?s?u +?u?l?u?s?l?u?s?s +?u?l?u?s?l?s?l?l +?u?l?u?s?l?s?l?u +?u?l?u?s?l?s?l?s +?u?l?u?s?l?s?u?l +?u?l?u?s?l?s?u?u +?u?l?u?s?l?s?u?s +?u?l?u?s?l?s?s?l +?u?l?u?s?l?s?s?u +?u?l?u?s?l?s?s?s +?u?l?u?s?u?l?l?l +?u?l?u?s?u?l?l?u +?u?l?u?s?u?l?l?s +?u?l?u?s?u?l?u?l +?u?l?u?s?u?l?u?u +?u?l?u?s?u?l?u?s +?u?l?u?s?u?l?s?l +?u?l?u?s?u?l?s?u +?u?l?u?s?u?l?s?s +?u?l?u?s?u?u?l?l +?u?l?u?s?u?u?l?u +?u?l?u?s?u?u?l?s +?u?l?u?s?u?u?u?l +?u?l?u?s?u?u?u?u +?u?l?u?s?u?u?u?s +?u?l?u?s?u?u?s?l +?u?l?u?s?u?u?s?u +?u?l?u?s?u?u?s?s +?u?l?u?s?u?s?l?l +?u?l?u?s?u?s?l?u +?u?l?u?s?u?s?l?s +?u?l?u?s?u?s?u?l +?u?l?u?s?u?s?u?u +?u?l?u?s?u?s?u?s +?u?l?u?s?u?s?s?l +?u?l?u?s?u?s?s?u +?u?l?u?s?u?s?s?s +?u?l?u?s?s?l?l?l +?u?l?u?s?s?l?l?u +?u?l?u?s?s?l?l?s +?u?l?u?s?s?l?u?l +?u?l?u?s?s?l?u?u +?u?l?u?s?s?l?u?s +?u?l?u?s?s?l?s?l +?u?l?u?s?s?l?s?u +?u?l?u?s?s?l?s?s +?u?l?u?s?s?u?l?l +?u?l?u?s?s?u?l?u +?u?l?u?s?s?u?l?s +?u?l?u?s?s?u?u?l +?u?l?u?s?s?u?u?u +?u?l?u?s?s?u?u?s +?u?l?u?s?s?u?s?l +?u?l?u?s?s?u?s?u +?u?l?u?s?s?u?s?s +?u?l?u?s?s?s?l?l +?u?l?u?s?s?s?l?u +?u?l?u?s?s?s?l?s +?u?l?u?s?s?s?u?l +?u?l?u?s?s?s?u?u +?u?l?u?s?s?s?u?s +?u?l?u?s?s?s?s?l +?u?l?u?s?s?s?s?u +?u?l?u?s?s?s?s?s +?u?l?s?l?l?l?l?l +?u?l?s?l?l?l?l?u +?u?l?s?l?l?l?l?s +?u?l?s?l?l?l?u?l +?u?l?s?l?l?l?u?u +?u?l?s?l?l?l?u?s +?u?l?s?l?l?l?s?l +?u?l?s?l?l?l?s?u +?u?l?s?l?l?l?s?s +?u?l?s?l?l?u?l?l +?u?l?s?l?l?u?l?u +?u?l?s?l?l?u?l?s +?u?l?s?l?l?u?u?l +?u?l?s?l?l?u?u?u +?u?l?s?l?l?u?u?s +?u?l?s?l?l?u?s?l +?u?l?s?l?l?u?s?u +?u?l?s?l?l?u?s?s +?u?l?s?l?l?s?l?l +?u?l?s?l?l?s?l?u +?u?l?s?l?l?s?l?s +?u?l?s?l?l?s?u?l +?u?l?s?l?l?s?u?u +?u?l?s?l?l?s?u?s +?u?l?s?l?l?s?s?l +?u?l?s?l?l?s?s?u +?u?l?s?l?l?s?s?s +?u?l?s?l?u?l?l?l +?u?l?s?l?u?l?l?u +?u?l?s?l?u?l?l?s +?u?l?s?l?u?l?u?l +?u?l?s?l?u?l?u?u +?u?l?s?l?u?l?u?s +?u?l?s?l?u?l?s?l +?u?l?s?l?u?l?s?u +?u?l?s?l?u?l?s?s +?u?l?s?l?u?u?l?l +?u?l?s?l?u?u?l?u +?u?l?s?l?u?u?l?s +?u?l?s?l?u?u?u?l +?u?l?s?l?u?u?u?u +?u?l?s?l?u?u?u?s +?u?l?s?l?u?u?s?l +?u?l?s?l?u?u?s?u +?u?l?s?l?u?u?s?s +?u?l?s?l?u?s?l?l +?u?l?s?l?u?s?l?u +?u?l?s?l?u?s?l?s +?u?l?s?l?u?s?u?l +?u?l?s?l?u?s?u?u +?u?l?s?l?u?s?u?s +?u?l?s?l?u?s?s?l +?u?l?s?l?u?s?s?u +?u?l?s?l?u?s?s?s +?u?l?s?l?s?l?l?l +?u?l?s?l?s?l?l?u +?u?l?s?l?s?l?l?s +?u?l?s?l?s?l?u?l +?u?l?s?l?s?l?u?u +?u?l?s?l?s?l?u?s +?u?l?s?l?s?l?s?l +?u?l?s?l?s?l?s?u +?u?l?s?l?s?l?s?s +?u?l?s?l?s?u?l?l +?u?l?s?l?s?u?l?u +?u?l?s?l?s?u?l?s +?u?l?s?l?s?u?u?l +?u?l?s?l?s?u?u?u +?u?l?s?l?s?u?u?s +?u?l?s?l?s?u?s?l +?u?l?s?l?s?u?s?u +?u?l?s?l?s?u?s?s +?u?l?s?l?s?s?l?l +?u?l?s?l?s?s?l?u +?u?l?s?l?s?s?l?s +?u?l?s?l?s?s?u?l +?u?l?s?l?s?s?u?u +?u?l?s?l?s?s?u?s +?u?l?s?l?s?s?s?l +?u?l?s?l?s?s?s?u +?u?l?s?l?s?s?s?s +?u?l?s?u?l?l?l?l +?u?l?s?u?l?l?l?u +?u?l?s?u?l?l?l?s +?u?l?s?u?l?l?u?l +?u?l?s?u?l?l?u?u +?u?l?s?u?l?l?u?s +?u?l?s?u?l?l?s?l +?u?l?s?u?l?l?s?u +?u?l?s?u?l?l?s?s +?u?l?s?u?l?u?l?l +?u?l?s?u?l?u?l?u +?u?l?s?u?l?u?l?s +?u?l?s?u?l?u?u?l +?u?l?s?u?l?u?u?u +?u?l?s?u?l?u?u?s +?u?l?s?u?l?u?s?l +?u?l?s?u?l?u?s?u +?u?l?s?u?l?u?s?s +?u?l?s?u?l?s?l?l +?u?l?s?u?l?s?l?u +?u?l?s?u?l?s?l?s +?u?l?s?u?l?s?u?l +?u?l?s?u?l?s?u?u +?u?l?s?u?l?s?u?s +?u?l?s?u?l?s?s?l +?u?l?s?u?l?s?s?u +?u?l?s?u?l?s?s?s +?u?l?s?u?u?l?l?l +?u?l?s?u?u?l?l?u +?u?l?s?u?u?l?l?s +?u?l?s?u?u?l?u?l +?u?l?s?u?u?l?u?u +?u?l?s?u?u?l?u?s +?u?l?s?u?u?l?s?l +?u?l?s?u?u?l?s?u +?u?l?s?u?u?l?s?s +?u?l?s?u?u?u?l?l +?u?l?s?u?u?u?l?u +?u?l?s?u?u?u?l?s +?u?l?s?u?u?u?u?l +?u?l?s?u?u?u?u?u +?u?l?s?u?u?u?u?s +?u?l?s?u?u?u?s?l +?u?l?s?u?u?u?s?u +?u?l?s?u?u?u?s?s +?u?l?s?u?u?s?l?l +?u?l?s?u?u?s?l?u +?u?l?s?u?u?s?l?s +?u?l?s?u?u?s?u?l +?u?l?s?u?u?s?u?u +?u?l?s?u?u?s?u?s +?u?l?s?u?u?s?s?l +?u?l?s?u?u?s?s?u +?u?l?s?u?u?s?s?s +?u?l?s?u?s?l?l?l +?u?l?s?u?s?l?l?u +?u?l?s?u?s?l?l?s +?u?l?s?u?s?l?u?l +?u?l?s?u?s?l?u?u +?u?l?s?u?s?l?u?s +?u?l?s?u?s?l?s?l +?u?l?s?u?s?l?s?u +?u?l?s?u?s?l?s?s +?u?l?s?u?s?u?l?l +?u?l?s?u?s?u?l?u +?u?l?s?u?s?u?l?s +?u?l?s?u?s?u?u?l +?u?l?s?u?s?u?u?u +?u?l?s?u?s?u?u?s +?u?l?s?u?s?u?s?l +?u?l?s?u?s?u?s?u +?u?l?s?u?s?u?s?s +?u?l?s?u?s?s?l?l +?u?l?s?u?s?s?l?u +?u?l?s?u?s?s?l?s +?u?l?s?u?s?s?u?l +?u?l?s?u?s?s?u?u +?u?l?s?u?s?s?u?s +?u?l?s?u?s?s?s?l +?u?l?s?u?s?s?s?u +?u?l?s?u?s?s?s?s +?u?l?s?s?l?l?l?l +?u?l?s?s?l?l?l?u +?u?l?s?s?l?l?l?s +?u?l?s?s?l?l?u?l +?u?l?s?s?l?l?u?u +?u?l?s?s?l?l?u?s +?u?l?s?s?l?l?s?l +?u?l?s?s?l?l?s?u +?u?l?s?s?l?l?s?s +?u?l?s?s?l?u?l?l +?u?l?s?s?l?u?l?u +?u?l?s?s?l?u?l?s +?u?l?s?s?l?u?u?l +?u?l?s?s?l?u?u?u +?u?l?s?s?l?u?u?s +?u?l?s?s?l?u?s?l +?u?l?s?s?l?u?s?u +?u?l?s?s?l?u?s?s +?u?l?s?s?l?s?l?l +?u?l?s?s?l?s?l?u +?u?l?s?s?l?s?l?s +?u?l?s?s?l?s?u?l +?u?l?s?s?l?s?u?u +?u?l?s?s?l?s?u?s +?u?l?s?s?l?s?s?l +?u?l?s?s?l?s?s?u +?u?l?s?s?l?s?s?s +?u?l?s?s?u?l?l?l +?u?l?s?s?u?l?l?u +?u?l?s?s?u?l?l?s +?u?l?s?s?u?l?u?l +?u?l?s?s?u?l?u?u +?u?l?s?s?u?l?u?s +?u?l?s?s?u?l?s?l +?u?l?s?s?u?l?s?u +?u?l?s?s?u?l?s?s +?u?l?s?s?u?u?l?l +?u?l?s?s?u?u?l?u +?u?l?s?s?u?u?l?s +?u?l?s?s?u?u?u?l +?u?l?s?s?u?u?u?u +?u?l?s?s?u?u?u?s +?u?l?s?s?u?u?s?l +?u?l?s?s?u?u?s?u +?u?l?s?s?u?u?s?s +?u?l?s?s?u?s?l?l +?u?l?s?s?u?s?l?u +?u?l?s?s?u?s?l?s +?u?l?s?s?u?s?u?l +?u?l?s?s?u?s?u?u +?u?l?s?s?u?s?u?s +?u?l?s?s?u?s?s?l +?u?l?s?s?u?s?s?u +?u?l?s?s?u?s?s?s +?u?l?s?s?s?l?l?l +?u?l?s?s?s?l?l?u +?u?l?s?s?s?l?l?s +?u?l?s?s?s?l?u?l +?u?l?s?s?s?l?u?u +?u?l?s?s?s?l?u?s +?u?l?s?s?s?l?s?l +?u?l?s?s?s?l?s?u +?u?l?s?s?s?l?s?s +?u?l?s?s?s?u?l?l +?u?l?s?s?s?u?l?u +?u?l?s?s?s?u?l?s +?u?l?s?s?s?u?u?l +?u?l?s?s?s?u?u?u +?u?l?s?s?s?u?u?s +?u?l?s?s?s?u?s?l +?u?l?s?s?s?u?s?u +?u?l?s?s?s?u?s?s +?u?l?s?s?s?s?l?l +?u?l?s?s?s?s?l?u +?u?l?s?s?s?s?l?s +?u?l?s?s?s?s?u?l +?u?l?s?s?s?s?u?u +?u?l?s?s?s?s?u?s +?u?l?s?s?s?s?s?l +?u?l?s?s?s?s?s?u +?u?l?s?s?s?s?s?s +?u?u?d?d?d?d?d?d +?u?u?d?d?d?d?d?l +?u?u?d?d?d?d?d?u +?u?u?d?d?d?d?d?s +?u?u?d?d?d?d?l?d +?u?u?d?d?d?d?l?l +?u?u?d?d?d?d?l?u +?u?u?d?d?d?d?u?d +?u?u?d?d?d?d?u?l +?u?u?d?d?d?d?u?u +?u?u?d?d?d?d?u?s +?u?u?d?d?d?d?s?d +?u?u?d?d?d?d?s?u +?u?u?d?d?d?d?s?s +?u?u?d?d?d?l?d?d +?u?u?d?d?d?l?d?l +?u?u?d?d?d?l?d?u +?u?u?d?d?d?l?l?d +?u?u?d?d?d?l?l?l +?u?u?d?d?d?l?l?u +?u?u?d?d?d?l?u?d +?u?u?d?d?d?l?u?l +?u?u?d?d?d?l?u?u +?u?u?d?d?d?u?d?d +?u?u?d?d?d?u?d?l +?u?u?d?d?d?u?d?u +?u?u?d?d?d?u?d?s +?u?u?d?d?d?u?l?d +?u?u?d?d?d?u?l?l +?u?u?d?d?d?u?l?u +?u?u?d?d?d?u?u?d +?u?u?d?d?d?u?u?l +?u?u?d?d?d?u?u?u +?u?u?d?d?d?u?u?s +?u?u?d?d?d?u?s?d +?u?u?d?d?d?u?s?u +?u?u?d?d?d?u?s?s +?u?u?d?d?d?s?d?d +?u?u?d?d?d?s?d?u +?u?u?d?d?d?s?d?s +?u?u?d?d?d?s?u?d +?u?u?d?d?d?s?u?u +?u?u?d?d?d?s?u?s +?u?u?d?d?d?s?s?d +?u?u?d?d?d?s?s?u +?u?u?d?d?d?s?s?s +?u?u?d?d?l?d?d?d +?u?u?d?d?l?d?d?l +?u?u?d?d?l?d?d?u +?u?u?d?d?l?d?l?d +?u?u?d?d?l?d?l?l +?u?u?d?d?l?d?l?u +?u?u?d?d?l?d?u?d +?u?u?d?d?l?d?u?l +?u?u?d?d?l?d?u?u +?u?u?d?d?l?l?d?d +?u?u?d?d?l?l?d?l +?u?u?d?d?l?l?d?u +?u?u?d?d?l?l?l?d +?u?u?d?d?l?l?l?l +?u?u?d?d?l?l?l?u +?u?u?d?d?l?l?u?d +?u?u?d?d?l?l?u?l +?u?u?d?d?l?l?u?u +?u?u?d?d?l?u?d?d +?u?u?d?d?l?u?d?l +?u?u?d?d?l?u?d?u +?u?u?d?d?l?u?l?d +?u?u?d?d?l?u?l?l +?u?u?d?d?l?u?l?u +?u?u?d?d?l?u?u?d +?u?u?d?d?l?u?u?l +?u?u?d?d?l?u?u?u +?u?u?d?d?u?d?d?d +?u?u?d?d?u?d?d?l +?u?u?d?d?u?d?d?u +?u?u?d?d?u?d?d?s +?u?u?d?d?u?d?l?d +?u?u?d?d?u?d?l?l +?u?u?d?d?u?d?l?u +?u?u?d?d?u?d?u?d +?u?u?d?d?u?d?u?l +?u?u?d?d?u?d?u?u +?u?u?d?d?u?d?u?s +?u?u?d?d?u?d?s?d +?u?u?d?d?u?d?s?u +?u?u?d?d?u?d?s?s +?u?u?d?d?u?l?d?d +?u?u?d?d?u?l?d?l +?u?u?d?d?u?l?d?u +?u?u?d?d?u?l?l?d +?u?u?d?d?u?l?l?l +?u?u?d?d?u?l?l?u +?u?u?d?d?u?l?u?d +?u?u?d?d?u?l?u?l +?u?u?d?d?u?l?u?u +?u?u?d?d?u?u?d?d +?u?u?d?d?u?u?d?l +?u?u?d?d?u?u?d?u +?u?u?d?d?u?u?d?s +?u?u?d?d?u?u?l?d +?u?u?d?d?u?u?l?l +?u?u?d?d?u?u?l?u +?u?u?d?d?u?u?u?d +?u?u?d?d?u?u?u?l +?u?u?d?d?u?u?u?u +?u?u?d?d?u?u?u?s +?u?u?d?d?u?u?s?d +?u?u?d?d?u?u?s?u +?u?u?d?d?u?u?s?s +?u?u?d?d?u?s?d?d +?u?u?d?d?u?s?d?u +?u?u?d?d?u?s?d?s +?u?u?d?d?u?s?u?d +?u?u?d?d?u?s?u?u +?u?u?d?d?u?s?u?s +?u?u?d?d?u?s?s?d +?u?u?d?d?u?s?s?u +?u?u?d?d?u?s?s?s +?u?u?d?d?s?d?d?d +?u?u?d?d?s?d?d?u +?u?u?d?d?s?d?d?s +?u?u?d?d?s?d?u?d +?u?u?d?d?s?d?u?u +?u?u?d?d?s?d?u?s +?u?u?d?d?s?d?s?d +?u?u?d?d?s?d?s?u +?u?u?d?d?s?d?s?s +?u?u?d?d?s?u?d?d +?u?u?d?d?s?u?d?u +?u?u?d?d?s?u?d?s +?u?u?d?d?s?u?u?d +?u?u?d?d?s?u?u?u +?u?u?d?d?s?u?u?s +?u?u?d?d?s?u?s?d +?u?u?d?d?s?u?s?u +?u?u?d?d?s?u?s?s +?u?u?d?d?s?s?d?d +?u?u?d?d?s?s?d?u +?u?u?d?d?s?s?d?s +?u?u?d?d?s?s?u?d +?u?u?d?d?s?s?u?u +?u?u?d?d?s?s?u?s +?u?u?d?d?s?s?s?d +?u?u?d?d?s?s?s?u +?u?u?d?d?s?s?s?s +?u?u?d?l?d?d?d?d +?u?u?d?l?d?d?d?l +?u?u?d?l?d?d?d?u +?u?u?d?l?d?d?l?d +?u?u?d?l?d?d?l?l +?u?u?d?l?d?d?l?u +?u?u?d?l?d?d?u?d +?u?u?d?l?d?d?u?l +?u?u?d?l?d?d?u?u +?u?u?d?l?d?l?d?d +?u?u?d?l?d?l?d?l +?u?u?d?l?d?l?d?u +?u?u?d?l?d?l?l?d +?u?u?d?l?d?l?l?l +?u?u?d?l?d?l?l?u +?u?u?d?l?d?l?u?d +?u?u?d?l?d?l?u?l +?u?u?d?l?d?l?u?u +?u?u?d?l?d?u?d?d +?u?u?d?l?d?u?d?l +?u?u?d?l?d?u?d?u +?u?u?d?l?d?u?l?d +?u?u?d?l?d?u?l?l +?u?u?d?l?d?u?l?u +?u?u?d?l?d?u?u?d +?u?u?d?l?d?u?u?l +?u?u?d?l?d?u?u?u +?u?u?d?l?l?d?d?d +?u?u?d?l?l?d?d?l +?u?u?d?l?l?d?d?u +?u?u?d?l?l?d?l?d +?u?u?d?l?l?d?l?l +?u?u?d?l?l?d?l?u +?u?u?d?l?l?d?u?d +?u?u?d?l?l?d?u?l +?u?u?d?l?l?d?u?u +?u?u?d?l?l?l?d?d +?u?u?d?l?l?l?d?l +?u?u?d?l?l?l?d?u +?u?u?d?l?l?l?l?d +?u?u?d?l?l?l?l?l +?u?u?d?l?l?l?l?u +?u?u?d?l?l?l?u?d +?u?u?d?l?l?l?u?l +?u?u?d?l?l?l?u?u +?u?u?d?l?l?u?d?d +?u?u?d?l?l?u?d?l +?u?u?d?l?l?u?d?u +?u?u?d?l?l?u?l?d +?u?u?d?l?l?u?l?l +?u?u?d?l?l?u?l?u +?u?u?d?l?l?u?u?d +?u?u?d?l?l?u?u?l +?u?u?d?l?l?u?u?u +?u?u?d?l?u?d?d?d +?u?u?d?l?u?d?d?l +?u?u?d?l?u?d?d?u +?u?u?d?l?u?d?l?d +?u?u?d?l?u?d?l?l +?u?u?d?l?u?d?l?u +?u?u?d?l?u?d?u?d +?u?u?d?l?u?d?u?l +?u?u?d?l?u?d?u?u +?u?u?d?l?u?l?d?d +?u?u?d?l?u?l?d?l +?u?u?d?l?u?l?d?u +?u?u?d?l?u?l?l?d +?u?u?d?l?u?l?l?l +?u?u?d?l?u?l?l?u +?u?u?d?l?u?l?u?d +?u?u?d?l?u?l?u?l +?u?u?d?l?u?l?u?u +?u?u?d?l?u?u?d?d +?u?u?d?l?u?u?d?l +?u?u?d?l?u?u?d?u +?u?u?d?l?u?u?l?d +?u?u?d?l?u?u?l?l +?u?u?d?l?u?u?l?u +?u?u?d?l?u?u?u?d +?u?u?d?l?u?u?u?l +?u?u?d?l?u?u?u?u +?u?u?d?u?d?d?d?d +?u?u?d?u?d?d?d?l +?u?u?d?u?d?d?d?u +?u?u?d?u?d?d?d?s +?u?u?d?u?d?d?l?d +?u?u?d?u?d?d?l?l +?u?u?d?u?d?d?l?u +?u?u?d?u?d?d?u?d +?u?u?d?u?d?d?u?l +?u?u?d?u?d?d?u?u +?u?u?d?u?d?d?u?s +?u?u?d?u?d?d?s?d +?u?u?d?u?d?d?s?u +?u?u?d?u?d?d?s?s +?u?u?d?u?d?l?d?d +?u?u?d?u?d?l?d?l +?u?u?d?u?d?l?d?u +?u?u?d?u?d?l?l?d +?u?u?d?u?d?l?l?l +?u?u?d?u?d?l?l?u +?u?u?d?u?d?l?u?d +?u?u?d?u?d?l?u?l +?u?u?d?u?d?l?u?u +?u?u?d?u?d?u?d?d +?u?u?d?u?d?u?d?l +?u?u?d?u?d?u?d?u +?u?u?d?u?d?u?d?s +?u?u?d?u?d?u?l?d +?u?u?d?u?d?u?l?l +?u?u?d?u?d?u?l?u +?u?u?d?u?d?u?u?d +?u?u?d?u?d?u?u?l +?u?u?d?u?d?u?u?u +?u?u?d?u?d?u?u?s +?u?u?d?u?d?u?s?d +?u?u?d?u?d?u?s?u +?u?u?d?u?d?u?s?s +?u?u?d?u?d?s?d?d +?u?u?d?u?d?s?d?u +?u?u?d?u?d?s?d?s +?u?u?d?u?d?s?u?d +?u?u?d?u?d?s?u?u +?u?u?d?u?d?s?u?s +?u?u?d?u?d?s?s?d +?u?u?d?u?d?s?s?u +?u?u?d?u?d?s?s?s +?u?u?d?u?l?d?d?d +?u?u?d?u?l?d?d?l +?u?u?d?u?l?d?d?u +?u?u?d?u?l?d?l?d +?u?u?d?u?l?d?l?l +?u?u?d?u?l?d?l?u +?u?u?d?u?l?d?u?d +?u?u?d?u?l?d?u?l +?u?u?d?u?l?d?u?u +?u?u?d?u?l?l?d?d +?u?u?d?u?l?l?d?l +?u?u?d?u?l?l?d?u +?u?u?d?u?l?l?l?d +?u?u?d?u?l?l?l?l +?u?u?d?u?l?l?l?u +?u?u?d?u?l?l?u?d +?u?u?d?u?l?l?u?l +?u?u?d?u?l?l?u?u +?u?u?d?u?l?u?d?d +?u?u?d?u?l?u?d?l +?u?u?d?u?l?u?d?u +?u?u?d?u?l?u?l?d +?u?u?d?u?l?u?l?l +?u?u?d?u?l?u?l?u +?u?u?d?u?l?u?u?d +?u?u?d?u?l?u?u?l +?u?u?d?u?l?u?u?u +?u?u?d?u?u?d?d?d +?u?u?d?u?u?d?d?l +?u?u?d?u?u?d?d?u +?u?u?d?u?u?d?d?s +?u?u?d?u?u?d?l?d +?u?u?d?u?u?d?l?l +?u?u?d?u?u?d?l?u +?u?u?d?u?u?d?u?d +?u?u?d?u?u?d?u?l +?u?u?d?u?u?d?u?u +?u?u?d?u?u?d?u?s +?u?u?d?u?u?d?s?d +?u?u?d?u?u?d?s?u +?u?u?d?u?u?d?s?s +?u?u?d?u?u?l?d?d +?u?u?d?u?u?l?d?l +?u?u?d?u?u?l?d?u +?u?u?d?u?u?l?l?d +?u?u?d?u?u?l?l?l +?u?u?d?u?u?l?l?u +?u?u?d?u?u?l?u?d +?u?u?d?u?u?l?u?l +?u?u?d?u?u?l?u?u +?u?u?d?u?u?u?d?d +?u?u?d?u?u?u?d?l +?u?u?d?u?u?u?d?u +?u?u?d?u?u?u?d?s +?u?u?d?u?u?u?l?d +?u?u?d?u?u?u?l?l +?u?u?d?u?u?u?l?u +?u?u?d?u?u?u?u?d +?u?u?d?u?u?u?u?l +?u?u?d?u?u?u?u?u +?u?u?d?u?u?u?u?s +?u?u?d?u?u?u?s?d +?u?u?d?u?u?u?s?u +?u?u?d?u?u?u?s?s +?u?u?d?u?u?s?d?d +?u?u?d?u?u?s?d?u +?u?u?d?u?u?s?d?s +?u?u?d?u?u?s?u?d +?u?u?d?u?u?s?u?u +?u?u?d?u?u?s?u?s +?u?u?d?u?u?s?s?d +?u?u?d?u?u?s?s?u +?u?u?d?u?u?s?s?s +?u?u?d?u?s?d?d?d +?u?u?d?u?s?d?d?u +?u?u?d?u?s?d?d?s +?u?u?d?u?s?d?u?d +?u?u?d?u?s?d?u?u +?u?u?d?u?s?d?u?s +?u?u?d?u?s?d?s?d +?u?u?d?u?s?d?s?u +?u?u?d?u?s?d?s?s +?u?u?d?u?s?u?d?d +?u?u?d?u?s?u?d?u +?u?u?d?u?s?u?d?s +?u?u?d?u?s?u?u?d +?u?u?d?u?s?u?u?u +?u?u?d?u?s?u?u?s +?u?u?d?u?s?u?s?d +?u?u?d?u?s?u?s?u +?u?u?d?u?s?u?s?s +?u?u?d?u?s?s?d?d +?u?u?d?u?s?s?d?u +?u?u?d?u?s?s?d?s +?u?u?d?u?s?s?u?d +?u?u?d?u?s?s?u?u +?u?u?d?u?s?s?u?s +?u?u?d?u?s?s?s?d +?u?u?d?u?s?s?s?u +?u?u?d?u?s?s?s?s +?u?u?d?s?d?d?d?d +?u?u?d?s?d?d?d?u +?u?u?d?s?d?d?d?s +?u?u?d?s?d?d?u?d +?u?u?d?s?d?d?u?u +?u?u?d?s?d?d?u?s +?u?u?d?s?d?d?s?d +?u?u?d?s?d?d?s?u +?u?u?d?s?d?d?s?s +?u?u?d?s?d?u?d?d +?u?u?d?s?d?u?d?u +?u?u?d?s?d?u?d?s +?u?u?d?s?d?u?u?d +?u?u?d?s?d?u?u?u +?u?u?d?s?d?u?u?s +?u?u?d?s?d?u?s?d +?u?u?d?s?d?u?s?u +?u?u?d?s?d?u?s?s +?u?u?d?s?d?s?d?d +?u?u?d?s?d?s?d?u +?u?u?d?s?d?s?d?s +?u?u?d?s?d?s?u?d +?u?u?d?s?d?s?u?u +?u?u?d?s?d?s?u?s +?u?u?d?s?d?s?s?d +?u?u?d?s?d?s?s?u +?u?u?d?s?d?s?s?s +?u?u?d?s?u?d?d?d +?u?u?d?s?u?d?d?u +?u?u?d?s?u?d?d?s +?u?u?d?s?u?d?u?d +?u?u?d?s?u?d?u?u +?u?u?d?s?u?d?u?s +?u?u?d?s?u?d?s?d +?u?u?d?s?u?d?s?u +?u?u?d?s?u?d?s?s +?u?u?d?s?u?u?d?d +?u?u?d?s?u?u?d?u +?u?u?d?s?u?u?d?s +?u?u?d?s?u?u?u?d +?u?u?d?s?u?u?u?u +?u?u?d?s?u?u?u?s +?u?u?d?s?u?u?s?d +?u?u?d?s?u?u?s?u +?u?u?d?s?u?u?s?s +?u?u?d?s?u?s?d?d +?u?u?d?s?u?s?d?u +?u?u?d?s?u?s?d?s +?u?u?d?s?u?s?u?d +?u?u?d?s?u?s?u?u +?u?u?d?s?u?s?u?s +?u?u?d?s?u?s?s?d +?u?u?d?s?u?s?s?u +?u?u?d?s?u?s?s?s +?u?u?d?s?s?d?d?d +?u?u?d?s?s?d?d?u +?u?u?d?s?s?d?d?s +?u?u?d?s?s?d?u?d +?u?u?d?s?s?d?u?u +?u?u?d?s?s?d?u?s +?u?u?d?s?s?d?s?d +?u?u?d?s?s?d?s?u +?u?u?d?s?s?d?s?s +?u?u?d?s?s?u?d?d +?u?u?d?s?s?u?d?u +?u?u?d?s?s?u?d?s +?u?u?d?s?s?u?u?d +?u?u?d?s?s?u?u?u +?u?u?d?s?s?u?u?s +?u?u?d?s?s?u?s?d +?u?u?d?s?s?u?s?u +?u?u?d?s?s?u?s?s +?u?u?d?s?s?s?d?d +?u?u?d?s?s?s?d?u +?u?u?d?s?s?s?d?s +?u?u?d?s?s?s?u?d +?u?u?d?s?s?s?u?u +?u?u?d?s?s?s?u?s +?u?u?d?s?s?s?s?d +?u?u?d?s?s?s?s?u +?u?u?d?s?s?s?s?s +?u?u?l?d?d?d?d?d +?u?u?l?d?d?d?d?l +?u?u?l?d?d?d?d?u +?u?u?l?d?d?d?l?d +?u?u?l?d?d?d?l?l +?u?u?l?d?d?d?l?u +?u?u?l?d?d?d?u?d +?u?u?l?d?d?d?u?l +?u?u?l?d?d?d?u?u +?u?u?l?d?d?l?d?d +?u?u?l?d?d?l?d?l +?u?u?l?d?d?l?d?u +?u?u?l?d?d?l?l?d +?u?u?l?d?d?l?l?l +?u?u?l?d?d?l?l?u +?u?u?l?d?d?l?u?d +?u?u?l?d?d?l?u?l +?u?u?l?d?d?l?u?u +?u?u?l?d?d?u?d?d +?u?u?l?d?d?u?d?l +?u?u?l?d?d?u?d?u +?u?u?l?d?d?u?l?d +?u?u?l?d?d?u?l?l +?u?u?l?d?d?u?l?u +?u?u?l?d?d?u?u?d +?u?u?l?d?d?u?u?l +?u?u?l?d?d?u?u?u +?u?u?l?d?l?d?d?d +?u?u?l?d?l?d?d?l +?u?u?l?d?l?d?d?u +?u?u?l?d?l?d?l?d +?u?u?l?d?l?d?l?l +?u?u?l?d?l?d?l?u +?u?u?l?d?l?d?u?d +?u?u?l?d?l?d?u?l +?u?u?l?d?l?d?u?u +?u?u?l?d?l?l?d?d +?u?u?l?d?l?l?d?l +?u?u?l?d?l?l?d?u +?u?u?l?d?l?l?l?d +?u?u?l?d?l?l?l?l +?u?u?l?d?l?l?l?u +?u?u?l?d?l?l?u?d +?u?u?l?d?l?l?u?l +?u?u?l?d?l?l?u?u +?u?u?l?d?l?u?d?d +?u?u?l?d?l?u?d?l +?u?u?l?d?l?u?d?u +?u?u?l?d?l?u?l?d +?u?u?l?d?l?u?l?l +?u?u?l?d?l?u?l?u +?u?u?l?d?l?u?u?d +?u?u?l?d?l?u?u?l +?u?u?l?d?l?u?u?u +?u?u?l?d?u?d?d?d +?u?u?l?d?u?d?d?l +?u?u?l?d?u?d?d?u +?u?u?l?d?u?d?l?d +?u?u?l?d?u?d?l?l +?u?u?l?d?u?d?l?u +?u?u?l?d?u?d?u?d +?u?u?l?d?u?d?u?l +?u?u?l?d?u?d?u?u +?u?u?l?d?u?l?d?d +?u?u?l?d?u?l?d?l +?u?u?l?d?u?l?d?u +?u?u?l?d?u?l?l?d +?u?u?l?d?u?l?l?l +?u?u?l?d?u?l?l?u +?u?u?l?d?u?l?u?d +?u?u?l?d?u?l?u?l +?u?u?l?d?u?l?u?u +?u?u?l?d?u?u?d?d +?u?u?l?d?u?u?d?l +?u?u?l?d?u?u?d?u +?u?u?l?d?u?u?l?d +?u?u?l?d?u?u?l?l +?u?u?l?d?u?u?l?u +?u?u?l?d?u?u?u?d +?u?u?l?d?u?u?u?l +?u?u?l?d?u?u?u?u +?u?u?l?l?d?d?d?d +?u?u?l?l?d?d?d?l +?u?u?l?l?d?d?d?u +?u?u?l?l?d?d?l?d +?u?u?l?l?d?d?l?l +?u?u?l?l?d?d?l?u +?u?u?l?l?d?d?u?d +?u?u?l?l?d?d?u?l +?u?u?l?l?d?d?u?u +?u?u?l?l?d?l?d?d +?u?u?l?l?d?l?d?l +?u?u?l?l?d?l?d?u +?u?u?l?l?d?l?l?d +?u?u?l?l?d?l?l?l +?u?u?l?l?d?l?l?u +?u?u?l?l?d?l?u?d +?u?u?l?l?d?l?u?l +?u?u?l?l?d?l?u?u +?u?u?l?l?d?u?d?d +?u?u?l?l?d?u?d?l +?u?u?l?l?d?u?d?u +?u?u?l?l?d?u?l?d +?u?u?l?l?d?u?l?l +?u?u?l?l?d?u?l?u +?u?u?l?l?d?u?u?d +?u?u?l?l?d?u?u?l +?u?u?l?l?d?u?u?u +?u?u?l?l?l?d?d?d +?u?u?l?l?l?d?d?l +?u?u?l?l?l?d?d?u +?u?u?l?l?l?d?l?d +?u?u?l?l?l?d?l?l +?u?u?l?l?l?d?l?u +?u?u?l?l?l?d?u?d +?u?u?l?l?l?d?u?l +?u?u?l?l?l?d?u?u +?u?u?l?l?l?l?d?d +?u?u?l?l?l?l?d?l +?u?u?l?l?l?l?d?u +?u?u?l?l?l?l?l?d +?u?u?l?l?l?l?l?l +?u?u?l?l?l?l?l?u +?u?u?l?l?l?l?l?s +?u?u?l?l?l?l?u?d +?u?u?l?l?l?l?u?l +?u?u?l?l?l?l?u?u +?u?u?l?l?l?l?u?s +?u?u?l?l?l?l?s?l +?u?u?l?l?l?l?s?u +?u?u?l?l?l?l?s?s +?u?u?l?l?l?u?d?d +?u?u?l?l?l?u?d?l +?u?u?l?l?l?u?d?u +?u?u?l?l?l?u?l?d +?u?u?l?l?l?u?l?l +?u?u?l?l?l?u?l?u +?u?u?l?l?l?u?l?s +?u?u?l?l?l?u?u?d +?u?u?l?l?l?u?u?l +?u?u?l?l?l?u?u?u +?u?u?l?l?l?u?u?s +?u?u?l?l?l?u?s?l +?u?u?l?l?l?u?s?u +?u?u?l?l?l?u?s?s +?u?u?l?l?l?s?l?l +?u?u?l?l?l?s?l?u +?u?u?l?l?l?s?l?s +?u?u?l?l?l?s?u?l +?u?u?l?l?l?s?u?u +?u?u?l?l?l?s?u?s +?u?u?l?l?l?s?s?l +?u?u?l?l?l?s?s?u +?u?u?l?l?l?s?s?s +?u?u?l?l?u?d?d?d +?u?u?l?l?u?d?d?l +?u?u?l?l?u?d?d?u +?u?u?l?l?u?d?l?d +?u?u?l?l?u?d?l?l +?u?u?l?l?u?d?l?u +?u?u?l?l?u?d?u?d +?u?u?l?l?u?d?u?l +?u?u?l?l?u?d?u?u +?u?u?l?l?u?l?d?d +?u?u?l?l?u?l?d?l +?u?u?l?l?u?l?d?u +?u?u?l?l?u?l?l?d +?u?u?l?l?u?l?l?l +?u?u?l?l?u?l?l?u +?u?u?l?l?u?l?l?s +?u?u?l?l?u?l?u?d +?u?u?l?l?u?l?u?l +?u?u?l?l?u?l?u?u +?u?u?l?l?u?l?u?s +?u?u?l?l?u?l?s?l +?u?u?l?l?u?l?s?u +?u?u?l?l?u?l?s?s +?u?u?l?l?u?u?d?d +?u?u?l?l?u?u?d?l +?u?u?l?l?u?u?d?u +?u?u?l?l?u?u?l?d +?u?u?l?l?u?u?l?l +?u?u?l?l?u?u?l?u +?u?u?l?l?u?u?l?s +?u?u?l?l?u?u?u?d +?u?u?l?l?u?u?u?l +?u?u?l?l?u?u?u?u +?u?u?l?l?u?u?u?s +?u?u?l?l?u?u?s?l +?u?u?l?l?u?u?s?u +?u?u?l?l?u?u?s?s +?u?u?l?l?u?s?l?l +?u?u?l?l?u?s?l?u +?u?u?l?l?u?s?l?s +?u?u?l?l?u?s?u?l +?u?u?l?l?u?s?u?u +?u?u?l?l?u?s?u?s +?u?u?l?l?u?s?s?l +?u?u?l?l?u?s?s?u +?u?u?l?l?u?s?s?s +?u?u?l?l?s?l?l?l +?u?u?l?l?s?l?l?u +?u?u?l?l?s?l?l?s +?u?u?l?l?s?l?u?l +?u?u?l?l?s?l?u?u +?u?u?l?l?s?l?u?s +?u?u?l?l?s?l?s?l +?u?u?l?l?s?l?s?u +?u?u?l?l?s?l?s?s +?u?u?l?l?s?u?l?l +?u?u?l?l?s?u?l?u +?u?u?l?l?s?u?l?s +?u?u?l?l?s?u?u?l +?u?u?l?l?s?u?u?u +?u?u?l?l?s?u?u?s +?u?u?l?l?s?u?s?l +?u?u?l?l?s?u?s?u +?u?u?l?l?s?u?s?s +?u?u?l?l?s?s?l?l +?u?u?l?l?s?s?l?u +?u?u?l?l?s?s?l?s +?u?u?l?l?s?s?u?l +?u?u?l?l?s?s?u?u +?u?u?l?l?s?s?u?s +?u?u?l?l?s?s?s?l +?u?u?l?l?s?s?s?u +?u?u?l?l?s?s?s?s +?u?u?l?u?d?d?d?d +?u?u?l?u?d?d?d?l +?u?u?l?u?d?d?d?u +?u?u?l?u?d?d?l?d +?u?u?l?u?d?d?l?l +?u?u?l?u?d?d?l?u +?u?u?l?u?d?d?u?d +?u?u?l?u?d?d?u?l +?u?u?l?u?d?d?u?u +?u?u?l?u?d?l?d?d +?u?u?l?u?d?l?d?l +?u?u?l?u?d?l?d?u +?u?u?l?u?d?l?l?d +?u?u?l?u?d?l?l?l +?u?u?l?u?d?l?l?u +?u?u?l?u?d?l?u?d +?u?u?l?u?d?l?u?l +?u?u?l?u?d?l?u?u +?u?u?l?u?d?u?d?d +?u?u?l?u?d?u?d?l +?u?u?l?u?d?u?d?u +?u?u?l?u?d?u?l?d +?u?u?l?u?d?u?l?l +?u?u?l?u?d?u?l?u +?u?u?l?u?d?u?u?d +?u?u?l?u?d?u?u?l +?u?u?l?u?d?u?u?u +?u?u?l?u?l?d?d?d +?u?u?l?u?l?d?d?l +?u?u?l?u?l?d?d?u +?u?u?l?u?l?d?l?d +?u?u?l?u?l?d?l?l +?u?u?l?u?l?d?l?u +?u?u?l?u?l?d?u?d +?u?u?l?u?l?d?u?l +?u?u?l?u?l?d?u?u +?u?u?l?u?l?l?d?d +?u?u?l?u?l?l?d?l +?u?u?l?u?l?l?d?u +?u?u?l?u?l?l?l?d +?u?u?l?u?l?l?l?l +?u?u?l?u?l?l?l?u +?u?u?l?u?l?l?l?s +?u?u?l?u?l?l?u?d +?u?u?l?u?l?l?u?l +?u?u?l?u?l?l?u?u +?u?u?l?u?l?l?u?s +?u?u?l?u?l?l?s?l +?u?u?l?u?l?l?s?u +?u?u?l?u?l?l?s?s +?u?u?l?u?l?u?d?d +?u?u?l?u?l?u?d?l +?u?u?l?u?l?u?d?u +?u?u?l?u?l?u?l?d +?u?u?l?u?l?u?l?l +?u?u?l?u?l?u?l?u +?u?u?l?u?l?u?l?s +?u?u?l?u?l?u?u?d +?u?u?l?u?l?u?u?l +?u?u?l?u?l?u?u?u +?u?u?l?u?l?u?u?s +?u?u?l?u?l?u?s?l +?u?u?l?u?l?u?s?u +?u?u?l?u?l?u?s?s +?u?u?l?u?l?s?l?l +?u?u?l?u?l?s?l?u +?u?u?l?u?l?s?l?s +?u?u?l?u?l?s?u?l +?u?u?l?u?l?s?u?u +?u?u?l?u?l?s?u?s +?u?u?l?u?l?s?s?l +?u?u?l?u?l?s?s?u +?u?u?l?u?l?s?s?s +?u?u?l?u?u?d?d?d +?u?u?l?u?u?d?d?l +?u?u?l?u?u?d?d?u +?u?u?l?u?u?d?l?d +?u?u?l?u?u?d?l?l +?u?u?l?u?u?d?l?u +?u?u?l?u?u?d?u?d +?u?u?l?u?u?d?u?l +?u?u?l?u?u?d?u?u +?u?u?l?u?u?l?d?d +?u?u?l?u?u?l?d?l +?u?u?l?u?u?l?d?u +?u?u?l?u?u?l?l?d +?u?u?l?u?u?l?l?l +?u?u?l?u?u?l?l?u +?u?u?l?u?u?l?l?s +?u?u?l?u?u?l?u?d +?u?u?l?u?u?l?u?l +?u?u?l?u?u?l?u?u +?u?u?l?u?u?l?u?s +?u?u?l?u?u?l?s?l +?u?u?l?u?u?l?s?u +?u?u?l?u?u?l?s?s +?u?u?l?u?u?u?d?d +?u?u?l?u?u?u?d?l +?u?u?l?u?u?u?d?u +?u?u?l?u?u?u?l?d +?u?u?l?u?u?u?l?l +?u?u?l?u?u?u?l?u +?u?u?l?u?u?u?l?s +?u?u?l?u?u?u?u?d +?u?u?l?u?u?u?u?l +?u?u?l?u?u?u?u?u +?u?u?l?u?u?u?u?s +?u?u?l?u?u?u?s?l +?u?u?l?u?u?u?s?u +?u?u?l?u?u?u?s?s +?u?u?l?u?u?s?l?l +?u?u?l?u?u?s?l?u +?u?u?l?u?u?s?l?s +?u?u?l?u?u?s?u?l +?u?u?l?u?u?s?u?u +?u?u?l?u?u?s?u?s +?u?u?l?u?u?s?s?l +?u?u?l?u?u?s?s?u +?u?u?l?u?u?s?s?s +?u?u?l?u?s?l?l?l +?u?u?l?u?s?l?l?u +?u?u?l?u?s?l?l?s +?u?u?l?u?s?l?u?l +?u?u?l?u?s?l?u?u +?u?u?l?u?s?l?u?s +?u?u?l?u?s?l?s?l +?u?u?l?u?s?l?s?u +?u?u?l?u?s?l?s?s +?u?u?l?u?s?u?l?l +?u?u?l?u?s?u?l?u +?u?u?l?u?s?u?l?s +?u?u?l?u?s?u?u?l +?u?u?l?u?s?u?u?u +?u?u?l?u?s?u?u?s +?u?u?l?u?s?u?s?l +?u?u?l?u?s?u?s?u +?u?u?l?u?s?u?s?s +?u?u?l?u?s?s?l?l +?u?u?l?u?s?s?l?u +?u?u?l?u?s?s?l?s +?u?u?l?u?s?s?u?l +?u?u?l?u?s?s?u?u +?u?u?l?u?s?s?u?s +?u?u?l?u?s?s?s?l +?u?u?l?u?s?s?s?u +?u?u?l?u?s?s?s?s +?u?u?l?s?l?l?l?l +?u?u?l?s?l?l?l?u +?u?u?l?s?l?l?l?s +?u?u?l?s?l?l?u?l +?u?u?l?s?l?l?u?u +?u?u?l?s?l?l?u?s +?u?u?l?s?l?l?s?l +?u?u?l?s?l?l?s?u +?u?u?l?s?l?l?s?s +?u?u?l?s?l?u?l?l +?u?u?l?s?l?u?l?u +?u?u?l?s?l?u?l?s +?u?u?l?s?l?u?u?l +?u?u?l?s?l?u?u?u +?u?u?l?s?l?u?u?s +?u?u?l?s?l?u?s?l +?u?u?l?s?l?u?s?u +?u?u?l?s?l?u?s?s +?u?u?l?s?l?s?l?l +?u?u?l?s?l?s?l?u +?u?u?l?s?l?s?l?s +?u?u?l?s?l?s?u?l +?u?u?l?s?l?s?u?u +?u?u?l?s?l?s?u?s +?u?u?l?s?l?s?s?l +?u?u?l?s?l?s?s?u +?u?u?l?s?l?s?s?s +?u?u?l?s?u?l?l?l +?u?u?l?s?u?l?l?u +?u?u?l?s?u?l?l?s +?u?u?l?s?u?l?u?l +?u?u?l?s?u?l?u?u +?u?u?l?s?u?l?u?s +?u?u?l?s?u?l?s?l +?u?u?l?s?u?l?s?u +?u?u?l?s?u?l?s?s +?u?u?l?s?u?u?l?l +?u?u?l?s?u?u?l?u +?u?u?l?s?u?u?l?s +?u?u?l?s?u?u?u?l +?u?u?l?s?u?u?u?u +?u?u?l?s?u?u?u?s +?u?u?l?s?u?u?s?l +?u?u?l?s?u?u?s?u +?u?u?l?s?u?u?s?s +?u?u?l?s?u?s?l?l +?u?u?l?s?u?s?l?u +?u?u?l?s?u?s?l?s +?u?u?l?s?u?s?u?l +?u?u?l?s?u?s?u?u +?u?u?l?s?u?s?u?s +?u?u?l?s?u?s?s?l +?u?u?l?s?u?s?s?u +?u?u?l?s?u?s?s?s +?u?u?l?s?s?l?l?l +?u?u?l?s?s?l?l?u +?u?u?l?s?s?l?l?s +?u?u?l?s?s?l?u?l +?u?u?l?s?s?l?u?u +?u?u?l?s?s?l?u?s +?u?u?l?s?s?l?s?l +?u?u?l?s?s?l?s?u +?u?u?l?s?s?l?s?s +?u?u?l?s?s?u?l?l +?u?u?l?s?s?u?l?u +?u?u?l?s?s?u?l?s +?u?u?l?s?s?u?u?l +?u?u?l?s?s?u?u?u +?u?u?l?s?s?u?u?s +?u?u?l?s?s?u?s?l +?u?u?l?s?s?u?s?u +?u?u?l?s?s?u?s?s +?u?u?l?s?s?s?l?l +?u?u?l?s?s?s?l?u +?u?u?l?s?s?s?l?s +?u?u?l?s?s?s?u?l +?u?u?l?s?s?s?u?u +?u?u?l?s?s?s?u?s +?u?u?l?s?s?s?s?l +?u?u?l?s?s?s?s?u +?u?u?l?s?s?s?s?s +?u?u?u?d?d?d?d?d +?u?u?u?d?d?d?d?l +?u?u?u?d?d?d?d?u +?u?u?u?d?d?d?d?s +?u?u?u?d?d?d?l?d +?u?u?u?d?d?d?l?l +?u?u?u?d?d?d?l?u +?u?u?u?d?d?d?u?d +?u?u?u?d?d?d?u?l +?u?u?u?d?d?d?u?u +?u?u?u?d?d?d?u?s +?u?u?u?d?d?d?s?d +?u?u?u?d?d?d?s?u +?u?u?u?d?d?d?s?s +?u?u?u?d?d?l?d?d +?u?u?u?d?d?l?d?l +?u?u?u?d?d?l?d?u +?u?u?u?d?d?l?l?d +?u?u?u?d?d?l?l?l +?u?u?u?d?d?l?l?u +?u?u?u?d?d?l?u?d +?u?u?u?d?d?l?u?l +?u?u?u?d?d?l?u?u +?u?u?u?d?d?u?d?d +?u?u?u?d?d?u?d?l +?u?u?u?d?d?u?d?u +?u?u?u?d?d?u?d?s +?u?u?u?d?d?u?l?d +?u?u?u?d?d?u?l?l +?u?u?u?d?d?u?l?u +?u?u?u?d?d?u?u?d +?u?u?u?d?d?u?u?l +?u?u?u?d?d?u?u?u +?u?u?u?d?d?u?u?s +?u?u?u?d?d?u?s?d +?u?u?u?d?d?u?s?u +?u?u?u?d?d?u?s?s +?u?u?u?d?d?s?d?d +?u?u?u?d?d?s?d?u +?u?u?u?d?d?s?d?s +?u?u?u?d?d?s?u?d +?u?u?u?d?d?s?u?u +?u?u?u?d?d?s?u?s +?u?u?u?d?d?s?s?d +?u?u?u?d?d?s?s?u +?u?u?u?d?d?s?s?s +?u?u?u?d?l?d?d?d +?u?u?u?d?l?d?d?l +?u?u?u?d?l?d?d?u +?u?u?u?d?l?d?l?d +?u?u?u?d?l?d?l?l +?u?u?u?d?l?d?l?u +?u?u?u?d?l?d?u?d +?u?u?u?d?l?d?u?l +?u?u?u?d?l?d?u?u +?u?u?u?d?l?l?d?d +?u?u?u?d?l?l?d?l +?u?u?u?d?l?l?d?u +?u?u?u?d?l?l?l?d +?u?u?u?d?l?l?l?l +?u?u?u?d?l?l?l?u +?u?u?u?d?l?l?u?d +?u?u?u?d?l?l?u?l +?u?u?u?d?l?l?u?u +?u?u?u?d?l?u?d?d +?u?u?u?d?l?u?d?l +?u?u?u?d?l?u?d?u +?u?u?u?d?l?u?l?d +?u?u?u?d?l?u?l?l +?u?u?u?d?l?u?l?u +?u?u?u?d?l?u?u?d +?u?u?u?d?l?u?u?l +?u?u?u?d?l?u?u?u +?u?u?u?d?u?d?d?d +?u?u?u?d?u?d?d?l +?u?u?u?d?u?d?d?u +?u?u?u?d?u?d?d?s +?u?u?u?d?u?d?l?d +?u?u?u?d?u?d?l?l +?u?u?u?d?u?d?l?u +?u?u?u?d?u?d?u?d +?u?u?u?d?u?d?u?l +?u?u?u?d?u?d?u?u +?u?u?u?d?u?d?u?s +?u?u?u?d?u?d?s?d +?u?u?u?d?u?d?s?u +?u?u?u?d?u?d?s?s +?u?u?u?d?u?l?d?d +?u?u?u?d?u?l?d?l +?u?u?u?d?u?l?d?u +?u?u?u?d?u?l?l?d +?u?u?u?d?u?l?l?l +?u?u?u?d?u?l?l?u +?u?u?u?d?u?l?u?d +?u?u?u?d?u?l?u?l +?u?u?u?d?u?l?u?u +?u?u?u?d?u?u?d?d +?u?u?u?d?u?u?d?l +?u?u?u?d?u?u?d?u +?u?u?u?d?u?u?d?s +?u?u?u?d?u?u?l?d +?u?u?u?d?u?u?l?l +?u?u?u?d?u?u?l?u +?u?u?u?d?u?u?u?d +?u?u?u?d?u?u?u?l +?u?u?u?d?u?u?u?u +?u?u?u?d?u?u?u?s +?u?u?u?d?u?u?s?d +?u?u?u?d?u?u?s?u +?u?u?u?d?u?u?s?s +?u?u?u?d?u?s?d?d +?u?u?u?d?u?s?d?u +?u?u?u?d?u?s?d?s +?u?u?u?d?u?s?u?d +?u?u?u?d?u?s?u?u +?u?u?u?d?u?s?u?s +?u?u?u?d?u?s?s?d +?u?u?u?d?u?s?s?u +?u?u?u?d?u?s?s?s +?u?u?u?d?s?d?d?d +?u?u?u?d?s?d?d?u +?u?u?u?d?s?d?d?s +?u?u?u?d?s?d?u?d +?u?u?u?d?s?d?u?u +?u?u?u?d?s?d?u?s +?u?u?u?d?s?d?s?d +?u?u?u?d?s?d?s?u +?u?u?u?d?s?d?s?s +?u?u?u?d?s?u?d?d +?u?u?u?d?s?u?d?u +?u?u?u?d?s?u?d?s +?u?u?u?d?s?u?u?d +?u?u?u?d?s?u?u?u +?u?u?u?d?s?u?u?s +?u?u?u?d?s?u?s?d +?u?u?u?d?s?u?s?u +?u?u?u?d?s?u?s?s +?u?u?u?d?s?s?d?d +?u?u?u?d?s?s?d?u +?u?u?u?d?s?s?d?s +?u?u?u?d?s?s?u?d +?u?u?u?d?s?s?u?u +?u?u?u?d?s?s?u?s +?u?u?u?d?s?s?s?d +?u?u?u?d?s?s?s?u +?u?u?u?d?s?s?s?s +?u?u?u?l?d?d?d?d +?u?u?u?l?d?d?d?l +?u?u?u?l?d?d?d?u +?u?u?u?l?d?d?l?d +?u?u?u?l?d?d?l?l +?u?u?u?l?d?d?l?u +?u?u?u?l?d?d?u?d +?u?u?u?l?d?d?u?l +?u?u?u?l?d?d?u?u +?u?u?u?l?d?l?d?d +?u?u?u?l?d?l?d?l +?u?u?u?l?d?l?d?u +?u?u?u?l?d?l?l?d +?u?u?u?l?d?l?l?l +?u?u?u?l?d?l?l?u +?u?u?u?l?d?l?u?d +?u?u?u?l?d?l?u?l +?u?u?u?l?d?l?u?u +?u?u?u?l?d?u?d?d +?u?u?u?l?d?u?d?l +?u?u?u?l?d?u?d?u +?u?u?u?l?d?u?l?d +?u?u?u?l?d?u?l?l +?u?u?u?l?d?u?l?u +?u?u?u?l?d?u?u?d +?u?u?u?l?d?u?u?l +?u?u?u?l?d?u?u?u +?u?u?u?l?l?d?d?d +?u?u?u?l?l?d?d?l +?u?u?u?l?l?d?d?u +?u?u?u?l?l?d?l?d +?u?u?u?l?l?d?l?l +?u?u?u?l?l?d?l?u +?u?u?u?l?l?d?u?d +?u?u?u?l?l?d?u?l +?u?u?u?l?l?d?u?u +?u?u?u?l?l?l?d?d +?u?u?u?l?l?l?d?l +?u?u?u?l?l?l?d?u +?u?u?u?l?l?l?l?d +?u?u?u?l?l?l?l?l +?u?u?u?l?l?l?l?u +?u?u?u?l?l?l?l?s +?u?u?u?l?l?l?u?d +?u?u?u?l?l?l?u?l +?u?u?u?l?l?l?u?u +?u?u?u?l?l?l?u?s +?u?u?u?l?l?l?s?l +?u?u?u?l?l?l?s?u +?u?u?u?l?l?l?s?s +?u?u?u?l?l?u?d?d +?u?u?u?l?l?u?d?l +?u?u?u?l?l?u?d?u +?u?u?u?l?l?u?l?d +?u?u?u?l?l?u?l?l +?u?u?u?l?l?u?l?u +?u?u?u?l?l?u?l?s +?u?u?u?l?l?u?u?d +?u?u?u?l?l?u?u?l +?u?u?u?l?l?u?u?u +?u?u?u?l?l?u?u?s +?u?u?u?l?l?u?s?l +?u?u?u?l?l?u?s?u +?u?u?u?l?l?u?s?s +?u?u?u?l?l?s?l?l +?u?u?u?l?l?s?l?u +?u?u?u?l?l?s?l?s +?u?u?u?l?l?s?u?l +?u?u?u?l?l?s?u?u +?u?u?u?l?l?s?u?s +?u?u?u?l?l?s?s?l +?u?u?u?l?l?s?s?u +?u?u?u?l?l?s?s?s +?u?u?u?l?u?d?d?d +?u?u?u?l?u?d?d?l +?u?u?u?l?u?d?d?u +?u?u?u?l?u?d?l?d +?u?u?u?l?u?d?l?l +?u?u?u?l?u?d?l?u +?u?u?u?l?u?d?u?d +?u?u?u?l?u?d?u?l +?u?u?u?l?u?d?u?u +?u?u?u?l?u?l?d?d +?u?u?u?l?u?l?d?l +?u?u?u?l?u?l?d?u +?u?u?u?l?u?l?l?d +?u?u?u?l?u?l?l?l +?u?u?u?l?u?l?l?u +?u?u?u?l?u?l?l?s +?u?u?u?l?u?l?u?d +?u?u?u?l?u?l?u?l +?u?u?u?l?u?l?u?u +?u?u?u?l?u?l?u?s +?u?u?u?l?u?l?s?l +?u?u?u?l?u?l?s?u +?u?u?u?l?u?l?s?s +?u?u?u?l?u?u?d?d +?u?u?u?l?u?u?d?l +?u?u?u?l?u?u?d?u +?u?u?u?l?u?u?l?d +?u?u?u?l?u?u?l?l +?u?u?u?l?u?u?l?u +?u?u?u?l?u?u?l?s +?u?u?u?l?u?u?u?d +?u?u?u?l?u?u?u?l +?u?u?u?l?u?u?u?u +?u?u?u?l?u?u?u?s +?u?u?u?l?u?u?s?l +?u?u?u?l?u?u?s?u +?u?u?u?l?u?u?s?s +?u?u?u?l?u?s?l?l +?u?u?u?l?u?s?l?u +?u?u?u?l?u?s?l?s +?u?u?u?l?u?s?u?l +?u?u?u?l?u?s?u?u +?u?u?u?l?u?s?u?s +?u?u?u?l?u?s?s?l +?u?u?u?l?u?s?s?u +?u?u?u?l?u?s?s?s +?u?u?u?l?s?l?l?l +?u?u?u?l?s?l?l?u +?u?u?u?l?s?l?l?s +?u?u?u?l?s?l?u?l +?u?u?u?l?s?l?u?u +?u?u?u?l?s?l?u?s +?u?u?u?l?s?l?s?l +?u?u?u?l?s?l?s?u +?u?u?u?l?s?l?s?s +?u?u?u?l?s?u?l?l +?u?u?u?l?s?u?l?u +?u?u?u?l?s?u?l?s +?u?u?u?l?s?u?u?l +?u?u?u?l?s?u?u?u +?u?u?u?l?s?u?u?s +?u?u?u?l?s?u?s?l +?u?u?u?l?s?u?s?u +?u?u?u?l?s?u?s?s +?u?u?u?l?s?s?l?l +?u?u?u?l?s?s?l?u +?u?u?u?l?s?s?l?s +?u?u?u?l?s?s?u?l +?u?u?u?l?s?s?u?u +?u?u?u?l?s?s?u?s +?u?u?u?l?s?s?s?l +?u?u?u?l?s?s?s?u +?u?u?u?l?s?s?s?s +?u?u?u?u?d?d?d?d +?u?u?u?u?d?d?d?l +?u?u?u?u?d?d?d?u +?u?u?u?u?d?d?d?s +?u?u?u?u?d?d?l?d +?u?u?u?u?d?d?l?l +?u?u?u?u?d?d?l?u +?u?u?u?u?d?d?u?d +?u?u?u?u?d?d?u?l +?u?u?u?u?d?d?u?u +?u?u?u?u?d?d?u?s +?u?u?u?u?d?d?s?d +?u?u?u?u?d?d?s?u +?u?u?u?u?d?d?s?s +?u?u?u?u?d?l?d?d +?u?u?u?u?d?l?d?l +?u?u?u?u?d?l?d?u +?u?u?u?u?d?l?l?d +?u?u?u?u?d?l?l?l +?u?u?u?u?d?l?l?u +?u?u?u?u?d?l?u?d +?u?u?u?u?d?l?u?l +?u?u?u?u?d?l?u?u +?u?u?u?u?d?u?d?d +?u?u?u?u?d?u?d?l +?u?u?u?u?d?u?d?u +?u?u?u?u?d?u?d?s +?u?u?u?u?d?u?l?d +?u?u?u?u?d?u?l?l +?u?u?u?u?d?u?l?u +?u?u?u?u?d?u?u?d +?u?u?u?u?d?u?u?l +?u?u?u?u?d?u?u?u +?u?u?u?u?d?u?u?s +?u?u?u?u?d?u?s?d +?u?u?u?u?d?u?s?u +?u?u?u?u?d?u?s?s +?u?u?u?u?d?s?d?d +?u?u?u?u?d?s?d?u +?u?u?u?u?d?s?d?s +?u?u?u?u?d?s?u?d +?u?u?u?u?d?s?u?u +?u?u?u?u?d?s?u?s +?u?u?u?u?d?s?s?d +?u?u?u?u?d?s?s?u +?u?u?u?u?d?s?s?s +?u?u?u?u?l?d?d?d +?u?u?u?u?l?d?d?l +?u?u?u?u?l?d?d?u +?u?u?u?u?l?d?l?d +?u?u?u?u?l?d?l?l +?u?u?u?u?l?d?l?u +?u?u?u?u?l?d?u?d +?u?u?u?u?l?d?u?l +?u?u?u?u?l?d?u?u +?u?u?u?u?l?l?d?d +?u?u?u?u?l?l?d?l +?u?u?u?u?l?l?d?u +?u?u?u?u?l?l?l?d +?u?u?u?u?l?l?l?l +?u?u?u?u?l?l?l?u +?u?u?u?u?l?l?l?s +?u?u?u?u?l?l?u?d +?u?u?u?u?l?l?u?l +?u?u?u?u?l?l?u?u +?u?u?u?u?l?l?u?s +?u?u?u?u?l?l?s?l +?u?u?u?u?l?l?s?u +?u?u?u?u?l?l?s?s +?u?u?u?u?l?u?d?d +?u?u?u?u?l?u?d?l +?u?u?u?u?l?u?d?u +?u?u?u?u?l?u?l?d +?u?u?u?u?l?u?l?l +?u?u?u?u?l?u?l?u +?u?u?u?u?l?u?l?s +?u?u?u?u?l?u?u?d +?u?u?u?u?l?u?u?l +?u?u?u?u?l?u?u?u +?u?u?u?u?l?u?u?s +?u?u?u?u?l?u?s?l +?u?u?u?u?l?u?s?u +?u?u?u?u?l?u?s?s +?u?u?u?u?l?s?l?l +?u?u?u?u?l?s?l?u +?u?u?u?u?l?s?l?s +?u?u?u?u?l?s?u?l +?u?u?u?u?l?s?u?u +?u?u?u?u?l?s?u?s +?u?u?u?u?l?s?s?l +?u?u?u?u?l?s?s?u +?u?u?u?u?l?s?s?s +?u?u?u?u?u?d?d?d +?u?u?u?u?u?d?d?l +?u?u?u?u?u?d?d?u +?u?u?u?u?u?d?d?s +?u?u?u?u?u?d?l?d +?u?u?u?u?u?d?l?l +?u?u?u?u?u?d?l?u +?u?u?u?u?u?d?u?d +?u?u?u?u?u?d?u?l +?u?u?u?u?u?d?u?u +?u?u?u?u?u?d?u?s +?u?u?u?u?u?d?s?d +?u?u?u?u?u?d?s?u +?u?u?u?u?u?d?s?s +?u?u?u?u?u?l?d?d +?u?u?u?u?u?l?d?l +?u?u?u?u?u?l?d?u +?u?u?u?u?u?l?l?d +?u?u?u?u?u?l?l?l +?u?u?u?u?u?l?l?u +?u?u?u?u?u?l?l?s +?u?u?u?u?u?l?u?d +?u?u?u?u?u?l?u?l +?u?u?u?u?u?l?u?u +?u?u?u?u?u?l?u?s +?u?u?u?u?u?l?s?l +?u?u?u?u?u?l?s?u +?u?u?u?u?u?l?s?s +?u?u?u?u?u?u?d?d +?u?u?u?u?u?u?d?l +?u?u?u?u?u?u?d?u +?u?u?u?u?u?u?d?s +?u?u?u?u?u?u?l?d +?u?u?u?u?u?u?l?l +?u?u?u?u?u?u?l?u +?u?u?u?u?u?u?l?s +?u?u?u?u?u?u?u?d +?u?u?u?u?u?u?u?l +?u?u?u?u?u?u?u?u +?u?u?u?u?u?u?u?s +?u?u?u?u?u?u?s?d +?u?u?u?u?u?u?s?l +?u?u?u?u?u?u?s?u +?u?u?u?u?u?u?s?s +?u?u?u?u?u?s?d?d +?u?u?u?u?u?s?d?u +?u?u?u?u?u?s?d?s +?u?u?u?u?u?s?l?l +?u?u?u?u?u?s?l?u +?u?u?u?u?u?s?l?s +?u?u?u?u?u?s?u?d +?u?u?u?u?u?s?u?l +?u?u?u?u?u?s?u?u +?u?u?u?u?u?s?u?s +?u?u?u?u?u?s?s?d +?u?u?u?u?u?s?s?l +?u?u?u?u?u?s?s?u +?u?u?u?u?u?s?s?s +?u?u?u?u?s?d?d?d +?u?u?u?u?s?d?d?u +?u?u?u?u?s?d?d?s +?u?u?u?u?s?d?u?d +?u?u?u?u?s?d?u?u +?u?u?u?u?s?d?u?s +?u?u?u?u?s?d?s?d +?u?u?u?u?s?d?s?u +?u?u?u?u?s?d?s?s +?u?u?u?u?s?l?l?l +?u?u?u?u?s?l?l?u +?u?u?u?u?s?l?l?s +?u?u?u?u?s?l?u?l +?u?u?u?u?s?l?u?u +?u?u?u?u?s?l?u?s +?u?u?u?u?s?l?s?l +?u?u?u?u?s?l?s?u +?u?u?u?u?s?l?s?s +?u?u?u?u?s?u?d?d +?u?u?u?u?s?u?d?u +?u?u?u?u?s?u?d?s +?u?u?u?u?s?u?l?l +?u?u?u?u?s?u?l?u +?u?u?u?u?s?u?l?s +?u?u?u?u?s?u?u?d +?u?u?u?u?s?u?u?l +?u?u?u?u?s?u?u?u +?u?u?u?u?s?u?u?s +?u?u?u?u?s?u?s?d +?u?u?u?u?s?u?s?l +?u?u?u?u?s?u?s?u +?u?u?u?u?s?u?s?s +?u?u?u?u?s?s?d?d +?u?u?u?u?s?s?d?u +?u?u?u?u?s?s?d?s +?u?u?u?u?s?s?l?l +?u?u?u?u?s?s?l?u +?u?u?u?u?s?s?l?s +?u?u?u?u?s?s?u?d +?u?u?u?u?s?s?u?l +?u?u?u?u?s?s?u?u +?u?u?u?u?s?s?u?s +?u?u?u?u?s?s?s?d +?u?u?u?u?s?s?s?l +?u?u?u?u?s?s?s?u +?u?u?u?u?s?s?s?s +?u?u?u?s?d?d?d?d +?u?u?u?s?d?d?d?u +?u?u?u?s?d?d?d?s +?u?u?u?s?d?d?u?d +?u?u?u?s?d?d?u?u +?u?u?u?s?d?d?u?s +?u?u?u?s?d?d?s?d +?u?u?u?s?d?d?s?u +?u?u?u?s?d?d?s?s +?u?u?u?s?d?u?d?d +?u?u?u?s?d?u?d?u +?u?u?u?s?d?u?d?s +?u?u?u?s?d?u?u?d +?u?u?u?s?d?u?u?u +?u?u?u?s?d?u?u?s +?u?u?u?s?d?u?s?d +?u?u?u?s?d?u?s?u +?u?u?u?s?d?u?s?s +?u?u?u?s?d?s?d?d +?u?u?u?s?d?s?d?u +?u?u?u?s?d?s?d?s +?u?u?u?s?d?s?u?d +?u?u?u?s?d?s?u?u +?u?u?u?s?d?s?u?s +?u?u?u?s?d?s?s?d +?u?u?u?s?d?s?s?u +?u?u?u?s?d?s?s?s +?u?u?u?s?l?l?l?l +?u?u?u?s?l?l?l?u +?u?u?u?s?l?l?l?s +?u?u?u?s?l?l?u?l +?u?u?u?s?l?l?u?u +?u?u?u?s?l?l?u?s +?u?u?u?s?l?l?s?l +?u?u?u?s?l?l?s?u +?u?u?u?s?l?l?s?s +?u?u?u?s?l?u?l?l +?u?u?u?s?l?u?l?u +?u?u?u?s?l?u?l?s +?u?u?u?s?l?u?u?l +?u?u?u?s?l?u?u?u +?u?u?u?s?l?u?u?s +?u?u?u?s?l?u?s?l +?u?u?u?s?l?u?s?u +?u?u?u?s?l?u?s?s +?u?u?u?s?l?s?l?l +?u?u?u?s?l?s?l?u +?u?u?u?s?l?s?l?s +?u?u?u?s?l?s?u?l +?u?u?u?s?l?s?u?u +?u?u?u?s?l?s?u?s +?u?u?u?s?l?s?s?l +?u?u?u?s?l?s?s?u +?u?u?u?s?l?s?s?s +?u?u?u?s?u?d?d?d +?u?u?u?s?u?d?d?u +?u?u?u?s?u?d?d?s +?u?u?u?s?u?d?u?d +?u?u?u?s?u?d?u?u +?u?u?u?s?u?d?u?s +?u?u?u?s?u?d?s?d +?u?u?u?s?u?d?s?u +?u?u?u?s?u?d?s?s +?u?u?u?s?u?l?l?l +?u?u?u?s?u?l?l?u +?u?u?u?s?u?l?l?s +?u?u?u?s?u?l?u?l +?u?u?u?s?u?l?u?u +?u?u?u?s?u?l?u?s +?u?u?u?s?u?l?s?l +?u?u?u?s?u?l?s?u +?u?u?u?s?u?l?s?s +?u?u?u?s?u?u?d?d +?u?u?u?s?u?u?d?u +?u?u?u?s?u?u?d?s +?u?u?u?s?u?u?l?l +?u?u?u?s?u?u?l?u +?u?u?u?s?u?u?l?s +?u?u?u?s?u?u?u?d +?u?u?u?s?u?u?u?l +?u?u?u?s?u?u?u?u +?u?u?u?s?u?u?u?s +?u?u?u?s?u?u?s?d +?u?u?u?s?u?u?s?l +?u?u?u?s?u?u?s?u +?u?u?u?s?u?u?s?s +?u?u?u?s?u?s?d?d +?u?u?u?s?u?s?d?u +?u?u?u?s?u?s?d?s +?u?u?u?s?u?s?l?l +?u?u?u?s?u?s?l?u +?u?u?u?s?u?s?l?s +?u?u?u?s?u?s?u?d +?u?u?u?s?u?s?u?l +?u?u?u?s?u?s?u?u +?u?u?u?s?u?s?u?s +?u?u?u?s?u?s?s?d +?u?u?u?s?u?s?s?l +?u?u?u?s?u?s?s?u +?u?u?u?s?u?s?s?s +?u?u?u?s?s?d?d?d +?u?u?u?s?s?d?d?u +?u?u?u?s?s?d?d?s +?u?u?u?s?s?d?u?d +?u?u?u?s?s?d?u?u +?u?u?u?s?s?d?u?s +?u?u?u?s?s?d?s?d +?u?u?u?s?s?d?s?u +?u?u?u?s?s?d?s?s +?u?u?u?s?s?l?l?l +?u?u?u?s?s?l?l?u +?u?u?u?s?s?l?l?s +?u?u?u?s?s?l?u?l +?u?u?u?s?s?l?u?u +?u?u?u?s?s?l?u?s +?u?u?u?s?s?l?s?l +?u?u?u?s?s?l?s?u +?u?u?u?s?s?l?s?s +?u?u?u?s?s?u?d?d +?u?u?u?s?s?u?d?u +?u?u?u?s?s?u?d?s +?u?u?u?s?s?u?l?l +?u?u?u?s?s?u?l?u +?u?u?u?s?s?u?l?s +?u?u?u?s?s?u?u?d +?u?u?u?s?s?u?u?l +?u?u?u?s?s?u?u?u +?u?u?u?s?s?u?u?s +?u?u?u?s?s?u?s?d +?u?u?u?s?s?u?s?l +?u?u?u?s?s?u?s?u +?u?u?u?s?s?u?s?s +?u?u?u?s?s?s?d?d +?u?u?u?s?s?s?d?u +?u?u?u?s?s?s?d?s +?u?u?u?s?s?s?l?l +?u?u?u?s?s?s?l?u +?u?u?u?s?s?s?l?s +?u?u?u?s?s?s?u?d +?u?u?u?s?s?s?u?l +?u?u?u?s?s?s?u?u +?u?u?u?s?s?s?u?s +?u?u?u?s?s?s?s?d +?u?u?u?s?s?s?s?l +?u?u?u?s?s?s?s?u +?u?u?u?s?s?s?s?s +?u?u?s?d?d?d?d?d +?u?u?s?d?d?d?d?u +?u?u?s?d?d?d?d?s +?u?u?s?d?d?d?u?d +?u?u?s?d?d?d?u?u +?u?u?s?d?d?d?u?s +?u?u?s?d?d?d?s?d +?u?u?s?d?d?d?s?u +?u?u?s?d?d?d?s?s +?u?u?s?d?d?u?d?d +?u?u?s?d?d?u?d?u +?u?u?s?d?d?u?d?s +?u?u?s?d?d?u?u?d +?u?u?s?d?d?u?u?u +?u?u?s?d?d?u?u?s +?u?u?s?d?d?u?s?d +?u?u?s?d?d?u?s?u +?u?u?s?d?d?u?s?s +?u?u?s?d?d?s?d?d +?u?u?s?d?d?s?d?u +?u?u?s?d?d?s?d?s +?u?u?s?d?d?s?u?d +?u?u?s?d?d?s?u?u +?u?u?s?d?d?s?u?s +?u?u?s?d?d?s?s?d +?u?u?s?d?d?s?s?u +?u?u?s?d?d?s?s?s +?u?u?s?d?u?d?d?d +?u?u?s?d?u?d?d?u +?u?u?s?d?u?d?d?s +?u?u?s?d?u?d?u?d +?u?u?s?d?u?d?u?u +?u?u?s?d?u?d?u?s +?u?u?s?d?u?d?s?d +?u?u?s?d?u?d?s?u +?u?u?s?d?u?d?s?s +?u?u?s?d?u?u?d?d +?u?u?s?d?u?u?d?u +?u?u?s?d?u?u?d?s +?u?u?s?d?u?u?u?d +?u?u?s?d?u?u?u?u +?u?u?s?d?u?u?u?s +?u?u?s?d?u?u?s?d +?u?u?s?d?u?u?s?u +?u?u?s?d?u?u?s?s +?u?u?s?d?u?s?d?d +?u?u?s?d?u?s?d?u +?u?u?s?d?u?s?d?s +?u?u?s?d?u?s?u?d +?u?u?s?d?u?s?u?u +?u?u?s?d?u?s?u?s +?u?u?s?d?u?s?s?d +?u?u?s?d?u?s?s?u +?u?u?s?d?u?s?s?s +?u?u?s?d?s?d?d?d +?u?u?s?d?s?d?d?u +?u?u?s?d?s?d?d?s +?u?u?s?d?s?d?u?d +?u?u?s?d?s?d?u?u +?u?u?s?d?s?d?u?s +?u?u?s?d?s?d?s?d +?u?u?s?d?s?d?s?u +?u?u?s?d?s?d?s?s +?u?u?s?d?s?u?d?d +?u?u?s?d?s?u?d?u +?u?u?s?d?s?u?d?s +?u?u?s?d?s?u?u?d +?u?u?s?d?s?u?u?u +?u?u?s?d?s?u?u?s +?u?u?s?d?s?u?s?d +?u?u?s?d?s?u?s?u +?u?u?s?d?s?u?s?s +?u?u?s?d?s?s?d?d +?u?u?s?d?s?s?d?u +?u?u?s?d?s?s?d?s +?u?u?s?d?s?s?u?d +?u?u?s?d?s?s?u?u +?u?u?s?d?s?s?u?s +?u?u?s?d?s?s?s?d +?u?u?s?d?s?s?s?u +?u?u?s?d?s?s?s?s +?u?u?s?l?l?l?l?l +?u?u?s?l?l?l?l?u +?u?u?s?l?l?l?l?s +?u?u?s?l?l?l?u?l +?u?u?s?l?l?l?u?u +?u?u?s?l?l?l?u?s +?u?u?s?l?l?l?s?l +?u?u?s?l?l?l?s?u +?u?u?s?l?l?l?s?s +?u?u?s?l?l?u?l?l +?u?u?s?l?l?u?l?u +?u?u?s?l?l?u?l?s +?u?u?s?l?l?u?u?l +?u?u?s?l?l?u?u?u +?u?u?s?l?l?u?u?s +?u?u?s?l?l?u?s?l +?u?u?s?l?l?u?s?u +?u?u?s?l?l?u?s?s +?u?u?s?l?l?s?l?l +?u?u?s?l?l?s?l?u +?u?u?s?l?l?s?l?s +?u?u?s?l?l?s?u?l +?u?u?s?l?l?s?u?u +?u?u?s?l?l?s?u?s +?u?u?s?l?l?s?s?l +?u?u?s?l?l?s?s?u +?u?u?s?l?l?s?s?s +?u?u?s?l?u?l?l?l +?u?u?s?l?u?l?l?u +?u?u?s?l?u?l?l?s +?u?u?s?l?u?l?u?l +?u?u?s?l?u?l?u?u +?u?u?s?l?u?l?u?s +?u?u?s?l?u?l?s?l +?u?u?s?l?u?l?s?u +?u?u?s?l?u?l?s?s +?u?u?s?l?u?u?l?l +?u?u?s?l?u?u?l?u +?u?u?s?l?u?u?l?s +?u?u?s?l?u?u?u?l +?u?u?s?l?u?u?u?u +?u?u?s?l?u?u?u?s +?u?u?s?l?u?u?s?l +?u?u?s?l?u?u?s?u +?u?u?s?l?u?u?s?s +?u?u?s?l?u?s?l?l +?u?u?s?l?u?s?l?u +?u?u?s?l?u?s?l?s +?u?u?s?l?u?s?u?l +?u?u?s?l?u?s?u?u +?u?u?s?l?u?s?u?s +?u?u?s?l?u?s?s?l +?u?u?s?l?u?s?s?u +?u?u?s?l?u?s?s?s +?u?u?s?l?s?l?l?l +?u?u?s?l?s?l?l?u +?u?u?s?l?s?l?l?s +?u?u?s?l?s?l?u?l +?u?u?s?l?s?l?u?u +?u?u?s?l?s?l?u?s +?u?u?s?l?s?l?s?l +?u?u?s?l?s?l?s?u +?u?u?s?l?s?l?s?s +?u?u?s?l?s?u?l?l +?u?u?s?l?s?u?l?u +?u?u?s?l?s?u?l?s +?u?u?s?l?s?u?u?l +?u?u?s?l?s?u?u?u +?u?u?s?l?s?u?u?s +?u?u?s?l?s?u?s?l +?u?u?s?l?s?u?s?u +?u?u?s?l?s?u?s?s +?u?u?s?l?s?s?l?l +?u?u?s?l?s?s?l?u +?u?u?s?l?s?s?l?s +?u?u?s?l?s?s?u?l +?u?u?s?l?s?s?u?u +?u?u?s?l?s?s?u?s +?u?u?s?l?s?s?s?l +?u?u?s?l?s?s?s?u +?u?u?s?l?s?s?s?s +?u?u?s?u?d?d?d?d +?u?u?s?u?d?d?d?u +?u?u?s?u?d?d?d?s +?u?u?s?u?d?d?u?d +?u?u?s?u?d?d?u?u +?u?u?s?u?d?d?u?s +?u?u?s?u?d?d?s?d +?u?u?s?u?d?d?s?u +?u?u?s?u?d?d?s?s +?u?u?s?u?d?u?d?d +?u?u?s?u?d?u?d?u +?u?u?s?u?d?u?d?s +?u?u?s?u?d?u?u?d +?u?u?s?u?d?u?u?u +?u?u?s?u?d?u?u?s +?u?u?s?u?d?u?s?d +?u?u?s?u?d?u?s?u +?u?u?s?u?d?u?s?s +?u?u?s?u?d?s?d?d +?u?u?s?u?d?s?d?u +?u?u?s?u?d?s?d?s +?u?u?s?u?d?s?u?d +?u?u?s?u?d?s?u?u +?u?u?s?u?d?s?u?s +?u?u?s?u?d?s?s?d +?u?u?s?u?d?s?s?u +?u?u?s?u?d?s?s?s +?u?u?s?u?l?l?l?l +?u?u?s?u?l?l?l?u +?u?u?s?u?l?l?l?s +?u?u?s?u?l?l?u?l +?u?u?s?u?l?l?u?u +?u?u?s?u?l?l?u?s +?u?u?s?u?l?l?s?l +?u?u?s?u?l?l?s?u +?u?u?s?u?l?l?s?s +?u?u?s?u?l?u?l?l +?u?u?s?u?l?u?l?u +?u?u?s?u?l?u?l?s +?u?u?s?u?l?u?u?l +?u?u?s?u?l?u?u?u +?u?u?s?u?l?u?u?s +?u?u?s?u?l?u?s?l +?u?u?s?u?l?u?s?u +?u?u?s?u?l?u?s?s +?u?u?s?u?l?s?l?l +?u?u?s?u?l?s?l?u +?u?u?s?u?l?s?l?s +?u?u?s?u?l?s?u?l +?u?u?s?u?l?s?u?u +?u?u?s?u?l?s?u?s +?u?u?s?u?l?s?s?l +?u?u?s?u?l?s?s?u +?u?u?s?u?l?s?s?s +?u?u?s?u?u?d?d?d +?u?u?s?u?u?d?d?u +?u?u?s?u?u?d?d?s +?u?u?s?u?u?d?u?d +?u?u?s?u?u?d?u?u +?u?u?s?u?u?d?u?s +?u?u?s?u?u?d?s?d +?u?u?s?u?u?d?s?u +?u?u?s?u?u?d?s?s +?u?u?s?u?u?l?l?l +?u?u?s?u?u?l?l?u +?u?u?s?u?u?l?l?s +?u?u?s?u?u?l?u?l +?u?u?s?u?u?l?u?u +?u?u?s?u?u?l?u?s +?u?u?s?u?u?l?s?l +?u?u?s?u?u?l?s?u +?u?u?s?u?u?l?s?s +?u?u?s?u?u?u?d?d +?u?u?s?u?u?u?d?u +?u?u?s?u?u?u?d?s +?u?u?s?u?u?u?l?l +?u?u?s?u?u?u?l?u +?u?u?s?u?u?u?l?s +?u?u?s?u?u?u?u?d +?u?u?s?u?u?u?u?l +?u?u?s?u?u?u?u?u +?u?u?s?u?u?u?u?s +?u?u?s?u?u?u?s?d +?u?u?s?u?u?u?s?l +?u?u?s?u?u?u?s?u +?u?u?s?u?u?u?s?s +?u?u?s?u?u?s?d?d +?u?u?s?u?u?s?d?u +?u?u?s?u?u?s?d?s +?u?u?s?u?u?s?l?l +?u?u?s?u?u?s?l?u +?u?u?s?u?u?s?l?s +?u?u?s?u?u?s?u?d +?u?u?s?u?u?s?u?l +?u?u?s?u?u?s?u?u +?u?u?s?u?u?s?u?s +?u?u?s?u?u?s?s?d +?u?u?s?u?u?s?s?l +?u?u?s?u?u?s?s?u +?u?u?s?u?u?s?s?s +?u?u?s?u?s?d?d?d +?u?u?s?u?s?d?d?u +?u?u?s?u?s?d?d?s +?u?u?s?u?s?d?u?d +?u?u?s?u?s?d?u?u +?u?u?s?u?s?d?u?s +?u?u?s?u?s?d?s?d +?u?u?s?u?s?d?s?u +?u?u?s?u?s?d?s?s +?u?u?s?u?s?l?l?l +?u?u?s?u?s?l?l?u +?u?u?s?u?s?l?l?s +?u?u?s?u?s?l?u?l +?u?u?s?u?s?l?u?u +?u?u?s?u?s?l?u?s +?u?u?s?u?s?l?s?l +?u?u?s?u?s?l?s?u +?u?u?s?u?s?l?s?s +?u?u?s?u?s?u?d?d +?u?u?s?u?s?u?d?u +?u?u?s?u?s?u?d?s +?u?u?s?u?s?u?l?l +?u?u?s?u?s?u?l?u +?u?u?s?u?s?u?l?s +?u?u?s?u?s?u?u?d +?u?u?s?u?s?u?u?l +?u?u?s?u?s?u?u?u +?u?u?s?u?s?u?u?s +?u?u?s?u?s?u?s?d +?u?u?s?u?s?u?s?l +?u?u?s?u?s?u?s?u +?u?u?s?u?s?u?s?s +?u?u?s?u?s?s?d?d +?u?u?s?u?s?s?d?u +?u?u?s?u?s?s?d?s +?u?u?s?u?s?s?l?l +?u?u?s?u?s?s?l?u +?u?u?s?u?s?s?l?s +?u?u?s?u?s?s?u?d +?u?u?s?u?s?s?u?l +?u?u?s?u?s?s?u?u +?u?u?s?u?s?s?u?s +?u?u?s?u?s?s?s?d +?u?u?s?u?s?s?s?l +?u?u?s?u?s?s?s?u +?u?u?s?u?s?s?s?s +?u?u?s?s?d?d?d?d +?u?u?s?s?d?d?d?u +?u?u?s?s?d?d?d?s +?u?u?s?s?d?d?u?d +?u?u?s?s?d?d?u?u +?u?u?s?s?d?d?u?s +?u?u?s?s?d?d?s?d +?u?u?s?s?d?d?s?u +?u?u?s?s?d?d?s?s +?u?u?s?s?d?u?d?d +?u?u?s?s?d?u?d?u +?u?u?s?s?d?u?d?s +?u?u?s?s?d?u?u?d +?u?u?s?s?d?u?u?u +?u?u?s?s?d?u?u?s +?u?u?s?s?d?u?s?d +?u?u?s?s?d?u?s?u +?u?u?s?s?d?u?s?s +?u?u?s?s?d?s?d?d +?u?u?s?s?d?s?d?u +?u?u?s?s?d?s?d?s +?u?u?s?s?d?s?u?d +?u?u?s?s?d?s?u?u +?u?u?s?s?d?s?u?s +?u?u?s?s?d?s?s?d +?u?u?s?s?d?s?s?u +?u?u?s?s?d?s?s?s +?u?u?s?s?l?l?l?l +?u?u?s?s?l?l?l?u +?u?u?s?s?l?l?l?s +?u?u?s?s?l?l?u?l +?u?u?s?s?l?l?u?u +?u?u?s?s?l?l?u?s +?u?u?s?s?l?l?s?l +?u?u?s?s?l?l?s?u +?u?u?s?s?l?l?s?s +?u?u?s?s?l?u?l?l +?u?u?s?s?l?u?l?u +?u?u?s?s?l?u?l?s +?u?u?s?s?l?u?u?l +?u?u?s?s?l?u?u?u +?u?u?s?s?l?u?u?s +?u?u?s?s?l?u?s?l +?u?u?s?s?l?u?s?u +?u?u?s?s?l?u?s?s +?u?u?s?s?l?s?l?l +?u?u?s?s?l?s?l?u +?u?u?s?s?l?s?l?s +?u?u?s?s?l?s?u?l +?u?u?s?s?l?s?u?u +?u?u?s?s?l?s?u?s +?u?u?s?s?l?s?s?l +?u?u?s?s?l?s?s?u +?u?u?s?s?l?s?s?s +?u?u?s?s?u?d?d?d +?u?u?s?s?u?d?d?u +?u?u?s?s?u?d?d?s +?u?u?s?s?u?d?u?d +?u?u?s?s?u?d?u?u +?u?u?s?s?u?d?u?s +?u?u?s?s?u?d?s?d +?u?u?s?s?u?d?s?u +?u?u?s?s?u?d?s?s +?u?u?s?s?u?l?l?l +?u?u?s?s?u?l?l?u +?u?u?s?s?u?l?l?s +?u?u?s?s?u?l?u?l +?u?u?s?s?u?l?u?u +?u?u?s?s?u?l?u?s +?u?u?s?s?u?l?s?l +?u?u?s?s?u?l?s?u +?u?u?s?s?u?l?s?s +?u?u?s?s?u?u?d?d +?u?u?s?s?u?u?d?u +?u?u?s?s?u?u?d?s +?u?u?s?s?u?u?l?l +?u?u?s?s?u?u?l?u +?u?u?s?s?u?u?l?s +?u?u?s?s?u?u?u?d +?u?u?s?s?u?u?u?l +?u?u?s?s?u?u?u?u +?u?u?s?s?u?u?u?s +?u?u?s?s?u?u?s?d +?u?u?s?s?u?u?s?l +?u?u?s?s?u?u?s?u +?u?u?s?s?u?u?s?s +?u?u?s?s?u?s?d?d +?u?u?s?s?u?s?d?u +?u?u?s?s?u?s?d?s +?u?u?s?s?u?s?l?l +?u?u?s?s?u?s?l?u +?u?u?s?s?u?s?l?s +?u?u?s?s?u?s?u?d +?u?u?s?s?u?s?u?l +?u?u?s?s?u?s?u?u +?u?u?s?s?u?s?u?s +?u?u?s?s?u?s?s?d +?u?u?s?s?u?s?s?l +?u?u?s?s?u?s?s?u +?u?u?s?s?u?s?s?s +?u?u?s?s?s?d?d?d +?u?u?s?s?s?d?d?u +?u?u?s?s?s?d?d?s +?u?u?s?s?s?d?u?d +?u?u?s?s?s?d?u?u +?u?u?s?s?s?d?u?s +?u?u?s?s?s?d?s?d +?u?u?s?s?s?d?s?u +?u?u?s?s?s?d?s?s +?u?u?s?s?s?l?l?l +?u?u?s?s?s?l?l?u +?u?u?s?s?s?l?l?s +?u?u?s?s?s?l?u?l +?u?u?s?s?s?l?u?u +?u?u?s?s?s?l?u?s +?u?u?s?s?s?l?s?l +?u?u?s?s?s?l?s?u +?u?u?s?s?s?l?s?s +?u?u?s?s?s?u?d?d +?u?u?s?s?s?u?d?u +?u?u?s?s?s?u?d?s +?u?u?s?s?s?u?l?l +?u?u?s?s?s?u?l?u +?u?u?s?s?s?u?l?s +?u?u?s?s?s?u?u?d +?u?u?s?s?s?u?u?l +?u?u?s?s?s?u?u?u +?u?u?s?s?s?u?u?s +?u?u?s?s?s?u?s?d +?u?u?s?s?s?u?s?l +?u?u?s?s?s?u?s?u +?u?u?s?s?s?u?s?s +?u?u?s?s?s?s?d?d +?u?u?s?s?s?s?d?u +?u?u?s?s?s?s?d?s +?u?u?s?s?s?s?l?l +?u?u?s?s?s?s?l?u +?u?u?s?s?s?s?l?s +?u?u?s?s?s?s?u?d +?u?u?s?s?s?s?u?l +?u?u?s?s?s?s?u?u +?u?u?s?s?s?s?u?s +?u?u?s?s?s?s?s?d +?u?u?s?s?s?s?s?l +?u?u?s?s?s?s?s?u +?u?u?s?s?s?s?s?s +?u?s?d?d?d?d?d?d +?u?s?d?d?d?d?d?u +?u?s?d?d?d?d?d?s +?u?s?d?d?d?d?u?d +?u?s?d?d?d?d?u?u +?u?s?d?d?d?d?u?s +?u?s?d?d?d?d?s?d +?u?s?d?d?d?d?s?u +?u?s?d?d?d?d?s?s +?u?s?d?d?d?u?d?d +?u?s?d?d?d?u?d?u +?u?s?d?d?d?u?d?s +?u?s?d?d?d?u?u?d +?u?s?d?d?d?u?u?u +?u?s?d?d?d?u?u?s +?u?s?d?d?d?u?s?d +?u?s?d?d?d?u?s?u +?u?s?d?d?d?u?s?s +?u?s?d?d?d?s?d?d +?u?s?d?d?d?s?d?u +?u?s?d?d?d?s?d?s +?u?s?d?d?d?s?u?d +?u?s?d?d?d?s?u?u +?u?s?d?d?d?s?u?s +?u?s?d?d?d?s?s?d +?u?s?d?d?d?s?s?u +?u?s?d?d?d?s?s?s +?u?s?d?d?u?d?d?d +?u?s?d?d?u?d?d?u +?u?s?d?d?u?d?d?s +?u?s?d?d?u?d?u?d +?u?s?d?d?u?d?u?u +?u?s?d?d?u?d?u?s +?u?s?d?d?u?d?s?d +?u?s?d?d?u?d?s?u +?u?s?d?d?u?d?s?s +?u?s?d?d?u?u?d?d +?u?s?d?d?u?u?d?u +?u?s?d?d?u?u?d?s +?u?s?d?d?u?u?u?d +?u?s?d?d?u?u?u?u +?u?s?d?d?u?u?u?s +?u?s?d?d?u?u?s?d +?u?s?d?d?u?u?s?u +?u?s?d?d?u?u?s?s +?u?s?d?d?u?s?d?d +?u?s?d?d?u?s?d?u +?u?s?d?d?u?s?d?s +?u?s?d?d?u?s?u?d +?u?s?d?d?u?s?u?u +?u?s?d?d?u?s?u?s +?u?s?d?d?u?s?s?d +?u?s?d?d?u?s?s?u +?u?s?d?d?u?s?s?s +?u?s?d?d?s?d?d?d +?u?s?d?d?s?d?d?u +?u?s?d?d?s?d?d?s +?u?s?d?d?s?d?u?d +?u?s?d?d?s?d?u?u +?u?s?d?d?s?d?u?s +?u?s?d?d?s?d?s?d +?u?s?d?d?s?d?s?u +?u?s?d?d?s?d?s?s +?u?s?d?d?s?u?d?d +?u?s?d?d?s?u?d?u +?u?s?d?d?s?u?d?s +?u?s?d?d?s?u?u?d +?u?s?d?d?s?u?u?u +?u?s?d?d?s?u?u?s +?u?s?d?d?s?u?s?d +?u?s?d?d?s?u?s?u +?u?s?d?d?s?u?s?s +?u?s?d?d?s?s?d?d +?u?s?d?d?s?s?d?u +?u?s?d?d?s?s?d?s +?u?s?d?d?s?s?u?d +?u?s?d?d?s?s?u?u +?u?s?d?d?s?s?u?s +?u?s?d?d?s?s?s?d +?u?s?d?d?s?s?s?u +?u?s?d?d?s?s?s?s +?u?s?d?u?d?d?d?d +?u?s?d?u?d?d?d?u +?u?s?d?u?d?d?d?s +?u?s?d?u?d?d?u?d +?u?s?d?u?d?d?u?u +?u?s?d?u?d?d?u?s +?u?s?d?u?d?d?s?d +?u?s?d?u?d?d?s?u +?u?s?d?u?d?d?s?s +?u?s?d?u?d?u?d?d +?u?s?d?u?d?u?d?u +?u?s?d?u?d?u?d?s +?u?s?d?u?d?u?u?d +?u?s?d?u?d?u?u?u +?u?s?d?u?d?u?u?s +?u?s?d?u?d?u?s?d +?u?s?d?u?d?u?s?u +?u?s?d?u?d?u?s?s +?u?s?d?u?d?s?d?d +?u?s?d?u?d?s?d?u +?u?s?d?u?d?s?d?s +?u?s?d?u?d?s?u?d +?u?s?d?u?d?s?u?u +?u?s?d?u?d?s?u?s +?u?s?d?u?d?s?s?d +?u?s?d?u?d?s?s?u +?u?s?d?u?d?s?s?s +?u?s?d?u?u?d?d?d +?u?s?d?u?u?d?d?u +?u?s?d?u?u?d?d?s +?u?s?d?u?u?d?u?d +?u?s?d?u?u?d?u?u +?u?s?d?u?u?d?u?s +?u?s?d?u?u?d?s?d +?u?s?d?u?u?d?s?u +?u?s?d?u?u?d?s?s +?u?s?d?u?u?u?d?d +?u?s?d?u?u?u?d?u +?u?s?d?u?u?u?d?s +?u?s?d?u?u?u?u?d +?u?s?d?u?u?u?u?u +?u?s?d?u?u?u?u?s +?u?s?d?u?u?u?s?d +?u?s?d?u?u?u?s?u +?u?s?d?u?u?u?s?s +?u?s?d?u?u?s?d?d +?u?s?d?u?u?s?d?u +?u?s?d?u?u?s?d?s +?u?s?d?u?u?s?u?d +?u?s?d?u?u?s?u?u +?u?s?d?u?u?s?u?s +?u?s?d?u?u?s?s?d +?u?s?d?u?u?s?s?u +?u?s?d?u?u?s?s?s +?u?s?d?u?s?d?d?d +?u?s?d?u?s?d?d?u +?u?s?d?u?s?d?d?s +?u?s?d?u?s?d?u?d +?u?s?d?u?s?d?u?u +?u?s?d?u?s?d?u?s +?u?s?d?u?s?d?s?d +?u?s?d?u?s?d?s?u +?u?s?d?u?s?d?s?s +?u?s?d?u?s?u?d?d +?u?s?d?u?s?u?d?u +?u?s?d?u?s?u?d?s +?u?s?d?u?s?u?u?d +?u?s?d?u?s?u?u?u +?u?s?d?u?s?u?u?s +?u?s?d?u?s?u?s?d +?u?s?d?u?s?u?s?u +?u?s?d?u?s?u?s?s +?u?s?d?u?s?s?d?d +?u?s?d?u?s?s?d?u +?u?s?d?u?s?s?d?s +?u?s?d?u?s?s?u?d +?u?s?d?u?s?s?u?u +?u?s?d?u?s?s?u?s +?u?s?d?u?s?s?s?d +?u?s?d?u?s?s?s?u +?u?s?d?u?s?s?s?s +?u?s?d?s?d?d?d?d +?u?s?d?s?d?d?d?u +?u?s?d?s?d?d?d?s +?u?s?d?s?d?d?u?d +?u?s?d?s?d?d?u?u +?u?s?d?s?d?d?u?s +?u?s?d?s?d?d?s?d +?u?s?d?s?d?d?s?u +?u?s?d?s?d?d?s?s +?u?s?d?s?d?u?d?d +?u?s?d?s?d?u?d?u +?u?s?d?s?d?u?d?s +?u?s?d?s?d?u?u?d +?u?s?d?s?d?u?u?u +?u?s?d?s?d?u?u?s +?u?s?d?s?d?u?s?d +?u?s?d?s?d?u?s?u +?u?s?d?s?d?u?s?s +?u?s?d?s?d?s?d?d +?u?s?d?s?d?s?d?u +?u?s?d?s?d?s?d?s +?u?s?d?s?d?s?u?d +?u?s?d?s?d?s?u?u +?u?s?d?s?d?s?u?s +?u?s?d?s?d?s?s?d +?u?s?d?s?d?s?s?u +?u?s?d?s?d?s?s?s +?u?s?d?s?u?d?d?d +?u?s?d?s?u?d?d?u +?u?s?d?s?u?d?d?s +?u?s?d?s?u?d?u?d +?u?s?d?s?u?d?u?u +?u?s?d?s?u?d?u?s +?u?s?d?s?u?d?s?d +?u?s?d?s?u?d?s?u +?u?s?d?s?u?d?s?s +?u?s?d?s?u?u?d?d +?u?s?d?s?u?u?d?u +?u?s?d?s?u?u?d?s +?u?s?d?s?u?u?u?d +?u?s?d?s?u?u?u?u +?u?s?d?s?u?u?u?s +?u?s?d?s?u?u?s?d +?u?s?d?s?u?u?s?u +?u?s?d?s?u?u?s?s +?u?s?d?s?u?s?d?d +?u?s?d?s?u?s?d?u +?u?s?d?s?u?s?d?s +?u?s?d?s?u?s?u?d +?u?s?d?s?u?s?u?u +?u?s?d?s?u?s?u?s +?u?s?d?s?u?s?s?d +?u?s?d?s?u?s?s?u +?u?s?d?s?u?s?s?s +?u?s?d?s?s?d?d?d +?u?s?d?s?s?d?d?u +?u?s?d?s?s?d?d?s +?u?s?d?s?s?d?u?d +?u?s?d?s?s?d?u?u +?u?s?d?s?s?d?u?s +?u?s?d?s?s?d?s?d +?u?s?d?s?s?d?s?u +?u?s?d?s?s?d?s?s +?u?s?d?s?s?u?d?d +?u?s?d?s?s?u?d?u +?u?s?d?s?s?u?d?s +?u?s?d?s?s?u?u?d +?u?s?d?s?s?u?u?u +?u?s?d?s?s?u?u?s +?u?s?d?s?s?u?s?d +?u?s?d?s?s?u?s?u +?u?s?d?s?s?u?s?s +?u?s?d?s?s?s?d?d +?u?s?d?s?s?s?d?u +?u?s?d?s?s?s?d?s +?u?s?d?s?s?s?u?d +?u?s?d?s?s?s?u?u +?u?s?d?s?s?s?u?s +?u?s?d?s?s?s?s?d +?u?s?d?s?s?s?s?u +?u?s?d?s?s?s?s?s +?u?s?l?l?l?l?l?l +?u?s?l?l?l?l?l?u +?u?s?l?l?l?l?l?s +?u?s?l?l?l?l?u?l +?u?s?l?l?l?l?u?u +?u?s?l?l?l?l?u?s +?u?s?l?l?l?l?s?l +?u?s?l?l?l?l?s?u +?u?s?l?l?l?l?s?s +?u?s?l?l?l?u?l?l +?u?s?l?l?l?u?l?u +?u?s?l?l?l?u?l?s +?u?s?l?l?l?u?u?l +?u?s?l?l?l?u?u?u +?u?s?l?l?l?u?u?s +?u?s?l?l?l?u?s?l +?u?s?l?l?l?u?s?u +?u?s?l?l?l?u?s?s +?u?s?l?l?l?s?l?l +?u?s?l?l?l?s?l?u +?u?s?l?l?l?s?l?s +?u?s?l?l?l?s?u?l +?u?s?l?l?l?s?u?u +?u?s?l?l?l?s?u?s +?u?s?l?l?l?s?s?l +?u?s?l?l?l?s?s?u +?u?s?l?l?l?s?s?s +?u?s?l?l?u?l?l?l +?u?s?l?l?u?l?l?u +?u?s?l?l?u?l?l?s +?u?s?l?l?u?l?u?l +?u?s?l?l?u?l?u?u +?u?s?l?l?u?l?u?s +?u?s?l?l?u?l?s?l +?u?s?l?l?u?l?s?u +?u?s?l?l?u?l?s?s +?u?s?l?l?u?u?l?l +?u?s?l?l?u?u?l?u +?u?s?l?l?u?u?l?s +?u?s?l?l?u?u?u?l +?u?s?l?l?u?u?u?u +?u?s?l?l?u?u?u?s +?u?s?l?l?u?u?s?l +?u?s?l?l?u?u?s?u +?u?s?l?l?u?u?s?s +?u?s?l?l?u?s?l?l +?u?s?l?l?u?s?l?u +?u?s?l?l?u?s?l?s +?u?s?l?l?u?s?u?l +?u?s?l?l?u?s?u?u +?u?s?l?l?u?s?u?s +?u?s?l?l?u?s?s?l +?u?s?l?l?u?s?s?u +?u?s?l?l?u?s?s?s +?u?s?l?l?s?l?l?l +?u?s?l?l?s?l?l?u +?u?s?l?l?s?l?l?s +?u?s?l?l?s?l?u?l +?u?s?l?l?s?l?u?u +?u?s?l?l?s?l?u?s +?u?s?l?l?s?l?s?l +?u?s?l?l?s?l?s?u +?u?s?l?l?s?l?s?s +?u?s?l?l?s?u?l?l +?u?s?l?l?s?u?l?u +?u?s?l?l?s?u?l?s +?u?s?l?l?s?u?u?l +?u?s?l?l?s?u?u?u +?u?s?l?l?s?u?u?s +?u?s?l?l?s?u?s?l +?u?s?l?l?s?u?s?u +?u?s?l?l?s?u?s?s +?u?s?l?l?s?s?l?l +?u?s?l?l?s?s?l?u +?u?s?l?l?s?s?l?s +?u?s?l?l?s?s?u?l +?u?s?l?l?s?s?u?u +?u?s?l?l?s?s?u?s +?u?s?l?l?s?s?s?l +?u?s?l?l?s?s?s?u +?u?s?l?l?s?s?s?s +?u?s?l?u?l?l?l?l +?u?s?l?u?l?l?l?u +?u?s?l?u?l?l?l?s +?u?s?l?u?l?l?u?l +?u?s?l?u?l?l?u?u +?u?s?l?u?l?l?u?s +?u?s?l?u?l?l?s?l +?u?s?l?u?l?l?s?u +?u?s?l?u?l?l?s?s +?u?s?l?u?l?u?l?l +?u?s?l?u?l?u?l?u +?u?s?l?u?l?u?l?s +?u?s?l?u?l?u?u?l +?u?s?l?u?l?u?u?u +?u?s?l?u?l?u?u?s +?u?s?l?u?l?u?s?l +?u?s?l?u?l?u?s?u +?u?s?l?u?l?u?s?s +?u?s?l?u?l?s?l?l +?u?s?l?u?l?s?l?u +?u?s?l?u?l?s?l?s +?u?s?l?u?l?s?u?l +?u?s?l?u?l?s?u?u +?u?s?l?u?l?s?u?s +?u?s?l?u?l?s?s?l +?u?s?l?u?l?s?s?u +?u?s?l?u?l?s?s?s +?u?s?l?u?u?l?l?l +?u?s?l?u?u?l?l?u +?u?s?l?u?u?l?l?s +?u?s?l?u?u?l?u?l +?u?s?l?u?u?l?u?u +?u?s?l?u?u?l?u?s +?u?s?l?u?u?l?s?l +?u?s?l?u?u?l?s?u +?u?s?l?u?u?l?s?s +?u?s?l?u?u?u?l?l +?u?s?l?u?u?u?l?u +?u?s?l?u?u?u?l?s +?u?s?l?u?u?u?u?l +?u?s?l?u?u?u?u?u +?u?s?l?u?u?u?u?s +?u?s?l?u?u?u?s?l +?u?s?l?u?u?u?s?u +?u?s?l?u?u?u?s?s +?u?s?l?u?u?s?l?l +?u?s?l?u?u?s?l?u +?u?s?l?u?u?s?l?s +?u?s?l?u?u?s?u?l +?u?s?l?u?u?s?u?u +?u?s?l?u?u?s?u?s +?u?s?l?u?u?s?s?l +?u?s?l?u?u?s?s?u +?u?s?l?u?u?s?s?s +?u?s?l?u?s?l?l?l +?u?s?l?u?s?l?l?u +?u?s?l?u?s?l?l?s +?u?s?l?u?s?l?u?l +?u?s?l?u?s?l?u?u +?u?s?l?u?s?l?u?s +?u?s?l?u?s?l?s?l +?u?s?l?u?s?l?s?u +?u?s?l?u?s?l?s?s +?u?s?l?u?s?u?l?l +?u?s?l?u?s?u?l?u +?u?s?l?u?s?u?l?s +?u?s?l?u?s?u?u?l +?u?s?l?u?s?u?u?u +?u?s?l?u?s?u?u?s +?u?s?l?u?s?u?s?l +?u?s?l?u?s?u?s?u +?u?s?l?u?s?u?s?s +?u?s?l?u?s?s?l?l +?u?s?l?u?s?s?l?u +?u?s?l?u?s?s?l?s +?u?s?l?u?s?s?u?l +?u?s?l?u?s?s?u?u +?u?s?l?u?s?s?u?s +?u?s?l?u?s?s?s?l +?u?s?l?u?s?s?s?u +?u?s?l?u?s?s?s?s +?u?s?l?s?l?l?l?l +?u?s?l?s?l?l?l?u +?u?s?l?s?l?l?l?s +?u?s?l?s?l?l?u?l +?u?s?l?s?l?l?u?u +?u?s?l?s?l?l?u?s +?u?s?l?s?l?l?s?l +?u?s?l?s?l?l?s?u +?u?s?l?s?l?l?s?s +?u?s?l?s?l?u?l?l +?u?s?l?s?l?u?l?u +?u?s?l?s?l?u?l?s +?u?s?l?s?l?u?u?l +?u?s?l?s?l?u?u?u +?u?s?l?s?l?u?u?s +?u?s?l?s?l?u?s?l +?u?s?l?s?l?u?s?u +?u?s?l?s?l?u?s?s +?u?s?l?s?l?s?l?l +?u?s?l?s?l?s?l?u +?u?s?l?s?l?s?l?s +?u?s?l?s?l?s?u?l +?u?s?l?s?l?s?u?u +?u?s?l?s?l?s?u?s +?u?s?l?s?l?s?s?l +?u?s?l?s?l?s?s?u +?u?s?l?s?l?s?s?s +?u?s?l?s?u?l?l?l +?u?s?l?s?u?l?l?u +?u?s?l?s?u?l?l?s +?u?s?l?s?u?l?u?l +?u?s?l?s?u?l?u?u +?u?s?l?s?u?l?u?s +?u?s?l?s?u?l?s?l +?u?s?l?s?u?l?s?u +?u?s?l?s?u?l?s?s +?u?s?l?s?u?u?l?l +?u?s?l?s?u?u?l?u +?u?s?l?s?u?u?l?s +?u?s?l?s?u?u?u?l +?u?s?l?s?u?u?u?u +?u?s?l?s?u?u?u?s +?u?s?l?s?u?u?s?l +?u?s?l?s?u?u?s?u +?u?s?l?s?u?u?s?s +?u?s?l?s?u?s?l?l +?u?s?l?s?u?s?l?u +?u?s?l?s?u?s?l?s +?u?s?l?s?u?s?u?l +?u?s?l?s?u?s?u?u +?u?s?l?s?u?s?u?s +?u?s?l?s?u?s?s?l +?u?s?l?s?u?s?s?u +?u?s?l?s?u?s?s?s +?u?s?l?s?s?l?l?l +?u?s?l?s?s?l?l?u +?u?s?l?s?s?l?l?s +?u?s?l?s?s?l?u?l +?u?s?l?s?s?l?u?u +?u?s?l?s?s?l?u?s +?u?s?l?s?s?l?s?l +?u?s?l?s?s?l?s?u +?u?s?l?s?s?l?s?s +?u?s?l?s?s?u?l?l +?u?s?l?s?s?u?l?u +?u?s?l?s?s?u?l?s +?u?s?l?s?s?u?u?l +?u?s?l?s?s?u?u?u +?u?s?l?s?s?u?u?s +?u?s?l?s?s?u?s?l +?u?s?l?s?s?u?s?u +?u?s?l?s?s?u?s?s +?u?s?l?s?s?s?l?l +?u?s?l?s?s?s?l?u +?u?s?l?s?s?s?l?s +?u?s?l?s?s?s?u?l +?u?s?l?s?s?s?u?u +?u?s?l?s?s?s?u?s +?u?s?l?s?s?s?s?l +?u?s?l?s?s?s?s?u +?u?s?l?s?s?s?s?s +?u?s?u?d?d?d?d?d +?u?s?u?d?d?d?d?u +?u?s?u?d?d?d?d?s +?u?s?u?d?d?d?u?d +?u?s?u?d?d?d?u?u +?u?s?u?d?d?d?u?s +?u?s?u?d?d?d?s?d +?u?s?u?d?d?d?s?u +?u?s?u?d?d?d?s?s +?u?s?u?d?d?u?d?d +?u?s?u?d?d?u?d?u +?u?s?u?d?d?u?d?s +?u?s?u?d?d?u?u?d +?u?s?u?d?d?u?u?u +?u?s?u?d?d?u?u?s +?u?s?u?d?d?u?s?d +?u?s?u?d?d?u?s?u +?u?s?u?d?d?u?s?s +?u?s?u?d?d?s?d?d +?u?s?u?d?d?s?d?u +?u?s?u?d?d?s?d?s +?u?s?u?d?d?s?u?d +?u?s?u?d?d?s?u?u +?u?s?u?d?d?s?u?s +?u?s?u?d?d?s?s?d +?u?s?u?d?d?s?s?u +?u?s?u?d?d?s?s?s +?u?s?u?d?u?d?d?d +?u?s?u?d?u?d?d?u +?u?s?u?d?u?d?d?s +?u?s?u?d?u?d?u?d +?u?s?u?d?u?d?u?u +?u?s?u?d?u?d?u?s +?u?s?u?d?u?d?s?d +?u?s?u?d?u?d?s?u +?u?s?u?d?u?d?s?s +?u?s?u?d?u?u?d?d +?u?s?u?d?u?u?d?u +?u?s?u?d?u?u?d?s +?u?s?u?d?u?u?u?d +?u?s?u?d?u?u?u?u +?u?s?u?d?u?u?u?s +?u?s?u?d?u?u?s?d +?u?s?u?d?u?u?s?u +?u?s?u?d?u?u?s?s +?u?s?u?d?u?s?d?d +?u?s?u?d?u?s?d?u +?u?s?u?d?u?s?d?s +?u?s?u?d?u?s?u?d +?u?s?u?d?u?s?u?u +?u?s?u?d?u?s?u?s +?u?s?u?d?u?s?s?d +?u?s?u?d?u?s?s?u +?u?s?u?d?u?s?s?s +?u?s?u?d?s?d?d?d +?u?s?u?d?s?d?d?u +?u?s?u?d?s?d?d?s +?u?s?u?d?s?d?u?d +?u?s?u?d?s?d?u?u +?u?s?u?d?s?d?u?s +?u?s?u?d?s?d?s?d +?u?s?u?d?s?d?s?u +?u?s?u?d?s?d?s?s +?u?s?u?d?s?u?d?d +?u?s?u?d?s?u?d?u +?u?s?u?d?s?u?d?s +?u?s?u?d?s?u?u?d +?u?s?u?d?s?u?u?u +?u?s?u?d?s?u?u?s +?u?s?u?d?s?u?s?d +?u?s?u?d?s?u?s?u +?u?s?u?d?s?u?s?s +?u?s?u?d?s?s?d?d +?u?s?u?d?s?s?d?u +?u?s?u?d?s?s?d?s +?u?s?u?d?s?s?u?d +?u?s?u?d?s?s?u?u +?u?s?u?d?s?s?u?s +?u?s?u?d?s?s?s?d +?u?s?u?d?s?s?s?u +?u?s?u?d?s?s?s?s +?u?s?u?l?l?l?l?l +?u?s?u?l?l?l?l?u +?u?s?u?l?l?l?l?s +?u?s?u?l?l?l?u?l +?u?s?u?l?l?l?u?u +?u?s?u?l?l?l?u?s +?u?s?u?l?l?l?s?l +?u?s?u?l?l?l?s?u +?u?s?u?l?l?l?s?s +?u?s?u?l?l?u?l?l +?u?s?u?l?l?u?l?u +?u?s?u?l?l?u?l?s +?u?s?u?l?l?u?u?l +?u?s?u?l?l?u?u?u +?u?s?u?l?l?u?u?s +?u?s?u?l?l?u?s?l +?u?s?u?l?l?u?s?u +?u?s?u?l?l?u?s?s +?u?s?u?l?l?s?l?l +?u?s?u?l?l?s?l?u +?u?s?u?l?l?s?l?s +?u?s?u?l?l?s?u?l +?u?s?u?l?l?s?u?u +?u?s?u?l?l?s?u?s +?u?s?u?l?l?s?s?l +?u?s?u?l?l?s?s?u +?u?s?u?l?l?s?s?s +?u?s?u?l?u?l?l?l +?u?s?u?l?u?l?l?u +?u?s?u?l?u?l?l?s +?u?s?u?l?u?l?u?l +?u?s?u?l?u?l?u?u +?u?s?u?l?u?l?u?s +?u?s?u?l?u?l?s?l +?u?s?u?l?u?l?s?u +?u?s?u?l?u?l?s?s +?u?s?u?l?u?u?l?l +?u?s?u?l?u?u?l?u +?u?s?u?l?u?u?l?s +?u?s?u?l?u?u?u?l +?u?s?u?l?u?u?u?u +?u?s?u?l?u?u?u?s +?u?s?u?l?u?u?s?l +?u?s?u?l?u?u?s?u +?u?s?u?l?u?u?s?s +?u?s?u?l?u?s?l?l +?u?s?u?l?u?s?l?u +?u?s?u?l?u?s?l?s +?u?s?u?l?u?s?u?l +?u?s?u?l?u?s?u?u +?u?s?u?l?u?s?u?s +?u?s?u?l?u?s?s?l +?u?s?u?l?u?s?s?u +?u?s?u?l?u?s?s?s +?u?s?u?l?s?l?l?l +?u?s?u?l?s?l?l?u +?u?s?u?l?s?l?l?s +?u?s?u?l?s?l?u?l +?u?s?u?l?s?l?u?u +?u?s?u?l?s?l?u?s +?u?s?u?l?s?l?s?l +?u?s?u?l?s?l?s?u +?u?s?u?l?s?l?s?s +?u?s?u?l?s?u?l?l +?u?s?u?l?s?u?l?u +?u?s?u?l?s?u?l?s +?u?s?u?l?s?u?u?l +?u?s?u?l?s?u?u?u +?u?s?u?l?s?u?u?s +?u?s?u?l?s?u?s?l +?u?s?u?l?s?u?s?u +?u?s?u?l?s?u?s?s +?u?s?u?l?s?s?l?l +?u?s?u?l?s?s?l?u +?u?s?u?l?s?s?l?s +?u?s?u?l?s?s?u?l +?u?s?u?l?s?s?u?u +?u?s?u?l?s?s?u?s +?u?s?u?l?s?s?s?l +?u?s?u?l?s?s?s?u +?u?s?u?l?s?s?s?s +?u?s?u?u?d?d?d?d +?u?s?u?u?d?d?d?u +?u?s?u?u?d?d?d?s +?u?s?u?u?d?d?u?d +?u?s?u?u?d?d?u?u +?u?s?u?u?d?d?u?s +?u?s?u?u?d?d?s?d +?u?s?u?u?d?d?s?u +?u?s?u?u?d?d?s?s +?u?s?u?u?d?u?d?d +?u?s?u?u?d?u?d?u +?u?s?u?u?d?u?d?s +?u?s?u?u?d?u?u?d +?u?s?u?u?d?u?u?u +?u?s?u?u?d?u?u?s +?u?s?u?u?d?u?s?d +?u?s?u?u?d?u?s?u +?u?s?u?u?d?u?s?s +?u?s?u?u?d?s?d?d +?u?s?u?u?d?s?d?u +?u?s?u?u?d?s?d?s +?u?s?u?u?d?s?u?d +?u?s?u?u?d?s?u?u +?u?s?u?u?d?s?u?s +?u?s?u?u?d?s?s?d +?u?s?u?u?d?s?s?u +?u?s?u?u?d?s?s?s +?u?s?u?u?l?l?l?l +?u?s?u?u?l?l?l?u +?u?s?u?u?l?l?l?s +?u?s?u?u?l?l?u?l +?u?s?u?u?l?l?u?u +?u?s?u?u?l?l?u?s +?u?s?u?u?l?l?s?l +?u?s?u?u?l?l?s?u +?u?s?u?u?l?l?s?s +?u?s?u?u?l?u?l?l +?u?s?u?u?l?u?l?u +?u?s?u?u?l?u?l?s +?u?s?u?u?l?u?u?l +?u?s?u?u?l?u?u?u +?u?s?u?u?l?u?u?s +?u?s?u?u?l?u?s?l +?u?s?u?u?l?u?s?u +?u?s?u?u?l?u?s?s +?u?s?u?u?l?s?l?l +?u?s?u?u?l?s?l?u +?u?s?u?u?l?s?l?s +?u?s?u?u?l?s?u?l +?u?s?u?u?l?s?u?u +?u?s?u?u?l?s?u?s +?u?s?u?u?l?s?s?l +?u?s?u?u?l?s?s?u +?u?s?u?u?l?s?s?s +?u?s?u?u?u?d?d?d +?u?s?u?u?u?d?d?u +?u?s?u?u?u?d?d?s +?u?s?u?u?u?d?u?d +?u?s?u?u?u?d?u?u +?u?s?u?u?u?d?u?s +?u?s?u?u?u?d?s?d +?u?s?u?u?u?d?s?u +?u?s?u?u?u?d?s?s +?u?s?u?u?u?l?l?l +?u?s?u?u?u?l?l?u +?u?s?u?u?u?l?l?s +?u?s?u?u?u?l?u?l +?u?s?u?u?u?l?u?u +?u?s?u?u?u?l?u?s +?u?s?u?u?u?l?s?l +?u?s?u?u?u?l?s?u +?u?s?u?u?u?l?s?s +?u?s?u?u?u?u?d?d +?u?s?u?u?u?u?d?u +?u?s?u?u?u?u?d?s +?u?s?u?u?u?u?l?l +?u?s?u?u?u?u?l?u +?u?s?u?u?u?u?l?s +?u?s?u?u?u?u?u?d +?u?s?u?u?u?u?u?l +?u?s?u?u?u?u?u?u +?u?s?u?u?u?u?u?s +?u?s?u?u?u?u?s?d +?u?s?u?u?u?u?s?l +?u?s?u?u?u?u?s?u +?u?s?u?u?u?u?s?s +?u?s?u?u?u?s?d?d +?u?s?u?u?u?s?d?u +?u?s?u?u?u?s?d?s +?u?s?u?u?u?s?l?l +?u?s?u?u?u?s?l?u +?u?s?u?u?u?s?l?s +?u?s?u?u?u?s?u?d +?u?s?u?u?u?s?u?l +?u?s?u?u?u?s?u?u +?u?s?u?u?u?s?u?s +?u?s?u?u?u?s?s?d +?u?s?u?u?u?s?s?l +?u?s?u?u?u?s?s?u +?u?s?u?u?u?s?s?s +?u?s?u?u?s?d?d?d +?u?s?u?u?s?d?d?u +?u?s?u?u?s?d?d?s +?u?s?u?u?s?d?u?d +?u?s?u?u?s?d?u?u +?u?s?u?u?s?d?u?s +?u?s?u?u?s?d?s?d +?u?s?u?u?s?d?s?u +?u?s?u?u?s?d?s?s +?u?s?u?u?s?l?l?l +?u?s?u?u?s?l?l?u +?u?s?u?u?s?l?l?s +?u?s?u?u?s?l?u?l +?u?s?u?u?s?l?u?u +?u?s?u?u?s?l?u?s +?u?s?u?u?s?l?s?l +?u?s?u?u?s?l?s?u +?u?s?u?u?s?l?s?s +?u?s?u?u?s?u?d?d +?u?s?u?u?s?u?d?u +?u?s?u?u?s?u?d?s +?u?s?u?u?s?u?l?l +?u?s?u?u?s?u?l?u +?u?s?u?u?s?u?l?s +?u?s?u?u?s?u?u?d +?u?s?u?u?s?u?u?l +?u?s?u?u?s?u?u?u +?u?s?u?u?s?u?u?s +?u?s?u?u?s?u?s?d +?u?s?u?u?s?u?s?l +?u?s?u?u?s?u?s?u +?u?s?u?u?s?u?s?s +?u?s?u?u?s?s?d?d +?u?s?u?u?s?s?d?u +?u?s?u?u?s?s?d?s +?u?s?u?u?s?s?l?l +?u?s?u?u?s?s?l?u +?u?s?u?u?s?s?l?s +?u?s?u?u?s?s?u?d +?u?s?u?u?s?s?u?l +?u?s?u?u?s?s?u?u +?u?s?u?u?s?s?u?s +?u?s?u?u?s?s?s?d +?u?s?u?u?s?s?s?l +?u?s?u?u?s?s?s?u +?u?s?u?u?s?s?s?s +?u?s?u?s?d?d?d?d +?u?s?u?s?d?d?d?u +?u?s?u?s?d?d?d?s +?u?s?u?s?d?d?u?d +?u?s?u?s?d?d?u?u +?u?s?u?s?d?d?u?s +?u?s?u?s?d?d?s?d +?u?s?u?s?d?d?s?u +?u?s?u?s?d?d?s?s +?u?s?u?s?d?u?d?d +?u?s?u?s?d?u?d?u +?u?s?u?s?d?u?d?s +?u?s?u?s?d?u?u?d +?u?s?u?s?d?u?u?u +?u?s?u?s?d?u?u?s +?u?s?u?s?d?u?s?d +?u?s?u?s?d?u?s?u +?u?s?u?s?d?u?s?s +?u?s?u?s?d?s?d?d +?u?s?u?s?d?s?d?u +?u?s?u?s?d?s?d?s +?u?s?u?s?d?s?u?d +?u?s?u?s?d?s?u?u +?u?s?u?s?d?s?u?s +?u?s?u?s?d?s?s?d +?u?s?u?s?d?s?s?u +?u?s?u?s?d?s?s?s +?u?s?u?s?l?l?l?l +?u?s?u?s?l?l?l?u +?u?s?u?s?l?l?l?s +?u?s?u?s?l?l?u?l +?u?s?u?s?l?l?u?u +?u?s?u?s?l?l?u?s +?u?s?u?s?l?l?s?l +?u?s?u?s?l?l?s?u +?u?s?u?s?l?l?s?s +?u?s?u?s?l?u?l?l +?u?s?u?s?l?u?l?u +?u?s?u?s?l?u?l?s +?u?s?u?s?l?u?u?l +?u?s?u?s?l?u?u?u +?u?s?u?s?l?u?u?s +?u?s?u?s?l?u?s?l +?u?s?u?s?l?u?s?u +?u?s?u?s?l?u?s?s +?u?s?u?s?l?s?l?l +?u?s?u?s?l?s?l?u +?u?s?u?s?l?s?l?s +?u?s?u?s?l?s?u?l +?u?s?u?s?l?s?u?u +?u?s?u?s?l?s?u?s +?u?s?u?s?l?s?s?l +?u?s?u?s?l?s?s?u +?u?s?u?s?l?s?s?s +?u?s?u?s?u?d?d?d +?u?s?u?s?u?d?d?u +?u?s?u?s?u?d?d?s +?u?s?u?s?u?d?u?d +?u?s?u?s?u?d?u?u +?u?s?u?s?u?d?u?s +?u?s?u?s?u?d?s?d +?u?s?u?s?u?d?s?u +?u?s?u?s?u?d?s?s +?u?s?u?s?u?l?l?l +?u?s?u?s?u?l?l?u +?u?s?u?s?u?l?l?s +?u?s?u?s?u?l?u?l +?u?s?u?s?u?l?u?u +?u?s?u?s?u?l?u?s +?u?s?u?s?u?l?s?l +?u?s?u?s?u?l?s?u +?u?s?u?s?u?l?s?s +?u?s?u?s?u?u?d?d +?u?s?u?s?u?u?d?u +?u?s?u?s?u?u?d?s +?u?s?u?s?u?u?l?l +?u?s?u?s?u?u?l?u +?u?s?u?s?u?u?l?s +?u?s?u?s?u?u?u?d +?u?s?u?s?u?u?u?l +?u?s?u?s?u?u?u?u +?u?s?u?s?u?u?u?s +?u?s?u?s?u?u?s?d +?u?s?u?s?u?u?s?l +?u?s?u?s?u?u?s?u +?u?s?u?s?u?u?s?s +?u?s?u?s?u?s?d?d +?u?s?u?s?u?s?d?u +?u?s?u?s?u?s?d?s +?u?s?u?s?u?s?l?l +?u?s?u?s?u?s?l?u +?u?s?u?s?u?s?l?s +?u?s?u?s?u?s?u?d +?u?s?u?s?u?s?u?l +?u?s?u?s?u?s?u?u +?u?s?u?s?u?s?u?s +?u?s?u?s?u?s?s?d +?u?s?u?s?u?s?s?l +?u?s?u?s?u?s?s?u +?u?s?u?s?u?s?s?s +?u?s?u?s?s?d?d?d +?u?s?u?s?s?d?d?u +?u?s?u?s?s?d?d?s +?u?s?u?s?s?d?u?d +?u?s?u?s?s?d?u?u +?u?s?u?s?s?d?u?s +?u?s?u?s?s?d?s?d +?u?s?u?s?s?d?s?u +?u?s?u?s?s?d?s?s +?u?s?u?s?s?l?l?l +?u?s?u?s?s?l?l?u +?u?s?u?s?s?l?l?s +?u?s?u?s?s?l?u?l +?u?s?u?s?s?l?u?u +?u?s?u?s?s?l?u?s +?u?s?u?s?s?l?s?l +?u?s?u?s?s?l?s?u +?u?s?u?s?s?l?s?s +?u?s?u?s?s?u?d?d +?u?s?u?s?s?u?d?u +?u?s?u?s?s?u?d?s +?u?s?u?s?s?u?l?l +?u?s?u?s?s?u?l?u +?u?s?u?s?s?u?l?s +?u?s?u?s?s?u?u?d +?u?s?u?s?s?u?u?l +?u?s?u?s?s?u?u?u +?u?s?u?s?s?u?u?s +?u?s?u?s?s?u?s?d +?u?s?u?s?s?u?s?l +?u?s?u?s?s?u?s?u +?u?s?u?s?s?u?s?s +?u?s?u?s?s?s?d?d +?u?s?u?s?s?s?d?u +?u?s?u?s?s?s?d?s +?u?s?u?s?s?s?l?l +?u?s?u?s?s?s?l?u +?u?s?u?s?s?s?l?s +?u?s?u?s?s?s?u?d +?u?s?u?s?s?s?u?l +?u?s?u?s?s?s?u?u +?u?s?u?s?s?s?u?s +?u?s?u?s?s?s?s?d +?u?s?u?s?s?s?s?l +?u?s?u?s?s?s?s?u +?u?s?u?s?s?s?s?s +?u?s?s?d?d?d?d?d +?u?s?s?d?d?d?d?u +?u?s?s?d?d?d?d?s +?u?s?s?d?d?d?u?d +?u?s?s?d?d?d?u?u +?u?s?s?d?d?d?u?s +?u?s?s?d?d?d?s?d +?u?s?s?d?d?d?s?u +?u?s?s?d?d?d?s?s +?u?s?s?d?d?u?d?d +?u?s?s?d?d?u?d?u +?u?s?s?d?d?u?d?s +?u?s?s?d?d?u?u?d +?u?s?s?d?d?u?u?u +?u?s?s?d?d?u?u?s +?u?s?s?d?d?u?s?d +?u?s?s?d?d?u?s?u +?u?s?s?d?d?u?s?s +?u?s?s?d?d?s?d?d +?u?s?s?d?d?s?d?u +?u?s?s?d?d?s?d?s +?u?s?s?d?d?s?u?d +?u?s?s?d?d?s?u?u +?u?s?s?d?d?s?u?s +?u?s?s?d?d?s?s?d +?u?s?s?d?d?s?s?u +?u?s?s?d?d?s?s?s +?u?s?s?d?u?d?d?d +?u?s?s?d?u?d?d?u +?u?s?s?d?u?d?d?s +?u?s?s?d?u?d?u?d +?u?s?s?d?u?d?u?u +?u?s?s?d?u?d?u?s +?u?s?s?d?u?d?s?d +?u?s?s?d?u?d?s?u +?u?s?s?d?u?d?s?s +?u?s?s?d?u?u?d?d +?u?s?s?d?u?u?d?u +?u?s?s?d?u?u?d?s +?u?s?s?d?u?u?u?d +?u?s?s?d?u?u?u?u +?u?s?s?d?u?u?u?s +?u?s?s?d?u?u?s?d +?u?s?s?d?u?u?s?u +?u?s?s?d?u?u?s?s +?u?s?s?d?u?s?d?d +?u?s?s?d?u?s?d?u +?u?s?s?d?u?s?d?s +?u?s?s?d?u?s?u?d +?u?s?s?d?u?s?u?u +?u?s?s?d?u?s?u?s +?u?s?s?d?u?s?s?d +?u?s?s?d?u?s?s?u +?u?s?s?d?u?s?s?s +?u?s?s?d?s?d?d?d +?u?s?s?d?s?d?d?u +?u?s?s?d?s?d?d?s +?u?s?s?d?s?d?u?d +?u?s?s?d?s?d?u?u +?u?s?s?d?s?d?u?s +?u?s?s?d?s?d?s?d +?u?s?s?d?s?d?s?u +?u?s?s?d?s?d?s?s +?u?s?s?d?s?u?d?d +?u?s?s?d?s?u?d?u +?u?s?s?d?s?u?d?s +?u?s?s?d?s?u?u?d +?u?s?s?d?s?u?u?u +?u?s?s?d?s?u?u?s +?u?s?s?d?s?u?s?d +?u?s?s?d?s?u?s?u +?u?s?s?d?s?u?s?s +?u?s?s?d?s?s?d?d +?u?s?s?d?s?s?d?u +?u?s?s?d?s?s?d?s +?u?s?s?d?s?s?u?d +?u?s?s?d?s?s?u?u +?u?s?s?d?s?s?u?s +?u?s?s?d?s?s?s?d +?u?s?s?d?s?s?s?u +?u?s?s?d?s?s?s?s +?u?s?s?l?l?l?l?l +?u?s?s?l?l?l?l?u +?u?s?s?l?l?l?l?s +?u?s?s?l?l?l?u?l +?u?s?s?l?l?l?u?u +?u?s?s?l?l?l?u?s +?u?s?s?l?l?l?s?l +?u?s?s?l?l?l?s?u +?u?s?s?l?l?l?s?s +?u?s?s?l?l?u?l?l +?u?s?s?l?l?u?l?u +?u?s?s?l?l?u?l?s +?u?s?s?l?l?u?u?l +?u?s?s?l?l?u?u?u +?u?s?s?l?l?u?u?s +?u?s?s?l?l?u?s?l +?u?s?s?l?l?u?s?u +?u?s?s?l?l?u?s?s +?u?s?s?l?l?s?l?l +?u?s?s?l?l?s?l?u +?u?s?s?l?l?s?l?s +?u?s?s?l?l?s?u?l +?u?s?s?l?l?s?u?u +?u?s?s?l?l?s?u?s +?u?s?s?l?l?s?s?l +?u?s?s?l?l?s?s?u +?u?s?s?l?l?s?s?s +?u?s?s?l?u?l?l?l +?u?s?s?l?u?l?l?u +?u?s?s?l?u?l?l?s +?u?s?s?l?u?l?u?l +?u?s?s?l?u?l?u?u +?u?s?s?l?u?l?u?s +?u?s?s?l?u?l?s?l +?u?s?s?l?u?l?s?u +?u?s?s?l?u?l?s?s +?u?s?s?l?u?u?l?l +?u?s?s?l?u?u?l?u +?u?s?s?l?u?u?l?s +?u?s?s?l?u?u?u?l +?u?s?s?l?u?u?u?u +?u?s?s?l?u?u?u?s +?u?s?s?l?u?u?s?l +?u?s?s?l?u?u?s?u +?u?s?s?l?u?u?s?s +?u?s?s?l?u?s?l?l +?u?s?s?l?u?s?l?u +?u?s?s?l?u?s?l?s +?u?s?s?l?u?s?u?l +?u?s?s?l?u?s?u?u +?u?s?s?l?u?s?u?s +?u?s?s?l?u?s?s?l +?u?s?s?l?u?s?s?u +?u?s?s?l?u?s?s?s +?u?s?s?l?s?l?l?l +?u?s?s?l?s?l?l?u +?u?s?s?l?s?l?l?s +?u?s?s?l?s?l?u?l +?u?s?s?l?s?l?u?u +?u?s?s?l?s?l?u?s +?u?s?s?l?s?l?s?l +?u?s?s?l?s?l?s?u +?u?s?s?l?s?l?s?s +?u?s?s?l?s?u?l?l +?u?s?s?l?s?u?l?u +?u?s?s?l?s?u?l?s +?u?s?s?l?s?u?u?l +?u?s?s?l?s?u?u?u +?u?s?s?l?s?u?u?s +?u?s?s?l?s?u?s?l +?u?s?s?l?s?u?s?u +?u?s?s?l?s?u?s?s +?u?s?s?l?s?s?l?l +?u?s?s?l?s?s?l?u +?u?s?s?l?s?s?l?s +?u?s?s?l?s?s?u?l +?u?s?s?l?s?s?u?u +?u?s?s?l?s?s?u?s +?u?s?s?l?s?s?s?l +?u?s?s?l?s?s?s?u +?u?s?s?l?s?s?s?s +?u?s?s?u?d?d?d?d +?u?s?s?u?d?d?d?u +?u?s?s?u?d?d?d?s +?u?s?s?u?d?d?u?d +?u?s?s?u?d?d?u?u +?u?s?s?u?d?d?u?s +?u?s?s?u?d?d?s?d +?u?s?s?u?d?d?s?u +?u?s?s?u?d?d?s?s +?u?s?s?u?d?u?d?d +?u?s?s?u?d?u?d?u +?u?s?s?u?d?u?d?s +?u?s?s?u?d?u?u?d +?u?s?s?u?d?u?u?u +?u?s?s?u?d?u?u?s +?u?s?s?u?d?u?s?d +?u?s?s?u?d?u?s?u +?u?s?s?u?d?u?s?s +?u?s?s?u?d?s?d?d +?u?s?s?u?d?s?d?u +?u?s?s?u?d?s?d?s +?u?s?s?u?d?s?u?d +?u?s?s?u?d?s?u?u +?u?s?s?u?d?s?u?s +?u?s?s?u?d?s?s?d +?u?s?s?u?d?s?s?u +?u?s?s?u?d?s?s?s +?u?s?s?u?l?l?l?l +?u?s?s?u?l?l?l?u +?u?s?s?u?l?l?l?s +?u?s?s?u?l?l?u?l +?u?s?s?u?l?l?u?u +?u?s?s?u?l?l?u?s +?u?s?s?u?l?l?s?l +?u?s?s?u?l?l?s?u +?u?s?s?u?l?l?s?s +?u?s?s?u?l?u?l?l +?u?s?s?u?l?u?l?u +?u?s?s?u?l?u?l?s +?u?s?s?u?l?u?u?l +?u?s?s?u?l?u?u?u +?u?s?s?u?l?u?u?s +?u?s?s?u?l?u?s?l +?u?s?s?u?l?u?s?u +?u?s?s?u?l?u?s?s +?u?s?s?u?l?s?l?l +?u?s?s?u?l?s?l?u +?u?s?s?u?l?s?l?s +?u?s?s?u?l?s?u?l +?u?s?s?u?l?s?u?u +?u?s?s?u?l?s?u?s +?u?s?s?u?l?s?s?l +?u?s?s?u?l?s?s?u +?u?s?s?u?l?s?s?s +?u?s?s?u?u?d?d?d +?u?s?s?u?u?d?d?u +?u?s?s?u?u?d?d?s +?u?s?s?u?u?d?u?d +?u?s?s?u?u?d?u?u +?u?s?s?u?u?d?u?s +?u?s?s?u?u?d?s?d +?u?s?s?u?u?d?s?u +?u?s?s?u?u?d?s?s +?u?s?s?u?u?l?l?l +?u?s?s?u?u?l?l?u +?u?s?s?u?u?l?l?s +?u?s?s?u?u?l?u?l +?u?s?s?u?u?l?u?u +?u?s?s?u?u?l?u?s +?u?s?s?u?u?l?s?l +?u?s?s?u?u?l?s?u +?u?s?s?u?u?l?s?s +?u?s?s?u?u?u?d?d +?u?s?s?u?u?u?d?u +?u?s?s?u?u?u?d?s +?u?s?s?u?u?u?l?l +?u?s?s?u?u?u?l?u +?u?s?s?u?u?u?l?s +?u?s?s?u?u?u?u?d +?u?s?s?u?u?u?u?l +?u?s?s?u?u?u?u?u +?u?s?s?u?u?u?u?s +?u?s?s?u?u?u?s?d +?u?s?s?u?u?u?s?l +?u?s?s?u?u?u?s?u +?u?s?s?u?u?u?s?s +?u?s?s?u?u?s?d?d +?u?s?s?u?u?s?d?u +?u?s?s?u?u?s?d?s +?u?s?s?u?u?s?l?l +?u?s?s?u?u?s?l?u +?u?s?s?u?u?s?l?s +?u?s?s?u?u?s?u?d +?u?s?s?u?u?s?u?l +?u?s?s?u?u?s?u?u +?u?s?s?u?u?s?u?s +?u?s?s?u?u?s?s?d +?u?s?s?u?u?s?s?l +?u?s?s?u?u?s?s?u +?u?s?s?u?u?s?s?s +?u?s?s?u?s?d?d?d +?u?s?s?u?s?d?d?u +?u?s?s?u?s?d?d?s +?u?s?s?u?s?d?u?d +?u?s?s?u?s?d?u?u +?u?s?s?u?s?d?u?s +?u?s?s?u?s?d?s?d +?u?s?s?u?s?d?s?u +?u?s?s?u?s?d?s?s +?u?s?s?u?s?l?l?l +?u?s?s?u?s?l?l?u +?u?s?s?u?s?l?l?s +?u?s?s?u?s?l?u?l +?u?s?s?u?s?l?u?u +?u?s?s?u?s?l?u?s +?u?s?s?u?s?l?s?l +?u?s?s?u?s?l?s?u +?u?s?s?u?s?l?s?s +?u?s?s?u?s?u?d?d +?u?s?s?u?s?u?d?u +?u?s?s?u?s?u?d?s +?u?s?s?u?s?u?l?l +?u?s?s?u?s?u?l?u +?u?s?s?u?s?u?l?s +?u?s?s?u?s?u?u?d +?u?s?s?u?s?u?u?l +?u?s?s?u?s?u?u?u +?u?s?s?u?s?u?u?s +?u?s?s?u?s?u?s?d +?u?s?s?u?s?u?s?l +?u?s?s?u?s?u?s?u +?u?s?s?u?s?u?s?s +?u?s?s?u?s?s?d?d +?u?s?s?u?s?s?d?u +?u?s?s?u?s?s?d?s +?u?s?s?u?s?s?l?l +?u?s?s?u?s?s?l?u +?u?s?s?u?s?s?l?s +?u?s?s?u?s?s?u?d +?u?s?s?u?s?s?u?l +?u?s?s?u?s?s?u?u +?u?s?s?u?s?s?u?s +?u?s?s?u?s?s?s?d +?u?s?s?u?s?s?s?l +?u?s?s?u?s?s?s?u +?u?s?s?u?s?s?s?s +?u?s?s?s?d?d?d?d +?u?s?s?s?d?d?d?u +?u?s?s?s?d?d?d?s +?u?s?s?s?d?d?u?d +?u?s?s?s?d?d?u?u +?u?s?s?s?d?d?u?s +?u?s?s?s?d?d?s?d +?u?s?s?s?d?d?s?u +?u?s?s?s?d?d?s?s +?u?s?s?s?d?u?d?d +?u?s?s?s?d?u?d?u +?u?s?s?s?d?u?d?s +?u?s?s?s?d?u?u?d +?u?s?s?s?d?u?u?u +?u?s?s?s?d?u?u?s +?u?s?s?s?d?u?s?d +?u?s?s?s?d?u?s?u +?u?s?s?s?d?u?s?s +?u?s?s?s?d?s?d?d +?u?s?s?s?d?s?d?u +?u?s?s?s?d?s?d?s +?u?s?s?s?d?s?u?d +?u?s?s?s?d?s?u?u +?u?s?s?s?d?s?u?s +?u?s?s?s?d?s?s?d +?u?s?s?s?d?s?s?u +?u?s?s?s?d?s?s?s +?u?s?s?s?l?l?l?l +?u?s?s?s?l?l?l?u +?u?s?s?s?l?l?l?s +?u?s?s?s?l?l?u?l +?u?s?s?s?l?l?u?u +?u?s?s?s?l?l?u?s +?u?s?s?s?l?l?s?l +?u?s?s?s?l?l?s?u +?u?s?s?s?l?l?s?s +?u?s?s?s?l?u?l?l +?u?s?s?s?l?u?l?u +?u?s?s?s?l?u?l?s +?u?s?s?s?l?u?u?l +?u?s?s?s?l?u?u?u +?u?s?s?s?l?u?u?s +?u?s?s?s?l?u?s?l +?u?s?s?s?l?u?s?u +?u?s?s?s?l?u?s?s +?u?s?s?s?l?s?l?l +?u?s?s?s?l?s?l?u +?u?s?s?s?l?s?l?s +?u?s?s?s?l?s?u?l +?u?s?s?s?l?s?u?u +?u?s?s?s?l?s?u?s +?u?s?s?s?l?s?s?l +?u?s?s?s?l?s?s?u +?u?s?s?s?l?s?s?s +?u?s?s?s?u?d?d?d +?u?s?s?s?u?d?d?u +?u?s?s?s?u?d?d?s +?u?s?s?s?u?d?u?d +?u?s?s?s?u?d?u?u +?u?s?s?s?u?d?u?s +?u?s?s?s?u?d?s?d +?u?s?s?s?u?d?s?u +?u?s?s?s?u?d?s?s +?u?s?s?s?u?l?l?l +?u?s?s?s?u?l?l?u +?u?s?s?s?u?l?l?s +?u?s?s?s?u?l?u?l +?u?s?s?s?u?l?u?u +?u?s?s?s?u?l?u?s +?u?s?s?s?u?l?s?l +?u?s?s?s?u?l?s?u +?u?s?s?s?u?l?s?s +?u?s?s?s?u?u?d?d +?u?s?s?s?u?u?d?u +?u?s?s?s?u?u?d?s +?u?s?s?s?u?u?l?l +?u?s?s?s?u?u?l?u +?u?s?s?s?u?u?l?s +?u?s?s?s?u?u?u?d +?u?s?s?s?u?u?u?l +?u?s?s?s?u?u?u?u +?u?s?s?s?u?u?u?s +?u?s?s?s?u?u?s?d +?u?s?s?s?u?u?s?l +?u?s?s?s?u?u?s?u +?u?s?s?s?u?u?s?s +?u?s?s?s?u?s?d?d +?u?s?s?s?u?s?d?u +?u?s?s?s?u?s?d?s +?u?s?s?s?u?s?l?l +?u?s?s?s?u?s?l?u +?u?s?s?s?u?s?l?s +?u?s?s?s?u?s?u?d +?u?s?s?s?u?s?u?l +?u?s?s?s?u?s?u?u +?u?s?s?s?u?s?u?s +?u?s?s?s?u?s?s?d +?u?s?s?s?u?s?s?l +?u?s?s?s?u?s?s?u +?u?s?s?s?u?s?s?s +?u?s?s?s?s?d?d?d +?u?s?s?s?s?d?d?u +?u?s?s?s?s?d?d?s +?u?s?s?s?s?d?u?d +?u?s?s?s?s?d?u?u +?u?s?s?s?s?d?u?s +?u?s?s?s?s?d?s?d +?u?s?s?s?s?d?s?u +?u?s?s?s?s?d?s?s +?u?s?s?s?s?l?l?l +?u?s?s?s?s?l?l?u +?u?s?s?s?s?l?l?s +?u?s?s?s?s?l?u?l +?u?s?s?s?s?l?u?u +?u?s?s?s?s?l?u?s +?u?s?s?s?s?l?s?l +?u?s?s?s?s?l?s?u +?u?s?s?s?s?l?s?s +?u?s?s?s?s?u?d?d +?u?s?s?s?s?u?d?u +?u?s?s?s?s?u?d?s +?u?s?s?s?s?u?l?l +?u?s?s?s?s?u?l?u +?u?s?s?s?s?u?l?s +?u?s?s?s?s?u?u?d +?u?s?s?s?s?u?u?l +?u?s?s?s?s?u?u?u +?u?s?s?s?s?u?u?s +?u?s?s?s?s?u?s?d +?u?s?s?s?s?u?s?l +?u?s?s?s?s?u?s?u +?u?s?s?s?s?u?s?s +?u?s?s?s?s?s?d?d +?u?s?s?s?s?s?d?u +?u?s?s?s?s?s?d?s +?u?s?s?s?s?s?l?l +?u?s?s?s?s?s?l?u +?u?s?s?s?s?s?l?s +?u?s?s?s?s?s?u?d +?u?s?s?s?s?s?u?l +?u?s?s?s?s?s?u?u +?u?s?s?s?s?s?u?s +?u?s?s?s?s?s?s?d +?u?s?s?s?s?s?s?l +?u?s?s?s?s?s?s?u +?u?s?s?s?s?s?s?s +?s?d?d?d?d?d?d?d +?s?d?d?d?d?d?d?l +?s?d?d?d?d?d?d?u +?s?d?d?d?d?d?d?s +?s?d?d?d?d?d?l?d +?s?d?d?d?d?d?l?l +?s?d?d?d?d?d?l?s +?s?d?d?d?d?d?u?d +?s?d?d?d?d?d?u?u +?s?d?d?d?d?d?u?s +?s?d?d?d?d?d?s?d +?s?d?d?d?d?d?s?l +?s?d?d?d?d?d?s?u +?s?d?d?d?d?d?s?s +?s?d?d?d?d?l?d?d +?s?d?d?d?d?l?d?l +?s?d?d?d?d?l?d?s +?s?d?d?d?d?l?l?d +?s?d?d?d?d?l?l?l +?s?d?d?d?d?l?l?s +?s?d?d?d?d?l?s?d +?s?d?d?d?d?l?s?l +?s?d?d?d?d?l?s?s +?s?d?d?d?d?u?d?d +?s?d?d?d?d?u?d?u +?s?d?d?d?d?u?d?s +?s?d?d?d?d?u?u?d +?s?d?d?d?d?u?u?u +?s?d?d?d?d?u?u?s +?s?d?d?d?d?u?s?d +?s?d?d?d?d?u?s?u +?s?d?d?d?d?u?s?s +?s?d?d?d?d?s?d?d +?s?d?d?d?d?s?d?l +?s?d?d?d?d?s?d?u +?s?d?d?d?d?s?d?s +?s?d?d?d?d?s?l?d +?s?d?d?d?d?s?l?l +?s?d?d?d?d?s?l?s +?s?d?d?d?d?s?u?d +?s?d?d?d?d?s?u?u +?s?d?d?d?d?s?u?s +?s?d?d?d?d?s?s?d +?s?d?d?d?d?s?s?l +?s?d?d?d?d?s?s?u +?s?d?d?d?d?s?s?s +?s?d?d?d?l?d?d?d +?s?d?d?d?l?d?d?l +?s?d?d?d?l?d?d?s +?s?d?d?d?l?d?l?d +?s?d?d?d?l?d?l?l +?s?d?d?d?l?d?l?s +?s?d?d?d?l?d?s?d +?s?d?d?d?l?d?s?l +?s?d?d?d?l?d?s?s +?s?d?d?d?l?l?d?d +?s?d?d?d?l?l?d?l +?s?d?d?d?l?l?d?s +?s?d?d?d?l?l?l?d +?s?d?d?d?l?l?l?l +?s?d?d?d?l?l?l?s +?s?d?d?d?l?l?s?d +?s?d?d?d?l?l?s?l +?s?d?d?d?l?l?s?s +?s?d?d?d?l?s?d?d +?s?d?d?d?l?s?d?l +?s?d?d?d?l?s?d?s +?s?d?d?d?l?s?l?d +?s?d?d?d?l?s?l?l +?s?d?d?d?l?s?l?s +?s?d?d?d?l?s?s?d +?s?d?d?d?l?s?s?l +?s?d?d?d?l?s?s?s +?s?d?d?d?u?d?d?d +?s?d?d?d?u?d?d?u +?s?d?d?d?u?d?d?s +?s?d?d?d?u?d?u?d +?s?d?d?d?u?d?u?u +?s?d?d?d?u?d?u?s +?s?d?d?d?u?d?s?d +?s?d?d?d?u?d?s?u +?s?d?d?d?u?d?s?s +?s?d?d?d?u?u?d?d +?s?d?d?d?u?u?d?u +?s?d?d?d?u?u?d?s +?s?d?d?d?u?u?u?d +?s?d?d?d?u?u?u?u +?s?d?d?d?u?u?u?s +?s?d?d?d?u?u?s?d +?s?d?d?d?u?u?s?u +?s?d?d?d?u?u?s?s +?s?d?d?d?u?s?d?d +?s?d?d?d?u?s?d?u +?s?d?d?d?u?s?d?s +?s?d?d?d?u?s?u?d +?s?d?d?d?u?s?u?u +?s?d?d?d?u?s?u?s +?s?d?d?d?u?s?s?d +?s?d?d?d?u?s?s?u +?s?d?d?d?u?s?s?s +?s?d?d?d?s?d?d?d +?s?d?d?d?s?d?d?l +?s?d?d?d?s?d?d?u +?s?d?d?d?s?d?d?s +?s?d?d?d?s?d?l?d +?s?d?d?d?s?d?l?l +?s?d?d?d?s?d?l?s +?s?d?d?d?s?d?u?d +?s?d?d?d?s?d?u?u +?s?d?d?d?s?d?u?s +?s?d?d?d?s?d?s?d +?s?d?d?d?s?d?s?l +?s?d?d?d?s?d?s?u +?s?d?d?d?s?d?s?s +?s?d?d?d?s?l?d?d +?s?d?d?d?s?l?d?l +?s?d?d?d?s?l?d?s +?s?d?d?d?s?l?l?d +?s?d?d?d?s?l?l?l +?s?d?d?d?s?l?l?s +?s?d?d?d?s?l?s?d +?s?d?d?d?s?l?s?l +?s?d?d?d?s?l?s?s +?s?d?d?d?s?u?d?d +?s?d?d?d?s?u?d?u +?s?d?d?d?s?u?d?s +?s?d?d?d?s?u?u?d +?s?d?d?d?s?u?u?u +?s?d?d?d?s?u?u?s +?s?d?d?d?s?u?s?d +?s?d?d?d?s?u?s?u +?s?d?d?d?s?u?s?s +?s?d?d?d?s?s?d?d +?s?d?d?d?s?s?d?l +?s?d?d?d?s?s?d?u +?s?d?d?d?s?s?d?s +?s?d?d?d?s?s?l?d +?s?d?d?d?s?s?l?l +?s?d?d?d?s?s?l?s +?s?d?d?d?s?s?u?d +?s?d?d?d?s?s?u?u +?s?d?d?d?s?s?u?s +?s?d?d?d?s?s?s?d +?s?d?d?d?s?s?s?l +?s?d?d?d?s?s?s?u +?s?d?d?d?s?s?s?s +?s?d?d?l?d?d?d?d +?s?d?d?l?d?d?d?l +?s?d?d?l?d?d?d?s +?s?d?d?l?d?d?l?d +?s?d?d?l?d?d?l?l +?s?d?d?l?d?d?l?s +?s?d?d?l?d?d?s?d +?s?d?d?l?d?d?s?l +?s?d?d?l?d?d?s?s +?s?d?d?l?d?l?d?d +?s?d?d?l?d?l?d?l +?s?d?d?l?d?l?d?s +?s?d?d?l?d?l?l?d +?s?d?d?l?d?l?l?l +?s?d?d?l?d?l?l?s +?s?d?d?l?d?l?s?d +?s?d?d?l?d?l?s?l +?s?d?d?l?d?l?s?s +?s?d?d?l?d?s?d?d +?s?d?d?l?d?s?d?l +?s?d?d?l?d?s?d?s +?s?d?d?l?d?s?l?d +?s?d?d?l?d?s?l?l +?s?d?d?l?d?s?l?s +?s?d?d?l?d?s?s?d +?s?d?d?l?d?s?s?l +?s?d?d?l?d?s?s?s +?s?d?d?l?l?d?d?d +?s?d?d?l?l?d?d?l +?s?d?d?l?l?d?d?s +?s?d?d?l?l?d?l?d +?s?d?d?l?l?d?l?l +?s?d?d?l?l?d?l?s +?s?d?d?l?l?d?s?d +?s?d?d?l?l?d?s?l +?s?d?d?l?l?d?s?s +?s?d?d?l?l?l?d?d +?s?d?d?l?l?l?d?l +?s?d?d?l?l?l?d?s +?s?d?d?l?l?l?l?d +?s?d?d?l?l?l?l?l +?s?d?d?l?l?l?l?s +?s?d?d?l?l?l?s?d +?s?d?d?l?l?l?s?l +?s?d?d?l?l?l?s?s +?s?d?d?l?l?s?d?d +?s?d?d?l?l?s?d?l +?s?d?d?l?l?s?d?s +?s?d?d?l?l?s?l?d +?s?d?d?l?l?s?l?l +?s?d?d?l?l?s?l?s +?s?d?d?l?l?s?s?d +?s?d?d?l?l?s?s?l +?s?d?d?l?l?s?s?s +?s?d?d?l?s?d?d?d +?s?d?d?l?s?d?d?l +?s?d?d?l?s?d?d?s +?s?d?d?l?s?d?l?d +?s?d?d?l?s?d?l?l +?s?d?d?l?s?d?l?s +?s?d?d?l?s?d?s?d +?s?d?d?l?s?d?s?l +?s?d?d?l?s?d?s?s +?s?d?d?l?s?l?d?d +?s?d?d?l?s?l?d?l +?s?d?d?l?s?l?d?s +?s?d?d?l?s?l?l?d +?s?d?d?l?s?l?l?l +?s?d?d?l?s?l?l?s +?s?d?d?l?s?l?s?d +?s?d?d?l?s?l?s?l +?s?d?d?l?s?l?s?s +?s?d?d?l?s?s?d?d +?s?d?d?l?s?s?d?l +?s?d?d?l?s?s?d?s +?s?d?d?l?s?s?l?d +?s?d?d?l?s?s?l?l +?s?d?d?l?s?s?l?s +?s?d?d?l?s?s?s?d +?s?d?d?l?s?s?s?l +?s?d?d?l?s?s?s?s +?s?d?d?u?d?d?d?d +?s?d?d?u?d?d?d?u +?s?d?d?u?d?d?d?s +?s?d?d?u?d?d?u?d +?s?d?d?u?d?d?u?u +?s?d?d?u?d?d?u?s +?s?d?d?u?d?d?s?d +?s?d?d?u?d?d?s?u +?s?d?d?u?d?d?s?s +?s?d?d?u?d?u?d?d +?s?d?d?u?d?u?d?u +?s?d?d?u?d?u?d?s +?s?d?d?u?d?u?u?d +?s?d?d?u?d?u?u?u +?s?d?d?u?d?u?u?s +?s?d?d?u?d?u?s?d +?s?d?d?u?d?u?s?u +?s?d?d?u?d?u?s?s +?s?d?d?u?d?s?d?d +?s?d?d?u?d?s?d?u +?s?d?d?u?d?s?d?s +?s?d?d?u?d?s?u?d +?s?d?d?u?d?s?u?u +?s?d?d?u?d?s?u?s +?s?d?d?u?d?s?s?d +?s?d?d?u?d?s?s?u +?s?d?d?u?d?s?s?s +?s?d?d?u?u?d?d?d +?s?d?d?u?u?d?d?u +?s?d?d?u?u?d?d?s +?s?d?d?u?u?d?u?d +?s?d?d?u?u?d?u?u +?s?d?d?u?u?d?u?s +?s?d?d?u?u?d?s?d +?s?d?d?u?u?d?s?u +?s?d?d?u?u?d?s?s +?s?d?d?u?u?u?d?d +?s?d?d?u?u?u?d?u +?s?d?d?u?u?u?d?s +?s?d?d?u?u?u?u?d +?s?d?d?u?u?u?u?u +?s?d?d?u?u?u?u?s +?s?d?d?u?u?u?s?d +?s?d?d?u?u?u?s?u +?s?d?d?u?u?u?s?s +?s?d?d?u?u?s?d?d +?s?d?d?u?u?s?d?u +?s?d?d?u?u?s?d?s +?s?d?d?u?u?s?u?d +?s?d?d?u?u?s?u?u +?s?d?d?u?u?s?u?s +?s?d?d?u?u?s?s?d +?s?d?d?u?u?s?s?u +?s?d?d?u?u?s?s?s +?s?d?d?u?s?d?d?d +?s?d?d?u?s?d?d?u +?s?d?d?u?s?d?d?s +?s?d?d?u?s?d?u?d +?s?d?d?u?s?d?u?u +?s?d?d?u?s?d?u?s +?s?d?d?u?s?d?s?d +?s?d?d?u?s?d?s?u +?s?d?d?u?s?d?s?s +?s?d?d?u?s?u?d?d +?s?d?d?u?s?u?d?u +?s?d?d?u?s?u?d?s +?s?d?d?u?s?u?u?d +?s?d?d?u?s?u?u?u +?s?d?d?u?s?u?u?s +?s?d?d?u?s?u?s?d +?s?d?d?u?s?u?s?u +?s?d?d?u?s?u?s?s +?s?d?d?u?s?s?d?d +?s?d?d?u?s?s?d?u +?s?d?d?u?s?s?d?s +?s?d?d?u?s?s?u?d +?s?d?d?u?s?s?u?u +?s?d?d?u?s?s?u?s +?s?d?d?u?s?s?s?d +?s?d?d?u?s?s?s?u +?s?d?d?u?s?s?s?s +?s?d?d?s?d?d?d?d +?s?d?d?s?d?d?d?l +?s?d?d?s?d?d?d?u +?s?d?d?s?d?d?d?s +?s?d?d?s?d?d?l?d +?s?d?d?s?d?d?l?l +?s?d?d?s?d?d?l?s +?s?d?d?s?d?d?u?d +?s?d?d?s?d?d?u?u +?s?d?d?s?d?d?u?s +?s?d?d?s?d?d?s?d +?s?d?d?s?d?d?s?l +?s?d?d?s?d?d?s?u +?s?d?d?s?d?d?s?s +?s?d?d?s?d?l?d?d +?s?d?d?s?d?l?d?l +?s?d?d?s?d?l?d?s +?s?d?d?s?d?l?l?d +?s?d?d?s?d?l?l?l +?s?d?d?s?d?l?l?s +?s?d?d?s?d?l?s?d +?s?d?d?s?d?l?s?l +?s?d?d?s?d?l?s?s +?s?d?d?s?d?u?d?d +?s?d?d?s?d?u?d?u +?s?d?d?s?d?u?d?s +?s?d?d?s?d?u?u?d +?s?d?d?s?d?u?u?u +?s?d?d?s?d?u?u?s +?s?d?d?s?d?u?s?d +?s?d?d?s?d?u?s?u +?s?d?d?s?d?u?s?s +?s?d?d?s?d?s?d?d +?s?d?d?s?d?s?d?l +?s?d?d?s?d?s?d?u +?s?d?d?s?d?s?d?s +?s?d?d?s?d?s?l?d +?s?d?d?s?d?s?l?l +?s?d?d?s?d?s?l?s +?s?d?d?s?d?s?u?d +?s?d?d?s?d?s?u?u +?s?d?d?s?d?s?u?s +?s?d?d?s?d?s?s?d +?s?d?d?s?d?s?s?l +?s?d?d?s?d?s?s?u +?s?d?d?s?d?s?s?s +?s?d?d?s?l?d?d?d +?s?d?d?s?l?d?d?l +?s?d?d?s?l?d?d?s +?s?d?d?s?l?d?l?d +?s?d?d?s?l?d?l?l +?s?d?d?s?l?d?l?s +?s?d?d?s?l?d?s?d +?s?d?d?s?l?d?s?l +?s?d?d?s?l?d?s?s +?s?d?d?s?l?l?d?d +?s?d?d?s?l?l?d?l +?s?d?d?s?l?l?d?s +?s?d?d?s?l?l?l?d +?s?d?d?s?l?l?l?l +?s?d?d?s?l?l?l?s +?s?d?d?s?l?l?s?d +?s?d?d?s?l?l?s?l +?s?d?d?s?l?l?s?s +?s?d?d?s?l?s?d?d +?s?d?d?s?l?s?d?l +?s?d?d?s?l?s?d?s +?s?d?d?s?l?s?l?d +?s?d?d?s?l?s?l?l +?s?d?d?s?l?s?l?s +?s?d?d?s?l?s?s?d +?s?d?d?s?l?s?s?l +?s?d?d?s?l?s?s?s +?s?d?d?s?u?d?d?d +?s?d?d?s?u?d?d?u +?s?d?d?s?u?d?d?s +?s?d?d?s?u?d?u?d +?s?d?d?s?u?d?u?u +?s?d?d?s?u?d?u?s +?s?d?d?s?u?d?s?d +?s?d?d?s?u?d?s?u +?s?d?d?s?u?d?s?s +?s?d?d?s?u?u?d?d +?s?d?d?s?u?u?d?u +?s?d?d?s?u?u?d?s +?s?d?d?s?u?u?u?d +?s?d?d?s?u?u?u?u +?s?d?d?s?u?u?u?s +?s?d?d?s?u?u?s?d +?s?d?d?s?u?u?s?u +?s?d?d?s?u?u?s?s +?s?d?d?s?u?s?d?d +?s?d?d?s?u?s?d?u +?s?d?d?s?u?s?d?s +?s?d?d?s?u?s?u?d +?s?d?d?s?u?s?u?u +?s?d?d?s?u?s?u?s +?s?d?d?s?u?s?s?d +?s?d?d?s?u?s?s?u +?s?d?d?s?u?s?s?s +?s?d?d?s?s?d?d?d +?s?d?d?s?s?d?d?l +?s?d?d?s?s?d?d?u +?s?d?d?s?s?d?d?s +?s?d?d?s?s?d?l?d +?s?d?d?s?s?d?l?l +?s?d?d?s?s?d?l?s +?s?d?d?s?s?d?u?d +?s?d?d?s?s?d?u?u +?s?d?d?s?s?d?u?s +?s?d?d?s?s?d?s?d +?s?d?d?s?s?d?s?l +?s?d?d?s?s?d?s?u +?s?d?d?s?s?d?s?s +?s?d?d?s?s?l?d?d +?s?d?d?s?s?l?d?l +?s?d?d?s?s?l?d?s +?s?d?d?s?s?l?l?d +?s?d?d?s?s?l?l?l +?s?d?d?s?s?l?l?s +?s?d?d?s?s?l?s?d +?s?d?d?s?s?l?s?l +?s?d?d?s?s?l?s?s +?s?d?d?s?s?u?d?d +?s?d?d?s?s?u?d?u +?s?d?d?s?s?u?d?s +?s?d?d?s?s?u?u?d +?s?d?d?s?s?u?u?u +?s?d?d?s?s?u?u?s +?s?d?d?s?s?u?s?d +?s?d?d?s?s?u?s?u +?s?d?d?s?s?u?s?s +?s?d?d?s?s?s?d?d +?s?d?d?s?s?s?d?l +?s?d?d?s?s?s?d?u +?s?d?d?s?s?s?d?s +?s?d?d?s?s?s?l?d +?s?d?d?s?s?s?l?l +?s?d?d?s?s?s?l?s +?s?d?d?s?s?s?u?d +?s?d?d?s?s?s?u?u +?s?d?d?s?s?s?u?s +?s?d?d?s?s?s?s?d +?s?d?d?s?s?s?s?l +?s?d?d?s?s?s?s?u +?s?d?d?s?s?s?s?s +?s?d?l?d?d?d?d?d +?s?d?l?d?d?d?d?l +?s?d?l?d?d?d?d?s +?s?d?l?d?d?d?l?d +?s?d?l?d?d?d?l?l +?s?d?l?d?d?d?l?s +?s?d?l?d?d?d?s?d +?s?d?l?d?d?d?s?l +?s?d?l?d?d?d?s?s +?s?d?l?d?d?l?d?d +?s?d?l?d?d?l?d?l +?s?d?l?d?d?l?d?s +?s?d?l?d?d?l?l?d +?s?d?l?d?d?l?l?l +?s?d?l?d?d?l?l?s +?s?d?l?d?d?l?s?d +?s?d?l?d?d?l?s?l +?s?d?l?d?d?l?s?s +?s?d?l?d?d?s?d?d +?s?d?l?d?d?s?d?l +?s?d?l?d?d?s?d?s +?s?d?l?d?d?s?l?d +?s?d?l?d?d?s?l?l +?s?d?l?d?d?s?l?s +?s?d?l?d?d?s?s?d +?s?d?l?d?d?s?s?l +?s?d?l?d?d?s?s?s +?s?d?l?d?l?d?d?d +?s?d?l?d?l?d?d?l +?s?d?l?d?l?d?d?s +?s?d?l?d?l?d?l?d +?s?d?l?d?l?d?l?l +?s?d?l?d?l?d?l?s +?s?d?l?d?l?d?s?d +?s?d?l?d?l?d?s?l +?s?d?l?d?l?d?s?s +?s?d?l?d?l?l?d?d +?s?d?l?d?l?l?d?l +?s?d?l?d?l?l?d?s +?s?d?l?d?l?l?l?d +?s?d?l?d?l?l?l?l +?s?d?l?d?l?l?l?s +?s?d?l?d?l?l?s?d +?s?d?l?d?l?l?s?l +?s?d?l?d?l?l?s?s +?s?d?l?d?l?s?d?d +?s?d?l?d?l?s?d?l +?s?d?l?d?l?s?d?s +?s?d?l?d?l?s?l?d +?s?d?l?d?l?s?l?l +?s?d?l?d?l?s?l?s +?s?d?l?d?l?s?s?d +?s?d?l?d?l?s?s?l +?s?d?l?d?l?s?s?s +?s?d?l?d?s?d?d?d +?s?d?l?d?s?d?d?l +?s?d?l?d?s?d?d?s +?s?d?l?d?s?d?l?d +?s?d?l?d?s?d?l?l +?s?d?l?d?s?d?l?s +?s?d?l?d?s?d?s?d +?s?d?l?d?s?d?s?l +?s?d?l?d?s?d?s?s +?s?d?l?d?s?l?d?d +?s?d?l?d?s?l?d?l +?s?d?l?d?s?l?d?s +?s?d?l?d?s?l?l?d +?s?d?l?d?s?l?l?l +?s?d?l?d?s?l?l?s +?s?d?l?d?s?l?s?d +?s?d?l?d?s?l?s?l +?s?d?l?d?s?l?s?s +?s?d?l?d?s?s?d?d +?s?d?l?d?s?s?d?l +?s?d?l?d?s?s?d?s +?s?d?l?d?s?s?l?d +?s?d?l?d?s?s?l?l +?s?d?l?d?s?s?l?s +?s?d?l?d?s?s?s?d +?s?d?l?d?s?s?s?l +?s?d?l?d?s?s?s?s +?s?d?l?l?d?d?d?d +?s?d?l?l?d?d?d?l +?s?d?l?l?d?d?d?s +?s?d?l?l?d?d?l?d +?s?d?l?l?d?d?l?l +?s?d?l?l?d?d?l?s +?s?d?l?l?d?d?s?d +?s?d?l?l?d?d?s?l +?s?d?l?l?d?d?s?s +?s?d?l?l?d?l?d?d +?s?d?l?l?d?l?d?l +?s?d?l?l?d?l?d?s +?s?d?l?l?d?l?l?d +?s?d?l?l?d?l?l?l +?s?d?l?l?d?l?l?s +?s?d?l?l?d?l?s?d +?s?d?l?l?d?l?s?l +?s?d?l?l?d?l?s?s +?s?d?l?l?d?s?d?d +?s?d?l?l?d?s?d?l +?s?d?l?l?d?s?d?s +?s?d?l?l?d?s?l?d +?s?d?l?l?d?s?l?l +?s?d?l?l?d?s?l?s +?s?d?l?l?d?s?s?d +?s?d?l?l?d?s?s?l +?s?d?l?l?d?s?s?s +?s?d?l?l?l?d?d?d +?s?d?l?l?l?d?d?l +?s?d?l?l?l?d?d?s +?s?d?l?l?l?d?l?d +?s?d?l?l?l?d?l?l +?s?d?l?l?l?d?l?s +?s?d?l?l?l?d?s?d +?s?d?l?l?l?d?s?l +?s?d?l?l?l?d?s?s +?s?d?l?l?l?l?d?d +?s?d?l?l?l?l?d?l +?s?d?l?l?l?l?d?s +?s?d?l?l?l?l?l?d +?s?d?l?l?l?l?l?l +?s?d?l?l?l?l?l?s +?s?d?l?l?l?l?s?d +?s?d?l?l?l?l?s?l +?s?d?l?l?l?l?s?s +?s?d?l?l?l?s?d?d +?s?d?l?l?l?s?d?l +?s?d?l?l?l?s?d?s +?s?d?l?l?l?s?l?d +?s?d?l?l?l?s?l?l +?s?d?l?l?l?s?l?s +?s?d?l?l?l?s?s?d +?s?d?l?l?l?s?s?l +?s?d?l?l?l?s?s?s +?s?d?l?l?s?d?d?d +?s?d?l?l?s?d?d?l +?s?d?l?l?s?d?d?s +?s?d?l?l?s?d?l?d +?s?d?l?l?s?d?l?l +?s?d?l?l?s?d?l?s +?s?d?l?l?s?d?s?d +?s?d?l?l?s?d?s?l +?s?d?l?l?s?d?s?s +?s?d?l?l?s?l?d?d +?s?d?l?l?s?l?d?l +?s?d?l?l?s?l?d?s +?s?d?l?l?s?l?l?d +?s?d?l?l?s?l?l?l +?s?d?l?l?s?l?l?s +?s?d?l?l?s?l?s?d +?s?d?l?l?s?l?s?l +?s?d?l?l?s?l?s?s +?s?d?l?l?s?s?d?d +?s?d?l?l?s?s?d?l +?s?d?l?l?s?s?d?s +?s?d?l?l?s?s?l?d +?s?d?l?l?s?s?l?l +?s?d?l?l?s?s?l?s +?s?d?l?l?s?s?s?d +?s?d?l?l?s?s?s?l +?s?d?l?l?s?s?s?s +?s?d?l?s?d?d?d?d +?s?d?l?s?d?d?d?l +?s?d?l?s?d?d?d?s +?s?d?l?s?d?d?l?d +?s?d?l?s?d?d?l?l +?s?d?l?s?d?d?l?s +?s?d?l?s?d?d?s?d +?s?d?l?s?d?d?s?l +?s?d?l?s?d?d?s?s +?s?d?l?s?d?l?d?d +?s?d?l?s?d?l?d?l +?s?d?l?s?d?l?d?s +?s?d?l?s?d?l?l?d +?s?d?l?s?d?l?l?l +?s?d?l?s?d?l?l?s +?s?d?l?s?d?l?s?d +?s?d?l?s?d?l?s?l +?s?d?l?s?d?l?s?s +?s?d?l?s?d?s?d?d +?s?d?l?s?d?s?d?l +?s?d?l?s?d?s?d?s +?s?d?l?s?d?s?l?d +?s?d?l?s?d?s?l?l +?s?d?l?s?d?s?l?s +?s?d?l?s?d?s?s?d +?s?d?l?s?d?s?s?l +?s?d?l?s?d?s?s?s +?s?d?l?s?l?d?d?d +?s?d?l?s?l?d?d?l +?s?d?l?s?l?d?d?s +?s?d?l?s?l?d?l?d +?s?d?l?s?l?d?l?l +?s?d?l?s?l?d?l?s +?s?d?l?s?l?d?s?d +?s?d?l?s?l?d?s?l +?s?d?l?s?l?d?s?s +?s?d?l?s?l?l?d?d +?s?d?l?s?l?l?d?l +?s?d?l?s?l?l?d?s +?s?d?l?s?l?l?l?d +?s?d?l?s?l?l?l?l +?s?d?l?s?l?l?l?s +?s?d?l?s?l?l?s?d +?s?d?l?s?l?l?s?l +?s?d?l?s?l?l?s?s +?s?d?l?s?l?s?d?d +?s?d?l?s?l?s?d?l +?s?d?l?s?l?s?d?s +?s?d?l?s?l?s?l?d +?s?d?l?s?l?s?l?l +?s?d?l?s?l?s?l?s +?s?d?l?s?l?s?s?d +?s?d?l?s?l?s?s?l +?s?d?l?s?l?s?s?s +?s?d?l?s?s?d?d?d +?s?d?l?s?s?d?d?l +?s?d?l?s?s?d?d?s +?s?d?l?s?s?d?l?d +?s?d?l?s?s?d?l?l +?s?d?l?s?s?d?l?s +?s?d?l?s?s?d?s?d +?s?d?l?s?s?d?s?l +?s?d?l?s?s?d?s?s +?s?d?l?s?s?l?d?d +?s?d?l?s?s?l?d?l +?s?d?l?s?s?l?d?s +?s?d?l?s?s?l?l?d +?s?d?l?s?s?l?l?l +?s?d?l?s?s?l?l?s +?s?d?l?s?s?l?s?d +?s?d?l?s?s?l?s?l +?s?d?l?s?s?l?s?s +?s?d?l?s?s?s?d?d +?s?d?l?s?s?s?d?l +?s?d?l?s?s?s?d?s +?s?d?l?s?s?s?l?d +?s?d?l?s?s?s?l?l +?s?d?l?s?s?s?l?s +?s?d?l?s?s?s?s?d +?s?d?l?s?s?s?s?l +?s?d?l?s?s?s?s?s +?s?d?u?d?d?d?d?d +?s?d?u?d?d?d?d?u +?s?d?u?d?d?d?d?s +?s?d?u?d?d?d?u?d +?s?d?u?d?d?d?u?u +?s?d?u?d?d?d?u?s +?s?d?u?d?d?d?s?d +?s?d?u?d?d?d?s?u +?s?d?u?d?d?d?s?s +?s?d?u?d?d?u?d?d +?s?d?u?d?d?u?d?u +?s?d?u?d?d?u?d?s +?s?d?u?d?d?u?u?d +?s?d?u?d?d?u?u?u +?s?d?u?d?d?u?u?s +?s?d?u?d?d?u?s?d +?s?d?u?d?d?u?s?u +?s?d?u?d?d?u?s?s +?s?d?u?d?d?s?d?d +?s?d?u?d?d?s?d?u +?s?d?u?d?d?s?d?s +?s?d?u?d?d?s?u?d +?s?d?u?d?d?s?u?u +?s?d?u?d?d?s?u?s +?s?d?u?d?d?s?s?d +?s?d?u?d?d?s?s?u +?s?d?u?d?d?s?s?s +?s?d?u?d?u?d?d?d +?s?d?u?d?u?d?d?u +?s?d?u?d?u?d?d?s +?s?d?u?d?u?d?u?d +?s?d?u?d?u?d?u?u +?s?d?u?d?u?d?u?s +?s?d?u?d?u?d?s?d +?s?d?u?d?u?d?s?u +?s?d?u?d?u?d?s?s +?s?d?u?d?u?u?d?d +?s?d?u?d?u?u?d?u +?s?d?u?d?u?u?d?s +?s?d?u?d?u?u?u?d +?s?d?u?d?u?u?u?u +?s?d?u?d?u?u?u?s +?s?d?u?d?u?u?s?d +?s?d?u?d?u?u?s?u +?s?d?u?d?u?u?s?s +?s?d?u?d?u?s?d?d +?s?d?u?d?u?s?d?u +?s?d?u?d?u?s?d?s +?s?d?u?d?u?s?u?d +?s?d?u?d?u?s?u?u +?s?d?u?d?u?s?u?s +?s?d?u?d?u?s?s?d +?s?d?u?d?u?s?s?u +?s?d?u?d?u?s?s?s +?s?d?u?d?s?d?d?d +?s?d?u?d?s?d?d?u +?s?d?u?d?s?d?d?s +?s?d?u?d?s?d?u?d +?s?d?u?d?s?d?u?u +?s?d?u?d?s?d?u?s +?s?d?u?d?s?d?s?d +?s?d?u?d?s?d?s?u +?s?d?u?d?s?d?s?s +?s?d?u?d?s?u?d?d +?s?d?u?d?s?u?d?u +?s?d?u?d?s?u?d?s +?s?d?u?d?s?u?u?d +?s?d?u?d?s?u?u?u +?s?d?u?d?s?u?u?s +?s?d?u?d?s?u?s?d +?s?d?u?d?s?u?s?u +?s?d?u?d?s?u?s?s +?s?d?u?d?s?s?d?d +?s?d?u?d?s?s?d?u +?s?d?u?d?s?s?d?s +?s?d?u?d?s?s?u?d +?s?d?u?d?s?s?u?u +?s?d?u?d?s?s?u?s +?s?d?u?d?s?s?s?d +?s?d?u?d?s?s?s?u +?s?d?u?d?s?s?s?s +?s?d?u?u?d?d?d?d +?s?d?u?u?d?d?d?u +?s?d?u?u?d?d?d?s +?s?d?u?u?d?d?u?d +?s?d?u?u?d?d?u?u +?s?d?u?u?d?d?u?s +?s?d?u?u?d?d?s?d +?s?d?u?u?d?d?s?u +?s?d?u?u?d?d?s?s +?s?d?u?u?d?u?d?d +?s?d?u?u?d?u?d?u +?s?d?u?u?d?u?d?s +?s?d?u?u?d?u?u?d +?s?d?u?u?d?u?u?u +?s?d?u?u?d?u?u?s +?s?d?u?u?d?u?s?d +?s?d?u?u?d?u?s?u +?s?d?u?u?d?u?s?s +?s?d?u?u?d?s?d?d +?s?d?u?u?d?s?d?u +?s?d?u?u?d?s?d?s +?s?d?u?u?d?s?u?d +?s?d?u?u?d?s?u?u +?s?d?u?u?d?s?u?s +?s?d?u?u?d?s?s?d +?s?d?u?u?d?s?s?u +?s?d?u?u?d?s?s?s +?s?d?u?u?u?d?d?d +?s?d?u?u?u?d?d?u +?s?d?u?u?u?d?d?s +?s?d?u?u?u?d?u?d +?s?d?u?u?u?d?u?u +?s?d?u?u?u?d?u?s +?s?d?u?u?u?d?s?d +?s?d?u?u?u?d?s?u +?s?d?u?u?u?d?s?s +?s?d?u?u?u?u?d?d +?s?d?u?u?u?u?d?u +?s?d?u?u?u?u?d?s +?s?d?u?u?u?u?u?d +?s?d?u?u?u?u?u?u +?s?d?u?u?u?u?u?s +?s?d?u?u?u?u?s?d +?s?d?u?u?u?u?s?u +?s?d?u?u?u?u?s?s +?s?d?u?u?u?s?d?d +?s?d?u?u?u?s?d?u +?s?d?u?u?u?s?d?s +?s?d?u?u?u?s?u?d +?s?d?u?u?u?s?u?u +?s?d?u?u?u?s?u?s +?s?d?u?u?u?s?s?d +?s?d?u?u?u?s?s?u +?s?d?u?u?u?s?s?s +?s?d?u?u?s?d?d?d +?s?d?u?u?s?d?d?u +?s?d?u?u?s?d?d?s +?s?d?u?u?s?d?u?d +?s?d?u?u?s?d?u?u +?s?d?u?u?s?d?u?s +?s?d?u?u?s?d?s?d +?s?d?u?u?s?d?s?u +?s?d?u?u?s?d?s?s +?s?d?u?u?s?u?d?d +?s?d?u?u?s?u?d?u +?s?d?u?u?s?u?d?s +?s?d?u?u?s?u?u?d +?s?d?u?u?s?u?u?u +?s?d?u?u?s?u?u?s +?s?d?u?u?s?u?s?d +?s?d?u?u?s?u?s?u +?s?d?u?u?s?u?s?s +?s?d?u?u?s?s?d?d +?s?d?u?u?s?s?d?u +?s?d?u?u?s?s?d?s +?s?d?u?u?s?s?u?d +?s?d?u?u?s?s?u?u +?s?d?u?u?s?s?u?s +?s?d?u?u?s?s?s?d +?s?d?u?u?s?s?s?u +?s?d?u?u?s?s?s?s +?s?d?u?s?d?d?d?d +?s?d?u?s?d?d?d?u +?s?d?u?s?d?d?d?s +?s?d?u?s?d?d?u?d +?s?d?u?s?d?d?u?u +?s?d?u?s?d?d?u?s +?s?d?u?s?d?d?s?d +?s?d?u?s?d?d?s?u +?s?d?u?s?d?d?s?s +?s?d?u?s?d?u?d?d +?s?d?u?s?d?u?d?u +?s?d?u?s?d?u?d?s +?s?d?u?s?d?u?u?d +?s?d?u?s?d?u?u?u +?s?d?u?s?d?u?u?s +?s?d?u?s?d?u?s?d +?s?d?u?s?d?u?s?u +?s?d?u?s?d?u?s?s +?s?d?u?s?d?s?d?d +?s?d?u?s?d?s?d?u +?s?d?u?s?d?s?d?s +?s?d?u?s?d?s?u?d +?s?d?u?s?d?s?u?u +?s?d?u?s?d?s?u?s +?s?d?u?s?d?s?s?d +?s?d?u?s?d?s?s?u +?s?d?u?s?d?s?s?s +?s?d?u?s?u?d?d?d +?s?d?u?s?u?d?d?u +?s?d?u?s?u?d?d?s +?s?d?u?s?u?d?u?d +?s?d?u?s?u?d?u?u +?s?d?u?s?u?d?u?s +?s?d?u?s?u?d?s?d +?s?d?u?s?u?d?s?u +?s?d?u?s?u?d?s?s +?s?d?u?s?u?u?d?d +?s?d?u?s?u?u?d?u +?s?d?u?s?u?u?d?s +?s?d?u?s?u?u?u?d +?s?d?u?s?u?u?u?u +?s?d?u?s?u?u?u?s +?s?d?u?s?u?u?s?d +?s?d?u?s?u?u?s?u +?s?d?u?s?u?u?s?s +?s?d?u?s?u?s?d?d +?s?d?u?s?u?s?d?u +?s?d?u?s?u?s?d?s +?s?d?u?s?u?s?u?d +?s?d?u?s?u?s?u?u +?s?d?u?s?u?s?u?s +?s?d?u?s?u?s?s?d +?s?d?u?s?u?s?s?u +?s?d?u?s?u?s?s?s +?s?d?u?s?s?d?d?d +?s?d?u?s?s?d?d?u +?s?d?u?s?s?d?d?s +?s?d?u?s?s?d?u?d +?s?d?u?s?s?d?u?u +?s?d?u?s?s?d?u?s +?s?d?u?s?s?d?s?d +?s?d?u?s?s?d?s?u +?s?d?u?s?s?d?s?s +?s?d?u?s?s?u?d?d +?s?d?u?s?s?u?d?u +?s?d?u?s?s?u?d?s +?s?d?u?s?s?u?u?d +?s?d?u?s?s?u?u?u +?s?d?u?s?s?u?u?s +?s?d?u?s?s?u?s?d +?s?d?u?s?s?u?s?u +?s?d?u?s?s?u?s?s +?s?d?u?s?s?s?d?d +?s?d?u?s?s?s?d?u +?s?d?u?s?s?s?d?s +?s?d?u?s?s?s?u?d +?s?d?u?s?s?s?u?u +?s?d?u?s?s?s?u?s +?s?d?u?s?s?s?s?d +?s?d?u?s?s?s?s?u +?s?d?u?s?s?s?s?s +?s?d?s?d?d?d?d?d +?s?d?s?d?d?d?d?l +?s?d?s?d?d?d?d?u +?s?d?s?d?d?d?d?s +?s?d?s?d?d?d?l?d +?s?d?s?d?d?d?l?l +?s?d?s?d?d?d?l?s +?s?d?s?d?d?d?u?d +?s?d?s?d?d?d?u?u +?s?d?s?d?d?d?u?s +?s?d?s?d?d?d?s?d +?s?d?s?d?d?d?s?l +?s?d?s?d?d?d?s?u +?s?d?s?d?d?d?s?s +?s?d?s?d?d?l?d?d +?s?d?s?d?d?l?d?l +?s?d?s?d?d?l?d?s +?s?d?s?d?d?l?l?d +?s?d?s?d?d?l?l?l +?s?d?s?d?d?l?l?s +?s?d?s?d?d?l?s?d +?s?d?s?d?d?l?s?l +?s?d?s?d?d?l?s?s +?s?d?s?d?d?u?d?d +?s?d?s?d?d?u?d?u +?s?d?s?d?d?u?d?s +?s?d?s?d?d?u?u?d +?s?d?s?d?d?u?u?u +?s?d?s?d?d?u?u?s +?s?d?s?d?d?u?s?d +?s?d?s?d?d?u?s?u +?s?d?s?d?d?u?s?s +?s?d?s?d?d?s?d?d +?s?d?s?d?d?s?d?l +?s?d?s?d?d?s?d?u +?s?d?s?d?d?s?d?s +?s?d?s?d?d?s?l?d +?s?d?s?d?d?s?l?l +?s?d?s?d?d?s?l?s +?s?d?s?d?d?s?u?d +?s?d?s?d?d?s?u?u +?s?d?s?d?d?s?u?s +?s?d?s?d?d?s?s?d +?s?d?s?d?d?s?s?l +?s?d?s?d?d?s?s?u +?s?d?s?d?d?s?s?s +?s?d?s?d?l?d?d?d +?s?d?s?d?l?d?d?l +?s?d?s?d?l?d?d?s +?s?d?s?d?l?d?l?d +?s?d?s?d?l?d?l?l +?s?d?s?d?l?d?l?s +?s?d?s?d?l?d?s?d +?s?d?s?d?l?d?s?l +?s?d?s?d?l?d?s?s +?s?d?s?d?l?l?d?d +?s?d?s?d?l?l?d?l +?s?d?s?d?l?l?d?s +?s?d?s?d?l?l?l?d +?s?d?s?d?l?l?l?l +?s?d?s?d?l?l?l?s +?s?d?s?d?l?l?s?d +?s?d?s?d?l?l?s?l +?s?d?s?d?l?l?s?s +?s?d?s?d?l?s?d?d +?s?d?s?d?l?s?d?l +?s?d?s?d?l?s?d?s +?s?d?s?d?l?s?l?d +?s?d?s?d?l?s?l?l +?s?d?s?d?l?s?l?s +?s?d?s?d?l?s?s?d +?s?d?s?d?l?s?s?l +?s?d?s?d?l?s?s?s +?s?d?s?d?u?d?d?d +?s?d?s?d?u?d?d?u +?s?d?s?d?u?d?d?s +?s?d?s?d?u?d?u?d +?s?d?s?d?u?d?u?u +?s?d?s?d?u?d?u?s +?s?d?s?d?u?d?s?d +?s?d?s?d?u?d?s?u +?s?d?s?d?u?d?s?s +?s?d?s?d?u?u?d?d +?s?d?s?d?u?u?d?u +?s?d?s?d?u?u?d?s +?s?d?s?d?u?u?u?d +?s?d?s?d?u?u?u?u +?s?d?s?d?u?u?u?s +?s?d?s?d?u?u?s?d +?s?d?s?d?u?u?s?u +?s?d?s?d?u?u?s?s +?s?d?s?d?u?s?d?d +?s?d?s?d?u?s?d?u +?s?d?s?d?u?s?d?s +?s?d?s?d?u?s?u?d +?s?d?s?d?u?s?u?u +?s?d?s?d?u?s?u?s +?s?d?s?d?u?s?s?d +?s?d?s?d?u?s?s?u +?s?d?s?d?u?s?s?s +?s?d?s?d?s?d?d?d +?s?d?s?d?s?d?d?l +?s?d?s?d?s?d?d?u +?s?d?s?d?s?d?d?s +?s?d?s?d?s?d?l?d +?s?d?s?d?s?d?l?l +?s?d?s?d?s?d?l?s +?s?d?s?d?s?d?u?d +?s?d?s?d?s?d?u?u +?s?d?s?d?s?d?u?s +?s?d?s?d?s?d?s?d +?s?d?s?d?s?d?s?l +?s?d?s?d?s?d?s?u +?s?d?s?d?s?d?s?s +?s?d?s?d?s?l?d?d +?s?d?s?d?s?l?d?l +?s?d?s?d?s?l?d?s +?s?d?s?d?s?l?l?d +?s?d?s?d?s?l?l?l +?s?d?s?d?s?l?l?s +?s?d?s?d?s?l?s?d +?s?d?s?d?s?l?s?l +?s?d?s?d?s?l?s?s +?s?d?s?d?s?u?d?d +?s?d?s?d?s?u?d?u +?s?d?s?d?s?u?d?s +?s?d?s?d?s?u?u?d +?s?d?s?d?s?u?u?u +?s?d?s?d?s?u?u?s +?s?d?s?d?s?u?s?d +?s?d?s?d?s?u?s?u +?s?d?s?d?s?u?s?s +?s?d?s?d?s?s?d?d +?s?d?s?d?s?s?d?l +?s?d?s?d?s?s?d?u +?s?d?s?d?s?s?d?s +?s?d?s?d?s?s?l?d +?s?d?s?d?s?s?l?l +?s?d?s?d?s?s?l?s +?s?d?s?d?s?s?u?d +?s?d?s?d?s?s?u?u +?s?d?s?d?s?s?u?s +?s?d?s?d?s?s?s?d +?s?d?s?d?s?s?s?l +?s?d?s?d?s?s?s?u +?s?d?s?d?s?s?s?s +?s?d?s?l?d?d?d?d +?s?d?s?l?d?d?d?l +?s?d?s?l?d?d?d?s +?s?d?s?l?d?d?l?d +?s?d?s?l?d?d?l?l +?s?d?s?l?d?d?l?s +?s?d?s?l?d?d?s?d +?s?d?s?l?d?d?s?l +?s?d?s?l?d?d?s?s +?s?d?s?l?d?l?d?d +?s?d?s?l?d?l?d?l +?s?d?s?l?d?l?d?s +?s?d?s?l?d?l?l?d +?s?d?s?l?d?l?l?l +?s?d?s?l?d?l?l?s +?s?d?s?l?d?l?s?d +?s?d?s?l?d?l?s?l +?s?d?s?l?d?l?s?s +?s?d?s?l?d?s?d?d +?s?d?s?l?d?s?d?l +?s?d?s?l?d?s?d?s +?s?d?s?l?d?s?l?d +?s?d?s?l?d?s?l?l +?s?d?s?l?d?s?l?s +?s?d?s?l?d?s?s?d +?s?d?s?l?d?s?s?l +?s?d?s?l?d?s?s?s +?s?d?s?l?l?d?d?d +?s?d?s?l?l?d?d?l +?s?d?s?l?l?d?d?s +?s?d?s?l?l?d?l?d +?s?d?s?l?l?d?l?l +?s?d?s?l?l?d?l?s +?s?d?s?l?l?d?s?d +?s?d?s?l?l?d?s?l +?s?d?s?l?l?d?s?s +?s?d?s?l?l?l?d?d +?s?d?s?l?l?l?d?l +?s?d?s?l?l?l?d?s +?s?d?s?l?l?l?l?d +?s?d?s?l?l?l?l?l +?s?d?s?l?l?l?l?s +?s?d?s?l?l?l?s?d +?s?d?s?l?l?l?s?l +?s?d?s?l?l?l?s?s +?s?d?s?l?l?s?d?d +?s?d?s?l?l?s?d?l +?s?d?s?l?l?s?d?s +?s?d?s?l?l?s?l?d +?s?d?s?l?l?s?l?l +?s?d?s?l?l?s?l?s +?s?d?s?l?l?s?s?d +?s?d?s?l?l?s?s?l +?s?d?s?l?l?s?s?s +?s?d?s?l?s?d?d?d +?s?d?s?l?s?d?d?l +?s?d?s?l?s?d?d?s +?s?d?s?l?s?d?l?d +?s?d?s?l?s?d?l?l +?s?d?s?l?s?d?l?s +?s?d?s?l?s?d?s?d +?s?d?s?l?s?d?s?l +?s?d?s?l?s?d?s?s +?s?d?s?l?s?l?d?d +?s?d?s?l?s?l?d?l +?s?d?s?l?s?l?d?s +?s?d?s?l?s?l?l?d +?s?d?s?l?s?l?l?l +?s?d?s?l?s?l?l?s +?s?d?s?l?s?l?s?d +?s?d?s?l?s?l?s?l +?s?d?s?l?s?l?s?s +?s?d?s?l?s?s?d?d +?s?d?s?l?s?s?d?l +?s?d?s?l?s?s?d?s +?s?d?s?l?s?s?l?d +?s?d?s?l?s?s?l?l +?s?d?s?l?s?s?l?s +?s?d?s?l?s?s?s?d +?s?d?s?l?s?s?s?l +?s?d?s?l?s?s?s?s +?s?d?s?u?d?d?d?d +?s?d?s?u?d?d?d?u +?s?d?s?u?d?d?d?s +?s?d?s?u?d?d?u?d +?s?d?s?u?d?d?u?u +?s?d?s?u?d?d?u?s +?s?d?s?u?d?d?s?d +?s?d?s?u?d?d?s?u +?s?d?s?u?d?d?s?s +?s?d?s?u?d?u?d?d +?s?d?s?u?d?u?d?u +?s?d?s?u?d?u?d?s +?s?d?s?u?d?u?u?d +?s?d?s?u?d?u?u?u +?s?d?s?u?d?u?u?s +?s?d?s?u?d?u?s?d +?s?d?s?u?d?u?s?u +?s?d?s?u?d?u?s?s +?s?d?s?u?d?s?d?d +?s?d?s?u?d?s?d?u +?s?d?s?u?d?s?d?s +?s?d?s?u?d?s?u?d +?s?d?s?u?d?s?u?u +?s?d?s?u?d?s?u?s +?s?d?s?u?d?s?s?d +?s?d?s?u?d?s?s?u +?s?d?s?u?d?s?s?s +?s?d?s?u?u?d?d?d +?s?d?s?u?u?d?d?u +?s?d?s?u?u?d?d?s +?s?d?s?u?u?d?u?d +?s?d?s?u?u?d?u?u +?s?d?s?u?u?d?u?s +?s?d?s?u?u?d?s?d +?s?d?s?u?u?d?s?u +?s?d?s?u?u?d?s?s +?s?d?s?u?u?u?d?d +?s?d?s?u?u?u?d?u +?s?d?s?u?u?u?d?s +?s?d?s?u?u?u?u?d +?s?d?s?u?u?u?u?u +?s?d?s?u?u?u?u?s +?s?d?s?u?u?u?s?d +?s?d?s?u?u?u?s?u +?s?d?s?u?u?u?s?s +?s?d?s?u?u?s?d?d +?s?d?s?u?u?s?d?u +?s?d?s?u?u?s?d?s +?s?d?s?u?u?s?u?d +?s?d?s?u?u?s?u?u +?s?d?s?u?u?s?u?s +?s?d?s?u?u?s?s?d +?s?d?s?u?u?s?s?u +?s?d?s?u?u?s?s?s +?s?d?s?u?s?d?d?d +?s?d?s?u?s?d?d?u +?s?d?s?u?s?d?d?s +?s?d?s?u?s?d?u?d +?s?d?s?u?s?d?u?u +?s?d?s?u?s?d?u?s +?s?d?s?u?s?d?s?d +?s?d?s?u?s?d?s?u +?s?d?s?u?s?d?s?s +?s?d?s?u?s?u?d?d +?s?d?s?u?s?u?d?u +?s?d?s?u?s?u?d?s +?s?d?s?u?s?u?u?d +?s?d?s?u?s?u?u?u +?s?d?s?u?s?u?u?s +?s?d?s?u?s?u?s?d +?s?d?s?u?s?u?s?u +?s?d?s?u?s?u?s?s +?s?d?s?u?s?s?d?d +?s?d?s?u?s?s?d?u +?s?d?s?u?s?s?d?s +?s?d?s?u?s?s?u?d +?s?d?s?u?s?s?u?u +?s?d?s?u?s?s?u?s +?s?d?s?u?s?s?s?d +?s?d?s?u?s?s?s?u +?s?d?s?u?s?s?s?s +?s?d?s?s?d?d?d?d +?s?d?s?s?d?d?d?l +?s?d?s?s?d?d?d?u +?s?d?s?s?d?d?d?s +?s?d?s?s?d?d?l?d +?s?d?s?s?d?d?l?l +?s?d?s?s?d?d?l?s +?s?d?s?s?d?d?u?d +?s?d?s?s?d?d?u?u +?s?d?s?s?d?d?u?s +?s?d?s?s?d?d?s?d +?s?d?s?s?d?d?s?l +?s?d?s?s?d?d?s?u +?s?d?s?s?d?d?s?s +?s?d?s?s?d?l?d?d +?s?d?s?s?d?l?d?l +?s?d?s?s?d?l?d?s +?s?d?s?s?d?l?l?d +?s?d?s?s?d?l?l?l +?s?d?s?s?d?l?l?s +?s?d?s?s?d?l?s?d +?s?d?s?s?d?l?s?l +?s?d?s?s?d?l?s?s +?s?d?s?s?d?u?d?d +?s?d?s?s?d?u?d?u +?s?d?s?s?d?u?d?s +?s?d?s?s?d?u?u?d +?s?d?s?s?d?u?u?u +?s?d?s?s?d?u?u?s +?s?d?s?s?d?u?s?d +?s?d?s?s?d?u?s?u +?s?d?s?s?d?u?s?s +?s?d?s?s?d?s?d?d +?s?d?s?s?d?s?d?l +?s?d?s?s?d?s?d?u +?s?d?s?s?d?s?d?s +?s?d?s?s?d?s?l?d +?s?d?s?s?d?s?l?l +?s?d?s?s?d?s?l?s +?s?d?s?s?d?s?u?d +?s?d?s?s?d?s?u?u +?s?d?s?s?d?s?u?s +?s?d?s?s?d?s?s?d +?s?d?s?s?d?s?s?l +?s?d?s?s?d?s?s?u +?s?d?s?s?d?s?s?s +?s?d?s?s?l?d?d?d +?s?d?s?s?l?d?d?l +?s?d?s?s?l?d?d?s +?s?d?s?s?l?d?l?d +?s?d?s?s?l?d?l?l +?s?d?s?s?l?d?l?s +?s?d?s?s?l?d?s?d +?s?d?s?s?l?d?s?l +?s?d?s?s?l?d?s?s +?s?d?s?s?l?l?d?d +?s?d?s?s?l?l?d?l +?s?d?s?s?l?l?d?s +?s?d?s?s?l?l?l?d +?s?d?s?s?l?l?l?l +?s?d?s?s?l?l?l?s +?s?d?s?s?l?l?s?d +?s?d?s?s?l?l?s?l +?s?d?s?s?l?l?s?s +?s?d?s?s?l?s?d?d +?s?d?s?s?l?s?d?l +?s?d?s?s?l?s?d?s +?s?d?s?s?l?s?l?d +?s?d?s?s?l?s?l?l +?s?d?s?s?l?s?l?s +?s?d?s?s?l?s?s?d +?s?d?s?s?l?s?s?l +?s?d?s?s?l?s?s?s +?s?d?s?s?u?d?d?d +?s?d?s?s?u?d?d?u +?s?d?s?s?u?d?d?s +?s?d?s?s?u?d?u?d +?s?d?s?s?u?d?u?u +?s?d?s?s?u?d?u?s +?s?d?s?s?u?d?s?d +?s?d?s?s?u?d?s?u +?s?d?s?s?u?d?s?s +?s?d?s?s?u?u?d?d +?s?d?s?s?u?u?d?u +?s?d?s?s?u?u?d?s +?s?d?s?s?u?u?u?d +?s?d?s?s?u?u?u?u +?s?d?s?s?u?u?u?s +?s?d?s?s?u?u?s?d +?s?d?s?s?u?u?s?u +?s?d?s?s?u?u?s?s +?s?d?s?s?u?s?d?d +?s?d?s?s?u?s?d?u +?s?d?s?s?u?s?d?s +?s?d?s?s?u?s?u?d +?s?d?s?s?u?s?u?u +?s?d?s?s?u?s?u?s +?s?d?s?s?u?s?s?d +?s?d?s?s?u?s?s?u +?s?d?s?s?u?s?s?s +?s?d?s?s?s?d?d?d +?s?d?s?s?s?d?d?l +?s?d?s?s?s?d?d?u +?s?d?s?s?s?d?d?s +?s?d?s?s?s?d?l?d +?s?d?s?s?s?d?l?l +?s?d?s?s?s?d?l?s +?s?d?s?s?s?d?u?d +?s?d?s?s?s?d?u?u +?s?d?s?s?s?d?u?s +?s?d?s?s?s?d?s?d +?s?d?s?s?s?d?s?l +?s?d?s?s?s?d?s?u +?s?d?s?s?s?d?s?s +?s?d?s?s?s?l?d?d +?s?d?s?s?s?l?d?l +?s?d?s?s?s?l?d?s +?s?d?s?s?s?l?l?d +?s?d?s?s?s?l?l?l +?s?d?s?s?s?l?l?s +?s?d?s?s?s?l?s?d +?s?d?s?s?s?l?s?l +?s?d?s?s?s?l?s?s +?s?d?s?s?s?u?d?d +?s?d?s?s?s?u?d?u +?s?d?s?s?s?u?d?s +?s?d?s?s?s?u?u?d +?s?d?s?s?s?u?u?u +?s?d?s?s?s?u?u?s +?s?d?s?s?s?u?s?d +?s?d?s?s?s?u?s?u +?s?d?s?s?s?u?s?s +?s?d?s?s?s?s?d?d +?s?d?s?s?s?s?d?l +?s?d?s?s?s?s?d?u +?s?d?s?s?s?s?d?s +?s?d?s?s?s?s?l?d +?s?d?s?s?s?s?l?l +?s?d?s?s?s?s?l?s +?s?d?s?s?s?s?u?d +?s?d?s?s?s?s?u?u +?s?d?s?s?s?s?u?s +?s?d?s?s?s?s?s?d +?s?d?s?s?s?s?s?l +?s?d?s?s?s?s?s?u +?s?d?s?s?s?s?s?s +?s?l?d?d?d?d?d?d +?s?l?d?d?d?d?d?l +?s?l?d?d?d?d?d?s +?s?l?d?d?d?d?l?d +?s?l?d?d?d?d?l?l +?s?l?d?d?d?d?l?s +?s?l?d?d?d?d?s?d +?s?l?d?d?d?d?s?l +?s?l?d?d?d?d?s?s +?s?l?d?d?d?l?d?d +?s?l?d?d?d?l?d?l +?s?l?d?d?d?l?d?s +?s?l?d?d?d?l?l?d +?s?l?d?d?d?l?l?l +?s?l?d?d?d?l?l?s +?s?l?d?d?d?l?s?d +?s?l?d?d?d?l?s?l +?s?l?d?d?d?l?s?s +?s?l?d?d?d?s?d?d +?s?l?d?d?d?s?d?l +?s?l?d?d?d?s?d?s +?s?l?d?d?d?s?l?d +?s?l?d?d?d?s?l?l +?s?l?d?d?d?s?l?s +?s?l?d?d?d?s?s?d +?s?l?d?d?d?s?s?l +?s?l?d?d?d?s?s?s +?s?l?d?d?l?d?d?d +?s?l?d?d?l?d?d?l +?s?l?d?d?l?d?d?s +?s?l?d?d?l?d?l?d +?s?l?d?d?l?d?l?l +?s?l?d?d?l?d?l?s +?s?l?d?d?l?d?s?d +?s?l?d?d?l?d?s?l +?s?l?d?d?l?d?s?s +?s?l?d?d?l?l?d?d +?s?l?d?d?l?l?d?l +?s?l?d?d?l?l?d?s +?s?l?d?d?l?l?l?d +?s?l?d?d?l?l?l?l +?s?l?d?d?l?l?l?s +?s?l?d?d?l?l?s?d +?s?l?d?d?l?l?s?l +?s?l?d?d?l?l?s?s +?s?l?d?d?l?s?d?d +?s?l?d?d?l?s?d?l +?s?l?d?d?l?s?d?s +?s?l?d?d?l?s?l?d +?s?l?d?d?l?s?l?l +?s?l?d?d?l?s?l?s +?s?l?d?d?l?s?s?d +?s?l?d?d?l?s?s?l +?s?l?d?d?l?s?s?s +?s?l?d?d?s?d?d?d +?s?l?d?d?s?d?d?l +?s?l?d?d?s?d?d?s +?s?l?d?d?s?d?l?d +?s?l?d?d?s?d?l?l +?s?l?d?d?s?d?l?s +?s?l?d?d?s?d?s?d +?s?l?d?d?s?d?s?l +?s?l?d?d?s?d?s?s +?s?l?d?d?s?l?d?d +?s?l?d?d?s?l?d?l +?s?l?d?d?s?l?d?s +?s?l?d?d?s?l?l?d +?s?l?d?d?s?l?l?l +?s?l?d?d?s?l?l?s +?s?l?d?d?s?l?s?d +?s?l?d?d?s?l?s?l +?s?l?d?d?s?l?s?s +?s?l?d?d?s?s?d?d +?s?l?d?d?s?s?d?l +?s?l?d?d?s?s?d?s +?s?l?d?d?s?s?l?d +?s?l?d?d?s?s?l?l +?s?l?d?d?s?s?l?s +?s?l?d?d?s?s?s?d +?s?l?d?d?s?s?s?l +?s?l?d?d?s?s?s?s +?s?l?d?l?d?d?d?d +?s?l?d?l?d?d?d?l +?s?l?d?l?d?d?d?s +?s?l?d?l?d?d?l?d +?s?l?d?l?d?d?l?l +?s?l?d?l?d?d?l?s +?s?l?d?l?d?d?s?d +?s?l?d?l?d?d?s?l +?s?l?d?l?d?d?s?s +?s?l?d?l?d?l?d?d +?s?l?d?l?d?l?d?l +?s?l?d?l?d?l?d?s +?s?l?d?l?d?l?l?d +?s?l?d?l?d?l?l?l +?s?l?d?l?d?l?l?s +?s?l?d?l?d?l?s?d +?s?l?d?l?d?l?s?l +?s?l?d?l?d?l?s?s +?s?l?d?l?d?s?d?d +?s?l?d?l?d?s?d?l +?s?l?d?l?d?s?d?s +?s?l?d?l?d?s?l?d +?s?l?d?l?d?s?l?l +?s?l?d?l?d?s?l?s +?s?l?d?l?d?s?s?d +?s?l?d?l?d?s?s?l +?s?l?d?l?d?s?s?s +?s?l?d?l?l?d?d?d +?s?l?d?l?l?d?d?l +?s?l?d?l?l?d?d?s +?s?l?d?l?l?d?l?d +?s?l?d?l?l?d?l?l +?s?l?d?l?l?d?l?s +?s?l?d?l?l?d?s?d +?s?l?d?l?l?d?s?l +?s?l?d?l?l?d?s?s +?s?l?d?l?l?l?d?d +?s?l?d?l?l?l?d?l +?s?l?d?l?l?l?d?s +?s?l?d?l?l?l?l?d +?s?l?d?l?l?l?l?l +?s?l?d?l?l?l?l?s +?s?l?d?l?l?l?s?d +?s?l?d?l?l?l?s?l +?s?l?d?l?l?l?s?s +?s?l?d?l?l?s?d?d +?s?l?d?l?l?s?d?l +?s?l?d?l?l?s?d?s +?s?l?d?l?l?s?l?d +?s?l?d?l?l?s?l?l +?s?l?d?l?l?s?l?s +?s?l?d?l?l?s?s?d +?s?l?d?l?l?s?s?l +?s?l?d?l?l?s?s?s +?s?l?d?l?s?d?d?d +?s?l?d?l?s?d?d?l +?s?l?d?l?s?d?d?s +?s?l?d?l?s?d?l?d +?s?l?d?l?s?d?l?l +?s?l?d?l?s?d?l?s +?s?l?d?l?s?d?s?d +?s?l?d?l?s?d?s?l +?s?l?d?l?s?d?s?s +?s?l?d?l?s?l?d?d +?s?l?d?l?s?l?d?l +?s?l?d?l?s?l?d?s +?s?l?d?l?s?l?l?d +?s?l?d?l?s?l?l?l +?s?l?d?l?s?l?l?s +?s?l?d?l?s?l?s?d +?s?l?d?l?s?l?s?l +?s?l?d?l?s?l?s?s +?s?l?d?l?s?s?d?d +?s?l?d?l?s?s?d?l +?s?l?d?l?s?s?d?s +?s?l?d?l?s?s?l?d +?s?l?d?l?s?s?l?l +?s?l?d?l?s?s?l?s +?s?l?d?l?s?s?s?d +?s?l?d?l?s?s?s?l +?s?l?d?l?s?s?s?s +?s?l?d?s?d?d?d?d +?s?l?d?s?d?d?d?l +?s?l?d?s?d?d?d?s +?s?l?d?s?d?d?l?d +?s?l?d?s?d?d?l?l +?s?l?d?s?d?d?l?s +?s?l?d?s?d?d?s?d +?s?l?d?s?d?d?s?l +?s?l?d?s?d?d?s?s +?s?l?d?s?d?l?d?d +?s?l?d?s?d?l?d?l +?s?l?d?s?d?l?d?s +?s?l?d?s?d?l?l?d +?s?l?d?s?d?l?l?l +?s?l?d?s?d?l?l?s +?s?l?d?s?d?l?s?d +?s?l?d?s?d?l?s?l +?s?l?d?s?d?l?s?s +?s?l?d?s?d?s?d?d +?s?l?d?s?d?s?d?l +?s?l?d?s?d?s?d?s +?s?l?d?s?d?s?l?d +?s?l?d?s?d?s?l?l +?s?l?d?s?d?s?l?s +?s?l?d?s?d?s?s?d +?s?l?d?s?d?s?s?l +?s?l?d?s?d?s?s?s +?s?l?d?s?l?d?d?d +?s?l?d?s?l?d?d?l +?s?l?d?s?l?d?d?s +?s?l?d?s?l?d?l?d +?s?l?d?s?l?d?l?l +?s?l?d?s?l?d?l?s +?s?l?d?s?l?d?s?d +?s?l?d?s?l?d?s?l +?s?l?d?s?l?d?s?s +?s?l?d?s?l?l?d?d +?s?l?d?s?l?l?d?l +?s?l?d?s?l?l?d?s +?s?l?d?s?l?l?l?d +?s?l?d?s?l?l?l?l +?s?l?d?s?l?l?l?s +?s?l?d?s?l?l?s?d +?s?l?d?s?l?l?s?l +?s?l?d?s?l?l?s?s +?s?l?d?s?l?s?d?d +?s?l?d?s?l?s?d?l +?s?l?d?s?l?s?d?s +?s?l?d?s?l?s?l?d +?s?l?d?s?l?s?l?l +?s?l?d?s?l?s?l?s +?s?l?d?s?l?s?s?d +?s?l?d?s?l?s?s?l +?s?l?d?s?l?s?s?s +?s?l?d?s?s?d?d?d +?s?l?d?s?s?d?d?l +?s?l?d?s?s?d?d?s +?s?l?d?s?s?d?l?d +?s?l?d?s?s?d?l?l +?s?l?d?s?s?d?l?s +?s?l?d?s?s?d?s?d +?s?l?d?s?s?d?s?l +?s?l?d?s?s?d?s?s +?s?l?d?s?s?l?d?d +?s?l?d?s?s?l?d?l +?s?l?d?s?s?l?d?s +?s?l?d?s?s?l?l?d +?s?l?d?s?s?l?l?l +?s?l?d?s?s?l?l?s +?s?l?d?s?s?l?s?d +?s?l?d?s?s?l?s?l +?s?l?d?s?s?l?s?s +?s?l?d?s?s?s?d?d +?s?l?d?s?s?s?d?l +?s?l?d?s?s?s?d?s +?s?l?d?s?s?s?l?d +?s?l?d?s?s?s?l?l +?s?l?d?s?s?s?l?s +?s?l?d?s?s?s?s?d +?s?l?d?s?s?s?s?l +?s?l?d?s?s?s?s?s +?s?l?l?d?d?d?d?d +?s?l?l?d?d?d?d?l +?s?l?l?d?d?d?d?s +?s?l?l?d?d?d?l?d +?s?l?l?d?d?d?l?l +?s?l?l?d?d?d?l?s +?s?l?l?d?d?d?s?d +?s?l?l?d?d?d?s?l +?s?l?l?d?d?d?s?s +?s?l?l?d?d?l?d?d +?s?l?l?d?d?l?d?l +?s?l?l?d?d?l?d?s +?s?l?l?d?d?l?l?d +?s?l?l?d?d?l?l?l +?s?l?l?d?d?l?l?s +?s?l?l?d?d?l?s?d +?s?l?l?d?d?l?s?l +?s?l?l?d?d?l?s?s +?s?l?l?d?d?s?d?d +?s?l?l?d?d?s?d?l +?s?l?l?d?d?s?d?s +?s?l?l?d?d?s?l?d +?s?l?l?d?d?s?l?l +?s?l?l?d?d?s?l?s +?s?l?l?d?d?s?s?d +?s?l?l?d?d?s?s?l +?s?l?l?d?d?s?s?s +?s?l?l?d?l?d?d?d +?s?l?l?d?l?d?d?l +?s?l?l?d?l?d?d?s +?s?l?l?d?l?d?l?d +?s?l?l?d?l?d?l?l +?s?l?l?d?l?d?l?s +?s?l?l?d?l?d?s?d +?s?l?l?d?l?d?s?l +?s?l?l?d?l?d?s?s +?s?l?l?d?l?l?d?d +?s?l?l?d?l?l?d?l +?s?l?l?d?l?l?d?s +?s?l?l?d?l?l?l?d +?s?l?l?d?l?l?l?l +?s?l?l?d?l?l?l?s +?s?l?l?d?l?l?s?d +?s?l?l?d?l?l?s?l +?s?l?l?d?l?l?s?s +?s?l?l?d?l?s?d?d +?s?l?l?d?l?s?d?l +?s?l?l?d?l?s?d?s +?s?l?l?d?l?s?l?d +?s?l?l?d?l?s?l?l +?s?l?l?d?l?s?l?s +?s?l?l?d?l?s?s?d +?s?l?l?d?l?s?s?l +?s?l?l?d?l?s?s?s +?s?l?l?d?s?d?d?d +?s?l?l?d?s?d?d?l +?s?l?l?d?s?d?d?s +?s?l?l?d?s?d?l?d +?s?l?l?d?s?d?l?l +?s?l?l?d?s?d?l?s +?s?l?l?d?s?d?s?d +?s?l?l?d?s?d?s?l +?s?l?l?d?s?d?s?s +?s?l?l?d?s?l?d?d +?s?l?l?d?s?l?d?l +?s?l?l?d?s?l?d?s +?s?l?l?d?s?l?l?d +?s?l?l?d?s?l?l?l +?s?l?l?d?s?l?l?s +?s?l?l?d?s?l?s?d +?s?l?l?d?s?l?s?l +?s?l?l?d?s?l?s?s +?s?l?l?d?s?s?d?d +?s?l?l?d?s?s?d?l +?s?l?l?d?s?s?d?s +?s?l?l?d?s?s?l?d +?s?l?l?d?s?s?l?l +?s?l?l?d?s?s?l?s +?s?l?l?d?s?s?s?d +?s?l?l?d?s?s?s?l +?s?l?l?d?s?s?s?s +?s?l?l?l?d?d?d?d +?s?l?l?l?d?d?d?l +?s?l?l?l?d?d?d?s +?s?l?l?l?d?d?l?d +?s?l?l?l?d?d?l?l +?s?l?l?l?d?d?l?s +?s?l?l?l?d?d?s?d +?s?l?l?l?d?d?s?l +?s?l?l?l?d?d?s?s +?s?l?l?l?d?l?d?d +?s?l?l?l?d?l?d?l +?s?l?l?l?d?l?d?s +?s?l?l?l?d?l?l?d +?s?l?l?l?d?l?l?l +?s?l?l?l?d?l?l?s +?s?l?l?l?d?l?s?d +?s?l?l?l?d?l?s?l +?s?l?l?l?d?l?s?s +?s?l?l?l?d?s?d?d +?s?l?l?l?d?s?d?l +?s?l?l?l?d?s?d?s +?s?l?l?l?d?s?l?d +?s?l?l?l?d?s?l?l +?s?l?l?l?d?s?l?s +?s?l?l?l?d?s?s?d +?s?l?l?l?d?s?s?l +?s?l?l?l?d?s?s?s +?s?l?l?l?l?d?d?d +?s?l?l?l?l?d?d?l +?s?l?l?l?l?d?d?s +?s?l?l?l?l?d?l?d +?s?l?l?l?l?d?l?l +?s?l?l?l?l?d?l?s +?s?l?l?l?l?d?s?d +?s?l?l?l?l?d?s?l +?s?l?l?l?l?d?s?s +?s?l?l?l?l?l?d?d +?s?l?l?l?l?l?d?l +?s?l?l?l?l?l?d?s +?s?l?l?l?l?l?l?d +?s?l?l?l?l?l?l?l +?s?l?l?l?l?l?l?u +?s?l?l?l?l?l?l?s +?s?l?l?l?l?l?u?l +?s?l?l?l?l?l?u?u +?s?l?l?l?l?l?u?s +?s?l?l?l?l?l?s?d +?s?l?l?l?l?l?s?l +?s?l?l?l?l?l?s?u +?s?l?l?l?l?l?s?s +?s?l?l?l?l?u?l?l +?s?l?l?l?l?u?l?u +?s?l?l?l?l?u?l?s +?s?l?l?l?l?u?u?l +?s?l?l?l?l?u?u?u +?s?l?l?l?l?u?u?s +?s?l?l?l?l?u?s?l +?s?l?l?l?l?u?s?u +?s?l?l?l?l?u?s?s +?s?l?l?l?l?s?d?d +?s?l?l?l?l?s?d?l +?s?l?l?l?l?s?d?s +?s?l?l?l?l?s?l?d +?s?l?l?l?l?s?l?l +?s?l?l?l?l?s?l?u +?s?l?l?l?l?s?l?s +?s?l?l?l?l?s?u?l +?s?l?l?l?l?s?u?u +?s?l?l?l?l?s?u?s +?s?l?l?l?l?s?s?d +?s?l?l?l?l?s?s?l +?s?l?l?l?l?s?s?u +?s?l?l?l?l?s?s?s +?s?l?l?l?u?l?l?l +?s?l?l?l?u?l?l?u +?s?l?l?l?u?l?l?s +?s?l?l?l?u?l?u?l +?s?l?l?l?u?l?u?u +?s?l?l?l?u?l?u?s +?s?l?l?l?u?l?s?l +?s?l?l?l?u?l?s?u +?s?l?l?l?u?l?s?s +?s?l?l?l?u?u?l?l +?s?l?l?l?u?u?l?u +?s?l?l?l?u?u?l?s +?s?l?l?l?u?u?u?l +?s?l?l?l?u?u?u?u +?s?l?l?l?u?u?u?s +?s?l?l?l?u?u?s?l +?s?l?l?l?u?u?s?u +?s?l?l?l?u?u?s?s +?s?l?l?l?u?s?l?l +?s?l?l?l?u?s?l?u +?s?l?l?l?u?s?l?s +?s?l?l?l?u?s?u?l +?s?l?l?l?u?s?u?u +?s?l?l?l?u?s?u?s +?s?l?l?l?u?s?s?l +?s?l?l?l?u?s?s?u +?s?l?l?l?u?s?s?s +?s?l?l?l?s?d?d?d +?s?l?l?l?s?d?d?l +?s?l?l?l?s?d?d?s +?s?l?l?l?s?d?l?d +?s?l?l?l?s?d?l?l +?s?l?l?l?s?d?l?s +?s?l?l?l?s?d?s?d +?s?l?l?l?s?d?s?l +?s?l?l?l?s?d?s?s +?s?l?l?l?s?l?d?d +?s?l?l?l?s?l?d?l +?s?l?l?l?s?l?d?s +?s?l?l?l?s?l?l?d +?s?l?l?l?s?l?l?l +?s?l?l?l?s?l?l?u +?s?l?l?l?s?l?l?s +?s?l?l?l?s?l?u?l +?s?l?l?l?s?l?u?u +?s?l?l?l?s?l?u?s +?s?l?l?l?s?l?s?d +?s?l?l?l?s?l?s?l +?s?l?l?l?s?l?s?u +?s?l?l?l?s?l?s?s +?s?l?l?l?s?u?l?l +?s?l?l?l?s?u?l?u +?s?l?l?l?s?u?l?s +?s?l?l?l?s?u?u?l +?s?l?l?l?s?u?u?u +?s?l?l?l?s?u?u?s +?s?l?l?l?s?u?s?l +?s?l?l?l?s?u?s?u +?s?l?l?l?s?u?s?s +?s?l?l?l?s?s?d?d +?s?l?l?l?s?s?d?l +?s?l?l?l?s?s?d?s +?s?l?l?l?s?s?l?d +?s?l?l?l?s?s?l?l +?s?l?l?l?s?s?l?u +?s?l?l?l?s?s?l?s +?s?l?l?l?s?s?u?l +?s?l?l?l?s?s?u?u +?s?l?l?l?s?s?u?s +?s?l?l?l?s?s?s?d +?s?l?l?l?s?s?s?l +?s?l?l?l?s?s?s?u +?s?l?l?l?s?s?s?s +?s?l?l?u?l?l?l?l +?s?l?l?u?l?l?l?u +?s?l?l?u?l?l?l?s +?s?l?l?u?l?l?u?l +?s?l?l?u?l?l?u?u +?s?l?l?u?l?l?u?s +?s?l?l?u?l?l?s?l +?s?l?l?u?l?l?s?u +?s?l?l?u?l?l?s?s +?s?l?l?u?l?u?l?l +?s?l?l?u?l?u?l?u +?s?l?l?u?l?u?l?s +?s?l?l?u?l?u?u?l +?s?l?l?u?l?u?u?u +?s?l?l?u?l?u?u?s +?s?l?l?u?l?u?s?l +?s?l?l?u?l?u?s?u +?s?l?l?u?l?u?s?s +?s?l?l?u?l?s?l?l +?s?l?l?u?l?s?l?u +?s?l?l?u?l?s?l?s +?s?l?l?u?l?s?u?l +?s?l?l?u?l?s?u?u +?s?l?l?u?l?s?u?s +?s?l?l?u?l?s?s?l +?s?l?l?u?l?s?s?u +?s?l?l?u?l?s?s?s +?s?l?l?u?u?l?l?l +?s?l?l?u?u?l?l?u +?s?l?l?u?u?l?l?s +?s?l?l?u?u?l?u?l +?s?l?l?u?u?l?u?u +?s?l?l?u?u?l?u?s +?s?l?l?u?u?l?s?l +?s?l?l?u?u?l?s?u +?s?l?l?u?u?l?s?s +?s?l?l?u?u?u?l?l +?s?l?l?u?u?u?l?u +?s?l?l?u?u?u?l?s +?s?l?l?u?u?u?u?l +?s?l?l?u?u?u?u?u +?s?l?l?u?u?u?u?s +?s?l?l?u?u?u?s?l +?s?l?l?u?u?u?s?u +?s?l?l?u?u?u?s?s +?s?l?l?u?u?s?l?l +?s?l?l?u?u?s?l?u +?s?l?l?u?u?s?l?s +?s?l?l?u?u?s?u?l +?s?l?l?u?u?s?u?u +?s?l?l?u?u?s?u?s +?s?l?l?u?u?s?s?l +?s?l?l?u?u?s?s?u +?s?l?l?u?u?s?s?s +?s?l?l?u?s?l?l?l +?s?l?l?u?s?l?l?u +?s?l?l?u?s?l?l?s +?s?l?l?u?s?l?u?l +?s?l?l?u?s?l?u?u +?s?l?l?u?s?l?u?s +?s?l?l?u?s?l?s?l +?s?l?l?u?s?l?s?u +?s?l?l?u?s?l?s?s +?s?l?l?u?s?u?l?l +?s?l?l?u?s?u?l?u +?s?l?l?u?s?u?l?s +?s?l?l?u?s?u?u?l +?s?l?l?u?s?u?u?u +?s?l?l?u?s?u?u?s +?s?l?l?u?s?u?s?l +?s?l?l?u?s?u?s?u +?s?l?l?u?s?u?s?s +?s?l?l?u?s?s?l?l +?s?l?l?u?s?s?l?u +?s?l?l?u?s?s?l?s +?s?l?l?u?s?s?u?l +?s?l?l?u?s?s?u?u +?s?l?l?u?s?s?u?s +?s?l?l?u?s?s?s?l +?s?l?l?u?s?s?s?u +?s?l?l?u?s?s?s?s +?s?l?l?s?d?d?d?d +?s?l?l?s?d?d?d?l +?s?l?l?s?d?d?d?s +?s?l?l?s?d?d?l?d +?s?l?l?s?d?d?l?l +?s?l?l?s?d?d?l?s +?s?l?l?s?d?d?s?d +?s?l?l?s?d?d?s?l +?s?l?l?s?d?d?s?s +?s?l?l?s?d?l?d?d +?s?l?l?s?d?l?d?l +?s?l?l?s?d?l?d?s +?s?l?l?s?d?l?l?d +?s?l?l?s?d?l?l?l +?s?l?l?s?d?l?l?s +?s?l?l?s?d?l?s?d +?s?l?l?s?d?l?s?l +?s?l?l?s?d?l?s?s +?s?l?l?s?d?s?d?d +?s?l?l?s?d?s?d?l +?s?l?l?s?d?s?d?s +?s?l?l?s?d?s?l?d +?s?l?l?s?d?s?l?l +?s?l?l?s?d?s?l?s +?s?l?l?s?d?s?s?d +?s?l?l?s?d?s?s?l +?s?l?l?s?d?s?s?s +?s?l?l?s?l?d?d?d +?s?l?l?s?l?d?d?l +?s?l?l?s?l?d?d?s +?s?l?l?s?l?d?l?d +?s?l?l?s?l?d?l?l +?s?l?l?s?l?d?l?s +?s?l?l?s?l?d?s?d +?s?l?l?s?l?d?s?l +?s?l?l?s?l?d?s?s +?s?l?l?s?l?l?d?d +?s?l?l?s?l?l?d?l +?s?l?l?s?l?l?d?s +?s?l?l?s?l?l?l?d +?s?l?l?s?l?l?l?l +?s?l?l?s?l?l?l?u +?s?l?l?s?l?l?l?s +?s?l?l?s?l?l?u?l +?s?l?l?s?l?l?u?u +?s?l?l?s?l?l?u?s +?s?l?l?s?l?l?s?d +?s?l?l?s?l?l?s?l +?s?l?l?s?l?l?s?u +?s?l?l?s?l?l?s?s +?s?l?l?s?l?u?l?l +?s?l?l?s?l?u?l?u +?s?l?l?s?l?u?l?s +?s?l?l?s?l?u?u?l +?s?l?l?s?l?u?u?u +?s?l?l?s?l?u?u?s +?s?l?l?s?l?u?s?l +?s?l?l?s?l?u?s?u +?s?l?l?s?l?u?s?s +?s?l?l?s?l?s?d?d +?s?l?l?s?l?s?d?l +?s?l?l?s?l?s?d?s +?s?l?l?s?l?s?l?d +?s?l?l?s?l?s?l?l +?s?l?l?s?l?s?l?u +?s?l?l?s?l?s?l?s +?s?l?l?s?l?s?u?l +?s?l?l?s?l?s?u?u +?s?l?l?s?l?s?u?s +?s?l?l?s?l?s?s?d +?s?l?l?s?l?s?s?l +?s?l?l?s?l?s?s?u +?s?l?l?s?l?s?s?s +?s?l?l?s?u?l?l?l +?s?l?l?s?u?l?l?u +?s?l?l?s?u?l?l?s +?s?l?l?s?u?l?u?l +?s?l?l?s?u?l?u?u +?s?l?l?s?u?l?u?s +?s?l?l?s?u?l?s?l +?s?l?l?s?u?l?s?u +?s?l?l?s?u?l?s?s +?s?l?l?s?u?u?l?l +?s?l?l?s?u?u?l?u +?s?l?l?s?u?u?l?s +?s?l?l?s?u?u?u?l +?s?l?l?s?u?u?u?u +?s?l?l?s?u?u?u?s +?s?l?l?s?u?u?s?l +?s?l?l?s?u?u?s?u +?s?l?l?s?u?u?s?s +?s?l?l?s?u?s?l?l +?s?l?l?s?u?s?l?u +?s?l?l?s?u?s?l?s +?s?l?l?s?u?s?u?l +?s?l?l?s?u?s?u?u +?s?l?l?s?u?s?u?s +?s?l?l?s?u?s?s?l +?s?l?l?s?u?s?s?u +?s?l?l?s?u?s?s?s +?s?l?l?s?s?d?d?d +?s?l?l?s?s?d?d?l +?s?l?l?s?s?d?d?s +?s?l?l?s?s?d?l?d +?s?l?l?s?s?d?l?l +?s?l?l?s?s?d?l?s +?s?l?l?s?s?d?s?d +?s?l?l?s?s?d?s?l +?s?l?l?s?s?d?s?s +?s?l?l?s?s?l?d?d +?s?l?l?s?s?l?d?l +?s?l?l?s?s?l?d?s +?s?l?l?s?s?l?l?d +?s?l?l?s?s?l?l?l +?s?l?l?s?s?l?l?u +?s?l?l?s?s?l?l?s +?s?l?l?s?s?l?u?l +?s?l?l?s?s?l?u?u +?s?l?l?s?s?l?u?s +?s?l?l?s?s?l?s?d +?s?l?l?s?s?l?s?l +?s?l?l?s?s?l?s?u +?s?l?l?s?s?l?s?s +?s?l?l?s?s?u?l?l +?s?l?l?s?s?u?l?u +?s?l?l?s?s?u?l?s +?s?l?l?s?s?u?u?l +?s?l?l?s?s?u?u?u +?s?l?l?s?s?u?u?s +?s?l?l?s?s?u?s?l +?s?l?l?s?s?u?s?u +?s?l?l?s?s?u?s?s +?s?l?l?s?s?s?d?d +?s?l?l?s?s?s?d?l +?s?l?l?s?s?s?d?s +?s?l?l?s?s?s?l?d +?s?l?l?s?s?s?l?l +?s?l?l?s?s?s?l?u +?s?l?l?s?s?s?l?s +?s?l?l?s?s?s?u?l +?s?l?l?s?s?s?u?u +?s?l?l?s?s?s?u?s +?s?l?l?s?s?s?s?d +?s?l?l?s?s?s?s?l +?s?l?l?s?s?s?s?u +?s?l?l?s?s?s?s?s +?s?l?u?l?l?l?l?l +?s?l?u?l?l?l?l?u +?s?l?u?l?l?l?l?s +?s?l?u?l?l?l?u?l +?s?l?u?l?l?l?u?u +?s?l?u?l?l?l?u?s +?s?l?u?l?l?l?s?l +?s?l?u?l?l?l?s?u +?s?l?u?l?l?l?s?s +?s?l?u?l?l?u?l?l +?s?l?u?l?l?u?l?u +?s?l?u?l?l?u?l?s +?s?l?u?l?l?u?u?l +?s?l?u?l?l?u?u?u +?s?l?u?l?l?u?u?s +?s?l?u?l?l?u?s?l +?s?l?u?l?l?u?s?u +?s?l?u?l?l?u?s?s +?s?l?u?l?l?s?l?l +?s?l?u?l?l?s?l?u +?s?l?u?l?l?s?l?s +?s?l?u?l?l?s?u?l +?s?l?u?l?l?s?u?u +?s?l?u?l?l?s?u?s +?s?l?u?l?l?s?s?l +?s?l?u?l?l?s?s?u +?s?l?u?l?l?s?s?s +?s?l?u?l?u?l?l?l +?s?l?u?l?u?l?l?u +?s?l?u?l?u?l?l?s +?s?l?u?l?u?l?u?l +?s?l?u?l?u?l?u?u +?s?l?u?l?u?l?u?s +?s?l?u?l?u?l?s?l +?s?l?u?l?u?l?s?u +?s?l?u?l?u?l?s?s +?s?l?u?l?u?u?l?l +?s?l?u?l?u?u?l?u +?s?l?u?l?u?u?l?s +?s?l?u?l?u?u?u?l +?s?l?u?l?u?u?u?u +?s?l?u?l?u?u?u?s +?s?l?u?l?u?u?s?l +?s?l?u?l?u?u?s?u +?s?l?u?l?u?u?s?s +?s?l?u?l?u?s?l?l +?s?l?u?l?u?s?l?u +?s?l?u?l?u?s?l?s +?s?l?u?l?u?s?u?l +?s?l?u?l?u?s?u?u +?s?l?u?l?u?s?u?s +?s?l?u?l?u?s?s?l +?s?l?u?l?u?s?s?u +?s?l?u?l?u?s?s?s +?s?l?u?l?s?l?l?l +?s?l?u?l?s?l?l?u +?s?l?u?l?s?l?l?s +?s?l?u?l?s?l?u?l +?s?l?u?l?s?l?u?u +?s?l?u?l?s?l?u?s +?s?l?u?l?s?l?s?l +?s?l?u?l?s?l?s?u +?s?l?u?l?s?l?s?s +?s?l?u?l?s?u?l?l +?s?l?u?l?s?u?l?u +?s?l?u?l?s?u?l?s +?s?l?u?l?s?u?u?l +?s?l?u?l?s?u?u?u +?s?l?u?l?s?u?u?s +?s?l?u?l?s?u?s?l +?s?l?u?l?s?u?s?u +?s?l?u?l?s?u?s?s +?s?l?u?l?s?s?l?l +?s?l?u?l?s?s?l?u +?s?l?u?l?s?s?l?s +?s?l?u?l?s?s?u?l +?s?l?u?l?s?s?u?u +?s?l?u?l?s?s?u?s +?s?l?u?l?s?s?s?l +?s?l?u?l?s?s?s?u +?s?l?u?l?s?s?s?s +?s?l?u?u?l?l?l?l +?s?l?u?u?l?l?l?u +?s?l?u?u?l?l?l?s +?s?l?u?u?l?l?u?l +?s?l?u?u?l?l?u?u +?s?l?u?u?l?l?u?s +?s?l?u?u?l?l?s?l +?s?l?u?u?l?l?s?u +?s?l?u?u?l?l?s?s +?s?l?u?u?l?u?l?l +?s?l?u?u?l?u?l?u +?s?l?u?u?l?u?l?s +?s?l?u?u?l?u?u?l +?s?l?u?u?l?u?u?u +?s?l?u?u?l?u?u?s +?s?l?u?u?l?u?s?l +?s?l?u?u?l?u?s?u +?s?l?u?u?l?u?s?s +?s?l?u?u?l?s?l?l +?s?l?u?u?l?s?l?u +?s?l?u?u?l?s?l?s +?s?l?u?u?l?s?u?l +?s?l?u?u?l?s?u?u +?s?l?u?u?l?s?u?s +?s?l?u?u?l?s?s?l +?s?l?u?u?l?s?s?u +?s?l?u?u?l?s?s?s +?s?l?u?u?u?l?l?l +?s?l?u?u?u?l?l?u +?s?l?u?u?u?l?l?s +?s?l?u?u?u?l?u?l +?s?l?u?u?u?l?u?u +?s?l?u?u?u?l?u?s +?s?l?u?u?u?l?s?l +?s?l?u?u?u?l?s?u +?s?l?u?u?u?l?s?s +?s?l?u?u?u?u?l?l +?s?l?u?u?u?u?l?u +?s?l?u?u?u?u?l?s +?s?l?u?u?u?u?u?l +?s?l?u?u?u?u?u?u +?s?l?u?u?u?u?u?s +?s?l?u?u?u?u?s?l +?s?l?u?u?u?u?s?u +?s?l?u?u?u?u?s?s +?s?l?u?u?u?s?l?l +?s?l?u?u?u?s?l?u +?s?l?u?u?u?s?l?s +?s?l?u?u?u?s?u?l +?s?l?u?u?u?s?u?u +?s?l?u?u?u?s?u?s +?s?l?u?u?u?s?s?l +?s?l?u?u?u?s?s?u +?s?l?u?u?u?s?s?s +?s?l?u?u?s?l?l?l +?s?l?u?u?s?l?l?u +?s?l?u?u?s?l?l?s +?s?l?u?u?s?l?u?l +?s?l?u?u?s?l?u?u +?s?l?u?u?s?l?u?s +?s?l?u?u?s?l?s?l +?s?l?u?u?s?l?s?u +?s?l?u?u?s?l?s?s +?s?l?u?u?s?u?l?l +?s?l?u?u?s?u?l?u +?s?l?u?u?s?u?l?s +?s?l?u?u?s?u?u?l +?s?l?u?u?s?u?u?u +?s?l?u?u?s?u?u?s +?s?l?u?u?s?u?s?l +?s?l?u?u?s?u?s?u +?s?l?u?u?s?u?s?s +?s?l?u?u?s?s?l?l +?s?l?u?u?s?s?l?u +?s?l?u?u?s?s?l?s +?s?l?u?u?s?s?u?l +?s?l?u?u?s?s?u?u +?s?l?u?u?s?s?u?s +?s?l?u?u?s?s?s?l +?s?l?u?u?s?s?s?u +?s?l?u?u?s?s?s?s +?s?l?u?s?l?l?l?l +?s?l?u?s?l?l?l?u +?s?l?u?s?l?l?l?s +?s?l?u?s?l?l?u?l +?s?l?u?s?l?l?u?u +?s?l?u?s?l?l?u?s +?s?l?u?s?l?l?s?l +?s?l?u?s?l?l?s?u +?s?l?u?s?l?l?s?s +?s?l?u?s?l?u?l?l +?s?l?u?s?l?u?l?u +?s?l?u?s?l?u?l?s +?s?l?u?s?l?u?u?l +?s?l?u?s?l?u?u?u +?s?l?u?s?l?u?u?s +?s?l?u?s?l?u?s?l +?s?l?u?s?l?u?s?u +?s?l?u?s?l?u?s?s +?s?l?u?s?l?s?l?l +?s?l?u?s?l?s?l?u +?s?l?u?s?l?s?l?s +?s?l?u?s?l?s?u?l +?s?l?u?s?l?s?u?u +?s?l?u?s?l?s?u?s +?s?l?u?s?l?s?s?l +?s?l?u?s?l?s?s?u +?s?l?u?s?l?s?s?s +?s?l?u?s?u?l?l?l +?s?l?u?s?u?l?l?u +?s?l?u?s?u?l?l?s +?s?l?u?s?u?l?u?l +?s?l?u?s?u?l?u?u +?s?l?u?s?u?l?u?s +?s?l?u?s?u?l?s?l +?s?l?u?s?u?l?s?u +?s?l?u?s?u?l?s?s +?s?l?u?s?u?u?l?l +?s?l?u?s?u?u?l?u +?s?l?u?s?u?u?l?s +?s?l?u?s?u?u?u?l +?s?l?u?s?u?u?u?u +?s?l?u?s?u?u?u?s +?s?l?u?s?u?u?s?l +?s?l?u?s?u?u?s?u +?s?l?u?s?u?u?s?s +?s?l?u?s?u?s?l?l +?s?l?u?s?u?s?l?u +?s?l?u?s?u?s?l?s +?s?l?u?s?u?s?u?l +?s?l?u?s?u?s?u?u +?s?l?u?s?u?s?u?s +?s?l?u?s?u?s?s?l +?s?l?u?s?u?s?s?u +?s?l?u?s?u?s?s?s +?s?l?u?s?s?l?l?l +?s?l?u?s?s?l?l?u +?s?l?u?s?s?l?l?s +?s?l?u?s?s?l?u?l +?s?l?u?s?s?l?u?u +?s?l?u?s?s?l?u?s +?s?l?u?s?s?l?s?l +?s?l?u?s?s?l?s?u +?s?l?u?s?s?l?s?s +?s?l?u?s?s?u?l?l +?s?l?u?s?s?u?l?u +?s?l?u?s?s?u?l?s +?s?l?u?s?s?u?u?l +?s?l?u?s?s?u?u?u +?s?l?u?s?s?u?u?s +?s?l?u?s?s?u?s?l +?s?l?u?s?s?u?s?u +?s?l?u?s?s?u?s?s +?s?l?u?s?s?s?l?l +?s?l?u?s?s?s?l?u +?s?l?u?s?s?s?l?s +?s?l?u?s?s?s?u?l +?s?l?u?s?s?s?u?u +?s?l?u?s?s?s?u?s +?s?l?u?s?s?s?s?l +?s?l?u?s?s?s?s?u +?s?l?u?s?s?s?s?s +?s?l?s?d?d?d?d?d +?s?l?s?d?d?d?d?l +?s?l?s?d?d?d?d?s +?s?l?s?d?d?d?l?d +?s?l?s?d?d?d?l?l +?s?l?s?d?d?d?l?s +?s?l?s?d?d?d?s?d +?s?l?s?d?d?d?s?l +?s?l?s?d?d?d?s?s +?s?l?s?d?d?l?d?d +?s?l?s?d?d?l?d?l +?s?l?s?d?d?l?d?s +?s?l?s?d?d?l?l?d +?s?l?s?d?d?l?l?l +?s?l?s?d?d?l?l?s +?s?l?s?d?d?l?s?d +?s?l?s?d?d?l?s?l +?s?l?s?d?d?l?s?s +?s?l?s?d?d?s?d?d +?s?l?s?d?d?s?d?l +?s?l?s?d?d?s?d?s +?s?l?s?d?d?s?l?d +?s?l?s?d?d?s?l?l +?s?l?s?d?d?s?l?s +?s?l?s?d?d?s?s?d +?s?l?s?d?d?s?s?l +?s?l?s?d?d?s?s?s +?s?l?s?d?l?d?d?d +?s?l?s?d?l?d?d?l +?s?l?s?d?l?d?d?s +?s?l?s?d?l?d?l?d +?s?l?s?d?l?d?l?l +?s?l?s?d?l?d?l?s +?s?l?s?d?l?d?s?d +?s?l?s?d?l?d?s?l +?s?l?s?d?l?d?s?s +?s?l?s?d?l?l?d?d +?s?l?s?d?l?l?d?l +?s?l?s?d?l?l?d?s +?s?l?s?d?l?l?l?d +?s?l?s?d?l?l?l?l +?s?l?s?d?l?l?l?s +?s?l?s?d?l?l?s?d +?s?l?s?d?l?l?s?l +?s?l?s?d?l?l?s?s +?s?l?s?d?l?s?d?d +?s?l?s?d?l?s?d?l +?s?l?s?d?l?s?d?s +?s?l?s?d?l?s?l?d +?s?l?s?d?l?s?l?l +?s?l?s?d?l?s?l?s +?s?l?s?d?l?s?s?d +?s?l?s?d?l?s?s?l +?s?l?s?d?l?s?s?s +?s?l?s?d?s?d?d?d +?s?l?s?d?s?d?d?l +?s?l?s?d?s?d?d?s +?s?l?s?d?s?d?l?d +?s?l?s?d?s?d?l?l +?s?l?s?d?s?d?l?s +?s?l?s?d?s?d?s?d +?s?l?s?d?s?d?s?l +?s?l?s?d?s?d?s?s +?s?l?s?d?s?l?d?d +?s?l?s?d?s?l?d?l +?s?l?s?d?s?l?d?s +?s?l?s?d?s?l?l?d +?s?l?s?d?s?l?l?l +?s?l?s?d?s?l?l?s +?s?l?s?d?s?l?s?d +?s?l?s?d?s?l?s?l +?s?l?s?d?s?l?s?s +?s?l?s?d?s?s?d?d +?s?l?s?d?s?s?d?l +?s?l?s?d?s?s?d?s +?s?l?s?d?s?s?l?d +?s?l?s?d?s?s?l?l +?s?l?s?d?s?s?l?s +?s?l?s?d?s?s?s?d +?s?l?s?d?s?s?s?l +?s?l?s?d?s?s?s?s +?s?l?s?l?d?d?d?d +?s?l?s?l?d?d?d?l +?s?l?s?l?d?d?d?s +?s?l?s?l?d?d?l?d +?s?l?s?l?d?d?l?l +?s?l?s?l?d?d?l?s +?s?l?s?l?d?d?s?d +?s?l?s?l?d?d?s?l +?s?l?s?l?d?d?s?s +?s?l?s?l?d?l?d?d +?s?l?s?l?d?l?d?l +?s?l?s?l?d?l?d?s +?s?l?s?l?d?l?l?d +?s?l?s?l?d?l?l?l +?s?l?s?l?d?l?l?s +?s?l?s?l?d?l?s?d +?s?l?s?l?d?l?s?l +?s?l?s?l?d?l?s?s +?s?l?s?l?d?s?d?d +?s?l?s?l?d?s?d?l +?s?l?s?l?d?s?d?s +?s?l?s?l?d?s?l?d +?s?l?s?l?d?s?l?l +?s?l?s?l?d?s?l?s +?s?l?s?l?d?s?s?d +?s?l?s?l?d?s?s?l +?s?l?s?l?d?s?s?s +?s?l?s?l?l?d?d?d +?s?l?s?l?l?d?d?l +?s?l?s?l?l?d?d?s +?s?l?s?l?l?d?l?d +?s?l?s?l?l?d?l?l +?s?l?s?l?l?d?l?s +?s?l?s?l?l?d?s?d +?s?l?s?l?l?d?s?l +?s?l?s?l?l?d?s?s +?s?l?s?l?l?l?d?d +?s?l?s?l?l?l?d?l +?s?l?s?l?l?l?d?s +?s?l?s?l?l?l?l?d +?s?l?s?l?l?l?l?l +?s?l?s?l?l?l?l?u +?s?l?s?l?l?l?l?s +?s?l?s?l?l?l?u?l +?s?l?s?l?l?l?u?u +?s?l?s?l?l?l?u?s +?s?l?s?l?l?l?s?d +?s?l?s?l?l?l?s?l +?s?l?s?l?l?l?s?u +?s?l?s?l?l?l?s?s +?s?l?s?l?l?u?l?l +?s?l?s?l?l?u?l?u +?s?l?s?l?l?u?l?s +?s?l?s?l?l?u?u?l +?s?l?s?l?l?u?u?u +?s?l?s?l?l?u?u?s +?s?l?s?l?l?u?s?l +?s?l?s?l?l?u?s?u +?s?l?s?l?l?u?s?s +?s?l?s?l?l?s?d?d +?s?l?s?l?l?s?d?l +?s?l?s?l?l?s?d?s +?s?l?s?l?l?s?l?d +?s?l?s?l?l?s?l?l +?s?l?s?l?l?s?l?u +?s?l?s?l?l?s?l?s +?s?l?s?l?l?s?u?l +?s?l?s?l?l?s?u?u +?s?l?s?l?l?s?u?s +?s?l?s?l?l?s?s?d +?s?l?s?l?l?s?s?l +?s?l?s?l?l?s?s?u +?s?l?s?l?l?s?s?s +?s?l?s?l?u?l?l?l +?s?l?s?l?u?l?l?u +?s?l?s?l?u?l?l?s +?s?l?s?l?u?l?u?l +?s?l?s?l?u?l?u?u +?s?l?s?l?u?l?u?s +?s?l?s?l?u?l?s?l +?s?l?s?l?u?l?s?u +?s?l?s?l?u?l?s?s +?s?l?s?l?u?u?l?l +?s?l?s?l?u?u?l?u +?s?l?s?l?u?u?l?s +?s?l?s?l?u?u?u?l +?s?l?s?l?u?u?u?u +?s?l?s?l?u?u?u?s +?s?l?s?l?u?u?s?l +?s?l?s?l?u?u?s?u +?s?l?s?l?u?u?s?s +?s?l?s?l?u?s?l?l +?s?l?s?l?u?s?l?u +?s?l?s?l?u?s?l?s +?s?l?s?l?u?s?u?l +?s?l?s?l?u?s?u?u +?s?l?s?l?u?s?u?s +?s?l?s?l?u?s?s?l +?s?l?s?l?u?s?s?u +?s?l?s?l?u?s?s?s +?s?l?s?l?s?d?d?d +?s?l?s?l?s?d?d?l +?s?l?s?l?s?d?d?s +?s?l?s?l?s?d?l?d +?s?l?s?l?s?d?l?l +?s?l?s?l?s?d?l?s +?s?l?s?l?s?d?s?d +?s?l?s?l?s?d?s?l +?s?l?s?l?s?d?s?s +?s?l?s?l?s?l?d?d +?s?l?s?l?s?l?d?l +?s?l?s?l?s?l?d?s +?s?l?s?l?s?l?l?d +?s?l?s?l?s?l?l?l +?s?l?s?l?s?l?l?u +?s?l?s?l?s?l?l?s +?s?l?s?l?s?l?u?l +?s?l?s?l?s?l?u?u +?s?l?s?l?s?l?u?s +?s?l?s?l?s?l?s?d +?s?l?s?l?s?l?s?l +?s?l?s?l?s?l?s?u +?s?l?s?l?s?l?s?s +?s?l?s?l?s?u?l?l +?s?l?s?l?s?u?l?u +?s?l?s?l?s?u?l?s +?s?l?s?l?s?u?u?l +?s?l?s?l?s?u?u?u +?s?l?s?l?s?u?u?s +?s?l?s?l?s?u?s?l +?s?l?s?l?s?u?s?u +?s?l?s?l?s?u?s?s +?s?l?s?l?s?s?d?d +?s?l?s?l?s?s?d?l +?s?l?s?l?s?s?d?s +?s?l?s?l?s?s?l?d +?s?l?s?l?s?s?l?l +?s?l?s?l?s?s?l?u +?s?l?s?l?s?s?l?s +?s?l?s?l?s?s?u?l +?s?l?s?l?s?s?u?u +?s?l?s?l?s?s?u?s +?s?l?s?l?s?s?s?d +?s?l?s?l?s?s?s?l +?s?l?s?l?s?s?s?u +?s?l?s?l?s?s?s?s +?s?l?s?u?l?l?l?l +?s?l?s?u?l?l?l?u +?s?l?s?u?l?l?l?s +?s?l?s?u?l?l?u?l +?s?l?s?u?l?l?u?u +?s?l?s?u?l?l?u?s +?s?l?s?u?l?l?s?l +?s?l?s?u?l?l?s?u +?s?l?s?u?l?l?s?s +?s?l?s?u?l?u?l?l +?s?l?s?u?l?u?l?u +?s?l?s?u?l?u?l?s +?s?l?s?u?l?u?u?l +?s?l?s?u?l?u?u?u +?s?l?s?u?l?u?u?s +?s?l?s?u?l?u?s?l +?s?l?s?u?l?u?s?u +?s?l?s?u?l?u?s?s +?s?l?s?u?l?s?l?l +?s?l?s?u?l?s?l?u +?s?l?s?u?l?s?l?s +?s?l?s?u?l?s?u?l +?s?l?s?u?l?s?u?u +?s?l?s?u?l?s?u?s +?s?l?s?u?l?s?s?l +?s?l?s?u?l?s?s?u +?s?l?s?u?l?s?s?s +?s?l?s?u?u?l?l?l +?s?l?s?u?u?l?l?u +?s?l?s?u?u?l?l?s +?s?l?s?u?u?l?u?l +?s?l?s?u?u?l?u?u +?s?l?s?u?u?l?u?s +?s?l?s?u?u?l?s?l +?s?l?s?u?u?l?s?u +?s?l?s?u?u?l?s?s +?s?l?s?u?u?u?l?l +?s?l?s?u?u?u?l?u +?s?l?s?u?u?u?l?s +?s?l?s?u?u?u?u?l +?s?l?s?u?u?u?u?u +?s?l?s?u?u?u?u?s +?s?l?s?u?u?u?s?l +?s?l?s?u?u?u?s?u +?s?l?s?u?u?u?s?s +?s?l?s?u?u?s?l?l +?s?l?s?u?u?s?l?u +?s?l?s?u?u?s?l?s +?s?l?s?u?u?s?u?l +?s?l?s?u?u?s?u?u +?s?l?s?u?u?s?u?s +?s?l?s?u?u?s?s?l +?s?l?s?u?u?s?s?u +?s?l?s?u?u?s?s?s +?s?l?s?u?s?l?l?l +?s?l?s?u?s?l?l?u +?s?l?s?u?s?l?l?s +?s?l?s?u?s?l?u?l +?s?l?s?u?s?l?u?u +?s?l?s?u?s?l?u?s +?s?l?s?u?s?l?s?l +?s?l?s?u?s?l?s?u +?s?l?s?u?s?l?s?s +?s?l?s?u?s?u?l?l +?s?l?s?u?s?u?l?u +?s?l?s?u?s?u?l?s +?s?l?s?u?s?u?u?l +?s?l?s?u?s?u?u?u +?s?l?s?u?s?u?u?s +?s?l?s?u?s?u?s?l +?s?l?s?u?s?u?s?u +?s?l?s?u?s?u?s?s +?s?l?s?u?s?s?l?l +?s?l?s?u?s?s?l?u +?s?l?s?u?s?s?l?s +?s?l?s?u?s?s?u?l +?s?l?s?u?s?s?u?u +?s?l?s?u?s?s?u?s +?s?l?s?u?s?s?s?l +?s?l?s?u?s?s?s?u +?s?l?s?u?s?s?s?s +?s?l?s?s?d?d?d?d +?s?l?s?s?d?d?d?l +?s?l?s?s?d?d?d?s +?s?l?s?s?d?d?l?d +?s?l?s?s?d?d?l?l +?s?l?s?s?d?d?l?s +?s?l?s?s?d?d?s?d +?s?l?s?s?d?d?s?l +?s?l?s?s?d?d?s?s +?s?l?s?s?d?l?d?d +?s?l?s?s?d?l?d?l +?s?l?s?s?d?l?d?s +?s?l?s?s?d?l?l?d +?s?l?s?s?d?l?l?l +?s?l?s?s?d?l?l?s +?s?l?s?s?d?l?s?d +?s?l?s?s?d?l?s?l +?s?l?s?s?d?l?s?s +?s?l?s?s?d?s?d?d +?s?l?s?s?d?s?d?l +?s?l?s?s?d?s?d?s +?s?l?s?s?d?s?l?d +?s?l?s?s?d?s?l?l +?s?l?s?s?d?s?l?s +?s?l?s?s?d?s?s?d +?s?l?s?s?d?s?s?l +?s?l?s?s?d?s?s?s +?s?l?s?s?l?d?d?d +?s?l?s?s?l?d?d?l +?s?l?s?s?l?d?d?s +?s?l?s?s?l?d?l?d +?s?l?s?s?l?d?l?l +?s?l?s?s?l?d?l?s +?s?l?s?s?l?d?s?d +?s?l?s?s?l?d?s?l +?s?l?s?s?l?d?s?s +?s?l?s?s?l?l?d?d +?s?l?s?s?l?l?d?l +?s?l?s?s?l?l?d?s +?s?l?s?s?l?l?l?d +?s?l?s?s?l?l?l?l +?s?l?s?s?l?l?l?u +?s?l?s?s?l?l?l?s +?s?l?s?s?l?l?u?l +?s?l?s?s?l?l?u?u +?s?l?s?s?l?l?u?s +?s?l?s?s?l?l?s?d +?s?l?s?s?l?l?s?l +?s?l?s?s?l?l?s?u +?s?l?s?s?l?l?s?s +?s?l?s?s?l?u?l?l +?s?l?s?s?l?u?l?u +?s?l?s?s?l?u?l?s +?s?l?s?s?l?u?u?l +?s?l?s?s?l?u?u?u +?s?l?s?s?l?u?u?s +?s?l?s?s?l?u?s?l +?s?l?s?s?l?u?s?u +?s?l?s?s?l?u?s?s +?s?l?s?s?l?s?d?d +?s?l?s?s?l?s?d?l +?s?l?s?s?l?s?d?s +?s?l?s?s?l?s?l?d +?s?l?s?s?l?s?l?l +?s?l?s?s?l?s?l?u +?s?l?s?s?l?s?l?s +?s?l?s?s?l?s?u?l +?s?l?s?s?l?s?u?u +?s?l?s?s?l?s?u?s +?s?l?s?s?l?s?s?d +?s?l?s?s?l?s?s?l +?s?l?s?s?l?s?s?u +?s?l?s?s?l?s?s?s +?s?l?s?s?u?l?l?l +?s?l?s?s?u?l?l?u +?s?l?s?s?u?l?l?s +?s?l?s?s?u?l?u?l +?s?l?s?s?u?l?u?u +?s?l?s?s?u?l?u?s +?s?l?s?s?u?l?s?l +?s?l?s?s?u?l?s?u +?s?l?s?s?u?l?s?s +?s?l?s?s?u?u?l?l +?s?l?s?s?u?u?l?u +?s?l?s?s?u?u?l?s +?s?l?s?s?u?u?u?l +?s?l?s?s?u?u?u?u +?s?l?s?s?u?u?u?s +?s?l?s?s?u?u?s?l +?s?l?s?s?u?u?s?u +?s?l?s?s?u?u?s?s +?s?l?s?s?u?s?l?l +?s?l?s?s?u?s?l?u +?s?l?s?s?u?s?l?s +?s?l?s?s?u?s?u?l +?s?l?s?s?u?s?u?u +?s?l?s?s?u?s?u?s +?s?l?s?s?u?s?s?l +?s?l?s?s?u?s?s?u +?s?l?s?s?u?s?s?s +?s?l?s?s?s?d?d?d +?s?l?s?s?s?d?d?l +?s?l?s?s?s?d?d?s +?s?l?s?s?s?d?l?d +?s?l?s?s?s?d?l?l +?s?l?s?s?s?d?l?s +?s?l?s?s?s?d?s?d +?s?l?s?s?s?d?s?l +?s?l?s?s?s?d?s?s +?s?l?s?s?s?l?d?d +?s?l?s?s?s?l?d?l +?s?l?s?s?s?l?d?s +?s?l?s?s?s?l?l?d +?s?l?s?s?s?l?l?l +?s?l?s?s?s?l?l?u +?s?l?s?s?s?l?l?s +?s?l?s?s?s?l?u?l +?s?l?s?s?s?l?u?u +?s?l?s?s?s?l?u?s +?s?l?s?s?s?l?s?d +?s?l?s?s?s?l?s?l +?s?l?s?s?s?l?s?u +?s?l?s?s?s?l?s?s +?s?l?s?s?s?u?l?l +?s?l?s?s?s?u?l?u +?s?l?s?s?s?u?l?s +?s?l?s?s?s?u?u?l +?s?l?s?s?s?u?u?u +?s?l?s?s?s?u?u?s +?s?l?s?s?s?u?s?l +?s?l?s?s?s?u?s?u +?s?l?s?s?s?u?s?s +?s?l?s?s?s?s?d?d +?s?l?s?s?s?s?d?l +?s?l?s?s?s?s?d?s +?s?l?s?s?s?s?l?d +?s?l?s?s?s?s?l?l +?s?l?s?s?s?s?l?u +?s?l?s?s?s?s?l?s +?s?l?s?s?s?s?u?l +?s?l?s?s?s?s?u?u +?s?l?s?s?s?s?u?s +?s?l?s?s?s?s?s?d +?s?l?s?s?s?s?s?l +?s?l?s?s?s?s?s?u +?s?l?s?s?s?s?s?s +?s?u?d?d?d?d?d?d +?s?u?d?d?d?d?d?u +?s?u?d?d?d?d?d?s +?s?u?d?d?d?d?u?d +?s?u?d?d?d?d?u?u +?s?u?d?d?d?d?u?s +?s?u?d?d?d?d?s?d +?s?u?d?d?d?d?s?u +?s?u?d?d?d?d?s?s +?s?u?d?d?d?u?d?d +?s?u?d?d?d?u?d?u +?s?u?d?d?d?u?d?s +?s?u?d?d?d?u?u?d +?s?u?d?d?d?u?u?u +?s?u?d?d?d?u?u?s +?s?u?d?d?d?u?s?d +?s?u?d?d?d?u?s?u +?s?u?d?d?d?u?s?s +?s?u?d?d?d?s?d?d +?s?u?d?d?d?s?d?u +?s?u?d?d?d?s?d?s +?s?u?d?d?d?s?u?d +?s?u?d?d?d?s?u?u +?s?u?d?d?d?s?u?s +?s?u?d?d?d?s?s?d +?s?u?d?d?d?s?s?u +?s?u?d?d?d?s?s?s +?s?u?d?d?u?d?d?d +?s?u?d?d?u?d?d?u +?s?u?d?d?u?d?d?s +?s?u?d?d?u?d?u?d +?s?u?d?d?u?d?u?u +?s?u?d?d?u?d?u?s +?s?u?d?d?u?d?s?d +?s?u?d?d?u?d?s?u +?s?u?d?d?u?d?s?s +?s?u?d?d?u?u?d?d +?s?u?d?d?u?u?d?u +?s?u?d?d?u?u?d?s +?s?u?d?d?u?u?u?d +?s?u?d?d?u?u?u?u +?s?u?d?d?u?u?u?s +?s?u?d?d?u?u?s?d +?s?u?d?d?u?u?s?u +?s?u?d?d?u?u?s?s +?s?u?d?d?u?s?d?d +?s?u?d?d?u?s?d?u +?s?u?d?d?u?s?d?s +?s?u?d?d?u?s?u?d +?s?u?d?d?u?s?u?u +?s?u?d?d?u?s?u?s +?s?u?d?d?u?s?s?d +?s?u?d?d?u?s?s?u +?s?u?d?d?u?s?s?s +?s?u?d?d?s?d?d?d +?s?u?d?d?s?d?d?u +?s?u?d?d?s?d?d?s +?s?u?d?d?s?d?u?d +?s?u?d?d?s?d?u?u +?s?u?d?d?s?d?u?s +?s?u?d?d?s?d?s?d +?s?u?d?d?s?d?s?u +?s?u?d?d?s?d?s?s +?s?u?d?d?s?u?d?d +?s?u?d?d?s?u?d?u +?s?u?d?d?s?u?d?s +?s?u?d?d?s?u?u?d +?s?u?d?d?s?u?u?u +?s?u?d?d?s?u?u?s +?s?u?d?d?s?u?s?d +?s?u?d?d?s?u?s?u +?s?u?d?d?s?u?s?s +?s?u?d?d?s?s?d?d +?s?u?d?d?s?s?d?u +?s?u?d?d?s?s?d?s +?s?u?d?d?s?s?u?d +?s?u?d?d?s?s?u?u +?s?u?d?d?s?s?u?s +?s?u?d?d?s?s?s?d +?s?u?d?d?s?s?s?u +?s?u?d?d?s?s?s?s +?s?u?d?u?d?d?d?d +?s?u?d?u?d?d?d?u +?s?u?d?u?d?d?d?s +?s?u?d?u?d?d?u?d +?s?u?d?u?d?d?u?u +?s?u?d?u?d?d?u?s +?s?u?d?u?d?d?s?d +?s?u?d?u?d?d?s?u +?s?u?d?u?d?d?s?s +?s?u?d?u?d?u?d?d +?s?u?d?u?d?u?d?u +?s?u?d?u?d?u?d?s +?s?u?d?u?d?u?u?d +?s?u?d?u?d?u?u?u +?s?u?d?u?d?u?u?s +?s?u?d?u?d?u?s?d +?s?u?d?u?d?u?s?u +?s?u?d?u?d?u?s?s +?s?u?d?u?d?s?d?d +?s?u?d?u?d?s?d?u +?s?u?d?u?d?s?d?s +?s?u?d?u?d?s?u?d +?s?u?d?u?d?s?u?u +?s?u?d?u?d?s?u?s +?s?u?d?u?d?s?s?d +?s?u?d?u?d?s?s?u +?s?u?d?u?d?s?s?s +?s?u?d?u?u?d?d?d +?s?u?d?u?u?d?d?u +?s?u?d?u?u?d?d?s +?s?u?d?u?u?d?u?d +?s?u?d?u?u?d?u?u +?s?u?d?u?u?d?u?s +?s?u?d?u?u?d?s?d +?s?u?d?u?u?d?s?u +?s?u?d?u?u?d?s?s +?s?u?d?u?u?u?d?d +?s?u?d?u?u?u?d?u +?s?u?d?u?u?u?d?s +?s?u?d?u?u?u?u?d +?s?u?d?u?u?u?u?u +?s?u?d?u?u?u?u?s +?s?u?d?u?u?u?s?d +?s?u?d?u?u?u?s?u +?s?u?d?u?u?u?s?s +?s?u?d?u?u?s?d?d +?s?u?d?u?u?s?d?u +?s?u?d?u?u?s?d?s +?s?u?d?u?u?s?u?d +?s?u?d?u?u?s?u?u +?s?u?d?u?u?s?u?s +?s?u?d?u?u?s?s?d +?s?u?d?u?u?s?s?u +?s?u?d?u?u?s?s?s +?s?u?d?u?s?d?d?d +?s?u?d?u?s?d?d?u +?s?u?d?u?s?d?d?s +?s?u?d?u?s?d?u?d +?s?u?d?u?s?d?u?u +?s?u?d?u?s?d?u?s +?s?u?d?u?s?d?s?d +?s?u?d?u?s?d?s?u +?s?u?d?u?s?d?s?s +?s?u?d?u?s?u?d?d +?s?u?d?u?s?u?d?u +?s?u?d?u?s?u?d?s +?s?u?d?u?s?u?u?d +?s?u?d?u?s?u?u?u +?s?u?d?u?s?u?u?s +?s?u?d?u?s?u?s?d +?s?u?d?u?s?u?s?u +?s?u?d?u?s?u?s?s +?s?u?d?u?s?s?d?d +?s?u?d?u?s?s?d?u +?s?u?d?u?s?s?d?s +?s?u?d?u?s?s?u?d +?s?u?d?u?s?s?u?u +?s?u?d?u?s?s?u?s +?s?u?d?u?s?s?s?d +?s?u?d?u?s?s?s?u +?s?u?d?u?s?s?s?s +?s?u?d?s?d?d?d?d +?s?u?d?s?d?d?d?u +?s?u?d?s?d?d?d?s +?s?u?d?s?d?d?u?d +?s?u?d?s?d?d?u?u +?s?u?d?s?d?d?u?s +?s?u?d?s?d?d?s?d +?s?u?d?s?d?d?s?u +?s?u?d?s?d?d?s?s +?s?u?d?s?d?u?d?d +?s?u?d?s?d?u?d?u +?s?u?d?s?d?u?d?s +?s?u?d?s?d?u?u?d +?s?u?d?s?d?u?u?u +?s?u?d?s?d?u?u?s +?s?u?d?s?d?u?s?d +?s?u?d?s?d?u?s?u +?s?u?d?s?d?u?s?s +?s?u?d?s?d?s?d?d +?s?u?d?s?d?s?d?u +?s?u?d?s?d?s?d?s +?s?u?d?s?d?s?u?d +?s?u?d?s?d?s?u?u +?s?u?d?s?d?s?u?s +?s?u?d?s?d?s?s?d +?s?u?d?s?d?s?s?u +?s?u?d?s?d?s?s?s +?s?u?d?s?u?d?d?d +?s?u?d?s?u?d?d?u +?s?u?d?s?u?d?d?s +?s?u?d?s?u?d?u?d +?s?u?d?s?u?d?u?u +?s?u?d?s?u?d?u?s +?s?u?d?s?u?d?s?d +?s?u?d?s?u?d?s?u +?s?u?d?s?u?d?s?s +?s?u?d?s?u?u?d?d +?s?u?d?s?u?u?d?u +?s?u?d?s?u?u?d?s +?s?u?d?s?u?u?u?d +?s?u?d?s?u?u?u?u +?s?u?d?s?u?u?u?s +?s?u?d?s?u?u?s?d +?s?u?d?s?u?u?s?u +?s?u?d?s?u?u?s?s +?s?u?d?s?u?s?d?d +?s?u?d?s?u?s?d?u +?s?u?d?s?u?s?d?s +?s?u?d?s?u?s?u?d +?s?u?d?s?u?s?u?u +?s?u?d?s?u?s?u?s +?s?u?d?s?u?s?s?d +?s?u?d?s?u?s?s?u +?s?u?d?s?u?s?s?s +?s?u?d?s?s?d?d?d +?s?u?d?s?s?d?d?u +?s?u?d?s?s?d?d?s +?s?u?d?s?s?d?u?d +?s?u?d?s?s?d?u?u +?s?u?d?s?s?d?u?s +?s?u?d?s?s?d?s?d +?s?u?d?s?s?d?s?u +?s?u?d?s?s?d?s?s +?s?u?d?s?s?u?d?d +?s?u?d?s?s?u?d?u +?s?u?d?s?s?u?d?s +?s?u?d?s?s?u?u?d +?s?u?d?s?s?u?u?u +?s?u?d?s?s?u?u?s +?s?u?d?s?s?u?s?d +?s?u?d?s?s?u?s?u +?s?u?d?s?s?u?s?s +?s?u?d?s?s?s?d?d +?s?u?d?s?s?s?d?u +?s?u?d?s?s?s?d?s +?s?u?d?s?s?s?u?d +?s?u?d?s?s?s?u?u +?s?u?d?s?s?s?u?s +?s?u?d?s?s?s?s?d +?s?u?d?s?s?s?s?u +?s?u?d?s?s?s?s?s +?s?u?l?l?l?l?l?l +?s?u?l?l?l?l?l?u +?s?u?l?l?l?l?l?s +?s?u?l?l?l?l?u?l +?s?u?l?l?l?l?u?u +?s?u?l?l?l?l?u?s +?s?u?l?l?l?l?s?l +?s?u?l?l?l?l?s?u +?s?u?l?l?l?l?s?s +?s?u?l?l?l?u?l?l +?s?u?l?l?l?u?l?u +?s?u?l?l?l?u?l?s +?s?u?l?l?l?u?u?l +?s?u?l?l?l?u?u?u +?s?u?l?l?l?u?u?s +?s?u?l?l?l?u?s?l +?s?u?l?l?l?u?s?u +?s?u?l?l?l?u?s?s +?s?u?l?l?l?s?l?l +?s?u?l?l?l?s?l?u +?s?u?l?l?l?s?l?s +?s?u?l?l?l?s?u?l +?s?u?l?l?l?s?u?u +?s?u?l?l?l?s?u?s +?s?u?l?l?l?s?s?l +?s?u?l?l?l?s?s?u +?s?u?l?l?l?s?s?s +?s?u?l?l?u?l?l?l +?s?u?l?l?u?l?l?u +?s?u?l?l?u?l?l?s +?s?u?l?l?u?l?u?l +?s?u?l?l?u?l?u?u +?s?u?l?l?u?l?u?s +?s?u?l?l?u?l?s?l +?s?u?l?l?u?l?s?u +?s?u?l?l?u?l?s?s +?s?u?l?l?u?u?l?l +?s?u?l?l?u?u?l?u +?s?u?l?l?u?u?l?s +?s?u?l?l?u?u?u?l +?s?u?l?l?u?u?u?u +?s?u?l?l?u?u?u?s +?s?u?l?l?u?u?s?l +?s?u?l?l?u?u?s?u +?s?u?l?l?u?u?s?s +?s?u?l?l?u?s?l?l +?s?u?l?l?u?s?l?u +?s?u?l?l?u?s?l?s +?s?u?l?l?u?s?u?l +?s?u?l?l?u?s?u?u +?s?u?l?l?u?s?u?s +?s?u?l?l?u?s?s?l +?s?u?l?l?u?s?s?u +?s?u?l?l?u?s?s?s +?s?u?l?l?s?l?l?l +?s?u?l?l?s?l?l?u +?s?u?l?l?s?l?l?s +?s?u?l?l?s?l?u?l +?s?u?l?l?s?l?u?u +?s?u?l?l?s?l?u?s +?s?u?l?l?s?l?s?l +?s?u?l?l?s?l?s?u +?s?u?l?l?s?l?s?s +?s?u?l?l?s?u?l?l +?s?u?l?l?s?u?l?u +?s?u?l?l?s?u?l?s +?s?u?l?l?s?u?u?l +?s?u?l?l?s?u?u?u +?s?u?l?l?s?u?u?s +?s?u?l?l?s?u?s?l +?s?u?l?l?s?u?s?u +?s?u?l?l?s?u?s?s +?s?u?l?l?s?s?l?l +?s?u?l?l?s?s?l?u +?s?u?l?l?s?s?l?s +?s?u?l?l?s?s?u?l +?s?u?l?l?s?s?u?u +?s?u?l?l?s?s?u?s +?s?u?l?l?s?s?s?l +?s?u?l?l?s?s?s?u +?s?u?l?l?s?s?s?s +?s?u?l?u?l?l?l?l +?s?u?l?u?l?l?l?u +?s?u?l?u?l?l?l?s +?s?u?l?u?l?l?u?l +?s?u?l?u?l?l?u?u +?s?u?l?u?l?l?u?s +?s?u?l?u?l?l?s?l +?s?u?l?u?l?l?s?u +?s?u?l?u?l?l?s?s +?s?u?l?u?l?u?l?l +?s?u?l?u?l?u?l?u +?s?u?l?u?l?u?l?s +?s?u?l?u?l?u?u?l +?s?u?l?u?l?u?u?u +?s?u?l?u?l?u?u?s +?s?u?l?u?l?u?s?l +?s?u?l?u?l?u?s?u +?s?u?l?u?l?u?s?s +?s?u?l?u?l?s?l?l +?s?u?l?u?l?s?l?u +?s?u?l?u?l?s?l?s +?s?u?l?u?l?s?u?l +?s?u?l?u?l?s?u?u +?s?u?l?u?l?s?u?s +?s?u?l?u?l?s?s?l +?s?u?l?u?l?s?s?u +?s?u?l?u?l?s?s?s +?s?u?l?u?u?l?l?l +?s?u?l?u?u?l?l?u +?s?u?l?u?u?l?l?s +?s?u?l?u?u?l?u?l +?s?u?l?u?u?l?u?u +?s?u?l?u?u?l?u?s +?s?u?l?u?u?l?s?l +?s?u?l?u?u?l?s?u +?s?u?l?u?u?l?s?s +?s?u?l?u?u?u?l?l +?s?u?l?u?u?u?l?u +?s?u?l?u?u?u?l?s +?s?u?l?u?u?u?u?l +?s?u?l?u?u?u?u?u +?s?u?l?u?u?u?u?s +?s?u?l?u?u?u?s?l +?s?u?l?u?u?u?s?u +?s?u?l?u?u?u?s?s +?s?u?l?u?u?s?l?l +?s?u?l?u?u?s?l?u +?s?u?l?u?u?s?l?s +?s?u?l?u?u?s?u?l +?s?u?l?u?u?s?u?u +?s?u?l?u?u?s?u?s +?s?u?l?u?u?s?s?l +?s?u?l?u?u?s?s?u +?s?u?l?u?u?s?s?s +?s?u?l?u?s?l?l?l +?s?u?l?u?s?l?l?u +?s?u?l?u?s?l?l?s +?s?u?l?u?s?l?u?l +?s?u?l?u?s?l?u?u +?s?u?l?u?s?l?u?s +?s?u?l?u?s?l?s?l +?s?u?l?u?s?l?s?u +?s?u?l?u?s?l?s?s +?s?u?l?u?s?u?l?l +?s?u?l?u?s?u?l?u +?s?u?l?u?s?u?l?s +?s?u?l?u?s?u?u?l +?s?u?l?u?s?u?u?u +?s?u?l?u?s?u?u?s +?s?u?l?u?s?u?s?l +?s?u?l?u?s?u?s?u +?s?u?l?u?s?u?s?s +?s?u?l?u?s?s?l?l +?s?u?l?u?s?s?l?u +?s?u?l?u?s?s?l?s +?s?u?l?u?s?s?u?l +?s?u?l?u?s?s?u?u +?s?u?l?u?s?s?u?s +?s?u?l?u?s?s?s?l +?s?u?l?u?s?s?s?u +?s?u?l?u?s?s?s?s +?s?u?l?s?l?l?l?l +?s?u?l?s?l?l?l?u +?s?u?l?s?l?l?l?s +?s?u?l?s?l?l?u?l +?s?u?l?s?l?l?u?u +?s?u?l?s?l?l?u?s +?s?u?l?s?l?l?s?l +?s?u?l?s?l?l?s?u +?s?u?l?s?l?l?s?s +?s?u?l?s?l?u?l?l +?s?u?l?s?l?u?l?u +?s?u?l?s?l?u?l?s +?s?u?l?s?l?u?u?l +?s?u?l?s?l?u?u?u +?s?u?l?s?l?u?u?s +?s?u?l?s?l?u?s?l +?s?u?l?s?l?u?s?u +?s?u?l?s?l?u?s?s +?s?u?l?s?l?s?l?l +?s?u?l?s?l?s?l?u +?s?u?l?s?l?s?l?s +?s?u?l?s?l?s?u?l +?s?u?l?s?l?s?u?u +?s?u?l?s?l?s?u?s +?s?u?l?s?l?s?s?l +?s?u?l?s?l?s?s?u +?s?u?l?s?l?s?s?s +?s?u?l?s?u?l?l?l +?s?u?l?s?u?l?l?u +?s?u?l?s?u?l?l?s +?s?u?l?s?u?l?u?l +?s?u?l?s?u?l?u?u +?s?u?l?s?u?l?u?s +?s?u?l?s?u?l?s?l +?s?u?l?s?u?l?s?u +?s?u?l?s?u?l?s?s +?s?u?l?s?u?u?l?l +?s?u?l?s?u?u?l?u +?s?u?l?s?u?u?l?s +?s?u?l?s?u?u?u?l +?s?u?l?s?u?u?u?u +?s?u?l?s?u?u?u?s +?s?u?l?s?u?u?s?l +?s?u?l?s?u?u?s?u +?s?u?l?s?u?u?s?s +?s?u?l?s?u?s?l?l +?s?u?l?s?u?s?l?u +?s?u?l?s?u?s?l?s +?s?u?l?s?u?s?u?l +?s?u?l?s?u?s?u?u +?s?u?l?s?u?s?u?s +?s?u?l?s?u?s?s?l +?s?u?l?s?u?s?s?u +?s?u?l?s?u?s?s?s +?s?u?l?s?s?l?l?l +?s?u?l?s?s?l?l?u +?s?u?l?s?s?l?l?s +?s?u?l?s?s?l?u?l +?s?u?l?s?s?l?u?u +?s?u?l?s?s?l?u?s +?s?u?l?s?s?l?s?l +?s?u?l?s?s?l?s?u +?s?u?l?s?s?l?s?s +?s?u?l?s?s?u?l?l +?s?u?l?s?s?u?l?u +?s?u?l?s?s?u?l?s +?s?u?l?s?s?u?u?l +?s?u?l?s?s?u?u?u +?s?u?l?s?s?u?u?s +?s?u?l?s?s?u?s?l +?s?u?l?s?s?u?s?u +?s?u?l?s?s?u?s?s +?s?u?l?s?s?s?l?l +?s?u?l?s?s?s?l?u +?s?u?l?s?s?s?l?s +?s?u?l?s?s?s?u?l +?s?u?l?s?s?s?u?u +?s?u?l?s?s?s?u?s +?s?u?l?s?s?s?s?l +?s?u?l?s?s?s?s?u +?s?u?l?s?s?s?s?s +?s?u?u?d?d?d?d?d +?s?u?u?d?d?d?d?u +?s?u?u?d?d?d?d?s +?s?u?u?d?d?d?u?d +?s?u?u?d?d?d?u?u +?s?u?u?d?d?d?u?s +?s?u?u?d?d?d?s?d +?s?u?u?d?d?d?s?u +?s?u?u?d?d?d?s?s +?s?u?u?d?d?u?d?d +?s?u?u?d?d?u?d?u +?s?u?u?d?d?u?d?s +?s?u?u?d?d?u?u?d +?s?u?u?d?d?u?u?u +?s?u?u?d?d?u?u?s +?s?u?u?d?d?u?s?d +?s?u?u?d?d?u?s?u +?s?u?u?d?d?u?s?s +?s?u?u?d?d?s?d?d +?s?u?u?d?d?s?d?u +?s?u?u?d?d?s?d?s +?s?u?u?d?d?s?u?d +?s?u?u?d?d?s?u?u +?s?u?u?d?d?s?u?s +?s?u?u?d?d?s?s?d +?s?u?u?d?d?s?s?u +?s?u?u?d?d?s?s?s +?s?u?u?d?u?d?d?d +?s?u?u?d?u?d?d?u +?s?u?u?d?u?d?d?s +?s?u?u?d?u?d?u?d +?s?u?u?d?u?d?u?u +?s?u?u?d?u?d?u?s +?s?u?u?d?u?d?s?d +?s?u?u?d?u?d?s?u +?s?u?u?d?u?d?s?s +?s?u?u?d?u?u?d?d +?s?u?u?d?u?u?d?u +?s?u?u?d?u?u?d?s +?s?u?u?d?u?u?u?d +?s?u?u?d?u?u?u?u +?s?u?u?d?u?u?u?s +?s?u?u?d?u?u?s?d +?s?u?u?d?u?u?s?u +?s?u?u?d?u?u?s?s +?s?u?u?d?u?s?d?d +?s?u?u?d?u?s?d?u +?s?u?u?d?u?s?d?s +?s?u?u?d?u?s?u?d +?s?u?u?d?u?s?u?u +?s?u?u?d?u?s?u?s +?s?u?u?d?u?s?s?d +?s?u?u?d?u?s?s?u +?s?u?u?d?u?s?s?s +?s?u?u?d?s?d?d?d +?s?u?u?d?s?d?d?u +?s?u?u?d?s?d?d?s +?s?u?u?d?s?d?u?d +?s?u?u?d?s?d?u?u +?s?u?u?d?s?d?u?s +?s?u?u?d?s?d?s?d +?s?u?u?d?s?d?s?u +?s?u?u?d?s?d?s?s +?s?u?u?d?s?u?d?d +?s?u?u?d?s?u?d?u +?s?u?u?d?s?u?d?s +?s?u?u?d?s?u?u?d +?s?u?u?d?s?u?u?u +?s?u?u?d?s?u?u?s +?s?u?u?d?s?u?s?d +?s?u?u?d?s?u?s?u +?s?u?u?d?s?u?s?s +?s?u?u?d?s?s?d?d +?s?u?u?d?s?s?d?u +?s?u?u?d?s?s?d?s +?s?u?u?d?s?s?u?d +?s?u?u?d?s?s?u?u +?s?u?u?d?s?s?u?s +?s?u?u?d?s?s?s?d +?s?u?u?d?s?s?s?u +?s?u?u?d?s?s?s?s +?s?u?u?l?l?l?l?l +?s?u?u?l?l?l?l?u +?s?u?u?l?l?l?l?s +?s?u?u?l?l?l?u?l +?s?u?u?l?l?l?u?u +?s?u?u?l?l?l?u?s +?s?u?u?l?l?l?s?l +?s?u?u?l?l?l?s?u +?s?u?u?l?l?l?s?s +?s?u?u?l?l?u?l?l +?s?u?u?l?l?u?l?u +?s?u?u?l?l?u?l?s +?s?u?u?l?l?u?u?l +?s?u?u?l?l?u?u?u +?s?u?u?l?l?u?u?s +?s?u?u?l?l?u?s?l +?s?u?u?l?l?u?s?u +?s?u?u?l?l?u?s?s +?s?u?u?l?l?s?l?l +?s?u?u?l?l?s?l?u +?s?u?u?l?l?s?l?s +?s?u?u?l?l?s?u?l +?s?u?u?l?l?s?u?u +?s?u?u?l?l?s?u?s +?s?u?u?l?l?s?s?l +?s?u?u?l?l?s?s?u +?s?u?u?l?l?s?s?s +?s?u?u?l?u?l?l?l +?s?u?u?l?u?l?l?u +?s?u?u?l?u?l?l?s +?s?u?u?l?u?l?u?l +?s?u?u?l?u?l?u?u +?s?u?u?l?u?l?u?s +?s?u?u?l?u?l?s?l +?s?u?u?l?u?l?s?u +?s?u?u?l?u?l?s?s +?s?u?u?l?u?u?l?l +?s?u?u?l?u?u?l?u +?s?u?u?l?u?u?l?s +?s?u?u?l?u?u?u?l +?s?u?u?l?u?u?u?u +?s?u?u?l?u?u?u?s +?s?u?u?l?u?u?s?l +?s?u?u?l?u?u?s?u +?s?u?u?l?u?u?s?s +?s?u?u?l?u?s?l?l +?s?u?u?l?u?s?l?u +?s?u?u?l?u?s?l?s +?s?u?u?l?u?s?u?l +?s?u?u?l?u?s?u?u +?s?u?u?l?u?s?u?s +?s?u?u?l?u?s?s?l +?s?u?u?l?u?s?s?u +?s?u?u?l?u?s?s?s +?s?u?u?l?s?l?l?l +?s?u?u?l?s?l?l?u +?s?u?u?l?s?l?l?s +?s?u?u?l?s?l?u?l +?s?u?u?l?s?l?u?u +?s?u?u?l?s?l?u?s +?s?u?u?l?s?l?s?l +?s?u?u?l?s?l?s?u +?s?u?u?l?s?l?s?s +?s?u?u?l?s?u?l?l +?s?u?u?l?s?u?l?u +?s?u?u?l?s?u?l?s +?s?u?u?l?s?u?u?l +?s?u?u?l?s?u?u?u +?s?u?u?l?s?u?u?s +?s?u?u?l?s?u?s?l +?s?u?u?l?s?u?s?u +?s?u?u?l?s?u?s?s +?s?u?u?l?s?s?l?l +?s?u?u?l?s?s?l?u +?s?u?u?l?s?s?l?s +?s?u?u?l?s?s?u?l +?s?u?u?l?s?s?u?u +?s?u?u?l?s?s?u?s +?s?u?u?l?s?s?s?l +?s?u?u?l?s?s?s?u +?s?u?u?l?s?s?s?s +?s?u?u?u?d?d?d?d +?s?u?u?u?d?d?d?u +?s?u?u?u?d?d?d?s +?s?u?u?u?d?d?u?d +?s?u?u?u?d?d?u?u +?s?u?u?u?d?d?u?s +?s?u?u?u?d?d?s?d +?s?u?u?u?d?d?s?u +?s?u?u?u?d?d?s?s +?s?u?u?u?d?u?d?d +?s?u?u?u?d?u?d?u +?s?u?u?u?d?u?d?s +?s?u?u?u?d?u?u?d +?s?u?u?u?d?u?u?u +?s?u?u?u?d?u?u?s +?s?u?u?u?d?u?s?d +?s?u?u?u?d?u?s?u +?s?u?u?u?d?u?s?s +?s?u?u?u?d?s?d?d +?s?u?u?u?d?s?d?u +?s?u?u?u?d?s?d?s +?s?u?u?u?d?s?u?d +?s?u?u?u?d?s?u?u +?s?u?u?u?d?s?u?s +?s?u?u?u?d?s?s?d +?s?u?u?u?d?s?s?u +?s?u?u?u?d?s?s?s +?s?u?u?u?l?l?l?l +?s?u?u?u?l?l?l?u +?s?u?u?u?l?l?l?s +?s?u?u?u?l?l?u?l +?s?u?u?u?l?l?u?u +?s?u?u?u?l?l?u?s +?s?u?u?u?l?l?s?l +?s?u?u?u?l?l?s?u +?s?u?u?u?l?l?s?s +?s?u?u?u?l?u?l?l +?s?u?u?u?l?u?l?u +?s?u?u?u?l?u?l?s +?s?u?u?u?l?u?u?l +?s?u?u?u?l?u?u?u +?s?u?u?u?l?u?u?s +?s?u?u?u?l?u?s?l +?s?u?u?u?l?u?s?u +?s?u?u?u?l?u?s?s +?s?u?u?u?l?s?l?l +?s?u?u?u?l?s?l?u +?s?u?u?u?l?s?l?s +?s?u?u?u?l?s?u?l +?s?u?u?u?l?s?u?u +?s?u?u?u?l?s?u?s +?s?u?u?u?l?s?s?l +?s?u?u?u?l?s?s?u +?s?u?u?u?l?s?s?s +?s?u?u?u?u?d?d?d +?s?u?u?u?u?d?d?u +?s?u?u?u?u?d?d?s +?s?u?u?u?u?d?u?d +?s?u?u?u?u?d?u?u +?s?u?u?u?u?d?u?s +?s?u?u?u?u?d?s?d +?s?u?u?u?u?d?s?u +?s?u?u?u?u?d?s?s +?s?u?u?u?u?l?l?l +?s?u?u?u?u?l?l?u +?s?u?u?u?u?l?l?s +?s?u?u?u?u?l?u?l +?s?u?u?u?u?l?u?u +?s?u?u?u?u?l?u?s +?s?u?u?u?u?l?s?l +?s?u?u?u?u?l?s?u +?s?u?u?u?u?l?s?s +?s?u?u?u?u?u?d?d +?s?u?u?u?u?u?d?u +?s?u?u?u?u?u?d?s +?s?u?u?u?u?u?l?l +?s?u?u?u?u?u?l?u +?s?u?u?u?u?u?l?s +?s?u?u?u?u?u?u?d +?s?u?u?u?u?u?u?l +?s?u?u?u?u?u?u?u +?s?u?u?u?u?u?u?s +?s?u?u?u?u?u?s?d +?s?u?u?u?u?u?s?l +?s?u?u?u?u?u?s?u +?s?u?u?u?u?u?s?s +?s?u?u?u?u?s?d?d +?s?u?u?u?u?s?d?u +?s?u?u?u?u?s?d?s +?s?u?u?u?u?s?l?l +?s?u?u?u?u?s?l?u +?s?u?u?u?u?s?l?s +?s?u?u?u?u?s?u?d +?s?u?u?u?u?s?u?l +?s?u?u?u?u?s?u?u +?s?u?u?u?u?s?u?s +?s?u?u?u?u?s?s?d +?s?u?u?u?u?s?s?l +?s?u?u?u?u?s?s?u +?s?u?u?u?u?s?s?s +?s?u?u?u?s?d?d?d +?s?u?u?u?s?d?d?u +?s?u?u?u?s?d?d?s +?s?u?u?u?s?d?u?d +?s?u?u?u?s?d?u?u +?s?u?u?u?s?d?u?s +?s?u?u?u?s?d?s?d +?s?u?u?u?s?d?s?u +?s?u?u?u?s?d?s?s +?s?u?u?u?s?l?l?l +?s?u?u?u?s?l?l?u +?s?u?u?u?s?l?l?s +?s?u?u?u?s?l?u?l +?s?u?u?u?s?l?u?u +?s?u?u?u?s?l?u?s +?s?u?u?u?s?l?s?l +?s?u?u?u?s?l?s?u +?s?u?u?u?s?l?s?s +?s?u?u?u?s?u?d?d +?s?u?u?u?s?u?d?u +?s?u?u?u?s?u?d?s +?s?u?u?u?s?u?l?l +?s?u?u?u?s?u?l?u +?s?u?u?u?s?u?l?s +?s?u?u?u?s?u?u?d +?s?u?u?u?s?u?u?l +?s?u?u?u?s?u?u?u +?s?u?u?u?s?u?u?s +?s?u?u?u?s?u?s?d +?s?u?u?u?s?u?s?l +?s?u?u?u?s?u?s?u +?s?u?u?u?s?u?s?s +?s?u?u?u?s?s?d?d +?s?u?u?u?s?s?d?u +?s?u?u?u?s?s?d?s +?s?u?u?u?s?s?l?l +?s?u?u?u?s?s?l?u +?s?u?u?u?s?s?l?s +?s?u?u?u?s?s?u?d +?s?u?u?u?s?s?u?l +?s?u?u?u?s?s?u?u +?s?u?u?u?s?s?u?s +?s?u?u?u?s?s?s?d +?s?u?u?u?s?s?s?l +?s?u?u?u?s?s?s?u +?s?u?u?u?s?s?s?s +?s?u?u?s?d?d?d?d +?s?u?u?s?d?d?d?u +?s?u?u?s?d?d?d?s +?s?u?u?s?d?d?u?d +?s?u?u?s?d?d?u?u +?s?u?u?s?d?d?u?s +?s?u?u?s?d?d?s?d +?s?u?u?s?d?d?s?u +?s?u?u?s?d?d?s?s +?s?u?u?s?d?u?d?d +?s?u?u?s?d?u?d?u +?s?u?u?s?d?u?d?s +?s?u?u?s?d?u?u?d +?s?u?u?s?d?u?u?u +?s?u?u?s?d?u?u?s +?s?u?u?s?d?u?s?d +?s?u?u?s?d?u?s?u +?s?u?u?s?d?u?s?s +?s?u?u?s?d?s?d?d +?s?u?u?s?d?s?d?u +?s?u?u?s?d?s?d?s +?s?u?u?s?d?s?u?d +?s?u?u?s?d?s?u?u +?s?u?u?s?d?s?u?s +?s?u?u?s?d?s?s?d +?s?u?u?s?d?s?s?u +?s?u?u?s?d?s?s?s +?s?u?u?s?l?l?l?l +?s?u?u?s?l?l?l?u +?s?u?u?s?l?l?l?s +?s?u?u?s?l?l?u?l +?s?u?u?s?l?l?u?u +?s?u?u?s?l?l?u?s +?s?u?u?s?l?l?s?l +?s?u?u?s?l?l?s?u +?s?u?u?s?l?l?s?s +?s?u?u?s?l?u?l?l +?s?u?u?s?l?u?l?u +?s?u?u?s?l?u?l?s +?s?u?u?s?l?u?u?l +?s?u?u?s?l?u?u?u +?s?u?u?s?l?u?u?s +?s?u?u?s?l?u?s?l +?s?u?u?s?l?u?s?u +?s?u?u?s?l?u?s?s +?s?u?u?s?l?s?l?l +?s?u?u?s?l?s?l?u +?s?u?u?s?l?s?l?s +?s?u?u?s?l?s?u?l +?s?u?u?s?l?s?u?u +?s?u?u?s?l?s?u?s +?s?u?u?s?l?s?s?l +?s?u?u?s?l?s?s?u +?s?u?u?s?l?s?s?s +?s?u?u?s?u?d?d?d +?s?u?u?s?u?d?d?u +?s?u?u?s?u?d?d?s +?s?u?u?s?u?d?u?d +?s?u?u?s?u?d?u?u +?s?u?u?s?u?d?u?s +?s?u?u?s?u?d?s?d +?s?u?u?s?u?d?s?u +?s?u?u?s?u?d?s?s +?s?u?u?s?u?l?l?l +?s?u?u?s?u?l?l?u +?s?u?u?s?u?l?l?s +?s?u?u?s?u?l?u?l +?s?u?u?s?u?l?u?u +?s?u?u?s?u?l?u?s +?s?u?u?s?u?l?s?l +?s?u?u?s?u?l?s?u +?s?u?u?s?u?l?s?s +?s?u?u?s?u?u?d?d +?s?u?u?s?u?u?d?u +?s?u?u?s?u?u?d?s +?s?u?u?s?u?u?l?l +?s?u?u?s?u?u?l?u +?s?u?u?s?u?u?l?s +?s?u?u?s?u?u?u?d +?s?u?u?s?u?u?u?l +?s?u?u?s?u?u?u?u +?s?u?u?s?u?u?u?s +?s?u?u?s?u?u?s?d +?s?u?u?s?u?u?s?l +?s?u?u?s?u?u?s?u +?s?u?u?s?u?u?s?s +?s?u?u?s?u?s?d?d +?s?u?u?s?u?s?d?u +?s?u?u?s?u?s?d?s +?s?u?u?s?u?s?l?l +?s?u?u?s?u?s?l?u +?s?u?u?s?u?s?l?s +?s?u?u?s?u?s?u?d +?s?u?u?s?u?s?u?l +?s?u?u?s?u?s?u?u +?s?u?u?s?u?s?u?s +?s?u?u?s?u?s?s?d +?s?u?u?s?u?s?s?l +?s?u?u?s?u?s?s?u +?s?u?u?s?u?s?s?s +?s?u?u?s?s?d?d?d +?s?u?u?s?s?d?d?u +?s?u?u?s?s?d?d?s +?s?u?u?s?s?d?u?d +?s?u?u?s?s?d?u?u +?s?u?u?s?s?d?u?s +?s?u?u?s?s?d?s?d +?s?u?u?s?s?d?s?u +?s?u?u?s?s?d?s?s +?s?u?u?s?s?l?l?l +?s?u?u?s?s?l?l?u +?s?u?u?s?s?l?l?s +?s?u?u?s?s?l?u?l +?s?u?u?s?s?l?u?u +?s?u?u?s?s?l?u?s +?s?u?u?s?s?l?s?l +?s?u?u?s?s?l?s?u +?s?u?u?s?s?l?s?s +?s?u?u?s?s?u?d?d +?s?u?u?s?s?u?d?u +?s?u?u?s?s?u?d?s +?s?u?u?s?s?u?l?l +?s?u?u?s?s?u?l?u +?s?u?u?s?s?u?l?s +?s?u?u?s?s?u?u?d +?s?u?u?s?s?u?u?l +?s?u?u?s?s?u?u?u +?s?u?u?s?s?u?u?s +?s?u?u?s?s?u?s?d +?s?u?u?s?s?u?s?l +?s?u?u?s?s?u?s?u +?s?u?u?s?s?u?s?s +?s?u?u?s?s?s?d?d +?s?u?u?s?s?s?d?u +?s?u?u?s?s?s?d?s +?s?u?u?s?s?s?l?l +?s?u?u?s?s?s?l?u +?s?u?u?s?s?s?l?s +?s?u?u?s?s?s?u?d +?s?u?u?s?s?s?u?l +?s?u?u?s?s?s?u?u +?s?u?u?s?s?s?u?s +?s?u?u?s?s?s?s?d +?s?u?u?s?s?s?s?l +?s?u?u?s?s?s?s?u +?s?u?u?s?s?s?s?s +?s?u?s?d?d?d?d?d +?s?u?s?d?d?d?d?u +?s?u?s?d?d?d?d?s +?s?u?s?d?d?d?u?d +?s?u?s?d?d?d?u?u +?s?u?s?d?d?d?u?s +?s?u?s?d?d?d?s?d +?s?u?s?d?d?d?s?u +?s?u?s?d?d?d?s?s +?s?u?s?d?d?u?d?d +?s?u?s?d?d?u?d?u +?s?u?s?d?d?u?d?s +?s?u?s?d?d?u?u?d +?s?u?s?d?d?u?u?u +?s?u?s?d?d?u?u?s +?s?u?s?d?d?u?s?d +?s?u?s?d?d?u?s?u +?s?u?s?d?d?u?s?s +?s?u?s?d?d?s?d?d +?s?u?s?d?d?s?d?u +?s?u?s?d?d?s?d?s +?s?u?s?d?d?s?u?d +?s?u?s?d?d?s?u?u +?s?u?s?d?d?s?u?s +?s?u?s?d?d?s?s?d +?s?u?s?d?d?s?s?u +?s?u?s?d?d?s?s?s +?s?u?s?d?u?d?d?d +?s?u?s?d?u?d?d?u +?s?u?s?d?u?d?d?s +?s?u?s?d?u?d?u?d +?s?u?s?d?u?d?u?u +?s?u?s?d?u?d?u?s +?s?u?s?d?u?d?s?d +?s?u?s?d?u?d?s?u +?s?u?s?d?u?d?s?s +?s?u?s?d?u?u?d?d +?s?u?s?d?u?u?d?u +?s?u?s?d?u?u?d?s +?s?u?s?d?u?u?u?d +?s?u?s?d?u?u?u?u +?s?u?s?d?u?u?u?s +?s?u?s?d?u?u?s?d +?s?u?s?d?u?u?s?u +?s?u?s?d?u?u?s?s +?s?u?s?d?u?s?d?d +?s?u?s?d?u?s?d?u +?s?u?s?d?u?s?d?s +?s?u?s?d?u?s?u?d +?s?u?s?d?u?s?u?u +?s?u?s?d?u?s?u?s +?s?u?s?d?u?s?s?d +?s?u?s?d?u?s?s?u +?s?u?s?d?u?s?s?s +?s?u?s?d?s?d?d?d +?s?u?s?d?s?d?d?u +?s?u?s?d?s?d?d?s +?s?u?s?d?s?d?u?d +?s?u?s?d?s?d?u?u +?s?u?s?d?s?d?u?s +?s?u?s?d?s?d?s?d +?s?u?s?d?s?d?s?u +?s?u?s?d?s?d?s?s +?s?u?s?d?s?u?d?d +?s?u?s?d?s?u?d?u +?s?u?s?d?s?u?d?s +?s?u?s?d?s?u?u?d +?s?u?s?d?s?u?u?u +?s?u?s?d?s?u?u?s +?s?u?s?d?s?u?s?d +?s?u?s?d?s?u?s?u +?s?u?s?d?s?u?s?s +?s?u?s?d?s?s?d?d +?s?u?s?d?s?s?d?u +?s?u?s?d?s?s?d?s +?s?u?s?d?s?s?u?d +?s?u?s?d?s?s?u?u +?s?u?s?d?s?s?u?s +?s?u?s?d?s?s?s?d +?s?u?s?d?s?s?s?u +?s?u?s?d?s?s?s?s +?s?u?s?l?l?l?l?l +?s?u?s?l?l?l?l?u +?s?u?s?l?l?l?l?s +?s?u?s?l?l?l?u?l +?s?u?s?l?l?l?u?u +?s?u?s?l?l?l?u?s +?s?u?s?l?l?l?s?l +?s?u?s?l?l?l?s?u +?s?u?s?l?l?l?s?s +?s?u?s?l?l?u?l?l +?s?u?s?l?l?u?l?u +?s?u?s?l?l?u?l?s +?s?u?s?l?l?u?u?l +?s?u?s?l?l?u?u?u +?s?u?s?l?l?u?u?s +?s?u?s?l?l?u?s?l +?s?u?s?l?l?u?s?u +?s?u?s?l?l?u?s?s +?s?u?s?l?l?s?l?l +?s?u?s?l?l?s?l?u +?s?u?s?l?l?s?l?s +?s?u?s?l?l?s?u?l +?s?u?s?l?l?s?u?u +?s?u?s?l?l?s?u?s +?s?u?s?l?l?s?s?l +?s?u?s?l?l?s?s?u +?s?u?s?l?l?s?s?s +?s?u?s?l?u?l?l?l +?s?u?s?l?u?l?l?u +?s?u?s?l?u?l?l?s +?s?u?s?l?u?l?u?l +?s?u?s?l?u?l?u?u +?s?u?s?l?u?l?u?s +?s?u?s?l?u?l?s?l +?s?u?s?l?u?l?s?u +?s?u?s?l?u?l?s?s +?s?u?s?l?u?u?l?l +?s?u?s?l?u?u?l?u +?s?u?s?l?u?u?l?s +?s?u?s?l?u?u?u?l +?s?u?s?l?u?u?u?u +?s?u?s?l?u?u?u?s +?s?u?s?l?u?u?s?l +?s?u?s?l?u?u?s?u +?s?u?s?l?u?u?s?s +?s?u?s?l?u?s?l?l +?s?u?s?l?u?s?l?u +?s?u?s?l?u?s?l?s +?s?u?s?l?u?s?u?l +?s?u?s?l?u?s?u?u +?s?u?s?l?u?s?u?s +?s?u?s?l?u?s?s?l +?s?u?s?l?u?s?s?u +?s?u?s?l?u?s?s?s +?s?u?s?l?s?l?l?l +?s?u?s?l?s?l?l?u +?s?u?s?l?s?l?l?s +?s?u?s?l?s?l?u?l +?s?u?s?l?s?l?u?u +?s?u?s?l?s?l?u?s +?s?u?s?l?s?l?s?l +?s?u?s?l?s?l?s?u +?s?u?s?l?s?l?s?s +?s?u?s?l?s?u?l?l +?s?u?s?l?s?u?l?u +?s?u?s?l?s?u?l?s +?s?u?s?l?s?u?u?l +?s?u?s?l?s?u?u?u +?s?u?s?l?s?u?u?s +?s?u?s?l?s?u?s?l +?s?u?s?l?s?u?s?u +?s?u?s?l?s?u?s?s +?s?u?s?l?s?s?l?l +?s?u?s?l?s?s?l?u +?s?u?s?l?s?s?l?s +?s?u?s?l?s?s?u?l +?s?u?s?l?s?s?u?u +?s?u?s?l?s?s?u?s +?s?u?s?l?s?s?s?l +?s?u?s?l?s?s?s?u +?s?u?s?l?s?s?s?s +?s?u?s?u?d?d?d?d +?s?u?s?u?d?d?d?u +?s?u?s?u?d?d?d?s +?s?u?s?u?d?d?u?d +?s?u?s?u?d?d?u?u +?s?u?s?u?d?d?u?s +?s?u?s?u?d?d?s?d +?s?u?s?u?d?d?s?u +?s?u?s?u?d?d?s?s +?s?u?s?u?d?u?d?d +?s?u?s?u?d?u?d?u +?s?u?s?u?d?u?d?s +?s?u?s?u?d?u?u?d +?s?u?s?u?d?u?u?u +?s?u?s?u?d?u?u?s +?s?u?s?u?d?u?s?d +?s?u?s?u?d?u?s?u +?s?u?s?u?d?u?s?s +?s?u?s?u?d?s?d?d +?s?u?s?u?d?s?d?u +?s?u?s?u?d?s?d?s +?s?u?s?u?d?s?u?d +?s?u?s?u?d?s?u?u +?s?u?s?u?d?s?u?s +?s?u?s?u?d?s?s?d +?s?u?s?u?d?s?s?u +?s?u?s?u?d?s?s?s +?s?u?s?u?l?l?l?l +?s?u?s?u?l?l?l?u +?s?u?s?u?l?l?l?s +?s?u?s?u?l?l?u?l +?s?u?s?u?l?l?u?u +?s?u?s?u?l?l?u?s +?s?u?s?u?l?l?s?l +?s?u?s?u?l?l?s?u +?s?u?s?u?l?l?s?s +?s?u?s?u?l?u?l?l +?s?u?s?u?l?u?l?u +?s?u?s?u?l?u?l?s +?s?u?s?u?l?u?u?l +?s?u?s?u?l?u?u?u +?s?u?s?u?l?u?u?s +?s?u?s?u?l?u?s?l +?s?u?s?u?l?u?s?u +?s?u?s?u?l?u?s?s +?s?u?s?u?l?s?l?l +?s?u?s?u?l?s?l?u +?s?u?s?u?l?s?l?s +?s?u?s?u?l?s?u?l +?s?u?s?u?l?s?u?u +?s?u?s?u?l?s?u?s +?s?u?s?u?l?s?s?l +?s?u?s?u?l?s?s?u +?s?u?s?u?l?s?s?s +?s?u?s?u?u?d?d?d +?s?u?s?u?u?d?d?u +?s?u?s?u?u?d?d?s +?s?u?s?u?u?d?u?d +?s?u?s?u?u?d?u?u +?s?u?s?u?u?d?u?s +?s?u?s?u?u?d?s?d +?s?u?s?u?u?d?s?u +?s?u?s?u?u?d?s?s +?s?u?s?u?u?l?l?l +?s?u?s?u?u?l?l?u +?s?u?s?u?u?l?l?s +?s?u?s?u?u?l?u?l +?s?u?s?u?u?l?u?u +?s?u?s?u?u?l?u?s +?s?u?s?u?u?l?s?l +?s?u?s?u?u?l?s?u +?s?u?s?u?u?l?s?s +?s?u?s?u?u?u?d?d +?s?u?s?u?u?u?d?u +?s?u?s?u?u?u?d?s +?s?u?s?u?u?u?l?l +?s?u?s?u?u?u?l?u +?s?u?s?u?u?u?l?s +?s?u?s?u?u?u?u?d +?s?u?s?u?u?u?u?l +?s?u?s?u?u?u?u?u +?s?u?s?u?u?u?u?s +?s?u?s?u?u?u?s?d +?s?u?s?u?u?u?s?l +?s?u?s?u?u?u?s?u +?s?u?s?u?u?u?s?s +?s?u?s?u?u?s?d?d +?s?u?s?u?u?s?d?u +?s?u?s?u?u?s?d?s +?s?u?s?u?u?s?l?l +?s?u?s?u?u?s?l?u +?s?u?s?u?u?s?l?s +?s?u?s?u?u?s?u?d +?s?u?s?u?u?s?u?l +?s?u?s?u?u?s?u?u +?s?u?s?u?u?s?u?s +?s?u?s?u?u?s?s?d +?s?u?s?u?u?s?s?l +?s?u?s?u?u?s?s?u +?s?u?s?u?u?s?s?s +?s?u?s?u?s?d?d?d +?s?u?s?u?s?d?d?u +?s?u?s?u?s?d?d?s +?s?u?s?u?s?d?u?d +?s?u?s?u?s?d?u?u +?s?u?s?u?s?d?u?s +?s?u?s?u?s?d?s?d +?s?u?s?u?s?d?s?u +?s?u?s?u?s?d?s?s +?s?u?s?u?s?l?l?l +?s?u?s?u?s?l?l?u +?s?u?s?u?s?l?l?s +?s?u?s?u?s?l?u?l +?s?u?s?u?s?l?u?u +?s?u?s?u?s?l?u?s +?s?u?s?u?s?l?s?l +?s?u?s?u?s?l?s?u +?s?u?s?u?s?l?s?s +?s?u?s?u?s?u?d?d +?s?u?s?u?s?u?d?u +?s?u?s?u?s?u?d?s +?s?u?s?u?s?u?l?l +?s?u?s?u?s?u?l?u +?s?u?s?u?s?u?l?s +?s?u?s?u?s?u?u?d +?s?u?s?u?s?u?u?l +?s?u?s?u?s?u?u?u +?s?u?s?u?s?u?u?s +?s?u?s?u?s?u?s?d +?s?u?s?u?s?u?s?l +?s?u?s?u?s?u?s?u +?s?u?s?u?s?u?s?s +?s?u?s?u?s?s?d?d +?s?u?s?u?s?s?d?u +?s?u?s?u?s?s?d?s +?s?u?s?u?s?s?l?l +?s?u?s?u?s?s?l?u +?s?u?s?u?s?s?l?s +?s?u?s?u?s?s?u?d +?s?u?s?u?s?s?u?l +?s?u?s?u?s?s?u?u +?s?u?s?u?s?s?u?s +?s?u?s?u?s?s?s?d +?s?u?s?u?s?s?s?l +?s?u?s?u?s?s?s?u +?s?u?s?u?s?s?s?s +?s?u?s?s?d?d?d?d +?s?u?s?s?d?d?d?u +?s?u?s?s?d?d?d?s +?s?u?s?s?d?d?u?d +?s?u?s?s?d?d?u?u +?s?u?s?s?d?d?u?s +?s?u?s?s?d?d?s?d +?s?u?s?s?d?d?s?u +?s?u?s?s?d?d?s?s +?s?u?s?s?d?u?d?d +?s?u?s?s?d?u?d?u +?s?u?s?s?d?u?d?s +?s?u?s?s?d?u?u?d +?s?u?s?s?d?u?u?u +?s?u?s?s?d?u?u?s +?s?u?s?s?d?u?s?d +?s?u?s?s?d?u?s?u +?s?u?s?s?d?u?s?s +?s?u?s?s?d?s?d?d +?s?u?s?s?d?s?d?u +?s?u?s?s?d?s?d?s +?s?u?s?s?d?s?u?d +?s?u?s?s?d?s?u?u +?s?u?s?s?d?s?u?s +?s?u?s?s?d?s?s?d +?s?u?s?s?d?s?s?u +?s?u?s?s?d?s?s?s +?s?u?s?s?l?l?l?l +?s?u?s?s?l?l?l?u +?s?u?s?s?l?l?l?s +?s?u?s?s?l?l?u?l +?s?u?s?s?l?l?u?u +?s?u?s?s?l?l?u?s +?s?u?s?s?l?l?s?l +?s?u?s?s?l?l?s?u +?s?u?s?s?l?l?s?s +?s?u?s?s?l?u?l?l +?s?u?s?s?l?u?l?u +?s?u?s?s?l?u?l?s +?s?u?s?s?l?u?u?l +?s?u?s?s?l?u?u?u +?s?u?s?s?l?u?u?s +?s?u?s?s?l?u?s?l +?s?u?s?s?l?u?s?u +?s?u?s?s?l?u?s?s +?s?u?s?s?l?s?l?l +?s?u?s?s?l?s?l?u +?s?u?s?s?l?s?l?s +?s?u?s?s?l?s?u?l +?s?u?s?s?l?s?u?u +?s?u?s?s?l?s?u?s +?s?u?s?s?l?s?s?l +?s?u?s?s?l?s?s?u +?s?u?s?s?l?s?s?s +?s?u?s?s?u?d?d?d +?s?u?s?s?u?d?d?u +?s?u?s?s?u?d?d?s +?s?u?s?s?u?d?u?d +?s?u?s?s?u?d?u?u +?s?u?s?s?u?d?u?s +?s?u?s?s?u?d?s?d +?s?u?s?s?u?d?s?u +?s?u?s?s?u?d?s?s +?s?u?s?s?u?l?l?l +?s?u?s?s?u?l?l?u +?s?u?s?s?u?l?l?s +?s?u?s?s?u?l?u?l +?s?u?s?s?u?l?u?u +?s?u?s?s?u?l?u?s +?s?u?s?s?u?l?s?l +?s?u?s?s?u?l?s?u +?s?u?s?s?u?l?s?s +?s?u?s?s?u?u?d?d +?s?u?s?s?u?u?d?u +?s?u?s?s?u?u?d?s +?s?u?s?s?u?u?l?l +?s?u?s?s?u?u?l?u +?s?u?s?s?u?u?l?s +?s?u?s?s?u?u?u?d +?s?u?s?s?u?u?u?l +?s?u?s?s?u?u?u?u +?s?u?s?s?u?u?u?s +?s?u?s?s?u?u?s?d +?s?u?s?s?u?u?s?l +?s?u?s?s?u?u?s?u +?s?u?s?s?u?u?s?s +?s?u?s?s?u?s?d?d +?s?u?s?s?u?s?d?u +?s?u?s?s?u?s?d?s +?s?u?s?s?u?s?l?l +?s?u?s?s?u?s?l?u +?s?u?s?s?u?s?l?s +?s?u?s?s?u?s?u?d +?s?u?s?s?u?s?u?l +?s?u?s?s?u?s?u?u +?s?u?s?s?u?s?u?s +?s?u?s?s?u?s?s?d +?s?u?s?s?u?s?s?l +?s?u?s?s?u?s?s?u +?s?u?s?s?u?s?s?s +?s?u?s?s?s?d?d?d +?s?u?s?s?s?d?d?u +?s?u?s?s?s?d?d?s +?s?u?s?s?s?d?u?d +?s?u?s?s?s?d?u?u +?s?u?s?s?s?d?u?s +?s?u?s?s?s?d?s?d +?s?u?s?s?s?d?s?u +?s?u?s?s?s?d?s?s +?s?u?s?s?s?l?l?l +?s?u?s?s?s?l?l?u +?s?u?s?s?s?l?l?s +?s?u?s?s?s?l?u?l +?s?u?s?s?s?l?u?u +?s?u?s?s?s?l?u?s +?s?u?s?s?s?l?s?l +?s?u?s?s?s?l?s?u +?s?u?s?s?s?l?s?s +?s?u?s?s?s?u?d?d +?s?u?s?s?s?u?d?u +?s?u?s?s?s?u?d?s +?s?u?s?s?s?u?l?l +?s?u?s?s?s?u?l?u +?s?u?s?s?s?u?l?s +?s?u?s?s?s?u?u?d +?s?u?s?s?s?u?u?l +?s?u?s?s?s?u?u?u +?s?u?s?s?s?u?u?s +?s?u?s?s?s?u?s?d +?s?u?s?s?s?u?s?l +?s?u?s?s?s?u?s?u +?s?u?s?s?s?u?s?s +?s?u?s?s?s?s?d?d +?s?u?s?s?s?s?d?u +?s?u?s?s?s?s?d?s +?s?u?s?s?s?s?l?l +?s?u?s?s?s?s?l?u +?s?u?s?s?s?s?l?s +?s?u?s?s?s?s?u?d +?s?u?s?s?s?s?u?l +?s?u?s?s?s?s?u?u +?s?u?s?s?s?s?u?s +?s?u?s?s?s?s?s?d +?s?u?s?s?s?s?s?l +?s?u?s?s?s?s?s?u +?s?u?s?s?s?s?s?s +?s?s?d?d?d?d?d?d +?s?s?d?d?d?d?d?l +?s?s?d?d?d?d?d?u +?s?s?d?d?d?d?d?s +?s?s?d?d?d?d?l?d +?s?s?d?d?d?d?l?l +?s?s?d?d?d?d?l?s +?s?s?d?d?d?d?u?d +?s?s?d?d?d?d?u?u +?s?s?d?d?d?d?u?s +?s?s?d?d?d?d?s?d +?s?s?d?d?d?d?s?l +?s?s?d?d?d?d?s?u +?s?s?d?d?d?d?s?s +?s?s?d?d?d?l?d?d +?s?s?d?d?d?l?d?l +?s?s?d?d?d?l?d?s +?s?s?d?d?d?l?l?d +?s?s?d?d?d?l?l?l +?s?s?d?d?d?l?l?s +?s?s?d?d?d?l?s?d +?s?s?d?d?d?l?s?l +?s?s?d?d?d?l?s?s +?s?s?d?d?d?u?d?d +?s?s?d?d?d?u?d?u +?s?s?d?d?d?u?d?s +?s?s?d?d?d?u?u?d +?s?s?d?d?d?u?u?u +?s?s?d?d?d?u?u?s +?s?s?d?d?d?u?s?d +?s?s?d?d?d?u?s?u +?s?s?d?d?d?u?s?s +?s?s?d?d?d?s?d?d +?s?s?d?d?d?s?d?l +?s?s?d?d?d?s?d?u +?s?s?d?d?d?s?d?s +?s?s?d?d?d?s?l?d +?s?s?d?d?d?s?l?l +?s?s?d?d?d?s?l?s +?s?s?d?d?d?s?u?d +?s?s?d?d?d?s?u?u +?s?s?d?d?d?s?u?s +?s?s?d?d?d?s?s?d +?s?s?d?d?d?s?s?l +?s?s?d?d?d?s?s?u +?s?s?d?d?d?s?s?s +?s?s?d?d?l?d?d?d +?s?s?d?d?l?d?d?l +?s?s?d?d?l?d?d?s +?s?s?d?d?l?d?l?d +?s?s?d?d?l?d?l?l +?s?s?d?d?l?d?l?s +?s?s?d?d?l?d?s?d +?s?s?d?d?l?d?s?l +?s?s?d?d?l?d?s?s +?s?s?d?d?l?l?d?d +?s?s?d?d?l?l?d?l +?s?s?d?d?l?l?d?s +?s?s?d?d?l?l?l?d +?s?s?d?d?l?l?l?l +?s?s?d?d?l?l?l?s +?s?s?d?d?l?l?s?d +?s?s?d?d?l?l?s?l +?s?s?d?d?l?l?s?s +?s?s?d?d?l?s?d?d +?s?s?d?d?l?s?d?l +?s?s?d?d?l?s?d?s +?s?s?d?d?l?s?l?d +?s?s?d?d?l?s?l?l +?s?s?d?d?l?s?l?s +?s?s?d?d?l?s?s?d +?s?s?d?d?l?s?s?l +?s?s?d?d?l?s?s?s +?s?s?d?d?u?d?d?d +?s?s?d?d?u?d?d?u +?s?s?d?d?u?d?d?s +?s?s?d?d?u?d?u?d +?s?s?d?d?u?d?u?u +?s?s?d?d?u?d?u?s +?s?s?d?d?u?d?s?d +?s?s?d?d?u?d?s?u +?s?s?d?d?u?d?s?s +?s?s?d?d?u?u?d?d +?s?s?d?d?u?u?d?u +?s?s?d?d?u?u?d?s +?s?s?d?d?u?u?u?d +?s?s?d?d?u?u?u?u +?s?s?d?d?u?u?u?s +?s?s?d?d?u?u?s?d +?s?s?d?d?u?u?s?u +?s?s?d?d?u?u?s?s +?s?s?d?d?u?s?d?d +?s?s?d?d?u?s?d?u +?s?s?d?d?u?s?d?s +?s?s?d?d?u?s?u?d +?s?s?d?d?u?s?u?u +?s?s?d?d?u?s?u?s +?s?s?d?d?u?s?s?d +?s?s?d?d?u?s?s?u +?s?s?d?d?u?s?s?s +?s?s?d?d?s?d?d?d +?s?s?d?d?s?d?d?l +?s?s?d?d?s?d?d?u +?s?s?d?d?s?d?d?s +?s?s?d?d?s?d?l?d +?s?s?d?d?s?d?l?l +?s?s?d?d?s?d?l?s +?s?s?d?d?s?d?u?d +?s?s?d?d?s?d?u?u +?s?s?d?d?s?d?u?s +?s?s?d?d?s?d?s?d +?s?s?d?d?s?d?s?l +?s?s?d?d?s?d?s?u +?s?s?d?d?s?d?s?s +?s?s?d?d?s?l?d?d +?s?s?d?d?s?l?d?l +?s?s?d?d?s?l?d?s +?s?s?d?d?s?l?l?d +?s?s?d?d?s?l?l?l +?s?s?d?d?s?l?l?s +?s?s?d?d?s?l?s?d +?s?s?d?d?s?l?s?l +?s?s?d?d?s?l?s?s +?s?s?d?d?s?u?d?d +?s?s?d?d?s?u?d?u +?s?s?d?d?s?u?d?s +?s?s?d?d?s?u?u?d +?s?s?d?d?s?u?u?u +?s?s?d?d?s?u?u?s +?s?s?d?d?s?u?s?d +?s?s?d?d?s?u?s?u +?s?s?d?d?s?u?s?s +?s?s?d?d?s?s?d?d +?s?s?d?d?s?s?d?l +?s?s?d?d?s?s?d?u +?s?s?d?d?s?s?d?s +?s?s?d?d?s?s?l?d +?s?s?d?d?s?s?l?l +?s?s?d?d?s?s?l?s +?s?s?d?d?s?s?u?d +?s?s?d?d?s?s?u?u +?s?s?d?d?s?s?u?s +?s?s?d?d?s?s?s?d +?s?s?d?d?s?s?s?l +?s?s?d?d?s?s?s?u +?s?s?d?d?s?s?s?s +?s?s?d?l?d?d?d?d +?s?s?d?l?d?d?d?l +?s?s?d?l?d?d?d?s +?s?s?d?l?d?d?l?d +?s?s?d?l?d?d?l?l +?s?s?d?l?d?d?l?s +?s?s?d?l?d?d?s?d +?s?s?d?l?d?d?s?l +?s?s?d?l?d?d?s?s +?s?s?d?l?d?l?d?d +?s?s?d?l?d?l?d?l +?s?s?d?l?d?l?d?s +?s?s?d?l?d?l?l?d +?s?s?d?l?d?l?l?l +?s?s?d?l?d?l?l?s +?s?s?d?l?d?l?s?d +?s?s?d?l?d?l?s?l +?s?s?d?l?d?l?s?s +?s?s?d?l?d?s?d?d +?s?s?d?l?d?s?d?l +?s?s?d?l?d?s?d?s +?s?s?d?l?d?s?l?d +?s?s?d?l?d?s?l?l +?s?s?d?l?d?s?l?s +?s?s?d?l?d?s?s?d +?s?s?d?l?d?s?s?l +?s?s?d?l?d?s?s?s +?s?s?d?l?l?d?d?d +?s?s?d?l?l?d?d?l +?s?s?d?l?l?d?d?s +?s?s?d?l?l?d?l?d +?s?s?d?l?l?d?l?l +?s?s?d?l?l?d?l?s +?s?s?d?l?l?d?s?d +?s?s?d?l?l?d?s?l +?s?s?d?l?l?d?s?s +?s?s?d?l?l?l?d?d +?s?s?d?l?l?l?d?l +?s?s?d?l?l?l?d?s +?s?s?d?l?l?l?l?d +?s?s?d?l?l?l?l?l +?s?s?d?l?l?l?l?s +?s?s?d?l?l?l?s?d +?s?s?d?l?l?l?s?l +?s?s?d?l?l?l?s?s +?s?s?d?l?l?s?d?d +?s?s?d?l?l?s?d?l +?s?s?d?l?l?s?d?s +?s?s?d?l?l?s?l?d +?s?s?d?l?l?s?l?l +?s?s?d?l?l?s?l?s +?s?s?d?l?l?s?s?d +?s?s?d?l?l?s?s?l +?s?s?d?l?l?s?s?s +?s?s?d?l?s?d?d?d +?s?s?d?l?s?d?d?l +?s?s?d?l?s?d?d?s +?s?s?d?l?s?d?l?d +?s?s?d?l?s?d?l?l +?s?s?d?l?s?d?l?s +?s?s?d?l?s?d?s?d +?s?s?d?l?s?d?s?l +?s?s?d?l?s?d?s?s +?s?s?d?l?s?l?d?d +?s?s?d?l?s?l?d?l +?s?s?d?l?s?l?d?s +?s?s?d?l?s?l?l?d +?s?s?d?l?s?l?l?l +?s?s?d?l?s?l?l?s +?s?s?d?l?s?l?s?d +?s?s?d?l?s?l?s?l +?s?s?d?l?s?l?s?s +?s?s?d?l?s?s?d?d +?s?s?d?l?s?s?d?l +?s?s?d?l?s?s?d?s +?s?s?d?l?s?s?l?d +?s?s?d?l?s?s?l?l +?s?s?d?l?s?s?l?s +?s?s?d?l?s?s?s?d +?s?s?d?l?s?s?s?l +?s?s?d?l?s?s?s?s +?s?s?d?u?d?d?d?d +?s?s?d?u?d?d?d?u +?s?s?d?u?d?d?d?s +?s?s?d?u?d?d?u?d +?s?s?d?u?d?d?u?u +?s?s?d?u?d?d?u?s +?s?s?d?u?d?d?s?d +?s?s?d?u?d?d?s?u +?s?s?d?u?d?d?s?s +?s?s?d?u?d?u?d?d +?s?s?d?u?d?u?d?u +?s?s?d?u?d?u?d?s +?s?s?d?u?d?u?u?d +?s?s?d?u?d?u?u?u +?s?s?d?u?d?u?u?s +?s?s?d?u?d?u?s?d +?s?s?d?u?d?u?s?u +?s?s?d?u?d?u?s?s +?s?s?d?u?d?s?d?d +?s?s?d?u?d?s?d?u +?s?s?d?u?d?s?d?s +?s?s?d?u?d?s?u?d +?s?s?d?u?d?s?u?u +?s?s?d?u?d?s?u?s +?s?s?d?u?d?s?s?d +?s?s?d?u?d?s?s?u +?s?s?d?u?d?s?s?s +?s?s?d?u?u?d?d?d +?s?s?d?u?u?d?d?u +?s?s?d?u?u?d?d?s +?s?s?d?u?u?d?u?d +?s?s?d?u?u?d?u?u +?s?s?d?u?u?d?u?s +?s?s?d?u?u?d?s?d +?s?s?d?u?u?d?s?u +?s?s?d?u?u?d?s?s +?s?s?d?u?u?u?d?d +?s?s?d?u?u?u?d?u +?s?s?d?u?u?u?d?s +?s?s?d?u?u?u?u?d +?s?s?d?u?u?u?u?u +?s?s?d?u?u?u?u?s +?s?s?d?u?u?u?s?d +?s?s?d?u?u?u?s?u +?s?s?d?u?u?u?s?s +?s?s?d?u?u?s?d?d +?s?s?d?u?u?s?d?u +?s?s?d?u?u?s?d?s +?s?s?d?u?u?s?u?d +?s?s?d?u?u?s?u?u +?s?s?d?u?u?s?u?s +?s?s?d?u?u?s?s?d +?s?s?d?u?u?s?s?u +?s?s?d?u?u?s?s?s +?s?s?d?u?s?d?d?d +?s?s?d?u?s?d?d?u +?s?s?d?u?s?d?d?s +?s?s?d?u?s?d?u?d +?s?s?d?u?s?d?u?u +?s?s?d?u?s?d?u?s +?s?s?d?u?s?d?s?d +?s?s?d?u?s?d?s?u +?s?s?d?u?s?d?s?s +?s?s?d?u?s?u?d?d +?s?s?d?u?s?u?d?u +?s?s?d?u?s?u?d?s +?s?s?d?u?s?u?u?d +?s?s?d?u?s?u?u?u +?s?s?d?u?s?u?u?s +?s?s?d?u?s?u?s?d +?s?s?d?u?s?u?s?u +?s?s?d?u?s?u?s?s +?s?s?d?u?s?s?d?d +?s?s?d?u?s?s?d?u +?s?s?d?u?s?s?d?s +?s?s?d?u?s?s?u?d +?s?s?d?u?s?s?u?u +?s?s?d?u?s?s?u?s +?s?s?d?u?s?s?s?d +?s?s?d?u?s?s?s?u +?s?s?d?u?s?s?s?s +?s?s?d?s?d?d?d?d +?s?s?d?s?d?d?d?l +?s?s?d?s?d?d?d?u +?s?s?d?s?d?d?d?s +?s?s?d?s?d?d?l?d +?s?s?d?s?d?d?l?l +?s?s?d?s?d?d?l?s +?s?s?d?s?d?d?u?d +?s?s?d?s?d?d?u?u +?s?s?d?s?d?d?u?s +?s?s?d?s?d?d?s?d +?s?s?d?s?d?d?s?l +?s?s?d?s?d?d?s?u +?s?s?d?s?d?d?s?s +?s?s?d?s?d?l?d?d +?s?s?d?s?d?l?d?l +?s?s?d?s?d?l?d?s +?s?s?d?s?d?l?l?d +?s?s?d?s?d?l?l?l +?s?s?d?s?d?l?l?s +?s?s?d?s?d?l?s?d +?s?s?d?s?d?l?s?l +?s?s?d?s?d?l?s?s +?s?s?d?s?d?u?d?d +?s?s?d?s?d?u?d?u +?s?s?d?s?d?u?d?s +?s?s?d?s?d?u?u?d +?s?s?d?s?d?u?u?u +?s?s?d?s?d?u?u?s +?s?s?d?s?d?u?s?d +?s?s?d?s?d?u?s?u +?s?s?d?s?d?u?s?s +?s?s?d?s?d?s?d?d +?s?s?d?s?d?s?d?l +?s?s?d?s?d?s?d?u +?s?s?d?s?d?s?d?s +?s?s?d?s?d?s?l?d +?s?s?d?s?d?s?l?l +?s?s?d?s?d?s?l?s +?s?s?d?s?d?s?u?d +?s?s?d?s?d?s?u?u +?s?s?d?s?d?s?u?s +?s?s?d?s?d?s?s?d +?s?s?d?s?d?s?s?l +?s?s?d?s?d?s?s?u +?s?s?d?s?d?s?s?s +?s?s?d?s?l?d?d?d +?s?s?d?s?l?d?d?l +?s?s?d?s?l?d?d?s +?s?s?d?s?l?d?l?d +?s?s?d?s?l?d?l?l +?s?s?d?s?l?d?l?s +?s?s?d?s?l?d?s?d +?s?s?d?s?l?d?s?l +?s?s?d?s?l?d?s?s +?s?s?d?s?l?l?d?d +?s?s?d?s?l?l?d?l +?s?s?d?s?l?l?d?s +?s?s?d?s?l?l?l?d +?s?s?d?s?l?l?l?l +?s?s?d?s?l?l?l?s +?s?s?d?s?l?l?s?d +?s?s?d?s?l?l?s?l +?s?s?d?s?l?l?s?s +?s?s?d?s?l?s?d?d +?s?s?d?s?l?s?d?l +?s?s?d?s?l?s?d?s +?s?s?d?s?l?s?l?d +?s?s?d?s?l?s?l?l +?s?s?d?s?l?s?l?s +?s?s?d?s?l?s?s?d +?s?s?d?s?l?s?s?l +?s?s?d?s?l?s?s?s +?s?s?d?s?u?d?d?d +?s?s?d?s?u?d?d?u +?s?s?d?s?u?d?d?s +?s?s?d?s?u?d?u?d +?s?s?d?s?u?d?u?u +?s?s?d?s?u?d?u?s +?s?s?d?s?u?d?s?d +?s?s?d?s?u?d?s?u +?s?s?d?s?u?d?s?s +?s?s?d?s?u?u?d?d +?s?s?d?s?u?u?d?u +?s?s?d?s?u?u?d?s +?s?s?d?s?u?u?u?d +?s?s?d?s?u?u?u?u +?s?s?d?s?u?u?u?s +?s?s?d?s?u?u?s?d +?s?s?d?s?u?u?s?u +?s?s?d?s?u?u?s?s +?s?s?d?s?u?s?d?d +?s?s?d?s?u?s?d?u +?s?s?d?s?u?s?d?s +?s?s?d?s?u?s?u?d +?s?s?d?s?u?s?u?u +?s?s?d?s?u?s?u?s +?s?s?d?s?u?s?s?d +?s?s?d?s?u?s?s?u +?s?s?d?s?u?s?s?s +?s?s?d?s?s?d?d?d +?s?s?d?s?s?d?d?l +?s?s?d?s?s?d?d?u +?s?s?d?s?s?d?d?s +?s?s?d?s?s?d?l?d +?s?s?d?s?s?d?l?l +?s?s?d?s?s?d?l?s +?s?s?d?s?s?d?u?d +?s?s?d?s?s?d?u?u +?s?s?d?s?s?d?u?s +?s?s?d?s?s?d?s?d +?s?s?d?s?s?d?s?l +?s?s?d?s?s?d?s?u +?s?s?d?s?s?d?s?s +?s?s?d?s?s?l?d?d +?s?s?d?s?s?l?d?l +?s?s?d?s?s?l?d?s +?s?s?d?s?s?l?l?d +?s?s?d?s?s?l?l?l +?s?s?d?s?s?l?l?s +?s?s?d?s?s?l?s?d +?s?s?d?s?s?l?s?l +?s?s?d?s?s?l?s?s +?s?s?d?s?s?u?d?d +?s?s?d?s?s?u?d?u +?s?s?d?s?s?u?d?s +?s?s?d?s?s?u?u?d +?s?s?d?s?s?u?u?u +?s?s?d?s?s?u?u?s +?s?s?d?s?s?u?s?d +?s?s?d?s?s?u?s?u +?s?s?d?s?s?u?s?s +?s?s?d?s?s?s?d?d +?s?s?d?s?s?s?d?l +?s?s?d?s?s?s?d?u +?s?s?d?s?s?s?d?s +?s?s?d?s?s?s?l?d +?s?s?d?s?s?s?l?l +?s?s?d?s?s?s?l?s +?s?s?d?s?s?s?u?d +?s?s?d?s?s?s?u?u +?s?s?d?s?s?s?u?s +?s?s?d?s?s?s?s?d +?s?s?d?s?s?s?s?l +?s?s?d?s?s?s?s?u +?s?s?d?s?s?s?s?s +?s?s?l?d?d?d?d?d +?s?s?l?d?d?d?d?l +?s?s?l?d?d?d?d?s +?s?s?l?d?d?d?l?d +?s?s?l?d?d?d?l?l +?s?s?l?d?d?d?l?s +?s?s?l?d?d?d?s?d +?s?s?l?d?d?d?s?l +?s?s?l?d?d?d?s?s +?s?s?l?d?d?l?d?d +?s?s?l?d?d?l?d?l +?s?s?l?d?d?l?d?s +?s?s?l?d?d?l?l?d +?s?s?l?d?d?l?l?l +?s?s?l?d?d?l?l?s +?s?s?l?d?d?l?s?d +?s?s?l?d?d?l?s?l +?s?s?l?d?d?l?s?s +?s?s?l?d?d?s?d?d +?s?s?l?d?d?s?d?l +?s?s?l?d?d?s?d?s +?s?s?l?d?d?s?l?d +?s?s?l?d?d?s?l?l +?s?s?l?d?d?s?l?s +?s?s?l?d?d?s?s?d +?s?s?l?d?d?s?s?l +?s?s?l?d?d?s?s?s +?s?s?l?d?l?d?d?d +?s?s?l?d?l?d?d?l +?s?s?l?d?l?d?d?s +?s?s?l?d?l?d?l?d +?s?s?l?d?l?d?l?l +?s?s?l?d?l?d?l?s +?s?s?l?d?l?d?s?d +?s?s?l?d?l?d?s?l +?s?s?l?d?l?d?s?s +?s?s?l?d?l?l?d?d +?s?s?l?d?l?l?d?l +?s?s?l?d?l?l?d?s +?s?s?l?d?l?l?l?d +?s?s?l?d?l?l?l?l +?s?s?l?d?l?l?l?s +?s?s?l?d?l?l?s?d +?s?s?l?d?l?l?s?l +?s?s?l?d?l?l?s?s +?s?s?l?d?l?s?d?d +?s?s?l?d?l?s?d?l +?s?s?l?d?l?s?d?s +?s?s?l?d?l?s?l?d +?s?s?l?d?l?s?l?l +?s?s?l?d?l?s?l?s +?s?s?l?d?l?s?s?d +?s?s?l?d?l?s?s?l +?s?s?l?d?l?s?s?s +?s?s?l?d?s?d?d?d +?s?s?l?d?s?d?d?l +?s?s?l?d?s?d?d?s +?s?s?l?d?s?d?l?d +?s?s?l?d?s?d?l?l +?s?s?l?d?s?d?l?s +?s?s?l?d?s?d?s?d +?s?s?l?d?s?d?s?l +?s?s?l?d?s?d?s?s +?s?s?l?d?s?l?d?d +?s?s?l?d?s?l?d?l +?s?s?l?d?s?l?d?s +?s?s?l?d?s?l?l?d +?s?s?l?d?s?l?l?l +?s?s?l?d?s?l?l?s +?s?s?l?d?s?l?s?d +?s?s?l?d?s?l?s?l +?s?s?l?d?s?l?s?s +?s?s?l?d?s?s?d?d +?s?s?l?d?s?s?d?l +?s?s?l?d?s?s?d?s +?s?s?l?d?s?s?l?d +?s?s?l?d?s?s?l?l +?s?s?l?d?s?s?l?s +?s?s?l?d?s?s?s?d +?s?s?l?d?s?s?s?l +?s?s?l?d?s?s?s?s +?s?s?l?l?d?d?d?d +?s?s?l?l?d?d?d?l +?s?s?l?l?d?d?d?s +?s?s?l?l?d?d?l?d +?s?s?l?l?d?d?l?l +?s?s?l?l?d?d?l?s +?s?s?l?l?d?d?s?d +?s?s?l?l?d?d?s?l +?s?s?l?l?d?d?s?s +?s?s?l?l?d?l?d?d +?s?s?l?l?d?l?d?l +?s?s?l?l?d?l?d?s +?s?s?l?l?d?l?l?d +?s?s?l?l?d?l?l?l +?s?s?l?l?d?l?l?s +?s?s?l?l?d?l?s?d +?s?s?l?l?d?l?s?l +?s?s?l?l?d?l?s?s +?s?s?l?l?d?s?d?d +?s?s?l?l?d?s?d?l +?s?s?l?l?d?s?d?s +?s?s?l?l?d?s?l?d +?s?s?l?l?d?s?l?l +?s?s?l?l?d?s?l?s +?s?s?l?l?d?s?s?d +?s?s?l?l?d?s?s?l +?s?s?l?l?d?s?s?s +?s?s?l?l?l?d?d?d +?s?s?l?l?l?d?d?l +?s?s?l?l?l?d?d?s +?s?s?l?l?l?d?l?d +?s?s?l?l?l?d?l?l +?s?s?l?l?l?d?l?s +?s?s?l?l?l?d?s?d +?s?s?l?l?l?d?s?l +?s?s?l?l?l?d?s?s +?s?s?l?l?l?l?d?d +?s?s?l?l?l?l?d?l +?s?s?l?l?l?l?d?s +?s?s?l?l?l?l?l?d +?s?s?l?l?l?l?l?l +?s?s?l?l?l?l?l?u +?s?s?l?l?l?l?l?s +?s?s?l?l?l?l?u?l +?s?s?l?l?l?l?u?u +?s?s?l?l?l?l?u?s +?s?s?l?l?l?l?s?d +?s?s?l?l?l?l?s?l +?s?s?l?l?l?l?s?u +?s?s?l?l?l?l?s?s +?s?s?l?l?l?u?l?l +?s?s?l?l?l?u?l?u +?s?s?l?l?l?u?l?s +?s?s?l?l?l?u?u?l +?s?s?l?l?l?u?u?u +?s?s?l?l?l?u?u?s +?s?s?l?l?l?u?s?l +?s?s?l?l?l?u?s?u +?s?s?l?l?l?u?s?s +?s?s?l?l?l?s?d?d +?s?s?l?l?l?s?d?l +?s?s?l?l?l?s?d?s +?s?s?l?l?l?s?l?d +?s?s?l?l?l?s?l?l +?s?s?l?l?l?s?l?u +?s?s?l?l?l?s?l?s +?s?s?l?l?l?s?u?l +?s?s?l?l?l?s?u?u +?s?s?l?l?l?s?u?s +?s?s?l?l?l?s?s?d +?s?s?l?l?l?s?s?l +?s?s?l?l?l?s?s?u +?s?s?l?l?l?s?s?s +?s?s?l?l?u?l?l?l +?s?s?l?l?u?l?l?u +?s?s?l?l?u?l?l?s +?s?s?l?l?u?l?u?l +?s?s?l?l?u?l?u?u +?s?s?l?l?u?l?u?s +?s?s?l?l?u?l?s?l +?s?s?l?l?u?l?s?u +?s?s?l?l?u?l?s?s +?s?s?l?l?u?u?l?l +?s?s?l?l?u?u?l?u +?s?s?l?l?u?u?l?s +?s?s?l?l?u?u?u?l +?s?s?l?l?u?u?u?u +?s?s?l?l?u?u?u?s +?s?s?l?l?u?u?s?l +?s?s?l?l?u?u?s?u +?s?s?l?l?u?u?s?s +?s?s?l?l?u?s?l?l +?s?s?l?l?u?s?l?u +?s?s?l?l?u?s?l?s +?s?s?l?l?u?s?u?l +?s?s?l?l?u?s?u?u +?s?s?l?l?u?s?u?s +?s?s?l?l?u?s?s?l +?s?s?l?l?u?s?s?u +?s?s?l?l?u?s?s?s +?s?s?l?l?s?d?d?d +?s?s?l?l?s?d?d?l +?s?s?l?l?s?d?d?s +?s?s?l?l?s?d?l?d +?s?s?l?l?s?d?l?l +?s?s?l?l?s?d?l?s +?s?s?l?l?s?d?s?d +?s?s?l?l?s?d?s?l +?s?s?l?l?s?d?s?s +?s?s?l?l?s?l?d?d +?s?s?l?l?s?l?d?l +?s?s?l?l?s?l?d?s +?s?s?l?l?s?l?l?d +?s?s?l?l?s?l?l?l +?s?s?l?l?s?l?l?u +?s?s?l?l?s?l?l?s +?s?s?l?l?s?l?u?l +?s?s?l?l?s?l?u?u +?s?s?l?l?s?l?u?s +?s?s?l?l?s?l?s?d +?s?s?l?l?s?l?s?l +?s?s?l?l?s?l?s?u +?s?s?l?l?s?l?s?s +?s?s?l?l?s?u?l?l +?s?s?l?l?s?u?l?u +?s?s?l?l?s?u?l?s +?s?s?l?l?s?u?u?l +?s?s?l?l?s?u?u?u +?s?s?l?l?s?u?u?s +?s?s?l?l?s?u?s?l +?s?s?l?l?s?u?s?u +?s?s?l?l?s?u?s?s +?s?s?l?l?s?s?d?d +?s?s?l?l?s?s?d?l +?s?s?l?l?s?s?d?s +?s?s?l?l?s?s?l?d +?s?s?l?l?s?s?l?l +?s?s?l?l?s?s?l?u +?s?s?l?l?s?s?l?s +?s?s?l?l?s?s?u?l +?s?s?l?l?s?s?u?u +?s?s?l?l?s?s?u?s +?s?s?l?l?s?s?s?d +?s?s?l?l?s?s?s?l +?s?s?l?l?s?s?s?u +?s?s?l?l?s?s?s?s +?s?s?l?u?l?l?l?l +?s?s?l?u?l?l?l?u +?s?s?l?u?l?l?l?s +?s?s?l?u?l?l?u?l +?s?s?l?u?l?l?u?u +?s?s?l?u?l?l?u?s +?s?s?l?u?l?l?s?l +?s?s?l?u?l?l?s?u +?s?s?l?u?l?l?s?s +?s?s?l?u?l?u?l?l +?s?s?l?u?l?u?l?u +?s?s?l?u?l?u?l?s +?s?s?l?u?l?u?u?l +?s?s?l?u?l?u?u?u +?s?s?l?u?l?u?u?s +?s?s?l?u?l?u?s?l +?s?s?l?u?l?u?s?u +?s?s?l?u?l?u?s?s +?s?s?l?u?l?s?l?l +?s?s?l?u?l?s?l?u +?s?s?l?u?l?s?l?s +?s?s?l?u?l?s?u?l +?s?s?l?u?l?s?u?u +?s?s?l?u?l?s?u?s +?s?s?l?u?l?s?s?l +?s?s?l?u?l?s?s?u +?s?s?l?u?l?s?s?s +?s?s?l?u?u?l?l?l +?s?s?l?u?u?l?l?u +?s?s?l?u?u?l?l?s +?s?s?l?u?u?l?u?l +?s?s?l?u?u?l?u?u +?s?s?l?u?u?l?u?s +?s?s?l?u?u?l?s?l +?s?s?l?u?u?l?s?u +?s?s?l?u?u?l?s?s +?s?s?l?u?u?u?l?l +?s?s?l?u?u?u?l?u +?s?s?l?u?u?u?l?s +?s?s?l?u?u?u?u?l +?s?s?l?u?u?u?u?u +?s?s?l?u?u?u?u?s +?s?s?l?u?u?u?s?l +?s?s?l?u?u?u?s?u +?s?s?l?u?u?u?s?s +?s?s?l?u?u?s?l?l +?s?s?l?u?u?s?l?u +?s?s?l?u?u?s?l?s +?s?s?l?u?u?s?u?l +?s?s?l?u?u?s?u?u +?s?s?l?u?u?s?u?s +?s?s?l?u?u?s?s?l +?s?s?l?u?u?s?s?u +?s?s?l?u?u?s?s?s +?s?s?l?u?s?l?l?l +?s?s?l?u?s?l?l?u +?s?s?l?u?s?l?l?s +?s?s?l?u?s?l?u?l +?s?s?l?u?s?l?u?u +?s?s?l?u?s?l?u?s +?s?s?l?u?s?l?s?l +?s?s?l?u?s?l?s?u +?s?s?l?u?s?l?s?s +?s?s?l?u?s?u?l?l +?s?s?l?u?s?u?l?u +?s?s?l?u?s?u?l?s +?s?s?l?u?s?u?u?l +?s?s?l?u?s?u?u?u +?s?s?l?u?s?u?u?s +?s?s?l?u?s?u?s?l +?s?s?l?u?s?u?s?u +?s?s?l?u?s?u?s?s +?s?s?l?u?s?s?l?l +?s?s?l?u?s?s?l?u +?s?s?l?u?s?s?l?s +?s?s?l?u?s?s?u?l +?s?s?l?u?s?s?u?u +?s?s?l?u?s?s?u?s +?s?s?l?u?s?s?s?l +?s?s?l?u?s?s?s?u +?s?s?l?u?s?s?s?s +?s?s?l?s?d?d?d?d +?s?s?l?s?d?d?d?l +?s?s?l?s?d?d?d?s +?s?s?l?s?d?d?l?d +?s?s?l?s?d?d?l?l +?s?s?l?s?d?d?l?s +?s?s?l?s?d?d?s?d +?s?s?l?s?d?d?s?l +?s?s?l?s?d?d?s?s +?s?s?l?s?d?l?d?d +?s?s?l?s?d?l?d?l +?s?s?l?s?d?l?d?s +?s?s?l?s?d?l?l?d +?s?s?l?s?d?l?l?l +?s?s?l?s?d?l?l?s +?s?s?l?s?d?l?s?d +?s?s?l?s?d?l?s?l +?s?s?l?s?d?l?s?s +?s?s?l?s?d?s?d?d +?s?s?l?s?d?s?d?l +?s?s?l?s?d?s?d?s +?s?s?l?s?d?s?l?d +?s?s?l?s?d?s?l?l +?s?s?l?s?d?s?l?s +?s?s?l?s?d?s?s?d +?s?s?l?s?d?s?s?l +?s?s?l?s?d?s?s?s +?s?s?l?s?l?d?d?d +?s?s?l?s?l?d?d?l +?s?s?l?s?l?d?d?s +?s?s?l?s?l?d?l?d +?s?s?l?s?l?d?l?l +?s?s?l?s?l?d?l?s +?s?s?l?s?l?d?s?d +?s?s?l?s?l?d?s?l +?s?s?l?s?l?d?s?s +?s?s?l?s?l?l?d?d +?s?s?l?s?l?l?d?l +?s?s?l?s?l?l?d?s +?s?s?l?s?l?l?l?d +?s?s?l?s?l?l?l?l +?s?s?l?s?l?l?l?u +?s?s?l?s?l?l?l?s +?s?s?l?s?l?l?u?l +?s?s?l?s?l?l?u?u +?s?s?l?s?l?l?u?s +?s?s?l?s?l?l?s?d +?s?s?l?s?l?l?s?l +?s?s?l?s?l?l?s?u +?s?s?l?s?l?l?s?s +?s?s?l?s?l?u?l?l +?s?s?l?s?l?u?l?u +?s?s?l?s?l?u?l?s +?s?s?l?s?l?u?u?l +?s?s?l?s?l?u?u?u +?s?s?l?s?l?u?u?s +?s?s?l?s?l?u?s?l +?s?s?l?s?l?u?s?u +?s?s?l?s?l?u?s?s +?s?s?l?s?l?s?d?d +?s?s?l?s?l?s?d?l +?s?s?l?s?l?s?d?s +?s?s?l?s?l?s?l?d +?s?s?l?s?l?s?l?l +?s?s?l?s?l?s?l?u +?s?s?l?s?l?s?l?s +?s?s?l?s?l?s?u?l +?s?s?l?s?l?s?u?u +?s?s?l?s?l?s?u?s +?s?s?l?s?l?s?s?d +?s?s?l?s?l?s?s?l +?s?s?l?s?l?s?s?u +?s?s?l?s?l?s?s?s +?s?s?l?s?u?l?l?l +?s?s?l?s?u?l?l?u +?s?s?l?s?u?l?l?s +?s?s?l?s?u?l?u?l +?s?s?l?s?u?l?u?u +?s?s?l?s?u?l?u?s +?s?s?l?s?u?l?s?l +?s?s?l?s?u?l?s?u +?s?s?l?s?u?l?s?s +?s?s?l?s?u?u?l?l +?s?s?l?s?u?u?l?u +?s?s?l?s?u?u?l?s +?s?s?l?s?u?u?u?l +?s?s?l?s?u?u?u?u +?s?s?l?s?u?u?u?s +?s?s?l?s?u?u?s?l +?s?s?l?s?u?u?s?u +?s?s?l?s?u?u?s?s +?s?s?l?s?u?s?l?l +?s?s?l?s?u?s?l?u +?s?s?l?s?u?s?l?s +?s?s?l?s?u?s?u?l +?s?s?l?s?u?s?u?u +?s?s?l?s?u?s?u?s +?s?s?l?s?u?s?s?l +?s?s?l?s?u?s?s?u +?s?s?l?s?u?s?s?s +?s?s?l?s?s?d?d?d +?s?s?l?s?s?d?d?l +?s?s?l?s?s?d?d?s +?s?s?l?s?s?d?l?d +?s?s?l?s?s?d?l?l +?s?s?l?s?s?d?l?s +?s?s?l?s?s?d?s?d +?s?s?l?s?s?d?s?l +?s?s?l?s?s?d?s?s +?s?s?l?s?s?l?d?d +?s?s?l?s?s?l?d?l +?s?s?l?s?s?l?d?s +?s?s?l?s?s?l?l?d +?s?s?l?s?s?l?l?l +?s?s?l?s?s?l?l?u +?s?s?l?s?s?l?l?s +?s?s?l?s?s?l?u?l +?s?s?l?s?s?l?u?u +?s?s?l?s?s?l?u?s +?s?s?l?s?s?l?s?d +?s?s?l?s?s?l?s?l +?s?s?l?s?s?l?s?u +?s?s?l?s?s?l?s?s +?s?s?l?s?s?u?l?l +?s?s?l?s?s?u?l?u +?s?s?l?s?s?u?l?s +?s?s?l?s?s?u?u?l +?s?s?l?s?s?u?u?u +?s?s?l?s?s?u?u?s +?s?s?l?s?s?u?s?l +?s?s?l?s?s?u?s?u +?s?s?l?s?s?u?s?s +?s?s?l?s?s?s?d?d +?s?s?l?s?s?s?d?l +?s?s?l?s?s?s?d?s +?s?s?l?s?s?s?l?d +?s?s?l?s?s?s?l?l +?s?s?l?s?s?s?l?u +?s?s?l?s?s?s?l?s +?s?s?l?s?s?s?u?l +?s?s?l?s?s?s?u?u +?s?s?l?s?s?s?u?s +?s?s?l?s?s?s?s?d +?s?s?l?s?s?s?s?l +?s?s?l?s?s?s?s?u +?s?s?l?s?s?s?s?s +?s?s?u?d?d?d?d?d +?s?s?u?d?d?d?d?u +?s?s?u?d?d?d?d?s +?s?s?u?d?d?d?u?d +?s?s?u?d?d?d?u?u +?s?s?u?d?d?d?u?s +?s?s?u?d?d?d?s?d +?s?s?u?d?d?d?s?u +?s?s?u?d?d?d?s?s +?s?s?u?d?d?u?d?d +?s?s?u?d?d?u?d?u +?s?s?u?d?d?u?d?s +?s?s?u?d?d?u?u?d +?s?s?u?d?d?u?u?u +?s?s?u?d?d?u?u?s +?s?s?u?d?d?u?s?d +?s?s?u?d?d?u?s?u +?s?s?u?d?d?u?s?s +?s?s?u?d?d?s?d?d +?s?s?u?d?d?s?d?u +?s?s?u?d?d?s?d?s +?s?s?u?d?d?s?u?d +?s?s?u?d?d?s?u?u +?s?s?u?d?d?s?u?s +?s?s?u?d?d?s?s?d +?s?s?u?d?d?s?s?u +?s?s?u?d?d?s?s?s +?s?s?u?d?u?d?d?d +?s?s?u?d?u?d?d?u +?s?s?u?d?u?d?d?s +?s?s?u?d?u?d?u?d +?s?s?u?d?u?d?u?u +?s?s?u?d?u?d?u?s +?s?s?u?d?u?d?s?d +?s?s?u?d?u?d?s?u +?s?s?u?d?u?d?s?s +?s?s?u?d?u?u?d?d +?s?s?u?d?u?u?d?u +?s?s?u?d?u?u?d?s +?s?s?u?d?u?u?u?d +?s?s?u?d?u?u?u?u +?s?s?u?d?u?u?u?s +?s?s?u?d?u?u?s?d +?s?s?u?d?u?u?s?u +?s?s?u?d?u?u?s?s +?s?s?u?d?u?s?d?d +?s?s?u?d?u?s?d?u +?s?s?u?d?u?s?d?s +?s?s?u?d?u?s?u?d +?s?s?u?d?u?s?u?u +?s?s?u?d?u?s?u?s +?s?s?u?d?u?s?s?d +?s?s?u?d?u?s?s?u +?s?s?u?d?u?s?s?s +?s?s?u?d?s?d?d?d +?s?s?u?d?s?d?d?u +?s?s?u?d?s?d?d?s +?s?s?u?d?s?d?u?d +?s?s?u?d?s?d?u?u +?s?s?u?d?s?d?u?s +?s?s?u?d?s?d?s?d +?s?s?u?d?s?d?s?u +?s?s?u?d?s?d?s?s +?s?s?u?d?s?u?d?d +?s?s?u?d?s?u?d?u +?s?s?u?d?s?u?d?s +?s?s?u?d?s?u?u?d +?s?s?u?d?s?u?u?u +?s?s?u?d?s?u?u?s +?s?s?u?d?s?u?s?d +?s?s?u?d?s?u?s?u +?s?s?u?d?s?u?s?s +?s?s?u?d?s?s?d?d +?s?s?u?d?s?s?d?u +?s?s?u?d?s?s?d?s +?s?s?u?d?s?s?u?d +?s?s?u?d?s?s?u?u +?s?s?u?d?s?s?u?s +?s?s?u?d?s?s?s?d +?s?s?u?d?s?s?s?u +?s?s?u?d?s?s?s?s +?s?s?u?l?l?l?l?l +?s?s?u?l?l?l?l?u +?s?s?u?l?l?l?l?s +?s?s?u?l?l?l?u?l +?s?s?u?l?l?l?u?u +?s?s?u?l?l?l?u?s +?s?s?u?l?l?l?s?l +?s?s?u?l?l?l?s?u +?s?s?u?l?l?l?s?s +?s?s?u?l?l?u?l?l +?s?s?u?l?l?u?l?u +?s?s?u?l?l?u?l?s +?s?s?u?l?l?u?u?l +?s?s?u?l?l?u?u?u +?s?s?u?l?l?u?u?s +?s?s?u?l?l?u?s?l +?s?s?u?l?l?u?s?u +?s?s?u?l?l?u?s?s +?s?s?u?l?l?s?l?l +?s?s?u?l?l?s?l?u +?s?s?u?l?l?s?l?s +?s?s?u?l?l?s?u?l +?s?s?u?l?l?s?u?u +?s?s?u?l?l?s?u?s +?s?s?u?l?l?s?s?l +?s?s?u?l?l?s?s?u +?s?s?u?l?l?s?s?s +?s?s?u?l?u?l?l?l +?s?s?u?l?u?l?l?u +?s?s?u?l?u?l?l?s +?s?s?u?l?u?l?u?l +?s?s?u?l?u?l?u?u +?s?s?u?l?u?l?u?s +?s?s?u?l?u?l?s?l +?s?s?u?l?u?l?s?u +?s?s?u?l?u?l?s?s +?s?s?u?l?u?u?l?l +?s?s?u?l?u?u?l?u +?s?s?u?l?u?u?l?s +?s?s?u?l?u?u?u?l +?s?s?u?l?u?u?u?u +?s?s?u?l?u?u?u?s +?s?s?u?l?u?u?s?l +?s?s?u?l?u?u?s?u +?s?s?u?l?u?u?s?s +?s?s?u?l?u?s?l?l +?s?s?u?l?u?s?l?u +?s?s?u?l?u?s?l?s +?s?s?u?l?u?s?u?l +?s?s?u?l?u?s?u?u +?s?s?u?l?u?s?u?s +?s?s?u?l?u?s?s?l +?s?s?u?l?u?s?s?u +?s?s?u?l?u?s?s?s +?s?s?u?l?s?l?l?l +?s?s?u?l?s?l?l?u +?s?s?u?l?s?l?l?s +?s?s?u?l?s?l?u?l +?s?s?u?l?s?l?u?u +?s?s?u?l?s?l?u?s +?s?s?u?l?s?l?s?l +?s?s?u?l?s?l?s?u +?s?s?u?l?s?l?s?s +?s?s?u?l?s?u?l?l +?s?s?u?l?s?u?l?u +?s?s?u?l?s?u?l?s +?s?s?u?l?s?u?u?l +?s?s?u?l?s?u?u?u +?s?s?u?l?s?u?u?s +?s?s?u?l?s?u?s?l +?s?s?u?l?s?u?s?u +?s?s?u?l?s?u?s?s +?s?s?u?l?s?s?l?l +?s?s?u?l?s?s?l?u +?s?s?u?l?s?s?l?s +?s?s?u?l?s?s?u?l +?s?s?u?l?s?s?u?u +?s?s?u?l?s?s?u?s +?s?s?u?l?s?s?s?l +?s?s?u?l?s?s?s?u +?s?s?u?l?s?s?s?s +?s?s?u?u?d?d?d?d +?s?s?u?u?d?d?d?u +?s?s?u?u?d?d?d?s +?s?s?u?u?d?d?u?d +?s?s?u?u?d?d?u?u +?s?s?u?u?d?d?u?s +?s?s?u?u?d?d?s?d +?s?s?u?u?d?d?s?u +?s?s?u?u?d?d?s?s +?s?s?u?u?d?u?d?d +?s?s?u?u?d?u?d?u +?s?s?u?u?d?u?d?s +?s?s?u?u?d?u?u?d +?s?s?u?u?d?u?u?u +?s?s?u?u?d?u?u?s +?s?s?u?u?d?u?s?d +?s?s?u?u?d?u?s?u +?s?s?u?u?d?u?s?s +?s?s?u?u?d?s?d?d +?s?s?u?u?d?s?d?u +?s?s?u?u?d?s?d?s +?s?s?u?u?d?s?u?d +?s?s?u?u?d?s?u?u +?s?s?u?u?d?s?u?s +?s?s?u?u?d?s?s?d +?s?s?u?u?d?s?s?u +?s?s?u?u?d?s?s?s +?s?s?u?u?l?l?l?l +?s?s?u?u?l?l?l?u +?s?s?u?u?l?l?l?s +?s?s?u?u?l?l?u?l +?s?s?u?u?l?l?u?u +?s?s?u?u?l?l?u?s +?s?s?u?u?l?l?s?l +?s?s?u?u?l?l?s?u +?s?s?u?u?l?l?s?s +?s?s?u?u?l?u?l?l +?s?s?u?u?l?u?l?u +?s?s?u?u?l?u?l?s +?s?s?u?u?l?u?u?l +?s?s?u?u?l?u?u?u +?s?s?u?u?l?u?u?s +?s?s?u?u?l?u?s?l +?s?s?u?u?l?u?s?u +?s?s?u?u?l?u?s?s +?s?s?u?u?l?s?l?l +?s?s?u?u?l?s?l?u +?s?s?u?u?l?s?l?s +?s?s?u?u?l?s?u?l +?s?s?u?u?l?s?u?u +?s?s?u?u?l?s?u?s +?s?s?u?u?l?s?s?l +?s?s?u?u?l?s?s?u +?s?s?u?u?l?s?s?s +?s?s?u?u?u?d?d?d +?s?s?u?u?u?d?d?u +?s?s?u?u?u?d?d?s +?s?s?u?u?u?d?u?d +?s?s?u?u?u?d?u?u +?s?s?u?u?u?d?u?s +?s?s?u?u?u?d?s?d +?s?s?u?u?u?d?s?u +?s?s?u?u?u?d?s?s +?s?s?u?u?u?l?l?l +?s?s?u?u?u?l?l?u +?s?s?u?u?u?l?l?s +?s?s?u?u?u?l?u?l +?s?s?u?u?u?l?u?u +?s?s?u?u?u?l?u?s +?s?s?u?u?u?l?s?l +?s?s?u?u?u?l?s?u +?s?s?u?u?u?l?s?s +?s?s?u?u?u?u?d?d +?s?s?u?u?u?u?d?u +?s?s?u?u?u?u?d?s +?s?s?u?u?u?u?l?l +?s?s?u?u?u?u?l?u +?s?s?u?u?u?u?l?s +?s?s?u?u?u?u?u?d +?s?s?u?u?u?u?u?l +?s?s?u?u?u?u?u?u +?s?s?u?u?u?u?u?s +?s?s?u?u?u?u?s?d +?s?s?u?u?u?u?s?l +?s?s?u?u?u?u?s?u +?s?s?u?u?u?u?s?s +?s?s?u?u?u?s?d?d +?s?s?u?u?u?s?d?u +?s?s?u?u?u?s?d?s +?s?s?u?u?u?s?l?l +?s?s?u?u?u?s?l?u +?s?s?u?u?u?s?l?s +?s?s?u?u?u?s?u?d +?s?s?u?u?u?s?u?l +?s?s?u?u?u?s?u?u +?s?s?u?u?u?s?u?s +?s?s?u?u?u?s?s?d +?s?s?u?u?u?s?s?l +?s?s?u?u?u?s?s?u +?s?s?u?u?u?s?s?s +?s?s?u?u?s?d?d?d +?s?s?u?u?s?d?d?u +?s?s?u?u?s?d?d?s +?s?s?u?u?s?d?u?d +?s?s?u?u?s?d?u?u +?s?s?u?u?s?d?u?s +?s?s?u?u?s?d?s?d +?s?s?u?u?s?d?s?u +?s?s?u?u?s?d?s?s +?s?s?u?u?s?l?l?l +?s?s?u?u?s?l?l?u +?s?s?u?u?s?l?l?s +?s?s?u?u?s?l?u?l +?s?s?u?u?s?l?u?u +?s?s?u?u?s?l?u?s +?s?s?u?u?s?l?s?l +?s?s?u?u?s?l?s?u +?s?s?u?u?s?l?s?s +?s?s?u?u?s?u?d?d +?s?s?u?u?s?u?d?u +?s?s?u?u?s?u?d?s +?s?s?u?u?s?u?l?l +?s?s?u?u?s?u?l?u +?s?s?u?u?s?u?l?s +?s?s?u?u?s?u?u?d +?s?s?u?u?s?u?u?l +?s?s?u?u?s?u?u?u +?s?s?u?u?s?u?u?s +?s?s?u?u?s?u?s?d +?s?s?u?u?s?u?s?l +?s?s?u?u?s?u?s?u +?s?s?u?u?s?u?s?s +?s?s?u?u?s?s?d?d +?s?s?u?u?s?s?d?u +?s?s?u?u?s?s?d?s +?s?s?u?u?s?s?l?l +?s?s?u?u?s?s?l?u +?s?s?u?u?s?s?l?s +?s?s?u?u?s?s?u?d +?s?s?u?u?s?s?u?l +?s?s?u?u?s?s?u?u +?s?s?u?u?s?s?u?s +?s?s?u?u?s?s?s?d +?s?s?u?u?s?s?s?l +?s?s?u?u?s?s?s?u +?s?s?u?u?s?s?s?s +?s?s?u?s?d?d?d?d +?s?s?u?s?d?d?d?u +?s?s?u?s?d?d?d?s +?s?s?u?s?d?d?u?d +?s?s?u?s?d?d?u?u +?s?s?u?s?d?d?u?s +?s?s?u?s?d?d?s?d +?s?s?u?s?d?d?s?u +?s?s?u?s?d?d?s?s +?s?s?u?s?d?u?d?d +?s?s?u?s?d?u?d?u +?s?s?u?s?d?u?d?s +?s?s?u?s?d?u?u?d +?s?s?u?s?d?u?u?u +?s?s?u?s?d?u?u?s +?s?s?u?s?d?u?s?d +?s?s?u?s?d?u?s?u +?s?s?u?s?d?u?s?s +?s?s?u?s?d?s?d?d +?s?s?u?s?d?s?d?u +?s?s?u?s?d?s?d?s +?s?s?u?s?d?s?u?d +?s?s?u?s?d?s?u?u +?s?s?u?s?d?s?u?s +?s?s?u?s?d?s?s?d +?s?s?u?s?d?s?s?u +?s?s?u?s?d?s?s?s +?s?s?u?s?l?l?l?l +?s?s?u?s?l?l?l?u +?s?s?u?s?l?l?l?s +?s?s?u?s?l?l?u?l +?s?s?u?s?l?l?u?u +?s?s?u?s?l?l?u?s +?s?s?u?s?l?l?s?l +?s?s?u?s?l?l?s?u +?s?s?u?s?l?l?s?s +?s?s?u?s?l?u?l?l +?s?s?u?s?l?u?l?u +?s?s?u?s?l?u?l?s +?s?s?u?s?l?u?u?l +?s?s?u?s?l?u?u?u +?s?s?u?s?l?u?u?s +?s?s?u?s?l?u?s?l +?s?s?u?s?l?u?s?u +?s?s?u?s?l?u?s?s +?s?s?u?s?l?s?l?l +?s?s?u?s?l?s?l?u +?s?s?u?s?l?s?l?s +?s?s?u?s?l?s?u?l +?s?s?u?s?l?s?u?u +?s?s?u?s?l?s?u?s +?s?s?u?s?l?s?s?l +?s?s?u?s?l?s?s?u +?s?s?u?s?l?s?s?s +?s?s?u?s?u?d?d?d +?s?s?u?s?u?d?d?u +?s?s?u?s?u?d?d?s +?s?s?u?s?u?d?u?d +?s?s?u?s?u?d?u?u +?s?s?u?s?u?d?u?s +?s?s?u?s?u?d?s?d +?s?s?u?s?u?d?s?u +?s?s?u?s?u?d?s?s +?s?s?u?s?u?l?l?l +?s?s?u?s?u?l?l?u +?s?s?u?s?u?l?l?s +?s?s?u?s?u?l?u?l +?s?s?u?s?u?l?u?u +?s?s?u?s?u?l?u?s +?s?s?u?s?u?l?s?l +?s?s?u?s?u?l?s?u +?s?s?u?s?u?l?s?s +?s?s?u?s?u?u?d?d +?s?s?u?s?u?u?d?u +?s?s?u?s?u?u?d?s +?s?s?u?s?u?u?l?l +?s?s?u?s?u?u?l?u +?s?s?u?s?u?u?l?s +?s?s?u?s?u?u?u?d +?s?s?u?s?u?u?u?l +?s?s?u?s?u?u?u?u +?s?s?u?s?u?u?u?s +?s?s?u?s?u?u?s?d +?s?s?u?s?u?u?s?l +?s?s?u?s?u?u?s?u +?s?s?u?s?u?u?s?s +?s?s?u?s?u?s?d?d +?s?s?u?s?u?s?d?u +?s?s?u?s?u?s?d?s +?s?s?u?s?u?s?l?l +?s?s?u?s?u?s?l?u +?s?s?u?s?u?s?l?s +?s?s?u?s?u?s?u?d +?s?s?u?s?u?s?u?l +?s?s?u?s?u?s?u?u +?s?s?u?s?u?s?u?s +?s?s?u?s?u?s?s?d +?s?s?u?s?u?s?s?l +?s?s?u?s?u?s?s?u +?s?s?u?s?u?s?s?s +?s?s?u?s?s?d?d?d +?s?s?u?s?s?d?d?u +?s?s?u?s?s?d?d?s +?s?s?u?s?s?d?u?d +?s?s?u?s?s?d?u?u +?s?s?u?s?s?d?u?s +?s?s?u?s?s?d?s?d +?s?s?u?s?s?d?s?u +?s?s?u?s?s?d?s?s +?s?s?u?s?s?l?l?l +?s?s?u?s?s?l?l?u +?s?s?u?s?s?l?l?s +?s?s?u?s?s?l?u?l +?s?s?u?s?s?l?u?u +?s?s?u?s?s?l?u?s +?s?s?u?s?s?l?s?l +?s?s?u?s?s?l?s?u +?s?s?u?s?s?l?s?s +?s?s?u?s?s?u?d?d +?s?s?u?s?s?u?d?u +?s?s?u?s?s?u?d?s +?s?s?u?s?s?u?l?l +?s?s?u?s?s?u?l?u +?s?s?u?s?s?u?l?s +?s?s?u?s?s?u?u?d +?s?s?u?s?s?u?u?l +?s?s?u?s?s?u?u?u +?s?s?u?s?s?u?u?s +?s?s?u?s?s?u?s?d +?s?s?u?s?s?u?s?l +?s?s?u?s?s?u?s?u +?s?s?u?s?s?u?s?s +?s?s?u?s?s?s?d?d +?s?s?u?s?s?s?d?u +?s?s?u?s?s?s?d?s +?s?s?u?s?s?s?l?l +?s?s?u?s?s?s?l?u +?s?s?u?s?s?s?l?s +?s?s?u?s?s?s?u?d +?s?s?u?s?s?s?u?l +?s?s?u?s?s?s?u?u +?s?s?u?s?s?s?u?s +?s?s?u?s?s?s?s?d +?s?s?u?s?s?s?s?l +?s?s?u?s?s?s?s?u +?s?s?u?s?s?s?s?s +?s?s?s?d?d?d?d?d +?s?s?s?d?d?d?d?l +?s?s?s?d?d?d?d?u +?s?s?s?d?d?d?d?s +?s?s?s?d?d?d?l?d +?s?s?s?d?d?d?l?l +?s?s?s?d?d?d?l?s +?s?s?s?d?d?d?u?d +?s?s?s?d?d?d?u?u +?s?s?s?d?d?d?u?s +?s?s?s?d?d?d?s?d +?s?s?s?d?d?d?s?l +?s?s?s?d?d?d?s?u +?s?s?s?d?d?d?s?s +?s?s?s?d?d?l?d?d +?s?s?s?d?d?l?d?l +?s?s?s?d?d?l?d?s +?s?s?s?d?d?l?l?d +?s?s?s?d?d?l?l?l +?s?s?s?d?d?l?l?s +?s?s?s?d?d?l?s?d +?s?s?s?d?d?l?s?l +?s?s?s?d?d?l?s?s +?s?s?s?d?d?u?d?d +?s?s?s?d?d?u?d?u +?s?s?s?d?d?u?d?s +?s?s?s?d?d?u?u?d +?s?s?s?d?d?u?u?u +?s?s?s?d?d?u?u?s +?s?s?s?d?d?u?s?d +?s?s?s?d?d?u?s?u +?s?s?s?d?d?u?s?s +?s?s?s?d?d?s?d?d +?s?s?s?d?d?s?d?l +?s?s?s?d?d?s?d?u +?s?s?s?d?d?s?d?s +?s?s?s?d?d?s?l?d +?s?s?s?d?d?s?l?l +?s?s?s?d?d?s?l?s +?s?s?s?d?d?s?u?d +?s?s?s?d?d?s?u?u +?s?s?s?d?d?s?u?s +?s?s?s?d?d?s?s?d +?s?s?s?d?d?s?s?l +?s?s?s?d?d?s?s?u +?s?s?s?d?d?s?s?s +?s?s?s?d?l?d?d?d +?s?s?s?d?l?d?d?l +?s?s?s?d?l?d?d?s +?s?s?s?d?l?d?l?d +?s?s?s?d?l?d?l?l +?s?s?s?d?l?d?l?s +?s?s?s?d?l?d?s?d +?s?s?s?d?l?d?s?l +?s?s?s?d?l?d?s?s +?s?s?s?d?l?l?d?d +?s?s?s?d?l?l?d?l +?s?s?s?d?l?l?d?s +?s?s?s?d?l?l?l?d +?s?s?s?d?l?l?l?l +?s?s?s?d?l?l?l?s +?s?s?s?d?l?l?s?d +?s?s?s?d?l?l?s?l +?s?s?s?d?l?l?s?s +?s?s?s?d?l?s?d?d +?s?s?s?d?l?s?d?l +?s?s?s?d?l?s?d?s +?s?s?s?d?l?s?l?d +?s?s?s?d?l?s?l?l +?s?s?s?d?l?s?l?s +?s?s?s?d?l?s?s?d +?s?s?s?d?l?s?s?l +?s?s?s?d?l?s?s?s +?s?s?s?d?u?d?d?d +?s?s?s?d?u?d?d?u +?s?s?s?d?u?d?d?s +?s?s?s?d?u?d?u?d +?s?s?s?d?u?d?u?u +?s?s?s?d?u?d?u?s +?s?s?s?d?u?d?s?d +?s?s?s?d?u?d?s?u +?s?s?s?d?u?d?s?s +?s?s?s?d?u?u?d?d +?s?s?s?d?u?u?d?u +?s?s?s?d?u?u?d?s +?s?s?s?d?u?u?u?d +?s?s?s?d?u?u?u?u +?s?s?s?d?u?u?u?s +?s?s?s?d?u?u?s?d +?s?s?s?d?u?u?s?u +?s?s?s?d?u?u?s?s +?s?s?s?d?u?s?d?d +?s?s?s?d?u?s?d?u +?s?s?s?d?u?s?d?s +?s?s?s?d?u?s?u?d +?s?s?s?d?u?s?u?u +?s?s?s?d?u?s?u?s +?s?s?s?d?u?s?s?d +?s?s?s?d?u?s?s?u +?s?s?s?d?u?s?s?s +?s?s?s?d?s?d?d?d +?s?s?s?d?s?d?d?l +?s?s?s?d?s?d?d?u +?s?s?s?d?s?d?d?s +?s?s?s?d?s?d?l?d +?s?s?s?d?s?d?l?l +?s?s?s?d?s?d?l?s +?s?s?s?d?s?d?u?d +?s?s?s?d?s?d?u?u +?s?s?s?d?s?d?u?s +?s?s?s?d?s?d?s?d +?s?s?s?d?s?d?s?l +?s?s?s?d?s?d?s?u +?s?s?s?d?s?d?s?s +?s?s?s?d?s?l?d?d +?s?s?s?d?s?l?d?l +?s?s?s?d?s?l?d?s +?s?s?s?d?s?l?l?d +?s?s?s?d?s?l?l?l +?s?s?s?d?s?l?l?s +?s?s?s?d?s?l?s?d +?s?s?s?d?s?l?s?l +?s?s?s?d?s?l?s?s +?s?s?s?d?s?u?d?d +?s?s?s?d?s?u?d?u +?s?s?s?d?s?u?d?s +?s?s?s?d?s?u?u?d +?s?s?s?d?s?u?u?u +?s?s?s?d?s?u?u?s +?s?s?s?d?s?u?s?d +?s?s?s?d?s?u?s?u +?s?s?s?d?s?u?s?s +?s?s?s?d?s?s?d?d +?s?s?s?d?s?s?d?l +?s?s?s?d?s?s?d?u +?s?s?s?d?s?s?d?s +?s?s?s?d?s?s?l?d +?s?s?s?d?s?s?l?l +?s?s?s?d?s?s?l?s +?s?s?s?d?s?s?u?d +?s?s?s?d?s?s?u?u +?s?s?s?d?s?s?u?s +?s?s?s?d?s?s?s?d +?s?s?s?d?s?s?s?l +?s?s?s?d?s?s?s?u +?s?s?s?d?s?s?s?s +?s?s?s?l?d?d?d?d +?s?s?s?l?d?d?d?l +?s?s?s?l?d?d?d?s +?s?s?s?l?d?d?l?d +?s?s?s?l?d?d?l?l +?s?s?s?l?d?d?l?s +?s?s?s?l?d?d?s?d +?s?s?s?l?d?d?s?l +?s?s?s?l?d?d?s?s +?s?s?s?l?d?l?d?d +?s?s?s?l?d?l?d?l +?s?s?s?l?d?l?d?s +?s?s?s?l?d?l?l?d +?s?s?s?l?d?l?l?l +?s?s?s?l?d?l?l?s +?s?s?s?l?d?l?s?d +?s?s?s?l?d?l?s?l +?s?s?s?l?d?l?s?s +?s?s?s?l?d?s?d?d +?s?s?s?l?d?s?d?l +?s?s?s?l?d?s?d?s +?s?s?s?l?d?s?l?d +?s?s?s?l?d?s?l?l +?s?s?s?l?d?s?l?s +?s?s?s?l?d?s?s?d +?s?s?s?l?d?s?s?l +?s?s?s?l?d?s?s?s +?s?s?s?l?l?d?d?d +?s?s?s?l?l?d?d?l +?s?s?s?l?l?d?d?s +?s?s?s?l?l?d?l?d +?s?s?s?l?l?d?l?l +?s?s?s?l?l?d?l?s +?s?s?s?l?l?d?s?d +?s?s?s?l?l?d?s?l +?s?s?s?l?l?d?s?s +?s?s?s?l?l?l?d?d +?s?s?s?l?l?l?d?l +?s?s?s?l?l?l?d?s +?s?s?s?l?l?l?l?d +?s?s?s?l?l?l?l?l +?s?s?s?l?l?l?l?u +?s?s?s?l?l?l?l?s +?s?s?s?l?l?l?u?l +?s?s?s?l?l?l?u?u +?s?s?s?l?l?l?u?s +?s?s?s?l?l?l?s?d +?s?s?s?l?l?l?s?l +?s?s?s?l?l?l?s?u +?s?s?s?l?l?l?s?s +?s?s?s?l?l?u?l?l +?s?s?s?l?l?u?l?u +?s?s?s?l?l?u?l?s +?s?s?s?l?l?u?u?l +?s?s?s?l?l?u?u?u +?s?s?s?l?l?u?u?s +?s?s?s?l?l?u?s?l +?s?s?s?l?l?u?s?u +?s?s?s?l?l?u?s?s +?s?s?s?l?l?s?d?d +?s?s?s?l?l?s?d?l +?s?s?s?l?l?s?d?s +?s?s?s?l?l?s?l?d +?s?s?s?l?l?s?l?l +?s?s?s?l?l?s?l?u +?s?s?s?l?l?s?l?s +?s?s?s?l?l?s?u?l +?s?s?s?l?l?s?u?u +?s?s?s?l?l?s?u?s +?s?s?s?l?l?s?s?d +?s?s?s?l?l?s?s?l +?s?s?s?l?l?s?s?u +?s?s?s?l?l?s?s?s +?s?s?s?l?u?l?l?l +?s?s?s?l?u?l?l?u +?s?s?s?l?u?l?l?s +?s?s?s?l?u?l?u?l +?s?s?s?l?u?l?u?u +?s?s?s?l?u?l?u?s +?s?s?s?l?u?l?s?l +?s?s?s?l?u?l?s?u +?s?s?s?l?u?l?s?s +?s?s?s?l?u?u?l?l +?s?s?s?l?u?u?l?u +?s?s?s?l?u?u?l?s +?s?s?s?l?u?u?u?l +?s?s?s?l?u?u?u?u +?s?s?s?l?u?u?u?s +?s?s?s?l?u?u?s?l +?s?s?s?l?u?u?s?u +?s?s?s?l?u?u?s?s +?s?s?s?l?u?s?l?l +?s?s?s?l?u?s?l?u +?s?s?s?l?u?s?l?s +?s?s?s?l?u?s?u?l +?s?s?s?l?u?s?u?u +?s?s?s?l?u?s?u?s +?s?s?s?l?u?s?s?l +?s?s?s?l?u?s?s?u +?s?s?s?l?u?s?s?s +?s?s?s?l?s?d?d?d +?s?s?s?l?s?d?d?l +?s?s?s?l?s?d?d?s +?s?s?s?l?s?d?l?d +?s?s?s?l?s?d?l?l +?s?s?s?l?s?d?l?s +?s?s?s?l?s?d?s?d +?s?s?s?l?s?d?s?l +?s?s?s?l?s?d?s?s +?s?s?s?l?s?l?d?d +?s?s?s?l?s?l?d?l +?s?s?s?l?s?l?d?s +?s?s?s?l?s?l?l?d +?s?s?s?l?s?l?l?l +?s?s?s?l?s?l?l?u +?s?s?s?l?s?l?l?s +?s?s?s?l?s?l?u?l +?s?s?s?l?s?l?u?u +?s?s?s?l?s?l?u?s +?s?s?s?l?s?l?s?d +?s?s?s?l?s?l?s?l +?s?s?s?l?s?l?s?u +?s?s?s?l?s?l?s?s +?s?s?s?l?s?u?l?l +?s?s?s?l?s?u?l?u +?s?s?s?l?s?u?l?s +?s?s?s?l?s?u?u?l +?s?s?s?l?s?u?u?u +?s?s?s?l?s?u?u?s +?s?s?s?l?s?u?s?l +?s?s?s?l?s?u?s?u +?s?s?s?l?s?u?s?s +?s?s?s?l?s?s?d?d +?s?s?s?l?s?s?d?l +?s?s?s?l?s?s?d?s +?s?s?s?l?s?s?l?d +?s?s?s?l?s?s?l?l +?s?s?s?l?s?s?l?u +?s?s?s?l?s?s?l?s +?s?s?s?l?s?s?u?l +?s?s?s?l?s?s?u?u +?s?s?s?l?s?s?u?s +?s?s?s?l?s?s?s?d +?s?s?s?l?s?s?s?l +?s?s?s?l?s?s?s?u +?s?s?s?l?s?s?s?s +?s?s?s?u?d?d?d?d +?s?s?s?u?d?d?d?u +?s?s?s?u?d?d?d?s +?s?s?s?u?d?d?u?d +?s?s?s?u?d?d?u?u +?s?s?s?u?d?d?u?s +?s?s?s?u?d?d?s?d +?s?s?s?u?d?d?s?u +?s?s?s?u?d?d?s?s +?s?s?s?u?d?u?d?d +?s?s?s?u?d?u?d?u +?s?s?s?u?d?u?d?s +?s?s?s?u?d?u?u?d +?s?s?s?u?d?u?u?u +?s?s?s?u?d?u?u?s +?s?s?s?u?d?u?s?d +?s?s?s?u?d?u?s?u +?s?s?s?u?d?u?s?s +?s?s?s?u?d?s?d?d +?s?s?s?u?d?s?d?u +?s?s?s?u?d?s?d?s +?s?s?s?u?d?s?u?d +?s?s?s?u?d?s?u?u +?s?s?s?u?d?s?u?s +?s?s?s?u?d?s?s?d +?s?s?s?u?d?s?s?u +?s?s?s?u?d?s?s?s +?s?s?s?u?l?l?l?l +?s?s?s?u?l?l?l?u +?s?s?s?u?l?l?l?s +?s?s?s?u?l?l?u?l +?s?s?s?u?l?l?u?u +?s?s?s?u?l?l?u?s +?s?s?s?u?l?l?s?l +?s?s?s?u?l?l?s?u +?s?s?s?u?l?l?s?s +?s?s?s?u?l?u?l?l +?s?s?s?u?l?u?l?u +?s?s?s?u?l?u?l?s +?s?s?s?u?l?u?u?l +?s?s?s?u?l?u?u?u +?s?s?s?u?l?u?u?s +?s?s?s?u?l?u?s?l +?s?s?s?u?l?u?s?u +?s?s?s?u?l?u?s?s +?s?s?s?u?l?s?l?l +?s?s?s?u?l?s?l?u +?s?s?s?u?l?s?l?s +?s?s?s?u?l?s?u?l +?s?s?s?u?l?s?u?u +?s?s?s?u?l?s?u?s +?s?s?s?u?l?s?s?l +?s?s?s?u?l?s?s?u +?s?s?s?u?l?s?s?s +?s?s?s?u?u?d?d?d +?s?s?s?u?u?d?d?u +?s?s?s?u?u?d?d?s +?s?s?s?u?u?d?u?d +?s?s?s?u?u?d?u?u +?s?s?s?u?u?d?u?s +?s?s?s?u?u?d?s?d +?s?s?s?u?u?d?s?u +?s?s?s?u?u?d?s?s +?s?s?s?u?u?l?l?l +?s?s?s?u?u?l?l?u +?s?s?s?u?u?l?l?s +?s?s?s?u?u?l?u?l +?s?s?s?u?u?l?u?u +?s?s?s?u?u?l?u?s +?s?s?s?u?u?l?s?l +?s?s?s?u?u?l?s?u +?s?s?s?u?u?l?s?s +?s?s?s?u?u?u?d?d +?s?s?s?u?u?u?d?u +?s?s?s?u?u?u?d?s +?s?s?s?u?u?u?l?l +?s?s?s?u?u?u?l?u +?s?s?s?u?u?u?l?s +?s?s?s?u?u?u?u?d +?s?s?s?u?u?u?u?l +?s?s?s?u?u?u?u?u +?s?s?s?u?u?u?u?s +?s?s?s?u?u?u?s?d +?s?s?s?u?u?u?s?l +?s?s?s?u?u?u?s?u +?s?s?s?u?u?u?s?s +?s?s?s?u?u?s?d?d +?s?s?s?u?u?s?d?u +?s?s?s?u?u?s?d?s +?s?s?s?u?u?s?l?l +?s?s?s?u?u?s?l?u +?s?s?s?u?u?s?l?s +?s?s?s?u?u?s?u?d +?s?s?s?u?u?s?u?l +?s?s?s?u?u?s?u?u +?s?s?s?u?u?s?u?s +?s?s?s?u?u?s?s?d +?s?s?s?u?u?s?s?l +?s?s?s?u?u?s?s?u +?s?s?s?u?u?s?s?s +?s?s?s?u?s?d?d?d +?s?s?s?u?s?d?d?u +?s?s?s?u?s?d?d?s +?s?s?s?u?s?d?u?d +?s?s?s?u?s?d?u?u +?s?s?s?u?s?d?u?s +?s?s?s?u?s?d?s?d +?s?s?s?u?s?d?s?u +?s?s?s?u?s?d?s?s +?s?s?s?u?s?l?l?l +?s?s?s?u?s?l?l?u +?s?s?s?u?s?l?l?s +?s?s?s?u?s?l?u?l +?s?s?s?u?s?l?u?u +?s?s?s?u?s?l?u?s +?s?s?s?u?s?l?s?l +?s?s?s?u?s?l?s?u +?s?s?s?u?s?l?s?s +?s?s?s?u?s?u?d?d +?s?s?s?u?s?u?d?u +?s?s?s?u?s?u?d?s +?s?s?s?u?s?u?l?l +?s?s?s?u?s?u?l?u +?s?s?s?u?s?u?l?s +?s?s?s?u?s?u?u?d +?s?s?s?u?s?u?u?l +?s?s?s?u?s?u?u?u +?s?s?s?u?s?u?u?s +?s?s?s?u?s?u?s?d +?s?s?s?u?s?u?s?l +?s?s?s?u?s?u?s?u +?s?s?s?u?s?u?s?s +?s?s?s?u?s?s?d?d +?s?s?s?u?s?s?d?u +?s?s?s?u?s?s?d?s +?s?s?s?u?s?s?l?l +?s?s?s?u?s?s?l?u +?s?s?s?u?s?s?l?s +?s?s?s?u?s?s?u?d +?s?s?s?u?s?s?u?l +?s?s?s?u?s?s?u?u +?s?s?s?u?s?s?u?s +?s?s?s?u?s?s?s?d +?s?s?s?u?s?s?s?l +?s?s?s?u?s?s?s?u +?s?s?s?u?s?s?s?s +?s?s?s?s?d?d?d?d +?s?s?s?s?d?d?d?l +?s?s?s?s?d?d?d?u +?s?s?s?s?d?d?d?s +?s?s?s?s?d?d?l?d +?s?s?s?s?d?d?l?l +?s?s?s?s?d?d?l?s +?s?s?s?s?d?d?u?d +?s?s?s?s?d?d?u?u +?s?s?s?s?d?d?u?s +?s?s?s?s?d?d?s?d +?s?s?s?s?d?d?s?l +?s?s?s?s?d?d?s?u +?s?s?s?s?d?d?s?s +?s?s?s?s?d?l?d?d +?s?s?s?s?d?l?d?l +?s?s?s?s?d?l?d?s +?s?s?s?s?d?l?l?d +?s?s?s?s?d?l?l?l +?s?s?s?s?d?l?l?s +?s?s?s?s?d?l?s?d +?s?s?s?s?d?l?s?l +?s?s?s?s?d?l?s?s +?s?s?s?s?d?u?d?d +?s?s?s?s?d?u?d?u +?s?s?s?s?d?u?d?s +?s?s?s?s?d?u?u?d +?s?s?s?s?d?u?u?u +?s?s?s?s?d?u?u?s +?s?s?s?s?d?u?s?d +?s?s?s?s?d?u?s?u +?s?s?s?s?d?u?s?s +?s?s?s?s?d?s?d?d +?s?s?s?s?d?s?d?l +?s?s?s?s?d?s?d?u +?s?s?s?s?d?s?d?s +?s?s?s?s?d?s?l?d +?s?s?s?s?d?s?l?l +?s?s?s?s?d?s?l?s +?s?s?s?s?d?s?u?d +?s?s?s?s?d?s?u?u +?s?s?s?s?d?s?u?s +?s?s?s?s?d?s?s?d +?s?s?s?s?d?s?s?l +?s?s?s?s?d?s?s?u +?s?s?s?s?d?s?s?s +?s?s?s?s?l?d?d?d +?s?s?s?s?l?d?d?l +?s?s?s?s?l?d?d?s +?s?s?s?s?l?d?l?d +?s?s?s?s?l?d?l?l +?s?s?s?s?l?d?l?s +?s?s?s?s?l?d?s?d +?s?s?s?s?l?d?s?l +?s?s?s?s?l?d?s?s +?s?s?s?s?l?l?d?d +?s?s?s?s?l?l?d?l +?s?s?s?s?l?l?d?s +?s?s?s?s?l?l?l?d +?s?s?s?s?l?l?l?l +?s?s?s?s?l?l?l?u +?s?s?s?s?l?l?l?s +?s?s?s?s?l?l?u?l +?s?s?s?s?l?l?u?u +?s?s?s?s?l?l?u?s +?s?s?s?s?l?l?s?d +?s?s?s?s?l?l?s?l +?s?s?s?s?l?l?s?u +?s?s?s?s?l?l?s?s +?s?s?s?s?l?u?l?l +?s?s?s?s?l?u?l?u +?s?s?s?s?l?u?l?s +?s?s?s?s?l?u?u?l +?s?s?s?s?l?u?u?u +?s?s?s?s?l?u?u?s +?s?s?s?s?l?u?s?l +?s?s?s?s?l?u?s?u +?s?s?s?s?l?u?s?s +?s?s?s?s?l?s?d?d +?s?s?s?s?l?s?d?l +?s?s?s?s?l?s?d?s +?s?s?s?s?l?s?l?d +?s?s?s?s?l?s?l?l +?s?s?s?s?l?s?l?u +?s?s?s?s?l?s?l?s +?s?s?s?s?l?s?u?l +?s?s?s?s?l?s?u?u +?s?s?s?s?l?s?u?s +?s?s?s?s?l?s?s?d +?s?s?s?s?l?s?s?l +?s?s?s?s?l?s?s?u +?s?s?s?s?l?s?s?s +?s?s?s?s?u?d?d?d +?s?s?s?s?u?d?d?u +?s?s?s?s?u?d?d?s +?s?s?s?s?u?d?u?d +?s?s?s?s?u?d?u?u +?s?s?s?s?u?d?u?s +?s?s?s?s?u?d?s?d +?s?s?s?s?u?d?s?u +?s?s?s?s?u?d?s?s +?s?s?s?s?u?l?l?l +?s?s?s?s?u?l?l?u +?s?s?s?s?u?l?l?s +?s?s?s?s?u?l?u?l +?s?s?s?s?u?l?u?u +?s?s?s?s?u?l?u?s +?s?s?s?s?u?l?s?l +?s?s?s?s?u?l?s?u +?s?s?s?s?u?l?s?s +?s?s?s?s?u?u?d?d +?s?s?s?s?u?u?d?u +?s?s?s?s?u?u?d?s +?s?s?s?s?u?u?l?l +?s?s?s?s?u?u?l?u +?s?s?s?s?u?u?l?s +?s?s?s?s?u?u?u?d +?s?s?s?s?u?u?u?l +?s?s?s?s?u?u?u?u +?s?s?s?s?u?u?u?s +?s?s?s?s?u?u?s?d +?s?s?s?s?u?u?s?l +?s?s?s?s?u?u?s?u +?s?s?s?s?u?u?s?s +?s?s?s?s?u?s?d?d +?s?s?s?s?u?s?d?u +?s?s?s?s?u?s?d?s +?s?s?s?s?u?s?l?l +?s?s?s?s?u?s?l?u +?s?s?s?s?u?s?l?s +?s?s?s?s?u?s?u?d +?s?s?s?s?u?s?u?l +?s?s?s?s?u?s?u?u +?s?s?s?s?u?s?u?s +?s?s?s?s?u?s?s?d +?s?s?s?s?u?s?s?l +?s?s?s?s?u?s?s?u +?s?s?s?s?u?s?s?s +?s?s?s?s?s?d?d?d +?s?s?s?s?s?d?d?l +?s?s?s?s?s?d?d?u +?s?s?s?s?s?d?d?s +?s?s?s?s?s?d?l?d +?s?s?s?s?s?d?l?l +?s?s?s?s?s?d?l?s +?s?s?s?s?s?d?u?d +?s?s?s?s?s?d?u?u +?s?s?s?s?s?d?u?s +?s?s?s?s?s?d?s?d +?s?s?s?s?s?d?s?l +?s?s?s?s?s?d?s?u +?s?s?s?s?s?d?s?s +?s?s?s?s?s?l?d?d +?s?s?s?s?s?l?d?l +?s?s?s?s?s?l?d?s +?s?s?s?s?s?l?l?d +?s?s?s?s?s?l?l?l +?s?s?s?s?s?l?l?u +?s?s?s?s?s?l?l?s +?s?s?s?s?s?l?u?l +?s?s?s?s?s?l?u?u +?s?s?s?s?s?l?u?s +?s?s?s?s?s?l?s?d +?s?s?s?s?s?l?s?l +?s?s?s?s?s?l?s?u +?s?s?s?s?s?l?s?s +?s?s?s?s?s?u?d?d +?s?s?s?s?s?u?d?u +?s?s?s?s?s?u?d?s +?s?s?s?s?s?u?l?l +?s?s?s?s?s?u?l?u +?s?s?s?s?s?u?l?s +?s?s?s?s?s?u?u?d +?s?s?s?s?s?u?u?l +?s?s?s?s?s?u?u?u +?s?s?s?s?s?u?u?s +?s?s?s?s?s?u?s?d +?s?s?s?s?s?u?s?l +?s?s?s?s?s?u?s?u +?s?s?s?s?s?u?s?s +?s?s?s?s?s?s?d?d +?s?s?s?s?s?s?d?l +?s?s?s?s?s?s?d?u +?s?s?s?s?s?s?d?s +?s?s?s?s?s?s?l?d +?s?s?s?s?s?s?l?l +?s?s?s?s?s?s?l?u +?s?s?s?s?s?s?l?s +?s?s?s?s?s?s?u?d +?s?s?s?s?s?s?u?l +?s?s?s?s?s?s?u?u +?s?s?s?s?s?s?u?s +?s?s?s?s?s?s?s?d +?s?s?s?s?s?s?s?l +?s?s?s?s?s?s?s?u +?s?s?s?s?s?s?s?s diff --git a/masks/rockyou-1-60.hcmask b/masks/rockyou-1-60.hcmask new file mode 100644 index 0000000000..a5ee73f39e --- /dev/null +++ b/masks/rockyou-1-60.hcmask @@ -0,0 +1,837 @@ +?d +?d?d +?l +?d?d?d?d +?d?d?d?d?d?d +?d?d?d?d?d +?l?l +?d?d?d +?u +?s +?l?l?l +?u?u +?l?d +?d?d?d?d?d?d?d +?u?d +?l?l?l?l +?l?l?d?d?d?d +?u?u?u +?l?l?d +?u?l +?l?d?d?d?d +?l?l?l?l?l +?l?l?l?d?d +?l?d?d +?d?d?d?d?l +?l?d?d?d?d?d +?l?l?d?d +?s?d +?l?l?l?d?d?d +?l?l?l?l?d?d +?s?s +?d?d?d?d?l?l +?l?l?d?d?d +?d?d?d?d?d?l +?d?d?d?d?d?d?d?d +?d?l +?u?l?l +?l?s +?l?l?l?l?d +?l?l?l?d +?l?d?d?d +?l?d?l +?l?d?d?d?d?d?d +?u?u?u?u +?l?l?l?l?l?l +?d?d?d?l +?u?u?d +?d?d?d?d?d?d?l +?s?d?d +?u?d?d?d?d +?u?u?u?u?u +?d?l?l +?d?d?d?l?l +?u?u?d?d?d?d +?d?d?d?d?s +?d?d?d?d?u +?l?l?l?d?d?d?d +?l?l?l?l?l?d +?u?l?l?l +?u?u?u?d?d +?d?s?d +?l?s?l +?l?d?d?d?d?l +?d?d?s?d?d +?u?d?d +?d?d?l +?d?d?d?l?l?l +?u?d?d?d?d?d +?d?d?l?d?d +?d?d?s +?d?d?l?l?l +?d?d?l?l +?u?u?u?u?d?d +?l?l?d?d?d?d?d +?l?d?d?l?d?d +?u?l?l?l?l +?u?u?d?d?d +?d?d?l?l?d?d +?u?d?u +?u?u?u?d?d?d +?d?d?d?d?d?u +?u?u?d?d +?u?u?u?u?d +?l?d?l?d +?u?d?d?d +?d?d?u +?d?d?d?d?u?u +?d?l?l?l +?l?s?d +?l?d?d?d?l +?l?d?d?l +?s?d?d?d?d +?d?l?l?l?l +?l?l?s +?d?d?d?d?l?d +?d?d?d?d?d?d?d?d?d +?d?d?l?l?l?l +?l?l?d?l +?d?d?d?l?d +?l?d?l?l +?d?d?d?s +?l?d?l?d?d +?d?d?l?d?d?d +?l?l?l?l?l?d?d +?u?d?d?d?d?d?d +?l?l?l?l?d?d?d +?l?d?l?d?l?d +?s?s?s +?d?d?d?l?d?d +?d?s?d?d +?d?l?d?d?d +?u?u?u?d +?d?l?d?d?d?d +?l?l?l?d?l +?d?l?l?d +?d?l?d?d +?d?d?l?d +?u?l?l?l?d?d +?d?d?d?s?d +?d?d?d?d?d?s +?l?d?l?d?l +?u?l?l?d?d +?u?u?l +?l?d?d?l?d +?u?u?u?u?u?u +?l?l?d?l?l +?d?d?d?d?d?d?u +?l?d?l?l?l +?l?l?d?d?l +?u?d?l +?d?u?u +?d?l?l?l?d +?l?d?l?d?d?d +?d?s?d?d?d +?u?l?d?d?d?d +?u?s?u +?l?d?l?l?d +?d?d?d?d?l?l?l +?d?d?d?u?u +?l?l?d?d?l?l +?d?l?l?l?l?l +?u?l?l?l?d +?d?d?l?d?d?l +?s?d?l +?l?d?d?d?d?d?d?d +?l?u?u +?l?d?d?l?l +?l?l?l?l?s +?d?l?l?d?d +?d?d?l?l?d +?u?u?u?u?u?d +?l?s?d?d +?d?d?d?d?d?l?l +?d?d?s?d?d?d +?d?l?d?l?d +?l?l?d?l?d +?u?l?l?d?d?d +?s?d?s +?s?s?d +?d?l?l?l?d?d +?s?l?l +?u?u?s +?d?d?d?s?d?d +?d?l?l?l?l?d +?l?l?l?s +?l?l?d?d?d?l +?d?d?d?d?d?d?d?l +?s?d?d?d?d?d +?l?l?l?d?d?l +?d?d?d?d?s?d +?l?l?s?d?d +?l?l?l?l?l?l?l +?l?l?d?d?d?d?d?d +?d?d?d?l?l?d +?u?d?d?d?d?u +?l?l?l?l?d?l +?l?d?d?d?l?l +?d?l?d?l?d?l +?d?l?l?d?d?d +?u?l?l?l?l?l +?u?l?l?d +?l?l?l?l?l?l?d +?d?d?d?u?u?u +?u?u?u?d?d?d?d +?l?d?l?l?d?d +?l?l?l?s?d?d +?d?d?s?d +?d?l?d?l +?u?l?l?l?l?d +?u?l?d?d?d +?u?l?u +?l?u?l +?l?l?u +?d?d?l?d?l +?l?d?d?l?l?l +?l?l?d?l?l?d +?d?d?u?d?d +?d?d?d?d?d?d?s +?l?l?l?d?l?l +?l?l?l?l?d?d?d?d +?l?d?d?d?l?d +?d?d?u?u?u +?l?l?d?l?l?l +?l?d?l?l?l?l +?l?l?s?d +?d?l?d?d?l +?d?d?d?d?d?d?d?d?d?d +?d?d?l?l?l?d +?u?l?s +?d?l?d?l?l +?l?l?d?l?d?d +?l?d?l?l?d?l +?l?l?l?s?d +?d?s?d?s?d?d +?d?d?l?l?l?d?d +?u?d?d?u?d?d +?d?l?l?d?l +?s?d?d?d?d?s +?d?s?d?d?d?d +?d?u?u?u +?s?d?d?d?s +?d?d?d?u +?d?d?d?d?s?s +?d?l?d?l?d?d +?l?l?l?d?l?d +?u?u?d?d?d?d?d +?d?l?d?d?l?d +?d?u?u?u?u +?l?l?d?d?l?d +?d?d?d?d?d?d?l?l +?l?l?s?l?l +?u?l?u?l +?l?l?l?l?l?s +?l?d?l?l?l?d +?u?d?u?d?d +?s?d?d?d +?l?s?l?l?l +?u?d?d?d?u +?l?d?d?l?l?d +?l?l?l?l?u +?d?d?l?d?l?d +?u?d?u?u +?l?s?d?d?d?d +?l?d?d?l?d?l +?l?l?l?s?l +?d?d?d?l?d?d?d +?l?d?l?d?d?l +?l?l?s?l +?d?d?u?u?d?d +?d?d?d?d?u?d +?l?d?l?d?l?l +?d?s?d?s?d +?d?l?d?d?d?l +?u?u?l?l +?d?d?l?d?d?d?d +?d?d?d?l?l?l?l +?d?d?d?l?d?l +?l?s?l?l +?u?l?l?l?u +?l?l?l?l?s?d +?d?d?u?u?u?u +?d?d?d?d?l?d?d +?d?d?d?s?s +?u?s?d?d +?u?l?l?d?d?d?d +?d?d?d?s?d?d?d +?u?u?u?u?u?d?d +?l?l?s?d?d?d +?l?l?l?d?d?d?d?d +?s?s?d?d?d +?l?d?d?d?d?d?l +?d?d?d?u?d?d +?l?s?l?d?d +?u?u?u?d?u +?l?l?d?l?d?l +?d?d?u?d?d?d +?u?d?d?u?d +?d?d?d?d?s?d?d +?l?s?d?d?d +?d?d?d?d?u?l +?u?l?u?l?u +?u?u?u?u?d?d?d +?u?d?u?d?u +?l?u?u?u?u +?u?l?l?u +?u?d?u?d?u?d +?d?u?l?l +?u?u?d?u +?l?d?d?d?d?s +?u?d?d?d?d?l +?d?d?l?l?d?l +?d?u?d?d?d +?d?d?d?u?d +?u?l?u?d?d +?u?l?l?l?l?d?d +?u?d?d?u +?d?d?u?u +?l?d?u?d +?u?d?u?d +?u?l?d?d +?d?d?d?d?s?l +?u?u?d?d?u +?d?d?l?d?l?l +?l?s?l?s?l +?d?l?l?d?l?l +?d?u?d?d?d?d +?l?l?l?d?d?s +?u?u?l?l?l +?l?l?l?l?l?l?d?d +?l?s?l?s +?u?d?u?u?u +?s?l?l?l?l +?d?d?s?d?d?d?d +?d?l?l?d?l?d +?d?d?l?l?l?l?l +?d?l?l?d?d?l +?d?u?u?u?u?u +?u?d?u?u?d +?u?d?u?d?d?d +?d?l?d?d?l?l +?l?l?l?l?l?d?d?d +?d?l?l?l?d?l +?s?d?d?d?d?d?d +?d?l?d?l?l?d +?u?u?d?u?u +?u?l?u?d?d?d +?s?l?l?l +?d?u?d?u?d +?u?d?d?d?l +?s?s?s?s +?l?l?d?d?s +?d?s?d?l +?d?d?s?l +?s?l?d?d +?d?l?d?l?l?l +?u?u?u?u?s +?d?u?l?u +?u?d?d?d?d?d?d?d +?l?s?l?d?d?d +?l?u?u?u +?u?u?u?l +?d?d?l?l?d?d?d +?l?l?l?s?s +?u?d?d?l?d +?l?u?d?d?d +?d?d?u?u?d +?l?u?d?d?d?d +?d?d?d?d?d?l?d +?d?u?u?u?d +?s?s?d?d?d?d +?d?d?d?s?l +?d?d?d?d?l?s +?s?s?d?d +?u?l?u?l?d?d +?l?s?l?d +?l?l?l?u +?d?s?d?d?s?d?d +?d?d?s?d?d?s +?u?l?l?l?d?d?d +?u?u?u?s +?d?d?u?d?d?u +?u?d?d?u?u +?l?d?l?d?d?d?d +?d?l?d?d?d?d?d +?d?d?d?d?u?u?u +?u?s?d?d?d?d +?l?l?u?d?d +?u?u?d?u?d +?u?l?l?l?s +?d?d?s?d?s?d?d +?d?d?d?d?d?d?d?u +?d?d?d?d?d?s?d +?u?u?s?d?d +?d?d?d?d?d?u?u +?u?d?l?l?l +?u?u?d?d?u?u +?u?d?l?l?d +?d?d?u?d?u +?u?d?l?d?d +?d?l?l?l?l?l?l +?d?d?d?l?l?d?d +?s?l?l?l?s +?u?u?l?d?d +?d?d?u?l?l +?l?l?u?l?l +?l?s?l?l?l?l +?u?l?d?d?d?d?d +?l?l?d?d?d?s +?u?u?l?d?d?d +?l?d?d?d?d?d?d?l +?l?l?l?l?s?d?d +?l?u?u?d?d?d +?u?l?u?l?l +?l?l?d?d?d?l?l +?l?d?d?d?d?d?d?d?d +?u?u?u?u?u?u?d +?l?l?l?l?s?l +?d?d?d?d?l?l?d +?u?u?u?s?d?d +?l?l?d?d?d?d?l +?d?d?d?d?l?l?l?l +?d?u?u?u?u?d +?l?l?s?l?l?l +?l?l?u?d?d?d +?d?d?d?u?l +?u?l?u?l?d +?u?u?u?u?l +?l?d?d?d?s +?l?u?l?d?d?d +?l?l?l?l?d?s +?u?d?l?l +?d?u?d?u?d?u +?l?u?l?d?d +?d?u?u?d?u +?u?l?d?l +?u?u?d?l +?d?d?s?s?d?d +?l?l?s?d?d?d?d +?u?l?l?u?l +?d?d?s?l?l +?s?d?l?l?l +?l?u?l?l?l +?l?d?d?d?d?l?l +?u?u?d?d?d?d?d?d +?u?l?l?l?l?u +?d?u?u?u?d?d +?u?l?d?d?l +?u?l?d?l?d +?u?u?l?l?d?d +?l?d?l?d?l?d?d +?l?l?l?l?s?s +?u?u?u?u?u?u?u +?l?l?l?d?s +?l?l?l?s?l?l +?d?u?u?d?d?d +?u?u?u?u?d?u +?d?u?l?l?l +?u?d?d?l?d?d +?d?d?d?u?u?d +?l?d?d?d?l?l?l +?d?d?u?l?l?l +?l?l?l?u?u +?u?u?d?d?d?u +?d?d?d?u?l?l +?u?d?l?d?l +?l?u?l?u?l +?d?l?s?l +?s?l?l?d +?u?u?u?s?d +?d?s?l?l +?l?s?d?l +?l?l?d?s?d +?u?u?s?d +?u?s?d?u +?l?d?d?l?d?d?d +?d?u?u?d?d +?d?u?d?d?u +?d?d?d?d?d?d?d?d?l +?l?l?u?u +?u?l?l?d?l +?u?u?u?l?l +?s?l?l?l?l?l +?l?d?d?s?d?d +?l?l?l?s?d?d?d +?l?l?u?u?u +?d?d?s?d?d?s?d?d +?d?l?l?l?d?d?d +?u?u?s?u?u +?u?u?u?d?d?u +?d?d?d?d?d?l?l?l +?d?d?d?s?l?l +?u?s?u?s +?u?s?u?d?d +?u?l?s?d?d +?u?l?l?u?d?d +?u?d?d?l?l +?d?u?l?l?d +?d?u?d?u?u +?u?s?u?u?u +?u?l?d?l?l +?u?d?d?d?u?u +?u?l?l?l?l?l?d +?u?d?u?u?d?d +?s?l?l?l?l?s +?l?l?l?d?l?l?l +?u?d?d?d?d?s +?d?l?l?d?d?d?d +?d?l?l?l?l?l?d +?l?l?s?s?l +?l?d?d?d?l?d?d +?s?d?l?l?l?l +?l?s?l?l?d +?u?d?d?u?u?u +?l?d?l?d?s +?u?u?u?s?u +?d?d?d?d?l?u +?l?d?s?s +?l?d?d?s?d +?s?l?d?d?d +?s?d?d?d?l +?u?s?d?d?d +?d?s?d?d?l +?u?d?u?u?u?u +?u?l?l?s +?u?u?s?u +?d?l?d?l?d?l?d +?u?l?d?d?u +?d?l?l?l?l?d?d +?l?l?l?u?l +?l?l?l?d?d?d?l +?u?s?u?s?u +?d?d?d?d?d?d?d?s +?d?s?d?d?d?d?d +?u?u?s?d?d?d +?u?u?u?d?u?u +?l?l?d?d?l?l?l +?l?l?l?l?l?l?l?l +?l?u?u?u?d +?u?u?l?l?d +?u?l?l?u?d +?d?u?d?d?u?d +?d?u?l?l?l?l +?l?l?l?l?l?u +?u?u?d?u?u?u +?u?u?d?u?u?d +?u?l?l?u?l?l +?u?d?u?u?d?u +?s?s?s?d?d +?d?d?d?l?u +?d?d?u?l?d?d +?d?d?l?d?u +?d?d?d?s?d?d?d?d +?u?l?u?d?d?d?d +?u?u?u?u?u?s +?d?s?l?l?l +?l?s?l?l?d?d +?s?l?d?d?d?d +?u?l?l?l?l?s +?u?s?l?l?l +?d?d?s?d?s?d +?l?u?u?d?d +?l?d?d?l?d?d?l +?s?d?d?d?d?l +?u?d?l?d?l?d +?d?d?s?l?l?l +?s?l?l?l?d?d +?s?d?s?d?d +?d?s?s?d?d +?d?s?d?d?s?d +?d?s?d?d?s +?u?l?u?l?u?l +?u?d?l?l?d?d +?l?s?s?l +?u?u?s?s +?l?l?s?s +?u?d?l?l?l?l +?u?l?l?l?d?l +?d?d?u?d?d?d?d +?l?u?u?u?d?d +?u?l?l?s?d?d +?u?u?d?d?u?d +?d?d?u?u?u?d +?u?u?u?u?d?d?d?d +?l?d?d?d?d?u +?l?l?l?d?d?l?l +?l?l?l?u?d +?l?s?l?d?d?d?d +?u?u?d?u?d?d +?d?d?d?u?d?d?d +?u?u?u?u?s?d +?u?l?l?s?d +?l?s?l?d?l +?l?l?l?d?d?d?d?d?d +?u?l?u?u?l +?u?d?d?d?u?d +?d?u?d?u?d?d +?l?s?l?s?d?d +?s?d?d?s?d?d +?d?d?d?d?d?d?u?u +?u?d?l?l?d?l +?d?d?d?d?s?u +?l?l?d?d?l?d?d +?l?l?d?l?s +?l?d?l?l?d?d?d +?s?s?s?s?s +?u?d?l?d?d?d +?d?d?u?d?u?d +?l?l?l?l?l?l?l?d +?d?l?d?s?d +?d?d?s?d?l +?d?d?d?s?u +?u?d?u?u?u?d +?l?l?d?s?d?d +?u?s?u?d?d?d +?u?l?l?l?l?l?l +?l?l?l?l?l?d?l +?d?d?d?d?u?d?d +?l?l?l?l?l?l?s +?s?s?s?d?d?d +?d?d?l?l?s +?s?l?l?d?d +?l?l?l?u?d?d +?u?l?l?l?d?d?d?d +?u?u?l?l?l?l +?l?l?d?d?d?d?s +?l?d?l?d?l?d?l +?s?s?l?l?l +?u?d?d?d?d?d?u +?l?l?l?d?u +?l?u?u?l +?u?l?u?u +?l?u?l?l +?l?l?u?l +?l?u?l?u +?d?d?d?u?u?u?u +?u?d?u?d?d?u +?l?l?d?d?s?d +?s?s?s?l +?l?l?l?d?s?d +?l?l?s?l?d?d +?d?d?d?l?l?s +?u?l?l?u?u +?l?l?l?l?d?d?l +?l?d?l?l?s +?l?d?d?l?l?d?d +?u?l?d?d?d?d?d?d +?l?l?l?d?d?d?s +?u?d?u?d?u?u +?u?u?u?d?u?d +?l?s?l?l?l?d +?l?d?d?d?s?d +?l?d?s?d?d?d +?d?d?u?u?u?d?d +?d?d?d?s?s?s +?u?u?u?s?s +?l?l?l?l?d?d?s +?l?s?l?s?d +?l?l?s?l?d +?d?d?d?l?l?l?d +?l?l?l?l?d?l?l +?s?d?s?d?d?d +?d?d?s?d?s +?u?l?l?l?s?d +?l?l?d?l?l?l?l +?l?l?d?l?l?d?d +?u?u?d?d?s +?l?d?s?l?d +?l?d?d?l?s +?d?s?l?l?l?l +?l?d?d?u?d?d +?u?l?d?d?l?l +?u?d?d?l?l?l +?l?d?l?l?u +?l?l?u?u?d +?u?u?u?l?d +?s?d?d?d?d?d?s +?u?l?l?l?u?d +?l?s?d?l?l +?u?s?u?u +?u?l?s?l +?l?u?s?l +?d?d?l?l?l?l?d?d +?l?s?d?d?d?d?d +?d?d?l?u?l +?d?d?l?l?u +?l?l?d?d?u +?u?l?d?u?d +?l?l?l?l?l?s?d +?d?d?d?d?d?s?l +?u?l?l?d?l?l +?l?d?l?l?l?d?d +?l?u?u?u?u?u +?u?u?u?l?l?l +?d?s?d?s?d?s +?d?l?d?d?l?d?d +?d?l?l?l?l?s +?u?l?u?u?u +?d?d?l?d?l?d?d +?l?d?d?d?d?d?s +?u?d?d?d?l?l +?d?d?d?l?d?d?d?d +?d?d?d?d?l?l?d?d +?u?l?d?l?l?l +?l?l?s?l?l?d +?l?d?s?l?l +?d?d?d?d?s?l?l +?l?l?l?l?d?l?d +?d?d?d?l?s?l +?d?d?l?l?l?s +?l?u?l?l?u +?l?d?l?l?l?l?l +?d?d?l?l?d?d?d?d +?d?d?d?d?l?d?d?d +?l?d?d?u?d +?d?d?d?u?d?u +?l?l?d?l?d?d?d +?u?d?l?d?u?d +?d?u?l?d?d +?d?u?d?d?l +?d?d?d?d?d?s?s +?l?l?l?l?l?d?d?d?d +?l?l?d?d?d?d?d?d?d +?u?u?l?l?l?d +?d?d?d?d?l?d?l +?l?u?l?l?d?d +?u?d?d?u?u?d +?l?d?d?d?d?l?d +?l?s?s?l?l +?d?u?l?l?l?d +?d?d?s?d?d?l +?s?l?l?l?d +?d?l?l?l?s +?u?d?d?u?d?u +?s?l?s?l +?l?s?l?l?s +?s?u?u?s +?s?l?l?s +?s?s?l?l +?l?u?u?u?u?d +?l?s?d?d?l +?d?l?d?l?s +?d?s?d?l?l +?s?l?l?d?d?d +?d?l?s?l?d +?l?l?d?d?s?s +?u?u?d?l?l +?l?u?l?u?d +?d?d?d?l?l?d?d?d +?l?l?u?u?d?d +?u?l?l?d?d?l +?d?d?d?d?d?d?l?d +?d?d?d?d?u?l?l +?l?l?l?d?l?d?d +?u?d?d?l?l?d +?l?d?d?d?l?d?d?d +?l?d?l?s?d?d +?u?u?u?d?d?s +?l?l?d?s?l +?l?d?d?l?d?l?d +?l?s?l?s?l?s +?u?l?u?l?l?l +?d?d?u?d?u?u +?u?d?l?l?l?d +?u?u?d?d?l?l +?s?l?l?l?l?d +?l?l?l?l?u?d +?l?d?l?d?d?l?d +?u?l?u?l?u?d +?s?d?d?l?d +?u?d?d?d?s +?d?d?d?l?s +?u?d?d?s?d +?l?d?s?d?d +?d?d?d?u?s +?d?s?d?l?d +?u?l?l?d?l?d +?d?l?d?l?u +?u?l?d?l?d?d +?u?d?d?l?u +?d?d?l?u?u +?l?d?u?l?d +?d?u?d?l?u +?u?d?l?d?u +?d?l?l?u?d +?l?d?u?d?l +?d?d?l?d?d?l?d +?s?d?d?l?l?l +?u?u?u?d?d?d?d?d +?d?d?l?l?l?l?d +?d?d?d?l?l?l?l?l +?u?u?d?u?d?u +?l?u?u?l?d +?l?l?u?l?u +?l?u?l?l?d +?u?u?l?u?u +?l?l?u?l?d +?d?d?u?l?l?d?d +?l?d?d?l?l?l?l +?d?d?l?d?d?d?d?d +?u?d?d?l?d?l +?l?l?l?s?l?d +?d?d?d?d?d?d?d?d?d?d?d +?u?u?d?d?d?s +?d?l?d?l?d?d?d +?l?s?s?d?d +?l?d?l?l?d?l?d +?u?l?d?l?l?d +?u?u?u?d?d?l +?l?l?u?l?d?d +?d?d?d?d?u?s +?d?l?d?s?d?d +?d?d?u?d?d?l +?d?d?l?u?d?d +?u?d?d?d?l?d +?u?s?u?u?d +?s?l?l?d?l +?u?l?s?d?d?d +?u?u?u?u?u?u?d?d +?l?u?u?l?l +?s?d?s?d?s?d +?l?l?d?d?l?l?d +?l?d?l?d?l?d?l?d +?d?d?l?d?d?d?l +?d?d?d?l?d?d?l +?l?l?l?l?u?u +?d?d?d?u?l?u +?u?u?d?d?d?l +?d?d?u?u?u?u?u +?l?l?s?s?s +?l?l?l?s?s?s +?l?l?d?d?d?d?l?l +?d?s?d?d?l?l +?u?d?l?d?l?l +?u?d?d?d?d?d?l +?u?s?u?l?l +?l?u?u?u?l +?u?u?l?l?u +?l?l?u?u?l +?d?d?d?d?d?u?d +?d?d?d?s?l?l?l +?u?u?u?l?d?d +?d?d?s?s?d +?s?d?d?s?d +?d?d?d?d?d?u?l +?d?d?u?u?d?u +?u?l?d?d?l?d +?d?u?l?l?d?d +?l?u?l?u?d?d +?l?d?d?s?l +?l?s?d?l?d +?s?d?l?l?d +?s?l?d?d?l +?l?d?l?s?d +?d?d?s?u?u +?u?d?l?s?d +?s?d?d?l?l +?u?l?l?l?l?l?d?d \ No newline at end of file diff --git a/masks/rockyou-2-1800.hcmask b/masks/rockyou-2-1800.hcmask new file mode 100644 index 0000000000..2bc5f3a713 --- /dev/null +++ b/masks/rockyou-2-1800.hcmask @@ -0,0 +1,2968 @@ +?d +?d?d +?l +?d?d?d?d +?d?d?d?d?d?d +?d?d?d?d?d +?l?l +?d?d?d +?u +?s +?l?l?l +?u?u +?l?d +?d?d?d?d?d?d?d +?u?d +?l?l?l?l +?l?l?d?d?d?d +?u?u?u +?l?l?d +?u?l +?l?d?d?d?d +?l?l?l?l?l +?l?l?l?d?d +?l?d?d +?d?d?d?d?l +?l?d?d?d?d?d +?l?l?d?d +?s?d +?l?l?l?d?d?d +?l?l?l?l?d?d +?s?s +?d?d?d?d?l?l +?l?l?d?d?d +?d?d?d?d?d?l +?d?d?d?d?d?d?d?d +?d?l +?u?l?l +?l?s +?l?l?l?l?d +?l?l?l?d +?l?d?d?d +?l?d?l +?l?d?d?d?d?d?d +?u?u?u?u +?l?l?l?l?l?l +?d?d?d?l +?u?u?d +?d?d?d?d?d?d?l +?s?d?d +?u?d?d?d?d +?u?u?u?u?u +?d?l?l +?d?d?d?l?l +?u?u?d?d?d?d +?d?d?d?d?s +?d?d?d?d?u +?l?l?l?d?d?d?d +?l?l?l?l?l?d +?u?l?l?l +?u?u?u?d?d +?d?s?d +?l?s?l +?l?d?d?d?d?l +?d?d?s?d?d +?u?d?d +?d?d?l +?d?d?d?l?l?l +?u?d?d?d?d?d +?d?d?l?d?d +?d?d?s +?d?d?l?l?l +?d?d?l?l +?u?u?u?u?d?d +?l?l?d?d?d?d?d +?l?d?d?l?d?d +?u?l?l?l?l +?u?u?d?d?d +?d?d?l?l?d?d +?u?d?u +?u?u?u?d?d?d +?d?d?d?d?d?u +?u?u?d?d +?u?u?u?u?d +?l?d?l?d +?u?d?d?d +?d?d?u +?d?d?d?d?u?u +?d?l?l?l +?l?s?d +?l?d?d?d?l +?l?d?d?l +?s?d?d?d?d +?d?l?l?l?l +?l?l?s +?d?d?d?d?l?d +?d?d?d?d?d?d?d?d?d +?d?d?l?l?l?l +?l?l?d?l +?d?d?d?l?d +?l?d?l?l +?d?d?d?s +?l?d?l?d?d +?d?d?l?d?d?d +?l?l?l?l?l?d?d +?u?d?d?d?d?d?d +?l?l?l?l?d?d?d +?l?d?l?d?l?d +?s?s?s +?d?d?d?l?d?d +?d?s?d?d +?d?l?d?d?d +?u?u?u?d +?d?l?d?d?d?d +?l?l?l?d?l +?d?l?l?d +?d?l?d?d +?d?d?l?d +?u?l?l?l?d?d +?d?d?d?s?d +?d?d?d?d?d?s +?l?d?l?d?l +?u?l?l?d?d +?u?u?l +?l?d?d?l?d +?u?u?u?u?u?u +?l?l?d?l?l +?d?d?d?d?d?d?u +?l?d?l?l?l +?l?l?d?d?l +?u?d?l +?d?u?u +?d?l?l?l?d +?l?d?l?d?d?d +?d?s?d?d?d +?u?l?d?d?d?d +?u?s?u +?l?d?l?l?d +?d?d?d?d?l?l?l +?d?d?d?u?u +?l?l?d?d?l?l +?d?l?l?l?l?l +?u?l?l?l?d +?d?d?l?d?d?l +?s?d?l +?l?d?d?d?d?d?d?d +?l?u?u +?l?d?d?l?l +?l?l?l?l?s +?d?l?l?d?d +?d?d?l?l?d +?u?u?u?u?u?d +?l?s?d?d +?d?d?d?d?d?l?l +?d?d?s?d?d?d +?d?l?d?l?d +?l?l?d?l?d +?u?l?l?d?d?d +?s?d?s +?s?s?d +?d?l?l?l?d?d +?s?l?l +?u?u?s +?d?d?d?s?d?d +?d?l?l?l?l?d +?l?l?l?s +?l?l?d?d?d?l +?d?d?d?d?d?d?d?l +?s?d?d?d?d?d +?l?l?l?d?d?l +?d?d?d?d?s?d +?l?l?s?d?d +?l?l?l?l?l?l?l +?l?l?d?d?d?d?d?d +?d?d?d?l?l?d +?u?d?d?d?d?u +?l?l?l?l?d?l +?l?d?d?d?l?l +?d?l?d?l?d?l +?d?l?l?d?d?d +?u?l?l?l?l?l +?u?l?l?d +?l?l?l?l?l?l?d +?d?d?d?u?u?u +?u?u?u?d?d?d?d +?l?d?l?l?d?d +?l?l?l?s?d?d +?d?d?s?d +?d?l?d?l +?u?l?l?l?l?d +?u?l?d?d?d +?u?l?u +?l?u?l +?l?l?u +?d?d?l?d?l +?l?d?d?l?l?l +?l?l?d?l?l?d +?d?d?u?d?d +?d?d?d?d?d?d?s +?l?l?l?d?l?l +?l?l?l?l?d?d?d?d +?l?d?d?d?l?d +?d?d?u?u?u +?l?l?d?l?l?l +?l?d?l?l?l?l +?l?l?s?d +?d?l?d?d?l +?d?d?d?d?d?d?d?d?d?d +?d?d?l?l?l?d +?u?l?s +?d?l?d?l?l +?l?l?d?l?d?d +?l?d?l?l?d?l +?l?l?l?s?d +?d?s?d?s?d?d +?d?d?l?l?l?d?d +?u?d?d?u?d?d +?d?l?l?d?l +?s?d?d?d?d?s +?d?s?d?d?d?d +?d?u?u?u +?s?d?d?d?s +?d?d?d?u +?d?d?d?d?s?s +?d?l?d?l?d?d +?l?l?l?d?l?d +?u?u?d?d?d?d?d +?d?l?d?d?l?d +?d?u?u?u?u +?l?l?d?d?l?d +?d?d?d?d?d?d?l?l +?l?l?s?l?l +?u?l?u?l +?l?l?l?l?l?s +?l?d?l?l?l?d +?u?d?u?d?d +?s?d?d?d +?l?s?l?l?l +?u?d?d?d?u +?l?d?d?l?l?d +?l?l?l?l?u +?d?d?l?d?l?d +?u?d?u?u +?l?s?d?d?d?d +?l?d?d?l?d?l +?l?l?l?s?l +?d?d?d?l?d?d?d +?l?d?l?d?d?l +?l?l?s?l +?d?d?u?u?d?d +?d?d?d?d?u?d +?l?d?l?d?l?l +?d?s?d?s?d +?d?l?d?d?d?l +?u?u?l?l +?d?d?l?d?d?d?d +?d?d?d?l?l?l?l +?d?d?d?l?d?l +?l?s?l?l +?u?l?l?l?u +?l?l?l?l?s?d +?d?d?u?u?u?u +?d?d?d?d?l?d?d +?d?d?d?s?s +?u?s?d?d +?u?l?l?d?d?d?d +?d?d?d?s?d?d?d +?u?u?u?u?u?d?d +?l?l?s?d?d?d +?l?l?l?d?d?d?d?d +?s?s?d?d?d +?l?d?d?d?d?d?l +?d?d?d?u?d?d +?l?s?l?d?d +?u?u?u?d?u +?l?l?d?l?d?l +?d?d?u?d?d?d +?u?d?d?u?d +?d?d?d?d?s?d?d +?l?s?d?d?d +?d?d?d?d?u?l +?u?l?u?l?u +?u?u?u?u?d?d?d +?u?d?u?d?u +?l?u?u?u?u +?u?l?l?u +?u?d?u?d?u?d +?d?u?l?l +?u?u?d?u +?l?d?d?d?d?s +?u?d?d?d?d?l +?d?d?l?l?d?l +?d?u?d?d?d +?d?d?d?u?d +?u?l?u?d?d +?u?l?l?l?l?d?d +?u?d?d?u +?d?d?u?u +?l?d?u?d +?u?d?u?d +?u?l?d?d +?d?d?d?d?s?l +?u?u?d?d?u +?d?d?l?d?l?l +?l?s?l?s?l +?d?l?l?d?l?l +?d?u?d?d?d?d +?l?l?l?d?d?s +?u?u?l?l?l +?l?l?l?l?l?l?d?d +?l?s?l?s +?u?d?u?u?u +?s?l?l?l?l +?d?d?s?d?d?d?d +?d?l?l?d?l?d +?d?d?l?l?l?l?l +?d?l?l?d?d?l +?d?u?u?u?u?u +?u?d?u?u?d +?u?d?u?d?d?d +?d?l?d?d?l?l +?l?l?l?l?l?d?d?d +?d?l?l?l?d?l +?s?d?d?d?d?d?d +?d?l?d?l?l?d +?u?u?d?u?u +?u?l?u?d?d?d +?s?l?l?l +?d?u?d?u?d +?u?d?d?d?l +?s?s?s?s +?l?l?d?d?s +?d?s?d?l +?d?d?s?l +?s?l?d?d +?d?l?d?l?l?l +?u?u?u?u?s +?d?u?l?u +?u?d?d?d?d?d?d?d +?l?s?l?d?d?d +?l?u?u?u +?u?u?u?l +?d?d?l?l?d?d?d +?l?l?l?s?s +?u?d?d?l?d +?l?u?d?d?d +?d?d?u?u?d +?l?u?d?d?d?d +?d?d?d?d?d?l?d +?d?u?u?u?d +?s?s?d?d?d?d +?d?d?d?s?l +?d?d?d?d?l?s +?s?s?d?d +?u?l?u?l?d?d +?l?s?l?d +?l?l?l?u +?d?s?d?d?s?d?d +?d?d?s?d?d?s +?u?l?l?l?d?d?d +?u?u?u?s +?d?d?u?d?d?u +?u?d?d?u?u +?l?d?l?d?d?d?d +?d?l?d?d?d?d?d +?d?d?d?d?u?u?u +?u?s?d?d?d?d +?l?l?u?d?d +?u?u?d?u?d +?u?l?l?l?s +?d?d?s?d?s?d?d +?d?d?d?d?d?d?d?u +?d?d?d?d?d?s?d +?u?u?s?d?d +?d?d?d?d?d?u?u +?u?d?l?l?l +?u?u?d?d?u?u +?u?d?l?l?d +?d?d?u?d?u +?u?d?l?d?d +?d?l?l?l?l?l?l +?d?d?d?l?l?d?d +?s?l?l?l?s +?u?u?l?d?d +?d?d?u?l?l +?l?l?u?l?l +?l?s?l?l?l?l +?u?l?d?d?d?d?d +?l?l?d?d?d?s +?u?u?l?d?d?d +?l?d?d?d?d?d?d?l +?l?l?l?l?s?d?d +?l?u?u?d?d?d +?u?l?u?l?l +?l?l?d?d?d?l?l +?l?d?d?d?d?d?d?d?d +?u?u?u?u?u?u?d +?l?l?l?l?s?l +?d?d?d?d?l?l?d +?u?u?u?s?d?d +?l?l?d?d?d?d?l +?d?d?d?d?l?l?l?l +?d?u?u?u?u?d +?l?l?s?l?l?l +?l?l?u?d?d?d +?d?d?d?u?l +?u?l?u?l?d +?u?u?u?u?l +?l?d?d?d?s +?l?u?l?d?d?d +?l?l?l?l?d?s +?u?d?l?l +?d?u?d?u?d?u +?l?u?l?d?d +?d?u?u?d?u +?u?l?d?l +?u?u?d?l +?d?d?s?s?d?d +?l?l?s?d?d?d?d +?u?l?l?u?l +?d?d?s?l?l +?s?d?l?l?l +?l?u?l?l?l +?l?d?d?d?d?l?l +?u?u?d?d?d?d?d?d +?u?l?l?l?l?u +?d?u?u?u?d?d +?u?l?d?d?l +?u?l?d?l?d +?u?u?l?l?d?d +?l?d?l?d?l?d?d +?l?l?l?l?s?s +?u?u?u?u?u?u?u +?l?l?l?d?s +?l?l?l?s?l?l +?d?u?u?d?d?d +?u?u?u?u?d?u +?d?u?l?l?l +?u?d?d?l?d?d +?d?d?d?u?u?d +?l?d?d?d?l?l?l +?d?d?u?l?l?l +?l?l?l?u?u +?u?u?d?d?d?u +?d?d?d?u?l?l +?u?d?l?d?l +?l?u?l?u?l +?d?l?s?l +?s?l?l?d +?u?u?u?s?d +?d?s?l?l +?l?s?d?l +?l?l?d?s?d +?u?u?s?d +?u?s?d?u +?l?d?d?l?d?d?d +?d?u?u?d?d +?d?u?d?d?u +?d?d?d?d?d?d?d?d?l +?l?l?u?u +?u?l?l?d?l +?u?u?u?l?l +?s?l?l?l?l?l +?l?d?d?s?d?d +?l?l?l?s?d?d?d +?l?l?u?u?u +?d?d?s?d?d?s?d?d +?d?l?l?l?d?d?d +?u?u?s?u?u +?u?u?u?d?d?u +?d?d?d?d?d?l?l?l +?d?d?d?s?l?l +?u?s?u?s +?u?s?u?d?d +?u?l?s?d?d +?u?l?l?u?d?d +?u?d?d?l?l +?d?u?l?l?d +?d?u?d?u?u +?u?s?u?u?u +?u?l?d?l?l +?u?d?d?d?u?u +?u?l?l?l?l?l?d +?u?d?u?u?d?d +?s?l?l?l?l?s +?l?l?l?d?l?l?l +?u?d?d?d?d?s +?d?l?l?d?d?d?d +?d?l?l?l?l?l?d +?l?l?s?s?l +?l?d?d?d?l?d?d +?s?d?l?l?l?l +?l?s?l?l?d +?u?d?d?u?u?u +?l?d?l?d?s +?u?u?u?s?u +?d?d?d?d?l?u +?l?d?s?s +?l?d?d?s?d +?s?l?d?d?d +?s?d?d?d?l +?u?s?d?d?d +?d?s?d?d?l +?u?d?u?u?u?u +?u?l?l?s +?u?u?s?u +?d?l?d?l?d?l?d +?u?l?d?d?u +?d?l?l?l?l?d?d +?l?l?l?u?l +?l?l?l?d?d?d?l +?u?s?u?s?u +?d?d?d?d?d?d?d?s +?d?s?d?d?d?d?d +?u?u?s?d?d?d +?u?u?u?d?u?u +?l?l?d?d?l?l?l +?l?l?l?l?l?l?l?l +?l?u?u?u?d +?u?u?l?l?d +?u?l?l?u?d +?d?u?d?d?u?d +?d?u?l?l?l?l +?l?l?l?l?l?u +?u?u?d?u?u?u +?u?u?d?u?u?d +?u?l?l?u?l?l +?u?d?u?u?d?u +?s?s?s?d?d +?d?d?d?l?u +?d?d?u?l?d?d +?d?d?l?d?u +?d?d?d?s?d?d?d?d +?u?l?u?d?d?d?d +?u?u?u?u?u?s +?d?s?l?l?l +?l?s?l?l?d?d +?s?l?d?d?d?d +?u?l?l?l?l?s +?u?s?l?l?l +?d?d?s?d?s?d +?l?u?u?d?d +?l?d?d?l?d?d?l +?s?d?d?d?d?l +?u?d?l?d?l?d +?d?d?s?l?l?l +?s?l?l?l?d?d +?s?d?s?d?d +?d?s?s?d?d +?d?s?d?d?s?d +?d?s?d?d?s +?u?l?u?l?u?l +?u?d?l?l?d?d +?l?s?s?l +?u?u?s?s +?l?l?s?s +?u?d?l?l?l?l +?u?l?l?l?d?l +?d?d?u?d?d?d?d +?l?u?u?u?d?d +?u?l?l?s?d?d +?u?u?d?d?u?d +?d?d?u?u?u?d +?u?u?u?u?d?d?d?d +?l?d?d?d?d?u +?l?l?l?d?d?l?l +?l?l?l?u?d +?l?s?l?d?d?d?d +?u?u?d?u?d?d +?d?d?d?u?d?d?d +?u?u?u?u?s?d +?u?l?l?s?d +?l?s?l?d?l +?l?l?l?d?d?d?d?d?d +?u?l?u?u?l +?u?d?d?d?u?d +?d?u?d?u?d?d +?l?s?l?s?d?d +?s?d?d?s?d?d +?d?d?d?d?d?d?u?u +?u?d?l?l?d?l +?d?d?d?d?s?u +?l?l?d?d?l?d?d +?l?l?d?l?s +?l?d?l?l?d?d?d +?s?s?s?s?s +?u?d?l?d?d?d +?d?d?u?d?u?d +?l?l?l?l?l?l?l?d +?d?l?d?s?d +?d?d?s?d?l +?d?d?d?s?u +?u?d?u?u?u?d +?l?l?d?s?d?d +?u?s?u?d?d?d +?u?l?l?l?l?l?l +?l?l?l?l?l?d?l +?d?d?d?d?u?d?d +?l?l?l?l?l?l?s +?s?s?s?d?d?d +?d?d?l?l?s +?s?l?l?d?d +?l?l?l?u?d?d +?u?l?l?l?d?d?d?d +?u?u?l?l?l?l +?l?l?d?d?d?d?s +?l?d?l?d?l?d?l +?s?s?l?l?l +?u?d?d?d?d?d?u +?l?l?l?d?u +?l?u?u?l +?u?l?u?u +?l?u?l?l +?l?l?u?l +?l?u?l?u +?d?d?d?u?u?u?u +?u?d?u?d?d?u +?l?l?d?d?s?d +?s?s?s?l +?l?l?l?d?s?d +?l?l?s?l?d?d +?d?d?d?l?l?s +?u?l?l?u?u +?l?l?l?l?d?d?l +?l?d?l?l?s +?l?d?d?l?l?d?d +?u?l?d?d?d?d?d?d +?l?l?l?d?d?d?s +?u?d?u?d?u?u +?u?u?u?d?u?d +?l?s?l?l?l?d +?l?d?d?d?s?d +?l?d?s?d?d?d +?d?d?u?u?u?d?d +?d?d?d?s?s?s +?u?u?u?s?s +?l?l?l?l?d?d?s +?l?s?l?s?d +?l?l?s?l?d +?d?d?d?l?l?l?d +?l?l?l?l?d?l?l +?s?d?s?d?d?d +?d?d?s?d?s +?u?l?l?l?s?d +?l?l?d?l?l?l?l +?l?l?d?l?l?d?d +?u?u?d?d?s +?l?d?s?l?d +?l?d?d?l?s +?d?s?l?l?l?l +?l?d?d?u?d?d +?u?l?d?d?l?l +?u?d?d?l?l?l +?l?d?l?l?u +?l?l?u?u?d +?u?u?u?l?d +?s?d?d?d?d?d?s +?u?l?l?l?u?d +?l?s?d?l?l +?u?s?u?u +?u?l?s?l +?l?u?s?l +?d?d?l?l?l?l?d?d +?l?s?d?d?d?d?d +?d?d?l?u?l +?d?d?l?l?u +?l?l?d?d?u +?u?l?d?u?d +?l?l?l?l?l?s?d +?d?d?d?d?d?s?l +?u?l?l?d?l?l +?l?d?l?l?l?d?d +?l?u?u?u?u?u +?u?u?u?l?l?l +?d?s?d?s?d?s +?d?l?d?d?l?d?d +?d?l?l?l?l?s +?u?l?u?u?u +?d?d?l?d?l?d?d +?l?d?d?d?d?d?s +?u?d?d?d?l?l +?d?d?d?l?d?d?d?d +?d?d?d?d?l?l?d?d +?u?l?d?l?l?l +?l?l?s?l?l?d +?l?d?s?l?l +?d?d?d?d?s?l?l +?l?l?l?l?d?l?d +?d?d?d?l?s?l +?d?d?l?l?l?s +?l?u?l?l?u +?l?d?l?l?l?l?l +?d?d?l?l?d?d?d?d +?d?d?d?d?l?d?d?d +?l?d?d?u?d +?d?d?d?u?d?u +?l?l?d?l?d?d?d +?u?d?l?d?u?d +?d?u?l?d?d +?d?u?d?d?l +?d?d?d?d?d?s?s +?l?l?l?l?l?d?d?d?d +?l?l?d?d?d?d?d?d?d +?u?u?l?l?l?d +?d?d?d?d?l?d?l +?l?u?l?l?d?d +?u?d?d?u?u?d +?l?d?d?d?d?l?d +?l?s?s?l?l +?d?u?l?l?l?d +?d?d?s?d?d?l +?s?l?l?l?d +?d?l?l?l?s +?u?d?d?u?d?u +?s?l?s?l +?l?s?l?l?s +?s?u?u?s +?s?l?l?s +?s?s?l?l +?l?u?u?u?u?d +?l?s?d?d?l +?d?l?d?l?s +?d?s?d?l?l +?s?l?l?d?d?d +?d?l?s?l?d +?l?l?d?d?s?s +?u?u?d?l?l +?l?u?l?u?d +?d?d?d?l?l?d?d?d +?l?l?u?u?d?d +?u?l?l?d?d?l +?d?d?d?d?d?d?l?d +?d?d?d?d?u?l?l +?l?l?l?d?l?d?d +?u?d?d?l?l?d +?l?d?d?d?l?d?d?d +?l?d?l?s?d?d +?u?u?u?d?d?s +?l?l?d?s?l +?l?d?d?l?d?l?d +?l?s?l?s?l?s +?u?l?u?l?l?l +?d?d?u?d?u?u +?u?d?l?l?l?d +?u?u?d?d?l?l +?s?l?l?l?l?d +?l?l?l?l?u?d +?l?d?l?d?d?l?d +?u?l?u?l?u?d +?s?d?d?l?d +?u?d?d?d?s +?d?d?d?l?s +?u?d?d?s?d +?l?d?s?d?d +?d?d?d?u?s +?d?s?d?l?d +?u?l?l?d?l?d +?d?l?d?l?u +?u?l?d?l?d?d +?u?d?d?l?u +?d?d?l?u?u +?l?d?u?l?d +?d?u?d?l?u +?u?d?l?d?u +?d?l?l?u?d +?l?d?u?d?l +?d?d?l?d?d?l?d +?s?d?d?l?l?l +?u?u?u?d?d?d?d?d +?d?d?l?l?l?l?d +?d?d?d?l?l?l?l?l +?u?u?d?u?d?u +?l?u?u?l?d +?l?l?u?l?u +?l?u?l?l?d +?u?u?l?u?u +?l?l?u?l?d +?d?d?u?l?l?d?d +?l?d?d?l?l?l?l +?d?d?l?d?d?d?d?d +?u?d?d?l?d?l +?l?l?l?s?l?d +?d?d?d?d?d?d?d?d?d?d?d +?u?u?d?d?d?s +?d?l?d?l?d?d?d +?l?s?s?d?d +?l?d?l?l?d?l?d +?u?l?d?l?l?d +?u?u?u?d?d?l +?l?l?u?l?d?d +?d?d?d?d?u?s +?d?l?d?s?d?d +?d?d?u?d?d?l +?d?d?l?u?d?d +?u?d?d?d?l?d +?u?s?u?u?d +?s?l?l?d?l +?u?l?s?d?d?d +?u?u?u?u?u?u?d?d +?l?u?u?l?l +?s?d?s?d?s?d +?l?l?d?d?l?l?d +?l?d?l?d?l?d?l?d +?d?d?l?d?d?d?l +?d?d?d?l?d?d?l +?l?l?l?l?u?u +?d?d?d?u?l?u +?u?u?d?d?d?l +?d?d?u?u?u?u?u +?l?l?s?s?s +?l?l?l?s?s?s +?l?l?d?d?d?d?l?l +?d?s?d?d?l?l +?u?d?l?d?l?l +?u?d?d?d?d?d?l +?u?s?u?l?l +?l?u?u?u?l +?u?u?l?l?u +?l?l?u?u?l +?d?d?d?d?d?u?d +?d?d?d?s?l?l?l +?u?u?u?l?d?d +?d?d?s?s?d +?s?d?d?s?d +?d?d?d?d?d?u?l +?d?d?u?u?d?u +?u?l?d?d?l?d +?d?u?l?l?d?d +?l?u?l?u?d?d +?l?d?d?s?l +?l?s?d?l?d +?s?d?l?l?d +?s?l?d?d?l +?l?d?l?s?d +?d?d?s?u?u +?u?d?l?s?d +?s?d?d?l?l +?u?l?l?l?l?l?d?d +?d?d?d?d?d?d?d?l?l +?d?u?d?d?d?u +?d?u?l?d?d?d +?l?s?d?l?l?l +?l?l?d?d?l?l?d?d +?d?l?l?l?u +?u?l?u?u?d +?d?u?l?u?l +?u?l?u?u?d?d +?u?l?d?l?u +?u?l?d?u?l +?u?d?u?l?l +?l?d?l?u?l +?s?d?d?d?d?d?d?d +?l?d?l?d?l?s +?u?l?l?s?l +?u?l?l?s?u +?d?u?u?d?d?u +?d?u?u?u?d?u +?d?u?u?d?u?u +?l?d?l?d?s?d +?l?l?l?s?l?l?l +?d?d?d?d?l?l?s +?u?u?u?l?u +?s?u?u?u?s +?d?d?s?s?s +?s?s?d?d?s +?l?d?l?d?l?l?d +?u?d?d?s?d?d +?d?d?d?d?d?d?s?d +?l?l?s?s?d +?l?d?d?d?d?d?d?d?l +?u?l?u?l?d?d?d +?u?l?d?d?d?l +?l?l?l?u?u?u +?l?l?d?d?d?l?d +?u?l?d?d?u?l +?u?l?l?d?d?s +?u?u?u?u?u?d?d?d +?d?d?d?d?d?d?l?l?l +?u?s?u?s?d?d +?d?l?d?d?d?d?d?d +?l?u?l?d?d?d?d +?l?d?l?l?l?s +?d?u?d?l?d?d +?d?d?d?l?l?u +?u?d?u?d?d?d?d +?d?d?d?d?d?l?s +?u?d?d?d?d?d?d?d?d +?d?u?d?d?d?d?d +?d?u?u?u?u?u?u +?u?l?u?l?l?d +?u?s?u?u?u?u +?l?d?d?s?s +?s?l?d?d?s +?l?d?s?s?d +?d?l?d?s?s +?s?u?d?d?d?d +?d?d?s?l?d?d +?s?l?l?d?d?s +?l?l?l?d?l?l?d +?l?d?d?l?d?d?d?d +?l?l?s?d?l +?u?l?l?d?s +?u?s?l?d?l +?d?d?l?d?d?l?d?d +?u?d?l?d?d?l +?d?u?d?u?u?d +?u?l?l?l?u?l +?u?l?l?s?s +?u?l?l?l?l?d?d?d +?l?l?l?d?d?u +?d?d?d?d?d?l?d?d +?s?s?s?s?d +?l?u?l?u?u +?l?d?l?d?l?l?l +?d?d?d?d?s?d?d?d +?d?d?l?d?d?l?l +?l?l?s?s?d?d +?s?u?u?u?u +?u?l?s?u?l +?u?l?u?l?s +?l?d?l?l?l?l?d +?l?u?l?d?l +?l?u?d?l?l +?l?d?u?u?u +?u?l?u?d?l +?u?l?l?d?u +?l?d?l?u?u +?l?l?d?d?s?d?d +?d?d?l?l?l?l?l?l +?l?l?d?l?l?s +?d?d?d?s?s?d +?d?s?d?d?d?s +?l?l?l?s?d?d?d?d +?d?d?s?d?l?l +?l?d?d?d?l?s +?l?d?l?d?d?s +?d?d?d?u?u?l +?l?d?l?l?d?l?l +?l?l?d?l?l?l?d +?u?d?l?l?d?u +?u?l?d?l?d?l +?u?u?s?d?d?d?d +?l?l?u?l?l?l +?u?l?l?d?d?d?d?d +?u?d?d?d?d?u?u +?d?l?d?l?d?d?l +?d?d?l?d?d?u +?d?d?l?l?d?d?l +?d?l?u?d?d?d +?l?d?l?d?d?d?d?d +?d?d?d?s?d?l +?u?l?d?d?d?s +?d?d?d?s?u?u +?l?l?l?u?l?l +?l?l?l?d?d?l?d +?u?l?l?l?d?s +?d?l?l?l?d?d?d?d +?u?u?d?d?l +?d?l?l?d?u +?l?d?d?u?l +?l?d?d?u?u +?d?u?u?d?u?d +?l?u?d?l?d +?u?d?u?d?l +?d?l?u?l?d +?l?d?l?d?u +?u?d?d?u?l +?l?d?u?u?d +?d?u?d?u?l +?d?u?u?d?l +?d?l?u?u?d +?d?d?u?u?l +?u?d?u?l?d +?d?u?l?u?d +?u?u?d?l?d +?l?d?l?u?d +?d?u?d?l?l +?l?d?u?d?u +?u?d?l?u?d +?s?d?d?d?d?d?d?s +?l?u?l?l?l?l +?u?s?l?l?l?l +?u?u?u?u?s?u +?u?u?u?u?s?s +?s?d?s?d?s +?d?s?d?s?s +?l?l?d?l?l?d?l +?u?l?d?u?l?d +?l?d?l?l?l?d?l +?u?l?l?l?u?u +?s?l?d?l?s +?u?s?u?s?d +?l?d?l?s?s +?d?d?l?l?s?d +?u?d?d?d?d?d?d?u +?u?u?s?u?u?u +?l?s?l?l?d?l +?d?d?d?d?d?d?u?l +?l?l?d?d?u?u +?u?l?l?d?d?u +?u?s?u?d?d?d?d +?d?d?d?d?d?d?s?l +?s?d?u?u?u +?u?u?u?d?s +?u?u?s?u?d +?d?l?s?l?l +?l?l?l?d?l?s +?d?d?d?u?l?l?l +?l?l?d?d?d?u +?d?u?d?d?u?u +?l?l?l?l?l?d?s +?u?l?d?d?l?u +?d?d?d?d?d?d?s?s +?l?u?l?u?l?u +?l?l?l?l?d?d?d?d?d +?l?d?d?d?l?l?d +?d?d?d?l?d?l?d +?d?d?u?u?d?d?d +?d?d?d?l?l?l?s +?l?d?l?l?d?d?l +?s?d?u?u?u?u +?l?l?d?l?d?l?d +?d?l?d?l?l?d?d +?u?u?d?l?l?l +?l?l?s?l?s +?l?l?d?d?l?d?l +?u?d?s?d?d?d +?d?d?s?d?l?d +?s?d?d?d?d?u +?d?d?l?d?d?s +?s?d?l?d?d?d +?d?d?l?s?d?d +?l?d?d?l?l?l?d +?l?d?l?l?d?s +?u?l?s?l?l +?d?d?d?s?d?s +?s?d?d?d?s?d +?d?s?s?d?d?d +?l?u?d?d?d?d?d +?s?s?l?l?l?l +?l?d?u?d?l?d +?u?u?l?d?d?d?d +?u?d?d?u?s +?l?d?d?s?u +?s?d?u?u?d +?d?l?l?d?s +?l?u?s?d?d +?s?l?d?l?d +?d?d?u?s?u +?d?d?u?l?s +?l?d?l?s?l?d +?d?s?l?d?l +?u?d?u?d?s +?l?s?d?d?d?l +?u?d?l?d?s +?d?d?l?s?l +?d?l?d?d?d?l?d +?d?d?d?u?u?d?d +?d?d?d?u?l?d +?d?d?d?l?d?d?d?l +?d?l?d?u?d?d +?d?l?d?d?d?d?l +?d?d?l?d?u?d +?d?d?d?d?d?s?d?d +?l?l?u?d?d?d?d +?d?d?u?u?l?l +?u?d?u?u?l +?l?d?u?l?l +?u?u?l?d?u +?u?u?l?d?l +?l?l?u?d?l +?d?u?l?l?u +?u?u?u?d?l +?u?u?d?u?l +?u?l?d?u?u +?u?d?l?u?d?l +?u?u?l?u?d +?l?u?d?u?u +?l?l?d?u?l +?s?s?s?s?s?s +?d?d?d?d?l?s?l +?l?l?d?d?l?s +?l?l?l?l?l?l?d?d?d +?d?d?s?d?d?d?d?d +?l?s?d?s?d?d +?u?u?u?u?s?d?d +?d?d?s?d?d?s?d +?l?l?u?u?u?u +?u?d?d?d?d?d?d?l +?d?d?d?l?l?l?d?d +?d?d?l?l?l?u +?l?u?u?l?d?d +?l?u?u?d?d?d?d +?u?l?l?u?l?d +?s?l?l?d?d?d?d +?l?s?s?s?l +?s?s?s?l?l +?d?d?u?l?l?l?l +?l?l?l?s?d?l +?l?l?d?d?s?d?l +?l?d?l?d?d?d?l +?d?d?d?d?d?d?d?d?u +?s?l?l?d?s +?s?u?u?u?u?s +?l?l?l?l?u?l +?u?u?u?u?l?l +?l?l?l?l?d?u +?l?d?d?d?s?l +?s?d?d?d?l?l +?d?l?l?s?d?d +?l?d?d?l?d?s +?u?l?d?d?d?u +?l?d?l?u?d?d +?d?d?d?l?u?l +?d?d?d?l?u?u +?l?l?l?s?u +?d?d?u?l?u?l +?u?d?d?u?l?l +?l?l?s?s?l?l +?l?l?l?d?l?d?l +?u?u?u?s?u?u +?u?u?d?d?d?d?u +?l?d?d?s?d?d?d +?l?l?l?s?s?d +?u?u?l?l?d?d?d +?d?l?l?l?l?d?l +?s?s?d?d?s?s +?u?l?u?l?u?d?d +?u?u?d?d?d?u?u +?l?d?d?l?l?d?l +?u?u?u?u?u?l +?d?u?d?u?u?u +?l?s?l?s?l?d +?d?d?d?l?d?l?l +?d?d?d?d?s?s?s +?u?u?s?s?u +?s?l?s?l?l +?d?l?l?d?l?l?d +?l?d?d?d?l?d?l +?u?l?l?l?s?d?d +?l?s?l?l?l?d?d +?u?l?s?d?d?d?d +?d?s?d?l?l?l +?l?s?l?d?l?d +?u?u?u?l?l?d +?l?d?d?l?d?l?l +?u?s?l?d?d?d +?l?d?s?l?d?d +?s?s?d?d?d?d?d +?l?l?d?l?d?l?l +?d?d?d?d?d?d?d?d?s +?l?d?l?d?d?l?d?d +?d?s?d?s?d?d?d?d +?u?d?l?d?d?d?d +?u?u?u?s?d?d?d +?s?d?l?d?s +?d?s?l?d?s +?s?d?d?s?l +?s?l?s?d?d +?l?s?d?s?d +?d?d?s?s?u +?l?s?d?d?d?s +?d?d?s?l?s +?d?d?d?d?u?l?u +?l?l?s?l?l?l?l +?l?l?s?l?l?s +?u?u?u?u?d?s +?d?s?d?l?d?d +?d?l?d?d?d?s +?d?d?d?l?s?d +?d?l?s?d?d?d +?d?d?s?d?d?u +?d?d?u?s?d?d +?d?d?d?s?l?d +?d?s?d?s?d?s?d +?d?d?l?u?l?d?d +?d?d?l?d?l?d?l +?l?l?l?d?d?l?l?l +?u?l?l?l?d?u +?l?u?l?l?l?d +?d?l?u?l?s +?d?l?l?s?l +?u?s?d?u?u +?u?u?d?u?s +?l?d?l?s?l +?l?d?d?d?d?l?d?d +?l?l?l?l?l?s?l +?d?u?l?u?d?d +?l?l?d?u?d?d +?d?u?d?l?d?l +?d?d?u?l?d?l +?u?d?u?l?d?d +?u?d?d?d?l?u +?u?d?d?l?d?u +?l?d?u?l?d?d +?l?l?l?l?l?l?l?d?d +?d?u?u?d?d?d?d +?u?d?d?u?d?d?d +?u?u?l?l?l?d?d +?l?l?u?l?l?d +?l?u?u?l?u +?u?u?l?u?l +?d?d?s?l?l?l?l +?l?s?u?u?u +?l?l?s?d?l?l +?s?u?l?l?l +?s?l?s?l?s +?d?u?l?u?l?d +?d?l?l?l?s?d +?u?l?l?l?u?d?d +?d?d?d?d?u?u?d +?d?s?d?d?d?d?d?d +?d?l?d?l?l?l?l +?d?d?l?l?l?d?d?d +?l?l?s?l?l?d?d +?l?l?l?d?d?d?d?l +?l?d?d?s?l?d?d +?s?l?d?d?d?s +?d?l?d?l?d?l?l +?l?s?d?d?d?d?d?d +?l?d?d?d?d?d?d?s +?u?l?l?l?s?s +?d?d?d?d?u?u?u?u +?l?s?d?l?d?d +?s?d?l?l?d?d +?s?l?l?s?l +?s?u?l?l?s +?d?l?d?d?l?l?d +?l?l?s?d?d?s +?d?d?d?d?d?l?l?d +?l?l?l?u?l?d +?u?d?d?d?u?d?d +?u?s?u?u?d?d +?d?l?d?d?l?d?l +?l?l?l?l?d?s?d +?u?u?l?u?d?d +?l?d?s?l?l?l +?d?d?d?d?s?d?d?d?d +?u?s?d?d?d?d?d +?d?l?l?l?l?u +?d?l?l?l?d?l?l +?l?l?l?u?u?d +?l?l?l?l?l?s?d?d +?u?s?u?s?u?s +?d?l?l?d?l?d?d +?d?d?d?l?u?d +?d?u?d?d?l?d +?l?l?l?s?s?l +?l?s?l?d?d?l +?d?d?s?u?u?u +?u?s?l?l?d?d +?d?l?l?l?d?s +?u?u?s?u?d?d +?s?l?l?l?l?d?d +?l?d?l?d?d?l?l +?d?l?l?d?d?l?d +?d?d?s?d?d?l?l +?l?s?l?l?s?l +?l?l?u?u?l?l +?d?u?u?u?d?d?d +?u?u?d?l?l?d +?l?d?l?l?d?u +?d?u?d?l?d?u +?u?d?d?u?l?d +?u?d?l?d?l?u +?u?l?l?d?u?d +?d?d?d?l?l?d?l +?u?d?u?d?u?d?d +?u?d?l?d?d?u +?d?l?d?u?d?l +?l?u?d?l?d?d +?l?l?l?d?s?d?d +?s?l?s?d?d?d +?l?d?d?d?s?s +?d?l?l?l?l?l?l?l +?l?l?l?d?s?s +?l?d?d?d?d?d?d?d?d?d +?l?s?l?d?l?l +?s?d?d?s?s +?d?d?d?d?l?l?l?d +?s?u?u?u?d?d +?l?d?d?l?l?s +?l?l?d?l?d?d?l +?u?u?d?d?d?d?s +?l?d?l?l?s?l +?d?s?s?l?l +?l?s?s?l?d +?d?s?l?s?l +?l?l?s?d?s +?l?s?d?s?l +?s?l?s?l?d +?d?l?l?s?s +?l?u?d?s?s +?l?s?l?d?s +?d?d?l?l?s?s +?l?l?d?s?s +?u?s?l?s?d +?s?u?u?u?u?u +?l?l?l?l?s?l?l +?l?d?d?s?d?l +?l?d?d?s?l?d +?l?d?s?d?d?l +?u?l?d?d?d?d?s +?d?d?d?u?s?u +?d?s?l?l?d?d +?d?d?d?u?u?s +?u?d?d?d?d?d?s +?u?l?l?u?s +?d?d?d?d?d?d?l?s +?s?s?u?u?u +?u?l?l?u?d?d?d +?s?s?l?s?s +?l?l?d?s?l?l +?u?u?s?u?u?d +?d?d?s?s?l?l +?l?s?l?l?l?l?l +?u?s?u?l?l?l +?u?u?l?l?u?u +?d?s?s?s?s +?u?d?l?l?l?u +?u?u?u?u?l?d +?l?l?d?l?s?l +?u?d?d?d?u?u?u +?d?d?l?l?d?l?d +?l?l?l?d?d?s?d +?l?s?l?s?s +?l?l?l?s?d?s +?d?l?d?l?l?d?l +?d?l?d?l?d?l?d?l +?l?d?s?d?d?d?d +?s?d?d?d?d?d?l +?d?d?u?l?u?d?d +?d?l?l?d?d?d?l +?s?l?l?s?d?d +?u?u?u?d?l?l +?l?s?l?l?l?s +?l?s?s?l?l?l +?u?l?u?u?l?u +?d?l?l?d?l?l?l +?u?u?u?d?s?d +?l?d?l?l?s?d +?l?d?l?d?s?l +?s?l?l?l?d?d?d +?u?l?d?l?u?d +?d?d?l?l?u?u +?u?d?d?l?l?u +?l?d?l?u?d?l +?u?d?l?u?l?d +?u?s?l?l?l?d +?d?s?l?d?d?d +?d?u?d?s?d?d +?u?d?d?d?s?d +?d?d?d?l?d?s +?s?d?d?l?d?d +?d?u?d?d?d?s +?d?l?l?l?d?l?d +?l?d?s?l?d?s +?d?d?d?d?l?d?d?d?d +?s?l?l?l?d?s +?l?d?l?l?d?d?d?d +?d?d?u?u?d?l +?u?d?l?u?d?d +?u?u?d?d?l?d +?u?u?d?l?d?d +?d?l?l?d?d?u +?d?l?u?l?d?d +?u?d?u?d?d?l +?d?d?u?l?l?d +?u?d?d?d?u?l +?u?l?d?d?u?d +?d?u?l?d?l?d +?d?d?l?d?u?l +?u?l?u?u?l?d +?u?l?l?l?l?l?s +?d?u?l?l?l?l?l +?l?l?l?d?s?l +?s?l?l?l?l?l?l +?s?d?l?l?l?d +?l?l?d?l?d?s +?d?l?l?d?d?s +?l?s?d?d?l?l +?d?l?d?l?d?s +?l?d?d?l?s?d +?s?l?l?l?l?l?s +?d?d?l?d?l?l?l +?d?d?l?l?d?l?l +?d?l?d?d?l?l?l +?s?s?d?d?d?s +?s?l?d?d?d?d?d +?d?d?d?d?d?u?u?u +?d?l?d?l?l?l?d +?s?d?l?l?l?l?l +?l?l?l?s?l?d?d +?l?l?d?d?d?d?d?l +?l?l?l?d?u?u +?l?d?l?d?l?u +?l?u?l?d?u +?l?u?d?l?u +?u?l?u?d?u?d +?d?l?u?l?u +?u?d?l?l?u +?l?l?d?l?u +?l?d?l?l?l?u +?l?d?u?u?l +?d?d?u?l?l?u +?l?u?u?d?l +?l?u?u?d?u +?u?l?d?d?u?u +?d?u?l?l?d?l +?l?d?u?u?l?d +?u?d?l?l?u?d +?u?u?d?l?u +?d?l?l?u?u +?d?l?l?u?l +?d?l?u?u?u +?l?u?d?u?l +?u?d?l?u?l +?l?d?l?d?l?d?d?d +?s?s?s?d?d?d?d +?u?u?u?d?d?d?u +?l?l?l?d?d?d?d?s +?l?l?l?l?s?d?d?d +?l?s?s?s?d +?l?u?u?u?u?d?d +?l?l?l?s?l?s +?l?d?l?s?l?l +?l?s?l?s?d?d?d +?s?d?d?d?s?l +?s?s?l?d?d?d +?d?d?d?d?d?d?d?d?d?l +?u?d?d?d?d?l?l +?l?u?l?l?u?l +?l?l?u?u?u?d +?u?s?u?u?s +?u?s?s?u?u +?u?d?d?d?d?u?d +?d?d?d?d?d?l?u +?l?l?l?l?l?s?s +?d?l?l?l?s?l +?u?s?u?u?u?d +?u?d?d?u?d?d?u +?u?l?l?l?s?l +?u?u?d?d?s?s +?d?u?u?u?u?u?d +?l?d?l?u?l?l +?u?l?l?u?u?d +?u?u?u?d?u?u?u +?l?l?l?l?u?d?d +?u?d?d?l?l?d?d +?d?d?d?d?l?l?u +?d?d?l?d?l?l?d +?d?u?u?u?u?d?d +?d?l?s?l?l?l +?l?u?u?u?s +?u?s?l?l?u +?l?l?l?u?s +?d?l?l?s?l?l +?l?d?d?u?u?u +?u?l?u?d?d?l +?u?l?u?d?d?u +?l?d?d?u?l?l +?l?l?d?d?u?l +?u?u?l?d?l?d +?u?l?u?d?l?d +?d?d?l?u?l?l +?d?u?l?l?d?u +?u?u?u?u?u?u?u?d +?l?l?d?u?l?l +?u?l?l?d?l?u +?u?l?l?u?d?l +?d?l?l?u?l?l +?d?l?l?l?l?l?l?d +?u?l?l?s?d?d?d +?u?l?l?l?s?u +?s?s?l?l?d?d +?l?l?s?d?d?l +?d?d?l?l?s?l +?l?s?d?l?l?d +?l?l?s?d?l?d +?u?u?u?u?u?u?u?u +?d?l?l?d?l?d?l +?d?d?d?d?u?u?l +?l?d?d?l?d?l?d?d +?l?d?d?d?d?s?d +?d?d?d?d?d?s?u +?u?l?s?l?l?l +?s?s?s?s?d?d +?u?l?d?l?l?u +?l?s?l?s?l?l +?d?l?l?d?d?l?l +?l?l?l?d?d?s?s +?d?s?d?s?d?d?l +?s?l?d?l?d?d +?d?l?l?d?s?d +?d?l?d?d?l?s +?l?l?s?l?d?l +?s?l?l?l?d?l +?u?u?u?u?u?u?s +?u?d?d?d?d?l?d +?d?d?d?d?u?d?u +?u?l?l?d?u?l +?l?u?l?l?d?l +?l?d?l?d?s?s +?l?s?s?d?d?d +?d?l?l?d?d?d?d?d +?l?l?l?l?s?u +?u?d?u?d?l?l +?l?u?u?d?d?l +?l?l?d?u?u?d +?u?d?l?d?u?l +?u?u?u?d?l?d +?l?u?d?d?l?u +?l?u?d?l?l?d +?d?d?d?s?d?d?l +?u?u?d?d?u?u?u +?u?s?u?l?d +?u?l?s?l?d +?l?u?u?s?d +?u?s?u?d?u +?d?u?u?l?s +?l?d?d?s?l?l +?s?l?d?l?l +?u?d?u?u?s +?u?d?l?l?s +?l?u?l?d?s +?l?u?d?l?s +?d?u?s?u?u +?s?d?u?l?l +?s?l?d?l?d?l +?s?u?d?l?l +?u?s?l?l?d +?u?d?s?u?u +?u?u?s?d?u +?l?l?d?u?s +?s?u?d?u?l +?u?u?l?s?d +?l?u?l?s?d?d +?l?d?s?u?u +?l?d?s?l?d?l +?l?d?l?s?u +?l?l?d?d?s?l +?u?l?d?l?s +?u?l?u?l?l?u +?l?d?d?l?u?d +?d?l?u?d?l?d +?d?u?l?d?d?u +?l?l?d?d?u?d +?l?d?d?d?u?l +?l?d?d?d?u?u +?d?l?u?u?d?d +?d?l?l?l?d?d?l +?u?d?u?u?d?d?d +?l?u?d?d?l?d +?u?l?d?u?d?d +?d?d?l?u?l?d +?d?u?d?l?l?d +?l?d?u?d?d?l +?d?l?l?u?d?d +?d?d?u?d?u?l +?u?d?u?d?l?d +?u?l?l?l?l?l?l?d +?l?l?u?u?l?d +?u?l?u?u?u?d +?u?l?l?l?l?s?d +?u?l?l?s?l?l +?l?l?d?l?d?d?d?d +?l?l?d?s?d?d?d +?l?l?d?d?d?s?d +?d?d?l?l?d?d?s +?u?u?s?s?s +?s?l?l?s?s +?l?s?l?l?d?d?d +?s?l?s?l?d?d +?u?d?d?l?d?d?d +?l?s?s?s?s +?u?d?l?l?l?d?d +?l?l?l?d?l?l?l?l +?s?d?d?d?d?l?l +?d?d?l?l?d?d?l?l +?l?l?u?d?l?l +?d?d?l?l?l?d?l +?u?d?d?u?u?d?d +?d?u?d?u?d?u?d +?u?u?d?d?d?d?l +?u?l?u?l?d?d?d?d +?l?d?l?d?l?d?s +?u?s?l?s?u +?u?l?s?s?l +?l?s?u?s?l +?u?s?l?l?s +?u?s?l?s?l +?d?d?l?l?l?l?s +?s?l?d?d?l?l +?u?l?u?s?d?d +?d?l?d?l?s?l +?d?s?l?l?l?d +?d?l?l?d?l?s +?u?l?l?d?s?d +?l?l?d?d?d?d?u +?l?d?d?l?u?u +?u?u?l?d?d?l +?u?d?u?l?l?d +?l?u?d?d?l?l +?l?d?l?u?l?d +?l?u?l?d?d?l +?l?u?l?d?l?d +?l?d?d?l?d?d?l?d +?l?l?l?d?d?d?l?l +?s?d?u?l?l?l +?s?l?d?l?l?l +?d?l?d?l?d?d?d?d +?u?u?u?d?d?d?s +?d?s?d?d?d?d?l +?s?l?l?l?s?d +?l?l?l?d?u?l +?u?d?u?l?l?l +?l?u?d?l?l?l +?l?l?l?d?l?u +?d?d?d?d?u?d?d?d +?l?s?s?l?d?d +?s?s?d?d?l?l +?l?d?d?l?s?s +?u?u?u?s?s?s +?l?l?l?u?d?d?d +?s?u?l?l?l?s +?u?u?u?l?l?d?d +?u?d?l?l?d?d?d +?d?l?d?d?d?u +?l?d?d?d?u?d +?d?l?d?d?u?d +?l?d?u?d?d?d +?l?d?d?u?d?d?d +?d?d?u?d?l?d +?d?l?l?l?l?l?d?d +?l?u?u?u?d?d?d +?d?d?l?l?l?d?d?d?d +?u?u?u?d?d?d?d?d?d +?s?d?d?d?l?l?l +?u?l?d?u?l?l +?l?u?l?d?l?l +?l?l?l?u?d?l +?u?l?u?u?l?l +?u?l?l?u?l?u +?u?d?l?d?l?d?d +?u?u?d?d?u?d?d +?d?d?d?d?l?l?l?l?l +?l?s?d?d?s?d +?d?d?d?d?d?d?l?u +?u?l?s?u?l?l +?l?d?d?d?s?d?d +?d?s?u?u?u?u +?d?d?d?d?u?l?l?l +?d?s?d?d?s?s +?s?d?s?d?d?s +?l?u?d?d?d?d?d?d +?d?d?u?d?d?d?d?d +?l?d?d?d?d?d?l?l +?d?d?u?u?u?s +?u?l?l?l?d?d?s +?u?l?l?l?l?u?d +?u?l?l?u?l?l?d +?l?l?l?l?d?l?l?l +?s?s?s?l?l?l +?l?d?u?s?s +?s?l?s?u?d +?s?l?l?s?d +?l?s?s?d?l +?s?s?d?l?l +?u?d?s?s?u +?u?s?s?u?d +?l?d?s?l?s +?u?l?d?d?s?s +?u?l?d?s?s +?u?u?s?s?d +?s?s?l?d?l +?s?d?s?l?l +?s?u?d?u?s +?s?u?u?s?d +?s?s?l?l?d +?d?s?l?l?s +?s?s?u?d?u +?u?d?l?s?s +?u?u?d?u?u?u?u +?u?l?l?l?l?l?u +?l?l?d?l?l?u +?l?d?u?l?l?l +?s?d?d?d?u?u +?d?s?d?l?l?d +?u?d?l?s?d?d +?d?u?l?s?d?d +?d?d?s?l?l?d +?l?u?s?d?d?d +?u?l?d?s?d?d +?d?l?s?d?l?d +?u?d?d?u?s?d +?d?l?s?l?d?d +?d?d?l?d?l?s +?u?u?d?d?s?d +?d?d?u?l?d?d?d +?l?d?d?d?d?d?u +?d?d?u?d?u?d?d +?u?u?l?l?l?u +?u?d?l?l?l?s +?l?u?s?l?l +?l?u?s?l?u +?s?l?l?l?u +?s?l?l?d?l?l +?u?u?u?s?l +?u?l?s?u?u +?l?u?l?l?s +?l?l?s?l?u +?l?u?u?s?u +?u?u?u?u?u?s?d +?l?d?d?d?d?l?l?l +?d?l?l?d?u?u +?l?d?d?l?u?l +?l?l?l?d?u?d +?u?l?d?l?d?u +?d?d?l?l?u?l +?d?l?l?u?u?d +?d?l?u?u?d?l +?d?u?l?l?u?d +?l?l?d?d?l?u +?u?l?d?u?d?l +?d?u?d?l?l?l +?u?d?u?u?l?d +?u?d?d?l?u?l +?u?d?u?d?u?l +?l?d?u?l?d?l +?u?l?d?u?u?d +?d?l?d?d?d?l?l +?d?d?d?u?d?d?d?d +?u?d?u?d?u?d?u +?d?d?d?s?s?d?d +?d?d?s?d?d?d?l +?d?d?d?d?s?d?l +?l?d?d?d?d?s?s +?u?u?u?u?u?d?u +?u?l?d?l?u?l +?u?d?l?u?l?l +?l?u?l?u?l?d +?d?l?u?l?l?l +?l?d?u?u?u?u +?l?d?l?l?u?l +?l?u?l?l?l?u +?u?u?d?u?l?l +?d?u?l?l?l?u +?u?u?u?s?u?d +?d?u?u?u?u?s +?l?d?d?d?d?l?s +?u?d?d?l?d?d?u +?u?l?d?d?d?d?l +?l?l?d?d?d?d?d?d?d?d +?d?l?l?l?l?d?d?d +?u?l?u?l?l?d?d +?l?d?s?d?s?d?d +?u?s?s?s?u +?u?s?u?s?s +?u?l?u?u?u?u +?s?u?l?l?l?l +?l?l?s?l?d?d?d +?l?s?d?d?s?l +?l?s?d?l?s?d +?u?u?s?s?d?d +?d?u?l?l?l?l?d +?d?d?l?d?d?d?d?l +?d?d?d?d?l?d?d?l +?s?d?d?u?u?u +?u?l?u?d?d?s +?u?l?d?d?l?s +?u?d?u?d?u?s +?l?d?s?l?l?d +?d?l?d?l?l?s +?d?d?u?l?l?s +?u?d?u?u?u?d?d +?d?d?d?d?u?u?d?d +?d?d?d?u?u?u?d +?u?l?d?d?l?d?d +?d?d?d?s?d?s?d +?u?u?l?l?d?d?d?d +?u?d?l?l?l?l?l +?u?u?u?d?d?u?u +?u?u?d?u?u?d?d +?l?l?u?u?d?d?d +?l?u?l?l?u?d +?d?u?u?l?l?l +?d?d?d?s?d?u +?s?d?d?d?l?d +?d?u?d?d?s?d +?d?l?d?d?s?d +?s?d?d?u?d?d +?d?s?d?d?d?l +?d?l?s?d?d?d?d +?d?s?d?d?l?d +?d?d?u?d?s?d +?l?d?d?l?d?d?s +?l?l?l?l?d?d?l?l +?d?d?u?d?l?l +?d?d?u?u?l?d +?l?l?l?d?d?d?u +?d?d?l?u?d?l +?l?d?d?u?l?d +?d?d?l?l?d?u +?d?l?d?u?u?d +?d?u?u?d?l?d +?d?d?l?l?u?d +?l?u?d?d?u?d +?d?d?u?l?d?u +?d?l?d?u?d?u +?d?l?d?d?l?u +?d?l?d?l?d?u +?d?l?d?d?u?l +?d?l?u?d?u?d +?d?l?l?d?u?d +?l?u?d?d?d?l +?l?d?d?l?d?u +?u?l?l?d?d?d?s +?d?l?d?l?u?d +?u?d?d?l?u?d +?d?d?u?d?l?u +?d?u?d?d?l?l +?s?d?d?l?l?l?l +?l?l?u?l?l?u +?l?l?s?d?d?d?d?d +?d?d?d?s?d?l?l +?l?s?l?s?l?d?d +?u?u?u?d?d?d?l +?s?d?d?d?s?s +?d?d?d?d?s?s?d +?d?s?d?s?d?d?d +?u?l?l?u?u?u +?u?u?d?d?d?d?d?d?d +?l?l?s?l?s?d +?l?d?l?l?s?s +?d?l?l?l?s?s +?l?s?l?l?s?d +?u?s?u?s?u?d +?l?l?d?u?d?l +?d?l?l?l?u?d +?l?l?d?u?l?d +?d?u?u?u?l?l +?u?u?d?d?u?l +?d?d?u?l?u?u +?d?l?l?d?l?u +?d?d?l?u?u?u +?l?l?u?d?d?l +?d?l?u?l?l?d +?d?l?d?l?l?u +?u?l?d?u?l?u +?l?d?u?u?d?u +?u?u?u?u?d?l +?u?l?u?l?d?l +?l?l?d?l?u?d +?l?l?u?l?d?l +?l?u?d?l?d?u +?l?u?d?l?d?l +?l?u?l?d?d?u +?d?l?d?l?u?l +?u?u?u?u?d?u?u +?u?d?d?d?l?l?l +?s?u?u?d?d?s +?l?s?l?d?d?s +?l?l?l?l?d?d?d?l +?l?l?l?l?l?d?d?l +?u?l?l?d?l?l?l +?u?l?l?l?l?d?l +?u?l?l?l?d?l?l +?d?d?d?d?l?u?l +?u?l?d?d?d?d?u +?d?d?d?d?d?d?u?d +?l?l?d?d?d?s?s +?s?s?l?d?s +?l?d?s?s?s +?s?l?s?s?d +?s?l?d?s?s +?s?d?s?l?s +?s?s?s?u?d +?l?u?u?u?u?l +?u?u?u?u?d?d?s +?l?l?l?l?d?d?d?s +?s?s?d?d?d?l +?d?d?d?d?s?s?l +?d?d?d?s?l?s +?d?d?d?l?s?s +?u?d?d?d?s?s +?d?d?d?s?s?l +?l?s?d?d?s?d?d +?u?u?d?d?d?l?l +?l?l?l?d?l?l?l?d +?s?d?l?l?l?s +?l?l?s?l?s?l +?u?s?s?l?l +?u?s?u?s?l +?l?l?l?u?u?l +?d?l?d?d?d?l?d?d +?s?d?l?l?d?l +?u?l?s?l?d?d +?s?u?l?l?d?d +?l?l?d?l?s?d +?l?d?l?s?d?l +?d?d?d?d?s?u?u +?l?l?l?s?s?d?d +?s?s?d?d?d?d?d?d +?l?s?l?l?l?l?d +?s?l?l?s?l?l +?d?d?d?d?d?l?d?l +?l?d?d?d?d?d?l?d +?u?l?l?l?u?s +?d?d?d?d?d?l?l?l?l +?d?d?s?s?s?s +?d?l?u?u?u?u +?u?u?u?l?d?l +?u?u?l?l?u?d +?u?l?d?u?u?l +?d?d?d?u?u?d?d?d +?l?d?d?l?d?d?l?d?d +?u?l?l?u?l?l?l +?u?s?l?l?d?l +?d?u?l?l?l?s +?d?d?d?d?u?u?s +?s?s?s?l?s +?l?l?d?d?l?d?d?d +?l?u?u?l?l?l +?u?l?l?u?u?l +?u?l?u?l?u?u +?l?d?d?l?l?d?d?d +?l?l?s?s?s?s +?u?u?l?l?l?l?d +?u?l?l?l?u?l?l +?l?l?l?l?l?l?l?l?l +?u?l?l?u?l?d?d +?u?l?d?d?l?l?l +?s?l?d?d?l?s +?l?l?l?s?d?d?s +?d?d?d?d?l?d?l?d +?u?l?u?l?u?s +?u?l?d?l?l?d?d +?l?l?l?l?l?d?d?s +?d?d?d?s?d?l?d +?d?d?d?l?d?d?s +?l?l?l?l?l?l?d?l +?u?u?u?d?u?s +?u?l?u?l?s?d +?l?u?u?l?l?d +?u?u?l?l?d?l +?d?l?l?u?u?l +?l?l?d?u?u?u +?u?l?u?l?d?u +?s?l?l?l?d?d?s +?s?d?d?d?s?d?d +?u?d?d?d?u?d?d?d +?u?l?d?l?l?l?l +?l?l?d?d?d?l?l?l +?u?d?l?d?u?d?d +?u?u?u?l?u?u +?l?d?l?l?l?d?d?d +?s?s?l?l?s?s +?s?d?u?u?d?d +?d?d?d?s?u?l +?d?d?l?l?d?s +?d?d?s?l?d?l +?d?d?d?u?l?s +?u?l?d?d?s?d +?u?d?d?d?u?s +?d?l?d?s?l?d +?l?u?d?d?d?s +?l?d?s?d?l?d +?s?l?d?d?d?l +?s?d?l?d?l?d +?d?d?d?s?l?u +?d?d?d?d?s?l?l?l +?u?d?d?d?l?d?d +?u?u?u?l?l?l?d +?s?l?s?d?d?d?d +?d?l?d?l?d?l?s +?l?l?l?l?l?l?s?d +?l?l?d?u?d?u +?u?u?l?d?d?u +?l?u?d?l?u?d +?d?l?d?u?u?u +?d?u?u?u?d?l +?l?d?u?d?l?u +?l?d?u?d?l?l +?l?u?d?d?u?l +?d?l?u?l?d?l +?u?l?d?d?d?l?l +?l?d?d?l?l?u +?d?u?l?d?l?l +?d?u?d?l?l?u +?l?d?l?d?u?u +?l?d?l?d?u?l +?d?l?l?u?d?l +?l?d?u?l?l?d +?l?d?u?d?u?l +?l?d?l?u?u?d +?u?d?u?l?d?l +?d?l?l?l?d?u +?l?l?l?l?l?l?u +?l?l?u?u?u?l +?u?l?l?d?d?l?l +?u?l?l?l?d?d?l +?d?s?l?l?l?l?l +?u?l?u?l?u?l?u +?l?l?d?s?d?l +?u?d?l?d?l?s +?u?u?l?s?d?d +?s?l?d?l?l?d +?d?l?l?l?l?l?s +?d?d?l?s?l?l +?u?d?d?l?s?l +?l?d?s?d?l?l +?l?l?d?d?l?l?l?l +?u?u?u?u?d?u?d +?s?l?l?l?l?l?d +?u?d?u?d?d?u?d +?d?d?d?d?u?s?u +?u?u?u?u?d?d?u +?s?s?s?d?s +?s?s?d?s?s +?s?d?s?s?s +?d?l?d?d?l?d?d?l +?l?l?u?d?u?l +?d?l?l?l?u?l +?u?u?l?d?u?u +?l?u?u?d?l?l +?l?u?d?u?u?u +?l?l?d?l?l?d?d?d +?l?l?d?l?s?s +?l?d?l?s?l?s +?s?s?d?s?d?d +?d?s?s?s?d?d +?d?d?s?s?d?s +?d?d?d?s?d?d?s +?d?d?s?s?d?d?d +?s?l?s?s?l +?l?s?s?l?s +?u?s?l?s?s +?u?l?l?d?d?d?d?d?d +?u?d?u?u?u?u?u +?u?l?l?l?l?l?l?l +?l?u?l?l?l?d?d +?l?l?l?l?l?d?l?d +?d?d?d?d?d?u?s +?d?d?l?s?l?s +?d?l?s?d?l?s +?s?l?d?l?d?s +?d?l?l?d?s?s +?u?l?s?s?d?d +?d?d?u?u?d?d?d?d +?l?l?l?l?l?u?d +?u?l?l?d?d?d?l +?l?l?l?l?l?d?l?l +?u?u?u?u?l?u +?l?d?d?d?l?l?d?d +?l?d?l?d?s?d?d +?s?l?s?l?l?l +?d?d?d?d?d?d?d?d?l?l +?u?l?l?l?l?d?d?d?d +?u?u?d?u?d?d?d +?u?d?d?l?d?d?l +?d?d?d?l?l?l?d?d?d +?u?s?u?u?d?u +?u?l?l?s?l?d +?u?u?u?l?d?d?d +?u?l?u?l?u?l?d +?l?l?l?u?l?u +?d?d?d?s?u?u?u +?u?d?d?l?l?l?l +?u?d?d?d?d?d?d?d?u +?l?l?l?d?d?l?d?d +?l?l?l?l?l?l?l?l?d +?u?d?u?u?d?u?d +?l?l?l?l?u?s +?d?d?s?l?l?d?d +?l?d?l?s?d?d?d +?u?s?l?d?d?d?d +?d?d?l?l?s?d?d +?u?u?l?l?d?u +?d?u?u?u?u?l +?d?l?l?l?u?u +?d?u?l?u?l?l +?u?d?l?l?u?l +?u?l?u?d?l?l +?u?l?u?d?u?l +?d?l?l?u?l?u +?l?u?u?d?l?u +?l?l?d?l?u?l +?u?u?u?d?l?u +?l?u?l?d?l?u +?l?l?d?d?d?l?d?d +?l?d?d?d?d?d?d?u +?u?s?d?d?d?d?d?d +?u?u?l?l?l?l?l +?u?l?u?d?d?d?d?d +?u?u?u?l?l?u +?u?d?l?d?l?d?l +?l?l?u?l?l?d?d +?l?l?l?l?l?l?l?s +?u?d?d?u?d?u?d +?d?d?u?d?d?l?d +?d?u?l?d?d?d?d +?d?d?l?d?l?d?d?d +?d?d?u?d?d?d?u +?l?d?d?l?l?l?d?d +?d?d?d?d?d?d?d?u?u +?u?d?d?d?d?d?d?s +?s?s?l?l?l?d +?l?s?l?d?l?s +?u?s?d?l?l?l +?u?u?u?s?u?u?u +?l?l?l?l?d?d?d?d?d?d +?l?d?l?l?d?l?d?d +?u?d?l?l?d?l?d +?d?d?l?s?d?d?l +?d?d?l?s?l?d?d +?d?d?d?u?u?u?u?u +?u?u?u?u?u?d?d?d?d +?s?l?l?l?s?d?d +?d?d?d?l?d?l?d?d +?d?d?l?d?d?d?l?d +?s?u?d?d?d?s +?l?d?s?d?s?d +?l?d?s?d?d?s +?d?l?d?d?s?s +?u?d?s?d?s?d +?d?s?l?s?d?d +?u?d?s?s?d?d +?u?s?d?d?s?d +?d?d?u?u?u?u?d?d +?u?u?u?d?u?d?d +?d?d?d?d?s?l?d +?d?d?l?s?d?d?d +?d?d?s?d?d?l?d +?u?l?l?l?d?l?d +?s?l?l?l?s?s +?d?l?d?d?l?d?d?d +?s?l?l?d?d?l +?u?l?s?d?d?u +?l?s?d?l?d?l +?s?l?l?d?l?d +?u?l?s?u?d?d +?l?u?u?s?d?d +?d?l?s?l?d?l +?u?d?l?l?d?s +?s?d?l?d?l?l +?d?u?d?l?d?u?d +?u?l?d?l?d?d?d +?l?u?u?u?u?u?d +?d?d?s?l?l?s +?s?d?l?l?s?d +?d?d?s?l?s?l +?u?s?l?s?d?d +?d?l?s?l?s?d +?d?u?l?l?l?d?d +?d?l?d?l?d?l?d?d +?d?d?d?d?d?d?d?s?d +?u?l?d?l?u?u +?l?d?l?u?u?l +?d?u?l?u?l?u +?u?d?u?u?u?l +?l?u?u?u?l?d +?l?l?l?u?u?d?d +?u?l?l?u?d?u +?l?u?l?u?d?l +?l?d?l?u?l?u +?u?u?l?d?l?l +?l?d?u?u?l?l +?u?d?l?l?u?u +?l?l?l?u?d?u +?l?u?l?u?u?d +?d?d?s?d?d?s?l +?l?s?d?d?d?d?s +?s?l?d?d?d?d?s +?d?d?d?l?l?l?l?d +?l?s?d?l?l?l?l +?u?d?l?l?l?l?d +?u?s?u?l?u +?s?l?u?l?l +?u?l?d?l?l?s +?l?s?u?l?l +?u?d?u?u?u?s +?s?l?l?u?u +?u?s?u?u?l +?u?l?u?u?s +?u?s?l?u?l +?l?s?l?l?u +?u?l?s?l?u +?l?l?u?l?s +?u?u?l?s?l +?l?l?s?u?l +?u?s?u?l?l?d +?l?u?l?u?s +?l?s?l?u?l +?l?u?u?s?l +?u?l?u?s?u +?d?s?u?l?l?l +?u?l?u?s?l +?u?l?l?d?l?d?d +?u?u?d?u?d?l +?l?l?u?d?d?u +?u?u?d?l?d?l +?u?u?d?l?d?u +?l?l?d?l?d?u +?l?l?u?d?l?d +?d?d?u?u?u?l +?d?d?l?u?u?l +?d?u?u?d?l?l +?u?u?d?l?u?d +?u?d?l?d?l?l?d +?u?l?d?d?d?u?l +?u?d?u?u?d?l +?d?u?u?l?l?d +?l?u?d?u?l?d +?d?l?l?d?u?l +?d?u?l?d?l?u +?u?d?u?d?u?u?d +?d?l?u?u?u?d +?u?d?d?u?l?u +?d?l?d?l?u?u +?u?l?l?s?d?d?d?d +?s?d?d?d?d?d?d?d?d +?s?l?s?s?s +?l?l?l?l?d?d?u +?l?u?l?u?l?l +?u?u?l?l?u?l +?d?s?d?d?d?s?d +?s?d?d?s?d?d?d +?s?d?s?d?d?d?d +?d?d?d?d?d?d?s?d?d +?l?l?l?l?d?l?d?d +?l?l?l?d?d?s?d?d +?l?d?l?l?l?l?d?d +?d?l?d?d?d?d?l?d +?l?u?l?u?d?d?d +?l?d?l?l?l?l?l?l +?l?l?d?d?d?d?l?d +?d?d?l?l?l?l?l?d +?l?d?d?s?d?d?l +?l?d?l?d?d?d?s +?s?l?l?d?l?s +?u?d?d?l?d?l?d +?l?l?l?l?s?l?d +?l?l?l?l?s?s?s +?l?d?d?l?l?d?d?l +?l?l?s?l?l?l?d +?l?u?u?l?u?u +?l?u?u?u?l?l +?u?u?l?u?l?l +?l?l?l?d?l?d?d?d +?l?l?d?d?d?d?d?s +?u?l?l?l?l?d?s +?l?l?d?l?l?l?l?l +?l?l?s?s?d?d?d +?u?l?l?u?d?d?d?d +?d?l?d?d?d?d?d?l +?s?l?d?d?d?d?d?d +?s?u?d?d?d?d?d?d +?s?d?d?d?d?d?d?l +?l?l?l?s?l?l?d +?s?d?d?d?d?s?l +?u?u?u?l?l?l?l +?u?d?d?u?u?u?u +?s?u?u?u?u?d +?u?l?l?d?l?s +?u?s?d?u?u?u +?d?d?d?d?d?d?s?u +?d?d?u?d?d?u?d +?d?d?d?d?u?d?l +?s?s?d?s?s?d +?d?d?s?d?s?d?d?d?d +?l?u?u?u?d?u +?l?u?u?u?d?l +?u?u?u?d?u?l +?u?u?l?u?d?u +?l?u?l?d?u?l +?u?l?l?d?u?u +?u?u?d?u?u?l +?d?u?l?l?u?l +?u?d?l?u?l?u +?l?u?d?u?u?l +?u?d?u?u?l?l +?u?l?d?u?u?u +?d?d?s?l?d?d?d +?d?s?l?d?d?d?d +?u?u?d?d?s?d?d +?d?l?d?s?d?d?d +?l?s?d?d?d?d?l +?l?d?d?d?d?s?l +?d?d?d?d?l?s?d +?l?u?l?u?l?d?d +?d?d?d?d?d?u?l?d +?s?l?d?l?l?s +?s?s?d?l?l?l +?l?l?d?l?l?l?d?d +?d?u?d?u?l?d +?l?d?d?u?u?d +?d?u?l?d?d?l +?l?d?d?d?l?u +?l?d?u?u?d?d +?d?d?u?l?u?d +?l?d?d?u?d?l +?l?u?d?d?d?u +?d?u?u?d?d?l +?l?d?l?d?d?u +?u?d?d?u?d?l +?l?u?d?u?d?d +?u?u?d?d?u?u?d +?l?d?l?d?u?d +?d?d?l?u?u?d +?d?u?d?l?u?d +?d?l?u?d?d?l +?d?u?d?d?l?u +?l?d?d?u?d?u +?d?d?d?d?s?l?s +?u?u?d?d?d?d?u?u +?u?d?u?d?d?d?d?d +?u?d?u?d?u?d?u?d +?d?s?d?s?s?d +?s?d?d?s?s?d +?s?d?d?s?d?s +?s?d?d?d?d?s?d +?u?u?l?u?u?l +?u?l?u?l?l?l?l +?l?u?l?u?u?l +?l?l?u?l?d?d?d +?u?d?l?d?u?d?l +?u?l?d?l?d?l?d +?l?u?l?l?d?d?d +?d?s?d?l?l?l?l +?s?d?l?l?d?s +?s?d?d?s?l?l +?s?l?l?d?s?d +?s?d?l?s?d?l +?d?s?l?l?s?d +?l?s?l?d?s?d +?s?d?l?d?l?s +?l?s?d?s?l?d +?l?l?l?d?d?d?d?d?d?d +?d?l?d?s?d?l?d +?d?d?l?d?d?l?s +?d?d?d?d?s?u?l +?u?d?d?s?u?d?d +?l?d?l?l?s?d?d +?u?u?l?l?s?d +?u?s?l?d?l?l +?u?l?s?l?l?d +?l?s?s?d?d?d?d +?l?u?u?u?u?u?u +?l?d?l?d?l?l?d?d +?d?d?d?u?u?l?l +?u?s?u?l?s +?s?l?s?u?l +?s?l?l?s?u +?l?s?u?l?s +?l?l?s?s?u +?l?s?l?s?u +?l?l?s?d?s?l +?s?u?l?u?s +?s?u?u?s?u +?l?s?l?l?d?s +?l?l?s?u?s +?u?u?s?u?s +?s?s?u?l?u +?u?l?u?s?s +?l?l?l?l?l?l?d?d?d?d +?l?u?l?u?u?u +?l?l?d?s?l?d +?u?u?d?d?s?u +?s?d?d?u?l?l +?d?s?d?u?u?u +?d?l?l?s?d?l +?u?d?s?l?d?l +?u?s?d?l?d?l +?u?s?l?d?l?d +?u?d?l?d?s?l +?u?d?u?s?u?d +?l?d?d?l?s?l +?u?d?u?u?d?s +?l?u?l?d?d?s +?d?d?u?d?d?u?u +?u?d?d?l?u?d?d +?l?u?u?u?u?s +?l?l?l?d?l?l?d?d +?l?d?d?d?l?l?l?l +?l?s?l?s?l?s?l +?l?d?d?d?l?d?d?l +?s?s?s?d?d?s +?d?d?d?s?d?d?d?s +?l?d?l?l?u?u +?l?d?l?u?u?u +?u?d?u?l?l?u +?d?u?l?u?u?l +?u?d?u?l?u?l +?u?u?u?l?u?d +?u?u?l?u?u?d +?u?u?l?d?u?l +?l?u?u?l?d?l +?u?l?u?u?d?l +?u?l?u?u?d?u +?u?u?u?l?d?u +?u?l?u?d?u?u +?u?d?l?u?u?u +?u?d?u?l?u?u +?u?u?d?d?l?l?l +?d?d?l?l?l?l?l?d?d +?d?d?d?u?l?u?l +?l?s?l?d?d?d?d?d +?d?d?d?d?d?d?l?d?d +?s?l?s?l?s?l +?u?d?l?l?d?l?l +?u?l?u?l?l?l?d +?u?u?l?u?u?u +?u?s?l?l?l?d?d +?l?d?d?l?l?l?l?l +?d?d?u?l?l?l?d?d +?u?l?u?u?d?d?d +?l?l?l?u?l?d?d +?l?d?d?l?d?d?d?l +?d?d?d?d?d?d?d?l?d +?u?d?d?u?d?d?d?d +?s?d?d?d?d?s?s +?d?d?d?d?d?u?l?l +?s?s?d?d?d?s?s +?s?d?s?l?l?l +?l?s?l?s?d?l +?l?s?s?l?l?d +?u?d?s?d?d?d?d +?u?d?d?d?s?d?d +?s?d?d?d?d?d?u +?l?u?u?u?s?d +?u?d?l?s?l?l +?l?l?d?d?l?l?s +?u?u?d?u?u?s +?d?d?d?d?l?l?l?s +?u?d?u?u?u?u?d +?d?u?d?d?d?d?d?d +?d?d?s?d?d?d?s +?d?d?s?l?s?d?d +?d?d?d?d?s?d?s +?u?l?l?s?u?l +?d?d?u?d?u?d?u +?d?d?l?d?l?d?d?l +?l?l?u?l?u?l +?u?u?d?d?u?u?d?d +?l?s?l?s?s?d +?u?u?u?s?d?d?d?d +?s?u?u?d?d?d +?s?d?d?u?l?d +?s?d?d?d?u?l +?d?s?u?l?d?d +?l?d?d?d?s?u +?u?d?s?d?d?l +?u?d?u?d?s?d +?u?d?u?d?d?s +?u?d?d?s?l?d +?d?d?s?u?l?d +?u?d?s?d?l?d +?d?d?l?s?l?d +?u?d?s?l?d?d +?u?s?d?d?u?d +?d?s?u?u?d?d +?u?s?d?d?d?l +?d?l?d?s?d?l +?u?d?d?d?s?u +?u?d?d?l?d?s +?u?s?d?l?d?d +?d?s?d?d?u?u +?d?s?d?l?d?l +?u?s?d?d?l?d +?l?s?d?d?l?d +?d?d?l?d?s?l +?s?l?u?d?d?d +?u?s?d?u?d?d +?d?u?s?d?d?l +?l?d?d?d?u?s +?u?d?d?d?s?l +?u?d?d?s?d?u +?u?d?s?u?d?d +?d?d?d?s?l?l?d +?d?l?d?l?s?d +?s?u?l?d?d?d +?s?d?d?l?d?l +?u?d?d?d?l?s +?d?d?s?u?u?d +?u?d?u?s?d?d +?s?l?d?d?l?d +?d?s?d?d?d?l?l +?u?d?d?u?d?s +?u?d?d?s?u?d +?l?s?u?d?d?d +?d?u?u?s?d?d +?s?d?d?l?l?d +?d?s?l?d?d?l +?s?u?d?u?d?d +?d?d?d?u?s?l +?d?d?l?s?d?l +?d?u?d?u?s?d +?d?d?d?d?u?l?s +?d?d?d?d?d?d?u?u?u +?l?d?l?l?l?l?s +?s?d?d?s?d?d?s +?d?u?d?d?d?d?u +?d?d?d?d?l?u?d +?d?d?d?l?d?d?u +?d?d?d?u?l?d?d +?d?d?d?d?u?l?d +?d?d?u?d?d?d?l +?l?d?d?d?s?d?d?d +?s?l?l?l?s?l +?u?u?s?s?u?u +?l?l?d?d?d?d?d?d?l +?d?u?l?u?d?l +?l?u?u?d?d?u +?d?l?u?d?l?l +?u?d?l?u?d?u +?d?u?d?u?l?l +?l?d?d?u?u?l +?d?l?d?u?l?l +?u?d?u?d?l?u +?d?u?l?u?u?d +?l?u?d?u?d?l +?l?u?d?u?d?u +?d?l?d?u?u?l +?u?d?l?u?u?d +?u?d?u?l?u?d +?d?l?u?l?u?d +?d?u?u?d?l?u +?l?d?u?u?u?d +?d?d?d?l?l?l?u +?l?d?u?u?d?l +?u?u?d?d?l?u +?l?d?l?l?u?d +?u?l?d?u?d?u +?d?l?u?d?u?l +?d?d?l?u?l?u +?d?d?u?u?u?u?d +?d?l?u?u?l?d +?d?l?d?u?l?u +?d?u?l?d?u?l +?d?u?d?l?u?l +?l?d?l?l?d?l?s +?u?d?d?u?u?l +?l?u?u?d?l?d +?d?d?d?l?l?d?d?l +?d?d?d?d?d?d?u?s +?d?d?d?u?u?u?s +?u?l?d?l?l?d?l +?d?d?u?d?d?u?d?d +?d?d?d?l?d?d?l?d +?l?l?l?d?d?d?l?d +?l?s?d?s?d?s +?s?s?s?l?d?d +?u?l?l?d?u?l?l +?l?d?d?d?l?d?l?d +?l?l?l?l?s?s?d +?s?d?d?s?s?s +?u?u?d?l?l?u +?d?u?u?u?l?u +?l?u?u?u?l?u +?l?l?u?l?u?d +?l?u?u?d?u?u +?d?l?u?l?l?u +?l?u?l?l?d?u +?u?l?d?l?l?l?d +?d?l?u?u?l?l +?d?l?l?u?u?u +?l?l?d?u?u?l +?l?u?u?l?d?u +?u?d?l?l?l?d?l +?l?u?d?u?l?l +?l?l?d?l?u?u +?l?l?u?l?d?u +?u?l?u?d?l?u +?u?d?u?u?l?u +?l?d?u?l?l?u +?l?l?u?u?d?l +?l?l?u?u?d?u +?l?u?d?l?l?u +?u?u?d?l?u?u +?l?s?s?l?d?l +?l?l?s?s?l?d +?u?u?u?s?s?d +?u?u?u?s?d?s +?l?l?l?s?d?d?l +?l?l?s?d?d?l?l +?l?s?l?d?l?l?l +?d?d?d?d?l?l?d?l +?u?d?d?d?l?d?d?d +?u?d?u?u?d?u?u +?u?s?s?u?s +?u?l?s?s?s +?l?s?s?s?u +?s?u?s?u?s +?s?s?l?s?l +?s?s?s?u?u +?u?l?s?d?d?s +?d?s?l?d?s?l +?l?l?s?d?s?d +?l?u?s?d?d?s +?u?u?s?d?d?s +?u?d?u?d?s?s +?d?s?d?s?l?l +?s?u?u?s?d?d +?s?l?l?d?d?d?s +?u?s?d?u?s?d +?u?s?s?u?d?d +?d?d?u?u?s?s +?u?s?u?d?s?d +?l?d?l?s?d?s +?u?l?d?d?d?d?d?d?d +?l?d?s?l?d?d?d +?d?l?l?d?d?d?s +?d?d?l?l?d?d?d?l +?u?u?d?d?l?d?d +?d?d?u?d?u?u?d +?d?d?l?l?u?d?d +?d?u?d?l?d?l?d +?d?u?l?l?d?d?d +?u?d?u?d?d?d?u +?d?d?u?u?d?d?u +?u?u?s?u?u?d?d +?l?l?d?d?s?l?l +?u?u?u?d?d?l?l +?u?u?d?l?l?l?l +?d?d?d?d?s?s?d?d +?d?d?s?d?d?d?d?d?d +?l?l?s?d?d?d?s +?l?d?d?d?d?l?l?d +?l?d?l?d?l?d?l?l +?d?d?d?d?l?s?s +?l?u?u?l?l?u +?l?u?u?l?u?l +?u?d?l?d?l?l?l +?l?l?u?u?u?d?d +?d?d?d?s?s?d?d?d +?u?u?s?u?u?u?u +?l?d?d?l?d?d?l?l +?d?d?d?d?d?d?d?d?d?d?d?d +?d?d?d?d?d?u?d?d +?u?u?s?l?l?l +?u?u?l?l?l?s +?u?u?u?s?s?u +?s?s?l?l?l?s +?l?l?s?d?d?d?l +?s?s?s?s?s?l +?d?d?d?s?d?d?d?l +?d?d?d?l?l?u?u +?l?l?d?d?d?u?u +?u?l?d?d?l?l?d +?u?d?u?d?u?u?u +?d?s?s?d?d?d?d +?d?d?u?u?u?u?u?u +?s?l?s?l?l?d +?s?l?s?l?d?l +?u?l?l?d?s?s +?d?d?d?d?l?l?l?d?d +?d?d?l?d?d?l?d?l +?l?s?s?s?s?s +?l?l?l?l?d?l?s +?l?l?l?d?d?u?u +?u?u?s?u?u?s +?u?l?u?l?s?s +?l?l?d?d?d?l?l?d +?u?l?d?d?s?d?d +?s?d?d?l?l?d?d +?d?d?d?d?d?s?l?l +?d?s?d?l?l?d?d +?s?u?u?d?d?d?d +?d?d?d?l?l?s?d +?d?l?l?d?l?d?d?d +?l?l?u?u?l?u +?l?u?l?l?u?u +?u?d?d?d?d?u?d?d +?s?d?d?l?d?s +?s?d?d?d?l?s +?l?d?d?s?d?d?s +?u?s?d?d?s?d?d +?s?d?d?s?l?d +?l?d?d?s?d?s +?d?d?l?d?s?s +?d?d?s?l?s?d +?d?s?d?l?s?d +?s?s?d?l?d?d +?d?s?d?d?s?u +?d?s?d?s?d?l +?u?d?d?s?d?s +?d?s?s?l?d?d +?s?d?l?d?s?d +?s?u?s?d?d?d +?s?d?d?d?s?u +?d?u?s?s?d?d +?d?s?d?d?s?l +?s?d?l?d?d?s +?d?s?d?d?u?s +?d?d?s?l?d?s +?d?d?s?d?s?l +?u?s?s?d?d?d +?l?d?d?s?s?d +?d?d?d?l?d?d?l?l +?d?d?d?s?l?l?l?l +?u?d?l?l?d?d?l +?d?l?d?d?d?d?s +?u?d?d?s?d?d?d +?d?d?l?d?d?d?s +?s?d?d?d?l?d?d +?d?d?d?l?s?d?d +?u?d?d?d?d?s?d +?d?s?d?d?l?d?d +?d?d?d?s?l?d?d +?d?d?s?d?l?d?d +?s?s?s?s?l?l +?d?d?l?d?d?l?d?d?l +?l?l?l?l?d?l?l?d +?u?u?u?u?l?d?d +?u?l?l?u?u?d?d +?u?u?d?u?d?s +?l?d?l?s?d?u +?u?l?s?d?d?l +?l?s?l?u?d?d +?u?u?l?d?d?s +?d?l?s?l?l?d +?s?u?d?u?u?d +?u?d?s?d?l?l +?u?l?s?d?u?d +?u?u?s?d?d?u +?u?l?d?s?d?l +?u?s?d?d?l?l +?u?d?u?d?s?u +?u?d?d?l?l?s +?l?l?d?d?u?s +?u?u?d?u?s?d +?d?d?s?u?l?l +?d?l?s?d?l?l +?s?l?u?d?l?d +?u?l?d?s?u?d +?s?l?u?l?d?d +?u?s?l?d?d?l +?l?d?u?s?l?d +?s?u?d?l?d?l +?d?s?l?l?d?l +?u?d?l?l?s?d +?d?l?d?l?u?s +?d?l?l?s?l?d +?d?u?s?u?d?u +?l?d?s?d?d?s?d?d +?l?d?d?u?l?d?d +?u?d?l?d?d?l?d +?d?d?u?d?d?l?l +?u?d?d?u?l?d?d +?d?d?d?u?l?l?d +?u?u?d?d?d?u?d +?l?d?d?u?d?d?l +?d?d?u?u?d?d?l +?u?d?d?d?u?d?u +?d?d?d?u?l?d?d?d +?u?d?d?l?d?d?d?d +?u?u?u?u?l?l?l +?s?d?d?d?s?d?d?d +?d?d?d?l?l?s?s +?u?s?u?s?d?d?d +?l?l?d?d?l?d?d?l +?u?l?l?s?u?l?l +?d?l?l?l?d?l?l?l +?u?l?u?l?s?d?d +?l?d?l?l?l?d?l?l +?d?s?d?s?s?s +?l?l?u?d?u?u +?l?u?u?l?u?d +?l?l?u?d?l?u +?u?u?d?u?u?d?u +?l?d?u?l?u?u +?d?u?u?l?l?u +?l?u?d?u?l?u +?u?u?l?d?l?u +?u?u?d?u?l?u +?u?l?l?l?d?d?u +?u?d?l?l?d?d?d?d +?s?s?l?l?l?d?d +?l?l?d?l?l?l?s +?u?s?u?l?d?l +?u?l?u?l?d?s +?u?s?u?d?u?u +?s?u?l?l?l?d +?l?d?l?d?d?d?d?l +?u?d?u?u?u?d?u +?l?d?l?d?l?d?d?l +?u?l?d?d?l?d?l +?d?l?l?l?s?d?d +?u?s?l?l?d?d?d +?s?l?l?l?d?d?d?d +?d?d?d?l?l?d?d?d?d +?l?l?l?l?l?u?u +?s?s?u?s?s +?s?u?s?s?s +?l?l?l?l?u?u?u +?l?l?d?l?d?l?d?d +?u?s?s?l?l?l +?u?s?l?l?s?l +?s?s?s?d?d?l +?u?s?s?s?d?d +?l?s?s?s?d?d +?u?l?l?d?l?l?d +?u?l?u?u?l?d?d +?d?u?u?u?u?d?u +?l?l?u?u?l?d?d +?u?u?u?d?u?u?d +?l?l?l?d?l?l?s +?d?d?d?d?l?d?l?l +?s?d?d?l?d?d?s +?l?l?l?l?l?l?d?s +?l?d?d?d?d?s?d?d +?l?l?d?l?l?d?l?l +?u?l?d?d?d?s?d +?d?d?s?d?d?u?u +?d?l?l?s?d?d?d +?u?l?l?u?l?l?d?d +?l?l?s?s?l?d?d +?l?l?s?d?l?s +?l?s?l?d?s?l +?d?l?s?l?s?l +?u?u?d?d?d?d?l?l +?d?d?l?d?d?d?l?l +?d?d?d?s?s?l?l +?l?l?d?l?l?l?l?d +?l?l?l?u?d?d?d?d +?d?d?l?l?l?d?d?l +?d?d?d?d?u?l?d?d +?u?l?u?s?d?d?d +?u?l?l?d?d?d?d?s +?d?d?l?l?l?s?d +?d?d?d?u?l?l?l?l +?s?s?s?s?s?d +?u?l?d?d?u?l?d?d +?u?u?u?d?d?u?d +?u?d?d?l?l?l?d +?u?l?l?d?d?d?u +?u?d?d?d?u?l?l +?u?l?u?l?l?s +?d?d?d?l?l?l?l?l?l +?l?l?l?s?d?l?d +?l?d?l?s?l?d?l +?d?d?l?l?l?s?s +?l?l?l?s?d?s?d +?d?d?d?u?u?u?d?d +?u?s?u?u?s?u +?d?s?d?d?s?d?d?d?d +?u?l?l?s?s?s +?l?d?l?d?l?l?l?l +?s?l?l?s?d?d?d +?l?d?l?l?l?l?l?d +?d?d?d?d?d?d?l?l?d +?d?s?d?d?s?d?d?l +?d?d?l?d?d?d?d?d?d +?d?u?d?d?d?d?l +?d?d?d?l?u?d?d +?l?d?u?d?d?d?d +?d?u?d?d?d?u?d +?d?l?d?u?d?d?d +?d?d?d?d?l?d?u +?d?u?d?u?d?d?d +?d?d?u?l?d?d?d?d +?d?d?d?u?d?u?d +?d?d?d?d?l?l?d?d?d +?d?d?u?d?l?d?d +?d?d?l?u?d?d?d +?d?u?d?d?u?d?d +?d?d?d?u?d?d?l +?d?d?d?u?d?d?u +?d?u?d?d?d?l?d +?d?d?l?l?l?l?u +?u?u?u?d?s?d?d +?u?s?u?u?u?d?d +?l?d?d?s?l?l?l +?l?d?d?s?d?d?d?d +?u?l?u?u?u?l +?u?u?u?l?u?l +?d?d?l?d?l?l?d?d +?l?l?l?l?d?s?s +?l?d?l?s?s?s +?u?u?l?l?l?d?d?d +?u?u?s?s?s?s +?s?s?u?u?s?s +?d?d?d?d?d?l?l?s +?l?l?l?d?d?s?l +?l?s?l?l?s?s +?u?d?d?d?d?l?u +?u?d?d?d?l?d?l +?d?d?d?u?u?d?u +?d?d?u?l?l?l?d +?u?d?d?d?d?u?l +?u?l?d?d?d?l?u +?d?u?u?d?u?u?d +?u?l?d?d?u?l?d +?d?d?l?l?d?d?u +?u?d?d?d?d?d?d?d?d?d +?u?l?s?s?l?l +?u?d?l?d?l?d?l?d +?l?l?d?d?l?l?l?d +?d?l?d?l?l?d?d?d +?d?l?d?d?l?l?d?d +?s?d?s?s?d?d +?s?s?d?d?s?d +?d?d?s?d?s?s +?u?u?d?u?u?u?d +?u?l?l?l?l?s?d?d +?s?l?d?l?d?l?d +?l?d?l?l?d?d?s +?d?d?d?d?d?d?d?s?l +?l?l?l?l?s?d?l +?l?l?l?l?l?d?u +?l?d?l?d?l?l?s +?l?d?d?l?l?l?s +?d?d?s?s?u?u +?s?s?l?d?d?l +?l?d?s?d?s?l +?l?s?s?d?l?d +?s?u?l?s?d?d +?l?l?d?d?s?s?s +?l?d?s?s?l?d +?l?s?d?d?l?s +?s?l?d?s?l?d +?d?s?s?l?l?d +?d?d?u?s?u?s +?s?l?d?l?s?d +?s?d?d?l?l?s +?u?s?d?d?s?u +?s?d?d?l?s?l +?l?d?l?l?d?l?l?d +?d?d?d?d?d?s?d?d?d +?l?l?l?l?s?d?d?d?d +?u?u?d?d?l?l?d?d +?s?d?d?d?d?u?u +?d?l?s?l?d?d?d +?d?l?l?d?s?d?d +?u?d?d?u?d?d?s +?d?d?u?s?u?d?d +?l?s?u?d?d?d?d +?l?d?d?d?l?d?s +?l?u?s?d?d?d?d +?l?l?l?u?l?l?l +?l?d?d?d?d?l?d?l +?l?l?l?l?d?d?l?d +?u?d?l?d?d?d?d?d +?u?d?d?d?d?l?d?d +?l?l?l?d?d?l?l?d +?u?u?u?d?l?l?l +?u?d?s?u?u?u +?l?d?l?l?s?u +?u?u?s?l?l?d +?u?s?u?d?l?l +?u?l?d?s?l?l +?u?l?s?l?d?l +?u?u?u?s?d?u +?u?d?l?l?s?l +?u?l?s?u?l?d +?u?d?l?u?s?l +?l?d?l?l?d?l?d?l +?u?u?d?d?l?l?d +?l?d?l?d?l?d?u +?u?l?l?d?d?l?d +?l?d?d?l?l?d?l?d +?d?d?d?d?d?d?d?l?l?l +?l?d?l?d?d?d?l?d +?u?u?u?d?s?s +?s?s?l?l?d?l +?u?l?l?s?d?s +?l?l?l?l?s?d?s +?d?l?l?s?s?l +?l?l?l?l?s?l?l?l diff --git a/masks/rockyou-3-3600.hcmask b/masks/rockyou-3-3600.hcmask new file mode 100644 index 0000000000..94a54fc68d --- /dev/null +++ b/masks/rockyou-3-3600.hcmask @@ -0,0 +1,3971 @@ +?d +?d?d +?l +?d?d?d?d +?d?d?d?d?d?d +?d?d?d?d?d +?l?l +?d?d?d +?u +?s +?l?l?l +?u?u +?l?d +?d?d?d?d?d?d?d +?u?d +?l?l?l?l +?l?l?d?d?d?d +?u?u?u +?l?l?d +?u?l +?l?d?d?d?d +?l?l?l?l?l +?l?l?l?d?d +?l?d?d +?d?d?d?d?l +?l?d?d?d?d?d +?l?l?d?d +?s?d +?l?l?l?d?d?d +?l?l?l?l?d?d +?s?s +?d?d?d?d?l?l +?l?l?d?d?d +?d?d?d?d?d?l +?d?d?d?d?d?d?d?d +?d?l +?u?l?l +?l?s +?l?l?l?l?d +?l?l?l?d +?l?d?d?d +?l?d?l +?l?d?d?d?d?d?d +?u?u?u?u +?l?l?l?l?l?l +?d?d?d?l +?u?u?d +?d?d?d?d?d?d?l +?s?d?d +?u?d?d?d?d +?u?u?u?u?u +?d?l?l +?d?d?d?l?l +?u?u?d?d?d?d +?d?d?d?d?s +?d?d?d?d?u +?l?l?l?d?d?d?d +?l?l?l?l?l?d +?u?l?l?l +?u?u?u?d?d +?d?s?d +?l?s?l +?l?d?d?d?d?l +?d?d?s?d?d +?u?d?d +?d?d?l +?d?d?d?l?l?l +?u?d?d?d?d?d +?d?d?l?d?d +?d?d?s +?d?d?l?l?l +?d?d?l?l +?u?u?u?u?d?d +?l?l?d?d?d?d?d +?l?d?d?l?d?d +?u?l?l?l?l +?u?u?d?d?d +?d?d?l?l?d?d +?u?d?u +?u?u?u?d?d?d +?d?d?d?d?d?u +?u?u?d?d +?u?u?u?u?d +?l?d?l?d +?u?d?d?d +?d?d?u +?d?d?d?d?u?u +?d?l?l?l +?l?s?d +?l?d?d?d?l +?l?d?d?l +?s?d?d?d?d +?d?l?l?l?l +?l?l?s +?d?d?d?d?l?d +?d?d?d?d?d?d?d?d?d +?d?d?l?l?l?l +?l?l?d?l +?d?d?d?l?d +?l?d?l?l +?d?d?d?s +?l?d?l?d?d +?d?d?l?d?d?d +?l?l?l?l?l?d?d +?u?d?d?d?d?d?d +?l?l?l?l?d?d?d +?l?d?l?d?l?d +?s?s?s +?d?d?d?l?d?d +?d?s?d?d +?d?l?d?d?d +?u?u?u?d +?d?l?d?d?d?d +?l?l?l?d?l +?d?l?l?d +?d?l?d?d +?d?d?l?d +?u?l?l?l?d?d +?d?d?d?s?d +?d?d?d?d?d?s +?l?d?l?d?l +?u?l?l?d?d +?u?u?l +?l?d?d?l?d +?u?u?u?u?u?u +?l?l?d?l?l +?d?d?d?d?d?d?u +?l?d?l?l?l +?l?l?d?d?l +?u?d?l +?d?u?u +?d?l?l?l?d +?l?d?l?d?d?d +?d?s?d?d?d +?u?l?d?d?d?d +?u?s?u +?l?d?l?l?d +?d?d?d?d?l?l?l +?d?d?d?u?u +?l?l?d?d?l?l +?d?l?l?l?l?l +?u?l?l?l?d +?d?d?l?d?d?l +?s?d?l +?l?d?d?d?d?d?d?d +?l?u?u +?l?d?d?l?l +?l?l?l?l?s +?d?l?l?d?d +?d?d?l?l?d +?u?u?u?u?u?d +?l?s?d?d +?d?d?d?d?d?l?l +?d?d?s?d?d?d +?d?l?d?l?d +?l?l?d?l?d +?u?l?l?d?d?d +?s?d?s +?s?s?d +?d?l?l?l?d?d +?s?l?l +?u?u?s +?d?d?d?s?d?d +?d?l?l?l?l?d +?l?l?l?s +?l?l?d?d?d?l +?d?d?d?d?d?d?d?l +?s?d?d?d?d?d +?l?l?l?d?d?l +?d?d?d?d?s?d +?l?l?s?d?d +?l?l?l?l?l?l?l +?l?l?d?d?d?d?d?d +?d?d?d?l?l?d +?u?d?d?d?d?u +?l?l?l?l?d?l +?l?d?d?d?l?l +?d?l?d?l?d?l +?d?l?l?d?d?d +?u?l?l?l?l?l +?u?l?l?d +?l?l?l?l?l?l?d +?d?d?d?u?u?u +?u?u?u?d?d?d?d +?l?d?l?l?d?d +?l?l?l?s?d?d +?d?d?s?d +?d?l?d?l +?u?l?l?l?l?d +?u?l?d?d?d +?u?l?u +?l?u?l +?l?l?u +?d?d?l?d?l +?l?d?d?l?l?l +?l?l?d?l?l?d +?d?d?u?d?d +?d?d?d?d?d?d?s +?l?l?l?d?l?l +?l?l?l?l?d?d?d?d +?l?d?d?d?l?d +?d?d?u?u?u +?l?l?d?l?l?l +?l?d?l?l?l?l +?l?l?s?d +?d?l?d?d?l +?d?d?d?d?d?d?d?d?d?d +?d?d?l?l?l?d +?u?l?s +?d?l?d?l?l +?l?l?d?l?d?d +?l?d?l?l?d?l +?l?l?l?s?d +?d?s?d?s?d?d +?d?d?l?l?l?d?d +?u?d?d?u?d?d +?d?l?l?d?l +?s?d?d?d?d?s +?d?s?d?d?d?d +?d?u?u?u +?s?d?d?d?s +?d?d?d?u +?d?d?d?d?s?s +?d?l?d?l?d?d +?l?l?l?d?l?d +?u?u?d?d?d?d?d +?d?l?d?d?l?d +?d?u?u?u?u +?l?l?d?d?l?d +?d?d?d?d?d?d?l?l +?l?l?s?l?l +?u?l?u?l +?l?l?l?l?l?s +?l?d?l?l?l?d +?u?d?u?d?d +?s?d?d?d +?l?s?l?l?l +?u?d?d?d?u +?l?d?d?l?l?d +?l?l?l?l?u +?d?d?l?d?l?d +?u?d?u?u +?l?s?d?d?d?d +?l?d?d?l?d?l +?l?l?l?s?l +?d?d?d?l?d?d?d +?l?d?l?d?d?l +?l?l?s?l +?d?d?u?u?d?d +?d?d?d?d?u?d +?l?d?l?d?l?l +?d?s?d?s?d +?d?l?d?d?d?l +?u?u?l?l +?d?d?l?d?d?d?d +?d?d?d?l?l?l?l +?d?d?d?l?d?l +?l?s?l?l +?u?l?l?l?u +?l?l?l?l?s?d +?d?d?u?u?u?u +?d?d?d?d?l?d?d +?d?d?d?s?s +?u?s?d?d +?u?l?l?d?d?d?d +?d?d?d?s?d?d?d +?u?u?u?u?u?d?d +?l?l?s?d?d?d +?l?l?l?d?d?d?d?d +?s?s?d?d?d +?l?d?d?d?d?d?l +?d?d?d?u?d?d +?l?s?l?d?d +?u?u?u?d?u +?l?l?d?l?d?l +?d?d?u?d?d?d +?u?d?d?u?d +?d?d?d?d?s?d?d +?l?s?d?d?d +?d?d?d?d?u?l +?u?l?u?l?u +?u?u?u?u?d?d?d +?u?d?u?d?u +?l?u?u?u?u +?u?l?l?u +?u?d?u?d?u?d +?d?u?l?l +?u?u?d?u +?l?d?d?d?d?s +?u?d?d?d?d?l +?d?d?l?l?d?l +?d?u?d?d?d +?d?d?d?u?d +?u?l?u?d?d +?u?l?l?l?l?d?d +?u?d?d?u +?d?d?u?u +?l?d?u?d +?u?d?u?d +?u?l?d?d +?d?d?d?d?s?l +?u?u?d?d?u +?d?d?l?d?l?l +?l?s?l?s?l +?d?l?l?d?l?l +?d?u?d?d?d?d +?l?l?l?d?d?s +?u?u?l?l?l +?l?l?l?l?l?l?d?d +?l?s?l?s +?u?d?u?u?u +?s?l?l?l?l +?d?d?s?d?d?d?d +?d?l?l?d?l?d +?d?d?l?l?l?l?l +?d?l?l?d?d?l +?d?u?u?u?u?u +?u?d?u?u?d +?u?d?u?d?d?d +?d?l?d?d?l?l +?l?l?l?l?l?d?d?d +?d?l?l?l?d?l +?s?d?d?d?d?d?d +?d?l?d?l?l?d +?u?u?d?u?u +?u?l?u?d?d?d +?s?l?l?l +?d?u?d?u?d +?u?d?d?d?l +?s?s?s?s +?l?l?d?d?s +?d?s?d?l +?d?d?s?l +?s?l?d?d +?d?l?d?l?l?l +?u?u?u?u?s +?d?u?l?u +?u?d?d?d?d?d?d?d +?l?s?l?d?d?d +?l?u?u?u +?u?u?u?l +?d?d?l?l?d?d?d +?l?l?l?s?s +?u?d?d?l?d +?l?u?d?d?d +?d?d?u?u?d +?l?u?d?d?d?d +?d?d?d?d?d?l?d +?d?u?u?u?d +?s?s?d?d?d?d +?d?d?d?s?l +?d?d?d?d?l?s +?s?s?d?d +?u?l?u?l?d?d +?l?s?l?d +?l?l?l?u +?d?s?d?d?s?d?d +?d?d?s?d?d?s +?u?l?l?l?d?d?d +?u?u?u?s +?d?d?u?d?d?u +?u?d?d?u?u +?l?d?l?d?d?d?d +?d?l?d?d?d?d?d +?d?d?d?d?u?u?u +?u?s?d?d?d?d +?l?l?u?d?d +?u?u?d?u?d +?u?l?l?l?s +?d?d?s?d?s?d?d +?d?d?d?d?d?d?d?u +?d?d?d?d?d?s?d +?u?u?s?d?d +?d?d?d?d?d?u?u +?u?d?l?l?l +?u?u?d?d?u?u +?u?d?l?l?d +?d?d?u?d?u +?u?d?l?d?d +?d?l?l?l?l?l?l +?d?d?d?l?l?d?d +?s?l?l?l?s +?u?u?l?d?d +?d?d?u?l?l +?l?l?u?l?l +?l?s?l?l?l?l +?u?l?d?d?d?d?d +?l?l?d?d?d?s +?u?u?l?d?d?d +?l?d?d?d?d?d?d?l +?l?l?l?l?s?d?d +?l?u?u?d?d?d +?u?l?u?l?l +?l?l?d?d?d?l?l +?l?d?d?d?d?d?d?d?d +?u?u?u?u?u?u?d +?l?l?l?l?s?l +?d?d?d?d?l?l?d +?u?u?u?s?d?d +?l?l?d?d?d?d?l +?d?d?d?d?l?l?l?l +?d?u?u?u?u?d +?l?l?s?l?l?l +?l?l?u?d?d?d +?d?d?d?u?l +?u?l?u?l?d +?u?u?u?u?l +?l?d?d?d?s +?l?u?l?d?d?d +?l?l?l?l?d?s +?u?d?l?l +?d?u?d?u?d?u +?l?u?l?d?d +?d?u?u?d?u +?u?l?d?l +?u?u?d?l +?d?d?s?s?d?d +?l?l?s?d?d?d?d +?u?l?l?u?l +?d?d?s?l?l +?s?d?l?l?l +?l?u?l?l?l +?l?d?d?d?d?l?l +?u?u?d?d?d?d?d?d +?u?l?l?l?l?u +?d?u?u?u?d?d +?u?l?d?d?l +?u?l?d?l?d +?u?u?l?l?d?d +?l?d?l?d?l?d?d +?l?l?l?l?s?s +?u?u?u?u?u?u?u +?l?l?l?d?s +?l?l?l?s?l?l +?d?u?u?d?d?d +?u?u?u?u?d?u +?d?u?l?l?l +?u?d?d?l?d?d +?d?d?d?u?u?d +?l?d?d?d?l?l?l +?d?d?u?l?l?l +?l?l?l?u?u +?u?u?d?d?d?u +?d?d?d?u?l?l +?u?d?l?d?l +?l?u?l?u?l +?d?l?s?l +?s?l?l?d +?u?u?u?s?d +?d?s?l?l +?l?s?d?l +?l?l?d?s?d +?u?u?s?d +?u?s?d?u +?l?d?d?l?d?d?d +?d?u?u?d?d +?d?u?d?d?u +?d?d?d?d?d?d?d?d?l +?l?l?u?u +?u?l?l?d?l +?u?u?u?l?l +?s?l?l?l?l?l +?l?d?d?s?d?d +?l?l?l?s?d?d?d +?l?l?u?u?u +?d?d?s?d?d?s?d?d +?d?l?l?l?d?d?d +?u?u?s?u?u +?u?u?u?d?d?u +?d?d?d?d?d?l?l?l +?d?d?d?s?l?l +?u?s?u?s +?u?s?u?d?d +?u?l?s?d?d +?u?l?l?u?d?d +?u?d?d?l?l +?d?u?l?l?d +?d?u?d?u?u +?u?s?u?u?u +?u?l?d?l?l +?u?d?d?d?u?u +?u?l?l?l?l?l?d +?u?d?u?u?d?d +?s?l?l?l?l?s +?l?l?l?d?l?l?l +?u?d?d?d?d?s +?d?l?l?d?d?d?d +?d?l?l?l?l?l?d +?l?l?s?s?l +?l?d?d?d?l?d?d +?s?d?l?l?l?l +?l?s?l?l?d +?u?d?d?u?u?u +?l?d?l?d?s +?u?u?u?s?u +?d?d?d?d?l?u +?l?d?s?s +?l?d?d?s?d +?s?l?d?d?d +?s?d?d?d?l +?u?s?d?d?d +?d?s?d?d?l +?u?d?u?u?u?u +?u?l?l?s +?u?u?s?u +?d?l?d?l?d?l?d +?u?l?d?d?u +?d?l?l?l?l?d?d +?l?l?l?u?l +?l?l?l?d?d?d?l +?u?s?u?s?u +?d?d?d?d?d?d?d?s +?d?s?d?d?d?d?d +?u?u?s?d?d?d +?u?u?u?d?u?u +?l?l?d?d?l?l?l +?l?l?l?l?l?l?l?l +?l?u?u?u?d +?u?u?l?l?d +?u?l?l?u?d +?d?u?d?d?u?d +?d?u?l?l?l?l +?l?l?l?l?l?u +?u?u?d?u?u?u +?u?u?d?u?u?d +?u?l?l?u?l?l +?u?d?u?u?d?u +?s?s?s?d?d +?d?d?d?l?u +?d?d?u?l?d?d +?d?d?l?d?u +?d?d?d?s?d?d?d?d +?u?l?u?d?d?d?d +?u?u?u?u?u?s +?d?s?l?l?l +?l?s?l?l?d?d +?s?l?d?d?d?d +?u?l?l?l?l?s +?u?s?l?l?l +?d?d?s?d?s?d +?l?u?u?d?d +?l?d?d?l?d?d?l +?s?d?d?d?d?l +?u?d?l?d?l?d +?d?d?s?l?l?l +?s?l?l?l?d?d +?s?d?s?d?d +?d?s?s?d?d +?d?s?d?d?s?d +?d?s?d?d?s +?u?l?u?l?u?l +?u?d?l?l?d?d +?l?s?s?l +?u?u?s?s +?l?l?s?s +?u?d?l?l?l?l +?u?l?l?l?d?l +?d?d?u?d?d?d?d +?l?u?u?u?d?d +?u?l?l?s?d?d +?u?u?d?d?u?d +?d?d?u?u?u?d +?u?u?u?u?d?d?d?d +?l?d?d?d?d?u +?l?l?l?d?d?l?l +?l?l?l?u?d +?l?s?l?d?d?d?d +?u?u?d?u?d?d +?d?d?d?u?d?d?d +?u?u?u?u?s?d +?u?l?l?s?d +?l?s?l?d?l +?l?l?l?d?d?d?d?d?d +?u?l?u?u?l +?u?d?d?d?u?d +?d?u?d?u?d?d +?l?s?l?s?d?d +?s?d?d?s?d?d +?d?d?d?d?d?d?u?u +?u?d?l?l?d?l +?d?d?d?d?s?u +?l?l?d?d?l?d?d +?l?l?d?l?s +?l?d?l?l?d?d?d +?s?s?s?s?s +?u?d?l?d?d?d +?d?d?u?d?u?d +?l?l?l?l?l?l?l?d +?d?l?d?s?d +?d?d?s?d?l +?d?d?d?s?u +?u?d?u?u?u?d +?l?l?d?s?d?d +?u?s?u?d?d?d +?u?l?l?l?l?l?l +?l?l?l?l?l?d?l +?d?d?d?d?u?d?d +?l?l?l?l?l?l?s +?s?s?s?d?d?d +?d?d?l?l?s +?s?l?l?d?d +?l?l?l?u?d?d +?u?l?l?l?d?d?d?d +?u?u?l?l?l?l +?l?l?d?d?d?d?s +?l?d?l?d?l?d?l +?s?s?l?l?l +?u?d?d?d?d?d?u +?l?l?l?d?u +?l?u?u?l +?u?l?u?u +?l?u?l?l +?l?l?u?l +?l?u?l?u +?d?d?d?u?u?u?u +?u?d?u?d?d?u +?l?l?d?d?s?d +?s?s?s?l +?l?l?l?d?s?d +?l?l?s?l?d?d +?d?d?d?l?l?s +?u?l?l?u?u +?l?l?l?l?d?d?l +?l?d?l?l?s +?l?d?d?l?l?d?d +?u?l?d?d?d?d?d?d +?l?l?l?d?d?d?s +?u?d?u?d?u?u +?u?u?u?d?u?d +?l?s?l?l?l?d +?l?d?d?d?s?d +?l?d?s?d?d?d +?d?d?u?u?u?d?d +?d?d?d?s?s?s +?u?u?u?s?s +?l?l?l?l?d?d?s +?l?s?l?s?d +?l?l?s?l?d +?d?d?d?l?l?l?d +?l?l?l?l?d?l?l +?s?d?s?d?d?d +?d?d?s?d?s +?u?l?l?l?s?d +?l?l?d?l?l?l?l +?l?l?d?l?l?d?d +?u?u?d?d?s +?l?d?s?l?d +?l?d?d?l?s +?d?s?l?l?l?l +?l?d?d?u?d?d +?u?l?d?d?l?l +?u?d?d?l?l?l +?l?d?l?l?u +?l?l?u?u?d +?u?u?u?l?d +?s?d?d?d?d?d?s +?u?l?l?l?u?d +?l?s?d?l?l +?u?s?u?u +?u?l?s?l +?l?u?s?l +?d?d?l?l?l?l?d?d +?l?s?d?d?d?d?d +?d?d?l?u?l +?d?d?l?l?u +?l?l?d?d?u +?u?l?d?u?d +?l?l?l?l?l?s?d +?d?d?d?d?d?s?l +?u?l?l?d?l?l +?l?d?l?l?l?d?d +?l?u?u?u?u?u +?u?u?u?l?l?l +?d?s?d?s?d?s +?d?l?d?d?l?d?d +?d?l?l?l?l?s +?u?l?u?u?u +?d?d?l?d?l?d?d +?l?d?d?d?d?d?s +?u?d?d?d?l?l +?d?d?d?l?d?d?d?d +?d?d?d?d?l?l?d?d +?u?l?d?l?l?l +?l?l?s?l?l?d +?l?d?s?l?l +?d?d?d?d?s?l?l +?l?l?l?l?d?l?d +?d?d?d?l?s?l +?d?d?l?l?l?s +?l?u?l?l?u +?l?d?l?l?l?l?l +?d?d?l?l?d?d?d?d +?d?d?d?d?l?d?d?d +?l?d?d?u?d +?d?d?d?u?d?u +?l?l?d?l?d?d?d +?u?d?l?d?u?d +?d?u?l?d?d +?d?u?d?d?l +?d?d?d?d?d?s?s +?l?l?l?l?l?d?d?d?d +?l?l?d?d?d?d?d?d?d +?u?u?l?l?l?d +?d?d?d?d?l?d?l +?l?u?l?l?d?d +?u?d?d?u?u?d +?l?d?d?d?d?l?d +?l?s?s?l?l +?d?u?l?l?l?d +?d?d?s?d?d?l +?s?l?l?l?d +?d?l?l?l?s +?u?d?d?u?d?u +?s?l?s?l +?l?s?l?l?s +?s?u?u?s +?s?l?l?s +?s?s?l?l +?l?u?u?u?u?d +?l?s?d?d?l +?d?l?d?l?s +?d?s?d?l?l +?s?l?l?d?d?d +?d?l?s?l?d +?l?l?d?d?s?s +?u?u?d?l?l +?l?u?l?u?d +?d?d?d?l?l?d?d?d +?l?l?u?u?d?d +?u?l?l?d?d?l +?d?d?d?d?d?d?l?d +?d?d?d?d?u?l?l +?l?l?l?d?l?d?d +?u?d?d?l?l?d +?l?d?d?d?l?d?d?d +?l?d?l?s?d?d +?u?u?u?d?d?s +?l?l?d?s?l +?l?d?d?l?d?l?d +?l?s?l?s?l?s +?u?l?u?l?l?l +?d?d?u?d?u?u +?u?d?l?l?l?d +?u?u?d?d?l?l +?s?l?l?l?l?d +?l?l?l?l?u?d +?l?d?l?d?d?l?d +?u?l?u?l?u?d +?s?d?d?l?d +?u?d?d?d?s +?d?d?d?l?s +?u?d?d?s?d +?l?d?s?d?d +?d?d?d?u?s +?d?s?d?l?d +?u?l?l?d?l?d +?d?l?d?l?u +?u?l?d?l?d?d +?u?d?d?l?u +?d?d?l?u?u +?l?d?u?l?d +?d?u?d?l?u +?u?d?l?d?u +?d?l?l?u?d +?l?d?u?d?l +?d?d?l?d?d?l?d +?s?d?d?l?l?l +?u?u?u?d?d?d?d?d +?d?d?l?l?l?l?d +?d?d?d?l?l?l?l?l +?u?u?d?u?d?u +?l?u?u?l?d +?l?l?u?l?u +?l?u?l?l?d +?u?u?l?u?u +?l?l?u?l?d +?d?d?u?l?l?d?d +?l?d?d?l?l?l?l +?d?d?l?d?d?d?d?d +?u?d?d?l?d?l +?l?l?l?s?l?d +?d?d?d?d?d?d?d?d?d?d?d +?u?u?d?d?d?s +?d?l?d?l?d?d?d +?l?s?s?d?d +?l?d?l?l?d?l?d +?u?l?d?l?l?d +?u?u?u?d?d?l +?l?l?u?l?d?d +?d?d?d?d?u?s +?d?l?d?s?d?d +?d?d?u?d?d?l +?d?d?l?u?d?d +?u?d?d?d?l?d +?u?s?u?u?d +?s?l?l?d?l +?u?l?s?d?d?d +?u?u?u?u?u?u?d?d +?l?u?u?l?l +?s?d?s?d?s?d +?l?l?d?d?l?l?d +?l?d?l?d?l?d?l?d +?d?d?l?d?d?d?l +?d?d?d?l?d?d?l +?l?l?l?l?u?u +?d?d?d?u?l?u +?u?u?d?d?d?l +?d?d?u?u?u?u?u +?l?l?s?s?s +?l?l?l?s?s?s +?l?l?d?d?d?d?l?l +?d?s?d?d?l?l +?u?d?l?d?l?l +?u?d?d?d?d?d?l +?u?s?u?l?l +?l?u?u?u?l +?u?u?l?l?u +?l?l?u?u?l +?d?d?d?d?d?u?d +?d?d?d?s?l?l?l +?u?u?u?l?d?d +?d?d?s?s?d +?s?d?d?s?d +?d?d?d?d?d?u?l +?d?d?u?u?d?u +?u?l?d?d?l?d +?d?u?l?l?d?d +?l?u?l?u?d?d +?l?d?d?s?l +?l?s?d?l?d +?s?d?l?l?d +?s?l?d?d?l +?l?d?l?s?d +?d?d?s?u?u +?u?d?l?s?d +?s?d?d?l?l +?u?l?l?l?l?l?d?d +?d?d?d?d?d?d?d?l?l +?d?u?d?d?d?u +?d?u?l?d?d?d +?l?s?d?l?l?l +?l?l?d?d?l?l?d?d +?d?l?l?l?u +?u?l?u?u?d +?d?u?l?u?l +?u?l?u?u?d?d +?u?l?d?l?u +?u?l?d?u?l +?u?d?u?l?l +?l?d?l?u?l +?s?d?d?d?d?d?d?d +?l?d?l?d?l?s +?u?l?l?s?l +?u?l?l?s?u +?d?u?u?d?d?u +?d?u?u?u?d?u +?d?u?u?d?u?u +?l?d?l?d?s?d +?l?l?l?s?l?l?l +?d?d?d?d?l?l?s +?u?u?u?l?u +?s?u?u?u?s +?d?d?s?s?s +?s?s?d?d?s +?l?d?l?d?l?l?d +?u?d?d?s?d?d +?d?d?d?d?d?d?s?d +?l?l?s?s?d +?l?d?d?d?d?d?d?d?l +?u?l?u?l?d?d?d +?u?l?d?d?d?l +?l?l?l?u?u?u +?l?l?d?d?d?l?d +?u?l?d?d?u?l +?u?l?l?d?d?s +?u?u?u?u?u?d?d?d +?d?d?d?d?d?d?l?l?l +?u?s?u?s?d?d +?d?l?d?d?d?d?d?d +?l?u?l?d?d?d?d +?l?d?l?l?l?s +?d?u?d?l?d?d +?d?d?d?l?l?u +?u?d?u?d?d?d?d +?d?d?d?d?d?l?s +?u?d?d?d?d?d?d?d?d +?d?u?d?d?d?d?d +?d?u?u?u?u?u?u +?u?l?u?l?l?d +?u?s?u?u?u?u +?l?d?d?s?s +?s?l?d?d?s +?l?d?s?s?d +?d?l?d?s?s +?s?u?d?d?d?d +?d?d?s?l?d?d +?s?l?l?d?d?s +?l?l?l?d?l?l?d +?l?d?d?l?d?d?d?d +?l?l?s?d?l +?u?l?l?d?s +?u?s?l?d?l +?d?d?l?d?d?l?d?d +?u?d?l?d?d?l +?d?u?d?u?u?d +?u?l?l?l?u?l +?u?l?l?s?s +?u?l?l?l?l?d?d?d +?l?l?l?d?d?u +?d?d?d?d?d?l?d?d +?s?s?s?s?d +?l?u?l?u?u +?l?d?l?d?l?l?l +?d?d?d?d?s?d?d?d +?d?d?l?d?d?l?l +?l?l?s?s?d?d +?s?u?u?u?u +?u?l?s?u?l +?u?l?u?l?s +?l?d?l?l?l?l?d +?l?u?l?d?l +?l?u?d?l?l +?l?d?u?u?u +?u?l?u?d?l +?u?l?l?d?u +?l?d?l?u?u +?l?l?d?d?s?d?d +?d?d?l?l?l?l?l?l +?l?l?d?l?l?s +?d?d?d?s?s?d +?d?s?d?d?d?s +?l?l?l?s?d?d?d?d +?d?d?s?d?l?l +?l?d?d?d?l?s +?l?d?l?d?d?s +?d?d?d?u?u?l +?l?d?l?l?d?l?l +?l?l?d?l?l?l?d +?u?d?l?l?d?u +?u?l?d?l?d?l +?u?u?s?d?d?d?d +?l?l?u?l?l?l +?u?l?l?d?d?d?d?d +?u?d?d?d?d?u?u +?d?l?d?l?d?d?l +?d?d?l?d?d?u +?d?d?l?l?d?d?l +?d?l?u?d?d?d +?l?d?l?d?d?d?d?d +?d?d?d?s?d?l +?u?l?d?d?d?s +?d?d?d?s?u?u +?l?l?l?u?l?l +?l?l?l?d?d?l?d +?u?l?l?l?d?s +?d?l?l?l?d?d?d?d +?u?u?d?d?l +?d?l?l?d?u +?l?d?d?u?l +?l?d?d?u?u +?d?u?u?d?u?d +?l?u?d?l?d +?u?d?u?d?l +?d?l?u?l?d +?l?d?l?d?u +?u?d?d?u?l +?l?d?u?u?d +?d?u?d?u?l +?d?u?u?d?l +?d?l?u?u?d +?d?d?u?u?l +?u?d?u?l?d +?d?u?l?u?d +?u?u?d?l?d +?l?d?l?u?d +?d?u?d?l?l +?l?d?u?d?u +?u?d?l?u?d +?s?d?d?d?d?d?d?s +?l?u?l?l?l?l +?u?s?l?l?l?l +?u?u?u?u?s?u +?u?u?u?u?s?s +?s?d?s?d?s +?d?s?d?s?s +?l?l?d?l?l?d?l +?u?l?d?u?l?d +?l?d?l?l?l?d?l +?u?l?l?l?u?u +?s?l?d?l?s +?u?s?u?s?d +?l?d?l?s?s +?d?d?l?l?s?d +?u?d?d?d?d?d?d?u +?u?u?s?u?u?u +?l?s?l?l?d?l +?d?d?d?d?d?d?u?l +?l?l?d?d?u?u +?u?l?l?d?d?u +?u?s?u?d?d?d?d +?d?d?d?d?d?d?s?l +?s?d?u?u?u +?u?u?u?d?s +?u?u?s?u?d +?d?l?s?l?l +?l?l?l?d?l?s +?d?d?d?u?l?l?l +?l?l?d?d?d?u +?d?u?d?d?u?u +?l?l?l?l?l?d?s +?u?l?d?d?l?u +?d?d?d?d?d?d?s?s +?l?u?l?u?l?u +?l?l?l?l?d?d?d?d?d +?l?d?d?d?l?l?d +?d?d?d?l?d?l?d +?d?d?u?u?d?d?d +?d?d?d?l?l?l?s +?l?d?l?l?d?d?l +?s?d?u?u?u?u +?l?l?d?l?d?l?d +?d?l?d?l?l?d?d +?u?u?d?l?l?l +?l?l?s?l?s +?l?l?d?d?l?d?l +?u?d?s?d?d?d +?d?d?s?d?l?d +?s?d?d?d?d?u +?d?d?l?d?d?s +?s?d?l?d?d?d +?d?d?l?s?d?d +?l?d?d?l?l?l?d +?l?d?l?l?d?s +?u?l?s?l?l +?d?d?d?s?d?s +?s?d?d?d?s?d +?d?s?s?d?d?d +?l?u?d?d?d?d?d +?s?s?l?l?l?l +?l?d?u?d?l?d +?u?u?l?d?d?d?d +?u?d?d?u?s +?l?d?d?s?u +?s?d?u?u?d +?d?l?l?d?s +?l?u?s?d?d +?s?l?d?l?d +?d?d?u?s?u +?d?d?u?l?s +?l?d?l?s?l?d +?d?s?l?d?l +?u?d?u?d?s +?l?s?d?d?d?l +?u?d?l?d?s +?d?d?l?s?l +?d?l?d?d?d?l?d +?d?d?d?u?u?d?d +?d?d?d?u?l?d +?d?d?d?l?d?d?d?l +?d?l?d?u?d?d +?d?l?d?d?d?d?l +?d?d?l?d?u?d +?d?d?d?d?d?s?d?d +?l?l?u?d?d?d?d +?d?d?u?u?l?l +?u?d?u?u?l +?l?d?u?l?l +?u?u?l?d?u +?u?u?l?d?l +?l?l?u?d?l +?d?u?l?l?u +?u?u?u?d?l +?u?u?d?u?l +?u?l?d?u?u +?u?d?l?u?d?l +?u?u?l?u?d +?l?u?d?u?u +?l?l?d?u?l +?s?s?s?s?s?s +?d?d?d?d?l?s?l +?l?l?d?d?l?s +?l?l?l?l?l?l?d?d?d +?d?d?s?d?d?d?d?d +?l?s?d?s?d?d +?u?u?u?u?s?d?d +?d?d?s?d?d?s?d +?l?l?u?u?u?u +?u?d?d?d?d?d?d?l +?d?d?d?l?l?l?d?d +?d?d?l?l?l?u +?l?u?u?l?d?d +?l?u?u?d?d?d?d +?u?l?l?u?l?d +?s?l?l?d?d?d?d +?l?s?s?s?l +?s?s?s?l?l +?d?d?u?l?l?l?l +?l?l?l?s?d?l +?l?l?d?d?s?d?l +?l?d?l?d?d?d?l +?d?d?d?d?d?d?d?d?u +?s?l?l?d?s +?s?u?u?u?u?s +?l?l?l?l?u?l +?u?u?u?u?l?l +?l?l?l?l?d?u +?l?d?d?d?s?l +?s?d?d?d?l?l +?d?l?l?s?d?d +?l?d?d?l?d?s +?u?l?d?d?d?u +?l?d?l?u?d?d +?d?d?d?l?u?l +?d?d?d?l?u?u +?l?l?l?s?u +?d?d?u?l?u?l +?u?d?d?u?l?l +?l?l?s?s?l?l +?l?l?l?d?l?d?l +?u?u?u?s?u?u +?u?u?d?d?d?d?u +?l?d?d?s?d?d?d +?l?l?l?s?s?d +?u?u?l?l?d?d?d +?d?l?l?l?l?d?l +?s?s?d?d?s?s +?u?l?u?l?u?d?d +?u?u?d?d?d?u?u +?l?d?d?l?l?d?l +?u?u?u?u?u?l +?d?u?d?u?u?u +?l?s?l?s?l?d +?d?d?d?l?d?l?l +?d?d?d?d?s?s?s +?u?u?s?s?u +?s?l?s?l?l +?d?l?l?d?l?l?d +?l?d?d?d?l?d?l +?u?l?l?l?s?d?d +?l?s?l?l?l?d?d +?u?l?s?d?d?d?d +?d?s?d?l?l?l +?l?s?l?d?l?d +?u?u?u?l?l?d +?l?d?d?l?d?l?l +?u?s?l?d?d?d +?l?d?s?l?d?d +?s?s?d?d?d?d?d +?l?l?d?l?d?l?l +?d?d?d?d?d?d?d?d?s +?l?d?l?d?d?l?d?d +?d?s?d?s?d?d?d?d +?u?d?l?d?d?d?d +?u?u?u?s?d?d?d +?s?d?l?d?s +?d?s?l?d?s +?s?d?d?s?l +?s?l?s?d?d +?l?s?d?s?d +?d?d?s?s?u +?l?s?d?d?d?s +?d?d?s?l?s +?d?d?d?d?u?l?u +?l?l?s?l?l?l?l +?l?l?s?l?l?s +?u?u?u?u?d?s +?d?s?d?l?d?d +?d?l?d?d?d?s +?d?d?d?l?s?d +?d?l?s?d?d?d +?d?d?s?d?d?u +?d?d?u?s?d?d +?d?d?d?s?l?d +?d?s?d?s?d?s?d +?d?d?l?u?l?d?d +?d?d?l?d?l?d?l +?l?l?l?d?d?l?l?l +?u?l?l?l?d?u +?l?u?l?l?l?d +?d?l?u?l?s +?d?l?l?s?l +?u?s?d?u?u +?u?u?d?u?s +?l?d?l?s?l +?l?d?d?d?d?l?d?d +?l?l?l?l?l?s?l +?d?u?l?u?d?d +?l?l?d?u?d?d +?d?u?d?l?d?l +?d?d?u?l?d?l +?u?d?u?l?d?d +?u?d?d?d?l?u +?u?d?d?l?d?u +?l?d?u?l?d?d +?l?l?l?l?l?l?l?d?d +?d?u?u?d?d?d?d +?u?d?d?u?d?d?d +?u?u?l?l?l?d?d +?l?l?u?l?l?d +?l?u?u?l?u +?u?u?l?u?l +?d?d?s?l?l?l?l +?l?s?u?u?u +?l?l?s?d?l?l +?s?u?l?l?l +?s?l?s?l?s +?d?u?l?u?l?d +?d?l?l?l?s?d +?u?l?l?l?u?d?d +?d?d?d?d?u?u?d +?d?s?d?d?d?d?d?d +?d?l?d?l?l?l?l +?d?d?l?l?l?d?d?d +?l?l?s?l?l?d?d +?l?l?l?d?d?d?d?l +?l?d?d?s?l?d?d +?s?l?d?d?d?s +?d?l?d?l?d?l?l +?l?s?d?d?d?d?d?d +?l?d?d?d?d?d?d?s +?u?l?l?l?s?s +?d?d?d?d?u?u?u?u +?l?s?d?l?d?d +?s?d?l?l?d?d +?s?l?l?s?l +?s?u?l?l?s +?d?l?d?d?l?l?d +?l?l?s?d?d?s +?d?d?d?d?d?l?l?d +?l?l?l?u?l?d +?u?d?d?d?u?d?d +?u?s?u?u?d?d +?d?l?d?d?l?d?l +?l?l?l?l?d?s?d +?u?u?l?u?d?d +?l?d?s?l?l?l +?d?d?d?d?s?d?d?d?d +?u?s?d?d?d?d?d +?d?l?l?l?l?u +?d?l?l?l?d?l?l +?l?l?l?u?u?d +?l?l?l?l?l?s?d?d +?u?s?u?s?u?s +?d?l?l?d?l?d?d +?d?d?d?l?u?d +?d?u?d?d?l?d +?l?l?l?s?s?l +?l?s?l?d?d?l +?d?d?s?u?u?u +?u?s?l?l?d?d +?d?l?l?l?d?s +?u?u?s?u?d?d +?s?l?l?l?l?d?d +?l?d?l?d?d?l?l +?d?l?l?d?d?l?d +?d?d?s?d?d?l?l +?l?s?l?l?s?l +?l?l?u?u?l?l +?d?u?u?u?d?d?d +?u?u?d?l?l?d +?l?d?l?l?d?u +?d?u?d?l?d?u +?u?d?d?u?l?d +?u?d?l?d?l?u +?u?l?l?d?u?d +?d?d?d?l?l?d?l +?u?d?u?d?u?d?d +?u?d?l?d?d?u +?d?l?d?u?d?l +?l?u?d?l?d?d +?l?l?l?d?s?d?d +?s?l?s?d?d?d +?l?d?d?d?s?s +?d?l?l?l?l?l?l?l +?l?l?l?d?s?s +?l?d?d?d?d?d?d?d?d?d +?l?s?l?d?l?l +?s?d?d?s?s +?d?d?d?d?l?l?l?d +?s?u?u?u?d?d +?l?d?d?l?l?s +?l?l?d?l?d?d?l +?u?u?d?d?d?d?s +?l?d?l?l?s?l +?d?s?s?l?l +?l?s?s?l?d +?d?s?l?s?l +?l?l?s?d?s +?l?s?d?s?l +?s?l?s?l?d +?d?l?l?s?s +?l?u?d?s?s +?l?s?l?d?s +?d?d?l?l?s?s +?l?l?d?s?s +?u?s?l?s?d +?s?u?u?u?u?u +?l?l?l?l?s?l?l +?l?d?d?s?d?l +?l?d?d?s?l?d +?l?d?s?d?d?l +?u?l?d?d?d?d?s +?d?d?d?u?s?u +?d?s?l?l?d?d +?d?d?d?u?u?s +?u?d?d?d?d?d?s +?u?l?l?u?s +?d?d?d?d?d?d?l?s +?s?s?u?u?u +?u?l?l?u?d?d?d +?s?s?l?s?s +?l?l?d?s?l?l +?u?u?s?u?u?d +?d?d?s?s?l?l +?l?s?l?l?l?l?l +?u?s?u?l?l?l +?u?u?l?l?u?u +?d?s?s?s?s +?u?d?l?l?l?u +?u?u?u?u?l?d +?l?l?d?l?s?l +?u?d?d?d?u?u?u +?d?d?l?l?d?l?d +?l?l?l?d?d?s?d +?l?s?l?s?s +?l?l?l?s?d?s +?d?l?d?l?l?d?l +?d?l?d?l?d?l?d?l +?l?d?s?d?d?d?d +?s?d?d?d?d?d?l +?d?d?u?l?u?d?d +?d?l?l?d?d?d?l +?s?l?l?s?d?d +?u?u?u?d?l?l +?l?s?l?l?l?s +?l?s?s?l?l?l +?u?l?u?u?l?u +?d?l?l?d?l?l?l +?u?u?u?d?s?d +?l?d?l?l?s?d +?l?d?l?d?s?l +?s?l?l?l?d?d?d +?u?l?d?l?u?d +?d?d?l?l?u?u +?u?d?d?l?l?u +?l?d?l?u?d?l +?u?d?l?u?l?d +?u?s?l?l?l?d +?d?s?l?d?d?d +?d?u?d?s?d?d +?u?d?d?d?s?d +?d?d?d?l?d?s +?s?d?d?l?d?d +?d?u?d?d?d?s +?d?l?l?l?d?l?d +?l?d?s?l?d?s +?d?d?d?d?l?d?d?d?d +?s?l?l?l?d?s +?l?d?l?l?d?d?d?d +?d?d?u?u?d?l +?u?d?l?u?d?d +?u?u?d?d?l?d +?u?u?d?l?d?d +?d?l?l?d?d?u +?d?l?u?l?d?d +?u?d?u?d?d?l +?d?d?u?l?l?d +?u?d?d?d?u?l +?u?l?d?d?u?d +?d?u?l?d?l?d +?d?d?l?d?u?l +?u?l?u?u?l?d +?u?l?l?l?l?l?s +?d?u?l?l?l?l?l +?l?l?l?d?s?l +?s?l?l?l?l?l?l +?s?d?l?l?l?d +?l?l?d?l?d?s +?d?l?l?d?d?s +?l?s?d?d?l?l +?d?l?d?l?d?s +?l?d?d?l?s?d +?s?l?l?l?l?l?s +?d?d?l?d?l?l?l +?d?d?l?l?d?l?l +?d?l?d?d?l?l?l +?s?s?d?d?d?s +?s?l?d?d?d?d?d +?d?d?d?d?d?u?u?u +?d?l?d?l?l?l?d +?s?d?l?l?l?l?l +?l?l?l?s?l?d?d +?l?l?d?d?d?d?d?l +?l?l?l?d?u?u +?l?d?l?d?l?u +?l?u?l?d?u +?l?u?d?l?u +?u?l?u?d?u?d +?d?l?u?l?u +?u?d?l?l?u +?l?l?d?l?u +?l?d?l?l?l?u +?l?d?u?u?l +?d?d?u?l?l?u +?l?u?u?d?l +?l?u?u?d?u +?u?l?d?d?u?u +?d?u?l?l?d?l +?l?d?u?u?l?d +?u?d?l?l?u?d +?u?u?d?l?u +?d?l?l?u?u +?d?l?l?u?l +?d?l?u?u?u +?l?u?d?u?l +?u?d?l?u?l +?l?d?l?d?l?d?d?d +?s?s?s?d?d?d?d +?u?u?u?d?d?d?u +?l?l?l?d?d?d?d?s +?l?l?l?l?s?d?d?d +?l?s?s?s?d +?l?u?u?u?u?d?d +?l?l?l?s?l?s +?l?d?l?s?l?l +?l?s?l?s?d?d?d +?s?d?d?d?s?l +?s?s?l?d?d?d +?d?d?d?d?d?d?d?d?d?l +?u?d?d?d?d?l?l +?l?u?l?l?u?l +?l?l?u?u?u?d +?u?s?u?u?s +?u?s?s?u?u +?u?d?d?d?d?u?d +?d?d?d?d?d?l?u +?l?l?l?l?l?s?s +?d?l?l?l?s?l +?u?s?u?u?u?d +?u?d?d?u?d?d?u +?u?l?l?l?s?l +?u?u?d?d?s?s +?d?u?u?u?u?u?d +?l?d?l?u?l?l +?u?l?l?u?u?d +?u?u?u?d?u?u?u +?l?l?l?l?u?d?d +?u?d?d?l?l?d?d +?d?d?d?d?l?l?u +?d?d?l?d?l?l?d +?d?u?u?u?u?d?d +?d?l?s?l?l?l +?l?u?u?u?s +?u?s?l?l?u +?l?l?l?u?s +?d?l?l?s?l?l +?l?d?d?u?u?u +?u?l?u?d?d?l +?u?l?u?d?d?u +?l?d?d?u?l?l +?l?l?d?d?u?l +?u?u?l?d?l?d +?u?l?u?d?l?d +?d?d?l?u?l?l +?d?u?l?l?d?u +?u?u?u?u?u?u?u?d +?l?l?d?u?l?l +?u?l?l?d?l?u +?u?l?l?u?d?l +?d?l?l?u?l?l +?d?l?l?l?l?l?l?d +?u?l?l?s?d?d?d +?u?l?l?l?s?u +?s?s?l?l?d?d +?l?l?s?d?d?l +?d?d?l?l?s?l +?l?s?d?l?l?d +?l?l?s?d?l?d +?u?u?u?u?u?u?u?u +?d?l?l?d?l?d?l +?d?d?d?d?u?u?l +?l?d?d?l?d?l?d?d +?l?d?d?d?d?s?d +?d?d?d?d?d?s?u +?u?l?s?l?l?l +?s?s?s?s?d?d +?u?l?d?l?l?u +?l?s?l?s?l?l +?d?l?l?d?d?l?l +?l?l?l?d?d?s?s +?d?s?d?s?d?d?l +?s?l?d?l?d?d +?d?l?l?d?s?d +?d?l?d?d?l?s +?l?l?s?l?d?l +?s?l?l?l?d?l +?u?u?u?u?u?u?s +?u?d?d?d?d?l?d +?d?d?d?d?u?d?u +?u?l?l?d?u?l +?l?u?l?l?d?l +?l?d?l?d?s?s +?l?s?s?d?d?d +?d?l?l?d?d?d?d?d +?l?l?l?l?s?u +?u?d?u?d?l?l +?l?u?u?d?d?l +?l?l?d?u?u?d +?u?d?l?d?u?l +?u?u?u?d?l?d +?l?u?d?d?l?u +?l?u?d?l?l?d +?d?d?d?s?d?d?l +?u?u?d?d?u?u?u +?u?s?u?l?d +?u?l?s?l?d +?l?u?u?s?d +?u?s?u?d?u +?d?u?u?l?s +?l?d?d?s?l?l +?s?l?d?l?l +?u?d?u?u?s +?u?d?l?l?s +?l?u?l?d?s +?l?u?d?l?s +?d?u?s?u?u +?s?d?u?l?l +?s?l?d?l?d?l +?s?u?d?l?l +?u?s?l?l?d +?u?d?s?u?u +?u?u?s?d?u +?l?l?d?u?s +?s?u?d?u?l +?u?u?l?s?d +?l?u?l?s?d?d +?l?d?s?u?u +?l?d?s?l?d?l +?l?d?l?s?u +?l?l?d?d?s?l +?u?l?d?l?s +?u?l?u?l?l?u +?l?d?d?l?u?d +?d?l?u?d?l?d +?d?u?l?d?d?u +?l?l?d?d?u?d +?l?d?d?d?u?l +?l?d?d?d?u?u +?d?l?u?u?d?d +?d?l?l?l?d?d?l +?u?d?u?u?d?d?d +?l?u?d?d?l?d +?u?l?d?u?d?d +?d?d?l?u?l?d +?d?u?d?l?l?d +?l?d?u?d?d?l +?d?l?l?u?d?d +?d?d?u?d?u?l +?u?d?u?d?l?d +?u?l?l?l?l?l?l?d +?l?l?u?u?l?d +?u?l?u?u?u?d +?u?l?l?l?l?s?d +?u?l?l?s?l?l +?l?l?d?l?d?d?d?d +?l?l?d?s?d?d?d +?l?l?d?d?d?s?d +?d?d?l?l?d?d?s +?u?u?s?s?s +?s?l?l?s?s +?l?s?l?l?d?d?d +?s?l?s?l?d?d +?u?d?d?l?d?d?d +?l?s?s?s?s +?u?d?l?l?l?d?d +?l?l?l?d?l?l?l?l +?s?d?d?d?d?l?l +?d?d?l?l?d?d?l?l +?l?l?u?d?l?l +?d?d?l?l?l?d?l +?u?d?d?u?u?d?d +?d?u?d?u?d?u?d +?u?u?d?d?d?d?l +?u?l?u?l?d?d?d?d +?l?d?l?d?l?d?s +?u?s?l?s?u +?u?l?s?s?l +?l?s?u?s?l +?u?s?l?l?s +?u?s?l?s?l +?d?d?l?l?l?l?s +?s?l?d?d?l?l +?u?l?u?s?d?d +?d?l?d?l?s?l +?d?s?l?l?l?d +?d?l?l?d?l?s +?u?l?l?d?s?d +?l?l?d?d?d?d?u +?l?d?d?l?u?u +?u?u?l?d?d?l +?u?d?u?l?l?d +?l?u?d?d?l?l +?l?d?l?u?l?d +?l?u?l?d?d?l +?l?u?l?d?l?d +?l?d?d?l?d?d?l?d +?l?l?l?d?d?d?l?l +?s?d?u?l?l?l +?s?l?d?l?l?l +?d?l?d?l?d?d?d?d +?u?u?u?d?d?d?s +?d?s?d?d?d?d?l +?s?l?l?l?s?d +?l?l?l?d?u?l +?u?d?u?l?l?l +?l?u?d?l?l?l +?l?l?l?d?l?u +?d?d?d?d?u?d?d?d +?l?s?s?l?d?d +?s?s?d?d?l?l +?l?d?d?l?s?s +?u?u?u?s?s?s +?l?l?l?u?d?d?d +?s?u?l?l?l?s +?u?u?u?l?l?d?d +?u?d?l?l?d?d?d +?d?l?d?d?d?u +?l?d?d?d?u?d +?d?l?d?d?u?d +?l?d?u?d?d?d +?l?d?d?u?d?d?d +?d?d?u?d?l?d +?d?l?l?l?l?l?d?d +?l?u?u?u?d?d?d +?d?d?l?l?l?d?d?d?d +?u?u?u?d?d?d?d?d?d +?s?d?d?d?l?l?l +?u?l?d?u?l?l +?l?u?l?d?l?l +?l?l?l?u?d?l +?u?l?u?u?l?l +?u?l?l?u?l?u +?u?d?l?d?l?d?d +?u?u?d?d?u?d?d +?d?d?d?d?l?l?l?l?l +?l?s?d?d?s?d +?d?d?d?d?d?d?l?u +?u?l?s?u?l?l +?l?d?d?d?s?d?d +?d?s?u?u?u?u +?d?d?d?d?u?l?l?l +?d?s?d?d?s?s +?s?d?s?d?d?s +?l?u?d?d?d?d?d?d +?d?d?u?d?d?d?d?d +?l?d?d?d?d?d?l?l +?d?d?u?u?u?s +?u?l?l?l?d?d?s +?u?l?l?l?l?u?d +?u?l?l?u?l?l?d +?l?l?l?l?d?l?l?l +?s?s?s?l?l?l +?l?d?u?s?s +?s?l?s?u?d +?s?l?l?s?d +?l?s?s?d?l +?s?s?d?l?l +?u?d?s?s?u +?u?s?s?u?d +?l?d?s?l?s +?u?l?d?d?s?s +?u?l?d?s?s +?u?u?s?s?d +?s?s?l?d?l +?s?d?s?l?l +?s?u?d?u?s +?s?u?u?s?d +?s?s?l?l?d +?d?s?l?l?s +?s?s?u?d?u +?u?d?l?s?s +?u?u?d?u?u?u?u +?u?l?l?l?l?l?u +?l?l?d?l?l?u +?l?d?u?l?l?l +?s?d?d?d?u?u +?d?s?d?l?l?d +?u?d?l?s?d?d +?d?u?l?s?d?d +?d?d?s?l?l?d +?l?u?s?d?d?d +?u?l?d?s?d?d +?d?l?s?d?l?d +?u?d?d?u?s?d +?d?l?s?l?d?d +?d?d?l?d?l?s +?u?u?d?d?s?d +?d?d?u?l?d?d?d +?l?d?d?d?d?d?u +?d?d?u?d?u?d?d +?u?u?l?l?l?u +?u?d?l?l?l?s +?l?u?s?l?l +?l?u?s?l?u +?s?l?l?l?u +?s?l?l?d?l?l +?u?u?u?s?l +?u?l?s?u?u +?l?u?l?l?s +?l?l?s?l?u +?l?u?u?s?u +?u?u?u?u?u?s?d +?l?d?d?d?d?l?l?l +?d?l?l?d?u?u +?l?d?d?l?u?l +?l?l?l?d?u?d +?u?l?d?l?d?u +?d?d?l?l?u?l +?d?l?l?u?u?d +?d?l?u?u?d?l +?d?u?l?l?u?d +?l?l?d?d?l?u +?u?l?d?u?d?l +?d?u?d?l?l?l +?u?d?u?u?l?d +?u?d?d?l?u?l +?u?d?u?d?u?l +?l?d?u?l?d?l +?u?l?d?u?u?d +?d?l?d?d?d?l?l +?d?d?d?u?d?d?d?d +?u?d?u?d?u?d?u +?d?d?d?s?s?d?d +?d?d?s?d?d?d?l +?d?d?d?d?s?d?l +?l?d?d?d?d?s?s +?u?u?u?u?u?d?u +?u?l?d?l?u?l +?u?d?l?u?l?l +?l?u?l?u?l?d +?d?l?u?l?l?l +?l?d?u?u?u?u +?l?d?l?l?u?l +?l?u?l?l?l?u +?u?u?d?u?l?l +?d?u?l?l?l?u +?u?u?u?s?u?d +?d?u?u?u?u?s +?l?d?d?d?d?l?s +?u?d?d?l?d?d?u +?u?l?d?d?d?d?l +?l?l?d?d?d?d?d?d?d?d +?d?l?l?l?l?d?d?d +?u?l?u?l?l?d?d +?l?d?s?d?s?d?d +?u?s?s?s?u +?u?s?u?s?s +?u?l?u?u?u?u +?s?u?l?l?l?l +?l?l?s?l?d?d?d +?l?s?d?d?s?l +?l?s?d?l?s?d +?u?u?s?s?d?d +?d?u?l?l?l?l?d +?d?d?l?d?d?d?d?l +?d?d?d?d?l?d?d?l +?s?d?d?u?u?u +?u?l?u?d?d?s +?u?l?d?d?l?s +?u?d?u?d?u?s +?l?d?s?l?l?d +?d?l?d?l?l?s +?d?d?u?l?l?s +?u?d?u?u?u?d?d +?d?d?d?d?u?u?d?d +?d?d?d?u?u?u?d +?u?l?d?d?l?d?d +?d?d?d?s?d?s?d +?u?u?l?l?d?d?d?d +?u?d?l?l?l?l?l +?u?u?u?d?d?u?u +?u?u?d?u?u?d?d +?l?l?u?u?d?d?d +?l?u?l?l?u?d +?d?u?u?l?l?l +?d?d?d?s?d?u +?s?d?d?d?l?d +?d?u?d?d?s?d +?d?l?d?d?s?d +?s?d?d?u?d?d +?d?s?d?d?d?l +?d?l?s?d?d?d?d +?d?s?d?d?l?d +?d?d?u?d?s?d +?l?d?d?l?d?d?s +?l?l?l?l?d?d?l?l +?d?d?u?d?l?l +?d?d?u?u?l?d +?l?l?l?d?d?d?u +?d?d?l?u?d?l +?l?d?d?u?l?d +?d?d?l?l?d?u +?d?l?d?u?u?d +?d?u?u?d?l?d +?d?d?l?l?u?d +?l?u?d?d?u?d +?d?d?u?l?d?u +?d?l?d?u?d?u +?d?l?d?d?l?u +?d?l?d?l?d?u +?d?l?d?d?u?l +?d?l?u?d?u?d +?d?l?l?d?u?d +?l?u?d?d?d?l +?l?d?d?l?d?u +?u?l?l?d?d?d?s +?d?l?d?l?u?d +?u?d?d?l?u?d +?d?d?u?d?l?u +?d?u?d?d?l?l +?s?d?d?l?l?l?l +?l?l?u?l?l?u +?l?l?s?d?d?d?d?d +?d?d?d?s?d?l?l +?l?s?l?s?l?d?d +?u?u?u?d?d?d?l +?s?d?d?d?s?s +?d?d?d?d?s?s?d +?d?s?d?s?d?d?d +?u?l?l?u?u?u +?u?u?d?d?d?d?d?d?d +?l?l?s?l?s?d +?l?d?l?l?s?s +?d?l?l?l?s?s +?l?s?l?l?s?d +?u?s?u?s?u?d +?l?l?d?u?d?l +?d?l?l?l?u?d +?l?l?d?u?l?d +?d?u?u?u?l?l +?u?u?d?d?u?l +?d?d?u?l?u?u +?d?l?l?d?l?u +?d?d?l?u?u?u +?l?l?u?d?d?l +?d?l?u?l?l?d +?d?l?d?l?l?u +?u?l?d?u?l?u +?l?d?u?u?d?u +?u?u?u?u?d?l +?u?l?u?l?d?l +?l?l?d?l?u?d +?l?l?u?l?d?l +?l?u?d?l?d?u +?l?u?d?l?d?l +?l?u?l?d?d?u +?d?l?d?l?u?l +?u?u?u?u?d?u?u +?u?d?d?d?l?l?l +?s?u?u?d?d?s +?l?s?l?d?d?s +?l?l?l?l?d?d?d?l +?l?l?l?l?l?d?d?l +?u?l?l?d?l?l?l +?u?l?l?l?l?d?l +?u?l?l?l?d?l?l +?d?d?d?d?l?u?l +?u?l?d?d?d?d?u +?d?d?d?d?d?d?u?d +?l?l?d?d?d?s?s +?s?s?l?d?s +?l?d?s?s?s +?s?l?s?s?d +?s?l?d?s?s +?s?d?s?l?s +?s?s?s?u?d +?l?u?u?u?u?l +?u?u?u?u?d?d?s +?l?l?l?l?d?d?d?s +?s?s?d?d?d?l +?d?d?d?d?s?s?l +?d?d?d?s?l?s +?d?d?d?l?s?s +?u?d?d?d?s?s +?d?d?d?s?s?l +?l?s?d?d?s?d?d +?u?u?d?d?d?l?l +?l?l?l?d?l?l?l?d +?s?d?l?l?l?s +?l?l?s?l?s?l +?u?s?s?l?l +?u?s?u?s?l +?l?l?l?u?u?l +?d?l?d?d?d?l?d?d +?s?d?l?l?d?l +?u?l?s?l?d?d +?s?u?l?l?d?d +?l?l?d?l?s?d +?l?d?l?s?d?l +?d?d?d?d?s?u?u +?l?l?l?s?s?d?d +?s?s?d?d?d?d?d?d +?l?s?l?l?l?l?d +?s?l?l?s?l?l +?d?d?d?d?d?l?d?l +?l?d?d?d?d?d?l?d +?u?l?l?l?u?s +?d?d?d?d?d?l?l?l?l +?d?d?s?s?s?s +?d?l?u?u?u?u +?u?u?u?l?d?l +?u?u?l?l?u?d +?u?l?d?u?u?l +?d?d?d?u?u?d?d?d +?l?d?d?l?d?d?l?d?d +?u?l?l?u?l?l?l +?u?s?l?l?d?l +?d?u?l?l?l?s +?d?d?d?d?u?u?s +?s?s?s?l?s +?l?l?d?d?l?d?d?d +?l?u?u?l?l?l +?u?l?l?u?u?l +?u?l?u?l?u?u +?l?d?d?l?l?d?d?d +?l?l?s?s?s?s +?u?u?l?l?l?l?d +?u?l?l?l?u?l?l +?l?l?l?l?l?l?l?l?l +?u?l?l?u?l?d?d +?u?l?d?d?l?l?l +?s?l?d?d?l?s +?l?l?l?s?d?d?s +?d?d?d?d?l?d?l?d +?u?l?u?l?u?s +?u?l?d?l?l?d?d +?l?l?l?l?l?d?d?s +?d?d?d?s?d?l?d +?d?d?d?l?d?d?s +?l?l?l?l?l?l?d?l +?u?u?u?d?u?s +?u?l?u?l?s?d +?l?u?u?l?l?d +?u?u?l?l?d?l +?d?l?l?u?u?l +?l?l?d?u?u?u +?u?l?u?l?d?u +?s?l?l?l?d?d?s +?s?d?d?d?s?d?d +?u?d?d?d?u?d?d?d +?u?l?d?l?l?l?l +?l?l?d?d?d?l?l?l +?u?d?l?d?u?d?d +?u?u?u?l?u?u +?l?d?l?l?l?d?d?d +?s?s?l?l?s?s +?s?d?u?u?d?d +?d?d?d?s?u?l +?d?d?l?l?d?s +?d?d?s?l?d?l +?d?d?d?u?l?s +?u?l?d?d?s?d +?u?d?d?d?u?s +?d?l?d?s?l?d +?l?u?d?d?d?s +?l?d?s?d?l?d +?s?l?d?d?d?l +?s?d?l?d?l?d +?d?d?d?s?l?u +?d?d?d?d?s?l?l?l +?u?d?d?d?l?d?d +?u?u?u?l?l?l?d +?s?l?s?d?d?d?d +?d?l?d?l?d?l?s +?l?l?l?l?l?l?s?d +?l?l?d?u?d?u +?u?u?l?d?d?u +?l?u?d?l?u?d +?d?l?d?u?u?u +?d?u?u?u?d?l +?l?d?u?d?l?u +?l?d?u?d?l?l +?l?u?d?d?u?l +?d?l?u?l?d?l +?u?l?d?d?d?l?l +?l?d?d?l?l?u +?d?u?l?d?l?l +?d?u?d?l?l?u +?l?d?l?d?u?u +?l?d?l?d?u?l +?d?l?l?u?d?l +?l?d?u?l?l?d +?l?d?u?d?u?l +?l?d?l?u?u?d +?u?d?u?l?d?l +?d?l?l?l?d?u +?l?l?l?l?l?l?u +?l?l?u?u?u?l +?u?l?l?d?d?l?l +?u?l?l?l?d?d?l +?d?s?l?l?l?l?l +?u?l?u?l?u?l?u +?l?l?d?s?d?l +?u?d?l?d?l?s +?u?u?l?s?d?d +?s?l?d?l?l?d +?d?l?l?l?l?l?s +?d?d?l?s?l?l +?u?d?d?l?s?l +?l?d?s?d?l?l +?l?l?d?d?l?l?l?l +?u?u?u?u?d?u?d +?s?l?l?l?l?l?d +?u?d?u?d?d?u?d +?d?d?d?d?u?s?u +?u?u?u?u?d?d?u +?s?s?s?d?s +?s?s?d?s?s +?s?d?s?s?s +?d?l?d?d?l?d?d?l +?l?l?u?d?u?l +?d?l?l?l?u?l +?u?u?l?d?u?u +?l?u?u?d?l?l +?l?u?d?u?u?u +?l?l?d?l?l?d?d?d +?l?l?d?l?s?s +?l?d?l?s?l?s +?s?s?d?s?d?d +?d?s?s?s?d?d +?d?d?s?s?d?s +?d?d?d?s?d?d?s +?d?d?s?s?d?d?d +?s?l?s?s?l +?l?s?s?l?s +?u?s?l?s?s +?u?l?l?d?d?d?d?d?d +?u?d?u?u?u?u?u +?u?l?l?l?l?l?l?l +?l?u?l?l?l?d?d +?l?l?l?l?l?d?l?d +?d?d?d?d?d?u?s +?d?d?l?s?l?s +?d?l?s?d?l?s +?s?l?d?l?d?s +?d?l?l?d?s?s +?u?l?s?s?d?d +?d?d?u?u?d?d?d?d +?l?l?l?l?l?u?d +?u?l?l?d?d?d?l +?l?l?l?l?l?d?l?l +?u?u?u?u?l?u +?l?d?d?d?l?l?d?d +?l?d?l?d?s?d?d +?s?l?s?l?l?l +?d?d?d?d?d?d?d?d?l?l +?u?l?l?l?l?d?d?d?d +?u?u?d?u?d?d?d +?u?d?d?l?d?d?l +?d?d?d?l?l?l?d?d?d +?u?s?u?u?d?u +?u?l?l?s?l?d +?u?u?u?l?d?d?d +?u?l?u?l?u?l?d +?l?l?l?u?l?u +?d?d?d?s?u?u?u +?u?d?d?l?l?l?l +?u?d?d?d?d?d?d?d?u +?l?l?l?d?d?l?d?d +?l?l?l?l?l?l?l?l?d +?u?d?u?u?d?u?d +?l?l?l?l?u?s +?d?d?s?l?l?d?d +?l?d?l?s?d?d?d +?u?s?l?d?d?d?d +?d?d?l?l?s?d?d +?u?u?l?l?d?u +?d?u?u?u?u?l +?d?l?l?l?u?u +?d?u?l?u?l?l +?u?d?l?l?u?l +?u?l?u?d?l?l +?u?l?u?d?u?l +?d?l?l?u?l?u +?l?u?u?d?l?u +?l?l?d?l?u?l +?u?u?u?d?l?u +?l?u?l?d?l?u +?l?l?d?d?d?l?d?d +?l?d?d?d?d?d?d?u +?u?s?d?d?d?d?d?d +?u?u?l?l?l?l?l +?u?l?u?d?d?d?d?d +?u?u?u?l?l?u +?u?d?l?d?l?d?l +?l?l?u?l?l?d?d +?l?l?l?l?l?l?l?s +?u?d?d?u?d?u?d +?d?d?u?d?d?l?d +?d?u?l?d?d?d?d +?d?d?l?d?l?d?d?d +?d?d?u?d?d?d?u +?l?d?d?l?l?l?d?d +?d?d?d?d?d?d?d?u?u +?u?d?d?d?d?d?d?s +?s?s?l?l?l?d +?l?s?l?d?l?s +?u?s?d?l?l?l +?u?u?u?s?u?u?u +?l?l?l?l?d?d?d?d?d?d +?l?d?l?l?d?l?d?d +?u?d?l?l?d?l?d +?d?d?l?s?d?d?l +?d?d?l?s?l?d?d +?d?d?d?u?u?u?u?u +?u?u?u?u?u?d?d?d?d +?s?l?l?l?s?d?d +?d?d?d?l?d?l?d?d +?d?d?l?d?d?d?l?d +?s?u?d?d?d?s +?l?d?s?d?s?d +?l?d?s?d?d?s +?d?l?d?d?s?s +?u?d?s?d?s?d +?d?s?l?s?d?d +?u?d?s?s?d?d +?u?s?d?d?s?d +?d?d?u?u?u?u?d?d +?u?u?u?d?u?d?d +?d?d?d?d?s?l?d +?d?d?l?s?d?d?d +?d?d?s?d?d?l?d +?u?l?l?l?d?l?d +?s?l?l?l?s?s +?d?l?d?d?l?d?d?d +?s?l?l?d?d?l +?u?l?s?d?d?u +?l?s?d?l?d?l +?s?l?l?d?l?d +?u?l?s?u?d?d +?l?u?u?s?d?d +?d?l?s?l?d?l +?u?d?l?l?d?s +?s?d?l?d?l?l +?d?u?d?l?d?u?d +?u?l?d?l?d?d?d +?l?u?u?u?u?u?d +?d?d?s?l?l?s +?s?d?l?l?s?d +?d?d?s?l?s?l +?u?s?l?s?d?d +?d?l?s?l?s?d +?d?u?l?l?l?d?d +?d?l?d?l?d?l?d?d +?d?d?d?d?d?d?d?s?d +?u?l?d?l?u?u +?l?d?l?u?u?l +?d?u?l?u?l?u +?u?d?u?u?u?l +?l?u?u?u?l?d +?l?l?l?u?u?d?d +?u?l?l?u?d?u +?l?u?l?u?d?l +?l?d?l?u?l?u +?u?u?l?d?l?l +?l?d?u?u?l?l +?u?d?l?l?u?u +?l?l?l?u?d?u +?l?u?l?u?u?d +?d?d?s?d?d?s?l +?l?s?d?d?d?d?s +?s?l?d?d?d?d?s +?d?d?d?l?l?l?l?d +?l?s?d?l?l?l?l +?u?d?l?l?l?l?d +?u?s?u?l?u +?s?l?u?l?l +?u?l?d?l?l?s +?l?s?u?l?l +?u?d?u?u?u?s +?s?l?l?u?u +?u?s?u?u?l +?u?l?u?u?s +?u?s?l?u?l +?l?s?l?l?u +?u?l?s?l?u +?l?l?u?l?s +?u?u?l?s?l +?l?l?s?u?l +?u?s?u?l?l?d +?l?u?l?u?s +?l?s?l?u?l +?l?u?u?s?l +?u?l?u?s?u +?d?s?u?l?l?l +?u?l?u?s?l +?u?l?l?d?l?d?d +?u?u?d?u?d?l +?l?l?u?d?d?u +?u?u?d?l?d?l +?u?u?d?l?d?u +?l?l?d?l?d?u +?l?l?u?d?l?d +?d?d?u?u?u?l +?d?d?l?u?u?l +?d?u?u?d?l?l +?u?u?d?l?u?d +?u?d?l?d?l?l?d +?u?l?d?d?d?u?l +?u?d?u?u?d?l +?d?u?u?l?l?d +?l?u?d?u?l?d +?d?l?l?d?u?l +?d?u?l?d?l?u +?u?d?u?d?u?u?d +?d?l?u?u?u?d +?u?d?d?u?l?u +?d?l?d?l?u?u +?u?l?l?s?d?d?d?d +?s?d?d?d?d?d?d?d?d +?s?l?s?s?s +?l?l?l?l?d?d?u +?l?u?l?u?l?l +?u?u?l?l?u?l +?d?s?d?d?d?s?d +?s?d?d?s?d?d?d +?s?d?s?d?d?d?d +?d?d?d?d?d?d?s?d?d +?l?l?l?l?d?l?d?d +?l?l?l?d?d?s?d?d +?l?d?l?l?l?l?d?d +?d?l?d?d?d?d?l?d +?l?u?l?u?d?d?d +?l?d?l?l?l?l?l?l +?l?l?d?d?d?d?l?d +?d?d?l?l?l?l?l?d +?l?d?d?s?d?d?l +?l?d?l?d?d?d?s +?s?l?l?d?l?s +?u?d?d?l?d?l?d +?l?l?l?l?s?l?d +?l?l?l?l?s?s?s +?l?d?d?l?l?d?d?l +?l?l?s?l?l?l?d +?l?u?u?l?u?u +?l?u?u?u?l?l +?u?u?l?u?l?l +?l?l?l?d?l?d?d?d +?l?l?d?d?d?d?d?s +?u?l?l?l?l?d?s +?l?l?d?l?l?l?l?l +?l?l?s?s?d?d?d +?u?l?l?u?d?d?d?d +?d?l?d?d?d?d?d?l +?s?l?d?d?d?d?d?d +?s?u?d?d?d?d?d?d +?s?d?d?d?d?d?d?l +?l?l?l?s?l?l?d +?s?d?d?d?d?s?l +?u?u?u?l?l?l?l +?u?d?d?u?u?u?u +?s?u?u?u?u?d +?u?l?l?d?l?s +?u?s?d?u?u?u +?d?d?d?d?d?d?s?u +?d?d?u?d?d?u?d +?d?d?d?d?u?d?l +?s?s?d?s?s?d +?d?d?s?d?s?d?d?d?d +?l?u?u?u?d?u +?l?u?u?u?d?l +?u?u?u?d?u?l +?u?u?l?u?d?u +?l?u?l?d?u?l +?u?l?l?d?u?u +?u?u?d?u?u?l +?d?u?l?l?u?l +?u?d?l?u?l?u +?l?u?d?u?u?l +?u?d?u?u?l?l +?u?l?d?u?u?u +?d?d?s?l?d?d?d +?d?s?l?d?d?d?d +?u?u?d?d?s?d?d +?d?l?d?s?d?d?d +?l?s?d?d?d?d?l +?l?d?d?d?d?s?l +?d?d?d?d?l?s?d +?l?u?l?u?l?d?d +?d?d?d?d?d?u?l?d +?s?l?d?l?l?s +?s?s?d?l?l?l +?l?l?d?l?l?l?d?d +?d?u?d?u?l?d +?l?d?d?u?u?d +?d?u?l?d?d?l +?l?d?d?d?l?u +?l?d?u?u?d?d +?d?d?u?l?u?d +?l?d?d?u?d?l +?l?u?d?d?d?u +?d?u?u?d?d?l +?l?d?l?d?d?u +?u?d?d?u?d?l +?l?u?d?u?d?d +?u?u?d?d?u?u?d +?l?d?l?d?u?d +?d?d?l?u?u?d +?d?u?d?l?u?d +?d?l?u?d?d?l +?d?u?d?d?l?u +?l?d?d?u?d?u +?d?d?d?d?s?l?s +?u?u?d?d?d?d?u?u +?u?d?u?d?d?d?d?d +?u?d?u?d?u?d?u?d +?d?s?d?s?s?d +?s?d?d?s?s?d +?s?d?d?s?d?s +?s?d?d?d?d?s?d +?u?u?l?u?u?l +?u?l?u?l?l?l?l +?l?u?l?u?u?l +?l?l?u?l?d?d?d +?u?d?l?d?u?d?l +?u?l?d?l?d?l?d +?l?u?l?l?d?d?d +?d?s?d?l?l?l?l +?s?d?l?l?d?s +?s?d?d?s?l?l +?s?l?l?d?s?d +?s?d?l?s?d?l +?d?s?l?l?s?d +?l?s?l?d?s?d +?s?d?l?d?l?s +?l?s?d?s?l?d +?l?l?l?d?d?d?d?d?d?d +?d?l?d?s?d?l?d +?d?d?l?d?d?l?s +?d?d?d?d?s?u?l +?u?d?d?s?u?d?d +?l?d?l?l?s?d?d +?u?u?l?l?s?d +?u?s?l?d?l?l +?u?l?s?l?l?d +?l?s?s?d?d?d?d +?l?u?u?u?u?u?u +?l?d?l?d?l?l?d?d +?d?d?d?u?u?l?l +?u?s?u?l?s +?s?l?s?u?l +?s?l?l?s?u +?l?s?u?l?s +?l?l?s?s?u +?l?s?l?s?u +?l?l?s?d?s?l +?s?u?l?u?s +?s?u?u?s?u +?l?s?l?l?d?s +?l?l?s?u?s +?u?u?s?u?s +?s?s?u?l?u +?u?l?u?s?s +?l?l?l?l?l?l?d?d?d?d +?l?u?l?u?u?u +?l?l?d?s?l?d +?u?u?d?d?s?u +?s?d?d?u?l?l +?d?s?d?u?u?u +?d?l?l?s?d?l +?u?d?s?l?d?l +?u?s?d?l?d?l +?u?s?l?d?l?d +?u?d?l?d?s?l +?u?d?u?s?u?d +?l?d?d?l?s?l +?u?d?u?u?d?s +?l?u?l?d?d?s +?d?d?u?d?d?u?u +?u?d?d?l?u?d?d +?l?u?u?u?u?s +?l?l?l?d?l?l?d?d +?l?d?d?d?l?l?l?l +?l?s?l?s?l?s?l +?l?d?d?d?l?d?d?l +?s?s?s?d?d?s +?d?d?d?s?d?d?d?s +?l?d?l?l?u?u +?l?d?l?u?u?u +?u?d?u?l?l?u +?d?u?l?u?u?l +?u?d?u?l?u?l +?u?u?u?l?u?d +?u?u?l?u?u?d +?u?u?l?d?u?l +?l?u?u?l?d?l +?u?l?u?u?d?l +?u?l?u?u?d?u +?u?u?u?l?d?u +?u?l?u?d?u?u +?u?d?l?u?u?u +?u?d?u?l?u?u +?u?u?d?d?l?l?l +?d?d?l?l?l?l?l?d?d +?d?d?d?u?l?u?l +?l?s?l?d?d?d?d?d +?d?d?d?d?d?d?l?d?d +?s?l?s?l?s?l +?u?d?l?l?d?l?l +?u?l?u?l?l?l?d +?u?u?l?u?u?u +?u?s?l?l?l?d?d +?l?d?d?l?l?l?l?l +?d?d?u?l?l?l?d?d +?u?l?u?u?d?d?d +?l?l?l?u?l?d?d +?l?d?d?l?d?d?d?l +?d?d?d?d?d?d?d?l?d +?u?d?d?u?d?d?d?d +?s?d?d?d?d?s?s +?d?d?d?d?d?u?l?l +?s?s?d?d?d?s?s +?s?d?s?l?l?l +?l?s?l?s?d?l +?l?s?s?l?l?d +?u?d?s?d?d?d?d +?u?d?d?d?s?d?d +?s?d?d?d?d?d?u +?l?u?u?u?s?d +?u?d?l?s?l?l +?l?l?d?d?l?l?s +?u?u?d?u?u?s +?d?d?d?d?l?l?l?s +?u?d?u?u?u?u?d +?d?u?d?d?d?d?d?d +?d?d?s?d?d?d?s +?d?d?s?l?s?d?d +?d?d?d?d?s?d?s +?u?l?l?s?u?l +?d?d?u?d?u?d?u +?d?d?l?d?l?d?d?l +?l?l?u?l?u?l +?u?u?d?d?u?u?d?d +?l?s?l?s?s?d +?u?u?u?s?d?d?d?d +?s?u?u?d?d?d +?s?d?d?u?l?d +?s?d?d?d?u?l +?d?s?u?l?d?d +?l?d?d?d?s?u +?u?d?s?d?d?l +?u?d?u?d?s?d +?u?d?u?d?d?s +?u?d?d?s?l?d +?d?d?s?u?l?d +?u?d?s?d?l?d +?d?d?l?s?l?d +?u?d?s?l?d?d +?u?s?d?d?u?d +?d?s?u?u?d?d +?u?s?d?d?d?l +?d?l?d?s?d?l +?u?d?d?d?s?u +?u?d?d?l?d?s +?u?s?d?l?d?d +?d?s?d?d?u?u +?d?s?d?l?d?l +?u?s?d?d?l?d +?l?s?d?d?l?d +?d?d?l?d?s?l +?s?l?u?d?d?d +?u?s?d?u?d?d +?d?u?s?d?d?l +?l?d?d?d?u?s +?u?d?d?d?s?l +?u?d?d?s?d?u +?u?d?s?u?d?d +?d?d?d?s?l?l?d +?d?l?d?l?s?d +?s?u?l?d?d?d +?s?d?d?l?d?l +?u?d?d?d?l?s +?d?d?s?u?u?d +?u?d?u?s?d?d +?s?l?d?d?l?d +?d?s?d?d?d?l?l +?u?d?d?u?d?s +?u?d?d?s?u?d +?l?s?u?d?d?d +?d?u?u?s?d?d +?s?d?d?l?l?d +?d?s?l?d?d?l +?s?u?d?u?d?d +?d?d?d?u?s?l +?d?d?l?s?d?l +?d?u?d?u?s?d +?d?d?d?d?u?l?s +?d?d?d?d?d?d?u?u?u +?l?d?l?l?l?l?s +?s?d?d?s?d?d?s +?d?u?d?d?d?d?u +?d?d?d?d?l?u?d +?d?d?d?l?d?d?u +?d?d?d?u?l?d?d +?d?d?d?d?u?l?d +?d?d?u?d?d?d?l +?l?d?d?d?s?d?d?d +?s?l?l?l?s?l +?u?u?s?s?u?u +?l?l?d?d?d?d?d?d?l +?d?u?l?u?d?l +?l?u?u?d?d?u +?d?l?u?d?l?l +?u?d?l?u?d?u +?d?u?d?u?l?l +?l?d?d?u?u?l +?d?l?d?u?l?l +?u?d?u?d?l?u +?d?u?l?u?u?d +?l?u?d?u?d?l +?l?u?d?u?d?u +?d?l?d?u?u?l +?u?d?l?u?u?d +?u?d?u?l?u?d +?d?l?u?l?u?d +?d?u?u?d?l?u +?l?d?u?u?u?d +?d?d?d?l?l?l?u +?l?d?u?u?d?l +?u?u?d?d?l?u +?l?d?l?l?u?d +?u?l?d?u?d?u +?d?l?u?d?u?l +?d?d?l?u?l?u +?d?d?u?u?u?u?d +?d?l?u?u?l?d +?d?l?d?u?l?u +?d?u?l?d?u?l +?d?u?d?l?u?l +?l?d?l?l?d?l?s +?u?d?d?u?u?l +?l?u?u?d?l?d +?d?d?d?l?l?d?d?l +?d?d?d?d?d?d?u?s +?d?d?d?u?u?u?s +?u?l?d?l?l?d?l +?d?d?u?d?d?u?d?d +?d?d?d?l?d?d?l?d +?l?l?l?d?d?d?l?d +?l?s?d?s?d?s +?s?s?s?l?d?d +?u?l?l?d?u?l?l +?l?d?d?d?l?d?l?d +?l?l?l?l?s?s?d +?s?d?d?s?s?s +?u?u?d?l?l?u +?d?u?u?u?l?u +?l?u?u?u?l?u +?l?l?u?l?u?d +?l?u?u?d?u?u +?d?l?u?l?l?u +?l?u?l?l?d?u +?u?l?d?l?l?l?d +?d?l?u?u?l?l +?d?l?l?u?u?u +?l?l?d?u?u?l +?l?u?u?l?d?u +?u?d?l?l?l?d?l +?l?u?d?u?l?l +?l?l?d?l?u?u +?l?l?u?l?d?u +?u?l?u?d?l?u +?u?d?u?u?l?u +?l?d?u?l?l?u +?l?l?u?u?d?l +?l?l?u?u?d?u +?l?u?d?l?l?u +?u?u?d?l?u?u +?l?s?s?l?d?l +?l?l?s?s?l?d +?u?u?u?s?s?d +?u?u?u?s?d?s +?l?l?l?s?d?d?l +?l?l?s?d?d?l?l +?l?s?l?d?l?l?l +?d?d?d?d?l?l?d?l +?u?d?d?d?l?d?d?d +?u?d?u?u?d?u?u +?u?s?s?u?s +?u?l?s?s?s +?l?s?s?s?u +?s?u?s?u?s +?s?s?l?s?l +?s?s?s?u?u +?u?l?s?d?d?s +?d?s?l?d?s?l +?l?l?s?d?s?d +?l?u?s?d?d?s +?u?u?s?d?d?s +?u?d?u?d?s?s +?d?s?d?s?l?l +?s?u?u?s?d?d +?s?l?l?d?d?d?s +?u?s?d?u?s?d +?u?s?s?u?d?d +?d?d?u?u?s?s +?u?s?u?d?s?d +?l?d?l?s?d?s +?u?l?d?d?d?d?d?d?d +?l?d?s?l?d?d?d +?d?l?l?d?d?d?s +?d?d?l?l?d?d?d?l +?u?u?d?d?l?d?d +?d?d?u?d?u?u?d +?d?d?l?l?u?d?d +?d?u?d?l?d?l?d +?d?u?l?l?d?d?d +?u?d?u?d?d?d?u +?d?d?u?u?d?d?u +?u?u?s?u?u?d?d +?l?l?d?d?s?l?l +?u?u?u?d?d?l?l +?u?u?d?l?l?l?l +?d?d?d?d?s?s?d?d +?d?d?s?d?d?d?d?d?d +?l?l?s?d?d?d?s +?l?d?d?d?d?l?l?d +?l?d?l?d?l?d?l?l +?d?d?d?d?l?s?s +?l?u?u?l?l?u +?l?u?u?l?u?l +?u?d?l?d?l?l?l +?l?l?u?u?u?d?d +?d?d?d?s?s?d?d?d +?u?u?s?u?u?u?u +?l?d?d?l?d?d?l?l +?d?d?d?d?d?d?d?d?d?d?d?d +?d?d?d?d?d?u?d?d +?u?u?s?l?l?l +?u?u?l?l?l?s +?u?u?u?s?s?u +?s?s?l?l?l?s +?l?l?s?d?d?d?l +?s?s?s?s?s?l +?d?d?d?s?d?d?d?l +?d?d?d?l?l?u?u +?l?l?d?d?d?u?u +?u?l?d?d?l?l?d +?u?d?u?d?u?u?u +?d?s?s?d?d?d?d +?d?d?u?u?u?u?u?u +?s?l?s?l?l?d +?s?l?s?l?d?l +?u?l?l?d?s?s +?d?d?d?d?l?l?l?d?d +?d?d?l?d?d?l?d?l +?l?s?s?s?s?s +?l?l?l?l?d?l?s +?l?l?l?d?d?u?u +?u?u?s?u?u?s +?u?l?u?l?s?s +?l?l?d?d?d?l?l?d +?u?l?d?d?s?d?d +?s?d?d?l?l?d?d +?d?d?d?d?d?s?l?l +?d?s?d?l?l?d?d +?s?u?u?d?d?d?d +?d?d?d?l?l?s?d +?d?l?l?d?l?d?d?d +?l?l?u?u?l?u +?l?u?l?l?u?u +?u?d?d?d?d?u?d?d +?s?d?d?l?d?s +?s?d?d?d?l?s +?l?d?d?s?d?d?s +?u?s?d?d?s?d?d +?s?d?d?s?l?d +?l?d?d?s?d?s +?d?d?l?d?s?s +?d?d?s?l?s?d +?d?s?d?l?s?d +?s?s?d?l?d?d +?d?s?d?d?s?u +?d?s?d?s?d?l +?u?d?d?s?d?s +?d?s?s?l?d?d +?s?d?l?d?s?d +?s?u?s?d?d?d +?s?d?d?d?s?u +?d?u?s?s?d?d +?d?s?d?d?s?l +?s?d?l?d?d?s +?d?s?d?d?u?s +?d?d?s?l?d?s +?d?d?s?d?s?l +?u?s?s?d?d?d +?l?d?d?s?s?d +?d?d?d?l?d?d?l?l +?d?d?d?s?l?l?l?l +?u?d?l?l?d?d?l +?d?l?d?d?d?d?s +?u?d?d?s?d?d?d +?d?d?l?d?d?d?s +?s?d?d?d?l?d?d +?d?d?d?l?s?d?d +?u?d?d?d?d?s?d +?d?s?d?d?l?d?d +?d?d?d?s?l?d?d +?d?d?s?d?l?d?d +?s?s?s?s?l?l +?d?d?l?d?d?l?d?d?l +?l?l?l?l?d?l?l?d +?u?u?u?u?l?d?d +?u?l?l?u?u?d?d +?u?u?d?u?d?s +?l?d?l?s?d?u +?u?l?s?d?d?l +?l?s?l?u?d?d +?u?u?l?d?d?s +?d?l?s?l?l?d +?s?u?d?u?u?d +?u?d?s?d?l?l +?u?l?s?d?u?d +?u?u?s?d?d?u +?u?l?d?s?d?l +?u?s?d?d?l?l +?u?d?u?d?s?u +?u?d?d?l?l?s +?l?l?d?d?u?s +?u?u?d?u?s?d +?d?d?s?u?l?l +?d?l?s?d?l?l +?s?l?u?d?l?d +?u?l?d?s?u?d +?s?l?u?l?d?d +?u?s?l?d?d?l +?l?d?u?s?l?d +?s?u?d?l?d?l +?d?s?l?l?d?l +?u?d?l?l?s?d +?d?l?d?l?u?s +?d?l?l?s?l?d +?d?u?s?u?d?u +?l?d?s?d?d?s?d?d +?l?d?d?u?l?d?d +?u?d?l?d?d?l?d +?d?d?u?d?d?l?l +?u?d?d?u?l?d?d +?d?d?d?u?l?l?d +?u?u?d?d?d?u?d +?l?d?d?u?d?d?l +?d?d?u?u?d?d?l +?u?d?d?d?u?d?u +?d?d?d?u?l?d?d?d +?u?d?d?l?d?d?d?d +?u?u?u?u?l?l?l +?s?d?d?d?s?d?d?d +?d?d?d?l?l?s?s +?u?s?u?s?d?d?d +?l?l?d?d?l?d?d?l +?u?l?l?s?u?l?l +?d?l?l?l?d?l?l?l +?u?l?u?l?s?d?d +?l?d?l?l?l?d?l?l +?d?s?d?s?s?s +?l?l?u?d?u?u +?l?u?u?l?u?d +?l?l?u?d?l?u +?u?u?d?u?u?d?u +?l?d?u?l?u?u +?d?u?u?l?l?u +?l?u?d?u?l?u +?u?u?l?d?l?u +?u?u?d?u?l?u +?u?l?l?l?d?d?u +?u?d?l?l?d?d?d?d +?s?s?l?l?l?d?d +?l?l?d?l?l?l?s +?u?s?u?l?d?l +?u?l?u?l?d?s +?u?s?u?d?u?u +?s?u?l?l?l?d +?l?d?l?d?d?d?d?l +?u?d?u?u?u?d?u +?l?d?l?d?l?d?d?l +?u?l?d?d?l?d?l +?d?l?l?l?s?d?d +?u?s?l?l?d?d?d +?s?l?l?l?d?d?d?d +?d?d?d?l?l?d?d?d?d +?l?l?l?l?l?u?u +?s?s?u?s?s +?s?u?s?s?s +?l?l?l?l?u?u?u +?l?l?d?l?d?l?d?d +?u?s?s?l?l?l +?u?s?l?l?s?l +?s?s?s?d?d?l +?u?s?s?s?d?d +?l?s?s?s?d?d +?u?l?l?d?l?l?d +?u?l?u?u?l?d?d +?d?u?u?u?u?d?u +?l?l?u?u?l?d?d +?u?u?u?d?u?u?d +?l?l?l?d?l?l?s +?d?d?d?d?l?d?l?l +?s?d?d?l?d?d?s +?l?l?l?l?l?l?d?s +?l?d?d?d?d?s?d?d +?l?l?d?l?l?d?l?l +?u?l?d?d?d?s?d +?d?d?s?d?d?u?u +?d?l?l?s?d?d?d +?u?l?l?u?l?l?d?d +?l?l?s?s?l?d?d +?l?l?s?d?l?s +?l?s?l?d?s?l +?d?l?s?l?s?l +?u?u?d?d?d?d?l?l +?d?d?l?d?d?d?l?l +?d?d?d?s?s?l?l +?l?l?d?l?l?l?l?d +?l?l?l?u?d?d?d?d +?d?d?l?l?l?d?d?l +?d?d?d?d?u?l?d?d +?u?l?u?s?d?d?d +?u?l?l?d?d?d?d?s +?d?d?l?l?l?s?d +?d?d?d?u?l?l?l?l +?s?s?s?s?s?d +?u?l?d?d?u?l?d?d +?u?u?u?d?d?u?d +?u?d?d?l?l?l?d +?u?l?l?d?d?d?u +?u?d?d?d?u?l?l +?u?l?u?l?l?s +?d?d?d?l?l?l?l?l?l +?l?l?l?s?d?l?d +?l?d?l?s?l?d?l +?d?d?l?l?l?s?s +?l?l?l?s?d?s?d +?d?d?d?u?u?u?d?d +?u?s?u?u?s?u +?d?s?d?d?s?d?d?d?d +?u?l?l?s?s?s +?l?d?l?d?l?l?l?l +?s?l?l?s?d?d?d +?l?d?l?l?l?l?l?d +?d?d?d?d?d?d?l?l?d +?d?s?d?d?s?d?d?l +?d?d?l?d?d?d?d?d?d +?d?u?d?d?d?d?l +?d?d?d?l?u?d?d +?l?d?u?d?d?d?d +?d?u?d?d?d?u?d +?d?l?d?u?d?d?d +?d?d?d?d?l?d?u +?d?u?d?u?d?d?d +?d?d?u?l?d?d?d?d +?d?d?d?u?d?u?d +?d?d?d?d?l?l?d?d?d +?d?d?u?d?l?d?d +?d?d?l?u?d?d?d +?d?u?d?d?u?d?d +?d?d?d?u?d?d?l +?d?d?d?u?d?d?u +?d?u?d?d?d?l?d +?d?d?l?l?l?l?u +?u?u?u?d?s?d?d +?u?s?u?u?u?d?d +?l?d?d?s?l?l?l +?l?d?d?s?d?d?d?d +?u?l?u?u?u?l +?u?u?u?l?u?l +?d?d?l?d?l?l?d?d +?l?l?l?l?d?s?s +?l?d?l?s?s?s +?u?u?l?l?l?d?d?d +?u?u?s?s?s?s +?s?s?u?u?s?s +?d?d?d?d?d?l?l?s +?l?l?l?d?d?s?l +?l?s?l?l?s?s +?u?d?d?d?d?l?u +?u?d?d?d?l?d?l +?d?d?d?u?u?d?u +?d?d?u?l?l?l?d +?u?d?d?d?d?u?l +?u?l?d?d?d?l?u +?d?u?u?d?u?u?d +?u?l?d?d?u?l?d +?d?d?l?l?d?d?u +?u?d?d?d?d?d?d?d?d?d +?u?l?s?s?l?l +?u?d?l?d?l?d?l?d +?l?l?d?d?l?l?l?d +?d?l?d?l?l?d?d?d +?d?l?d?d?l?l?d?d +?s?d?s?s?d?d +?s?s?d?d?s?d +?d?d?s?d?s?s +?u?u?d?u?u?u?d +?u?l?l?l?l?s?d?d +?s?l?d?l?d?l?d +?l?d?l?l?d?d?s +?d?d?d?d?d?d?d?s?l +?l?l?l?l?s?d?l +?l?l?l?l?l?d?u +?l?d?l?d?l?l?s +?l?d?d?l?l?l?s +?d?d?s?s?u?u +?s?s?l?d?d?l +?l?d?s?d?s?l +?l?s?s?d?l?d +?s?u?l?s?d?d +?l?l?d?d?s?s?s +?l?d?s?s?l?d +?l?s?d?d?l?s +?s?l?d?s?l?d +?d?s?s?l?l?d +?d?d?u?s?u?s +?s?l?d?l?s?d +?s?d?d?l?l?s +?u?s?d?d?s?u +?s?d?d?l?s?l +?l?d?l?l?d?l?l?d +?d?d?d?d?d?s?d?d?d +?l?l?l?l?s?d?d?d?d +?u?u?d?d?l?l?d?d +?s?d?d?d?d?u?u +?d?l?s?l?d?d?d +?d?l?l?d?s?d?d +?u?d?d?u?d?d?s +?d?d?u?s?u?d?d +?l?s?u?d?d?d?d +?l?d?d?d?l?d?s +?l?u?s?d?d?d?d +?l?l?l?u?l?l?l +?l?d?d?d?d?l?d?l +?l?l?l?l?d?d?l?d +?u?d?l?d?d?d?d?d +?u?d?d?d?d?l?d?d +?l?l?l?d?d?l?l?d +?u?u?u?d?l?l?l +?u?d?s?u?u?u +?l?d?l?l?s?u +?u?u?s?l?l?d +?u?s?u?d?l?l +?u?l?d?s?l?l +?u?l?s?l?d?l +?u?u?u?s?d?u +?u?d?l?l?s?l +?u?l?s?u?l?d +?u?d?l?u?s?l +?l?d?l?l?d?l?d?l +?u?u?d?d?l?l?d +?l?d?l?d?l?d?u +?u?l?l?d?d?l?d +?l?d?d?l?l?d?l?d +?d?d?d?d?d?d?d?l?l?l +?l?d?l?d?d?d?l?d +?u?u?u?d?s?s +?s?s?l?l?d?l +?u?l?l?s?d?s +?l?l?l?l?s?d?s +?d?l?l?s?s?l +?l?l?l?l?s?l?l?l +?u?u?l?u?l?u +?u?l?u?d?d?d?s +?d?s?d?d?l?l?l +?s?d?l?l?l?d?d +?u?l?l?d?s?d?d +?d?d?d?l?l?s?l +?l?l?l?s?l?l?l?l +?d?l?l?d?d?l?d?d +?u?l?l?l?u?l?d +?u?u?u?l?l?l?d?d +?l?s?l?s?d?d?d?d +?l?l?s?s?s?l +?d?s?s?s?s?d +?d?d?d?s?s?s?s +?d?u?u?l?u?l +?u?u?l?u?d?l +?l?u?d?l?u?l +?l?u?u?d?u?l +?d?l?u?l?u?l +?d?u?l?u?u?u +?d?u?l?l?u?u +?l?d?u?l?u?l +?u?d?l?u?u?l +?u?u?l?u?l?d +?d?l?u?l?u?u +?d?l?l?d?d?l?l?d +?s?d?d?d?d?d?d?d?s +?d?d?s?s?s?d?d +?s?s?d?d?d?d?s +?u?u?u?u?u?u?d?d?d +?l?l?s?d?l?l?l +?l?s?l?s?s?s +?d?d?s?d?d?s?d?d?d?d +?d?d?d?d?d?d?d?s?s +?l?d?l?d?l?l?l?d +?s?s?d?d?d?d?l +?s?l?l?l?l?s?d +?l?l?d?s?s?s +?u?s?u?s?s?d +?u?l?d?d?d?d?d?s +?d?l?l?s?d?l?l +?s?l?l?l?l?d?s +?l?d?d?d?l?l?l?d +?d?l?d?d?d?d?l?l +?d?l?d?l?d?d?l?d +?s?s?s?s?d?d?d +?s?s?l?l?d?d?d +?s?d?u?u?u?u?u +?d?d?s?d?l?l?l +?d?s?l?l?l?d?d +?u?s?u?u?d?d?d +?l?l?d?d?d?l?s +?s?s?u?u?u?u +?u?s?l?l?l?s +?u?d?d?u?d?u?u +?u?d?d?u?u?u?d +?u?d?d?l?d?l?l +?u?s?u?s?u?d?d +?u?u?u?u?u?d?s +?u?u?u?u?d?d?d?d?d +?d?d?d?d?s?d?s?d +?u?u?l?l?l?l?d?d +?s?s?l?s?s?l +?u?l?l?l?l?u?d?d +?l?d?l?l?l?d?l?d +?d?l?d?d?l?d?l?d +?d?l?d?d?s?d?d +?d?d?s?d?d?d?u +?d?d?d?l?d?s?d +?d?d?u?s?d?d?d +?s?d?d?d?d?l?d +?d?d?d?d?l?d?s +?d?d?l?d?s?d?d +?d?d?s?d?u?d?d +?s?d?l?d?d?d?d +?d?d?l?d?d?s?d +?d?s?d?d?d?d?u +?d?d?d?d?d?l?d?d?d +?l?l?d?l?l?d?l?d +?u?l?l?l?l?s?s +?u?u?u?u?u?u?u?d?d +?u?u?u?s?l?l +?l?l?l?s?d?l?l +?l?s?u?l?l?l +?u?l?l?u?l?s +?l?u?l?l?l?s +?u?d?u?l?d?d?d +?d?u?u?d?d?d?u +?l?d?d?d?d?u?l +?d?d?d?d?l?u?u +?d?u?u?d?u?d?d +?u?l?d?d?d?l?d +?u?d?u?d?l?d?d +?l?u?d?d?d?d?l +?l?d?u?u?d?d?d +?l?u?l?d?d?d?d?d +?u?l?d?d?u?d?d +?u?d?d?u?d?d?l +?l?l?d?d?u?d?d +?d?u?d?u?d?d?u +?d?u?d?d?u?d?u +?d?d?l?u?u?d?d +?l?d?d?l?d?d?u +?u?s?u?u?u?u?u +?d?d?d?d?u?d?d?d?d +?u?u?u?u?u?s?u +?l?d?l?d?l?l?d?l +?d?d?s?u?u?u?u +?l?l?l?d?d?l?s +?l?d?l?l?l?l?d?l +?u?d?d?d?d?l?s +?s?l?d?d?d?d?l +?s?l?d?d?l?d?d +?s?u?l?d?d?d?d +?d?l?l?l?d?d?s +?d?d?d?l?l?d?s +?l?d?d?l?s?d?d +?u?u?d?s?d?d?d +?l?s?l?d?l?d?d +?d?d?d?l?d?d?d?d?d +?d?d?s?d?d?s?s +?s?d?s?d?s?d?d +?d?s?d?s?d?d?s +?d?d?l?l?d?d?l?d +?d?d?l?l?d?l?d?d +?l?l?d?s?l?l?l +?d?d?u?l?l?l?l?l +?s?l?s?l?l?s +?s?s?s?u?u?u +?d?d?d?d?s?d?d?l +?l?d?l?l?d?l?l?l +?d?u?u?u?u?u?u?u +?u?s?s?u?u?u +?u?s?u?s?u?u +?d?d?d?d?d?s?s?s +?u?l?l?s?l?l?l +?d?l?l?l?l?d?l?l +?u?d?u?l?l?d?d +?l?d?l?d?d?l?l?d +?d?u?u?l?u?d +?l?l?u?d?u?d +?u?d?l?l?u?d?d +?u?l?u?d?d?d?u +?u?u?d?u?d?u?d +?d?u?u?d?u?l +?l?u?l?d?u?d +?d?u?u?l?d?l +?d?u?d?u?u?l +?l?u?d?d?u?u +?d?l?u?l?d?u +?d?l?u?u?d?u +?l?d?l?u?d?u +?d?u?u?u?d?u?u +?l?d?u?l?u?d +?d?l?u?d?u?u +?l?u?d?u?u?d +?d?l?l?u?d?u +?l?d?u?d?u?u +?l?u?u?u?d?d?d?d +?d?l?l?u?l?d +?u?u?d?u?l?d +?d?l?u?d?l?u +?d?u?u?u?l?d +?u?d?u?l?d?u +?l?s?d?d?d?s?l +?l?l?u?u?d?d?d?d +?l?d?l?l?d?d?l?d +?d?l?d?d?d?l?l?d +?u?l?l?l?l?u?u +?l?d?l?d?d?l?d?l +?s?l?s?d?d?s +?s?s?l?d?d?s +?s?s?d?d?s?l +?l?s?d?d?s?s +?s?d?s?d?s?l +?s?s?l?s?d?d +?s?u?s?s?d?d +?d?d?s?s?s?l +?s?d?s?d?l?s +?u?s?l?l?l?l?l +?s?s?l?l?l?l?l +?d?d?l?d?d?l?l?l +?l?l?d?d?d?d?u?u +?u?u?u?d?d?d?d?s +?l?s?s?l?s?s +?l?l?d?l?l?l?d?l +?s?u?s?d?d?d?d +?l?s?d?s?d?d?d +?u?d?d?d?d?s?s +?d?d?l?d?d?l?l?d +?d?l?d?l?d?d?d?l +?u?u?l?u?u?d?d +?l?s?l?l?d?d?d?d +?d?l?l?d?l?l?d?d +?l?l?s?l?d?s +?s?u?u?u?d?s +?u?l?s?s?l?d +?l?d?s?s?l?l +?l?d?s?l?s?l +?u?d?s?l?l?s +?s?l?d?l?s?l +?d?l?s?s?l?l +?l?s?d?s?l?l +?d?d?d?d?d?u?u?d +?l?d?d?d?s?l?l +?d?d?d?l?s?l?l +?l?l?d?s?d?d?l +?l?d?d?l?l?d?s +?l?s?d?l?l?d?d +?l?s?l?s?d?s +?s?l?d?l?s?s +?d?l?l?l?l?d?s +?l?l?d?s?d?l?l +?l?l?l?u?u?u?u +?d?u?l?l?d?d?d?d +?l?d?l?d?d?d?d?d?d +?l?l?l?s?u?l +?u?l?l?s?u?u +?l?l?s?u?l?l +?l?s?l?l?u?l +?u?l?u?l?s?l +?s?l?l?l?l?u +?l?l?l?u?u?u?d +?l?d?d?l?d?l?l?d +?u?l?l?l?l?l?l?d?d +?d?d?d?s?d?d?d?d?d +?u?u?u?u?s?u?u +?l?l?d?d?u?u?u +?d?d?u?l?l?l?u +?u?u?d?u?d?u?u +?u?l?l?d?l?d?l +?u?u?u?d?u?d?u +?u?l?u?u?u?d?d +?u?l?d?d?u?l?l +?u?l?s?d?d?d?d?d +?d?l?d?l?l?d?l?d +?u?s?u?u?u?s +?s?u?l?u?l?s +?l?l?l?l?s?s?l +?u?l?l?l?l?l?d?d?d +?l?l?d?l?l?d?s +?u?l?l?s?d?l +?s?l?l?l?u?d +?l?l?l?u?s?d +?u?l?s?u?d?l +?u?s?d?u?l?l +?u?l?u?s?u?d +?l?d?l?l?l?d?s +?l?l?d?s?l?l?d +?u?u?s?d?u?u +?d?u?u?s?u?u +?u?l?l?s?u?d +?u?u?s?u?d?u +?l?s?l?l?s?d?d +?d?d?s?l?l?l?s +?l?s?d?d?d?d?d?d?d +?l?l?l?l?u?l?l +?u?d?l?d?l?d?u +?u?d?l?l?d?d?u +?l?u?u?l?d?d?d +?u?u?d?d?u?d?u +?u?d?u?d?d?u?u +?d?d?d?u?l?l?u +?l?l?d?d?l?l?d?l +?d?d?d?u?u?u?l +?d?d?d?d?d?d?l?l?l?l +?d?l?d?d?d?d?d?d?d +?l?d?s?s?s?s +?l?l?u?l?u?u +?u?l?l?l?l?d?u +?d?d?d?l?l?d?l?d +?u?d?u?d?d?u?d?d +?d?d?d?l?d?l?l?d +?l?l?d?d?l?d?l?d +?l?d?d?l?d?l?d?l +?d?d?d?u?d?d?d?u +?l?s?d?d?l?l?l +?l?d?s?l?l?l?l +?d?d?d?d?d?d?d?d?d?s +?s?d?d?d?s?l?l +?l?s?l?d?d?d?s +?l?l?s?s?l?s +?s?u?s?u?s?u +?l?d?l?d?l?s?d +?u?u?u?d?d?s?d +?u?u?s?u?d?d?d +?l?d?l?d?d?l?s +?l?l?u?l?l?l?l +?d?d?l?d?l?d?l?d +?l?u?l?l?l?l?d +?l?s?l?l?l?l?d?d +?u?l?l?l?l?u?l +?u?u?u?u?u?s?s +?u?l?u?l?u?d?d?d +?u?l?d?l?d?l?l +?d?s?d?d?d?d?d?d?d +?l?l?u?l?l?l?d +?l?l?l?l?u?u?d +?d?s?d?d?d?d?s +?d?l?l?d?d?d?d?l +?l?d?d?l?l?l?l?d +?u?u?u?d?d?d?d?u +?u?l?l?l?u?u?d +?u?l?l?s?s?l +?u?l?l?l?s?d?d?d +?d?l?l?l?l?l?d?l +?d?l?d?d?l?d?s +?u?u?d?d?d?s?d +?l?u?d?d?d?d?s +?l?d?l?d?d?s?d +?u?d?u?d?s?d?d +?l?l?d?l?d?l?s +?d?d?l?l?s?l?l +?l?s?l?s?l?s?d +?l?l?l?d?l?d?l?l +?u?l?l?l?d?d?d?d?d +?l?l?l?s?u?u +?u?l?s?u?u?u +?l?l?l?u?u?s +?u?l?u?l?s?u +?d?d?u?d?d?l?d?d +?l?l?l?l?d?l?d?l +?l?d?l?d?d?d?l?l +?d?d?d?l?l?l?d?l +?d?l?d?l?l?l?d?d +?l?s?s?l?d?d?d +?u?s?d?d?d?d?s +?d?l?s?d?l?s?d +?d?d?d?d?d?u?l?u +?u?l?d?l?d?d?l +?u?u?l?u?d?d?d +?u?l?d?l?u?d?d +?d?d?d?d?u?l?u?l +?l?d?d?d?d?d?d?d?s +?l?l?l?d?l?d?l?d +?l?s?s?s?l?l +?s?u?u?u?u?u?s +?u?d?d?d?d?d?d?d?l +?d?l?l?d?l?d?l?d +?d?d?d?l?l?d?l?l +?d?l?l?l?d?d?d?l +?l?l?l?d?l?l?d?l +?l?l?d?d?s?u +?u?d?l?s?l?d +?l?d?l?u?s?d +?s?u?u?d?d?l +?l?d?d?l?u?s +?u?d?u?u?s?d +?l?u?u?d?d?s +?d?s?d?l?l?u +?l?u?l?d?s?d +?d?u?l?s?d?l +?d?l?u?l?d?s +?u?s?d?l?u?d +?u?d?d?s?l?l +?s?d?u?u?d?u +?u?l?d?u?s?d +?d?d?s?u?l?u +?s?u?d?d?l?l +?d?u?u?d?l?s +?d?l?l?d?s?l +?d?d?l?l?s?u +?d?u?d?u?s?u +?l?d?l?s?d?l?d +?s?l?l?d?d?u +?s?u?d?d?u?u +?u?d?s?d?u?u +?u?l?d?d?s?u +?u?s?u?d?u?d +?l?d?d?d?l?l?s +?l?d?l?d?s?u +?u?u?d?s?d?u +?u?u?d?s?d?l +?d?u?d?u?u?s +?d?l?s?d?u?l +?d?u?u?u?s?d +?l?s?d?d?l?u +?d?l?l?l?l?s?d +?l?l?d?u?s?d +?d?u?l?d?s?l +?u?d?d?u?s?l +?s?u?u?l?d?d +?u?u?d?d?u?s +?l?l?s?u?d?d +?u?d?d?s?l?u +?s?d?u?d?u?u +?s?d?u?l?l?d +?u?d?d?u?s?u +?d?d?l?l?l?d?s +?d?l?u?u?d?s +?u?s?l?u?d?d +?u?d?u?s?l?d +?s?l?l?u?d?d +?d?d?s?u?u?l +?l?d?l?d?s?l?d +?d?d?s?l?u?u +?d?l?l?s?u?d +?l?s?u?d?l?d +?d?l?u?s?d?u +?l?u?d?l?d?s +?u?l?d?d?u?s +?d?l?s?l?d?u +?l?u?d?s?l?d +?l?d?s?d?l?u +?u?d?d?l?u?s +?s?u?l?u?d?d +?d?l?d?s?l?l +?d?u?l?u?d?s +?d?l?d?u?s?l +?s?l?d?u?d?l +?u?u?s?d?u?d +?l?u?s?l?d?d +?u?d?d?u?u?s +?u?l?u?d?s?d +?l?d?l?s?l?d?d +?d?s?u?l?l?d +?d?u?s?u?d?l +?l?s?u?u?d?d +?l?l?u?s?d?d +?l?l?d?l?d?l?l?d +?d?d?d?s?s?s?l +?d?u?u?d?d?u?d +?d?l?u?u?d?d?d +?d?d?u?l?d?d?u +?u?d?l?u?d?d?d +?d?d?u?d?d?u?l +?d?d?u?u?l?d?d +?l?d?u?d?l?d?d +?d?l?l?d?d?d?l?d +?d?l?l?l?d?l?d?d +?u?d?l?d?l?d?d?d +?d?l?d?u?d?l?d +?d?d?u?u?d?u?d +?d?l?u?l?d?d?d +?l?l?d?d?d?u?d +?d?u?l?u?d?d?d +?l?u?d?d?l?d?d +?d?d?d?u?d?u?u +?u?d?d?d?l?l?d +?l?d?d?d?l?d?d?d?d +?u?l?l?l?l?s?u +?d?s?s?d?s?s +?s?d?s?s?s?d +?s?d?s?d?s?s +?l?l?d?d?d?l?d?l +?l?l?l?l?l?d?d?d?d?d +?d?u?u?l?u?u +?l?l?d?u?l?u +?l?u?d?l?u?u +?u?u?d?l?u?l +?d?l?u?u?l?u +?l?d?u?u?u?l +?l?l?l?u?l?l?d +?l?u?l?u?d?u +?l?l?d?l?d?l?l?l +?l?s?s?l?l?d?d +?d?s?s?s?d?d?d +?l?d?d?l?l?d?l?l +?d?d?d?d?d?l?l?d?d +?l?u?l?u?l?u?l +?d?l?d?l?l?l?l?l +?u?d?d?d?d?d?l?l +?d?l?d?d?d?l?d?l +?d?d?u?u?u?d?d?d +?s?d?l?s?l?s +?s?d?l?l?s?s +?l?s?d?s?l?s +?d?d?d?d?d?d?d?d?d?u +?d?d?d?d?d?s?d?l +?s?l?s?l?d?d?d +?s?s?s?s?l?d +?s?l?s?l?s?s +?u?l?l?l?u?d?d?d +?s?u?l?l?l?l?s +?u?u?s?d?d?d?d?d +?l?l?d?s?d?d?d?d +?l?l?l?s?u?s +?u?u?u?s?u?s +?u?l?s?u?l?s +?l?d?l?l?s?l?l +?l?l?s?d?d?d?d?d?d +?d?u?d?u?u?u?u +?d?d?u?u?l?l?l +?u?l?d?d?d?d?l?l +?u?u?d?d?d?d?d?u +?l?l?u?d?d?d?d?d +?d?d?d?d?u?u?u?d +?d?u?u?u?d?d?d?d +?d?d?d?l?d?l?d?l +?l?d?l?d?l?s?l +?u?l?l?l?d?s?d +?d?d?l?s?l?l?l +?l?l?d?l?l?s?d +?u?u?u?u?u?s?d?d +?l?l?s?l?s?s +?s?l?l?s?l?s +?l?s?l?l?d?l?l +?l?u?l?l?l?l?l +?l?l?d?s?l?s +?u?d?u?u?s?s +?d?l?l?s?l?s +?d?l?s?l?l?s +?d?s?l?l?l?s?d +?s?d?l?s?l?l +?d?d?s?s?l?l?l +?l?l?s?s?d?l +?s?d?d?l?l?l?s +?s?l?l?s?l?d +?l?s?d?l?s?l +?l?s?d?l?l?s +?u?d?l?l?s?s +?d?s?l?l?l?s +?s?l?s?d?l?l +?l?d?l?l?l?d?d?l +?s?u?u?u?u?u?u +?u?l?l?l?l?s?l +?l?s?l?l?l?d?l +?u?l?d?d?d?d?u?l +?l?d?l?l?d?s?d +?l?d?d?l?d?l?s +?d?d?d?s?u?l?l +?d?d?l?l?l?l?l?l?l +?u?s?u?l?l?l?l +?u?l?d?d?l?l?d?d +?u?u?d?l?l?d?d +?l?d?l?l?d?d?d?l +?u?d?u?d?u?d?l +?l?l?u?d?d?d?u +?u?d?u?u?d?d?u +?u?l?u?d?u?d?d +?d?u?u?u?d?u?d +?d?d?d?l?u?u?u +?l?u?l?u?l?s +?l?s?u?u?u?u +?u?l?s?l?u?l +?l?u?s?l?l?l +?l?d?l?s?l?l?l +?l?l?d?l?d?l?d?l +?l?l?l?d?u?l?l +?l?l?d?d?d?d?s?s +?u?d?d?d?s?d?d?d +?u?u?u?u?d?d?l +?u?d?d?u?l?l?l +?l?l?d?l?d?d?l?d +?l?l?l?l?d?d?s?d +?l?l?s?l?l?d?l +?u?l?u?l?u?l?d?d +?d?s?d?s?d?l?l +?l?l?s?d?d?s?d +?l?l?l?l?l?u?l +?l?d?d?d?d?d?d?d?d?l +?l?u?l?u?d?d?d?d +?d?d?l?l?d?l?l?d +?l?l?l?l?d?s?d?d +?l?d?d?d?d?u?d +?d?d?d?l?d?u?d +?d?d?l?d?d?d?u +?u?d?u?u?d?d?d?d +?d?l?d?d?d?d?u +?d?d?l?d?d?u?d +?d?d?l?d?u?d?d +?d?l?u?d?d?d?d +?l?d?d?d?u?d?d +?l?d?l?l?l?s?l +?s?d?u?l?l?l?l +?l?l?d?d?l?d?l?l +?s?s?l?l?l?s?s +?d?d?s?d?s?d?d?d +?u?d?l?d?u?d?l?d +?l?d?d?d?l?d?l?l +?d?d?l?l?l?d?l?d +?u?d?u?l?l?l?l +?l?l?d?l?l?d?d?l +?l?l?l?s?l?d?l +?d?d?d?d?u?u?l?l +?l?l?d?d?s?d?d?d +?l?l?s?l?d?d?d?d +?l?u?l?l?u?d?d +?d?d?l?l?u?l?l +?l?s?l?s?s?l +?l?s?s?l?s?l +?u?l?u?s?s?s +?l?l?l?d?d?d?d?u +?u?u?l?d?d?d?d?d +?u?l?s?l?l?l?l +?d?l?l?d?l?l?l?l +?s?s?l?d?d?d?d +?l?d?d?s?s?d?d +?d?d?s?u?s?d?d +?l?d?s?s?d?d?d +?s?d?d?d?d?l?s +?d?d?s?s?d?d?l +?d?s?d?s?d?d?u +?l?l?l?l?s?l?s +?u?u?s?u?s?u +?l?s?l?d?l?s?l +?l?d?d?d?l?l?d?l +?d?d?s?d?d?d?d?l +?l?l?l?d?d?l?d?l +?l?l?u?u?l?l?d +?s?s?d?d?s?d?d +?d?d?d?s?s?s?d +?l?d?d?d?s?s?s +?s?l?l?d?d?d?d?d +?d?d?d?d?d?l?s?l +?d?l?l?l?d?l?l?d +?s?u?u?u?d?d?d +?d?d?s?l?l?l?d +?d?s?d?l?l?l?d +?l?u?l?s?d?d?d +?u?d?u?d?u?d?s +?u?l?l?d?d?s?d +?l?d?d?s?d?l?l +?s?s?d?d?d?d?s?s +?l?l?l?l?l?s?u +?d?d?d?l?l?l?l?s +?s?l?s?s?l?s +?l?s?s?s?s?l +?d?l?l?l?l?d?l?d +?u?u?u?u?s?d?d?d +?l?s?l?l?l?d?d?d +?u?d?d?u?d?u?d?d +?d?d?l?l?l?d?l?l +?u?u?u?u?l?l?d +?s?d?d?u?u?s +?s?d?d?u?l?s +?u?d?u?s?s?d +?d?s?l?l?d?s +?u?d?l?s?d?s +?l?s?d?d?s?u +?u?s?d?s?l?d +?s?d?u?u?s?d +?u?s?s?d?d?l +?u?d?s?l?d?s +?u?d?d?s?s?u +?l?d?s?s?d?l +?s?d?d?s?u?u +?l?l?d?s?d?s +?d?s?l?s?l?d +?d?u?u?s?s?d +?u?s?s?d?u?d +?u?d?d?s?s?l +?u?s?s?d?d?u +?s?d?s?l?d?l +?l?d?s?l?s?d +?s?d?s?d?l?l +?u?s?l?d?d?s +?s?d?u?u?d?s +?l?l?d?s?s?d +?u?d?l?d?s?s +?d?s?d?l?s?l +?s?d?d?s?u?l +?u?d?d?u?s?s +?d?d?s?s?u?l +?s?u?s?u?d?d +?s?l?u?d?d?s +?s?s?d?d?d?l?l +?s?s?u?u?d?d +?s?u?d?l?d?s +?d?u?u?d?s?s +?d?l?s?s?d?l +?l?d?d?u?s?s +?u?d?s?s?d?u +?d?s?l?s?d?l +?u?d?u?s?d?s +?d?s?d?s?u?u +?l?s?s?d?d?l +?l?s?u?s?d?d +?d?d?d?s?l?s?l +?d?l?s?d?s?l +?s?l?d?s?u?d +?d?l?s?s?l?d +?s?u?d?d?s?u +?d?u?s?d?s?u +?s?s?d?l?l?d +?s?s?l?d?l?d +?d?s?l?d?s?u +?d?u?s?d?u?s +?d?s?u?s?d?u +?u?d?s?l?s?d +?s?d?s?u?d?l +?s?d?d?d?l?l?s +?u?s?u?d?d?s +?u?d?l?l?u?d?l +?l?l?d?d?l?l?u +?d?u?l?l?l?u?d +?d?d?u?l?u?l?u +?d?u?u?d?u?u?u +?u?l?d?d?u?l?u +?d?d?l?d?l?s?d +?d?d?d?d?s?l?u +?u?d?d?l?d?d?s +?s?d?d?d?d?u?l +?d?l?d?l?s?d?d +?d?s?d?d?d?u?u +?d?d?d?s?l?d?l +?u?d?d?s?d?d?u +?l?d?d?d?l?s?d +?u?d?d?u?s?d?d +?s?l?d?l?d?d?d +?l?d?s?d?l?d?d +?l?l?d?d?d?s?d?d +?d?d?d?l?s?l?d +?u?d?d?d?d?u?s +?s?d?d?d?l?l?d +?d?l?d?d?l?l?l?d +?l?u?l?l?d?d?d?d +?d?u?u?d?d?d?d?d +?d?l?l?l?l?l?u +?s?l?u?l?u?d +?s?l?u?u?l?d +?l?l?u?l?s?d +?d?s?l?u?l?l +?s?u?u?u?d?u +?s?u?u?u?d?l +?u?d?s?l?l?l +?d?l?l?l?u?s +?u?u?u?s?u?d?d +?l?l?l?s?d?u +?l?l?d?l?s?u +?u?l?s?d?u?l +?u?l?d?u?l?s +?s?l?d?l?u?l +?u?l?s?u?d?u +?u?l?l?u?s?d +?u?l?l?d?u?s +?s?u?u?l?l?d +?l?s?d?l?l?u +?u?u?d?u?s?u +?d?u?s?l?l?l +?s?u?u?l?d?l +?s?d?u?l?u?l +?l?l?s?u?d?l +?u?l?d?l?s?l +?u?u?u?s?d?l +?u?s?l?d?l?u +?u?u?u?u?d?s?d +?d?u?s?u?u?u +?d?u?u?u?s?u +?u?d?l?l?s?u +?l?d?u?l?l?s +?u?s?l?d?u?l +?l?d?s?u?l?l +?l?u?l?d?l?s +?u?u?d?s?u?u +?d?l?l?u?l?s +?l?l?u?u?s?d +?u?u?l?d?s?l +?l?s?d?u?u?u +?u?l?s?u?l?l?l +?u?u?d?u?d?d?u +?l?d?l?u?l?d?d +?u?d?l?u?d?d?l +?u?l?u?d?d?d?l +?u?d?d?l?l?d?l +?d?u?d?u?d?u?u +?u?l?u?d?d?l?d +?u?l?d?u?l?d?d +?u?u?d?d?d?u?l +?d?u?d?d?u?l?l +?u?u?l?d?d?d?l +?s?d?l?l?l?d?s +?l?l?d?d?d?d?s?d +?l?d?d?l?l?l?d?l +?d?d?s?d?d?d?s?d +?s?l?l?l?l?l?d?d +?s?s?s?d?d?d?l +?l?s?s?s?d?d?d +?l?d?d?d?d?d?s?d +?u?s?s?s?s?s +?d?d?l?l?l?d?d?s +?u?l?l?l?s?l?l +?u?s?l?l?l?u +?s?u?l?l?l?l?l +?l?s?l?l?l?u +?u?l?l?u?s?u +?s?l?u?l?l?l +?u?l?s?u?l?u +?l?l?l?u?l?s +?l?l?s?l?l?u +?d?d?d?d?d?d?d?l?s +?d?l?d?l?d?l?l?d +?l?l?d?l?d?d?d?l +?l?s?s?l?l?s +?s?l?l?l?l?d?d?d +?u?l?l?d?u?l?d +?u?l?l?d?d?u?l +?s?u?l?l?l?d?d +?l?s?l?l?d?l?d +?d?l?l?l?d?l?s +?u?l?u?l?d?d?s +?s?u?u?u?u?d?d +?s?s?d?d?l?l?l +?d?d?d?u?l?l?d?d +?l?d?d?d?d?d?d?l?l +?d?d?s?l?l?l?l?l +?s?s?s?s?u?u +?d?l?l?l?d?d?l?d +?d?l?d?l?d?l?l?l +?l?l?s?s?l?l?l +?s?s?s?l?l?d +?s?s?d?l?l?s +?s?s?l?d?l?s +?s?s?s?d?l?l +?s?l?l?d?s?s +?l?s?l?d?s?s +?l?s?d?l?s?s +?s?l?s?l?d?s +?l?d?d?l?d?s?s +?l?l?l?l?l?d?s?d +?l?l?s?l?l?l?l?l +?l?d?l?l?d?d?l?l +?d?l?l?l?l?d?d?d?d +?l?l?d?d?l?d?s +?l?d?d?s?l?l?d +?s?l?d?l?l?d?d +?l?l?d?l?s?d?d +?l?l?d?l?d?d?s +?l?l?s?d?d?l?d +?l?d?s?l?d?l?d +?d?d?d?u?l?l?s +?l?l?l?d?d?d?s?s +?s?d?l?d?l?d?l +?s?s?u?l?l?l +?u?s?u?l?l?s +?u?u?u?l?d?d?d?d +?d?l?l?d?d?d?l?l +?d?l?l?l?d?d?l?l +?s?d?l?l?l?s?d +?d?l?l?s?l?l?l +?u?u?u?u?u?u?l +?u?s?u?l?l?d?d +?u?l?s?l?l?d?d +?l?d?l?s?l?l?d +?u?u?l?l?d?d?s +?u?l?l?l?l?d?d?s +?l?l?d?d?u?l?l +?l?d?l?d?d?l?l?l +?u?l?d?d?l?l?u +?u?l?l?d?d?u?u +?l?l?l?s?s?l?l +?s?d?u?d?d?d?d +?d?u?s?d?d?d?d +?d?u?d?d?d?s?d +?d?d?d?d?u?d?s +?d?s?d?d?d?l?d +?s?u?d?d?d?d?d +?d?d?u?d?d?d?s +?u?l?d?u?l?l?l +?u?u?u?d?d?u?u?u +?l?l?l?l?u?l?d +?u?l?l?l?d?d?d?s +?d?d?d?l?d?l?l?l +?l?l?l?l?l?l?s?d?d +?l?l?l?l?l?u?d?d +?s?d?d?s?l?l?l +?u?u?u?s?s?d?d +?u?l?l?d?d?l?l?l +?l?u?u?u?u?u?d?d +?u?u?u?l?l?d?d?d +?d?d?d?d?d?d?d?u?l +?u?l?l?l?l?l?s?d +?d?u?d?u?u?d?d +?d?u?d?d?d?u?u +?d?u?l?d?d?u?d +?d?u?d?l?l?d?d +?u?d?d?l?d?u?d +?d?u?d?l?u?d?d +?l?d?l?d?u?d?d +?l?u?d?d?d?d?u +?u?u?d?l?d?d?d +?d?u?d?d?u?u?d +?u?d?l?d?d?d?l +?l?d?d?d?d?l?u +?l?u?d?d?u?d?d +?d?l?d?d?d?u?l +?u?d?d?u?d?l?d +?d?d?l?d?d?u?u +?u?d?d?d?u?u?d +?d?l?d?u?l?d?d +?u?d?d?d?u?l?d +?l?d?d?l?d?l?l?l +?l?l?u?u?u?u?u +?d?l?l?u?l?l?l +?l?d?l?l?s?l?d +?l?s?l?d?l?d?l +?d?d?l?l?d?d?d?d?d +?u?s?l?l?l?l?d +?u?l?u?l?u?l?s +?u?l?l?d?d?d?d?l +?d?u?d?u?d?u?d?u +?d?d?l?d?l?l?l?l +?s?l?l?s?s?l +?s?u?u?u?s?s +?d?l?l?d?l?l?l?d +?d?s?d?d?d?s?d?d +?u?u?u?d?d?s?s +?d?l?d?l?l?d?d?l +?u?d?l?u?d?l?l +?u?d?d?l?l?d?u +?l?u?d?d?d?l?l +?u?d?d?u?u?d?u +?l?u?d?d?l?l?l +?d?l?l?u?l?l?d +?u?l?d?d?d?u?u +?u?d?d?u?d?l?l +?u?d?d?l?u?d?l +?u?l?d?d?l?d?u +?l?l?l?d?d?u?d +?d?d?d?l?u?l?l +?u?u?l?l?u?d?d +?d?d?d?d?l?l?l?u +?l?l?l?l?l?l?l?d?d?d +?d?d?d?s?l?l?s +?l?l?s?d?s?d?d +?l?l?s?l?l?s?d +?d?d?u?l?l?d?d?d +?l?l?l?d?l?d?d?l +?d?d?l?d?l?l?l?d +?d?d?s?u?s?s +?l?d?s?s?d?s +?s?l?d?d?s?s +?d?s?d?s?l?s +?l?d?s?d?s?s +?s?l?s?d?s?d +?s?l?s?s?d?d +?l?d?d?s?s?s +?s?s?s?u?d?d +?d?d?l?s?s?s +?s?s?d?d?l?s +?u?l?l?l?l?u?s +?u?u?u?u?u?l?d +?u?u?u?d?d?l?l?l +?l?s?s?l?l?l?l +?l?s?l?l?l?s?l +?l?l?l?d?l?d?s +?d?l?l?d?l?l?d?l +?d?d?s?d?d?s?u +?s?d?d?l?s?d?d +?u?d?d?s?d?d?s +?d?d?s?d?s?d?l +?d?d?d?l?s?s?d +?d?s?d?d?s?d?l +?u?d?s?d?s?d?d +?s?d?d?s?d?d?l +?d?d?d?d?u?s?s +?s?s?d?d?l?d?d +?d?s?d?d?s?l?d +?l?s?l?s?l?l?l +?u?l?u?d?d?d?d?d?d +?l?l?l?l?d?d?s?s +?l?d?d?d?d?d?d?d?u +?d?d?l?d?d?d?d?s +?d?d?s?d?d?l?d?d +?d?d?s?l?d?d?d?d +?s?d?d?d?d?d?d?u +?l?l?s?d?d?s?d?d +?u?s?d?l?l?s +?s?d?s?u?u?u +?s?s?l?d?l?l +?u?s?d?u?u?s +?l?d?s?l?l?s +?u?s?l?l?d?s +?s?l?l?s?d?u +?u?s?l?d?l?s +?l?l?d?s?s?l +?s?d?u?l?l?s +?s?u?s?u?d?l +?d?s?s?l?l?l +?d?u?u?u?s?s +?s?u?u?d?u?s +?s?u?l?l?d?s +?l?s?u?d?s?l +?u?s?d?s?u?u +?u?s?d?u?s?u +?u?u?l?d?s?s +?u?u?d?d?d?d?d?d?d?d +?d?u?u?l?l?l?l +?l?d?d?d?d?l?d?d?d +?d?u?d?d?u?d?d?d +?l?d?l?d?l?d?d?d?d +?d?d?u?l?l?d?d?d?d +?l?d?d?d?u?d?d?d +?d?l?l?d?d?l?l?l +?d?u?l?l?l?l?l?l +?s?l?l?d?l?d?d +?l?d?l?d?d?s?l +?u?l?s?l?d?d?d +?d?l?l?d?d?l?s +?l?l?d?d?l?s?d +?l?s?l?d?d?d?l +?l?d?s?l?l?d?d +?s?l?l?l?l?l?l?s +?l?l?l?l?d?d?d?d?s +?d?l?d?d?d?l?l?l +?d?l?l?d?l?d?d?l +?d?l?l?d?d?l?d?l +?d?l?d?l?d?d?l?l +?d?d?l?l?d?l?d?l +?d?l?d?d?l?l?l?l +?u?u?d?u?d?d?d?d +?d?s?s?s?s?s +?l?l?l?l?l?l?l?l?d?d diff --git a/masks/rockyou-4-43200.hcmask b/masks/rockyou-4-43200.hcmask new file mode 100644 index 0000000000..9dd34f793c --- /dev/null +++ b/masks/rockyou-4-43200.hcmask @@ -0,0 +1,7735 @@ +?d +?d?d +?l +?d?d?d?d +?d?d?d?d?d?d +?d?d?d?d?d +?l?l +?d?d?d +?u +?s +?l?l?l +?u?u +?l?d +?d?d?d?d?d?d?d +?u?d +?l?l?l?l +?l?l?d?d?d?d +?u?u?u +?l?l?d +?u?l +?l?d?d?d?d +?l?l?l?l?l +?l?l?l?d?d +?l?d?d +?d?d?d?d?l +?l?d?d?d?d?d +?l?l?d?d +?s?d +?l?l?l?d?d?d +?l?l?l?l?d?d +?s?s +?d?d?d?d?l?l +?l?l?d?d?d +?d?d?d?d?d?l +?d?d?d?d?d?d?d?d +?d?l +?u?l?l +?l?s +?l?l?l?l?d +?l?l?l?d +?l?d?d?d +?l?d?l +?l?d?d?d?d?d?d +?u?u?u?u +?l?l?l?l?l?l +?d?d?d?l +?u?u?d +?d?d?d?d?d?d?l +?s?d?d +?u?d?d?d?d +?u?u?u?u?u +?d?l?l +?d?d?d?l?l +?u?u?d?d?d?d +?d?d?d?d?s +?d?d?d?d?u +?l?l?l?d?d?d?d +?l?l?l?l?l?d +?u?l?l?l +?u?u?u?d?d +?d?s?d +?l?s?l +?l?d?d?d?d?l +?d?d?s?d?d +?u?d?d +?d?d?l +?d?d?d?l?l?l +?u?d?d?d?d?d +?d?d?l?d?d +?d?d?s +?d?d?l?l?l +?d?d?l?l +?u?u?u?u?d?d +?l?l?d?d?d?d?d +?l?d?d?l?d?d +?u?l?l?l?l +?u?u?d?d?d +?d?d?l?l?d?d +?u?d?u +?u?u?u?d?d?d +?d?d?d?d?d?u +?u?u?d?d +?u?u?u?u?d +?l?d?l?d +?u?d?d?d +?d?d?u +?d?d?d?d?u?u +?d?l?l?l +?l?s?d +?l?d?d?d?l +?l?d?d?l +?s?d?d?d?d +?d?l?l?l?l +?l?l?s +?d?d?d?d?l?d +?d?d?d?d?d?d?d?d?d +?d?d?l?l?l?l +?l?l?d?l +?d?d?d?l?d +?l?d?l?l +?d?d?d?s +?l?d?l?d?d +?d?d?l?d?d?d +?l?l?l?l?l?d?d +?u?d?d?d?d?d?d +?l?l?l?l?d?d?d +?l?d?l?d?l?d +?s?s?s +?d?d?d?l?d?d +?d?s?d?d +?d?l?d?d?d +?u?u?u?d +?d?l?d?d?d?d +?l?l?l?d?l +?d?l?l?d +?d?l?d?d +?d?d?l?d +?u?l?l?l?d?d +?d?d?d?s?d +?d?d?d?d?d?s +?l?d?l?d?l +?u?l?l?d?d +?u?u?l +?l?d?d?l?d +?u?u?u?u?u?u +?l?l?d?l?l +?d?d?d?d?d?d?u +?l?d?l?l?l +?l?l?d?d?l +?u?d?l +?d?u?u +?d?l?l?l?d +?l?d?l?d?d?d +?d?s?d?d?d +?u?l?d?d?d?d +?u?s?u +?l?d?l?l?d +?d?d?d?d?l?l?l +?d?d?d?u?u +?l?l?d?d?l?l +?d?l?l?l?l?l +?u?l?l?l?d +?d?d?l?d?d?l +?s?d?l +?l?d?d?d?d?d?d?d +?l?u?u +?l?d?d?l?l +?l?l?l?l?s +?d?l?l?d?d +?d?d?l?l?d +?u?u?u?u?u?d +?l?s?d?d +?d?d?d?d?d?l?l +?d?d?s?d?d?d +?d?l?d?l?d +?l?l?d?l?d +?u?l?l?d?d?d +?s?d?s +?s?s?d +?d?l?l?l?d?d +?s?l?l +?u?u?s +?d?d?d?s?d?d +?d?l?l?l?l?d +?l?l?l?s +?l?l?d?d?d?l +?d?d?d?d?d?d?d?l +?s?d?d?d?d?d +?l?l?l?d?d?l +?d?d?d?d?s?d +?l?l?s?d?d +?l?l?l?l?l?l?l +?l?l?d?d?d?d?d?d +?d?d?d?l?l?d +?u?d?d?d?d?u +?l?l?l?l?d?l +?l?d?d?d?l?l +?d?l?d?l?d?l +?d?l?l?d?d?d +?u?l?l?l?l?l +?u?l?l?d +?l?l?l?l?l?l?d +?d?d?d?u?u?u +?u?u?u?d?d?d?d +?l?d?l?l?d?d +?l?l?l?s?d?d +?d?d?s?d +?d?l?d?l +?u?l?l?l?l?d +?u?l?d?d?d +?u?l?u +?l?u?l +?l?l?u +?d?d?l?d?l +?l?d?d?l?l?l +?l?l?d?l?l?d +?d?d?u?d?d +?d?d?d?d?d?d?s +?l?l?l?d?l?l +?l?l?l?l?d?d?d?d +?l?d?d?d?l?d +?d?d?u?u?u +?l?l?d?l?l?l +?l?d?l?l?l?l +?l?l?s?d +?d?l?d?d?l +?d?d?d?d?d?d?d?d?d?d +?d?d?l?l?l?d +?u?l?s +?d?l?d?l?l +?l?l?d?l?d?d +?l?d?l?l?d?l +?l?l?l?s?d +?d?s?d?s?d?d +?d?d?l?l?l?d?d +?u?d?d?u?d?d +?d?l?l?d?l +?s?d?d?d?d?s +?d?s?d?d?d?d +?d?u?u?u +?s?d?d?d?s +?d?d?d?u +?d?d?d?d?s?s +?d?l?d?l?d?d +?l?l?l?d?l?d +?u?u?d?d?d?d?d +?d?l?d?d?l?d +?d?u?u?u?u +?l?l?d?d?l?d +?d?d?d?d?d?d?l?l +?l?l?s?l?l +?u?l?u?l +?l?l?l?l?l?s +?l?d?l?l?l?d +?u?d?u?d?d +?s?d?d?d +?l?s?l?l?l +?u?d?d?d?u +?l?d?d?l?l?d +?l?l?l?l?u +?d?d?l?d?l?d +?u?d?u?u +?l?s?d?d?d?d +?l?d?d?l?d?l +?l?l?l?s?l +?d?d?d?l?d?d?d +?l?d?l?d?d?l +?l?l?s?l +?d?d?u?u?d?d +?d?d?d?d?u?d +?l?d?l?d?l?l +?d?s?d?s?d +?d?l?d?d?d?l +?u?u?l?l +?d?d?l?d?d?d?d +?d?d?d?l?l?l?l +?d?d?d?l?d?l +?l?s?l?l +?u?l?l?l?u +?l?l?l?l?s?d +?d?d?u?u?u?u +?d?d?d?d?l?d?d +?d?d?d?s?s +?u?s?d?d +?u?l?l?d?d?d?d +?d?d?d?s?d?d?d +?u?u?u?u?u?d?d +?l?l?s?d?d?d +?l?l?l?d?d?d?d?d +?s?s?d?d?d +?l?d?d?d?d?d?l +?d?d?d?u?d?d +?l?s?l?d?d +?u?u?u?d?u +?l?l?d?l?d?l +?d?d?u?d?d?d +?u?d?d?u?d +?d?d?d?d?s?d?d +?l?s?d?d?d +?d?d?d?d?u?l +?u?l?u?l?u +?u?u?u?u?d?d?d +?u?d?u?d?u +?l?u?u?u?u +?u?l?l?u +?u?d?u?d?u?d +?d?u?l?l +?u?u?d?u +?l?d?d?d?d?s +?u?d?d?d?d?l +?d?d?l?l?d?l +?d?u?d?d?d +?d?d?d?u?d +?u?l?u?d?d +?u?l?l?l?l?d?d +?u?d?d?u +?d?d?u?u +?l?d?u?d +?u?d?u?d +?u?l?d?d +?d?d?d?d?s?l +?u?u?d?d?u +?d?d?l?d?l?l +?l?s?l?s?l +?d?l?l?d?l?l +?d?u?d?d?d?d +?l?l?l?d?d?s +?u?u?l?l?l +?l?l?l?l?l?l?d?d +?l?s?l?s +?u?d?u?u?u +?s?l?l?l?l +?d?d?s?d?d?d?d +?d?l?l?d?l?d +?d?d?l?l?l?l?l +?d?l?l?d?d?l +?d?u?u?u?u?u +?u?d?u?u?d +?u?d?u?d?d?d +?d?l?d?d?l?l +?l?l?l?l?l?d?d?d +?d?l?l?l?d?l +?s?d?d?d?d?d?d +?d?l?d?l?l?d +?u?u?d?u?u +?u?l?u?d?d?d +?s?l?l?l +?d?u?d?u?d +?u?d?d?d?l +?s?s?s?s +?l?l?d?d?s +?d?s?d?l +?d?d?s?l +?s?l?d?d +?d?l?d?l?l?l +?u?u?u?u?s +?d?u?l?u +?u?d?d?d?d?d?d?d +?l?s?l?d?d?d +?l?u?u?u +?u?u?u?l +?d?d?l?l?d?d?d +?l?l?l?s?s +?u?d?d?l?d +?l?u?d?d?d +?d?d?u?u?d +?l?u?d?d?d?d +?d?d?d?d?d?l?d +?d?u?u?u?d +?s?s?d?d?d?d +?d?d?d?s?l +?d?d?d?d?l?s +?s?s?d?d +?u?l?u?l?d?d +?l?s?l?d +?l?l?l?u +?d?s?d?d?s?d?d +?d?d?s?d?d?s +?u?l?l?l?d?d?d +?u?u?u?s +?d?d?u?d?d?u +?u?d?d?u?u +?l?d?l?d?d?d?d +?d?l?d?d?d?d?d +?d?d?d?d?u?u?u +?u?s?d?d?d?d +?l?l?u?d?d +?u?u?d?u?d +?u?l?l?l?s +?d?d?s?d?s?d?d +?d?d?d?d?d?d?d?u +?d?d?d?d?d?s?d +?u?u?s?d?d +?d?d?d?d?d?u?u +?u?d?l?l?l +?u?u?d?d?u?u +?u?d?l?l?d +?d?d?u?d?u +?u?d?l?d?d +?d?l?l?l?l?l?l +?d?d?d?l?l?d?d +?s?l?l?l?s +?u?u?l?d?d +?d?d?u?l?l +?l?l?u?l?l +?l?s?l?l?l?l +?u?l?d?d?d?d?d +?l?l?d?d?d?s +?u?u?l?d?d?d +?l?d?d?d?d?d?d?l +?l?l?l?l?s?d?d +?l?u?u?d?d?d +?u?l?u?l?l +?l?l?d?d?d?l?l +?l?d?d?d?d?d?d?d?d +?u?u?u?u?u?u?d +?l?l?l?l?s?l +?d?d?d?d?l?l?d +?u?u?u?s?d?d +?l?l?d?d?d?d?l +?d?d?d?d?l?l?l?l +?d?u?u?u?u?d +?l?l?s?l?l?l +?l?l?u?d?d?d +?d?d?d?u?l +?u?l?u?l?d +?u?u?u?u?l +?l?d?d?d?s +?l?u?l?d?d?d +?l?l?l?l?d?s +?u?d?l?l +?d?u?d?u?d?u +?l?u?l?d?d +?d?u?u?d?u +?u?l?d?l +?u?u?d?l +?d?d?s?s?d?d +?l?l?s?d?d?d?d +?u?l?l?u?l +?d?d?s?l?l +?s?d?l?l?l +?l?u?l?l?l +?l?d?d?d?d?l?l +?u?u?d?d?d?d?d?d +?u?l?l?l?l?u +?d?u?u?u?d?d +?u?l?d?d?l +?u?l?d?l?d +?u?u?l?l?d?d +?l?d?l?d?l?d?d +?l?l?l?l?s?s +?u?u?u?u?u?u?u +?l?l?l?d?s +?l?l?l?s?l?l +?d?u?u?d?d?d +?u?u?u?u?d?u +?d?u?l?l?l +?u?d?d?l?d?d +?d?d?d?u?u?d +?l?d?d?d?l?l?l +?d?d?u?l?l?l +?l?l?l?u?u +?u?u?d?d?d?u +?d?d?d?u?l?l +?u?d?l?d?l +?l?u?l?u?l +?d?l?s?l +?s?l?l?d +?u?u?u?s?d +?d?s?l?l +?l?s?d?l +?l?l?d?s?d +?u?u?s?d +?u?s?d?u +?l?d?d?l?d?d?d +?d?u?u?d?d +?d?u?d?d?u +?d?d?d?d?d?d?d?d?l +?l?l?u?u +?u?l?l?d?l +?u?u?u?l?l +?s?l?l?l?l?l +?l?d?d?s?d?d +?l?l?l?s?d?d?d +?l?l?u?u?u +?d?d?s?d?d?s?d?d +?d?l?l?l?d?d?d +?u?u?s?u?u +?u?u?u?d?d?u +?d?d?d?d?d?l?l?l +?d?d?d?s?l?l +?u?s?u?s +?u?s?u?d?d +?u?l?s?d?d +?u?l?l?u?d?d +?u?d?d?l?l +?d?u?l?l?d +?d?u?d?u?u +?u?s?u?u?u +?u?l?d?l?l +?u?d?d?d?u?u +?u?l?l?l?l?l?d +?u?d?u?u?d?d +?s?l?l?l?l?s +?l?l?l?d?l?l?l +?u?d?d?d?d?s +?d?l?l?d?d?d?d +?d?l?l?l?l?l?d +?l?l?s?s?l +?l?d?d?d?l?d?d +?s?d?l?l?l?l +?l?s?l?l?d +?u?d?d?u?u?u +?l?d?l?d?s +?u?u?u?s?u +?d?d?d?d?l?u +?l?d?s?s +?l?d?d?s?d +?s?l?d?d?d +?s?d?d?d?l +?u?s?d?d?d +?d?s?d?d?l +?u?d?u?u?u?u +?u?l?l?s +?u?u?s?u +?d?l?d?l?d?l?d +?u?l?d?d?u +?d?l?l?l?l?d?d +?l?l?l?u?l +?l?l?l?d?d?d?l +?u?s?u?s?u +?d?d?d?d?d?d?d?s +?d?s?d?d?d?d?d +?u?u?s?d?d?d +?u?u?u?d?u?u +?l?l?d?d?l?l?l +?l?l?l?l?l?l?l?l +?l?u?u?u?d +?u?u?l?l?d +?u?l?l?u?d +?d?u?d?d?u?d +?d?u?l?l?l?l +?l?l?l?l?l?u +?u?u?d?u?u?u +?u?u?d?u?u?d +?u?l?l?u?l?l +?u?d?u?u?d?u +?s?s?s?d?d +?d?d?d?l?u +?d?d?u?l?d?d +?d?d?l?d?u +?d?d?d?s?d?d?d?d +?u?l?u?d?d?d?d +?u?u?u?u?u?s +?d?s?l?l?l +?l?s?l?l?d?d +?s?l?d?d?d?d +?u?l?l?l?l?s +?u?s?l?l?l +?d?d?s?d?s?d +?l?u?u?d?d +?l?d?d?l?d?d?l +?s?d?d?d?d?l +?u?d?l?d?l?d +?d?d?s?l?l?l +?s?l?l?l?d?d +?s?d?s?d?d +?d?s?s?d?d +?d?s?d?d?s?d +?d?s?d?d?s +?u?l?u?l?u?l +?u?d?l?l?d?d +?l?s?s?l +?u?u?s?s +?l?l?s?s +?u?d?l?l?l?l +?u?l?l?l?d?l +?d?d?u?d?d?d?d +?l?u?u?u?d?d +?u?l?l?s?d?d +?u?u?d?d?u?d +?d?d?u?u?u?d +?u?u?u?u?d?d?d?d +?l?d?d?d?d?u +?l?l?l?d?d?l?l +?l?l?l?u?d +?l?s?l?d?d?d?d +?u?u?d?u?d?d +?d?d?d?u?d?d?d +?u?u?u?u?s?d +?u?l?l?s?d +?l?s?l?d?l +?l?l?l?d?d?d?d?d?d +?u?l?u?u?l +?u?d?d?d?u?d +?d?u?d?u?d?d +?l?s?l?s?d?d +?s?d?d?s?d?d +?d?d?d?d?d?d?u?u +?u?d?l?l?d?l +?d?d?d?d?s?u +?l?l?d?d?l?d?d +?l?l?d?l?s +?l?d?l?l?d?d?d +?s?s?s?s?s +?u?d?l?d?d?d +?d?d?u?d?u?d +?l?l?l?l?l?l?l?d +?d?l?d?s?d +?d?d?s?d?l +?d?d?d?s?u +?u?d?u?u?u?d +?l?l?d?s?d?d +?u?s?u?d?d?d +?u?l?l?l?l?l?l +?l?l?l?l?l?d?l +?d?d?d?d?u?d?d +?l?l?l?l?l?l?s +?s?s?s?d?d?d +?d?d?l?l?s +?s?l?l?d?d +?l?l?l?u?d?d +?u?l?l?l?d?d?d?d +?u?u?l?l?l?l +?l?l?d?d?d?d?s +?l?d?l?d?l?d?l +?s?s?l?l?l +?u?d?d?d?d?d?u +?l?l?l?d?u +?l?u?u?l +?u?l?u?u +?l?u?l?l +?l?l?u?l +?l?u?l?u +?d?d?d?u?u?u?u +?u?d?u?d?d?u +?l?l?d?d?s?d +?s?s?s?l +?l?l?l?d?s?d +?l?l?s?l?d?d +?d?d?d?l?l?s +?u?l?l?u?u +?l?l?l?l?d?d?l +?l?d?l?l?s +?l?d?d?l?l?d?d +?u?l?d?d?d?d?d?d +?l?l?l?d?d?d?s +?u?d?u?d?u?u +?u?u?u?d?u?d +?l?s?l?l?l?d +?l?d?d?d?s?d +?l?d?s?d?d?d +?d?d?u?u?u?d?d +?d?d?d?s?s?s +?u?u?u?s?s +?l?l?l?l?d?d?s +?l?s?l?s?d +?l?l?s?l?d +?d?d?d?l?l?l?d +?l?l?l?l?d?l?l +?s?d?s?d?d?d +?d?d?s?d?s +?u?l?l?l?s?d +?l?l?d?l?l?l?l +?l?l?d?l?l?d?d +?u?u?d?d?s +?l?d?s?l?d +?l?d?d?l?s +?d?s?l?l?l?l +?l?d?d?u?d?d +?u?l?d?d?l?l +?u?d?d?l?l?l +?l?d?l?l?u +?l?l?u?u?d +?u?u?u?l?d +?s?d?d?d?d?d?s +?u?l?l?l?u?d +?l?s?d?l?l +?u?s?u?u +?u?l?s?l +?l?u?s?l +?d?d?l?l?l?l?d?d +?l?s?d?d?d?d?d +?d?d?l?u?l +?d?d?l?l?u +?l?l?d?d?u +?u?l?d?u?d +?l?l?l?l?l?s?d +?d?d?d?d?d?s?l +?u?l?l?d?l?l +?l?d?l?l?l?d?d +?l?u?u?u?u?u +?u?u?u?l?l?l +?d?s?d?s?d?s +?d?l?d?d?l?d?d +?d?l?l?l?l?s +?u?l?u?u?u +?d?d?l?d?l?d?d +?l?d?d?d?d?d?s +?u?d?d?d?l?l +?d?d?d?l?d?d?d?d +?d?d?d?d?l?l?d?d +?u?l?d?l?l?l +?l?l?s?l?l?d +?l?d?s?l?l +?d?d?d?d?s?l?l +?l?l?l?l?d?l?d +?d?d?d?l?s?l +?d?d?l?l?l?s +?l?u?l?l?u +?l?d?l?l?l?l?l +?d?d?l?l?d?d?d?d +?d?d?d?d?l?d?d?d +?l?d?d?u?d +?d?d?d?u?d?u +?l?l?d?l?d?d?d +?u?d?l?d?u?d +?d?u?l?d?d +?d?u?d?d?l +?d?d?d?d?d?s?s +?l?l?l?l?l?d?d?d?d +?l?l?d?d?d?d?d?d?d +?u?u?l?l?l?d +?d?d?d?d?l?d?l +?l?u?l?l?d?d +?u?d?d?u?u?d +?l?d?d?d?d?l?d +?l?s?s?l?l +?d?u?l?l?l?d +?d?d?s?d?d?l +?s?l?l?l?d +?d?l?l?l?s +?u?d?d?u?d?u +?s?l?s?l +?l?s?l?l?s +?s?u?u?s +?s?l?l?s +?s?s?l?l +?l?u?u?u?u?d +?l?s?d?d?l +?d?l?d?l?s +?d?s?d?l?l +?s?l?l?d?d?d +?d?l?s?l?d +?l?l?d?d?s?s +?u?u?d?l?l +?l?u?l?u?d +?d?d?d?l?l?d?d?d +?l?l?u?u?d?d +?u?l?l?d?d?l +?d?d?d?d?d?d?l?d +?d?d?d?d?u?l?l +?l?l?l?d?l?d?d +?u?d?d?l?l?d +?l?d?d?d?l?d?d?d +?l?d?l?s?d?d +?u?u?u?d?d?s +?l?l?d?s?l +?l?d?d?l?d?l?d +?l?s?l?s?l?s +?u?l?u?l?l?l +?d?d?u?d?u?u +?u?d?l?l?l?d +?u?u?d?d?l?l +?s?l?l?l?l?d +?l?l?l?l?u?d +?l?d?l?d?d?l?d +?u?l?u?l?u?d +?s?d?d?l?d +?u?d?d?d?s +?d?d?d?l?s +?u?d?d?s?d +?l?d?s?d?d +?d?d?d?u?s +?d?s?d?l?d +?u?l?l?d?l?d +?d?l?d?l?u +?u?l?d?l?d?d +?u?d?d?l?u +?d?d?l?u?u +?l?d?u?l?d +?d?u?d?l?u +?u?d?l?d?u +?d?l?l?u?d +?l?d?u?d?l +?d?d?l?d?d?l?d +?s?d?d?l?l?l +?u?u?u?d?d?d?d?d +?d?d?l?l?l?l?d +?d?d?d?l?l?l?l?l +?u?u?d?u?d?u +?l?u?u?l?d +?l?l?u?l?u +?l?u?l?l?d +?u?u?l?u?u +?l?l?u?l?d +?d?d?u?l?l?d?d +?l?d?d?l?l?l?l +?d?d?l?d?d?d?d?d +?u?d?d?l?d?l +?l?l?l?s?l?d +?d?d?d?d?d?d?d?d?d?d?d +?u?u?d?d?d?s +?d?l?d?l?d?d?d +?l?s?s?d?d +?l?d?l?l?d?l?d +?u?l?d?l?l?d +?u?u?u?d?d?l +?l?l?u?l?d?d +?d?d?d?d?u?s +?d?l?d?s?d?d +?d?d?u?d?d?l +?d?d?l?u?d?d +?u?d?d?d?l?d +?u?s?u?u?d +?s?l?l?d?l +?u?l?s?d?d?d +?u?u?u?u?u?u?d?d +?l?u?u?l?l +?s?d?s?d?s?d +?l?l?d?d?l?l?d +?l?d?l?d?l?d?l?d +?d?d?l?d?d?d?l +?d?d?d?l?d?d?l +?l?l?l?l?u?u +?d?d?d?u?l?u +?u?u?d?d?d?l +?d?d?u?u?u?u?u +?l?l?s?s?s +?l?l?l?s?s?s +?l?l?d?d?d?d?l?l +?d?s?d?d?l?l +?u?d?l?d?l?l +?u?d?d?d?d?d?l +?u?s?u?l?l +?l?u?u?u?l +?u?u?l?l?u +?l?l?u?u?l +?d?d?d?d?d?u?d +?d?d?d?s?l?l?l +?u?u?u?l?d?d +?d?d?s?s?d +?s?d?d?s?d +?d?d?d?d?d?u?l +?d?d?u?u?d?u +?u?l?d?d?l?d +?d?u?l?l?d?d +?l?u?l?u?d?d +?l?d?d?s?l +?l?s?d?l?d +?s?d?l?l?d +?s?l?d?d?l +?l?d?l?s?d +?d?d?s?u?u +?u?d?l?s?d +?s?d?d?l?l +?u?l?l?l?l?l?d?d +?d?d?d?d?d?d?d?l?l +?d?u?d?d?d?u +?d?u?l?d?d?d +?l?s?d?l?l?l +?l?l?d?d?l?l?d?d +?d?l?l?l?u +?u?l?u?u?d +?d?u?l?u?l +?u?l?u?u?d?d +?u?l?d?l?u +?u?l?d?u?l +?u?d?u?l?l +?l?d?l?u?l +?s?d?d?d?d?d?d?d +?l?d?l?d?l?s +?u?l?l?s?l +?u?l?l?s?u +?d?u?u?d?d?u +?d?u?u?u?d?u +?d?u?u?d?u?u +?l?d?l?d?s?d +?l?l?l?s?l?l?l +?d?d?d?d?l?l?s +?u?u?u?l?u +?s?u?u?u?s +?d?d?s?s?s +?s?s?d?d?s +?l?d?l?d?l?l?d +?u?d?d?s?d?d +?d?d?d?d?d?d?s?d +?l?l?s?s?d +?l?d?d?d?d?d?d?d?l +?u?l?u?l?d?d?d +?u?l?d?d?d?l +?l?l?l?u?u?u +?l?l?d?d?d?l?d +?u?l?d?d?u?l +?u?l?l?d?d?s +?u?u?u?u?u?d?d?d +?d?d?d?d?d?d?l?l?l +?u?s?u?s?d?d +?d?l?d?d?d?d?d?d +?l?u?l?d?d?d?d +?l?d?l?l?l?s +?d?u?d?l?d?d +?d?d?d?l?l?u +?u?d?u?d?d?d?d +?d?d?d?d?d?l?s +?u?d?d?d?d?d?d?d?d +?d?u?d?d?d?d?d +?d?u?u?u?u?u?u +?u?l?u?l?l?d +?u?s?u?u?u?u +?l?d?d?s?s +?s?l?d?d?s +?l?d?s?s?d +?d?l?d?s?s +?s?u?d?d?d?d +?d?d?s?l?d?d +?s?l?l?d?d?s +?l?l?l?d?l?l?d +?l?d?d?l?d?d?d?d +?l?l?s?d?l +?u?l?l?d?s +?u?s?l?d?l +?d?d?l?d?d?l?d?d +?u?d?l?d?d?l +?d?u?d?u?u?d +?u?l?l?l?u?l +?u?l?l?s?s +?u?l?l?l?l?d?d?d +?l?l?l?d?d?u +?d?d?d?d?d?l?d?d +?s?s?s?s?d +?l?u?l?u?u +?l?d?l?d?l?l?l +?d?d?d?d?s?d?d?d +?d?d?l?d?d?l?l +?l?l?s?s?d?d +?s?u?u?u?u +?u?l?s?u?l +?u?l?u?l?s +?l?d?l?l?l?l?d +?l?u?l?d?l +?l?u?d?l?l +?l?d?u?u?u +?u?l?u?d?l +?u?l?l?d?u +?l?d?l?u?u +?l?l?d?d?s?d?d +?d?d?l?l?l?l?l?l +?l?l?d?l?l?s +?d?d?d?s?s?d +?d?s?d?d?d?s +?l?l?l?s?d?d?d?d +?d?d?s?d?l?l +?l?d?d?d?l?s +?l?d?l?d?d?s +?d?d?d?u?u?l +?l?d?l?l?d?l?l +?l?l?d?l?l?l?d +?u?d?l?l?d?u +?u?l?d?l?d?l +?u?u?s?d?d?d?d +?l?l?u?l?l?l +?u?l?l?d?d?d?d?d +?u?d?d?d?d?u?u +?d?l?d?l?d?d?l +?d?d?l?d?d?u +?d?d?l?l?d?d?l +?d?l?u?d?d?d +?l?d?l?d?d?d?d?d +?d?d?d?s?d?l +?u?l?d?d?d?s +?d?d?d?s?u?u +?l?l?l?u?l?l +?l?l?l?d?d?l?d +?u?l?l?l?d?s +?d?l?l?l?d?d?d?d +?u?u?d?d?l +?d?l?l?d?u +?l?d?d?u?l +?l?d?d?u?u +?d?u?u?d?u?d +?l?u?d?l?d +?u?d?u?d?l +?d?l?u?l?d +?l?d?l?d?u +?u?d?d?u?l +?l?d?u?u?d +?d?u?d?u?l +?d?u?u?d?l +?d?l?u?u?d +?d?d?u?u?l +?u?d?u?l?d +?d?u?l?u?d +?u?u?d?l?d +?l?d?l?u?d +?d?u?d?l?l +?l?d?u?d?u +?u?d?l?u?d +?s?d?d?d?d?d?d?s +?l?u?l?l?l?l +?u?s?l?l?l?l +?u?u?u?u?s?u +?u?u?u?u?s?s +?s?d?s?d?s +?d?s?d?s?s +?l?l?d?l?l?d?l +?u?l?d?u?l?d +?l?d?l?l?l?d?l +?u?l?l?l?u?u +?s?l?d?l?s +?u?s?u?s?d +?l?d?l?s?s +?d?d?l?l?s?d +?u?d?d?d?d?d?d?u +?u?u?s?u?u?u +?l?s?l?l?d?l +?d?d?d?d?d?d?u?l +?l?l?d?d?u?u +?u?l?l?d?d?u +?u?s?u?d?d?d?d +?d?d?d?d?d?d?s?l +?s?d?u?u?u +?u?u?u?d?s +?u?u?s?u?d +?d?l?s?l?l +?l?l?l?d?l?s +?d?d?d?u?l?l?l +?l?l?d?d?d?u +?d?u?d?d?u?u +?l?l?l?l?l?d?s +?u?l?d?d?l?u +?d?d?d?d?d?d?s?s +?l?u?l?u?l?u +?l?l?l?l?d?d?d?d?d +?l?d?d?d?l?l?d +?d?d?d?l?d?l?d +?d?d?u?u?d?d?d +?d?d?d?l?l?l?s +?l?d?l?l?d?d?l +?s?d?u?u?u?u +?l?l?d?l?d?l?d +?d?l?d?l?l?d?d +?u?u?d?l?l?l +?l?l?s?l?s +?l?l?d?d?l?d?l +?u?d?s?d?d?d +?d?d?s?d?l?d +?s?d?d?d?d?u +?d?d?l?d?d?s +?s?d?l?d?d?d +?d?d?l?s?d?d +?l?d?d?l?l?l?d +?l?d?l?l?d?s +?u?l?s?l?l +?d?d?d?s?d?s +?s?d?d?d?s?d +?d?s?s?d?d?d +?l?u?d?d?d?d?d +?s?s?l?l?l?l +?l?d?u?d?l?d +?u?u?l?d?d?d?d +?u?d?d?u?s +?l?d?d?s?u +?s?d?u?u?d +?d?l?l?d?s +?l?u?s?d?d +?s?l?d?l?d +?d?d?u?s?u +?d?d?u?l?s +?l?d?l?s?l?d +?d?s?l?d?l +?u?d?u?d?s +?l?s?d?d?d?l +?u?d?l?d?s +?d?d?l?s?l +?d?l?d?d?d?l?d +?d?d?d?u?u?d?d +?d?d?d?u?l?d +?d?d?d?l?d?d?d?l +?d?l?d?u?d?d +?d?l?d?d?d?d?l +?d?d?l?d?u?d +?d?d?d?d?d?s?d?d +?l?l?u?d?d?d?d +?d?d?u?u?l?l +?u?d?u?u?l +?l?d?u?l?l +?u?u?l?d?u +?u?u?l?d?l +?l?l?u?d?l +?d?u?l?l?u +?u?u?u?d?l +?u?u?d?u?l +?u?l?d?u?u +?u?d?l?u?d?l +?u?u?l?u?d +?l?u?d?u?u +?l?l?d?u?l +?s?s?s?s?s?s +?d?d?d?d?l?s?l +?l?l?d?d?l?s +?l?l?l?l?l?l?d?d?d +?d?d?s?d?d?d?d?d +?l?s?d?s?d?d +?u?u?u?u?s?d?d +?d?d?s?d?d?s?d +?l?l?u?u?u?u +?u?d?d?d?d?d?d?l +?d?d?d?l?l?l?d?d +?d?d?l?l?l?u +?l?u?u?l?d?d +?l?u?u?d?d?d?d +?u?l?l?u?l?d +?s?l?l?d?d?d?d +?l?s?s?s?l +?s?s?s?l?l +?d?d?u?l?l?l?l +?l?l?l?s?d?l +?l?l?d?d?s?d?l +?l?d?l?d?d?d?l +?d?d?d?d?d?d?d?d?u +?s?l?l?d?s +?s?u?u?u?u?s +?l?l?l?l?u?l +?u?u?u?u?l?l +?l?l?l?l?d?u +?l?d?d?d?s?l +?s?d?d?d?l?l +?d?l?l?s?d?d +?l?d?d?l?d?s +?u?l?d?d?d?u +?l?d?l?u?d?d +?d?d?d?l?u?l +?d?d?d?l?u?u +?l?l?l?s?u +?d?d?u?l?u?l +?u?d?d?u?l?l +?l?l?s?s?l?l +?l?l?l?d?l?d?l +?u?u?u?s?u?u +?u?u?d?d?d?d?u +?l?d?d?s?d?d?d +?l?l?l?s?s?d +?u?u?l?l?d?d?d +?d?l?l?l?l?d?l +?s?s?d?d?s?s +?u?l?u?l?u?d?d +?u?u?d?d?d?u?u +?l?d?d?l?l?d?l +?u?u?u?u?u?l +?d?u?d?u?u?u +?l?s?l?s?l?d +?d?d?d?l?d?l?l +?d?d?d?d?s?s?s +?u?u?s?s?u +?s?l?s?l?l +?d?l?l?d?l?l?d +?l?d?d?d?l?d?l +?u?l?l?l?s?d?d +?l?s?l?l?l?d?d +?u?l?s?d?d?d?d +?d?s?d?l?l?l +?l?s?l?d?l?d +?u?u?u?l?l?d +?l?d?d?l?d?l?l +?u?s?l?d?d?d +?l?d?s?l?d?d +?s?s?d?d?d?d?d +?l?l?d?l?d?l?l +?d?d?d?d?d?d?d?d?s +?l?d?l?d?d?l?d?d +?d?s?d?s?d?d?d?d +?u?d?l?d?d?d?d +?u?u?u?s?d?d?d +?s?d?l?d?s +?d?s?l?d?s +?s?d?d?s?l +?s?l?s?d?d +?l?s?d?s?d +?d?d?s?s?u +?l?s?d?d?d?s +?d?d?s?l?s +?d?d?d?d?u?l?u +?l?l?s?l?l?l?l +?l?l?s?l?l?s +?u?u?u?u?d?s +?d?s?d?l?d?d +?d?l?d?d?d?s +?d?d?d?l?s?d +?d?l?s?d?d?d +?d?d?s?d?d?u +?d?d?u?s?d?d +?d?d?d?s?l?d +?d?s?d?s?d?s?d +?d?d?l?u?l?d?d +?d?d?l?d?l?d?l +?l?l?l?d?d?l?l?l +?u?l?l?l?d?u +?l?u?l?l?l?d +?d?l?u?l?s +?d?l?l?s?l +?u?s?d?u?u +?u?u?d?u?s +?l?d?l?s?l +?l?d?d?d?d?l?d?d +?l?l?l?l?l?s?l +?d?u?l?u?d?d +?l?l?d?u?d?d +?d?u?d?l?d?l +?d?d?u?l?d?l +?u?d?u?l?d?d +?u?d?d?d?l?u +?u?d?d?l?d?u +?l?d?u?l?d?d +?l?l?l?l?l?l?l?d?d +?d?u?u?d?d?d?d +?u?d?d?u?d?d?d +?u?u?l?l?l?d?d +?l?l?u?l?l?d +?l?u?u?l?u +?u?u?l?u?l +?d?d?s?l?l?l?l +?l?s?u?u?u +?l?l?s?d?l?l +?s?u?l?l?l +?s?l?s?l?s +?d?u?l?u?l?d +?d?l?l?l?s?d +?u?l?l?l?u?d?d +?d?d?d?d?u?u?d +?d?s?d?d?d?d?d?d +?d?l?d?l?l?l?l +?d?d?l?l?l?d?d?d +?l?l?s?l?l?d?d +?l?l?l?d?d?d?d?l +?l?d?d?s?l?d?d +?s?l?d?d?d?s +?d?l?d?l?d?l?l +?l?s?d?d?d?d?d?d +?l?d?d?d?d?d?d?s +?u?l?l?l?s?s +?d?d?d?d?u?u?u?u +?l?s?d?l?d?d +?s?d?l?l?d?d +?s?l?l?s?l +?s?u?l?l?s +?d?l?d?d?l?l?d +?l?l?s?d?d?s +?d?d?d?d?d?l?l?d +?l?l?l?u?l?d +?u?d?d?d?u?d?d +?u?s?u?u?d?d +?d?l?d?d?l?d?l +?l?l?l?l?d?s?d +?u?u?l?u?d?d +?l?d?s?l?l?l +?d?d?d?d?s?d?d?d?d +?u?s?d?d?d?d?d +?d?l?l?l?l?u +?d?l?l?l?d?l?l +?l?l?l?u?u?d +?l?l?l?l?l?s?d?d +?u?s?u?s?u?s +?d?l?l?d?l?d?d +?d?d?d?l?u?d +?d?u?d?d?l?d +?l?l?l?s?s?l +?l?s?l?d?d?l +?d?d?s?u?u?u +?u?s?l?l?d?d +?d?l?l?l?d?s +?u?u?s?u?d?d +?s?l?l?l?l?d?d +?l?d?l?d?d?l?l +?d?l?l?d?d?l?d +?d?d?s?d?d?l?l +?l?s?l?l?s?l +?l?l?u?u?l?l +?d?u?u?u?d?d?d +?u?u?d?l?l?d +?l?d?l?l?d?u +?d?u?d?l?d?u +?u?d?d?u?l?d +?u?d?l?d?l?u +?u?l?l?d?u?d +?d?d?d?l?l?d?l +?u?d?u?d?u?d?d +?u?d?l?d?d?u +?d?l?d?u?d?l +?l?u?d?l?d?d +?l?l?l?d?s?d?d +?s?l?s?d?d?d +?l?d?d?d?s?s +?d?l?l?l?l?l?l?l +?l?l?l?d?s?s +?l?d?d?d?d?d?d?d?d?d +?l?s?l?d?l?l +?s?d?d?s?s +?d?d?d?d?l?l?l?d +?s?u?u?u?d?d +?l?d?d?l?l?s +?l?l?d?l?d?d?l +?u?u?d?d?d?d?s +?l?d?l?l?s?l +?d?s?s?l?l +?l?s?s?l?d +?d?s?l?s?l +?l?l?s?d?s +?l?s?d?s?l +?s?l?s?l?d +?d?l?l?s?s +?l?u?d?s?s +?l?s?l?d?s +?d?d?l?l?s?s +?l?l?d?s?s +?u?s?l?s?d +?s?u?u?u?u?u +?l?l?l?l?s?l?l +?l?d?d?s?d?l +?l?d?d?s?l?d +?l?d?s?d?d?l +?u?l?d?d?d?d?s +?d?d?d?u?s?u +?d?s?l?l?d?d +?d?d?d?u?u?s +?u?d?d?d?d?d?s +?u?l?l?u?s +?d?d?d?d?d?d?l?s +?s?s?u?u?u +?u?l?l?u?d?d?d +?s?s?l?s?s +?l?l?d?s?l?l +?u?u?s?u?u?d +?d?d?s?s?l?l +?l?s?l?l?l?l?l +?u?s?u?l?l?l +?u?u?l?l?u?u +?d?s?s?s?s +?u?d?l?l?l?u +?u?u?u?u?l?d +?l?l?d?l?s?l +?u?d?d?d?u?u?u +?d?d?l?l?d?l?d +?l?l?l?d?d?s?d +?l?s?l?s?s +?l?l?l?s?d?s +?d?l?d?l?l?d?l +?d?l?d?l?d?l?d?l +?l?d?s?d?d?d?d +?s?d?d?d?d?d?l +?d?d?u?l?u?d?d +?d?l?l?d?d?d?l +?s?l?l?s?d?d +?u?u?u?d?l?l +?l?s?l?l?l?s +?l?s?s?l?l?l +?u?l?u?u?l?u +?d?l?l?d?l?l?l +?u?u?u?d?s?d +?l?d?l?l?s?d +?l?d?l?d?s?l +?s?l?l?l?d?d?d +?u?l?d?l?u?d +?d?d?l?l?u?u +?u?d?d?l?l?u +?l?d?l?u?d?l +?u?d?l?u?l?d +?u?s?l?l?l?d +?d?s?l?d?d?d +?d?u?d?s?d?d +?u?d?d?d?s?d +?d?d?d?l?d?s +?s?d?d?l?d?d +?d?u?d?d?d?s +?d?l?l?l?d?l?d +?l?d?s?l?d?s +?d?d?d?d?l?d?d?d?d +?s?l?l?l?d?s +?l?d?l?l?d?d?d?d +?d?d?u?u?d?l +?u?d?l?u?d?d +?u?u?d?d?l?d +?u?u?d?l?d?d +?d?l?l?d?d?u +?d?l?u?l?d?d +?u?d?u?d?d?l +?d?d?u?l?l?d +?u?d?d?d?u?l +?u?l?d?d?u?d +?d?u?l?d?l?d +?d?d?l?d?u?l +?u?l?u?u?l?d +?u?l?l?l?l?l?s +?d?u?l?l?l?l?l +?l?l?l?d?s?l +?s?l?l?l?l?l?l +?s?d?l?l?l?d +?l?l?d?l?d?s +?d?l?l?d?d?s +?l?s?d?d?l?l +?d?l?d?l?d?s +?l?d?d?l?s?d +?s?l?l?l?l?l?s +?d?d?l?d?l?l?l +?d?d?l?l?d?l?l +?d?l?d?d?l?l?l +?s?s?d?d?d?s +?s?l?d?d?d?d?d +?d?d?d?d?d?u?u?u +?d?l?d?l?l?l?d +?s?d?l?l?l?l?l +?l?l?l?s?l?d?d +?l?l?d?d?d?d?d?l +?l?l?l?d?u?u +?l?d?l?d?l?u +?l?u?l?d?u +?l?u?d?l?u +?u?l?u?d?u?d +?d?l?u?l?u +?u?d?l?l?u +?l?l?d?l?u +?l?d?l?l?l?u +?l?d?u?u?l +?d?d?u?l?l?u +?l?u?u?d?l +?l?u?u?d?u +?u?l?d?d?u?u +?d?u?l?l?d?l +?l?d?u?u?l?d +?u?d?l?l?u?d +?u?u?d?l?u +?d?l?l?u?u +?d?l?l?u?l +?d?l?u?u?u +?l?u?d?u?l +?u?d?l?u?l +?l?d?l?d?l?d?d?d +?s?s?s?d?d?d?d +?u?u?u?d?d?d?u +?l?l?l?d?d?d?d?s +?l?l?l?l?s?d?d?d +?l?s?s?s?d +?l?u?u?u?u?d?d +?l?l?l?s?l?s +?l?d?l?s?l?l +?l?s?l?s?d?d?d +?s?d?d?d?s?l +?s?s?l?d?d?d +?d?d?d?d?d?d?d?d?d?l +?u?d?d?d?d?l?l +?l?u?l?l?u?l +?l?l?u?u?u?d +?u?s?u?u?s +?u?s?s?u?u +?u?d?d?d?d?u?d +?d?d?d?d?d?l?u +?l?l?l?l?l?s?s +?d?l?l?l?s?l +?u?s?u?u?u?d +?u?d?d?u?d?d?u +?u?l?l?l?s?l +?u?u?d?d?s?s +?d?u?u?u?u?u?d +?l?d?l?u?l?l +?u?l?l?u?u?d +?u?u?u?d?u?u?u +?l?l?l?l?u?d?d +?u?d?d?l?l?d?d +?d?d?d?d?l?l?u +?d?d?l?d?l?l?d +?d?u?u?u?u?d?d +?d?l?s?l?l?l +?l?u?u?u?s +?u?s?l?l?u +?l?l?l?u?s +?d?l?l?s?l?l +?l?d?d?u?u?u +?u?l?u?d?d?l +?u?l?u?d?d?u +?l?d?d?u?l?l +?l?l?d?d?u?l +?u?u?l?d?l?d +?u?l?u?d?l?d +?d?d?l?u?l?l +?d?u?l?l?d?u +?u?u?u?u?u?u?u?d +?l?l?d?u?l?l +?u?l?l?d?l?u +?u?l?l?u?d?l +?d?l?l?u?l?l +?d?l?l?l?l?l?l?d +?u?l?l?s?d?d?d +?u?l?l?l?s?u +?s?s?l?l?d?d +?l?l?s?d?d?l +?d?d?l?l?s?l +?l?s?d?l?l?d +?l?l?s?d?l?d +?u?u?u?u?u?u?u?u +?d?l?l?d?l?d?l +?d?d?d?d?u?u?l +?l?d?d?l?d?l?d?d +?l?d?d?d?d?s?d +?d?d?d?d?d?s?u +?u?l?s?l?l?l +?s?s?s?s?d?d +?u?l?d?l?l?u +?l?s?l?s?l?l +?d?l?l?d?d?l?l +?l?l?l?d?d?s?s +?d?s?d?s?d?d?l +?s?l?d?l?d?d +?d?l?l?d?s?d +?d?l?d?d?l?s +?l?l?s?l?d?l +?s?l?l?l?d?l +?u?u?u?u?u?u?s +?u?d?d?d?d?l?d +?d?d?d?d?u?d?u +?u?l?l?d?u?l +?l?u?l?l?d?l +?l?d?l?d?s?s +?l?s?s?d?d?d +?d?l?l?d?d?d?d?d +?l?l?l?l?s?u +?u?d?u?d?l?l +?l?u?u?d?d?l +?l?l?d?u?u?d +?u?d?l?d?u?l +?u?u?u?d?l?d +?l?u?d?d?l?u +?l?u?d?l?l?d +?d?d?d?s?d?d?l +?u?u?d?d?u?u?u +?u?s?u?l?d +?u?l?s?l?d +?l?u?u?s?d +?u?s?u?d?u +?d?u?u?l?s +?l?d?d?s?l?l +?s?l?d?l?l +?u?d?u?u?s +?u?d?l?l?s +?l?u?l?d?s +?l?u?d?l?s +?d?u?s?u?u +?s?d?u?l?l +?s?l?d?l?d?l +?s?u?d?l?l +?u?s?l?l?d +?u?d?s?u?u +?u?u?s?d?u +?l?l?d?u?s +?s?u?d?u?l +?u?u?l?s?d +?l?u?l?s?d?d +?l?d?s?u?u +?l?d?s?l?d?l +?l?d?l?s?u +?l?l?d?d?s?l +?u?l?d?l?s +?u?l?u?l?l?u +?l?d?d?l?u?d +?d?l?u?d?l?d +?d?u?l?d?d?u +?l?l?d?d?u?d +?l?d?d?d?u?l +?l?d?d?d?u?u +?d?l?u?u?d?d +?d?l?l?l?d?d?l +?u?d?u?u?d?d?d +?l?u?d?d?l?d +?u?l?d?u?d?d +?d?d?l?u?l?d +?d?u?d?l?l?d +?l?d?u?d?d?l +?d?l?l?u?d?d +?d?d?u?d?u?l +?u?d?u?d?l?d +?u?l?l?l?l?l?l?d +?l?l?u?u?l?d +?u?l?u?u?u?d +?u?l?l?l?l?s?d +?u?l?l?s?l?l +?l?l?d?l?d?d?d?d +?l?l?d?s?d?d?d +?l?l?d?d?d?s?d +?d?d?l?l?d?d?s +?u?u?s?s?s +?s?l?l?s?s +?l?s?l?l?d?d?d +?s?l?s?l?d?d +?u?d?d?l?d?d?d +?l?s?s?s?s +?u?d?l?l?l?d?d +?l?l?l?d?l?l?l?l +?s?d?d?d?d?l?l +?d?d?l?l?d?d?l?l +?l?l?u?d?l?l +?d?d?l?l?l?d?l +?u?d?d?u?u?d?d +?d?u?d?u?d?u?d +?u?u?d?d?d?d?l +?u?l?u?l?d?d?d?d +?l?d?l?d?l?d?s +?u?s?l?s?u +?u?l?s?s?l +?l?s?u?s?l +?u?s?l?l?s +?u?s?l?s?l +?d?d?l?l?l?l?s +?s?l?d?d?l?l +?u?l?u?s?d?d +?d?l?d?l?s?l +?d?s?l?l?l?d +?d?l?l?d?l?s +?u?l?l?d?s?d +?l?l?d?d?d?d?u +?l?d?d?l?u?u +?u?u?l?d?d?l +?u?d?u?l?l?d +?l?u?d?d?l?l +?l?d?l?u?l?d +?l?u?l?d?d?l +?l?u?l?d?l?d +?l?d?d?l?d?d?l?d +?l?l?l?d?d?d?l?l +?s?d?u?l?l?l +?s?l?d?l?l?l +?d?l?d?l?d?d?d?d +?u?u?u?d?d?d?s +?d?s?d?d?d?d?l +?s?l?l?l?s?d +?l?l?l?d?u?l +?u?d?u?l?l?l +?l?u?d?l?l?l +?l?l?l?d?l?u +?d?d?d?d?u?d?d?d +?l?s?s?l?d?d +?s?s?d?d?l?l +?l?d?d?l?s?s +?u?u?u?s?s?s +?l?l?l?u?d?d?d +?s?u?l?l?l?s +?u?u?u?l?l?d?d +?u?d?l?l?d?d?d +?d?l?d?d?d?u +?l?d?d?d?u?d +?d?l?d?d?u?d +?l?d?u?d?d?d +?l?d?d?u?d?d?d +?d?d?u?d?l?d +?d?l?l?l?l?l?d?d +?l?u?u?u?d?d?d +?d?d?l?l?l?d?d?d?d +?u?u?u?d?d?d?d?d?d +?s?d?d?d?l?l?l +?u?l?d?u?l?l +?l?u?l?d?l?l +?l?l?l?u?d?l +?u?l?u?u?l?l +?u?l?l?u?l?u +?u?d?l?d?l?d?d +?u?u?d?d?u?d?d +?d?d?d?d?l?l?l?l?l +?l?s?d?d?s?d +?d?d?d?d?d?d?l?u +?u?l?s?u?l?l +?l?d?d?d?s?d?d +?d?s?u?u?u?u +?d?d?d?d?u?l?l?l +?d?s?d?d?s?s +?s?d?s?d?d?s +?l?u?d?d?d?d?d?d +?d?d?u?d?d?d?d?d +?l?d?d?d?d?d?l?l +?d?d?u?u?u?s +?u?l?l?l?d?d?s +?u?l?l?l?l?u?d +?u?l?l?u?l?l?d +?l?l?l?l?d?l?l?l +?s?s?s?l?l?l +?l?d?u?s?s +?s?l?s?u?d +?s?l?l?s?d +?l?s?s?d?l +?s?s?d?l?l +?u?d?s?s?u +?u?s?s?u?d +?l?d?s?l?s +?u?l?d?d?s?s +?u?l?d?s?s +?u?u?s?s?d +?s?s?l?d?l +?s?d?s?l?l +?s?u?d?u?s +?s?u?u?s?d +?s?s?l?l?d +?d?s?l?l?s +?s?s?u?d?u +?u?d?l?s?s +?u?u?d?u?u?u?u +?u?l?l?l?l?l?u +?l?l?d?l?l?u +?l?d?u?l?l?l +?s?d?d?d?u?u +?d?s?d?l?l?d +?u?d?l?s?d?d +?d?u?l?s?d?d +?d?d?s?l?l?d +?l?u?s?d?d?d +?u?l?d?s?d?d +?d?l?s?d?l?d +?u?d?d?u?s?d +?d?l?s?l?d?d +?d?d?l?d?l?s +?u?u?d?d?s?d +?d?d?u?l?d?d?d +?l?d?d?d?d?d?u +?d?d?u?d?u?d?d +?u?u?l?l?l?u +?u?d?l?l?l?s +?l?u?s?l?l +?l?u?s?l?u +?s?l?l?l?u +?s?l?l?d?l?l +?u?u?u?s?l +?u?l?s?u?u +?l?u?l?l?s +?l?l?s?l?u +?l?u?u?s?u +?u?u?u?u?u?s?d +?l?d?d?d?d?l?l?l +?d?l?l?d?u?u +?l?d?d?l?u?l +?l?l?l?d?u?d +?u?l?d?l?d?u +?d?d?l?l?u?l +?d?l?l?u?u?d +?d?l?u?u?d?l +?d?u?l?l?u?d +?l?l?d?d?l?u +?u?l?d?u?d?l +?d?u?d?l?l?l +?u?d?u?u?l?d +?u?d?d?l?u?l +?u?d?u?d?u?l +?l?d?u?l?d?l +?u?l?d?u?u?d +?d?l?d?d?d?l?l +?d?d?d?u?d?d?d?d +?u?d?u?d?u?d?u +?d?d?d?s?s?d?d +?d?d?s?d?d?d?l +?d?d?d?d?s?d?l +?l?d?d?d?d?s?s +?u?u?u?u?u?d?u +?u?l?d?l?u?l +?u?d?l?u?l?l +?l?u?l?u?l?d +?d?l?u?l?l?l +?l?d?u?u?u?u +?l?d?l?l?u?l +?l?u?l?l?l?u +?u?u?d?u?l?l +?d?u?l?l?l?u +?u?u?u?s?u?d +?d?u?u?u?u?s +?l?d?d?d?d?l?s +?u?d?d?l?d?d?u +?u?l?d?d?d?d?l +?l?l?d?d?d?d?d?d?d?d +?d?l?l?l?l?d?d?d +?u?l?u?l?l?d?d +?l?d?s?d?s?d?d +?u?s?s?s?u +?u?s?u?s?s +?u?l?u?u?u?u +?s?u?l?l?l?l +?l?l?s?l?d?d?d +?l?s?d?d?s?l +?l?s?d?l?s?d +?u?u?s?s?d?d +?d?u?l?l?l?l?d +?d?d?l?d?d?d?d?l +?d?d?d?d?l?d?d?l +?s?d?d?u?u?u +?u?l?u?d?d?s +?u?l?d?d?l?s +?u?d?u?d?u?s +?l?d?s?l?l?d +?d?l?d?l?l?s +?d?d?u?l?l?s +?u?d?u?u?u?d?d +?d?d?d?d?u?u?d?d +?d?d?d?u?u?u?d +?u?l?d?d?l?d?d +?d?d?d?s?d?s?d +?u?u?l?l?d?d?d?d +?u?d?l?l?l?l?l +?u?u?u?d?d?u?u +?u?u?d?u?u?d?d +?l?l?u?u?d?d?d +?l?u?l?l?u?d +?d?u?u?l?l?l +?d?d?d?s?d?u +?s?d?d?d?l?d +?d?u?d?d?s?d +?d?l?d?d?s?d +?s?d?d?u?d?d +?d?s?d?d?d?l +?d?l?s?d?d?d?d +?d?s?d?d?l?d +?d?d?u?d?s?d +?l?d?d?l?d?d?s +?l?l?l?l?d?d?l?l +?d?d?u?d?l?l +?d?d?u?u?l?d +?l?l?l?d?d?d?u +?d?d?l?u?d?l +?l?d?d?u?l?d +?d?d?l?l?d?u +?d?l?d?u?u?d +?d?u?u?d?l?d +?d?d?l?l?u?d +?l?u?d?d?u?d +?d?d?u?l?d?u +?d?l?d?u?d?u +?d?l?d?d?l?u +?d?l?d?l?d?u +?d?l?d?d?u?l +?d?l?u?d?u?d +?d?l?l?d?u?d +?l?u?d?d?d?l +?l?d?d?l?d?u +?u?l?l?d?d?d?s +?d?l?d?l?u?d +?u?d?d?l?u?d +?d?d?u?d?l?u +?d?u?d?d?l?l +?s?d?d?l?l?l?l +?l?l?u?l?l?u +?l?l?s?d?d?d?d?d +?d?d?d?s?d?l?l +?l?s?l?s?l?d?d +?u?u?u?d?d?d?l +?s?d?d?d?s?s +?d?d?d?d?s?s?d +?d?s?d?s?d?d?d +?u?l?l?u?u?u +?u?u?d?d?d?d?d?d?d +?l?l?s?l?s?d +?l?d?l?l?s?s +?d?l?l?l?s?s +?l?s?l?l?s?d +?u?s?u?s?u?d +?l?l?d?u?d?l +?d?l?l?l?u?d +?l?l?d?u?l?d +?d?u?u?u?l?l +?u?u?d?d?u?l +?d?d?u?l?u?u +?d?l?l?d?l?u +?d?d?l?u?u?u +?l?l?u?d?d?l +?d?l?u?l?l?d +?d?l?d?l?l?u +?u?l?d?u?l?u +?l?d?u?u?d?u +?u?u?u?u?d?l +?u?l?u?l?d?l +?l?l?d?l?u?d +?l?l?u?l?d?l +?l?u?d?l?d?u +?l?u?d?l?d?l +?l?u?l?d?d?u +?d?l?d?l?u?l +?u?u?u?u?d?u?u +?u?d?d?d?l?l?l +?s?u?u?d?d?s +?l?s?l?d?d?s +?l?l?l?l?d?d?d?l +?l?l?l?l?l?d?d?l +?u?l?l?d?l?l?l +?u?l?l?l?l?d?l +?u?l?l?l?d?l?l +?d?d?d?d?l?u?l +?u?l?d?d?d?d?u +?d?d?d?d?d?d?u?d +?l?l?d?d?d?s?s +?s?s?l?d?s +?l?d?s?s?s +?s?l?s?s?d +?s?l?d?s?s +?s?d?s?l?s +?s?s?s?u?d +?l?u?u?u?u?l +?u?u?u?u?d?d?s +?l?l?l?l?d?d?d?s +?s?s?d?d?d?l +?d?d?d?d?s?s?l +?d?d?d?s?l?s +?d?d?d?l?s?s +?u?d?d?d?s?s +?d?d?d?s?s?l +?l?s?d?d?s?d?d +?u?u?d?d?d?l?l +?l?l?l?d?l?l?l?d +?s?d?l?l?l?s +?l?l?s?l?s?l +?u?s?s?l?l +?u?s?u?s?l +?l?l?l?u?u?l +?d?l?d?d?d?l?d?d +?s?d?l?l?d?l +?u?l?s?l?d?d +?s?u?l?l?d?d +?l?l?d?l?s?d +?l?d?l?s?d?l +?d?d?d?d?s?u?u +?l?l?l?s?s?d?d +?s?s?d?d?d?d?d?d +?l?s?l?l?l?l?d +?s?l?l?s?l?l +?d?d?d?d?d?l?d?l +?l?d?d?d?d?d?l?d +?u?l?l?l?u?s +?d?d?d?d?d?l?l?l?l +?d?d?s?s?s?s +?d?l?u?u?u?u +?u?u?u?l?d?l +?u?u?l?l?u?d +?u?l?d?u?u?l +?d?d?d?u?u?d?d?d +?l?d?d?l?d?d?l?d?d +?u?l?l?u?l?l?l +?u?s?l?l?d?l +?d?u?l?l?l?s +?d?d?d?d?u?u?s +?s?s?s?l?s +?l?l?d?d?l?d?d?d +?l?u?u?l?l?l +?u?l?l?u?u?l +?u?l?u?l?u?u +?l?d?d?l?l?d?d?d +?l?l?s?s?s?s +?u?u?l?l?l?l?d +?u?l?l?l?u?l?l +?l?l?l?l?l?l?l?l?l +?u?l?l?u?l?d?d +?u?l?d?d?l?l?l +?s?l?d?d?l?s +?l?l?l?s?d?d?s +?d?d?d?d?l?d?l?d +?u?l?u?l?u?s +?u?l?d?l?l?d?d +?l?l?l?l?l?d?d?s +?d?d?d?s?d?l?d +?d?d?d?l?d?d?s +?l?l?l?l?l?l?d?l +?u?u?u?d?u?s +?u?l?u?l?s?d +?l?u?u?l?l?d +?u?u?l?l?d?l +?d?l?l?u?u?l +?l?l?d?u?u?u +?u?l?u?l?d?u +?s?l?l?l?d?d?s +?s?d?d?d?s?d?d +?u?d?d?d?u?d?d?d +?u?l?d?l?l?l?l +?l?l?d?d?d?l?l?l +?u?d?l?d?u?d?d +?u?u?u?l?u?u +?l?d?l?l?l?d?d?d +?s?s?l?l?s?s +?s?d?u?u?d?d +?d?d?d?s?u?l +?d?d?l?l?d?s +?d?d?s?l?d?l +?d?d?d?u?l?s +?u?l?d?d?s?d +?u?d?d?d?u?s +?d?l?d?s?l?d +?l?u?d?d?d?s +?l?d?s?d?l?d +?s?l?d?d?d?l +?s?d?l?d?l?d +?d?d?d?s?l?u +?d?d?d?d?s?l?l?l +?u?d?d?d?l?d?d +?u?u?u?l?l?l?d +?s?l?s?d?d?d?d +?d?l?d?l?d?l?s +?l?l?l?l?l?l?s?d +?l?l?d?u?d?u +?u?u?l?d?d?u +?l?u?d?l?u?d +?d?l?d?u?u?u +?d?u?u?u?d?l +?l?d?u?d?l?u +?l?d?u?d?l?l +?l?u?d?d?u?l +?d?l?u?l?d?l +?u?l?d?d?d?l?l +?l?d?d?l?l?u +?d?u?l?d?l?l +?d?u?d?l?l?u +?l?d?l?d?u?u +?l?d?l?d?u?l +?d?l?l?u?d?l +?l?d?u?l?l?d +?l?d?u?d?u?l +?l?d?l?u?u?d +?u?d?u?l?d?l +?d?l?l?l?d?u +?l?l?l?l?l?l?u +?l?l?u?u?u?l +?u?l?l?d?d?l?l +?u?l?l?l?d?d?l +?d?s?l?l?l?l?l +?u?l?u?l?u?l?u +?l?l?d?s?d?l +?u?d?l?d?l?s +?u?u?l?s?d?d +?s?l?d?l?l?d +?d?l?l?l?l?l?s +?d?d?l?s?l?l +?u?d?d?l?s?l +?l?d?s?d?l?l +?l?l?d?d?l?l?l?l +?u?u?u?u?d?u?d +?s?l?l?l?l?l?d +?u?d?u?d?d?u?d +?d?d?d?d?u?s?u +?u?u?u?u?d?d?u +?s?s?s?d?s +?s?s?d?s?s +?s?d?s?s?s +?d?l?d?d?l?d?d?l +?l?l?u?d?u?l +?d?l?l?l?u?l +?u?u?l?d?u?u +?l?u?u?d?l?l +?l?u?d?u?u?u +?l?l?d?l?l?d?d?d +?l?l?d?l?s?s +?l?d?l?s?l?s +?s?s?d?s?d?d +?d?s?s?s?d?d +?d?d?s?s?d?s +?d?d?d?s?d?d?s +?d?d?s?s?d?d?d +?s?l?s?s?l +?l?s?s?l?s +?u?s?l?s?s +?u?l?l?d?d?d?d?d?d +?u?d?u?u?u?u?u +?u?l?l?l?l?l?l?l +?l?u?l?l?l?d?d +?l?l?l?l?l?d?l?d +?d?d?d?d?d?u?s +?d?d?l?s?l?s +?d?l?s?d?l?s +?s?l?d?l?d?s +?d?l?l?d?s?s +?u?l?s?s?d?d +?d?d?u?u?d?d?d?d +?l?l?l?l?l?u?d +?u?l?l?d?d?d?l +?l?l?l?l?l?d?l?l +?u?u?u?u?l?u +?l?d?d?d?l?l?d?d +?l?d?l?d?s?d?d +?s?l?s?l?l?l +?d?d?d?d?d?d?d?d?l?l +?u?l?l?l?l?d?d?d?d +?u?u?d?u?d?d?d +?u?d?d?l?d?d?l +?d?d?d?l?l?l?d?d?d +?u?s?u?u?d?u +?u?l?l?s?l?d +?u?u?u?l?d?d?d +?u?l?u?l?u?l?d +?l?l?l?u?l?u +?d?d?d?s?u?u?u +?u?d?d?l?l?l?l +?u?d?d?d?d?d?d?d?u +?l?l?l?d?d?l?d?d +?l?l?l?l?l?l?l?l?d +?u?d?u?u?d?u?d +?l?l?l?l?u?s +?d?d?s?l?l?d?d +?l?d?l?s?d?d?d +?u?s?l?d?d?d?d +?d?d?l?l?s?d?d +?u?u?l?l?d?u +?d?u?u?u?u?l +?d?l?l?l?u?u +?d?u?l?u?l?l +?u?d?l?l?u?l +?u?l?u?d?l?l +?u?l?u?d?u?l +?d?l?l?u?l?u +?l?u?u?d?l?u +?l?l?d?l?u?l +?u?u?u?d?l?u +?l?u?l?d?l?u +?l?l?d?d?d?l?d?d +?l?d?d?d?d?d?d?u +?u?s?d?d?d?d?d?d +?u?u?l?l?l?l?l +?u?l?u?d?d?d?d?d +?u?u?u?l?l?u +?u?d?l?d?l?d?l +?l?l?u?l?l?d?d +?l?l?l?l?l?l?l?s +?u?d?d?u?d?u?d +?d?d?u?d?d?l?d +?d?u?l?d?d?d?d +?d?d?l?d?l?d?d?d +?d?d?u?d?d?d?u +?l?d?d?l?l?l?d?d +?d?d?d?d?d?d?d?u?u +?u?d?d?d?d?d?d?s +?s?s?l?l?l?d +?l?s?l?d?l?s +?u?s?d?l?l?l +?u?u?u?s?u?u?u +?l?l?l?l?d?d?d?d?d?d +?l?d?l?l?d?l?d?d +?u?d?l?l?d?l?d +?d?d?l?s?d?d?l +?d?d?l?s?l?d?d +?d?d?d?u?u?u?u?u +?u?u?u?u?u?d?d?d?d +?s?l?l?l?s?d?d +?d?d?d?l?d?l?d?d +?d?d?l?d?d?d?l?d +?s?u?d?d?d?s +?l?d?s?d?s?d +?l?d?s?d?d?s +?d?l?d?d?s?s +?u?d?s?d?s?d +?d?s?l?s?d?d +?u?d?s?s?d?d +?u?s?d?d?s?d +?d?d?u?u?u?u?d?d +?u?u?u?d?u?d?d +?d?d?d?d?s?l?d +?d?d?l?s?d?d?d +?d?d?s?d?d?l?d +?u?l?l?l?d?l?d +?s?l?l?l?s?s +?d?l?d?d?l?d?d?d +?s?l?l?d?d?l +?u?l?s?d?d?u +?l?s?d?l?d?l +?s?l?l?d?l?d +?u?l?s?u?d?d +?l?u?u?s?d?d +?d?l?s?l?d?l +?u?d?l?l?d?s +?s?d?l?d?l?l +?d?u?d?l?d?u?d +?u?l?d?l?d?d?d +?l?u?u?u?u?u?d +?d?d?s?l?l?s +?s?d?l?l?s?d +?d?d?s?l?s?l +?u?s?l?s?d?d +?d?l?s?l?s?d +?d?u?l?l?l?d?d +?d?l?d?l?d?l?d?d +?d?d?d?d?d?d?d?s?d +?u?l?d?l?u?u +?l?d?l?u?u?l +?d?u?l?u?l?u +?u?d?u?u?u?l +?l?u?u?u?l?d +?l?l?l?u?u?d?d +?u?l?l?u?d?u +?l?u?l?u?d?l +?l?d?l?u?l?u +?u?u?l?d?l?l +?l?d?u?u?l?l +?u?d?l?l?u?u +?l?l?l?u?d?u +?l?u?l?u?u?d +?d?d?s?d?d?s?l +?l?s?d?d?d?d?s +?s?l?d?d?d?d?s +?d?d?d?l?l?l?l?d +?l?s?d?l?l?l?l +?u?d?l?l?l?l?d +?u?s?u?l?u +?s?l?u?l?l +?u?l?d?l?l?s +?l?s?u?l?l +?u?d?u?u?u?s +?s?l?l?u?u +?u?s?u?u?l +?u?l?u?u?s +?u?s?l?u?l +?l?s?l?l?u +?u?l?s?l?u +?l?l?u?l?s +?u?u?l?s?l +?l?l?s?u?l +?u?s?u?l?l?d +?l?u?l?u?s +?l?s?l?u?l +?l?u?u?s?l +?u?l?u?s?u +?d?s?u?l?l?l +?u?l?u?s?l +?u?l?l?d?l?d?d +?u?u?d?u?d?l +?l?l?u?d?d?u +?u?u?d?l?d?l +?u?u?d?l?d?u +?l?l?d?l?d?u +?l?l?u?d?l?d +?d?d?u?u?u?l +?d?d?l?u?u?l +?d?u?u?d?l?l +?u?u?d?l?u?d +?u?d?l?d?l?l?d +?u?l?d?d?d?u?l +?u?d?u?u?d?l +?d?u?u?l?l?d +?l?u?d?u?l?d +?d?l?l?d?u?l +?d?u?l?d?l?u +?u?d?u?d?u?u?d +?d?l?u?u?u?d +?u?d?d?u?l?u +?d?l?d?l?u?u +?u?l?l?s?d?d?d?d +?s?d?d?d?d?d?d?d?d +?s?l?s?s?s +?l?l?l?l?d?d?u +?l?u?l?u?l?l +?u?u?l?l?u?l +?d?s?d?d?d?s?d +?s?d?d?s?d?d?d +?s?d?s?d?d?d?d +?d?d?d?d?d?d?s?d?d +?l?l?l?l?d?l?d?d +?l?l?l?d?d?s?d?d +?l?d?l?l?l?l?d?d +?d?l?d?d?d?d?l?d +?l?u?l?u?d?d?d +?l?d?l?l?l?l?l?l +?l?l?d?d?d?d?l?d +?d?d?l?l?l?l?l?d +?l?d?d?s?d?d?l +?l?d?l?d?d?d?s +?s?l?l?d?l?s +?u?d?d?l?d?l?d +?l?l?l?l?s?l?d +?l?l?l?l?s?s?s +?l?d?d?l?l?d?d?l +?l?l?s?l?l?l?d +?l?u?u?l?u?u +?l?u?u?u?l?l +?u?u?l?u?l?l +?l?l?l?d?l?d?d?d +?l?l?d?d?d?d?d?s +?u?l?l?l?l?d?s +?l?l?d?l?l?l?l?l +?l?l?s?s?d?d?d +?u?l?l?u?d?d?d?d +?d?l?d?d?d?d?d?l +?s?l?d?d?d?d?d?d +?s?u?d?d?d?d?d?d +?s?d?d?d?d?d?d?l +?l?l?l?s?l?l?d +?s?d?d?d?d?s?l +?u?u?u?l?l?l?l +?u?d?d?u?u?u?u +?s?u?u?u?u?d +?u?l?l?d?l?s +?u?s?d?u?u?u +?d?d?d?d?d?d?s?u +?d?d?u?d?d?u?d +?d?d?d?d?u?d?l +?s?s?d?s?s?d +?d?d?s?d?s?d?d?d?d +?l?u?u?u?d?u +?l?u?u?u?d?l +?u?u?u?d?u?l +?u?u?l?u?d?u +?l?u?l?d?u?l +?u?l?l?d?u?u +?u?u?d?u?u?l +?d?u?l?l?u?l +?u?d?l?u?l?u +?l?u?d?u?u?l +?u?d?u?u?l?l +?u?l?d?u?u?u +?d?d?s?l?d?d?d +?d?s?l?d?d?d?d +?u?u?d?d?s?d?d +?d?l?d?s?d?d?d +?l?s?d?d?d?d?l +?l?d?d?d?d?s?l +?d?d?d?d?l?s?d +?l?u?l?u?l?d?d +?d?d?d?d?d?u?l?d +?s?l?d?l?l?s +?s?s?d?l?l?l +?l?l?d?l?l?l?d?d +?d?u?d?u?l?d +?l?d?d?u?u?d +?d?u?l?d?d?l +?l?d?d?d?l?u +?l?d?u?u?d?d +?d?d?u?l?u?d +?l?d?d?u?d?l +?l?u?d?d?d?u +?d?u?u?d?d?l +?l?d?l?d?d?u +?u?d?d?u?d?l +?l?u?d?u?d?d +?u?u?d?d?u?u?d +?l?d?l?d?u?d +?d?d?l?u?u?d +?d?u?d?l?u?d +?d?l?u?d?d?l +?d?u?d?d?l?u +?l?d?d?u?d?u +?d?d?d?d?s?l?s +?u?u?d?d?d?d?u?u +?u?d?u?d?d?d?d?d +?u?d?u?d?u?d?u?d +?d?s?d?s?s?d +?s?d?d?s?s?d +?s?d?d?s?d?s +?s?d?d?d?d?s?d +?u?u?l?u?u?l +?u?l?u?l?l?l?l +?l?u?l?u?u?l +?l?l?u?l?d?d?d +?u?d?l?d?u?d?l +?u?l?d?l?d?l?d +?l?u?l?l?d?d?d +?d?s?d?l?l?l?l +?s?d?l?l?d?s +?s?d?d?s?l?l +?s?l?l?d?s?d +?s?d?l?s?d?l +?d?s?l?l?s?d +?l?s?l?d?s?d +?s?d?l?d?l?s +?l?s?d?s?l?d +?l?l?l?d?d?d?d?d?d?d +?d?l?d?s?d?l?d +?d?d?l?d?d?l?s +?d?d?d?d?s?u?l +?u?d?d?s?u?d?d +?l?d?l?l?s?d?d +?u?u?l?l?s?d +?u?s?l?d?l?l +?u?l?s?l?l?d +?l?s?s?d?d?d?d +?l?u?u?u?u?u?u +?l?d?l?d?l?l?d?d +?d?d?d?u?u?l?l +?u?s?u?l?s +?s?l?s?u?l +?s?l?l?s?u +?l?s?u?l?s +?l?l?s?s?u +?l?s?l?s?u +?l?l?s?d?s?l +?s?u?l?u?s +?s?u?u?s?u +?l?s?l?l?d?s +?l?l?s?u?s +?u?u?s?u?s +?s?s?u?l?u +?u?l?u?s?s +?l?l?l?l?l?l?d?d?d?d +?l?u?l?u?u?u +?l?l?d?s?l?d +?u?u?d?d?s?u +?s?d?d?u?l?l +?d?s?d?u?u?u +?d?l?l?s?d?l +?u?d?s?l?d?l +?u?s?d?l?d?l +?u?s?l?d?l?d +?u?d?l?d?s?l +?u?d?u?s?u?d +?l?d?d?l?s?l +?u?d?u?u?d?s +?l?u?l?d?d?s +?d?d?u?d?d?u?u +?u?d?d?l?u?d?d +?l?u?u?u?u?s +?l?l?l?d?l?l?d?d +?l?d?d?d?l?l?l?l +?l?s?l?s?l?s?l +?l?d?d?d?l?d?d?l +?s?s?s?d?d?s +?d?d?d?s?d?d?d?s +?l?d?l?l?u?u +?l?d?l?u?u?u +?u?d?u?l?l?u +?d?u?l?u?u?l +?u?d?u?l?u?l +?u?u?u?l?u?d +?u?u?l?u?u?d +?u?u?l?d?u?l +?l?u?u?l?d?l +?u?l?u?u?d?l +?u?l?u?u?d?u +?u?u?u?l?d?u +?u?l?u?d?u?u +?u?d?l?u?u?u +?u?d?u?l?u?u +?u?u?d?d?l?l?l +?d?d?l?l?l?l?l?d?d +?d?d?d?u?l?u?l +?l?s?l?d?d?d?d?d +?d?d?d?d?d?d?l?d?d +?s?l?s?l?s?l +?u?d?l?l?d?l?l +?u?l?u?l?l?l?d +?u?u?l?u?u?u +?u?s?l?l?l?d?d +?l?d?d?l?l?l?l?l +?d?d?u?l?l?l?d?d +?u?l?u?u?d?d?d +?l?l?l?u?l?d?d +?l?d?d?l?d?d?d?l +?d?d?d?d?d?d?d?l?d +?u?d?d?u?d?d?d?d +?s?d?d?d?d?s?s +?d?d?d?d?d?u?l?l +?s?s?d?d?d?s?s +?s?d?s?l?l?l +?l?s?l?s?d?l +?l?s?s?l?l?d +?u?d?s?d?d?d?d +?u?d?d?d?s?d?d +?s?d?d?d?d?d?u +?l?u?u?u?s?d +?u?d?l?s?l?l +?l?l?d?d?l?l?s +?u?u?d?u?u?s +?d?d?d?d?l?l?l?s +?u?d?u?u?u?u?d +?d?u?d?d?d?d?d?d +?d?d?s?d?d?d?s +?d?d?s?l?s?d?d +?d?d?d?d?s?d?s +?u?l?l?s?u?l +?d?d?u?d?u?d?u +?d?d?l?d?l?d?d?l +?l?l?u?l?u?l +?u?u?d?d?u?u?d?d +?l?s?l?s?s?d +?u?u?u?s?d?d?d?d +?s?u?u?d?d?d +?s?d?d?u?l?d +?s?d?d?d?u?l +?d?s?u?l?d?d +?l?d?d?d?s?u +?u?d?s?d?d?l +?u?d?u?d?s?d +?u?d?u?d?d?s +?u?d?d?s?l?d +?d?d?s?u?l?d +?u?d?s?d?l?d +?d?d?l?s?l?d +?u?d?s?l?d?d +?u?s?d?d?u?d +?d?s?u?u?d?d +?u?s?d?d?d?l +?d?l?d?s?d?l +?u?d?d?d?s?u +?u?d?d?l?d?s +?u?s?d?l?d?d +?d?s?d?d?u?u +?d?s?d?l?d?l +?u?s?d?d?l?d +?l?s?d?d?l?d +?d?d?l?d?s?l +?s?l?u?d?d?d +?u?s?d?u?d?d +?d?u?s?d?d?l +?l?d?d?d?u?s +?u?d?d?d?s?l +?u?d?d?s?d?u +?u?d?s?u?d?d +?d?d?d?s?l?l?d +?d?l?d?l?s?d +?s?u?l?d?d?d +?s?d?d?l?d?l +?u?d?d?d?l?s +?d?d?s?u?u?d +?u?d?u?s?d?d +?s?l?d?d?l?d +?d?s?d?d?d?l?l +?u?d?d?u?d?s +?u?d?d?s?u?d +?l?s?u?d?d?d +?d?u?u?s?d?d +?s?d?d?l?l?d +?d?s?l?d?d?l +?s?u?d?u?d?d +?d?d?d?u?s?l +?d?d?l?s?d?l +?d?u?d?u?s?d +?d?d?d?d?u?l?s +?d?d?d?d?d?d?u?u?u +?l?d?l?l?l?l?s +?s?d?d?s?d?d?s +?d?u?d?d?d?d?u +?d?d?d?d?l?u?d +?d?d?d?l?d?d?u +?d?d?d?u?l?d?d +?d?d?d?d?u?l?d +?d?d?u?d?d?d?l +?l?d?d?d?s?d?d?d +?s?l?l?l?s?l +?u?u?s?s?u?u +?l?l?d?d?d?d?d?d?l +?d?u?l?u?d?l +?l?u?u?d?d?u +?d?l?u?d?l?l +?u?d?l?u?d?u +?d?u?d?u?l?l +?l?d?d?u?u?l +?d?l?d?u?l?l +?u?d?u?d?l?u +?d?u?l?u?u?d +?l?u?d?u?d?l +?l?u?d?u?d?u +?d?l?d?u?u?l +?u?d?l?u?u?d +?u?d?u?l?u?d +?d?l?u?l?u?d +?d?u?u?d?l?u +?l?d?u?u?u?d +?d?d?d?l?l?l?u +?l?d?u?u?d?l +?u?u?d?d?l?u +?l?d?l?l?u?d +?u?l?d?u?d?u +?d?l?u?d?u?l +?d?d?l?u?l?u +?d?d?u?u?u?u?d +?d?l?u?u?l?d +?d?l?d?u?l?u +?d?u?l?d?u?l +?d?u?d?l?u?l +?l?d?l?l?d?l?s +?u?d?d?u?u?l +?l?u?u?d?l?d +?d?d?d?l?l?d?d?l +?d?d?d?d?d?d?u?s +?d?d?d?u?u?u?s +?u?l?d?l?l?d?l +?d?d?u?d?d?u?d?d +?d?d?d?l?d?d?l?d +?l?l?l?d?d?d?l?d +?l?s?d?s?d?s +?s?s?s?l?d?d +?u?l?l?d?u?l?l +?l?d?d?d?l?d?l?d +?l?l?l?l?s?s?d +?s?d?d?s?s?s +?u?u?d?l?l?u +?d?u?u?u?l?u +?l?u?u?u?l?u +?l?l?u?l?u?d +?l?u?u?d?u?u +?d?l?u?l?l?u +?l?u?l?l?d?u +?u?l?d?l?l?l?d +?d?l?u?u?l?l +?d?l?l?u?u?u +?l?l?d?u?u?l +?l?u?u?l?d?u +?u?d?l?l?l?d?l +?l?u?d?u?l?l +?l?l?d?l?u?u +?l?l?u?l?d?u +?u?l?u?d?l?u +?u?d?u?u?l?u +?l?d?u?l?l?u +?l?l?u?u?d?l +?l?l?u?u?d?u +?l?u?d?l?l?u +?u?u?d?l?u?u +?l?s?s?l?d?l +?l?l?s?s?l?d +?u?u?u?s?s?d +?u?u?u?s?d?s +?l?l?l?s?d?d?l +?l?l?s?d?d?l?l +?l?s?l?d?l?l?l +?d?d?d?d?l?l?d?l +?u?d?d?d?l?d?d?d +?u?d?u?u?d?u?u +?u?s?s?u?s +?u?l?s?s?s +?l?s?s?s?u +?s?u?s?u?s +?s?s?l?s?l +?s?s?s?u?u +?u?l?s?d?d?s +?d?s?l?d?s?l +?l?l?s?d?s?d +?l?u?s?d?d?s +?u?u?s?d?d?s +?u?d?u?d?s?s +?d?s?d?s?l?l +?s?u?u?s?d?d +?s?l?l?d?d?d?s +?u?s?d?u?s?d +?u?s?s?u?d?d +?d?d?u?u?s?s +?u?s?u?d?s?d +?l?d?l?s?d?s +?u?l?d?d?d?d?d?d?d +?l?d?s?l?d?d?d +?d?l?l?d?d?d?s +?d?d?l?l?d?d?d?l +?u?u?d?d?l?d?d +?d?d?u?d?u?u?d +?d?d?l?l?u?d?d +?d?u?d?l?d?l?d +?d?u?l?l?d?d?d +?u?d?u?d?d?d?u +?d?d?u?u?d?d?u +?u?u?s?u?u?d?d +?l?l?d?d?s?l?l +?u?u?u?d?d?l?l +?u?u?d?l?l?l?l +?d?d?d?d?s?s?d?d +?d?d?s?d?d?d?d?d?d +?l?l?s?d?d?d?s +?l?d?d?d?d?l?l?d +?l?d?l?d?l?d?l?l +?d?d?d?d?l?s?s +?l?u?u?l?l?u +?l?u?u?l?u?l +?u?d?l?d?l?l?l +?l?l?u?u?u?d?d +?d?d?d?s?s?d?d?d +?u?u?s?u?u?u?u +?l?d?d?l?d?d?l?l +?d?d?d?d?d?d?d?d?d?d?d?d +?d?d?d?d?d?u?d?d +?u?u?s?l?l?l +?u?u?l?l?l?s +?u?u?u?s?s?u +?s?s?l?l?l?s +?l?l?s?d?d?d?l +?s?s?s?s?s?l +?d?d?d?s?d?d?d?l +?d?d?d?l?l?u?u +?l?l?d?d?d?u?u +?u?l?d?d?l?l?d +?u?d?u?d?u?u?u +?d?s?s?d?d?d?d +?d?d?u?u?u?u?u?u +?s?l?s?l?l?d +?s?l?s?l?d?l +?u?l?l?d?s?s +?d?d?d?d?l?l?l?d?d +?d?d?l?d?d?l?d?l +?l?s?s?s?s?s +?l?l?l?l?d?l?s +?l?l?l?d?d?u?u +?u?u?s?u?u?s +?u?l?u?l?s?s +?l?l?d?d?d?l?l?d +?u?l?d?d?s?d?d +?s?d?d?l?l?d?d +?d?d?d?d?d?s?l?l +?d?s?d?l?l?d?d +?s?u?u?d?d?d?d +?d?d?d?l?l?s?d +?d?l?l?d?l?d?d?d +?l?l?u?u?l?u +?l?u?l?l?u?u +?u?d?d?d?d?u?d?d +?s?d?d?l?d?s +?s?d?d?d?l?s +?l?d?d?s?d?d?s +?u?s?d?d?s?d?d +?s?d?d?s?l?d +?l?d?d?s?d?s +?d?d?l?d?s?s +?d?d?s?l?s?d +?d?s?d?l?s?d +?s?s?d?l?d?d +?d?s?d?d?s?u +?d?s?d?s?d?l +?u?d?d?s?d?s +?d?s?s?l?d?d +?s?d?l?d?s?d +?s?u?s?d?d?d +?s?d?d?d?s?u +?d?u?s?s?d?d +?d?s?d?d?s?l +?s?d?l?d?d?s +?d?s?d?d?u?s +?d?d?s?l?d?s +?d?d?s?d?s?l +?u?s?s?d?d?d +?l?d?d?s?s?d +?d?d?d?l?d?d?l?l +?d?d?d?s?l?l?l?l +?u?d?l?l?d?d?l +?d?l?d?d?d?d?s +?u?d?d?s?d?d?d +?d?d?l?d?d?d?s +?s?d?d?d?l?d?d +?d?d?d?l?s?d?d +?u?d?d?d?d?s?d +?d?s?d?d?l?d?d +?d?d?d?s?l?d?d +?d?d?s?d?l?d?d +?s?s?s?s?l?l +?d?d?l?d?d?l?d?d?l +?l?l?l?l?d?l?l?d +?u?u?u?u?l?d?d +?u?l?l?u?u?d?d +?u?u?d?u?d?s +?l?d?l?s?d?u +?u?l?s?d?d?l +?l?s?l?u?d?d +?u?u?l?d?d?s +?d?l?s?l?l?d +?s?u?d?u?u?d +?u?d?s?d?l?l +?u?l?s?d?u?d +?u?u?s?d?d?u +?u?l?d?s?d?l +?u?s?d?d?l?l +?u?d?u?d?s?u +?u?d?d?l?l?s +?l?l?d?d?u?s +?u?u?d?u?s?d +?d?d?s?u?l?l +?d?l?s?d?l?l +?s?l?u?d?l?d +?u?l?d?s?u?d +?s?l?u?l?d?d +?u?s?l?d?d?l +?l?d?u?s?l?d +?s?u?d?l?d?l +?d?s?l?l?d?l +?u?d?l?l?s?d +?d?l?d?l?u?s +?d?l?l?s?l?d +?d?u?s?u?d?u +?l?d?s?d?d?s?d?d +?l?d?d?u?l?d?d +?u?d?l?d?d?l?d +?d?d?u?d?d?l?l +?u?d?d?u?l?d?d +?d?d?d?u?l?l?d +?u?u?d?d?d?u?d +?l?d?d?u?d?d?l +?d?d?u?u?d?d?l +?u?d?d?d?u?d?u +?d?d?d?u?l?d?d?d +?u?d?d?l?d?d?d?d +?u?u?u?u?l?l?l +?s?d?d?d?s?d?d?d +?d?d?d?l?l?s?s +?u?s?u?s?d?d?d +?l?l?d?d?l?d?d?l +?u?l?l?s?u?l?l +?d?l?l?l?d?l?l?l +?u?l?u?l?s?d?d +?l?d?l?l?l?d?l?l +?d?s?d?s?s?s +?l?l?u?d?u?u +?l?u?u?l?u?d +?l?l?u?d?l?u +?u?u?d?u?u?d?u +?l?d?u?l?u?u +?d?u?u?l?l?u +?l?u?d?u?l?u +?u?u?l?d?l?u +?u?u?d?u?l?u +?u?l?l?l?d?d?u +?u?d?l?l?d?d?d?d +?s?s?l?l?l?d?d +?l?l?d?l?l?l?s +?u?s?u?l?d?l +?u?l?u?l?d?s +?u?s?u?d?u?u +?s?u?l?l?l?d +?l?d?l?d?d?d?d?l +?u?d?u?u?u?d?u +?l?d?l?d?l?d?d?l +?u?l?d?d?l?d?l +?d?l?l?l?s?d?d +?u?s?l?l?d?d?d +?s?l?l?l?d?d?d?d +?d?d?d?l?l?d?d?d?d +?l?l?l?l?l?u?u +?s?s?u?s?s +?s?u?s?s?s +?l?l?l?l?u?u?u +?l?l?d?l?d?l?d?d +?u?s?s?l?l?l +?u?s?l?l?s?l +?s?s?s?d?d?l +?u?s?s?s?d?d +?l?s?s?s?d?d +?u?l?l?d?l?l?d +?u?l?u?u?l?d?d +?d?u?u?u?u?d?u +?l?l?u?u?l?d?d +?u?u?u?d?u?u?d +?l?l?l?d?l?l?s +?d?d?d?d?l?d?l?l +?s?d?d?l?d?d?s +?l?l?l?l?l?l?d?s +?l?d?d?d?d?s?d?d +?l?l?d?l?l?d?l?l +?u?l?d?d?d?s?d +?d?d?s?d?d?u?u +?d?l?l?s?d?d?d +?u?l?l?u?l?l?d?d +?l?l?s?s?l?d?d +?l?l?s?d?l?s +?l?s?l?d?s?l +?d?l?s?l?s?l +?u?u?d?d?d?d?l?l +?d?d?l?d?d?d?l?l +?d?d?d?s?s?l?l +?l?l?d?l?l?l?l?d +?l?l?l?u?d?d?d?d +?d?d?l?l?l?d?d?l +?d?d?d?d?u?l?d?d +?u?l?u?s?d?d?d +?u?l?l?d?d?d?d?s +?d?d?l?l?l?s?d +?d?d?d?u?l?l?l?l +?s?s?s?s?s?d +?u?l?d?d?u?l?d?d +?u?u?u?d?d?u?d +?u?d?d?l?l?l?d +?u?l?l?d?d?d?u +?u?d?d?d?u?l?l +?u?l?u?l?l?s +?d?d?d?l?l?l?l?l?l +?l?l?l?s?d?l?d +?l?d?l?s?l?d?l +?d?d?l?l?l?s?s +?l?l?l?s?d?s?d +?d?d?d?u?u?u?d?d +?u?s?u?u?s?u +?d?s?d?d?s?d?d?d?d +?u?l?l?s?s?s +?l?d?l?d?l?l?l?l +?s?l?l?s?d?d?d +?l?d?l?l?l?l?l?d +?d?d?d?d?d?d?l?l?d +?d?s?d?d?s?d?d?l +?d?d?l?d?d?d?d?d?d +?d?u?d?d?d?d?l +?d?d?d?l?u?d?d +?l?d?u?d?d?d?d +?d?u?d?d?d?u?d +?d?l?d?u?d?d?d +?d?d?d?d?l?d?u +?d?u?d?u?d?d?d +?d?d?u?l?d?d?d?d +?d?d?d?u?d?u?d +?d?d?d?d?l?l?d?d?d +?d?d?u?d?l?d?d +?d?d?l?u?d?d?d +?d?u?d?d?u?d?d +?d?d?d?u?d?d?l +?d?d?d?u?d?d?u +?d?u?d?d?d?l?d +?d?d?l?l?l?l?u +?u?u?u?d?s?d?d +?u?s?u?u?u?d?d +?l?d?d?s?l?l?l +?l?d?d?s?d?d?d?d +?u?l?u?u?u?l +?u?u?u?l?u?l +?d?d?l?d?l?l?d?d +?l?l?l?l?d?s?s +?l?d?l?s?s?s +?u?u?l?l?l?d?d?d +?u?u?s?s?s?s +?s?s?u?u?s?s +?d?d?d?d?d?l?l?s +?l?l?l?d?d?s?l +?l?s?l?l?s?s +?u?d?d?d?d?l?u +?u?d?d?d?l?d?l +?d?d?d?u?u?d?u +?d?d?u?l?l?l?d +?u?d?d?d?d?u?l +?u?l?d?d?d?l?u +?d?u?u?d?u?u?d +?u?l?d?d?u?l?d +?d?d?l?l?d?d?u +?u?d?d?d?d?d?d?d?d?d +?u?l?s?s?l?l +?u?d?l?d?l?d?l?d +?l?l?d?d?l?l?l?d +?d?l?d?l?l?d?d?d +?d?l?d?d?l?l?d?d +?s?d?s?s?d?d +?s?s?d?d?s?d +?d?d?s?d?s?s +?u?u?d?u?u?u?d +?u?l?l?l?l?s?d?d +?s?l?d?l?d?l?d +?l?d?l?l?d?d?s +?d?d?d?d?d?d?d?s?l +?l?l?l?l?s?d?l +?l?l?l?l?l?d?u +?l?d?l?d?l?l?s +?l?d?d?l?l?l?s +?d?d?s?s?u?u +?s?s?l?d?d?l +?l?d?s?d?s?l +?l?s?s?d?l?d +?s?u?l?s?d?d +?l?l?d?d?s?s?s +?l?d?s?s?l?d +?l?s?d?d?l?s +?s?l?d?s?l?d +?d?s?s?l?l?d +?d?d?u?s?u?s +?s?l?d?l?s?d +?s?d?d?l?l?s +?u?s?d?d?s?u +?s?d?d?l?s?l +?l?d?l?l?d?l?l?d +?d?d?d?d?d?s?d?d?d +?l?l?l?l?s?d?d?d?d +?u?u?d?d?l?l?d?d +?s?d?d?d?d?u?u +?d?l?s?l?d?d?d +?d?l?l?d?s?d?d +?u?d?d?u?d?d?s +?d?d?u?s?u?d?d +?l?s?u?d?d?d?d +?l?d?d?d?l?d?s +?l?u?s?d?d?d?d +?l?l?l?u?l?l?l +?l?d?d?d?d?l?d?l +?l?l?l?l?d?d?l?d +?u?d?l?d?d?d?d?d +?u?d?d?d?d?l?d?d +?l?l?l?d?d?l?l?d +?u?u?u?d?l?l?l +?u?d?s?u?u?u +?l?d?l?l?s?u +?u?u?s?l?l?d +?u?s?u?d?l?l +?u?l?d?s?l?l +?u?l?s?l?d?l +?u?u?u?s?d?u +?u?d?l?l?s?l +?u?l?s?u?l?d +?u?d?l?u?s?l +?l?d?l?l?d?l?d?l +?u?u?d?d?l?l?d +?l?d?l?d?l?d?u +?u?l?l?d?d?l?d +?l?d?d?l?l?d?l?d +?d?d?d?d?d?d?d?l?l?l +?l?d?l?d?d?d?l?d +?u?u?u?d?s?s +?s?s?l?l?d?l +?u?l?l?s?d?s +?l?l?l?l?s?d?s +?d?l?l?s?s?l +?l?l?l?l?s?l?l?l +?u?u?l?u?l?u +?u?l?u?d?d?d?s +?d?s?d?d?l?l?l +?s?d?l?l?l?d?d +?u?l?l?d?s?d?d +?d?d?d?l?l?s?l +?l?l?l?s?l?l?l?l +?d?l?l?d?d?l?d?d +?u?l?l?l?u?l?d +?u?u?u?l?l?l?d?d +?l?s?l?s?d?d?d?d +?l?l?s?s?s?l +?d?s?s?s?s?d +?d?d?d?s?s?s?s +?d?u?u?l?u?l +?u?u?l?u?d?l +?l?u?d?l?u?l +?l?u?u?d?u?l +?d?l?u?l?u?l +?d?u?l?u?u?u +?d?u?l?l?u?u +?l?d?u?l?u?l +?u?d?l?u?u?l +?u?u?l?u?l?d +?d?l?u?l?u?u +?d?l?l?d?d?l?l?d +?s?d?d?d?d?d?d?d?s +?d?d?s?s?s?d?d +?s?s?d?d?d?d?s +?u?u?u?u?u?u?d?d?d +?l?l?s?d?l?l?l +?l?s?l?s?s?s +?d?d?s?d?d?s?d?d?d?d +?d?d?d?d?d?d?d?s?s +?l?d?l?d?l?l?l?d +?s?s?d?d?d?d?l +?s?l?l?l?l?s?d +?l?l?d?s?s?s +?u?s?u?s?s?d +?u?l?d?d?d?d?d?s +?d?l?l?s?d?l?l +?s?l?l?l?l?d?s +?l?d?d?d?l?l?l?d +?d?l?d?d?d?d?l?l +?d?l?d?l?d?d?l?d +?s?s?s?s?d?d?d +?s?s?l?l?d?d?d +?s?d?u?u?u?u?u +?d?d?s?d?l?l?l +?d?s?l?l?l?d?d +?u?s?u?u?d?d?d +?l?l?d?d?d?l?s +?s?s?u?u?u?u +?u?s?l?l?l?s +?u?d?d?u?d?u?u +?u?d?d?u?u?u?d +?u?d?d?l?d?l?l +?u?s?u?s?u?d?d +?u?u?u?u?u?d?s +?u?u?u?u?d?d?d?d?d +?d?d?d?d?s?d?s?d +?u?u?l?l?l?l?d?d +?s?s?l?s?s?l +?u?l?l?l?l?u?d?d +?l?d?l?l?l?d?l?d +?d?l?d?d?l?d?l?d +?d?l?d?d?s?d?d +?d?d?s?d?d?d?u +?d?d?d?l?d?s?d +?d?d?u?s?d?d?d +?s?d?d?d?d?l?d +?d?d?d?d?l?d?s +?d?d?l?d?s?d?d +?d?d?s?d?u?d?d +?s?d?l?d?d?d?d +?d?d?l?d?d?s?d +?d?s?d?d?d?d?u +?d?d?d?d?d?l?d?d?d +?l?l?d?l?l?d?l?d +?u?l?l?l?l?s?s +?u?u?u?u?u?u?u?d?d +?u?u?u?s?l?l +?l?l?l?s?d?l?l +?l?s?u?l?l?l +?u?l?l?u?l?s +?l?u?l?l?l?s +?u?d?u?l?d?d?d +?d?u?u?d?d?d?u +?l?d?d?d?d?u?l +?d?d?d?d?l?u?u +?d?u?u?d?u?d?d +?u?l?d?d?d?l?d +?u?d?u?d?l?d?d +?l?u?d?d?d?d?l +?l?d?u?u?d?d?d +?l?u?l?d?d?d?d?d +?u?l?d?d?u?d?d +?u?d?d?u?d?d?l +?l?l?d?d?u?d?d +?d?u?d?u?d?d?u +?d?u?d?d?u?d?u +?d?d?l?u?u?d?d +?l?d?d?l?d?d?u +?u?s?u?u?u?u?u +?d?d?d?d?u?d?d?d?d +?u?u?u?u?u?s?u +?l?d?l?d?l?l?d?l +?d?d?s?u?u?u?u +?l?l?l?d?d?l?s +?l?d?l?l?l?l?d?l +?u?d?d?d?d?l?s +?s?l?d?d?d?d?l +?s?l?d?d?l?d?d +?s?u?l?d?d?d?d +?d?l?l?l?d?d?s +?d?d?d?l?l?d?s +?l?d?d?l?s?d?d +?u?u?d?s?d?d?d +?l?s?l?d?l?d?d +?d?d?d?l?d?d?d?d?d +?d?d?s?d?d?s?s +?s?d?s?d?s?d?d +?d?s?d?s?d?d?s +?d?d?l?l?d?d?l?d +?d?d?l?l?d?l?d?d +?l?l?d?s?l?l?l +?d?d?u?l?l?l?l?l +?s?l?s?l?l?s +?s?s?s?u?u?u +?d?d?d?d?s?d?d?l +?l?d?l?l?d?l?l?l +?d?u?u?u?u?u?u?u +?u?s?s?u?u?u +?u?s?u?s?u?u +?d?d?d?d?d?s?s?s +?u?l?l?s?l?l?l +?d?l?l?l?l?d?l?l +?u?d?u?l?l?d?d +?l?d?l?d?d?l?l?d +?d?u?u?l?u?d +?l?l?u?d?u?d +?u?d?l?l?u?d?d +?u?l?u?d?d?d?u +?u?u?d?u?d?u?d +?d?u?u?d?u?l +?l?u?l?d?u?d +?d?u?u?l?d?l +?d?u?d?u?u?l +?l?u?d?d?u?u +?d?l?u?l?d?u +?d?l?u?u?d?u +?l?d?l?u?d?u +?d?u?u?u?d?u?u +?l?d?u?l?u?d +?d?l?u?d?u?u +?l?u?d?u?u?d +?d?l?l?u?d?u +?l?d?u?d?u?u +?l?u?u?u?d?d?d?d +?d?l?l?u?l?d +?u?u?d?u?l?d +?d?l?u?d?l?u +?d?u?u?u?l?d +?u?d?u?l?d?u +?l?s?d?d?d?s?l +?l?l?u?u?d?d?d?d +?l?d?l?l?d?d?l?d +?d?l?d?d?d?l?l?d +?u?l?l?l?l?u?u +?l?d?l?d?d?l?d?l +?s?l?s?d?d?s +?s?s?l?d?d?s +?s?s?d?d?s?l +?l?s?d?d?s?s +?s?d?s?d?s?l +?s?s?l?s?d?d +?s?u?s?s?d?d +?d?d?s?s?s?l +?s?d?s?d?l?s +?u?s?l?l?l?l?l +?s?s?l?l?l?l?l +?d?d?l?d?d?l?l?l +?l?l?d?d?d?d?u?u +?u?u?u?d?d?d?d?s +?l?s?s?l?s?s +?l?l?d?l?l?l?d?l +?s?u?s?d?d?d?d +?l?s?d?s?d?d?d +?u?d?d?d?d?s?s +?d?d?l?d?d?l?l?d +?d?l?d?l?d?d?d?l +?u?u?l?u?u?d?d +?l?s?l?l?d?d?d?d +?d?l?l?d?l?l?d?d +?l?l?s?l?d?s +?s?u?u?u?d?s +?u?l?s?s?l?d +?l?d?s?s?l?l +?l?d?s?l?s?l +?u?d?s?l?l?s +?s?l?d?l?s?l +?d?l?s?s?l?l +?l?s?d?s?l?l +?d?d?d?d?d?u?u?d +?l?d?d?d?s?l?l +?d?d?d?l?s?l?l +?l?l?d?s?d?d?l +?l?d?d?l?l?d?s +?l?s?d?l?l?d?d +?l?s?l?s?d?s +?s?l?d?l?s?s +?d?l?l?l?l?d?s +?l?l?d?s?d?l?l +?l?l?l?u?u?u?u +?d?u?l?l?d?d?d?d +?l?d?l?d?d?d?d?d?d +?l?l?l?s?u?l +?u?l?l?s?u?u +?l?l?s?u?l?l +?l?s?l?l?u?l +?u?l?u?l?s?l +?s?l?l?l?l?u +?l?l?l?u?u?u?d +?l?d?d?l?d?l?l?d +?u?l?l?l?l?l?l?d?d +?d?d?d?s?d?d?d?d?d +?u?u?u?u?s?u?u +?l?l?d?d?u?u?u +?d?d?u?l?l?l?u +?u?u?d?u?d?u?u +?u?l?l?d?l?d?l +?u?u?u?d?u?d?u +?u?l?u?u?u?d?d +?u?l?d?d?u?l?l +?u?l?s?d?d?d?d?d +?d?l?d?l?l?d?l?d +?u?s?u?u?u?s +?s?u?l?u?l?s +?l?l?l?l?s?s?l +?u?l?l?l?l?l?d?d?d +?l?l?d?l?l?d?s +?u?l?l?s?d?l +?s?l?l?l?u?d +?l?l?l?u?s?d +?u?l?s?u?d?l +?u?s?d?u?l?l +?u?l?u?s?u?d +?l?d?l?l?l?d?s +?l?l?d?s?l?l?d +?u?u?s?d?u?u +?d?u?u?s?u?u +?u?l?l?s?u?d +?u?u?s?u?d?u +?l?s?l?l?s?d?d +?d?d?s?l?l?l?s +?l?s?d?d?d?d?d?d?d +?l?l?l?l?u?l?l +?u?d?l?d?l?d?u +?u?d?l?l?d?d?u +?l?u?u?l?d?d?d +?u?u?d?d?u?d?u +?u?d?u?d?d?u?u +?d?d?d?u?l?l?u +?l?l?d?d?l?l?d?l +?d?d?d?u?u?u?l +?d?d?d?d?d?d?l?l?l?l +?d?l?d?d?d?d?d?d?d +?l?d?s?s?s?s +?l?l?u?l?u?u +?u?l?l?l?l?d?u +?d?d?d?l?l?d?l?d +?u?d?u?d?d?u?d?d +?d?d?d?l?d?l?l?d +?l?l?d?d?l?d?l?d +?l?d?d?l?d?l?d?l +?d?d?d?u?d?d?d?u +?l?s?d?d?l?l?l +?l?d?s?l?l?l?l +?d?d?d?d?d?d?d?d?d?s +?s?d?d?d?s?l?l +?l?s?l?d?d?d?s +?l?l?s?s?l?s +?s?u?s?u?s?u +?l?d?l?d?l?s?d +?u?u?u?d?d?s?d +?u?u?s?u?d?d?d +?l?d?l?d?d?l?s +?l?l?u?l?l?l?l +?d?d?l?d?l?d?l?d +?l?u?l?l?l?l?d +?l?s?l?l?l?l?d?d +?u?l?l?l?l?u?l +?u?u?u?u?u?s?s +?u?l?u?l?u?d?d?d +?u?l?d?l?d?l?l +?d?s?d?d?d?d?d?d?d +?l?l?u?l?l?l?d +?l?l?l?l?u?u?d +?d?s?d?d?d?d?s +?d?l?l?d?d?d?d?l +?l?d?d?l?l?l?l?d +?u?u?u?d?d?d?d?u +?u?l?l?l?u?u?d +?u?l?l?s?s?l +?u?l?l?l?s?d?d?d +?d?l?l?l?l?l?d?l +?d?l?d?d?l?d?s +?u?u?d?d?d?s?d +?l?u?d?d?d?d?s +?l?d?l?d?d?s?d +?u?d?u?d?s?d?d +?l?l?d?l?d?l?s +?d?d?l?l?s?l?l +?l?s?l?s?l?s?d +?l?l?l?d?l?d?l?l +?u?l?l?l?d?d?d?d?d +?l?l?l?s?u?u +?u?l?s?u?u?u +?l?l?l?u?u?s +?u?l?u?l?s?u +?d?d?u?d?d?l?d?d +?l?l?l?l?d?l?d?l +?l?d?l?d?d?d?l?l +?d?d?d?l?l?l?d?l +?d?l?d?l?l?l?d?d +?l?s?s?l?d?d?d +?u?s?d?d?d?d?s +?d?l?s?d?l?s?d +?d?d?d?d?d?u?l?u +?u?l?d?l?d?d?l +?u?u?l?u?d?d?d +?u?l?d?l?u?d?d +?d?d?d?d?u?l?u?l +?l?d?d?d?d?d?d?d?s +?l?l?l?d?l?d?l?d +?l?s?s?s?l?l +?s?u?u?u?u?u?s +?u?d?d?d?d?d?d?d?l +?d?l?l?d?l?d?l?d +?d?d?d?l?l?d?l?l +?d?l?l?l?d?d?d?l +?l?l?l?d?l?l?d?l +?l?l?d?d?s?u +?u?d?l?s?l?d +?l?d?l?u?s?d +?s?u?u?d?d?l +?l?d?d?l?u?s +?u?d?u?u?s?d +?l?u?u?d?d?s +?d?s?d?l?l?u +?l?u?l?d?s?d +?d?u?l?s?d?l +?d?l?u?l?d?s +?u?s?d?l?u?d +?u?d?d?s?l?l +?s?d?u?u?d?u +?u?l?d?u?s?d +?d?d?s?u?l?u +?s?u?d?d?l?l +?d?u?u?d?l?s +?d?l?l?d?s?l +?d?d?l?l?s?u +?d?u?d?u?s?u +?l?d?l?s?d?l?d +?s?l?l?d?d?u +?s?u?d?d?u?u +?u?d?s?d?u?u +?u?l?d?d?s?u +?u?s?u?d?u?d +?l?d?d?d?l?l?s +?l?d?l?d?s?u +?u?u?d?s?d?u +?u?u?d?s?d?l +?d?u?d?u?u?s +?d?l?s?d?u?l +?d?u?u?u?s?d +?l?s?d?d?l?u +?d?l?l?l?l?s?d +?l?l?d?u?s?d +?d?u?l?d?s?l +?u?d?d?u?s?l +?s?u?u?l?d?d +?u?u?d?d?u?s +?l?l?s?u?d?d +?u?d?d?s?l?u +?s?d?u?d?u?u +?s?d?u?l?l?d +?u?d?d?u?s?u +?d?d?l?l?l?d?s +?d?l?u?u?d?s +?u?s?l?u?d?d +?u?d?u?s?l?d +?s?l?l?u?d?d +?d?d?s?u?u?l +?l?d?l?d?s?l?d +?d?d?s?l?u?u +?d?l?l?s?u?d +?l?s?u?d?l?d +?d?l?u?s?d?u +?l?u?d?l?d?s +?u?l?d?d?u?s +?d?l?s?l?d?u +?l?u?d?s?l?d +?l?d?s?d?l?u +?u?d?d?l?u?s +?s?u?l?u?d?d +?d?l?d?s?l?l +?d?u?l?u?d?s +?d?l?d?u?s?l +?s?l?d?u?d?l +?u?u?s?d?u?d +?l?u?s?l?d?d +?u?d?d?u?u?s +?u?l?u?d?s?d +?l?d?l?s?l?d?d +?d?s?u?l?l?d +?d?u?s?u?d?l +?l?s?u?u?d?d +?l?l?u?s?d?d +?l?l?d?l?d?l?l?d +?d?d?d?s?s?s?l +?d?u?u?d?d?u?d +?d?l?u?u?d?d?d +?d?d?u?l?d?d?u +?u?d?l?u?d?d?d +?d?d?u?d?d?u?l +?d?d?u?u?l?d?d +?l?d?u?d?l?d?d +?d?l?l?d?d?d?l?d +?d?l?l?l?d?l?d?d +?u?d?l?d?l?d?d?d +?d?l?d?u?d?l?d +?d?d?u?u?d?u?d +?d?l?u?l?d?d?d +?l?l?d?d?d?u?d +?d?u?l?u?d?d?d +?l?u?d?d?l?d?d +?d?d?d?u?d?u?u +?u?d?d?d?l?l?d +?l?d?d?d?l?d?d?d?d +?u?l?l?l?l?s?u +?d?s?s?d?s?s +?s?d?s?s?s?d +?s?d?s?d?s?s +?l?l?d?d?d?l?d?l +?l?l?l?l?l?d?d?d?d?d +?d?u?u?l?u?u +?l?l?d?u?l?u +?l?u?d?l?u?u +?u?u?d?l?u?l +?d?l?u?u?l?u +?l?d?u?u?u?l +?l?l?l?u?l?l?d +?l?u?l?u?d?u +?l?l?d?l?d?l?l?l +?l?s?s?l?l?d?d +?d?s?s?s?d?d?d +?l?d?d?l?l?d?l?l +?d?d?d?d?d?l?l?d?d +?l?u?l?u?l?u?l +?d?l?d?l?l?l?l?l +?u?d?d?d?d?d?l?l +?d?l?d?d?d?l?d?l +?d?d?u?u?u?d?d?d +?s?d?l?s?l?s +?s?d?l?l?s?s +?l?s?d?s?l?s +?d?d?d?d?d?d?d?d?d?u +?d?d?d?d?d?s?d?l +?s?l?s?l?d?d?d +?s?s?s?s?l?d +?s?l?s?l?s?s +?u?l?l?l?u?d?d?d +?s?u?l?l?l?l?s +?u?u?s?d?d?d?d?d +?l?l?d?s?d?d?d?d +?l?l?l?s?u?s +?u?u?u?s?u?s +?u?l?s?u?l?s +?l?d?l?l?s?l?l +?l?l?s?d?d?d?d?d?d +?d?u?d?u?u?u?u +?d?d?u?u?l?l?l +?u?l?d?d?d?d?l?l +?u?u?d?d?d?d?d?u +?l?l?u?d?d?d?d?d +?d?d?d?d?u?u?u?d +?d?u?u?u?d?d?d?d +?d?d?d?l?d?l?d?l +?l?d?l?d?l?s?l +?u?l?l?l?d?s?d +?d?d?l?s?l?l?l +?l?l?d?l?l?s?d +?u?u?u?u?u?s?d?d +?l?l?s?l?s?s +?s?l?l?s?l?s +?l?s?l?l?d?l?l +?l?u?l?l?l?l?l +?l?l?d?s?l?s +?u?d?u?u?s?s +?d?l?l?s?l?s +?d?l?s?l?l?s +?d?s?l?l?l?s?d +?s?d?l?s?l?l +?d?d?s?s?l?l?l +?l?l?s?s?d?l +?s?d?d?l?l?l?s +?s?l?l?s?l?d +?l?s?d?l?s?l +?l?s?d?l?l?s +?u?d?l?l?s?s +?d?s?l?l?l?s +?s?l?s?d?l?l +?l?d?l?l?l?d?d?l +?s?u?u?u?u?u?u +?u?l?l?l?l?s?l +?l?s?l?l?l?d?l +?u?l?d?d?d?d?u?l +?l?d?l?l?d?s?d +?l?d?d?l?d?l?s +?d?d?d?s?u?l?l +?d?d?l?l?l?l?l?l?l +?u?s?u?l?l?l?l +?u?l?d?d?l?l?d?d +?u?u?d?l?l?d?d +?l?d?l?l?d?d?d?l +?u?d?u?d?u?d?l +?l?l?u?d?d?d?u +?u?d?u?u?d?d?u +?u?l?u?d?u?d?d +?d?u?u?u?d?u?d +?d?d?d?l?u?u?u +?l?u?l?u?l?s +?l?s?u?u?u?u +?u?l?s?l?u?l +?l?u?s?l?l?l +?l?d?l?s?l?l?l +?l?l?d?l?d?l?d?l +?l?l?l?d?u?l?l +?l?l?d?d?d?d?s?s +?u?d?d?d?s?d?d?d +?u?u?u?u?d?d?l +?u?d?d?u?l?l?l +?l?l?d?l?d?d?l?d +?l?l?l?l?d?d?s?d +?l?l?s?l?l?d?l +?u?l?u?l?u?l?d?d +?d?s?d?s?d?l?l +?l?l?s?d?d?s?d +?l?l?l?l?l?u?l +?l?d?d?d?d?d?d?d?d?l +?l?u?l?u?d?d?d?d +?d?d?l?l?d?l?l?d +?l?l?l?l?d?s?d?d +?l?d?d?d?d?u?d +?d?d?d?l?d?u?d +?d?d?l?d?d?d?u +?u?d?u?u?d?d?d?d +?d?l?d?d?d?d?u +?d?d?l?d?d?u?d +?d?d?l?d?u?d?d +?d?l?u?d?d?d?d +?l?d?d?d?u?d?d +?l?d?l?l?l?s?l +?s?d?u?l?l?l?l +?l?l?d?d?l?d?l?l +?s?s?l?l?l?s?s +?d?d?s?d?s?d?d?d +?u?d?l?d?u?d?l?d +?l?d?d?d?l?d?l?l +?d?d?l?l?l?d?l?d +?u?d?u?l?l?l?l +?l?l?d?l?l?d?d?l +?l?l?l?s?l?d?l +?d?d?d?d?u?u?l?l +?l?l?d?d?s?d?d?d +?l?l?s?l?d?d?d?d +?l?u?l?l?u?d?d +?d?d?l?l?u?l?l +?l?s?l?s?s?l +?l?s?s?l?s?l +?u?l?u?s?s?s +?l?l?l?d?d?d?d?u +?u?u?l?d?d?d?d?d +?u?l?s?l?l?l?l +?d?l?l?d?l?l?l?l +?s?s?l?d?d?d?d +?l?d?d?s?s?d?d +?d?d?s?u?s?d?d +?l?d?s?s?d?d?d +?s?d?d?d?d?l?s +?d?d?s?s?d?d?l +?d?s?d?s?d?d?u +?l?l?l?l?s?l?s +?u?u?s?u?s?u +?l?s?l?d?l?s?l +?l?d?d?d?l?l?d?l +?d?d?s?d?d?d?d?l +?l?l?l?d?d?l?d?l +?l?l?u?u?l?l?d +?s?s?d?d?s?d?d +?d?d?d?s?s?s?d +?l?d?d?d?s?s?s +?s?l?l?d?d?d?d?d +?d?d?d?d?d?l?s?l +?d?l?l?l?d?l?l?d +?s?u?u?u?d?d?d +?d?d?s?l?l?l?d +?d?s?d?l?l?l?d +?l?u?l?s?d?d?d +?u?d?u?d?u?d?s +?u?l?l?d?d?s?d +?l?d?d?s?d?l?l +?s?s?d?d?d?d?s?s +?l?l?l?l?l?s?u +?d?d?d?l?l?l?l?s +?s?l?s?s?l?s +?l?s?s?s?s?l +?d?l?l?l?l?d?l?d +?u?u?u?u?s?d?d?d +?l?s?l?l?l?d?d?d +?u?d?d?u?d?u?d?d +?d?d?l?l?l?d?l?l +?u?u?u?u?l?l?d +?s?d?d?u?u?s +?s?d?d?u?l?s +?u?d?u?s?s?d +?d?s?l?l?d?s +?u?d?l?s?d?s +?l?s?d?d?s?u +?u?s?d?s?l?d +?s?d?u?u?s?d +?u?s?s?d?d?l +?u?d?s?l?d?s +?u?d?d?s?s?u +?l?d?s?s?d?l +?s?d?d?s?u?u +?l?l?d?s?d?s +?d?s?l?s?l?d +?d?u?u?s?s?d +?u?s?s?d?u?d +?u?d?d?s?s?l +?u?s?s?d?d?u +?s?d?s?l?d?l +?l?d?s?l?s?d +?s?d?s?d?l?l +?u?s?l?d?d?s +?s?d?u?u?d?s +?l?l?d?s?s?d +?u?d?l?d?s?s +?d?s?d?l?s?l +?s?d?d?s?u?l +?u?d?d?u?s?s +?d?d?s?s?u?l +?s?u?s?u?d?d +?s?l?u?d?d?s +?s?s?d?d?d?l?l +?s?s?u?u?d?d +?s?u?d?l?d?s +?d?u?u?d?s?s +?d?l?s?s?d?l +?l?d?d?u?s?s +?u?d?s?s?d?u +?d?s?l?s?d?l +?u?d?u?s?d?s +?d?s?d?s?u?u +?l?s?s?d?d?l +?l?s?u?s?d?d +?d?d?d?s?l?s?l +?d?l?s?d?s?l +?s?l?d?s?u?d +?d?l?s?s?l?d +?s?u?d?d?s?u +?d?u?s?d?s?u +?s?s?d?l?l?d +?s?s?l?d?l?d +?d?s?l?d?s?u +?d?u?s?d?u?s +?d?s?u?s?d?u +?u?d?s?l?s?d +?s?d?s?u?d?l +?s?d?d?d?l?l?s +?u?s?u?d?d?s +?u?d?l?l?u?d?l +?l?l?d?d?l?l?u +?d?u?l?l?l?u?d +?d?d?u?l?u?l?u +?d?u?u?d?u?u?u +?u?l?d?d?u?l?u +?d?d?l?d?l?s?d +?d?d?d?d?s?l?u +?u?d?d?l?d?d?s +?s?d?d?d?d?u?l +?d?l?d?l?s?d?d +?d?s?d?d?d?u?u +?d?d?d?s?l?d?l +?u?d?d?s?d?d?u +?l?d?d?d?l?s?d +?u?d?d?u?s?d?d +?s?l?d?l?d?d?d +?l?d?s?d?l?d?d +?l?l?d?d?d?s?d?d +?d?d?d?l?s?l?d +?u?d?d?d?d?u?s +?s?d?d?d?l?l?d +?d?l?d?d?l?l?l?d +?l?u?l?l?d?d?d?d +?d?u?u?d?d?d?d?d +?d?l?l?l?l?l?u +?s?l?u?l?u?d +?s?l?u?u?l?d +?l?l?u?l?s?d +?d?s?l?u?l?l +?s?u?u?u?d?u +?s?u?u?u?d?l +?u?d?s?l?l?l +?d?l?l?l?u?s +?u?u?u?s?u?d?d +?l?l?l?s?d?u +?l?l?d?l?s?u +?u?l?s?d?u?l +?u?l?d?u?l?s +?s?l?d?l?u?l +?u?l?s?u?d?u +?u?l?l?u?s?d +?u?l?l?d?u?s +?s?u?u?l?l?d +?l?s?d?l?l?u +?u?u?d?u?s?u +?d?u?s?l?l?l +?s?u?u?l?d?l +?s?d?u?l?u?l +?l?l?s?u?d?l +?u?l?d?l?s?l +?u?u?u?s?d?l +?u?s?l?d?l?u +?u?u?u?u?d?s?d +?d?u?s?u?u?u +?d?u?u?u?s?u +?u?d?l?l?s?u +?l?d?u?l?l?s +?u?s?l?d?u?l +?l?d?s?u?l?l +?l?u?l?d?l?s +?u?u?d?s?u?u +?d?l?l?u?l?s +?l?l?u?u?s?d +?u?u?l?d?s?l +?l?s?d?u?u?u +?u?l?s?u?l?l?l +?u?u?d?u?d?d?u +?l?d?l?u?l?d?d +?u?d?l?u?d?d?l +?u?l?u?d?d?d?l +?u?d?d?l?l?d?l +?d?u?d?u?d?u?u +?u?l?u?d?d?l?d +?u?l?d?u?l?d?d +?u?u?d?d?d?u?l +?d?u?d?d?u?l?l +?u?u?l?d?d?d?l +?s?d?l?l?l?d?s +?l?l?d?d?d?d?s?d +?l?d?d?l?l?l?d?l +?d?d?s?d?d?d?s?d +?s?l?l?l?l?l?d?d +?s?s?s?d?d?d?l +?l?s?s?s?d?d?d +?l?d?d?d?d?d?s?d +?u?s?s?s?s?s +?d?d?l?l?l?d?d?s +?u?l?l?l?s?l?l +?u?s?l?l?l?u +?s?u?l?l?l?l?l +?l?s?l?l?l?u +?u?l?l?u?s?u +?s?l?u?l?l?l +?u?l?s?u?l?u +?l?l?l?u?l?s +?l?l?s?l?l?u +?d?d?d?d?d?d?d?l?s +?d?l?d?l?d?l?l?d +?l?l?d?l?d?d?d?l +?l?s?s?l?l?s +?s?l?l?l?l?d?d?d +?u?l?l?d?u?l?d +?u?l?l?d?d?u?l +?s?u?l?l?l?d?d +?l?s?l?l?d?l?d +?d?l?l?l?d?l?s +?u?l?u?l?d?d?s +?s?u?u?u?u?d?d +?s?s?d?d?l?l?l +?d?d?d?u?l?l?d?d +?l?d?d?d?d?d?d?l?l +?d?d?s?l?l?l?l?l +?s?s?s?s?u?u +?d?l?l?l?d?d?l?d +?d?l?d?l?d?l?l?l +?l?l?s?s?l?l?l +?s?s?s?l?l?d +?s?s?d?l?l?s +?s?s?l?d?l?s +?s?s?s?d?l?l +?s?l?l?d?s?s +?l?s?l?d?s?s +?l?s?d?l?s?s +?s?l?s?l?d?s +?l?d?d?l?d?s?s +?l?l?l?l?l?d?s?d +?l?l?s?l?l?l?l?l +?l?d?l?l?d?d?l?l +?d?l?l?l?l?d?d?d?d +?l?l?d?d?l?d?s +?l?d?d?s?l?l?d +?s?l?d?l?l?d?d +?l?l?d?l?s?d?d +?l?l?d?l?d?d?s +?l?l?s?d?d?l?d +?l?d?s?l?d?l?d +?d?d?d?u?l?l?s +?l?l?l?d?d?d?s?s +?s?d?l?d?l?d?l +?s?s?u?l?l?l +?u?s?u?l?l?s +?u?u?u?l?d?d?d?d +?d?l?l?d?d?d?l?l +?d?l?l?l?d?d?l?l +?s?d?l?l?l?s?d +?d?l?l?s?l?l?l +?u?u?u?u?u?u?l +?u?s?u?l?l?d?d +?u?l?s?l?l?d?d +?l?d?l?s?l?l?d +?u?u?l?l?d?d?s +?u?l?l?l?l?d?d?s +?l?l?d?d?u?l?l +?l?d?l?d?d?l?l?l +?u?l?d?d?l?l?u +?u?l?l?d?d?u?u +?l?l?l?s?s?l?l +?s?d?u?d?d?d?d +?d?u?s?d?d?d?d +?d?u?d?d?d?s?d +?d?d?d?d?u?d?s +?d?s?d?d?d?l?d +?s?u?d?d?d?d?d +?d?d?u?d?d?d?s +?u?l?d?u?l?l?l +?u?u?u?d?d?u?u?u +?l?l?l?l?u?l?d +?u?l?l?l?d?d?d?s +?d?d?d?l?d?l?l?l +?l?l?l?l?l?l?s?d?d +?l?l?l?l?l?u?d?d +?s?d?d?s?l?l?l +?u?u?u?s?s?d?d +?u?l?l?d?d?l?l?l +?l?u?u?u?u?u?d?d +?u?u?u?l?l?d?d?d +?d?d?d?d?d?d?d?u?l +?u?l?l?l?l?l?s?d +?d?u?d?u?u?d?d +?d?u?d?d?d?u?u +?d?u?l?d?d?u?d +?d?u?d?l?l?d?d +?u?d?d?l?d?u?d +?d?u?d?l?u?d?d +?l?d?l?d?u?d?d +?l?u?d?d?d?d?u +?u?u?d?l?d?d?d +?d?u?d?d?u?u?d +?u?d?l?d?d?d?l +?l?d?d?d?d?l?u +?l?u?d?d?u?d?d +?d?l?d?d?d?u?l +?u?d?d?u?d?l?d +?d?d?l?d?d?u?u +?u?d?d?d?u?u?d +?d?l?d?u?l?d?d +?u?d?d?d?u?l?d +?l?d?d?l?d?l?l?l +?l?l?u?u?u?u?u +?d?l?l?u?l?l?l +?l?d?l?l?s?l?d +?l?s?l?d?l?d?l +?d?d?l?l?d?d?d?d?d +?u?s?l?l?l?l?d +?u?l?u?l?u?l?s +?u?l?l?d?d?d?d?l +?d?u?d?u?d?u?d?u +?d?d?l?d?l?l?l?l +?s?l?l?s?s?l +?s?u?u?u?s?s +?d?l?l?d?l?l?l?d +?d?s?d?d?d?s?d?d +?u?u?u?d?d?s?s +?d?l?d?l?l?d?d?l +?u?d?l?u?d?l?l +?u?d?d?l?l?d?u +?l?u?d?d?d?l?l +?u?d?d?u?u?d?u +?l?u?d?d?l?l?l +?d?l?l?u?l?l?d +?u?l?d?d?d?u?u +?u?d?d?u?d?l?l +?u?d?d?l?u?d?l +?u?l?d?d?l?d?u +?l?l?l?d?d?u?d +?d?d?d?l?u?l?l +?u?u?l?l?u?d?d +?d?d?d?d?l?l?l?u +?l?l?l?l?l?l?l?d?d?d +?d?d?d?s?l?l?s +?l?l?s?d?s?d?d +?l?l?s?l?l?s?d +?d?d?u?l?l?d?d?d +?l?l?l?d?l?d?d?l +?d?d?l?d?l?l?l?d +?d?d?s?u?s?s +?l?d?s?s?d?s +?s?l?d?d?s?s +?d?s?d?s?l?s +?l?d?s?d?s?s +?s?l?s?d?s?d +?s?l?s?s?d?d +?l?d?d?s?s?s +?s?s?s?u?d?d +?d?d?l?s?s?s +?s?s?d?d?l?s +?u?l?l?l?l?u?s +?u?u?u?u?u?l?d +?u?u?u?d?d?l?l?l +?l?s?s?l?l?l?l +?l?s?l?l?l?s?l +?l?l?l?d?l?d?s +?d?l?l?d?l?l?d?l +?d?d?s?d?d?s?u +?s?d?d?l?s?d?d +?u?d?d?s?d?d?s +?d?d?s?d?s?d?l +?d?d?d?l?s?s?d +?d?s?d?d?s?d?l +?u?d?s?d?s?d?d +?s?d?d?s?d?d?l +?d?d?d?d?u?s?s +?s?s?d?d?l?d?d +?d?s?d?d?s?l?d +?l?s?l?s?l?l?l +?u?l?u?d?d?d?d?d?d +?l?l?l?l?d?d?s?s +?l?d?d?d?d?d?d?d?u +?d?d?l?d?d?d?d?s +?d?d?s?d?d?l?d?d +?d?d?s?l?d?d?d?d +?s?d?d?d?d?d?d?u +?l?l?s?d?d?s?d?d +?u?s?d?l?l?s +?s?d?s?u?u?u +?s?s?l?d?l?l +?u?s?d?u?u?s +?l?d?s?l?l?s +?u?s?l?l?d?s +?s?l?l?s?d?u +?u?s?l?d?l?s +?l?l?d?s?s?l +?s?d?u?l?l?s +?s?u?s?u?d?l +?d?s?s?l?l?l +?d?u?u?u?s?s +?s?u?u?d?u?s +?s?u?l?l?d?s +?l?s?u?d?s?l +?u?s?d?s?u?u +?u?s?d?u?s?u +?u?u?l?d?s?s +?u?u?d?d?d?d?d?d?d?d +?d?u?u?l?l?l?l +?l?d?d?d?d?l?d?d?d +?d?u?d?d?u?d?d?d +?l?d?l?d?l?d?d?d?d +?d?d?u?l?l?d?d?d?d +?l?d?d?d?u?d?d?d +?d?l?l?d?d?l?l?l +?d?u?l?l?l?l?l?l +?s?l?l?d?l?d?d +?l?d?l?d?d?s?l +?u?l?s?l?d?d?d +?d?l?l?d?d?l?s +?l?l?d?d?l?s?d +?l?s?l?d?d?d?l +?l?d?s?l?l?d?d +?s?l?l?l?l?l?l?s +?l?l?l?l?d?d?d?d?s +?d?l?d?d?d?l?l?l +?d?l?l?d?l?d?d?l +?d?l?l?d?d?l?d?l +?d?l?d?l?d?d?l?l +?d?d?l?l?d?l?d?l +?d?l?d?d?l?l?l?l +?u?u?d?u?d?d?d?d +?d?s?s?s?s?s +?l?l?l?l?l?l?l?l?d?d +?u?u?s?u?l?l +?s?u?u?l?l?l +?d?l?s?l?l?l?l +?u?s?u?l?u?l +?u?u?u?l?l?s +?u?s?u?l?l?u +?u?u?u?u?s?l +?u?s?u?u?u?u?d +?l?l?s?u?u?u +?d?l?l?l?l?s?l +?s?l?l?u?l?l +?l?u?l?l?u?s +?u?s?u?u?l?l +?s?l?l?u?u?l +?l?l?u?l?l?s +?u?l?l?s?l?u +?d?d?s?d?d?s?l?l +?l?d?d?d?d?d?d?d?d?d?d +?d?s?d?d?s?d?d?d +?l?l?d?d?u?u?l +?d?l?l?l?l?d?u +?u?d?l?l?d?l?u +?u?u?u?d?d?d?u?u +?d?u?l?l?l?d?u +?d?d?d?d?d?d?s?l?l +?u?d?d?d?d?l?l?l +?u?l?l?u?s?s +?l?s?l?s?l?u +?u?u?l?l?s?s +?s?u?s?l?l?l +?u?s?l?s?l?l +?u?l?s?l?l?s +?s?u?l?l?u?s +?l?l?u?u?u?u?d +?s?s?s?l?l?s +?u?l?l?u?s?d?d +?s?d?l?l?l?l?d +?d?d?l?l?l?s?l +?l?l?l?l?u?d?d?d +?s?l?d?l?d?l?s +?u?u?u?d?u?u?u?u +?l?l?l?l?l?l?s?s +?d?l?d?l?l?d?l?l +?u?u?u?d?d?d?d?l +?d?d?l?l?d?l?l?l +?l?l?s?l?l?d?d?d +?d?d?l?l?l?l?d?l +?s?s?s?s?d?l +?d?l?l?l?s?l?l +?d?l?d?l?l?l?l?d +?d?d?s?d?d?l?l?l +?l?l?s?s?d?d?d?d +?s?d?l?l?l?l?l?l +?l?s?d?s?d?s?d +?l?l?d?l?d?d?l?l +?s?l?d?d?d?l?s +?s?l?s?s?l?l +?l?l?l?d?d?d?s?d +?d?l?l?l?d?l?d?l +?d?d?u?l?u?l?d?d +?d?l?d?d?l?d?l?l +?d?s?d?s?l?l?l +?l?d?l?d?l?s?s +?u?u?u?s?d?d?s +?l?l?s?l?s?d?d +?u?l?l?l?u?l?l?l +?l?d?l?l?l?s?d +?l?d?l?d?s?l?l +?l?l?s?l?d?d?l +?u?u?u?l?u?d?d +?d?d?l?l?l?u?u +?u?l?u?l?l?l?d?d +?l?u?u?l?l?d?d +?u?s?u?s?u?s?u +?l?s?l?l?l?s?d +?l?s?l?l?l?l?s +?u?d?l?l?l?d?d?d +?d?d?l?d?l?d?l?l +?d?d?d?d?s?d?d?s +?d?d?d?s?d?s?d?d +?l?l?s?l?d?l?l +?d?l?l?d?l?d?l?l +?d?d?l?l?l?s?d?d +?l?l?s?l?l?l?d?d +?d?d?d?d?u?l?l?d +?u?l?d?l?d?d?d?d +?d?u?u?u?u?u?u?d +?u?l?l?l?d?u?l +?l?l?l?l?d?l?u +?d?u?l?l?u?l?l +?l?l?d?d?d?d?d?d?s +?d?d?d?d?d?d?u?l?l +?d?l?d?d?d?l?s +?d?l?d?s?l?d?d +?l?d?d?d?d?u?s +?s?l?d?d?d?l?d +?l?d?d?d?s?d?l +?d?l?d?s?d?d?l +?d?d?u?u?d?d?s +?d?d?u?u?s?d?d +?l?d?d?d?s?l?d +?l?s?d?l?d?d?d +?u?s?d?d?u?d?d +?s?d?l?l?d?d?d +?d?d?u?s?d?d?l +?u?s?d?d?d?d?l +?l?s?d?d?l?d?d +?u?l?d?s?d?d?d +?d?d?d?l?d?l?s +?l?s?d?d?d?d?u +?s?d?d?u?u?d?d +?d?d?s?u?l?d?d +?l?d?s?d?d?d?l +?d?d?l?d?l?d?s +?u?d?d?d?d?s?u +?d?u?l?s?d?d?d +?d?d?l?s?d?l?d +?l?d?d?u?d?d?s +?s?d?l?d?d?l?d +?u?d?d?u?d?d?u?d?d +?l?l?l?d?s?l?l +?l?d?d?u?d?d?d?d +?u?l?l?l?u?u?u +?l?u?u?u?u?d?d?d +?u?d?l?u?d?l?d +?d?d?u?u?d?d?u?u +?u?l?d?d?l?u?d +?l?u?l?d?d?d?u +?d?l?u?l?u?d?d +?l?l?d?l?u?d?d +?u?d?u?d?l?d?l +?l?d?d?d?u?u?u +?d?d?l?d?l?l?d?l +?d?d?d?l?l?u?l +?l?d?d?l?d?u?u +?l?u?d?d?d?l?u +?l?d?u?d?l?d?l +?u?d?d?u?l?d?l +?d?u?u?d?u?d?u +?d?d?u?u?d?u?u +?u?d?l?d?u?l?d +?l?l?l?d?u?d?d +?u?d?d?d?u?l?u +?d?l?l?u?d?l?d +?l?l?d?d?d?l?u +?u?u?u?d?l?d?d +?u?d?u?l?u?d?d +?u?l?l?d?d?u?d +?l?l?l?d?u?u?u +?d?d?d?d?d?d?d?d?s?d +?d?u?l?l?l?l?s +?s?l?l?l?d?l?l +?u?d?l?l?l?l?d?d +?l?l?s?s?s?d?d +?l?l?l?l?l?s?l?l +?u?d?l?d?l?d?s +?s?d?d?d?u?u?u +?d?l?l?d?l?s?d +?d?d?u?l?l?l?s +?l?d?d?l?l?s?d +?l?d?d?l?s?l?l +?l?l?d?s?l?d?l +?l?l?d?s?l?d?d +?l?l?d?l?d?s?d +?u?l?s?u?l?d?d +?u?s?l?d?l?d?d +?s?u?l?l?d?d?d +?l?l?d?d?d?s?l +?d?l?l?d?l?d?s +?d?l?l?s?l?d?d +?u?u?l?d?d?d?s +?l?l?d?d?l?s?l +?s?s?s?l?d?d?d +?u?d?u?d?u?d?d?d +?d?d?d?d?d?l?u?l +?u?s?u?d?d?d?d?d +?d?l?d?l?l?l?d?l +?u?l?l?u?l?l?s +?l?l?l?l?d?s?l +?l?u?l?d?u?u +?l?u?l?u?l?u?d +?u?d?u?d?l?l?l +?l?l?l?l?d?u?u +?s?l?l?l?l?d?l +?d?d?l?l?u?u?u +?d?l?l?l?l?d?d?l +?l?d?u?u?l?u +?l?l?d?d?l?u?l +?u?u?l?l?d?d?l +?l?l?l?l?s?l?d?d +?d?d?d?d?s?s?s?s +?d?s?d?s?s?d?d +?u?l?u?u?d?d?d?d +?s?d?s?d?d?d?d?d +?l?l?d?d?d?l?d?d?d +?l?l?l?s?l?s?d +?l?s?s?s?l?d +?l?s?s?l?d?s +?l?s?s?s?d?l +?l?s?s?d?l?s +?l?l?s?s?d?s +?l?d?s?l?s?s +?s?l?l?s?d?s +?s?u?l?s?d?s +?u?s?u?s?d?s +?l?u?d?s?s?s +?d?l?l?s?s?s +?s?s?l?s?l?d +?d?l?s?l?s?s +?l?l?s?d?s?s +?l?l?l?l?l?l?s?l +?d?l?l?l?l?l?l?l?l +?l?l?l?s?l?l?d?d +?d?d?d?l?d?d?d?s +?u?d?d?s?d?d?d?d +?d?d?l?d?d?s?d?d +?u?u?s?s?d?d?d +?u?d?l?l?d?l?d?d +?u?d?d?l?l?l?d?d +?u?l?u?l?u?l?l +?d?d?d?s?d?d?d?d?l +?s?l?u?l?u?s +?u?l?s?l?s?l +?l?l?l?u?s?s +?s?u?u?u?s?u +?l?l?d?d?d?d?d?l?l +?l?l?l?d?d?d?l?l?l +?u?d?l?d?d?l?d?d +?l?l?l?s?l?l?s +?l?s?l?d?l?l?d +?s?l?d?l?l?d?l +?s?d?d?u?u?u?u +?d?s?d?u?u?u?u +?d?d?u?u?u?u?s +?l?d?d?l?l?s?l +?u?u?u?s?l?l?l +?s?u?s?u?u?s +?s?s?l?l?s?l +?u?d?l?l?l?l?s +?l?l?d?d?u?u?d?d +?s?l?d?l?l?d?s +?u?l?l?d?d?s?s +?l?d?d?d?d?l?d?d?d?d +?d?d?d?d?l?l?d?d?d?d +?u?l?u?s?d?d?d?d +?u?l?l?l?l?l?l?s +?l?d?d?l?d?d?d?d?d +?d?d?d?d?d?d?l?l?s +?l?l?u?l?d?d?d?d +?u?s?l?u?l?u +?l?l?u?u?u?s +?l?l?l?s?l?u +?u?l?u?s?u?l +?l?l?u?s?l?l +?u?l?u?s?l?l +?u?l?u?s?l?u +?u?l?l?u?u?s +?u?u?l?l?u?s +?d?l?l?l?l?s?s +?l?l?l?l?l?s?d?d?d +?l?l?u?d?d?l?l +?d?u?l?l?l?d?l +?u?l?d?l?d?l?u +?d?d?u?l?u?l?l +?d?d?d?l?l?l?l?d?d +?l?l?l?s?l?d?d?d +?d?s?d?s?d?s?l +?u?s?u?s?s?s +?s?l?l?s?s?s +?d?d?s?l?l?s?d?d +?s?d?l?l?l?l?s +?d?d?u?d?u?d?d?d +?u?d?d?d?d?d?u?d +?u?d?d?d?d?d?u?u +?d?d?d?d?d?u?d?u +?d?d?d?l?d?d?d?u +?u?u?d?d?d?u?d?d +?l?l?d?d?l?d?d?d?d +?d?d?d?d?u?d?u?d +?l?d?d?d?d?d?u?l +?d?u?d?u?d?d?d?d +?l?d?d?d?d?u?d?d +?d?d?u?d?d?d?d?l +?l?l?d?l?s?l?l +?l?l?d?l?l?s?l +?d?d?s?s?d?d?d?d +?l?l?l?s?l?s?l +?l?d?l?l?d?s?s +?l?s?l?d?d?d?d?d?d +?d?l?l?d?l?s?l +?u?l?l?s?l?d?d +?l?s?l?l?d?d?l +?d?l?l?d?l?l?s +?l?s?d?l?l?l?d +?d?l?d?l?l?l?s +?d?d?s?d?d?d?d?d?d?d +?u?s?l?l?d?d?d?d +?l?l?l?l?d?d?d?u +?u?l?l?u?l?l?u +?s?d?d?d?d?d?l?l +?l?l?l?d?l?s?l +?l?d?l?u?l?l?l +?u?u?l?l?u?u?d +?l?l?l?l?s?s?d?d +?d?s?d?s?d?l?d +?d?d?d?s?d?s?l +?d?s?l?d?d?d?s +?s?l?d?s?d?d?d +?d?d?s?d?l?s?d +?s?s?d?d?d?l?d +?d?l?d?s?s?d?d +?u?s?s?d?d?d?d +?l?d?d?d?s?s?d +?l?d?d?s?d?s?d +?d?s?d?l?d?s?d +?l?s?l?l?s?l?l +?u?l?l?l?d?l?l?l +?d?d?d?d?l?l?u?u +?s?l?l?l?l?l?l?l +?d?d?l?s?d?d?d?d +?d?l?d?s?d?d?d?d +?l?d?s?d?d?d?d?d +?u?u?u?u?u?l?l +?l?s?l?l?l?l?l?l +?s?l?d?d?l?l?d +?l?d?l?d?s?d?l +?s?l?d?d?d?l?l +?d?l?d?l?s?d?l +?l?d?d?d?l?s?l +?d?l?l?s?d?l?d +?s?d?d?l?l?l?d +?l?d?d?l?s?l?d +?d?d?d?s?l?u?l +?l?l?s?d?l?d?d +?l?l?u?s?d?d?d +?l?d?s?d?d?l?l +?d?l?d?d?l?l?s +?l?s?l?d?d?l?d +?d?l?d?l?l?d?s +?s?l?l?d?l?l?l +?l?l?s?l?s?l?l +?u?u?d?d?u?d?d?d +?u?u?d?d?d?d?d?l +?u?d?d?u?d?d?u?d +?d?d?d?d?d?l?l?u +?l?l?l?d?d?d?d?l?l +?l?l?l?s?l?l?l?d +?l?d?l?l?l?l?u +?s?u?u?u?d?d?s +?u?s?d?d?d?s?u +?u?l?l?s?s?d?d +?u?l?d?d?d?s?s +?l?d?d?d?l?s?s +?l?l?d?d?s?s?d +?l?s?l?d?d?s?d +?l?s?l?d?s?d?d +?u?l?s?s?d?d?d +?l?d?d?d?s?s?l +?d?d?d?l?s?l?s +?d?s?d?d?s?l?l +?u?l?l?d?d?d?d?u +?u?d?d?d?d?u?u?u +?d?d?u?u?u?d?d?d?d +?u?u?u?u?d?u?u?u +?d?u?d?l?l?l?l +?u?l?d?d?l?u?u +?u?l?d?u?d?l?l +?d?d?u?u?u?l?l +?d?u?l?u?l?u?d +?l?u?l?d?l?d?l +?u?l?d?u?l?d?u +?l?u?u?u?l?d?d +?u?l?l?u?d?l?d +?l?l?d?d?u?l?u +?l?d?l?l?l?d?u +?d?d?l?u?u?u?u +?u?l?u?d?d?u?l +?u?u?d?d?d?d?d?s +?l?l?l?l?l?u?s +?u?l?l?u?d?s +?d?s?l?u?u?u +?l?l?d?s?l?u +?l?u?l?l?s?d +?l?d?l?u?s?l +?l?l?l?s?u?d +?s?d?l?l?l?u +?l?l?s?l?d?u +?u?d?u?u?s?l +?s?l?l?d?u?u +?s?l?l?d?u?l +?l?u?u?u?d?s +?s?d?l?u?u?l +?u?d?s?u?u?l +?l?l?l?d?u?s +?d?l?l?u?s?l +?u?l?d?l?u?s +?d?s?l?u?l?u +?l?u?l?s?l?d +?l?s?u?l?d?l +?u?u?u?s?l?d +?d?l?s?l?l?u +?s?l?l?d?l?u +?l?l?u?d?l?s +?l?s?l?d?u?l +?u?l?l?s?d?u +?l?u?u?d?u?s +?u?u?u?l?s?d +?d?l?l?s?u?u +?u?d?u?l?u?s +?u?l?s?d?u?u +?d?u?l?s?u?l +?d?l?u?l?u?s +?d?u?s?l?u?u +?u?u?l?l?d?s +?u?d?l?s?u?l +?u?l?u?d?u?s +?l?u?s?l?u?d +?s?d?u?l?u?u +?u?s?u?d?u?l +?s?l?l?l?d?u +?l?u?u?s?l?d +?d?s?u?l?l?u +?s?l?d?u?l?l +?s?d?l?u?l?l +?d?d?s?u?l?l?l +?u?d?u?s?u?u +?l?l?s?d?l?u +?u?l?d?u?s?u +?u?l?d?s?l?u +?u?d?s?l?u?l +?u?s?l?l?u?d +?u?u?u?u?s?u?d +?s?u?d?l?l?l +?s?u?l?d?l?l +?d?l?s?l?u?l +?s?l?l?d?d?l?l +?l?u?d?s?l?l +?s?l?l?u?d?l +?u?l?u?u?d?s +?s?l?d?l?l?l?l +?l?u?u?d?l?s +?u?u?u?l?d?s +?u?u?l?u?s?d +?l?d?u?s?l?l +?s?l?l?d?l?l?s +?l?u?d?u?l?s +?u?s?l?u?l?d +?l?l?l?d?s?u +?l?l?u?u?s?d?d +?l?s?u?u?l?d +?l?u?l?s?d?l +?s?u?u?d?u?u +?u?u?u?d?s?u +?l?d?u?u?l?s +?u?u?u?d?l?s +?l?s?l?d?d?l?l +?u?d?u?u?l?s +?u?u?d?d?u?u?s +?l?u?s?d?l?u +?l?u?s?d?l?l +?l?u?s?l?l?d +?u?l?l?l?d?l?s +?u?l?s?l?u?d +?s?u?l?u?d?u +?d?l?u?u?u?s +?u?d?l?u?s?u +?u?d?u?l?s?l +?l?s?d?u?l?l +?s?u?u?d?l?l +?d?l?u?l?s?l +?d?u?l?u?l?s +?l?u?s?l?d?l +?l?l?d?s?u?l +?u?s?l?l?d?u +?s?d?u?u?l?u +?l?d?l?u?l?s +?u?l?d?u?u?s +?u?s?l?u?d?l +?d?s?u?u?l?l +?d?l?s?u?u?u +?u?l?u?u?s?d +?u?l?s?d?l?l +?d?u?l?s?l?l +?s?l?l?u?u?d +?l?s?d?s?l?s?d +?u?d?u?l?d?d?u +?l?d?l?d?d?l?u +?u?d?l?d?d?l?l +?d?u?l?u?d?d?l +?l?d?u?l?l?d?d +?d?l?l?d?u?u?d +?u?u?d?d?l?d?l +?d?u?d?u?u?d?u +?u?d?d?l?u?d?u +?l?d?l?u?d?d?l +?d?u?d?l?l?l?d +?d?d?u?d?u?u?u +?l?l?u?d?d?l?d +?l?l?u?d?l?d?d +?l?u?d?l?l?d?d +?u?l?l?d?u?d?d +?l?d?u?d?d?u?l +?d?u?d?u?u?u?d +?u?d?d?l?u?l?d +?l?u?l?d?l?d?d +?l?d?l?d?u?d?l +?d?l?l?u?u?d?d +?d?d?u?d?l?l?l +?u?d?d?u?l?l?d +?u?d?d?d?l?l?u +?u?d?u?l?d?u?d +?l?u?u?l?d?d?d?d +?l?u?d?d?d?u?l +?d?l?l?u?l?d?d +?d?l?l?d?l?d?u +?l?u?d?l?u?d?d +?l?d?u?d?l?u?d +?u?d?l?u?l?d?d +?l?d?d?d?l?l?u +?d?d?d?l?u?l?u +?d?u?l?u?l?d?d +?d?d?u?u?l?l?d +?d?l?u?d?l?u?d +?u?l?u?d?d?u?d +?d?d?d?d?s?u?u?u +?u?l?l?d?d?u?l?l +?s?l?l?d?d?d?d?s +?d?d?d?d?l?l?s?s +?d?l?l?d?d?d?d?d?d +?d?d?d?l?d?d?d?d?l +?d?l?s?s?s?s +?l?s?s?s?s?d +?l?s?s?d?s?s +?s?l?d?s?s?s +?u?s?s?s?s?d +?l?s?d?s?s?s +?u?l?u?l?l?d?d?d +?d?u?u?u?u?u?d?d +?u?u?d?u?l?l?l +?s?s?s?l?l?l?l +?s?l?d?l?l?l?s +?s?d?d?s?d?d?d?d +?u?u?u?u?u?u?s?d +?l?l?l?l?d?l?l?l?l +?d?d?s?d?s?d?d?l +?d?l?d?d?l?l?d?l +?l?l?l?s?s?s?s +?u?s?l?s?l?s +?d?d?l?l?l?l?l?s +?l?l?l?s?d?d?d?d?d +?l?d?l?s?d?d?d?d +?d?d?l?s?s?l?l +?l?d?s?l?d?s?l +?l?l?l?d?s?d?s +?l?u?u?d?d?d?d?d +?l?l?s?d?s?l?l +?d?d?d?d?d?d?l?d?l +?l?d?l?d?l?d?l?d?l +?l?d?d?d?s?d?d?d?d +?d?d?d?d?u?u?u?u?u +?d?u?l?l?l?l?u +?l?l?d?u?l?l?l +?d?d?d?d?d?l?l?l?l?l +?l?l?s?l?l?l?s +?u?d?l?l?l?l?l?l +?u?l?l?l?l?d?d?l +?d?u?l?l?l?l?l?d +?u?l?l?d?l?l?l?l +?s?l?u?u?l?s +?s?u?u?s?u?u +?u?s?u?l?u?s +?l?u?l?u?s?s +?l?s?u?s?l?l +?u?s?l?l?s?u +?u?l?s?u?s?u +?l?l?u?s?s?l +?u?l?l?s?l?s +?l?s?l?l?s?u +?l?l?u?u?s?s +?u?s?u?s?u?l +?l?l?l?d?s?s?s +?d?d?d?d?d?s?s?l +?l?d?d?s?d?s?d?d +?u?l?l?l?d?d?l?l +?s?l?l?s?d?d?d?d +?d?l?d?l?s?l?l +?s?l?d?d?l?l?l +?l?d?l?l?d?s?l +?u?d?l?l?d?l?s +?l?u?l?l?s?d?d +?u?d?d?s?u?u?u +?l?l?s?l?d?l?d +?d?l?l?s?l?l?d +?l?d?s?l?d?l?l +?l?d?l?l?s?d?l +?u?l?d?d?l?l?s +?s?d?l?l?l?d?l +?d?d?d?l?u?d?d?d +?d?d?d?d?l?u?d?d +?d?d?d?d?d?d?d?d?u?u +?d?u?d?d?d?u?d?d +?d?d?l?d?d?d?d?u +?d?d?d?u?d?u?d?d +?d?d?d?d?u?d?d?u +?d?d?d?d?u?d?d?l +?d?d?d?u?d?d?d?l +?l?d?d?d?d?d?u?d +?d?l?d?u?d?d?d?d +?d?s?d?s?d?s?s +?s?s?s?s?s?u +?u?d?l?u?d?l?u +?l?d?l?u?l?l?d +?u?l?u?l?d?d?l +?l?l?d?l?l?d?u +?l?l?l?d?d?l?u +?u?u?d?l?l?l?d +?u?d?l?l?l?d?u +?d?d?u?u?u?u?l +?d?l?l?d?l?l?u +?u?l?d?u?l?u?d +?l?d?d?u?l?l?l +?u?l?l?d?d?l?u +?l?u?l?u?u?d?d +?s?u?u?u?u?u?d +?l?l?l?s?s?s?d +?l?l?u?u?l?l?l +?d?d?l?l?d?d?d?s +?d?d?d?d?d?l?d?s +?d?d?d?d?l?s?d?d +?d?d?d?d?s?l?d?d +?d?d?d?l?s?d?d?d +?s?d?s?l?l?l?l +?l?l?d?l?l?s?s +?u?l?u?d?l?l?l +?l?l?d?l?l?l?u +?d?l?l?l?l?u?u +?d?u?l?l?l?l?d?d +?u?l?l?l?s?u?l +?l?l?s?d?d?s?l +?d?d?d?u?u?l?d +?u?d?d?d?l?d?u +?u?l?d?d?d?u?d +?l?d?d?u?d?u?d +?u?u?d?d?d?l?d +?l?d?u?d?d?d?l +?d?u?u?l?d?d?d +?l?d?d?d?d?u?u +?d?d?d?l?d?u?u +?d?d?u?l?d?d?l +?d?l?d?u?u?d?d +?d?l?d?d?l?d?u +?d?l?d?d?u?d?u +?d?u?l?d?d?d?u +?l?d?d?d?u?u?d +?u?l?d?u?d?d?d +?d?l?d?u?d?d?l +?d?d?d?l?l?u?d +?d?u?l?d?d?l?d +?u?d?l?d?d?d?u +?l?u?d?d?d?l?d +?d?d?d?u?l?d?u +?d?d?l?d?d?l?u +?d?d?u?d?l?d?u +?d?d?u?d?l?d?l +?d?d?d?u?d?l?l +?l?d?d?l?d?u?d +?u?d?l?d?d?u?d +?d?d?d?l?l?d?u +?d?d?l?u?d?u?d +?d?d?u?d?d?l?u +?d?d?l?l?d?u?d +?d?d?l?u?d?d?u +?l?d?u?d?d?l?d +?d?l?d?d?d?u?u +?d?d?l?u?d?d?l +?d?d?d?u?l?u?d +?l?u?d?l?d?d?d +?d?l?d?d?u?l?d +?l?d?d?u?u?d?d +?u?d?u?d?d?l?d +?d?d?l?u?d?l?d +?d?l?d?u?d?d?u +?l?u?d?d?d?u?d +?d?l?l?d?u?d?d +?l?d?u?d?d?u?d +?l?d?l?d?d?d?u +?d?u?l?d?l?d?d +?u?d?d?d?l?u?d +?u?d?u?d?d?d?l +?l?d?u?l?d?d?d +?l?d?d?d?u?l?d +?u?d?l?d?d?u?d?d +?d?l?l?d?d?d?u +?d?l?d?l?d?u?d +?d?l?d?l?d?d?u +?d?d?d?u?d?u?l +?u?d?d?d?u?d?l +?d?l?l?u?d?d?d +?l?d?d?u?d?l?d +?d?d?u?u?d?l?d +?l?d?d?d?u?d?l +?d?d?s?d?d?s?d?d?l +?s?d?d?d?d?d?d?d?d?d +?u?l?l?u?l?u?l +?d?d?d?s?d?d?s?d?d +?l?l?s?d?d?d?d?s +?s?d?d?s?s?d?d +?s?s?d?d?d?s?d +?d?d?s?d?s?d?s +?d?d?s?s?d?d?s +?s?d?d?d?d?s?d?d +?d?d?s?d?d?d?d?s +?d?d?d?d?d?s?s?d +?l?l?l?l?d?u?l +?u?u?u?u?u?u?u?u?d +?s?l?l?l?l?d?d?s +?d?d?l?l?l?l?d?d?d +?u?u?d?d?d?s?s +?d?d?d?l?s?s?l +?d?l?d?l?d?s?s +?u?s?u?s?d?d?d?d +?s?u?u?d?d?d?s +?s?d?l?d?l?d?s +?s?u?u?s?d?d?d +?l?s?d?l?s?d?d +?s?u?s?u?d?d?d +?s?s?s?s?s?s?s +?u?l?l?l?l?d?l?l +?u?u?u?u?d?d?d?u +?d?d?d?d?d?d?u?d?d +?u?u?u?u?s?s?s +?d?s?u?u?u?u?u +?s?d?d?d?d?l?l?l +?d?d?s?l?l?l?d?d +?u?l?l?l?l?l?d?s +?u?u?u?u?d?d?d?s +?d?l?s?l?l?l?d +?s?d?l?d?l?l?l +?u?u?l?l?s?d?d +?l?l?l?d?l?s?d +?l?l?l?s?s?d?d?d +?d?u?u?u?u?d?d?d +?d?s?d?s?d?s?d?s +?u?d?u?s?s?u +?d?s?u?u?u?s +?s?u?d?u?l?s +?l?l?s?u?s?d +?u?s?l?s?l?d +?l?s?l?u?d?s +?u?d?u?l?s?s +?l?u?l?d?s?s +?u?l?s?l?s?d +?s?u?d?u?u?s +?u?s?u?u?d?s +?d?s?s?u?u?u +?s?s?d?u?l?u +?s?d?l?l?s?l +?u?s?u?d?s?u +?s?u?l?d?s?l +?l?s?s?d?l?l +?s?l?d?l?u?s +?s?l?l?s?d?l +?u?s?s?l?d?l +?u?s?l?d?s?l +?u?s?u?d?u?s +?l?d?l?s?s?u +?l?l?d?u?s?s +?u?s?s?l?l?d +?d?s?l?s?l?l +?u?d?l?s?l?s +?s?s?l?l?u?d +?l?u?s?d?l?s +?l?s?u?s?l?d +?u?l?l?s?s?d +?u?l?s?l?d?s +?s?u?s?u?d?u +?u?l?d?l?s?s +?l?u?s?d?u?s +?l?u?l?s?s?d +?s?l?u?d?l?s +?u?u?s?s?u?d +?l?l?u?s?d?s +?d?s?l?l?s?l +?d?u?s?u?s?u +?u?s?l?l?s?d +?s?d?u?u?u?s +?s?s?u?u?l?d +?u?s?s?u?d?l +?s?d?u?l?s?l +?s?l?l?d?s?l +?s?u?u?u?s?d +?l?s?u?u?d?s +?s?u?l?u?d?s +?s?s?u?u?u?d +?s?u?u?l?d?s +?l?d?s?l?s?u +?s?u?d?l?s?u +?u?d?s?l?s?u +?u?l?u?d?s?s +?u?s?u?u?s?d +?u?l?u?s?s?d +?s?l?l?l?d?l?s +?u?l?s?d?l?s +?d?l?l?l?u?u?u +?u?l?l?u?u?u?d +?u?l?l?l?s?s?s +?l?s?d?d?d?l?l +?l?l?u?d?d?d?s +?d?l?d?s?l?d?l +?u?l?d?d?s?l?d +?l?d?d?s?l?d?l +?l?s?d?d?l?l?d +?l?u?l?d?d?d?s +?d?d?l?d?l?l?s +?u?d?u?s?d?u?d +?d?u?d?u?d?u?s +?d?l?l?l?d?s?d +?d?l?s?l?d?l?d +?u?d?s?l?l?d?d +?u?l?d?s?d?d?l +?l?d?s?d?l?d?l +?d?s?l?l?d?d?l +?d?d?d?d?u?l?l?s +?u?l?d?d?l?d?s +?u?d?d?s?d?u?u +?u?d?l?l?s?d?d +?u?l?l?d?d?s?d?d +?l?d?d?l?d?s?l +?u?d?d?d?u?u?d?d +?u?u?d?d?d?d?u?d +?u?d?d?u?u?d?d?d +?u?d?d?l?d?l?d?d +?u?l?d?d?d?d?d?l +?s?s?s?d?s?s +?s?s?d?s?s?s +?l?u?l?l?s?u +?l?s?l?u?l?l +?u?u?s?u?l?u +?s?l?u?u?l?l +?u?u?l?s?l?l +?u?u?u?u?l?s +?l?l?u?l?u?s +?s?u?l?l?l?l?d +?u?l?u?u?l?s +?s?l?l?l?u?l +?u?l?s?l?l?l?d +?l?s?l?l?u?u +?u?s?l?u?l?l +?l?s?l?u?u?u +?u?u?l?l?s?l +?s?u?u?u?u?l +?l?l?u?u?l?s +?u?l?s?l?l?u +?u?l?s?l?u?u +?l?l?s?l?u?l +?u?u?l?l?l?l?s +?u?u?u?s?u?l +?s?l?u?u?u?u +?l?l?u?u?s?l +?l?s?u?u?l?l +?s?u?l?u?l?u +?d?d?d?d?d?d?s?s?s +?s?l?l?l?d?d?d?s +?s?d?s?d?s?d?s +?s?s?s?s?d?d?d?d +?s?s?s?d?d?d?s +?u?d?l?u?l?d?l +?u?d?l?l?d?u?l +?u?l?u?d?d?l?u +?u?l?l?d?d?d?l?l +?u?d?l?d?l?l?u +?d?u?l?l?d?l?l +?u?l?l?u?l?d?d?d +?l?l?l?l?d?u?d +?u?l?d?l?l?d?u +?d?d?l?u?u?l?l +?u?d?l?d?u?l?l +?u?u?l?u?l?d?d +?l?d?d?u?u?u?u +?u?l?u?l?d?d?u +?u?l?u?l?d?l?d +?l?l?u?l?u?d?d +?u?u?u?u?d?l?d +?u?l?l?u?l?l?l?d +?u?d?l?d?l?l?d?d +?d?d?u?u?l?l?d?d +?d?d?d?d?l?l?l?l?d +?d?d?d?u?d?d?d?d?d +?u?u?u?u?u?u?u?s +?u?u?u?u?u?u?u?u?u +?u?l?l?l?u?l?d?d +?u?u?u?u?l?l?d?d +?l?l?d?l?l?d?d?d?d +?d?d?d?d?d?d?d?d?d?d?l +?d?d?l?l?s?s?s +?s?s?s?l?l?d?d +?u?s?l?d?d?d?d?d +?d?d?d?d?d?u?l?s +?u?l?l?l?l?l?d?l +?d?d?d?d?d?d?d?l?u +?u?l?l?l?d?l?d?d +?l?d?l?l?l?d?d?d?d +?l?l?l?d?l?l?u +?u?l?u?u?l?u?d +?u?l?l?d?l?l?u +?u?l?l?u?d?l?l +?l?d?u?l?l?l?l +?u?u?u?u?d?l?l +?d?u?u?u?u?u?s +?d?s?u?l?l?l?l +?s?d?d?d?l?l?l?l +?d?d?d?d?s?u?l?l +?u?u?u?d?d?s?d?d +?l?s?l?l?s?l?d +?s?s?l?l?l?l?d +?u?l?l?d?l?l?d?d +?l?s?d?d?d?d?s?l +?u?s?l?s?s?l +?u?s?u?s?s?u +?u?s?l?l?s?s +?s?s?u?u?u?s +?u?s?u?s?l?s +?u?l?l?l?d?d?d?l +?u?u?u?l?l?l?l?d +?d?d?s?l?s?l?l +?s?l?l?d?d?l?s +?d?l?l?l?d?s?s +?d?s?d?d?d?d?d?l +?s?d?d?l?d?d?d?d +?d?l?s?d?d?d?d?d +?d?d?d?d?l?d?d?s +?l?l?l?d?s?d?d?d +?l?l?s?d?l?l?d +?d?l?d?s?l?l?l +?l?d?s?l?l?l?d +?l?l?l?d?s?l?d +?u?d?d?l?l?l?s +?l?l?l?u?s?d?d +?l?d?s?d?l?l?l +?s?l?l?l?d?d?l +?d?s?l?l?l?l?d +?u?l?d?d?d?d?d?d?d?d +?u?u?u?d?d?d?l?l +?u?l?d?l?l?l?d?d +?u?d?u?u?u?d?d?d +?d?d?u?l?l?u?d?d +?u?d?u?d?l?d?l?d +?d?u?l?l?l?d?d?d +?u?u?u?d?u?d?d?d +?u?d?u?u?d?u?d?d +?s?s?d?d?d?d?d?d?d +?d?d?d?d?d?s?d?s +?u?d?s?d?d?s?d?d +?u?s?d?l?l?l?l +?u?u?u?u?u?d?d?u +?l?d?d?d?l?d?d?d?l +?d?d?d?d?d?u?u?l +?u?u?d?l?d?d?d?d +?u?d?d?l?l?d?d?d +?l?d?d?d?d?d?u?u +?d?d?d?s?d?d?d?d?d?d +?l?s?l?s?l?d?d?d +?d?l?l?l?u?l?l +?u?l?u?l?l?u?d +?d?u?u?u?l?l?l +?u?u?u?u?u?d?l +?l?l?d?u?u?u?u +?u?u?l?l?l?u?d +?d?u?l?u?l?l?l +?l?d?l?d?s?s?s +?s?l?l?l?l?s?d?d +?l?l?d?d?d?d?l?l?l +?u?l?u?l?l?l?s +?s?l?l?l?l?s?s +?u?u?u?d?u?u?u?d +?d?u?d?d?u?s?d +?s?d?d?l?d?d?l +?s?u?d?d?d?d?u +?d?d?u?d?d?u?s +?d?d?d?d?l?u?s +?l?d?d?l?d?s?d +?s?d?u?l?d?d?d +?d?d?u?l?d?d?s +?l?d?d?s?d?l?d +?d?l?d?l?d?d?s +?u?d?s?l?d?d?d +?l?d?u?d?d?s?d +?u?d?d?s?l?d?d +?d?d?l?l?d?s?d +?d?l?l?d?d?s?d +?d?l?l?s?d?d?d?d +?u?d?d?s?d?d?l +?l?u?d?s?d?d?d +?d?d?d?u?u?d?s +?d?d?s?l?d?d?l +?d?d?d?u?u?s?d +?s?l?u?d?d?d?d +?d?s?l?l?d?d?d +?d?d?u?s?d?d?u +?d?d?s?u?u?d?d +?d?u?d?s?d?u?d +?d?d?d?s?d?u?l +?d?d?d?s?l?u?d +?u?d?d?d?s?u?d +?d?d?d?l?l?d?d?s +?s?d?d?l?d?l?d +?u?s?d?d?d?d?u +?d?d?s?d?d?u?l +?d?l?d?d?l?s?d +?u?d?u?d?d?d?s +?d?d?s?d?l?l?d +?u?d?l?s?d?d?d +?d?d?d?l?s?d?l +?l?d?s?d?d?l?d +?s?d?d?d?l?d?l +?d?l?d?d?s?l?d +?l?s?d?d?u?d?d +?d?d?s?l?d?l?d +?s?d?d?u?d?d?u +?u?d?d?u?d?s?d +?d?d?s?d?l?d?l +?d?s?d?l?d?l?d +?d?d?d?d?l?s?u +?u?d?s?d?d?l?d +?d?d?d?d?u?s?l +?u?d?s?d?u?d?d +?d?s?d?d?l?d?l +?d?d?d?s?u?d?u +?s?l?d?d?u?d?d +?d?d?u?u?d?s?d +?s?d?d?d?d?l?u +?d?u?d?s?d?l?d +?l?d?d?s?u?d?d +?d?d?d?u?s?u?d +?d?u?s?d?d?d?u +?s?u?d?d?l?d?d +?d?u?u?d?s?d?d +?u?d?l?d?s?d?d +?s?u?d?l?d?d?d +?s?s?s?d?d?d?d?d +?d?d?d?u?u?d?d?d?d +?d?d?l?d?d?u?d?d +?u?s?u?s?u?s?d +?u?l?l?l?l?l?u?d +?l?l?l?d?l?s?s +?l?l?l?l?s?u?s +?l?l?s?l?l?s?l +?u?u?l?l?l?l?l?d +?u?d?l?u?u?d?d +?l?d?u?l?d?l?d +?u?d?u?l?d?d?l +?u?d?l?d?d?l?u +?d?u?d?u?l?u?d +?d?u?l?d?l?u?d +?d?u?u?d?d?u?u +?l?d?u?u?d?u?d +?u?d?d?u?u?l?d +?l?d?l?u?u?d?d +?l?l?u?d?u?d?d +?d?u?u?u?d?d?u +?l?d?d?d?u?l?u +?u?d?u?d?l?d?u +?l?l?d?l?d?d?u +?l?u?d?d?u?u?d +?d?u?l?d?d?u?u +?u?d?d?l?d?u?l +?u?l?d?u?d?d?l +?u?l?d?l?l?d?d?d +?l?d?l?d?l?u?d +?l?u?d?d?l?d?l +?u?u?d?l?d?l?d +?u?u?l?d?u?d?d +?u?d?d?d?l?u?u +?l?u?d?d?u?l?d +?l?d?l?d?u?d?u +?l?d?l?l?d?u?d +?d?l?d?u?u?d?l +?d?u?u?d?l?l?d +?d?d?u?l?d?u?l +?u?u?d?d?u?l?d +?u?l?d?l?d?d?u +?u?d?u?d?d?l?l +?u?d?l?d?u?d?u +?d?u?u?l?l?d?d +?u?d?l?d?l?u?d +?l?d?l?d?d?u?l +?u?u?d?u?l?d?d +?l?d?d?l?l?d?u +?d?l?u?u?l?d?d +?d?u?d?l?d?l?u +?l?l?d?d?u?d?l +?d?d?l?l?l?d?u +?u?l?d?l?d?u?d +?l?u?d?d?d?u?u +?u?u?l?d?d?l?d +?u?d?l?d?d?u?u +?u?d?l?d?d?u?l +?d?l?l?d?d?u?l +?d?u?l?d?l?l?d +?d?l?u?d?l?d?l +?l?u?d?l?d?d?l +?l?d?l?u?d?l?d +?u?l?l?d?l?d?d?d +?l?u?d?l?d?l?d +?d?d?l?u?d?l?u +?d?l?l?d?d?l?u +?l?d?u?u?l?d?d +?d?d?d?u?l?u?u +?l?d?d?l?u?l?d +?u?d?d?d?u?u?l +?l?l?d?d?d?u?l +?d?u?l?d?l?d?u +?d?l?u?d?l?l?d +?d?l?u?l?d?l?d +?d?u?l?u?d?d?u +?d?l?d?l?l?d?u +?u?l?d?d?d?d?l?u +?l?d?d?d?u?l?l +?l?u?d?d?l?d?u +?u?l?d?u?d?l?d +?l?d?u?u?u?d?d +?l?l?d?u?l?d?d +?u?d?d?l?d?l?u +?d?d?u?u?u?d?u +?d?l?l?u?d?d?l +?d?d?u?u?d?l?l +?u?u?u?d?d?l?d +?d?u?u?u?l?d?d +?d?d?u?l?d?l?l +?u?u?u?u?d?d?u?u +?l?l?u?l?l?l?d?d +?u?u?u?u?u?u?d?u +?u?l?l?l?l?l?l?u +?u?u?s?u?u?u?d +?u?l?l?d?l?l?s +?u?l?d?l?l?l?s +?u?s?u?d?u?u?u +?u?s?l?l?d?l?l +?u?l?l?l?u?s?d +?u?l?l?s?l?l?d +?u?s?u?l?l?l?d +?u?l?l?l?u?l?l?d +?u?l?l?l?l?u?l?l +?u?d?d?d?s?s?s +?l?l?l?l?l?d?d?d?s +?l?l?l?u?u?u?d?d +?d?s?d?d?s?d?d?u +?l?d?d?l?l?d?d?d?d +?l?d?l?u?l?d?l +?u?u?u?l?d?d?l +?d?l?l?l?u?l?d +?d?l?l?d?u?u?u +?u?l?d?u?l?d?l +?l?l?l?d?d?d?u?u +?u?u?u?u?u?d?d?s +?u?u?u?u?d?u?d?d +?u?u?d?d?d?u?u?u +?u?d?d?l?u?l?l +?u?l?d?u?l?l?d +?d?d?u?l?u?u?l +?u?l?u?u?l?l?d +?l?l?l?u?d?d?l +?u?u?l?d?l?l?l +?u?l?l?l?u?d?l +?d?u?l?l?u?l?d +?l?d?l?l?d?u?l +?u?d?l?l?u?l?d +?l?l?l?u?d?l?d +?u?u?d?d?u?l?l +?u?l?d?d?u?u?l +?u?l?d?l?u?d?l +?u?d?l?l?l?l?u +?l?d?u?d?u?u?u +?d?l?u?l?u?l?d +?d?l?u?l?l?l?l +?u?l?l?u?d?d?u +?l?u?d?l?l?u?d +?d?d?l?u?l?u?l +?u?l?l?l?d?l?u +?u?l?u?d?u?l?u +?l?l?u?l?d?l?d +?u?l?l?d?u?d?l +?l?d?l?d?l?l?u +?l?d?l?l?d?l?u +?u?l?u?d?d?l?l +?u?u?l?l?d?d?u +?u?d?u?l?u?d?l +?u?l?u?d?d?u?u +?l?l?d?d?l?s?s +?u?s?u?u?s?d?d +?u?l?l?l?l?l?l?l?d +?u?d?d?u?u?u?d?d +?d?d?d?u?u?u?d?d?d +?u?d?d?l?l?l?l?l +?s?u?l?l?d?d?d?d +?l?l?l?u?u?d?d?d +?u?u?s?l?l?l?l +?s?u?u?s?d?s +?u?u?d?s?s?s +?s?d?l?s?s?l +?u?s?s?s?d?u +?u?l?d?s?s?s +?u?s?l?s?s?d +?s?l?s?s?l?d +?s?s?l?l?d?s +?s?l?s?l?s?d?d +?s?l?s?s?d?l +?s?l?d?u?s?s +?d?s?l?s?l?s +?u?d?u?s?s?s +?d?s?l?l?s?s +?u?l?s?s?s?d +?s?l?s?d?l?s +?l?u?s?s?d?s +?s?d?s?l?l?s +?l?d?s?s?s?l +?u?d?s?s?u?s +?d?s?l?u?s?s +?u?s?s?u?s?d +?u?s?d?u?s?s +?s?d?l?s?u?s +?s?s?s?l?d?l +?s?d?u?l?s?s +?s?l?s?l?s?d +?s?u?s?u?s?d +?d?s?s?l?s?l +?s?l?l?s?s?d +?s?u?u?d?s?s +?u?u?s?s?s?d +?u?d?l?s?s?s +?l?l?s?s?s?d +?d?l?l?l?l?l?l?s +?s?s?s?s?s?d?d +?u?l?u?l?u?s?d +?u?l?l?l?s?l?d +?u?s?d?d?d?d?d?d?d +?u?u?d?d?u?u?u?u +?s?l?d?d?l?d?s +?d?d?l?l?s?s?d +?l?l?d?s?d?d?s +?l?d?l?d?d?s?s +?l?d?l?s?s?d?d +?l?s?d?d?l?s?d +?s?l?d?l?d?d?s +?d?d?s?d?s?l?l +?d?l?l?s?s?d?d +?l?l?d?s?d?s?d +?d?s?l?l?s?d?d +?l?l?d?d?s?d?s +?l?d?l?d?s?s?d +?d?d?l?s?d?l?s +?u?u?s?d?d?d?s +?u?u?d?d?d?d?s?s +?l?l?l?l?l?l?d?d?s +?s?d?d?l?l?l?l?l +?l?l?l?l?d?d?d?d?l +?d?d?d?d?s?d?l?l +?l?d?d?d?d?d?l?s +?l?l?d?d?l?l?l?d?d +?l?l?l?l?s?d?d?s +?l?d?l?l?l?s?s +?l?l?s?s?l?u +?s?s?l?l?l?u +?u?l?s?l?s?u +?s?l?l?u?s?l +?u?l?s?s?l?u +?u?u?s?l?s?l +?u?s?s?l?l?u +?s?u?l?u?s?l +?l?u?l?s?s?l +?u?u?s?s?l?l +?s?l?l?l?s?u +?l?s?u?l?s?u +?u?l?l?s?s?u +?u?l?u?s?l?s +?s?s?u?u?l?l +?u?l?s?l?u?s +?u?l?s?s?u?l +?u?l?d?d?l?l?l?l +?u?u?u?u?u?d?u?d +?u?u?l?l?l?u?u +?u?u?d?d?l?d?d?d +?d?u?u?d?d?u?d?d +?d?u?d?u?d?u?d?d +?l?d?u?d?d?l?d?d +?l?l?u?l?s?d?d +?s?l?d?l?d?l?l +?d?l?l?l?s?l?d +?d?l?s?l?d?l?l +?l?l?l?s?u?d?d +?u?l?l?s?u?d?d +?l?d?l?s?d?l?l +?s?l?d?l?l?l?d +?u?s?l?d?l?l?d +?s?l?l?l?d?l?d +?u?u?u?u?d?d?d?d?d?d +?d?d?d?d?u?u?u?s +?l?l?l?l?u?u?d?d +?d?d?d?d?u?l?l?u +?s?s?s?u?s?s +?u?s?l?l?l?l?d?d +?u?l?l?l?u?l?s +?s?d?d?d?d?d?s?l +?u?l?l?u?u?l?d +?l?l?u?l?l?d?l +?u?d?d?d?l?l?l?l +?s?s?d?l?l?l?l +?d?d?d?d?u?l?l?l?l +?d?d?d?d?s?s?l?l +?d?d?d?d?d?u?u?u?u +?d?d?s?d?d?s?d?d?s +?l?l?l?d?d?l?l?d?d +?l?d?l?l?d?d?d?d?d +?d?d?d?d?l?l?l?l?l?l +?l?l?l?d?d?d?d?d?d?d?d +?u?s?s?s?u?s +?u?l?s?s?s?s +?s?u?s?s?u?s +?s?s?u?s?s?u +?u?l?l?u?u?l?l +?u?l?u?l?l?u?l +?u?l?l?u?l?l?l?l +?d?d?d?d?d?d?d?s?u +?l?u?u?u?u?u?s +?l?l?l?u?l?l?d?d +?u?u?d?u?u?d?d?d +?l?d?d?s?d?d?s?d?d +?l?s?l?s?s?d?d +?l?s?l?s?d?d?s +?d?s?l?s?l?s?d +?d?d?d?d?d?l?l?l?d +?l?l?l?l?l?l?u?d +?s?l?l?l?l?l?l?d +?d?d?d?s?d?d?s?d +?d?s?d?d?d?d?s?d +?s?d?d?d?d?d?s?d +?u?u?u?u?u?d?u?u +?s?l?s?l?l?d?d +?u?s?l?l?s?d?d +?l?s?d?d?s?l?l +?l?l?l?d?s?s?d +?l?l?s?s?d?d?l +?s?d?l?l?d?l?s +?s?l?s?l?l?l?l +?d?l?l?l?l?l?l?l?d +?l?u?l?s?d?d?d?d +?u?l?d?d?d?l?l?l +?d?d?s?d?s?d?d?s +?d?s?l?l?l?l?s +?u?l?u?l?l?l?u +?s?l?d?l?d?d?d?d +?d?d?d?d?l?l?s?d +?d?d?d?s?d?d?l?l +?u?u?u?s?u?u?d +?u?s?u?d?l?l?l +?u?u?s?d?u?u?u +?l?d?l?d?l?d?l?d?d +?l?u?u?l?u?u?d +?u?u?l?l?d?l?l +?u?l?l?l?d?u?u +?d?l?u?u?u?u?u +?l?u?l?d?l?l?l +?l?u?u?l?l?l?d +?u?l?u?l?u?u?d +?u?u?l?l?l?d?l +?d?d?d?l?l?l?s?s +?d?d?l?s?s?d?d +?u?d?s?d?d?d?s +?s?s?u?d?d?d?d +?d?s?s?l?d?d?d +?u?d?s?d?d?s?d +?s?d?s?d?d?l?d +?d?l?d?d?d?s?s +?s?u?d?d?d?d?s +?u?d?d?s?d?s?d +?d?d?d?s?l?d?s +?d?l?s?d?d?s?d +?s?d?d?d?s?d?l +?d?d?s?s?d?l?d +?u?d?d?s?s?d?d +?d?d?u?s?s?d?d +?d?d?d?s?s?d?l +?d?s?s?d?d?d?l +?s?d?d?d?l?d?s +?d?s?d?d?d?s?l +?s?d?d?d?d?s?u +?s?d?d?u?s?d?d +?d?d?l?s?d?s?d +?d?d?s?d?s?d?u +?s?d?d?u?d?d?s +?u?s?d?s?d?d?d +?s?s?d?d?d?d?u +?d?d?d?l?s?d?s +?s?d?s?d?d?d?l +?l?d?s?d?d?d?s +?d?d?d?d?s?s?u +?l?s?d?d?d?s?d +?s?l?d?d?s?d?d +?d?s?d?s?u?d?d +?d?d?s?d?l?d?s +?d?s?l?s?d?d?d +?u?l?l?l?l?d?l?d +?u?l?l?d?u?l?l?d +?u?d?l?l?d?d?l?d +?d?d?d?d?l?u?l?l +?d?d?u?u?d?d?l?l +?d?d?d?d?d?d?d?d?l?d +?d?d?d?d?s?d?d?u +?d?d?d?s?d?d?l?d +?d?d?d?s?l?d?d?d +?d?d?d?s?d?l?d?d +?l?u?l?d?d?d?d?d?d +?u?d?l?l?l?l?l?d +?d?d?d?d?d?d?d?d?s?l +?l?l?l?l?d?d?l?l?l +?l?u?l?l?l?d?d?d +?d?l?d?l?s?l?d +?d?u?l?l?s?d?d +?d?d?u?u?u?s?d +?d?l?d?s?d?l?l +?u?u?d?s?u?d?d +?l?u?l?d?s?d?d +?u?l?d?d?d?s?l +?u?d?d?l?l?d?s +?u?u?d?d?s?d?u +?l?l?d?d?s?l?d +?d?l?s?l?l?d?d +?d?d?d?u?u?s?u +?u?s?d?d?d?l?l +?l?s?l?u?d?d?d +?u?l?u?d?d?d?d?s +?u?d?u?d?u?s?d +?d?l?s?d?d?l?l +?s?d?l?d?l?l?d +?l?d?s?l?d?d?l +?d?l?d?l?d?s?l +?s?d?d?l?l?d?l +?u?u?s?d?d?u?d +?d?l?l?d?s?l?d +?d?l?d?d?l?s?l +?s?l?l?d?d?l?d +?u?l?d?s?l?d?d +?d?d?l?l?s?l?d +?s?u?u?d?u?d?d +?s?l?l?d?d?d?l +?d?d?s?l?l?d?l +?l?d?d?l?s?d?l +?l?d?s?d?l?l?d +?d?d?l?s?l?l?d +?u?u?s?d?d?d?u +?s?l?l?l?s?d?d?d +?s?d?u?u?u?d?d +?u?s?u?d?u?d?d +?l?d?s?d?d?u?u +?d?l?l?d?s?d?l +?u?u?l?s?d?d?d +?u?l?s?u?d?d?d +?l?l?l?d?d?l?l?l?l +?d?d?d?d?d?d?l?d?d?d +?d?d?u?d?u?u?d?d +?u?d?d?d?d?u?u?d +?d?u?d?u?u?d?d?d +?u?l?d?d?l?d?d?d +?d?d?d?d?u?d?l?l +?u?d?u?d?d?d?d?d?d +?l?d?d?d?d?d?l?d?d +?d?s?l?l?l?l?l?l +?u?d?u?l?l?d?l +?u?l?d?l?u?l?d +?l?l?u?d?l?l?d +?u?l?d?d?l?u?l +?u?d?l?u?l?d?u +?u?u?l?d?l?d?l +?u?u?u?l?d?l?d +?d?l?d?l?u?l?l +?u?l?l?l?d?u?d +?d?l?l?l?d?u?u +?d?d?u?l?l?u?u +?u?d?l?u?l?l?d +?l?d?l?d?l?u?u +?l?l?l?d?l?d?u +?d?d?l?l?l?u?l +?l?u?u?u?d?u?d +?l?d?l?l?u?l?d +?d?u?u?d?l?l?l +?d?u?u?l?l?l?d +?u?l?l?u?d?u?d +?u?l?d?d?u?u?u +?u?l?u?d?l?d?l +?d?d?l?l?u?l?u +?u?l?u?d?u?d?u +?d?u?u?u?l?l?d +?d?d?l?l?u?u?l +?d?l?d?l?l?u?u +?u?u?l?d?d?l?l +?d?u?l?d?l?l?l +?u?l?l?u?d?d?l +?l?d?l?u?d?l?l +?l?d?l?u?d?l?u +?d?u?l?u?l?l?d +?l?l?l?d?u?d?l +?u?u?d?l?l?d?l +?u?d?l?l?l?u?d +?u?d?u?l?l?l?d +?l?l?d?d?l?u?u +?u?u?u?d?l?d?l +?l?u?l?l?d?d?l +?d?d?d?d?s?l?l?l?l +?l?u?l?l?u?l?l +?l?l?l?s?d?d?d?s +?l?u?l?l?l?l?d?d +?u?u?s?d?d?u?u +?u?s?l?l?l?d?d?d +?u?l?u?l?u?d?s +?u?d?l?d?l?l?s +?u?u?u?l?l?s?d +?u?l?s?d?d?l?l +?l?l?l?d?s?d?l +?s?d?l?l?d?l?l +?u?u?l?l?l?s?d +?l?l?d?l?s?l?d +?s?l?l?d?l?l?d +?u?d?u?u?d?u?s +?s?d?d?u?l?l?l +?l?d?s?l?l?d?l +?l?s?d?l?d?l?l +?l?l?l?d?u?l?l?l +?d?s?d?d?d?s?d?d?d +?l?l?l?d?l?d?d?d?d +?l?l?l?l?l?d?d?u +?l?s?l?s?l?s?d?d +?l?l?s?s?d?d?s +?d?u?d?l?d?u?d?l +?l?l?u?l?l?d?d?d +?l?s?d?l?l?l?l?l +?d?d?d?d?l?s?l?l +?d?d?d?d?l?d?d?d?l +?d?s?s?l?s?s +?l?s?s?s?d?s +?s?s?d?l?s?s +?s?s?s?l?s?d +?s?s?l?s?s?d +?s?s?s?d?l?s +?d?s?l?s?s?s +?s?s?l?d?s?s +?s?s?d?s?s?l +?s?s?s?l?d?s +?s?d?u?s?s?s +?u?d?s?s?s?s +?s?s?u?d?s?s +?u?l?l?l?u?d?u +?l?u?u?u?u?l?d +?u?u?u?l?l?l?s +?u?u?u?l?l?d?l +?d?u?l?l?l?u?l +?u?l?l?u?l?u?d +?u?l?u?s?u?l?u +?l?l?u?l?l?u?d +?l?u?l?u?l?l?d +?d?d?d?d?d?d?l?s?l +?l?s?l?d?l?l?s +?l?s?l?s?l?d?l +?d?d?s?d?d?s?d?d?d +?d?d?d?d?d?d?d?s?d?d +?d?d?d?l?s?s?s +?d?d?d?s?s?u?s +?u?l?d?l?l?l?l?l +?u?u?u?u?l?d?d?d +?l?d?d?d?d?d?s?s +?d?d?d?d?d?d?d?d?s?s +?s?s?s?u?l?l +?s?s?s?u?l?u +?u?l?s?l?s?s +?s?s?u?l?l?s +?s?l?u?l?s?s +?u?u?s?u?s?s +?u?s?s?s?u?u +?s?u?l?l?s?s +?s?u?u?s?s?u +?l?s?u?s?l?s +?l?u?l?s?s?s +?u?s?l?s?u?s +?u?u?s?s?u?s +?s?s?l?s?l?l +?l?l?l?l?l?d?l?l?l +?d?d?l?l?l?l?d?d?d?d +?l?u?s?d?d?d?d?d +?d?d?d?s?l?l?d?d +?l?d?d?d?l?d?d?s +?l?d?l?d?d?d?d?s +?u?l?u?s?d?d?s +?l?d?s?l?s?l?d +?d?l?l?d?l?s?s +?s?l?l?s?l?d?d +?l?l?d?d?s?s?l +?s?u?u?u?s?d?d +?u?l?u?d?d?s?s +?s?s?l?d?l?d?l +?d?d?l?l?s?s?l +?l?d?d?l?l?s?s +?l?s?l?l?d?d?s +?l?s?d?d?l?s?d?d +?u?l?u?u?l?l?l +?l?l?l?l?l?l?l?u +?l?d?l?d?l?d?d?s +?d?d?d?s?d?l?l?l +?s?d?d?d?d?d?d?d?d?s +?s?l?l?l?s?l?l +?u?d?u?u?u?u?u?u +?l?l?l?d?d?d?d?d?s +?d?d?u?d?d?d?d?d?d +?d?d?d?d?d?d?d?u?d +?u?l?d?l?d?l?d?d +?u?d?d?u?u?d?d?u +?d?d?l?l?u?u?d?d +?d?s?d?s?d?s?d?d +?d?s?d?d?s?d?d?s +?u?s?d?u?u?u?u +?u?l?l?s?d?l?l +?u?s?l?l?l?d?l +?l?l?l?s?u?u?u +?d?l?l?l?d?d?d?d?d +?l?s?s?l?l?l?d +?d?l?l?l?l?l?l?d?d +?l?l?l?l?d?d?s?d?d +?l?l?d?s?d?s?d?d +?l?l?d?d?d?d?d?d?d?d?d +?u?l?u?l?u?l?u?l +?d?d?d?d?d?l?d?u +?d?u?d?d?d?l?d?d +?d?d?d?u?d?d?u?d +?u?d?d?d?d?d?l?d +?l?u?d?d?d?d?d?d?d +?d?d?u?d?d?d?u?d +?l?d?u?d?d?d?d?d +?d?d?d?l?d?u?d?d +?d?u?d?l?d?d?d?d +?d?d?d?d?d?u?d?l +?d?d?d?d?u?d?l?d +?d?d?u?d?d?d?d?u +?d?d?d?d?l?d?d?u +?d?d?l?u?d?d?d?d +?l?l?l?l?l?l?l?l?l?l +?u?u?d?d?d?l?l?l +?d?d?d?d?d?d?s?d?d?d +?u?u?d?u?u?u?u?u +?l?l?d?d?d?d?l?s +?l?d?d?s?s?s?s +?d?d?d?s?u?u?u?u +?s?d?d?d?d?d?d?d?l +?u?d?d?d?d?d?d?d?s +?u?u?u?l?l?u?d +?l?u?l?l?l?d?l +?l?l?l?d?l?u?u +?u?l?u?d?l?u?l +?u?l?u?l?d?u?u +?u?l?d?l?l?l?u +?l?l?l?l?u?d?l +?l?l?l?u?l?d?l +?d?u?l?u?l?u?l +?l?l?d?l?l?u?u +?l?l?l?l?l?s?s?s +?l?l?s?l?l?l?l?d +?d?d?d?d?d?d?d?d?d?d?d?d?d +?l?u?u?u?u?u?u?d +?d?s?d?s?l?s?l +?l?d?d?l?s?s?s +?l?s?l?s?d?s?d +?l?l?s?d?d?s?s +?u?u?d?d?s?s?s +?l?l?l?s?d?s?d?d +?s?d?s?d?s?d?s?d +?l?l?l?u?u?l?l +?l?u?l?l?l?u?l +?u?u?u?d?d?d?d?d?d?d +?l?l?l?l?s?l?l?d +?d?s?d?d?l?l?l?l +?d?d?d?d?l?u?u?u +?d?d?u?u?d?d?d?u +?d?d?d?l?u?l?d?d +?d?d?u?d?u?d?d?u +?u?d?u?d?u?d?d?u +?d?d?u?l?d?d?u?l +?d?u?d?d?u?d?d?u +?u?d?d?l?d?d?l?d +?l?d?u?d?l?d?u?d +?d?u?d?l?l?d?d?d +?u?d?d?d?l?l?d?d +?d?d?d?u?d?d?u?u +?d?d?u?d?d?u?d?u +?d?d?d?d?u?u?u?l +?u?d?d?d?u?d?d?u +?d?d?d?u?d?u?d?u +?d?d?d?u?l?u?d?d +?u?d?d?l?d?u?d?d +?d?d?d?d?d?d?u?l?u +?d?d?l?l?d?d?u?u +?l?l?d?u?l?l?l?l +?s?l?d?d?d?d?d?s +?l?s?l?d?l?l?l?l +?d?d?d?d?d?d?d?d?d?d?u +?l?l?l?d?d?u?u?u +?l?s?l?l?d?l?s +?u?l?l?l?d?s?s +?l?s?l?s?l?l?d +?d?d?l?d?l?d?d?d?d +?u?l?s?l?l?d?l +?l?l?l?l?s?d?u +?l?l?l?l?u?s?d +?l?s?l?l?l?l?l?d +?l?d?l?d?l?d?l?s +?u?l?l?d?l?l?l?d +?d?d?s?d?s?s?d +?s?d?s?s?d?d?d +?d?s?d?d?s?d?s +?d?s?d?d?s?s?d +?s?u?l?u?l?u?s +?l?u?u?u?d?d?d?u +?u?d?l?l?d?l?l?d +?l?l?u?u?u?d?d?d +?s?d?d?l?l?l?d?d +?d?s?s?d?d?d?d?d +?u?l?l?l?s?d?d?d?d +?u?l?l?l?u?l?u +?u?l?u?u?l?u?l +?u?u?l?l?l?l?u +?d?l?d?l?d?l?d?l?d +?d?l?s?l?s?d?d +?d?d?l?l?d?s?s +?s?u?l?d?d?d?s +?l?d?l?s?d?s?d +?d?d?d?u?l?s?s +?s?s?d?l?d?d?l +?d?s?l?d?s?l?d +?u?d?u?d?d?s?s +?l?s?d?d?l?d?s +?s?d?d?l?l?d?s +?s?l?l?d?d?s?d +?d?d?s?l?l?s?d +?d?s?l?d?d?s?l +?s?s?u?u?d?d?d +?d?s?d?l?l?s?d +?l?s?d?d?d?l?s +?d?d?d?u?u?s?s +?u?u?d?s?s?d?d +?s?s?d?d?d?u?u +?u?u?s?d?d?s?d +?s?s?l?d?l?d?d +?s?l?d?l?s?d?d +?s?d?s?l?l?d?d +?d?d?d?s?u?u?s +?u?u?d?d?s?s?d +?d?u?d?d?d?d?d?d?d +?d?d?d?d?d?u?u?s +?l?d?d?l?d?d?d?s +?l?d?d?d?d?l?d?s +?u?l?d?d?d?d?s?d +?d?d?d?d?s?l?l?d +?d?d?l?l?d?s?d?d +?d?d?d?d?l?l?d?s +?u?l?l?l?l?l?d?d?d?d +?l?l?d?d?l?l?d?d?d +?l?d?d?d?d?d?d?l?d +?u?d?l?s?l?l?d +?u?l?l?u?d?d?s +?l?u?l?u?s?d?d +?d?l?s?d?l?l?l +?l?l?l?s?d?d?u +?u?l?l?s?d?d?l +?d?s?l?l?d?l?l +?s?l?l?d?l?d?l +?u?l?u?u?s?d?d +?l?u?l?u?d?d?s +?u?s?l?l?u?d?d +?s?d?u?u?u?u?d +?u?l?d?l?l?s?d +?l?s?d?l?l?d?l +?u?u?u?d?u?d?s +?u?d?d?u?u?u?s +?u?u?d?d?s?u?u +?d?s?l?l?l?d?l +?u?l?d?d?u?l?s +?u?l?l?d?d?l?s +?d?l?l?l?d?s?l +?d?d?l?l?l?s?u +?d?u?u?s?d?u?u +?d?d?s?u?u?l?l +?u?u?d?s?u?u?d +?s?s?u?l?l?l?l +?s?l?l?s?l?l?l +?u?u?u?d?d?u?d?d +?u?d?l?d?l?d?u?d +?u?l?l?l?d?d?d?d?d?d +?d?d?d?d?l?d?d?d?d?d +?l?l?u?u?u?l?l +?u?l?u?u?u?u?u +?u?u?l?l?u?l?l +?d?l?s?l?s?d?l +?d?d?l?s?l?s?l +?u?l?l?s?d?d?s +?u?l?s?l?s?d?d +?d?d?u?u?u?s?s +?u?s?l?s?u?d?d +?d?s?u?u?u?s?d +?u?u?u?s?d?s?d +?u?u?u?u?d?s?s +?l?s?d?l?l?l?s +?l?s?l?d?d?l?s +?d?l?s?d?l?l?s +?l?l?l?s?d?s?l +?l?s?l?l?d?s?d +?l?l?l?s?d?l?l?l +?d?d?u?u?u?u?u?d +?l?l?l?l?l?l?l?l?s +?d?d?d?l?l?l?l?d?d?d +?l?l?l?u?l?u?d +?u?u?l?u?u?u?d +?u?d?l?l?u?l?l +?l?l?l?d?l?u?l +?l?d?l?l?l?u?u +?l?l?u?u?d?l?l +?l?l?l?l?u?l?d?d +?l?l?l?u?d?l?l +?u?d?l?u?l?l?l +?l?l?l?l?u?d?u +?u?l?l?l?u?u?d?d +?d?d?d?d?d?d?l?l?d?d +?d?d?s?d?l?l?l?l +?u?l?s?l?d?d?d?d +?l?l?s?d?d?d?d?l +?s?l?d?d?d?d?d?d?d +?s?s?s?s?d?s +?s?d?s?s?s?s +?l?l?s?l?l?s?d?d +?l?u?l?l?s?l +?l?l?u?l?s?l +?u?l?s?u?u?l +?l?u?l?s?l?l +?l?s?u?l?u?l +?l?u?s?l?u?u +?l?l?u?s?u?l +?l?l?u?s?u?u +?u?s?u?u?l?u +?l?u?l?u?s?u +?l?u?l?u?s?l +?l?u?u?l?l?s +?u?s?l?l?u?u +?l?s?u?l?l?u +?l?u?s?u?u?l +?l?u?u?s?u?u +?u?l?l?u?s?l +?l?u?s?l?u?l +?u?l?u?u?u?s +?l?u?s?u?u?u +?u?u?l?u?u?s +?u?u?u?l?s?l +?u?u?l?u?s?u +?u?u?l?l?s?u +?u?s?l?l?u?l +?s?u?l?u?u?u +?u?l?u?s?u?u +?l?l?s?l?u?u +?u?s?l?u?u?l +?u?s?l?u?u?u +?l?u?u?l?s?l +?l?s?l?u?l?u +?s?l?l?l?u?u +?u?l?u?u?s?u +?s?l?u?l?u?l +?s?l?u?u?u?l +?d?d?d?d?d?s?d?d?d?d +?d?d?d?d?s?d?d?d?d?d +?s?l?s?l?s?l?s +?l?l?l?l?l?s?l?d +?d?l?l?l?s?s?s +?l?u?l?l?d?l?d +?u?u?l?l?d?l?d +?l?d?u?l?d?l?u +?d?u?l?d?u?u?l +?u?l?d?u?d?l?u +?l?u?u?u?d?d?u +?l?u?u?u?d?d?l +?u?d?l?l?u?d?u +?u?l?d?l?u?u?d +?u?l?l?d?u?d?u +?l?u?d?l?d?l?u +?d?l?u?u?u?u?d +?u?d?l?l?d?u?u +?d?d?l?u?l?l?l +?u?l?u?l?d?u?d +?u?l?u?u?d?d?l +?d?l?u?l?l?u?d +?u?d?d?u?l?l?u +?l?u?l?u?d?d?l +?u?l?d?l?u?d?u +?u?d?u?l?d?u?l +?d?l?l?l?d?l?u +?d?l?d?l?l?u?l +?l?l?l?d?u?l?d +?u?d?l?u?u?d?l +?u?d?u?u?u?l?d +?d?l?d?u?l?l?l +?l?u?l?l?d?d?u +?l?u?l?d?l?l?d +?u?d?d?l?l?u?u +?u?d?d?l?l?u?l +?l?u?l?d?d?l?u +?l?l?d?l?d?u?u +?l?d?l?l?u?d?l +?u?u?d?d?u?u?l +?l?d?l?d?u?u?u +?l?u?u?l?u?d?d +?d?l?l?l?l?u?d +?u?u?d?d?l?u?u +?l?l?l?d?d?u?l +?d?l?l?d?u?l?l +?d?l?l?d?u?l?u +?l?u?d?u?d?u?u +?l?l?u?u?d?d?l +?u?d?l?d?u?u?u +?u?d?u?l?u?d?u +?l?l?d?d?d?l?l?s +?d?d?d?d?u?u?d?d?d +?s?l?l?s?l?l?s +?u?u?l?l?l?l?l?l +?s?u?u?s?s?s +?s?s?s?u?u?s +?s?u?s?u?s?s +?u?s?s?u?s?s +?u?s?s?s?s?u +?s?l?s?s?s?l +?s?s?s?u?s?u +?s?s?l?s?l?s +?u?u?u?u?l?l?l?l +?s?s?s?d?d?l?l +?s?l?l?s?s?d?d +?s?s?l?l?s?d?d +?s?l?l?d?d?s?s +?u?l?d?d?s?s?s +?s?l?l?s?d?d?s +?u?u?u?u?u?u?d?d?d?d +?l?l?l?s?u?l?l +?s?s?l?l?d?d?d?d +?s?l?d?d?d?d?l?s +?u?d?u?u?u?u?d?d +?u?d?d?d?u?u?u?u +?d?d?d?d?l?l?s?l +?s?u?u?u?d?d?d?d +?l?d?l?l?s?d?d?d +?l?d?l?l?s?l?s +?l?l?s?l?l?d?s +?u?d?u?d?u?u?d?d +?d?d?d?u?l?l?l?d +?u?l?l?d?d?l?d?d +?u?d?d?l?u?d?d?l +?l?l?d?d?d?l?l?d?d +?s?l?l?l?l?s?l +?l?l?l?l?l?l?l?l?l?d +?d?d?d?d?u?u?u?d?d +?u?u?d?d?d?d?d?d?u +?l?d?d?d?l?l?l?s +?l?l?l?d?d?d?d?d?l +?d?d?d?d?d?l?d?d?d?d +?d?d?d?d?d?d?d?l?d?d +?d?d?l?d?d?l?d?d?d +?u?u?u?d?u?u?d?d +?d?d?u?l?l?l?l?d +?d?l?d?d?d?d?d?s +?s?d?d?d?d?l?d?d +?d?d?d?d?u?s?d?d +?d?d?u?d?d?s?d?d +?s?d?l?d?d?d?d?d +?u?d?d?d?d?d?s?d +?u?l?l?l?d?l?l?d +?l?l?l?l?l?l?d?d?l +?d?d?d?d?l?d?d?d?d?l +?l?l?l?s?d?d?d?l +?u?u?u?l?l?l?l?l +?d?s?d?s?d?d?l?l +?s?d?d?d?d?s?l?l +?u?l?d?d?d?d?s?s +?s?s?u?u?u?s?s +?u?d?l?l?l?d?l?l +?u?d?l?l?s?l?l +?l?l?l?l?l?l?l?s?d +?u?d?d?u?d?d?d?u +?d?d?d?d?l?l?u?d +?d?d?d?u?u?d?d?u +?u?u?d?d?d?l?d?d +?d?l?d?d?d?d?u?u +?d?d?d?d?u?l?u?d +?u?d?u?d?l?d?d?d +?d?d?u?d?d?d?u?u +?d?d?d?d?l?u?l?d +?l?d?d?d?l?l?d?d?d +?u?l?d?d?d?u?d?d +?u?d?d?d?l?d?l?d +?u?u?d?u?u?u?d?d +?l?l?l?u?u?l?d +?l?l?u?u?l?l?d?d +?u?l?u?l?u?d?u +?u?l?u?l?d?u?l +?d?u?l?l?l?u?u +?u?l?u?l?d?l?l +?d?l?l?l?l?u?l +?l?d?u?u?l?l?l +?u?l?u?l?l?d?l +?u?l?l?l?s?u?u +?u?u?s?u?l?l?l +?l?l?d?l?s?d?d?d +?l?s?d?l?d?d?d?d +?d?d?s?d?d?d?l?l +?u?d?d?l?d?d?d?s +?d?d?d?l?l?s?d?d +?d?d?d?d?d?u?s?u +?d?d?l?l?s?d?d?d +?u?d?u?s?d?d?d?d +?u?u?d?s?d?d?d?d +?l?d?s?l?d?d?d?d +?u?u?l?l?u?u?u +?l?l?l?l?u?u?l +?l?l?u?l?l?u?l +?d?l?d?d?l?d?d?d?d +?u?l?l?l?s?d?s +?l?l?l?s?s?l?d +?u?l?u?l?u?l?u?d +?l?d?u?d?d?l?l +?u?d?d?d?d?u?l?l +?d?l?u?u?u?d?d +?l?l?d?d?u?u?d +?l?d?d?u?d?u?u +?d?l?d?l?u?d?l +?u?u?d?d?d?l?u +?l?u?d?u?d?d?l +?l?d?d?d?u?u?l +?d?l?d?u?l?u?d +?d?l?d?d?u?l?l +?l?d?u?d?d?l?u +?d?l?u?u?d?d?l +?d?l?l?l?u?d?d +?u?d?u?d?u?u?d?u +?u?d?l?u?d?d?u +?d?u?l?l?u?d?d +?d?u?d?u?d?l?l +?d?l?d?l?u?l?d +?u?l?d?u?u?d?d +?l?d?l?l?d?d?u +?d?d?u?u?u?l?d +?d?l?u?d?u?d?u +?d?d?u?l?u?u?d +?d?u?l?d?u?l?d +?d?u?d?l?l?d?l +?d?l?u?l?l?d?d +?l?l?d?u?u?d?d +?u?d?u?l?d?l?d +?l?d?u?d?l?d?u +?l?d?d?u?l?u?d +?l?d?d?l?l?u?d +?u?l?l?u?u?d?d?d +?u?d?d?l?d?d?l?l +?u?d?l?u?d?u?d +?d?u?d?l?d?u?l +?d?u?d?l?d?u?u +?u?d?u?u?l?d?d +?u?d?d?u?l?u?d +?u?d?d?d?l?u?l +?d?u?l?d?u?d?l +?l?l?u?d?d?u?d +?u?d?u?d?l?u?d +?d?u?l?d?d?l?u +?d?d?l?l?l?u?d +?l?d?u?l?d?d?l +?l?d?u?u?d?d?u +?u?d?l?l?d?u?d +?d?u?d?l?u?d?l +?d?d?u?l?d?u?u +?d?d?u?d?l?l?u +?u?d?d?u?d?u?l +?l?u?d?u?d?d?u +?u?u?d?d?l?d?u +?d?d?l?l?u?d?u +?l?u?l?d?d?u?d +?l?l?d?d?l?d?u +?u?u?d?l?d?d?l +?l?u?d?d?u?d?l +?l?d?d?l?u?u?d +?d?u?l?l?d?l?d +?u?d?u?d?d?u?l +?d?l?d?d?u?u?u +?u?d?u?d?d?l?u +?d?u?u?d?d?l?l +?l?l?d?u?d?u?d +?l?u?d?u?d?u?d +?u?l?d?d?u?u?d +?l?l?u?d?d?d?l +?d?u?u?d?l?d?u +?u?u?l?d?d?u?d +?l?u?d?u?d?l?d +?l?d?d?l?d?u?l +?u?d?u?u?d?d?l +?u?d?l?l?l?d?l?d +?d?u?u?d?l?d?l +?u?d?d?u?l?d?u +?u?u?u?d?d?l?d?d +?d?u?d?d?l?l?l +?d?u?d?d?u?u?u +?l?u?u?d?d?u?d +?d?d?l?u?d?u?l +?d?d?l?l?u?u?d +?d?l?d?d?l?u?l +?d?d?l?l?d?u?u +?d?d?l?d?u?l?l +?d?u?d?l?d?l?d?l +?l?d?d?l?u?d?u +?d?d?l?d?l?u?u +?d?l?d?l?l?u?d +?l?d?u?d?l?l?d +?l?d?d?u?u?u?d +?d?d?l?u?u?d?l +?d?u?d?l?l?u?d +?l?d?d?u?u?d?l +?l?d?d?d?l?u?u +?d?l?u?u?d?d?u +?d?l?u?d?d?l?u +?d?l?u?d?d?l?l +?d?u?l?l?d?d?u +?l?d?l?d?u?l?d +?l?u?l?d?d?l?d +?l?l?d?u?d?d?l +?u?d?u?d?u?l?d +?l?d?l?l?u?d?d +?d?l?l?d?u?d?l +?d?u?d?u?d?u?l +?l?d?l?d?u?u?d +?d?d?l?u?l?u?d +?l?l?d?d?u?l?d +?d?l?d?u?l?d?l +?d?d?u?u?l?u?d +?d?u?l?u?d?l?d +?l?u?u?d?l?d?d +?u?l?u?d?l?d?d +?l?u?u?d?d?d?l +?l?u?u?d?d?d?u +?d?l?d?u?l?d?u +?l?d?u?l?u?d?d +?u?u?l?d?l?d?d +?d?l?l?d?u?l?d +?d?l?u?u?d?u?d +?d?u?d?l?d?l?l +?l?d?d?d?l?u?l +?d?l?d?u?d?l?l +?d?d?u?l?l?d?l +?d?u?d?d?l?u?l +?d?l?u?u?d?l?d +?u?d?l?d?u?u?d +?s?d?d?d?d?l?l?s +?d?d?d?d?d?d?d?d?d?l?l +?l?l?d?l?d?d?d?d?d +?d?l?l?l?l?l?d?d?d +?u?l?u?l?l?l?l?d +?s?s?l?l?l?l?d?d +?l?l?l?l?l?l?d?l?d +?s?s?l?d?d?d?s +?l?s?d?d?d?s?s +?s?u?s?d?d?d?s +?s?d?s?d?s?d?l +?l?d?s?d?d?s?s +?l?d?s?d?s?d?s +?d?d?d?s?s?s?u +?l?l?l?l?d?d?u?u +?l?l?l?l?d?u?l?l +?u?l?l?l?d?s?d?d +?l?s?s?d?d?d?d?d +?d?d?s?d?d?s?l?d +?u?u?u?d?l?l?l?l +?l?u?u?u?u?u?l +?l?l?u?l?l?l?u +?u?d?l?l?d?l?d?l +?d?d?d?l?l?l?l?u +?u?d?l?d?l?l?l?d +?d?s?d?l?l?l?l?l +?l?l?l?l?l?d?d?d?l +?d?s?d?s?u?u?u +?d?l?s?l?s?l?d +?s?d?u?u?u?d?s +?l?s?l?s?d?d?l +?u?u?s?s?u?d?d +?s?l?l?d?l?d?s +?l?d?d?l?s?s?l +?l?l?s?d?l?s?d +?u?d?u?d?u?s?s +?s?s?u?l?l?d?d +?s?u?d?u?u?d?s +?s?u?l?u?s?d?d +?s?u?l?l?d?d?s +?l?d?l?d?s?l?s +?u?l?u?s?s?d?d +?d?s?l?l?l?d?s +?u?l?u?d?s?d?s +?l?s?d?l?s?d?l +?d?l?d?l?s?s?l +?s?s?u?u?u?d?d +?s?d?s?d?l?l?l +?u?s?l?l?l?l?s +?u?u?d?d?l?l?l?l +?d?d?d?d?d?l?d?d?l +?d?d?u?l?l?l?l?d?d +?s?s?s?s?l?l?l +?u?l?u?l?u?d?d?d?d +?l?l?s?u?l?l?l +?l?l?l?u?u?u?s +?l?l?l?l?s?u?u +?l?l?l?l?d?d?d?l?l +?d?d?s?s?s?l?l +?l?s?l?s?d?s?l +?d?s?l?s?d?s?l +?d?l?d?l?s?s?s +?u?l?d?s?l?l?l +?l?s?s?l?d?d?d?d +?u?l?l?l?l?l?l?l?l +?u?d?l?d?l?d?l?l +?l?u?l?u?l?d?d?d +?u?l?l?l?d?d?d?u +?l?u?l?l?s?s +?u?l?u?l?u?s?s +?s?l?l?s?u?l +?l?s?u?u?s?l +?l?l?s?u?s?u +?s?u?l?s?u?l +?s?l?s?l?l?u +?s?l?s?l?u?l +?u?s?l?u?s?l +?u?l?l?s?u?s +?u?s?l?u?s?u +?s?l?u?l?s?l +?u?s?l?l?u?s +?l?s?l?s?u?u +?u?u?u?l?s?s +?u?l?u?s?s?l +?l?u?u?s?u?s +?l?l?s?u?l?s +?u?u?u?s?s?l +?u?l?u?s?u?s +?u?u?s?l?l?s +?s?l?l?u?s?u +?l?u?u?u?s?s +?s?s?l?l?u?u +?l?l?l?s?s?u +?l?l?s?l?d?l?s +?u?l?s?u?s?l +?u?u?l?u?s?s +?s?u?s?u?u?u +?u?s?u?s?l?l +?l?s?s?l?l?u +?s?u?l?u?u?s +?s?u?u?l?l?s +?l?s?l?s?d?l?l +?l?u?l?s?s?u +?l?s?u?l?s?l +?l?s?u?s?l?l?l +?u?l?l?l?s?s?d +?u?s?u?l?s?l +?l?s?s?u?l?l +?s?l?l?l?u?s +?s?l?u?l?l?s +?s?u?u?l?u?s +?s?l?l?s?l?u +?s?l?l?u?l?s +?u?s?u?d?u?s?u +?s?l?u?u?u?s +?s?u?l?l?l?u?s +?s?l?s?u?u?u +?l?l?s?l?u?s +?l?s?l?u?s?l +?l?u?l?u?l?u?d?d +?l?l?l?l?l?d?d?l?l +?d?d?d?d?d?d?d?d?d?d?s +?l?l?l?l?l?s?s?d +?u?l?l?l?u?u?l +?l?u?l?u?l?l?l +?u?u?l?l?u?u?l +?u?u?u?l?l?u?u +?l?u?l?l?l?l?u +?u?d?l?u?d?l?s +?u?d?u?d?u?u?s +?u?u?u?d?d?s?u +?u?l?s?l?u?d?d +?d?l?l?l?s?d?l +?d?l?s?l?l?d?l +?u?u?d?d?s?l?l +?u?l?s?l?d?d?l +?u?u?d?d?u?s?u +?l?s?l?d?d?u?l +?u?u?u?s?d?d?u +?d?l?l?d?s?l?l +?u?s?d?u?u?d?u +?u?d?l?l?s?d?l +?u?l?l?d?d?s?l +?u?u?u?d?d?u?s +?u?l?d?s?d?l?l +?u?s?u?u?d?d?u +?u?d?l?l?l?d?s +?u?u?u?s?d?u?d +?l?l?u?u?d?d?s +?u?s?u?d?d?l?l +?u?d?d?u?s?u?u +?l?l?l?d?d?u?s +?u?u?u?s?d?l?d +?l?l?d?d?s?u?u +?u?l?l?d?l?d?s +?u?l?d?d?l?u?d?d +?l?d?l?d?u?d?u?d +?d?d?d?u?u?d?u?u +?d?d?d?u?u?u?u?d +?u?u?l?u?d?d?d?d +?u?d?u?d?d?d?u?u +?s?s?s?l?s?s +?s?u?s?s?s?s +?s?s?u?s?s?s +?s?s?l?s?s?s +?s?l?s?s?s?s +?d?l?d?d?d?d?d?d?d?d +?s?s?l?s?s?d?d +?u?l?l?d?u?u?u +?d?l?l?u?u?u?u +?u?l?d?l?u?l?u +?l?l?u?d?l?l?l +?l?d?l?u?l?u?l +?u?u?u?l?d?l?l +?l?d?l?l?l?u?l +?l?d?l?l?u?l?l +?u?l?u?u?u?u?d +?l?u?l?u?u?u?d +?u?l?u?d?u?l?l +?l?l?l?u?u?d?u +?l?l?u?u?l?d?l +?u?l?l?d?u?l?l?l +?u?d?d?l?l?l?l?d +?d?d?u?d?d?u?d?d?u +?d?d?l?d?d?d?d?d?l +?d?l?d?l?d?d?d?d?d +?l?l?s?d?d?d?l?l +?l?l?s?d?l?l?l?l +?u?u?l?l?u?u?d?d +?l?l?l?l?l?l?d?u +?l?d?l?l?s?s?s +?d?l?d?l?d?l?d?s +?l?d?d?l?d?d?l?s +?d?d?u?l?l?d?d?s +?d?d?u?u?u?u?u?d?d +?d?l?d?l?d?l?d?d?d +?u?u?l?d?d?d?d?d?d +?u?d?d?l?d?d?l?d?d +?u?u?u?u?l?l?u +?u?l?l?u?u?u?u +?l?l?l?l?u?l?u +?l?l?l?d?l?l?l?l?l +?u?l?l?l?u?d?d?d?d +?u?l?u?l?s?d?d?d +?u?u?u?u?l?l?l?d +?u?u?u?u?s?s?u +?d?d?d?u?u?u?u?u?u +?u?l?d?l?d?l?l?d +?d?s?d?d?d?d?d?s +?d?d?d?d?s?d?s?d?d +?l?l?l?s?s?s?l +?l?l?d?l?l?d?l?l?d +?s?u?l?l?l?d?s +?s?l?s?l?l?l?d +?l?l?l?d?l?l?l?s +?d?d?d?d?l?l?l?l?s +?u?l?d?d?d?s?d?d +?d?l?l?d?d?d?d?s +?l?d?d?l?s?d?d?d +?d?s?d?d?d?d?l?l +?u?s?u?d?d?d?d?d?d +?l?d?d?s?l?d?d?d +?d?d?s?l?l?d?d?d +?u?d?l?s?d?d?d?d +?s?d?l?l?d?d?d?d +?s?u?l?d?d?d?d?d +?l?d?l?l?l?s?d?d +?u?d?u?s?u?u?u +?u?d?s?l?l?l?l +?u?s?u?u?d?u?u +?u?l?s?d?l?l?l +?u?l?s?u?l?l?d +?u?l?s?l?d?l?l +?u?l?l?s?u?l?d +?u?u?s?l?l?l?d +?d?d?d?d?d?d?d?d?l?l?l +?s?s?u?u?u?u?u +?s?u?s?l?l?l?l +?l?d?l?d?l?d?s?s +?d?d?d?l?d?d?l?d?d +?u?d?d?u?d?d?d?d?d +?d?d?d?l?d?l?d?d?d +?u?u?u?s?s?s?s +?d?d?l?d?d?d?d?d?d?d +?u?l?s?s?d?d?d?d +?d?d?s?d?s?d?d?u +?d?d?d?d?d?s?l?s +?d?d?d?d?d?l?s?s +?u?d?d?d?d?d?s?s +?s?s?d?d?d?d?d?l +?d?d?d?d?l?l?u?l +?l?u?d?u?d?d?d?u +?u?l?u?d?d?d?d?l +?d?l?l?l?d?d?d?u +?d?d?d?d?l?u?l?u +?u?u?s?d?d?d?d?d?d +?d?d?d?d?d?d?d?u?s +?d?u?u?u?d?u?u?u +?u?u?u?s?u?u?u?u +?l?l?l?l?l?l?l?d?l +?l?l?l?u?l?l?u +?u?l?l?l?d?u?l?l +?s?s?s?l?l?l?d +?l?l?l?s?d?s?s +?d?l?d?s?l?l?d +?u?u?d?u?d?d?s +?d?u?u?u?d?d?s +?l?d?d?u?l?d?s +?d?d?s?l?l?u?d +?u?d?s?l?d?l?d +?u?d?l?d?d?l?s +?u?d?d?u?d?u?s +?s?l?d?d?u?d?l +?l?d?d?s?l?d?u +?l?d?l?s?d?d?l +?d?u?d?s?u?u?d +?d?d?d?s?l?l?u +?u?d?l?l?d?d?s +?l?u?d?s?d?u?d +?u?s?l?d?d?l?d +?l?d?u?d?d?l?s +?l?d?d?s?d?l?u +?d?d?u?s?d?u?u +?u?d?u?l?d?d?s +?d?d?d?u?u?l?s +?u?d?l?u?d?d?s +?l?u?u?d?d?d?s +?s?l?d?d?l?d?l +?s?l?u?l?d?d?d +?l?u?d?l?s?d?d +?s?d?u?l?l?d?d +?u?u?s?d?u?d?d +?l?l?d?d?d?d?s?l +?u?u?s?d?l?d?d +?u?l?d?s?d?u?d +?u?u?d?d?d?s?l +?d?s?l?l?d?l?d +?u?l?d?d?s?u?d +?d?u?l?u?d?s?d +?d?d?l?l?d?s?l +?d?d?d?l?u?s?u +?l?d?d?d?u?u?s +?u?s?d?u?u?d?d +?u?d?u?d?l?d?s +?u?u?d?d?d?s?u +?d?l?s?l?d?d?l +?d?d?u?l?d?s?l +?u?d?d?l?l?s?d +?l?d?d?d?s?u?u +?d?s?l?d?l?d?l +?l?u?s?l?d?d?d +?l?d?u?d?l?s?d +?d?d?d?u?l?s?l +?l?l?d?s?d?l?d +?d?d?d?l?l?u?s +?s?u?d?l?l?d?d +?d?s?d?u?d?u?u +?s?d?l?l?d?l?d +?u?l?s?d?d?d?l +?d?u?d?l?s?d?u +?u?d?d?l?u?s?d +?d?d?l?l?u?d?s +?s?d?d?l?d?l?l +?u?d?s?d?l?l?d +?s?d?d?u?l?u?d +?u?d?l?s?l?d?d +?d?u?s?l?l?d?d +?u?d?u?u?s?d?d +?d?d?l?l?d?l?s +?u?u?d?s?l?d?d +?l?s?d?d?l?d?l +?u?d?l?d?u?d?s +?u?u?d?u?s?d?d +?l?u?u?s?d?d?d +?s?d?u?u?d?d?u +?s?u?l?u?d?d?d +?d?s?d?d?u?u?u +?l?l?u?d?s?d?d +?d?s?d?u?l?l?d +?u?l?s?d?l?d?d +?u?s?u?l?d?d?d +?u?d?u?u?d?d?s +?d?l?l?d?d?s?l +?d?u?d?l?d?l?s +?l?l?d?d?u?d?s +?u?d?u?d?d?u?s +?u?u?d?d?s?d?l +?d?s?d?l?l?d?l +?u?l?u?d?d?s?d +?l?d?d?d?d?s?l?l +?l?s?d?d?d?d?l?l +?u?d?l?d?s?d?u +?l?d?u?s?l?d?d +?u?s?l?d?d?d?u +?s?u?u?d?d?d?u +?d?s?d?u?u?u?d +?l?l?d?d?d?s?u +?d?s?l?u?l?d?d +?d?s?d?l?d?l?l +?u?d?s?d?d?l?u +?u?d?s?d?d?l?l +?u?d?u?d?s?u?d +?s?d?d?d?l?u?u +?d?l?s?d?l?l?d +?s?d?d?u?l?d?u +?u?u?d?d?d?u?s +?d?d?d?u?s?l?l +?d?d?s?l?d?l?l +?d?d?d?l?u?u?s +?d?d?d?u?l?u?s +?l?d?s?d?d?l?u +?d?d?d?l?l?l?s?d +?s?u?d?u?d?u?d +?d?l?l?u?s?d?d +?d?d?s?u?d?u?u +?u?d?d?s?d?l?l +?u?d?d?s?d?u?l +?d?d?u?l?l?d?s +?s?u?d?d?u?u?d +?u?l?d?l?d?d?s +?d?d?d?s?u?l?u +?u?d?s?d?d?u?l +?u?d?l?d?s?l?d +?d?d?d?d?d?s?l?l?l +?u?l?d?s?d?d?u +?u?l?u?d?d?s?d?d +?d?d?u?l?l?s?d +?l?u?d?d?l?d?s +?d?u?d?u?d?s?l +?d?s?d?d?u?l?l +?d?d?u?l?u?s?d +?l?d?l?s?u?d?d +?u?l?l?s?u?d?d?d +?d?u?u?u?s?d?d +?s?l?d?l?d?d?l +?u?d?d?s?u?l?d +?d?d?u?u?u?d?s +?u?d?l?l?d?s?d +?s?d?l?l?d?d?u +?d?d?d?l?l?l?d?d?d?d +?u?u?d?u?u?u?u?d +?u?u?u?u?d?u?u?d +?u?u?d?d?d?d?l?d +?l?d?l?l?d?l?d?d?d +?u?l?d?d?u?d?d?d +?u?d?d?l?d?d?u?d +?d?d?d?u?l?d?d?l +?d?d?d?d?l?d?u?u +?d?d?d?d?u?u?d?u +?l?l?d?d?d?d?d?u +?d?d?u?u?d?d?u?d +?d?d?d?d?u?d?u?u +?u?d?u?l?d?d?d?d +?d?u?d?d?d?u?u?d +?d?d?d?d?d?l?u?u +?u?d?d?d?d?l?l?d +?l?l?d?d?d?d?u?d +?d?d?d?u?d?d?l?l +?u?d?d?u?l?d?d?d +?d?u?d?u?d?d?u?d +?d?d?d?d?l?l?d?u +?u?l?d?d?d?d?d?u +?l?s?l?l?l?s?s +?u?u?l?l?l?d?d?d?d +?s?d?s?s?d?s?d +?s?d?d?d?s?s?s +?l?d?d?d?d?d?l?l?l +?d?l?u?d?u?l?l +?d?l?u?u?u?d?l +?l?l?l?d?u?u?d +?l?d?u?l?l?d?l +?d?u?l?d?l?u?l +?d?d?u?l?l?u?l +?d?l?l?u?u?u?d +?d?l?l?u?d?l?u +?d?l?l?u?d?l?l +?l?d?u?u?d?u?u +?u?d?d?u?u?l?l +?l?l?l?d?l?u?d +?u?d?u?u?l?l?d +?u?d?u?l?d?l?u +?u?d?u?l?d?l?l +?d?u?d?u?l?l?l +?l?d?l?l?l?u?d +?d?u?l?l?u?d?u +?u?d?l?l?l?l?d?l +?u?u?d?l?d?u?u +?l?d?u?d?u?l?l +?l?u?d?d?u?u?u +?d?l?l?l?d?u?l +?d?l?u?l?l?d?u +?d?l?u?l?l?d?l +?d?l?d?u?u?l?l +?d?d?u?u?l?u?u +?l?d?u?u?d?l?l +?l?u?d?l?d?l?l +?l?d?l?d?l?u?l +?u?d?d?u?l?u?l +?u?u?u?l?d?u?d +?l?u?l?d?l?d?u +?d?u?l?u?u?l?d +?l?u?l?u?d?l?d +?l?d?l?l?d?u?u +?d?u?l?d?u?l?l +?u?d?u?d?l?l?u +?l?u?l?d?d?u?l +?u?d?u?d?u?u?u?d +?u?u?u?d?l?l?d +?u?d?u?u?u?d?l +?d?u?d?u?l?l?u +?d?u?u?d?l?l?u +?d?l?l?l?u?u?d +?d?d?l?u?l?l?u +?l?u?l?u?d?d?u +?d?l?l?u?u?l?d +?u?u?l?u?d?d?u +?d?u?u?l?l?d?l +?d?u?u?u?u?l?d +?u?u?u?u?u?l?d?d +?u?l?u?d?u?d?l +?d?u?u?u?d?l?l +?u?d?u?l?u?l?d +?l?u?u?d?d?u?u +?d?l?l?u?l?d?u +?u?d?d?l?l?l?u +?l?d?u?d?l?l?l +?l?d?d?l?l?u?u +?l?u?d?l?l?l?d +?d?l?u?l?l?l?d +?l?d?d?l?l?l?u +?d?l?u?u?l?l?d +?l?l?l?u?d?d?u +?u?d?d?u?u?u?l +?u?d?u?d?l?u?u +?l?d?u?d?l?u?u +?l?l?u?u?d?d?u +?l?l?d?u?u?d?u +?l?l?d?u?u?d?l +?u?l?d?l?l?u?d +?u?d?u?d?u?l?l +?l?l?l?d?u?d?u +?u?l?u?d?u?u?d +?u?u?d?l?d?l?l +?d?d?l?u?l?u?u +?l?l?d?l?l?u?d +?d?d?u?u?l?u?l +?u?u?l?u?d?d?l +?l?d?u?u?l?l?d +?l?u?d?l?d?u?l +?l?u?d?u?u?l?d +?l?u?u?d?l?l?d +?d?l?d?l?l?l?u +?u?d?l?d?u?u?l +?u?u?u?d?d?l?u +?u?d?l?l?u?u?d +?l?d?s?l?d?s?l?d +?l?l?l?l?l?l?d?l?l +?s?d?d?d?d?d?s?s +?l?l?l?u?l?l?s +?l?l?l?d?d?d?l?s +?l?d?d?d?s?l?l?l +?l?l?l?s?d?d?l?l +?d?d?d?s?s?d?d?d?d +?d?l?d?d?l?d?d?l?d +?s?d?l?s?d?l?s +?s?s?d?d?l?l?s +?l?l?l?l?s?l?l?l?l +?d?d?s?d?d?d?s?d?d?d +?l?d?d?d?d?d?s?d?d +?d?d?d?d?l?s?l?s +?u?u?s?s?d?d?d?d +?d?d?d?d?l?d?l?d?d +?d?d?u?u?d?d?d?d?d +?s?s?l?d?d?s?s +?s?s?d?l?d?s?s +?s?s?s?s?l?d?d +?s?l?d?l?d?l?d?s +?l?l?l?l?l?d?d?d?d?d?d +?l?l?u?d?u?l?l +?l?u?l?l?d?l?l +?u?l?d?l?u?l?l +?u?d?u?u?l?l?l +?l?u?u?u?l?l?d +?u?l?l?u?u?l?u +?u?l?l?d?l?u?l +?l?l?u?u?u?l?d +?u?l?u?u?u?l?d +?l?d?u?u?u?u?u +?u?l?l?u?d?u?u +?l?u?d?u?u?u?u +?u?u?u?d?u?l?l +?l?l?l?d?u?l?u +?l?u?d?l?l?l?l +?l?u?l?u?l?d?l +?u?l?d?u?l?u?l +?u?u?u?u?s?u?u?u +?l?l?u?l?d?l?l +?u?l?l?u?l?d?l +?l?u?u?d?u?u?u +?u?u?u?l?u?u?d +?l?l?d?l?l?u?l +?l?d?l?l?u?u?u +?u?u?u?u?s?d?d?d?d +?d?d?d?l?d?d?d?d?d?d +?l?l?l?d?l?l?l?d?d +?l?l?d?l?l?l?l?s +?l?l?l?s?d?l?s +?l?l?s?d?l?l?s +?l?d?l?s?l?s?l +?s?l?d?l?s?l?l +?l?s?l?l?l?d?s +?l?l?d?d?d?d?d?d?l?l +?u?l?d?d?l?l?l?d +?u?d?d?d?d?d?d?d?d?u +?d?d?d?d?l?d?d?l?l +?d?d?d?s?u?l?l?l +?u?l?l?l?l?d?d?u +?s?s?u?l?s?l +?s?s?l?l?l?l?s +?s?u?l?s?u?s +?s?l?s?l?u?s +?u?s?s?u?l?s +?u?l?s?u?s?s +?u?l?s?s?l?s +?u?l?s?s?s?u +?l?l?s?s?s?u +?u?s?u?u?s?s +?l?l?s?s?u?s +?u?s?s?l?s?l +?s?u?s?s?u?u +?l?l?d?d?l?l?l?s +?u?l?u?l?l?l?l?l +?u?u?u?u?l?l?s +?s?l?s?l?d?l?d +?s?l?d?d?l?l?s +?s?u?l?u?d?d?s +?l?s?d?l?l?s?d +?s?u?l?l?s?d?d +?l?d?s?d?l?s?l +?u?d?d?l?l?s?s +?l?u?l?s?s?d?d +?d?d?s?u?u?u?s +?l?s?l?d?d?s?l +?l?d?l?s?d?l?s +?s?s?l?l?d?l?d +?l?d?l?l?s?s?d +?u?l?s?s?l?d?d +?l?d?s?s?l?l?d +?l?s?s?d?d?l?l +?l?l?d?l?d?s?s +?l?l?s?l?d?d?s +?l?d?s?s?l?d?l +?l?d?l?s?l?d?s +?l?s?u?s?l?d?d +?l?s?l?d?l?d?s +?l?s?d?d?l?l?d?d +?u?s?u?u?d?d?d?d +?s?d?l?l?l?d?d?d +?l?d?l?d?l?d?s?d +?d?d?d?s?l?l?l?d +?u?u?s?s?u?u?u +?u?d?d?u?d?d?u?u +?u?u?d?d?d?u?u?d +?u?u?u?d?d?d?u?d +?d?d?l?l?l?u?d?d +?u?d?l?d?d?d?l?l +?u?d?l?d?l?d?d?l +?u?d?u?u?d?d?d?u +?d?d?u?d?d?u?u?u +?u?u?d?d?d?u?d?u +?u?d?d?l?l?u?d?d +?u?d?d?l?l?d?d?l +?u?d?u?d?d?u?d?u +?u?d?d?u?d?d?l?l +?u?l?d?d?l?d?d?l +?d?d?d?d?u?l?u?u +?d?l?d?u?d?l?d?u +?u?l?d?d?l?d?l?d +?u?d?d?d?u?u?u?d +?u?d?d?l?d?l?l?d +?l?d?l?d?l?d?u?d +?l?u?d?d?d?d?l?u +?s?s?s?d?d?d?d?d?d +?u?l?l?l?s?d?l +?u?l?l?l?s?u?d +?u?u?u?s?d?u?u +?u?d?l?s?l?l?l +?l?s?d?u?l?l?l +?u?d?l?l?l?s?l +?l?l?u?l?l?s?d +?u?u?s?u?u?d?u +?l?l?l?l?u?u?u?u +?l?l?s?s?s?l?l +?l?s?l?s?l?l?s +?u?l?d?l?l?l?l?d +?s?s?s?s?s?s?l +?d?s?d?d?d?d?d?d?d?d +?s?d?d?d?l?l?l?s +?l?l?l?u?l?d?d?d +?l?l?u?d?d?d?l?l +?u?d?u?u?d?u?d?u +?d?d?l?l?l?l?l?l?d?d +?d?d?d?d?d?d?d?d?u?l +?u?l?l?l?d?d?s?s +?u?s?u?u?u?u?d?d +?d?d?s?s?d?d?l?l +?s?s?d?d?d?d?l?l +?l?l?d?l?l?l?d?d?d +?d?l?u?d?d?d?d?d +?d?u?l?d?d?d?d?d +?d?d?u?d?l?d?d?d +?d?d?d?d?l?d?u?d +?s?l?l?d?d?d?d?d?d +?d?l?d?d?d?d?d?u +?d?l?d?d?d?u?d?d +?d?d?d?d?d?l?u?d +?d?d?d?l?d?d?u?d +?l?l?d?d?d?d?l?d?d +?d?l?d?d?d?d?u?d +?d?d?d?u?l?l?d?d?d +?d?u?d?d?d?d?d?u +?l?l?l?l?d?l?l?s +?l?l?l?l?u?u?s +?u?u?u?u?s?l?l +?u?l?s?s?l?l?l +?u?l?l?l?s?u?s +?l?l?l?l?d?l?d?d?d +?l?l?l?d?l?s?d?d +?d?d?d?l?s?l?l?l +?s?u?l?l?l?d?d?d +?u?d?u?u?u?d?u?u +?d?d?d?d?d?d?d?u?u?u +?l?l?l?u?l?l?l?d +?u?u?u?u?d?d?d?l +?l?l?l?l?s?d?l?d +?d?s?l?s?l?s?l +?l?l?u?u?u?u?d?d +?u?d?d?u?u?u?u?u +?u?l?u?l?d?d?d?d?d +?l?d?l?l?l?l?d?d?d +?l?l?l?l?l?s?d?l +?l?l?l?l?l?d?s?s +?l?u?u?u?u?u?u?u +?l?s?d?d?d?d?d?s +?s?l?s?d?d?d?d?d +?l?d?s?s?d?d?d?d +?d?l?s?d?l?s?d?l +?d?d?d?s?l?l?l?s +?l?s?s?l?l?d?l +?u?u?u?u?s?s?d +?l?l?l?d?s?s?l +?l?s?s?l?d?l?l +?l?s?l?l?s?d?l +?d?s?s?l?l?l?l +?u?u?s?u?u?s?d +?l?d?l?l?s?s?l +?l?l?d?l?s?l?s +?l?l?l?s?l?d?s +?l?d?l?s?l?l?s +?l?l?l?l?d?d?l?d?d +?s?u?l?l?l?l?d?d +?l?l?l?l?l?d?l?s +?l?d?s?d?d?d?d?d?d +?l?l?d?d?s?d?l?l +?l?l?l?d?d?d?s?l +?u?l?d?l?l?d?l?l +?d?d?s?d?s?d?s?d +?u?s?u?s?u?u?u +?l?l?d?d?d?l?l?l?l +?l?d?d?d?d?d?d?d?d?s +?l?d?d?l?l?d?d?s +?d?d?l?l?s?l?d?d +?d?d?l?s?l?l?d?d +?d?s?d?d?d?l?l?l +?l?l?d?d?l?s?d?d +?l?d?l?d?l?s?d?d +?s?d?d?d?d?u?u?u +?l?l?l?u?l?u?l +?l?u?u?u?l?l?l +?u?u?u?l?u?u?u +?l?d?d?l?d?l?d?d?d +?d?d?d?d?d?d?l?l?u +?u?d?d?l?d?d?u?d?d +?u?s?l?s?d?d?d +?u?s?s?u?d?d?d +?u?s?l?s?d?d?d?d +?s?d?l?d?u?d?s +?l?d?l?d?s?d?s +?d?l?l?d?d?s?s +?s?d?l?l?d?s?d +?u?d?s?l?s?d?d +?d?l?s?s?d?l?d +?s?l?d?s?u?d?d +?d?l?d?d?s?s?l +?s?l?s?d?l?d?d +?s?s?l?d?d?l?d +?s?u?s?l?d?d?d +?u?s?d?s?l?d?d +?s?s?l?u?d?d?d +?d?s?u?u?s?d?d +?d?d?l?s?s?l?d +?l?d?s?d?l?s?d +?d?d?u?u?d?s?s +?d?l?l?s?d?d?s +?l?u?d?d?d?s?s +?d?d?s?s?l?l?d +?l?s?d?d?s?l?d +?u?d?l?d?d?s?s +?d?d?d?s?s?u?u +?l?d?d?u?s?s?d +?d?d?s?l?s?l?d +?l?d?s?l?d?s?d +?d?s?l?d?d?l?s +?d?d?s?d?u?u?s +?s?l?d?s?l?d?d +?d?d?s?d?d?s?u?u +?l?d?s?l?s?d?d +?l?s?s?d?l?d?d +?s?d?l?l?d?d?s +?d?d?s?u?d?s?u +?d?s?l?s?l?d?d +?l?d?s?s?d?d?l +?s?u?d?d?d?s?u +?s?d?d?d?l?s?l +?d?l?s?d?d?s?l +?u?l?s?d?d?d?s +?s?d?s?l?d?d?l +?d?d?s?l?s?d?l +?s?l?s?d?d?d?l +?s?d?d?l?d?l?s +?d?s?d?s?l?l?d +?u?d?s?s?l?d?d +?d?s?d?s?d?u?u +?s?l?d?s?d?l?d +?d?d?s?s?d?u?u +?d?l?l?d?s?d?s +?l?d?s?l?d?d?s +?d?d?u?s?l?d?s +?s?s?d?l?d?l?d +?d?l?d?d?l?s?s +?u?s?u?d?s?d?d +?d?d?u?l?s?s?d +?d?u?d?u?s?d?s +?s?d?d?s?d?l?l +?s?u?d?u?d?s?d +?u?s?u?d?d?s?d +?u?d?d?d?s?s?u +?s?u?d?u?s?d?d +?d?d?l?s?l?s?d +?l?d?s?d?l?d?s +?s?s?u?l?d?d?d +?d?l?s?d?d?l?s +?l?d?s?d?d?s?l +?u?l?s?d?s?d?d +?u?s?s?d?d?d?l +?s?d?d?l?l?s?d +?d?d?d?d?s?l?l?s +?s?l?d?d?s?l?d +?d?s?d?l?s?d?l +?d?s?s?d?d?l?l +?s?s?d?d?d?u?l +?s?d?s?d?d?u?l +?d?d?s?d?u?s?u +?u?s?d?u?d?s?d +?s?d?d?d?l?u?s +?s?d?l?s?l?d?d +?l?d?d?d?u?s?s +?l?d?d?s?u?d?s +?u?l?d?s?d?d?s +?d?s?d?d?l?s?l +?d?s?d?d?l?l?s +?s?s?d?d?u?d?u +?l?s?d?l?d?s?d +?d?s?s?d?l?l?d +?u?u?s?d?s?d?d +?d?l?d?s?d?s?l +?l?d?s?u?s?d?d +?s?d?l?d?d?l?s +?s?u?d?d?s?d?u +?d?s?d?u?s?d?u +?d?s?l?d?l?d?s +?d?l?s?u?s?d?d +?s?d?d?d?s?u?u +?d?s?d?l?s?l?d +?l?s?s?u?d?d?d +?l?d?l?s?d?d?s +?d?s?l?d?l?s?d +?u?d?l?d?l?l?d?l +?u?l?l?d?d?l?l?d +?u?u?d?u?u?d?u?d +?u?d?u?u?u?d?u?d +?d?d?d?u?u?l?l?l +?l?l?s?d?d?s?l?l +?d?d?d?d?d?s?u?l +?d?d?d?d?d?s?u?u +?l?d?d?l?d?s?d?d +?d?d?d?l?d?d?l?s +?u?l?d?d?s?d?d?d +?s?u?u?d?d?d?d?d +?l?d?d?l?d?d?s?d +?d?l?l?d?s?d?d?d +?u?l?d?s?d?d?d?d +?l?u?d?d?d?d?d?s +?d?d?s?d?d?l?l?d +?l?s?u?d?d?d?d?d +?l?d?d?d?l?s?d?d +?u?u?d?d?d?d?s?d +?u?u?d?d?d?s?d?d +?u?l?u?l?s?s?s +?d?d?d?d?l?d?d?l?d +?d?d?u?u?l?l?l?l +?u?d?l?l?s?l?d +?l?d?u?l?l?d?s +?l?u?u?l?s?d?d +?d?u?u?s?l?l?d +?l?s?u?u?l?d?d +?u?l?d?d?s?l?l +?u?d?l?s?u?l?d +?s?l?d?l?u?d?l +?s?l?u?l?u?d?d +?u?s?l?u?l?d?d +?d?d?l?l?l?u?s +?l?u?l?s?d?d?l +?d?d?u?l?l?u?s +?s?l?u?l?l?d?d +?d?l?d?l?l?s?l +?d?u?u?u?u?s?d +?l?d?d?l?l?u?s +?d?s?u?u?u?d?u +?u?u?s?d?d?l?l +?u?u?s?l?l?d?d +?u?d?d?l?l?s?l +?l?l?s?u?u?d?d +?u?d?d?s?l?l?l +?l?s?l?u?l?d?d +?l?l?s?d?d?u?u +?u?d?l?l?d?s?l +?u?l?l?d?l?s?d +?u?u?u?l?d?s?d +?u?s?d?u?d?u?u +?d?d?u?u?s?u?u +?l?u?u?u?d?d?s +?u?d?l?s?l?d?u +?u?u?s?l?d?d?u +?l?l?l?d?d?s?u +?d?l?d?s?l?l?u +?l?l?u?s?d?d?l +?u?d?l?l?l?s?d +?l?l?s?u?l?d?d +?u?d?u?s?u?d?u +?u?s?l?d?d?l?l +?d?s?d?u?l?l?l +?l?s?u?l?d?d?l +?u?l?l?s?d?l?d +?l?s?u?l?l?d?d +?u?s?l?l?d?l?d +?u?l?l?u?d?s?d +?u?l?d?s?u?l?d +?u?l?s?l?d?l?d +?l?l?d?l?d?s?l +?l?u?u?u?s?d?d +?u?d?l?l?s?u?d +?d?d?d?l?l?l?s?l +?l?l?l?l?s?d?d?l +?u?s?d?l?l?d?l +?u?l?d?d?l?s?l +?l?d?l?d?l?l?d?s +?s?u?u?d?d?u?u +?u?u?u?d?s?d?u +?d?u?u?u?u?d?s +?d?d?u?s?l?l?l +?u?u?u?u?d?s?d?d +?u?s?u?d?d?u?u +?s?d?l?l?l?l?d?d +?d?s?l?d?l?l?l +?d?l?l?l?l?s?d?d +?u?d?l?s?d?l?l +?u?l?u?d?d?l?s +?l?u?l?l?d?d?s +?d?d?l?l?l?l?s?s +?u?u?l?s?d?d?u +?d?d?u?s?u?l?l +?u?u?u?u?u?u?d?s +?u?u?s?u?s?u?u +?u?u?d?d?u?d?d?u +?u?d?l?d?l?u?d?d +?l?d?l?d?u?d?l?d +?u?u?d?l?l?d?d?d +?u?d?u?u?d?d?u?d +?u?d?d?u?d?u?d?u +?u?d?u?d?u?d?l?d +?u?d?u?d?d?u?u?d +?u?d?l?u?d?l?d?d +?u?d?d?l?l?d?d?u +?d?d?l?u?l?u?d?d +?u?d?l?d?d?l?l?d +?u?l?d?u?l?d?d?d +?l?l?d?d?d?d?u?l +?d?u?d?l?d?l?d?u +?u?d?d?u?u?d?u?d +?d?d?l?u?u?u?d?d +?u?u?d?d?u?d?u?d +?u?d?d?d?u?d?u?u +?d?d?d?u?u?u?d?u +?l?d?u?d?l?d?l?d +?d?u?d?u?u?u?d?d +?l?d?d?u?u?d?d?l +?d?d?u?u?u?d?d?u +?l?l?u?d?d?d?d?d?d +?d?d?d?d?u?l?l?d?d +?l?d?l?d?d?l?d?d?d +?d?d?d?s?s?l?l?l +?l?l?d?d?l?l?l?l?l +?u?l?d?d?d?d?d?d?s +?u?l?s?d?d?d?d?d?d +?s?s?s?s?d?d?l +?l?l?l?s?d?d?s?d?d +?u?u?u?l?u?l?d +?l?u?l?l?u?u?d +?u?u?u?u?l?d?l +?u?u?d?u?u?l?u +?l?u?l?l?d?l?u +?l?u?l?l?l?d?u +?l?u?u?u?u?d?u +?u?l?u?l?u?d?l +?u?l?d?l?u?u?u +?u?u?d?u?u?l?l +?l?l?d?u?u?l?l +?u?l?d?u?l?l?u +?u?d?u?d?u?u?u?u +?l?u?u?d?l?u?l +?l?u?l?l?l?u?d +?l?l?d?l?u?u?l +?d?l?l?l?u?u?l +?u?u?u?d?l?u?u +?u?d?l?l?d?l?l?l +?d?l?l?u?u?l?l +?d?u?u?u?u?l?l +?d?u?u?u?u?l?u +?u?u?l?l?u?l?d +?u?d?u?l?u?l?u +?u?u?l?u?u?l?d +?d?l?u?u?l?l?l +?u?l?u?l?d?l?u +?u?u?l?l?l?d?u +?u?d?l?l?l?u?l +?u?u?u?d?u?u?l +?l?d?l?l?u?u?l +?d?d?l?l?d?d?d?d?d?d +?d?d?d?d?d?d?s?d?l +?l?d?d?s?d?d?d?d?d +?l?l?l?l?l?u?u?u +?d?d?s?s?s?s?s +?u?d?u?s?l?l?l +?u?d?u?u?u?u?s +?u?s?d?u?l?l?l +?l?l?u?l?l?l?s +?l?l?l?l?s?u?d +?u?l?l?d?s?l?l +?u?l?l?d?l?s?l +?s?u?u?d?u?u?u +?l?l?d?d?s?l?l?l +?u?u?u?d?u?u?s +?u?u?d?s?u?u?u +?l?d?d?d?d?l?l?l?l +?l?l?d?l?l?l?l?l?l +?s?l?l?l?s?d?s +?d?d?u?l?l?u?l?l +?u?d?u?d?u?d?u?u +?u?l?u?u?l?d?d?d +?s?s?l?l?l?d?d?d +?l?d?d?d?d?l?l?d?d +?d?l?d?l?l?d?d?d?d +?l?l?l?l?d?d?d?d?d?d?d +?l?l?s?d?d?l?l?l +?u?l?s?l?l?l?d?d +?s?s?l?u?s?s +?s?s?s?l?s?l +?l?s?s?s?u?s +?s?s?u?s?l?s +?s?u?s?s?s?l +?s?s?s?s?u?l +?l?s?s?s?l?s +?s?s?s?l?u?s +?s?s?u?s?s?l +?l?s?u?s?s?s +?d?d?d?d?d?u?l?l?l +?u?u?l?l?d?d?s?s +?u?l?u?l?u?u?l +?l?u?l?u?u?u?u +?u?l?l?u?l?u?u +?d?d?d?d?s?d?d?s?d?d +?s?s?s?s?s?s?d +?u?s?u?u?u?s?u +?l?l?s?u?s?l?l +?u?u?s?d?d?s?s +?d?s?d?s?u?s?u +?l?s?d?s?d?s?l +?d?l?s?d?l?s?s +?l?s?s?l?s?d?d +?s?l?d?s?l?d?s +?s?s?s?d?d?u?u +?l?s?l?d?d?s?s +?d?l?s?s?d?l?s +?u?s?d?s?u?s?d +?s?l?s?s?l?d?d +?u?s?u?s?d?s?d +?u?d?u?d?s?s?s +?l?l?l?l?l?l?u?u +?u?l?l?d?l?d?l?l +?u?d?l?d?l?l?l?l +?u?l?l?d?d?d?d?d?d?d +?l?d?l?l?l?l?l?l?l +?d?d?d?d?d?d?d?d?d?s?d +?l?l?l?d?d?s?l?l +?d?d?d?d?l?l?l?d?d?d +?d?d?d?d?s?l?s?l +?l?d?d?s?l?d?d?s +?s?d?d?l?l?d?d?s +?s?l?d?d?l?d?d?s +?d?d?d?l?l?l?l?l?d +?l?s?l?l?s?l?s +?s?l?l?l?l?d?d?d?d +?u?u?d?d?d?d?d?d?s +?l?d?d?d?d?l?s?l +?d?l?l?l?s?d?d?d +?l?d?l?l?d?s?d?d +?d?d?u?u?u?d?d?s +?l?l?d?s?l?l?s +?s?s?l?l?d?l?l +?s?l?l?s?l?l?d +?u?d?u?u?u?u?d?u +?d?d?l?l?l?l?l?u +?u?l?u?u?l?l?d?d +?l?l?d?l?l?l?l?d?d +?u?d?l?l?u?d?l?l +?d?d?d?d?s?d?d?s?d +?u?l?l?s?l?d?d?d +?u?l?s?l?l?d?d?d +?d?d?d?d?d?l?l?l?s +?u?u?s?u?u?u?u?u +?l?l?l?l?s?d?s?d +?d?d?d?l?d?d?d?l?d +?d?d?d?u?l?d?d?d?d +?d?d?l?d?d?d?l?d?d +?d?d?s?s?d?d?s?s +?u?d?d?d?u?l?l?l +?l?l?d?d?d?u?u?u +?u?d?u?l?l?l?d?d +?u?u?u?d?d?u?u?d +?u?d?d?l?l?d?l?l +?u?u?l?l?u?d?d?d +?d?d?d?u?u?u?l?l +?l?d?d?d?d?s?s?s +?d?d?d?d?s?s?s?l +?u?u?l?l?u?u?s +?l?u?l?u?l?u?s +?l?l?l?l?s?l?u +?u?l?l?s?u?l?l?l +?d?d?d?d?s?d?l?d +?d?d?s?d?d?d?d?u +?d?d?l?d?d?d?s?d +?d?l?d?d?s?d?d?d +?d?d?d?s?u?d?d?d +?d?d?s?d?d?d?l?d +?d?d?s?d?d?u?d?d +?l?d?d?d?d?d?d?s?d +?d?d?d?d?d?u?d?s +?d?d?d?d?d?s?d?u +?d?d?s?u?d?d?d?d +?u?d?d?d?s?d?d?d?d +?s?d?d?d?d?u?d?d +?d?d?d?d?s?u?d?d +?s?d?d?d?d?d?l?d +?d?d?d?d?d?u?s?d +?d?s?d?l?d?d?d?d +?d?d?d?s?d?d?d?u +?d?s?d?d?d?d?l?d +?d?d?d?d?u?d?d?s +?d?d?d?d?l?d?s?d +?s?d?d?d?l?d?d?d +?d?d?s?d?d?d?u?d +?u?d?d?d?d?s?d?d +?d?d?u?d?d?d?d?s +?d?d?d?u?s?d?d?d +?d?l?d?d?d?d?s?d +?d?s?d?d?l?d?d?d +?d?d?d?d?s?d?u?d +?u?u?d?u?u?d?u?u +?d?u?u?u?u?d?u?u +?u?d?u?u?u?u?u?d +?u?l?l?l?d?d?d?d?s +?l?s?d?d?d?d?d?d?d?d +?u?l?l?d?d?d?s?s +?l?l?l?d?d?l?l?s +?u?d?d?d?l?d?d?l +?d?d?d?d?l?u?u?d +?d?d?u?d?l?l?d?d +?d?u?d?l?d?d?l?d +?u?d?d?d?u?l?d?d +?d?d?u?d?d?l?d?u +?d?d?u?d?d?l?d?l +?d?u?d?d?d?d?l?l +?d?l?d?l?u?d?d?d +?d?d?l?d?d?d?u?l +?u?d?d?l?u?d?d?d +?d?u?u?d?u?d?d?d +?d?u?l?u?d?d?d?d +?d?u?d?d?l?d?d?l +?l?u?d?u?d?d?d?d +?l?d?d?d?d?l?d?u +?l?d?d?d?l?d?d?u +?d?l?u?d?d?d?d?l +?d?d?d?l?l?d?d?u +?d?d?u?u?d?u?d?d +?d?l?d?d?d?u?d?l +?d?d?d?d?u?l?d?l +?u?d?d?u?d?l?d?d +?l?d?d?d?u?d?u?d +?u?d?d?u?d?d?l?d +?d?d?u?u?l?d?d?d +?d?u?d?d?l?l?d?d +?l?d?l?u?d?d?d?d +?u?d?u?d?d?l?d?d +?l?d?u?u?d?d?d?d +?d?l?d?l?d?d?u?d +?u?d?d?d?d?l?d?l +?d?l?d?l?d?d?d?u +?l?d?u?l?d?d?d?d +?d?l?l?d?u?d?d?d +?d?d?d?u?u?d?u?d +?u?d?l?d?u?d?d?d +?u?d?u?d?d?d?u?d +?d?u?d?l?d?d?d?u +?d?u?d?u?d?d?d?u +?u?l?d?d?d?l?d?d +?u?d?d?d?d?u?d?u +?d?d?d?l?d?l?d?u +?d?d?u?l?d?l?d?d +?d?u?d?d?u?u?d?d +?d?d?d?u?u?d?d?l +?d?l?u?l?d?d?d?d +?d?d?u?u?d?d?l?d +?l?l?l?d?d?d?l?d?d +?d?d?u?l?u?d?d?d +?d?d?l?l?d?d?u?d +?l?d?l?l?l?l?l?s +?u?l?l?d?l?l?d?l +?s?l?l?l?l?l?d?s +?u?u?s?u?u?d?d?d +?l?l?d?d?d?s?l?l +?u?l?l?l?l?d?s?d +?l?s?l?l?l?d?d?d?d +?u?u?u?u?u?l?u +?u?u?l?u?u?u?u +?l?u?u?u?l?u?u +?u?l?u?l?u?u?u +?u?u?u?u?l?u?u +?l?u?l?l?u?l?u +?d?d?d?s?s?s?d?d +?s?d?s?d?d?s?d?d +?d?s?d?s?d?d?d?s +?l?l?d?d?d?s?s?s +?d?d?d?s?l?l?l?l?l +?s?l?s?l?d?l?s +?d?l?s?l?s?l?s +?l?s?d?s?l?s?l +?u?l?l?l?l?u?l?d +?d?d?d?s?d?d?d?d?s +?d?d?d?d?d?d?s?s?d +?l?l?l?d?d?u?l?l +?u?u?u?d?d?d?s?s +?d?s?l?l?l?s?d?d +?u?s?u?s?u?d?d?d +?s?s?d?d?s?s?d?d +?u?l?l?d?d?d?u?u +?u?l?d?d?d?u?l?l +?d?d?d?d?l?u?u?l +?l?u?d?d?l?u?d?d +?d?u?u?d?d?d?u?u +?d?u?u?d?u?d?u?d +?u?l?d?l?d?d?l?l +?u?d?d?l?d?d?u?l +?d?u?u?d?u?u?d?d +?u?d?d?l?u?l?d?d +?u?l?d?l?d?l?d?l +?u?l?u?d?d?d?d?u +?u?u?d?d?d?d?u?l +?u?d?u?u?d?u?u?d +?u?d?d?d?l?l?d?l +?u?u?d?u?d?u?u?d +?u?d?d?u?d?u?u?d +?u?d?d?l?l?l?d?l +?l?u?l?l?d?d?d?l +?u?d?d?d?l?l?l?d +?d?u?u?u?d?d?d?u +?d?d?d?u?l?u?l?u +?u?u?d?u?d?d?u?d +?u?d?d?l?d?l?d?l +?u?l?d?d?d?d?u?u +?u?l?d?d?d?l?d?l +?u?l?d?l?l?d?l?d +?u?l?d?l?l?d?d?l +?u?l?d?d?d?l?l?d +?u?d?l?d?u?d?u?d +?l?l?l?s?d?d?d?d?d?d +?d?d?d?l?l?l?l?l?d?d +?l?s?l?d?d?s?d?d +?l?d?d?l?d?d?s?s +?l?l?l?d?l?l?d?d?d +?u?s?s?l?l?l?l +?d?d?l?l?l?l?l?l?d +?d?d?d?l?d?d?d?l?l +?l?d?d?d?d?l?d?d?l +?d?d?d?d?l?l?d?d?l +?l?d?l?d?l?d?l?d?l?d +?s?l?l?l?l?l?u +?l?d?l?d?l?l?d?d?d +?d?l?l?l?l?l?d?s +?s?d?d?d?s?l?s +?s?s?d?l?d?s?d +?s?s?u?d?d?d?s +?s?s?s?d?l?d?d +?d?s?d?d?l?s?s +?s?s?s?u?d?d?d +?s?s?s?d?d?l?d +?s?s?s?d?d?d?d?l +?s?s?l?s?d?d?d +?d?s?d?s?d?s?u +?d?d?d?s?s?l?s +?s?u?d?d?d?s?s +?s?d?d?d?l?s?s +?s?d?d?l?d?s?s +?d?s?s?s?d?d?l +?d?s?d?d?s?l?s +?s?s?d?s?d?d?l +?s?d?l?s?s?d?d +?l?d?d?s?s?s?d +?s?d?s?d?s?d?u +?s?s?l?d?s?d?d +?l?d?d?s?d?s?s +?s?l?d?s?s?d?d +?s?s?u?s?d?d?d +?l?s?d?s?d?d?s +?d?s?d?d?s?s?u +?u?s?d?s?d?s?d +?u?s?d?s?s?d?d +?d?s?l?s?s?d?d +?s?s?d?d?d?s?l +?s?l?s?d?d?d?s +?l?s?s?s?d?d?d?d +?d?s?d?l?s?d?s +?d?l?d?d?s?s?s +?s?l?d?d?s?d?s +?u?s?s?s?d?d?d +?l?l?l?l?l?d?l?d?d +?u?l?d?l?l?l?d?l +?l?l?s?l?l?d?d?d?d +?l?s?l?l?d?l?d?d +?d?l?l?l?l?d?d?s +?d?d?d?d?d?d?d?d?l?s +?l?l?l?s?l?l?l?d?d +?d?d?d?s?d?d?s?l +?s?d?d?l?d?d?d?s +?s?s?l?d?d?d?d?d +?d?d?s?d?d?s?d?l +?l?l?l?l?s?d?l?l +?l?s?l?s?l?s?l?s +?d?d?d?d?d?d?u?u?u?u +?l?d?d?l?l?l?d?d?d +?u?d?d?d?d?d?d?d?d?l +?d?d?d?d?s?d?d?d?l +?s?l?d?l?l?s?d +?u?u?s?l?s?d?d +?u?d?l?d?l?s?s +?s?d?u?u?u?s?d +?s?d?d?s?u?u?u +?l?l?s?d?d?l?s +?l?s?d?l?d?l?s +?l?l?d?l?s?d?s +?d?s?l?d?l?l?s +?u?l?d?l?d?s?s +?s?d?l?s?l?l?d +?d?d?s?l?l?s?l +?u?s?d?d?s?u?u +?d?l?l?s?d?l?s +?d?l?l?s?l?s?d +?l?s?d?d?l?l?s +?u?l?l?s?d?s?d +?l?s?s?l?d?l?d +?s?l?l?l?d?s?d +?d?l?s?s?l?l?d +?s?d?d?u?l?u?s +?s?d?u?l?l?s?d +?l?d?s?l?l?d?s +?s?d?l?d?l?l?s +?d?s?u?l?l?s?d +?s?l?l?d?d?s?l +?d?l?l?l?s?d?s +?l?s?l?s?u?d?d +?l?s?l?d?l?s?d +?d?l?l?s?s?d?l +?s?s?u?u?d?d?u +?d?s?s?l?l?d?l +?u?s?s?u?d?u?d +?u?l?l?d?s?d?s +?s?d?s?l?d?l?l +?s?d?l?d?s?l?l +?d?u?s?d?u?u?s +?u?s?u?d?d?l?s +?u?l?d?d?s?s?l +?u?d?l?d?s?l?s +?s?d?l?s?l?d?l +?d?d?u?s?u?s?u +?u?u?s?s?d?d?l +?d?s?s?d?l?l?l +?s?s?d?l?l?l?d +?u?s?s?l?l?d?d +?u?d?l?l?d?s?s +?l?s?l?s?d?l?d +?s?l?s?d?l?l?d +?u?u?d?d?s?s?u +?l?s?s?s?s?s?s +?u?u?d?u?u?u?d?u +?u?d?d?d?u?d?d?d?d +?u?d?d?d?d?l?d?d?d +?d?l?d?d?d?l?d?d?d +?u?d?d?d?d?d?u?d?d +?d?d?l?d?d?d?d?l?d +?d?d?d?d?d?d?u?l?d +?d?d?d?d?d?d?u?u?d +?l?s?s?s?l?l?l +?l?l?s?l?l?s?s +?d?d?u?l?l?s?d?d +?l?u?u?s?d?d?d?d +?l?d?l?l?d?d?d?s +?d?l?l?l?d?s?d?d +?l?d?d?d?d?l?l?s +?l?s?l?d?l?d?d?d +?d?d?d?d?d?d?s?u?u +?d?d?d?d?d?d?s?s?l +?d?l?l?d?l?d?d?d?d +?d?d?u?l?u?d?d?d?d +?u?u?d?d?d?d?d?d?l +?u?l?d?l?u?l?s +?s?l?l?u?l?l?d +?u?u?u?s?u?d?u +?u?l?s?l?u?d?l +?u?u?u?s?l?l?d +?u?l?l?s?l?d?l +?u?u?s?d?l?l?l +?d?u?u?u?u?s?u +?u?l?l?u?l?s?d +?d?l?l?s?l?l?u +?u?l?u?l?l?s?d +?u?l?d?l?s?l?l +?s?l?d?l?l?l?u +?u?s?l?d?l?l?l +?s?u?u?u?u?d?u +?u?u?l?l?l?d?s +?d?d?d?d?l?l?l?l?d?d +?u?d?d?d?d?d?d?d?d?d?d +?l?l?l?d?d?s?s?s +?u?u?u?l?l?l?d?d?d +?d?d?s?d?d?d?s?d?d +?u?d?l?l?l?d?d?l +?u?l?l?l?d?d?l?d +?d?d?d?l?l?l?u?u +?u?l?d?d?l?d?l?l +?l?d?d?d?l?l?l?d?d +?d?d?l?d?d?l?d?d?d?d +?u?s?l?s?l?l?d +?u?d?l?l?s?l?s +?s?l?l?l?l?l?s?d +?l?s?d?l?l?s?l +?d?l?s?l?l?l?s +?l?s?s?d?l?l?l +?u?l?l?s?s?l?l +?l?l?l?s?l?s?d?d +?d?u?u?u?u?s?s +?u?l?l?d?l?s?s +?s?l?l?s?l?d?l +?l?l?d?s?s?l?l +?l?d?s?l?l?l?s +?l?l?s?s?l?l?d +?l?d?s?s?l?l?l +?l?s?l?d?s?l?l +?l?d?s?l?s?l?l +?l?l?s?l?s?d?l +?d?u?u?u?u?u?d?u +?u?d?d?u?l?l?l?l +?d?u?d?u?u?u?u?u +?u?l?l?l?l?l?s?d?d +?l?l?d?s?s?s?s +?l?l?l?d?d?d?d?s?s +?l?u?u?l?u?u?l +?u?u?l?u?l?l?l +?u?l?l?l?l?u?u?d +?l?l?u?l?u?l?u +?l?l?u?l?u?l?l +?l?u?u?l?u?l?l +?l?u?u?l?l?l?l +?l?u?u?u?u?l?l +?l?u?l?u?l?l?u +?u?u?l?l?d?d?d?s +?u?u?l?l?s?d?d?d +?l?l?d?l?l?s?d?d +?d?d?l?l?l?l?s?d +?s?s?d?d?d?l?l?l +?l?d?l?d?d?l?d?l?d +?s?d?l?l?l?l?s?d +?s?s?s?s?l?s +?l?l?l?l?l?s?d?s +?s?u?l?u?l?u?l +?l?u?l?l?l?l?s +?l?l?l?s?l?u?l +?u?l?l?s?l?l?u +?l?l?l?l?u?l?s +?l?l?l?s?l?l?u +?l?l?l?d?s?l?l?l +?l?d?l?d?d?d?d?d?d?d +?s?s?l?l?l?l?s?s +?u?s?l?s?l?s?l +?l?u?u?l?l?d?l +?d?l?l?u?u?u?l +?l?d?l?u?l?l?u +?d?l?u?l?l?l?u +?l?l?l?l?u?l?l?d +?u?d?l?u?l?l?u +?l?u?l?d?u?l?u +?d?l?u?u?u?u?l +?l?l?d?u?u?l?u +?u?l?l?u?u?d?l +?u?l?l?u?u?d?u +?l?u?l?u?d?l?l +?u?u?u?d?l?l?u +?l?u?u?u?d?u?u +?u?u?d?u?l?l?u +?u?l?u?u?d?u?u +?u?d?l?u?l?u?u +?l?l?d?u?l?u?l +?l?l?u?l?l?d?u +?l?l?l?u?d?u?u +?u?u?l?u?u?d?l +?l?l?u?d?l?u?u +?u?l?u?u?d?u?l +?l?d?l?u?u?l?l +?u?u?u?l?l?d?u +?u?u?d?l?u?u?u +?u?u?l?d?l?u?u +?u?u?l?u?d?u?u +?d?l?l?u?l?u?u +?l?l?u?u?u?d?l +?l?l?l?u?u?d?l +?l?u?d?l?l?u?l +?u?l?d?l?l?u?u +?u?l?d?l?l?u?l +?d?l?u?l?u?l?l +?l?l?d?l?u?l?l +?l?u?u?d?u?l?u +?l?l?u?l?u?u?d +?u?u?u?u?d?u?l +?u?l?l?d?u?l?u +?d?l?u?l?u?u?l +?l?u?l?l?u?l?d +?d?u?l?l?u?u?u +?l?l?l?l?d?l?d?s +?u?l?l?l?l?l?u?u +?l?d?d?l?d?d?d?d?l +?s?s?l?l?l?l?l?l +?u?l?l?l?l?l?s?s +?l?d?d?l?d?l?d?l?d +?l?d?d?l?d?d?d?d?d?d +?l?l?l?l?l?u?u?d +?l?l?l?l?u?l?l?l +?u?s?d?d?d?d?s?u +?d?d?d?d?u?u?s?s +?s?u?u?d?d?d?d?s +?l?s?l?d?d?d?d?s +?l?s?l?s?l?d?s +?l?s?l?s?d?l?s +?l?l?d?l?s?s?s +?d?l?l?l?l?l?l?u +?d?s?l?l?l?l?s?d +?l?l?l?l?d?d?l?s +?l?d?d?l?l?l?l?d?d +?l?l?l?l?l?s?d?d?d?d +?l?l?l?d?d?l?d?d?d +?l?l?l?s?d?d?s?d +?u?u?u?u?d?d?l?l +?l?l?l?d?d?l?l?u +?u?l?d?d?u?l?l?l +?u?l?u?u?l?u?d?d +?u?l?l?l?s?l?s +?s?l?u?l?u?l?s +?u?u?u?u?s?u?s +?u?s?u?u?u?u?s +?u?l?l?d?d?d?u?l +?l?l?l?d?d?d?u?l +?u?u?d?d?u?u?u?d +?l?l?u?l?d?d?d?l +?u?l?l?d?l?d?l?d +?l?l?d?d?d?u?l?l +?u?u?u?u?d?d?u?d +?l?d?l?l?l?l?l?d?d +?u?l?l?l?u?s?d?d +?l?d?l?l?d?l?l?s +?u?l?l?l?s?l?l?l +?l?s?l?s?l?s?s +?u?d?d?d?d?d?d?l?l +?d?d?d?d?d?l?l?d?l +?l?u?u?d?d?d?d?d?d +?l?d?d?l?l?l?l?l?l +?l?s?l?s?l?l?l?l +?l?u?l?l?u?l?d?d +?l?l?l?d?l?l?l?l?d +?u?u?l?l?d?d?d?d?d +?u?d?d?d?d?u?s?d +?d?d?s?d?l?l?d?d +?d?d?d?d?u?u?s?d +?l?d?d?d?d?l?s?d +?d?d?d?l?l?d?s?d +?d?d?u?d?d?u?d?s +?u?s?d?d?d?d?d?l +?l?d?d?d?s?d?d?l +?d?d?d?d?l?d?l?s +?u?s?l?d?d?d?d?d?d +?l?d?d?s?d?l?d?d +?s?d?u?u?d?d?d?d +?d?d?s?l?d?d?d?l +?d?s?d?l?l?d?d?d +?d?l?d?d?l?s?d?d +?d?d?d?l?s?l?d?d +?d?d?l?d?d?l?s?d +?l?d?l?d?d?s?d?d +?s?d?l?d?l?d?d?d +?u?d?d?d?d?d?s?l +?s?d?d?l?l?d?d?d +?u?d?u?d?s?d?d?d +?d?d?l?s?l?d?d?d +?d?d?l?d?d?l?d?s +?d?d?d?d?s?l?d?l +?l?l?l?l?d?d?s?l +?s?d?u?u?u?u?u?u +?l?l?s?s?l?d?d?d +?s?d?d?d?s?l?l?l +?u?d?d?l?d?d?d?d?d +?d?d?d?d?d?u?u?d?d +?l?l?l?l?l?l?l?d?d?d?d diff --git a/masks/rockyou-5-86400.hcmask b/masks/rockyou-5-86400.hcmask new file mode 100644 index 0000000000..6cb4f4e62a --- /dev/null +++ b/masks/rockyou-5-86400.hcmask @@ -0,0 +1,10613 @@ +?d +?d?d +?l +?d?d?d?d +?d?d?d?d?d?d +?d?d?d?d?d +?l?l +?d?d?d +?u +?s +?l?l?l +?u?u +?l?d +?d?d?d?d?d?d?d +?u?d +?l?l?l?l +?l?l?d?d?d?d +?u?u?u +?l?l?d +?u?l +?l?d?d?d?d +?l?l?l?l?l +?l?l?l?d?d +?l?d?d +?d?d?d?d?l +?l?d?d?d?d?d +?l?l?d?d +?s?d +?l?l?l?d?d?d +?l?l?l?l?d?d +?s?s +?d?d?d?d?l?l +?l?l?d?d?d +?d?d?d?d?d?l +?d?d?d?d?d?d?d?d +?d?l +?u?l?l +?l?s +?l?l?l?l?d +?l?l?l?d +?l?d?d?d +?l?d?l +?l?d?d?d?d?d?d +?u?u?u?u +?l?l?l?l?l?l +?d?d?d?l +?u?u?d +?d?d?d?d?d?d?l +?s?d?d +?u?d?d?d?d +?u?u?u?u?u +?d?l?l +?d?d?d?l?l +?u?u?d?d?d?d +?d?d?d?d?s +?d?d?d?d?u +?l?l?l?d?d?d?d +?l?l?l?l?l?d +?u?l?l?l +?u?u?u?d?d +?d?s?d +?l?s?l +?l?d?d?d?d?l +?d?d?s?d?d +?u?d?d +?d?d?l +?d?d?d?l?l?l +?u?d?d?d?d?d +?d?d?l?d?d +?d?d?s +?d?d?l?l?l +?d?d?l?l +?u?u?u?u?d?d +?l?l?d?d?d?d?d +?l?d?d?l?d?d +?u?l?l?l?l +?u?u?d?d?d +?d?d?l?l?d?d +?u?d?u +?u?u?u?d?d?d +?d?d?d?d?d?u +?u?u?d?d +?u?u?u?u?d +?l?d?l?d +?u?d?d?d +?d?d?u +?d?d?d?d?u?u +?d?l?l?l +?l?s?d +?l?d?d?d?l +?l?d?d?l +?s?d?d?d?d +?d?l?l?l?l +?l?l?s +?d?d?d?d?l?d +?d?d?d?d?d?d?d?d?d +?d?d?l?l?l?l +?l?l?d?l +?d?d?d?l?d +?l?d?l?l +?d?d?d?s +?l?d?l?d?d +?d?d?l?d?d?d +?l?l?l?l?l?d?d +?u?d?d?d?d?d?d +?l?l?l?l?d?d?d +?l?d?l?d?l?d +?s?s?s +?d?d?d?l?d?d +?d?s?d?d +?d?l?d?d?d +?u?u?u?d +?d?l?d?d?d?d +?l?l?l?d?l +?d?l?l?d +?d?l?d?d +?d?d?l?d +?u?l?l?l?d?d +?d?d?d?s?d +?d?d?d?d?d?s +?l?d?l?d?l +?u?l?l?d?d +?u?u?l +?l?d?d?l?d +?u?u?u?u?u?u +?l?l?d?l?l +?d?d?d?d?d?d?u +?l?d?l?l?l +?l?l?d?d?l +?u?d?l +?d?u?u +?d?l?l?l?d +?l?d?l?d?d?d +?d?s?d?d?d +?u?l?d?d?d?d +?u?s?u +?l?d?l?l?d +?d?d?d?d?l?l?l +?d?d?d?u?u +?l?l?d?d?l?l +?d?l?l?l?l?l +?u?l?l?l?d +?d?d?l?d?d?l +?s?d?l +?l?d?d?d?d?d?d?d +?l?u?u +?l?d?d?l?l +?l?l?l?l?s +?d?l?l?d?d +?d?d?l?l?d +?u?u?u?u?u?d +?l?s?d?d +?d?d?d?d?d?l?l +?d?d?s?d?d?d +?d?l?d?l?d +?l?l?d?l?d +?u?l?l?d?d?d +?s?d?s +?s?s?d +?d?l?l?l?d?d +?s?l?l +?u?u?s +?d?d?d?s?d?d +?d?l?l?l?l?d +?l?l?l?s +?l?l?d?d?d?l +?d?d?d?d?d?d?d?l +?s?d?d?d?d?d +?l?l?l?d?d?l +?d?d?d?d?s?d +?l?l?s?d?d +?l?l?l?l?l?l?l +?l?l?d?d?d?d?d?d +?d?d?d?l?l?d +?u?d?d?d?d?u +?l?l?l?l?d?l +?l?d?d?d?l?l +?d?l?d?l?d?l +?d?l?l?d?d?d +?u?l?l?l?l?l +?u?l?l?d +?l?l?l?l?l?l?d +?d?d?d?u?u?u +?u?u?u?d?d?d?d +?l?d?l?l?d?d +?l?l?l?s?d?d +?d?d?s?d +?d?l?d?l +?u?l?l?l?l?d +?u?l?d?d?d +?u?l?u +?l?u?l +?l?l?u +?d?d?l?d?l +?l?d?d?l?l?l +?l?l?d?l?l?d +?d?d?u?d?d +?d?d?d?d?d?d?s +?l?l?l?d?l?l +?l?l?l?l?d?d?d?d +?l?d?d?d?l?d +?d?d?u?u?u +?l?l?d?l?l?l +?l?d?l?l?l?l +?l?l?s?d +?d?l?d?d?l +?d?d?d?d?d?d?d?d?d?d +?d?d?l?l?l?d +?u?l?s +?d?l?d?l?l +?l?l?d?l?d?d +?l?d?l?l?d?l +?l?l?l?s?d +?d?s?d?s?d?d +?d?d?l?l?l?d?d +?u?d?d?u?d?d +?d?l?l?d?l +?s?d?d?d?d?s +?d?s?d?d?d?d +?d?u?u?u +?s?d?d?d?s +?d?d?d?u +?d?d?d?d?s?s +?d?l?d?l?d?d +?l?l?l?d?l?d +?u?u?d?d?d?d?d +?d?l?d?d?l?d +?d?u?u?u?u +?l?l?d?d?l?d +?d?d?d?d?d?d?l?l +?l?l?s?l?l +?u?l?u?l +?l?l?l?l?l?s +?l?d?l?l?l?d +?u?d?u?d?d +?s?d?d?d +?l?s?l?l?l +?u?d?d?d?u +?l?d?d?l?l?d +?l?l?l?l?u +?d?d?l?d?l?d +?u?d?u?u +?l?s?d?d?d?d +?l?d?d?l?d?l +?l?l?l?s?l +?d?d?d?l?d?d?d +?l?d?l?d?d?l +?l?l?s?l +?d?d?u?u?d?d +?d?d?d?d?u?d +?l?d?l?d?l?l +?d?s?d?s?d +?d?l?d?d?d?l +?u?u?l?l +?d?d?l?d?d?d?d +?d?d?d?l?l?l?l +?d?d?d?l?d?l +?l?s?l?l +?u?l?l?l?u +?l?l?l?l?s?d +?d?d?u?u?u?u +?d?d?d?d?l?d?d +?d?d?d?s?s +?u?s?d?d +?u?l?l?d?d?d?d +?d?d?d?s?d?d?d +?u?u?u?u?u?d?d +?l?l?s?d?d?d +?l?l?l?d?d?d?d?d +?s?s?d?d?d +?l?d?d?d?d?d?l +?d?d?d?u?d?d +?l?s?l?d?d +?u?u?u?d?u +?l?l?d?l?d?l +?d?d?u?d?d?d +?u?d?d?u?d +?d?d?d?d?s?d?d +?l?s?d?d?d +?d?d?d?d?u?l +?u?l?u?l?u +?u?u?u?u?d?d?d +?u?d?u?d?u +?l?u?u?u?u +?u?l?l?u +?u?d?u?d?u?d +?d?u?l?l +?u?u?d?u +?l?d?d?d?d?s +?u?d?d?d?d?l +?d?d?l?l?d?l +?d?u?d?d?d +?d?d?d?u?d +?u?l?u?d?d +?u?l?l?l?l?d?d +?u?d?d?u +?d?d?u?u +?l?d?u?d +?u?d?u?d +?u?l?d?d +?d?d?d?d?s?l +?u?u?d?d?u +?d?d?l?d?l?l +?l?s?l?s?l +?d?l?l?d?l?l +?d?u?d?d?d?d +?l?l?l?d?d?s +?u?u?l?l?l +?l?l?l?l?l?l?d?d +?l?s?l?s +?u?d?u?u?u +?s?l?l?l?l +?d?d?s?d?d?d?d +?d?l?l?d?l?d +?d?d?l?l?l?l?l +?d?l?l?d?d?l +?d?u?u?u?u?u +?u?d?u?u?d +?u?d?u?d?d?d +?d?l?d?d?l?l +?l?l?l?l?l?d?d?d +?d?l?l?l?d?l +?s?d?d?d?d?d?d +?d?l?d?l?l?d +?u?u?d?u?u +?u?l?u?d?d?d +?s?l?l?l +?d?u?d?u?d +?u?d?d?d?l +?s?s?s?s +?l?l?d?d?s +?d?s?d?l +?d?d?s?l +?s?l?d?d +?d?l?d?l?l?l +?u?u?u?u?s +?d?u?l?u +?u?d?d?d?d?d?d?d +?l?s?l?d?d?d +?l?u?u?u +?u?u?u?l +?d?d?l?l?d?d?d +?l?l?l?s?s +?u?d?d?l?d +?l?u?d?d?d +?d?d?u?u?d +?l?u?d?d?d?d +?d?d?d?d?d?l?d +?d?u?u?u?d +?s?s?d?d?d?d +?d?d?d?s?l +?d?d?d?d?l?s +?s?s?d?d +?u?l?u?l?d?d +?l?s?l?d +?l?l?l?u +?d?s?d?d?s?d?d +?d?d?s?d?d?s +?u?l?l?l?d?d?d +?u?u?u?s +?d?d?u?d?d?u +?u?d?d?u?u +?l?d?l?d?d?d?d +?d?l?d?d?d?d?d +?d?d?d?d?u?u?u +?u?s?d?d?d?d +?l?l?u?d?d +?u?u?d?u?d +?u?l?l?l?s +?d?d?s?d?s?d?d +?d?d?d?d?d?d?d?u +?d?d?d?d?d?s?d +?u?u?s?d?d +?d?d?d?d?d?u?u +?u?d?l?l?l +?u?u?d?d?u?u +?u?d?l?l?d +?d?d?u?d?u +?u?d?l?d?d +?d?l?l?l?l?l?l +?d?d?d?l?l?d?d +?s?l?l?l?s +?u?u?l?d?d +?d?d?u?l?l +?l?l?u?l?l +?l?s?l?l?l?l +?u?l?d?d?d?d?d +?l?l?d?d?d?s +?u?u?l?d?d?d +?l?d?d?d?d?d?d?l +?l?l?l?l?s?d?d +?l?u?u?d?d?d +?u?l?u?l?l +?l?l?d?d?d?l?l +?l?d?d?d?d?d?d?d?d +?u?u?u?u?u?u?d +?l?l?l?l?s?l +?d?d?d?d?l?l?d +?u?u?u?s?d?d +?l?l?d?d?d?d?l +?d?d?d?d?l?l?l?l +?d?u?u?u?u?d +?l?l?s?l?l?l +?l?l?u?d?d?d +?d?d?d?u?l +?u?l?u?l?d +?u?u?u?u?l +?l?d?d?d?s +?l?u?l?d?d?d +?l?l?l?l?d?s +?u?d?l?l +?d?u?d?u?d?u +?l?u?l?d?d +?d?u?u?d?u +?u?l?d?l +?u?u?d?l +?d?d?s?s?d?d +?l?l?s?d?d?d?d +?u?l?l?u?l +?d?d?s?l?l +?s?d?l?l?l +?l?u?l?l?l +?l?d?d?d?d?l?l +?u?u?d?d?d?d?d?d +?u?l?l?l?l?u +?d?u?u?u?d?d +?u?l?d?d?l +?u?l?d?l?d +?u?u?l?l?d?d +?l?d?l?d?l?d?d +?l?l?l?l?s?s +?u?u?u?u?u?u?u +?l?l?l?d?s +?l?l?l?s?l?l +?d?u?u?d?d?d +?u?u?u?u?d?u +?d?u?l?l?l +?u?d?d?l?d?d +?d?d?d?u?u?d +?l?d?d?d?l?l?l +?d?d?u?l?l?l +?l?l?l?u?u +?u?u?d?d?d?u +?d?d?d?u?l?l +?u?d?l?d?l +?l?u?l?u?l +?d?l?s?l +?s?l?l?d +?u?u?u?s?d +?d?s?l?l +?l?s?d?l +?l?l?d?s?d +?u?u?s?d +?u?s?d?u +?l?d?d?l?d?d?d +?d?u?u?d?d +?d?u?d?d?u +?d?d?d?d?d?d?d?d?l +?l?l?u?u +?u?l?l?d?l +?u?u?u?l?l +?s?l?l?l?l?l +?l?d?d?s?d?d +?l?l?l?s?d?d?d +?l?l?u?u?u +?d?d?s?d?d?s?d?d +?d?l?l?l?d?d?d +?u?u?s?u?u +?u?u?u?d?d?u +?d?d?d?d?d?l?l?l +?d?d?d?s?l?l +?u?s?u?s +?u?s?u?d?d +?u?l?s?d?d +?u?l?l?u?d?d +?u?d?d?l?l +?d?u?l?l?d +?d?u?d?u?u +?u?s?u?u?u +?u?l?d?l?l +?u?d?d?d?u?u +?u?l?l?l?l?l?d +?u?d?u?u?d?d +?s?l?l?l?l?s +?l?l?l?d?l?l?l +?u?d?d?d?d?s +?d?l?l?d?d?d?d +?d?l?l?l?l?l?d +?l?l?s?s?l +?l?d?d?d?l?d?d +?s?d?l?l?l?l +?l?s?l?l?d +?u?d?d?u?u?u +?l?d?l?d?s +?u?u?u?s?u +?d?d?d?d?l?u +?l?d?s?s +?l?d?d?s?d +?s?l?d?d?d +?s?d?d?d?l +?u?s?d?d?d +?d?s?d?d?l +?u?d?u?u?u?u +?u?l?l?s +?u?u?s?u +?d?l?d?l?d?l?d +?u?l?d?d?u +?d?l?l?l?l?d?d +?l?l?l?u?l +?l?l?l?d?d?d?l +?u?s?u?s?u +?d?d?d?d?d?d?d?s +?d?s?d?d?d?d?d +?u?u?s?d?d?d +?u?u?u?d?u?u +?l?l?d?d?l?l?l +?l?l?l?l?l?l?l?l +?l?u?u?u?d +?u?u?l?l?d +?u?l?l?u?d +?d?u?d?d?u?d +?d?u?l?l?l?l +?l?l?l?l?l?u +?u?u?d?u?u?u +?u?u?d?u?u?d +?u?l?l?u?l?l +?u?d?u?u?d?u +?s?s?s?d?d +?d?d?d?l?u +?d?d?u?l?d?d +?d?d?l?d?u +?d?d?d?s?d?d?d?d +?u?l?u?d?d?d?d +?u?u?u?u?u?s +?d?s?l?l?l +?l?s?l?l?d?d +?s?l?d?d?d?d +?u?l?l?l?l?s +?u?s?l?l?l +?d?d?s?d?s?d +?l?u?u?d?d +?l?d?d?l?d?d?l +?s?d?d?d?d?l +?u?d?l?d?l?d +?d?d?s?l?l?l +?s?l?l?l?d?d +?s?d?s?d?d +?d?s?s?d?d +?d?s?d?d?s?d +?d?s?d?d?s +?u?l?u?l?u?l +?u?d?l?l?d?d +?l?s?s?l +?u?u?s?s +?l?l?s?s +?u?d?l?l?l?l +?u?l?l?l?d?l +?d?d?u?d?d?d?d +?l?u?u?u?d?d +?u?l?l?s?d?d +?u?u?d?d?u?d +?d?d?u?u?u?d +?u?u?u?u?d?d?d?d +?l?d?d?d?d?u +?l?l?l?d?d?l?l +?l?l?l?u?d +?l?s?l?d?d?d?d +?u?u?d?u?d?d +?d?d?d?u?d?d?d +?u?u?u?u?s?d +?u?l?l?s?d +?l?s?l?d?l +?l?l?l?d?d?d?d?d?d +?u?l?u?u?l +?u?d?d?d?u?d +?d?u?d?u?d?d +?l?s?l?s?d?d +?s?d?d?s?d?d +?d?d?d?d?d?d?u?u +?u?d?l?l?d?l +?d?d?d?d?s?u +?l?l?d?d?l?d?d +?l?l?d?l?s +?l?d?l?l?d?d?d +?s?s?s?s?s +?u?d?l?d?d?d +?d?d?u?d?u?d +?l?l?l?l?l?l?l?d +?d?l?d?s?d +?d?d?s?d?l +?d?d?d?s?u +?u?d?u?u?u?d +?l?l?d?s?d?d +?u?s?u?d?d?d +?u?l?l?l?l?l?l +?l?l?l?l?l?d?l +?d?d?d?d?u?d?d +?l?l?l?l?l?l?s +?s?s?s?d?d?d +?d?d?l?l?s +?s?l?l?d?d +?l?l?l?u?d?d +?u?l?l?l?d?d?d?d +?u?u?l?l?l?l +?l?l?d?d?d?d?s +?l?d?l?d?l?d?l +?s?s?l?l?l +?u?d?d?d?d?d?u +?l?l?l?d?u +?l?u?u?l +?u?l?u?u +?l?u?l?l +?l?l?u?l +?l?u?l?u +?d?d?d?u?u?u?u +?u?d?u?d?d?u +?l?l?d?d?s?d +?s?s?s?l +?l?l?l?d?s?d +?l?l?s?l?d?d +?d?d?d?l?l?s +?u?l?l?u?u +?l?l?l?l?d?d?l +?l?d?l?l?s +?l?d?d?l?l?d?d +?u?l?d?d?d?d?d?d +?l?l?l?d?d?d?s +?u?d?u?d?u?u +?u?u?u?d?u?d +?l?s?l?l?l?d +?l?d?d?d?s?d +?l?d?s?d?d?d +?d?d?u?u?u?d?d +?d?d?d?s?s?s +?u?u?u?s?s +?l?l?l?l?d?d?s +?l?s?l?s?d +?l?l?s?l?d +?d?d?d?l?l?l?d +?l?l?l?l?d?l?l +?s?d?s?d?d?d +?d?d?s?d?s +?u?l?l?l?s?d +?l?l?d?l?l?l?l +?l?l?d?l?l?d?d +?u?u?d?d?s +?l?d?s?l?d +?l?d?d?l?s +?d?s?l?l?l?l +?l?d?d?u?d?d +?u?l?d?d?l?l +?u?d?d?l?l?l +?l?d?l?l?u +?l?l?u?u?d +?u?u?u?l?d +?s?d?d?d?d?d?s +?u?l?l?l?u?d +?l?s?d?l?l +?u?s?u?u +?u?l?s?l +?l?u?s?l +?d?d?l?l?l?l?d?d +?l?s?d?d?d?d?d +?d?d?l?u?l +?d?d?l?l?u +?l?l?d?d?u +?u?l?d?u?d +?l?l?l?l?l?s?d +?d?d?d?d?d?s?l +?u?l?l?d?l?l +?l?d?l?l?l?d?d +?l?u?u?u?u?u +?u?u?u?l?l?l +?d?s?d?s?d?s +?d?l?d?d?l?d?d +?d?l?l?l?l?s +?u?l?u?u?u +?d?d?l?d?l?d?d +?l?d?d?d?d?d?s +?u?d?d?d?l?l +?d?d?d?l?d?d?d?d +?d?d?d?d?l?l?d?d +?u?l?d?l?l?l +?l?l?s?l?l?d +?l?d?s?l?l +?d?d?d?d?s?l?l +?l?l?l?l?d?l?d +?d?d?d?l?s?l +?d?d?l?l?l?s +?l?u?l?l?u +?l?d?l?l?l?l?l +?d?d?l?l?d?d?d?d +?d?d?d?d?l?d?d?d +?l?d?d?u?d +?d?d?d?u?d?u +?l?l?d?l?d?d?d +?u?d?l?d?u?d +?d?u?l?d?d +?d?u?d?d?l +?d?d?d?d?d?s?s +?l?l?l?l?l?d?d?d?d +?l?l?d?d?d?d?d?d?d +?u?u?l?l?l?d +?d?d?d?d?l?d?l +?l?u?l?l?d?d +?u?d?d?u?u?d +?l?d?d?d?d?l?d +?l?s?s?l?l +?d?u?l?l?l?d +?d?d?s?d?d?l +?s?l?l?l?d +?d?l?l?l?s +?u?d?d?u?d?u +?s?l?s?l +?l?s?l?l?s +?s?u?u?s +?s?l?l?s +?s?s?l?l +?l?u?u?u?u?d +?l?s?d?d?l +?d?l?d?l?s +?d?s?d?l?l +?s?l?l?d?d?d +?d?l?s?l?d +?l?l?d?d?s?s +?u?u?d?l?l +?l?u?l?u?d +?d?d?d?l?l?d?d?d +?l?l?u?u?d?d +?u?l?l?d?d?l +?d?d?d?d?d?d?l?d +?d?d?d?d?u?l?l +?l?l?l?d?l?d?d +?u?d?d?l?l?d +?l?d?d?d?l?d?d?d +?l?d?l?s?d?d +?u?u?u?d?d?s +?l?l?d?s?l +?l?d?d?l?d?l?d +?l?s?l?s?l?s +?u?l?u?l?l?l +?d?d?u?d?u?u +?u?d?l?l?l?d +?u?u?d?d?l?l +?s?l?l?l?l?d +?l?l?l?l?u?d +?l?d?l?d?d?l?d +?u?l?u?l?u?d +?s?d?d?l?d +?u?d?d?d?s +?d?d?d?l?s +?u?d?d?s?d +?l?d?s?d?d +?d?d?d?u?s +?d?s?d?l?d +?u?l?l?d?l?d +?d?l?d?l?u +?u?l?d?l?d?d +?u?d?d?l?u +?d?d?l?u?u +?l?d?u?l?d +?d?u?d?l?u +?u?d?l?d?u +?d?l?l?u?d +?l?d?u?d?l +?d?d?l?d?d?l?d +?s?d?d?l?l?l +?u?u?u?d?d?d?d?d +?d?d?l?l?l?l?d +?d?d?d?l?l?l?l?l +?u?u?d?u?d?u +?l?u?u?l?d +?l?l?u?l?u +?l?u?l?l?d +?u?u?l?u?u +?l?l?u?l?d +?d?d?u?l?l?d?d +?l?d?d?l?l?l?l +?d?d?l?d?d?d?d?d +?u?d?d?l?d?l +?l?l?l?s?l?d +?d?d?d?d?d?d?d?d?d?d?d +?u?u?d?d?d?s +?d?l?d?l?d?d?d +?l?s?s?d?d +?l?d?l?l?d?l?d +?u?l?d?l?l?d +?u?u?u?d?d?l +?l?l?u?l?d?d +?d?d?d?d?u?s +?d?l?d?s?d?d +?d?d?u?d?d?l +?d?d?l?u?d?d +?u?d?d?d?l?d +?u?s?u?u?d +?s?l?l?d?l +?u?l?s?d?d?d +?u?u?u?u?u?u?d?d +?l?u?u?l?l +?s?d?s?d?s?d +?l?l?d?d?l?l?d +?l?d?l?d?l?d?l?d +?d?d?l?d?d?d?l +?d?d?d?l?d?d?l +?l?l?l?l?u?u +?d?d?d?u?l?u +?u?u?d?d?d?l +?d?d?u?u?u?u?u +?l?l?s?s?s +?l?l?l?s?s?s +?l?l?d?d?d?d?l?l +?d?s?d?d?l?l +?u?d?l?d?l?l +?u?d?d?d?d?d?l +?u?s?u?l?l +?l?u?u?u?l +?u?u?l?l?u +?l?l?u?u?l +?d?d?d?d?d?u?d +?d?d?d?s?l?l?l +?u?u?u?l?d?d +?d?d?s?s?d +?s?d?d?s?d +?d?d?d?d?d?u?l +?d?d?u?u?d?u +?u?l?d?d?l?d +?d?u?l?l?d?d +?l?u?l?u?d?d +?l?d?d?s?l +?l?s?d?l?d +?s?d?l?l?d +?s?l?d?d?l +?l?d?l?s?d +?d?d?s?u?u +?u?d?l?s?d +?s?d?d?l?l +?u?l?l?l?l?l?d?d +?d?d?d?d?d?d?d?l?l +?d?u?d?d?d?u +?d?u?l?d?d?d +?l?s?d?l?l?l +?l?l?d?d?l?l?d?d +?d?l?l?l?u +?u?l?u?u?d +?d?u?l?u?l +?u?l?u?u?d?d +?u?l?d?l?u +?u?l?d?u?l +?u?d?u?l?l +?l?d?l?u?l +?s?d?d?d?d?d?d?d +?l?d?l?d?l?s +?u?l?l?s?l +?u?l?l?s?u +?d?u?u?d?d?u +?d?u?u?u?d?u +?d?u?u?d?u?u +?l?d?l?d?s?d +?l?l?l?s?l?l?l +?d?d?d?d?l?l?s +?u?u?u?l?u +?s?u?u?u?s +?d?d?s?s?s +?s?s?d?d?s +?l?d?l?d?l?l?d +?u?d?d?s?d?d +?d?d?d?d?d?d?s?d +?l?l?s?s?d +?l?d?d?d?d?d?d?d?l +?u?l?u?l?d?d?d +?u?l?d?d?d?l +?l?l?l?u?u?u +?l?l?d?d?d?l?d +?u?l?d?d?u?l +?u?l?l?d?d?s +?u?u?u?u?u?d?d?d +?d?d?d?d?d?d?l?l?l +?u?s?u?s?d?d +?d?l?d?d?d?d?d?d +?l?u?l?d?d?d?d +?l?d?l?l?l?s +?d?u?d?l?d?d +?d?d?d?l?l?u +?u?d?u?d?d?d?d +?d?d?d?d?d?l?s +?u?d?d?d?d?d?d?d?d +?d?u?d?d?d?d?d +?d?u?u?u?u?u?u +?u?l?u?l?l?d +?u?s?u?u?u?u +?l?d?d?s?s +?s?l?d?d?s +?l?d?s?s?d +?d?l?d?s?s +?s?u?d?d?d?d +?d?d?s?l?d?d +?s?l?l?d?d?s +?l?l?l?d?l?l?d +?l?d?d?l?d?d?d?d +?l?l?s?d?l +?u?l?l?d?s +?u?s?l?d?l +?d?d?l?d?d?l?d?d +?u?d?l?d?d?l +?d?u?d?u?u?d +?u?l?l?l?u?l +?u?l?l?s?s +?u?l?l?l?l?d?d?d +?l?l?l?d?d?u +?d?d?d?d?d?l?d?d +?s?s?s?s?d +?l?u?l?u?u +?l?d?l?d?l?l?l +?d?d?d?d?s?d?d?d +?d?d?l?d?d?l?l +?l?l?s?s?d?d +?s?u?u?u?u +?u?l?s?u?l +?u?l?u?l?s +?l?d?l?l?l?l?d +?l?u?l?d?l +?l?u?d?l?l +?l?d?u?u?u +?u?l?u?d?l +?u?l?l?d?u +?l?d?l?u?u +?l?l?d?d?s?d?d +?d?d?l?l?l?l?l?l +?l?l?d?l?l?s +?d?d?d?s?s?d +?d?s?d?d?d?s +?l?l?l?s?d?d?d?d +?d?d?s?d?l?l +?l?d?d?d?l?s +?l?d?l?d?d?s +?d?d?d?u?u?l +?l?d?l?l?d?l?l +?l?l?d?l?l?l?d +?u?d?l?l?d?u +?u?l?d?l?d?l +?u?u?s?d?d?d?d +?l?l?u?l?l?l +?u?l?l?d?d?d?d?d +?u?d?d?d?d?u?u +?d?l?d?l?d?d?l +?d?d?l?d?d?u +?d?d?l?l?d?d?l +?d?l?u?d?d?d +?l?d?l?d?d?d?d?d +?d?d?d?s?d?l +?u?l?d?d?d?s +?d?d?d?s?u?u +?l?l?l?u?l?l +?l?l?l?d?d?l?d +?u?l?l?l?d?s +?d?l?l?l?d?d?d?d +?u?u?d?d?l +?d?l?l?d?u +?l?d?d?u?l +?l?d?d?u?u +?d?u?u?d?u?d +?l?u?d?l?d +?u?d?u?d?l +?d?l?u?l?d +?l?d?l?d?u +?u?d?d?u?l +?l?d?u?u?d +?d?u?d?u?l +?d?u?u?d?l +?d?l?u?u?d +?d?d?u?u?l +?u?d?u?l?d +?d?u?l?u?d +?u?u?d?l?d +?l?d?l?u?d +?d?u?d?l?l +?l?d?u?d?u +?u?d?l?u?d +?s?d?d?d?d?d?d?s +?l?u?l?l?l?l +?u?s?l?l?l?l +?u?u?u?u?s?u +?u?u?u?u?s?s +?s?d?s?d?s +?d?s?d?s?s +?l?l?d?l?l?d?l +?u?l?d?u?l?d +?l?d?l?l?l?d?l +?u?l?l?l?u?u +?s?l?d?l?s +?u?s?u?s?d +?l?d?l?s?s +?d?d?l?l?s?d +?u?d?d?d?d?d?d?u +?u?u?s?u?u?u +?l?s?l?l?d?l +?d?d?d?d?d?d?u?l +?l?l?d?d?u?u +?u?l?l?d?d?u +?u?s?u?d?d?d?d +?d?d?d?d?d?d?s?l +?s?d?u?u?u +?u?u?u?d?s +?u?u?s?u?d +?d?l?s?l?l +?l?l?l?d?l?s +?d?d?d?u?l?l?l +?l?l?d?d?d?u +?d?u?d?d?u?u +?l?l?l?l?l?d?s +?u?l?d?d?l?u +?d?d?d?d?d?d?s?s +?l?u?l?u?l?u +?l?l?l?l?d?d?d?d?d +?l?d?d?d?l?l?d +?d?d?d?l?d?l?d +?d?d?u?u?d?d?d +?d?d?d?l?l?l?s +?l?d?l?l?d?d?l +?s?d?u?u?u?u +?l?l?d?l?d?l?d +?d?l?d?l?l?d?d +?u?u?d?l?l?l +?l?l?s?l?s +?l?l?d?d?l?d?l +?u?d?s?d?d?d +?d?d?s?d?l?d +?s?d?d?d?d?u +?d?d?l?d?d?s +?s?d?l?d?d?d +?d?d?l?s?d?d +?l?d?d?l?l?l?d +?l?d?l?l?d?s +?u?l?s?l?l +?d?d?d?s?d?s +?s?d?d?d?s?d +?d?s?s?d?d?d +?l?u?d?d?d?d?d +?s?s?l?l?l?l +?l?d?u?d?l?d +?u?u?l?d?d?d?d +?u?d?d?u?s +?l?d?d?s?u +?s?d?u?u?d +?d?l?l?d?s +?l?u?s?d?d +?s?l?d?l?d +?d?d?u?s?u +?d?d?u?l?s +?l?d?l?s?l?d +?d?s?l?d?l +?u?d?u?d?s +?l?s?d?d?d?l +?u?d?l?d?s +?d?d?l?s?l +?d?l?d?d?d?l?d +?d?d?d?u?u?d?d +?d?d?d?u?l?d +?d?d?d?l?d?d?d?l +?d?l?d?u?d?d +?d?l?d?d?d?d?l +?d?d?l?d?u?d +?d?d?d?d?d?s?d?d +?l?l?u?d?d?d?d +?d?d?u?u?l?l +?u?d?u?u?l +?l?d?u?l?l +?u?u?l?d?u +?u?u?l?d?l +?l?l?u?d?l +?d?u?l?l?u +?u?u?u?d?l +?u?u?d?u?l +?u?l?d?u?u +?u?d?l?u?d?l +?u?u?l?u?d +?l?u?d?u?u +?l?l?d?u?l +?s?s?s?s?s?s +?d?d?d?d?l?s?l +?l?l?d?d?l?s +?l?l?l?l?l?l?d?d?d +?d?d?s?d?d?d?d?d +?l?s?d?s?d?d +?u?u?u?u?s?d?d +?d?d?s?d?d?s?d +?l?l?u?u?u?u +?u?d?d?d?d?d?d?l +?d?d?d?l?l?l?d?d +?d?d?l?l?l?u +?l?u?u?l?d?d +?l?u?u?d?d?d?d +?u?l?l?u?l?d +?s?l?l?d?d?d?d +?l?s?s?s?l +?s?s?s?l?l +?d?d?u?l?l?l?l +?l?l?l?s?d?l +?l?l?d?d?s?d?l +?l?d?l?d?d?d?l +?d?d?d?d?d?d?d?d?u +?s?l?l?d?s +?s?u?u?u?u?s +?l?l?l?l?u?l +?u?u?u?u?l?l +?l?l?l?l?d?u +?l?d?d?d?s?l +?s?d?d?d?l?l +?d?l?l?s?d?d +?l?d?d?l?d?s +?u?l?d?d?d?u +?l?d?l?u?d?d +?d?d?d?l?u?l +?d?d?d?l?u?u +?l?l?l?s?u +?d?d?u?l?u?l +?u?d?d?u?l?l +?l?l?s?s?l?l +?l?l?l?d?l?d?l +?u?u?u?s?u?u +?u?u?d?d?d?d?u +?l?d?d?s?d?d?d +?l?l?l?s?s?d +?u?u?l?l?d?d?d +?d?l?l?l?l?d?l +?s?s?d?d?s?s +?u?l?u?l?u?d?d +?u?u?d?d?d?u?u +?l?d?d?l?l?d?l +?u?u?u?u?u?l +?d?u?d?u?u?u +?l?s?l?s?l?d +?d?d?d?l?d?l?l +?d?d?d?d?s?s?s +?u?u?s?s?u +?s?l?s?l?l +?d?l?l?d?l?l?d +?l?d?d?d?l?d?l +?u?l?l?l?s?d?d +?l?s?l?l?l?d?d +?u?l?s?d?d?d?d +?d?s?d?l?l?l +?l?s?l?d?l?d +?u?u?u?l?l?d +?l?d?d?l?d?l?l +?u?s?l?d?d?d +?l?d?s?l?d?d +?s?s?d?d?d?d?d +?l?l?d?l?d?l?l +?d?d?d?d?d?d?d?d?s +?l?d?l?d?d?l?d?d +?d?s?d?s?d?d?d?d +?u?d?l?d?d?d?d +?u?u?u?s?d?d?d +?s?d?l?d?s +?d?s?l?d?s +?s?d?d?s?l +?s?l?s?d?d +?l?s?d?s?d +?d?d?s?s?u +?l?s?d?d?d?s +?d?d?s?l?s +?d?d?d?d?u?l?u +?l?l?s?l?l?l?l +?l?l?s?l?l?s +?u?u?u?u?d?s +?d?s?d?l?d?d +?d?l?d?d?d?s +?d?d?d?l?s?d +?d?l?s?d?d?d +?d?d?s?d?d?u +?d?d?u?s?d?d +?d?d?d?s?l?d +?d?s?d?s?d?s?d +?d?d?l?u?l?d?d +?d?d?l?d?l?d?l +?l?l?l?d?d?l?l?l +?u?l?l?l?d?u +?l?u?l?l?l?d +?d?l?u?l?s +?d?l?l?s?l +?u?s?d?u?u +?u?u?d?u?s +?l?d?l?s?l +?l?d?d?d?d?l?d?d +?l?l?l?l?l?s?l +?d?u?l?u?d?d +?l?l?d?u?d?d +?d?u?d?l?d?l +?d?d?u?l?d?l +?u?d?u?l?d?d +?u?d?d?d?l?u +?u?d?d?l?d?u +?l?d?u?l?d?d +?l?l?l?l?l?l?l?d?d +?d?u?u?d?d?d?d +?u?d?d?u?d?d?d +?u?u?l?l?l?d?d +?l?l?u?l?l?d +?l?u?u?l?u +?u?u?l?u?l +?d?d?s?l?l?l?l +?l?s?u?u?u +?l?l?s?d?l?l +?s?u?l?l?l +?s?l?s?l?s +?d?u?l?u?l?d +?d?l?l?l?s?d +?u?l?l?l?u?d?d +?d?d?d?d?u?u?d +?d?s?d?d?d?d?d?d +?d?l?d?l?l?l?l +?d?d?l?l?l?d?d?d +?l?l?s?l?l?d?d +?l?l?l?d?d?d?d?l +?l?d?d?s?l?d?d +?s?l?d?d?d?s +?d?l?d?l?d?l?l +?l?s?d?d?d?d?d?d +?l?d?d?d?d?d?d?s +?u?l?l?l?s?s +?d?d?d?d?u?u?u?u +?l?s?d?l?d?d +?s?d?l?l?d?d +?s?l?l?s?l +?s?u?l?l?s +?d?l?d?d?l?l?d +?l?l?s?d?d?s +?d?d?d?d?d?l?l?d +?l?l?l?u?l?d +?u?d?d?d?u?d?d +?u?s?u?u?d?d +?d?l?d?d?l?d?l +?l?l?l?l?d?s?d +?u?u?l?u?d?d +?l?d?s?l?l?l +?d?d?d?d?s?d?d?d?d +?u?s?d?d?d?d?d +?d?l?l?l?l?u +?d?l?l?l?d?l?l +?l?l?l?u?u?d +?l?l?l?l?l?s?d?d +?u?s?u?s?u?s +?d?l?l?d?l?d?d +?d?d?d?l?u?d +?d?u?d?d?l?d +?l?l?l?s?s?l +?l?s?l?d?d?l +?d?d?s?u?u?u +?u?s?l?l?d?d +?d?l?l?l?d?s +?u?u?s?u?d?d +?s?l?l?l?l?d?d +?l?d?l?d?d?l?l +?d?l?l?d?d?l?d +?d?d?s?d?d?l?l +?l?s?l?l?s?l +?l?l?u?u?l?l +?d?u?u?u?d?d?d +?u?u?d?l?l?d +?l?d?l?l?d?u +?d?u?d?l?d?u +?u?d?d?u?l?d +?u?d?l?d?l?u +?u?l?l?d?u?d +?d?d?d?l?l?d?l +?u?d?u?d?u?d?d +?u?d?l?d?d?u +?d?l?d?u?d?l +?l?u?d?l?d?d +?l?l?l?d?s?d?d +?s?l?s?d?d?d +?l?d?d?d?s?s +?d?l?l?l?l?l?l?l +?l?l?l?d?s?s +?l?d?d?d?d?d?d?d?d?d +?l?s?l?d?l?l +?s?d?d?s?s +?d?d?d?d?l?l?l?d +?s?u?u?u?d?d +?l?d?d?l?l?s +?l?l?d?l?d?d?l +?u?u?d?d?d?d?s +?l?d?l?l?s?l +?d?s?s?l?l +?l?s?s?l?d +?d?s?l?s?l +?l?l?s?d?s +?l?s?d?s?l +?s?l?s?l?d +?d?l?l?s?s +?l?u?d?s?s +?l?s?l?d?s +?d?d?l?l?s?s +?l?l?d?s?s +?u?s?l?s?d +?s?u?u?u?u?u +?l?l?l?l?s?l?l +?l?d?d?s?d?l +?l?d?d?s?l?d +?l?d?s?d?d?l +?u?l?d?d?d?d?s +?d?d?d?u?s?u +?d?s?l?l?d?d +?d?d?d?u?u?s +?u?d?d?d?d?d?s +?u?l?l?u?s +?d?d?d?d?d?d?l?s +?s?s?u?u?u +?u?l?l?u?d?d?d +?s?s?l?s?s +?l?l?d?s?l?l +?u?u?s?u?u?d +?d?d?s?s?l?l +?l?s?l?l?l?l?l +?u?s?u?l?l?l +?u?u?l?l?u?u +?d?s?s?s?s +?u?d?l?l?l?u +?u?u?u?u?l?d +?l?l?d?l?s?l +?u?d?d?d?u?u?u +?d?d?l?l?d?l?d +?l?l?l?d?d?s?d +?l?s?l?s?s +?l?l?l?s?d?s +?d?l?d?l?l?d?l +?d?l?d?l?d?l?d?l +?l?d?s?d?d?d?d +?s?d?d?d?d?d?l +?d?d?u?l?u?d?d +?d?l?l?d?d?d?l +?s?l?l?s?d?d +?u?u?u?d?l?l +?l?s?l?l?l?s +?l?s?s?l?l?l +?u?l?u?u?l?u +?d?l?l?d?l?l?l +?u?u?u?d?s?d +?l?d?l?l?s?d +?l?d?l?d?s?l +?s?l?l?l?d?d?d +?u?l?d?l?u?d +?d?d?l?l?u?u +?u?d?d?l?l?u +?l?d?l?u?d?l +?u?d?l?u?l?d +?u?s?l?l?l?d +?d?s?l?d?d?d +?d?u?d?s?d?d +?u?d?d?d?s?d +?d?d?d?l?d?s +?s?d?d?l?d?d +?d?u?d?d?d?s +?d?l?l?l?d?l?d +?l?d?s?l?d?s +?d?d?d?d?l?d?d?d?d +?s?l?l?l?d?s +?l?d?l?l?d?d?d?d +?d?d?u?u?d?l +?u?d?l?u?d?d +?u?u?d?d?l?d +?u?u?d?l?d?d +?d?l?l?d?d?u +?d?l?u?l?d?d +?u?d?u?d?d?l +?d?d?u?l?l?d +?u?d?d?d?u?l +?u?l?d?d?u?d +?d?u?l?d?l?d +?d?d?l?d?u?l +?u?l?u?u?l?d +?u?l?l?l?l?l?s +?d?u?l?l?l?l?l +?l?l?l?d?s?l +?s?l?l?l?l?l?l +?s?d?l?l?l?d +?l?l?d?l?d?s +?d?l?l?d?d?s +?l?s?d?d?l?l +?d?l?d?l?d?s +?l?d?d?l?s?d +?s?l?l?l?l?l?s +?d?d?l?d?l?l?l +?d?d?l?l?d?l?l +?d?l?d?d?l?l?l +?s?s?d?d?d?s +?s?l?d?d?d?d?d +?d?d?d?d?d?u?u?u +?d?l?d?l?l?l?d +?s?d?l?l?l?l?l +?l?l?l?s?l?d?d +?l?l?d?d?d?d?d?l +?l?l?l?d?u?u +?l?d?l?d?l?u +?l?u?l?d?u +?l?u?d?l?u +?u?l?u?d?u?d +?d?l?u?l?u +?u?d?l?l?u +?l?l?d?l?u +?l?d?l?l?l?u +?l?d?u?u?l +?d?d?u?l?l?u +?l?u?u?d?l +?l?u?u?d?u +?u?l?d?d?u?u +?d?u?l?l?d?l +?l?d?u?u?l?d +?u?d?l?l?u?d +?u?u?d?l?u +?d?l?l?u?u +?d?l?l?u?l +?d?l?u?u?u +?l?u?d?u?l +?u?d?l?u?l +?l?d?l?d?l?d?d?d +?s?s?s?d?d?d?d +?u?u?u?d?d?d?u +?l?l?l?d?d?d?d?s +?l?l?l?l?s?d?d?d +?l?s?s?s?d +?l?u?u?u?u?d?d +?l?l?l?s?l?s +?l?d?l?s?l?l +?l?s?l?s?d?d?d +?s?d?d?d?s?l +?s?s?l?d?d?d +?d?d?d?d?d?d?d?d?d?l +?u?d?d?d?d?l?l +?l?u?l?l?u?l +?l?l?u?u?u?d +?u?s?u?u?s +?u?s?s?u?u +?u?d?d?d?d?u?d +?d?d?d?d?d?l?u +?l?l?l?l?l?s?s +?d?l?l?l?s?l +?u?s?u?u?u?d +?u?d?d?u?d?d?u +?u?l?l?l?s?l +?u?u?d?d?s?s +?d?u?u?u?u?u?d +?l?d?l?u?l?l +?u?l?l?u?u?d +?u?u?u?d?u?u?u +?l?l?l?l?u?d?d +?u?d?d?l?l?d?d +?d?d?d?d?l?l?u +?d?d?l?d?l?l?d +?d?u?u?u?u?d?d +?d?l?s?l?l?l +?l?u?u?u?s +?u?s?l?l?u +?l?l?l?u?s +?d?l?l?s?l?l +?l?d?d?u?u?u +?u?l?u?d?d?l +?u?l?u?d?d?u +?l?d?d?u?l?l +?l?l?d?d?u?l +?u?u?l?d?l?d +?u?l?u?d?l?d +?d?d?l?u?l?l +?d?u?l?l?d?u +?u?u?u?u?u?u?u?d +?l?l?d?u?l?l +?u?l?l?d?l?u +?u?l?l?u?d?l +?d?l?l?u?l?l +?d?l?l?l?l?l?l?d +?u?l?l?s?d?d?d +?u?l?l?l?s?u +?s?s?l?l?d?d +?l?l?s?d?d?l +?d?d?l?l?s?l +?l?s?d?l?l?d +?l?l?s?d?l?d +?u?u?u?u?u?u?u?u +?d?l?l?d?l?d?l +?d?d?d?d?u?u?l +?l?d?d?l?d?l?d?d +?l?d?d?d?d?s?d +?d?d?d?d?d?s?u +?u?l?s?l?l?l +?s?s?s?s?d?d +?u?l?d?l?l?u +?l?s?l?s?l?l +?d?l?l?d?d?l?l +?l?l?l?d?d?s?s +?d?s?d?s?d?d?l +?s?l?d?l?d?d +?d?l?l?d?s?d +?d?l?d?d?l?s +?l?l?s?l?d?l +?s?l?l?l?d?l +?u?u?u?u?u?u?s +?u?d?d?d?d?l?d +?d?d?d?d?u?d?u +?u?l?l?d?u?l +?l?u?l?l?d?l +?l?d?l?d?s?s +?l?s?s?d?d?d +?d?l?l?d?d?d?d?d +?l?l?l?l?s?u +?u?d?u?d?l?l +?l?u?u?d?d?l +?l?l?d?u?u?d +?u?d?l?d?u?l +?u?u?u?d?l?d +?l?u?d?d?l?u +?l?u?d?l?l?d +?d?d?d?s?d?d?l +?u?u?d?d?u?u?u +?u?s?u?l?d +?u?l?s?l?d +?l?u?u?s?d +?u?s?u?d?u +?d?u?u?l?s +?l?d?d?s?l?l +?s?l?d?l?l +?u?d?u?u?s +?u?d?l?l?s +?l?u?l?d?s +?l?u?d?l?s +?d?u?s?u?u +?s?d?u?l?l +?s?l?d?l?d?l +?s?u?d?l?l +?u?s?l?l?d +?u?d?s?u?u +?u?u?s?d?u +?l?l?d?u?s +?s?u?d?u?l +?u?u?l?s?d +?l?u?l?s?d?d +?l?d?s?u?u +?l?d?s?l?d?l +?l?d?l?s?u +?l?l?d?d?s?l +?u?l?d?l?s +?u?l?u?l?l?u +?l?d?d?l?u?d +?d?l?u?d?l?d +?d?u?l?d?d?u +?l?l?d?d?u?d +?l?d?d?d?u?l +?l?d?d?d?u?u +?d?l?u?u?d?d +?d?l?l?l?d?d?l +?u?d?u?u?d?d?d +?l?u?d?d?l?d +?u?l?d?u?d?d +?d?d?l?u?l?d +?d?u?d?l?l?d +?l?d?u?d?d?l +?d?l?l?u?d?d +?d?d?u?d?u?l +?u?d?u?d?l?d +?u?l?l?l?l?l?l?d +?l?l?u?u?l?d +?u?l?u?u?u?d +?u?l?l?l?l?s?d +?u?l?l?s?l?l +?l?l?d?l?d?d?d?d +?l?l?d?s?d?d?d +?l?l?d?d?d?s?d +?d?d?l?l?d?d?s +?u?u?s?s?s +?s?l?l?s?s +?l?s?l?l?d?d?d +?s?l?s?l?d?d +?u?d?d?l?d?d?d +?l?s?s?s?s +?u?d?l?l?l?d?d +?l?l?l?d?l?l?l?l +?s?d?d?d?d?l?l +?d?d?l?l?d?d?l?l +?l?l?u?d?l?l +?d?d?l?l?l?d?l +?u?d?d?u?u?d?d +?d?u?d?u?d?u?d +?u?u?d?d?d?d?l +?u?l?u?l?d?d?d?d +?l?d?l?d?l?d?s +?u?s?l?s?u +?u?l?s?s?l +?l?s?u?s?l +?u?s?l?l?s +?u?s?l?s?l +?d?d?l?l?l?l?s +?s?l?d?d?l?l +?u?l?u?s?d?d +?d?l?d?l?s?l +?d?s?l?l?l?d +?d?l?l?d?l?s +?u?l?l?d?s?d +?l?l?d?d?d?d?u +?l?d?d?l?u?u +?u?u?l?d?d?l +?u?d?u?l?l?d +?l?u?d?d?l?l +?l?d?l?u?l?d +?l?u?l?d?d?l +?l?u?l?d?l?d +?l?d?d?l?d?d?l?d +?l?l?l?d?d?d?l?l +?s?d?u?l?l?l +?s?l?d?l?l?l +?d?l?d?l?d?d?d?d +?u?u?u?d?d?d?s +?d?s?d?d?d?d?l +?s?l?l?l?s?d +?l?l?l?d?u?l +?u?d?u?l?l?l +?l?u?d?l?l?l +?l?l?l?d?l?u +?d?d?d?d?u?d?d?d +?l?s?s?l?d?d +?s?s?d?d?l?l +?l?d?d?l?s?s +?u?u?u?s?s?s +?l?l?l?u?d?d?d +?s?u?l?l?l?s +?u?u?u?l?l?d?d +?u?d?l?l?d?d?d +?d?l?d?d?d?u +?l?d?d?d?u?d +?d?l?d?d?u?d +?l?d?u?d?d?d +?l?d?d?u?d?d?d +?d?d?u?d?l?d +?d?l?l?l?l?l?d?d +?l?u?u?u?d?d?d +?d?d?l?l?l?d?d?d?d +?u?u?u?d?d?d?d?d?d +?s?d?d?d?l?l?l +?u?l?d?u?l?l +?l?u?l?d?l?l +?l?l?l?u?d?l +?u?l?u?u?l?l +?u?l?l?u?l?u +?u?d?l?d?l?d?d +?u?u?d?d?u?d?d +?d?d?d?d?l?l?l?l?l +?l?s?d?d?s?d +?d?d?d?d?d?d?l?u +?u?l?s?u?l?l +?l?d?d?d?s?d?d +?d?s?u?u?u?u +?d?d?d?d?u?l?l?l +?d?s?d?d?s?s +?s?d?s?d?d?s +?l?u?d?d?d?d?d?d +?d?d?u?d?d?d?d?d +?l?d?d?d?d?d?l?l +?d?d?u?u?u?s +?u?l?l?l?d?d?s +?u?l?l?l?l?u?d +?u?l?l?u?l?l?d +?l?l?l?l?d?l?l?l +?s?s?s?l?l?l +?l?d?u?s?s +?s?l?s?u?d +?s?l?l?s?d +?l?s?s?d?l +?s?s?d?l?l +?u?d?s?s?u +?u?s?s?u?d +?l?d?s?l?s +?u?l?d?d?s?s +?u?l?d?s?s +?u?u?s?s?d +?s?s?l?d?l +?s?d?s?l?l +?s?u?d?u?s +?s?u?u?s?d +?s?s?l?l?d +?d?s?l?l?s +?s?s?u?d?u +?u?d?l?s?s +?u?u?d?u?u?u?u +?u?l?l?l?l?l?u +?l?l?d?l?l?u +?l?d?u?l?l?l +?s?d?d?d?u?u +?d?s?d?l?l?d +?u?d?l?s?d?d +?d?u?l?s?d?d +?d?d?s?l?l?d +?l?u?s?d?d?d +?u?l?d?s?d?d +?d?l?s?d?l?d +?u?d?d?u?s?d +?d?l?s?l?d?d +?d?d?l?d?l?s +?u?u?d?d?s?d +?d?d?u?l?d?d?d +?l?d?d?d?d?d?u +?d?d?u?d?u?d?d +?u?u?l?l?l?u +?u?d?l?l?l?s +?l?u?s?l?l +?l?u?s?l?u +?s?l?l?l?u +?s?l?l?d?l?l +?u?u?u?s?l +?u?l?s?u?u +?l?u?l?l?s +?l?l?s?l?u +?l?u?u?s?u +?u?u?u?u?u?s?d +?l?d?d?d?d?l?l?l +?d?l?l?d?u?u +?l?d?d?l?u?l +?l?l?l?d?u?d +?u?l?d?l?d?u +?d?d?l?l?u?l +?d?l?l?u?u?d +?d?l?u?u?d?l +?d?u?l?l?u?d +?l?l?d?d?l?u +?u?l?d?u?d?l +?d?u?d?l?l?l +?u?d?u?u?l?d +?u?d?d?l?u?l +?u?d?u?d?u?l +?l?d?u?l?d?l +?u?l?d?u?u?d +?d?l?d?d?d?l?l +?d?d?d?u?d?d?d?d +?u?d?u?d?u?d?u +?d?d?d?s?s?d?d +?d?d?s?d?d?d?l +?d?d?d?d?s?d?l +?l?d?d?d?d?s?s +?u?u?u?u?u?d?u +?u?l?d?l?u?l +?u?d?l?u?l?l +?l?u?l?u?l?d +?d?l?u?l?l?l +?l?d?u?u?u?u +?l?d?l?l?u?l +?l?u?l?l?l?u +?u?u?d?u?l?l +?d?u?l?l?l?u +?u?u?u?s?u?d +?d?u?u?u?u?s +?l?d?d?d?d?l?s +?u?d?d?l?d?d?u +?u?l?d?d?d?d?l +?l?l?d?d?d?d?d?d?d?d +?d?l?l?l?l?d?d?d +?u?l?u?l?l?d?d +?l?d?s?d?s?d?d +?u?s?s?s?u +?u?s?u?s?s +?u?l?u?u?u?u +?s?u?l?l?l?l +?l?l?s?l?d?d?d +?l?s?d?d?s?l +?l?s?d?l?s?d +?u?u?s?s?d?d +?d?u?l?l?l?l?d +?d?d?l?d?d?d?d?l +?d?d?d?d?l?d?d?l +?s?d?d?u?u?u +?u?l?u?d?d?s +?u?l?d?d?l?s +?u?d?u?d?u?s +?l?d?s?l?l?d +?d?l?d?l?l?s +?d?d?u?l?l?s +?u?d?u?u?u?d?d +?d?d?d?d?u?u?d?d +?d?d?d?u?u?u?d +?u?l?d?d?l?d?d +?d?d?d?s?d?s?d +?u?u?l?l?d?d?d?d +?u?d?l?l?l?l?l +?u?u?u?d?d?u?u +?u?u?d?u?u?d?d +?l?l?u?u?d?d?d +?l?u?l?l?u?d +?d?u?u?l?l?l +?d?d?d?s?d?u +?s?d?d?d?l?d +?d?u?d?d?s?d +?d?l?d?d?s?d +?s?d?d?u?d?d +?d?s?d?d?d?l +?d?l?s?d?d?d?d +?d?s?d?d?l?d +?d?d?u?d?s?d +?l?d?d?l?d?d?s +?l?l?l?l?d?d?l?l +?d?d?u?d?l?l +?d?d?u?u?l?d +?l?l?l?d?d?d?u +?d?d?l?u?d?l +?l?d?d?u?l?d +?d?d?l?l?d?u +?d?l?d?u?u?d +?d?u?u?d?l?d +?d?d?l?l?u?d +?l?u?d?d?u?d +?d?d?u?l?d?u +?d?l?d?u?d?u +?d?l?d?d?l?u +?d?l?d?l?d?u +?d?l?d?d?u?l +?d?l?u?d?u?d +?d?l?l?d?u?d +?l?u?d?d?d?l +?l?d?d?l?d?u +?u?l?l?d?d?d?s +?d?l?d?l?u?d +?u?d?d?l?u?d +?d?d?u?d?l?u +?d?u?d?d?l?l +?s?d?d?l?l?l?l +?l?l?u?l?l?u +?l?l?s?d?d?d?d?d +?d?d?d?s?d?l?l +?l?s?l?s?l?d?d +?u?u?u?d?d?d?l +?s?d?d?d?s?s +?d?d?d?d?s?s?d +?d?s?d?s?d?d?d +?u?l?l?u?u?u +?u?u?d?d?d?d?d?d?d +?l?l?s?l?s?d +?l?d?l?l?s?s +?d?l?l?l?s?s +?l?s?l?l?s?d +?u?s?u?s?u?d +?l?l?d?u?d?l +?d?l?l?l?u?d +?l?l?d?u?l?d +?d?u?u?u?l?l +?u?u?d?d?u?l +?d?d?u?l?u?u +?d?l?l?d?l?u +?d?d?l?u?u?u +?l?l?u?d?d?l +?d?l?u?l?l?d +?d?l?d?l?l?u +?u?l?d?u?l?u +?l?d?u?u?d?u +?u?u?u?u?d?l +?u?l?u?l?d?l +?l?l?d?l?u?d +?l?l?u?l?d?l +?l?u?d?l?d?u +?l?u?d?l?d?l +?l?u?l?d?d?u +?d?l?d?l?u?l +?u?u?u?u?d?u?u +?u?d?d?d?l?l?l +?s?u?u?d?d?s +?l?s?l?d?d?s +?l?l?l?l?d?d?d?l +?l?l?l?l?l?d?d?l +?u?l?l?d?l?l?l +?u?l?l?l?l?d?l +?u?l?l?l?d?l?l +?d?d?d?d?l?u?l +?u?l?d?d?d?d?u +?d?d?d?d?d?d?u?d +?l?l?d?d?d?s?s +?s?s?l?d?s +?l?d?s?s?s +?s?l?s?s?d +?s?l?d?s?s +?s?d?s?l?s +?s?s?s?u?d +?l?u?u?u?u?l +?u?u?u?u?d?d?s +?l?l?l?l?d?d?d?s +?s?s?d?d?d?l +?d?d?d?d?s?s?l +?d?d?d?s?l?s +?d?d?d?l?s?s +?u?d?d?d?s?s +?d?d?d?s?s?l +?l?s?d?d?s?d?d +?u?u?d?d?d?l?l +?l?l?l?d?l?l?l?d +?s?d?l?l?l?s +?l?l?s?l?s?l +?u?s?s?l?l +?u?s?u?s?l +?l?l?l?u?u?l +?d?l?d?d?d?l?d?d +?s?d?l?l?d?l +?u?l?s?l?d?d +?s?u?l?l?d?d +?l?l?d?l?s?d +?l?d?l?s?d?l +?d?d?d?d?s?u?u +?l?l?l?s?s?d?d +?s?s?d?d?d?d?d?d +?l?s?l?l?l?l?d +?s?l?l?s?l?l +?d?d?d?d?d?l?d?l +?l?d?d?d?d?d?l?d +?u?l?l?l?u?s +?d?d?d?d?d?l?l?l?l +?d?d?s?s?s?s +?d?l?u?u?u?u +?u?u?u?l?d?l +?u?u?l?l?u?d +?u?l?d?u?u?l +?d?d?d?u?u?d?d?d +?l?d?d?l?d?d?l?d?d +?u?l?l?u?l?l?l +?u?s?l?l?d?l +?d?u?l?l?l?s +?d?d?d?d?u?u?s +?s?s?s?l?s +?l?l?d?d?l?d?d?d +?l?u?u?l?l?l +?u?l?l?u?u?l +?u?l?u?l?u?u +?l?d?d?l?l?d?d?d +?l?l?s?s?s?s +?u?u?l?l?l?l?d +?u?l?l?l?u?l?l +?l?l?l?l?l?l?l?l?l +?u?l?l?u?l?d?d +?u?l?d?d?l?l?l +?s?l?d?d?l?s +?l?l?l?s?d?d?s +?d?d?d?d?l?d?l?d +?u?l?u?l?u?s +?u?l?d?l?l?d?d +?l?l?l?l?l?d?d?s +?d?d?d?s?d?l?d +?d?d?d?l?d?d?s +?l?l?l?l?l?l?d?l +?u?u?u?d?u?s +?u?l?u?l?s?d +?l?u?u?l?l?d +?u?u?l?l?d?l +?d?l?l?u?u?l +?l?l?d?u?u?u +?u?l?u?l?d?u +?s?l?l?l?d?d?s +?s?d?d?d?s?d?d +?u?d?d?d?u?d?d?d +?u?l?d?l?l?l?l +?l?l?d?d?d?l?l?l +?u?d?l?d?u?d?d +?u?u?u?l?u?u +?l?d?l?l?l?d?d?d +?s?s?l?l?s?s +?s?d?u?u?d?d +?d?d?d?s?u?l +?d?d?l?l?d?s +?d?d?s?l?d?l +?d?d?d?u?l?s +?u?l?d?d?s?d +?u?d?d?d?u?s +?d?l?d?s?l?d +?l?u?d?d?d?s +?l?d?s?d?l?d +?s?l?d?d?d?l +?s?d?l?d?l?d +?d?d?d?s?l?u +?d?d?d?d?s?l?l?l +?u?d?d?d?l?d?d +?u?u?u?l?l?l?d +?s?l?s?d?d?d?d +?d?l?d?l?d?l?s +?l?l?l?l?l?l?s?d +?l?l?d?u?d?u +?u?u?l?d?d?u +?l?u?d?l?u?d +?d?l?d?u?u?u +?d?u?u?u?d?l +?l?d?u?d?l?u +?l?d?u?d?l?l +?l?u?d?d?u?l +?d?l?u?l?d?l +?u?l?d?d?d?l?l +?l?d?d?l?l?u +?d?u?l?d?l?l +?d?u?d?l?l?u +?l?d?l?d?u?u +?l?d?l?d?u?l +?d?l?l?u?d?l +?l?d?u?l?l?d +?l?d?u?d?u?l +?l?d?l?u?u?d +?u?d?u?l?d?l +?d?l?l?l?d?u +?l?l?l?l?l?l?u +?l?l?u?u?u?l +?u?l?l?d?d?l?l +?u?l?l?l?d?d?l +?d?s?l?l?l?l?l +?u?l?u?l?u?l?u +?l?l?d?s?d?l +?u?d?l?d?l?s +?u?u?l?s?d?d +?s?l?d?l?l?d +?d?l?l?l?l?l?s +?d?d?l?s?l?l +?u?d?d?l?s?l +?l?d?s?d?l?l +?l?l?d?d?l?l?l?l +?u?u?u?u?d?u?d +?s?l?l?l?l?l?d +?u?d?u?d?d?u?d +?d?d?d?d?u?s?u +?u?u?u?u?d?d?u +?s?s?s?d?s +?s?s?d?s?s +?s?d?s?s?s +?d?l?d?d?l?d?d?l +?l?l?u?d?u?l +?d?l?l?l?u?l +?u?u?l?d?u?u +?l?u?u?d?l?l +?l?u?d?u?u?u +?l?l?d?l?l?d?d?d +?l?l?d?l?s?s +?l?d?l?s?l?s +?s?s?d?s?d?d +?d?s?s?s?d?d +?d?d?s?s?d?s +?d?d?d?s?d?d?s +?d?d?s?s?d?d?d +?s?l?s?s?l +?l?s?s?l?s +?u?s?l?s?s +?u?l?l?d?d?d?d?d?d +?u?d?u?u?u?u?u +?u?l?l?l?l?l?l?l +?l?u?l?l?l?d?d +?l?l?l?l?l?d?l?d +?d?d?d?d?d?u?s +?d?d?l?s?l?s +?d?l?s?d?l?s +?s?l?d?l?d?s +?d?l?l?d?s?s +?u?l?s?s?d?d +?d?d?u?u?d?d?d?d +?l?l?l?l?l?u?d +?u?l?l?d?d?d?l +?l?l?l?l?l?d?l?l +?u?u?u?u?l?u +?l?d?d?d?l?l?d?d +?l?d?l?d?s?d?d +?s?l?s?l?l?l +?d?d?d?d?d?d?d?d?l?l +?u?l?l?l?l?d?d?d?d +?u?u?d?u?d?d?d +?u?d?d?l?d?d?l +?d?d?d?l?l?l?d?d?d +?u?s?u?u?d?u +?u?l?l?s?l?d +?u?u?u?l?d?d?d +?u?l?u?l?u?l?d +?l?l?l?u?l?u +?d?d?d?s?u?u?u +?u?d?d?l?l?l?l +?u?d?d?d?d?d?d?d?u +?l?l?l?d?d?l?d?d +?l?l?l?l?l?l?l?l?d +?u?d?u?u?d?u?d +?l?l?l?l?u?s +?d?d?s?l?l?d?d +?l?d?l?s?d?d?d +?u?s?l?d?d?d?d +?d?d?l?l?s?d?d +?u?u?l?l?d?u +?d?u?u?u?u?l +?d?l?l?l?u?u +?d?u?l?u?l?l +?u?d?l?l?u?l +?u?l?u?d?l?l +?u?l?u?d?u?l +?d?l?l?u?l?u +?l?u?u?d?l?u +?l?l?d?l?u?l +?u?u?u?d?l?u +?l?u?l?d?l?u +?l?l?d?d?d?l?d?d +?l?d?d?d?d?d?d?u +?u?s?d?d?d?d?d?d +?u?u?l?l?l?l?l +?u?l?u?d?d?d?d?d +?u?u?u?l?l?u +?u?d?l?d?l?d?l +?l?l?u?l?l?d?d +?l?l?l?l?l?l?l?s +?u?d?d?u?d?u?d +?d?d?u?d?d?l?d +?d?u?l?d?d?d?d +?d?d?l?d?l?d?d?d +?d?d?u?d?d?d?u +?l?d?d?l?l?l?d?d +?d?d?d?d?d?d?d?u?u +?u?d?d?d?d?d?d?s +?s?s?l?l?l?d +?l?s?l?d?l?s +?u?s?d?l?l?l +?u?u?u?s?u?u?u +?l?l?l?l?d?d?d?d?d?d +?l?d?l?l?d?l?d?d +?u?d?l?l?d?l?d +?d?d?l?s?d?d?l +?d?d?l?s?l?d?d +?d?d?d?u?u?u?u?u +?u?u?u?u?u?d?d?d?d +?s?l?l?l?s?d?d +?d?d?d?l?d?l?d?d +?d?d?l?d?d?d?l?d +?s?u?d?d?d?s +?l?d?s?d?s?d +?l?d?s?d?d?s +?d?l?d?d?s?s +?u?d?s?d?s?d +?d?s?l?s?d?d +?u?d?s?s?d?d +?u?s?d?d?s?d +?d?d?u?u?u?u?d?d +?u?u?u?d?u?d?d +?d?d?d?d?s?l?d +?d?d?l?s?d?d?d +?d?d?s?d?d?l?d +?u?l?l?l?d?l?d +?s?l?l?l?s?s +?d?l?d?d?l?d?d?d +?s?l?l?d?d?l +?u?l?s?d?d?u +?l?s?d?l?d?l +?s?l?l?d?l?d +?u?l?s?u?d?d +?l?u?u?s?d?d +?d?l?s?l?d?l +?u?d?l?l?d?s +?s?d?l?d?l?l +?d?u?d?l?d?u?d +?u?l?d?l?d?d?d +?l?u?u?u?u?u?d +?d?d?s?l?l?s +?s?d?l?l?s?d +?d?d?s?l?s?l +?u?s?l?s?d?d +?d?l?s?l?s?d +?d?u?l?l?l?d?d +?d?l?d?l?d?l?d?d +?d?d?d?d?d?d?d?s?d +?u?l?d?l?u?u +?l?d?l?u?u?l +?d?u?l?u?l?u +?u?d?u?u?u?l +?l?u?u?u?l?d +?l?l?l?u?u?d?d +?u?l?l?u?d?u +?l?u?l?u?d?l +?l?d?l?u?l?u +?u?u?l?d?l?l +?l?d?u?u?l?l +?u?d?l?l?u?u +?l?l?l?u?d?u +?l?u?l?u?u?d +?d?d?s?d?d?s?l +?l?s?d?d?d?d?s +?s?l?d?d?d?d?s +?d?d?d?l?l?l?l?d +?l?s?d?l?l?l?l +?u?d?l?l?l?l?d +?u?s?u?l?u +?s?l?u?l?l +?u?l?d?l?l?s +?l?s?u?l?l +?u?d?u?u?u?s +?s?l?l?u?u +?u?s?u?u?l +?u?l?u?u?s +?u?s?l?u?l +?l?s?l?l?u +?u?l?s?l?u +?l?l?u?l?s +?u?u?l?s?l +?l?l?s?u?l +?u?s?u?l?l?d +?l?u?l?u?s +?l?s?l?u?l +?l?u?u?s?l +?u?l?u?s?u +?d?s?u?l?l?l +?u?l?u?s?l +?u?l?l?d?l?d?d +?u?u?d?u?d?l +?l?l?u?d?d?u +?u?u?d?l?d?l +?u?u?d?l?d?u +?l?l?d?l?d?u +?l?l?u?d?l?d +?d?d?u?u?u?l +?d?d?l?u?u?l +?d?u?u?d?l?l +?u?u?d?l?u?d +?u?d?l?d?l?l?d +?u?l?d?d?d?u?l +?u?d?u?u?d?l +?d?u?u?l?l?d +?l?u?d?u?l?d +?d?l?l?d?u?l +?d?u?l?d?l?u +?u?d?u?d?u?u?d +?d?l?u?u?u?d +?u?d?d?u?l?u +?d?l?d?l?u?u +?u?l?l?s?d?d?d?d +?s?d?d?d?d?d?d?d?d +?s?l?s?s?s +?l?l?l?l?d?d?u +?l?u?l?u?l?l +?u?u?l?l?u?l +?d?s?d?d?d?s?d +?s?d?d?s?d?d?d +?s?d?s?d?d?d?d +?d?d?d?d?d?d?s?d?d +?l?l?l?l?d?l?d?d +?l?l?l?d?d?s?d?d +?l?d?l?l?l?l?d?d +?d?l?d?d?d?d?l?d +?l?u?l?u?d?d?d +?l?d?l?l?l?l?l?l +?l?l?d?d?d?d?l?d +?d?d?l?l?l?l?l?d +?l?d?d?s?d?d?l +?l?d?l?d?d?d?s +?s?l?l?d?l?s +?u?d?d?l?d?l?d +?l?l?l?l?s?l?d +?l?l?l?l?s?s?s +?l?d?d?l?l?d?d?l +?l?l?s?l?l?l?d +?l?u?u?l?u?u +?l?u?u?u?l?l +?u?u?l?u?l?l +?l?l?l?d?l?d?d?d +?l?l?d?d?d?d?d?s +?u?l?l?l?l?d?s +?l?l?d?l?l?l?l?l +?l?l?s?s?d?d?d +?u?l?l?u?d?d?d?d +?d?l?d?d?d?d?d?l +?s?l?d?d?d?d?d?d +?s?u?d?d?d?d?d?d +?s?d?d?d?d?d?d?l +?l?l?l?s?l?l?d +?s?d?d?d?d?s?l +?u?u?u?l?l?l?l +?u?d?d?u?u?u?u +?s?u?u?u?u?d +?u?l?l?d?l?s +?u?s?d?u?u?u +?d?d?d?d?d?d?s?u +?d?d?u?d?d?u?d +?d?d?d?d?u?d?l +?s?s?d?s?s?d +?d?d?s?d?s?d?d?d?d +?l?u?u?u?d?u +?l?u?u?u?d?l +?u?u?u?d?u?l +?u?u?l?u?d?u +?l?u?l?d?u?l +?u?l?l?d?u?u +?u?u?d?u?u?l +?d?u?l?l?u?l +?u?d?l?u?l?u +?l?u?d?u?u?l +?u?d?u?u?l?l +?u?l?d?u?u?u +?d?d?s?l?d?d?d +?d?s?l?d?d?d?d +?u?u?d?d?s?d?d +?d?l?d?s?d?d?d +?l?s?d?d?d?d?l +?l?d?d?d?d?s?l +?d?d?d?d?l?s?d +?l?u?l?u?l?d?d +?d?d?d?d?d?u?l?d +?s?l?d?l?l?s +?s?s?d?l?l?l +?l?l?d?l?l?l?d?d +?d?u?d?u?l?d +?l?d?d?u?u?d +?d?u?l?d?d?l +?l?d?d?d?l?u +?l?d?u?u?d?d +?d?d?u?l?u?d +?l?d?d?u?d?l +?l?u?d?d?d?u +?d?u?u?d?d?l +?l?d?l?d?d?u +?u?d?d?u?d?l +?l?u?d?u?d?d +?u?u?d?d?u?u?d +?l?d?l?d?u?d +?d?d?l?u?u?d +?d?u?d?l?u?d +?d?l?u?d?d?l +?d?u?d?d?l?u +?l?d?d?u?d?u +?d?d?d?d?s?l?s +?u?u?d?d?d?d?u?u +?u?d?u?d?d?d?d?d +?u?d?u?d?u?d?u?d +?d?s?d?s?s?d +?s?d?d?s?s?d +?s?d?d?s?d?s +?s?d?d?d?d?s?d +?u?u?l?u?u?l +?u?l?u?l?l?l?l +?l?u?l?u?u?l +?l?l?u?l?d?d?d +?u?d?l?d?u?d?l +?u?l?d?l?d?l?d +?l?u?l?l?d?d?d +?d?s?d?l?l?l?l +?s?d?l?l?d?s +?s?d?d?s?l?l +?s?l?l?d?s?d +?s?d?l?s?d?l +?d?s?l?l?s?d +?l?s?l?d?s?d +?s?d?l?d?l?s +?l?s?d?s?l?d +?l?l?l?d?d?d?d?d?d?d +?d?l?d?s?d?l?d +?d?d?l?d?d?l?s +?d?d?d?d?s?u?l +?u?d?d?s?u?d?d +?l?d?l?l?s?d?d +?u?u?l?l?s?d +?u?s?l?d?l?l +?u?l?s?l?l?d +?l?s?s?d?d?d?d +?l?u?u?u?u?u?u +?l?d?l?d?l?l?d?d +?d?d?d?u?u?l?l +?u?s?u?l?s +?s?l?s?u?l +?s?l?l?s?u +?l?s?u?l?s +?l?l?s?s?u +?l?s?l?s?u +?l?l?s?d?s?l +?s?u?l?u?s +?s?u?u?s?u +?l?s?l?l?d?s +?l?l?s?u?s +?u?u?s?u?s +?s?s?u?l?u +?u?l?u?s?s +?l?l?l?l?l?l?d?d?d?d +?l?u?l?u?u?u +?l?l?d?s?l?d +?u?u?d?d?s?u +?s?d?d?u?l?l +?d?s?d?u?u?u +?d?l?l?s?d?l +?u?d?s?l?d?l +?u?s?d?l?d?l +?u?s?l?d?l?d +?u?d?l?d?s?l +?u?d?u?s?u?d +?l?d?d?l?s?l +?u?d?u?u?d?s +?l?u?l?d?d?s +?d?d?u?d?d?u?u +?u?d?d?l?u?d?d +?l?u?u?u?u?s +?l?l?l?d?l?l?d?d +?l?d?d?d?l?l?l?l +?l?s?l?s?l?s?l +?l?d?d?d?l?d?d?l +?s?s?s?d?d?s +?d?d?d?s?d?d?d?s +?l?d?l?l?u?u +?l?d?l?u?u?u +?u?d?u?l?l?u +?d?u?l?u?u?l +?u?d?u?l?u?l +?u?u?u?l?u?d +?u?u?l?u?u?d +?u?u?l?d?u?l +?l?u?u?l?d?l +?u?l?u?u?d?l +?u?l?u?u?d?u +?u?u?u?l?d?u +?u?l?u?d?u?u +?u?d?l?u?u?u +?u?d?u?l?u?u +?u?u?d?d?l?l?l +?d?d?l?l?l?l?l?d?d +?d?d?d?u?l?u?l +?l?s?l?d?d?d?d?d +?d?d?d?d?d?d?l?d?d +?s?l?s?l?s?l +?u?d?l?l?d?l?l +?u?l?u?l?l?l?d +?u?u?l?u?u?u +?u?s?l?l?l?d?d +?l?d?d?l?l?l?l?l +?d?d?u?l?l?l?d?d +?u?l?u?u?d?d?d +?l?l?l?u?l?d?d +?l?d?d?l?d?d?d?l +?d?d?d?d?d?d?d?l?d +?u?d?d?u?d?d?d?d +?s?d?d?d?d?s?s +?d?d?d?d?d?u?l?l +?s?s?d?d?d?s?s +?s?d?s?l?l?l +?l?s?l?s?d?l +?l?s?s?l?l?d +?u?d?s?d?d?d?d +?u?d?d?d?s?d?d +?s?d?d?d?d?d?u +?l?u?u?u?s?d +?u?d?l?s?l?l +?l?l?d?d?l?l?s +?u?u?d?u?u?s +?d?d?d?d?l?l?l?s +?u?d?u?u?u?u?d +?d?u?d?d?d?d?d?d +?d?d?s?d?d?d?s +?d?d?s?l?s?d?d +?d?d?d?d?s?d?s +?u?l?l?s?u?l +?d?d?u?d?u?d?u +?d?d?l?d?l?d?d?l +?l?l?u?l?u?l +?u?u?d?d?u?u?d?d +?l?s?l?s?s?d +?u?u?u?s?d?d?d?d +?s?u?u?d?d?d +?s?d?d?u?l?d +?s?d?d?d?u?l +?d?s?u?l?d?d +?l?d?d?d?s?u +?u?d?s?d?d?l +?u?d?u?d?s?d +?u?d?u?d?d?s +?u?d?d?s?l?d +?d?d?s?u?l?d +?u?d?s?d?l?d +?d?d?l?s?l?d +?u?d?s?l?d?d +?u?s?d?d?u?d +?d?s?u?u?d?d +?u?s?d?d?d?l +?d?l?d?s?d?l +?u?d?d?d?s?u +?u?d?d?l?d?s +?u?s?d?l?d?d +?d?s?d?d?u?u +?d?s?d?l?d?l +?u?s?d?d?l?d +?l?s?d?d?l?d +?d?d?l?d?s?l +?s?l?u?d?d?d +?u?s?d?u?d?d +?d?u?s?d?d?l +?l?d?d?d?u?s +?u?d?d?d?s?l +?u?d?d?s?d?u +?u?d?s?u?d?d +?d?d?d?s?l?l?d +?d?l?d?l?s?d +?s?u?l?d?d?d +?s?d?d?l?d?l +?u?d?d?d?l?s +?d?d?s?u?u?d +?u?d?u?s?d?d +?s?l?d?d?l?d +?d?s?d?d?d?l?l +?u?d?d?u?d?s +?u?d?d?s?u?d +?l?s?u?d?d?d +?d?u?u?s?d?d +?s?d?d?l?l?d +?d?s?l?d?d?l +?s?u?d?u?d?d +?d?d?d?u?s?l +?d?d?l?s?d?l +?d?u?d?u?s?d +?d?d?d?d?u?l?s +?d?d?d?d?d?d?u?u?u +?l?d?l?l?l?l?s +?s?d?d?s?d?d?s +?d?u?d?d?d?d?u +?d?d?d?d?l?u?d +?d?d?d?l?d?d?u +?d?d?d?u?l?d?d +?d?d?d?d?u?l?d +?d?d?u?d?d?d?l +?l?d?d?d?s?d?d?d +?s?l?l?l?s?l +?u?u?s?s?u?u +?l?l?d?d?d?d?d?d?l +?d?u?l?u?d?l +?l?u?u?d?d?u +?d?l?u?d?l?l +?u?d?l?u?d?u +?d?u?d?u?l?l +?l?d?d?u?u?l +?d?l?d?u?l?l +?u?d?u?d?l?u +?d?u?l?u?u?d +?l?u?d?u?d?l +?l?u?d?u?d?u +?d?l?d?u?u?l +?u?d?l?u?u?d +?u?d?u?l?u?d +?d?l?u?l?u?d +?d?u?u?d?l?u +?l?d?u?u?u?d +?d?d?d?l?l?l?u +?l?d?u?u?d?l +?u?u?d?d?l?u +?l?d?l?l?u?d +?u?l?d?u?d?u +?d?l?u?d?u?l +?d?d?l?u?l?u +?d?d?u?u?u?u?d +?d?l?u?u?l?d +?d?l?d?u?l?u +?d?u?l?d?u?l +?d?u?d?l?u?l +?l?d?l?l?d?l?s +?u?d?d?u?u?l +?l?u?u?d?l?d +?d?d?d?l?l?d?d?l +?d?d?d?d?d?d?u?s +?d?d?d?u?u?u?s +?u?l?d?l?l?d?l +?d?d?u?d?d?u?d?d +?d?d?d?l?d?d?l?d +?l?l?l?d?d?d?l?d +?l?s?d?s?d?s +?s?s?s?l?d?d +?u?l?l?d?u?l?l +?l?d?d?d?l?d?l?d +?l?l?l?l?s?s?d +?s?d?d?s?s?s +?u?u?d?l?l?u +?d?u?u?u?l?u +?l?u?u?u?l?u +?l?l?u?l?u?d +?l?u?u?d?u?u +?d?l?u?l?l?u +?l?u?l?l?d?u +?u?l?d?l?l?l?d +?d?l?u?u?l?l +?d?l?l?u?u?u +?l?l?d?u?u?l +?l?u?u?l?d?u +?u?d?l?l?l?d?l +?l?u?d?u?l?l +?l?l?d?l?u?u +?l?l?u?l?d?u +?u?l?u?d?l?u +?u?d?u?u?l?u +?l?d?u?l?l?u +?l?l?u?u?d?l +?l?l?u?u?d?u +?l?u?d?l?l?u +?u?u?d?l?u?u +?l?s?s?l?d?l +?l?l?s?s?l?d +?u?u?u?s?s?d +?u?u?u?s?d?s +?l?l?l?s?d?d?l +?l?l?s?d?d?l?l +?l?s?l?d?l?l?l +?d?d?d?d?l?l?d?l +?u?d?d?d?l?d?d?d +?u?d?u?u?d?u?u +?u?s?s?u?s +?u?l?s?s?s +?l?s?s?s?u +?s?u?s?u?s +?s?s?l?s?l +?s?s?s?u?u +?u?l?s?d?d?s +?d?s?l?d?s?l +?l?l?s?d?s?d +?l?u?s?d?d?s +?u?u?s?d?d?s +?u?d?u?d?s?s +?d?s?d?s?l?l +?s?u?u?s?d?d +?s?l?l?d?d?d?s +?u?s?d?u?s?d +?u?s?s?u?d?d +?d?d?u?u?s?s +?u?s?u?d?s?d +?l?d?l?s?d?s +?u?l?d?d?d?d?d?d?d +?l?d?s?l?d?d?d +?d?l?l?d?d?d?s +?d?d?l?l?d?d?d?l +?u?u?d?d?l?d?d +?d?d?u?d?u?u?d +?d?d?l?l?u?d?d +?d?u?d?l?d?l?d +?d?u?l?l?d?d?d +?u?d?u?d?d?d?u +?d?d?u?u?d?d?u +?u?u?s?u?u?d?d +?l?l?d?d?s?l?l +?u?u?u?d?d?l?l +?u?u?d?l?l?l?l +?d?d?d?d?s?s?d?d +?d?d?s?d?d?d?d?d?d +?l?l?s?d?d?d?s +?l?d?d?d?d?l?l?d +?l?d?l?d?l?d?l?l +?d?d?d?d?l?s?s +?l?u?u?l?l?u +?l?u?u?l?u?l +?u?d?l?d?l?l?l +?l?l?u?u?u?d?d +?d?d?d?s?s?d?d?d +?u?u?s?u?u?u?u +?l?d?d?l?d?d?l?l +?d?d?d?d?d?d?d?d?d?d?d?d +?d?d?d?d?d?u?d?d +?u?u?s?l?l?l +?u?u?l?l?l?s +?u?u?u?s?s?u +?s?s?l?l?l?s +?l?l?s?d?d?d?l +?s?s?s?s?s?l +?d?d?d?s?d?d?d?l +?d?d?d?l?l?u?u +?l?l?d?d?d?u?u +?u?l?d?d?l?l?d +?u?d?u?d?u?u?u +?d?s?s?d?d?d?d +?d?d?u?u?u?u?u?u +?s?l?s?l?l?d +?s?l?s?l?d?l +?u?l?l?d?s?s +?d?d?d?d?l?l?l?d?d +?d?d?l?d?d?l?d?l +?l?s?s?s?s?s +?l?l?l?l?d?l?s +?l?l?l?d?d?u?u +?u?u?s?u?u?s +?u?l?u?l?s?s +?l?l?d?d?d?l?l?d +?u?l?d?d?s?d?d +?s?d?d?l?l?d?d +?d?d?d?d?d?s?l?l +?d?s?d?l?l?d?d +?s?u?u?d?d?d?d +?d?d?d?l?l?s?d +?d?l?l?d?l?d?d?d +?l?l?u?u?l?u +?l?u?l?l?u?u +?u?d?d?d?d?u?d?d +?s?d?d?l?d?s +?s?d?d?d?l?s +?l?d?d?s?d?d?s +?u?s?d?d?s?d?d +?s?d?d?s?l?d +?l?d?d?s?d?s +?d?d?l?d?s?s +?d?d?s?l?s?d +?d?s?d?l?s?d +?s?s?d?l?d?d +?d?s?d?d?s?u +?d?s?d?s?d?l +?u?d?d?s?d?s +?d?s?s?l?d?d +?s?d?l?d?s?d +?s?u?s?d?d?d +?s?d?d?d?s?u +?d?u?s?s?d?d +?d?s?d?d?s?l +?s?d?l?d?d?s +?d?s?d?d?u?s +?d?d?s?l?d?s +?d?d?s?d?s?l +?u?s?s?d?d?d +?l?d?d?s?s?d +?d?d?d?l?d?d?l?l +?d?d?d?s?l?l?l?l +?u?d?l?l?d?d?l +?d?l?d?d?d?d?s +?u?d?d?s?d?d?d +?d?d?l?d?d?d?s +?s?d?d?d?l?d?d +?d?d?d?l?s?d?d +?u?d?d?d?d?s?d +?d?s?d?d?l?d?d +?d?d?d?s?l?d?d +?d?d?s?d?l?d?d +?s?s?s?s?l?l +?d?d?l?d?d?l?d?d?l +?l?l?l?l?d?l?l?d +?u?u?u?u?l?d?d +?u?l?l?u?u?d?d +?u?u?d?u?d?s +?l?d?l?s?d?u +?u?l?s?d?d?l +?l?s?l?u?d?d +?u?u?l?d?d?s +?d?l?s?l?l?d +?s?u?d?u?u?d +?u?d?s?d?l?l +?u?l?s?d?u?d +?u?u?s?d?d?u +?u?l?d?s?d?l +?u?s?d?d?l?l +?u?d?u?d?s?u +?u?d?d?l?l?s +?l?l?d?d?u?s +?u?u?d?u?s?d +?d?d?s?u?l?l +?d?l?s?d?l?l +?s?l?u?d?l?d +?u?l?d?s?u?d +?s?l?u?l?d?d +?u?s?l?d?d?l +?l?d?u?s?l?d +?s?u?d?l?d?l +?d?s?l?l?d?l +?u?d?l?l?s?d +?d?l?d?l?u?s +?d?l?l?s?l?d +?d?u?s?u?d?u +?l?d?s?d?d?s?d?d +?l?d?d?u?l?d?d +?u?d?l?d?d?l?d +?d?d?u?d?d?l?l +?u?d?d?u?l?d?d +?d?d?d?u?l?l?d +?u?u?d?d?d?u?d +?l?d?d?u?d?d?l +?d?d?u?u?d?d?l +?u?d?d?d?u?d?u +?d?d?d?u?l?d?d?d +?u?d?d?l?d?d?d?d +?u?u?u?u?l?l?l +?s?d?d?d?s?d?d?d +?d?d?d?l?l?s?s +?u?s?u?s?d?d?d +?l?l?d?d?l?d?d?l +?u?l?l?s?u?l?l +?d?l?l?l?d?l?l?l +?u?l?u?l?s?d?d +?l?d?l?l?l?d?l?l +?d?s?d?s?s?s +?l?l?u?d?u?u +?l?u?u?l?u?d +?l?l?u?d?l?u +?u?u?d?u?u?d?u +?l?d?u?l?u?u +?d?u?u?l?l?u +?l?u?d?u?l?u +?u?u?l?d?l?u +?u?u?d?u?l?u +?u?l?l?l?d?d?u +?u?d?l?l?d?d?d?d +?s?s?l?l?l?d?d +?l?l?d?l?l?l?s +?u?s?u?l?d?l +?u?l?u?l?d?s +?u?s?u?d?u?u +?s?u?l?l?l?d +?l?d?l?d?d?d?d?l +?u?d?u?u?u?d?u +?l?d?l?d?l?d?d?l +?u?l?d?d?l?d?l +?d?l?l?l?s?d?d +?u?s?l?l?d?d?d +?s?l?l?l?d?d?d?d +?d?d?d?l?l?d?d?d?d +?l?l?l?l?l?u?u +?s?s?u?s?s +?s?u?s?s?s +?l?l?l?l?u?u?u +?l?l?d?l?d?l?d?d +?u?s?s?l?l?l +?u?s?l?l?s?l +?s?s?s?d?d?l +?u?s?s?s?d?d +?l?s?s?s?d?d +?u?l?l?d?l?l?d +?u?l?u?u?l?d?d +?d?u?u?u?u?d?u +?l?l?u?u?l?d?d +?u?u?u?d?u?u?d +?l?l?l?d?l?l?s +?d?d?d?d?l?d?l?l +?s?d?d?l?d?d?s +?l?l?l?l?l?l?d?s +?l?d?d?d?d?s?d?d +?l?l?d?l?l?d?l?l +?u?l?d?d?d?s?d +?d?d?s?d?d?u?u +?d?l?l?s?d?d?d +?u?l?l?u?l?l?d?d +?l?l?s?s?l?d?d +?l?l?s?d?l?s +?l?s?l?d?s?l +?d?l?s?l?s?l +?u?u?d?d?d?d?l?l +?d?d?l?d?d?d?l?l +?d?d?d?s?s?l?l +?l?l?d?l?l?l?l?d +?l?l?l?u?d?d?d?d +?d?d?l?l?l?d?d?l +?d?d?d?d?u?l?d?d +?u?l?u?s?d?d?d +?u?l?l?d?d?d?d?s +?d?d?l?l?l?s?d +?d?d?d?u?l?l?l?l +?s?s?s?s?s?d +?u?l?d?d?u?l?d?d +?u?u?u?d?d?u?d +?u?d?d?l?l?l?d +?u?l?l?d?d?d?u +?u?d?d?d?u?l?l +?u?l?u?l?l?s +?d?d?d?l?l?l?l?l?l +?l?l?l?s?d?l?d +?l?d?l?s?l?d?l +?d?d?l?l?l?s?s +?l?l?l?s?d?s?d +?d?d?d?u?u?u?d?d +?u?s?u?u?s?u +?d?s?d?d?s?d?d?d?d +?u?l?l?s?s?s +?l?d?l?d?l?l?l?l +?s?l?l?s?d?d?d +?l?d?l?l?l?l?l?d +?d?d?d?d?d?d?l?l?d +?d?s?d?d?s?d?d?l +?d?d?l?d?d?d?d?d?d +?d?u?d?d?d?d?l +?d?d?d?l?u?d?d +?l?d?u?d?d?d?d +?d?u?d?d?d?u?d +?d?l?d?u?d?d?d +?d?d?d?d?l?d?u +?d?u?d?u?d?d?d +?d?d?u?l?d?d?d?d +?d?d?d?u?d?u?d +?d?d?d?d?l?l?d?d?d +?d?d?u?d?l?d?d +?d?d?l?u?d?d?d +?d?u?d?d?u?d?d +?d?d?d?u?d?d?l +?d?d?d?u?d?d?u +?d?u?d?d?d?l?d +?d?d?l?l?l?l?u +?u?u?u?d?s?d?d +?u?s?u?u?u?d?d +?l?d?d?s?l?l?l +?l?d?d?s?d?d?d?d +?u?l?u?u?u?l +?u?u?u?l?u?l +?d?d?l?d?l?l?d?d +?l?l?l?l?d?s?s +?l?d?l?s?s?s +?u?u?l?l?l?d?d?d +?u?u?s?s?s?s +?s?s?u?u?s?s +?d?d?d?d?d?l?l?s +?l?l?l?d?d?s?l +?l?s?l?l?s?s +?u?d?d?d?d?l?u +?u?d?d?d?l?d?l +?d?d?d?u?u?d?u +?d?d?u?l?l?l?d +?u?d?d?d?d?u?l +?u?l?d?d?d?l?u +?d?u?u?d?u?u?d +?u?l?d?d?u?l?d +?d?d?l?l?d?d?u +?u?d?d?d?d?d?d?d?d?d +?u?l?s?s?l?l +?u?d?l?d?l?d?l?d +?l?l?d?d?l?l?l?d +?d?l?d?l?l?d?d?d +?d?l?d?d?l?l?d?d +?s?d?s?s?d?d +?s?s?d?d?s?d +?d?d?s?d?s?s +?u?u?d?u?u?u?d +?u?l?l?l?l?s?d?d +?s?l?d?l?d?l?d +?l?d?l?l?d?d?s +?d?d?d?d?d?d?d?s?l +?l?l?l?l?s?d?l +?l?l?l?l?l?d?u +?l?d?l?d?l?l?s +?l?d?d?l?l?l?s +?d?d?s?s?u?u +?s?s?l?d?d?l +?l?d?s?d?s?l +?l?s?s?d?l?d +?s?u?l?s?d?d +?l?l?d?d?s?s?s +?l?d?s?s?l?d +?l?s?d?d?l?s +?s?l?d?s?l?d +?d?s?s?l?l?d +?d?d?u?s?u?s +?s?l?d?l?s?d +?s?d?d?l?l?s +?u?s?d?d?s?u +?s?d?d?l?s?l +?l?d?l?l?d?l?l?d +?d?d?d?d?d?s?d?d?d +?l?l?l?l?s?d?d?d?d +?u?u?d?d?l?l?d?d +?s?d?d?d?d?u?u +?d?l?s?l?d?d?d +?d?l?l?d?s?d?d +?u?d?d?u?d?d?s +?d?d?u?s?u?d?d +?l?s?u?d?d?d?d +?l?d?d?d?l?d?s +?l?u?s?d?d?d?d +?l?l?l?u?l?l?l +?l?d?d?d?d?l?d?l +?l?l?l?l?d?d?l?d +?u?d?l?d?d?d?d?d +?u?d?d?d?d?l?d?d +?l?l?l?d?d?l?l?d +?u?u?u?d?l?l?l +?u?d?s?u?u?u +?l?d?l?l?s?u +?u?u?s?l?l?d +?u?s?u?d?l?l +?u?l?d?s?l?l +?u?l?s?l?d?l +?u?u?u?s?d?u +?u?d?l?l?s?l +?u?l?s?u?l?d +?u?d?l?u?s?l +?l?d?l?l?d?l?d?l +?u?u?d?d?l?l?d +?l?d?l?d?l?d?u +?u?l?l?d?d?l?d +?l?d?d?l?l?d?l?d +?d?d?d?d?d?d?d?l?l?l +?l?d?l?d?d?d?l?d +?u?u?u?d?s?s +?s?s?l?l?d?l +?u?l?l?s?d?s +?l?l?l?l?s?d?s +?d?l?l?s?s?l +?l?l?l?l?s?l?l?l +?u?u?l?u?l?u +?u?l?u?d?d?d?s +?d?s?d?d?l?l?l +?s?d?l?l?l?d?d +?u?l?l?d?s?d?d +?d?d?d?l?l?s?l +?l?l?l?s?l?l?l?l +?d?l?l?d?d?l?d?d +?u?l?l?l?u?l?d +?u?u?u?l?l?l?d?d +?l?s?l?s?d?d?d?d +?l?l?s?s?s?l +?d?s?s?s?s?d +?d?d?d?s?s?s?s +?d?u?u?l?u?l +?u?u?l?u?d?l +?l?u?d?l?u?l +?l?u?u?d?u?l +?d?l?u?l?u?l +?d?u?l?u?u?u +?d?u?l?l?u?u +?l?d?u?l?u?l +?u?d?l?u?u?l +?u?u?l?u?l?d +?d?l?u?l?u?u +?d?l?l?d?d?l?l?d +?s?d?d?d?d?d?d?d?s +?d?d?s?s?s?d?d +?s?s?d?d?d?d?s +?u?u?u?u?u?u?d?d?d +?l?l?s?d?l?l?l +?l?s?l?s?s?s +?d?d?s?d?d?s?d?d?d?d +?d?d?d?d?d?d?d?s?s +?l?d?l?d?l?l?l?d +?s?s?d?d?d?d?l +?s?l?l?l?l?s?d +?l?l?d?s?s?s +?u?s?u?s?s?d +?u?l?d?d?d?d?d?s +?d?l?l?s?d?l?l +?s?l?l?l?l?d?s +?l?d?d?d?l?l?l?d +?d?l?d?d?d?d?l?l +?d?l?d?l?d?d?l?d +?s?s?s?s?d?d?d +?s?s?l?l?d?d?d +?s?d?u?u?u?u?u +?d?d?s?d?l?l?l +?d?s?l?l?l?d?d +?u?s?u?u?d?d?d +?l?l?d?d?d?l?s +?s?s?u?u?u?u +?u?s?l?l?l?s +?u?d?d?u?d?u?u +?u?d?d?u?u?u?d +?u?d?d?l?d?l?l +?u?s?u?s?u?d?d +?u?u?u?u?u?d?s +?u?u?u?u?d?d?d?d?d +?d?d?d?d?s?d?s?d +?u?u?l?l?l?l?d?d +?s?s?l?s?s?l +?u?l?l?l?l?u?d?d +?l?d?l?l?l?d?l?d +?d?l?d?d?l?d?l?d +?d?l?d?d?s?d?d +?d?d?s?d?d?d?u +?d?d?d?l?d?s?d +?d?d?u?s?d?d?d +?s?d?d?d?d?l?d +?d?d?d?d?l?d?s +?d?d?l?d?s?d?d +?d?d?s?d?u?d?d +?s?d?l?d?d?d?d +?d?d?l?d?d?s?d +?d?s?d?d?d?d?u +?d?d?d?d?d?l?d?d?d +?l?l?d?l?l?d?l?d +?u?l?l?l?l?s?s +?u?u?u?u?u?u?u?d?d +?u?u?u?s?l?l +?l?l?l?s?d?l?l +?l?s?u?l?l?l +?u?l?l?u?l?s +?l?u?l?l?l?s +?u?d?u?l?d?d?d +?d?u?u?d?d?d?u +?l?d?d?d?d?u?l +?d?d?d?d?l?u?u +?d?u?u?d?u?d?d +?u?l?d?d?d?l?d +?u?d?u?d?l?d?d +?l?u?d?d?d?d?l +?l?d?u?u?d?d?d +?l?u?l?d?d?d?d?d +?u?l?d?d?u?d?d +?u?d?d?u?d?d?l +?l?l?d?d?u?d?d +?d?u?d?u?d?d?u +?d?u?d?d?u?d?u +?d?d?l?u?u?d?d +?l?d?d?l?d?d?u +?u?s?u?u?u?u?u +?d?d?d?d?u?d?d?d?d +?u?u?u?u?u?s?u +?l?d?l?d?l?l?d?l +?d?d?s?u?u?u?u +?l?l?l?d?d?l?s +?l?d?l?l?l?l?d?l +?u?d?d?d?d?l?s +?s?l?d?d?d?d?l +?s?l?d?d?l?d?d +?s?u?l?d?d?d?d +?d?l?l?l?d?d?s +?d?d?d?l?l?d?s +?l?d?d?l?s?d?d +?u?u?d?s?d?d?d +?l?s?l?d?l?d?d +?d?d?d?l?d?d?d?d?d +?d?d?s?d?d?s?s +?s?d?s?d?s?d?d +?d?s?d?s?d?d?s +?d?d?l?l?d?d?l?d +?d?d?l?l?d?l?d?d +?l?l?d?s?l?l?l +?d?d?u?l?l?l?l?l +?s?l?s?l?l?s +?s?s?s?u?u?u +?d?d?d?d?s?d?d?l +?l?d?l?l?d?l?l?l +?d?u?u?u?u?u?u?u +?u?s?s?u?u?u +?u?s?u?s?u?u +?d?d?d?d?d?s?s?s +?u?l?l?s?l?l?l +?d?l?l?l?l?d?l?l +?u?d?u?l?l?d?d +?l?d?l?d?d?l?l?d +?d?u?u?l?u?d +?l?l?u?d?u?d +?u?d?l?l?u?d?d +?u?l?u?d?d?d?u +?u?u?d?u?d?u?d +?d?u?u?d?u?l +?l?u?l?d?u?d +?d?u?u?l?d?l +?d?u?d?u?u?l +?l?u?d?d?u?u +?d?l?u?l?d?u +?d?l?u?u?d?u +?l?d?l?u?d?u +?d?u?u?u?d?u?u +?l?d?u?l?u?d +?d?l?u?d?u?u +?l?u?d?u?u?d +?d?l?l?u?d?u +?l?d?u?d?u?u +?l?u?u?u?d?d?d?d +?d?l?l?u?l?d +?u?u?d?u?l?d +?d?l?u?d?l?u +?d?u?u?u?l?d +?u?d?u?l?d?u +?l?s?d?d?d?s?l +?l?l?u?u?d?d?d?d +?l?d?l?l?d?d?l?d +?d?l?d?d?d?l?l?d +?u?l?l?l?l?u?u +?l?d?l?d?d?l?d?l +?s?l?s?d?d?s +?s?s?l?d?d?s +?s?s?d?d?s?l +?l?s?d?d?s?s +?s?d?s?d?s?l +?s?s?l?s?d?d +?s?u?s?s?d?d +?d?d?s?s?s?l +?s?d?s?d?l?s +?u?s?l?l?l?l?l +?s?s?l?l?l?l?l +?d?d?l?d?d?l?l?l +?l?l?d?d?d?d?u?u +?u?u?u?d?d?d?d?s +?l?s?s?l?s?s +?l?l?d?l?l?l?d?l +?s?u?s?d?d?d?d +?l?s?d?s?d?d?d +?u?d?d?d?d?s?s +?d?d?l?d?d?l?l?d +?d?l?d?l?d?d?d?l +?u?u?l?u?u?d?d +?l?s?l?l?d?d?d?d +?d?l?l?d?l?l?d?d +?l?l?s?l?d?s +?s?u?u?u?d?s +?u?l?s?s?l?d +?l?d?s?s?l?l +?l?d?s?l?s?l +?u?d?s?l?l?s +?s?l?d?l?s?l +?d?l?s?s?l?l +?l?s?d?s?l?l +?d?d?d?d?d?u?u?d +?l?d?d?d?s?l?l +?d?d?d?l?s?l?l +?l?l?d?s?d?d?l +?l?d?d?l?l?d?s +?l?s?d?l?l?d?d +?l?s?l?s?d?s +?s?l?d?l?s?s +?d?l?l?l?l?d?s +?l?l?d?s?d?l?l +?l?l?l?u?u?u?u +?d?u?l?l?d?d?d?d +?l?d?l?d?d?d?d?d?d +?l?l?l?s?u?l +?u?l?l?s?u?u +?l?l?s?u?l?l +?l?s?l?l?u?l +?u?l?u?l?s?l +?s?l?l?l?l?u +?l?l?l?u?u?u?d +?l?d?d?l?d?l?l?d +?u?l?l?l?l?l?l?d?d +?d?d?d?s?d?d?d?d?d +?u?u?u?u?s?u?u +?l?l?d?d?u?u?u +?d?d?u?l?l?l?u +?u?u?d?u?d?u?u +?u?l?l?d?l?d?l +?u?u?u?d?u?d?u +?u?l?u?u?u?d?d +?u?l?d?d?u?l?l +?u?l?s?d?d?d?d?d +?d?l?d?l?l?d?l?d +?u?s?u?u?u?s +?s?u?l?u?l?s +?l?l?l?l?s?s?l +?u?l?l?l?l?l?d?d?d +?l?l?d?l?l?d?s +?u?l?l?s?d?l +?s?l?l?l?u?d +?l?l?l?u?s?d +?u?l?s?u?d?l +?u?s?d?u?l?l +?u?l?u?s?u?d +?l?d?l?l?l?d?s +?l?l?d?s?l?l?d +?u?u?s?d?u?u +?d?u?u?s?u?u +?u?l?l?s?u?d +?u?u?s?u?d?u +?l?s?l?l?s?d?d +?d?d?s?l?l?l?s +?l?s?d?d?d?d?d?d?d +?l?l?l?l?u?l?l +?u?d?l?d?l?d?u +?u?d?l?l?d?d?u +?l?u?u?l?d?d?d +?u?u?d?d?u?d?u +?u?d?u?d?d?u?u +?d?d?d?u?l?l?u +?l?l?d?d?l?l?d?l +?d?d?d?u?u?u?l +?d?d?d?d?d?d?l?l?l?l +?d?l?d?d?d?d?d?d?d +?l?d?s?s?s?s +?l?l?u?l?u?u +?u?l?l?l?l?d?u +?d?d?d?l?l?d?l?d +?u?d?u?d?d?u?d?d +?d?d?d?l?d?l?l?d +?l?l?d?d?l?d?l?d +?l?d?d?l?d?l?d?l +?d?d?d?u?d?d?d?u +?l?s?d?d?l?l?l +?l?d?s?l?l?l?l +?d?d?d?d?d?d?d?d?d?s +?s?d?d?d?s?l?l +?l?s?l?d?d?d?s +?l?l?s?s?l?s +?s?u?s?u?s?u +?l?d?l?d?l?s?d +?u?u?u?d?d?s?d +?u?u?s?u?d?d?d +?l?d?l?d?d?l?s +?l?l?u?l?l?l?l +?d?d?l?d?l?d?l?d +?l?u?l?l?l?l?d +?l?s?l?l?l?l?d?d +?u?l?l?l?l?u?l +?u?u?u?u?u?s?s +?u?l?u?l?u?d?d?d +?u?l?d?l?d?l?l +?d?s?d?d?d?d?d?d?d +?l?l?u?l?l?l?d +?l?l?l?l?u?u?d +?d?s?d?d?d?d?s +?d?l?l?d?d?d?d?l +?l?d?d?l?l?l?l?d +?u?u?u?d?d?d?d?u +?u?l?l?l?u?u?d +?u?l?l?s?s?l +?u?l?l?l?s?d?d?d +?d?l?l?l?l?l?d?l +?d?l?d?d?l?d?s +?u?u?d?d?d?s?d +?l?u?d?d?d?d?s +?l?d?l?d?d?s?d +?u?d?u?d?s?d?d +?l?l?d?l?d?l?s +?d?d?l?l?s?l?l +?l?s?l?s?l?s?d +?l?l?l?d?l?d?l?l +?u?l?l?l?d?d?d?d?d +?l?l?l?s?u?u +?u?l?s?u?u?u +?l?l?l?u?u?s +?u?l?u?l?s?u +?d?d?u?d?d?l?d?d +?l?l?l?l?d?l?d?l +?l?d?l?d?d?d?l?l +?d?d?d?l?l?l?d?l +?d?l?d?l?l?l?d?d +?l?s?s?l?d?d?d +?u?s?d?d?d?d?s +?d?l?s?d?l?s?d +?d?d?d?d?d?u?l?u +?u?l?d?l?d?d?l +?u?u?l?u?d?d?d +?u?l?d?l?u?d?d +?d?d?d?d?u?l?u?l +?l?d?d?d?d?d?d?d?s +?l?l?l?d?l?d?l?d +?l?s?s?s?l?l +?s?u?u?u?u?u?s +?u?d?d?d?d?d?d?d?l +?d?l?l?d?l?d?l?d +?d?d?d?l?l?d?l?l +?d?l?l?l?d?d?d?l +?l?l?l?d?l?l?d?l +?l?l?d?d?s?u +?u?d?l?s?l?d +?l?d?l?u?s?d +?s?u?u?d?d?l +?l?d?d?l?u?s +?u?d?u?u?s?d +?l?u?u?d?d?s +?d?s?d?l?l?u +?l?u?l?d?s?d +?d?u?l?s?d?l +?d?l?u?l?d?s +?u?s?d?l?u?d +?u?d?d?s?l?l +?s?d?u?u?d?u +?u?l?d?u?s?d +?d?d?s?u?l?u +?s?u?d?d?l?l +?d?u?u?d?l?s +?d?l?l?d?s?l +?d?d?l?l?s?u +?d?u?d?u?s?u +?l?d?l?s?d?l?d +?s?l?l?d?d?u +?s?u?d?d?u?u +?u?d?s?d?u?u +?u?l?d?d?s?u +?u?s?u?d?u?d +?l?d?d?d?l?l?s +?l?d?l?d?s?u +?u?u?d?s?d?u +?u?u?d?s?d?l +?d?u?d?u?u?s +?d?l?s?d?u?l +?d?u?u?u?s?d +?l?s?d?d?l?u +?d?l?l?l?l?s?d +?l?l?d?u?s?d +?d?u?l?d?s?l +?u?d?d?u?s?l +?s?u?u?l?d?d +?u?u?d?d?u?s +?l?l?s?u?d?d +?u?d?d?s?l?u +?s?d?u?d?u?u +?s?d?u?l?l?d +?u?d?d?u?s?u +?d?d?l?l?l?d?s +?d?l?u?u?d?s +?u?s?l?u?d?d +?u?d?u?s?l?d +?s?l?l?u?d?d +?d?d?s?u?u?l +?l?d?l?d?s?l?d +?d?d?s?l?u?u +?d?l?l?s?u?d +?l?s?u?d?l?d +?d?l?u?s?d?u +?l?u?d?l?d?s +?u?l?d?d?u?s +?d?l?s?l?d?u +?l?u?d?s?l?d +?l?d?s?d?l?u +?u?d?d?l?u?s +?s?u?l?u?d?d +?d?l?d?s?l?l +?d?u?l?u?d?s +?d?l?d?u?s?l +?s?l?d?u?d?l +?u?u?s?d?u?d +?l?u?s?l?d?d +?u?d?d?u?u?s +?u?l?u?d?s?d +?l?d?l?s?l?d?d +?d?s?u?l?l?d +?d?u?s?u?d?l +?l?s?u?u?d?d +?l?l?u?s?d?d +?l?l?d?l?d?l?l?d +?d?d?d?s?s?s?l +?d?u?u?d?d?u?d +?d?l?u?u?d?d?d +?d?d?u?l?d?d?u +?u?d?l?u?d?d?d +?d?d?u?d?d?u?l +?d?d?u?u?l?d?d +?l?d?u?d?l?d?d +?d?l?l?d?d?d?l?d +?d?l?l?l?d?l?d?d +?u?d?l?d?l?d?d?d +?d?l?d?u?d?l?d +?d?d?u?u?d?u?d +?d?l?u?l?d?d?d +?l?l?d?d?d?u?d +?d?u?l?u?d?d?d +?l?u?d?d?l?d?d +?d?d?d?u?d?u?u +?u?d?d?d?l?l?d +?l?d?d?d?l?d?d?d?d +?u?l?l?l?l?s?u +?d?s?s?d?s?s +?s?d?s?s?s?d +?s?d?s?d?s?s +?l?l?d?d?d?l?d?l +?l?l?l?l?l?d?d?d?d?d +?d?u?u?l?u?u +?l?l?d?u?l?u +?l?u?d?l?u?u +?u?u?d?l?u?l +?d?l?u?u?l?u +?l?d?u?u?u?l +?l?l?l?u?l?l?d +?l?u?l?u?d?u +?l?l?d?l?d?l?l?l +?l?s?s?l?l?d?d +?d?s?s?s?d?d?d +?l?d?d?l?l?d?l?l +?d?d?d?d?d?l?l?d?d +?l?u?l?u?l?u?l +?d?l?d?l?l?l?l?l +?u?d?d?d?d?d?l?l +?d?l?d?d?d?l?d?l +?d?d?u?u?u?d?d?d +?s?d?l?s?l?s +?s?d?l?l?s?s +?l?s?d?s?l?s +?d?d?d?d?d?d?d?d?d?u +?d?d?d?d?d?s?d?l +?s?l?s?l?d?d?d +?s?s?s?s?l?d +?s?l?s?l?s?s +?u?l?l?l?u?d?d?d +?s?u?l?l?l?l?s +?u?u?s?d?d?d?d?d +?l?l?d?s?d?d?d?d +?l?l?l?s?u?s +?u?u?u?s?u?s +?u?l?s?u?l?s +?l?d?l?l?s?l?l +?l?l?s?d?d?d?d?d?d +?d?u?d?u?u?u?u +?d?d?u?u?l?l?l +?u?l?d?d?d?d?l?l +?u?u?d?d?d?d?d?u +?l?l?u?d?d?d?d?d +?d?d?d?d?u?u?u?d +?d?u?u?u?d?d?d?d +?d?d?d?l?d?l?d?l +?l?d?l?d?l?s?l +?u?l?l?l?d?s?d +?d?d?l?s?l?l?l +?l?l?d?l?l?s?d +?u?u?u?u?u?s?d?d +?l?l?s?l?s?s +?s?l?l?s?l?s +?l?s?l?l?d?l?l +?l?u?l?l?l?l?l +?l?l?d?s?l?s +?u?d?u?u?s?s +?d?l?l?s?l?s +?d?l?s?l?l?s +?d?s?l?l?l?s?d +?s?d?l?s?l?l +?d?d?s?s?l?l?l +?l?l?s?s?d?l +?s?d?d?l?l?l?s +?s?l?l?s?l?d +?l?s?d?l?s?l +?l?s?d?l?l?s +?u?d?l?l?s?s +?d?s?l?l?l?s +?s?l?s?d?l?l +?l?d?l?l?l?d?d?l +?s?u?u?u?u?u?u +?u?l?l?l?l?s?l +?l?s?l?l?l?d?l +?u?l?d?d?d?d?u?l +?l?d?l?l?d?s?d +?l?d?d?l?d?l?s +?d?d?d?s?u?l?l +?d?d?l?l?l?l?l?l?l +?u?s?u?l?l?l?l +?u?l?d?d?l?l?d?d +?u?u?d?l?l?d?d +?l?d?l?l?d?d?d?l +?u?d?u?d?u?d?l +?l?l?u?d?d?d?u +?u?d?u?u?d?d?u +?u?l?u?d?u?d?d +?d?u?u?u?d?u?d +?d?d?d?l?u?u?u +?l?u?l?u?l?s +?l?s?u?u?u?u +?u?l?s?l?u?l +?l?u?s?l?l?l +?l?d?l?s?l?l?l +?l?l?d?l?d?l?d?l +?l?l?l?d?u?l?l +?l?l?d?d?d?d?s?s +?u?d?d?d?s?d?d?d +?u?u?u?u?d?d?l +?u?d?d?u?l?l?l +?l?l?d?l?d?d?l?d +?l?l?l?l?d?d?s?d +?l?l?s?l?l?d?l +?u?l?u?l?u?l?d?d +?d?s?d?s?d?l?l +?l?l?s?d?d?s?d +?l?l?l?l?l?u?l +?l?d?d?d?d?d?d?d?d?l +?l?u?l?u?d?d?d?d +?d?d?l?l?d?l?l?d +?l?l?l?l?d?s?d?d +?l?d?d?d?d?u?d +?d?d?d?l?d?u?d +?d?d?l?d?d?d?u +?u?d?u?u?d?d?d?d +?d?l?d?d?d?d?u +?d?d?l?d?d?u?d +?d?d?l?d?u?d?d +?d?l?u?d?d?d?d +?l?d?d?d?u?d?d +?l?d?l?l?l?s?l +?s?d?u?l?l?l?l +?l?l?d?d?l?d?l?l +?s?s?l?l?l?s?s +?d?d?s?d?s?d?d?d +?u?d?l?d?u?d?l?d +?l?d?d?d?l?d?l?l +?d?d?l?l?l?d?l?d +?u?d?u?l?l?l?l +?l?l?d?l?l?d?d?l +?l?l?l?s?l?d?l +?d?d?d?d?u?u?l?l +?l?l?d?d?s?d?d?d +?l?l?s?l?d?d?d?d +?l?u?l?l?u?d?d +?d?d?l?l?u?l?l +?l?s?l?s?s?l +?l?s?s?l?s?l +?u?l?u?s?s?s +?l?l?l?d?d?d?d?u +?u?u?l?d?d?d?d?d +?u?l?s?l?l?l?l +?d?l?l?d?l?l?l?l +?s?s?l?d?d?d?d +?l?d?d?s?s?d?d +?d?d?s?u?s?d?d +?l?d?s?s?d?d?d +?s?d?d?d?d?l?s +?d?d?s?s?d?d?l +?d?s?d?s?d?d?u +?l?l?l?l?s?l?s +?u?u?s?u?s?u +?l?s?l?d?l?s?l +?l?d?d?d?l?l?d?l +?d?d?s?d?d?d?d?l +?l?l?l?d?d?l?d?l +?l?l?u?u?l?l?d +?s?s?d?d?s?d?d +?d?d?d?s?s?s?d +?l?d?d?d?s?s?s +?s?l?l?d?d?d?d?d +?d?d?d?d?d?l?s?l +?d?l?l?l?d?l?l?d +?s?u?u?u?d?d?d +?d?d?s?l?l?l?d +?d?s?d?l?l?l?d +?l?u?l?s?d?d?d +?u?d?u?d?u?d?s +?u?l?l?d?d?s?d +?l?d?d?s?d?l?l +?s?s?d?d?d?d?s?s +?l?l?l?l?l?s?u +?d?d?d?l?l?l?l?s +?s?l?s?s?l?s +?l?s?s?s?s?l +?d?l?l?l?l?d?l?d +?u?u?u?u?s?d?d?d +?l?s?l?l?l?d?d?d +?u?d?d?u?d?u?d?d +?d?d?l?l?l?d?l?l +?u?u?u?u?l?l?d +?s?d?d?u?u?s +?s?d?d?u?l?s +?u?d?u?s?s?d +?d?s?l?l?d?s +?u?d?l?s?d?s +?l?s?d?d?s?u +?u?s?d?s?l?d +?s?d?u?u?s?d +?u?s?s?d?d?l +?u?d?s?l?d?s +?u?d?d?s?s?u +?l?d?s?s?d?l +?s?d?d?s?u?u +?l?l?d?s?d?s +?d?s?l?s?l?d +?d?u?u?s?s?d +?u?s?s?d?u?d +?u?d?d?s?s?l +?u?s?s?d?d?u +?s?d?s?l?d?l +?l?d?s?l?s?d +?s?d?s?d?l?l +?u?s?l?d?d?s +?s?d?u?u?d?s +?l?l?d?s?s?d +?u?d?l?d?s?s +?d?s?d?l?s?l +?s?d?d?s?u?l +?u?d?d?u?s?s +?d?d?s?s?u?l +?s?u?s?u?d?d +?s?l?u?d?d?s +?s?s?d?d?d?l?l +?s?s?u?u?d?d +?s?u?d?l?d?s +?d?u?u?d?s?s +?d?l?s?s?d?l +?l?d?d?u?s?s +?u?d?s?s?d?u +?d?s?l?s?d?l +?u?d?u?s?d?s +?d?s?d?s?u?u +?l?s?s?d?d?l +?l?s?u?s?d?d +?d?d?d?s?l?s?l +?d?l?s?d?s?l +?s?l?d?s?u?d +?d?l?s?s?l?d +?s?u?d?d?s?u +?d?u?s?d?s?u +?s?s?d?l?l?d +?s?s?l?d?l?d +?d?s?l?d?s?u +?d?u?s?d?u?s +?d?s?u?s?d?u +?u?d?s?l?s?d +?s?d?s?u?d?l +?s?d?d?d?l?l?s +?u?s?u?d?d?s +?u?d?l?l?u?d?l +?l?l?d?d?l?l?u +?d?u?l?l?l?u?d +?d?d?u?l?u?l?u +?d?u?u?d?u?u?u +?u?l?d?d?u?l?u +?d?d?l?d?l?s?d +?d?d?d?d?s?l?u +?u?d?d?l?d?d?s +?s?d?d?d?d?u?l +?d?l?d?l?s?d?d +?d?s?d?d?d?u?u +?d?d?d?s?l?d?l +?u?d?d?s?d?d?u +?l?d?d?d?l?s?d +?u?d?d?u?s?d?d +?s?l?d?l?d?d?d +?l?d?s?d?l?d?d +?l?l?d?d?d?s?d?d +?d?d?d?l?s?l?d +?u?d?d?d?d?u?s +?s?d?d?d?l?l?d +?d?l?d?d?l?l?l?d +?l?u?l?l?d?d?d?d +?d?u?u?d?d?d?d?d +?d?l?l?l?l?l?u +?s?l?u?l?u?d +?s?l?u?u?l?d +?l?l?u?l?s?d +?d?s?l?u?l?l +?s?u?u?u?d?u +?s?u?u?u?d?l +?u?d?s?l?l?l +?d?l?l?l?u?s +?u?u?u?s?u?d?d +?l?l?l?s?d?u +?l?l?d?l?s?u +?u?l?s?d?u?l +?u?l?d?u?l?s +?s?l?d?l?u?l +?u?l?s?u?d?u +?u?l?l?u?s?d +?u?l?l?d?u?s +?s?u?u?l?l?d +?l?s?d?l?l?u +?u?u?d?u?s?u +?d?u?s?l?l?l +?s?u?u?l?d?l +?s?d?u?l?u?l +?l?l?s?u?d?l +?u?l?d?l?s?l +?u?u?u?s?d?l +?u?s?l?d?l?u +?u?u?u?u?d?s?d +?d?u?s?u?u?u +?d?u?u?u?s?u +?u?d?l?l?s?u +?l?d?u?l?l?s +?u?s?l?d?u?l +?l?d?s?u?l?l +?l?u?l?d?l?s +?u?u?d?s?u?u +?d?l?l?u?l?s +?l?l?u?u?s?d +?u?u?l?d?s?l +?l?s?d?u?u?u +?u?l?s?u?l?l?l +?u?u?d?u?d?d?u +?l?d?l?u?l?d?d +?u?d?l?u?d?d?l +?u?l?u?d?d?d?l +?u?d?d?l?l?d?l +?d?u?d?u?d?u?u +?u?l?u?d?d?l?d +?u?l?d?u?l?d?d +?u?u?d?d?d?u?l +?d?u?d?d?u?l?l +?u?u?l?d?d?d?l +?s?d?l?l?l?d?s +?l?l?d?d?d?d?s?d +?l?d?d?l?l?l?d?l +?d?d?s?d?d?d?s?d +?s?l?l?l?l?l?d?d +?s?s?s?d?d?d?l +?l?s?s?s?d?d?d +?l?d?d?d?d?d?s?d +?u?s?s?s?s?s +?d?d?l?l?l?d?d?s +?u?l?l?l?s?l?l +?u?s?l?l?l?u +?s?u?l?l?l?l?l +?l?s?l?l?l?u +?u?l?l?u?s?u +?s?l?u?l?l?l +?u?l?s?u?l?u +?l?l?l?u?l?s +?l?l?s?l?l?u +?d?d?d?d?d?d?d?l?s +?d?l?d?l?d?l?l?d +?l?l?d?l?d?d?d?l +?l?s?s?l?l?s +?s?l?l?l?l?d?d?d +?u?l?l?d?u?l?d +?u?l?l?d?d?u?l +?s?u?l?l?l?d?d +?l?s?l?l?d?l?d +?d?l?l?l?d?l?s +?u?l?u?l?d?d?s +?s?u?u?u?u?d?d +?s?s?d?d?l?l?l +?d?d?d?u?l?l?d?d +?l?d?d?d?d?d?d?l?l +?d?d?s?l?l?l?l?l +?s?s?s?s?u?u +?d?l?l?l?d?d?l?d +?d?l?d?l?d?l?l?l +?l?l?s?s?l?l?l +?s?s?s?l?l?d +?s?s?d?l?l?s +?s?s?l?d?l?s +?s?s?s?d?l?l +?s?l?l?d?s?s +?l?s?l?d?s?s +?l?s?d?l?s?s +?s?l?s?l?d?s +?l?d?d?l?d?s?s +?l?l?l?l?l?d?s?d +?l?l?s?l?l?l?l?l +?l?d?l?l?d?d?l?l +?d?l?l?l?l?d?d?d?d +?l?l?d?d?l?d?s +?l?d?d?s?l?l?d +?s?l?d?l?l?d?d +?l?l?d?l?s?d?d +?l?l?d?l?d?d?s +?l?l?s?d?d?l?d +?l?d?s?l?d?l?d +?d?d?d?u?l?l?s +?l?l?l?d?d?d?s?s +?s?d?l?d?l?d?l +?s?s?u?l?l?l +?u?s?u?l?l?s +?u?u?u?l?d?d?d?d +?d?l?l?d?d?d?l?l +?d?l?l?l?d?d?l?l +?s?d?l?l?l?s?d +?d?l?l?s?l?l?l +?u?u?u?u?u?u?l +?u?s?u?l?l?d?d +?u?l?s?l?l?d?d +?l?d?l?s?l?l?d +?u?u?l?l?d?d?s +?u?l?l?l?l?d?d?s +?l?l?d?d?u?l?l +?l?d?l?d?d?l?l?l +?u?l?d?d?l?l?u +?u?l?l?d?d?u?u +?l?l?l?s?s?l?l +?s?d?u?d?d?d?d +?d?u?s?d?d?d?d +?d?u?d?d?d?s?d +?d?d?d?d?u?d?s +?d?s?d?d?d?l?d +?s?u?d?d?d?d?d +?d?d?u?d?d?d?s +?u?l?d?u?l?l?l +?u?u?u?d?d?u?u?u +?l?l?l?l?u?l?d +?u?l?l?l?d?d?d?s +?d?d?d?l?d?l?l?l +?l?l?l?l?l?l?s?d?d +?l?l?l?l?l?u?d?d +?s?d?d?s?l?l?l +?u?u?u?s?s?d?d +?u?l?l?d?d?l?l?l +?l?u?u?u?u?u?d?d +?u?u?u?l?l?d?d?d +?d?d?d?d?d?d?d?u?l +?u?l?l?l?l?l?s?d +?d?u?d?u?u?d?d +?d?u?d?d?d?u?u +?d?u?l?d?d?u?d +?d?u?d?l?l?d?d +?u?d?d?l?d?u?d +?d?u?d?l?u?d?d +?l?d?l?d?u?d?d +?l?u?d?d?d?d?u +?u?u?d?l?d?d?d +?d?u?d?d?u?u?d +?u?d?l?d?d?d?l +?l?d?d?d?d?l?u +?l?u?d?d?u?d?d +?d?l?d?d?d?u?l +?u?d?d?u?d?l?d +?d?d?l?d?d?u?u +?u?d?d?d?u?u?d +?d?l?d?u?l?d?d +?u?d?d?d?u?l?d +?l?d?d?l?d?l?l?l +?l?l?u?u?u?u?u +?d?l?l?u?l?l?l +?l?d?l?l?s?l?d +?l?s?l?d?l?d?l +?d?d?l?l?d?d?d?d?d +?u?s?l?l?l?l?d +?u?l?u?l?u?l?s +?u?l?l?d?d?d?d?l +?d?u?d?u?d?u?d?u +?d?d?l?d?l?l?l?l +?s?l?l?s?s?l +?s?u?u?u?s?s +?d?l?l?d?l?l?l?d +?d?s?d?d?d?s?d?d +?u?u?u?d?d?s?s +?d?l?d?l?l?d?d?l +?u?d?l?u?d?l?l +?u?d?d?l?l?d?u +?l?u?d?d?d?l?l +?u?d?d?u?u?d?u +?l?u?d?d?l?l?l +?d?l?l?u?l?l?d +?u?l?d?d?d?u?u +?u?d?d?u?d?l?l +?u?d?d?l?u?d?l +?u?l?d?d?l?d?u +?l?l?l?d?d?u?d +?d?d?d?l?u?l?l +?u?u?l?l?u?d?d +?d?d?d?d?l?l?l?u +?l?l?l?l?l?l?l?d?d?d +?d?d?d?s?l?l?s +?l?l?s?d?s?d?d +?l?l?s?l?l?s?d +?d?d?u?l?l?d?d?d +?l?l?l?d?l?d?d?l +?d?d?l?d?l?l?l?d +?d?d?s?u?s?s +?l?d?s?s?d?s +?s?l?d?d?s?s +?d?s?d?s?l?s +?l?d?s?d?s?s +?s?l?s?d?s?d +?s?l?s?s?d?d +?l?d?d?s?s?s +?s?s?s?u?d?d +?d?d?l?s?s?s +?s?s?d?d?l?s +?u?l?l?l?l?u?s +?u?u?u?u?u?l?d +?u?u?u?d?d?l?l?l +?l?s?s?l?l?l?l +?l?s?l?l?l?s?l +?l?l?l?d?l?d?s +?d?l?l?d?l?l?d?l +?d?d?s?d?d?s?u +?s?d?d?l?s?d?d +?u?d?d?s?d?d?s +?d?d?s?d?s?d?l +?d?d?d?l?s?s?d +?d?s?d?d?s?d?l +?u?d?s?d?s?d?d +?s?d?d?s?d?d?l +?d?d?d?d?u?s?s +?s?s?d?d?l?d?d +?d?s?d?d?s?l?d +?l?s?l?s?l?l?l +?u?l?u?d?d?d?d?d?d +?l?l?l?l?d?d?s?s +?l?d?d?d?d?d?d?d?u +?d?d?l?d?d?d?d?s +?d?d?s?d?d?l?d?d +?d?d?s?l?d?d?d?d +?s?d?d?d?d?d?d?u +?l?l?s?d?d?s?d?d +?u?s?d?l?l?s +?s?d?s?u?u?u +?s?s?l?d?l?l +?u?s?d?u?u?s +?l?d?s?l?l?s +?u?s?l?l?d?s +?s?l?l?s?d?u +?u?s?l?d?l?s +?l?l?d?s?s?l +?s?d?u?l?l?s +?s?u?s?u?d?l +?d?s?s?l?l?l +?d?u?u?u?s?s +?s?u?u?d?u?s +?s?u?l?l?d?s +?l?s?u?d?s?l +?u?s?d?s?u?u +?u?s?d?u?s?u +?u?u?l?d?s?s +?u?u?d?d?d?d?d?d?d?d +?d?u?u?l?l?l?l +?l?d?d?d?d?l?d?d?d +?d?u?d?d?u?d?d?d +?l?d?l?d?l?d?d?d?d +?d?d?u?l?l?d?d?d?d +?l?d?d?d?u?d?d?d +?d?l?l?d?d?l?l?l +?d?u?l?l?l?l?l?l +?s?l?l?d?l?d?d +?l?d?l?d?d?s?l +?u?l?s?l?d?d?d +?d?l?l?d?d?l?s +?l?l?d?d?l?s?d +?l?s?l?d?d?d?l +?l?d?s?l?l?d?d +?s?l?l?l?l?l?l?s +?l?l?l?l?d?d?d?d?s +?d?l?d?d?d?l?l?l +?d?l?l?d?l?d?d?l +?d?l?l?d?d?l?d?l +?d?l?d?l?d?d?l?l +?d?d?l?l?d?l?d?l +?d?l?d?d?l?l?l?l +?u?u?d?u?d?d?d?d +?d?s?s?s?s?s +?l?l?l?l?l?l?l?l?d?d +?u?u?s?u?l?l +?s?u?u?l?l?l +?d?l?s?l?l?l?l +?u?s?u?l?u?l +?u?u?u?l?l?s +?u?s?u?l?l?u +?u?u?u?u?s?l +?u?s?u?u?u?u?d +?l?l?s?u?u?u +?d?l?l?l?l?s?l +?s?l?l?u?l?l +?l?u?l?l?u?s +?u?s?u?u?l?l +?s?l?l?u?u?l +?l?l?u?l?l?s +?u?l?l?s?l?u +?d?d?s?d?d?s?l?l +?l?d?d?d?d?d?d?d?d?d?d +?d?s?d?d?s?d?d?d +?l?l?d?d?u?u?l +?d?l?l?l?l?d?u +?u?d?l?l?d?l?u +?u?u?u?d?d?d?u?u +?d?u?l?l?l?d?u +?d?d?d?d?d?d?s?l?l +?u?d?d?d?d?l?l?l +?u?l?l?u?s?s +?l?s?l?s?l?u +?u?u?l?l?s?s +?s?u?s?l?l?l +?u?s?l?s?l?l +?u?l?s?l?l?s +?s?u?l?l?u?s +?l?l?u?u?u?u?d +?s?s?s?l?l?s +?u?l?l?u?s?d?d +?s?d?l?l?l?l?d +?d?d?l?l?l?s?l +?l?l?l?l?u?d?d?d +?s?l?d?l?d?l?s +?u?u?u?d?u?u?u?u +?l?l?l?l?l?l?s?s +?d?l?d?l?l?d?l?l +?u?u?u?d?d?d?d?l +?d?d?l?l?d?l?l?l +?l?l?s?l?l?d?d?d +?d?d?l?l?l?l?d?l +?s?s?s?s?d?l +?d?l?l?l?s?l?l +?d?l?d?l?l?l?l?d +?d?d?s?d?d?l?l?l +?l?l?s?s?d?d?d?d +?s?d?l?l?l?l?l?l +?l?s?d?s?d?s?d +?l?l?d?l?d?d?l?l +?s?l?d?d?d?l?s +?s?l?s?s?l?l +?l?l?l?d?d?d?s?d +?d?l?l?l?d?l?d?l +?d?d?u?l?u?l?d?d +?d?l?d?d?l?d?l?l +?d?s?d?s?l?l?l +?l?d?l?d?l?s?s +?u?u?u?s?d?d?s +?l?l?s?l?s?d?d +?u?l?l?l?u?l?l?l +?l?d?l?l?l?s?d +?l?d?l?d?s?l?l +?l?l?s?l?d?d?l +?u?u?u?l?u?d?d +?d?d?l?l?l?u?u +?u?l?u?l?l?l?d?d +?l?u?u?l?l?d?d +?u?s?u?s?u?s?u +?l?s?l?l?l?s?d +?l?s?l?l?l?l?s +?u?d?l?l?l?d?d?d +?d?d?l?d?l?d?l?l +?d?d?d?d?s?d?d?s +?d?d?d?s?d?s?d?d +?l?l?s?l?d?l?l +?d?l?l?d?l?d?l?l +?d?d?l?l?l?s?d?d +?l?l?s?l?l?l?d?d +?d?d?d?d?u?l?l?d +?u?l?d?l?d?d?d?d +?d?u?u?u?u?u?u?d +?u?l?l?l?d?u?l +?l?l?l?l?d?l?u +?d?u?l?l?u?l?l +?l?l?d?d?d?d?d?d?s +?d?d?d?d?d?d?u?l?l +?d?l?d?d?d?l?s +?d?l?d?s?l?d?d +?l?d?d?d?d?u?s +?s?l?d?d?d?l?d +?l?d?d?d?s?d?l +?d?l?d?s?d?d?l +?d?d?u?u?d?d?s +?d?d?u?u?s?d?d +?l?d?d?d?s?l?d +?l?s?d?l?d?d?d +?u?s?d?d?u?d?d +?s?d?l?l?d?d?d +?d?d?u?s?d?d?l +?u?s?d?d?d?d?l +?l?s?d?d?l?d?d +?u?l?d?s?d?d?d +?d?d?d?l?d?l?s +?l?s?d?d?d?d?u +?s?d?d?u?u?d?d +?d?d?s?u?l?d?d +?l?d?s?d?d?d?l +?d?d?l?d?l?d?s +?u?d?d?d?d?s?u +?d?u?l?s?d?d?d +?d?d?l?s?d?l?d +?l?d?d?u?d?d?s +?s?d?l?d?d?l?d +?u?d?d?u?d?d?u?d?d +?l?l?l?d?s?l?l +?l?d?d?u?d?d?d?d +?u?l?l?l?u?u?u +?l?u?u?u?u?d?d?d +?u?d?l?u?d?l?d +?d?d?u?u?d?d?u?u +?u?l?d?d?l?u?d +?l?u?l?d?d?d?u +?d?l?u?l?u?d?d +?l?l?d?l?u?d?d +?u?d?u?d?l?d?l +?l?d?d?d?u?u?u +?d?d?l?d?l?l?d?l +?d?d?d?l?l?u?l +?l?d?d?l?d?u?u +?l?u?d?d?d?l?u +?l?d?u?d?l?d?l +?u?d?d?u?l?d?l +?d?u?u?d?u?d?u +?d?d?u?u?d?u?u +?u?d?l?d?u?l?d +?l?l?l?d?u?d?d +?u?d?d?d?u?l?u +?d?l?l?u?d?l?d +?l?l?d?d?d?l?u +?u?u?u?d?l?d?d +?u?d?u?l?u?d?d +?u?l?l?d?d?u?d +?l?l?l?d?u?u?u +?d?d?d?d?d?d?d?d?s?d +?d?u?l?l?l?l?s +?s?l?l?l?d?l?l +?u?d?l?l?l?l?d?d +?l?l?s?s?s?d?d +?l?l?l?l?l?s?l?l +?u?d?l?d?l?d?s +?s?d?d?d?u?u?u +?d?l?l?d?l?s?d +?d?d?u?l?l?l?s +?l?d?d?l?l?s?d +?l?d?d?l?s?l?l +?l?l?d?s?l?d?l +?l?l?d?s?l?d?d +?l?l?d?l?d?s?d +?u?l?s?u?l?d?d +?u?s?l?d?l?d?d +?s?u?l?l?d?d?d +?l?l?d?d?d?s?l +?d?l?l?d?l?d?s +?d?l?l?s?l?d?d +?u?u?l?d?d?d?s +?l?l?d?d?l?s?l +?s?s?s?l?d?d?d +?u?d?u?d?u?d?d?d +?d?d?d?d?d?l?u?l +?u?s?u?d?d?d?d?d +?d?l?d?l?l?l?d?l +?u?l?l?u?l?l?s +?l?l?l?l?d?s?l +?l?u?l?d?u?u +?l?u?l?u?l?u?d +?u?d?u?d?l?l?l +?l?l?l?l?d?u?u +?s?l?l?l?l?d?l +?d?d?l?l?u?u?u +?d?l?l?l?l?d?d?l +?l?d?u?u?l?u +?l?l?d?d?l?u?l +?u?u?l?l?d?d?l +?l?l?l?l?s?l?d?d +?d?d?d?d?s?s?s?s +?d?s?d?s?s?d?d +?u?l?u?u?d?d?d?d +?s?d?s?d?d?d?d?d +?l?l?d?d?d?l?d?d?d +?l?l?l?s?l?s?d +?l?s?s?s?l?d +?l?s?s?l?d?s +?l?s?s?s?d?l +?l?s?s?d?l?s +?l?l?s?s?d?s +?l?d?s?l?s?s +?s?l?l?s?d?s +?s?u?l?s?d?s +?u?s?u?s?d?s +?l?u?d?s?s?s +?d?l?l?s?s?s +?s?s?l?s?l?d +?d?l?s?l?s?s +?l?l?s?d?s?s +?l?l?l?l?l?l?s?l +?d?l?l?l?l?l?l?l?l +?l?l?l?s?l?l?d?d +?d?d?d?l?d?d?d?s +?u?d?d?s?d?d?d?d +?d?d?l?d?d?s?d?d +?u?u?s?s?d?d?d +?u?d?l?l?d?l?d?d +?u?d?d?l?l?l?d?d +?u?l?u?l?u?l?l +?d?d?d?s?d?d?d?d?l +?s?l?u?l?u?s +?u?l?s?l?s?l +?l?l?l?u?s?s +?s?u?u?u?s?u +?l?l?d?d?d?d?d?l?l +?l?l?l?d?d?d?l?l?l +?u?d?l?d?d?l?d?d +?l?l?l?s?l?l?s +?l?s?l?d?l?l?d +?s?l?d?l?l?d?l +?s?d?d?u?u?u?u +?d?s?d?u?u?u?u +?d?d?u?u?u?u?s +?l?d?d?l?l?s?l +?u?u?u?s?l?l?l +?s?u?s?u?u?s +?s?s?l?l?s?l +?u?d?l?l?l?l?s +?l?l?d?d?u?u?d?d +?s?l?d?l?l?d?s +?u?l?l?d?d?s?s +?l?d?d?d?d?l?d?d?d?d +?d?d?d?d?l?l?d?d?d?d +?u?l?u?s?d?d?d?d +?u?l?l?l?l?l?l?s +?l?d?d?l?d?d?d?d?d +?d?d?d?d?d?d?l?l?s +?l?l?u?l?d?d?d?d +?u?s?l?u?l?u +?l?l?u?u?u?s +?l?l?l?s?l?u +?u?l?u?s?u?l +?l?l?u?s?l?l +?u?l?u?s?l?l +?u?l?u?s?l?u +?u?l?l?u?u?s +?u?u?l?l?u?s +?d?l?l?l?l?s?s +?l?l?l?l?l?s?d?d?d +?l?l?u?d?d?l?l +?d?u?l?l?l?d?l +?u?l?d?l?d?l?u +?d?d?u?l?u?l?l +?d?d?d?l?l?l?l?d?d +?l?l?l?s?l?d?d?d +?d?s?d?s?d?s?l +?u?s?u?s?s?s +?s?l?l?s?s?s +?d?d?s?l?l?s?d?d +?s?d?l?l?l?l?s +?d?d?u?d?u?d?d?d +?u?d?d?d?d?d?u?d +?u?d?d?d?d?d?u?u +?d?d?d?d?d?u?d?u +?d?d?d?l?d?d?d?u +?u?u?d?d?d?u?d?d +?l?l?d?d?l?d?d?d?d +?d?d?d?d?u?d?u?d +?l?d?d?d?d?d?u?l +?d?u?d?u?d?d?d?d +?l?d?d?d?d?u?d?d +?d?d?u?d?d?d?d?l +?l?l?d?l?s?l?l +?l?l?d?l?l?s?l +?d?d?s?s?d?d?d?d +?l?l?l?s?l?s?l +?l?d?l?l?d?s?s +?l?s?l?d?d?d?d?d?d +?d?l?l?d?l?s?l +?u?l?l?s?l?d?d +?l?s?l?l?d?d?l +?d?l?l?d?l?l?s +?l?s?d?l?l?l?d +?d?l?d?l?l?l?s +?d?d?s?d?d?d?d?d?d?d +?u?s?l?l?d?d?d?d +?l?l?l?l?d?d?d?u +?u?l?l?u?l?l?u +?s?d?d?d?d?d?l?l +?l?l?l?d?l?s?l +?l?d?l?u?l?l?l +?u?u?l?l?u?u?d +?l?l?l?l?s?s?d?d +?d?s?d?s?d?l?d +?d?d?d?s?d?s?l +?d?s?l?d?d?d?s +?s?l?d?s?d?d?d +?d?d?s?d?l?s?d +?s?s?d?d?d?l?d +?d?l?d?s?s?d?d +?u?s?s?d?d?d?d +?l?d?d?d?s?s?d +?l?d?d?s?d?s?d +?d?s?d?l?d?s?d +?l?s?l?l?s?l?l +?u?l?l?l?d?l?l?l +?d?d?d?d?l?l?u?u +?s?l?l?l?l?l?l?l +?d?d?l?s?d?d?d?d +?d?l?d?s?d?d?d?d +?l?d?s?d?d?d?d?d +?u?u?u?u?u?l?l +?l?s?l?l?l?l?l?l +?s?l?d?d?l?l?d +?l?d?l?d?s?d?l +?s?l?d?d?d?l?l +?d?l?d?l?s?d?l +?l?d?d?d?l?s?l +?d?l?l?s?d?l?d +?s?d?d?l?l?l?d +?l?d?d?l?s?l?d +?d?d?d?s?l?u?l +?l?l?s?d?l?d?d +?l?l?u?s?d?d?d +?l?d?s?d?d?l?l +?d?l?d?d?l?l?s +?l?s?l?d?d?l?d +?d?l?d?l?l?d?s +?s?l?l?d?l?l?l +?l?l?s?l?s?l?l +?u?u?d?d?u?d?d?d +?u?u?d?d?d?d?d?l +?u?d?d?u?d?d?u?d +?d?d?d?d?d?l?l?u +?l?l?l?d?d?d?d?l?l +?l?l?l?s?l?l?l?d +?l?d?l?l?l?l?u +?s?u?u?u?d?d?s +?u?s?d?d?d?s?u +?u?l?l?s?s?d?d +?u?l?d?d?d?s?s +?l?d?d?d?l?s?s +?l?l?d?d?s?s?d +?l?s?l?d?d?s?d +?l?s?l?d?s?d?d +?u?l?s?s?d?d?d +?l?d?d?d?s?s?l +?d?d?d?l?s?l?s +?d?s?d?d?s?l?l +?u?l?l?d?d?d?d?u +?u?d?d?d?d?u?u?u +?d?d?u?u?u?d?d?d?d +?u?u?u?u?d?u?u?u +?d?u?d?l?l?l?l +?u?l?d?d?l?u?u +?u?l?d?u?d?l?l +?d?d?u?u?u?l?l +?d?u?l?u?l?u?d +?l?u?l?d?l?d?l +?u?l?d?u?l?d?u +?l?u?u?u?l?d?d +?u?l?l?u?d?l?d +?l?l?d?d?u?l?u +?l?d?l?l?l?d?u +?d?d?l?u?u?u?u +?u?l?u?d?d?u?l +?u?u?d?d?d?d?d?s +?l?l?l?l?l?u?s +?u?l?l?u?d?s +?d?s?l?u?u?u +?l?l?d?s?l?u +?l?u?l?l?s?d +?l?d?l?u?s?l +?l?l?l?s?u?d +?s?d?l?l?l?u +?l?l?s?l?d?u +?u?d?u?u?s?l +?s?l?l?d?u?u +?s?l?l?d?u?l +?l?u?u?u?d?s +?s?d?l?u?u?l +?u?d?s?u?u?l +?l?l?l?d?u?s +?d?l?l?u?s?l +?u?l?d?l?u?s +?d?s?l?u?l?u +?l?u?l?s?l?d +?l?s?u?l?d?l +?u?u?u?s?l?d +?d?l?s?l?l?u +?s?l?l?d?l?u +?l?l?u?d?l?s +?l?s?l?d?u?l +?u?l?l?s?d?u +?l?u?u?d?u?s +?u?u?u?l?s?d +?d?l?l?s?u?u +?u?d?u?l?u?s +?u?l?s?d?u?u +?d?u?l?s?u?l +?d?l?u?l?u?s +?d?u?s?l?u?u +?u?u?l?l?d?s +?u?d?l?s?u?l +?u?l?u?d?u?s +?l?u?s?l?u?d +?s?d?u?l?u?u +?u?s?u?d?u?l +?s?l?l?l?d?u +?l?u?u?s?l?d +?d?s?u?l?l?u +?s?l?d?u?l?l +?s?d?l?u?l?l +?d?d?s?u?l?l?l +?u?d?u?s?u?u +?l?l?s?d?l?u +?u?l?d?u?s?u +?u?l?d?s?l?u +?u?d?s?l?u?l +?u?s?l?l?u?d +?u?u?u?u?s?u?d +?s?u?d?l?l?l +?s?u?l?d?l?l +?d?l?s?l?u?l +?s?l?l?d?d?l?l +?l?u?d?s?l?l +?s?l?l?u?d?l +?u?l?u?u?d?s +?s?l?d?l?l?l?l +?l?u?u?d?l?s +?u?u?u?l?d?s +?u?u?l?u?s?d +?l?d?u?s?l?l +?s?l?l?d?l?l?s +?l?u?d?u?l?s +?u?s?l?u?l?d +?l?l?l?d?s?u +?l?l?u?u?s?d?d +?l?s?u?u?l?d +?l?u?l?s?d?l +?s?u?u?d?u?u +?u?u?u?d?s?u +?l?d?u?u?l?s +?u?u?u?d?l?s +?l?s?l?d?d?l?l +?u?d?u?u?l?s +?u?u?d?d?u?u?s +?l?u?s?d?l?u +?l?u?s?d?l?l +?l?u?s?l?l?d +?u?l?l?l?d?l?s +?u?l?s?l?u?d +?s?u?l?u?d?u +?d?l?u?u?u?s +?u?d?l?u?s?u +?u?d?u?l?s?l +?l?s?d?u?l?l +?s?u?u?d?l?l +?d?l?u?l?s?l +?d?u?l?u?l?s +?l?u?s?l?d?l +?l?l?d?s?u?l +?u?s?l?l?d?u +?s?d?u?u?l?u +?l?d?l?u?l?s +?u?l?d?u?u?s +?u?s?l?u?d?l +?d?s?u?u?l?l +?d?l?s?u?u?u +?u?l?u?u?s?d +?u?l?s?d?l?l +?d?u?l?s?l?l +?s?l?l?u?u?d +?l?s?d?s?l?s?d +?u?d?u?l?d?d?u +?l?d?l?d?d?l?u +?u?d?l?d?d?l?l +?d?u?l?u?d?d?l +?l?d?u?l?l?d?d +?d?l?l?d?u?u?d +?u?u?d?d?l?d?l +?d?u?d?u?u?d?u +?u?d?d?l?u?d?u +?l?d?l?u?d?d?l +?d?u?d?l?l?l?d +?d?d?u?d?u?u?u +?l?l?u?d?d?l?d +?l?l?u?d?l?d?d +?l?u?d?l?l?d?d +?u?l?l?d?u?d?d +?l?d?u?d?d?u?l +?d?u?d?u?u?u?d +?u?d?d?l?u?l?d +?l?u?l?d?l?d?d +?l?d?l?d?u?d?l +?d?l?l?u?u?d?d +?d?d?u?d?l?l?l +?u?d?d?u?l?l?d +?u?d?d?d?l?l?u +?u?d?u?l?d?u?d +?l?u?u?l?d?d?d?d +?l?u?d?d?d?u?l +?d?l?l?u?l?d?d +?d?l?l?d?l?d?u +?l?u?d?l?u?d?d +?l?d?u?d?l?u?d +?u?d?l?u?l?d?d +?l?d?d?d?l?l?u +?d?d?d?l?u?l?u +?d?u?l?u?l?d?d +?d?d?u?u?l?l?d +?d?l?u?d?l?u?d +?u?l?u?d?d?u?d +?d?d?d?d?s?u?u?u +?u?l?l?d?d?u?l?l +?s?l?l?d?d?d?d?s +?d?d?d?d?l?l?s?s +?d?l?l?d?d?d?d?d?d +?d?d?d?l?d?d?d?d?l +?d?l?s?s?s?s +?l?s?s?s?s?d +?l?s?s?d?s?s +?s?l?d?s?s?s +?u?s?s?s?s?d +?l?s?d?s?s?s +?u?l?u?l?l?d?d?d +?d?u?u?u?u?u?d?d +?u?u?d?u?l?l?l +?s?s?s?l?l?l?l +?s?l?d?l?l?l?s +?s?d?d?s?d?d?d?d +?u?u?u?u?u?u?s?d +?l?l?l?l?d?l?l?l?l +?d?d?s?d?s?d?d?l +?d?l?d?d?l?l?d?l +?l?l?l?s?s?s?s +?u?s?l?s?l?s +?d?d?l?l?l?l?l?s +?l?l?l?s?d?d?d?d?d +?l?d?l?s?d?d?d?d +?d?d?l?s?s?l?l +?l?d?s?l?d?s?l +?l?l?l?d?s?d?s +?l?u?u?d?d?d?d?d +?l?l?s?d?s?l?l +?d?d?d?d?d?d?l?d?l +?l?d?l?d?l?d?l?d?l +?l?d?d?d?s?d?d?d?d +?d?d?d?d?u?u?u?u?u +?d?u?l?l?l?l?u +?l?l?d?u?l?l?l +?d?d?d?d?d?l?l?l?l?l +?l?l?s?l?l?l?s +?u?d?l?l?l?l?l?l +?u?l?l?l?l?d?d?l +?d?u?l?l?l?l?l?d +?u?l?l?d?l?l?l?l +?s?l?u?u?l?s +?s?u?u?s?u?u +?u?s?u?l?u?s +?l?u?l?u?s?s +?l?s?u?s?l?l +?u?s?l?l?s?u +?u?l?s?u?s?u +?l?l?u?s?s?l +?u?l?l?s?l?s +?l?s?l?l?s?u +?l?l?u?u?s?s +?u?s?u?s?u?l +?l?l?l?d?s?s?s +?d?d?d?d?d?s?s?l +?l?d?d?s?d?s?d?d +?u?l?l?l?d?d?l?l +?s?l?l?s?d?d?d?d +?d?l?d?l?s?l?l +?s?l?d?d?l?l?l +?l?d?l?l?d?s?l +?u?d?l?l?d?l?s +?l?u?l?l?s?d?d +?u?d?d?s?u?u?u +?l?l?s?l?d?l?d +?d?l?l?s?l?l?d +?l?d?s?l?d?l?l +?l?d?l?l?s?d?l +?u?l?d?d?l?l?s +?s?d?l?l?l?d?l +?d?d?d?l?u?d?d?d +?d?d?d?d?l?u?d?d +?d?d?d?d?d?d?d?d?u?u +?d?u?d?d?d?u?d?d +?d?d?l?d?d?d?d?u +?d?d?d?u?d?u?d?d +?d?d?d?d?u?d?d?u +?d?d?d?d?u?d?d?l +?d?d?d?u?d?d?d?l +?l?d?d?d?d?d?u?d +?d?l?d?u?d?d?d?d +?d?s?d?s?d?s?s +?s?s?s?s?s?u +?u?d?l?u?d?l?u +?l?d?l?u?l?l?d +?u?l?u?l?d?d?l +?l?l?d?l?l?d?u +?l?l?l?d?d?l?u +?u?u?d?l?l?l?d +?u?d?l?l?l?d?u +?d?d?u?u?u?u?l +?d?l?l?d?l?l?u +?u?l?d?u?l?u?d +?l?d?d?u?l?l?l +?u?l?l?d?d?l?u +?l?u?l?u?u?d?d +?s?u?u?u?u?u?d +?l?l?l?s?s?s?d +?l?l?u?u?l?l?l +?d?d?l?l?d?d?d?s +?d?d?d?d?d?l?d?s +?d?d?d?d?l?s?d?d +?d?d?d?d?s?l?d?d +?d?d?d?l?s?d?d?d +?s?d?s?l?l?l?l +?l?l?d?l?l?s?s +?u?l?u?d?l?l?l +?l?l?d?l?l?l?u +?d?l?l?l?l?u?u +?d?u?l?l?l?l?d?d +?u?l?l?l?s?u?l +?l?l?s?d?d?s?l +?d?d?d?u?u?l?d +?u?d?d?d?l?d?u +?u?l?d?d?d?u?d +?l?d?d?u?d?u?d +?u?u?d?d?d?l?d +?l?d?u?d?d?d?l +?d?u?u?l?d?d?d +?l?d?d?d?d?u?u +?d?d?d?l?d?u?u +?d?d?u?l?d?d?l +?d?l?d?u?u?d?d +?d?l?d?d?l?d?u +?d?l?d?d?u?d?u +?d?u?l?d?d?d?u +?l?d?d?d?u?u?d +?u?l?d?u?d?d?d +?d?l?d?u?d?d?l +?d?d?d?l?l?u?d +?d?u?l?d?d?l?d +?u?d?l?d?d?d?u +?l?u?d?d?d?l?d +?d?d?d?u?l?d?u +?d?d?l?d?d?l?u +?d?d?u?d?l?d?u +?d?d?u?d?l?d?l +?d?d?d?u?d?l?l +?l?d?d?l?d?u?d +?u?d?l?d?d?u?d +?d?d?d?l?l?d?u +?d?d?l?u?d?u?d +?d?d?u?d?d?l?u +?d?d?l?l?d?u?d +?d?d?l?u?d?d?u +?l?d?u?d?d?l?d +?d?l?d?d?d?u?u +?d?d?l?u?d?d?l +?d?d?d?u?l?u?d +?l?u?d?l?d?d?d +?d?l?d?d?u?l?d +?l?d?d?u?u?d?d +?u?d?u?d?d?l?d +?d?d?l?u?d?l?d +?d?l?d?u?d?d?u +?l?u?d?d?d?u?d +?d?l?l?d?u?d?d +?l?d?u?d?d?u?d +?l?d?l?d?d?d?u +?d?u?l?d?l?d?d +?u?d?d?d?l?u?d +?u?d?u?d?d?d?l +?l?d?u?l?d?d?d +?l?d?d?d?u?l?d +?u?d?l?d?d?u?d?d +?d?l?l?d?d?d?u +?d?l?d?l?d?u?d +?d?l?d?l?d?d?u +?d?d?d?u?d?u?l +?u?d?d?d?u?d?l +?d?l?l?u?d?d?d +?l?d?d?u?d?l?d +?d?d?u?u?d?l?d +?l?d?d?d?u?d?l +?d?d?s?d?d?s?d?d?l +?s?d?d?d?d?d?d?d?d?d +?u?l?l?u?l?u?l +?d?d?d?s?d?d?s?d?d +?l?l?s?d?d?d?d?s +?s?d?d?s?s?d?d +?s?s?d?d?d?s?d +?d?d?s?d?s?d?s +?d?d?s?s?d?d?s +?s?d?d?d?d?s?d?d +?d?d?s?d?d?d?d?s +?d?d?d?d?d?s?s?d +?l?l?l?l?d?u?l +?u?u?u?u?u?u?u?u?d +?s?l?l?l?l?d?d?s +?d?d?l?l?l?l?d?d?d +?u?u?d?d?d?s?s +?d?d?d?l?s?s?l +?d?l?d?l?d?s?s +?u?s?u?s?d?d?d?d +?s?u?u?d?d?d?s +?s?d?l?d?l?d?s +?s?u?u?s?d?d?d +?l?s?d?l?s?d?d +?s?u?s?u?d?d?d +?s?s?s?s?s?s?s +?u?l?l?l?l?d?l?l +?u?u?u?u?d?d?d?u +?d?d?d?d?d?d?u?d?d +?u?u?u?u?s?s?s +?d?s?u?u?u?u?u +?s?d?d?d?d?l?l?l +?d?d?s?l?l?l?d?d +?u?l?l?l?l?l?d?s +?u?u?u?u?d?d?d?s +?d?l?s?l?l?l?d +?s?d?l?d?l?l?l +?u?u?l?l?s?d?d +?l?l?l?d?l?s?d +?l?l?l?s?s?d?d?d +?d?u?u?u?u?d?d?d +?d?s?d?s?d?s?d?s +?u?d?u?s?s?u +?d?s?u?u?u?s +?s?u?d?u?l?s +?l?l?s?u?s?d +?u?s?l?s?l?d +?l?s?l?u?d?s +?u?d?u?l?s?s +?l?u?l?d?s?s +?u?l?s?l?s?d +?s?u?d?u?u?s +?u?s?u?u?d?s +?d?s?s?u?u?u +?s?s?d?u?l?u +?s?d?l?l?s?l +?u?s?u?d?s?u +?s?u?l?d?s?l +?l?s?s?d?l?l +?s?l?d?l?u?s +?s?l?l?s?d?l +?u?s?s?l?d?l +?u?s?l?d?s?l +?u?s?u?d?u?s +?l?d?l?s?s?u +?l?l?d?u?s?s +?u?s?s?l?l?d +?d?s?l?s?l?l +?u?d?l?s?l?s +?s?s?l?l?u?d +?l?u?s?d?l?s +?l?s?u?s?l?d +?u?l?l?s?s?d +?u?l?s?l?d?s +?s?u?s?u?d?u +?u?l?d?l?s?s +?l?u?s?d?u?s +?l?u?l?s?s?d +?s?l?u?d?l?s +?u?u?s?s?u?d +?l?l?u?s?d?s +?d?s?l?l?s?l +?d?u?s?u?s?u +?u?s?l?l?s?d +?s?d?u?u?u?s +?s?s?u?u?l?d +?u?s?s?u?d?l +?s?d?u?l?s?l +?s?l?l?d?s?l +?s?u?u?u?s?d +?l?s?u?u?d?s +?s?u?l?u?d?s +?s?s?u?u?u?d +?s?u?u?l?d?s +?l?d?s?l?s?u +?s?u?d?l?s?u +?u?d?s?l?s?u +?u?l?u?d?s?s +?u?s?u?u?s?d +?u?l?u?s?s?d +?s?l?l?l?d?l?s +?u?l?s?d?l?s +?d?l?l?l?u?u?u +?u?l?l?u?u?u?d +?u?l?l?l?s?s?s +?l?s?d?d?d?l?l +?l?l?u?d?d?d?s +?d?l?d?s?l?d?l +?u?l?d?d?s?l?d +?l?d?d?s?l?d?l +?l?s?d?d?l?l?d +?l?u?l?d?d?d?s +?d?d?l?d?l?l?s +?u?d?u?s?d?u?d +?d?u?d?u?d?u?s +?d?l?l?l?d?s?d +?d?l?s?l?d?l?d +?u?d?s?l?l?d?d +?u?l?d?s?d?d?l +?l?d?s?d?l?d?l +?d?s?l?l?d?d?l +?d?d?d?d?u?l?l?s +?u?l?d?d?l?d?s +?u?d?d?s?d?u?u +?u?d?l?l?s?d?d +?u?l?l?d?d?s?d?d +?l?d?d?l?d?s?l +?u?d?d?d?u?u?d?d +?u?u?d?d?d?d?u?d +?u?d?d?u?u?d?d?d +?u?d?d?l?d?l?d?d +?u?l?d?d?d?d?d?l +?s?s?s?d?s?s +?s?s?d?s?s?s +?l?u?l?l?s?u +?l?s?l?u?l?l +?u?u?s?u?l?u +?s?l?u?u?l?l +?u?u?l?s?l?l +?u?u?u?u?l?s +?l?l?u?l?u?s +?s?u?l?l?l?l?d +?u?l?u?u?l?s +?s?l?l?l?u?l +?u?l?s?l?l?l?d +?l?s?l?l?u?u +?u?s?l?u?l?l +?l?s?l?u?u?u +?u?u?l?l?s?l +?s?u?u?u?u?l +?l?l?u?u?l?s +?u?l?s?l?l?u +?u?l?s?l?u?u +?l?l?s?l?u?l +?u?u?l?l?l?l?s +?u?u?u?s?u?l +?s?l?u?u?u?u +?l?l?u?u?s?l +?l?s?u?u?l?l +?s?u?l?u?l?u +?d?d?d?d?d?d?s?s?s +?s?l?l?l?d?d?d?s +?s?d?s?d?s?d?s +?s?s?s?s?d?d?d?d +?s?s?s?d?d?d?s +?u?d?l?u?l?d?l +?u?d?l?l?d?u?l +?u?l?u?d?d?l?u +?u?l?l?d?d?d?l?l +?u?d?l?d?l?l?u +?d?u?l?l?d?l?l +?u?l?l?u?l?d?d?d +?l?l?l?l?d?u?d +?u?l?d?l?l?d?u +?d?d?l?u?u?l?l +?u?d?l?d?u?l?l +?u?u?l?u?l?d?d +?l?d?d?u?u?u?u +?u?l?u?l?d?d?u +?u?l?u?l?d?l?d +?l?l?u?l?u?d?d +?u?u?u?u?d?l?d +?u?l?l?u?l?l?l?d +?u?d?l?d?l?l?d?d +?d?d?u?u?l?l?d?d +?d?d?d?d?l?l?l?l?d +?d?d?d?u?d?d?d?d?d +?u?u?u?u?u?u?u?s +?u?u?u?u?u?u?u?u?u +?u?l?l?l?u?l?d?d +?u?u?u?u?l?l?d?d +?l?l?d?l?l?d?d?d?d +?d?d?d?d?d?d?d?d?d?d?l +?d?d?l?l?s?s?s +?s?s?s?l?l?d?d +?u?s?l?d?d?d?d?d +?d?d?d?d?d?u?l?s +?u?l?l?l?l?l?d?l +?d?d?d?d?d?d?d?l?u +?u?l?l?l?d?l?d?d +?l?d?l?l?l?d?d?d?d +?l?l?l?d?l?l?u +?u?l?u?u?l?u?d +?u?l?l?d?l?l?u +?u?l?l?u?d?l?l +?l?d?u?l?l?l?l +?u?u?u?u?d?l?l +?d?u?u?u?u?u?s +?d?s?u?l?l?l?l +?s?d?d?d?l?l?l?l +?d?d?d?d?s?u?l?l +?u?u?u?d?d?s?d?d +?l?s?l?l?s?l?d +?s?s?l?l?l?l?d +?u?l?l?d?l?l?d?d +?l?s?d?d?d?d?s?l +?u?s?l?s?s?l +?u?s?u?s?s?u +?u?s?l?l?s?s +?s?s?u?u?u?s +?u?s?u?s?l?s +?u?l?l?l?d?d?d?l +?u?u?u?l?l?l?l?d +?d?d?s?l?s?l?l +?s?l?l?d?d?l?s +?d?l?l?l?d?s?s +?d?s?d?d?d?d?d?l +?s?d?d?l?d?d?d?d +?d?l?s?d?d?d?d?d +?d?d?d?d?l?d?d?s +?l?l?l?d?s?d?d?d +?l?l?s?d?l?l?d +?d?l?d?s?l?l?l +?l?d?s?l?l?l?d +?l?l?l?d?s?l?d +?u?d?d?l?l?l?s +?l?l?l?u?s?d?d +?l?d?s?d?l?l?l +?s?l?l?l?d?d?l +?d?s?l?l?l?l?d +?u?l?d?d?d?d?d?d?d?d +?u?u?u?d?d?d?l?l +?u?l?d?l?l?l?d?d +?u?d?u?u?u?d?d?d +?d?d?u?l?l?u?d?d +?u?d?u?d?l?d?l?d +?d?u?l?l?l?d?d?d +?u?u?u?d?u?d?d?d +?u?d?u?u?d?u?d?d +?s?s?d?d?d?d?d?d?d +?d?d?d?d?d?s?d?s +?u?d?s?d?d?s?d?d +?u?s?d?l?l?l?l +?u?u?u?u?u?d?d?u +?l?d?d?d?l?d?d?d?l +?d?d?d?d?d?u?u?l +?u?u?d?l?d?d?d?d +?u?d?d?l?l?d?d?d +?l?d?d?d?d?d?u?u +?d?d?d?s?d?d?d?d?d?d +?l?s?l?s?l?d?d?d +?d?l?l?l?u?l?l +?u?l?u?l?l?u?d +?d?u?u?u?l?l?l +?u?u?u?u?u?d?l +?l?l?d?u?u?u?u +?u?u?l?l?l?u?d +?d?u?l?u?l?l?l +?l?d?l?d?s?s?s +?s?l?l?l?l?s?d?d +?l?l?d?d?d?d?l?l?l +?u?l?u?l?l?l?s +?s?l?l?l?l?s?s +?u?u?u?d?u?u?u?d +?d?u?d?d?u?s?d +?s?d?d?l?d?d?l +?s?u?d?d?d?d?u +?d?d?u?d?d?u?s +?d?d?d?d?l?u?s +?l?d?d?l?d?s?d +?s?d?u?l?d?d?d +?d?d?u?l?d?d?s +?l?d?d?s?d?l?d +?d?l?d?l?d?d?s +?u?d?s?l?d?d?d +?l?d?u?d?d?s?d +?u?d?d?s?l?d?d +?d?d?l?l?d?s?d +?d?l?l?d?d?s?d +?d?l?l?s?d?d?d?d +?u?d?d?s?d?d?l +?l?u?d?s?d?d?d +?d?d?d?u?u?d?s +?d?d?s?l?d?d?l +?d?d?d?u?u?s?d +?s?l?u?d?d?d?d +?d?s?l?l?d?d?d +?d?d?u?s?d?d?u +?d?d?s?u?u?d?d +?d?u?d?s?d?u?d +?d?d?d?s?d?u?l +?d?d?d?s?l?u?d +?u?d?d?d?s?u?d +?d?d?d?l?l?d?d?s +?s?d?d?l?d?l?d +?u?s?d?d?d?d?u +?d?d?s?d?d?u?l +?d?l?d?d?l?s?d +?u?d?u?d?d?d?s +?d?d?s?d?l?l?d +?u?d?l?s?d?d?d +?d?d?d?l?s?d?l +?l?d?s?d?d?l?d +?s?d?d?d?l?d?l +?d?l?d?d?s?l?d +?l?s?d?d?u?d?d +?d?d?s?l?d?l?d +?s?d?d?u?d?d?u +?u?d?d?u?d?s?d +?d?d?s?d?l?d?l +?d?s?d?l?d?l?d +?d?d?d?d?l?s?u +?u?d?s?d?d?l?d +?d?d?d?d?u?s?l +?u?d?s?d?u?d?d +?d?s?d?d?l?d?l +?d?d?d?s?u?d?u +?s?l?d?d?u?d?d +?d?d?u?u?d?s?d +?s?d?d?d?d?l?u +?d?u?d?s?d?l?d +?l?d?d?s?u?d?d +?d?d?d?u?s?u?d +?d?u?s?d?d?d?u +?s?u?d?d?l?d?d +?d?u?u?d?s?d?d +?u?d?l?d?s?d?d +?s?u?d?l?d?d?d +?s?s?s?d?d?d?d?d +?d?d?d?u?u?d?d?d?d +?d?d?l?d?d?u?d?d +?u?s?u?s?u?s?d +?u?l?l?l?l?l?u?d +?l?l?l?d?l?s?s +?l?l?l?l?s?u?s +?l?l?s?l?l?s?l +?u?u?l?l?l?l?l?d +?u?d?l?u?u?d?d +?l?d?u?l?d?l?d +?u?d?u?l?d?d?l +?u?d?l?d?d?l?u +?d?u?d?u?l?u?d +?d?u?l?d?l?u?d +?d?u?u?d?d?u?u +?l?d?u?u?d?u?d +?u?d?d?u?u?l?d +?l?d?l?u?u?d?d +?l?l?u?d?u?d?d +?d?u?u?u?d?d?u +?l?d?d?d?u?l?u +?u?d?u?d?l?d?u +?l?l?d?l?d?d?u +?l?u?d?d?u?u?d +?d?u?l?d?d?u?u +?u?d?d?l?d?u?l +?u?l?d?u?d?d?l +?u?l?d?l?l?d?d?d +?l?d?l?d?l?u?d +?l?u?d?d?l?d?l +?u?u?d?l?d?l?d +?u?u?l?d?u?d?d +?u?d?d?d?l?u?u +?l?u?d?d?u?l?d +?l?d?l?d?u?d?u +?l?d?l?l?d?u?d +?d?l?d?u?u?d?l +?d?u?u?d?l?l?d +?d?d?u?l?d?u?l +?u?u?d?d?u?l?d +?u?l?d?l?d?d?u +?u?d?u?d?d?l?l +?u?d?l?d?u?d?u +?d?u?u?l?l?d?d +?u?d?l?d?l?u?d +?l?d?l?d?d?u?l +?u?u?d?u?l?d?d +?l?d?d?l?l?d?u +?d?l?u?u?l?d?d +?d?u?d?l?d?l?u +?l?l?d?d?u?d?l +?d?d?l?l?l?d?u +?u?l?d?l?d?u?d +?l?u?d?d?d?u?u +?u?u?l?d?d?l?d +?u?d?l?d?d?u?u +?u?d?l?d?d?u?l +?d?l?l?d?d?u?l +?d?u?l?d?l?l?d +?d?l?u?d?l?d?l +?l?u?d?l?d?d?l +?l?d?l?u?d?l?d +?u?l?l?d?l?d?d?d +?l?u?d?l?d?l?d +?d?d?l?u?d?l?u +?d?l?l?d?d?l?u +?l?d?u?u?l?d?d +?d?d?d?u?l?u?u +?l?d?d?l?u?l?d +?u?d?d?d?u?u?l +?l?l?d?d?d?u?l +?d?u?l?d?l?d?u +?d?l?u?d?l?l?d +?d?l?u?l?d?l?d +?d?u?l?u?d?d?u +?d?l?d?l?l?d?u +?u?l?d?d?d?d?l?u +?l?d?d?d?u?l?l +?l?u?d?d?l?d?u +?u?l?d?u?d?l?d +?l?d?u?u?u?d?d +?l?l?d?u?l?d?d +?u?d?d?l?d?l?u +?d?d?u?u?u?d?u +?d?l?l?u?d?d?l +?d?d?u?u?d?l?l +?u?u?u?d?d?l?d +?d?u?u?u?l?d?d +?d?d?u?l?d?l?l +?u?u?u?u?d?d?u?u +?l?l?u?l?l?l?d?d +?u?u?u?u?u?u?d?u +?u?l?l?l?l?l?l?u +?u?u?s?u?u?u?d +?u?l?l?d?l?l?s +?u?l?d?l?l?l?s +?u?s?u?d?u?u?u +?u?s?l?l?d?l?l +?u?l?l?l?u?s?d +?u?l?l?s?l?l?d +?u?s?u?l?l?l?d +?u?l?l?l?u?l?l?d +?u?l?l?l?l?u?l?l +?u?d?d?d?s?s?s +?l?l?l?l?l?d?d?d?s +?l?l?l?u?u?u?d?d +?d?s?d?d?s?d?d?u +?l?d?d?l?l?d?d?d?d +?l?d?l?u?l?d?l +?u?u?u?l?d?d?l +?d?l?l?l?u?l?d +?d?l?l?d?u?u?u +?u?l?d?u?l?d?l +?l?l?l?d?d?d?u?u +?u?u?u?u?u?d?d?s +?u?u?u?u?d?u?d?d +?u?u?d?d?d?u?u?u +?u?d?d?l?u?l?l +?u?l?d?u?l?l?d +?d?d?u?l?u?u?l +?u?l?u?u?l?l?d +?l?l?l?u?d?d?l +?u?u?l?d?l?l?l +?u?l?l?l?u?d?l +?d?u?l?l?u?l?d +?l?d?l?l?d?u?l +?u?d?l?l?u?l?d +?l?l?l?u?d?l?d +?u?u?d?d?u?l?l +?u?l?d?d?u?u?l +?u?l?d?l?u?d?l +?u?d?l?l?l?l?u +?l?d?u?d?u?u?u +?d?l?u?l?u?l?d +?d?l?u?l?l?l?l +?u?l?l?u?d?d?u +?l?u?d?l?l?u?d +?d?d?l?u?l?u?l +?u?l?l?l?d?l?u +?u?l?u?d?u?l?u +?l?l?u?l?d?l?d +?u?l?l?d?u?d?l +?l?d?l?d?l?l?u +?l?d?l?l?d?l?u +?u?l?u?d?d?l?l +?u?u?l?l?d?d?u +?u?d?u?l?u?d?l +?u?l?u?d?d?u?u +?l?l?d?d?l?s?s +?u?s?u?u?s?d?d +?u?l?l?l?l?l?l?l?d +?u?d?d?u?u?u?d?d +?d?d?d?u?u?u?d?d?d +?u?d?d?l?l?l?l?l +?s?u?l?l?d?d?d?d +?l?l?l?u?u?d?d?d +?u?u?s?l?l?l?l +?s?u?u?s?d?s +?u?u?d?s?s?s +?s?d?l?s?s?l +?u?s?s?s?d?u +?u?l?d?s?s?s +?u?s?l?s?s?d +?s?l?s?s?l?d +?s?s?l?l?d?s +?s?l?s?l?s?d?d +?s?l?s?s?d?l +?s?l?d?u?s?s +?d?s?l?s?l?s +?u?d?u?s?s?s +?d?s?l?l?s?s +?u?l?s?s?s?d +?s?l?s?d?l?s +?l?u?s?s?d?s +?s?d?s?l?l?s +?l?d?s?s?s?l +?u?d?s?s?u?s +?d?s?l?u?s?s +?u?s?s?u?s?d +?u?s?d?u?s?s +?s?d?l?s?u?s +?s?s?s?l?d?l +?s?d?u?l?s?s +?s?l?s?l?s?d +?s?u?s?u?s?d +?d?s?s?l?s?l +?s?l?l?s?s?d +?s?u?u?d?s?s +?u?u?s?s?s?d +?u?d?l?s?s?s +?l?l?s?s?s?d +?d?l?l?l?l?l?l?s +?s?s?s?s?s?d?d +?u?l?u?l?u?s?d +?u?l?l?l?s?l?d +?u?s?d?d?d?d?d?d?d +?u?u?d?d?u?u?u?u +?s?l?d?d?l?d?s +?d?d?l?l?s?s?d +?l?l?d?s?d?d?s +?l?d?l?d?d?s?s +?l?d?l?s?s?d?d +?l?s?d?d?l?s?d +?s?l?d?l?d?d?s +?d?d?s?d?s?l?l +?d?l?l?s?s?d?d +?l?l?d?s?d?s?d +?d?s?l?l?s?d?d +?l?l?d?d?s?d?s +?l?d?l?d?s?s?d +?d?d?l?s?d?l?s +?u?u?s?d?d?d?s +?u?u?d?d?d?d?s?s +?l?l?l?l?l?l?d?d?s +?s?d?d?l?l?l?l?l +?l?l?l?l?d?d?d?d?l +?d?d?d?d?s?d?l?l +?l?d?d?d?d?d?l?s +?l?l?d?d?l?l?l?d?d +?l?l?l?l?s?d?d?s +?l?d?l?l?l?s?s +?l?l?s?s?l?u +?s?s?l?l?l?u +?u?l?s?l?s?u +?s?l?l?u?s?l +?u?l?s?s?l?u +?u?u?s?l?s?l +?u?s?s?l?l?u +?s?u?l?u?s?l +?l?u?l?s?s?l +?u?u?s?s?l?l +?s?l?l?l?s?u +?l?s?u?l?s?u +?u?l?l?s?s?u +?u?l?u?s?l?s +?s?s?u?u?l?l +?u?l?s?l?u?s +?u?l?s?s?u?l +?u?l?d?d?l?l?l?l +?u?u?u?u?u?d?u?d +?u?u?l?l?l?u?u +?u?u?d?d?l?d?d?d +?d?u?u?d?d?u?d?d +?d?u?d?u?d?u?d?d +?l?d?u?d?d?l?d?d +?l?l?u?l?s?d?d +?s?l?d?l?d?l?l +?d?l?l?l?s?l?d +?d?l?s?l?d?l?l +?l?l?l?s?u?d?d +?u?l?l?s?u?d?d +?l?d?l?s?d?l?l +?s?l?d?l?l?l?d +?u?s?l?d?l?l?d +?s?l?l?l?d?l?d +?u?u?u?u?d?d?d?d?d?d +?d?d?d?d?u?u?u?s +?l?l?l?l?u?u?d?d +?d?d?d?d?u?l?l?u +?s?s?s?u?s?s +?u?s?l?l?l?l?d?d +?u?l?l?l?u?l?s +?s?d?d?d?d?d?s?l +?u?l?l?u?u?l?d +?l?l?u?l?l?d?l +?u?d?d?d?l?l?l?l +?s?s?d?l?l?l?l +?d?d?d?d?u?l?l?l?l +?d?d?d?d?s?s?l?l +?d?d?d?d?d?u?u?u?u +?d?d?s?d?d?s?d?d?s +?l?l?l?d?d?l?l?d?d +?l?d?l?l?d?d?d?d?d +?d?d?d?d?l?l?l?l?l?l +?l?l?l?d?d?d?d?d?d?d?d +?u?s?s?s?u?s +?u?l?s?s?s?s +?s?u?s?s?u?s +?s?s?u?s?s?u +?u?l?l?u?u?l?l +?u?l?u?l?l?u?l +?u?l?l?u?l?l?l?l +?d?d?d?d?d?d?d?s?u +?l?u?u?u?u?u?s +?l?l?l?u?l?l?d?d +?u?u?d?u?u?d?d?d +?l?d?d?s?d?d?s?d?d +?l?s?l?s?s?d?d +?l?s?l?s?d?d?s +?d?s?l?s?l?s?d +?d?d?d?d?d?l?l?l?d +?l?l?l?l?l?l?u?d +?s?l?l?l?l?l?l?d +?d?d?d?s?d?d?s?d +?d?s?d?d?d?d?s?d +?s?d?d?d?d?d?s?d +?u?u?u?u?u?d?u?u +?s?l?s?l?l?d?d +?u?s?l?l?s?d?d +?l?s?d?d?s?l?l +?l?l?l?d?s?s?d +?l?l?s?s?d?d?l +?s?d?l?l?d?l?s +?s?l?s?l?l?l?l +?d?l?l?l?l?l?l?l?d +?l?u?l?s?d?d?d?d +?u?l?d?d?d?l?l?l +?d?d?s?d?s?d?d?s +?d?s?l?l?l?l?s +?u?l?u?l?l?l?u +?s?l?d?l?d?d?d?d +?d?d?d?d?l?l?s?d +?d?d?d?s?d?d?l?l +?u?u?u?s?u?u?d +?u?s?u?d?l?l?l +?u?u?s?d?u?u?u +?l?d?l?d?l?d?l?d?d +?l?u?u?l?u?u?d +?u?u?l?l?d?l?l +?u?l?l?l?d?u?u +?d?l?u?u?u?u?u +?l?u?l?d?l?l?l +?l?u?u?l?l?l?d +?u?l?u?l?u?u?d +?u?u?l?l?l?d?l +?d?d?d?l?l?l?s?s +?d?d?l?s?s?d?d +?u?d?s?d?d?d?s +?s?s?u?d?d?d?d +?d?s?s?l?d?d?d +?u?d?s?d?d?s?d +?s?d?s?d?d?l?d +?d?l?d?d?d?s?s +?s?u?d?d?d?d?s +?u?d?d?s?d?s?d +?d?d?d?s?l?d?s +?d?l?s?d?d?s?d +?s?d?d?d?s?d?l +?d?d?s?s?d?l?d +?u?d?d?s?s?d?d +?d?d?u?s?s?d?d +?d?d?d?s?s?d?l +?d?s?s?d?d?d?l +?s?d?d?d?l?d?s +?d?s?d?d?d?s?l +?s?d?d?d?d?s?u +?s?d?d?u?s?d?d +?d?d?l?s?d?s?d +?d?d?s?d?s?d?u +?s?d?d?u?d?d?s +?u?s?d?s?d?d?d +?s?s?d?d?d?d?u +?d?d?d?l?s?d?s +?s?d?s?d?d?d?l +?l?d?s?d?d?d?s +?d?d?d?d?s?s?u +?l?s?d?d?d?s?d +?s?l?d?d?s?d?d +?d?s?d?s?u?d?d +?d?d?s?d?l?d?s +?d?s?l?s?d?d?d +?u?l?l?l?l?d?l?d +?u?l?l?d?u?l?l?d +?u?d?l?l?d?d?l?d +?d?d?d?d?l?u?l?l +?d?d?u?u?d?d?l?l +?d?d?d?d?d?d?d?d?l?d +?d?d?d?d?s?d?d?u +?d?d?d?s?d?d?l?d +?d?d?d?s?l?d?d?d +?d?d?d?s?d?l?d?d +?l?u?l?d?d?d?d?d?d +?u?d?l?l?l?l?l?d +?d?d?d?d?d?d?d?d?s?l +?l?l?l?l?d?d?l?l?l +?l?u?l?l?l?d?d?d +?d?l?d?l?s?l?d +?d?u?l?l?s?d?d +?d?d?u?u?u?s?d +?d?l?d?s?d?l?l +?u?u?d?s?u?d?d +?l?u?l?d?s?d?d +?u?l?d?d?d?s?l +?u?d?d?l?l?d?s +?u?u?d?d?s?d?u +?l?l?d?d?s?l?d +?d?l?s?l?l?d?d +?d?d?d?u?u?s?u +?u?s?d?d?d?l?l +?l?s?l?u?d?d?d +?u?l?u?d?d?d?d?s +?u?d?u?d?u?s?d +?d?l?s?d?d?l?l +?s?d?l?d?l?l?d +?l?d?s?l?d?d?l +?d?l?d?l?d?s?l +?s?d?d?l?l?d?l +?u?u?s?d?d?u?d +?d?l?l?d?s?l?d +?d?l?d?d?l?s?l +?s?l?l?d?d?l?d +?u?l?d?s?l?d?d +?d?d?l?l?s?l?d +?s?u?u?d?u?d?d +?s?l?l?d?d?d?l +?d?d?s?l?l?d?l +?l?d?d?l?s?d?l +?l?d?s?d?l?l?d +?d?d?l?s?l?l?d +?u?u?s?d?d?d?u +?s?l?l?l?s?d?d?d +?s?d?u?u?u?d?d +?u?s?u?d?u?d?d +?l?d?s?d?d?u?u +?d?l?l?d?s?d?l +?u?u?l?s?d?d?d +?u?l?s?u?d?d?d +?l?l?l?d?d?l?l?l?l +?d?d?d?d?d?d?l?d?d?d +?d?d?u?d?u?u?d?d +?u?d?d?d?d?u?u?d +?d?u?d?u?u?d?d?d +?u?l?d?d?l?d?d?d +?d?d?d?d?u?d?l?l +?u?d?u?d?d?d?d?d?d +?l?d?d?d?d?d?l?d?d +?d?s?l?l?l?l?l?l +?u?d?u?l?l?d?l +?u?l?d?l?u?l?d +?l?l?u?d?l?l?d +?u?l?d?d?l?u?l +?u?d?l?u?l?d?u +?u?u?l?d?l?d?l +?u?u?u?l?d?l?d +?d?l?d?l?u?l?l +?u?l?l?l?d?u?d +?d?l?l?l?d?u?u +?d?d?u?l?l?u?u +?u?d?l?u?l?l?d +?l?d?l?d?l?u?u +?l?l?l?d?l?d?u +?d?d?l?l?l?u?l +?l?u?u?u?d?u?d +?l?d?l?l?u?l?d +?d?u?u?d?l?l?l +?d?u?u?l?l?l?d +?u?l?l?u?d?u?d +?u?l?d?d?u?u?u +?u?l?u?d?l?d?l +?d?d?l?l?u?l?u +?u?l?u?d?u?d?u +?d?u?u?u?l?l?d +?d?d?l?l?u?u?l +?d?l?d?l?l?u?u +?u?u?l?d?d?l?l +?d?u?l?d?l?l?l +?u?l?l?u?d?d?l +?l?d?l?u?d?l?l +?l?d?l?u?d?l?u +?d?u?l?u?l?l?d +?l?l?l?d?u?d?l +?u?u?d?l?l?d?l +?u?d?l?l?l?u?d +?u?d?u?l?l?l?d +?l?l?d?d?l?u?u +?u?u?u?d?l?d?l +?l?u?l?l?d?d?l +?d?d?d?d?s?l?l?l?l +?l?u?l?l?u?l?l +?l?l?l?s?d?d?d?s +?l?u?l?l?l?l?d?d +?u?u?s?d?d?u?u +?u?s?l?l?l?d?d?d +?u?l?u?l?u?d?s +?u?d?l?d?l?l?s +?u?u?u?l?l?s?d +?u?l?s?d?d?l?l +?l?l?l?d?s?d?l +?s?d?l?l?d?l?l +?u?u?l?l?l?s?d +?l?l?d?l?s?l?d +?s?l?l?d?l?l?d +?u?d?u?u?d?u?s +?s?d?d?u?l?l?l +?l?d?s?l?l?d?l +?l?s?d?l?d?l?l +?l?l?l?d?u?l?l?l +?d?s?d?d?d?s?d?d?d +?l?l?l?d?l?d?d?d?d +?l?l?l?l?l?d?d?u +?l?s?l?s?l?s?d?d +?l?l?s?s?d?d?s +?d?u?d?l?d?u?d?l +?l?l?u?l?l?d?d?d +?l?s?d?l?l?l?l?l +?d?d?d?d?l?s?l?l +?d?d?d?d?l?d?d?d?l +?d?s?s?l?s?s +?l?s?s?s?d?s +?s?s?d?l?s?s +?s?s?s?l?s?d +?s?s?l?s?s?d +?s?s?s?d?l?s +?d?s?l?s?s?s +?s?s?l?d?s?s +?s?s?d?s?s?l +?s?s?s?l?d?s +?s?d?u?s?s?s +?u?d?s?s?s?s +?s?s?u?d?s?s +?u?l?l?l?u?d?u +?l?u?u?u?u?l?d +?u?u?u?l?l?l?s +?u?u?u?l?l?d?l +?d?u?l?l?l?u?l +?u?l?l?u?l?u?d +?u?l?u?s?u?l?u +?l?l?u?l?l?u?d +?l?u?l?u?l?l?d +?d?d?d?d?d?d?l?s?l +?l?s?l?d?l?l?s +?l?s?l?s?l?d?l +?d?d?s?d?d?s?d?d?d +?d?d?d?d?d?d?d?s?d?d +?d?d?d?l?s?s?s +?d?d?d?s?s?u?s +?u?l?d?l?l?l?l?l +?u?u?u?u?l?d?d?d +?l?d?d?d?d?d?s?s +?d?d?d?d?d?d?d?d?s?s +?s?s?s?u?l?l +?s?s?s?u?l?u +?u?l?s?l?s?s +?s?s?u?l?l?s +?s?l?u?l?s?s +?u?u?s?u?s?s +?u?s?s?s?u?u +?s?u?l?l?s?s +?s?u?u?s?s?u +?l?s?u?s?l?s +?l?u?l?s?s?s +?u?s?l?s?u?s +?u?u?s?s?u?s +?s?s?l?s?l?l +?l?l?l?l?l?d?l?l?l +?d?d?l?l?l?l?d?d?d?d +?l?u?s?d?d?d?d?d +?d?d?d?s?l?l?d?d +?l?d?d?d?l?d?d?s +?l?d?l?d?d?d?d?s +?u?l?u?s?d?d?s +?l?d?s?l?s?l?d +?d?l?l?d?l?s?s +?s?l?l?s?l?d?d +?l?l?d?d?s?s?l +?s?u?u?u?s?d?d +?u?l?u?d?d?s?s +?s?s?l?d?l?d?l +?d?d?l?l?s?s?l +?l?d?d?l?l?s?s +?l?s?l?l?d?d?s +?l?s?d?d?l?s?d?d +?u?l?u?u?l?l?l +?l?l?l?l?l?l?l?u +?l?d?l?d?l?d?d?s +?d?d?d?s?d?l?l?l +?s?d?d?d?d?d?d?d?d?s +?s?l?l?l?s?l?l +?u?d?u?u?u?u?u?u +?l?l?l?d?d?d?d?d?s +?d?d?u?d?d?d?d?d?d +?d?d?d?d?d?d?d?u?d +?u?l?d?l?d?l?d?d +?u?d?d?u?u?d?d?u +?d?d?l?l?u?u?d?d +?d?s?d?s?d?s?d?d +?d?s?d?d?s?d?d?s +?u?s?d?u?u?u?u +?u?l?l?s?d?l?l +?u?s?l?l?l?d?l +?l?l?l?s?u?u?u +?d?l?l?l?d?d?d?d?d +?l?s?s?l?l?l?d +?d?l?l?l?l?l?l?d?d +?l?l?l?l?d?d?s?d?d +?l?l?d?s?d?s?d?d +?l?l?d?d?d?d?d?d?d?d?d +?u?l?u?l?u?l?u?l +?d?d?d?d?d?l?d?u +?d?u?d?d?d?l?d?d +?d?d?d?u?d?d?u?d +?u?d?d?d?d?d?l?d +?l?u?d?d?d?d?d?d?d +?d?d?u?d?d?d?u?d +?l?d?u?d?d?d?d?d +?d?d?d?l?d?u?d?d +?d?u?d?l?d?d?d?d +?d?d?d?d?d?u?d?l +?d?d?d?d?u?d?l?d +?d?d?u?d?d?d?d?u +?d?d?d?d?l?d?d?u +?d?d?l?u?d?d?d?d +?l?l?l?l?l?l?l?l?l?l +?u?u?d?d?d?l?l?l +?d?d?d?d?d?d?s?d?d?d +?u?u?d?u?u?u?u?u +?l?l?d?d?d?d?l?s +?l?d?d?s?s?s?s +?d?d?d?s?u?u?u?u +?s?d?d?d?d?d?d?d?l +?u?d?d?d?d?d?d?d?s +?u?u?u?l?l?u?d +?l?u?l?l?l?d?l +?l?l?l?d?l?u?u +?u?l?u?d?l?u?l +?u?l?u?l?d?u?u +?u?l?d?l?l?l?u +?l?l?l?l?u?d?l +?l?l?l?u?l?d?l +?d?u?l?u?l?u?l +?l?l?d?l?l?u?u +?l?l?l?l?l?s?s?s +?l?l?s?l?l?l?l?d +?d?d?d?d?d?d?d?d?d?d?d?d?d +?l?u?u?u?u?u?u?d +?d?s?d?s?l?s?l +?l?d?d?l?s?s?s +?l?s?l?s?d?s?d +?l?l?s?d?d?s?s +?u?u?d?d?s?s?s +?l?l?l?s?d?s?d?d +?s?d?s?d?s?d?s?d +?l?l?l?u?u?l?l +?l?u?l?l?l?u?l +?u?u?u?d?d?d?d?d?d?d +?l?l?l?l?s?l?l?d +?d?s?d?d?l?l?l?l +?d?d?d?d?l?u?u?u +?d?d?u?u?d?d?d?u +?d?d?d?l?u?l?d?d +?d?d?u?d?u?d?d?u +?u?d?u?d?u?d?d?u +?d?d?u?l?d?d?u?l +?d?u?d?d?u?d?d?u +?u?d?d?l?d?d?l?d +?l?d?u?d?l?d?u?d +?d?u?d?l?l?d?d?d +?u?d?d?d?l?l?d?d +?d?d?d?u?d?d?u?u +?d?d?u?d?d?u?d?u +?d?d?d?d?u?u?u?l +?u?d?d?d?u?d?d?u +?d?d?d?u?d?u?d?u +?d?d?d?u?l?u?d?d +?u?d?d?l?d?u?d?d +?d?d?d?d?d?d?u?l?u +?d?d?l?l?d?d?u?u +?l?l?d?u?l?l?l?l +?s?l?d?d?d?d?d?s +?l?s?l?d?l?l?l?l +?d?d?d?d?d?d?d?d?d?d?u +?l?l?l?d?d?u?u?u +?l?s?l?l?d?l?s +?u?l?l?l?d?s?s +?l?s?l?s?l?l?d +?d?d?l?d?l?d?d?d?d +?u?l?s?l?l?d?l +?l?l?l?l?s?d?u +?l?l?l?l?u?s?d +?l?s?l?l?l?l?l?d +?l?d?l?d?l?d?l?s +?u?l?l?d?l?l?l?d +?d?d?s?d?s?s?d +?s?d?s?s?d?d?d +?d?s?d?d?s?d?s +?d?s?d?d?s?s?d +?s?u?l?u?l?u?s +?l?u?u?u?d?d?d?u +?u?d?l?l?d?l?l?d +?l?l?u?u?u?d?d?d +?s?d?d?l?l?l?d?d +?d?s?s?d?d?d?d?d +?u?l?l?l?s?d?d?d?d +?u?l?l?l?u?l?u +?u?l?u?u?l?u?l +?u?u?l?l?l?l?u +?d?l?d?l?d?l?d?l?d +?d?l?s?l?s?d?d +?d?d?l?l?d?s?s +?s?u?l?d?d?d?s +?l?d?l?s?d?s?d +?d?d?d?u?l?s?s +?s?s?d?l?d?d?l +?d?s?l?d?s?l?d +?u?d?u?d?d?s?s +?l?s?d?d?l?d?s +?s?d?d?l?l?d?s +?s?l?l?d?d?s?d +?d?d?s?l?l?s?d +?d?s?l?d?d?s?l +?s?s?u?u?d?d?d +?d?s?d?l?l?s?d +?l?s?d?d?d?l?s +?d?d?d?u?u?s?s +?u?u?d?s?s?d?d +?s?s?d?d?d?u?u +?u?u?s?d?d?s?d +?s?s?l?d?l?d?d +?s?l?d?l?s?d?d +?s?d?s?l?l?d?d +?d?d?d?s?u?u?s +?u?u?d?d?s?s?d +?d?u?d?d?d?d?d?d?d +?d?d?d?d?d?u?u?s +?l?d?d?l?d?d?d?s +?l?d?d?d?d?l?d?s +?u?l?d?d?d?d?s?d +?d?d?d?d?s?l?l?d +?d?d?l?l?d?s?d?d +?d?d?d?d?l?l?d?s +?u?l?l?l?l?l?d?d?d?d +?l?l?d?d?l?l?d?d?d +?l?d?d?d?d?d?d?l?d +?u?d?l?s?l?l?d +?u?l?l?u?d?d?s +?l?u?l?u?s?d?d +?d?l?s?d?l?l?l +?l?l?l?s?d?d?u +?u?l?l?s?d?d?l +?d?s?l?l?d?l?l +?s?l?l?d?l?d?l +?u?l?u?u?s?d?d +?l?u?l?u?d?d?s +?u?s?l?l?u?d?d +?s?d?u?u?u?u?d +?u?l?d?l?l?s?d +?l?s?d?l?l?d?l +?u?u?u?d?u?d?s +?u?d?d?u?u?u?s +?u?u?d?d?s?u?u +?d?s?l?l?l?d?l +?u?l?d?d?u?l?s +?u?l?l?d?d?l?s +?d?l?l?l?d?s?l +?d?d?l?l?l?s?u +?d?u?u?s?d?u?u +?d?d?s?u?u?l?l +?u?u?d?s?u?u?d +?s?s?u?l?l?l?l +?s?l?l?s?l?l?l +?u?u?u?d?d?u?d?d +?u?d?l?d?l?d?u?d +?u?l?l?l?d?d?d?d?d?d +?d?d?d?d?l?d?d?d?d?d +?l?l?u?u?u?l?l +?u?l?u?u?u?u?u +?u?u?l?l?u?l?l +?d?l?s?l?s?d?l +?d?d?l?s?l?s?l +?u?l?l?s?d?d?s +?u?l?s?l?s?d?d +?d?d?u?u?u?s?s +?u?s?l?s?u?d?d +?d?s?u?u?u?s?d +?u?u?u?s?d?s?d +?u?u?u?u?d?s?s +?l?s?d?l?l?l?s +?l?s?l?d?d?l?s +?d?l?s?d?l?l?s +?l?l?l?s?d?s?l +?l?s?l?l?d?s?d +?l?l?l?s?d?l?l?l +?d?d?u?u?u?u?u?d +?l?l?l?l?l?l?l?l?s +?d?d?d?l?l?l?l?d?d?d +?l?l?l?u?l?u?d +?u?u?l?u?u?u?d +?u?d?l?l?u?l?l +?l?l?l?d?l?u?l +?l?d?l?l?l?u?u +?l?l?u?u?d?l?l +?l?l?l?l?u?l?d?d +?l?l?l?u?d?l?l +?u?d?l?u?l?l?l +?l?l?l?l?u?d?u +?u?l?l?l?u?u?d?d +?d?d?d?d?d?d?l?l?d?d +?d?d?s?d?l?l?l?l +?u?l?s?l?d?d?d?d +?l?l?s?d?d?d?d?l +?s?l?d?d?d?d?d?d?d +?s?s?s?s?d?s +?s?d?s?s?s?s +?l?l?s?l?l?s?d?d +?l?u?l?l?s?l +?l?l?u?l?s?l +?u?l?s?u?u?l +?l?u?l?s?l?l +?l?s?u?l?u?l +?l?u?s?l?u?u +?l?l?u?s?u?l +?l?l?u?s?u?u +?u?s?u?u?l?u +?l?u?l?u?s?u +?l?u?l?u?s?l +?l?u?u?l?l?s +?u?s?l?l?u?u +?l?s?u?l?l?u +?l?u?s?u?u?l +?l?u?u?s?u?u +?u?l?l?u?s?l +?l?u?s?l?u?l +?u?l?u?u?u?s +?l?u?s?u?u?u +?u?u?l?u?u?s +?u?u?u?l?s?l +?u?u?l?u?s?u +?u?u?l?l?s?u +?u?s?l?l?u?l +?s?u?l?u?u?u +?u?l?u?s?u?u +?l?l?s?l?u?u +?u?s?l?u?u?l +?u?s?l?u?u?u +?l?u?u?l?s?l +?l?s?l?u?l?u +?s?l?l?l?u?u +?u?l?u?u?s?u +?s?l?u?l?u?l +?s?l?u?u?u?l +?d?d?d?d?d?s?d?d?d?d +?d?d?d?d?s?d?d?d?d?d +?s?l?s?l?s?l?s +?l?l?l?l?l?s?l?d +?d?l?l?l?s?s?s +?l?u?l?l?d?l?d +?u?u?l?l?d?l?d +?l?d?u?l?d?l?u +?d?u?l?d?u?u?l +?u?l?d?u?d?l?u +?l?u?u?u?d?d?u +?l?u?u?u?d?d?l +?u?d?l?l?u?d?u +?u?l?d?l?u?u?d +?u?l?l?d?u?d?u +?l?u?d?l?d?l?u +?d?l?u?u?u?u?d +?u?d?l?l?d?u?u +?d?d?l?u?l?l?l +?u?l?u?l?d?u?d +?u?l?u?u?d?d?l +?d?l?u?l?l?u?d +?u?d?d?u?l?l?u +?l?u?l?u?d?d?l +?u?l?d?l?u?d?u +?u?d?u?l?d?u?l +?d?l?l?l?d?l?u +?d?l?d?l?l?u?l +?l?l?l?d?u?l?d +?u?d?l?u?u?d?l +?u?d?u?u?u?l?d +?d?l?d?u?l?l?l +?l?u?l?l?d?d?u +?l?u?l?d?l?l?d +?u?d?d?l?l?u?u +?u?d?d?l?l?u?l +?l?u?l?d?d?l?u +?l?l?d?l?d?u?u +?l?d?l?l?u?d?l +?u?u?d?d?u?u?l +?l?d?l?d?u?u?u +?l?u?u?l?u?d?d +?d?l?l?l?l?u?d +?u?u?d?d?l?u?u +?l?l?l?d?d?u?l +?d?l?l?d?u?l?l +?d?l?l?d?u?l?u +?l?u?d?u?d?u?u +?l?l?u?u?d?d?l +?u?d?l?d?u?u?u +?u?d?u?l?u?d?u +?l?l?d?d?d?l?l?s +?d?d?d?d?u?u?d?d?d +?s?l?l?s?l?l?s +?u?u?l?l?l?l?l?l +?s?u?u?s?s?s +?s?s?s?u?u?s +?s?u?s?u?s?s +?u?s?s?u?s?s +?u?s?s?s?s?u +?s?l?s?s?s?l +?s?s?s?u?s?u +?s?s?l?s?l?s +?u?u?u?u?l?l?l?l +?s?s?s?d?d?l?l +?s?l?l?s?s?d?d +?s?s?l?l?s?d?d +?s?l?l?d?d?s?s +?u?l?d?d?s?s?s +?s?l?l?s?d?d?s +?u?u?u?u?u?u?d?d?d?d +?l?l?l?s?u?l?l +?s?s?l?l?d?d?d?d +?s?l?d?d?d?d?l?s +?u?d?u?u?u?u?d?d +?u?d?d?d?u?u?u?u +?d?d?d?d?l?l?s?l +?s?u?u?u?d?d?d?d +?l?d?l?l?s?d?d?d +?l?d?l?l?s?l?s +?l?l?s?l?l?d?s +?u?d?u?d?u?u?d?d +?d?d?d?u?l?l?l?d +?u?l?l?d?d?l?d?d +?u?d?d?l?u?d?d?l +?l?l?d?d?d?l?l?d?d +?s?l?l?l?l?s?l +?l?l?l?l?l?l?l?l?l?d +?d?d?d?d?u?u?u?d?d +?u?u?d?d?d?d?d?d?u +?l?d?d?d?l?l?l?s +?l?l?l?d?d?d?d?d?l +?d?d?d?d?d?l?d?d?d?d +?d?d?d?d?d?d?d?l?d?d +?d?d?l?d?d?l?d?d?d +?u?u?u?d?u?u?d?d +?d?d?u?l?l?l?l?d +?d?l?d?d?d?d?d?s +?s?d?d?d?d?l?d?d +?d?d?d?d?u?s?d?d +?d?d?u?d?d?s?d?d +?s?d?l?d?d?d?d?d +?u?d?d?d?d?d?s?d +?u?l?l?l?d?l?l?d +?l?l?l?l?l?l?d?d?l +?d?d?d?d?l?d?d?d?d?l +?l?l?l?s?d?d?d?l +?u?u?u?l?l?l?l?l +?d?s?d?s?d?d?l?l +?s?d?d?d?d?s?l?l +?u?l?d?d?d?d?s?s +?s?s?u?u?u?s?s +?u?d?l?l?l?d?l?l +?u?d?l?l?s?l?l +?l?l?l?l?l?l?l?s?d +?u?d?d?u?d?d?d?u +?d?d?d?d?l?l?u?d +?d?d?d?u?u?d?d?u +?u?u?d?d?d?l?d?d +?d?l?d?d?d?d?u?u +?d?d?d?d?u?l?u?d +?u?d?u?d?l?d?d?d +?d?d?u?d?d?d?u?u +?d?d?d?d?l?u?l?d +?l?d?d?d?l?l?d?d?d +?u?l?d?d?d?u?d?d +?u?d?d?d?l?d?l?d +?u?u?d?u?u?u?d?d +?l?l?l?u?u?l?d +?l?l?u?u?l?l?d?d +?u?l?u?l?u?d?u +?u?l?u?l?d?u?l +?d?u?l?l?l?u?u +?u?l?u?l?d?l?l +?d?l?l?l?l?u?l +?l?d?u?u?l?l?l +?u?l?u?l?l?d?l +?u?l?l?l?s?u?u +?u?u?s?u?l?l?l +?l?l?d?l?s?d?d?d +?l?s?d?l?d?d?d?d +?d?d?s?d?d?d?l?l +?u?d?d?l?d?d?d?s +?d?d?d?l?l?s?d?d +?d?d?d?d?d?u?s?u +?d?d?l?l?s?d?d?d +?u?d?u?s?d?d?d?d +?u?u?d?s?d?d?d?d +?l?d?s?l?d?d?d?d +?u?u?l?l?u?u?u +?l?l?l?l?u?u?l +?l?l?u?l?l?u?l +?d?l?d?d?l?d?d?d?d +?u?l?l?l?s?d?s +?l?l?l?s?s?l?d +?u?l?u?l?u?l?u?d +?l?d?u?d?d?l?l +?u?d?d?d?d?u?l?l +?d?l?u?u?u?d?d +?l?l?d?d?u?u?d +?l?d?d?u?d?u?u +?d?l?d?l?u?d?l +?u?u?d?d?d?l?u +?l?u?d?u?d?d?l +?l?d?d?d?u?u?l +?d?l?d?u?l?u?d +?d?l?d?d?u?l?l +?l?d?u?d?d?l?u +?d?l?u?u?d?d?l +?d?l?l?l?u?d?d +?u?d?u?d?u?u?d?u +?u?d?l?u?d?d?u +?d?u?l?l?u?d?d +?d?u?d?u?d?l?l +?d?l?d?l?u?l?d +?u?l?d?u?u?d?d +?l?d?l?l?d?d?u +?d?d?u?u?u?l?d +?d?l?u?d?u?d?u +?d?d?u?l?u?u?d +?d?u?l?d?u?l?d +?d?u?d?l?l?d?l +?d?l?u?l?l?d?d +?l?l?d?u?u?d?d +?u?d?u?l?d?l?d +?l?d?u?d?l?d?u +?l?d?d?u?l?u?d +?l?d?d?l?l?u?d +?u?l?l?u?u?d?d?d +?u?d?d?l?d?d?l?l +?u?d?l?u?d?u?d +?d?u?d?l?d?u?l +?d?u?d?l?d?u?u +?u?d?u?u?l?d?d +?u?d?d?u?l?u?d +?u?d?d?d?l?u?l +?d?u?l?d?u?d?l +?l?l?u?d?d?u?d +?u?d?u?d?l?u?d +?d?u?l?d?d?l?u +?d?d?l?l?l?u?d +?l?d?u?l?d?d?l +?l?d?u?u?d?d?u +?u?d?l?l?d?u?d +?d?u?d?l?u?d?l +?d?d?u?l?d?u?u +?d?d?u?d?l?l?u +?u?d?d?u?d?u?l +?l?u?d?u?d?d?u +?u?u?d?d?l?d?u +?d?d?l?l?u?d?u +?l?u?l?d?d?u?d +?l?l?d?d?l?d?u +?u?u?d?l?d?d?l +?l?u?d?d?u?d?l +?l?d?d?l?u?u?d +?d?u?l?l?d?l?d +?u?d?u?d?d?u?l +?d?l?d?d?u?u?u +?u?d?u?d?d?l?u +?d?u?u?d?d?l?l +?l?l?d?u?d?u?d +?l?u?d?u?d?u?d +?u?l?d?d?u?u?d +?l?l?u?d?d?d?l +?d?u?u?d?l?d?u +?u?u?l?d?d?u?d +?l?u?d?u?d?l?d +?l?d?d?l?d?u?l +?u?d?u?u?d?d?l +?u?d?l?l?l?d?l?d +?d?u?u?d?l?d?l +?u?d?d?u?l?d?u +?u?u?u?d?d?l?d?d +?d?u?d?d?l?l?l +?d?u?d?d?u?u?u +?l?u?u?d?d?u?d +?d?d?l?u?d?u?l +?d?d?l?l?u?u?d +?d?l?d?d?l?u?l +?d?d?l?l?d?u?u +?d?d?l?d?u?l?l +?d?u?d?l?d?l?d?l +?l?d?d?l?u?d?u +?d?d?l?d?l?u?u +?d?l?d?l?l?u?d +?l?d?u?d?l?l?d +?l?d?d?u?u?u?d +?d?d?l?u?u?d?l +?d?u?d?l?l?u?d +?l?d?d?u?u?d?l +?l?d?d?d?l?u?u +?d?l?u?u?d?d?u +?d?l?u?d?d?l?u +?d?l?u?d?d?l?l +?d?u?l?l?d?d?u +?l?d?l?d?u?l?d +?l?u?l?d?d?l?d +?l?l?d?u?d?d?l +?u?d?u?d?u?l?d +?l?d?l?l?u?d?d +?d?l?l?d?u?d?l +?d?u?d?u?d?u?l +?l?d?l?d?u?u?d +?d?d?l?u?l?u?d +?l?l?d?d?u?l?d +?d?l?d?u?l?d?l +?d?d?u?u?l?u?d +?d?u?l?u?d?l?d +?l?u?u?d?l?d?d +?u?l?u?d?l?d?d +?l?u?u?d?d?d?l +?l?u?u?d?d?d?u +?d?l?d?u?l?d?u +?l?d?u?l?u?d?d +?u?u?l?d?l?d?d +?d?l?l?d?u?l?d +?d?l?u?u?d?u?d +?d?u?d?l?d?l?l +?l?d?d?d?l?u?l +?d?l?d?u?d?l?l +?d?d?u?l?l?d?l +?d?u?d?d?l?u?l +?d?l?u?u?d?l?d +?u?d?l?d?u?u?d +?s?d?d?d?d?l?l?s +?d?d?d?d?d?d?d?d?d?l?l +?l?l?d?l?d?d?d?d?d +?d?l?l?l?l?l?d?d?d +?u?l?u?l?l?l?l?d +?s?s?l?l?l?l?d?d +?l?l?l?l?l?l?d?l?d +?s?s?l?d?d?d?s +?l?s?d?d?d?s?s +?s?u?s?d?d?d?s +?s?d?s?d?s?d?l +?l?d?s?d?d?s?s +?l?d?s?d?s?d?s +?d?d?d?s?s?s?u +?l?l?l?l?d?d?u?u +?l?l?l?l?d?u?l?l +?u?l?l?l?d?s?d?d +?l?s?s?d?d?d?d?d +?d?d?s?d?d?s?l?d +?u?u?u?d?l?l?l?l +?l?u?u?u?u?u?l +?l?l?u?l?l?l?u +?u?d?l?l?d?l?d?l +?d?d?d?l?l?l?l?u +?u?d?l?d?l?l?l?d +?d?s?d?l?l?l?l?l +?l?l?l?l?l?d?d?d?l +?d?s?d?s?u?u?u +?d?l?s?l?s?l?d +?s?d?u?u?u?d?s +?l?s?l?s?d?d?l +?u?u?s?s?u?d?d +?s?l?l?d?l?d?s +?l?d?d?l?s?s?l +?l?l?s?d?l?s?d +?u?d?u?d?u?s?s +?s?s?u?l?l?d?d +?s?u?d?u?u?d?s +?s?u?l?u?s?d?d +?s?u?l?l?d?d?s +?l?d?l?d?s?l?s +?u?l?u?s?s?d?d +?d?s?l?l?l?d?s +?u?l?u?d?s?d?s +?l?s?d?l?s?d?l +?d?l?d?l?s?s?l +?s?s?u?u?u?d?d +?s?d?s?d?l?l?l +?u?s?l?l?l?l?s +?u?u?d?d?l?l?l?l +?d?d?d?d?d?l?d?d?l +?d?d?u?l?l?l?l?d?d +?s?s?s?s?l?l?l +?u?l?u?l?u?d?d?d?d +?l?l?s?u?l?l?l +?l?l?l?u?u?u?s +?l?l?l?l?s?u?u +?l?l?l?l?d?d?d?l?l +?d?d?s?s?s?l?l +?l?s?l?s?d?s?l +?d?s?l?s?d?s?l +?d?l?d?l?s?s?s +?u?l?d?s?l?l?l +?l?s?s?l?d?d?d?d +?u?l?l?l?l?l?l?l?l +?u?d?l?d?l?d?l?l +?l?u?l?u?l?d?d?d +?u?l?l?l?d?d?d?u +?l?u?l?l?s?s +?u?l?u?l?u?s?s +?s?l?l?s?u?l +?l?s?u?u?s?l +?l?l?s?u?s?u +?s?u?l?s?u?l +?s?l?s?l?l?u +?s?l?s?l?u?l +?u?s?l?u?s?l +?u?l?l?s?u?s +?u?s?l?u?s?u +?s?l?u?l?s?l +?u?s?l?l?u?s +?l?s?l?s?u?u +?u?u?u?l?s?s +?u?l?u?s?s?l +?l?u?u?s?u?s +?l?l?s?u?l?s +?u?u?u?s?s?l +?u?l?u?s?u?s +?u?u?s?l?l?s +?s?l?l?u?s?u +?l?u?u?u?s?s +?s?s?l?l?u?u +?l?l?l?s?s?u +?l?l?s?l?d?l?s +?u?l?s?u?s?l +?u?u?l?u?s?s +?s?u?s?u?u?u +?u?s?u?s?l?l +?l?s?s?l?l?u +?s?u?l?u?u?s +?s?u?u?l?l?s +?l?s?l?s?d?l?l +?l?u?l?s?s?u +?l?s?u?l?s?l +?l?s?u?s?l?l?l +?u?l?l?l?s?s?d +?u?s?u?l?s?l +?l?s?s?u?l?l +?s?l?l?l?u?s +?s?l?u?l?l?s +?s?u?u?l?u?s +?s?l?l?s?l?u +?s?l?l?u?l?s +?u?s?u?d?u?s?u +?s?l?u?u?u?s +?s?u?l?l?l?u?s +?s?l?s?u?u?u +?l?l?s?l?u?s +?l?s?l?u?s?l +?l?u?l?u?l?u?d?d +?l?l?l?l?l?d?d?l?l +?d?d?d?d?d?d?d?d?d?d?s +?l?l?l?l?l?s?s?d +?u?l?l?l?u?u?l +?l?u?l?u?l?l?l +?u?u?l?l?u?u?l +?u?u?u?l?l?u?u +?l?u?l?l?l?l?u +?u?d?l?u?d?l?s +?u?d?u?d?u?u?s +?u?u?u?d?d?s?u +?u?l?s?l?u?d?d +?d?l?l?l?s?d?l +?d?l?s?l?l?d?l +?u?u?d?d?s?l?l +?u?l?s?l?d?d?l +?u?u?d?d?u?s?u +?l?s?l?d?d?u?l +?u?u?u?s?d?d?u +?d?l?l?d?s?l?l +?u?s?d?u?u?d?u +?u?d?l?l?s?d?l +?u?l?l?d?d?s?l +?u?u?u?d?d?u?s +?u?l?d?s?d?l?l +?u?s?u?u?d?d?u +?u?d?l?l?l?d?s +?u?u?u?s?d?u?d +?l?l?u?u?d?d?s +?u?s?u?d?d?l?l +?u?d?d?u?s?u?u +?l?l?l?d?d?u?s +?u?u?u?s?d?l?d +?l?l?d?d?s?u?u +?u?l?l?d?l?d?s +?u?l?d?d?l?u?d?d +?l?d?l?d?u?d?u?d +?d?d?d?u?u?d?u?u +?d?d?d?u?u?u?u?d +?u?u?l?u?d?d?d?d +?u?d?u?d?d?d?u?u +?s?s?s?l?s?s +?s?u?s?s?s?s +?s?s?u?s?s?s +?s?s?l?s?s?s +?s?l?s?s?s?s +?d?l?d?d?d?d?d?d?d?d +?s?s?l?s?s?d?d +?u?l?l?d?u?u?u +?d?l?l?u?u?u?u +?u?l?d?l?u?l?u +?l?l?u?d?l?l?l +?l?d?l?u?l?u?l +?u?u?u?l?d?l?l +?l?d?l?l?l?u?l +?l?d?l?l?u?l?l +?u?l?u?u?u?u?d +?l?u?l?u?u?u?d +?u?l?u?d?u?l?l +?l?l?l?u?u?d?u +?l?l?u?u?l?d?l +?u?l?l?d?u?l?l?l +?u?d?d?l?l?l?l?d +?d?d?u?d?d?u?d?d?u +?d?d?l?d?d?d?d?d?l +?d?l?d?l?d?d?d?d?d +?l?l?s?d?d?d?l?l +?l?l?s?d?l?l?l?l +?u?u?l?l?u?u?d?d +?l?l?l?l?l?l?d?u +?l?d?l?l?s?s?s +?d?l?d?l?d?l?d?s +?l?d?d?l?d?d?l?s +?d?d?u?l?l?d?d?s +?d?d?u?u?u?u?u?d?d +?d?l?d?l?d?l?d?d?d +?u?u?l?d?d?d?d?d?d +?u?d?d?l?d?d?l?d?d +?u?u?u?u?l?l?u +?u?l?l?u?u?u?u +?l?l?l?l?u?l?u +?l?l?l?d?l?l?l?l?l +?u?l?l?l?u?d?d?d?d +?u?l?u?l?s?d?d?d +?u?u?u?u?l?l?l?d +?u?u?u?u?s?s?u +?d?d?d?u?u?u?u?u?u +?u?l?d?l?d?l?l?d +?d?s?d?d?d?d?d?s +?d?d?d?d?s?d?s?d?d +?l?l?l?s?s?s?l +?l?l?d?l?l?d?l?l?d +?s?u?l?l?l?d?s +?s?l?s?l?l?l?d +?l?l?l?d?l?l?l?s +?d?d?d?d?l?l?l?l?s +?u?l?d?d?d?s?d?d +?d?l?l?d?d?d?d?s +?l?d?d?l?s?d?d?d +?d?s?d?d?d?d?l?l +?u?s?u?d?d?d?d?d?d +?l?d?d?s?l?d?d?d +?d?d?s?l?l?d?d?d +?u?d?l?s?d?d?d?d +?s?d?l?l?d?d?d?d +?s?u?l?d?d?d?d?d +?l?d?l?l?l?s?d?d +?u?d?u?s?u?u?u +?u?d?s?l?l?l?l +?u?s?u?u?d?u?u +?u?l?s?d?l?l?l +?u?l?s?u?l?l?d +?u?l?s?l?d?l?l +?u?l?l?s?u?l?d +?u?u?s?l?l?l?d +?d?d?d?d?d?d?d?d?l?l?l +?s?s?u?u?u?u?u +?s?u?s?l?l?l?l +?l?d?l?d?l?d?s?s +?d?d?d?l?d?d?l?d?d +?u?d?d?u?d?d?d?d?d +?d?d?d?l?d?l?d?d?d +?u?u?u?s?s?s?s +?d?d?l?d?d?d?d?d?d?d +?u?l?s?s?d?d?d?d +?d?d?s?d?s?d?d?u +?d?d?d?d?d?s?l?s +?d?d?d?d?d?l?s?s +?u?d?d?d?d?d?s?s +?s?s?d?d?d?d?d?l +?d?d?d?d?l?l?u?l +?l?u?d?u?d?d?d?u +?u?l?u?d?d?d?d?l +?d?l?l?l?d?d?d?u +?d?d?d?d?l?u?l?u +?u?u?s?d?d?d?d?d?d +?d?d?d?d?d?d?d?u?s +?d?u?u?u?d?u?u?u +?u?u?u?s?u?u?u?u +?l?l?l?l?l?l?l?d?l +?l?l?l?u?l?l?u +?u?l?l?l?d?u?l?l +?s?s?s?l?l?l?d +?l?l?l?s?d?s?s +?d?l?d?s?l?l?d +?u?u?d?u?d?d?s +?d?u?u?u?d?d?s +?l?d?d?u?l?d?s +?d?d?s?l?l?u?d +?u?d?s?l?d?l?d +?u?d?l?d?d?l?s +?u?d?d?u?d?u?s +?s?l?d?d?u?d?l +?l?d?d?s?l?d?u +?l?d?l?s?d?d?l +?d?u?d?s?u?u?d +?d?d?d?s?l?l?u +?u?d?l?l?d?d?s +?l?u?d?s?d?u?d +?u?s?l?d?d?l?d +?l?d?u?d?d?l?s +?l?d?d?s?d?l?u +?d?d?u?s?d?u?u +?u?d?u?l?d?d?s +?d?d?d?u?u?l?s +?u?d?l?u?d?d?s +?l?u?u?d?d?d?s +?s?l?d?d?l?d?l +?s?l?u?l?d?d?d +?l?u?d?l?s?d?d +?s?d?u?l?l?d?d +?u?u?s?d?u?d?d +?l?l?d?d?d?d?s?l +?u?u?s?d?l?d?d +?u?l?d?s?d?u?d +?u?u?d?d?d?s?l +?d?s?l?l?d?l?d +?u?l?d?d?s?u?d +?d?u?l?u?d?s?d +?d?d?l?l?d?s?l +?d?d?d?l?u?s?u +?l?d?d?d?u?u?s +?u?s?d?u?u?d?d +?u?d?u?d?l?d?s +?u?u?d?d?d?s?u +?d?l?s?l?d?d?l +?d?d?u?l?d?s?l +?u?d?d?l?l?s?d +?l?d?d?d?s?u?u +?d?s?l?d?l?d?l +?l?u?s?l?d?d?d +?l?d?u?d?l?s?d +?d?d?d?u?l?s?l +?l?l?d?s?d?l?d +?d?d?d?l?l?u?s +?s?u?d?l?l?d?d +?d?s?d?u?d?u?u +?s?d?l?l?d?l?d +?u?l?s?d?d?d?l +?d?u?d?l?s?d?u +?u?d?d?l?u?s?d +?d?d?l?l?u?d?s +?s?d?d?l?d?l?l +?u?d?s?d?l?l?d +?s?d?d?u?l?u?d +?u?d?l?s?l?d?d +?d?u?s?l?l?d?d +?u?d?u?u?s?d?d +?d?d?l?l?d?l?s +?u?u?d?s?l?d?d +?l?s?d?d?l?d?l +?u?d?l?d?u?d?s +?u?u?d?u?s?d?d +?l?u?u?s?d?d?d +?s?d?u?u?d?d?u +?s?u?l?u?d?d?d +?d?s?d?d?u?u?u +?l?l?u?d?s?d?d +?d?s?d?u?l?l?d +?u?l?s?d?l?d?d +?u?s?u?l?d?d?d +?u?d?u?u?d?d?s +?d?l?l?d?d?s?l +?d?u?d?l?d?l?s +?l?l?d?d?u?d?s +?u?d?u?d?d?u?s +?u?u?d?d?s?d?l +?d?s?d?l?l?d?l +?u?l?u?d?d?s?d +?l?d?d?d?d?s?l?l +?l?s?d?d?d?d?l?l +?u?d?l?d?s?d?u +?l?d?u?s?l?d?d +?u?s?l?d?d?d?u +?s?u?u?d?d?d?u +?d?s?d?u?u?u?d +?l?l?d?d?d?s?u +?d?s?l?u?l?d?d +?d?s?d?l?d?l?l +?u?d?s?d?d?l?u +?u?d?s?d?d?l?l +?u?d?u?d?s?u?d +?s?d?d?d?l?u?u +?d?l?s?d?l?l?d +?s?d?d?u?l?d?u +?u?u?d?d?d?u?s +?d?d?d?u?s?l?l +?d?d?s?l?d?l?l +?d?d?d?l?u?u?s +?d?d?d?u?l?u?s +?l?d?s?d?d?l?u +?d?d?d?l?l?l?s?d +?s?u?d?u?d?u?d +?d?l?l?u?s?d?d +?d?d?s?u?d?u?u +?u?d?d?s?d?l?l +?u?d?d?s?d?u?l +?d?d?u?l?l?d?s +?s?u?d?d?u?u?d +?u?l?d?l?d?d?s +?d?d?d?s?u?l?u +?u?d?s?d?d?u?l +?u?d?l?d?s?l?d +?d?d?d?d?d?s?l?l?l +?u?l?d?s?d?d?u +?u?l?u?d?d?s?d?d +?d?d?u?l?l?s?d +?l?u?d?d?l?d?s +?d?u?d?u?d?s?l +?d?s?d?d?u?l?l +?d?d?u?l?u?s?d +?l?d?l?s?u?d?d +?u?l?l?s?u?d?d?d +?d?u?u?u?s?d?d +?s?l?d?l?d?d?l +?u?d?d?s?u?l?d +?d?d?u?u?u?d?s +?u?d?l?l?d?s?d +?s?d?l?l?d?d?u +?d?d?d?l?l?l?d?d?d?d +?u?u?d?u?u?u?u?d +?u?u?u?u?d?u?u?d +?u?u?d?d?d?d?l?d +?l?d?l?l?d?l?d?d?d +?u?l?d?d?u?d?d?d +?u?d?d?l?d?d?u?d +?d?d?d?u?l?d?d?l +?d?d?d?d?l?d?u?u +?d?d?d?d?u?u?d?u +?l?l?d?d?d?d?d?u +?d?d?u?u?d?d?u?d +?d?d?d?d?u?d?u?u +?u?d?u?l?d?d?d?d +?d?u?d?d?d?u?u?d +?d?d?d?d?d?l?u?u +?u?d?d?d?d?l?l?d +?l?l?d?d?d?d?u?d +?d?d?d?u?d?d?l?l +?u?d?d?u?l?d?d?d +?d?u?d?u?d?d?u?d +?d?d?d?d?l?l?d?u +?u?l?d?d?d?d?d?u +?l?s?l?l?l?s?s +?u?u?l?l?l?d?d?d?d +?s?d?s?s?d?s?d +?s?d?d?d?s?s?s +?l?d?d?d?d?d?l?l?l +?d?l?u?d?u?l?l +?d?l?u?u?u?d?l +?l?l?l?d?u?u?d +?l?d?u?l?l?d?l +?d?u?l?d?l?u?l +?d?d?u?l?l?u?l +?d?l?l?u?u?u?d +?d?l?l?u?d?l?u +?d?l?l?u?d?l?l +?l?d?u?u?d?u?u +?u?d?d?u?u?l?l +?l?l?l?d?l?u?d +?u?d?u?u?l?l?d +?u?d?u?l?d?l?u +?u?d?u?l?d?l?l +?d?u?d?u?l?l?l +?l?d?l?l?l?u?d +?d?u?l?l?u?d?u +?u?d?l?l?l?l?d?l +?u?u?d?l?d?u?u +?l?d?u?d?u?l?l +?l?u?d?d?u?u?u +?d?l?l?l?d?u?l +?d?l?u?l?l?d?u +?d?l?u?l?l?d?l +?d?l?d?u?u?l?l +?d?d?u?u?l?u?u +?l?d?u?u?d?l?l +?l?u?d?l?d?l?l +?l?d?l?d?l?u?l +?u?d?d?u?l?u?l +?u?u?u?l?d?u?d +?l?u?l?d?l?d?u +?d?u?l?u?u?l?d +?l?u?l?u?d?l?d +?l?d?l?l?d?u?u +?d?u?l?d?u?l?l +?u?d?u?d?l?l?u +?l?u?l?d?d?u?l +?u?d?u?d?u?u?u?d +?u?u?u?d?l?l?d +?u?d?u?u?u?d?l +?d?u?d?u?l?l?u +?d?u?u?d?l?l?u +?d?l?l?l?u?u?d +?d?d?l?u?l?l?u +?l?u?l?u?d?d?u +?d?l?l?u?u?l?d +?u?u?l?u?d?d?u +?d?u?u?l?l?d?l +?d?u?u?u?u?l?d +?u?u?u?u?u?l?d?d +?u?l?u?d?u?d?l +?d?u?u?u?d?l?l +?u?d?u?l?u?l?d +?l?u?u?d?d?u?u +?d?l?l?u?l?d?u +?u?d?d?l?l?l?u +?l?d?u?d?l?l?l +?l?d?d?l?l?u?u +?l?u?d?l?l?l?d +?d?l?u?l?l?l?d +?l?d?d?l?l?l?u +?d?l?u?u?l?l?d +?l?l?l?u?d?d?u +?u?d?d?u?u?u?l +?u?d?u?d?l?u?u +?l?d?u?d?l?u?u +?l?l?u?u?d?d?u +?l?l?d?u?u?d?u +?l?l?d?u?u?d?l +?u?l?d?l?l?u?d +?u?d?u?d?u?l?l +?l?l?l?d?u?d?u +?u?l?u?d?u?u?d +?u?u?d?l?d?l?l +?d?d?l?u?l?u?u +?l?l?d?l?l?u?d +?d?d?u?u?l?u?l +?u?u?l?u?d?d?l +?l?d?u?u?l?l?d +?l?u?d?l?d?u?l +?l?u?d?u?u?l?d +?l?u?u?d?l?l?d +?d?l?d?l?l?l?u +?u?d?l?d?u?u?l +?u?u?u?d?d?l?u +?u?d?l?l?u?u?d +?l?d?s?l?d?s?l?d +?l?l?l?l?l?l?d?l?l +?s?d?d?d?d?d?s?s +?l?l?l?u?l?l?s +?l?l?l?d?d?d?l?s +?l?d?d?d?s?l?l?l +?l?l?l?s?d?d?l?l +?d?d?d?s?s?d?d?d?d +?d?l?d?d?l?d?d?l?d +?s?d?l?s?d?l?s +?s?s?d?d?l?l?s +?l?l?l?l?s?l?l?l?l +?d?d?s?d?d?d?s?d?d?d +?l?d?d?d?d?d?s?d?d +?d?d?d?d?l?s?l?s +?u?u?s?s?d?d?d?d +?d?d?d?d?l?d?l?d?d +?d?d?u?u?d?d?d?d?d +?s?s?l?d?d?s?s +?s?s?d?l?d?s?s +?s?s?s?s?l?d?d +?s?l?d?l?d?l?d?s +?l?l?l?l?l?d?d?d?d?d?d +?l?l?u?d?u?l?l +?l?u?l?l?d?l?l +?u?l?d?l?u?l?l +?u?d?u?u?l?l?l +?l?u?u?u?l?l?d +?u?l?l?u?u?l?u +?u?l?l?d?l?u?l +?l?l?u?u?u?l?d +?u?l?u?u?u?l?d +?l?d?u?u?u?u?u +?u?l?l?u?d?u?u +?l?u?d?u?u?u?u +?u?u?u?d?u?l?l +?l?l?l?d?u?l?u +?l?u?d?l?l?l?l +?l?u?l?u?l?d?l +?u?l?d?u?l?u?l +?u?u?u?u?s?u?u?u +?l?l?u?l?d?l?l +?u?l?l?u?l?d?l +?l?u?u?d?u?u?u +?u?u?u?l?u?u?d +?l?l?d?l?l?u?l +?l?d?l?l?u?u?u +?u?u?u?u?s?d?d?d?d +?d?d?d?l?d?d?d?d?d?d +?l?l?l?d?l?l?l?d?d +?l?l?d?l?l?l?l?s +?l?l?l?s?d?l?s +?l?l?s?d?l?l?s +?l?d?l?s?l?s?l +?s?l?d?l?s?l?l +?l?s?l?l?l?d?s +?l?l?d?d?d?d?d?d?l?l +?u?l?d?d?l?l?l?d +?u?d?d?d?d?d?d?d?d?u +?d?d?d?d?l?d?d?l?l +?d?d?d?s?u?l?l?l +?u?l?l?l?l?d?d?u +?s?s?u?l?s?l +?s?s?l?l?l?l?s +?s?u?l?s?u?s +?s?l?s?l?u?s +?u?s?s?u?l?s +?u?l?s?u?s?s +?u?l?s?s?l?s +?u?l?s?s?s?u +?l?l?s?s?s?u +?u?s?u?u?s?s +?l?l?s?s?u?s +?u?s?s?l?s?l +?s?u?s?s?u?u +?l?l?d?d?l?l?l?s +?u?l?u?l?l?l?l?l +?u?u?u?u?l?l?s +?s?l?s?l?d?l?d +?s?l?d?d?l?l?s +?s?u?l?u?d?d?s +?l?s?d?l?l?s?d +?s?u?l?l?s?d?d +?l?d?s?d?l?s?l +?u?d?d?l?l?s?s +?l?u?l?s?s?d?d +?d?d?s?u?u?u?s +?l?s?l?d?d?s?l +?l?d?l?s?d?l?s +?s?s?l?l?d?l?d +?l?d?l?l?s?s?d +?u?l?s?s?l?d?d +?l?d?s?s?l?l?d +?l?s?s?d?d?l?l +?l?l?d?l?d?s?s +?l?l?s?l?d?d?s +?l?d?s?s?l?d?l +?l?d?l?s?l?d?s +?l?s?u?s?l?d?d +?l?s?l?d?l?d?s +?l?s?d?d?l?l?d?d +?u?s?u?u?d?d?d?d +?s?d?l?l?l?d?d?d +?l?d?l?d?l?d?s?d +?d?d?d?s?l?l?l?d +?u?u?s?s?u?u?u +?u?d?d?u?d?d?u?u +?u?u?d?d?d?u?u?d +?u?u?u?d?d?d?u?d +?d?d?l?l?l?u?d?d +?u?d?l?d?d?d?l?l +?u?d?l?d?l?d?d?l +?u?d?u?u?d?d?d?u +?d?d?u?d?d?u?u?u +?u?u?d?d?d?u?d?u +?u?d?d?l?l?u?d?d +?u?d?d?l?l?d?d?l +?u?d?u?d?d?u?d?u +?u?d?d?u?d?d?l?l +?u?l?d?d?l?d?d?l +?d?d?d?d?u?l?u?u +?d?l?d?u?d?l?d?u +?u?l?d?d?l?d?l?d +?u?d?d?d?u?u?u?d +?u?d?d?l?d?l?l?d +?l?d?l?d?l?d?u?d +?l?u?d?d?d?d?l?u +?s?s?s?d?d?d?d?d?d +?u?l?l?l?s?d?l +?u?l?l?l?s?u?d +?u?u?u?s?d?u?u +?u?d?l?s?l?l?l +?l?s?d?u?l?l?l +?u?d?l?l?l?s?l +?l?l?u?l?l?s?d +?u?u?s?u?u?d?u +?l?l?l?l?u?u?u?u +?l?l?s?s?s?l?l +?l?s?l?s?l?l?s +?u?l?d?l?l?l?l?d +?s?s?s?s?s?s?l +?d?s?d?d?d?d?d?d?d?d +?s?d?d?d?l?l?l?s +?l?l?l?u?l?d?d?d +?l?l?u?d?d?d?l?l +?u?d?u?u?d?u?d?u +?d?d?l?l?l?l?l?l?d?d +?d?d?d?d?d?d?d?d?u?l +?u?l?l?l?d?d?s?s +?u?s?u?u?u?u?d?d +?d?d?s?s?d?d?l?l +?s?s?d?d?d?d?l?l +?l?l?d?l?l?l?d?d?d +?d?l?u?d?d?d?d?d +?d?u?l?d?d?d?d?d +?d?d?u?d?l?d?d?d +?d?d?d?d?l?d?u?d +?s?l?l?d?d?d?d?d?d +?d?l?d?d?d?d?d?u +?d?l?d?d?d?u?d?d +?d?d?d?d?d?l?u?d +?d?d?d?l?d?d?u?d +?l?l?d?d?d?d?l?d?d +?d?l?d?d?d?d?u?d +?d?d?d?u?l?l?d?d?d +?d?u?d?d?d?d?d?u +?l?l?l?l?d?l?l?s +?l?l?l?l?u?u?s +?u?u?u?u?s?l?l +?u?l?s?s?l?l?l +?u?l?l?l?s?u?s +?l?l?l?l?d?l?d?d?d +?l?l?l?d?l?s?d?d +?d?d?d?l?s?l?l?l +?s?u?l?l?l?d?d?d +?u?d?u?u?u?d?u?u +?d?d?d?d?d?d?d?u?u?u +?l?l?l?u?l?l?l?d +?u?u?u?u?d?d?d?l +?l?l?l?l?s?d?l?d +?d?s?l?s?l?s?l +?l?l?u?u?u?u?d?d +?u?d?d?u?u?u?u?u +?u?l?u?l?d?d?d?d?d +?l?d?l?l?l?l?d?d?d +?l?l?l?l?l?s?d?l +?l?l?l?l?l?d?s?s +?l?u?u?u?u?u?u?u +?l?s?d?d?d?d?d?s +?s?l?s?d?d?d?d?d +?l?d?s?s?d?d?d?d +?d?l?s?d?l?s?d?l +?d?d?d?s?l?l?l?s +?l?s?s?l?l?d?l +?u?u?u?u?s?s?d +?l?l?l?d?s?s?l +?l?s?s?l?d?l?l +?l?s?l?l?s?d?l +?d?s?s?l?l?l?l +?u?u?s?u?u?s?d +?l?d?l?l?s?s?l +?l?l?d?l?s?l?s +?l?l?l?s?l?d?s +?l?d?l?s?l?l?s +?l?l?l?l?d?d?l?d?d +?s?u?l?l?l?l?d?d +?l?l?l?l?l?d?l?s +?l?d?s?d?d?d?d?d?d +?l?l?d?d?s?d?l?l +?l?l?l?d?d?d?s?l +?u?l?d?l?l?d?l?l +?d?d?s?d?s?d?s?d +?u?s?u?s?u?u?u +?l?l?d?d?d?l?l?l?l +?l?d?d?d?d?d?d?d?d?s +?l?d?d?l?l?d?d?s +?d?d?l?l?s?l?d?d +?d?d?l?s?l?l?d?d +?d?s?d?d?d?l?l?l +?l?l?d?d?l?s?d?d +?l?d?l?d?l?s?d?d +?s?d?d?d?d?u?u?u +?l?l?l?u?l?u?l +?l?u?u?u?l?l?l +?u?u?u?l?u?u?u +?l?d?d?l?d?l?d?d?d +?d?d?d?d?d?d?l?l?u +?u?d?d?l?d?d?u?d?d +?u?s?l?s?d?d?d +?u?s?s?u?d?d?d +?u?s?l?s?d?d?d?d +?s?d?l?d?u?d?s +?l?d?l?d?s?d?s +?d?l?l?d?d?s?s +?s?d?l?l?d?s?d +?u?d?s?l?s?d?d +?d?l?s?s?d?l?d +?s?l?d?s?u?d?d +?d?l?d?d?s?s?l +?s?l?s?d?l?d?d +?s?s?l?d?d?l?d +?s?u?s?l?d?d?d +?u?s?d?s?l?d?d +?s?s?l?u?d?d?d +?d?s?u?u?s?d?d +?d?d?l?s?s?l?d +?l?d?s?d?l?s?d +?d?d?u?u?d?s?s +?d?l?l?s?d?d?s +?l?u?d?d?d?s?s +?d?d?s?s?l?l?d +?l?s?d?d?s?l?d +?u?d?l?d?d?s?s +?d?d?d?s?s?u?u +?l?d?d?u?s?s?d +?d?d?s?l?s?l?d +?l?d?s?l?d?s?d +?d?s?l?d?d?l?s +?d?d?s?d?u?u?s +?s?l?d?s?l?d?d +?d?d?s?d?d?s?u?u +?l?d?s?l?s?d?d +?l?s?s?d?l?d?d +?s?d?l?l?d?d?s +?d?d?s?u?d?s?u +?d?s?l?s?l?d?d +?l?d?s?s?d?d?l +?s?u?d?d?d?s?u +?s?d?d?d?l?s?l +?d?l?s?d?d?s?l +?u?l?s?d?d?d?s +?s?d?s?l?d?d?l +?d?d?s?l?s?d?l +?s?l?s?d?d?d?l +?s?d?d?l?d?l?s +?d?s?d?s?l?l?d +?u?d?s?s?l?d?d +?d?s?d?s?d?u?u +?s?l?d?s?d?l?d +?d?d?s?s?d?u?u +?d?l?l?d?s?d?s +?l?d?s?l?d?d?s +?d?d?u?s?l?d?s +?s?s?d?l?d?l?d +?d?l?d?d?l?s?s +?u?s?u?d?s?d?d +?d?d?u?l?s?s?d +?d?u?d?u?s?d?s +?s?d?d?s?d?l?l +?s?u?d?u?d?s?d +?u?s?u?d?d?s?d +?u?d?d?d?s?s?u +?s?u?d?u?s?d?d +?d?d?l?s?l?s?d +?l?d?s?d?l?d?s +?s?s?u?l?d?d?d +?d?l?s?d?d?l?s +?l?d?s?d?d?s?l +?u?l?s?d?s?d?d +?u?s?s?d?d?d?l +?s?d?d?l?l?s?d +?d?d?d?d?s?l?l?s +?s?l?d?d?s?l?d +?d?s?d?l?s?d?l +?d?s?s?d?d?l?l +?s?s?d?d?d?u?l +?s?d?s?d?d?u?l +?d?d?s?d?u?s?u +?u?s?d?u?d?s?d +?s?d?d?d?l?u?s +?s?d?l?s?l?d?d +?l?d?d?d?u?s?s +?l?d?d?s?u?d?s +?u?l?d?s?d?d?s +?d?s?d?d?l?s?l +?d?s?d?d?l?l?s +?s?s?d?d?u?d?u +?l?s?d?l?d?s?d +?d?s?s?d?l?l?d +?u?u?s?d?s?d?d +?d?l?d?s?d?s?l +?l?d?s?u?s?d?d +?s?d?l?d?d?l?s +?s?u?d?d?s?d?u +?d?s?d?u?s?d?u +?d?s?l?d?l?d?s +?d?l?s?u?s?d?d +?s?d?d?d?s?u?u +?d?s?d?l?s?l?d +?l?s?s?u?d?d?d +?l?d?l?s?d?d?s +?d?s?l?d?l?s?d +?u?d?l?d?l?l?d?l +?u?l?l?d?d?l?l?d +?u?u?d?u?u?d?u?d +?u?d?u?u?u?d?u?d +?d?d?d?u?u?l?l?l +?l?l?s?d?d?s?l?l +?d?d?d?d?d?s?u?l +?d?d?d?d?d?s?u?u +?l?d?d?l?d?s?d?d +?d?d?d?l?d?d?l?s +?u?l?d?d?s?d?d?d +?s?u?u?d?d?d?d?d +?l?d?d?l?d?d?s?d +?d?l?l?d?s?d?d?d +?u?l?d?s?d?d?d?d +?l?u?d?d?d?d?d?s +?d?d?s?d?d?l?l?d +?l?s?u?d?d?d?d?d +?l?d?d?d?l?s?d?d +?u?u?d?d?d?d?s?d +?u?u?d?d?d?s?d?d +?u?l?u?l?s?s?s +?d?d?d?d?l?d?d?l?d +?d?d?u?u?l?l?l?l +?u?d?l?l?s?l?d +?l?d?u?l?l?d?s +?l?u?u?l?s?d?d +?d?u?u?s?l?l?d +?l?s?u?u?l?d?d +?u?l?d?d?s?l?l +?u?d?l?s?u?l?d +?s?l?d?l?u?d?l +?s?l?u?l?u?d?d +?u?s?l?u?l?d?d +?d?d?l?l?l?u?s +?l?u?l?s?d?d?l +?d?d?u?l?l?u?s +?s?l?u?l?l?d?d +?d?l?d?l?l?s?l +?d?u?u?u?u?s?d +?l?d?d?l?l?u?s +?d?s?u?u?u?d?u +?u?u?s?d?d?l?l +?u?u?s?l?l?d?d +?u?d?d?l?l?s?l +?l?l?s?u?u?d?d +?u?d?d?s?l?l?l +?l?s?l?u?l?d?d +?l?l?s?d?d?u?u +?u?d?l?l?d?s?l +?u?l?l?d?l?s?d +?u?u?u?l?d?s?d +?u?s?d?u?d?u?u +?d?d?u?u?s?u?u +?l?u?u?u?d?d?s +?u?d?l?s?l?d?u +?u?u?s?l?d?d?u +?l?l?l?d?d?s?u +?d?l?d?s?l?l?u +?l?l?u?s?d?d?l +?u?d?l?l?l?s?d +?l?l?s?u?l?d?d +?u?d?u?s?u?d?u +?u?s?l?d?d?l?l +?d?s?d?u?l?l?l +?l?s?u?l?d?d?l +?u?l?l?s?d?l?d +?l?s?u?l?l?d?d +?u?s?l?l?d?l?d +?u?l?l?u?d?s?d +?u?l?d?s?u?l?d +?u?l?s?l?d?l?d +?l?l?d?l?d?s?l +?l?u?u?u?s?d?d +?u?d?l?l?s?u?d +?d?d?d?l?l?l?s?l +?l?l?l?l?s?d?d?l +?u?s?d?l?l?d?l +?u?l?d?d?l?s?l +?l?d?l?d?l?l?d?s +?s?u?u?d?d?u?u +?u?u?u?d?s?d?u +?d?u?u?u?u?d?s +?d?d?u?s?l?l?l +?u?u?u?u?d?s?d?d +?u?s?u?d?d?u?u +?s?d?l?l?l?l?d?d +?d?s?l?d?l?l?l +?d?l?l?l?l?s?d?d +?u?d?l?s?d?l?l +?u?l?u?d?d?l?s +?l?u?l?l?d?d?s +?d?d?l?l?l?l?s?s +?u?u?l?s?d?d?u +?d?d?u?s?u?l?l +?u?u?u?u?u?u?d?s +?u?u?s?u?s?u?u +?u?u?d?d?u?d?d?u +?u?d?l?d?l?u?d?d +?l?d?l?d?u?d?l?d +?u?u?d?l?l?d?d?d +?u?d?u?u?d?d?u?d +?u?d?d?u?d?u?d?u +?u?d?u?d?u?d?l?d +?u?d?u?d?d?u?u?d +?u?d?l?u?d?l?d?d +?u?d?d?l?l?d?d?u +?d?d?l?u?l?u?d?d +?u?d?l?d?d?l?l?d +?u?l?d?u?l?d?d?d +?l?l?d?d?d?d?u?l +?d?u?d?l?d?l?d?u +?u?d?d?u?u?d?u?d +?d?d?l?u?u?u?d?d +?u?u?d?d?u?d?u?d +?u?d?d?d?u?d?u?u +?d?d?d?u?u?u?d?u +?l?d?u?d?l?d?l?d +?d?u?d?u?u?u?d?d +?l?d?d?u?u?d?d?l +?d?d?u?u?u?d?d?u +?l?l?u?d?d?d?d?d?d +?d?d?d?d?u?l?l?d?d +?l?d?l?d?d?l?d?d?d +?d?d?d?s?s?l?l?l +?l?l?d?d?l?l?l?l?l +?u?l?d?d?d?d?d?d?s +?u?l?s?d?d?d?d?d?d +?s?s?s?s?d?d?l +?l?l?l?s?d?d?s?d?d +?u?u?u?l?u?l?d +?l?u?l?l?u?u?d +?u?u?u?u?l?d?l +?u?u?d?u?u?l?u +?l?u?l?l?d?l?u +?l?u?l?l?l?d?u +?l?u?u?u?u?d?u +?u?l?u?l?u?d?l +?u?l?d?l?u?u?u +?u?u?d?u?u?l?l +?l?l?d?u?u?l?l +?u?l?d?u?l?l?u +?u?d?u?d?u?u?u?u +?l?u?u?d?l?u?l +?l?u?l?l?l?u?d +?l?l?d?l?u?u?l +?d?l?l?l?u?u?l +?u?u?u?d?l?u?u +?u?d?l?l?d?l?l?l +?d?l?l?u?u?l?l +?d?u?u?u?u?l?l +?d?u?u?u?u?l?u +?u?u?l?l?u?l?d +?u?d?u?l?u?l?u +?u?u?l?u?u?l?d +?d?l?u?u?l?l?l +?u?l?u?l?d?l?u +?u?u?l?l?l?d?u +?u?d?l?l?l?u?l +?u?u?u?d?u?u?l +?l?d?l?l?u?u?l +?d?d?l?l?d?d?d?d?d?d +?d?d?d?d?d?d?s?d?l +?l?d?d?s?d?d?d?d?d +?l?l?l?l?l?u?u?u +?d?d?s?s?s?s?s +?u?d?u?s?l?l?l +?u?d?u?u?u?u?s +?u?s?d?u?l?l?l +?l?l?u?l?l?l?s +?l?l?l?l?s?u?d +?u?l?l?d?s?l?l +?u?l?l?d?l?s?l +?s?u?u?d?u?u?u +?l?l?d?d?s?l?l?l +?u?u?u?d?u?u?s +?u?u?d?s?u?u?u +?l?d?d?d?d?l?l?l?l +?l?l?d?l?l?l?l?l?l +?s?l?l?l?s?d?s +?d?d?u?l?l?u?l?l +?u?d?u?d?u?d?u?u +?u?l?u?u?l?d?d?d +?s?s?l?l?l?d?d?d +?l?d?d?d?d?l?l?d?d +?d?l?d?l?l?d?d?d?d +?l?l?l?l?d?d?d?d?d?d?d +?l?l?s?d?d?l?l?l +?u?l?s?l?l?l?d?d +?s?s?l?u?s?s +?s?s?s?l?s?l +?l?s?s?s?u?s +?s?s?u?s?l?s +?s?u?s?s?s?l +?s?s?s?s?u?l +?l?s?s?s?l?s +?s?s?s?l?u?s +?s?s?u?s?s?l +?l?s?u?s?s?s +?d?d?d?d?d?u?l?l?l +?u?u?l?l?d?d?s?s +?u?l?u?l?u?u?l +?l?u?l?u?u?u?u +?u?l?l?u?l?u?u +?d?d?d?d?s?d?d?s?d?d +?s?s?s?s?s?s?d +?u?s?u?u?u?s?u +?l?l?s?u?s?l?l +?u?u?s?d?d?s?s +?d?s?d?s?u?s?u +?l?s?d?s?d?s?l +?d?l?s?d?l?s?s +?l?s?s?l?s?d?d +?s?l?d?s?l?d?s +?s?s?s?d?d?u?u +?l?s?l?d?d?s?s +?d?l?s?s?d?l?s +?u?s?d?s?u?s?d +?s?l?s?s?l?d?d +?u?s?u?s?d?s?d +?u?d?u?d?s?s?s +?l?l?l?l?l?l?u?u +?u?l?l?d?l?d?l?l +?u?d?l?d?l?l?l?l +?u?l?l?d?d?d?d?d?d?d +?l?d?l?l?l?l?l?l?l +?d?d?d?d?d?d?d?d?d?s?d +?l?l?l?d?d?s?l?l +?d?d?d?d?l?l?l?d?d?d +?d?d?d?d?s?l?s?l +?l?d?d?s?l?d?d?s +?s?d?d?l?l?d?d?s +?s?l?d?d?l?d?d?s +?d?d?d?l?l?l?l?l?d +?l?s?l?l?s?l?s +?s?l?l?l?l?d?d?d?d +?u?u?d?d?d?d?d?d?s +?l?d?d?d?d?l?s?l +?d?l?l?l?s?d?d?d +?l?d?l?l?d?s?d?d +?d?d?u?u?u?d?d?s +?l?l?d?s?l?l?s +?s?s?l?l?d?l?l +?s?l?l?s?l?l?d +?u?d?u?u?u?u?d?u +?d?d?l?l?l?l?l?u +?u?l?u?u?l?l?d?d +?l?l?d?l?l?l?l?d?d +?u?d?l?l?u?d?l?l +?d?d?d?d?s?d?d?s?d +?u?l?l?s?l?d?d?d +?u?l?s?l?l?d?d?d +?d?d?d?d?d?l?l?l?s +?u?u?s?u?u?u?u?u +?l?l?l?l?s?d?s?d +?d?d?d?l?d?d?d?l?d +?d?d?d?u?l?d?d?d?d +?d?d?l?d?d?d?l?d?d +?d?d?s?s?d?d?s?s +?u?d?d?d?u?l?l?l +?l?l?d?d?d?u?u?u +?u?d?u?l?l?l?d?d +?u?u?u?d?d?u?u?d +?u?d?d?l?l?d?l?l +?u?u?l?l?u?d?d?d +?d?d?d?u?u?u?l?l +?l?d?d?d?d?s?s?s +?d?d?d?d?s?s?s?l +?u?u?l?l?u?u?s +?l?u?l?u?l?u?s +?l?l?l?l?s?l?u +?u?l?l?s?u?l?l?l +?d?d?d?d?s?d?l?d +?d?d?s?d?d?d?d?u +?d?d?l?d?d?d?s?d +?d?l?d?d?s?d?d?d +?d?d?d?s?u?d?d?d +?d?d?s?d?d?d?l?d +?d?d?s?d?d?u?d?d +?l?d?d?d?d?d?d?s?d +?d?d?d?d?d?u?d?s +?d?d?d?d?d?s?d?u +?d?d?s?u?d?d?d?d +?u?d?d?d?s?d?d?d?d +?s?d?d?d?d?u?d?d +?d?d?d?d?s?u?d?d +?s?d?d?d?d?d?l?d +?d?d?d?d?d?u?s?d +?d?s?d?l?d?d?d?d +?d?d?d?s?d?d?d?u +?d?s?d?d?d?d?l?d +?d?d?d?d?u?d?d?s +?d?d?d?d?l?d?s?d +?s?d?d?d?l?d?d?d +?d?d?s?d?d?d?u?d +?u?d?d?d?d?s?d?d +?d?d?u?d?d?d?d?s +?d?d?d?u?s?d?d?d +?d?l?d?d?d?d?s?d +?d?s?d?d?l?d?d?d +?d?d?d?d?s?d?u?d +?u?u?d?u?u?d?u?u +?d?u?u?u?u?d?u?u +?u?d?u?u?u?u?u?d +?u?l?l?l?d?d?d?d?s +?l?s?d?d?d?d?d?d?d?d +?u?l?l?d?d?d?s?s +?l?l?l?d?d?l?l?s +?u?d?d?d?l?d?d?l +?d?d?d?d?l?u?u?d +?d?d?u?d?l?l?d?d +?d?u?d?l?d?d?l?d +?u?d?d?d?u?l?d?d +?d?d?u?d?d?l?d?u +?d?d?u?d?d?l?d?l +?d?u?d?d?d?d?l?l +?d?l?d?l?u?d?d?d +?d?d?l?d?d?d?u?l +?u?d?d?l?u?d?d?d +?d?u?u?d?u?d?d?d +?d?u?l?u?d?d?d?d +?d?u?d?d?l?d?d?l +?l?u?d?u?d?d?d?d +?l?d?d?d?d?l?d?u +?l?d?d?d?l?d?d?u +?d?l?u?d?d?d?d?l +?d?d?d?l?l?d?d?u +?d?d?u?u?d?u?d?d +?d?l?d?d?d?u?d?l +?d?d?d?d?u?l?d?l +?u?d?d?u?d?l?d?d +?l?d?d?d?u?d?u?d +?u?d?d?u?d?d?l?d +?d?d?u?u?l?d?d?d +?d?u?d?d?l?l?d?d +?l?d?l?u?d?d?d?d +?u?d?u?d?d?l?d?d +?l?d?u?u?d?d?d?d +?d?l?d?l?d?d?u?d +?u?d?d?d?d?l?d?l +?d?l?d?l?d?d?d?u +?l?d?u?l?d?d?d?d +?d?l?l?d?u?d?d?d +?d?d?d?u?u?d?u?d +?u?d?l?d?u?d?d?d +?u?d?u?d?d?d?u?d +?d?u?d?l?d?d?d?u +?d?u?d?u?d?d?d?u +?u?l?d?d?d?l?d?d +?u?d?d?d?d?u?d?u +?d?d?d?l?d?l?d?u +?d?d?u?l?d?l?d?d +?d?u?d?d?u?u?d?d +?d?d?d?u?u?d?d?l +?d?l?u?l?d?d?d?d +?d?d?u?u?d?d?l?d +?l?l?l?d?d?d?l?d?d +?d?d?u?l?u?d?d?d +?d?d?l?l?d?d?u?d +?l?d?l?l?l?l?l?s +?u?l?l?d?l?l?d?l +?s?l?l?l?l?l?d?s +?u?u?s?u?u?d?d?d +?l?l?d?d?d?s?l?l +?u?l?l?l?l?d?s?d +?l?s?l?l?l?d?d?d?d +?u?u?u?u?u?l?u +?u?u?l?u?u?u?u +?l?u?u?u?l?u?u +?u?l?u?l?u?u?u +?u?u?u?u?l?u?u +?l?u?l?l?u?l?u +?d?d?d?s?s?s?d?d +?s?d?s?d?d?s?d?d +?d?s?d?s?d?d?d?s +?l?l?d?d?d?s?s?s +?d?d?d?s?l?l?l?l?l +?s?l?s?l?d?l?s +?d?l?s?l?s?l?s +?l?s?d?s?l?s?l +?u?l?l?l?l?u?l?d +?d?d?d?s?d?d?d?d?s +?d?d?d?d?d?d?s?s?d +?l?l?l?d?d?u?l?l +?u?u?u?d?d?d?s?s +?d?s?l?l?l?s?d?d +?u?s?u?s?u?d?d?d +?s?s?d?d?s?s?d?d +?u?l?l?d?d?d?u?u +?u?l?d?d?d?u?l?l +?d?d?d?d?l?u?u?l +?l?u?d?d?l?u?d?d +?d?u?u?d?d?d?u?u +?d?u?u?d?u?d?u?d +?u?l?d?l?d?d?l?l +?u?d?d?l?d?d?u?l +?d?u?u?d?u?u?d?d +?u?d?d?l?u?l?d?d +?u?l?d?l?d?l?d?l +?u?l?u?d?d?d?d?u +?u?u?d?d?d?d?u?l +?u?d?u?u?d?u?u?d +?u?d?d?d?l?l?d?l +?u?u?d?u?d?u?u?d +?u?d?d?u?d?u?u?d +?u?d?d?l?l?l?d?l +?l?u?l?l?d?d?d?l +?u?d?d?d?l?l?l?d +?d?u?u?u?d?d?d?u +?d?d?d?u?l?u?l?u +?u?u?d?u?d?d?u?d +?u?d?d?l?d?l?d?l +?u?l?d?d?d?d?u?u +?u?l?d?d?d?l?d?l +?u?l?d?l?l?d?l?d +?u?l?d?l?l?d?d?l +?u?l?d?d?d?l?l?d +?u?d?l?d?u?d?u?d +?l?l?l?s?d?d?d?d?d?d +?d?d?d?l?l?l?l?l?d?d +?l?s?l?d?d?s?d?d +?l?d?d?l?d?d?s?s +?l?l?l?d?l?l?d?d?d +?u?s?s?l?l?l?l +?d?d?l?l?l?l?l?l?d +?d?d?d?l?d?d?d?l?l +?l?d?d?d?d?l?d?d?l +?d?d?d?d?l?l?d?d?l +?l?d?l?d?l?d?l?d?l?d +?s?l?l?l?l?l?u +?l?d?l?d?l?l?d?d?d +?d?l?l?l?l?l?d?s +?s?d?d?d?s?l?s +?s?s?d?l?d?s?d +?s?s?u?d?d?d?s +?s?s?s?d?l?d?d +?d?s?d?d?l?s?s +?s?s?s?u?d?d?d +?s?s?s?d?d?l?d +?s?s?s?d?d?d?d?l +?s?s?l?s?d?d?d +?d?s?d?s?d?s?u +?d?d?d?s?s?l?s +?s?u?d?d?d?s?s +?s?d?d?d?l?s?s +?s?d?d?l?d?s?s +?d?s?s?s?d?d?l +?d?s?d?d?s?l?s +?s?s?d?s?d?d?l +?s?d?l?s?s?d?d +?l?d?d?s?s?s?d +?s?d?s?d?s?d?u +?s?s?l?d?s?d?d +?l?d?d?s?d?s?s +?s?l?d?s?s?d?d +?s?s?u?s?d?d?d +?l?s?d?s?d?d?s +?d?s?d?d?s?s?u +?u?s?d?s?d?s?d +?u?s?d?s?s?d?d +?d?s?l?s?s?d?d +?s?s?d?d?d?s?l +?s?l?s?d?d?d?s +?l?s?s?s?d?d?d?d +?d?s?d?l?s?d?s +?d?l?d?d?s?s?s +?s?l?d?d?s?d?s +?u?s?s?s?d?d?d +?l?l?l?l?l?d?l?d?d +?u?l?d?l?l?l?d?l +?l?l?s?l?l?d?d?d?d +?l?s?l?l?d?l?d?d +?d?l?l?l?l?d?d?s +?d?d?d?d?d?d?d?d?l?s +?l?l?l?s?l?l?l?d?d +?d?d?d?s?d?d?s?l +?s?d?d?l?d?d?d?s +?s?s?l?d?d?d?d?d +?d?d?s?d?d?s?d?l +?l?l?l?l?s?d?l?l +?l?s?l?s?l?s?l?s +?d?d?d?d?d?d?u?u?u?u +?l?d?d?l?l?l?d?d?d +?u?d?d?d?d?d?d?d?d?l +?d?d?d?d?s?d?d?d?l +?s?l?d?l?l?s?d +?u?u?s?l?s?d?d +?u?d?l?d?l?s?s +?s?d?u?u?u?s?d +?s?d?d?s?u?u?u +?l?l?s?d?d?l?s +?l?s?d?l?d?l?s +?l?l?d?l?s?d?s +?d?s?l?d?l?l?s +?u?l?d?l?d?s?s +?s?d?l?s?l?l?d +?d?d?s?l?l?s?l +?u?s?d?d?s?u?u +?d?l?l?s?d?l?s +?d?l?l?s?l?s?d +?l?s?d?d?l?l?s +?u?l?l?s?d?s?d +?l?s?s?l?d?l?d +?s?l?l?l?d?s?d +?d?l?s?s?l?l?d +?s?d?d?u?l?u?s +?s?d?u?l?l?s?d +?l?d?s?l?l?d?s +?s?d?l?d?l?l?s +?d?s?u?l?l?s?d +?s?l?l?d?d?s?l +?d?l?l?l?s?d?s +?l?s?l?s?u?d?d +?l?s?l?d?l?s?d +?d?l?l?s?s?d?l +?s?s?u?u?d?d?u +?d?s?s?l?l?d?l +?u?s?s?u?d?u?d +?u?l?l?d?s?d?s +?s?d?s?l?d?l?l +?s?d?l?d?s?l?l +?d?u?s?d?u?u?s +?u?s?u?d?d?l?s +?u?l?d?d?s?s?l +?u?d?l?d?s?l?s +?s?d?l?s?l?d?l +?d?d?u?s?u?s?u +?u?u?s?s?d?d?l +?d?s?s?d?l?l?l +?s?s?d?l?l?l?d +?u?s?s?l?l?d?d +?u?d?l?l?d?s?s +?l?s?l?s?d?l?d +?s?l?s?d?l?l?d +?u?u?d?d?s?s?u +?l?s?s?s?s?s?s +?u?u?d?u?u?u?d?u +?u?d?d?d?u?d?d?d?d +?u?d?d?d?d?l?d?d?d +?d?l?d?d?d?l?d?d?d +?u?d?d?d?d?d?u?d?d +?d?d?l?d?d?d?d?l?d +?d?d?d?d?d?d?u?l?d +?d?d?d?d?d?d?u?u?d +?l?s?s?s?l?l?l +?l?l?s?l?l?s?s +?d?d?u?l?l?s?d?d +?l?u?u?s?d?d?d?d +?l?d?l?l?d?d?d?s +?d?l?l?l?d?s?d?d +?l?d?d?d?d?l?l?s +?l?s?l?d?l?d?d?d +?d?d?d?d?d?d?s?u?u +?d?d?d?d?d?d?s?s?l +?d?l?l?d?l?d?d?d?d +?d?d?u?l?u?d?d?d?d +?u?u?d?d?d?d?d?d?l +?u?l?d?l?u?l?s +?s?l?l?u?l?l?d +?u?u?u?s?u?d?u +?u?l?s?l?u?d?l +?u?u?u?s?l?l?d +?u?l?l?s?l?d?l +?u?u?s?d?l?l?l +?d?u?u?u?u?s?u +?u?l?l?u?l?s?d +?d?l?l?s?l?l?u +?u?l?u?l?l?s?d +?u?l?d?l?s?l?l +?s?l?d?l?l?l?u +?u?s?l?d?l?l?l +?s?u?u?u?u?d?u +?u?u?l?l?l?d?s +?d?d?d?d?l?l?l?l?d?d +?u?d?d?d?d?d?d?d?d?d?d +?l?l?l?d?d?s?s?s +?u?u?u?l?l?l?d?d?d +?d?d?s?d?d?d?s?d?d +?u?d?l?l?l?d?d?l +?u?l?l?l?d?d?l?d +?d?d?d?l?l?l?u?u +?u?l?d?d?l?d?l?l +?l?d?d?d?l?l?l?d?d +?d?d?l?d?d?l?d?d?d?d +?u?s?l?s?l?l?d +?u?d?l?l?s?l?s +?s?l?l?l?l?l?s?d +?l?s?d?l?l?s?l +?d?l?s?l?l?l?s +?l?s?s?d?l?l?l +?u?l?l?s?s?l?l +?l?l?l?s?l?s?d?d +?d?u?u?u?u?s?s +?u?l?l?d?l?s?s +?s?l?l?s?l?d?l +?l?l?d?s?s?l?l +?l?d?s?l?l?l?s +?l?l?s?s?l?l?d +?l?d?s?s?l?l?l +?l?s?l?d?s?l?l +?l?d?s?l?s?l?l +?l?l?s?l?s?d?l +?d?u?u?u?u?u?d?u +?u?d?d?u?l?l?l?l +?d?u?d?u?u?u?u?u +?u?l?l?l?l?l?s?d?d +?l?l?d?s?s?s?s +?l?l?l?d?d?d?d?s?s +?l?u?u?l?u?u?l +?u?u?l?u?l?l?l +?u?l?l?l?l?u?u?d +?l?l?u?l?u?l?u +?l?l?u?l?u?l?l +?l?u?u?l?u?l?l +?l?u?u?l?l?l?l +?l?u?u?u?u?l?l +?l?u?l?u?l?l?u +?u?u?l?l?d?d?d?s +?u?u?l?l?s?d?d?d +?l?l?d?l?l?s?d?d +?d?d?l?l?l?l?s?d +?s?s?d?d?d?l?l?l +?l?d?l?d?d?l?d?l?d +?s?d?l?l?l?l?s?d +?s?s?s?s?l?s +?l?l?l?l?l?s?d?s +?s?u?l?u?l?u?l +?l?u?l?l?l?l?s +?l?l?l?s?l?u?l +?u?l?l?s?l?l?u +?l?l?l?l?u?l?s +?l?l?l?s?l?l?u +?l?l?l?d?s?l?l?l +?l?d?l?d?d?d?d?d?d?d +?s?s?l?l?l?l?s?s +?u?s?l?s?l?s?l +?l?u?u?l?l?d?l +?d?l?l?u?u?u?l +?l?d?l?u?l?l?u +?d?l?u?l?l?l?u +?l?l?l?l?u?l?l?d +?u?d?l?u?l?l?u +?l?u?l?d?u?l?u +?d?l?u?u?u?u?l +?l?l?d?u?u?l?u +?u?l?l?u?u?d?l +?u?l?l?u?u?d?u +?l?u?l?u?d?l?l +?u?u?u?d?l?l?u +?l?u?u?u?d?u?u +?u?u?d?u?l?l?u +?u?l?u?u?d?u?u +?u?d?l?u?l?u?u +?l?l?d?u?l?u?l +?l?l?u?l?l?d?u +?l?l?l?u?d?u?u +?u?u?l?u?u?d?l +?l?l?u?d?l?u?u +?u?l?u?u?d?u?l +?l?d?l?u?u?l?l +?u?u?u?l?l?d?u +?u?u?d?l?u?u?u +?u?u?l?d?l?u?u +?u?u?l?u?d?u?u +?d?l?l?u?l?u?u +?l?l?u?u?u?d?l +?l?l?l?u?u?d?l +?l?u?d?l?l?u?l +?u?l?d?l?l?u?u +?u?l?d?l?l?u?l +?d?l?u?l?u?l?l +?l?l?d?l?u?l?l +?l?u?u?d?u?l?u +?l?l?u?l?u?u?d +?u?u?u?u?d?u?l +?u?l?l?d?u?l?u +?d?l?u?l?u?u?l +?l?u?l?l?u?l?d +?d?u?l?l?u?u?u +?l?l?l?l?d?l?d?s +?u?l?l?l?l?l?u?u +?l?d?d?l?d?d?d?d?l +?s?s?l?l?l?l?l?l +?u?l?l?l?l?l?s?s +?l?d?d?l?d?l?d?l?d +?l?d?d?l?d?d?d?d?d?d +?l?l?l?l?l?u?u?d +?l?l?l?l?u?l?l?l +?u?s?d?d?d?d?s?u +?d?d?d?d?u?u?s?s +?s?u?u?d?d?d?d?s +?l?s?l?d?d?d?d?s +?l?s?l?s?l?d?s +?l?s?l?s?d?l?s +?l?l?d?l?s?s?s +?d?l?l?l?l?l?l?u +?d?s?l?l?l?l?s?d +?l?l?l?l?d?d?l?s +?l?d?d?l?l?l?l?d?d +?l?l?l?l?l?s?d?d?d?d +?l?l?l?d?d?l?d?d?d +?l?l?l?s?d?d?s?d +?u?u?u?u?d?d?l?l +?l?l?l?d?d?l?l?u +?u?l?d?d?u?l?l?l +?u?l?u?u?l?u?d?d +?u?l?l?l?s?l?s +?s?l?u?l?u?l?s +?u?u?u?u?s?u?s +?u?s?u?u?u?u?s +?u?l?l?d?d?d?u?l +?l?l?l?d?d?d?u?l +?u?u?d?d?u?u?u?d +?l?l?u?l?d?d?d?l +?u?l?l?d?l?d?l?d +?l?l?d?d?d?u?l?l +?u?u?u?u?d?d?u?d +?l?d?l?l?l?l?l?d?d +?u?l?l?l?u?s?d?d +?l?d?l?l?d?l?l?s +?u?l?l?l?s?l?l?l +?l?s?l?s?l?s?s +?u?d?d?d?d?d?d?l?l +?d?d?d?d?d?l?l?d?l +?l?u?u?d?d?d?d?d?d +?l?d?d?l?l?l?l?l?l +?l?s?l?s?l?l?l?l +?l?u?l?l?u?l?d?d +?l?l?l?d?l?l?l?l?d +?u?u?l?l?d?d?d?d?d +?u?d?d?d?d?u?s?d +?d?d?s?d?l?l?d?d +?d?d?d?d?u?u?s?d +?l?d?d?d?d?l?s?d +?d?d?d?l?l?d?s?d +?d?d?u?d?d?u?d?s +?u?s?d?d?d?d?d?l +?l?d?d?d?s?d?d?l +?d?d?d?d?l?d?l?s +?u?s?l?d?d?d?d?d?d +?l?d?d?s?d?l?d?d +?s?d?u?u?d?d?d?d +?d?d?s?l?d?d?d?l +?d?s?d?l?l?d?d?d +?d?l?d?d?l?s?d?d +?d?d?d?l?s?l?d?d +?d?d?l?d?d?l?s?d +?l?d?l?d?d?s?d?d +?s?d?l?d?l?d?d?d +?u?d?d?d?d?d?s?l +?s?d?d?l?l?d?d?d +?u?d?u?d?s?d?d?d +?d?d?l?s?l?d?d?d +?d?d?l?d?d?l?d?s +?d?d?d?d?s?l?d?l +?l?l?l?l?d?d?s?l +?s?d?u?u?u?u?u?u +?l?l?s?s?l?d?d?d +?s?d?d?d?s?l?l?l +?u?d?d?l?d?d?d?d?d +?d?d?d?d?d?u?u?d?d +?l?l?l?l?l?l?l?d?d?d?d +?u?l?l?l?u?u?s +?l?l?l?l?u?s?u +?l?u?l?s?l?u?l +?d?d?d?s?d?d?d?d?d?d?d +?d?d?u?d?u?u?u?d +?u?d?d?u?d?u?d?l +?d?d?l?l?d?d?l?u +?l?d?d?l?u?l?d?d +?u?d?d?u?l?l?d?d +?d?d?d?d?u?u?l?u +?u?d?l?l?u?d?d?d +?d?d?u?l?d?d?u?u +?d?l?d?l?d?l?d?u +?u?l?u?d?d?l?d?d +?l?l?u?d?l?d?d?d +?l?u?d?d?d?u?l?d +?u?u?d?u?d?u?d?d +?d?d?u?l?l?d?d?u +?l?u?d?d?u?u?d?d +?u?l?d?d?u?u?d?d +?l?u?d?d?u?l?d?d +?l?d?d?d?d?l?l?u +?d?d?l?l?d?l?l?d?d +?d?d?u?l?u?u?d?d +?d?u?u?d?d?u?u?d +?l?u?d?d?d?d?u?l +?d?u?d?u?d?u?u?d +?d?u?l?d?d?l?l?d +?u?d?d?l?l?d?l?d +?u?u?d?d?d?l?l?d +?u?l?d?u?d?l?d?d +?d?d?u?u?u?d?u?d +?d?d?u?u?u?l?d?d +?u?u?d?d?u?l?d?d +?u?d?u?d?l?d?u?d +?d?u?d?d?u?u?d?u +?u?u?d?u?d?d?d?u +?l?l?d?u?u?d?d?d +?u?l?l?d?d?l?l?u +?u?l?l?l?d?l?d?l +?d?u?u?d?u?u?u?u +?l?l?d?d?u?l?l?l +?d?d?u?u?u?u?u?u?u +?l?l?u?l?l?l?l?d +?u?l?l?u?u?u?l +?u?l?u?u?l?u?u +?l?s?d?d?l?l?l?l +?d?u?l?l?d?d?d?s +?l?s?d?l?l?l?d?d +?l?d?d?l?d?l?d?s +?l?l?u?s?d?d?d?d +?l?l?d?l?d?s?d?d +?s?l?d?d?l?l?d?d +?l?l?d?d?l?d?d?s +?l?l?l?d?s?d?d?d?d +?d?d?d?l?l?l?d?s +?d?d?s?u?l?l?d?d +?l?l?d?d?s?l?d?d +?l?d?l?d?s?l?d?l +?l?l?d?d?l?l?d?s +?l?d?d?s?d?d?l?l +?l?d?l?d?d?l?d?s +?u?d?l?l?s?d?d?d +?u?u?u?u?d?d?s?d +?l?d?l?s?l?d?d?d +?l?l?l?l?u?d?d?d?d +?u?l?d?d?d?d?d?d?l +?u?d?d?d?d?d?d?u?u +?l?d?l?d?d?l?d?d?l +?d?d?d?u?l?u?d?d?d +?s?l?l?l?s?l?s +?l?l?d?d?d?d?s?d?d +?d?d?s?l?l?l?s?d?d +?l?l?l?l?d?l?l?d?d +?u?s?l?l?l?s?u +?l?u?u?u?u?d?d?d?d +?d?d?d?u?l?l?l?l?l +?d?s?d?s?s?d?s +?s?d?d?s?s?d?s +?s?d?s?d?s?s?d +?d?s?s?d?s?s?d +?s?s?d?d?s?s?d +?d?s?s?d?d?s?s +?u?d?d?d?d?u?d?d?d?d +?l?l?l?l?l?l?l?d?s +?l?l?l?u?l?l?l?l +?u?l?l?d?u?u?d +?d?d?u?d?u?u?u?u +?l?l?u?u?d?l?d +?u?d?u?l?l?d?u +?l?l?u?d?u?l?d +?u?u?l?d?u?u?d +?d?u?d?u?l?u?l +?d?u?l?d?l?u?u +?u?u?d?u?u?l?d +?u?l?u?d?l?l?d +?u?u?d?u?u?d?l +?d?u?u?l?l?u?d +?d?u?d?l?l?l?u +?l?l?d?u?d?u?l +?u?d?u?u?d?l?l +?u?d?d?l?u?u?u +?d?l?l?l?u?d?l +?d?u?d?u?u?u?u?d +?d?u?l?u?l?d?u +?u?u?d?u?l?l?d +?u?l?l?u?u?u?d?d +?d?l?u?u?u?l?d +?l?u?l?d?u?d?u +?l?u?l?d?u?d?l +?l?u?d?u?l?d?l +?l?u?l?u?d?u?d +?u?l?d?d?l?l?d?l +?u?l?d?u?u?d?l +?d?u?u?u?l?u?d +?l?u?u?d?d?l?u +?l?l?d?l?u?d?l +?l?d?d?l?u?u?l +?u?d?u?u?l?u?d +?d?u?u?d?u?u?u?d +?d?u?l?d?u?l?u +?d?u?l?u?u?d?l +?l?u?u?l?d?d?l +?l?l?u?d?l?d?l +?l?l?u?d?l?d?u +?u?l?u?d?l?u?d +?u?u?d?u?l?d?u +?l?d?l?u?u?l?d +?d?d?d?l?l?u?u?u +?l?u?d?l?l?d?l +?l?l?u?l?d?d?u +?l?l?u?l?d?d?l +?l?d?u?u?l?u?d +?d?u?d?u?u?l?l +?u?u?l?d?l?l?d +?l?d?d?u?l?u?l +?l?d?d?l?l?u?l +?d?d?d?u?l?l?l?u +?u?l?u?u?d?d?d?u +?d?l?u?u?l?u?d +?l?d?u?l?l?d?u +?u?d?d?u?l?u?u +?l?u?d?d?u?l?l +?l?d?l?u?d?u?u +?d?u?u?l?u?l?d +?l?l?d?u?d?l?l +?l?l?d?u?d?l?u +?l?d?u?u?u?u?d +?u?l?l?d?l?d?u +?l?u?d?l?u?d?l +?l?u?l?d?d?u?u +?d?l?l?u?u?d?u +?l?l?u?d?d?u?l +?d?u?l?u?u?d?u +?l?d?u?u?u?d?u +?l?u?l?d?l?u?d +?l?u?u?l?d?u?d +?u?u?u?d?u?d?l +?l?u?d?u?l?l?d +?d?l?l?d?l?u?u +?l?d?d?l?u?u?u +?d?l?l?u?l?d?l +?u?u?d?d?u?d?u?u +?l?d?l?u?l?u?d +?u?u?u?d?l?u?d +?u?l?u?d?u?l?d +?l?l?u?l?d?u?d +?u?u?l?l?d?u?d +?l?u?d?d?l?u?l +?l?l?u?u?l?d?d?d +?u?d?l?d?l?u?l +?u?u?l?d?d?u?l +?u?u?l?d?d?u?u +?d?d?u?l?u?u?u +?u?l?l?d?l?u?d +?l?d?d?u?u?l?l +?l?d?u?l?l?l?d +?l?l?d?l?u?u?d +?l?u?d?d?l?l?u +?d?l?d?u?l?u?u +?d?l?u?u?l?d?l +?u?l?u?u?d?l?d +?l?u?d?u?u?u?d +?d?d?l?u?u?l?u +?u?l?u?u?d?d?u +?u?d?l?d?u?l?u +?u?d?u?l?l?u?d +?u?d?u?d?u?l?u +?u?d?l?u?l?u?d +?d?u?u?l?d?u?u +?u?l?d?l?d?u?l +?u?u?l?d?l?u?d +?u?d?l?u?u?d?u +?d?l?d?u?l?l?u +?u?u?d?u?l?u?d +?u?u?u?s?u?u?d?d +?u?d?d?u?u?u?u?d +?l?l?l?d?d?d?l?u +?l?d?u?l?u?l?d +?d?u?u?l?d?l?l +?l?d?l?d?u?l?l +?u?l?u?l?u?s?d?d +?u?d?u?d?l?u?l +?u?d?u?u?d?u?l +?l?d?u?u?l?d?l +?d?u?u?u?u?d?l +?l?u?u?d?u?u?d +?l?d?u?d?l?u?l +?l?l?l?u?d?u?d +?l?u?u?d?u?l?d +?d?u?l?u?d?l?u +?l?d?u?l?l?u?d +?u?l?d?u?d?u?u +?u?l?d?u?d?u?l +?d?l?u?l?d?l?l +?l?u?d?d?l?u?u +?u?u?d?l?l?d?u +?u?u?d?d?l?u?l +?d?u?u?l?u?u?d +?u?d?l?u?d?u?l +?u?d?l?u?d?u?u +?l?d?l?u?u?u?d +?u?l?d?l?d?l?l?l +?d?l?u?l?d?u?u +?d?l?u?l?d?u?l +?l?l?d?u?l?l?d +?u?d?d?u?u?l?u +?u?u?d?d?l?l?u +?d?l?u?d?u?u?l +?d?d?u?l?l?l?l?s +?u?u?d?l?u?d?l +?d?l?d?u?u?u?u +?l?d?u?l?d?u?l +?d?d?l?u?u?u?l +?d?u?l?l?u?u?d +?l?u?u?l?d?l?d +?d?l?u?u?d?l?u +?d?l?u?u?d?l?l +?d?u?l?d?l?l?u +?l?l?l?l?l?s?l?l?l +?l?s?l?l?s?d?d?d +?d?d?s?s?s?d?d?d +?d?s?d?s?d?d?s?d +?s?d?d?s?d?d?d?s +?d?d?s?d?d?s?s?d +?d?d?s?d?d?s?d?s +?d?d?d?s?d?d?d?s?d +?u?l?l?l?s?u?l?l +?l?l?d?s?l?l?l?l +?l?d?s?s?s?l?d +?s?d?d?s?l?l?s +?s?s?s?l?d?l?d +?d?s?l?l?s?s?d +?d?d?s?l?s?l?s +?l?d?s?l?d?s?s +?l?s?d?d?s?l?s +?d?l?l?d?s?s?s +?d?s?d?s?l?l?s +?s?d?s?l?l?s?d +?l?l?d?s?d?s?s +?u?l?s?d?s?d?s +?s?d?d?l?s?l?s +?s?u?s?u?s?d?d +?s?l?s?d?l?d?s +?d?s?l?s?d?l?s +?u?u?s?s?d?d?s +?u?s?u?s?d?d?s +?s?d?d?s?s?l?l +?u?u?s?d?d?s?d?d +?s?u?u?s?d?d?d?d +?d?d?l?l?s?s?d?d +?l?l?d?d?s?d?d?s +?s?l?s?l?d?d?d?d +?l?l?d?d?s?s?d?d +?l?l?l?l?d?l?l?l?d +?d?d?u?l?l?l?l?u +?l?l?s?l?l?s?l?l +?d?d?d?d?d?d?u?u?s +?s?d?d?d?d?d?d?l?l +?u?u?u?u?u?d?d?d?d?d +?l?l?l?s?s?d?l +?u?l?u?l?d?s?s +?u?u?u?u?s?d?s +?s?s?l?d?l?l?l +?s?u?d?l?l?l?s +?d?s?l?l?s?l?l +?u?s?u?u?d?u?s +?d?l?l?l?s?l?s +?u?s?u?u?u?s?d +?u?l?l?s?l?s?d +?s?d?d?l?l?l?l?s +?s?d?u?u?u?u?s +?s?u?u?u?u?s?d +?u?u?d?u?u?s?s +?d?l?l?s?s?l?l +?d?s?l?s?l?l?l +?l?l?s?s?d?l?l +?s?u?u?u?u?d?s +?l?l?l?d?s?l?s +?l?l?l?l?u?u?u?d +?d?d?l?l?d?d?l?d?d +?d?d?d?d?d?d?u?u?l +?l?d?d?d?l?l?l?l?l +?d?d?d?u?l?l?l?s +?u?l?u?l?d?d?d?s +?l?l?d?l?l?d?d?s +?s?d?l?l?l?s?s +?l?s?s?s?l?l?d +?s?l?l?l?s?s?d +?s?l?s?l?l?l?s +?u?s?u?l?l?l?d?d +?d?d?s?u?l?l?l?l +?u?u?s?u?u?u?d?d +?l?d?s?s?s?s?s +?l?l?u?s?l?l?l +?u?l?u?s?l?u?l +?l?l?s?u?u?u?u +?u?l?l?l?u?s?u +?l?l?l?u?s?l?l +?u?u?u?u?d?u?d?u +?u?l?u?d?d?u?l?u +?d?d?u?u?u?l?l?l +?d?u?l?l?l?l?u?d +?u?u?u?u?u?u?s?s +?u?s?u?s?u?l?l +?u?u?l?l?l?s?s +?u?l?l?s?l?l?s +?s?s?u?l?u?s?s +?l?s?s?l?s?s?l +?l?l?l?s?l?l?l?s +?s?s?s?d?d?s?s +?l?l?d?d?l?l?d?d?l +?s?d?u?u?l?l?l +?u?l?u?u?l?s?d +?u?l?u?l?d?l?s +?u?u?d?u?u?u?s +?u?l?l?l?u?d?s +?s?d?u?l?l?l?u +?u?s?u?u?u?d?u +?d?u?u?u?s?u?u +?u?d?u?u?s?u?u +?l?l?l?l?d?u?s +?d?u?s?u?u?u?u +?d?d?l?s?l?l?l?l +?d?u?s?l?l?l?l +?l?l?l?l?u?d?s +?u?l?d?l?l?s?l +?l?l?l?s?l?d?u +?s?l?l?l?l?u?d +?u?l?l?s?u?u?d +?u?u?u?d?s?l?l +?l?d?l?u?l?s?l +?l?l?l?u?u?d?s +?d?l?l?l?l?u?s +?s?l?l?l?d?l?u +?u?d?u?u?u?s?u +?l?d?u?s?l?l?l +?u?l?l?s?l?l?l?l +?l?l?d?d?s?d?d?d?d +?l?d?d?d?d?d?d?l?s +?d?d?d?l?l?l?l?l?l?l +?u?u?u?d?u?d?u?d +?u?u?l?l?d?d?d?l +?l?u?d?d?d?l?l?l +?l?d?l?l?d?l?d?l?d +?l?l?d?d?d?l?l?u +?d?u?u?d?d?u?u?u +?u?u?d?l?l?l?d?d +?u?l?u?d?d?d?u?l +?l?l?l?u?d?d?d?l +?u?l?u?u?u?d?d?d +?d?u?u?u?d?u?u?d +?s?d?u?l?l?l?l?l +?u?l?u?l?l?d?d?d?d +?u?l?d?s?s?s?s +?l?l?s?d?s?s?s +?s?s?l?l?d?s?s +?l?u?u?l?u?u?u +?u?u?l?u?l?u?l +?u?l?u?l?l?u?u +?u?l?u?u?l?l?u +?u?u?u?l?l?l?u +?u?u?u?u?l?u?l +?l?l?u?u?l?l?u +?l?l?l?l?l?u?l?d +?u?l?l?l?l?l?d?u +?u?s?l?l?l?l?l?d +?u?l?u?l?l?u?d?d +?l?d?l?l?d?d?l?d?d +?l?d?l?d?l?d?d?l?d +?l?s?l?l?l?s?d?d +?s?d?l?l?l?l?d?s +?u?d?d?s?d?d?s?d?d +?l?d?l?l?d?l?l?d?d +?l?d?l?d?d?d?d?d?l +?d?d?d?u?d?d?d?d?u +?l?d?l?d?d?d?d?l?d +?u?d?d?d?l?d?d?d?d +?d?d?l?l?d?d?d?d?l +?d?d?d?d?d?l?l?d?d?d +?d?d?s?u?u?u?u?u +?d?l?l?l?l?d?l?s +?u?l?l?s?l?l?d?d +?d?d?d?d?d?d?s?d?s +?l?u?l?l?l?l?l?d +?u?s?u?u?u?d?d?d +?u?l?l?l?d?d?s?d +?d?d?l?l?l?l?d?s +?u?u?u?s?u?d?d?d +?s?u?u?u?u?d?d?d +?l?d?l?l?s?l?d?d +?l?d?l?l?d?l?d?s +?u?l?s?u?l?l?l?l +?u?l?l?l?l?d?d?d?d?d +?d?d?d?d?d?d?d?l?l?d +?u?u?u?l?l?d?d?d?d +?s?d?d?s?d?d?s?d?d +?d?d?d?s?s?s?d?d?d +?d?d?d?l?l?d?d?l?l +?l?l?d?d?d?d?l?l?d +?u?u?u?u?d?l?l?l +?l?l?l?d?d?l?l?l?d +?l?l?l?l?l?s?s?l +?u?l?l?u?l?l?d?d?d +?l?l?d?d?d?s?d?d?d +?l?l?l?s?l?l?l?l?l +?u?u?l?l?l?s?d?d +?d?d?l?l?l?l?u?u +?l?l?l?l?d?d?u?l +?u?u?u?d?u?u?d?u +?u?u?l?l?l?u?d?d +?d?d?s?l?d?s?d?d +?d?d?d?s?s?d?d?l +?s?u?s?d?d?d?d?d +?l?s?d?s?d?d?d?d +?d?d?d?d?s?l?d?s +?l?d?d?s?d?d?s?d +?u?d?d?s?d?d?s?d +?u?d?d?s?d?s?d?d +?s?l?d?s?d?d?d?d +?s?d?d?d?d?d?l?s +?d?d?d?s?d?l?s?d +?d?d?d?d?d?s?s?u +?s?s?d?d?d?d?d?u +?s?d?d?d?d?d?s?u +?l?s?d?d?s?d?d?d +?l?l?l?d?d?d?d?l?d +?s?u?d?d?d?d?d?d?d +?u?u?u?u?u?l?l?l +?u?s?l?l?s?l?l +?u?u?u?s?s?u?u +?u?u?u?s?u?u?s +?l?l?l?l?u?s?s +?u?l?l?l?u?s?s +?u?l?l?l?s?s?l +?l?l?l?l?s?s?u +?l?l?u?d?d?d?d?s +?l?d?l?d?d?d?l?s +?u?u?s?u?d?d?d?d +?u?l?s?u?d?d?d?d +?l?l?l?d?d?d?s?d?d +?d?s?l?l?l?d?d?d +?l?l?s?d?d?l?d?d +?l?l?d?d?d?l?s?d +?u?l?s?d?d?d?d?l +?s?d?l?d?l?d?l?d +?l?u?l?d?d?d?d?s +?d?d?s?d?d?u?u?u +?l?s?l?d?d?d?d?l +?s?d?d?d?d?u?l?l +?u?u?l?d?d?d?d?s +?l?d?l?d?l?d?l?d?s +?l?s?l?u?d?d?d?d +?s?l?d?l?d?l?d?d +?u?u?u?u?u?s?l +?s?l?l?u?l?l?l +?s?l?u?l?u?l?u +?l?l?u?l?s?l?l +?u?l?u?l?s?l?u +?s?u?u?u?l?l?l +?u?l?u?l?s?l?l +?u?l?l?s?u?u?l +?l?l?l?l?l?d?u?l +?u?l?l?l?l?s?d?d?d +?d?d?l?d?d?l?l?d?d +?d?d?l?d?l?d?l?d?d +?d?d?d?d?d?d?l?u?l +?l?l?d?d?d?d?d?d?u +?l?d?l?d?l?l?d?l?d +?l?l?l?s?s?s?d?d +?l?l?d?d?l?l?l?u +?u?l?l?l?d?d?u?l +?l?l?l?d?s?d?s?d +?l?l?s?d?s?d?d?d +?l?d?d?d?d?l?s?s +?d?d?d?d?u?l?s?s +?l?d?l?d?d?d?s?s +?d?d?l?l?d?d?s?s +?s?u?d?d?d?d?u?s +?l?l?d?l?d?l?d?d?d +?l?d?d?l?l?d?l?d?d +?u?l?l?l?l?u?d?d?d +?l?u?u?u?l?d?d?d +?d?u?d?u?d?u?u?u +?u?u?l?d?d?d?l?l +?l?l?d?d?d?l?u?l +?d?u?u?u?u?d?d?u +?s?u?l?l?l?l?l?s +?l?l?l?s?l?s?s +?l?l?s?l?s?l?s +?s?u?u?u?u?u?u?s +?l?l?l?l?l?s?l?s +?d?d?l?l?d?d?l?l?l +?l?l?d?d?u?u?s +?s?l?l?d?d?u?u +?l?u?l?u?d?s?d +?u?l?u?s?d?d?l +?d?d?s?l?l?u?u +?u?u?d?u?u?d?s +?l?s?u?u?d?l?d +?l?d?u?u?d?u?s +?l?d?u?l?d?l?s +?s?l?l?u?u?d?d +?s?l?d?u?l?d?l +?u?d?s?l?d?u?l +?l?d?u?l?d?u?s +?u?s?d?d?l?u?l +?u?u?u?l?s?d?d +?u?l?u?d?s?l?d +?u?s?d?d?u?l?l +?u?l?d?l?d?l?s +?l?l?d?l?s?d?l +?u?d?l?s?l?u?d +?l?d?l?l?d?s?u +?d?u?l?l?l?s?d +?s?d?u?u?u?d?u +?u?d?d?l?s?l?l +?u?u?d?u?d?u?s +?d?d?u?l?s?l?u +?u?d?s?d?u?u?u +?d?d?s?l?u?u?u +?u?l?d?d?s?u?u +?u?l?d?d?s?u?l +?u?s?u?l?u?d?d +?d?u?l?u?s?l?d +?d?l?l?l?d?u?s +?l?l?u?d?d?l?s +?l?u?s?l?u?d?d +?u?d?l?d?u?s?l +?u?l?u?s?l?d?d +?d?s?l?d?u?l?l +?s?l?l?l?u?d?d +?l?l?l?u?d?d?s +?u?s?u?u?l?d?d +?l?d?d?s?u?l?u +?u?u?d?u?s?u?d +?l?d?l?d?l?u?s +?u?d?d?u?l?u?s +?l?d?l?l?d?u?s +?u?d?d?l?l?s?u +?u?u?d?d?l?l?s +?d?u?l?l?s?u?d +?s?u?l?u?l?d?d +?u?d?u?d?l?l?s +?u?d?l?s?d?u?l +?u?s?u?u?d?u?d +?u?s?d?l?u?l?d +?d?d?u?u?u?s?u +?d?l?d?s?l?u?l +?u?d?u?s?l?l?d +?u?d?d?s?l?l?u +?l?d?d?l?s?l?u +?s?l?l?u?l?d?d +?s?u?d?l?l?d?u +?d?d?u?l?s?u?l +?u?d?l?l?d?u?s +?u?d?u?u?u?d?s +?u?u?l?d?d?s?u +?l?s?l?u?d?d?l +?s?u?l?d?d?l?l +?d?d?u?l?s?l?l +?d?u?u?s?u?u?d +?l?l?l?s?d?u?d +?d?d?l?u?l?l?s +?u?s?u?u?d?l?d +?u?s?l?l?d?l?d?d +?l?l?u?s?l?d?d +?l?d?d?l?u?u?s +?u?l?u?u?d?d?s +?d?u?l?l?l?d?s +?u?d?d?u?l?l?s +?u?d?u?d?u?s?l +?u?d?u?d?u?s?u +?d?u?l?u?l?d?s +?u?u?d?d?l?s?l +?u?d?s?l?l?d?u +?u?d?s?u?u?d?u +?u?d?l?s?l?d?l +?u?l?d?d?u?s?l +?d?u?s?l?l?d?u +?u?s?l?l?d?d?l +?u?l?d?u?l?d?s +?u?u?u?s?d?d?l +?u?s?u?d?u?u?d +?l?u?u?s?d?d?u +?u?l?d?l?u?d?s +?u?d?l?d?l?u?s +?d?l?l?d?s?l?u +?u?l?s?d?d?l?u +?s?u?d?u?u?d?u +?d?s?u?l?l?l?d +?l?s?u?u?d?d?l +?s?u?d?l?u?d?l +?d?l?s?d?l?u?l +?l?u?s?d?d?l?l +?u?s?d?u?d?l?l +?u?l?s?d?d?u?l +?u?l?d?l?l?d?s +?l?d?s?l?d?l?u +?s?d?l?d?l?u?l +?u?l?l?d?d?s?u +?s?d?d?u?u?u?l +?u?l?d?s?d?l?u +?u?d?l?d?u?l?s +?s?u?l?u?u?d?d +?d?d?u?l?u?l?s +?s?l?l?d?d?l?u +?u?s?l?d?l?d?u +?s?u?u?d?d?l?l +?u?u?s?u?d?u?d +?l?s?u?d?d?u?l +?u?l?d?l?s?l?d +?u?d?u?u?s?d?l +?l?l?s?l?d?u?d +?u?s?d?l?l?l?d +?d?u?d?l?l?l?s +?d?l?d?l?l?u?s +?d?d?d?l?l?s?l?l +?u?u?l?d?d?l?s +?u?u?s?d?u?u?d +?d?u?u?s?u?d?u +?d?u?l?s?l?d?l +?l?d?l?l?l?l?d?s +?u?d?u?d?s?u?u +?l?d?l?u?d?l?s +?s?u?l?l?u?d?d +?u?s?l?d?l?d?l?d +?u?s?d?d?l?l?l +?d?u?l?d?u?s?l +?d?d?s?u?l?l?u +?u?d?d?l?l?u?s +?u?s?u?d?l?d?l +?s?d?d?u?u?l?l +?u?l?d?s?l?u?d +?l?d?l?u?l?s?d +?u?u?d?u?s?d?u +?u?s?u?d?u?d?l +?s?d?d?l?l?u?u +?l?s?l?d?d?l?u +?u?u?s?d?l?u?d +?u?d?u?s?d?u?u +?u?d?l?l?d?s?u +?u?s?l?l?d?d?u +?u?d?d?l?u?l?s +?u?l?s?u?d?u?d +?u?s?u?l?d?u?d +?u?s?d?l?d?l?l +?u?d?l?d?s?l?l +?s?d?u?d?l?l?l +?s?u?l?d?l?l?d +?l?s?d?d?d?l?l?l +?d?s?l?l?l?d?u +?d?u?l?l?u?d?s +?l?d?l?u?l?d?s +?l?s?l?d?u?u?d +?u?l?d?l?u?s?d +?d?d?u?l?l?s?u +?s?u?u?l?l?d?d +?u?l?u?d?l?s?d +?d?u?l?u?d?l?s +?l?l?u?u?d?s?d +?s?l?l?u?d?l?d +?u?l?u?d?s?d?l +?u?l?u?d?s?d?u +?s?l?l?l?d?d?u +?d?l?d?l?u?s?l +?u?u?u?d?u?s?d +?d?d?l?u?l?u?s +?d?l?l?s?l?d?l +?d?u?s?u?d?u?l +?d?d?s?u?l?u?l +?l?u?s?d?d?u?u +?l?s?u?d?l?d?l +?d?d?u?s?l?l?u +?l?l?d?d?s?u?l +?l?d?l?u?d?s?l +?l?d?u?l?l?s?d +?l?s?u?l?d?l?d +?l?l?d?s?l?l?d?d +?d?d?u?u?l?l?s +?l?l?d?d?l?u?s +?u?d?l?l?s?d?u +?u?d?u?l?d?l?s +?u?d?d?u?s?l?l +?l?u?l?d?d?s?l +?d?d?l?u?u?u?s +?l?d?s?l?l?d?u +?s?u?l?d?l?d?l +?u?d?u?u?u?s?d +?d?s?l?l?u?u?d +?s?l?d?l?d?l?d?l +?u?d?d?l?s?u?u +?s?l?u?u?u?d?d +?l?s?l?d?l?d?u +?d?d?l?l?u?u?s +?l?l?d?u?s?d?l +?l?u?u?s?u?d?d +?d?d?u?l?l?s?l +?u?l?s?u?d?d?l +?d?u?u?u?s?u?d +?d?l?s?l?l?d?u +?u?d?l?s?d?l?u +?u?l?l?d?d?u?s +?l?s?u?u?u?d?d +?u?l?u?l?u?l?d?d?d +?u?s?l?l?l?l?l?l +?u?l?l?s?l?l?l?d +?u?l?d?d?d?u?l?d +?u?d?l?u?d?u?d?d +?d?d?l?l?u?l?d?d +?u?d?l?l?d?d?d?l +?u?l?d?d?u?d?d?l +?l?l?l?d?d?u?d?d +?d?u?l?d?u?l?d?d +?d?d?u?l?d?d?l?l +?d?d?u?l?d?d?l?u +?d?l?d?l?u?d?l?d +?u?l?l?d?u?d?d?d +?d?d?d?u?u?l?l?d +?l?l?d?d?d?d?l?u +?d?u?d?d?u?d?u?u +?u?d?d?d?d?l?u?u +?d?l?d?l?d?l?u?d +?d?u?d?d?d?u?u?u +?d?u?l?d?d?u?l?d +?l?u?d?l?u?d?d?d +?d?l?d?l?u?l?d?d +?u?l?u?d?d?d?u?d +?l?d?d?d?d?u?u?u +?d?u?u?u?d?u?d?d +?u?d?u?d?d?d?l?l +?u?u?l?d?d?d?d?l +?u?d?l?l?d?u?d?d +?d?u?d?l?l?l?d?d +?l?d?d?l?l?d?d?u +?u?d?l?d?l?d?d?u +?u?u?l?d?d?l?d?d +?d?d?u?d?d?l?l?l +?d?d?d?l?l?d?u?u +?l?u?u?d?d?d?d?l +?d?l?l?d?d?d?l?u +?l?d?d?u?l?d?d?u +?u?l?u?d?d?d?l?d +?l?d?u?d?u?d?l?d +?d?u?u?d?u?d?d?u +?u?d?d?d?l?d?l?l +?l?u?d?d?d?d?l?l +?d?d?d?d?d?d?u?d?d?d +?l?s?s?s?s?d?d +?d?d?s?s?s?s?l +?s?s?d?d?s?l?s +?s?l?s?s?d?d?s +?s?s?d?d?l?s?s +?s?s?d?d?s?s?l +?s?s?d?d?s?s?u +?s?d?d?s?l?s?s +?u?l?l?d?u?u?l +?u?u?l?u?l?l?d +?u?u?l?u?d?l?l +?u?u?u?u?l?d?u +?u?d?u?u?u?u?l +?l?l?u?d?l?l?u +?u?u?d?u?d?u?u?u +?u?u?l?u?l?u?d +?l?d?l?u?l?u?u +?l?u?u?u?u?d?l +?u?d?u?u?l?u?u +?l?u?d?l?u?u?u +?l?l?d?u?u?u?l +?l?u?l?d?u?l?l +?l?d?u?u?u?l?l +?l?d?u?l?l?u?l +?l?d?u?l?l?u?u +?l?u?u?d?l?u?u +?l?d?l?l?u?l?u +?l?l?l?l?d?d?l?u +?d?u?u?u?u?u?l +?l?l?u?l?l?u?d?d +?u?l?u?d?l?u?u +?l?l?d?l?u?u?u +?d?u?u?l?l?l?u +?d?u?l?u?u?u?u +?l?l?u?l?u?l?d +?l?l?u?l?l?d?d?l +?l?u?u?l?u?l?d +?d?l?u?l?l?u?u +?d?l?u?l?l?u?l +?u?l?u?u?u?d?l +?d?u?l?u?l?l?u +?l?l?l?u?d?u?l +?u?u?d?l?u?l?u +?u?d?u?u?d?u?u?u +?u?u?l?l?d?u?l +?u?u?l?l?d?u?u +?d?u?u?u?l?l?u +?l?l?u?u?l?u?d +?l?l?u?d?l?u?l +?u?l?u?u?u?d?u +?u?l?l?d?l?u?u +?u?l?l?l?d?d?u?u +?u?l?u?u?d?l?l +?u?u?u?u?l?u?d +?u?u?d?l?l?u?u +?u?u?d?l?l?u?l +?l?d?l?u?u?u?u +?u?u?l?u?l?d?l +?d?d?l?l?u?l?l?l +?l?u?l?d?u?u?u +?u?u?l?d?u?l?l +?l?l?u?u?l?d?u +?d?l?u?l?u?l?u +?u?l?u?d?u?u?u +?l?l?l?u?l?d?u +?l?u?l?d?l?u?u +?l?u?l?d?l?u?l +?l?u?l?u?l?d?u +?l?d?u?l?u?l?u +?l?d?u?l?u?l?l +?l?l?l?d?u?u?l +?l?l?d?u?l?l?u +?l?u?u?l?d?l?l +?u?l?u?l?l?d?u +?l?u?u?d?l?l?l +?u?d?l?l?u?u?u +?d?u?u?u?u?u?u?u?u +?d?s?d?s?d?s?d?l +?d?d?l?l?l?d?d?l?l +?d?l?l?l?l?l?s?d +?l?d?d?l?l?l?l?s +?d?d?l?l?s?l?l?l +?u?u?u?u?d?d?d?d?s +?d?d?s?d?d?s?d?d?u +?u?u?u?u?u?l?l?d +?s?s?l?l?l?s?d +?s?s?s?d?l?l?l +?s?l?s?l?s?l?d +?s?l?l?l?d?s?s +?s?l?s?l?l?s?d +?d?s?l?s?l?l?s +?l?s?l?d?l?s?s +?l?s?s?d?l?s?l +?s?l?s?s?l?l?d +?l?s?l?d?s?l?s +?l?s?l?d?s?s?l +?l?s?l?l?d?s?s +?d?s?d?s?d?l?l?l +?s?l?l?l?d?d?d?d?s +?d?l?d?l?d?l?s?s +?l?l?d?d?d?d?d?l?d +?d?d?u?d?d?l?d?d?u +?l?l?s?s?s?s?d +?s?u?s?u?s?u?s +?s?s?s?s?u?u?u +?s?s?u?l?l?s?s +?s?s?l?d?l?s?s +?l?s?l?d?s?s?s +?l?u?l?l?l?u?u +?l?l?l?u?u?u?l +?l?l?u?u?l?u?l +?l?l?l?l?l?d?u?u +?u?u?u?l?l?u?l +?u?u?u?u?u?u?u?u?d?d +?u?u?u?u?u?u?s?d?d +?u?l?l?l?u?l?l?d?d +?u?s?u?s?l?l?l +?s?l?u?l?l?l?s +?l?l?s?s?s?d?d?d +?d?d?l?l?u?u?u?u +?u?l?u?l?u?u?d?d +?d?u?l?l?u?l?l?d +?d?d?u?l?u?l?u?l +?l?l?l?u?u?l?d?d +?d?d?d?d?d?d?l?l?l?d +?l?d?l?d?l?d?l?l?d +?l?d?d?l?d?l?d?d?l +?l?l?l?l?l?d?d?s?d +?l?d?d?s?l?l?l?l +?u?u?u?u?u?d?s?d +?l?l?l?l?d?u?u?u +?l?l?l?s?l?d?d?d?d +?u?s?l?s?u?s?l +?l?l?s?s?l?l?s +?d?d?d?d?d?d?d?d?l?u +?u?s?s?l?l?d?l +?s?u?u?u?d?u?s +?u?s?s?l?l?l?d +?d?l?s?l?s?l?l +?d?s?l?l?l?s?l +?u?d?s?u?u?u?s +?s?d?l?l?s?l?l +?s?u?l?u?l?s?d +?s?l?l?d?l?s?l +?s?l?l?l?s?l?d +?u?d?l?s?l?l?s +?u?s?s?l?d?l?l +?s?u?l?l?l?s?d +?l?l?s?s?l?l?d?d +?l?l?s?s?l?d?l +?l?l?s?l?d?s?l +?u?s?d?l?l?l?s +?s?d?s?u?u?u?u +?u?d?l?l?l?s?s +?u?l?d?s?l?l?s +?s?d?l?s?l?l?l +?u?u?s?d?s?u?u +?d?l?l?s?l?l?s +?s?l?l?s?d?l?l +?u?l?u?l?s?s?d +?l?s?u?s?l?l?d +?u?s?u?l?l?s?d +?s?s?d?d?l?l?l?l +?u?u?l?l?s?s?d?d +?u?l?s?u?l?s?d +?l?l?s?l?s?l?d +?u?s?l?l?l?s?d +?u?u?u?s?u?s?d +?s?s?l?l?l?d?l +?u?u?u?u?u?u?u?d?d?d +?l?l?l?d?d?l?l?l?d?d +?l?d?d?d?d?d?d?s?s +?d?d?d?d?d?d?l?s?s +?u?l?l?u?l?l?l?d?d +?l?l?s?l?d?l?d?d +?d?d?d?u?u?u?u?s +?l?l?d?l?d?l?d?s +?l?l?l?d?l?d?d?s +?l?l?l?d?d?d?d?l?l?l +?s?s?s?l?s?s?s +?l?s?l?l?l?l?s?d +?u?d?d?d?d?u?d?d?d +?u?d?l?d?d?d?d?d?d +?d?l?d?d?d?d?l?d?d +?u?d?l?l?l?d?d?d?d +?u?l?l?u?l?d?d?d?d +?l?d?d?d?u?l?l?l +?u?d?d?d?l?u?l?l +?u?d?l?l?d?d?l?l +?u?d?l?d?u?d?l?l +?u?d?u?u?u?d?d?u +?d?u?u?u?u?d?u?d +?u?u?l?u?u?d?d?d +?u?d?l?l?l?u?d?d +?u?u?d?u?d?u?d?u +?l?u?u?l?l?d?d?d +?d?d?d?l?u?u?u?u +?u?d?d?l?l?l?d?u +?u?u?u?l?u?d?d?d +?u?d?l?l?d?u?d?l +?d?u?d?d?u?u?u?u +?d?u?l?l?l?u?d?d +?l?d?d?d?l?l?l?u +?u?d?l?u?l?l?d?d +?d?d?u?u?u?u?d?u +?u?d?d?l?d?l?l?l +?l?l?l?l?l?u?l?l +?u?l?s?l?l?l?u +?l?l?l?l?s?u?l +?l?s?l?l?l?u?l +?l?l?s?l?l?l?u +?l?l?u?l?l?s?l +?s?l?l?l?u?l?l +?u?l?l?u?u?u?s +?u?s?u?l?u?l?u +?u?l?l?u?l?u?s +?s?l?l?l?l?u?l +?l?s?u?u?u?u?u +?l?l?u?u?l?l?s +?l?u?u?s?u?u?u +?l?s?l?l?l?l?s?l +?l?d?l?d?l?l?l?s +?u?l?l?s?d?d?d?d?d +?d?d?d?d?d?d?s?l?l?l +?l?l?u?l?l?l?l?l +?d?d?d?s?d?d?d?l?l +?d?d?d?d?d?d?s?l?d +?d?d?d?d?d?s?d?d?l +?d?d?l?l?d?d?d?d?s +?d?d?d?d?d?d?l?d?s +?d?d?d?d?d?d?u?s?u +?u?u?u?u?u?d?d?l +?l?d?l?l?d?l?l?d?l +?u?l?l?l?l?l?u?l +?d?l?l?l?s?l?l?l +?l?l?s?d?d?d?d?d?d?d +?l?l?l?s?s?l?l?l +?l?l?s?l?s?d?d?d +?s?u?u?u?d?d?d?s +?u?d?d?d?d?u?l?d +?d?d?u?d?d?d?l?l +?d?l?d?d?u?d?d?u +?d?u?d?l?d?u?d?d +?d?l?d?d?d?l?u?d +?d?d?l?d?d?l?u?d +?l?d?u?d?d?u?d?d +?l?u?d?d?l?d?d?d +?l?d?d?d?u?u?d?d +?u?d?l?d?d?d?u?d +?d?d?d?u?d?l?d?l +?d?l?d?d?d?u?l?d +?u?l?d?u?d?d?d?d +?d?d?d?l?u?u?d?d +?l?d?l?d?u?d?d?d +?l?d?d?l?d?u?d?d +?d?l?d?d?d?u?u?d +?l?u?d?l?d?d?d?d +?d?d?u?d?u?d?l?d +?d?d?u?d?d?u?d?l +?d?l?d?u?l?d?d?d +?l?u?d?d?u?d?d?d +?d?u?d?d?l?d?d?u +?d?d?d?d?u?u?d?l +?d?d?d?u?u?l?d?d +?d?d?d?u?l?d?d?u +?d?d?d?u?l?d?l?d +?d?d?l?d?u?l?d?d +?l?d?d?d?d?d?l?u +?d?d?d?l?d?u?l?d +?d?d?u?d?l?d?d?u +?u?d?d?l?d?d?d?l +?d?l?u?u?d?d?d?d +?l?l?d?d?d?u?d?d +?d?l?d?u?d?d?d?l +?l?u?d?d?d?u?d?d +?d?l?l?d?d?d?u?d +?l?d?u?d?u?d?d?d +?u?d?l?d?d?d?d?u +?d?d?d?d?l?d?l?u +?d?d?d?d?l?u?d?l +?d?l?l?d?d?d?d?u +?u?d?d?u?d?d?d?l +?d?u?d?u?l?d?d?d +?u?d?u?d?d?d?d?u +?d?d?l?l?d?u?d?d +?d?d?d?l?l?u?d?d +?u?u?d?d?d?u?d?d?d +?l?d?d?u?d?d?d?l +?d?d?u?d?u?d?u?d +?d?d?u?u?d?l?d?d +?d?u?d?d?d?d?u?u +?d?u?u?d?d?d?u?d +?d?d?l?d?l?d?u?d +?u?l?d?d?d?d?l?d +?l?d?d?d?d?u?u?d +?d?l?d?u?u?d?d?d +?l?d?u?d?d?d?d?u +?l?d?u?d?d?d?d?l +?d?u?d?l?d?l?d?d +?d?l?l?u?d?d?d?d +?u?d?d?d?d?l?u?d +?u?d?l?u?d?d?d?d +?d?d?l?d?u?d?d?l +?d?d?d?u?d?u?u?d +?d?d?u?d?l?d?l?d +?l?d?d?d?u?d?d?u +?d?u?u?d?d?d?l?d +?u?d?d?d?d?d?u?l +?d?l?u?d?u?d?d?d +?d?d?u?d?d?u?u?d +?d?d?d?u?d?l?l?d +?d?l?d?d?l?d?u?d +?d?l?d?u?d?l?d?d +?u?d?l?d?d?d?d?l +?d?l?d?d?l?d?d?u +?d?l?u?d?d?l?d?d +?d?d?l?l?u?d?d?d +?d?u?l?d?d?d?l?d +?l?d?d?d?u?d?d?l +?d?u?d?l?d?d?d?l +?u?d?d?d?d?d?l?u +?d?d?u?d?d?l?l?d +?d?u?d?l?d?d?u?d +?d?u?d?u?d?d?d?l +?d?d?d?l?d?l?u?d +?d?d?u?l?d?u?d?d +?l?d?u?d?l?d?d?d +?l?d?d?u?l?d?d?d +?u?d?d?d?u?d?u?d +?u?d?d?d?d?u?d?l +?d?d?l?u?l?d?d?d +?d?d?u?d?l?d?d?l +?l?d?d?d?d?u?d?u +?l?d?l?d?d?u?d?d +?l?d?d?l?u?d?d?d +?l?d?d?u?d?u?d?d +?l?d?l?d?d?d?d?u +?d?l?d?d?l?u?d?d +?d?l?u?d?d?d?d?u +?d?u?d?d?d?u?d?u +?u?d?l?d?d?d?l?d +?d?u?l?d?l?d?d?d +?s?u?l?l?l?l?l?d +?l?l?l?l?l?l?u?l +?u?u?u?u?d?d?s?s +?d?u?l?l?l?l?l?s +?s?d?d?s?s?d?d?d +?s?d?d?s?d?s?d?d +?d?d?d?d?s?d?s?s +?d?d?d?s?d?d?s?s +?d?s?d?d?s?d?s?d +?d?d?d?d?s?s?s?d +?s?d?d?d?d?s?s?d +?d?d?s?d?s?s?d?d +?s?d?s?s?d?d?d?d +?l?l?d?d?d?l?l?d?d?d +?l?l?l?d?d?d?l?l?d +?l?l?l?d?d?d?d?d?d?s +?d?d?d?d?d?s?d?s?d +?u?l?s?l?l?l?l?l +?u?u?u?d?u?d?u?u +?d?u?l?l?d?u?l?l +?l?u?l?u?l?l?d?d +?s?d?d?d?d?d?d?d?d?d?d +?l?l?l?l?l?d?s?d?d +?l?s?s?l?s?l?l +?s?s?s?u?u?u?u +?d?d?d?l?l?d?d?d?d?d +?d?d?d?d?d?d?d?l?l?l?l +?l?d?s?d?d?s?l?d +?u?l?s?d?d?s?d?d +?l?s?d?d?s?l?d?d +?d?d?s?u?u?s?d?d +?d?d?d?d?s?s?u?u +?u?u?s?d?d?d?d?s +?u?l?s?d?d?d?d?s +?d?d?s?s?l?l?d?d +?d?s?d?d?s?d?d?l?l +?d?s?d?s?d?d?u?u +?d?d?l?s?d?d?l?s +?l?d?s?l?d?s?d?d +?s?s?s?d?s?s?s +?u?l?l?l?l?u?u?u +?u?s?l?s?l?l?l +?u?s?l?l?l?s?l +?u?l?s?l?l?l?s +?u?l?l?s?l?s?l +?s?u?u?u?u?s?u +?u?s?s?u?u?u?u +?u?u?u?s?u?u?u?d +?d?d?d?d?d?d?u?l?s +?l?l?d?l?l?d?l?s +?l?d?l?l?l?d?l?s +?l?l?l?l?l?d?l?u +?u?u?d?l?l?l?l?l +?d?d?d?d?l?s?s?s +?d?d?d?d?u?u?d?d?d?d +?l?l?s?l?d?d?d?l +?d?s?l?l?l?l?d?d +?u?l?l?u?s?d?d?d +?d?l?l?l?l?d?s?d +?u?s?l?d?l?l?d?d +?u?s?u?l?l?d?d?d +?d?d?d?d?d?d?s?l?s +?d?d?d?u?u?u?u?d?d +?l?l?l?l?d?d?d?s?d +?s?u?d?d?l?l?s +?u?s?l?u?s?d?d +?s?s?u?u?l?d?d +?d?u?s?u?s?u?d +?u?d?d?u?l?s?s +?u?d?s?l?d?l?s +?u?d?u?s?u?d?s +?l?d?l?s?s?l?d +?u?s?u?d?u?d?s +?d?u?l?u?s?d?s +?l?u?d?d?u?s?s +?l?l?d?s?s?l?d +?s?d?d?l?u?u?s +?s?s?l?d?d?l?l +?u?s?d?s?l?d?l +?s?u?d?l?d?s?l +?s?d?l?l?s?l?d +?u?s?d?l?s?d?u +?d?u?s?s?l?d?l +?d?u?s?l?s?d?l +?u?d?l?l?s?s?d +?s?d?u?l?l?d?s +?d?s?d?l?s?l?l +?s?u?s?l?l?d?d +?d?l?s?l?s?d?u +?l?s?d?s?l?l?d +?l?d?d?s?l?l?s +?s?l?u?s?l?d?d +?u?l?d?d?l?s?s +?u?u?d?d?l?s?s +?l?d?d?u?s?s?l +?s?d?d?l?s?u?l +?l?d?d?s?l?s?l +?l?l?d?d?s?l?s +?s?s?d?d?u?l?u +?s?s?d?d?u?l?l +?s?d?l?l?s?d?l +?u?d?s?s?d?u?u +?s?u?s?u?u?d?d +?u?l?l?l?s?s?d?d +?u?d?s?u?s?l?d +?l?s?s?d?l?d?u +?u?d?u?u?d?s?s +?u?l?s?u?s?d?d +?l?d?u?d?l?s?s +?u?s?u?d?d?s?u +?u?d?d?s?l?l?s +?s?l?d?s?l?l?d +?u?u?l?s?d?s?d +?d?l?s?s?l?u?d +?s?u?d?l?l?d?s +?u?l?d?s?s?d?u +?u?u?s?u?s?d?d +?s?u?l?d?d?l?s +?u?s?l?s?d?l?d +?l?s?d?d?l?s?l +?s?d?l?d?l?d?l?s +?s?s?l?d?l?l?d +?l?l?s?d?l?d?s +?l?s?d?l?u?d?s +?d?d?s?u?u?s?l +?s?u?l?d?l?d?s +?u?s?d?u?d?u?s +?l?u?l?s?d?s?d +?u?s?l?s?l?d?d +?u?u?s?d?s?l?d +?l?d?d?s?s?l?l +?l?d?s?l?l?s?d +?u?s?l?l?d?d?s +?s?s?l?l?u?d?d +?l?d?l?s?s?d?l +?l?d?l?s?s?d?u +?u?s?u?d?s?d?u +?l?d?s?s?d?l?l +?d?l?s?u?s?l?d +?u?d?d?s?s?l?l +?d?l?s?s?d?l?l +?s?s?u?d?d?l?l +?d?l?u?d?l?s?s +?u?l?d?s?s?d?l +?u?s?u?l?s?d?d +?u?u?l?d?d?s?s +?u?d?d?s?s?u?u +?l?l?s?u?s?d?d +?u?s?l?l?d?s?d +?u?s?s?u?d?d?u +?u?s?l?d?l?d?s +?s?d?l?d?l?s?l +?s?s?l?u?u?d?d +?l?d?l?s?l?s?d +?l?l?d?d?u?s?s +?d?u?l?d?l?s?s +?u?s?l?d?d?u?s +?s?u?d?d?l?u?s +?d?s?s?u?l?l?d +?l?l?d?s?l?d?s +?s?d?d?u?s?u?l +?s?d?d?u?s?u?u +?u?s?d?l?u?d?s +?u?s?d?d?l?l?s +?u?d?s?u?l?d?s +?s?d?d?l?l?s?l +?d?d?s?u?l?l?s +?s?u?d?l?s?u?d +?d?l?s?d?l?s?l +?s?l?u?l?s?d?d +?s?d?d?s?u?l?u +?d?s?d?l?l?s?l +?s?s?d?l?l?d?l +?u?s?s?l?u?d?d +?d?l?l?s?d?s?l +?u?s?d?d?u?u?s +?u?s?d?l?d?l?s +?l?s?d?s?l?d?l +?d?d?u?l?u?s?s +?s?l?l?d?l?s?d +?l?d?l?l?s?d?s +?d?d?u?l?l?s?s +?d?d?l?s?l?l?s +?d?l?l?l?s?s?d +?d?d?s?l?s?u?u +?s?d?d?u?l?l?s +?d?l?s?u?d?u?s +?d?l?l?s?s?l?d +?d?s?l?s?d?l?l +?d?s?l?s?l?l?d +?s?l?s?l?d?d?l +?s?u?u?s?l?d?d +?u?u?s?u?d?d?s +?l?l?d?d?s?u?s +?l?d?l?u?d?s?s +?d?l?u?d?s?l?s +?d?s?l?l?s?d?l +?s?d?s?l?l?d?l +?l?l?d?s?s?d?l +?l?s?l?d?u?s?d +?s?l?d?d?l?s?l +?d?s?l?d?s?u?u +?u?s?d?d?l?u?s +?d?s?d?l?l?l?s +?d?l?s?l?l?d?s +?s?s?u?d?u?u?d +?s?d?u?l?d?l?s +?u?l?d?s?u?d?s +?l?u?l?l?l?l?l?l +?l?l?l?l?l?d?l?l?d +?l?d?l?s?l?l?l?l +?d?d?u?l?l?l?l?l?l +?u?u?u?l?l?u?d?d +?l?u?u?l?l?l?d?d +?u?u?l?l?d?d?l?l +?d?u?u?u?l?l?l?d +?l?d?s?l?l?d?d?d +?d?d?d?d?s?u?l?u +?l?d?s?d?l?l?d?d +?u?l?l?d?s?d?d?d +?d?s?d?l?l?l?d?d +?d?l?d?l?s?d?l?d +?d?d?d?d?u?s?u?u +?u?s?l?d?l?d?d?d +?u?u?s?l?d?d?d?d +?d?d?u?u?u?s?d?d +?u?u?s?d?d?d?d?l +?l?s?d?l?l?d?d?d +?d?l?l?l?d?d?s?d +?d?d?s?u?u?u?d?d +?l?d?d?d?l?d?l?s +?l?d?d?d?s?d?l?l +?u?d?d?d?d?l?l?s +?u?s?l?u?d?d?d?d +?l?l?d?d?d?d?u?s +?d?l?l?l?d?d?d?s +?d?d?l?s?d?d?l?l +?l?s?l?d?d?l?d?d +?d?d?u?l?s?l?d?d +?d?d?d?u?l?l?s?d +?u?u?l?s?d?d?d?d +?s?l?d?l?l?d?d?d +?s?l?d?d?l?d?d?l +?l?d?d?l?l?s?d?d +?d?d?d?d?l?d?l?d?l +?d?l?d?d?l?l?d?d?d +?l?d?d?u?d?d?l?d?d +?d?d?d?d?l?d?l?l?d +?d?l?l?d?d?l?d?d?d +?s?s?s?s?d?d?s +?s?d?s?d?s?s?s +?s?s?d?d?s?s?s +?s?s?d?s?s?d?s +?d?l?l?l?u?l?l?l +?l?l?l?u?d?l?l?l +?l?l?u?s?d?u?l +?s?l?u?u?l?d?l +?l?u?l?l?u?d?s +?l?d?l?l?s?u?u +?l?d?l?l?s?u?l +?u?l?l?l?s?l?d?d +?l?l?l?u?u?s?d +?s?u?u?u?d?u?u +?d?l?l?l?l?s?l?l +?l?l?l?l?d?s?u +?l?u?l?l?d?l?s +?d?s?l?u?u?u?u +?u?l?l?s?d?l?u +?u?u?u?u?s?d?u +?l?u?l?l?l?d?s +?l?l?d?l?l?l?s?d +?l?l?d?u?u?s?l +?l?d?l?u?l?u?s +?u?l?l?l?s?d?u +?l?u?l?u?l?s?d +?u?l?l?l?d?u?s +?l?l?d?s?u?u?u +?s?u?d?u?u?u?u +?u?s?l?u?l?d?l +?u?l?d?s?l?l?u +?l?l?d?u?l?l?s +?l?d?s?u?l?l?l +?d?s?l?l?u?l?l +?l?s?l?u?l?d?l +?l?l?s?u?l?l?d +?l?l?l?u?d?l?s +?l?l?s?d?u?u?u +?d?u?u?s?u?u?u +?u?s?l?d?l?u?u +?l?l?u?l?l?d?s +?l?s?l?l?d?l?u +?l?d?u?l?s?l?l +?s?d?u?u?u?l?l +?l?d?l?u?s?l?l +?l?l?l?s?u?u?d +?s?l?l?l?l?d?u +?u?l?s?l?d?l?u +?u?s?u?u?l?l?d +?l?l?s?u?l?d?l +?l?u?l?l?s?l?d +?s?d?l?u?u?u?u +?l?d?s?l?l?l?u +?l?d?l?l?u?s?l +?l?u?u?u?u?s?d +?u?s?l?l?d?l?u +?u?l?d?s?u?l?l +?d?u?l?l?l?s?u +?l?l?l?d?s?l?u +?u?s?u?l?d?l?l +?l?l?d?u?s?l?l +?l?d?l?l?s?l?d?l +?l?u?s?l?d?l?l +?d?l?l?s?u?l?l +?u?l?d?l?l?u?s +?l?s?u?d?l?l?l +?u?u?u?d?u?s?u +?l?l?s?d?u?l?l +?l?l?d?l?l?s?u +?l?l?l?u?s?l?d +?l?s?l?l?l?u?d +?d?l?l?l?u?s?l +?l?d?u?s?l?l?u +?d?l?l?s?l?l?l?l +?u?l?u?d?s?l?u +?u?l?d?s?u?u?u +?s?u?u?u?d?l?l +?d?l?l?l?l?d?l?l?l +?u?l?l?l?l?l?u?d?d +?u?l?d?u?l?l?d?d +?u?d?l?l?u?d?d?l +?d?u?u?u?d?d?u?u +?u?l?d?l?l?u?d?d +?u?u?d?u?u?d?d?u +?d?d?d?u?l?l?u?l +?u?d?l?l?l?d?d?u +?u?d?u?d?u?d?l?l +?u?l?l?u?d?d?d?l +?u?d?u?u?d?d?u?u +?u?d?u?d?d?u?u?u +?l?l?d?l?d?l?d?l?d +?l?d?l?d?l?d?u?u +?u?l?l?d?d?l?d?l +?u?d?d?d?l?l?l?u +?d?u?u?u?d?u?d?u +?l?d?l?l?l?u?d?d +?u?l?d?d?u?l?l?d +?u?u?u?d?d?l?l?d +?u?d?d?d?u?u?l?l +?u?l?l?d?l?d?d?l +?d?u?l?u?l?u?d?d +?l?d?l?l?l?d?l?d?d +?l?u?l?l?u?d?d?d +?u?d?l?l?d?d?u?l +?l?l?d?d?u?l?l?d +?u?u?d?d?u?u?d?u +?u?l?l?l?l?l?l?d?d?d +?d?u?u?u?u?d?d?d?d +?l?d?l?d?d?l?l?d?d +?d?d?l?l?d?d?d?l?l +?l?s?l?l?s?l?d?d +?l?l?d?d?l?l?s?s +?d?d?s?s?l?l?l?l +?u?u?l?l?l?l?l?d?d +?d?d?d?d?u?d?d?d?d?d +?s?l?l?l?d?d?d?d?d +?l?s?l?s?d?s?s +?u?l?l?l?l?l?l?l?d?d +?l?l?l?l?d?d?d?s?s +?u?u?l?u?l?l?u +?l?u?u?l?l?u?l +?l?u?l?u?u?l?u +?l?u?l?u?l?u?u +?u?l?u?u?u?l?u +?u?u?l?l?u?l?u +?u?u?l?u?u?l?l +?u?u?l?l?l?u?l +?l?u?l?l?u?u?l +?l?l?u?u?u?u?l +?l?l?u?l?l?u?u +?u?l?l?l?l?l?d?d?s +?d?l?d?l?d?l?d?l?l +?s?l?d?d?d?d?d?d?s +?d?d?d?d?d?d?d?s?l?l +?s?s?s?s?s?l?d +?l?l?s?s?s?s?s +?u?s?u?s?u?s?d?d +?u?u?u?u?u?l?s +?u?l?u?l?u?s?u +?u?u?u?s?u?l?l +?l?l?s?l?u?l?l +?l?u?u?s?l?u?u +?u?u?l?l?l?s?l +?u?l?s?l?u?l?u +?u?l?l?s?u?u?u +?u?l?s?u?l?u?l +?l?l?u?u?u?u?s +?l?l?d?s?d?d?s?d?d +?l?l?l?l?l?l?d?s?d +?l?l?l?s?s?l?s +?d?d?d?l?l?l?l?l?s +?d?u?l?l?d?l?l?l +?d?u?l?l?l?d?l?l +?d?u?l?u?l?u?l?d +?l?l?l?u?d?d?l?l +?l?l?l?d?l?l?l?u +?l?u?l?d?d?l?l?l +?d?l?l?l?d?l?l?s +?l?l?l?d?d?s?d?d?d +?l?l?l?d?d?d?d?s?d +?l?s?s?l?l?l?d?d +?d?s?d?s?l?l?l?l +?l?l?d?d?l?d?l?d?d +?d?d?d?d?l?l?d?l?l +?u?l?l?s?s?s?s +?s?s?l?s?s?l?l +?l?d?l?d?l?l?l?d?d +?l?l?l?u?u?d?d?d?d +?l?l?d?l?l?d?l?d?d +?l?l?l?l?l?l?s?u +?s?d?s?l?s?l?l +?s?l?s?l?l?d?s +?u?s?l?s?u?s?d +?l?l?s?s?s?d?l +?l?s?s?l?s?l?d +?s?l?l?d?l?s?s +?s?l?l?s?l?s?d +?s?d?s?l?l?l?s +?l?s?s?l?d?l?s +?d?u?l?l?s?s?s +?l?s?l?l?s?s?d +?l?d?s?l?l?s?s +?u?u?u?s?d?s?s +?u?l?l?s?s?s?d +?s?l?d?l?s?l?s +?u?u?d?u?s?s?s +?s?s?l?l?s?l?d +?l?s?l?l?l?l?d?d?d +?d?d?d?d?d?l?l?l?d?d +?s?u?u?u?d?l?l?l +?l?l?l?l?s?l?d?l +?l?l?l?l?s?s?s?s +?l?l?l?l?s?s?l?l +?d?d?d?s?d?d?d?d?u +?d?d?d?l?s?d?d?d?d +?d?d?d?d?d?u?d?d?s +?d?d?d?d?d?d?u?d?s +?l?d?d?d?d?s?d?d?d +?u?u?u?s?d?d?d?d?d +?s?d?d?d?u?l?l?l +?l?d?s?l?l?l?d?d +?l?d?l?s?l?d?l?d +?l?s?l?d?l?l?d?d +?l?d?l?d?l?s?l?d +?l?l?l?u?d?d?d?s +?l?l?d?d?l?l?s?d +?l?l?d?d?s?l?l?d +?s?l?l?l?d?l?d?d +?s?u?l?l?l?s?u +?l?u?u?u?u?s?s +?u?u?l?l?l?l?d?d?d +?u?u?u?u?s?s?d?d +?u?u?u?s?d?l?l?l +?l?l?d?d?d?d?d?d?d?l +?d?u?l?l?u?l?l?l +?d?u?l?l?l?d?d?d?d +?d?l?l?l?d?l?l?l?l +?d?d?d?d?s?s?d?d?d +?d?d?s?s?d?d?d?d?d +?d?d?d?s?d?d?d?s?l +?d?s?d?s?d?d?d?d?d +?l?l?l?l?u?s?d?d +?s?d?l?l?l?l?l?d +?u?u?u?u?s?u?d?d +?d?l?l?l?l?l?d?d?d?d +?u?d?l?d?l?d?d?d?d +?l?d?d?d?d?d?l?d?l +?l?d?d?d?d?d?l?l?d +?d?d?d?d?d?l?d?l?l +?d?d?d?l?l?d?l?d?d +?d?d?l?d?l?d?d?l?d +?d?d?d?l?d?l?d?d?l +?d?l?d?d?d?d?l?l?d +?l?d?d?d?d?d?d?d?l?l +?d?d?l?d?d?l?d?l?d +?d?d?l?d?d?d?d?l?l +?d?d?d?l?d?l?d?l?d +?d?d?l?l?l?u?u?u +?l?l?l?u?l?d?d?l +?u?l?u?u?u?u?d?d +?u?l?l?u?l?u?d?d +?d?d?d?l?l?s?s?s +?l?d?l?d?l?d?d?d?d?d +?u?u?u?l?l?l?l?d?d +?u?u?u?u?u?s?u?u +?d?l?d?d?u?d?d?s +?s?l?d?d?d?d?d?l +?u?d?d?d?s?l?d?d +?s?d?d?d?d?d?u?u +?s?u?d?d?d?d?l?d +?d?l?l?d?d?d?s?d +?u?d?d?d?l?d?d?s +?u?d?d?l?d?s?d?d +?d?d?u?u?d?d?d?s +?d?d?d?d?u?s?d?l +?l?s?d?d?d?d?l?d +?u?d?d?u?s?d?d?d +?u?s?d?d?l?d?d?d +?l?u?d?s?d?d?d?d +?s?d?u?l?d?d?d?d +?l?d?d?d?l?d?s?d +?d?d?d?u?d?l?d?s +?d?d?d?d?u?s?l?d +?d?l?d?l?s?d?d?d +?d?u?l?s?d?d?d?d +?d?d?s?d?d?d?l?u +?d?d?d?l?d?d?s?l +?d?l?d?l?d?d?s?d +?s?d?l?d?d?d?d?u +?u?s?d?u?d?d?d?d +?l?d?d?d?d?s?d?l +?d?d?d?d?u?u?d?s +?l?d?d?d?s?d?l?d +?l?d?d?s?d?d?d?l +?d?l?l?d?d?s?d?d +?l?d?d?d?d?d?s?l +?d?l?u?d?d?d?d?s +?d?d?u?d?l?s?d?d +?u?u?d?d?s?d?d?d +?s?l?d?d?d?d?d?u +?d?d?s?l?d?l?d?d +?d?d?u?l?d?d?d?s +?d?l?s?d?l?d?d?d +?s?d?d?u?l?d?d?d +?d?d?l?s?d?d?d?l +?u?d?u?d?d?d?d?s +?d?u?s?l?d?d?d?d +?d?d?d?d?d?l?u?s +?u?d?d?d?d?u?d?s +?d?d?l?d?d?s?d?l +?u?d?d?d?s?d?d?l +?d?d?u?l?s?d?d?d +?d?d?d?s?l?d?l?d +?d?l?u?s?d?d?d?d +?u?s?d?d?d?d?u?d +?d?s?l?l?d?d?d?d +?u?s?d?l?d?d?d?d +?u?d?d?d?d?l?d?s +?u?s?d?d?d?l?d?d +?d?l?d?d?d?l?s?d +?d?s?d?l?d?l?d?d +?d?l?s?l?d?d?d?d +?l?s?d?d?l?d?d?d +?d?u?d?d?s?d?d?l +?d?l?d?d?l?d?d?s +?d?u?l?d?d?s?d?d +?s?d?d?d?l?l?d?d +?l?d?u?d?d?d?d?s +?d?d?s?d?d?l?d?l +?l?d?d?s?u?d?d?d +?l?d?d?d?d?d?u?s +?d?d?s?d?d?u?d?u +?u?d?s?d?d?d?d?l +?d?d?d?u?l?s?d?d +?d?l?d?d?d?l?d?s +?u?d?d?d?d?d?s?u +?d?l?d?d?l?d?s?d +?u?d?d?d?s?u?d?d +?u?d?s?l?d?d?d?d +?d?d?l?l?d?d?s?d +?d?d?u?s?l?d?d?d +?u?d?d?d?d?s?d?l +?d?l?d?d?u?s?d?d +?l?d?l?d?s?d?d?d +?d?d?d?u?s?d?d?u +?d?d?d?s?d?d?u?l +?d?d?u?d?s?l?d?d +?u?d?d?u?d?s?d?d +?d?d?l?d?d?d?l?s +?s?l?u?d?d?d?d?d +?d?d?d?d?s?d?u?u +?l?d?d?d?s?l?d?d +?d?l?l?u?l?l?l?l +?d?u?u?d?d?d?d?d?d +?d?d?d?d?d?l?d?l?d +?d?l?d?d?d?d?d?l?d +?d?d?d?d?d?d?u?d?u +?l?l?s?s?l?l?l?l +?s?l?l?d?d?l?l?s +?l?s?l?l?l?d?l?l +?u?u?u?u?u?u?s?u +?d?l?l?l?s?u?u?u +?l?l?l?u?u?u?u?u +?u?l?l?d?d?d?u?d +?l?d?d?u?u?u?d?d +?d?d?d?l?d?u?u?l +?l?d?l?d?d?d?l?u +?u?d?u?l?d?d?d?u +?u?l?d?u?u?d?d?d +?l?u?d?u?l?d?d?d +?u?d?d?d?u?u?d?u +?l?l?l?d?d?d?u?d +?l?l?u?d?d?l?d?d +?d?d?l?u?l?l?d?d +?d?u?u?u?d?d?u?d +?d?d?d?l?u?d?l?u +?d?d?u?u?d?u?u?d +?l?l?d?d?l?u?d?d +?u?d?d?d?u?l?u?d +?u?d?u?d?u?l?d?d +?u?d?u?d?l?l?d?d +?d?d?l?l?d?l?u?d +?d?d?l?l?l?d?d?u +?u?d?d?d?l?l?u?d +?u?d?d?d?u?l?l?d +?d?d?d?l?u?l?l?d +?d?l?d?d?d?u?u?u +?u?u?d?d?l?u?d?d +?d?d?u?d?l?l?l?d +?u?u?d?d?l?d?l?d +?u?d?l?u?l?d?d?d +?l?l?d?u?d?d?d?l +?d?l?u?l?l?d?d?d +?l?l?d?d?d?u?u?d +?u?l?l?d?d?d?l?d +?u?d?d?l?d?u?l?d +?l?l?u?d?d?d?d?l +?l?d?d?l?d?d?u?u +?d?d?l?u?d?d?l?u +?u?l?d?l?u?d?d?d +?d?d?d?u?l?l?d?l +?l?l?d?d?d?u?d?l +?l?d?l?u?d?l?d?d +?l?d?l?d?d?l?d?u +?l?l?d?d?d?l?d?u +?l?u?l?d?d?d?d?l +?u?l?u?d?l?d?d?d +?l?d?d?u?l?l?d?d +?d?d?d?d?l?d?l?l?l +?d?u?u?d?d?u?d?u +?u?u?u?d?l?d?d?d +?d?l?l?u?u?d?d?d +?d?u?d?u?u?d?d?u +?d?d?d?d?l?l?l?d?l +?u?l?d?d?l?d?d?u +?l?d?d?d?d?l?u?u +?d?u?l?l?u?d?d?d +?l?d?d?l?u?d?d?l +?u?d?u?l?d?l?d?d +?u?d?d?u?l?d?d?l +?l?u?l?d?l?d?d?d +?d?d?u?d?u?d?u?u +?d?d?u?u?d?u?d?u +?d?u?u?d?d?d?l?l +?d?u?d?d?u?u?u?d +?d?d?d?l?l?l?u?d +?l?d?l?d?d?l?u?d +?u?d?l?l?d?d?u?d +?u?d?d?u?l?u?d?d +?u?d?l?d?u?d?d?l +?l?u?d?l?d?u?d?d +?d?u?l?d?d?d?l?l +?d?u?l?u?d?l?d?d +?l?d?d?l?d?l?l?d?d +?d?u?l?d?d?l?d?l +?l?u?l?d?d?l?d?d +?d?l?d?d?l?d?l?u +?d?l?l?l?u?d?d?d +?u?u?d?d?u?d?l?d +?l?d?u?l?d?l?d?d +?u?d?d?l?u?d?l?d +?d?d?l?u?u?l?d?d +?u?d?d?d?l?d?l?u +?u?d?d?l?d?u?d?u +?u?u?d?u?d?d?d?l +?u?d?l?d?d?l?u?d +?u?l?d?d?u?d?l?d +?d?d?u?u?u?d?d?l +?l?u?l?d?d?d?d?u +?d?d?l?l?d?d?u?l +?d?d?u?d?l?d?l?l +?d?d?u?l?d?l?l?d +?u?s?u?u?u?u?u?u +?d?u?l?l?l?u?l?l +?l?s?l?l?d?l?l?d +?l?l?d?l?d?l?l?s +?l?s?s?l?s?l?s +?l?s?s?l?l?s?s +?l?d?s?l?l?l?l?l +?s?s?d?d?d?d?d?d?d?d +?d?d?l?l?l?l?l?l?l?l +?l?l?l?l?d?d?d?d?u +?u?u?u?d?d?d?d?u?u +?s?d?d?s?d?d?s?l +?l?l?s?l?s?s?l +?s?l?s?l?s?l?l +?s?u?l?l?l?s?s +?s?u?u?s?u?u?s +?l?l?s?s?l?s?l +?s?l?l?s?s?l?l +?u?u?u?u?u?u?l?d +?l?l?d?l?l?l?l?u +?s?u?l?l?l?d?d?s +?l?l?l?s?s?l?d?d +?l?l?d?u?u?u?d?d +?d?u?l?l?d?l?l?d +?u?l?d?d?d?u?l?u +?u?d?d?u?l?l?l?d +?u?l?l?u?u?l?d?d +?d?d?d?l?l?u?l?l +?l?l?l?l?u?d?d?l +?d?d?u?u?d?u?u?u +?l?u?u?u?u?l?d?d +?d?l?l?l?l?l?u?d +?u?d?u?d?l?l?l?l +?d?u?d?l?l?d?l?l +?d?u?d?l?l?l?l?l +?u?l?l?u?d?d?d?u +?l?l?u?d?d?l?l?l +?u?d?l?d?l?u?d?l +?d?l?l?d?d?u?u?u +?u?l?l?d?u?u?d?d +?l?d?l?l?l?d?d?u +?u?l?l?l?d?u?d?d +?u?d?u?u?l?l?d?d +?u?d?l?l?u?l?d?d +?d?d?l?u?u?u?u?u +?d?u?l?d?l?l?l?d +?l?l?l?l?d?u?d?d +?u?d?l?d?u?l?l?d +?u?d?l?l?d?d?u?u +?l?l?l?l?l?d?d?l?d +?d?l?l?l?u?u?d?d +?u?l?d?u?l?d?u?d +?l?l?l?d?u?u?d?d +?l?d?l?d?l?d?l?l?l +?l?u?u?l?u?u?d?d +?u?u?u?d?u?d?d?u +?u?l?u?d?d?d?l?l +?d?u?d?u?u?u?d?u +?u?d?d?u?d?l?l?l +?d?l?l?u?l?l?d?d +?s?l?l?l?l?l?l?d?d +?u?l?l?l?l?s?l?l +?l?l?l?l?l?d?d?s?s +?d?s?d?d?s?l?l?l +?s?s?s?s?s?l?l +?d?d?l?l?l?d?d?d?l +?u?u?d?d?d?d?d?u?u +?l?d?d?d?d?d?d?l?d?d +?l?d?d?l?d?d?l?d?d?l +?l?d?l?l?l?l?l?l?d +?l?l?l?s?s?d?d?d?d +?u?s?u?d?l?l?l?l +?u?s?s?s?l?d?d +?s?d?s?d?s?u?l +?s?d?l?u?s?s?d +?u?s?s?l?s?d?d +?d?s?l?s?l?d?s +?l?d?s?s?d?s?l +?d?d?l?s?l?s?s +?l?l?s?d?s?d?s +?s?d?d?s?u?u?s +?s?s?s?d?d?l?u +?l?d?s?d?l?s?s +?d?s?l?l?d?s?s +?d?s?d?l?s?l?s +?s?l?s?d?d?u?s +?d?d?s?s?l?l?s +?l?s?s?s?l?d?d +?s?u?u?s?s?d?d +?l?u?s?s?s?d?d +?l?s?s?s?d?l?d +?l?d?s?s?s?d?l +?u?l?s?s?s?d?d +?s?s?u?u?d?d?s +?s?u?d?u?d?s?s +?u?d?s?s?d?s?u +?d?s?s?d?s?u?u +?u?s?l?s?s?d?d +?d?d?s?u?s?l?s +?s?l?d?s?s?d?l +?s?l?d?s?l?s?d +?s?s?s?u?u?d?d +?l?s?s?d?s?d?l +?s?s?l?d?l?d?s +?s?s?d?l?d?l?s +?l?s?d?l?s?d?s +?l?s?d?s?d?l?s +?d?d?s?l?l?s?s +?l?s?d?s?l?d?s +?s?u?s?l?s?d?d +?l?s?s?l?d?s?d +?s?u?l?d?d?s?s +?l?s?d?d?s?s?l +?s?l?s?s?d?l?d +?l?s?s?s?d?d?l +?u?u?s?s?s?d?d +?s?l?d?l?d?s?s +?s?s?l?d?l?s?d +?l?d?d?s?s?l?s +?l?s?l?d?s?s?d +?s?l?l?s?d?s?d +?d?s?d?l?l?s?s +?l?d?s?s?l?d?s +?d?l?l?s?d?s?s +?s?s?u?u?s?d?d +?s?d?d?s?l?s?l +?d?s?u?s?d?u?s +?d?d?u?u?s?s?s +?s?d?d?s?l?s?u +?l?d?s?d?s?l?s +?s?s?l?d?d?l?s +?s?s?l?l?d?d?s +?u?l?s?d?s?s?d +?s?d?l?s?l?d?s +?d?s?u?s?d?s?u +?s?l?s?l?d?d?s +?u?s?u?s?s?d?d +?s?s?d?s?l?d?u +?s?l?d?s?d?l?s +?s?u?u?s?d?d?s +?s?d?d?l?s?s?l +?s?s?s?d?l?d?l +?u?s?u?d?s?s?d +?u?s?d?s?d?s?u +?d?s?d?s?s?l?l +?d?s?l?l?s?d?s +?s?d?d?s?s?l?u +?u?l?l?l?l?d?u?l +?l?l?l?u?u?u?u?d +?l?l?d?l?l?l?d?s +?d?d?u?u?u?u?u?s +?l?l?l?s?l?d?l?d +?d?d?l?l?l?l?s?l +?d?d?d?d?d?d?d?d?s?u +?u?s?s?l?d?d?d?d +?l?d?d?d?l?d?s?s +?l?s?l?s?l?d?d?d?d +?d?d?d?d?l?s?s?l +?d?d?s?d?d?l?l?s +?l?l?d?s?d?d?s?d +?l?s?u?s?d?d?d?d +?s?l?d?d?s?l?d?d +?d?d?u?l?s?s?d?d +?d?d?d?d?d?s?d?d?d?d?d +?l?l?d?d?s?l?l?d?d +?l?l?s?l?l?l?l?d?d +?d?d?d?l?l?d?d?d?s +?d?d?d?l?s?l?d?d?d +?d?d?d?d?s?d?d?l?l +?l?d?l?l?l?l?s?l +?l?s?l?l?l?l?d?l +?s?l?d?l?l?s?l +?u?s?d?u?u?u?s +?s?l?s?l?l?d?l +?u?l?l?s?u?s?d +?u?l?s?l?l?d?s +?u?u?u?d?s?s?u +?l?s?d?s?l?l?l +?u?l?l?s?l?d?s +?s?u?l?d?l?l?s +?s?d?u?l?l?l?s +?d?l?l?s?l?s?l +?u?l?s?d?u?l?s +?u?l?l?s?d?s?l +?u?s?d?s?l?u?l +?u?d?u?s?u?s?u +?d?l?s?s?l?l?l +?s?d?u?l?l?s?l +?u?u?s?s?u?u?d +?u?u?s?l?s?l?d +?u?s?u?s?u?l?d +?u?s?u?u?s?d?l +?s?u?s?d?l?l?l +?s?u?l?l?d?l?s +?u?s?l?l?d?l?s +?u?s?l?s?l?u?d +?u?l?d?l?l?s?s +?u?l?u?l?s?d?s +?s?l?d?s?l?l?l +?u?s?l?d?l?l?s +?u?u?u?d?u?s?s +?u?u?s?s?l?l?d +?u?l?l?l?s?d?d?s +?l?d?u?l?l?s?s +?u?s?l?l?l?d?s +?s?d?s?l?l?u?l +?u?u?s?l?l?s?d +?s?l?s?d?l?l?l +?d?l?s?l?l?s?l +?d?d?d?d?d?d?s?d?d?d?d +?u?l?d?u?l?l?l?l +?d?d?l?d?l?l?d?d?d +?u?u?d?d?u?d?d?d?d +?u?d?u?d?u?d?d?d?d +?d?d?d?l?l?d?d?d?l +?u?d?d?l?l?d?d?d?d +?l?d?d?d?l?d?d?l?d +?d?l?d?l?d?d?d?d?l +?l?d?d?d?l?d?l?d?d +?u?l?d?d?l?d?d?d?d +?l?d?d?l?d?d?d?l?d +?l?l?d?s?d?d?l?l +?l?d?l?l?d?d?l?s +?u?d?l?l?l?s?d?d +?u?d?u?d?u?d?u?s +?u?l?l?d?d?d?d?d?s +?d?d?l?d?l?l?l?d?d +?l?l?l?u?l?u?s +?u?l?u?l?u?s?l +?u?l?u?l?l?u?s +?l?u?s?l?l?l?l +?l?l?u?u?l?s?l +?u?l?s?u?l?l?u +?u?l?u?u?l?l?s +?l?s?u?l?l?l?l +?u?s?u?u?l?l?l +?s?l?u?l?l?l?l +?l?d?l?l?s?l?l?l +?s?l?l?l?l?u?u +?s?u?u?l?l?l?l +?l?s?l?l?l?l?u +?u?u?u?s?l?l?l?d +?u?l?s?l?l?l?l?d +?u?u?s?u?u?l?l +?u?l?s?u?u?u?u +?s?d?d?d?d?d?d?s?s +?d?s?d?d?s?d?d?s?d +?d?l?l?l?l?l?d?u +?u?u?l?u?u?l?d?d +?d?s?s?s?s?s?s +?s?s?l?l?l?l?u +?u?s?u?u?s?u?u +?l?u?l?u?l?s?s +?s?u?s?u?u?u?u +?l?s?l?s?l?l?u +?d?u?u?l?l?l?l?l +?u?u?u?u?u?s?d?d?d +?u?l?l?l?l?l?s?l +?d?d?d?d?d?d?d?u?d?d +?l?s?l?l?s?s?s +?u?s?u?s?u?s?s +?l?l?d?s?l?l?l?d +?l?l?l?s?l?d?l?l +?l?l?l?l?d?s?l?l +?s?u?u?u?u?u?d?d +?d?l?l?d?l?l?l?s +?u?l?l?l?s?l?l?d +?s?d?d?s?l?l?l?l +?d?s?d?s?d?s?d?s?d +?l?d?d?l?l?l?d?d?l +?u?u?u?d?d?d?u?u?u +?d?l?l?l?d?l?l?l?d +?l?d?l?l?l?l?d?l?l +?l?l?l?l?s?s?s?d +?l?l?l?l?l?l?d?d?d?d?d +?l?l?l?s?d?d?d?d?s +?u?l?l?l?l?d?d?d?s +?l?l?d?l?l?l?l?l?d +?l?s?l?s?s?s?d +?l?l?s?s?s?d?s +?s?l?s?l?s?d?s +?d?s?l?s?s?l?s +?l?d?l?s?s?s?s +?l?u?u?u?l?l?u +?l?u?l?u?l?u?l?u +?l?u?u?u?l?u?l +?l?u?u?l?l?u?u +?u?l?u?u?u?u?l +?l?u?u?u?u?l?u +?l?l?l?u?u?l?u +?u?u?u?l?u?l?l +?l?u?u?l?l?l?u +?u?u?l?u?u?l?u +?u?l?l?u?l?l?s?d +?u?l?l?u?d?d?d?d?d +?d?d?u?u?u?u?d?d?d +?d?d?l?l?l?l?d?d?s +?l?d?d?l?d?d?l?l?l +?l?l?l?l?d?d?d?l?d +?u?l?l?l?l?l?s?u +?d?d?d?d?d?d?d?d?s?d?d +?s?d?d?d?s?d?d?d?d +?d?d?d?d?s?d?d?d?s +?d?d?s?d?d?d?d?s?d +?d?d?d?s?d?s?d?d?d +?l?s?s?l?l?d?d?d +?u?u?u?s?d?s?d?d +?u?u?u?s?s?d?d?d +?d?d?s?l?l?l?d?s +?u?l?l?s?s?d?d?d +?l?l?d?d?l?l?d?d?d?d +?l?s?l?l?s?s?l +?u?u?l?l?s?s?s +?u?s?l?l?l?s?s +?s?s?s?l?l?l?d?d +?d?d?l?l?l?d?d?d?d?d +?s?d?d?d?s?d?d?d?s +?d?d?s?l?l?l?l?s +?u?d?u?l?l?l?l?l +?u?l?u?d?l?l?l?l +?l?d?l?l?l?l?l?u +?l?l?l?l?l?d?d?d?d?s +?u?l?u?l?u?l?u?d?d +?d?d?d?d?d?d?s?u?l +?d?d?l?d?d?l?d?d?s +?d?d?d?d?l?l?s?d?d +?u?u?u?u?d?u?u?u?u +?l?l?l?d?l?l?d?s +?u?l?d?d?l?l?l?s +?l?s?l?l?d?l?d?l +?l?d?d?l?s?l?l?l +?l?d?l?l?l?l?s?d +?u?u?s?l?l?l?d?d +?l?d?l?d?l?s?l?l +?u?u?l?l?l?d?d?s +?l?d?d?d?d?d?d?d?d?d?l +?l?u?l?l?l?u?d?d +?l?l?d?d?u?u?u?u +?d?d?u?l?u?l?l?l +?l?u?l?d?d?l?u?l +?l?d?l?d?l?l?l?l?l +?l?l?d?d?l?l?u?u +?u?l?u?d?u?l?u?d +?l?l?d?d?u?u?l?l +?d?l?l?l?d?l?l?u +?l?l?l?l?l?d?u?d +?l?l?l?l?l?u?d?d?d +?u?u?l?l?u?l?d?d +?s?d?d?d?s?d?d?l +?d?d?d?d?d?s?u?s +?u?d?s?s?d?d?d?d +?d?d?s?d?l?s?d?d +?d?d?d?d?s?u?s?d +?d?s?d?d?s?l?d?d +?d?d?s?l?s?d?d?d +?d?l?s?d?d?s?d?d +?d?d?s?d?d?d?s?l +?d?d?d?d?s?l?s?d +?d?l?d?d?s?s?d?d +?l?s?d?d?d?d?s?d +?d?d?d?d?s?d?s?u +?d?d?d?d?s?s?l?d +?s?d?d?s?d?d?d?l +?u?s?d?d?d?d?d?s +?d?s?d?d?l?d?d?s +?s?d?d?d?d?s?d?l +?s?l?d?d?d?s?d?d +?d?d?d?d?s?u?d?s +?s?d?d?d?s?d?d?u +?d?d?d?l?s?s?d?d +?d?s?d?s?u?d?d?d +?s?d?d?s?d?l?d?d +?d?l?s?s?d?d?d?d +?s?u?d?d?d?d?d?s +?d?l?s?d?d?d?s?d +?s?d?d?d?s?l?d?d +?d?d?s?s?d?d?d?l +?u?s?d?d?s?d?d?d +?d?d?u?d?d?d?s?s +?d?s?l?s?d?d?d?d +?d?d?d?s?l?s?d?d +?u?d?s?d?d?d?d?s +?d?s?u?s?d?d?d?d +?d?s?d?d?l?s?d?d +?u?s?s?d?d?d?d?d +?s?d?d?d?d?s?l?d +?d?l?d?d?d?d?s?s +?d?u?s?s?d?d?d?d +?d?s?d?s?d?d?d?l +?s?s?d?d?d?d?l?d +?s?d?d?d?l?d?d?s +?d?l?l?l?l?l?s?l +?l?l?l?l?l?d?s?l +?d?l?s?l?l?l?l?l +?d?l?l?d?l?l?d?l?l +?l?s?l?l?l?l?l?d?d +?d?d?d?d?d?d?l?l?l?l?l +?d?d?l?l?d?d?l?l?d +?d?l?l?d?d?l?l?d?d +?d?l?d?l?d?l?d?d?l +?d?d?d?d?u?u?u?u?d +?l?d?d?l?d?d?l?l?d +?d?d?l?d?d?d?l?l?l +?d?d?d?d?d?d?l?s?d +?d?d?s?d?d?d?d?d?l +?s?d?d?d?d?d?d?d?u +?d?d?d?l?d?d?d?d?s +?d?d?l?d?d?d?d?d?s +?u?d?d?s?d?d?d?d?d +?d?d?l?d?d?s?d?d?d +?d?d?d?d?s?d?d?d?d?l +?d?l?d?s?d?d?d?d?d +?u?u?u?u?u?u?u?l +?u?l?l?l?u?u?u?d +?l?l?l?l?s?l?s?l +?d?d?d?d?d?u?d?d?d?d +?d?l?l?l?l?d?l?d?d +?d?l?d?l?l?d?d?s +?u?u?d?d?d?d?l?s +?d?d?u?s?d?d?u?u +?u?d?l?d?d?l?d?s +?d?s?l?l?d?d?l?d +?d?d?d?d?l?u?u?s +?u?s?d?d?u?u?d?d +?u?d?d?l?d?d?u?s +?d?d?s?l?l?d?l?d +?d?d?l?l?d?d?s?l +?u?u?u?d?d?d?s?d +?s?l?l?d?d?d?d?l +?d?s?d?d?d?u?u?u +?d?d?l?s?l?u?d?d +?d?d?d?d?u?l?s?l +?d?l?l?s?d?d?d?l +?u?u?u?d?s?d?d?d +?d?d?u?l?d?d?l?s +?u?d?d?s?d?d?l?l +?l?d?d?s?l?l?d?d +?d?l?l?d?d?d?l?s +?l?s?l?l?d?d?d?d?d +?u?l?d?d?d?d?s?l +?u?l?d?d?l?s?d?d +?s?u?l?u?d?d?d?d +?u?u?s?d?d?d?d?u +?d?l?d?s?l?l?d?d +?u?d?l?d?l?s?d?d +?d?d?u?d?d?u?u?s +?d?d?u?d?l?l?s?d +?s?d?u?u?d?l?d?d +?l?d?l?d?s?d?l?d +?d?d?u?s?l?l?d?d +?u?d?d?l?l?d?d?s +?u?d?u?d?d?u?d?s +?u?l?l?d?d?d?s?d +?l?s?u?l?d?d?d?d +?u?s?u?l?d?d?d?d +?d?u?u?u?d?d?d?s +?u?s?d?d?d?d?u?u +?d?d?d?l?l?s?l?d +?d?d?d?d?l?l?s?u +?d?d?d?d?u?l?u?s +?d?d?d?l?s?l?d?l +?l?d?l?d?s?l?d?d +?u?d?d?u?u?d?d?s +?d?d?d?d?s?l?l?u +?d?d?l?d?d?l?s?l +?l?d?d?d?d?s?u?u +?l?l?d?d?s?d?d?l +?d?d?l?l?l?d?s?d +?d?l?d?s?d?l?d?l +?s?l?l?d?l?d?d?d +?u?l?d?d?d?d?l?s +?d?d?d?s?d?u?u?u +?d?u?d?u?d?u?d?s +?u?d?d?u?d?d?s?l +?l?l?d?l?d?d?d?s +?s?d?d?u?l?l?d?d +?d?l?s?l?l?d?d?d +?l?d?d?l?d?d?s?l +?u?u?d?d?d?d?s?l +?l?d?d?d?l?s?l?d +?s?l?d?d?d?l?l?d +?l?d?d?l?l?d?s?d +?l?d?l?l?l?s?l?l +?u?l?l?d?l?l?l?s +?s?u?u?u?l?l?l?d +?u?u?s?u?u?u?u?d +?u?l?l?l?l?s?s?s +?s?l?d?l?l?d?l?s +?d?l?d?l?d?d?l?d?d +?l?d?d?d?d?l?d?l?d +?u?d?d?d?u?d?d?d?u +?u?d?u?u?d?d?d?d?d +?l?d?d?d?d?d?d?u?u +?d?d?d?d?u?l?u?d?d +?u?d?l?d?u?d?d?d?d +?l?d?l?d?d?d?l?d?d +?d?d?l?l?d?l?d?d?d +?l?s?l?s?l?s?l?d +?d?d?d?d?d?d?d?l?d?l +?u?l?u?l?d?d?d?d?d?d +?d?d?s?d?d?s?s?s +?l?d?d?u?u?u?d?l +?d?d?d?u?l?u?u?l +?l?d?d?d?l?l?u?l +?u?l?d?d?l?u?l?d +?d?d?l?l?u?u?d?l +?d?d?d?l?u?l?l?l +?l?d?d?l?d?l?l?u +?l?u?l?d?l?l?d?d +?l?u?l?u?u?d?d?d +?l?u?l?d?d?d?l?l +?u?d?d?u?u?u?d?u +?d?u?d?u?u?d?u?u +?d?u?d?d?l?l?l?l +?l?d?l?u?u?l?d?d +?l?l?d?d?d?u?u?l +?s?l?l?l?l?l?d?d?d +?d?l?l?l?l?d?d?u +?u?l?d?u?l?d?d?l +?l?d?l?d?u?l?d?l +?l?l?d?l?l?u?d?d +?u?l?l?d?d?u?l?d +?d?l?l?d?l?l?d?u +?u?u?u?l?d?l?d?d +?d?d?d?u?l?u?l?l +?u?l?d?d?l?d?l?u +?d?d?u?u?u?d?u?u +?d?u?l?l?d?d?l?l +?d?l?d?d?u?l?l?l +?l?l?d?l?l?d?u?d +?d?l?d?l?l?l?d?u +?l?l?l?d?d?u?u?d +?l?l?d?u?l?l?d?d +?l?d?u?l?d?u?l?d +?u?l?d?d?l?l?u?d +?l?l?d?d?d?d?d?d?d?s +?l?l?l?d?u?u?u?u +?s?u?s?l?s?u?s +?s?s?s?l?l?l?s +?s?l?l?l?s?s?s +?s?u?l?l?l?l?l?l +?s?u?u?u?u?u?u?u +?s?d?d?d?u?u?u?u +?l?d?l?d?l?d?s?l +?u?l?u?l?u?d?d?s +?l?l?d?d?l?d?l?s +?u?d?l?l?d?d?l?s +?u?l?s?u?l?l?d?d +?d?l?l?d?d?l?l?s +?u?s?d?l?l?l?d?d +?l?d?l?d?d?l?l?s +?l?l?l?l?d?l?s?d +?l?l?d?l?d?d?l?s +?l?d?l?l?d?d?s?l +?l?d?l?l?l?d?d?s +?d?d?l?l?l?d?l?s +?u?d?l?d?l?d?l?s +?l?d?l?l?s?l?l?d +?l?d?d?l?l?l?s?d +?d?s?d?l?l?l?l?d +?l?d?l?l?d?s?l?d +?l?l?s?u?u?d?d?d +?l?l?l?l?d?s?d?l +?s?l?l?d?d?l?l?l +?s?l?l?d?l?l?d?d +?u?s?l?l?l?d?d?d?d +?l?l?d?l?l?d?l?l?l +?u?l?l?d?l?d?d?d?d +?d?l?d?l?l?l?d?d?d +?l?l?d?d?l?d?d?l?d +?l?l?l?u?d?d?d?d?d +?l?l?d?l?d?d?l?d?d +?d?l?l?d?l?l?d?d?d +?u?s?s?s?s?s?s +?l?l?l?d?d?d?d?d?d?l +?l?d?d?d?d?d?l?d?d?d +?d?d?s?l?l?l?l?l?l +?u?s?u?l?l?l?l?l +?s?d?s?s?d?s?l +?l?s?d?s?s?d?s +?u?d?d?s?s?s?s +?s?l?s?d?s?d?s +?s?s?l?s?d?d?s +?s?d?s?s?l?d?s +?l?s?s?s?d?s?d +?d?d?l?s?s?s?s +?d?l?s?s?s?s?d +?s?d?d?s?u?s?s +?d?d?s?s?s?u?s +?l?d?s?s?d?s?s +?s?s?s?l?s?d?d +?u?s?s?s?s?d?d +?s?l?s?d?s?s?d +?l?d?s?s?s?s?d +?l?s?d?d?s?s?s +?d?s?d?s?s?s?l +?l?s?s?d?d?s?s +?s?d?d?s?s?s?l +?s?d?d?s?s?s?u +?s?s?d?s?l?s?d +?s?s?d?d?u?s?s +?s?l?s?d?d?s?s +?s?l?d?d?s?s?s +?s?d?s?d?s?l?s +?s?s?u?s?s?d?d +?s?d?s?l?s?s?d +?l?s?d?s?s?s?d +?s?l?s?s?s?d?d +?s?d?l?d?s?s?s +?l?l?s?l?l?l?l?l?l +?d?u?u?l?l?u?l +?l?u?u?u?d?l?u +?l?l?u?d?u?l?u +?l?u?l?l?u?d?l +?u?d?l?l?u?l?u +?d?u?l?u?u?l?u +?u?u?l?l?d?l?u +?d?l?u?u?l?l?u +?l?l?d?d?l?l?u?l +?l?l?u?l?d?d?l?l +?u?d?u?u?l?l?u +?u?u?u?l?u?d?l +?u?d?l?u?d?l?l?l +?d?l?u?u?u?l?l +?u?d?u?u?u?l?l +?u?u?u?l?d?l?u +?u?l?u?d?l?l?u +?d?u?u?u?l?u?u +?d?u?u?u?l?u?l +?u?d?u?l?u?u?u +?u?d?u?l?u?u?l +?u?d?u?u?l?u?l +?l?u?u?u?l?u?d +?l?u?l?l?d?u?l +?l?u?l?l?d?u?u +?l?u?u?l?l?u?d +?l?u?d?l?u?u?l +?l?l?u?u?d?u?u +?l?d?u?u?l?u?u +?u?l?u?u?d?l?u +?d?l?u?u?l?u?u +?u?l?d?u?u?l?l +?l?u?l?u?d?l?u +?u?l?d?l?l?l?l?s +?u?l?l?l?l?d?l?s +?u?l?l?l?u?d?l?l +?l?u?l?d?l?l?u +?u?l?u?u?l?d?l +?l?u?l?u?u?l?d +?l?u?u?l?d?u?l +?l?u?u?l?d?u?u +?l?d?u?u?u?u?l +?l?u?u?u?l?d?l +?l?l?u?d?d?l?l?u +?u?l?l?u?d?u?l +?u?l?d?l?u?u?l +?l?l?u?l?d?l?u +?u?d?l?u?u?u?l +?u?d?l?l?l?u?u +?l?l?u?l?d?u?l +?d?l?l?u?u?l?u +?u?u?l?u?u?d?u +?u?u?d?d?l?l?u?u +?u?d?u?l?u?l?l +?l?u?u?u?d?l?l +?l?d?d?l?l?u?l?l +?u?u?d?l?u?u?l +?u?u?l?l?u?d?l +?u?l?l?l?l?d?u?d +?u?d?u?l?l?u?l +?u?d?u?l?l?u?u +?d?u?u?l?l?u?u +?u?d?l?u?l?u?l +?d?l?l?l?u?l?u +?l?l?l?l?d?l?l?u +?l?u?u?d?u?u?l +?l?u?d?l?l?l?u +?l?u?l?d?u?u?l +?l?d?d?l?l?l?l?u +?l?l?u?u?u?d?u +?l?u?l?l?d?d?l?l +?l?l?u?l?u?d?l +?d?l?u?u?l?u?l +?u?u?d?u?l?u?u +?l?u?d?l?l?u?u +?d?u?u?l?u?u?u +?l?l?l?u?d?l?u +?l?d?u?l?u?u?l +?l?l?d?l?u?l?u +?u?u?l?d?u?u?l +?d?l?l?d?l?l?l?u +?u?l?l?u?d?l?u +?l?u?u?l?u?d?u +?l?u?u?l?u?d?l +?u?l?l?u?l?d?u +?u?u?u?d?u?l?l?l +?l?u?l?u?l?u?l?d +?l?d?u?u?l?l?u +?l?u?d?u?l?l?l +?d?l?u?l?u?u?u +?l?l?l?d?u?u?u?d +?u?d?u?l?l?l?u +?u?d?l?u?u?u?u +?u?u?l?u?l?d?u +?l?d?u?l?l?l?u +?l?l?u?d?u?u?u +?l?u?u?d?l?l?u +?l?l?u?d?u?u?l +?u?u?d?l?l?l?u +?d?u?l?l?u?u?l +?l?u?u?l?d?l?u +?l?l?u?u?d?d?s?s +?d?d?d?d?s?d?d?d?d?s +?l?d?l?l?l?l?l?d?l +?s?s?s?l?d?d?d?d +?l?s?d?d?s?d?d?s +?l?d?s?d?s?d?s?d +?l?s?d?d?d?d?d?d?s +?s?d?d?d?d?d?d?l?s +?s?d?d?d?d?d?d?s?l +?l?l?l?s?l?l?s?d +?l?l?l?l?s?l?s?d +?l?l?l?s?s?d?s +?d?u?s?u?s?u?s +?s?l?s?d?s?l?l +?s?l?d?l?l?s?s +?s?s?l?d?l?l?s +?l?s?d?l?s?l?s +?l?d?s?s?s?l?l +?s?l?s?d?l?s?l +?s?s?l?d?s?l?l +?u?u?u?d?s?s?s +?d?s?l?l?l?s?s +?l?s?d?s?l?l?s +?u?s?l?s?l?s?d +?d?s?l?l?s?s?l +?l?s?s?s?l?d?l +?l?l?s?d?s?l?s +?l?s?s?s?d?l?l +?s?l?d?s?l?l?s +?u?s?u?s?d?s?u +?l?s?s?d?s?l?l +?l?s?d?l?l?s?s +?l?l?s?s?s?l?d +?u?s?s?s?u?u?d +?l?d?s?l?s?l?s +?s?l?l?s?d?s?l +?d?u?s?s?u?u?s +?u?d?l?s?l?s?s +?u?l?l?d?s?s?s +?l?d?l?s?l?s?s +?l?d?s?s?l?l?s +?s?l?l?s?d?l?s +?s?l?s?s?d?l?l +?l?l?s?s?d?s?l +?s?s?s?l?d?l?l +?s?l?s?d?l?l?s +?s?d?l?l?s?l?s +?s?s?l?l?l?d?s +?l?l?s?l?d?l?l?l +?l?d?d?d?l?d?d?d?s +?u?l?l?s?d?d?d?s +?s?u?u?u?s?d?d?d +?d?d?d?l?s?l?s?l +?u?l?l?d?d?s?s?d +?l?s?l?d?l?s?d?d +?u?u?u?s?d?d?d?s +?l?s?s?l?l?l?l?l +?d?d?l?l?l?l?s?d?d +?u?d?u?d?u?d?u?d?u +?d?d?l?d?d?l?l?l?l +?l?d?l?d?l?l?d?d?l +?d?l?l?l?l?u?l?l +?l?u?d?d?d?d?d?d?d?d +?d?l?l?d?d?d?d?d?d?d +?u?l?l?l?u?l?l?s +?u?u?s?u?u?u?s +?d?l?l?l?l?l?s?s +?u?l?s?l?l?s?l +?u?l?s?u?l?l?s +?u?l?u?l?s?l?s +?u?l?l?u?l?s?s +?u?l?u?l?l?s?s +?s?l?l?l?l?u?s +?l?s?u?l?l?s?l +?s?u?u?l?l?l?s +?l?l?s?l?s?l?u +?s?l?s?l?l?l?u +?l?d?l?l?d?l?l?l?d +?d?l?d?d?d?d?l?l?l +?d?l?l?d?l?d?l?d?d +?l?s?l?l?l?s?l?l +?s?d?d?u?l?l?l?l +?l?l?l?d?l?l?s?d +?l?s?l?l?d?d?l?l +?u?u?d?d?s?u?u?u +?l?d?l?l?d?l?s?l +?l?l?l?d?l?d?l?s +?d?d?s?d?d?l?l?l?l +?u?s?l?l?s?l?s +?u?s?u?s?u?u?s +?u?s?u?u?s?u?s +?l?s?l?s?s?l?l +?s?l?s?l?l?s?l +?l?s?l?s?l?s?u +?s?l?s?s?l?l?l +?u?s?s?s?l?l?l +?s?s?s?u?l?l?l +?s?s?l?l?s?l?l +?l?l?l?l?l?l?s?d?d?d +?l?l?s?l?l?d?l?l +?l?s?l?l?d?l?l?l +?u?d?l?l?l?l?l?s +?u?d?d?d?d?d?d?d?d?s +?s?l?l?l?s?d?d?d?d +?l?u?l?u?l?d?d?d?d +?l?s?l?s?s?s?s +?u?l?u?l?d?d?s?s +?u?l?l?l?u?l?l?l?d +?s?s?l?l?d?d?s?s +?l?u?d?l?l?l?l?l +?u?l?u?l?u?l?l?d +?d?u?u?u?l?l?l?l +?s?s?s?u?s?s?s +?s?s?s?s?s?s?u +?d?d?d?d?l?l?l?d?d?d?d +?d?l?u?d?d?d?d?d?d +?d?l?d?d?d?d?d?d?u +?d?l?d?d?d?d?d?d?l +?u?d?d?d?d?d?d?l?d +?d?u?d?d?d?d?d?d?l +?d?d?d?d?d?l?u?d?d +?d?d?d?d?u?d?d?d?u +?u?l?u?d?d?d?d?d?d?d +?d?d?d?d?d?u?d?u?d +?u?d?d?d?d?d?l?d?d +?d?d?u?l?d?d?d?d?d +?d?d?u?d?u?d?d?d?d +?d?d?u?d?l?d?d?d?d +?s?s?s?s?s?d?l +?u?d?l?d?l?d?l?d?l +?l?u?l?s?l?l?l +?l?l?u?s?u?l?l +?u?l?l?u?u?l?s +?u?l?u?s?u?l?l +?l?s?l?l?u?l?l +?l?l?u?s?l?l?u +?u?s?l?u?l?l?l +?l?u?u?l?l?l?s +?s?l?l?u?u?u?u +?u?l?u?l?u?u?s +?u?s?l?l?l?l?u +?u?l?l?s?u?l?l?d +?u?l?s?l?u?l?l +?u?l?l?l?l?s?l?d +?u?l?u?l?l?s?l +?l?l?s?l?l?u?l +?u?l?u?l?s?u?l +?u?u?l?s?l?l?l +?d?l?l?l?s?d?d?d?d +?u?l?d?d?l?l?l?u +?u?u?u?d?d?d?l?l?l +?l?d?d?l?l?l?u?l +?d?l?l?l?u?u?u?d +?u?u?u?d?l?l?l?d +?l?d?l?d?l?l?l?u +?l?l?l?l?d?d?l?l?d +?l?d?l?l?d?l?u?u +?l?l?u?u?u?l?d?d +?d?d?l?u?l?l?l?l +?u?l?u?d?d?l?u?l +?l?d?d?u?l?l?l?l +?l?d?l?l?l?l?d?u +?d?l?l?u?l?l?l?d +?u?u?d?d?u?l?l?l +?u?u?d?l?l?l?l?d +?l?l?l?l?s?l?l?s +?l?l?l?l?l?l?l?s?d?d +?d?d?d?d?d?d?d?s?s?s +?d?s?d?s?d?s?l?l +?s?s?l?u?l?s?s +?l?s?l?s?s?l?s +?u?s?s?u?s?s?u +?l?l?s?s?l?s?s +?u?l?l?u?l?l?l?s +?l?l?l?u?l?d?l?l +?l?u?l?d?l?l?l?l +?l?u?l?l?l?d?d?d?d +?d?d?l?l?l?l?d?d?l +?l?l?l?d?d?d?d?u?u +?l?l?s?l?l?l?s?d +?s?d?l?l?l?l?l?s +?l?l?d?d?l?l?l?l?d +?d?l?d?l?d?d?l?d?l +?d?d?l?l?l?d?l?d?d +?d?l?l?l?d?d?d?d?d?d +?u?d?d?d?l?d?d?d?u +?d?d?l?u?l?d?d?d?d +?u?d?d?u?d?d?l?d?d +?d?d?l?d?d?d?l?d?l +?u?l?d?d?u?d?d?d?d +?l?d?l?l?d?d?d?d?d?d +?u?d?d?d?l?l?d?d?d +?l?d?d?d?l?d?d?l?l +?l?d?d?d?l?l?d?d?l +?u?d?l?l?d?d?d?d?d +?l?l?l?d?s?u?u?u +?l?l?d?l?s?l?l?l +?l?d?l?l?l?d?l?l?l +?s?l?s?d?d?d?d?d?d +?l?s?s?d?d?d?d?d?d +?l?l?l?l?s?l?l?d?d +?u?l?u?l?l?l?l?d?d +?u?u?u?u?s?d?d?s +?u?s?l?l?l?s?d?d +?l?s?d?d?s?l?l?l +?l?l?l?l?d?s?d?s +?s?s?s?s?s?d?d?d +?l?d?d?d?l?d?d?d?d?d +?l?d?s?l?d?l?l?l +?u?d?l?l?l?l?d?s +?u?l?l?l?s?u?d?d +?l?d?l?d?s?l?l?l +?d?s?l?l?l?l?l?d +?l?l?l?d?s?l?l?d +?l?d?l?l?d?l?l?l?l +?l?d?d?d?d?s?d?d?d?d +?u?l?l?l?l?l?u?s +?l?l?l?d?d?d?s?s?s +?d?l?d?l?d?l?d?l?d?l +?d?s?s?d?d?d?d?s +?s?d?s?d?d?d?d?s +?d?d?s?d?d?d?s?s +?s?d?d?d?s?d?d?s +?d?d?d?s?d?s?s?d +?d?d?d?s?d?s?d?s +?s?d?s?d?s?d?d?d +?s?s?d?d?d?d?d?s +?s?s?d?d?d?s?d?d +?d?s?d?s?s?d?d?d +?s?d?d?d?s?s?d?d +?l?l?d?d?l?d?d?l?l +?s?d?l?l?l?l?l?l?l +?d?d?d?d?d?s?d?d?s +?d?d?d?d?d?s?s?d?d +?u?u?u?l?l?l?s?d +?s?l?d?l?l?l?l?l +?s?l?l?l?l?d?l?l +?u?l?l?l?l?u?l?l?l +?u?u?u?u?u?s?s?s +?l?l?u?d?l?l?l?l +?u?l?l?u?l?l?u?d +?d?d?d?d?d?d?u?l?l?l +?d?d?l?l?l?l?l?l?s +?l?u?s?d?d?d?d?s +?s?l?d?l?d?d?d?s +?l?s?d?d?d?d?l?s +?s?u?s?u?d?d?d?d +?s?u?l?s?d?d?d?d +?s?s?u?u?d?d?d?d +?u?s?u?d?d?d?d?s +?s?s?d?d?l?d?d?l +?u?s?d?d?d?d?s?l +?s?d?l?d?d?l?d?s +?d?d?d?d?u?s?l?s +?d?s?d?s?d?l?l?d +?l?s?l?d?s?d?d?d +?d?d?d?d?u?s?u?s +?u?s?s?u?d?d?d?d +?s?d?d?s?l?l?d?d +?d?s?d?l?d?l?d?s +?s?d?d?l?l?s?d?d +?u?d?d?s?u?d?d?s +?d?d?s?u?l?s?d?d +?l?l?d?s?d?d?d?s +?s?d?d?u?u?d?d?s +?s?s?d?d?l?l?d?d +?d?d?l?d?d?l?s?s +?l?l?d?d?d?s?d?s +?d?d?s?l?d?s?l?d +?l?l?s?d?d?d?s?d +?s?s?d?d?d?d?u?u +?s?d?d?l?d?d?l?s +?l?d?d?s?s?l?d?d +?s?u?l?d?d?d?d?s +?s?s?s?l?l?l?l?l +?u?l?u?l?u?l?u?s +?s?l?l?l?l?l?l?l?s +?l?l?d?l?d?l?l?d?d +?l?l?d?d?d?l?l?l?d +?u?d?d?d?d?d?d?l?s +?l?d?d?d?d?d?d?s?l +?d?d?d?d?l?l?d?d?s +?u?d?d?d?d?d?d?u?s +?l?d?l?d?s?d?d?d?d +?s?l?l?l?l?l?d?d?s +?d?d?d?d?d?d?d?u?l?l +?d?d?d?d?s?s?d?d?d?d +?d?d?d?d?u?d?d?d?d?u +?u?d?d?d?d?l?d?d?d?d +?l?d?l?d?l?l?d?l?l +?d?l?d?l?d?l?s?l +?l?s?l?l?d?d?l?d +?l?l?s?d?l?d?l?d +?d?l?d?l?l?d?l?s +?s?l?d?l?l?d?l?d +?u?u?s?d?d?d?l?l +?u?u?u?d?d?d?u?s +?l?l?d?d?d?l?s?l +?u?d?l?d?u?d?l?s +?u?d?d?d?s?u?u?u +?u?d?d?d?l?l?l?s +?l?s?l?d?d?d?l?l +?l?l?l?d?d?d?s?u +?u?d?l?l?s?l?d?d +?s?d?l?l?d?d?l?l +?s?l?d?l?l?l?d?d +?l?l?s?d?l?l?d?d +?l?d?l?d?l?l?s?d +?l?s?l?d?l?d?l?d +?l?u?u?u?s?d?d?d +?l?u?l?u?s?d?d?d +?u?s?l?u?l?d?d?d +?l?s?d?d?l?d?l?l +?l?d?l?l?d?l?s?d +?d?d?l?l?s?l?l?d +?u?s?l?l?l?d?l?l +?l?l?l?d?l?s?l?l +?l?l?d?l?l?s?l?l +?l?l?l?d?l?l?s?l +?d?s?u?l?l?l?l?l +?s?s?l?s?l?s?s +?l?l?u?u?u?u?u?u +?u?l?l?l?l?l?l?s?d +?l?l?l?l?l?l?u?d?d +?d?l?d?d?l?l?l?d?d +?l?d?d?l?d?d?l?d?l +?d?u?d?u?d?u?d?u?d +?l?d?d?l?l?d?d?l?d +?l?d?d?d?l?d?l?l?d +?u?l?d?d?d?d?d?l?l +?d?d?l?d?l?d?l?d?l +?l?d?d?l?d?d?d?l?l +?l?l?l?u?u?u?d?d?d +?l?l?l?l?u?l?d?l +?l?l?l?u?l?l?d?l +?d?u?l?l?l?l?l?u +?l?l?l?l?d?l?u?l +?l?d?u?l?l?l?l?l +?s?u?l?l?d?d?d?s +?d?d?d?u?u?u?s?s +?s?u?u?u?u?s?d?d +?u?u?u?s?d?d?s?d +?l?l?d?d?u?u?s?s +?u?u?s?s?l?l?d?d +?d?l?d?l?s?u?s?u +?s?l?s?l?l?d?d?d +?d?u?l?l?l?l?l?l?l +?l?l?s?l?l?l?d?d?d +?d?d?d?d?d?d?d?l?l?s +?l?l?l?l?l?l?l?s?s +?u?u?u?u?l?d?l?d +?u?u?d?d?u?u?l?l +?l?l?l?l?u?d?d?u +?u?d?u?l?l?l?l?d +?u?d?l?l?l?l?d?u +?d?u?u?d?l?l?l?l +?u?l?u?l?d?d?u?u +?l?d?l?l?d?l?d?l?l +?d?l?l?u?u?l?l?d +?u?l?l?l?u?d?l?d +?u?u?u?u?l?d?d?l +?u?u?u?l?l?d?d?l +?u?u?l?d?d?u?u?u +?d?u?u?u?d?l?l?l +?l?l?l?d?u?d?l?l +?u?l?l?d?d?u?u?u +?d?l?l?l?d?u?u?u +?u?d?l?l?l?u?d?l +?u?u?l?u?l?l?d?d +?l?u?l?l?l?d?d?l +?u?l?d?l?l?d?l?u +?d?d?u?l?l?l?u?l +?u?l?d?l?u?l?d?l +?l?l?d?l?l?d?u?u +?l?s?l?s?d?d?d?d?d +?d?l?l?l?l?l?l?l?l?l diff --git a/masks/rockyou-6-864000.hcmask b/masks/rockyou-6-864000.hcmask new file mode 100644 index 0000000000..70bf9f0196 --- /dev/null +++ b/masks/rockyou-6-864000.hcmask @@ -0,0 +1,17437 @@ +?d +?d?d +?l +?d?d?d?d +?d?d?d?d?d?d +?d?d?d?d?d +?l?l +?d?d?d +?u +?s +?l?l?l +?u?u +?l?d +?d?d?d?d?d?d?d +?u?d +?l?l?l?l +?l?l?d?d?d?d +?u?u?u +?l?l?d +?u?l +?l?d?d?d?d +?l?l?l?l?l +?l?l?l?d?d +?l?d?d +?d?d?d?d?l +?l?d?d?d?d?d +?l?l?d?d +?s?d +?l?l?l?d?d?d +?l?l?l?l?d?d +?s?s +?d?d?d?d?l?l +?l?l?d?d?d +?d?d?d?d?d?l +?d?d?d?d?d?d?d?d +?d?l +?u?l?l +?l?s +?l?l?l?l?d +?l?l?l?d +?l?d?d?d +?l?d?l +?l?d?d?d?d?d?d +?u?u?u?u +?l?l?l?l?l?l +?d?d?d?l +?u?u?d +?d?d?d?d?d?d?l +?s?d?d +?u?d?d?d?d +?u?u?u?u?u +?d?l?l +?d?d?d?l?l +?u?u?d?d?d?d +?d?d?d?d?s +?d?d?d?d?u +?l?l?l?d?d?d?d +?l?l?l?l?l?d +?u?l?l?l +?u?u?u?d?d +?d?s?d +?l?s?l +?l?d?d?d?d?l +?d?d?s?d?d +?u?d?d +?d?d?l +?d?d?d?l?l?l +?u?d?d?d?d?d +?d?d?l?d?d +?d?d?s +?d?d?l?l?l +?d?d?l?l +?u?u?u?u?d?d +?l?l?d?d?d?d?d +?l?d?d?l?d?d +?u?l?l?l?l +?u?u?d?d?d +?d?d?l?l?d?d +?u?d?u +?u?u?u?d?d?d +?d?d?d?d?d?u +?u?u?d?d +?u?u?u?u?d +?l?d?l?d +?u?d?d?d +?d?d?u +?d?d?d?d?u?u +?d?l?l?l +?l?s?d +?l?d?d?d?l +?l?d?d?l +?s?d?d?d?d +?d?l?l?l?l +?l?l?s +?d?d?d?d?l?d +?d?d?d?d?d?d?d?d?d +?d?d?l?l?l?l +?l?l?d?l +?d?d?d?l?d +?l?d?l?l +?d?d?d?s +?l?d?l?d?d +?d?d?l?d?d?d +?l?l?l?l?l?d?d +?u?d?d?d?d?d?d +?l?l?l?l?d?d?d +?l?d?l?d?l?d +?s?s?s +?d?d?d?l?d?d +?d?s?d?d +?d?l?d?d?d +?u?u?u?d +?d?l?d?d?d?d +?l?l?l?d?l +?d?l?l?d +?d?l?d?d +?d?d?l?d +?u?l?l?l?d?d +?d?d?d?s?d +?d?d?d?d?d?s +?l?d?l?d?l +?u?l?l?d?d +?u?u?l +?l?d?d?l?d +?u?u?u?u?u?u +?l?l?d?l?l +?d?d?d?d?d?d?u +?l?d?l?l?l +?l?l?d?d?l +?u?d?l +?d?u?u +?d?l?l?l?d +?l?d?l?d?d?d +?d?s?d?d?d +?u?l?d?d?d?d +?u?s?u +?l?d?l?l?d +?d?d?d?d?l?l?l +?d?d?d?u?u +?l?l?d?d?l?l +?d?l?l?l?l?l +?u?l?l?l?d +?d?d?l?d?d?l +?s?d?l +?l?d?d?d?d?d?d?d +?l?u?u +?l?d?d?l?l +?l?l?l?l?s +?d?l?l?d?d +?d?d?l?l?d +?u?u?u?u?u?d +?l?s?d?d +?d?d?d?d?d?l?l +?d?d?s?d?d?d +?d?l?d?l?d +?l?l?d?l?d +?u?l?l?d?d?d +?s?d?s +?s?s?d +?d?l?l?l?d?d +?s?l?l +?u?u?s +?d?d?d?s?d?d +?d?l?l?l?l?d +?l?l?l?s +?l?l?d?d?d?l +?d?d?d?d?d?d?d?l +?s?d?d?d?d?d +?l?l?l?d?d?l +?d?d?d?d?s?d +?l?l?s?d?d +?l?l?l?l?l?l?l +?l?l?d?d?d?d?d?d +?d?d?d?l?l?d +?u?d?d?d?d?u +?l?l?l?l?d?l +?l?d?d?d?l?l +?d?l?d?l?d?l +?d?l?l?d?d?d +?u?l?l?l?l?l +?u?l?l?d +?l?l?l?l?l?l?d +?d?d?d?u?u?u +?u?u?u?d?d?d?d +?l?d?l?l?d?d +?l?l?l?s?d?d +?d?d?s?d +?d?l?d?l +?u?l?l?l?l?d +?u?l?d?d?d +?u?l?u +?l?u?l +?l?l?u +?d?d?l?d?l +?l?d?d?l?l?l +?l?l?d?l?l?d +?d?d?u?d?d +?d?d?d?d?d?d?s +?l?l?l?d?l?l +?l?l?l?l?d?d?d?d +?l?d?d?d?l?d +?d?d?u?u?u +?l?l?d?l?l?l +?l?d?l?l?l?l +?l?l?s?d +?d?l?d?d?l +?d?d?d?d?d?d?d?d?d?d +?d?d?l?l?l?d +?u?l?s +?d?l?d?l?l +?l?l?d?l?d?d +?l?d?l?l?d?l +?l?l?l?s?d +?d?s?d?s?d?d +?d?d?l?l?l?d?d +?u?d?d?u?d?d +?d?l?l?d?l +?s?d?d?d?d?s +?d?s?d?d?d?d +?d?u?u?u +?s?d?d?d?s +?d?d?d?u +?d?d?d?d?s?s +?d?l?d?l?d?d +?l?l?l?d?l?d +?u?u?d?d?d?d?d +?d?l?d?d?l?d +?d?u?u?u?u +?l?l?d?d?l?d +?d?d?d?d?d?d?l?l +?l?l?s?l?l +?u?l?u?l +?l?l?l?l?l?s +?l?d?l?l?l?d +?u?d?u?d?d +?s?d?d?d +?l?s?l?l?l +?u?d?d?d?u +?l?d?d?l?l?d +?l?l?l?l?u +?d?d?l?d?l?d +?u?d?u?u +?l?s?d?d?d?d +?l?d?d?l?d?l +?l?l?l?s?l +?d?d?d?l?d?d?d +?l?d?l?d?d?l +?l?l?s?l +?d?d?u?u?d?d +?d?d?d?d?u?d +?l?d?l?d?l?l +?d?s?d?s?d +?d?l?d?d?d?l +?u?u?l?l +?d?d?l?d?d?d?d +?d?d?d?l?l?l?l +?d?d?d?l?d?l +?l?s?l?l +?u?l?l?l?u +?l?l?l?l?s?d +?d?d?u?u?u?u +?d?d?d?d?l?d?d +?d?d?d?s?s +?u?s?d?d +?u?l?l?d?d?d?d +?d?d?d?s?d?d?d +?u?u?u?u?u?d?d +?l?l?s?d?d?d +?l?l?l?d?d?d?d?d +?s?s?d?d?d +?l?d?d?d?d?d?l +?d?d?d?u?d?d +?l?s?l?d?d +?u?u?u?d?u +?l?l?d?l?d?l +?d?d?u?d?d?d +?u?d?d?u?d +?d?d?d?d?s?d?d +?l?s?d?d?d +?d?d?d?d?u?l +?u?l?u?l?u +?u?u?u?u?d?d?d +?u?d?u?d?u +?l?u?u?u?u +?u?l?l?u +?u?d?u?d?u?d +?d?u?l?l +?u?u?d?u +?l?d?d?d?d?s +?u?d?d?d?d?l +?d?d?l?l?d?l +?d?u?d?d?d +?d?d?d?u?d +?u?l?u?d?d +?u?l?l?l?l?d?d +?u?d?d?u +?d?d?u?u +?l?d?u?d +?u?d?u?d +?u?l?d?d +?d?d?d?d?s?l +?u?u?d?d?u +?d?d?l?d?l?l +?l?s?l?s?l +?d?l?l?d?l?l +?d?u?d?d?d?d +?l?l?l?d?d?s +?u?u?l?l?l +?l?l?l?l?l?l?d?d +?l?s?l?s +?u?d?u?u?u +?s?l?l?l?l +?d?d?s?d?d?d?d +?d?l?l?d?l?d +?d?d?l?l?l?l?l +?d?l?l?d?d?l +?d?u?u?u?u?u +?u?d?u?u?d +?u?d?u?d?d?d +?d?l?d?d?l?l +?l?l?l?l?l?d?d?d +?d?l?l?l?d?l +?s?d?d?d?d?d?d +?d?l?d?l?l?d +?u?u?d?u?u +?u?l?u?d?d?d +?s?l?l?l +?d?u?d?u?d +?u?d?d?d?l +?s?s?s?s +?l?l?d?d?s +?d?s?d?l +?d?d?s?l +?s?l?d?d +?d?l?d?l?l?l +?u?u?u?u?s +?d?u?l?u +?u?d?d?d?d?d?d?d +?l?s?l?d?d?d +?l?u?u?u +?u?u?u?l +?d?d?l?l?d?d?d +?l?l?l?s?s +?u?d?d?l?d +?l?u?d?d?d +?d?d?u?u?d +?l?u?d?d?d?d +?d?d?d?d?d?l?d +?d?u?u?u?d +?s?s?d?d?d?d +?d?d?d?s?l +?d?d?d?d?l?s +?s?s?d?d +?u?l?u?l?d?d +?l?s?l?d +?l?l?l?u +?d?s?d?d?s?d?d +?d?d?s?d?d?s +?u?l?l?l?d?d?d +?u?u?u?s +?d?d?u?d?d?u +?u?d?d?u?u +?l?d?l?d?d?d?d +?d?l?d?d?d?d?d +?d?d?d?d?u?u?u +?u?s?d?d?d?d +?l?l?u?d?d +?u?u?d?u?d +?u?l?l?l?s +?d?d?s?d?s?d?d +?d?d?d?d?d?d?d?u +?d?d?d?d?d?s?d +?u?u?s?d?d +?d?d?d?d?d?u?u +?u?d?l?l?l +?u?u?d?d?u?u +?u?d?l?l?d +?d?d?u?d?u +?u?d?l?d?d +?d?l?l?l?l?l?l +?d?d?d?l?l?d?d +?s?l?l?l?s +?u?u?l?d?d +?d?d?u?l?l +?l?l?u?l?l +?l?s?l?l?l?l +?u?l?d?d?d?d?d +?l?l?d?d?d?s +?u?u?l?d?d?d +?l?d?d?d?d?d?d?l +?l?l?l?l?s?d?d +?l?u?u?d?d?d +?u?l?u?l?l +?l?l?d?d?d?l?l +?l?d?d?d?d?d?d?d?d +?u?u?u?u?u?u?d +?l?l?l?l?s?l +?d?d?d?d?l?l?d +?u?u?u?s?d?d +?l?l?d?d?d?d?l +?d?d?d?d?l?l?l?l +?d?u?u?u?u?d +?l?l?s?l?l?l +?l?l?u?d?d?d +?d?d?d?u?l +?u?l?u?l?d +?u?u?u?u?l +?l?d?d?d?s +?l?u?l?d?d?d +?l?l?l?l?d?s +?u?d?l?l +?d?u?d?u?d?u +?l?u?l?d?d +?d?u?u?d?u +?u?l?d?l +?u?u?d?l +?d?d?s?s?d?d +?l?l?s?d?d?d?d +?u?l?l?u?l +?d?d?s?l?l +?s?d?l?l?l +?l?u?l?l?l +?l?d?d?d?d?l?l +?u?u?d?d?d?d?d?d +?u?l?l?l?l?u +?d?u?u?u?d?d +?u?l?d?d?l +?u?l?d?l?d +?u?u?l?l?d?d +?l?d?l?d?l?d?d +?l?l?l?l?s?s +?u?u?u?u?u?u?u +?l?l?l?d?s +?l?l?l?s?l?l +?d?u?u?d?d?d +?u?u?u?u?d?u +?d?u?l?l?l +?u?d?d?l?d?d +?d?d?d?u?u?d +?l?d?d?d?l?l?l +?d?d?u?l?l?l +?l?l?l?u?u +?u?u?d?d?d?u +?d?d?d?u?l?l +?u?d?l?d?l +?l?u?l?u?l +?d?l?s?l +?s?l?l?d +?u?u?u?s?d +?d?s?l?l +?l?s?d?l +?l?l?d?s?d +?u?u?s?d +?u?s?d?u +?l?d?d?l?d?d?d +?d?u?u?d?d +?d?u?d?d?u +?d?d?d?d?d?d?d?d?l +?l?l?u?u +?u?l?l?d?l +?u?u?u?l?l +?s?l?l?l?l?l +?l?d?d?s?d?d +?l?l?l?s?d?d?d +?l?l?u?u?u +?d?d?s?d?d?s?d?d +?d?l?l?l?d?d?d +?u?u?s?u?u +?u?u?u?d?d?u +?d?d?d?d?d?l?l?l +?d?d?d?s?l?l +?u?s?u?s +?u?s?u?d?d +?u?l?s?d?d +?u?l?l?u?d?d +?u?d?d?l?l +?d?u?l?l?d +?d?u?d?u?u +?u?s?u?u?u +?u?l?d?l?l +?u?d?d?d?u?u +?u?l?l?l?l?l?d +?u?d?u?u?d?d +?s?l?l?l?l?s +?l?l?l?d?l?l?l +?u?d?d?d?d?s +?d?l?l?d?d?d?d +?d?l?l?l?l?l?d +?l?l?s?s?l +?l?d?d?d?l?d?d +?s?d?l?l?l?l +?l?s?l?l?d +?u?d?d?u?u?u +?l?d?l?d?s +?u?u?u?s?u +?d?d?d?d?l?u +?l?d?s?s +?l?d?d?s?d +?s?l?d?d?d +?s?d?d?d?l +?u?s?d?d?d +?d?s?d?d?l +?u?d?u?u?u?u +?u?l?l?s +?u?u?s?u +?d?l?d?l?d?l?d +?u?l?d?d?u +?d?l?l?l?l?d?d +?l?l?l?u?l +?l?l?l?d?d?d?l +?u?s?u?s?u +?d?d?d?d?d?d?d?s +?d?s?d?d?d?d?d +?u?u?s?d?d?d +?u?u?u?d?u?u +?l?l?d?d?l?l?l +?l?l?l?l?l?l?l?l +?l?u?u?u?d +?u?u?l?l?d +?u?l?l?u?d +?d?u?d?d?u?d +?d?u?l?l?l?l +?l?l?l?l?l?u +?u?u?d?u?u?u +?u?u?d?u?u?d +?u?l?l?u?l?l +?u?d?u?u?d?u +?s?s?s?d?d +?d?d?d?l?u +?d?d?u?l?d?d +?d?d?l?d?u +?d?d?d?s?d?d?d?d +?u?l?u?d?d?d?d +?u?u?u?u?u?s +?d?s?l?l?l +?l?s?l?l?d?d +?s?l?d?d?d?d +?u?l?l?l?l?s +?u?s?l?l?l +?d?d?s?d?s?d +?l?u?u?d?d +?l?d?d?l?d?d?l +?s?d?d?d?d?l +?u?d?l?d?l?d +?d?d?s?l?l?l +?s?l?l?l?d?d +?s?d?s?d?d +?d?s?s?d?d +?d?s?d?d?s?d +?d?s?d?d?s +?u?l?u?l?u?l +?u?d?l?l?d?d +?l?s?s?l +?u?u?s?s +?l?l?s?s +?u?d?l?l?l?l +?u?l?l?l?d?l +?d?d?u?d?d?d?d +?l?u?u?u?d?d +?u?l?l?s?d?d +?u?u?d?d?u?d +?d?d?u?u?u?d +?u?u?u?u?d?d?d?d +?l?d?d?d?d?u +?l?l?l?d?d?l?l +?l?l?l?u?d +?l?s?l?d?d?d?d +?u?u?d?u?d?d +?d?d?d?u?d?d?d +?u?u?u?u?s?d +?u?l?l?s?d +?l?s?l?d?l +?l?l?l?d?d?d?d?d?d +?u?l?u?u?l +?u?d?d?d?u?d +?d?u?d?u?d?d +?l?s?l?s?d?d +?s?d?d?s?d?d +?d?d?d?d?d?d?u?u +?u?d?l?l?d?l +?d?d?d?d?s?u +?l?l?d?d?l?d?d +?l?l?d?l?s +?l?d?l?l?d?d?d +?s?s?s?s?s +?u?d?l?d?d?d +?d?d?u?d?u?d +?l?l?l?l?l?l?l?d +?d?l?d?s?d +?d?d?s?d?l +?d?d?d?s?u +?u?d?u?u?u?d +?l?l?d?s?d?d +?u?s?u?d?d?d +?u?l?l?l?l?l?l +?l?l?l?l?l?d?l +?d?d?d?d?u?d?d +?l?l?l?l?l?l?s +?s?s?s?d?d?d +?d?d?l?l?s +?s?l?l?d?d +?l?l?l?u?d?d +?u?l?l?l?d?d?d?d +?u?u?l?l?l?l +?l?l?d?d?d?d?s +?l?d?l?d?l?d?l +?s?s?l?l?l +?u?d?d?d?d?d?u +?l?l?l?d?u +?l?u?u?l +?u?l?u?u +?l?u?l?l +?l?l?u?l +?l?u?l?u +?d?d?d?u?u?u?u +?u?d?u?d?d?u +?l?l?d?d?s?d +?s?s?s?l +?l?l?l?d?s?d +?l?l?s?l?d?d +?d?d?d?l?l?s +?u?l?l?u?u +?l?l?l?l?d?d?l +?l?d?l?l?s +?l?d?d?l?l?d?d +?u?l?d?d?d?d?d?d +?l?l?l?d?d?d?s +?u?d?u?d?u?u +?u?u?u?d?u?d +?l?s?l?l?l?d +?l?d?d?d?s?d +?l?d?s?d?d?d +?d?d?u?u?u?d?d +?d?d?d?s?s?s +?u?u?u?s?s +?l?l?l?l?d?d?s +?l?s?l?s?d +?l?l?s?l?d +?d?d?d?l?l?l?d +?l?l?l?l?d?l?l +?s?d?s?d?d?d +?d?d?s?d?s +?u?l?l?l?s?d +?l?l?d?l?l?l?l +?l?l?d?l?l?d?d +?u?u?d?d?s +?l?d?s?l?d +?l?d?d?l?s +?d?s?l?l?l?l +?l?d?d?u?d?d +?u?l?d?d?l?l +?u?d?d?l?l?l +?l?d?l?l?u +?l?l?u?u?d +?u?u?u?l?d +?s?d?d?d?d?d?s +?u?l?l?l?u?d +?l?s?d?l?l +?u?s?u?u +?u?l?s?l +?l?u?s?l +?d?d?l?l?l?l?d?d +?l?s?d?d?d?d?d +?d?d?l?u?l +?d?d?l?l?u +?l?l?d?d?u +?u?l?d?u?d +?l?l?l?l?l?s?d +?d?d?d?d?d?s?l +?u?l?l?d?l?l +?l?d?l?l?l?d?d +?l?u?u?u?u?u +?u?u?u?l?l?l +?d?s?d?s?d?s +?d?l?d?d?l?d?d +?d?l?l?l?l?s +?u?l?u?u?u +?d?d?l?d?l?d?d +?l?d?d?d?d?d?s +?u?d?d?d?l?l +?d?d?d?l?d?d?d?d +?d?d?d?d?l?l?d?d +?u?l?d?l?l?l +?l?l?s?l?l?d +?l?d?s?l?l +?d?d?d?d?s?l?l +?l?l?l?l?d?l?d +?d?d?d?l?s?l +?d?d?l?l?l?s +?l?u?l?l?u +?l?d?l?l?l?l?l +?d?d?l?l?d?d?d?d +?d?d?d?d?l?d?d?d +?l?d?d?u?d +?d?d?d?u?d?u +?l?l?d?l?d?d?d +?u?d?l?d?u?d +?d?u?l?d?d +?d?u?d?d?l +?d?d?d?d?d?s?s +?l?l?l?l?l?d?d?d?d +?l?l?d?d?d?d?d?d?d +?u?u?l?l?l?d +?d?d?d?d?l?d?l +?l?u?l?l?d?d +?u?d?d?u?u?d +?l?d?d?d?d?l?d +?l?s?s?l?l +?d?u?l?l?l?d +?d?d?s?d?d?l +?s?l?l?l?d +?d?l?l?l?s +?u?d?d?u?d?u +?s?l?s?l +?l?s?l?l?s +?s?u?u?s +?s?l?l?s +?s?s?l?l +?l?u?u?u?u?d +?l?s?d?d?l +?d?l?d?l?s +?d?s?d?l?l +?s?l?l?d?d?d +?d?l?s?l?d +?l?l?d?d?s?s +?u?u?d?l?l +?l?u?l?u?d +?d?d?d?l?l?d?d?d +?l?l?u?u?d?d +?u?l?l?d?d?l +?d?d?d?d?d?d?l?d +?d?d?d?d?u?l?l +?l?l?l?d?l?d?d +?u?d?d?l?l?d +?l?d?d?d?l?d?d?d +?l?d?l?s?d?d +?u?u?u?d?d?s +?l?l?d?s?l +?l?d?d?l?d?l?d +?l?s?l?s?l?s +?u?l?u?l?l?l +?d?d?u?d?u?u +?u?d?l?l?l?d +?u?u?d?d?l?l +?s?l?l?l?l?d +?l?l?l?l?u?d +?l?d?l?d?d?l?d +?u?l?u?l?u?d +?s?d?d?l?d +?u?d?d?d?s +?d?d?d?l?s +?u?d?d?s?d +?l?d?s?d?d +?d?d?d?u?s +?d?s?d?l?d +?u?l?l?d?l?d +?d?l?d?l?u +?u?l?d?l?d?d +?u?d?d?l?u +?d?d?l?u?u +?l?d?u?l?d +?d?u?d?l?u +?u?d?l?d?u +?d?l?l?u?d +?l?d?u?d?l +?d?d?l?d?d?l?d +?s?d?d?l?l?l +?u?u?u?d?d?d?d?d +?d?d?l?l?l?l?d +?d?d?d?l?l?l?l?l +?u?u?d?u?d?u +?l?u?u?l?d +?l?l?u?l?u +?l?u?l?l?d +?u?u?l?u?u +?l?l?u?l?d +?d?d?u?l?l?d?d +?l?d?d?l?l?l?l +?d?d?l?d?d?d?d?d +?u?d?d?l?d?l +?l?l?l?s?l?d +?d?d?d?d?d?d?d?d?d?d?d +?u?u?d?d?d?s +?d?l?d?l?d?d?d +?l?s?s?d?d +?l?d?l?l?d?l?d +?u?l?d?l?l?d +?u?u?u?d?d?l +?l?l?u?l?d?d +?d?d?d?d?u?s +?d?l?d?s?d?d +?d?d?u?d?d?l +?d?d?l?u?d?d +?u?d?d?d?l?d +?u?s?u?u?d +?s?l?l?d?l +?u?l?s?d?d?d +?u?u?u?u?u?u?d?d +?l?u?u?l?l +?s?d?s?d?s?d +?l?l?d?d?l?l?d +?l?d?l?d?l?d?l?d +?d?d?l?d?d?d?l +?d?d?d?l?d?d?l +?l?l?l?l?u?u +?d?d?d?u?l?u +?u?u?d?d?d?l +?d?d?u?u?u?u?u +?l?l?s?s?s +?l?l?l?s?s?s +?l?l?d?d?d?d?l?l +?d?s?d?d?l?l +?u?d?l?d?l?l +?u?d?d?d?d?d?l +?u?s?u?l?l +?l?u?u?u?l +?u?u?l?l?u +?l?l?u?u?l +?d?d?d?d?d?u?d +?d?d?d?s?l?l?l +?u?u?u?l?d?d +?d?d?s?s?d +?s?d?d?s?d +?d?d?d?d?d?u?l +?d?d?u?u?d?u +?u?l?d?d?l?d +?d?u?l?l?d?d +?l?u?l?u?d?d +?l?d?d?s?l +?l?s?d?l?d +?s?d?l?l?d +?s?l?d?d?l +?l?d?l?s?d +?d?d?s?u?u +?u?d?l?s?d +?s?d?d?l?l +?u?l?l?l?l?l?d?d +?d?d?d?d?d?d?d?l?l +?d?u?d?d?d?u +?d?u?l?d?d?d +?l?s?d?l?l?l +?l?l?d?d?l?l?d?d +?d?l?l?l?u +?u?l?u?u?d +?d?u?l?u?l +?u?l?u?u?d?d +?u?l?d?l?u +?u?l?d?u?l +?u?d?u?l?l +?l?d?l?u?l +?s?d?d?d?d?d?d?d +?l?d?l?d?l?s +?u?l?l?s?l +?u?l?l?s?u +?d?u?u?d?d?u +?d?u?u?u?d?u +?d?u?u?d?u?u +?l?d?l?d?s?d +?l?l?l?s?l?l?l +?d?d?d?d?l?l?s +?u?u?u?l?u +?s?u?u?u?s +?d?d?s?s?s +?s?s?d?d?s +?l?d?l?d?l?l?d +?u?d?d?s?d?d +?d?d?d?d?d?d?s?d +?l?l?s?s?d +?l?d?d?d?d?d?d?d?l +?u?l?u?l?d?d?d +?u?l?d?d?d?l +?l?l?l?u?u?u +?l?l?d?d?d?l?d +?u?l?d?d?u?l +?u?l?l?d?d?s +?u?u?u?u?u?d?d?d +?d?d?d?d?d?d?l?l?l +?u?s?u?s?d?d +?d?l?d?d?d?d?d?d +?l?u?l?d?d?d?d +?l?d?l?l?l?s +?d?u?d?l?d?d +?d?d?d?l?l?u +?u?d?u?d?d?d?d +?d?d?d?d?d?l?s +?u?d?d?d?d?d?d?d?d +?d?u?d?d?d?d?d +?d?u?u?u?u?u?u +?u?l?u?l?l?d +?u?s?u?u?u?u +?l?d?d?s?s +?s?l?d?d?s +?l?d?s?s?d +?d?l?d?s?s +?s?u?d?d?d?d +?d?d?s?l?d?d +?s?l?l?d?d?s +?l?l?l?d?l?l?d +?l?d?d?l?d?d?d?d +?l?l?s?d?l +?u?l?l?d?s +?u?s?l?d?l +?d?d?l?d?d?l?d?d +?u?d?l?d?d?l +?d?u?d?u?u?d +?u?l?l?l?u?l +?u?l?l?s?s +?u?l?l?l?l?d?d?d +?l?l?l?d?d?u +?d?d?d?d?d?l?d?d +?s?s?s?s?d +?l?u?l?u?u +?l?d?l?d?l?l?l +?d?d?d?d?s?d?d?d +?d?d?l?d?d?l?l +?l?l?s?s?d?d +?s?u?u?u?u +?u?l?s?u?l +?u?l?u?l?s +?l?d?l?l?l?l?d +?l?u?l?d?l +?l?u?d?l?l +?l?d?u?u?u +?u?l?u?d?l +?u?l?l?d?u +?l?d?l?u?u +?l?l?d?d?s?d?d +?d?d?l?l?l?l?l?l +?l?l?d?l?l?s +?d?d?d?s?s?d +?d?s?d?d?d?s +?l?l?l?s?d?d?d?d +?d?d?s?d?l?l +?l?d?d?d?l?s +?l?d?l?d?d?s +?d?d?d?u?u?l +?l?d?l?l?d?l?l +?l?l?d?l?l?l?d +?u?d?l?l?d?u +?u?l?d?l?d?l +?u?u?s?d?d?d?d +?l?l?u?l?l?l +?u?l?l?d?d?d?d?d +?u?d?d?d?d?u?u +?d?l?d?l?d?d?l +?d?d?l?d?d?u +?d?d?l?l?d?d?l +?d?l?u?d?d?d +?l?d?l?d?d?d?d?d +?d?d?d?s?d?l +?u?l?d?d?d?s +?d?d?d?s?u?u +?l?l?l?u?l?l +?l?l?l?d?d?l?d +?u?l?l?l?d?s +?d?l?l?l?d?d?d?d +?u?u?d?d?l +?d?l?l?d?u +?l?d?d?u?l +?l?d?d?u?u +?d?u?u?d?u?d +?l?u?d?l?d +?u?d?u?d?l +?d?l?u?l?d +?l?d?l?d?u +?u?d?d?u?l +?l?d?u?u?d +?d?u?d?u?l +?d?u?u?d?l +?d?l?u?u?d +?d?d?u?u?l +?u?d?u?l?d +?d?u?l?u?d +?u?u?d?l?d +?l?d?l?u?d +?d?u?d?l?l +?l?d?u?d?u +?u?d?l?u?d +?s?d?d?d?d?d?d?s +?l?u?l?l?l?l +?u?s?l?l?l?l +?u?u?u?u?s?u +?u?u?u?u?s?s +?s?d?s?d?s +?d?s?d?s?s +?l?l?d?l?l?d?l +?u?l?d?u?l?d +?l?d?l?l?l?d?l +?u?l?l?l?u?u +?s?l?d?l?s +?u?s?u?s?d +?l?d?l?s?s +?d?d?l?l?s?d +?u?d?d?d?d?d?d?u +?u?u?s?u?u?u +?l?s?l?l?d?l +?d?d?d?d?d?d?u?l +?l?l?d?d?u?u +?u?l?l?d?d?u +?u?s?u?d?d?d?d +?d?d?d?d?d?d?s?l +?s?d?u?u?u +?u?u?u?d?s +?u?u?s?u?d +?d?l?s?l?l +?l?l?l?d?l?s +?d?d?d?u?l?l?l +?l?l?d?d?d?u +?d?u?d?d?u?u +?l?l?l?l?l?d?s +?u?l?d?d?l?u +?d?d?d?d?d?d?s?s +?l?u?l?u?l?u +?l?l?l?l?d?d?d?d?d +?l?d?d?d?l?l?d +?d?d?d?l?d?l?d +?d?d?u?u?d?d?d +?d?d?d?l?l?l?s +?l?d?l?l?d?d?l +?s?d?u?u?u?u +?l?l?d?l?d?l?d +?d?l?d?l?l?d?d +?u?u?d?l?l?l +?l?l?s?l?s +?l?l?d?d?l?d?l +?u?d?s?d?d?d +?d?d?s?d?l?d +?s?d?d?d?d?u +?d?d?l?d?d?s +?s?d?l?d?d?d +?d?d?l?s?d?d +?l?d?d?l?l?l?d +?l?d?l?l?d?s +?u?l?s?l?l +?d?d?d?s?d?s +?s?d?d?d?s?d +?d?s?s?d?d?d +?l?u?d?d?d?d?d +?s?s?l?l?l?l +?l?d?u?d?l?d +?u?u?l?d?d?d?d +?u?d?d?u?s +?l?d?d?s?u +?s?d?u?u?d +?d?l?l?d?s +?l?u?s?d?d +?s?l?d?l?d +?d?d?u?s?u +?d?d?u?l?s +?l?d?l?s?l?d +?d?s?l?d?l +?u?d?u?d?s +?l?s?d?d?d?l +?u?d?l?d?s +?d?d?l?s?l +?d?l?d?d?d?l?d +?d?d?d?u?u?d?d +?d?d?d?u?l?d +?d?d?d?l?d?d?d?l +?d?l?d?u?d?d +?d?l?d?d?d?d?l +?d?d?l?d?u?d +?d?d?d?d?d?s?d?d +?l?l?u?d?d?d?d +?d?d?u?u?l?l +?u?d?u?u?l +?l?d?u?l?l +?u?u?l?d?u +?u?u?l?d?l +?l?l?u?d?l +?d?u?l?l?u +?u?u?u?d?l +?u?u?d?u?l +?u?l?d?u?u +?u?d?l?u?d?l +?u?u?l?u?d +?l?u?d?u?u +?l?l?d?u?l +?s?s?s?s?s?s +?d?d?d?d?l?s?l +?l?l?d?d?l?s +?l?l?l?l?l?l?d?d?d +?d?d?s?d?d?d?d?d +?l?s?d?s?d?d +?u?u?u?u?s?d?d +?d?d?s?d?d?s?d +?l?l?u?u?u?u +?u?d?d?d?d?d?d?l +?d?d?d?l?l?l?d?d +?d?d?l?l?l?u +?l?u?u?l?d?d +?l?u?u?d?d?d?d +?u?l?l?u?l?d +?s?l?l?d?d?d?d +?l?s?s?s?l +?s?s?s?l?l +?d?d?u?l?l?l?l +?l?l?l?s?d?l +?l?l?d?d?s?d?l +?l?d?l?d?d?d?l +?d?d?d?d?d?d?d?d?u +?s?l?l?d?s +?s?u?u?u?u?s +?l?l?l?l?u?l +?u?u?u?u?l?l +?l?l?l?l?d?u +?l?d?d?d?s?l +?s?d?d?d?l?l +?d?l?l?s?d?d +?l?d?d?l?d?s +?u?l?d?d?d?u +?l?d?l?u?d?d +?d?d?d?l?u?l +?d?d?d?l?u?u +?l?l?l?s?u +?d?d?u?l?u?l +?u?d?d?u?l?l +?l?l?s?s?l?l +?l?l?l?d?l?d?l +?u?u?u?s?u?u +?u?u?d?d?d?d?u +?l?d?d?s?d?d?d +?l?l?l?s?s?d +?u?u?l?l?d?d?d +?d?l?l?l?l?d?l +?s?s?d?d?s?s +?u?l?u?l?u?d?d +?u?u?d?d?d?u?u +?l?d?d?l?l?d?l +?u?u?u?u?u?l +?d?u?d?u?u?u +?l?s?l?s?l?d +?d?d?d?l?d?l?l +?d?d?d?d?s?s?s +?u?u?s?s?u +?s?l?s?l?l +?d?l?l?d?l?l?d +?l?d?d?d?l?d?l +?u?l?l?l?s?d?d +?l?s?l?l?l?d?d +?u?l?s?d?d?d?d +?d?s?d?l?l?l +?l?s?l?d?l?d +?u?u?u?l?l?d +?l?d?d?l?d?l?l +?u?s?l?d?d?d +?l?d?s?l?d?d +?s?s?d?d?d?d?d +?l?l?d?l?d?l?l +?d?d?d?d?d?d?d?d?s +?l?d?l?d?d?l?d?d +?d?s?d?s?d?d?d?d +?u?d?l?d?d?d?d +?u?u?u?s?d?d?d +?s?d?l?d?s +?d?s?l?d?s +?s?d?d?s?l +?s?l?s?d?d +?l?s?d?s?d +?d?d?s?s?u +?l?s?d?d?d?s +?d?d?s?l?s +?d?d?d?d?u?l?u +?l?l?s?l?l?l?l +?l?l?s?l?l?s +?u?u?u?u?d?s +?d?s?d?l?d?d +?d?l?d?d?d?s +?d?d?d?l?s?d +?d?l?s?d?d?d +?d?d?s?d?d?u +?d?d?u?s?d?d +?d?d?d?s?l?d +?d?s?d?s?d?s?d +?d?d?l?u?l?d?d +?d?d?l?d?l?d?l +?l?l?l?d?d?l?l?l +?u?l?l?l?d?u +?l?u?l?l?l?d +?d?l?u?l?s +?d?l?l?s?l +?u?s?d?u?u +?u?u?d?u?s +?l?d?l?s?l +?l?d?d?d?d?l?d?d +?l?l?l?l?l?s?l +?d?u?l?u?d?d +?l?l?d?u?d?d +?d?u?d?l?d?l +?d?d?u?l?d?l +?u?d?u?l?d?d +?u?d?d?d?l?u +?u?d?d?l?d?u +?l?d?u?l?d?d +?l?l?l?l?l?l?l?d?d +?d?u?u?d?d?d?d +?u?d?d?u?d?d?d +?u?u?l?l?l?d?d +?l?l?u?l?l?d +?l?u?u?l?u +?u?u?l?u?l +?d?d?s?l?l?l?l +?l?s?u?u?u +?l?l?s?d?l?l +?s?u?l?l?l +?s?l?s?l?s +?d?u?l?u?l?d +?d?l?l?l?s?d +?u?l?l?l?u?d?d +?d?d?d?d?u?u?d +?d?s?d?d?d?d?d?d +?d?l?d?l?l?l?l +?d?d?l?l?l?d?d?d +?l?l?s?l?l?d?d +?l?l?l?d?d?d?d?l +?l?d?d?s?l?d?d +?s?l?d?d?d?s +?d?l?d?l?d?l?l +?l?s?d?d?d?d?d?d +?l?d?d?d?d?d?d?s +?u?l?l?l?s?s +?d?d?d?d?u?u?u?u +?l?s?d?l?d?d +?s?d?l?l?d?d +?s?l?l?s?l +?s?u?l?l?s +?d?l?d?d?l?l?d +?l?l?s?d?d?s +?d?d?d?d?d?l?l?d +?l?l?l?u?l?d +?u?d?d?d?u?d?d +?u?s?u?u?d?d +?d?l?d?d?l?d?l +?l?l?l?l?d?s?d +?u?u?l?u?d?d +?l?d?s?l?l?l +?d?d?d?d?s?d?d?d?d +?u?s?d?d?d?d?d +?d?l?l?l?l?u +?d?l?l?l?d?l?l +?l?l?l?u?u?d +?l?l?l?l?l?s?d?d +?u?s?u?s?u?s +?d?l?l?d?l?d?d +?d?d?d?l?u?d +?d?u?d?d?l?d +?l?l?l?s?s?l +?l?s?l?d?d?l +?d?d?s?u?u?u +?u?s?l?l?d?d +?d?l?l?l?d?s +?u?u?s?u?d?d +?s?l?l?l?l?d?d +?l?d?l?d?d?l?l +?d?l?l?d?d?l?d +?d?d?s?d?d?l?l +?l?s?l?l?s?l +?l?l?u?u?l?l +?d?u?u?u?d?d?d +?u?u?d?l?l?d +?l?d?l?l?d?u +?d?u?d?l?d?u +?u?d?d?u?l?d +?u?d?l?d?l?u +?u?l?l?d?u?d +?d?d?d?l?l?d?l +?u?d?u?d?u?d?d +?u?d?l?d?d?u +?d?l?d?u?d?l +?l?u?d?l?d?d +?l?l?l?d?s?d?d +?s?l?s?d?d?d +?l?d?d?d?s?s +?d?l?l?l?l?l?l?l +?l?l?l?d?s?s +?l?d?d?d?d?d?d?d?d?d +?l?s?l?d?l?l +?s?d?d?s?s +?d?d?d?d?l?l?l?d +?s?u?u?u?d?d +?l?d?d?l?l?s +?l?l?d?l?d?d?l +?u?u?d?d?d?d?s +?l?d?l?l?s?l +?d?s?s?l?l +?l?s?s?l?d +?d?s?l?s?l +?l?l?s?d?s +?l?s?d?s?l +?s?l?s?l?d +?d?l?l?s?s +?l?u?d?s?s +?l?s?l?d?s +?d?d?l?l?s?s +?l?l?d?s?s +?u?s?l?s?d +?s?u?u?u?u?u +?l?l?l?l?s?l?l +?l?d?d?s?d?l +?l?d?d?s?l?d +?l?d?s?d?d?l +?u?l?d?d?d?d?s +?d?d?d?u?s?u +?d?s?l?l?d?d +?d?d?d?u?u?s +?u?d?d?d?d?d?s +?u?l?l?u?s +?d?d?d?d?d?d?l?s +?s?s?u?u?u +?u?l?l?u?d?d?d +?s?s?l?s?s +?l?l?d?s?l?l +?u?u?s?u?u?d +?d?d?s?s?l?l +?l?s?l?l?l?l?l +?u?s?u?l?l?l +?u?u?l?l?u?u +?d?s?s?s?s +?u?d?l?l?l?u +?u?u?u?u?l?d +?l?l?d?l?s?l +?u?d?d?d?u?u?u +?d?d?l?l?d?l?d +?l?l?l?d?d?s?d +?l?s?l?s?s +?l?l?l?s?d?s +?d?l?d?l?l?d?l +?d?l?d?l?d?l?d?l +?l?d?s?d?d?d?d +?s?d?d?d?d?d?l +?d?d?u?l?u?d?d +?d?l?l?d?d?d?l +?s?l?l?s?d?d +?u?u?u?d?l?l +?l?s?l?l?l?s +?l?s?s?l?l?l +?u?l?u?u?l?u +?d?l?l?d?l?l?l +?u?u?u?d?s?d +?l?d?l?l?s?d +?l?d?l?d?s?l +?s?l?l?l?d?d?d +?u?l?d?l?u?d +?d?d?l?l?u?u +?u?d?d?l?l?u +?l?d?l?u?d?l +?u?d?l?u?l?d +?u?s?l?l?l?d +?d?s?l?d?d?d +?d?u?d?s?d?d +?u?d?d?d?s?d +?d?d?d?l?d?s +?s?d?d?l?d?d +?d?u?d?d?d?s +?d?l?l?l?d?l?d +?l?d?s?l?d?s +?d?d?d?d?l?d?d?d?d +?s?l?l?l?d?s +?l?d?l?l?d?d?d?d +?d?d?u?u?d?l +?u?d?l?u?d?d +?u?u?d?d?l?d +?u?u?d?l?d?d +?d?l?l?d?d?u +?d?l?u?l?d?d +?u?d?u?d?d?l +?d?d?u?l?l?d +?u?d?d?d?u?l +?u?l?d?d?u?d +?d?u?l?d?l?d +?d?d?l?d?u?l +?u?l?u?u?l?d +?u?l?l?l?l?l?s +?d?u?l?l?l?l?l +?l?l?l?d?s?l +?s?l?l?l?l?l?l +?s?d?l?l?l?d +?l?l?d?l?d?s +?d?l?l?d?d?s +?l?s?d?d?l?l +?d?l?d?l?d?s +?l?d?d?l?s?d +?s?l?l?l?l?l?s +?d?d?l?d?l?l?l +?d?d?l?l?d?l?l +?d?l?d?d?l?l?l +?s?s?d?d?d?s +?s?l?d?d?d?d?d +?d?d?d?d?d?u?u?u +?d?l?d?l?l?l?d +?s?d?l?l?l?l?l +?l?l?l?s?l?d?d +?l?l?d?d?d?d?d?l +?l?l?l?d?u?u +?l?d?l?d?l?u +?l?u?l?d?u +?l?u?d?l?u +?u?l?u?d?u?d +?d?l?u?l?u +?u?d?l?l?u +?l?l?d?l?u +?l?d?l?l?l?u +?l?d?u?u?l +?d?d?u?l?l?u +?l?u?u?d?l +?l?u?u?d?u +?u?l?d?d?u?u +?d?u?l?l?d?l +?l?d?u?u?l?d +?u?d?l?l?u?d +?u?u?d?l?u +?d?l?l?u?u +?d?l?l?u?l +?d?l?u?u?u +?l?u?d?u?l +?u?d?l?u?l +?l?d?l?d?l?d?d?d +?s?s?s?d?d?d?d +?u?u?u?d?d?d?u +?l?l?l?d?d?d?d?s +?l?l?l?l?s?d?d?d +?l?s?s?s?d +?l?u?u?u?u?d?d +?l?l?l?s?l?s +?l?d?l?s?l?l +?l?s?l?s?d?d?d +?s?d?d?d?s?l +?s?s?l?d?d?d +?d?d?d?d?d?d?d?d?d?l +?u?d?d?d?d?l?l +?l?u?l?l?u?l +?l?l?u?u?u?d +?u?s?u?u?s +?u?s?s?u?u +?u?d?d?d?d?u?d +?d?d?d?d?d?l?u +?l?l?l?l?l?s?s +?d?l?l?l?s?l +?u?s?u?u?u?d +?u?d?d?u?d?d?u +?u?l?l?l?s?l +?u?u?d?d?s?s +?d?u?u?u?u?u?d +?l?d?l?u?l?l +?u?l?l?u?u?d +?u?u?u?d?u?u?u +?l?l?l?l?u?d?d +?u?d?d?l?l?d?d +?d?d?d?d?l?l?u +?d?d?l?d?l?l?d +?d?u?u?u?u?d?d +?d?l?s?l?l?l +?l?u?u?u?s +?u?s?l?l?u +?l?l?l?u?s +?d?l?l?s?l?l +?l?d?d?u?u?u +?u?l?u?d?d?l +?u?l?u?d?d?u +?l?d?d?u?l?l +?l?l?d?d?u?l +?u?u?l?d?l?d +?u?l?u?d?l?d +?d?d?l?u?l?l +?d?u?l?l?d?u +?u?u?u?u?u?u?u?d +?l?l?d?u?l?l +?u?l?l?d?l?u +?u?l?l?u?d?l +?d?l?l?u?l?l +?d?l?l?l?l?l?l?d +?u?l?l?s?d?d?d +?u?l?l?l?s?u +?s?s?l?l?d?d +?l?l?s?d?d?l +?d?d?l?l?s?l +?l?s?d?l?l?d +?l?l?s?d?l?d +?u?u?u?u?u?u?u?u +?d?l?l?d?l?d?l +?d?d?d?d?u?u?l +?l?d?d?l?d?l?d?d +?l?d?d?d?d?s?d +?d?d?d?d?d?s?u +?u?l?s?l?l?l +?s?s?s?s?d?d +?u?l?d?l?l?u +?l?s?l?s?l?l +?d?l?l?d?d?l?l +?l?l?l?d?d?s?s +?d?s?d?s?d?d?l +?s?l?d?l?d?d +?d?l?l?d?s?d +?d?l?d?d?l?s +?l?l?s?l?d?l +?s?l?l?l?d?l +?u?u?u?u?u?u?s +?u?d?d?d?d?l?d +?d?d?d?d?u?d?u +?u?l?l?d?u?l +?l?u?l?l?d?l +?l?d?l?d?s?s +?l?s?s?d?d?d +?d?l?l?d?d?d?d?d +?l?l?l?l?s?u +?u?d?u?d?l?l +?l?u?u?d?d?l +?l?l?d?u?u?d +?u?d?l?d?u?l +?u?u?u?d?l?d +?l?u?d?d?l?u +?l?u?d?l?l?d +?d?d?d?s?d?d?l +?u?u?d?d?u?u?u +?u?s?u?l?d +?u?l?s?l?d +?l?u?u?s?d +?u?s?u?d?u +?d?u?u?l?s +?l?d?d?s?l?l +?s?l?d?l?l +?u?d?u?u?s +?u?d?l?l?s +?l?u?l?d?s +?l?u?d?l?s +?d?u?s?u?u +?s?d?u?l?l +?s?l?d?l?d?l +?s?u?d?l?l +?u?s?l?l?d +?u?d?s?u?u +?u?u?s?d?u +?l?l?d?u?s +?s?u?d?u?l +?u?u?l?s?d +?l?u?l?s?d?d +?l?d?s?u?u +?l?d?s?l?d?l +?l?d?l?s?u +?l?l?d?d?s?l +?u?l?d?l?s +?u?l?u?l?l?u +?l?d?d?l?u?d +?d?l?u?d?l?d +?d?u?l?d?d?u +?l?l?d?d?u?d +?l?d?d?d?u?l +?l?d?d?d?u?u +?d?l?u?u?d?d +?d?l?l?l?d?d?l +?u?d?u?u?d?d?d +?l?u?d?d?l?d +?u?l?d?u?d?d +?d?d?l?u?l?d +?d?u?d?l?l?d +?l?d?u?d?d?l +?d?l?l?u?d?d +?d?d?u?d?u?l +?u?d?u?d?l?d +?u?l?l?l?l?l?l?d +?l?l?u?u?l?d +?u?l?u?u?u?d +?u?l?l?l?l?s?d +?u?l?l?s?l?l +?l?l?d?l?d?d?d?d +?l?l?d?s?d?d?d +?l?l?d?d?d?s?d +?d?d?l?l?d?d?s +?u?u?s?s?s +?s?l?l?s?s +?l?s?l?l?d?d?d +?s?l?s?l?d?d +?u?d?d?l?d?d?d +?l?s?s?s?s +?u?d?l?l?l?d?d +?l?l?l?d?l?l?l?l +?s?d?d?d?d?l?l +?d?d?l?l?d?d?l?l +?l?l?u?d?l?l +?d?d?l?l?l?d?l +?u?d?d?u?u?d?d +?d?u?d?u?d?u?d +?u?u?d?d?d?d?l +?u?l?u?l?d?d?d?d +?l?d?l?d?l?d?s +?u?s?l?s?u +?u?l?s?s?l +?l?s?u?s?l +?u?s?l?l?s +?u?s?l?s?l +?d?d?l?l?l?l?s +?s?l?d?d?l?l +?u?l?u?s?d?d +?d?l?d?l?s?l +?d?s?l?l?l?d +?d?l?l?d?l?s +?u?l?l?d?s?d +?l?l?d?d?d?d?u +?l?d?d?l?u?u +?u?u?l?d?d?l +?u?d?u?l?l?d +?l?u?d?d?l?l +?l?d?l?u?l?d +?l?u?l?d?d?l +?l?u?l?d?l?d +?l?d?d?l?d?d?l?d +?l?l?l?d?d?d?l?l +?s?d?u?l?l?l +?s?l?d?l?l?l +?d?l?d?l?d?d?d?d +?u?u?u?d?d?d?s +?d?s?d?d?d?d?l +?s?l?l?l?s?d +?l?l?l?d?u?l +?u?d?u?l?l?l +?l?u?d?l?l?l +?l?l?l?d?l?u +?d?d?d?d?u?d?d?d +?l?s?s?l?d?d +?s?s?d?d?l?l +?l?d?d?l?s?s +?u?u?u?s?s?s +?l?l?l?u?d?d?d +?s?u?l?l?l?s +?u?u?u?l?l?d?d +?u?d?l?l?d?d?d +?d?l?d?d?d?u +?l?d?d?d?u?d +?d?l?d?d?u?d +?l?d?u?d?d?d +?l?d?d?u?d?d?d +?d?d?u?d?l?d +?d?l?l?l?l?l?d?d +?l?u?u?u?d?d?d +?d?d?l?l?l?d?d?d?d +?u?u?u?d?d?d?d?d?d +?s?d?d?d?l?l?l +?u?l?d?u?l?l +?l?u?l?d?l?l +?l?l?l?u?d?l +?u?l?u?u?l?l +?u?l?l?u?l?u +?u?d?l?d?l?d?d +?u?u?d?d?u?d?d +?d?d?d?d?l?l?l?l?l +?l?s?d?d?s?d +?d?d?d?d?d?d?l?u +?u?l?s?u?l?l +?l?d?d?d?s?d?d +?d?s?u?u?u?u +?d?d?d?d?u?l?l?l +?d?s?d?d?s?s +?s?d?s?d?d?s +?l?u?d?d?d?d?d?d +?d?d?u?d?d?d?d?d +?l?d?d?d?d?d?l?l +?d?d?u?u?u?s +?u?l?l?l?d?d?s +?u?l?l?l?l?u?d +?u?l?l?u?l?l?d +?l?l?l?l?d?l?l?l +?s?s?s?l?l?l +?l?d?u?s?s +?s?l?s?u?d +?s?l?l?s?d +?l?s?s?d?l +?s?s?d?l?l +?u?d?s?s?u +?u?s?s?u?d +?l?d?s?l?s +?u?l?d?d?s?s +?u?l?d?s?s +?u?u?s?s?d +?s?s?l?d?l +?s?d?s?l?l +?s?u?d?u?s +?s?u?u?s?d +?s?s?l?l?d +?d?s?l?l?s +?s?s?u?d?u +?u?d?l?s?s +?u?u?d?u?u?u?u +?u?l?l?l?l?l?u +?l?l?d?l?l?u +?l?d?u?l?l?l +?s?d?d?d?u?u +?d?s?d?l?l?d +?u?d?l?s?d?d +?d?u?l?s?d?d +?d?d?s?l?l?d +?l?u?s?d?d?d +?u?l?d?s?d?d +?d?l?s?d?l?d +?u?d?d?u?s?d +?d?l?s?l?d?d +?d?d?l?d?l?s +?u?u?d?d?s?d +?d?d?u?l?d?d?d +?l?d?d?d?d?d?u +?d?d?u?d?u?d?d +?u?u?l?l?l?u +?u?d?l?l?l?s +?l?u?s?l?l +?l?u?s?l?u +?s?l?l?l?u +?s?l?l?d?l?l +?u?u?u?s?l +?u?l?s?u?u +?l?u?l?l?s +?l?l?s?l?u +?l?u?u?s?u +?u?u?u?u?u?s?d +?l?d?d?d?d?l?l?l +?d?l?l?d?u?u +?l?d?d?l?u?l +?l?l?l?d?u?d +?u?l?d?l?d?u +?d?d?l?l?u?l +?d?l?l?u?u?d +?d?l?u?u?d?l +?d?u?l?l?u?d +?l?l?d?d?l?u +?u?l?d?u?d?l +?d?u?d?l?l?l +?u?d?u?u?l?d +?u?d?d?l?u?l +?u?d?u?d?u?l +?l?d?u?l?d?l +?u?l?d?u?u?d +?d?l?d?d?d?l?l +?d?d?d?u?d?d?d?d +?u?d?u?d?u?d?u +?d?d?d?s?s?d?d +?d?d?s?d?d?d?l +?d?d?d?d?s?d?l +?l?d?d?d?d?s?s +?u?u?u?u?u?d?u +?u?l?d?l?u?l +?u?d?l?u?l?l +?l?u?l?u?l?d +?d?l?u?l?l?l +?l?d?u?u?u?u +?l?d?l?l?u?l +?l?u?l?l?l?u +?u?u?d?u?l?l +?d?u?l?l?l?u +?u?u?u?s?u?d +?d?u?u?u?u?s +?l?d?d?d?d?l?s +?u?d?d?l?d?d?u +?u?l?d?d?d?d?l +?l?l?d?d?d?d?d?d?d?d +?d?l?l?l?l?d?d?d +?u?l?u?l?l?d?d +?l?d?s?d?s?d?d +?u?s?s?s?u +?u?s?u?s?s +?u?l?u?u?u?u +?s?u?l?l?l?l +?l?l?s?l?d?d?d +?l?s?d?d?s?l +?l?s?d?l?s?d +?u?u?s?s?d?d +?d?u?l?l?l?l?d +?d?d?l?d?d?d?d?l +?d?d?d?d?l?d?d?l +?s?d?d?u?u?u +?u?l?u?d?d?s +?u?l?d?d?l?s +?u?d?u?d?u?s +?l?d?s?l?l?d +?d?l?d?l?l?s +?d?d?u?l?l?s +?u?d?u?u?u?d?d +?d?d?d?d?u?u?d?d +?d?d?d?u?u?u?d +?u?l?d?d?l?d?d +?d?d?d?s?d?s?d +?u?u?l?l?d?d?d?d +?u?d?l?l?l?l?l +?u?u?u?d?d?u?u +?u?u?d?u?u?d?d +?l?l?u?u?d?d?d +?l?u?l?l?u?d +?d?u?u?l?l?l +?d?d?d?s?d?u +?s?d?d?d?l?d +?d?u?d?d?s?d +?d?l?d?d?s?d +?s?d?d?u?d?d +?d?s?d?d?d?l +?d?l?s?d?d?d?d +?d?s?d?d?l?d +?d?d?u?d?s?d +?l?d?d?l?d?d?s +?l?l?l?l?d?d?l?l +?d?d?u?d?l?l +?d?d?u?u?l?d +?l?l?l?d?d?d?u +?d?d?l?u?d?l +?l?d?d?u?l?d +?d?d?l?l?d?u +?d?l?d?u?u?d +?d?u?u?d?l?d +?d?d?l?l?u?d +?l?u?d?d?u?d +?d?d?u?l?d?u +?d?l?d?u?d?u +?d?l?d?d?l?u +?d?l?d?l?d?u +?d?l?d?d?u?l +?d?l?u?d?u?d +?d?l?l?d?u?d +?l?u?d?d?d?l +?l?d?d?l?d?u +?u?l?l?d?d?d?s +?d?l?d?l?u?d +?u?d?d?l?u?d +?d?d?u?d?l?u +?d?u?d?d?l?l +?s?d?d?l?l?l?l +?l?l?u?l?l?u +?l?l?s?d?d?d?d?d +?d?d?d?s?d?l?l +?l?s?l?s?l?d?d +?u?u?u?d?d?d?l +?s?d?d?d?s?s +?d?d?d?d?s?s?d +?d?s?d?s?d?d?d +?u?l?l?u?u?u +?u?u?d?d?d?d?d?d?d +?l?l?s?l?s?d +?l?d?l?l?s?s +?d?l?l?l?s?s +?l?s?l?l?s?d +?u?s?u?s?u?d +?l?l?d?u?d?l +?d?l?l?l?u?d +?l?l?d?u?l?d +?d?u?u?u?l?l +?u?u?d?d?u?l +?d?d?u?l?u?u +?d?l?l?d?l?u +?d?d?l?u?u?u +?l?l?u?d?d?l +?d?l?u?l?l?d +?d?l?d?l?l?u +?u?l?d?u?l?u +?l?d?u?u?d?u +?u?u?u?u?d?l +?u?l?u?l?d?l +?l?l?d?l?u?d +?l?l?u?l?d?l +?l?u?d?l?d?u +?l?u?d?l?d?l +?l?u?l?d?d?u +?d?l?d?l?u?l +?u?u?u?u?d?u?u +?u?d?d?d?l?l?l +?s?u?u?d?d?s +?l?s?l?d?d?s +?l?l?l?l?d?d?d?l +?l?l?l?l?l?d?d?l +?u?l?l?d?l?l?l +?u?l?l?l?l?d?l +?u?l?l?l?d?l?l +?d?d?d?d?l?u?l +?u?l?d?d?d?d?u +?d?d?d?d?d?d?u?d +?l?l?d?d?d?s?s +?s?s?l?d?s +?l?d?s?s?s +?s?l?s?s?d +?s?l?d?s?s +?s?d?s?l?s +?s?s?s?u?d +?l?u?u?u?u?l +?u?u?u?u?d?d?s +?l?l?l?l?d?d?d?s +?s?s?d?d?d?l +?d?d?d?d?s?s?l +?d?d?d?s?l?s +?d?d?d?l?s?s +?u?d?d?d?s?s +?d?d?d?s?s?l +?l?s?d?d?s?d?d +?u?u?d?d?d?l?l +?l?l?l?d?l?l?l?d +?s?d?l?l?l?s +?l?l?s?l?s?l +?u?s?s?l?l +?u?s?u?s?l +?l?l?l?u?u?l +?d?l?d?d?d?l?d?d +?s?d?l?l?d?l +?u?l?s?l?d?d +?s?u?l?l?d?d +?l?l?d?l?s?d +?l?d?l?s?d?l +?d?d?d?d?s?u?u +?l?l?l?s?s?d?d +?s?s?d?d?d?d?d?d +?l?s?l?l?l?l?d +?s?l?l?s?l?l +?d?d?d?d?d?l?d?l +?l?d?d?d?d?d?l?d +?u?l?l?l?u?s +?d?d?d?d?d?l?l?l?l +?d?d?s?s?s?s +?d?l?u?u?u?u +?u?u?u?l?d?l +?u?u?l?l?u?d +?u?l?d?u?u?l +?d?d?d?u?u?d?d?d +?l?d?d?l?d?d?l?d?d +?u?l?l?u?l?l?l +?u?s?l?l?d?l +?d?u?l?l?l?s +?d?d?d?d?u?u?s +?s?s?s?l?s +?l?l?d?d?l?d?d?d +?l?u?u?l?l?l +?u?l?l?u?u?l +?u?l?u?l?u?u +?l?d?d?l?l?d?d?d +?l?l?s?s?s?s +?u?u?l?l?l?l?d +?u?l?l?l?u?l?l +?l?l?l?l?l?l?l?l?l +?u?l?l?u?l?d?d +?u?l?d?d?l?l?l +?s?l?d?d?l?s +?l?l?l?s?d?d?s +?d?d?d?d?l?d?l?d +?u?l?u?l?u?s +?u?l?d?l?l?d?d +?l?l?l?l?l?d?d?s +?d?d?d?s?d?l?d +?d?d?d?l?d?d?s +?l?l?l?l?l?l?d?l +?u?u?u?d?u?s +?u?l?u?l?s?d +?l?u?u?l?l?d +?u?u?l?l?d?l +?d?l?l?u?u?l +?l?l?d?u?u?u +?u?l?u?l?d?u +?s?l?l?l?d?d?s +?s?d?d?d?s?d?d +?u?d?d?d?u?d?d?d +?u?l?d?l?l?l?l +?l?l?d?d?d?l?l?l +?u?d?l?d?u?d?d +?u?u?u?l?u?u +?l?d?l?l?l?d?d?d +?s?s?l?l?s?s +?s?d?u?u?d?d +?d?d?d?s?u?l +?d?d?l?l?d?s +?d?d?s?l?d?l +?d?d?d?u?l?s +?u?l?d?d?s?d +?u?d?d?d?u?s +?d?l?d?s?l?d +?l?u?d?d?d?s +?l?d?s?d?l?d +?s?l?d?d?d?l +?s?d?l?d?l?d +?d?d?d?s?l?u +?d?d?d?d?s?l?l?l +?u?d?d?d?l?d?d +?u?u?u?l?l?l?d +?s?l?s?d?d?d?d +?d?l?d?l?d?l?s +?l?l?l?l?l?l?s?d +?l?l?d?u?d?u +?u?u?l?d?d?u +?l?u?d?l?u?d +?d?l?d?u?u?u +?d?u?u?u?d?l +?l?d?u?d?l?u +?l?d?u?d?l?l +?l?u?d?d?u?l +?d?l?u?l?d?l +?u?l?d?d?d?l?l +?l?d?d?l?l?u +?d?u?l?d?l?l +?d?u?d?l?l?u +?l?d?l?d?u?u +?l?d?l?d?u?l +?d?l?l?u?d?l +?l?d?u?l?l?d +?l?d?u?d?u?l +?l?d?l?u?u?d +?u?d?u?l?d?l +?d?l?l?l?d?u +?l?l?l?l?l?l?u +?l?l?u?u?u?l +?u?l?l?d?d?l?l +?u?l?l?l?d?d?l +?d?s?l?l?l?l?l +?u?l?u?l?u?l?u +?l?l?d?s?d?l +?u?d?l?d?l?s +?u?u?l?s?d?d +?s?l?d?l?l?d +?d?l?l?l?l?l?s +?d?d?l?s?l?l +?u?d?d?l?s?l +?l?d?s?d?l?l +?l?l?d?d?l?l?l?l +?u?u?u?u?d?u?d +?s?l?l?l?l?l?d +?u?d?u?d?d?u?d +?d?d?d?d?u?s?u +?u?u?u?u?d?d?u +?s?s?s?d?s +?s?s?d?s?s +?s?d?s?s?s +?d?l?d?d?l?d?d?l +?l?l?u?d?u?l +?d?l?l?l?u?l +?u?u?l?d?u?u +?l?u?u?d?l?l +?l?u?d?u?u?u +?l?l?d?l?l?d?d?d +?l?l?d?l?s?s +?l?d?l?s?l?s +?s?s?d?s?d?d +?d?s?s?s?d?d +?d?d?s?s?d?s +?d?d?d?s?d?d?s +?d?d?s?s?d?d?d +?s?l?s?s?l +?l?s?s?l?s +?u?s?l?s?s +?u?l?l?d?d?d?d?d?d +?u?d?u?u?u?u?u +?u?l?l?l?l?l?l?l +?l?u?l?l?l?d?d +?l?l?l?l?l?d?l?d +?d?d?d?d?d?u?s +?d?d?l?s?l?s +?d?l?s?d?l?s +?s?l?d?l?d?s +?d?l?l?d?s?s +?u?l?s?s?d?d +?d?d?u?u?d?d?d?d +?l?l?l?l?l?u?d +?u?l?l?d?d?d?l +?l?l?l?l?l?d?l?l +?u?u?u?u?l?u +?l?d?d?d?l?l?d?d +?l?d?l?d?s?d?d +?s?l?s?l?l?l +?d?d?d?d?d?d?d?d?l?l +?u?l?l?l?l?d?d?d?d +?u?u?d?u?d?d?d +?u?d?d?l?d?d?l +?d?d?d?l?l?l?d?d?d +?u?s?u?u?d?u +?u?l?l?s?l?d +?u?u?u?l?d?d?d +?u?l?u?l?u?l?d +?l?l?l?u?l?u +?d?d?d?s?u?u?u +?u?d?d?l?l?l?l +?u?d?d?d?d?d?d?d?u +?l?l?l?d?d?l?d?d +?l?l?l?l?l?l?l?l?d +?u?d?u?u?d?u?d +?l?l?l?l?u?s +?d?d?s?l?l?d?d +?l?d?l?s?d?d?d +?u?s?l?d?d?d?d +?d?d?l?l?s?d?d +?u?u?l?l?d?u +?d?u?u?u?u?l +?d?l?l?l?u?u +?d?u?l?u?l?l +?u?d?l?l?u?l +?u?l?u?d?l?l +?u?l?u?d?u?l +?d?l?l?u?l?u +?l?u?u?d?l?u +?l?l?d?l?u?l +?u?u?u?d?l?u +?l?u?l?d?l?u +?l?l?d?d?d?l?d?d +?l?d?d?d?d?d?d?u +?u?s?d?d?d?d?d?d +?u?u?l?l?l?l?l +?u?l?u?d?d?d?d?d +?u?u?u?l?l?u +?u?d?l?d?l?d?l +?l?l?u?l?l?d?d +?l?l?l?l?l?l?l?s +?u?d?d?u?d?u?d +?d?d?u?d?d?l?d +?d?u?l?d?d?d?d +?d?d?l?d?l?d?d?d +?d?d?u?d?d?d?u +?l?d?d?l?l?l?d?d +?d?d?d?d?d?d?d?u?u +?u?d?d?d?d?d?d?s +?s?s?l?l?l?d +?l?s?l?d?l?s +?u?s?d?l?l?l +?u?u?u?s?u?u?u +?l?l?l?l?d?d?d?d?d?d +?l?d?l?l?d?l?d?d +?u?d?l?l?d?l?d +?d?d?l?s?d?d?l +?d?d?l?s?l?d?d +?d?d?d?u?u?u?u?u +?u?u?u?u?u?d?d?d?d +?s?l?l?l?s?d?d +?d?d?d?l?d?l?d?d +?d?d?l?d?d?d?l?d +?s?u?d?d?d?s +?l?d?s?d?s?d +?l?d?s?d?d?s +?d?l?d?d?s?s +?u?d?s?d?s?d +?d?s?l?s?d?d +?u?d?s?s?d?d +?u?s?d?d?s?d +?d?d?u?u?u?u?d?d +?u?u?u?d?u?d?d +?d?d?d?d?s?l?d +?d?d?l?s?d?d?d +?d?d?s?d?d?l?d +?u?l?l?l?d?l?d +?s?l?l?l?s?s +?d?l?d?d?l?d?d?d +?s?l?l?d?d?l +?u?l?s?d?d?u +?l?s?d?l?d?l +?s?l?l?d?l?d +?u?l?s?u?d?d +?l?u?u?s?d?d +?d?l?s?l?d?l +?u?d?l?l?d?s +?s?d?l?d?l?l +?d?u?d?l?d?u?d +?u?l?d?l?d?d?d +?l?u?u?u?u?u?d +?d?d?s?l?l?s +?s?d?l?l?s?d +?d?d?s?l?s?l +?u?s?l?s?d?d +?d?l?s?l?s?d +?d?u?l?l?l?d?d +?d?l?d?l?d?l?d?d +?d?d?d?d?d?d?d?s?d +?u?l?d?l?u?u +?l?d?l?u?u?l +?d?u?l?u?l?u +?u?d?u?u?u?l +?l?u?u?u?l?d +?l?l?l?u?u?d?d +?u?l?l?u?d?u +?l?u?l?u?d?l +?l?d?l?u?l?u +?u?u?l?d?l?l +?l?d?u?u?l?l +?u?d?l?l?u?u +?l?l?l?u?d?u +?l?u?l?u?u?d +?d?d?s?d?d?s?l +?l?s?d?d?d?d?s +?s?l?d?d?d?d?s +?d?d?d?l?l?l?l?d +?l?s?d?l?l?l?l +?u?d?l?l?l?l?d +?u?s?u?l?u +?s?l?u?l?l +?u?l?d?l?l?s +?l?s?u?l?l +?u?d?u?u?u?s +?s?l?l?u?u +?u?s?u?u?l +?u?l?u?u?s +?u?s?l?u?l +?l?s?l?l?u +?u?l?s?l?u +?l?l?u?l?s +?u?u?l?s?l +?l?l?s?u?l +?u?s?u?l?l?d +?l?u?l?u?s +?l?s?l?u?l +?l?u?u?s?l +?u?l?u?s?u +?d?s?u?l?l?l +?u?l?u?s?l +?u?l?l?d?l?d?d +?u?u?d?u?d?l +?l?l?u?d?d?u +?u?u?d?l?d?l +?u?u?d?l?d?u +?l?l?d?l?d?u +?l?l?u?d?l?d +?d?d?u?u?u?l +?d?d?l?u?u?l +?d?u?u?d?l?l +?u?u?d?l?u?d +?u?d?l?d?l?l?d +?u?l?d?d?d?u?l +?u?d?u?u?d?l +?d?u?u?l?l?d +?l?u?d?u?l?d +?d?l?l?d?u?l +?d?u?l?d?l?u +?u?d?u?d?u?u?d +?d?l?u?u?u?d +?u?d?d?u?l?u +?d?l?d?l?u?u +?u?l?l?s?d?d?d?d +?s?d?d?d?d?d?d?d?d +?s?l?s?s?s +?l?l?l?l?d?d?u +?l?u?l?u?l?l +?u?u?l?l?u?l +?d?s?d?d?d?s?d +?s?d?d?s?d?d?d +?s?d?s?d?d?d?d +?d?d?d?d?d?d?s?d?d +?l?l?l?l?d?l?d?d +?l?l?l?d?d?s?d?d +?l?d?l?l?l?l?d?d +?d?l?d?d?d?d?l?d +?l?u?l?u?d?d?d +?l?d?l?l?l?l?l?l +?l?l?d?d?d?d?l?d +?d?d?l?l?l?l?l?d +?l?d?d?s?d?d?l +?l?d?l?d?d?d?s +?s?l?l?d?l?s +?u?d?d?l?d?l?d +?l?l?l?l?s?l?d +?l?l?l?l?s?s?s +?l?d?d?l?l?d?d?l +?l?l?s?l?l?l?d +?l?u?u?l?u?u +?l?u?u?u?l?l +?u?u?l?u?l?l +?l?l?l?d?l?d?d?d +?l?l?d?d?d?d?d?s +?u?l?l?l?l?d?s +?l?l?d?l?l?l?l?l +?l?l?s?s?d?d?d +?u?l?l?u?d?d?d?d +?d?l?d?d?d?d?d?l +?s?l?d?d?d?d?d?d +?s?u?d?d?d?d?d?d +?s?d?d?d?d?d?d?l +?l?l?l?s?l?l?d +?s?d?d?d?d?s?l +?u?u?u?l?l?l?l +?u?d?d?u?u?u?u +?s?u?u?u?u?d +?u?l?l?d?l?s +?u?s?d?u?u?u +?d?d?d?d?d?d?s?u +?d?d?u?d?d?u?d +?d?d?d?d?u?d?l +?s?s?d?s?s?d +?d?d?s?d?s?d?d?d?d +?l?u?u?u?d?u +?l?u?u?u?d?l +?u?u?u?d?u?l +?u?u?l?u?d?u +?l?u?l?d?u?l +?u?l?l?d?u?u +?u?u?d?u?u?l +?d?u?l?l?u?l +?u?d?l?u?l?u +?l?u?d?u?u?l +?u?d?u?u?l?l +?u?l?d?u?u?u +?d?d?s?l?d?d?d +?d?s?l?d?d?d?d +?u?u?d?d?s?d?d +?d?l?d?s?d?d?d +?l?s?d?d?d?d?l +?l?d?d?d?d?s?l +?d?d?d?d?l?s?d +?l?u?l?u?l?d?d +?d?d?d?d?d?u?l?d +?s?l?d?l?l?s +?s?s?d?l?l?l +?l?l?d?l?l?l?d?d +?d?u?d?u?l?d +?l?d?d?u?u?d +?d?u?l?d?d?l +?l?d?d?d?l?u +?l?d?u?u?d?d +?d?d?u?l?u?d +?l?d?d?u?d?l +?l?u?d?d?d?u +?d?u?u?d?d?l +?l?d?l?d?d?u +?u?d?d?u?d?l +?l?u?d?u?d?d +?u?u?d?d?u?u?d +?l?d?l?d?u?d +?d?d?l?u?u?d +?d?u?d?l?u?d +?d?l?u?d?d?l +?d?u?d?d?l?u +?l?d?d?u?d?u +?d?d?d?d?s?l?s +?u?u?d?d?d?d?u?u +?u?d?u?d?d?d?d?d +?u?d?u?d?u?d?u?d +?d?s?d?s?s?d +?s?d?d?s?s?d +?s?d?d?s?d?s +?s?d?d?d?d?s?d +?u?u?l?u?u?l +?u?l?u?l?l?l?l +?l?u?l?u?u?l +?l?l?u?l?d?d?d +?u?d?l?d?u?d?l +?u?l?d?l?d?l?d +?l?u?l?l?d?d?d +?d?s?d?l?l?l?l +?s?d?l?l?d?s +?s?d?d?s?l?l +?s?l?l?d?s?d +?s?d?l?s?d?l +?d?s?l?l?s?d +?l?s?l?d?s?d +?s?d?l?d?l?s +?l?s?d?s?l?d +?l?l?l?d?d?d?d?d?d?d +?d?l?d?s?d?l?d +?d?d?l?d?d?l?s +?d?d?d?d?s?u?l +?u?d?d?s?u?d?d +?l?d?l?l?s?d?d +?u?u?l?l?s?d +?u?s?l?d?l?l +?u?l?s?l?l?d +?l?s?s?d?d?d?d +?l?u?u?u?u?u?u +?l?d?l?d?l?l?d?d +?d?d?d?u?u?l?l +?u?s?u?l?s +?s?l?s?u?l +?s?l?l?s?u +?l?s?u?l?s +?l?l?s?s?u +?l?s?l?s?u +?l?l?s?d?s?l +?s?u?l?u?s +?s?u?u?s?u +?l?s?l?l?d?s +?l?l?s?u?s +?u?u?s?u?s +?s?s?u?l?u +?u?l?u?s?s +?l?l?l?l?l?l?d?d?d?d +?l?u?l?u?u?u +?l?l?d?s?l?d +?u?u?d?d?s?u +?s?d?d?u?l?l +?d?s?d?u?u?u +?d?l?l?s?d?l +?u?d?s?l?d?l +?u?s?d?l?d?l +?u?s?l?d?l?d +?u?d?l?d?s?l +?u?d?u?s?u?d +?l?d?d?l?s?l +?u?d?u?u?d?s +?l?u?l?d?d?s +?d?d?u?d?d?u?u +?u?d?d?l?u?d?d +?l?u?u?u?u?s +?l?l?l?d?l?l?d?d +?l?d?d?d?l?l?l?l +?l?s?l?s?l?s?l +?l?d?d?d?l?d?d?l +?s?s?s?d?d?s +?d?d?d?s?d?d?d?s +?l?d?l?l?u?u +?l?d?l?u?u?u +?u?d?u?l?l?u +?d?u?l?u?u?l +?u?d?u?l?u?l +?u?u?u?l?u?d +?u?u?l?u?u?d +?u?u?l?d?u?l +?l?u?u?l?d?l +?u?l?u?u?d?l +?u?l?u?u?d?u +?u?u?u?l?d?u +?u?l?u?d?u?u +?u?d?l?u?u?u +?u?d?u?l?u?u +?u?u?d?d?l?l?l +?d?d?l?l?l?l?l?d?d +?d?d?d?u?l?u?l +?l?s?l?d?d?d?d?d +?d?d?d?d?d?d?l?d?d +?s?l?s?l?s?l +?u?d?l?l?d?l?l +?u?l?u?l?l?l?d +?u?u?l?u?u?u +?u?s?l?l?l?d?d +?l?d?d?l?l?l?l?l +?d?d?u?l?l?l?d?d +?u?l?u?u?d?d?d +?l?l?l?u?l?d?d +?l?d?d?l?d?d?d?l +?d?d?d?d?d?d?d?l?d +?u?d?d?u?d?d?d?d +?s?d?d?d?d?s?s +?d?d?d?d?d?u?l?l +?s?s?d?d?d?s?s +?s?d?s?l?l?l +?l?s?l?s?d?l +?l?s?s?l?l?d +?u?d?s?d?d?d?d +?u?d?d?d?s?d?d +?s?d?d?d?d?d?u +?l?u?u?u?s?d +?u?d?l?s?l?l +?l?l?d?d?l?l?s +?u?u?d?u?u?s +?d?d?d?d?l?l?l?s +?u?d?u?u?u?u?d +?d?u?d?d?d?d?d?d +?d?d?s?d?d?d?s +?d?d?s?l?s?d?d +?d?d?d?d?s?d?s +?u?l?l?s?u?l +?d?d?u?d?u?d?u +?d?d?l?d?l?d?d?l +?l?l?u?l?u?l +?u?u?d?d?u?u?d?d +?l?s?l?s?s?d +?u?u?u?s?d?d?d?d +?s?u?u?d?d?d +?s?d?d?u?l?d +?s?d?d?d?u?l +?d?s?u?l?d?d +?l?d?d?d?s?u +?u?d?s?d?d?l +?u?d?u?d?s?d +?u?d?u?d?d?s +?u?d?d?s?l?d +?d?d?s?u?l?d +?u?d?s?d?l?d +?d?d?l?s?l?d +?u?d?s?l?d?d +?u?s?d?d?u?d +?d?s?u?u?d?d +?u?s?d?d?d?l +?d?l?d?s?d?l +?u?d?d?d?s?u +?u?d?d?l?d?s +?u?s?d?l?d?d +?d?s?d?d?u?u +?d?s?d?l?d?l +?u?s?d?d?l?d +?l?s?d?d?l?d +?d?d?l?d?s?l +?s?l?u?d?d?d +?u?s?d?u?d?d +?d?u?s?d?d?l +?l?d?d?d?u?s +?u?d?d?d?s?l +?u?d?d?s?d?u +?u?d?s?u?d?d +?d?d?d?s?l?l?d +?d?l?d?l?s?d +?s?u?l?d?d?d +?s?d?d?l?d?l +?u?d?d?d?l?s +?d?d?s?u?u?d +?u?d?u?s?d?d +?s?l?d?d?l?d +?d?s?d?d?d?l?l +?u?d?d?u?d?s +?u?d?d?s?u?d +?l?s?u?d?d?d +?d?u?u?s?d?d +?s?d?d?l?l?d +?d?s?l?d?d?l +?s?u?d?u?d?d +?d?d?d?u?s?l +?d?d?l?s?d?l +?d?u?d?u?s?d +?d?d?d?d?u?l?s +?d?d?d?d?d?d?u?u?u +?l?d?l?l?l?l?s +?s?d?d?s?d?d?s +?d?u?d?d?d?d?u +?d?d?d?d?l?u?d +?d?d?d?l?d?d?u +?d?d?d?u?l?d?d +?d?d?d?d?u?l?d +?d?d?u?d?d?d?l +?l?d?d?d?s?d?d?d +?s?l?l?l?s?l +?u?u?s?s?u?u +?l?l?d?d?d?d?d?d?l +?d?u?l?u?d?l +?l?u?u?d?d?u +?d?l?u?d?l?l +?u?d?l?u?d?u +?d?u?d?u?l?l +?l?d?d?u?u?l +?d?l?d?u?l?l +?u?d?u?d?l?u +?d?u?l?u?u?d +?l?u?d?u?d?l +?l?u?d?u?d?u +?d?l?d?u?u?l +?u?d?l?u?u?d +?u?d?u?l?u?d +?d?l?u?l?u?d +?d?u?u?d?l?u +?l?d?u?u?u?d +?d?d?d?l?l?l?u +?l?d?u?u?d?l +?u?u?d?d?l?u +?l?d?l?l?u?d +?u?l?d?u?d?u +?d?l?u?d?u?l +?d?d?l?u?l?u +?d?d?u?u?u?u?d +?d?l?u?u?l?d +?d?l?d?u?l?u +?d?u?l?d?u?l +?d?u?d?l?u?l +?l?d?l?l?d?l?s +?u?d?d?u?u?l +?l?u?u?d?l?d +?d?d?d?l?l?d?d?l +?d?d?d?d?d?d?u?s +?d?d?d?u?u?u?s +?u?l?d?l?l?d?l +?d?d?u?d?d?u?d?d +?d?d?d?l?d?d?l?d +?l?l?l?d?d?d?l?d +?l?s?d?s?d?s +?s?s?s?l?d?d +?u?l?l?d?u?l?l +?l?d?d?d?l?d?l?d +?l?l?l?l?s?s?d +?s?d?d?s?s?s +?u?u?d?l?l?u +?d?u?u?u?l?u +?l?u?u?u?l?u +?l?l?u?l?u?d +?l?u?u?d?u?u +?d?l?u?l?l?u +?l?u?l?l?d?u +?u?l?d?l?l?l?d +?d?l?u?u?l?l +?d?l?l?u?u?u +?l?l?d?u?u?l +?l?u?u?l?d?u +?u?d?l?l?l?d?l +?l?u?d?u?l?l +?l?l?d?l?u?u +?l?l?u?l?d?u +?u?l?u?d?l?u +?u?d?u?u?l?u +?l?d?u?l?l?u +?l?l?u?u?d?l +?l?l?u?u?d?u +?l?u?d?l?l?u +?u?u?d?l?u?u +?l?s?s?l?d?l +?l?l?s?s?l?d +?u?u?u?s?s?d +?u?u?u?s?d?s +?l?l?l?s?d?d?l +?l?l?s?d?d?l?l +?l?s?l?d?l?l?l +?d?d?d?d?l?l?d?l +?u?d?d?d?l?d?d?d +?u?d?u?u?d?u?u +?u?s?s?u?s +?u?l?s?s?s +?l?s?s?s?u +?s?u?s?u?s +?s?s?l?s?l +?s?s?s?u?u +?u?l?s?d?d?s +?d?s?l?d?s?l +?l?l?s?d?s?d +?l?u?s?d?d?s +?u?u?s?d?d?s +?u?d?u?d?s?s +?d?s?d?s?l?l +?s?u?u?s?d?d +?s?l?l?d?d?d?s +?u?s?d?u?s?d +?u?s?s?u?d?d +?d?d?u?u?s?s +?u?s?u?d?s?d +?l?d?l?s?d?s +?u?l?d?d?d?d?d?d?d +?l?d?s?l?d?d?d +?d?l?l?d?d?d?s +?d?d?l?l?d?d?d?l +?u?u?d?d?l?d?d +?d?d?u?d?u?u?d +?d?d?l?l?u?d?d +?d?u?d?l?d?l?d +?d?u?l?l?d?d?d +?u?d?u?d?d?d?u +?d?d?u?u?d?d?u +?u?u?s?u?u?d?d +?l?l?d?d?s?l?l +?u?u?u?d?d?l?l +?u?u?d?l?l?l?l +?d?d?d?d?s?s?d?d +?d?d?s?d?d?d?d?d?d +?l?l?s?d?d?d?s +?l?d?d?d?d?l?l?d +?l?d?l?d?l?d?l?l +?d?d?d?d?l?s?s +?l?u?u?l?l?u +?l?u?u?l?u?l +?u?d?l?d?l?l?l +?l?l?u?u?u?d?d +?d?d?d?s?s?d?d?d +?u?u?s?u?u?u?u +?l?d?d?l?d?d?l?l +?d?d?d?d?d?d?d?d?d?d?d?d +?d?d?d?d?d?u?d?d +?u?u?s?l?l?l +?u?u?l?l?l?s +?u?u?u?s?s?u +?s?s?l?l?l?s +?l?l?s?d?d?d?l +?s?s?s?s?s?l +?d?d?d?s?d?d?d?l +?d?d?d?l?l?u?u +?l?l?d?d?d?u?u +?u?l?d?d?l?l?d +?u?d?u?d?u?u?u +?d?s?s?d?d?d?d +?d?d?u?u?u?u?u?u +?s?l?s?l?l?d +?s?l?s?l?d?l +?u?l?l?d?s?s +?d?d?d?d?l?l?l?d?d +?d?d?l?d?d?l?d?l +?l?s?s?s?s?s +?l?l?l?l?d?l?s +?l?l?l?d?d?u?u +?u?u?s?u?u?s +?u?l?u?l?s?s +?l?l?d?d?d?l?l?d +?u?l?d?d?s?d?d +?s?d?d?l?l?d?d +?d?d?d?d?d?s?l?l +?d?s?d?l?l?d?d +?s?u?u?d?d?d?d +?d?d?d?l?l?s?d +?d?l?l?d?l?d?d?d +?l?l?u?u?l?u +?l?u?l?l?u?u +?u?d?d?d?d?u?d?d +?s?d?d?l?d?s +?s?d?d?d?l?s +?l?d?d?s?d?d?s +?u?s?d?d?s?d?d +?s?d?d?s?l?d +?l?d?d?s?d?s +?d?d?l?d?s?s +?d?d?s?l?s?d +?d?s?d?l?s?d +?s?s?d?l?d?d +?d?s?d?d?s?u +?d?s?d?s?d?l +?u?d?d?s?d?s +?d?s?s?l?d?d +?s?d?l?d?s?d +?s?u?s?d?d?d +?s?d?d?d?s?u +?d?u?s?s?d?d +?d?s?d?d?s?l +?s?d?l?d?d?s +?d?s?d?d?u?s +?d?d?s?l?d?s +?d?d?s?d?s?l +?u?s?s?d?d?d +?l?d?d?s?s?d +?d?d?d?l?d?d?l?l +?d?d?d?s?l?l?l?l +?u?d?l?l?d?d?l +?d?l?d?d?d?d?s +?u?d?d?s?d?d?d +?d?d?l?d?d?d?s +?s?d?d?d?l?d?d +?d?d?d?l?s?d?d +?u?d?d?d?d?s?d +?d?s?d?d?l?d?d +?d?d?d?s?l?d?d +?d?d?s?d?l?d?d +?s?s?s?s?l?l +?d?d?l?d?d?l?d?d?l +?l?l?l?l?d?l?l?d +?u?u?u?u?l?d?d +?u?l?l?u?u?d?d +?u?u?d?u?d?s +?l?d?l?s?d?u +?u?l?s?d?d?l +?l?s?l?u?d?d +?u?u?l?d?d?s +?d?l?s?l?l?d +?s?u?d?u?u?d +?u?d?s?d?l?l +?u?l?s?d?u?d +?u?u?s?d?d?u +?u?l?d?s?d?l +?u?s?d?d?l?l +?u?d?u?d?s?u +?u?d?d?l?l?s +?l?l?d?d?u?s +?u?u?d?u?s?d +?d?d?s?u?l?l +?d?l?s?d?l?l +?s?l?u?d?l?d +?u?l?d?s?u?d +?s?l?u?l?d?d +?u?s?l?d?d?l +?l?d?u?s?l?d +?s?u?d?l?d?l +?d?s?l?l?d?l +?u?d?l?l?s?d +?d?l?d?l?u?s +?d?l?l?s?l?d +?d?u?s?u?d?u +?l?d?s?d?d?s?d?d +?l?d?d?u?l?d?d +?u?d?l?d?d?l?d +?d?d?u?d?d?l?l +?u?d?d?u?l?d?d +?d?d?d?u?l?l?d +?u?u?d?d?d?u?d +?l?d?d?u?d?d?l +?d?d?u?u?d?d?l +?u?d?d?d?u?d?u +?d?d?d?u?l?d?d?d +?u?d?d?l?d?d?d?d +?u?u?u?u?l?l?l +?s?d?d?d?s?d?d?d +?d?d?d?l?l?s?s +?u?s?u?s?d?d?d +?l?l?d?d?l?d?d?l +?u?l?l?s?u?l?l +?d?l?l?l?d?l?l?l +?u?l?u?l?s?d?d +?l?d?l?l?l?d?l?l +?d?s?d?s?s?s +?l?l?u?d?u?u +?l?u?u?l?u?d +?l?l?u?d?l?u +?u?u?d?u?u?d?u +?l?d?u?l?u?u +?d?u?u?l?l?u +?l?u?d?u?l?u +?u?u?l?d?l?u +?u?u?d?u?l?u +?u?l?l?l?d?d?u +?u?d?l?l?d?d?d?d +?s?s?l?l?l?d?d +?l?l?d?l?l?l?s +?u?s?u?l?d?l +?u?l?u?l?d?s +?u?s?u?d?u?u +?s?u?l?l?l?d +?l?d?l?d?d?d?d?l +?u?d?u?u?u?d?u +?l?d?l?d?l?d?d?l +?u?l?d?d?l?d?l +?d?l?l?l?s?d?d +?u?s?l?l?d?d?d +?s?l?l?l?d?d?d?d +?d?d?d?l?l?d?d?d?d +?l?l?l?l?l?u?u +?s?s?u?s?s +?s?u?s?s?s +?l?l?l?l?u?u?u +?l?l?d?l?d?l?d?d +?u?s?s?l?l?l +?u?s?l?l?s?l +?s?s?s?d?d?l +?u?s?s?s?d?d +?l?s?s?s?d?d +?u?l?l?d?l?l?d +?u?l?u?u?l?d?d +?d?u?u?u?u?d?u +?l?l?u?u?l?d?d +?u?u?u?d?u?u?d +?l?l?l?d?l?l?s +?d?d?d?d?l?d?l?l +?s?d?d?l?d?d?s +?l?l?l?l?l?l?d?s +?l?d?d?d?d?s?d?d +?l?l?d?l?l?d?l?l +?u?l?d?d?d?s?d +?d?d?s?d?d?u?u +?d?l?l?s?d?d?d +?u?l?l?u?l?l?d?d +?l?l?s?s?l?d?d +?l?l?s?d?l?s +?l?s?l?d?s?l +?d?l?s?l?s?l +?u?u?d?d?d?d?l?l +?d?d?l?d?d?d?l?l +?d?d?d?s?s?l?l +?l?l?d?l?l?l?l?d +?l?l?l?u?d?d?d?d +?d?d?l?l?l?d?d?l +?d?d?d?d?u?l?d?d +?u?l?u?s?d?d?d +?u?l?l?d?d?d?d?s +?d?d?l?l?l?s?d +?d?d?d?u?l?l?l?l +?s?s?s?s?s?d +?u?l?d?d?u?l?d?d +?u?u?u?d?d?u?d +?u?d?d?l?l?l?d +?u?l?l?d?d?d?u +?u?d?d?d?u?l?l +?u?l?u?l?l?s +?d?d?d?l?l?l?l?l?l +?l?l?l?s?d?l?d +?l?d?l?s?l?d?l +?d?d?l?l?l?s?s +?l?l?l?s?d?s?d +?d?d?d?u?u?u?d?d +?u?s?u?u?s?u +?d?s?d?d?s?d?d?d?d +?u?l?l?s?s?s +?l?d?l?d?l?l?l?l +?s?l?l?s?d?d?d +?l?d?l?l?l?l?l?d +?d?d?d?d?d?d?l?l?d +?d?s?d?d?s?d?d?l +?d?d?l?d?d?d?d?d?d +?d?u?d?d?d?d?l +?d?d?d?l?u?d?d +?l?d?u?d?d?d?d +?d?u?d?d?d?u?d +?d?l?d?u?d?d?d +?d?d?d?d?l?d?u +?d?u?d?u?d?d?d +?d?d?u?l?d?d?d?d +?d?d?d?u?d?u?d +?d?d?d?d?l?l?d?d?d +?d?d?u?d?l?d?d +?d?d?l?u?d?d?d +?d?u?d?d?u?d?d +?d?d?d?u?d?d?l +?d?d?d?u?d?d?u +?d?u?d?d?d?l?d +?d?d?l?l?l?l?u +?u?u?u?d?s?d?d +?u?s?u?u?u?d?d +?l?d?d?s?l?l?l +?l?d?d?s?d?d?d?d +?u?l?u?u?u?l +?u?u?u?l?u?l +?d?d?l?d?l?l?d?d +?l?l?l?l?d?s?s +?l?d?l?s?s?s +?u?u?l?l?l?d?d?d +?u?u?s?s?s?s +?s?s?u?u?s?s +?d?d?d?d?d?l?l?s +?l?l?l?d?d?s?l +?l?s?l?l?s?s +?u?d?d?d?d?l?u +?u?d?d?d?l?d?l +?d?d?d?u?u?d?u +?d?d?u?l?l?l?d +?u?d?d?d?d?u?l +?u?l?d?d?d?l?u +?d?u?u?d?u?u?d +?u?l?d?d?u?l?d +?d?d?l?l?d?d?u +?u?d?d?d?d?d?d?d?d?d +?u?l?s?s?l?l +?u?d?l?d?l?d?l?d +?l?l?d?d?l?l?l?d +?d?l?d?l?l?d?d?d +?d?l?d?d?l?l?d?d +?s?d?s?s?d?d +?s?s?d?d?s?d +?d?d?s?d?s?s +?u?u?d?u?u?u?d +?u?l?l?l?l?s?d?d +?s?l?d?l?d?l?d +?l?d?l?l?d?d?s +?d?d?d?d?d?d?d?s?l +?l?l?l?l?s?d?l +?l?l?l?l?l?d?u +?l?d?l?d?l?l?s +?l?d?d?l?l?l?s +?d?d?s?s?u?u +?s?s?l?d?d?l +?l?d?s?d?s?l +?l?s?s?d?l?d +?s?u?l?s?d?d +?l?l?d?d?s?s?s +?l?d?s?s?l?d +?l?s?d?d?l?s +?s?l?d?s?l?d +?d?s?s?l?l?d +?d?d?u?s?u?s +?s?l?d?l?s?d +?s?d?d?l?l?s +?u?s?d?d?s?u +?s?d?d?l?s?l +?l?d?l?l?d?l?l?d +?d?d?d?d?d?s?d?d?d +?l?l?l?l?s?d?d?d?d +?u?u?d?d?l?l?d?d +?s?d?d?d?d?u?u +?d?l?s?l?d?d?d +?d?l?l?d?s?d?d +?u?d?d?u?d?d?s +?d?d?u?s?u?d?d +?l?s?u?d?d?d?d +?l?d?d?d?l?d?s +?l?u?s?d?d?d?d +?l?l?l?u?l?l?l +?l?d?d?d?d?l?d?l +?l?l?l?l?d?d?l?d +?u?d?l?d?d?d?d?d +?u?d?d?d?d?l?d?d +?l?l?l?d?d?l?l?d +?u?u?u?d?l?l?l +?u?d?s?u?u?u +?l?d?l?l?s?u +?u?u?s?l?l?d +?u?s?u?d?l?l +?u?l?d?s?l?l +?u?l?s?l?d?l +?u?u?u?s?d?u +?u?d?l?l?s?l +?u?l?s?u?l?d +?u?d?l?u?s?l +?l?d?l?l?d?l?d?l +?u?u?d?d?l?l?d +?l?d?l?d?l?d?u +?u?l?l?d?d?l?d +?l?d?d?l?l?d?l?d +?d?d?d?d?d?d?d?l?l?l +?l?d?l?d?d?d?l?d +?u?u?u?d?s?s +?s?s?l?l?d?l +?u?l?l?s?d?s +?l?l?l?l?s?d?s +?d?l?l?s?s?l +?l?l?l?l?s?l?l?l +?u?u?l?u?l?u +?u?l?u?d?d?d?s +?d?s?d?d?l?l?l +?s?d?l?l?l?d?d +?u?l?l?d?s?d?d +?d?d?d?l?l?s?l +?l?l?l?s?l?l?l?l +?d?l?l?d?d?l?d?d +?u?l?l?l?u?l?d +?u?u?u?l?l?l?d?d +?l?s?l?s?d?d?d?d +?l?l?s?s?s?l +?d?s?s?s?s?d +?d?d?d?s?s?s?s +?d?u?u?l?u?l +?u?u?l?u?d?l +?l?u?d?l?u?l +?l?u?u?d?u?l +?d?l?u?l?u?l +?d?u?l?u?u?u +?d?u?l?l?u?u +?l?d?u?l?u?l +?u?d?l?u?u?l +?u?u?l?u?l?d +?d?l?u?l?u?u +?d?l?l?d?d?l?l?d +?s?d?d?d?d?d?d?d?s +?d?d?s?s?s?d?d +?s?s?d?d?d?d?s +?u?u?u?u?u?u?d?d?d +?l?l?s?d?l?l?l +?l?s?l?s?s?s +?d?d?s?d?d?s?d?d?d?d +?d?d?d?d?d?d?d?s?s +?l?d?l?d?l?l?l?d +?s?s?d?d?d?d?l +?s?l?l?l?l?s?d +?l?l?d?s?s?s +?u?s?u?s?s?d +?u?l?d?d?d?d?d?s +?d?l?l?s?d?l?l +?s?l?l?l?l?d?s +?l?d?d?d?l?l?l?d +?d?l?d?d?d?d?l?l +?d?l?d?l?d?d?l?d +?s?s?s?s?d?d?d +?s?s?l?l?d?d?d +?s?d?u?u?u?u?u +?d?d?s?d?l?l?l +?d?s?l?l?l?d?d +?u?s?u?u?d?d?d +?l?l?d?d?d?l?s +?s?s?u?u?u?u +?u?s?l?l?l?s +?u?d?d?u?d?u?u +?u?d?d?u?u?u?d +?u?d?d?l?d?l?l +?u?s?u?s?u?d?d +?u?u?u?u?u?d?s +?u?u?u?u?d?d?d?d?d +?d?d?d?d?s?d?s?d +?u?u?l?l?l?l?d?d +?s?s?l?s?s?l +?u?l?l?l?l?u?d?d +?l?d?l?l?l?d?l?d +?d?l?d?d?l?d?l?d +?d?l?d?d?s?d?d +?d?d?s?d?d?d?u +?d?d?d?l?d?s?d +?d?d?u?s?d?d?d +?s?d?d?d?d?l?d +?d?d?d?d?l?d?s +?d?d?l?d?s?d?d +?d?d?s?d?u?d?d +?s?d?l?d?d?d?d +?d?d?l?d?d?s?d +?d?s?d?d?d?d?u +?d?d?d?d?d?l?d?d?d +?l?l?d?l?l?d?l?d +?u?l?l?l?l?s?s +?u?u?u?u?u?u?u?d?d +?u?u?u?s?l?l +?l?l?l?s?d?l?l +?l?s?u?l?l?l +?u?l?l?u?l?s +?l?u?l?l?l?s +?u?d?u?l?d?d?d +?d?u?u?d?d?d?u +?l?d?d?d?d?u?l +?d?d?d?d?l?u?u +?d?u?u?d?u?d?d +?u?l?d?d?d?l?d +?u?d?u?d?l?d?d +?l?u?d?d?d?d?l +?l?d?u?u?d?d?d +?l?u?l?d?d?d?d?d +?u?l?d?d?u?d?d +?u?d?d?u?d?d?l +?l?l?d?d?u?d?d +?d?u?d?u?d?d?u +?d?u?d?d?u?d?u +?d?d?l?u?u?d?d +?l?d?d?l?d?d?u +?u?s?u?u?u?u?u +?d?d?d?d?u?d?d?d?d +?u?u?u?u?u?s?u +?l?d?l?d?l?l?d?l +?d?d?s?u?u?u?u +?l?l?l?d?d?l?s +?l?d?l?l?l?l?d?l +?u?d?d?d?d?l?s +?s?l?d?d?d?d?l +?s?l?d?d?l?d?d +?s?u?l?d?d?d?d +?d?l?l?l?d?d?s +?d?d?d?l?l?d?s +?l?d?d?l?s?d?d +?u?u?d?s?d?d?d +?l?s?l?d?l?d?d +?d?d?d?l?d?d?d?d?d +?d?d?s?d?d?s?s +?s?d?s?d?s?d?d +?d?s?d?s?d?d?s +?d?d?l?l?d?d?l?d +?d?d?l?l?d?l?d?d +?l?l?d?s?l?l?l +?d?d?u?l?l?l?l?l +?s?l?s?l?l?s +?s?s?s?u?u?u +?d?d?d?d?s?d?d?l +?l?d?l?l?d?l?l?l +?d?u?u?u?u?u?u?u +?u?s?s?u?u?u +?u?s?u?s?u?u +?d?d?d?d?d?s?s?s +?u?l?l?s?l?l?l +?d?l?l?l?l?d?l?l +?u?d?u?l?l?d?d +?l?d?l?d?d?l?l?d +?d?u?u?l?u?d +?l?l?u?d?u?d +?u?d?l?l?u?d?d +?u?l?u?d?d?d?u +?u?u?d?u?d?u?d +?d?u?u?d?u?l +?l?u?l?d?u?d +?d?u?u?l?d?l +?d?u?d?u?u?l +?l?u?d?d?u?u +?d?l?u?l?d?u +?d?l?u?u?d?u +?l?d?l?u?d?u +?d?u?u?u?d?u?u +?l?d?u?l?u?d +?d?l?u?d?u?u +?l?u?d?u?u?d +?d?l?l?u?d?u +?l?d?u?d?u?u +?l?u?u?u?d?d?d?d +?d?l?l?u?l?d +?u?u?d?u?l?d +?d?l?u?d?l?u +?d?u?u?u?l?d +?u?d?u?l?d?u +?l?s?d?d?d?s?l +?l?l?u?u?d?d?d?d +?l?d?l?l?d?d?l?d +?d?l?d?d?d?l?l?d +?u?l?l?l?l?u?u +?l?d?l?d?d?l?d?l +?s?l?s?d?d?s +?s?s?l?d?d?s +?s?s?d?d?s?l +?l?s?d?d?s?s +?s?d?s?d?s?l +?s?s?l?s?d?d +?s?u?s?s?d?d +?d?d?s?s?s?l +?s?d?s?d?l?s +?u?s?l?l?l?l?l +?s?s?l?l?l?l?l +?d?d?l?d?d?l?l?l +?l?l?d?d?d?d?u?u +?u?u?u?d?d?d?d?s +?l?s?s?l?s?s +?l?l?d?l?l?l?d?l +?s?u?s?d?d?d?d +?l?s?d?s?d?d?d +?u?d?d?d?d?s?s +?d?d?l?d?d?l?l?d +?d?l?d?l?d?d?d?l +?u?u?l?u?u?d?d +?l?s?l?l?d?d?d?d +?d?l?l?d?l?l?d?d +?l?l?s?l?d?s +?s?u?u?u?d?s +?u?l?s?s?l?d +?l?d?s?s?l?l +?l?d?s?l?s?l +?u?d?s?l?l?s +?s?l?d?l?s?l +?d?l?s?s?l?l +?l?s?d?s?l?l +?d?d?d?d?d?u?u?d +?l?d?d?d?s?l?l +?d?d?d?l?s?l?l +?l?l?d?s?d?d?l +?l?d?d?l?l?d?s +?l?s?d?l?l?d?d +?l?s?l?s?d?s +?s?l?d?l?s?s +?d?l?l?l?l?d?s +?l?l?d?s?d?l?l +?l?l?l?u?u?u?u +?d?u?l?l?d?d?d?d +?l?d?l?d?d?d?d?d?d +?l?l?l?s?u?l +?u?l?l?s?u?u +?l?l?s?u?l?l +?l?s?l?l?u?l +?u?l?u?l?s?l +?s?l?l?l?l?u +?l?l?l?u?u?u?d +?l?d?d?l?d?l?l?d +?u?l?l?l?l?l?l?d?d +?d?d?d?s?d?d?d?d?d +?u?u?u?u?s?u?u +?l?l?d?d?u?u?u +?d?d?u?l?l?l?u +?u?u?d?u?d?u?u +?u?l?l?d?l?d?l +?u?u?u?d?u?d?u +?u?l?u?u?u?d?d +?u?l?d?d?u?l?l +?u?l?s?d?d?d?d?d +?d?l?d?l?l?d?l?d +?u?s?u?u?u?s +?s?u?l?u?l?s +?l?l?l?l?s?s?l +?u?l?l?l?l?l?d?d?d +?l?l?d?l?l?d?s +?u?l?l?s?d?l +?s?l?l?l?u?d +?l?l?l?u?s?d +?u?l?s?u?d?l +?u?s?d?u?l?l +?u?l?u?s?u?d +?l?d?l?l?l?d?s +?l?l?d?s?l?l?d +?u?u?s?d?u?u +?d?u?u?s?u?u +?u?l?l?s?u?d +?u?u?s?u?d?u +?l?s?l?l?s?d?d +?d?d?s?l?l?l?s +?l?s?d?d?d?d?d?d?d +?l?l?l?l?u?l?l +?u?d?l?d?l?d?u +?u?d?l?l?d?d?u +?l?u?u?l?d?d?d +?u?u?d?d?u?d?u +?u?d?u?d?d?u?u +?d?d?d?u?l?l?u +?l?l?d?d?l?l?d?l +?d?d?d?u?u?u?l +?d?d?d?d?d?d?l?l?l?l +?d?l?d?d?d?d?d?d?d +?l?d?s?s?s?s +?l?l?u?l?u?u +?u?l?l?l?l?d?u +?d?d?d?l?l?d?l?d +?u?d?u?d?d?u?d?d +?d?d?d?l?d?l?l?d +?l?l?d?d?l?d?l?d +?l?d?d?l?d?l?d?l +?d?d?d?u?d?d?d?u +?l?s?d?d?l?l?l +?l?d?s?l?l?l?l +?d?d?d?d?d?d?d?d?d?s +?s?d?d?d?s?l?l +?l?s?l?d?d?d?s +?l?l?s?s?l?s +?s?u?s?u?s?u +?l?d?l?d?l?s?d +?u?u?u?d?d?s?d +?u?u?s?u?d?d?d +?l?d?l?d?d?l?s +?l?l?u?l?l?l?l +?d?d?l?d?l?d?l?d +?l?u?l?l?l?l?d +?l?s?l?l?l?l?d?d +?u?l?l?l?l?u?l +?u?u?u?u?u?s?s +?u?l?u?l?u?d?d?d +?u?l?d?l?d?l?l +?d?s?d?d?d?d?d?d?d +?l?l?u?l?l?l?d +?l?l?l?l?u?u?d +?d?s?d?d?d?d?s +?d?l?l?d?d?d?d?l +?l?d?d?l?l?l?l?d +?u?u?u?d?d?d?d?u +?u?l?l?l?u?u?d +?u?l?l?s?s?l +?u?l?l?l?s?d?d?d +?d?l?l?l?l?l?d?l +?d?l?d?d?l?d?s +?u?u?d?d?d?s?d +?l?u?d?d?d?d?s +?l?d?l?d?d?s?d +?u?d?u?d?s?d?d +?l?l?d?l?d?l?s +?d?d?l?l?s?l?l +?l?s?l?s?l?s?d +?l?l?l?d?l?d?l?l +?u?l?l?l?d?d?d?d?d +?l?l?l?s?u?u +?u?l?s?u?u?u +?l?l?l?u?u?s +?u?l?u?l?s?u +?d?d?u?d?d?l?d?d +?l?l?l?l?d?l?d?l +?l?d?l?d?d?d?l?l +?d?d?d?l?l?l?d?l +?d?l?d?l?l?l?d?d +?l?s?s?l?d?d?d +?u?s?d?d?d?d?s +?d?l?s?d?l?s?d +?d?d?d?d?d?u?l?u +?u?l?d?l?d?d?l +?u?u?l?u?d?d?d +?u?l?d?l?u?d?d +?d?d?d?d?u?l?u?l +?l?d?d?d?d?d?d?d?s +?l?l?l?d?l?d?l?d +?l?s?s?s?l?l +?s?u?u?u?u?u?s +?u?d?d?d?d?d?d?d?l +?d?l?l?d?l?d?l?d +?d?d?d?l?l?d?l?l +?d?l?l?l?d?d?d?l +?l?l?l?d?l?l?d?l +?l?l?d?d?s?u +?u?d?l?s?l?d +?l?d?l?u?s?d +?s?u?u?d?d?l +?l?d?d?l?u?s +?u?d?u?u?s?d +?l?u?u?d?d?s +?d?s?d?l?l?u +?l?u?l?d?s?d +?d?u?l?s?d?l +?d?l?u?l?d?s +?u?s?d?l?u?d +?u?d?d?s?l?l +?s?d?u?u?d?u +?u?l?d?u?s?d +?d?d?s?u?l?u +?s?u?d?d?l?l +?d?u?u?d?l?s +?d?l?l?d?s?l +?d?d?l?l?s?u +?d?u?d?u?s?u +?l?d?l?s?d?l?d +?s?l?l?d?d?u +?s?u?d?d?u?u +?u?d?s?d?u?u +?u?l?d?d?s?u +?u?s?u?d?u?d +?l?d?d?d?l?l?s +?l?d?l?d?s?u +?u?u?d?s?d?u +?u?u?d?s?d?l +?d?u?d?u?u?s +?d?l?s?d?u?l +?d?u?u?u?s?d +?l?s?d?d?l?u +?d?l?l?l?l?s?d +?l?l?d?u?s?d +?d?u?l?d?s?l +?u?d?d?u?s?l +?s?u?u?l?d?d +?u?u?d?d?u?s +?l?l?s?u?d?d +?u?d?d?s?l?u +?s?d?u?d?u?u +?s?d?u?l?l?d +?u?d?d?u?s?u +?d?d?l?l?l?d?s +?d?l?u?u?d?s +?u?s?l?u?d?d +?u?d?u?s?l?d +?s?l?l?u?d?d +?d?d?s?u?u?l +?l?d?l?d?s?l?d +?d?d?s?l?u?u +?d?l?l?s?u?d +?l?s?u?d?l?d +?d?l?u?s?d?u +?l?u?d?l?d?s +?u?l?d?d?u?s +?d?l?s?l?d?u +?l?u?d?s?l?d +?l?d?s?d?l?u +?u?d?d?l?u?s +?s?u?l?u?d?d +?d?l?d?s?l?l +?d?u?l?u?d?s +?d?l?d?u?s?l +?s?l?d?u?d?l +?u?u?s?d?u?d +?l?u?s?l?d?d +?u?d?d?u?u?s +?u?l?u?d?s?d +?l?d?l?s?l?d?d +?d?s?u?l?l?d +?d?u?s?u?d?l +?l?s?u?u?d?d +?l?l?u?s?d?d +?l?l?d?l?d?l?l?d +?d?d?d?s?s?s?l +?d?u?u?d?d?u?d +?d?l?u?u?d?d?d +?d?d?u?l?d?d?u +?u?d?l?u?d?d?d +?d?d?u?d?d?u?l +?d?d?u?u?l?d?d +?l?d?u?d?l?d?d +?d?l?l?d?d?d?l?d +?d?l?l?l?d?l?d?d +?u?d?l?d?l?d?d?d +?d?l?d?u?d?l?d +?d?d?u?u?d?u?d +?d?l?u?l?d?d?d +?l?l?d?d?d?u?d +?d?u?l?u?d?d?d +?l?u?d?d?l?d?d +?d?d?d?u?d?u?u +?u?d?d?d?l?l?d +?l?d?d?d?l?d?d?d?d +?u?l?l?l?l?s?u +?d?s?s?d?s?s +?s?d?s?s?s?d +?s?d?s?d?s?s +?l?l?d?d?d?l?d?l +?l?l?l?l?l?d?d?d?d?d +?d?u?u?l?u?u +?l?l?d?u?l?u +?l?u?d?l?u?u +?u?u?d?l?u?l +?d?l?u?u?l?u +?l?d?u?u?u?l +?l?l?l?u?l?l?d +?l?u?l?u?d?u +?l?l?d?l?d?l?l?l +?l?s?s?l?l?d?d +?d?s?s?s?d?d?d +?l?d?d?l?l?d?l?l +?d?d?d?d?d?l?l?d?d +?l?u?l?u?l?u?l +?d?l?d?l?l?l?l?l +?u?d?d?d?d?d?l?l +?d?l?d?d?d?l?d?l +?d?d?u?u?u?d?d?d +?s?d?l?s?l?s +?s?d?l?l?s?s +?l?s?d?s?l?s +?d?d?d?d?d?d?d?d?d?u +?d?d?d?d?d?s?d?l +?s?l?s?l?d?d?d +?s?s?s?s?l?d +?s?l?s?l?s?s +?u?l?l?l?u?d?d?d +?s?u?l?l?l?l?s +?u?u?s?d?d?d?d?d +?l?l?d?s?d?d?d?d +?l?l?l?s?u?s +?u?u?u?s?u?s +?u?l?s?u?l?s +?l?d?l?l?s?l?l +?l?l?s?d?d?d?d?d?d +?d?u?d?u?u?u?u +?d?d?u?u?l?l?l +?u?l?d?d?d?d?l?l +?u?u?d?d?d?d?d?u +?l?l?u?d?d?d?d?d +?d?d?d?d?u?u?u?d +?d?u?u?u?d?d?d?d +?d?d?d?l?d?l?d?l +?l?d?l?d?l?s?l +?u?l?l?l?d?s?d +?d?d?l?s?l?l?l +?l?l?d?l?l?s?d +?u?u?u?u?u?s?d?d +?l?l?s?l?s?s +?s?l?l?s?l?s +?l?s?l?l?d?l?l +?l?u?l?l?l?l?l +?l?l?d?s?l?s +?u?d?u?u?s?s +?d?l?l?s?l?s +?d?l?s?l?l?s +?d?s?l?l?l?s?d +?s?d?l?s?l?l +?d?d?s?s?l?l?l +?l?l?s?s?d?l +?s?d?d?l?l?l?s +?s?l?l?s?l?d +?l?s?d?l?s?l +?l?s?d?l?l?s +?u?d?l?l?s?s +?d?s?l?l?l?s +?s?l?s?d?l?l +?l?d?l?l?l?d?d?l +?s?u?u?u?u?u?u +?u?l?l?l?l?s?l +?l?s?l?l?l?d?l +?u?l?d?d?d?d?u?l +?l?d?l?l?d?s?d +?l?d?d?l?d?l?s +?d?d?d?s?u?l?l +?d?d?l?l?l?l?l?l?l +?u?s?u?l?l?l?l +?u?l?d?d?l?l?d?d +?u?u?d?l?l?d?d +?l?d?l?l?d?d?d?l +?u?d?u?d?u?d?l +?l?l?u?d?d?d?u +?u?d?u?u?d?d?u +?u?l?u?d?u?d?d +?d?u?u?u?d?u?d +?d?d?d?l?u?u?u +?l?u?l?u?l?s +?l?s?u?u?u?u +?u?l?s?l?u?l +?l?u?s?l?l?l +?l?d?l?s?l?l?l +?l?l?d?l?d?l?d?l +?l?l?l?d?u?l?l +?l?l?d?d?d?d?s?s +?u?d?d?d?s?d?d?d +?u?u?u?u?d?d?l +?u?d?d?u?l?l?l +?l?l?d?l?d?d?l?d +?l?l?l?l?d?d?s?d +?l?l?s?l?l?d?l +?u?l?u?l?u?l?d?d +?d?s?d?s?d?l?l +?l?l?s?d?d?s?d +?l?l?l?l?l?u?l +?l?d?d?d?d?d?d?d?d?l +?l?u?l?u?d?d?d?d +?d?d?l?l?d?l?l?d +?l?l?l?l?d?s?d?d +?l?d?d?d?d?u?d +?d?d?d?l?d?u?d +?d?d?l?d?d?d?u +?u?d?u?u?d?d?d?d +?d?l?d?d?d?d?u +?d?d?l?d?d?u?d +?d?d?l?d?u?d?d +?d?l?u?d?d?d?d +?l?d?d?d?u?d?d +?l?d?l?l?l?s?l +?s?d?u?l?l?l?l +?l?l?d?d?l?d?l?l +?s?s?l?l?l?s?s +?d?d?s?d?s?d?d?d +?u?d?l?d?u?d?l?d +?l?d?d?d?l?d?l?l +?d?d?l?l?l?d?l?d +?u?d?u?l?l?l?l +?l?l?d?l?l?d?d?l +?l?l?l?s?l?d?l +?d?d?d?d?u?u?l?l +?l?l?d?d?s?d?d?d +?l?l?s?l?d?d?d?d +?l?u?l?l?u?d?d +?d?d?l?l?u?l?l +?l?s?l?s?s?l +?l?s?s?l?s?l +?u?l?u?s?s?s +?l?l?l?d?d?d?d?u +?u?u?l?d?d?d?d?d +?u?l?s?l?l?l?l +?d?l?l?d?l?l?l?l +?s?s?l?d?d?d?d +?l?d?d?s?s?d?d +?d?d?s?u?s?d?d +?l?d?s?s?d?d?d +?s?d?d?d?d?l?s +?d?d?s?s?d?d?l +?d?s?d?s?d?d?u +?l?l?l?l?s?l?s +?u?u?s?u?s?u +?l?s?l?d?l?s?l +?l?d?d?d?l?l?d?l +?d?d?s?d?d?d?d?l +?l?l?l?d?d?l?d?l +?l?l?u?u?l?l?d +?s?s?d?d?s?d?d +?d?d?d?s?s?s?d +?l?d?d?d?s?s?s +?s?l?l?d?d?d?d?d +?d?d?d?d?d?l?s?l +?d?l?l?l?d?l?l?d +?s?u?u?u?d?d?d +?d?d?s?l?l?l?d +?d?s?d?l?l?l?d +?l?u?l?s?d?d?d +?u?d?u?d?u?d?s +?u?l?l?d?d?s?d +?l?d?d?s?d?l?l +?s?s?d?d?d?d?s?s +?l?l?l?l?l?s?u +?d?d?d?l?l?l?l?s +?s?l?s?s?l?s +?l?s?s?s?s?l +?d?l?l?l?l?d?l?d +?u?u?u?u?s?d?d?d +?l?s?l?l?l?d?d?d +?u?d?d?u?d?u?d?d +?d?d?l?l?l?d?l?l +?u?u?u?u?l?l?d +?s?d?d?u?u?s +?s?d?d?u?l?s +?u?d?u?s?s?d +?d?s?l?l?d?s +?u?d?l?s?d?s +?l?s?d?d?s?u +?u?s?d?s?l?d +?s?d?u?u?s?d +?u?s?s?d?d?l +?u?d?s?l?d?s +?u?d?d?s?s?u +?l?d?s?s?d?l +?s?d?d?s?u?u +?l?l?d?s?d?s +?d?s?l?s?l?d +?d?u?u?s?s?d +?u?s?s?d?u?d +?u?d?d?s?s?l +?u?s?s?d?d?u +?s?d?s?l?d?l +?l?d?s?l?s?d +?s?d?s?d?l?l +?u?s?l?d?d?s +?s?d?u?u?d?s +?l?l?d?s?s?d +?u?d?l?d?s?s +?d?s?d?l?s?l +?s?d?d?s?u?l +?u?d?d?u?s?s +?d?d?s?s?u?l +?s?u?s?u?d?d +?s?l?u?d?d?s +?s?s?d?d?d?l?l +?s?s?u?u?d?d +?s?u?d?l?d?s +?d?u?u?d?s?s +?d?l?s?s?d?l +?l?d?d?u?s?s +?u?d?s?s?d?u +?d?s?l?s?d?l +?u?d?u?s?d?s +?d?s?d?s?u?u +?l?s?s?d?d?l +?l?s?u?s?d?d +?d?d?d?s?l?s?l +?d?l?s?d?s?l +?s?l?d?s?u?d +?d?l?s?s?l?d +?s?u?d?d?s?u +?d?u?s?d?s?u +?s?s?d?l?l?d +?s?s?l?d?l?d +?d?s?l?d?s?u +?d?u?s?d?u?s +?d?s?u?s?d?u +?u?d?s?l?s?d +?s?d?s?u?d?l +?s?d?d?d?l?l?s +?u?s?u?d?d?s +?u?d?l?l?u?d?l +?l?l?d?d?l?l?u +?d?u?l?l?l?u?d +?d?d?u?l?u?l?u +?d?u?u?d?u?u?u +?u?l?d?d?u?l?u +?d?d?l?d?l?s?d +?d?d?d?d?s?l?u +?u?d?d?l?d?d?s +?s?d?d?d?d?u?l +?d?l?d?l?s?d?d +?d?s?d?d?d?u?u +?d?d?d?s?l?d?l +?u?d?d?s?d?d?u +?l?d?d?d?l?s?d +?u?d?d?u?s?d?d +?s?l?d?l?d?d?d +?l?d?s?d?l?d?d +?l?l?d?d?d?s?d?d +?d?d?d?l?s?l?d +?u?d?d?d?d?u?s +?s?d?d?d?l?l?d +?d?l?d?d?l?l?l?d +?l?u?l?l?d?d?d?d +?d?u?u?d?d?d?d?d +?d?l?l?l?l?l?u +?s?l?u?l?u?d +?s?l?u?u?l?d +?l?l?u?l?s?d +?d?s?l?u?l?l +?s?u?u?u?d?u +?s?u?u?u?d?l +?u?d?s?l?l?l +?d?l?l?l?u?s +?u?u?u?s?u?d?d +?l?l?l?s?d?u +?l?l?d?l?s?u +?u?l?s?d?u?l +?u?l?d?u?l?s +?s?l?d?l?u?l +?u?l?s?u?d?u +?u?l?l?u?s?d +?u?l?l?d?u?s +?s?u?u?l?l?d +?l?s?d?l?l?u +?u?u?d?u?s?u +?d?u?s?l?l?l +?s?u?u?l?d?l +?s?d?u?l?u?l +?l?l?s?u?d?l +?u?l?d?l?s?l +?u?u?u?s?d?l +?u?s?l?d?l?u +?u?u?u?u?d?s?d +?d?u?s?u?u?u +?d?u?u?u?s?u +?u?d?l?l?s?u +?l?d?u?l?l?s +?u?s?l?d?u?l +?l?d?s?u?l?l +?l?u?l?d?l?s +?u?u?d?s?u?u +?d?l?l?u?l?s +?l?l?u?u?s?d +?u?u?l?d?s?l +?l?s?d?u?u?u +?u?l?s?u?l?l?l +?u?u?d?u?d?d?u +?l?d?l?u?l?d?d +?u?d?l?u?d?d?l +?u?l?u?d?d?d?l +?u?d?d?l?l?d?l +?d?u?d?u?d?u?u +?u?l?u?d?d?l?d +?u?l?d?u?l?d?d +?u?u?d?d?d?u?l +?d?u?d?d?u?l?l +?u?u?l?d?d?d?l +?s?d?l?l?l?d?s +?l?l?d?d?d?d?s?d +?l?d?d?l?l?l?d?l +?d?d?s?d?d?d?s?d +?s?l?l?l?l?l?d?d +?s?s?s?d?d?d?l +?l?s?s?s?d?d?d +?l?d?d?d?d?d?s?d +?u?s?s?s?s?s +?d?d?l?l?l?d?d?s +?u?l?l?l?s?l?l +?u?s?l?l?l?u +?s?u?l?l?l?l?l +?l?s?l?l?l?u +?u?l?l?u?s?u +?s?l?u?l?l?l +?u?l?s?u?l?u +?l?l?l?u?l?s +?l?l?s?l?l?u +?d?d?d?d?d?d?d?l?s +?d?l?d?l?d?l?l?d +?l?l?d?l?d?d?d?l +?l?s?s?l?l?s +?s?l?l?l?l?d?d?d +?u?l?l?d?u?l?d +?u?l?l?d?d?u?l +?s?u?l?l?l?d?d +?l?s?l?l?d?l?d +?d?l?l?l?d?l?s +?u?l?u?l?d?d?s +?s?u?u?u?u?d?d +?s?s?d?d?l?l?l +?d?d?d?u?l?l?d?d +?l?d?d?d?d?d?d?l?l +?d?d?s?l?l?l?l?l +?s?s?s?s?u?u +?d?l?l?l?d?d?l?d +?d?l?d?l?d?l?l?l +?l?l?s?s?l?l?l +?s?s?s?l?l?d +?s?s?d?l?l?s +?s?s?l?d?l?s +?s?s?s?d?l?l +?s?l?l?d?s?s +?l?s?l?d?s?s +?l?s?d?l?s?s +?s?l?s?l?d?s +?l?d?d?l?d?s?s +?l?l?l?l?l?d?s?d +?l?l?s?l?l?l?l?l +?l?d?l?l?d?d?l?l +?d?l?l?l?l?d?d?d?d +?l?l?d?d?l?d?s +?l?d?d?s?l?l?d +?s?l?d?l?l?d?d +?l?l?d?l?s?d?d +?l?l?d?l?d?d?s +?l?l?s?d?d?l?d +?l?d?s?l?d?l?d +?d?d?d?u?l?l?s +?l?l?l?d?d?d?s?s +?s?d?l?d?l?d?l +?s?s?u?l?l?l +?u?s?u?l?l?s +?u?u?u?l?d?d?d?d +?d?l?l?d?d?d?l?l +?d?l?l?l?d?d?l?l +?s?d?l?l?l?s?d +?d?l?l?s?l?l?l +?u?u?u?u?u?u?l +?u?s?u?l?l?d?d +?u?l?s?l?l?d?d +?l?d?l?s?l?l?d +?u?u?l?l?d?d?s +?u?l?l?l?l?d?d?s +?l?l?d?d?u?l?l +?l?d?l?d?d?l?l?l +?u?l?d?d?l?l?u +?u?l?l?d?d?u?u +?l?l?l?s?s?l?l +?s?d?u?d?d?d?d +?d?u?s?d?d?d?d +?d?u?d?d?d?s?d +?d?d?d?d?u?d?s +?d?s?d?d?d?l?d +?s?u?d?d?d?d?d +?d?d?u?d?d?d?s +?u?l?d?u?l?l?l +?u?u?u?d?d?u?u?u +?l?l?l?l?u?l?d +?u?l?l?l?d?d?d?s +?d?d?d?l?d?l?l?l +?l?l?l?l?l?l?s?d?d +?l?l?l?l?l?u?d?d +?s?d?d?s?l?l?l +?u?u?u?s?s?d?d +?u?l?l?d?d?l?l?l +?l?u?u?u?u?u?d?d +?u?u?u?l?l?d?d?d +?d?d?d?d?d?d?d?u?l +?u?l?l?l?l?l?s?d +?d?u?d?u?u?d?d +?d?u?d?d?d?u?u +?d?u?l?d?d?u?d +?d?u?d?l?l?d?d +?u?d?d?l?d?u?d +?d?u?d?l?u?d?d +?l?d?l?d?u?d?d +?l?u?d?d?d?d?u +?u?u?d?l?d?d?d +?d?u?d?d?u?u?d +?u?d?l?d?d?d?l +?l?d?d?d?d?l?u +?l?u?d?d?u?d?d +?d?l?d?d?d?u?l +?u?d?d?u?d?l?d +?d?d?l?d?d?u?u +?u?d?d?d?u?u?d +?d?l?d?u?l?d?d +?u?d?d?d?u?l?d +?l?d?d?l?d?l?l?l +?l?l?u?u?u?u?u +?d?l?l?u?l?l?l +?l?d?l?l?s?l?d +?l?s?l?d?l?d?l +?d?d?l?l?d?d?d?d?d +?u?s?l?l?l?l?d +?u?l?u?l?u?l?s +?u?l?l?d?d?d?d?l +?d?u?d?u?d?u?d?u +?d?d?l?d?l?l?l?l +?s?l?l?s?s?l +?s?u?u?u?s?s +?d?l?l?d?l?l?l?d +?d?s?d?d?d?s?d?d +?u?u?u?d?d?s?s +?d?l?d?l?l?d?d?l +?u?d?l?u?d?l?l +?u?d?d?l?l?d?u +?l?u?d?d?d?l?l +?u?d?d?u?u?d?u +?l?u?d?d?l?l?l +?d?l?l?u?l?l?d +?u?l?d?d?d?u?u +?u?d?d?u?d?l?l +?u?d?d?l?u?d?l +?u?l?d?d?l?d?u +?l?l?l?d?d?u?d +?d?d?d?l?u?l?l +?u?u?l?l?u?d?d +?d?d?d?d?l?l?l?u +?l?l?l?l?l?l?l?d?d?d +?d?d?d?s?l?l?s +?l?l?s?d?s?d?d +?l?l?s?l?l?s?d +?d?d?u?l?l?d?d?d +?l?l?l?d?l?d?d?l +?d?d?l?d?l?l?l?d +?d?d?s?u?s?s +?l?d?s?s?d?s +?s?l?d?d?s?s +?d?s?d?s?l?s +?l?d?s?d?s?s +?s?l?s?d?s?d +?s?l?s?s?d?d +?l?d?d?s?s?s +?s?s?s?u?d?d +?d?d?l?s?s?s +?s?s?d?d?l?s +?u?l?l?l?l?u?s +?u?u?u?u?u?l?d +?u?u?u?d?d?l?l?l +?l?s?s?l?l?l?l +?l?s?l?l?l?s?l +?l?l?l?d?l?d?s +?d?l?l?d?l?l?d?l +?d?d?s?d?d?s?u +?s?d?d?l?s?d?d +?u?d?d?s?d?d?s +?d?d?s?d?s?d?l +?d?d?d?l?s?s?d +?d?s?d?d?s?d?l +?u?d?s?d?s?d?d +?s?d?d?s?d?d?l +?d?d?d?d?u?s?s +?s?s?d?d?l?d?d +?d?s?d?d?s?l?d +?l?s?l?s?l?l?l +?u?l?u?d?d?d?d?d?d +?l?l?l?l?d?d?s?s +?l?d?d?d?d?d?d?d?u +?d?d?l?d?d?d?d?s +?d?d?s?d?d?l?d?d +?d?d?s?l?d?d?d?d +?s?d?d?d?d?d?d?u +?l?l?s?d?d?s?d?d +?u?s?d?l?l?s +?s?d?s?u?u?u +?s?s?l?d?l?l +?u?s?d?u?u?s +?l?d?s?l?l?s +?u?s?l?l?d?s +?s?l?l?s?d?u +?u?s?l?d?l?s +?l?l?d?s?s?l +?s?d?u?l?l?s +?s?u?s?u?d?l +?d?s?s?l?l?l +?d?u?u?u?s?s +?s?u?u?d?u?s +?s?u?l?l?d?s +?l?s?u?d?s?l +?u?s?d?s?u?u +?u?s?d?u?s?u +?u?u?l?d?s?s +?u?u?d?d?d?d?d?d?d?d +?d?u?u?l?l?l?l +?l?d?d?d?d?l?d?d?d +?d?u?d?d?u?d?d?d +?l?d?l?d?l?d?d?d?d +?d?d?u?l?l?d?d?d?d +?l?d?d?d?u?d?d?d +?d?l?l?d?d?l?l?l +?d?u?l?l?l?l?l?l +?s?l?l?d?l?d?d +?l?d?l?d?d?s?l +?u?l?s?l?d?d?d +?d?l?l?d?d?l?s +?l?l?d?d?l?s?d +?l?s?l?d?d?d?l +?l?d?s?l?l?d?d +?s?l?l?l?l?l?l?s +?l?l?l?l?d?d?d?d?s +?d?l?d?d?d?l?l?l +?d?l?l?d?l?d?d?l +?d?l?l?d?d?l?d?l +?d?l?d?l?d?d?l?l +?d?d?l?l?d?l?d?l +?d?l?d?d?l?l?l?l +?u?u?d?u?d?d?d?d +?d?s?s?s?s?s +?l?l?l?l?l?l?l?l?d?d +?u?u?s?u?l?l +?s?u?u?l?l?l +?d?l?s?l?l?l?l +?u?s?u?l?u?l +?u?u?u?l?l?s +?u?s?u?l?l?u +?u?u?u?u?s?l +?u?s?u?u?u?u?d +?l?l?s?u?u?u +?d?l?l?l?l?s?l +?s?l?l?u?l?l +?l?u?l?l?u?s +?u?s?u?u?l?l +?s?l?l?u?u?l +?l?l?u?l?l?s +?u?l?l?s?l?u +?d?d?s?d?d?s?l?l +?l?d?d?d?d?d?d?d?d?d?d +?d?s?d?d?s?d?d?d +?l?l?d?d?u?u?l +?d?l?l?l?l?d?u +?u?d?l?l?d?l?u +?u?u?u?d?d?d?u?u +?d?u?l?l?l?d?u +?d?d?d?d?d?d?s?l?l +?u?d?d?d?d?l?l?l +?u?l?l?u?s?s +?l?s?l?s?l?u +?u?u?l?l?s?s +?s?u?s?l?l?l +?u?s?l?s?l?l +?u?l?s?l?l?s +?s?u?l?l?u?s +?l?l?u?u?u?u?d +?s?s?s?l?l?s +?u?l?l?u?s?d?d +?s?d?l?l?l?l?d +?d?d?l?l?l?s?l +?l?l?l?l?u?d?d?d +?s?l?d?l?d?l?s +?u?u?u?d?u?u?u?u +?l?l?l?l?l?l?s?s +?d?l?d?l?l?d?l?l +?u?u?u?d?d?d?d?l +?d?d?l?l?d?l?l?l +?l?l?s?l?l?d?d?d +?d?d?l?l?l?l?d?l +?s?s?s?s?d?l +?d?l?l?l?s?l?l +?d?l?d?l?l?l?l?d +?d?d?s?d?d?l?l?l +?l?l?s?s?d?d?d?d +?s?d?l?l?l?l?l?l +?l?s?d?s?d?s?d +?l?l?d?l?d?d?l?l +?s?l?d?d?d?l?s +?s?l?s?s?l?l +?l?l?l?d?d?d?s?d +?d?l?l?l?d?l?d?l +?d?d?u?l?u?l?d?d +?d?l?d?d?l?d?l?l +?d?s?d?s?l?l?l +?l?d?l?d?l?s?s +?u?u?u?s?d?d?s +?l?l?s?l?s?d?d +?u?l?l?l?u?l?l?l +?l?d?l?l?l?s?d +?l?d?l?d?s?l?l +?l?l?s?l?d?d?l +?u?u?u?l?u?d?d +?d?d?l?l?l?u?u +?u?l?u?l?l?l?d?d +?l?u?u?l?l?d?d +?u?s?u?s?u?s?u +?l?s?l?l?l?s?d +?l?s?l?l?l?l?s +?u?d?l?l?l?d?d?d +?d?d?l?d?l?d?l?l +?d?d?d?d?s?d?d?s +?d?d?d?s?d?s?d?d +?l?l?s?l?d?l?l +?d?l?l?d?l?d?l?l +?d?d?l?l?l?s?d?d +?l?l?s?l?l?l?d?d +?d?d?d?d?u?l?l?d +?u?l?d?l?d?d?d?d +?d?u?u?u?u?u?u?d +?u?l?l?l?d?u?l +?l?l?l?l?d?l?u +?d?u?l?l?u?l?l +?l?l?d?d?d?d?d?d?s +?d?d?d?d?d?d?u?l?l +?d?l?d?d?d?l?s +?d?l?d?s?l?d?d +?l?d?d?d?d?u?s +?s?l?d?d?d?l?d +?l?d?d?d?s?d?l +?d?l?d?s?d?d?l +?d?d?u?u?d?d?s +?d?d?u?u?s?d?d +?l?d?d?d?s?l?d +?l?s?d?l?d?d?d +?u?s?d?d?u?d?d +?s?d?l?l?d?d?d +?d?d?u?s?d?d?l +?u?s?d?d?d?d?l +?l?s?d?d?l?d?d +?u?l?d?s?d?d?d +?d?d?d?l?d?l?s +?l?s?d?d?d?d?u +?s?d?d?u?u?d?d +?d?d?s?u?l?d?d +?l?d?s?d?d?d?l +?d?d?l?d?l?d?s +?u?d?d?d?d?s?u +?d?u?l?s?d?d?d +?d?d?l?s?d?l?d +?l?d?d?u?d?d?s +?s?d?l?d?d?l?d +?u?d?d?u?d?d?u?d?d +?l?l?l?d?s?l?l +?l?d?d?u?d?d?d?d +?u?l?l?l?u?u?u +?l?u?u?u?u?d?d?d +?u?d?l?u?d?l?d +?d?d?u?u?d?d?u?u +?u?l?d?d?l?u?d +?l?u?l?d?d?d?u +?d?l?u?l?u?d?d +?l?l?d?l?u?d?d +?u?d?u?d?l?d?l +?l?d?d?d?u?u?u +?d?d?l?d?l?l?d?l +?d?d?d?l?l?u?l +?l?d?d?l?d?u?u +?l?u?d?d?d?l?u +?l?d?u?d?l?d?l +?u?d?d?u?l?d?l +?d?u?u?d?u?d?u +?d?d?u?u?d?u?u +?u?d?l?d?u?l?d +?l?l?l?d?u?d?d +?u?d?d?d?u?l?u +?d?l?l?u?d?l?d +?l?l?d?d?d?l?u +?u?u?u?d?l?d?d +?u?d?u?l?u?d?d +?u?l?l?d?d?u?d +?l?l?l?d?u?u?u +?d?d?d?d?d?d?d?d?s?d +?d?u?l?l?l?l?s +?s?l?l?l?d?l?l +?u?d?l?l?l?l?d?d +?l?l?s?s?s?d?d +?l?l?l?l?l?s?l?l +?u?d?l?d?l?d?s +?s?d?d?d?u?u?u +?d?l?l?d?l?s?d +?d?d?u?l?l?l?s +?l?d?d?l?l?s?d +?l?d?d?l?s?l?l +?l?l?d?s?l?d?l +?l?l?d?s?l?d?d +?l?l?d?l?d?s?d +?u?l?s?u?l?d?d +?u?s?l?d?l?d?d +?s?u?l?l?d?d?d +?l?l?d?d?d?s?l +?d?l?l?d?l?d?s +?d?l?l?s?l?d?d +?u?u?l?d?d?d?s +?l?l?d?d?l?s?l +?s?s?s?l?d?d?d +?u?d?u?d?u?d?d?d +?d?d?d?d?d?l?u?l +?u?s?u?d?d?d?d?d +?d?l?d?l?l?l?d?l +?u?l?l?u?l?l?s +?l?l?l?l?d?s?l +?l?u?l?d?u?u +?l?u?l?u?l?u?d +?u?d?u?d?l?l?l +?l?l?l?l?d?u?u +?s?l?l?l?l?d?l +?d?d?l?l?u?u?u +?d?l?l?l?l?d?d?l +?l?d?u?u?l?u +?l?l?d?d?l?u?l +?u?u?l?l?d?d?l +?l?l?l?l?s?l?d?d +?d?d?d?d?s?s?s?s +?d?s?d?s?s?d?d +?u?l?u?u?d?d?d?d +?s?d?s?d?d?d?d?d +?l?l?d?d?d?l?d?d?d +?l?l?l?s?l?s?d +?l?s?s?s?l?d +?l?s?s?l?d?s +?l?s?s?s?d?l +?l?s?s?d?l?s +?l?l?s?s?d?s +?l?d?s?l?s?s +?s?l?l?s?d?s +?s?u?l?s?d?s +?u?s?u?s?d?s +?l?u?d?s?s?s +?d?l?l?s?s?s +?s?s?l?s?l?d +?d?l?s?l?s?s +?l?l?s?d?s?s +?l?l?l?l?l?l?s?l +?d?l?l?l?l?l?l?l?l +?l?l?l?s?l?l?d?d +?d?d?d?l?d?d?d?s +?u?d?d?s?d?d?d?d +?d?d?l?d?d?s?d?d +?u?u?s?s?d?d?d +?u?d?l?l?d?l?d?d +?u?d?d?l?l?l?d?d +?u?l?u?l?u?l?l +?d?d?d?s?d?d?d?d?l +?s?l?u?l?u?s +?u?l?s?l?s?l +?l?l?l?u?s?s +?s?u?u?u?s?u +?l?l?d?d?d?d?d?l?l +?l?l?l?d?d?d?l?l?l +?u?d?l?d?d?l?d?d +?l?l?l?s?l?l?s +?l?s?l?d?l?l?d +?s?l?d?l?l?d?l +?s?d?d?u?u?u?u +?d?s?d?u?u?u?u +?d?d?u?u?u?u?s +?l?d?d?l?l?s?l +?u?u?u?s?l?l?l +?s?u?s?u?u?s +?s?s?l?l?s?l +?u?d?l?l?l?l?s +?l?l?d?d?u?u?d?d +?s?l?d?l?l?d?s +?u?l?l?d?d?s?s +?l?d?d?d?d?l?d?d?d?d +?d?d?d?d?l?l?d?d?d?d +?u?l?u?s?d?d?d?d +?u?l?l?l?l?l?l?s +?l?d?d?l?d?d?d?d?d +?d?d?d?d?d?d?l?l?s +?l?l?u?l?d?d?d?d +?u?s?l?u?l?u +?l?l?u?u?u?s +?l?l?l?s?l?u +?u?l?u?s?u?l +?l?l?u?s?l?l +?u?l?u?s?l?l +?u?l?u?s?l?u +?u?l?l?u?u?s +?u?u?l?l?u?s +?d?l?l?l?l?s?s +?l?l?l?l?l?s?d?d?d +?l?l?u?d?d?l?l +?d?u?l?l?l?d?l +?u?l?d?l?d?l?u +?d?d?u?l?u?l?l +?d?d?d?l?l?l?l?d?d +?l?l?l?s?l?d?d?d +?d?s?d?s?d?s?l +?u?s?u?s?s?s +?s?l?l?s?s?s +?d?d?s?l?l?s?d?d +?s?d?l?l?l?l?s +?d?d?u?d?u?d?d?d +?u?d?d?d?d?d?u?d +?u?d?d?d?d?d?u?u +?d?d?d?d?d?u?d?u +?d?d?d?l?d?d?d?u +?u?u?d?d?d?u?d?d +?l?l?d?d?l?d?d?d?d +?d?d?d?d?u?d?u?d +?l?d?d?d?d?d?u?l +?d?u?d?u?d?d?d?d +?l?d?d?d?d?u?d?d +?d?d?u?d?d?d?d?l +?l?l?d?l?s?l?l +?l?l?d?l?l?s?l +?d?d?s?s?d?d?d?d +?l?l?l?s?l?s?l +?l?d?l?l?d?s?s +?l?s?l?d?d?d?d?d?d +?d?l?l?d?l?s?l +?u?l?l?s?l?d?d +?l?s?l?l?d?d?l +?d?l?l?d?l?l?s +?l?s?d?l?l?l?d +?d?l?d?l?l?l?s +?d?d?s?d?d?d?d?d?d?d +?u?s?l?l?d?d?d?d +?l?l?l?l?d?d?d?u +?u?l?l?u?l?l?u +?s?d?d?d?d?d?l?l +?l?l?l?d?l?s?l +?l?d?l?u?l?l?l +?u?u?l?l?u?u?d +?l?l?l?l?s?s?d?d +?d?s?d?s?d?l?d +?d?d?d?s?d?s?l +?d?s?l?d?d?d?s +?s?l?d?s?d?d?d +?d?d?s?d?l?s?d +?s?s?d?d?d?l?d +?d?l?d?s?s?d?d +?u?s?s?d?d?d?d +?l?d?d?d?s?s?d +?l?d?d?s?d?s?d +?d?s?d?l?d?s?d +?l?s?l?l?s?l?l +?u?l?l?l?d?l?l?l +?d?d?d?d?l?l?u?u +?s?l?l?l?l?l?l?l +?d?d?l?s?d?d?d?d +?d?l?d?s?d?d?d?d +?l?d?s?d?d?d?d?d +?u?u?u?u?u?l?l +?l?s?l?l?l?l?l?l +?s?l?d?d?l?l?d +?l?d?l?d?s?d?l +?s?l?d?d?d?l?l +?d?l?d?l?s?d?l +?l?d?d?d?l?s?l +?d?l?l?s?d?l?d +?s?d?d?l?l?l?d +?l?d?d?l?s?l?d +?d?d?d?s?l?u?l +?l?l?s?d?l?d?d +?l?l?u?s?d?d?d +?l?d?s?d?d?l?l +?d?l?d?d?l?l?s +?l?s?l?d?d?l?d +?d?l?d?l?l?d?s +?s?l?l?d?l?l?l +?l?l?s?l?s?l?l +?u?u?d?d?u?d?d?d +?u?u?d?d?d?d?d?l +?u?d?d?u?d?d?u?d +?d?d?d?d?d?l?l?u +?l?l?l?d?d?d?d?l?l +?l?l?l?s?l?l?l?d +?l?d?l?l?l?l?u +?s?u?u?u?d?d?s +?u?s?d?d?d?s?u +?u?l?l?s?s?d?d +?u?l?d?d?d?s?s +?l?d?d?d?l?s?s +?l?l?d?d?s?s?d +?l?s?l?d?d?s?d +?l?s?l?d?s?d?d +?u?l?s?s?d?d?d +?l?d?d?d?s?s?l +?d?d?d?l?s?l?s +?d?s?d?d?s?l?l +?u?l?l?d?d?d?d?u +?u?d?d?d?d?u?u?u +?d?d?u?u?u?d?d?d?d +?u?u?u?u?d?u?u?u +?d?u?d?l?l?l?l +?u?l?d?d?l?u?u +?u?l?d?u?d?l?l +?d?d?u?u?u?l?l +?d?u?l?u?l?u?d +?l?u?l?d?l?d?l +?u?l?d?u?l?d?u +?l?u?u?u?l?d?d +?u?l?l?u?d?l?d +?l?l?d?d?u?l?u +?l?d?l?l?l?d?u +?d?d?l?u?u?u?u +?u?l?u?d?d?u?l +?u?u?d?d?d?d?d?s +?l?l?l?l?l?u?s +?u?l?l?u?d?s +?d?s?l?u?u?u +?l?l?d?s?l?u +?l?u?l?l?s?d +?l?d?l?u?s?l +?l?l?l?s?u?d +?s?d?l?l?l?u +?l?l?s?l?d?u +?u?d?u?u?s?l +?s?l?l?d?u?u +?s?l?l?d?u?l +?l?u?u?u?d?s +?s?d?l?u?u?l +?u?d?s?u?u?l +?l?l?l?d?u?s +?d?l?l?u?s?l +?u?l?d?l?u?s +?d?s?l?u?l?u +?l?u?l?s?l?d +?l?s?u?l?d?l +?u?u?u?s?l?d +?d?l?s?l?l?u +?s?l?l?d?l?u +?l?l?u?d?l?s +?l?s?l?d?u?l +?u?l?l?s?d?u +?l?u?u?d?u?s +?u?u?u?l?s?d +?d?l?l?s?u?u +?u?d?u?l?u?s +?u?l?s?d?u?u +?d?u?l?s?u?l +?d?l?u?l?u?s +?d?u?s?l?u?u +?u?u?l?l?d?s +?u?d?l?s?u?l +?u?l?u?d?u?s +?l?u?s?l?u?d +?s?d?u?l?u?u +?u?s?u?d?u?l +?s?l?l?l?d?u +?l?u?u?s?l?d +?d?s?u?l?l?u +?s?l?d?u?l?l +?s?d?l?u?l?l +?d?d?s?u?l?l?l +?u?d?u?s?u?u +?l?l?s?d?l?u +?u?l?d?u?s?u +?u?l?d?s?l?u +?u?d?s?l?u?l +?u?s?l?l?u?d +?u?u?u?u?s?u?d +?s?u?d?l?l?l +?s?u?l?d?l?l +?d?l?s?l?u?l +?s?l?l?d?d?l?l +?l?u?d?s?l?l +?s?l?l?u?d?l +?u?l?u?u?d?s +?s?l?d?l?l?l?l +?l?u?u?d?l?s +?u?u?u?l?d?s +?u?u?l?u?s?d +?l?d?u?s?l?l +?s?l?l?d?l?l?s +?l?u?d?u?l?s +?u?s?l?u?l?d +?l?l?l?d?s?u +?l?l?u?u?s?d?d +?l?s?u?u?l?d +?l?u?l?s?d?l +?s?u?u?d?u?u +?u?u?u?d?s?u +?l?d?u?u?l?s +?u?u?u?d?l?s +?l?s?l?d?d?l?l +?u?d?u?u?l?s +?u?u?d?d?u?u?s +?l?u?s?d?l?u +?l?u?s?d?l?l +?l?u?s?l?l?d +?u?l?l?l?d?l?s +?u?l?s?l?u?d +?s?u?l?u?d?u +?d?l?u?u?u?s +?u?d?l?u?s?u +?u?d?u?l?s?l +?l?s?d?u?l?l +?s?u?u?d?l?l +?d?l?u?l?s?l +?d?u?l?u?l?s +?l?u?s?l?d?l +?l?l?d?s?u?l +?u?s?l?l?d?u +?s?d?u?u?l?u +?l?d?l?u?l?s +?u?l?d?u?u?s +?u?s?l?u?d?l +?d?s?u?u?l?l +?d?l?s?u?u?u +?u?l?u?u?s?d +?u?l?s?d?l?l +?d?u?l?s?l?l +?s?l?l?u?u?d +?l?s?d?s?l?s?d +?u?d?u?l?d?d?u +?l?d?l?d?d?l?u +?u?d?l?d?d?l?l +?d?u?l?u?d?d?l +?l?d?u?l?l?d?d +?d?l?l?d?u?u?d +?u?u?d?d?l?d?l +?d?u?d?u?u?d?u +?u?d?d?l?u?d?u +?l?d?l?u?d?d?l +?d?u?d?l?l?l?d +?d?d?u?d?u?u?u +?l?l?u?d?d?l?d +?l?l?u?d?l?d?d +?l?u?d?l?l?d?d +?u?l?l?d?u?d?d +?l?d?u?d?d?u?l +?d?u?d?u?u?u?d +?u?d?d?l?u?l?d +?l?u?l?d?l?d?d +?l?d?l?d?u?d?l +?d?l?l?u?u?d?d +?d?d?u?d?l?l?l +?u?d?d?u?l?l?d +?u?d?d?d?l?l?u +?u?d?u?l?d?u?d +?l?u?u?l?d?d?d?d +?l?u?d?d?d?u?l +?d?l?l?u?l?d?d +?d?l?l?d?l?d?u +?l?u?d?l?u?d?d +?l?d?u?d?l?u?d +?u?d?l?u?l?d?d +?l?d?d?d?l?l?u +?d?d?d?l?u?l?u +?d?u?l?u?l?d?d +?d?d?u?u?l?l?d +?d?l?u?d?l?u?d +?u?l?u?d?d?u?d +?d?d?d?d?s?u?u?u +?u?l?l?d?d?u?l?l +?s?l?l?d?d?d?d?s +?d?d?d?d?l?l?s?s +?d?l?l?d?d?d?d?d?d +?d?d?d?l?d?d?d?d?l +?d?l?s?s?s?s +?l?s?s?s?s?d +?l?s?s?d?s?s +?s?l?d?s?s?s +?u?s?s?s?s?d +?l?s?d?s?s?s +?u?l?u?l?l?d?d?d +?d?u?u?u?u?u?d?d +?u?u?d?u?l?l?l +?s?s?s?l?l?l?l +?s?l?d?l?l?l?s +?s?d?d?s?d?d?d?d +?u?u?u?u?u?u?s?d +?l?l?l?l?d?l?l?l?l +?d?d?s?d?s?d?d?l +?d?l?d?d?l?l?d?l +?l?l?l?s?s?s?s +?u?s?l?s?l?s +?d?d?l?l?l?l?l?s +?l?l?l?s?d?d?d?d?d +?l?d?l?s?d?d?d?d +?d?d?l?s?s?l?l +?l?d?s?l?d?s?l +?l?l?l?d?s?d?s +?l?u?u?d?d?d?d?d +?l?l?s?d?s?l?l +?d?d?d?d?d?d?l?d?l +?l?d?l?d?l?d?l?d?l +?l?d?d?d?s?d?d?d?d +?d?d?d?d?u?u?u?u?u +?d?u?l?l?l?l?u +?l?l?d?u?l?l?l +?d?d?d?d?d?l?l?l?l?l +?l?l?s?l?l?l?s +?u?d?l?l?l?l?l?l +?u?l?l?l?l?d?d?l +?d?u?l?l?l?l?l?d +?u?l?l?d?l?l?l?l +?s?l?u?u?l?s +?s?u?u?s?u?u +?u?s?u?l?u?s +?l?u?l?u?s?s +?l?s?u?s?l?l +?u?s?l?l?s?u +?u?l?s?u?s?u +?l?l?u?s?s?l +?u?l?l?s?l?s +?l?s?l?l?s?u +?l?l?u?u?s?s +?u?s?u?s?u?l +?l?l?l?d?s?s?s +?d?d?d?d?d?s?s?l +?l?d?d?s?d?s?d?d +?u?l?l?l?d?d?l?l +?s?l?l?s?d?d?d?d +?d?l?d?l?s?l?l +?s?l?d?d?l?l?l +?l?d?l?l?d?s?l +?u?d?l?l?d?l?s +?l?u?l?l?s?d?d +?u?d?d?s?u?u?u +?l?l?s?l?d?l?d +?d?l?l?s?l?l?d +?l?d?s?l?d?l?l +?l?d?l?l?s?d?l +?u?l?d?d?l?l?s +?s?d?l?l?l?d?l +?d?d?d?l?u?d?d?d +?d?d?d?d?l?u?d?d +?d?d?d?d?d?d?d?d?u?u +?d?u?d?d?d?u?d?d +?d?d?l?d?d?d?d?u +?d?d?d?u?d?u?d?d +?d?d?d?d?u?d?d?u +?d?d?d?d?u?d?d?l +?d?d?d?u?d?d?d?l +?l?d?d?d?d?d?u?d +?d?l?d?u?d?d?d?d +?d?s?d?s?d?s?s +?s?s?s?s?s?u +?u?d?l?u?d?l?u +?l?d?l?u?l?l?d +?u?l?u?l?d?d?l +?l?l?d?l?l?d?u +?l?l?l?d?d?l?u +?u?u?d?l?l?l?d +?u?d?l?l?l?d?u +?d?d?u?u?u?u?l +?d?l?l?d?l?l?u +?u?l?d?u?l?u?d +?l?d?d?u?l?l?l +?u?l?l?d?d?l?u +?l?u?l?u?u?d?d +?s?u?u?u?u?u?d +?l?l?l?s?s?s?d +?l?l?u?u?l?l?l +?d?d?l?l?d?d?d?s +?d?d?d?d?d?l?d?s +?d?d?d?d?l?s?d?d +?d?d?d?d?s?l?d?d +?d?d?d?l?s?d?d?d +?s?d?s?l?l?l?l +?l?l?d?l?l?s?s +?u?l?u?d?l?l?l +?l?l?d?l?l?l?u +?d?l?l?l?l?u?u +?d?u?l?l?l?l?d?d +?u?l?l?l?s?u?l +?l?l?s?d?d?s?l +?d?d?d?u?u?l?d +?u?d?d?d?l?d?u +?u?l?d?d?d?u?d +?l?d?d?u?d?u?d +?u?u?d?d?d?l?d +?l?d?u?d?d?d?l +?d?u?u?l?d?d?d +?l?d?d?d?d?u?u +?d?d?d?l?d?u?u +?d?d?u?l?d?d?l +?d?l?d?u?u?d?d +?d?l?d?d?l?d?u +?d?l?d?d?u?d?u +?d?u?l?d?d?d?u +?l?d?d?d?u?u?d +?u?l?d?u?d?d?d +?d?l?d?u?d?d?l +?d?d?d?l?l?u?d +?d?u?l?d?d?l?d +?u?d?l?d?d?d?u +?l?u?d?d?d?l?d +?d?d?d?u?l?d?u +?d?d?l?d?d?l?u +?d?d?u?d?l?d?u +?d?d?u?d?l?d?l +?d?d?d?u?d?l?l +?l?d?d?l?d?u?d +?u?d?l?d?d?u?d +?d?d?d?l?l?d?u +?d?d?l?u?d?u?d +?d?d?u?d?d?l?u +?d?d?l?l?d?u?d +?d?d?l?u?d?d?u +?l?d?u?d?d?l?d +?d?l?d?d?d?u?u +?d?d?l?u?d?d?l +?d?d?d?u?l?u?d +?l?u?d?l?d?d?d +?d?l?d?d?u?l?d +?l?d?d?u?u?d?d +?u?d?u?d?d?l?d +?d?d?l?u?d?l?d +?d?l?d?u?d?d?u +?l?u?d?d?d?u?d +?d?l?l?d?u?d?d +?l?d?u?d?d?u?d +?l?d?l?d?d?d?u +?d?u?l?d?l?d?d +?u?d?d?d?l?u?d +?u?d?u?d?d?d?l +?l?d?u?l?d?d?d +?l?d?d?d?u?l?d +?u?d?l?d?d?u?d?d +?d?l?l?d?d?d?u +?d?l?d?l?d?u?d +?d?l?d?l?d?d?u +?d?d?d?u?d?u?l +?u?d?d?d?u?d?l +?d?l?l?u?d?d?d +?l?d?d?u?d?l?d +?d?d?u?u?d?l?d +?l?d?d?d?u?d?l +?d?d?s?d?d?s?d?d?l +?s?d?d?d?d?d?d?d?d?d +?u?l?l?u?l?u?l +?d?d?d?s?d?d?s?d?d +?l?l?s?d?d?d?d?s +?s?d?d?s?s?d?d +?s?s?d?d?d?s?d +?d?d?s?d?s?d?s +?d?d?s?s?d?d?s +?s?d?d?d?d?s?d?d +?d?d?s?d?d?d?d?s +?d?d?d?d?d?s?s?d +?l?l?l?l?d?u?l +?u?u?u?u?u?u?u?u?d +?s?l?l?l?l?d?d?s +?d?d?l?l?l?l?d?d?d +?u?u?d?d?d?s?s +?d?d?d?l?s?s?l +?d?l?d?l?d?s?s +?u?s?u?s?d?d?d?d +?s?u?u?d?d?d?s +?s?d?l?d?l?d?s +?s?u?u?s?d?d?d +?l?s?d?l?s?d?d +?s?u?s?u?d?d?d +?s?s?s?s?s?s?s +?u?l?l?l?l?d?l?l +?u?u?u?u?d?d?d?u +?d?d?d?d?d?d?u?d?d +?u?u?u?u?s?s?s +?d?s?u?u?u?u?u +?s?d?d?d?d?l?l?l +?d?d?s?l?l?l?d?d +?u?l?l?l?l?l?d?s +?u?u?u?u?d?d?d?s +?d?l?s?l?l?l?d +?s?d?l?d?l?l?l +?u?u?l?l?s?d?d +?l?l?l?d?l?s?d +?l?l?l?s?s?d?d?d +?d?u?u?u?u?d?d?d +?d?s?d?s?d?s?d?s +?u?d?u?s?s?u +?d?s?u?u?u?s +?s?u?d?u?l?s +?l?l?s?u?s?d +?u?s?l?s?l?d +?l?s?l?u?d?s +?u?d?u?l?s?s +?l?u?l?d?s?s +?u?l?s?l?s?d +?s?u?d?u?u?s +?u?s?u?u?d?s +?d?s?s?u?u?u +?s?s?d?u?l?u +?s?d?l?l?s?l +?u?s?u?d?s?u +?s?u?l?d?s?l +?l?s?s?d?l?l +?s?l?d?l?u?s +?s?l?l?s?d?l +?u?s?s?l?d?l +?u?s?l?d?s?l +?u?s?u?d?u?s +?l?d?l?s?s?u +?l?l?d?u?s?s +?u?s?s?l?l?d +?d?s?l?s?l?l +?u?d?l?s?l?s +?s?s?l?l?u?d +?l?u?s?d?l?s +?l?s?u?s?l?d +?u?l?l?s?s?d +?u?l?s?l?d?s +?s?u?s?u?d?u +?u?l?d?l?s?s +?l?u?s?d?u?s +?l?u?l?s?s?d +?s?l?u?d?l?s +?u?u?s?s?u?d +?l?l?u?s?d?s +?d?s?l?l?s?l +?d?u?s?u?s?u +?u?s?l?l?s?d +?s?d?u?u?u?s +?s?s?u?u?l?d +?u?s?s?u?d?l +?s?d?u?l?s?l +?s?l?l?d?s?l +?s?u?u?u?s?d +?l?s?u?u?d?s +?s?u?l?u?d?s +?s?s?u?u?u?d +?s?u?u?l?d?s +?l?d?s?l?s?u +?s?u?d?l?s?u +?u?d?s?l?s?u +?u?l?u?d?s?s +?u?s?u?u?s?d +?u?l?u?s?s?d +?s?l?l?l?d?l?s +?u?l?s?d?l?s +?d?l?l?l?u?u?u +?u?l?l?u?u?u?d +?u?l?l?l?s?s?s +?l?s?d?d?d?l?l +?l?l?u?d?d?d?s +?d?l?d?s?l?d?l +?u?l?d?d?s?l?d +?l?d?d?s?l?d?l +?l?s?d?d?l?l?d +?l?u?l?d?d?d?s +?d?d?l?d?l?l?s +?u?d?u?s?d?u?d +?d?u?d?u?d?u?s +?d?l?l?l?d?s?d +?d?l?s?l?d?l?d +?u?d?s?l?l?d?d +?u?l?d?s?d?d?l +?l?d?s?d?l?d?l +?d?s?l?l?d?d?l +?d?d?d?d?u?l?l?s +?u?l?d?d?l?d?s +?u?d?d?s?d?u?u +?u?d?l?l?s?d?d +?u?l?l?d?d?s?d?d +?l?d?d?l?d?s?l +?u?d?d?d?u?u?d?d +?u?u?d?d?d?d?u?d +?u?d?d?u?u?d?d?d +?u?d?d?l?d?l?d?d +?u?l?d?d?d?d?d?l +?s?s?s?d?s?s +?s?s?d?s?s?s +?l?u?l?l?s?u +?l?s?l?u?l?l +?u?u?s?u?l?u +?s?l?u?u?l?l +?u?u?l?s?l?l +?u?u?u?u?l?s +?l?l?u?l?u?s +?s?u?l?l?l?l?d +?u?l?u?u?l?s +?s?l?l?l?u?l +?u?l?s?l?l?l?d +?l?s?l?l?u?u +?u?s?l?u?l?l +?l?s?l?u?u?u +?u?u?l?l?s?l +?s?u?u?u?u?l +?l?l?u?u?l?s +?u?l?s?l?l?u +?u?l?s?l?u?u +?l?l?s?l?u?l +?u?u?l?l?l?l?s +?u?u?u?s?u?l +?s?l?u?u?u?u +?l?l?u?u?s?l +?l?s?u?u?l?l +?s?u?l?u?l?u +?d?d?d?d?d?d?s?s?s +?s?l?l?l?d?d?d?s +?s?d?s?d?s?d?s +?s?s?s?s?d?d?d?d +?s?s?s?d?d?d?s +?u?d?l?u?l?d?l +?u?d?l?l?d?u?l +?u?l?u?d?d?l?u +?u?l?l?d?d?d?l?l +?u?d?l?d?l?l?u +?d?u?l?l?d?l?l +?u?l?l?u?l?d?d?d +?l?l?l?l?d?u?d +?u?l?d?l?l?d?u +?d?d?l?u?u?l?l +?u?d?l?d?u?l?l +?u?u?l?u?l?d?d +?l?d?d?u?u?u?u +?u?l?u?l?d?d?u +?u?l?u?l?d?l?d +?l?l?u?l?u?d?d +?u?u?u?u?d?l?d +?u?l?l?u?l?l?l?d +?u?d?l?d?l?l?d?d +?d?d?u?u?l?l?d?d +?d?d?d?d?l?l?l?l?d +?d?d?d?u?d?d?d?d?d +?u?u?u?u?u?u?u?s +?u?u?u?u?u?u?u?u?u +?u?l?l?l?u?l?d?d +?u?u?u?u?l?l?d?d +?l?l?d?l?l?d?d?d?d +?d?d?d?d?d?d?d?d?d?d?l +?d?d?l?l?s?s?s +?s?s?s?l?l?d?d +?u?s?l?d?d?d?d?d +?d?d?d?d?d?u?l?s +?u?l?l?l?l?l?d?l +?d?d?d?d?d?d?d?l?u +?u?l?l?l?d?l?d?d +?l?d?l?l?l?d?d?d?d +?l?l?l?d?l?l?u +?u?l?u?u?l?u?d +?u?l?l?d?l?l?u +?u?l?l?u?d?l?l +?l?d?u?l?l?l?l +?u?u?u?u?d?l?l +?d?u?u?u?u?u?s +?d?s?u?l?l?l?l +?s?d?d?d?l?l?l?l +?d?d?d?d?s?u?l?l +?u?u?u?d?d?s?d?d +?l?s?l?l?s?l?d +?s?s?l?l?l?l?d +?u?l?l?d?l?l?d?d +?l?s?d?d?d?d?s?l +?u?s?l?s?s?l +?u?s?u?s?s?u +?u?s?l?l?s?s +?s?s?u?u?u?s +?u?s?u?s?l?s +?u?l?l?l?d?d?d?l +?u?u?u?l?l?l?l?d +?d?d?s?l?s?l?l +?s?l?l?d?d?l?s +?d?l?l?l?d?s?s +?d?s?d?d?d?d?d?l +?s?d?d?l?d?d?d?d +?d?l?s?d?d?d?d?d +?d?d?d?d?l?d?d?s +?l?l?l?d?s?d?d?d +?l?l?s?d?l?l?d +?d?l?d?s?l?l?l +?l?d?s?l?l?l?d +?l?l?l?d?s?l?d +?u?d?d?l?l?l?s +?l?l?l?u?s?d?d +?l?d?s?d?l?l?l +?s?l?l?l?d?d?l +?d?s?l?l?l?l?d +?u?l?d?d?d?d?d?d?d?d +?u?u?u?d?d?d?l?l +?u?l?d?l?l?l?d?d +?u?d?u?u?u?d?d?d +?d?d?u?l?l?u?d?d +?u?d?u?d?l?d?l?d +?d?u?l?l?l?d?d?d +?u?u?u?d?u?d?d?d +?u?d?u?u?d?u?d?d +?s?s?d?d?d?d?d?d?d +?d?d?d?d?d?s?d?s +?u?d?s?d?d?s?d?d +?u?s?d?l?l?l?l +?u?u?u?u?u?d?d?u +?l?d?d?d?l?d?d?d?l +?d?d?d?d?d?u?u?l +?u?u?d?l?d?d?d?d +?u?d?d?l?l?d?d?d +?l?d?d?d?d?d?u?u +?d?d?d?s?d?d?d?d?d?d +?l?s?l?s?l?d?d?d +?d?l?l?l?u?l?l +?u?l?u?l?l?u?d +?d?u?u?u?l?l?l +?u?u?u?u?u?d?l +?l?l?d?u?u?u?u +?u?u?l?l?l?u?d +?d?u?l?u?l?l?l +?l?d?l?d?s?s?s +?s?l?l?l?l?s?d?d +?l?l?d?d?d?d?l?l?l +?u?l?u?l?l?l?s +?s?l?l?l?l?s?s +?u?u?u?d?u?u?u?d +?d?u?d?d?u?s?d +?s?d?d?l?d?d?l +?s?u?d?d?d?d?u +?d?d?u?d?d?u?s +?d?d?d?d?l?u?s +?l?d?d?l?d?s?d +?s?d?u?l?d?d?d +?d?d?u?l?d?d?s +?l?d?d?s?d?l?d +?d?l?d?l?d?d?s +?u?d?s?l?d?d?d +?l?d?u?d?d?s?d +?u?d?d?s?l?d?d +?d?d?l?l?d?s?d +?d?l?l?d?d?s?d +?d?l?l?s?d?d?d?d +?u?d?d?s?d?d?l +?l?u?d?s?d?d?d +?d?d?d?u?u?d?s +?d?d?s?l?d?d?l +?d?d?d?u?u?s?d +?s?l?u?d?d?d?d +?d?s?l?l?d?d?d +?d?d?u?s?d?d?u +?d?d?s?u?u?d?d +?d?u?d?s?d?u?d +?d?d?d?s?d?u?l +?d?d?d?s?l?u?d +?u?d?d?d?s?u?d +?d?d?d?l?l?d?d?s +?s?d?d?l?d?l?d +?u?s?d?d?d?d?u +?d?d?s?d?d?u?l +?d?l?d?d?l?s?d +?u?d?u?d?d?d?s +?d?d?s?d?l?l?d +?u?d?l?s?d?d?d +?d?d?d?l?s?d?l +?l?d?s?d?d?l?d +?s?d?d?d?l?d?l +?d?l?d?d?s?l?d +?l?s?d?d?u?d?d +?d?d?s?l?d?l?d +?s?d?d?u?d?d?u +?u?d?d?u?d?s?d +?d?d?s?d?l?d?l +?d?s?d?l?d?l?d +?d?d?d?d?l?s?u +?u?d?s?d?d?l?d +?d?d?d?d?u?s?l +?u?d?s?d?u?d?d +?d?s?d?d?l?d?l +?d?d?d?s?u?d?u +?s?l?d?d?u?d?d +?d?d?u?u?d?s?d +?s?d?d?d?d?l?u +?d?u?d?s?d?l?d +?l?d?d?s?u?d?d +?d?d?d?u?s?u?d +?d?u?s?d?d?d?u +?s?u?d?d?l?d?d +?d?u?u?d?s?d?d +?u?d?l?d?s?d?d +?s?u?d?l?d?d?d +?s?s?s?d?d?d?d?d +?d?d?d?u?u?d?d?d?d +?d?d?l?d?d?u?d?d +?u?s?u?s?u?s?d +?u?l?l?l?l?l?u?d +?l?l?l?d?l?s?s +?l?l?l?l?s?u?s +?l?l?s?l?l?s?l +?u?u?l?l?l?l?l?d +?u?d?l?u?u?d?d +?l?d?u?l?d?l?d +?u?d?u?l?d?d?l +?u?d?l?d?d?l?u +?d?u?d?u?l?u?d +?d?u?l?d?l?u?d +?d?u?u?d?d?u?u +?l?d?u?u?d?u?d +?u?d?d?u?u?l?d +?l?d?l?u?u?d?d +?l?l?u?d?u?d?d +?d?u?u?u?d?d?u +?l?d?d?d?u?l?u +?u?d?u?d?l?d?u +?l?l?d?l?d?d?u +?l?u?d?d?u?u?d +?d?u?l?d?d?u?u +?u?d?d?l?d?u?l +?u?l?d?u?d?d?l +?u?l?d?l?l?d?d?d +?l?d?l?d?l?u?d +?l?u?d?d?l?d?l +?u?u?d?l?d?l?d +?u?u?l?d?u?d?d +?u?d?d?d?l?u?u +?l?u?d?d?u?l?d +?l?d?l?d?u?d?u +?l?d?l?l?d?u?d +?d?l?d?u?u?d?l +?d?u?u?d?l?l?d +?d?d?u?l?d?u?l +?u?u?d?d?u?l?d +?u?l?d?l?d?d?u +?u?d?u?d?d?l?l +?u?d?l?d?u?d?u +?d?u?u?l?l?d?d +?u?d?l?d?l?u?d +?l?d?l?d?d?u?l +?u?u?d?u?l?d?d +?l?d?d?l?l?d?u +?d?l?u?u?l?d?d +?d?u?d?l?d?l?u +?l?l?d?d?u?d?l +?d?d?l?l?l?d?u +?u?l?d?l?d?u?d +?l?u?d?d?d?u?u +?u?u?l?d?d?l?d +?u?d?l?d?d?u?u +?u?d?l?d?d?u?l +?d?l?l?d?d?u?l +?d?u?l?d?l?l?d +?d?l?u?d?l?d?l +?l?u?d?l?d?d?l +?l?d?l?u?d?l?d +?u?l?l?d?l?d?d?d +?l?u?d?l?d?l?d +?d?d?l?u?d?l?u +?d?l?l?d?d?l?u +?l?d?u?u?l?d?d +?d?d?d?u?l?u?u +?l?d?d?l?u?l?d +?u?d?d?d?u?u?l +?l?l?d?d?d?u?l +?d?u?l?d?l?d?u +?d?l?u?d?l?l?d +?d?l?u?l?d?l?d +?d?u?l?u?d?d?u +?d?l?d?l?l?d?u +?u?l?d?d?d?d?l?u +?l?d?d?d?u?l?l +?l?u?d?d?l?d?u +?u?l?d?u?d?l?d +?l?d?u?u?u?d?d +?l?l?d?u?l?d?d +?u?d?d?l?d?l?u +?d?d?u?u?u?d?u +?d?l?l?u?d?d?l +?d?d?u?u?d?l?l +?u?u?u?d?d?l?d +?d?u?u?u?l?d?d +?d?d?u?l?d?l?l +?u?u?u?u?d?d?u?u +?l?l?u?l?l?l?d?d +?u?u?u?u?u?u?d?u +?u?l?l?l?l?l?l?u +?u?u?s?u?u?u?d +?u?l?l?d?l?l?s +?u?l?d?l?l?l?s +?u?s?u?d?u?u?u +?u?s?l?l?d?l?l +?u?l?l?l?u?s?d +?u?l?l?s?l?l?d +?u?s?u?l?l?l?d +?u?l?l?l?u?l?l?d +?u?l?l?l?l?u?l?l +?u?d?d?d?s?s?s +?l?l?l?l?l?d?d?d?s +?l?l?l?u?u?u?d?d +?d?s?d?d?s?d?d?u +?l?d?d?l?l?d?d?d?d +?l?d?l?u?l?d?l +?u?u?u?l?d?d?l +?d?l?l?l?u?l?d +?d?l?l?d?u?u?u +?u?l?d?u?l?d?l +?l?l?l?d?d?d?u?u +?u?u?u?u?u?d?d?s +?u?u?u?u?d?u?d?d +?u?u?d?d?d?u?u?u +?u?d?d?l?u?l?l +?u?l?d?u?l?l?d +?d?d?u?l?u?u?l +?u?l?u?u?l?l?d +?l?l?l?u?d?d?l +?u?u?l?d?l?l?l +?u?l?l?l?u?d?l +?d?u?l?l?u?l?d +?l?d?l?l?d?u?l +?u?d?l?l?u?l?d +?l?l?l?u?d?l?d +?u?u?d?d?u?l?l +?u?l?d?d?u?u?l +?u?l?d?l?u?d?l +?u?d?l?l?l?l?u +?l?d?u?d?u?u?u +?d?l?u?l?u?l?d +?d?l?u?l?l?l?l +?u?l?l?u?d?d?u +?l?u?d?l?l?u?d +?d?d?l?u?l?u?l +?u?l?l?l?d?l?u +?u?l?u?d?u?l?u +?l?l?u?l?d?l?d +?u?l?l?d?u?d?l +?l?d?l?d?l?l?u +?l?d?l?l?d?l?u +?u?l?u?d?d?l?l +?u?u?l?l?d?d?u +?u?d?u?l?u?d?l +?u?l?u?d?d?u?u +?l?l?d?d?l?s?s +?u?s?u?u?s?d?d +?u?l?l?l?l?l?l?l?d +?u?d?d?u?u?u?d?d +?d?d?d?u?u?u?d?d?d +?u?d?d?l?l?l?l?l +?s?u?l?l?d?d?d?d +?l?l?l?u?u?d?d?d +?u?u?s?l?l?l?l +?s?u?u?s?d?s +?u?u?d?s?s?s +?s?d?l?s?s?l +?u?s?s?s?d?u +?u?l?d?s?s?s +?u?s?l?s?s?d +?s?l?s?s?l?d +?s?s?l?l?d?s +?s?l?s?l?s?d?d +?s?l?s?s?d?l +?s?l?d?u?s?s +?d?s?l?s?l?s +?u?d?u?s?s?s +?d?s?l?l?s?s +?u?l?s?s?s?d +?s?l?s?d?l?s +?l?u?s?s?d?s +?s?d?s?l?l?s +?l?d?s?s?s?l +?u?d?s?s?u?s +?d?s?l?u?s?s +?u?s?s?u?s?d +?u?s?d?u?s?s +?s?d?l?s?u?s +?s?s?s?l?d?l +?s?d?u?l?s?s +?s?l?s?l?s?d +?s?u?s?u?s?d +?d?s?s?l?s?l +?s?l?l?s?s?d +?s?u?u?d?s?s +?u?u?s?s?s?d +?u?d?l?s?s?s +?l?l?s?s?s?d +?d?l?l?l?l?l?l?s +?s?s?s?s?s?d?d +?u?l?u?l?u?s?d +?u?l?l?l?s?l?d +?u?s?d?d?d?d?d?d?d +?u?u?d?d?u?u?u?u +?s?l?d?d?l?d?s +?d?d?l?l?s?s?d +?l?l?d?s?d?d?s +?l?d?l?d?d?s?s +?l?d?l?s?s?d?d +?l?s?d?d?l?s?d +?s?l?d?l?d?d?s +?d?d?s?d?s?l?l +?d?l?l?s?s?d?d +?l?l?d?s?d?s?d +?d?s?l?l?s?d?d +?l?l?d?d?s?d?s +?l?d?l?d?s?s?d +?d?d?l?s?d?l?s +?u?u?s?d?d?d?s +?u?u?d?d?d?d?s?s +?l?l?l?l?l?l?d?d?s +?s?d?d?l?l?l?l?l +?l?l?l?l?d?d?d?d?l +?d?d?d?d?s?d?l?l +?l?d?d?d?d?d?l?s +?l?l?d?d?l?l?l?d?d +?l?l?l?l?s?d?d?s +?l?d?l?l?l?s?s +?l?l?s?s?l?u +?s?s?l?l?l?u +?u?l?s?l?s?u +?s?l?l?u?s?l +?u?l?s?s?l?u +?u?u?s?l?s?l +?u?s?s?l?l?u +?s?u?l?u?s?l +?l?u?l?s?s?l +?u?u?s?s?l?l +?s?l?l?l?s?u +?l?s?u?l?s?u +?u?l?l?s?s?u +?u?l?u?s?l?s +?s?s?u?u?l?l +?u?l?s?l?u?s +?u?l?s?s?u?l +?u?l?d?d?l?l?l?l +?u?u?u?u?u?d?u?d +?u?u?l?l?l?u?u +?u?u?d?d?l?d?d?d +?d?u?u?d?d?u?d?d +?d?u?d?u?d?u?d?d +?l?d?u?d?d?l?d?d +?l?l?u?l?s?d?d +?s?l?d?l?d?l?l +?d?l?l?l?s?l?d +?d?l?s?l?d?l?l +?l?l?l?s?u?d?d +?u?l?l?s?u?d?d +?l?d?l?s?d?l?l +?s?l?d?l?l?l?d +?u?s?l?d?l?l?d +?s?l?l?l?d?l?d +?u?u?u?u?d?d?d?d?d?d +?d?d?d?d?u?u?u?s +?l?l?l?l?u?u?d?d +?d?d?d?d?u?l?l?u +?s?s?s?u?s?s +?u?s?l?l?l?l?d?d +?u?l?l?l?u?l?s +?s?d?d?d?d?d?s?l +?u?l?l?u?u?l?d +?l?l?u?l?l?d?l +?u?d?d?d?l?l?l?l +?s?s?d?l?l?l?l +?d?d?d?d?u?l?l?l?l +?d?d?d?d?s?s?l?l +?d?d?d?d?d?u?u?u?u +?d?d?s?d?d?s?d?d?s +?l?l?l?d?d?l?l?d?d +?l?d?l?l?d?d?d?d?d +?d?d?d?d?l?l?l?l?l?l +?l?l?l?d?d?d?d?d?d?d?d +?u?s?s?s?u?s +?u?l?s?s?s?s +?s?u?s?s?u?s +?s?s?u?s?s?u +?u?l?l?u?u?l?l +?u?l?u?l?l?u?l +?u?l?l?u?l?l?l?l +?d?d?d?d?d?d?d?s?u +?l?u?u?u?u?u?s +?l?l?l?u?l?l?d?d +?u?u?d?u?u?d?d?d +?l?d?d?s?d?d?s?d?d +?l?s?l?s?s?d?d +?l?s?l?s?d?d?s +?d?s?l?s?l?s?d +?d?d?d?d?d?l?l?l?d +?l?l?l?l?l?l?u?d +?s?l?l?l?l?l?l?d +?d?d?d?s?d?d?s?d +?d?s?d?d?d?d?s?d +?s?d?d?d?d?d?s?d +?u?u?u?u?u?d?u?u +?s?l?s?l?l?d?d +?u?s?l?l?s?d?d +?l?s?d?d?s?l?l +?l?l?l?d?s?s?d +?l?l?s?s?d?d?l +?s?d?l?l?d?l?s +?s?l?s?l?l?l?l +?d?l?l?l?l?l?l?l?d +?l?u?l?s?d?d?d?d +?u?l?d?d?d?l?l?l +?d?d?s?d?s?d?d?s +?d?s?l?l?l?l?s +?u?l?u?l?l?l?u +?s?l?d?l?d?d?d?d +?d?d?d?d?l?l?s?d +?d?d?d?s?d?d?l?l +?u?u?u?s?u?u?d +?u?s?u?d?l?l?l +?u?u?s?d?u?u?u +?l?d?l?d?l?d?l?d?d +?l?u?u?l?u?u?d +?u?u?l?l?d?l?l +?u?l?l?l?d?u?u +?d?l?u?u?u?u?u +?l?u?l?d?l?l?l +?l?u?u?l?l?l?d +?u?l?u?l?u?u?d +?u?u?l?l?l?d?l +?d?d?d?l?l?l?s?s +?d?d?l?s?s?d?d +?u?d?s?d?d?d?s +?s?s?u?d?d?d?d +?d?s?s?l?d?d?d +?u?d?s?d?d?s?d +?s?d?s?d?d?l?d +?d?l?d?d?d?s?s +?s?u?d?d?d?d?s +?u?d?d?s?d?s?d +?d?d?d?s?l?d?s +?d?l?s?d?d?s?d +?s?d?d?d?s?d?l +?d?d?s?s?d?l?d +?u?d?d?s?s?d?d +?d?d?u?s?s?d?d +?d?d?d?s?s?d?l +?d?s?s?d?d?d?l +?s?d?d?d?l?d?s +?d?s?d?d?d?s?l +?s?d?d?d?d?s?u +?s?d?d?u?s?d?d +?d?d?l?s?d?s?d +?d?d?s?d?s?d?u +?s?d?d?u?d?d?s +?u?s?d?s?d?d?d +?s?s?d?d?d?d?u +?d?d?d?l?s?d?s +?s?d?s?d?d?d?l +?l?d?s?d?d?d?s +?d?d?d?d?s?s?u +?l?s?d?d?d?s?d +?s?l?d?d?s?d?d +?d?s?d?s?u?d?d +?d?d?s?d?l?d?s +?d?s?l?s?d?d?d +?u?l?l?l?l?d?l?d +?u?l?l?d?u?l?l?d +?u?d?l?l?d?d?l?d +?d?d?d?d?l?u?l?l +?d?d?u?u?d?d?l?l +?d?d?d?d?d?d?d?d?l?d +?d?d?d?d?s?d?d?u +?d?d?d?s?d?d?l?d +?d?d?d?s?l?d?d?d +?d?d?d?s?d?l?d?d +?l?u?l?d?d?d?d?d?d +?u?d?l?l?l?l?l?d +?d?d?d?d?d?d?d?d?s?l +?l?l?l?l?d?d?l?l?l +?l?u?l?l?l?d?d?d +?d?l?d?l?s?l?d +?d?u?l?l?s?d?d +?d?d?u?u?u?s?d +?d?l?d?s?d?l?l +?u?u?d?s?u?d?d +?l?u?l?d?s?d?d +?u?l?d?d?d?s?l +?u?d?d?l?l?d?s +?u?u?d?d?s?d?u +?l?l?d?d?s?l?d +?d?l?s?l?l?d?d +?d?d?d?u?u?s?u +?u?s?d?d?d?l?l +?l?s?l?u?d?d?d +?u?l?u?d?d?d?d?s +?u?d?u?d?u?s?d +?d?l?s?d?d?l?l +?s?d?l?d?l?l?d +?l?d?s?l?d?d?l +?d?l?d?l?d?s?l +?s?d?d?l?l?d?l +?u?u?s?d?d?u?d +?d?l?l?d?s?l?d +?d?l?d?d?l?s?l +?s?l?l?d?d?l?d +?u?l?d?s?l?d?d +?d?d?l?l?s?l?d +?s?u?u?d?u?d?d +?s?l?l?d?d?d?l +?d?d?s?l?l?d?l +?l?d?d?l?s?d?l +?l?d?s?d?l?l?d +?d?d?l?s?l?l?d +?u?u?s?d?d?d?u +?s?l?l?l?s?d?d?d +?s?d?u?u?u?d?d +?u?s?u?d?u?d?d +?l?d?s?d?d?u?u +?d?l?l?d?s?d?l +?u?u?l?s?d?d?d +?u?l?s?u?d?d?d +?l?l?l?d?d?l?l?l?l +?d?d?d?d?d?d?l?d?d?d +?d?d?u?d?u?u?d?d +?u?d?d?d?d?u?u?d +?d?u?d?u?u?d?d?d +?u?l?d?d?l?d?d?d +?d?d?d?d?u?d?l?l +?u?d?u?d?d?d?d?d?d +?l?d?d?d?d?d?l?d?d +?d?s?l?l?l?l?l?l +?u?d?u?l?l?d?l +?u?l?d?l?u?l?d +?l?l?u?d?l?l?d +?u?l?d?d?l?u?l +?u?d?l?u?l?d?u +?u?u?l?d?l?d?l +?u?u?u?l?d?l?d +?d?l?d?l?u?l?l +?u?l?l?l?d?u?d +?d?l?l?l?d?u?u +?d?d?u?l?l?u?u +?u?d?l?u?l?l?d +?l?d?l?d?l?u?u +?l?l?l?d?l?d?u +?d?d?l?l?l?u?l +?l?u?u?u?d?u?d +?l?d?l?l?u?l?d +?d?u?u?d?l?l?l +?d?u?u?l?l?l?d +?u?l?l?u?d?u?d +?u?l?d?d?u?u?u +?u?l?u?d?l?d?l +?d?d?l?l?u?l?u +?u?l?u?d?u?d?u +?d?u?u?u?l?l?d +?d?d?l?l?u?u?l +?d?l?d?l?l?u?u +?u?u?l?d?d?l?l +?d?u?l?d?l?l?l +?u?l?l?u?d?d?l +?l?d?l?u?d?l?l +?l?d?l?u?d?l?u +?d?u?l?u?l?l?d +?l?l?l?d?u?d?l +?u?u?d?l?l?d?l +?u?d?l?l?l?u?d +?u?d?u?l?l?l?d +?l?l?d?d?l?u?u +?u?u?u?d?l?d?l +?l?u?l?l?d?d?l +?d?d?d?d?s?l?l?l?l +?l?u?l?l?u?l?l +?l?l?l?s?d?d?d?s +?l?u?l?l?l?l?d?d +?u?u?s?d?d?u?u +?u?s?l?l?l?d?d?d +?u?l?u?l?u?d?s +?u?d?l?d?l?l?s +?u?u?u?l?l?s?d +?u?l?s?d?d?l?l +?l?l?l?d?s?d?l +?s?d?l?l?d?l?l +?u?u?l?l?l?s?d +?l?l?d?l?s?l?d +?s?l?l?d?l?l?d +?u?d?u?u?d?u?s +?s?d?d?u?l?l?l +?l?d?s?l?l?d?l +?l?s?d?l?d?l?l +?l?l?l?d?u?l?l?l +?d?s?d?d?d?s?d?d?d +?l?l?l?d?l?d?d?d?d +?l?l?l?l?l?d?d?u +?l?s?l?s?l?s?d?d +?l?l?s?s?d?d?s +?d?u?d?l?d?u?d?l +?l?l?u?l?l?d?d?d +?l?s?d?l?l?l?l?l +?d?d?d?d?l?s?l?l +?d?d?d?d?l?d?d?d?l +?d?s?s?l?s?s +?l?s?s?s?d?s +?s?s?d?l?s?s +?s?s?s?l?s?d +?s?s?l?s?s?d +?s?s?s?d?l?s +?d?s?l?s?s?s +?s?s?l?d?s?s +?s?s?d?s?s?l +?s?s?s?l?d?s +?s?d?u?s?s?s +?u?d?s?s?s?s +?s?s?u?d?s?s +?u?l?l?l?u?d?u +?l?u?u?u?u?l?d +?u?u?u?l?l?l?s +?u?u?u?l?l?d?l +?d?u?l?l?l?u?l +?u?l?l?u?l?u?d +?u?l?u?s?u?l?u +?l?l?u?l?l?u?d +?l?u?l?u?l?l?d +?d?d?d?d?d?d?l?s?l +?l?s?l?d?l?l?s +?l?s?l?s?l?d?l +?d?d?s?d?d?s?d?d?d +?d?d?d?d?d?d?d?s?d?d +?d?d?d?l?s?s?s +?d?d?d?s?s?u?s +?u?l?d?l?l?l?l?l +?u?u?u?u?l?d?d?d +?l?d?d?d?d?d?s?s +?d?d?d?d?d?d?d?d?s?s +?s?s?s?u?l?l +?s?s?s?u?l?u +?u?l?s?l?s?s +?s?s?u?l?l?s +?s?l?u?l?s?s +?u?u?s?u?s?s +?u?s?s?s?u?u +?s?u?l?l?s?s +?s?u?u?s?s?u +?l?s?u?s?l?s +?l?u?l?s?s?s +?u?s?l?s?u?s +?u?u?s?s?u?s +?s?s?l?s?l?l +?l?l?l?l?l?d?l?l?l +?d?d?l?l?l?l?d?d?d?d +?l?u?s?d?d?d?d?d +?d?d?d?s?l?l?d?d +?l?d?d?d?l?d?d?s +?l?d?l?d?d?d?d?s +?u?l?u?s?d?d?s +?l?d?s?l?s?l?d +?d?l?l?d?l?s?s +?s?l?l?s?l?d?d +?l?l?d?d?s?s?l +?s?u?u?u?s?d?d +?u?l?u?d?d?s?s +?s?s?l?d?l?d?l +?d?d?l?l?s?s?l +?l?d?d?l?l?s?s +?l?s?l?l?d?d?s +?l?s?d?d?l?s?d?d +?u?l?u?u?l?l?l +?l?l?l?l?l?l?l?u +?l?d?l?d?l?d?d?s +?d?d?d?s?d?l?l?l +?s?d?d?d?d?d?d?d?d?s +?s?l?l?l?s?l?l +?u?d?u?u?u?u?u?u +?l?l?l?d?d?d?d?d?s +?d?d?u?d?d?d?d?d?d +?d?d?d?d?d?d?d?u?d +?u?l?d?l?d?l?d?d +?u?d?d?u?u?d?d?u +?d?d?l?l?u?u?d?d +?d?s?d?s?d?s?d?d +?d?s?d?d?s?d?d?s +?u?s?d?u?u?u?u +?u?l?l?s?d?l?l +?u?s?l?l?l?d?l +?l?l?l?s?u?u?u +?d?l?l?l?d?d?d?d?d +?l?s?s?l?l?l?d +?d?l?l?l?l?l?l?d?d +?l?l?l?l?d?d?s?d?d +?l?l?d?s?d?s?d?d +?l?l?d?d?d?d?d?d?d?d?d +?u?l?u?l?u?l?u?l +?d?d?d?d?d?l?d?u +?d?u?d?d?d?l?d?d +?d?d?d?u?d?d?u?d +?u?d?d?d?d?d?l?d +?l?u?d?d?d?d?d?d?d +?d?d?u?d?d?d?u?d +?l?d?u?d?d?d?d?d +?d?d?d?l?d?u?d?d +?d?u?d?l?d?d?d?d +?d?d?d?d?d?u?d?l +?d?d?d?d?u?d?l?d +?d?d?u?d?d?d?d?u +?d?d?d?d?l?d?d?u +?d?d?l?u?d?d?d?d +?l?l?l?l?l?l?l?l?l?l +?u?u?d?d?d?l?l?l +?d?d?d?d?d?d?s?d?d?d +?u?u?d?u?u?u?u?u +?l?l?d?d?d?d?l?s +?l?d?d?s?s?s?s +?d?d?d?s?u?u?u?u +?s?d?d?d?d?d?d?d?l +?u?d?d?d?d?d?d?d?s +?u?u?u?l?l?u?d +?l?u?l?l?l?d?l +?l?l?l?d?l?u?u +?u?l?u?d?l?u?l +?u?l?u?l?d?u?u +?u?l?d?l?l?l?u +?l?l?l?l?u?d?l +?l?l?l?u?l?d?l +?d?u?l?u?l?u?l +?l?l?d?l?l?u?u +?l?l?l?l?l?s?s?s +?l?l?s?l?l?l?l?d +?d?d?d?d?d?d?d?d?d?d?d?d?d +?l?u?u?u?u?u?u?d +?d?s?d?s?l?s?l +?l?d?d?l?s?s?s +?l?s?l?s?d?s?d +?l?l?s?d?d?s?s +?u?u?d?d?s?s?s +?l?l?l?s?d?s?d?d +?s?d?s?d?s?d?s?d +?l?l?l?u?u?l?l +?l?u?l?l?l?u?l +?u?u?u?d?d?d?d?d?d?d +?l?l?l?l?s?l?l?d +?d?s?d?d?l?l?l?l +?d?d?d?d?l?u?u?u +?d?d?u?u?d?d?d?u +?d?d?d?l?u?l?d?d +?d?d?u?d?u?d?d?u +?u?d?u?d?u?d?d?u +?d?d?u?l?d?d?u?l +?d?u?d?d?u?d?d?u +?u?d?d?l?d?d?l?d +?l?d?u?d?l?d?u?d +?d?u?d?l?l?d?d?d +?u?d?d?d?l?l?d?d +?d?d?d?u?d?d?u?u +?d?d?u?d?d?u?d?u +?d?d?d?d?u?u?u?l +?u?d?d?d?u?d?d?u +?d?d?d?u?d?u?d?u +?d?d?d?u?l?u?d?d +?u?d?d?l?d?u?d?d +?d?d?d?d?d?d?u?l?u +?d?d?l?l?d?d?u?u +?l?l?d?u?l?l?l?l +?s?l?d?d?d?d?d?s +?l?s?l?d?l?l?l?l +?d?d?d?d?d?d?d?d?d?d?u +?l?l?l?d?d?u?u?u +?l?s?l?l?d?l?s +?u?l?l?l?d?s?s +?l?s?l?s?l?l?d +?d?d?l?d?l?d?d?d?d +?u?l?s?l?l?d?l +?l?l?l?l?s?d?u +?l?l?l?l?u?s?d +?l?s?l?l?l?l?l?d +?l?d?l?d?l?d?l?s +?u?l?l?d?l?l?l?d +?d?d?s?d?s?s?d +?s?d?s?s?d?d?d +?d?s?d?d?s?d?s +?d?s?d?d?s?s?d +?s?u?l?u?l?u?s +?l?u?u?u?d?d?d?u +?u?d?l?l?d?l?l?d +?l?l?u?u?u?d?d?d +?s?d?d?l?l?l?d?d +?d?s?s?d?d?d?d?d +?u?l?l?l?s?d?d?d?d +?u?l?l?l?u?l?u +?u?l?u?u?l?u?l +?u?u?l?l?l?l?u +?d?l?d?l?d?l?d?l?d +?d?l?s?l?s?d?d +?d?d?l?l?d?s?s +?s?u?l?d?d?d?s +?l?d?l?s?d?s?d +?d?d?d?u?l?s?s +?s?s?d?l?d?d?l +?d?s?l?d?s?l?d +?u?d?u?d?d?s?s +?l?s?d?d?l?d?s +?s?d?d?l?l?d?s +?s?l?l?d?d?s?d +?d?d?s?l?l?s?d +?d?s?l?d?d?s?l +?s?s?u?u?d?d?d +?d?s?d?l?l?s?d +?l?s?d?d?d?l?s +?d?d?d?u?u?s?s +?u?u?d?s?s?d?d +?s?s?d?d?d?u?u +?u?u?s?d?d?s?d +?s?s?l?d?l?d?d +?s?l?d?l?s?d?d +?s?d?s?l?l?d?d +?d?d?d?s?u?u?s +?u?u?d?d?s?s?d +?d?u?d?d?d?d?d?d?d +?d?d?d?d?d?u?u?s +?l?d?d?l?d?d?d?s +?l?d?d?d?d?l?d?s +?u?l?d?d?d?d?s?d +?d?d?d?d?s?l?l?d +?d?d?l?l?d?s?d?d +?d?d?d?d?l?l?d?s +?u?l?l?l?l?l?d?d?d?d +?l?l?d?d?l?l?d?d?d +?l?d?d?d?d?d?d?l?d +?u?d?l?s?l?l?d +?u?l?l?u?d?d?s +?l?u?l?u?s?d?d +?d?l?s?d?l?l?l +?l?l?l?s?d?d?u +?u?l?l?s?d?d?l +?d?s?l?l?d?l?l +?s?l?l?d?l?d?l +?u?l?u?u?s?d?d +?l?u?l?u?d?d?s +?u?s?l?l?u?d?d +?s?d?u?u?u?u?d +?u?l?d?l?l?s?d +?l?s?d?l?l?d?l +?u?u?u?d?u?d?s +?u?d?d?u?u?u?s +?u?u?d?d?s?u?u +?d?s?l?l?l?d?l +?u?l?d?d?u?l?s +?u?l?l?d?d?l?s +?d?l?l?l?d?s?l +?d?d?l?l?l?s?u +?d?u?u?s?d?u?u +?d?d?s?u?u?l?l +?u?u?d?s?u?u?d +?s?s?u?l?l?l?l +?s?l?l?s?l?l?l +?u?u?u?d?d?u?d?d +?u?d?l?d?l?d?u?d +?u?l?l?l?d?d?d?d?d?d +?d?d?d?d?l?d?d?d?d?d +?l?l?u?u?u?l?l +?u?l?u?u?u?u?u +?u?u?l?l?u?l?l +?d?l?s?l?s?d?l +?d?d?l?s?l?s?l +?u?l?l?s?d?d?s +?u?l?s?l?s?d?d +?d?d?u?u?u?s?s +?u?s?l?s?u?d?d +?d?s?u?u?u?s?d +?u?u?u?s?d?s?d +?u?u?u?u?d?s?s +?l?s?d?l?l?l?s +?l?s?l?d?d?l?s +?d?l?s?d?l?l?s +?l?l?l?s?d?s?l +?l?s?l?l?d?s?d +?l?l?l?s?d?l?l?l +?d?d?u?u?u?u?u?d +?l?l?l?l?l?l?l?l?s +?d?d?d?l?l?l?l?d?d?d +?l?l?l?u?l?u?d +?u?u?l?u?u?u?d +?u?d?l?l?u?l?l +?l?l?l?d?l?u?l +?l?d?l?l?l?u?u +?l?l?u?u?d?l?l +?l?l?l?l?u?l?d?d +?l?l?l?u?d?l?l +?u?d?l?u?l?l?l +?l?l?l?l?u?d?u +?u?l?l?l?u?u?d?d +?d?d?d?d?d?d?l?l?d?d +?d?d?s?d?l?l?l?l +?u?l?s?l?d?d?d?d +?l?l?s?d?d?d?d?l +?s?l?d?d?d?d?d?d?d +?s?s?s?s?d?s +?s?d?s?s?s?s +?l?l?s?l?l?s?d?d +?l?u?l?l?s?l +?l?l?u?l?s?l +?u?l?s?u?u?l +?l?u?l?s?l?l +?l?s?u?l?u?l +?l?u?s?l?u?u +?l?l?u?s?u?l +?l?l?u?s?u?u +?u?s?u?u?l?u +?l?u?l?u?s?u +?l?u?l?u?s?l +?l?u?u?l?l?s +?u?s?l?l?u?u +?l?s?u?l?l?u +?l?u?s?u?u?l +?l?u?u?s?u?u +?u?l?l?u?s?l +?l?u?s?l?u?l +?u?l?u?u?u?s +?l?u?s?u?u?u +?u?u?l?u?u?s +?u?u?u?l?s?l +?u?u?l?u?s?u +?u?u?l?l?s?u +?u?s?l?l?u?l +?s?u?l?u?u?u +?u?l?u?s?u?u +?l?l?s?l?u?u +?u?s?l?u?u?l +?u?s?l?u?u?u +?l?u?u?l?s?l +?l?s?l?u?l?u +?s?l?l?l?u?u +?u?l?u?u?s?u +?s?l?u?l?u?l +?s?l?u?u?u?l +?d?d?d?d?d?s?d?d?d?d +?d?d?d?d?s?d?d?d?d?d +?s?l?s?l?s?l?s +?l?l?l?l?l?s?l?d +?d?l?l?l?s?s?s +?l?u?l?l?d?l?d +?u?u?l?l?d?l?d +?l?d?u?l?d?l?u +?d?u?l?d?u?u?l +?u?l?d?u?d?l?u +?l?u?u?u?d?d?u +?l?u?u?u?d?d?l +?u?d?l?l?u?d?u +?u?l?d?l?u?u?d +?u?l?l?d?u?d?u +?l?u?d?l?d?l?u +?d?l?u?u?u?u?d +?u?d?l?l?d?u?u +?d?d?l?u?l?l?l +?u?l?u?l?d?u?d +?u?l?u?u?d?d?l +?d?l?u?l?l?u?d +?u?d?d?u?l?l?u +?l?u?l?u?d?d?l +?u?l?d?l?u?d?u +?u?d?u?l?d?u?l +?d?l?l?l?d?l?u +?d?l?d?l?l?u?l +?l?l?l?d?u?l?d +?u?d?l?u?u?d?l +?u?d?u?u?u?l?d +?d?l?d?u?l?l?l +?l?u?l?l?d?d?u +?l?u?l?d?l?l?d +?u?d?d?l?l?u?u +?u?d?d?l?l?u?l +?l?u?l?d?d?l?u +?l?l?d?l?d?u?u +?l?d?l?l?u?d?l +?u?u?d?d?u?u?l +?l?d?l?d?u?u?u +?l?u?u?l?u?d?d +?d?l?l?l?l?u?d +?u?u?d?d?l?u?u +?l?l?l?d?d?u?l +?d?l?l?d?u?l?l +?d?l?l?d?u?l?u +?l?u?d?u?d?u?u +?l?l?u?u?d?d?l +?u?d?l?d?u?u?u +?u?d?u?l?u?d?u +?l?l?d?d?d?l?l?s +?d?d?d?d?u?u?d?d?d +?s?l?l?s?l?l?s +?u?u?l?l?l?l?l?l +?s?u?u?s?s?s +?s?s?s?u?u?s +?s?u?s?u?s?s +?u?s?s?u?s?s +?u?s?s?s?s?u +?s?l?s?s?s?l +?s?s?s?u?s?u +?s?s?l?s?l?s +?u?u?u?u?l?l?l?l +?s?s?s?d?d?l?l +?s?l?l?s?s?d?d +?s?s?l?l?s?d?d +?s?l?l?d?d?s?s +?u?l?d?d?s?s?s +?s?l?l?s?d?d?s +?u?u?u?u?u?u?d?d?d?d +?l?l?l?s?u?l?l +?s?s?l?l?d?d?d?d +?s?l?d?d?d?d?l?s +?u?d?u?u?u?u?d?d +?u?d?d?d?u?u?u?u +?d?d?d?d?l?l?s?l +?s?u?u?u?d?d?d?d +?l?d?l?l?s?d?d?d +?l?d?l?l?s?l?s +?l?l?s?l?l?d?s +?u?d?u?d?u?u?d?d +?d?d?d?u?l?l?l?d +?u?l?l?d?d?l?d?d +?u?d?d?l?u?d?d?l +?l?l?d?d?d?l?l?d?d +?s?l?l?l?l?s?l +?l?l?l?l?l?l?l?l?l?d +?d?d?d?d?u?u?u?d?d +?u?u?d?d?d?d?d?d?u +?l?d?d?d?l?l?l?s +?l?l?l?d?d?d?d?d?l +?d?d?d?d?d?l?d?d?d?d +?d?d?d?d?d?d?d?l?d?d +?d?d?l?d?d?l?d?d?d +?u?u?u?d?u?u?d?d +?d?d?u?l?l?l?l?d +?d?l?d?d?d?d?d?s +?s?d?d?d?d?l?d?d +?d?d?d?d?u?s?d?d +?d?d?u?d?d?s?d?d +?s?d?l?d?d?d?d?d +?u?d?d?d?d?d?s?d +?u?l?l?l?d?l?l?d +?l?l?l?l?l?l?d?d?l +?d?d?d?d?l?d?d?d?d?l +?l?l?l?s?d?d?d?l +?u?u?u?l?l?l?l?l +?d?s?d?s?d?d?l?l +?s?d?d?d?d?s?l?l +?u?l?d?d?d?d?s?s +?s?s?u?u?u?s?s +?u?d?l?l?l?d?l?l +?u?d?l?l?s?l?l +?l?l?l?l?l?l?l?s?d +?u?d?d?u?d?d?d?u +?d?d?d?d?l?l?u?d +?d?d?d?u?u?d?d?u +?u?u?d?d?d?l?d?d +?d?l?d?d?d?d?u?u +?d?d?d?d?u?l?u?d +?u?d?u?d?l?d?d?d +?d?d?u?d?d?d?u?u +?d?d?d?d?l?u?l?d +?l?d?d?d?l?l?d?d?d +?u?l?d?d?d?u?d?d +?u?d?d?d?l?d?l?d +?u?u?d?u?u?u?d?d +?l?l?l?u?u?l?d +?l?l?u?u?l?l?d?d +?u?l?u?l?u?d?u +?u?l?u?l?d?u?l +?d?u?l?l?l?u?u +?u?l?u?l?d?l?l +?d?l?l?l?l?u?l +?l?d?u?u?l?l?l +?u?l?u?l?l?d?l +?u?l?l?l?s?u?u +?u?u?s?u?l?l?l +?l?l?d?l?s?d?d?d +?l?s?d?l?d?d?d?d +?d?d?s?d?d?d?l?l +?u?d?d?l?d?d?d?s +?d?d?d?l?l?s?d?d +?d?d?d?d?d?u?s?u +?d?d?l?l?s?d?d?d +?u?d?u?s?d?d?d?d +?u?u?d?s?d?d?d?d +?l?d?s?l?d?d?d?d +?u?u?l?l?u?u?u +?l?l?l?l?u?u?l +?l?l?u?l?l?u?l +?d?l?d?d?l?d?d?d?d +?u?l?l?l?s?d?s +?l?l?l?s?s?l?d +?u?l?u?l?u?l?u?d +?l?d?u?d?d?l?l +?u?d?d?d?d?u?l?l +?d?l?u?u?u?d?d +?l?l?d?d?u?u?d +?l?d?d?u?d?u?u +?d?l?d?l?u?d?l +?u?u?d?d?d?l?u +?l?u?d?u?d?d?l +?l?d?d?d?u?u?l +?d?l?d?u?l?u?d +?d?l?d?d?u?l?l +?l?d?u?d?d?l?u +?d?l?u?u?d?d?l +?d?l?l?l?u?d?d +?u?d?u?d?u?u?d?u +?u?d?l?u?d?d?u +?d?u?l?l?u?d?d +?d?u?d?u?d?l?l +?d?l?d?l?u?l?d +?u?l?d?u?u?d?d +?l?d?l?l?d?d?u +?d?d?u?u?u?l?d +?d?l?u?d?u?d?u +?d?d?u?l?u?u?d +?d?u?l?d?u?l?d +?d?u?d?l?l?d?l +?d?l?u?l?l?d?d +?l?l?d?u?u?d?d +?u?d?u?l?d?l?d +?l?d?u?d?l?d?u +?l?d?d?u?l?u?d +?l?d?d?l?l?u?d +?u?l?l?u?u?d?d?d +?u?d?d?l?d?d?l?l +?u?d?l?u?d?u?d +?d?u?d?l?d?u?l +?d?u?d?l?d?u?u +?u?d?u?u?l?d?d +?u?d?d?u?l?u?d +?u?d?d?d?l?u?l +?d?u?l?d?u?d?l +?l?l?u?d?d?u?d +?u?d?u?d?l?u?d +?d?u?l?d?d?l?u +?d?d?l?l?l?u?d +?l?d?u?l?d?d?l +?l?d?u?u?d?d?u +?u?d?l?l?d?u?d +?d?u?d?l?u?d?l +?d?d?u?l?d?u?u +?d?d?u?d?l?l?u +?u?d?d?u?d?u?l +?l?u?d?u?d?d?u +?u?u?d?d?l?d?u +?d?d?l?l?u?d?u +?l?u?l?d?d?u?d +?l?l?d?d?l?d?u +?u?u?d?l?d?d?l +?l?u?d?d?u?d?l +?l?d?d?l?u?u?d +?d?u?l?l?d?l?d +?u?d?u?d?d?u?l +?d?l?d?d?u?u?u +?u?d?u?d?d?l?u +?d?u?u?d?d?l?l +?l?l?d?u?d?u?d +?l?u?d?u?d?u?d +?u?l?d?d?u?u?d +?l?l?u?d?d?d?l +?d?u?u?d?l?d?u +?u?u?l?d?d?u?d +?l?u?d?u?d?l?d +?l?d?d?l?d?u?l +?u?d?u?u?d?d?l +?u?d?l?l?l?d?l?d +?d?u?u?d?l?d?l +?u?d?d?u?l?d?u +?u?u?u?d?d?l?d?d +?d?u?d?d?l?l?l +?d?u?d?d?u?u?u +?l?u?u?d?d?u?d +?d?d?l?u?d?u?l +?d?d?l?l?u?u?d +?d?l?d?d?l?u?l +?d?d?l?l?d?u?u +?d?d?l?d?u?l?l +?d?u?d?l?d?l?d?l +?l?d?d?l?u?d?u +?d?d?l?d?l?u?u +?d?l?d?l?l?u?d +?l?d?u?d?l?l?d +?l?d?d?u?u?u?d +?d?d?l?u?u?d?l +?d?u?d?l?l?u?d +?l?d?d?u?u?d?l +?l?d?d?d?l?u?u +?d?l?u?u?d?d?u +?d?l?u?d?d?l?u +?d?l?u?d?d?l?l +?d?u?l?l?d?d?u +?l?d?l?d?u?l?d +?l?u?l?d?d?l?d +?l?l?d?u?d?d?l +?u?d?u?d?u?l?d +?l?d?l?l?u?d?d +?d?l?l?d?u?d?l +?d?u?d?u?d?u?l +?l?d?l?d?u?u?d +?d?d?l?u?l?u?d +?l?l?d?d?u?l?d +?d?l?d?u?l?d?l +?d?d?u?u?l?u?d +?d?u?l?u?d?l?d +?l?u?u?d?l?d?d +?u?l?u?d?l?d?d +?l?u?u?d?d?d?l +?l?u?u?d?d?d?u +?d?l?d?u?l?d?u +?l?d?u?l?u?d?d +?u?u?l?d?l?d?d +?d?l?l?d?u?l?d +?d?l?u?u?d?u?d +?d?u?d?l?d?l?l +?l?d?d?d?l?u?l +?d?l?d?u?d?l?l +?d?d?u?l?l?d?l +?d?u?d?d?l?u?l +?d?l?u?u?d?l?d +?u?d?l?d?u?u?d +?s?d?d?d?d?l?l?s +?d?d?d?d?d?d?d?d?d?l?l +?l?l?d?l?d?d?d?d?d +?d?l?l?l?l?l?d?d?d +?u?l?u?l?l?l?l?d +?s?s?l?l?l?l?d?d +?l?l?l?l?l?l?d?l?d +?s?s?l?d?d?d?s +?l?s?d?d?d?s?s +?s?u?s?d?d?d?s +?s?d?s?d?s?d?l +?l?d?s?d?d?s?s +?l?d?s?d?s?d?s +?d?d?d?s?s?s?u +?l?l?l?l?d?d?u?u +?l?l?l?l?d?u?l?l +?u?l?l?l?d?s?d?d +?l?s?s?d?d?d?d?d +?d?d?s?d?d?s?l?d +?u?u?u?d?l?l?l?l +?l?u?u?u?u?u?l +?l?l?u?l?l?l?u +?u?d?l?l?d?l?d?l +?d?d?d?l?l?l?l?u +?u?d?l?d?l?l?l?d +?d?s?d?l?l?l?l?l +?l?l?l?l?l?d?d?d?l +?d?s?d?s?u?u?u +?d?l?s?l?s?l?d +?s?d?u?u?u?d?s +?l?s?l?s?d?d?l +?u?u?s?s?u?d?d +?s?l?l?d?l?d?s +?l?d?d?l?s?s?l +?l?l?s?d?l?s?d +?u?d?u?d?u?s?s +?s?s?u?l?l?d?d +?s?u?d?u?u?d?s +?s?u?l?u?s?d?d +?s?u?l?l?d?d?s +?l?d?l?d?s?l?s +?u?l?u?s?s?d?d +?d?s?l?l?l?d?s +?u?l?u?d?s?d?s +?l?s?d?l?s?d?l +?d?l?d?l?s?s?l +?s?s?u?u?u?d?d +?s?d?s?d?l?l?l +?u?s?l?l?l?l?s +?u?u?d?d?l?l?l?l +?d?d?d?d?d?l?d?d?l +?d?d?u?l?l?l?l?d?d +?s?s?s?s?l?l?l +?u?l?u?l?u?d?d?d?d +?l?l?s?u?l?l?l +?l?l?l?u?u?u?s +?l?l?l?l?s?u?u +?l?l?l?l?d?d?d?l?l +?d?d?s?s?s?l?l +?l?s?l?s?d?s?l +?d?s?l?s?d?s?l +?d?l?d?l?s?s?s +?u?l?d?s?l?l?l +?l?s?s?l?d?d?d?d +?u?l?l?l?l?l?l?l?l +?u?d?l?d?l?d?l?l +?l?u?l?u?l?d?d?d +?u?l?l?l?d?d?d?u +?l?u?l?l?s?s +?u?l?u?l?u?s?s +?s?l?l?s?u?l +?l?s?u?u?s?l +?l?l?s?u?s?u +?s?u?l?s?u?l +?s?l?s?l?l?u +?s?l?s?l?u?l +?u?s?l?u?s?l +?u?l?l?s?u?s +?u?s?l?u?s?u +?s?l?u?l?s?l +?u?s?l?l?u?s +?l?s?l?s?u?u +?u?u?u?l?s?s +?u?l?u?s?s?l +?l?u?u?s?u?s +?l?l?s?u?l?s +?u?u?u?s?s?l +?u?l?u?s?u?s +?u?u?s?l?l?s +?s?l?l?u?s?u +?l?u?u?u?s?s +?s?s?l?l?u?u +?l?l?l?s?s?u +?l?l?s?l?d?l?s +?u?l?s?u?s?l +?u?u?l?u?s?s +?s?u?s?u?u?u +?u?s?u?s?l?l +?l?s?s?l?l?u +?s?u?l?u?u?s +?s?u?u?l?l?s +?l?s?l?s?d?l?l +?l?u?l?s?s?u +?l?s?u?l?s?l +?l?s?u?s?l?l?l +?u?l?l?l?s?s?d +?u?s?u?l?s?l +?l?s?s?u?l?l +?s?l?l?l?u?s +?s?l?u?l?l?s +?s?u?u?l?u?s +?s?l?l?s?l?u +?s?l?l?u?l?s +?u?s?u?d?u?s?u +?s?l?u?u?u?s +?s?u?l?l?l?u?s +?s?l?s?u?u?u +?l?l?s?l?u?s +?l?s?l?u?s?l +?l?u?l?u?l?u?d?d +?l?l?l?l?l?d?d?l?l +?d?d?d?d?d?d?d?d?d?d?s +?l?l?l?l?l?s?s?d +?u?l?l?l?u?u?l +?l?u?l?u?l?l?l +?u?u?l?l?u?u?l +?u?u?u?l?l?u?u +?l?u?l?l?l?l?u +?u?d?l?u?d?l?s +?u?d?u?d?u?u?s +?u?u?u?d?d?s?u +?u?l?s?l?u?d?d +?d?l?l?l?s?d?l +?d?l?s?l?l?d?l +?u?u?d?d?s?l?l +?u?l?s?l?d?d?l +?u?u?d?d?u?s?u +?l?s?l?d?d?u?l +?u?u?u?s?d?d?u +?d?l?l?d?s?l?l +?u?s?d?u?u?d?u +?u?d?l?l?s?d?l +?u?l?l?d?d?s?l +?u?u?u?d?d?u?s +?u?l?d?s?d?l?l +?u?s?u?u?d?d?u +?u?d?l?l?l?d?s +?u?u?u?s?d?u?d +?l?l?u?u?d?d?s +?u?s?u?d?d?l?l +?u?d?d?u?s?u?u +?l?l?l?d?d?u?s +?u?u?u?s?d?l?d +?l?l?d?d?s?u?u +?u?l?l?d?l?d?s +?u?l?d?d?l?u?d?d +?l?d?l?d?u?d?u?d +?d?d?d?u?u?d?u?u +?d?d?d?u?u?u?u?d +?u?u?l?u?d?d?d?d +?u?d?u?d?d?d?u?u +?s?s?s?l?s?s +?s?u?s?s?s?s +?s?s?u?s?s?s +?s?s?l?s?s?s +?s?l?s?s?s?s +?d?l?d?d?d?d?d?d?d?d +?s?s?l?s?s?d?d +?u?l?l?d?u?u?u +?d?l?l?u?u?u?u +?u?l?d?l?u?l?u +?l?l?u?d?l?l?l +?l?d?l?u?l?u?l +?u?u?u?l?d?l?l +?l?d?l?l?l?u?l +?l?d?l?l?u?l?l +?u?l?u?u?u?u?d +?l?u?l?u?u?u?d +?u?l?u?d?u?l?l +?l?l?l?u?u?d?u +?l?l?u?u?l?d?l +?u?l?l?d?u?l?l?l +?u?d?d?l?l?l?l?d +?d?d?u?d?d?u?d?d?u +?d?d?l?d?d?d?d?d?l +?d?l?d?l?d?d?d?d?d +?l?l?s?d?d?d?l?l +?l?l?s?d?l?l?l?l +?u?u?l?l?u?u?d?d +?l?l?l?l?l?l?d?u +?l?d?l?l?s?s?s +?d?l?d?l?d?l?d?s +?l?d?d?l?d?d?l?s +?d?d?u?l?l?d?d?s +?d?d?u?u?u?u?u?d?d +?d?l?d?l?d?l?d?d?d +?u?u?l?d?d?d?d?d?d +?u?d?d?l?d?d?l?d?d +?u?u?u?u?l?l?u +?u?l?l?u?u?u?u +?l?l?l?l?u?l?u +?l?l?l?d?l?l?l?l?l +?u?l?l?l?u?d?d?d?d +?u?l?u?l?s?d?d?d +?u?u?u?u?l?l?l?d +?u?u?u?u?s?s?u +?d?d?d?u?u?u?u?u?u +?u?l?d?l?d?l?l?d +?d?s?d?d?d?d?d?s +?d?d?d?d?s?d?s?d?d +?l?l?l?s?s?s?l +?l?l?d?l?l?d?l?l?d +?s?u?l?l?l?d?s +?s?l?s?l?l?l?d +?l?l?l?d?l?l?l?s +?d?d?d?d?l?l?l?l?s +?u?l?d?d?d?s?d?d +?d?l?l?d?d?d?d?s +?l?d?d?l?s?d?d?d +?d?s?d?d?d?d?l?l +?u?s?u?d?d?d?d?d?d +?l?d?d?s?l?d?d?d +?d?d?s?l?l?d?d?d +?u?d?l?s?d?d?d?d +?s?d?l?l?d?d?d?d +?s?u?l?d?d?d?d?d +?l?d?l?l?l?s?d?d +?u?d?u?s?u?u?u +?u?d?s?l?l?l?l +?u?s?u?u?d?u?u +?u?l?s?d?l?l?l +?u?l?s?u?l?l?d +?u?l?s?l?d?l?l +?u?l?l?s?u?l?d +?u?u?s?l?l?l?d +?d?d?d?d?d?d?d?d?l?l?l +?s?s?u?u?u?u?u +?s?u?s?l?l?l?l +?l?d?l?d?l?d?s?s +?d?d?d?l?d?d?l?d?d +?u?d?d?u?d?d?d?d?d +?d?d?d?l?d?l?d?d?d +?u?u?u?s?s?s?s +?d?d?l?d?d?d?d?d?d?d +?u?l?s?s?d?d?d?d +?d?d?s?d?s?d?d?u +?d?d?d?d?d?s?l?s +?d?d?d?d?d?l?s?s +?u?d?d?d?d?d?s?s +?s?s?d?d?d?d?d?l +?d?d?d?d?l?l?u?l +?l?u?d?u?d?d?d?u +?u?l?u?d?d?d?d?l +?d?l?l?l?d?d?d?u +?d?d?d?d?l?u?l?u +?u?u?s?d?d?d?d?d?d +?d?d?d?d?d?d?d?u?s +?d?u?u?u?d?u?u?u +?u?u?u?s?u?u?u?u +?l?l?l?l?l?l?l?d?l +?l?l?l?u?l?l?u +?u?l?l?l?d?u?l?l +?s?s?s?l?l?l?d +?l?l?l?s?d?s?s +?d?l?d?s?l?l?d +?u?u?d?u?d?d?s +?d?u?u?u?d?d?s +?l?d?d?u?l?d?s +?d?d?s?l?l?u?d +?u?d?s?l?d?l?d +?u?d?l?d?d?l?s +?u?d?d?u?d?u?s +?s?l?d?d?u?d?l +?l?d?d?s?l?d?u +?l?d?l?s?d?d?l +?d?u?d?s?u?u?d +?d?d?d?s?l?l?u +?u?d?l?l?d?d?s +?l?u?d?s?d?u?d +?u?s?l?d?d?l?d +?l?d?u?d?d?l?s +?l?d?d?s?d?l?u +?d?d?u?s?d?u?u +?u?d?u?l?d?d?s +?d?d?d?u?u?l?s +?u?d?l?u?d?d?s +?l?u?u?d?d?d?s +?s?l?d?d?l?d?l +?s?l?u?l?d?d?d +?l?u?d?l?s?d?d +?s?d?u?l?l?d?d +?u?u?s?d?u?d?d +?l?l?d?d?d?d?s?l +?u?u?s?d?l?d?d +?u?l?d?s?d?u?d +?u?u?d?d?d?s?l +?d?s?l?l?d?l?d +?u?l?d?d?s?u?d +?d?u?l?u?d?s?d +?d?d?l?l?d?s?l +?d?d?d?l?u?s?u +?l?d?d?d?u?u?s +?u?s?d?u?u?d?d +?u?d?u?d?l?d?s +?u?u?d?d?d?s?u +?d?l?s?l?d?d?l +?d?d?u?l?d?s?l +?u?d?d?l?l?s?d +?l?d?d?d?s?u?u +?d?s?l?d?l?d?l +?l?u?s?l?d?d?d +?l?d?u?d?l?s?d +?d?d?d?u?l?s?l +?l?l?d?s?d?l?d +?d?d?d?l?l?u?s +?s?u?d?l?l?d?d +?d?s?d?u?d?u?u +?s?d?l?l?d?l?d +?u?l?s?d?d?d?l +?d?u?d?l?s?d?u +?u?d?d?l?u?s?d +?d?d?l?l?u?d?s +?s?d?d?l?d?l?l +?u?d?s?d?l?l?d +?s?d?d?u?l?u?d +?u?d?l?s?l?d?d +?d?u?s?l?l?d?d +?u?d?u?u?s?d?d +?d?d?l?l?d?l?s +?u?u?d?s?l?d?d +?l?s?d?d?l?d?l +?u?d?l?d?u?d?s +?u?u?d?u?s?d?d +?l?u?u?s?d?d?d +?s?d?u?u?d?d?u +?s?u?l?u?d?d?d +?d?s?d?d?u?u?u +?l?l?u?d?s?d?d +?d?s?d?u?l?l?d +?u?l?s?d?l?d?d +?u?s?u?l?d?d?d +?u?d?u?u?d?d?s +?d?l?l?d?d?s?l +?d?u?d?l?d?l?s +?l?l?d?d?u?d?s +?u?d?u?d?d?u?s +?u?u?d?d?s?d?l +?d?s?d?l?l?d?l +?u?l?u?d?d?s?d +?l?d?d?d?d?s?l?l +?l?s?d?d?d?d?l?l +?u?d?l?d?s?d?u +?l?d?u?s?l?d?d +?u?s?l?d?d?d?u +?s?u?u?d?d?d?u +?d?s?d?u?u?u?d +?l?l?d?d?d?s?u +?d?s?l?u?l?d?d +?d?s?d?l?d?l?l +?u?d?s?d?d?l?u +?u?d?s?d?d?l?l +?u?d?u?d?s?u?d +?s?d?d?d?l?u?u +?d?l?s?d?l?l?d +?s?d?d?u?l?d?u +?u?u?d?d?d?u?s +?d?d?d?u?s?l?l +?d?d?s?l?d?l?l +?d?d?d?l?u?u?s +?d?d?d?u?l?u?s +?l?d?s?d?d?l?u +?d?d?d?l?l?l?s?d +?s?u?d?u?d?u?d +?d?l?l?u?s?d?d +?d?d?s?u?d?u?u +?u?d?d?s?d?l?l +?u?d?d?s?d?u?l +?d?d?u?l?l?d?s +?s?u?d?d?u?u?d +?u?l?d?l?d?d?s +?d?d?d?s?u?l?u +?u?d?s?d?d?u?l +?u?d?l?d?s?l?d +?d?d?d?d?d?s?l?l?l +?u?l?d?s?d?d?u +?u?l?u?d?d?s?d?d +?d?d?u?l?l?s?d +?l?u?d?d?l?d?s +?d?u?d?u?d?s?l +?d?s?d?d?u?l?l +?d?d?u?l?u?s?d +?l?d?l?s?u?d?d +?u?l?l?s?u?d?d?d +?d?u?u?u?s?d?d +?s?l?d?l?d?d?l +?u?d?d?s?u?l?d +?d?d?u?u?u?d?s +?u?d?l?l?d?s?d +?s?d?l?l?d?d?u +?d?d?d?l?l?l?d?d?d?d +?u?u?d?u?u?u?u?d +?u?u?u?u?d?u?u?d +?u?u?d?d?d?d?l?d +?l?d?l?l?d?l?d?d?d +?u?l?d?d?u?d?d?d +?u?d?d?l?d?d?u?d +?d?d?d?u?l?d?d?l +?d?d?d?d?l?d?u?u +?d?d?d?d?u?u?d?u +?l?l?d?d?d?d?d?u +?d?d?u?u?d?d?u?d +?d?d?d?d?u?d?u?u +?u?d?u?l?d?d?d?d +?d?u?d?d?d?u?u?d +?d?d?d?d?d?l?u?u +?u?d?d?d?d?l?l?d +?l?l?d?d?d?d?u?d +?d?d?d?u?d?d?l?l +?u?d?d?u?l?d?d?d +?d?u?d?u?d?d?u?d +?d?d?d?d?l?l?d?u +?u?l?d?d?d?d?d?u +?l?s?l?l?l?s?s +?u?u?l?l?l?d?d?d?d +?s?d?s?s?d?s?d +?s?d?d?d?s?s?s +?l?d?d?d?d?d?l?l?l +?d?l?u?d?u?l?l +?d?l?u?u?u?d?l +?l?l?l?d?u?u?d +?l?d?u?l?l?d?l +?d?u?l?d?l?u?l +?d?d?u?l?l?u?l +?d?l?l?u?u?u?d +?d?l?l?u?d?l?u +?d?l?l?u?d?l?l +?l?d?u?u?d?u?u +?u?d?d?u?u?l?l +?l?l?l?d?l?u?d +?u?d?u?u?l?l?d +?u?d?u?l?d?l?u +?u?d?u?l?d?l?l +?d?u?d?u?l?l?l +?l?d?l?l?l?u?d +?d?u?l?l?u?d?u +?u?d?l?l?l?l?d?l +?u?u?d?l?d?u?u +?l?d?u?d?u?l?l +?l?u?d?d?u?u?u +?d?l?l?l?d?u?l +?d?l?u?l?l?d?u +?d?l?u?l?l?d?l +?d?l?d?u?u?l?l +?d?d?u?u?l?u?u +?l?d?u?u?d?l?l +?l?u?d?l?d?l?l +?l?d?l?d?l?u?l +?u?d?d?u?l?u?l +?u?u?u?l?d?u?d +?l?u?l?d?l?d?u +?d?u?l?u?u?l?d +?l?u?l?u?d?l?d +?l?d?l?l?d?u?u +?d?u?l?d?u?l?l +?u?d?u?d?l?l?u +?l?u?l?d?d?u?l +?u?d?u?d?u?u?u?d +?u?u?u?d?l?l?d +?u?d?u?u?u?d?l +?d?u?d?u?l?l?u +?d?u?u?d?l?l?u +?d?l?l?l?u?u?d +?d?d?l?u?l?l?u +?l?u?l?u?d?d?u +?d?l?l?u?u?l?d +?u?u?l?u?d?d?u +?d?u?u?l?l?d?l +?d?u?u?u?u?l?d +?u?u?u?u?u?l?d?d +?u?l?u?d?u?d?l +?d?u?u?u?d?l?l +?u?d?u?l?u?l?d +?l?u?u?d?d?u?u +?d?l?l?u?l?d?u +?u?d?d?l?l?l?u +?l?d?u?d?l?l?l +?l?d?d?l?l?u?u +?l?u?d?l?l?l?d +?d?l?u?l?l?l?d +?l?d?d?l?l?l?u +?d?l?u?u?l?l?d +?l?l?l?u?d?d?u +?u?d?d?u?u?u?l +?u?d?u?d?l?u?u +?l?d?u?d?l?u?u +?l?l?u?u?d?d?u +?l?l?d?u?u?d?u +?l?l?d?u?u?d?l +?u?l?d?l?l?u?d +?u?d?u?d?u?l?l +?l?l?l?d?u?d?u +?u?l?u?d?u?u?d +?u?u?d?l?d?l?l +?d?d?l?u?l?u?u +?l?l?d?l?l?u?d +?d?d?u?u?l?u?l +?u?u?l?u?d?d?l +?l?d?u?u?l?l?d +?l?u?d?l?d?u?l +?l?u?d?u?u?l?d +?l?u?u?d?l?l?d +?d?l?d?l?l?l?u +?u?d?l?d?u?u?l +?u?u?u?d?d?l?u +?u?d?l?l?u?u?d +?l?d?s?l?d?s?l?d +?l?l?l?l?l?l?d?l?l +?s?d?d?d?d?d?s?s +?l?l?l?u?l?l?s +?l?l?l?d?d?d?l?s +?l?d?d?d?s?l?l?l +?l?l?l?s?d?d?l?l +?d?d?d?s?s?d?d?d?d +?d?l?d?d?l?d?d?l?d +?s?d?l?s?d?l?s +?s?s?d?d?l?l?s +?l?l?l?l?s?l?l?l?l +?d?d?s?d?d?d?s?d?d?d +?l?d?d?d?d?d?s?d?d +?d?d?d?d?l?s?l?s +?u?u?s?s?d?d?d?d +?d?d?d?d?l?d?l?d?d +?d?d?u?u?d?d?d?d?d +?s?s?l?d?d?s?s +?s?s?d?l?d?s?s +?s?s?s?s?l?d?d +?s?l?d?l?d?l?d?s +?l?l?l?l?l?d?d?d?d?d?d +?l?l?u?d?u?l?l +?l?u?l?l?d?l?l +?u?l?d?l?u?l?l +?u?d?u?u?l?l?l +?l?u?u?u?l?l?d +?u?l?l?u?u?l?u +?u?l?l?d?l?u?l +?l?l?u?u?u?l?d +?u?l?u?u?u?l?d +?l?d?u?u?u?u?u +?u?l?l?u?d?u?u +?l?u?d?u?u?u?u +?u?u?u?d?u?l?l +?l?l?l?d?u?l?u +?l?u?d?l?l?l?l +?l?u?l?u?l?d?l +?u?l?d?u?l?u?l +?u?u?u?u?s?u?u?u +?l?l?u?l?d?l?l +?u?l?l?u?l?d?l +?l?u?u?d?u?u?u +?u?u?u?l?u?u?d +?l?l?d?l?l?u?l +?l?d?l?l?u?u?u +?u?u?u?u?s?d?d?d?d +?d?d?d?l?d?d?d?d?d?d +?l?l?l?d?l?l?l?d?d +?l?l?d?l?l?l?l?s +?l?l?l?s?d?l?s +?l?l?s?d?l?l?s +?l?d?l?s?l?s?l +?s?l?d?l?s?l?l +?l?s?l?l?l?d?s +?l?l?d?d?d?d?d?d?l?l +?u?l?d?d?l?l?l?d +?u?d?d?d?d?d?d?d?d?u +?d?d?d?d?l?d?d?l?l +?d?d?d?s?u?l?l?l +?u?l?l?l?l?d?d?u +?s?s?u?l?s?l +?s?s?l?l?l?l?s +?s?u?l?s?u?s +?s?l?s?l?u?s +?u?s?s?u?l?s +?u?l?s?u?s?s +?u?l?s?s?l?s +?u?l?s?s?s?u +?l?l?s?s?s?u +?u?s?u?u?s?s +?l?l?s?s?u?s +?u?s?s?l?s?l +?s?u?s?s?u?u +?l?l?d?d?l?l?l?s +?u?l?u?l?l?l?l?l +?u?u?u?u?l?l?s +?s?l?s?l?d?l?d +?s?l?d?d?l?l?s +?s?u?l?u?d?d?s +?l?s?d?l?l?s?d +?s?u?l?l?s?d?d +?l?d?s?d?l?s?l +?u?d?d?l?l?s?s +?l?u?l?s?s?d?d +?d?d?s?u?u?u?s +?l?s?l?d?d?s?l +?l?d?l?s?d?l?s +?s?s?l?l?d?l?d +?l?d?l?l?s?s?d +?u?l?s?s?l?d?d +?l?d?s?s?l?l?d +?l?s?s?d?d?l?l +?l?l?d?l?d?s?s +?l?l?s?l?d?d?s +?l?d?s?s?l?d?l +?l?d?l?s?l?d?s +?l?s?u?s?l?d?d +?l?s?l?d?l?d?s +?l?s?d?d?l?l?d?d +?u?s?u?u?d?d?d?d +?s?d?l?l?l?d?d?d +?l?d?l?d?l?d?s?d +?d?d?d?s?l?l?l?d +?u?u?s?s?u?u?u +?u?d?d?u?d?d?u?u +?u?u?d?d?d?u?u?d +?u?u?u?d?d?d?u?d +?d?d?l?l?l?u?d?d +?u?d?l?d?d?d?l?l +?u?d?l?d?l?d?d?l +?u?d?u?u?d?d?d?u +?d?d?u?d?d?u?u?u +?u?u?d?d?d?u?d?u +?u?d?d?l?l?u?d?d +?u?d?d?l?l?d?d?l +?u?d?u?d?d?u?d?u +?u?d?d?u?d?d?l?l +?u?l?d?d?l?d?d?l +?d?d?d?d?u?l?u?u +?d?l?d?u?d?l?d?u +?u?l?d?d?l?d?l?d +?u?d?d?d?u?u?u?d +?u?d?d?l?d?l?l?d +?l?d?l?d?l?d?u?d +?l?u?d?d?d?d?l?u +?s?s?s?d?d?d?d?d?d +?u?l?l?l?s?d?l +?u?l?l?l?s?u?d +?u?u?u?s?d?u?u +?u?d?l?s?l?l?l +?l?s?d?u?l?l?l +?u?d?l?l?l?s?l +?l?l?u?l?l?s?d +?u?u?s?u?u?d?u +?l?l?l?l?u?u?u?u +?l?l?s?s?s?l?l +?l?s?l?s?l?l?s +?u?l?d?l?l?l?l?d +?s?s?s?s?s?s?l +?d?s?d?d?d?d?d?d?d?d +?s?d?d?d?l?l?l?s +?l?l?l?u?l?d?d?d +?l?l?u?d?d?d?l?l +?u?d?u?u?d?u?d?u +?d?d?l?l?l?l?l?l?d?d +?d?d?d?d?d?d?d?d?u?l +?u?l?l?l?d?d?s?s +?u?s?u?u?u?u?d?d +?d?d?s?s?d?d?l?l +?s?s?d?d?d?d?l?l +?l?l?d?l?l?l?d?d?d +?d?l?u?d?d?d?d?d +?d?u?l?d?d?d?d?d +?d?d?u?d?l?d?d?d +?d?d?d?d?l?d?u?d +?s?l?l?d?d?d?d?d?d +?d?l?d?d?d?d?d?u +?d?l?d?d?d?u?d?d +?d?d?d?d?d?l?u?d +?d?d?d?l?d?d?u?d +?l?l?d?d?d?d?l?d?d +?d?l?d?d?d?d?u?d +?d?d?d?u?l?l?d?d?d +?d?u?d?d?d?d?d?u +?l?l?l?l?d?l?l?s +?l?l?l?l?u?u?s +?u?u?u?u?s?l?l +?u?l?s?s?l?l?l +?u?l?l?l?s?u?s +?l?l?l?l?d?l?d?d?d +?l?l?l?d?l?s?d?d +?d?d?d?l?s?l?l?l +?s?u?l?l?l?d?d?d +?u?d?u?u?u?d?u?u +?d?d?d?d?d?d?d?u?u?u +?l?l?l?u?l?l?l?d +?u?u?u?u?d?d?d?l +?l?l?l?l?s?d?l?d +?d?s?l?s?l?s?l +?l?l?u?u?u?u?d?d +?u?d?d?u?u?u?u?u +?u?l?u?l?d?d?d?d?d +?l?d?l?l?l?l?d?d?d +?l?l?l?l?l?s?d?l +?l?l?l?l?l?d?s?s +?l?u?u?u?u?u?u?u +?l?s?d?d?d?d?d?s +?s?l?s?d?d?d?d?d +?l?d?s?s?d?d?d?d +?d?l?s?d?l?s?d?l +?d?d?d?s?l?l?l?s +?l?s?s?l?l?d?l +?u?u?u?u?s?s?d +?l?l?l?d?s?s?l +?l?s?s?l?d?l?l +?l?s?l?l?s?d?l +?d?s?s?l?l?l?l +?u?u?s?u?u?s?d +?l?d?l?l?s?s?l +?l?l?d?l?s?l?s +?l?l?l?s?l?d?s +?l?d?l?s?l?l?s +?l?l?l?l?d?d?l?d?d +?s?u?l?l?l?l?d?d +?l?l?l?l?l?d?l?s +?l?d?s?d?d?d?d?d?d +?l?l?d?d?s?d?l?l +?l?l?l?d?d?d?s?l +?u?l?d?l?l?d?l?l +?d?d?s?d?s?d?s?d +?u?s?u?s?u?u?u +?l?l?d?d?d?l?l?l?l +?l?d?d?d?d?d?d?d?d?s +?l?d?d?l?l?d?d?s +?d?d?l?l?s?l?d?d +?d?d?l?s?l?l?d?d +?d?s?d?d?d?l?l?l +?l?l?d?d?l?s?d?d +?l?d?l?d?l?s?d?d +?s?d?d?d?d?u?u?u +?l?l?l?u?l?u?l +?l?u?u?u?l?l?l +?u?u?u?l?u?u?u +?l?d?d?l?d?l?d?d?d +?d?d?d?d?d?d?l?l?u +?u?d?d?l?d?d?u?d?d +?u?s?l?s?d?d?d +?u?s?s?u?d?d?d +?u?s?l?s?d?d?d?d +?s?d?l?d?u?d?s +?l?d?l?d?s?d?s +?d?l?l?d?d?s?s +?s?d?l?l?d?s?d +?u?d?s?l?s?d?d +?d?l?s?s?d?l?d +?s?l?d?s?u?d?d +?d?l?d?d?s?s?l +?s?l?s?d?l?d?d +?s?s?l?d?d?l?d +?s?u?s?l?d?d?d +?u?s?d?s?l?d?d +?s?s?l?u?d?d?d +?d?s?u?u?s?d?d +?d?d?l?s?s?l?d +?l?d?s?d?l?s?d +?d?d?u?u?d?s?s +?d?l?l?s?d?d?s +?l?u?d?d?d?s?s +?d?d?s?s?l?l?d +?l?s?d?d?s?l?d +?u?d?l?d?d?s?s +?d?d?d?s?s?u?u +?l?d?d?u?s?s?d +?d?d?s?l?s?l?d +?l?d?s?l?d?s?d +?d?s?l?d?d?l?s +?d?d?s?d?u?u?s +?s?l?d?s?l?d?d +?d?d?s?d?d?s?u?u +?l?d?s?l?s?d?d +?l?s?s?d?l?d?d +?s?d?l?l?d?d?s +?d?d?s?u?d?s?u +?d?s?l?s?l?d?d +?l?d?s?s?d?d?l +?s?u?d?d?d?s?u +?s?d?d?d?l?s?l +?d?l?s?d?d?s?l +?u?l?s?d?d?d?s +?s?d?s?l?d?d?l +?d?d?s?l?s?d?l +?s?l?s?d?d?d?l +?s?d?d?l?d?l?s +?d?s?d?s?l?l?d +?u?d?s?s?l?d?d +?d?s?d?s?d?u?u +?s?l?d?s?d?l?d +?d?d?s?s?d?u?u +?d?l?l?d?s?d?s +?l?d?s?l?d?d?s +?d?d?u?s?l?d?s +?s?s?d?l?d?l?d +?d?l?d?d?l?s?s +?u?s?u?d?s?d?d +?d?d?u?l?s?s?d +?d?u?d?u?s?d?s +?s?d?d?s?d?l?l +?s?u?d?u?d?s?d +?u?s?u?d?d?s?d +?u?d?d?d?s?s?u +?s?u?d?u?s?d?d +?d?d?l?s?l?s?d +?l?d?s?d?l?d?s +?s?s?u?l?d?d?d +?d?l?s?d?d?l?s +?l?d?s?d?d?s?l +?u?l?s?d?s?d?d +?u?s?s?d?d?d?l +?s?d?d?l?l?s?d +?d?d?d?d?s?l?l?s +?s?l?d?d?s?l?d +?d?s?d?l?s?d?l +?d?s?s?d?d?l?l +?s?s?d?d?d?u?l +?s?d?s?d?d?u?l +?d?d?s?d?u?s?u +?u?s?d?u?d?s?d +?s?d?d?d?l?u?s +?s?d?l?s?l?d?d +?l?d?d?d?u?s?s +?l?d?d?s?u?d?s +?u?l?d?s?d?d?s +?d?s?d?d?l?s?l +?d?s?d?d?l?l?s +?s?s?d?d?u?d?u +?l?s?d?l?d?s?d +?d?s?s?d?l?l?d +?u?u?s?d?s?d?d +?d?l?d?s?d?s?l +?l?d?s?u?s?d?d +?s?d?l?d?d?l?s +?s?u?d?d?s?d?u +?d?s?d?u?s?d?u +?d?s?l?d?l?d?s +?d?l?s?u?s?d?d +?s?d?d?d?s?u?u +?d?s?d?l?s?l?d +?l?s?s?u?d?d?d +?l?d?l?s?d?d?s +?d?s?l?d?l?s?d +?u?d?l?d?l?l?d?l +?u?l?l?d?d?l?l?d +?u?u?d?u?u?d?u?d +?u?d?u?u?u?d?u?d +?d?d?d?u?u?l?l?l +?l?l?s?d?d?s?l?l +?d?d?d?d?d?s?u?l +?d?d?d?d?d?s?u?u +?l?d?d?l?d?s?d?d +?d?d?d?l?d?d?l?s +?u?l?d?d?s?d?d?d +?s?u?u?d?d?d?d?d +?l?d?d?l?d?d?s?d +?d?l?l?d?s?d?d?d +?u?l?d?s?d?d?d?d +?l?u?d?d?d?d?d?s +?d?d?s?d?d?l?l?d +?l?s?u?d?d?d?d?d +?l?d?d?d?l?s?d?d +?u?u?d?d?d?d?s?d +?u?u?d?d?d?s?d?d +?u?l?u?l?s?s?s +?d?d?d?d?l?d?d?l?d +?d?d?u?u?l?l?l?l +?u?d?l?l?s?l?d +?l?d?u?l?l?d?s +?l?u?u?l?s?d?d +?d?u?u?s?l?l?d +?l?s?u?u?l?d?d +?u?l?d?d?s?l?l +?u?d?l?s?u?l?d +?s?l?d?l?u?d?l +?s?l?u?l?u?d?d +?u?s?l?u?l?d?d +?d?d?l?l?l?u?s +?l?u?l?s?d?d?l +?d?d?u?l?l?u?s +?s?l?u?l?l?d?d +?d?l?d?l?l?s?l +?d?u?u?u?u?s?d +?l?d?d?l?l?u?s +?d?s?u?u?u?d?u +?u?u?s?d?d?l?l +?u?u?s?l?l?d?d +?u?d?d?l?l?s?l +?l?l?s?u?u?d?d +?u?d?d?s?l?l?l +?l?s?l?u?l?d?d +?l?l?s?d?d?u?u +?u?d?l?l?d?s?l +?u?l?l?d?l?s?d +?u?u?u?l?d?s?d +?u?s?d?u?d?u?u +?d?d?u?u?s?u?u +?l?u?u?u?d?d?s +?u?d?l?s?l?d?u +?u?u?s?l?d?d?u +?l?l?l?d?d?s?u +?d?l?d?s?l?l?u +?l?l?u?s?d?d?l +?u?d?l?l?l?s?d +?l?l?s?u?l?d?d +?u?d?u?s?u?d?u +?u?s?l?d?d?l?l +?d?s?d?u?l?l?l +?l?s?u?l?d?d?l +?u?l?l?s?d?l?d +?l?s?u?l?l?d?d +?u?s?l?l?d?l?d +?u?l?l?u?d?s?d +?u?l?d?s?u?l?d +?u?l?s?l?d?l?d +?l?l?d?l?d?s?l +?l?u?u?u?s?d?d +?u?d?l?l?s?u?d +?d?d?d?l?l?l?s?l +?l?l?l?l?s?d?d?l +?u?s?d?l?l?d?l +?u?l?d?d?l?s?l +?l?d?l?d?l?l?d?s +?s?u?u?d?d?u?u +?u?u?u?d?s?d?u +?d?u?u?u?u?d?s +?d?d?u?s?l?l?l +?u?u?u?u?d?s?d?d +?u?s?u?d?d?u?u +?s?d?l?l?l?l?d?d +?d?s?l?d?l?l?l +?d?l?l?l?l?s?d?d +?u?d?l?s?d?l?l +?u?l?u?d?d?l?s +?l?u?l?l?d?d?s +?d?d?l?l?l?l?s?s +?u?u?l?s?d?d?u +?d?d?u?s?u?l?l +?u?u?u?u?u?u?d?s +?u?u?s?u?s?u?u +?u?u?d?d?u?d?d?u +?u?d?l?d?l?u?d?d +?l?d?l?d?u?d?l?d +?u?u?d?l?l?d?d?d +?u?d?u?u?d?d?u?d +?u?d?d?u?d?u?d?u +?u?d?u?d?u?d?l?d +?u?d?u?d?d?u?u?d +?u?d?l?u?d?l?d?d +?u?d?d?l?l?d?d?u +?d?d?l?u?l?u?d?d +?u?d?l?d?d?l?l?d +?u?l?d?u?l?d?d?d +?l?l?d?d?d?d?u?l +?d?u?d?l?d?l?d?u +?u?d?d?u?u?d?u?d +?d?d?l?u?u?u?d?d +?u?u?d?d?u?d?u?d +?u?d?d?d?u?d?u?u +?d?d?d?u?u?u?d?u +?l?d?u?d?l?d?l?d +?d?u?d?u?u?u?d?d +?l?d?d?u?u?d?d?l +?d?d?u?u?u?d?d?u +?l?l?u?d?d?d?d?d?d +?d?d?d?d?u?l?l?d?d +?l?d?l?d?d?l?d?d?d +?d?d?d?s?s?l?l?l +?l?l?d?d?l?l?l?l?l +?u?l?d?d?d?d?d?d?s +?u?l?s?d?d?d?d?d?d +?s?s?s?s?d?d?l +?l?l?l?s?d?d?s?d?d +?u?u?u?l?u?l?d +?l?u?l?l?u?u?d +?u?u?u?u?l?d?l +?u?u?d?u?u?l?u +?l?u?l?l?d?l?u +?l?u?l?l?l?d?u +?l?u?u?u?u?d?u +?u?l?u?l?u?d?l +?u?l?d?l?u?u?u +?u?u?d?u?u?l?l +?l?l?d?u?u?l?l +?u?l?d?u?l?l?u +?u?d?u?d?u?u?u?u +?l?u?u?d?l?u?l +?l?u?l?l?l?u?d +?l?l?d?l?u?u?l +?d?l?l?l?u?u?l +?u?u?u?d?l?u?u +?u?d?l?l?d?l?l?l +?d?l?l?u?u?l?l +?d?u?u?u?u?l?l +?d?u?u?u?u?l?u +?u?u?l?l?u?l?d +?u?d?u?l?u?l?u +?u?u?l?u?u?l?d +?d?l?u?u?l?l?l +?u?l?u?l?d?l?u +?u?u?l?l?l?d?u +?u?d?l?l?l?u?l +?u?u?u?d?u?u?l +?l?d?l?l?u?u?l +?d?d?l?l?d?d?d?d?d?d +?d?d?d?d?d?d?s?d?l +?l?d?d?s?d?d?d?d?d +?l?l?l?l?l?u?u?u +?d?d?s?s?s?s?s +?u?d?u?s?l?l?l +?u?d?u?u?u?u?s +?u?s?d?u?l?l?l +?l?l?u?l?l?l?s +?l?l?l?l?s?u?d +?u?l?l?d?s?l?l +?u?l?l?d?l?s?l +?s?u?u?d?u?u?u +?l?l?d?d?s?l?l?l +?u?u?u?d?u?u?s +?u?u?d?s?u?u?u +?l?d?d?d?d?l?l?l?l +?l?l?d?l?l?l?l?l?l +?s?l?l?l?s?d?s +?d?d?u?l?l?u?l?l +?u?d?u?d?u?d?u?u +?u?l?u?u?l?d?d?d +?s?s?l?l?l?d?d?d +?l?d?d?d?d?l?l?d?d +?d?l?d?l?l?d?d?d?d +?l?l?l?l?d?d?d?d?d?d?d +?l?l?s?d?d?l?l?l +?u?l?s?l?l?l?d?d +?s?s?l?u?s?s +?s?s?s?l?s?l +?l?s?s?s?u?s +?s?s?u?s?l?s +?s?u?s?s?s?l +?s?s?s?s?u?l +?l?s?s?s?l?s +?s?s?s?l?u?s +?s?s?u?s?s?l +?l?s?u?s?s?s +?d?d?d?d?d?u?l?l?l +?u?u?l?l?d?d?s?s +?u?l?u?l?u?u?l +?l?u?l?u?u?u?u +?u?l?l?u?l?u?u +?d?d?d?d?s?d?d?s?d?d +?s?s?s?s?s?s?d +?u?s?u?u?u?s?u +?l?l?s?u?s?l?l +?u?u?s?d?d?s?s +?d?s?d?s?u?s?u +?l?s?d?s?d?s?l +?d?l?s?d?l?s?s +?l?s?s?l?s?d?d +?s?l?d?s?l?d?s +?s?s?s?d?d?u?u +?l?s?l?d?d?s?s +?d?l?s?s?d?l?s +?u?s?d?s?u?s?d +?s?l?s?s?l?d?d +?u?s?u?s?d?s?d +?u?d?u?d?s?s?s +?l?l?l?l?l?l?u?u +?u?l?l?d?l?d?l?l +?u?d?l?d?l?l?l?l +?u?l?l?d?d?d?d?d?d?d +?l?d?l?l?l?l?l?l?l +?d?d?d?d?d?d?d?d?d?s?d +?l?l?l?d?d?s?l?l +?d?d?d?d?l?l?l?d?d?d +?d?d?d?d?s?l?s?l +?l?d?d?s?l?d?d?s +?s?d?d?l?l?d?d?s +?s?l?d?d?l?d?d?s +?d?d?d?l?l?l?l?l?d +?l?s?l?l?s?l?s +?s?l?l?l?l?d?d?d?d +?u?u?d?d?d?d?d?d?s +?l?d?d?d?d?l?s?l +?d?l?l?l?s?d?d?d +?l?d?l?l?d?s?d?d +?d?d?u?u?u?d?d?s +?l?l?d?s?l?l?s +?s?s?l?l?d?l?l +?s?l?l?s?l?l?d +?u?d?u?u?u?u?d?u +?d?d?l?l?l?l?l?u +?u?l?u?u?l?l?d?d +?l?l?d?l?l?l?l?d?d +?u?d?l?l?u?d?l?l +?d?d?d?d?s?d?d?s?d +?u?l?l?s?l?d?d?d +?u?l?s?l?l?d?d?d +?d?d?d?d?d?l?l?l?s +?u?u?s?u?u?u?u?u +?l?l?l?l?s?d?s?d +?d?d?d?l?d?d?d?l?d +?d?d?d?u?l?d?d?d?d +?d?d?l?d?d?d?l?d?d +?d?d?s?s?d?d?s?s +?u?d?d?d?u?l?l?l +?l?l?d?d?d?u?u?u +?u?d?u?l?l?l?d?d +?u?u?u?d?d?u?u?d +?u?d?d?l?l?d?l?l +?u?u?l?l?u?d?d?d +?d?d?d?u?u?u?l?l +?l?d?d?d?d?s?s?s +?d?d?d?d?s?s?s?l +?u?u?l?l?u?u?s +?l?u?l?u?l?u?s +?l?l?l?l?s?l?u +?u?l?l?s?u?l?l?l +?d?d?d?d?s?d?l?d +?d?d?s?d?d?d?d?u +?d?d?l?d?d?d?s?d +?d?l?d?d?s?d?d?d +?d?d?d?s?u?d?d?d +?d?d?s?d?d?d?l?d +?d?d?s?d?d?u?d?d +?l?d?d?d?d?d?d?s?d +?d?d?d?d?d?u?d?s +?d?d?d?d?d?s?d?u +?d?d?s?u?d?d?d?d +?u?d?d?d?s?d?d?d?d +?s?d?d?d?d?u?d?d +?d?d?d?d?s?u?d?d +?s?d?d?d?d?d?l?d +?d?d?d?d?d?u?s?d +?d?s?d?l?d?d?d?d +?d?d?d?s?d?d?d?u +?d?s?d?d?d?d?l?d +?d?d?d?d?u?d?d?s +?d?d?d?d?l?d?s?d +?s?d?d?d?l?d?d?d +?d?d?s?d?d?d?u?d +?u?d?d?d?d?s?d?d +?d?d?u?d?d?d?d?s +?d?d?d?u?s?d?d?d +?d?l?d?d?d?d?s?d +?d?s?d?d?l?d?d?d +?d?d?d?d?s?d?u?d +?u?u?d?u?u?d?u?u +?d?u?u?u?u?d?u?u +?u?d?u?u?u?u?u?d +?u?l?l?l?d?d?d?d?s +?l?s?d?d?d?d?d?d?d?d +?u?l?l?d?d?d?s?s +?l?l?l?d?d?l?l?s +?u?d?d?d?l?d?d?l +?d?d?d?d?l?u?u?d +?d?d?u?d?l?l?d?d +?d?u?d?l?d?d?l?d +?u?d?d?d?u?l?d?d +?d?d?u?d?d?l?d?u +?d?d?u?d?d?l?d?l +?d?u?d?d?d?d?l?l +?d?l?d?l?u?d?d?d +?d?d?l?d?d?d?u?l +?u?d?d?l?u?d?d?d +?d?u?u?d?u?d?d?d +?d?u?l?u?d?d?d?d +?d?u?d?d?l?d?d?l +?l?u?d?u?d?d?d?d +?l?d?d?d?d?l?d?u +?l?d?d?d?l?d?d?u +?d?l?u?d?d?d?d?l +?d?d?d?l?l?d?d?u +?d?d?u?u?d?u?d?d +?d?l?d?d?d?u?d?l +?d?d?d?d?u?l?d?l +?u?d?d?u?d?l?d?d +?l?d?d?d?u?d?u?d +?u?d?d?u?d?d?l?d +?d?d?u?u?l?d?d?d +?d?u?d?d?l?l?d?d +?l?d?l?u?d?d?d?d +?u?d?u?d?d?l?d?d +?l?d?u?u?d?d?d?d +?d?l?d?l?d?d?u?d +?u?d?d?d?d?l?d?l +?d?l?d?l?d?d?d?u +?l?d?u?l?d?d?d?d +?d?l?l?d?u?d?d?d +?d?d?d?u?u?d?u?d +?u?d?l?d?u?d?d?d +?u?d?u?d?d?d?u?d +?d?u?d?l?d?d?d?u +?d?u?d?u?d?d?d?u +?u?l?d?d?d?l?d?d +?u?d?d?d?d?u?d?u +?d?d?d?l?d?l?d?u +?d?d?u?l?d?l?d?d +?d?u?d?d?u?u?d?d +?d?d?d?u?u?d?d?l +?d?l?u?l?d?d?d?d +?d?d?u?u?d?d?l?d +?l?l?l?d?d?d?l?d?d +?d?d?u?l?u?d?d?d +?d?d?l?l?d?d?u?d +?l?d?l?l?l?l?l?s +?u?l?l?d?l?l?d?l +?s?l?l?l?l?l?d?s +?u?u?s?u?u?d?d?d +?l?l?d?d?d?s?l?l +?u?l?l?l?l?d?s?d +?l?s?l?l?l?d?d?d?d +?u?u?u?u?u?l?u +?u?u?l?u?u?u?u +?l?u?u?u?l?u?u +?u?l?u?l?u?u?u +?u?u?u?u?l?u?u +?l?u?l?l?u?l?u +?d?d?d?s?s?s?d?d +?s?d?s?d?d?s?d?d +?d?s?d?s?d?d?d?s +?l?l?d?d?d?s?s?s +?d?d?d?s?l?l?l?l?l +?s?l?s?l?d?l?s +?d?l?s?l?s?l?s +?l?s?d?s?l?s?l +?u?l?l?l?l?u?l?d +?d?d?d?s?d?d?d?d?s +?d?d?d?d?d?d?s?s?d +?l?l?l?d?d?u?l?l +?u?u?u?d?d?d?s?s +?d?s?l?l?l?s?d?d +?u?s?u?s?u?d?d?d +?s?s?d?d?s?s?d?d +?u?l?l?d?d?d?u?u +?u?l?d?d?d?u?l?l +?d?d?d?d?l?u?u?l +?l?u?d?d?l?u?d?d +?d?u?u?d?d?d?u?u +?d?u?u?d?u?d?u?d +?u?l?d?l?d?d?l?l +?u?d?d?l?d?d?u?l +?d?u?u?d?u?u?d?d +?u?d?d?l?u?l?d?d +?u?l?d?l?d?l?d?l +?u?l?u?d?d?d?d?u +?u?u?d?d?d?d?u?l +?u?d?u?u?d?u?u?d +?u?d?d?d?l?l?d?l +?u?u?d?u?d?u?u?d +?u?d?d?u?d?u?u?d +?u?d?d?l?l?l?d?l +?l?u?l?l?d?d?d?l +?u?d?d?d?l?l?l?d +?d?u?u?u?d?d?d?u +?d?d?d?u?l?u?l?u +?u?u?d?u?d?d?u?d +?u?d?d?l?d?l?d?l +?u?l?d?d?d?d?u?u +?u?l?d?d?d?l?d?l +?u?l?d?l?l?d?l?d +?u?l?d?l?l?d?d?l +?u?l?d?d?d?l?l?d +?u?d?l?d?u?d?u?d +?l?l?l?s?d?d?d?d?d?d +?d?d?d?l?l?l?l?l?d?d +?l?s?l?d?d?s?d?d +?l?d?d?l?d?d?s?s +?l?l?l?d?l?l?d?d?d +?u?s?s?l?l?l?l +?d?d?l?l?l?l?l?l?d +?d?d?d?l?d?d?d?l?l +?l?d?d?d?d?l?d?d?l +?d?d?d?d?l?l?d?d?l +?l?d?l?d?l?d?l?d?l?d +?s?l?l?l?l?l?u +?l?d?l?d?l?l?d?d?d +?d?l?l?l?l?l?d?s +?s?d?d?d?s?l?s +?s?s?d?l?d?s?d +?s?s?u?d?d?d?s +?s?s?s?d?l?d?d +?d?s?d?d?l?s?s +?s?s?s?u?d?d?d +?s?s?s?d?d?l?d +?s?s?s?d?d?d?d?l +?s?s?l?s?d?d?d +?d?s?d?s?d?s?u +?d?d?d?s?s?l?s +?s?u?d?d?d?s?s +?s?d?d?d?l?s?s +?s?d?d?l?d?s?s +?d?s?s?s?d?d?l +?d?s?d?d?s?l?s +?s?s?d?s?d?d?l +?s?d?l?s?s?d?d +?l?d?d?s?s?s?d +?s?d?s?d?s?d?u +?s?s?l?d?s?d?d +?l?d?d?s?d?s?s +?s?l?d?s?s?d?d +?s?s?u?s?d?d?d +?l?s?d?s?d?d?s +?d?s?d?d?s?s?u +?u?s?d?s?d?s?d +?u?s?d?s?s?d?d +?d?s?l?s?s?d?d +?s?s?d?d?d?s?l +?s?l?s?d?d?d?s +?l?s?s?s?d?d?d?d +?d?s?d?l?s?d?s +?d?l?d?d?s?s?s +?s?l?d?d?s?d?s +?u?s?s?s?d?d?d +?l?l?l?l?l?d?l?d?d +?u?l?d?l?l?l?d?l +?l?l?s?l?l?d?d?d?d +?l?s?l?l?d?l?d?d +?d?l?l?l?l?d?d?s +?d?d?d?d?d?d?d?d?l?s +?l?l?l?s?l?l?l?d?d +?d?d?d?s?d?d?s?l +?s?d?d?l?d?d?d?s +?s?s?l?d?d?d?d?d +?d?d?s?d?d?s?d?l +?l?l?l?l?s?d?l?l +?l?s?l?s?l?s?l?s +?d?d?d?d?d?d?u?u?u?u +?l?d?d?l?l?l?d?d?d +?u?d?d?d?d?d?d?d?d?l +?d?d?d?d?s?d?d?d?l +?s?l?d?l?l?s?d +?u?u?s?l?s?d?d +?u?d?l?d?l?s?s +?s?d?u?u?u?s?d +?s?d?d?s?u?u?u +?l?l?s?d?d?l?s +?l?s?d?l?d?l?s +?l?l?d?l?s?d?s +?d?s?l?d?l?l?s +?u?l?d?l?d?s?s +?s?d?l?s?l?l?d +?d?d?s?l?l?s?l +?u?s?d?d?s?u?u +?d?l?l?s?d?l?s +?d?l?l?s?l?s?d +?l?s?d?d?l?l?s +?u?l?l?s?d?s?d +?l?s?s?l?d?l?d +?s?l?l?l?d?s?d +?d?l?s?s?l?l?d +?s?d?d?u?l?u?s +?s?d?u?l?l?s?d +?l?d?s?l?l?d?s +?s?d?l?d?l?l?s +?d?s?u?l?l?s?d +?s?l?l?d?d?s?l +?d?l?l?l?s?d?s +?l?s?l?s?u?d?d +?l?s?l?d?l?s?d +?d?l?l?s?s?d?l +?s?s?u?u?d?d?u +?d?s?s?l?l?d?l +?u?s?s?u?d?u?d +?u?l?l?d?s?d?s +?s?d?s?l?d?l?l +?s?d?l?d?s?l?l +?d?u?s?d?u?u?s +?u?s?u?d?d?l?s +?u?l?d?d?s?s?l +?u?d?l?d?s?l?s +?s?d?l?s?l?d?l +?d?d?u?s?u?s?u +?u?u?s?s?d?d?l +?d?s?s?d?l?l?l +?s?s?d?l?l?l?d +?u?s?s?l?l?d?d +?u?d?l?l?d?s?s +?l?s?l?s?d?l?d +?s?l?s?d?l?l?d +?u?u?d?d?s?s?u +?l?s?s?s?s?s?s +?u?u?d?u?u?u?d?u +?u?d?d?d?u?d?d?d?d +?u?d?d?d?d?l?d?d?d +?d?l?d?d?d?l?d?d?d +?u?d?d?d?d?d?u?d?d +?d?d?l?d?d?d?d?l?d +?d?d?d?d?d?d?u?l?d +?d?d?d?d?d?d?u?u?d +?l?s?s?s?l?l?l +?l?l?s?l?l?s?s +?d?d?u?l?l?s?d?d +?l?u?u?s?d?d?d?d +?l?d?l?l?d?d?d?s +?d?l?l?l?d?s?d?d +?l?d?d?d?d?l?l?s +?l?s?l?d?l?d?d?d +?d?d?d?d?d?d?s?u?u +?d?d?d?d?d?d?s?s?l +?d?l?l?d?l?d?d?d?d +?d?d?u?l?u?d?d?d?d +?u?u?d?d?d?d?d?d?l +?u?l?d?l?u?l?s +?s?l?l?u?l?l?d +?u?u?u?s?u?d?u +?u?l?s?l?u?d?l +?u?u?u?s?l?l?d +?u?l?l?s?l?d?l +?u?u?s?d?l?l?l +?d?u?u?u?u?s?u +?u?l?l?u?l?s?d +?d?l?l?s?l?l?u +?u?l?u?l?l?s?d +?u?l?d?l?s?l?l +?s?l?d?l?l?l?u +?u?s?l?d?l?l?l +?s?u?u?u?u?d?u +?u?u?l?l?l?d?s +?d?d?d?d?l?l?l?l?d?d +?u?d?d?d?d?d?d?d?d?d?d +?l?l?l?d?d?s?s?s +?u?u?u?l?l?l?d?d?d +?d?d?s?d?d?d?s?d?d +?u?d?l?l?l?d?d?l +?u?l?l?l?d?d?l?d +?d?d?d?l?l?l?u?u +?u?l?d?d?l?d?l?l +?l?d?d?d?l?l?l?d?d +?d?d?l?d?d?l?d?d?d?d +?u?s?l?s?l?l?d +?u?d?l?l?s?l?s +?s?l?l?l?l?l?s?d +?l?s?d?l?l?s?l +?d?l?s?l?l?l?s +?l?s?s?d?l?l?l +?u?l?l?s?s?l?l +?l?l?l?s?l?s?d?d +?d?u?u?u?u?s?s +?u?l?l?d?l?s?s +?s?l?l?s?l?d?l +?l?l?d?s?s?l?l +?l?d?s?l?l?l?s +?l?l?s?s?l?l?d +?l?d?s?s?l?l?l +?l?s?l?d?s?l?l +?l?d?s?l?s?l?l +?l?l?s?l?s?d?l +?d?u?u?u?u?u?d?u +?u?d?d?u?l?l?l?l +?d?u?d?u?u?u?u?u +?u?l?l?l?l?l?s?d?d +?l?l?d?s?s?s?s +?l?l?l?d?d?d?d?s?s +?l?u?u?l?u?u?l +?u?u?l?u?l?l?l +?u?l?l?l?l?u?u?d +?l?l?u?l?u?l?u +?l?l?u?l?u?l?l +?l?u?u?l?u?l?l +?l?u?u?l?l?l?l +?l?u?u?u?u?l?l +?l?u?l?u?l?l?u +?u?u?l?l?d?d?d?s +?u?u?l?l?s?d?d?d +?l?l?d?l?l?s?d?d +?d?d?l?l?l?l?s?d +?s?s?d?d?d?l?l?l +?l?d?l?d?d?l?d?l?d +?s?d?l?l?l?l?s?d +?s?s?s?s?l?s +?l?l?l?l?l?s?d?s +?s?u?l?u?l?u?l +?l?u?l?l?l?l?s +?l?l?l?s?l?u?l +?u?l?l?s?l?l?u +?l?l?l?l?u?l?s +?l?l?l?s?l?l?u +?l?l?l?d?s?l?l?l +?l?d?l?d?d?d?d?d?d?d +?s?s?l?l?l?l?s?s +?u?s?l?s?l?s?l +?l?u?u?l?l?d?l +?d?l?l?u?u?u?l +?l?d?l?u?l?l?u +?d?l?u?l?l?l?u +?l?l?l?l?u?l?l?d +?u?d?l?u?l?l?u +?l?u?l?d?u?l?u +?d?l?u?u?u?u?l +?l?l?d?u?u?l?u +?u?l?l?u?u?d?l +?u?l?l?u?u?d?u +?l?u?l?u?d?l?l +?u?u?u?d?l?l?u +?l?u?u?u?d?u?u +?u?u?d?u?l?l?u +?u?l?u?u?d?u?u +?u?d?l?u?l?u?u +?l?l?d?u?l?u?l +?l?l?u?l?l?d?u +?l?l?l?u?d?u?u +?u?u?l?u?u?d?l +?l?l?u?d?l?u?u +?u?l?u?u?d?u?l +?l?d?l?u?u?l?l +?u?u?u?l?l?d?u +?u?u?d?l?u?u?u +?u?u?l?d?l?u?u +?u?u?l?u?d?u?u +?d?l?l?u?l?u?u +?l?l?u?u?u?d?l +?l?l?l?u?u?d?l +?l?u?d?l?l?u?l +?u?l?d?l?l?u?u +?u?l?d?l?l?u?l +?d?l?u?l?u?l?l +?l?l?d?l?u?l?l +?l?u?u?d?u?l?u +?l?l?u?l?u?u?d +?u?u?u?u?d?u?l +?u?l?l?d?u?l?u +?d?l?u?l?u?u?l +?l?u?l?l?u?l?d +?d?u?l?l?u?u?u +?l?l?l?l?d?l?d?s +?u?l?l?l?l?l?u?u +?l?d?d?l?d?d?d?d?l +?s?s?l?l?l?l?l?l +?u?l?l?l?l?l?s?s +?l?d?d?l?d?l?d?l?d +?l?d?d?l?d?d?d?d?d?d +?l?l?l?l?l?u?u?d +?l?l?l?l?u?l?l?l +?u?s?d?d?d?d?s?u +?d?d?d?d?u?u?s?s +?s?u?u?d?d?d?d?s +?l?s?l?d?d?d?d?s +?l?s?l?s?l?d?s +?l?s?l?s?d?l?s +?l?l?d?l?s?s?s +?d?l?l?l?l?l?l?u +?d?s?l?l?l?l?s?d +?l?l?l?l?d?d?l?s +?l?d?d?l?l?l?l?d?d +?l?l?l?l?l?s?d?d?d?d +?l?l?l?d?d?l?d?d?d +?l?l?l?s?d?d?s?d +?u?u?u?u?d?d?l?l +?l?l?l?d?d?l?l?u +?u?l?d?d?u?l?l?l +?u?l?u?u?l?u?d?d +?u?l?l?l?s?l?s +?s?l?u?l?u?l?s +?u?u?u?u?s?u?s +?u?s?u?u?u?u?s +?u?l?l?d?d?d?u?l +?l?l?l?d?d?d?u?l +?u?u?d?d?u?u?u?d +?l?l?u?l?d?d?d?l +?u?l?l?d?l?d?l?d +?l?l?d?d?d?u?l?l +?u?u?u?u?d?d?u?d +?l?d?l?l?l?l?l?d?d +?u?l?l?l?u?s?d?d +?l?d?l?l?d?l?l?s +?u?l?l?l?s?l?l?l +?l?s?l?s?l?s?s +?u?d?d?d?d?d?d?l?l +?d?d?d?d?d?l?l?d?l +?l?u?u?d?d?d?d?d?d +?l?d?d?l?l?l?l?l?l +?l?s?l?s?l?l?l?l +?l?u?l?l?u?l?d?d +?l?l?l?d?l?l?l?l?d +?u?u?l?l?d?d?d?d?d +?u?d?d?d?d?u?s?d +?d?d?s?d?l?l?d?d +?d?d?d?d?u?u?s?d +?l?d?d?d?d?l?s?d +?d?d?d?l?l?d?s?d +?d?d?u?d?d?u?d?s +?u?s?d?d?d?d?d?l +?l?d?d?d?s?d?d?l +?d?d?d?d?l?d?l?s +?u?s?l?d?d?d?d?d?d +?l?d?d?s?d?l?d?d +?s?d?u?u?d?d?d?d +?d?d?s?l?d?d?d?l +?d?s?d?l?l?d?d?d +?d?l?d?d?l?s?d?d +?d?d?d?l?s?l?d?d +?d?d?l?d?d?l?s?d +?l?d?l?d?d?s?d?d +?s?d?l?d?l?d?d?d +?u?d?d?d?d?d?s?l +?s?d?d?l?l?d?d?d +?u?d?u?d?s?d?d?d +?d?d?l?s?l?d?d?d +?d?d?l?d?d?l?d?s +?d?d?d?d?s?l?d?l +?l?l?l?l?d?d?s?l +?s?d?u?u?u?u?u?u +?l?l?s?s?l?d?d?d +?s?d?d?d?s?l?l?l +?u?d?d?l?d?d?d?d?d +?d?d?d?d?d?u?u?d?d +?l?l?l?l?l?l?l?d?d?d?d +?u?l?l?l?u?u?s +?l?l?l?l?u?s?u +?l?u?l?s?l?u?l +?d?d?d?s?d?d?d?d?d?d?d +?d?d?u?d?u?u?u?d +?u?d?d?u?d?u?d?l +?d?d?l?l?d?d?l?u +?l?d?d?l?u?l?d?d +?u?d?d?u?l?l?d?d +?d?d?d?d?u?u?l?u +?u?d?l?l?u?d?d?d +?d?d?u?l?d?d?u?u +?d?l?d?l?d?l?d?u +?u?l?u?d?d?l?d?d +?l?l?u?d?l?d?d?d +?l?u?d?d?d?u?l?d +?u?u?d?u?d?u?d?d +?d?d?u?l?l?d?d?u +?l?u?d?d?u?u?d?d +?u?l?d?d?u?u?d?d +?l?u?d?d?u?l?d?d +?l?d?d?d?d?l?l?u +?d?d?l?l?d?l?l?d?d +?d?d?u?l?u?u?d?d +?d?u?u?d?d?u?u?d +?l?u?d?d?d?d?u?l +?d?u?d?u?d?u?u?d +?d?u?l?d?d?l?l?d +?u?d?d?l?l?d?l?d +?u?u?d?d?d?l?l?d +?u?l?d?u?d?l?d?d +?d?d?u?u?u?d?u?d +?d?d?u?u?u?l?d?d +?u?u?d?d?u?l?d?d +?u?d?u?d?l?d?u?d +?d?u?d?d?u?u?d?u +?u?u?d?u?d?d?d?u +?l?l?d?u?u?d?d?d +?u?l?l?d?d?l?l?u +?u?l?l?l?d?l?d?l +?d?u?u?d?u?u?u?u +?l?l?d?d?u?l?l?l +?d?d?u?u?u?u?u?u?u +?l?l?u?l?l?l?l?d +?u?l?l?u?u?u?l +?u?l?u?u?l?u?u +?l?s?d?d?l?l?l?l +?d?u?l?l?d?d?d?s +?l?s?d?l?l?l?d?d +?l?d?d?l?d?l?d?s +?l?l?u?s?d?d?d?d +?l?l?d?l?d?s?d?d +?s?l?d?d?l?l?d?d +?l?l?d?d?l?d?d?s +?l?l?l?d?s?d?d?d?d +?d?d?d?l?l?l?d?s +?d?d?s?u?l?l?d?d +?l?l?d?d?s?l?d?d +?l?d?l?d?s?l?d?l +?l?l?d?d?l?l?d?s +?l?d?d?s?d?d?l?l +?l?d?l?d?d?l?d?s +?u?d?l?l?s?d?d?d +?u?u?u?u?d?d?s?d +?l?d?l?s?l?d?d?d +?l?l?l?l?u?d?d?d?d +?u?l?d?d?d?d?d?d?l +?u?d?d?d?d?d?d?u?u +?l?d?l?d?d?l?d?d?l +?d?d?d?u?l?u?d?d?d +?s?l?l?l?s?l?s +?l?l?d?d?d?d?s?d?d +?d?d?s?l?l?l?s?d?d +?l?l?l?l?d?l?l?d?d +?u?s?l?l?l?s?u +?l?u?u?u?u?d?d?d?d +?d?d?d?u?l?l?l?l?l +?d?s?d?s?s?d?s +?s?d?d?s?s?d?s +?s?d?s?d?s?s?d +?d?s?s?d?s?s?d +?s?s?d?d?s?s?d +?d?s?s?d?d?s?s +?u?d?d?d?d?u?d?d?d?d +?l?l?l?l?l?l?l?d?s +?l?l?l?u?l?l?l?l +?u?l?l?d?u?u?d +?d?d?u?d?u?u?u?u +?l?l?u?u?d?l?d +?u?d?u?l?l?d?u +?l?l?u?d?u?l?d +?u?u?l?d?u?u?d +?d?u?d?u?l?u?l +?d?u?l?d?l?u?u +?u?u?d?u?u?l?d +?u?l?u?d?l?l?d +?u?u?d?u?u?d?l +?d?u?u?l?l?u?d +?d?u?d?l?l?l?u +?l?l?d?u?d?u?l +?u?d?u?u?d?l?l +?u?d?d?l?u?u?u +?d?l?l?l?u?d?l +?d?u?d?u?u?u?u?d +?d?u?l?u?l?d?u +?u?u?d?u?l?l?d +?u?l?l?u?u?u?d?d +?d?l?u?u?u?l?d +?l?u?l?d?u?d?u +?l?u?l?d?u?d?l +?l?u?d?u?l?d?l +?l?u?l?u?d?u?d +?u?l?d?d?l?l?d?l +?u?l?d?u?u?d?l +?d?u?u?u?l?u?d +?l?u?u?d?d?l?u +?l?l?d?l?u?d?l +?l?d?d?l?u?u?l +?u?d?u?u?l?u?d +?d?u?u?d?u?u?u?d +?d?u?l?d?u?l?u +?d?u?l?u?u?d?l +?l?u?u?l?d?d?l +?l?l?u?d?l?d?l +?l?l?u?d?l?d?u +?u?l?u?d?l?u?d +?u?u?d?u?l?d?u +?l?d?l?u?u?l?d +?d?d?d?l?l?u?u?u +?l?u?d?l?l?d?l +?l?l?u?l?d?d?u +?l?l?u?l?d?d?l +?l?d?u?u?l?u?d +?d?u?d?u?u?l?l +?u?u?l?d?l?l?d +?l?d?d?u?l?u?l +?l?d?d?l?l?u?l +?d?d?d?u?l?l?l?u +?u?l?u?u?d?d?d?u +?d?l?u?u?l?u?d +?l?d?u?l?l?d?u +?u?d?d?u?l?u?u +?l?u?d?d?u?l?l +?l?d?l?u?d?u?u +?d?u?u?l?u?l?d +?l?l?d?u?d?l?l +?l?l?d?u?d?l?u +?l?d?u?u?u?u?d +?u?l?l?d?l?d?u +?l?u?d?l?u?d?l +?l?u?l?d?d?u?u +?d?l?l?u?u?d?u +?l?l?u?d?d?u?l +?d?u?l?u?u?d?u +?l?d?u?u?u?d?u +?l?u?l?d?l?u?d +?l?u?u?l?d?u?d +?u?u?u?d?u?d?l +?l?u?d?u?l?l?d +?d?l?l?d?l?u?u +?l?d?d?l?u?u?u +?d?l?l?u?l?d?l +?u?u?d?d?u?d?u?u +?l?d?l?u?l?u?d +?u?u?u?d?l?u?d +?u?l?u?d?u?l?d +?l?l?u?l?d?u?d +?u?u?l?l?d?u?d +?l?u?d?d?l?u?l +?l?l?u?u?l?d?d?d +?u?d?l?d?l?u?l +?u?u?l?d?d?u?l +?u?u?l?d?d?u?u +?d?d?u?l?u?u?u +?u?l?l?d?l?u?d +?l?d?d?u?u?l?l +?l?d?u?l?l?l?d +?l?l?d?l?u?u?d +?l?u?d?d?l?l?u +?d?l?d?u?l?u?u +?d?l?u?u?l?d?l +?u?l?u?u?d?l?d +?l?u?d?u?u?u?d +?d?d?l?u?u?l?u +?u?l?u?u?d?d?u +?u?d?l?d?u?l?u +?u?d?u?l?l?u?d +?u?d?u?d?u?l?u +?u?d?l?u?l?u?d +?d?u?u?l?d?u?u +?u?l?d?l?d?u?l +?u?u?l?d?l?u?d +?u?d?l?u?u?d?u +?d?l?d?u?l?l?u +?u?u?d?u?l?u?d +?u?u?u?s?u?u?d?d +?u?d?d?u?u?u?u?d +?l?l?l?d?d?d?l?u +?l?d?u?l?u?l?d +?d?u?u?l?d?l?l +?l?d?l?d?u?l?l +?u?l?u?l?u?s?d?d +?u?d?u?d?l?u?l +?u?d?u?u?d?u?l +?l?d?u?u?l?d?l +?d?u?u?u?u?d?l +?l?u?u?d?u?u?d +?l?d?u?d?l?u?l +?l?l?l?u?d?u?d +?l?u?u?d?u?l?d +?d?u?l?u?d?l?u +?l?d?u?l?l?u?d +?u?l?d?u?d?u?u +?u?l?d?u?d?u?l +?d?l?u?l?d?l?l +?l?u?d?d?l?u?u +?u?u?d?l?l?d?u +?u?u?d?d?l?u?l +?d?u?u?l?u?u?d +?u?d?l?u?d?u?l +?u?d?l?u?d?u?u +?l?d?l?u?u?u?d +?u?l?d?l?d?l?l?l +?d?l?u?l?d?u?u +?d?l?u?l?d?u?l +?l?l?d?u?l?l?d +?u?d?d?u?u?l?u +?u?u?d?d?l?l?u +?d?l?u?d?u?u?l +?d?d?u?l?l?l?l?s +?u?u?d?l?u?d?l +?d?l?d?u?u?u?u +?l?d?u?l?d?u?l +?d?d?l?u?u?u?l +?d?u?l?l?u?u?d +?l?u?u?l?d?l?d +?d?l?u?u?d?l?u +?d?l?u?u?d?l?l +?d?u?l?d?l?l?u +?l?l?l?l?l?s?l?l?l +?l?s?l?l?s?d?d?d +?d?d?s?s?s?d?d?d +?d?s?d?s?d?d?s?d +?s?d?d?s?d?d?d?s +?d?d?s?d?d?s?s?d +?d?d?s?d?d?s?d?s +?d?d?d?s?d?d?d?s?d +?u?l?l?l?s?u?l?l +?l?l?d?s?l?l?l?l +?l?d?s?s?s?l?d +?s?d?d?s?l?l?s +?s?s?s?l?d?l?d +?d?s?l?l?s?s?d +?d?d?s?l?s?l?s +?l?d?s?l?d?s?s +?l?s?d?d?s?l?s +?d?l?l?d?s?s?s +?d?s?d?s?l?l?s +?s?d?s?l?l?s?d +?l?l?d?s?d?s?s +?u?l?s?d?s?d?s +?s?d?d?l?s?l?s +?s?u?s?u?s?d?d +?s?l?s?d?l?d?s +?d?s?l?s?d?l?s +?u?u?s?s?d?d?s +?u?s?u?s?d?d?s +?s?d?d?s?s?l?l +?u?u?s?d?d?s?d?d +?s?u?u?s?d?d?d?d +?d?d?l?l?s?s?d?d +?l?l?d?d?s?d?d?s +?s?l?s?l?d?d?d?d +?l?l?d?d?s?s?d?d +?l?l?l?l?d?l?l?l?d +?d?d?u?l?l?l?l?u +?l?l?s?l?l?s?l?l +?d?d?d?d?d?d?u?u?s +?s?d?d?d?d?d?d?l?l +?u?u?u?u?u?d?d?d?d?d +?l?l?l?s?s?d?l +?u?l?u?l?d?s?s +?u?u?u?u?s?d?s +?s?s?l?d?l?l?l +?s?u?d?l?l?l?s +?d?s?l?l?s?l?l +?u?s?u?u?d?u?s +?d?l?l?l?s?l?s +?u?s?u?u?u?s?d +?u?l?l?s?l?s?d +?s?d?d?l?l?l?l?s +?s?d?u?u?u?u?s +?s?u?u?u?u?s?d +?u?u?d?u?u?s?s +?d?l?l?s?s?l?l +?d?s?l?s?l?l?l +?l?l?s?s?d?l?l +?s?u?u?u?u?d?s +?l?l?l?d?s?l?s +?l?l?l?l?u?u?u?d +?d?d?l?l?d?d?l?d?d +?d?d?d?d?d?d?u?u?l +?l?d?d?d?l?l?l?l?l +?d?d?d?u?l?l?l?s +?u?l?u?l?d?d?d?s +?l?l?d?l?l?d?d?s +?s?d?l?l?l?s?s +?l?s?s?s?l?l?d +?s?l?l?l?s?s?d +?s?l?s?l?l?l?s +?u?s?u?l?l?l?d?d +?d?d?s?u?l?l?l?l +?u?u?s?u?u?u?d?d +?l?d?s?s?s?s?s +?l?l?u?s?l?l?l +?u?l?u?s?l?u?l +?l?l?s?u?u?u?u +?u?l?l?l?u?s?u +?l?l?l?u?s?l?l +?u?u?u?u?d?u?d?u +?u?l?u?d?d?u?l?u +?d?d?u?u?u?l?l?l +?d?u?l?l?l?l?u?d +?u?u?u?u?u?u?s?s +?u?s?u?s?u?l?l +?u?u?l?l?l?s?s +?u?l?l?s?l?l?s +?s?s?u?l?u?s?s +?l?s?s?l?s?s?l +?l?l?l?s?l?l?l?s +?s?s?s?d?d?s?s +?l?l?d?d?l?l?d?d?l +?s?d?u?u?l?l?l +?u?l?u?u?l?s?d +?u?l?u?l?d?l?s +?u?u?d?u?u?u?s +?u?l?l?l?u?d?s +?s?d?u?l?l?l?u +?u?s?u?u?u?d?u +?d?u?u?u?s?u?u +?u?d?u?u?s?u?u +?l?l?l?l?d?u?s +?d?u?s?u?u?u?u +?d?d?l?s?l?l?l?l +?d?u?s?l?l?l?l +?l?l?l?l?u?d?s +?u?l?d?l?l?s?l +?l?l?l?s?l?d?u +?s?l?l?l?l?u?d +?u?l?l?s?u?u?d +?u?u?u?d?s?l?l +?l?d?l?u?l?s?l +?l?l?l?u?u?d?s +?d?l?l?l?l?u?s +?s?l?l?l?d?l?u +?u?d?u?u?u?s?u +?l?d?u?s?l?l?l +?u?l?l?s?l?l?l?l +?l?l?d?d?s?d?d?d?d +?l?d?d?d?d?d?d?l?s +?d?d?d?l?l?l?l?l?l?l +?u?u?u?d?u?d?u?d +?u?u?l?l?d?d?d?l +?l?u?d?d?d?l?l?l +?l?d?l?l?d?l?d?l?d +?l?l?d?d?d?l?l?u +?d?u?u?d?d?u?u?u +?u?u?d?l?l?l?d?d +?u?l?u?d?d?d?u?l +?l?l?l?u?d?d?d?l +?u?l?u?u?u?d?d?d +?d?u?u?u?d?u?u?d +?s?d?u?l?l?l?l?l +?u?l?u?l?l?d?d?d?d +?u?l?d?s?s?s?s +?l?l?s?d?s?s?s +?s?s?l?l?d?s?s +?l?u?u?l?u?u?u +?u?u?l?u?l?u?l +?u?l?u?l?l?u?u +?u?l?u?u?l?l?u +?u?u?u?l?l?l?u +?u?u?u?u?l?u?l +?l?l?u?u?l?l?u +?l?l?l?l?l?u?l?d +?u?l?l?l?l?l?d?u +?u?s?l?l?l?l?l?d +?u?l?u?l?l?u?d?d +?l?d?l?l?d?d?l?d?d +?l?d?l?d?l?d?d?l?d +?l?s?l?l?l?s?d?d +?s?d?l?l?l?l?d?s +?u?d?d?s?d?d?s?d?d +?l?d?l?l?d?l?l?d?d +?l?d?l?d?d?d?d?d?l +?d?d?d?u?d?d?d?d?u +?l?d?l?d?d?d?d?l?d +?u?d?d?d?l?d?d?d?d +?d?d?l?l?d?d?d?d?l +?d?d?d?d?d?l?l?d?d?d +?d?d?s?u?u?u?u?u +?d?l?l?l?l?d?l?s +?u?l?l?s?l?l?d?d +?d?d?d?d?d?d?s?d?s +?l?u?l?l?l?l?l?d +?u?s?u?u?u?d?d?d +?u?l?l?l?d?d?s?d +?d?d?l?l?l?l?d?s +?u?u?u?s?u?d?d?d +?s?u?u?u?u?d?d?d +?l?d?l?l?s?l?d?d +?l?d?l?l?d?l?d?s +?u?l?s?u?l?l?l?l +?u?l?l?l?l?d?d?d?d?d +?d?d?d?d?d?d?d?l?l?d +?u?u?u?l?l?d?d?d?d +?s?d?d?s?d?d?s?d?d +?d?d?d?s?s?s?d?d?d +?d?d?d?l?l?d?d?l?l +?l?l?d?d?d?d?l?l?d +?u?u?u?u?d?l?l?l +?l?l?l?d?d?l?l?l?d +?l?l?l?l?l?s?s?l +?u?l?l?u?l?l?d?d?d +?l?l?d?d?d?s?d?d?d +?l?l?l?s?l?l?l?l?l +?u?u?l?l?l?s?d?d +?d?d?l?l?l?l?u?u +?l?l?l?l?d?d?u?l +?u?u?u?d?u?u?d?u +?u?u?l?l?l?u?d?d +?d?d?s?l?d?s?d?d +?d?d?d?s?s?d?d?l +?s?u?s?d?d?d?d?d +?l?s?d?s?d?d?d?d +?d?d?d?d?s?l?d?s +?l?d?d?s?d?d?s?d +?u?d?d?s?d?d?s?d +?u?d?d?s?d?s?d?d +?s?l?d?s?d?d?d?d +?s?d?d?d?d?d?l?s +?d?d?d?s?d?l?s?d +?d?d?d?d?d?s?s?u +?s?s?d?d?d?d?d?u +?s?d?d?d?d?d?s?u +?l?s?d?d?s?d?d?d +?l?l?l?d?d?d?d?l?d +?s?u?d?d?d?d?d?d?d +?u?u?u?u?u?l?l?l +?u?s?l?l?s?l?l +?u?u?u?s?s?u?u +?u?u?u?s?u?u?s +?l?l?l?l?u?s?s +?u?l?l?l?u?s?s +?u?l?l?l?s?s?l +?l?l?l?l?s?s?u +?l?l?u?d?d?d?d?s +?l?d?l?d?d?d?l?s +?u?u?s?u?d?d?d?d +?u?l?s?u?d?d?d?d +?l?l?l?d?d?d?s?d?d +?d?s?l?l?l?d?d?d +?l?l?s?d?d?l?d?d +?l?l?d?d?d?l?s?d +?u?l?s?d?d?d?d?l +?s?d?l?d?l?d?l?d +?l?u?l?d?d?d?d?s +?d?d?s?d?d?u?u?u +?l?s?l?d?d?d?d?l +?s?d?d?d?d?u?l?l +?u?u?l?d?d?d?d?s +?l?d?l?d?l?d?l?d?s +?l?s?l?u?d?d?d?d +?s?l?d?l?d?l?d?d +?u?u?u?u?u?s?l +?s?l?l?u?l?l?l +?s?l?u?l?u?l?u +?l?l?u?l?s?l?l +?u?l?u?l?s?l?u +?s?u?u?u?l?l?l +?u?l?u?l?s?l?l +?u?l?l?s?u?u?l +?l?l?l?l?l?d?u?l +?u?l?l?l?l?s?d?d?d +?d?d?l?d?d?l?l?d?d +?d?d?l?d?l?d?l?d?d +?d?d?d?d?d?d?l?u?l +?l?l?d?d?d?d?d?d?u +?l?d?l?d?l?l?d?l?d +?l?l?l?s?s?s?d?d +?l?l?d?d?l?l?l?u +?u?l?l?l?d?d?u?l +?l?l?l?d?s?d?s?d +?l?l?s?d?s?d?d?d +?l?d?d?d?d?l?s?s +?d?d?d?d?u?l?s?s +?l?d?l?d?d?d?s?s +?d?d?l?l?d?d?s?s +?s?u?d?d?d?d?u?s +?l?l?d?l?d?l?d?d?d +?l?d?d?l?l?d?l?d?d +?u?l?l?l?l?u?d?d?d +?l?u?u?u?l?d?d?d +?d?u?d?u?d?u?u?u +?u?u?l?d?d?d?l?l +?l?l?d?d?d?l?u?l +?d?u?u?u?u?d?d?u +?s?u?l?l?l?l?l?s +?l?l?l?s?l?s?s +?l?l?s?l?s?l?s +?s?u?u?u?u?u?u?s +?l?l?l?l?l?s?l?s +?d?d?l?l?d?d?l?l?l +?l?l?d?d?u?u?s +?s?l?l?d?d?u?u +?l?u?l?u?d?s?d +?u?l?u?s?d?d?l +?d?d?s?l?l?u?u +?u?u?d?u?u?d?s +?l?s?u?u?d?l?d +?l?d?u?u?d?u?s +?l?d?u?l?d?l?s +?s?l?l?u?u?d?d +?s?l?d?u?l?d?l +?u?d?s?l?d?u?l +?l?d?u?l?d?u?s +?u?s?d?d?l?u?l +?u?u?u?l?s?d?d +?u?l?u?d?s?l?d +?u?s?d?d?u?l?l +?u?l?d?l?d?l?s +?l?l?d?l?s?d?l +?u?d?l?s?l?u?d +?l?d?l?l?d?s?u +?d?u?l?l?l?s?d +?s?d?u?u?u?d?u +?u?d?d?l?s?l?l +?u?u?d?u?d?u?s +?d?d?u?l?s?l?u +?u?d?s?d?u?u?u +?d?d?s?l?u?u?u +?u?l?d?d?s?u?u +?u?l?d?d?s?u?l +?u?s?u?l?u?d?d +?d?u?l?u?s?l?d +?d?l?l?l?d?u?s +?l?l?u?d?d?l?s +?l?u?s?l?u?d?d +?u?d?l?d?u?s?l +?u?l?u?s?l?d?d +?d?s?l?d?u?l?l +?s?l?l?l?u?d?d +?l?l?l?u?d?d?s +?u?s?u?u?l?d?d +?l?d?d?s?u?l?u +?u?u?d?u?s?u?d +?l?d?l?d?l?u?s +?u?d?d?u?l?u?s +?l?d?l?l?d?u?s +?u?d?d?l?l?s?u +?u?u?d?d?l?l?s +?d?u?l?l?s?u?d +?s?u?l?u?l?d?d +?u?d?u?d?l?l?s +?u?d?l?s?d?u?l +?u?s?u?u?d?u?d +?u?s?d?l?u?l?d +?d?d?u?u?u?s?u +?d?l?d?s?l?u?l +?u?d?u?s?l?l?d +?u?d?d?s?l?l?u +?l?d?d?l?s?l?u +?s?l?l?u?l?d?d +?s?u?d?l?l?d?u +?d?d?u?l?s?u?l +?u?d?l?l?d?u?s +?u?d?u?u?u?d?s +?u?u?l?d?d?s?u +?l?s?l?u?d?d?l +?s?u?l?d?d?l?l +?d?d?u?l?s?l?l +?d?u?u?s?u?u?d +?l?l?l?s?d?u?d +?d?d?l?u?l?l?s +?u?s?u?u?d?l?d +?u?s?l?l?d?l?d?d +?l?l?u?s?l?d?d +?l?d?d?l?u?u?s +?u?l?u?u?d?d?s +?d?u?l?l?l?d?s +?u?d?d?u?l?l?s +?u?d?u?d?u?s?l +?u?d?u?d?u?s?u +?d?u?l?u?l?d?s +?u?u?d?d?l?s?l +?u?d?s?l?l?d?u +?u?d?s?u?u?d?u +?u?d?l?s?l?d?l +?u?l?d?d?u?s?l +?d?u?s?l?l?d?u +?u?s?l?l?d?d?l +?u?l?d?u?l?d?s +?u?u?u?s?d?d?l +?u?s?u?d?u?u?d +?l?u?u?s?d?d?u +?u?l?d?l?u?d?s +?u?d?l?d?l?u?s +?d?l?l?d?s?l?u +?u?l?s?d?d?l?u +?s?u?d?u?u?d?u +?d?s?u?l?l?l?d +?l?s?u?u?d?d?l +?s?u?d?l?u?d?l +?d?l?s?d?l?u?l +?l?u?s?d?d?l?l +?u?s?d?u?d?l?l +?u?l?s?d?d?u?l +?u?l?d?l?l?d?s +?l?d?s?l?d?l?u +?s?d?l?d?l?u?l +?u?l?l?d?d?s?u +?s?d?d?u?u?u?l +?u?l?d?s?d?l?u +?u?d?l?d?u?l?s +?s?u?l?u?u?d?d +?d?d?u?l?u?l?s +?s?l?l?d?d?l?u +?u?s?l?d?l?d?u +?s?u?u?d?d?l?l +?u?u?s?u?d?u?d +?l?s?u?d?d?u?l +?u?l?d?l?s?l?d +?u?d?u?u?s?d?l +?l?l?s?l?d?u?d +?u?s?d?l?l?l?d +?d?u?d?l?l?l?s +?d?l?d?l?l?u?s +?d?d?d?l?l?s?l?l +?u?u?l?d?d?l?s +?u?u?s?d?u?u?d +?d?u?u?s?u?d?u +?d?u?l?s?l?d?l +?l?d?l?l?l?l?d?s +?u?d?u?d?s?u?u +?l?d?l?u?d?l?s +?s?u?l?l?u?d?d +?u?s?l?d?l?d?l?d +?u?s?d?d?l?l?l +?d?u?l?d?u?s?l +?d?d?s?u?l?l?u +?u?d?d?l?l?u?s +?u?s?u?d?l?d?l +?s?d?d?u?u?l?l +?u?l?d?s?l?u?d +?l?d?l?u?l?s?d +?u?u?d?u?s?d?u +?u?s?u?d?u?d?l +?s?d?d?l?l?u?u +?l?s?l?d?d?l?u +?u?u?s?d?l?u?d +?u?d?u?s?d?u?u +?u?d?l?l?d?s?u +?u?s?l?l?d?d?u +?u?d?d?l?u?l?s +?u?l?s?u?d?u?d +?u?s?u?l?d?u?d +?u?s?d?l?d?l?l +?u?d?l?d?s?l?l +?s?d?u?d?l?l?l +?s?u?l?d?l?l?d +?l?s?d?d?d?l?l?l +?d?s?l?l?l?d?u +?d?u?l?l?u?d?s +?l?d?l?u?l?d?s +?l?s?l?d?u?u?d +?u?l?d?l?u?s?d +?d?d?u?l?l?s?u +?s?u?u?l?l?d?d +?u?l?u?d?l?s?d +?d?u?l?u?d?l?s +?l?l?u?u?d?s?d +?s?l?l?u?d?l?d +?u?l?u?d?s?d?l +?u?l?u?d?s?d?u +?s?l?l?l?d?d?u +?d?l?d?l?u?s?l +?u?u?u?d?u?s?d +?d?d?l?u?l?u?s +?d?l?l?s?l?d?l +?d?u?s?u?d?u?l +?d?d?s?u?l?u?l +?l?u?s?d?d?u?u +?l?s?u?d?l?d?l +?d?d?u?s?l?l?u +?l?l?d?d?s?u?l +?l?d?l?u?d?s?l +?l?d?u?l?l?s?d +?l?s?u?l?d?l?d +?l?l?d?s?l?l?d?d +?d?d?u?u?l?l?s +?l?l?d?d?l?u?s +?u?d?l?l?s?d?u +?u?d?u?l?d?l?s +?u?d?d?u?s?l?l +?l?u?l?d?d?s?l +?d?d?l?u?u?u?s +?l?d?s?l?l?d?u +?s?u?l?d?l?d?l +?u?d?u?u?u?s?d +?d?s?l?l?u?u?d +?s?l?d?l?d?l?d?l +?u?d?d?l?s?u?u +?s?l?u?u?u?d?d +?l?s?l?d?l?d?u +?d?d?l?l?u?u?s +?l?l?d?u?s?d?l +?l?u?u?s?u?d?d +?d?d?u?l?l?s?l +?u?l?s?u?d?d?l +?d?u?u?u?s?u?d +?d?l?s?l?l?d?u +?u?d?l?s?d?l?u +?u?l?l?d?d?u?s +?l?s?u?u?u?d?d +?u?l?u?l?u?l?d?d?d +?u?s?l?l?l?l?l?l +?u?l?l?s?l?l?l?d +?u?l?d?d?d?u?l?d +?u?d?l?u?d?u?d?d +?d?d?l?l?u?l?d?d +?u?d?l?l?d?d?d?l +?u?l?d?d?u?d?d?l +?l?l?l?d?d?u?d?d +?d?u?l?d?u?l?d?d +?d?d?u?l?d?d?l?l +?d?d?u?l?d?d?l?u +?d?l?d?l?u?d?l?d +?u?l?l?d?u?d?d?d +?d?d?d?u?u?l?l?d +?l?l?d?d?d?d?l?u +?d?u?d?d?u?d?u?u +?u?d?d?d?d?l?u?u +?d?l?d?l?d?l?u?d +?d?u?d?d?d?u?u?u +?d?u?l?d?d?u?l?d +?l?u?d?l?u?d?d?d +?d?l?d?l?u?l?d?d +?u?l?u?d?d?d?u?d +?l?d?d?d?d?u?u?u +?d?u?u?u?d?u?d?d +?u?d?u?d?d?d?l?l +?u?u?l?d?d?d?d?l +?u?d?l?l?d?u?d?d +?d?u?d?l?l?l?d?d +?l?d?d?l?l?d?d?u +?u?d?l?d?l?d?d?u +?u?u?l?d?d?l?d?d +?d?d?u?d?d?l?l?l +?d?d?d?l?l?d?u?u +?l?u?u?d?d?d?d?l +?d?l?l?d?d?d?l?u +?l?d?d?u?l?d?d?u +?u?l?u?d?d?d?l?d +?l?d?u?d?u?d?l?d +?d?u?u?d?u?d?d?u +?u?d?d?d?l?d?l?l +?l?u?d?d?d?d?l?l +?d?d?d?d?d?d?u?d?d?d +?l?s?s?s?s?d?d +?d?d?s?s?s?s?l +?s?s?d?d?s?l?s +?s?l?s?s?d?d?s +?s?s?d?d?l?s?s +?s?s?d?d?s?s?l +?s?s?d?d?s?s?u +?s?d?d?s?l?s?s +?u?l?l?d?u?u?l +?u?u?l?u?l?l?d +?u?u?l?u?d?l?l +?u?u?u?u?l?d?u +?u?d?u?u?u?u?l +?l?l?u?d?l?l?u +?u?u?d?u?d?u?u?u +?u?u?l?u?l?u?d +?l?d?l?u?l?u?u +?l?u?u?u?u?d?l +?u?d?u?u?l?u?u +?l?u?d?l?u?u?u +?l?l?d?u?u?u?l +?l?u?l?d?u?l?l +?l?d?u?u?u?l?l +?l?d?u?l?l?u?l +?l?d?u?l?l?u?u +?l?u?u?d?l?u?u +?l?d?l?l?u?l?u +?l?l?l?l?d?d?l?u +?d?u?u?u?u?u?l +?l?l?u?l?l?u?d?d +?u?l?u?d?l?u?u +?l?l?d?l?u?u?u +?d?u?u?l?l?l?u +?d?u?l?u?u?u?u +?l?l?u?l?u?l?d +?l?l?u?l?l?d?d?l +?l?u?u?l?u?l?d +?d?l?u?l?l?u?u +?d?l?u?l?l?u?l +?u?l?u?u?u?d?l +?d?u?l?u?l?l?u +?l?l?l?u?d?u?l +?u?u?d?l?u?l?u +?u?d?u?u?d?u?u?u +?u?u?l?l?d?u?l +?u?u?l?l?d?u?u +?d?u?u?u?l?l?u +?l?l?u?u?l?u?d +?l?l?u?d?l?u?l +?u?l?u?u?u?d?u +?u?l?l?d?l?u?u +?u?l?l?l?d?d?u?u +?u?l?u?u?d?l?l +?u?u?u?u?l?u?d +?u?u?d?l?l?u?u +?u?u?d?l?l?u?l +?l?d?l?u?u?u?u +?u?u?l?u?l?d?l +?d?d?l?l?u?l?l?l +?l?u?l?d?u?u?u +?u?u?l?d?u?l?l +?l?l?u?u?l?d?u +?d?l?u?l?u?l?u +?u?l?u?d?u?u?u +?l?l?l?u?l?d?u +?l?u?l?d?l?u?u +?l?u?l?d?l?u?l +?l?u?l?u?l?d?u +?l?d?u?l?u?l?u +?l?d?u?l?u?l?l +?l?l?l?d?u?u?l +?l?l?d?u?l?l?u +?l?u?u?l?d?l?l +?u?l?u?l?l?d?u +?l?u?u?d?l?l?l +?u?d?l?l?u?u?u +?d?u?u?u?u?u?u?u?u +?d?s?d?s?d?s?d?l +?d?d?l?l?l?d?d?l?l +?d?l?l?l?l?l?s?d +?l?d?d?l?l?l?l?s +?d?d?l?l?s?l?l?l +?u?u?u?u?d?d?d?d?s +?d?d?s?d?d?s?d?d?u +?u?u?u?u?u?l?l?d +?s?s?l?l?l?s?d +?s?s?s?d?l?l?l +?s?l?s?l?s?l?d +?s?l?l?l?d?s?s +?s?l?s?l?l?s?d +?d?s?l?s?l?l?s +?l?s?l?d?l?s?s +?l?s?s?d?l?s?l +?s?l?s?s?l?l?d +?l?s?l?d?s?l?s +?l?s?l?d?s?s?l +?l?s?l?l?d?s?s +?d?s?d?s?d?l?l?l +?s?l?l?l?d?d?d?d?s +?d?l?d?l?d?l?s?s +?l?l?d?d?d?d?d?l?d +?d?d?u?d?d?l?d?d?u +?l?l?s?s?s?s?d +?s?u?s?u?s?u?s +?s?s?s?s?u?u?u +?s?s?u?l?l?s?s +?s?s?l?d?l?s?s +?l?s?l?d?s?s?s +?l?u?l?l?l?u?u +?l?l?l?u?u?u?l +?l?l?u?u?l?u?l +?l?l?l?l?l?d?u?u +?u?u?u?l?l?u?l +?u?u?u?u?u?u?u?u?d?d +?u?u?u?u?u?u?s?d?d +?u?l?l?l?u?l?l?d?d +?u?s?u?s?l?l?l +?s?l?u?l?l?l?s +?l?l?s?s?s?d?d?d +?d?d?l?l?u?u?u?u +?u?l?u?l?u?u?d?d +?d?u?l?l?u?l?l?d +?d?d?u?l?u?l?u?l +?l?l?l?u?u?l?d?d +?d?d?d?d?d?d?l?l?l?d +?l?d?l?d?l?d?l?l?d +?l?d?d?l?d?l?d?d?l +?l?l?l?l?l?d?d?s?d +?l?d?d?s?l?l?l?l +?u?u?u?u?u?d?s?d +?l?l?l?l?d?u?u?u +?l?l?l?s?l?d?d?d?d +?u?s?l?s?u?s?l +?l?l?s?s?l?l?s +?d?d?d?d?d?d?d?d?l?u +?u?s?s?l?l?d?l +?s?u?u?u?d?u?s +?u?s?s?l?l?l?d +?d?l?s?l?s?l?l +?d?s?l?l?l?s?l +?u?d?s?u?u?u?s +?s?d?l?l?s?l?l +?s?u?l?u?l?s?d +?s?l?l?d?l?s?l +?s?l?l?l?s?l?d +?u?d?l?s?l?l?s +?u?s?s?l?d?l?l +?s?u?l?l?l?s?d +?l?l?s?s?l?l?d?d +?l?l?s?s?l?d?l +?l?l?s?l?d?s?l +?u?s?d?l?l?l?s +?s?d?s?u?u?u?u +?u?d?l?l?l?s?s +?u?l?d?s?l?l?s +?s?d?l?s?l?l?l +?u?u?s?d?s?u?u +?d?l?l?s?l?l?s +?s?l?l?s?d?l?l +?u?l?u?l?s?s?d +?l?s?u?s?l?l?d +?u?s?u?l?l?s?d +?s?s?d?d?l?l?l?l +?u?u?l?l?s?s?d?d +?u?l?s?u?l?s?d +?l?l?s?l?s?l?d +?u?s?l?l?l?s?d +?u?u?u?s?u?s?d +?s?s?l?l?l?d?l +?u?u?u?u?u?u?u?d?d?d +?l?l?l?d?d?l?l?l?d?d +?l?d?d?d?d?d?d?s?s +?d?d?d?d?d?d?l?s?s +?u?l?l?u?l?l?l?d?d +?l?l?s?l?d?l?d?d +?d?d?d?u?u?u?u?s +?l?l?d?l?d?l?d?s +?l?l?l?d?l?d?d?s +?l?l?l?d?d?d?d?l?l?l +?s?s?s?l?s?s?s +?l?s?l?l?l?l?s?d +?u?d?d?d?d?u?d?d?d +?u?d?l?d?d?d?d?d?d +?d?l?d?d?d?d?l?d?d +?u?d?l?l?l?d?d?d?d +?u?l?l?u?l?d?d?d?d +?l?d?d?d?u?l?l?l +?u?d?d?d?l?u?l?l +?u?d?l?l?d?d?l?l +?u?d?l?d?u?d?l?l +?u?d?u?u?u?d?d?u +?d?u?u?u?u?d?u?d +?u?u?l?u?u?d?d?d +?u?d?l?l?l?u?d?d +?u?u?d?u?d?u?d?u +?l?u?u?l?l?d?d?d +?d?d?d?l?u?u?u?u +?u?d?d?l?l?l?d?u +?u?u?u?l?u?d?d?d +?u?d?l?l?d?u?d?l +?d?u?d?d?u?u?u?u +?d?u?l?l?l?u?d?d +?l?d?d?d?l?l?l?u +?u?d?l?u?l?l?d?d +?d?d?u?u?u?u?d?u +?u?d?d?l?d?l?l?l +?l?l?l?l?l?u?l?l +?u?l?s?l?l?l?u +?l?l?l?l?s?u?l +?l?s?l?l?l?u?l +?l?l?s?l?l?l?u +?l?l?u?l?l?s?l +?s?l?l?l?u?l?l +?u?l?l?u?u?u?s +?u?s?u?l?u?l?u +?u?l?l?u?l?u?s +?s?l?l?l?l?u?l +?l?s?u?u?u?u?u +?l?l?u?u?l?l?s +?l?u?u?s?u?u?u +?l?s?l?l?l?l?s?l +?l?d?l?d?l?l?l?s +?u?l?l?s?d?d?d?d?d +?d?d?d?d?d?d?s?l?l?l +?l?l?u?l?l?l?l?l +?d?d?d?s?d?d?d?l?l +?d?d?d?d?d?d?s?l?d +?d?d?d?d?d?s?d?d?l +?d?d?l?l?d?d?d?d?s +?d?d?d?d?d?d?l?d?s +?d?d?d?d?d?d?u?s?u +?u?u?u?u?u?d?d?l +?l?d?l?l?d?l?l?d?l +?u?l?l?l?l?l?u?l +?d?l?l?l?s?l?l?l +?l?l?s?d?d?d?d?d?d?d +?l?l?l?s?s?l?l?l +?l?l?s?l?s?d?d?d +?s?u?u?u?d?d?d?s +?u?d?d?d?d?u?l?d +?d?d?u?d?d?d?l?l +?d?l?d?d?u?d?d?u +?d?u?d?l?d?u?d?d +?d?l?d?d?d?l?u?d +?d?d?l?d?d?l?u?d +?l?d?u?d?d?u?d?d +?l?u?d?d?l?d?d?d +?l?d?d?d?u?u?d?d +?u?d?l?d?d?d?u?d +?d?d?d?u?d?l?d?l +?d?l?d?d?d?u?l?d +?u?l?d?u?d?d?d?d +?d?d?d?l?u?u?d?d +?l?d?l?d?u?d?d?d +?l?d?d?l?d?u?d?d +?d?l?d?d?d?u?u?d +?l?u?d?l?d?d?d?d +?d?d?u?d?u?d?l?d +?d?d?u?d?d?u?d?l +?d?l?d?u?l?d?d?d +?l?u?d?d?u?d?d?d +?d?u?d?d?l?d?d?u +?d?d?d?d?u?u?d?l +?d?d?d?u?u?l?d?d +?d?d?d?u?l?d?d?u +?d?d?d?u?l?d?l?d +?d?d?l?d?u?l?d?d +?l?d?d?d?d?d?l?u +?d?d?d?l?d?u?l?d +?d?d?u?d?l?d?d?u +?u?d?d?l?d?d?d?l +?d?l?u?u?d?d?d?d +?l?l?d?d?d?u?d?d +?d?l?d?u?d?d?d?l +?l?u?d?d?d?u?d?d +?d?l?l?d?d?d?u?d +?l?d?u?d?u?d?d?d +?u?d?l?d?d?d?d?u +?d?d?d?d?l?d?l?u +?d?d?d?d?l?u?d?l +?d?l?l?d?d?d?d?u +?u?d?d?u?d?d?d?l +?d?u?d?u?l?d?d?d +?u?d?u?d?d?d?d?u +?d?d?l?l?d?u?d?d +?d?d?d?l?l?u?d?d +?u?u?d?d?d?u?d?d?d +?l?d?d?u?d?d?d?l +?d?d?u?d?u?d?u?d +?d?d?u?u?d?l?d?d +?d?u?d?d?d?d?u?u +?d?u?u?d?d?d?u?d +?d?d?l?d?l?d?u?d +?u?l?d?d?d?d?l?d +?l?d?d?d?d?u?u?d +?d?l?d?u?u?d?d?d +?l?d?u?d?d?d?d?u +?l?d?u?d?d?d?d?l +?d?u?d?l?d?l?d?d +?d?l?l?u?d?d?d?d +?u?d?d?d?d?l?u?d +?u?d?l?u?d?d?d?d +?d?d?l?d?u?d?d?l +?d?d?d?u?d?u?u?d +?d?d?u?d?l?d?l?d +?l?d?d?d?u?d?d?u +?d?u?u?d?d?d?l?d +?u?d?d?d?d?d?u?l +?d?l?u?d?u?d?d?d +?d?d?u?d?d?u?u?d +?d?d?d?u?d?l?l?d +?d?l?d?d?l?d?u?d +?d?l?d?u?d?l?d?d +?u?d?l?d?d?d?d?l +?d?l?d?d?l?d?d?u +?d?l?u?d?d?l?d?d +?d?d?l?l?u?d?d?d +?d?u?l?d?d?d?l?d +?l?d?d?d?u?d?d?l +?d?u?d?l?d?d?d?l +?u?d?d?d?d?d?l?u +?d?d?u?d?d?l?l?d +?d?u?d?l?d?d?u?d +?d?u?d?u?d?d?d?l +?d?d?d?l?d?l?u?d +?d?d?u?l?d?u?d?d +?l?d?u?d?l?d?d?d +?l?d?d?u?l?d?d?d +?u?d?d?d?u?d?u?d +?u?d?d?d?d?u?d?l +?d?d?l?u?l?d?d?d +?d?d?u?d?l?d?d?l +?l?d?d?d?d?u?d?u +?l?d?l?d?d?u?d?d +?l?d?d?l?u?d?d?d +?l?d?d?u?d?u?d?d +?l?d?l?d?d?d?d?u +?d?l?d?d?l?u?d?d +?d?l?u?d?d?d?d?u +?d?u?d?d?d?u?d?u +?u?d?l?d?d?d?l?d +?d?u?l?d?l?d?d?d +?s?u?l?l?l?l?l?d +?l?l?l?l?l?l?u?l +?u?u?u?u?d?d?s?s +?d?u?l?l?l?l?l?s +?s?d?d?s?s?d?d?d +?s?d?d?s?d?s?d?d +?d?d?d?d?s?d?s?s +?d?d?d?s?d?d?s?s +?d?s?d?d?s?d?s?d +?d?d?d?d?s?s?s?d +?s?d?d?d?d?s?s?d +?d?d?s?d?s?s?d?d +?s?d?s?s?d?d?d?d +?l?l?d?d?d?l?l?d?d?d +?l?l?l?d?d?d?l?l?d +?l?l?l?d?d?d?d?d?d?s +?d?d?d?d?d?s?d?s?d +?u?l?s?l?l?l?l?l +?u?u?u?d?u?d?u?u +?d?u?l?l?d?u?l?l +?l?u?l?u?l?l?d?d +?s?d?d?d?d?d?d?d?d?d?d +?l?l?l?l?l?d?s?d?d +?l?s?s?l?s?l?l +?s?s?s?u?u?u?u +?d?d?d?l?l?d?d?d?d?d +?d?d?d?d?d?d?d?l?l?l?l +?l?d?s?d?d?s?l?d +?u?l?s?d?d?s?d?d +?l?s?d?d?s?l?d?d +?d?d?s?u?u?s?d?d +?d?d?d?d?s?s?u?u +?u?u?s?d?d?d?d?s +?u?l?s?d?d?d?d?s +?d?d?s?s?l?l?d?d +?d?s?d?d?s?d?d?l?l +?d?s?d?s?d?d?u?u +?d?d?l?s?d?d?l?s +?l?d?s?l?d?s?d?d +?s?s?s?d?s?s?s +?u?l?l?l?l?u?u?u +?u?s?l?s?l?l?l +?u?s?l?l?l?s?l +?u?l?s?l?l?l?s +?u?l?l?s?l?s?l +?s?u?u?u?u?s?u +?u?s?s?u?u?u?u +?u?u?u?s?u?u?u?d +?d?d?d?d?d?d?u?l?s +?l?l?d?l?l?d?l?s +?l?d?l?l?l?d?l?s +?l?l?l?l?l?d?l?u +?u?u?d?l?l?l?l?l +?d?d?d?d?l?s?s?s +?d?d?d?d?u?u?d?d?d?d +?l?l?s?l?d?d?d?l +?d?s?l?l?l?l?d?d +?u?l?l?u?s?d?d?d +?d?l?l?l?l?d?s?d +?u?s?l?d?l?l?d?d +?u?s?u?l?l?d?d?d +?d?d?d?d?d?d?s?l?s +?d?d?d?u?u?u?u?d?d +?l?l?l?l?d?d?d?s?d +?s?u?d?d?l?l?s +?u?s?l?u?s?d?d +?s?s?u?u?l?d?d +?d?u?s?u?s?u?d +?u?d?d?u?l?s?s +?u?d?s?l?d?l?s +?u?d?u?s?u?d?s +?l?d?l?s?s?l?d +?u?s?u?d?u?d?s +?d?u?l?u?s?d?s +?l?u?d?d?u?s?s +?l?l?d?s?s?l?d +?s?d?d?l?u?u?s +?s?s?l?d?d?l?l +?u?s?d?s?l?d?l +?s?u?d?l?d?s?l +?s?d?l?l?s?l?d +?u?s?d?l?s?d?u +?d?u?s?s?l?d?l +?d?u?s?l?s?d?l +?u?d?l?l?s?s?d +?s?d?u?l?l?d?s +?d?s?d?l?s?l?l +?s?u?s?l?l?d?d +?d?l?s?l?s?d?u +?l?s?d?s?l?l?d +?l?d?d?s?l?l?s +?s?l?u?s?l?d?d +?u?l?d?d?l?s?s +?u?u?d?d?l?s?s +?l?d?d?u?s?s?l +?s?d?d?l?s?u?l +?l?d?d?s?l?s?l +?l?l?d?d?s?l?s +?s?s?d?d?u?l?u +?s?s?d?d?u?l?l +?s?d?l?l?s?d?l +?u?d?s?s?d?u?u +?s?u?s?u?u?d?d +?u?l?l?l?s?s?d?d +?u?d?s?u?s?l?d +?l?s?s?d?l?d?u +?u?d?u?u?d?s?s +?u?l?s?u?s?d?d +?l?d?u?d?l?s?s +?u?s?u?d?d?s?u +?u?d?d?s?l?l?s +?s?l?d?s?l?l?d +?u?u?l?s?d?s?d +?d?l?s?s?l?u?d +?s?u?d?l?l?d?s +?u?l?d?s?s?d?u +?u?u?s?u?s?d?d +?s?u?l?d?d?l?s +?u?s?l?s?d?l?d +?l?s?d?d?l?s?l +?s?d?l?d?l?d?l?s +?s?s?l?d?l?l?d +?l?l?s?d?l?d?s +?l?s?d?l?u?d?s +?d?d?s?u?u?s?l +?s?u?l?d?l?d?s +?u?s?d?u?d?u?s +?l?u?l?s?d?s?d +?u?s?l?s?l?d?d +?u?u?s?d?s?l?d +?l?d?d?s?s?l?l +?l?d?s?l?l?s?d +?u?s?l?l?d?d?s +?s?s?l?l?u?d?d +?l?d?l?s?s?d?l +?l?d?l?s?s?d?u +?u?s?u?d?s?d?u +?l?d?s?s?d?l?l +?d?l?s?u?s?l?d +?u?d?d?s?s?l?l +?d?l?s?s?d?l?l +?s?s?u?d?d?l?l +?d?l?u?d?l?s?s +?u?l?d?s?s?d?l +?u?s?u?l?s?d?d +?u?u?l?d?d?s?s +?u?d?d?s?s?u?u +?l?l?s?u?s?d?d +?u?s?l?l?d?s?d +?u?s?s?u?d?d?u +?u?s?l?d?l?d?s +?s?d?l?d?l?s?l +?s?s?l?u?u?d?d +?l?d?l?s?l?s?d +?l?l?d?d?u?s?s +?d?u?l?d?l?s?s +?u?s?l?d?d?u?s +?s?u?d?d?l?u?s +?d?s?s?u?l?l?d +?l?l?d?s?l?d?s +?s?d?d?u?s?u?l +?s?d?d?u?s?u?u +?u?s?d?l?u?d?s +?u?s?d?d?l?l?s +?u?d?s?u?l?d?s +?s?d?d?l?l?s?l +?d?d?s?u?l?l?s +?s?u?d?l?s?u?d +?d?l?s?d?l?s?l +?s?l?u?l?s?d?d +?s?d?d?s?u?l?u +?d?s?d?l?l?s?l +?s?s?d?l?l?d?l +?u?s?s?l?u?d?d +?d?l?l?s?d?s?l +?u?s?d?d?u?u?s +?u?s?d?l?d?l?s +?l?s?d?s?l?d?l +?d?d?u?l?u?s?s +?s?l?l?d?l?s?d +?l?d?l?l?s?d?s +?d?d?u?l?l?s?s +?d?d?l?s?l?l?s +?d?l?l?l?s?s?d +?d?d?s?l?s?u?u +?s?d?d?u?l?l?s +?d?l?s?u?d?u?s +?d?l?l?s?s?l?d +?d?s?l?s?d?l?l +?d?s?l?s?l?l?d +?s?l?s?l?d?d?l +?s?u?u?s?l?d?d +?u?u?s?u?d?d?s +?l?l?d?d?s?u?s +?l?d?l?u?d?s?s +?d?l?u?d?s?l?s +?d?s?l?l?s?d?l +?s?d?s?l?l?d?l +?l?l?d?s?s?d?l +?l?s?l?d?u?s?d +?s?l?d?d?l?s?l +?d?s?l?d?s?u?u +?u?s?d?d?l?u?s +?d?s?d?l?l?l?s +?d?l?s?l?l?d?s +?s?s?u?d?u?u?d +?s?d?u?l?d?l?s +?u?l?d?s?u?d?s +?l?u?l?l?l?l?l?l +?l?l?l?l?l?d?l?l?d +?l?d?l?s?l?l?l?l +?d?d?u?l?l?l?l?l?l +?u?u?u?l?l?u?d?d +?l?u?u?l?l?l?d?d +?u?u?l?l?d?d?l?l +?d?u?u?u?l?l?l?d +?l?d?s?l?l?d?d?d +?d?d?d?d?s?u?l?u +?l?d?s?d?l?l?d?d +?u?l?l?d?s?d?d?d +?d?s?d?l?l?l?d?d +?d?l?d?l?s?d?l?d +?d?d?d?d?u?s?u?u +?u?s?l?d?l?d?d?d +?u?u?s?l?d?d?d?d +?d?d?u?u?u?s?d?d +?u?u?s?d?d?d?d?l +?l?s?d?l?l?d?d?d +?d?l?l?l?d?d?s?d +?d?d?s?u?u?u?d?d +?l?d?d?d?l?d?l?s +?l?d?d?d?s?d?l?l +?u?d?d?d?d?l?l?s +?u?s?l?u?d?d?d?d +?l?l?d?d?d?d?u?s +?d?l?l?l?d?d?d?s +?d?d?l?s?d?d?l?l +?l?s?l?d?d?l?d?d +?d?d?u?l?s?l?d?d +?d?d?d?u?l?l?s?d +?u?u?l?s?d?d?d?d +?s?l?d?l?l?d?d?d +?s?l?d?d?l?d?d?l +?l?d?d?l?l?s?d?d +?d?d?d?d?l?d?l?d?l +?d?l?d?d?l?l?d?d?d +?l?d?d?u?d?d?l?d?d +?d?d?d?d?l?d?l?l?d +?d?l?l?d?d?l?d?d?d +?s?s?s?s?d?d?s +?s?d?s?d?s?s?s +?s?s?d?d?s?s?s +?s?s?d?s?s?d?s +?d?l?l?l?u?l?l?l +?l?l?l?u?d?l?l?l +?l?l?u?s?d?u?l +?s?l?u?u?l?d?l +?l?u?l?l?u?d?s +?l?d?l?l?s?u?u +?l?d?l?l?s?u?l +?u?l?l?l?s?l?d?d +?l?l?l?u?u?s?d +?s?u?u?u?d?u?u +?d?l?l?l?l?s?l?l +?l?l?l?l?d?s?u +?l?u?l?l?d?l?s +?d?s?l?u?u?u?u +?u?l?l?s?d?l?u +?u?u?u?u?s?d?u +?l?u?l?l?l?d?s +?l?l?d?l?l?l?s?d +?l?l?d?u?u?s?l +?l?d?l?u?l?u?s +?u?l?l?l?s?d?u +?l?u?l?u?l?s?d +?u?l?l?l?d?u?s +?l?l?d?s?u?u?u +?s?u?d?u?u?u?u +?u?s?l?u?l?d?l +?u?l?d?s?l?l?u +?l?l?d?u?l?l?s +?l?d?s?u?l?l?l +?d?s?l?l?u?l?l +?l?s?l?u?l?d?l +?l?l?s?u?l?l?d +?l?l?l?u?d?l?s +?l?l?s?d?u?u?u +?d?u?u?s?u?u?u +?u?s?l?d?l?u?u +?l?l?u?l?l?d?s +?l?s?l?l?d?l?u +?l?d?u?l?s?l?l +?s?d?u?u?u?l?l +?l?d?l?u?s?l?l +?l?l?l?s?u?u?d +?s?l?l?l?l?d?u +?u?l?s?l?d?l?u +?u?s?u?u?l?l?d +?l?l?s?u?l?d?l +?l?u?l?l?s?l?d +?s?d?l?u?u?u?u +?l?d?s?l?l?l?u +?l?d?l?l?u?s?l +?l?u?u?u?u?s?d +?u?s?l?l?d?l?u +?u?l?d?s?u?l?l +?d?u?l?l?l?s?u +?l?l?l?d?s?l?u +?u?s?u?l?d?l?l +?l?l?d?u?s?l?l +?l?d?l?l?s?l?d?l +?l?u?s?l?d?l?l +?d?l?l?s?u?l?l +?u?l?d?l?l?u?s +?l?s?u?d?l?l?l +?u?u?u?d?u?s?u +?l?l?s?d?u?l?l +?l?l?d?l?l?s?u +?l?l?l?u?s?l?d +?l?s?l?l?l?u?d +?d?l?l?l?u?s?l +?l?d?u?s?l?l?u +?d?l?l?s?l?l?l?l +?u?l?u?d?s?l?u +?u?l?d?s?u?u?u +?s?u?u?u?d?l?l +?d?l?l?l?l?d?l?l?l +?u?l?l?l?l?l?u?d?d +?u?l?d?u?l?l?d?d +?u?d?l?l?u?d?d?l +?d?u?u?u?d?d?u?u +?u?l?d?l?l?u?d?d +?u?u?d?u?u?d?d?u +?d?d?d?u?l?l?u?l +?u?d?l?l?l?d?d?u +?u?d?u?d?u?d?l?l +?u?l?l?u?d?d?d?l +?u?d?u?u?d?d?u?u +?u?d?u?d?d?u?u?u +?l?l?d?l?d?l?d?l?d +?l?d?l?d?l?d?u?u +?u?l?l?d?d?l?d?l +?u?d?d?d?l?l?l?u +?d?u?u?u?d?u?d?u +?l?d?l?l?l?u?d?d +?u?l?d?d?u?l?l?d +?u?u?u?d?d?l?l?d +?u?d?d?d?u?u?l?l +?u?l?l?d?l?d?d?l +?d?u?l?u?l?u?d?d +?l?d?l?l?l?d?l?d?d +?l?u?l?l?u?d?d?d +?u?d?l?l?d?d?u?l +?l?l?d?d?u?l?l?d +?u?u?d?d?u?u?d?u +?u?l?l?l?l?l?l?d?d?d +?d?u?u?u?u?d?d?d?d +?l?d?l?d?d?l?l?d?d +?d?d?l?l?d?d?d?l?l +?l?s?l?l?s?l?d?d +?l?l?d?d?l?l?s?s +?d?d?s?s?l?l?l?l +?u?u?l?l?l?l?l?d?d +?d?d?d?d?u?d?d?d?d?d +?s?l?l?l?d?d?d?d?d +?l?s?l?s?d?s?s +?u?l?l?l?l?l?l?l?d?d +?l?l?l?l?d?d?d?s?s +?u?u?l?u?l?l?u +?l?u?u?l?l?u?l +?l?u?l?u?u?l?u +?l?u?l?u?l?u?u +?u?l?u?u?u?l?u +?u?u?l?l?u?l?u +?u?u?l?u?u?l?l +?u?u?l?l?l?u?l +?l?u?l?l?u?u?l +?l?l?u?u?u?u?l +?l?l?u?l?l?u?u +?u?l?l?l?l?l?d?d?s +?d?l?d?l?d?l?d?l?l +?s?l?d?d?d?d?d?d?s +?d?d?d?d?d?d?d?s?l?l +?s?s?s?s?s?l?d +?l?l?s?s?s?s?s +?u?s?u?s?u?s?d?d +?u?u?u?u?u?l?s +?u?l?u?l?u?s?u +?u?u?u?s?u?l?l +?l?l?s?l?u?l?l +?l?u?u?s?l?u?u +?u?u?l?l?l?s?l +?u?l?s?l?u?l?u +?u?l?l?s?u?u?u +?u?l?s?u?l?u?l +?l?l?u?u?u?u?s +?l?l?d?s?d?d?s?d?d +?l?l?l?l?l?l?d?s?d +?l?l?l?s?s?l?s +?d?d?d?l?l?l?l?l?s +?d?u?l?l?d?l?l?l +?d?u?l?l?l?d?l?l +?d?u?l?u?l?u?l?d +?l?l?l?u?d?d?l?l +?l?l?l?d?l?l?l?u +?l?u?l?d?d?l?l?l +?d?l?l?l?d?l?l?s +?l?l?l?d?d?s?d?d?d +?l?l?l?d?d?d?d?s?d +?l?s?s?l?l?l?d?d +?d?s?d?s?l?l?l?l +?l?l?d?d?l?d?l?d?d +?d?d?d?d?l?l?d?l?l +?u?l?l?s?s?s?s +?s?s?l?s?s?l?l +?l?d?l?d?l?l?l?d?d +?l?l?l?u?u?d?d?d?d +?l?l?d?l?l?d?l?d?d +?l?l?l?l?l?l?s?u +?s?d?s?l?s?l?l +?s?l?s?l?l?d?s +?u?s?l?s?u?s?d +?l?l?s?s?s?d?l +?l?s?s?l?s?l?d +?s?l?l?d?l?s?s +?s?l?l?s?l?s?d +?s?d?s?l?l?l?s +?l?s?s?l?d?l?s +?d?u?l?l?s?s?s +?l?s?l?l?s?s?d +?l?d?s?l?l?s?s +?u?u?u?s?d?s?s +?u?l?l?s?s?s?d +?s?l?d?l?s?l?s +?u?u?d?u?s?s?s +?s?s?l?l?s?l?d +?l?s?l?l?l?l?d?d?d +?d?d?d?d?d?l?l?l?d?d +?s?u?u?u?d?l?l?l +?l?l?l?l?s?l?d?l +?l?l?l?l?s?s?s?s +?l?l?l?l?s?s?l?l +?d?d?d?s?d?d?d?d?u +?d?d?d?l?s?d?d?d?d +?d?d?d?d?d?u?d?d?s +?d?d?d?d?d?d?u?d?s +?l?d?d?d?d?s?d?d?d +?u?u?u?s?d?d?d?d?d +?s?d?d?d?u?l?l?l +?l?d?s?l?l?l?d?d +?l?d?l?s?l?d?l?d +?l?s?l?d?l?l?d?d +?l?d?l?d?l?s?l?d +?l?l?l?u?d?d?d?s +?l?l?d?d?l?l?s?d +?l?l?d?d?s?l?l?d +?s?l?l?l?d?l?d?d +?s?u?l?l?l?s?u +?l?u?u?u?u?s?s +?u?u?l?l?l?l?d?d?d +?u?u?u?u?s?s?d?d +?u?u?u?s?d?l?l?l +?l?l?d?d?d?d?d?d?d?l +?d?u?l?l?u?l?l?l +?d?u?l?l?l?d?d?d?d +?d?l?l?l?d?l?l?l?l +?d?d?d?d?s?s?d?d?d +?d?d?s?s?d?d?d?d?d +?d?d?d?s?d?d?d?s?l +?d?s?d?s?d?d?d?d?d +?l?l?l?l?u?s?d?d +?s?d?l?l?l?l?l?d +?u?u?u?u?s?u?d?d +?d?l?l?l?l?l?d?d?d?d +?u?d?l?d?l?d?d?d?d +?l?d?d?d?d?d?l?d?l +?l?d?d?d?d?d?l?l?d +?d?d?d?d?d?l?d?l?l +?d?d?d?l?l?d?l?d?d +?d?d?l?d?l?d?d?l?d +?d?d?d?l?d?l?d?d?l +?d?l?d?d?d?d?l?l?d +?l?d?d?d?d?d?d?d?l?l +?d?d?l?d?d?l?d?l?d +?d?d?l?d?d?d?d?l?l +?d?d?d?l?d?l?d?l?d +?d?d?l?l?l?u?u?u +?l?l?l?u?l?d?d?l +?u?l?u?u?u?u?d?d +?u?l?l?u?l?u?d?d +?d?d?d?l?l?s?s?s +?l?d?l?d?l?d?d?d?d?d +?u?u?u?l?l?l?l?d?d +?u?u?u?u?u?s?u?u +?d?l?d?d?u?d?d?s +?s?l?d?d?d?d?d?l +?u?d?d?d?s?l?d?d +?s?d?d?d?d?d?u?u +?s?u?d?d?d?d?l?d +?d?l?l?d?d?d?s?d +?u?d?d?d?l?d?d?s +?u?d?d?l?d?s?d?d +?d?d?u?u?d?d?d?s +?d?d?d?d?u?s?d?l +?l?s?d?d?d?d?l?d +?u?d?d?u?s?d?d?d +?u?s?d?d?l?d?d?d +?l?u?d?s?d?d?d?d +?s?d?u?l?d?d?d?d +?l?d?d?d?l?d?s?d +?d?d?d?u?d?l?d?s +?d?d?d?d?u?s?l?d +?d?l?d?l?s?d?d?d +?d?u?l?s?d?d?d?d +?d?d?s?d?d?d?l?u +?d?d?d?l?d?d?s?l +?d?l?d?l?d?d?s?d +?s?d?l?d?d?d?d?u +?u?s?d?u?d?d?d?d +?l?d?d?d?d?s?d?l +?d?d?d?d?u?u?d?s +?l?d?d?d?s?d?l?d +?l?d?d?s?d?d?d?l +?d?l?l?d?d?s?d?d +?l?d?d?d?d?d?s?l +?d?l?u?d?d?d?d?s +?d?d?u?d?l?s?d?d +?u?u?d?d?s?d?d?d +?s?l?d?d?d?d?d?u +?d?d?s?l?d?l?d?d +?d?d?u?l?d?d?d?s +?d?l?s?d?l?d?d?d +?s?d?d?u?l?d?d?d +?d?d?l?s?d?d?d?l +?u?d?u?d?d?d?d?s +?d?u?s?l?d?d?d?d +?d?d?d?d?d?l?u?s +?u?d?d?d?d?u?d?s +?d?d?l?d?d?s?d?l +?u?d?d?d?s?d?d?l +?d?d?u?l?s?d?d?d +?d?d?d?s?l?d?l?d +?d?l?u?s?d?d?d?d +?u?s?d?d?d?d?u?d +?d?s?l?l?d?d?d?d +?u?s?d?l?d?d?d?d +?u?d?d?d?d?l?d?s +?u?s?d?d?d?l?d?d +?d?l?d?d?d?l?s?d +?d?s?d?l?d?l?d?d +?d?l?s?l?d?d?d?d +?l?s?d?d?l?d?d?d +?d?u?d?d?s?d?d?l +?d?l?d?d?l?d?d?s +?d?u?l?d?d?s?d?d +?s?d?d?d?l?l?d?d +?l?d?u?d?d?d?d?s +?d?d?s?d?d?l?d?l +?l?d?d?s?u?d?d?d +?l?d?d?d?d?d?u?s +?d?d?s?d?d?u?d?u +?u?d?s?d?d?d?d?l +?d?d?d?u?l?s?d?d +?d?l?d?d?d?l?d?s +?u?d?d?d?d?d?s?u +?d?l?d?d?l?d?s?d +?u?d?d?d?s?u?d?d +?u?d?s?l?d?d?d?d +?d?d?l?l?d?d?s?d +?d?d?u?s?l?d?d?d +?u?d?d?d?d?s?d?l +?d?l?d?d?u?s?d?d +?l?d?l?d?s?d?d?d +?d?d?d?u?s?d?d?u +?d?d?d?s?d?d?u?l +?d?d?u?d?s?l?d?d +?u?d?d?u?d?s?d?d +?d?d?l?d?d?d?l?s +?s?l?u?d?d?d?d?d +?d?d?d?d?s?d?u?u +?l?d?d?d?s?l?d?d +?d?l?l?u?l?l?l?l +?d?u?u?d?d?d?d?d?d +?d?d?d?d?d?l?d?l?d +?d?l?d?d?d?d?d?l?d +?d?d?d?d?d?d?u?d?u +?l?l?s?s?l?l?l?l +?s?l?l?d?d?l?l?s +?l?s?l?l?l?d?l?l +?u?u?u?u?u?u?s?u +?d?l?l?l?s?u?u?u +?l?l?l?u?u?u?u?u +?u?l?l?d?d?d?u?d +?l?d?d?u?u?u?d?d +?d?d?d?l?d?u?u?l +?l?d?l?d?d?d?l?u +?u?d?u?l?d?d?d?u +?u?l?d?u?u?d?d?d +?l?u?d?u?l?d?d?d +?u?d?d?d?u?u?d?u +?l?l?l?d?d?d?u?d +?l?l?u?d?d?l?d?d +?d?d?l?u?l?l?d?d +?d?u?u?u?d?d?u?d +?d?d?d?l?u?d?l?u +?d?d?u?u?d?u?u?d +?l?l?d?d?l?u?d?d +?u?d?d?d?u?l?u?d +?u?d?u?d?u?l?d?d +?u?d?u?d?l?l?d?d +?d?d?l?l?d?l?u?d +?d?d?l?l?l?d?d?u +?u?d?d?d?l?l?u?d +?u?d?d?d?u?l?l?d +?d?d?d?l?u?l?l?d +?d?l?d?d?d?u?u?u +?u?u?d?d?l?u?d?d +?d?d?u?d?l?l?l?d +?u?u?d?d?l?d?l?d +?u?d?l?u?l?d?d?d +?l?l?d?u?d?d?d?l +?d?l?u?l?l?d?d?d +?l?l?d?d?d?u?u?d +?u?l?l?d?d?d?l?d +?u?d?d?l?d?u?l?d +?l?l?u?d?d?d?d?l +?l?d?d?l?d?d?u?u +?d?d?l?u?d?d?l?u +?u?l?d?l?u?d?d?d +?d?d?d?u?l?l?d?l +?l?l?d?d?d?u?d?l +?l?d?l?u?d?l?d?d +?l?d?l?d?d?l?d?u +?l?l?d?d?d?l?d?u +?l?u?l?d?d?d?d?l +?u?l?u?d?l?d?d?d +?l?d?d?u?l?l?d?d +?d?d?d?d?l?d?l?l?l +?d?u?u?d?d?u?d?u +?u?u?u?d?l?d?d?d +?d?l?l?u?u?d?d?d +?d?u?d?u?u?d?d?u +?d?d?d?d?l?l?l?d?l +?u?l?d?d?l?d?d?u +?l?d?d?d?d?l?u?u +?d?u?l?l?u?d?d?d +?l?d?d?l?u?d?d?l +?u?d?u?l?d?l?d?d +?u?d?d?u?l?d?d?l +?l?u?l?d?l?d?d?d +?d?d?u?d?u?d?u?u +?d?d?u?u?d?u?d?u +?d?u?u?d?d?d?l?l +?d?u?d?d?u?u?u?d +?d?d?d?l?l?l?u?d +?l?d?l?d?d?l?u?d +?u?d?l?l?d?d?u?d +?u?d?d?u?l?u?d?d +?u?d?l?d?u?d?d?l +?l?u?d?l?d?u?d?d +?d?u?l?d?d?d?l?l +?d?u?l?u?d?l?d?d +?l?d?d?l?d?l?l?d?d +?d?u?l?d?d?l?d?l +?l?u?l?d?d?l?d?d +?d?l?d?d?l?d?l?u +?d?l?l?l?u?d?d?d +?u?u?d?d?u?d?l?d +?l?d?u?l?d?l?d?d +?u?d?d?l?u?d?l?d +?d?d?l?u?u?l?d?d +?u?d?d?d?l?d?l?u +?u?d?d?l?d?u?d?u +?u?u?d?u?d?d?d?l +?u?d?l?d?d?l?u?d +?u?l?d?d?u?d?l?d +?d?d?u?u?u?d?d?l +?l?u?l?d?d?d?d?u +?d?d?l?l?d?d?u?l +?d?d?u?d?l?d?l?l +?d?d?u?l?d?l?l?d +?u?s?u?u?u?u?u?u +?d?u?l?l?l?u?l?l +?l?s?l?l?d?l?l?d +?l?l?d?l?d?l?l?s +?l?s?s?l?s?l?s +?l?s?s?l?l?s?s +?l?d?s?l?l?l?l?l +?s?s?d?d?d?d?d?d?d?d +?d?d?l?l?l?l?l?l?l?l +?l?l?l?l?d?d?d?d?u +?u?u?u?d?d?d?d?u?u +?s?d?d?s?d?d?s?l +?l?l?s?l?s?s?l +?s?l?s?l?s?l?l +?s?u?l?l?l?s?s +?s?u?u?s?u?u?s +?l?l?s?s?l?s?l +?s?l?l?s?s?l?l +?u?u?u?u?u?u?l?d +?l?l?d?l?l?l?l?u +?s?u?l?l?l?d?d?s +?l?l?l?s?s?l?d?d +?l?l?d?u?u?u?d?d +?d?u?l?l?d?l?l?d +?u?l?d?d?d?u?l?u +?u?d?d?u?l?l?l?d +?u?l?l?u?u?l?d?d +?d?d?d?l?l?u?l?l +?l?l?l?l?u?d?d?l +?d?d?u?u?d?u?u?u +?l?u?u?u?u?l?d?d +?d?l?l?l?l?l?u?d +?u?d?u?d?l?l?l?l +?d?u?d?l?l?d?l?l +?d?u?d?l?l?l?l?l +?u?l?l?u?d?d?d?u +?l?l?u?d?d?l?l?l +?u?d?l?d?l?u?d?l +?d?l?l?d?d?u?u?u +?u?l?l?d?u?u?d?d +?l?d?l?l?l?d?d?u +?u?l?l?l?d?u?d?d +?u?d?u?u?l?l?d?d +?u?d?l?l?u?l?d?d +?d?d?l?u?u?u?u?u +?d?u?l?d?l?l?l?d +?l?l?l?l?d?u?d?d +?u?d?l?d?u?l?l?d +?u?d?l?l?d?d?u?u +?l?l?l?l?l?d?d?l?d +?d?l?l?l?u?u?d?d +?u?l?d?u?l?d?u?d +?l?l?l?d?u?u?d?d +?l?d?l?d?l?d?l?l?l +?l?u?u?l?u?u?d?d +?u?u?u?d?u?d?d?u +?u?l?u?d?d?d?l?l +?d?u?d?u?u?u?d?u +?u?d?d?u?d?l?l?l +?d?l?l?u?l?l?d?d +?s?l?l?l?l?l?l?d?d +?u?l?l?l?l?s?l?l +?l?l?l?l?l?d?d?s?s +?d?s?d?d?s?l?l?l +?s?s?s?s?s?l?l +?d?d?l?l?l?d?d?d?l +?u?u?d?d?d?d?d?u?u +?l?d?d?d?d?d?d?l?d?d +?l?d?d?l?d?d?l?d?d?l +?l?d?l?l?l?l?l?l?d +?l?l?l?s?s?d?d?d?d +?u?s?u?d?l?l?l?l +?u?s?s?s?l?d?d +?s?d?s?d?s?u?l +?s?d?l?u?s?s?d +?u?s?s?l?s?d?d +?d?s?l?s?l?d?s +?l?d?s?s?d?s?l +?d?d?l?s?l?s?s +?l?l?s?d?s?d?s +?s?d?d?s?u?u?s +?s?s?s?d?d?l?u +?l?d?s?d?l?s?s +?d?s?l?l?d?s?s +?d?s?d?l?s?l?s +?s?l?s?d?d?u?s +?d?d?s?s?l?l?s +?l?s?s?s?l?d?d +?s?u?u?s?s?d?d +?l?u?s?s?s?d?d +?l?s?s?s?d?l?d +?l?d?s?s?s?d?l +?u?l?s?s?s?d?d +?s?s?u?u?d?d?s +?s?u?d?u?d?s?s +?u?d?s?s?d?s?u +?d?s?s?d?s?u?u +?u?s?l?s?s?d?d +?d?d?s?u?s?l?s +?s?l?d?s?s?d?l +?s?l?d?s?l?s?d +?s?s?s?u?u?d?d +?l?s?s?d?s?d?l +?s?s?l?d?l?d?s +?s?s?d?l?d?l?s +?l?s?d?l?s?d?s +?l?s?d?s?d?l?s +?d?d?s?l?l?s?s +?l?s?d?s?l?d?s +?s?u?s?l?s?d?d +?l?s?s?l?d?s?d +?s?u?l?d?d?s?s +?l?s?d?d?s?s?l +?s?l?s?s?d?l?d +?l?s?s?s?d?d?l +?u?u?s?s?s?d?d +?s?l?d?l?d?s?s +?s?s?l?d?l?s?d +?l?d?d?s?s?l?s +?l?s?l?d?s?s?d +?s?l?l?s?d?s?d +?d?s?d?l?l?s?s +?l?d?s?s?l?d?s +?d?l?l?s?d?s?s +?s?s?u?u?s?d?d +?s?d?d?s?l?s?l +?d?s?u?s?d?u?s +?d?d?u?u?s?s?s +?s?d?d?s?l?s?u +?l?d?s?d?s?l?s +?s?s?l?d?d?l?s +?s?s?l?l?d?d?s +?u?l?s?d?s?s?d +?s?d?l?s?l?d?s +?d?s?u?s?d?s?u +?s?l?s?l?d?d?s +?u?s?u?s?s?d?d +?s?s?d?s?l?d?u +?s?l?d?s?d?l?s +?s?u?u?s?d?d?s +?s?d?d?l?s?s?l +?s?s?s?d?l?d?l +?u?s?u?d?s?s?d +?u?s?d?s?d?s?u +?d?s?d?s?s?l?l +?d?s?l?l?s?d?s +?s?d?d?s?s?l?u +?u?l?l?l?l?d?u?l +?l?l?l?u?u?u?u?d +?l?l?d?l?l?l?d?s +?d?d?u?u?u?u?u?s +?l?l?l?s?l?d?l?d +?d?d?l?l?l?l?s?l +?d?d?d?d?d?d?d?d?s?u +?u?s?s?l?d?d?d?d +?l?d?d?d?l?d?s?s +?l?s?l?s?l?d?d?d?d +?d?d?d?d?l?s?s?l +?d?d?s?d?d?l?l?s +?l?l?d?s?d?d?s?d +?l?s?u?s?d?d?d?d +?s?l?d?d?s?l?d?d +?d?d?u?l?s?s?d?d +?d?d?d?d?d?s?d?d?d?d?d +?l?l?d?d?s?l?l?d?d +?l?l?s?l?l?l?l?d?d +?d?d?d?l?l?d?d?d?s +?d?d?d?l?s?l?d?d?d +?d?d?d?d?s?d?d?l?l +?l?d?l?l?l?l?s?l +?l?s?l?l?l?l?d?l +?s?l?d?l?l?s?l +?u?s?d?u?u?u?s +?s?l?s?l?l?d?l +?u?l?l?s?u?s?d +?u?l?s?l?l?d?s +?u?u?u?d?s?s?u +?l?s?d?s?l?l?l +?u?l?l?s?l?d?s +?s?u?l?d?l?l?s +?s?d?u?l?l?l?s +?d?l?l?s?l?s?l +?u?l?s?d?u?l?s +?u?l?l?s?d?s?l +?u?s?d?s?l?u?l +?u?d?u?s?u?s?u +?d?l?s?s?l?l?l +?s?d?u?l?l?s?l +?u?u?s?s?u?u?d +?u?u?s?l?s?l?d +?u?s?u?s?u?l?d +?u?s?u?u?s?d?l +?s?u?s?d?l?l?l +?s?u?l?l?d?l?s +?u?s?l?l?d?l?s +?u?s?l?s?l?u?d +?u?l?d?l?l?s?s +?u?l?u?l?s?d?s +?s?l?d?s?l?l?l +?u?s?l?d?l?l?s +?u?u?u?d?u?s?s +?u?u?s?s?l?l?d +?u?l?l?l?s?d?d?s +?l?d?u?l?l?s?s +?u?s?l?l?l?d?s +?s?d?s?l?l?u?l +?u?u?s?l?l?s?d +?s?l?s?d?l?l?l +?d?l?s?l?l?s?l +?d?d?d?d?d?d?s?d?d?d?d +?u?l?d?u?l?l?l?l +?d?d?l?d?l?l?d?d?d +?u?u?d?d?u?d?d?d?d +?u?d?u?d?u?d?d?d?d +?d?d?d?l?l?d?d?d?l +?u?d?d?l?l?d?d?d?d +?l?d?d?d?l?d?d?l?d +?d?l?d?l?d?d?d?d?l +?l?d?d?d?l?d?l?d?d +?u?l?d?d?l?d?d?d?d +?l?d?d?l?d?d?d?l?d +?l?l?d?s?d?d?l?l +?l?d?l?l?d?d?l?s +?u?d?l?l?l?s?d?d +?u?d?u?d?u?d?u?s +?u?l?l?d?d?d?d?d?s +?d?d?l?d?l?l?l?d?d +?l?l?l?u?l?u?s +?u?l?u?l?u?s?l +?u?l?u?l?l?u?s +?l?u?s?l?l?l?l +?l?l?u?u?l?s?l +?u?l?s?u?l?l?u +?u?l?u?u?l?l?s +?l?s?u?l?l?l?l +?u?s?u?u?l?l?l +?s?l?u?l?l?l?l +?l?d?l?l?s?l?l?l +?s?l?l?l?l?u?u +?s?u?u?l?l?l?l +?l?s?l?l?l?l?u +?u?u?u?s?l?l?l?d +?u?l?s?l?l?l?l?d +?u?u?s?u?u?l?l +?u?l?s?u?u?u?u +?s?d?d?d?d?d?d?s?s +?d?s?d?d?s?d?d?s?d +?d?l?l?l?l?l?d?u +?u?u?l?u?u?l?d?d +?d?s?s?s?s?s?s +?s?s?l?l?l?l?u +?u?s?u?u?s?u?u +?l?u?l?u?l?s?s +?s?u?s?u?u?u?u +?l?s?l?s?l?l?u +?d?u?u?l?l?l?l?l +?u?u?u?u?u?s?d?d?d +?u?l?l?l?l?l?s?l +?d?d?d?d?d?d?d?u?d?d +?l?s?l?l?s?s?s +?u?s?u?s?u?s?s +?l?l?d?s?l?l?l?d +?l?l?l?s?l?d?l?l +?l?l?l?l?d?s?l?l +?s?u?u?u?u?u?d?d +?d?l?l?d?l?l?l?s +?u?l?l?l?s?l?l?d +?s?d?d?s?l?l?l?l +?d?s?d?s?d?s?d?s?d +?l?d?d?l?l?l?d?d?l +?u?u?u?d?d?d?u?u?u +?d?l?l?l?d?l?l?l?d +?l?d?l?l?l?l?d?l?l +?l?l?l?l?s?s?s?d +?l?l?l?l?l?l?d?d?d?d?d +?l?l?l?s?d?d?d?d?s +?u?l?l?l?l?d?d?d?s +?l?l?d?l?l?l?l?l?d +?l?s?l?s?s?s?d +?l?l?s?s?s?d?s +?s?l?s?l?s?d?s +?d?s?l?s?s?l?s +?l?d?l?s?s?s?s +?l?u?u?u?l?l?u +?l?u?l?u?l?u?l?u +?l?u?u?u?l?u?l +?l?u?u?l?l?u?u +?u?l?u?u?u?u?l +?l?u?u?u?u?l?u +?l?l?l?u?u?l?u +?u?u?u?l?u?l?l +?l?u?u?l?l?l?u +?u?u?l?u?u?l?u +?u?l?l?u?l?l?s?d +?u?l?l?u?d?d?d?d?d +?d?d?u?u?u?u?d?d?d +?d?d?l?l?l?l?d?d?s +?l?d?d?l?d?d?l?l?l +?l?l?l?l?d?d?d?l?d +?u?l?l?l?l?l?s?u +?d?d?d?d?d?d?d?d?s?d?d +?s?d?d?d?s?d?d?d?d +?d?d?d?d?s?d?d?d?s +?d?d?s?d?d?d?d?s?d +?d?d?d?s?d?s?d?d?d +?l?s?s?l?l?d?d?d +?u?u?u?s?d?s?d?d +?u?u?u?s?s?d?d?d +?d?d?s?l?l?l?d?s +?u?l?l?s?s?d?d?d +?l?l?d?d?l?l?d?d?d?d +?l?s?l?l?s?s?l +?u?u?l?l?s?s?s +?u?s?l?l?l?s?s +?s?s?s?l?l?l?d?d +?d?d?l?l?l?d?d?d?d?d +?s?d?d?d?s?d?d?d?s +?d?d?s?l?l?l?l?s +?u?d?u?l?l?l?l?l +?u?l?u?d?l?l?l?l +?l?d?l?l?l?l?l?u +?l?l?l?l?l?d?d?d?d?s +?u?l?u?l?u?l?u?d?d +?d?d?d?d?d?d?s?u?l +?d?d?l?d?d?l?d?d?s +?d?d?d?d?l?l?s?d?d +?u?u?u?u?d?u?u?u?u +?l?l?l?d?l?l?d?s +?u?l?d?d?l?l?l?s +?l?s?l?l?d?l?d?l +?l?d?d?l?s?l?l?l +?l?d?l?l?l?l?s?d +?u?u?s?l?l?l?d?d +?l?d?l?d?l?s?l?l +?u?u?l?l?l?d?d?s +?l?d?d?d?d?d?d?d?d?d?l +?l?u?l?l?l?u?d?d +?l?l?d?d?u?u?u?u +?d?d?u?l?u?l?l?l +?l?u?l?d?d?l?u?l +?l?d?l?d?l?l?l?l?l +?l?l?d?d?l?l?u?u +?u?l?u?d?u?l?u?d +?l?l?d?d?u?u?l?l +?d?l?l?l?d?l?l?u +?l?l?l?l?l?d?u?d +?l?l?l?l?l?u?d?d?d +?u?u?l?l?u?l?d?d +?s?d?d?d?s?d?d?l +?d?d?d?d?d?s?u?s +?u?d?s?s?d?d?d?d +?d?d?s?d?l?s?d?d +?d?d?d?d?s?u?s?d +?d?s?d?d?s?l?d?d +?d?d?s?l?s?d?d?d +?d?l?s?d?d?s?d?d +?d?d?s?d?d?d?s?l +?d?d?d?d?s?l?s?d +?d?l?d?d?s?s?d?d +?l?s?d?d?d?d?s?d +?d?d?d?d?s?d?s?u +?d?d?d?d?s?s?l?d +?s?d?d?s?d?d?d?l +?u?s?d?d?d?d?d?s +?d?s?d?d?l?d?d?s +?s?d?d?d?d?s?d?l +?s?l?d?d?d?s?d?d +?d?d?d?d?s?u?d?s +?s?d?d?d?s?d?d?u +?d?d?d?l?s?s?d?d +?d?s?d?s?u?d?d?d +?s?d?d?s?d?l?d?d +?d?l?s?s?d?d?d?d +?s?u?d?d?d?d?d?s +?d?l?s?d?d?d?s?d +?s?d?d?d?s?l?d?d +?d?d?s?s?d?d?d?l +?u?s?d?d?s?d?d?d +?d?d?u?d?d?d?s?s +?d?s?l?s?d?d?d?d +?d?d?d?s?l?s?d?d +?u?d?s?d?d?d?d?s +?d?s?u?s?d?d?d?d +?d?s?d?d?l?s?d?d +?u?s?s?d?d?d?d?d +?s?d?d?d?d?s?l?d +?d?l?d?d?d?d?s?s +?d?u?s?s?d?d?d?d +?d?s?d?s?d?d?d?l +?s?s?d?d?d?d?l?d +?s?d?d?d?l?d?d?s +?d?l?l?l?l?l?s?l +?l?l?l?l?l?d?s?l +?d?l?s?l?l?l?l?l +?d?l?l?d?l?l?d?l?l +?l?s?l?l?l?l?l?d?d +?d?d?d?d?d?d?l?l?l?l?l +?d?d?l?l?d?d?l?l?d +?d?l?l?d?d?l?l?d?d +?d?l?d?l?d?l?d?d?l +?d?d?d?d?u?u?u?u?d +?l?d?d?l?d?d?l?l?d +?d?d?l?d?d?d?l?l?l +?d?d?d?d?d?d?l?s?d +?d?d?s?d?d?d?d?d?l +?s?d?d?d?d?d?d?d?u +?d?d?d?l?d?d?d?d?s +?d?d?l?d?d?d?d?d?s +?u?d?d?s?d?d?d?d?d +?d?d?l?d?d?s?d?d?d +?d?d?d?d?s?d?d?d?d?l +?d?l?d?s?d?d?d?d?d +?u?u?u?u?u?u?u?l +?u?l?l?l?u?u?u?d +?l?l?l?l?s?l?s?l +?d?d?d?d?d?u?d?d?d?d +?d?l?l?l?l?d?l?d?d +?d?l?d?l?l?d?d?s +?u?u?d?d?d?d?l?s +?d?d?u?s?d?d?u?u +?u?d?l?d?d?l?d?s +?d?s?l?l?d?d?l?d +?d?d?d?d?l?u?u?s +?u?s?d?d?u?u?d?d +?u?d?d?l?d?d?u?s +?d?d?s?l?l?d?l?d +?d?d?l?l?d?d?s?l +?u?u?u?d?d?d?s?d +?s?l?l?d?d?d?d?l +?d?s?d?d?d?u?u?u +?d?d?l?s?l?u?d?d +?d?d?d?d?u?l?s?l +?d?l?l?s?d?d?d?l +?u?u?u?d?s?d?d?d +?d?d?u?l?d?d?l?s +?u?d?d?s?d?d?l?l +?l?d?d?s?l?l?d?d +?d?l?l?d?d?d?l?s +?l?s?l?l?d?d?d?d?d +?u?l?d?d?d?d?s?l +?u?l?d?d?l?s?d?d +?s?u?l?u?d?d?d?d +?u?u?s?d?d?d?d?u +?d?l?d?s?l?l?d?d +?u?d?l?d?l?s?d?d +?d?d?u?d?d?u?u?s +?d?d?u?d?l?l?s?d +?s?d?u?u?d?l?d?d +?l?d?l?d?s?d?l?d +?d?d?u?s?l?l?d?d +?u?d?d?l?l?d?d?s +?u?d?u?d?d?u?d?s +?u?l?l?d?d?d?s?d +?l?s?u?l?d?d?d?d +?u?s?u?l?d?d?d?d +?d?u?u?u?d?d?d?s +?u?s?d?d?d?d?u?u +?d?d?d?l?l?s?l?d +?d?d?d?d?l?l?s?u +?d?d?d?d?u?l?u?s +?d?d?d?l?s?l?d?l +?l?d?l?d?s?l?d?d +?u?d?d?u?u?d?d?s +?d?d?d?d?s?l?l?u +?d?d?l?d?d?l?s?l +?l?d?d?d?d?s?u?u +?l?l?d?d?s?d?d?l +?d?d?l?l?l?d?s?d +?d?l?d?s?d?l?d?l +?s?l?l?d?l?d?d?d +?u?l?d?d?d?d?l?s +?d?d?d?s?d?u?u?u +?d?u?d?u?d?u?d?s +?u?d?d?u?d?d?s?l +?l?l?d?l?d?d?d?s +?s?d?d?u?l?l?d?d +?d?l?s?l?l?d?d?d +?l?d?d?l?d?d?s?l +?u?u?d?d?d?d?s?l +?l?d?d?d?l?s?l?d +?s?l?d?d?d?l?l?d +?l?d?d?l?l?d?s?d +?l?d?l?l?l?s?l?l +?u?l?l?d?l?l?l?s +?s?u?u?u?l?l?l?d +?u?u?s?u?u?u?u?d +?u?l?l?l?l?s?s?s +?s?l?d?l?l?d?l?s +?d?l?d?l?d?d?l?d?d +?l?d?d?d?d?l?d?l?d +?u?d?d?d?u?d?d?d?u +?u?d?u?u?d?d?d?d?d +?l?d?d?d?d?d?d?u?u +?d?d?d?d?u?l?u?d?d +?u?d?l?d?u?d?d?d?d +?l?d?l?d?d?d?l?d?d +?d?d?l?l?d?l?d?d?d +?l?s?l?s?l?s?l?d +?d?d?d?d?d?d?d?l?d?l +?u?l?u?l?d?d?d?d?d?d +?d?d?s?d?d?s?s?s +?l?d?d?u?u?u?d?l +?d?d?d?u?l?u?u?l +?l?d?d?d?l?l?u?l +?u?l?d?d?l?u?l?d +?d?d?l?l?u?u?d?l +?d?d?d?l?u?l?l?l +?l?d?d?l?d?l?l?u +?l?u?l?d?l?l?d?d +?l?u?l?u?u?d?d?d +?l?u?l?d?d?d?l?l +?u?d?d?u?u?u?d?u +?d?u?d?u?u?d?u?u +?d?u?d?d?l?l?l?l +?l?d?l?u?u?l?d?d +?l?l?d?d?d?u?u?l +?s?l?l?l?l?l?d?d?d +?d?l?l?l?l?d?d?u +?u?l?d?u?l?d?d?l +?l?d?l?d?u?l?d?l +?l?l?d?l?l?u?d?d +?u?l?l?d?d?u?l?d +?d?l?l?d?l?l?d?u +?u?u?u?l?d?l?d?d +?d?d?d?u?l?u?l?l +?u?l?d?d?l?d?l?u +?d?d?u?u?u?d?u?u +?d?u?l?l?d?d?l?l +?d?l?d?d?u?l?l?l +?l?l?d?l?l?d?u?d +?d?l?d?l?l?l?d?u +?l?l?l?d?d?u?u?d +?l?l?d?u?l?l?d?d +?l?d?u?l?d?u?l?d +?u?l?d?d?l?l?u?d +?l?l?d?d?d?d?d?d?d?s +?l?l?l?d?u?u?u?u +?s?u?s?l?s?u?s +?s?s?s?l?l?l?s +?s?l?l?l?s?s?s +?s?u?l?l?l?l?l?l +?s?u?u?u?u?u?u?u +?s?d?d?d?u?u?u?u +?l?d?l?d?l?d?s?l +?u?l?u?l?u?d?d?s +?l?l?d?d?l?d?l?s +?u?d?l?l?d?d?l?s +?u?l?s?u?l?l?d?d +?d?l?l?d?d?l?l?s +?u?s?d?l?l?l?d?d +?l?d?l?d?d?l?l?s +?l?l?l?l?d?l?s?d +?l?l?d?l?d?d?l?s +?l?d?l?l?d?d?s?l +?l?d?l?l?l?d?d?s +?d?d?l?l?l?d?l?s +?u?d?l?d?l?d?l?s +?l?d?l?l?s?l?l?d +?l?d?d?l?l?l?s?d +?d?s?d?l?l?l?l?d +?l?d?l?l?d?s?l?d +?l?l?s?u?u?d?d?d +?l?l?l?l?d?s?d?l +?s?l?l?d?d?l?l?l +?s?l?l?d?l?l?d?d +?u?s?l?l?l?d?d?d?d +?l?l?d?l?l?d?l?l?l +?u?l?l?d?l?d?d?d?d +?d?l?d?l?l?l?d?d?d +?l?l?d?d?l?d?d?l?d +?l?l?l?u?d?d?d?d?d +?l?l?d?l?d?d?l?d?d +?d?l?l?d?l?l?d?d?d +?u?s?s?s?s?s?s +?l?l?l?d?d?d?d?d?d?l +?l?d?d?d?d?d?l?d?d?d +?d?d?s?l?l?l?l?l?l +?u?s?u?l?l?l?l?l +?s?d?s?s?d?s?l +?l?s?d?s?s?d?s +?u?d?d?s?s?s?s +?s?l?s?d?s?d?s +?s?s?l?s?d?d?s +?s?d?s?s?l?d?s +?l?s?s?s?d?s?d +?d?d?l?s?s?s?s +?d?l?s?s?s?s?d +?s?d?d?s?u?s?s +?d?d?s?s?s?u?s +?l?d?s?s?d?s?s +?s?s?s?l?s?d?d +?u?s?s?s?s?d?d +?s?l?s?d?s?s?d +?l?d?s?s?s?s?d +?l?s?d?d?s?s?s +?d?s?d?s?s?s?l +?l?s?s?d?d?s?s +?s?d?d?s?s?s?l +?s?d?d?s?s?s?u +?s?s?d?s?l?s?d +?s?s?d?d?u?s?s +?s?l?s?d?d?s?s +?s?l?d?d?s?s?s +?s?d?s?d?s?l?s +?s?s?u?s?s?d?d +?s?d?s?l?s?s?d +?l?s?d?s?s?s?d +?s?l?s?s?s?d?d +?s?d?l?d?s?s?s +?l?l?s?l?l?l?l?l?l +?d?u?u?l?l?u?l +?l?u?u?u?d?l?u +?l?l?u?d?u?l?u +?l?u?l?l?u?d?l +?u?d?l?l?u?l?u +?d?u?l?u?u?l?u +?u?u?l?l?d?l?u +?d?l?u?u?l?l?u +?l?l?d?d?l?l?u?l +?l?l?u?l?d?d?l?l +?u?d?u?u?l?l?u +?u?u?u?l?u?d?l +?u?d?l?u?d?l?l?l +?d?l?u?u?u?l?l +?u?d?u?u?u?l?l +?u?u?u?l?d?l?u +?u?l?u?d?l?l?u +?d?u?u?u?l?u?u +?d?u?u?u?l?u?l +?u?d?u?l?u?u?u +?u?d?u?l?u?u?l +?u?d?u?u?l?u?l +?l?u?u?u?l?u?d +?l?u?l?l?d?u?l +?l?u?l?l?d?u?u +?l?u?u?l?l?u?d +?l?u?d?l?u?u?l +?l?l?u?u?d?u?u +?l?d?u?u?l?u?u +?u?l?u?u?d?l?u +?d?l?u?u?l?u?u +?u?l?d?u?u?l?l +?l?u?l?u?d?l?u +?u?l?d?l?l?l?l?s +?u?l?l?l?l?d?l?s +?u?l?l?l?u?d?l?l +?l?u?l?d?l?l?u +?u?l?u?u?l?d?l +?l?u?l?u?u?l?d +?l?u?u?l?d?u?l +?l?u?u?l?d?u?u +?l?d?u?u?u?u?l +?l?u?u?u?l?d?l +?l?l?u?d?d?l?l?u +?u?l?l?u?d?u?l +?u?l?d?l?u?u?l +?l?l?u?l?d?l?u +?u?d?l?u?u?u?l +?u?d?l?l?l?u?u +?l?l?u?l?d?u?l +?d?l?l?u?u?l?u +?u?u?l?u?u?d?u +?u?u?d?d?l?l?u?u +?u?d?u?l?u?l?l +?l?u?u?u?d?l?l +?l?d?d?l?l?u?l?l +?u?u?d?l?u?u?l +?u?u?l?l?u?d?l +?u?l?l?l?l?d?u?d +?u?d?u?l?l?u?l +?u?d?u?l?l?u?u +?d?u?u?l?l?u?u +?u?d?l?u?l?u?l +?d?l?l?l?u?l?u +?l?l?l?l?d?l?l?u +?l?u?u?d?u?u?l +?l?u?d?l?l?l?u +?l?u?l?d?u?u?l +?l?d?d?l?l?l?l?u +?l?l?u?u?u?d?u +?l?u?l?l?d?d?l?l +?l?l?u?l?u?d?l +?d?l?u?u?l?u?l +?u?u?d?u?l?u?u +?l?u?d?l?l?u?u +?d?u?u?l?u?u?u +?l?l?l?u?d?l?u +?l?d?u?l?u?u?l +?l?l?d?l?u?l?u +?u?u?l?d?u?u?l +?d?l?l?d?l?l?l?u +?u?l?l?u?d?l?u +?l?u?u?l?u?d?u +?l?u?u?l?u?d?l +?u?l?l?u?l?d?u +?u?u?u?d?u?l?l?l +?l?u?l?u?l?u?l?d +?l?d?u?u?l?l?u +?l?u?d?u?l?l?l +?d?l?u?l?u?u?u +?l?l?l?d?u?u?u?d +?u?d?u?l?l?l?u +?u?d?l?u?u?u?u +?u?u?l?u?l?d?u +?l?d?u?l?l?l?u +?l?l?u?d?u?u?u +?l?u?u?d?l?l?u +?l?l?u?d?u?u?l +?u?u?d?l?l?l?u +?d?u?l?l?u?u?l +?l?u?u?l?d?l?u +?l?l?u?u?d?d?s?s +?d?d?d?d?s?d?d?d?d?s +?l?d?l?l?l?l?l?d?l +?s?s?s?l?d?d?d?d +?l?s?d?d?s?d?d?s +?l?d?s?d?s?d?s?d +?l?s?d?d?d?d?d?d?s +?s?d?d?d?d?d?d?l?s +?s?d?d?d?d?d?d?s?l +?l?l?l?s?l?l?s?d +?l?l?l?l?s?l?s?d +?l?l?l?s?s?d?s +?d?u?s?u?s?u?s +?s?l?s?d?s?l?l +?s?l?d?l?l?s?s +?s?s?l?d?l?l?s +?l?s?d?l?s?l?s +?l?d?s?s?s?l?l +?s?l?s?d?l?s?l +?s?s?l?d?s?l?l +?u?u?u?d?s?s?s +?d?s?l?l?l?s?s +?l?s?d?s?l?l?s +?u?s?l?s?l?s?d +?d?s?l?l?s?s?l +?l?s?s?s?l?d?l +?l?l?s?d?s?l?s +?l?s?s?s?d?l?l +?s?l?d?s?l?l?s +?u?s?u?s?d?s?u +?l?s?s?d?s?l?l +?l?s?d?l?l?s?s +?l?l?s?s?s?l?d +?u?s?s?s?u?u?d +?l?d?s?l?s?l?s +?s?l?l?s?d?s?l +?d?u?s?s?u?u?s +?u?d?l?s?l?s?s +?u?l?l?d?s?s?s +?l?d?l?s?l?s?s +?l?d?s?s?l?l?s +?s?l?l?s?d?l?s +?s?l?s?s?d?l?l +?l?l?s?s?d?s?l +?s?s?s?l?d?l?l +?s?l?s?d?l?l?s +?s?d?l?l?s?l?s +?s?s?l?l?l?d?s +?l?l?s?l?d?l?l?l +?l?d?d?d?l?d?d?d?s +?u?l?l?s?d?d?d?s +?s?u?u?u?s?d?d?d +?d?d?d?l?s?l?s?l +?u?l?l?d?d?s?s?d +?l?s?l?d?l?s?d?d +?u?u?u?s?d?d?d?s +?l?s?s?l?l?l?l?l +?d?d?l?l?l?l?s?d?d +?u?d?u?d?u?d?u?d?u +?d?d?l?d?d?l?l?l?l +?l?d?l?d?l?l?d?d?l +?d?l?l?l?l?u?l?l +?l?u?d?d?d?d?d?d?d?d +?d?l?l?d?d?d?d?d?d?d +?u?l?l?l?u?l?l?s +?u?u?s?u?u?u?s +?d?l?l?l?l?l?s?s +?u?l?s?l?l?s?l +?u?l?s?u?l?l?s +?u?l?u?l?s?l?s +?u?l?l?u?l?s?s +?u?l?u?l?l?s?s +?s?l?l?l?l?u?s +?l?s?u?l?l?s?l +?s?u?u?l?l?l?s +?l?l?s?l?s?l?u +?s?l?s?l?l?l?u +?l?d?l?l?d?l?l?l?d +?d?l?d?d?d?d?l?l?l +?d?l?l?d?l?d?l?d?d +?l?s?l?l?l?s?l?l +?s?d?d?u?l?l?l?l +?l?l?l?d?l?l?s?d +?l?s?l?l?d?d?l?l +?u?u?d?d?s?u?u?u +?l?d?l?l?d?l?s?l +?l?l?l?d?l?d?l?s +?d?d?s?d?d?l?l?l?l +?u?s?l?l?s?l?s +?u?s?u?s?u?u?s +?u?s?u?u?s?u?s +?l?s?l?s?s?l?l +?s?l?s?l?l?s?l +?l?s?l?s?l?s?u +?s?l?s?s?l?l?l +?u?s?s?s?l?l?l +?s?s?s?u?l?l?l +?s?s?l?l?s?l?l +?l?l?l?l?l?l?s?d?d?d +?l?l?s?l?l?d?l?l +?l?s?l?l?d?l?l?l +?u?d?l?l?l?l?l?s +?u?d?d?d?d?d?d?d?d?s +?s?l?l?l?s?d?d?d?d +?l?u?l?u?l?d?d?d?d +?l?s?l?s?s?s?s +?u?l?u?l?d?d?s?s +?u?l?l?l?u?l?l?l?d +?s?s?l?l?d?d?s?s +?l?u?d?l?l?l?l?l +?u?l?u?l?u?l?l?d +?d?u?u?u?l?l?l?l +?s?s?s?u?s?s?s +?s?s?s?s?s?s?u +?d?d?d?d?l?l?l?d?d?d?d +?d?l?u?d?d?d?d?d?d +?d?l?d?d?d?d?d?d?u +?d?l?d?d?d?d?d?d?l +?u?d?d?d?d?d?d?l?d +?d?u?d?d?d?d?d?d?l +?d?d?d?d?d?l?u?d?d +?d?d?d?d?u?d?d?d?u +?u?l?u?d?d?d?d?d?d?d +?d?d?d?d?d?u?d?u?d +?u?d?d?d?d?d?l?d?d +?d?d?u?l?d?d?d?d?d +?d?d?u?d?u?d?d?d?d +?d?d?u?d?l?d?d?d?d +?s?s?s?s?s?d?l +?u?d?l?d?l?d?l?d?l +?l?u?l?s?l?l?l +?l?l?u?s?u?l?l +?u?l?l?u?u?l?s +?u?l?u?s?u?l?l +?l?s?l?l?u?l?l +?l?l?u?s?l?l?u +?u?s?l?u?l?l?l +?l?u?u?l?l?l?s +?s?l?l?u?u?u?u +?u?l?u?l?u?u?s +?u?s?l?l?l?l?u +?u?l?l?s?u?l?l?d +?u?l?s?l?u?l?l +?u?l?l?l?l?s?l?d +?u?l?u?l?l?s?l +?l?l?s?l?l?u?l +?u?l?u?l?s?u?l +?u?u?l?s?l?l?l +?d?l?l?l?s?d?d?d?d +?u?l?d?d?l?l?l?u +?u?u?u?d?d?d?l?l?l +?l?d?d?l?l?l?u?l +?d?l?l?l?u?u?u?d +?u?u?u?d?l?l?l?d +?l?d?l?d?l?l?l?u +?l?l?l?l?d?d?l?l?d +?l?d?l?l?d?l?u?u +?l?l?u?u?u?l?d?d +?d?d?l?u?l?l?l?l +?u?l?u?d?d?l?u?l +?l?d?d?u?l?l?l?l +?l?d?l?l?l?l?d?u +?d?l?l?u?l?l?l?d +?u?u?d?d?u?l?l?l +?u?u?d?l?l?l?l?d +?l?l?l?l?s?l?l?s +?l?l?l?l?l?l?l?s?d?d +?d?d?d?d?d?d?d?s?s?s +?d?s?d?s?d?s?l?l +?s?s?l?u?l?s?s +?l?s?l?s?s?l?s +?u?s?s?u?s?s?u +?l?l?s?s?l?s?s +?u?l?l?u?l?l?l?s +?l?l?l?u?l?d?l?l +?l?u?l?d?l?l?l?l +?l?u?l?l?l?d?d?d?d +?d?d?l?l?l?l?d?d?l +?l?l?l?d?d?d?d?u?u +?l?l?s?l?l?l?s?d +?s?d?l?l?l?l?l?s +?l?l?d?d?l?l?l?l?d +?d?l?d?l?d?d?l?d?l +?d?d?l?l?l?d?l?d?d +?d?l?l?l?d?d?d?d?d?d +?u?d?d?d?l?d?d?d?u +?d?d?l?u?l?d?d?d?d +?u?d?d?u?d?d?l?d?d +?d?d?l?d?d?d?l?d?l +?u?l?d?d?u?d?d?d?d +?l?d?l?l?d?d?d?d?d?d +?u?d?d?d?l?l?d?d?d +?l?d?d?d?l?d?d?l?l +?l?d?d?d?l?l?d?d?l +?u?d?l?l?d?d?d?d?d +?l?l?l?d?s?u?u?u +?l?l?d?l?s?l?l?l +?l?d?l?l?l?d?l?l?l +?s?l?s?d?d?d?d?d?d +?l?s?s?d?d?d?d?d?d +?l?l?l?l?s?l?l?d?d +?u?l?u?l?l?l?l?d?d +?u?u?u?u?s?d?d?s +?u?s?l?l?l?s?d?d +?l?s?d?d?s?l?l?l +?l?l?l?l?d?s?d?s +?s?s?s?s?s?d?d?d +?l?d?d?d?l?d?d?d?d?d +?l?d?s?l?d?l?l?l +?u?d?l?l?l?l?d?s +?u?l?l?l?s?u?d?d +?l?d?l?d?s?l?l?l +?d?s?l?l?l?l?l?d +?l?l?l?d?s?l?l?d +?l?d?l?l?d?l?l?l?l +?l?d?d?d?d?s?d?d?d?d +?u?l?l?l?l?l?u?s +?l?l?l?d?d?d?s?s?s +?d?l?d?l?d?l?d?l?d?l +?d?s?s?d?d?d?d?s +?s?d?s?d?d?d?d?s +?d?d?s?d?d?d?s?s +?s?d?d?d?s?d?d?s +?d?d?d?s?d?s?s?d +?d?d?d?s?d?s?d?s +?s?d?s?d?s?d?d?d +?s?s?d?d?d?d?d?s +?s?s?d?d?d?s?d?d +?d?s?d?s?s?d?d?d +?s?d?d?d?s?s?d?d +?l?l?d?d?l?d?d?l?l +?s?d?l?l?l?l?l?l?l +?d?d?d?d?d?s?d?d?s +?d?d?d?d?d?s?s?d?d +?u?u?u?l?l?l?s?d +?s?l?d?l?l?l?l?l +?s?l?l?l?l?d?l?l +?u?l?l?l?l?u?l?l?l +?u?u?u?u?u?s?s?s +?l?l?u?d?l?l?l?l +?u?l?l?u?l?l?u?d +?d?d?d?d?d?d?u?l?l?l +?d?d?l?l?l?l?l?l?s +?l?u?s?d?d?d?d?s +?s?l?d?l?d?d?d?s +?l?s?d?d?d?d?l?s +?s?u?s?u?d?d?d?d +?s?u?l?s?d?d?d?d +?s?s?u?u?d?d?d?d +?u?s?u?d?d?d?d?s +?s?s?d?d?l?d?d?l +?u?s?d?d?d?d?s?l +?s?d?l?d?d?l?d?s +?d?d?d?d?u?s?l?s +?d?s?d?s?d?l?l?d +?l?s?l?d?s?d?d?d +?d?d?d?d?u?s?u?s +?u?s?s?u?d?d?d?d +?s?d?d?s?l?l?d?d +?d?s?d?l?d?l?d?s +?s?d?d?l?l?s?d?d +?u?d?d?s?u?d?d?s +?d?d?s?u?l?s?d?d +?l?l?d?s?d?d?d?s +?s?d?d?u?u?d?d?s +?s?s?d?d?l?l?d?d +?d?d?l?d?d?l?s?s +?l?l?d?d?d?s?d?s +?d?d?s?l?d?s?l?d +?l?l?s?d?d?d?s?d +?s?s?d?d?d?d?u?u +?s?d?d?l?d?d?l?s +?l?d?d?s?s?l?d?d +?s?u?l?d?d?d?d?s +?s?s?s?l?l?l?l?l +?u?l?u?l?u?l?u?s +?s?l?l?l?l?l?l?l?s +?l?l?d?l?d?l?l?d?d +?l?l?d?d?d?l?l?l?d +?u?d?d?d?d?d?d?l?s +?l?d?d?d?d?d?d?s?l +?d?d?d?d?l?l?d?d?s +?u?d?d?d?d?d?d?u?s +?l?d?l?d?s?d?d?d?d +?s?l?l?l?l?l?d?d?s +?d?d?d?d?d?d?d?u?l?l +?d?d?d?d?s?s?d?d?d?d +?d?d?d?d?u?d?d?d?d?u +?u?d?d?d?d?l?d?d?d?d +?l?d?l?d?l?l?d?l?l +?d?l?d?l?d?l?s?l +?l?s?l?l?d?d?l?d +?l?l?s?d?l?d?l?d +?d?l?d?l?l?d?l?s +?s?l?d?l?l?d?l?d +?u?u?s?d?d?d?l?l +?u?u?u?d?d?d?u?s +?l?l?d?d?d?l?s?l +?u?d?l?d?u?d?l?s +?u?d?d?d?s?u?u?u +?u?d?d?d?l?l?l?s +?l?s?l?d?d?d?l?l +?l?l?l?d?d?d?s?u +?u?d?l?l?s?l?d?d +?s?d?l?l?d?d?l?l +?s?l?d?l?l?l?d?d +?l?l?s?d?l?l?d?d +?l?d?l?d?l?l?s?d +?l?s?l?d?l?d?l?d +?l?u?u?u?s?d?d?d +?l?u?l?u?s?d?d?d +?u?s?l?u?l?d?d?d +?l?s?d?d?l?d?l?l +?l?d?l?l?d?l?s?d +?d?d?l?l?s?l?l?d +?u?s?l?l?l?d?l?l +?l?l?l?d?l?s?l?l +?l?l?d?l?l?s?l?l +?l?l?l?d?l?l?s?l +?d?s?u?l?l?l?l?l +?s?s?l?s?l?s?s +?l?l?u?u?u?u?u?u +?u?l?l?l?l?l?l?s?d +?l?l?l?l?l?l?u?d?d +?d?l?d?d?l?l?l?d?d +?l?d?d?l?d?d?l?d?l +?d?u?d?u?d?u?d?u?d +?l?d?d?l?l?d?d?l?d +?l?d?d?d?l?d?l?l?d +?u?l?d?d?d?d?d?l?l +?d?d?l?d?l?d?l?d?l +?l?d?d?l?d?d?d?l?l +?l?l?l?u?u?u?d?d?d +?l?l?l?l?u?l?d?l +?l?l?l?u?l?l?d?l +?d?u?l?l?l?l?l?u +?l?l?l?l?d?l?u?l +?l?d?u?l?l?l?l?l +?s?u?l?l?d?d?d?s +?d?d?d?u?u?u?s?s +?s?u?u?u?u?s?d?d +?u?u?u?s?d?d?s?d +?l?l?d?d?u?u?s?s +?u?u?s?s?l?l?d?d +?d?l?d?l?s?u?s?u +?s?l?s?l?l?d?d?d +?d?u?l?l?l?l?l?l?l +?l?l?s?l?l?l?d?d?d +?d?d?d?d?d?d?d?l?l?s +?l?l?l?l?l?l?l?s?s +?u?u?u?u?l?d?l?d +?u?u?d?d?u?u?l?l +?l?l?l?l?u?d?d?u +?u?d?u?l?l?l?l?d +?u?d?l?l?l?l?d?u +?d?u?u?d?l?l?l?l +?u?l?u?l?d?d?u?u +?l?d?l?l?d?l?d?l?l +?d?l?l?u?u?l?l?d +?u?l?l?l?u?d?l?d +?u?u?u?u?l?d?d?l +?u?u?u?l?l?d?d?l +?u?u?l?d?d?u?u?u +?d?u?u?u?d?l?l?l +?l?l?l?d?u?d?l?l +?u?l?l?d?d?u?u?u +?d?l?l?l?d?u?u?u +?u?d?l?l?l?u?d?l +?u?u?l?u?l?l?d?d +?l?u?l?l?l?d?d?l +?u?l?d?l?l?d?l?u +?d?d?u?l?l?l?u?l +?u?l?d?l?u?l?d?l +?l?l?d?l?l?d?u?u +?l?s?l?s?d?d?d?d?d +?d?l?l?l?l?l?l?l?l?l +?s?d?s?s?d?s?s +?s?s?d?s?s?s?d +?d?s?s?s?s?s?d +?l?u?u?u?d?l?s +?d?l?l?l?u?l?s +?u?s?u?l?u?d?u +?u?s?l?u?d?l?l +?s?l?l?l?d?u?u +?u?l?u?l?s?d?u +?l?u?l?u?u?s?d +?l?l?s?l?l?d?l?d +?u?s?u?d?u?u?u?u +?d?u?u?u?s?l?l +?u?l?l?u?d?l?s +?l?l?l?u?d?s?l +?l?u?s?d?u?u?u +?u?s?u?l?l?d?l +?u?l?l?d?s?u?u +?l?l?u?s?d?l?l +?l?l?u?d?l?s?l +?l?l?l?s?l?d?d?l +?u?l?s?u?d?l?u +?l?u?l?d?s?l?l +?l?s?u?u?d?l?l +?l?u?l?u?s?l?d +?l?l?l?d?l?u?s +?l?u?l?s?l?d?l +?l?l?d?l?l?u?s +?l?s?l?d?u?l?l +?l?s?l?d?l?u?u +?u?l?l?u?u?s?d +?l?d?l?l?l?u?s +?u?l?u?d?l?l?s +?u?d?l?s?u?l?l +?u?u?d?l?l?s?u +?u?l?s?l?l?d?u +?d?l?s?l?l?l?u +?l?u?u?u?u?d?s +?l?l?l?d?u?u?s +?u?l?l?d?u?l?s +?d?s?u?u?l?l?u +?l?s?d?u?u?u?u +?s?u?l?d?l?u?l +?d?u?l?u?s?l?u +?l?s?l?u?l?d?u +?l?d?l?s?l?u?l +?s?l?l?d?u?l?l +?u?u?l?s?d?u?l +?l?d?l?l?u?l?s +?u?l?u?s?l?d?u +?u?l?u?s?l?d?l +?s?u?d?l?l?l?l +?l?u?u?l?s?l?d +?u?d?l?u?l?l?s +?l?s?l?u?d?l?u +?l?s?l?u?d?l?l +?u?u?l?d?l?l?s +?l?l?d?u?u?u?s +?u?l?u?s?u?l?d +?u?d?l?s?l?l?u +?s?l?u?l?d?l?u +?u?l?d?l?s?u?l +?d?l?u?l?s?l?l +?u?l?d?u?s?u?u +?l?d?l?s?u?l?l +?u?l?l?u?u?d?s +?l?l?s?l?l?u?d +?l?d?l?s?l?d?l?l +?d?l?u?l?l?s?l +?l?d?u?l?l?u?s +?d?u?l?l?u?l?s +?s?u?l?u?u?d?l +?u?u?u?u?d?u?s +?u?l?l?u?s?d?l +?u?l?u?d?s?l?l +?u?s?u?l?l?u?d +?u?l?s?d?u?l?u +?u?l?s?d?u?l?l +?l?l?l?u?d?s?u +?d?l?s?u?u?l?l +?u?u?u?s?l?l?d?d +?u?l?l?l?d?s?u +?s?d?l?l?u?l?l +?l?l?d?l?s?u?l +?u?d?u?s?u?l?u +?l?l?d?u?l?u?s +?u?u?u?s?l?d?l +?l?l?s?u?d?u?l +?l?s?d?l?l?l?l?d +?u?u?u?l?d?s?l +?u?u?u?l?u?d?s +?u?s?u?u?d?l?l +?l?l?u?s?l?d?l +?l?d?s?l?u?l?l +?l?s?u?l?l?l?d +?l?l?l?s?u?d?l +?l?l?l?s?u?d?u +?d?l?l?l?l?s?u +?u?l?d?s?l?u?u +?u?l?d?u?u?u?s +?u?u?u?u?l?s?d +?s?u?l?l?l?d?l +?d?l?l?l?s?u?u +?u?s?l?l?u?l?d +?d?s?l?l?l?u?l +?s?d?d?u?u?u?u?u +?u?u?s?u?d?l?l +?l?s?l?u?l?l?d +?u?s?l?l?l?d?u +?u?u?u?l?l?d?d?s +?l?l?u?u?u?s?d +?d?s?u?l?l?l?u +?d?l?s?l?l?u?l +?u?d?l?u?l?s?u +?u?l?d?u?l?l?s +?u?l?l?d?l?u?s +?u?d?s?u?u?u?u +?l?u?s?d?l?l?l +?u?d?s?u?l?l?l +?l?s?d?l?u?l?u +?u?l?l?u?s?u?d +?l?l?s?l?d?l?u +?u?s?l?l?u?d?l +?u?u?u?l?l?s?d?d +?s?l?l?l?u?d?l +?l?s?u?d?l?u?l +?d?s?l?l?l?l?u +?u?l?l?s?u?d?l +?l?l?u?u?d?u?s +?s?l?l?u?l?u?d +?u?u?u?l?l?d?s +?u?d?l?l?u?s?u +?u?s?d?u?l?u?l +?s?l?u?l?l?l?d +?l?d?s?l?u?u?u +?u?l?u?l?d?u?s +?u?d?u?l?u?l?s +?u?l?d?s?u?l?u +?l?s?l?d?d?l?l?l +?l?l?d?l?s?l?u +?u?s?l?l?l?u?d +?u?s?d?l?l?u?l +?u?l?s?u?l?d?u +?u?u?l?u?l?d?s +?u?u?u?u?s?l?d +?d?u?l?s?u?l?u +?u?d?l?l?s?u?l +?s?d?l?l?l?l?u +?l?u?d?l?l?l?s +?d?l?u?l?l?l?s +?u?u?u?d?s?u?u +?l?s?u?l?d?l?u +?d?l?l?u?s?l?l +?s?d?l?u?l?u?l +?s?l?l?d?l?l?u +?u?u?u?u?d?s?u +?l?l?l?d?l?s?u +?l?l?d?l?u?l?s +?l?l?u?u?u?d?s +?u?d?u?u?u?s?l +?l?l?l?d?s?u?l +?l?l?l?d?s?u?u +?l?u?u?d?u?l?s +?u?u?l?l?u?s?d +?l?l?d?l?s?u?u +?s?d?l?u?l?l?l +?s?u?l?l?l?d?u +?s?l?l?d?l?u?u +?u?u?u?l?d?u?s +?d?l?l?l?s?u?l +?u?u?d?l?u?l?s +?l?l?l?u?l?d?s +?u?l?d?l?s?l?u +?d?l?u?s?l?l?u +?u?l?d?u?l?u?s +?u?l?u?d?l?s?l +?u?u?s?u?d?u?u +?l?d?l?s?l?l?u +?s?l?l?l?u?u?d +?s?l?l?u?d?l?l +?l?l?u?l?d?l?s +?l?l?l?s?u?l?d +?u?s?l?l?u?u?d +?u?u?d?u?u?s?u +?l?s?d?l?l?u?l +?l?l?u?u?d?l?s +?l?s?u?l?d?u?l +?l?s?l?l?l?d?u +?u?s?u?d?u?l?l +?l?d?u?l?s?l?u +?u?l?l?u?l?d?s +?s?l?u?d?l?l?u +?d?u?l?l?s?l?l +?u?d?u?l?l?l?s +?u?u?d?l?l?l?s +?s?d?u?l?l?u?u +?l?d?s?l?l?u?l +?u?u?l?l?s?d?u +?l?l?s?l?d?u?l +?l?u?u?u?d?s?l +?l?u?l?l?l?s?d +?u?l?u?s?d?u?l +?u?l?l?d?d?s?l?l +?u?s?u?d?l?u?l +?l?s?u?u?u?d?u +?l?l?d?d?d?d?d?d?d?d?d?d +?l?d?s?s?d?l?s?l +?d?d?s?s?s?s?d?d +?s?d?s?d?s?d?d?s +?s?d?d?s?s?d?d?s +?s?d?d?d?d?s?s?s +?u?l?u?d?l?u?d?d +?d?u?l?d?l?d?l?l +?u?u?d?l?d?l?d?l +?l?d?l?u?l?l?d?d +?u?l?l?u?d?l?d?d +?u?d?d?l?l?d?u?l +?d?u?u?d?u?d?u?u +?d?u?u?l?l?d?d?l +?u?u?u?d?d?u?d?u +?d?d?l?l?d?u?u?u +?u?l?d?l?d?d?l?u +?l?l?d?l?u?u?d?d +?u?l?d?d?d?u?u?l +?l?d?l?u?d?d?u?u +?l?l?d?u?d?l?u?d +?u?d?d?d?u?l?u?l +?u?u?d?d?l?l?l?d +?l?u?u?u?d?d?l?d +?u?d?d?u?l?l?d?l +?u?d?d?d?l?l?u?u +?d?u?u?d?u?u?d?u +?u?u?u?d?l?l?d?d +?u?l?l?d?d?u?u?d +?u?l?u?d?d?l?d?u +?u?l?d?d?l?u?d?l +?d?d?d?l?l?u?u?l +?u?d?u?d?l?l?l?d +?l?d?l?d?l?l?l?l?d +?u?l?u?d?d?d?l?u +?u?l?u?l?d?d?d?u +?l?d?d?u?l?l?u?d +?l?d?u?d?l?d?u?u +?l?l?l?d?d?u?l?d +?u?d?u?u?u?l?d?d +?l?u?l?l?d?d?l?d +?u?d?l?u?d?l?l?d +?u?d?l?d?u?d?l?u +?l?d?d?l?l?d?u?u +?u?u?u?d?l?u?d?d +?u?u?l?l?d?d?u?d +?l?l?u?u?d?l?d?d +?l?u?l?d?d?u?l?d +?u?l?l?d?u?d?d?l +?u?d?d?u?u?d?u?u +?l?l?l?l?d?d?u?d +?d?l?l?l?d?l?d?u +?u?u?u?d?d?d?l?u +?d?l?l?d?u?l?l?d +?u?d?l?u?d?l?d?u +?d?u?l?l?u?l?d?d +?d?l?l?l?d?d?l?u +?l?d?d?l?d?l?u?u +?l?d?l?l?l?l?d?l?d +?d?u?l?u?d?d?u?l +?u?d?u?d?d?l?l?l +?u?d?u?d?d?l?l?u +?u?l?l?l?d?d?u?d +?l?l?l?d?u?l?d?d +?d?l?d?d?l?l?l?u +?u?d?d?u?d?u?u?u +?u?d?d?l?l?u?d?l +?u?l?l?d?u?d?l?d +?u?l?l?d?d?u?d?l +?d?u?l?u?u?l?d?d +?u?d?l?l?d?l?d?u +?d?d?d?u?u?u?u?l +?l?d?l?d?d?l?l?u +?d?d?u?l?d?l?u?l +?u?u?u?u?d?l?d?d +?u?u?d?d?d?d?u?u?u +?l?d?l?d?u?l?d?u +?u?u?d?d?d?u?l?l +?l?l?u?l?d?l?d?d +?u?l?u?d?l?l?d?d +?l?l?d?u?d?l?d?u +?u?d?u?d?u?d?u?l +?d?u?l?l?l?d?u?d +?l?l?u?d?l?d?l?d +?u?d?d?u?l?d?l?l +?l?d?d?d?u?u?l?l +?u?d?d?d?u?u?u?l +?d?d?u?u?u?d?l?l +?u?u?u?l?d?d?d?l +?u?d?u?d?l?l?d?l +?u?u?d?u?d?d?u?u +?u?l?d?l?u?u?d?d +?l?d?l?l?d?l?d?u +?u?d?l?l?d?u?u?d +?d?u?l?l?l?d?d?u +?l?d?l?l?d?d?u?l +?l?d?l?l?d?d?u?u +?d?u?d?l?u?l?u?d +?l?l?u?l?u?d?d?d +?d?l?u?l?u?l?d?d +?u?l?d?d?d?l?l?u +?u?u?d?d?d?u?u?l +?u?l?d?u?l?u?d?d +?d?l?l?l?l?u?d?d +?l?l?l?d?l?u?d?d +?u?u?d?d?u?l?l?d +?l?l?d?d?u?u?d?l +?l?u?l?d?d?l?l?d +?d?d?l?d?d?d?d?l?d?d +?d?d?d?d?l?d?d?l?d?d +?l?s?s?d?s?s?l +?s?s?l?l?s?s?d +?s?s?l?s?l?s?d +?s?s?s?l?s?l?d +?s?s?s?s?d?l?l +?s?l?s?d?s?l?s +?l?s?s?l?s?s?d +?d?s?l?s?l?s?s +?s?s?s?s?l?l?d +?d?l?l?s?s?s?s +?s?s?s?s?l?d?l +?s?l?s?l?s?s?d +?l?l?l?l?d?l?d?l?d +?l?l?l?u?l?u?u +?u?u?l?u?u?u?l +?u?l?d?l?l?u?l?l +?u?l?u?u?u?l?l +?l?u?l?u?u?l?l +?l?u?l?u?u?u?l +?l?l?u?u?u?u?u?d +?l?u?u?l?u?l?u +?l?u?l?l?d?l?l?l +?d?l?l?l?l?u?u?u +?l?l?u?l?d?l?l?l +?l?l?u?l?u?u?l +?u?u?u?l?u?u?l +?d?d?l?l?d?d?l?l?d?d +?l?s?d?d?s?d?d?d?d +?s?s?l?d?d?d?d?d?d +?u?l?l?l?u?l?l?l?l +?s?s?s?l?l?d?d?d +?u?l?d?d?d?s?s?s +?s?s?s?d?d?d?l?l +?l?l?s?d?d?d?s?s +?l?s?l?s?d?d?s?d +?d?l?l?l?l?l?l?d?l +?l?l?l?l?s?d?d?d?d?d +?d?l?l?l?u?u?u?s +?l?l?l?d?u?u?u?s +?l?l?d?d?d?l?d?d?d?d +?l?d?l?l?d?l?d?d?l +?u?u?d?d?d?d?l?l?l +?l?l?l?d?l?d?l?d?d +?d?d?u?l?l?l?u?d?d +?u?s?l?s?l?l?s +?s?s?s?u?l?u?l +?u?u?s?s?s?l?l +?s?u?s?l?l?l?s +?s?l?l?s?l?s?l +?u?s?s?s?u?u?u +?l?s?s?l?l?s?l +?u?s?u?s?u?s?l +?u?u?s?s?s?u?u +?l?s?u?s?u?s?u +?s?u?u?u?u?s?s +?u?u?u?d?d?d?d?d?d?d?d +?l?l?d?l?l?l?d?l?l +?l?u?u?u?u?u?u?d?d +?u?u?u?s?l?l?l?l +?d?d?l?l?s?s?u?u +?l?s?l?s?l?l?d?d +?l?l?l?d?d?l?s?s +?s?l?d?d?l?l?l?s +?l?l?d?d?s?s?l?l +?d?l?d?l?l?d?l?d?d +?d?d?d?l?l?l?d?d?l +?d?l?d?l?d?l?l?d?d +?d?l?l?l?d?l?d?d?d +?u?l?d?l?l?d?d?d?d +?l?l?l?l?l?s?l?d?d +?l?l?d?l?l?l?l?d?l +?s?s?l?l?s?s?l +?s?u?u?u?s?s?s +?s?l?l?l?s?d?d?s +?l?l?l?l?s?s?d?d?d +?l?l?l?l?u?d?l?l +?u?l?l?l?d?l?l?u +?l?l?u?l?l?l?d?l +?u?l?l?d?l?l?l?u +?l?d?l?u?l?l?l?l +?l?l?u?l?l?d?d?d?d +?l?l?s?l?l?l?d?l +?u?l?l?l?d?l?l?s +?u?l?u?l?u?l?s?d +?l?l?l?l?l?s?s?d?d +?l?l?s?l?l?l?l?s +?d?l?l?l?l?l?d?l?l +?l?l?l?l?l?l?u?s +?u?d?d?d?d?d?d?s?d +?u?s?d?d?d?d?d?d?d?d +?d?d?d?l?d?d?s?d?d +?d?d?d?d?u?d?d?d?s +?s?d?d?d?d?l?d?d?d +?d?d?d?s?l?d?d?d?d +?d?l?s?d?d?d?d?d?d +?d?d?d?d?d?l?s?d?d +?s?d?d?d?d?l?l?l?l +?l?l?l?u?s?s?u +?l?s?l?l?s?l?u +?l?l?l?u?u?s?s +?s?l?s?u?l?l?l +?u?l?l?s?u?s?u +?u?s?u?l?s?u?l +?s?u?l?u?l?l?s +?l?l?l?s?s?l?u +?s?u?u?u?l?l?s +?l?l?u?l?l?s?s +?s?u?l?l?u?l?s +?u?u?u?u?s?l?s +?l?l?s?l?s?u?u +?s?l?l?s?u?l?l +?u?u?s?s?l?l?l +?u?u?u?s?u?s?u +?s?l?s?l?l?u?l +?u?s?l?u?s?l?l +?s?l?u?u?u?u?s +?s?l?l?s?l?l?u +?l?l?l?l?d?s?s?s +?d?d?u?d?d?d?d?d?d?d +?u?l?u?l?l?u?l?l +?s?l?l?l?d?d?l?l +?u?l?u?l?l?s?d?d +?d?l?l?l?s?l?l?d +?s?l?l?l?l?d?d?l +?d?d?l?l?l?s?l?l +?l?d?s?d?l?l?l?l +?l?d?d?l?l?s?l?l +?l?d?l?d?l?l?s?l +?l?l?s?d?l?l?l?d +?u?d?d?d?d?u?u?d?d +?d?l?l?d?d?d?d?d?l +?d?d?d?l?d?d?l?l?d +?u?d?d?u?u?d?d?d?d +?l?l?l?d?d?s?d?d?d?d +?d?d?l?d?l?d?d?d?l +?d?u?l?l?d?d?d?d?d +?u?l?d?d?d?d?u?d?d +?d?u?u?u?d?d?d?d?d +?l?d?d?d?d?d?d?u?l +?d?d?d?l?u?l?d?d?d +?d?d?d?d?u?d?d?u?u +?d?l?d?d?l?d?l?d?d +?d?d?l?d?d?d?l?l?d +?l?s?s?s?s?s?l +?d?d?l?l?u?u?l?l +?l?l?l?d?l?l?d?u +?u?l?u?l?l?l?d?d?d +?l?d?l?l?l?d?l?l?d +?u?l?u?d?d?l?l?l +?u?l?u?u?u?l?d?d +?d?u?l?l?l?l?d?l +?u?l?u?l?d?d?u?l +?d?u?l?l?l?d?u?l +?u?u?l?l?d?d?u?u +?u?u?u?d?d?u?l?l +?u?l?d?l?u?d?l?l +?u?l?l?u?l?d?l?d +?u?l?l?d?u?d?l?l +?u?l?l?u?d?d?l?l +?u?d?l?l?l?l?u?d +?d?u?u?l?l?l?l?d +?u?u?u?u?l?l?l?d?d +?l?u?l?l?d?l?d?l +?u?l?l?l?d?u?l?d +?l?u?u?u?u?d?u?d +?u?l?d?u?l?d?u?l +?u?l?d?d?u?l?u?l +?u?l?d?u?l?u?d?l +?d?d?d?d?d?d?l?l?l?s +?l?l?l?l?d?l?s?l +?l?l?l?l?d?s?d?d?d +?u?u?u?u?u?u?l?l +?l?d?l?d?d?d?d?d?s +?d?d?l?l?s?d?d?d?d +?s?u?u?d?d?d?d?d?d +?s?d?d?l?l?d?d?d?d +?l?l?d?s?d?d?d?d?d +?l?l?d?d?d?d?d?s?d +?s?l?l?l?l?d?l?s +?u?l?u?l?d?l?l?l +?u?d?l?u?l?l?l?l +?l?l?d?l?l?l?u?l +?l?d?l?l?l?u?l?l +?l?l?d?l?l?u?l?l +?l?l?u?l?l?d?l?l +?u?d?l?l?u?l?l?l +?l?l?l?d?l?u?l?l +?l?d?l?l?l?l?u?l +?d?s?d?s?d?d?d?d?s +?d?s?d?d?s?d?s?d?d +?d?d?l?d?d?d?d?d?d?l +?u?u?s?u?u?s?d?d +?l?l?d?l?l?d?s?s +?u?l?s?l?l?s?d?d +?u?u?s?s?d?d?l?l +?l?d?d?l?l?l?s?s +?s?u?l?l?l?s?d?d +?l?s?l?l?s?l?l?l +?u?s?u?s?u?s?u?s +?d?l?d?l?l?d?d?u +?l?l?d?d?u?d?d?l +?l?d?d?d?u?l?u?d +?u?d?l?l?d?d?d?u +?l?l?d?d?u?l?d?d +?d?l?d?d?d?l?l?u +?u?l?u?d?d?u?d?d +?d?d?u?l?u?d?l?d +?d?d?u?d?l?u?l?d +?u?d?l?d?d?l?d?l +?d?l?d?u?d?u?l?d +?u?d?l?u?d?d?l?d +?l?d?u?u?l?d?d?d +?u?d?d?d?u?d?u?l +?d?l?d?l?u?d?u?d +?u?u?d?l?d?l?d?d +?d?d?u?d?l?l?d?l +?d?d?u?d?l?l?d?u +?u?d?d?d?l?u?l?d +?u?u?l?d?d?d?l?d +?d?d?l?l?d?u?d?l +?l?d?d?d?l?l?u?d +?u?d?u?l?d?u?d?d +?d?d?u?u?l?d?d?u +?l?d?d?u?d?l?d?l +?d?l?d?d?d?l?u?u +?l?d?u?d?d?l?l?d +?l?d?l?d?u?l?d?d +?d?d?u?d?l?d?u?u +?d?d?u?d?l?d?u?l +?l?u?d?l?d?d?l?d +?d?d?d?l?d?l?u?u +?u?d?d?u?u?d?d?l +?d?d?l?d?d?u?u?l +?d?d?l?d?d?l?u?u +?l?u?u?d?l?d?d?d +?d?u?u?l?u?d?d?d +?u?l?d?d?d?u?u?d +?u?d?u?d?u?d?d?l +?d?d?l?d?l?l?u?d +?d?u?u?d?l?d?d?l +?l?u?d?d?l?d?d?l +?d?l?d?u?u?d?d?u +?l?u?l?d?u?d?d?d +?u?d?l?d?d?d?u?u +?u?d?l?d?d?d?u?l +?d?l?u?l?d?u?d?d +?l?d?l?d?d?d?u?u +?l?d?l?d?d?d?u?l +?d?d?u?u?l?u?d?d +?l?l?d?d?d?l?d?d?l +?d?l?d?d?d?u?l?l +?d?u?l?l?d?d?d?l +?u?d?d?u?d?u?l?d +?d?d?u?d?u?u?d?u +?u?d?d?u?d?d?u?l +?l?d?d?d?u?l?d?l +?u?d?d?d?l?u?u?d +?l?d?d?l?d?u?d?u +?l?u?d?l?d?l?d?d +?u?d?d?u?u?d?l?d +?l?u?d?d?d?l?l?d +?d?d?u?d?u?d?l?u +?u?u?d?u?d?l?d?d +?l?d?d?l?d?d?l?u +?u?d?d?u?d?l?l?d +?u?d?d?l?d?d?l?u +?d?l?d?u?l?d?d?u +?u?d?u?l?d?d?l?d +?l?l?d?d?d?u?l?d +?d?l?l?d?d?u?l?d +?u?u?l?d?u?d?d?d +?d?d?l?l?d?u?u?d +?d?u?l?l?d?d?d?u +?l?l?u?d?d?d?l?d +?d?d?l?d?l?l?d?u +?l?d?d?d?u?l?d?u +?d?l?d?u?u?l?d?d +?u?d?l?d?u?l?d?d +?l?u?u?d?d?l?d?d +?l?l?u?d?d?d?d?u +?d?d?l?d?l?d?u?l +?u?d?d?u?l?d?l?d +?d?d?d?u?l?d?l?l +?d?d?l?d?u?l?d?l +?u?l?d?d?l?d?u?d +?d?u?d?l?d?u?u?d +?l?d?u?d?d?d?u?u +?u?l?d?l?d?u?d?d +?d?d?d?u?u?d?l?u +?d?d?u?u?l?d?l?d +?d?u?d?u?u?d?u?d +?d?u?d?d?l?l?u?d +?d?u?d?u?l?d?l?d +?l?d?d?l?l?d?u?d +?l?d?d?d?l?l?d?u +?d?u?l?d?d?d?u?l +?u?d?l?d?d?u?d?u +?l?d?d?d?d?l?l?l?d +?d?l?d?l?d?u?d?u +?d?d?d?l?l?d?l?u +?d?u?d?l?l?d?d?l +?d?l?u?u?d?d?d?u +?d?l?l?u?d?d?u?d +?d?u?d?u?u?d?d?l +?u?l?l?u?u?d?d?d?d +?l?d?l?d?d?d?d?l?l +?u?l?l?l?d?d?s?d?d +?u?d?d?l?d?u?u?d +?l?d?u?d?d?d?u?l +?d?l?l?d?d?u?u?d +?u?d?u?u?d?d?d?l +?d?d?u?l?d?u?l?d +?d?l?d?d?l?d?l?d?l +?l?d?d?u?l?d?l?d +?l?d?l?d?u?d?d?u +?d?d?u?d?l?u?d?l +?u?d?d?d?u?d?l?l +?l?u?u?d?u?d?d?d +?d?d?d?l?d?u?u?u +?l?l?d?d?l?d?d?u +?l?l?d?d?u?d?u?d +?d?l?d?u?d?l?u?d +?d?d?d?l?l?u?d?l +?l?u?d?d?d?d?u?u +?u?d?d?l?d?l?u?d +?u?u?d?l?d?d?d?l +?d?l?u?d?d?u?u?d +?u?d?u?u?u?d?d?d?d +?l?u?d?u?d?u?d?d +?u?l?d?d?u?d?d?u +?d?l?u?u?l?d?d?d +?u?l?l?d?d?u?d?d +?d?l?l?d?l?u?d?d +?l?d?d?d?l?l?d?l?d +?u?u?d?d?d?l?d?u +?d?d?l?l?d?l?d?u +?u?l?d?u?d?d?d?l +?d?l?l?d?d?l?u?d +?d?u?u?l?l?d?d?d +?d?u?u?d?l?l?d?d +?d?l?l?u?l?d?d?d +?d?d?u?l?d?u?u?d +?l?d?d?d?d?l?u?l +?d?d?l?u?d?l?u?d +?u?u?d?d?d?u?l?d +?d?d?u?l?l?d?u?d +?d?d?d?l?l?d?u?l +?d?l?d?l?l?u?d?d +?l?d?d?d?d?u?u?l +?u?d?d?d?d?l?u?l +?d?u?d?d?l?l?d?l +?d?l?d?d?u?u?l?d +?u?d?u?d?d?l?d?l +?d?u?u?d?l?d?u?d +?u?d?d?u?l?d?d?u +?d?d?u?u?d?l?l?d +?d?l?d?u?l?l?d?d +?l?d?d?l?d?u?l?d +?d?u?l?d?d?u?d?l +?u?d?d?l?d?l?d?u +?u?d?d?u?u?l?d?d +?d?u?d?l?u?d?l?d +?d?l?d?l?d?l?d?l?s +?l?d?d?d?u?u?d?l +?d?d?u?l?l?d?d?l +?l?d?d?l?l?d?d?l?l +?d?l?d?d?l?u?l?d +?d?u?d?l?l?d?l?d +?d?l?l?d?d?d?u?u +?d?l?d?u?u?d?l?d +?l?l?d?d?l?d?u?d +?d?u?d?d?u?l?d?l +?l?d?d?u?l?u?d?d +?d?l?d?d?l?d?u?l +?l?l?l?d?u?d?d?d +?d?d?d?u?l?u?l?d +?d?u?d?u?d?l?d?l +?l?d?u?d?l?d?d?u +?l?d?u?u?d?d?l?d +?d?d?u?l?l?d?l?d +?d?l?d?d?u?l?d?l +?u?u?d?d?d?d?l?u +?d?u?d?u?d?u?l?d +?u?d?u?l?u?d?d?d +?d?d?l?l?u?d?d?l +?d?l?d?l?d?u?d?l +?u?d?u?d?d?d?u?l +?l?d?d?l?l?d?l?l?d +?d?u?l?d?d?d?l?u +?l?l?d?d?u?d?l?d +?l?d?l?u?d?u?d?d +?u?d?l?d?u?u?d?d +?d?d?u?u?d?l?u?d +?d?d?d?u?l?l?u?d +?d?d?u?d?d?u?u?l +?d?u?l?u?l?d?d?d +?d?u?d?l?d?d?u?l +?u?l?d?u?d?d?u?d +?u?d?u?l?l?d?d?d +?d?l?d?u?d?u?d?l +?u?l?d?d?d?l?d?u +?l?d?l?l?d?d?u?d +?d?d?u?u?d?d?u?l +?l?d?d?u?u?d?d?u +?u?d?u?d?d?u?l?d +?l?d?d?u?l?d?d?l +?d?d?u?d?d?u?l?u +?l?u?l?u?d?d?d?d?d +?d?u?d?d?d?u?u?l +?l?u?d?u?u?d?d?d +?l?d?d?d?l?u?d?l +?d?d?u?l?u?d?d?l +?d?u?d?d?l?l?d?u +?d?d?l?d?d?l?u?l +?d?d?l?d?d?u?l?l +?d?d?d?u?l?u?d?u +?l?l?d?l?u?d?d?d +?d?l?d?l?d?d?l?u +?d?d?u?l?d?l?d?u +?d?d?u?l?d?l?d?l +?d?d?l?d?u?l?u?d +?d?l?l?d?u?d?u?d +?d?u?l?u?u?d?d?d +?d?d?l?u?u?d?d?l +?l?u?u?d?d?u?d?d +?d?l?d?d?d?u?l?u +?l?d?l?d?d?u?l?d +?d?u?d?u?d?u?d?l +?l?d?d?l?d?l?d?u +?d?d?l?d?l?l?d?l?d +?l?d?d?u?d?u?d?u +?d?u?l?d?l?l?d?d +?u?d?d?l?d?u?d?l +?l?d?d?u?u?d?u?d +?l?u?u?d?d?d?l?d +?d?l?u?d?d?l?l?d +?l?d?d?d?u?u?l?d +?d?l?l?d?l?d?u?d +?d?u?d?u?d?d?l?u +?l?d?u?d?d?u?d?l +?l?l?d?l?d?u?d?d +?d?u?l?l?d?d?u?d +?d?d?u?d?u?u?d?l +?d?l?d?d?l?l?u?d +?u?l?d?l?d?d?l?d +?d?d?d?u?d?u?u?u +?d?l?u?l?d?d?l?d +?d?d?d?u?d?l?l?l +?l?d?l?d?u?u?d?d +?d?l?u?d?l?d?d?u +?d?l?d?d?l?l?d?u +?l?d?u?d?d?l?d?u +?d?l?d?u?d?l?d?l +?l?l?d?u?d?d?d?u +?d?d?d?u?l?d?u?l +?l?d?d?d?u?u?u?d +?d?d?l?u?d?d?u?l +?u?d?l?d?d?u?d?l +?l?d?d?d?d?u?l?u +?u?d?l?d?d?d?l?u +?u?l?d?l?d?d?d?u +?l?l?l?l?l?l?s?l?l +?l?u?u?u?u?u?d?d?d +?u?l?l?l?l?s?s?d +?u?l?l?l?l?d?s?s +?l?l?s?s?l?l?l?d +?s?s?l?l?l?l?l?d +?u?l?l?s?d?l?l?l +?u?u?u?l?l?l?d?s +?u?l?l?d?s?l?l?l +?s?l?l?l?d?l?l?l +?s?u?u?u?u?u?u?d +?l?l?d?l?l?l?s?l +?u?l?l?l?d?l?l?l?l +?l?l?l?s?l?l?d?d?d +?l?l?l?d?s?d?s?d?d +?l?s?d?s?d?s?d?d +?s?l?s?s?d?d?d?d +?s?l?s?d?d?d?d?s +?d?s?d?s?d?d?s?l +?u?s?s?s?d?d?d?d +?d?d?d?d?s?l?s?s +?l?d?s?s?d?d?s?d +?d?d?d?s?s?s?d?l +?l?s?d?d?d?d?s?s +?s?u?s?s?d?d?d?d +?d?d?s?d?s?d?s?l +?l?l?d?d?l?l?d?l?l +?l?l?l?l?s?s?s?l +?l?l?l?l?l?d?l?d?l +?d?d?s?d?d?d?d?d?d?d?d +?d?s?d?s?d?d?d?d?l +?l?l?l?l?s?l?d?d?d +?l?u?l?l?l?d?l?l +?d?l?l?l?u?u?u?u +?d?l?u?l?l?l?l?l +?d?u?l?u?l?l?l?l +?u?l?l?l?l?d?u?u +?u?l?l?l?l?d?l?u +?u?u?u?l?l?l?l?s +?u?u?u?d?d?d?d?l?l +?l?l?d?d?l?l?d?l?d +?s?u?d?u?d?u?d?s +?u?d?s?u?d?s?u?d +?u?s?l?l?s?d?d?d +?u?l?u?s?s?d?d?d +?l?l?s?d?d?d?s?l +?d?d?s?d?s?u?u?u +?u?l?u?s?d?d?d?s +?s?l?l?s?l?d?d?d +?d?d?d?d?d?d?l?d?l?d +?d?d?d?d?u?l?d?d?d?d +?l?l?l?l?l?l?l?l?d?d?d +?s?d?d?d?d?d?l?l?l +?u?u?u?d?d?d?d?d?s +?l?u?u?u?u?u?s?d +?u?s?l?d?l?l?l?l +?u?u?l?l?l?l?s?d +?s?l?l?l?l?l?d?l +?u?l?l?d?d?s?s?s +?l?s?s?s?l?d?d?d +?u?s?u?s?s?d?d?d +?l?s?l?s?d?s?d?d +?l?l?d?d?d?d?l?l?s +?l?l?d?d?l?l?d?d?s +?s?s?s?s?s?s?s?s +?u?l?l?d?d?l?l?s +?u?s?d?d?l?l?l?l +?u?d?l?l?d?l?l?s +?l?l?d?s?d?l?l?l +?u?d?d?s?l?l?l?l +?l?s?l?d?l?l?l?d +?l?s?l?l?l?d?l?d +?u?l?l?l?u?d?d?s +?l?u?u?u?u?d?d?s +?l?l?d?d?l?s?l?l +?s?l?l?l?l?d?l?d +?d?l?d?l?l?l?l?s +?l?l?d?d?s?d?s?d?d +?l?d?d?d?d?d?d?d?d?d?d?d +?d?d?d?d?d?d?d?s?d?d?d +?s?l?l?l?l?l?l?l?l +?l?l?l?s?l?s?l?l +?u?u?d?d?u?u?u?d?d +?d?d?d?l?l?l?l?d?l +?d?l?d?l?l?l?d?l?d +?u?d?l?l?l?l?d?d?d +?d?l?d?l?l?l?l?l?l +?s?l?l?l?s?u?d +?u?d?l?u?s?l?s +?s?l?s?l?d?l?u +?s?l?d?u?l?l?s +?u?u?u?d?s?u?s +?l?l?s?d?l?s?l +?u?s?l?l?s?l?d +?l?s?d?l?u?s?l +?s?u?l?d?l?u?s +?u?l?s?l?u?s?d +?l?l?d?s?l?s?l +?u?l?l?u?s?d?s +?d?l?u?s?s?u?u +?l?l?l?l?d?s?s?d +?l?l?l?u?d?s?s +?l?l?l?u?s?s?d +?u?u?s?u?s?d?u +?u?s?u?s?u?d?u +?u?s?u?s?u?u?d +?u?l?s?d?s?u?u +?l?s?d?l?s?l?l +?s?l?s?u?l?l?d +?u?s?u?u?s?u?d +?l?s?s?d?l?u?l +?u?l?l?d?s?u?s +?l?u?l?s?l?d?s +?u?s?s?u?d?l?l +?u?s?s?d?l?l?l +?u?u?l?d?l?s?s +?u?s?l?l?s?d?l +?u?l?u?s?u?d?s +?u?l?s?d?s?l?l +?s?l?u?s?d?l?u +?l?s?l?l?d?u?s +?s?s?u?u?u?u?d +?l?u?s?s?d?u?u +?u?d?l?l?s?s?l +?u?s?d?u?l?l?s +?l?s?s?u?l?d?l +?u?s?l?l?d?u?s +?d?u?l?l?l?s?s +?d?s?l?l?l?s?u +?s?l?l?l?s?d?u +?s?l?l?l?s?d?l +?u?u?d?l?u?s?s +?d?s?l?s?l?u?l +?l?s?l?s?l?d?l?d +?d?l?l?s?d?l?l?s +?s?l?l?d?s?l?l +?s?l?d?u?l?u?s +?s?u?d?u?u?u?s +?d?s?s?u?u?u?u +?u?s?u?s?l?d?u +?u?s?d?s?l?l?l +?s?l?l?s?d?u?l +?u?d?l?s?u?l?s +?l?u?d?l?s?l?s +?l?l?s?l?u?s?d +?d?s?u?s?l?l?l +?u?s?s?l?l?l?d?d +?d?u?s?s?l?l?l +?s?s?u?l?u?d?l +?l?u?l?u?d?s?s +?u?u?u?l?d?s?s +?u?u?s?d?l?l?s +?s?u?s?l?l?l?d +?u?u?s?u?s?u?d +?s?l?s?l?d?l?l +?d?u?s?l?s?l?u +?l?l?s?u?s?l?d +?u?s?u?s?d?u?u +?s?u?d?l?l?u?s +?l?l?u?l?s?d?s +?s?l?l?l?d?s?l +?s?l?l?l?d?s?u +?s?l?l?d?u?s?l +?u?d?u?l?s?l?s +?u?s?l?s?d?l?l +?u?l?s?d?l?l?s +?l?l?u?s?u?s?d +?u?l?l?u?s?s?d +?l?l?l?s?d?u?s +?u?s?u?s?l?l?d +?l?l?u?s?d?s?l +?u?l?s?s?d?l?l +?l?s?l?s?u?l?d +?u?s?l?s?l?d?l +?l?d?s?l?s?u?l +?u?d?s?l?s?u?l +?s?s?u?l?d?u?l +?s?d?u?l?s?l?u +?u?d?s?s?u?u?u +?l?l?s?u?l?d?s +?s?u?d?u?u?s?u +?u?s?l?d?l?s?u +?l?s?d?s?u?u?l +?u?l?s?l?s?d?u +?l?s?u?d?l?u?s +?s?l?l?u?d?s?u +?u?l?d?d?l?l?s?s +?u?d?u?s?u?u?s +?l?d?u?u?s?s?l +?s?s?d?u?u?u?u +?u?d?l?s?l?s?l +?u?l?l?d?s?s?l +?s?u?u?l?s?u?d +?s?l?s?l?d?u?u +?s?u?l?l?d?u?s +?s?u?u?u?u?d?d?s +?u?l?s?d?s?u?l +?u?s?s?u?d?u?l +?s?u?d?u?u?l?s +?l?l?l?d?u?s?s +?s?s?d?u?l?l?l +?u?s?s?l?u?u?d +?d?l?l?u?s?u?s +?l?l?l?s?u?s?d +?u?u?s?s?l?u?d +?s?u?u?l?l?s?d +?l?s?u?l?d?l?s +?u?d?l?u?l?s?s +?d?d?s?u?u?u?u?s +?d?s?s?u?l?l?l +?u?s?l?d?s?l?l +?l?l?u?l?s?s?d +?s?s?l?u?l?d?l +?s?u?s?d?u?u?u +?s?l?u?l?l?d?s +?u?l?u?s?d?s?l +?u?l?s?l?s?u?d +?l?s?d?l?s?u?u +?u?s?u?u?d?s?u +?s?s?l?l?l?u?d +?u?d?u?u?s?u?s +?l?l?s?d?s?l?l?l +?u?s?d?l?l?s?u +?l?l?l?u?s?d?s +?s?u?u?d?u?u?s +?s?u?s?u?l?l?d +?u?s?l?u?d?s?l +?u?l?d?s?s?u?l +?l?s?u?d?l?s?l +?d?l?s?l?u?s?l +?u?l?d?l?u?s?s +?u?s?u?d?u?u?s +?d?l?s?l?s?u?l +?u?u?s?u?d?u?s +?u?l?s?l?s?l?d +?s?u?l?s?d?l?l +?s?u?s?l?u?l?d +?u?l?d?s?l?s?u +?u?l?l?d?u?s?s +?s?u?d?u?l?s?l +?d?s?u?u?u?u?s +?u?s?s?d?l?l?u +?s?s?u?l?l?l?d +?l?s?u?d?s?l?u +?s?u?l?s?u?l?d +?s?l?u?s?u?l?d +?l?s?u?s?l?d?l +?u?l?u?u?s?s?d +?d?l?s?u?s?u?l +?l?d?s?l?l?u?s +?l?u?s?u?s?d?u +?u?u?s?d?u?u?s +?s?u?l?d?u?l?s +?u?u?l?l?s?d?s +?l?s?l?l?d?s?l +?s?l?l?l?d?d?l?s +?d?l?s?u?l?s?l +?l?l?l?d?l?d?s?s +?l?s?d?l?l?u?s +?u?s?u?l?d?l?s +?u?d?u?u?u?s?s +?u?d?u?u?s?s?u +?l?l?s?d?l?l?s?d +?s?u?l?l?u?s?d +?s?d?s?u?l?l?l +?l?d?l?s?u?s?u +?l?d?l?l?d?l?s?s +?s?l?s?u?l?d?l +?l?l?d?l?s?s?l +?d?l?l?l?s?s?l +?u?s?d?s?u?u?u +?s?s?u?d?u?u?u +?s?s?l?d?u?u?l +?l?l?l?d?l?l?d?l?l +?u?u?s?l?l?l?l?l +?l?l?d?d?s?s?s?s +?d?l?l?l?l?l?u?u +?u?l?l?u?u?l?l?d +?u?l?u?d?u?l?u?l +?u?l?l?u?l?l?d?l +?l?l?l?l?l?u?d?l +?u?l?l?l?l?u?d?l +?u?l?l?l?l?l?l?l?s +?l?d?s?l?l?d?d?l +?u?l?s?l?d?l?d?d +?l?d?l?s?l?l?d?d +?d?l?l?d?l?d?l?s +?u?d?s?l?l?l?d?d +?l?d?l?l?s?u?d?d +?u?d?d?d?s?l?l?l +?l?l?l?d?d?l?s?d +?u?l?u?l?d?d?s?d +?s?d?d?l?d?l?l?l +?s?d?l?d?l?l?d?l +?l?d?s?l?d?l?d?l +?u?u?d?d?d?u?u?s +?u?d?l?s?l?l?d?d +?u?l?d?l?l?s?d?d +?l?l?d?l?d?s?l?d +?s?u?u?l?l?d?d?d +?d?d?d?s?u?l?l?u +?d?d?s?d?u?u?u?u +?d?d?d?u?s?u?u?u +?u?l?l?u?d?d?d?s +?s?d?d?l?l?l?d?l +?s?d?d?l?l?d?l?l +?l?d?d?s?l?l?l?d +?d?l?l?l?d?d?l?s +?l?l?d?l?s?l?d?d +?l?d?l?d?s?d?l?l +?l?l?d?s?l?d?l?d +?l?l?l?u?s?d?d?d +?u?s?d?u?u?u?d?d +?u?u?s?l?l?d?d?d +?u?d?l?l?d?l?d?s +?l?d?d?l?l?l?d?s +?d?u?s?l?l?l?d?d +?u?l?d?d?d?s?l?l +?u?l?u?l?s?d?d?d?d +?l?s?d?l?d?l?l?d +?u?l?l?d?l?s?d?d +?d?l?l?d?l?l?d?s +?u?u?d?d?d?l?l?s +?l?s?l?d?d?l?d?l +?d?l?l?l?d?l?d?s +?s?l?d?d?l?l?l?d +?l?l?l?d?d?l?d?s +?d?d?l?l?d?l?l?s +?s?l?l?l?d?d?d?l +?d?l?d?l?l?l?s?d +?u?u?d?u?u?s?d?d +?l?d?l?s?l?d?d?l +?d?d?d?s?l?l?l?u +?l?d?s?d?d?l?l?l +?d?l?s?l?l?d?d?l +?u?l?d?d?d?l?l?s +?l?l?d?d?l?s?l?d +?l?l?u?u?s?d?d?d +?d?d?d?u?s?l?l?l +?l?s?l?d?l?d?d?l +?u?u?u?s?d?d?d?u +?l?s?l?l?d?d?d?l +?s?l?l?d?l?d?l?d +?l?d?d?l?l?d?s?l +?l?d?d?l?l?d?l?s +?u?l?l?d?d?d?l?l?l +?d?d?l?l?d?l?l?l?l +?d?d?d?d?d?d?d?l?s?l +?l?l?l?d?d?d?d?d?u +?d?d?d?u?u?u?u?u?d?d +?l?d?d?d?d?l?l?d?l +?s?l?s?s?s?d?s +?u?l?l?l?u?l?l?u +?l?l?l?u?u?l?l?l +?u?u?s?u?u?u?l +?u?u?l?u?u?u?s +?u?l?l?l?s?l?u +?u?s?u?u?u?u?u?d +?l?u?s?l?u?l?u +?l?u?s?l?l?l?u +?l?l?l?s?u?l?u +?u?u?u?s?l?u?u +?l?s?l?u?l?u?l +?u?l?l?u?u?s?u +?l?u?u?u?l?u?s +?l?l?u?s?u?u?u +?l?s?l?l?u?l?u +?l?s?u?l?u?l?u +?l?l?s?l?l?u?u +?l?u?u?u?u?l?s +?u?u?l?l?s?l?l +?l?l?s?u?l?l?u +?s?l?l?u?u?u?l +?u?l?u?u?u?l?s +?u?s?l?u?l?u?l +?l?u?l?l?u?s?l +?l?s?u?l?l?l?u +?u?s?u?u?u?l?l +?l?u?s?l?u?u?u +?l?s?l?u?u?u?u +?l?u?l?l?s?l?l +?l?l?u?l?l?s?u +?u?u?l?l?u?l?s +?u?u?u?l?u?u?s +?s?l?u?l?l?l?u +?u?l?u?u?l?u?s +?u?l?l?l?u?s?l +?l?l?l?s?l?l?d?l +?u?l?u?s?l?l?l +?u?l?s?l?l?u?l +?u?l?u?u?s?l?l +?s?u?u?l?l?u?u +?l?l?s?u?l?u?l +?s?u?u?u?u?l?l +?l?l?l?u?l?s?l +?s?u?l?l?l?u?u +?l?u?l?l?l?s?u +?d?d?l?l?l?l?l?d?d?d +?l?u?u?u?d?d?u?u +?u?l?u?l?l?d?d?l +?u?u?u?d?d?l?u?u +?l?l?u?l?u?l?d?d +?l?u?d?d?l?l?l?l +?u?u?l?l?l?d?d?l +?l?d?l?d?u?u?u?u +?u?l?u?d?d?u?l?l +?u?l?d?u?l?l?l?d +?u?l?d?l?l?u?d?l +?d?d?l?l?l?u?l?l +?u?u?l?u?u?u?d?d +?l?d?l?d?l?l?u?u +?d?d?l?l?l?l?u?l +?u?l?l?u?l?d?d?l +?u?d?d?l?l?l?l?u +?l?d?l?l?u?l?l?d +?u?u?d?l?l?l?d?l +?l?l?l?u?d?l?l?d +?l?l?l?d?d?l?u?l +?u?u?l?d?d?u?l?l +?d?d?l?u?l?u?l?u +?l?d?l?l?l?d?l?u +?l?l?d?d?l?u?l?l +?u?u?u?u?l?u?d?d +?d?u?l?d?l?l?l?l +?u?d?d?l?l?u?u?u +?d?l?u?l?l?l?l?d +?d?l?d?l?l?l?l?u +?l?l?l?d?d?u?u?l +?u?u?l?d?d?l?l?l +?u?l?l?d?d?d?d?l?l +?l?l?u?u?u?d?d?d?d +?l?d?l?l?l?d?d?l?d +?d?d?d?l?d?l?l?l?l +?d?l?l?d?l?l?l?d?d +?l?d?d?l?d?d?l?d?d?d +?l?l?l?l?d?d?d?l?l?l +?d?u?d?d?d?d?d?d?d?d +?u?s?s?l?l?s?s +?l?l?s?s?s?s?l +?l?l?l?l?d?d?d?d?l?l +?d?l?d?l?d?l?l?l?l +?s?s?u?s?u?s?s +?l?d?l?d?d?l?d?d?d?d +?l?d?d?l?d?l?d?d?d?d +?l?d?l?l?l?l?d?d?l +?u?l?l?u?l?u?l?d +?d?l?l?l?l?l?u?l +?l?l?d?u?u?l?l?l +?l?l?u?u?l?l?l?l +?u?u?l?l?l?d?l?l +?l?l?l?d?d?d?d?d?d?d?d?d +?s?l?l?d?l?l?l?l +?u?l?l?l?l?u?s?d +?d?d?d?d?s?u?u?u?u +?l?l?d?l?l?l?s?s +?l?d?l?l?d?d?l?d?l +?l?d?l?d?l?d?d?l?l +?d?d?d?d?u?u?u?u?u?u +?l?d?l?l?l?d?l?d?l +?l?l?d?l?d?l?l?d?l +?d?s?d?d?d?d?d?d?s +?d?s?s?d?d?d?d?d?d +?s?d?d?d?d?s?d?d?d +?d?s?d?d?d?d?s?d?d +?u?u?s?u?s?u?s +?s?s?u?u?u?u?s +?s?u?l?u?l?s?s +?s?u?l?s?u?l?s +?u?u?s?u?u?s?s +?s?s?s?u?u?l?l +?l?s?u?s?l?s?u +?u?u?u?s?s?s?u +?u?s?u?u?u?s?s +?s?s?l?s?l?l?l +?u?l?l?u?s?s?s +?u?u?u?u?u?u?d?d?s +?u?l?l?u?l?l?l?u +?l?s?l?l?l?l?l?s +?l?d?l?d?l?l?l?d?l +?l?s?l?d?l?s?l?d +?l?d?l?s?l?d?l?s +?d?d?s?l?l?s?l?l +?l?l?s?s?d?d?l?l +?u?s?u?s?l?d?l?d +?l?d?l?d?l?l?s?s +?u?u?d?d?d?d?d?d?d?d?d +?d?d?d?d?s?l?l?d?d +?d?d?s?d?d?d?d?l?l +?u?u?d?d?s?d?d?d?d +?l?u?s?d?d?d?d?d?d +?d?d?s?l?l?d?d?d?d +?d?d?d?d?d?l?l?d?s +?d?d?d?l?l?s?d?d?d +?d?d?d?d?d?s?d?l?l +?d?d?l?s?l?d?d?d?d +?l?l?l?d?l?d?l?l?l +?l?l?l?l?l?d?l?l?l?l +?s?l?l?l?l?u?d?d +?u?u?u?s?d?d?l?l +?l?u?u?u?u?s?d?d +?u?l?l?s?d?d?l?l +?s?l?d?l?l?d?l?l +?l?s?l?d?l?l?d?l +?l?l?u?l?l?d?d?s +?s?l?d?d?l?l?l?l +?l?d?l?l?d?s?l?l +?d?l?l?s?d?l?l?l +?l?l?s?l?s?l?l?l +?l?l?s?l?l?l?s?l +?l?l?l?d?l?l?d?l?d +?s?d?s?l?l?l?l?l +?s?l?l?l?l?l?s?d?d +?l?d?d?d?d?d?d?d?d?u +?u?l?l?u?l?u?l?l +?u?u?l?l?l?u?l?l +?u?l?d?d?d?d?l?l?l +?l?d?l?d?d?d?l?l?l +?u?l?u?u?l?d?d?d?d +?u?d?d?d?d?d?d?s?s +?s?d?d?d?l?d?d?d?s +?d?d?d?d?d?s?d?s?l +?u?s?d?l?l?l?l?l +?u?s?d?u?l?l?l?l +?d?d?u?l?l?l?d?d?d +?u?u?d?u?u?d?d?d?d +?l?l?u?u?d?d?d?d?d +?u?d?d?d?d?d?l?l?l +?u?u?d?d?d?d?d?l?l +?d?d?l?l?d?l?d?l?d +?d?l?d?d?l?l?d?d?l +?l?d?l?d?d?d?l?d?l +?s?d?d?d?d?d?d?d?d?l +?l?s?l?d?d?d?d?d?d?d +?d?d?l?l?l?d?l?l?l +?l?l?l?l?l?d?d?d?u +?d?u?u?u?u?l?l?l +?u?u?u?u?u?u?d?l +?l?l?l?d?l?l?u?l +?l?l?l?l?d?d?l?l?l?l +?u?d?l?l?l?l?l?u +?l?l?u?u?u?l?l?d +?u?u?l?l?l?l?u?d +?d?d?l?l?l?s?s?s +?s?l?l?l?l?l?s?s +?u?l?l?l?l?u?l?l?d +?d?d?s?u?d?l?u?d +?u?d?d?d?d?s?l?u +?u?d?d?l?d?d?s?l +?l?l?s?d?d?d?l?d +?d?l?s?d?u?d?l?d +?l?s?d?d?d?d?u?l +?u?l?d?d?d?s?d?l +?s?u?d?d?d?d?l?l +?d?u?u?u?d?d?s?d +?u?d?d?d?d?s?l?l +?s?d?u?l?l?d?d?d +?d?d?d?d?l?l?u?s +?d?l?d?l?l?d?s?d +?d?l?d?l?d?l?s?d +?u?l?d?d?u?d?d?s +?d?l?d?u?d?d?s?u +?d?d?d?l?d?s?l?l +?d?d?d?u?s?d?u?u +?d?d?d?d?s?l?u?l +?l?d?l?s?d?d?l?d +?u?u?s?d?l?d?d?d +?s?l?l?u?d?d?d?d +?d?d?s?d?d?u?l?l +?l?u?l?d?d?s?d?d +?l?d?d?l?d?s?l?d +?d?d?u?l?u?d?d?s +?l?d?s?l?u?d?d?d +?u?d?d?s?l?u?d?d +?u?d?u?d?u?d?d?s +?d?d?u?u?s?d?d?l +?u?l?d?d?s?u?d?d +?d?l?d?d?d?l?l?s +?d?d?d?u?u?u?s?d +?d?d?l?d?l?l?s?d +?l?d?d?u?s?d?d?l +?d?d?d?d?u?u?s?u +?d?d?u?u?l?s?d?d +?l?l?d?d?d?d?s?u +?d?d?s?d?l?l?l?d +?u?d?d?d?s?u?u?d +?u?u?s?d?d?d?u?d +?d?d?d?d?u?u?l?s +?u?d?d?u?d?d?u?s +?s?l?d?d?u?l?d?d +?l?d?s?l?d?l?d?d +?l?d?d?l?d?s?d?u +?l?d?d?l?d?s?d?l +?l?s?d?l?d?d?d?l +?u?d?s?d?l?d?l?d +?d?l?l?d?d?d?s?u +?u?s?d?l?d?l?d?d +?u?l?s?d?l?d?d?d +?u?d?d?l?d?d?l?s +?d?d?u?l?s?u?d?d +?d?l?s?u?d?l?d?d +?u?l?d?d?s?d?d?u +?l?l?d?d?l?d?s?d +?d?d?l?d?l?l?d?s +?d?d?d?u?d?l?l?s +?l?l?s?u?d?d?d?d +?u?d?l?l?d?d?s?d +?d?d?u?d?d?u?s?l +?d?l?l?d?d?s?d?l +?s?d?u?d?u?d?u?d +?d?l?d?u?d?l?s?d +?l?s?u?u?d?d?d?d +?l?l?d?d?s?d?l?d +?l?u?s?l?d?d?d?d +?u?l?u?d?s?d?d?d +?l?d?l?l?s?d?d?d?d +?u?s?u?d?d?d?d?l +?d?d?l?u?l?s?d?d +?l?d?d?l?d?l?s?d +?d?d?l?d?d?l?l?s +?u?s?l?d?d?l?d?d +?u?d?s?l?d?l?d?d +?u?u?s?d?d?l?d?d +?l?d?d?s?l?d?l?d +?d?d?u?s?l?u?d?d +?u?u?d?d?d?d?u?s +?d?l?l?d?d?l?d?s +?d?d?s?l?d?l?d?l +?d?u?l?s?l?d?d?d +?s?l?d?d?d?d?l?l +?d?d?l?l?u?s?d?d +?l?l?s?d?l?d?d?d +?u?d?d?d?d?u?u?s +?u?d?d?d?s?d?l?l +?d?d?u?u?d?u?d?s +?l?l?d?s?l?d?d?d +?d?l?l?d?d?d?u?s +?d?d?l?s?l?d?d?l +?u?d?l?d?d?d?l?s +?u?d?l?d?u?s?d?d +?d?s?d?u?u?d?u?d +?l?d?u?d?d?l?d?s +?l?d?d?d?s?l?d?l +?l?d?d?l?s?l?d?d +?u?u?l?d?d?s?d?d +?d?u?l?u?d?s?d?d +?l?d?s?d?d?l?l?d +?l?l?d?d?d?l?d?s +?s?d?d?u?u?u?d?d +?d?d?s?l?u?l?d?d +?u?d?d?s?u?d?d?u +?l?d?l?l?d?d?s?d +?d?u?l?l?d?d?s?d +?d?l?l?d?l?d?s?d +?u?d?l?d?u?d?d?s +?u?s?l?d?u?d?d?d +?u?d?s?d?d?d?l?l +?l?l?d?s?d?d?d?l +?d?d?d?l?s?l?l?d +?u?d?u?d?u?d?s?d +?u?u?d?u?s?d?d?d +?l?d?d?s?l?d?d?l +?s?u?l?d?d?d?l?d +?d?l?s?l?d?d?l?d +?d?d?d?l?d?l?l?s +?d?d?u?u?l?d?d?s +?s?d?u?d?u?d?d?u +?s?l?d?l?d?d?l?d +?s?d?d?d?l?l?l?d +?l?s?d?d?u?d?d?l +?d?d?l?u?l?d?d?s +?l?d?d?d?s?l?l?d +?d?d?d?s?l?d?l?l +?u?l?d?l?s?d?d?d +?s?d?d?d?d?l?u?l +?u?d?u?u?s?d?d?d +?l?l?u?d?d?d?s?d +?d?l?d?d?l?s?d?l +?d?l?d?l?u?d?s?d +?d?s?d?d?u?l?l?d +?u?d?d?s?u?l?d?d +?d?d?u?u?s?u?d?d +?l?s?d?d?d?l?d?l +?u?d?l?s?l?d?d?d +?s?l?u?l?d?d?d?d +?d?s?d?d?u?u?d?u +?s?d?u?u?d?u?d?d +?l?d?l?s?d?l?d?d +?d?u?l?d?d?s?d?l +?s?d?d?d?l?l?d?l +?u?s?l?d?d?u?d?d +?u?d?u?d?d?d?u?s +?s?u?d?d?u?u?d?d +?l?l?d?d?d?s?d?l +?l?s?d?l?d?l?d?d +?d?d?d?s?u?l?l?d +?u?d?u?d?d?d?l?s +?s?l?d?d?l?d?l?d +?l?d?l?d?d?d?s?l +?u?s?d?d?d?d?l?l +?u?s?d?d?d?d?l?u +?d?d?u?d?d?l?l?s +?d?d?s?u?u?d?d?l +?l?u?u?d?d?d?d?s +?l?d?s?d?d?d?l?l +?s?d?l?l?d?l?d?d +?u?u?d?d?u?d?d?s +?u?d?d?s?d?l?u?d +?d?s?d?d?d?u?l?l +?d?l?d?d?s?l?l?d +?d?l?u?d?l?d?d?s +?s?d?u?u?u?d?d?d +?u?d?d?u?u?s?d?d +?l?d?u?s?d?d?d?u +?l?u?s?u?d?d?d?d +?u?l?d?s?d?d?l?d +?u?u?d?d?d?s?l?d +?u?l?d?d?d?l?d?s +?u?l?d?u?s?d?d?d +?l?s?d?d?l?d?l?d +?l?s?d?d?l?d?d?l +?u?d?l?d?l?d?s?d +?d?d?s?d?d?u?l?u +?d?u?d?u?d?l?d?s +?d?d?l?l?d?d?s?u +?d?s?l?d?d?l?l?d +?u?d?s?u?l?d?d?d +?d?l?d?d?l?d?l?s +?d?s?d?u?l?d?d?u +?s?d?d?l?d?d?l?l +?d?u?d?d?u?u?d?s +?u?d?d?u?l?s?d?d +?d?d?d?s?u?u?u?d +?u?d?l?u?s?d?d?d +?s?d?d?d?d?u?l?u +?s?d?l?d?l?d?d?l +?d?l?s?d?l?l?d?d +?d?d?l?s?d?l?d?l +?d?l?d?u?s?d?d?l +?s?u?d?l?d?l?d?d +?d?l?l?d?l?s?d?d +?u?d?d?s?l?l?d?d +?d?l?l?s?l?d?d?d +?d?u?l?l?s?d?d?d +?u?u?d?u?d?d?d?s +?d?l?d?u?d?l?d?s +?d?l?d?l?d?d?l?s +?u?u?l?d?d?d?s?d +?s?d?l?l?d?d?l?d +?u?u?d?d?d?s?u?d +?d?d?l?l?d?d?u?s +?d?u?u?u?s?d?d?d +?u?s?d?l?l?d?d?d +?u?l?d?l?d?d?d?s +?l?s?l?l?l?l?l?l?l +?l?l?l?d?d?d?u?u?u +?u?u?u?u?u?d?d?d?s +?s?l?l?l?l?s?d?d?d +?d?l?d?d?l?d?d?d?l +?u?d?d?d?u?d?d?d?l +?u?u?d?u?d?d?d?d?d +?d?l?d?d?u?d?d?l?d +?l?d?l?d?l?d?l?d?d?d +?d?l?l?d?d?d?d?l?d +?u?l?d?d?d?d?d?d?u +?d?l?d?d?d?l?d?d?l +?d?d?l?d?d?u?d?d?l +?d?d?u?d?d?u?d?d?l +?u?d?d?d?l?d?d?d?l +?u?d?l?d?d?l?d?d?d +?d?l?d?d?d?l?d?l?d +?d?d?l?l?l?d?d?d?d?l +?d?d?d?d?d?d?l?u?u +?d?d?d?l?d?l?l?d?d +?d?d?u?u?l?d?d?d?d +?u?d?d?l?d?l?d?d?d +?l?d?l?l?l?l?s?s +?l?l?l?d?l?l?l?d?l +?s?l?l?l?l?d?d?d?s +?d?s?d?s?d?s?s?d +?d?d?u?u?u?u?l?d +?d?u?d?d?u?u?l?l +?d?l?d?u?u?l?l?d +?l?d?u?u?l?l?d?d +?u?u?d?l?d?u?d?l +?l?d?l?l?u?d?d?l +?u?d?l?d?l?u?l?d +?d?l?u?d?l?l?d?l +?u?d?d?d?u?l?l?u +?d?u?l?l?l?d?l?d +?l?u?d?d?l?d?l?l +?l?l?d?l?d?u?l?d +?u?u?d?l?u?u?d?d +?u?d?d?u?d?l?u?u +?l?l?l?d?l?d?u?d +?u?u?d?d?u?u?l?d +?d?l?l?d?l?d?l?l?d +?d?l?u?l?d?u?l?d +?l?d?d?l?u?l?l?d +?u?l?d?d?l?l?d?u +?d?u?u?l?d?l?d?l +?d?l?d?l?d?l?l?u +?l?l?d?d?l?d?l?u +?l?l?d?l?d?d?u?u +?d?d?d?u?l?u?u?u +?d?u?d?l?l?l?l?d +?u?l?u?u?d?l?d?d +?d?l?d?l?l?d?l?d?l +?u?d?d?l?l?u?l?d +?u?u?d?l?l?d?d?l +?u?d?d?u?d?u?l?l +?d?l?d?u?l?d?l?l +?l?u?d?d?d?l?u?l +?l?d?d?u?u?l?l?d +?l?u?d?l?d?u?l?d +?u?d?u?d?u?l?d?l +?u?u?u?u?d?d?l?d +?u?d?u?u?d?d?u?l +?l?d?d?l?u?l?d?l +?l?u?l?d?u?l?d?d +?d?l?d?l?l?d?u?u +?d?l?d?u?l?u?d?l +?d?d?u?d?l?l?l?l +?l?d?d?l?l?u?u?d +?l?u?d?d?l?u?l?d +?u?l?l?d?l?u?d?d +?u?l?u?d?d?l?l?d +?u?d?d?d?l?u?u?u +?l?u?l?d?d?d?u?u +?l?l?l?d?d?u?d?l +?l?u?d?l?l?u?d?d +?u?l?d?d?l?u?d?u +?d?d?u?u?l?l?d?l +?l?d?l?l?d?u?u?d +?l?d?u?l?l?d?d?l +?u?d?d?u?d?l?l?u +?u?d?d?d?d?l?l?l?l +?u?l?d?l?l?d?d?u +?u?d?u?l?d?d?u?l +?d?u?l?d?u?l?d?u +?u?l?u?l?d?d?d?l +?l?d?l?l?d?d?l?u +?u?d?l?u?l?u?d?d +?u?u?u?d?d?d?u?l +?l?d?u?l?u?u?d?d +?u?l?l?d?d?d?l?u +?u?d?d?l?d?u?l?l +?u?l?d?d?u?l?d?l +?l?l?u?l?d?d?d?u +?d?l?u?l?d?l?l?d +?u?l?d?d?u?d?u?l +?d?l?l?l?d?l?u?d +?u?d?l?d?d?u?l?u +?u?l?u?l?d?u?d?d +?u?l?d?l?u?d?d?l +?d?l?d?l?u?d?l?l +?d?l?u?u?l?l?d?d +?l?d?l?u?d?l?d?u +?d?d?u?l?u?d?u?u +?l?u?l?d?d?d?l?u +?l?d?d?d?l?u?l?l +?l?u?d?u?l?u?d?d +?u?l?u?l?d?d?l?d +?d?d?d?u?u?l?l?u +?u?d?u?d?d?u?l?l +?u?l?d?l?d?u?d?l +?u?d?l?u?d?l?d?l +?l?d?l?d?u?l?l?d +?l?d?d?u?u?l?d?u +?d?d?u?u?u?l?l?d +?u?l?d?u?d?l?d?l +?d?l?d?l?d?l?u?u +?d?u?d?l?d?l?l?l +?l?d?d?l?l?l?d?l?d +?l?d?d?u?l?l?d?l +?d?l?l?u?d?d?l?l +?l?u?d?d?u?d?u?l +?u?d?l?l?d?u?l?d +?u?l?d?l?u?d?l?d +?d?d?u?u?u?l?u?d +?d?d?d?d?u?u?u?l?l +?u?l?d?d?d?l?u?l +?d?l?d?u?u?u?d?u +?d?u?l?u?l?l?d?d +?u?l?d?d?u?l?d?u +?u?l?u?d?u?d?l?d +?u?d?l?d?d?l?l?l +?l?l?l?d?d?l?u?d +?l?d?d?d?l?u?u?u +?l?d?l?u?l?d?l?d +?d?d?l?l?l?d?l?u +?l?l?u?d?u?d?l?d +?d?d?d?u?u?l?u?l +?l?l?l?d?u?d?l?d +?l?l?d?l?u?d?d?u +?d?l?u?l?d?d?u?u +?u?d?d?u?l?u?l?d +?u?d?l?u?u?l?d?d +?d?u?l?d?d?l?u?u +?u?d?u?l?d?l?d?u +?u?d?l?l?u?d?l?d +?u?d?l?d?l?u?u?d +?u?d?u?u?l?d?d?l +?l?u?l?d?l?u?d?d +?l?d?d?d?l?l?l?l?d +?u?l?u?d?u?l?d?d +?u?l?d?u?u?l?d?d +?l?u?l?u?d?d?l?d +?u?u?l?d?d?l?l?d +?l?l?d?d?l?u?l?d +?d?l?l?l?l?d?u?d +?l?u?l?d?l?d?d?l +?l?u?u?d?d?u?u?d +?u?d?d?l?u?l?l?d +?u?d?d?l?u?d?l?l +?l?d?u?d?l?l?l?d +?u?l?u?d?u?d?u?d +?l?d?u?l?l?l?d?d +?u?d?d?l?l?d?l?u +?u?u?u?d?l?d?l?d +?u?u?d?d?d?l?l?u +?u?d?u?l?l?d?d?l +?u?d?d?l?u?u?d?l +?l?d?l?d?d?l?u?u +?d?l?u?u?d?l?d?l +?u?d?u?l?u?l?d?d +?u?u?l?d?d?d?l?u +?l?l?d?d?d?l?u?u +?u?d?d?l?u?l?u?d +?u?u?l?l?d?l?d?d +?l?u?u?l?d?l?d?d +?d?u?u?u?d?d?l?l +?l?l?l?d?d?l?d?d?l +?u?u?l?u?l?d?d?d +?l?u?d?l?d?u?d?l +?d?d?d?l?l?l?u?l +?l?l?d?u?d?l?l?d +?d?d?u?u?l?l?l?d +?u?l?l?u?d?u?d?d +?l?u?l?d?l?d?l?d +?u?l?d?l?d?l?d?u +?d?l?d?u?d?l?l?u +?d?l?u?u?d?l?l?d +?u?d?l?l?d?d?l?u +?d?u?u?u?l?l?d?d +?l?u?u?u?d?u?d?d +?l?d?d?l?l?l?u?d +?l?d?l?d?l?l?d?u +?l?d?u?u?l?d?d?u +?u?u?d?d?u?l?d?l +?d?d?l?l?d?l?l?u +?l?d?d?u?l?u?l?d +?d?l?l?d?u?l?d?l +?u?d?u?d?l?l?d?u +?u?l?u?d?u?u?d?d +?l?d?l?l?d?u?l?d +?l?d?l?d?l?d?l?u +?d?l?l?d?l?l?d?l?d +?d?l?d?l?l?d?l?u +?d?l?u?d?l?l?l?d +?d?d?l?u?u?d?l?l +?d?l?l?l?u?d?d?l +?l?u?u?l?u?d?d?d +?u?u?d?d?u?d?l?l +?u?u?l?d?d?d?u?u +?l?d?l?l?u?d?l?d +?l?u?d?d?d?u?l?l +?l?u?d?d?d?u?l?u +?d?l?d?l?u?u?d?l +?l?d?u?d?u?d?l?l +?d?d?l?u?u?l?d?l +?d?l?d?d?u?u?l?l +?l?d?d?u?l?u?u?d +?l?l?d?d?l?u?d?u +?d?d?u?d?u?l?l?l +?d?u?l?l?d?d?u?u +?u?l?d?d?u?l?u?d +?d?u?l?d?d?u?u?l +?u?l?d?l?u?l?d?d +?d?u?d?l?l?l?d?u +?d?l?u?l?d?d?l?l +?d?l?l?d?l?l?u?d +?u?l?d?u?d?l?u?d +?l?d?l?d?u?u?d?l +?d?u?l?l?d?u?d?l +?u?u?d?l?d?l?l?d +?l?d?d?d?u?u?u?u +?l?l?l?u?d?l?d?d +?d?u?d?l?d?u?l?l +?u?d?l?d?u?d?u?l +?u?d?l?d?u?d?u?u +?u?l?l?l?d?d?d?d?l +?l?l?u?l?d?d?u?d +?u?d?l?d?l?d?u?l +?d?d?d?u?u?u?l?u +?u?d?d?l?l?l?u?d +?u?d?l?u?u?d?d?l +?d?d?u?l?d?l?l?l +?l?l?l?l?d?l?d?l?l +?d?d?d?d?d?d?d?d?d?d?l?l +?d?d?d?d?s?s?s?d?d +?d?d?s?s?s?d?d?d?d +?u?u?u?u?u?s?u?d +?u?l?l?u?l?l?d?s +?u?s?u?l?l?l?l?d +?l?l?l?l?l?l?l?s?l +?l?l?l?l?l?l?d?d?d?s +?l?l?d?l?d?d?d?d?d?d +?s?l?l?s?s?d?d?d +?u?u?d?d?d?s?s?s +?s?l?s?l?s?d?d?d +?l?l?d?l?d?l?l?l?l +?d?d?d?d?d?d?d?d?d?s?s +?l?l?d?d?d?d?d?s?s +?u?l?l?u?l?l?u?l +?u?l?u?l?u?l?l?l +?l?d?d?d?d?d?d?d?l?d +?d?d?l?d?d?d?l?d?d?d +?u?u?u?u?u?d?u?u?u +?s?l?l?l?d?l?l?s +?u?l?u?l?l?l?l?s +?s?s?s?s?d?d?d?l +?d?d?s?d?d?s?l?l?l +?l?d?d?l?l?l?u?u +?l?u?u?d?u?u?u?u +?l?l?u?d?l?l?u?d +?l?d?u?l?l?d?u?l +?u?l?u?l?u?d?d?l +?l?d?d?l?u?l?l?l +?l?d?l?u?l?l?d?l +?u?l?d?d?l?u?l?u +?d?u?l?l?l?u?l?d +?l?u?l?l?u?u?d?d +?d?u?l?l?l?l?d?u +?u?u?l?l?d?u?d?l +?u?u?l?u?u?d?d?u +?l?u?u?u?l?u?d?d +?u?l?l?l?u?l?d?l +?l?l?d?u?l?l?l?d +?u?l?d?l?u?d?u?l +?l?l?l?u?d?d?u?l +?d?d?u?u?l?l?u?u +?u?d?d?u?l?l?u?l +?u?l?l?l?u?d?d?l +?d?l?u?l?l?d?l?l +?u?d?u?l?u?d?u?l +?u?l?u?d?l?l?l?d +?l?d?u?u?u?u?u?u +?l?u?l?l?l?l?d?l +?l?l?u?u?l?l?l?d +?d?l?l?l?l?d?l?u +?l?u?u?d?d?l?u?u +?u?l?l?l?d?d?l?u +?u?l?l?d?l?u?l?d +?l?l?u?u?d?d?l?l +?l?l?l?u?l?l?u?d +?l?l?l?d?u?l?l?d +?l?d?u?d?l?l?l?l +?u?d?l?l?d?l?l?u +?l?l?u?l?d?l?l?d +?u?l?l?l?u?d?u?d +?u?d?l?d?u?l?l?l +?u?u?u?l?u?u?d?d +?u?l?l?d?d?u?u?l +?l?u?l?d?l?d?l?l +?u?l?d?l?u?l?l?l +?l?d?u?l?l?l?l?d +?u?l?u?u?l?d?d?l +?l?l?l?u?l?u?d?d +?l?l?u?l?u?u?d?d +?l?u?u?u?l?l?d?d +?u?u?u?l?u?u?u?d +?d?l?l?d?s?u?u?s +?l?d?l?d?u?s?u?s +?l?d?l?l?l?d?s?s +?s?s?d?d?u?u?l?l +?s?d?u?l?l?l?s?d +?s?u?s?u?d?l?d?l +?u?l?u?l?s?s?d?d +?l?l?l?l?d?l?l?d?l +?u?u?u?u?l?d?d?d?d +?l?l?d?l?d?d?l?l?d +?d?d?u?l?u?l?u?d?d +?l?d?d?d?d?d?d?l?l?l +?u?u?u?u?d?d?s?d?d +?d?l?l?l?d?d?l?l?l +?l?l?d?l?d?l?d?l?l +?u?u?u?u?s?l?l?l +?u?s?s?u?s?u?d +?u?l?s?l?s?s?d +?s?u?u?u?s?d?s +?l?d?s?l?s?s?l +?l?d?l?s?s?l?s +?s?s?l?s?d?l?l +?l?s?l?s?s?d?l +?u?l?s?s?s?l?d +?s?u?s?s?l?d?l +?u?s?u?d?l?s?s +?d?s?s?s?l?l?l +?u?s?s?d?l?l?s +?s?l?d?l?u?s?s +?u?s?l?l?s?d?s +?u?s?l?d?u?s?s +?s?u?l?l?s?d?s +?s?s?d?u?l?s?l +?u?d?s?u?s?u?s +?l?s?s?d?l?l?s +?l?d?u?s?l?s?s +?u?s?s?d?l?s?l +?u?s?u?s?l?d?s +?s?l?l?d?s?l?s +?u?l?l?s?s?d?s +?s?l?s?l?d?s?l +?s?l?s?l?s?d?u +?s?l?s?l?s?d?l +?l?d?s?s?l?s?l +?u?s?u?d?s?u?s +?u?l?s?s?d?s?l +?l?l?s?l?s?s?d +?l?l?d?s?s?l?s +?s?s?l?s?l?d?l +?u?l?l?s?d?s?s +?d?s?l?s?s?l?l +?u?l?u?d?s?s?s +?s?u?u?u?s?s?d +?s?s?u?d?l?s?l +?l?s?u?s?d?l?s +?l?u?l?s?s?s?d +?s?l?l?s?l?d?s +?u?s?u?s?d?u?s +?l?s?l?l?s?d?s +?s?u?s?s?l?u?d +?l?u?d?s?s?s?l +?l?d?s?l?s?u?s +?d?l?s?l?s?u?s +?s?s?l?l?u?d?s +?l?l?s?l?d?s?s +?d?l?l?s?s?l?s +?u?s?s?l?s?l?d +?l?s?s?l?s?d?l +?s?s?d?u?s?l?l +?d?s?s?l?l?l?s +?s?l?u?s?d?s?l +?s?u?s?d?l?l?s +?l?s?s?l?l?s?d +?l?l?s?d?s?s?l +?d?s?s?s?u?u?u +?s?d?s?l?l?s?l +?s?s?s?u?d?l?u +?s?l?d?s?l?s?l +?l?u?s?s?l?s?d +?u?u?u?d?d?s?s?s +?u?s?u?u?s?s?d +?l?d?u?u?s?s?s +?s?u?s?u?d?s?u +?s?s?d?u?l?l?s +?l?s?s?d?s?u?l +?s?s?l?u?s?l?d +?s?s?s?u?u?u?d +?l?l?s?s?l?s?d +?s?l?d?s?s?l?l +?s?d?s?s?l?u?l +?u?u?u?s?s?s?d +?u?s?d?s?u?s?u +?u?d?s?l?l?s?s +?s?d?s?l?l?s?u +?u?s?u?u?d?s?s +?l?s?s?l?d?s?l +?s?d?u?l?s?s?l +?s?l?s?s?d?u?l +?s?s?u?u?s?d?u +?l?l?s?s?d?l?s +?u?u?s?d?s?l?s +?s?s?u?s?u?l?d +?l?d?l?s?u?s?s +?d?s?u?u?s?u?s +?u?s?d?s?s?u?u +?s?l?l?s?s?d?l +?s?s?u?u?u?s?d +?s?d?l?s?l?l?s +?l?l?l?s?d?d?s?s +?u?s?u?s?s?d?u +?u?d?u?s?s?s?u +?u?s?s?s?l?d?l +?u?l?u?s?d?s?s +?s?l?l?u?s?s?d +?u?s?u?u?s?d?s +?u?s?l?s?d?s?u +?l?s?l?s?s?l?d +?l?d?s?s?s?u?u +?s?l?s?s?l?d?l +?u?d?s?s?u?s?l +?u?d?s?s?s?u?u +?l?s?d?u?s?u?s +?u?u?u?u?u?u?u?s?d +?u?u?l?l?d?d?d?d?d?d +?u?u?l?l?l?l?d?s +?l?d?d?d?d?d?d?d?l?s +?l?l?l?l?l?l?d?d?u +?l?d?l?d?s?s?l?d +?s?l?l?l?d?s?d?d +?d?d?d?l?s?s?l?l +?l?s?d?l?l?s?d?d +?l?d?d?l?d?l?s?s +?s?l?d?l?l?d?d?s +?d?d?d?s?l?l?s?l +?d?d?d?s?s?u?u?u +?d?l?s?l?d?s?l?d +?l?s?l?s?d?l?d?d +?u?s?s?l?l?d?d?d +?s?l?d?d?l?l?d?s +?d?d?d?s?l?s?l?l +?s?l?d?l?d?d?l?s +?l?s?d?d?d?s?l?l +?u?l?l?s?d?s?d?d +?d?d?s?d?s?l?l?l +?s?l?u?l?d?d?d?s +?d?d?d?u?l?l?s?s +?d?d?s?l?l?l?s?d +?l?u?l?s?d?d?d?s +?u?l?s?l?s?d?d?d +?u?l?l?s?d?d?s?d +?u?l?l?d?s?s?d?d +?u?s?l?s?l?d?d?d +?u?s?l?d?l?s?d?d +?l?l?l?l?d?d?l?d?l +?d?l?l?l?l?d?d?d?d?d +?u?l?u?s?s?l?l +?s?l?l?l?s?u?l +?l?l?l?s?s?u?u +?u?s?l?s?l?l?u +?u?s?l?l?s?l?u +?u?l?s?l?s?l?u +?l?l?u?u?u?s?s +?l?s?u?u?u?s?l +?s?l?l?u?l?l?s +?u?s?l?s?u?u?u +?u?l?u?u?l?s?s +?l?l?u?l?s?l?s +?s?l?s?u?u?u?u +?l?l?l?s?u?u?s +?u?l?l?u?s?u?s +?u?s?l?l?u?s?l +?s?l?l?u?s?l?l +?l?s?l?u?l?s?l +?u?s?l?s?u?l?u +?l?s?l?s?u?l?l +?l?s?l?u?s?l?l +?u?s?u?u?l?s?l +?l?l?s?u?u?u?s +?u?u?s?u?u?s?u +?s?s?u?u?u?l?l +?l?l?u?s?l?s?l +?l?l?s?s?l?l?u +?l?l?l?l?l?s?u?s +?u?l?s?u?l?s?l +?l?u?u?l?u?s?s +?u?l?l?s?u?l?s +?u?l?u?s?l?l?s +?l?l?l?s?u?s?l +?l?l?l?s?u?s?u +?u?l?s?s?u?l?l +?l?l?u?s?s?l?l +?s?u?s?u?l?l?l +?s?u?l?s?l?u?l +?u?s?l?u?l?s?u +?s?s?u?u?l?l?l +?l?s?l?s?u?u?u +?u?u?s?s?u?l?u +?l?l?l?u?s?l?s +?l?u?u?u?l?s?s +?u?u?l?u?u?s?s +?u?u?s?l?l?l?s +?s?l?l?l?u?l?s +?u?l?s?l?u?l?s +?u?s?s?u?l?l?l +?s?u?l?s?l?l?l +?s?l?l?l?s?l?u +?u?l?s?u?u?u?s +?d?d?d?d?d?d?d?d?u?d +?d?d?d?u?d?d?d?d?d?d +?u?u?u?u?u?u?u?u?s +?u?u?u?u?u?u?u?u?u?d +?u?l?l?l?u?u?u?u +?u?u?l?l?u?u?l?l +?d?l?d?l?d?d?d?l?l +?d?l?l?d?d?l?d?l?d +?d?l?d?l?l?d?d?l?d +?d?d?d?u?l?l?l?d?d +?u?d?u?d?u?d?u?d?d +?l?l?d?d?d?d?d?u?u +?d?l?d?d?l?d?d?l?l +?d?d?d?d?d?u?u?l?l +?d?d?d?d?u?l?l?l?d +?u?d?l?l?d?l?d?d?d +?l?d?l?d?d?d?l?l?d +?l?d?l?d?l?d?d?d?l +?l?l?d?d?d?d?l?l?d?d +?l?d?d?l?l?d?d?d?l +?l?l?d?d?d?d?l?d?l +?d?d?d?d?d?u?l?u?l +?l?l?d?l?d?d?d?l?d +?l?u?l?l?d?d?d?d?d +?l?l?l?l?s?u?d?d +?u?s?l?l?d?l?l?d +?d?l?d?s?l?l?l?l +?l?l?l?d?s?d?l?l +?l?l?s?l?d?l?d?l +?l?s?l?l?l?d?d?l +?l?l?l?d?d?l?s?l +?l?l?l?s?d?l?l?d +?u?l?d?l?l?d?l?s +?d?u?l?l?l?l?d?s +?l?d?l?s?l?l?d?l +?u?l?l?s?u?l?d?d +?l?d?l?l?l?d?s?l +?d?d?u?s?u?u?u?u +?s?d?l?l?d?l?l?l +?u?d?d?l?l?l?l?s +?s?d?l?d?l?l?l?l +?l?l?d?l?d?l?s?l +?l?l?d?d?l?l?s?l +?l?u?l?l?l?s?d?d +?l?u?l?u?l?s?d?d +?d?s?l?l?l?l?d?l +?u?d?l?d?l?s?l?l +?l?l?l?l?d?s?l?d +?l?d?l?s?l?l?l?d +?d?l?l?s?l?l?l?d +?l?l?l?l?s?d?d?d?s +?d?d?d?d?l?l?s?l?l +?l?l?l?l?l?l?l?l?l?d?d +?s?s?s?l?l?l?l?d +?d?d?l?l?l?l?d?l?l +?d?l?l?l?l?d?l?l?d +?s?s?l?l?l?d?d?d?d +?l?l?d?d?l?d?l?l?d +?d?l?d?l?d?l?l?d?l +?d?d?d?l?l?d?l?l?l +?u?u?u?u?d?d?d?d?u +?u?u?u?d?d?u?u?d?d +?u?l?d?d?u?l?l?d?d +?d?d?d?d?u?u?l?l?l +?s?s?s?s?l?l?s +?u?s?u?s?s?s?s +?u?l?s?s?s?s?s +?u?l?l?l?l?l?l?d?s +?l?l?l?s?l?l?l?l?d +?d?d?s?d?s?d?d?l?l +?s?l?l?d?d?d?d?d?s +?u?u?u?u?l?d?l?l +?u?l?d?l?l?l?l?u +?u?u?u?u?u?d?l?l +?u?u?d?u?l?l?l?l +?u?u?u?l?l?d?l?l +?u?u?l?l?l?u?u?d +?u?l?l?u?d?l?l?l +?u?l?l?l?u?l?d?d?d +?d?d?u?d?d?d?d?d?u +?d?d?d?u?d?d?d?d?l +?d?d?d?u?d?l?d?d?d +?d?d?d?d?d?u?l?d?d +?d?d?d?d?u?d?d?d?l +?d?d?d?d?d?u?d?d?u +?d?d?u?d?d?d?u?d?d +?d?d?d?d?d?d?l?d?u +?d?d?d?d?u?l?d?d?d +?d?d?d?d?l?d?d?u?d +?d?d?d?d?d?d?u?d?l +?d?d?l?d?d?d?d?u?d +?l?d?d?d?d?d?u?d?d +?d?d?d?l?u?d?d?d?d +?d?d?d?u?d?d?u?d?d +?l?d?u?d?d?d?d?d?d +?d?d?d?u?d?d?l?d?d +?d?d?u?d?d?d?d?l?d +?l?l?l?l?s?l?l?l?d +?d?d?d?l?l?l?s?s?s +?u?s?l?l?l?l?d?l +?d?s?u?u?u?u?u?u +?u?u?u?u?s?u?u?d +?u?d?s?l?l?l?l?l +?s?l?l?d?l?l?l?s +?u?u?u?u?u?s?s?d +?d?d?d?d?l?l?l?s?s +?d?d?d?d?u?l?l?l?s +?u?u?u?d?d?u?u?u?u +?l?d?d?l?l?l?l?l?d +?d?d?d?d?s?d?d?d?d?d?d +?u?l?l?d?d?l?l?l?l +?l?l?d?d?d?d?s?s?s +?u?s?l?s?s?l?s +?l?u?l?s?s?s?s +?l?l?s?l?s?s?s +?s?l?l?s?s?l?s +?s?s?s?s?u?l?u +?s?l?l?s?s?s?l +?u?s?u?u?s?s?s +?u?s?l?l?s?s?s +?l?s?s?s?s?l?l +?u?l?l?l?u?u?l?l +?s?s?d?d?d?d?d?s?s +?d?l?d?l?l?d?l?l?d +?d?d?d?d?u?l?u?l?u +?l?d?l?l?d?d?l?l?d +?l?d?d?l?l?d?l?d?l +?s?l?s?l?s?l?d?d +?l?d?d?l?l?l?d?l?l +?l?d?d?l?d?l?l?l?l +?l?l?l?l?d?d?d?d?d?d?d?d +?d?l?d?l?d?l?d?d?d?d +?d?d?s?d?d?s?d?d?l?l +?l?d?s?d?s?d?d?d?d +?d?d?d?d?s?s?l?l?l +?u?l?l?l?l?l?d?d?l +?s?s?u?u?d?d?l?l +?u?s?l?l?l?d?d?s +?u?u?s?d?d?s?u?u +?d?l?s?u?d?l?s?u +?l?l?s?l?s?l?d?d +?l?l?l?l?l?d?d?d?d?l +?u?l?l?l?l?d?l?l?l +?l?d?d?l?l?l?d?d?d?d +?u?u?u?u?u?u?u?u?u?u +?d?d?d?d?d?d?d?d?d?d?d?l +?l?l?l?s?s?s?d?d?d +?s?u?l?l?l?d?d?d?d +?l?l?l?d?l?d?l?d?l +?d?d?s?d?s?d?s?d?d +?s?s?d?d?d?d?d?d?s +?u?u?l?l?l?l?l?u +?l?l?l?l?u?u?l?l +?u?u?l?l?l?l?u?u +?d?d?d?d?d?d?l?d?d?d?d +?d?u?u?u?u?u?u?u?d +?d?d?d?d?d?s?u?u?u +?d?d?s?d?d?d?l?l?l +?d?d?d?l?l?l?s?d?d +?d?d?d?d?l?l?l?s?d +?l?l?s?l?d?d?d?d?d +?l?l?l?d?d?d?l?l?l?l +?d?d?d?d?d?d?d?d?d?u?u +?u?l?u?l?u?l?d?l +?u?l?u?l?l?d?l?l +?u?u?l?l?l?l?d?l +?l?u?u?l?l?l?l?d +?l?l?l?l?l?u?d?u +?u?l?u?l?l?l?u?d +?u?l?l?l?d?u?u?u +?l?s?u?s?l?l?l?l +?s?l?s?l?l?l?l?l +?s?l?l?l?s?l?l?l +?l?l?d?d?l?d?d?d?d?d +?l?l?l?l?l?s?d?d?s +?l?l?d?l?l?l?d?l?d +?u?d?l?l?l?l?l?d?d +?u?s?d?d?s?u?d?d +?u?d?u?d?s?s?d?d +?d?d?s?u?s?u?d?d +?u?s?d?d?d?s?u?d +?l?l?d?d?s?d?s?d +?u?d?d?l?d?d?s?s +?u?d?d?d?d?l?s?s +?s?u?d?d?l?d?d?s +?u?s?d?d?l?s?d?d +?d?d?l?s?l?s?d?d +?d?s?l?d?d?s?l?d +?d?d?s?d?l?s?d?l +?d?d?s?d?d?l?s?l +?u?s?d?d?l?d?d?s +?d?d?d?d?s?u?s?u +?l?d?d?l?s?d?s?d +?l?u?d?s?d?s?d?d +?d?s?d?d?s?d?l?l +?s?u?u?d?d?s?d?d +?u?s?l?d?d?s?d?d +?s?d?s?d?l?l?d?d +?l?d?l?s?d?d?d?s +?u?d?s?s?u?d?d?d +?d?l?d?d?l?d?s?s +?l?l?d?d?d?s?s?d +?s?u?u?d?d?d?s?d +?d?d?d?d?s?s?u?l +?u?l?s?d?s?d?d?d +?u?d?u?s?d?s?d?d +?l?d?s?d?l?s?d?d +?u?l?d?d?s?d?d?s +?u?u?d?d?s?s?d?d +?d?s?d?l?d?s?l?d +?s?d?d?l?u?s?d?d +?d?d?u?d?l?d?s?s +?d?d?s?l?s?l?d?d +?u?d?d?s?d?l?s?d +?l?d?s?d?d?d?u?s +?l?d?s?d?l?d?s?d +?d?d?d?s?l?d?s?l +?s?u?d?l?d?d?d?s +?u?u?d?s?d?s?d?d +?l?d?s?u?s?d?d?d +?d?d?s?s?d?d?u?u +?d?d?d?s?l?l?s?d +?u?d?l?d?d?d?s?s +?s?s?d?d?l?u?d?d +?u?l?d?s?d?d?d?s +?d?l?s?d?s?l?d?d +?d?d?l?d?d?s?l?s +?s?d?l?d?d?d?s?l +?u?d?l?d?s?d?s?d +?u?d?d?d?d?u?s?s +?l?d?l?s?s?d?d?d +?s?d?l?s?l?d?d?d +?u?u?d?d?d?s?s?d +?l?s?d?d?u?s?d?d +?d?d?s?l?d?d?s?l +?u?d?d?s?s?d?d?u +?d?l?l?d?s?s?d?d +?d?d?d?l?l?s?d?s +?l?s?s?d?d?d?l?d +?d?s?d?l?d?d?s?l +?u?l?d?d?d?s?s?d +?d?l?d?l?d?d?s?s +?d?l?s?d?d?s?l?d +?s?d?d?l?d?l?d?s +?l?d?d?d?d?s?l?s +?u?d?s?u?d?s?d?d +?d?l?l?s?s?d?d?d +?d?s?d?d?l?l?s?d +?s?d?d?d?d?u?l?s +?u?d?d?d?l?d?s?s +?s?s?l?u?d?d?d?d +?d?s?d?d?d?s?l?l +?d?d?d?d?l?u?s?s +?d?l?d?s?l?s?d?d +?d?s?l?d?l?s?d?d +?d?l?l?d?d?s?s?d +?d?l?d?s?d?l?s?d +?l?s?l?d?d?d?s?d +?d?d?s?l?d?s?d?l +?d?l?l?s?d?d?d?s +?u?s?u?d?d?s?d?d +?d?d?s?d?d?s?l?u +?d?l?s?s?l?d?d?d +?d?s?l?l?d?s?d?d +?l?d?d?d?d?s?u?s +?l?d?s?l?s?d?d?d +?s?d?d?d?l?l?d?s +?d?d?d?d?s?u?u?s +?s?d?d?s?d?d?u?u +?s?l?d?d?d?l?d?s +?s?l?l?d?s?d?d?d +?d?d?d?l?d?s?s?l +?u?l?d?d?s?s?d?d +?s?d?s?d?d?l?l?d +?l?d?d?s?s?d?d?l +?u?s?l?d?d?d?d?s +?d?s?d?s?l?u?d?d +?d?s?l?l?s?d?d?d +?d?l?d?d?d?u?s?s +?s?s?d?d?d?d?u?l +?l?s?d?d?l?d?d?s +?u?d?d?s?u?s?d?d +?d?d?u?s?l?d?d?s +?s?d?d?u?d?d?u?s +?s?l?d?l?s?d?d?d +?d?l?d?s?d?l?d?s +?s?d?d?d?l?l?s?d +?u?u?d?s?d?d?s?d?d +?l?s?s?d?d?d?d?l +?d?d?s?d?d?s?u?l +?l?s?d?d?d?s?l?d +?l?d?d?s?d?s?d?l +?d?s?d?d?l?s?l?d +?d?d?d?d?s?u?s?l +?d?d?s?d?d?u?s?u +?l?d?s?d?s?d?d?l +?s?u?l?d?s?d?d?d +?d?s?l?l?d?d?d?s +?d?d?s?d?u?u?d?s +?u?s?s?d?l?d?d?d +?s?l?u?d?d?d?d?s +?s?d?d?d?d?s?u?u +?l?d?l?d?s?s?d?d +?d?s?d?l?d?l?s?d +?d?u?u?u?u?u?d?d?d +?l?d?d?d?l?d?l?l?l +?l?l?d?l?l?d?d?l?d +?u?d?l?d?u?d?l?d?u +?d?d?u?u?s?d?d?d?d +?d?d?d?l?d?d?d?l?s +?d?s?d?d?d?d?d?l?l +?l?d?d?l?d?d?s?d?d +?d?l?l?d?d?d?d?d?s +?s?l?d?d?d?d?d?d?l +?d?d?d?u?u?d?d?d?s +?l?d?d?d?s?l?d?d?d +?u?u?d?d?d?d?s?d?d +?s?u?l?d?d?d?d?d?d +?d?l?l?d?s?d?d?d?d +?l?s?d?d?d?d?d?d?l +?l?d?d?d?d?d?l?d?s +?d?d?d?s?l?l?d?d?d +?u?l?l?d?d?d?d?d?d?d?d +?u?l?l?u?u?l?l?u +?u?l?l?l?u?l?u?l +?s?d?d?d?d?d?d?d?d?d?s +?l?l?l?l?d?l?d?d?d?d +?d?d?d?d?l?l?l?l?l?d +?l?d?d?l?l?d?l?l?l +?l?l?l?s?d?d?d?u +?u?l?d?d?d?u?l?s +?u?d?d?d?u?l?l?s +?l?l?s?d?d?l?l?d +?d?l?l?s?l?d?l?d +?d?l?d?l?s?l?d?l +?u?d?u?u?d?u?s?d +?d?s?l?l?d?d?l?l +?d?l?l?s?l?l?d?d +?l?u?l?d?d?d?s?l +?l?l?l?d?s?l?d?d +?l?d?l?s?d?l?l?d +?s?u?u?l?d?l?d?d +?d?s?d?l?d?l?l?l +?u?l?d?d?l?l?d?s +?d?u?l?l?l?s?d?d +?u?u?u?d?d?d?s?l +?d?d?u?l?d?l?s?l +?u?d?d?l?l?l?s?d +?l?l?d?d?d?u?u?s +?u?u?l?l?d?d?s?d +?l?l?u?l?d?d?d?s +?u?s?d?d?d?l?l?l +?l?s?u?u?u?d?d?d +?l?l?s?d?d?l?d?l +?d?u?l?l?l?d?s?d +?l?d?l?d?d?l?s?l +?d?l?d?s?l?d?l?l +?u?l?l?d?d?d?l?s +?u?d?l?s?u?d?l?d +?d?l?l?d?s?d?l?l +?l?d?d?s?l?d?l?l +?l?d?l?l?l?d?s?d +?l?l?d?l?s?d?l?d +?d?u?u?u?u?s?d?d +?l?l?d?l?l?d?s?d +?l?l?l?s?u?d?d?d +?d?l?d?l?d?l?l?s +?l?s?d?l?l?d?d?l +?d?d?u?l?l?l?d?s +?d?d?s?l?l?l?l?d +?l?d?d?l?s?l?d?l +?u?l?u?d?d?d?s?u +?d?l?l?d?d?l?s?l +?u?l?s?u?l?d?d?d +?d?d?u?s?l?l?d?l +?u?l?s?u?u?d?d?d +?d?l?l?d?l?l?s?d +?u?l?u?l?d?d?d?d?s +?l?l?d?l?d?l?s?d +?u?d?d?u?d?u?u?s +?u?l?d?d?l?l?s?d +?u?l?l?d?d?d?s?l +?l?u?l?l?d?d?d?s +?u?l?d?d?d?s?l?u +?l?l?l?d?l?d?s?d +?d?l?l?l?s?d?l?d +?l?l?l?d?d?s?d?l +?u?u?u?s?d?d?d?l +?d?d?u?l?s?d?l?l +?u?u?s?u?u?d?d?d?d +?d?d?d?u?u?s?u?u +?u?l?d?d?s?l?l?d +?d?s?d?d?u?u?u?u +?d?l?s?d?d?l?l?l +?u?l?d?d?l?d?l?s +?l?d?d?s?d?l?l?l +?l?l?l?d?u?s?d?d +?s?d?l?l?d?l?d?l +?l?d?d?l?l?s?l?d +?u?u?l?l?d?s?d?d +?u?u?u?s?l?d?d?d +?u?u?d?d?d?s?l?l +?l?d?s?d?l?l?d?l +?d?l?d?l?l?l?d?s +?u?l?d?d?s?u?l?d +?u?d?d?l?d?l?l?s +?d?l?d?d?l?l?l?s +?s?u?d?l?d?l?d?l +?l?d?s?l?d?l?l?d +?u?u?d?s?u?u?d?d +?l?l?l?d?s?d?d?l +?s?l?l?l?d?d?l?d +?l?d?d?d?l?s?l?l +?s?l?u?u?u?d?d?d +?s?l?d?d?d?l?l?l +?l?d?d?d?l?l?s?l +?l?l?l?s?d?l?d?d +?s?d?u?l?l?l?d?d +?d?l?l?d?s?l?l?d +?u?u?l?l?l?l?l?s +?u?l?l?l?l?s?u?l +?l?l?l?l?s?s?l?d +?l?l?s?l?l?s?l?d +?d?d?l?d?l?l?d?d?l +?d?d?d?l?d?d?l?l?l +?u?u?u?d?u?d?d?d?d +?d?l?l?l?d?d?d?d?l +?d?d?l?l?l?d?d?l?d +?d?d?d?l?d?l?l?d?l +?u?u?d?d?d?u?u?d?d +?l?d?d?d?d?l?d?l?l +?d?l?l?d?d?d?d?l?l +?u?u?d?d?u?u?d?d?d +?l?d?d?d?l?d?l?d?l +?d?l?d?l?d?d?l?l?d +?d?d?d?d?d?l?l?l?u +?d?d?l?d?d?l?d?l?l +?l?u?u?u?d?d?d?d?d +?d?l?l?d?l?d?d?l?d +?u?s?u?s?u?u?u?u +?l?u?l?l?l?d?l?d +?u?d?l?d?l?u?l?l +?u?d?u?l?d?l?l?l +?d?l?l?u?u?u?u?d +?l?l?d?l?l?l?d?u +?d?l?l?d?u?l?u?l +?l?l?d?l?d?l?l?l?d +?d?d?u?u?l?l?l?u +?u?d?l?u?l?l?d?l +?u?d?d?l?l?u?l?u +?u?d?d?l?l?u?l?l +?d?d?u?u?u?u?u?l +?d?l?l?d?u?l?l?l +?u?l?l?d?l?l?u?d +?l?u?l?u?u?l?d?d +?u?u?l?l?l?d?d?u +?l?l?u?d?d?u?u?u +?d?u?u?d?u?l?l?l +?u?d?l?l?l?d?l?u +?u?d?u?l?l?l?d?l +?u?d?l?u?l?l?l?d +?u?u?u?l?d?d?l?l +?l?l?d?l?d?l?l?u +?l?d?l?u?u?u?u?d +?l?d?l?l?d?l?l?u +?l?l?l?l?d?u?l?d +?u?d?u?d?l?l?u?l +?u?l?l?d?u?l?d?u +?d?l?l?l?d?l?u?u +?d?u?l?u?u?l?u?d +?l?l?l?d?d?l?u?u +?u?l?l?d?l?l?d?u +?d?l?l?u?l?d?l?l +?d?d?u?u?u?u?l?l +?d?d?u?l?l?l?u?u +?s?d?d?l?l?l?l?l?l +?u?l?u?l?d?d?l?l +?u?d?l?u?l?u?l?d +?u?l?d?u?l?d?l?l +?l?l?l?l?d?u?u?d +?l?d?l?d?u?l?l?l +?u?d?l?l?d?u?l?l +?u?d?l?l?u?l?l?d +?d?u?l?u?l?l?l?d +?u?l?d?l?d?u?u?u +?u?u?d?l?l?d?l?l +?u?u?l?l?d?l?d?l +?l?u?u?u?u?d?d?l +?l?l?u?d?l?l?l?d +?u?l?l?d?d?u?l?u +?u?l?l?l?d?u?d?l +?l?u?u?d?d?u?u?u +?l?l?d?l?l?d?l?u +?l?d?u?l?l?l?d?l +?d?l?l?l?u?l?l?d +?d?l?u?l?d?l?l?l +?l?l?d?u?d?l?l?l +?l?l?l?u?l?d?l?d +?u?u?l?u?l?u?d?d +?l?l?u?d?l?d?l?l +?l?u?u?d?d?u?l?l +?d?l?l?u?l?l?u?d +?l?l?l?l?d?l?d?u +?l?d?l?d?l?u?u?u +?l?d?l?l?l?d?u?u +?u?u?l?d?u?u?l?d +?d?u?l?d?u?l?l?l +?u?d?l?d?u?u?l?l +?l?l?d?l?l?d?u?l +?l?d?l?l?l?l?u?d +?u?u?l?l?l?d?l?d +?d?d?u?l?l?l?d?d?d?d +?l?d?l?l?d?l?d?d?d?d +?d?s?d?s?d?s?s?s +?l?l?d?s?l?d?l?l +?u?l?u?l?l?d?d?s +?u?s?l?l?d?l?l?l +?d?u?l?l?l?d?l?s +?l?d?l?s?d?l?l?l +?l?l?s?l?d?l?l?d +?u?u?d?d?l?l?l?s +?u?u?d?d?u?u?u?s +?l?l?l?d?l?s?l?d +?u?d?u?d?u?s?u?u +?l?d?d?l?l?l?s?l +?u?l?l?u?l?s?d?d +?u?d?l?l?l?l?s?d +?u?u?u?u?s?d?u?d +?l?s?d?l?d?l?l?l +?u?s?d?u?u?u?u?u +?u?l?l?l?s?d?d?l +?s?d?l?l?l?l?d?l +?l?l?d?s?l?l?d?l +?u?l?d?l?l?l?d?s +?u?s?l?l?l?d?d?l +?l?l?s?l?d?d?l?l +?d?l?l?d?s?l?l?l +?d?d?l?l?l?l?l?d?d?d?d +?s?l?l?l?d?d?s?s +?d?d?l?s?l?s?l?s +?d?d?d?l?l?l?d?l?l +?u?l?d?d?l?l?l?d?d +?u?d?u?u?u?u?d?d?d +?d?d?d?d?l?l?l?l?u +?l?l?d?d?l?l?l?d?l +?l?d?l?d?d?l?d?l?l +?d?l?l?d?l?d?l?d?l +?l?l?l?d?d?d?l?d?l +?d?d?s?l?l?l?l?d?d +?d?d?l?l?d?d?l?l?s +?u?l?l?l?d?d?l?l?l +?u?u?u?d?d?d?d?s?s +?s?d?s?l?s?l?s +?u?s?s?l?s?d?s +?s?s?l?s?d?l?s +?s?l?d?l?s?s?s +?u?s?u?s?s?s?d +?l?d?s?s?s?l?s +?s?l?s?d?l?s?s +?s?s?u?u?s?s?d +?d?l?s?s?s?l?s +?u?u?s?d?s?s?s +?s?s?s?l?d?l?s +?s?s?s?l?l?s?d +?s?s?d?l?l?s?s +?l?s?s?s?d?l?s +?u?s?u?s?d?s?s +?s?l?l?s?s?d?s +?u?s?u?s?s?d?s +?s?s?l?s?l?d?s +?s?s?u?l?d?s?s +?s?s?l?l?s?d?s +?s?l?s?s?u?s?d +?l?s?d?s?s?l?s +?l?s?d?s?l?s?s +?l?s?s?l?s?d?s +?s?s?d?u?s?u?s +?d?s?l?u?s?s?s +?u?s?s?u?d?s?s +?s?u?s?s?u?s?d +?s?s?d?l?s?s?l +?d?s?s?s?s?u?u +?u?d?s?u?s?s?s +?s?l?l?d?s?s?s +?s?l?l?s?d?s?s +?u?s?s?s?s?u?d +?s?s?l?d?u?s?s +?s?s?s?l?l?d?s +?d?s?s?l?u?s?s +?d?s?s?s?l?l?s +?s?s?s?s?u?u?d +?u?s?s?s?l?s?d +?s?d?u?u?s?s?s +?u?d?s?s?s?l?s +?d?s?s?l?l?s?s +?u?s?s?s?u?s?d +?u?u?d?d?d?d?d?d?u?u +?u?u?l?l?u?l?l?d +?u?u?u?l?l?l?u?d +?u?u?l?u?l?u?u +?l?u?u?u?u?u?u?s +?u?l?u?l?d?u?l?u +?l?u?u?u?d?u?u?u +?u?u?l?d?l?l?l?l +?l?u?l?l?u?u?u +?u?l?u?l?d?l?u?l +?l?l?d?u?u?u?u?u +?l?l?l?u?u?l?l?d +?l?l?u?l?u?u?u +?l?l?u?u?d?l?l?l +?u?l?u?u?l?l?l?d +?l?l?l?l?l?u?u?d?d +?d?l?l?l?l?l?l?l?s +?l?l?l?u?l?l?l?u +?u?l?l?l?l?s?d?s +?l?s?s?l?l?l?l?d +?l?l?l?l?s?d?s?l +?s?s?s?d?d?d?u?l +?l?s?l?s?d?d?d?s +?l?u?d?d?d?s?s?s +?l?d?d?l?d?s?s?s +?d?d?d?s?s?l?l?s +?s?l?l?s?d?d?d?s +?u?u?u?u?d?d?u?u?u +?d?u?l?l?l?l?l?d?d +?d?u?u?u?u?u?u?d?d +?l?d?l?l?l?l?d?d?d?d +?d?d?d?u?u?u?u?d?d?d +?s?s?s?d?d?d?d?d?d?d +?s?d?d?d?l?l?l?l?l +?d?d?d?d?d?s?s?l?l +?d?l?l?d?l?l?l?l?l +?s?u?u?s?l?l?s +?u?s?s?u?s?u?u +?l?l?l?s?s?u?s +?u?s?u?s?l?s?l +?s?s?l?l?l?s?l +?l?s?s?l?s?l?u +?u?s?u?u?s?s?u +?u?s?l?s?l?s?u +?u?s?s?u?u?s?u +?s?l?u?l?u?s?s +?s?s?u?u?l?l?s +?l?s?s?s?l?l?u +?u?l?s?s?l?s?l +?s?l?s?l?s?l?u +?u?s?s?s?l?l?u +?s?l?s?l?s?u?u +?u?s?s?l?s?l?l +?l?s?u?s?l?s?l +?l?l?u?l?s?s?s +?u?s?s?u?s?l?u +?l?s?u?s?l?l?s +?s?u?l?s?l?u?s +?u?u?s?u?s?s?u +?u?s?l?u?s?l?s +?s?u?l?l?u?s?s +?u?l?d?d?d?d?d?d?d?d?d +?d?d?d?d?s?d?l?l?l +?u?u?u?d?d?d?d?s?d +?u?s?l?l?d?d?d?d?d +?d?d?d?l?l?l?d?d?s +?l?l?d?l?s?d?d?d?d +?l?l?l?s?l?d?d?s +?u?s?l?l?s?l?d?d +?u?l?u?l?s?d?s?d +?d?d?u?l?l?l?s?s +?u?l?l?s?l?s?d?d +?l?s?l?l?d?d?s?l +?u?u?u?s?u?s?d?d +?l?s?l?s?l?d?d?l +?u?s?u?u?u?s?d?d +?s?s?u?u?u?u?d?d +?s?l?d?l?l?l?d?s +?s?s?u?l?l?l?d?d +?l?l?l?s?d?d?s?l +?l?l?l?l?l?l?s?s?s +?d?d?d?d?u?l?l?l?l?l +?d?u?l?l?l?l?l?l?d +?d?d?d?d?u?u?u?d?d?d +?s?s?s?s?u?s?s +?d?d?d?l?d?d?l?d?d?d +?d?d?d?d?d?d?u?u?d?d +?d?d?d?d?d?d?l?d?d?l +?d?l?d?d?d?l?d?d?d?d +?u?l?l?u?l?l?l?l?d +?s?s?s?s?l?l?l?l +?u?l?l?l?d?l?d?d?d +?d?l?l?d?d?l?l?l?d +?u?d?l?l?d?l?l?d?d +?l?l?u?u?l?d?d?d?d +?u?u?d?d?l?l?l?d?d +?l?l?l?u?l?d?d?d?d +?l?d?l?d?d?l?l?d?l +?l?l?d?l?d?d?l?d?l +?l?l?d?l?d?l?d?d?l +?d?d?d?d?u?l?l?l?u +?l?d?d?l?d?l?l?d?l +?l?d?l?l?d?d?d?l?l +?l?l?l?d?d?l?d?l?d +?l?l?d?d?l?d?l?d?l +?u?l?l?l?s?d?l?l +?u?l?l?l?u?l?s?d +?u?u?u?d?u?u?u?s +?u?d?l?s?l?l?l?l +?d?u?u?u?u?u?u?s +?u?u?u?s?d?u?u?u +?d?d?d?d?d?d?d?d?d?d?d?d?d?d +?d?s?d?l?d?d?d?d?d +?d?d?d?u?s?d?d?d?d +?d?d?d?s?d?d?l?d?d +?d?d?u?d?d?d?d?d?s +?d?l?d?d?d?d?s?d?d +?d?d?d?d?d?d?d?d?u?s +?d?d?d?d?s?l?d?d?d +?s?d?d?d?l?d?d?d?d +?d?d?d?s?u?d?d?d?d +?d?s?d?d?d?u?d?d?d +?d?s?d?d?d?d?l?d?d +?d?d?d?d?l?d?d?d?s +?d?s?l?d?d?d?d?d?d +?s?l?d?d?d?d?d?d?d?d +?s?d?d?l?d?d?d?d?d +?d?d?d?d?s?u?d?d?d +?d?d?s?d?d?l?d?d?d +?s?d?l?d?d?d?d?d?d +?d?d?l?s?d?d?d?d?d +?d?d?d?d?s?d?d?l?d +?d?d?d?d?d?l?d?d?s +?u?d?d?d?d?s?d?d?d +?d?d?d?s?d?d?d?l?d +?d?d?u?d?d?s?d?d?d +?l?l?d?l?l?l?d?d?l +?d?l?d?d?l?l?l?l?l +?s?s?s?d?d?s?s?s +?d?d?d?l?l?d?d?d?l?l +?s?s?d?l?l?l?l?l +?s?l?d?l?l?l?l?s +?d?s?l?l?l?l?l?s +?l?s?l?l?l?s?l?d +?l?s?l?s?l?s?d?d?d +?d?d?l?d?d?d?d?d?d?d?d +?s?d?d?l?l?l?d?d?s +?l?l?l?l?d?d?d?d?d?s +?l?l?l?l?l?d?d?s?d?d +?u?d?l?l?l?l?l?l?l +?d?l?d?l?d?d?d?l?d +?d?d?d?l?d?d?l?d?l +?l?d?d?d?l?d?d?d?d?l +?u?d?d?u?d?d?d?d?u +?u?d?d?d?d?d?d?l?u +?u?u?d?d?l?d?d?d?d +?l?d?d?l?d?d?u?d?d +?l?d?d?l?l?d?d?d?d?d +?d?d?u?d?u?d?u?d?d +?u?u?d?d?d?d?l?d?d +?u?d?d?d?u?u?d?d?d +?d?d?d?l?l?d?d?l?d +?u?d?d?d?u?d?u?d?d +?u?d?d?u?d?d?d?u?d +?d?d?d?d?d?u?u?u?d +?d?d?d?d?l?l?d?l?d +?d?d?u?u?d?d?u?d?d +?u?l?d?l?d?d?d?d?d +?u?d?u?d?d?d?d?d?u +?d?l?d?d?d?d?d?l?l +?u?d?d?l?u?d?d?d?d +?u?d?u?d?d?u?d?d?d +?d?d?l?d?d?l?d?d?u +?d?d?u?d?d?l?u?d?d +?u?u?d?d?d?d?d?l?d +?d?d?d?u?d?u?u?d?d +?d?u?d?d?u?u?d?d?d +?u?d?d?l?d?d?d?d?u +?u?d?d?u?d?u?d?d?d +?u?d?l?d?d?d?l?d?d +?d?d?l?u?u?d?d?d?d +?l?l?l?d?l?l?d?d?d?d +?s?s?s?s?s?u?u +?u?u?s?s?s?s?s +?l?s?s?s?l?s?s +?l?l?l?d?l?d?l?l?d +?l?l?l?l?d?l?d?d?l +?l?d?l?l?l?d?d?l?l +?u?u?u?u?d?d?d?u?u +?l?l?d?l?l?l?d?d?d?d +?d?d?d?d?l?s?l?l?l +?l?l?l?d?d?d?d?s?l +?u?l?u?u?u?u?u?d +?l?l?l?u?u?d?l?l +?u?u?l?l?d?l?l?l +?d?l?u?u?u?u?u?u +?l?u?l?u?l?l?l?d +?l?l?l?l?d?u?l?u +?u?l?l?l?l?d?d?l?l +?l?l?l?l?d?u?u?l +?u?l?l?u?l?d?l?l +?u?l?l?l?u?l?u?d +?l?l?d?l?l?u?u?u +?u?u?u?u?u?u?d?d?u +?d?l?l?u?u?u?u?u +?u?u?u?l?l?l?d?l +?d?d?u?u?u?u?d?d?d?d +?d?d?d?d?d?d?d?d?d?l?d +?d?d?d?d?d?d?d?d?l?d?d +?d?s?d?s?d?d?s?d?d +?d?d?s?d?s?d?d?s?d +?d?d?s?s?d?d?s?d?d +?s?d?d?d?d?s?d?d?s +?d?d?s?s?s?l?l?l +?s?s?l?l?l?s?d?d +?u?u?l?l?u?l?l?l +?l?u?l?l?l?l?u?l +?u?u?u?u?l?l?d?d?d +?l?d?l?d?d?l?l?l?l +?l?l?d?l?l?d?l?d?l +?s?u?l?u?l?u?l?s +?d?s?d?s?d?d?l?l?l +?l?d?l?l?d?d?d?d?l +?l?l?d?d?d?l?d?l?d +?d?d?d?l?l?l?d?l?d +?d?d?d?u?u?u?u?u?d +?u?l?u?u?d?d?d?d?d +?u?u?d?l?l?d?d?d?d +?d?d?l?l?d?d?l?d?l +?u?l?l?u?d?d?d?d?d?d +?u?l?d?d?u?l?d?d?d +?d?d?d?d?d?l?l?u?u +?u?d?d?l?l?l?l?d?d +?u?u?u?d?d?l?l?d?d +?u?l?d?u?l?d?d?d?d +?u?l?d?d?l?l?d?d?d +?l?d?l?d?d?l?l?l?d +?u?u?u?d?d?d?d?d?l +?u?u?u?d?d?d?d?d?u +?d?d?l?d?l?d?l?l?d +?u?u?u?d?d?u?d?d?d +?d?l?d?d?d?l?d?l?l +?l?d?d?l?d?l?d?l?l +?d?d?d?d?u?u?d?u?u +?u?l?l?u?l?l?d?d?d?d +?d?l?d?d?l?d?l?l?d +?d?d?l?d?l?d?d?l?l +?d?l?l?l?d?l?l?d?d +?u?d?l?d?l?l?d?d?d +?u?d?d?l?l?l?d?d?d +?l?l?l?l?u?u?u?s +?u?u?u?u?l?l?l?s +?l?l?l?l?l?s?u?u +?d?d?d?d?d?d?d?d?u?u?u +?l?l?d?d?d?d?l?l?l?l +?l?l?d?d?s?d?d?s?d?d +?l?l?s?d?d?s?d?d?d +?s?s?s?s?s?s?d?d +?l?s?l?s?l?l?d?l +?s?u?l?l?l?l?d?s +?u?s?l?l?l?l?s?d +?l?l?l?l?d?l?s?s +?u?l?l?l?l?u?d?s +?u?u?s?d?l?l?l?l +?u?l?l?l?l?s?u?d +?s?d?d?d?d?l?s?s +?d?l?d?d?s?s?s?d +?s?s?u?s?d?d?d?d +?s?s?l?s?d?d?d?d +?d?u?s?s?s?d?d?d +?s?l?d?d?d?d?s?s +?s?d?d?s?s?d?d?l +?s?d?d?l?d?s?s?d +?l?s?d?s?d?d?d?s +?u?d?d?s?s?s?d?d +?u?d?s?d?s?d?d?s +?d?d?u?d?d?s?s?s +?l?d?s?d?s?d?d?s +?s?d?s?l?s?d?d?d +?d?s?d?s?d?s?d?u +?d?s?d?d?d?s?l?s +?s?u?d?d?d?s?s?d +?d?l?d?s?d?s?d?s +?u?d?d?d?d?s?s?s +?d?s?d?s?l?s?d?d +?s?l?s?d?d?s?d?d +?s?d?d?d?d?s?s?l +?s?l?d?d?s?d?d?s +?l?d?d?s?s?d?d?s +?d?d?d?d?u?s?s?s +?s?l?s?d?d?d?s?d +?l?s?d?d?s?d?s?d +?s?l?d?d?s?d?s?d +?l?d?d?s?d?s?d?s +?l?d?d?s?s?s?d?d +?l?s?s?d?d?d?d?s +?d?d?s?d?d?s?l?s +?s?s?s?d?d?l?d?d +?d?d?l?s?s?s?d?d +?l?l?l?s?l?l?s?l +?u?l?l?d?d?d?u?l?l +?u?u?u?u?s?u?u?u?u +?d?d?d?d?d?d?s?u?s +?d?d?d?d?s?d?d?s?l +?u?s?d?d?d?d?d?d?s +?d?d?s?l?s?d?d?d?d +?d?d?d?d?d?d?s?s?u +?l?d?d?d?d?s?s?d?d +?d?d?s?d?d?d?d?s?l +?s?d?d?d?d?d?d?s?u +?l?s?d?d?d?d?s?d?d +?l?u?u?u?u?u?u?l +?l?l?u?l?l?l?u?l +?l?l?l?l?l?l?l?d?d?s +?l?l?l?d?d?l?d?d?d?d +?l?d?d?d?d?d?d?d?s?d +?l?l?l?l?u?u?u?d?d +?u?l?l?l?l?l?d?l?d +?l?l?l?d?s?s?d?d +?l?d?s?l?l?s?d?d +?l?s?l?l?s?d?d?d?d +?u?l?d?d?l?s?s?d +?d?s?u?u?u?s?d?d +?u?s?l?s?u?d?d?d +?d?u?s?d?u?s?d?u +?s?l?d?d?d?l?l?s +?l?l?s?s?l?d?d?d?d +?u?s?l?u?s?d?d?d +?d?d?d?s?u?u?u?s +?u?d?l?s?l?s?d?d +?u?d?l?l?d?d?s?s +?l?u?u?s?s?d?d?d +?s?l?l?d?d?d?l?s +?u?l?l?d?s?d?s?d +?s?s?d?l?l?l?d?d +?u?l?u?d?d?d?s?s +?l?s?s?d?d?d?l?l +?u?s?d?d?d?s?l?l +?l?l?d?l?d?d?s?s +?l?l?d?l?d?s?s?d +?l?l?s?l?d?s?d?d +?s?d?l?l?l?d?d?s +?s?l?l?l?d?d?s?d +?s?l?l?d?d?l?d?s +?s?l?d?d?l?d?l?s +?s?l?l?d?l?d?d?s +?u?d?l?d?l?d?s?s +?l?d?s?d?l?s?l?d +?l?d?s?s?l?l?d?d +?l?l?l?d?s?d?d?s +?l?d?l?s?l?s?d?d +?s?l?d?l?l?s?d?d +?l?d?d?d?l?l?s?s +?d?d?d?d?d?l?d?d?d?d?d +?u?l?l?l?l?l?l?l?l?d +?l?d?l?l?d?d?l?l?l +?d?d?l?d?l?l?l?l?l +?d?d?d?u?u?u?l?l?l +?d?l?d?l?d?d?d?d?d?d +?d?d?d?d?d?l?d?l?d?d +?d?d?d?u?u?d?d?d?d?d +?l?l?l?d?d?d?d?d?l?l +?d?l?l?l?d?d?d?d?s +?s?l?l?d?l?d?d?d?d +?l?s?l?d?l?d?d?d?d +?l?l?d?d?d?s?d?d?d?d +?d?d?d?s?d?d?d?d?l?l +?l?s?s?s?l?l?l?l +?d?d?d?s?s?s?s?s +?u?s?l?u?l?l?d?d +?u?l?l?l?s?d?l?d +?u?u?u?u?s?d?d?u +?d?l?l?s?l?d?l?l +?l?d?l?l?l?s?l?d +?l?l?l?d?s?l?d?l +?l?u?l?l?l?d?d?s +?u?u?s?d?d?l?l?l +?u?s?d?l?l?l?l?d +?d?l?l?l?s?l?d?l +?d?l?d?l?s?l?l?l +?u?d?l?l?l?d?l?s +?l?d?l?l?s?d?l?l +?d?l?l?l?d?l?s?l +?l?l?u?l?l?s?d?d +?d?l?d?l?l?s?l?l +?u?l?d?l?l?l?s?d +?d?d?u?s?l?l?l?l +?u?l?l?u?l?d?d?s +?u?u?u?d?d?s?l?l +?u?l?u?s?u?l?d?d +?d?l?s?l?l?l?l?d +?s?l?l?d?l?l?l?d +?u?l?l?l?d?l?s?d +?d?l?s?d?l?l?l?l +?u?u?u?u?s?l?d?d +?s?l?l?d?l?l?d?l +?u?l?l?l?d?d?l?s +?d?s?l?d?l?l?l?l +?u?s?u?d?d?l?l?l +?d?l?l?l?s?d?l?l +?d?l?s?l?d?l?l?l +?u?l?d?d?s?l?l?l +?l?l?d?l?s?l?l?d +?d?s?d?u?u?u?u?u +?u?d?l?l?s?l?l?d +?d?s?l?l?l?d?l?l +?l?l?d?l?s?l?d?l +?l?s?l?d?l?d?l?l +?u?u?u?s?d?d?u?u +?l?l?l?d?l?s?d?l +?u?d?l?d?l?l?l?s +?l?d?l?l?l?s?d?l +?u?s?l?l?l?u?d?d +?u?l?l?l?d?u?l?l?l +?d?d?d?d?d?d?s?d?d?s +?u?d?d?d?d?u?l?l?l +?l?d?d?l?d?l?l?l?d +?d?l?l?l?d?l?d?l?d +?l?l?d?d?d?d?u?u?u +?d?l?l?l?l?d?d?d?l +?u?u?u?u?d?d?d?d?l +?l?u?u?l?l?d?d?d?d +?u?l?l?l?d?d?d?d?u +?l?d?d?d?l?l?d?l?l +?d?l?d?l?d?l?l?l?d +?u?l?l?l?l?u?u?d?d +?l?u?u?l?l?l?l?l +?l?u?l?l?l?l?l?u +?s?u?s?l?l?l?d?d +?s?d?d?u?l?l?l?s +?u?u?s?d?d?s?l?l +?s?l?d?l?d?l?l?s +?l?s?l?l?l?d?d?s +?d?d?u?u?l?l?s?s +?l?s?d?l?l?l?l?s +?l?l?l?s?d?s?l?l +?u?l?l?l?s?d?s?d +?d?d?s?l?l?l?s?l +?l?l?d?l?d?l?s?s +?s?l?d?l?s?l?d?l +?d?d?s?s?u?u?l?l +?s?s?l?l?d?d?l?l +?l?s?l?s?l?l?l?d +?s?l?l?d?l?l?d?s +?l?l?s?l?l?d?d?s +?u?d?l?l?d?l?s?s +?l?l?l?l?u?u?d?d?d +?l?l?l?d?l?l?d?d?l +?d?d?d?d?d?u?u?u?u?u +?u?l?l?d?l?u?l?l +?u?l?u?l?u?l?d?u +?u?d?l?l?l?u?l?l +?u?u?u?u?l?l?u?d +?l?d?l?l?u?l?l?l +?u?u?u?l?d?l?l?l +?u?u?u?l?l?u?u?d +?u?l?l?l?l?l?d?l?l +?l?l?d?l?u?l?l?l +?l?d?l?u?u?u?u?u +?u?l?u?u?u?l?l?d +?d?u?l?l?l?l?u?l +?l?d?l?l?l?l?u?u +?l?l?l?l?d?l?u?u +?l?d?l?d?s?l?d?l?d +?l?l?s?l?s?d?d?d?d +?u?u?u?s?d?d?s?d?d +?u?s?d?s?s?s?s +?d?s?l?s?s?s?s +?l?s?s?s?s?d?s +?s?s?s?s?s?u?d +?s?s?s?l?s?d?s +?l?s?s?s?s?s?d +?d?l?s?s?s?s?s +?l?s?d?s?s?s?s +?s?s?l?s?d?s?s +?u?s?s?s?s?s?d +?d?s?s?s?s?s?l +?s?d?l?s?s?s?s +?s?s?s?l?s?s?d +?l?s?s?d?s?s?s +?s?s?u?s?d?s?s +?d?s?s?s?s?s?u +?s?s?l?d?s?s?s +?s?d?s?l?s?s?s +?s?s?s?s?d?u?s +?l?s?l?l?l?u?u +?l?u?l?s?l?l?u +?u?u?l?s?u?l?l +?u?l?s?u?u?l?u +?u?u?u?u?l?s?l +?u?s?l?u?u?u?u +?l?u?l?u?l?l?s +?l?u?l?u?s?l?l +?l?l?u?u?s?l?u +?l?l?u?l?s?u?l +?l?l?u?s?l?u?u +?u?l?l?u?s?l?l +?u?l?l?u?s?l?u +?l?s?l?l?u?u?l +?l?l?u?l?u?s?u +?l?u?l?u?l?s?u +?l?u?u?u?l?l?s +?u?u?u?l?u?s?u +?u?l?u?u?l?s?l +?l?u?u?l?s?l?l +?u?l?l?u?s?u?u +?l?u?l?l?l?u?s +?l?l?l?u?l?s?u +?u?u?u?s?l?l?u +?u?u?s?l?l?u?u +?s?l?l?u?u?l?u +?u?s?u?u?l?u?l +?u?l?u?u?u?u?s +?l?l?l?u?u?l?s +?u?s?l?u?l?l?u +?s?u?u?u?l?u?u +?u?l?u?u?l?s?u +?l?u?s?u?l?u?l +?u?u?s?l?l?u?l +?l?l?u?u?l?s?u +?u?u?l?l?u?s?u +?u?l?u?u?s?u?l +?l?u?l?s?u?u?l +?l?u?s?u?l?l?u +?l?u?s?u?l?l?l +?u?u?l?u?l?s?l +?u?s?l?u?u?l?l +?s?u?l?u?l?l?l +?l?l?l?u?u?s?l +?u?u?s?l?u?l?l +?u?s?l?l?l?u?u +?s?u?l?l?u?u?l +?s?l?u?u?l?l?l +?l?s?l?u?u?l?l +?l?u?u?u?s?u?u +?l?l?l?l?u?s?l +?u?s?l?l?u?l?l +?l?u?l?s?u?l?u +?l?s?l?u?l?l?l +?u?u?u?u?l?u?s +?l?u?l?l?u?l?s +?s?l?u?l?l?u?l +?s?l?u?l?l?u?u +?l?l?l?u?s?l?u +?l?l?u?u?u?s?l +?u?u?u?l?u?s?l +?l?l?l?u?s?u?u +?l?l?l?u?s?u?l +?u?u?u?u?s?u?l +?l?u?u?s?u?l?l +?l?u?u?s?u?l?u +?u?u?s?l?u?u?u +?s?u?l?l?u?l?l +?u?l?l?s?l?u?l +?l?s?l?u?u?l?u +?u?u?l?u?u?l?s +?u?l?u?s?l?l?u +?s?l?l?u?l?l?u +?l?l?s?l?u?u?u +?l?l?u?u?l?u?s +?u?l?u?l?l?s?u +?l?u?u?l?l?s?l +?u?u?u?l?l?u?s +?s?l?l?l?u?u?u +?l?l?u?l?s?l?u +?u?s?l?l?u?u?l +?l?s?u?u?u?u?l +?s?u?l?u?u?l?u +?l?u?u?u?l?s?l +?u?d?l?l?s?l?l?l +?u?l?l?u?s?u?l +?u?l?u?s?u?u?u +?u?l?u?s?u?u?l +?u?u?l?u?u?s?u +?u?l?s?u?l?u?u +?s?u?l?l?l?u?l +?l?l?u?l?u?l?s +?u?u?u?u?s?l?u +?u?s?u?l?l?l?u +?l?u?s?u?u?u?u +?l?u?s?l?l?u?l +?s?l?l?u?l?u?l +?l?l?u?u?s?u?u +?d?l?l?l?l?l?l?l?l?d +?d?d?d?s?s?s?s?l +?l?d?d?d?s?s?s?s +?s?d?s?d?s?d?s?l +?s?s?l?d?d?d?s?s +?s?s?d?d?d?s?s?l +?u?l?u?l?l?d?d?u +?l?l?l?u?d?u?d?l +?d?l?l?l?l?d?u?u +?u?l?d?l?d?l?u?l +?d?l?u?l?u?d?u?l +?d?u?l?l?l?d?l?u +?u?l?u?d?l?u?l?d +?u?u?u?d?u?u?l?d +?l?l?d?d?l?d?l?l?l +?u?u?d?l?l?u?d?l +?u?u?d?l?u?u?d?l +?l?l?u?d?l?u?u?d +?u?d?d?u?l?l?l?u +?u?l?u?l?u?d?d?u +?u?u?u?d?d?l?u?l +?u?u?d?u?l?u?l?d +?u?d?l?u?u?d?l?l +?l?u?d?l?u?l?d?l +?u?l?d?d?l?u?l?l +?d?d?l?l?l?u?u?l +?d?l?u?u?u?l?l?d +?l?u?u?l?d?l?l?d +?u?d?l?l?l?d?u?l +?d?l?l?d?l?l?l?l?d +?u?u?u?u?d?d?l?u +?d?d?l?l?l?l?l?d?l +?l?d?u?l?l?d?l?l +?u?l?u?d?l?d?l?l +?l?u?u?d?d?l?l?l +?u?l?d?l?d?l?u?u +?l?l?l?d?l?l?u?d +?u?l?u?d?l?l?d?l +?u?l?l?d?l?u?d?l +?l?l?l?d?l?d?l?u +?l?l?l?u?d?u?u?d +?u?u?u?d?l?l?d?l +?l?u?d?l?l?u?d?u +?u?l?d?l?d?u?l?l +?d?l?l?u?u?u?l?d +?l?u?l?d?l?u?l?d +?u?l?l?d?d?l?u?l +?l?u?u?l?u?l?d?d +?u?l?d?l?u?l?u?d +?u?l?u?l?d?u?l?d +?u?d?l?l?l?d?u?u +?l?d?d?u?l?l?u?l +?l?l?u?d?l?l?d?l +?l?u?d?d?u?l?l?l +?d?l?u?l?d?l?l?u +?l?u?d?u?u?u?d?l +?l?l?d?d?l?u?u?u +?u?l?l?d?u?l?d?l +?u?l?u?d?d?l?l?u +?u?d?l?l?d?l?u?u +?u?l?d?l?u?d?u?u +?l?u?d?l?l?d?l?l +?u?u?u?l?l?d?l?d +?d?u?l?l?u?u?l?d +?u?l?l?d?u?u?l?d +?u?u?l?d?l?d?u?u +?u?u?l?l?d?d?u?l +?u?u?l?d?l?l?l?d +?d?l?l?u?l?u?d?l +?l?d?l?d?l?u?l?l +?u?l?l?d?l?d?u?u +?u?l?l?d?l?d?u?l +?l?l?d?u?l?l?u?d +?u?u?u?u?d?l?l?d +?l?l?d?u?l?l?d?u +?l?u?u?l?l?u?d?d +?l?l?u?u?u?d?d?l +?l?d?l?d?u?u?l?l +?u?l?u?d?u?d?l?l +?u?d?d?l?u?l?u?u +?l?l?d?d?u?u?l?u +?l?l?u?u?l?u?d?d +?u?u?u?l?d?l?l?d +?l?l?d?u?u?d?l?l +?l?l?d?l?u?l?d?l +?l?u?d?l?u?u?d?l +?l?l?u?u?l?d?d?l +?u?u?u?u?d?l?d?l +?l?d?u?u?d?u?l?u +?d?u?u?u?u?d?l?l +?u?d?d?u?u?u?l?l +?l?u?l?d?l?u?d?u +?u?l?l?u?d?d?u?l +?l?l?d?u?l?u?u?d +?l?u?l?u?d?d?l?l +?u?d?u?u?l?l?d?l +?d?d?l?l?u?l?l?u +?d?l?l?l?l?u?u?d +?u?l?d?d?u?l?l?u +?u?l?u?u?d?d?l?l +?u?l?d?l?u?l?l?d +?l?d?l?u?u?l?l?d +?d?l?l?l?l?l?d?l?d +?u?d?l?u?d?l?u?l +?u?l?d?u?d?l?l?u +?u?l?d?l?l?l?u?d +?l?l?l?d?u?u?l?d +?l?u?u?l?d?l?d?l +?u?u?l?u?l?d?d?u +?l?l?l?u?d?d?l?u +?u?l?u?u?l?d?l?d +?l?l?u?d?l?u?d?l +?d?d?l?l?u?l?u?l +?d?u?d?u?u?u?l?l +?u?l?u?d?d?u?u?u +?d?l?l?u?l?l?d?l +?u?u?d?u?l?l?d?l +?u?l?d?l?l?u?l?d +?u?l?l?u?d?l?d?l +?l?l?u?d?d?u?l?l +?u?u?d?u?d?l?l?l +?d?l?d?u?l?l?l?l +?d?l?d?l?u?u?u?u +?l?l?d?l?l?u?d?u +?u?u?u?l?d?d?u?u +?u?d?l?u?l?d?l?u +?l?l?l?u?u?d?d?u +?u?u?l?l?u?d?d?l +?l?l?d?d?u?l?l?u +?l?d?d?u?u?u?l?l +?l?d?l?l?u?d?l?l +?d?u?l?u?d?l?l?l +?u?d?l?u?l?u?d?u +?u?l?l?u?d?d?u?u +?u?u?d?d?l?u?u?l +?u?d?u?u?d?l?l?l +?l?l?d?l?d?l?u?u +?u?u?u?d?l?l?u?d +?d?l?l?l?u?l?d?l +?l?d?l?u?l?d?u?l +?u?l?d?l?l?l?d?u +?l?d?u?l?u?d?l?l +?u?d?l?d?l?l?l?u +?u?l?l?u?d?l?l?d +?l?l?l?d?d?u?l?u +?u?u?u?d?u?u?u?d?d +?u?l?d?d?l?l?u?u +?l?u?u?d?d?u?u?l +?l?l?l?l?l?l?d?l?l?l +?l?d?d?d?d?l?l?d?d?d +?d?d?d?d?d?d?l?l?d?l +?u?l?s?s?s?s?l +?s?l?s?s?s?l?l +?u?s?l?s?l?s?s +?s?s?s?l?s?l?l +?u?l?s?s?l?s?s +?s?s?u?s?s?u?u +?s?l?s?l?l?s?s +?s?s?s?s?l?u?l +?u?l?u?s?s?s?s +?s?l?l?u?s?s?s +?l?s?s?s?l?s?l +?s?u?u?s?u?s?s +?u?u?u?l?l?l?u?u +?u?l?l?l?l?u?u?l +?l?u?l?l?l?u?l?l +?u?l?l?u?u?l?l?l +?l?l?u?u?l?l?u?u +?s?u?s?l?l?l?l?l +?d?s?d?d?s?d?d?u?u +?u?u?u?s?s?s?d?d +?l?d?l?l?d?s?s?s +?l?s?s?s?l?l?d?d +?l?l?l?u?l?l?l?d?d +?l?l?l?d?d?d?l?d?d?d +?l?l?d?l?l?d?d?d?d?d +?u?l?l?s?d?d?s?d?d +?d?s?d?d?d?d?d?d?d?d?d +?u?l?l?l?l?d?l?d?d +?l?l?l?u?l?l?d?d?d +?l?l?l?d?d?l?l?d?l +?l?l?l?d?d?l?d?l?l +?l?u?l?l?l?l?d?d?d +?d?d?d?d?d?d?d?d?d?s?l +?s?l?l?l?l?l?l?l?d +?d?d?d?d?d?d?d?d?d?d?d?s +?s?s?s?s?d?d?d?d?d +?l?d?l?l?s?l?l?s +?d?d?l?l?l?l?d?l?d +?d?d?l?l?l?d?l?l?d +?d?l?d?d?d?l?l?l?l +?u?l?l?d?d?l?l?d?d +?l?l?l?l?l?d?d?l?l?l +?s?s?u?u?u?u?s?s +?u?u?s?u?u?s?u?u +?s?d?d?d?d?d?s?d?d +?d?s?d?d?d?d?s?d?d?d +?s?d?d?d?d?s?d?d?d?d +?d?s?d?d?d?d?d?s?d +?d?d?d?s?u?u?u?u?u +?l?l?d?d?d?d?d?d?l?d +?l?l?d?d?d?d?d?l?d?d +?d?d?d?u?u?u?d?d?d?d +?u?l?u?l?l?l?l?u +?u?l?u?l?l?u?l?u +?l?l?l?l?s?u?u?u +?l?l?l?l?d?l?l?l?l?l +?d?d?d?l?d?d?l?d?s +?l?d?l?d?d?d?s?d?d +?l?d?d?l?s?d?d?d?d +?l?d?d?d?d?s?l?d?d +?l?d?d?s?l?d?d?d?d +?u?s?d?d?d?d?d?d?l +?u?d?l?s?d?d?d?d?d +?d?d?d?d?l?s?l?d?d +?u?d?l?d?d?d?d?d?s +?s?d?d?d?d?d?d?u?l +?u?l?d?d?s?d?d?d?d +?u?u?d?d?d?s?d?d?d +?d?d?d?d?d?d?l?u?s +?l?s?d?l?d?d?d?d?d +?d?d?u?u?d?d?d?d?s +?d?d?d?d?d?u?d?u?s +?l?d?d?d?d?d?l?s?d +?s?d?d?l?d?d?l?d?d +?d?d?u?d?d?l?d?d?s +?l?s?u?d?d?d?d?d?d +?l?d?d?d?s?d?d?d?l +?d?s?d?l?l?d?d?d?d +?u?l?l?l?l?l?l?u?d +?l?l?s?l?l?l?l?l?d +?s?s?s?s?s?u?s +?s?l?l?l?l?s?l?l +?u?u?u?d?u?u?u?u?u +?l?l?s?s?s?l?l?l +?s?d?d?d?d?s?l?l?l +?d?d?d?d?l?d?l?d?d?d +?d?d?d?d?d?l?d?d?d?l +?d?d?d?l?d?d?d?l?d?d +?d?l?d?d?d?d?l?d?d?d +?d?d?d?l?d?d?d?d?d?l +?u?u?s?l?l?l?l?d +?l?l?l?l?l?u?s?d +?u?l?l?d?u?l?l?s +?u?l?d?s?l?l?l?l +?u?l?l?s?d?u?l?l +?u?l?l?l?l?l?u?l?l +?d?d?d?d?d?d?d?d?d?l?l?l +?s?s?d?d?d?d?d?d?s?s +?d?d?d?d?d?l?l?l?l?d +?d?l?l?l?d?d?d?l?d +?d?d?d?l?l?d?l?l?d +?u?u?u?l?d?d?d?d?d +?u?d?l?d?l?d?l?d?d +?d?d?l?l?d?l?d?d?l +?u?d?u?d?u?d?d?u?d +?d?d?l?d?d?l?l?l?d +?d?d?d?d?d?u?l?l?u +?l?l?l?d?l?d?d?d?d?d +?d?d?d?d?d?u?u?u?l +?l?l?d?d?l?d?d?d?l +?d?d?d?l?l?u?u?d?d +?d?l?l?l?d?d?l?d?d +?l?d?l?l?d?d?d?l?d +?d?l?l?d?d?l?d?d?l +?d?d?d?d?s?l?l?l?l?l +?l?l?d?l?d?d?l?l?l +?s?s?l?s?s?l?d?d +?u?l?l?u?d?l?u?u +?u?l?d?l?u?l?u?l +?u?d?u?l?u?l?u?l +?l?d?u?u?u?l?l?l +?l?l?d?l?l?l?u?u +?l?u?u?u?d?l?l?l +?u?d?u?u?l?l?l?l +?u?l?l?u?l?l?d?u +?l?l?l?l?u?u?l?d +?u?l?u?l?l?u?l?d +?u?u?l?l?l?u?l?d +?u?l?u?l?l?l?d?l +?l?u?u?u?l?l?l?d +?u?l?l?l?l?u?d?u +?l?l?l?u?u?u?d?l +?l?l?l?l?u?d?u?u +?l?l?l?d?u?u?u?l +?d?u?l?l?l?l?u?u +?u?l?l?l?l?s?d?d?d?d +?u?l?l?l?l?u?l?s +?l?d?l?d?l?d?s?d?d +?d?d?d?s?d?d?l?l?l +?s?l?d?l?d?l?d?l?d +?u?l?l?s?l?d?d?d?d +?d?d?d?l?l?l?l?s?d +?d?d?l?l?l?s?d?d?d +?d?d?d?s?d?l?l?l?l +?s?l?d?l?l?d?d?d?d +?u?u?l?l?d?d?d?d?s +?s?d?l?l?l?d?d?d?d +?d?l?l?l?d?d?s?d?d +?d?d?d?d?d?s?u?l?l +?d?d?d?s?l?l?l?d?d +?u?l?l?l?l?u?l?u +?u?l?l?l?l?l?l?l?u +?l?l?l?l?l?l?l?l?l?s +?l?d?d?l?d?d?l?l?d?d +?l?d?l?l?l?d?d?d?d?d +?d?l?l?l?l?s?s?s +?l?l?s?l?s?l?l?d +?l?s?l?s?l?d?l?l +?u?l?l?l?l?u?l?d?d +?u?d?d?l?l?l?l?l?l +?u?u?u?u?u?d?d?u?u +?d?d?d?l?l?l?l?s?s +?d?d?d?s?s?s?s?d +?s?d?d?s?d?s?d?s +?d?s?d?s?d?d?s?s +?s?s?d?s?s?d?d?d +?d?s?s?d?s?s?d?d +?s?d?s?s?s?d?d?d +?d?d?d?s?d?s?s?s +?s?s?d?d?s?d?d?s +?s?s?s?d?d?d?s?d +?d?s?s?d?s?d?s?d +?s?d?s?s?d?d?d?s +?u?u?u?u?u?u?u?d?u +?d?l?l?u?l?d?u?d +?d?l?l?d?d?u?l?u +?d?d?u?l?u?l?d?l +?l?l?d?l?d?d?l?u +?d?d?l?l?u?u?l?d +?l?u?l?d?d?u?d?u +?d?u?d?d?u?u?l?u +?l?l?l?u?d?u?d?d +?d?u?u?d?d?l?l?l +?l?l?d?u?u?l?d?d +?u?d?l?u?d?u?d?l +?u?l?u?d?d?u?d?l +?l?l?d?u?d?d?u?l +?u?l?d?l?d?l?u?d +?d?d?u?l?u?d?l?u +?l?u?d?d?l?d?l?u +?d?l?u?l?u?d?d?u +?u?d?u?d?u?l?l?d +?l?l?l?d?u?d?d?l +?d?l?d?u?d?u?l?u +?u?l?u?d?l?d?u?d +?u?l?d?l?l?d?u?d +?u?u?d?d?u?l?d?u +?l?l?u?d?d?d?u?u +?l?d?u?d?l?u?d?u +?d?u?l?d?l?u?d?l +?d?l?u?l?l?l?d?d +?u?u?d?u?l?d?u?d +?l?u?d?d?l?u?d?l +?l?d?u?d?l?d?u?l +?u?d?d?l?l?d?u?u +?l?u?l?d?d?u?d?l +?u?d?l?d?l?l?d?u +?u?d?u?d?l?l?u?d +?l?l?d?d?l?l?u?d +?d?u?u?l?d?l?d?u +?l?d?d?d?l?l?u?u +?d?u?u?l?l?d?d?u +?d?u?l?l?d?u?d?u +?u?u?u?d?l?d?u?d +?l?l?d?l?d?d?u?l +?d?l?l?u?u?u?d?d +?u?u?d?u?u?l?d?d +?l?u?d?u?d?d?l?l +?l?u?d?d?l?l?l?d +?d?d?l?d?u?u?l?u +?d?d?u?l?l?d?l?u +?l?l?d?d?u?d?l?l +?l?l?d?d?u?d?l?u +?u?l?d?l?l?l?d?d?d +?d?u?u?u?u?l?d?d +?l?d?u?l?u?d?d?u +?u?u?u?l?d?d?d?u +?d?d?l?u?l?l?d?l +?l?d?d?l?u?u?l?d +?l?u?u?d?l?d?d?u +?l?u?d?l?u?d?l?d +?l?d?l?d?u?u?u?d +?l?l?l?d?u?d?d?u +?l?l?l?l?d?d?d?u?u +?d?u?l?d?d?u?u?u +?u?l?u?d?d?u?l?d +?u?u?u?u?d?u?d?d?d +?l?d?u?l?u?l?d?d +?d?u?u?l?u?d?d?l +?l?d?u?u?d?l?l?d +?l?l?d?l?l?d?d?d?l +?d?d?u?u?d?u?u?l +?u?u?d?u?u?d?d?l +?l?d?u?l?l?u?d?d +?d?l?d?l?u?l?l?d +?d?l?u?d?u?u?u?d +?d?l?u?l?d?u?d?u +?l?l?d?u?u?d?u?d +?u?l?d?d?u?u?u?d +?d?d?l?d?l?l?l?u +?d?d?u?u?l?u?d?l +?d?d?l?l?d?l?u?u +?d?d?d?u?l?l?u?u +?l?l?l?d?d?u?d?u +?u?u?l?l?d?d?d?u +?u?d?u?d?l?u?d?l +?d?u?d?l?l?d?u?l +?d?l?l?u?u?l?d?d +?u?d?l?u?d?d?u?l +?d?d?l?d?u?l?u?u +?d?d?u?l?u?d?l?l +?u?d?d?d?l?l?u?l +?l?u?d?u?d?d?u?u +?u?d?u?l?d?u?l?d +?l?l?d?u?d?u?l?d +?l?d?d?l?u?u?u?d +?d?d?u?u?l?d?l?l +?l?u?d?u?u?l?d?d +?u?d?l?l?u?d?d?u +?l?u?d?l?d?l?d?l +?d?u?l?d?d?l?l?u +?u?d?d?l?u?u?l?d +?u?l?l?d?d?l?u?d +?u?u?d?u?d?l?d?l +?l?u?d?d?l?l?d?u +?l?u?d?l?l?d?d?u +?u?u?u?l?d?d?l?d +?u?d?u?d?l?d?l?u +?l?l?d?d?l?u?d?l +?l?d?d?l?u?u?d?u +?d?d?u?l?u?l?u?d +?u?d?d?l?u?l?d?u +?d?d?l?u?d?u?u?l +?u?d?u?l?d?d?u?u +?l?u?u?d?d?l?l?d +?u?u?d?d?l?d?l?l +?l?u?l?u?d?d?d?l +?u?d?l?u?l?d?d?u +?d?l?u?l?u?d?d?l +?l?d?u?l?d?u?d?u +?u?d?l?l?l?d?u?d +?d?d?u?u?l?d?u?l +?d?u?l?d?u?l?d?l +?d?u?d?l?l?u?u?d +?l?l?u?d?l?l?d?d +?u?u?l?d?u?l?d?d +?l?d?d?u?d?l?l?u +?l?d?l?u?d?d?l?u +?u?d?u?d?l?d?u?l +?u?d?u?l?l?d?l?d +?d?l?l?d?l?u?u?d +?d?l?d?l?u?l?u?d +?u?l?u?d?u?d?d?u +?u?l?d?d?d?l?u?u +?d?d?l?l?l?l?d?u +?l?d?d?u?u?l?d?l +?d?d?l?l?l?u?d?u +?d?u?l?d?l?l?u?d +?d?d?d?l?u?u?l?l +?l?u?d?d?u?l?l?d +?l?d?d?d?u?l?l?u +?l?d?u?d?u?u?d?l +?l?d?l?u?u?d?l?d +?l?d?u?u?u?l?d?d +?u?l?d?d?l?d?u?l +?d?l?u?d?u?d?u?u +?u?u?d?d?l?d?u?u +?d?d?l?l?l?u?u?d +?l?l?d?d?l?u?u?d +?u?d?u?u?d?u?l?d +?d?d?l?l?l?l?u?d +?u?d?d?u?d?u?l?u +?l?d?l?d?l?d?u?l +?l?d?d?l?u?d?u?u +?d?u?d?d?l?l?u?u +?u?d?l?l?d?l?u?d +?u?l?d?l?d?u?u?d +?l?d?d?l?l?d?u?l +?u?l?d?l?u?d?u?d +?u?u?l?l?u?d?d?d?d +?l?u?d?l?l?d?l?d +?u?d?u?d?d?u?u?l +?l?d?l?l?u?l?d?d +?u?l?d?l?u?d?d?u +?l?u?u?d?d?d?u?u +?l?u?d?l?d?d?u?u +?d?l?u?d?d?u?l?u +?u?u?d?l?l?d?l?d +?d?u?l?u?u?u?d?d +?l?u?d?d?u?u?d?l +?u?u?l?d?l?d?l?d +?d?l?l?d?l?u?l?d +?d?l?d?l?u?d?l?u +?l?u?u?d?d?u?l?d +?u?l?d?l?d?u?l?d +?l?d?l?u?l?u?d?d +?d?u?u?u?l?d?l?d +?l?d?l?u?d?l?d?l +?u?u?d?l?u?d?d?u +?d?l?d?u?u?l?d?l +?u?u?d?d?l?l?d?l +?l?u?d?d?u?d?l?u +?u?l?l?d?u?d?d?u +?l?d?u?u?l?d?l?d +?u?d?l?d?l?u?d?u +?u?l?u?l?d?l?d?d +?d?l?u?u?l?d?l?d +?d?l?d?u?l?l?d?l +?u?u?d?u?l?d?d?l +?d?u?l?d?l?l?d?l +?l?l?d?l?d?u?u?d +?l?d?u?l?d?l?d?u +?d?l?u?d?u?u?d?l +?u?d?d?l?u?u?d?u +?d?l?d?u?l?l?u?d +?d?d?u?l?l?l?d?u +?u?d?l?d?d?u?u?u +?d?l?l?d?d?u?u?l +?l?l?u?d?d?d?l?u +?d?u?u?l?u?u?d?d +?l?l?d?l?d?l?d?u +?d?u?l?u?u?d?l?d +?l?l?d?d?u?u?u?d +?d?l?l?d?u?d?u?l +?l?d?l?l?d?u?d?u +?d?l?l?d?l?d?u?u +?d?l?l?d?l?d?u?l +?l?l?u?u?d?d?d?l +?l?d?l?d?u?d?u?u +?d?l?d?d?u?l?u?u +?d?l?d?d?u?l?u?l +?u?d?u?l?u?d?u?d +?d?l?d?u?u?l?u?d +?u?u?d?l?d?l?d?u +?d?u?d?l?d?l?l?u +?u?u?u?d?d?l?u?d +?l?l?d?d?u?l?u?d +?l?d?d?u?l?l?d?u +?d?u?l?l?u?d?l?d +?l?l?u?d?d?l?d?l +?d?d?l?u?l?u?d?u +?l?l?u?d?d?l?d?u +?l?u?d?l?u?u?d?d +?d?l?u?d?l?d?l?l +?d?d?u?l?u?u?d?u +?l?d?l?d?u?d?l?l +?l?d?d?d?l?l?l?d?l +?d?u?u?d?d?u?u?l +?d?l?l?l?d?d?u?l +?d?d?l?u?l?l?l?d +?d?l?l?d?l?u?d?l +?d?u?d?u?l?l?l?d +?l?d?u?d?d?u?l?l +?l?d?d?u?l?d?u?l +?u?d?d?l?l?u?d?u +?u?l?l?d?d?d?d?u?l +?l?l?d?l?l?d?d?u +?d?d?l?d?l?d?l?l?l +?d?d?u?l?u?d?u?l +?u?u?u?d?d?l?d?l +?l?l?d?d?u?u?l?d +?u?l?d?u?l?d?d?u +?l?d?d?l?l?l?d?u +?u?d?d?u?u?d?l?u +?l?l?d?l?u?l?d?d +?d?d?l?d?l?l?u?l +?d?l?d?l?u?l?d?l +?u?u?l?u?d?d?d?l +?l?d?l?l?d?u?d?l +?d?d?d?u?u?l?u?u +?l?l?d?l?u?d?d?l +?d?d?u?l?u?u?u?d +?d?u?l?u?l?d?u?d +?d?d?u?l?d?l?u?u +?l?d?d?l?l?u?l?d +?u?l?u?d?d?d?u?u +?d?l?l?u?d?d?u?u +?u?d?u?l?d?u?u?d +?u?d?u?u?l?u?d?d +?d?l?l?u?l?d?d?l +?d?d?u?l?d?u?u?u +?d?u?u?l?u?l?d?d +?l?d?u?u?d?u?l?d +?u?l?d?u?d?l?l?d +?d?l?d?d?l?u?u?u +?u?u?d?d?l?d?u?l +?l?d?u?d?d?u?u?l +?d?d?u?l?l?d?u?l +?d?u?l?l?l?l?d?d?d +?u?u?d?l?u?l?d?d +?l?l?d?d?d?l?l?d?l +?u?d?u?l?d?l?d?l +?u?u?u?d?d?u?d?l +?u?d?u?u?l?d?d?u +?u?d?l?l?d?u?d?u +?l?u?u?d?d?d?l?l +?d?l?d?l?u?u?d?u +?d?d?u?l?u?u?l?d +?d?u?l?l?u?u?d?d +?l?l?l?u?d?d?d?u +?d?u?u?d?l?d?u?u +?u?d?l?l?u?u?d?d +?d?d?l?u?u?u?d?l +?u?d?u?l?d?d?l?u +?l?d?d?u?l?u?d?l +?l?u?l?d?u?d?l?d +?d?u?u?l?d?d?l?u +?d?d?u?l?u?l?d?u +?u?d?d?u?u?l?d?l +?u?u?d?l?u?d?d?l +?u?d?d?d?u?u?l?u +?d?d?l?u?d?l?l?l +?d?d?l?l?l?u?l?d +?d?u?d?u?l?d?u?l +?l?l?d?u?l?u?d?d +?d?u?l?l?d?d?u?l +?u?d?l?l?u?d?u?d +?d?d?u?d?l?l?u?l +?u?u?l?d?d?u?d?l +?d?u?d?l?u?l?d?l +?u?l?d?u?d?d?l?l +?u?l?d?u?d?d?l?u +?l?d?d?u?l?u?d?u +?l?d?u?u?u?d?u?d +?u?l?d?u?u?u?d?d +?d?d?l?l?u?l?l?d +?d?l?l?u?d?l?l?d +?l?d?u?l?u?d?d?l +?d?u?l?u?l?d?l?d +?d?d?u?l?l?d?l?l +?u?d?l?d?u?u?d?l +?u?d?l?u?d?l?u?d +?u?u?d?l?d?d?u?l +?u?d?l?d?l?d?l?u +?u?l?d?u?d?l?d?u +?d?l?l?d?l?l?d?d?l +?l?d?l?u?u?d?d?l +?d?l?l?u?d?u?l?d +?d?l?d?u?u?u?d?l +?d?u?d?u?u?u?l?d +?l?d?l?l?u?d?u?d +?d?u?u?l?d?d?u?u +?d?u?d?u?d?u?l?l +?d?u?d?u?d?u?l?u +?d?l?l?l?u?d?l?d +?d?u?d?l?u?d?u?l +?d?d?l?l?d?u?l?l +?d?u?d?l?l?l?u?d +?l?l?l?u?d?d?l?d +?l?d?u?l?d?l?l?d +?u?d?d?u?l?d?l?u +?d?d?u?l?u?l?l?d +?l?d?u?d?l?d?l?l +?d?d?u?u?u?l?d?l +?u?l?d?l?d?d?u?l +?l?u?u?l?d?d?u?d +?d?u?l?u?l?d?d?u +?d?u?d?l?d?u?l?u +?u?l?d?l?d?d?u?u +?d?u?u?d?l?l?l?d +?d?l?u?l?d?l?d?l +?d?u?d?u?l?l?d?l +?l?d?l?l?l?d?u?d +?l?u?l?l?u?d?d?d?d +?d?u?u?u?l?d?d?l +?u?d?u?l?l?u?d?d +?l?d?l?d?d?u?u?l +?u?d?d?u?u?l?l?d +?u?u?l?d?l?d?d?l +?d?l?d?l?l?u?d?u +?d?l?d?d?u?u?u?u +?l?u?d?d?d?l?l?u +?l?d?d?d?u?u?l?u +?u?d?l?u?d?u?u?d +?l?d?u?l?u?d?l?d +?l?d?d?u?l?l?l?d +?d?l?d?u?d?l?l?l +?u?l?u?d?d?l?u?d +?u?u?d?u?d?d?l?u +?l?d?u?d?u?u?d?u +?u?d?u?u?d?l?d?l +?d?u?l?d?u?u?l?d +?l?d?d?l?u?d?l?l +?d?u?l?d?d?l?u?l +?l?d?u?d?u?l?l?d +?u?u?d?d?l?u?l?d +?d?d?u?u?u?d?l?u +?l?l?u?u?d?d?d?u +?u?d?l?l?d?l?d?l?d +?d?u?d?d?u?l?l?l +?d?u?d?d?u?l?l?u +?d?d?d?l?u?l?u?l +?d?l?d?u?l?l?l?d +?l?d?l?u?l?d?d?l +?l?d?u?l?d?d?l?l +?d?d?l?u?l?u?u?d +?d?u?l?l?d?u?u?d +?u?d?u?l?u?d?l?d +?u?u?d?d?d?l?u?u +?u?u?d?d?d?l?u?l +?l?u?l?d?d?l?d?l +?d?d?u?d?l?l?u?u +?u?d?d?l?d?u?u?l +?d?d?u?l?l?l?u?d +?d?d?l?u?l?u?l?d +?u?d?u?d?u?u?d?l +?u?u?u?l?d?d?u?d +?d?d?l?u?l?d?l?l +?d?d?l?d?u?l?u?l +?d?d?l?l?d?u?u?l +?d?d?u?u?u?u?d?l +?l?d?l?d?d?u?l?u +?d?d?u?l?l?u?d?l +?d?d?l?l?u?d?l?l +?l?d?d?l?d?l?u?l +?l?u?u?d?d?u?d?l +?l?l?d?d?u?l?d?u +?d?u?d?l?u?u?d?u +?d?l?l?l?d?u?d?l +?l?d?d?u?u?u?l?d +?d?d?l?l?l?d?u?l +?u?l?l?d?u?l?d?d +?u?u?d?u?d?u?d?l +?l?d?u?l?d?l?d?l +?l?d?u?u?d?l?d?u +?d?d?l?u?u?l?d?u +?l?d?d?u?u?d?u?u +?d?u?u?d?d?u?l?u +?u?d?d?u?l?d?u?l +?l?d?u?u?d?d?u?u +?u?u?d?d?u?d?u?l +?d?l?u?u?u?u?d?d +?d?d?l?u?u?u?l?d +?l?d?d?u?u?u?u?d +?d?u?d?l?l?l?d?l +?d?d?u?l?l?l?d?l +?d?u?u?l?d?u?u?d +?d?u?l?u?d?u?d?l +?l?u?d?l?d?u?d?u +?u?d?l?d?d?l?u?u +?d?d?l?d?l?u?u?u +?d?d?l?u?l?l?u?d +?u?d?u?u?d?l?l?d +?d?l?l?d?d?l?l?u +?u?u?d?l?l?d?u?d +?u?u?l?u?d?l?d?d +?l?d?d?l?d?u?l?u +?l?d?d?d?u?u?u?l +?d?u?l?d?u?u?d?u +?l?d?l?d?d?u?u?u +?u?l?d?d?u?d?l?l +?l?l?u?d?d?u?d?l +?l?l?u?d?u?l?d?d +?u?l?l?d?l?d?d?u +?d?u?u?u?d?l?d?l +?d?d?d?u?l?l?l?l?d +?l?l?d?d?u?u?d?u +?u?l?d?l?l?l?l?d?d +?d?l?l?l?d?u?d?u +?d?u?l?u?d?l?u?d +?u?u?d?d?l?u?u?d +?l?d?u?u?u?d?d?u +?d?u?u?u?l?u?d?d +?d?u?u?d?d?u?l?l +?l?l?d?u?u?d?d?l +?d?d?u?l?d?l?l?u +?l?u?d?d?u?u?l?d +?d?d?u?u?d?l?l?l +?d?d?s?d?d?s?d?s?d +?s?d?d?s?d?d?d?d?s +?s?d?s?d?s?d?d?d?d +?d?s?d?s?d?s?d?d?d +?d?s?l?l?l?l?l?l?l +?l?d?d?l?d?d?l?d?l?d +?l?l?l?l?l?u?u?s +?d?d?s?d?s?d?d?d?d?d +?d?s?d?d?d?s?d?d?d?d +?d?d?d?d?d?d?d?s?s?d +?l?s?d?l?l?l?l?l?l +?l?l?s?s?d?d?d?s +?d?d?d?s?s?s?l?l +?l?l?d?s?d?s?d?s +?l?s?l?s?s?d?d?d +?l?d?d?d?l?s?s?s +?d?d?d?s?l?s?s?l +?l?l?s?d?s?d?s?d +?d?s?d?s?l?l?s?d +?d?d?d?s?l?l?s?s +?l?s?d?s?l?s?d?d +?s?d?d?d?s?l?l?s +?l?d?s?s?d?d?l?s +?d?s?l?s?l?s?d?d +?u?s?s?d?l?s?d?d +?s?l?l?d?d?s?d?s +?s?l?s?l?d?d?d?s +?l?s?l?d?d?d?s?s +?u?s?u?d?d?d?s?s +?l?l?u?l?l?l?l?d?d +?u?l?l?l?l?l?l?d?l +?l?d?s?d?d?d?d?d?d?d +?d?d?s?l?l?s?d?d?d +?u?s?u?s?d?d?d?d?d +?l?s?d?d?d?d?d?s?l +?l?u?l?u?l?l?l?l +?l?l?l?u?l?l?u?l +?u?u?u?l?l?u?u?u +?u?u?l?l?l?u?u?u +?l?l?l?l?l?u?l?u +?u?u?u?u?s?s?s?s +?u?u?u?s?d?d?d?d?d?d +?l?l?d?d?l?d?d?l?d?d +?l?l?l?u?u?u?u?d?d +?d?l?l?l?l?l?d?d?l +?d?l?d?l?l?d?l?l?l +?d?l?d?l?l?l?l?l?d +?u?u?u?l?l?l?l?l?d +?u?u?l?l?u?u?d?d?d +?u?u?u?u?u?d?d?d?u +?d?d?d?s?d?d?s?d?d?d?d +?s?l?l?d?d?d?d?d?d?d +?s?l?s?l?l?l?d?d +?l?l?s?d?s?d?l?l +?d?d?l?l?s?s?l?l +?u?s?u?l?l?s?d?d +?u?l?l?u?d?d?s?s +?d?l?l?l?l?d?s?s +?l?l?l?s?s?d?d?l +?u?u?d?d?l?l?s?s +?u?l?l?l?d?s?d?s +?u?l?d?s?u?l?d?s +?l?l?u?u?s?s?d?d +?d?d?l?l?l?s?s?l +?l?l?d?s?l?l?d?s +?s?u?u?s?d?l?l?d +?s?s?u?u?l?l?d?d +?d?l?l?d?l?l?s?s +?u?l?l?u?s?s?d?d +?u?s?u?s?u?u?d?d +?s?l?l?l?s?l?d?d +?l?l?s?d?s?l?l?d +?d?s?u?l?l?l?s?d +?s?l?l?d?l?d?l?s +?u?s?l?d?u?s?l?d +?s?d?l?l?l?d?l?s +?d?l?d?l?l?l?s?s +?u?u?d?d?s?s?l?l +?d?d?s?s?l?l?u?u +?u?s?u?s?l?l?l?l +?s?u?l?l?l?l?u?s +?l?d?d?d?l?d?d?l?d?d +?l?l?l?s?s?s?l?l +?l?l?l?d?d?d?d?l?s +?u?s?u?u?u?d?d?d?d +?u?u?s?u?l?l?l?l +?l?d?l?d?l?s?s?s +?l?l?l?l?d?d?d?d?d?l +?u?l?l?u?l?l?l?l?l +?u?l?l?l?s?u?l?l?l +?u?u?s?d?u?u?u?u +?l?l?l?l?l?s?d?l?d +?u?l?s?u?l?l?l?d +?l?l?l?l?l?s?u?d +?u?l?s?l?d?l?l?l +?s?d?d?d?d?l?l?l?s +?d?d?d?d?s?l?l?l?s +?l?l?d?d?d?d?d?l?l?l +?l?d?d?l?l?l?l?d?l +?d?l?l?d?d?l?l?l?l +?u?u?d?u?u?d?u?u?d +?d?l?l?d?l?l?l?d?l +?u?u?u?u?u?u?d?u?u +?d?l?l?l?l?l?l?l?d?d +?s?s?d?s?s?s?s +?u?l?l?l?l?u?d?d?d?d +?u?l?u?s?s?l?u +?s?l?l?l?s?u?u +?u?u?u?s?s?u?l +?l?s?u?l?s?l?l +?u?l?l?u?u?s?s +?s?l?u?l?l?s?l +?u?s?s?l?u?l?l +?u?s?s?l?u?l?u +?u?s?u?u?s?l?l +?u?u?u?u?s?s?l +?l?l?l?d?l?l?s?s +?s?l?l?u?l?s?l +?u?s?u?u?s?u?l +?l?s?u?u?u?l?s +?l?u?l?l?s?u?s +?u?l?s?u?s?u?l +?u?l?l?s?u?s?l +?s?u?u?s?l?l?l +?l?l?s?l?u?l?s +?u?s?u?s?u?u?l +?u?l?l?u?s?l?s +?s?l?u?l?s?l?u +?s?l?u?l?s?l?l +?l?l?s?s?l?u?l +?l?l?s?s?u?u?u +?u?u?s?l?s?l?u +?l?u?l?s?u?s?l +?l?s?l?l?s?l?d?l +?l?l?u?s?l?s?u +?u?s?l?l?u?s?u +?s?l?u?l?u?s?l +?u?l?u?s?u?l?s +?l?u?l?s?l?s?l +?l?l?u?s?u?u?s +?u?u?l?u?l?s?s +?l?s?s?l?l?u?l +?l?u?s?s?l?l?l +?u?u?l?s?s?l?l +?u?l?u?s?u?s?u +?l?u?s?l?l?l?s +?l?s?l?l?l?u?s +?s?l?u?u?u?l?s +?u?u?l?u?s?u?s +?s?s?l?u?u?l?l +?l?l?u?u?l?s?s +?u?s?l?u?l?u?s +?u?s?u?s?l?l?u +?s?l?u?s?u?l?u +?s?s?u?l?l?l?l?l +?u?s?l?l?l?u?s +?s?s?u?l?u?l?u +?s?s?u?l?u?l?l +?l?s?s?l?l?l?u +?l?s?u?l?l?l?s +?u?l?s?l?s?u?l +?u?u?s?s?u?u?l +?l?s?l?l?l?s?u +?s?u?u?u?s?u?u +?l?s?l?u?l?l?s +?s?l?l?l?l?s?u +?u?l?u?s?s?u?l +?s?l?u?u?l?u?s +?l?u?s?l?s?l?l +?s?u?u?u?u?u?d?s +?l?l?l?u?s?u?s +?u?u?u?s?l?s?l +?u?u?s?u?u?s?l +?s?u?l?u?l?s?u +?l?l?u?s?l?l?s +?s?s?l?u?l?l?l +?l?s?l?l?s?u?l +?u?s?u?l?u?l?s +?u?u?s?u?l?s?l +?u?l?s?u?l?s?u +?u?s?l?l?s?u?u +?u?u?u?l?l?s?s +?s?s?l?u?l?l?u +?u?l?s?s?u?l?u +?u?s?l?u?l?s?l +?l?l?u?l?u?s?s +?l?l?u?l?s?s?l +?l?s?u?s?l?l?u +?u?l?l?l?s?s?u +?u?l?s?l?s?u?u +?u?s?u?l?l?s?u +?u?u?u?u?l?s?s +?u?l?s?l?l?s?u +?u?u?l?s?u?u?s +?u?l?l?u?s?s?u +?s?u?u?u?s?l?l +?l?u?u?l?l?s?s +?s?u?u?l?l?u?s +?u?u?l?s?l?s?l +?u?u?s?l?s?u?u +?l?l?s?u?l?s?l +?u?u?u?s?s?l?l +?l?l?s?l?l?s?u +?s?u?l?s?u?l?l +?s?u?u?u?u?l?s +?s?l?l?l?u?u?s +?l?l?l?s?u?l?s +?s?l?u?s?l?u?l +?u?s?u?s?u?l?u +?u?u?s?s?u?l?l +?l?l?l?s?l?u?s +?u?l?u?l?s?u?s +?s?l?u?u?l?s?l +?l?l?l?u?l?s?s +?u?l?u?s?u?u?s +?u?l?s?s?l?u?l +?u?s?u?l?l?s?l +?u?l?s?u?l?u?s +?u?s?u?l?u?s?l +?d?s?s?l?l?l?l?l +?u?u?s?u?s?l?l +?u?s?u?l?l?l?s +?s?s?u?l?l?l?u +?s?u?l?l?u?s?u +?l?u?l?l?l?s?s +?s?l?l?u?l?u?s +?l?l?u?u?s?u?s +?u?s?s?l?l?u?l +?u?u?l?s?l?l?s +?l?u?l?l?l?l?l?d?d +?u?u?u?d?d?l?l?l?l +?u?l?u?u?u?u?u?u +?u?l?u?l?u?l?u?u +?u?l?u?u?l?l?l?l +?l?l?l?l?l?u?u?l +?u?l?u?l?l?l?u?l +?l?d?s?l?l?l?l?d +?u?l?s?d?d?l?l?l +?u?u?u?u?s?d?d?l +?l?l?l?l?d?d?s?u +?u?u?u?d?d?s?u?u +?d?l?l?l?l?s?l?d +?d?l?l?s?l?l?d?l +?u?s?l?l?d?d?l?l +?l?l?l?u?l?s?d?d +?l?s?l?l?l?d?d?u +?l?l?l?l?u?d?d?s +?u?l?l?l?d?d?s?l +?u?u?d?d?s?l?l?l +?l?l?u?u?l?s?d?d +?l?s?d?l?l?d?l?l +?s?l?l?u?l?l?d?d +?l?l?l?s?d?d?u?u +?d?l?s?l?l?l?d?l +?l?l?d?l?l?s?d?l +?u?l?l?s?u?u?d?d +?d?l?d?l?l?l?s?l +?u?l?u?l?u?d?s?d +?d?d?u?l?l?s?u?u +?u?l?d?d?l?s?l?l +?u?s?l?d?d?l?l?l +?l?l?u?u?u?d?d?s +?l?l?d?d?s?u?u?u +?u?l?d?s?l?l?l?d +?u?l?d?d?l?l?s?l +?d?l?l?l?l?s?d?l +?s?l?d?l?l?l?l?d +?l?l?l?l?s?d?d?u +?l?s?u?l?l?l?d?d +?d?l?l?l?d?s?l?l +?u?d?l?l?s?l?d?l +?u?l?l?d?l?l?s?d +?l?l?l?u?u?s?d?d +?u?s?l?u?u?l?d?d +?d?u?u?u?d?u?u?s +?l?u?u?l?l?s?d?d +?s?d?l?l?l?d?l?l +?u?l?l?l?s?d?d?u +?u?d?l?s?l?l?l?d +?l?l?s?l?l?d?d?l +?l?l?s?d?l?l?d?l +?u?d?d?l?l?s?l?l +?s?l?l?d?l?d?l?l +?u?d?l?l?d?l?s?l +?s?s?s?l?l?l?d?d?d +?l?l?l?l?u?l?l?d?d +?u?d?d?d?d?u?u?u?u +?d?l?d?d?l?l?d?l?l +?d?l?l?l?d?d?l?l?d +?l?d?l?d?l?d?l?d?u +?u?l?l?d?l?l?d?d?d +?l?l?d?l?d?d?d?l?l +?u?u?l?l?l?l?l?l?d +?s?u?s?s?s?u?s +?s?s?u?s?s?l?s +?s?s?s?u?s?l?s +?s?s?l?s?s?l?s +?s?l?s?s?l?s?s +?s?s?l?l?s?s?s +?s?s?s?s?s?u?l +?l?s?u?s?s?s?s +?u?s?s?u?s?s?s +?s?l?l?s?s?s?s +?s?u?s?s?s?s?u +?l?l?l?s?u?u?u?u +?l?l?l?l?l?l?l?u?d +?d?d?l?l?l?d?d?l?l?l +?u?d?u?d?u?d?u?d?u?d +?s?s?l?d?l?d?s?s +?u?l?u?u?d?l?l?l +?d?u?u?u?u?u?u?l +?u?l?l?d?l?l?u?l +?u?l?u?l?u?d?l?l +?l?l?l?d?l?l?u?u +?u?l?u?l?u?d?u?l +?l?l?l?d?u?l?u?l +?l?l?u?d?l?l?u?l +?u?l?l?u?u?u?l?d +?u?l?l?d?u?u?l?l +?l?d?l?l?l?u?u?u +?l?u?l?d?l?l?u?l +?u?u?u?l?l?u?d?u +?l?d?u?u?l?l?l?l +?u?l?l?u?u?u?u?d +?l?d?l?l?u?l?u?l +?d?l?u?u?l?l?l?l +?u?d?l?l?l?u?u?u +?l?u?l?d?l?l?l?u +?u?u?u?u?u?d?u?l +?l?u?u?u?u?u?d?u +?u?u?l?u?l?l?l?d +?l?l?l?d?u?l?l?u +?l?u?u?l?l?d?u?l +?l?l?l?u?d?l?u?l +?d?l?l?u?l?l?l?u +?l?u?d?u?l?l?u?l +?l?u?u?u?u?d?u?u +?l?d?l?u?l?l?l?u +?u?u?d?u?u?l?l?l +?d?d?d?l?l?l?l?l?d?d?d +?u?u?u?l?l?l?d?d?d?d +?d?l?l?l?l?d?l?d?l +?l?l?l?l?s?d?s?d?d +?s?l?l?s?l?l?l?l +?l?l?l?l?l?l?s?s?d +?d?l?d?d?l?d?d?d?d?d +?d?d?d?l?d?d?l?d?d?l +?d?d?u?u?d?d?d?d?d?d +?d?d?l?d?d?l?d?d?d?l +?l?u?l?d?d?d?d?d?d?d +?d?d?d?l?d?l?d?d?d?d +?d?d?d?d?u?d?d?d?d?l +?d?l?d?d?d?d?d?l?d?d +?d?d?d?d?d?d?d?u?l?u +?l?d?d?d?l?l?d?d?d?d +?u?l?l?l?l?d?d?d?d?d?d +?d?d?d?s?d?d?s?d?d?d +?d?d?d?d?d?d?s?s?d?d +?u?l?l?d?l?l?l?l?l +?l?l?l?l?l?l?l?l?l?l?l +?u?l?s?l?l?d?d?d?d +?s?d?d?l?l?l?l?d?d +?d?d?d?d?l?l?l?s?l +?u?u?u?s?u?u?u?d?d +?l?u?u?u?u?l?l?l +?u?l?u?l?u?l?l?u +?l?d?d?d?d?d?d?d?s?l +?l?l?l?l?s?u?l?l +?u?l?u?l?u?l?d?d?d?d +?l?l?l?d?d?l?l?l?l?l +?u?l?l?l?l?d?d?d?l +?l?l?d?l?l?d?d?l?l +?l?l?l?l?l?l?s?l?d +?l?s?l?l?l?l?l?l?d +?u?l?l?s?d?d?d?d?d?d +?d?d?d?d?s?s?d?d?l +?s?d?d?d?d?s?d?d?l +?d?d?d?s?s?l?d?d?d +?d?d?s?d?d?s?l?d?d +?d?d?s?d?d?l?d?d?s +?s?u?s?d?d?d?d?d?d +?d?d?d?d?d?s?u?s?d +?l?d?d?d?d?d?s?d?s +?s?s?d?d?d?d?d?d?l +?d?d?d?s?l?s?d?d?d +?d?d?d?d?d?d?u?s?s +?d?d?d?s?u?s?d?d?d +?l?l?l?d?d?s?l?l?l +?l?l?s?l?l?s?d?d?d +?l?l?l?l?l?s?l?l?d +?l?d?d?d?l?l?l?d?d?d +?d?d?s?d?d?d?d?d?d?l +?d?d?d?d?d?d?d?s?d?l +?u?u?u?u?u?d?d?d?d?d?d +?s?s?s?d?d?d?l?l?l +?u?s?u?l?l?l?s?d +?l?l?d?s?l?l?l?s +?l?l?l?s?l?s?l?d +?u?u?u?u?u?d?s?s +?u?d?l?l?l?l?s?s +?l?l?l?l?s?d?l?s +?l?s?l?s?d?l?l?l +?l?l?l?s?s?l?l?d +?u?l?u?s?d?d?d?d?d +?d?d?l?l?l?d?d?d?s +?l?l?l?d?d?d?d?s?d?d +?u?l?d?d?d?d?s?d?l +?d?d?d?d?d?u?u?u?s +?d?d?d?d?d?l?s?l?l +?d?d?s?l?l?l?d?d?d +?u?s?u?d?u?l?l?l +?u?u?u?d?l?l?l?s +?u?l?d?l?l?s?l?l +?l?s?l?l?l?d?l?u +?u?l?s?d?l?l?l?l +?d?u?l?l?s?l?l?l +?u?l?u?l?u?l?d?s +?u?d?l?l?l?l?s?l +?s?l?l?l?u?l?l?d +?u?l?l?l?l?s?d?l +?d?l?l?u?l?l?l?s +?d?u?u?s?u?u?u?u +?u?l?l?l?d?s?l?l +?u?u?u?u?u?u?d?u?d +?u?u?u?s?u?u?u?s +?l?l?d?d?d?d?l?d?d?d +?l?l?l?l?l?l?l?l?s?d +?l?l?l?d?l?d?d?l?l +?d?d?d?d?d?d?d?d?l?l?l?l +?l?l?s?s?d?d?d?d?d +?d?d?l?l?l?d?d?s?s +?s?l?l?s?d?d?d?d?d +?u?s?u?s?u?d?d?d?d +?d?d?d?d?d?l?s?l?s +?d?d?d?d?d?l?l?s?s +?s?s?l?l?l?l?l?s +?l?l?l?l?s?l?l?u +?l?l?l?s?d?d?l?l?l +?l?l?l?l?d?d?s?s?s +?d?l?l?d?d?d?l?l?l +?d?l?l?l?d?d?d?l?l +?d?l?l?d?d?l?l?d?l +?l?d?l?l?l?d?d?d?l +?u?d?d?u?u?u?u?d?d +?d?d?l?l?l?d?d?u?u +?u?u?u?u?d?d?u?d?d +?u?l?l?d?d?d?d?u?u +?d?l?d?l?l?l?l?d?d +?l?l?u?l?u?d?d?d?d +?d?d?l?d?l?l?d?l?l +?u?l?l?d?d?u?l?d?d +?s?l?l?l?d?d?d?d?d?d +?l?l?l?l?u?l?l?u +?l?l?u?l?l?l?l?u +?l?l?u?u?u?l?l?l +?u?u?u?l?l?l?l?u +?l?l?l?u?u?u?l?l +?l?l?l?l?d?d?d?d?s?s +?s?s?u?l?l?l?s?s +?l?l?d?l?s?d?d?l +?d?d?l?s?d?l?l?l +?d?s?l?d?l?u?l?d +?s?l?u?d?l?d?l?d +?d?d?u?l?l?d?l?s +?u?l?l?d?l?d?s?d +?l?d?u?l?s?u?d?d +?u?s?u?d?d?d?l?l +?d?s?l?d?l?l?d?l +?u?l?d?s?l?d?l?d +?d?d?u?u?s?d?u?u +?l?l?l?d?s?d?l?d +?u?l?l?s?d?d?d?l +?s?l?l?d?d?d?l?l +?l?d?l?l?u?s?d?d +?u?s?l?l?u?d?d?d +?u?d?l?l?s?d?d?u +?s?d?l?d?d?l?l?l +?d?l?d?l?d?l?s?u +?u?d?l?d?l?l?d?s +?l?u?d?u?l?d?d?s +?u?l?s?d?d?d?l?u +?l?s?d?d?l?l?l?d +?u?s?d?d?u?u?d?u +?u?l?u?d?d?d?s?l +?u?d?u?u?s?u?d?d +?u?u?s?u?d?d?d?u +?l?d?u?s?l?d?l?d +?d?l?d?l?l?s?l?d +?d?d?l?u?d?s?l?l +?l?u?u?d?l?d?d?s +?u?s?u?d?u?d?u?d +?u?u?s?d?l?l?d?d +?d?d?d?l?u?u?l?s +?u?u?d?s?d?d?u?u +?d?d?d?u?u?u?s?l +?d?d?d?u?u?u?s?u +?d?d?l?d?l?l?s?l +?s?u?d?d?l?u?d?u +?u?s?u?u?l?d?d?d +?l?d?s?l?d?d?l?l +?d?d?d?u?u?l?s?l +?u?u?u?d?d?d?s?u +?d?d?l?s?l?d?l?l +?d?l?s?u?l?d?l?d +?u?d?u?u?d?d?u?s +?u?s?l?l?d?u?d?d +?d?l?d?l?l?d?u?s +?u?d?l?s?d?d?l?u +?l?s?l?d?u?d?l?d +?u?l?l?u?d?s?d?d +?u?u?u?d?s?d?d?l +?u?s?u?d?u?u?d?d +?u?d?d?u?u?u?d?s +?u?d?d?d?l?u?u?s +?l?l?d?l?d?d?s?u +?l?u?d?l?l?s?d?d +?u?l?d?l?s?l?d?d +?u?s?d?l?l?d?l?d +?u?l?u?l?d?s?d?d +?u?d?d?s?d?l?u?l +?d?d?u?l?u?s?l?d +?l?d?d?l?d?l?l?s +?u?d?u?s?u?d?u?d +?u?l?s?l?u?d?d?d +?l?u?d?l?l?d?d?s +?l?u?u?l?s?d?d?d +?l?d?d?l?d?s?l?l +?l?d?d?l?s?d?l?u +?l?d?d?l?u?u?d?s +?u?d?u?s?l?d?u?d +?d?u?l?l?l?d?d?s +?s?l?u?u?l?d?d?d +?d?s?l?l?l?d?d?u +?u?l?d?l?d?l?d?s +?s?d?d?d?l?l?l?u +?l?l?l?u?d?s?d?d +?s?u?u?d?d?l?l?d +?l?d?s?l?l?d?l?d +?l?d?l?l?s?d?l?d +?u?d?u?u?d?s?u?d +?d?l?l?d?l?s?d?u +?l?d?s?l?l?u?d?d +?u?u?d?u?d?u?d?s +?u?s?l?d?u?d?l?d +?d?d?d?l?l?s?u?u +?u?l?s?d?d?d?l?l +?d?d?d?l?u?s?u?l +?u?s?d?d?u?u?u?d +?s?l?d?l?u?u?d?d +?u?d?d?l?l?u?d?s +?s?d?d?u?l?d?l?l +?u?u?d?d?s?d?l?l +?l?s?l?u?d?l?d?d +?l?d?d?s?l?l?d?l +?u?u?s?l?d?d?d?l +?u?l?l?d?u?s?d?d +?l?d?d?l?d?l?s?l +?u?u?u?d?u?s?d?d +?d?d?u?l?u?s?d?l +?u?d?l?l?l?d?d?s +?u?s?l?d?d?l?d?l +?u?u?l?s?l?d?d?d +?s?d?u?u?u?u?d?d +?u?u?d?d?l?l?s?d +?d?d?d?u?l?u?l?s +?d?l?u?d?l?l?s?d +?u?u?d?u?d?u?s?d +?u?d?l?d?u?s?l?d +?s?d?u?l?l?d?l?d +?u?u?d?d?s?l?d?l +?d?d?u?s?u?d?u?u +?d?d?l?l?s?d?u?u +?l?l?u?l?s?d?d?d +?l?d?d?d?u?s?u?u +?l?d?u?l?l?s?d?d +?u?l?s?d?l?l?d?d +?u?u?d?u?u?d?d?s +?d?d?l?u?l?u?s?d +?u?l?d?d?s?d?l?l +?l?d?d?u?d?l?l?s +?s?l?l?d?u?u?d?d +?u?d?u?d?s?u?d?u +?u?d?l?s?d?l?d?l +?d?d?d?u?u?s?l?l +?u?u?u?d?d?d?l?s +?u?l?d?s?u?l?d?d +?l?d?d?l?d?l?s?u +?d?s?d?u?u?d?u?u +?s?d?d?d?l?u?u?u +?d?d?u?l?l?l?s?d +?d?l?l?d?d?s?l?l +?d?l?l?u?u?d?d?s +?u?d?l?u?d?l?d?s +?l?d?l?d?l?d?u?s +?u?u?s?l?u?d?d?d +?l?l?d?u?s?d?d?l +?d?d?s?l?d?l?l?l +?s?l?d?l?d?l?l?d +?l?d?u?u?s?d?d?l +?s?u?d?u?u?u?d?d +?u?l?u?d?d?l?d?s +?d?l?s?d?l?l?l?d +?s?u?l?l?d?u?d?d +?u?d?l?l?u?d?d?s +?u?s?l?d?d?l?u?d +?l?d?d?l?l?s?d?l +?d?d?s?u?l?l?l?d +?u?l?u?d?d?s?l?d +?l?s?d?l?d?d?l?l +?d?u?l?l?d?d?s?u +?d?u?u?d?l?d?s?u +?d?l?l?l?s?d?d?l +?u?l?d?d?d?l?u?s +?l?l?l?d?d?s?l?d +?u?s?u?d?d?u?u?d +?u?l?d?l?d?d?s?u +?u?d?s?l?d?l?d?u +?u?d?l?d?l?u?s?d +?s?l?u?l?d?l?d?d +?d?l?d?l?s?u?l?d +?u?d?l?u?d?d?l?s +?d?l?s?l?d?d?l?l +?u?d?u?d?u?d?s?u +?s?u?u?d?d?d?l?l +?l?d?u?d?l?d?l?s +?l?d?l?d?s?l?l?d +?u?d?l?s?l?d?l?d +?l?u?u?u?d?s?d?d +?u?l?d?d?l?s?u?d +?s?d?d?l?l?l?l?d +?s?u?l?d?d?d?l?u +?d?l?l?d?s?l?d?l +?s?l?d?u?d?l?d?l +?u?d?d?l?l?l?d?s +?d?d?l?d?l?l?u?s +?d?u?u?u?s?d?u?d +?u?u?d?s?d?d?l?l +?l?l?s?l?u?d?d?d +?l?s?l?d?d?l?l?d +?l?l?d?d?u?u?d?s +?d?u?u?l?l?d?d?s +?s?l?u?d?l?l?d?d +?u?d?s?u?u?d?d?l +?d?u?s?u?d?l?d?l +?d?l?u?d?u?l?d?s +?s?u?u?d?l?u?d?d +?d?d?u?l?s?l?l?d +?d?l?u?l?d?d?u?s +?d?u?d?d?s?u?u?u +?u?l?u?s?l?d?d?d +?u?d?l?d?l?s?d?l +?d?l?l?l?l?d?d?d?s +?d?u?l?l?u?d?d?s +?u?u?d?d?u?u?d?s +?u?d?u?d?l?s?l?d +?s?u?d?d?d?l?l?l +?d?s?l?l?l?d?d?l +?u?s?d?l?d?d?l?l +?d?d?d?d?u?u?u?u?s +?d?d?s?d?u?l?l?l +?l?s?u?d?l?l?d?d +?u?l?d?l?l?d?d?s +?d?d?l?l?l?s?l?d +?u?s?l?d?u?d?d?l +?d?d?l?l?s?d?l?l +?s?l?l?u?d?l?d?d +?d?s?d?d?l?l?u?u +?d?d?s?u?u?u?u?d +?s?l?l?l?d?u?d?d +?l?l?d?d?s?l?d?u +?l?l?s?d?d?d?u?u +?u?d?d?u?u?d?u?s +?u?d?s?l?u?d?l?d +?d?d?u?l?d?s?l?u +?d?d?u?l?d?s?l?l +?l?u?s?l?l?d?d?d +?u?u?d?l?l?d?d?s +?s?u?l?l?u?d?d?d +?u?d?s?u?u?u?d?d +?l?s?u?d?d?l?l?d +?d?d?u?u?s?u?u?d +?u?l?l?d?l?d?d?s +?u?d?l?d?l?s?u?d +?d?d?d?s?u?u?l?l +?l?d?s?d?l?l?l?d +?u?d?l?l?d?d?u?s +?d?d?l?l?l?u?s?d +?d?d?u?d?s?u?u?l +?u?s?d?d?l?d?l?l +?d?d?l?d?l?s?l?l +?s?u?u?u?d?d?d?l +?u?l?d?d?s?u?u?d +?u?u?d?d?s?u?u?d +?u?u?s?l?d?l?d?d +?d?d?u?u?u?s?d?l +?l?d?l?d?l?s?d?l +?l?l?d?d?d?l?u?s +?l?u?d?d?d?s?u?l +?u?s?u?d?d?l?l?d +?u?l?d?l?d?l?s?d +?d?d?l?l?l?d?s?l +?d?d?l?l?l?s?d?l +?u?d?l?l?s?d?l?d +?l?d?d?d?u?u?u?s +?d?l?d?s?d?u?l?l +?d?u?l?d?l?d?u?s +?d?d?l?s?l?l?d?l +?d?d?d?l?l?l?u?s +?u?d?l?s?l?u?d?d +?d?s?d?u?l?u?d?l +?l?d?l?l?s?d?d?u +?l?d?l?l?d?s?d?l +?l?l?d?l?d?s?d?l +?l?d?u?d?l?l?d?s +?d?l?d?d?s?l?l?l +?l?u?l?u?d?d?s?d +?u?s?d?l?l?d?d?l +?d?d?l?d?u?s?u?u +?u?d?l?d?l?s?l?d +?l?l?u?l?d?d?s?d +?s?u?l?l?d?d?u?d +?u?u?u?d?s?d?d?u +?d?u?l?s?d?d?l?l +?d?d?d?s?u?l?u?l +?u?u?u?l?d?d?d?s +?s?l?l?d?l?d?d?u +?d?d?s?l?l?d?l?l +?u?d?d?u?s?u?d?u +?l?d?l?l?s?d?d?l +?d?l?l?s?d?l?l?d +?l?u?l?s?d?l?d?d +?d?u?l?u?l?s?d?d +?l?d?d?l?s?l?l?d +?s?d?d?l?l?d?u?u +?u?l?u?s?d?d?d?l +?d?l?l?l?u?d?d?s +?l?d?d?l?u?s?d?u +?u?s?d?u?d?l?l?d +?u?d?l?d?s?l?u?d +?u?d?u?d?d?s?u?u +?d?u?s?d?l?u?l?d +?u?d?u?d?s?l?d?l +?l?d?l?s?d?d?l?l +?u?u?u?l?d?s?d?d +?l?s?u?l?d?l?d?d +?d?l?d?s?l?l?d?l +?s?l?l?d?d?l?l?d +?u?u?d?u?s?u?d?d +?s?l?l?u?u?d?d?d +?s?d?d?l?d?u?u?u +?u?d?d?d?s?u?l?u +?d?s?d?u?l?l?l?d +?l?d?d?u?d?s?l?l +?u?u?u?s?d?d?u?d +?u?l?u?u?s?d?d?d +?s?d?d?d?u?u?l?l +?s?u?l?d?l?d?l?d +?s?l?l?l?u?d?d?d +?d?l?d?s?d?l?l?l +?s?d?l?d?l?l?l?d +?u?d?d?d?u?u?u?s +?d?l?d?l?s?l?l?d +?d?s?u?l?d?d?l?l +?d?d?l?l?d?s?u?u +?u?d?d?s?d?l?l?u +?u?d?u?l?s?d?u?d +?u?s?l?l?d?d?d?l +?u?s?l?l?d?d?d?u +?u?d?l?d?d?u?l?s +?s?d?u?u?d?u?u?d +?l?s?d?d?l?d?l?u +?u?u?d?d?d?s?u?u +?u?l?l?d?d?s?l?d +?d?d?d?u?u?u?l?s +?d?u?u?u?u?d?d?s +?l?u?l?l?s?d?d?d +?d?s?d?u?l?d?l?u +?d?s?u?d?u?u?u?d +?u?l?u?l?u?l?u?l?d +?l?l?l?l?l?l?d?d?d?l +?l?l?l?l?l?l?l?l?u +?l?l?l?d?d?d?u?d?d +?u?d?d?u?u?u?d?d?d +?u?d?l?d?l?d?u?d?d +?u?d?d?u?d?u?d?u?d +?u?u?d?d?u?d?u?d?d +?u?d?d?d?u?u?u?d?d +?d?d?u?l?u?l?d?d?d +?u?l?l?d?d?d?d?d?u +?d?l?d?d?d?l?l?l?d +?u?d?d?d?d?d?u?u?u +?l?d?l?d?l?d?d?l?d?d +?d?u?d?l?d?l?d?l?d +?d?d?u?u?d?d?d?u?u +?u?l?d?d?d?u?l?d?d +?u?d?l?d?d?u?d?l?d +?u?l?d?d?d?d?d?u?l +?d?d?d?l?l?l?d?d?u +?u?d?d?l?d?l?d?l?d +?d?l?d?d?l?l?d?l?d +?d?d?d?l?d?l?l?l?d +?l?u?u?l?d?d?d?d?d +?u?u?d?d?l?l?d?d?d +?u?d?u?d?u?u?d?d?d +?l?l?l?d?d?d?d?u?d +?d?d?l?l?l?u?d?d?d +?u?u?l?u?d?d?d?d?d +?l?l?l?s?s?s?s?s +?s?l?l?l?l?l?s?l +?d?d?d?l?d?d?d?d?d?d?d +?d?d?d?d?d?d?d?l?d?d?d +?l?d?d?d?d?d?d?d?d?d?s +?l?l?d?d?d?d?d?d?s?s +?s?l?s?d?d?s?d?s +?l?s?s?s?s?d?d?d +?l?l?u?l?l?l?d?d?d +?u?l?d?l?l?d?u?l +?d?d?l?u?u?u?l?u +?l?l?l?u?d?u?d?u +?d?l?d?u?u?l?l?l +?l?d?u?u?l?l?d?l +?u?l?d?u?l?l?d?u +?l?u?u?u?d?d?u?l +?d?l?d?l?l?l?u?l +?u?u?l?d?d?l?u?l +?u?l?d?u?l?u?l?d +?u?l?u?d?l?d?u?l +?u?l?l?l?d?l?d?u +?d?u?d?u?l?l?l?l +?u?u?u?d?u?d?u?l +?u?d?d?l?u?l?l?l +?d?l?l?l?d?u?l?l +?u?u?u?d?l?d?u?u +?d?l?l?u?u?u?d?u +?u?l?u?l?d?l?l?d +?u?d?l?u?u?d?l?u +?u?u?l?l?l?d?u?d +?l?u?u?d?l?l?l?d +?u?u?d?u?d?u?u?l +?u?l?u?u?d?l?d?u +?u?d?l?u?d?l?l?u +?l?l?l?d?l?u?u?d +?l?l?l?u?l?d?d?u +?d?l?l?u?d?l?u?l +?d?d?l?u?l?l?u?l +?l?d?u?u?d?l?l?l +?u?l?u?d?l?u?d?u +?d?u?d?u?l?l?u?u +?l?l?d?u?u?l?d?u +?l?l?d?u?u?l?d?l +?l?d?u?l?l?u?d?l +?l?u?u?l?d?d?l?u +?u?u?d?l?l?u?l?d +?l?u?u?u?d?d?l?u +?u?u?l?d?u?l?l?d +?l?u?l?d?u?l?d?l +?d?u?u?l?l?d?u?u +?l?u?l?u?u?d?d?l +?d?l?u?u?u?u?u?d +?l?u?u?d?d?l?l?u +?l?l?d?u?d?u?l?l +?l?u?d?l?l?u?d?l +?u?l?d?l?d?u?l?u +?u?l?u?l?d?l?d?l +?d?l?u?l?u?l?u?d +?l?l?l?l?u?d?l?d +?l?d?l?l?d?u?u?u +?u?d?d?u?l?u?u?l +?d?l?d?l?l?l?d?l?l +?u?l?d?u?d?u?l?l +?l?u?u?d?l?l?d?l +?l?u?l?u?l?d?d?l +?u?l?l?d?l?d?l?u +?l?d?u?u?u?u?d?l +?u?d?u?u?u?u?l?d +?d?u?d?l?l?u?u?l +?l?d?u?l?l?u?l?d +?u?u?d?u?u?d?l?l +?l?u?d?u?l?u?l?d +?l?d?l?u?d?l?l?l +?u?d?l?u?l?u?d?l +?l?u?d?u?u?l?u?d +?d?l?d?l?u?l?u?l +?l?u?l?u?u?d?l?d +?u?d?d?l?l?l?u?l +?l?u?l?l?d?d?u?l +?l?u?l?l?d?d?u?u +?l?l?d?l?u?d?u?u +?l?u?l?l?d?d?l?u +?l?u?d?d?l?u?u?u +?u?d?u?d?l?u?u?u +?u?l?d?u?u?u?d?l +?l?d?l?u?d?u?l?l +?l?d?l?l?u?l?d?l +?l?l?l?d?l?d?u?u +?l?u?l?d?u?d?u?l +?l?l?u?d?u?l?l?d +?l?u?l?l?d?u?d?l +?l?u?d?d?l?l?u?l +?u?u?u?u?u?d?u?d?d +?u?u?l?d?l?d?l?l +?l?l?u?u?d?l?d?l +?l?u?u?l?l?d?d?l +?d?l?u?u?l?l?d?l +?u?d?l?l?l?u?l?d +?u?u?u?u?l?d?d?u +?l?u?l?d?d?u?l?l +?l?u?l?d?d?u?l?u +?l?d?l?d?l?u?l?u +?d?l?d?l?l?u?u?u +?l?u?d?u?l?u?d?u +?u?l?u?l?d?d?l?u +?l?l?d?l?l?u?u?d +?d?l?u?u?l?d?l?l +?u?l?d?u?l?d?l?u +?u?l?d?u?u?l?u?d +?d?u?l?u?d?u?l?u +?u?l?l?u?l?d?d?u +?d?u?u?l?u?u?d?u +?u?u?l?u?d?d?l?u +?u?l?d?u?l?d?u?l?d +?d?u?l?l?u?l?d?u +?u?u?u?d?u?d?l?l +?d?l?l?d?u?u?u?u +?u?d?l?u?l?d?u?l +?l?d?l?l?l?u?l?d +?l?u?d?u?l?l?d?u +?d?u?l?l?u?d?l?u +?u?u?d?d?l?l?u?l +?u?u?u?d?d?u?l?u +?u?u?l?d?d?u?u?l +?u?l?d?d?l?u?u?u +?l?l?d?l?l?u?l?d +?u?l?l?d?u?u?d?l +?u?l?l?d?u?u?d?u +?u?l?d?l?u?d?l?u +?d?d?u?u?u?l?u?l +?u?d?u?l?l?l?u?d +?d?u?l?u?u?u?l?d +?u?l?d?u?u?l?l?d +?d?l?u?u?l?l?l?d +?l?d?d?l?u?u?u?u +?l?l?u?u?d?u?d?l +?l?l?u?l?l?d?l?d +?d?l?l?l?l?u?l?d +?l?l?l?d?l?u?l?d +?l?d?u?d?l?l?u?l +?u?l?u?d?u?d?l?u +?d?l?u?d?l?u?u?u +?l?u?u?u?d?u?d?u +?l?d?l?u?l?d?l?l +?l?d?l?u?l?d?l?u +?l?l?d?u?u?l?l?d +?d?d?d?l?l?l?u?u?u +?l?l?d?u?l?d?l?l +?l?u?u?d?d?l?u?l +?u?u?d?l?u?l?d?u +?u?l?l?u?l?d?u?d +?u?u?d?l?d?u?l?l +?d?l?l?u?u?d?l?l +?l?u?d?l?l?l?u?d +?u?l?u?d?l?l?d?u +?d?l?u?u?d?u?u?u +?d?u?u?l?d?u?l?l +?u?l?l?d?u?l?u?d +?u?d?d?u?u?u?l?u +?l?d?d?u?l?l?l?u +?u?d?l?l?u?d?l?u +?u?d?u?l?u?d?l?u +?u?d?u?l?u?d?l?l +?l?l?d?l?l?u?d?l +?d?u?l?u?u?u?u?d +?l?u?l?l?d?l?l?d +?u?l?d?u?u?l?d?l +?u?l?l?l?d?u?d?u +?u?d?u?u?l?l?d?u +?u?u?l?d?d?l?l?u +?u?d?l?l?u?l?d?l +?u?d?l?l?u?l?d?u +?u?u?l?l?l?l?d?d?d?d +?u?l?d?u?l?u?u?d +?d?l?l?l?u?d?u?u +?d?d?l?u?u?u?u?l +?u?u?u?d?d?l?l?u +?u?d?u?l?u?u?l?d +?l?d?u?l?l?l?d?u +?l?d?u?l?d?l?u?l +?u?u?u?l?d?l?d?l +?u?u?d?u?u?u?u?d?d +?d?l?l?d?l?u?l?l +?u?l?u?d?u?d?u?l +?l?u?l?u?u?u?d?d +?u?l?d?u?u?u?d?u +?u?u?l?u?l?d?u?d +?l?l?l?l?d?u?d?u +?u?d?l?d?u?l?l?u +?u?d?d?u?l?u?l?l +?u?d?u?u?u?d?l?u +?l?u?d?l?d?l?u?u +?l?l?d?d?u?l?u?u +?u?d?d?l?l?u?u?l +?u?d?d?l?u?l?u?l +?d?l?d?l?l?u?l?l +?l?d?l?l?u?d?u?l +?d?d?l?u?u?l?l?l +?d?l?l?l?u?d?l?l +?l?u?d?l?l?l?l?d +?u?u?l?u?l?d?d?l +?l?u?d?l?l?d?u?l +?l?d?l?u?u?u?d?u +?l?u?l?d?u?d?l?l +?u?d?u?u?u?d?l?l +?u?l?u?d?u?l?l?d +?l?d?u?l?d?l?l?l +?l?l?d?u?d?l?l?u +?d?d?u?u?l?u?l?u +?d?l?d?u?u?u?l?u +?l?u?u?l?d?d?u?l +?l?u?u?l?d?d?u?u +?d?d?u?l?l?u?u?u +?u?u?u?l?u?l?d?d +?d?l?l?l?u?u?d?l +?u?d?d?u?u?u?u?l +?d?l?u?u?u?u?l?d +?d?l?u?l?l?l?u?d +?u?l?u?u?d?d?u?u +?u?d?d?u?u?l?l?l +?d?u?u?d?l?l?u?l +?d?u?u?d?l?l?u?u +?u?d?l?d?l?l?u?l +?l?u?u?u?l?d?u?d +?u?u?l?d?l?u?d?l +?u?u?d?d?l?u?l?l +?u?u?u?d?u?l?l?d +?l?l?l?l?u?d?u?d +?d?l?u?l?d?l?u?l +?u?l?u?l?u?d?u?d +?d?l?u?d?l?l?l?l +?u?d?l?d?u?l?u?l +?u?l?u?l?l?d?l?d +?u?d?l?u?l?d?l?l +?l?l?l?u?l?d?u?d +?l?l?l?u?u?d?d?l +?l?d?l?u?u?l?d?l +?l?l?l?u?d?u?l?d +?l?l?u?d?l?l?d?u +?d?u?l?d?u?l?l?u +?d?l?u?l?l?d?l?u +?d?d?u?u?u?l?l?u +?u?d?u?d?u?l?u?u +?u?d?u?d?u?l?u?l +?l?u?u?u?l?d?d?l +?l?l?u?d?u?u?d?u +?d?d?l?l?u?l?u?u +?l?d?l?u?d?l?u?l +?d?l?l?l?l?u?d?u +?d?l?l?l?l?u?d?l +?d?l?l?d?l?u?u?u +?d?l?l?d?l?l?u?u +?u?l?d?u?d?l?u?l +?l?d?l?u?u?d?u?l +?l?l?l?d?l?u?d?u +?l?l?d?l?d?l?u?l +?l?d?l?u?l?d?u?u +?u?u?d?u?l?u?d?l +?l?u?u?d?u?d?l?l +?l?l?d?u?l?d?u?l +?u?u?d?u?d?l?u?u +?d?d?s?d?d?d?d?s?d?d +?d?d?d?s?d?d?d?d?s?d +?d?d?s?d?d?d?d?d?s?d +?d?d?d?d?d?s?s?d?d?d +?d?s?d?d?s?d?d?s?l +?l?l?l?d?d?d?l?l?s +?l?l?l?s?d?l?l?l?l +?d?d?d?d?l?l?l?l?l?l?l +?u?l?l?d?d?u?l?l?l +?d?d?d?d?l?l?d?d?l?l +?l?d?d?l?d?l?d?d?l?d +?l?s?l?l?l?l?s?d?d +?d?d?d?s?d?d?d?s?d?d?d +?d?d?s?l?s?l?s?l +?l?l?l?s?s?d?d?s +?s?l?l?l?s?s?d?d +?d?d?s?l?l?l?s?s +?s?d?d?s?l?l?l?s +?s?u?l?l?s?d?d?s +?s?s?s?d?d?l?l?l +?l?s?l?s?l?s?l?l +?l?u?u?u?u?u?u?u?d +?u?l?l?d?d?d?d?s?s +?u?u?l?d?d?d?d?d?d?d +?d?l?d?d?l?d?d?d?d?l +?d?d?l?d?l?d?d?d?d?l +?d?d?d?d?l?d?d?d?l?l +?l?l?d?d?l?l?l?l?d?d +?u?u?u?u?u?s?u?s +?u?l?l?l?l?s?u?s +?d?s?l?s?d?s?l?s +?d?d?s?s?l?l?s?s +?s?s?s?s?l?l?d?d +?d?d?l?l?s?s?s?s +?s?s?l?l?l?l?d?d?d +?l?l?u?u?l?l?d?l +?u?l?d?u?l?u?l?u +?l?u?l?l?l?u?l?d +?l?u?l?l?d?u?l?u +?u?l?u?l?d?l?l?u +?l?u?l?l?u?l?l?l +?l?l?u?l?u?d?u?l +?u?l?l?d?l?l?u?u +?l?l?l?u?u?d?u?u +?l?u?l?d?l?u?l?l +?u?l?u?l?u?u?l?d +?u?u?d?l?u?u?u?u +?d?l?l?u?u?l?l?l +?l?u?d?u?l?l?l?l +?u?u?l?l?l?l?d?u +?u?u?l?d?l?l?l?u +?l?u?l?d?l?l?u?u +?l?u?d?l?l?u?u?l +?u?u?d?d?u?u?u?u?u +?d?l?l?l?u?l?l?u +?u?l?l?d?u?l?l?u +?u?d?u?u?u?l?l?l +?u?u?l?l?d?u?u?u +?u?u?d?l?u?l?l?l +?l?u?u?u?l?u?u?u +?u?l?l?u?l?d?l?u +?d?u?l?u?u?u?u?l +?u?u?d?l?l?l?l?u +?l?l?l?d?l?u?u?u +?u?l?l?l?u?d?u?l +?u?u?u?u?u?l?d?u +?u?u?u?u?u?l?d?l +?u?l?d?l?l?l?u?u +?l?u?d?l?l?l?l?u +?u?u?u?d?l?u?u?u +?l?u?u?u?u?u?l?d +?u?l?u?d?u?l?l?l +?u?l?l?d?u?l?u?l +?l?u?u?u?d?l?u?u +?l?d?l?u?l?l?u?l +?l?l?l?u?u?l?d?l +?l?u?d?u?u?u?u?u +?u?u?l?l?u?u?u?d +?u?u?l?l?u?u?u?u +?l?u?u?l?u?u?u?u +?u?l?l?l?d?l?u?u +?u?l?l?l?d?u?u?l +?u?d?l?l?l?l?u?u +?u?u?l?l?l?u?d?l +?u?l?l?l?u?u?l?d +?u?u?u?u?l?u?u?u +?l?s?l?l?d?l?l?s +?u?s?u?u?u?u?s?d +?s?l?l?s?l?l?l?d +?l?s?l?s?d?d?s?d?d +?d?d?d?s?s?s?l?l?l +?l?u?l?u?l?u?d?d?d +?l?l?u?u?l?l?d?d?d +?d?l?l?l?l?d?d?l?l +?u?u?d?d?d?l?l?l?l +?l?l?l?d?l?l?l?l?s +?u?u?d?d?d?d?d?d?l?l +?d?l?l?l?l?l?s?d?d +?l?s?u?l?s?l?s +?u?s?s?u?l?s?l +?u?l?s?s?l?l?s +?s?u?l?l?s?l?s +?l?l?l?u?s?s?s +?u?u?u?s?u?s?s +?u?s?l?s?u?s?u +?u?l?s?s?s?l?l +?u?s?s?l?l?s?l +?s?l?s?s?u?l?l +?u?s?u?s?s?u?u +?u?s?u?s?l?s?u +?s?s?l?u?l?s?l +?s?s?l?l?l?s?u +?l?l?s?s?l?u?s +?l?l?s?s?u?u?s +?s?u?s?u?l?s?u +?l?s?u?s?s?l?u +?s?l?s?u?s?l?l +?s?u?s?s?l?l?l +?u?l?s?l?l?s?s +?l?d?l?l?l?s?s?s +?s?l?u?s?l?s?l +?s?l?l?s?u?s?u +?s?l?l?s?u?s?l +?s?s?u?l?s?u?l +?u?s?l?s?u?l?s +?l?u?s?l?s?u?s +?l?u?l?l?s?s?s +?l?s?s?s?l?u?u +?s?s?u?l?u?l?s +?l?s?s?l?l?l?s +?l?l?s?u?s?u?s +?s?l?s?l?s?u?l +?s?l?l?s?u?l?s +?s?u?u?u?s?u?s +?l?l?l?s?s?s?u +?l?s?l?s?s?u?u +?u?s?l?s?s?l?l +?u?l?l?s?l?s?s +?s?s?s?l?l?l?u +?s?u?s?s?u?u?u +?l?u?s?l?s?l?s +?l?l?u?u?s?s?s +?l?s?l?s?u?s?l +?l?s?l?s?s?l?u +?s?u?l?s?u?s?l +?l?s?l?l?u?s?s +?s?u?s?u?u?u?s +?s?s?l?u?l?l?s +?l?l?s?s?s?u?l +?s?l?s?u?u?l?s +?s?l?l?l?s?s?u +?s?s?l?s?l?l?u +?u?l?s?u?l?s?s +?s?s?u?u?u?s?u +?s?l?u?l?s?u?s +?s?s?l?u?s?l?l +?u?s?s?u?l?l?s +?s?l?s?u?l?l?s +?u?l?l?s?s?s?l +?l?s?s?l?s?u?u +?u?u?u?s?s?s?l +?l?s?u?u?s?s?l +?l?l?u?s?s?l?s +?s?s?u?s?u?u?u +?u?s?u?l?l?s?s +?u?l?s?u?s?l?s +?l?s?u?s?u?s?l +?u?l?s?s?s?u?l +?l?s?l?u?s?s?l +?s?u?s?u?l?u?s +?u?u?l?s?l?s?s +?s?l?s?u?l?s?l +?s?u?u?u?l?s?s +?s?u?l?s?s?u?u +?u?s?u?s?u?l?s +?s?l?u?l?s?s?u +?s?s?l?l?s?l?u +?s?s?u?l?l?l?s +?u?u?l?u?s?s?s +?u?s?s?s?u?l?l +?u?l?u?u?s?s?s +?s?l?l?u?s?s?l +?s?u?l?u?u?s?s +?l?u?l?u?s?s?s +?u?u?s?s?u?s?u +?s?s?u?l?l?u?s +?u?u?s?l?l?s?s +?u?s?l?l?s?s?l +?l?u?u?u?s?s?s +?u?l?s?s?u?l?s +?l?l?l?l?l?l?d?d?l?l +?l?l?l?l?d?l?l?l?s +?u?u?u?s?u?l?l?l +?l?l?s?u?l?l?l?l +?u?l?l?l?l?s?u?u +?l?l?l?s?u?l?l?l +?l?l?d?s?l?l?s?d +?l?d?l?s?l?s?l?d +?l?d?d?l?u?s?s?u +?l?l?d?l?l?s?d?s +?l?l?l?d?d?s?s?l +?d?l?l?l?d?l?s?s +?l?d?s?l?d?s?l?l +?l?s?d?l?l?s?d?l +?l?d?l?l?s?l?d?s +?l?u?l?u?d?d?s?s +?u?l?d?d?u?l?s?s +?u?s?u?d?d?u?s?u +?d?s?l?l?l?l?d?s +?s?d?d?u?u?u?u?s +?u?l?l?u?s?d?d?s +?l?d?d?l?l?s?s?l +?l?l?l?s?l?d?s?d +?l?d?u?s?l?d?u?s +?l?l?l?d?d?s?l?s +?u?u?s?l?l?s?d?d +?d?l?l?d?l?s?l?s +?s?s?l?d?l?l?d?l +?d?d?u?u?u?u?s?s +?l?s?s?l?d?l?d?l +?s?d?s?d?l?l?l?l +?s?s?d?d?l?l?u?u +?u?l?s?u?l?s?d?d +?s?u?l?u?l?d?d?s +?u?l?s?s?l?l?d?d +?u?u?u?u?s?d?s?d +?s?u?l?u?l?s?d?d +?d?l?s?l?d?l?s?l +?l?l?l?l?l?d?d?d?l?l +?u?s?l?l?l?l?l?d?d +?d?d?l?l?s?d?d?l?l +?l?d?l?l?l?s?d?d?d +?d?d?u?l?l?l?d?d?s +?u?u?l?l?s?d?d?d?d +?s?d?l?l?l?l?d?d?d +?d?d?d?d?s?u?l?l?l +?l?d?d?l?l?l?d?d?s +?s?s?s?s?s?l?s +?s?s?l?s?s?s?s +?d?l?l?l?l?l?l?d?d?d +?d?d?d?d?d?l?d?d?l?d +?l?d?d?l?d?d?l?d?d?d?d +?u?d?u?d?d?d?d?d?d?d +?d?d?d?d?d?d?d?u?u?d +?d?d?d?u?d?d?u?d?d?d +?d?d?u?d?d?u?d?d?d?d +?d?l?d?d?d?d?d?d?d?l +?d?d?l?d?l?d?d?d?d?d +?u?d?d?u?d?d?d?d?d?d +?d?d?l?d?d?l?d?d?l?l +?l?d?l?d?d?l?d?l?d?d +?d?d?d?d?d?s?s?s?s +?u?d?l?d?l?l?l?d?d +?l?l?l?d?l?d?d?d?l +?l?l?d?d?d?l?d?l?l +?d?d?d?d?l?l?l?u?u +?d?l?l?d?l?d?d?l?l +?d?d?l?l?u?l?l?d?d +?d?l?d?d?l?d?l?l?l +?d?d?d?d?l?u?u?u?u +?d?l?l?l?d?d?l?d?l +?u?u?l?u?u?d?d?d?d +?d?u?s?l?l?l?l?l +?l?l?l?s?d?u?u?u +?u?u?l?l?u?u?s?d +?u?l?l?l?l?d?s?l +?u?l?l?d?l?s?l?l +?u?u?u?u?u?s?d?u +?l?l?l?l?l?s?d?u +?u?l?d?l?s?l?l?l +?u?u?u?d?s?l?l?l +?l?u?u?u?u?u?d?s +?d?l?l?l?l?s?u?u +?l?l?l?l?l?u?d?s +?u?l?l?d?l?l?s?l +?u?u?u?u?d?u?u?s +?d?d?s?d?l?l?l?l?l +?u?s?u?u?u?u?d?d?d +?u?l?u?l?u?l?u?l?u +?l?d?d?d?d?d?d?s?d?d +?d?d?d?d?l?d?d?d?d?s +?d?d?u?l?l?l?l?l?d +?l?l?l?l?d?d?l?l?d?d +?d?l?l?l?d?l?d?l?l +?d?d?d?u?u?l?l?l?l +?d?l?l?l?d?l?l?d?l +?d?d?d?d?d?d?l?l?l?d?d +?u?d?u?u?u?u?u?u?u +?l?l?s?d?d?l?l?l?l +?d?d?d?d?d?d?d?d?l?l?d +?d?d?d?d?l?d?d?d?d?d?d +?l?l?l?l?l?l?l?d?d?l +?l?l?l?l?d?l?l?l?l?d +?l?l?u?u?u?u?l?l +?u?u?u?u?u?l?u?u +?u?u?u?l?l?l?l?l?l +?u?d?d?d?u?d?d?u?d +?d?d?d?d?l?u?u?d?d +?d?d?d?d?l?l?u?d?d +?d?u?u?d?d?d?d?u?d +?d?d?u?d?d?d?l?l?d +?u?d?d?d?l?u?d?d?d +?d?l?l?d?d?d?d?d?u +?d?u?l?u?d?d?d?d?d +?d?u?d?d?u?d?d?u?d +?d?d?d?d?u?u?d?d?u +?d?u?d?d?d?u?d?d?l +?d?d?d?u?u?d?u?d?d +?d?d?d?u?d?u?d?d?u +?d?l?d?d?d?l?d?u?d +?u?d?d?d?u?l?d?d?d +?d?d?u?d?d?l?l?d?d +?d?u?u?d?u?d?d?d?d +?d?d?d?d?u?u?d?u?d +?l?l?d?d?d?d?u?d?d +?l?u?d?d?l?d?d?d?d +?l?d?l?u?d?d?d?d?d +?l?d?l?d?d?d?d?d?u +?l?d?d?d?l?d?d?d?u +?u?u?d?d?d?d?u?d?d +?d?d?u?d?d?d?d?u?l +?u?u?d?d?d?l?d?d?d +?u?d?d?d?d?l?l?d?d +?d?l?d?u?d?l?d?d?d +?u?d?d?d?d?l?d?u?d +?l?d?d?d?d?u?l?d?d +?d?d?d?d?d?u?l?l?d +?d?d?d?d?u?d?d?l?l +?l?l?l?d?d?d?d?l?d?d +?u?d?d?d?d?d?d?u?l +?u?d?u?d?l?d?d?d?d +?l?u?d?d?d?d?l?d?d +?d?d?d?d?l?u?l?d?d +?d?l?l?d?d?u?d?d?d +?u?l?d?d?d?d?l?d?d +?d?d?d?u?d?d?d?u?u +?d?l?d?d?d?l?d?d?u +?l?u?d?d?d?d?d?d?u +?d?u?d?d?d?l?l?d?d +?d?d?d?l?u?u?d?d?d +?d?d?d?l?l?u?d?d?d +?d?d?d?d?d?u?d?u?u +?d?l?l?d?l?d?d?d?d?d +?l?l?d?u?d?d?d?d?d +?d?d?d?d?u?d?u?d?u +?d?u?d?l?d?u?d?d?d +?d?u?d?u?d?u?d?d?d +?d?u?d?u?d?d?d?d?u +?u?d?d?l?d?d?d?d?l +?d?d?d?d?d?d?u?u?l?l +?u?d?d?d?d?u?d?d?l +?d?d?d?d?u?l?d?l?d +?d?d?l?l?d?d?d?l?d +?u?d?l?d?d?d?d?d?l +?d?d?d?l?d?d?d?u?u +?d?d?l?d?d?d?d?u?u +?d?l?d?d?d?d?d?u?u +?d?u?u?l?d?d?d?d?d +?l?d?d?u?d?d?u?d?d +?d?l?d?d?d?u?u?d?d +?d?d?u?u?d?d?l?d?d +?d?d?u?u?d?d?d?d?l +?u?l?d?d?d?u?d?d?d +?d?l?d?d?d?l?l?d?d +?d?d?u?d?d?d?l?d?l +?d?d?d?d?d?u?u?d?l +?u?d?d?d?d?u?d?u?d +?d?d?u?d?d?d?d?l?l +?l?d?d?d?u?d?d?d?l +?d?d?d?l?u?d?l?d?d +?d?u?d?l?l?d?d?d?d +?d?l?u?l?d?d?d?d?d +?l?l?l?d?d?l?l?l?s +?l?l?l?l?u?l?l?s +?d?d?d?d?d?d?d?s?s?l +?l?s?l?s?d?d?d?d?d?d +?d?d?d?d?s?d?d?s?s +?d?d?d?s?d?s?d?s?d +?d?d?d?d?s?s?d?d?s +?s?d?d?s?d?s?d?d?d +?d?d?s?d?d?s?s?d?d +?s?s?d?d?d?s?d?d?d +?d?s?d?d?s?d?d?d?s +?l?l?l?d?d?d?l?l?d?d +?u?l?d?l?l?l?l?l?l +?u?l?l?l?u?u?d?d?d +?d?d?d?d?d?d?s?s?s?s +?s?s?l?l?l?l?s?d +?s?s?s?d?l?l?l?l +?d?d?u?u?u?u?u?u?d?d +?u?u?u?u?l?l?l?l?d +?l?l?s?d?d?d?d?d?s +?l?l?s?d?d?d?s?d?d +?l?d?d?d?d?d?l?s?s +?s?s?l?l?d?d?d?d?d +?d?d?d?d?d?s?l?l?s +?u?u?u?u?l?l?l?l?l +?l?l?l?l?l?l?d?d?d?d?d?d +?d?s?l?l?l?s?l?l +?u?s?l?l?l?l?d?s +?u?l?d?l?l?l?s?s +?d?l?l?l?s?s?l?l +?l?s?l?l?l?d?l?s +?l?l?s?l?l?l?s?d?d +?d?u?l?l?l?l?s?s +?l?l?l?s?l?l?d?s +?l?s?l?l?s?l?l?d +?s?u?l?l?l?l?s?d +?u?u?s?d?d?d?d?d?d?d +?d?d?d?d?d?s?l?l?l?l +?l?l?l?d?d?d?s?l?l +?u?s?u?u?u?u?s?u +?l?l?l?d?d?d?s?d?d?d +?l?d?l?l?l?d?d?d?s +?s?u?u?u?u?d?d?d?d +?s?l?l?l?l?l?l?u +?l?l?l?l?l?u?s?u +?l?l?l?u?l?l?l?s +?l?u?u?u?u?l?u?u +?u?u?l?u?l?l?l?l +?l?l?l?l?l?l?d?s?s +?l?d?d?l?d?l?d?l?d?d +?d?d?d?u?l?l?l?d?d?d +?d?l?d?l?d?l?d?l?d?d +?u?u?u?u?d?d?d?d?d?d?d +?d?d?l?s?d?l?l?s +?l?d?s?s?d?l?l?d +?u?d?u?d?s?s?d?u +?l?d?s?l?l?d?d?s +?d?d?s?s?d?u?u?u +?l?l?s?d?d?d?l?s +?s?d?d?d?u?u?u?s +?s?s?l?d?d?d?l?l +?d?l?l?u?d?d?s?s +?d?l?s?d?l?s?l?d +?d?u?u?u?d?d?s?s +?l?l?d?d?d?s?s?l +?l?d?s?s?d?d?l?l +?u?s?d?l?d?l?s?d +?s?u?d?l?d?u?d?s +?d?l?l?d?l?s?d?s +?l?s?l?d?d?l?s?d +?u?l?s?s?l?d?d?d +?u?s?u?u?s?d?d?d +?u?d?u?u?d?d?s?s +?d?l?d?d?l?s?l?s +?l?d?l?d?l?s?s?d +?l?s?s?l?l?d?d?d?d +?l?l?s?l?d?d?d?s +?l?d?l?l?d?d?s?s +?s?s?l?l?d?l?d?d +?u?u?s?d?d?s?d?u +?s?d?l?u?d?l?d?s +?l?d?d?d?s?s?l?l +?l?d?s?d?s?d?l?l +?l?s?l?s?d?d?d?l +?s?s?l?d?d?l?l?d +?l?s?l?d?s?l?d?d +?s?l?d?s?l?d?d?l +?s?d?l?u?d?d?l?s +?s?l?l?u?d?d?d?s +?l?d?s?l?l?d?s?d +?u?l?d?s?s?u?d?d +?u?d?d?l?d?l?s?s +?d?l?s?l?u?d?d?s +?l?d?d?d?l?s?s?l +?s?l?l?s?d?d?l?d +?s?u?l?d?d?l?d?s +?s?l?l?s?d?d?d?u +?l?l?s?s?d?d?d?l +?d?d?l?d?l?l?s?s +?l?d?l?d?s?s?u?d +?s?l?u?l?s?d?d?d +?s?d?l?l?d?l?s?d +?d?l?d?l?s?l?s?d +?d?d?s?d?l?l?l?s +?d?s?l?l?d?d?s?l +?d?l?d?d?l?l?s?s +?u?u?s?u?d?s?d?d +?d?d?l?s?l?d?s?l +?l?d?l?d?u?d?s?s +?u?d?l?d?l?s?s?d +?l?d?d?s?d?l?s?l +?d?l?l?l?s?d?d?s +?s?s?d?l?d?l?d?l +?l?s?s?l?d?d?d?l +?d?l?l?s?d?l?d?s +?d?d?d?s?s?u?l?l +?l?s?d?s?d?l?l?d +?d?s?d?u?s?d?u?u +?s?u?d?d?l?l?d?s +?u?l?u?d?s?d?s?d +?l?l?l?d?d?s?s?d +?d?u?d?u?d?s?s?u +?d?u?l?d?s?d?u?s +?s?l?s?l?d?l?d?d +?l?l?u?s?d?d?d?s +?d?s?l?d?l?l?s?d +?s?u?d?u?l?d?d?s +?u?l?s?d?d?d?l?s +?l?s?l?l?d?d?d?s +?s?d?d?d?s?u?u?u +?l?s?d?d?d?l?s?l +?d?s?d?l?l?l?s?d +?u?l?d?u?d?d?s?s +?l?l?d?d?d?l?s?s +?s?s?d?d?d?u?u?u +?u?d?s?l?d?s?u?d +?u?u?l?s?s?d?d?d +?s?d?d?l?s?d?l?l +?s?u?d?d?d?l?l?s +?d?d?l?l?s?l?d?s +?d?l?l?l?d?s?s?d +?s?l?d?s?d?l?d?l +?s?u?l?u?d?d?d?s +?s?d?u?u?u?s?d?d +?d?s?u?d?d?l?u?s +?u?d?s?u?u?s?d?d +?d?s?s?d?l?d?l?l +?d?u?l?u?d?s?d?s +?u?s?d?l?d?d?s?l +?u?l?s?s?d?u?d?d +?u?s?u?u?d?s?d?d +?l?d?l?s?l?d?d?s +?d?d?u?s?d?l?u?s +?l?s?l?l?d?s?d?d +?u?d?l?d?u?s?s?d +?l?d?l?u?d?s?s?d +?d?s?u?l?l?s?d?d +?u?u?d?d?d?l?s?s +?s?u?d?u?d?d?u?s +?d?d?s?d?u?s?u?u +?l?d?d?l?s?l?d?s +?l?d?d?l?s?l?s?d +?d?l?l?d?d?l?s?s +?l?d?u?s?s?d?l?d +?l?d?s?l?s?l?d?d +?d?u?l?d?s?s?d?l +?u?u?s?d?u?d?s?d +?u?u?l?d?d?d?s?s +?s?d?u?d?u?d?s?l +?u?d?l?s?l?d?s?d +?d?s?l?l?s?d?l?d +?s?u?d?s?u?d?u?d +?s?l?l?u?s?d?d?d +?u?l?d?d?s?d?u?s +?s?d?u?d?u?u?d?s +?d?d?l?d?s?s?l?l +?u?s?s?u?l?d?d?d +?s?d?u?l?l?d?d?s +?d?u?l?l?d?d?s?s +?s?l?l?d?l?s?d?d +?u?d?u?s?l?s?d?d +?d?d?s?l?l?s?l?d +?l?l?d?d?s?l?s?d +?l?l?d?s?l?d?d?s +?d?s?d?l?s?l?l?d +?u?u?s?s?d?d?d?l +?d?d?u?u?s?s?d?u +?l?l?s?d?d?s?d?l +?d?s?d?d?l?l?s?l +?u?l?l?d?s?d?d?s +?s?s?u?d?u?d?d?u +?s?l?d?l?d?l?s?d +?s?d?d?l?s?l?l?d +?u?u?u?s?d?d?d?d?s +?d?l?s?l?l?d?d?s +?l?d?l?s?d?s?l?d +?u?s?u?s?l?d?d?d +?s?l?d?l?s?d?d?l +?d?l?d?s?s?u?l?d +?u?s?d?l?l?s?d?d +?d?l?l?l?s?s?d?d +?s?u?l?u?s?d?d?d +?u?u?u?d?s?d?s?d +?d?u?l?l?s?d?s?d +?u?s?s?l?d?l?d?d +?l?l?l?d?d?s?d?s +?u?d?u?d?d?s?u?s +?d?l?d?l?u?d?s?s +?l?l?d?d?s?d?s?l +?d?l?l?l?s?d?s?d +?s?u?d?d?l?d?l?s +?d?l?s?d?d?s?l?l +?l?u?l?s?d?s?d?d +?d?s?d?d?s?u?u?u +?d?s?l?l?d?l?s?d +?u?d?l?s?s?l?d?d +?l?d?s?s?l?d?l?d +?u?s?d?u?s?d?u?d +?l?s?d?d?s?l?l?d +?s?s?l?d?l?l?d?d +?d?d?d?u?l?u?s?s +?u?d?l?d?s?s?l?d +?s?u?l?s?d?d?l?d +?d?d?u?l?s?l?s?d +?u?l?d?d?u?d?s?s +?s?u?l?d?d?d?u?s +?s?u?d?l?l?d?d?s +?s?l?d?l?s?d?l?d +?d?l?s?l?l?s?d?d +?s?d?d?l?l?l?d?s +?l?l?d?s?d?l?s?d +?u?s?u?l?s?d?d?d +?s?s?u?u?u?d?d?d +?d?s?l?d?l?d?s?l +?l?d?s?s?l?d?d?l +?l?s?d?l?l?d?s?d +?d?l?s?d?s?d?l?l +?u?d?l?l?d?s?d?s +?s?u?d?l?l?s?d?d +?l?s?d?l?d?l?d?s +?s?s?d?d?u?u?d?l +?s?d?l?l?d?d?l?s +?u?s?u?s?d?d?d?u +?d?d?l?l?d?l?s?s +?u?d?s?l?l?d?s?d +?d?d?l?d?u?l?s?s +?u?d?l?u?d?d?s?s +?l?d?s?d?l?l?d?s +?l?s?l?s?d?u?d?d +?u?d?d?d?l?l?s?s +?s?l?l?d?s?l?d?d +?d?s?s?u?l?l?d?d +?d?l?l?l?d?s?d?s +?d?s?d?u?l?l?s?d +?s?l?d?u?s?d?d?l +?l?d?d?s?l?d?s?l +?d?l?d?s?l?d?l?s +?u?u?l?s?d?d?d?s +?d?d?s?l?s?d?l?l +?l?d?d?l?l?d?s?s +?d?s?d?l?l?d?s?l +?s?d?l?l?u?s?d?d +?l?l?s?d?s?l?d?d +?u?d?l?d?s?s?u?d +?s?d?l?l?l?d?s?d +?s?d?d?u?u?s?u?d +?l?s?l?d?l?d?d?s +?s?u?d?d?u?u?d?s +?d?l?l?s?l?d?s?d +?u?s?d?d?l?s?u?d +?u?u?s?l?s?d?d?d +?d?d?s?s?l?l?l?d +?s?d?s?d?d?l?l?l +?l?l?d?d?d?s?l?s +?l?s?l?d?d?d?s?u +?l?s?l?d?d?d?s?l +?s?d?l?d?l?s?d?l +?d?d?d?l?l?s?l?s +?s?d?l?l?l?s?d?d +?u?s?d?l?d?s?l?d +?u?d?u?l?s?d?d?s +?l?d?l?d?s?s?d?l +?s?d?s?d?d?u?u?u +?d?l?d?l?s?s?d?l +?d?l?l?l?d?d?s?s +?d?d?d?u?s?l?l?s +?u?d?u?d?u?d?s?s +?l?d?l?l?d?s?d?s +?u?s?l?l?d?d?d?s +?l?s?l?s?d?d?l?d +?l?l?s?d?d?l?s?d +?l?d?l?d?d?l?s?s +?l?s?s?d?u?l?d?d +?u?d?d?l?l?d?s?s +?s?u?l?d?u?s?d?d +?l?l?d?s?d?s?l?d +?d?s?l?l?s?l?d?d +?d?s?d?s?d?u?u?u +?d?d?d?d?d?u?l?l?l?l +?l?l?l?l?s?d?l?l?l +?u?l?l?l?d?d?d?l?l +?u?d?l?l?d?l?l?l?d +?d?l?d?l?l?l?l?d?l +?u?d?d?d?l?l?l?l?l +?l?l?l?l?s?s?s?d?d +?d?d?l?d?l?d?l?d?s +?l?d?l?d?l?s?d?d?d +?d?d?l?l?l?d?s?d?d +?d?l?d?l?d?l?d?d?s +?d?l?d?d?l?d?d?l?s +?l?s?l?l?d?d?d?d?d?d +?u?u?u?d?d?d?s?d?d +?d?d?d?d?l?l?l?d?s +?l?d?l?d?d?l?d?d?s +?d?l?s?l?l?d?d?d?d +?d?d?u?l?l?s?d?d?d +?u?l?l?d?s?d?d?d?d +?d?s?d?d?d?d?l?l?l +?d?d?d?d?u?l?l?s?d +?u?d?l?l?d?d?d?d?s +?u?s?u?d?u?d?d?d?d +?d?d?d?d?d?l?l?s?l +?l?l?l?l?l?l?l?l?d?l +?u?u?u?u?u?s?d?d?d?d +?l?d?l?d?d?d?l?d?d?d +?d?d?d?d?l?d?l?d?l?d +?d?l?d?d?l?l?d?d?d?d +?u?u?d?d?d?d?d?d?d?u +?d?l?d?d?d?l?l?d?d?d +?l?d?d?l?d?d?d?l?d?d +?d?d?l?d?d?l?d?d?l?d +?s?d?s?d?s?d?s?s +?s?s?s?d?d?d?s?s +?d?d?d?d?d?d?d?d?s?l?l +?u?l?d?d?l?l?l?l?l +?u?l?d?s?l?d?l?l +?s?l?d?l?d?l?l?l +?l?d?s?l?l?l?d?l +?s?d?u?l?d?l?l?l +?d?d?s?l?l?l?u?u +?u?l?d?d?l?u?s?u +?u?d?l?l?l?u?s?d +?u?l?d?l?l?s?l?d +?u?d?s?l?u?d?l?l +?u?u?s?u?u?d?u?d +?s?u?l?l?l?u?d?d +?u?s?u?d?u?d?u?u +?u?s?u?u?l?d?d?l +?u?u?l?l?u?s?d?d +?u?l?u?u?u?s?d?d +?u?l?s?l?u?l?d?d +?u?l?l?s?l?d?d?l +?l?u?l?l?u?s?d?d +?u?l?l?l?d?l?d?s +?l?l?d?d?u?u?u?s +?l?l?s?u?d?l?d?u +?u?d?u?u?u?u?d?s +?u?s?l?l?u?l?d?d +?d?u?u?d?u?u?u?s +?u?s?u?u?d?u?u?d +?u?l?l?d?s?l?d?l +?u?d?u?s?u?d?u?u +?d?u?s?u?l?l?l?d +?l?s?l?l?u?l?d?d +?d?d?u?l?u?l?u?s +?u?l?l?d?s?u?l?d +?u?s?d?l?l?l?d?l +?l?d?s?l?l?d?l?l +?u?s?d?d?u?u?u?u +?u?u?s?u?l?l?d?d +?l?u?s?l?l?l?d?d +?u?u?u?u?d?d?u?s +?u?d?u?d?u?u?u?s +?s?d?u?u?u?u?d?u +?u?l?l?d?l?l?d?s +?s?d?u?l?l?d?l?u +?u?d?l?l?l?s?d?l +?u?d?l?l?l?d?u?s +?d?u?u?u?u?u?s?d +?s?u?l?d?d?l?l?l +?l?u?u?l?l?d?d?s +?u?u?s?l?d?d?l?l +?u?u?s?u?u?u?u?d?d +?u?d?s?l?d?l?l?l +?d?u?l?l?l?l?s?d +?l?d?l?d?l?s?u?u +?u?l?d?d?l?s?u?l +?u?u?s?d?d?u?u?u +?l?l?d?l?d?s?l?l +?u?u?u?d?d?u?u?s +?u?s?u?u?d?d?u?u +?d?d?s?u?u?u?l?l +?l?l?l?u?s?u?d?d +?u?u?u?u?d?d?s?u +?u?d?d?l?s?l?l?l +?l?s?l?l?l?u?d?d +?s?u?u?l?l?l?d?d +?l?l?d?u?s?l?d?l +?l?l?l?d?l?d?s?l +?s?u?l?l?l?d?d?l +?u?l?u?u?l?s?d?d +?u?l?d?l?s?l?l?d +?d?s?l?l?d?l?l?l +?u?d?d?u?u?u?u?s +?u?s?l?d?l?d?l?l +?u?l?s?l?l?d?l?d +?u?u?s?d?d?u?l?l +?l?s?d?l?l?l?d?l +?d?l?l?l?l?s?u?d +?u?l?d?u?d?l?l?s +?d?d?s?l?u?l?u?l +?s?l?d?l?l?l?d?l +?u?s?u?u?u?d?u?d +?u?u?d?u?s?d?u?u +?l?l?u?u?u?s?d?d +?d?l?s?l?l?d?l?l +?u?d?l?d?s?l?l?l +?u?u?u?s?u?d?u?d +?l?l?l?u?u?d?d?s +?u?u?u?u?d?s?d?u +?s?l?u?l?l?l?d?d +?u?d?d?u?s?l?l?l +?u?l?d?l?d?l?l?s +?u?l?u?l?s?l?d?d +?u?u?u?u?l?s?d?d +?u?l?s?l?d?l?l?d +?u?l?u?u?l?d?d?s +?u?d?l?d?u?u?l?s +?u?u?u?d?u?u?d?s +?d?l?l?l?l?l?l?d?s +?u?u?d?l?d?l?l?s +?d?d?l?l?l?l?s?u +?u?d?l?l?d?s?u?u +?l?l?l?s?d?l?d?l +?d?l?l?d?s?l?l?u +?d?d?u?u?u?s?u?u +?u?l?l?l?l?l?l?l?l?l +?u?l?l?l?l?s?s?l +?u?u?u?s?s?u?u?u +?s?s?u?u?u?u?u?u +?u?u?u?u?s?s?u?u +?l?u?l?u?u?d?d?d?d +?u?d?l?d?l?l?d?l?d +?d?l?d?l?l?d?d?l?l +?d?d?u?l?l?u?l?d?d +?d?d?l?d?l?l?l?d?l +?u?d?l?u?l?l?d?d?d +?l?l?l?d?l?d?d?l?d +?d?d?l?l?d?l?l?d?l +?d?l?l?l?d?l?d?d?l +?u?d?l?l?l?d?l?d?d +?l?u?u?u?l?d?d?d?d +?u?d?u?u?d?u?d?u?d +?d?l?d?l?d?d?l?l?l +?u?u?u?s?u?u?u?u?u +?s?s?l?l?l?l?l?d?d +?d?d?d?d?d?d?d?d?d?l?s +?s?u?l?l?l?l?l?d?d +?l?l?s?s?s?s?d?d +?s?s?l?l?s?s?d?d +?s?s?d?d?l?l?s?s +?d?l?s?s?l?s?s?d +?s?s?d?d?s?s?l?l +?s?s?s?s?d?d?l?l +?l?d?l?d?s?s?s?s +?l?s?s?l?s?s?d?d +?d?d?u?l?l?l?l?l?d?d +?u?u?u?u?d?u?l?l +?l?d?l?l?u?u?u?u +?u?l?l?l?d?d?u?l?l +?l?l?d?u?l?u?l?l +?u?l?u?d?l?u?l?u +?l?l?u?u?u?u?d?u +?u?u?l?u?d?l?l?u +?l?u?l?l?u?l?l?d +?u?d?u?l?l?l?l?u +?l?l?u?l?l?l?u?d +?u?d?l?u?u?u?u?u +?l?u?u?u?u?l?d?l +?u?l?l?u?u?u?d?u +?l?l?l?u?d?u?u?l +?l?l?u?l?d?u?u?l +?u?l?u?l?u?d?u?u +?l?u?l?l?u?l?d?l +?u?l?u?u?u?u?d?u +?l?d?u?l?l?u?l?l +?u?u?u?l?l?d?u?l +?u?l?l?d?u?u?u?u +?u?u?l?u?l?u?l?d +?l?l?d?u?l?l?l?u +?u?u?d?u?u?l?u?u +?l?l?u?d?u?l?l?l +?u?d?u?u?l?l?u?u +?u?d?u?u?l?l?u?l +?u?u?l?l?u?u?d?l +?u?u?u?l?l?u?d?l +?l?l?u?d?l?l?l?u +?l?u?u?u?l?d?l?u +?l?u?l?u?l?u?d?l +?l?l?u?u?l?u?l?d +?l?u?u?u?d?u?l?u +?u?l?u?l?l?l?d?u +?l?u?l?u?d?u?l?u +?l?u?l?l?u?l?d?u +?d?l?u?u?l?l?l?u +?l?u?u?u?l?u?u?d +?u?d?l?l?u?l?l?u +?l?l?l?l?u?d?l?u +?l?u?u?l?l?l?d?u +?u?l?d?l?l?l?u?l +?u?l?l?l?l?l?d?d?u +?u?l?u?u?d?l?u?u +?l?d?l?u?l?u?u?u +?l?d?u?l?l?l?u?l +?u?u?l?l?u?d?l?l +?u?u?u?l?d?u?l?l +?u?u?u?l?d?u?l?u +?l?l?l?l?l?l?l?d?l?d +?u?l?d?u?l?u?u?u +?u?l?u?d?u?l?l?u +?l?l?l?d?l?u?u?l +?l?l?l?u?d?l?u?u +?u?u?u?l?u?u?d?l +?l?l?l?d?u?u?l?l +?l?u?d?u?l?l?u?u +?l?u?l?d?u?l?l?l +?u?l?l?l?d?u?l?u +?u?l?d?l?u?l?l?u +?u?u?l?l?u?u?l?d +?l?u?u?u?u?d?u?l +?l?u?d?l?l?u?l?l +?u?l?u?u?l?u?d?u +?l?l?l?u?l?l?d?u +?u?l?l?u?d?u?l?l +?u?u?l?u?u?u?d?l +?l?l?u?u?d?l?u?l +?l?l?l?u?d?u?l?l +?l?u?u?l?u?u?u?d +?u?u?u?u?u?l?u?d +?u?d?l?l?l?l?u?l +?u?l?u?u?l?u?l?d +?l?u?u?u?l?l?d?l +?u?u?u?u?l?u?u?d +?d?l?u?l?l?u?l?l +?l?l?u?l?l?u?l?d +?u?l?d?u?u?u?u?u +?l?l?u?u?d?u?l?l +?l?d?d?d?d?d?d?d?s?s +?s?l?l?l?l?l?l?d?s +?u?u?d?u?u?u?u?u?u +?u?l?d?d?d?d?d?d?d?s +?l?l?l?d?l?l?l?d?d?d +?u?d?l?l?l?s?l?l +?u?l?l?l?u?u?s?d +?l?l?l?l?l?d?s?u +?u?l?u?l?l?l?s?d +?d?u?l?l?s?u?l?l +?u?l?l?l?s?u?u?u +?d?u?u?u?s?l?l?l +?u?l?l?l?l?d?s?u +?s?l?l?l?u?d?l?l +?l?l?l?l?l?s?u?l +?l?l?l?l?u?u?s?d +?u?d?u?u?u?u?u?s +?s?d?u?l?l?u?l?l +?u?l?l?s?l?l?d?l +?u?u?s?u?u?d?u?u +?l?l?l?d?l?s?s?s +?s?l?l?l?l?s?s?d +?s?l?l?l?l?s?d?s +?s?s?d?d?d?d?d?d?d?d?d +?u?l?l?l?l?l?l?d?d?d?d +?d?l?l?d?l?d?l?l?l +?u?l?l?d?l?l?l?d?d +?l?l?l?l?l?d?d?u?u +?u?l?l?l?d?l?l?d?d +?l?l?l?l?d?d?d?s?l +?u?s?l?l?l?l?d?d?d +?l?l?l?l?s?d?d?s?d +?d?d?d?d?d?d?u?l?u?l +?l?d?d?d?l?l?d?d?d?l +?l?l?l?l?l?d?l?d?s +?l?s?l?s?s?s?l +?s?l?u?s?l?s?s +?u?l?s?l?s?s?s +?u?u?s?s?s?l?s +?s?u?l?s?s?s?l +?u?s?s?u?s?u?s +?l?s?u?s?u?s?s +?u?u?s?s?l?s?s +?l?s?u?s?s?u?s +?l?s?u?u?s?s?s +?u?s?l?s?u?s?s +?s?s?l?l?u?s?s +?s?s?s?u?l?u?s +?s?s?s?l?l?s?l +?s?u?l?l?s?s?s +?s?u?s?s?u?u?s +?s?s?l?l?s?l?s +?u?s?u?s?s?l?s +?s?l?l?s?u?s?s +?s?l?s?s?l?s?l +?l?l?s?s?s?l?s +?l?s?s?s?l?l?s +?s?s?l?s?l?s?l +?s?l?l?s?l?s?s +?s?s?l?s?s?u?u +?u?s?l?s?s?s?l +?u?s?s?s?u?s?u +?s?u?s?s?l?u?s +?l?s?s?u?s?s?l +?l?s?l?s?s?u?s +?s?l?u?s?u?s?s +?s?s?u?s?l?l?s +?u?l?l?l?s?s?s?s +?u?s?s?s?s?u?u +?s?s?s?u?u?l?s +?s?s?s?u?l?l?s +?s?u?s?s?u?s?l +?u?s?u?s?s?s?u +?s?s?u?s?l?s?u +?u?l?s?u?s?s?s +?s?u?s?u?s?s?u +?s?s?u?u?s?u?s +?l?s?u?s?s?l?s +?s?s?l?l?l?d?s?s +?s?s?s?s?l?l?u +?u?s?s?l?s?l?s +?s?l?s?u?l?s?s +?s?l?s?s?s?l?u +?s?s?s?s?u?l?l +?s?l?s?s?l?l?s +?u?u?s?u?s?s?s +?s?u?s?u?s?l?s +?u?u?l?s?s?s?s +?s?l?s?l?s?s?l +?l?l?l?l?u?l?u?l +?u?l?u?l?u?u?l?u +?u?u?u?u?u?l?l?u +?u?l?u?l?u?u?u?u +?u?l?u?l?l?l?l?l?d +?d?d?d?u?u?u?u?u?u?u +?l?d?s?l?d?s?l?d?s +?d?l?l?s?s?s?d?l +?l?s?d?d?s?l?s?l +?l?l?s?l?s?s?d?d +?s?l?s?l?l?s?d?d +?l?l?l?l?l?s?l?l?l?l +?d?s?d?l?l?l?l?l?l +?d?d?s?u?u?u?s?d?d +?u?u?l?l?l?l?l?l?l +?l?l?l?l?l?l?l?d?l?l +?s?l?l?l?s?l?l?s +?d?d?d?d?d?d?s?d?d?l +?s?u?d?d?d?d?d?d?d?d +?u?d?d?d?d?s?d?d?d?d +?l?d?d?d?d?d?s?d?d?d +?s?d?d?d?d?d?d?d?d?u +?d?d?d?d?d?d?l?s?d?d +?d?d?d?d?l?s?d?d?d?d +?l?l?d?d?d?d?s?l?l +?d?s?d?d?d?l?l?l?l +?l?l?d?d?s?d?d?l?l +?d?d?l?s?l?l?l?d?d +?l?l?s?d?d?d?d?l?l +?l?s?l?l?l?l?d?s +?l?l?l?s?l?d?l?s +?d?l?l?l?l?s?l?s +?s?d?u?l?l?l?l?s +?s?u?u?u?u?u?s?d +?l?s?l?d?s?l?l?l +?s?s?u?l?l?l?l?d +?l?s?d?s?l?l?l?l +?s?l?s?l?l?l?l?d +?l?d?l?l?l?s?l?s +?d?l?l?l?s?l?l?s +?d?l?d?d?d?d?d?d?d?d?d +?u?l?l?l?l?d?l?l?d +?l?l?d?l?d?l?d?d?d?d +?s?d?d?d?d?d?d?s?d?d +?s?d?d?d?s?d?d?d?d?d +?s?d?s?d?d?d?d?d?d?d +?d?d?d?s?d?d?d?s?d?d +?l?d?l?l?l?l?s?d?d +?s?s?l?l?l?l?l?s?s +?d?d?d?d?d?d?u?u?u?d +?d?d?d?d?d?l?d?l?l?d +?l?d?d?d?l?d?d?d?l?d +?d?d?d?d?d?d?l?d?l?l +?u?u?u?u?d?u?u?d?d +?l?l?l?l?l?s?l?u +?u?l?l?l?u?l?l?l?d?d +?l?l?l?l?l?s?d?d?l +?l?d?d?d?d?s?d?d?l +?l?d?d?d?d?d?d?u?s +?u?d?d?u?s?d?d?d?d +?l?d?d?d?s?u?d?d?d +?u?d?d?d?u?d?d?d?s +?u?d?d?d?d?d?s?d?u +?l?d?u?d?s?d?d?d?d +?u?d?d?d?d?u?d?d?s +?d?s?d?l?d?d?d?d?l +?s?d?l?l?d?d?d?d?d +?s?l?d?d?u?d?d?d?d +?d?d?d?d?s?d?l?l?d +?u?d?d?s?u?d?d?d?d +?l?d?d?l?d?d?d?s?d +?s?l?d?l?d?d?d?d?d +?d?d?d?d?d?s?d?u?u +?s?l?d?d?d?d?d?d?u +?d?s?d?d?u?l?d?d?d +?s?d?d?l?d?d?d?u?d +?s?d?d?d?d?d?d?u?u +?d?d?d?s?d?d?d?u?u +?l?d?d?d?d?l?d?d?s +?s?d?d?d?d?u?l?d?d +?u?d?d?l?d?d?d?d?s +?d?l?s?l?d?d?d?d?d +?d?d?s?d?d?l?d?d?l +?d?d?d?d?l?d?l?d?s +?u?u?u?d?d?d?d?d?d?s +?d?d?d?d?u?s?d?u?d +?d?d?u?d?d?s?l?d?d +?u?s?d?l?d?d?d?d?d +?d?d?d?d?u?d?d?s?u +?u?l?d?d?d?d?s?d?d +?d?l?d?d?d?l?s?d?d +?d?l?l?s?d?d?d?d?d +?l?s?d?d?d?l?d?d?d +?d?l?d?l?s?d?d?d?d +?d?d?d?d?d?l?d?l?s +?u?l?d?d?d?s?d?d?d +?l?d?l?s?d?d?d?d?d +?s?l?u?d?d?d?d?d?d +?d?d?d?d?s?d?d?u?u +?s?d?d?d?d?l?l?d?d +?l?d?d?d?s?d?d?l?d +?d?d?d?l?l?d?d?s?d +?d?d?d?l?d?d?d?s?l +?d?d?s?d?l?d?l?d?d +?d?d?d?u?u?s?d?d?d +?d?l?d?l?d?d?d?d?s +?d?d?l?l?d?d?s?d?d +?d?d?d?l?s?d?d?d?l +?d?u?u?s?d?d?d?d?d +?l?d?l?d?d?d?d?s?d +?d?d?d?d?s?u?d?d?u +?u?d?d?d?d?d?d?s?l +?l?d?s?l?d?d?d?d?d +?s?d?d?d?d?l?d?l?d +?s?d?d?d?l?l?d?d?d +?d?d?d?u?d?l?s?d?d +?d?u?d?s?d?d?d?u?d +?d?s?d?d?d?d?d?u?u +?l?d?d?s?d?d?l?d?d +?d?d?d?d?d?s?l?d?l +?u?d?d?d?s?d?d?u?d +?d?d?s?d?d?l?l?d?d +?l?d?d?d?d?d?u?d?s +?d?d?l?d?l?s?d?d?d +?d?d?d?u?u?d?d?s?d +?l?d?d?l?d?d?d?d?s +?s?l?d?d?d?l?d?d?d +?d?d?d?d?d?s?l?l?d +?l?d?d?s?d?d?d?d?l +?u?d?d?d?s?u?d?d?d +?u?l?d?s?d?d?d?d?d +?d?l?d?d?d?d?l?s?d +?d?d?d?u?s?d?d?d?u +?d?d?s?d?d?d?d?u?u +?u?d?d?d?s?d?u?d?d +?d?d?l?l?d?d?d?s?d +?l?u?d?d?d?d?d?d?s +?l?d?d?d?u?d?d?d?s +?d?d?d?d?u?s?d?d?u +?s?d?d?d?d?d?d?l?u +?d?d?d?d?d?l?l?s?d +?d?d?u?d?d?s?d?d?u +?l?l?l?s?l?l?s?d?d +?l?l?l?l?s?l?s?d?d +?d?d?d?l?l?l?l?l?l?d +?l?l?d?d?l?l?d?d?l?l +?u?s?l?l?l?l?l?s +?l?l?l?l?l?d?l?l?s +?l?s?l?l?l?l?s?s +?s?l?s?l?l?l?l?s +?l?d?d?d?d?d?d?u?d?d +?d?d?d?d?d?d?d?u?d?u +?l?l?s?s?l?l?s?s +?u?u?u?u?u?s?u?u?u +?l?l?l?d?l?l?l?l?l?l +?d?d?d?d?d?l?l?l?l?l?l +?u?l?d?d?l?u?d?d?d +?u?d?u?l?u?d?d?d?d +?u?l?d?l?d?d?l?d?d +?d?d?d?l?l?d?d?u?u +?d?d?d?l?l?d?l?d?l +?d?d?l?d?d?l?l?d?l +?d?d?u?d?l?l?l?d?d +?u?l?l?d?u?d?d?d?d +?l?d?d?l?l?d?d?l?d?d +?u?d?l?d?u?d?l?d?d +?d?l?l?l?d?d?d?d?u +?d?l?l?d?d?d?l?l?d +?d?d?d?d?u?d?u?u?u +?u?d?l?d?d?l?d?l?d +?u?u?d?d?u?d?d?u?d +?u?l?l?d?d?d?d?d?l +?u?u?d?d?d?u?u?d?d?d +?l?d?l?l?u?d?d?d?d +?u?d?u?u?d?u?d?d?d +?u?d?d?d?d?l?l?l?d +?d?d?d?l?l?l?u?d?d +?u?d?l?d?l?u?d?d?d +?d?u?u?d?d?l?l?d?d +?u?d?d?u?u?d?u?d?d +?d?u?d?l?d?l?d?u?d +?d?d?u?u?d?d?d?l?l +?u?u?d?d?d?u?d?d?u +?u?u?d?d?d?d?u?u?d +?l?l?d?l?d?d?d?d?u +?u?l?d?l?u?d?d?d?d +?u?d?d?d?l?l?l?d?d +?d?d?d?d?d?l?u?u?u +?d?d?d?u?l?u?l?d?d +?u?d?l?d?d?l?d?d?l +?d?u?l?d?d?u?l?d?d +?l?d?d?l?u?l?d?d?d +?u?d?d?d?u?d?u?u?d +?u?d?l?d?l?d?d?l?d +?u?d?l?d?u?d?d?l?d +?l?d?l?l?d?u?d?d?d +?u?d?l?l?d?d?l?d?d +?d?d?l?d?u?l?d?d?u +?d?d?d?d?u?l?d?l?l +?u?d?l?u?l?d?d?d?d +?d?d?d?u?d?d?l?l?l +?l?l?u?l?d?d?d?d?d +?u?d?u?d?d?u?d?u?d +?l?d?d?d?d?d?u?l?l +?d?d?d?u?u?l?l?d?d +?d?d?d?l?d?l?d?l?l +?u?d?d?u?d?u?d?d?u +?d?d?d?d?d?d?s?d?d?d?d?d +?l?l?l?l?d?d?u?u?u +?u?l?s?l?l?l?d?d?d +?u?l?l?l?l?d?d?s?d +?s?d?l?l?l?l?l?d?d +?l?l?l?d?l?l?l?l?d?d +?l?d?d?l?d?d?l?d?d?s +?u?l?l?u?l?u?l?u +?u?u?u?l?l?u?l?l +?l?u?l?l?l?u?u?l +?l?u?l?u?l?l?u?l +?u?u?u?u?l?l?l?u +?u?l?l?u?u?u?u?u +?l?u?l?l?u?l?u?l +?l?u?l?u?l?u?l?l +?l?l?u?l?l?u?l?l +?l?l?l?u?l?u?l?l +?d?d?d?d?d?d?d?d?d?u?l +?l?l?l?l?s?l?l?l?l?l +?l?d?d?d?d?d?s?s?s +?l?s?d?s?d?d?s?d?d +?d?l?s?d?l?s?d?l?s +?l?l?s?l?l?s?s?d +?l?s?s?l?l?s?s?l +?l?d?s?d?d?s?d?d?d?d +?l?s?l?l?l?l?d?d?d?d +?u?u?u?u?d?d?l?l?l +?l?u?l?u?l?u?l?d?d +?s?d?d?d?l?l?l?l?s +?u?l?u?u?u?d?d?d?d +?u?l?d?l?l?d?l?l?d +?d?d?u?u?u?l?l?d?d +?d?d?d?d?l?l?u?u?u +?u?d?u?d?u?u?u?d?d +?u?l?d?d?d?d?l?l?u +?l?l?d?l?l?l?l?d?d?d +?d?l?d?d?l?l?l?l?d +?d?d?u?u?l?l?l?d?d +?d?d?u?l?u?l?l?d?d +?u?d?d?d?l?l?d?l?l +?d?d?d?d?u?u?u?u?l +?u?d?l?d?l?d?l?l?d +?d?d?u?u?u?u?d?d?u +?u?l?l?d?u?l?l?d?d +?u?u?d?d?d?u?u?u?u +?d?d?l?l?d?l?d?l?l +?d?d?d?d?l?l?u?l?l +?l?s?d?d?d?d?d?d?d?d?d +?l?l?l?l?d?l?l?l?d?d +?s?s?d?d?d?d?l?l?l +?d?d?d?d?l?s?l?s?l +?u?l?l?s?s?d?d?d?d +?l?l?l?l?l?s?s?u +?u?l?l?s?s?l?l?l +?u?l?l?s?u?l?l?s +?u?l?u?l?u?l?s?s +?d?d?d?d?u?u?u?u?d?d +?l?l?u?u?d?d?d?d?d?d +?s?l?l?l?l?l?d?d?d?d +?u?l?l?l?l?u?u?s +?l?u?l?l?l?l?l?s +?l?l?l?u?u?u?u?s +?l?l?s?l?l?l?l?u +?d?d?l?l?l?d?d?d?d?s +?s?s?s?l?l?s?s?s +?d?l?s?d?d?s?s?l +?d?l?l?d?d?s?s?s +?s?d?d?d?s?u?s?u +?d?d?s?l?s?d?s?l +?s?d?l?l?d?d?s?s +?d?d?s?d?l?l?s?s +?l?d?l?d?d?s?s?s +?l?s?l?d?d?s?d?s +?l?s?s?s?d?l?d?d +?l?s?d?d?s?d?s?l +?d?s?d?s?l?d?s?l +?u?s?l?s?s?d?d?d +?u?s?l?s?d?s?d?d +?s?s?s?u?l?d?d?d +?d?s?s?d?s?l?d?l +?u?s?d?s?u?s?d?d +?d?s?d?d?l?s?l?s +?u?s?l?d?d?s?d?s +?s?u?s?u?d?d?d?s +?l?d?d?d?s?s?s?l +?l?d?d?d?s?l?s?s +?d?d?s?l?s?l?s?d +?d?s?d?d?s?u?s?u +?u?d?u?d?d?s?s?s +?s?s?l?l?s?d?d?d +?s?u?s?d?l?d?d?s +?d?l?s?d?s?l?s?d +?s?l?d?s?u?s?d?d +?d?d?d?u?u?s?s?s +?u?d?d?l?s?s?d?s +?l?d?s?s?s?d?d?l +?d?d?d?s?u?s?u?s +?d?d?u?l?s?s?s?d +?d?s?d?s?d?l?l?s +?s?d?s?d?l?l?d?s +?u?u?s?s?s?d?d?d +?s?s?l?l?d?d?d?s +?s?d?u?s?d?u?s?d +?s?s?d?l?l?d?d?s +?s?d?s?d?s?l?d?l +?d?d?u?s?d?l?s?s +?s?l?l?d?d?d?s?s +?d?d?d?u?l?s?s?s +?s?l?s?u?s?d?d?d +?l?s?u?s?s?d?d?d +?s?s?u?u?d?d?d?s +?l?d?d?s?l?s?d?s +?d?d?s?d?s?l?s?l +?l?s?s?s?u?d?d?d +?s?u?s?u?s?d?d?d +?s?d?d?d?s?u?u?s +?u?d?d?l?s?s?s?d +?l?d?s?s?l?s?d?d +?s?d?d?s?d?s?l?l +?l?s?s?l?d?d?d?s +?d?s?l?l?s?d?s?d +?u?s?d?s?d?s?d?u +?u?s?s?d?d?s?d?u +?l?l?d?d?s?s?s?d +?s?d?d?d?s?u?l?s +?d?d?s?d?l?s?l?s +?s?s?s?d?l?l?d?d +?l?l?s?s?s?d?d?d?d +?u?s?u?s?d?d?s?d +?d?d?l?l?s?s?s?d +?s?u?u?d?d?d?s?s +?d?l?d?l?s?s?s?d +?d?s?d?u?s?s?d?u +?d?s?d?l?s?s?d?u +?u?s?u?s?d?s?d?d +?d?d?d?s?s?s?u?l +?l?l?s?d?d?s?d?s +?d?d?s?l?d?l?s?s +?d?s?s?d?d?s?l?l +?d?s?u?l?d?s?d?s +?s?s?d?d?d?s?l?l +?s?l?d?d?l?d?s?s +?d?l?l?s?s?d?d?s +?s?s?d?d?u?l?s?d +?u?l?s?s?s?d?d?d +?d?l?d?l?d?s?s?s +?s?d?s?d?d?s?l?l +?l?s?s?l?s?d?d?d +?s?s?l?d?l?s?d?d +?s?d?u?d?s?l?s?d +?l?s?d?d?d?s?s?l +?l?d?s?l?d?d?s?s +?u?s?s?s?d?d?d?l +?s?s?s?d?d?d?l?u +?d?s?l?d?s?d?s?l +?s?s?d?d?s?d?l?l +?d?l?s?d?l?s?s?d +?s?d?s?d?s?d?u?l +?u?d?s?d?l?d?s?s +?u?u?d?d?s?s?s?d +?s?l?d?d?s?l?d?s +?s?l?l?d?s?d?d?s +?u?u?u?d?u?u?u?u?d +?d?d?l?l?l?l?l?s?s +?d?d?d?l?s?l?l?l?l +?d?d?d?d?s?l?l?s?d +?d?d?s?d?s?d?d?u?u +?s?l?d?d?d?d?d?l?s +?s?s?d?d?d?d?d?u?u +?s?l?d?l?d?d?d?d?s +?s?d?d?d?d?d?l?l?s +?l?d?s?d?d?s?d?d?l +?s?d?d?d?l?l?d?d?s +?s?s?d?d?d?d?d?l?l +?u?u?u?u?u?l?l?l?l +?u?s?u?d?d?d?d?d?d?d +?l?l?d?d?d?d?d?d?d?l?l +?l?l?l?l?d?d?s?l?l +?d?l?s?d?l?s?l?l +?d?s?d?l?s?l?l?l +?l?l?d?d?s?s?u?u +?u?l?s?l?l?d?d?s +?d?s?u?u?u?u?s?d +?l?l?l?d?s?d?s?l +?s?u?d?l?s?u?d?l +?d?d?s?l?s?l?l?l +?s?l?d?l?d?l?s?l +?d?u?l?d?u?l?s?s +?l?d?l?s?d?l?l?s +?u?d?l?s?l?s?u?d +?u?s?l?s?l?l?d?d +?u?u?s?u?s?u?d?d +?s?l?l?s?l?l?d?d +?l?s?l?s?d?l?l?d +?s?s?l?l?l?u?d?d +?s?l?l?l?u?s?d?d +?d?l?d?l?s?l?s?l +?l?s?l?l?d?d?l?s +?s?u?u?l?l?d?d?s +?u?l?u?l?d?s?d?s +?u?l?u?l?s?d?d?s +?u?d?d?l?l?l?s?s +?d?s?d?s?u?l?l?l +?l?d?l?s?l?l?s?d +?l?s?l?d?l?d?s?l +?u?u?d?d?s?l?l?s +?u?u?l?l?s?d?d?s +?s?s?d?d?u?l?u?l +?d?u?l?s?l?d?u?s +?l?l?l?u?s?s?d?d +?d?l?u?s?d?l?u?s +?s?d?u?u?u?u?d?s +?s?d?l?l?d?l?l?s +?u?s?s?l?u?l?d?d +?l?s?l?d?l?l?d?s +?s?u?l?d?d?l?u?s +?u?s?u?u?s?u?d?d +?l?l?s?l?s?d?d?l +?u?u?u?s?d?d?s?l +?l?s?u?d?l?s?u?d +?s?d?l?d?l?l?l?s +?s?u?d?u?u?u?d?s +?l?s?d?d?l?s?l?l +?u?s?l?d?d?l?l?s +?d?d?s?u?l?l?l?s +?u?s?s?u?l?d?d?l +?s?d?u?u?u?u?s?d +?l?l?l?d?d?u?s?s +?u?u?s?l?l?d?d?s +?s?u?l?l?u?s?d?d +?d?l?s?l?s?d?l?l +?d?l?s?s?d?l?l?l +?u?l?d?u?l?d?s?s +?l?s?l?d?d?l?l?s +?u?l?d?l?l?d?s?s +?s?u?u?u?s?u?d?d +?l?d?l?d?l?s?l?s +?d?d?s?u?u?l?l?s +?d?l?l?l?s?d?s?l +?u?u?d?d?s?l?s?l +?u?s?l?s?d?d?u?l +?s?u?l?l?u?d?d?s +?l?s?d?s?d?l?l?l +?u?s?l?d?l?d?l?s +?u?l?d?d?s?l?l?s +?u?d?u?u?u?d?s?s +?u?l?l?s?s?l?d?d +?s?l?l?s?l?d?l?d +?s?s?l?l?d?d?u?u +?l?d?s?d?s?l?l?l +?l?l?d?d?s?l?l?s +?s?d?d?s?u?l?l?l +?s?l?l?l?d?l?d?s +?d?s?d?u?u?u?u?s +?l?s?l?l?s?d?l?d +?d?s?l?l?d?s?l?l +?s?l?l?l?s?d?d?l +?d?u?l?s?s?d?u?l +?u?l?l?s?d?d?s?l +?l?s?d?d?l?l?l?s +?u?u?u?u?d?s?d?s +?s?u?u?d?u?d?u?s +?u?l?u?u?d?d?s?s +?l?l?d?s?s?l?d?l +?s?s?u?l?u?l?d?d +?d?d?s?s?u?l?l?l +?u?l?l?l?d?s?s?d +?u?s?l?u?s?l?d?d +?l?l?u?u?s?d?d?s +?l?l?d?d?l?s?s?l +?d?l?l?l?l?s?d?s +?l?l?d?s?l?d?s?l +?s?s?l?l?l?d?l?d +?d?l?l?s?l?d?s?l +?s?d?d?l?l?u?u?s +?d?l?l?l?s?d?l?s +?l?l?l?s?d?l?d?s +?d?s?s?d?l?l?l?l +?l?l?l?l?l?l?s?d?s +?u?l?l?l?s?l?l?l?l +?d?d?d?d?d?d?d?l?l?d?d +?l?l?l?l?s?d?d?d?d?d?d +?l?d?d?d?d?d?d?l?l?d +?l?d?d?d?d?l?d?d?l?d +?d?d?l?l?d?d?l?d?d?d +?d?d?d?u?l?l?d?d?d?d +?u?u?d?d?d?d?d?d?d?l +?d?d?d?l?l?d?d?l?d?d +?d?d?l?l?s?l?l?d?d +?l?d?l?l?d?l?d?d?s +?d?d?d?l?l?l?l?d?s +?d?u?d?u?d?u?d?u?s +?u?l?l?u?s?d?d?d?d +?l?l?d?d?l?l?l?d?d?d +?s?d?l?l?l?l?l?s?d +?l?l?l?u?d?d?d?d?d?d +?d?d?d?l?l?l?d?d?d?l +?d?d?l?l?d?d?d?d?l?l +?s?d?u?l?u?l?u?l +?l?l?s?l?l?d?l?u +?u?l?l?l?s?l?d?l +?u?u?u?u?l?l?s?d +?s?d?u?u?u?l?l?l +?u?l?s?l?l?l?d?l +?l?u?l?u?l?u?s?d +?l?s?d?u?l?l?l?l +?d?l?l?l?l?l?u?s +?l?s?d?u?u?u?u?u +?u?l?l?s?l?d?l?l +?u?l?l?s?l?d?l?u +?l?u?s?d?l?l?l?l +?u?l?d?l?l?l?s?l +?l?l?l?u?l?l?d?s +?l?u?l?l?l?l?s?d +?s?u?l?l?d?l?l?l +?u?l?l?l?s?u?l?d +?u?l?l?l?d?l?s?l +?u?l?l?u?s?l?l?d +?l?d?l?l?s?l?l?u +?u?l?s?l?l?d?l?l +?u?u?d?s?u?u?u?u +?s?l?l?l?l?d?l?u +?l?l?l?u?u?u?d?s +?u?l?l?l?l?d?d?d?d?s +?l?l?s?d?d?d?d?d?d?d?d +?d?d?s?d?s?d?d?d?d?s +?d?d?s?d?s?d?d?s?d?d +?u?d?l?d?l?l?d?l?l +?u?u?u?u?u?l?d?d?d +?d?d?u?u?u?u?u?u?d +?l?l?u?u?u?u?d?d?d +?u?u?u?d?d?u?u?u?d +?s?l?s?l?s?l?s?l +?d?d?s?s?s?s?s?s +?s?l?l?l?l?l?l?s?d +?l?d?s?l?l?s?l?l +?s?l?l?l?s?l?d?l +?l?l?s?l?l?l?d?s +?l?s?l?l?l?d?s?l +?u?u?l?l?l?l?s?s +?s?l?l?l?l?s?l?d +?s?l?s?l?d?l?l?l +?l?l?l?s?l?d?s?l +?l?s?l?d?l?l?l?s +?u?s?u?s?u?l?l?l +?l?d?l?s?l?l?s?l +?u?l?l?u?l?l?s?s +?u?d?l?s?l?l?l?s +?l?s?l?d?l?l?s?l +?l?l?l?l?s?l?d?s +?l?l?l?s?d?l?l?s +?s?l?l?l?s?l?l?d +?l?l?l?l?d?s?l?s +?u?d?l?l?s?l?l?s +?u?s?u?u?u?s?u?u +?u?s?s?l?l?l?l?l +?l?l?l?d?s?l?l?s +?u?l?l?l?u?u?u?d?d +?u?d?l?l?l?l?l?l?d +?l?l?l?l?l?l?d?l?s +?l?s?l?s?l?s?d?s +?s?l?s?l?s?l?s?d +?s?s?l?d?l?l?s?s +?l?l?l?d?s?s?s?s +?d?d?d?d?s?s?s?s?s +?l?l?u?u?l?l?u?l +?l?l?u?l?u?l?l?l +?l?l?u?u?u?u?u?l +?u?l?l?u?l?l?u?u +?u?l?u?u?l?u?l?u +?l?l?l?u?u?u?u?l +?d?l?l?l?l?l?d?d?s +?d?d?d?d?d?d?l?l?s?s +?l?l?s?l?d?d?d?d?d?d +?d?s?l?l?l?l?l?s?d +?s?u?s?s?l?s?s +?s?s?u?u?s?s?s +?s?s?s?u?s?s?u +?s?s?s?l?l?s?s +?u?s?s?l?s?s?s +?s?l?s?s?s?l?s +?s?s?s?s?l?s?l +?s?s?s?l?s?l?s +?l?u?s?s?s?s?s +?u?s?l?s?s?s?s +?l?s?s?s?s?l?s +?l?s?s?s?u?s?s +?s?u?s?s?u?s?s +?l?s?s?l?s?s?s +?s?u?s?s?s?l?s +?s?s?u?s?l?s?s +?s?s?s?l?u?s?s +?s?u?s?u?s?s?s +?s?s?l?s?s?s?u +?l?l?u?l?l?l?l?s +?l?l?l?s?l?l?l?u +?u?l?s?l?l?l?l?u +?l?u?l?u?l?u?l?s +?u?u?u?u?u?u?u?d?d?d?d +?l?s?l?s?l?l?l?s +?l?s?l?s?l?l?s?l +?s?s?l?d?s?s?l?d +?l?l?s?s?d?d?s?s +?l?s?l?s?s?d?d?s +?s?s?u?u?d?d?s?s +?d?l?s?s?d?l?s?s +?d?l?u?l?u?u?l?l +?l?d?l?u?l?u?l?u +?l?l?u?d?l?l?u?u +?l?d?u?l?u?u?u?u +?l?u?u?u?u?d?l?l +?d?u?l?l?u?u?u?u +?u?u?u?d?l?l?l?u +?l?u?l?l?d?u?l?l +?l?u?l?d?u?l?u?u +?u?l?l?u?d?l?u?l +?l?l?u?l?d?l?u?l +?u?u?l?l?l?d?u?u +?l?u?u?d?l?l?l?l +?d?l?u?l?l?l?l?u +?l?l?d?u?u?u?l?l +?l?l?d?l?u?u?l?l +?l?u?u?u?u?l?d?u +?u?l?u?l?d?u?u?u +?u?u?l?d?u?l?l?l +?u?d?l?l?u?u?l?l +?u?d?u?u?l?u?l?l +?l?l?l?u?d?u?u?u +?l?u?u?d?l?u?l?l +?l?l?u?l?d?u?u?u +?d?l?u?l?u?l?u?l +?l?u?l?u?l?u?u?d +?u?l?u?l?d?u?l?l +?u?l?d?l?l?u?l?u +?l?d?u?l?l?u?l?u +?l?u?l?l?l?l?u?d +?u?u?u?l?l?d?u?u +?l?u?l?l?l?d?l?u +?u?l?l?l?u?l?d?u +?l?u?d?u?u?l?l?l +?u?u?u?l?u?u?l?d +?l?l?d?u?u?l?u?l +?l?d?l?u?u?l?l?l +?l?l?u?u?u?u?d?l +?l?d?u?u?l?u?u?u +?u?u?l?u?l?d?l?l +?l?l?u?u?u?d?l?l +?u?u?l?l?u?u?d?u +?u?d?l?l?l?u?l?u +?l?u?u?u?d?l?l?u +?u?l?l?d?l?u?u?u +?l?l?u?l?l?l?d?u +?u?u?u?d?u?u?u?l +?d?u?l?l?u?u?l?l +?u?l?u?l?l?u?u?d +?l?u?u?u?l?d?l?l +?l?d?u?l?l?u?u?u +?l?u?l?l?u?l?u?d +?l?l?u?u?u?u?l?d +?u?u?l?d?u?u?u?l +?u?u?u?u?d?l?l?u +?d?u?l?l?l?u?u?l +?d?u?l?l?l?u?u?u +?d?u?u?l?u?l?l?l +?u?d?l?u?u?l?l?u +?u?d?l?u?u?l?l?l +?l?u?u?d?u?u?l?l +?l?d?l?l?l?u?l?u +?l?d?u?u?u?u?u?l +?l?d?u?u?l?l?u?u +?l?l?d?l?l?u?l?u +?u?u?l?u?l?l?u?d +?u?d?u?l?l?l?u?u +?l?l?u?d?u?u?l?l +?l?u?u?l?l?d?l?l +?u?u?d?d?l?l?l?l?l +?l?l?u?l?l?d?l?u +?u?u?u?l?l?u?l?d +?l?l?l?u?d?l?l?u +?u?d?l?u?u?u?l?u +?u?l?u?u?u?l?u?d +?u?u?u?u?l?u?l?d +?l?u?l?l?d?l?u?l +?d?u?l?u?l?u?l?u +?l?l?u?l?l?u?u?d +?l?l?d?l?u?u?u?u +?l?u?d?l?l?l?u?l +?u?u?l?l?u?d?u?l +?d?l?l?u?l?l?u?u +?u?l?u?l?l?u?d?l +?u?l?u?l?l?u?d?u +?u?l?u?l?u?u?u?d +?u?u?u?d?u?l?u?u +?l?l?u?d?u?u?u?u +?l?l?l?u?l?u?d?l +?d?l?l?l?l?u?u?l +?u?l?u?d?u?l?u?u +?l?l?l?u?l?d?l?u +?l?l?l?l?u?u?d?u +?l?l?l?l?u?u?d?l +?l?u?l?u?u?u?l?d +?u?u?l?l?u?d?l?u +?d?l?l?u?l?l?u?l +?u?u?d?l?l?u?u?u +?u?l?u?u?l?u?u?d +?l?u?u?d?l?u?l?u +?u?d?u?u?u?l?u?l +?l?l?u?l?u?u?u?d +?l?u?u?l?u?u?l?d +?l?u?l?d?l?u?u?u +?d?l?u?l?u?l?l?l +?l?l?l?l?u?d?u?l +?u?d?u?l?l?l?u?l +?u?d?l?l?u?l?u?u +?l?l?l?u?u?d?u?l +?u?u?l?u?u?l?l?d +?u?u?u?u?d?l?u?u +?l?l?u?u?d?l?u?u +?l?d?u?u?u?u?l?l +?u?l?u?d?l?l?u?l +?l?d?l?l?u?l?u?u +?u?l?l?l?d?l?u?l +?l?l?u?d?u?u?u?l +?u?l?l?d?u?u?u?l +?u?u?d?u?l?l?u?u +?u?u?l?l?l?u?d?u +?u?u?u?d?u?l?u?l +?u?u?u?u?d?u?u?l +?l?l?u?l?u?u?d?l +?u?l?l?u?d?l?l?u +?u?u?u?u?l?l?d?l +?u?l?u?d?u?u?l?l +?u?l?d?u?u?u?u?l +?d?u?l?u?u?u?u?u +?u?l?l?s?u?l?l?d?d +?l?l?l?l?l?d?d?l?s +?l?l?l?l?l?d?l?d?d?d +?d?d?d?d?l?l?l?l?l?s +?u?l?l?s?u?l?l?l?l diff --git a/masks/rockyou-7-2592000.hcmask b/masks/rockyou-7-2592000.hcmask new file mode 100644 index 0000000000..328dea617a --- /dev/null +++ b/masks/rockyou-7-2592000.hcmask @@ -0,0 +1,25043 @@ +?d +?d?d +?l +?d?d?d?d +?d?d?d?d?d?d +?d?d?d?d?d +?l?l +?d?d?d +?u +?s +?l?l?l +?u?u +?l?d +?d?d?d?d?d?d?d +?u?d +?l?l?l?l +?l?l?d?d?d?d +?u?u?u +?l?l?d +?u?l +?l?d?d?d?d +?l?l?l?l?l +?l?l?l?d?d +?l?d?d +?d?d?d?d?l +?l?d?d?d?d?d +?l?l?d?d +?s?d +?l?l?l?d?d?d +?l?l?l?l?d?d +?s?s +?d?d?d?d?l?l +?l?l?d?d?d +?d?d?d?d?d?l +?d?d?d?d?d?d?d?d +?d?l +?u?l?l +?l?s +?l?l?l?l?d +?l?l?l?d +?l?d?d?d +?l?d?l +?l?d?d?d?d?d?d +?u?u?u?u +?l?l?l?l?l?l +?d?d?d?l +?u?u?d +?d?d?d?d?d?d?l +?s?d?d +?u?d?d?d?d +?u?u?u?u?u +?d?l?l +?d?d?d?l?l +?u?u?d?d?d?d +?d?d?d?d?s +?d?d?d?d?u +?l?l?l?d?d?d?d +?l?l?l?l?l?d +?u?l?l?l +?u?u?u?d?d +?d?s?d +?l?s?l +?l?d?d?d?d?l +?d?d?s?d?d +?u?d?d +?d?d?l +?d?d?d?l?l?l +?u?d?d?d?d?d +?d?d?l?d?d +?d?d?s +?d?d?l?l?l +?d?d?l?l +?u?u?u?u?d?d +?l?l?d?d?d?d?d +?l?d?d?l?d?d +?u?l?l?l?l +?u?u?d?d?d +?d?d?l?l?d?d +?u?d?u +?u?u?u?d?d?d +?d?d?d?d?d?u +?u?u?d?d +?u?u?u?u?d +?l?d?l?d +?u?d?d?d +?d?d?u +?d?d?d?d?u?u +?d?l?l?l +?l?s?d +?l?d?d?d?l +?l?d?d?l +?s?d?d?d?d +?d?l?l?l?l +?l?l?s +?d?d?d?d?l?d +?d?d?d?d?d?d?d?d?d +?d?d?l?l?l?l +?l?l?d?l +?d?d?d?l?d +?l?d?l?l +?d?d?d?s +?l?d?l?d?d +?d?d?l?d?d?d +?l?l?l?l?l?d?d +?u?d?d?d?d?d?d +?l?l?l?l?d?d?d +?l?d?l?d?l?d +?s?s?s +?d?d?d?l?d?d +?d?s?d?d +?d?l?d?d?d +?u?u?u?d +?d?l?d?d?d?d +?l?l?l?d?l +?d?l?l?d +?d?l?d?d +?d?d?l?d +?u?l?l?l?d?d +?d?d?d?s?d +?d?d?d?d?d?s +?l?d?l?d?l +?u?l?l?d?d +?u?u?l +?l?d?d?l?d +?u?u?u?u?u?u +?l?l?d?l?l +?d?d?d?d?d?d?u +?l?d?l?l?l +?l?l?d?d?l +?u?d?l +?d?u?u +?d?l?l?l?d +?l?d?l?d?d?d +?d?s?d?d?d +?u?l?d?d?d?d +?u?s?u +?l?d?l?l?d +?d?d?d?d?l?l?l +?d?d?d?u?u +?l?l?d?d?l?l +?d?l?l?l?l?l +?u?l?l?l?d +?d?d?l?d?d?l +?s?d?l +?l?d?d?d?d?d?d?d +?l?u?u +?l?d?d?l?l +?l?l?l?l?s +?d?l?l?d?d +?d?d?l?l?d +?u?u?u?u?u?d +?l?s?d?d +?d?d?d?d?d?l?l +?d?d?s?d?d?d +?d?l?d?l?d +?l?l?d?l?d +?u?l?l?d?d?d +?s?d?s +?s?s?d +?d?l?l?l?d?d +?s?l?l +?u?u?s +?d?d?d?s?d?d +?d?l?l?l?l?d +?l?l?l?s +?l?l?d?d?d?l +?d?d?d?d?d?d?d?l +?s?d?d?d?d?d +?l?l?l?d?d?l +?d?d?d?d?s?d +?l?l?s?d?d +?l?l?l?l?l?l?l +?l?l?d?d?d?d?d?d +?d?d?d?l?l?d +?u?d?d?d?d?u +?l?l?l?l?d?l +?l?d?d?d?l?l +?d?l?d?l?d?l +?d?l?l?d?d?d +?u?l?l?l?l?l +?u?l?l?d +?l?l?l?l?l?l?d +?d?d?d?u?u?u +?u?u?u?d?d?d?d +?l?d?l?l?d?d +?l?l?l?s?d?d +?d?d?s?d +?d?l?d?l +?u?l?l?l?l?d +?u?l?d?d?d +?u?l?u +?l?u?l +?l?l?u +?d?d?l?d?l +?l?d?d?l?l?l +?l?l?d?l?l?d +?d?d?u?d?d +?d?d?d?d?d?d?s +?l?l?l?d?l?l +?l?l?l?l?d?d?d?d +?l?d?d?d?l?d +?d?d?u?u?u +?l?l?d?l?l?l +?l?d?l?l?l?l +?l?l?s?d +?d?l?d?d?l +?d?d?d?d?d?d?d?d?d?d +?d?d?l?l?l?d +?u?l?s +?d?l?d?l?l +?l?l?d?l?d?d +?l?d?l?l?d?l +?l?l?l?s?d +?d?s?d?s?d?d +?d?d?l?l?l?d?d +?u?d?d?u?d?d +?d?l?l?d?l +?s?d?d?d?d?s +?d?s?d?d?d?d +?d?u?u?u +?s?d?d?d?s +?d?d?d?u +?d?d?d?d?s?s +?d?l?d?l?d?d +?l?l?l?d?l?d +?u?u?d?d?d?d?d +?d?l?d?d?l?d +?d?u?u?u?u +?l?l?d?d?l?d +?d?d?d?d?d?d?l?l +?l?l?s?l?l +?u?l?u?l +?l?l?l?l?l?s +?l?d?l?l?l?d +?u?d?u?d?d +?s?d?d?d +?l?s?l?l?l +?u?d?d?d?u +?l?d?d?l?l?d +?l?l?l?l?u +?d?d?l?d?l?d +?u?d?u?u +?l?s?d?d?d?d +?l?d?d?l?d?l +?l?l?l?s?l +?d?d?d?l?d?d?d +?l?d?l?d?d?l +?l?l?s?l +?d?d?u?u?d?d +?d?d?d?d?u?d +?l?d?l?d?l?l +?d?s?d?s?d +?d?l?d?d?d?l +?u?u?l?l +?d?d?l?d?d?d?d +?d?d?d?l?l?l?l +?d?d?d?l?d?l +?l?s?l?l +?u?l?l?l?u +?l?l?l?l?s?d +?d?d?u?u?u?u +?d?d?d?d?l?d?d +?d?d?d?s?s +?u?s?d?d +?u?l?l?d?d?d?d +?d?d?d?s?d?d?d +?u?u?u?u?u?d?d +?l?l?s?d?d?d +?l?l?l?d?d?d?d?d +?s?s?d?d?d +?l?d?d?d?d?d?l +?d?d?d?u?d?d +?l?s?l?d?d +?u?u?u?d?u +?l?l?d?l?d?l +?d?d?u?d?d?d +?u?d?d?u?d +?d?d?d?d?s?d?d +?l?s?d?d?d +?d?d?d?d?u?l +?u?l?u?l?u +?u?u?u?u?d?d?d +?u?d?u?d?u +?l?u?u?u?u +?u?l?l?u +?u?d?u?d?u?d +?d?u?l?l +?u?u?d?u +?l?d?d?d?d?s +?u?d?d?d?d?l +?d?d?l?l?d?l +?d?u?d?d?d +?d?d?d?u?d +?u?l?u?d?d +?u?l?l?l?l?d?d +?u?d?d?u +?d?d?u?u +?l?d?u?d +?u?d?u?d +?u?l?d?d +?d?d?d?d?s?l +?u?u?d?d?u +?d?d?l?d?l?l +?l?s?l?s?l +?d?l?l?d?l?l +?d?u?d?d?d?d +?l?l?l?d?d?s +?u?u?l?l?l +?l?l?l?l?l?l?d?d +?l?s?l?s +?u?d?u?u?u +?s?l?l?l?l +?d?d?s?d?d?d?d +?d?l?l?d?l?d +?d?d?l?l?l?l?l +?d?l?l?d?d?l +?d?u?u?u?u?u +?u?d?u?u?d +?u?d?u?d?d?d +?d?l?d?d?l?l +?l?l?l?l?l?d?d?d +?d?l?l?l?d?l +?s?d?d?d?d?d?d +?d?l?d?l?l?d +?u?u?d?u?u +?u?l?u?d?d?d +?s?l?l?l +?d?u?d?u?d +?u?d?d?d?l +?s?s?s?s +?l?l?d?d?s +?d?s?d?l +?d?d?s?l +?s?l?d?d +?d?l?d?l?l?l +?u?u?u?u?s +?d?u?l?u +?u?d?d?d?d?d?d?d +?l?s?l?d?d?d +?l?u?u?u +?u?u?u?l +?d?d?l?l?d?d?d +?l?l?l?s?s +?u?d?d?l?d +?l?u?d?d?d +?d?d?u?u?d +?l?u?d?d?d?d +?d?d?d?d?d?l?d +?d?u?u?u?d +?s?s?d?d?d?d +?d?d?d?s?l +?d?d?d?d?l?s +?s?s?d?d +?u?l?u?l?d?d +?l?s?l?d +?l?l?l?u +?d?s?d?d?s?d?d +?d?d?s?d?d?s +?u?l?l?l?d?d?d +?u?u?u?s +?d?d?u?d?d?u +?u?d?d?u?u +?l?d?l?d?d?d?d +?d?l?d?d?d?d?d +?d?d?d?d?u?u?u +?u?s?d?d?d?d +?l?l?u?d?d +?u?u?d?u?d +?u?l?l?l?s +?d?d?s?d?s?d?d +?d?d?d?d?d?d?d?u +?d?d?d?d?d?s?d +?u?u?s?d?d +?d?d?d?d?d?u?u +?u?d?l?l?l +?u?u?d?d?u?u +?u?d?l?l?d +?d?d?u?d?u +?u?d?l?d?d +?d?l?l?l?l?l?l +?d?d?d?l?l?d?d +?s?l?l?l?s +?u?u?l?d?d +?d?d?u?l?l +?l?l?u?l?l +?l?s?l?l?l?l +?u?l?d?d?d?d?d +?l?l?d?d?d?s +?u?u?l?d?d?d +?l?d?d?d?d?d?d?l +?l?l?l?l?s?d?d +?l?u?u?d?d?d +?u?l?u?l?l +?l?l?d?d?d?l?l +?l?d?d?d?d?d?d?d?d +?u?u?u?u?u?u?d +?l?l?l?l?s?l +?d?d?d?d?l?l?d +?u?u?u?s?d?d +?l?l?d?d?d?d?l +?d?d?d?d?l?l?l?l +?d?u?u?u?u?d +?l?l?s?l?l?l +?l?l?u?d?d?d +?d?d?d?u?l +?u?l?u?l?d +?u?u?u?u?l +?l?d?d?d?s +?l?u?l?d?d?d +?l?l?l?l?d?s +?u?d?l?l +?d?u?d?u?d?u +?l?u?l?d?d +?d?u?u?d?u +?u?l?d?l +?u?u?d?l +?d?d?s?s?d?d +?l?l?s?d?d?d?d +?u?l?l?u?l +?d?d?s?l?l +?s?d?l?l?l +?l?u?l?l?l +?l?d?d?d?d?l?l +?u?u?d?d?d?d?d?d +?u?l?l?l?l?u +?d?u?u?u?d?d +?u?l?d?d?l +?u?l?d?l?d +?u?u?l?l?d?d +?l?d?l?d?l?d?d +?l?l?l?l?s?s +?u?u?u?u?u?u?u +?l?l?l?d?s +?l?l?l?s?l?l +?d?u?u?d?d?d +?u?u?u?u?d?u +?d?u?l?l?l +?u?d?d?l?d?d +?d?d?d?u?u?d +?l?d?d?d?l?l?l +?d?d?u?l?l?l +?l?l?l?u?u +?u?u?d?d?d?u +?d?d?d?u?l?l +?u?d?l?d?l +?l?u?l?u?l +?d?l?s?l +?s?l?l?d +?u?u?u?s?d +?d?s?l?l +?l?s?d?l +?l?l?d?s?d +?u?u?s?d +?u?s?d?u +?l?d?d?l?d?d?d +?d?u?u?d?d +?d?u?d?d?u +?d?d?d?d?d?d?d?d?l +?l?l?u?u +?u?l?l?d?l +?u?u?u?l?l +?s?l?l?l?l?l +?l?d?d?s?d?d +?l?l?l?s?d?d?d +?l?l?u?u?u +?d?d?s?d?d?s?d?d +?d?l?l?l?d?d?d +?u?u?s?u?u +?u?u?u?d?d?u +?d?d?d?d?d?l?l?l +?d?d?d?s?l?l +?u?s?u?s +?u?s?u?d?d +?u?l?s?d?d +?u?l?l?u?d?d +?u?d?d?l?l +?d?u?l?l?d +?d?u?d?u?u +?u?s?u?u?u +?u?l?d?l?l +?u?d?d?d?u?u +?u?l?l?l?l?l?d +?u?d?u?u?d?d +?s?l?l?l?l?s +?l?l?l?d?l?l?l +?u?d?d?d?d?s +?d?l?l?d?d?d?d +?d?l?l?l?l?l?d +?l?l?s?s?l +?l?d?d?d?l?d?d +?s?d?l?l?l?l +?l?s?l?l?d +?u?d?d?u?u?u +?l?d?l?d?s +?u?u?u?s?u +?d?d?d?d?l?u +?l?d?s?s +?l?d?d?s?d +?s?l?d?d?d +?s?d?d?d?l +?u?s?d?d?d +?d?s?d?d?l +?u?d?u?u?u?u +?u?l?l?s +?u?u?s?u +?d?l?d?l?d?l?d +?u?l?d?d?u +?d?l?l?l?l?d?d +?l?l?l?u?l +?l?l?l?d?d?d?l +?u?s?u?s?u +?d?d?d?d?d?d?d?s +?d?s?d?d?d?d?d +?u?u?s?d?d?d +?u?u?u?d?u?u +?l?l?d?d?l?l?l +?l?l?l?l?l?l?l?l +?l?u?u?u?d +?u?u?l?l?d +?u?l?l?u?d +?d?u?d?d?u?d +?d?u?l?l?l?l +?l?l?l?l?l?u +?u?u?d?u?u?u +?u?u?d?u?u?d +?u?l?l?u?l?l +?u?d?u?u?d?u +?s?s?s?d?d +?d?d?d?l?u +?d?d?u?l?d?d +?d?d?l?d?u +?d?d?d?s?d?d?d?d +?u?l?u?d?d?d?d +?u?u?u?u?u?s +?d?s?l?l?l +?l?s?l?l?d?d +?s?l?d?d?d?d +?u?l?l?l?l?s +?u?s?l?l?l +?d?d?s?d?s?d +?l?u?u?d?d +?l?d?d?l?d?d?l +?s?d?d?d?d?l +?u?d?l?d?l?d +?d?d?s?l?l?l +?s?l?l?l?d?d +?s?d?s?d?d +?d?s?s?d?d +?d?s?d?d?s?d +?d?s?d?d?s +?u?l?u?l?u?l +?u?d?l?l?d?d +?l?s?s?l +?u?u?s?s +?l?l?s?s +?u?d?l?l?l?l +?u?l?l?l?d?l +?d?d?u?d?d?d?d +?l?u?u?u?d?d +?u?l?l?s?d?d +?u?u?d?d?u?d +?d?d?u?u?u?d +?u?u?u?u?d?d?d?d +?l?d?d?d?d?u +?l?l?l?d?d?l?l +?l?l?l?u?d +?l?s?l?d?d?d?d +?u?u?d?u?d?d +?d?d?d?u?d?d?d +?u?u?u?u?s?d +?u?l?l?s?d +?l?s?l?d?l +?l?l?l?d?d?d?d?d?d +?u?l?u?u?l +?u?d?d?d?u?d +?d?u?d?u?d?d +?l?s?l?s?d?d +?s?d?d?s?d?d +?d?d?d?d?d?d?u?u +?u?d?l?l?d?l +?d?d?d?d?s?u +?l?l?d?d?l?d?d +?l?l?d?l?s +?l?d?l?l?d?d?d +?s?s?s?s?s +?u?d?l?d?d?d +?d?d?u?d?u?d +?l?l?l?l?l?l?l?d +?d?l?d?s?d +?d?d?s?d?l +?d?d?d?s?u +?u?d?u?u?u?d +?l?l?d?s?d?d +?u?s?u?d?d?d +?u?l?l?l?l?l?l +?l?l?l?l?l?d?l +?d?d?d?d?u?d?d +?l?l?l?l?l?l?s +?s?s?s?d?d?d +?d?d?l?l?s +?s?l?l?d?d +?l?l?l?u?d?d +?u?l?l?l?d?d?d?d +?u?u?l?l?l?l +?l?l?d?d?d?d?s +?l?d?l?d?l?d?l +?s?s?l?l?l +?u?d?d?d?d?d?u +?l?l?l?d?u +?l?u?u?l +?u?l?u?u +?l?u?l?l +?l?l?u?l +?l?u?l?u +?d?d?d?u?u?u?u +?u?d?u?d?d?u +?l?l?d?d?s?d +?s?s?s?l +?l?l?l?d?s?d +?l?l?s?l?d?d +?d?d?d?l?l?s +?u?l?l?u?u +?l?l?l?l?d?d?l +?l?d?l?l?s +?l?d?d?l?l?d?d +?u?l?d?d?d?d?d?d +?l?l?l?d?d?d?s +?u?d?u?d?u?u +?u?u?u?d?u?d +?l?s?l?l?l?d +?l?d?d?d?s?d +?l?d?s?d?d?d +?d?d?u?u?u?d?d +?d?d?d?s?s?s +?u?u?u?s?s +?l?l?l?l?d?d?s +?l?s?l?s?d +?l?l?s?l?d +?d?d?d?l?l?l?d +?l?l?l?l?d?l?l +?s?d?s?d?d?d +?d?d?s?d?s +?u?l?l?l?s?d +?l?l?d?l?l?l?l +?l?l?d?l?l?d?d +?u?u?d?d?s +?l?d?s?l?d +?l?d?d?l?s +?d?s?l?l?l?l +?l?d?d?u?d?d +?u?l?d?d?l?l +?u?d?d?l?l?l +?l?d?l?l?u +?l?l?u?u?d +?u?u?u?l?d +?s?d?d?d?d?d?s +?u?l?l?l?u?d +?l?s?d?l?l +?u?s?u?u +?u?l?s?l +?l?u?s?l +?d?d?l?l?l?l?d?d +?l?s?d?d?d?d?d +?d?d?l?u?l +?d?d?l?l?u +?l?l?d?d?u +?u?l?d?u?d +?l?l?l?l?l?s?d +?d?d?d?d?d?s?l +?u?l?l?d?l?l +?l?d?l?l?l?d?d +?l?u?u?u?u?u +?u?u?u?l?l?l +?d?s?d?s?d?s +?d?l?d?d?l?d?d +?d?l?l?l?l?s +?u?l?u?u?u +?d?d?l?d?l?d?d +?l?d?d?d?d?d?s +?u?d?d?d?l?l +?d?d?d?l?d?d?d?d +?d?d?d?d?l?l?d?d +?u?l?d?l?l?l +?l?l?s?l?l?d +?l?d?s?l?l +?d?d?d?d?s?l?l +?l?l?l?l?d?l?d +?d?d?d?l?s?l +?d?d?l?l?l?s +?l?u?l?l?u +?l?d?l?l?l?l?l +?d?d?l?l?d?d?d?d +?d?d?d?d?l?d?d?d +?l?d?d?u?d +?d?d?d?u?d?u +?l?l?d?l?d?d?d +?u?d?l?d?u?d +?d?u?l?d?d +?d?u?d?d?l +?d?d?d?d?d?s?s +?l?l?l?l?l?d?d?d?d +?l?l?d?d?d?d?d?d?d +?u?u?l?l?l?d +?d?d?d?d?l?d?l +?l?u?l?l?d?d +?u?d?d?u?u?d +?l?d?d?d?d?l?d +?l?s?s?l?l +?d?u?l?l?l?d +?d?d?s?d?d?l +?s?l?l?l?d +?d?l?l?l?s +?u?d?d?u?d?u +?s?l?s?l +?l?s?l?l?s +?s?u?u?s +?s?l?l?s +?s?s?l?l +?l?u?u?u?u?d +?l?s?d?d?l +?d?l?d?l?s +?d?s?d?l?l +?s?l?l?d?d?d +?d?l?s?l?d +?l?l?d?d?s?s +?u?u?d?l?l +?l?u?l?u?d +?d?d?d?l?l?d?d?d +?l?l?u?u?d?d +?u?l?l?d?d?l +?d?d?d?d?d?d?l?d +?d?d?d?d?u?l?l +?l?l?l?d?l?d?d +?u?d?d?l?l?d +?l?d?d?d?l?d?d?d +?l?d?l?s?d?d +?u?u?u?d?d?s +?l?l?d?s?l +?l?d?d?l?d?l?d +?l?s?l?s?l?s +?u?l?u?l?l?l +?d?d?u?d?u?u +?u?d?l?l?l?d +?u?u?d?d?l?l +?s?l?l?l?l?d +?l?l?l?l?u?d +?l?d?l?d?d?l?d +?u?l?u?l?u?d +?s?d?d?l?d +?u?d?d?d?s +?d?d?d?l?s +?u?d?d?s?d +?l?d?s?d?d +?d?d?d?u?s +?d?s?d?l?d +?u?l?l?d?l?d +?d?l?d?l?u +?u?l?d?l?d?d +?u?d?d?l?u +?d?d?l?u?u +?l?d?u?l?d +?d?u?d?l?u +?u?d?l?d?u +?d?l?l?u?d +?l?d?u?d?l +?d?d?l?d?d?l?d +?s?d?d?l?l?l +?u?u?u?d?d?d?d?d +?d?d?l?l?l?l?d +?d?d?d?l?l?l?l?l +?u?u?d?u?d?u +?l?u?u?l?d +?l?l?u?l?u +?l?u?l?l?d +?u?u?l?u?u +?l?l?u?l?d +?d?d?u?l?l?d?d +?l?d?d?l?l?l?l +?d?d?l?d?d?d?d?d +?u?d?d?l?d?l +?l?l?l?s?l?d +?d?d?d?d?d?d?d?d?d?d?d +?u?u?d?d?d?s +?d?l?d?l?d?d?d +?l?s?s?d?d +?l?d?l?l?d?l?d +?u?l?d?l?l?d +?u?u?u?d?d?l +?l?l?u?l?d?d +?d?d?d?d?u?s +?d?l?d?s?d?d +?d?d?u?d?d?l +?d?d?l?u?d?d +?u?d?d?d?l?d +?u?s?u?u?d +?s?l?l?d?l +?u?l?s?d?d?d +?u?u?u?u?u?u?d?d +?l?u?u?l?l +?s?d?s?d?s?d +?l?l?d?d?l?l?d +?l?d?l?d?l?d?l?d +?d?d?l?d?d?d?l +?d?d?d?l?d?d?l +?l?l?l?l?u?u +?d?d?d?u?l?u +?u?u?d?d?d?l +?d?d?u?u?u?u?u +?l?l?s?s?s +?l?l?l?s?s?s +?l?l?d?d?d?d?l?l +?d?s?d?d?l?l +?u?d?l?d?l?l +?u?d?d?d?d?d?l +?u?s?u?l?l +?l?u?u?u?l +?u?u?l?l?u +?l?l?u?u?l +?d?d?d?d?d?u?d +?d?d?d?s?l?l?l +?u?u?u?l?d?d +?d?d?s?s?d +?s?d?d?s?d +?d?d?d?d?d?u?l +?d?d?u?u?d?u +?u?l?d?d?l?d +?d?u?l?l?d?d +?l?u?l?u?d?d +?l?d?d?s?l +?l?s?d?l?d +?s?d?l?l?d +?s?l?d?d?l +?l?d?l?s?d +?d?d?s?u?u +?u?d?l?s?d +?s?d?d?l?l +?u?l?l?l?l?l?d?d +?d?d?d?d?d?d?d?l?l +?d?u?d?d?d?u +?d?u?l?d?d?d +?l?s?d?l?l?l +?l?l?d?d?l?l?d?d +?d?l?l?l?u +?u?l?u?u?d +?d?u?l?u?l +?u?l?u?u?d?d +?u?l?d?l?u +?u?l?d?u?l +?u?d?u?l?l +?l?d?l?u?l +?s?d?d?d?d?d?d?d +?l?d?l?d?l?s +?u?l?l?s?l +?u?l?l?s?u +?d?u?u?d?d?u +?d?u?u?u?d?u +?d?u?u?d?u?u +?l?d?l?d?s?d +?l?l?l?s?l?l?l +?d?d?d?d?l?l?s +?u?u?u?l?u +?s?u?u?u?s +?d?d?s?s?s +?s?s?d?d?s +?l?d?l?d?l?l?d +?u?d?d?s?d?d +?d?d?d?d?d?d?s?d +?l?l?s?s?d +?l?d?d?d?d?d?d?d?l +?u?l?u?l?d?d?d +?u?l?d?d?d?l +?l?l?l?u?u?u +?l?l?d?d?d?l?d +?u?l?d?d?u?l +?u?l?l?d?d?s +?u?u?u?u?u?d?d?d +?d?d?d?d?d?d?l?l?l +?u?s?u?s?d?d +?d?l?d?d?d?d?d?d +?l?u?l?d?d?d?d +?l?d?l?l?l?s +?d?u?d?l?d?d +?d?d?d?l?l?u +?u?d?u?d?d?d?d +?d?d?d?d?d?l?s +?u?d?d?d?d?d?d?d?d +?d?u?d?d?d?d?d +?d?u?u?u?u?u?u +?u?l?u?l?l?d +?u?s?u?u?u?u +?l?d?d?s?s +?s?l?d?d?s +?l?d?s?s?d +?d?l?d?s?s +?s?u?d?d?d?d +?d?d?s?l?d?d +?s?l?l?d?d?s +?l?l?l?d?l?l?d +?l?d?d?l?d?d?d?d +?l?l?s?d?l +?u?l?l?d?s +?u?s?l?d?l +?d?d?l?d?d?l?d?d +?u?d?l?d?d?l +?d?u?d?u?u?d +?u?l?l?l?u?l +?u?l?l?s?s +?u?l?l?l?l?d?d?d +?l?l?l?d?d?u +?d?d?d?d?d?l?d?d +?s?s?s?s?d +?l?u?l?u?u +?l?d?l?d?l?l?l +?d?d?d?d?s?d?d?d +?d?d?l?d?d?l?l +?l?l?s?s?d?d +?s?u?u?u?u +?u?l?s?u?l +?u?l?u?l?s +?l?d?l?l?l?l?d +?l?u?l?d?l +?l?u?d?l?l +?l?d?u?u?u +?u?l?u?d?l +?u?l?l?d?u +?l?d?l?u?u +?l?l?d?d?s?d?d +?d?d?l?l?l?l?l?l +?l?l?d?l?l?s +?d?d?d?s?s?d +?d?s?d?d?d?s +?l?l?l?s?d?d?d?d +?d?d?s?d?l?l +?l?d?d?d?l?s +?l?d?l?d?d?s +?d?d?d?u?u?l +?l?d?l?l?d?l?l +?l?l?d?l?l?l?d +?u?d?l?l?d?u +?u?l?d?l?d?l +?u?u?s?d?d?d?d +?l?l?u?l?l?l +?u?l?l?d?d?d?d?d +?u?d?d?d?d?u?u +?d?l?d?l?d?d?l +?d?d?l?d?d?u +?d?d?l?l?d?d?l +?d?l?u?d?d?d +?l?d?l?d?d?d?d?d +?d?d?d?s?d?l +?u?l?d?d?d?s +?d?d?d?s?u?u +?l?l?l?u?l?l +?l?l?l?d?d?l?d +?u?l?l?l?d?s +?d?l?l?l?d?d?d?d +?u?u?d?d?l +?d?l?l?d?u +?l?d?d?u?l +?l?d?d?u?u +?d?u?u?d?u?d +?l?u?d?l?d +?u?d?u?d?l +?d?l?u?l?d +?l?d?l?d?u +?u?d?d?u?l +?l?d?u?u?d +?d?u?d?u?l +?d?u?u?d?l +?d?l?u?u?d +?d?d?u?u?l +?u?d?u?l?d +?d?u?l?u?d +?u?u?d?l?d +?l?d?l?u?d +?d?u?d?l?l +?l?d?u?d?u +?u?d?l?u?d +?s?d?d?d?d?d?d?s +?l?u?l?l?l?l +?u?s?l?l?l?l +?u?u?u?u?s?u +?u?u?u?u?s?s +?s?d?s?d?s +?d?s?d?s?s +?l?l?d?l?l?d?l +?u?l?d?u?l?d +?l?d?l?l?l?d?l +?u?l?l?l?u?u +?s?l?d?l?s +?u?s?u?s?d +?l?d?l?s?s +?d?d?l?l?s?d +?u?d?d?d?d?d?d?u +?u?u?s?u?u?u +?l?s?l?l?d?l +?d?d?d?d?d?d?u?l +?l?l?d?d?u?u +?u?l?l?d?d?u +?u?s?u?d?d?d?d +?d?d?d?d?d?d?s?l +?s?d?u?u?u +?u?u?u?d?s +?u?u?s?u?d +?d?l?s?l?l +?l?l?l?d?l?s +?d?d?d?u?l?l?l +?l?l?d?d?d?u +?d?u?d?d?u?u +?l?l?l?l?l?d?s +?u?l?d?d?l?u +?d?d?d?d?d?d?s?s +?l?u?l?u?l?u +?l?l?l?l?d?d?d?d?d +?l?d?d?d?l?l?d +?d?d?d?l?d?l?d +?d?d?u?u?d?d?d +?d?d?d?l?l?l?s +?l?d?l?l?d?d?l +?s?d?u?u?u?u +?l?l?d?l?d?l?d +?d?l?d?l?l?d?d +?u?u?d?l?l?l +?l?l?s?l?s +?l?l?d?d?l?d?l +?u?d?s?d?d?d +?d?d?s?d?l?d +?s?d?d?d?d?u +?d?d?l?d?d?s +?s?d?l?d?d?d +?d?d?l?s?d?d +?l?d?d?l?l?l?d +?l?d?l?l?d?s +?u?l?s?l?l +?d?d?d?s?d?s +?s?d?d?d?s?d +?d?s?s?d?d?d +?l?u?d?d?d?d?d +?s?s?l?l?l?l +?l?d?u?d?l?d +?u?u?l?d?d?d?d +?u?d?d?u?s +?l?d?d?s?u +?s?d?u?u?d +?d?l?l?d?s +?l?u?s?d?d +?s?l?d?l?d +?d?d?u?s?u +?d?d?u?l?s +?l?d?l?s?l?d +?d?s?l?d?l +?u?d?u?d?s +?l?s?d?d?d?l +?u?d?l?d?s +?d?d?l?s?l +?d?l?d?d?d?l?d +?d?d?d?u?u?d?d +?d?d?d?u?l?d +?d?d?d?l?d?d?d?l +?d?l?d?u?d?d +?d?l?d?d?d?d?l +?d?d?l?d?u?d +?d?d?d?d?d?s?d?d +?l?l?u?d?d?d?d +?d?d?u?u?l?l +?u?d?u?u?l +?l?d?u?l?l +?u?u?l?d?u +?u?u?l?d?l +?l?l?u?d?l +?d?u?l?l?u +?u?u?u?d?l +?u?u?d?u?l +?u?l?d?u?u +?u?d?l?u?d?l +?u?u?l?u?d +?l?u?d?u?u +?l?l?d?u?l +?s?s?s?s?s?s +?d?d?d?d?l?s?l +?l?l?d?d?l?s +?l?l?l?l?l?l?d?d?d +?d?d?s?d?d?d?d?d +?l?s?d?s?d?d +?u?u?u?u?s?d?d +?d?d?s?d?d?s?d +?l?l?u?u?u?u +?u?d?d?d?d?d?d?l +?d?d?d?l?l?l?d?d +?d?d?l?l?l?u +?l?u?u?l?d?d +?l?u?u?d?d?d?d +?u?l?l?u?l?d +?s?l?l?d?d?d?d +?l?s?s?s?l +?s?s?s?l?l +?d?d?u?l?l?l?l +?l?l?l?s?d?l +?l?l?d?d?s?d?l +?l?d?l?d?d?d?l +?d?d?d?d?d?d?d?d?u +?s?l?l?d?s +?s?u?u?u?u?s +?l?l?l?l?u?l +?u?u?u?u?l?l +?l?l?l?l?d?u +?l?d?d?d?s?l +?s?d?d?d?l?l +?d?l?l?s?d?d +?l?d?d?l?d?s +?u?l?d?d?d?u +?l?d?l?u?d?d +?d?d?d?l?u?l +?d?d?d?l?u?u +?l?l?l?s?u +?d?d?u?l?u?l +?u?d?d?u?l?l +?l?l?s?s?l?l +?l?l?l?d?l?d?l +?u?u?u?s?u?u +?u?u?d?d?d?d?u +?l?d?d?s?d?d?d +?l?l?l?s?s?d +?u?u?l?l?d?d?d +?d?l?l?l?l?d?l +?s?s?d?d?s?s +?u?l?u?l?u?d?d +?u?u?d?d?d?u?u +?l?d?d?l?l?d?l +?u?u?u?u?u?l +?d?u?d?u?u?u +?l?s?l?s?l?d +?d?d?d?l?d?l?l +?d?d?d?d?s?s?s +?u?u?s?s?u +?s?l?s?l?l +?d?l?l?d?l?l?d +?l?d?d?d?l?d?l +?u?l?l?l?s?d?d +?l?s?l?l?l?d?d +?u?l?s?d?d?d?d +?d?s?d?l?l?l +?l?s?l?d?l?d +?u?u?u?l?l?d +?l?d?d?l?d?l?l +?u?s?l?d?d?d +?l?d?s?l?d?d +?s?s?d?d?d?d?d +?l?l?d?l?d?l?l +?d?d?d?d?d?d?d?d?s +?l?d?l?d?d?l?d?d +?d?s?d?s?d?d?d?d +?u?d?l?d?d?d?d +?u?u?u?s?d?d?d +?s?d?l?d?s +?d?s?l?d?s +?s?d?d?s?l +?s?l?s?d?d +?l?s?d?s?d +?d?d?s?s?u +?l?s?d?d?d?s +?d?d?s?l?s +?d?d?d?d?u?l?u +?l?l?s?l?l?l?l +?l?l?s?l?l?s +?u?u?u?u?d?s +?d?s?d?l?d?d +?d?l?d?d?d?s +?d?d?d?l?s?d +?d?l?s?d?d?d +?d?d?s?d?d?u +?d?d?u?s?d?d +?d?d?d?s?l?d +?d?s?d?s?d?s?d +?d?d?l?u?l?d?d +?d?d?l?d?l?d?l +?l?l?l?d?d?l?l?l +?u?l?l?l?d?u +?l?u?l?l?l?d +?d?l?u?l?s +?d?l?l?s?l +?u?s?d?u?u +?u?u?d?u?s +?l?d?l?s?l +?l?d?d?d?d?l?d?d +?l?l?l?l?l?s?l +?d?u?l?u?d?d +?l?l?d?u?d?d +?d?u?d?l?d?l +?d?d?u?l?d?l +?u?d?u?l?d?d +?u?d?d?d?l?u +?u?d?d?l?d?u +?l?d?u?l?d?d +?l?l?l?l?l?l?l?d?d +?d?u?u?d?d?d?d +?u?d?d?u?d?d?d +?u?u?l?l?l?d?d +?l?l?u?l?l?d +?l?u?u?l?u +?u?u?l?u?l +?d?d?s?l?l?l?l +?l?s?u?u?u +?l?l?s?d?l?l +?s?u?l?l?l +?s?l?s?l?s +?d?u?l?u?l?d +?d?l?l?l?s?d +?u?l?l?l?u?d?d +?d?d?d?d?u?u?d +?d?s?d?d?d?d?d?d +?d?l?d?l?l?l?l +?d?d?l?l?l?d?d?d +?l?l?s?l?l?d?d +?l?l?l?d?d?d?d?l +?l?d?d?s?l?d?d +?s?l?d?d?d?s +?d?l?d?l?d?l?l +?l?s?d?d?d?d?d?d +?l?d?d?d?d?d?d?s +?u?l?l?l?s?s +?d?d?d?d?u?u?u?u +?l?s?d?l?d?d +?s?d?l?l?d?d +?s?l?l?s?l +?s?u?l?l?s +?d?l?d?d?l?l?d +?l?l?s?d?d?s +?d?d?d?d?d?l?l?d +?l?l?l?u?l?d +?u?d?d?d?u?d?d +?u?s?u?u?d?d +?d?l?d?d?l?d?l +?l?l?l?l?d?s?d +?u?u?l?u?d?d +?l?d?s?l?l?l +?d?d?d?d?s?d?d?d?d +?u?s?d?d?d?d?d +?d?l?l?l?l?u +?d?l?l?l?d?l?l +?l?l?l?u?u?d +?l?l?l?l?l?s?d?d +?u?s?u?s?u?s +?d?l?l?d?l?d?d +?d?d?d?l?u?d +?d?u?d?d?l?d +?l?l?l?s?s?l +?l?s?l?d?d?l +?d?d?s?u?u?u +?u?s?l?l?d?d +?d?l?l?l?d?s +?u?u?s?u?d?d +?s?l?l?l?l?d?d +?l?d?l?d?d?l?l +?d?l?l?d?d?l?d +?d?d?s?d?d?l?l +?l?s?l?l?s?l +?l?l?u?u?l?l +?d?u?u?u?d?d?d +?u?u?d?l?l?d +?l?d?l?l?d?u +?d?u?d?l?d?u +?u?d?d?u?l?d +?u?d?l?d?l?u +?u?l?l?d?u?d +?d?d?d?l?l?d?l +?u?d?u?d?u?d?d +?u?d?l?d?d?u +?d?l?d?u?d?l +?l?u?d?l?d?d +?l?l?l?d?s?d?d +?s?l?s?d?d?d +?l?d?d?d?s?s +?d?l?l?l?l?l?l?l +?l?l?l?d?s?s +?l?d?d?d?d?d?d?d?d?d +?l?s?l?d?l?l +?s?d?d?s?s +?d?d?d?d?l?l?l?d +?s?u?u?u?d?d +?l?d?d?l?l?s +?l?l?d?l?d?d?l +?u?u?d?d?d?d?s +?l?d?l?l?s?l +?d?s?s?l?l +?l?s?s?l?d +?d?s?l?s?l +?l?l?s?d?s +?l?s?d?s?l +?s?l?s?l?d +?d?l?l?s?s +?l?u?d?s?s +?l?s?l?d?s +?d?d?l?l?s?s +?l?l?d?s?s +?u?s?l?s?d +?s?u?u?u?u?u +?l?l?l?l?s?l?l +?l?d?d?s?d?l +?l?d?d?s?l?d +?l?d?s?d?d?l +?u?l?d?d?d?d?s +?d?d?d?u?s?u +?d?s?l?l?d?d +?d?d?d?u?u?s +?u?d?d?d?d?d?s +?u?l?l?u?s +?d?d?d?d?d?d?l?s +?s?s?u?u?u +?u?l?l?u?d?d?d +?s?s?l?s?s +?l?l?d?s?l?l +?u?u?s?u?u?d +?d?d?s?s?l?l +?l?s?l?l?l?l?l +?u?s?u?l?l?l +?u?u?l?l?u?u +?d?s?s?s?s +?u?d?l?l?l?u +?u?u?u?u?l?d +?l?l?d?l?s?l +?u?d?d?d?u?u?u +?d?d?l?l?d?l?d +?l?l?l?d?d?s?d +?l?s?l?s?s +?l?l?l?s?d?s +?d?l?d?l?l?d?l +?d?l?d?l?d?l?d?l +?l?d?s?d?d?d?d +?s?d?d?d?d?d?l +?d?d?u?l?u?d?d +?d?l?l?d?d?d?l +?s?l?l?s?d?d +?u?u?u?d?l?l +?l?s?l?l?l?s +?l?s?s?l?l?l +?u?l?u?u?l?u +?d?l?l?d?l?l?l +?u?u?u?d?s?d +?l?d?l?l?s?d +?l?d?l?d?s?l +?s?l?l?l?d?d?d +?u?l?d?l?u?d +?d?d?l?l?u?u +?u?d?d?l?l?u +?l?d?l?u?d?l +?u?d?l?u?l?d +?u?s?l?l?l?d +?d?s?l?d?d?d +?d?u?d?s?d?d +?u?d?d?d?s?d +?d?d?d?l?d?s +?s?d?d?l?d?d +?d?u?d?d?d?s +?d?l?l?l?d?l?d +?l?d?s?l?d?s +?d?d?d?d?l?d?d?d?d +?s?l?l?l?d?s +?l?d?l?l?d?d?d?d +?d?d?u?u?d?l +?u?d?l?u?d?d +?u?u?d?d?l?d +?u?u?d?l?d?d +?d?l?l?d?d?u +?d?l?u?l?d?d +?u?d?u?d?d?l +?d?d?u?l?l?d +?u?d?d?d?u?l +?u?l?d?d?u?d +?d?u?l?d?l?d +?d?d?l?d?u?l +?u?l?u?u?l?d +?u?l?l?l?l?l?s +?d?u?l?l?l?l?l +?l?l?l?d?s?l +?s?l?l?l?l?l?l +?s?d?l?l?l?d +?l?l?d?l?d?s +?d?l?l?d?d?s +?l?s?d?d?l?l +?d?l?d?l?d?s +?l?d?d?l?s?d +?s?l?l?l?l?l?s +?d?d?l?d?l?l?l +?d?d?l?l?d?l?l +?d?l?d?d?l?l?l +?s?s?d?d?d?s +?s?l?d?d?d?d?d +?d?d?d?d?d?u?u?u +?d?l?d?l?l?l?d +?s?d?l?l?l?l?l +?l?l?l?s?l?d?d +?l?l?d?d?d?d?d?l +?l?l?l?d?u?u +?l?d?l?d?l?u +?l?u?l?d?u +?l?u?d?l?u +?u?l?u?d?u?d +?d?l?u?l?u +?u?d?l?l?u +?l?l?d?l?u +?l?d?l?l?l?u +?l?d?u?u?l +?d?d?u?l?l?u +?l?u?u?d?l +?l?u?u?d?u +?u?l?d?d?u?u +?d?u?l?l?d?l +?l?d?u?u?l?d +?u?d?l?l?u?d +?u?u?d?l?u +?d?l?l?u?u +?d?l?l?u?l +?d?l?u?u?u +?l?u?d?u?l +?u?d?l?u?l +?l?d?l?d?l?d?d?d +?s?s?s?d?d?d?d +?u?u?u?d?d?d?u +?l?l?l?d?d?d?d?s +?l?l?l?l?s?d?d?d +?l?s?s?s?d +?l?u?u?u?u?d?d +?l?l?l?s?l?s +?l?d?l?s?l?l +?l?s?l?s?d?d?d +?s?d?d?d?s?l +?s?s?l?d?d?d +?d?d?d?d?d?d?d?d?d?l +?u?d?d?d?d?l?l +?l?u?l?l?u?l +?l?l?u?u?u?d +?u?s?u?u?s +?u?s?s?u?u +?u?d?d?d?d?u?d +?d?d?d?d?d?l?u +?l?l?l?l?l?s?s +?d?l?l?l?s?l +?u?s?u?u?u?d +?u?d?d?u?d?d?u +?u?l?l?l?s?l +?u?u?d?d?s?s +?d?u?u?u?u?u?d +?l?d?l?u?l?l +?u?l?l?u?u?d +?u?u?u?d?u?u?u +?l?l?l?l?u?d?d +?u?d?d?l?l?d?d +?d?d?d?d?l?l?u +?d?d?l?d?l?l?d +?d?u?u?u?u?d?d +?d?l?s?l?l?l +?l?u?u?u?s +?u?s?l?l?u +?l?l?l?u?s +?d?l?l?s?l?l +?l?d?d?u?u?u +?u?l?u?d?d?l +?u?l?u?d?d?u +?l?d?d?u?l?l +?l?l?d?d?u?l +?u?u?l?d?l?d +?u?l?u?d?l?d +?d?d?l?u?l?l +?d?u?l?l?d?u +?u?u?u?u?u?u?u?d +?l?l?d?u?l?l +?u?l?l?d?l?u +?u?l?l?u?d?l +?d?l?l?u?l?l +?d?l?l?l?l?l?l?d +?u?l?l?s?d?d?d +?u?l?l?l?s?u +?s?s?l?l?d?d +?l?l?s?d?d?l +?d?d?l?l?s?l +?l?s?d?l?l?d +?l?l?s?d?l?d +?u?u?u?u?u?u?u?u +?d?l?l?d?l?d?l +?d?d?d?d?u?u?l +?l?d?d?l?d?l?d?d +?l?d?d?d?d?s?d +?d?d?d?d?d?s?u +?u?l?s?l?l?l +?s?s?s?s?d?d +?u?l?d?l?l?u +?l?s?l?s?l?l +?d?l?l?d?d?l?l +?l?l?l?d?d?s?s +?d?s?d?s?d?d?l +?s?l?d?l?d?d +?d?l?l?d?s?d +?d?l?d?d?l?s +?l?l?s?l?d?l +?s?l?l?l?d?l +?u?u?u?u?u?u?s +?u?d?d?d?d?l?d +?d?d?d?d?u?d?u +?u?l?l?d?u?l +?l?u?l?l?d?l +?l?d?l?d?s?s +?l?s?s?d?d?d +?d?l?l?d?d?d?d?d +?l?l?l?l?s?u +?u?d?u?d?l?l +?l?u?u?d?d?l +?l?l?d?u?u?d +?u?d?l?d?u?l +?u?u?u?d?l?d +?l?u?d?d?l?u +?l?u?d?l?l?d +?d?d?d?s?d?d?l +?u?u?d?d?u?u?u +?u?s?u?l?d +?u?l?s?l?d +?l?u?u?s?d +?u?s?u?d?u +?d?u?u?l?s +?l?d?d?s?l?l +?s?l?d?l?l +?u?d?u?u?s +?u?d?l?l?s +?l?u?l?d?s +?l?u?d?l?s +?d?u?s?u?u +?s?d?u?l?l +?s?l?d?l?d?l +?s?u?d?l?l +?u?s?l?l?d +?u?d?s?u?u +?u?u?s?d?u +?l?l?d?u?s +?s?u?d?u?l +?u?u?l?s?d +?l?u?l?s?d?d +?l?d?s?u?u +?l?d?s?l?d?l +?l?d?l?s?u +?l?l?d?d?s?l +?u?l?d?l?s +?u?l?u?l?l?u +?l?d?d?l?u?d +?d?l?u?d?l?d +?d?u?l?d?d?u +?l?l?d?d?u?d +?l?d?d?d?u?l +?l?d?d?d?u?u +?d?l?u?u?d?d +?d?l?l?l?d?d?l +?u?d?u?u?d?d?d +?l?u?d?d?l?d +?u?l?d?u?d?d +?d?d?l?u?l?d +?d?u?d?l?l?d +?l?d?u?d?d?l +?d?l?l?u?d?d +?d?d?u?d?u?l +?u?d?u?d?l?d +?u?l?l?l?l?l?l?d +?l?l?u?u?l?d +?u?l?u?u?u?d +?u?l?l?l?l?s?d +?u?l?l?s?l?l +?l?l?d?l?d?d?d?d +?l?l?d?s?d?d?d +?l?l?d?d?d?s?d +?d?d?l?l?d?d?s +?u?u?s?s?s +?s?l?l?s?s +?l?s?l?l?d?d?d +?s?l?s?l?d?d +?u?d?d?l?d?d?d +?l?s?s?s?s +?u?d?l?l?l?d?d +?l?l?l?d?l?l?l?l +?s?d?d?d?d?l?l +?d?d?l?l?d?d?l?l +?l?l?u?d?l?l +?d?d?l?l?l?d?l +?u?d?d?u?u?d?d +?d?u?d?u?d?u?d +?u?u?d?d?d?d?l +?u?l?u?l?d?d?d?d +?l?d?l?d?l?d?s +?u?s?l?s?u +?u?l?s?s?l +?l?s?u?s?l +?u?s?l?l?s +?u?s?l?s?l +?d?d?l?l?l?l?s +?s?l?d?d?l?l +?u?l?u?s?d?d +?d?l?d?l?s?l +?d?s?l?l?l?d +?d?l?l?d?l?s +?u?l?l?d?s?d +?l?l?d?d?d?d?u +?l?d?d?l?u?u +?u?u?l?d?d?l +?u?d?u?l?l?d +?l?u?d?d?l?l +?l?d?l?u?l?d +?l?u?l?d?d?l +?l?u?l?d?l?d +?l?d?d?l?d?d?l?d +?l?l?l?d?d?d?l?l +?s?d?u?l?l?l +?s?l?d?l?l?l +?d?l?d?l?d?d?d?d +?u?u?u?d?d?d?s +?d?s?d?d?d?d?l +?s?l?l?l?s?d +?l?l?l?d?u?l +?u?d?u?l?l?l +?l?u?d?l?l?l +?l?l?l?d?l?u +?d?d?d?d?u?d?d?d +?l?s?s?l?d?d +?s?s?d?d?l?l +?l?d?d?l?s?s +?u?u?u?s?s?s +?l?l?l?u?d?d?d +?s?u?l?l?l?s +?u?u?u?l?l?d?d +?u?d?l?l?d?d?d +?d?l?d?d?d?u +?l?d?d?d?u?d +?d?l?d?d?u?d +?l?d?u?d?d?d +?l?d?d?u?d?d?d +?d?d?u?d?l?d +?d?l?l?l?l?l?d?d +?l?u?u?u?d?d?d +?d?d?l?l?l?d?d?d?d +?u?u?u?d?d?d?d?d?d +?s?d?d?d?l?l?l +?u?l?d?u?l?l +?l?u?l?d?l?l +?l?l?l?u?d?l +?u?l?u?u?l?l +?u?l?l?u?l?u +?u?d?l?d?l?d?d +?u?u?d?d?u?d?d +?d?d?d?d?l?l?l?l?l +?l?s?d?d?s?d +?d?d?d?d?d?d?l?u +?u?l?s?u?l?l +?l?d?d?d?s?d?d +?d?s?u?u?u?u +?d?d?d?d?u?l?l?l +?d?s?d?d?s?s +?s?d?s?d?d?s +?l?u?d?d?d?d?d?d +?d?d?u?d?d?d?d?d +?l?d?d?d?d?d?l?l +?d?d?u?u?u?s +?u?l?l?l?d?d?s +?u?l?l?l?l?u?d +?u?l?l?u?l?l?d +?l?l?l?l?d?l?l?l +?s?s?s?l?l?l +?l?d?u?s?s +?s?l?s?u?d +?s?l?l?s?d +?l?s?s?d?l +?s?s?d?l?l +?u?d?s?s?u +?u?s?s?u?d +?l?d?s?l?s +?u?l?d?d?s?s +?u?l?d?s?s +?u?u?s?s?d +?s?s?l?d?l +?s?d?s?l?l +?s?u?d?u?s +?s?u?u?s?d +?s?s?l?l?d +?d?s?l?l?s +?s?s?u?d?u +?u?d?l?s?s +?u?u?d?u?u?u?u +?u?l?l?l?l?l?u +?l?l?d?l?l?u +?l?d?u?l?l?l +?s?d?d?d?u?u +?d?s?d?l?l?d +?u?d?l?s?d?d +?d?u?l?s?d?d +?d?d?s?l?l?d +?l?u?s?d?d?d +?u?l?d?s?d?d +?d?l?s?d?l?d +?u?d?d?u?s?d +?d?l?s?l?d?d +?d?d?l?d?l?s +?u?u?d?d?s?d +?d?d?u?l?d?d?d +?l?d?d?d?d?d?u +?d?d?u?d?u?d?d +?u?u?l?l?l?u +?u?d?l?l?l?s +?l?u?s?l?l +?l?u?s?l?u +?s?l?l?l?u +?s?l?l?d?l?l +?u?u?u?s?l +?u?l?s?u?u +?l?u?l?l?s +?l?l?s?l?u +?l?u?u?s?u +?u?u?u?u?u?s?d +?l?d?d?d?d?l?l?l +?d?l?l?d?u?u +?l?d?d?l?u?l +?l?l?l?d?u?d +?u?l?d?l?d?u +?d?d?l?l?u?l +?d?l?l?u?u?d +?d?l?u?u?d?l +?d?u?l?l?u?d +?l?l?d?d?l?u +?u?l?d?u?d?l +?d?u?d?l?l?l +?u?d?u?u?l?d +?u?d?d?l?u?l +?u?d?u?d?u?l +?l?d?u?l?d?l +?u?l?d?u?u?d +?d?l?d?d?d?l?l +?d?d?d?u?d?d?d?d +?u?d?u?d?u?d?u +?d?d?d?s?s?d?d +?d?d?s?d?d?d?l +?d?d?d?d?s?d?l +?l?d?d?d?d?s?s +?u?u?u?u?u?d?u +?u?l?d?l?u?l +?u?d?l?u?l?l +?l?u?l?u?l?d +?d?l?u?l?l?l +?l?d?u?u?u?u +?l?d?l?l?u?l +?l?u?l?l?l?u +?u?u?d?u?l?l +?d?u?l?l?l?u +?u?u?u?s?u?d +?d?u?u?u?u?s +?l?d?d?d?d?l?s +?u?d?d?l?d?d?u +?u?l?d?d?d?d?l +?l?l?d?d?d?d?d?d?d?d +?d?l?l?l?l?d?d?d +?u?l?u?l?l?d?d +?l?d?s?d?s?d?d +?u?s?s?s?u +?u?s?u?s?s +?u?l?u?u?u?u +?s?u?l?l?l?l +?l?l?s?l?d?d?d +?l?s?d?d?s?l +?l?s?d?l?s?d +?u?u?s?s?d?d +?d?u?l?l?l?l?d +?d?d?l?d?d?d?d?l +?d?d?d?d?l?d?d?l +?s?d?d?u?u?u +?u?l?u?d?d?s +?u?l?d?d?l?s +?u?d?u?d?u?s +?l?d?s?l?l?d +?d?l?d?l?l?s +?d?d?u?l?l?s +?u?d?u?u?u?d?d +?d?d?d?d?u?u?d?d +?d?d?d?u?u?u?d +?u?l?d?d?l?d?d +?d?d?d?s?d?s?d +?u?u?l?l?d?d?d?d +?u?d?l?l?l?l?l +?u?u?u?d?d?u?u +?u?u?d?u?u?d?d +?l?l?u?u?d?d?d +?l?u?l?l?u?d +?d?u?u?l?l?l +?d?d?d?s?d?u +?s?d?d?d?l?d +?d?u?d?d?s?d +?d?l?d?d?s?d +?s?d?d?u?d?d +?d?s?d?d?d?l +?d?l?s?d?d?d?d +?d?s?d?d?l?d +?d?d?u?d?s?d +?l?d?d?l?d?d?s +?l?l?l?l?d?d?l?l +?d?d?u?d?l?l +?d?d?u?u?l?d +?l?l?l?d?d?d?u +?d?d?l?u?d?l +?l?d?d?u?l?d +?d?d?l?l?d?u +?d?l?d?u?u?d +?d?u?u?d?l?d +?d?d?l?l?u?d +?l?u?d?d?u?d +?d?d?u?l?d?u +?d?l?d?u?d?u +?d?l?d?d?l?u +?d?l?d?l?d?u +?d?l?d?d?u?l +?d?l?u?d?u?d +?d?l?l?d?u?d +?l?u?d?d?d?l +?l?d?d?l?d?u +?u?l?l?d?d?d?s +?d?l?d?l?u?d +?u?d?d?l?u?d +?d?d?u?d?l?u +?d?u?d?d?l?l +?s?d?d?l?l?l?l +?l?l?u?l?l?u +?l?l?s?d?d?d?d?d +?d?d?d?s?d?l?l +?l?s?l?s?l?d?d +?u?u?u?d?d?d?l +?s?d?d?d?s?s +?d?d?d?d?s?s?d +?d?s?d?s?d?d?d +?u?l?l?u?u?u +?u?u?d?d?d?d?d?d?d +?l?l?s?l?s?d +?l?d?l?l?s?s +?d?l?l?l?s?s +?l?s?l?l?s?d +?u?s?u?s?u?d +?l?l?d?u?d?l +?d?l?l?l?u?d +?l?l?d?u?l?d +?d?u?u?u?l?l +?u?u?d?d?u?l +?d?d?u?l?u?u +?d?l?l?d?l?u +?d?d?l?u?u?u +?l?l?u?d?d?l +?d?l?u?l?l?d +?d?l?d?l?l?u +?u?l?d?u?l?u +?l?d?u?u?d?u +?u?u?u?u?d?l +?u?l?u?l?d?l +?l?l?d?l?u?d +?l?l?u?l?d?l +?l?u?d?l?d?u +?l?u?d?l?d?l +?l?u?l?d?d?u +?d?l?d?l?u?l +?u?u?u?u?d?u?u +?u?d?d?d?l?l?l +?s?u?u?d?d?s +?l?s?l?d?d?s +?l?l?l?l?d?d?d?l +?l?l?l?l?l?d?d?l +?u?l?l?d?l?l?l +?u?l?l?l?l?d?l +?u?l?l?l?d?l?l +?d?d?d?d?l?u?l +?u?l?d?d?d?d?u +?d?d?d?d?d?d?u?d +?l?l?d?d?d?s?s +?s?s?l?d?s +?l?d?s?s?s +?s?l?s?s?d +?s?l?d?s?s +?s?d?s?l?s +?s?s?s?u?d +?l?u?u?u?u?l +?u?u?u?u?d?d?s +?l?l?l?l?d?d?d?s +?s?s?d?d?d?l +?d?d?d?d?s?s?l +?d?d?d?s?l?s +?d?d?d?l?s?s +?u?d?d?d?s?s +?d?d?d?s?s?l +?l?s?d?d?s?d?d +?u?u?d?d?d?l?l +?l?l?l?d?l?l?l?d +?s?d?l?l?l?s +?l?l?s?l?s?l +?u?s?s?l?l +?u?s?u?s?l +?l?l?l?u?u?l +?d?l?d?d?d?l?d?d +?s?d?l?l?d?l +?u?l?s?l?d?d +?s?u?l?l?d?d +?l?l?d?l?s?d +?l?d?l?s?d?l +?d?d?d?d?s?u?u +?l?l?l?s?s?d?d +?s?s?d?d?d?d?d?d +?l?s?l?l?l?l?d +?s?l?l?s?l?l +?d?d?d?d?d?l?d?l +?l?d?d?d?d?d?l?d +?u?l?l?l?u?s +?d?d?d?d?d?l?l?l?l +?d?d?s?s?s?s +?d?l?u?u?u?u +?u?u?u?l?d?l +?u?u?l?l?u?d +?u?l?d?u?u?l +?d?d?d?u?u?d?d?d +?l?d?d?l?d?d?l?d?d +?u?l?l?u?l?l?l +?u?s?l?l?d?l +?d?u?l?l?l?s +?d?d?d?d?u?u?s +?s?s?s?l?s +?l?l?d?d?l?d?d?d +?l?u?u?l?l?l +?u?l?l?u?u?l +?u?l?u?l?u?u +?l?d?d?l?l?d?d?d +?l?l?s?s?s?s +?u?u?l?l?l?l?d +?u?l?l?l?u?l?l +?l?l?l?l?l?l?l?l?l +?u?l?l?u?l?d?d +?u?l?d?d?l?l?l +?s?l?d?d?l?s +?l?l?l?s?d?d?s +?d?d?d?d?l?d?l?d +?u?l?u?l?u?s +?u?l?d?l?l?d?d +?l?l?l?l?l?d?d?s +?d?d?d?s?d?l?d +?d?d?d?l?d?d?s +?l?l?l?l?l?l?d?l +?u?u?u?d?u?s +?u?l?u?l?s?d +?l?u?u?l?l?d +?u?u?l?l?d?l +?d?l?l?u?u?l +?l?l?d?u?u?u +?u?l?u?l?d?u +?s?l?l?l?d?d?s +?s?d?d?d?s?d?d +?u?d?d?d?u?d?d?d +?u?l?d?l?l?l?l +?l?l?d?d?d?l?l?l +?u?d?l?d?u?d?d +?u?u?u?l?u?u +?l?d?l?l?l?d?d?d +?s?s?l?l?s?s +?s?d?u?u?d?d +?d?d?d?s?u?l +?d?d?l?l?d?s +?d?d?s?l?d?l +?d?d?d?u?l?s +?u?l?d?d?s?d +?u?d?d?d?u?s +?d?l?d?s?l?d +?l?u?d?d?d?s +?l?d?s?d?l?d +?s?l?d?d?d?l +?s?d?l?d?l?d +?d?d?d?s?l?u +?d?d?d?d?s?l?l?l +?u?d?d?d?l?d?d +?u?u?u?l?l?l?d +?s?l?s?d?d?d?d +?d?l?d?l?d?l?s +?l?l?l?l?l?l?s?d +?l?l?d?u?d?u +?u?u?l?d?d?u +?l?u?d?l?u?d +?d?l?d?u?u?u +?d?u?u?u?d?l +?l?d?u?d?l?u +?l?d?u?d?l?l +?l?u?d?d?u?l +?d?l?u?l?d?l +?u?l?d?d?d?l?l +?l?d?d?l?l?u +?d?u?l?d?l?l +?d?u?d?l?l?u +?l?d?l?d?u?u +?l?d?l?d?u?l +?d?l?l?u?d?l +?l?d?u?l?l?d +?l?d?u?d?u?l +?l?d?l?u?u?d +?u?d?u?l?d?l +?d?l?l?l?d?u +?l?l?l?l?l?l?u +?l?l?u?u?u?l +?u?l?l?d?d?l?l +?u?l?l?l?d?d?l +?d?s?l?l?l?l?l +?u?l?u?l?u?l?u +?l?l?d?s?d?l +?u?d?l?d?l?s +?u?u?l?s?d?d +?s?l?d?l?l?d +?d?l?l?l?l?l?s +?d?d?l?s?l?l +?u?d?d?l?s?l +?l?d?s?d?l?l +?l?l?d?d?l?l?l?l +?u?u?u?u?d?u?d +?s?l?l?l?l?l?d +?u?d?u?d?d?u?d +?d?d?d?d?u?s?u +?u?u?u?u?d?d?u +?s?s?s?d?s +?s?s?d?s?s +?s?d?s?s?s +?d?l?d?d?l?d?d?l +?l?l?u?d?u?l +?d?l?l?l?u?l +?u?u?l?d?u?u +?l?u?u?d?l?l +?l?u?d?u?u?u +?l?l?d?l?l?d?d?d +?l?l?d?l?s?s +?l?d?l?s?l?s +?s?s?d?s?d?d +?d?s?s?s?d?d +?d?d?s?s?d?s +?d?d?d?s?d?d?s +?d?d?s?s?d?d?d +?s?l?s?s?l +?l?s?s?l?s +?u?s?l?s?s +?u?l?l?d?d?d?d?d?d +?u?d?u?u?u?u?u +?u?l?l?l?l?l?l?l +?l?u?l?l?l?d?d +?l?l?l?l?l?d?l?d +?d?d?d?d?d?u?s +?d?d?l?s?l?s +?d?l?s?d?l?s +?s?l?d?l?d?s +?d?l?l?d?s?s +?u?l?s?s?d?d +?d?d?u?u?d?d?d?d +?l?l?l?l?l?u?d +?u?l?l?d?d?d?l +?l?l?l?l?l?d?l?l +?u?u?u?u?l?u +?l?d?d?d?l?l?d?d +?l?d?l?d?s?d?d +?s?l?s?l?l?l +?d?d?d?d?d?d?d?d?l?l +?u?l?l?l?l?d?d?d?d +?u?u?d?u?d?d?d +?u?d?d?l?d?d?l +?d?d?d?l?l?l?d?d?d +?u?s?u?u?d?u +?u?l?l?s?l?d +?u?u?u?l?d?d?d +?u?l?u?l?u?l?d +?l?l?l?u?l?u +?d?d?d?s?u?u?u +?u?d?d?l?l?l?l +?u?d?d?d?d?d?d?d?u +?l?l?l?d?d?l?d?d +?l?l?l?l?l?l?l?l?d +?u?d?u?u?d?u?d +?l?l?l?l?u?s +?d?d?s?l?l?d?d +?l?d?l?s?d?d?d +?u?s?l?d?d?d?d +?d?d?l?l?s?d?d +?u?u?l?l?d?u +?d?u?u?u?u?l +?d?l?l?l?u?u +?d?u?l?u?l?l +?u?d?l?l?u?l +?u?l?u?d?l?l +?u?l?u?d?u?l +?d?l?l?u?l?u +?l?u?u?d?l?u +?l?l?d?l?u?l +?u?u?u?d?l?u +?l?u?l?d?l?u +?l?l?d?d?d?l?d?d +?l?d?d?d?d?d?d?u +?u?s?d?d?d?d?d?d +?u?u?l?l?l?l?l +?u?l?u?d?d?d?d?d +?u?u?u?l?l?u +?u?d?l?d?l?d?l +?l?l?u?l?l?d?d +?l?l?l?l?l?l?l?s +?u?d?d?u?d?u?d +?d?d?u?d?d?l?d +?d?u?l?d?d?d?d +?d?d?l?d?l?d?d?d +?d?d?u?d?d?d?u +?l?d?d?l?l?l?d?d +?d?d?d?d?d?d?d?u?u +?u?d?d?d?d?d?d?s +?s?s?l?l?l?d +?l?s?l?d?l?s +?u?s?d?l?l?l +?u?u?u?s?u?u?u +?l?l?l?l?d?d?d?d?d?d +?l?d?l?l?d?l?d?d +?u?d?l?l?d?l?d +?d?d?l?s?d?d?l +?d?d?l?s?l?d?d +?d?d?d?u?u?u?u?u +?u?u?u?u?u?d?d?d?d +?s?l?l?l?s?d?d +?d?d?d?l?d?l?d?d +?d?d?l?d?d?d?l?d +?s?u?d?d?d?s +?l?d?s?d?s?d +?l?d?s?d?d?s +?d?l?d?d?s?s +?u?d?s?d?s?d +?d?s?l?s?d?d +?u?d?s?s?d?d +?u?s?d?d?s?d +?d?d?u?u?u?u?d?d +?u?u?u?d?u?d?d +?d?d?d?d?s?l?d +?d?d?l?s?d?d?d +?d?d?s?d?d?l?d +?u?l?l?l?d?l?d +?s?l?l?l?s?s +?d?l?d?d?l?d?d?d +?s?l?l?d?d?l +?u?l?s?d?d?u +?l?s?d?l?d?l +?s?l?l?d?l?d +?u?l?s?u?d?d +?l?u?u?s?d?d +?d?l?s?l?d?l +?u?d?l?l?d?s +?s?d?l?d?l?l +?d?u?d?l?d?u?d +?u?l?d?l?d?d?d +?l?u?u?u?u?u?d +?d?d?s?l?l?s +?s?d?l?l?s?d +?d?d?s?l?s?l +?u?s?l?s?d?d +?d?l?s?l?s?d +?d?u?l?l?l?d?d +?d?l?d?l?d?l?d?d +?d?d?d?d?d?d?d?s?d +?u?l?d?l?u?u +?l?d?l?u?u?l +?d?u?l?u?l?u +?u?d?u?u?u?l +?l?u?u?u?l?d +?l?l?l?u?u?d?d +?u?l?l?u?d?u +?l?u?l?u?d?l +?l?d?l?u?l?u +?u?u?l?d?l?l +?l?d?u?u?l?l +?u?d?l?l?u?u +?l?l?l?u?d?u +?l?u?l?u?u?d +?d?d?s?d?d?s?l +?l?s?d?d?d?d?s +?s?l?d?d?d?d?s +?d?d?d?l?l?l?l?d +?l?s?d?l?l?l?l +?u?d?l?l?l?l?d +?u?s?u?l?u +?s?l?u?l?l +?u?l?d?l?l?s +?l?s?u?l?l +?u?d?u?u?u?s +?s?l?l?u?u +?u?s?u?u?l +?u?l?u?u?s +?u?s?l?u?l +?l?s?l?l?u +?u?l?s?l?u +?l?l?u?l?s +?u?u?l?s?l +?l?l?s?u?l +?u?s?u?l?l?d +?l?u?l?u?s +?l?s?l?u?l +?l?u?u?s?l +?u?l?u?s?u +?d?s?u?l?l?l +?u?l?u?s?l +?u?l?l?d?l?d?d +?u?u?d?u?d?l +?l?l?u?d?d?u +?u?u?d?l?d?l +?u?u?d?l?d?u +?l?l?d?l?d?u +?l?l?u?d?l?d +?d?d?u?u?u?l +?d?d?l?u?u?l +?d?u?u?d?l?l +?u?u?d?l?u?d +?u?d?l?d?l?l?d +?u?l?d?d?d?u?l +?u?d?u?u?d?l +?d?u?u?l?l?d +?l?u?d?u?l?d +?d?l?l?d?u?l +?d?u?l?d?l?u +?u?d?u?d?u?u?d +?d?l?u?u?u?d +?u?d?d?u?l?u +?d?l?d?l?u?u +?u?l?l?s?d?d?d?d +?s?d?d?d?d?d?d?d?d +?s?l?s?s?s +?l?l?l?l?d?d?u +?l?u?l?u?l?l +?u?u?l?l?u?l +?d?s?d?d?d?s?d +?s?d?d?s?d?d?d +?s?d?s?d?d?d?d +?d?d?d?d?d?d?s?d?d +?l?l?l?l?d?l?d?d +?l?l?l?d?d?s?d?d +?l?d?l?l?l?l?d?d +?d?l?d?d?d?d?l?d +?l?u?l?u?d?d?d +?l?d?l?l?l?l?l?l +?l?l?d?d?d?d?l?d +?d?d?l?l?l?l?l?d +?l?d?d?s?d?d?l +?l?d?l?d?d?d?s +?s?l?l?d?l?s +?u?d?d?l?d?l?d +?l?l?l?l?s?l?d +?l?l?l?l?s?s?s +?l?d?d?l?l?d?d?l +?l?l?s?l?l?l?d +?l?u?u?l?u?u +?l?u?u?u?l?l +?u?u?l?u?l?l +?l?l?l?d?l?d?d?d +?l?l?d?d?d?d?d?s +?u?l?l?l?l?d?s +?l?l?d?l?l?l?l?l +?l?l?s?s?d?d?d +?u?l?l?u?d?d?d?d +?d?l?d?d?d?d?d?l +?s?l?d?d?d?d?d?d +?s?u?d?d?d?d?d?d +?s?d?d?d?d?d?d?l +?l?l?l?s?l?l?d +?s?d?d?d?d?s?l +?u?u?u?l?l?l?l +?u?d?d?u?u?u?u +?s?u?u?u?u?d +?u?l?l?d?l?s +?u?s?d?u?u?u +?d?d?d?d?d?d?s?u +?d?d?u?d?d?u?d +?d?d?d?d?u?d?l +?s?s?d?s?s?d +?d?d?s?d?s?d?d?d?d +?l?u?u?u?d?u +?l?u?u?u?d?l +?u?u?u?d?u?l +?u?u?l?u?d?u +?l?u?l?d?u?l +?u?l?l?d?u?u +?u?u?d?u?u?l +?d?u?l?l?u?l +?u?d?l?u?l?u +?l?u?d?u?u?l +?u?d?u?u?l?l +?u?l?d?u?u?u +?d?d?s?l?d?d?d +?d?s?l?d?d?d?d +?u?u?d?d?s?d?d +?d?l?d?s?d?d?d +?l?s?d?d?d?d?l +?l?d?d?d?d?s?l +?d?d?d?d?l?s?d +?l?u?l?u?l?d?d +?d?d?d?d?d?u?l?d +?s?l?d?l?l?s +?s?s?d?l?l?l +?l?l?d?l?l?l?d?d +?d?u?d?u?l?d +?l?d?d?u?u?d +?d?u?l?d?d?l +?l?d?d?d?l?u +?l?d?u?u?d?d +?d?d?u?l?u?d +?l?d?d?u?d?l +?l?u?d?d?d?u +?d?u?u?d?d?l +?l?d?l?d?d?u +?u?d?d?u?d?l +?l?u?d?u?d?d +?u?u?d?d?u?u?d +?l?d?l?d?u?d +?d?d?l?u?u?d +?d?u?d?l?u?d +?d?l?u?d?d?l +?d?u?d?d?l?u +?l?d?d?u?d?u +?d?d?d?d?s?l?s +?u?u?d?d?d?d?u?u +?u?d?u?d?d?d?d?d +?u?d?u?d?u?d?u?d +?d?s?d?s?s?d +?s?d?d?s?s?d +?s?d?d?s?d?s +?s?d?d?d?d?s?d +?u?u?l?u?u?l +?u?l?u?l?l?l?l +?l?u?l?u?u?l +?l?l?u?l?d?d?d +?u?d?l?d?u?d?l +?u?l?d?l?d?l?d +?l?u?l?l?d?d?d +?d?s?d?l?l?l?l +?s?d?l?l?d?s +?s?d?d?s?l?l +?s?l?l?d?s?d +?s?d?l?s?d?l +?d?s?l?l?s?d +?l?s?l?d?s?d +?s?d?l?d?l?s +?l?s?d?s?l?d +?l?l?l?d?d?d?d?d?d?d +?d?l?d?s?d?l?d +?d?d?l?d?d?l?s +?d?d?d?d?s?u?l +?u?d?d?s?u?d?d +?l?d?l?l?s?d?d +?u?u?l?l?s?d +?u?s?l?d?l?l +?u?l?s?l?l?d +?l?s?s?d?d?d?d +?l?u?u?u?u?u?u +?l?d?l?d?l?l?d?d +?d?d?d?u?u?l?l +?u?s?u?l?s +?s?l?s?u?l +?s?l?l?s?u +?l?s?u?l?s +?l?l?s?s?u +?l?s?l?s?u +?l?l?s?d?s?l +?s?u?l?u?s +?s?u?u?s?u +?l?s?l?l?d?s +?l?l?s?u?s +?u?u?s?u?s +?s?s?u?l?u +?u?l?u?s?s +?l?l?l?l?l?l?d?d?d?d +?l?u?l?u?u?u +?l?l?d?s?l?d +?u?u?d?d?s?u +?s?d?d?u?l?l +?d?s?d?u?u?u +?d?l?l?s?d?l +?u?d?s?l?d?l +?u?s?d?l?d?l +?u?s?l?d?l?d +?u?d?l?d?s?l +?u?d?u?s?u?d +?l?d?d?l?s?l +?u?d?u?u?d?s +?l?u?l?d?d?s +?d?d?u?d?d?u?u +?u?d?d?l?u?d?d +?l?u?u?u?u?s +?l?l?l?d?l?l?d?d +?l?d?d?d?l?l?l?l +?l?s?l?s?l?s?l +?l?d?d?d?l?d?d?l +?s?s?s?d?d?s +?d?d?d?s?d?d?d?s +?l?d?l?l?u?u +?l?d?l?u?u?u +?u?d?u?l?l?u +?d?u?l?u?u?l +?u?d?u?l?u?l +?u?u?u?l?u?d +?u?u?l?u?u?d +?u?u?l?d?u?l +?l?u?u?l?d?l +?u?l?u?u?d?l +?u?l?u?u?d?u +?u?u?u?l?d?u +?u?l?u?d?u?u +?u?d?l?u?u?u +?u?d?u?l?u?u +?u?u?d?d?l?l?l +?d?d?l?l?l?l?l?d?d +?d?d?d?u?l?u?l +?l?s?l?d?d?d?d?d +?d?d?d?d?d?d?l?d?d +?s?l?s?l?s?l +?u?d?l?l?d?l?l +?u?l?u?l?l?l?d +?u?u?l?u?u?u +?u?s?l?l?l?d?d +?l?d?d?l?l?l?l?l +?d?d?u?l?l?l?d?d +?u?l?u?u?d?d?d +?l?l?l?u?l?d?d +?l?d?d?l?d?d?d?l +?d?d?d?d?d?d?d?l?d +?u?d?d?u?d?d?d?d +?s?d?d?d?d?s?s +?d?d?d?d?d?u?l?l +?s?s?d?d?d?s?s +?s?d?s?l?l?l +?l?s?l?s?d?l +?l?s?s?l?l?d +?u?d?s?d?d?d?d +?u?d?d?d?s?d?d +?s?d?d?d?d?d?u +?l?u?u?u?s?d +?u?d?l?s?l?l +?l?l?d?d?l?l?s +?u?u?d?u?u?s +?d?d?d?d?l?l?l?s +?u?d?u?u?u?u?d +?d?u?d?d?d?d?d?d +?d?d?s?d?d?d?s +?d?d?s?l?s?d?d +?d?d?d?d?s?d?s +?u?l?l?s?u?l +?d?d?u?d?u?d?u +?d?d?l?d?l?d?d?l +?l?l?u?l?u?l +?u?u?d?d?u?u?d?d +?l?s?l?s?s?d +?u?u?u?s?d?d?d?d +?s?u?u?d?d?d +?s?d?d?u?l?d +?s?d?d?d?u?l +?d?s?u?l?d?d +?l?d?d?d?s?u +?u?d?s?d?d?l +?u?d?u?d?s?d +?u?d?u?d?d?s +?u?d?d?s?l?d +?d?d?s?u?l?d +?u?d?s?d?l?d +?d?d?l?s?l?d +?u?d?s?l?d?d +?u?s?d?d?u?d +?d?s?u?u?d?d +?u?s?d?d?d?l +?d?l?d?s?d?l +?u?d?d?d?s?u +?u?d?d?l?d?s +?u?s?d?l?d?d +?d?s?d?d?u?u +?d?s?d?l?d?l +?u?s?d?d?l?d +?l?s?d?d?l?d +?d?d?l?d?s?l +?s?l?u?d?d?d +?u?s?d?u?d?d +?d?u?s?d?d?l +?l?d?d?d?u?s +?u?d?d?d?s?l +?u?d?d?s?d?u +?u?d?s?u?d?d +?d?d?d?s?l?l?d +?d?l?d?l?s?d +?s?u?l?d?d?d +?s?d?d?l?d?l +?u?d?d?d?l?s +?d?d?s?u?u?d +?u?d?u?s?d?d +?s?l?d?d?l?d +?d?s?d?d?d?l?l +?u?d?d?u?d?s +?u?d?d?s?u?d +?l?s?u?d?d?d +?d?u?u?s?d?d +?s?d?d?l?l?d +?d?s?l?d?d?l +?s?u?d?u?d?d +?d?d?d?u?s?l +?d?d?l?s?d?l +?d?u?d?u?s?d +?d?d?d?d?u?l?s +?d?d?d?d?d?d?u?u?u +?l?d?l?l?l?l?s +?s?d?d?s?d?d?s +?d?u?d?d?d?d?u +?d?d?d?d?l?u?d +?d?d?d?l?d?d?u +?d?d?d?u?l?d?d +?d?d?d?d?u?l?d +?d?d?u?d?d?d?l +?l?d?d?d?s?d?d?d +?s?l?l?l?s?l +?u?u?s?s?u?u +?l?l?d?d?d?d?d?d?l +?d?u?l?u?d?l +?l?u?u?d?d?u +?d?l?u?d?l?l +?u?d?l?u?d?u +?d?u?d?u?l?l +?l?d?d?u?u?l +?d?l?d?u?l?l +?u?d?u?d?l?u +?d?u?l?u?u?d +?l?u?d?u?d?l +?l?u?d?u?d?u +?d?l?d?u?u?l +?u?d?l?u?u?d +?u?d?u?l?u?d +?d?l?u?l?u?d +?d?u?u?d?l?u +?l?d?u?u?u?d +?d?d?d?l?l?l?u +?l?d?u?u?d?l +?u?u?d?d?l?u +?l?d?l?l?u?d +?u?l?d?u?d?u +?d?l?u?d?u?l +?d?d?l?u?l?u +?d?d?u?u?u?u?d +?d?l?u?u?l?d +?d?l?d?u?l?u +?d?u?l?d?u?l +?d?u?d?l?u?l +?l?d?l?l?d?l?s +?u?d?d?u?u?l +?l?u?u?d?l?d +?d?d?d?l?l?d?d?l +?d?d?d?d?d?d?u?s +?d?d?d?u?u?u?s +?u?l?d?l?l?d?l +?d?d?u?d?d?u?d?d +?d?d?d?l?d?d?l?d +?l?l?l?d?d?d?l?d +?l?s?d?s?d?s +?s?s?s?l?d?d +?u?l?l?d?u?l?l +?l?d?d?d?l?d?l?d +?l?l?l?l?s?s?d +?s?d?d?s?s?s +?u?u?d?l?l?u +?d?u?u?u?l?u +?l?u?u?u?l?u +?l?l?u?l?u?d +?l?u?u?d?u?u +?d?l?u?l?l?u +?l?u?l?l?d?u +?u?l?d?l?l?l?d +?d?l?u?u?l?l +?d?l?l?u?u?u +?l?l?d?u?u?l +?l?u?u?l?d?u +?u?d?l?l?l?d?l +?l?u?d?u?l?l +?l?l?d?l?u?u +?l?l?u?l?d?u +?u?l?u?d?l?u +?u?d?u?u?l?u +?l?d?u?l?l?u +?l?l?u?u?d?l +?l?l?u?u?d?u +?l?u?d?l?l?u +?u?u?d?l?u?u +?l?s?s?l?d?l +?l?l?s?s?l?d +?u?u?u?s?s?d +?u?u?u?s?d?s +?l?l?l?s?d?d?l +?l?l?s?d?d?l?l +?l?s?l?d?l?l?l +?d?d?d?d?l?l?d?l +?u?d?d?d?l?d?d?d +?u?d?u?u?d?u?u +?u?s?s?u?s +?u?l?s?s?s +?l?s?s?s?u +?s?u?s?u?s +?s?s?l?s?l +?s?s?s?u?u +?u?l?s?d?d?s +?d?s?l?d?s?l +?l?l?s?d?s?d +?l?u?s?d?d?s +?u?u?s?d?d?s +?u?d?u?d?s?s +?d?s?d?s?l?l +?s?u?u?s?d?d +?s?l?l?d?d?d?s +?u?s?d?u?s?d +?u?s?s?u?d?d +?d?d?u?u?s?s +?u?s?u?d?s?d +?l?d?l?s?d?s +?u?l?d?d?d?d?d?d?d +?l?d?s?l?d?d?d +?d?l?l?d?d?d?s +?d?d?l?l?d?d?d?l +?u?u?d?d?l?d?d +?d?d?u?d?u?u?d +?d?d?l?l?u?d?d +?d?u?d?l?d?l?d +?d?u?l?l?d?d?d +?u?d?u?d?d?d?u +?d?d?u?u?d?d?u +?u?u?s?u?u?d?d +?l?l?d?d?s?l?l +?u?u?u?d?d?l?l +?u?u?d?l?l?l?l +?d?d?d?d?s?s?d?d +?d?d?s?d?d?d?d?d?d +?l?l?s?d?d?d?s +?l?d?d?d?d?l?l?d +?l?d?l?d?l?d?l?l +?d?d?d?d?l?s?s +?l?u?u?l?l?u +?l?u?u?l?u?l +?u?d?l?d?l?l?l +?l?l?u?u?u?d?d +?d?d?d?s?s?d?d?d +?u?u?s?u?u?u?u +?l?d?d?l?d?d?l?l +?d?d?d?d?d?d?d?d?d?d?d?d +?d?d?d?d?d?u?d?d +?u?u?s?l?l?l +?u?u?l?l?l?s +?u?u?u?s?s?u +?s?s?l?l?l?s +?l?l?s?d?d?d?l +?s?s?s?s?s?l +?d?d?d?s?d?d?d?l +?d?d?d?l?l?u?u +?l?l?d?d?d?u?u +?u?l?d?d?l?l?d +?u?d?u?d?u?u?u +?d?s?s?d?d?d?d +?d?d?u?u?u?u?u?u +?s?l?s?l?l?d +?s?l?s?l?d?l +?u?l?l?d?s?s +?d?d?d?d?l?l?l?d?d +?d?d?l?d?d?l?d?l +?l?s?s?s?s?s +?l?l?l?l?d?l?s +?l?l?l?d?d?u?u +?u?u?s?u?u?s +?u?l?u?l?s?s +?l?l?d?d?d?l?l?d +?u?l?d?d?s?d?d +?s?d?d?l?l?d?d +?d?d?d?d?d?s?l?l +?d?s?d?l?l?d?d +?s?u?u?d?d?d?d +?d?d?d?l?l?s?d +?d?l?l?d?l?d?d?d +?l?l?u?u?l?u +?l?u?l?l?u?u +?u?d?d?d?d?u?d?d +?s?d?d?l?d?s +?s?d?d?d?l?s +?l?d?d?s?d?d?s +?u?s?d?d?s?d?d +?s?d?d?s?l?d +?l?d?d?s?d?s +?d?d?l?d?s?s +?d?d?s?l?s?d +?d?s?d?l?s?d +?s?s?d?l?d?d +?d?s?d?d?s?u +?d?s?d?s?d?l +?u?d?d?s?d?s +?d?s?s?l?d?d +?s?d?l?d?s?d +?s?u?s?d?d?d +?s?d?d?d?s?u +?d?u?s?s?d?d +?d?s?d?d?s?l +?s?d?l?d?d?s +?d?s?d?d?u?s +?d?d?s?l?d?s +?d?d?s?d?s?l +?u?s?s?d?d?d +?l?d?d?s?s?d +?d?d?d?l?d?d?l?l +?d?d?d?s?l?l?l?l +?u?d?l?l?d?d?l +?d?l?d?d?d?d?s +?u?d?d?s?d?d?d +?d?d?l?d?d?d?s +?s?d?d?d?l?d?d +?d?d?d?l?s?d?d +?u?d?d?d?d?s?d +?d?s?d?d?l?d?d +?d?d?d?s?l?d?d +?d?d?s?d?l?d?d +?s?s?s?s?l?l +?d?d?l?d?d?l?d?d?l +?l?l?l?l?d?l?l?d +?u?u?u?u?l?d?d +?u?l?l?u?u?d?d +?u?u?d?u?d?s +?l?d?l?s?d?u +?u?l?s?d?d?l +?l?s?l?u?d?d +?u?u?l?d?d?s +?d?l?s?l?l?d +?s?u?d?u?u?d +?u?d?s?d?l?l +?u?l?s?d?u?d +?u?u?s?d?d?u +?u?l?d?s?d?l +?u?s?d?d?l?l +?u?d?u?d?s?u +?u?d?d?l?l?s +?l?l?d?d?u?s +?u?u?d?u?s?d +?d?d?s?u?l?l +?d?l?s?d?l?l +?s?l?u?d?l?d +?u?l?d?s?u?d +?s?l?u?l?d?d +?u?s?l?d?d?l +?l?d?u?s?l?d +?s?u?d?l?d?l +?d?s?l?l?d?l +?u?d?l?l?s?d +?d?l?d?l?u?s +?d?l?l?s?l?d +?d?u?s?u?d?u +?l?d?s?d?d?s?d?d +?l?d?d?u?l?d?d +?u?d?l?d?d?l?d +?d?d?u?d?d?l?l +?u?d?d?u?l?d?d +?d?d?d?u?l?l?d +?u?u?d?d?d?u?d +?l?d?d?u?d?d?l +?d?d?u?u?d?d?l +?u?d?d?d?u?d?u +?d?d?d?u?l?d?d?d +?u?d?d?l?d?d?d?d +?u?u?u?u?l?l?l +?s?d?d?d?s?d?d?d +?d?d?d?l?l?s?s +?u?s?u?s?d?d?d +?l?l?d?d?l?d?d?l +?u?l?l?s?u?l?l +?d?l?l?l?d?l?l?l +?u?l?u?l?s?d?d +?l?d?l?l?l?d?l?l +?d?s?d?s?s?s +?l?l?u?d?u?u +?l?u?u?l?u?d +?l?l?u?d?l?u +?u?u?d?u?u?d?u +?l?d?u?l?u?u +?d?u?u?l?l?u +?l?u?d?u?l?u +?u?u?l?d?l?u +?u?u?d?u?l?u +?u?l?l?l?d?d?u +?u?d?l?l?d?d?d?d +?s?s?l?l?l?d?d +?l?l?d?l?l?l?s +?u?s?u?l?d?l +?u?l?u?l?d?s +?u?s?u?d?u?u +?s?u?l?l?l?d +?l?d?l?d?d?d?d?l +?u?d?u?u?u?d?u +?l?d?l?d?l?d?d?l +?u?l?d?d?l?d?l +?d?l?l?l?s?d?d +?u?s?l?l?d?d?d +?s?l?l?l?d?d?d?d +?d?d?d?l?l?d?d?d?d +?l?l?l?l?l?u?u +?s?s?u?s?s +?s?u?s?s?s +?l?l?l?l?u?u?u +?l?l?d?l?d?l?d?d +?u?s?s?l?l?l +?u?s?l?l?s?l +?s?s?s?d?d?l +?u?s?s?s?d?d +?l?s?s?s?d?d +?u?l?l?d?l?l?d +?u?l?u?u?l?d?d +?d?u?u?u?u?d?u +?l?l?u?u?l?d?d +?u?u?u?d?u?u?d +?l?l?l?d?l?l?s +?d?d?d?d?l?d?l?l +?s?d?d?l?d?d?s +?l?l?l?l?l?l?d?s +?l?d?d?d?d?s?d?d +?l?l?d?l?l?d?l?l +?u?l?d?d?d?s?d +?d?d?s?d?d?u?u +?d?l?l?s?d?d?d +?u?l?l?u?l?l?d?d +?l?l?s?s?l?d?d +?l?l?s?d?l?s +?l?s?l?d?s?l +?d?l?s?l?s?l +?u?u?d?d?d?d?l?l +?d?d?l?d?d?d?l?l +?d?d?d?s?s?l?l +?l?l?d?l?l?l?l?d +?l?l?l?u?d?d?d?d +?d?d?l?l?l?d?d?l +?d?d?d?d?u?l?d?d +?u?l?u?s?d?d?d +?u?l?l?d?d?d?d?s +?d?d?l?l?l?s?d +?d?d?d?u?l?l?l?l +?s?s?s?s?s?d +?u?l?d?d?u?l?d?d +?u?u?u?d?d?u?d +?u?d?d?l?l?l?d +?u?l?l?d?d?d?u +?u?d?d?d?u?l?l +?u?l?u?l?l?s +?d?d?d?l?l?l?l?l?l +?l?l?l?s?d?l?d +?l?d?l?s?l?d?l +?d?d?l?l?l?s?s +?l?l?l?s?d?s?d +?d?d?d?u?u?u?d?d +?u?s?u?u?s?u +?d?s?d?d?s?d?d?d?d +?u?l?l?s?s?s +?l?d?l?d?l?l?l?l +?s?l?l?s?d?d?d +?l?d?l?l?l?l?l?d +?d?d?d?d?d?d?l?l?d +?d?s?d?d?s?d?d?l +?d?d?l?d?d?d?d?d?d +?d?u?d?d?d?d?l +?d?d?d?l?u?d?d +?l?d?u?d?d?d?d +?d?u?d?d?d?u?d +?d?l?d?u?d?d?d +?d?d?d?d?l?d?u +?d?u?d?u?d?d?d +?d?d?u?l?d?d?d?d +?d?d?d?u?d?u?d +?d?d?d?d?l?l?d?d?d +?d?d?u?d?l?d?d +?d?d?l?u?d?d?d +?d?u?d?d?u?d?d +?d?d?d?u?d?d?l +?d?d?d?u?d?d?u +?d?u?d?d?d?l?d +?d?d?l?l?l?l?u +?u?u?u?d?s?d?d +?u?s?u?u?u?d?d +?l?d?d?s?l?l?l +?l?d?d?s?d?d?d?d +?u?l?u?u?u?l +?u?u?u?l?u?l +?d?d?l?d?l?l?d?d +?l?l?l?l?d?s?s +?l?d?l?s?s?s +?u?u?l?l?l?d?d?d +?u?u?s?s?s?s +?s?s?u?u?s?s +?d?d?d?d?d?l?l?s +?l?l?l?d?d?s?l +?l?s?l?l?s?s +?u?d?d?d?d?l?u +?u?d?d?d?l?d?l +?d?d?d?u?u?d?u +?d?d?u?l?l?l?d +?u?d?d?d?d?u?l +?u?l?d?d?d?l?u +?d?u?u?d?u?u?d +?u?l?d?d?u?l?d +?d?d?l?l?d?d?u +?u?d?d?d?d?d?d?d?d?d +?u?l?s?s?l?l +?u?d?l?d?l?d?l?d +?l?l?d?d?l?l?l?d +?d?l?d?l?l?d?d?d +?d?l?d?d?l?l?d?d +?s?d?s?s?d?d +?s?s?d?d?s?d +?d?d?s?d?s?s +?u?u?d?u?u?u?d +?u?l?l?l?l?s?d?d +?s?l?d?l?d?l?d +?l?d?l?l?d?d?s +?d?d?d?d?d?d?d?s?l +?l?l?l?l?s?d?l +?l?l?l?l?l?d?u +?l?d?l?d?l?l?s +?l?d?d?l?l?l?s +?d?d?s?s?u?u +?s?s?l?d?d?l +?l?d?s?d?s?l +?l?s?s?d?l?d +?s?u?l?s?d?d +?l?l?d?d?s?s?s +?l?d?s?s?l?d +?l?s?d?d?l?s +?s?l?d?s?l?d +?d?s?s?l?l?d +?d?d?u?s?u?s +?s?l?d?l?s?d +?s?d?d?l?l?s +?u?s?d?d?s?u +?s?d?d?l?s?l +?l?d?l?l?d?l?l?d +?d?d?d?d?d?s?d?d?d +?l?l?l?l?s?d?d?d?d +?u?u?d?d?l?l?d?d +?s?d?d?d?d?u?u +?d?l?s?l?d?d?d +?d?l?l?d?s?d?d +?u?d?d?u?d?d?s +?d?d?u?s?u?d?d +?l?s?u?d?d?d?d +?l?d?d?d?l?d?s +?l?u?s?d?d?d?d +?l?l?l?u?l?l?l +?l?d?d?d?d?l?d?l +?l?l?l?l?d?d?l?d +?u?d?l?d?d?d?d?d +?u?d?d?d?d?l?d?d +?l?l?l?d?d?l?l?d +?u?u?u?d?l?l?l +?u?d?s?u?u?u +?l?d?l?l?s?u +?u?u?s?l?l?d +?u?s?u?d?l?l +?u?l?d?s?l?l +?u?l?s?l?d?l +?u?u?u?s?d?u +?u?d?l?l?s?l +?u?l?s?u?l?d +?u?d?l?u?s?l +?l?d?l?l?d?l?d?l +?u?u?d?d?l?l?d +?l?d?l?d?l?d?u +?u?l?l?d?d?l?d +?l?d?d?l?l?d?l?d +?d?d?d?d?d?d?d?l?l?l +?l?d?l?d?d?d?l?d +?u?u?u?d?s?s +?s?s?l?l?d?l +?u?l?l?s?d?s +?l?l?l?l?s?d?s +?d?l?l?s?s?l +?l?l?l?l?s?l?l?l +?u?u?l?u?l?u +?u?l?u?d?d?d?s +?d?s?d?d?l?l?l +?s?d?l?l?l?d?d +?u?l?l?d?s?d?d +?d?d?d?l?l?s?l +?l?l?l?s?l?l?l?l +?d?l?l?d?d?l?d?d +?u?l?l?l?u?l?d +?u?u?u?l?l?l?d?d +?l?s?l?s?d?d?d?d +?l?l?s?s?s?l +?d?s?s?s?s?d +?d?d?d?s?s?s?s +?d?u?u?l?u?l +?u?u?l?u?d?l +?l?u?d?l?u?l +?l?u?u?d?u?l +?d?l?u?l?u?l +?d?u?l?u?u?u +?d?u?l?l?u?u +?l?d?u?l?u?l +?u?d?l?u?u?l +?u?u?l?u?l?d +?d?l?u?l?u?u +?d?l?l?d?d?l?l?d +?s?d?d?d?d?d?d?d?s +?d?d?s?s?s?d?d +?s?s?d?d?d?d?s +?u?u?u?u?u?u?d?d?d +?l?l?s?d?l?l?l +?l?s?l?s?s?s +?d?d?s?d?d?s?d?d?d?d +?d?d?d?d?d?d?d?s?s +?l?d?l?d?l?l?l?d +?s?s?d?d?d?d?l +?s?l?l?l?l?s?d +?l?l?d?s?s?s +?u?s?u?s?s?d +?u?l?d?d?d?d?d?s +?d?l?l?s?d?l?l +?s?l?l?l?l?d?s +?l?d?d?d?l?l?l?d +?d?l?d?d?d?d?l?l +?d?l?d?l?d?d?l?d +?s?s?s?s?d?d?d +?s?s?l?l?d?d?d +?s?d?u?u?u?u?u +?d?d?s?d?l?l?l +?d?s?l?l?l?d?d +?u?s?u?u?d?d?d +?l?l?d?d?d?l?s +?s?s?u?u?u?u +?u?s?l?l?l?s +?u?d?d?u?d?u?u +?u?d?d?u?u?u?d +?u?d?d?l?d?l?l +?u?s?u?s?u?d?d +?u?u?u?u?u?d?s +?u?u?u?u?d?d?d?d?d +?d?d?d?d?s?d?s?d +?u?u?l?l?l?l?d?d +?s?s?l?s?s?l +?u?l?l?l?l?u?d?d +?l?d?l?l?l?d?l?d +?d?l?d?d?l?d?l?d +?d?l?d?d?s?d?d +?d?d?s?d?d?d?u +?d?d?d?l?d?s?d +?d?d?u?s?d?d?d +?s?d?d?d?d?l?d +?d?d?d?d?l?d?s +?d?d?l?d?s?d?d +?d?d?s?d?u?d?d +?s?d?l?d?d?d?d +?d?d?l?d?d?s?d +?d?s?d?d?d?d?u +?d?d?d?d?d?l?d?d?d +?l?l?d?l?l?d?l?d +?u?l?l?l?l?s?s +?u?u?u?u?u?u?u?d?d +?u?u?u?s?l?l +?l?l?l?s?d?l?l +?l?s?u?l?l?l +?u?l?l?u?l?s +?l?u?l?l?l?s +?u?d?u?l?d?d?d +?d?u?u?d?d?d?u +?l?d?d?d?d?u?l +?d?d?d?d?l?u?u +?d?u?u?d?u?d?d +?u?l?d?d?d?l?d +?u?d?u?d?l?d?d +?l?u?d?d?d?d?l +?l?d?u?u?d?d?d +?l?u?l?d?d?d?d?d +?u?l?d?d?u?d?d +?u?d?d?u?d?d?l +?l?l?d?d?u?d?d +?d?u?d?u?d?d?u +?d?u?d?d?u?d?u +?d?d?l?u?u?d?d +?l?d?d?l?d?d?u +?u?s?u?u?u?u?u +?d?d?d?d?u?d?d?d?d +?u?u?u?u?u?s?u +?l?d?l?d?l?l?d?l +?d?d?s?u?u?u?u +?l?l?l?d?d?l?s +?l?d?l?l?l?l?d?l +?u?d?d?d?d?l?s +?s?l?d?d?d?d?l +?s?l?d?d?l?d?d +?s?u?l?d?d?d?d +?d?l?l?l?d?d?s +?d?d?d?l?l?d?s +?l?d?d?l?s?d?d +?u?u?d?s?d?d?d +?l?s?l?d?l?d?d +?d?d?d?l?d?d?d?d?d +?d?d?s?d?d?s?s +?s?d?s?d?s?d?d +?d?s?d?s?d?d?s +?d?d?l?l?d?d?l?d +?d?d?l?l?d?l?d?d +?l?l?d?s?l?l?l +?d?d?u?l?l?l?l?l +?s?l?s?l?l?s +?s?s?s?u?u?u +?d?d?d?d?s?d?d?l +?l?d?l?l?d?l?l?l +?d?u?u?u?u?u?u?u +?u?s?s?u?u?u +?u?s?u?s?u?u +?d?d?d?d?d?s?s?s +?u?l?l?s?l?l?l +?d?l?l?l?l?d?l?l +?u?d?u?l?l?d?d +?l?d?l?d?d?l?l?d +?d?u?u?l?u?d +?l?l?u?d?u?d +?u?d?l?l?u?d?d +?u?l?u?d?d?d?u +?u?u?d?u?d?u?d +?d?u?u?d?u?l +?l?u?l?d?u?d +?d?u?u?l?d?l +?d?u?d?u?u?l +?l?u?d?d?u?u +?d?l?u?l?d?u +?d?l?u?u?d?u +?l?d?l?u?d?u +?d?u?u?u?d?u?u +?l?d?u?l?u?d +?d?l?u?d?u?u +?l?u?d?u?u?d +?d?l?l?u?d?u +?l?d?u?d?u?u +?l?u?u?u?d?d?d?d +?d?l?l?u?l?d +?u?u?d?u?l?d +?d?l?u?d?l?u +?d?u?u?u?l?d +?u?d?u?l?d?u +?l?s?d?d?d?s?l +?l?l?u?u?d?d?d?d +?l?d?l?l?d?d?l?d +?d?l?d?d?d?l?l?d +?u?l?l?l?l?u?u +?l?d?l?d?d?l?d?l +?s?l?s?d?d?s +?s?s?l?d?d?s +?s?s?d?d?s?l +?l?s?d?d?s?s +?s?d?s?d?s?l +?s?s?l?s?d?d +?s?u?s?s?d?d +?d?d?s?s?s?l +?s?d?s?d?l?s +?u?s?l?l?l?l?l +?s?s?l?l?l?l?l +?d?d?l?d?d?l?l?l +?l?l?d?d?d?d?u?u +?u?u?u?d?d?d?d?s +?l?s?s?l?s?s +?l?l?d?l?l?l?d?l +?s?u?s?d?d?d?d +?l?s?d?s?d?d?d +?u?d?d?d?d?s?s +?d?d?l?d?d?l?l?d +?d?l?d?l?d?d?d?l +?u?u?l?u?u?d?d +?l?s?l?l?d?d?d?d +?d?l?l?d?l?l?d?d +?l?l?s?l?d?s +?s?u?u?u?d?s +?u?l?s?s?l?d +?l?d?s?s?l?l +?l?d?s?l?s?l +?u?d?s?l?l?s +?s?l?d?l?s?l +?d?l?s?s?l?l +?l?s?d?s?l?l +?d?d?d?d?d?u?u?d +?l?d?d?d?s?l?l +?d?d?d?l?s?l?l +?l?l?d?s?d?d?l +?l?d?d?l?l?d?s +?l?s?d?l?l?d?d +?l?s?l?s?d?s +?s?l?d?l?s?s +?d?l?l?l?l?d?s +?l?l?d?s?d?l?l +?l?l?l?u?u?u?u +?d?u?l?l?d?d?d?d +?l?d?l?d?d?d?d?d?d +?l?l?l?s?u?l +?u?l?l?s?u?u +?l?l?s?u?l?l +?l?s?l?l?u?l +?u?l?u?l?s?l +?s?l?l?l?l?u +?l?l?l?u?u?u?d +?l?d?d?l?d?l?l?d +?u?l?l?l?l?l?l?d?d +?d?d?d?s?d?d?d?d?d +?u?u?u?u?s?u?u +?l?l?d?d?u?u?u +?d?d?u?l?l?l?u +?u?u?d?u?d?u?u +?u?l?l?d?l?d?l +?u?u?u?d?u?d?u +?u?l?u?u?u?d?d +?u?l?d?d?u?l?l +?u?l?s?d?d?d?d?d +?d?l?d?l?l?d?l?d +?u?s?u?u?u?s +?s?u?l?u?l?s +?l?l?l?l?s?s?l +?u?l?l?l?l?l?d?d?d +?l?l?d?l?l?d?s +?u?l?l?s?d?l +?s?l?l?l?u?d +?l?l?l?u?s?d +?u?l?s?u?d?l +?u?s?d?u?l?l +?u?l?u?s?u?d +?l?d?l?l?l?d?s +?l?l?d?s?l?l?d +?u?u?s?d?u?u +?d?u?u?s?u?u +?u?l?l?s?u?d +?u?u?s?u?d?u +?l?s?l?l?s?d?d +?d?d?s?l?l?l?s +?l?s?d?d?d?d?d?d?d +?l?l?l?l?u?l?l +?u?d?l?d?l?d?u +?u?d?l?l?d?d?u +?l?u?u?l?d?d?d +?u?u?d?d?u?d?u +?u?d?u?d?d?u?u +?d?d?d?u?l?l?u +?l?l?d?d?l?l?d?l +?d?d?d?u?u?u?l +?d?d?d?d?d?d?l?l?l?l +?d?l?d?d?d?d?d?d?d +?l?d?s?s?s?s +?l?l?u?l?u?u +?u?l?l?l?l?d?u +?d?d?d?l?l?d?l?d +?u?d?u?d?d?u?d?d +?d?d?d?l?d?l?l?d +?l?l?d?d?l?d?l?d +?l?d?d?l?d?l?d?l +?d?d?d?u?d?d?d?u +?l?s?d?d?l?l?l +?l?d?s?l?l?l?l +?d?d?d?d?d?d?d?d?d?s +?s?d?d?d?s?l?l +?l?s?l?d?d?d?s +?l?l?s?s?l?s +?s?u?s?u?s?u +?l?d?l?d?l?s?d +?u?u?u?d?d?s?d +?u?u?s?u?d?d?d +?l?d?l?d?d?l?s +?l?l?u?l?l?l?l +?d?d?l?d?l?d?l?d +?l?u?l?l?l?l?d +?l?s?l?l?l?l?d?d +?u?l?l?l?l?u?l +?u?u?u?u?u?s?s +?u?l?u?l?u?d?d?d +?u?l?d?l?d?l?l +?d?s?d?d?d?d?d?d?d +?l?l?u?l?l?l?d +?l?l?l?l?u?u?d +?d?s?d?d?d?d?s +?d?l?l?d?d?d?d?l +?l?d?d?l?l?l?l?d +?u?u?u?d?d?d?d?u +?u?l?l?l?u?u?d +?u?l?l?s?s?l +?u?l?l?l?s?d?d?d +?d?l?l?l?l?l?d?l +?d?l?d?d?l?d?s +?u?u?d?d?d?s?d +?l?u?d?d?d?d?s +?l?d?l?d?d?s?d +?u?d?u?d?s?d?d +?l?l?d?l?d?l?s +?d?d?l?l?s?l?l +?l?s?l?s?l?s?d +?l?l?l?d?l?d?l?l +?u?l?l?l?d?d?d?d?d +?l?l?l?s?u?u +?u?l?s?u?u?u +?l?l?l?u?u?s +?u?l?u?l?s?u +?d?d?u?d?d?l?d?d +?l?l?l?l?d?l?d?l +?l?d?l?d?d?d?l?l +?d?d?d?l?l?l?d?l +?d?l?d?l?l?l?d?d +?l?s?s?l?d?d?d +?u?s?d?d?d?d?s +?d?l?s?d?l?s?d +?d?d?d?d?d?u?l?u +?u?l?d?l?d?d?l +?u?u?l?u?d?d?d +?u?l?d?l?u?d?d +?d?d?d?d?u?l?u?l +?l?d?d?d?d?d?d?d?s +?l?l?l?d?l?d?l?d +?l?s?s?s?l?l +?s?u?u?u?u?u?s +?u?d?d?d?d?d?d?d?l +?d?l?l?d?l?d?l?d +?d?d?d?l?l?d?l?l +?d?l?l?l?d?d?d?l +?l?l?l?d?l?l?d?l +?l?l?d?d?s?u +?u?d?l?s?l?d +?l?d?l?u?s?d +?s?u?u?d?d?l +?l?d?d?l?u?s +?u?d?u?u?s?d +?l?u?u?d?d?s +?d?s?d?l?l?u +?l?u?l?d?s?d +?d?u?l?s?d?l +?d?l?u?l?d?s +?u?s?d?l?u?d +?u?d?d?s?l?l +?s?d?u?u?d?u +?u?l?d?u?s?d +?d?d?s?u?l?u +?s?u?d?d?l?l +?d?u?u?d?l?s +?d?l?l?d?s?l +?d?d?l?l?s?u +?d?u?d?u?s?u +?l?d?l?s?d?l?d +?s?l?l?d?d?u +?s?u?d?d?u?u +?u?d?s?d?u?u +?u?l?d?d?s?u +?u?s?u?d?u?d +?l?d?d?d?l?l?s +?l?d?l?d?s?u +?u?u?d?s?d?u +?u?u?d?s?d?l +?d?u?d?u?u?s +?d?l?s?d?u?l +?d?u?u?u?s?d +?l?s?d?d?l?u +?d?l?l?l?l?s?d +?l?l?d?u?s?d +?d?u?l?d?s?l +?u?d?d?u?s?l +?s?u?u?l?d?d +?u?u?d?d?u?s +?l?l?s?u?d?d +?u?d?d?s?l?u +?s?d?u?d?u?u +?s?d?u?l?l?d +?u?d?d?u?s?u +?d?d?l?l?l?d?s +?d?l?u?u?d?s +?u?s?l?u?d?d +?u?d?u?s?l?d +?s?l?l?u?d?d +?d?d?s?u?u?l +?l?d?l?d?s?l?d +?d?d?s?l?u?u +?d?l?l?s?u?d +?l?s?u?d?l?d +?d?l?u?s?d?u +?l?u?d?l?d?s +?u?l?d?d?u?s +?d?l?s?l?d?u +?l?u?d?s?l?d +?l?d?s?d?l?u +?u?d?d?l?u?s +?s?u?l?u?d?d +?d?l?d?s?l?l +?d?u?l?u?d?s +?d?l?d?u?s?l +?s?l?d?u?d?l +?u?u?s?d?u?d +?l?u?s?l?d?d +?u?d?d?u?u?s +?u?l?u?d?s?d +?l?d?l?s?l?d?d +?d?s?u?l?l?d +?d?u?s?u?d?l +?l?s?u?u?d?d +?l?l?u?s?d?d +?l?l?d?l?d?l?l?d +?d?d?d?s?s?s?l +?d?u?u?d?d?u?d +?d?l?u?u?d?d?d +?d?d?u?l?d?d?u +?u?d?l?u?d?d?d +?d?d?u?d?d?u?l +?d?d?u?u?l?d?d +?l?d?u?d?l?d?d +?d?l?l?d?d?d?l?d +?d?l?l?l?d?l?d?d +?u?d?l?d?l?d?d?d +?d?l?d?u?d?l?d +?d?d?u?u?d?u?d +?d?l?u?l?d?d?d +?l?l?d?d?d?u?d +?d?u?l?u?d?d?d +?l?u?d?d?l?d?d +?d?d?d?u?d?u?u +?u?d?d?d?l?l?d +?l?d?d?d?l?d?d?d?d +?u?l?l?l?l?s?u +?d?s?s?d?s?s +?s?d?s?s?s?d +?s?d?s?d?s?s +?l?l?d?d?d?l?d?l +?l?l?l?l?l?d?d?d?d?d +?d?u?u?l?u?u +?l?l?d?u?l?u +?l?u?d?l?u?u +?u?u?d?l?u?l +?d?l?u?u?l?u +?l?d?u?u?u?l +?l?l?l?u?l?l?d +?l?u?l?u?d?u +?l?l?d?l?d?l?l?l +?l?s?s?l?l?d?d +?d?s?s?s?d?d?d +?l?d?d?l?l?d?l?l +?d?d?d?d?d?l?l?d?d +?l?u?l?u?l?u?l +?d?l?d?l?l?l?l?l +?u?d?d?d?d?d?l?l +?d?l?d?d?d?l?d?l +?d?d?u?u?u?d?d?d +?s?d?l?s?l?s +?s?d?l?l?s?s +?l?s?d?s?l?s +?d?d?d?d?d?d?d?d?d?u +?d?d?d?d?d?s?d?l +?s?l?s?l?d?d?d +?s?s?s?s?l?d +?s?l?s?l?s?s +?u?l?l?l?u?d?d?d +?s?u?l?l?l?l?s +?u?u?s?d?d?d?d?d +?l?l?d?s?d?d?d?d +?l?l?l?s?u?s +?u?u?u?s?u?s +?u?l?s?u?l?s +?l?d?l?l?s?l?l +?l?l?s?d?d?d?d?d?d +?d?u?d?u?u?u?u +?d?d?u?u?l?l?l +?u?l?d?d?d?d?l?l +?u?u?d?d?d?d?d?u +?l?l?u?d?d?d?d?d +?d?d?d?d?u?u?u?d +?d?u?u?u?d?d?d?d +?d?d?d?l?d?l?d?l +?l?d?l?d?l?s?l +?u?l?l?l?d?s?d +?d?d?l?s?l?l?l +?l?l?d?l?l?s?d +?u?u?u?u?u?s?d?d +?l?l?s?l?s?s +?s?l?l?s?l?s +?l?s?l?l?d?l?l +?l?u?l?l?l?l?l +?l?l?d?s?l?s +?u?d?u?u?s?s +?d?l?l?s?l?s +?d?l?s?l?l?s +?d?s?l?l?l?s?d +?s?d?l?s?l?l +?d?d?s?s?l?l?l +?l?l?s?s?d?l +?s?d?d?l?l?l?s +?s?l?l?s?l?d +?l?s?d?l?s?l +?l?s?d?l?l?s +?u?d?l?l?s?s +?d?s?l?l?l?s +?s?l?s?d?l?l +?l?d?l?l?l?d?d?l +?s?u?u?u?u?u?u +?u?l?l?l?l?s?l +?l?s?l?l?l?d?l +?u?l?d?d?d?d?u?l +?l?d?l?l?d?s?d +?l?d?d?l?d?l?s +?d?d?d?s?u?l?l +?d?d?l?l?l?l?l?l?l +?u?s?u?l?l?l?l +?u?l?d?d?l?l?d?d +?u?u?d?l?l?d?d +?l?d?l?l?d?d?d?l +?u?d?u?d?u?d?l +?l?l?u?d?d?d?u +?u?d?u?u?d?d?u +?u?l?u?d?u?d?d +?d?u?u?u?d?u?d +?d?d?d?l?u?u?u +?l?u?l?u?l?s +?l?s?u?u?u?u +?u?l?s?l?u?l +?l?u?s?l?l?l +?l?d?l?s?l?l?l +?l?l?d?l?d?l?d?l +?l?l?l?d?u?l?l +?l?l?d?d?d?d?s?s +?u?d?d?d?s?d?d?d +?u?u?u?u?d?d?l +?u?d?d?u?l?l?l +?l?l?d?l?d?d?l?d +?l?l?l?l?d?d?s?d +?l?l?s?l?l?d?l +?u?l?u?l?u?l?d?d +?d?s?d?s?d?l?l +?l?l?s?d?d?s?d +?l?l?l?l?l?u?l +?l?d?d?d?d?d?d?d?d?l +?l?u?l?u?d?d?d?d +?d?d?l?l?d?l?l?d +?l?l?l?l?d?s?d?d +?l?d?d?d?d?u?d +?d?d?d?l?d?u?d +?d?d?l?d?d?d?u +?u?d?u?u?d?d?d?d +?d?l?d?d?d?d?u +?d?d?l?d?d?u?d +?d?d?l?d?u?d?d +?d?l?u?d?d?d?d +?l?d?d?d?u?d?d +?l?d?l?l?l?s?l +?s?d?u?l?l?l?l +?l?l?d?d?l?d?l?l +?s?s?l?l?l?s?s +?d?d?s?d?s?d?d?d +?u?d?l?d?u?d?l?d +?l?d?d?d?l?d?l?l +?d?d?l?l?l?d?l?d +?u?d?u?l?l?l?l +?l?l?d?l?l?d?d?l +?l?l?l?s?l?d?l +?d?d?d?d?u?u?l?l +?l?l?d?d?s?d?d?d +?l?l?s?l?d?d?d?d +?l?u?l?l?u?d?d +?d?d?l?l?u?l?l +?l?s?l?s?s?l +?l?s?s?l?s?l +?u?l?u?s?s?s +?l?l?l?d?d?d?d?u +?u?u?l?d?d?d?d?d +?u?l?s?l?l?l?l +?d?l?l?d?l?l?l?l +?s?s?l?d?d?d?d +?l?d?d?s?s?d?d +?d?d?s?u?s?d?d +?l?d?s?s?d?d?d +?s?d?d?d?d?l?s +?d?d?s?s?d?d?l +?d?s?d?s?d?d?u +?l?l?l?l?s?l?s +?u?u?s?u?s?u +?l?s?l?d?l?s?l +?l?d?d?d?l?l?d?l +?d?d?s?d?d?d?d?l +?l?l?l?d?d?l?d?l +?l?l?u?u?l?l?d +?s?s?d?d?s?d?d +?d?d?d?s?s?s?d +?l?d?d?d?s?s?s +?s?l?l?d?d?d?d?d +?d?d?d?d?d?l?s?l +?d?l?l?l?d?l?l?d +?s?u?u?u?d?d?d +?d?d?s?l?l?l?d +?d?s?d?l?l?l?d +?l?u?l?s?d?d?d +?u?d?u?d?u?d?s +?u?l?l?d?d?s?d +?l?d?d?s?d?l?l +?s?s?d?d?d?d?s?s +?l?l?l?l?l?s?u +?d?d?d?l?l?l?l?s +?s?l?s?s?l?s +?l?s?s?s?s?l +?d?l?l?l?l?d?l?d +?u?u?u?u?s?d?d?d +?l?s?l?l?l?d?d?d +?u?d?d?u?d?u?d?d +?d?d?l?l?l?d?l?l +?u?u?u?u?l?l?d +?s?d?d?u?u?s +?s?d?d?u?l?s +?u?d?u?s?s?d +?d?s?l?l?d?s +?u?d?l?s?d?s +?l?s?d?d?s?u +?u?s?d?s?l?d +?s?d?u?u?s?d +?u?s?s?d?d?l +?u?d?s?l?d?s +?u?d?d?s?s?u +?l?d?s?s?d?l +?s?d?d?s?u?u +?l?l?d?s?d?s +?d?s?l?s?l?d +?d?u?u?s?s?d +?u?s?s?d?u?d +?u?d?d?s?s?l +?u?s?s?d?d?u +?s?d?s?l?d?l +?l?d?s?l?s?d +?s?d?s?d?l?l +?u?s?l?d?d?s +?s?d?u?u?d?s +?l?l?d?s?s?d +?u?d?l?d?s?s +?d?s?d?l?s?l +?s?d?d?s?u?l +?u?d?d?u?s?s +?d?d?s?s?u?l +?s?u?s?u?d?d +?s?l?u?d?d?s +?s?s?d?d?d?l?l +?s?s?u?u?d?d +?s?u?d?l?d?s +?d?u?u?d?s?s +?d?l?s?s?d?l +?l?d?d?u?s?s +?u?d?s?s?d?u +?d?s?l?s?d?l +?u?d?u?s?d?s +?d?s?d?s?u?u +?l?s?s?d?d?l +?l?s?u?s?d?d +?d?d?d?s?l?s?l +?d?l?s?d?s?l +?s?l?d?s?u?d +?d?l?s?s?l?d +?s?u?d?d?s?u +?d?u?s?d?s?u +?s?s?d?l?l?d +?s?s?l?d?l?d +?d?s?l?d?s?u +?d?u?s?d?u?s +?d?s?u?s?d?u +?u?d?s?l?s?d +?s?d?s?u?d?l +?s?d?d?d?l?l?s +?u?s?u?d?d?s +?u?d?l?l?u?d?l +?l?l?d?d?l?l?u +?d?u?l?l?l?u?d +?d?d?u?l?u?l?u +?d?u?u?d?u?u?u +?u?l?d?d?u?l?u +?d?d?l?d?l?s?d +?d?d?d?d?s?l?u +?u?d?d?l?d?d?s +?s?d?d?d?d?u?l +?d?l?d?l?s?d?d +?d?s?d?d?d?u?u +?d?d?d?s?l?d?l +?u?d?d?s?d?d?u +?l?d?d?d?l?s?d +?u?d?d?u?s?d?d +?s?l?d?l?d?d?d +?l?d?s?d?l?d?d +?l?l?d?d?d?s?d?d +?d?d?d?l?s?l?d +?u?d?d?d?d?u?s +?s?d?d?d?l?l?d +?d?l?d?d?l?l?l?d +?l?u?l?l?d?d?d?d +?d?u?u?d?d?d?d?d +?d?l?l?l?l?l?u +?s?l?u?l?u?d +?s?l?u?u?l?d +?l?l?u?l?s?d +?d?s?l?u?l?l +?s?u?u?u?d?u +?s?u?u?u?d?l +?u?d?s?l?l?l +?d?l?l?l?u?s +?u?u?u?s?u?d?d +?l?l?l?s?d?u +?l?l?d?l?s?u +?u?l?s?d?u?l +?u?l?d?u?l?s +?s?l?d?l?u?l +?u?l?s?u?d?u +?u?l?l?u?s?d +?u?l?l?d?u?s +?s?u?u?l?l?d +?l?s?d?l?l?u +?u?u?d?u?s?u +?d?u?s?l?l?l +?s?u?u?l?d?l +?s?d?u?l?u?l +?l?l?s?u?d?l +?u?l?d?l?s?l +?u?u?u?s?d?l +?u?s?l?d?l?u +?u?u?u?u?d?s?d +?d?u?s?u?u?u +?d?u?u?u?s?u +?u?d?l?l?s?u +?l?d?u?l?l?s +?u?s?l?d?u?l +?l?d?s?u?l?l +?l?u?l?d?l?s +?u?u?d?s?u?u +?d?l?l?u?l?s +?l?l?u?u?s?d +?u?u?l?d?s?l +?l?s?d?u?u?u +?u?l?s?u?l?l?l +?u?u?d?u?d?d?u +?l?d?l?u?l?d?d +?u?d?l?u?d?d?l +?u?l?u?d?d?d?l +?u?d?d?l?l?d?l +?d?u?d?u?d?u?u +?u?l?u?d?d?l?d +?u?l?d?u?l?d?d +?u?u?d?d?d?u?l +?d?u?d?d?u?l?l +?u?u?l?d?d?d?l +?s?d?l?l?l?d?s +?l?l?d?d?d?d?s?d +?l?d?d?l?l?l?d?l +?d?d?s?d?d?d?s?d +?s?l?l?l?l?l?d?d +?s?s?s?d?d?d?l +?l?s?s?s?d?d?d +?l?d?d?d?d?d?s?d +?u?s?s?s?s?s +?d?d?l?l?l?d?d?s +?u?l?l?l?s?l?l +?u?s?l?l?l?u +?s?u?l?l?l?l?l +?l?s?l?l?l?u +?u?l?l?u?s?u +?s?l?u?l?l?l +?u?l?s?u?l?u +?l?l?l?u?l?s +?l?l?s?l?l?u +?d?d?d?d?d?d?d?l?s +?d?l?d?l?d?l?l?d +?l?l?d?l?d?d?d?l +?l?s?s?l?l?s +?s?l?l?l?l?d?d?d +?u?l?l?d?u?l?d +?u?l?l?d?d?u?l +?s?u?l?l?l?d?d +?l?s?l?l?d?l?d +?d?l?l?l?d?l?s +?u?l?u?l?d?d?s +?s?u?u?u?u?d?d +?s?s?d?d?l?l?l +?d?d?d?u?l?l?d?d +?l?d?d?d?d?d?d?l?l +?d?d?s?l?l?l?l?l +?s?s?s?s?u?u +?d?l?l?l?d?d?l?d +?d?l?d?l?d?l?l?l +?l?l?s?s?l?l?l +?s?s?s?l?l?d +?s?s?d?l?l?s +?s?s?l?d?l?s +?s?s?s?d?l?l +?s?l?l?d?s?s +?l?s?l?d?s?s +?l?s?d?l?s?s +?s?l?s?l?d?s +?l?d?d?l?d?s?s +?l?l?l?l?l?d?s?d +?l?l?s?l?l?l?l?l +?l?d?l?l?d?d?l?l +?d?l?l?l?l?d?d?d?d +?l?l?d?d?l?d?s +?l?d?d?s?l?l?d +?s?l?d?l?l?d?d +?l?l?d?l?s?d?d +?l?l?d?l?d?d?s +?l?l?s?d?d?l?d +?l?d?s?l?d?l?d +?d?d?d?u?l?l?s +?l?l?l?d?d?d?s?s +?s?d?l?d?l?d?l +?s?s?u?l?l?l +?u?s?u?l?l?s +?u?u?u?l?d?d?d?d +?d?l?l?d?d?d?l?l +?d?l?l?l?d?d?l?l +?s?d?l?l?l?s?d +?d?l?l?s?l?l?l +?u?u?u?u?u?u?l +?u?s?u?l?l?d?d +?u?l?s?l?l?d?d +?l?d?l?s?l?l?d +?u?u?l?l?d?d?s +?u?l?l?l?l?d?d?s +?l?l?d?d?u?l?l +?l?d?l?d?d?l?l?l +?u?l?d?d?l?l?u +?u?l?l?d?d?u?u +?l?l?l?s?s?l?l +?s?d?u?d?d?d?d +?d?u?s?d?d?d?d +?d?u?d?d?d?s?d +?d?d?d?d?u?d?s +?d?s?d?d?d?l?d +?s?u?d?d?d?d?d +?d?d?u?d?d?d?s +?u?l?d?u?l?l?l +?u?u?u?d?d?u?u?u +?l?l?l?l?u?l?d +?u?l?l?l?d?d?d?s +?d?d?d?l?d?l?l?l +?l?l?l?l?l?l?s?d?d +?l?l?l?l?l?u?d?d +?s?d?d?s?l?l?l +?u?u?u?s?s?d?d +?u?l?l?d?d?l?l?l +?l?u?u?u?u?u?d?d +?u?u?u?l?l?d?d?d +?d?d?d?d?d?d?d?u?l +?u?l?l?l?l?l?s?d +?d?u?d?u?u?d?d +?d?u?d?d?d?u?u +?d?u?l?d?d?u?d +?d?u?d?l?l?d?d +?u?d?d?l?d?u?d +?d?u?d?l?u?d?d +?l?d?l?d?u?d?d +?l?u?d?d?d?d?u +?u?u?d?l?d?d?d +?d?u?d?d?u?u?d +?u?d?l?d?d?d?l +?l?d?d?d?d?l?u +?l?u?d?d?u?d?d +?d?l?d?d?d?u?l +?u?d?d?u?d?l?d +?d?d?l?d?d?u?u +?u?d?d?d?u?u?d +?d?l?d?u?l?d?d +?u?d?d?d?u?l?d +?l?d?d?l?d?l?l?l +?l?l?u?u?u?u?u +?d?l?l?u?l?l?l +?l?d?l?l?s?l?d +?l?s?l?d?l?d?l +?d?d?l?l?d?d?d?d?d +?u?s?l?l?l?l?d +?u?l?u?l?u?l?s +?u?l?l?d?d?d?d?l +?d?u?d?u?d?u?d?u +?d?d?l?d?l?l?l?l +?s?l?l?s?s?l +?s?u?u?u?s?s +?d?l?l?d?l?l?l?d +?d?s?d?d?d?s?d?d +?u?u?u?d?d?s?s +?d?l?d?l?l?d?d?l +?u?d?l?u?d?l?l +?u?d?d?l?l?d?u +?l?u?d?d?d?l?l +?u?d?d?u?u?d?u +?l?u?d?d?l?l?l +?d?l?l?u?l?l?d +?u?l?d?d?d?u?u +?u?d?d?u?d?l?l +?u?d?d?l?u?d?l +?u?l?d?d?l?d?u +?l?l?l?d?d?u?d +?d?d?d?l?u?l?l +?u?u?l?l?u?d?d +?d?d?d?d?l?l?l?u +?l?l?l?l?l?l?l?d?d?d +?d?d?d?s?l?l?s +?l?l?s?d?s?d?d +?l?l?s?l?l?s?d +?d?d?u?l?l?d?d?d +?l?l?l?d?l?d?d?l +?d?d?l?d?l?l?l?d +?d?d?s?u?s?s +?l?d?s?s?d?s +?s?l?d?d?s?s +?d?s?d?s?l?s +?l?d?s?d?s?s +?s?l?s?d?s?d +?s?l?s?s?d?d +?l?d?d?s?s?s +?s?s?s?u?d?d +?d?d?l?s?s?s +?s?s?d?d?l?s +?u?l?l?l?l?u?s +?u?u?u?u?u?l?d +?u?u?u?d?d?l?l?l +?l?s?s?l?l?l?l +?l?s?l?l?l?s?l +?l?l?l?d?l?d?s +?d?l?l?d?l?l?d?l +?d?d?s?d?d?s?u +?s?d?d?l?s?d?d +?u?d?d?s?d?d?s +?d?d?s?d?s?d?l +?d?d?d?l?s?s?d +?d?s?d?d?s?d?l +?u?d?s?d?s?d?d +?s?d?d?s?d?d?l +?d?d?d?d?u?s?s +?s?s?d?d?l?d?d +?d?s?d?d?s?l?d +?l?s?l?s?l?l?l +?u?l?u?d?d?d?d?d?d +?l?l?l?l?d?d?s?s +?l?d?d?d?d?d?d?d?u +?d?d?l?d?d?d?d?s +?d?d?s?d?d?l?d?d +?d?d?s?l?d?d?d?d +?s?d?d?d?d?d?d?u +?l?l?s?d?d?s?d?d +?u?s?d?l?l?s +?s?d?s?u?u?u +?s?s?l?d?l?l +?u?s?d?u?u?s +?l?d?s?l?l?s +?u?s?l?l?d?s +?s?l?l?s?d?u +?u?s?l?d?l?s +?l?l?d?s?s?l +?s?d?u?l?l?s +?s?u?s?u?d?l +?d?s?s?l?l?l +?d?u?u?u?s?s +?s?u?u?d?u?s +?s?u?l?l?d?s +?l?s?u?d?s?l +?u?s?d?s?u?u +?u?s?d?u?s?u +?u?u?l?d?s?s +?u?u?d?d?d?d?d?d?d?d +?d?u?u?l?l?l?l +?l?d?d?d?d?l?d?d?d +?d?u?d?d?u?d?d?d +?l?d?l?d?l?d?d?d?d +?d?d?u?l?l?d?d?d?d +?l?d?d?d?u?d?d?d +?d?l?l?d?d?l?l?l +?d?u?l?l?l?l?l?l +?s?l?l?d?l?d?d +?l?d?l?d?d?s?l +?u?l?s?l?d?d?d +?d?l?l?d?d?l?s +?l?l?d?d?l?s?d +?l?s?l?d?d?d?l +?l?d?s?l?l?d?d +?s?l?l?l?l?l?l?s +?l?l?l?l?d?d?d?d?s +?d?l?d?d?d?l?l?l +?d?l?l?d?l?d?d?l +?d?l?l?d?d?l?d?l +?d?l?d?l?d?d?l?l +?d?d?l?l?d?l?d?l +?d?l?d?d?l?l?l?l +?u?u?d?u?d?d?d?d +?d?s?s?s?s?s +?l?l?l?l?l?l?l?l?d?d +?u?u?s?u?l?l +?s?u?u?l?l?l +?d?l?s?l?l?l?l +?u?s?u?l?u?l +?u?u?u?l?l?s +?u?s?u?l?l?u +?u?u?u?u?s?l +?u?s?u?u?u?u?d +?l?l?s?u?u?u +?d?l?l?l?l?s?l +?s?l?l?u?l?l +?l?u?l?l?u?s +?u?s?u?u?l?l +?s?l?l?u?u?l +?l?l?u?l?l?s +?u?l?l?s?l?u +?d?d?s?d?d?s?l?l +?l?d?d?d?d?d?d?d?d?d?d +?d?s?d?d?s?d?d?d +?l?l?d?d?u?u?l +?d?l?l?l?l?d?u +?u?d?l?l?d?l?u +?u?u?u?d?d?d?u?u +?d?u?l?l?l?d?u +?d?d?d?d?d?d?s?l?l +?u?d?d?d?d?l?l?l +?u?l?l?u?s?s +?l?s?l?s?l?u +?u?u?l?l?s?s +?s?u?s?l?l?l +?u?s?l?s?l?l +?u?l?s?l?l?s +?s?u?l?l?u?s +?l?l?u?u?u?u?d +?s?s?s?l?l?s +?u?l?l?u?s?d?d +?s?d?l?l?l?l?d +?d?d?l?l?l?s?l +?l?l?l?l?u?d?d?d +?s?l?d?l?d?l?s +?u?u?u?d?u?u?u?u +?l?l?l?l?l?l?s?s +?d?l?d?l?l?d?l?l +?u?u?u?d?d?d?d?l +?d?d?l?l?d?l?l?l +?l?l?s?l?l?d?d?d +?d?d?l?l?l?l?d?l +?s?s?s?s?d?l +?d?l?l?l?s?l?l +?d?l?d?l?l?l?l?d +?d?d?s?d?d?l?l?l +?l?l?s?s?d?d?d?d +?s?d?l?l?l?l?l?l +?l?s?d?s?d?s?d +?l?l?d?l?d?d?l?l +?s?l?d?d?d?l?s +?s?l?s?s?l?l +?l?l?l?d?d?d?s?d +?d?l?l?l?d?l?d?l +?d?d?u?l?u?l?d?d +?d?l?d?d?l?d?l?l +?d?s?d?s?l?l?l +?l?d?l?d?l?s?s +?u?u?u?s?d?d?s +?l?l?s?l?s?d?d +?u?l?l?l?u?l?l?l +?l?d?l?l?l?s?d +?l?d?l?d?s?l?l +?l?l?s?l?d?d?l +?u?u?u?l?u?d?d +?d?d?l?l?l?u?u +?u?l?u?l?l?l?d?d +?l?u?u?l?l?d?d +?u?s?u?s?u?s?u +?l?s?l?l?l?s?d +?l?s?l?l?l?l?s +?u?d?l?l?l?d?d?d +?d?d?l?d?l?d?l?l +?d?d?d?d?s?d?d?s +?d?d?d?s?d?s?d?d +?l?l?s?l?d?l?l +?d?l?l?d?l?d?l?l +?d?d?l?l?l?s?d?d +?l?l?s?l?l?l?d?d +?d?d?d?d?u?l?l?d +?u?l?d?l?d?d?d?d +?d?u?u?u?u?u?u?d +?u?l?l?l?d?u?l +?l?l?l?l?d?l?u +?d?u?l?l?u?l?l +?l?l?d?d?d?d?d?d?s +?d?d?d?d?d?d?u?l?l +?d?l?d?d?d?l?s +?d?l?d?s?l?d?d +?l?d?d?d?d?u?s +?s?l?d?d?d?l?d +?l?d?d?d?s?d?l +?d?l?d?s?d?d?l +?d?d?u?u?d?d?s +?d?d?u?u?s?d?d +?l?d?d?d?s?l?d +?l?s?d?l?d?d?d +?u?s?d?d?u?d?d +?s?d?l?l?d?d?d +?d?d?u?s?d?d?l +?u?s?d?d?d?d?l +?l?s?d?d?l?d?d +?u?l?d?s?d?d?d +?d?d?d?l?d?l?s +?l?s?d?d?d?d?u +?s?d?d?u?u?d?d +?d?d?s?u?l?d?d +?l?d?s?d?d?d?l +?d?d?l?d?l?d?s +?u?d?d?d?d?s?u +?d?u?l?s?d?d?d +?d?d?l?s?d?l?d +?l?d?d?u?d?d?s +?s?d?l?d?d?l?d +?u?d?d?u?d?d?u?d?d +?l?l?l?d?s?l?l +?l?d?d?u?d?d?d?d +?u?l?l?l?u?u?u +?l?u?u?u?u?d?d?d +?u?d?l?u?d?l?d +?d?d?u?u?d?d?u?u +?u?l?d?d?l?u?d +?l?u?l?d?d?d?u +?d?l?u?l?u?d?d +?l?l?d?l?u?d?d +?u?d?u?d?l?d?l +?l?d?d?d?u?u?u +?d?d?l?d?l?l?d?l +?d?d?d?l?l?u?l +?l?d?d?l?d?u?u +?l?u?d?d?d?l?u +?l?d?u?d?l?d?l +?u?d?d?u?l?d?l +?d?u?u?d?u?d?u +?d?d?u?u?d?u?u +?u?d?l?d?u?l?d +?l?l?l?d?u?d?d +?u?d?d?d?u?l?u +?d?l?l?u?d?l?d +?l?l?d?d?d?l?u +?u?u?u?d?l?d?d +?u?d?u?l?u?d?d +?u?l?l?d?d?u?d +?l?l?l?d?u?u?u +?d?d?d?d?d?d?d?d?s?d +?d?u?l?l?l?l?s +?s?l?l?l?d?l?l +?u?d?l?l?l?l?d?d +?l?l?s?s?s?d?d +?l?l?l?l?l?s?l?l +?u?d?l?d?l?d?s +?s?d?d?d?u?u?u +?d?l?l?d?l?s?d +?d?d?u?l?l?l?s +?l?d?d?l?l?s?d +?l?d?d?l?s?l?l +?l?l?d?s?l?d?l +?l?l?d?s?l?d?d +?l?l?d?l?d?s?d +?u?l?s?u?l?d?d +?u?s?l?d?l?d?d +?s?u?l?l?d?d?d +?l?l?d?d?d?s?l +?d?l?l?d?l?d?s +?d?l?l?s?l?d?d +?u?u?l?d?d?d?s +?l?l?d?d?l?s?l +?s?s?s?l?d?d?d +?u?d?u?d?u?d?d?d +?d?d?d?d?d?l?u?l +?u?s?u?d?d?d?d?d +?d?l?d?l?l?l?d?l +?u?l?l?u?l?l?s +?l?l?l?l?d?s?l +?l?u?l?d?u?u +?l?u?l?u?l?u?d +?u?d?u?d?l?l?l +?l?l?l?l?d?u?u +?s?l?l?l?l?d?l +?d?d?l?l?u?u?u +?d?l?l?l?l?d?d?l +?l?d?u?u?l?u +?l?l?d?d?l?u?l +?u?u?l?l?d?d?l +?l?l?l?l?s?l?d?d +?d?d?d?d?s?s?s?s +?d?s?d?s?s?d?d +?u?l?u?u?d?d?d?d +?s?d?s?d?d?d?d?d +?l?l?d?d?d?l?d?d?d +?l?l?l?s?l?s?d +?l?s?s?s?l?d +?l?s?s?l?d?s +?l?s?s?s?d?l +?l?s?s?d?l?s +?l?l?s?s?d?s +?l?d?s?l?s?s +?s?l?l?s?d?s +?s?u?l?s?d?s +?u?s?u?s?d?s +?l?u?d?s?s?s +?d?l?l?s?s?s +?s?s?l?s?l?d +?d?l?s?l?s?s +?l?l?s?d?s?s +?l?l?l?l?l?l?s?l +?d?l?l?l?l?l?l?l?l +?l?l?l?s?l?l?d?d +?d?d?d?l?d?d?d?s +?u?d?d?s?d?d?d?d +?d?d?l?d?d?s?d?d +?u?u?s?s?d?d?d +?u?d?l?l?d?l?d?d +?u?d?d?l?l?l?d?d +?u?l?u?l?u?l?l +?d?d?d?s?d?d?d?d?l +?s?l?u?l?u?s +?u?l?s?l?s?l +?l?l?l?u?s?s +?s?u?u?u?s?u +?l?l?d?d?d?d?d?l?l +?l?l?l?d?d?d?l?l?l +?u?d?l?d?d?l?d?d +?l?l?l?s?l?l?s +?l?s?l?d?l?l?d +?s?l?d?l?l?d?l +?s?d?d?u?u?u?u +?d?s?d?u?u?u?u +?d?d?u?u?u?u?s +?l?d?d?l?l?s?l +?u?u?u?s?l?l?l +?s?u?s?u?u?s +?s?s?l?l?s?l +?u?d?l?l?l?l?s +?l?l?d?d?u?u?d?d +?s?l?d?l?l?d?s +?u?l?l?d?d?s?s +?l?d?d?d?d?l?d?d?d?d +?d?d?d?d?l?l?d?d?d?d +?u?l?u?s?d?d?d?d +?u?l?l?l?l?l?l?s +?l?d?d?l?d?d?d?d?d +?d?d?d?d?d?d?l?l?s +?l?l?u?l?d?d?d?d +?u?s?l?u?l?u +?l?l?u?u?u?s +?l?l?l?s?l?u +?u?l?u?s?u?l +?l?l?u?s?l?l +?u?l?u?s?l?l +?u?l?u?s?l?u +?u?l?l?u?u?s +?u?u?l?l?u?s +?d?l?l?l?l?s?s +?l?l?l?l?l?s?d?d?d +?l?l?u?d?d?l?l +?d?u?l?l?l?d?l +?u?l?d?l?d?l?u +?d?d?u?l?u?l?l +?d?d?d?l?l?l?l?d?d +?l?l?l?s?l?d?d?d +?d?s?d?s?d?s?l +?u?s?u?s?s?s +?s?l?l?s?s?s +?d?d?s?l?l?s?d?d +?s?d?l?l?l?l?s +?d?d?u?d?u?d?d?d +?u?d?d?d?d?d?u?d +?u?d?d?d?d?d?u?u +?d?d?d?d?d?u?d?u +?d?d?d?l?d?d?d?u +?u?u?d?d?d?u?d?d +?l?l?d?d?l?d?d?d?d +?d?d?d?d?u?d?u?d +?l?d?d?d?d?d?u?l +?d?u?d?u?d?d?d?d +?l?d?d?d?d?u?d?d +?d?d?u?d?d?d?d?l +?l?l?d?l?s?l?l +?l?l?d?l?l?s?l +?d?d?s?s?d?d?d?d +?l?l?l?s?l?s?l +?l?d?l?l?d?s?s +?l?s?l?d?d?d?d?d?d +?d?l?l?d?l?s?l +?u?l?l?s?l?d?d +?l?s?l?l?d?d?l +?d?l?l?d?l?l?s +?l?s?d?l?l?l?d +?d?l?d?l?l?l?s +?d?d?s?d?d?d?d?d?d?d +?u?s?l?l?d?d?d?d +?l?l?l?l?d?d?d?u +?u?l?l?u?l?l?u +?s?d?d?d?d?d?l?l +?l?l?l?d?l?s?l +?l?d?l?u?l?l?l +?u?u?l?l?u?u?d +?l?l?l?l?s?s?d?d +?d?s?d?s?d?l?d +?d?d?d?s?d?s?l +?d?s?l?d?d?d?s +?s?l?d?s?d?d?d +?d?d?s?d?l?s?d +?s?s?d?d?d?l?d +?d?l?d?s?s?d?d +?u?s?s?d?d?d?d +?l?d?d?d?s?s?d +?l?d?d?s?d?s?d +?d?s?d?l?d?s?d +?l?s?l?l?s?l?l +?u?l?l?l?d?l?l?l +?d?d?d?d?l?l?u?u +?s?l?l?l?l?l?l?l +?d?d?l?s?d?d?d?d +?d?l?d?s?d?d?d?d +?l?d?s?d?d?d?d?d +?u?u?u?u?u?l?l +?l?s?l?l?l?l?l?l +?s?l?d?d?l?l?d +?l?d?l?d?s?d?l +?s?l?d?d?d?l?l +?d?l?d?l?s?d?l +?l?d?d?d?l?s?l +?d?l?l?s?d?l?d +?s?d?d?l?l?l?d +?l?d?d?l?s?l?d +?d?d?d?s?l?u?l +?l?l?s?d?l?d?d +?l?l?u?s?d?d?d +?l?d?s?d?d?l?l +?d?l?d?d?l?l?s +?l?s?l?d?d?l?d +?d?l?d?l?l?d?s +?s?l?l?d?l?l?l +?l?l?s?l?s?l?l +?u?u?d?d?u?d?d?d +?u?u?d?d?d?d?d?l +?u?d?d?u?d?d?u?d +?d?d?d?d?d?l?l?u +?l?l?l?d?d?d?d?l?l +?l?l?l?s?l?l?l?d +?l?d?l?l?l?l?u +?s?u?u?u?d?d?s +?u?s?d?d?d?s?u +?u?l?l?s?s?d?d +?u?l?d?d?d?s?s +?l?d?d?d?l?s?s +?l?l?d?d?s?s?d +?l?s?l?d?d?s?d +?l?s?l?d?s?d?d +?u?l?s?s?d?d?d +?l?d?d?d?s?s?l +?d?d?d?l?s?l?s +?d?s?d?d?s?l?l +?u?l?l?d?d?d?d?u +?u?d?d?d?d?u?u?u +?d?d?u?u?u?d?d?d?d +?u?u?u?u?d?u?u?u +?d?u?d?l?l?l?l +?u?l?d?d?l?u?u +?u?l?d?u?d?l?l +?d?d?u?u?u?l?l +?d?u?l?u?l?u?d +?l?u?l?d?l?d?l +?u?l?d?u?l?d?u +?l?u?u?u?l?d?d +?u?l?l?u?d?l?d +?l?l?d?d?u?l?u +?l?d?l?l?l?d?u +?d?d?l?u?u?u?u +?u?l?u?d?d?u?l +?u?u?d?d?d?d?d?s +?l?l?l?l?l?u?s +?u?l?l?u?d?s +?d?s?l?u?u?u +?l?l?d?s?l?u +?l?u?l?l?s?d +?l?d?l?u?s?l +?l?l?l?s?u?d +?s?d?l?l?l?u +?l?l?s?l?d?u +?u?d?u?u?s?l +?s?l?l?d?u?u +?s?l?l?d?u?l +?l?u?u?u?d?s +?s?d?l?u?u?l +?u?d?s?u?u?l +?l?l?l?d?u?s +?d?l?l?u?s?l +?u?l?d?l?u?s +?d?s?l?u?l?u +?l?u?l?s?l?d +?l?s?u?l?d?l +?u?u?u?s?l?d +?d?l?s?l?l?u +?s?l?l?d?l?u +?l?l?u?d?l?s +?l?s?l?d?u?l +?u?l?l?s?d?u +?l?u?u?d?u?s +?u?u?u?l?s?d +?d?l?l?s?u?u +?u?d?u?l?u?s +?u?l?s?d?u?u +?d?u?l?s?u?l +?d?l?u?l?u?s +?d?u?s?l?u?u +?u?u?l?l?d?s +?u?d?l?s?u?l +?u?l?u?d?u?s +?l?u?s?l?u?d +?s?d?u?l?u?u +?u?s?u?d?u?l +?s?l?l?l?d?u +?l?u?u?s?l?d +?d?s?u?l?l?u +?s?l?d?u?l?l +?s?d?l?u?l?l +?d?d?s?u?l?l?l +?u?d?u?s?u?u +?l?l?s?d?l?u +?u?l?d?u?s?u +?u?l?d?s?l?u +?u?d?s?l?u?l +?u?s?l?l?u?d +?u?u?u?u?s?u?d +?s?u?d?l?l?l +?s?u?l?d?l?l +?d?l?s?l?u?l +?s?l?l?d?d?l?l +?l?u?d?s?l?l +?s?l?l?u?d?l +?u?l?u?u?d?s +?s?l?d?l?l?l?l +?l?u?u?d?l?s +?u?u?u?l?d?s +?u?u?l?u?s?d +?l?d?u?s?l?l +?s?l?l?d?l?l?s +?l?u?d?u?l?s +?u?s?l?u?l?d +?l?l?l?d?s?u +?l?l?u?u?s?d?d +?l?s?u?u?l?d +?l?u?l?s?d?l +?s?u?u?d?u?u +?u?u?u?d?s?u +?l?d?u?u?l?s +?u?u?u?d?l?s +?l?s?l?d?d?l?l +?u?d?u?u?l?s +?u?u?d?d?u?u?s +?l?u?s?d?l?u +?l?u?s?d?l?l +?l?u?s?l?l?d +?u?l?l?l?d?l?s +?u?l?s?l?u?d +?s?u?l?u?d?u +?d?l?u?u?u?s +?u?d?l?u?s?u +?u?d?u?l?s?l +?l?s?d?u?l?l +?s?u?u?d?l?l +?d?l?u?l?s?l +?d?u?l?u?l?s +?l?u?s?l?d?l +?l?l?d?s?u?l +?u?s?l?l?d?u +?s?d?u?u?l?u +?l?d?l?u?l?s +?u?l?d?u?u?s +?u?s?l?u?d?l +?d?s?u?u?l?l +?d?l?s?u?u?u +?u?l?u?u?s?d +?u?l?s?d?l?l +?d?u?l?s?l?l +?s?l?l?u?u?d +?l?s?d?s?l?s?d +?u?d?u?l?d?d?u +?l?d?l?d?d?l?u +?u?d?l?d?d?l?l +?d?u?l?u?d?d?l +?l?d?u?l?l?d?d +?d?l?l?d?u?u?d +?u?u?d?d?l?d?l +?d?u?d?u?u?d?u +?u?d?d?l?u?d?u +?l?d?l?u?d?d?l +?d?u?d?l?l?l?d +?d?d?u?d?u?u?u +?l?l?u?d?d?l?d +?l?l?u?d?l?d?d +?l?u?d?l?l?d?d +?u?l?l?d?u?d?d +?l?d?u?d?d?u?l +?d?u?d?u?u?u?d +?u?d?d?l?u?l?d +?l?u?l?d?l?d?d +?l?d?l?d?u?d?l +?d?l?l?u?u?d?d +?d?d?u?d?l?l?l +?u?d?d?u?l?l?d +?u?d?d?d?l?l?u +?u?d?u?l?d?u?d +?l?u?u?l?d?d?d?d +?l?u?d?d?d?u?l +?d?l?l?u?l?d?d +?d?l?l?d?l?d?u +?l?u?d?l?u?d?d +?l?d?u?d?l?u?d +?u?d?l?u?l?d?d +?l?d?d?d?l?l?u +?d?d?d?l?u?l?u +?d?u?l?u?l?d?d +?d?d?u?u?l?l?d +?d?l?u?d?l?u?d +?u?l?u?d?d?u?d +?d?d?d?d?s?u?u?u +?u?l?l?d?d?u?l?l +?s?l?l?d?d?d?d?s +?d?d?d?d?l?l?s?s +?d?l?l?d?d?d?d?d?d +?d?d?d?l?d?d?d?d?l +?d?l?s?s?s?s +?l?s?s?s?s?d +?l?s?s?d?s?s +?s?l?d?s?s?s +?u?s?s?s?s?d +?l?s?d?s?s?s +?u?l?u?l?l?d?d?d +?d?u?u?u?u?u?d?d +?u?u?d?u?l?l?l +?s?s?s?l?l?l?l +?s?l?d?l?l?l?s +?s?d?d?s?d?d?d?d +?u?u?u?u?u?u?s?d +?l?l?l?l?d?l?l?l?l +?d?d?s?d?s?d?d?l +?d?l?d?d?l?l?d?l +?l?l?l?s?s?s?s +?u?s?l?s?l?s +?d?d?l?l?l?l?l?s +?l?l?l?s?d?d?d?d?d +?l?d?l?s?d?d?d?d +?d?d?l?s?s?l?l +?l?d?s?l?d?s?l +?l?l?l?d?s?d?s +?l?u?u?d?d?d?d?d +?l?l?s?d?s?l?l +?d?d?d?d?d?d?l?d?l +?l?d?l?d?l?d?l?d?l +?l?d?d?d?s?d?d?d?d +?d?d?d?d?u?u?u?u?u +?d?u?l?l?l?l?u +?l?l?d?u?l?l?l +?d?d?d?d?d?l?l?l?l?l +?l?l?s?l?l?l?s +?u?d?l?l?l?l?l?l +?u?l?l?l?l?d?d?l +?d?u?l?l?l?l?l?d +?u?l?l?d?l?l?l?l +?s?l?u?u?l?s +?s?u?u?s?u?u +?u?s?u?l?u?s +?l?u?l?u?s?s +?l?s?u?s?l?l +?u?s?l?l?s?u +?u?l?s?u?s?u +?l?l?u?s?s?l +?u?l?l?s?l?s +?l?s?l?l?s?u +?l?l?u?u?s?s +?u?s?u?s?u?l +?l?l?l?d?s?s?s +?d?d?d?d?d?s?s?l +?l?d?d?s?d?s?d?d +?u?l?l?l?d?d?l?l +?s?l?l?s?d?d?d?d +?d?l?d?l?s?l?l +?s?l?d?d?l?l?l +?l?d?l?l?d?s?l +?u?d?l?l?d?l?s +?l?u?l?l?s?d?d +?u?d?d?s?u?u?u +?l?l?s?l?d?l?d +?d?l?l?s?l?l?d +?l?d?s?l?d?l?l +?l?d?l?l?s?d?l +?u?l?d?d?l?l?s +?s?d?l?l?l?d?l +?d?d?d?l?u?d?d?d +?d?d?d?d?l?u?d?d +?d?d?d?d?d?d?d?d?u?u +?d?u?d?d?d?u?d?d +?d?d?l?d?d?d?d?u +?d?d?d?u?d?u?d?d +?d?d?d?d?u?d?d?u +?d?d?d?d?u?d?d?l +?d?d?d?u?d?d?d?l +?l?d?d?d?d?d?u?d +?d?l?d?u?d?d?d?d +?d?s?d?s?d?s?s +?s?s?s?s?s?u +?u?d?l?u?d?l?u +?l?d?l?u?l?l?d +?u?l?u?l?d?d?l +?l?l?d?l?l?d?u +?l?l?l?d?d?l?u +?u?u?d?l?l?l?d +?u?d?l?l?l?d?u +?d?d?u?u?u?u?l +?d?l?l?d?l?l?u +?u?l?d?u?l?u?d +?l?d?d?u?l?l?l +?u?l?l?d?d?l?u +?l?u?l?u?u?d?d +?s?u?u?u?u?u?d +?l?l?l?s?s?s?d +?l?l?u?u?l?l?l +?d?d?l?l?d?d?d?s +?d?d?d?d?d?l?d?s +?d?d?d?d?l?s?d?d +?d?d?d?d?s?l?d?d +?d?d?d?l?s?d?d?d +?s?d?s?l?l?l?l +?l?l?d?l?l?s?s +?u?l?u?d?l?l?l +?l?l?d?l?l?l?u +?d?l?l?l?l?u?u +?d?u?l?l?l?l?d?d +?u?l?l?l?s?u?l +?l?l?s?d?d?s?l +?d?d?d?u?u?l?d +?u?d?d?d?l?d?u +?u?l?d?d?d?u?d +?l?d?d?u?d?u?d +?u?u?d?d?d?l?d +?l?d?u?d?d?d?l +?d?u?u?l?d?d?d +?l?d?d?d?d?u?u +?d?d?d?l?d?u?u +?d?d?u?l?d?d?l +?d?l?d?u?u?d?d +?d?l?d?d?l?d?u +?d?l?d?d?u?d?u +?d?u?l?d?d?d?u +?l?d?d?d?u?u?d +?u?l?d?u?d?d?d +?d?l?d?u?d?d?l +?d?d?d?l?l?u?d +?d?u?l?d?d?l?d +?u?d?l?d?d?d?u +?l?u?d?d?d?l?d +?d?d?d?u?l?d?u +?d?d?l?d?d?l?u +?d?d?u?d?l?d?u +?d?d?u?d?l?d?l +?d?d?d?u?d?l?l +?l?d?d?l?d?u?d +?u?d?l?d?d?u?d +?d?d?d?l?l?d?u +?d?d?l?u?d?u?d +?d?d?u?d?d?l?u +?d?d?l?l?d?u?d +?d?d?l?u?d?d?u +?l?d?u?d?d?l?d +?d?l?d?d?d?u?u +?d?d?l?u?d?d?l +?d?d?d?u?l?u?d +?l?u?d?l?d?d?d +?d?l?d?d?u?l?d +?l?d?d?u?u?d?d +?u?d?u?d?d?l?d +?d?d?l?u?d?l?d +?d?l?d?u?d?d?u +?l?u?d?d?d?u?d +?d?l?l?d?u?d?d +?l?d?u?d?d?u?d +?l?d?l?d?d?d?u +?d?u?l?d?l?d?d +?u?d?d?d?l?u?d +?u?d?u?d?d?d?l +?l?d?u?l?d?d?d +?l?d?d?d?u?l?d +?u?d?l?d?d?u?d?d +?d?l?l?d?d?d?u +?d?l?d?l?d?u?d +?d?l?d?l?d?d?u +?d?d?d?u?d?u?l +?u?d?d?d?u?d?l +?d?l?l?u?d?d?d +?l?d?d?u?d?l?d +?d?d?u?u?d?l?d +?l?d?d?d?u?d?l +?d?d?s?d?d?s?d?d?l +?s?d?d?d?d?d?d?d?d?d +?u?l?l?u?l?u?l +?d?d?d?s?d?d?s?d?d +?l?l?s?d?d?d?d?s +?s?d?d?s?s?d?d +?s?s?d?d?d?s?d +?d?d?s?d?s?d?s +?d?d?s?s?d?d?s +?s?d?d?d?d?s?d?d +?d?d?s?d?d?d?d?s +?d?d?d?d?d?s?s?d +?l?l?l?l?d?u?l +?u?u?u?u?u?u?u?u?d +?s?l?l?l?l?d?d?s +?d?d?l?l?l?l?d?d?d +?u?u?d?d?d?s?s +?d?d?d?l?s?s?l +?d?l?d?l?d?s?s +?u?s?u?s?d?d?d?d +?s?u?u?d?d?d?s +?s?d?l?d?l?d?s +?s?u?u?s?d?d?d +?l?s?d?l?s?d?d +?s?u?s?u?d?d?d +?s?s?s?s?s?s?s +?u?l?l?l?l?d?l?l +?u?u?u?u?d?d?d?u +?d?d?d?d?d?d?u?d?d +?u?u?u?u?s?s?s +?d?s?u?u?u?u?u +?s?d?d?d?d?l?l?l +?d?d?s?l?l?l?d?d +?u?l?l?l?l?l?d?s +?u?u?u?u?d?d?d?s +?d?l?s?l?l?l?d +?s?d?l?d?l?l?l +?u?u?l?l?s?d?d +?l?l?l?d?l?s?d +?l?l?l?s?s?d?d?d +?d?u?u?u?u?d?d?d +?d?s?d?s?d?s?d?s +?u?d?u?s?s?u +?d?s?u?u?u?s +?s?u?d?u?l?s +?l?l?s?u?s?d +?u?s?l?s?l?d +?l?s?l?u?d?s +?u?d?u?l?s?s +?l?u?l?d?s?s +?u?l?s?l?s?d +?s?u?d?u?u?s +?u?s?u?u?d?s +?d?s?s?u?u?u +?s?s?d?u?l?u +?s?d?l?l?s?l +?u?s?u?d?s?u +?s?u?l?d?s?l +?l?s?s?d?l?l +?s?l?d?l?u?s +?s?l?l?s?d?l +?u?s?s?l?d?l +?u?s?l?d?s?l +?u?s?u?d?u?s +?l?d?l?s?s?u +?l?l?d?u?s?s +?u?s?s?l?l?d +?d?s?l?s?l?l +?u?d?l?s?l?s +?s?s?l?l?u?d +?l?u?s?d?l?s +?l?s?u?s?l?d +?u?l?l?s?s?d +?u?l?s?l?d?s +?s?u?s?u?d?u +?u?l?d?l?s?s +?l?u?s?d?u?s +?l?u?l?s?s?d +?s?l?u?d?l?s +?u?u?s?s?u?d +?l?l?u?s?d?s +?d?s?l?l?s?l +?d?u?s?u?s?u +?u?s?l?l?s?d +?s?d?u?u?u?s +?s?s?u?u?l?d +?u?s?s?u?d?l +?s?d?u?l?s?l +?s?l?l?d?s?l +?s?u?u?u?s?d +?l?s?u?u?d?s +?s?u?l?u?d?s +?s?s?u?u?u?d +?s?u?u?l?d?s +?l?d?s?l?s?u +?s?u?d?l?s?u +?u?d?s?l?s?u +?u?l?u?d?s?s +?u?s?u?u?s?d +?u?l?u?s?s?d +?s?l?l?l?d?l?s +?u?l?s?d?l?s +?d?l?l?l?u?u?u +?u?l?l?u?u?u?d +?u?l?l?l?s?s?s +?l?s?d?d?d?l?l +?l?l?u?d?d?d?s +?d?l?d?s?l?d?l +?u?l?d?d?s?l?d +?l?d?d?s?l?d?l +?l?s?d?d?l?l?d +?l?u?l?d?d?d?s +?d?d?l?d?l?l?s +?u?d?u?s?d?u?d +?d?u?d?u?d?u?s +?d?l?l?l?d?s?d +?d?l?s?l?d?l?d +?u?d?s?l?l?d?d +?u?l?d?s?d?d?l +?l?d?s?d?l?d?l +?d?s?l?l?d?d?l +?d?d?d?d?u?l?l?s +?u?l?d?d?l?d?s +?u?d?d?s?d?u?u +?u?d?l?l?s?d?d +?u?l?l?d?d?s?d?d +?l?d?d?l?d?s?l +?u?d?d?d?u?u?d?d +?u?u?d?d?d?d?u?d +?u?d?d?u?u?d?d?d +?u?d?d?l?d?l?d?d +?u?l?d?d?d?d?d?l +?s?s?s?d?s?s +?s?s?d?s?s?s +?l?u?l?l?s?u +?l?s?l?u?l?l +?u?u?s?u?l?u +?s?l?u?u?l?l +?u?u?l?s?l?l +?u?u?u?u?l?s +?l?l?u?l?u?s +?s?u?l?l?l?l?d +?u?l?u?u?l?s +?s?l?l?l?u?l +?u?l?s?l?l?l?d +?l?s?l?l?u?u +?u?s?l?u?l?l +?l?s?l?u?u?u +?u?u?l?l?s?l +?s?u?u?u?u?l +?l?l?u?u?l?s +?u?l?s?l?l?u +?u?l?s?l?u?u +?l?l?s?l?u?l +?u?u?l?l?l?l?s +?u?u?u?s?u?l +?s?l?u?u?u?u +?l?l?u?u?s?l +?l?s?u?u?l?l +?s?u?l?u?l?u +?d?d?d?d?d?d?s?s?s +?s?l?l?l?d?d?d?s +?s?d?s?d?s?d?s +?s?s?s?s?d?d?d?d +?s?s?s?d?d?d?s +?u?d?l?u?l?d?l +?u?d?l?l?d?u?l +?u?l?u?d?d?l?u +?u?l?l?d?d?d?l?l +?u?d?l?d?l?l?u +?d?u?l?l?d?l?l +?u?l?l?u?l?d?d?d +?l?l?l?l?d?u?d +?u?l?d?l?l?d?u +?d?d?l?u?u?l?l +?u?d?l?d?u?l?l +?u?u?l?u?l?d?d +?l?d?d?u?u?u?u +?u?l?u?l?d?d?u +?u?l?u?l?d?l?d +?l?l?u?l?u?d?d +?u?u?u?u?d?l?d +?u?l?l?u?l?l?l?d +?u?d?l?d?l?l?d?d +?d?d?u?u?l?l?d?d +?d?d?d?d?l?l?l?l?d +?d?d?d?u?d?d?d?d?d +?u?u?u?u?u?u?u?s +?u?u?u?u?u?u?u?u?u +?u?l?l?l?u?l?d?d +?u?u?u?u?l?l?d?d +?l?l?d?l?l?d?d?d?d +?d?d?d?d?d?d?d?d?d?d?l +?d?d?l?l?s?s?s +?s?s?s?l?l?d?d +?u?s?l?d?d?d?d?d +?d?d?d?d?d?u?l?s +?u?l?l?l?l?l?d?l +?d?d?d?d?d?d?d?l?u +?u?l?l?l?d?l?d?d +?l?d?l?l?l?d?d?d?d +?l?l?l?d?l?l?u +?u?l?u?u?l?u?d +?u?l?l?d?l?l?u +?u?l?l?u?d?l?l +?l?d?u?l?l?l?l +?u?u?u?u?d?l?l +?d?u?u?u?u?u?s +?d?s?u?l?l?l?l +?s?d?d?d?l?l?l?l +?d?d?d?d?s?u?l?l +?u?u?u?d?d?s?d?d +?l?s?l?l?s?l?d +?s?s?l?l?l?l?d +?u?l?l?d?l?l?d?d +?l?s?d?d?d?d?s?l +?u?s?l?s?s?l +?u?s?u?s?s?u +?u?s?l?l?s?s +?s?s?u?u?u?s +?u?s?u?s?l?s +?u?l?l?l?d?d?d?l +?u?u?u?l?l?l?l?d +?d?d?s?l?s?l?l +?s?l?l?d?d?l?s +?d?l?l?l?d?s?s +?d?s?d?d?d?d?d?l +?s?d?d?l?d?d?d?d +?d?l?s?d?d?d?d?d +?d?d?d?d?l?d?d?s +?l?l?l?d?s?d?d?d +?l?l?s?d?l?l?d +?d?l?d?s?l?l?l +?l?d?s?l?l?l?d +?l?l?l?d?s?l?d +?u?d?d?l?l?l?s +?l?l?l?u?s?d?d +?l?d?s?d?l?l?l +?s?l?l?l?d?d?l +?d?s?l?l?l?l?d +?u?l?d?d?d?d?d?d?d?d +?u?u?u?d?d?d?l?l +?u?l?d?l?l?l?d?d +?u?d?u?u?u?d?d?d +?d?d?u?l?l?u?d?d +?u?d?u?d?l?d?l?d +?d?u?l?l?l?d?d?d +?u?u?u?d?u?d?d?d +?u?d?u?u?d?u?d?d +?s?s?d?d?d?d?d?d?d +?d?d?d?d?d?s?d?s +?u?d?s?d?d?s?d?d +?u?s?d?l?l?l?l +?u?u?u?u?u?d?d?u +?l?d?d?d?l?d?d?d?l +?d?d?d?d?d?u?u?l +?u?u?d?l?d?d?d?d +?u?d?d?l?l?d?d?d +?l?d?d?d?d?d?u?u +?d?d?d?s?d?d?d?d?d?d +?l?s?l?s?l?d?d?d +?d?l?l?l?u?l?l +?u?l?u?l?l?u?d +?d?u?u?u?l?l?l +?u?u?u?u?u?d?l +?l?l?d?u?u?u?u +?u?u?l?l?l?u?d +?d?u?l?u?l?l?l +?l?d?l?d?s?s?s +?s?l?l?l?l?s?d?d +?l?l?d?d?d?d?l?l?l +?u?l?u?l?l?l?s +?s?l?l?l?l?s?s +?u?u?u?d?u?u?u?d +?d?u?d?d?u?s?d +?s?d?d?l?d?d?l +?s?u?d?d?d?d?u +?d?d?u?d?d?u?s +?d?d?d?d?l?u?s +?l?d?d?l?d?s?d +?s?d?u?l?d?d?d +?d?d?u?l?d?d?s +?l?d?d?s?d?l?d +?d?l?d?l?d?d?s +?u?d?s?l?d?d?d +?l?d?u?d?d?s?d +?u?d?d?s?l?d?d +?d?d?l?l?d?s?d +?d?l?l?d?d?s?d +?d?l?l?s?d?d?d?d +?u?d?d?s?d?d?l +?l?u?d?s?d?d?d +?d?d?d?u?u?d?s +?d?d?s?l?d?d?l +?d?d?d?u?u?s?d +?s?l?u?d?d?d?d +?d?s?l?l?d?d?d +?d?d?u?s?d?d?u +?d?d?s?u?u?d?d +?d?u?d?s?d?u?d +?d?d?d?s?d?u?l +?d?d?d?s?l?u?d +?u?d?d?d?s?u?d +?d?d?d?l?l?d?d?s +?s?d?d?l?d?l?d +?u?s?d?d?d?d?u +?d?d?s?d?d?u?l +?d?l?d?d?l?s?d +?u?d?u?d?d?d?s +?d?d?s?d?l?l?d +?u?d?l?s?d?d?d +?d?d?d?l?s?d?l +?l?d?s?d?d?l?d +?s?d?d?d?l?d?l +?d?l?d?d?s?l?d +?l?s?d?d?u?d?d +?d?d?s?l?d?l?d +?s?d?d?u?d?d?u +?u?d?d?u?d?s?d +?d?d?s?d?l?d?l +?d?s?d?l?d?l?d +?d?d?d?d?l?s?u +?u?d?s?d?d?l?d +?d?d?d?d?u?s?l +?u?d?s?d?u?d?d +?d?s?d?d?l?d?l +?d?d?d?s?u?d?u +?s?l?d?d?u?d?d +?d?d?u?u?d?s?d +?s?d?d?d?d?l?u +?d?u?d?s?d?l?d +?l?d?d?s?u?d?d +?d?d?d?u?s?u?d +?d?u?s?d?d?d?u +?s?u?d?d?l?d?d +?d?u?u?d?s?d?d +?u?d?l?d?s?d?d +?s?u?d?l?d?d?d +?s?s?s?d?d?d?d?d +?d?d?d?u?u?d?d?d?d +?d?d?l?d?d?u?d?d +?u?s?u?s?u?s?d +?u?l?l?l?l?l?u?d +?l?l?l?d?l?s?s +?l?l?l?l?s?u?s +?l?l?s?l?l?s?l +?u?u?l?l?l?l?l?d +?u?d?l?u?u?d?d +?l?d?u?l?d?l?d +?u?d?u?l?d?d?l +?u?d?l?d?d?l?u +?d?u?d?u?l?u?d +?d?u?l?d?l?u?d +?d?u?u?d?d?u?u +?l?d?u?u?d?u?d +?u?d?d?u?u?l?d +?l?d?l?u?u?d?d +?l?l?u?d?u?d?d +?d?u?u?u?d?d?u +?l?d?d?d?u?l?u +?u?d?u?d?l?d?u +?l?l?d?l?d?d?u +?l?u?d?d?u?u?d +?d?u?l?d?d?u?u +?u?d?d?l?d?u?l +?u?l?d?u?d?d?l +?u?l?d?l?l?d?d?d +?l?d?l?d?l?u?d +?l?u?d?d?l?d?l +?u?u?d?l?d?l?d +?u?u?l?d?u?d?d +?u?d?d?d?l?u?u +?l?u?d?d?u?l?d +?l?d?l?d?u?d?u +?l?d?l?l?d?u?d +?d?l?d?u?u?d?l +?d?u?u?d?l?l?d +?d?d?u?l?d?u?l +?u?u?d?d?u?l?d +?u?l?d?l?d?d?u +?u?d?u?d?d?l?l +?u?d?l?d?u?d?u +?d?u?u?l?l?d?d +?u?d?l?d?l?u?d +?l?d?l?d?d?u?l +?u?u?d?u?l?d?d +?l?d?d?l?l?d?u +?d?l?u?u?l?d?d +?d?u?d?l?d?l?u +?l?l?d?d?u?d?l +?d?d?l?l?l?d?u +?u?l?d?l?d?u?d +?l?u?d?d?d?u?u +?u?u?l?d?d?l?d +?u?d?l?d?d?u?u +?u?d?l?d?d?u?l +?d?l?l?d?d?u?l +?d?u?l?d?l?l?d +?d?l?u?d?l?d?l +?l?u?d?l?d?d?l +?l?d?l?u?d?l?d +?u?l?l?d?l?d?d?d +?l?u?d?l?d?l?d +?d?d?l?u?d?l?u +?d?l?l?d?d?l?u +?l?d?u?u?l?d?d +?d?d?d?u?l?u?u +?l?d?d?l?u?l?d +?u?d?d?d?u?u?l +?l?l?d?d?d?u?l +?d?u?l?d?l?d?u +?d?l?u?d?l?l?d +?d?l?u?l?d?l?d +?d?u?l?u?d?d?u +?d?l?d?l?l?d?u +?u?l?d?d?d?d?l?u +?l?d?d?d?u?l?l +?l?u?d?d?l?d?u +?u?l?d?u?d?l?d +?l?d?u?u?u?d?d +?l?l?d?u?l?d?d +?u?d?d?l?d?l?u +?d?d?u?u?u?d?u +?d?l?l?u?d?d?l +?d?d?u?u?d?l?l +?u?u?u?d?d?l?d +?d?u?u?u?l?d?d +?d?d?u?l?d?l?l +?u?u?u?u?d?d?u?u +?l?l?u?l?l?l?d?d +?u?u?u?u?u?u?d?u +?u?l?l?l?l?l?l?u +?u?u?s?u?u?u?d +?u?l?l?d?l?l?s +?u?l?d?l?l?l?s +?u?s?u?d?u?u?u +?u?s?l?l?d?l?l +?u?l?l?l?u?s?d +?u?l?l?s?l?l?d +?u?s?u?l?l?l?d +?u?l?l?l?u?l?l?d +?u?l?l?l?l?u?l?l +?u?d?d?d?s?s?s +?l?l?l?l?l?d?d?d?s +?l?l?l?u?u?u?d?d +?d?s?d?d?s?d?d?u +?l?d?d?l?l?d?d?d?d +?l?d?l?u?l?d?l +?u?u?u?l?d?d?l +?d?l?l?l?u?l?d +?d?l?l?d?u?u?u +?u?l?d?u?l?d?l +?l?l?l?d?d?d?u?u +?u?u?u?u?u?d?d?s +?u?u?u?u?d?u?d?d +?u?u?d?d?d?u?u?u +?u?d?d?l?u?l?l +?u?l?d?u?l?l?d +?d?d?u?l?u?u?l +?u?l?u?u?l?l?d +?l?l?l?u?d?d?l +?u?u?l?d?l?l?l +?u?l?l?l?u?d?l +?d?u?l?l?u?l?d +?l?d?l?l?d?u?l +?u?d?l?l?u?l?d +?l?l?l?u?d?l?d +?u?u?d?d?u?l?l +?u?l?d?d?u?u?l +?u?l?d?l?u?d?l +?u?d?l?l?l?l?u +?l?d?u?d?u?u?u +?d?l?u?l?u?l?d +?d?l?u?l?l?l?l +?u?l?l?u?d?d?u +?l?u?d?l?l?u?d +?d?d?l?u?l?u?l +?u?l?l?l?d?l?u +?u?l?u?d?u?l?u +?l?l?u?l?d?l?d +?u?l?l?d?u?d?l +?l?d?l?d?l?l?u +?l?d?l?l?d?l?u +?u?l?u?d?d?l?l +?u?u?l?l?d?d?u +?u?d?u?l?u?d?l +?u?l?u?d?d?u?u +?l?l?d?d?l?s?s +?u?s?u?u?s?d?d +?u?l?l?l?l?l?l?l?d +?u?d?d?u?u?u?d?d +?d?d?d?u?u?u?d?d?d +?u?d?d?l?l?l?l?l +?s?u?l?l?d?d?d?d +?l?l?l?u?u?d?d?d +?u?u?s?l?l?l?l +?s?u?u?s?d?s +?u?u?d?s?s?s +?s?d?l?s?s?l +?u?s?s?s?d?u +?u?l?d?s?s?s +?u?s?l?s?s?d +?s?l?s?s?l?d +?s?s?l?l?d?s +?s?l?s?l?s?d?d +?s?l?s?s?d?l +?s?l?d?u?s?s +?d?s?l?s?l?s +?u?d?u?s?s?s +?d?s?l?l?s?s +?u?l?s?s?s?d +?s?l?s?d?l?s +?l?u?s?s?d?s +?s?d?s?l?l?s +?l?d?s?s?s?l +?u?d?s?s?u?s +?d?s?l?u?s?s +?u?s?s?u?s?d +?u?s?d?u?s?s +?s?d?l?s?u?s +?s?s?s?l?d?l +?s?d?u?l?s?s +?s?l?s?l?s?d +?s?u?s?u?s?d +?d?s?s?l?s?l +?s?l?l?s?s?d +?s?u?u?d?s?s +?u?u?s?s?s?d +?u?d?l?s?s?s +?l?l?s?s?s?d +?d?l?l?l?l?l?l?s +?s?s?s?s?s?d?d +?u?l?u?l?u?s?d +?u?l?l?l?s?l?d +?u?s?d?d?d?d?d?d?d +?u?u?d?d?u?u?u?u +?s?l?d?d?l?d?s +?d?d?l?l?s?s?d +?l?l?d?s?d?d?s +?l?d?l?d?d?s?s +?l?d?l?s?s?d?d +?l?s?d?d?l?s?d +?s?l?d?l?d?d?s +?d?d?s?d?s?l?l +?d?l?l?s?s?d?d +?l?l?d?s?d?s?d +?d?s?l?l?s?d?d +?l?l?d?d?s?d?s +?l?d?l?d?s?s?d +?d?d?l?s?d?l?s +?u?u?s?d?d?d?s +?u?u?d?d?d?d?s?s +?l?l?l?l?l?l?d?d?s +?s?d?d?l?l?l?l?l +?l?l?l?l?d?d?d?d?l +?d?d?d?d?s?d?l?l +?l?d?d?d?d?d?l?s +?l?l?d?d?l?l?l?d?d +?l?l?l?l?s?d?d?s +?l?d?l?l?l?s?s +?l?l?s?s?l?u +?s?s?l?l?l?u +?u?l?s?l?s?u +?s?l?l?u?s?l +?u?l?s?s?l?u +?u?u?s?l?s?l +?u?s?s?l?l?u +?s?u?l?u?s?l +?l?u?l?s?s?l +?u?u?s?s?l?l +?s?l?l?l?s?u +?l?s?u?l?s?u +?u?l?l?s?s?u +?u?l?u?s?l?s +?s?s?u?u?l?l +?u?l?s?l?u?s +?u?l?s?s?u?l +?u?l?d?d?l?l?l?l +?u?u?u?u?u?d?u?d +?u?u?l?l?l?u?u +?u?u?d?d?l?d?d?d +?d?u?u?d?d?u?d?d +?d?u?d?u?d?u?d?d +?l?d?u?d?d?l?d?d +?l?l?u?l?s?d?d +?s?l?d?l?d?l?l +?d?l?l?l?s?l?d +?d?l?s?l?d?l?l +?l?l?l?s?u?d?d +?u?l?l?s?u?d?d +?l?d?l?s?d?l?l +?s?l?d?l?l?l?d +?u?s?l?d?l?l?d +?s?l?l?l?d?l?d +?u?u?u?u?d?d?d?d?d?d +?d?d?d?d?u?u?u?s +?l?l?l?l?u?u?d?d +?d?d?d?d?u?l?l?u +?s?s?s?u?s?s +?u?s?l?l?l?l?d?d +?u?l?l?l?u?l?s +?s?d?d?d?d?d?s?l +?u?l?l?u?u?l?d +?l?l?u?l?l?d?l +?u?d?d?d?l?l?l?l +?s?s?d?l?l?l?l +?d?d?d?d?u?l?l?l?l +?d?d?d?d?s?s?l?l +?d?d?d?d?d?u?u?u?u +?d?d?s?d?d?s?d?d?s +?l?l?l?d?d?l?l?d?d +?l?d?l?l?d?d?d?d?d +?d?d?d?d?l?l?l?l?l?l +?l?l?l?d?d?d?d?d?d?d?d +?u?s?s?s?u?s +?u?l?s?s?s?s +?s?u?s?s?u?s +?s?s?u?s?s?u +?u?l?l?u?u?l?l +?u?l?u?l?l?u?l +?u?l?l?u?l?l?l?l +?d?d?d?d?d?d?d?s?u +?l?u?u?u?u?u?s +?l?l?l?u?l?l?d?d +?u?u?d?u?u?d?d?d +?l?d?d?s?d?d?s?d?d +?l?s?l?s?s?d?d +?l?s?l?s?d?d?s +?d?s?l?s?l?s?d +?d?d?d?d?d?l?l?l?d +?l?l?l?l?l?l?u?d +?s?l?l?l?l?l?l?d +?d?d?d?s?d?d?s?d +?d?s?d?d?d?d?s?d +?s?d?d?d?d?d?s?d +?u?u?u?u?u?d?u?u +?s?l?s?l?l?d?d +?u?s?l?l?s?d?d +?l?s?d?d?s?l?l +?l?l?l?d?s?s?d +?l?l?s?s?d?d?l +?s?d?l?l?d?l?s +?s?l?s?l?l?l?l +?d?l?l?l?l?l?l?l?d +?l?u?l?s?d?d?d?d +?u?l?d?d?d?l?l?l +?d?d?s?d?s?d?d?s +?d?s?l?l?l?l?s +?u?l?u?l?l?l?u +?s?l?d?l?d?d?d?d +?d?d?d?d?l?l?s?d +?d?d?d?s?d?d?l?l +?u?u?u?s?u?u?d +?u?s?u?d?l?l?l +?u?u?s?d?u?u?u +?l?d?l?d?l?d?l?d?d +?l?u?u?l?u?u?d +?u?u?l?l?d?l?l +?u?l?l?l?d?u?u +?d?l?u?u?u?u?u +?l?u?l?d?l?l?l +?l?u?u?l?l?l?d +?u?l?u?l?u?u?d +?u?u?l?l?l?d?l +?d?d?d?l?l?l?s?s +?d?d?l?s?s?d?d +?u?d?s?d?d?d?s +?s?s?u?d?d?d?d +?d?s?s?l?d?d?d +?u?d?s?d?d?s?d +?s?d?s?d?d?l?d +?d?l?d?d?d?s?s +?s?u?d?d?d?d?s +?u?d?d?s?d?s?d +?d?d?d?s?l?d?s +?d?l?s?d?d?s?d +?s?d?d?d?s?d?l +?d?d?s?s?d?l?d +?u?d?d?s?s?d?d +?d?d?u?s?s?d?d +?d?d?d?s?s?d?l +?d?s?s?d?d?d?l +?s?d?d?d?l?d?s +?d?s?d?d?d?s?l +?s?d?d?d?d?s?u +?s?d?d?u?s?d?d +?d?d?l?s?d?s?d +?d?d?s?d?s?d?u +?s?d?d?u?d?d?s +?u?s?d?s?d?d?d +?s?s?d?d?d?d?u +?d?d?d?l?s?d?s +?s?d?s?d?d?d?l +?l?d?s?d?d?d?s +?d?d?d?d?s?s?u +?l?s?d?d?d?s?d +?s?l?d?d?s?d?d +?d?s?d?s?u?d?d +?d?d?s?d?l?d?s +?d?s?l?s?d?d?d +?u?l?l?l?l?d?l?d +?u?l?l?d?u?l?l?d +?u?d?l?l?d?d?l?d +?d?d?d?d?l?u?l?l +?d?d?u?u?d?d?l?l +?d?d?d?d?d?d?d?d?l?d +?d?d?d?d?s?d?d?u +?d?d?d?s?d?d?l?d +?d?d?d?s?l?d?d?d +?d?d?d?s?d?l?d?d +?l?u?l?d?d?d?d?d?d +?u?d?l?l?l?l?l?d +?d?d?d?d?d?d?d?d?s?l +?l?l?l?l?d?d?l?l?l +?l?u?l?l?l?d?d?d +?d?l?d?l?s?l?d +?d?u?l?l?s?d?d +?d?d?u?u?u?s?d +?d?l?d?s?d?l?l +?u?u?d?s?u?d?d +?l?u?l?d?s?d?d +?u?l?d?d?d?s?l +?u?d?d?l?l?d?s +?u?u?d?d?s?d?u +?l?l?d?d?s?l?d +?d?l?s?l?l?d?d +?d?d?d?u?u?s?u +?u?s?d?d?d?l?l +?l?s?l?u?d?d?d +?u?l?u?d?d?d?d?s +?u?d?u?d?u?s?d +?d?l?s?d?d?l?l +?s?d?l?d?l?l?d +?l?d?s?l?d?d?l +?d?l?d?l?d?s?l +?s?d?d?l?l?d?l +?u?u?s?d?d?u?d +?d?l?l?d?s?l?d +?d?l?d?d?l?s?l +?s?l?l?d?d?l?d +?u?l?d?s?l?d?d +?d?d?l?l?s?l?d +?s?u?u?d?u?d?d +?s?l?l?d?d?d?l +?d?d?s?l?l?d?l +?l?d?d?l?s?d?l +?l?d?s?d?l?l?d +?d?d?l?s?l?l?d +?u?u?s?d?d?d?u +?s?l?l?l?s?d?d?d +?s?d?u?u?u?d?d +?u?s?u?d?u?d?d +?l?d?s?d?d?u?u +?d?l?l?d?s?d?l +?u?u?l?s?d?d?d +?u?l?s?u?d?d?d +?l?l?l?d?d?l?l?l?l +?d?d?d?d?d?d?l?d?d?d +?d?d?u?d?u?u?d?d +?u?d?d?d?d?u?u?d +?d?u?d?u?u?d?d?d +?u?l?d?d?l?d?d?d +?d?d?d?d?u?d?l?l +?u?d?u?d?d?d?d?d?d +?l?d?d?d?d?d?l?d?d +?d?s?l?l?l?l?l?l +?u?d?u?l?l?d?l +?u?l?d?l?u?l?d +?l?l?u?d?l?l?d +?u?l?d?d?l?u?l +?u?d?l?u?l?d?u +?u?u?l?d?l?d?l +?u?u?u?l?d?l?d +?d?l?d?l?u?l?l +?u?l?l?l?d?u?d +?d?l?l?l?d?u?u +?d?d?u?l?l?u?u +?u?d?l?u?l?l?d +?l?d?l?d?l?u?u +?l?l?l?d?l?d?u +?d?d?l?l?l?u?l +?l?u?u?u?d?u?d +?l?d?l?l?u?l?d +?d?u?u?d?l?l?l +?d?u?u?l?l?l?d +?u?l?l?u?d?u?d +?u?l?d?d?u?u?u +?u?l?u?d?l?d?l +?d?d?l?l?u?l?u +?u?l?u?d?u?d?u +?d?u?u?u?l?l?d +?d?d?l?l?u?u?l +?d?l?d?l?l?u?u +?u?u?l?d?d?l?l +?d?u?l?d?l?l?l +?u?l?l?u?d?d?l +?l?d?l?u?d?l?l +?l?d?l?u?d?l?u +?d?u?l?u?l?l?d +?l?l?l?d?u?d?l +?u?u?d?l?l?d?l +?u?d?l?l?l?u?d +?u?d?u?l?l?l?d +?l?l?d?d?l?u?u +?u?u?u?d?l?d?l +?l?u?l?l?d?d?l +?d?d?d?d?s?l?l?l?l +?l?u?l?l?u?l?l +?l?l?l?s?d?d?d?s +?l?u?l?l?l?l?d?d +?u?u?s?d?d?u?u +?u?s?l?l?l?d?d?d +?u?l?u?l?u?d?s +?u?d?l?d?l?l?s +?u?u?u?l?l?s?d +?u?l?s?d?d?l?l +?l?l?l?d?s?d?l +?s?d?l?l?d?l?l +?u?u?l?l?l?s?d +?l?l?d?l?s?l?d +?s?l?l?d?l?l?d +?u?d?u?u?d?u?s +?s?d?d?u?l?l?l +?l?d?s?l?l?d?l +?l?s?d?l?d?l?l +?l?l?l?d?u?l?l?l +?d?s?d?d?d?s?d?d?d +?l?l?l?d?l?d?d?d?d +?l?l?l?l?l?d?d?u +?l?s?l?s?l?s?d?d +?l?l?s?s?d?d?s +?d?u?d?l?d?u?d?l +?l?l?u?l?l?d?d?d +?l?s?d?l?l?l?l?l +?d?d?d?d?l?s?l?l +?d?d?d?d?l?d?d?d?l +?d?s?s?l?s?s +?l?s?s?s?d?s +?s?s?d?l?s?s +?s?s?s?l?s?d +?s?s?l?s?s?d +?s?s?s?d?l?s +?d?s?l?s?s?s +?s?s?l?d?s?s +?s?s?d?s?s?l +?s?s?s?l?d?s +?s?d?u?s?s?s +?u?d?s?s?s?s +?s?s?u?d?s?s +?u?l?l?l?u?d?u +?l?u?u?u?u?l?d +?u?u?u?l?l?l?s +?u?u?u?l?l?d?l +?d?u?l?l?l?u?l +?u?l?l?u?l?u?d +?u?l?u?s?u?l?u +?l?l?u?l?l?u?d +?l?u?l?u?l?l?d +?d?d?d?d?d?d?l?s?l +?l?s?l?d?l?l?s +?l?s?l?s?l?d?l +?d?d?s?d?d?s?d?d?d +?d?d?d?d?d?d?d?s?d?d +?d?d?d?l?s?s?s +?d?d?d?s?s?u?s +?u?l?d?l?l?l?l?l +?u?u?u?u?l?d?d?d +?l?d?d?d?d?d?s?s +?d?d?d?d?d?d?d?d?s?s +?s?s?s?u?l?l +?s?s?s?u?l?u +?u?l?s?l?s?s +?s?s?u?l?l?s +?s?l?u?l?s?s +?u?u?s?u?s?s +?u?s?s?s?u?u +?s?u?l?l?s?s +?s?u?u?s?s?u +?l?s?u?s?l?s +?l?u?l?s?s?s +?u?s?l?s?u?s +?u?u?s?s?u?s +?s?s?l?s?l?l +?l?l?l?l?l?d?l?l?l +?d?d?l?l?l?l?d?d?d?d +?l?u?s?d?d?d?d?d +?d?d?d?s?l?l?d?d +?l?d?d?d?l?d?d?s +?l?d?l?d?d?d?d?s +?u?l?u?s?d?d?s +?l?d?s?l?s?l?d +?d?l?l?d?l?s?s +?s?l?l?s?l?d?d +?l?l?d?d?s?s?l +?s?u?u?u?s?d?d +?u?l?u?d?d?s?s +?s?s?l?d?l?d?l +?d?d?l?l?s?s?l +?l?d?d?l?l?s?s +?l?s?l?l?d?d?s +?l?s?d?d?l?s?d?d +?u?l?u?u?l?l?l +?l?l?l?l?l?l?l?u +?l?d?l?d?l?d?d?s +?d?d?d?s?d?l?l?l +?s?d?d?d?d?d?d?d?d?s +?s?l?l?l?s?l?l +?u?d?u?u?u?u?u?u +?l?l?l?d?d?d?d?d?s +?d?d?u?d?d?d?d?d?d +?d?d?d?d?d?d?d?u?d +?u?l?d?l?d?l?d?d +?u?d?d?u?u?d?d?u +?d?d?l?l?u?u?d?d +?d?s?d?s?d?s?d?d +?d?s?d?d?s?d?d?s +?u?s?d?u?u?u?u +?u?l?l?s?d?l?l +?u?s?l?l?l?d?l +?l?l?l?s?u?u?u +?d?l?l?l?d?d?d?d?d +?l?s?s?l?l?l?d +?d?l?l?l?l?l?l?d?d +?l?l?l?l?d?d?s?d?d +?l?l?d?s?d?s?d?d +?l?l?d?d?d?d?d?d?d?d?d +?u?l?u?l?u?l?u?l +?d?d?d?d?d?l?d?u +?d?u?d?d?d?l?d?d +?d?d?d?u?d?d?u?d +?u?d?d?d?d?d?l?d +?l?u?d?d?d?d?d?d?d +?d?d?u?d?d?d?u?d +?l?d?u?d?d?d?d?d +?d?d?d?l?d?u?d?d +?d?u?d?l?d?d?d?d +?d?d?d?d?d?u?d?l +?d?d?d?d?u?d?l?d +?d?d?u?d?d?d?d?u +?d?d?d?d?l?d?d?u +?d?d?l?u?d?d?d?d +?l?l?l?l?l?l?l?l?l?l +?u?u?d?d?d?l?l?l +?d?d?d?d?d?d?s?d?d?d +?u?u?d?u?u?u?u?u +?l?l?d?d?d?d?l?s +?l?d?d?s?s?s?s +?d?d?d?s?u?u?u?u +?s?d?d?d?d?d?d?d?l +?u?d?d?d?d?d?d?d?s +?u?u?u?l?l?u?d +?l?u?l?l?l?d?l +?l?l?l?d?l?u?u +?u?l?u?d?l?u?l +?u?l?u?l?d?u?u +?u?l?d?l?l?l?u +?l?l?l?l?u?d?l +?l?l?l?u?l?d?l +?d?u?l?u?l?u?l +?l?l?d?l?l?u?u +?l?l?l?l?l?s?s?s +?l?l?s?l?l?l?l?d +?d?d?d?d?d?d?d?d?d?d?d?d?d +?l?u?u?u?u?u?u?d +?d?s?d?s?l?s?l +?l?d?d?l?s?s?s +?l?s?l?s?d?s?d +?l?l?s?d?d?s?s +?u?u?d?d?s?s?s +?l?l?l?s?d?s?d?d +?s?d?s?d?s?d?s?d +?l?l?l?u?u?l?l +?l?u?l?l?l?u?l +?u?u?u?d?d?d?d?d?d?d +?l?l?l?l?s?l?l?d +?d?s?d?d?l?l?l?l +?d?d?d?d?l?u?u?u +?d?d?u?u?d?d?d?u +?d?d?d?l?u?l?d?d +?d?d?u?d?u?d?d?u +?u?d?u?d?u?d?d?u +?d?d?u?l?d?d?u?l +?d?u?d?d?u?d?d?u +?u?d?d?l?d?d?l?d +?l?d?u?d?l?d?u?d +?d?u?d?l?l?d?d?d +?u?d?d?d?l?l?d?d +?d?d?d?u?d?d?u?u +?d?d?u?d?d?u?d?u +?d?d?d?d?u?u?u?l +?u?d?d?d?u?d?d?u +?d?d?d?u?d?u?d?u +?d?d?d?u?l?u?d?d +?u?d?d?l?d?u?d?d +?d?d?d?d?d?d?u?l?u +?d?d?l?l?d?d?u?u +?l?l?d?u?l?l?l?l +?s?l?d?d?d?d?d?s +?l?s?l?d?l?l?l?l +?d?d?d?d?d?d?d?d?d?d?u +?l?l?l?d?d?u?u?u +?l?s?l?l?d?l?s +?u?l?l?l?d?s?s +?l?s?l?s?l?l?d +?d?d?l?d?l?d?d?d?d +?u?l?s?l?l?d?l +?l?l?l?l?s?d?u +?l?l?l?l?u?s?d +?l?s?l?l?l?l?l?d +?l?d?l?d?l?d?l?s +?u?l?l?d?l?l?l?d +?d?d?s?d?s?s?d +?s?d?s?s?d?d?d +?d?s?d?d?s?d?s +?d?s?d?d?s?s?d +?s?u?l?u?l?u?s +?l?u?u?u?d?d?d?u +?u?d?l?l?d?l?l?d +?l?l?u?u?u?d?d?d +?s?d?d?l?l?l?d?d +?d?s?s?d?d?d?d?d +?u?l?l?l?s?d?d?d?d +?u?l?l?l?u?l?u +?u?l?u?u?l?u?l +?u?u?l?l?l?l?u +?d?l?d?l?d?l?d?l?d +?d?l?s?l?s?d?d +?d?d?l?l?d?s?s +?s?u?l?d?d?d?s +?l?d?l?s?d?s?d +?d?d?d?u?l?s?s +?s?s?d?l?d?d?l +?d?s?l?d?s?l?d +?u?d?u?d?d?s?s +?l?s?d?d?l?d?s +?s?d?d?l?l?d?s +?s?l?l?d?d?s?d +?d?d?s?l?l?s?d +?d?s?l?d?d?s?l +?s?s?u?u?d?d?d +?d?s?d?l?l?s?d +?l?s?d?d?d?l?s +?d?d?d?u?u?s?s +?u?u?d?s?s?d?d +?s?s?d?d?d?u?u +?u?u?s?d?d?s?d +?s?s?l?d?l?d?d +?s?l?d?l?s?d?d +?s?d?s?l?l?d?d +?d?d?d?s?u?u?s +?u?u?d?d?s?s?d +?d?u?d?d?d?d?d?d?d +?d?d?d?d?d?u?u?s +?l?d?d?l?d?d?d?s +?l?d?d?d?d?l?d?s +?u?l?d?d?d?d?s?d +?d?d?d?d?s?l?l?d +?d?d?l?l?d?s?d?d +?d?d?d?d?l?l?d?s +?u?l?l?l?l?l?d?d?d?d +?l?l?d?d?l?l?d?d?d +?l?d?d?d?d?d?d?l?d +?u?d?l?s?l?l?d +?u?l?l?u?d?d?s +?l?u?l?u?s?d?d +?d?l?s?d?l?l?l +?l?l?l?s?d?d?u +?u?l?l?s?d?d?l +?d?s?l?l?d?l?l +?s?l?l?d?l?d?l +?u?l?u?u?s?d?d +?l?u?l?u?d?d?s +?u?s?l?l?u?d?d +?s?d?u?u?u?u?d +?u?l?d?l?l?s?d +?l?s?d?l?l?d?l +?u?u?u?d?u?d?s +?u?d?d?u?u?u?s +?u?u?d?d?s?u?u +?d?s?l?l?l?d?l +?u?l?d?d?u?l?s +?u?l?l?d?d?l?s +?d?l?l?l?d?s?l +?d?d?l?l?l?s?u +?d?u?u?s?d?u?u +?d?d?s?u?u?l?l +?u?u?d?s?u?u?d +?s?s?u?l?l?l?l +?s?l?l?s?l?l?l +?u?u?u?d?d?u?d?d +?u?d?l?d?l?d?u?d +?u?l?l?l?d?d?d?d?d?d +?d?d?d?d?l?d?d?d?d?d +?l?l?u?u?u?l?l +?u?l?u?u?u?u?u +?u?u?l?l?u?l?l +?d?l?s?l?s?d?l +?d?d?l?s?l?s?l +?u?l?l?s?d?d?s +?u?l?s?l?s?d?d +?d?d?u?u?u?s?s +?u?s?l?s?u?d?d +?d?s?u?u?u?s?d +?u?u?u?s?d?s?d +?u?u?u?u?d?s?s +?l?s?d?l?l?l?s +?l?s?l?d?d?l?s +?d?l?s?d?l?l?s +?l?l?l?s?d?s?l +?l?s?l?l?d?s?d +?l?l?l?s?d?l?l?l +?d?d?u?u?u?u?u?d +?l?l?l?l?l?l?l?l?s +?d?d?d?l?l?l?l?d?d?d +?l?l?l?u?l?u?d +?u?u?l?u?u?u?d +?u?d?l?l?u?l?l +?l?l?l?d?l?u?l +?l?d?l?l?l?u?u +?l?l?u?u?d?l?l +?l?l?l?l?u?l?d?d +?l?l?l?u?d?l?l +?u?d?l?u?l?l?l +?l?l?l?l?u?d?u +?u?l?l?l?u?u?d?d +?d?d?d?d?d?d?l?l?d?d +?d?d?s?d?l?l?l?l +?u?l?s?l?d?d?d?d +?l?l?s?d?d?d?d?l +?s?l?d?d?d?d?d?d?d +?s?s?s?s?d?s +?s?d?s?s?s?s +?l?l?s?l?l?s?d?d +?l?u?l?l?s?l +?l?l?u?l?s?l +?u?l?s?u?u?l +?l?u?l?s?l?l +?l?s?u?l?u?l +?l?u?s?l?u?u +?l?l?u?s?u?l +?l?l?u?s?u?u +?u?s?u?u?l?u +?l?u?l?u?s?u +?l?u?l?u?s?l +?l?u?u?l?l?s +?u?s?l?l?u?u +?l?s?u?l?l?u +?l?u?s?u?u?l +?l?u?u?s?u?u +?u?l?l?u?s?l +?l?u?s?l?u?l +?u?l?u?u?u?s +?l?u?s?u?u?u +?u?u?l?u?u?s +?u?u?u?l?s?l +?u?u?l?u?s?u +?u?u?l?l?s?u +?u?s?l?l?u?l +?s?u?l?u?u?u +?u?l?u?s?u?u +?l?l?s?l?u?u +?u?s?l?u?u?l +?u?s?l?u?u?u +?l?u?u?l?s?l +?l?s?l?u?l?u +?s?l?l?l?u?u +?u?l?u?u?s?u +?s?l?u?l?u?l +?s?l?u?u?u?l +?d?d?d?d?d?s?d?d?d?d +?d?d?d?d?s?d?d?d?d?d +?s?l?s?l?s?l?s +?l?l?l?l?l?s?l?d +?d?l?l?l?s?s?s +?l?u?l?l?d?l?d +?u?u?l?l?d?l?d +?l?d?u?l?d?l?u +?d?u?l?d?u?u?l +?u?l?d?u?d?l?u +?l?u?u?u?d?d?u +?l?u?u?u?d?d?l +?u?d?l?l?u?d?u +?u?l?d?l?u?u?d +?u?l?l?d?u?d?u +?l?u?d?l?d?l?u +?d?l?u?u?u?u?d +?u?d?l?l?d?u?u +?d?d?l?u?l?l?l +?u?l?u?l?d?u?d +?u?l?u?u?d?d?l +?d?l?u?l?l?u?d +?u?d?d?u?l?l?u +?l?u?l?u?d?d?l +?u?l?d?l?u?d?u +?u?d?u?l?d?u?l +?d?l?l?l?d?l?u +?d?l?d?l?l?u?l +?l?l?l?d?u?l?d +?u?d?l?u?u?d?l +?u?d?u?u?u?l?d +?d?l?d?u?l?l?l +?l?u?l?l?d?d?u +?l?u?l?d?l?l?d +?u?d?d?l?l?u?u +?u?d?d?l?l?u?l +?l?u?l?d?d?l?u +?l?l?d?l?d?u?u +?l?d?l?l?u?d?l +?u?u?d?d?u?u?l +?l?d?l?d?u?u?u +?l?u?u?l?u?d?d +?d?l?l?l?l?u?d +?u?u?d?d?l?u?u +?l?l?l?d?d?u?l +?d?l?l?d?u?l?l +?d?l?l?d?u?l?u +?l?u?d?u?d?u?u +?l?l?u?u?d?d?l +?u?d?l?d?u?u?u +?u?d?u?l?u?d?u +?l?l?d?d?d?l?l?s +?d?d?d?d?u?u?d?d?d +?s?l?l?s?l?l?s +?u?u?l?l?l?l?l?l +?s?u?u?s?s?s +?s?s?s?u?u?s +?s?u?s?u?s?s +?u?s?s?u?s?s +?u?s?s?s?s?u +?s?l?s?s?s?l +?s?s?s?u?s?u +?s?s?l?s?l?s +?u?u?u?u?l?l?l?l +?s?s?s?d?d?l?l +?s?l?l?s?s?d?d +?s?s?l?l?s?d?d +?s?l?l?d?d?s?s +?u?l?d?d?s?s?s +?s?l?l?s?d?d?s +?u?u?u?u?u?u?d?d?d?d +?l?l?l?s?u?l?l +?s?s?l?l?d?d?d?d +?s?l?d?d?d?d?l?s +?u?d?u?u?u?u?d?d +?u?d?d?d?u?u?u?u +?d?d?d?d?l?l?s?l +?s?u?u?u?d?d?d?d +?l?d?l?l?s?d?d?d +?l?d?l?l?s?l?s +?l?l?s?l?l?d?s +?u?d?u?d?u?u?d?d +?d?d?d?u?l?l?l?d +?u?l?l?d?d?l?d?d +?u?d?d?l?u?d?d?l +?l?l?d?d?d?l?l?d?d +?s?l?l?l?l?s?l +?l?l?l?l?l?l?l?l?l?d +?d?d?d?d?u?u?u?d?d +?u?u?d?d?d?d?d?d?u +?l?d?d?d?l?l?l?s +?l?l?l?d?d?d?d?d?l +?d?d?d?d?d?l?d?d?d?d +?d?d?d?d?d?d?d?l?d?d +?d?d?l?d?d?l?d?d?d +?u?u?u?d?u?u?d?d +?d?d?u?l?l?l?l?d +?d?l?d?d?d?d?d?s +?s?d?d?d?d?l?d?d +?d?d?d?d?u?s?d?d +?d?d?u?d?d?s?d?d +?s?d?l?d?d?d?d?d +?u?d?d?d?d?d?s?d +?u?l?l?l?d?l?l?d +?l?l?l?l?l?l?d?d?l +?d?d?d?d?l?d?d?d?d?l +?l?l?l?s?d?d?d?l +?u?u?u?l?l?l?l?l +?d?s?d?s?d?d?l?l +?s?d?d?d?d?s?l?l +?u?l?d?d?d?d?s?s +?s?s?u?u?u?s?s +?u?d?l?l?l?d?l?l +?u?d?l?l?s?l?l +?l?l?l?l?l?l?l?s?d +?u?d?d?u?d?d?d?u +?d?d?d?d?l?l?u?d +?d?d?d?u?u?d?d?u +?u?u?d?d?d?l?d?d +?d?l?d?d?d?d?u?u +?d?d?d?d?u?l?u?d +?u?d?u?d?l?d?d?d +?d?d?u?d?d?d?u?u +?d?d?d?d?l?u?l?d +?l?d?d?d?l?l?d?d?d +?u?l?d?d?d?u?d?d +?u?d?d?d?l?d?l?d +?u?u?d?u?u?u?d?d +?l?l?l?u?u?l?d +?l?l?u?u?l?l?d?d +?u?l?u?l?u?d?u +?u?l?u?l?d?u?l +?d?u?l?l?l?u?u +?u?l?u?l?d?l?l +?d?l?l?l?l?u?l +?l?d?u?u?l?l?l +?u?l?u?l?l?d?l +?u?l?l?l?s?u?u +?u?u?s?u?l?l?l +?l?l?d?l?s?d?d?d +?l?s?d?l?d?d?d?d +?d?d?s?d?d?d?l?l +?u?d?d?l?d?d?d?s +?d?d?d?l?l?s?d?d +?d?d?d?d?d?u?s?u +?d?d?l?l?s?d?d?d +?u?d?u?s?d?d?d?d +?u?u?d?s?d?d?d?d +?l?d?s?l?d?d?d?d +?u?u?l?l?u?u?u +?l?l?l?l?u?u?l +?l?l?u?l?l?u?l +?d?l?d?d?l?d?d?d?d +?u?l?l?l?s?d?s +?l?l?l?s?s?l?d +?u?l?u?l?u?l?u?d +?l?d?u?d?d?l?l +?u?d?d?d?d?u?l?l +?d?l?u?u?u?d?d +?l?l?d?d?u?u?d +?l?d?d?u?d?u?u +?d?l?d?l?u?d?l +?u?u?d?d?d?l?u +?l?u?d?u?d?d?l +?l?d?d?d?u?u?l +?d?l?d?u?l?u?d +?d?l?d?d?u?l?l +?l?d?u?d?d?l?u +?d?l?u?u?d?d?l +?d?l?l?l?u?d?d +?u?d?u?d?u?u?d?u +?u?d?l?u?d?d?u +?d?u?l?l?u?d?d +?d?u?d?u?d?l?l +?d?l?d?l?u?l?d +?u?l?d?u?u?d?d +?l?d?l?l?d?d?u +?d?d?u?u?u?l?d +?d?l?u?d?u?d?u +?d?d?u?l?u?u?d +?d?u?l?d?u?l?d +?d?u?d?l?l?d?l +?d?l?u?l?l?d?d +?l?l?d?u?u?d?d +?u?d?u?l?d?l?d +?l?d?u?d?l?d?u +?l?d?d?u?l?u?d +?l?d?d?l?l?u?d +?u?l?l?u?u?d?d?d +?u?d?d?l?d?d?l?l +?u?d?l?u?d?u?d +?d?u?d?l?d?u?l +?d?u?d?l?d?u?u +?u?d?u?u?l?d?d +?u?d?d?u?l?u?d +?u?d?d?d?l?u?l +?d?u?l?d?u?d?l +?l?l?u?d?d?u?d +?u?d?u?d?l?u?d +?d?u?l?d?d?l?u +?d?d?l?l?l?u?d +?l?d?u?l?d?d?l +?l?d?u?u?d?d?u +?u?d?l?l?d?u?d +?d?u?d?l?u?d?l +?d?d?u?l?d?u?u +?d?d?u?d?l?l?u +?u?d?d?u?d?u?l +?l?u?d?u?d?d?u +?u?u?d?d?l?d?u +?d?d?l?l?u?d?u +?l?u?l?d?d?u?d +?l?l?d?d?l?d?u +?u?u?d?l?d?d?l +?l?u?d?d?u?d?l +?l?d?d?l?u?u?d +?d?u?l?l?d?l?d +?u?d?u?d?d?u?l +?d?l?d?d?u?u?u +?u?d?u?d?d?l?u +?d?u?u?d?d?l?l +?l?l?d?u?d?u?d +?l?u?d?u?d?u?d +?u?l?d?d?u?u?d +?l?l?u?d?d?d?l +?d?u?u?d?l?d?u +?u?u?l?d?d?u?d +?l?u?d?u?d?l?d +?l?d?d?l?d?u?l +?u?d?u?u?d?d?l +?u?d?l?l?l?d?l?d +?d?u?u?d?l?d?l +?u?d?d?u?l?d?u +?u?u?u?d?d?l?d?d +?d?u?d?d?l?l?l +?d?u?d?d?u?u?u +?l?u?u?d?d?u?d +?d?d?l?u?d?u?l +?d?d?l?l?u?u?d +?d?l?d?d?l?u?l +?d?d?l?l?d?u?u +?d?d?l?d?u?l?l +?d?u?d?l?d?l?d?l +?l?d?d?l?u?d?u +?d?d?l?d?l?u?u +?d?l?d?l?l?u?d +?l?d?u?d?l?l?d +?l?d?d?u?u?u?d +?d?d?l?u?u?d?l +?d?u?d?l?l?u?d +?l?d?d?u?u?d?l +?l?d?d?d?l?u?u +?d?l?u?u?d?d?u +?d?l?u?d?d?l?u +?d?l?u?d?d?l?l +?d?u?l?l?d?d?u +?l?d?l?d?u?l?d +?l?u?l?d?d?l?d +?l?l?d?u?d?d?l +?u?d?u?d?u?l?d +?l?d?l?l?u?d?d +?d?l?l?d?u?d?l +?d?u?d?u?d?u?l +?l?d?l?d?u?u?d +?d?d?l?u?l?u?d +?l?l?d?d?u?l?d +?d?l?d?u?l?d?l +?d?d?u?u?l?u?d +?d?u?l?u?d?l?d +?l?u?u?d?l?d?d +?u?l?u?d?l?d?d +?l?u?u?d?d?d?l +?l?u?u?d?d?d?u +?d?l?d?u?l?d?u +?l?d?u?l?u?d?d +?u?u?l?d?l?d?d +?d?l?l?d?u?l?d +?d?l?u?u?d?u?d +?d?u?d?l?d?l?l +?l?d?d?d?l?u?l +?d?l?d?u?d?l?l +?d?d?u?l?l?d?l +?d?u?d?d?l?u?l +?d?l?u?u?d?l?d +?u?d?l?d?u?u?d +?s?d?d?d?d?l?l?s +?d?d?d?d?d?d?d?d?d?l?l +?l?l?d?l?d?d?d?d?d +?d?l?l?l?l?l?d?d?d +?u?l?u?l?l?l?l?d +?s?s?l?l?l?l?d?d +?l?l?l?l?l?l?d?l?d +?s?s?l?d?d?d?s +?l?s?d?d?d?s?s +?s?u?s?d?d?d?s +?s?d?s?d?s?d?l +?l?d?s?d?d?s?s +?l?d?s?d?s?d?s +?d?d?d?s?s?s?u +?l?l?l?l?d?d?u?u +?l?l?l?l?d?u?l?l +?u?l?l?l?d?s?d?d +?l?s?s?d?d?d?d?d +?d?d?s?d?d?s?l?d +?u?u?u?d?l?l?l?l +?l?u?u?u?u?u?l +?l?l?u?l?l?l?u +?u?d?l?l?d?l?d?l +?d?d?d?l?l?l?l?u +?u?d?l?d?l?l?l?d +?d?s?d?l?l?l?l?l +?l?l?l?l?l?d?d?d?l +?d?s?d?s?u?u?u +?d?l?s?l?s?l?d +?s?d?u?u?u?d?s +?l?s?l?s?d?d?l +?u?u?s?s?u?d?d +?s?l?l?d?l?d?s +?l?d?d?l?s?s?l +?l?l?s?d?l?s?d +?u?d?u?d?u?s?s +?s?s?u?l?l?d?d +?s?u?d?u?u?d?s +?s?u?l?u?s?d?d +?s?u?l?l?d?d?s +?l?d?l?d?s?l?s +?u?l?u?s?s?d?d +?d?s?l?l?l?d?s +?u?l?u?d?s?d?s +?l?s?d?l?s?d?l +?d?l?d?l?s?s?l +?s?s?u?u?u?d?d +?s?d?s?d?l?l?l +?u?s?l?l?l?l?s +?u?u?d?d?l?l?l?l +?d?d?d?d?d?l?d?d?l +?d?d?u?l?l?l?l?d?d +?s?s?s?s?l?l?l +?u?l?u?l?u?d?d?d?d +?l?l?s?u?l?l?l +?l?l?l?u?u?u?s +?l?l?l?l?s?u?u +?l?l?l?l?d?d?d?l?l +?d?d?s?s?s?l?l +?l?s?l?s?d?s?l +?d?s?l?s?d?s?l +?d?l?d?l?s?s?s +?u?l?d?s?l?l?l +?l?s?s?l?d?d?d?d +?u?l?l?l?l?l?l?l?l +?u?d?l?d?l?d?l?l +?l?u?l?u?l?d?d?d +?u?l?l?l?d?d?d?u +?l?u?l?l?s?s +?u?l?u?l?u?s?s +?s?l?l?s?u?l +?l?s?u?u?s?l +?l?l?s?u?s?u +?s?u?l?s?u?l +?s?l?s?l?l?u +?s?l?s?l?u?l +?u?s?l?u?s?l +?u?l?l?s?u?s +?u?s?l?u?s?u +?s?l?u?l?s?l +?u?s?l?l?u?s +?l?s?l?s?u?u +?u?u?u?l?s?s +?u?l?u?s?s?l +?l?u?u?s?u?s +?l?l?s?u?l?s +?u?u?u?s?s?l +?u?l?u?s?u?s +?u?u?s?l?l?s +?s?l?l?u?s?u +?l?u?u?u?s?s +?s?s?l?l?u?u +?l?l?l?s?s?u +?l?l?s?l?d?l?s +?u?l?s?u?s?l +?u?u?l?u?s?s +?s?u?s?u?u?u +?u?s?u?s?l?l +?l?s?s?l?l?u +?s?u?l?u?u?s +?s?u?u?l?l?s +?l?s?l?s?d?l?l +?l?u?l?s?s?u +?l?s?u?l?s?l +?l?s?u?s?l?l?l +?u?l?l?l?s?s?d +?u?s?u?l?s?l +?l?s?s?u?l?l +?s?l?l?l?u?s +?s?l?u?l?l?s +?s?u?u?l?u?s +?s?l?l?s?l?u +?s?l?l?u?l?s +?u?s?u?d?u?s?u +?s?l?u?u?u?s +?s?u?l?l?l?u?s +?s?l?s?u?u?u +?l?l?s?l?u?s +?l?s?l?u?s?l +?l?u?l?u?l?u?d?d +?l?l?l?l?l?d?d?l?l +?d?d?d?d?d?d?d?d?d?d?s +?l?l?l?l?l?s?s?d +?u?l?l?l?u?u?l +?l?u?l?u?l?l?l +?u?u?l?l?u?u?l +?u?u?u?l?l?u?u +?l?u?l?l?l?l?u +?u?d?l?u?d?l?s +?u?d?u?d?u?u?s +?u?u?u?d?d?s?u +?u?l?s?l?u?d?d +?d?l?l?l?s?d?l +?d?l?s?l?l?d?l +?u?u?d?d?s?l?l +?u?l?s?l?d?d?l +?u?u?d?d?u?s?u +?l?s?l?d?d?u?l +?u?u?u?s?d?d?u +?d?l?l?d?s?l?l +?u?s?d?u?u?d?u +?u?d?l?l?s?d?l +?u?l?l?d?d?s?l +?u?u?u?d?d?u?s +?u?l?d?s?d?l?l +?u?s?u?u?d?d?u +?u?d?l?l?l?d?s +?u?u?u?s?d?u?d +?l?l?u?u?d?d?s +?u?s?u?d?d?l?l +?u?d?d?u?s?u?u +?l?l?l?d?d?u?s +?u?u?u?s?d?l?d +?l?l?d?d?s?u?u +?u?l?l?d?l?d?s +?u?l?d?d?l?u?d?d +?l?d?l?d?u?d?u?d +?d?d?d?u?u?d?u?u +?d?d?d?u?u?u?u?d +?u?u?l?u?d?d?d?d +?u?d?u?d?d?d?u?u +?s?s?s?l?s?s +?s?u?s?s?s?s +?s?s?u?s?s?s +?s?s?l?s?s?s +?s?l?s?s?s?s +?d?l?d?d?d?d?d?d?d?d +?s?s?l?s?s?d?d +?u?l?l?d?u?u?u +?d?l?l?u?u?u?u +?u?l?d?l?u?l?u +?l?l?u?d?l?l?l +?l?d?l?u?l?u?l +?u?u?u?l?d?l?l +?l?d?l?l?l?u?l +?l?d?l?l?u?l?l +?u?l?u?u?u?u?d +?l?u?l?u?u?u?d +?u?l?u?d?u?l?l +?l?l?l?u?u?d?u +?l?l?u?u?l?d?l +?u?l?l?d?u?l?l?l +?u?d?d?l?l?l?l?d +?d?d?u?d?d?u?d?d?u +?d?d?l?d?d?d?d?d?l +?d?l?d?l?d?d?d?d?d +?l?l?s?d?d?d?l?l +?l?l?s?d?l?l?l?l +?u?u?l?l?u?u?d?d +?l?l?l?l?l?l?d?u +?l?d?l?l?s?s?s +?d?l?d?l?d?l?d?s +?l?d?d?l?d?d?l?s +?d?d?u?l?l?d?d?s +?d?d?u?u?u?u?u?d?d +?d?l?d?l?d?l?d?d?d +?u?u?l?d?d?d?d?d?d +?u?d?d?l?d?d?l?d?d +?u?u?u?u?l?l?u +?u?l?l?u?u?u?u +?l?l?l?l?u?l?u +?l?l?l?d?l?l?l?l?l +?u?l?l?l?u?d?d?d?d +?u?l?u?l?s?d?d?d +?u?u?u?u?l?l?l?d +?u?u?u?u?s?s?u +?d?d?d?u?u?u?u?u?u +?u?l?d?l?d?l?l?d +?d?s?d?d?d?d?d?s +?d?d?d?d?s?d?s?d?d +?l?l?l?s?s?s?l +?l?l?d?l?l?d?l?l?d +?s?u?l?l?l?d?s +?s?l?s?l?l?l?d +?l?l?l?d?l?l?l?s +?d?d?d?d?l?l?l?l?s +?u?l?d?d?d?s?d?d +?d?l?l?d?d?d?d?s +?l?d?d?l?s?d?d?d +?d?s?d?d?d?d?l?l +?u?s?u?d?d?d?d?d?d +?l?d?d?s?l?d?d?d +?d?d?s?l?l?d?d?d +?u?d?l?s?d?d?d?d +?s?d?l?l?d?d?d?d +?s?u?l?d?d?d?d?d +?l?d?l?l?l?s?d?d +?u?d?u?s?u?u?u +?u?d?s?l?l?l?l +?u?s?u?u?d?u?u +?u?l?s?d?l?l?l +?u?l?s?u?l?l?d +?u?l?s?l?d?l?l +?u?l?l?s?u?l?d +?u?u?s?l?l?l?d +?d?d?d?d?d?d?d?d?l?l?l +?s?s?u?u?u?u?u +?s?u?s?l?l?l?l +?l?d?l?d?l?d?s?s +?d?d?d?l?d?d?l?d?d +?u?d?d?u?d?d?d?d?d +?d?d?d?l?d?l?d?d?d +?u?u?u?s?s?s?s +?d?d?l?d?d?d?d?d?d?d +?u?l?s?s?d?d?d?d +?d?d?s?d?s?d?d?u +?d?d?d?d?d?s?l?s +?d?d?d?d?d?l?s?s +?u?d?d?d?d?d?s?s +?s?s?d?d?d?d?d?l +?d?d?d?d?l?l?u?l +?l?u?d?u?d?d?d?u +?u?l?u?d?d?d?d?l +?d?l?l?l?d?d?d?u +?d?d?d?d?l?u?l?u +?u?u?s?d?d?d?d?d?d +?d?d?d?d?d?d?d?u?s +?d?u?u?u?d?u?u?u +?u?u?u?s?u?u?u?u +?l?l?l?l?l?l?l?d?l +?l?l?l?u?l?l?u +?u?l?l?l?d?u?l?l +?s?s?s?l?l?l?d +?l?l?l?s?d?s?s +?d?l?d?s?l?l?d +?u?u?d?u?d?d?s +?d?u?u?u?d?d?s +?l?d?d?u?l?d?s +?d?d?s?l?l?u?d +?u?d?s?l?d?l?d +?u?d?l?d?d?l?s +?u?d?d?u?d?u?s +?s?l?d?d?u?d?l +?l?d?d?s?l?d?u +?l?d?l?s?d?d?l +?d?u?d?s?u?u?d +?d?d?d?s?l?l?u +?u?d?l?l?d?d?s +?l?u?d?s?d?u?d +?u?s?l?d?d?l?d +?l?d?u?d?d?l?s +?l?d?d?s?d?l?u +?d?d?u?s?d?u?u +?u?d?u?l?d?d?s +?d?d?d?u?u?l?s +?u?d?l?u?d?d?s +?l?u?u?d?d?d?s +?s?l?d?d?l?d?l +?s?l?u?l?d?d?d +?l?u?d?l?s?d?d +?s?d?u?l?l?d?d +?u?u?s?d?u?d?d +?l?l?d?d?d?d?s?l +?u?u?s?d?l?d?d +?u?l?d?s?d?u?d +?u?u?d?d?d?s?l +?d?s?l?l?d?l?d +?u?l?d?d?s?u?d +?d?u?l?u?d?s?d +?d?d?l?l?d?s?l +?d?d?d?l?u?s?u +?l?d?d?d?u?u?s +?u?s?d?u?u?d?d +?u?d?u?d?l?d?s +?u?u?d?d?d?s?u +?d?l?s?l?d?d?l +?d?d?u?l?d?s?l +?u?d?d?l?l?s?d +?l?d?d?d?s?u?u +?d?s?l?d?l?d?l +?l?u?s?l?d?d?d +?l?d?u?d?l?s?d +?d?d?d?u?l?s?l +?l?l?d?s?d?l?d +?d?d?d?l?l?u?s +?s?u?d?l?l?d?d +?d?s?d?u?d?u?u +?s?d?l?l?d?l?d +?u?l?s?d?d?d?l +?d?u?d?l?s?d?u +?u?d?d?l?u?s?d +?d?d?l?l?u?d?s +?s?d?d?l?d?l?l +?u?d?s?d?l?l?d +?s?d?d?u?l?u?d +?u?d?l?s?l?d?d +?d?u?s?l?l?d?d +?u?d?u?u?s?d?d +?d?d?l?l?d?l?s +?u?u?d?s?l?d?d +?l?s?d?d?l?d?l +?u?d?l?d?u?d?s +?u?u?d?u?s?d?d +?l?u?u?s?d?d?d +?s?d?u?u?d?d?u +?s?u?l?u?d?d?d +?d?s?d?d?u?u?u +?l?l?u?d?s?d?d +?d?s?d?u?l?l?d +?u?l?s?d?l?d?d +?u?s?u?l?d?d?d +?u?d?u?u?d?d?s +?d?l?l?d?d?s?l +?d?u?d?l?d?l?s +?l?l?d?d?u?d?s +?u?d?u?d?d?u?s +?u?u?d?d?s?d?l +?d?s?d?l?l?d?l +?u?l?u?d?d?s?d +?l?d?d?d?d?s?l?l +?l?s?d?d?d?d?l?l +?u?d?l?d?s?d?u +?l?d?u?s?l?d?d +?u?s?l?d?d?d?u +?s?u?u?d?d?d?u +?d?s?d?u?u?u?d +?l?l?d?d?d?s?u +?d?s?l?u?l?d?d +?d?s?d?l?d?l?l +?u?d?s?d?d?l?u +?u?d?s?d?d?l?l +?u?d?u?d?s?u?d +?s?d?d?d?l?u?u +?d?l?s?d?l?l?d +?s?d?d?u?l?d?u +?u?u?d?d?d?u?s +?d?d?d?u?s?l?l +?d?d?s?l?d?l?l +?d?d?d?l?u?u?s +?d?d?d?u?l?u?s +?l?d?s?d?d?l?u +?d?d?d?l?l?l?s?d +?s?u?d?u?d?u?d +?d?l?l?u?s?d?d +?d?d?s?u?d?u?u +?u?d?d?s?d?l?l +?u?d?d?s?d?u?l +?d?d?u?l?l?d?s +?s?u?d?d?u?u?d +?u?l?d?l?d?d?s +?d?d?d?s?u?l?u +?u?d?s?d?d?u?l +?u?d?l?d?s?l?d +?d?d?d?d?d?s?l?l?l +?u?l?d?s?d?d?u +?u?l?u?d?d?s?d?d +?d?d?u?l?l?s?d +?l?u?d?d?l?d?s +?d?u?d?u?d?s?l +?d?s?d?d?u?l?l +?d?d?u?l?u?s?d +?l?d?l?s?u?d?d +?u?l?l?s?u?d?d?d +?d?u?u?u?s?d?d +?s?l?d?l?d?d?l +?u?d?d?s?u?l?d +?d?d?u?u?u?d?s +?u?d?l?l?d?s?d +?s?d?l?l?d?d?u +?d?d?d?l?l?l?d?d?d?d +?u?u?d?u?u?u?u?d +?u?u?u?u?d?u?u?d +?u?u?d?d?d?d?l?d +?l?d?l?l?d?l?d?d?d +?u?l?d?d?u?d?d?d +?u?d?d?l?d?d?u?d +?d?d?d?u?l?d?d?l +?d?d?d?d?l?d?u?u +?d?d?d?d?u?u?d?u +?l?l?d?d?d?d?d?u +?d?d?u?u?d?d?u?d +?d?d?d?d?u?d?u?u +?u?d?u?l?d?d?d?d +?d?u?d?d?d?u?u?d +?d?d?d?d?d?l?u?u +?u?d?d?d?d?l?l?d +?l?l?d?d?d?d?u?d +?d?d?d?u?d?d?l?l +?u?d?d?u?l?d?d?d +?d?u?d?u?d?d?u?d +?d?d?d?d?l?l?d?u +?u?l?d?d?d?d?d?u +?l?s?l?l?l?s?s +?u?u?l?l?l?d?d?d?d +?s?d?s?s?d?s?d +?s?d?d?d?s?s?s +?l?d?d?d?d?d?l?l?l +?d?l?u?d?u?l?l +?d?l?u?u?u?d?l +?l?l?l?d?u?u?d +?l?d?u?l?l?d?l +?d?u?l?d?l?u?l +?d?d?u?l?l?u?l +?d?l?l?u?u?u?d +?d?l?l?u?d?l?u +?d?l?l?u?d?l?l +?l?d?u?u?d?u?u +?u?d?d?u?u?l?l +?l?l?l?d?l?u?d +?u?d?u?u?l?l?d +?u?d?u?l?d?l?u +?u?d?u?l?d?l?l +?d?u?d?u?l?l?l +?l?d?l?l?l?u?d +?d?u?l?l?u?d?u +?u?d?l?l?l?l?d?l +?u?u?d?l?d?u?u +?l?d?u?d?u?l?l +?l?u?d?d?u?u?u +?d?l?l?l?d?u?l +?d?l?u?l?l?d?u +?d?l?u?l?l?d?l +?d?l?d?u?u?l?l +?d?d?u?u?l?u?u +?l?d?u?u?d?l?l +?l?u?d?l?d?l?l +?l?d?l?d?l?u?l +?u?d?d?u?l?u?l +?u?u?u?l?d?u?d +?l?u?l?d?l?d?u +?d?u?l?u?u?l?d +?l?u?l?u?d?l?d +?l?d?l?l?d?u?u +?d?u?l?d?u?l?l +?u?d?u?d?l?l?u +?l?u?l?d?d?u?l +?u?d?u?d?u?u?u?d +?u?u?u?d?l?l?d +?u?d?u?u?u?d?l +?d?u?d?u?l?l?u +?d?u?u?d?l?l?u +?d?l?l?l?u?u?d +?d?d?l?u?l?l?u +?l?u?l?u?d?d?u +?d?l?l?u?u?l?d +?u?u?l?u?d?d?u +?d?u?u?l?l?d?l +?d?u?u?u?u?l?d +?u?u?u?u?u?l?d?d +?u?l?u?d?u?d?l +?d?u?u?u?d?l?l +?u?d?u?l?u?l?d +?l?u?u?d?d?u?u +?d?l?l?u?l?d?u +?u?d?d?l?l?l?u +?l?d?u?d?l?l?l +?l?d?d?l?l?u?u +?l?u?d?l?l?l?d +?d?l?u?l?l?l?d +?l?d?d?l?l?l?u +?d?l?u?u?l?l?d +?l?l?l?u?d?d?u +?u?d?d?u?u?u?l +?u?d?u?d?l?u?u +?l?d?u?d?l?u?u +?l?l?u?u?d?d?u +?l?l?d?u?u?d?u +?l?l?d?u?u?d?l +?u?l?d?l?l?u?d +?u?d?u?d?u?l?l +?l?l?l?d?u?d?u +?u?l?u?d?u?u?d +?u?u?d?l?d?l?l +?d?d?l?u?l?u?u +?l?l?d?l?l?u?d +?d?d?u?u?l?u?l +?u?u?l?u?d?d?l +?l?d?u?u?l?l?d +?l?u?d?l?d?u?l +?l?u?d?u?u?l?d +?l?u?u?d?l?l?d +?d?l?d?l?l?l?u +?u?d?l?d?u?u?l +?u?u?u?d?d?l?u +?u?d?l?l?u?u?d +?l?d?s?l?d?s?l?d +?l?l?l?l?l?l?d?l?l +?s?d?d?d?d?d?s?s +?l?l?l?u?l?l?s +?l?l?l?d?d?d?l?s +?l?d?d?d?s?l?l?l +?l?l?l?s?d?d?l?l +?d?d?d?s?s?d?d?d?d +?d?l?d?d?l?d?d?l?d +?s?d?l?s?d?l?s +?s?s?d?d?l?l?s +?l?l?l?l?s?l?l?l?l +?d?d?s?d?d?d?s?d?d?d +?l?d?d?d?d?d?s?d?d +?d?d?d?d?l?s?l?s +?u?u?s?s?d?d?d?d +?d?d?d?d?l?d?l?d?d +?d?d?u?u?d?d?d?d?d +?s?s?l?d?d?s?s +?s?s?d?l?d?s?s +?s?s?s?s?l?d?d +?s?l?d?l?d?l?d?s +?l?l?l?l?l?d?d?d?d?d?d +?l?l?u?d?u?l?l +?l?u?l?l?d?l?l +?u?l?d?l?u?l?l +?u?d?u?u?l?l?l +?l?u?u?u?l?l?d +?u?l?l?u?u?l?u +?u?l?l?d?l?u?l +?l?l?u?u?u?l?d +?u?l?u?u?u?l?d +?l?d?u?u?u?u?u +?u?l?l?u?d?u?u +?l?u?d?u?u?u?u +?u?u?u?d?u?l?l +?l?l?l?d?u?l?u +?l?u?d?l?l?l?l +?l?u?l?u?l?d?l +?u?l?d?u?l?u?l +?u?u?u?u?s?u?u?u +?l?l?u?l?d?l?l +?u?l?l?u?l?d?l +?l?u?u?d?u?u?u +?u?u?u?l?u?u?d +?l?l?d?l?l?u?l +?l?d?l?l?u?u?u +?u?u?u?u?s?d?d?d?d +?d?d?d?l?d?d?d?d?d?d +?l?l?l?d?l?l?l?d?d +?l?l?d?l?l?l?l?s +?l?l?l?s?d?l?s +?l?l?s?d?l?l?s +?l?d?l?s?l?s?l +?s?l?d?l?s?l?l +?l?s?l?l?l?d?s +?l?l?d?d?d?d?d?d?l?l +?u?l?d?d?l?l?l?d +?u?d?d?d?d?d?d?d?d?u +?d?d?d?d?l?d?d?l?l +?d?d?d?s?u?l?l?l +?u?l?l?l?l?d?d?u +?s?s?u?l?s?l +?s?s?l?l?l?l?s +?s?u?l?s?u?s +?s?l?s?l?u?s +?u?s?s?u?l?s +?u?l?s?u?s?s +?u?l?s?s?l?s +?u?l?s?s?s?u +?l?l?s?s?s?u +?u?s?u?u?s?s +?l?l?s?s?u?s +?u?s?s?l?s?l +?s?u?s?s?u?u +?l?l?d?d?l?l?l?s +?u?l?u?l?l?l?l?l +?u?u?u?u?l?l?s +?s?l?s?l?d?l?d +?s?l?d?d?l?l?s +?s?u?l?u?d?d?s +?l?s?d?l?l?s?d +?s?u?l?l?s?d?d +?l?d?s?d?l?s?l +?u?d?d?l?l?s?s +?l?u?l?s?s?d?d +?d?d?s?u?u?u?s +?l?s?l?d?d?s?l +?l?d?l?s?d?l?s +?s?s?l?l?d?l?d +?l?d?l?l?s?s?d +?u?l?s?s?l?d?d +?l?d?s?s?l?l?d +?l?s?s?d?d?l?l +?l?l?d?l?d?s?s +?l?l?s?l?d?d?s +?l?d?s?s?l?d?l +?l?d?l?s?l?d?s +?l?s?u?s?l?d?d +?l?s?l?d?l?d?s +?l?s?d?d?l?l?d?d +?u?s?u?u?d?d?d?d +?s?d?l?l?l?d?d?d +?l?d?l?d?l?d?s?d +?d?d?d?s?l?l?l?d +?u?u?s?s?u?u?u +?u?d?d?u?d?d?u?u +?u?u?d?d?d?u?u?d +?u?u?u?d?d?d?u?d +?d?d?l?l?l?u?d?d +?u?d?l?d?d?d?l?l +?u?d?l?d?l?d?d?l +?u?d?u?u?d?d?d?u +?d?d?u?d?d?u?u?u +?u?u?d?d?d?u?d?u +?u?d?d?l?l?u?d?d +?u?d?d?l?l?d?d?l +?u?d?u?d?d?u?d?u +?u?d?d?u?d?d?l?l +?u?l?d?d?l?d?d?l +?d?d?d?d?u?l?u?u +?d?l?d?u?d?l?d?u +?u?l?d?d?l?d?l?d +?u?d?d?d?u?u?u?d +?u?d?d?l?d?l?l?d +?l?d?l?d?l?d?u?d +?l?u?d?d?d?d?l?u +?s?s?s?d?d?d?d?d?d +?u?l?l?l?s?d?l +?u?l?l?l?s?u?d +?u?u?u?s?d?u?u +?u?d?l?s?l?l?l +?l?s?d?u?l?l?l +?u?d?l?l?l?s?l +?l?l?u?l?l?s?d +?u?u?s?u?u?d?u +?l?l?l?l?u?u?u?u +?l?l?s?s?s?l?l +?l?s?l?s?l?l?s +?u?l?d?l?l?l?l?d +?s?s?s?s?s?s?l +?d?s?d?d?d?d?d?d?d?d +?s?d?d?d?l?l?l?s +?l?l?l?u?l?d?d?d +?l?l?u?d?d?d?l?l +?u?d?u?u?d?u?d?u +?d?d?l?l?l?l?l?l?d?d +?d?d?d?d?d?d?d?d?u?l +?u?l?l?l?d?d?s?s +?u?s?u?u?u?u?d?d +?d?d?s?s?d?d?l?l +?s?s?d?d?d?d?l?l +?l?l?d?l?l?l?d?d?d +?d?l?u?d?d?d?d?d +?d?u?l?d?d?d?d?d +?d?d?u?d?l?d?d?d +?d?d?d?d?l?d?u?d +?s?l?l?d?d?d?d?d?d +?d?l?d?d?d?d?d?u +?d?l?d?d?d?u?d?d +?d?d?d?d?d?l?u?d +?d?d?d?l?d?d?u?d +?l?l?d?d?d?d?l?d?d +?d?l?d?d?d?d?u?d +?d?d?d?u?l?l?d?d?d +?d?u?d?d?d?d?d?u +?l?l?l?l?d?l?l?s +?l?l?l?l?u?u?s +?u?u?u?u?s?l?l +?u?l?s?s?l?l?l +?u?l?l?l?s?u?s +?l?l?l?l?d?l?d?d?d +?l?l?l?d?l?s?d?d +?d?d?d?l?s?l?l?l +?s?u?l?l?l?d?d?d +?u?d?u?u?u?d?u?u +?d?d?d?d?d?d?d?u?u?u +?l?l?l?u?l?l?l?d +?u?u?u?u?d?d?d?l +?l?l?l?l?s?d?l?d +?d?s?l?s?l?s?l +?l?l?u?u?u?u?d?d +?u?d?d?u?u?u?u?u +?u?l?u?l?d?d?d?d?d +?l?d?l?l?l?l?d?d?d +?l?l?l?l?l?s?d?l +?l?l?l?l?l?d?s?s +?l?u?u?u?u?u?u?u +?l?s?d?d?d?d?d?s +?s?l?s?d?d?d?d?d +?l?d?s?s?d?d?d?d +?d?l?s?d?l?s?d?l +?d?d?d?s?l?l?l?s +?l?s?s?l?l?d?l +?u?u?u?u?s?s?d +?l?l?l?d?s?s?l +?l?s?s?l?d?l?l +?l?s?l?l?s?d?l +?d?s?s?l?l?l?l +?u?u?s?u?u?s?d +?l?d?l?l?s?s?l +?l?l?d?l?s?l?s +?l?l?l?s?l?d?s +?l?d?l?s?l?l?s +?l?l?l?l?d?d?l?d?d +?s?u?l?l?l?l?d?d +?l?l?l?l?l?d?l?s +?l?d?s?d?d?d?d?d?d +?l?l?d?d?s?d?l?l +?l?l?l?d?d?d?s?l +?u?l?d?l?l?d?l?l +?d?d?s?d?s?d?s?d +?u?s?u?s?u?u?u +?l?l?d?d?d?l?l?l?l +?l?d?d?d?d?d?d?d?d?s +?l?d?d?l?l?d?d?s +?d?d?l?l?s?l?d?d +?d?d?l?s?l?l?d?d +?d?s?d?d?d?l?l?l +?l?l?d?d?l?s?d?d +?l?d?l?d?l?s?d?d +?s?d?d?d?d?u?u?u +?l?l?l?u?l?u?l +?l?u?u?u?l?l?l +?u?u?u?l?u?u?u +?l?d?d?l?d?l?d?d?d +?d?d?d?d?d?d?l?l?u +?u?d?d?l?d?d?u?d?d +?u?s?l?s?d?d?d +?u?s?s?u?d?d?d +?u?s?l?s?d?d?d?d +?s?d?l?d?u?d?s +?l?d?l?d?s?d?s +?d?l?l?d?d?s?s +?s?d?l?l?d?s?d +?u?d?s?l?s?d?d +?d?l?s?s?d?l?d +?s?l?d?s?u?d?d +?d?l?d?d?s?s?l +?s?l?s?d?l?d?d +?s?s?l?d?d?l?d +?s?u?s?l?d?d?d +?u?s?d?s?l?d?d +?s?s?l?u?d?d?d +?d?s?u?u?s?d?d +?d?d?l?s?s?l?d +?l?d?s?d?l?s?d +?d?d?u?u?d?s?s +?d?l?l?s?d?d?s +?l?u?d?d?d?s?s +?d?d?s?s?l?l?d +?l?s?d?d?s?l?d +?u?d?l?d?d?s?s +?d?d?d?s?s?u?u +?l?d?d?u?s?s?d +?d?d?s?l?s?l?d +?l?d?s?l?d?s?d +?d?s?l?d?d?l?s +?d?d?s?d?u?u?s +?s?l?d?s?l?d?d +?d?d?s?d?d?s?u?u +?l?d?s?l?s?d?d +?l?s?s?d?l?d?d +?s?d?l?l?d?d?s +?d?d?s?u?d?s?u +?d?s?l?s?l?d?d +?l?d?s?s?d?d?l +?s?u?d?d?d?s?u +?s?d?d?d?l?s?l +?d?l?s?d?d?s?l +?u?l?s?d?d?d?s +?s?d?s?l?d?d?l +?d?d?s?l?s?d?l +?s?l?s?d?d?d?l +?s?d?d?l?d?l?s +?d?s?d?s?l?l?d +?u?d?s?s?l?d?d +?d?s?d?s?d?u?u +?s?l?d?s?d?l?d +?d?d?s?s?d?u?u +?d?l?l?d?s?d?s +?l?d?s?l?d?d?s +?d?d?u?s?l?d?s +?s?s?d?l?d?l?d +?d?l?d?d?l?s?s +?u?s?u?d?s?d?d +?d?d?u?l?s?s?d +?d?u?d?u?s?d?s +?s?d?d?s?d?l?l +?s?u?d?u?d?s?d +?u?s?u?d?d?s?d +?u?d?d?d?s?s?u +?s?u?d?u?s?d?d +?d?d?l?s?l?s?d +?l?d?s?d?l?d?s +?s?s?u?l?d?d?d +?d?l?s?d?d?l?s +?l?d?s?d?d?s?l +?u?l?s?d?s?d?d +?u?s?s?d?d?d?l +?s?d?d?l?l?s?d +?d?d?d?d?s?l?l?s +?s?l?d?d?s?l?d +?d?s?d?l?s?d?l +?d?s?s?d?d?l?l +?s?s?d?d?d?u?l +?s?d?s?d?d?u?l +?d?d?s?d?u?s?u +?u?s?d?u?d?s?d +?s?d?d?d?l?u?s +?s?d?l?s?l?d?d +?l?d?d?d?u?s?s +?l?d?d?s?u?d?s +?u?l?d?s?d?d?s +?d?s?d?d?l?s?l +?d?s?d?d?l?l?s +?s?s?d?d?u?d?u +?l?s?d?l?d?s?d +?d?s?s?d?l?l?d +?u?u?s?d?s?d?d +?d?l?d?s?d?s?l +?l?d?s?u?s?d?d +?s?d?l?d?d?l?s +?s?u?d?d?s?d?u +?d?s?d?u?s?d?u +?d?s?l?d?l?d?s +?d?l?s?u?s?d?d +?s?d?d?d?s?u?u +?d?s?d?l?s?l?d +?l?s?s?u?d?d?d +?l?d?l?s?d?d?s +?d?s?l?d?l?s?d +?u?d?l?d?l?l?d?l +?u?l?l?d?d?l?l?d +?u?u?d?u?u?d?u?d +?u?d?u?u?u?d?u?d +?d?d?d?u?u?l?l?l +?l?l?s?d?d?s?l?l +?d?d?d?d?d?s?u?l +?d?d?d?d?d?s?u?u +?l?d?d?l?d?s?d?d +?d?d?d?l?d?d?l?s +?u?l?d?d?s?d?d?d +?s?u?u?d?d?d?d?d +?l?d?d?l?d?d?s?d +?d?l?l?d?s?d?d?d +?u?l?d?s?d?d?d?d +?l?u?d?d?d?d?d?s +?d?d?s?d?d?l?l?d +?l?s?u?d?d?d?d?d +?l?d?d?d?l?s?d?d +?u?u?d?d?d?d?s?d +?u?u?d?d?d?s?d?d +?u?l?u?l?s?s?s +?d?d?d?d?l?d?d?l?d +?d?d?u?u?l?l?l?l +?u?d?l?l?s?l?d +?l?d?u?l?l?d?s +?l?u?u?l?s?d?d +?d?u?u?s?l?l?d +?l?s?u?u?l?d?d +?u?l?d?d?s?l?l +?u?d?l?s?u?l?d +?s?l?d?l?u?d?l +?s?l?u?l?u?d?d +?u?s?l?u?l?d?d +?d?d?l?l?l?u?s +?l?u?l?s?d?d?l +?d?d?u?l?l?u?s +?s?l?u?l?l?d?d +?d?l?d?l?l?s?l +?d?u?u?u?u?s?d +?l?d?d?l?l?u?s +?d?s?u?u?u?d?u +?u?u?s?d?d?l?l +?u?u?s?l?l?d?d +?u?d?d?l?l?s?l +?l?l?s?u?u?d?d +?u?d?d?s?l?l?l +?l?s?l?u?l?d?d +?l?l?s?d?d?u?u +?u?d?l?l?d?s?l +?u?l?l?d?l?s?d +?u?u?u?l?d?s?d +?u?s?d?u?d?u?u +?d?d?u?u?s?u?u +?l?u?u?u?d?d?s +?u?d?l?s?l?d?u +?u?u?s?l?d?d?u +?l?l?l?d?d?s?u +?d?l?d?s?l?l?u +?l?l?u?s?d?d?l +?u?d?l?l?l?s?d +?l?l?s?u?l?d?d +?u?d?u?s?u?d?u +?u?s?l?d?d?l?l +?d?s?d?u?l?l?l +?l?s?u?l?d?d?l +?u?l?l?s?d?l?d +?l?s?u?l?l?d?d +?u?s?l?l?d?l?d +?u?l?l?u?d?s?d +?u?l?d?s?u?l?d +?u?l?s?l?d?l?d +?l?l?d?l?d?s?l +?l?u?u?u?s?d?d +?u?d?l?l?s?u?d +?d?d?d?l?l?l?s?l +?l?l?l?l?s?d?d?l +?u?s?d?l?l?d?l +?u?l?d?d?l?s?l +?l?d?l?d?l?l?d?s +?s?u?u?d?d?u?u +?u?u?u?d?s?d?u +?d?u?u?u?u?d?s +?d?d?u?s?l?l?l +?u?u?u?u?d?s?d?d +?u?s?u?d?d?u?u +?s?d?l?l?l?l?d?d +?d?s?l?d?l?l?l +?d?l?l?l?l?s?d?d +?u?d?l?s?d?l?l +?u?l?u?d?d?l?s +?l?u?l?l?d?d?s +?d?d?l?l?l?l?s?s +?u?u?l?s?d?d?u +?d?d?u?s?u?l?l +?u?u?u?u?u?u?d?s +?u?u?s?u?s?u?u +?u?u?d?d?u?d?d?u +?u?d?l?d?l?u?d?d +?l?d?l?d?u?d?l?d +?u?u?d?l?l?d?d?d +?u?d?u?u?d?d?u?d +?u?d?d?u?d?u?d?u +?u?d?u?d?u?d?l?d +?u?d?u?d?d?u?u?d +?u?d?l?u?d?l?d?d +?u?d?d?l?l?d?d?u +?d?d?l?u?l?u?d?d +?u?d?l?d?d?l?l?d +?u?l?d?u?l?d?d?d +?l?l?d?d?d?d?u?l +?d?u?d?l?d?l?d?u +?u?d?d?u?u?d?u?d +?d?d?l?u?u?u?d?d +?u?u?d?d?u?d?u?d +?u?d?d?d?u?d?u?u +?d?d?d?u?u?u?d?u +?l?d?u?d?l?d?l?d +?d?u?d?u?u?u?d?d +?l?d?d?u?u?d?d?l +?d?d?u?u?u?d?d?u +?l?l?u?d?d?d?d?d?d +?d?d?d?d?u?l?l?d?d +?l?d?l?d?d?l?d?d?d +?d?d?d?s?s?l?l?l +?l?l?d?d?l?l?l?l?l +?u?l?d?d?d?d?d?d?s +?u?l?s?d?d?d?d?d?d +?s?s?s?s?d?d?l +?l?l?l?s?d?d?s?d?d +?u?u?u?l?u?l?d +?l?u?l?l?u?u?d +?u?u?u?u?l?d?l +?u?u?d?u?u?l?u +?l?u?l?l?d?l?u +?l?u?l?l?l?d?u +?l?u?u?u?u?d?u +?u?l?u?l?u?d?l +?u?l?d?l?u?u?u +?u?u?d?u?u?l?l +?l?l?d?u?u?l?l +?u?l?d?u?l?l?u +?u?d?u?d?u?u?u?u +?l?u?u?d?l?u?l +?l?u?l?l?l?u?d +?l?l?d?l?u?u?l +?d?l?l?l?u?u?l +?u?u?u?d?l?u?u +?u?d?l?l?d?l?l?l +?d?l?l?u?u?l?l +?d?u?u?u?u?l?l +?d?u?u?u?u?l?u +?u?u?l?l?u?l?d +?u?d?u?l?u?l?u +?u?u?l?u?u?l?d +?d?l?u?u?l?l?l +?u?l?u?l?d?l?u +?u?u?l?l?l?d?u +?u?d?l?l?l?u?l +?u?u?u?d?u?u?l +?l?d?l?l?u?u?l +?d?d?l?l?d?d?d?d?d?d +?d?d?d?d?d?d?s?d?l +?l?d?d?s?d?d?d?d?d +?l?l?l?l?l?u?u?u +?d?d?s?s?s?s?s +?u?d?u?s?l?l?l +?u?d?u?u?u?u?s +?u?s?d?u?l?l?l +?l?l?u?l?l?l?s +?l?l?l?l?s?u?d +?u?l?l?d?s?l?l +?u?l?l?d?l?s?l +?s?u?u?d?u?u?u +?l?l?d?d?s?l?l?l +?u?u?u?d?u?u?s +?u?u?d?s?u?u?u +?l?d?d?d?d?l?l?l?l +?l?l?d?l?l?l?l?l?l +?s?l?l?l?s?d?s +?d?d?u?l?l?u?l?l +?u?d?u?d?u?d?u?u +?u?l?u?u?l?d?d?d +?s?s?l?l?l?d?d?d +?l?d?d?d?d?l?l?d?d +?d?l?d?l?l?d?d?d?d +?l?l?l?l?d?d?d?d?d?d?d +?l?l?s?d?d?l?l?l +?u?l?s?l?l?l?d?d +?s?s?l?u?s?s +?s?s?s?l?s?l +?l?s?s?s?u?s +?s?s?u?s?l?s +?s?u?s?s?s?l +?s?s?s?s?u?l +?l?s?s?s?l?s +?s?s?s?l?u?s +?s?s?u?s?s?l +?l?s?u?s?s?s +?d?d?d?d?d?u?l?l?l +?u?u?l?l?d?d?s?s +?u?l?u?l?u?u?l +?l?u?l?u?u?u?u +?u?l?l?u?l?u?u +?d?d?d?d?s?d?d?s?d?d +?s?s?s?s?s?s?d +?u?s?u?u?u?s?u +?l?l?s?u?s?l?l +?u?u?s?d?d?s?s +?d?s?d?s?u?s?u +?l?s?d?s?d?s?l +?d?l?s?d?l?s?s +?l?s?s?l?s?d?d +?s?l?d?s?l?d?s +?s?s?s?d?d?u?u +?l?s?l?d?d?s?s +?d?l?s?s?d?l?s +?u?s?d?s?u?s?d +?s?l?s?s?l?d?d +?u?s?u?s?d?s?d +?u?d?u?d?s?s?s +?l?l?l?l?l?l?u?u +?u?l?l?d?l?d?l?l +?u?d?l?d?l?l?l?l +?u?l?l?d?d?d?d?d?d?d +?l?d?l?l?l?l?l?l?l +?d?d?d?d?d?d?d?d?d?s?d +?l?l?l?d?d?s?l?l +?d?d?d?d?l?l?l?d?d?d +?d?d?d?d?s?l?s?l +?l?d?d?s?l?d?d?s +?s?d?d?l?l?d?d?s +?s?l?d?d?l?d?d?s +?d?d?d?l?l?l?l?l?d +?l?s?l?l?s?l?s +?s?l?l?l?l?d?d?d?d +?u?u?d?d?d?d?d?d?s +?l?d?d?d?d?l?s?l +?d?l?l?l?s?d?d?d +?l?d?l?l?d?s?d?d +?d?d?u?u?u?d?d?s +?l?l?d?s?l?l?s +?s?s?l?l?d?l?l +?s?l?l?s?l?l?d +?u?d?u?u?u?u?d?u +?d?d?l?l?l?l?l?u +?u?l?u?u?l?l?d?d +?l?l?d?l?l?l?l?d?d +?u?d?l?l?u?d?l?l +?d?d?d?d?s?d?d?s?d +?u?l?l?s?l?d?d?d +?u?l?s?l?l?d?d?d +?d?d?d?d?d?l?l?l?s +?u?u?s?u?u?u?u?u +?l?l?l?l?s?d?s?d +?d?d?d?l?d?d?d?l?d +?d?d?d?u?l?d?d?d?d +?d?d?l?d?d?d?l?d?d +?d?d?s?s?d?d?s?s +?u?d?d?d?u?l?l?l +?l?l?d?d?d?u?u?u +?u?d?u?l?l?l?d?d +?u?u?u?d?d?u?u?d +?u?d?d?l?l?d?l?l +?u?u?l?l?u?d?d?d +?d?d?d?u?u?u?l?l +?l?d?d?d?d?s?s?s +?d?d?d?d?s?s?s?l +?u?u?l?l?u?u?s +?l?u?l?u?l?u?s +?l?l?l?l?s?l?u +?u?l?l?s?u?l?l?l +?d?d?d?d?s?d?l?d +?d?d?s?d?d?d?d?u +?d?d?l?d?d?d?s?d +?d?l?d?d?s?d?d?d +?d?d?d?s?u?d?d?d +?d?d?s?d?d?d?l?d +?d?d?s?d?d?u?d?d +?l?d?d?d?d?d?d?s?d +?d?d?d?d?d?u?d?s +?d?d?d?d?d?s?d?u +?d?d?s?u?d?d?d?d +?u?d?d?d?s?d?d?d?d +?s?d?d?d?d?u?d?d +?d?d?d?d?s?u?d?d +?s?d?d?d?d?d?l?d +?d?d?d?d?d?u?s?d +?d?s?d?l?d?d?d?d +?d?d?d?s?d?d?d?u +?d?s?d?d?d?d?l?d +?d?d?d?d?u?d?d?s +?d?d?d?d?l?d?s?d +?s?d?d?d?l?d?d?d +?d?d?s?d?d?d?u?d +?u?d?d?d?d?s?d?d +?d?d?u?d?d?d?d?s +?d?d?d?u?s?d?d?d +?d?l?d?d?d?d?s?d +?d?s?d?d?l?d?d?d +?d?d?d?d?s?d?u?d +?u?u?d?u?u?d?u?u +?d?u?u?u?u?d?u?u +?u?d?u?u?u?u?u?d +?u?l?l?l?d?d?d?d?s +?l?s?d?d?d?d?d?d?d?d +?u?l?l?d?d?d?s?s +?l?l?l?d?d?l?l?s +?u?d?d?d?l?d?d?l +?d?d?d?d?l?u?u?d +?d?d?u?d?l?l?d?d +?d?u?d?l?d?d?l?d +?u?d?d?d?u?l?d?d +?d?d?u?d?d?l?d?u +?d?d?u?d?d?l?d?l +?d?u?d?d?d?d?l?l +?d?l?d?l?u?d?d?d +?d?d?l?d?d?d?u?l +?u?d?d?l?u?d?d?d +?d?u?u?d?u?d?d?d +?d?u?l?u?d?d?d?d +?d?u?d?d?l?d?d?l +?l?u?d?u?d?d?d?d +?l?d?d?d?d?l?d?u +?l?d?d?d?l?d?d?u +?d?l?u?d?d?d?d?l +?d?d?d?l?l?d?d?u +?d?d?u?u?d?u?d?d +?d?l?d?d?d?u?d?l +?d?d?d?d?u?l?d?l +?u?d?d?u?d?l?d?d +?l?d?d?d?u?d?u?d +?u?d?d?u?d?d?l?d +?d?d?u?u?l?d?d?d +?d?u?d?d?l?l?d?d +?l?d?l?u?d?d?d?d +?u?d?u?d?d?l?d?d +?l?d?u?u?d?d?d?d +?d?l?d?l?d?d?u?d +?u?d?d?d?d?l?d?l +?d?l?d?l?d?d?d?u +?l?d?u?l?d?d?d?d +?d?l?l?d?u?d?d?d +?d?d?d?u?u?d?u?d +?u?d?l?d?u?d?d?d +?u?d?u?d?d?d?u?d +?d?u?d?l?d?d?d?u +?d?u?d?u?d?d?d?u +?u?l?d?d?d?l?d?d +?u?d?d?d?d?u?d?u +?d?d?d?l?d?l?d?u +?d?d?u?l?d?l?d?d +?d?u?d?d?u?u?d?d +?d?d?d?u?u?d?d?l +?d?l?u?l?d?d?d?d +?d?d?u?u?d?d?l?d +?l?l?l?d?d?d?l?d?d +?d?d?u?l?u?d?d?d +?d?d?l?l?d?d?u?d +?l?d?l?l?l?l?l?s +?u?l?l?d?l?l?d?l +?s?l?l?l?l?l?d?s +?u?u?s?u?u?d?d?d +?l?l?d?d?d?s?l?l +?u?l?l?l?l?d?s?d +?l?s?l?l?l?d?d?d?d +?u?u?u?u?u?l?u +?u?u?l?u?u?u?u +?l?u?u?u?l?u?u +?u?l?u?l?u?u?u +?u?u?u?u?l?u?u +?l?u?l?l?u?l?u +?d?d?d?s?s?s?d?d +?s?d?s?d?d?s?d?d +?d?s?d?s?d?d?d?s +?l?l?d?d?d?s?s?s +?d?d?d?s?l?l?l?l?l +?s?l?s?l?d?l?s +?d?l?s?l?s?l?s +?l?s?d?s?l?s?l +?u?l?l?l?l?u?l?d +?d?d?d?s?d?d?d?d?s +?d?d?d?d?d?d?s?s?d +?l?l?l?d?d?u?l?l +?u?u?u?d?d?d?s?s +?d?s?l?l?l?s?d?d +?u?s?u?s?u?d?d?d +?s?s?d?d?s?s?d?d +?u?l?l?d?d?d?u?u +?u?l?d?d?d?u?l?l +?d?d?d?d?l?u?u?l +?l?u?d?d?l?u?d?d +?d?u?u?d?d?d?u?u +?d?u?u?d?u?d?u?d +?u?l?d?l?d?d?l?l +?u?d?d?l?d?d?u?l +?d?u?u?d?u?u?d?d +?u?d?d?l?u?l?d?d +?u?l?d?l?d?l?d?l +?u?l?u?d?d?d?d?u +?u?u?d?d?d?d?u?l +?u?d?u?u?d?u?u?d +?u?d?d?d?l?l?d?l +?u?u?d?u?d?u?u?d +?u?d?d?u?d?u?u?d +?u?d?d?l?l?l?d?l +?l?u?l?l?d?d?d?l +?u?d?d?d?l?l?l?d +?d?u?u?u?d?d?d?u +?d?d?d?u?l?u?l?u +?u?u?d?u?d?d?u?d +?u?d?d?l?d?l?d?l +?u?l?d?d?d?d?u?u +?u?l?d?d?d?l?d?l +?u?l?d?l?l?d?l?d +?u?l?d?l?l?d?d?l +?u?l?d?d?d?l?l?d +?u?d?l?d?u?d?u?d +?l?l?l?s?d?d?d?d?d?d +?d?d?d?l?l?l?l?l?d?d +?l?s?l?d?d?s?d?d +?l?d?d?l?d?d?s?s +?l?l?l?d?l?l?d?d?d +?u?s?s?l?l?l?l +?d?d?l?l?l?l?l?l?d +?d?d?d?l?d?d?d?l?l +?l?d?d?d?d?l?d?d?l +?d?d?d?d?l?l?d?d?l +?l?d?l?d?l?d?l?d?l?d +?s?l?l?l?l?l?u +?l?d?l?d?l?l?d?d?d +?d?l?l?l?l?l?d?s +?s?d?d?d?s?l?s +?s?s?d?l?d?s?d +?s?s?u?d?d?d?s +?s?s?s?d?l?d?d +?d?s?d?d?l?s?s +?s?s?s?u?d?d?d +?s?s?s?d?d?l?d +?s?s?s?d?d?d?d?l +?s?s?l?s?d?d?d +?d?s?d?s?d?s?u +?d?d?d?s?s?l?s +?s?u?d?d?d?s?s +?s?d?d?d?l?s?s +?s?d?d?l?d?s?s +?d?s?s?s?d?d?l +?d?s?d?d?s?l?s +?s?s?d?s?d?d?l +?s?d?l?s?s?d?d +?l?d?d?s?s?s?d +?s?d?s?d?s?d?u +?s?s?l?d?s?d?d +?l?d?d?s?d?s?s +?s?l?d?s?s?d?d +?s?s?u?s?d?d?d +?l?s?d?s?d?d?s +?d?s?d?d?s?s?u +?u?s?d?s?d?s?d +?u?s?d?s?s?d?d +?d?s?l?s?s?d?d +?s?s?d?d?d?s?l +?s?l?s?d?d?d?s +?l?s?s?s?d?d?d?d +?d?s?d?l?s?d?s +?d?l?d?d?s?s?s +?s?l?d?d?s?d?s +?u?s?s?s?d?d?d +?l?l?l?l?l?d?l?d?d +?u?l?d?l?l?l?d?l +?l?l?s?l?l?d?d?d?d +?l?s?l?l?d?l?d?d +?d?l?l?l?l?d?d?s +?d?d?d?d?d?d?d?d?l?s +?l?l?l?s?l?l?l?d?d +?d?d?d?s?d?d?s?l +?s?d?d?l?d?d?d?s +?s?s?l?d?d?d?d?d +?d?d?s?d?d?s?d?l +?l?l?l?l?s?d?l?l +?l?s?l?s?l?s?l?s +?d?d?d?d?d?d?u?u?u?u +?l?d?d?l?l?l?d?d?d +?u?d?d?d?d?d?d?d?d?l +?d?d?d?d?s?d?d?d?l +?s?l?d?l?l?s?d +?u?u?s?l?s?d?d +?u?d?l?d?l?s?s +?s?d?u?u?u?s?d +?s?d?d?s?u?u?u +?l?l?s?d?d?l?s +?l?s?d?l?d?l?s +?l?l?d?l?s?d?s +?d?s?l?d?l?l?s +?u?l?d?l?d?s?s +?s?d?l?s?l?l?d +?d?d?s?l?l?s?l +?u?s?d?d?s?u?u +?d?l?l?s?d?l?s +?d?l?l?s?l?s?d +?l?s?d?d?l?l?s +?u?l?l?s?d?s?d +?l?s?s?l?d?l?d +?s?l?l?l?d?s?d +?d?l?s?s?l?l?d +?s?d?d?u?l?u?s +?s?d?u?l?l?s?d +?l?d?s?l?l?d?s +?s?d?l?d?l?l?s +?d?s?u?l?l?s?d +?s?l?l?d?d?s?l +?d?l?l?l?s?d?s +?l?s?l?s?u?d?d +?l?s?l?d?l?s?d +?d?l?l?s?s?d?l +?s?s?u?u?d?d?u +?d?s?s?l?l?d?l +?u?s?s?u?d?u?d +?u?l?l?d?s?d?s +?s?d?s?l?d?l?l +?s?d?l?d?s?l?l +?d?u?s?d?u?u?s +?u?s?u?d?d?l?s +?u?l?d?d?s?s?l +?u?d?l?d?s?l?s +?s?d?l?s?l?d?l +?d?d?u?s?u?s?u +?u?u?s?s?d?d?l +?d?s?s?d?l?l?l +?s?s?d?l?l?l?d +?u?s?s?l?l?d?d +?u?d?l?l?d?s?s +?l?s?l?s?d?l?d +?s?l?s?d?l?l?d +?u?u?d?d?s?s?u +?l?s?s?s?s?s?s +?u?u?d?u?u?u?d?u +?u?d?d?d?u?d?d?d?d +?u?d?d?d?d?l?d?d?d +?d?l?d?d?d?l?d?d?d +?u?d?d?d?d?d?u?d?d +?d?d?l?d?d?d?d?l?d +?d?d?d?d?d?d?u?l?d +?d?d?d?d?d?d?u?u?d +?l?s?s?s?l?l?l +?l?l?s?l?l?s?s +?d?d?u?l?l?s?d?d +?l?u?u?s?d?d?d?d +?l?d?l?l?d?d?d?s +?d?l?l?l?d?s?d?d +?l?d?d?d?d?l?l?s +?l?s?l?d?l?d?d?d +?d?d?d?d?d?d?s?u?u +?d?d?d?d?d?d?s?s?l +?d?l?l?d?l?d?d?d?d +?d?d?u?l?u?d?d?d?d +?u?u?d?d?d?d?d?d?l +?u?l?d?l?u?l?s +?s?l?l?u?l?l?d +?u?u?u?s?u?d?u +?u?l?s?l?u?d?l +?u?u?u?s?l?l?d +?u?l?l?s?l?d?l +?u?u?s?d?l?l?l +?d?u?u?u?u?s?u +?u?l?l?u?l?s?d +?d?l?l?s?l?l?u +?u?l?u?l?l?s?d +?u?l?d?l?s?l?l +?s?l?d?l?l?l?u +?u?s?l?d?l?l?l +?s?u?u?u?u?d?u +?u?u?l?l?l?d?s +?d?d?d?d?l?l?l?l?d?d +?u?d?d?d?d?d?d?d?d?d?d +?l?l?l?d?d?s?s?s +?u?u?u?l?l?l?d?d?d +?d?d?s?d?d?d?s?d?d +?u?d?l?l?l?d?d?l +?u?l?l?l?d?d?l?d +?d?d?d?l?l?l?u?u +?u?l?d?d?l?d?l?l +?l?d?d?d?l?l?l?d?d +?d?d?l?d?d?l?d?d?d?d +?u?s?l?s?l?l?d +?u?d?l?l?s?l?s +?s?l?l?l?l?l?s?d +?l?s?d?l?l?s?l +?d?l?s?l?l?l?s +?l?s?s?d?l?l?l +?u?l?l?s?s?l?l +?l?l?l?s?l?s?d?d +?d?u?u?u?u?s?s +?u?l?l?d?l?s?s +?s?l?l?s?l?d?l +?l?l?d?s?s?l?l +?l?d?s?l?l?l?s +?l?l?s?s?l?l?d +?l?d?s?s?l?l?l +?l?s?l?d?s?l?l +?l?d?s?l?s?l?l +?l?l?s?l?s?d?l +?d?u?u?u?u?u?d?u +?u?d?d?u?l?l?l?l +?d?u?d?u?u?u?u?u +?u?l?l?l?l?l?s?d?d +?l?l?d?s?s?s?s +?l?l?l?d?d?d?d?s?s +?l?u?u?l?u?u?l +?u?u?l?u?l?l?l +?u?l?l?l?l?u?u?d +?l?l?u?l?u?l?u +?l?l?u?l?u?l?l +?l?u?u?l?u?l?l +?l?u?u?l?l?l?l +?l?u?u?u?u?l?l +?l?u?l?u?l?l?u +?u?u?l?l?d?d?d?s +?u?u?l?l?s?d?d?d +?l?l?d?l?l?s?d?d +?d?d?l?l?l?l?s?d +?s?s?d?d?d?l?l?l +?l?d?l?d?d?l?d?l?d +?s?d?l?l?l?l?s?d +?s?s?s?s?l?s +?l?l?l?l?l?s?d?s +?s?u?l?u?l?u?l +?l?u?l?l?l?l?s +?l?l?l?s?l?u?l +?u?l?l?s?l?l?u +?l?l?l?l?u?l?s +?l?l?l?s?l?l?u +?l?l?l?d?s?l?l?l +?l?d?l?d?d?d?d?d?d?d +?s?s?l?l?l?l?s?s +?u?s?l?s?l?s?l +?l?u?u?l?l?d?l +?d?l?l?u?u?u?l +?l?d?l?u?l?l?u +?d?l?u?l?l?l?u +?l?l?l?l?u?l?l?d +?u?d?l?u?l?l?u +?l?u?l?d?u?l?u +?d?l?u?u?u?u?l +?l?l?d?u?u?l?u +?u?l?l?u?u?d?l +?u?l?l?u?u?d?u +?l?u?l?u?d?l?l +?u?u?u?d?l?l?u +?l?u?u?u?d?u?u +?u?u?d?u?l?l?u +?u?l?u?u?d?u?u +?u?d?l?u?l?u?u +?l?l?d?u?l?u?l +?l?l?u?l?l?d?u +?l?l?l?u?d?u?u +?u?u?l?u?u?d?l +?l?l?u?d?l?u?u +?u?l?u?u?d?u?l +?l?d?l?u?u?l?l +?u?u?u?l?l?d?u +?u?u?d?l?u?u?u +?u?u?l?d?l?u?u +?u?u?l?u?d?u?u +?d?l?l?u?l?u?u +?l?l?u?u?u?d?l +?l?l?l?u?u?d?l +?l?u?d?l?l?u?l +?u?l?d?l?l?u?u +?u?l?d?l?l?u?l +?d?l?u?l?u?l?l +?l?l?d?l?u?l?l +?l?u?u?d?u?l?u +?l?l?u?l?u?u?d +?u?u?u?u?d?u?l +?u?l?l?d?u?l?u +?d?l?u?l?u?u?l +?l?u?l?l?u?l?d +?d?u?l?l?u?u?u +?l?l?l?l?d?l?d?s +?u?l?l?l?l?l?u?u +?l?d?d?l?d?d?d?d?l +?s?s?l?l?l?l?l?l +?u?l?l?l?l?l?s?s +?l?d?d?l?d?l?d?l?d +?l?d?d?l?d?d?d?d?d?d +?l?l?l?l?l?u?u?d +?l?l?l?l?u?l?l?l +?u?s?d?d?d?d?s?u +?d?d?d?d?u?u?s?s +?s?u?u?d?d?d?d?s +?l?s?l?d?d?d?d?s +?l?s?l?s?l?d?s +?l?s?l?s?d?l?s +?l?l?d?l?s?s?s +?d?l?l?l?l?l?l?u +?d?s?l?l?l?l?s?d +?l?l?l?l?d?d?l?s +?l?d?d?l?l?l?l?d?d +?l?l?l?l?l?s?d?d?d?d +?l?l?l?d?d?l?d?d?d +?l?l?l?s?d?d?s?d +?u?u?u?u?d?d?l?l +?l?l?l?d?d?l?l?u +?u?l?d?d?u?l?l?l +?u?l?u?u?l?u?d?d +?u?l?l?l?s?l?s +?s?l?u?l?u?l?s +?u?u?u?u?s?u?s +?u?s?u?u?u?u?s +?u?l?l?d?d?d?u?l +?l?l?l?d?d?d?u?l +?u?u?d?d?u?u?u?d +?l?l?u?l?d?d?d?l +?u?l?l?d?l?d?l?d +?l?l?d?d?d?u?l?l +?u?u?u?u?d?d?u?d +?l?d?l?l?l?l?l?d?d +?u?l?l?l?u?s?d?d +?l?d?l?l?d?l?l?s +?u?l?l?l?s?l?l?l +?l?s?l?s?l?s?s +?u?d?d?d?d?d?d?l?l +?d?d?d?d?d?l?l?d?l +?l?u?u?d?d?d?d?d?d +?l?d?d?l?l?l?l?l?l +?l?s?l?s?l?l?l?l +?l?u?l?l?u?l?d?d +?l?l?l?d?l?l?l?l?d +?u?u?l?l?d?d?d?d?d +?u?d?d?d?d?u?s?d +?d?d?s?d?l?l?d?d +?d?d?d?d?u?u?s?d +?l?d?d?d?d?l?s?d +?d?d?d?l?l?d?s?d +?d?d?u?d?d?u?d?s +?u?s?d?d?d?d?d?l +?l?d?d?d?s?d?d?l +?d?d?d?d?l?d?l?s +?u?s?l?d?d?d?d?d?d +?l?d?d?s?d?l?d?d +?s?d?u?u?d?d?d?d +?d?d?s?l?d?d?d?l +?d?s?d?l?l?d?d?d +?d?l?d?d?l?s?d?d +?d?d?d?l?s?l?d?d +?d?d?l?d?d?l?s?d +?l?d?l?d?d?s?d?d +?s?d?l?d?l?d?d?d +?u?d?d?d?d?d?s?l +?s?d?d?l?l?d?d?d +?u?d?u?d?s?d?d?d +?d?d?l?s?l?d?d?d +?d?d?l?d?d?l?d?s +?d?d?d?d?s?l?d?l +?l?l?l?l?d?d?s?l +?s?d?u?u?u?u?u?u +?l?l?s?s?l?d?d?d +?s?d?d?d?s?l?l?l +?u?d?d?l?d?d?d?d?d +?d?d?d?d?d?u?u?d?d +?l?l?l?l?l?l?l?d?d?d?d +?u?l?l?l?u?u?s +?l?l?l?l?u?s?u +?l?u?l?s?l?u?l +?d?d?d?s?d?d?d?d?d?d?d +?d?d?u?d?u?u?u?d +?u?d?d?u?d?u?d?l +?d?d?l?l?d?d?l?u +?l?d?d?l?u?l?d?d +?u?d?d?u?l?l?d?d +?d?d?d?d?u?u?l?u +?u?d?l?l?u?d?d?d +?d?d?u?l?d?d?u?u +?d?l?d?l?d?l?d?u +?u?l?u?d?d?l?d?d +?l?l?u?d?l?d?d?d +?l?u?d?d?d?u?l?d +?u?u?d?u?d?u?d?d +?d?d?u?l?l?d?d?u +?l?u?d?d?u?u?d?d +?u?l?d?d?u?u?d?d +?l?u?d?d?u?l?d?d +?l?d?d?d?d?l?l?u +?d?d?l?l?d?l?l?d?d +?d?d?u?l?u?u?d?d +?d?u?u?d?d?u?u?d +?l?u?d?d?d?d?u?l +?d?u?d?u?d?u?u?d +?d?u?l?d?d?l?l?d +?u?d?d?l?l?d?l?d +?u?u?d?d?d?l?l?d +?u?l?d?u?d?l?d?d +?d?d?u?u?u?d?u?d +?d?d?u?u?u?l?d?d +?u?u?d?d?u?l?d?d +?u?d?u?d?l?d?u?d +?d?u?d?d?u?u?d?u +?u?u?d?u?d?d?d?u +?l?l?d?u?u?d?d?d +?u?l?l?d?d?l?l?u +?u?l?l?l?d?l?d?l +?d?u?u?d?u?u?u?u +?l?l?d?d?u?l?l?l +?d?d?u?u?u?u?u?u?u +?l?l?u?l?l?l?l?d +?u?l?l?u?u?u?l +?u?l?u?u?l?u?u +?l?s?d?d?l?l?l?l +?d?u?l?l?d?d?d?s +?l?s?d?l?l?l?d?d +?l?d?d?l?d?l?d?s +?l?l?u?s?d?d?d?d +?l?l?d?l?d?s?d?d +?s?l?d?d?l?l?d?d +?l?l?d?d?l?d?d?s +?l?l?l?d?s?d?d?d?d +?d?d?d?l?l?l?d?s +?d?d?s?u?l?l?d?d +?l?l?d?d?s?l?d?d +?l?d?l?d?s?l?d?l +?l?l?d?d?l?l?d?s +?l?d?d?s?d?d?l?l +?l?d?l?d?d?l?d?s +?u?d?l?l?s?d?d?d +?u?u?u?u?d?d?s?d +?l?d?l?s?l?d?d?d +?l?l?l?l?u?d?d?d?d +?u?l?d?d?d?d?d?d?l +?u?d?d?d?d?d?d?u?u +?l?d?l?d?d?l?d?d?l +?d?d?d?u?l?u?d?d?d +?s?l?l?l?s?l?s +?l?l?d?d?d?d?s?d?d +?d?d?s?l?l?l?s?d?d +?l?l?l?l?d?l?l?d?d +?u?s?l?l?l?s?u +?l?u?u?u?u?d?d?d?d +?d?d?d?u?l?l?l?l?l +?d?s?d?s?s?d?s +?s?d?d?s?s?d?s +?s?d?s?d?s?s?d +?d?s?s?d?s?s?d +?s?s?d?d?s?s?d +?d?s?s?d?d?s?s +?u?d?d?d?d?u?d?d?d?d +?l?l?l?l?l?l?l?d?s +?l?l?l?u?l?l?l?l +?u?l?l?d?u?u?d +?d?d?u?d?u?u?u?u +?l?l?u?u?d?l?d +?u?d?u?l?l?d?u +?l?l?u?d?u?l?d +?u?u?l?d?u?u?d +?d?u?d?u?l?u?l +?d?u?l?d?l?u?u +?u?u?d?u?u?l?d +?u?l?u?d?l?l?d +?u?u?d?u?u?d?l +?d?u?u?l?l?u?d +?d?u?d?l?l?l?u +?l?l?d?u?d?u?l +?u?d?u?u?d?l?l +?u?d?d?l?u?u?u +?d?l?l?l?u?d?l +?d?u?d?u?u?u?u?d +?d?u?l?u?l?d?u +?u?u?d?u?l?l?d +?u?l?l?u?u?u?d?d +?d?l?u?u?u?l?d +?l?u?l?d?u?d?u +?l?u?l?d?u?d?l +?l?u?d?u?l?d?l +?l?u?l?u?d?u?d +?u?l?d?d?l?l?d?l +?u?l?d?u?u?d?l +?d?u?u?u?l?u?d +?l?u?u?d?d?l?u +?l?l?d?l?u?d?l +?l?d?d?l?u?u?l +?u?d?u?u?l?u?d +?d?u?u?d?u?u?u?d +?d?u?l?d?u?l?u +?d?u?l?u?u?d?l +?l?u?u?l?d?d?l +?l?l?u?d?l?d?l +?l?l?u?d?l?d?u +?u?l?u?d?l?u?d +?u?u?d?u?l?d?u +?l?d?l?u?u?l?d +?d?d?d?l?l?u?u?u +?l?u?d?l?l?d?l +?l?l?u?l?d?d?u +?l?l?u?l?d?d?l +?l?d?u?u?l?u?d +?d?u?d?u?u?l?l +?u?u?l?d?l?l?d +?l?d?d?u?l?u?l +?l?d?d?l?l?u?l +?d?d?d?u?l?l?l?u +?u?l?u?u?d?d?d?u +?d?l?u?u?l?u?d +?l?d?u?l?l?d?u +?u?d?d?u?l?u?u +?l?u?d?d?u?l?l +?l?d?l?u?d?u?u +?d?u?u?l?u?l?d +?l?l?d?u?d?l?l +?l?l?d?u?d?l?u +?l?d?u?u?u?u?d +?u?l?l?d?l?d?u +?l?u?d?l?u?d?l +?l?u?l?d?d?u?u +?d?l?l?u?u?d?u +?l?l?u?d?d?u?l +?d?u?l?u?u?d?u +?l?d?u?u?u?d?u +?l?u?l?d?l?u?d +?l?u?u?l?d?u?d +?u?u?u?d?u?d?l +?l?u?d?u?l?l?d +?d?l?l?d?l?u?u +?l?d?d?l?u?u?u +?d?l?l?u?l?d?l +?u?u?d?d?u?d?u?u +?l?d?l?u?l?u?d +?u?u?u?d?l?u?d +?u?l?u?d?u?l?d +?l?l?u?l?d?u?d +?u?u?l?l?d?u?d +?l?u?d?d?l?u?l +?l?l?u?u?l?d?d?d +?u?d?l?d?l?u?l +?u?u?l?d?d?u?l +?u?u?l?d?d?u?u +?d?d?u?l?u?u?u +?u?l?l?d?l?u?d +?l?d?d?u?u?l?l +?l?d?u?l?l?l?d +?l?l?d?l?u?u?d +?l?u?d?d?l?l?u +?d?l?d?u?l?u?u +?d?l?u?u?l?d?l +?u?l?u?u?d?l?d +?l?u?d?u?u?u?d +?d?d?l?u?u?l?u +?u?l?u?u?d?d?u +?u?d?l?d?u?l?u +?u?d?u?l?l?u?d +?u?d?u?d?u?l?u +?u?d?l?u?l?u?d +?d?u?u?l?d?u?u +?u?l?d?l?d?u?l +?u?u?l?d?l?u?d +?u?d?l?u?u?d?u +?d?l?d?u?l?l?u +?u?u?d?u?l?u?d +?u?u?u?s?u?u?d?d +?u?d?d?u?u?u?u?d +?l?l?l?d?d?d?l?u +?l?d?u?l?u?l?d +?d?u?u?l?d?l?l +?l?d?l?d?u?l?l +?u?l?u?l?u?s?d?d +?u?d?u?d?l?u?l +?u?d?u?u?d?u?l +?l?d?u?u?l?d?l +?d?u?u?u?u?d?l +?l?u?u?d?u?u?d +?l?d?u?d?l?u?l +?l?l?l?u?d?u?d +?l?u?u?d?u?l?d +?d?u?l?u?d?l?u +?l?d?u?l?l?u?d +?u?l?d?u?d?u?u +?u?l?d?u?d?u?l +?d?l?u?l?d?l?l +?l?u?d?d?l?u?u +?u?u?d?l?l?d?u +?u?u?d?d?l?u?l +?d?u?u?l?u?u?d +?u?d?l?u?d?u?l +?u?d?l?u?d?u?u +?l?d?l?u?u?u?d +?u?l?d?l?d?l?l?l +?d?l?u?l?d?u?u +?d?l?u?l?d?u?l +?l?l?d?u?l?l?d +?u?d?d?u?u?l?u +?u?u?d?d?l?l?u +?d?l?u?d?u?u?l +?d?d?u?l?l?l?l?s +?u?u?d?l?u?d?l +?d?l?d?u?u?u?u +?l?d?u?l?d?u?l +?d?d?l?u?u?u?l +?d?u?l?l?u?u?d +?l?u?u?l?d?l?d +?d?l?u?u?d?l?u +?d?l?u?u?d?l?l +?d?u?l?d?l?l?u +?l?l?l?l?l?s?l?l?l +?l?s?l?l?s?d?d?d +?d?d?s?s?s?d?d?d +?d?s?d?s?d?d?s?d +?s?d?d?s?d?d?d?s +?d?d?s?d?d?s?s?d +?d?d?s?d?d?s?d?s +?d?d?d?s?d?d?d?s?d +?u?l?l?l?s?u?l?l +?l?l?d?s?l?l?l?l +?l?d?s?s?s?l?d +?s?d?d?s?l?l?s +?s?s?s?l?d?l?d +?d?s?l?l?s?s?d +?d?d?s?l?s?l?s +?l?d?s?l?d?s?s +?l?s?d?d?s?l?s +?d?l?l?d?s?s?s +?d?s?d?s?l?l?s +?s?d?s?l?l?s?d +?l?l?d?s?d?s?s +?u?l?s?d?s?d?s +?s?d?d?l?s?l?s +?s?u?s?u?s?d?d +?s?l?s?d?l?d?s +?d?s?l?s?d?l?s +?u?u?s?s?d?d?s +?u?s?u?s?d?d?s +?s?d?d?s?s?l?l +?u?u?s?d?d?s?d?d +?s?u?u?s?d?d?d?d +?d?d?l?l?s?s?d?d +?l?l?d?d?s?d?d?s +?s?l?s?l?d?d?d?d +?l?l?d?d?s?s?d?d +?l?l?l?l?d?l?l?l?d +?d?d?u?l?l?l?l?u +?l?l?s?l?l?s?l?l +?d?d?d?d?d?d?u?u?s +?s?d?d?d?d?d?d?l?l +?u?u?u?u?u?d?d?d?d?d +?l?l?l?s?s?d?l +?u?l?u?l?d?s?s +?u?u?u?u?s?d?s +?s?s?l?d?l?l?l +?s?u?d?l?l?l?s +?d?s?l?l?s?l?l +?u?s?u?u?d?u?s +?d?l?l?l?s?l?s +?u?s?u?u?u?s?d +?u?l?l?s?l?s?d +?s?d?d?l?l?l?l?s +?s?d?u?u?u?u?s +?s?u?u?u?u?s?d +?u?u?d?u?u?s?s +?d?l?l?s?s?l?l +?d?s?l?s?l?l?l +?l?l?s?s?d?l?l +?s?u?u?u?u?d?s +?l?l?l?d?s?l?s +?l?l?l?l?u?u?u?d +?d?d?l?l?d?d?l?d?d +?d?d?d?d?d?d?u?u?l +?l?d?d?d?l?l?l?l?l +?d?d?d?u?l?l?l?s +?u?l?u?l?d?d?d?s +?l?l?d?l?l?d?d?s +?s?d?l?l?l?s?s +?l?s?s?s?l?l?d +?s?l?l?l?s?s?d +?s?l?s?l?l?l?s +?u?s?u?l?l?l?d?d +?d?d?s?u?l?l?l?l +?u?u?s?u?u?u?d?d +?l?d?s?s?s?s?s +?l?l?u?s?l?l?l +?u?l?u?s?l?u?l +?l?l?s?u?u?u?u +?u?l?l?l?u?s?u +?l?l?l?u?s?l?l +?u?u?u?u?d?u?d?u +?u?l?u?d?d?u?l?u +?d?d?u?u?u?l?l?l +?d?u?l?l?l?l?u?d +?u?u?u?u?u?u?s?s +?u?s?u?s?u?l?l +?u?u?l?l?l?s?s +?u?l?l?s?l?l?s +?s?s?u?l?u?s?s +?l?s?s?l?s?s?l +?l?l?l?s?l?l?l?s +?s?s?s?d?d?s?s +?l?l?d?d?l?l?d?d?l +?s?d?u?u?l?l?l +?u?l?u?u?l?s?d +?u?l?u?l?d?l?s +?u?u?d?u?u?u?s +?u?l?l?l?u?d?s +?s?d?u?l?l?l?u +?u?s?u?u?u?d?u +?d?u?u?u?s?u?u +?u?d?u?u?s?u?u +?l?l?l?l?d?u?s +?d?u?s?u?u?u?u +?d?d?l?s?l?l?l?l +?d?u?s?l?l?l?l +?l?l?l?l?u?d?s +?u?l?d?l?l?s?l +?l?l?l?s?l?d?u +?s?l?l?l?l?u?d +?u?l?l?s?u?u?d +?u?u?u?d?s?l?l +?l?d?l?u?l?s?l +?l?l?l?u?u?d?s +?d?l?l?l?l?u?s +?s?l?l?l?d?l?u +?u?d?u?u?u?s?u +?l?d?u?s?l?l?l +?u?l?l?s?l?l?l?l +?l?l?d?d?s?d?d?d?d +?l?d?d?d?d?d?d?l?s +?d?d?d?l?l?l?l?l?l?l +?u?u?u?d?u?d?u?d +?u?u?l?l?d?d?d?l +?l?u?d?d?d?l?l?l +?l?d?l?l?d?l?d?l?d +?l?l?d?d?d?l?l?u +?d?u?u?d?d?u?u?u +?u?u?d?l?l?l?d?d +?u?l?u?d?d?d?u?l +?l?l?l?u?d?d?d?l +?u?l?u?u?u?d?d?d +?d?u?u?u?d?u?u?d +?s?d?u?l?l?l?l?l +?u?l?u?l?l?d?d?d?d +?u?l?d?s?s?s?s +?l?l?s?d?s?s?s +?s?s?l?l?d?s?s +?l?u?u?l?u?u?u +?u?u?l?u?l?u?l +?u?l?u?l?l?u?u +?u?l?u?u?l?l?u +?u?u?u?l?l?l?u +?u?u?u?u?l?u?l +?l?l?u?u?l?l?u +?l?l?l?l?l?u?l?d +?u?l?l?l?l?l?d?u +?u?s?l?l?l?l?l?d +?u?l?u?l?l?u?d?d +?l?d?l?l?d?d?l?d?d +?l?d?l?d?l?d?d?l?d +?l?s?l?l?l?s?d?d +?s?d?l?l?l?l?d?s +?u?d?d?s?d?d?s?d?d +?l?d?l?l?d?l?l?d?d +?l?d?l?d?d?d?d?d?l +?d?d?d?u?d?d?d?d?u +?l?d?l?d?d?d?d?l?d +?u?d?d?d?l?d?d?d?d +?d?d?l?l?d?d?d?d?l +?d?d?d?d?d?l?l?d?d?d +?d?d?s?u?u?u?u?u +?d?l?l?l?l?d?l?s +?u?l?l?s?l?l?d?d +?d?d?d?d?d?d?s?d?s +?l?u?l?l?l?l?l?d +?u?s?u?u?u?d?d?d +?u?l?l?l?d?d?s?d +?d?d?l?l?l?l?d?s +?u?u?u?s?u?d?d?d +?s?u?u?u?u?d?d?d +?l?d?l?l?s?l?d?d +?l?d?l?l?d?l?d?s +?u?l?s?u?l?l?l?l +?u?l?l?l?l?d?d?d?d?d +?d?d?d?d?d?d?d?l?l?d +?u?u?u?l?l?d?d?d?d +?s?d?d?s?d?d?s?d?d +?d?d?d?s?s?s?d?d?d +?d?d?d?l?l?d?d?l?l +?l?l?d?d?d?d?l?l?d +?u?u?u?u?d?l?l?l +?l?l?l?d?d?l?l?l?d +?l?l?l?l?l?s?s?l +?u?l?l?u?l?l?d?d?d +?l?l?d?d?d?s?d?d?d +?l?l?l?s?l?l?l?l?l +?u?u?l?l?l?s?d?d +?d?d?l?l?l?l?u?u +?l?l?l?l?d?d?u?l +?u?u?u?d?u?u?d?u +?u?u?l?l?l?u?d?d +?d?d?s?l?d?s?d?d +?d?d?d?s?s?d?d?l +?s?u?s?d?d?d?d?d +?l?s?d?s?d?d?d?d +?d?d?d?d?s?l?d?s +?l?d?d?s?d?d?s?d +?u?d?d?s?d?d?s?d +?u?d?d?s?d?s?d?d +?s?l?d?s?d?d?d?d +?s?d?d?d?d?d?l?s +?d?d?d?s?d?l?s?d +?d?d?d?d?d?s?s?u +?s?s?d?d?d?d?d?u +?s?d?d?d?d?d?s?u +?l?s?d?d?s?d?d?d +?l?l?l?d?d?d?d?l?d +?s?u?d?d?d?d?d?d?d +?u?u?u?u?u?l?l?l +?u?s?l?l?s?l?l +?u?u?u?s?s?u?u +?u?u?u?s?u?u?s +?l?l?l?l?u?s?s +?u?l?l?l?u?s?s +?u?l?l?l?s?s?l +?l?l?l?l?s?s?u +?l?l?u?d?d?d?d?s +?l?d?l?d?d?d?l?s +?u?u?s?u?d?d?d?d +?u?l?s?u?d?d?d?d +?l?l?l?d?d?d?s?d?d +?d?s?l?l?l?d?d?d +?l?l?s?d?d?l?d?d +?l?l?d?d?d?l?s?d +?u?l?s?d?d?d?d?l +?s?d?l?d?l?d?l?d +?l?u?l?d?d?d?d?s +?d?d?s?d?d?u?u?u +?l?s?l?d?d?d?d?l +?s?d?d?d?d?u?l?l +?u?u?l?d?d?d?d?s +?l?d?l?d?l?d?l?d?s +?l?s?l?u?d?d?d?d +?s?l?d?l?d?l?d?d +?u?u?u?u?u?s?l +?s?l?l?u?l?l?l +?s?l?u?l?u?l?u +?l?l?u?l?s?l?l +?u?l?u?l?s?l?u +?s?u?u?u?l?l?l +?u?l?u?l?s?l?l +?u?l?l?s?u?u?l +?l?l?l?l?l?d?u?l +?u?l?l?l?l?s?d?d?d +?d?d?l?d?d?l?l?d?d +?d?d?l?d?l?d?l?d?d +?d?d?d?d?d?d?l?u?l +?l?l?d?d?d?d?d?d?u +?l?d?l?d?l?l?d?l?d +?l?l?l?s?s?s?d?d +?l?l?d?d?l?l?l?u +?u?l?l?l?d?d?u?l +?l?l?l?d?s?d?s?d +?l?l?s?d?s?d?d?d +?l?d?d?d?d?l?s?s +?d?d?d?d?u?l?s?s +?l?d?l?d?d?d?s?s +?d?d?l?l?d?d?s?s +?s?u?d?d?d?d?u?s +?l?l?d?l?d?l?d?d?d +?l?d?d?l?l?d?l?d?d +?u?l?l?l?l?u?d?d?d +?l?u?u?u?l?d?d?d +?d?u?d?u?d?u?u?u +?u?u?l?d?d?d?l?l +?l?l?d?d?d?l?u?l +?d?u?u?u?u?d?d?u +?s?u?l?l?l?l?l?s +?l?l?l?s?l?s?s +?l?l?s?l?s?l?s +?s?u?u?u?u?u?u?s +?l?l?l?l?l?s?l?s +?d?d?l?l?d?d?l?l?l +?l?l?d?d?u?u?s +?s?l?l?d?d?u?u +?l?u?l?u?d?s?d +?u?l?u?s?d?d?l +?d?d?s?l?l?u?u +?u?u?d?u?u?d?s +?l?s?u?u?d?l?d +?l?d?u?u?d?u?s +?l?d?u?l?d?l?s +?s?l?l?u?u?d?d +?s?l?d?u?l?d?l +?u?d?s?l?d?u?l +?l?d?u?l?d?u?s +?u?s?d?d?l?u?l +?u?u?u?l?s?d?d +?u?l?u?d?s?l?d +?u?s?d?d?u?l?l +?u?l?d?l?d?l?s +?l?l?d?l?s?d?l +?u?d?l?s?l?u?d +?l?d?l?l?d?s?u +?d?u?l?l?l?s?d +?s?d?u?u?u?d?u +?u?d?d?l?s?l?l +?u?u?d?u?d?u?s +?d?d?u?l?s?l?u +?u?d?s?d?u?u?u +?d?d?s?l?u?u?u +?u?l?d?d?s?u?u +?u?l?d?d?s?u?l +?u?s?u?l?u?d?d +?d?u?l?u?s?l?d +?d?l?l?l?d?u?s +?l?l?u?d?d?l?s +?l?u?s?l?u?d?d +?u?d?l?d?u?s?l +?u?l?u?s?l?d?d +?d?s?l?d?u?l?l +?s?l?l?l?u?d?d +?l?l?l?u?d?d?s +?u?s?u?u?l?d?d +?l?d?d?s?u?l?u +?u?u?d?u?s?u?d +?l?d?l?d?l?u?s +?u?d?d?u?l?u?s +?l?d?l?l?d?u?s +?u?d?d?l?l?s?u +?u?u?d?d?l?l?s +?d?u?l?l?s?u?d +?s?u?l?u?l?d?d +?u?d?u?d?l?l?s +?u?d?l?s?d?u?l +?u?s?u?u?d?u?d +?u?s?d?l?u?l?d +?d?d?u?u?u?s?u +?d?l?d?s?l?u?l +?u?d?u?s?l?l?d +?u?d?d?s?l?l?u +?l?d?d?l?s?l?u +?s?l?l?u?l?d?d +?s?u?d?l?l?d?u +?d?d?u?l?s?u?l +?u?d?l?l?d?u?s +?u?d?u?u?u?d?s +?u?u?l?d?d?s?u +?l?s?l?u?d?d?l +?s?u?l?d?d?l?l +?d?d?u?l?s?l?l +?d?u?u?s?u?u?d +?l?l?l?s?d?u?d +?d?d?l?u?l?l?s +?u?s?u?u?d?l?d +?u?s?l?l?d?l?d?d +?l?l?u?s?l?d?d +?l?d?d?l?u?u?s +?u?l?u?u?d?d?s +?d?u?l?l?l?d?s +?u?d?d?u?l?l?s +?u?d?u?d?u?s?l +?u?d?u?d?u?s?u +?d?u?l?u?l?d?s +?u?u?d?d?l?s?l +?u?d?s?l?l?d?u +?u?d?s?u?u?d?u +?u?d?l?s?l?d?l +?u?l?d?d?u?s?l +?d?u?s?l?l?d?u +?u?s?l?l?d?d?l +?u?l?d?u?l?d?s +?u?u?u?s?d?d?l +?u?s?u?d?u?u?d +?l?u?u?s?d?d?u +?u?l?d?l?u?d?s +?u?d?l?d?l?u?s +?d?l?l?d?s?l?u +?u?l?s?d?d?l?u +?s?u?d?u?u?d?u +?d?s?u?l?l?l?d +?l?s?u?u?d?d?l +?s?u?d?l?u?d?l +?d?l?s?d?l?u?l +?l?u?s?d?d?l?l +?u?s?d?u?d?l?l +?u?l?s?d?d?u?l +?u?l?d?l?l?d?s +?l?d?s?l?d?l?u +?s?d?l?d?l?u?l +?u?l?l?d?d?s?u +?s?d?d?u?u?u?l +?u?l?d?s?d?l?u +?u?d?l?d?u?l?s +?s?u?l?u?u?d?d +?d?d?u?l?u?l?s +?s?l?l?d?d?l?u +?u?s?l?d?l?d?u +?s?u?u?d?d?l?l +?u?u?s?u?d?u?d +?l?s?u?d?d?u?l +?u?l?d?l?s?l?d +?u?d?u?u?s?d?l +?l?l?s?l?d?u?d +?u?s?d?l?l?l?d +?d?u?d?l?l?l?s +?d?l?d?l?l?u?s +?d?d?d?l?l?s?l?l +?u?u?l?d?d?l?s +?u?u?s?d?u?u?d +?d?u?u?s?u?d?u +?d?u?l?s?l?d?l +?l?d?l?l?l?l?d?s +?u?d?u?d?s?u?u +?l?d?l?u?d?l?s +?s?u?l?l?u?d?d +?u?s?l?d?l?d?l?d +?u?s?d?d?l?l?l +?d?u?l?d?u?s?l +?d?d?s?u?l?l?u +?u?d?d?l?l?u?s +?u?s?u?d?l?d?l +?s?d?d?u?u?l?l +?u?l?d?s?l?u?d +?l?d?l?u?l?s?d +?u?u?d?u?s?d?u +?u?s?u?d?u?d?l +?s?d?d?l?l?u?u +?l?s?l?d?d?l?u +?u?u?s?d?l?u?d +?u?d?u?s?d?u?u +?u?d?l?l?d?s?u +?u?s?l?l?d?d?u +?u?d?d?l?u?l?s +?u?l?s?u?d?u?d +?u?s?u?l?d?u?d +?u?s?d?l?d?l?l +?u?d?l?d?s?l?l +?s?d?u?d?l?l?l +?s?u?l?d?l?l?d +?l?s?d?d?d?l?l?l +?d?s?l?l?l?d?u +?d?u?l?l?u?d?s +?l?d?l?u?l?d?s +?l?s?l?d?u?u?d +?u?l?d?l?u?s?d +?d?d?u?l?l?s?u +?s?u?u?l?l?d?d +?u?l?u?d?l?s?d +?d?u?l?u?d?l?s +?l?l?u?u?d?s?d +?s?l?l?u?d?l?d +?u?l?u?d?s?d?l +?u?l?u?d?s?d?u +?s?l?l?l?d?d?u +?d?l?d?l?u?s?l +?u?u?u?d?u?s?d +?d?d?l?u?l?u?s +?d?l?l?s?l?d?l +?d?u?s?u?d?u?l +?d?d?s?u?l?u?l +?l?u?s?d?d?u?u +?l?s?u?d?l?d?l +?d?d?u?s?l?l?u +?l?l?d?d?s?u?l +?l?d?l?u?d?s?l +?l?d?u?l?l?s?d +?l?s?u?l?d?l?d +?l?l?d?s?l?l?d?d +?d?d?u?u?l?l?s +?l?l?d?d?l?u?s +?u?d?l?l?s?d?u +?u?d?u?l?d?l?s +?u?d?d?u?s?l?l +?l?u?l?d?d?s?l +?d?d?l?u?u?u?s +?l?d?s?l?l?d?u +?s?u?l?d?l?d?l +?u?d?u?u?u?s?d +?d?s?l?l?u?u?d +?s?l?d?l?d?l?d?l +?u?d?d?l?s?u?u +?s?l?u?u?u?d?d +?l?s?l?d?l?d?u +?d?d?l?l?u?u?s +?l?l?d?u?s?d?l +?l?u?u?s?u?d?d +?d?d?u?l?l?s?l +?u?l?s?u?d?d?l +?d?u?u?u?s?u?d +?d?l?s?l?l?d?u +?u?d?l?s?d?l?u +?u?l?l?d?d?u?s +?l?s?u?u?u?d?d +?u?l?u?l?u?l?d?d?d +?u?s?l?l?l?l?l?l +?u?l?l?s?l?l?l?d +?u?l?d?d?d?u?l?d +?u?d?l?u?d?u?d?d +?d?d?l?l?u?l?d?d +?u?d?l?l?d?d?d?l +?u?l?d?d?u?d?d?l +?l?l?l?d?d?u?d?d +?d?u?l?d?u?l?d?d +?d?d?u?l?d?d?l?l +?d?d?u?l?d?d?l?u +?d?l?d?l?u?d?l?d +?u?l?l?d?u?d?d?d +?d?d?d?u?u?l?l?d +?l?l?d?d?d?d?l?u +?d?u?d?d?u?d?u?u +?u?d?d?d?d?l?u?u +?d?l?d?l?d?l?u?d +?d?u?d?d?d?u?u?u +?d?u?l?d?d?u?l?d +?l?u?d?l?u?d?d?d +?d?l?d?l?u?l?d?d +?u?l?u?d?d?d?u?d +?l?d?d?d?d?u?u?u +?d?u?u?u?d?u?d?d +?u?d?u?d?d?d?l?l +?u?u?l?d?d?d?d?l +?u?d?l?l?d?u?d?d +?d?u?d?l?l?l?d?d +?l?d?d?l?l?d?d?u +?u?d?l?d?l?d?d?u +?u?u?l?d?d?l?d?d +?d?d?u?d?d?l?l?l +?d?d?d?l?l?d?u?u +?l?u?u?d?d?d?d?l +?d?l?l?d?d?d?l?u +?l?d?d?u?l?d?d?u +?u?l?u?d?d?d?l?d +?l?d?u?d?u?d?l?d +?d?u?u?d?u?d?d?u +?u?d?d?d?l?d?l?l +?l?u?d?d?d?d?l?l +?d?d?d?d?d?d?u?d?d?d +?l?s?s?s?s?d?d +?d?d?s?s?s?s?l +?s?s?d?d?s?l?s +?s?l?s?s?d?d?s +?s?s?d?d?l?s?s +?s?s?d?d?s?s?l +?s?s?d?d?s?s?u +?s?d?d?s?l?s?s +?u?l?l?d?u?u?l +?u?u?l?u?l?l?d +?u?u?l?u?d?l?l +?u?u?u?u?l?d?u +?u?d?u?u?u?u?l +?l?l?u?d?l?l?u +?u?u?d?u?d?u?u?u +?u?u?l?u?l?u?d +?l?d?l?u?l?u?u +?l?u?u?u?u?d?l +?u?d?u?u?l?u?u +?l?u?d?l?u?u?u +?l?l?d?u?u?u?l +?l?u?l?d?u?l?l +?l?d?u?u?u?l?l +?l?d?u?l?l?u?l +?l?d?u?l?l?u?u +?l?u?u?d?l?u?u +?l?d?l?l?u?l?u +?l?l?l?l?d?d?l?u +?d?u?u?u?u?u?l +?l?l?u?l?l?u?d?d +?u?l?u?d?l?u?u +?l?l?d?l?u?u?u +?d?u?u?l?l?l?u +?d?u?l?u?u?u?u +?l?l?u?l?u?l?d +?l?l?u?l?l?d?d?l +?l?u?u?l?u?l?d +?d?l?u?l?l?u?u +?d?l?u?l?l?u?l +?u?l?u?u?u?d?l +?d?u?l?u?l?l?u +?l?l?l?u?d?u?l +?u?u?d?l?u?l?u +?u?d?u?u?d?u?u?u +?u?u?l?l?d?u?l +?u?u?l?l?d?u?u +?d?u?u?u?l?l?u +?l?l?u?u?l?u?d +?l?l?u?d?l?u?l +?u?l?u?u?u?d?u +?u?l?l?d?l?u?u +?u?l?l?l?d?d?u?u +?u?l?u?u?d?l?l +?u?u?u?u?l?u?d +?u?u?d?l?l?u?u +?u?u?d?l?l?u?l +?l?d?l?u?u?u?u +?u?u?l?u?l?d?l +?d?d?l?l?u?l?l?l +?l?u?l?d?u?u?u +?u?u?l?d?u?l?l +?l?l?u?u?l?d?u +?d?l?u?l?u?l?u +?u?l?u?d?u?u?u +?l?l?l?u?l?d?u +?l?u?l?d?l?u?u +?l?u?l?d?l?u?l +?l?u?l?u?l?d?u +?l?d?u?l?u?l?u +?l?d?u?l?u?l?l +?l?l?l?d?u?u?l +?l?l?d?u?l?l?u +?l?u?u?l?d?l?l +?u?l?u?l?l?d?u +?l?u?u?d?l?l?l +?u?d?l?l?u?u?u +?d?u?u?u?u?u?u?u?u +?d?s?d?s?d?s?d?l +?d?d?l?l?l?d?d?l?l +?d?l?l?l?l?l?s?d +?l?d?d?l?l?l?l?s +?d?d?l?l?s?l?l?l +?u?u?u?u?d?d?d?d?s +?d?d?s?d?d?s?d?d?u +?u?u?u?u?u?l?l?d +?s?s?l?l?l?s?d +?s?s?s?d?l?l?l +?s?l?s?l?s?l?d +?s?l?l?l?d?s?s +?s?l?s?l?l?s?d +?d?s?l?s?l?l?s +?l?s?l?d?l?s?s +?l?s?s?d?l?s?l +?s?l?s?s?l?l?d +?l?s?l?d?s?l?s +?l?s?l?d?s?s?l +?l?s?l?l?d?s?s +?d?s?d?s?d?l?l?l +?s?l?l?l?d?d?d?d?s +?d?l?d?l?d?l?s?s +?l?l?d?d?d?d?d?l?d +?d?d?u?d?d?l?d?d?u +?l?l?s?s?s?s?d +?s?u?s?u?s?u?s +?s?s?s?s?u?u?u +?s?s?u?l?l?s?s +?s?s?l?d?l?s?s +?l?s?l?d?s?s?s +?l?u?l?l?l?u?u +?l?l?l?u?u?u?l +?l?l?u?u?l?u?l +?l?l?l?l?l?d?u?u +?u?u?u?l?l?u?l +?u?u?u?u?u?u?u?u?d?d +?u?u?u?u?u?u?s?d?d +?u?l?l?l?u?l?l?d?d +?u?s?u?s?l?l?l +?s?l?u?l?l?l?s +?l?l?s?s?s?d?d?d +?d?d?l?l?u?u?u?u +?u?l?u?l?u?u?d?d +?d?u?l?l?u?l?l?d +?d?d?u?l?u?l?u?l +?l?l?l?u?u?l?d?d +?d?d?d?d?d?d?l?l?l?d +?l?d?l?d?l?d?l?l?d +?l?d?d?l?d?l?d?d?l +?l?l?l?l?l?d?d?s?d +?l?d?d?s?l?l?l?l +?u?u?u?u?u?d?s?d +?l?l?l?l?d?u?u?u +?l?l?l?s?l?d?d?d?d +?u?s?l?s?u?s?l +?l?l?s?s?l?l?s +?d?d?d?d?d?d?d?d?l?u +?u?s?s?l?l?d?l +?s?u?u?u?d?u?s +?u?s?s?l?l?l?d +?d?l?s?l?s?l?l +?d?s?l?l?l?s?l +?u?d?s?u?u?u?s +?s?d?l?l?s?l?l +?s?u?l?u?l?s?d +?s?l?l?d?l?s?l +?s?l?l?l?s?l?d +?u?d?l?s?l?l?s +?u?s?s?l?d?l?l +?s?u?l?l?l?s?d +?l?l?s?s?l?l?d?d +?l?l?s?s?l?d?l +?l?l?s?l?d?s?l +?u?s?d?l?l?l?s +?s?d?s?u?u?u?u +?u?d?l?l?l?s?s +?u?l?d?s?l?l?s +?s?d?l?s?l?l?l +?u?u?s?d?s?u?u +?d?l?l?s?l?l?s +?s?l?l?s?d?l?l +?u?l?u?l?s?s?d +?l?s?u?s?l?l?d +?u?s?u?l?l?s?d +?s?s?d?d?l?l?l?l +?u?u?l?l?s?s?d?d +?u?l?s?u?l?s?d +?l?l?s?l?s?l?d +?u?s?l?l?l?s?d +?u?u?u?s?u?s?d +?s?s?l?l?l?d?l +?u?u?u?u?u?u?u?d?d?d +?l?l?l?d?d?l?l?l?d?d +?l?d?d?d?d?d?d?s?s +?d?d?d?d?d?d?l?s?s +?u?l?l?u?l?l?l?d?d +?l?l?s?l?d?l?d?d +?d?d?d?u?u?u?u?s +?l?l?d?l?d?l?d?s +?l?l?l?d?l?d?d?s +?l?l?l?d?d?d?d?l?l?l +?s?s?s?l?s?s?s +?l?s?l?l?l?l?s?d +?u?d?d?d?d?u?d?d?d +?u?d?l?d?d?d?d?d?d +?d?l?d?d?d?d?l?d?d +?u?d?l?l?l?d?d?d?d +?u?l?l?u?l?d?d?d?d +?l?d?d?d?u?l?l?l +?u?d?d?d?l?u?l?l +?u?d?l?l?d?d?l?l +?u?d?l?d?u?d?l?l +?u?d?u?u?u?d?d?u +?d?u?u?u?u?d?u?d +?u?u?l?u?u?d?d?d +?u?d?l?l?l?u?d?d +?u?u?d?u?d?u?d?u +?l?u?u?l?l?d?d?d +?d?d?d?l?u?u?u?u +?u?d?d?l?l?l?d?u +?u?u?u?l?u?d?d?d +?u?d?l?l?d?u?d?l +?d?u?d?d?u?u?u?u +?d?u?l?l?l?u?d?d +?l?d?d?d?l?l?l?u +?u?d?l?u?l?l?d?d +?d?d?u?u?u?u?d?u +?u?d?d?l?d?l?l?l +?l?l?l?l?l?u?l?l +?u?l?s?l?l?l?u +?l?l?l?l?s?u?l +?l?s?l?l?l?u?l +?l?l?s?l?l?l?u +?l?l?u?l?l?s?l +?s?l?l?l?u?l?l +?u?l?l?u?u?u?s +?u?s?u?l?u?l?u +?u?l?l?u?l?u?s +?s?l?l?l?l?u?l +?l?s?u?u?u?u?u +?l?l?u?u?l?l?s +?l?u?u?s?u?u?u +?l?s?l?l?l?l?s?l +?l?d?l?d?l?l?l?s +?u?l?l?s?d?d?d?d?d +?d?d?d?d?d?d?s?l?l?l +?l?l?u?l?l?l?l?l +?d?d?d?s?d?d?d?l?l +?d?d?d?d?d?d?s?l?d +?d?d?d?d?d?s?d?d?l +?d?d?l?l?d?d?d?d?s +?d?d?d?d?d?d?l?d?s +?d?d?d?d?d?d?u?s?u +?u?u?u?u?u?d?d?l +?l?d?l?l?d?l?l?d?l +?u?l?l?l?l?l?u?l +?d?l?l?l?s?l?l?l +?l?l?s?d?d?d?d?d?d?d +?l?l?l?s?s?l?l?l +?l?l?s?l?s?d?d?d +?s?u?u?u?d?d?d?s +?u?d?d?d?d?u?l?d +?d?d?u?d?d?d?l?l +?d?l?d?d?u?d?d?u +?d?u?d?l?d?u?d?d +?d?l?d?d?d?l?u?d +?d?d?l?d?d?l?u?d +?l?d?u?d?d?u?d?d +?l?u?d?d?l?d?d?d +?l?d?d?d?u?u?d?d +?u?d?l?d?d?d?u?d +?d?d?d?u?d?l?d?l +?d?l?d?d?d?u?l?d +?u?l?d?u?d?d?d?d +?d?d?d?l?u?u?d?d +?l?d?l?d?u?d?d?d +?l?d?d?l?d?u?d?d +?d?l?d?d?d?u?u?d +?l?u?d?l?d?d?d?d +?d?d?u?d?u?d?l?d +?d?d?u?d?d?u?d?l +?d?l?d?u?l?d?d?d +?l?u?d?d?u?d?d?d +?d?u?d?d?l?d?d?u +?d?d?d?d?u?u?d?l +?d?d?d?u?u?l?d?d +?d?d?d?u?l?d?d?u +?d?d?d?u?l?d?l?d +?d?d?l?d?u?l?d?d +?l?d?d?d?d?d?l?u +?d?d?d?l?d?u?l?d +?d?d?u?d?l?d?d?u +?u?d?d?l?d?d?d?l +?d?l?u?u?d?d?d?d +?l?l?d?d?d?u?d?d +?d?l?d?u?d?d?d?l +?l?u?d?d?d?u?d?d +?d?l?l?d?d?d?u?d +?l?d?u?d?u?d?d?d +?u?d?l?d?d?d?d?u +?d?d?d?d?l?d?l?u +?d?d?d?d?l?u?d?l +?d?l?l?d?d?d?d?u +?u?d?d?u?d?d?d?l +?d?u?d?u?l?d?d?d +?u?d?u?d?d?d?d?u +?d?d?l?l?d?u?d?d +?d?d?d?l?l?u?d?d +?u?u?d?d?d?u?d?d?d +?l?d?d?u?d?d?d?l +?d?d?u?d?u?d?u?d +?d?d?u?u?d?l?d?d +?d?u?d?d?d?d?u?u +?d?u?u?d?d?d?u?d +?d?d?l?d?l?d?u?d +?u?l?d?d?d?d?l?d +?l?d?d?d?d?u?u?d +?d?l?d?u?u?d?d?d +?l?d?u?d?d?d?d?u +?l?d?u?d?d?d?d?l +?d?u?d?l?d?l?d?d +?d?l?l?u?d?d?d?d +?u?d?d?d?d?l?u?d +?u?d?l?u?d?d?d?d +?d?d?l?d?u?d?d?l +?d?d?d?u?d?u?u?d +?d?d?u?d?l?d?l?d +?l?d?d?d?u?d?d?u +?d?u?u?d?d?d?l?d +?u?d?d?d?d?d?u?l +?d?l?u?d?u?d?d?d +?d?d?u?d?d?u?u?d +?d?d?d?u?d?l?l?d +?d?l?d?d?l?d?u?d +?d?l?d?u?d?l?d?d +?u?d?l?d?d?d?d?l +?d?l?d?d?l?d?d?u +?d?l?u?d?d?l?d?d +?d?d?l?l?u?d?d?d +?d?u?l?d?d?d?l?d +?l?d?d?d?u?d?d?l +?d?u?d?l?d?d?d?l +?u?d?d?d?d?d?l?u +?d?d?u?d?d?l?l?d +?d?u?d?l?d?d?u?d +?d?u?d?u?d?d?d?l +?d?d?d?l?d?l?u?d +?d?d?u?l?d?u?d?d +?l?d?u?d?l?d?d?d +?l?d?d?u?l?d?d?d +?u?d?d?d?u?d?u?d +?u?d?d?d?d?u?d?l +?d?d?l?u?l?d?d?d +?d?d?u?d?l?d?d?l +?l?d?d?d?d?u?d?u +?l?d?l?d?d?u?d?d +?l?d?d?l?u?d?d?d +?l?d?d?u?d?u?d?d +?l?d?l?d?d?d?d?u +?d?l?d?d?l?u?d?d +?d?l?u?d?d?d?d?u +?d?u?d?d?d?u?d?u +?u?d?l?d?d?d?l?d +?d?u?l?d?l?d?d?d +?s?u?l?l?l?l?l?d +?l?l?l?l?l?l?u?l +?u?u?u?u?d?d?s?s +?d?u?l?l?l?l?l?s +?s?d?d?s?s?d?d?d +?s?d?d?s?d?s?d?d +?d?d?d?d?s?d?s?s +?d?d?d?s?d?d?s?s +?d?s?d?d?s?d?s?d +?d?d?d?d?s?s?s?d +?s?d?d?d?d?s?s?d +?d?d?s?d?s?s?d?d +?s?d?s?s?d?d?d?d +?l?l?d?d?d?l?l?d?d?d +?l?l?l?d?d?d?l?l?d +?l?l?l?d?d?d?d?d?d?s +?d?d?d?d?d?s?d?s?d +?u?l?s?l?l?l?l?l +?u?u?u?d?u?d?u?u +?d?u?l?l?d?u?l?l +?l?u?l?u?l?l?d?d +?s?d?d?d?d?d?d?d?d?d?d +?l?l?l?l?l?d?s?d?d +?l?s?s?l?s?l?l +?s?s?s?u?u?u?u +?d?d?d?l?l?d?d?d?d?d +?d?d?d?d?d?d?d?l?l?l?l +?l?d?s?d?d?s?l?d +?u?l?s?d?d?s?d?d +?l?s?d?d?s?l?d?d +?d?d?s?u?u?s?d?d +?d?d?d?d?s?s?u?u +?u?u?s?d?d?d?d?s +?u?l?s?d?d?d?d?s +?d?d?s?s?l?l?d?d +?d?s?d?d?s?d?d?l?l +?d?s?d?s?d?d?u?u +?d?d?l?s?d?d?l?s +?l?d?s?l?d?s?d?d +?s?s?s?d?s?s?s +?u?l?l?l?l?u?u?u +?u?s?l?s?l?l?l +?u?s?l?l?l?s?l +?u?l?s?l?l?l?s +?u?l?l?s?l?s?l +?s?u?u?u?u?s?u +?u?s?s?u?u?u?u +?u?u?u?s?u?u?u?d +?d?d?d?d?d?d?u?l?s +?l?l?d?l?l?d?l?s +?l?d?l?l?l?d?l?s +?l?l?l?l?l?d?l?u +?u?u?d?l?l?l?l?l +?d?d?d?d?l?s?s?s +?d?d?d?d?u?u?d?d?d?d +?l?l?s?l?d?d?d?l +?d?s?l?l?l?l?d?d +?u?l?l?u?s?d?d?d +?d?l?l?l?l?d?s?d +?u?s?l?d?l?l?d?d +?u?s?u?l?l?d?d?d +?d?d?d?d?d?d?s?l?s +?d?d?d?u?u?u?u?d?d +?l?l?l?l?d?d?d?s?d +?s?u?d?d?l?l?s +?u?s?l?u?s?d?d +?s?s?u?u?l?d?d +?d?u?s?u?s?u?d +?u?d?d?u?l?s?s +?u?d?s?l?d?l?s +?u?d?u?s?u?d?s +?l?d?l?s?s?l?d +?u?s?u?d?u?d?s +?d?u?l?u?s?d?s +?l?u?d?d?u?s?s +?l?l?d?s?s?l?d +?s?d?d?l?u?u?s +?s?s?l?d?d?l?l +?u?s?d?s?l?d?l +?s?u?d?l?d?s?l +?s?d?l?l?s?l?d +?u?s?d?l?s?d?u +?d?u?s?s?l?d?l +?d?u?s?l?s?d?l +?u?d?l?l?s?s?d +?s?d?u?l?l?d?s +?d?s?d?l?s?l?l +?s?u?s?l?l?d?d +?d?l?s?l?s?d?u +?l?s?d?s?l?l?d +?l?d?d?s?l?l?s +?s?l?u?s?l?d?d +?u?l?d?d?l?s?s +?u?u?d?d?l?s?s +?l?d?d?u?s?s?l +?s?d?d?l?s?u?l +?l?d?d?s?l?s?l +?l?l?d?d?s?l?s +?s?s?d?d?u?l?u +?s?s?d?d?u?l?l +?s?d?l?l?s?d?l +?u?d?s?s?d?u?u +?s?u?s?u?u?d?d +?u?l?l?l?s?s?d?d +?u?d?s?u?s?l?d +?l?s?s?d?l?d?u +?u?d?u?u?d?s?s +?u?l?s?u?s?d?d +?l?d?u?d?l?s?s +?u?s?u?d?d?s?u +?u?d?d?s?l?l?s +?s?l?d?s?l?l?d +?u?u?l?s?d?s?d +?d?l?s?s?l?u?d +?s?u?d?l?l?d?s +?u?l?d?s?s?d?u +?u?u?s?u?s?d?d +?s?u?l?d?d?l?s +?u?s?l?s?d?l?d +?l?s?d?d?l?s?l +?s?d?l?d?l?d?l?s +?s?s?l?d?l?l?d +?l?l?s?d?l?d?s +?l?s?d?l?u?d?s +?d?d?s?u?u?s?l +?s?u?l?d?l?d?s +?u?s?d?u?d?u?s +?l?u?l?s?d?s?d +?u?s?l?s?l?d?d +?u?u?s?d?s?l?d +?l?d?d?s?s?l?l +?l?d?s?l?l?s?d +?u?s?l?l?d?d?s +?s?s?l?l?u?d?d +?l?d?l?s?s?d?l +?l?d?l?s?s?d?u +?u?s?u?d?s?d?u +?l?d?s?s?d?l?l +?d?l?s?u?s?l?d +?u?d?d?s?s?l?l +?d?l?s?s?d?l?l +?s?s?u?d?d?l?l +?d?l?u?d?l?s?s +?u?l?d?s?s?d?l +?u?s?u?l?s?d?d +?u?u?l?d?d?s?s +?u?d?d?s?s?u?u +?l?l?s?u?s?d?d +?u?s?l?l?d?s?d +?u?s?s?u?d?d?u +?u?s?l?d?l?d?s +?s?d?l?d?l?s?l +?s?s?l?u?u?d?d +?l?d?l?s?l?s?d +?l?l?d?d?u?s?s +?d?u?l?d?l?s?s +?u?s?l?d?d?u?s +?s?u?d?d?l?u?s +?d?s?s?u?l?l?d +?l?l?d?s?l?d?s +?s?d?d?u?s?u?l +?s?d?d?u?s?u?u +?u?s?d?l?u?d?s +?u?s?d?d?l?l?s +?u?d?s?u?l?d?s +?s?d?d?l?l?s?l +?d?d?s?u?l?l?s +?s?u?d?l?s?u?d +?d?l?s?d?l?s?l +?s?l?u?l?s?d?d +?s?d?d?s?u?l?u +?d?s?d?l?l?s?l +?s?s?d?l?l?d?l +?u?s?s?l?u?d?d +?d?l?l?s?d?s?l +?u?s?d?d?u?u?s +?u?s?d?l?d?l?s +?l?s?d?s?l?d?l +?d?d?u?l?u?s?s +?s?l?l?d?l?s?d +?l?d?l?l?s?d?s +?d?d?u?l?l?s?s +?d?d?l?s?l?l?s +?d?l?l?l?s?s?d +?d?d?s?l?s?u?u +?s?d?d?u?l?l?s +?d?l?s?u?d?u?s +?d?l?l?s?s?l?d +?d?s?l?s?d?l?l +?d?s?l?s?l?l?d +?s?l?s?l?d?d?l +?s?u?u?s?l?d?d +?u?u?s?u?d?d?s +?l?l?d?d?s?u?s +?l?d?l?u?d?s?s +?d?l?u?d?s?l?s +?d?s?l?l?s?d?l +?s?d?s?l?l?d?l +?l?l?d?s?s?d?l +?l?s?l?d?u?s?d +?s?l?d?d?l?s?l +?d?s?l?d?s?u?u +?u?s?d?d?l?u?s +?d?s?d?l?l?l?s +?d?l?s?l?l?d?s +?s?s?u?d?u?u?d +?s?d?u?l?d?l?s +?u?l?d?s?u?d?s +?l?u?l?l?l?l?l?l +?l?l?l?l?l?d?l?l?d +?l?d?l?s?l?l?l?l +?d?d?u?l?l?l?l?l?l +?u?u?u?l?l?u?d?d +?l?u?u?l?l?l?d?d +?u?u?l?l?d?d?l?l +?d?u?u?u?l?l?l?d +?l?d?s?l?l?d?d?d +?d?d?d?d?s?u?l?u +?l?d?s?d?l?l?d?d +?u?l?l?d?s?d?d?d +?d?s?d?l?l?l?d?d +?d?l?d?l?s?d?l?d +?d?d?d?d?u?s?u?u +?u?s?l?d?l?d?d?d +?u?u?s?l?d?d?d?d +?d?d?u?u?u?s?d?d +?u?u?s?d?d?d?d?l +?l?s?d?l?l?d?d?d +?d?l?l?l?d?d?s?d +?d?d?s?u?u?u?d?d +?l?d?d?d?l?d?l?s +?l?d?d?d?s?d?l?l +?u?d?d?d?d?l?l?s +?u?s?l?u?d?d?d?d +?l?l?d?d?d?d?u?s +?d?l?l?l?d?d?d?s +?d?d?l?s?d?d?l?l +?l?s?l?d?d?l?d?d +?d?d?u?l?s?l?d?d +?d?d?d?u?l?l?s?d +?u?u?l?s?d?d?d?d +?s?l?d?l?l?d?d?d +?s?l?d?d?l?d?d?l +?l?d?d?l?l?s?d?d +?d?d?d?d?l?d?l?d?l +?d?l?d?d?l?l?d?d?d +?l?d?d?u?d?d?l?d?d +?d?d?d?d?l?d?l?l?d +?d?l?l?d?d?l?d?d?d +?s?s?s?s?d?d?s +?s?d?s?d?s?s?s +?s?s?d?d?s?s?s +?s?s?d?s?s?d?s +?d?l?l?l?u?l?l?l +?l?l?l?u?d?l?l?l +?l?l?u?s?d?u?l +?s?l?u?u?l?d?l +?l?u?l?l?u?d?s +?l?d?l?l?s?u?u +?l?d?l?l?s?u?l +?u?l?l?l?s?l?d?d +?l?l?l?u?u?s?d +?s?u?u?u?d?u?u +?d?l?l?l?l?s?l?l +?l?l?l?l?d?s?u +?l?u?l?l?d?l?s +?d?s?l?u?u?u?u +?u?l?l?s?d?l?u +?u?u?u?u?s?d?u +?l?u?l?l?l?d?s +?l?l?d?l?l?l?s?d +?l?l?d?u?u?s?l +?l?d?l?u?l?u?s +?u?l?l?l?s?d?u +?l?u?l?u?l?s?d +?u?l?l?l?d?u?s +?l?l?d?s?u?u?u +?s?u?d?u?u?u?u +?u?s?l?u?l?d?l +?u?l?d?s?l?l?u +?l?l?d?u?l?l?s +?l?d?s?u?l?l?l +?d?s?l?l?u?l?l +?l?s?l?u?l?d?l +?l?l?s?u?l?l?d +?l?l?l?u?d?l?s +?l?l?s?d?u?u?u +?d?u?u?s?u?u?u +?u?s?l?d?l?u?u +?l?l?u?l?l?d?s +?l?s?l?l?d?l?u +?l?d?u?l?s?l?l +?s?d?u?u?u?l?l +?l?d?l?u?s?l?l +?l?l?l?s?u?u?d +?s?l?l?l?l?d?u +?u?l?s?l?d?l?u +?u?s?u?u?l?l?d +?l?l?s?u?l?d?l +?l?u?l?l?s?l?d +?s?d?l?u?u?u?u +?l?d?s?l?l?l?u +?l?d?l?l?u?s?l +?l?u?u?u?u?s?d +?u?s?l?l?d?l?u +?u?l?d?s?u?l?l +?d?u?l?l?l?s?u +?l?l?l?d?s?l?u +?u?s?u?l?d?l?l +?l?l?d?u?s?l?l +?l?d?l?l?s?l?d?l +?l?u?s?l?d?l?l +?d?l?l?s?u?l?l +?u?l?d?l?l?u?s +?l?s?u?d?l?l?l +?u?u?u?d?u?s?u +?l?l?s?d?u?l?l +?l?l?d?l?l?s?u +?l?l?l?u?s?l?d +?l?s?l?l?l?u?d +?d?l?l?l?u?s?l +?l?d?u?s?l?l?u +?d?l?l?s?l?l?l?l +?u?l?u?d?s?l?u +?u?l?d?s?u?u?u +?s?u?u?u?d?l?l +?d?l?l?l?l?d?l?l?l +?u?l?l?l?l?l?u?d?d +?u?l?d?u?l?l?d?d +?u?d?l?l?u?d?d?l +?d?u?u?u?d?d?u?u +?u?l?d?l?l?u?d?d +?u?u?d?u?u?d?d?u +?d?d?d?u?l?l?u?l +?u?d?l?l?l?d?d?u +?u?d?u?d?u?d?l?l +?u?l?l?u?d?d?d?l +?u?d?u?u?d?d?u?u +?u?d?u?d?d?u?u?u +?l?l?d?l?d?l?d?l?d +?l?d?l?d?l?d?u?u +?u?l?l?d?d?l?d?l +?u?d?d?d?l?l?l?u +?d?u?u?u?d?u?d?u +?l?d?l?l?l?u?d?d +?u?l?d?d?u?l?l?d +?u?u?u?d?d?l?l?d +?u?d?d?d?u?u?l?l +?u?l?l?d?l?d?d?l +?d?u?l?u?l?u?d?d +?l?d?l?l?l?d?l?d?d +?l?u?l?l?u?d?d?d +?u?d?l?l?d?d?u?l +?l?l?d?d?u?l?l?d +?u?u?d?d?u?u?d?u +?u?l?l?l?l?l?l?d?d?d +?d?u?u?u?u?d?d?d?d +?l?d?l?d?d?l?l?d?d +?d?d?l?l?d?d?d?l?l +?l?s?l?l?s?l?d?d +?l?l?d?d?l?l?s?s +?d?d?s?s?l?l?l?l +?u?u?l?l?l?l?l?d?d +?d?d?d?d?u?d?d?d?d?d +?s?l?l?l?d?d?d?d?d +?l?s?l?s?d?s?s +?u?l?l?l?l?l?l?l?d?d +?l?l?l?l?d?d?d?s?s +?u?u?l?u?l?l?u +?l?u?u?l?l?u?l +?l?u?l?u?u?l?u +?l?u?l?u?l?u?u +?u?l?u?u?u?l?u +?u?u?l?l?u?l?u +?u?u?l?u?u?l?l +?u?u?l?l?l?u?l +?l?u?l?l?u?u?l +?l?l?u?u?u?u?l +?l?l?u?l?l?u?u +?u?l?l?l?l?l?d?d?s +?d?l?d?l?d?l?d?l?l +?s?l?d?d?d?d?d?d?s +?d?d?d?d?d?d?d?s?l?l +?s?s?s?s?s?l?d +?l?l?s?s?s?s?s +?u?s?u?s?u?s?d?d +?u?u?u?u?u?l?s +?u?l?u?l?u?s?u +?u?u?u?s?u?l?l +?l?l?s?l?u?l?l +?l?u?u?s?l?u?u +?u?u?l?l?l?s?l +?u?l?s?l?u?l?u +?u?l?l?s?u?u?u +?u?l?s?u?l?u?l +?l?l?u?u?u?u?s +?l?l?d?s?d?d?s?d?d +?l?l?l?l?l?l?d?s?d +?l?l?l?s?s?l?s +?d?d?d?l?l?l?l?l?s +?d?u?l?l?d?l?l?l +?d?u?l?l?l?d?l?l +?d?u?l?u?l?u?l?d +?l?l?l?u?d?d?l?l +?l?l?l?d?l?l?l?u +?l?u?l?d?d?l?l?l +?d?l?l?l?d?l?l?s +?l?l?l?d?d?s?d?d?d +?l?l?l?d?d?d?d?s?d +?l?s?s?l?l?l?d?d +?d?s?d?s?l?l?l?l +?l?l?d?d?l?d?l?d?d +?d?d?d?d?l?l?d?l?l +?u?l?l?s?s?s?s +?s?s?l?s?s?l?l +?l?d?l?d?l?l?l?d?d +?l?l?l?u?u?d?d?d?d +?l?l?d?l?l?d?l?d?d +?l?l?l?l?l?l?s?u +?s?d?s?l?s?l?l +?s?l?s?l?l?d?s +?u?s?l?s?u?s?d +?l?l?s?s?s?d?l +?l?s?s?l?s?l?d +?s?l?l?d?l?s?s +?s?l?l?s?l?s?d +?s?d?s?l?l?l?s +?l?s?s?l?d?l?s +?d?u?l?l?s?s?s +?l?s?l?l?s?s?d +?l?d?s?l?l?s?s +?u?u?u?s?d?s?s +?u?l?l?s?s?s?d +?s?l?d?l?s?l?s +?u?u?d?u?s?s?s +?s?s?l?l?s?l?d +?l?s?l?l?l?l?d?d?d +?d?d?d?d?d?l?l?l?d?d +?s?u?u?u?d?l?l?l +?l?l?l?l?s?l?d?l +?l?l?l?l?s?s?s?s +?l?l?l?l?s?s?l?l +?d?d?d?s?d?d?d?d?u +?d?d?d?l?s?d?d?d?d +?d?d?d?d?d?u?d?d?s +?d?d?d?d?d?d?u?d?s +?l?d?d?d?d?s?d?d?d +?u?u?u?s?d?d?d?d?d +?s?d?d?d?u?l?l?l +?l?d?s?l?l?l?d?d +?l?d?l?s?l?d?l?d +?l?s?l?d?l?l?d?d +?l?d?l?d?l?s?l?d +?l?l?l?u?d?d?d?s +?l?l?d?d?l?l?s?d +?l?l?d?d?s?l?l?d +?s?l?l?l?d?l?d?d +?s?u?l?l?l?s?u +?l?u?u?u?u?s?s +?u?u?l?l?l?l?d?d?d +?u?u?u?u?s?s?d?d +?u?u?u?s?d?l?l?l +?l?l?d?d?d?d?d?d?d?l +?d?u?l?l?u?l?l?l +?d?u?l?l?l?d?d?d?d +?d?l?l?l?d?l?l?l?l +?d?d?d?d?s?s?d?d?d +?d?d?s?s?d?d?d?d?d +?d?d?d?s?d?d?d?s?l +?d?s?d?s?d?d?d?d?d +?l?l?l?l?u?s?d?d +?s?d?l?l?l?l?l?d +?u?u?u?u?s?u?d?d +?d?l?l?l?l?l?d?d?d?d +?u?d?l?d?l?d?d?d?d +?l?d?d?d?d?d?l?d?l +?l?d?d?d?d?d?l?l?d +?d?d?d?d?d?l?d?l?l +?d?d?d?l?l?d?l?d?d +?d?d?l?d?l?d?d?l?d +?d?d?d?l?d?l?d?d?l +?d?l?d?d?d?d?l?l?d +?l?d?d?d?d?d?d?d?l?l +?d?d?l?d?d?l?d?l?d +?d?d?l?d?d?d?d?l?l +?d?d?d?l?d?l?d?l?d +?d?d?l?l?l?u?u?u +?l?l?l?u?l?d?d?l +?u?l?u?u?u?u?d?d +?u?l?l?u?l?u?d?d +?d?d?d?l?l?s?s?s +?l?d?l?d?l?d?d?d?d?d +?u?u?u?l?l?l?l?d?d +?u?u?u?u?u?s?u?u +?d?l?d?d?u?d?d?s +?s?l?d?d?d?d?d?l +?u?d?d?d?s?l?d?d +?s?d?d?d?d?d?u?u +?s?u?d?d?d?d?l?d +?d?l?l?d?d?d?s?d +?u?d?d?d?l?d?d?s +?u?d?d?l?d?s?d?d +?d?d?u?u?d?d?d?s +?d?d?d?d?u?s?d?l +?l?s?d?d?d?d?l?d +?u?d?d?u?s?d?d?d +?u?s?d?d?l?d?d?d +?l?u?d?s?d?d?d?d +?s?d?u?l?d?d?d?d +?l?d?d?d?l?d?s?d +?d?d?d?u?d?l?d?s +?d?d?d?d?u?s?l?d +?d?l?d?l?s?d?d?d +?d?u?l?s?d?d?d?d +?d?d?s?d?d?d?l?u +?d?d?d?l?d?d?s?l +?d?l?d?l?d?d?s?d +?s?d?l?d?d?d?d?u +?u?s?d?u?d?d?d?d +?l?d?d?d?d?s?d?l +?d?d?d?d?u?u?d?s +?l?d?d?d?s?d?l?d +?l?d?d?s?d?d?d?l +?d?l?l?d?d?s?d?d +?l?d?d?d?d?d?s?l +?d?l?u?d?d?d?d?s +?d?d?u?d?l?s?d?d +?u?u?d?d?s?d?d?d +?s?l?d?d?d?d?d?u +?d?d?s?l?d?l?d?d +?d?d?u?l?d?d?d?s +?d?l?s?d?l?d?d?d +?s?d?d?u?l?d?d?d +?d?d?l?s?d?d?d?l +?u?d?u?d?d?d?d?s +?d?u?s?l?d?d?d?d +?d?d?d?d?d?l?u?s +?u?d?d?d?d?u?d?s +?d?d?l?d?d?s?d?l +?u?d?d?d?s?d?d?l +?d?d?u?l?s?d?d?d +?d?d?d?s?l?d?l?d +?d?l?u?s?d?d?d?d +?u?s?d?d?d?d?u?d +?d?s?l?l?d?d?d?d +?u?s?d?l?d?d?d?d +?u?d?d?d?d?l?d?s +?u?s?d?d?d?l?d?d +?d?l?d?d?d?l?s?d +?d?s?d?l?d?l?d?d +?d?l?s?l?d?d?d?d +?l?s?d?d?l?d?d?d +?d?u?d?d?s?d?d?l +?d?l?d?d?l?d?d?s +?d?u?l?d?d?s?d?d +?s?d?d?d?l?l?d?d +?l?d?u?d?d?d?d?s +?d?d?s?d?d?l?d?l +?l?d?d?s?u?d?d?d +?l?d?d?d?d?d?u?s +?d?d?s?d?d?u?d?u +?u?d?s?d?d?d?d?l +?d?d?d?u?l?s?d?d +?d?l?d?d?d?l?d?s +?u?d?d?d?d?d?s?u +?d?l?d?d?l?d?s?d +?u?d?d?d?s?u?d?d +?u?d?s?l?d?d?d?d +?d?d?l?l?d?d?s?d +?d?d?u?s?l?d?d?d +?u?d?d?d?d?s?d?l +?d?l?d?d?u?s?d?d +?l?d?l?d?s?d?d?d +?d?d?d?u?s?d?d?u +?d?d?d?s?d?d?u?l +?d?d?u?d?s?l?d?d +?u?d?d?u?d?s?d?d +?d?d?l?d?d?d?l?s +?s?l?u?d?d?d?d?d +?d?d?d?d?s?d?u?u +?l?d?d?d?s?l?d?d +?d?l?l?u?l?l?l?l +?d?u?u?d?d?d?d?d?d +?d?d?d?d?d?l?d?l?d +?d?l?d?d?d?d?d?l?d +?d?d?d?d?d?d?u?d?u +?l?l?s?s?l?l?l?l +?s?l?l?d?d?l?l?s +?l?s?l?l?l?d?l?l +?u?u?u?u?u?u?s?u +?d?l?l?l?s?u?u?u +?l?l?l?u?u?u?u?u +?u?l?l?d?d?d?u?d +?l?d?d?u?u?u?d?d +?d?d?d?l?d?u?u?l +?l?d?l?d?d?d?l?u +?u?d?u?l?d?d?d?u +?u?l?d?u?u?d?d?d +?l?u?d?u?l?d?d?d +?u?d?d?d?u?u?d?u +?l?l?l?d?d?d?u?d +?l?l?u?d?d?l?d?d +?d?d?l?u?l?l?d?d +?d?u?u?u?d?d?u?d +?d?d?d?l?u?d?l?u +?d?d?u?u?d?u?u?d +?l?l?d?d?l?u?d?d +?u?d?d?d?u?l?u?d +?u?d?u?d?u?l?d?d +?u?d?u?d?l?l?d?d +?d?d?l?l?d?l?u?d +?d?d?l?l?l?d?d?u +?u?d?d?d?l?l?u?d +?u?d?d?d?u?l?l?d +?d?d?d?l?u?l?l?d +?d?l?d?d?d?u?u?u +?u?u?d?d?l?u?d?d +?d?d?u?d?l?l?l?d +?u?u?d?d?l?d?l?d +?u?d?l?u?l?d?d?d +?l?l?d?u?d?d?d?l +?d?l?u?l?l?d?d?d +?l?l?d?d?d?u?u?d +?u?l?l?d?d?d?l?d +?u?d?d?l?d?u?l?d +?l?l?u?d?d?d?d?l +?l?d?d?l?d?d?u?u +?d?d?l?u?d?d?l?u +?u?l?d?l?u?d?d?d +?d?d?d?u?l?l?d?l +?l?l?d?d?d?u?d?l +?l?d?l?u?d?l?d?d +?l?d?l?d?d?l?d?u +?l?l?d?d?d?l?d?u +?l?u?l?d?d?d?d?l +?u?l?u?d?l?d?d?d +?l?d?d?u?l?l?d?d +?d?d?d?d?l?d?l?l?l +?d?u?u?d?d?u?d?u +?u?u?u?d?l?d?d?d +?d?l?l?u?u?d?d?d +?d?u?d?u?u?d?d?u +?d?d?d?d?l?l?l?d?l +?u?l?d?d?l?d?d?u +?l?d?d?d?d?l?u?u +?d?u?l?l?u?d?d?d +?l?d?d?l?u?d?d?l +?u?d?u?l?d?l?d?d +?u?d?d?u?l?d?d?l +?l?u?l?d?l?d?d?d +?d?d?u?d?u?d?u?u +?d?d?u?u?d?u?d?u +?d?u?u?d?d?d?l?l +?d?u?d?d?u?u?u?d +?d?d?d?l?l?l?u?d +?l?d?l?d?d?l?u?d +?u?d?l?l?d?d?u?d +?u?d?d?u?l?u?d?d +?u?d?l?d?u?d?d?l +?l?u?d?l?d?u?d?d +?d?u?l?d?d?d?l?l +?d?u?l?u?d?l?d?d +?l?d?d?l?d?l?l?d?d +?d?u?l?d?d?l?d?l +?l?u?l?d?d?l?d?d +?d?l?d?d?l?d?l?u +?d?l?l?l?u?d?d?d +?u?u?d?d?u?d?l?d +?l?d?u?l?d?l?d?d +?u?d?d?l?u?d?l?d +?d?d?l?u?u?l?d?d +?u?d?d?d?l?d?l?u +?u?d?d?l?d?u?d?u +?u?u?d?u?d?d?d?l +?u?d?l?d?d?l?u?d +?u?l?d?d?u?d?l?d +?d?d?u?u?u?d?d?l +?l?u?l?d?d?d?d?u +?d?d?l?l?d?d?u?l +?d?d?u?d?l?d?l?l +?d?d?u?l?d?l?l?d +?u?s?u?u?u?u?u?u +?d?u?l?l?l?u?l?l +?l?s?l?l?d?l?l?d +?l?l?d?l?d?l?l?s +?l?s?s?l?s?l?s +?l?s?s?l?l?s?s +?l?d?s?l?l?l?l?l +?s?s?d?d?d?d?d?d?d?d +?d?d?l?l?l?l?l?l?l?l +?l?l?l?l?d?d?d?d?u +?u?u?u?d?d?d?d?u?u +?s?d?d?s?d?d?s?l +?l?l?s?l?s?s?l +?s?l?s?l?s?l?l +?s?u?l?l?l?s?s +?s?u?u?s?u?u?s +?l?l?s?s?l?s?l +?s?l?l?s?s?l?l +?u?u?u?u?u?u?l?d +?l?l?d?l?l?l?l?u +?s?u?l?l?l?d?d?s +?l?l?l?s?s?l?d?d +?l?l?d?u?u?u?d?d +?d?u?l?l?d?l?l?d +?u?l?d?d?d?u?l?u +?u?d?d?u?l?l?l?d +?u?l?l?u?u?l?d?d +?d?d?d?l?l?u?l?l +?l?l?l?l?u?d?d?l +?d?d?u?u?d?u?u?u +?l?u?u?u?u?l?d?d +?d?l?l?l?l?l?u?d +?u?d?u?d?l?l?l?l +?d?u?d?l?l?d?l?l +?d?u?d?l?l?l?l?l +?u?l?l?u?d?d?d?u +?l?l?u?d?d?l?l?l +?u?d?l?d?l?u?d?l +?d?l?l?d?d?u?u?u +?u?l?l?d?u?u?d?d +?l?d?l?l?l?d?d?u +?u?l?l?l?d?u?d?d +?u?d?u?u?l?l?d?d +?u?d?l?l?u?l?d?d +?d?d?l?u?u?u?u?u +?d?u?l?d?l?l?l?d +?l?l?l?l?d?u?d?d +?u?d?l?d?u?l?l?d +?u?d?l?l?d?d?u?u +?l?l?l?l?l?d?d?l?d +?d?l?l?l?u?u?d?d +?u?l?d?u?l?d?u?d +?l?l?l?d?u?u?d?d +?l?d?l?d?l?d?l?l?l +?l?u?u?l?u?u?d?d +?u?u?u?d?u?d?d?u +?u?l?u?d?d?d?l?l +?d?u?d?u?u?u?d?u +?u?d?d?u?d?l?l?l +?d?l?l?u?l?l?d?d +?s?l?l?l?l?l?l?d?d +?u?l?l?l?l?s?l?l +?l?l?l?l?l?d?d?s?s +?d?s?d?d?s?l?l?l +?s?s?s?s?s?l?l +?d?d?l?l?l?d?d?d?l +?u?u?d?d?d?d?d?u?u +?l?d?d?d?d?d?d?l?d?d +?l?d?d?l?d?d?l?d?d?l +?l?d?l?l?l?l?l?l?d +?l?l?l?s?s?d?d?d?d +?u?s?u?d?l?l?l?l +?u?s?s?s?l?d?d +?s?d?s?d?s?u?l +?s?d?l?u?s?s?d +?u?s?s?l?s?d?d +?d?s?l?s?l?d?s +?l?d?s?s?d?s?l +?d?d?l?s?l?s?s +?l?l?s?d?s?d?s +?s?d?d?s?u?u?s +?s?s?s?d?d?l?u +?l?d?s?d?l?s?s +?d?s?l?l?d?s?s +?d?s?d?l?s?l?s +?s?l?s?d?d?u?s +?d?d?s?s?l?l?s +?l?s?s?s?l?d?d +?s?u?u?s?s?d?d +?l?u?s?s?s?d?d +?l?s?s?s?d?l?d +?l?d?s?s?s?d?l +?u?l?s?s?s?d?d +?s?s?u?u?d?d?s +?s?u?d?u?d?s?s +?u?d?s?s?d?s?u +?d?s?s?d?s?u?u +?u?s?l?s?s?d?d +?d?d?s?u?s?l?s +?s?l?d?s?s?d?l +?s?l?d?s?l?s?d +?s?s?s?u?u?d?d +?l?s?s?d?s?d?l +?s?s?l?d?l?d?s +?s?s?d?l?d?l?s +?l?s?d?l?s?d?s +?l?s?d?s?d?l?s +?d?d?s?l?l?s?s +?l?s?d?s?l?d?s +?s?u?s?l?s?d?d +?l?s?s?l?d?s?d +?s?u?l?d?d?s?s +?l?s?d?d?s?s?l +?s?l?s?s?d?l?d +?l?s?s?s?d?d?l +?u?u?s?s?s?d?d +?s?l?d?l?d?s?s +?s?s?l?d?l?s?d +?l?d?d?s?s?l?s +?l?s?l?d?s?s?d +?s?l?l?s?d?s?d +?d?s?d?l?l?s?s +?l?d?s?s?l?d?s +?d?l?l?s?d?s?s +?s?s?u?u?s?d?d +?s?d?d?s?l?s?l +?d?s?u?s?d?u?s +?d?d?u?u?s?s?s +?s?d?d?s?l?s?u +?l?d?s?d?s?l?s +?s?s?l?d?d?l?s +?s?s?l?l?d?d?s +?u?l?s?d?s?s?d +?s?d?l?s?l?d?s +?d?s?u?s?d?s?u +?s?l?s?l?d?d?s +?u?s?u?s?s?d?d +?s?s?d?s?l?d?u +?s?l?d?s?d?l?s +?s?u?u?s?d?d?s +?s?d?d?l?s?s?l +?s?s?s?d?l?d?l +?u?s?u?d?s?s?d +?u?s?d?s?d?s?u +?d?s?d?s?s?l?l +?d?s?l?l?s?d?s +?s?d?d?s?s?l?u +?u?l?l?l?l?d?u?l +?l?l?l?u?u?u?u?d +?l?l?d?l?l?l?d?s +?d?d?u?u?u?u?u?s +?l?l?l?s?l?d?l?d +?d?d?l?l?l?l?s?l +?d?d?d?d?d?d?d?d?s?u +?u?s?s?l?d?d?d?d +?l?d?d?d?l?d?s?s +?l?s?l?s?l?d?d?d?d +?d?d?d?d?l?s?s?l +?d?d?s?d?d?l?l?s +?l?l?d?s?d?d?s?d +?l?s?u?s?d?d?d?d +?s?l?d?d?s?l?d?d +?d?d?u?l?s?s?d?d +?d?d?d?d?d?s?d?d?d?d?d +?l?l?d?d?s?l?l?d?d +?l?l?s?l?l?l?l?d?d +?d?d?d?l?l?d?d?d?s +?d?d?d?l?s?l?d?d?d +?d?d?d?d?s?d?d?l?l +?l?d?l?l?l?l?s?l +?l?s?l?l?l?l?d?l +?s?l?d?l?l?s?l +?u?s?d?u?u?u?s +?s?l?s?l?l?d?l +?u?l?l?s?u?s?d +?u?l?s?l?l?d?s +?u?u?u?d?s?s?u +?l?s?d?s?l?l?l +?u?l?l?s?l?d?s +?s?u?l?d?l?l?s +?s?d?u?l?l?l?s +?d?l?l?s?l?s?l +?u?l?s?d?u?l?s +?u?l?l?s?d?s?l +?u?s?d?s?l?u?l +?u?d?u?s?u?s?u +?d?l?s?s?l?l?l +?s?d?u?l?l?s?l +?u?u?s?s?u?u?d +?u?u?s?l?s?l?d +?u?s?u?s?u?l?d +?u?s?u?u?s?d?l +?s?u?s?d?l?l?l +?s?u?l?l?d?l?s +?u?s?l?l?d?l?s +?u?s?l?s?l?u?d +?u?l?d?l?l?s?s +?u?l?u?l?s?d?s +?s?l?d?s?l?l?l +?u?s?l?d?l?l?s +?u?u?u?d?u?s?s +?u?u?s?s?l?l?d +?u?l?l?l?s?d?d?s +?l?d?u?l?l?s?s +?u?s?l?l?l?d?s +?s?d?s?l?l?u?l +?u?u?s?l?l?s?d +?s?l?s?d?l?l?l +?d?l?s?l?l?s?l +?d?d?d?d?d?d?s?d?d?d?d +?u?l?d?u?l?l?l?l +?d?d?l?d?l?l?d?d?d +?u?u?d?d?u?d?d?d?d +?u?d?u?d?u?d?d?d?d +?d?d?d?l?l?d?d?d?l +?u?d?d?l?l?d?d?d?d +?l?d?d?d?l?d?d?l?d +?d?l?d?l?d?d?d?d?l +?l?d?d?d?l?d?l?d?d +?u?l?d?d?l?d?d?d?d +?l?d?d?l?d?d?d?l?d +?l?l?d?s?d?d?l?l +?l?d?l?l?d?d?l?s +?u?d?l?l?l?s?d?d +?u?d?u?d?u?d?u?s +?u?l?l?d?d?d?d?d?s +?d?d?l?d?l?l?l?d?d +?l?l?l?u?l?u?s +?u?l?u?l?u?s?l +?u?l?u?l?l?u?s +?l?u?s?l?l?l?l +?l?l?u?u?l?s?l +?u?l?s?u?l?l?u +?u?l?u?u?l?l?s +?l?s?u?l?l?l?l +?u?s?u?u?l?l?l +?s?l?u?l?l?l?l +?l?d?l?l?s?l?l?l +?s?l?l?l?l?u?u +?s?u?u?l?l?l?l +?l?s?l?l?l?l?u +?u?u?u?s?l?l?l?d +?u?l?s?l?l?l?l?d +?u?u?s?u?u?l?l +?u?l?s?u?u?u?u +?s?d?d?d?d?d?d?s?s +?d?s?d?d?s?d?d?s?d +?d?l?l?l?l?l?d?u +?u?u?l?u?u?l?d?d +?d?s?s?s?s?s?s +?s?s?l?l?l?l?u +?u?s?u?u?s?u?u +?l?u?l?u?l?s?s +?s?u?s?u?u?u?u +?l?s?l?s?l?l?u +?d?u?u?l?l?l?l?l +?u?u?u?u?u?s?d?d?d +?u?l?l?l?l?l?s?l +?d?d?d?d?d?d?d?u?d?d +?l?s?l?l?s?s?s +?u?s?u?s?u?s?s +?l?l?d?s?l?l?l?d +?l?l?l?s?l?d?l?l +?l?l?l?l?d?s?l?l +?s?u?u?u?u?u?d?d +?d?l?l?d?l?l?l?s +?u?l?l?l?s?l?l?d +?s?d?d?s?l?l?l?l +?d?s?d?s?d?s?d?s?d +?l?d?d?l?l?l?d?d?l +?u?u?u?d?d?d?u?u?u +?d?l?l?l?d?l?l?l?d +?l?d?l?l?l?l?d?l?l +?l?l?l?l?s?s?s?d +?l?l?l?l?l?l?d?d?d?d?d +?l?l?l?s?d?d?d?d?s +?u?l?l?l?l?d?d?d?s +?l?l?d?l?l?l?l?l?d +?l?s?l?s?s?s?d +?l?l?s?s?s?d?s +?s?l?s?l?s?d?s +?d?s?l?s?s?l?s +?l?d?l?s?s?s?s +?l?u?u?u?l?l?u +?l?u?l?u?l?u?l?u +?l?u?u?u?l?u?l +?l?u?u?l?l?u?u +?u?l?u?u?u?u?l +?l?u?u?u?u?l?u +?l?l?l?u?u?l?u +?u?u?u?l?u?l?l +?l?u?u?l?l?l?u +?u?u?l?u?u?l?u +?u?l?l?u?l?l?s?d +?u?l?l?u?d?d?d?d?d +?d?d?u?u?u?u?d?d?d +?d?d?l?l?l?l?d?d?s +?l?d?d?l?d?d?l?l?l +?l?l?l?l?d?d?d?l?d +?u?l?l?l?l?l?s?u +?d?d?d?d?d?d?d?d?s?d?d +?s?d?d?d?s?d?d?d?d +?d?d?d?d?s?d?d?d?s +?d?d?s?d?d?d?d?s?d +?d?d?d?s?d?s?d?d?d +?l?s?s?l?l?d?d?d +?u?u?u?s?d?s?d?d +?u?u?u?s?s?d?d?d +?d?d?s?l?l?l?d?s +?u?l?l?s?s?d?d?d +?l?l?d?d?l?l?d?d?d?d +?l?s?l?l?s?s?l +?u?u?l?l?s?s?s +?u?s?l?l?l?s?s +?s?s?s?l?l?l?d?d +?d?d?l?l?l?d?d?d?d?d +?s?d?d?d?s?d?d?d?s +?d?d?s?l?l?l?l?s +?u?d?u?l?l?l?l?l +?u?l?u?d?l?l?l?l +?l?d?l?l?l?l?l?u +?l?l?l?l?l?d?d?d?d?s +?u?l?u?l?u?l?u?d?d +?d?d?d?d?d?d?s?u?l +?d?d?l?d?d?l?d?d?s +?d?d?d?d?l?l?s?d?d +?u?u?u?u?d?u?u?u?u +?l?l?l?d?l?l?d?s +?u?l?d?d?l?l?l?s +?l?s?l?l?d?l?d?l +?l?d?d?l?s?l?l?l +?l?d?l?l?l?l?s?d +?u?u?s?l?l?l?d?d +?l?d?l?d?l?s?l?l +?u?u?l?l?l?d?d?s +?l?d?d?d?d?d?d?d?d?d?l +?l?u?l?l?l?u?d?d +?l?l?d?d?u?u?u?u +?d?d?u?l?u?l?l?l +?l?u?l?d?d?l?u?l +?l?d?l?d?l?l?l?l?l +?l?l?d?d?l?l?u?u +?u?l?u?d?u?l?u?d +?l?l?d?d?u?u?l?l +?d?l?l?l?d?l?l?u +?l?l?l?l?l?d?u?d +?l?l?l?l?l?u?d?d?d +?u?u?l?l?u?l?d?d +?s?d?d?d?s?d?d?l +?d?d?d?d?d?s?u?s +?u?d?s?s?d?d?d?d +?d?d?s?d?l?s?d?d +?d?d?d?d?s?u?s?d +?d?s?d?d?s?l?d?d +?d?d?s?l?s?d?d?d +?d?l?s?d?d?s?d?d +?d?d?s?d?d?d?s?l +?d?d?d?d?s?l?s?d +?d?l?d?d?s?s?d?d +?l?s?d?d?d?d?s?d +?d?d?d?d?s?d?s?u +?d?d?d?d?s?s?l?d +?s?d?d?s?d?d?d?l +?u?s?d?d?d?d?d?s +?d?s?d?d?l?d?d?s +?s?d?d?d?d?s?d?l +?s?l?d?d?d?s?d?d +?d?d?d?d?s?u?d?s +?s?d?d?d?s?d?d?u +?d?d?d?l?s?s?d?d +?d?s?d?s?u?d?d?d +?s?d?d?s?d?l?d?d +?d?l?s?s?d?d?d?d +?s?u?d?d?d?d?d?s +?d?l?s?d?d?d?s?d +?s?d?d?d?s?l?d?d +?d?d?s?s?d?d?d?l +?u?s?d?d?s?d?d?d +?d?d?u?d?d?d?s?s +?d?s?l?s?d?d?d?d +?d?d?d?s?l?s?d?d +?u?d?s?d?d?d?d?s +?d?s?u?s?d?d?d?d +?d?s?d?d?l?s?d?d +?u?s?s?d?d?d?d?d +?s?d?d?d?d?s?l?d +?d?l?d?d?d?d?s?s +?d?u?s?s?d?d?d?d +?d?s?d?s?d?d?d?l +?s?s?d?d?d?d?l?d +?s?d?d?d?l?d?d?s +?d?l?l?l?l?l?s?l +?l?l?l?l?l?d?s?l +?d?l?s?l?l?l?l?l +?d?l?l?d?l?l?d?l?l +?l?s?l?l?l?l?l?d?d +?d?d?d?d?d?d?l?l?l?l?l +?d?d?l?l?d?d?l?l?d +?d?l?l?d?d?l?l?d?d +?d?l?d?l?d?l?d?d?l +?d?d?d?d?u?u?u?u?d +?l?d?d?l?d?d?l?l?d +?d?d?l?d?d?d?l?l?l +?d?d?d?d?d?d?l?s?d +?d?d?s?d?d?d?d?d?l +?s?d?d?d?d?d?d?d?u +?d?d?d?l?d?d?d?d?s +?d?d?l?d?d?d?d?d?s +?u?d?d?s?d?d?d?d?d +?d?d?l?d?d?s?d?d?d +?d?d?d?d?s?d?d?d?d?l +?d?l?d?s?d?d?d?d?d +?u?u?u?u?u?u?u?l +?u?l?l?l?u?u?u?d +?l?l?l?l?s?l?s?l +?d?d?d?d?d?u?d?d?d?d +?d?l?l?l?l?d?l?d?d +?d?l?d?l?l?d?d?s +?u?u?d?d?d?d?l?s +?d?d?u?s?d?d?u?u +?u?d?l?d?d?l?d?s +?d?s?l?l?d?d?l?d +?d?d?d?d?l?u?u?s +?u?s?d?d?u?u?d?d +?u?d?d?l?d?d?u?s +?d?d?s?l?l?d?l?d +?d?d?l?l?d?d?s?l +?u?u?u?d?d?d?s?d +?s?l?l?d?d?d?d?l +?d?s?d?d?d?u?u?u +?d?d?l?s?l?u?d?d +?d?d?d?d?u?l?s?l +?d?l?l?s?d?d?d?l +?u?u?u?d?s?d?d?d +?d?d?u?l?d?d?l?s +?u?d?d?s?d?d?l?l +?l?d?d?s?l?l?d?d +?d?l?l?d?d?d?l?s +?l?s?l?l?d?d?d?d?d +?u?l?d?d?d?d?s?l +?u?l?d?d?l?s?d?d +?s?u?l?u?d?d?d?d +?u?u?s?d?d?d?d?u +?d?l?d?s?l?l?d?d +?u?d?l?d?l?s?d?d +?d?d?u?d?d?u?u?s +?d?d?u?d?l?l?s?d +?s?d?u?u?d?l?d?d +?l?d?l?d?s?d?l?d +?d?d?u?s?l?l?d?d +?u?d?d?l?l?d?d?s +?u?d?u?d?d?u?d?s +?u?l?l?d?d?d?s?d +?l?s?u?l?d?d?d?d +?u?s?u?l?d?d?d?d +?d?u?u?u?d?d?d?s +?u?s?d?d?d?d?u?u +?d?d?d?l?l?s?l?d +?d?d?d?d?l?l?s?u +?d?d?d?d?u?l?u?s +?d?d?d?l?s?l?d?l +?l?d?l?d?s?l?d?d +?u?d?d?u?u?d?d?s +?d?d?d?d?s?l?l?u +?d?d?l?d?d?l?s?l +?l?d?d?d?d?s?u?u +?l?l?d?d?s?d?d?l +?d?d?l?l?l?d?s?d +?d?l?d?s?d?l?d?l +?s?l?l?d?l?d?d?d +?u?l?d?d?d?d?l?s +?d?d?d?s?d?u?u?u +?d?u?d?u?d?u?d?s +?u?d?d?u?d?d?s?l +?l?l?d?l?d?d?d?s +?s?d?d?u?l?l?d?d +?d?l?s?l?l?d?d?d +?l?d?d?l?d?d?s?l +?u?u?d?d?d?d?s?l +?l?d?d?d?l?s?l?d +?s?l?d?d?d?l?l?d +?l?d?d?l?l?d?s?d +?l?d?l?l?l?s?l?l +?u?l?l?d?l?l?l?s +?s?u?u?u?l?l?l?d +?u?u?s?u?u?u?u?d +?u?l?l?l?l?s?s?s +?s?l?d?l?l?d?l?s +?d?l?d?l?d?d?l?d?d +?l?d?d?d?d?l?d?l?d +?u?d?d?d?u?d?d?d?u +?u?d?u?u?d?d?d?d?d +?l?d?d?d?d?d?d?u?u +?d?d?d?d?u?l?u?d?d +?u?d?l?d?u?d?d?d?d +?l?d?l?d?d?d?l?d?d +?d?d?l?l?d?l?d?d?d +?l?s?l?s?l?s?l?d +?d?d?d?d?d?d?d?l?d?l +?u?l?u?l?d?d?d?d?d?d +?d?d?s?d?d?s?s?s +?l?d?d?u?u?u?d?l +?d?d?d?u?l?u?u?l +?l?d?d?d?l?l?u?l +?u?l?d?d?l?u?l?d +?d?d?l?l?u?u?d?l +?d?d?d?l?u?l?l?l +?l?d?d?l?d?l?l?u +?l?u?l?d?l?l?d?d +?l?u?l?u?u?d?d?d +?l?u?l?d?d?d?l?l +?u?d?d?u?u?u?d?u +?d?u?d?u?u?d?u?u +?d?u?d?d?l?l?l?l +?l?d?l?u?u?l?d?d +?l?l?d?d?d?u?u?l +?s?l?l?l?l?l?d?d?d +?d?l?l?l?l?d?d?u +?u?l?d?u?l?d?d?l +?l?d?l?d?u?l?d?l +?l?l?d?l?l?u?d?d +?u?l?l?d?d?u?l?d +?d?l?l?d?l?l?d?u +?u?u?u?l?d?l?d?d +?d?d?d?u?l?u?l?l +?u?l?d?d?l?d?l?u +?d?d?u?u?u?d?u?u +?d?u?l?l?d?d?l?l +?d?l?d?d?u?l?l?l +?l?l?d?l?l?d?u?d +?d?l?d?l?l?l?d?u +?l?l?l?d?d?u?u?d +?l?l?d?u?l?l?d?d +?l?d?u?l?d?u?l?d +?u?l?d?d?l?l?u?d +?l?l?d?d?d?d?d?d?d?s +?l?l?l?d?u?u?u?u +?s?u?s?l?s?u?s +?s?s?s?l?l?l?s +?s?l?l?l?s?s?s +?s?u?l?l?l?l?l?l +?s?u?u?u?u?u?u?u +?s?d?d?d?u?u?u?u +?l?d?l?d?l?d?s?l +?u?l?u?l?u?d?d?s +?l?l?d?d?l?d?l?s +?u?d?l?l?d?d?l?s +?u?l?s?u?l?l?d?d +?d?l?l?d?d?l?l?s +?u?s?d?l?l?l?d?d +?l?d?l?d?d?l?l?s +?l?l?l?l?d?l?s?d +?l?l?d?l?d?d?l?s +?l?d?l?l?d?d?s?l +?l?d?l?l?l?d?d?s +?d?d?l?l?l?d?l?s +?u?d?l?d?l?d?l?s +?l?d?l?l?s?l?l?d +?l?d?d?l?l?l?s?d +?d?s?d?l?l?l?l?d +?l?d?l?l?d?s?l?d +?l?l?s?u?u?d?d?d +?l?l?l?l?d?s?d?l +?s?l?l?d?d?l?l?l +?s?l?l?d?l?l?d?d +?u?s?l?l?l?d?d?d?d +?l?l?d?l?l?d?l?l?l +?u?l?l?d?l?d?d?d?d +?d?l?d?l?l?l?d?d?d +?l?l?d?d?l?d?d?l?d +?l?l?l?u?d?d?d?d?d +?l?l?d?l?d?d?l?d?d +?d?l?l?d?l?l?d?d?d +?u?s?s?s?s?s?s +?l?l?l?d?d?d?d?d?d?l +?l?d?d?d?d?d?l?d?d?d +?d?d?s?l?l?l?l?l?l +?u?s?u?l?l?l?l?l +?s?d?s?s?d?s?l +?l?s?d?s?s?d?s +?u?d?d?s?s?s?s +?s?l?s?d?s?d?s +?s?s?l?s?d?d?s +?s?d?s?s?l?d?s +?l?s?s?s?d?s?d +?d?d?l?s?s?s?s +?d?l?s?s?s?s?d +?s?d?d?s?u?s?s +?d?d?s?s?s?u?s +?l?d?s?s?d?s?s +?s?s?s?l?s?d?d +?u?s?s?s?s?d?d +?s?l?s?d?s?s?d +?l?d?s?s?s?s?d +?l?s?d?d?s?s?s +?d?s?d?s?s?s?l +?l?s?s?d?d?s?s +?s?d?d?s?s?s?l +?s?d?d?s?s?s?u +?s?s?d?s?l?s?d +?s?s?d?d?u?s?s +?s?l?s?d?d?s?s +?s?l?d?d?s?s?s +?s?d?s?d?s?l?s +?s?s?u?s?s?d?d +?s?d?s?l?s?s?d +?l?s?d?s?s?s?d +?s?l?s?s?s?d?d +?s?d?l?d?s?s?s +?l?l?s?l?l?l?l?l?l +?d?u?u?l?l?u?l +?l?u?u?u?d?l?u +?l?l?u?d?u?l?u +?l?u?l?l?u?d?l +?u?d?l?l?u?l?u +?d?u?l?u?u?l?u +?u?u?l?l?d?l?u +?d?l?u?u?l?l?u +?l?l?d?d?l?l?u?l +?l?l?u?l?d?d?l?l +?u?d?u?u?l?l?u +?u?u?u?l?u?d?l +?u?d?l?u?d?l?l?l +?d?l?u?u?u?l?l +?u?d?u?u?u?l?l +?u?u?u?l?d?l?u +?u?l?u?d?l?l?u +?d?u?u?u?l?u?u +?d?u?u?u?l?u?l +?u?d?u?l?u?u?u +?u?d?u?l?u?u?l +?u?d?u?u?l?u?l +?l?u?u?u?l?u?d +?l?u?l?l?d?u?l +?l?u?l?l?d?u?u +?l?u?u?l?l?u?d +?l?u?d?l?u?u?l +?l?l?u?u?d?u?u +?l?d?u?u?l?u?u +?u?l?u?u?d?l?u +?d?l?u?u?l?u?u +?u?l?d?u?u?l?l +?l?u?l?u?d?l?u +?u?l?d?l?l?l?l?s +?u?l?l?l?l?d?l?s +?u?l?l?l?u?d?l?l +?l?u?l?d?l?l?u +?u?l?u?u?l?d?l +?l?u?l?u?u?l?d +?l?u?u?l?d?u?l +?l?u?u?l?d?u?u +?l?d?u?u?u?u?l +?l?u?u?u?l?d?l +?l?l?u?d?d?l?l?u +?u?l?l?u?d?u?l +?u?l?d?l?u?u?l +?l?l?u?l?d?l?u +?u?d?l?u?u?u?l +?u?d?l?l?l?u?u +?l?l?u?l?d?u?l +?d?l?l?u?u?l?u +?u?u?l?u?u?d?u +?u?u?d?d?l?l?u?u +?u?d?u?l?u?l?l +?l?u?u?u?d?l?l +?l?d?d?l?l?u?l?l +?u?u?d?l?u?u?l +?u?u?l?l?u?d?l +?u?l?l?l?l?d?u?d +?u?d?u?l?l?u?l +?u?d?u?l?l?u?u +?d?u?u?l?l?u?u +?u?d?l?u?l?u?l +?d?l?l?l?u?l?u +?l?l?l?l?d?l?l?u +?l?u?u?d?u?u?l +?l?u?d?l?l?l?u +?l?u?l?d?u?u?l +?l?d?d?l?l?l?l?u +?l?l?u?u?u?d?u +?l?u?l?l?d?d?l?l +?l?l?u?l?u?d?l +?d?l?u?u?l?u?l +?u?u?d?u?l?u?u +?l?u?d?l?l?u?u +?d?u?u?l?u?u?u +?l?l?l?u?d?l?u +?l?d?u?l?u?u?l +?l?l?d?l?u?l?u +?u?u?l?d?u?u?l +?d?l?l?d?l?l?l?u +?u?l?l?u?d?l?u +?l?u?u?l?u?d?u +?l?u?u?l?u?d?l +?u?l?l?u?l?d?u +?u?u?u?d?u?l?l?l +?l?u?l?u?l?u?l?d +?l?d?u?u?l?l?u +?l?u?d?u?l?l?l +?d?l?u?l?u?u?u +?l?l?l?d?u?u?u?d +?u?d?u?l?l?l?u +?u?d?l?u?u?u?u +?u?u?l?u?l?d?u +?l?d?u?l?l?l?u +?l?l?u?d?u?u?u +?l?u?u?d?l?l?u +?l?l?u?d?u?u?l +?u?u?d?l?l?l?u +?d?u?l?l?u?u?l +?l?u?u?l?d?l?u +?l?l?u?u?d?d?s?s +?d?d?d?d?s?d?d?d?d?s +?l?d?l?l?l?l?l?d?l +?s?s?s?l?d?d?d?d +?l?s?d?d?s?d?d?s +?l?d?s?d?s?d?s?d +?l?s?d?d?d?d?d?d?s +?s?d?d?d?d?d?d?l?s +?s?d?d?d?d?d?d?s?l +?l?l?l?s?l?l?s?d +?l?l?l?l?s?l?s?d +?l?l?l?s?s?d?s +?d?u?s?u?s?u?s +?s?l?s?d?s?l?l +?s?l?d?l?l?s?s +?s?s?l?d?l?l?s +?l?s?d?l?s?l?s +?l?d?s?s?s?l?l +?s?l?s?d?l?s?l +?s?s?l?d?s?l?l +?u?u?u?d?s?s?s +?d?s?l?l?l?s?s +?l?s?d?s?l?l?s +?u?s?l?s?l?s?d +?d?s?l?l?s?s?l +?l?s?s?s?l?d?l +?l?l?s?d?s?l?s +?l?s?s?s?d?l?l +?s?l?d?s?l?l?s +?u?s?u?s?d?s?u +?l?s?s?d?s?l?l +?l?s?d?l?l?s?s +?l?l?s?s?s?l?d +?u?s?s?s?u?u?d +?l?d?s?l?s?l?s +?s?l?l?s?d?s?l +?d?u?s?s?u?u?s +?u?d?l?s?l?s?s +?u?l?l?d?s?s?s +?l?d?l?s?l?s?s +?l?d?s?s?l?l?s +?s?l?l?s?d?l?s +?s?l?s?s?d?l?l +?l?l?s?s?d?s?l +?s?s?s?l?d?l?l +?s?l?s?d?l?l?s +?s?d?l?l?s?l?s +?s?s?l?l?l?d?s +?l?l?s?l?d?l?l?l +?l?d?d?d?l?d?d?d?s +?u?l?l?s?d?d?d?s +?s?u?u?u?s?d?d?d +?d?d?d?l?s?l?s?l +?u?l?l?d?d?s?s?d +?l?s?l?d?l?s?d?d +?u?u?u?s?d?d?d?s +?l?s?s?l?l?l?l?l +?d?d?l?l?l?l?s?d?d +?u?d?u?d?u?d?u?d?u +?d?d?l?d?d?l?l?l?l +?l?d?l?d?l?l?d?d?l +?d?l?l?l?l?u?l?l +?l?u?d?d?d?d?d?d?d?d +?d?l?l?d?d?d?d?d?d?d +?u?l?l?l?u?l?l?s +?u?u?s?u?u?u?s +?d?l?l?l?l?l?s?s +?u?l?s?l?l?s?l +?u?l?s?u?l?l?s +?u?l?u?l?s?l?s +?u?l?l?u?l?s?s +?u?l?u?l?l?s?s +?s?l?l?l?l?u?s +?l?s?u?l?l?s?l +?s?u?u?l?l?l?s +?l?l?s?l?s?l?u +?s?l?s?l?l?l?u +?l?d?l?l?d?l?l?l?d +?d?l?d?d?d?d?l?l?l +?d?l?l?d?l?d?l?d?d +?l?s?l?l?l?s?l?l +?s?d?d?u?l?l?l?l +?l?l?l?d?l?l?s?d +?l?s?l?l?d?d?l?l +?u?u?d?d?s?u?u?u +?l?d?l?l?d?l?s?l +?l?l?l?d?l?d?l?s +?d?d?s?d?d?l?l?l?l +?u?s?l?l?s?l?s +?u?s?u?s?u?u?s +?u?s?u?u?s?u?s +?l?s?l?s?s?l?l +?s?l?s?l?l?s?l +?l?s?l?s?l?s?u +?s?l?s?s?l?l?l +?u?s?s?s?l?l?l +?s?s?s?u?l?l?l +?s?s?l?l?s?l?l +?l?l?l?l?l?l?s?d?d?d +?l?l?s?l?l?d?l?l +?l?s?l?l?d?l?l?l +?u?d?l?l?l?l?l?s +?u?d?d?d?d?d?d?d?d?s +?s?l?l?l?s?d?d?d?d +?l?u?l?u?l?d?d?d?d +?l?s?l?s?s?s?s +?u?l?u?l?d?d?s?s +?u?l?l?l?u?l?l?l?d +?s?s?l?l?d?d?s?s +?l?u?d?l?l?l?l?l +?u?l?u?l?u?l?l?d +?d?u?u?u?l?l?l?l +?s?s?s?u?s?s?s +?s?s?s?s?s?s?u +?d?d?d?d?l?l?l?d?d?d?d +?d?l?u?d?d?d?d?d?d +?d?l?d?d?d?d?d?d?u +?d?l?d?d?d?d?d?d?l +?u?d?d?d?d?d?d?l?d +?d?u?d?d?d?d?d?d?l +?d?d?d?d?d?l?u?d?d +?d?d?d?d?u?d?d?d?u +?u?l?u?d?d?d?d?d?d?d +?d?d?d?d?d?u?d?u?d +?u?d?d?d?d?d?l?d?d +?d?d?u?l?d?d?d?d?d +?d?d?u?d?u?d?d?d?d +?d?d?u?d?l?d?d?d?d +?s?s?s?s?s?d?l +?u?d?l?d?l?d?l?d?l +?l?u?l?s?l?l?l +?l?l?u?s?u?l?l +?u?l?l?u?u?l?s +?u?l?u?s?u?l?l +?l?s?l?l?u?l?l +?l?l?u?s?l?l?u +?u?s?l?u?l?l?l +?l?u?u?l?l?l?s +?s?l?l?u?u?u?u +?u?l?u?l?u?u?s +?u?s?l?l?l?l?u +?u?l?l?s?u?l?l?d +?u?l?s?l?u?l?l +?u?l?l?l?l?s?l?d +?u?l?u?l?l?s?l +?l?l?s?l?l?u?l +?u?l?u?l?s?u?l +?u?u?l?s?l?l?l +?d?l?l?l?s?d?d?d?d +?u?l?d?d?l?l?l?u +?u?u?u?d?d?d?l?l?l +?l?d?d?l?l?l?u?l +?d?l?l?l?u?u?u?d +?u?u?u?d?l?l?l?d +?l?d?l?d?l?l?l?u +?l?l?l?l?d?d?l?l?d +?l?d?l?l?d?l?u?u +?l?l?u?u?u?l?d?d +?d?d?l?u?l?l?l?l +?u?l?u?d?d?l?u?l +?l?d?d?u?l?l?l?l +?l?d?l?l?l?l?d?u +?d?l?l?u?l?l?l?d +?u?u?d?d?u?l?l?l +?u?u?d?l?l?l?l?d +?l?l?l?l?s?l?l?s +?l?l?l?l?l?l?l?s?d?d +?d?d?d?d?d?d?d?s?s?s +?d?s?d?s?d?s?l?l +?s?s?l?u?l?s?s +?l?s?l?s?s?l?s +?u?s?s?u?s?s?u +?l?l?s?s?l?s?s +?u?l?l?u?l?l?l?s +?l?l?l?u?l?d?l?l +?l?u?l?d?l?l?l?l +?l?u?l?l?l?d?d?d?d +?d?d?l?l?l?l?d?d?l +?l?l?l?d?d?d?d?u?u +?l?l?s?l?l?l?s?d +?s?d?l?l?l?l?l?s +?l?l?d?d?l?l?l?l?d +?d?l?d?l?d?d?l?d?l +?d?d?l?l?l?d?l?d?d +?d?l?l?l?d?d?d?d?d?d +?u?d?d?d?l?d?d?d?u +?d?d?l?u?l?d?d?d?d +?u?d?d?u?d?d?l?d?d +?d?d?l?d?d?d?l?d?l +?u?l?d?d?u?d?d?d?d +?l?d?l?l?d?d?d?d?d?d +?u?d?d?d?l?l?d?d?d +?l?d?d?d?l?d?d?l?l +?l?d?d?d?l?l?d?d?l +?u?d?l?l?d?d?d?d?d +?l?l?l?d?s?u?u?u +?l?l?d?l?s?l?l?l +?l?d?l?l?l?d?l?l?l +?s?l?s?d?d?d?d?d?d +?l?s?s?d?d?d?d?d?d +?l?l?l?l?s?l?l?d?d +?u?l?u?l?l?l?l?d?d +?u?u?u?u?s?d?d?s +?u?s?l?l?l?s?d?d +?l?s?d?d?s?l?l?l +?l?l?l?l?d?s?d?s +?s?s?s?s?s?d?d?d +?l?d?d?d?l?d?d?d?d?d +?l?d?s?l?d?l?l?l +?u?d?l?l?l?l?d?s +?u?l?l?l?s?u?d?d +?l?d?l?d?s?l?l?l +?d?s?l?l?l?l?l?d +?l?l?l?d?s?l?l?d +?l?d?l?l?d?l?l?l?l +?l?d?d?d?d?s?d?d?d?d +?u?l?l?l?l?l?u?s +?l?l?l?d?d?d?s?s?s +?d?l?d?l?d?l?d?l?d?l +?d?s?s?d?d?d?d?s +?s?d?s?d?d?d?d?s +?d?d?s?d?d?d?s?s +?s?d?d?d?s?d?d?s +?d?d?d?s?d?s?s?d +?d?d?d?s?d?s?d?s +?s?d?s?d?s?d?d?d +?s?s?d?d?d?d?d?s +?s?s?d?d?d?s?d?d +?d?s?d?s?s?d?d?d +?s?d?d?d?s?s?d?d +?l?l?d?d?l?d?d?l?l +?s?d?l?l?l?l?l?l?l +?d?d?d?d?d?s?d?d?s +?d?d?d?d?d?s?s?d?d +?u?u?u?l?l?l?s?d +?s?l?d?l?l?l?l?l +?s?l?l?l?l?d?l?l +?u?l?l?l?l?u?l?l?l +?u?u?u?u?u?s?s?s +?l?l?u?d?l?l?l?l +?u?l?l?u?l?l?u?d +?d?d?d?d?d?d?u?l?l?l +?d?d?l?l?l?l?l?l?s +?l?u?s?d?d?d?d?s +?s?l?d?l?d?d?d?s +?l?s?d?d?d?d?l?s +?s?u?s?u?d?d?d?d +?s?u?l?s?d?d?d?d +?s?s?u?u?d?d?d?d +?u?s?u?d?d?d?d?s +?s?s?d?d?l?d?d?l +?u?s?d?d?d?d?s?l +?s?d?l?d?d?l?d?s +?d?d?d?d?u?s?l?s +?d?s?d?s?d?l?l?d +?l?s?l?d?s?d?d?d +?d?d?d?d?u?s?u?s +?u?s?s?u?d?d?d?d +?s?d?d?s?l?l?d?d +?d?s?d?l?d?l?d?s +?s?d?d?l?l?s?d?d +?u?d?d?s?u?d?d?s +?d?d?s?u?l?s?d?d +?l?l?d?s?d?d?d?s +?s?d?d?u?u?d?d?s +?s?s?d?d?l?l?d?d +?d?d?l?d?d?l?s?s +?l?l?d?d?d?s?d?s +?d?d?s?l?d?s?l?d +?l?l?s?d?d?d?s?d +?s?s?d?d?d?d?u?u +?s?d?d?l?d?d?l?s +?l?d?d?s?s?l?d?d +?s?u?l?d?d?d?d?s +?s?s?s?l?l?l?l?l +?u?l?u?l?u?l?u?s +?s?l?l?l?l?l?l?l?s +?l?l?d?l?d?l?l?d?d +?l?l?d?d?d?l?l?l?d +?u?d?d?d?d?d?d?l?s +?l?d?d?d?d?d?d?s?l +?d?d?d?d?l?l?d?d?s +?u?d?d?d?d?d?d?u?s +?l?d?l?d?s?d?d?d?d +?s?l?l?l?l?l?d?d?s +?d?d?d?d?d?d?d?u?l?l +?d?d?d?d?s?s?d?d?d?d +?d?d?d?d?u?d?d?d?d?u +?u?d?d?d?d?l?d?d?d?d +?l?d?l?d?l?l?d?l?l +?d?l?d?l?d?l?s?l +?l?s?l?l?d?d?l?d +?l?l?s?d?l?d?l?d +?d?l?d?l?l?d?l?s +?s?l?d?l?l?d?l?d +?u?u?s?d?d?d?l?l +?u?u?u?d?d?d?u?s +?l?l?d?d?d?l?s?l +?u?d?l?d?u?d?l?s +?u?d?d?d?s?u?u?u +?u?d?d?d?l?l?l?s +?l?s?l?d?d?d?l?l +?l?l?l?d?d?d?s?u +?u?d?l?l?s?l?d?d +?s?d?l?l?d?d?l?l +?s?l?d?l?l?l?d?d +?l?l?s?d?l?l?d?d +?l?d?l?d?l?l?s?d +?l?s?l?d?l?d?l?d +?l?u?u?u?s?d?d?d +?l?u?l?u?s?d?d?d +?u?s?l?u?l?d?d?d +?l?s?d?d?l?d?l?l +?l?d?l?l?d?l?s?d +?d?d?l?l?s?l?l?d +?u?s?l?l?l?d?l?l +?l?l?l?d?l?s?l?l +?l?l?d?l?l?s?l?l +?l?l?l?d?l?l?s?l +?d?s?u?l?l?l?l?l +?s?s?l?s?l?s?s +?l?l?u?u?u?u?u?u +?u?l?l?l?l?l?l?s?d +?l?l?l?l?l?l?u?d?d +?d?l?d?d?l?l?l?d?d +?l?d?d?l?d?d?l?d?l +?d?u?d?u?d?u?d?u?d +?l?d?d?l?l?d?d?l?d +?l?d?d?d?l?d?l?l?d +?u?l?d?d?d?d?d?l?l +?d?d?l?d?l?d?l?d?l +?l?d?d?l?d?d?d?l?l +?l?l?l?u?u?u?d?d?d +?l?l?l?l?u?l?d?l +?l?l?l?u?l?l?d?l +?d?u?l?l?l?l?l?u +?l?l?l?l?d?l?u?l +?l?d?u?l?l?l?l?l +?s?u?l?l?d?d?d?s +?d?d?d?u?u?u?s?s +?s?u?u?u?u?s?d?d +?u?u?u?s?d?d?s?d +?l?l?d?d?u?u?s?s +?u?u?s?s?l?l?d?d +?d?l?d?l?s?u?s?u +?s?l?s?l?l?d?d?d +?d?u?l?l?l?l?l?l?l +?l?l?s?l?l?l?d?d?d +?d?d?d?d?d?d?d?l?l?s +?l?l?l?l?l?l?l?s?s +?u?u?u?u?l?d?l?d +?u?u?d?d?u?u?l?l +?l?l?l?l?u?d?d?u +?u?d?u?l?l?l?l?d +?u?d?l?l?l?l?d?u +?d?u?u?d?l?l?l?l +?u?l?u?l?d?d?u?u +?l?d?l?l?d?l?d?l?l +?d?l?l?u?u?l?l?d +?u?l?l?l?u?d?l?d +?u?u?u?u?l?d?d?l +?u?u?u?l?l?d?d?l +?u?u?l?d?d?u?u?u +?d?u?u?u?d?l?l?l +?l?l?l?d?u?d?l?l +?u?l?l?d?d?u?u?u +?d?l?l?l?d?u?u?u +?u?d?l?l?l?u?d?l +?u?u?l?u?l?l?d?d +?l?u?l?l?l?d?d?l +?u?l?d?l?l?d?l?u +?d?d?u?l?l?l?u?l +?u?l?d?l?u?l?d?l +?l?l?d?l?l?d?u?u +?l?s?l?s?d?d?d?d?d +?d?l?l?l?l?l?l?l?l?l +?s?d?s?s?d?s?s +?s?s?d?s?s?s?d +?d?s?s?s?s?s?d +?l?u?u?u?d?l?s +?d?l?l?l?u?l?s +?u?s?u?l?u?d?u +?u?s?l?u?d?l?l +?s?l?l?l?d?u?u +?u?l?u?l?s?d?u +?l?u?l?u?u?s?d +?l?l?s?l?l?d?l?d +?u?s?u?d?u?u?u?u +?d?u?u?u?s?l?l +?u?l?l?u?d?l?s +?l?l?l?u?d?s?l +?l?u?s?d?u?u?u +?u?s?u?l?l?d?l +?u?l?l?d?s?u?u +?l?l?u?s?d?l?l +?l?l?u?d?l?s?l +?l?l?l?s?l?d?d?l +?u?l?s?u?d?l?u +?l?u?l?d?s?l?l +?l?s?u?u?d?l?l +?l?u?l?u?s?l?d +?l?l?l?d?l?u?s +?l?u?l?s?l?d?l +?l?l?d?l?l?u?s +?l?s?l?d?u?l?l +?l?s?l?d?l?u?u +?u?l?l?u?u?s?d +?l?d?l?l?l?u?s +?u?l?u?d?l?l?s +?u?d?l?s?u?l?l +?u?u?d?l?l?s?u +?u?l?s?l?l?d?u +?d?l?s?l?l?l?u +?l?u?u?u?u?d?s +?l?l?l?d?u?u?s +?u?l?l?d?u?l?s +?d?s?u?u?l?l?u +?l?s?d?u?u?u?u +?s?u?l?d?l?u?l +?d?u?l?u?s?l?u +?l?s?l?u?l?d?u +?l?d?l?s?l?u?l +?s?l?l?d?u?l?l +?u?u?l?s?d?u?l +?l?d?l?l?u?l?s +?u?l?u?s?l?d?u +?u?l?u?s?l?d?l +?s?u?d?l?l?l?l +?l?u?u?l?s?l?d +?u?d?l?u?l?l?s +?l?s?l?u?d?l?u +?l?s?l?u?d?l?l +?u?u?l?d?l?l?s +?l?l?d?u?u?u?s +?u?l?u?s?u?l?d +?u?d?l?s?l?l?u +?s?l?u?l?d?l?u +?u?l?d?l?s?u?l +?d?l?u?l?s?l?l +?u?l?d?u?s?u?u +?l?d?l?s?u?l?l +?u?l?l?u?u?d?s +?l?l?s?l?l?u?d +?l?d?l?s?l?d?l?l +?d?l?u?l?l?s?l +?l?d?u?l?l?u?s +?d?u?l?l?u?l?s +?s?u?l?u?u?d?l +?u?u?u?u?d?u?s +?u?l?l?u?s?d?l +?u?l?u?d?s?l?l +?u?s?u?l?l?u?d +?u?l?s?d?u?l?u +?u?l?s?d?u?l?l +?l?l?l?u?d?s?u +?d?l?s?u?u?l?l +?u?u?u?s?l?l?d?d +?u?l?l?l?d?s?u +?s?d?l?l?u?l?l +?l?l?d?l?s?u?l +?u?d?u?s?u?l?u +?l?l?d?u?l?u?s +?u?u?u?s?l?d?l +?l?l?s?u?d?u?l +?l?s?d?l?l?l?l?d +?u?u?u?l?d?s?l +?u?u?u?l?u?d?s +?u?s?u?u?d?l?l +?l?l?u?s?l?d?l +?l?d?s?l?u?l?l +?l?s?u?l?l?l?d +?l?l?l?s?u?d?l +?l?l?l?s?u?d?u +?d?l?l?l?l?s?u +?u?l?d?s?l?u?u +?u?l?d?u?u?u?s +?u?u?u?u?l?s?d +?s?u?l?l?l?d?l +?d?l?l?l?s?u?u +?u?s?l?l?u?l?d +?d?s?l?l?l?u?l +?s?d?d?u?u?u?u?u +?u?u?s?u?d?l?l +?l?s?l?u?l?l?d +?u?s?l?l?l?d?u +?u?u?u?l?l?d?d?s +?l?l?u?u?u?s?d +?d?s?u?l?l?l?u +?d?l?s?l?l?u?l +?u?d?l?u?l?s?u +?u?l?d?u?l?l?s +?u?l?l?d?l?u?s +?u?d?s?u?u?u?u +?l?u?s?d?l?l?l +?u?d?s?u?l?l?l +?l?s?d?l?u?l?u +?u?l?l?u?s?u?d +?l?l?s?l?d?l?u +?u?s?l?l?u?d?l +?u?u?u?l?l?s?d?d +?s?l?l?l?u?d?l +?l?s?u?d?l?u?l +?d?s?l?l?l?l?u +?u?l?l?s?u?d?l +?l?l?u?u?d?u?s +?s?l?l?u?l?u?d +?u?u?u?l?l?d?s +?u?d?l?l?u?s?u +?u?s?d?u?l?u?l +?s?l?u?l?l?l?d +?l?d?s?l?u?u?u +?u?l?u?l?d?u?s +?u?d?u?l?u?l?s +?u?l?d?s?u?l?u +?l?s?l?d?d?l?l?l +?l?l?d?l?s?l?u +?u?s?l?l?l?u?d +?u?s?d?l?l?u?l +?u?l?s?u?l?d?u +?u?u?l?u?l?d?s +?u?u?u?u?s?l?d +?d?u?l?s?u?l?u +?u?d?l?l?s?u?l +?s?d?l?l?l?l?u +?l?u?d?l?l?l?s +?d?l?u?l?l?l?s +?u?u?u?d?s?u?u +?l?s?u?l?d?l?u +?d?l?l?u?s?l?l +?s?d?l?u?l?u?l +?s?l?l?d?l?l?u +?u?u?u?u?d?s?u +?l?l?l?d?l?s?u +?l?l?d?l?u?l?s +?l?l?u?u?u?d?s +?u?d?u?u?u?s?l +?l?l?l?d?s?u?l +?l?l?l?d?s?u?u +?l?u?u?d?u?l?s +?u?u?l?l?u?s?d +?l?l?d?l?s?u?u +?s?d?l?u?l?l?l +?s?u?l?l?l?d?u +?s?l?l?d?l?u?u +?u?u?u?l?d?u?s +?d?l?l?l?s?u?l +?u?u?d?l?u?l?s +?l?l?l?u?l?d?s +?u?l?d?l?s?l?u +?d?l?u?s?l?l?u +?u?l?d?u?l?u?s +?u?l?u?d?l?s?l +?u?u?s?u?d?u?u +?l?d?l?s?l?l?u +?s?l?l?l?u?u?d +?s?l?l?u?d?l?l +?l?l?u?l?d?l?s +?l?l?l?s?u?l?d +?u?s?l?l?u?u?d +?u?u?d?u?u?s?u +?l?s?d?l?l?u?l +?l?l?u?u?d?l?s +?l?s?u?l?d?u?l +?l?s?l?l?l?d?u +?u?s?u?d?u?l?l +?l?d?u?l?s?l?u +?u?l?l?u?l?d?s +?s?l?u?d?l?l?u +?d?u?l?l?s?l?l +?u?d?u?l?l?l?s +?u?u?d?l?l?l?s +?s?d?u?l?l?u?u +?l?d?s?l?l?u?l +?u?u?l?l?s?d?u +?l?l?s?l?d?u?l +?l?u?u?u?d?s?l +?l?u?l?l?l?s?d +?u?l?u?s?d?u?l +?u?l?l?d?d?s?l?l +?u?s?u?d?l?u?l +?l?s?u?u?u?d?u +?l?l?d?d?d?d?d?d?d?d?d?d +?l?d?s?s?d?l?s?l +?d?d?s?s?s?s?d?d +?s?d?s?d?s?d?d?s +?s?d?d?s?s?d?d?s +?s?d?d?d?d?s?s?s +?u?l?u?d?l?u?d?d +?d?u?l?d?l?d?l?l +?u?u?d?l?d?l?d?l +?l?d?l?u?l?l?d?d +?u?l?l?u?d?l?d?d +?u?d?d?l?l?d?u?l +?d?u?u?d?u?d?u?u +?d?u?u?l?l?d?d?l +?u?u?u?d?d?u?d?u +?d?d?l?l?d?u?u?u +?u?l?d?l?d?d?l?u +?l?l?d?l?u?u?d?d +?u?l?d?d?d?u?u?l +?l?d?l?u?d?d?u?u +?l?l?d?u?d?l?u?d +?u?d?d?d?u?l?u?l +?u?u?d?d?l?l?l?d +?l?u?u?u?d?d?l?d +?u?d?d?u?l?l?d?l +?u?d?d?d?l?l?u?u +?d?u?u?d?u?u?d?u +?u?u?u?d?l?l?d?d +?u?l?l?d?d?u?u?d +?u?l?u?d?d?l?d?u +?u?l?d?d?l?u?d?l +?d?d?d?l?l?u?u?l +?u?d?u?d?l?l?l?d +?l?d?l?d?l?l?l?l?d +?u?l?u?d?d?d?l?u +?u?l?u?l?d?d?d?u +?l?d?d?u?l?l?u?d +?l?d?u?d?l?d?u?u +?l?l?l?d?d?u?l?d +?u?d?u?u?u?l?d?d +?l?u?l?l?d?d?l?d +?u?d?l?u?d?l?l?d +?u?d?l?d?u?d?l?u +?l?d?d?l?l?d?u?u +?u?u?u?d?l?u?d?d +?u?u?l?l?d?d?u?d +?l?l?u?u?d?l?d?d +?l?u?l?d?d?u?l?d +?u?l?l?d?u?d?d?l +?u?d?d?u?u?d?u?u +?l?l?l?l?d?d?u?d +?d?l?l?l?d?l?d?u +?u?u?u?d?d?d?l?u +?d?l?l?d?u?l?l?d +?u?d?l?u?d?l?d?u +?d?u?l?l?u?l?d?d +?d?l?l?l?d?d?l?u +?l?d?d?l?d?l?u?u +?l?d?l?l?l?l?d?l?d +?d?u?l?u?d?d?u?l +?u?d?u?d?d?l?l?l +?u?d?u?d?d?l?l?u +?u?l?l?l?d?d?u?d +?l?l?l?d?u?l?d?d +?d?l?d?d?l?l?l?u +?u?d?d?u?d?u?u?u +?u?d?d?l?l?u?d?l +?u?l?l?d?u?d?l?d +?u?l?l?d?d?u?d?l +?d?u?l?u?u?l?d?d +?u?d?l?l?d?l?d?u +?d?d?d?u?u?u?u?l +?l?d?l?d?d?l?l?u +?d?d?u?l?d?l?u?l +?u?u?u?u?d?l?d?d +?u?u?d?d?d?d?u?u?u +?l?d?l?d?u?l?d?u +?u?u?d?d?d?u?l?l +?l?l?u?l?d?l?d?d +?u?l?u?d?l?l?d?d +?l?l?d?u?d?l?d?u +?u?d?u?d?u?d?u?l +?d?u?l?l?l?d?u?d +?l?l?u?d?l?d?l?d +?u?d?d?u?l?d?l?l +?l?d?d?d?u?u?l?l +?u?d?d?d?u?u?u?l +?d?d?u?u?u?d?l?l +?u?u?u?l?d?d?d?l +?u?d?u?d?l?l?d?l +?u?u?d?u?d?d?u?u +?u?l?d?l?u?u?d?d +?l?d?l?l?d?l?d?u +?u?d?l?l?d?u?u?d +?d?u?l?l?l?d?d?u +?l?d?l?l?d?d?u?l +?l?d?l?l?d?d?u?u +?d?u?d?l?u?l?u?d +?l?l?u?l?u?d?d?d +?d?l?u?l?u?l?d?d +?u?l?d?d?d?l?l?u +?u?u?d?d?d?u?u?l +?u?l?d?u?l?u?d?d +?d?l?l?l?l?u?d?d +?l?l?l?d?l?u?d?d +?u?u?d?d?u?l?l?d +?l?l?d?d?u?u?d?l +?l?u?l?d?d?l?l?d +?d?d?l?d?d?d?d?l?d?d +?d?d?d?d?l?d?d?l?d?d +?l?s?s?d?s?s?l +?s?s?l?l?s?s?d +?s?s?l?s?l?s?d +?s?s?s?l?s?l?d +?s?s?s?s?d?l?l +?s?l?s?d?s?l?s +?l?s?s?l?s?s?d +?d?s?l?s?l?s?s +?s?s?s?s?l?l?d +?d?l?l?s?s?s?s +?s?s?s?s?l?d?l +?s?l?s?l?s?s?d +?l?l?l?l?d?l?d?l?d +?l?l?l?u?l?u?u +?u?u?l?u?u?u?l +?u?l?d?l?l?u?l?l +?u?l?u?u?u?l?l +?l?u?l?u?u?l?l +?l?u?l?u?u?u?l +?l?l?u?u?u?u?u?d +?l?u?u?l?u?l?u +?l?u?l?l?d?l?l?l +?d?l?l?l?l?u?u?u +?l?l?u?l?d?l?l?l +?l?l?u?l?u?u?l +?u?u?u?l?u?u?l +?d?d?l?l?d?d?l?l?d?d +?l?s?d?d?s?d?d?d?d +?s?s?l?d?d?d?d?d?d +?u?l?l?l?u?l?l?l?l +?s?s?s?l?l?d?d?d +?u?l?d?d?d?s?s?s +?s?s?s?d?d?d?l?l +?l?l?s?d?d?d?s?s +?l?s?l?s?d?d?s?d +?d?l?l?l?l?l?l?d?l +?l?l?l?l?s?d?d?d?d?d +?d?l?l?l?u?u?u?s +?l?l?l?d?u?u?u?s +?l?l?d?d?d?l?d?d?d?d +?l?d?l?l?d?l?d?d?l +?u?u?d?d?d?d?l?l?l +?l?l?l?d?l?d?l?d?d +?d?d?u?l?l?l?u?d?d +?u?s?l?s?l?l?s +?s?s?s?u?l?u?l +?u?u?s?s?s?l?l +?s?u?s?l?l?l?s +?s?l?l?s?l?s?l +?u?s?s?s?u?u?u +?l?s?s?l?l?s?l +?u?s?u?s?u?s?l +?u?u?s?s?s?u?u +?l?s?u?s?u?s?u +?s?u?u?u?u?s?s +?u?u?u?d?d?d?d?d?d?d?d +?l?l?d?l?l?l?d?l?l +?l?u?u?u?u?u?u?d?d +?u?u?u?s?l?l?l?l +?d?d?l?l?s?s?u?u +?l?s?l?s?l?l?d?d +?l?l?l?d?d?l?s?s +?s?l?d?d?l?l?l?s +?l?l?d?d?s?s?l?l +?d?l?d?l?l?d?l?d?d +?d?d?d?l?l?l?d?d?l +?d?l?d?l?d?l?l?d?d +?d?l?l?l?d?l?d?d?d +?u?l?d?l?l?d?d?d?d +?l?l?l?l?l?s?l?d?d +?l?l?d?l?l?l?l?d?l +?s?s?l?l?s?s?l +?s?u?u?u?s?s?s +?s?l?l?l?s?d?d?s +?l?l?l?l?s?s?d?d?d +?l?l?l?l?u?d?l?l +?u?l?l?l?d?l?l?u +?l?l?u?l?l?l?d?l +?u?l?l?d?l?l?l?u +?l?d?l?u?l?l?l?l +?l?l?u?l?l?d?d?d?d +?l?l?s?l?l?l?d?l +?u?l?l?l?d?l?l?s +?u?l?u?l?u?l?s?d +?l?l?l?l?l?s?s?d?d +?l?l?s?l?l?l?l?s +?d?l?l?l?l?l?d?l?l +?l?l?l?l?l?l?u?s +?u?d?d?d?d?d?d?s?d +?u?s?d?d?d?d?d?d?d?d +?d?d?d?l?d?d?s?d?d +?d?d?d?d?u?d?d?d?s +?s?d?d?d?d?l?d?d?d +?d?d?d?s?l?d?d?d?d +?d?l?s?d?d?d?d?d?d +?d?d?d?d?d?l?s?d?d +?s?d?d?d?d?l?l?l?l +?l?l?l?u?s?s?u +?l?s?l?l?s?l?u +?l?l?l?u?u?s?s +?s?l?s?u?l?l?l +?u?l?l?s?u?s?u +?u?s?u?l?s?u?l +?s?u?l?u?l?l?s +?l?l?l?s?s?l?u +?s?u?u?u?l?l?s +?l?l?u?l?l?s?s +?s?u?l?l?u?l?s +?u?u?u?u?s?l?s +?l?l?s?l?s?u?u +?s?l?l?s?u?l?l +?u?u?s?s?l?l?l +?u?u?u?s?u?s?u +?s?l?s?l?l?u?l +?u?s?l?u?s?l?l +?s?l?u?u?u?u?s +?s?l?l?s?l?l?u +?l?l?l?l?d?s?s?s +?d?d?u?d?d?d?d?d?d?d +?u?l?u?l?l?u?l?l +?s?l?l?l?d?d?l?l +?u?l?u?l?l?s?d?d +?d?l?l?l?s?l?l?d +?s?l?l?l?l?d?d?l +?d?d?l?l?l?s?l?l +?l?d?s?d?l?l?l?l +?l?d?d?l?l?s?l?l +?l?d?l?d?l?l?s?l +?l?l?s?d?l?l?l?d +?u?d?d?d?d?u?u?d?d +?d?l?l?d?d?d?d?d?l +?d?d?d?l?d?d?l?l?d +?u?d?d?u?u?d?d?d?d +?l?l?l?d?d?s?d?d?d?d +?d?d?l?d?l?d?d?d?l +?d?u?l?l?d?d?d?d?d +?u?l?d?d?d?d?u?d?d +?d?u?u?u?d?d?d?d?d +?l?d?d?d?d?d?d?u?l +?d?d?d?l?u?l?d?d?d +?d?d?d?d?u?d?d?u?u +?d?l?d?d?l?d?l?d?d +?d?d?l?d?d?d?l?l?d +?l?s?s?s?s?s?l +?d?d?l?l?u?u?l?l +?l?l?l?d?l?l?d?u +?u?l?u?l?l?l?d?d?d +?l?d?l?l?l?d?l?l?d +?u?l?u?d?d?l?l?l +?u?l?u?u?u?l?d?d +?d?u?l?l?l?l?d?l +?u?l?u?l?d?d?u?l +?d?u?l?l?l?d?u?l +?u?u?l?l?d?d?u?u +?u?u?u?d?d?u?l?l +?u?l?d?l?u?d?l?l +?u?l?l?u?l?d?l?d +?u?l?l?d?u?d?l?l +?u?l?l?u?d?d?l?l +?u?d?l?l?l?l?u?d +?d?u?u?l?l?l?l?d +?u?u?u?u?l?l?l?d?d +?l?u?l?l?d?l?d?l +?u?l?l?l?d?u?l?d +?l?u?u?u?u?d?u?d +?u?l?d?u?l?d?u?l +?u?l?d?d?u?l?u?l +?u?l?d?u?l?u?d?l +?d?d?d?d?d?d?l?l?l?s +?l?l?l?l?d?l?s?l +?l?l?l?l?d?s?d?d?d +?u?u?u?u?u?u?l?l +?l?d?l?d?d?d?d?d?s +?d?d?l?l?s?d?d?d?d +?s?u?u?d?d?d?d?d?d +?s?d?d?l?l?d?d?d?d +?l?l?d?s?d?d?d?d?d +?l?l?d?d?d?d?d?s?d +?s?l?l?l?l?d?l?s +?u?l?u?l?d?l?l?l +?u?d?l?u?l?l?l?l +?l?l?d?l?l?l?u?l +?l?d?l?l?l?u?l?l +?l?l?d?l?l?u?l?l +?l?l?u?l?l?d?l?l +?u?d?l?l?u?l?l?l +?l?l?l?d?l?u?l?l +?l?d?l?l?l?l?u?l +?d?s?d?s?d?d?d?d?s +?d?s?d?d?s?d?s?d?d +?d?d?l?d?d?d?d?d?d?l +?u?u?s?u?u?s?d?d +?l?l?d?l?l?d?s?s +?u?l?s?l?l?s?d?d +?u?u?s?s?d?d?l?l +?l?d?d?l?l?l?s?s +?s?u?l?l?l?s?d?d +?l?s?l?l?s?l?l?l +?u?s?u?s?u?s?u?s +?d?l?d?l?l?d?d?u +?l?l?d?d?u?d?d?l +?l?d?d?d?u?l?u?d +?u?d?l?l?d?d?d?u +?l?l?d?d?u?l?d?d +?d?l?d?d?d?l?l?u +?u?l?u?d?d?u?d?d +?d?d?u?l?u?d?l?d +?d?d?u?d?l?u?l?d +?u?d?l?d?d?l?d?l +?d?l?d?u?d?u?l?d +?u?d?l?u?d?d?l?d +?l?d?u?u?l?d?d?d +?u?d?d?d?u?d?u?l +?d?l?d?l?u?d?u?d +?u?u?d?l?d?l?d?d +?d?d?u?d?l?l?d?l +?d?d?u?d?l?l?d?u +?u?d?d?d?l?u?l?d +?u?u?l?d?d?d?l?d +?d?d?l?l?d?u?d?l +?l?d?d?d?l?l?u?d +?u?d?u?l?d?u?d?d +?d?d?u?u?l?d?d?u +?l?d?d?u?d?l?d?l +?d?l?d?d?d?l?u?u +?l?d?u?d?d?l?l?d +?l?d?l?d?u?l?d?d +?d?d?u?d?l?d?u?u +?d?d?u?d?l?d?u?l +?l?u?d?l?d?d?l?d +?d?d?d?l?d?l?u?u +?u?d?d?u?u?d?d?l +?d?d?l?d?d?u?u?l +?d?d?l?d?d?l?u?u +?l?u?u?d?l?d?d?d +?d?u?u?l?u?d?d?d +?u?l?d?d?d?u?u?d +?u?d?u?d?u?d?d?l +?d?d?l?d?l?l?u?d +?d?u?u?d?l?d?d?l +?l?u?d?d?l?d?d?l +?d?l?d?u?u?d?d?u +?l?u?l?d?u?d?d?d +?u?d?l?d?d?d?u?u +?u?d?l?d?d?d?u?l +?d?l?u?l?d?u?d?d +?l?d?l?d?d?d?u?u +?l?d?l?d?d?d?u?l +?d?d?u?u?l?u?d?d +?l?l?d?d?d?l?d?d?l +?d?l?d?d?d?u?l?l +?d?u?l?l?d?d?d?l +?u?d?d?u?d?u?l?d +?d?d?u?d?u?u?d?u +?u?d?d?u?d?d?u?l +?l?d?d?d?u?l?d?l +?u?d?d?d?l?u?u?d +?l?d?d?l?d?u?d?u +?l?u?d?l?d?l?d?d +?u?d?d?u?u?d?l?d +?l?u?d?d?d?l?l?d +?d?d?u?d?u?d?l?u +?u?u?d?u?d?l?d?d +?l?d?d?l?d?d?l?u +?u?d?d?u?d?l?l?d +?u?d?d?l?d?d?l?u +?d?l?d?u?l?d?d?u +?u?d?u?l?d?d?l?d +?l?l?d?d?d?u?l?d +?d?l?l?d?d?u?l?d +?u?u?l?d?u?d?d?d +?d?d?l?l?d?u?u?d +?d?u?l?l?d?d?d?u +?l?l?u?d?d?d?l?d +?d?d?l?d?l?l?d?u +?l?d?d?d?u?l?d?u +?d?l?d?u?u?l?d?d +?u?d?l?d?u?l?d?d +?l?u?u?d?d?l?d?d +?l?l?u?d?d?d?d?u +?d?d?l?d?l?d?u?l +?u?d?d?u?l?d?l?d +?d?d?d?u?l?d?l?l +?d?d?l?d?u?l?d?l +?u?l?d?d?l?d?u?d +?d?u?d?l?d?u?u?d +?l?d?u?d?d?d?u?u +?u?l?d?l?d?u?d?d +?d?d?d?u?u?d?l?u +?d?d?u?u?l?d?l?d +?d?u?d?u?u?d?u?d +?d?u?d?d?l?l?u?d +?d?u?d?u?l?d?l?d +?l?d?d?l?l?d?u?d +?l?d?d?d?l?l?d?u +?d?u?l?d?d?d?u?l +?u?d?l?d?d?u?d?u +?l?d?d?d?d?l?l?l?d +?d?l?d?l?d?u?d?u +?d?d?d?l?l?d?l?u +?d?u?d?l?l?d?d?l +?d?l?u?u?d?d?d?u +?d?l?l?u?d?d?u?d +?d?u?d?u?u?d?d?l +?u?l?l?u?u?d?d?d?d +?l?d?l?d?d?d?d?l?l +?u?l?l?l?d?d?s?d?d +?u?d?d?l?d?u?u?d +?l?d?u?d?d?d?u?l +?d?l?l?d?d?u?u?d +?u?d?u?u?d?d?d?l +?d?d?u?l?d?u?l?d +?d?l?d?d?l?d?l?d?l +?l?d?d?u?l?d?l?d +?l?d?l?d?u?d?d?u +?d?d?u?d?l?u?d?l +?u?d?d?d?u?d?l?l +?l?u?u?d?u?d?d?d +?d?d?d?l?d?u?u?u +?l?l?d?d?l?d?d?u +?l?l?d?d?u?d?u?d +?d?l?d?u?d?l?u?d +?d?d?d?l?l?u?d?l +?l?u?d?d?d?d?u?u +?u?d?d?l?d?l?u?d +?u?u?d?l?d?d?d?l +?d?l?u?d?d?u?u?d +?u?d?u?u?u?d?d?d?d +?l?u?d?u?d?u?d?d +?u?l?d?d?u?d?d?u +?d?l?u?u?l?d?d?d +?u?l?l?d?d?u?d?d +?d?l?l?d?l?u?d?d +?l?d?d?d?l?l?d?l?d +?u?u?d?d?d?l?d?u +?d?d?l?l?d?l?d?u +?u?l?d?u?d?d?d?l +?d?l?l?d?d?l?u?d +?d?u?u?l?l?d?d?d +?d?u?u?d?l?l?d?d +?d?l?l?u?l?d?d?d +?d?d?u?l?d?u?u?d +?l?d?d?d?d?l?u?l +?d?d?l?u?d?l?u?d +?u?u?d?d?d?u?l?d +?d?d?u?l?l?d?u?d +?d?d?d?l?l?d?u?l +?d?l?d?l?l?u?d?d +?l?d?d?d?d?u?u?l +?u?d?d?d?d?l?u?l +?d?u?d?d?l?l?d?l +?d?l?d?d?u?u?l?d +?u?d?u?d?d?l?d?l +?d?u?u?d?l?d?u?d +?u?d?d?u?l?d?d?u +?d?d?u?u?d?l?l?d +?d?l?d?u?l?l?d?d +?l?d?d?l?d?u?l?d +?d?u?l?d?d?u?d?l +?u?d?d?l?d?l?d?u +?u?d?d?u?u?l?d?d +?d?u?d?l?u?d?l?d +?d?l?d?l?d?l?d?l?s +?l?d?d?d?u?u?d?l +?d?d?u?l?l?d?d?l +?l?d?d?l?l?d?d?l?l +?d?l?d?d?l?u?l?d +?d?u?d?l?l?d?l?d +?d?l?l?d?d?d?u?u +?d?l?d?u?u?d?l?d +?l?l?d?d?l?d?u?d +?d?u?d?d?u?l?d?l +?l?d?d?u?l?u?d?d +?d?l?d?d?l?d?u?l +?l?l?l?d?u?d?d?d +?d?d?d?u?l?u?l?d +?d?u?d?u?d?l?d?l +?l?d?u?d?l?d?d?u +?l?d?u?u?d?d?l?d +?d?d?u?l?l?d?l?d +?d?l?d?d?u?l?d?l +?u?u?d?d?d?d?l?u +?d?u?d?u?d?u?l?d +?u?d?u?l?u?d?d?d +?d?d?l?l?u?d?d?l +?d?l?d?l?d?u?d?l +?u?d?u?d?d?d?u?l +?l?d?d?l?l?d?l?l?d +?d?u?l?d?d?d?l?u +?l?l?d?d?u?d?l?d +?l?d?l?u?d?u?d?d +?u?d?l?d?u?u?d?d +?d?d?u?u?d?l?u?d +?d?d?d?u?l?l?u?d +?d?d?u?d?d?u?u?l +?d?u?l?u?l?d?d?d +?d?u?d?l?d?d?u?l +?u?l?d?u?d?d?u?d +?u?d?u?l?l?d?d?d +?d?l?d?u?d?u?d?l +?u?l?d?d?d?l?d?u +?l?d?l?l?d?d?u?d +?d?d?u?u?d?d?u?l +?l?d?d?u?u?d?d?u +?u?d?u?d?d?u?l?d +?l?d?d?u?l?d?d?l +?d?d?u?d?d?u?l?u +?l?u?l?u?d?d?d?d?d +?d?u?d?d?d?u?u?l +?l?u?d?u?u?d?d?d +?l?d?d?d?l?u?d?l +?d?d?u?l?u?d?d?l +?d?u?d?d?l?l?d?u +?d?d?l?d?d?l?u?l +?d?d?l?d?d?u?l?l +?d?d?d?u?l?u?d?u +?l?l?d?l?u?d?d?d +?d?l?d?l?d?d?l?u +?d?d?u?l?d?l?d?u +?d?d?u?l?d?l?d?l +?d?d?l?d?u?l?u?d +?d?l?l?d?u?d?u?d +?d?u?l?u?u?d?d?d +?d?d?l?u?u?d?d?l +?l?u?u?d?d?u?d?d +?d?l?d?d?d?u?l?u +?l?d?l?d?d?u?l?d +?d?u?d?u?d?u?d?l +?l?d?d?l?d?l?d?u +?d?d?l?d?l?l?d?l?d +?l?d?d?u?d?u?d?u +?d?u?l?d?l?l?d?d +?u?d?d?l?d?u?d?l +?l?d?d?u?u?d?u?d +?l?u?u?d?d?d?l?d +?d?l?u?d?d?l?l?d +?l?d?d?d?u?u?l?d +?d?l?l?d?l?d?u?d +?d?u?d?u?d?d?l?u +?l?d?u?d?d?u?d?l +?l?l?d?l?d?u?d?d +?d?u?l?l?d?d?u?d +?d?d?u?d?u?u?d?l +?d?l?d?d?l?l?u?d +?u?l?d?l?d?d?l?d +?d?d?d?u?d?u?u?u +?d?l?u?l?d?d?l?d +?d?d?d?u?d?l?l?l +?l?d?l?d?u?u?d?d +?d?l?u?d?l?d?d?u +?d?l?d?d?l?l?d?u +?l?d?u?d?d?l?d?u +?d?l?d?u?d?l?d?l +?l?l?d?u?d?d?d?u +?d?d?d?u?l?d?u?l +?l?d?d?d?u?u?u?d +?d?d?l?u?d?d?u?l +?u?d?l?d?d?u?d?l +?l?d?d?d?d?u?l?u +?u?d?l?d?d?d?l?u +?u?l?d?l?d?d?d?u +?l?l?l?l?l?l?s?l?l +?l?u?u?u?u?u?d?d?d +?u?l?l?l?l?s?s?d +?u?l?l?l?l?d?s?s +?l?l?s?s?l?l?l?d +?s?s?l?l?l?l?l?d +?u?l?l?s?d?l?l?l +?u?u?u?l?l?l?d?s +?u?l?l?d?s?l?l?l +?s?l?l?l?d?l?l?l +?s?u?u?u?u?u?u?d +?l?l?d?l?l?l?s?l +?u?l?l?l?d?l?l?l?l +?l?l?l?s?l?l?d?d?d +?l?l?l?d?s?d?s?d?d +?l?s?d?s?d?s?d?d +?s?l?s?s?d?d?d?d +?s?l?s?d?d?d?d?s +?d?s?d?s?d?d?s?l +?u?s?s?s?d?d?d?d +?d?d?d?d?s?l?s?s +?l?d?s?s?d?d?s?d +?d?d?d?s?s?s?d?l +?l?s?d?d?d?d?s?s +?s?u?s?s?d?d?d?d +?d?d?s?d?s?d?s?l +?l?l?d?d?l?l?d?l?l +?l?l?l?l?s?s?s?l +?l?l?l?l?l?d?l?d?l +?d?d?s?d?d?d?d?d?d?d?d +?d?s?d?s?d?d?d?d?l +?l?l?l?l?s?l?d?d?d +?l?u?l?l?l?d?l?l +?d?l?l?l?u?u?u?u +?d?l?u?l?l?l?l?l +?d?u?l?u?l?l?l?l +?u?l?l?l?l?d?u?u +?u?l?l?l?l?d?l?u +?u?u?u?l?l?l?l?s +?u?u?u?d?d?d?d?l?l +?l?l?d?d?l?l?d?l?d +?s?u?d?u?d?u?d?s +?u?d?s?u?d?s?u?d +?u?s?l?l?s?d?d?d +?u?l?u?s?s?d?d?d +?l?l?s?d?d?d?s?l +?d?d?s?d?s?u?u?u +?u?l?u?s?d?d?d?s +?s?l?l?s?l?d?d?d +?d?d?d?d?d?d?l?d?l?d +?d?d?d?d?u?l?d?d?d?d +?l?l?l?l?l?l?l?l?d?d?d +?s?d?d?d?d?d?l?l?l +?u?u?u?d?d?d?d?d?s +?l?u?u?u?u?u?s?d +?u?s?l?d?l?l?l?l +?u?u?l?l?l?l?s?d +?s?l?l?l?l?l?d?l +?u?l?l?d?d?s?s?s +?l?s?s?s?l?d?d?d +?u?s?u?s?s?d?d?d +?l?s?l?s?d?s?d?d +?l?l?d?d?d?d?l?l?s +?l?l?d?d?l?l?d?d?s +?s?s?s?s?s?s?s?s +?u?l?l?d?d?l?l?s +?u?s?d?d?l?l?l?l +?u?d?l?l?d?l?l?s +?l?l?d?s?d?l?l?l +?u?d?d?s?l?l?l?l +?l?s?l?d?l?l?l?d +?l?s?l?l?l?d?l?d +?u?l?l?l?u?d?d?s +?l?u?u?u?u?d?d?s +?l?l?d?d?l?s?l?l +?s?l?l?l?l?d?l?d +?d?l?d?l?l?l?l?s +?l?l?d?d?s?d?s?d?d +?l?d?d?d?d?d?d?d?d?d?d?d +?d?d?d?d?d?d?d?s?d?d?d +?s?l?l?l?l?l?l?l?l +?l?l?l?s?l?s?l?l +?u?u?d?d?u?u?u?d?d +?d?d?d?l?l?l?l?d?l +?d?l?d?l?l?l?d?l?d +?u?d?l?l?l?l?d?d?d +?d?l?d?l?l?l?l?l?l +?s?l?l?l?s?u?d +?u?d?l?u?s?l?s +?s?l?s?l?d?l?u +?s?l?d?u?l?l?s +?u?u?u?d?s?u?s +?l?l?s?d?l?s?l +?u?s?l?l?s?l?d +?l?s?d?l?u?s?l +?s?u?l?d?l?u?s +?u?l?s?l?u?s?d +?l?l?d?s?l?s?l +?u?l?l?u?s?d?s +?d?l?u?s?s?u?u +?l?l?l?l?d?s?s?d +?l?l?l?u?d?s?s +?l?l?l?u?s?s?d +?u?u?s?u?s?d?u +?u?s?u?s?u?d?u +?u?s?u?s?u?u?d +?u?l?s?d?s?u?u +?l?s?d?l?s?l?l +?s?l?s?u?l?l?d +?u?s?u?u?s?u?d +?l?s?s?d?l?u?l +?u?l?l?d?s?u?s +?l?u?l?s?l?d?s +?u?s?s?u?d?l?l +?u?s?s?d?l?l?l +?u?u?l?d?l?s?s +?u?s?l?l?s?d?l +?u?l?u?s?u?d?s +?u?l?s?d?s?l?l +?s?l?u?s?d?l?u +?l?s?l?l?d?u?s +?s?s?u?u?u?u?d +?l?u?s?s?d?u?u +?u?d?l?l?s?s?l +?u?s?d?u?l?l?s +?l?s?s?u?l?d?l +?u?s?l?l?d?u?s +?d?u?l?l?l?s?s +?d?s?l?l?l?s?u +?s?l?l?l?s?d?u +?s?l?l?l?s?d?l +?u?u?d?l?u?s?s +?d?s?l?s?l?u?l +?l?s?l?s?l?d?l?d +?d?l?l?s?d?l?l?s +?s?l?l?d?s?l?l +?s?l?d?u?l?u?s +?s?u?d?u?u?u?s +?d?s?s?u?u?u?u +?u?s?u?s?l?d?u +?u?s?d?s?l?l?l +?s?l?l?s?d?u?l +?u?d?l?s?u?l?s +?l?u?d?l?s?l?s +?l?l?s?l?u?s?d +?d?s?u?s?l?l?l +?u?s?s?l?l?l?d?d +?d?u?s?s?l?l?l +?s?s?u?l?u?d?l +?l?u?l?u?d?s?s +?u?u?u?l?d?s?s +?u?u?s?d?l?l?s +?s?u?s?l?l?l?d +?u?u?s?u?s?u?d +?s?l?s?l?d?l?l +?d?u?s?l?s?l?u +?l?l?s?u?s?l?d +?u?s?u?s?d?u?u +?s?u?d?l?l?u?s +?l?l?u?l?s?d?s +?s?l?l?l?d?s?l +?s?l?l?l?d?s?u +?s?l?l?d?u?s?l +?u?d?u?l?s?l?s +?u?s?l?s?d?l?l +?u?l?s?d?l?l?s +?l?l?u?s?u?s?d +?u?l?l?u?s?s?d +?l?l?l?s?d?u?s +?u?s?u?s?l?l?d +?l?l?u?s?d?s?l +?u?l?s?s?d?l?l +?l?s?l?s?u?l?d +?u?s?l?s?l?d?l +?l?d?s?l?s?u?l +?u?d?s?l?s?u?l +?s?s?u?l?d?u?l +?s?d?u?l?s?l?u +?u?d?s?s?u?u?u +?l?l?s?u?l?d?s +?s?u?d?u?u?s?u +?u?s?l?d?l?s?u +?l?s?d?s?u?u?l +?u?l?s?l?s?d?u +?l?s?u?d?l?u?s +?s?l?l?u?d?s?u +?u?l?d?d?l?l?s?s +?u?d?u?s?u?u?s +?l?d?u?u?s?s?l +?s?s?d?u?u?u?u +?u?d?l?s?l?s?l +?u?l?l?d?s?s?l +?s?u?u?l?s?u?d +?s?l?s?l?d?u?u +?s?u?l?l?d?u?s +?s?u?u?u?u?d?d?s +?u?l?s?d?s?u?l +?u?s?s?u?d?u?l +?s?u?d?u?u?l?s +?l?l?l?d?u?s?s +?s?s?d?u?l?l?l +?u?s?s?l?u?u?d +?d?l?l?u?s?u?s +?l?l?l?s?u?s?d +?u?u?s?s?l?u?d +?s?u?u?l?l?s?d +?l?s?u?l?d?l?s +?u?d?l?u?l?s?s +?d?d?s?u?u?u?u?s +?d?s?s?u?l?l?l +?u?s?l?d?s?l?l +?l?l?u?l?s?s?d +?s?s?l?u?l?d?l +?s?u?s?d?u?u?u +?s?l?u?l?l?d?s +?u?l?u?s?d?s?l +?u?l?s?l?s?u?d +?l?s?d?l?s?u?u +?u?s?u?u?d?s?u +?s?s?l?l?l?u?d +?u?d?u?u?s?u?s +?l?l?s?d?s?l?l?l +?u?s?d?l?l?s?u +?l?l?l?u?s?d?s +?s?u?u?d?u?u?s +?s?u?s?u?l?l?d +?u?s?l?u?d?s?l +?u?l?d?s?s?u?l +?l?s?u?d?l?s?l +?d?l?s?l?u?s?l +?u?l?d?l?u?s?s +?u?s?u?d?u?u?s +?d?l?s?l?s?u?l +?u?u?s?u?d?u?s +?u?l?s?l?s?l?d +?s?u?l?s?d?l?l +?s?u?s?l?u?l?d +?u?l?d?s?l?s?u +?u?l?l?d?u?s?s +?s?u?d?u?l?s?l +?d?s?u?u?u?u?s +?u?s?s?d?l?l?u +?s?s?u?l?l?l?d +?l?s?u?d?s?l?u +?s?u?l?s?u?l?d +?s?l?u?s?u?l?d +?l?s?u?s?l?d?l +?u?l?u?u?s?s?d +?d?l?s?u?s?u?l +?l?d?s?l?l?u?s +?l?u?s?u?s?d?u +?u?u?s?d?u?u?s +?s?u?l?d?u?l?s +?u?u?l?l?s?d?s +?l?s?l?l?d?s?l +?s?l?l?l?d?d?l?s +?d?l?s?u?l?s?l +?l?l?l?d?l?d?s?s +?l?s?d?l?l?u?s +?u?s?u?l?d?l?s +?u?d?u?u?u?s?s +?u?d?u?u?s?s?u +?l?l?s?d?l?l?s?d +?s?u?l?l?u?s?d +?s?d?s?u?l?l?l +?l?d?l?s?u?s?u +?l?d?l?l?d?l?s?s +?s?l?s?u?l?d?l +?l?l?d?l?s?s?l +?d?l?l?l?s?s?l +?u?s?d?s?u?u?u +?s?s?u?d?u?u?u +?s?s?l?d?u?u?l +?l?l?l?d?l?l?d?l?l +?u?u?s?l?l?l?l?l +?l?l?d?d?s?s?s?s +?d?l?l?l?l?l?u?u +?u?l?l?u?u?l?l?d +?u?l?u?d?u?l?u?l +?u?l?l?u?l?l?d?l +?l?l?l?l?l?u?d?l +?u?l?l?l?l?u?d?l +?u?l?l?l?l?l?l?l?s +?l?d?s?l?l?d?d?l +?u?l?s?l?d?l?d?d +?l?d?l?s?l?l?d?d +?d?l?l?d?l?d?l?s +?u?d?s?l?l?l?d?d +?l?d?l?l?s?u?d?d +?u?d?d?d?s?l?l?l +?l?l?l?d?d?l?s?d +?u?l?u?l?d?d?s?d +?s?d?d?l?d?l?l?l +?s?d?l?d?l?l?d?l +?l?d?s?l?d?l?d?l +?u?u?d?d?d?u?u?s +?u?d?l?s?l?l?d?d +?u?l?d?l?l?s?d?d +?l?l?d?l?d?s?l?d +?s?u?u?l?l?d?d?d +?d?d?d?s?u?l?l?u +?d?d?s?d?u?u?u?u +?d?d?d?u?s?u?u?u +?u?l?l?u?d?d?d?s +?s?d?d?l?l?l?d?l +?s?d?d?l?l?d?l?l +?l?d?d?s?l?l?l?d +?d?l?l?l?d?d?l?s +?l?l?d?l?s?l?d?d +?l?d?l?d?s?d?l?l +?l?l?d?s?l?d?l?d +?l?l?l?u?s?d?d?d +?u?s?d?u?u?u?d?d +?u?u?s?l?l?d?d?d +?u?d?l?l?d?l?d?s +?l?d?d?l?l?l?d?s +?d?u?s?l?l?l?d?d +?u?l?d?d?d?s?l?l +?u?l?u?l?s?d?d?d?d +?l?s?d?l?d?l?l?d +?u?l?l?d?l?s?d?d +?d?l?l?d?l?l?d?s +?u?u?d?d?d?l?l?s +?l?s?l?d?d?l?d?l +?d?l?l?l?d?l?d?s +?s?l?d?d?l?l?l?d +?l?l?l?d?d?l?d?s +?d?d?l?l?d?l?l?s +?s?l?l?l?d?d?d?l +?d?l?d?l?l?l?s?d +?u?u?d?u?u?s?d?d +?l?d?l?s?l?d?d?l +?d?d?d?s?l?l?l?u +?l?d?s?d?d?l?l?l +?d?l?s?l?l?d?d?l +?u?l?d?d?d?l?l?s +?l?l?d?d?l?s?l?d +?l?l?u?u?s?d?d?d +?d?d?d?u?s?l?l?l +?l?s?l?d?l?d?d?l +?u?u?u?s?d?d?d?u +?l?s?l?l?d?d?d?l +?s?l?l?d?l?d?l?d +?l?d?d?l?l?d?s?l +?l?d?d?l?l?d?l?s +?u?l?l?d?d?d?l?l?l +?d?d?l?l?d?l?l?l?l +?d?d?d?d?d?d?d?l?s?l +?l?l?l?d?d?d?d?d?u +?d?d?d?u?u?u?u?u?d?d +?l?d?d?d?d?l?l?d?l +?s?l?s?s?s?d?s +?u?l?l?l?u?l?l?u +?l?l?l?u?u?l?l?l +?u?u?s?u?u?u?l +?u?u?l?u?u?u?s +?u?l?l?l?s?l?u +?u?s?u?u?u?u?u?d +?l?u?s?l?u?l?u +?l?u?s?l?l?l?u +?l?l?l?s?u?l?u +?u?u?u?s?l?u?u +?l?s?l?u?l?u?l +?u?l?l?u?u?s?u +?l?u?u?u?l?u?s +?l?l?u?s?u?u?u +?l?s?l?l?u?l?u +?l?s?u?l?u?l?u +?l?l?s?l?l?u?u +?l?u?u?u?u?l?s +?u?u?l?l?s?l?l +?l?l?s?u?l?l?u +?s?l?l?u?u?u?l +?u?l?u?u?u?l?s +?u?s?l?u?l?u?l +?l?u?l?l?u?s?l +?l?s?u?l?l?l?u +?u?s?u?u?u?l?l +?l?u?s?l?u?u?u +?l?s?l?u?u?u?u +?l?u?l?l?s?l?l +?l?l?u?l?l?s?u +?u?u?l?l?u?l?s +?u?u?u?l?u?u?s +?s?l?u?l?l?l?u +?u?l?u?u?l?u?s +?u?l?l?l?u?s?l +?l?l?l?s?l?l?d?l +?u?l?u?s?l?l?l +?u?l?s?l?l?u?l +?u?l?u?u?s?l?l +?s?u?u?l?l?u?u +?l?l?s?u?l?u?l +?s?u?u?u?u?l?l +?l?l?l?u?l?s?l +?s?u?l?l?l?u?u +?l?u?l?l?l?s?u +?d?d?l?l?l?l?l?d?d?d +?l?u?u?u?d?d?u?u +?u?l?u?l?l?d?d?l +?u?u?u?d?d?l?u?u +?l?l?u?l?u?l?d?d +?l?u?d?d?l?l?l?l +?u?u?l?l?l?d?d?l +?l?d?l?d?u?u?u?u +?u?l?u?d?d?u?l?l +?u?l?d?u?l?l?l?d +?u?l?d?l?l?u?d?l +?d?d?l?l?l?u?l?l +?u?u?l?u?u?u?d?d +?l?d?l?d?l?l?u?u +?d?d?l?l?l?l?u?l +?u?l?l?u?l?d?d?l +?u?d?d?l?l?l?l?u +?l?d?l?l?u?l?l?d +?u?u?d?l?l?l?d?l +?l?l?l?u?d?l?l?d +?l?l?l?d?d?l?u?l +?u?u?l?d?d?u?l?l +?d?d?l?u?l?u?l?u +?l?d?l?l?l?d?l?u +?l?l?d?d?l?u?l?l +?u?u?u?u?l?u?d?d +?d?u?l?d?l?l?l?l +?u?d?d?l?l?u?u?u +?d?l?u?l?l?l?l?d +?d?l?d?l?l?l?l?u +?l?l?l?d?d?u?u?l +?u?u?l?d?d?l?l?l +?u?l?l?d?d?d?d?l?l +?l?l?u?u?u?d?d?d?d +?l?d?l?l?l?d?d?l?d +?d?d?d?l?d?l?l?l?l +?d?l?l?d?l?l?l?d?d +?l?d?d?l?d?d?l?d?d?d +?l?l?l?l?d?d?d?l?l?l +?d?u?d?d?d?d?d?d?d?d +?u?s?s?l?l?s?s +?l?l?s?s?s?s?l +?l?l?l?l?d?d?d?d?l?l +?d?l?d?l?d?l?l?l?l +?s?s?u?s?u?s?s +?l?d?l?d?d?l?d?d?d?d +?l?d?d?l?d?l?d?d?d?d +?l?d?l?l?l?l?d?d?l +?u?l?l?u?l?u?l?d +?d?l?l?l?l?l?u?l +?l?l?d?u?u?l?l?l +?l?l?u?u?l?l?l?l +?u?u?l?l?l?d?l?l +?l?l?l?d?d?d?d?d?d?d?d?d +?s?l?l?d?l?l?l?l +?u?l?l?l?l?u?s?d +?d?d?d?d?s?u?u?u?u +?l?l?d?l?l?l?s?s +?l?d?l?l?d?d?l?d?l +?l?d?l?d?l?d?d?l?l +?d?d?d?d?u?u?u?u?u?u +?l?d?l?l?l?d?l?d?l +?l?l?d?l?d?l?l?d?l +?d?s?d?d?d?d?d?d?s +?d?s?s?d?d?d?d?d?d +?s?d?d?d?d?s?d?d?d +?d?s?d?d?d?d?s?d?d +?u?u?s?u?s?u?s +?s?s?u?u?u?u?s +?s?u?l?u?l?s?s +?s?u?l?s?u?l?s +?u?u?s?u?u?s?s +?s?s?s?u?u?l?l +?l?s?u?s?l?s?u +?u?u?u?s?s?s?u +?u?s?u?u?u?s?s +?s?s?l?s?l?l?l +?u?l?l?u?s?s?s +?u?u?u?u?u?u?d?d?s +?u?l?l?u?l?l?l?u +?l?s?l?l?l?l?l?s +?l?d?l?d?l?l?l?d?l +?l?s?l?d?l?s?l?d +?l?d?l?s?l?d?l?s +?d?d?s?l?l?s?l?l +?l?l?s?s?d?d?l?l +?u?s?u?s?l?d?l?d +?l?d?l?d?l?l?s?s +?u?u?d?d?d?d?d?d?d?d?d +?d?d?d?d?s?l?l?d?d +?d?d?s?d?d?d?d?l?l +?u?u?d?d?s?d?d?d?d +?l?u?s?d?d?d?d?d?d +?d?d?s?l?l?d?d?d?d +?d?d?d?d?d?l?l?d?s +?d?d?d?l?l?s?d?d?d +?d?d?d?d?d?s?d?l?l +?d?d?l?s?l?d?d?d?d +?l?l?l?d?l?d?l?l?l +?l?l?l?l?l?d?l?l?l?l +?s?l?l?l?l?u?d?d +?u?u?u?s?d?d?l?l +?l?u?u?u?u?s?d?d +?u?l?l?s?d?d?l?l +?s?l?d?l?l?d?l?l +?l?s?l?d?l?l?d?l +?l?l?u?l?l?d?d?s +?s?l?d?d?l?l?l?l +?l?d?l?l?d?s?l?l +?d?l?l?s?d?l?l?l +?l?l?s?l?s?l?l?l +?l?l?s?l?l?l?s?l +?l?l?l?d?l?l?d?l?d +?s?d?s?l?l?l?l?l +?s?l?l?l?l?l?s?d?d +?l?d?d?d?d?d?d?d?d?u +?u?l?l?u?l?u?l?l +?u?u?l?l?l?u?l?l +?u?l?d?d?d?d?l?l?l +?l?d?l?d?d?d?l?l?l +?u?l?u?u?l?d?d?d?d +?u?d?d?d?d?d?d?s?s +?s?d?d?d?l?d?d?d?s +?d?d?d?d?d?s?d?s?l +?u?s?d?l?l?l?l?l +?u?s?d?u?l?l?l?l +?d?d?u?l?l?l?d?d?d +?u?u?d?u?u?d?d?d?d +?l?l?u?u?d?d?d?d?d +?u?d?d?d?d?d?l?l?l +?u?u?d?d?d?d?d?l?l +?d?d?l?l?d?l?d?l?d +?d?l?d?d?l?l?d?d?l +?l?d?l?d?d?d?l?d?l +?s?d?d?d?d?d?d?d?d?l +?l?s?l?d?d?d?d?d?d?d +?d?d?l?l?l?d?l?l?l +?l?l?l?l?l?d?d?d?u +?d?u?u?u?u?l?l?l +?u?u?u?u?u?u?d?l +?l?l?l?d?l?l?u?l +?l?l?l?l?d?d?l?l?l?l +?u?d?l?l?l?l?l?u +?l?l?u?u?u?l?l?d +?u?u?l?l?l?l?u?d +?d?d?l?l?l?s?s?s +?s?l?l?l?l?l?s?s +?u?l?l?l?l?u?l?l?d +?d?d?s?u?d?l?u?d +?u?d?d?d?d?s?l?u +?u?d?d?l?d?d?s?l +?l?l?s?d?d?d?l?d +?d?l?s?d?u?d?l?d +?l?s?d?d?d?d?u?l +?u?l?d?d?d?s?d?l +?s?u?d?d?d?d?l?l +?d?u?u?u?d?d?s?d +?u?d?d?d?d?s?l?l +?s?d?u?l?l?d?d?d +?d?d?d?d?l?l?u?s +?d?l?d?l?l?d?s?d +?d?l?d?l?d?l?s?d +?u?l?d?d?u?d?d?s +?d?l?d?u?d?d?s?u +?d?d?d?l?d?s?l?l +?d?d?d?u?s?d?u?u +?d?d?d?d?s?l?u?l +?l?d?l?s?d?d?l?d +?u?u?s?d?l?d?d?d +?s?l?l?u?d?d?d?d +?d?d?s?d?d?u?l?l +?l?u?l?d?d?s?d?d +?l?d?d?l?d?s?l?d +?d?d?u?l?u?d?d?s +?l?d?s?l?u?d?d?d +?u?d?d?s?l?u?d?d +?u?d?u?d?u?d?d?s +?d?d?u?u?s?d?d?l +?u?l?d?d?s?u?d?d +?d?l?d?d?d?l?l?s +?d?d?d?u?u?u?s?d +?d?d?l?d?l?l?s?d +?l?d?d?u?s?d?d?l +?d?d?d?d?u?u?s?u +?d?d?u?u?l?s?d?d +?l?l?d?d?d?d?s?u +?d?d?s?d?l?l?l?d +?u?d?d?d?s?u?u?d +?u?u?s?d?d?d?u?d +?d?d?d?d?u?u?l?s +?u?d?d?u?d?d?u?s +?s?l?d?d?u?l?d?d +?l?d?s?l?d?l?d?d +?l?d?d?l?d?s?d?u +?l?d?d?l?d?s?d?l +?l?s?d?l?d?d?d?l +?u?d?s?d?l?d?l?d +?d?l?l?d?d?d?s?u +?u?s?d?l?d?l?d?d +?u?l?s?d?l?d?d?d +?u?d?d?l?d?d?l?s +?d?d?u?l?s?u?d?d +?d?l?s?u?d?l?d?d +?u?l?d?d?s?d?d?u +?l?l?d?d?l?d?s?d +?d?d?l?d?l?l?d?s +?d?d?d?u?d?l?l?s +?l?l?s?u?d?d?d?d +?u?d?l?l?d?d?s?d +?d?d?u?d?d?u?s?l +?d?l?l?d?d?s?d?l +?s?d?u?d?u?d?u?d +?d?l?d?u?d?l?s?d +?l?s?u?u?d?d?d?d +?l?l?d?d?s?d?l?d +?l?u?s?l?d?d?d?d +?u?l?u?d?s?d?d?d +?l?d?l?l?s?d?d?d?d +?u?s?u?d?d?d?d?l +?d?d?l?u?l?s?d?d +?l?d?d?l?d?l?s?d +?d?d?l?d?d?l?l?s +?u?s?l?d?d?l?d?d +?u?d?s?l?d?l?d?d +?u?u?s?d?d?l?d?d +?l?d?d?s?l?d?l?d +?d?d?u?s?l?u?d?d +?u?u?d?d?d?d?u?s +?d?l?l?d?d?l?d?s +?d?d?s?l?d?l?d?l +?d?u?l?s?l?d?d?d +?s?l?d?d?d?d?l?l +?d?d?l?l?u?s?d?d +?l?l?s?d?l?d?d?d +?u?d?d?d?d?u?u?s +?u?d?d?d?s?d?l?l +?d?d?u?u?d?u?d?s +?l?l?d?s?l?d?d?d +?d?l?l?d?d?d?u?s +?d?d?l?s?l?d?d?l +?u?d?l?d?d?d?l?s +?u?d?l?d?u?s?d?d +?d?s?d?u?u?d?u?d +?l?d?u?d?d?l?d?s +?l?d?d?d?s?l?d?l +?l?d?d?l?s?l?d?d +?u?u?l?d?d?s?d?d +?d?u?l?u?d?s?d?d +?l?d?s?d?d?l?l?d +?l?l?d?d?d?l?d?s +?s?d?d?u?u?u?d?d +?d?d?s?l?u?l?d?d +?u?d?d?s?u?d?d?u +?l?d?l?l?d?d?s?d +?d?u?l?l?d?d?s?d +?d?l?l?d?l?d?s?d +?u?d?l?d?u?d?d?s +?u?s?l?d?u?d?d?d +?u?d?s?d?d?d?l?l +?l?l?d?s?d?d?d?l +?d?d?d?l?s?l?l?d +?u?d?u?d?u?d?s?d +?u?u?d?u?s?d?d?d +?l?d?d?s?l?d?d?l +?s?u?l?d?d?d?l?d +?d?l?s?l?d?d?l?d +?d?d?d?l?d?l?l?s +?d?d?u?u?l?d?d?s +?s?d?u?d?u?d?d?u +?s?l?d?l?d?d?l?d +?s?d?d?d?l?l?l?d +?l?s?d?d?u?d?d?l +?d?d?l?u?l?d?d?s +?l?d?d?d?s?l?l?d +?d?d?d?s?l?d?l?l +?u?l?d?l?s?d?d?d +?s?d?d?d?d?l?u?l +?u?d?u?u?s?d?d?d +?l?l?u?d?d?d?s?d +?d?l?d?d?l?s?d?l +?d?l?d?l?u?d?s?d +?d?s?d?d?u?l?l?d +?u?d?d?s?u?l?d?d +?d?d?u?u?s?u?d?d +?l?s?d?d?d?l?d?l +?u?d?l?s?l?d?d?d +?s?l?u?l?d?d?d?d +?d?s?d?d?u?u?d?u +?s?d?u?u?d?u?d?d +?l?d?l?s?d?l?d?d +?d?u?l?d?d?s?d?l +?s?d?d?d?l?l?d?l +?u?s?l?d?d?u?d?d +?u?d?u?d?d?d?u?s +?s?u?d?d?u?u?d?d +?l?l?d?d?d?s?d?l +?l?s?d?l?d?l?d?d +?d?d?d?s?u?l?l?d +?u?d?u?d?d?d?l?s +?s?l?d?d?l?d?l?d +?l?d?l?d?d?d?s?l +?u?s?d?d?d?d?l?l +?u?s?d?d?d?d?l?u +?d?d?u?d?d?l?l?s +?d?d?s?u?u?d?d?l +?l?u?u?d?d?d?d?s +?l?d?s?d?d?d?l?l +?s?d?l?l?d?l?d?d +?u?u?d?d?u?d?d?s +?u?d?d?s?d?l?u?d +?d?s?d?d?d?u?l?l +?d?l?d?d?s?l?l?d +?d?l?u?d?l?d?d?s +?s?d?u?u?u?d?d?d +?u?d?d?u?u?s?d?d +?l?d?u?s?d?d?d?u +?l?u?s?u?d?d?d?d +?u?l?d?s?d?d?l?d +?u?u?d?d?d?s?l?d +?u?l?d?d?d?l?d?s +?u?l?d?u?s?d?d?d +?l?s?d?d?l?d?l?d +?l?s?d?d?l?d?d?l +?u?d?l?d?l?d?s?d +?d?d?s?d?d?u?l?u +?d?u?d?u?d?l?d?s +?d?d?l?l?d?d?s?u +?d?s?l?d?d?l?l?d +?u?d?s?u?l?d?d?d +?d?l?d?d?l?d?l?s +?d?s?d?u?l?d?d?u +?s?d?d?l?d?d?l?l +?d?u?d?d?u?u?d?s +?u?d?d?u?l?s?d?d +?d?d?d?s?u?u?u?d +?u?d?l?u?s?d?d?d +?s?d?d?d?d?u?l?u +?s?d?l?d?l?d?d?l +?d?l?s?d?l?l?d?d +?d?d?l?s?d?l?d?l +?d?l?d?u?s?d?d?l +?s?u?d?l?d?l?d?d +?d?l?l?d?l?s?d?d +?u?d?d?s?l?l?d?d +?d?l?l?s?l?d?d?d +?d?u?l?l?s?d?d?d +?u?u?d?u?d?d?d?s +?d?l?d?u?d?l?d?s +?d?l?d?l?d?d?l?s +?u?u?l?d?d?d?s?d +?s?d?l?l?d?d?l?d +?u?u?d?d?d?s?u?d +?d?d?l?l?d?d?u?s +?d?u?u?u?s?d?d?d +?u?s?d?l?l?d?d?d +?u?l?d?l?d?d?d?s +?l?s?l?l?l?l?l?l?l +?l?l?l?d?d?d?u?u?u +?u?u?u?u?u?d?d?d?s +?s?l?l?l?l?s?d?d?d +?d?l?d?d?l?d?d?d?l +?u?d?d?d?u?d?d?d?l +?u?u?d?u?d?d?d?d?d +?d?l?d?d?u?d?d?l?d +?l?d?l?d?l?d?l?d?d?d +?d?l?l?d?d?d?d?l?d +?u?l?d?d?d?d?d?d?u +?d?l?d?d?d?l?d?d?l +?d?d?l?d?d?u?d?d?l +?d?d?u?d?d?u?d?d?l +?u?d?d?d?l?d?d?d?l +?u?d?l?d?d?l?d?d?d +?d?l?d?d?d?l?d?l?d +?d?d?l?l?l?d?d?d?d?l +?d?d?d?d?d?d?l?u?u +?d?d?d?l?d?l?l?d?d +?d?d?u?u?l?d?d?d?d +?u?d?d?l?d?l?d?d?d +?l?d?l?l?l?l?s?s +?l?l?l?d?l?l?l?d?l +?s?l?l?l?l?d?d?d?s +?d?s?d?s?d?s?s?d +?d?d?u?u?u?u?l?d +?d?u?d?d?u?u?l?l +?d?l?d?u?u?l?l?d +?l?d?u?u?l?l?d?d +?u?u?d?l?d?u?d?l +?l?d?l?l?u?d?d?l +?u?d?l?d?l?u?l?d +?d?l?u?d?l?l?d?l +?u?d?d?d?u?l?l?u +?d?u?l?l?l?d?l?d +?l?u?d?d?l?d?l?l +?l?l?d?l?d?u?l?d +?u?u?d?l?u?u?d?d +?u?d?d?u?d?l?u?u +?l?l?l?d?l?d?u?d +?u?u?d?d?u?u?l?d +?d?l?l?d?l?d?l?l?d +?d?l?u?l?d?u?l?d +?l?d?d?l?u?l?l?d +?u?l?d?d?l?l?d?u +?d?u?u?l?d?l?d?l +?d?l?d?l?d?l?l?u +?l?l?d?d?l?d?l?u +?l?l?d?l?d?d?u?u +?d?d?d?u?l?u?u?u +?d?u?d?l?l?l?l?d +?u?l?u?u?d?l?d?d +?d?l?d?l?l?d?l?d?l +?u?d?d?l?l?u?l?d +?u?u?d?l?l?d?d?l +?u?d?d?u?d?u?l?l +?d?l?d?u?l?d?l?l +?l?u?d?d?d?l?u?l +?l?d?d?u?u?l?l?d +?l?u?d?l?d?u?l?d +?u?d?u?d?u?l?d?l +?u?u?u?u?d?d?l?d +?u?d?u?u?d?d?u?l +?l?d?d?l?u?l?d?l +?l?u?l?d?u?l?d?d +?d?l?d?l?l?d?u?u +?d?l?d?u?l?u?d?l +?d?d?u?d?l?l?l?l +?l?d?d?l?l?u?u?d +?l?u?d?d?l?u?l?d +?u?l?l?d?l?u?d?d +?u?l?u?d?d?l?l?d +?u?d?d?d?l?u?u?u +?l?u?l?d?d?d?u?u +?l?l?l?d?d?u?d?l +?l?u?d?l?l?u?d?d +?u?l?d?d?l?u?d?u +?d?d?u?u?l?l?d?l +?l?d?l?l?d?u?u?d +?l?d?u?l?l?d?d?l +?u?d?d?u?d?l?l?u +?u?d?d?d?d?l?l?l?l +?u?l?d?l?l?d?d?u +?u?d?u?l?d?d?u?l +?d?u?l?d?u?l?d?u +?u?l?u?l?d?d?d?l +?l?d?l?l?d?d?l?u +?u?d?l?u?l?u?d?d +?u?u?u?d?d?d?u?l +?l?d?u?l?u?u?d?d +?u?l?l?d?d?d?l?u +?u?d?d?l?d?u?l?l +?u?l?d?d?u?l?d?l +?l?l?u?l?d?d?d?u +?d?l?u?l?d?l?l?d +?u?l?d?d?u?d?u?l +?d?l?l?l?d?l?u?d +?u?d?l?d?d?u?l?u +?u?l?u?l?d?u?d?d +?u?l?d?l?u?d?d?l +?d?l?d?l?u?d?l?l +?d?l?u?u?l?l?d?d +?l?d?l?u?d?l?d?u +?d?d?u?l?u?d?u?u +?l?u?l?d?d?d?l?u +?l?d?d?d?l?u?l?l +?l?u?d?u?l?u?d?d +?u?l?u?l?d?d?l?d +?d?d?d?u?u?l?l?u +?u?d?u?d?d?u?l?l +?u?l?d?l?d?u?d?l +?u?d?l?u?d?l?d?l +?l?d?l?d?u?l?l?d +?l?d?d?u?u?l?d?u +?d?d?u?u?u?l?l?d +?u?l?d?u?d?l?d?l +?d?l?d?l?d?l?u?u +?d?u?d?l?d?l?l?l +?l?d?d?l?l?l?d?l?d +?l?d?d?u?l?l?d?l +?d?l?l?u?d?d?l?l +?l?u?d?d?u?d?u?l +?u?d?l?l?d?u?l?d +?u?l?d?l?u?d?l?d +?d?d?u?u?u?l?u?d +?d?d?d?d?u?u?u?l?l +?u?l?d?d?d?l?u?l +?d?l?d?u?u?u?d?u +?d?u?l?u?l?l?d?d +?u?l?d?d?u?l?d?u +?u?l?u?d?u?d?l?d +?u?d?l?d?d?l?l?l +?l?l?l?d?d?l?u?d +?l?d?d?d?l?u?u?u +?l?d?l?u?l?d?l?d +?d?d?l?l?l?d?l?u +?l?l?u?d?u?d?l?d +?d?d?d?u?u?l?u?l +?l?l?l?d?u?d?l?d +?l?l?d?l?u?d?d?u +?d?l?u?l?d?d?u?u +?u?d?d?u?l?u?l?d +?u?d?l?u?u?l?d?d +?d?u?l?d?d?l?u?u +?u?d?u?l?d?l?d?u +?u?d?l?l?u?d?l?d +?u?d?l?d?l?u?u?d +?u?d?u?u?l?d?d?l +?l?u?l?d?l?u?d?d +?l?d?d?d?l?l?l?l?d +?u?l?u?d?u?l?d?d +?u?l?d?u?u?l?d?d +?l?u?l?u?d?d?l?d +?u?u?l?d?d?l?l?d +?l?l?d?d?l?u?l?d +?d?l?l?l?l?d?u?d +?l?u?l?d?l?d?d?l +?l?u?u?d?d?u?u?d +?u?d?d?l?u?l?l?d +?u?d?d?l?u?d?l?l +?l?d?u?d?l?l?l?d +?u?l?u?d?u?d?u?d +?l?d?u?l?l?l?d?d +?u?d?d?l?l?d?l?u +?u?u?u?d?l?d?l?d +?u?u?d?d?d?l?l?u +?u?d?u?l?l?d?d?l +?u?d?d?l?u?u?d?l +?l?d?l?d?d?l?u?u +?d?l?u?u?d?l?d?l +?u?d?u?l?u?l?d?d +?u?u?l?d?d?d?l?u +?l?l?d?d?d?l?u?u +?u?d?d?l?u?l?u?d +?u?u?l?l?d?l?d?d +?l?u?u?l?d?l?d?d +?d?u?u?u?d?d?l?l +?l?l?l?d?d?l?d?d?l +?u?u?l?u?l?d?d?d +?l?u?d?l?d?u?d?l +?d?d?d?l?l?l?u?l +?l?l?d?u?d?l?l?d +?d?d?u?u?l?l?l?d +?u?l?l?u?d?u?d?d +?l?u?l?d?l?d?l?d +?u?l?d?l?d?l?d?u +?d?l?d?u?d?l?l?u +?d?l?u?u?d?l?l?d +?u?d?l?l?d?d?l?u +?d?u?u?u?l?l?d?d +?l?u?u?u?d?u?d?d +?l?d?d?l?l?l?u?d +?l?d?l?d?l?l?d?u +?l?d?u?u?l?d?d?u +?u?u?d?d?u?l?d?l +?d?d?l?l?d?l?l?u +?l?d?d?u?l?u?l?d +?d?l?l?d?u?l?d?l +?u?d?u?d?l?l?d?u +?u?l?u?d?u?u?d?d +?l?d?l?l?d?u?l?d +?l?d?l?d?l?d?l?u +?d?l?l?d?l?l?d?l?d +?d?l?d?l?l?d?l?u +?d?l?u?d?l?l?l?d +?d?d?l?u?u?d?l?l +?d?l?l?l?u?d?d?l +?l?u?u?l?u?d?d?d +?u?u?d?d?u?d?l?l +?u?u?l?d?d?d?u?u +?l?d?l?l?u?d?l?d +?l?u?d?d?d?u?l?l +?l?u?d?d?d?u?l?u +?d?l?d?l?u?u?d?l +?l?d?u?d?u?d?l?l +?d?d?l?u?u?l?d?l +?d?l?d?d?u?u?l?l +?l?d?d?u?l?u?u?d +?l?l?d?d?l?u?d?u +?d?d?u?d?u?l?l?l +?d?u?l?l?d?d?u?u +?u?l?d?d?u?l?u?d +?d?u?l?d?d?u?u?l +?u?l?d?l?u?l?d?d +?d?u?d?l?l?l?d?u +?d?l?u?l?d?d?l?l +?d?l?l?d?l?l?u?d +?u?l?d?u?d?l?u?d +?l?d?l?d?u?u?d?l +?d?u?l?l?d?u?d?l +?u?u?d?l?d?l?l?d +?l?d?d?d?u?u?u?u +?l?l?l?u?d?l?d?d +?d?u?d?l?d?u?l?l +?u?d?l?d?u?d?u?l +?u?d?l?d?u?d?u?u +?u?l?l?l?d?d?d?d?l +?l?l?u?l?d?d?u?d +?u?d?l?d?l?d?u?l +?d?d?d?u?u?u?l?u +?u?d?d?l?l?l?u?d +?u?d?l?u?u?d?d?l +?d?d?u?l?d?l?l?l +?l?l?l?l?d?l?d?l?l +?d?d?d?d?d?d?d?d?d?d?l?l +?d?d?d?d?s?s?s?d?d +?d?d?s?s?s?d?d?d?d +?u?u?u?u?u?s?u?d +?u?l?l?u?l?l?d?s +?u?s?u?l?l?l?l?d +?l?l?l?l?l?l?l?s?l +?l?l?l?l?l?l?d?d?d?s +?l?l?d?l?d?d?d?d?d?d +?s?l?l?s?s?d?d?d +?u?u?d?d?d?s?s?s +?s?l?s?l?s?d?d?d +?l?l?d?l?d?l?l?l?l +?d?d?d?d?d?d?d?d?d?s?s +?l?l?d?d?d?d?d?s?s +?u?l?l?u?l?l?u?l +?u?l?u?l?u?l?l?l +?l?d?d?d?d?d?d?d?l?d +?d?d?l?d?d?d?l?d?d?d +?u?u?u?u?u?d?u?u?u +?s?l?l?l?d?l?l?s +?u?l?u?l?l?l?l?s +?s?s?s?s?d?d?d?l +?d?d?s?d?d?s?l?l?l +?l?d?d?l?l?l?u?u +?l?u?u?d?u?u?u?u +?l?l?u?d?l?l?u?d +?l?d?u?l?l?d?u?l +?u?l?u?l?u?d?d?l +?l?d?d?l?u?l?l?l +?l?d?l?u?l?l?d?l +?u?l?d?d?l?u?l?u +?d?u?l?l?l?u?l?d +?l?u?l?l?u?u?d?d +?d?u?l?l?l?l?d?u +?u?u?l?l?d?u?d?l +?u?u?l?u?u?d?d?u +?l?u?u?u?l?u?d?d +?u?l?l?l?u?l?d?l +?l?l?d?u?l?l?l?d +?u?l?d?l?u?d?u?l +?l?l?l?u?d?d?u?l +?d?d?u?u?l?l?u?u +?u?d?d?u?l?l?u?l +?u?l?l?l?u?d?d?l +?d?l?u?l?l?d?l?l +?u?d?u?l?u?d?u?l +?u?l?u?d?l?l?l?d +?l?d?u?u?u?u?u?u +?l?u?l?l?l?l?d?l +?l?l?u?u?l?l?l?d +?d?l?l?l?l?d?l?u +?l?u?u?d?d?l?u?u +?u?l?l?l?d?d?l?u +?u?l?l?d?l?u?l?d +?l?l?u?u?d?d?l?l +?l?l?l?u?l?l?u?d +?l?l?l?d?u?l?l?d +?l?d?u?d?l?l?l?l +?u?d?l?l?d?l?l?u +?l?l?u?l?d?l?l?d +?u?l?l?l?u?d?u?d +?u?d?l?d?u?l?l?l +?u?u?u?l?u?u?d?d +?u?l?l?d?d?u?u?l +?l?u?l?d?l?d?l?l +?u?l?d?l?u?l?l?l +?l?d?u?l?l?l?l?d +?u?l?u?u?l?d?d?l +?l?l?l?u?l?u?d?d +?l?l?u?l?u?u?d?d +?l?u?u?u?l?l?d?d +?u?u?u?l?u?u?u?d +?d?l?l?d?s?u?u?s +?l?d?l?d?u?s?u?s +?l?d?l?l?l?d?s?s +?s?s?d?d?u?u?l?l +?s?d?u?l?l?l?s?d +?s?u?s?u?d?l?d?l +?u?l?u?l?s?s?d?d +?l?l?l?l?d?l?l?d?l +?u?u?u?u?l?d?d?d?d +?l?l?d?l?d?d?l?l?d +?d?d?u?l?u?l?u?d?d +?l?d?d?d?d?d?d?l?l?l +?u?u?u?u?d?d?s?d?d +?d?l?l?l?d?d?l?l?l +?l?l?d?l?d?l?d?l?l +?u?u?u?u?s?l?l?l +?u?s?s?u?s?u?d +?u?l?s?l?s?s?d +?s?u?u?u?s?d?s +?l?d?s?l?s?s?l +?l?d?l?s?s?l?s +?s?s?l?s?d?l?l +?l?s?l?s?s?d?l +?u?l?s?s?s?l?d +?s?u?s?s?l?d?l +?u?s?u?d?l?s?s +?d?s?s?s?l?l?l +?u?s?s?d?l?l?s +?s?l?d?l?u?s?s +?u?s?l?l?s?d?s +?u?s?l?d?u?s?s +?s?u?l?l?s?d?s +?s?s?d?u?l?s?l +?u?d?s?u?s?u?s +?l?s?s?d?l?l?s +?l?d?u?s?l?s?s +?u?s?s?d?l?s?l +?u?s?u?s?l?d?s +?s?l?l?d?s?l?s +?u?l?l?s?s?d?s +?s?l?s?l?d?s?l +?s?l?s?l?s?d?u +?s?l?s?l?s?d?l +?l?d?s?s?l?s?l +?u?s?u?d?s?u?s +?u?l?s?s?d?s?l +?l?l?s?l?s?s?d +?l?l?d?s?s?l?s +?s?s?l?s?l?d?l +?u?l?l?s?d?s?s +?d?s?l?s?s?l?l +?u?l?u?d?s?s?s +?s?u?u?u?s?s?d +?s?s?u?d?l?s?l +?l?s?u?s?d?l?s +?l?u?l?s?s?s?d +?s?l?l?s?l?d?s +?u?s?u?s?d?u?s +?l?s?l?l?s?d?s +?s?u?s?s?l?u?d +?l?u?d?s?s?s?l +?l?d?s?l?s?u?s +?d?l?s?l?s?u?s +?s?s?l?l?u?d?s +?l?l?s?l?d?s?s +?d?l?l?s?s?l?s +?u?s?s?l?s?l?d +?l?s?s?l?s?d?l +?s?s?d?u?s?l?l +?d?s?s?l?l?l?s +?s?l?u?s?d?s?l +?s?u?s?d?l?l?s +?l?s?s?l?l?s?d +?l?l?s?d?s?s?l +?d?s?s?s?u?u?u +?s?d?s?l?l?s?l +?s?s?s?u?d?l?u +?s?l?d?s?l?s?l +?l?u?s?s?l?s?d +?u?u?u?d?d?s?s?s +?u?s?u?u?s?s?d +?l?d?u?u?s?s?s +?s?u?s?u?d?s?u +?s?s?d?u?l?l?s +?l?s?s?d?s?u?l +?s?s?l?u?s?l?d +?s?s?s?u?u?u?d +?l?l?s?s?l?s?d +?s?l?d?s?s?l?l +?s?d?s?s?l?u?l +?u?u?u?s?s?s?d +?u?s?d?s?u?s?u +?u?d?s?l?l?s?s +?s?d?s?l?l?s?u +?u?s?u?u?d?s?s +?l?s?s?l?d?s?l +?s?d?u?l?s?s?l +?s?l?s?s?d?u?l +?s?s?u?u?s?d?u +?l?l?s?s?d?l?s +?u?u?s?d?s?l?s +?s?s?u?s?u?l?d +?l?d?l?s?u?s?s +?d?s?u?u?s?u?s +?u?s?d?s?s?u?u +?s?l?l?s?s?d?l +?s?s?u?u?u?s?d +?s?d?l?s?l?l?s +?l?l?l?s?d?d?s?s +?u?s?u?s?s?d?u +?u?d?u?s?s?s?u +?u?s?s?s?l?d?l +?u?l?u?s?d?s?s +?s?l?l?u?s?s?d +?u?s?u?u?s?d?s +?u?s?l?s?d?s?u +?l?s?l?s?s?l?d +?l?d?s?s?s?u?u +?s?l?s?s?l?d?l +?u?d?s?s?u?s?l +?u?d?s?s?s?u?u +?l?s?d?u?s?u?s +?u?u?u?u?u?u?u?s?d +?u?u?l?l?d?d?d?d?d?d +?u?u?l?l?l?l?d?s +?l?d?d?d?d?d?d?d?l?s +?l?l?l?l?l?l?d?d?u +?l?d?l?d?s?s?l?d +?s?l?l?l?d?s?d?d +?d?d?d?l?s?s?l?l +?l?s?d?l?l?s?d?d +?l?d?d?l?d?l?s?s +?s?l?d?l?l?d?d?s +?d?d?d?s?l?l?s?l +?d?d?d?s?s?u?u?u +?d?l?s?l?d?s?l?d +?l?s?l?s?d?l?d?d +?u?s?s?l?l?d?d?d +?s?l?d?d?l?l?d?s +?d?d?d?s?l?s?l?l +?s?l?d?l?d?d?l?s +?l?s?d?d?d?s?l?l +?u?l?l?s?d?s?d?d +?d?d?s?d?s?l?l?l +?s?l?u?l?d?d?d?s +?d?d?d?u?l?l?s?s +?d?d?s?l?l?l?s?d +?l?u?l?s?d?d?d?s +?u?l?s?l?s?d?d?d +?u?l?l?s?d?d?s?d +?u?l?l?d?s?s?d?d +?u?s?l?s?l?d?d?d +?u?s?l?d?l?s?d?d +?l?l?l?l?d?d?l?d?l +?d?l?l?l?l?d?d?d?d?d +?u?l?u?s?s?l?l +?s?l?l?l?s?u?l +?l?l?l?s?s?u?u +?u?s?l?s?l?l?u +?u?s?l?l?s?l?u +?u?l?s?l?s?l?u +?l?l?u?u?u?s?s +?l?s?u?u?u?s?l +?s?l?l?u?l?l?s +?u?s?l?s?u?u?u +?u?l?u?u?l?s?s +?l?l?u?l?s?l?s +?s?l?s?u?u?u?u +?l?l?l?s?u?u?s +?u?l?l?u?s?u?s +?u?s?l?l?u?s?l +?s?l?l?u?s?l?l +?l?s?l?u?l?s?l +?u?s?l?s?u?l?u +?l?s?l?s?u?l?l +?l?s?l?u?s?l?l +?u?s?u?u?l?s?l +?l?l?s?u?u?u?s +?u?u?s?u?u?s?u +?s?s?u?u?u?l?l +?l?l?u?s?l?s?l +?l?l?s?s?l?l?u +?l?l?l?l?l?s?u?s +?u?l?s?u?l?s?l +?l?u?u?l?u?s?s +?u?l?l?s?u?l?s +?u?l?u?s?l?l?s +?l?l?l?s?u?s?l +?l?l?l?s?u?s?u +?u?l?s?s?u?l?l +?l?l?u?s?s?l?l +?s?u?s?u?l?l?l +?s?u?l?s?l?u?l +?u?s?l?u?l?s?u +?s?s?u?u?l?l?l +?l?s?l?s?u?u?u +?u?u?s?s?u?l?u +?l?l?l?u?s?l?s +?l?u?u?u?l?s?s +?u?u?l?u?u?s?s +?u?u?s?l?l?l?s +?s?l?l?l?u?l?s +?u?l?s?l?u?l?s +?u?s?s?u?l?l?l +?s?u?l?s?l?l?l +?s?l?l?l?s?l?u +?u?l?s?u?u?u?s +?d?d?d?d?d?d?d?d?u?d +?d?d?d?u?d?d?d?d?d?d +?u?u?u?u?u?u?u?u?s +?u?u?u?u?u?u?u?u?u?d +?u?l?l?l?u?u?u?u +?u?u?l?l?u?u?l?l +?d?l?d?l?d?d?d?l?l +?d?l?l?d?d?l?d?l?d +?d?l?d?l?l?d?d?l?d +?d?d?d?u?l?l?l?d?d +?u?d?u?d?u?d?u?d?d +?l?l?d?d?d?d?d?u?u +?d?l?d?d?l?d?d?l?l +?d?d?d?d?d?u?u?l?l +?d?d?d?d?u?l?l?l?d +?u?d?l?l?d?l?d?d?d +?l?d?l?d?d?d?l?l?d +?l?d?l?d?l?d?d?d?l +?l?l?d?d?d?d?l?l?d?d +?l?d?d?l?l?d?d?d?l +?l?l?d?d?d?d?l?d?l +?d?d?d?d?d?u?l?u?l +?l?l?d?l?d?d?d?l?d +?l?u?l?l?d?d?d?d?d +?l?l?l?l?s?u?d?d +?u?s?l?l?d?l?l?d +?d?l?d?s?l?l?l?l +?l?l?l?d?s?d?l?l +?l?l?s?l?d?l?d?l +?l?s?l?l?l?d?d?l +?l?l?l?d?d?l?s?l +?l?l?l?s?d?l?l?d +?u?l?d?l?l?d?l?s +?d?u?l?l?l?l?d?s +?l?d?l?s?l?l?d?l +?u?l?l?s?u?l?d?d +?l?d?l?l?l?d?s?l +?d?d?u?s?u?u?u?u +?s?d?l?l?d?l?l?l +?u?d?d?l?l?l?l?s +?s?d?l?d?l?l?l?l +?l?l?d?l?d?l?s?l +?l?l?d?d?l?l?s?l +?l?u?l?l?l?s?d?d +?l?u?l?u?l?s?d?d +?d?s?l?l?l?l?d?l +?u?d?l?d?l?s?l?l +?l?l?l?l?d?s?l?d +?l?d?l?s?l?l?l?d +?d?l?l?s?l?l?l?d +?l?l?l?l?s?d?d?d?s +?d?d?d?d?l?l?s?l?l +?l?l?l?l?l?l?l?l?l?d?d +?s?s?s?l?l?l?l?d +?d?d?l?l?l?l?d?l?l +?d?l?l?l?l?d?l?l?d +?s?s?l?l?l?d?d?d?d +?l?l?d?d?l?d?l?l?d +?d?l?d?l?d?l?l?d?l +?d?d?d?l?l?d?l?l?l +?u?u?u?u?d?d?d?d?u +?u?u?u?d?d?u?u?d?d +?u?l?d?d?u?l?l?d?d +?d?d?d?d?u?u?l?l?l +?s?s?s?s?l?l?s +?u?s?u?s?s?s?s +?u?l?s?s?s?s?s +?u?l?l?l?l?l?l?d?s +?l?l?l?s?l?l?l?l?d +?d?d?s?d?s?d?d?l?l +?s?l?l?d?d?d?d?d?s +?u?u?u?u?l?d?l?l +?u?l?d?l?l?l?l?u +?u?u?u?u?u?d?l?l +?u?u?d?u?l?l?l?l +?u?u?u?l?l?d?l?l +?u?u?l?l?l?u?u?d +?u?l?l?u?d?l?l?l +?u?l?l?l?u?l?d?d?d +?d?d?u?d?d?d?d?d?u +?d?d?d?u?d?d?d?d?l +?d?d?d?u?d?l?d?d?d +?d?d?d?d?d?u?l?d?d +?d?d?d?d?u?d?d?d?l +?d?d?d?d?d?u?d?d?u +?d?d?u?d?d?d?u?d?d +?d?d?d?d?d?d?l?d?u +?d?d?d?d?u?l?d?d?d +?d?d?d?d?l?d?d?u?d +?d?d?d?d?d?d?u?d?l +?d?d?l?d?d?d?d?u?d +?l?d?d?d?d?d?u?d?d +?d?d?d?l?u?d?d?d?d +?d?d?d?u?d?d?u?d?d +?l?d?u?d?d?d?d?d?d +?d?d?d?u?d?d?l?d?d +?d?d?u?d?d?d?d?l?d +?l?l?l?l?s?l?l?l?d +?d?d?d?l?l?l?s?s?s +?u?s?l?l?l?l?d?l +?d?s?u?u?u?u?u?u +?u?u?u?u?s?u?u?d +?u?d?s?l?l?l?l?l +?s?l?l?d?l?l?l?s +?u?u?u?u?u?s?s?d +?d?d?d?d?l?l?l?s?s +?d?d?d?d?u?l?l?l?s +?u?u?u?d?d?u?u?u?u +?l?d?d?l?l?l?l?l?d +?d?d?d?d?s?d?d?d?d?d?d +?u?l?l?d?d?l?l?l?l +?l?l?d?d?d?d?s?s?s +?u?s?l?s?s?l?s +?l?u?l?s?s?s?s +?l?l?s?l?s?s?s +?s?l?l?s?s?l?s +?s?s?s?s?u?l?u +?s?l?l?s?s?s?l +?u?s?u?u?s?s?s +?u?s?l?l?s?s?s +?l?s?s?s?s?l?l +?u?l?l?l?u?u?l?l +?s?s?d?d?d?d?d?s?s +?d?l?d?l?l?d?l?l?d +?d?d?d?d?u?l?u?l?u +?l?d?l?l?d?d?l?l?d +?l?d?d?l?l?d?l?d?l +?s?l?s?l?s?l?d?d +?l?d?d?l?l?l?d?l?l +?l?d?d?l?d?l?l?l?l +?l?l?l?l?d?d?d?d?d?d?d?d +?d?l?d?l?d?l?d?d?d?d +?d?d?s?d?d?s?d?d?l?l +?l?d?s?d?s?d?d?d?d +?d?d?d?d?s?s?l?l?l +?u?l?l?l?l?l?d?d?l +?s?s?u?u?d?d?l?l +?u?s?l?l?l?d?d?s +?u?u?s?d?d?s?u?u +?d?l?s?u?d?l?s?u +?l?l?s?l?s?l?d?d +?l?l?l?l?l?d?d?d?d?l +?u?l?l?l?l?d?l?l?l +?l?d?d?l?l?l?d?d?d?d +?u?u?u?u?u?u?u?u?u?u +?d?d?d?d?d?d?d?d?d?d?d?l +?l?l?l?s?s?s?d?d?d +?s?u?l?l?l?d?d?d?d +?l?l?l?d?l?d?l?d?l +?d?d?s?d?s?d?s?d?d +?s?s?d?d?d?d?d?d?s +?u?u?l?l?l?l?l?u +?l?l?l?l?u?u?l?l +?u?u?l?l?l?l?u?u +?d?d?d?d?d?d?l?d?d?d?d +?d?u?u?u?u?u?u?u?d +?d?d?d?d?d?s?u?u?u +?d?d?s?d?d?d?l?l?l +?d?d?d?l?l?l?s?d?d +?d?d?d?d?l?l?l?s?d +?l?l?s?l?d?d?d?d?d +?l?l?l?d?d?d?l?l?l?l +?d?d?d?d?d?d?d?d?d?u?u +?u?l?u?l?u?l?d?l +?u?l?u?l?l?d?l?l +?u?u?l?l?l?l?d?l +?l?u?u?l?l?l?l?d +?l?l?l?l?l?u?d?u +?u?l?u?l?l?l?u?d +?u?l?l?l?d?u?u?u +?l?s?u?s?l?l?l?l +?s?l?s?l?l?l?l?l +?s?l?l?l?s?l?l?l +?l?l?d?d?l?d?d?d?d?d +?l?l?l?l?l?s?d?d?s +?l?l?d?l?l?l?d?l?d +?u?d?l?l?l?l?l?d?d +?u?s?d?d?s?u?d?d +?u?d?u?d?s?s?d?d +?d?d?s?u?s?u?d?d +?u?s?d?d?d?s?u?d +?l?l?d?d?s?d?s?d +?u?d?d?l?d?d?s?s +?u?d?d?d?d?l?s?s +?s?u?d?d?l?d?d?s +?u?s?d?d?l?s?d?d +?d?d?l?s?l?s?d?d +?d?s?l?d?d?s?l?d +?d?d?s?d?l?s?d?l +?d?d?s?d?d?l?s?l +?u?s?d?d?l?d?d?s +?d?d?d?d?s?u?s?u +?l?d?d?l?s?d?s?d +?l?u?d?s?d?s?d?d +?d?s?d?d?s?d?l?l +?s?u?u?d?d?s?d?d +?u?s?l?d?d?s?d?d +?s?d?s?d?l?l?d?d +?l?d?l?s?d?d?d?s +?u?d?s?s?u?d?d?d +?d?l?d?d?l?d?s?s +?l?l?d?d?d?s?s?d +?s?u?u?d?d?d?s?d +?d?d?d?d?s?s?u?l +?u?l?s?d?s?d?d?d +?u?d?u?s?d?s?d?d +?l?d?s?d?l?s?d?d +?u?l?d?d?s?d?d?s +?u?u?d?d?s?s?d?d +?d?s?d?l?d?s?l?d +?s?d?d?l?u?s?d?d +?d?d?u?d?l?d?s?s +?d?d?s?l?s?l?d?d +?u?d?d?s?d?l?s?d +?l?d?s?d?d?d?u?s +?l?d?s?d?l?d?s?d +?d?d?d?s?l?d?s?l +?s?u?d?l?d?d?d?s +?u?u?d?s?d?s?d?d +?l?d?s?u?s?d?d?d +?d?d?s?s?d?d?u?u +?d?d?d?s?l?l?s?d +?u?d?l?d?d?d?s?s +?s?s?d?d?l?u?d?d +?u?l?d?s?d?d?d?s +?d?l?s?d?s?l?d?d +?d?d?l?d?d?s?l?s +?s?d?l?d?d?d?s?l +?u?d?l?d?s?d?s?d +?u?d?d?d?d?u?s?s +?l?d?l?s?s?d?d?d +?s?d?l?s?l?d?d?d +?u?u?d?d?d?s?s?d +?l?s?d?d?u?s?d?d +?d?d?s?l?d?d?s?l +?u?d?d?s?s?d?d?u +?d?l?l?d?s?s?d?d +?d?d?d?l?l?s?d?s +?l?s?s?d?d?d?l?d +?d?s?d?l?d?d?s?l +?u?l?d?d?d?s?s?d +?d?l?d?l?d?d?s?s +?d?l?s?d?d?s?l?d +?s?d?d?l?d?l?d?s +?l?d?d?d?d?s?l?s +?u?d?s?u?d?s?d?d +?d?l?l?s?s?d?d?d +?d?s?d?d?l?l?s?d +?s?d?d?d?d?u?l?s +?u?d?d?d?l?d?s?s +?s?s?l?u?d?d?d?d +?d?s?d?d?d?s?l?l +?d?d?d?d?l?u?s?s +?d?l?d?s?l?s?d?d +?d?s?l?d?l?s?d?d +?d?l?l?d?d?s?s?d +?d?l?d?s?d?l?s?d +?l?s?l?d?d?d?s?d +?d?d?s?l?d?s?d?l +?d?l?l?s?d?d?d?s +?u?s?u?d?d?s?d?d +?d?d?s?d?d?s?l?u +?d?l?s?s?l?d?d?d +?d?s?l?l?d?s?d?d +?l?d?d?d?d?s?u?s +?l?d?s?l?s?d?d?d +?s?d?d?d?l?l?d?s +?d?d?d?d?s?u?u?s +?s?d?d?s?d?d?u?u +?s?l?d?d?d?l?d?s +?s?l?l?d?s?d?d?d +?d?d?d?l?d?s?s?l +?u?l?d?d?s?s?d?d +?s?d?s?d?d?l?l?d +?l?d?d?s?s?d?d?l +?u?s?l?d?d?d?d?s +?d?s?d?s?l?u?d?d +?d?s?l?l?s?d?d?d +?d?l?d?d?d?u?s?s +?s?s?d?d?d?d?u?l +?l?s?d?d?l?d?d?s +?u?d?d?s?u?s?d?d +?d?d?u?s?l?d?d?s +?s?d?d?u?d?d?u?s +?s?l?d?l?s?d?d?d +?d?l?d?s?d?l?d?s +?s?d?d?d?l?l?s?d +?u?u?d?s?d?d?s?d?d +?l?s?s?d?d?d?d?l +?d?d?s?d?d?s?u?l +?l?s?d?d?d?s?l?d +?l?d?d?s?d?s?d?l +?d?s?d?d?l?s?l?d +?d?d?d?d?s?u?s?l +?d?d?s?d?d?u?s?u +?l?d?s?d?s?d?d?l +?s?u?l?d?s?d?d?d +?d?s?l?l?d?d?d?s +?d?d?s?d?u?u?d?s +?u?s?s?d?l?d?d?d +?s?l?u?d?d?d?d?s +?s?d?d?d?d?s?u?u +?l?d?l?d?s?s?d?d +?d?s?d?l?d?l?s?d +?d?u?u?u?u?u?d?d?d +?l?d?d?d?l?d?l?l?l +?l?l?d?l?l?d?d?l?d +?u?d?l?d?u?d?l?d?u +?d?d?u?u?s?d?d?d?d +?d?d?d?l?d?d?d?l?s +?d?s?d?d?d?d?d?l?l +?l?d?d?l?d?d?s?d?d +?d?l?l?d?d?d?d?d?s +?s?l?d?d?d?d?d?d?l +?d?d?d?u?u?d?d?d?s +?l?d?d?d?s?l?d?d?d +?u?u?d?d?d?d?s?d?d +?s?u?l?d?d?d?d?d?d +?d?l?l?d?s?d?d?d?d +?l?s?d?d?d?d?d?d?l +?l?d?d?d?d?d?l?d?s +?d?d?d?s?l?l?d?d?d +?u?l?l?d?d?d?d?d?d?d?d +?u?l?l?u?u?l?l?u +?u?l?l?l?u?l?u?l +?s?d?d?d?d?d?d?d?d?d?s +?l?l?l?l?d?l?d?d?d?d +?d?d?d?d?l?l?l?l?l?d +?l?d?d?l?l?d?l?l?l +?l?l?l?s?d?d?d?u +?u?l?d?d?d?u?l?s +?u?d?d?d?u?l?l?s +?l?l?s?d?d?l?l?d +?d?l?l?s?l?d?l?d +?d?l?d?l?s?l?d?l +?u?d?u?u?d?u?s?d +?d?s?l?l?d?d?l?l +?d?l?l?s?l?l?d?d +?l?u?l?d?d?d?s?l +?l?l?l?d?s?l?d?d +?l?d?l?s?d?l?l?d +?s?u?u?l?d?l?d?d +?d?s?d?l?d?l?l?l +?u?l?d?d?l?l?d?s +?d?u?l?l?l?s?d?d +?u?u?u?d?d?d?s?l +?d?d?u?l?d?l?s?l +?u?d?d?l?l?l?s?d +?l?l?d?d?d?u?u?s +?u?u?l?l?d?d?s?d +?l?l?u?l?d?d?d?s +?u?s?d?d?d?l?l?l +?l?s?u?u?u?d?d?d +?l?l?s?d?d?l?d?l +?d?u?l?l?l?d?s?d +?l?d?l?d?d?l?s?l +?d?l?d?s?l?d?l?l +?u?l?l?d?d?d?l?s +?u?d?l?s?u?d?l?d +?d?l?l?d?s?d?l?l +?l?d?d?s?l?d?l?l +?l?d?l?l?l?d?s?d +?l?l?d?l?s?d?l?d +?d?u?u?u?u?s?d?d +?l?l?d?l?l?d?s?d +?l?l?l?s?u?d?d?d +?d?l?d?l?d?l?l?s +?l?s?d?l?l?d?d?l +?d?d?u?l?l?l?d?s +?d?d?s?l?l?l?l?d +?l?d?d?l?s?l?d?l +?u?l?u?d?d?d?s?u +?d?l?l?d?d?l?s?l +?u?l?s?u?l?d?d?d +?d?d?u?s?l?l?d?l +?u?l?s?u?u?d?d?d +?d?l?l?d?l?l?s?d +?u?l?u?l?d?d?d?d?s +?l?l?d?l?d?l?s?d +?u?d?d?u?d?u?u?s +?u?l?d?d?l?l?s?d +?u?l?l?d?d?d?s?l +?l?u?l?l?d?d?d?s +?u?l?d?d?d?s?l?u +?l?l?l?d?l?d?s?d +?d?l?l?l?s?d?l?d +?l?l?l?d?d?s?d?l +?u?u?u?s?d?d?d?l +?d?d?u?l?s?d?l?l +?u?u?s?u?u?d?d?d?d +?d?d?d?u?u?s?u?u +?u?l?d?d?s?l?l?d +?d?s?d?d?u?u?u?u +?d?l?s?d?d?l?l?l +?u?l?d?d?l?d?l?s +?l?d?d?s?d?l?l?l +?l?l?l?d?u?s?d?d +?s?d?l?l?d?l?d?l +?l?d?d?l?l?s?l?d +?u?u?l?l?d?s?d?d +?u?u?u?s?l?d?d?d +?u?u?d?d?d?s?l?l +?l?d?s?d?l?l?d?l +?d?l?d?l?l?l?d?s +?u?l?d?d?s?u?l?d +?u?d?d?l?d?l?l?s +?d?l?d?d?l?l?l?s +?s?u?d?l?d?l?d?l +?l?d?s?l?d?l?l?d +?u?u?d?s?u?u?d?d +?l?l?l?d?s?d?d?l +?s?l?l?l?d?d?l?d +?l?d?d?d?l?s?l?l +?s?l?u?u?u?d?d?d +?s?l?d?d?d?l?l?l +?l?d?d?d?l?l?s?l +?l?l?l?s?d?l?d?d +?s?d?u?l?l?l?d?d +?d?l?l?d?s?l?l?d +?u?u?l?l?l?l?l?s +?u?l?l?l?l?s?u?l +?l?l?l?l?s?s?l?d +?l?l?s?l?l?s?l?d +?d?d?l?d?l?l?d?d?l +?d?d?d?l?d?d?l?l?l +?u?u?u?d?u?d?d?d?d +?d?l?l?l?d?d?d?d?l +?d?d?l?l?l?d?d?l?d +?d?d?d?l?d?l?l?d?l +?u?u?d?d?d?u?u?d?d +?l?d?d?d?d?l?d?l?l +?d?l?l?d?d?d?d?l?l +?u?u?d?d?u?u?d?d?d +?l?d?d?d?l?d?l?d?l +?d?l?d?l?d?d?l?l?d +?d?d?d?d?d?l?l?l?u +?d?d?l?d?d?l?d?l?l +?l?u?u?u?d?d?d?d?d +?d?l?l?d?l?d?d?l?d +?u?s?u?s?u?u?u?u +?l?u?l?l?l?d?l?d +?u?d?l?d?l?u?l?l +?u?d?u?l?d?l?l?l +?d?l?l?u?u?u?u?d +?l?l?d?l?l?l?d?u +?d?l?l?d?u?l?u?l +?l?l?d?l?d?l?l?l?d +?d?d?u?u?l?l?l?u +?u?d?l?u?l?l?d?l +?u?d?d?l?l?u?l?u +?u?d?d?l?l?u?l?l +?d?d?u?u?u?u?u?l +?d?l?l?d?u?l?l?l +?u?l?l?d?l?l?u?d +?l?u?l?u?u?l?d?d +?u?u?l?l?l?d?d?u +?l?l?u?d?d?u?u?u +?d?u?u?d?u?l?l?l +?u?d?l?l?l?d?l?u +?u?d?u?l?l?l?d?l +?u?d?l?u?l?l?l?d +?u?u?u?l?d?d?l?l +?l?l?d?l?d?l?l?u +?l?d?l?u?u?u?u?d +?l?d?l?l?d?l?l?u +?l?l?l?l?d?u?l?d +?u?d?u?d?l?l?u?l +?u?l?l?d?u?l?d?u +?d?l?l?l?d?l?u?u +?d?u?l?u?u?l?u?d +?l?l?l?d?d?l?u?u +?u?l?l?d?l?l?d?u +?d?l?l?u?l?d?l?l +?d?d?u?u?u?u?l?l +?d?d?u?l?l?l?u?u +?s?d?d?l?l?l?l?l?l +?u?l?u?l?d?d?l?l +?u?d?l?u?l?u?l?d +?u?l?d?u?l?d?l?l +?l?l?l?l?d?u?u?d +?l?d?l?d?u?l?l?l +?u?d?l?l?d?u?l?l +?u?d?l?l?u?l?l?d +?d?u?l?u?l?l?l?d +?u?l?d?l?d?u?u?u +?u?u?d?l?l?d?l?l +?u?u?l?l?d?l?d?l +?l?u?u?u?u?d?d?l +?l?l?u?d?l?l?l?d +?u?l?l?d?d?u?l?u +?u?l?l?l?d?u?d?l +?l?u?u?d?d?u?u?u +?l?l?d?l?l?d?l?u +?l?d?u?l?l?l?d?l +?d?l?l?l?u?l?l?d +?d?l?u?l?d?l?l?l +?l?l?d?u?d?l?l?l +?l?l?l?u?l?d?l?d +?u?u?l?u?l?u?d?d +?l?l?u?d?l?d?l?l +?l?u?u?d?d?u?l?l +?d?l?l?u?l?l?u?d +?l?l?l?l?d?l?d?u +?l?d?l?d?l?u?u?u +?l?d?l?l?l?d?u?u +?u?u?l?d?u?u?l?d +?d?u?l?d?u?l?l?l +?u?d?l?d?u?u?l?l +?l?l?d?l?l?d?u?l +?l?d?l?l?l?l?u?d +?u?u?l?l?l?d?l?d +?d?d?u?l?l?l?d?d?d?d +?l?d?l?l?d?l?d?d?d?d +?d?s?d?s?d?s?s?s +?l?l?d?s?l?d?l?l +?u?l?u?l?l?d?d?s +?u?s?l?l?d?l?l?l +?d?u?l?l?l?d?l?s +?l?d?l?s?d?l?l?l +?l?l?s?l?d?l?l?d +?u?u?d?d?l?l?l?s +?u?u?d?d?u?u?u?s +?l?l?l?d?l?s?l?d +?u?d?u?d?u?s?u?u +?l?d?d?l?l?l?s?l +?u?l?l?u?l?s?d?d +?u?d?l?l?l?l?s?d +?u?u?u?u?s?d?u?d +?l?s?d?l?d?l?l?l +?u?s?d?u?u?u?u?u +?u?l?l?l?s?d?d?l +?s?d?l?l?l?l?d?l +?l?l?d?s?l?l?d?l +?u?l?d?l?l?l?d?s +?u?s?l?l?l?d?d?l +?l?l?s?l?d?d?l?l +?d?l?l?d?s?l?l?l +?d?d?l?l?l?l?l?d?d?d?d +?s?l?l?l?d?d?s?s +?d?d?l?s?l?s?l?s +?d?d?d?l?l?l?d?l?l +?u?l?d?d?l?l?l?d?d +?u?d?u?u?u?u?d?d?d +?d?d?d?d?l?l?l?l?u +?l?l?d?d?l?l?l?d?l +?l?d?l?d?d?l?d?l?l +?d?l?l?d?l?d?l?d?l +?l?l?l?d?d?d?l?d?l +?d?d?s?l?l?l?l?d?d +?d?d?l?l?d?d?l?l?s +?u?l?l?l?d?d?l?l?l +?u?u?u?d?d?d?d?s?s +?s?d?s?l?s?l?s +?u?s?s?l?s?d?s +?s?s?l?s?d?l?s +?s?l?d?l?s?s?s +?u?s?u?s?s?s?d +?l?d?s?s?s?l?s +?s?l?s?d?l?s?s +?s?s?u?u?s?s?d +?d?l?s?s?s?l?s +?u?u?s?d?s?s?s +?s?s?s?l?d?l?s +?s?s?s?l?l?s?d +?s?s?d?l?l?s?s +?l?s?s?s?d?l?s +?u?s?u?s?d?s?s +?s?l?l?s?s?d?s +?u?s?u?s?s?d?s +?s?s?l?s?l?d?s +?s?s?u?l?d?s?s +?s?s?l?l?s?d?s +?s?l?s?s?u?s?d +?l?s?d?s?s?l?s +?l?s?d?s?l?s?s +?l?s?s?l?s?d?s +?s?s?d?u?s?u?s +?d?s?l?u?s?s?s +?u?s?s?u?d?s?s +?s?u?s?s?u?s?d +?s?s?d?l?s?s?l +?d?s?s?s?s?u?u +?u?d?s?u?s?s?s +?s?l?l?d?s?s?s +?s?l?l?s?d?s?s +?u?s?s?s?s?u?d +?s?s?l?d?u?s?s +?s?s?s?l?l?d?s +?d?s?s?l?u?s?s +?d?s?s?s?l?l?s +?s?s?s?s?u?u?d +?u?s?s?s?l?s?d +?s?d?u?u?s?s?s +?u?d?s?s?s?l?s +?d?s?s?l?l?s?s +?u?s?s?s?u?s?d +?u?u?d?d?d?d?d?d?u?u +?u?u?l?l?u?l?l?d +?u?u?u?l?l?l?u?d +?u?u?l?u?l?u?u +?l?u?u?u?u?u?u?s +?u?l?u?l?d?u?l?u +?l?u?u?u?d?u?u?u +?u?u?l?d?l?l?l?l +?l?u?l?l?u?u?u +?u?l?u?l?d?l?u?l +?l?l?d?u?u?u?u?u +?l?l?l?u?u?l?l?d +?l?l?u?l?u?u?u +?l?l?u?u?d?l?l?l +?u?l?u?u?l?l?l?d +?l?l?l?l?l?u?u?d?d +?d?l?l?l?l?l?l?l?s +?l?l?l?u?l?l?l?u +?u?l?l?l?l?s?d?s +?l?s?s?l?l?l?l?d +?l?l?l?l?s?d?s?l +?s?s?s?d?d?d?u?l +?l?s?l?s?d?d?d?s +?l?u?d?d?d?s?s?s +?l?d?d?l?d?s?s?s +?d?d?d?s?s?l?l?s +?s?l?l?s?d?d?d?s +?u?u?u?u?d?d?u?u?u +?d?u?l?l?l?l?l?d?d +?d?u?u?u?u?u?u?d?d +?l?d?l?l?l?l?d?d?d?d +?d?d?d?u?u?u?u?d?d?d +?s?s?s?d?d?d?d?d?d?d +?s?d?d?d?l?l?l?l?l +?d?d?d?d?d?s?s?l?l +?d?l?l?d?l?l?l?l?l +?s?u?u?s?l?l?s +?u?s?s?u?s?u?u +?l?l?l?s?s?u?s +?u?s?u?s?l?s?l +?s?s?l?l?l?s?l +?l?s?s?l?s?l?u +?u?s?u?u?s?s?u +?u?s?l?s?l?s?u +?u?s?s?u?u?s?u +?s?l?u?l?u?s?s +?s?s?u?u?l?l?s +?l?s?s?s?l?l?u +?u?l?s?s?l?s?l +?s?l?s?l?s?l?u +?u?s?s?s?l?l?u +?s?l?s?l?s?u?u +?u?s?s?l?s?l?l +?l?s?u?s?l?s?l +?l?l?u?l?s?s?s +?u?s?s?u?s?l?u +?l?s?u?s?l?l?s +?s?u?l?s?l?u?s +?u?u?s?u?s?s?u +?u?s?l?u?s?l?s +?s?u?l?l?u?s?s +?u?l?d?d?d?d?d?d?d?d?d +?d?d?d?d?s?d?l?l?l +?u?u?u?d?d?d?d?s?d +?u?s?l?l?d?d?d?d?d +?d?d?d?l?l?l?d?d?s +?l?l?d?l?s?d?d?d?d +?l?l?l?s?l?d?d?s +?u?s?l?l?s?l?d?d +?u?l?u?l?s?d?s?d +?d?d?u?l?l?l?s?s +?u?l?l?s?l?s?d?d +?l?s?l?l?d?d?s?l +?u?u?u?s?u?s?d?d +?l?s?l?s?l?d?d?l +?u?s?u?u?u?s?d?d +?s?s?u?u?u?u?d?d +?s?l?d?l?l?l?d?s +?s?s?u?l?l?l?d?d +?l?l?l?s?d?d?s?l +?l?l?l?l?l?l?s?s?s +?d?d?d?d?u?l?l?l?l?l +?d?u?l?l?l?l?l?l?d +?d?d?d?d?u?u?u?d?d?d +?s?s?s?s?u?s?s +?d?d?d?l?d?d?l?d?d?d +?d?d?d?d?d?d?u?u?d?d +?d?d?d?d?d?d?l?d?d?l +?d?l?d?d?d?l?d?d?d?d +?u?l?l?u?l?l?l?l?d +?s?s?s?s?l?l?l?l +?u?l?l?l?d?l?d?d?d +?d?l?l?d?d?l?l?l?d +?u?d?l?l?d?l?l?d?d +?l?l?u?u?l?d?d?d?d +?u?u?d?d?l?l?l?d?d +?l?l?l?u?l?d?d?d?d +?l?d?l?d?d?l?l?d?l +?l?l?d?l?d?d?l?d?l +?l?l?d?l?d?l?d?d?l +?d?d?d?d?u?l?l?l?u +?l?d?d?l?d?l?l?d?l +?l?d?l?l?d?d?d?l?l +?l?l?l?d?d?l?d?l?d +?l?l?d?d?l?d?l?d?l +?u?l?l?l?s?d?l?l +?u?l?l?l?u?l?s?d +?u?u?u?d?u?u?u?s +?u?d?l?s?l?l?l?l +?d?u?u?u?u?u?u?s +?u?u?u?s?d?u?u?u +?d?d?d?d?d?d?d?d?d?d?d?d?d?d +?d?s?d?l?d?d?d?d?d +?d?d?d?u?s?d?d?d?d +?d?d?d?s?d?d?l?d?d +?d?d?u?d?d?d?d?d?s +?d?l?d?d?d?d?s?d?d +?d?d?d?d?d?d?d?d?u?s +?d?d?d?d?s?l?d?d?d +?s?d?d?d?l?d?d?d?d +?d?d?d?s?u?d?d?d?d +?d?s?d?d?d?u?d?d?d +?d?s?d?d?d?d?l?d?d +?d?d?d?d?l?d?d?d?s +?d?s?l?d?d?d?d?d?d +?s?l?d?d?d?d?d?d?d?d +?s?d?d?l?d?d?d?d?d +?d?d?d?d?s?u?d?d?d +?d?d?s?d?d?l?d?d?d +?s?d?l?d?d?d?d?d?d +?d?d?l?s?d?d?d?d?d +?d?d?d?d?s?d?d?l?d +?d?d?d?d?d?l?d?d?s +?u?d?d?d?d?s?d?d?d +?d?d?d?s?d?d?d?l?d +?d?d?u?d?d?s?d?d?d +?l?l?d?l?l?l?d?d?l +?d?l?d?d?l?l?l?l?l +?s?s?s?d?d?s?s?s +?d?d?d?l?l?d?d?d?l?l +?s?s?d?l?l?l?l?l +?s?l?d?l?l?l?l?s +?d?s?l?l?l?l?l?s +?l?s?l?l?l?s?l?d +?l?s?l?s?l?s?d?d?d +?d?d?l?d?d?d?d?d?d?d?d +?s?d?d?l?l?l?d?d?s +?l?l?l?l?d?d?d?d?d?s +?l?l?l?l?l?d?d?s?d?d +?u?d?l?l?l?l?l?l?l +?d?l?d?l?d?d?d?l?d +?d?d?d?l?d?d?l?d?l +?l?d?d?d?l?d?d?d?d?l +?u?d?d?u?d?d?d?d?u +?u?d?d?d?d?d?d?l?u +?u?u?d?d?l?d?d?d?d +?l?d?d?l?d?d?u?d?d +?l?d?d?l?l?d?d?d?d?d +?d?d?u?d?u?d?u?d?d +?u?u?d?d?d?d?l?d?d +?u?d?d?d?u?u?d?d?d +?d?d?d?l?l?d?d?l?d +?u?d?d?d?u?d?u?d?d +?u?d?d?u?d?d?d?u?d +?d?d?d?d?d?u?u?u?d +?d?d?d?d?l?l?d?l?d +?d?d?u?u?d?d?u?d?d +?u?l?d?l?d?d?d?d?d +?u?d?u?d?d?d?d?d?u +?d?l?d?d?d?d?d?l?l +?u?d?d?l?u?d?d?d?d +?u?d?u?d?d?u?d?d?d +?d?d?l?d?d?l?d?d?u +?d?d?u?d?d?l?u?d?d +?u?u?d?d?d?d?d?l?d +?d?d?d?u?d?u?u?d?d +?d?u?d?d?u?u?d?d?d +?u?d?d?l?d?d?d?d?u +?u?d?d?u?d?u?d?d?d +?u?d?l?d?d?d?l?d?d +?d?d?l?u?u?d?d?d?d +?l?l?l?d?l?l?d?d?d?d +?s?s?s?s?s?u?u +?u?u?s?s?s?s?s +?l?s?s?s?l?s?s +?l?l?l?d?l?d?l?l?d +?l?l?l?l?d?l?d?d?l +?l?d?l?l?l?d?d?l?l +?u?u?u?u?d?d?d?u?u +?l?l?d?l?l?l?d?d?d?d +?d?d?d?d?l?s?l?l?l +?l?l?l?d?d?d?d?s?l +?u?l?u?u?u?u?u?d +?l?l?l?u?u?d?l?l +?u?u?l?l?d?l?l?l +?d?l?u?u?u?u?u?u +?l?u?l?u?l?l?l?d +?l?l?l?l?d?u?l?u +?u?l?l?l?l?d?d?l?l +?l?l?l?l?d?u?u?l +?u?l?l?u?l?d?l?l +?u?l?l?l?u?l?u?d +?l?l?d?l?l?u?u?u +?u?u?u?u?u?u?d?d?u +?d?l?l?u?u?u?u?u +?u?u?u?l?l?l?d?l +?d?d?u?u?u?u?d?d?d?d +?d?d?d?d?d?d?d?d?d?l?d +?d?d?d?d?d?d?d?d?l?d?d +?d?s?d?s?d?d?s?d?d +?d?d?s?d?s?d?d?s?d +?d?d?s?s?d?d?s?d?d +?s?d?d?d?d?s?d?d?s +?d?d?s?s?s?l?l?l +?s?s?l?l?l?s?d?d +?u?u?l?l?u?l?l?l +?l?u?l?l?l?l?u?l +?u?u?u?u?l?l?d?d?d +?l?d?l?d?d?l?l?l?l +?l?l?d?l?l?d?l?d?l +?s?u?l?u?l?u?l?s +?d?s?d?s?d?d?l?l?l +?l?d?l?l?d?d?d?d?l +?l?l?d?d?d?l?d?l?d +?d?d?d?l?l?l?d?l?d +?d?d?d?u?u?u?u?u?d +?u?l?u?u?d?d?d?d?d +?u?u?d?l?l?d?d?d?d +?d?d?l?l?d?d?l?d?l +?u?l?l?u?d?d?d?d?d?d +?u?l?d?d?u?l?d?d?d +?d?d?d?d?d?l?l?u?u +?u?d?d?l?l?l?l?d?d +?u?u?u?d?d?l?l?d?d +?u?l?d?u?l?d?d?d?d +?u?l?d?d?l?l?d?d?d +?l?d?l?d?d?l?l?l?d +?u?u?u?d?d?d?d?d?l +?u?u?u?d?d?d?d?d?u +?d?d?l?d?l?d?l?l?d +?u?u?u?d?d?u?d?d?d +?d?l?d?d?d?l?d?l?l +?l?d?d?l?d?l?d?l?l +?d?d?d?d?u?u?d?u?u +?u?l?l?u?l?l?d?d?d?d +?d?l?d?d?l?d?l?l?d +?d?d?l?d?l?d?d?l?l +?d?l?l?l?d?l?l?d?d +?u?d?l?d?l?l?d?d?d +?u?d?d?l?l?l?d?d?d +?l?l?l?l?u?u?u?s +?u?u?u?u?l?l?l?s +?l?l?l?l?l?s?u?u +?d?d?d?d?d?d?d?d?u?u?u +?l?l?d?d?d?d?l?l?l?l +?l?l?d?d?s?d?d?s?d?d +?l?l?s?d?d?s?d?d?d +?s?s?s?s?s?s?d?d +?l?s?l?s?l?l?d?l +?s?u?l?l?l?l?d?s +?u?s?l?l?l?l?s?d +?l?l?l?l?d?l?s?s +?u?l?l?l?l?u?d?s +?u?u?s?d?l?l?l?l +?u?l?l?l?l?s?u?d +?s?d?d?d?d?l?s?s +?d?l?d?d?s?s?s?d +?s?s?u?s?d?d?d?d +?s?s?l?s?d?d?d?d +?d?u?s?s?s?d?d?d +?s?l?d?d?d?d?s?s +?s?d?d?s?s?d?d?l +?s?d?d?l?d?s?s?d +?l?s?d?s?d?d?d?s +?u?d?d?s?s?s?d?d +?u?d?s?d?s?d?d?s +?d?d?u?d?d?s?s?s +?l?d?s?d?s?d?d?s +?s?d?s?l?s?d?d?d +?d?s?d?s?d?s?d?u +?d?s?d?d?d?s?l?s +?s?u?d?d?d?s?s?d +?d?l?d?s?d?s?d?s +?u?d?d?d?d?s?s?s +?d?s?d?s?l?s?d?d +?s?l?s?d?d?s?d?d +?s?d?d?d?d?s?s?l +?s?l?d?d?s?d?d?s +?l?d?d?s?s?d?d?s +?d?d?d?d?u?s?s?s +?s?l?s?d?d?d?s?d +?l?s?d?d?s?d?s?d +?s?l?d?d?s?d?s?d +?l?d?d?s?d?s?d?s +?l?d?d?s?s?s?d?d +?l?s?s?d?d?d?d?s +?d?d?s?d?d?s?l?s +?s?s?s?d?d?l?d?d +?d?d?l?s?s?s?d?d +?l?l?l?s?l?l?s?l +?u?l?l?d?d?d?u?l?l +?u?u?u?u?s?u?u?u?u +?d?d?d?d?d?d?s?u?s +?d?d?d?d?s?d?d?s?l +?u?s?d?d?d?d?d?d?s +?d?d?s?l?s?d?d?d?d +?d?d?d?d?d?d?s?s?u +?l?d?d?d?d?s?s?d?d +?d?d?s?d?d?d?d?s?l +?s?d?d?d?d?d?d?s?u +?l?s?d?d?d?d?s?d?d +?l?u?u?u?u?u?u?l +?l?l?u?l?l?l?u?l +?l?l?l?l?l?l?l?d?d?s +?l?l?l?d?d?l?d?d?d?d +?l?d?d?d?d?d?d?d?s?d +?l?l?l?l?u?u?u?d?d +?u?l?l?l?l?l?d?l?d +?l?l?l?d?s?s?d?d +?l?d?s?l?l?s?d?d +?l?s?l?l?s?d?d?d?d +?u?l?d?d?l?s?s?d +?d?s?u?u?u?s?d?d +?u?s?l?s?u?d?d?d +?d?u?s?d?u?s?d?u +?s?l?d?d?d?l?l?s +?l?l?s?s?l?d?d?d?d +?u?s?l?u?s?d?d?d +?d?d?d?s?u?u?u?s +?u?d?l?s?l?s?d?d +?u?d?l?l?d?d?s?s +?l?u?u?s?s?d?d?d +?s?l?l?d?d?d?l?s +?u?l?l?d?s?d?s?d +?s?s?d?l?l?l?d?d +?u?l?u?d?d?d?s?s +?l?s?s?d?d?d?l?l +?u?s?d?d?d?s?l?l +?l?l?d?l?d?d?s?s +?l?l?d?l?d?s?s?d +?l?l?s?l?d?s?d?d +?s?d?l?l?l?d?d?s +?s?l?l?l?d?d?s?d +?s?l?l?d?d?l?d?s +?s?l?d?d?l?d?l?s +?s?l?l?d?l?d?d?s +?u?d?l?d?l?d?s?s +?l?d?s?d?l?s?l?d +?l?d?s?s?l?l?d?d +?l?l?l?d?s?d?d?s +?l?d?l?s?l?s?d?d +?s?l?d?l?l?s?d?d +?l?d?d?d?l?l?s?s +?d?d?d?d?d?l?d?d?d?d?d +?u?l?l?l?l?l?l?l?l?d +?l?d?l?l?d?d?l?l?l +?d?d?l?d?l?l?l?l?l +?d?d?d?u?u?u?l?l?l +?d?l?d?l?d?d?d?d?d?d +?d?d?d?d?d?l?d?l?d?d +?d?d?d?u?u?d?d?d?d?d +?l?l?l?d?d?d?d?d?l?l +?d?l?l?l?d?d?d?d?s +?s?l?l?d?l?d?d?d?d +?l?s?l?d?l?d?d?d?d +?l?l?d?d?d?s?d?d?d?d +?d?d?d?s?d?d?d?d?l?l +?l?s?s?s?l?l?l?l +?d?d?d?s?s?s?s?s +?u?s?l?u?l?l?d?d +?u?l?l?l?s?d?l?d +?u?u?u?u?s?d?d?u +?d?l?l?s?l?d?l?l +?l?d?l?l?l?s?l?d +?l?l?l?d?s?l?d?l +?l?u?l?l?l?d?d?s +?u?u?s?d?d?l?l?l +?u?s?d?l?l?l?l?d +?d?l?l?l?s?l?d?l +?d?l?d?l?s?l?l?l +?u?d?l?l?l?d?l?s +?l?d?l?l?s?d?l?l +?d?l?l?l?d?l?s?l +?l?l?u?l?l?s?d?d +?d?l?d?l?l?s?l?l +?u?l?d?l?l?l?s?d +?d?d?u?s?l?l?l?l +?u?l?l?u?l?d?d?s +?u?u?u?d?d?s?l?l +?u?l?u?s?u?l?d?d +?d?l?s?l?l?l?l?d +?s?l?l?d?l?l?l?d +?u?l?l?l?d?l?s?d +?d?l?s?d?l?l?l?l +?u?u?u?u?s?l?d?d +?s?l?l?d?l?l?d?l +?u?l?l?l?d?d?l?s +?d?s?l?d?l?l?l?l +?u?s?u?d?d?l?l?l +?d?l?l?l?s?d?l?l +?d?l?s?l?d?l?l?l +?u?l?d?d?s?l?l?l +?l?l?d?l?s?l?l?d +?d?s?d?u?u?u?u?u +?u?d?l?l?s?l?l?d +?d?s?l?l?l?d?l?l +?l?l?d?l?s?l?d?l +?l?s?l?d?l?d?l?l +?u?u?u?s?d?d?u?u +?l?l?l?d?l?s?d?l +?u?d?l?d?l?l?l?s +?l?d?l?l?l?s?d?l +?u?s?l?l?l?u?d?d +?u?l?l?l?d?u?l?l?l +?d?d?d?d?d?d?s?d?d?s +?u?d?d?d?d?u?l?l?l +?l?d?d?l?d?l?l?l?d +?d?l?l?l?d?l?d?l?d +?l?l?d?d?d?d?u?u?u +?d?l?l?l?l?d?d?d?l +?u?u?u?u?d?d?d?d?l +?l?u?u?l?l?d?d?d?d +?u?l?l?l?d?d?d?d?u +?l?d?d?d?l?l?d?l?l +?d?l?d?l?d?l?l?l?d +?u?l?l?l?l?u?u?d?d +?l?u?u?l?l?l?l?l +?l?u?l?l?l?l?l?u +?s?u?s?l?l?l?d?d +?s?d?d?u?l?l?l?s +?u?u?s?d?d?s?l?l +?s?l?d?l?d?l?l?s +?l?s?l?l?l?d?d?s +?d?d?u?u?l?l?s?s +?l?s?d?l?l?l?l?s +?l?l?l?s?d?s?l?l +?u?l?l?l?s?d?s?d +?d?d?s?l?l?l?s?l +?l?l?d?l?d?l?s?s +?s?l?d?l?s?l?d?l +?d?d?s?s?u?u?l?l +?s?s?l?l?d?d?l?l +?l?s?l?s?l?l?l?d +?s?l?l?d?l?l?d?s +?l?l?s?l?l?d?d?s +?u?d?l?l?d?l?s?s +?l?l?l?l?u?u?d?d?d +?l?l?l?d?l?l?d?d?l +?d?d?d?d?d?u?u?u?u?u +?u?l?l?d?l?u?l?l +?u?l?u?l?u?l?d?u +?u?d?l?l?l?u?l?l +?u?u?u?u?l?l?u?d +?l?d?l?l?u?l?l?l +?u?u?u?l?d?l?l?l +?u?u?u?l?l?u?u?d +?u?l?l?l?l?l?d?l?l +?l?l?d?l?u?l?l?l +?l?d?l?u?u?u?u?u +?u?l?u?u?u?l?l?d +?d?u?l?l?l?l?u?l +?l?d?l?l?l?l?u?u +?l?l?l?l?d?l?u?u +?l?d?l?d?s?l?d?l?d +?l?l?s?l?s?d?d?d?d +?u?u?u?s?d?d?s?d?d +?u?s?d?s?s?s?s +?d?s?l?s?s?s?s +?l?s?s?s?s?d?s +?s?s?s?s?s?u?d +?s?s?s?l?s?d?s +?l?s?s?s?s?s?d +?d?l?s?s?s?s?s +?l?s?d?s?s?s?s +?s?s?l?s?d?s?s +?u?s?s?s?s?s?d +?d?s?s?s?s?s?l +?s?d?l?s?s?s?s +?s?s?s?l?s?s?d +?l?s?s?d?s?s?s +?s?s?u?s?d?s?s +?d?s?s?s?s?s?u +?s?s?l?d?s?s?s +?s?d?s?l?s?s?s +?s?s?s?s?d?u?s +?l?s?l?l?l?u?u +?l?u?l?s?l?l?u +?u?u?l?s?u?l?l +?u?l?s?u?u?l?u +?u?u?u?u?l?s?l +?u?s?l?u?u?u?u +?l?u?l?u?l?l?s +?l?u?l?u?s?l?l +?l?l?u?u?s?l?u +?l?l?u?l?s?u?l +?l?l?u?s?l?u?u +?u?l?l?u?s?l?l +?u?l?l?u?s?l?u +?l?s?l?l?u?u?l +?l?l?u?l?u?s?u +?l?u?l?u?l?s?u +?l?u?u?u?l?l?s +?u?u?u?l?u?s?u +?u?l?u?u?l?s?l +?l?u?u?l?s?l?l +?u?l?l?u?s?u?u +?l?u?l?l?l?u?s +?l?l?l?u?l?s?u +?u?u?u?s?l?l?u +?u?u?s?l?l?u?u +?s?l?l?u?u?l?u +?u?s?u?u?l?u?l +?u?l?u?u?u?u?s +?l?l?l?u?u?l?s +?u?s?l?u?l?l?u +?s?u?u?u?l?u?u +?u?l?u?u?l?s?u +?l?u?s?u?l?u?l +?u?u?s?l?l?u?l +?l?l?u?u?l?s?u +?u?u?l?l?u?s?u +?u?l?u?u?s?u?l +?l?u?l?s?u?u?l +?l?u?s?u?l?l?u +?l?u?s?u?l?l?l +?u?u?l?u?l?s?l +?u?s?l?u?u?l?l +?s?u?l?u?l?l?l +?l?l?l?u?u?s?l +?u?u?s?l?u?l?l +?u?s?l?l?l?u?u +?s?u?l?l?u?u?l +?s?l?u?u?l?l?l +?l?s?l?u?u?l?l +?l?u?u?u?s?u?u +?l?l?l?l?u?s?l +?u?s?l?l?u?l?l +?l?u?l?s?u?l?u +?l?s?l?u?l?l?l +?u?u?u?u?l?u?s +?l?u?l?l?u?l?s +?s?l?u?l?l?u?l +?s?l?u?l?l?u?u +?l?l?l?u?s?l?u +?l?l?u?u?u?s?l +?u?u?u?l?u?s?l +?l?l?l?u?s?u?u +?l?l?l?u?s?u?l +?u?u?u?u?s?u?l +?l?u?u?s?u?l?l +?l?u?u?s?u?l?u +?u?u?s?l?u?u?u +?s?u?l?l?u?l?l +?u?l?l?s?l?u?l +?l?s?l?u?u?l?u +?u?u?l?u?u?l?s +?u?l?u?s?l?l?u +?s?l?l?u?l?l?u +?l?l?s?l?u?u?u +?l?l?u?u?l?u?s +?u?l?u?l?l?s?u +?l?u?u?l?l?s?l +?u?u?u?l?l?u?s +?s?l?l?l?u?u?u +?l?l?u?l?s?l?u +?u?s?l?l?u?u?l +?l?s?u?u?u?u?l +?s?u?l?u?u?l?u +?l?u?u?u?l?s?l +?u?d?l?l?s?l?l?l +?u?l?l?u?s?u?l +?u?l?u?s?u?u?u +?u?l?u?s?u?u?l +?u?u?l?u?u?s?u +?u?l?s?u?l?u?u +?s?u?l?l?l?u?l +?l?l?u?l?u?l?s +?u?u?u?u?s?l?u +?u?s?u?l?l?l?u +?l?u?s?u?u?u?u +?l?u?s?l?l?u?l +?s?l?l?u?l?u?l +?l?l?u?u?s?u?u +?d?l?l?l?l?l?l?l?l?d +?d?d?d?s?s?s?s?l +?l?d?d?d?s?s?s?s +?s?d?s?d?s?d?s?l +?s?s?l?d?d?d?s?s +?s?s?d?d?d?s?s?l +?u?l?u?l?l?d?d?u +?l?l?l?u?d?u?d?l +?d?l?l?l?l?d?u?u +?u?l?d?l?d?l?u?l +?d?l?u?l?u?d?u?l +?d?u?l?l?l?d?l?u +?u?l?u?d?l?u?l?d +?u?u?u?d?u?u?l?d +?l?l?d?d?l?d?l?l?l +?u?u?d?l?l?u?d?l +?u?u?d?l?u?u?d?l +?l?l?u?d?l?u?u?d +?u?d?d?u?l?l?l?u +?u?l?u?l?u?d?d?u +?u?u?u?d?d?l?u?l +?u?u?d?u?l?u?l?d +?u?d?l?u?u?d?l?l +?l?u?d?l?u?l?d?l +?u?l?d?d?l?u?l?l +?d?d?l?l?l?u?u?l +?d?l?u?u?u?l?l?d +?l?u?u?l?d?l?l?d +?u?d?l?l?l?d?u?l +?d?l?l?d?l?l?l?l?d +?u?u?u?u?d?d?l?u +?d?d?l?l?l?l?l?d?l +?l?d?u?l?l?d?l?l +?u?l?u?d?l?d?l?l +?l?u?u?d?d?l?l?l +?u?l?d?l?d?l?u?u +?l?l?l?d?l?l?u?d +?u?l?u?d?l?l?d?l +?u?l?l?d?l?u?d?l +?l?l?l?d?l?d?l?u +?l?l?l?u?d?u?u?d +?u?u?u?d?l?l?d?l +?l?u?d?l?l?u?d?u +?u?l?d?l?d?u?l?l +?d?l?l?u?u?u?l?d +?l?u?l?d?l?u?l?d +?u?l?l?d?d?l?u?l +?l?u?u?l?u?l?d?d +?u?l?d?l?u?l?u?d +?u?l?u?l?d?u?l?d +?u?d?l?l?l?d?u?u +?l?d?d?u?l?l?u?l +?l?l?u?d?l?l?d?l +?l?u?d?d?u?l?l?l +?d?l?u?l?d?l?l?u +?l?u?d?u?u?u?d?l +?l?l?d?d?l?u?u?u +?u?l?l?d?u?l?d?l +?u?l?u?d?d?l?l?u +?u?d?l?l?d?l?u?u +?u?l?d?l?u?d?u?u +?l?u?d?l?l?d?l?l +?u?u?u?l?l?d?l?d +?d?u?l?l?u?u?l?d +?u?l?l?d?u?u?l?d +?u?u?l?d?l?d?u?u +?u?u?l?l?d?d?u?l +?u?u?l?d?l?l?l?d +?d?l?l?u?l?u?d?l +?l?d?l?d?l?u?l?l +?u?l?l?d?l?d?u?u +?u?l?l?d?l?d?u?l +?l?l?d?u?l?l?u?d +?u?u?u?u?d?l?l?d +?l?l?d?u?l?l?d?u +?l?u?u?l?l?u?d?d +?l?l?u?u?u?d?d?l +?l?d?l?d?u?u?l?l +?u?l?u?d?u?d?l?l +?u?d?d?l?u?l?u?u +?l?l?d?d?u?u?l?u +?l?l?u?u?l?u?d?d +?u?u?u?l?d?l?l?d +?l?l?d?u?u?d?l?l +?l?l?d?l?u?l?d?l +?l?u?d?l?u?u?d?l +?l?l?u?u?l?d?d?l +?u?u?u?u?d?l?d?l +?l?d?u?u?d?u?l?u +?d?u?u?u?u?d?l?l +?u?d?d?u?u?u?l?l +?l?u?l?d?l?u?d?u +?u?l?l?u?d?d?u?l +?l?l?d?u?l?u?u?d +?l?u?l?u?d?d?l?l +?u?d?u?u?l?l?d?l +?d?d?l?l?u?l?l?u +?d?l?l?l?l?u?u?d +?u?l?d?d?u?l?l?u +?u?l?u?u?d?d?l?l +?u?l?d?l?u?l?l?d +?l?d?l?u?u?l?l?d +?d?l?l?l?l?l?d?l?d +?u?d?l?u?d?l?u?l +?u?l?d?u?d?l?l?u +?u?l?d?l?l?l?u?d +?l?l?l?d?u?u?l?d +?l?u?u?l?d?l?d?l +?u?u?l?u?l?d?d?u +?l?l?l?u?d?d?l?u +?u?l?u?u?l?d?l?d +?l?l?u?d?l?u?d?l +?d?d?l?l?u?l?u?l +?d?u?d?u?u?u?l?l +?u?l?u?d?d?u?u?u +?d?l?l?u?l?l?d?l +?u?u?d?u?l?l?d?l +?u?l?d?l?l?u?l?d +?u?l?l?u?d?l?d?l +?l?l?u?d?d?u?l?l +?u?u?d?u?d?l?l?l +?d?l?d?u?l?l?l?l +?d?l?d?l?u?u?u?u +?l?l?d?l?l?u?d?u +?u?u?u?l?d?d?u?u +?u?d?l?u?l?d?l?u +?l?l?l?u?u?d?d?u +?u?u?l?l?u?d?d?l +?l?l?d?d?u?l?l?u +?l?d?d?u?u?u?l?l +?l?d?l?l?u?d?l?l +?d?u?l?u?d?l?l?l +?u?d?l?u?l?u?d?u +?u?l?l?u?d?d?u?u +?u?u?d?d?l?u?u?l +?u?d?u?u?d?l?l?l +?l?l?d?l?d?l?u?u +?u?u?u?d?l?l?u?d +?d?l?l?l?u?l?d?l +?l?d?l?u?l?d?u?l +?u?l?d?l?l?l?d?u +?l?d?u?l?u?d?l?l +?u?d?l?d?l?l?l?u +?u?l?l?u?d?l?l?d +?l?l?l?d?d?u?l?u +?u?u?u?d?u?u?u?d?d +?u?l?d?d?l?l?u?u +?l?u?u?d?d?u?u?l +?l?l?l?l?l?l?d?l?l?l +?l?d?d?d?d?l?l?d?d?d +?d?d?d?d?d?d?l?l?d?l +?u?l?s?s?s?s?l +?s?l?s?s?s?l?l +?u?s?l?s?l?s?s +?s?s?s?l?s?l?l +?u?l?s?s?l?s?s +?s?s?u?s?s?u?u +?s?l?s?l?l?s?s +?s?s?s?s?l?u?l +?u?l?u?s?s?s?s +?s?l?l?u?s?s?s +?l?s?s?s?l?s?l +?s?u?u?s?u?s?s +?u?u?u?l?l?l?u?u +?u?l?l?l?l?u?u?l +?l?u?l?l?l?u?l?l +?u?l?l?u?u?l?l?l +?l?l?u?u?l?l?u?u +?s?u?s?l?l?l?l?l +?d?s?d?d?s?d?d?u?u +?u?u?u?s?s?s?d?d +?l?d?l?l?d?s?s?s +?l?s?s?s?l?l?d?d +?l?l?l?u?l?l?l?d?d +?l?l?l?d?d?d?l?d?d?d +?l?l?d?l?l?d?d?d?d?d +?u?l?l?s?d?d?s?d?d +?d?s?d?d?d?d?d?d?d?d?d +?u?l?l?l?l?d?l?d?d +?l?l?l?u?l?l?d?d?d +?l?l?l?d?d?l?l?d?l +?l?l?l?d?d?l?d?l?l +?l?u?l?l?l?l?d?d?d +?d?d?d?d?d?d?d?d?d?s?l +?s?l?l?l?l?l?l?l?d +?d?d?d?d?d?d?d?d?d?d?d?s +?s?s?s?s?d?d?d?d?d +?l?d?l?l?s?l?l?s +?d?d?l?l?l?l?d?l?d +?d?d?l?l?l?d?l?l?d +?d?l?d?d?d?l?l?l?l +?u?l?l?d?d?l?l?d?d +?l?l?l?l?l?d?d?l?l?l +?s?s?u?u?u?u?s?s +?u?u?s?u?u?s?u?u +?s?d?d?d?d?d?s?d?d +?d?s?d?d?d?d?s?d?d?d +?s?d?d?d?d?s?d?d?d?d +?d?s?d?d?d?d?d?s?d +?d?d?d?s?u?u?u?u?u +?l?l?d?d?d?d?d?d?l?d +?l?l?d?d?d?d?d?l?d?d +?d?d?d?u?u?u?d?d?d?d +?u?l?u?l?l?l?l?u +?u?l?u?l?l?u?l?u +?l?l?l?l?s?u?u?u +?l?l?l?l?d?l?l?l?l?l +?d?d?d?l?d?d?l?d?s +?l?d?l?d?d?d?s?d?d +?l?d?d?l?s?d?d?d?d +?l?d?d?d?d?s?l?d?d +?l?d?d?s?l?d?d?d?d +?u?s?d?d?d?d?d?d?l +?u?d?l?s?d?d?d?d?d +?d?d?d?d?l?s?l?d?d +?u?d?l?d?d?d?d?d?s +?s?d?d?d?d?d?d?u?l +?u?l?d?d?s?d?d?d?d +?u?u?d?d?d?s?d?d?d +?d?d?d?d?d?d?l?u?s +?l?s?d?l?d?d?d?d?d +?d?d?u?u?d?d?d?d?s +?d?d?d?d?d?u?d?u?s +?l?d?d?d?d?d?l?s?d +?s?d?d?l?d?d?l?d?d +?d?d?u?d?d?l?d?d?s +?l?s?u?d?d?d?d?d?d +?l?d?d?d?s?d?d?d?l +?d?s?d?l?l?d?d?d?d +?u?l?l?l?l?l?l?u?d +?l?l?s?l?l?l?l?l?d +?s?s?s?s?s?u?s +?s?l?l?l?l?s?l?l +?u?u?u?d?u?u?u?u?u +?l?l?s?s?s?l?l?l +?s?d?d?d?d?s?l?l?l +?d?d?d?d?l?d?l?d?d?d +?d?d?d?d?d?l?d?d?d?l +?d?d?d?l?d?d?d?l?d?d +?d?l?d?d?d?d?l?d?d?d +?d?d?d?l?d?d?d?d?d?l +?u?u?s?l?l?l?l?d +?l?l?l?l?l?u?s?d +?u?l?l?d?u?l?l?s +?u?l?d?s?l?l?l?l +?u?l?l?s?d?u?l?l +?u?l?l?l?l?l?u?l?l +?d?d?d?d?d?d?d?d?d?l?l?l +?s?s?d?d?d?d?d?d?s?s +?d?d?d?d?d?l?l?l?l?d +?d?l?l?l?d?d?d?l?d +?d?d?d?l?l?d?l?l?d +?u?u?u?l?d?d?d?d?d +?u?d?l?d?l?d?l?d?d +?d?d?l?l?d?l?d?d?l +?u?d?u?d?u?d?d?u?d +?d?d?l?d?d?l?l?l?d +?d?d?d?d?d?u?l?l?u +?l?l?l?d?l?d?d?d?d?d +?d?d?d?d?d?u?u?u?l +?l?l?d?d?l?d?d?d?l +?d?d?d?l?l?u?u?d?d +?d?l?l?l?d?d?l?d?d +?l?d?l?l?d?d?d?l?d +?d?l?l?d?d?l?d?d?l +?d?d?d?d?s?l?l?l?l?l +?l?l?d?l?d?d?l?l?l +?s?s?l?s?s?l?d?d +?u?l?l?u?d?l?u?u +?u?l?d?l?u?l?u?l +?u?d?u?l?u?l?u?l +?l?d?u?u?u?l?l?l +?l?l?d?l?l?l?u?u +?l?u?u?u?d?l?l?l +?u?d?u?u?l?l?l?l +?u?l?l?u?l?l?d?u +?l?l?l?l?u?u?l?d +?u?l?u?l?l?u?l?d +?u?u?l?l?l?u?l?d +?u?l?u?l?l?l?d?l +?l?u?u?u?l?l?l?d +?u?l?l?l?l?u?d?u +?l?l?l?u?u?u?d?l +?l?l?l?l?u?d?u?u +?l?l?l?d?u?u?u?l +?d?u?l?l?l?l?u?u +?u?l?l?l?l?s?d?d?d?d +?u?l?l?l?l?u?l?s +?l?d?l?d?l?d?s?d?d +?d?d?d?s?d?d?l?l?l +?s?l?d?l?d?l?d?l?d +?u?l?l?s?l?d?d?d?d +?d?d?d?l?l?l?l?s?d +?d?d?l?l?l?s?d?d?d +?d?d?d?s?d?l?l?l?l +?s?l?d?l?l?d?d?d?d +?u?u?l?l?d?d?d?d?s +?s?d?l?l?l?d?d?d?d +?d?l?l?l?d?d?s?d?d +?d?d?d?d?d?s?u?l?l +?d?d?d?s?l?l?l?d?d +?u?l?l?l?l?u?l?u +?u?l?l?l?l?l?l?l?u +?l?l?l?l?l?l?l?l?l?s +?l?d?d?l?d?d?l?l?d?d +?l?d?l?l?l?d?d?d?d?d +?d?l?l?l?l?s?s?s +?l?l?s?l?s?l?l?d +?l?s?l?s?l?d?l?l +?u?l?l?l?l?u?l?d?d +?u?d?d?l?l?l?l?l?l +?u?u?u?u?u?d?d?u?u +?d?d?d?l?l?l?l?s?s +?d?d?d?s?s?s?s?d +?s?d?d?s?d?s?d?s +?d?s?d?s?d?d?s?s +?s?s?d?s?s?d?d?d +?d?s?s?d?s?s?d?d +?s?d?s?s?s?d?d?d +?d?d?d?s?d?s?s?s +?s?s?d?d?s?d?d?s +?s?s?s?d?d?d?s?d +?d?s?s?d?s?d?s?d +?s?d?s?s?d?d?d?s +?u?u?u?u?u?u?u?d?u +?d?l?l?u?l?d?u?d +?d?l?l?d?d?u?l?u +?d?d?u?l?u?l?d?l +?l?l?d?l?d?d?l?u +?d?d?l?l?u?u?l?d +?l?u?l?d?d?u?d?u +?d?u?d?d?u?u?l?u +?l?l?l?u?d?u?d?d +?d?u?u?d?d?l?l?l +?l?l?d?u?u?l?d?d +?u?d?l?u?d?u?d?l +?u?l?u?d?d?u?d?l +?l?l?d?u?d?d?u?l +?u?l?d?l?d?l?u?d +?d?d?u?l?u?d?l?u +?l?u?d?d?l?d?l?u +?d?l?u?l?u?d?d?u +?u?d?u?d?u?l?l?d +?l?l?l?d?u?d?d?l +?d?l?d?u?d?u?l?u +?u?l?u?d?l?d?u?d +?u?l?d?l?l?d?u?d +?u?u?d?d?u?l?d?u +?l?l?u?d?d?d?u?u +?l?d?u?d?l?u?d?u +?d?u?l?d?l?u?d?l +?d?l?u?l?l?l?d?d +?u?u?d?u?l?d?u?d +?l?u?d?d?l?u?d?l +?l?d?u?d?l?d?u?l +?u?d?d?l?l?d?u?u +?l?u?l?d?d?u?d?l +?u?d?l?d?l?l?d?u +?u?d?u?d?l?l?u?d +?l?l?d?d?l?l?u?d +?d?u?u?l?d?l?d?u +?l?d?d?d?l?l?u?u +?d?u?u?l?l?d?d?u +?d?u?l?l?d?u?d?u +?u?u?u?d?l?d?u?d +?l?l?d?l?d?d?u?l +?d?l?l?u?u?u?d?d +?u?u?d?u?u?l?d?d +?l?u?d?u?d?d?l?l +?l?u?d?d?l?l?l?d +?d?d?l?d?u?u?l?u +?d?d?u?l?l?d?l?u +?l?l?d?d?u?d?l?l +?l?l?d?d?u?d?l?u +?u?l?d?l?l?l?d?d?d +?d?u?u?u?u?l?d?d +?l?d?u?l?u?d?d?u +?u?u?u?l?d?d?d?u +?d?d?l?u?l?l?d?l +?l?d?d?l?u?u?l?d +?l?u?u?d?l?d?d?u +?l?u?d?l?u?d?l?d +?l?d?l?d?u?u?u?d +?l?l?l?d?u?d?d?u +?l?l?l?l?d?d?d?u?u +?d?u?l?d?d?u?u?u +?u?l?u?d?d?u?l?d +?u?u?u?u?d?u?d?d?d +?l?d?u?l?u?l?d?d +?d?u?u?l?u?d?d?l +?l?d?u?u?d?l?l?d +?l?l?d?l?l?d?d?d?l +?d?d?u?u?d?u?u?l +?u?u?d?u?u?d?d?l +?l?d?u?l?l?u?d?d +?d?l?d?l?u?l?l?d +?d?l?u?d?u?u?u?d +?d?l?u?l?d?u?d?u +?l?l?d?u?u?d?u?d +?u?l?d?d?u?u?u?d +?d?d?l?d?l?l?l?u +?d?d?u?u?l?u?d?l +?d?d?l?l?d?l?u?u +?d?d?d?u?l?l?u?u +?l?l?l?d?d?u?d?u +?u?u?l?l?d?d?d?u +?u?d?u?d?l?u?d?l +?d?u?d?l?l?d?u?l +?d?l?l?u?u?l?d?d +?u?d?l?u?d?d?u?l +?d?d?l?d?u?l?u?u +?d?d?u?l?u?d?l?l +?u?d?d?d?l?l?u?l +?l?u?d?u?d?d?u?u +?u?d?u?l?d?u?l?d +?l?l?d?u?d?u?l?d +?l?d?d?l?u?u?u?d +?d?d?u?u?l?d?l?l +?l?u?d?u?u?l?d?d +?u?d?l?l?u?d?d?u +?l?u?d?l?d?l?d?l +?d?u?l?d?d?l?l?u +?u?d?d?l?u?u?l?d +?u?l?l?d?d?l?u?d +?u?u?d?u?d?l?d?l +?l?u?d?d?l?l?d?u +?l?u?d?l?l?d?d?u +?u?u?u?l?d?d?l?d +?u?d?u?d?l?d?l?u +?l?l?d?d?l?u?d?l +?l?d?d?l?u?u?d?u +?d?d?u?l?u?l?u?d +?u?d?d?l?u?l?d?u +?d?d?l?u?d?u?u?l +?u?d?u?l?d?d?u?u +?l?u?u?d?d?l?l?d +?u?u?d?d?l?d?l?l +?l?u?l?u?d?d?d?l +?u?d?l?u?l?d?d?u +?d?l?u?l?u?d?d?l +?l?d?u?l?d?u?d?u +?u?d?l?l?l?d?u?d +?d?d?u?u?l?d?u?l +?d?u?l?d?u?l?d?l +?d?u?d?l?l?u?u?d +?l?l?u?d?l?l?d?d +?u?u?l?d?u?l?d?d +?l?d?d?u?d?l?l?u +?l?d?l?u?d?d?l?u +?u?d?u?d?l?d?u?l +?u?d?u?l?l?d?l?d +?d?l?l?d?l?u?u?d +?d?l?d?l?u?l?u?d +?u?l?u?d?u?d?d?u +?u?l?d?d?d?l?u?u +?d?d?l?l?l?l?d?u +?l?d?d?u?u?l?d?l +?d?d?l?l?l?u?d?u +?d?u?l?d?l?l?u?d +?d?d?d?l?u?u?l?l +?l?u?d?d?u?l?l?d +?l?d?d?d?u?l?l?u +?l?d?u?d?u?u?d?l +?l?d?l?u?u?d?l?d +?l?d?u?u?u?l?d?d +?u?l?d?d?l?d?u?l +?d?l?u?d?u?d?u?u +?u?u?d?d?l?d?u?u +?d?d?l?l?l?u?u?d +?l?l?d?d?l?u?u?d +?u?d?u?u?d?u?l?d +?d?d?l?l?l?l?u?d +?u?d?d?u?d?u?l?u +?l?d?l?d?l?d?u?l +?l?d?d?l?u?d?u?u +?d?u?d?d?l?l?u?u +?u?d?l?l?d?l?u?d +?u?l?d?l?d?u?u?d +?l?d?d?l?l?d?u?l +?u?l?d?l?u?d?u?d +?u?u?l?l?u?d?d?d?d +?l?u?d?l?l?d?l?d +?u?d?u?d?d?u?u?l +?l?d?l?l?u?l?d?d +?u?l?d?l?u?d?d?u +?l?u?u?d?d?d?u?u +?l?u?d?l?d?d?u?u +?d?l?u?d?d?u?l?u +?u?u?d?l?l?d?l?d +?d?u?l?u?u?u?d?d +?l?u?d?d?u?u?d?l +?u?u?l?d?l?d?l?d +?d?l?l?d?l?u?l?d +?d?l?d?l?u?d?l?u +?l?u?u?d?d?u?l?d +?u?l?d?l?d?u?l?d +?l?d?l?u?l?u?d?d +?d?u?u?u?l?d?l?d +?l?d?l?u?d?l?d?l +?u?u?d?l?u?d?d?u +?d?l?d?u?u?l?d?l +?u?u?d?d?l?l?d?l +?l?u?d?d?u?d?l?u +?u?l?l?d?u?d?d?u +?l?d?u?u?l?d?l?d +?u?d?l?d?l?u?d?u +?u?l?u?l?d?l?d?d +?d?l?u?u?l?d?l?d +?d?l?d?u?l?l?d?l +?u?u?d?u?l?d?d?l +?d?u?l?d?l?l?d?l +?l?l?d?l?d?u?u?d +?l?d?u?l?d?l?d?u +?d?l?u?d?u?u?d?l +?u?d?d?l?u?u?d?u +?d?l?d?u?l?l?u?d +?d?d?u?l?l?l?d?u +?u?d?l?d?d?u?u?u +?d?l?l?d?d?u?u?l +?l?l?u?d?d?d?l?u +?d?u?u?l?u?u?d?d +?l?l?d?l?d?l?d?u +?d?u?l?u?u?d?l?d +?l?l?d?d?u?u?u?d +?d?l?l?d?u?d?u?l +?l?d?l?l?d?u?d?u +?d?l?l?d?l?d?u?u +?d?l?l?d?l?d?u?l +?l?l?u?u?d?d?d?l +?l?d?l?d?u?d?u?u +?d?l?d?d?u?l?u?u +?d?l?d?d?u?l?u?l +?u?d?u?l?u?d?u?d +?d?l?d?u?u?l?u?d +?u?u?d?l?d?l?d?u +?d?u?d?l?d?l?l?u +?u?u?u?d?d?l?u?d +?l?l?d?d?u?l?u?d +?l?d?d?u?l?l?d?u +?d?u?l?l?u?d?l?d +?l?l?u?d?d?l?d?l +?d?d?l?u?l?u?d?u +?l?l?u?d?d?l?d?u +?l?u?d?l?u?u?d?d +?d?l?u?d?l?d?l?l +?d?d?u?l?u?u?d?u +?l?d?l?d?u?d?l?l +?l?d?d?d?l?l?l?d?l +?d?u?u?d?d?u?u?l +?d?l?l?l?d?d?u?l +?d?d?l?u?l?l?l?d +?d?l?l?d?l?u?d?l +?d?u?d?u?l?l?l?d +?l?d?u?d?d?u?l?l +?l?d?d?u?l?d?u?l +?u?d?d?l?l?u?d?u +?u?l?l?d?d?d?d?u?l +?l?l?d?l?l?d?d?u +?d?d?l?d?l?d?l?l?l +?d?d?u?l?u?d?u?l +?u?u?u?d?d?l?d?l +?l?l?d?d?u?u?l?d +?u?l?d?u?l?d?d?u +?l?d?d?l?l?l?d?u +?u?d?d?u?u?d?l?u +?l?l?d?l?u?l?d?d +?d?d?l?d?l?l?u?l +?d?l?d?l?u?l?d?l +?u?u?l?u?d?d?d?l +?l?d?l?l?d?u?d?l +?d?d?d?u?u?l?u?u +?l?l?d?l?u?d?d?l +?d?d?u?l?u?u?u?d +?d?u?l?u?l?d?u?d +?d?d?u?l?d?l?u?u +?l?d?d?l?l?u?l?d +?u?l?u?d?d?d?u?u +?d?l?l?u?d?d?u?u +?u?d?u?l?d?u?u?d +?u?d?u?u?l?u?d?d +?d?l?l?u?l?d?d?l +?d?d?u?l?d?u?u?u +?d?u?u?l?u?l?d?d +?l?d?u?u?d?u?l?d +?u?l?d?u?d?l?l?d +?d?l?d?d?l?u?u?u +?u?u?d?d?l?d?u?l +?l?d?u?d?d?u?u?l +?d?d?u?l?l?d?u?l +?d?u?l?l?l?l?d?d?d +?u?u?d?l?u?l?d?d +?l?l?d?d?d?l?l?d?l +?u?d?u?l?d?l?d?l +?u?u?u?d?d?u?d?l +?u?d?u?u?l?d?d?u +?u?d?l?l?d?u?d?u +?l?u?u?d?d?d?l?l +?d?l?d?l?u?u?d?u +?d?d?u?l?u?u?l?d +?d?u?l?l?u?u?d?d +?l?l?l?u?d?d?d?u +?d?u?u?d?l?d?u?u +?u?d?l?l?u?u?d?d +?d?d?l?u?u?u?d?l +?u?d?u?l?d?d?l?u +?l?d?d?u?l?u?d?l +?l?u?l?d?u?d?l?d +?d?u?u?l?d?d?l?u +?d?d?u?l?u?l?d?u +?u?d?d?u?u?l?d?l +?u?u?d?l?u?d?d?l +?u?d?d?d?u?u?l?u +?d?d?l?u?d?l?l?l +?d?d?l?l?l?u?l?d +?d?u?d?u?l?d?u?l +?l?l?d?u?l?u?d?d +?d?u?l?l?d?d?u?l +?u?d?l?l?u?d?u?d +?d?d?u?d?l?l?u?l +?u?u?l?d?d?u?d?l +?d?u?d?l?u?l?d?l +?u?l?d?u?d?d?l?l +?u?l?d?u?d?d?l?u +?l?d?d?u?l?u?d?u +?l?d?u?u?u?d?u?d +?u?l?d?u?u?u?d?d +?d?d?l?l?u?l?l?d +?d?l?l?u?d?l?l?d +?l?d?u?l?u?d?d?l +?d?u?l?u?l?d?l?d +?d?d?u?l?l?d?l?l +?u?d?l?d?u?u?d?l +?u?d?l?u?d?l?u?d +?u?u?d?l?d?d?u?l +?u?d?l?d?l?d?l?u +?u?l?d?u?d?l?d?u +?d?l?l?d?l?l?d?d?l +?l?d?l?u?u?d?d?l +?d?l?l?u?d?u?l?d +?d?l?d?u?u?u?d?l +?d?u?d?u?u?u?l?d +?l?d?l?l?u?d?u?d +?d?u?u?l?d?d?u?u +?d?u?d?u?d?u?l?l +?d?u?d?u?d?u?l?u +?d?l?l?l?u?d?l?d +?d?u?d?l?u?d?u?l +?d?d?l?l?d?u?l?l +?d?u?d?l?l?l?u?d +?l?l?l?u?d?d?l?d +?l?d?u?l?d?l?l?d +?u?d?d?u?l?d?l?u +?d?d?u?l?u?l?l?d +?l?d?u?d?l?d?l?l +?d?d?u?u?u?l?d?l +?u?l?d?l?d?d?u?l +?l?u?u?l?d?d?u?d +?d?u?l?u?l?d?d?u +?d?u?d?l?d?u?l?u +?u?l?d?l?d?d?u?u +?d?u?u?d?l?l?l?d +?d?l?u?l?d?l?d?l +?d?u?d?u?l?l?d?l +?l?d?l?l?l?d?u?d +?l?u?l?l?u?d?d?d?d +?d?u?u?u?l?d?d?l +?u?d?u?l?l?u?d?d +?l?d?l?d?d?u?u?l +?u?d?d?u?u?l?l?d +?u?u?l?d?l?d?d?l +?d?l?d?l?l?u?d?u +?d?l?d?d?u?u?u?u +?l?u?d?d?d?l?l?u +?l?d?d?d?u?u?l?u +?u?d?l?u?d?u?u?d +?l?d?u?l?u?d?l?d +?l?d?d?u?l?l?l?d +?d?l?d?u?d?l?l?l +?u?l?u?d?d?l?u?d +?u?u?d?u?d?d?l?u +?l?d?u?d?u?u?d?u +?u?d?u?u?d?l?d?l +?d?u?l?d?u?u?l?d +?l?d?d?l?u?d?l?l +?d?u?l?d?d?l?u?l +?l?d?u?d?u?l?l?d +?u?u?d?d?l?u?l?d +?d?d?u?u?u?d?l?u +?l?l?u?u?d?d?d?u +?u?d?l?l?d?l?d?l?d +?d?u?d?d?u?l?l?l +?d?u?d?d?u?l?l?u +?d?d?d?l?u?l?u?l +?d?l?d?u?l?l?l?d +?l?d?l?u?l?d?d?l +?l?d?u?l?d?d?l?l +?d?d?l?u?l?u?u?d +?d?u?l?l?d?u?u?d +?u?d?u?l?u?d?l?d +?u?u?d?d?d?l?u?u +?u?u?d?d?d?l?u?l +?l?u?l?d?d?l?d?l +?d?d?u?d?l?l?u?u +?u?d?d?l?d?u?u?l +?d?d?u?l?l?l?u?d +?d?d?l?u?l?u?l?d +?u?d?u?d?u?u?d?l +?u?u?u?l?d?d?u?d +?d?d?l?u?l?d?l?l +?d?d?l?d?u?l?u?l +?d?d?l?l?d?u?u?l +?d?d?u?u?u?u?d?l +?l?d?l?d?d?u?l?u +?d?d?u?l?l?u?d?l +?d?d?l?l?u?d?l?l +?l?d?d?l?d?l?u?l +?l?u?u?d?d?u?d?l +?l?l?d?d?u?l?d?u +?d?u?d?l?u?u?d?u +?d?l?l?l?d?u?d?l +?l?d?d?u?u?u?l?d +?d?d?l?l?l?d?u?l +?u?l?l?d?u?l?d?d +?u?u?d?u?d?u?d?l +?l?d?u?l?d?l?d?l +?l?d?u?u?d?l?d?u +?d?d?l?u?u?l?d?u +?l?d?d?u?u?d?u?u +?d?u?u?d?d?u?l?u +?u?d?d?u?l?d?u?l +?l?d?u?u?d?d?u?u +?u?u?d?d?u?d?u?l +?d?l?u?u?u?u?d?d +?d?d?l?u?u?u?l?d +?l?d?d?u?u?u?u?d +?d?u?d?l?l?l?d?l +?d?d?u?l?l?l?d?l +?d?u?u?l?d?u?u?d +?d?u?l?u?d?u?d?l +?l?u?d?l?d?u?d?u +?u?d?l?d?d?l?u?u +?d?d?l?d?l?u?u?u +?d?d?l?u?l?l?u?d +?u?d?u?u?d?l?l?d +?d?l?l?d?d?l?l?u +?u?u?d?l?l?d?u?d +?u?u?l?u?d?l?d?d +?l?d?d?l?d?u?l?u +?l?d?d?d?u?u?u?l +?d?u?l?d?u?u?d?u +?l?d?l?d?d?u?u?u +?u?l?d?d?u?d?l?l +?l?l?u?d?d?u?d?l +?l?l?u?d?u?l?d?d +?u?l?l?d?l?d?d?u +?d?u?u?u?d?l?d?l +?d?d?d?u?l?l?l?l?d +?l?l?d?d?u?u?d?u +?u?l?d?l?l?l?l?d?d +?d?l?l?l?d?u?d?u +?d?u?l?u?d?l?u?d +?u?u?d?d?l?u?u?d +?l?d?u?u?u?d?d?u +?d?u?u?u?l?u?d?d +?d?u?u?d?d?u?l?l +?l?l?d?u?u?d?d?l +?d?d?u?l?d?l?l?u +?l?u?d?d?u?u?l?d +?d?d?u?u?d?l?l?l +?d?d?s?d?d?s?d?s?d +?s?d?d?s?d?d?d?d?s +?s?d?s?d?s?d?d?d?d +?d?s?d?s?d?s?d?d?d +?d?s?l?l?l?l?l?l?l +?l?d?d?l?d?d?l?d?l?d +?l?l?l?l?l?u?u?s +?d?d?s?d?s?d?d?d?d?d +?d?s?d?d?d?s?d?d?d?d +?d?d?d?d?d?d?d?s?s?d +?l?s?d?l?l?l?l?l?l +?l?l?s?s?d?d?d?s +?d?d?d?s?s?s?l?l +?l?l?d?s?d?s?d?s +?l?s?l?s?s?d?d?d +?l?d?d?d?l?s?s?s +?d?d?d?s?l?s?s?l +?l?l?s?d?s?d?s?d +?d?s?d?s?l?l?s?d +?d?d?d?s?l?l?s?s +?l?s?d?s?l?s?d?d +?s?d?d?d?s?l?l?s +?l?d?s?s?d?d?l?s +?d?s?l?s?l?s?d?d +?u?s?s?d?l?s?d?d +?s?l?l?d?d?s?d?s +?s?l?s?l?d?d?d?s +?l?s?l?d?d?d?s?s +?u?s?u?d?d?d?s?s +?l?l?u?l?l?l?l?d?d +?u?l?l?l?l?l?l?d?l +?l?d?s?d?d?d?d?d?d?d +?d?d?s?l?l?s?d?d?d +?u?s?u?s?d?d?d?d?d +?l?s?d?d?d?d?d?s?l +?l?u?l?u?l?l?l?l +?l?l?l?u?l?l?u?l +?u?u?u?l?l?u?u?u +?u?u?l?l?l?u?u?u +?l?l?l?l?l?u?l?u +?u?u?u?u?s?s?s?s +?u?u?u?s?d?d?d?d?d?d +?l?l?d?d?l?d?d?l?d?d +?l?l?l?u?u?u?u?d?d +?d?l?l?l?l?l?d?d?l +?d?l?d?l?l?d?l?l?l +?d?l?d?l?l?l?l?l?d +?u?u?u?l?l?l?l?l?d +?u?u?l?l?u?u?d?d?d +?u?u?u?u?u?d?d?d?u +?d?d?d?s?d?d?s?d?d?d?d +?s?l?l?d?d?d?d?d?d?d +?s?l?s?l?l?l?d?d +?l?l?s?d?s?d?l?l +?d?d?l?l?s?s?l?l +?u?s?u?l?l?s?d?d +?u?l?l?u?d?d?s?s +?d?l?l?l?l?d?s?s +?l?l?l?s?s?d?d?l +?u?u?d?d?l?l?s?s +?u?l?l?l?d?s?d?s +?u?l?d?s?u?l?d?s +?l?l?u?u?s?s?d?d +?d?d?l?l?l?s?s?l +?l?l?d?s?l?l?d?s +?s?u?u?s?d?l?l?d +?s?s?u?u?l?l?d?d +?d?l?l?d?l?l?s?s +?u?l?l?u?s?s?d?d +?u?s?u?s?u?u?d?d +?s?l?l?l?s?l?d?d +?l?l?s?d?s?l?l?d +?d?s?u?l?l?l?s?d +?s?l?l?d?l?d?l?s +?u?s?l?d?u?s?l?d +?s?d?l?l?l?d?l?s +?d?l?d?l?l?l?s?s +?u?u?d?d?s?s?l?l +?d?d?s?s?l?l?u?u +?u?s?u?s?l?l?l?l +?s?u?l?l?l?l?u?s +?l?d?d?d?l?d?d?l?d?d +?l?l?l?s?s?s?l?l +?l?l?l?d?d?d?d?l?s +?u?s?u?u?u?d?d?d?d +?u?u?s?u?l?l?l?l +?l?d?l?d?l?s?s?s +?l?l?l?l?d?d?d?d?d?l +?u?l?l?u?l?l?l?l?l +?u?l?l?l?s?u?l?l?l +?u?u?s?d?u?u?u?u +?l?l?l?l?l?s?d?l?d +?u?l?s?u?l?l?l?d +?l?l?l?l?l?s?u?d +?u?l?s?l?d?l?l?l +?s?d?d?d?d?l?l?l?s +?d?d?d?d?s?l?l?l?s +?l?l?d?d?d?d?d?l?l?l +?l?d?d?l?l?l?l?d?l +?d?l?l?d?d?l?l?l?l +?u?u?d?u?u?d?u?u?d +?d?l?l?d?l?l?l?d?l +?u?u?u?u?u?u?d?u?u +?d?l?l?l?l?l?l?l?d?d +?s?s?d?s?s?s?s +?u?l?l?l?l?u?d?d?d?d +?u?l?u?s?s?l?u +?s?l?l?l?s?u?u +?u?u?u?s?s?u?l +?l?s?u?l?s?l?l +?u?l?l?u?u?s?s +?s?l?u?l?l?s?l +?u?s?s?l?u?l?l +?u?s?s?l?u?l?u +?u?s?u?u?s?l?l +?u?u?u?u?s?s?l +?l?l?l?d?l?l?s?s +?s?l?l?u?l?s?l +?u?s?u?u?s?u?l +?l?s?u?u?u?l?s +?l?u?l?l?s?u?s +?u?l?s?u?s?u?l +?u?l?l?s?u?s?l +?s?u?u?s?l?l?l +?l?l?s?l?u?l?s +?u?s?u?s?u?u?l +?u?l?l?u?s?l?s +?s?l?u?l?s?l?u +?s?l?u?l?s?l?l +?l?l?s?s?l?u?l +?l?l?s?s?u?u?u +?u?u?s?l?s?l?u +?l?u?l?s?u?s?l +?l?s?l?l?s?l?d?l +?l?l?u?s?l?s?u +?u?s?l?l?u?s?u +?s?l?u?l?u?s?l +?u?l?u?s?u?l?s +?l?u?l?s?l?s?l +?l?l?u?s?u?u?s +?u?u?l?u?l?s?s +?l?s?s?l?l?u?l +?l?u?s?s?l?l?l +?u?u?l?s?s?l?l +?u?l?u?s?u?s?u +?l?u?s?l?l?l?s +?l?s?l?l?l?u?s +?s?l?u?u?u?l?s +?u?u?l?u?s?u?s +?s?s?l?u?u?l?l +?l?l?u?u?l?s?s +?u?s?l?u?l?u?s +?u?s?u?s?l?l?u +?s?l?u?s?u?l?u +?s?s?u?l?l?l?l?l +?u?s?l?l?l?u?s +?s?s?u?l?u?l?u +?s?s?u?l?u?l?l +?l?s?s?l?l?l?u +?l?s?u?l?l?l?s +?u?l?s?l?s?u?l +?u?u?s?s?u?u?l +?l?s?l?l?l?s?u +?s?u?u?u?s?u?u +?l?s?l?u?l?l?s +?s?l?l?l?l?s?u +?u?l?u?s?s?u?l +?s?l?u?u?l?u?s +?l?u?s?l?s?l?l +?s?u?u?u?u?u?d?s +?l?l?l?u?s?u?s +?u?u?u?s?l?s?l +?u?u?s?u?u?s?l +?s?u?l?u?l?s?u +?l?l?u?s?l?l?s +?s?s?l?u?l?l?l +?l?s?l?l?s?u?l +?u?s?u?l?u?l?s +?u?u?s?u?l?s?l +?u?l?s?u?l?s?u +?u?s?l?l?s?u?u +?u?u?u?l?l?s?s +?s?s?l?u?l?l?u +?u?l?s?s?u?l?u +?u?s?l?u?l?s?l +?l?l?u?l?u?s?s +?l?l?u?l?s?s?l +?l?s?u?s?l?l?u +?u?l?l?l?s?s?u +?u?l?s?l?s?u?u +?u?s?u?l?l?s?u +?u?u?u?u?l?s?s +?u?l?s?l?l?s?u +?u?u?l?s?u?u?s +?u?l?l?u?s?s?u +?s?u?u?u?s?l?l +?l?u?u?l?l?s?s +?s?u?u?l?l?u?s +?u?u?l?s?l?s?l +?u?u?s?l?s?u?u +?l?l?s?u?l?s?l +?u?u?u?s?s?l?l +?l?l?s?l?l?s?u +?s?u?l?s?u?l?l +?s?u?u?u?u?l?s +?s?l?l?l?u?u?s +?l?l?l?s?u?l?s +?s?l?u?s?l?u?l +?u?s?u?s?u?l?u +?u?u?s?s?u?l?l +?l?l?l?s?l?u?s +?u?l?u?l?s?u?s +?s?l?u?u?l?s?l +?l?l?l?u?l?s?s +?u?l?u?s?u?u?s +?u?l?s?s?l?u?l +?u?s?u?l?l?s?l +?u?l?s?u?l?u?s +?u?s?u?l?u?s?l +?d?s?s?l?l?l?l?l +?u?u?s?u?s?l?l +?u?s?u?l?l?l?s +?s?s?u?l?l?l?u +?s?u?l?l?u?s?u +?l?u?l?l?l?s?s +?s?l?l?u?l?u?s +?l?l?u?u?s?u?s +?u?s?s?l?l?u?l +?u?u?l?s?l?l?s +?l?u?l?l?l?l?l?d?d +?u?u?u?d?d?l?l?l?l +?u?l?u?u?u?u?u?u +?u?l?u?l?u?l?u?u +?u?l?u?u?l?l?l?l +?l?l?l?l?l?u?u?l +?u?l?u?l?l?l?u?l +?l?d?s?l?l?l?l?d +?u?l?s?d?d?l?l?l +?u?u?u?u?s?d?d?l +?l?l?l?l?d?d?s?u +?u?u?u?d?d?s?u?u +?d?l?l?l?l?s?l?d +?d?l?l?s?l?l?d?l +?u?s?l?l?d?d?l?l +?l?l?l?u?l?s?d?d +?l?s?l?l?l?d?d?u +?l?l?l?l?u?d?d?s +?u?l?l?l?d?d?s?l +?u?u?d?d?s?l?l?l +?l?l?u?u?l?s?d?d +?l?s?d?l?l?d?l?l +?s?l?l?u?l?l?d?d +?l?l?l?s?d?d?u?u +?d?l?s?l?l?l?d?l +?l?l?d?l?l?s?d?l +?u?l?l?s?u?u?d?d +?d?l?d?l?l?l?s?l +?u?l?u?l?u?d?s?d +?d?d?u?l?l?s?u?u +?u?l?d?d?l?s?l?l +?u?s?l?d?d?l?l?l +?l?l?u?u?u?d?d?s +?l?l?d?d?s?u?u?u +?u?l?d?s?l?l?l?d +?u?l?d?d?l?l?s?l +?d?l?l?l?l?s?d?l +?s?l?d?l?l?l?l?d +?l?l?l?l?s?d?d?u +?l?s?u?l?l?l?d?d +?d?l?l?l?d?s?l?l +?u?d?l?l?s?l?d?l +?u?l?l?d?l?l?s?d +?l?l?l?u?u?s?d?d +?u?s?l?u?u?l?d?d +?d?u?u?u?d?u?u?s +?l?u?u?l?l?s?d?d +?s?d?l?l?l?d?l?l +?u?l?l?l?s?d?d?u +?u?d?l?s?l?l?l?d +?l?l?s?l?l?d?d?l +?l?l?s?d?l?l?d?l +?u?d?d?l?l?s?l?l +?s?l?l?d?l?d?l?l +?u?d?l?l?d?l?s?l +?s?s?s?l?l?l?d?d?d +?l?l?l?l?u?l?l?d?d +?u?d?d?d?d?u?u?u?u +?d?l?d?d?l?l?d?l?l +?d?l?l?l?d?d?l?l?d +?l?d?l?d?l?d?l?d?u +?u?l?l?d?l?l?d?d?d +?l?l?d?l?d?d?d?l?l +?u?u?l?l?l?l?l?l?d +?s?u?s?s?s?u?s +?s?s?u?s?s?l?s +?s?s?s?u?s?l?s +?s?s?l?s?s?l?s +?s?l?s?s?l?s?s +?s?s?l?l?s?s?s +?s?s?s?s?s?u?l +?l?s?u?s?s?s?s +?u?s?s?u?s?s?s +?s?l?l?s?s?s?s +?s?u?s?s?s?s?u +?l?l?l?s?u?u?u?u +?l?l?l?l?l?l?l?u?d +?d?d?l?l?l?d?d?l?l?l +?u?d?u?d?u?d?u?d?u?d +?s?s?l?d?l?d?s?s +?u?l?u?u?d?l?l?l +?d?u?u?u?u?u?u?l +?u?l?l?d?l?l?u?l +?u?l?u?l?u?d?l?l +?l?l?l?d?l?l?u?u +?u?l?u?l?u?d?u?l +?l?l?l?d?u?l?u?l +?l?l?u?d?l?l?u?l +?u?l?l?u?u?u?l?d +?u?l?l?d?u?u?l?l +?l?d?l?l?l?u?u?u +?l?u?l?d?l?l?u?l +?u?u?u?l?l?u?d?u +?l?d?u?u?l?l?l?l +?u?l?l?u?u?u?u?d +?l?d?l?l?u?l?u?l +?d?l?u?u?l?l?l?l +?u?d?l?l?l?u?u?u +?l?u?l?d?l?l?l?u +?u?u?u?u?u?d?u?l +?l?u?u?u?u?u?d?u +?u?u?l?u?l?l?l?d +?l?l?l?d?u?l?l?u +?l?u?u?l?l?d?u?l +?l?l?l?u?d?l?u?l +?d?l?l?u?l?l?l?u +?l?u?d?u?l?l?u?l +?l?u?u?u?u?d?u?u +?l?d?l?u?l?l?l?u +?u?u?d?u?u?l?l?l +?d?d?d?l?l?l?l?l?d?d?d +?u?u?u?l?l?l?d?d?d?d +?d?l?l?l?l?d?l?d?l +?l?l?l?l?s?d?s?d?d +?s?l?l?s?l?l?l?l +?l?l?l?l?l?l?s?s?d +?d?l?d?d?l?d?d?d?d?d +?d?d?d?l?d?d?l?d?d?l +?d?d?u?u?d?d?d?d?d?d +?d?d?l?d?d?l?d?d?d?l +?l?u?l?d?d?d?d?d?d?d +?d?d?d?l?d?l?d?d?d?d +?d?d?d?d?u?d?d?d?d?l +?d?l?d?d?d?d?d?l?d?d +?d?d?d?d?d?d?d?u?l?u +?l?d?d?d?l?l?d?d?d?d +?u?l?l?l?l?d?d?d?d?d?d +?d?d?d?s?d?d?s?d?d?d +?d?d?d?d?d?d?s?s?d?d +?u?l?l?d?l?l?l?l?l +?l?l?l?l?l?l?l?l?l?l?l +?u?l?s?l?l?d?d?d?d +?s?d?d?l?l?l?l?d?d +?d?d?d?d?l?l?l?s?l +?u?u?u?s?u?u?u?d?d +?l?u?u?u?u?l?l?l +?u?l?u?l?u?l?l?u +?l?d?d?d?d?d?d?d?s?l +?l?l?l?l?s?u?l?l +?u?l?u?l?u?l?d?d?d?d +?l?l?l?d?d?l?l?l?l?l +?u?l?l?l?l?d?d?d?l +?l?l?d?l?l?d?d?l?l +?l?l?l?l?l?l?s?l?d +?l?s?l?l?l?l?l?l?d +?u?l?l?s?d?d?d?d?d?d +?d?d?d?d?s?s?d?d?l +?s?d?d?d?d?s?d?d?l +?d?d?d?s?s?l?d?d?d +?d?d?s?d?d?s?l?d?d +?d?d?s?d?d?l?d?d?s +?s?u?s?d?d?d?d?d?d +?d?d?d?d?d?s?u?s?d +?l?d?d?d?d?d?s?d?s +?s?s?d?d?d?d?d?d?l +?d?d?d?s?l?s?d?d?d +?d?d?d?d?d?d?u?s?s +?d?d?d?s?u?s?d?d?d +?l?l?l?d?d?s?l?l?l +?l?l?s?l?l?s?d?d?d +?l?l?l?l?l?s?l?l?d +?l?d?d?d?l?l?l?d?d?d +?d?d?s?d?d?d?d?d?d?l +?d?d?d?d?d?d?d?s?d?l +?u?u?u?u?u?d?d?d?d?d?d +?s?s?s?d?d?d?l?l?l +?u?s?u?l?l?l?s?d +?l?l?d?s?l?l?l?s +?l?l?l?s?l?s?l?d +?u?u?u?u?u?d?s?s +?u?d?l?l?l?l?s?s +?l?l?l?l?s?d?l?s +?l?s?l?s?d?l?l?l +?l?l?l?s?s?l?l?d +?u?l?u?s?d?d?d?d?d +?d?d?l?l?l?d?d?d?s +?l?l?l?d?d?d?d?s?d?d +?u?l?d?d?d?d?s?d?l +?d?d?d?d?d?u?u?u?s +?d?d?d?d?d?l?s?l?l +?d?d?s?l?l?l?d?d?d +?u?s?u?d?u?l?l?l +?u?u?u?d?l?l?l?s +?u?l?d?l?l?s?l?l +?l?s?l?l?l?d?l?u +?u?l?s?d?l?l?l?l +?d?u?l?l?s?l?l?l +?u?l?u?l?u?l?d?s +?u?d?l?l?l?l?s?l +?s?l?l?l?u?l?l?d +?u?l?l?l?l?s?d?l +?d?l?l?u?l?l?l?s +?d?u?u?s?u?u?u?u +?u?l?l?l?d?s?l?l +?u?u?u?u?u?u?d?u?d +?u?u?u?s?u?u?u?s +?l?l?d?d?d?d?l?d?d?d +?l?l?l?l?l?l?l?l?s?d +?l?l?l?d?l?d?d?l?l +?d?d?d?d?d?d?d?d?l?l?l?l +?l?l?s?s?d?d?d?d?d +?d?d?l?l?l?d?d?s?s +?s?l?l?s?d?d?d?d?d +?u?s?u?s?u?d?d?d?d +?d?d?d?d?d?l?s?l?s +?d?d?d?d?d?l?l?s?s +?s?s?l?l?l?l?l?s +?l?l?l?l?s?l?l?u +?l?l?l?s?d?d?l?l?l +?l?l?l?l?d?d?s?s?s +?d?l?l?d?d?d?l?l?l +?d?l?l?l?d?d?d?l?l +?d?l?l?d?d?l?l?d?l +?l?d?l?l?l?d?d?d?l +?u?d?d?u?u?u?u?d?d +?d?d?l?l?l?d?d?u?u +?u?u?u?u?d?d?u?d?d +?u?l?l?d?d?d?d?u?u +?d?l?d?l?l?l?l?d?d +?l?l?u?l?u?d?d?d?d +?d?d?l?d?l?l?d?l?l +?u?l?l?d?d?u?l?d?d +?s?l?l?l?d?d?d?d?d?d +?l?l?l?l?u?l?l?u +?l?l?u?l?l?l?l?u +?l?l?u?u?u?l?l?l +?u?u?u?l?l?l?l?u +?l?l?l?u?u?u?l?l +?l?l?l?l?d?d?d?d?s?s +?s?s?u?l?l?l?s?s +?l?l?d?l?s?d?d?l +?d?d?l?s?d?l?l?l +?d?s?l?d?l?u?l?d +?s?l?u?d?l?d?l?d +?d?d?u?l?l?d?l?s +?u?l?l?d?l?d?s?d +?l?d?u?l?s?u?d?d +?u?s?u?d?d?d?l?l +?d?s?l?d?l?l?d?l +?u?l?d?s?l?d?l?d +?d?d?u?u?s?d?u?u +?l?l?l?d?s?d?l?d +?u?l?l?s?d?d?d?l +?s?l?l?d?d?d?l?l +?l?d?l?l?u?s?d?d +?u?s?l?l?u?d?d?d +?u?d?l?l?s?d?d?u +?s?d?l?d?d?l?l?l +?d?l?d?l?d?l?s?u +?u?d?l?d?l?l?d?s +?l?u?d?u?l?d?d?s +?u?l?s?d?d?d?l?u +?l?s?d?d?l?l?l?d +?u?s?d?d?u?u?d?u +?u?l?u?d?d?d?s?l +?u?d?u?u?s?u?d?d +?u?u?s?u?d?d?d?u +?l?d?u?s?l?d?l?d +?d?l?d?l?l?s?l?d +?d?d?l?u?d?s?l?l +?l?u?u?d?l?d?d?s +?u?s?u?d?u?d?u?d +?u?u?s?d?l?l?d?d +?d?d?d?l?u?u?l?s +?u?u?d?s?d?d?u?u +?d?d?d?u?u?u?s?l +?d?d?d?u?u?u?s?u +?d?d?l?d?l?l?s?l +?s?u?d?d?l?u?d?u +?u?s?u?u?l?d?d?d +?l?d?s?l?d?d?l?l +?d?d?d?u?u?l?s?l +?u?u?u?d?d?d?s?u +?d?d?l?s?l?d?l?l +?d?l?s?u?l?d?l?d +?u?d?u?u?d?d?u?s +?u?s?l?l?d?u?d?d +?d?l?d?l?l?d?u?s +?u?d?l?s?d?d?l?u +?l?s?l?d?u?d?l?d +?u?l?l?u?d?s?d?d +?u?u?u?d?s?d?d?l +?u?s?u?d?u?u?d?d +?u?d?d?u?u?u?d?s +?u?d?d?d?l?u?u?s +?l?l?d?l?d?d?s?u +?l?u?d?l?l?s?d?d +?u?l?d?l?s?l?d?d +?u?s?d?l?l?d?l?d +?u?l?u?l?d?s?d?d +?u?d?d?s?d?l?u?l +?d?d?u?l?u?s?l?d +?l?d?d?l?d?l?l?s +?u?d?u?s?u?d?u?d +?u?l?s?l?u?d?d?d +?l?u?d?l?l?d?d?s +?l?u?u?l?s?d?d?d +?l?d?d?l?d?s?l?l +?l?d?d?l?s?d?l?u +?l?d?d?l?u?u?d?s +?u?d?u?s?l?d?u?d +?d?u?l?l?l?d?d?s +?s?l?u?u?l?d?d?d +?d?s?l?l?l?d?d?u +?u?l?d?l?d?l?d?s +?s?d?d?d?l?l?l?u +?l?l?l?u?d?s?d?d +?s?u?u?d?d?l?l?d +?l?d?s?l?l?d?l?d +?l?d?l?l?s?d?l?d +?u?d?u?u?d?s?u?d +?d?l?l?d?l?s?d?u +?l?d?s?l?l?u?d?d +?u?u?d?u?d?u?d?s +?u?s?l?d?u?d?l?d +?d?d?d?l?l?s?u?u +?u?l?s?d?d?d?l?l +?d?d?d?l?u?s?u?l +?u?s?d?d?u?u?u?d +?s?l?d?l?u?u?d?d +?u?d?d?l?l?u?d?s +?s?d?d?u?l?d?l?l +?u?u?d?d?s?d?l?l +?l?s?l?u?d?l?d?d +?l?d?d?s?l?l?d?l +?u?u?s?l?d?d?d?l +?u?l?l?d?u?s?d?d +?l?d?d?l?d?l?s?l +?u?u?u?d?u?s?d?d +?d?d?u?l?u?s?d?l +?u?d?l?l?l?d?d?s +?u?s?l?d?d?l?d?l +?u?u?l?s?l?d?d?d +?s?d?u?u?u?u?d?d +?u?u?d?d?l?l?s?d +?d?d?d?u?l?u?l?s +?d?l?u?d?l?l?s?d +?u?u?d?u?d?u?s?d +?u?d?l?d?u?s?l?d +?s?d?u?l?l?d?l?d +?u?u?d?d?s?l?d?l +?d?d?u?s?u?d?u?u +?d?d?l?l?s?d?u?u +?l?l?u?l?s?d?d?d +?l?d?d?d?u?s?u?u +?l?d?u?l?l?s?d?d +?u?l?s?d?l?l?d?d +?u?u?d?u?u?d?d?s +?d?d?l?u?l?u?s?d +?u?l?d?d?s?d?l?l +?l?d?d?u?d?l?l?s +?s?l?l?d?u?u?d?d +?u?d?u?d?s?u?d?u +?u?d?l?s?d?l?d?l +?d?d?d?u?u?s?l?l +?u?u?u?d?d?d?l?s +?u?l?d?s?u?l?d?d +?l?d?d?l?d?l?s?u +?d?s?d?u?u?d?u?u +?s?d?d?d?l?u?u?u +?d?d?u?l?l?l?s?d +?d?l?l?d?d?s?l?l +?d?l?l?u?u?d?d?s +?u?d?l?u?d?l?d?s +?l?d?l?d?l?d?u?s +?u?u?s?l?u?d?d?d +?l?l?d?u?s?d?d?l +?d?d?s?l?d?l?l?l +?s?l?d?l?d?l?l?d +?l?d?u?u?s?d?d?l +?s?u?d?u?u?u?d?d +?u?l?u?d?d?l?d?s +?d?l?s?d?l?l?l?d +?s?u?l?l?d?u?d?d +?u?d?l?l?u?d?d?s +?u?s?l?d?d?l?u?d +?l?d?d?l?l?s?d?l +?d?d?s?u?l?l?l?d +?u?l?u?d?d?s?l?d +?l?s?d?l?d?d?l?l +?d?u?l?l?d?d?s?u +?d?u?u?d?l?d?s?u +?d?l?l?l?s?d?d?l +?u?l?d?d?d?l?u?s +?l?l?l?d?d?s?l?d +?u?s?u?d?d?u?u?d +?u?l?d?l?d?d?s?u +?u?d?s?l?d?l?d?u +?u?d?l?d?l?u?s?d +?s?l?u?l?d?l?d?d +?d?l?d?l?s?u?l?d +?u?d?l?u?d?d?l?s +?d?l?s?l?d?d?l?l +?u?d?u?d?u?d?s?u +?s?u?u?d?d?d?l?l +?l?d?u?d?l?d?l?s +?l?d?l?d?s?l?l?d +?u?d?l?s?l?d?l?d +?l?u?u?u?d?s?d?d +?u?l?d?d?l?s?u?d +?s?d?d?l?l?l?l?d +?s?u?l?d?d?d?l?u +?d?l?l?d?s?l?d?l +?s?l?d?u?d?l?d?l +?u?d?d?l?l?l?d?s +?d?d?l?d?l?l?u?s +?d?u?u?u?s?d?u?d +?u?u?d?s?d?d?l?l +?l?l?s?l?u?d?d?d +?l?s?l?d?d?l?l?d +?l?l?d?d?u?u?d?s +?d?u?u?l?l?d?d?s +?s?l?u?d?l?l?d?d +?u?d?s?u?u?d?d?l +?d?u?s?u?d?l?d?l +?d?l?u?d?u?l?d?s +?s?u?u?d?l?u?d?d +?d?d?u?l?s?l?l?d +?d?l?u?l?d?d?u?s +?d?u?d?d?s?u?u?u +?u?l?u?s?l?d?d?d +?u?d?l?d?l?s?d?l +?d?l?l?l?l?d?d?d?s +?d?u?l?l?u?d?d?s +?u?u?d?d?u?u?d?s +?u?d?u?d?l?s?l?d +?s?u?d?d?d?l?l?l +?d?s?l?l?l?d?d?l +?u?s?d?l?d?d?l?l +?d?d?d?d?u?u?u?u?s +?d?d?s?d?u?l?l?l +?l?s?u?d?l?l?d?d +?u?l?d?l?l?d?d?s +?d?d?l?l?l?s?l?d +?u?s?l?d?u?d?d?l +?d?d?l?l?s?d?l?l +?s?l?l?u?d?l?d?d +?d?s?d?d?l?l?u?u +?d?d?s?u?u?u?u?d +?s?l?l?l?d?u?d?d +?l?l?d?d?s?l?d?u +?l?l?s?d?d?d?u?u +?u?d?d?u?u?d?u?s +?u?d?s?l?u?d?l?d +?d?d?u?l?d?s?l?u +?d?d?u?l?d?s?l?l +?l?u?s?l?l?d?d?d +?u?u?d?l?l?d?d?s +?s?u?l?l?u?d?d?d +?u?d?s?u?u?u?d?d +?l?s?u?d?d?l?l?d +?d?d?u?u?s?u?u?d +?u?l?l?d?l?d?d?s +?u?d?l?d?l?s?u?d +?d?d?d?s?u?u?l?l +?l?d?s?d?l?l?l?d +?u?d?l?l?d?d?u?s +?d?d?l?l?l?u?s?d +?d?d?u?d?s?u?u?l +?u?s?d?d?l?d?l?l +?d?d?l?d?l?s?l?l +?s?u?u?u?d?d?d?l +?u?l?d?d?s?u?u?d +?u?u?d?d?s?u?u?d +?u?u?s?l?d?l?d?d +?d?d?u?u?u?s?d?l +?l?d?l?d?l?s?d?l +?l?l?d?d?d?l?u?s +?l?u?d?d?d?s?u?l +?u?s?u?d?d?l?l?d +?u?l?d?l?d?l?s?d +?d?d?l?l?l?d?s?l +?d?d?l?l?l?s?d?l +?u?d?l?l?s?d?l?d +?l?d?d?d?u?u?u?s +?d?l?d?s?d?u?l?l +?d?u?l?d?l?d?u?s +?d?d?l?s?l?l?d?l +?d?d?d?l?l?l?u?s +?u?d?l?s?l?u?d?d +?d?s?d?u?l?u?d?l +?l?d?l?l?s?d?d?u +?l?d?l?l?d?s?d?l +?l?l?d?l?d?s?d?l +?l?d?u?d?l?l?d?s +?d?l?d?d?s?l?l?l +?l?u?l?u?d?d?s?d +?u?s?d?l?l?d?d?l +?d?d?l?d?u?s?u?u +?u?d?l?d?l?s?l?d +?l?l?u?l?d?d?s?d +?s?u?l?l?d?d?u?d +?u?u?u?d?s?d?d?u +?d?u?l?s?d?d?l?l +?d?d?d?s?u?l?u?l +?u?u?u?l?d?d?d?s +?s?l?l?d?l?d?d?u +?d?d?s?l?l?d?l?l +?u?d?d?u?s?u?d?u +?l?d?l?l?s?d?d?l +?d?l?l?s?d?l?l?d +?l?u?l?s?d?l?d?d +?d?u?l?u?l?s?d?d +?l?d?d?l?s?l?l?d +?s?d?d?l?l?d?u?u +?u?l?u?s?d?d?d?l +?d?l?l?l?u?d?d?s +?l?d?d?l?u?s?d?u +?u?s?d?u?d?l?l?d +?u?d?l?d?s?l?u?d +?u?d?u?d?d?s?u?u +?d?u?s?d?l?u?l?d +?u?d?u?d?s?l?d?l +?l?d?l?s?d?d?l?l +?u?u?u?l?d?s?d?d +?l?s?u?l?d?l?d?d +?d?l?d?s?l?l?d?l +?s?l?l?d?d?l?l?d +?u?u?d?u?s?u?d?d +?s?l?l?u?u?d?d?d +?s?d?d?l?d?u?u?u +?u?d?d?d?s?u?l?u +?d?s?d?u?l?l?l?d +?l?d?d?u?d?s?l?l +?u?u?u?s?d?d?u?d +?u?l?u?u?s?d?d?d +?s?d?d?d?u?u?l?l +?s?u?l?d?l?d?l?d +?s?l?l?l?u?d?d?d +?d?l?d?s?d?l?l?l +?s?d?l?d?l?l?l?d +?u?d?d?d?u?u?u?s +?d?l?d?l?s?l?l?d +?d?s?u?l?d?d?l?l +?d?d?l?l?d?s?u?u +?u?d?d?s?d?l?l?u +?u?d?u?l?s?d?u?d +?u?s?l?l?d?d?d?l +?u?s?l?l?d?d?d?u +?u?d?l?d?d?u?l?s +?s?d?u?u?d?u?u?d +?l?s?d?d?l?d?l?u +?u?u?d?d?d?s?u?u +?u?l?l?d?d?s?l?d +?d?d?d?u?u?u?l?s +?d?u?u?u?u?d?d?s +?l?u?l?l?s?d?d?d +?d?s?d?u?l?d?l?u +?d?s?u?d?u?u?u?d +?u?l?u?l?u?l?u?l?d +?l?l?l?l?l?l?d?d?d?l +?l?l?l?l?l?l?l?l?u +?l?l?l?d?d?d?u?d?d +?u?d?d?u?u?u?d?d?d +?u?d?l?d?l?d?u?d?d +?u?d?d?u?d?u?d?u?d +?u?u?d?d?u?d?u?d?d +?u?d?d?d?u?u?u?d?d +?d?d?u?l?u?l?d?d?d +?u?l?l?d?d?d?d?d?u +?d?l?d?d?d?l?l?l?d +?u?d?d?d?d?d?u?u?u +?l?d?l?d?l?d?d?l?d?d +?d?u?d?l?d?l?d?l?d +?d?d?u?u?d?d?d?u?u +?u?l?d?d?d?u?l?d?d +?u?d?l?d?d?u?d?l?d +?u?l?d?d?d?d?d?u?l +?d?d?d?l?l?l?d?d?u +?u?d?d?l?d?l?d?l?d +?d?l?d?d?l?l?d?l?d +?d?d?d?l?d?l?l?l?d +?l?u?u?l?d?d?d?d?d +?u?u?d?d?l?l?d?d?d +?u?d?u?d?u?u?d?d?d +?l?l?l?d?d?d?d?u?d +?d?d?l?l?l?u?d?d?d +?u?u?l?u?d?d?d?d?d +?l?l?l?s?s?s?s?s +?s?l?l?l?l?l?s?l +?d?d?d?l?d?d?d?d?d?d?d +?d?d?d?d?d?d?d?l?d?d?d +?l?d?d?d?d?d?d?d?d?d?s +?l?l?d?d?d?d?d?d?s?s +?s?l?s?d?d?s?d?s +?l?s?s?s?s?d?d?d +?l?l?u?l?l?l?d?d?d +?u?l?d?l?l?d?u?l +?d?d?l?u?u?u?l?u +?l?l?l?u?d?u?d?u +?d?l?d?u?u?l?l?l +?l?d?u?u?l?l?d?l +?u?l?d?u?l?l?d?u +?l?u?u?u?d?d?u?l +?d?l?d?l?l?l?u?l +?u?u?l?d?d?l?u?l +?u?l?d?u?l?u?l?d +?u?l?u?d?l?d?u?l +?u?l?l?l?d?l?d?u +?d?u?d?u?l?l?l?l +?u?u?u?d?u?d?u?l +?u?d?d?l?u?l?l?l +?d?l?l?l?d?u?l?l +?u?u?u?d?l?d?u?u +?d?l?l?u?u?u?d?u +?u?l?u?l?d?l?l?d +?u?d?l?u?u?d?l?u +?u?u?l?l?l?d?u?d +?l?u?u?d?l?l?l?d +?u?u?d?u?d?u?u?l +?u?l?u?u?d?l?d?u +?u?d?l?u?d?l?l?u +?l?l?l?d?l?u?u?d +?l?l?l?u?l?d?d?u +?d?l?l?u?d?l?u?l +?d?d?l?u?l?l?u?l +?l?d?u?u?d?l?l?l +?u?l?u?d?l?u?d?u +?d?u?d?u?l?l?u?u +?l?l?d?u?u?l?d?u +?l?l?d?u?u?l?d?l +?l?d?u?l?l?u?d?l +?l?u?u?l?d?d?l?u +?u?u?d?l?l?u?l?d +?l?u?u?u?d?d?l?u +?u?u?l?d?u?l?l?d +?l?u?l?d?u?l?d?l +?d?u?u?l?l?d?u?u +?l?u?l?u?u?d?d?l +?d?l?u?u?u?u?u?d +?l?u?u?d?d?l?l?u +?l?l?d?u?d?u?l?l +?l?u?d?l?l?u?d?l +?u?l?d?l?d?u?l?u +?u?l?u?l?d?l?d?l +?d?l?u?l?u?l?u?d +?l?l?l?l?u?d?l?d +?l?d?l?l?d?u?u?u +?u?d?d?u?l?u?u?l +?d?l?d?l?l?l?d?l?l +?u?l?d?u?d?u?l?l +?l?u?u?d?l?l?d?l +?l?u?l?u?l?d?d?l +?u?l?l?d?l?d?l?u +?l?d?u?u?u?u?d?l +?u?d?u?u?u?u?l?d +?d?u?d?l?l?u?u?l +?l?d?u?l?l?u?l?d +?u?u?d?u?u?d?l?l +?l?u?d?u?l?u?l?d +?l?d?l?u?d?l?l?l +?u?d?l?u?l?u?d?l +?l?u?d?u?u?l?u?d +?d?l?d?l?u?l?u?l +?l?u?l?u?u?d?l?d +?u?d?d?l?l?l?u?l +?l?u?l?l?d?d?u?l +?l?u?l?l?d?d?u?u +?l?l?d?l?u?d?u?u +?l?u?l?l?d?d?l?u +?l?u?d?d?l?u?u?u +?u?d?u?d?l?u?u?u +?u?l?d?u?u?u?d?l +?l?d?l?u?d?u?l?l +?l?d?l?l?u?l?d?l +?l?l?l?d?l?d?u?u +?l?u?l?d?u?d?u?l +?l?l?u?d?u?l?l?d +?l?u?l?l?d?u?d?l +?l?u?d?d?l?l?u?l +?u?u?u?u?u?d?u?d?d +?u?u?l?d?l?d?l?l +?l?l?u?u?d?l?d?l +?l?u?u?l?l?d?d?l +?d?l?u?u?l?l?d?l +?u?d?l?l?l?u?l?d +?u?u?u?u?l?d?d?u +?l?u?l?d?d?u?l?l +?l?u?l?d?d?u?l?u +?l?d?l?d?l?u?l?u +?d?l?d?l?l?u?u?u +?l?u?d?u?l?u?d?u +?u?l?u?l?d?d?l?u +?l?l?d?l?l?u?u?d +?d?l?u?u?l?d?l?l +?u?l?d?u?l?d?l?u +?u?l?d?u?u?l?u?d +?d?u?l?u?d?u?l?u +?u?l?l?u?l?d?d?u +?d?u?u?l?u?u?d?u +?u?u?l?u?d?d?l?u +?u?l?d?u?l?d?u?l?d +?d?u?l?l?u?l?d?u +?u?u?u?d?u?d?l?l +?d?l?l?d?u?u?u?u +?u?d?l?u?l?d?u?l +?l?d?l?l?l?u?l?d +?l?u?d?u?l?l?d?u +?d?u?l?l?u?d?l?u +?u?u?d?d?l?l?u?l +?u?u?u?d?d?u?l?u +?u?u?l?d?d?u?u?l +?u?l?d?d?l?u?u?u +?l?l?d?l?l?u?l?d +?u?l?l?d?u?u?d?l +?u?l?l?d?u?u?d?u +?u?l?d?l?u?d?l?u +?d?d?u?u?u?l?u?l +?u?d?u?l?l?l?u?d +?d?u?l?u?u?u?l?d +?u?l?d?u?u?l?l?d +?d?l?u?u?l?l?l?d +?l?d?d?l?u?u?u?u +?l?l?u?u?d?u?d?l +?l?l?u?l?l?d?l?d +?d?l?l?l?l?u?l?d +?l?l?l?d?l?u?l?d +?l?d?u?d?l?l?u?l +?u?l?u?d?u?d?l?u +?d?l?u?d?l?u?u?u +?l?u?u?u?d?u?d?u +?l?d?l?u?l?d?l?l +?l?d?l?u?l?d?l?u +?l?l?d?u?u?l?l?d +?d?d?d?l?l?l?u?u?u +?l?l?d?u?l?d?l?l +?l?u?u?d?d?l?u?l +?u?u?d?l?u?l?d?u +?u?l?l?u?l?d?u?d +?u?u?d?l?d?u?l?l +?d?l?l?u?u?d?l?l +?l?u?d?l?l?l?u?d +?u?l?u?d?l?l?d?u +?d?l?u?u?d?u?u?u +?d?u?u?l?d?u?l?l +?u?l?l?d?u?l?u?d +?u?d?d?u?u?u?l?u +?l?d?d?u?l?l?l?u +?u?d?l?l?u?d?l?u +?u?d?u?l?u?d?l?u +?u?d?u?l?u?d?l?l +?l?l?d?l?l?u?d?l +?d?u?l?u?u?u?u?d +?l?u?l?l?d?l?l?d +?u?l?d?u?u?l?d?l +?u?l?l?l?d?u?d?u +?u?d?u?u?l?l?d?u +?u?u?l?d?d?l?l?u +?u?d?l?l?u?l?d?l +?u?d?l?l?u?l?d?u +?u?u?l?l?l?l?d?d?d?d +?u?l?d?u?l?u?u?d +?d?l?l?l?u?d?u?u +?d?d?l?u?u?u?u?l +?u?u?u?d?d?l?l?u +?u?d?u?l?u?u?l?d +?l?d?u?l?l?l?d?u +?l?d?u?l?d?l?u?l +?u?u?u?l?d?l?d?l +?u?u?d?u?u?u?u?d?d +?d?l?l?d?l?u?l?l +?u?l?u?d?u?d?u?l +?l?u?l?u?u?u?d?d +?u?l?d?u?u?u?d?u +?u?u?l?u?l?d?u?d +?l?l?l?l?d?u?d?u +?u?d?l?d?u?l?l?u +?u?d?d?u?l?u?l?l +?u?d?u?u?u?d?l?u +?l?u?d?l?d?l?u?u +?l?l?d?d?u?l?u?u +?u?d?d?l?l?u?u?l +?u?d?d?l?u?l?u?l +?d?l?d?l?l?u?l?l +?l?d?l?l?u?d?u?l +?d?d?l?u?u?l?l?l +?d?l?l?l?u?d?l?l +?l?u?d?l?l?l?l?d +?u?u?l?u?l?d?d?l +?l?u?d?l?l?d?u?l +?l?d?l?u?u?u?d?u +?l?u?l?d?u?d?l?l +?u?d?u?u?u?d?l?l +?u?l?u?d?u?l?l?d +?l?d?u?l?d?l?l?l +?l?l?d?u?d?l?l?u +?d?d?u?u?l?u?l?u +?d?l?d?u?u?u?l?u +?l?u?u?l?d?d?u?l +?l?u?u?l?d?d?u?u +?d?d?u?l?l?u?u?u +?u?u?u?l?u?l?d?d +?d?l?l?l?u?u?d?l +?u?d?d?u?u?u?u?l +?d?l?u?u?u?u?l?d +?d?l?u?l?l?l?u?d +?u?l?u?u?d?d?u?u +?u?d?d?u?u?l?l?l +?d?u?u?d?l?l?u?l +?d?u?u?d?l?l?u?u +?u?d?l?d?l?l?u?l +?l?u?u?u?l?d?u?d +?u?u?l?d?l?u?d?l +?u?u?d?d?l?u?l?l +?u?u?u?d?u?l?l?d +?l?l?l?l?u?d?u?d +?d?l?u?l?d?l?u?l +?u?l?u?l?u?d?u?d +?d?l?u?d?l?l?l?l +?u?d?l?d?u?l?u?l +?u?l?u?l?l?d?l?d +?u?d?l?u?l?d?l?l +?l?l?l?u?l?d?u?d +?l?l?l?u?u?d?d?l +?l?d?l?u?u?l?d?l +?l?l?l?u?d?u?l?d +?l?l?u?d?l?l?d?u +?d?u?l?d?u?l?l?u +?d?l?u?l?l?d?l?u +?d?d?u?u?u?l?l?u +?u?d?u?d?u?l?u?u +?u?d?u?d?u?l?u?l +?l?u?u?u?l?d?d?l +?l?l?u?d?u?u?d?u +?d?d?l?l?u?l?u?u +?l?d?l?u?d?l?u?l +?d?l?l?l?l?u?d?u +?d?l?l?l?l?u?d?l +?d?l?l?d?l?u?u?u +?d?l?l?d?l?l?u?u +?u?l?d?u?d?l?u?l +?l?d?l?u?u?d?u?l +?l?l?l?d?l?u?d?u +?l?l?d?l?d?l?u?l +?l?d?l?u?l?d?u?u +?u?u?d?u?l?u?d?l +?l?u?u?d?u?d?l?l +?l?l?d?u?l?d?u?l +?u?u?d?u?d?l?u?u +?d?d?s?d?d?d?d?s?d?d +?d?d?d?s?d?d?d?d?s?d +?d?d?s?d?d?d?d?d?s?d +?d?d?d?d?d?s?s?d?d?d +?d?s?d?d?s?d?d?s?l +?l?l?l?d?d?d?l?l?s +?l?l?l?s?d?l?l?l?l +?d?d?d?d?l?l?l?l?l?l?l +?u?l?l?d?d?u?l?l?l +?d?d?d?d?l?l?d?d?l?l +?l?d?d?l?d?l?d?d?l?d +?l?s?l?l?l?l?s?d?d +?d?d?d?s?d?d?d?s?d?d?d +?d?d?s?l?s?l?s?l +?l?l?l?s?s?d?d?s +?s?l?l?l?s?s?d?d +?d?d?s?l?l?l?s?s +?s?d?d?s?l?l?l?s +?s?u?l?l?s?d?d?s +?s?s?s?d?d?l?l?l +?l?s?l?s?l?s?l?l +?l?u?u?u?u?u?u?u?d +?u?l?l?d?d?d?d?s?s +?u?u?l?d?d?d?d?d?d?d +?d?l?d?d?l?d?d?d?d?l +?d?d?l?d?l?d?d?d?d?l +?d?d?d?d?l?d?d?d?l?l +?l?l?d?d?l?l?l?l?d?d +?u?u?u?u?u?s?u?s +?u?l?l?l?l?s?u?s +?d?s?l?s?d?s?l?s +?d?d?s?s?l?l?s?s +?s?s?s?s?l?l?d?d +?d?d?l?l?s?s?s?s +?s?s?l?l?l?l?d?d?d +?l?l?u?u?l?l?d?l +?u?l?d?u?l?u?l?u +?l?u?l?l?l?u?l?d +?l?u?l?l?d?u?l?u +?u?l?u?l?d?l?l?u +?l?u?l?l?u?l?l?l +?l?l?u?l?u?d?u?l +?u?l?l?d?l?l?u?u +?l?l?l?u?u?d?u?u +?l?u?l?d?l?u?l?l +?u?l?u?l?u?u?l?d +?u?u?d?l?u?u?u?u +?d?l?l?u?u?l?l?l +?l?u?d?u?l?l?l?l +?u?u?l?l?l?l?d?u +?u?u?l?d?l?l?l?u +?l?u?l?d?l?l?u?u +?l?u?d?l?l?u?u?l +?u?u?d?d?u?u?u?u?u +?d?l?l?l?u?l?l?u +?u?l?l?d?u?l?l?u +?u?d?u?u?u?l?l?l +?u?u?l?l?d?u?u?u +?u?u?d?l?u?l?l?l +?l?u?u?u?l?u?u?u +?u?l?l?u?l?d?l?u +?d?u?l?u?u?u?u?l +?u?u?d?l?l?l?l?u +?l?l?l?d?l?u?u?u +?u?l?l?l?u?d?u?l +?u?u?u?u?u?l?d?u +?u?u?u?u?u?l?d?l +?u?l?d?l?l?l?u?u +?l?u?d?l?l?l?l?u +?u?u?u?d?l?u?u?u +?l?u?u?u?u?u?l?d +?u?l?u?d?u?l?l?l +?u?l?l?d?u?l?u?l +?l?u?u?u?d?l?u?u +?l?d?l?u?l?l?u?l +?l?l?l?u?u?l?d?l +?l?u?d?u?u?u?u?u +?u?u?l?l?u?u?u?d +?u?u?l?l?u?u?u?u +?l?u?u?l?u?u?u?u +?u?l?l?l?d?l?u?u +?u?l?l?l?d?u?u?l +?u?d?l?l?l?l?u?u +?u?u?l?l?l?u?d?l +?u?l?l?l?u?u?l?d +?u?u?u?u?l?u?u?u +?l?s?l?l?d?l?l?s +?u?s?u?u?u?u?s?d +?s?l?l?s?l?l?l?d +?l?s?l?s?d?d?s?d?d +?d?d?d?s?s?s?l?l?l +?l?u?l?u?l?u?d?d?d +?l?l?u?u?l?l?d?d?d +?d?l?l?l?l?d?d?l?l +?u?u?d?d?d?l?l?l?l +?l?l?l?d?l?l?l?l?s +?u?u?d?d?d?d?d?d?l?l +?d?l?l?l?l?l?s?d?d +?l?s?u?l?s?l?s +?u?s?s?u?l?s?l +?u?l?s?s?l?l?s +?s?u?l?l?s?l?s +?l?l?l?u?s?s?s +?u?u?u?s?u?s?s +?u?s?l?s?u?s?u +?u?l?s?s?s?l?l +?u?s?s?l?l?s?l +?s?l?s?s?u?l?l +?u?s?u?s?s?u?u +?u?s?u?s?l?s?u +?s?s?l?u?l?s?l +?s?s?l?l?l?s?u +?l?l?s?s?l?u?s +?l?l?s?s?u?u?s +?s?u?s?u?l?s?u +?l?s?u?s?s?l?u +?s?l?s?u?s?l?l +?s?u?s?s?l?l?l +?u?l?s?l?l?s?s +?l?d?l?l?l?s?s?s +?s?l?u?s?l?s?l +?s?l?l?s?u?s?u +?s?l?l?s?u?s?l +?s?s?u?l?s?u?l +?u?s?l?s?u?l?s +?l?u?s?l?s?u?s +?l?u?l?l?s?s?s +?l?s?s?s?l?u?u +?s?s?u?l?u?l?s +?l?s?s?l?l?l?s +?l?l?s?u?s?u?s +?s?l?s?l?s?u?l +?s?l?l?s?u?l?s +?s?u?u?u?s?u?s +?l?l?l?s?s?s?u +?l?s?l?s?s?u?u +?u?s?l?s?s?l?l +?u?l?l?s?l?s?s +?s?s?s?l?l?l?u +?s?u?s?s?u?u?u +?l?u?s?l?s?l?s +?l?l?u?u?s?s?s +?l?s?l?s?u?s?l +?l?s?l?s?s?l?u +?s?u?l?s?u?s?l +?l?s?l?l?u?s?s +?s?u?s?u?u?u?s +?s?s?l?u?l?l?s +?l?l?s?s?s?u?l +?s?l?s?u?u?l?s +?s?l?l?l?s?s?u +?s?s?l?s?l?l?u +?u?l?s?u?l?s?s +?s?s?u?u?u?s?u +?s?l?u?l?s?u?s +?s?s?l?u?s?l?l +?u?s?s?u?l?l?s +?s?l?s?u?l?l?s +?u?l?l?s?s?s?l +?l?s?s?l?s?u?u +?u?u?u?s?s?s?l +?l?s?u?u?s?s?l +?l?l?u?s?s?l?s +?s?s?u?s?u?u?u +?u?s?u?l?l?s?s +?u?l?s?u?s?l?s +?l?s?u?s?u?s?l +?u?l?s?s?s?u?l +?l?s?l?u?s?s?l +?s?u?s?u?l?u?s +?u?u?l?s?l?s?s +?s?l?s?u?l?s?l +?s?u?u?u?l?s?s +?s?u?l?s?s?u?u +?u?s?u?s?u?l?s +?s?l?u?l?s?s?u +?s?s?l?l?s?l?u +?s?s?u?l?l?l?s +?u?u?l?u?s?s?s +?u?s?s?s?u?l?l +?u?l?u?u?s?s?s +?s?l?l?u?s?s?l +?s?u?l?u?u?s?s +?l?u?l?u?s?s?s +?u?u?s?s?u?s?u +?s?s?u?l?l?u?s +?u?u?s?l?l?s?s +?u?s?l?l?s?s?l +?l?u?u?u?s?s?s +?u?l?s?s?u?l?s +?l?l?l?l?l?l?d?d?l?l +?l?l?l?l?d?l?l?l?s +?u?u?u?s?u?l?l?l +?l?l?s?u?l?l?l?l +?u?l?l?l?l?s?u?u +?l?l?l?s?u?l?l?l +?l?l?d?s?l?l?s?d +?l?d?l?s?l?s?l?d +?l?d?d?l?u?s?s?u +?l?l?d?l?l?s?d?s +?l?l?l?d?d?s?s?l +?d?l?l?l?d?l?s?s +?l?d?s?l?d?s?l?l +?l?s?d?l?l?s?d?l +?l?d?l?l?s?l?d?s +?l?u?l?u?d?d?s?s +?u?l?d?d?u?l?s?s +?u?s?u?d?d?u?s?u +?d?s?l?l?l?l?d?s +?s?d?d?u?u?u?u?s +?u?l?l?u?s?d?d?s +?l?d?d?l?l?s?s?l +?l?l?l?s?l?d?s?d +?l?d?u?s?l?d?u?s +?l?l?l?d?d?s?l?s +?u?u?s?l?l?s?d?d +?d?l?l?d?l?s?l?s +?s?s?l?d?l?l?d?l +?d?d?u?u?u?u?s?s +?l?s?s?l?d?l?d?l +?s?d?s?d?l?l?l?l +?s?s?d?d?l?l?u?u +?u?l?s?u?l?s?d?d +?s?u?l?u?l?d?d?s +?u?l?s?s?l?l?d?d +?u?u?u?u?s?d?s?d +?s?u?l?u?l?s?d?d +?d?l?s?l?d?l?s?l +?l?l?l?l?l?d?d?d?l?l +?u?s?l?l?l?l?l?d?d +?d?d?l?l?s?d?d?l?l +?l?d?l?l?l?s?d?d?d +?d?d?u?l?l?l?d?d?s +?u?u?l?l?s?d?d?d?d +?s?d?l?l?l?l?d?d?d +?d?d?d?d?s?u?l?l?l +?l?d?d?l?l?l?d?d?s +?s?s?s?s?s?l?s +?s?s?l?s?s?s?s +?d?l?l?l?l?l?l?d?d?d +?d?d?d?d?d?l?d?d?l?d +?l?d?d?l?d?d?l?d?d?d?d +?u?d?u?d?d?d?d?d?d?d +?d?d?d?d?d?d?d?u?u?d +?d?d?d?u?d?d?u?d?d?d +?d?d?u?d?d?u?d?d?d?d +?d?l?d?d?d?d?d?d?d?l +?d?d?l?d?l?d?d?d?d?d +?u?d?d?u?d?d?d?d?d?d +?d?d?l?d?d?l?d?d?l?l +?l?d?l?d?d?l?d?l?d?d +?d?d?d?d?d?s?s?s?s +?u?d?l?d?l?l?l?d?d +?l?l?l?d?l?d?d?d?l +?l?l?d?d?d?l?d?l?l +?d?d?d?d?l?l?l?u?u +?d?l?l?d?l?d?d?l?l +?d?d?l?l?u?l?l?d?d +?d?l?d?d?l?d?l?l?l +?d?d?d?d?l?u?u?u?u +?d?l?l?l?d?d?l?d?l +?u?u?l?u?u?d?d?d?d +?d?u?s?l?l?l?l?l +?l?l?l?s?d?u?u?u +?u?u?l?l?u?u?s?d +?u?l?l?l?l?d?s?l +?u?l?l?d?l?s?l?l +?u?u?u?u?u?s?d?u +?l?l?l?l?l?s?d?u +?u?l?d?l?s?l?l?l +?u?u?u?d?s?l?l?l +?l?u?u?u?u?u?d?s +?d?l?l?l?l?s?u?u +?l?l?l?l?l?u?d?s +?u?l?l?d?l?l?s?l +?u?u?u?u?d?u?u?s +?d?d?s?d?l?l?l?l?l +?u?s?u?u?u?u?d?d?d +?u?l?u?l?u?l?u?l?u +?l?d?d?d?d?d?d?s?d?d +?d?d?d?d?l?d?d?d?d?s +?d?d?u?l?l?l?l?l?d +?l?l?l?l?d?d?l?l?d?d +?d?l?l?l?d?l?d?l?l +?d?d?d?u?u?l?l?l?l +?d?l?l?l?d?l?l?d?l +?d?d?d?d?d?d?l?l?l?d?d +?u?d?u?u?u?u?u?u?u +?l?l?s?d?d?l?l?l?l +?d?d?d?d?d?d?d?d?l?l?d +?d?d?d?d?l?d?d?d?d?d?d +?l?l?l?l?l?l?l?d?d?l +?l?l?l?l?d?l?l?l?l?d +?l?l?u?u?u?u?l?l +?u?u?u?u?u?l?u?u +?u?u?u?l?l?l?l?l?l +?u?d?d?d?u?d?d?u?d +?d?d?d?d?l?u?u?d?d +?d?d?d?d?l?l?u?d?d +?d?u?u?d?d?d?d?u?d +?d?d?u?d?d?d?l?l?d +?u?d?d?d?l?u?d?d?d +?d?l?l?d?d?d?d?d?u +?d?u?l?u?d?d?d?d?d +?d?u?d?d?u?d?d?u?d +?d?d?d?d?u?u?d?d?u +?d?u?d?d?d?u?d?d?l +?d?d?d?u?u?d?u?d?d +?d?d?d?u?d?u?d?d?u +?d?l?d?d?d?l?d?u?d +?u?d?d?d?u?l?d?d?d +?d?d?u?d?d?l?l?d?d +?d?u?u?d?u?d?d?d?d +?d?d?d?d?u?u?d?u?d +?l?l?d?d?d?d?u?d?d +?l?u?d?d?l?d?d?d?d +?l?d?l?u?d?d?d?d?d +?l?d?l?d?d?d?d?d?u +?l?d?d?d?l?d?d?d?u +?u?u?d?d?d?d?u?d?d +?d?d?u?d?d?d?d?u?l +?u?u?d?d?d?l?d?d?d +?u?d?d?d?d?l?l?d?d +?d?l?d?u?d?l?d?d?d +?u?d?d?d?d?l?d?u?d +?l?d?d?d?d?u?l?d?d +?d?d?d?d?d?u?l?l?d +?d?d?d?d?u?d?d?l?l +?l?l?l?d?d?d?d?l?d?d +?u?d?d?d?d?d?d?u?l +?u?d?u?d?l?d?d?d?d +?l?u?d?d?d?d?l?d?d +?d?d?d?d?l?u?l?d?d +?d?l?l?d?d?u?d?d?d +?u?l?d?d?d?d?l?d?d +?d?d?d?u?d?d?d?u?u +?d?l?d?d?d?l?d?d?u +?l?u?d?d?d?d?d?d?u +?d?u?d?d?d?l?l?d?d +?d?d?d?l?u?u?d?d?d +?d?d?d?l?l?u?d?d?d +?d?d?d?d?d?u?d?u?u +?d?l?l?d?l?d?d?d?d?d +?l?l?d?u?d?d?d?d?d +?d?d?d?d?u?d?u?d?u +?d?u?d?l?d?u?d?d?d +?d?u?d?u?d?u?d?d?d +?d?u?d?u?d?d?d?d?u +?u?d?d?l?d?d?d?d?l +?d?d?d?d?d?d?u?u?l?l +?u?d?d?d?d?u?d?d?l +?d?d?d?d?u?l?d?l?d +?d?d?l?l?d?d?d?l?d +?u?d?l?d?d?d?d?d?l +?d?d?d?l?d?d?d?u?u +?d?d?l?d?d?d?d?u?u +?d?l?d?d?d?d?d?u?u +?d?u?u?l?d?d?d?d?d +?l?d?d?u?d?d?u?d?d +?d?l?d?d?d?u?u?d?d +?d?d?u?u?d?d?l?d?d +?d?d?u?u?d?d?d?d?l +?u?l?d?d?d?u?d?d?d +?d?l?d?d?d?l?l?d?d +?d?d?u?d?d?d?l?d?l +?d?d?d?d?d?u?u?d?l +?u?d?d?d?d?u?d?u?d +?d?d?u?d?d?d?d?l?l +?l?d?d?d?u?d?d?d?l +?d?d?d?l?u?d?l?d?d +?d?u?d?l?l?d?d?d?d +?d?l?u?l?d?d?d?d?d +?l?l?l?d?d?l?l?l?s +?l?l?l?l?u?l?l?s +?d?d?d?d?d?d?d?s?s?l +?l?s?l?s?d?d?d?d?d?d +?d?d?d?d?s?d?d?s?s +?d?d?d?s?d?s?d?s?d +?d?d?d?d?s?s?d?d?s +?s?d?d?s?d?s?d?d?d +?d?d?s?d?d?s?s?d?d +?s?s?d?d?d?s?d?d?d +?d?s?d?d?s?d?d?d?s +?l?l?l?d?d?d?l?l?d?d +?u?l?d?l?l?l?l?l?l +?u?l?l?l?u?u?d?d?d +?d?d?d?d?d?d?s?s?s?s +?s?s?l?l?l?l?s?d +?s?s?s?d?l?l?l?l +?d?d?u?u?u?u?u?u?d?d +?u?u?u?u?l?l?l?l?d +?l?l?s?d?d?d?d?d?s +?l?l?s?d?d?d?s?d?d +?l?d?d?d?d?d?l?s?s +?s?s?l?l?d?d?d?d?d +?d?d?d?d?d?s?l?l?s +?u?u?u?u?l?l?l?l?l +?l?l?l?l?l?l?d?d?d?d?d?d +?d?s?l?l?l?s?l?l +?u?s?l?l?l?l?d?s +?u?l?d?l?l?l?s?s +?d?l?l?l?s?s?l?l +?l?s?l?l?l?d?l?s +?l?l?s?l?l?l?s?d?d +?d?u?l?l?l?l?s?s +?l?l?l?s?l?l?d?s +?l?s?l?l?s?l?l?d +?s?u?l?l?l?l?s?d +?u?u?s?d?d?d?d?d?d?d +?d?d?d?d?d?s?l?l?l?l +?l?l?l?d?d?d?s?l?l +?u?s?u?u?u?u?s?u +?l?l?l?d?d?d?s?d?d?d +?l?d?l?l?l?d?d?d?s +?s?u?u?u?u?d?d?d?d +?s?l?l?l?l?l?l?u +?l?l?l?l?l?u?s?u +?l?l?l?u?l?l?l?s +?l?u?u?u?u?l?u?u +?u?u?l?u?l?l?l?l +?l?l?l?l?l?l?d?s?s +?l?d?d?l?d?l?d?l?d?d +?d?d?d?u?l?l?l?d?d?d +?d?l?d?l?d?l?d?l?d?d +?u?u?u?u?d?d?d?d?d?d?d +?d?d?l?s?d?l?l?s +?l?d?s?s?d?l?l?d +?u?d?u?d?s?s?d?u +?l?d?s?l?l?d?d?s +?d?d?s?s?d?u?u?u +?l?l?s?d?d?d?l?s +?s?d?d?d?u?u?u?s +?s?s?l?d?d?d?l?l +?d?l?l?u?d?d?s?s +?d?l?s?d?l?s?l?d +?d?u?u?u?d?d?s?s +?l?l?d?d?d?s?s?l +?l?d?s?s?d?d?l?l +?u?s?d?l?d?l?s?d +?s?u?d?l?d?u?d?s +?d?l?l?d?l?s?d?s +?l?s?l?d?d?l?s?d +?u?l?s?s?l?d?d?d +?u?s?u?u?s?d?d?d +?u?d?u?u?d?d?s?s +?d?l?d?d?l?s?l?s +?l?d?l?d?l?s?s?d +?l?s?s?l?l?d?d?d?d +?l?l?s?l?d?d?d?s +?l?d?l?l?d?d?s?s +?s?s?l?l?d?l?d?d +?u?u?s?d?d?s?d?u +?s?d?l?u?d?l?d?s +?l?d?d?d?s?s?l?l +?l?d?s?d?s?d?l?l +?l?s?l?s?d?d?d?l +?s?s?l?d?d?l?l?d +?l?s?l?d?s?l?d?d +?s?l?d?s?l?d?d?l +?s?d?l?u?d?d?l?s +?s?l?l?u?d?d?d?s +?l?d?s?l?l?d?s?d +?u?l?d?s?s?u?d?d +?u?d?d?l?d?l?s?s +?d?l?s?l?u?d?d?s +?l?d?d?d?l?s?s?l +?s?l?l?s?d?d?l?d +?s?u?l?d?d?l?d?s +?s?l?l?s?d?d?d?u +?l?l?s?s?d?d?d?l +?d?d?l?d?l?l?s?s +?l?d?l?d?s?s?u?d +?s?l?u?l?s?d?d?d +?s?d?l?l?d?l?s?d +?d?l?d?l?s?l?s?d +?d?d?s?d?l?l?l?s +?d?s?l?l?d?d?s?l +?d?l?d?d?l?l?s?s +?u?u?s?u?d?s?d?d +?d?d?l?s?l?d?s?l +?l?d?l?d?u?d?s?s +?u?d?l?d?l?s?s?d +?l?d?d?s?d?l?s?l +?d?l?l?l?s?d?d?s +?s?s?d?l?d?l?d?l +?l?s?s?l?d?d?d?l +?d?l?l?s?d?l?d?s +?d?d?d?s?s?u?l?l +?l?s?d?s?d?l?l?d +?d?s?d?u?s?d?u?u +?s?u?d?d?l?l?d?s +?u?l?u?d?s?d?s?d +?l?l?l?d?d?s?s?d +?d?u?d?u?d?s?s?u +?d?u?l?d?s?d?u?s +?s?l?s?l?d?l?d?d +?l?l?u?s?d?d?d?s +?d?s?l?d?l?l?s?d +?s?u?d?u?l?d?d?s +?u?l?s?d?d?d?l?s +?l?s?l?l?d?d?d?s +?s?d?d?d?s?u?u?u +?l?s?d?d?d?l?s?l +?d?s?d?l?l?l?s?d +?u?l?d?u?d?d?s?s +?l?l?d?d?d?l?s?s +?s?s?d?d?d?u?u?u +?u?d?s?l?d?s?u?d +?u?u?l?s?s?d?d?d +?s?d?d?l?s?d?l?l +?s?u?d?d?d?l?l?s +?d?d?l?l?s?l?d?s +?d?l?l?l?d?s?s?d +?s?l?d?s?d?l?d?l +?s?u?l?u?d?d?d?s +?s?d?u?u?u?s?d?d +?d?s?u?d?d?l?u?s +?u?d?s?u?u?s?d?d +?d?s?s?d?l?d?l?l +?d?u?l?u?d?s?d?s +?u?s?d?l?d?d?s?l +?u?l?s?s?d?u?d?d +?u?s?u?u?d?s?d?d +?l?d?l?s?l?d?d?s +?d?d?u?s?d?l?u?s +?l?s?l?l?d?s?d?d +?u?d?l?d?u?s?s?d +?l?d?l?u?d?s?s?d +?d?s?u?l?l?s?d?d +?u?u?d?d?d?l?s?s +?s?u?d?u?d?d?u?s +?d?d?s?d?u?s?u?u +?l?d?d?l?s?l?d?s +?l?d?d?l?s?l?s?d +?d?l?l?d?d?l?s?s +?l?d?u?s?s?d?l?d +?l?d?s?l?s?l?d?d +?d?u?l?d?s?s?d?l +?u?u?s?d?u?d?s?d +?u?u?l?d?d?d?s?s +?s?d?u?d?u?d?s?l +?u?d?l?s?l?d?s?d +?d?s?l?l?s?d?l?d +?s?u?d?s?u?d?u?d +?s?l?l?u?s?d?d?d +?u?l?d?d?s?d?u?s +?s?d?u?d?u?u?d?s +?d?d?l?d?s?s?l?l +?u?s?s?u?l?d?d?d +?s?d?u?l?l?d?d?s +?d?u?l?l?d?d?s?s +?s?l?l?d?l?s?d?d +?u?d?u?s?l?s?d?d +?d?d?s?l?l?s?l?d +?l?l?d?d?s?l?s?d +?l?l?d?s?l?d?d?s +?d?s?d?l?s?l?l?d +?u?u?s?s?d?d?d?l +?d?d?u?u?s?s?d?u +?l?l?s?d?d?s?d?l +?d?s?d?d?l?l?s?l +?u?l?l?d?s?d?d?s +?s?s?u?d?u?d?d?u +?s?l?d?l?d?l?s?d +?s?d?d?l?s?l?l?d +?u?u?u?s?d?d?d?d?s +?d?l?s?l?l?d?d?s +?l?d?l?s?d?s?l?d +?u?s?u?s?l?d?d?d +?s?l?d?l?s?d?d?l +?d?l?d?s?s?u?l?d +?u?s?d?l?l?s?d?d +?d?l?l?l?s?s?d?d +?s?u?l?u?s?d?d?d +?u?u?u?d?s?d?s?d +?d?u?l?l?s?d?s?d +?u?s?s?l?d?l?d?d +?l?l?l?d?d?s?d?s +?u?d?u?d?d?s?u?s +?d?l?d?l?u?d?s?s +?l?l?d?d?s?d?s?l +?d?l?l?l?s?d?s?d +?s?u?d?d?l?d?l?s +?d?l?s?d?d?s?l?l +?l?u?l?s?d?s?d?d +?d?s?d?d?s?u?u?u +?d?s?l?l?d?l?s?d +?u?d?l?s?s?l?d?d +?l?d?s?s?l?d?l?d +?u?s?d?u?s?d?u?d +?l?s?d?d?s?l?l?d +?s?s?l?d?l?l?d?d +?d?d?d?u?l?u?s?s +?u?d?l?d?s?s?l?d +?s?u?l?s?d?d?l?d +?d?d?u?l?s?l?s?d +?u?l?d?d?u?d?s?s +?s?u?l?d?d?d?u?s +?s?u?d?l?l?d?d?s +?s?l?d?l?s?d?l?d +?d?l?s?l?l?s?d?d +?s?d?d?l?l?l?d?s +?l?l?d?s?d?l?s?d +?u?s?u?l?s?d?d?d +?s?s?u?u?u?d?d?d +?d?s?l?d?l?d?s?l +?l?d?s?s?l?d?d?l +?l?s?d?l?l?d?s?d +?d?l?s?d?s?d?l?l +?u?d?l?l?d?s?d?s +?s?u?d?l?l?s?d?d +?l?s?d?l?d?l?d?s +?s?s?d?d?u?u?d?l +?s?d?l?l?d?d?l?s +?u?s?u?s?d?d?d?u +?d?d?l?l?d?l?s?s +?u?d?s?l?l?d?s?d +?d?d?l?d?u?l?s?s +?u?d?l?u?d?d?s?s +?l?d?s?d?l?l?d?s +?l?s?l?s?d?u?d?d +?u?d?d?d?l?l?s?s +?s?l?l?d?s?l?d?d +?d?s?s?u?l?l?d?d +?d?l?l?l?d?s?d?s +?d?s?d?u?l?l?s?d +?s?l?d?u?s?d?d?l +?l?d?d?s?l?d?s?l +?d?l?d?s?l?d?l?s +?u?u?l?s?d?d?d?s +?d?d?s?l?s?d?l?l +?l?d?d?l?l?d?s?s +?d?s?d?l?l?d?s?l +?s?d?l?l?u?s?d?d +?l?l?s?d?s?l?d?d +?u?d?l?d?s?s?u?d +?s?d?l?l?l?d?s?d +?s?d?d?u?u?s?u?d +?l?s?l?d?l?d?d?s +?s?u?d?d?u?u?d?s +?d?l?l?s?l?d?s?d +?u?s?d?d?l?s?u?d +?u?u?s?l?s?d?d?d +?d?d?s?s?l?l?l?d +?s?d?s?d?d?l?l?l +?l?l?d?d?d?s?l?s +?l?s?l?d?d?d?s?u +?l?s?l?d?d?d?s?l +?s?d?l?d?l?s?d?l +?d?d?d?l?l?s?l?s +?s?d?l?l?l?s?d?d +?u?s?d?l?d?s?l?d +?u?d?u?l?s?d?d?s +?l?d?l?d?s?s?d?l +?s?d?s?d?d?u?u?u +?d?l?d?l?s?s?d?l +?d?l?l?l?d?d?s?s +?d?d?d?u?s?l?l?s +?u?d?u?d?u?d?s?s +?l?d?l?l?d?s?d?s +?u?s?l?l?d?d?d?s +?l?s?l?s?d?d?l?d +?l?l?s?d?d?l?s?d +?l?d?l?d?d?l?s?s +?l?s?s?d?u?l?d?d +?u?d?d?l?l?d?s?s +?s?u?l?d?u?s?d?d +?l?l?d?s?d?s?l?d +?d?s?l?l?s?l?d?d +?d?s?d?s?d?u?u?u +?d?d?d?d?d?u?l?l?l?l +?l?l?l?l?s?d?l?l?l +?u?l?l?l?d?d?d?l?l +?u?d?l?l?d?l?l?l?d +?d?l?d?l?l?l?l?d?l +?u?d?d?d?l?l?l?l?l +?l?l?l?l?s?s?s?d?d +?d?d?l?d?l?d?l?d?s +?l?d?l?d?l?s?d?d?d +?d?d?l?l?l?d?s?d?d +?d?l?d?l?d?l?d?d?s +?d?l?d?d?l?d?d?l?s +?l?s?l?l?d?d?d?d?d?d +?u?u?u?d?d?d?s?d?d +?d?d?d?d?l?l?l?d?s +?l?d?l?d?d?l?d?d?s +?d?l?s?l?l?d?d?d?d +?d?d?u?l?l?s?d?d?d +?u?l?l?d?s?d?d?d?d +?d?s?d?d?d?d?l?l?l +?d?d?d?d?u?l?l?s?d +?u?d?l?l?d?d?d?d?s +?u?s?u?d?u?d?d?d?d +?d?d?d?d?d?l?l?s?l +?l?l?l?l?l?l?l?l?d?l +?u?u?u?u?u?s?d?d?d?d +?l?d?l?d?d?d?l?d?d?d +?d?d?d?d?l?d?l?d?l?d +?d?l?d?d?l?l?d?d?d?d +?u?u?d?d?d?d?d?d?d?u +?d?l?d?d?d?l?l?d?d?d +?l?d?d?l?d?d?d?l?d?d +?d?d?l?d?d?l?d?d?l?d +?s?d?s?d?s?d?s?s +?s?s?s?d?d?d?s?s +?d?d?d?d?d?d?d?d?s?l?l +?u?l?d?d?l?l?l?l?l +?u?l?d?s?l?d?l?l +?s?l?d?l?d?l?l?l +?l?d?s?l?l?l?d?l +?s?d?u?l?d?l?l?l +?d?d?s?l?l?l?u?u +?u?l?d?d?l?u?s?u +?u?d?l?l?l?u?s?d +?u?l?d?l?l?s?l?d +?u?d?s?l?u?d?l?l +?u?u?s?u?u?d?u?d +?s?u?l?l?l?u?d?d +?u?s?u?d?u?d?u?u +?u?s?u?u?l?d?d?l +?u?u?l?l?u?s?d?d +?u?l?u?u?u?s?d?d +?u?l?s?l?u?l?d?d +?u?l?l?s?l?d?d?l +?l?u?l?l?u?s?d?d +?u?l?l?l?d?l?d?s +?l?l?d?d?u?u?u?s +?l?l?s?u?d?l?d?u +?u?d?u?u?u?u?d?s +?u?s?l?l?u?l?d?d +?d?u?u?d?u?u?u?s +?u?s?u?u?d?u?u?d +?u?l?l?d?s?l?d?l +?u?d?u?s?u?d?u?u +?d?u?s?u?l?l?l?d +?l?s?l?l?u?l?d?d +?d?d?u?l?u?l?u?s +?u?l?l?d?s?u?l?d +?u?s?d?l?l?l?d?l +?l?d?s?l?l?d?l?l +?u?s?d?d?u?u?u?u +?u?u?s?u?l?l?d?d +?l?u?s?l?l?l?d?d +?u?u?u?u?d?d?u?s +?u?d?u?d?u?u?u?s +?s?d?u?u?u?u?d?u +?u?l?l?d?l?l?d?s +?s?d?u?l?l?d?l?u +?u?d?l?l?l?s?d?l +?u?d?l?l?l?d?u?s +?d?u?u?u?u?u?s?d +?s?u?l?d?d?l?l?l +?l?u?u?l?l?d?d?s +?u?u?s?l?d?d?l?l +?u?u?s?u?u?u?u?d?d +?u?d?s?l?d?l?l?l +?d?u?l?l?l?l?s?d +?l?d?l?d?l?s?u?u +?u?l?d?d?l?s?u?l +?u?u?s?d?d?u?u?u +?l?l?d?l?d?s?l?l +?u?u?u?d?d?u?u?s +?u?s?u?u?d?d?u?u +?d?d?s?u?u?u?l?l +?l?l?l?u?s?u?d?d +?u?u?u?u?d?d?s?u +?u?d?d?l?s?l?l?l +?l?s?l?l?l?u?d?d +?s?u?u?l?l?l?d?d +?l?l?d?u?s?l?d?l +?l?l?l?d?l?d?s?l +?s?u?l?l?l?d?d?l +?u?l?u?u?l?s?d?d +?u?l?d?l?s?l?l?d +?d?s?l?l?d?l?l?l +?u?d?d?u?u?u?u?s +?u?s?l?d?l?d?l?l +?u?l?s?l?l?d?l?d +?u?u?s?d?d?u?l?l +?l?s?d?l?l?l?d?l +?d?l?l?l?l?s?u?d +?u?l?d?u?d?l?l?s +?d?d?s?l?u?l?u?l +?s?l?d?l?l?l?d?l +?u?s?u?u?u?d?u?d +?u?u?d?u?s?d?u?u +?l?l?u?u?u?s?d?d +?d?l?s?l?l?d?l?l +?u?d?l?d?s?l?l?l +?u?u?u?s?u?d?u?d +?l?l?l?u?u?d?d?s +?u?u?u?u?d?s?d?u +?s?l?u?l?l?l?d?d +?u?d?d?u?s?l?l?l +?u?l?d?l?d?l?l?s +?u?l?u?l?s?l?d?d +?u?u?u?u?l?s?d?d +?u?l?s?l?d?l?l?d +?u?l?u?u?l?d?d?s +?u?d?l?d?u?u?l?s +?u?u?u?d?u?u?d?s +?d?l?l?l?l?l?l?d?s +?u?u?d?l?d?l?l?s +?d?d?l?l?l?l?s?u +?u?d?l?l?d?s?u?u +?l?l?l?s?d?l?d?l +?d?l?l?d?s?l?l?u +?d?d?u?u?u?s?u?u +?u?l?l?l?l?l?l?l?l?l +?u?l?l?l?l?s?s?l +?u?u?u?s?s?u?u?u +?s?s?u?u?u?u?u?u +?u?u?u?u?s?s?u?u +?l?u?l?u?u?d?d?d?d +?u?d?l?d?l?l?d?l?d +?d?l?d?l?l?d?d?l?l +?d?d?u?l?l?u?l?d?d +?d?d?l?d?l?l?l?d?l +?u?d?l?u?l?l?d?d?d +?l?l?l?d?l?d?d?l?d +?d?d?l?l?d?l?l?d?l +?d?l?l?l?d?l?d?d?l +?u?d?l?l?l?d?l?d?d +?l?u?u?u?l?d?d?d?d +?u?d?u?u?d?u?d?u?d +?d?l?d?l?d?d?l?l?l +?u?u?u?s?u?u?u?u?u +?s?s?l?l?l?l?l?d?d +?d?d?d?d?d?d?d?d?d?l?s +?s?u?l?l?l?l?l?d?d +?l?l?s?s?s?s?d?d +?s?s?l?l?s?s?d?d +?s?s?d?d?l?l?s?s +?d?l?s?s?l?s?s?d +?s?s?d?d?s?s?l?l +?s?s?s?s?d?d?l?l +?l?d?l?d?s?s?s?s +?l?s?s?l?s?s?d?d +?d?d?u?l?l?l?l?l?d?d +?u?u?u?u?d?u?l?l +?l?d?l?l?u?u?u?u +?u?l?l?l?d?d?u?l?l +?l?l?d?u?l?u?l?l +?u?l?u?d?l?u?l?u +?l?l?u?u?u?u?d?u +?u?u?l?u?d?l?l?u +?l?u?l?l?u?l?l?d +?u?d?u?l?l?l?l?u +?l?l?u?l?l?l?u?d +?u?d?l?u?u?u?u?u +?l?u?u?u?u?l?d?l +?u?l?l?u?u?u?d?u +?l?l?l?u?d?u?u?l +?l?l?u?l?d?u?u?l +?u?l?u?l?u?d?u?u +?l?u?l?l?u?l?d?l +?u?l?u?u?u?u?d?u +?l?d?u?l?l?u?l?l +?u?u?u?l?l?d?u?l +?u?l?l?d?u?u?u?u +?u?u?l?u?l?u?l?d +?l?l?d?u?l?l?l?u +?u?u?d?u?u?l?u?u +?l?l?u?d?u?l?l?l +?u?d?u?u?l?l?u?u +?u?d?u?u?l?l?u?l +?u?u?l?l?u?u?d?l +?u?u?u?l?l?u?d?l +?l?l?u?d?l?l?l?u +?l?u?u?u?l?d?l?u +?l?u?l?u?l?u?d?l +?l?l?u?u?l?u?l?d +?l?u?u?u?d?u?l?u +?u?l?u?l?l?l?d?u +?l?u?l?u?d?u?l?u +?l?u?l?l?u?l?d?u +?d?l?u?u?l?l?l?u +?l?u?u?u?l?u?u?d +?u?d?l?l?u?l?l?u +?l?l?l?l?u?d?l?u +?l?u?u?l?l?l?d?u +?u?l?d?l?l?l?u?l +?u?l?l?l?l?l?d?d?u +?u?l?u?u?d?l?u?u +?l?d?l?u?l?u?u?u +?l?d?u?l?l?l?u?l +?u?u?l?l?u?d?l?l +?u?u?u?l?d?u?l?l +?u?u?u?l?d?u?l?u +?l?l?l?l?l?l?l?d?l?d +?u?l?d?u?l?u?u?u +?u?l?u?d?u?l?l?u +?l?l?l?d?l?u?u?l +?l?l?l?u?d?l?u?u +?u?u?u?l?u?u?d?l +?l?l?l?d?u?u?l?l +?l?u?d?u?l?l?u?u +?l?u?l?d?u?l?l?l +?u?l?l?l?d?u?l?u +?u?l?d?l?u?l?l?u +?u?u?l?l?u?u?l?d +?l?u?u?u?u?d?u?l +?l?u?d?l?l?u?l?l +?u?l?u?u?l?u?d?u +?l?l?l?u?l?l?d?u +?u?l?l?u?d?u?l?l +?u?u?l?u?u?u?d?l +?l?l?u?u?d?l?u?l +?l?l?l?u?d?u?l?l +?l?u?u?l?u?u?u?d +?u?u?u?u?u?l?u?d +?u?d?l?l?l?l?u?l +?u?l?u?u?l?u?l?d +?l?u?u?u?l?l?d?l +?u?u?u?u?l?u?u?d +?d?l?u?l?l?u?l?l +?l?l?u?l?l?u?l?d +?u?l?d?u?u?u?u?u +?l?l?u?u?d?u?l?l +?l?d?d?d?d?d?d?d?s?s +?s?l?l?l?l?l?l?d?s +?u?u?d?u?u?u?u?u?u +?u?l?d?d?d?d?d?d?d?s +?l?l?l?d?l?l?l?d?d?d +?u?d?l?l?l?s?l?l +?u?l?l?l?u?u?s?d +?l?l?l?l?l?d?s?u +?u?l?u?l?l?l?s?d +?d?u?l?l?s?u?l?l +?u?l?l?l?s?u?u?u +?d?u?u?u?s?l?l?l +?u?l?l?l?l?d?s?u +?s?l?l?l?u?d?l?l +?l?l?l?l?l?s?u?l +?l?l?l?l?u?u?s?d +?u?d?u?u?u?u?u?s +?s?d?u?l?l?u?l?l +?u?l?l?s?l?l?d?l +?u?u?s?u?u?d?u?u +?l?l?l?d?l?s?s?s +?s?l?l?l?l?s?s?d +?s?l?l?l?l?s?d?s +?s?s?d?d?d?d?d?d?d?d?d +?u?l?l?l?l?l?l?d?d?d?d +?d?l?l?d?l?d?l?l?l +?u?l?l?d?l?l?l?d?d +?l?l?l?l?l?d?d?u?u +?u?l?l?l?d?l?l?d?d +?l?l?l?l?d?d?d?s?l +?u?s?l?l?l?l?d?d?d +?l?l?l?l?s?d?d?s?d +?d?d?d?d?d?d?u?l?u?l +?l?d?d?d?l?l?d?d?d?l +?l?l?l?l?l?d?l?d?s +?l?s?l?s?s?s?l +?s?l?u?s?l?s?s +?u?l?s?l?s?s?s +?u?u?s?s?s?l?s +?s?u?l?s?s?s?l +?u?s?s?u?s?u?s +?l?s?u?s?u?s?s +?u?u?s?s?l?s?s +?l?s?u?s?s?u?s +?l?s?u?u?s?s?s +?u?s?l?s?u?s?s +?s?s?l?l?u?s?s +?s?s?s?u?l?u?s +?s?s?s?l?l?s?l +?s?u?l?l?s?s?s +?s?u?s?s?u?u?s +?s?s?l?l?s?l?s +?u?s?u?s?s?l?s +?s?l?l?s?u?s?s +?s?l?s?s?l?s?l +?l?l?s?s?s?l?s +?l?s?s?s?l?l?s +?s?s?l?s?l?s?l +?s?l?l?s?l?s?s +?s?s?l?s?s?u?u +?u?s?l?s?s?s?l +?u?s?s?s?u?s?u +?s?u?s?s?l?u?s +?l?s?s?u?s?s?l +?l?s?l?s?s?u?s +?s?l?u?s?u?s?s +?s?s?u?s?l?l?s +?u?l?l?l?s?s?s?s +?u?s?s?s?s?u?u +?s?s?s?u?u?l?s +?s?s?s?u?l?l?s +?s?u?s?s?u?s?l +?u?s?u?s?s?s?u +?s?s?u?s?l?s?u +?u?l?s?u?s?s?s +?s?u?s?u?s?s?u +?s?s?u?u?s?u?s +?l?s?u?s?s?l?s +?s?s?l?l?l?d?s?s +?s?s?s?s?l?l?u +?u?s?s?l?s?l?s +?s?l?s?u?l?s?s +?s?l?s?s?s?l?u +?s?s?s?s?u?l?l +?s?l?s?s?l?l?s +?u?u?s?u?s?s?s +?s?u?s?u?s?l?s +?u?u?l?s?s?s?s +?s?l?s?l?s?s?l +?l?l?l?l?u?l?u?l +?u?l?u?l?u?u?l?u +?u?u?u?u?u?l?l?u +?u?l?u?l?u?u?u?u +?u?l?u?l?l?l?l?l?d +?d?d?d?u?u?u?u?u?u?u +?l?d?s?l?d?s?l?d?s +?d?l?l?s?s?s?d?l +?l?s?d?d?s?l?s?l +?l?l?s?l?s?s?d?d +?s?l?s?l?l?s?d?d +?l?l?l?l?l?s?l?l?l?l +?d?s?d?l?l?l?l?l?l +?d?d?s?u?u?u?s?d?d +?u?u?l?l?l?l?l?l?l +?l?l?l?l?l?l?l?d?l?l +?s?l?l?l?s?l?l?s +?d?d?d?d?d?d?s?d?d?l +?s?u?d?d?d?d?d?d?d?d +?u?d?d?d?d?s?d?d?d?d +?l?d?d?d?d?d?s?d?d?d +?s?d?d?d?d?d?d?d?d?u +?d?d?d?d?d?d?l?s?d?d +?d?d?d?d?l?s?d?d?d?d +?l?l?d?d?d?d?s?l?l +?d?s?d?d?d?l?l?l?l +?l?l?d?d?s?d?d?l?l +?d?d?l?s?l?l?l?d?d +?l?l?s?d?d?d?d?l?l +?l?s?l?l?l?l?d?s +?l?l?l?s?l?d?l?s +?d?l?l?l?l?s?l?s +?s?d?u?l?l?l?l?s +?s?u?u?u?u?u?s?d +?l?s?l?d?s?l?l?l +?s?s?u?l?l?l?l?d +?l?s?d?s?l?l?l?l +?s?l?s?l?l?l?l?d +?l?d?l?l?l?s?l?s +?d?l?l?l?s?l?l?s +?d?l?d?d?d?d?d?d?d?d?d +?u?l?l?l?l?d?l?l?d +?l?l?d?l?d?l?d?d?d?d +?s?d?d?d?d?d?d?s?d?d +?s?d?d?d?s?d?d?d?d?d +?s?d?s?d?d?d?d?d?d?d +?d?d?d?s?d?d?d?s?d?d +?l?d?l?l?l?l?s?d?d +?s?s?l?l?l?l?l?s?s +?d?d?d?d?d?d?u?u?u?d +?d?d?d?d?d?l?d?l?l?d +?l?d?d?d?l?d?d?d?l?d +?d?d?d?d?d?d?l?d?l?l +?u?u?u?u?d?u?u?d?d +?l?l?l?l?l?s?l?u +?u?l?l?l?u?l?l?l?d?d +?l?l?l?l?l?s?d?d?l +?l?d?d?d?d?s?d?d?l +?l?d?d?d?d?d?d?u?s +?u?d?d?u?s?d?d?d?d +?l?d?d?d?s?u?d?d?d +?u?d?d?d?u?d?d?d?s +?u?d?d?d?d?d?s?d?u +?l?d?u?d?s?d?d?d?d +?u?d?d?d?d?u?d?d?s +?d?s?d?l?d?d?d?d?l +?s?d?l?l?d?d?d?d?d +?s?l?d?d?u?d?d?d?d +?d?d?d?d?s?d?l?l?d +?u?d?d?s?u?d?d?d?d +?l?d?d?l?d?d?d?s?d +?s?l?d?l?d?d?d?d?d +?d?d?d?d?d?s?d?u?u +?s?l?d?d?d?d?d?d?u +?d?s?d?d?u?l?d?d?d +?s?d?d?l?d?d?d?u?d +?s?d?d?d?d?d?d?u?u +?d?d?d?s?d?d?d?u?u +?l?d?d?d?d?l?d?d?s +?s?d?d?d?d?u?l?d?d +?u?d?d?l?d?d?d?d?s +?d?l?s?l?d?d?d?d?d +?d?d?s?d?d?l?d?d?l +?d?d?d?d?l?d?l?d?s +?u?u?u?d?d?d?d?d?d?s +?d?d?d?d?u?s?d?u?d +?d?d?u?d?d?s?l?d?d +?u?s?d?l?d?d?d?d?d +?d?d?d?d?u?d?d?s?u +?u?l?d?d?d?d?s?d?d +?d?l?d?d?d?l?s?d?d +?d?l?l?s?d?d?d?d?d +?l?s?d?d?d?l?d?d?d +?d?l?d?l?s?d?d?d?d +?d?d?d?d?d?l?d?l?s +?u?l?d?d?d?s?d?d?d +?l?d?l?s?d?d?d?d?d +?s?l?u?d?d?d?d?d?d +?d?d?d?d?s?d?d?u?u +?s?d?d?d?d?l?l?d?d +?l?d?d?d?s?d?d?l?d +?d?d?d?l?l?d?d?s?d +?d?d?d?l?d?d?d?s?l +?d?d?s?d?l?d?l?d?d +?d?d?d?u?u?s?d?d?d +?d?l?d?l?d?d?d?d?s +?d?d?l?l?d?d?s?d?d +?d?d?d?l?s?d?d?d?l +?d?u?u?s?d?d?d?d?d +?l?d?l?d?d?d?d?s?d +?d?d?d?d?s?u?d?d?u +?u?d?d?d?d?d?d?s?l +?l?d?s?l?d?d?d?d?d +?s?d?d?d?d?l?d?l?d +?s?d?d?d?l?l?d?d?d +?d?d?d?u?d?l?s?d?d +?d?u?d?s?d?d?d?u?d +?d?s?d?d?d?d?d?u?u +?l?d?d?s?d?d?l?d?d +?d?d?d?d?d?s?l?d?l +?u?d?d?d?s?d?d?u?d +?d?d?s?d?d?l?l?d?d +?l?d?d?d?d?d?u?d?s +?d?d?l?d?l?s?d?d?d +?d?d?d?u?u?d?d?s?d +?l?d?d?l?d?d?d?d?s +?s?l?d?d?d?l?d?d?d +?d?d?d?d?d?s?l?l?d +?l?d?d?s?d?d?d?d?l +?u?d?d?d?s?u?d?d?d +?u?l?d?s?d?d?d?d?d +?d?l?d?d?d?d?l?s?d +?d?d?d?u?s?d?d?d?u +?d?d?s?d?d?d?d?u?u +?u?d?d?d?s?d?u?d?d +?d?d?l?l?d?d?d?s?d +?l?u?d?d?d?d?d?d?s +?l?d?d?d?u?d?d?d?s +?d?d?d?d?u?s?d?d?u +?s?d?d?d?d?d?d?l?u +?d?d?d?d?d?l?l?s?d +?d?d?u?d?d?s?d?d?u +?l?l?l?s?l?l?s?d?d +?l?l?l?l?s?l?s?d?d +?d?d?d?l?l?l?l?l?l?d +?l?l?d?d?l?l?d?d?l?l +?u?s?l?l?l?l?l?s +?l?l?l?l?l?d?l?l?s +?l?s?l?l?l?l?s?s +?s?l?s?l?l?l?l?s +?l?d?d?d?d?d?d?u?d?d +?d?d?d?d?d?d?d?u?d?u +?l?l?s?s?l?l?s?s +?u?u?u?u?u?s?u?u?u +?l?l?l?d?l?l?l?l?l?l +?d?d?d?d?d?l?l?l?l?l?l +?u?l?d?d?l?u?d?d?d +?u?d?u?l?u?d?d?d?d +?u?l?d?l?d?d?l?d?d +?d?d?d?l?l?d?d?u?u +?d?d?d?l?l?d?l?d?l +?d?d?l?d?d?l?l?d?l +?d?d?u?d?l?l?l?d?d +?u?l?l?d?u?d?d?d?d +?l?d?d?l?l?d?d?l?d?d +?u?d?l?d?u?d?l?d?d +?d?l?l?l?d?d?d?d?u +?d?l?l?d?d?d?l?l?d +?d?d?d?d?u?d?u?u?u +?u?d?l?d?d?l?d?l?d +?u?u?d?d?u?d?d?u?d +?u?l?l?d?d?d?d?d?l +?u?u?d?d?d?u?u?d?d?d +?l?d?l?l?u?d?d?d?d +?u?d?u?u?d?u?d?d?d +?u?d?d?d?d?l?l?l?d +?d?d?d?l?l?l?u?d?d +?u?d?l?d?l?u?d?d?d +?d?u?u?d?d?l?l?d?d +?u?d?d?u?u?d?u?d?d +?d?u?d?l?d?l?d?u?d +?d?d?u?u?d?d?d?l?l +?u?u?d?d?d?u?d?d?u +?u?u?d?d?d?d?u?u?d +?l?l?d?l?d?d?d?d?u +?u?l?d?l?u?d?d?d?d +?u?d?d?d?l?l?l?d?d +?d?d?d?d?d?l?u?u?u +?d?d?d?u?l?u?l?d?d +?u?d?l?d?d?l?d?d?l +?d?u?l?d?d?u?l?d?d +?l?d?d?l?u?l?d?d?d +?u?d?d?d?u?d?u?u?d +?u?d?l?d?l?d?d?l?d +?u?d?l?d?u?d?d?l?d +?l?d?l?l?d?u?d?d?d +?u?d?l?l?d?d?l?d?d +?d?d?l?d?u?l?d?d?u +?d?d?d?d?u?l?d?l?l +?u?d?l?u?l?d?d?d?d +?d?d?d?u?d?d?l?l?l +?l?l?u?l?d?d?d?d?d +?u?d?u?d?d?u?d?u?d +?l?d?d?d?d?d?u?l?l +?d?d?d?u?u?l?l?d?d +?d?d?d?l?d?l?d?l?l +?u?d?d?u?d?u?d?d?u +?d?d?d?d?d?d?s?d?d?d?d?d +?l?l?l?l?d?d?u?u?u +?u?l?s?l?l?l?d?d?d +?u?l?l?l?l?d?d?s?d +?s?d?l?l?l?l?l?d?d +?l?l?l?d?l?l?l?l?d?d +?l?d?d?l?d?d?l?d?d?s +?u?l?l?u?l?u?l?u +?u?u?u?l?l?u?l?l +?l?u?l?l?l?u?u?l +?l?u?l?u?l?l?u?l +?u?u?u?u?l?l?l?u +?u?l?l?u?u?u?u?u +?l?u?l?l?u?l?u?l +?l?u?l?u?l?u?l?l +?l?l?u?l?l?u?l?l +?l?l?l?u?l?u?l?l +?d?d?d?d?d?d?d?d?d?u?l +?l?l?l?l?s?l?l?l?l?l +?l?d?d?d?d?d?s?s?s +?l?s?d?s?d?d?s?d?d +?d?l?s?d?l?s?d?l?s +?l?l?s?l?l?s?s?d +?l?s?s?l?l?s?s?l +?l?d?s?d?d?s?d?d?d?d +?l?s?l?l?l?l?d?d?d?d +?u?u?u?u?d?d?l?l?l +?l?u?l?u?l?u?l?d?d +?s?d?d?d?l?l?l?l?s +?u?l?u?u?u?d?d?d?d +?u?l?d?l?l?d?l?l?d +?d?d?u?u?u?l?l?d?d +?d?d?d?d?l?l?u?u?u +?u?d?u?d?u?u?u?d?d +?u?l?d?d?d?d?l?l?u +?l?l?d?l?l?l?l?d?d?d +?d?l?d?d?l?l?l?l?d +?d?d?u?u?l?l?l?d?d +?d?d?u?l?u?l?l?d?d +?u?d?d?d?l?l?d?l?l +?d?d?d?d?u?u?u?u?l +?u?d?l?d?l?d?l?l?d +?d?d?u?u?u?u?d?d?u +?u?l?l?d?u?l?l?d?d +?u?u?d?d?d?u?u?u?u +?d?d?l?l?d?l?d?l?l +?d?d?d?d?l?l?u?l?l +?l?s?d?d?d?d?d?d?d?d?d +?l?l?l?l?d?l?l?l?d?d +?s?s?d?d?d?d?l?l?l +?d?d?d?d?l?s?l?s?l +?u?l?l?s?s?d?d?d?d +?l?l?l?l?l?s?s?u +?u?l?l?s?s?l?l?l +?u?l?l?s?u?l?l?s +?u?l?u?l?u?l?s?s +?d?d?d?d?u?u?u?u?d?d +?l?l?u?u?d?d?d?d?d?d +?s?l?l?l?l?l?d?d?d?d +?u?l?l?l?l?u?u?s +?l?u?l?l?l?l?l?s +?l?l?l?u?u?u?u?s +?l?l?s?l?l?l?l?u +?d?d?l?l?l?d?d?d?d?s +?s?s?s?l?l?s?s?s +?d?l?s?d?d?s?s?l +?d?l?l?d?d?s?s?s +?s?d?d?d?s?u?s?u +?d?d?s?l?s?d?s?l +?s?d?l?l?d?d?s?s +?d?d?s?d?l?l?s?s +?l?d?l?d?d?s?s?s +?l?s?l?d?d?s?d?s +?l?s?s?s?d?l?d?d +?l?s?d?d?s?d?s?l +?d?s?d?s?l?d?s?l +?u?s?l?s?s?d?d?d +?u?s?l?s?d?s?d?d +?s?s?s?u?l?d?d?d +?d?s?s?d?s?l?d?l +?u?s?d?s?u?s?d?d +?d?s?d?d?l?s?l?s +?u?s?l?d?d?s?d?s +?s?u?s?u?d?d?d?s +?l?d?d?d?s?s?s?l +?l?d?d?d?s?l?s?s +?d?d?s?l?s?l?s?d +?d?s?d?d?s?u?s?u +?u?d?u?d?d?s?s?s +?s?s?l?l?s?d?d?d +?s?u?s?d?l?d?d?s +?d?l?s?d?s?l?s?d +?s?l?d?s?u?s?d?d +?d?d?d?u?u?s?s?s +?u?d?d?l?s?s?d?s +?l?d?s?s?s?d?d?l +?d?d?d?s?u?s?u?s +?d?d?u?l?s?s?s?d +?d?s?d?s?d?l?l?s +?s?d?s?d?l?l?d?s +?u?u?s?s?s?d?d?d +?s?s?l?l?d?d?d?s +?s?d?u?s?d?u?s?d +?s?s?d?l?l?d?d?s +?s?d?s?d?s?l?d?l +?d?d?u?s?d?l?s?s +?s?l?l?d?d?d?s?s +?d?d?d?u?l?s?s?s +?s?l?s?u?s?d?d?d +?l?s?u?s?s?d?d?d +?s?s?u?u?d?d?d?s +?l?d?d?s?l?s?d?s +?d?d?s?d?s?l?s?l +?l?s?s?s?u?d?d?d +?s?u?s?u?s?d?d?d +?s?d?d?d?s?u?u?s +?u?d?d?l?s?s?s?d +?l?d?s?s?l?s?d?d +?s?d?d?s?d?s?l?l +?l?s?s?l?d?d?d?s +?d?s?l?l?s?d?s?d +?u?s?d?s?d?s?d?u +?u?s?s?d?d?s?d?u +?l?l?d?d?s?s?s?d +?s?d?d?d?s?u?l?s +?d?d?s?d?l?s?l?s +?s?s?s?d?l?l?d?d +?l?l?s?s?s?d?d?d?d +?u?s?u?s?d?d?s?d +?d?d?l?l?s?s?s?d +?s?u?u?d?d?d?s?s +?d?l?d?l?s?s?s?d +?d?s?d?u?s?s?d?u +?d?s?d?l?s?s?d?u +?u?s?u?s?d?s?d?d +?d?d?d?s?s?s?u?l +?l?l?s?d?d?s?d?s +?d?d?s?l?d?l?s?s +?d?s?s?d?d?s?l?l +?d?s?u?l?d?s?d?s +?s?s?d?d?d?s?l?l +?s?l?d?d?l?d?s?s +?d?l?l?s?s?d?d?s +?s?s?d?d?u?l?s?d +?u?l?s?s?s?d?d?d +?d?l?d?l?d?s?s?s +?s?d?s?d?d?s?l?l +?l?s?s?l?s?d?d?d +?s?s?l?d?l?s?d?d +?s?d?u?d?s?l?s?d +?l?s?d?d?d?s?s?l +?l?d?s?l?d?d?s?s +?u?s?s?s?d?d?d?l +?s?s?s?d?d?d?l?u +?d?s?l?d?s?d?s?l +?s?s?d?d?s?d?l?l +?d?l?s?d?l?s?s?d +?s?d?s?d?s?d?u?l +?u?d?s?d?l?d?s?s +?u?u?d?d?s?s?s?d +?s?l?d?d?s?l?d?s +?s?l?l?d?s?d?d?s +?u?u?u?d?u?u?u?u?d +?d?d?l?l?l?l?l?s?s +?d?d?d?l?s?l?l?l?l +?d?d?d?d?s?l?l?s?d +?d?d?s?d?s?d?d?u?u +?s?l?d?d?d?d?d?l?s +?s?s?d?d?d?d?d?u?u +?s?l?d?l?d?d?d?d?s +?s?d?d?d?d?d?l?l?s +?l?d?s?d?d?s?d?d?l +?s?d?d?d?l?l?d?d?s +?s?s?d?d?d?d?d?l?l +?u?u?u?u?u?l?l?l?l +?u?s?u?d?d?d?d?d?d?d +?l?l?d?d?d?d?d?d?d?l?l +?l?l?l?l?d?d?s?l?l +?d?l?s?d?l?s?l?l +?d?s?d?l?s?l?l?l +?l?l?d?d?s?s?u?u +?u?l?s?l?l?d?d?s +?d?s?u?u?u?u?s?d +?l?l?l?d?s?d?s?l +?s?u?d?l?s?u?d?l +?d?d?s?l?s?l?l?l +?s?l?d?l?d?l?s?l +?d?u?l?d?u?l?s?s +?l?d?l?s?d?l?l?s +?u?d?l?s?l?s?u?d +?u?s?l?s?l?l?d?d +?u?u?s?u?s?u?d?d +?s?l?l?s?l?l?d?d +?l?s?l?s?d?l?l?d +?s?s?l?l?l?u?d?d +?s?l?l?l?u?s?d?d +?d?l?d?l?s?l?s?l +?l?s?l?l?d?d?l?s +?s?u?u?l?l?d?d?s +?u?l?u?l?d?s?d?s +?u?l?u?l?s?d?d?s +?u?d?d?l?l?l?s?s +?d?s?d?s?u?l?l?l +?l?d?l?s?l?l?s?d +?l?s?l?d?l?d?s?l +?u?u?d?d?s?l?l?s +?u?u?l?l?s?d?d?s +?s?s?d?d?u?l?u?l +?d?u?l?s?l?d?u?s +?l?l?l?u?s?s?d?d +?d?l?u?s?d?l?u?s +?s?d?u?u?u?u?d?s +?s?d?l?l?d?l?l?s +?u?s?s?l?u?l?d?d +?l?s?l?d?l?l?d?s +?s?u?l?d?d?l?u?s +?u?s?u?u?s?u?d?d +?l?l?s?l?s?d?d?l +?u?u?u?s?d?d?s?l +?l?s?u?d?l?s?u?d +?s?d?l?d?l?l?l?s +?s?u?d?u?u?u?d?s +?l?s?d?d?l?s?l?l +?u?s?l?d?d?l?l?s +?d?d?s?u?l?l?l?s +?u?s?s?u?l?d?d?l +?s?d?u?u?u?u?s?d +?l?l?l?d?d?u?s?s +?u?u?s?l?l?d?d?s +?s?u?l?l?u?s?d?d +?d?l?s?l?s?d?l?l +?d?l?s?s?d?l?l?l +?u?l?d?u?l?d?s?s +?l?s?l?d?d?l?l?s +?u?l?d?l?l?d?s?s +?s?u?u?u?s?u?d?d +?l?d?l?d?l?s?l?s +?d?d?s?u?u?l?l?s +?d?l?l?l?s?d?s?l +?u?u?d?d?s?l?s?l +?u?s?l?s?d?d?u?l +?s?u?l?l?u?d?d?s +?l?s?d?s?d?l?l?l +?u?s?l?d?l?d?l?s +?u?l?d?d?s?l?l?s +?u?d?u?u?u?d?s?s +?u?l?l?s?s?l?d?d +?s?l?l?s?l?d?l?d +?s?s?l?l?d?d?u?u +?l?d?s?d?s?l?l?l +?l?l?d?d?s?l?l?s +?s?d?d?s?u?l?l?l +?s?l?l?l?d?l?d?s +?d?s?d?u?u?u?u?s +?l?s?l?l?s?d?l?d +?d?s?l?l?d?s?l?l +?s?l?l?l?s?d?d?l +?d?u?l?s?s?d?u?l +?u?l?l?s?d?d?s?l +?l?s?d?d?l?l?l?s +?u?u?u?u?d?s?d?s +?s?u?u?d?u?d?u?s +?u?l?u?u?d?d?s?s +?l?l?d?s?s?l?d?l +?s?s?u?l?u?l?d?d +?d?d?s?s?u?l?l?l +?u?l?l?l?d?s?s?d +?u?s?l?u?s?l?d?d +?l?l?u?u?s?d?d?s +?l?l?d?d?l?s?s?l +?d?l?l?l?l?s?d?s +?l?l?d?s?l?d?s?l +?s?s?l?l?l?d?l?d +?d?l?l?s?l?d?s?l +?s?d?d?l?l?u?u?s +?d?l?l?l?s?d?l?s +?l?l?l?s?d?l?d?s +?d?s?s?d?l?l?l?l +?l?l?l?l?l?l?s?d?s +?u?l?l?l?s?l?l?l?l +?d?d?d?d?d?d?d?l?l?d?d +?l?l?l?l?s?d?d?d?d?d?d +?l?d?d?d?d?d?d?l?l?d +?l?d?d?d?d?l?d?d?l?d +?d?d?l?l?d?d?l?d?d?d +?d?d?d?u?l?l?d?d?d?d +?u?u?d?d?d?d?d?d?d?l +?d?d?d?l?l?d?d?l?d?d +?d?d?l?l?s?l?l?d?d +?l?d?l?l?d?l?d?d?s +?d?d?d?l?l?l?l?d?s +?d?u?d?u?d?u?d?u?s +?u?l?l?u?s?d?d?d?d +?l?l?d?d?l?l?l?d?d?d +?s?d?l?l?l?l?l?s?d +?l?l?l?u?d?d?d?d?d?d +?d?d?d?l?l?l?d?d?d?l +?d?d?l?l?d?d?d?d?l?l +?s?d?u?l?u?l?u?l +?l?l?s?l?l?d?l?u +?u?l?l?l?s?l?d?l +?u?u?u?u?l?l?s?d +?s?d?u?u?u?l?l?l +?u?l?s?l?l?l?d?l +?l?u?l?u?l?u?s?d +?l?s?d?u?l?l?l?l +?d?l?l?l?l?l?u?s +?l?s?d?u?u?u?u?u +?u?l?l?s?l?d?l?l +?u?l?l?s?l?d?l?u +?l?u?s?d?l?l?l?l +?u?l?d?l?l?l?s?l +?l?l?l?u?l?l?d?s +?l?u?l?l?l?l?s?d +?s?u?l?l?d?l?l?l +?u?l?l?l?s?u?l?d +?u?l?l?l?d?l?s?l +?u?l?l?u?s?l?l?d +?l?d?l?l?s?l?l?u +?u?l?s?l?l?d?l?l +?u?u?d?s?u?u?u?u +?s?l?l?l?l?d?l?u +?l?l?l?u?u?u?d?s +?u?l?l?l?l?d?d?d?d?s +?l?l?s?d?d?d?d?d?d?d?d +?d?d?s?d?s?d?d?d?d?s +?d?d?s?d?s?d?d?s?d?d +?u?d?l?d?l?l?d?l?l +?u?u?u?u?u?l?d?d?d +?d?d?u?u?u?u?u?u?d +?l?l?u?u?u?u?d?d?d +?u?u?u?d?d?u?u?u?d +?s?l?s?l?s?l?s?l +?d?d?s?s?s?s?s?s +?s?l?l?l?l?l?l?s?d +?l?d?s?l?l?s?l?l +?s?l?l?l?s?l?d?l +?l?l?s?l?l?l?d?s +?l?s?l?l?l?d?s?l +?u?u?l?l?l?l?s?s +?s?l?l?l?l?s?l?d +?s?l?s?l?d?l?l?l +?l?l?l?s?l?d?s?l +?l?s?l?d?l?l?l?s +?u?s?u?s?u?l?l?l +?l?d?l?s?l?l?s?l +?u?l?l?u?l?l?s?s +?u?d?l?s?l?l?l?s +?l?s?l?d?l?l?s?l +?l?l?l?l?s?l?d?s +?l?l?l?s?d?l?l?s +?s?l?l?l?s?l?l?d +?l?l?l?l?d?s?l?s +?u?d?l?l?s?l?l?s +?u?s?u?u?u?s?u?u +?u?s?s?l?l?l?l?l +?l?l?l?d?s?l?l?s +?u?l?l?l?u?u?u?d?d +?u?d?l?l?l?l?l?l?d +?l?l?l?l?l?l?d?l?s +?l?s?l?s?l?s?d?s +?s?l?s?l?s?l?s?d +?s?s?l?d?l?l?s?s +?l?l?l?d?s?s?s?s +?d?d?d?d?s?s?s?s?s +?l?l?u?u?l?l?u?l +?l?l?u?l?u?l?l?l +?l?l?u?u?u?u?u?l +?u?l?l?u?l?l?u?u +?u?l?u?u?l?u?l?u +?l?l?l?u?u?u?u?l +?d?l?l?l?l?l?d?d?s +?d?d?d?d?d?d?l?l?s?s +?l?l?s?l?d?d?d?d?d?d +?d?s?l?l?l?l?l?s?d +?s?u?s?s?l?s?s +?s?s?u?u?s?s?s +?s?s?s?u?s?s?u +?s?s?s?l?l?s?s +?u?s?s?l?s?s?s +?s?l?s?s?s?l?s +?s?s?s?s?l?s?l +?s?s?s?l?s?l?s +?l?u?s?s?s?s?s +?u?s?l?s?s?s?s +?l?s?s?s?s?l?s +?l?s?s?s?u?s?s +?s?u?s?s?u?s?s +?l?s?s?l?s?s?s +?s?u?s?s?s?l?s +?s?s?u?s?l?s?s +?s?s?s?l?u?s?s +?s?u?s?u?s?s?s +?s?s?l?s?s?s?u +?l?l?u?l?l?l?l?s +?l?l?l?s?l?l?l?u +?u?l?s?l?l?l?l?u +?l?u?l?u?l?u?l?s +?u?u?u?u?u?u?u?d?d?d?d +?l?s?l?s?l?l?l?s +?l?s?l?s?l?l?s?l +?s?s?l?d?s?s?l?d +?l?l?s?s?d?d?s?s +?l?s?l?s?s?d?d?s +?s?s?u?u?d?d?s?s +?d?l?s?s?d?l?s?s +?d?l?u?l?u?u?l?l +?l?d?l?u?l?u?l?u +?l?l?u?d?l?l?u?u +?l?d?u?l?u?u?u?u +?l?u?u?u?u?d?l?l +?d?u?l?l?u?u?u?u +?u?u?u?d?l?l?l?u +?l?u?l?l?d?u?l?l +?l?u?l?d?u?l?u?u +?u?l?l?u?d?l?u?l +?l?l?u?l?d?l?u?l +?u?u?l?l?l?d?u?u +?l?u?u?d?l?l?l?l +?d?l?u?l?l?l?l?u +?l?l?d?u?u?u?l?l +?l?l?d?l?u?u?l?l +?l?u?u?u?u?l?d?u +?u?l?u?l?d?u?u?u +?u?u?l?d?u?l?l?l +?u?d?l?l?u?u?l?l +?u?d?u?u?l?u?l?l +?l?l?l?u?d?u?u?u +?l?u?u?d?l?u?l?l +?l?l?u?l?d?u?u?u +?d?l?u?l?u?l?u?l +?l?u?l?u?l?u?u?d +?u?l?u?l?d?u?l?l +?u?l?d?l?l?u?l?u +?l?d?u?l?l?u?l?u +?l?u?l?l?l?l?u?d +?u?u?u?l?l?d?u?u +?l?u?l?l?l?d?l?u +?u?l?l?l?u?l?d?u +?l?u?d?u?u?l?l?l +?u?u?u?l?u?u?l?d +?l?l?d?u?u?l?u?l +?l?d?l?u?u?l?l?l +?l?l?u?u?u?u?d?l +?l?d?u?u?l?u?u?u +?u?u?l?u?l?d?l?l +?l?l?u?u?u?d?l?l +?u?u?l?l?u?u?d?u +?u?d?l?l?l?u?l?u +?l?u?u?u?d?l?l?u +?u?l?l?d?l?u?u?u +?l?l?u?l?l?l?d?u +?u?u?u?d?u?u?u?l +?d?u?l?l?u?u?l?l +?u?l?u?l?l?u?u?d +?l?u?u?u?l?d?l?l +?l?d?u?l?l?u?u?u +?l?u?l?l?u?l?u?d +?l?l?u?u?u?u?l?d +?u?u?l?d?u?u?u?l +?u?u?u?u?d?l?l?u +?d?u?l?l?l?u?u?l +?d?u?l?l?l?u?u?u +?d?u?u?l?u?l?l?l +?u?d?l?u?u?l?l?u +?u?d?l?u?u?l?l?l +?l?u?u?d?u?u?l?l +?l?d?l?l?l?u?l?u +?l?d?u?u?u?u?u?l +?l?d?u?u?l?l?u?u +?l?l?d?l?l?u?l?u +?u?u?l?u?l?l?u?d +?u?d?u?l?l?l?u?u +?l?l?u?d?u?u?l?l +?l?u?u?l?l?d?l?l +?u?u?d?d?l?l?l?l?l +?l?l?u?l?l?d?l?u +?u?u?u?l?l?u?l?d +?l?l?l?u?d?l?l?u +?u?d?l?u?u?u?l?u +?u?l?u?u?u?l?u?d +?u?u?u?u?l?u?l?d +?l?u?l?l?d?l?u?l +?d?u?l?u?l?u?l?u +?l?l?u?l?l?u?u?d +?l?l?d?l?u?u?u?u +?l?u?d?l?l?l?u?l +?u?u?l?l?u?d?u?l +?d?l?l?u?l?l?u?u +?u?l?u?l?l?u?d?l +?u?l?u?l?l?u?d?u +?u?l?u?l?u?u?u?d +?u?u?u?d?u?l?u?u +?l?l?u?d?u?u?u?u +?l?l?l?u?l?u?d?l +?d?l?l?l?l?u?u?l +?u?l?u?d?u?l?u?u +?l?l?l?u?l?d?l?u +?l?l?l?l?u?u?d?u +?l?l?l?l?u?u?d?l +?l?u?l?u?u?u?l?d +?u?u?l?l?u?d?l?u +?d?l?l?u?l?l?u?l +?u?u?d?l?l?u?u?u +?u?l?u?u?l?u?u?d +?l?u?u?d?l?u?l?u +?u?d?u?u?u?l?u?l +?l?l?u?l?u?u?u?d +?l?u?u?l?u?u?l?d +?l?u?l?d?l?u?u?u +?d?l?u?l?u?l?l?l +?l?l?l?l?u?d?u?l +?u?d?u?l?l?l?u?l +?u?d?l?l?u?l?u?u +?l?l?l?u?u?d?u?l +?u?u?l?u?u?l?l?d +?u?u?u?u?d?l?u?u +?l?l?u?u?d?l?u?u +?l?d?u?u?u?u?l?l +?u?l?u?d?l?l?u?l +?l?d?l?l?u?l?u?u +?u?l?l?l?d?l?u?l +?l?l?u?d?u?u?u?l +?u?l?l?d?u?u?u?l +?u?u?d?u?l?l?u?u +?u?u?l?l?l?u?d?u +?u?u?u?d?u?l?u?l +?u?u?u?u?d?u?u?l +?l?l?u?l?u?u?d?l +?u?l?l?u?d?l?l?u +?u?u?u?u?l?l?d?l +?u?l?u?d?u?u?l?l +?u?l?d?u?u?u?u?l +?d?u?l?u?u?u?u?u +?u?l?l?s?u?l?l?d?d +?l?l?l?l?l?d?d?l?s +?l?l?l?l?l?d?l?d?d?d +?d?d?d?d?l?l?l?l?l?s +?u?l?l?s?u?l?l?l?l +?l?l?d?l?l?l?l?l?l?l +?l?l?s?d?l?l?l?l?l +?s?u?u?u?s?d?d?d?d +?l?l?l?d?d?s?d?d?s +?s?u?u?u?d?d?d?d?s +?s?u?l?l?d?d?d?d?s +?l?s?s?s?l?d?l?l +?s?d?l?l?l?l?s?s +?u?s?u?s?u?s?u?d +?l?l?l?l?s?d?s?s +?d?d?s?d?d?s?d?d?s?l +?l?d?d?d?d?l?l?l?l?l +?d?u?u?u?u?d?u?u?u +?u?u?u?u?u?u?l?d?d +?u?l?u?l?u?l?l?d?d +?d?d?l?l?l?l?l?l?l?d +?l?d?l?d?l?d?l?d?l?l +?u?u?u?u?d?l?l?l?l +?d?d?d?s?l?l?l?l?l?l +?s?d?d?d?d?d?d?d?l?l +?d?d?d?s?u?l?l?l?l +?u?u?u?u?u?s?s?u +?s?u?l?l?u?l?l?s +?u?l?s?u?l?s?u?l +?u?l?l?l?l?s?l?s +?u?l?s?s?l?l?l?l +?u?l?l?l?d?d?d?d?d?d?d +?d?d?d?l?l?l?l?l?u +?u?d?u?u?u?u?u?d?d +?l?d?d?d?d?d?l?d?d?d?d +?d?d?d?d?d?d?l?l?d?d?d +?l?d?l?d?d?d?d?d?d?d?d +?d?d?d?d?l?l?d?d?d?d?d +?d?d?d?d?d?l?l?d?d?d?d +?u?u?u?u?u?u?u?d?s +?l?l?l?d?d?l?l?d?d?d +?d?d?d?s?s?d?d?d?l +?s?d?d?d?d?u?d?d?s +?l?d?d?d?d?d?s?s?d +?d?d?u?d?d?d?d?s?s +?d?d?d?d?l?d?s?s?d +?u?d?s?d?d?s?d?d?d +?d?s?d?d?s?d?d?l?d +?s?d?d?s?d?d?d?d?l +?d?d?s?s?d?d?d?d?u +?u?s?d?d?d?s?d?d?d +?s?d?d?u?d?d?d?d?s +?d?d?l?d?d?d?d?s?s +?u?d?s?d?d?d?d?s?d +?l?s?d?s?d?d?d?d?d +?d?d?s?u?s?d?d?d?d +?u?s?d?d?s?d?d?d?d +?d?d?s?l?d?s?d?d?d +?d?s?d?s?d?d?d?d?u +?l?d?d?d?s?s?d?d?d +?d?s?l?s?d?d?d?d?d +?l?d?s?s?d?d?d?d?d +?s?s?d?d?d?d?d?l?d +?s?d?d?l?d?d?d?d?s +?d?d?d?s?l?d?d?d?s +?s?s?d?d?d?d?u?d?d +?d?d?d?d?s?d?s?d?u +?s?u?d?d?d?d?d?d?s +?d?d?d?s?d?d?l?s?d +?d?d?s?d?l?d?d?s?d +?u?s?l?s?l?s?l?s +?l?d?l?d?l?l?d?d?d?d +?d?d?l?l?d?d?l?d?d?l +?l?d?d?d?d?l?l?l?d?d +?l?d?d?d?s?d?d?d?d?d +?l?d?d?s?d?d?d?d?d?d +?s?d?d?d?d?l?d?d?d?d +?d?d?d?d?s?l?d?d?d?d +?d?d?d?d?d?d?l?d?d?s +?l?l?l?l?l?l?l?d?u +?l?d?l?l?l?l?l?l?l?l +?l?l?d?d?d?d?s?d?l +?l?d?d?d?d?l?l?d?s +?u?l?l?d?d?s?d?d?d +?u?u?l?s?d?d?d?d?d +?u?u?u?d?s?d?d?d?d +?l?l?u?d?d?d?d?d?s +?l?d?d?s?l?l?d?d?d +?u?l?l?d?d?d?d?s?d +?d?l?l?l?d?s?d?d?d +?d?d?d?s?d?d?u?u?u +?u?u?s?d?d?d?d?d?l +?s?l?d?d?d?d?d?l?l +?u?l?d?d?s?d?d?d?l +?l?d?d?d?d?d?l?l?s +?u?d?d?d?s?u?l?d?d +?l?s?d?l?l?d?d?d?d +?l?l?d?s?d?l?d?d?d +?s?u?d?l?l?d?d?d?d +?d?s?l?l?l?d?d?d?d +?u?u?u?d?d?s?d?d?d +?s?u?l?l?d?d?d?d?d +?l?d?l?d?s?l?d?d?d +?u?s?l?d?l?d?d?d?d +?u?d?l?l?s?d?d?d?d +?s?l?d?d?l?d?d?l?d +?d?d?l?l?l?d?d?s?d +?l?d?d?l?d?l?d?d?s +?u?u?s?u?d?d?d?d?d +?d?l?d?l?d?l?s?d?d +?l?l?d?d?d?d?d?l?s +?d?l?d?l?d?l?d?s?d +?u?u?d?u?d?d?d?d?s +?d?d?d?d?d?u?l?u?s +?s?d?d?d?l?l?l?d?d +?l?d?l?s?l?d?d?d?d +?l?l?d?d?d?l?s?d?d +?d?d?u?l?u?s?d?d?d +?d?d?d?d?s?l?l?l?d +?l?d?l?l?d?d?s?d?d +?l?l?d?d?d?d?d?s?l +?l?s?l?l?l?s?d?d?d +?l?l?d?d?l?l?l?l?l?l +?l?d?l?d?d?d?d?d?l?d +?d?d?l?l?d?d?d?d?d?l +?d?d?d?d?l?l?d?d?l?d +?l?d?d?d?d?l?d?d?d?l +?l?l?u?d?d?d?d?d?d?d +?d?d?d?l?d?d?d?d?l?l +?d?d?d?d?l?l?d?d?d?l +?d?d?d?l?d?l?d?d?l?d +?d?d?l?l?d?l?d?d?d?d +?d?l?d?d?d?d?d?d?l?l +?l?d?d?d?d?l?d?l?d?d +?u?d?u?d?u?d?d?d?d?d +?l?l?l?l?l?d?d?d?d?d?d?d +?u?l?l?l?l?d?d?s?s +?d?d?d?d?d?d?d?d?s?s?s +?d?l?l?d?d?l?d?l?l +?u?u?u?d?d?d?l?l?d +?d?d?l?l?l?d?l?d?l +?u?l?l?d?l?d?l?d?d +?u?u?d?u?d?u?d?u?d +?d?l?d?d?l?l?l?d?l +?u?d?d?u?u?u?d?d?u +?u?d?d?u?u?d?u?d?u +?d?d?l?l?l?l?u?d?d +?u?d?l?d?l?d?l?d?u +?d?d?d?d?u?l?u?l?l +?u?l?d?l?l?d?l?d?d +?u?u?d?u?u?u?d?d?d +?l?l?d?d?u?u?u?d?d +?d?d?l?l?l?u?u?d?d +?u?d?u?d?u?u?d?u?d +?u?l?u?l?d?d?d?d?u +?d?d?l?d?l?l?l?l?d +?u?u?d?d?u?u?d?u?d +?u?u?d?l?l?l?d?d?d +?d?u?u?u?u?d?u?d?d +?d?l?l?l?l?d?d?l?d +?d?d?l?u?u?u?u?d?d +?u?l?d?l?d?l?l?d?d +?d?d?l?l?l?l?d?d?u +?d?d?l?l?d?l?l?l?d +?u?l?d?l?d?l?d?l?d +?u?d?l?l?l?l?d?l?l +?d?l?l?l?s?s?s?s +?l?l?l?s?s?s?s?d +?l?l?u?l?l?l?u?u +?l?l?u?l?u?l?u?l +?l?l?l?l?u?u?u?u?d +?u?l?u?l?l?l?u?u +?l?u?u?u?l?l?l?l +?u?l?l?l?u?u?l?u +?l?l?l?u?l?u?l?u +?d?s?d?d?s?d?d?s?d?d +?l?l?l?d?s?l?l?l?d +?l?s?d?l?s?d?l?s?d +?l?l?d?l?l?s?d?d?d +?u?l?d?d?s?u?l?d?d +?l?d?l?l?d?l?s?d?d +?l?l?d?l?l?d?d?d?s +?u?u?s?l?l?d?d?d?d +?d?l?d?l?s?d?l?d?l +?u?u?d?d?s?u?u?d?d +?l?s?d?d?d?d?l?l?l +?d?l?l?l?l?d?s?d?d +?u?d?u?d?s?u?d?u?d +?d?d?d?l?l?l?s?l?l +?l?s?d?l?l?l?l?d?d +?l?d?d?d?d?l?l?l?s +?l?l?l?s?d?d?d?l?l +?d?l?l?l?l?s?d?d?d +?l?l?l?d?d?l?s?d?d +?l?u?u?u?s?d?d?d?d +?l?l?d?l?d?l?s?d?d +?l?d?d?l?l?d?d?l?s +?l?l?d?d?l?l?s?d?d +?l?d?d?l?d?d?l?l?s +?u?l?l?l?l?d?s?d?d +?d?s?d?d?l?l?l?l?l +?u?u?u?s?u?d?d?d?d +?l?d?l?d?l?d?l?l?s +?l?l?l?d?l?d?d?d?s +?u?u?u?u?d?d?d?s?d +?l?l?d?d?d?d?d?d?u?u +?d?l?l?l?d?l?d?d?d?d +?l?d?d?d?d?d?l?l?l?l +?s?l?l?l?l?s?l?s +?u?u?u?l?l?l?s?s +?u?l?s?l?l?s?l?l +?l?l?l?l?l?u?u?u?u +?l?l?l?l?d?d?d?d?s?d +?d?d?d?s?s?s?s?u +?l?s?d?s?d?s?d?s +?d?s?d?u?s?d?s?s +?s?s?s?l?d?d?s?d +?d?d?s?s?s?s?d?l +?s?d?d?d?s?s?s?l +?s?s?d?s?l?s?d?d +?d?s?l?s?d?d?s?s +?s?s?s?s?d?u?d?d +?l?s?s?s?d?d?d?s +?s?d?d?s?d?s?l?s +?s?d?l?s?d?d?s?s +?l?s?s?d?s?d?s?d +?s?s?s?s?l?d?d?d +?s?s?l?s?s?d?d?d +?s?d?d?d?s?l?s?s +?s?s?s?d?d?d?s?l +?s?s?d?l?s?d?s?d +?u?s?d?s?d?s?d?s +?d?l?d?s?s?s?s?d +?d?s?s?d?s?s?l?d +?d?d?d?s?s?u?s?s +?s?l?d?d?d?s?s?s +?s?s?l?d?s?s?d?d +?d?u?u?u?u?l?l?d +?d?d?l?l?u?u?l?u +?l?u?u?u?d?u?d?l +?u?u?l?d?l?d?u?l +?l?l?d?u?u?u?d?l +?d?u?l?l?d?l?l?u +?l?d?u?d?l?u?u?u +?l?u?u?d?u?u?u?d +?l?u?l?d?u?u?l?d +?l?d?l?l?u?u?u?d +?u?l?d?u?l?l?d?l +?l?d?u?l?d?l?l?u +?d?l?u?u?u?d?u?l +?d?l?u?u?u?d?u?u +?d?l?u?l?u?d?u?u +?d?u?u?u?l?u?d?u +?l?d?u?l?u?d?u?l +?l?l?u?u?d?d?u?l +?d?l?u?u?l?u?l?d +?d?l?u?d?u?l?l?l +?d?l?l?l?u?l?u?d +?u?l?u?u?d?d?l?u +?l?l?l?d?l?d?u?l +?l?u?l?d?u?l?l?d +?d?u?u?u?u?u?d?l +?d?u?l?l?u?u?u?d +?d?u?u?l?u?u?l?d +?u?l?u?d?u?u?u?d +?u?l?l?u?u?d?u?d +?l?l?u?d?u?d?l?u +?u?d?u?u?d?l?u?l +?d?u?d?u?l?l?l?u +?l?l?l?l?s?d?d?l?l +?u?u?l?l?d?u?u?d +?l?u?l?d?u?l?u?d +?u?u?d?u?u?l?d?u +?u?u?d?u?u?l?d?l +?l?u?d?u?d?l?l?l +?l?u?d?u?d?l?l?u +?l?l?d?l?u?u?d?u +?l?u?d?l?u?l?d?u +?u?u?u?l?d?d?l?u +?l?l?u?l?u?d?u?d +?d?d?u?l?u?l?l?u +?u?l?u?u?d?l?d?l +?l?l?l?l?d?l?u?d +?l?d?u?d?u?l?u?l +?d?u?u?l?u?d?l?l +?d?l?u?d?u?u?u?u +?l?d?d?l?u?u?l?u +?u?d?u?u?u?l?d?l +?l?u?d?l?u?d?l?u +?u?u?u?u?d?u?d?l +?d?l?d?u?l?l?l?u +?d?d?l?u?l?l?u?u +?u?u?u?d?l?u?l?d +?l?l?u?l?d?u?l?d +?l?u?d?l?d?l?l?u +?u?u?d?u?u?d?u?l +?u?d?l?u?u?u?u?d +?u?l?u?d?l?u?d?l +?u?l?d?d?u?u?u?l +?u?u?l?l?d?l?l?d +?l?l?d?l?l?l?u?d +?l?l?d?u?d?l?u?u +?u?u?d?u?l?d?u?l +?d?l?u?l?u?d?l?u +?u?l?d?l?l?u?d?u +?u?d?u?u?u?u?d?l +?d?l?d?l?u?l?l?l +?d?l?l?d?u?l?l?u +?u?u?d?d?l?l?l?u +?u?d?l?d?u?u?l?u +?l?u?u?u?d?u?u?d +?l?l?d?u?u?d?u?u +?u?l?u?u?u?d?l?d +?u?l?d?d?u?u?u?u +?d?u?u?l?l?u?l?d +?u?d?d?u?u?l?u?u +?l?u?d?u?u?l?d?u +?d?u?u?d?l?l?l?u +?u?u?d?d?u?u?u?l +?u?l?u?d?l?d?l?u +?d?l?u?d?u?l?u?l +?l?d?l?l?u?d?u?u +?l?u?u?u?u?d?l?d +?l?u?u?u?d?l?u?d +?l?u?u?d?u?l?u?d +?l?u?u?l?l?d?l?d +?l?u?d?d?l?u?l?u +?l?u?d?d?l?u?l?l +?u?l?d?u?u?d?l?l +?l?d?l?l?d?u?l?l +?l?l?u?u?u?d?d?u +?u?l?u?l?d?l?d?u +?l?l?u?l?d?u?u?d +?l?d?d?l?u?l?u?u +?d?u?u?d?u?l?l?u +?d?u?u?u?u?d?u?l +?u?u?d?u?l?d?l?u +?l?l?u?u?u?u?u?d?d +?d?l?l?d?u?u?l?l +?l?u?u?l?d?l?u?d +?u?u?u?l?d?u?u?d +?l?u?d?l?d?u?u?l +?d?d?u?l?u?u?u?u +?l?d?d?l?l?u?l?u +?u?d?u?l?u?l?u?d +?u?u?d?u?u?u?d?l +?d?u?l?l?u?u?d?u +?u?d?u?d?l?l?l?u +?u?u?l?l?d?d?l?u +?u?u?l?d?u?u?d?l +?u?u?l?d?u?u?d?u +?u?l?l?u?u?d?d?l +?u?l?d?l?u?u?u?d +?u?l?d?u?d?u?l?u +?u?u?d?l?d?l?u?l +?u?u?d?l?d?l?u?u +?l?d?u?u?l?u?d?l +?l?l?l?d?u?l?d?u +?l?l?u?u?d?d?u?u +?l?d?u?u?u?d?u?u +?u?d?l?d?u?u?u?l +?l?u?l?u?l?d?l?d +?l?d?d?u?l?u?l?l +?d?l?d?l?l?l?u?u +?l?l?u?d?d?l?u?l +?d?u?u?u?d?u?u?u?d +?l?d?u?l?u?u?d?u +?l?d?l?d?l?l?u?l +?l?u?d?u?u?l?l?d +?d?l?d?u?l?u?l?u +?u?u?l?d?d?l?u?u +?l?l?d?l?u?d?u?l +?u?d?u?u?d?l?l?u +?u?d?u?u?u?l?d?u +?l?u?d?u?d?l?u?l +?d?d?l?l?u?u?u?l +?l?u?d?d?u?l?l?u +?d?u?u?d?u?u?l?u +?u?d?l?l?u?u?u?d +?l?d?l?u?u?d?l?l +?l?d?u?u?u?l?d?l +?u?d?u?d?u?u?u?l +?u?d?u?d?l?l?u?u +?u?l?d?u?u?u?u?d +?d?u?u?u?l?l?u?d +?l?d?u?l?u?u?u?d +?d?u?d?l?l?l?l?u +?u?l?d?l?u?u?l?d +?l?u?d?u?u?u?d?u +?u?d?u?u?u?d?u?l +?l?u?d?d?l?u?u?l +?l?d?d?u?u?l?l?l +?l?u?u?d?u?d?u?l +?l?u?l?d?u?l?d?u +?l?d?u?d?l?u?l?u +?u?l?l?d?u?d?l?u +?l?u?l?u?u?d?d?u +?u?d?l?l?d?l?u?l +?l?l?u?u?d?l?u?d +?l?u?l?d?d?l?u?u +?u?u?d?u?u?l?u?d +?u?d?u?d?u?l?l?u +?u?d?d?l?u?u?l?l +?l?d?u?l?u?l?d?l +?l?d?u?l?u?l?d?u +?l?u?d?l?l?d?l?u +?u?l?d?l?l?u?u?d +?l?u?d?u?d?u?u?l +?l?d?u?u?l?u?u?d +?u?d?l?l?u?l?u?d +?u?l?u?l?d?u?d?u +?l?u?u?u?d?d?l?l +?d?u?u?u?l?u?l?d +?l?d?l?l?u?l?d?u +?d?u?u?u?u?l?u?d +?d?u?l?u?u?u?d?l +?u?l?u?d?l?d?u?u +?u?l?l?d?u?d?u?u +?u?d?l?u?u?u?l?d +?l?d?l?l?l?u?u?d +?u?l?d?u?l?d?u?u +?l?u?l?d?l?l?u?d +?d?l?u?u?u?l?d?u +?l?d?l?u?l?u?d?u +?u?l?d?u?d?u?u?u +?u?u?l?d?u?d?l?l +?d?l?u?u?u?d?l?u +?d?d?u?l?l?u?l?u +?d?l?d?l?l?u?u?l +?l?l?u?l?d?l?d?l +?d?u?u?d?u?u?l?l +?d?l?l?l?d?l?u?l +?l?d?l?u?d?u?u?l +?l?l?d?l?d?u?u?l +?l?l?l?u?d?d?u?u +?d?d?u?u?l?l?u?l +?l?d?u?d?u?u?l?l +?d?l?u?l?l?d?u?u +?d?u?u?u?l?u?u?d +?d?u?d?u?u?l?l?u +?d?l?l?u?u?l?u?d +?u?l?l?l?d?l?u?d +?u?d?l?l?d?u?u?u +?u?l?d?l?u?u?d?l +?d?l?u?u?u?l?d?l +?d?l?l?l?u?d?u?l +?d?l?d?u?l?l?u?l +?l?u?l?u?d?l?l?d +?l?d?l?d?u?l?l?u +?u?l?u?u?l?l?d?d?d +?d?l?u?l?d?u?l?l +?l?u?u?d?l?l?d?u +?u?d?l?u?l?d?u?u +?l?l?u?u?l?d?d?u +?d?u?u?l?u?l?l?d +?l?u?l?d?d?u?u?l +?d?u?l?u?l?u?u?d +?u?d?u?u?d?u?u?l +?d?d?l?u?l?u?u?l +?u?d?u?l?u?l?d?u +?u?d?l?u?u?d?u?u +?d?u?l?d?u?l?u?l +?l?d?l?d?l?u?u?l +?d?u?l?l?u?d?l?l +?u?l?d?d?l?u?u?l +?u?d?l?u?d?u?l?l +?l?l?l?d?u?d?u?u +?l?d?l?d?u?u?l?u +?l?l?d?d?u?l?u?l +?l?u?d?l?u?l?l?d +?u?d?u?l?u?l?l?d +?u?d?u?u?l?l?l?d +?d?u?u?l?l?l?u?d +?l?d?d?l?u?u?u?l +?l?u?u?u?d?l?l?d +?l?d?u?u?d?u?u?u +?l?d?l?l?u?u?d?l +?l?d?l?u?d?l?l?u +?u?l?d?l?d?l?l?u +?u?l?l?l?l?d?d?d?u +?u?u?l?d?u?d?l?u +?u?l?d?l?d?u?u?l +?u?d?l?l?l?u?u?d +?l?l?l?l?u?l?d?d?d +?l?l?u?d?u?u?l?d +?d?u?u?l?l?u?d?u +?u?u?u?d?l?u?d?l +?l?d?l?l?d?u?u?l +?l?u?l?l?d?l?u?d +?d?u?d?u?l?u?l?l +?d?l?u?d?u?u?l?u +?d?l?u?d?u?u?l?l +?u?l?u?u?d?l?u?d +?l?d?l?d?u?l?u?l +?d?l?l?l?u?u?l?d +?d?l?l?u?d?l?l?l +?l?l?d?u?u?d?l?u +?l?l?d?l?u?l?d?u +?u?u?u?d?d?u?u?l +?u?l?u?u?d?u?d?u +?d?l?l?d?l?u?u?l +?l?d?u?u?d?u?u?l +?u?l?d?u?u?u?l?d +?d?u?l?u?l?d?u?l +?l?l?u?l?d?l?d?u +?l?u?d?u?l?u?d?l +?u?d?l?l?u?u?d?u +?u?u?u?l?d?d?u?l +?d?u?d?u?u?l?u?u +?d?u?d?u?u?l?u?l +?l?u?d?u?l?d?u?u +?u?d?u?l?d?u?u?l +?d?u?l?u?u?d?u?l +?d?l?l?u?u?d?l?u +?l?l?u?u?l?d?l?d +?u?d?d?u?l?u?l?u +?d?u?u?l?u?l?d?l +?d?l?u?u?l?d?u?l +?l?d?l?l?l?u?d?l +?u?l?d?u?d?l?l?l +?l?d?u?l?d?u?u?u +?u?l?u?d?d?l?u?u +?d?d?d?u?l?l?u?l?l +?u?d?l?d?l?u?u?l +?d?u?u?u?u?u?l?d +?l?l?l?d?u?u?d?u +?l?d?l?l?d?u?l?u +?d?d?l?u?l?u?l?l +?d?l?u?u?l?d?l?u +?l?l?u?u?d?d?l?u +?l?d?u?u?u?d?l?l +?d?d?u?l?u?u?l?u +?d?d?u?l?u?u?l?l +?u?u?u?d?l?d?u?l +?l?u?d?l?u?l?u?d +?l?l?u?d?u?d?u?l +?l?u?l?u?d?d?l?u +?u?l?u?l?d?u?d?l +?u?d?l?l?u?u?d?l +?u?d?u?u?d?l?u?u +?l?l?u?d?u?u?u?d +?d?l?l?l?l?d?u?l +?l?l?u?d?l?d?u?l +?l?l?u?d?l?d?u?u +?d?l?l?u?d?u?l?l +?l?u?u?l?l?d?u?d +?u?d?d?l?u?l?l?u +?l?l?d?u?l?d?l?u +?l?d?l?l?u?l?u?d +?l?d?l?u?u?d?u?u +?d?u?u?l?d?l?l?l +?d?u?l?l?d?l?u?u +?l?l?l?u?d?l?u?d +?d?u?l?d?u?u?u?u +?d?u?l?u?u?l?l?d +?l?d?u?d?u?u?l?u +?u?u?u?l?d?l?d?u +?l?u?u?l?d?u?d?l +?l?u?l?d?l?l?l?d +?u?l?u?u?l?d?u?d +?u?l?l?l?d?u?u?d +?d?l?l?d?l?u?l?u +?d?d?l?u?u?l?u?l +?l?u?l?l?u?d?d?l +?u?u?u?d?l?d?l?l +?u?l?d?u?d?l?u?u +?l?u?d?l?u?d?u?u +?d?u?l?u?d?l?u?l +?l?l?l?l?d?u?d?l +?u?u?d?l?l?d?l?u +?d?u?u?l?u?u?u?d +?u?d?u?d?u?u?l?u +?u?d?u?d?u?u?l?l +?l?u?u?u?u?d?d?u +?l?l?d?u?u?l?u?d +?u?d?l?u?d?l?u?u +?d?d?u?u?l?u?l?l +?l?l?d?d?l?u?u?l +?u?u?u?u?l?d?u?d +?d?u?l?u?d?u?u?u +?u?l?l?u?d?u?d?l +?l?d?d?u?u?l?u?u +?d?l?l?u?d?u?l?u +?l?l?u?d?l?d?l?u +?l?d?l?u?l?l?l?d +?u?d?u?u?l?d?l?l +?u?u?u?d?l?u?u?d +?l?u?d?u?l?l?u?d +?u?d?u?l?u?u?u?d +?l?d?l?u?u?u?d?l +?u?u?l?l?u?d?u?d +?u?l?u?u?u?d?d?u +?u?u?d?d?u?l?u?u +?u?u?l?d?l?u?l?d +?d?u?u?l?l?u?d?l +?d?l?d?u?l?l?u?u +?u?d?l?d?l?l?u?u +?l?u?l?d?l?d?l?u +?l?u?l?u?d?d?u?l +?u?d?d?u?l?l?u?u +?d?u?u?l?l?u?u?d +?u?l?l?l?u?d?d?u +?d?u?l?d?l?l?u?l +?u?u?l?d?u?d?u?l +?l?d?l?u?l?l?u?d +?l?l?u?u?d?l?l?d +?l?d?d?u?u?u?u?u +?l?u?u?d?u?u?d?l +?l?l?d?l?u?d?l?l +?l?u?d?l?l?u?l?d +?u?d?u?l?d?u?l?l +?u?l?d?u?u?d?u?l +?d?l?u?u?d?l?l?l +?u?d?l?u?l?u?u?d +?d?u?u?u?l?l?d?l +?u?d?u?d?l?u?l?l +?u?l?l?d?d?l?u?u +?d?u?l?l?u?d?u?l +?d?l?u?l?l?u?d?u +?d?l?u?l?l?u?d?l +?d?u?l?l?u?d?u?u +?l?d?u?u?u?d?u?l +?u?l?d?d?u?u?l?u +?u?u?u?l?u?d?u?d +?l?l?u?d?d?u?l?u +?l?u?l?d?l?u?u?d +?l?d?d?u?l?u?l?u +?u?u?d?u?d?l?l?u +?d?u?l?l?l?u?d?u +?d?u?u?d?u?l?u?u +?u?d?l?u?l?l?d?u +?l?d?u?d?u?u?u?l +?d?u?l?l?d?u?u?l +?d?u?l?l?d?u?u?u +?l?l?d?l?u?d?l?u +?d?l?u?l?u?l?l?d +?d?l?u?l?d?l?u?u +?u?u?u?u?d?l?u?d +?l?d?u?d?l?u?u?l +?d?l?u?d?l?l?l?u +?u?d?d?u?u?l?l?u +?l?u?d?l?l?l?d?u +?l?u?d?l?l?l?d?l +?l?d?u?u?u?u?l?d +?u?u?l?u?l?d?l?d +?l?u?u?l?u?d?d?l +?u?d?l?u?d?u?l?u +?l?u?d?u?u?u?u?d +?u?u?l?d?u?l?d?u +?l?u?l?u?l?d?d?u +?l?u?d?l?u?u?d?u +?u?l?u?u?l?d?d?u +?d?u?l?l?l?u?u?d +?l?d?u?d?u?u?u?u +?u?l?l?d?u?u?u?d +?l?l?u?d?l?u?l?d +?d?u?d?l?u?l?u?u +?l?u?l?d?l?l?d?u +?l?u?d?d?l?l?u?u +?d?d?u?u?l?u?u?l +?u?u?l?u?u?d?u?d +?l?u?d?u?u?u?l?d +?d?l?u?u?u?u?d?l +?l?u?l?l?l?d?u?d +?l?u?l?d?l?l?d?l +?u?l?u?d?u?l?d?l +?l?u?u?d?u?u?d?u +?u?l?d?l?u?l?d?u +?l?u?d?d?u?l?u?l +?d?l?l?d?l?l?u?l +?u?u?d?l?l?d?u?u +?u?u?d?l?d?l?l?u +?u?u?d?l?d?l?l?l +?l?u?l?l?u?d?u?d +?u?u?l?u?d?l?d?l +?d?u?d?l?l?l?u?u +?l?l?l?u?d?l?d?u +?l?l?l?u?d?l?d?l +?u?d?l?u?u?u?d?l +?u?d?l?l?d?u?u?l +?u?l?u?d?l?u?u?d +?d?l?u?l?l?u?l?d +?u?d?u?u?u?l?l?d +?d?l?d?u?l?u?u?u +?u?u?d?u?l?u?d?u +?l?l?u?l?d?d?u?l +?l?u?u?d?u?d?l?u +?l?l?u?d?u?l?d?l +?d?l?l?l?u?d?l?u +?d?u?u?l?l?d?l?u +?l?l?d?l?u?l?l?d +?d?u?l?u?d?l?u?u +?u?l?d?u?u?d?u?u +?l?u?l?d?d?l?l?u +?d?l?u?l?u?l?d?u +?u?d?d?l?l?l?u?u +?l?l?d?u?l?d?u?u +?l?u?l?l?d?u?u?d +?u?u?l?d?l?l?d?u +?l?l?u?d?u?l?d?u +?l?u?d?d?u?u?l?l +?l?l?u?u?d?u?l?d +?l?d?d?l?u?l?u?l +?u?u?s?u?u?u?u?u?u +?d?d?d?s?s?l?l?l?l +?u?u?u?u?d?d?d?s?s +?d?d?d?d?d?s?s?s?l +?l?s?s?s?d?d?d?d?d +?l?l?d?l?l?l?l?l?s +?l?l?l?l?l?d?d?l?d?d +?l?l?l?l?u?l?l?l?l +?d?d?l?l?l?d?d?d?d?d?d +?l?l?l?l?d?s?d?d?d?d +?d?d?d?d?d?d?d?l?s?s +?l?l?l?l?d?l?l?d?d?d +?l?l?l?l?l?s?d?s?d +?s?s?d?d?s?l?l?l +?d?s?s?d?l?s?l?l +?l?l?l?s?d?s?d?s +?s?l?d?l?l?d?s?s +?s?s?l?d?d?l?l?s +?l?s?s?l?l?s?d?d +?u?l?u?d?d?s?s?s +?d?l?l?l?d?s?s?s +?s?l?s?l?d?l?d?s +?s?u?u?u?s?d?d?s +?l?l?d?s?s?s?l?d +?s?u?s?u?s?u?d?d +?s?s?d?l?l?d?l?s +?l?d?d?l?l?s?s?s +?s?u?l?s?l?s?d?d +?l?l?d?d?l?s?s?s +?u?s?l?l?d?d?s?s +?s?l?s?l?l?d?d?s +?u?l?l?s?d?d?s?s +?d?d?s?u?s?u?s?u +?s?s?u?l?u?s?d?d +?d?u?l?u?s?d?s?s +?l?l?d?d?d?l?l?l?l?l +?s?d?d?d?d?d?d?d?d?d?d?d +?u?l?l?l?l?l?d?s?d +?l?l?d?s?d?d?d?d?d?d +?d?d?d?d?d?d?d?s?u?u +?u?l?s?d?d?d?d?d?d?d +?s?l?l?l?l?s?s?s +?l?s?l?l?d?d?d?d?s +?u?l?u?l?l?l?l?l?l +?l?l?l?s?l?l?l?d?d?d +?l?l?d?d?d?l?l?l?d?d +?u?l?l?l?l?d?u?l?l +?l?l?l?l?l?l?u?u?u +?u?d?d?u?u?u?u?u?u +?d?d?u?u?l?l?l?l?l +?u?l?l?d?d?d?d?d?d?s +?d?d?d?d?d?d?s?u?u?u +?d?d?d?l?l?l?d?d?d?s +?l?l?l?s?d?d?d?d?d?d?d +?d?l?s?l?l?s?l?l +?l?d?l?s?l?s?l?l +?u?s?u?s?u?u?u?d +?s?d?l?l?l?l?s?l +?l?l?s?l?d?s?l?l +?d?l?l?l?s?l?s?l +?s?l?d?s?l?l?l?l +?l?s?l?d?l?s?l?l +?s?d?l?l?l?s?l?l +?s?l?l?d?l?s?l?l +?d?l?s?l?l?l?s?l +?u?l?l?l?d?l?s?s +?l?d?l?s?l?l?l?s +?l?l?s?s?d?l?l?l +?l?s?s?l?l?d?l?l +?s?s?l?l?d?l?l?l +?u?l?s?l?l?l?s?d +?u?l?l?d?l?l?s?s +?l?d?s?s?l?l?l?l +?u?u?s?l?l?l?s?d +?l?l?s?s?l?d?l?l +?l?l?s?l?s?l?d?l +?l?l?s?d?l?l?l?s +?l?l?d?s?s?l?l?l +?d?d?d?l?l?l?l?d?d?d?d +?l?u?u?u?u?u?u?u?u +?s?s?s?s?s?d?d?d?d +?u?d?d?u?d?d?u?d?d?u +?l?u?l?u?d?d?d?d?d?d +?u?u?u?u?u?d?d?s?d +?l?l?l?l?d?l?s?d?d +?s?u?l?l?l?l?d?d?d +?d?l?l?l?l?d?l?l?l?l +?u?l?u?l?u?s?s?s +?l?s?l?l?d?l?s?s +?l?s?l?s?d?s?l?l +?l?l?d?l?l?s?s?s +?d?u?l?l?l?s?s?s +?s?l?l?s?l?d?l?s +?l?l?l?l?s?l?s?s +?l?l?s?l?l?l?s?s +?l?l?l?s?s?s?l?d +?u?u?u?u?s?s?s?d +?u?l?l?l?d?s?s?s +?l?l?l?s?l?l?l?s?d +?l?l?l?d?s?d?d?s?d?d +?l?s?l?l?l?l?l?u +?u?l?l?l?u?u?u?s +?d?d?d?d?d?d?d?d?u?l?l +?l?l?l?s?l?s?d?d?d +?l?l?s?d?d?d?s?l?l +?l?l?s?s?l?l?l?d?d +?u?l?u?l?l?l?d?d?d?d +?d?d?d?d?d?d?d?d?l?l?s +?u?l?l?l?l?s?l?l?l +?d?u?u?u?d?u?u?u?u +?u?u?u?u?u?l?l?d?d +?u?l?l?d?l?l?l?l?d +?l?l?l?l?l?u?l?d?d +?l?d?l?l?l?l?l?l?s +?s?u?s?s?s?s?s +?l?l?s?s?s?s?s?s +?s?s?s?s?l?s?s +?s?s?s?s?s?s?d?l +?l?d?d?d?d?d?d?d?d?d?d?l +?u?s?l?s?l?l?l?l +?l?l?l?l?u?u?s?s +?u?l?l?l?s?l?l?s +?s?l?u?l?u?l?u?s +?u?l?l?l?l?s?u?l?l +?d?d?d?d?d?u?d?d?u?d +?u?d?d?d?d?d?u?d?d?d +?u?d?d?l?d?d?d?d?d?d +?d?d?d?l?d?d?d?d?l?d +?d?d?u?d?d?d?d?d?d?u +?u?d?l?d?d?d?d?d?d?d +?d?d?d?d?u?d?d?d?u?d +?d?d?d?d?d?u?u?d?d?d +?d?d?d?d?u?d?d?u?d?d +?d?u?d?u?d?d?d?d?d?d +?d?d?u?d?d?d?u?d?d?d +?d?l?d?d?d?d?d?d?l?d +?d?u?u?d?d?d?d?d?d?d +?d?d?l?d?d?d?d?d?l?d +?d?d?d?d?l?d?d?d?l?d +?s?s?u?l?u?l?s?s +?l?l?l?l?l?l?s?d?d?d?d +?s?d?d?s?d?d?s?d?d?s +?l?d?l?l?l?l?l?d?d?d +?l?d?l?l?d?l?l?d?d?d +?s?d?l?l?u?l?l?l +?u?d?u?u?u?s?u?u +?u?u?d?s?l?l?l?l +?l?l?s?l?d?l?u?u +?u?l?s?l?u?d?l?l +?l?d?l?l?u?s?l?l +?d?u?l?l?l?s?l?l +?u?l?l?l?s?u?u?d +?l?u?s?l?l?l?d?l +?d?s?l?l?l?u?l?l +?l?l?l?u?u?u?s?d +?u?u?u?u?u?l?s?d +?l?s?u?u?u?u?u?d +?l?l?l?l?s?d?u?u +?d?u?u?s?l?l?l?l +?l?l?l?s?u?u?u?d +?s?l?l?l?u?u?u?d +?d?u?u?u?s?u?u?u +?u?u?s?u?l?l?l?d +?s?l?l?u?l?l?l?d +?u?d?l?l?u?l?s?l +?u?l?l?l?u?d?l?s +?l?d?s?l?l?l?l?u +?u?u?u?u?d?u?s?u +?d?u?l?l?l?l?s?l +?s?u?l?d?l?l?l?l +?l?u?l?l?l?l?d?s +?d?s?l?u?l?u?l?u +?l?l?d?l?s?u?l?l +?u?u?u?u?u?d?u?s +?s?d?u?u?l?l?l?l +?u?u?d?u?u?u?s?u +?u?u?d?l?l?l?l?s +?l?l?l?d?u?l?l?s +?d?u?u?l?l?l?l?s +?s?d?u?l?l?l?l?u +?u?l?l?d?s?u?l?l +?s?l?l?l?d?l?l?u +?u?l?s?l?l?d?l?u +?u?s?l?l?u?d?l?l +?s?d?l?l?l?l?l?u +?d?l?l?s?u?l?l?l +?l?l?l?s?d?u?l?l +?d?l?u?l?l?l?l?s +?d?s?l?l?l?l?l?u +?u?d?u?s?u?u?u?u +?s?l?l?l?l?l?d?u +?l?l?s?d?l?l?l?u +?d?l?l?l?s?l?l?u +?l?l?d?s?u?l?l?l +?d?d?l?l?l?s?d?d?d?d +?d?d?d?d?d?l?l?l?l?s +?u?l?u?d?d?d?u?l?u +?u?l?l?l?l?d?d?l?d +?l?l?l?d?d?d?l?l?l?d +?u?d?l?l?d?l?d?l?l +?s?s?s?s?s?l?l?l +?l?s?d?d?s?l?s?d?d +?s?s?l?l?d?l?s?s +?s?s?s?s?d?l?l?l +?l?s?l?s?l?s?l?s?l +?l?l?l?l?u?u?u?l +?u?l?l?u?l?u?u?l +?l?l?l?l?l?l?u?u?d +?u?l?l?u?u?u?l?l +?u?l?u?l?u?u?l?l +?u?u?u?l?u?u?l?u +?u?u?u?l?u?u?l?l +?l?u?u?l?l?u?l?l +?u?l?u?u?u?l?u?u +?u?l?u?u?l?l?u?u +?u?u?u?u?l?l?u?u +?u?l?l?l?u?l?u?u +?u?l?u?u?l?u?u?l +?u?l?u?u?u?l?l?l +?u?u?l?u?u?u?u?u +?u?u?u?l?u?u?u?l +?u?l?u?u?l?l?l?u +?d?d?l?l?l?l?l?l?l?d?d +?d?d?l?l?l?l?l?l?u +?u?d?l?l?l?l?l?d?l +?u?u?u?u?d?u?u?u?d +?l?l?l?d?d?d?d?l?l?d +?u?u?u?d?d?u?u?u?d?d +?d?d?d?d?d?u?u?u?d?d +?d?d?d?d?d?d?d?l?l?u +?l?d?l?d?d?l?d?d?l?d +?d?d?d?l?d?l?l?d?d?d +?l?d?l?d?d?d?d?d?d?l +?d?d?d?d?l?l?l?d?d?l +?u?d?d?d?d?d?d?d?u?u +?d?d?u?u?u?d?d?d?d?d +?d?l?d?d?l?d?d?l?d?d +?d?d?d?l?d?d?l?l?d?d +?l?d?d?d?l?d?l?d?d?d +?d?d?d?l?l?d?l?d?d?d +?d?l?d?d?d?l?d?l?d?d +?u?l?u?d?d?d?d?d?d?d?d +?l?d?d?d?d?d?d?d?l?u +?d?d?d?d?l?l?d?l?d?d +?d?l?d?l?l?d?d?d?d?d +?l?l?d?d?s?l?l?l?l +?d?d?l?l?l?s?l?l?l +?l?l?d?d?l?l?l?l?s +?s?d?d?d?d?d?d?d?s?l +?l?l?d?d?d?d?d?d?d?d?s +?l?l?l?l?u?u?u?u?u +?l?l?s?l?s?l?s?l +?l?l?l?l?s?d?d?d?l +?l?l?l?d?l?l?s?d?d +?l?l?s?d?d?d?l?l?l +?l?d?l?l?l?l?d?d?s +?l?s?l?s?l?s?l?d?d +?l?d?d?d?d?d?d?d?d?l?l +?s?s?s?d?d?d?s?s?s +?d?d?d?s?d?s?d?d?s +?d?d?s?s?d?d?d?d?s +?d?s?s?d?s?d?d?d?d +?d?d?d?d?d?s?s?s?d +?d?d?d?s?d?d?d?s?s +?s?d?d?s?s?d?d?d?d +?s?s?d?d?d?d?s?d?d +?d?d?d?d?d?s?d?s?s +?d?d?d?s?d?d?s?s?d +?d?d?d?s?d?d?d?l?l?l +?d?d?d?d?d?d?u?u?u?s +?d?d?d?s?d?s?d?d?d?d +?s?d?d?s?d?d?d?d?d?d +?d?d?s?s?d?d?d?d?d?d +?d?s?d?d?d?d?d?d?d?s +?s?l?l?l?l?d?d?d?d?s +?l?l?l?l?s?d?d?s?d?d +?l?s?d?d?l?l?l?l?l +?l?l?u?u?l?l?l?d?d +?d?d?u?u?u?l?l?l?l +?s?s?l?l?l?l?l?l?l +?l?l?l?l?u?l?l?l?d +?l?l?l?l?l?u?d?d?d?d +?l?l?l?l?d?d?s?d?d?d +?u?s?l?s?d?d?d?d?d +?u?l?d?s?d?d?s?d?d +?s?d?d?l?d?l?d?d?s +?l?s?l?d?s?d?d?d?d +?l?l?d?d?d?s?d?s?d +?d?d?d?s?l?l?s?d?d +?l?l?d?d?d?s?s?d?d +?l?s?l?d?d?d?s?d?d +?d?d?s?l?l?d?d?d?s +?l?s?s?l?d?d?d?d?d +?l?d?l?d?d?d?d?s?s +?s?d?d?d?d?d?s?l?l +?l?l?s?d?s?d?d?d?d +?d?d?l?l?s?d?s?d?d +?u?u?d?d?s?d?s?d?d +?u?d?l?d?l?d?l?d?l?d +?u?s?u?s?u?s?d?d?d +?l?l?d?d?d?d?d?d?s?d +?l?d?d?d?s?d?d?d?d?l +?d?d?d?d?d?d?s?d?l?l +?d?d?d?d?s?d?d?d?l?l +?d?d?d?l?l?d?d?d?d?s +?d?d?d?d?d?d?s?l?l?d +?l?l?d?d?d?d?d?s?d?d +?l?l?l?l?l?l?l?u?u +?l?l?l?l?l?u?s?s +?l?l?l?s?u?u?u?s +?u?s?l?l?l?l?s?u +?u?l?l?l?l?u?s?s +?u?u?u?u?s?u?s?u +?u?s?l?l?l?s?l?l +?u?l?s?l?l?l?l?s +?u?d?u?d?u?d?u?d?s +?u?d?l?d?l?d?l?d?s +?l?l?l?d?l?d?s?d?d +?l?s?l?d?l?l?d?d?d +?u?s?u?l?l?d?d?d?d +?u?l?l?l?d?d?d?s?d +?l?l?l?s?d?d?d?d?l +?l?d?l?d?l?l?s?d?d +?u?l?l?s?u?d?d?d?d +?u?u?s?d?d?d?d?l?l +?l?l?l?d?d?d?l?d?s +?u?s?u?u?u?u?u?d?d +?l?l?l?u?s?l?l?l +?u?l?l?s?l?u?l?l +?u?s?l?l?l?l?l?u +?s?l?l?u?l?l?l?l +?u?l?l?l?l?u?s?u +?u?l?u?l?u?l?s?u +?u?l?u?s?u?l?u?l +?u?s?l?l?u?l?l?l +?l?s?u?l?l?l?l?l +?u?l?l?d?u?l?l?l?l +?u?l?l?l?l?l?u?l?d +?l?l?l?l?l?u?u?u?d +?l?l?l?l?l?l?s?s?l +?d?l?l?d?l?l?d?d?d?d +?d?d?d?l?d?d?d?l?l?l +?l?l?l?d?d?d?d?d?d?u +?u?d?d?l?l?l?d?d?d?d +?l?u?u?u?d?d?d?d?d?d +?u?l?d?l?l?l?l?l?d +?s?d?d?d?s?l?l?l?l +?u?s?s?l?l?d?d?d?d +?l?d?l?d?l?d?d?s?s +?u?s?l?l?s?d?d?d?d +?l?l?l?s?d?s?d?d?d +?u?u?u?d?s?d?s?d?d +?u?u?u?s?s?d?d?d?d +?s?d?d?l?l?l?s?d?d +?l?l?l?l?l?u?l?l?l +?u?l?l?d?l?d?l?d?l +?u?d?u?u?d?u?u?d?u +?u?u?u?d?d?d?u?l?l +?u?d?u?d?u?d?u?u?u +?u?d?l?l?l?d?l?d?l +?u?d?l?l?d?d?l?l?l +?s?d?d?d?d?d?d?l?l?l +?u?l?l?d?d?s?d?d?d?d +?s?s?l?l?s?s?l?l +?l?l?l?l?l?l?d?d?s?d +?l?l?l?s?l?l?s?s +?s?l?l?s?l?l?l?s +?l?s?l?l?s?l?s?l +?d?d?s?d?d?s?d?d?s?d?d +?d?d?s?s?s?s?s?d +?s?d?s?s?d?s?d?s +?s?d?d?d?s?s?s?s +?d?s?s?d?s?s?d?s +?d?s?s?d?s?d?s?s +?s?s?s?s?d?d?d?s +?s?s?d?d?s?s?d?s +?s?d?d?s?s?s?d?s +?s?d?s?d?s?s?d?s +?l?l?d?s?l?d?l?u +?l?s?l?d?d?u?u?u +?u?u?s?u?l?u?d?d +?l?l?l?u?s?d?d?u +?u?d?l?l?l?s?l?d +?l?d?s?l?d?l?u?u +?l?u?u?u?s?u?d?d +?l?s?u?d?l?l?d?u +?u?d?l?d?l?u?l?s +?d?l?d?s?l?l?l?u +?u?l?s?d?d?l?l?u +?u?l?u?d?l?s?l?d +?d?s?d?l?u?u?u?l +?d?s?d?l?u?u?u?u +?l?l?s?l?l?u?d?d +?u?d?u?l?d?l?l?s +?l?d?l?s?l?l?d?u +?s?d?d?l?u?l?l?l +?u?l?l?d?s?d?u?l +?u?d?u?u?u?s?u?d +?s?l?d?u?l?l?d?l +?l?u?d?s?l?d?l?u +?u?s?u?u?u?d?d?u +?d?u?u?u?u?u?d?s +?l?u?l?d?l?d?s?l +?d?l?d?u?l?u?s?u +?l?l?l?s?u?l?d?d +?s?l?l?d?l?u?l?d +?s?d?d?u?u?u?l?l +?u?l?l?l?s?d?u?d +?u?u?s?l?d?d?u?l +?l?u?s?d?d?u?u?u +?d?l?l?l?s?l?d?u +?l?u?d?s?d?l?u?l +?s?d?u?u?u?l?l?d +?s?d?d?u?l?u?l?l +?l?l?s?u?l?d?l?d +?s?d?u?l?l?l?l?d +?u?d?s?l?l?l?d?l +?l?u?d?d?l?l?l?s +?l?u?l?l?s?l?d?d +?u?l?d?d?s?u?l?l +?l?d?u?s?l?d?l?l +?d?u?u?l?u?s?u?d +?s?l?d?u?l?d?l?u +?u?l?l?s?d?u?d?u +?l?d?l?d?u?u?u?s +?u?u?d?u?u?d?u?s +?u?l?u?l?d?d?s?l +?u?l?u?l?d?d?s?u +?s?l?l?l?d?u?u?d +?l?l?l?u?d?d?l?s +?l?l?s?d?d?l?l?u +?u?d?l?u?s?d?l?u +?u?l?l?s?l?d?d?u +?l?u?u?d?l?u?d?s +?l?l?l?d?d?u?u?s +?u?d?l?d?u?u?s?l +?l?l?l?s?l?d?d?u +?l?d?u?d?l?s?l?l +?s?l?l?d?u?d?l?l +?u?u?u?d?d?u?s?u +?u?l?s?u?d?l?d?l +?u?u?u?u?d?d?l?s +?u?d?l?s?l?u?l?d +?l?l?d?l?u?u?s?d +?l?u?l?u?u?d?d?s +?l?l?d?s?l?d?u?u +?u?l?d?l?s?l?d?l +?u?s?d?l?u?u?d?u +?u?u?l?s?l?l?d?d +?u?u?l?s?u?u?d?d +?u?u?l?l?s?l?d?d +?u?u?u?d?s?u?u?d +?l?l?s?u?d?d?l?l +?l?s?l?d?u?d?l?l +?l?s?l?u?u?d?u?d +?u?d?s?l?d?u?u?u +?u?u?l?l?d?u?d?s +?u?u?s?u?d?u?u?d +?l?u?d?l?l?u?d?s +?u?s?d?l?l?d?l?l +?u?d?l?s?u?l?l?d +?u?d?l?s?l?l?d?l +?u?d?d?l?u?u?l?s +?u?l?d?l?s?u?l?d +?d?u?u?u?u?d?u?s +?u?d?d?l?s?u?l?l +?u?u?l?l?d?l?s?d +?u?s?l?l?u?d?d?l +?u?l?d?l?l?s?d?l +?u?l?u?s?u?u?d?d +?l?l?d?l?s?d?l?l +?l?u?l?d?s?d?u?l +?l?l?s?d?l?d?l?l +?u?d?u?d?s?u?u?u +?u?l?l?u?d?d?l?s +?u?l?u?s?l?u?d?d +?l?l?u?l?u?d?d?s +?d?l?l?u?d?s?l?u +?l?l?s?l?u?u?d?d +?u?s?l?d?l?u?l?d +?l?u?l?s?l?l?d?d +?l?l?l?l?l?d?d?s?l +?d?s?l?l?u?u?l?d +?u?s?l?l?u?u?d?d +?u?l?l?d?l?d?l?s +?u?u?u?l?s?l?d?d +?u?u?l?l?s?d?d?l +?s?u?l?l?l?d?u?d +?u?l?u?u?l?d?s?d +?u?u?l?s?d?d?l?l +?d?l?l?l?d?u?s?u +?s?l?l?d?d?u?u?u +?u?u?d?l?l?l?d?s +?l?s?d?u?d?l?l?u +?u?d?s?l?l?d?l?u +?d?l?s?u?l?l?u?d +?s?l?l?u?u?d?l?d +?l?l?u?d?l?l?d?s +?l?d?s?l?l?u?d?l +?u?s?u?u?l?d?l?d +?u?l?l?u?u?s?d?d +?l?u?d?l?d?s?u?u +?l?u?d?d?l?l?s?l +?u?s?d?d?u?u?u?l +?l?l?l?d?d?u?l?s +?u?d?s?l?l?d?u?u +?u?u?s?u?d?d?u?u +?u?d?l?s?u?d?l?l +?d?d?l?l?u?u?u?s +?u?u?u?d?s?d?l?l +?u?u?u?s?u?d?d?u +?d?u?s?l?l?d?u?u +?l?l?u?s?u?d?d?l +?l?u?l?d?d?s?u?u +?l?d?d?u?u?l?s?l +?u?d?d?l?l?u?s?l +?s?d?l?u?l?u?d?l +?l?u?u?s?u?d?d?u +?d?u?s?d?l?l?l?l +?u?l?d?d?u?l?l?s +?u?d?u?u?u?d?u?s +?d?d?l?l?l?u?u?s +?u?s?d?d?u?l?l?l +?l?u?d?l?s?u?d?l +?d?l?s?l?l?l?d?u +?u?d?l?s?u?l?d?l +?u?l?d?u?l?l?s?d +?s?u?u?d?u?u?u?d +?d?l?l?u?s?l?l?d +?u?d?l?l?d?l?u?s +?d?u?s?u?d?u?u?u +?u?s?u?l?l?d?l?d +?l?d?l?l?u?l?d?s +?l?d?u?l?s?l?l?d +?l?s?d?u?d?u?u?u +?l?l?d?d?u?l?l?s +?l?l?d?d?u?s?l?l +?s?d?u?u?u?u?d?l +?s?u?l?l?d?u?l?d +?u?d?d?l?u?s?l?u +?u?d?d?l?u?s?l?l +?d?s?u?u?u?d?u?u +?d?l?l?u?l?d?l?s +?u?u?s?u?u?l?d?d +?u?u?d?u?d?u?s?u +?u?l?s?d?l?d?l?l +?d?d?u?l?l?s?l?l +?l?u?d?d?s?u?l?l +?s?u?l?u?l?u?d?d +?u?d?s?l?u?l?d?l +?l?l?l?l?s?d?u?d +?d?s?l?l?l?u?u?d +?u?u?l?l?d?d?u?s +?l?l?u?u?d?l?d?s +?u?s?u?d?l?d?l?l +?u?d?u?l?u?s?u?d +?d?u?u?u?s?l?l?d +?l?l?d?l?l?d?s?u +?l?s?l?d?d?u?l?l +?u?l?l?d?u?d?u?s +?l?l?l?s?u?d?u?d +?l?l?u?l?s?d?d?l +?u?l?u?d?d?u?s?u +?s?u?u?d?u?d?l?l +?u?s?l?l?d?l?d?u +?s?d?u?u?u?u?u?d +?u?d?l?u?s?d?u?l +?u?s?d?u?d?u?u?u +?s?d?d?u?l?u?l?u +?u?l?u?l?d?d?l?s +?l?l?l?d?s?u?u?d +?u?l?d?d?l?l?s?u +?s?u?l?l?d?d?l?u +?l?d?s?u?u?d?u?l +?u?l?l?u?s?l?d?d +?u?u?l?d?l?d?l?s +?u?l?l?d?d?u?l?s +?u?l?s?d?d?u?l?u +?u?l?s?d?d?u?l?l +?u?l?d?l?d?l?u?s +?d?d?u?l?l?l?s?u +?d?s?l?l?l?l?d?u +?u?s?u?d?u?u?l?d +?l?s?u?u?d?d?l?l +?l?l?s?l?u?d?l?d +?d?u?d?u?l?s?l?l +?u?l?l?d?d?l?u?s +?s?l?u?d?u?l?d?l +?u?d?l?l?d?u?u?s +?l?d?d?u?l?l?s?l +?l?l?l?l?d?d?d?l?s +?l?l?l?d?d?s?u?u +?u?d?u?l?d?u?s?l +?u?u?u?s?u?l?d?d +?d?l?l?u?s?l?d?l +?u?u?l?l?d?d?s?l +?l?u?d?u?d?s?l?u +?l?l?d?l?l?s?l?d +?d?l?u?s?l?l?u?d +?l?u?d?d?s?l?u?l +?d?u?s?u?u?l?l?d +?u?d?l?l?u?s?l?d +?l?l?l?u?s?d?d?l +?u?l?d?d?l?u?u?s +?u?u?d?u?d?u?u?s +?l?d?d?u?l?u?s?u +?l?l?u?s?u?l?d?d +?l?l?l?l?d?s?u?d +?d?l?l?s?u?u?u?d +?s?l?d?l?l?l?u?d +?l?l?d?d?u?l?u?s +?l?u?l?l?l?d?s?d +?s?u?l?u?d?d?u?l +?d?s?u?u?u?u?u?d +?s?l?d?l?u?l?d?l +?l?l?d?d?l?u?s?u +?d?l?d?u?u?l?l?s +?u?u?d?s?d?u?l?u +?s?u?d?d?u?l?l?l +?u?s?u?d?d?u?u?u +?d?l?d?u?l?s?l?u +?d?d?l?l?u?s?l?l +?d?l?l?d?l?l?s?l +?u?s?u?u?d?u?l?d +?u?u?u?u?d?u?s?d +?l?u?u?l?u?s?d?d +?u?s?l?l?d?d?l?u +?d?u?d?u?l?l?l?s +?u?d?s?l?l?l?l?d +?d?l?d?s?u?l?l?u +?s?l?l?l?d?u?l?d +?u?s?d?l?l?l?u?d +?u?u?d?l?l?d?l?s +?u?d?u?u?u?u?s?d +?s?l?l?l?l?d?d?u +?u?l?d?d?s?u?u?u +?l?l?u?l?s?l?d?d +?s?u?l?d?d?l?l?u +?u?l?d?d?l?s?u?u +?u?d?l?u?s?l?l?d +?u?d?s?u?u?d?u?u +?d?l?l?l?l?d?s?l +?d?d?u?s?u?l?u?l +?d?d?l?l?l?s?u?u +?l?l?d?s?d?u?l?l +?d?l?s?l?l?l?u?d +?d?u?s?l?l?l?d?u +?d?l?u?s?d?u?l?l +?d?d?u?u?u?s?l?l +?l?s?u?d?d?u?l?u +?l?d?l?u?s?l?d?l +?u?s?l?d?l?l?d?l +?d?d?u?l?s?l?l?l +?u?l?l?s?d?l?d?l +?u?u?u?u?d?s?u?d +?s?l?l?l?d?l?l?d +?d?u?s?l?l?l?d?l +?u?d?d?s?u?u?u?u +?u?l?u?s?l?d?d?u +?u?l?d?l?l?d?s?u +?u?d?l?l?u?d?l?s +?l?d?u?u?l?d?s?l +?d?d?s?l?u?u?u?u +?u?l?l?s?l?l?l?d?d +?u?d?u?d?l?l?s?l +?l?l?d?l?l?u?d?s +?u?u?u?l?u?d?d?s +?l?u?l?d?l?s?d?l +?d?l?l?d?l?s?u?u +?s?u?u?u?d?d?l?l +?u?d?l?s?d?l?u?u +?d?d?l?u?l?l?l?s +?l?u?d?u?d?u?s?u +?u?s?u?u?l?l?d?d +?u?l?d?s?l?d?u?u +?u?l?l?d?s?d?l?l +?u?u?d?u?u?u?s?d +?u?d?d?l?s?u?l?u +?l?d?d?s?u?l?l?l +?d?l?l?l?l?d?u?s +?l?l?d?s?d?u?u?u +?d?d?l?l?l?s?l?u +?u?d?u?s?l?l?l?d +?u?l?l?u?d?l?s?d +?l?d?d?s?l?l?u?u +?u?l?l?d?l?s?d?l +?d?d?s?u?l?u?l?l +?d?u?u?d?l?s?l?l +?u?u?l?l?d?s?d?l +?l?d?s?d?u?u?u?l +?d?d?l?u?u?u?u?s +?u?u?u?d?d?l?l?s +?u?u?d?s?d?u?u?u +?d?l?l?d?u?l?s?u +?d?l?l?l?d?s?l?u +?u?d?l?d?l?s?u?u +?l?l?l?s?l?u?d?d +?d?d?u?s?l?l?u?l +?u?s?l?d?u?l?u?d +?d?u?u?u?s?d?l?l +?u?d?l?d?l?l?s?l +?u?s?d?l?d?l?l?u +?u?d?u?u?d?s?l?l +?u?u?l?l?l?d?s?d +?l?u?l?u?l?d?d?s +?s?l?d?u?u?d?l?l +?d?u?l?d?l?l?l?s +?l?l?l?l?d?s?d?u +?d?u?s?l?l?l?l?d +?d?d?u?u?u?l?u?s +?u?u?d?d?s?u?u?l +?s?u?d?l?l?l?d?l +?d?u?u?s?l?l?d?l +?u?d?s?d?l?u?l?u +?l?d?l?d?u?u?s?u +?d?u?u?u?d?s?u?u +?u?l?s?d?l?u?d?u +?d?d?l?u?l?l?s?l +?u?d?u?l?u?s?l?d +?u?l?l?u?d?u?d?s +?l?u?l?u?s?d?d?l +?l?l?d?d?d?l?l?l?s +?u?l?u?l?s?u?d?d +?u?u?d?d?u?u?s?u +?u?d?l?u?s?l?d?l +?u?u?l?l?d?l?d?s +?u?d?l?u?l?s?d?u +?l?u?u?s?l?d?d?l +?u?u?u?d?s?l?l?d +?l?u?l?l?d?l?d?s +?u?d?l?l?s?d?l?l +?u?l?u?l?d?u?s?d +?u?u?l?l?d?d?l?s +?u?l?u?u?u?d?d?s +?u?s?u?d?l?l?l?d +?u?u?u?u?l?d?d?s +?u?s?u?l?d?l?u?d +?s?l?l?u?l?d?d?l +?s?l?d?l?d?l?u?u +?d?l?l?l?u?u?d?s +?u?u?u?d?u?s?d?u +?l?l?d?d?s?l?l?u +?u?l?u?d?u?s?l?d +?u?d?l?d?u?l?u?s +?d?s?l?u?l?u?d?l +?l?d?u?s?l?l?l?d +?u?u?l?l?d?d?s?u +?l?l?s?d?d?u?l?u +?d?l?l?u?l?l?d?s +?u?s?d?l?d?u?u?l +?d?u?u?u?l?l?d?s +?u?u?u?d?l?l?s?d +?u?l?l?d?d?s?u?u +?s?d?l?l?u?l?u?d +?u?l?l?d?d?l?s?l +?d?s?u?l?l?l?l?d +?s?l?l?l?d?l?d?l +?d?u?u?u?u?d?s?u +?u?l?s?l?l?d?d?l +?l?l?u?d?d?s?l?u +?d?l?l?l?d?s?u?u +?u?u?d?d?l?s?u?u +?s?d?l?l?l?u?l?d +?u?u?s?l?l?u?d?d +?l?u?l?s?d?u?u?d +?d?l?s?l?u?d?l?u +?l?l?d?s?u?l?l?d +?d?u?d?u?u?u?u?s +?u?s?d?u?u?u?u?d +?s?u?d?l?l?l?l?d +?d?d?l?l?s?u?l?l +?d?d?u?l?u?l?s?l +?l?d?u?u?s?u?u?d +?l?d?u?s?l?d?l?u +?u?l?d?s?l?l?d?l +?l?d?u?s?d?l?l?u +?u?d?u?s?u?u?u?d +?s?u?u?d?d?l?l?l +?l?d?s?l?l?d?l?u +?s?d?d?u?l?l?l?u +?u?d?l?u?d?s?l?l +?s?l?l?d?u?l?l?d +?l?d?l?d?l?l?d?l?s +?u?u?u?u?d?s?d?l +?u?l?l?u?s?d?d?l +?d?u?d?l?l?s?u?l +?d?d?l?u?s?l?u?l +?d?u?u?s?d?u?u?u +?u?d?u?u?d?s?u?u +?l?d?d?l?l?l?l?l?s +?l?u?u?l?u?d?d?s +?l?d?l?l?u?d?l?s +?l?s?u?l?d?l?d?u +?s?l?l?d?l?l?d?u +?u?u?l?u?u?s?d?d +?u?d?d?s?l?l?u?u +?d?s?d?u?l?l?l?l +?d?u?u?u?d?u?s?u +?d?d?u?l?u?u?l?s +?d?l?l?d?l?s?l?l +?d?d?u?u?l?u?u?s +?l?d?d?l?s?u?l?l +?l?l?u?u?s?d?d?l +?l?u?u?u?s?d?d?l +?s?l?d?u?l?l?l?d +?l?d?s?l?l?l?d?u +?l?u?l?u?s?d?d?u +?s?l?l?u?u?d?d?l +?s?l?d?u?l?d?l?l +?l?u?u?u?u?d?s?d +?l?u?l?d?s?u?l?d +?d?u?l?u?l?s?l?d +?l?l?l?s?d?d?l?u +?l?d?d?l?l?s?u?u +?s?d?u?d?l?l?l?l +?d?l?l?s?u?l?d?l +?d?l?d?u?u?u?l?s +?s?u?l?d?l?l?d?u +?u?s?l?d?d?u?l?l +?u?s?l?d?d?u?l?u +?s?d?u?u?d?u?u?u +?l?s?l?l?d?l?u?d +?s?l?l?l?u?l?d?d +?d?d?d?u?l?l?l?l?s +?d?s?l?d?u?l?u?l +?d?d?u?u?u?s?u?l +?u?l?d?l?l?u?s?d +?l?s?u?d?d?u?u?u +?u?l?s?u?u?u?d?d +?l?l?l?s?d?l?d?u +?u?l?l?s?d?d?u?l +?u?l?l?l?d?s?l?d +?u?l?d?l?s?l?u?d +?l?l?l?l?s?s?d?d?d?d +?d?d?s?s?d?s?s?d?d +?l?l?l?d?d?d?d?l?u +?l?l?l?l?d?d?d?d?l?d +?u?u?u?l?d?d?l?d?d +?d?d?u?u?l?u?u?d?d +?d?d?u?l?l?u?u?d?d +?l?l?d?d?d?d?u?l?l +?u?l?l?d?d?d?l?l?d +?u?l?l?u?d?d?d?d?l +?u?l?d?d?d?d?u?u?u +?u?u?u?l?u?d?d?d?d +?u?u?u?d?d?d?u?d?u +?u?l?d?d?d?d?u?l?l +?u?l?d?d?u?l?d?d?u +?u?d?d?u?u?d?d?u?u +?l?d?d?l?d?d?u?u?u +?u?l?l?l?d?d?u?d?d +?d?d?d?d?u?l?u?u?l +?u?u?u?d?u?u?d?d?d +?u?l?l?l?d?d?l?d?d +?u?u?u?d?d?d?u?u?d +?u?u?d?d?u?u?d?d?u +?l?d?d?d?d?u?l?l?l +?u?l?d?d?l?l?d?d?l +?l?l?l?d?d?u?u?d?d +?u?l?d?d?l?d?d?l?l +?u?d?u?d?u?d?u?u?d +?u?d?d?d?d?u?l?u?l +?u?d?l?l?d?l?d?d?l +?u?d?d?l?d?d?l?l?l +?d?d?u?u?d?d?u?u?u +?u?l?l?u?d?d?d?d?u +?d?l?u?l?d?l?d?l?d +?u?d?d?l?l?d?l?d?l +?u?u?d?d?d?u?u?d?u +?u?d?l?d?l?l?d?d?l +?d?d?d?d?u?l?l?u?l +?u?d?d?l?l?l?d?d?u +?l?l?l?s?l?l?l?l?d?d +?l?d?d?d?l?l?l?l?l?l +?l?l?l?l?l?l?d?l?d?d +?s?l?s?l?s?d?s?d +?l?d?s?s?l?d?s?s +?s?s?s?s?d?l?d?l +?d?d?s?s?s?s?l?l +?s?s?s?s?l?d?l?d +?u?l?d?s?s?s?s?d +?s?s?d?l?l?d?s?s +?s?s?u?u?s?s?d?d +?s?s?d?d?u?l?s?s +?s?s?s?l?l?s?d?d +?l?s?l?s?s?s?d?d +?d?l?d?l?s?s?s?s +?l?s?l?s?d?s?d?s +?s?d?s?l?l?s?d?s +?l?s?l?s?d?d?s?s +?u?l?l?d?d?u?l?l?d?d +?d?l?u?u?l?u?u?l +?u?l?u?u?d?l?l?u +?l?u?u?d?u?u?u?l +?u?u?u?u?d?u?l?u +?l?d?l?l?u?u?u?l +?u?l?u?l?d?l?u?u +?l?l?d?u?l?u?l?u +?u?u?u?d?u?u?l?l +?u?u?u?d?u?u?l?u +?u?u?l?l?l?u?u?d?d +?d?u?u?u?u?l?l?u +?l?u?l?l?l?u?d?u +?u?l?l?l?u?d?l?u +?l?l?u?d?l?u?u?u +?u?l?d?u?l?u?l?l +?u?l?u?d?u?u?u?l +?u?l?l?u?u?d?u?u +?l?l?u?l?u?u?l?d +?u?l?l?u?u?l?d?u +?l?l?d?l?u?l?u?u +?l?l?l?l?u?l?u?d +?l?l?d?l?u?u?u?l +?u?u?l?l?l?d?u?l +?l?u?u?l?d?u?u?u +?l?u?u?l?d?u?u?l +?u?u?d?u?u?u?l?l +?d?l?u?u?u?l?l?l +?u?d?l?u?u?l?u?u +?u?l?d?u?l?l?l?u +?d?u?l?l?l?u?l?u +?u?d?l?u?u?u?u?l +?u?u?l?l?d?l?l?u +?l?u?u?l?d?l?l?l +?l?u?u?l?d?l?l?u +?u?l?l?u?u?u?d?l +?u?l?u?u?u?d?l?u +?u?l?u?l?u?d?l?u +?u?l?u?l?l?d?u?u +?l?u?u?d?u?l?u?u +?l?u?l?u?u?l?d?l +?d?l?l?u?u?u?l?l +?u?l?l?u?l?u?u?d +?u?u?l?l?d?l?u?l +?l?u?u?l?d?l?u?u +?u?d?u?l?u?l?l?l +?u?d?l?u?l?l?l?u +?u?u?d?u?l?l?l?u +?l?l?u?u?u?d?u?u +?u?l?u?u?u?d?u?u +?d?l?u?u?u?l?u?u +?u?l?d?l?u?u?u?u +?l?l?l?d?u?l?u?u +?l?d?l?u?u?u?u?l +?u?l?d?u?l?l?u?u +?u?d?u?u?u?u?l?l +?l?u?l?u?l?d?l?u +?l?u?l?u?l?d?l?l +?l?u?d?u?l?u?l?l +?l?u?l?l?l?u?u?d +?u?u?u?l?l?l?d?u +?d?l?l?u?u?l?l?u +?u?d?l?u?l?l?u?l +?d?u?u?u?l?l?u?u +?u?u?l?d?l?u?u?u +?u?u?l?l?d?u?l?u +?l?u?u?d?u?l?l?u +?u?l?d?l?l?u?u?u +?l?u?l?u?d?l?l?l +?l?l?u?l?l?u?d?l +?u?u?l?l?u?l?u?d +?d?u?u?u?l?u?l?l +?u?u?d?l?u?l?u?l +?l?d?l?u?u?u?l?l +?d?u?u?l?u?l?u?l +?u?l?l?d?l?u?u?l +?u?l?d?l?u?u?l?l +?d?l?l?l?u?u?u?l +?u?l?u?l?u?u?d?l +?u?d?l?u?l?u?l?u +?d?u?l?l?u?u?l?u +?u?l?d?l?u?u?l?u +?u?l?u?u?l?l?u?d +?d?l?l?u?u?l?u?u +?d?u?l?u?l?u?l?l +?u?u?d?l?u?l?l?u +?u?u?l?u?u?d?u?u +?d?u?u?l?u?l?l?u +?l?u?l?l?d?u?u?l +?u?l?l?u?l?u?d?l +?u?d?u?l?u?l?l?u +?l?l?u?l?u?l?l?d +?l?d?l?l?u?l?l?u +?l?l?u?u?u?l?d?u +?u?u?l?u?d?u?l?u +?l?l?d?l?u?u?l?u +?l?u?d?l?u?l?l?l +?l?u?d?l?u?l?l?u +?l?l?d?u?u?u?u?l +?u?l?d?u?u?l?l?l +?d?u?u?l?l?l?u?u +?d?l?l?l?l?u?l?u +?l?l?l?d?l?u?l?u +?l?u?u?l?l?l?d?l +?l?u?l?l?l?l?d?u +?l?u?l?l?d?l?u?u +?u?u?u?l?d?l?l?u +?l?d?u?l?u?l?u?l +?l?l?u?l?u?l?u?d +?u?u?l?u?d?u?u?l +?u?u?l?u?d?u?u?u +?u?l?d?u?u?u?l?l +?u?l?d?u?u?u?l?u +?u?d?u?l?l?u?u?u +?d?u?l?l?u?l?l?u +?u?l?l?u?l?d?u?l +?l?d?l?l?l?u?u?l +?d?u?u?u?u?u?l?l +?l?u?u?u?u?u?d?l +?l?u?l?l?d?l?l?u +?l?l?d?u?u?l?u?u +?d?l?l?u?l?u?l?l +?l?u?u?u?u?l?u?d +?l?l?l?u?l?u?d?u +?u?d?u?l?u?u?l?u +?u?d?u?u?u?u?u?l +?l?u?d?l?u?u?l?l +?l?u?l?u?u?d?u?l +?l?l?u?l?d?l?l?u +?d?u?u?l?u?u?u?l +?u?u?u?l?u?u?d?u +?l?u?l?u?l?u?d?u +?l?u?u?l?d?u?l?u +?l?l?u?u?l?d?u?l +?u?d?u?l?u?u?u?l +?l?u?u?l?u?d?l?l +?l?u?l?d?u?l?l?u +?d?l?l?u?l?u?l?u +?l?u?u?l?u?d?u?l +?u?u?d?l?l?l?u?u +?u?l?d?u?l?l?u?l +?d?l?u?u?u?u?l?l +?l?l?l?u?u?l?d?u +?l?l?u?u?d?l?l?u +?u?d?u?u?l?u?u?l +?u?d?u?u?u?l?u?u +?u?l?l?l?l?d?d?u?u +?u?l?l?l?u?u?d?u +?l?u?u?u?l?d?u?u +?l?u?d?u?u?u?u?l +?u?u?u?l?u?d?u?u +?d?l?l?u?u?u?u?l +?l?l?l?u?u?u?l?d +?u?u?u?d?u?l?l?u +?u?u?l?d?u?u?l?l +?d?l?u?l?l?l?u?l +?l?l?l?u?l?u?u?d +?u?u?u?u?d?l?u?l +?u?l?l?u?u?l?l?d?d +?l?l?l?u?l?d?u?l +?u?d?u?u?l?u?u?u +?l?l?u?l?l?d?u?u +?d?l?l?l?u?u?l?l +?d?l?u?l?u?u?u?u +?l?u?u?l?u?d?l?u +?l?u?l?u?u?l?u?d +?l?d?l?l?u?u?l?u +?d?u?u?u?l?l?l?u +?u?u?u?d?l?l?u?u +?u?u?u?d?l?l?u?l +?u?l?u?d?l?u?u?l +?l?l?l?u?u?u?d?u +?u?u?u?u?l?l?d?u +?u?l?u?d?u?u?l?u +?l?l?l?l?l?l?l?l?d?s +?d?d?s?d?s?d?d?d?d?l +?d?s?d?d?s?d?d?d?d?l +?d?d?d?d?l?l?s?s?s +?s?s?s?l?l?d?d?d?d +?s?l?s?l?s?d?d?d?d +?l?l?l?l?d?d?d?s?d?d +?l?l?l?l?d?d?l?d?d?d +?l?d?l?l?l?l?l?l?d?d +?l?s?l?s?l?s?d?l +?l?l?s?s?s?l?l?d +?u?u?u?u?d?s?s?s +?s?s?s?l?l?l?d?l +?l?l?l?l?s?s?d?s +?l?d?s?l?l?l?s?s +?s?u?u?s?d?l?l?s +?u?l?l?l?s?s?s?d +?l?s?l?l?s?s?l?d +?d?l?l?s?s?u?u?s +?l?d?s?l?s?s?l?l +?l?s?l?l?s?l?s?d +?l?l?l?s?l?l?d?d?d?d +?u?l?l?l?l?l?l?s?s +?d?d?d?d?d?d?l?l?l?u +?d?l?l?d?d?l?l?d?d?d +?u?u?d?d?u?u?d?d?d?d +?u?d?d?d?d?d?d?l?l?l +?d?l?d?d?l?d?d?l?d?l +?d?d?d?d?u?l?l?l?d?d +?d?d?l?d?l?d?d?l?d?l +?d?s?l?s?l?s?l?s +?l?l?s?s?l?s?s?l +?s?s?l?l?l?s?s?d +?u?u?l?l?u?l?l?u +?l?l?u?l?u?u?l?l +?l?u?l?l?l?l?u?u +?l?u?l?u?u?u?u?u +?l?u?u?l?u?l?l?l +?u?l?u?l?l?u?u?u +?u?l?u?l?l?u?u?l +?u?u?u?l?u?u?u?u +?l?l?l?l?u?u?l?u +?u?u?u?l?u?l?l?l +?l?u?u?u?u?u?l?l +?l?u?u?l?l?l?u?u +?l?u?u?l?l?l?u?l +?u?u?l?u?u?l?l?l +?u?u?u?u?l?u?u?l +?l?l?d?l?l?l?l?l?d?d +?u?l?l?l?s?s?l?l +?u?u?u?s?l?l?l?s +?s?u?u?u?l?l?l?s +?u?s?l?l?u?s?l?l +?s?d?u?u?u?u?u?u?u +?u?d?d?d?d?d?d?d?d?d?l +?u?d?l?l?d?l?l?l?l +?l?l?l?d?d?u?u?u?u +?u?l?l?l?d?l?l?l?d +?u?l?l?d?l?l?d?l?l +?l?d?d?l?l?l?l?d?d?d +?u?l?l?l?u?d?d?d?d?d +?l?d?l?l?l?d?l?d?d?d +?u?l?u?l?u?d?d?d?d?d +?l?l?l?d?l?l?l?d?s +?l?l?l?l?d?d?l?l?s +?u?l?u?l?u?l?s?d?d +?l?s?l?l?l?s?l?s +?d?d?d?d?d?d?s?d?l?d +?d?d?d?d?d?l?d?d?d?s +?d?d?d?d?d?d?s?d?d?u +?d?d?d?d?d?d?s?l?d?d +?d?d?d?d?u?s?d?d?d?d +?d?d?u?d?d?s?d?d?d?d +?d?d?l?d?d?s?d?d?d?d +?d?d?d?s?d?d?d?d?d?l +?d?d?s?d?d?l?d?d?d?d +?d?d?d?d?d?s?d?d?d?l +?u?d?d?d?d?d?d?s?d?d +?d?d?d?d?d?d?d?l?s?d +?d?d?d?d?d?d?d?l?d?s +?u?u?u?d?d?d?d?l?l?l +?l?l?s?l?l?d?s?l +?l?l?l?s?s?l?d?l +?u?s?l?l?l?d?s?l +?s?u?d?l?l?l?l?s +?s?l?l?s?l?l?d?l +?l?l?l?d?l?s?l?s +?l?d?l?s?s?l?l?l +?l?l?l?s?d?l?s?l +?u?l?l?s?s?l?l?d +?u?s?l?l?s?l?l?d +?d?s?l?l?s?l?l?l +?s?l?l?s?d?l?l?l +?d?u?u?u?u?u?s?s +?s?u?u?s?d?l?l?l +?s?u?d?l?l?l?u?s +?l?s?s?l?l?d?l?u +?l?l?s?l?l?s?d?l +?l?s?s?l?d?l?l?l +?d?l?l?l?u?u?s?s +?l?l?d?s?l?s?l?l +?s?d?l?l?s?l?l?l +?s?l?l?l?s?d?l?l +?s?l?l?s?l?d?l?l +?d?l?s?s?l?l?l?l +?l?l?d?l?s?l?l?s +?u?s?u?d?l?l?l?s +?l?s?l?l?s?d?l?l +?s?l?l?d?l?l?s?l +?s?l?d?l?l?s?l?l +?u?l?l?s?l?l?d?s +?u?s?u?u?u?u?d?s +?l?l?s?l?s?d?l?l +?l?d?l?l?s?l?s?l +?d?l?l?s?l?l?s?l +?l?l?l?s?s?d?l?l +?u?s?s?l?l?l?l?d +?u?u?u?u?s?u?s?d +?l?l?s?d?l?l?s?l +?d?d?d?d?l?l?l?l?l?d?d +?l?s?d?d?d?d?d?d?s?l +?u?l?l?l?l?l?l?s?d?d +?l?l?l?l?d?s?l?l?l +?u?u?u?d?d?d?d?u?u?u +?l?l?d?d?d?s?l?l?l +?l?l?l?d?l?l?d?d?s +?l?d?l?l?d?l?d?l?s +?l?d?d?l?l?l?l?l?l?l +?d?d?u?u?u?u?u?u?u?u +?l?l?l?d?d?d?l?l?d?d?d +?u?d?d?u?d?d?u?d?d?d +?d?d?d?d?u?l?l?d?d?d +?d?u?l?l?d?d?d?d?d?d +?u?d?l?l?d?d?d?d?d?d +?d?d?d?l?d?d?l?d?l?d +?d?d?l?d?l?d?l?d?d?d +?l?d?d?l?d?d?d?d?l?d +?l?d?l?d?d?d?d?l?d?d +?l?d?d?d?d?d?d?l?d?l +?l?l?d?d?d?d?d?d?d?d?l +?u?d?u?d?d?u?d?d?d?d +?u?d?u?d?d?d?u?d?d?d +?l?u?u?d?d?d?d?d?d?d +?d?d?d?d?u?d?d?d?u?u +?d?d?d?d?d?d?d?u?u?l +?l?d?d?d?d?d?l?l?d?d +?d?l?d?d?d?d?d?l?d?l +?d?d?l?d?d?d?d?d?l?l +?d?l?l?d?d?d?d?d?d?l +?u?d?u?u?d?d?d?d?d?d +?d?d?l?l?d?d?d?d?l?d +?l?l?l?l?s?d?d?d?d?s +?l?d?d?d?d?s?s?s?s +?l?l?s?l?l?l?d?d?d?d +?u?l?d?d?l?l?l?l?d +?u?l?u?l?l?u?d?d?d +?u?d?l?l?d?l?l?d?l +?u?u?d?d?u?u?u?u?d +?u?d?u?u?u?u?d?u?d +?d?d?d?l?l?l?l?u?u +?u?d?u?u?u?u?d?d?u +?u?u?u?u?d?d?d?l?l +?d?u?u?d?u?u?d?u?u +?u?u?l?l?l?u?d?d?d +?u?l?u?l?s?u?u?u +?u?l?u?l?s?u?l?u +?l?u?l?l?s?l?l?l +?s?u?u?l?l?l?l?l +?u?u?u?u?u?s?l?l +?l?u?u?u?s?u?u?u +?l?l?l?l?s?l?u?l +?u?l?l?l?u?s?l?l +?u?l?l?u?l?l?u?s +?u?s?u?l?l?l?l?d?d +?l?l?l?l?l?l?s?l?l?l +?l?l?l?l?l?d?d?d?s?d +?d?d?s?l?l?l?d?d?d?d +?u?d?d?d?d?d?d?d?u?s +?d?d?d?d?l?l?l?s?d?d +?u?u?d?d?d?s?d?d?d?d +?u?s?l?d?d?d?d?d?d?d +?s?d?l?l?l?l?l?d?s +?u?d?u?u?u?d?u?u?u +?d?d?l?l?u?l?l?l?l +?l?s?l?s?l?l?l?l?l +?s?d?d?d?s?d?d?d?d?s +?d?d?s?d?d?s?d?d?s?d +?d?d?d?d?d?d?d?d?d?l?u +?d?d?l?l?d?d?d?d?d?d?d +?s?l?l?l?s?d?d?d?s +?u?u?u?d?d?d?s?s?s +?u?u?l?l?d?d?d?s?s +?u?l?l?l?d?d?d?s?s +?d?d?d?d?d?d?d?u?u?u?u +?u?l?l?l?l?u?l?l?d?d +?d?u?l?l?l?u?l?l?l +?l?l?l?u?u?u?d?d?d?d +?d?d?d?u?u?u?d?d?u +?d?u?u?d?d?d?d?u?l +?d?d?u?d?l?u?l?d?d +?d?l?d?d?u?d?d?u?l +?u?d?d?d?d?u?u?d?u +?d?d?d?u?u?u?d?d?l +?u?d?l?u?d?l?d?d?d +?u?u?d?u?d?d?d?d?u +?d?d?d?l?u?l?d?u?d +?d?u?u?u?l?d?d?d?d +?l?d?l?d?d?l?l?d?d?d +?d?d?l?u?l?d?l?d?d +?d?d?l?d?d?l?l?d?u +?u?d?d?l?d?l?l?d?d +?u?d?l?d?l?d?d?d?l +?l?d?l?u?l?d?d?d?d +?u?l?d?d?u?d?u?d?d +?u?d?u?l?l?d?d?d?d +?d?d?u?u?d?u?u?d?d +?u?l?l?d?d?d?d?l?d +?u?d?l?d?u?u?d?d?d +?l?d?d?d?l?l?l?l?d?d +?d?l?l?d?l?d?d?d?l +?d?u?l?l?d?d?l?d?d +?d?u?u?d?d?d?u?d?u +?u?u?l?d?d?d?l?d?d +?d?l?d?l?d?u?d?l?d +?d?d?d?d?l?d?u?u?l +?d?l?u?u?d?d?d?d?l +?d?d?l?l?u?l?d?d?d +?u?d?d?d?l?l?u?d?d +?d?d?d?l?u?l?u?d?d +?d?d?d?u?u?d?d?l?l +?l?d?d?u?d?d?d?u?u +?u?d?d?l?u?l?d?d?d +?d?u?d?u?d?u?u?d?d +?l?d?l?d?d?u?u?d?d +?d?d?d?d?u?d?l?l?l +?d?u?d?d?u?d?d?u?u +?u?d?u?d?d?d?u?d?u +?d?l?l?l?u?d?d?d?d +?u?u?d?d?u?d?d?d?u +?d?d?d?d?l?l?d?u?u +?u?d?l?l?d?d?u?d?d +?d?d?d?d?u?l?l?u?d +?d?d?u?l?l?u?d?d?d +?u?l?d?u?d?d?d?u?d +?l?l?l?d?d?u?d?d?d +?u?d?l?d?d?d?l?l?d +?d?d?d?u?u?l?d?d?l +?l?l?d?d?d?u?u?d?d +?l?d?d?u?d?l?d?d?l +?l?d?d?u?d?l?d?d?u +?u?l?u?d?d?d?d?d?u +?u?l?u?d?d?d?d?d?l +?u?l?u?d?l?d?d?d?d +?l?d?l?d?l?d?u?d?d +?u?d?l?d?l?d?d?u?d +?u?d?d?d?d?u?u?u?d +?d?d?l?l?u?d?l?d?d +?u?d?d?d?d?u?d?u?u +?d?l?d?d?d?u?l?u?d +?u?d?d?l?l?d?u?d?d +?d?l?u?l?d?d?d?d?l +?d?d?u?u?u?d?u?d?d +?l?d?l?d?u?u?d?d?d +?u?l?d?d?d?l?d?d?l +?d?d?u?l?l?d?d?d?u +?d?d?l?l?d?d?d?u?u +?u?l?u?d?d?d?l?d?d +?l?u?d?d?d?u?l?d?d +?d?d?l?l?l?d?d?d?u +?u?d?d?l?d?u?d?d?l +?l?l?d?d?d?d?d?u?l +?l?l?d?l?d?d?d?d?l +?d?d?d?d?d?l?l?u?l +?u?d?l?l?u?d?d?d?d +?d?d?d?u?d?d?u?l?l +?l?d?d?d?u?d?u?d?u +?d?l?l?u?l?d?d?d?d +?u?u?u?d?l?d?d?d?d +?u?l?l?d?d?d?d?u?d +?d?l?u?l?l?d?d?d?d +?d?u?u?d?u?d?u?d?d +?d?u?l?d?l?d?d?l?d +?u?d?u?d?d?d?u?u?d +?d?d?d?u?l?d?u?l?d +?u?d?d?l?l?d?d?u?d +?u?d?d?u?u?l?d?d?d +?u?d?l?d?d?d?d?l?l +?u?l?d?d?d?d?l?d?u +?l?l?d?d?d?l?l?l?d?d?d +?d?d?d?d?l?l?d?l?u +?u?d?d?u?d?d?d?l?l +?d?d?d?d?l?u?d?l?l +?d?d?d?d?d?l?u?l?l +?d?l?d?d?d?d?l?u?u +?l?l?d?d?d?d?u?u?d +?u?l?l?d?d?l?d?d?d +?d?u?l?u?l?d?d?d?d +?d?d?d?d?l?l?l?d?u +?u?d?u?u?d?d?d?d?u +?d?d?d?d?d?u?u?l?u +?u?d?d?u?l?l?d?d?d +?d?u?d?l?d?l?d?d?u +?l?l?d?u?u?d?d?d?d +?l?d?u?d?d?u?d?l?d +?d?d?l?u?l?d?d?d?l +?u?d?d?d?u?u?d?d?l +?u?l?d?d?u?d?d?l?d +?d?d?u?d?l?l?d?d?u +?l?d?d?l?u?d?l?d?d +?d?d?l?l?l?d?d?l?d?d +?u?d?d?l?u?d?d?l?d +?u?d?d?d?l?l?d?l?d +?u?d?d?u?d?d?d?u?u +?d?l?u?d?l?l?d?d?d +?d?d?u?u?d?d?l?l?d +?d?u?d?l?d?u?d?d?l +?u?d?d?u?d?d?u?u?d +?l?d?l?d?d?d?u?d?l +?d?u?d?u?d?l?d?l?d +?d?u?d?u?d?u?d?d?u +?d?u?u?l?d?d?d?d?l +?u?u?d?d?d?d?l?l?d +?d?d?u?d?d?l?d?u?l +?l?d?u?l?d?d?u?d?d +?u?d?u?d?d?u?d?d?u +?d?d?d?d?u?l?u?d?l +?u?u?u?d?d?d?u?d?d +?u?d?d?u?l?u?d?d?d +?l?d?d?d?d?d?u?l?u +?d?u?d?u?d?d?u?d?u +?d?l?d?l?l?l?d?d?d?d +?d?l?d?d?u?l?d?d?l +?u?d?l?l?d?d?d?l?d +?l?l?l?d?u?d?d?d?d +?u?u?d?u?l?d?d?d?d +?u?l?d?d?u?d?d?d?u +?d?u?u?d?d?d?d?l?l +?u?u?u?d?d?d?d?l?d +?l?d?d?l?d?d?d?u?u +?u?d?l?u?d?d?l?d?d +?d?d?l?d?l?d?u?u?d +?u?u?d?d?l?d?u?d?d +?d?l?d?l?d?d?l?d?l?d +?u?d?u?u?d?d?u?d?d +?u?l?d?d?d?l?l?d?d +?l?d?l?d?d?d?u?l?d +?d?l?d?u?d?l?d?l?d +?d?u?d?l?u?u?d?d?d +?d?u?l?d?d?d?l?l?d +?u?d?l?d?d?d?l?d?l +?u?l?d?l?d?u?d?d?d +?u?l?d?d?d?l?u?d?d +?d?d?d?d?d?u?l?u?u +?u?l?l?d?d?u?d?d?d +?d?d?d?d?d?l?d?l?l?l +?u?d?d?l?l?d?l?d?d +?l?l?u?d?d?l?d?d?d +?d?u?d?d?d?d?u?u?u +?u?l?l?d?d?d?u?d?d +?u?l?d?d?u?u?d?d?d +?d?l?d?d?d?l?l?d?u +?d?l?d?d?d?l?l?d?l +?u?d?d?d?u?l?l?d?d +?d?l?d?u?u?d?d?d?l +?d?l?d?l?d?u?d?u?d +?d?d?u?l?d?d?d?l?l +?d?u?d?l?l?d?d?l?d +?d?u?u?u?d?u?d?d?d +?d?d?d?l?u?d?u?d?u +?u?d?d?l?d?l?d?d?l +?d?u?l?d?l?d?l?d?d +?u?l?d?u?d?l?d?d?d +?u?u?u?d?d?d?d?u?d +?d?d?l?u?l?d?u?d?d +?d?d?u?l?d?l?u?d?d +?u?l?u?u?d?d?d?d?d?d +?u?d?u?d?d?d?d?u?u +?d?d?u?d?u?d?d?u?u +?d?d?d?d?u?u?u?d?u +?l?d?l?d?l?d?d?u?d +?u?d?l?d?d?u?l?d?d +?d?d?u?u?d?l?d?d?l +?l?d?u?d?d?l?d?u?d +?d?d?l?u?u?d?d?d?l +?u?u?u?d?d?l?d?d?d +?u?d?u?u?l?d?d?d?d +?u?u?u?s?s?s?s?s +?l?l?l?l?l?l?l?l?d?d?d?d +?d?d?d?d?d?d?s?s?l?l +?l?u?u?u?u?u?d?d?d?d +?l?l?l?l?s?l?l?l?d?d +?l?l?l?l?s?s?l?d?d +?l?d?l?l?s?l?d?l?l +?u?d?d?d?d?d?d?d?d?d?d?d +?l?l?l?l?l?s?d?l?l +?l?l?s?l?l?d?l?l?l +?l?l?l?d?s?l?l?l?l +?u?l?l?l?u?l?l?l?s +?d?d?d?u?l?l?l?l?l?l +?d?d?d?s?s?s?l?d?d +?s?s?s?l?d?d?d?d?d +?d?d?s?d?s?d?d?s?l +?d?d?d?d?d?l?s?s?s +?d?d?d?d?d?d?d?s?l?l?l +?d?d?d?d?d?d?d?d?d?d?s?d +?d?d?d?d?d?d?d?d?d?s?d?d +?u?l?l?u?l?l?u?d?d +?d?d?u?l?l?l?l?l?u +?u?l?l?l?d?u?l?l?d +?u?u?u?u?u?d?u?u?d +?u?l?l?d?u?l?l?l?d +?s?l?s?l?l?s?l?l +?l?l?l?s?l?s?l?s +?l?l?s?l?s?l?l?s +?l?l?s?l?l?s?l?s +?l?s?l?s?s?l?l?l +?s?u?l?l?l?l?s?s +?l?l?l?l?l?u?l?l?d +?l?l?l?u?l?l?l?l?d +?d?d?l?d?d?l?d?d?d?d?l +?l?l?d?d?l?l?d?d?l?d +?d?s?l?l?l?s?d?d?d +?l?l?d?d?d?d?l?s?s +?l?d?s?l?d?s?l?d?d +?s?l?d?d?l?d?d?l?s +?u?l?s?s?l?d?d?d?d +?s?u?l?u?s?d?d?d?d +?l?s?d?d?d?d?s?l?l +?l?l?l?d?d?s?s?d?d +?u?l?l?d?s?d?s?d?d +?u?l?l?s?d?d?d?d?s +?u?u?u?u?u?d?d?s?s +?u?l?l?l?l?s?s?d?d +?u?s?u?u?u?u?u?s +?u?u?s?s?u?u?u?u +?u?u?s?u?s?u?u?u +?u?s?l?l?s?l?l?l +?u?u?s?l?l?s?u?u +?u?s?l?l?l?l?s?l +?u?l?l?s?l?l?l?s +?u?u?u?s?s?l?l?l +?u?l?l?l?l?l?s?d?d?d +?l?l?l?l?l?l?s?d?l +?s?d?u?l?l?l?l?l?l +?l?l?d?l?l?d?l?l?d?d +?d?d?d?l?l?d?d?d?d?d?d +?l?d?d?d?d?l?d?d?d?d?d +?d?d?d?d?s?d?d?l?l?l +?u?l?l?l?s?l?l?d?d +?d?d?u?l?l?l?l?l?s +?u?u?u?l?l?l?s?d?d +?d?l?l?l?d?l?l?l?s +?u?l?l?l?l?s?l?d?d +?u?l?l?l?l?l?u?u?d +?l?d?d?l?d?d?s?s?s +?l?s?s?s?l?d?d?d?d +?u?u?d?d?d?d?s?s?s +?l?s?l?l?l?d?d?d?d?d +?l?l?l?l?l?l?d?d?s?s +?u?l?l?l?u?s?d?d?d +?u?u?u?u?u?d?s?d?d +?d?d?d?l?l?l?l?s?l +?d?d?d?l?l?s?l?l?l +?l?l?l?l?l?d?l?l?d?d +?d?d?s?d?d?d?s?d?d?d?d +?d?d?d?d?l?l?l?l?d?l +?u?u?u?u?u?l?l?l?d +?l?l?s?s?l?d?d?l +?l?s?u?l?d?d?l?s +?u?l?l?s?s?d?l?d +?u?s?d?d?s?u?u?u +?l?u?d?s?l?u?d?s +?s?l?l?s?d?d?l?l +?s?d?l?d?l?s?l?l +?l?l?l?s?s?l?d?d?d +?u?u?u?l?s?d?d?s +?l?s?s?l?l?d?d?l +?l?u?d?d?s?l?l?s +?d?d?s?s?u?l?u?l +?u?d?u?u?s?u?s?d +?u?d?s?l?d?l?l?s +?d?l?d?u?l?l?s?s +?d?l?s?d?s?l?l?l +?u?d?s?u?s?u?d?u +?u?s?s?d?d?l?l?l +?d?l?l?s?l?d?l?s +?u?d?d?u?l?l?s?s +?u?s?l?d?d?s?l?u +?s?d?l?l?d?s?l?l +?l?l?s?u?d?d?s?u +?u?s?s?u?l?l?d?d +?l?s?d?s?l?d?l?l +?l?d?u?s?u?d?u?s +?s?d?d?l?s?l?l?l +?l?d?d?l?s?l?s?l +?l?l?s?l?d?l?d?s +?u?l?d?s?d?l?s?l +?s?u?d?u?u?d?u?s +?u?d?d?l?u?u?s?s +?u?s?d?l?d?l?u?s +?u?l?s?d?u?l?s?d +?u?u?s?d?u?d?u?s +?l?d?l?d?l?s?s?l +?u?d?l?u?l?d?s?s +?l?s?u?u?l?s?d?d +?l?d?s?l?l?l?d?s +?u?s?u?s?u?d?d?u +?l?d?d?s?l?s?l?l +?u?l?s?s?u?l?d?d +?l?d?s?l?d?l?l?s +?l?s?l?l?d?s?l?d +?l?u?d?l?d?u?s?s +?s?s?d?d?u?u?u?u +?u?s?l?d?d?l?s?u +?u?d?l?l?s?s?l?d +?l?l?l?d?u?d?s?s +?s?u?u?u?u?s?d?d?d +?u?u?l?d?s?l?s?d +?u?d?l?u?s?s?l?d +?d?d?u?s?u?l?s?l +?l?s?d?l?l?l?s?d +?l?u?s?d?s?u?l?d +?u?u?u?u?d?s?s?d +?u?s?l?d?d?u?l?s +?u?u?d?l?d?l?s?s +?s?s?d?d?u?l?l?l +?s?d?l?d?s?l?l?l +?d?l?d?s?l?l?s?l +?s?u?l?d?u?d?l?s +?l?l?s?d?d?l?l?s +?u?l?l?s?d?d?s?u +?s?l?l?u?d?s?d?u +?d?u?s?d?u?s?u?u +?s?u?u?u?d?l?d?s +?l?d?s?s?l?l?u?d +?d?d?s?s?u?u?u?u +?d?l?s?l?l?l?d?s +?d?d?s?l?l?u?u?s +?u?d?l?s?l?s?l?d +?s?u?l?u?d?d?l?s +?l?s?d?l?s?d?l?l +?u?d?s?u?l?d?u?s +?d?d?s?l?s?l?l?u +?s?d?u?l?u?l?d?s +?l?d?l?l?s?d?l?s +?s?d?u?d?s?l?u?l +?l?d?s?l?l?d?s?l +?s?l?d?l?d?s?l?l +?u?l?d?l?s?d?l?s +?d?s?l?s?l?d?l?l +?u?s?d?l?u?s?d?l +?l?d?d?l?s?s?l?l +?l?l?s?d?d?s?l?l?l +?s?d?u?u?s?u?d?u +?l?u?s?s?l?u?d?d +?l?u?l?d?d?l?s?s +?u?u?s?s?l?d?d?l +?s?d?l?l?l?u?d?s +?s?u?l?d?d?u?l?s +?d?u?s?u?s?u?u?d +?u?u?d?u?u?d?s?s +?u?l?d?s?l?l?d?s +?l?l?u?d?l?d?s?s +?d?l?l?l?l?s?s?d +?l?d?s?u?u?s?l?d +?l?l?l?d?d?s?s?u +?l?d?u?d?u?s?l?s +?s?l?d?d?s?l?l?l +?d?u?s?u?l?d?s?u +?u?l?s?d?d?l?s?l +?l?d?l?s?s?l?l?d +?d?l?l?l?s?s?l?d +?s?u?u?u?d?d?u?s +?u?l?s?l?s?d?l?d +?s?l?l?d?d?u?u?s +?l?u?l?s?d?l?d?s +?u?s?l?l?d?l?s?d +?l?l?l?s?s?d?l?d +?u?d?l?s?d?l?l?s +?u?s?u?l?d?l?s?d +?d?u?u?d?u?s?u?s +?s?d?u?l?l?s?d?l +?s?l?l?s?l?d?d?l +?s?s?u?l?l?d?l?d +?d?d?l?s?u?u?s?l +?s?u?u?d?d?u?u?s +?l?d?s?l?l?s?d?l +?l?d?l?s?l?l?d?s +?d?s?l?l?l?s?l?d +?l?d?d?u?u?l?s?s +?u?s?l?d?l?l?s?d +?u?s?l?s?d?u?u?d +?l?l?l?s?d?d?u?s +?u?l?l?s?d?d?u?s +?s?l?u?l?l?d?d?s +?s?l?s?d?l?l?l?d +?l?d?l?d?u?s?l?s +?u?s?l?l?s?u?d?d +?u?d?l?l?s?l?s?d +?u?l?u?u?d?s?s?d +?u?d?l?s?u?l?d?s +?u?l?l?d?d?s?s?u +?d?l?l?s?s?d?l?l +?l?d?d?s?s?l?l?l +?u?s?u?s?d?d?l?l +?l?l?d?d?u?l?s?s +?d?d?u?u?s?l?l?s +?d?d?l?u?l?u?s?s +?s?l?l?u?u?s?d?d +?l?u?u?l?d?d?s?s +?d?s?u?u?l?d?u?s +?u?u?s?u?s?l?d?d +?s?u?u?d?d?s?u?u +?s?d?l?d?u?s?l?l +?u?d?s?s?l?d?l?l +?s?d?u?s?l?l?d?l +?d?d?u?l?l?s?l?s +?l?l?d?d?s?l?s?l +?l?d?s?u?u?s?d?l +?s?d?u?l?l?d?l?s +?l?l?d?l?s?d?l?s +?d?u?u?s?d?u?u?s +?s?d?s?l?l?d?l?l +?s?l?l?d?s?d?l?l +?l?d?d?u?u?u?s?s +?l?s?l?d?l?l?s?d +?l?s?u?l?s?u?d?d +?u?u?l?d?l?s?s?d +?l?u?s?d?l?s?d?l +?u?s?u?d?s?l?d?u +?u?s?d?l?d?u?l?s +?d?s?u?l?u?l?d?s +?s?s?u?d?u?u?d?u +?d?d?u?l?l?s?s?l +?u?l?s?d?d?s?l?u +?u?d?s?s?u?d?l?l +?d?u?l?s?d?u?u?s +?u?s?d?u?u?s?d?u +?s?u?s?u?d?d?u?u +?s?s?d?l?l?l?d?l +?u?d?l?u?s?l?d?s +?u?u?s?d?u?u?s?d +?l?s?l?d?l?s?d?l +?l?u?l?l?s?s?d?d +?d?s?l?l?l?s?d?l +?u?u?u?l?d?d?s?s +?s?u?s?l?l?u?d?d +?s?u?l?l?d?l?s?d +?l?l?d?s?s?d?l?l +?u?l?u?d?s?d?l?s +?u?s?u?u?s?l?d?d +?s?s?l?l?u?u?d?d +?l?d?s?l?s?l?d?l +?l?l?d?d?l?s?l?s +?s?l?l?d?s?l?l?d +?l?l?d?s?s?l?l?d +?s?l?d?l?l?d?s?l +?l?l?d?s?l?d?l?s +?d?l?l?s?l?l?s?d +?l?d?d?u?s?s?l?l +?d?l?l?d?s?s?u?u +?l?d?u?s?d?u?s?l +?d?d?s?l?l?l?s?u +?l?d?s?l?l?l?s?d +?d?d?l?l?s?l?s?l +?s?d?d?l?l?l?l?l?s +?u?u?d?d?s?s?u?u +?s?d?u?l?u?l?s?d +?l?d?d?u?l?u?s?s +?l?l?s?s?u?l?d?d +?l?l?u?s?u?s?d?d +?l?d?l?d?s?l?s?l +?s?u?u?l?l?s?d?d +?u?l?s?d?l?s?d?u +?l?l?s?d?l?d?s?l +?s?l?l?d?l?s?d?l +?s?l?l?d?l?s?d?u +?l?l?d?s?l?s?d?l +?u?d?d?s?u?u?l?s +?l?d?s?d?u?s?l?l +?s?l?l?s?u?l?d?d +?u?s?u?u?u?d?s?d +?d?d?l?l?l?s?u?s +?u?u?l?d?s?d?u?s +?l?s?l?s?d?l?d?l +?u?s?l?l?d?l?d?s +?l?d?l?d?s?l?l?s +?d?l?d?s?s?l?l?l +?l?d?l?l?s?l?s?d +?s?u?s?d?d?l?u?l +?l?l?s?s?d?d?l?u +?s?l?s?d?l?d?l?l +?u?l?d?d?s?s?l?l +?u?u?s?d?l?s?l?d +?d?u?u?d?l?s?s?u +?l?u?s?d?d?s?u?l +?u?u?u?d?s?d?s?l +?d?l?d?s?s?u?l?l +?l?l?l?l?d?s?d?s?d +?l?s?u?u?d?d?s?l +?u?s?l?d?l?l?d?s +?s?s?l?l?d?l?d?l +?u?d?d?l?s?l?l?s +?u?l?l?s?d?l?s?d +?l?u?s?l?l?d?d?s +?d?s?d?s?u?u?u?u +?s?u?l?d?l?d?l?s +?u?l?l?u?s?d?s?d +?d?l?l?l?s?s?d?l +?u?l?d?l?d?l?s?s +?l?l?d?l?s?l?s?d +?l?u?d?s?d?l?s?l +?u?l?l?s?d?d?l?s +?u?u?s?s?u?u?d?d +?d?s?s?l?l?d?l?u +?d?u?s?l?s?d?l?u +?l?u?s?s?d?l?l?d +?u?s?d?d?u?s?l?l +?s?l?u?l?u?d?d?s +?s?d?d?s?l?l?l?u +?l?d?s?l?s?d?l?l +?u?d?u?d?l?l?s?s +?u?l?d?u?s?s?l?d +?s?l?u?d?s?l?u?d +?l?u?d?d?s?s?u?u +?u?l?l?s?u?s?d?d +?d?s?d?l?l?l?l?s +?s?d?l?l?u?u?d?s +?s?s?l?u?l?l?d?d +?s?u?d?d?l?l?l?s +?s?l?l?u?d?l?d?s +?s?s?u?u?d?d?u?u +?d?l?s?l?s?l?l?d +?l?u?s?d?d?s?l?u +?u?s?l?s?l?u?d?d +?d?s?l?l?d?l?l?s +?l?s?d?s?l?l?l?d +?u?l?s?d?d?s?l?l +?u?d?d?s?l?l?s?l +?l?s?u?l?u?d?s?d +?d?u?s?d?s?l?l?l +?s?l?l?d?l?s?l?d +?s?s?l?l?d?l?l?d +?u?d?l?d?l?s?u?s +?l?d?s?l?s?l?l?d +?u?d?l?d?l?l?s?s +?d?l?s?u?u?s?l?d +?l?d?l?s?u?d?s?l +?l?l?d?l?d?s?s?l +?d?s?d?s?u?u?l?l +?s?u?s?d?d?l?l?l +?d?s?l?l?l?s?u?d +?u?l?s?l?u?s?d?d +?l?l?s?d?d?s?u?u +?l?l?s?d?d?s?u?l +?s?u?l?l?d?d?l?s +?d?l?l?s?d?l?s?l +?u?l?u?d?d?s?l?s +?s?l?s?l?d?l?d?l +?d?d?u?l?u?l?s?s +?l?l?d?l?s?l?d?s +?u?d?l?s?s?d?l?u +?l?l?d?l?d?s?l?s +?u?d?l?l?l?d?s?s +?u?l?d?l?d?s?s?l +?u?s?l?d?u?d?s?l +?u?s?u?l?s?l?d?d +?u?s?s?l?d?l?l?d +?u?l?s?s?u?d?l?d +?l?s?l?s?l?d?u?d +?s?d?l?l?s?d?l?l +?s?d?l?l?s?d?l?u +?l?l?l?s?u?s?d?d +?u?s?u?s?l?l?d?d +?d?l?l?s?s?l?l?d +?s?l?d?l?l?l?s?d +?u?l?s?s?l?u?d?d +?d?s?l?d?l?s?l?l +?l?s?d?l?s?l?d?l +?s?l?u?d?d?l?s?u +?u?d?s?d?l?s?u?u +?l?d?l?l?l?s?s?d +?u?u?d?d?u?u?s?s +?u?d?u?l?d?s?l?s +?s?u?u?u?s?d?d?l +?s?u?d?l?u?d?u?s +?d?l?d?l?l?s?s?l +?d?s?l?d?l?l?s?l +?l?d?d?l?l?s?l?s +?s?d?u?u?s?d?u?u +?l?s?l?d?l?d?l?s +?u?s?l?l?u?s?d?d +?u?d?s?s?l?u?d?l +?l?u?l?u?d?s?d?s +?s?u?d?l?l?d?l?s +?u?d?d?s?l?s?l?u +?u?l?s?d?d?s?u?l +?d?u?u?u?u?d?s?s +?l?u?l?u?s?d?s?d +?u?l?s?l?s?l?d?d +?s?s?l?d?l?l?l?d +?s?l?d?l?l?s?d?l +?u?s?d?l?l?d?s?u +?d?d?s?u?l?l?u?s +?u?s?d?u?s?l?l?d +?s?l?s?l?l?d?d?l +?d?d?s?u?s?l?l?l +?u?l?s?l?s?d?d?u +?u?l?s?l?s?d?d?l +?u?s?u?u?s?d?u?d +?l?l?d?u?l?d?s?s +?d?d?u?l?s?s?l?l +?l?l?d?u?s?d?s?l +?u?l?d?d?s?u?l?s +?l?d?d?l?l?s?s?u +?s?u?u?s?u?u?d?d +?l?l?l?s?d?d?s?u +?u?d?u?s?u?s?u?d +?l?d?l?l?l?s?d?s +?u?d?u?l?d?s?s?u +?s?u?u?d?d?l?l?s +?s?s?l?d?u?d?l?u +?s?u?l?d?d?l?l?s +?s?d?l?s?l?d?l?l +?l?s?l?s?u?u?d?d +?u?l?l?s?l?d?d?s +?u?d?d?u?s?l?l?s +?d?d?s?s?l?l?l?u +?s?d?l?u?u?d?u?s +?l?d?s?d?l?s?l?l +?s?u?s?u?l?d?l?d +?s?s?u?l?l?u?d?d +?s?d?l?l?u?l?d?s +?u?d?l?l?d?s?l?s +?s?u?s?l?d?u?d?l +?d?l?s?l?d?s?l?l +?l?l?s?d?l?s?l?d +?s?s?l?d?l?d?l?l +?s?u?l?d?d?s?u?l +?s?d?l?l?l?s?d?l +?d?d?s?s?u?l?l?u +?l?s?u?s?l?l?d?d +?d?l?u?d?l?u?s?s +?l?d?l?u?d?s?u?s +?u?s?u?d?d?l?u?s +?u?d?d?s?l?l?u?s +?d?l?s?l?d?s?u?u +?s?l?d?s?l?l?l?d +?l?s?d?l?d?l?l?s +?l?u?l?l?d?d?s?s +?u?l?s?d?u?u?s?d +?d?u?d?u?u?u?s?s +?s?u?l?d?d?s?l?l +?l?l?s?d?l?l?d?s +?l?d?d?s?l?l?l?s +?u?u?u?s?s?u?d?d +?s?l?s?d?d?l?l?l +?d?u?l?d?l?u?s?s +?d?l?s?u?u?d?s?l +?s?d?u?l?u?u?s?d +?s?l?s?l?d?u?d?u +?l?u?l?u?s?d?d?s +?l?l?d?s?d?s?l?l +?u?l?d?s?u?l?s?d +?s?u?s?u?u?u?d?d +?l?l?s?l?d?l?s?d +?s?d?u?l?l?u?s?d +?d?l?u?s?d?l?l?s +?s?d?s?d?u?l?u?l +?d?d?l?s?l?s?l?l +?l?l?s?s?u?u?d?d +?s?d?u?l?l?l?d?s +?d?u?l?s?s?u?l?d +?d?l?u?u?s?s?l?d +?d?d?l?l?s?l?l?s +?u?u?s?l?s?l?d?d +?u?l?l?u?l?u?l?d?d +?l?l?l?u?s?d?d?d?d +?u?u?d?d?d?d?s?l?l +?l?l?u?u?s?d?d?d?d +?u?l?l?d?l?d?d?d?s +?s?u?d?l?d?l?d?l?d +?d?l?d?s?l?l?d?l?d +?u?u?d?d?d?d?l?l?s +?s?d?d?d?l?l?l?l?d +?s?d?l?d?l?d?l?d?l +?l?s?l?l?d?d?d?d?l +?l?l?d?d?l?s?l?d?d +?d?l?l?d?s?d?l?l?d +?l?s?l?d?d?d?d?l?l +?u?l?d?d?d?d?l?l?s +?d?d?u?u?s?u?u?d?d +?u?d?l?l?l?d?d?d?s +?l?d?l?d?l?s?d?l?d +?l?l?l?d?d?d?d?s?u +?l?l?l?u?d?d?d?d?s +?l?d?l?d?d?l?d?l?s +?l?d?d?l?s?l?d?d?l +?l?s?l?d?d?l?l?d?d +?d?d?d?s?l?l?d?l?l +?u?u?u?s?d?d?d?d?l +?u?u?d?d?d?d?u?u?s +?l?l?s?d?d?l?l?d?d +?l?d?d?l?d?l?d?l?s +?d?d?u?u?u?u?d?d?s +?d?d?d?d?u?s?l?l?l +?u?s?d?d?l?l?l?d?d +?l?l?l?d?l?s?d?d?d +?u?d?l?d?u?d?l?d?s +?d?d?s?d?d?u?l?l?l +?l?d?d?l?d?l?l?d?s +?l?u?l?l?d?d?s?d?d +?d?d?d?s?l?l?l?l?d +?d?d?s?d?d?u?u?u?u +?l?d?d?d?l?l?l?s?d +?l?l?d?d?l?d?l?d?s +?l?l?s?d?l?l?d?d?d +?l?l?l?l?l?d?d?d?s?s +?u?l?l?s?l?l?l?l?l +?d?d?l?d?l?l?l?d?d?d +?d?d?u?l?u?l?d?d?d?d +?l?l?d?d?d?d?l?d?l?d +?u?l?d?d?l?l?d?d?d?d +?l?l?l?d?d?d?d?d?l?d +?u?d?l?l?d?l?d?d?d?d +?u?l?d?d?d?d?d?d?u?l +?d?d?l?d?l?d?l?d?l?d +?l?l?d?d?d?d?d?l?l?d +?d?d?l?d?d?l?l?l?d?d +?l?l?d?d?l?d?l?d?d?d +?l?d?d?l?d?l?l?d?d?d +?u?u?u?l?d?d?d?d?d?d +?u?l?d?d?d?d?d?d?l?l +?s?s?l?s?d?d?s?s +?s?s?d?d?s?s?s?l +?s?s?s?s?s?d?d?l +?l?s?s?s?s?s?d?d +?l?l?l?l?s?l?d?d?d?d +?u?u?u?u?d?s?l?l +?u?s?l?l?d?l?l?u +?l?d?l?s?u?l?u?l +?l?d?u?l?l?l?s?l +?u?s?l?d?u?l?l?l +?l?l?u?u?l?l?d?s +?d?l?l?l?s?u?l?l +?l?l?u?l?l?l?s?d +?u?l?u?l?s?d?u?l +?u?s?l?l?l?d?l?u +?l?l?l?d?s?u?l?l +?l?d?l?s?l?l?u?l +?d?l?l?l?l?s?l?l?l +?d?l?l?l?l?l?s?u +?l?l?s?u?l?d?l?l +?u?l?s?l?l?l?d?u +?s?u?u?l?l?l?l?d +?d?l?l?u?l?s?l?l +?u?d?l?l?l?u?s?l +?u?l?d?u?l?l?l?s +?s?l?l?l?d?u?u?u +?l?u?u?s?u?u?u?d +?l?u?s?l?l?l?l?d +?u?u?u?d?s?u?u?u +?u?s?u?u?d?u?u?u +?u?s?l?d?u?u?u?u +?u?s?u?u?l?l?l?d +?u?l?l?l?s?l?u?d +?s?u?l?l?l?d?l?u +?u?u?d?u?l?l?l?s +?l?l?l?l?u?s?u?d +?u?l?d?s?u?l?l?l +?l?l?l?l?u?l?d?s +?l?s?l?d?u?l?u?l +?s?l?l?u?d?l?l?l +?u?s?u?u?l?d?l?l +?u?l?l?l?d?s?u?l +?l?d?l?l?l?l?s?u +?u?u?l?l?l?u?s?d +?u?l?l?d?l?u?l?s +?l?l?s?l?l?l?d?u +?u?s?u?l?l?d?l?l +?u?u?d?u?u?u?u?s +?u?s?l?l?d?l?u?l +?u?s?l?l?d?l?u?u +?l?s?d?l?l?l?l?u +?l?l?l?u?d?s?l?l +?l?l?d?l?l?u?u?s +?u?u?d?l?s?l?l?l +?l?l?l?u?l?u?s?d +?u?l?u?l?l?l?d?s +?d?l?s?l?l?l?l?u +?l?d?u?s?l?u?l?l +?u?l?l?u?u?u?d?s +?u?u?u?u?u?s?l?d +?d?l?l?s?l?u?u?u +?u?u?u?u?u?d?s?u +?l?d?u?l?l?s?l?l +?u?d?l?l?l?l?s?u +?u?u?s?u?u?u?d?u +?l?s?u?d?l?l?l?l +?d?u?l?l?l?l?s?u +?l?l?l?s?u?d?l?l +?u?u?u?u?s?u?d?u +?s?d?u?l?l?u?u?u +?u?d?u?u?u?u?s?u +?u?l?d?u?u?u?s?l +?d?s?l?u?l?l?l?l +?u?u?u?u?d?s?u?u +?u?u?s?l?l?l?d?l +?s?u?u?u?u?d?u?u +?u?u?u?u?s?d?l?l +?l?d?d?s?l?l?l?l?l +?l?l?s?d?u?l?l?l +?s?l?l?l?l?l?u?d +?l?s?l?l?l?l?d?u +?d?l?l?l?l?u?u?s +?l?s?l?u?l?d?l?l +?u?u?l?d?s?u?l?l +?u?l?l?l?d?u?l?s +?l?l?u?l?d?l?l?s +?l?u?l?u?l?u?d?s +?d?l?l?l?l?s?u?l +?d?l?l?l?s?d?l?l?l +?l?u?l?d?s?u?l?l +?u?u?u?u?u?u?d?s?d +?l?l?l?l?u?u?d?s +?u?u?u?u?l?s?l?d +?l?l?d?l?s?l?l?u +?u?s?u?u?u?d?u?u +?u?l?l?s?u?d?l?l +?s?l?d?l?u?l?l?l +?l?d?u?s?l?l?l?l +?l?d?u?l?l?l?l?s +?l?d?l?u?l?s?l?l +?l?l?u?u?u?u?s?d +?u?u?u?u?l?u?s?d +?u?l?d?l?s?u?u?u +?u?l?s?d?u?l?l?l +?l?l?l?d?u?l?s?l +?u?l?u?l?l?d?l?s +?u?l?l?l?u?l?d?s +?l?d?s?l?l?l?u?l +?d?u?u?u?u?s?u?u +?d?l?s?u?l?l?l?l +?s?l?u?l?u?l?u?d +?s?u?l?u?l?l?l?d +?u?l?l?l?l?d?u?s +?l?l?l?s?u?l?l?d +?l?l?s?u?u?l?l?d +?d?u?u?u?l?l?l?s +?d?u?l?l?l?l?u?s +?u?l?l?u?d?l?l?s +?l?s?l?l?l?u?l?d +?u?s?u?l?l?d?u?l +?l?u?d?s?l?l?l?l +?l?u?u?s?d?l?l?l +?d?d?s?l?l?l?l?s?d?d +?l?s?d?s?d?s?d?s?d +?u?l?u?u?l?u?d?d?d +?d?u?u?l?l?l?l?d?d +?u?l?l?l?d?d?d?u?l +?u?d?d?l?l?l?l?l?d +?d?d?d?u?l?u?l?u?l +?u?d?l?l?l?l?d?d?l +?l?u?l?u?l?l?d?d?d +?u?u?u?d?u?u?d?u?d +?d?u?l?l?l?l?u?d?d +?u?d?u?l?l?l?l?d?d +?u?l?l?d?l?l?d?d?l +?u?l?l?d?l?d?l?l?d +?l?l?l?l?d?d?d?d?d?d?s +?l?l?l?s?d?s?d?d?d?d +?d?s?d?d?d?d?s?d?d?d?d +?l?s?l?s?l?s?s?d +?l?s?l?s?d?s?l?s +?u?u?u?l?u?l?u?l +?l?l?l?u?u?l?u?u +?l?l?l?l?u?l?u?u +?l?u?l?l?u?l?l?u +?u?l?u?u?u?u?l?u +?l?l?u?l?l?u?u?u +?u?u?l?u?l?u?l?l +?l?u?l?u?l?l?u?u +?u?l?u?u?l?l?u?l +?u?u?u?l?l?u?l?u +?u?u?u?u?l?u?l?l +?l?l?l?u?l?l?u?u +?l?l?l?u?u?l?l?u +?u?l?u?u?u?l?l?u +?l?u?l?u?l?l?l?u +?l?u?u?l?u?u?l?l +?l?u?u?l?u?u?l?u +?u?l?u?l?u?u?u?l +?l?l?u?u?l?l?l?u +?l?d?l?d?l?d?s?s?s +?d?d?d?d?l?l?l?d?d?s +?d?d?l?d?d?l?d?d?l?s +?l?l?s?u?u?u?u?u +?l?s?l?u?u?u?u?u +?u?s?l?l?l?u?l?l +?l?s?l?l?u?l?l?l +?s?l?l?l?u?u?u?u +?u?l?l?u?s?l?u?l +?l?s?l?l?l?l?u?l +?u?l?l?u?l?u?l?s +?u?u?u?u?u?l?l?s +?u?l?l?s?l?l?l?u +?u?u?u?u?u?u?l?s +?l?u?l?s?l?l?l?l +?u?l?l?s?u?u?u?u +?u?l?u?u?l?l?l?s +?u?l?l?l?s?l?l?u +?u?l?u?l?u?l?l?s +?d?d?d?d?l?l?l?l?d?d?d +?l?l?l?d?d?d?d?d?s?s +?l?d?l?d?l?l?d?l?d?l +?l?l?l?s?s?l?l?s +?u?l?l?l?s?s?s?l +?u?u?u?u?s?s?s?u +?l?l?l?s?s?l?s?l +?l?l?l?l?s?s?l?s +?d?d?u?l?l?u?l?l?l +?u?d?u?u?u?u?d?u?u +?u?d?l?l?l?d?l?l?l +?u?l?l?l?l?l?l?d?u +?u?u?l?l?l?l?u?d?d +?u?d?u?u?u?u?u?u?d +?u?l?l?u?l?l?s?d?d +?u?l?l?u?l?l?d?d?s +?d?l?l?l?s?l?l?l?d +?l?s?s?l?s?s?l?l +?l?l?l?s?s?s?s?l +?u?l?u?l?s?s?s?s +?d?s?d?d?d?d?d?d?s?d +?d?d?d?d?d?s?d?d?d?s +?d?d?d?d?d?d?d?s?d?s +?d?d?d?d?d?s?d?s?d?d +?d?s?d?d?d?d?d?s?d?d +?d?d?d?d?s?d?d?d?s?d +?d?s?s?d?d?d?d?d?d?d +?d?l?s?l?l?s?l?s +?l?s?l?d?l?s?l?s +?l?l?s?l?l?d?s?s +?d?s?s?s?l?l?l?l +?l?d?l?s?l?s?l?s +?l?s?l?s?l?l?d?s +?l?d?s?l?l?s?l?s +?l?d?s?s?s?l?l?l +?l?l?s?d?s?l?l?s +?s?s?d?s?l?l?l?l +?s?s?d?l?l?l?l?s +?s?l?s?l?d?l?l?s +?u?s?s?s?l?d?l?l +?s?d?l?l?l?s?s?l +?l?l?s?l?l?s?d?s +?s?d?s?l?l?l?l?s +?s?l?l?s?l?l?s?d +?l?s?l?s?l?l?s?d +?d?l?s?l?s?l?s?l +?d?d?d?d?d?l?l?l?d?d?d +?l?l?l?l?l?d?l?l?l?d +?l?l?l?d?d?d?d?d?d?d?d?d?d +?d?l?l?l?s?l?l?l?l +?d?s?d?s?d?l?l?l?l +?s?s?d?d?d?l?l?l?l +?l?s?l?l?l?l?l?s?l +?u?u?u?u?u?u?u?s?s +?l?l?d?d?d?d?s?d?d?d +?d?d?d?d?d?d?l?l?s?d +?l?l?d?d?s?d?d?d?d?d +?d?d?d?d?d?d?d?u?u?s +?d?s?d?d?d?d?d?d?l?l +?d?d?d?d?d?s?d?d?l?l +?u?l?l?u?l?l?l?l?d?d +?s?s?s?s?s?s?l?d +?u?s?u?l?l?l?d?d?d +?d?d?d?u?u?u?u?u?s +?u?u?l?l?l?s?d?d?d +?l?s?d?d?d?l?l?l?l +?l?d?l?l?s?l?d?l?d +?d?d?l?l?l?l?l?s?d +?l?d?d?l?l?l?d?l?s +?l?d?d?d?l?l?l?l?s +?u?l?u?l?u?s?d?d?d +?l?s?l?d?d?d?l?l?l +?u?l?l?l?s?l?d?d?d +?u?l?l?l?u?l?s?s +?s?u?l?l?l?l?l?l?s +?s?u?u?l?l?l?l?s +?u?l?u?l?l?l?s?s +?u?u?s?u?u?u?u?s +?l?s?s?l?l?l?l?d?d +?d?s?d?d?s?d?d?l?l?l +?l?l?l?d?d?s?d?s?d?d +?u?l?l?l?l?u?u?u?d +?u?u?l?l?l?d?d?d?d?d +?u?d?l?l?l?l?d?d?d?d +?d?d?s?d?d?s?d?d?u?u +?s?d?d?d?d?d?d?d?l?s +?l?d?d?d?d?d?d?s?d?s +?s?l?d?d?d?d?d?d?d?s +?l?s?d?d?d?d?d?d?d?s +?s?l?l?d?d?d?d?d?d?s +?s?d?l?l?l?l?l?l?d +?l?l?d?l?l?d?l?l?s +?u?u?l?l?l?l?s?d?d +?d?d?s?u?u?u?u?u?u +?d?d?s?u?l?l?l?l?l +?d?d?d?l?l?l?d?d?d?d?d +?l?d?l?l?d?d?l?d?d?d +?d?d?d?d?d?d?l?l?u?u +?d?d?l?d?d?u?u?u?d?d +?l?l?d?l?d?d?d?l?d?d +?u?d?d?l?d?d?l?d?d?l +?l?l?u?l?d?d?d?d?d?d +?d?l?d?l?d?l?l?d?d?d +?l?d?d?d?l?d?d?d?l?l +?d?l?d?l?d?d?l?l?d?d +?d?u?u?u?u?u?u?u?u?u +?d?d?d?d?d?d?d?d?d?d?s?s +?u?l?d?l?l?l?d?l?l +?u?l?d?l?l?d?l?l?l +?d?u?u?u?u?u?u?d?u +?l?l?l?l?s?s?l?l?l +?l?l?d?s?l?l?l?l?l +?d?d?s?d?d?s?d?d?d?d?s +?d?d?d?d?d?l?s?l?u +?d?d?d?d?s?u?d?l?l +?u?d?d?l?d?l?s?d?d +?u?d?u?s?l?d?d?d?d +?u?u?d?d?u?d?d?d?s +?s?u?l?u?d?d?d?d?d +?l?u?l?s?d?d?d?d?d +?l?d?d?l?s?d?d?l?d +?l?d?l?d?d?d?d?u?s +?l?s?d?d?d?l?l?d?d +?l?l?d?l?d?d?d?d?s +?u?l?u?d?s?d?d?d?d +?d?l?d?l?d?d?l?d?s +?d?d?d?s?l?d?l?d?l +?l?d?l?d?d?l?d?s?d +?d?d?d?d?d?u?l?s?l +?u?s?u?u?d?d?d?d?d +?l?l?d?s?l?d?d?d?d +?d?l?d?l?s?d?d?l?d +?l?d?d?l?d?l?s?d?d +?l?l?d?d?d?s?d?d?l +?s?d?d?d?u?l?l?d?d +?s?d?d?l?l?l?d?d?d +?d?d?s?d?d?d?u?u?u +?d?d?d?s?d?l?d?l?l +?d?u?l?l?s?d?d?d?d +?d?l?l?d?l?d?d?d?s +?d?d?d?s?d?d?u?l?u +?d?d?d?d?l?s?l?l?d +?d?d?d?l?s?l?l?d?d +?d?s?d?d?d?d?u?u?u +?d?d?d?l?d?d?l?l?s +?l?d?d?l?d?d?l?d?s +?l?d?d?l?l?s?d?d?d +?u?u?u?d?d?d?d?s?d?d +?d?d?l?d?d?l?s?l?d +?u?d?u?d?u?s?d?d?d +?s?d?l?l?d?d?d?d?l +?d?l?s?d?l?l?d?d?d +?d?d?l?d?s?d?l?d?l +?s?d?d?d?d?l?l?l?d +?u?d?d?u?d?d?u?d?s +?u?s?d?d?d?d?d?u?u +?s?u?d?d?u?d?d?d?u +?d?d?d?u?u?u?s?d?d +?l?d?d?l?l?d?s?d?d +?l?l?d?d?d?d?l?s?d +?u?l?u?d?d?d?s?d?d +?d?d?d?d?u?s?l?d?l +?d?d?d?d?l?l?d?l?s +?l?l?d?d?d?d?s?u?d +?l?l?d?l?d?s?d?d?d +?u?s?l?d?d?d?d?d?l +?l?l?d?l?d?d?s?d?d +?u?d?d?s?d?d?d?l?l +?l?s?l?d?d?l?d?d?d +?d?d?l?s?l?l?d?d?d +?l?d?s?d?l?l?d?d?d +?l?d?l?d?d?s?l?d?d +?d?d?d?l?l?d?d?l?s +?l?d?u?l?s?d?d?d?d +?d?d?d?u?d?l?d?l?s +?d?d?d?d?s?d?u?u?u +?l?u?d?d?l?d?s?d?d +?l?d?d?u?s?d?d?d?l +?d?l?d?l?l?d?s?d?d +?l?d?s?d?d?d?d?l?l +?u?d?l?d?d?l?d?s?d +?d?l?l?s?l?d?d?d?d +?d?u?l?l?d?d?d?d?s +?d?d?l?l?s?d?d?d?l +?l?d?s?d?d?l?l?d?d +?u?d?d?u?d?u?s?d?d +?d?d?l?s?l?u?d?d?d +?s?u?u?u?d?d?d?d?d +?s?d?d?d?d?d?u?l?l +?l?u?l?d?d?d?d?d?s +?u?l?s?u?d?d?d?d?d +?u?l?d?d?d?d?d?l?s +?d?u?u?d?u?d?d?s?d +?d?d?d?d?s?l?d?l?l +?d?d?l?l?d?d?s?l?d +?d?d?u?l?s?d?d?l?d +?d?d?d?d?l?d?l?l?s +?l?d?l?d?s?d?d?l?d +?l?l?s?d?d?d?d?d?l +?l?l?d?d?l?d?d?d?s +?l?l?d?d?s?d?d?l?d +?u?l?u?d?d?d?d?d?s +?s?d?d?l?d?l?l?d?d +?s?d?d?d?u?u?u?d?d +?d?d?d?l?d?l?s?d?u +?u?u?d?d?d?d?l?s?d +?l?d?d?d?s?l?d?l?d +?u?d?l?s?l?d?d?d?d +?l?d?l?l?d?d?d?s?d +?d?s?d?l?l?d?l?d?d +?d?s?d?l?l?l?d?d?d +?d?l?d?d?l?d?d?s?l +?l?d?d?l?d?d?l?s?d +?u?u?d?d?d?s?u?d?d +?u?u?d?s?u?d?d?d?d +?l?d?d?d?d?d?u?s?u +?d?u?d?s?d?d?u?d?u +?d?d?l?d?l?s?l?d?d +?u?d?s?l?l?d?d?d?d +?s?l?l?d?d?d?l?d?d +?d?l?l?s?u?d?d?d?d +?d?l?d?d?u?d?d?u?s +?d?l?d?d?d?l?d?l?s +?l?d?s?l?l?d?d?d?d +?d?u?d?u?d?u?d?d?s +?d?d?l?d?d?l?d?l?s +?l?u?l?d?s?d?d?d?d +?l?d?d?s?l?d?l?d?d +?d?d?d?l?d?l?s?l?d +?d?d?s?d?l?d?l?l?d +?s?u?u?l?d?d?d?d?d +?d?d?d?d?d?u?l?l?s +?l?d?l?d?d?l?s?d?d +?d?d?s?u?u?u?d?d?d +?d?l?d?d?l?s?l?d?d +?u?l?s?l?d?d?d?d?d +?d?d?d?u?u?l?d?d?s +?d?u?d?d?l?l?s?d?d +?l?d?l?d?l?d?d?d?s +?l?l?d?d?d?u?d?d?s +?l?d?l?l?d?d?d?d?s +?l?d?s?u?d?u?d?d?d +?l?u?u?d?d?d?d?d?s +?d?l?d?d?l?d?s?d?l +?d?d?s?u?d?u?d?d?u +?l?d?d?d?d?l?d?l?s +?d?d?l?d?l?s?d?d?l +?d?s?l?d?d?d?d?l?l +?s?u?d?d?l?l?d?d?d +?d?d?u?d?d?d?u?u?s +?d?l?d?l?d?s?l?d?d +?d?d?d?d?u?u?d?s?u +?l?l?s?d?l?d?d?d?d +?l?d?d?d?l?l?d?d?s +?d?l?d?l?s?l?d?d?d +?l?d?l?d?d?d?d?s?l +?d?d?l?d?d?d?l?l?s +?l?u?u?s?d?d?d?d?d +?u?l?s?d?d?d?d?d?u +?d?l?d?d?d?d?l?l?s +?l?d?l?d?d?d?l?d?s +?l?d?d?d?l?d?l?d?s +?d?s?d?d?d?l?l?l?d +?d?d?d?d?d?l?l?u?s +?d?d?l?d?d?l?s?d?l +?s?l?l?u?d?d?d?d?d +?u?s?d?u?u?d?d?d?d +?s?l?d?d?l?l?d?d?d +?s?d?u?l?l?d?d?d?d +?u?l?d?d?l?d?s?d?d +?d?d?d?d?l?d?s?l?l +?l?d?d?l?d?d?d?l?s +?u?d?d?u?u?d?s?d?d +?d?s?d?l?d?d?l?l?d +?d?d?s?d?l?l?l?d?d +?u?l?u?d?d?s?d?d?d +?l?u?d?d?s?u?d?d?d +?l?d?d?l?l?l?l?l?d?d +?l?l?l?s?l?l?l?l?l?l +?d?d?l?d?d?d?l?l?d?d +?d?l?l?d?d?l?d?d?d?d +?u?d?l?d?l?d?d?d?d?d +?d?l?d?l?d?d?d?l?d?d +?d?d?d?l?d?d?d?l?l?d +?u?u?d?u?d?d?d?d?d?d +?d?d?d?u?l?u?d?d?d?d +?u?d?d?d?d?d?d?d?l?l +?d?l?d?d?d?d?d?l?l?d +?d?d?d?d?d?l?l?d?d?l +?u?l?d?l?d?d?d?d?d?d +?d?l?d?d?d?l?d?d?l?d +?d?d?d?l?l?d?d?d?d?l +?l?d?d?d?d?d?l?d?d?l +?d?l?d?d?d?l?d?d?d?l +?d?d?s?s?l?l?l?l?l +?u?l?l?u?l?l?u?l?l +?u?l?l?l?u?l?l?d?d?d +?d?s?d?d?s?d?d?s?s +?s?d?d?d?d?d?s?s?s +?d?d?s?s?s?s?d?d?d +?l?u?l?l?d?l?d?d?d +?u?d?l?l?u?d?d?l?d +?u?d?d?l?l?l?u?d?d +?u?l?d?d?u?l?u?d?d +?d?d?d?d?l?l?d?l?l?l +?l?d?u?u?u?u?d?d?d +?d?d?l?l?d?d?l?l?u +?u?l?d?d?d?d?u?l?u +?u?d?d?l?l?u?d?d?l +?u?l?l?l?d?d?d?l?d +?u?d?l?d?l?d?u?d?l +?u?l?l?d?d?d?d?l?u +?d?d?l?u?l?l?l?d?d +?u?l?l?d?l?d?d?d?l +?l?l?l?u?d?d?u?d?d +?l?d?d?u?l?d?d?u?u +?u?l?d?d?d?d?u?u?l +?u?u?u?l?d?d?d?d?l +?u?u?u?d?l?l?d?d?d +?u?d?l?d?l?u?d?l?d +?l?d?l?u?l?d?l?d?d +?d?d?u?l?l?l?d?d?u +?d?d?u?l?u?u?l?d?d +?d?d?u?u?u?u?l?d?d +?u?d?u?d?u?d?d?u?u +?u?u?d?u?d?u?u?d?d +?l?d?l?l?l?u?d?d?d +?u?l?u?d?d?l?u?d?d +?d?d?l?l?u?l?u?d?d +?l?u?l?l?d?d?u?d?d +?u?u?d?d?d?d?l?l?u +?d?d?u?l?l?d?d?l?l +?u?d?l?l?u?l?d?d?d +?u?u?l?d?d?d?d?l?l +?u?d?u?u?u?d?u?d?d +?u?l?d?d?l?l?u?d?d +?u?d?l?u?d?l?l?d?d +?u?d?d?u?l?l?u?d?d +?l?d?d?l?u?u?l?d?d +?u?u?l?u?l?d?d?d?d +?d?d?l?l?d?d?u?l?l +?l?d?d?d?l?l?l?d?u +?d?d?u?u?l?u?l?d?d +?u?d?d?u?l?l?d?d?l +?d?u?d?u?u?u?d?u?d +?u?d?l?l?l?d?d?l?d +?l?d?l?d?l?u?l?d?d +?u?d?d?d?d?u?l?u?u +?u?d?l?d?l?d?d?l?l +?u?u?u?d?u?d?u?d?d +?u?l?d?d?l?d?l?l?d +?u?l?d?d?l?l?d?l?d +?u?l?d?l?d?u?d?l?d +?l?l?d?d?l?l?d?d?u +?d?u?d?d?d?u?u?u?u +?u?d?u?d?u?d?u?d?l +?d?d?d?d?l?u?l?u?l +?u?d?u?d?u?u?d?d?u +?d?d?d?u?u?l?l?l?d +?u?u?d?d?u?u?d?d?l +?d?d?l?l?d?l?d?l?u +?u?l?u?d?d?d?d?l?u +?l?l?d?u?u?u?d?d?d +?d?d?d?d?u?l?l?u?u +?u?d?d?l?u?l?l?d?d +?u?d?d?l?l?d?d?l?l +?u?u?l?l?d?d?d?d?l +?u?l?d?d?d?l?l?d?l +?u?l?l?u?d?d?l?d?d +?u?d?l?d?l?l?d?d?u +?d?l?d?l?d?d?l?l?u +?l?l?u?d?d?d?d?l?l +?l?d?u?d?l?d?l?d?l +?d?d?l?u?l?u?l?d?d +?u?l?s?u?l?l?l?l?l +?s?d?d?d?d?d?d?d?d?d?d?s +?l?l?l?l?l?l?d?s?d?d +?u?l?l?l?l?u?s?d?d +?u?l?s?l?l?l?l?d?d +?d?d?l?s?l?l?l?l?l +?l?s?l?l?l?s?s?s +?u?l?l?l?s?d?d?d?d?d +?d?d?d?d?d?d?s?l?l?l?l +?l?l?l?l?l?l?s?l?s +?u?u?u?u?u?u?s?d?d?d +?d?d?d?d?s?s?s?l?l +?l?s?l?s?d?d?d?d?s +?s?u?u?u?u?u?u?u?s +?d?d?d?d?d?d?u?u?u?u?u +?s?s?s?u?u?u?u?u +?s?u?u?u?u?u?s?s +?l?l?s?l?l?s?s?l +?u?s?d?d?d?d?d?d?d?d?d +?u?d?d?d?d?d?d?d?d?d?u +?u?l?l?l?l?l?d?d?d?d?d +?d?s?d?s?l?l?l?l?l +?u?u?l?l?l?d?d?s?s +?s?u?l?l?l?l?d?d?s +?d?d?d?d?s?s?s?s?l +?d?u?l?d?u?l?d?u?l +?u?u?u?u?u?u?d?d?l +?u?d?l?l?l?u?d?l?l +?u?d?d?d?u?u?u?u?u +?u?l?l?l?d?d?d?u?u +?u?l?l?d?d?l?l?l?d +?u?l?l?l?d?d?l?l?d +?u?u?d?u?u?u?u?u?d +?u?l?u?l?l?l?u?d?d +?l?u?l?d?d?d?l?u?l +?u?d?l?l?l?d?l?l?d +?u?u?u?u?u?d?d?u?d +?u?l?l?d?d?u?l?l?d +?u?d?l?l?l?d?d?l?l +?u?l?l?d?d?d?u?u?u +?u?l?l?d?l?l?d?l?d +?u?u?l?l?d?d?d?l?l +?u?d?u?d?u?u?u?u?d +?u?d?u?d?u?u?u?u?u +?d?d?u?u?d?u?u?u?u +?u?d?l?d?l?l?l?l?d +?u?l?l?u?u?u?d?d?d +?u?l?d?d?d?l?l?l?l +?u?l?l?l?d?l?d?l?d +?u?l?d?l?d?l?d?l?l +?l?l?l?l?d?d?s?d?s +?d?d?s?d?s?l?l?l?l +?s?l?l?l?l?s?d?d?d?d +?d?d?d?s?l?l?l?l?s +?u?l?l?l?s?s?d?d?d +?d?d?l?l?l?l?l?d?d?s +?l?l?l?s?l?s?l?l?l +?d?u?u?u?u?u?d?d?d?d +?l?d?l?l?d?l?d?l?d?d +?d?u?d?u?d?u?d?u?d?u +?d?u?l?l?l?l?d?d?d?d +?l?d?d?d?d?l?d?d?d?d?l +?l?l?s?l?l?s?l?l?l +?l?l?l?l?l?d?d?d?d?u +?l?l?s?s?l?d?d?s +?s?u?d?d?l?l?s?s +?d?s?s?s?l?d?l?l +?l?l?l?d?s?s?d?s +?d?l?s?d?s?l?l?s +?u?l?l?d?d?d?s?s?s +?s?l?u?s?s?d?u?d +?l?l?l?d?s?d?s?s +?u?l?l?s?d?s?s?d +?u?u?s?s?u?s?d?d +?l?d?s?s?d?l?l?s +?s?l?s?d?s?u?l?d +?l?l?d?d?s?s?l?s +?s?s?s?d?d?u?u?u +?l?l?s?s?l?s?d?d +?l?d?l?d?s?s?l?s +?u?u?d?u?d?s?s?s +?s?l?l?l?d?s?d?s +?d?s?u?u?u?s?d?s +?l?s?l?d?s?l?d?s +?l?s?s?d?l?l?s?d +?l?l?l?s?d?s?s?d +?d?d?s?s?s?l?u?l +?l?d?d?l?s?l?s?s +?l?d?d?s?s?u?s?u +?s?s?s?u?l?l?d?d +?l?s?l?d?s?s?d?l +?u?l?s?s?s?d?l?d +?l?s?s?d?d?s?l?l +?u?l?l?s?s?s?d?d +?d?d?s?s?u?u?u?s +?u?s?u?l?d?d?s?s +?d?l?l?d?s?l?s?s +?u?s?l?u?s?s?d?d +?l?s?d?l?s?d?l?s +?l?d?d?s?l?s?s?l +?u?l?l?s?s?d?d?s +?l?l?d?l?s?d?s?s +?l?s?s?l?d?d?l?s +?u?s?l?l?s?d?d?s +?u?d?l?d?l?s?s?s +?u?u?s?l?s?d?s?d +?u?s?u?s?s?u?d?d +?l?d?l?s?d?l?s?s +?s?u?d?s?l?l?d?s +?l?s?l?s?s?u?d?d +?d?s?s?l?s?l?l?d +?s?u?l?l?s?s?d?d +?u?s?l?u?s?d?s?d +?l?s?l?s?s?l?d?d +?u?u?u?s?s?d?s?d +?s?s?l?d?l?l?d?s +?s?s?s?d?l?l?d?l +?l?d?s?s?d?s?l?l +?u?u?u?s?s?d?d?s +?s?s?d?l?l?l?d?s +?u?s?s?s?l?l?d?d +?l?s?d?d?l?l?s?s +?u?s?s?s?u?u?d?d +?d?d?u?s?u?s?u?s +?s?u?u?u?d?d?s?s +?l?s?s?d?u?s?d?l +?s?s?s?u?l?u?d?d +?u?d?d?l?l?s?s?s +?l?s?l?s?u?s?d?d +?l?s?l?l?s?d?s?d +?s?l?s?s?l?d?l?d +?d?d?s?u?s?s?u?u +?l?l?s?d?s?l?s?d +?l?s?l?l?s?d?d?s +?u?s?u?u?d?d?s?s +?u?s?l?s?l?s?d?d +?l?s?s?d?l?d?l?s +?s?s?s?l?d?d?l?l +?l?l?d?s?l?s?s?d +?d?s?s?l?l?s?d?l +?l?l?s?d?d?l?s?s +?d?u?u?d?s?u?s?s +?l?d?l?s?l?d?s?s +?l?l?s?d?s?s?d?l +?s?s?l?s?l?l?d?d +?l?u?s?l?s?s?d?d +?d?s?u?s?u?d?l?s +?u?d?l?d?s?u?s?s +?l?s?d?d?l?s?l?s +?u?s?u?u?d?s?s?d +?s?d?d?s?s?l?l?l +?s?l?l?u?s?d?d?s +?l?s?s?u?l?s?d?d +?l?s?l?s?d?s?l?d +?s?l?s?u?u?d?d?s +?u?s?u?s?l?s?d?d +?l?l?d?s?l?s?d?s +?u?d?s?u?d?s?s?u +?u?s?u?l?s?d?d?s +?l?s?d?l?l?s?s?d +?l?s?d?l?s?s?l?d +?d?l?s?s?d?l?l?s +?u?s?l?l?s?s?d?d +?u?u?s?s?s?u?d?d +?s?d?s?d?s?l?l?l +?d?d?l?l?s?l?s?s +?u?u?d?d?u?s?s?s +?s?u?s?u?u?d?d?s +?l?d?s?l?s?d?s?l +?s?l?l?s?s?l?d?d +?u?s?u?s?u?d?d?s +?u?d?s?s?d?u?s?u +?s?l?l?s?d?l?d?s +?s?l?d?l?s?l?s?d +?s?s?u?l?u?d?d?s +?d?s?u?u?d?u?s?s +?d?u?s?s?s?u?u?d +?s?l?l?s?l?s?d?d +?l?s?l?s?d?d?l?s +?l?d?l?l?s?s?s?d +?l?s?s?l?s?l?d?d +?l?s?s?s?d?d?l?l +?d?s?l?d?l?s?u?s +?s?s?s?l?d?l?d?l +?l?d?s?s?l?l?s?d +?s?s?u?u?s?l?d?d +?l?s?s?u?d?s?l?d +?s?s?u?d?u?s?u?d +?d?s?l?d?s?l?d?s?l +?s?l?s?l?s?d?d?l +?l?d?d?s?s?u?s?l +?s?u?l?l?d?d?s?s +?l?s?l?l?s?s?d?d +?l?s?d?d?s?l?l?s +?d?u?s?d?u?s?s?u +?l?l?d?l?d?s?s?s +?s?u?l?s?d?d?l?s +?d?s?l?l?l?s?d?s +?l?s?l?l?d?d?s?s +?s?d?d?s?u?u?u?s +?l?u?s?u?s?d?d?s +?l?d?l?s?s?s?l?d +?l?l?l?s?s?d?s?d +?s?d?s?u?u?s?u?d +?s?l?s?d?s?l?d?l +?s?l?d?l?s?l?d?s +?u?s?d?s?l?s?u?d +?s?d?s?s?l?l?l?d +?s?u?l?d?s?s?d?l +?u?s?d?s?l?s?d?l +?d?l?s?d?l?l?s?s +?s?l?d?l?d?s?s?l +?s?l?s?s?l?l?d?d +?s?s?u?s?l?l?d?d +?d?l?l?s?d?l?s?s +?s?d?s?l?l?d?s?l +?s?d?s?u?d?u?l?s +?d?l?d?l?l?s?s?s +?u?u?u?s?s?s?d?d?d +?u?u?d?d?l?s?s?s +?u?s?s?d?l?s?d?l +?u?l?s?s?d?l?d?s +?l?d?s?l?s?s?l?d +?l?l?d?d?s?l?s?s +?d?l?d?l?s?l?s?s +?l?l?d?s?l?d?s?s +?s?l?d?l?l?s?d?s +?u?s?l?s?u?s?d?d +?d?s?d?l?l?s?l?s +?u?l?l?s?d?s?d?s +?d?s?l?d?s?l?s?l +?s?s?d?l?s?l?d?l +?d?l?s?l?l?s?d?s +?l?d?d?l?s?s?s?l +?u?s?s?s?l?u?d?d +?d?u?l?s?d?s?l?s +?l?u?l?d?d?s?s?s +?s?d?l?s?u?l?s?d +?l?l?l?d?s?s?s?d +?s?s?l?l?d?d?s?l +?l?l?d?s?s?l?d?s +?s?u?d?d?s?s?u?u +?d?u?l?u?s?s?d?s +?s?l?d?l?s?d?l?s +?s?l?s?s?l?d?d?l +?s?l?l?l?s?d?s?d +?d?s?l?l?s?l?s?d +?d?d?l?s?l?s?s?l +?u?l?l?u?l?l?l?d?d?d +?l?l?l?d?l?l?l?l?l?d +?l?d?l?l?d?l?l?l?s +?d?d?s?u?l?l?s?d?d +?d?d?l?s?l?s?l?d?d +?s?l?l?l?d?d?s?d?d +?l?l?d?d?l?d?d?s?s +?s?d?l?d?l?d?l?d?s +?d?d?d?d?l?s?s?l?l +?l?d?l?d?s?s?d?l?d +?l?l?l?d?s?d?d?d?s +?d?d?s?d?d?s?u?u?u +?s?d?d?s?d?d?l?l?l +?s?l?s?l?l?d?d?d?d +?u?u?l?l?d?d?d?d?s?s +?l?l?s?s?l?l?l?l?l +?u?l?l?l?u?l?d?d?d?d +?l?l?d?d?l?l?d?l?l?d +?u?u?d?d?d?d?d?d?d?d?d?d +?d?d?d?d?s?l?l?l?d?d +?s?s?s?d?s?s?s?d +?d?s?s?s?s?s?s?d +?s?d?d?s?s?s?s?s +?u?l?l?s?s?d?l?u +?s?l?s?l?l?l?d?l +?u?s?l?l?d?l?l?s +?l?s?l?u?d?s?l?l +?l?l?s?l?l?d?l?s +?l?l?l?l?d?s?s?l +?u?u?u?s?u?s?u?d +?u?u?u?u?u?s?d?s +?l?s?l?l?d?s?l?l +?u?l?s?d?s?l?l?l +?l?l?d?s?l?l?s?l +?d?s?l?l?l?l?s?l +?u?u?s?u?u?u?s?d +?u?s?l?l?s?l?d?l +?u?d?l?s?s?u?l?l +?u?d?l?s?l?s?l?l +?l?s?d?l?l?s?l?l +?u?l?s?s?l?d?l?l +?s?u?u?d?l?l?l?s +?l?l?l?d?l?s?s?l +?s?u?d?u?u?u?u?s +?l?d?s?l?l?l?s?l +?s?l?l?l?l?d?s?l +?s?u?u?u?d?l?l?s +?s?d?l?u?l?l?l?s +?u?s?u?s?d?u?u?u +?u?u?u?u?s?s?u?d +?l?s?s?d?l?l?l?l +?u?d?l?l?s?l?s?l +?u?s?u?s?d?l?l?l +?s?u?l?l?d?u?l?s +?s?d?l?s?l?l?l?l +?s?u?l?u?l?u?d?s +?s?d?u?u?u?u?u?s +?u?l?s?u?l?l?s?d +?u?d?s?u?l?l?u?s +?u?l?l?s?u?l?s?d +?u?u?u?s?u?u?s?d +?s?u?l?l?d?l?l?s +?l?l?l?l?u?d?s?s +?u?l?u?l?u?d?s?s +?l?l?s?d?l?s?l?l +?s?l?l?l?d?s?l?l +?d?l?s?l?l?l?l?s +?s?u?u?u?l?l?s?d +?u?u?u?l?l?s?d?s +?u?s?d?l?l?l?u?s +?d?l?l?s?l?s?l?l +?u?s?s?l?l?d?l?l +?d?u?l?s?l?s?l?l +?l?l?l?d?s?s?l?l +?u?u?l?l?l?s?s?d +?s?l?d?l?s?l?l?l +?s?u?u?u?s?l?l?d +?l?s?l?s?l?u?l?d +?u?l?l?l?s?l?s?d +?s?u?u?u?d?u?u?s +?u?s?l?l?u?d?l?s +?l?d?s?l?s?l?l?l +?u?l?s?l?l?d?l?s +?u?d?l?s?l?l?u?s +?l?l?l?s?u?s?d?l +?s?s?d?d?l?l?l?l?l +?s?l?d?l?l?l?s?l +?s?d?u?u?u?s?u?u +?l?s?u?s?l?l?d?l +?l?s?d?l?s?l?l?l +?d?s?s?l?l?l?l?u +?u?u?u?u?s?d?s?u +?s?s?l?l?l?d?l?l +?s?l?l?l?d?l?s?l +?d?d?d?d?d?u?d?d?d?d?d +?d?d?d?d?d?d?d?d?d?u?d +?d?d?l?d?d?l?d?d?l?d?d +?s?s?l?l?l?d?d?s?s +?s?d?s?d?s?d?s?d?s +?l?l?d?d?d?d?l?d?d?l +?d?d?d?d?l?d?d?l?l?l +?l?d?l?d?d?d?d?l?d?l +?u?l?d?d?d?u?l?d?d?d +?d?d?l?d?d?l?l?d?d?l +?u?l?d?d?d?d?d?d?l?u +?l?d?l?d?l?l?l?d?s +?l?l?l?l?u?d?d?d?s +?u?u?s?u?u?u?d?d?d +?l?l?d?l?l?l?s?d?d +?u?l?d?l?l?l?s?d?d +?u?u?u?u?s?u?d?d?d +?l?l?d?d?l?l?l?d?s +?l?l?l?l?l?s?s?s?s +?s?l?l?l?l?s?d?d?s +?u?u?u?l?l?l?l?d?d?d +?s?s?s?s?d?d?d?d?d?d +?u?u?u?u?u?u?u?s?d?d +?u?d?l?d?u?d?l?d?u?d +?l?d?l?d?l?l?l?d?d?d +?d?d?d?d?l?d?l?l?l?l +?l?d?l?d?l?d?l?l?d?d +?l?d?l?d?l?l?d?l?d?d +?l?l?s?s?s?s?s?d +?l?l?l?s?l?u?l?l +?l?l?u?s?l?l?l?u +?l?u?s?l?l?l?l?l +?u?s?u?u?l?l?l?l +?s?u?l?l?l?u?l?l +?u?l?u?s?u?l?l?l +?l?s?u?u?u?u?u?u +?u?l?u?l?s?l?u?l +?s?u?l?u?l?u?l?u +?u?s?l?u?l?l?l?l +?s?l?l?l?u?l?l?l +?s?u?l?l?u?l?l?l +?s?u?l?l?l?l?l?u +?s?l?l?l?l?l?u?u +?u?l?u?s?l?u?l?u +?u?u?l?l?l?u?u?s +?l?l?u?l?l?s?l?l +?l?l?l?l?u?s?l?l +?u?u?l?s?l?l?l?l +?u?l?u?s?l?l?l?l +?u?l?u?l?u?s?l?l +?l?u?u?l?u?u?u?s +?u?u?u?u?u?u?d?d?d?d?d +?u?u?u?u?u?d?d?d?d?s +?d?d?d?d?d?d?l?s?l?s +?u?u?d?u?u?d?u?u?u +?u?l?u?l?l?u?l?d?d +?l?l?l?u?l?l?l?l?l +?l?d?l?l?d?l?d?l?l?d +?l?l?d?d?l?l?l?d?d?l +?s?s?s?s?s?s?l?l +?s?s?u?u?l?l?l?l +?u?l?s?s?u?l?l?l +?l?s?u?l?l?l?s?l +?u?l?l?l?s?u?l?s +?s?l?l?l?l?l?u?s +?u?s?u?l?l?l?s?u +?u?l?l?s?s?u?l?l +?l?l?l?l?u?l?s?s +?u?u?u?u?s?u?u?s +?s?u?l?l?l?l?s?u +?s?u?s?u?u?u?u?u +?u?s?u?l?l?l?l?s +?d?d?d?d?d?d?d?s?d?d?d?d +?l?l?l?l?d?u?u?u?u +?l?u?l?l?l?l?l?l?d +?d?d?u?l?l?l?l?l?l?l +?l?d?d?d?d?d?d?l?d?d?d +?d?d?d?d?d?u?d?d?d?u +?l?s?l?d?d?d?d?d?d?d?d +?u?d?d?d?u?d?d?d?d?d +?d?d?d?u?l?d?d?d?d?d +?d?d?d?d?d?u?d?u?d?d +?d?u?d?d?d?d?d?d?d?u +?d?d?d?d?u?d?l?d?d?d +?d?u?d?d?d?d?u?d?d?d +?d?u?d?d?d?d?d?u?d?d +?u?d?d?d?d?d?l?d?d?d +?d?d?d?d?d?d?u?l?d?d +?d?d?d?d?u?u?u?d?d?d?d +?u?d?d?d?d?d?d?u?d?d +?d?d?d?d?d?u?l?d?d?d +?d?u?d?d?u?d?d?d?d?d +?l?d?d?d?d?u?d?d?d?d +?d?d?d?d?d?d?d?u?d?l +?d?d?d?d?d?d?l?d?d?u +?d?d?d?d?u?d?u?d?d?d +?d?d?l?d?d?d?d?d?d?u +?d?d?d?d?l?d?d?d?d?u +?d?l?d?d?d?d?d?d?d?u +?d?d?d?u?d?d?d?u?d?d +?d?d?u?d?d?d?d?u?d?d +?d?d?d?d?d?d?l?u?d?d +?d?d?d?d?d?d?d?l?d?u +?u?s?l?s?u?s?l?s +?l?l?l?s?l?s?s?s +?s?s?u?l?l?u?s?s +?s?s?l?s?s?l?l?l +?u?u?u?u?u?s?u?d?d +?l?d?l?d?l?l?l?l?s +?u?l?l?l?l?u?d?d?s +?s?s?s?s?s?s?d?d?d +?d?d?l?l?l?l?d?d?l?l +?u?l?l?l?l?l?u?d?d?d +?s?s?l?l?l?s?s?s +?l?l?l?s?l?l?s?l?l +?l?l?l?s?d?s?s?s +?s?l?s?l?d?l?s?s +?l?s?l?d?l?s?s?s +?s?s?s?s?l?l?l?d +?u?u?u?l?u?l?l?u +?l?l?u?l?u?u?l?u +?u?l?u?u?u?u?l?l +?l?u?l?l?l?u?l?u +?l?l?u?u?u?l?u?l +?l?u?l?u?l?u?u?l +?u?u?u?d?l?l?l?l?l +?u?u?l?u?l?u?l?u +?u?u?l?l?u?l?u?l +?l?u?l?l?u?l?u?u +?u?l?l?u?u?u?u?l +?u?u?u?u?l?l?u?l +?l?u?u?u?l?u?u?l +?l?l?u?l?u?l?l?u +?l?u?l?u?u?l?l?u +?u?l?l?l?u?u?u?l +?u?u?l?l?u?u?l?u +?u?u?u?u?l?u?l?u +?l?l?u?l?l?u?u?l +?l?l?u?u?u?l?l?u +?u?u?l?u?l?u?u?l +?l?l?u?u?l?u?l?l +?l?u?u?l?l?u?u?l +?l?u?l?u?u?u?l?u +?u?l?u?u?l?u?u?u +?u?u?l?u?u?u?u?l +?l?l?l?u?l?u?u?l +?l?l?l?u?l?u?u?u +?u?u?l?u?u?l?u?l +?l?u?l?u?u?l?u?l +?l?d?l?l?s?l?l?l?l +?l?l?l?l?l?l?l?d?s?d +?u?l?l?l?d?l?d?d?d?d +?d?d?d?d?l?l?l?l?d?d?d?d +?d?d?d?u?u?u?s?s?s +?d?s?d?s?d?s?l?l?l +?l?l?l?l?l?d?d?d?l?d +?l?d?l?l?d?l?l?d?l?d +?l?l?l?d?d?d?d?d?d?d?s +?u?d?d?d?d?d?d?d?s?s +?u?d?s?d?d?s?d?d?d?d +?l?d?d?s?d?s?d?d?d?d +?l?s?s?d?d?d?d?d?d?d +?d?d?d?d?d?d?d?s?l?s +?s?l?d?d?d?l?l?l?s +?l?s?l?l?s?l?d?d?d +?u?u?l?l?s?s?d?d?d +?l?s?s?l?l?l?d?d?d +?s?s?s?u?l?l?l?l +?l?l?l?l?s?s?s?u +?u?s?s?s?u?u?u?u +?l?u?l?l?l?l?l?l?l +?l?l?l?l?l?l?u?l?l +?l?l?l?l?u?u?d?d?d?d +?d?d?l?l?d?d?l?l?l?l +?d?d?s?d?d?s?d?d?d?s +?d?d?d?d?s?s?s?d?d?d +?s?u?u?u?u?u?d?d?s +?l?l?l?l?l?l?d?u?u +?u?u?l?l?l?l?l?l?d?d +?u?u?u?d?d?s?d?d?d?d +?d?d?d?d?d?d?d?l?l?l?l?l +?l?d?l?l?l?d?l?l?s +?u?u?u?u?s?u?u?d?d +?l?l?l?d?s?d?l?l?l +?u?u?l?l?l?l?d?d?s +?u?u?u?s?d?d?l?l?l +?d?d?u?l?l?l?u?l?l +?d?u?l?l?d?u?l?l?l +?u?l?u?u?l?l?l?d?d +?u?d?l?l?u?d?l?l?l +?l?l?l?d?d?u?l?l?l +?u?l?l?d?l?d?l?l?l +?u?l?d?l?l?l?l?d?l +?u?l?l?l?d?l?d?l?l +?l?l?l?l?s?l?l?s?d +?l?d?l?d?l?d?d?d?d?d?d +?l?l?l?l?l?l?l?l?l?l?d +?u?l?l?l?l?l?l?u?d?d +?u?l?l?l?l?l?l?u?u +?l?l?l?d?d?d?d?u?u?u +?l?l?l?l?d?d?d?l?l?d +?s?d?l?d?d?l?d?d?s +?d?s?u?d?d?s?u?d?d +?d?l?l?d?s?d?s?d?d +?d?d?d?d?d?s?l?s?l +?s?d?l?l?d?d?d?d?s +?u?l?d?d?d?d?d?s?s +?l?d?d?d?s?l?d?d?s +?u?d?d?s?u?d?d?d?s +?s?u?d?l?d?d?d?d?s +?d?d?s?d?d?s?l?d?l +?u?s?u?d?d?d?s?d?d +?u?u?d?d?s?d?d?s?d?d +?l?l?d?s?s?d?d?d?d +?u?l?s?d?d?s?d?d?d +?l?s?s?d?l?d?d?d?d +?s?u?u?d?d?d?d?s?d +?l?d?d?d?d?l?s?d?s +?l?d?l?d?s?s?d?d?d +?d?l?s?d?d?l?s?d?d +?l?l?s?d?d?d?d?s?d +?u?s?d?d?d?d?d?s?u +?u?s?d?d?d?d?d?s?l +?s?d?s?d?u?u?d?d?d +?u?u?d?d?d?s?d?s?d +?s?d?u?l?s?d?d?d?d +?s?l?s?l?d?d?d?d?d +?s?s?d?d?d?d?d?u?l +?l?s?l?d?d?s?d?d?d +?u?d?u?d?d?s?d?d?s +?d?d?d?d?d?u?l?s?s +?l?s?d?l?s?d?d?d?d +?d?l?l?s?d?d?d?d?s +?u?u?s?d?s?d?d?d?d +?u?d?s?l?s?d?d?d?d +?l?s?l?d?d?d?d?s?d +?s?d?d?l?d?d?l?d?s +?d?d?d?s?s?d?d?u?u +?s?d?d?d?d?d?u?u?s +?d?d?l?s?l?s?d?d?d +?l?d?d?s?d?d?s?d?d?l +?u?u?d?s?s?d?d?d?d +?s?u?l?d?d?s?d?d?d +?s?d?d?d?s?l?d?l?d +?l?d?l?s?d?d?s?d?d +?d?d?d?s?d?d?s?u?u +?d?d?d?l?l?d?d?s?s +?l?d?d?s?d?s?d?d?l +?u?u?d?d?s?d?d?d?s +?l?d?d?d?d?s?d?s?l +?d?l?l?d?d?d?d?s?s +?l?d?s?l?d?d?d?d?s +?l?s?d?s?l?d?d?d?d +?l?d?d?s?d?l?s?d?d +?l?d?u?s?s?d?d?d?d +?u?d?d?d?d?d?l?s?s +?d?d?d?l?s?s?l?d?d +?u?l?s?d?d?d?d?d?s +?s?l?l?d?d?d?s?d?d +?d?d?l?d?s?s?l?d?d +?d?s?l?d?d?s?l?d?d +?d?d?d?s?l?d?s?l?d +?s?d?s?l?l?d?d?d?d +?s?d?d?d?d?s?d?l?l +?s?d?d?d?l?l?s?d?d +?d?d?d?d?d?s?s?u?u +?d?d?s?d?d?s?l?l?d +?d?d?l?s?l?d?s?d?d +?l?l?d?d?s?d?d?s?d +?s?l?l?d?d?s?d?d?d +?d?d?s?d?d?d?s?l?l +?s?l?d?l?s?d?d?d?d +?d?d?l?l?d?d?d?s?s +?u?u?s?d?d?s?d?d?d +?d?l?s?l?s?d?d?d?d +?d?s?d?l?s?d?l?d?d +?d?d?d?d?s?s?l?d?l +?l?d?s?s?l?d?d?d?d +?s?u?l?d?s?d?d?d?d +?d?l?l?s?l?l?l?l?l +?d?u?l?l?l?l?l?l?s +?l?l?l?d?l?d?l?d?d?d +?l?d?l?s?d?d?d?d?d?d +?l?s?d?l?d?d?d?d?d?d +?d?d?d?d?d?d?d?s?u?l +?u?u?d?d?d?d?d?d?d?s +?l?s?d?d?d?d?d?d?d?l +?s?l?d?d?d?d?d?d?d?l +?d?d?d?d?d?l?l?s?d?d +?u?d?d?d?s?u?d?d?d?d +?l?l?l?l?l?l?d?d?l?d +?d?d?d?l?l?l?l?l?l?s +?s?s?s?l?l?l?l?d?d +?d?d?d?l?l?l?l?l?l?l?l +?u?l?u?l?u?l?u?d?d?d +?l?d?d?d?d?d?d?d?l?d?d +?l?d?d?d?d?d?d?d?d?d?u +?l?l?u?l?s?d?d?d?d +?l?d?l?l?d?s?l?d?d +?l?d?d?d?d?s?l?l?l +?d?d?d?d?s?u?u?l?l +?l?l?l?s?d?d?l?d?d +?l?d?s?l?d?l?d?l?d +?d?d?d?d?s?u?l?u?l +?d?l?l?l?l?d?d?s?d +?u?u?l?u?s?d?d?d?d +?d?d?l?d?d?s?l?l?l +?l?s?d?l?l?l?d?d?d +?l?l?d?d?d?d?s?u?u +?s?l?l?l?u?d?d?d?d +?u?l?s?u?l?d?d?d?d +?d?d?d?d?u?u?u?s?u +?u?d?d?d?d?l?l?l?s +?d?d?l?l?l?l?d?s?d +?s?d?d?d?d?u?u?u?u +?d?d?u?l?u?l?s?d?d +?d?l?l?l?s?l?d?d?d +?u?l?d?l?l?d?s?d?d +?u?l?d?d?u?l?d?d?s +?d?u?l?l?l?d?s?d?d +?l?d?l?s?d?d?l?d?l +?d?d?d?s?d?u?l?l?l +?l?l?s?l?d?l?d?d?d +?l?l?d?l?d?d?s?l?d +?u?l?d?u?l?d?s?d?d +?u?s?l?d?l?d?d?l?d +?l?u?l?u?d?d?d?d?s +?u?u?u?d?d?d?d?s?u +?u?u?d?d?u?u?d?d?s +?u?u?u?u?d?s?d?d?d +?l?l?s?u?u?d?d?d?d +?l?s?l?d?l?d?l?d?d +?u?l?u?u?s?d?d?d?d +?l?d?l?l?s?l?d?d?d +?d?l?l?l?d?l?d?d?s +?s?l?l?u?l?d?d?d?d +?d?l?l?d?l?l?d?d?s +?l?l?s?u?l?d?d?d?d +?u?d?l?l?l?s?d?d?d +?s?d?d?d?d?u?l?l?l +?l?d?l?d?l?l?d?d?s +?l?l?l?d?d?l?d?d?s +?l?u?d?d?d?d?l?u?s +?u?d?d?d?d?u?u?u?s +?l?d?s?l?l?l?d?d?d +?u?l?u?l?d?d?s?d?d +?l?d?d?s?d?d?l?l?l +?d?d?d?d?u?l?s?l?l +?l?d?d?d?d?l?s?l?l +?d?d?u?l?l?l?s?d?d +?s?l?d?d?l?d?l?d?l +?s?l?d?l?l?d?l?d?d +?d?d?l?s?d?d?l?l?l +?d?d?u?s?u?l?u?d?d +?s?d?l?l?l?d?d?d?l +?u?l?d?l?l?d?d?d?s +?s?d?l?l?d?l?l?d?d +?u?l?l?s?d?d?d?d?u +?s?l?l?d?d?l?l?d?d +?l?d?l?s?l?d?l?d?d +?l?l?d?d?d?l?l?s?d +?d?d?d?d?l?l?l?s?u +?l?u?l?l?s?d?d?d?d +?l?d?d?l?l?l?s?d?d +?l?u?l?l?d?d?d?d?s +?l?l?l?l?l?s?l?s?l +?u?s?l?l?l?l?l?l?d +?u?s?l?l?l?l?l?l?l +?l?l?l?d?d?l?l?l?l?d +?l?s?l?s?l?s?d?d?d?d +?d?d?s?l?l?l?l?l?s +?l?l?d?d?l?d?d?d?d?l +?l?d?d?l?l?d?l?d?d?d +?l?u?l?l?d?d?d?d?d?d +?u?l?l?d?d?d?d?d?d?l +?d?d?l?d?l?l?d?l?d?d +?d?d?d?d?d?l?l?l?d?l +?d?d?u?u?u?d?d?d?d?u +?u?u?u?d?d?d?d?d?d?u +?l?d?l?l?d?d?d?l?d?d +?d?d?d?l?d?l?d?l?d?l +?l?d?d?d?d?d?l?l?d?l +?d?d?d?d?d?l?l?d?l?l +?d?d?u?d?d?u?d?d?u?u +?u?u?l?u?d?d?d?d?d?d +?d?d?l?l?l?d?d?d?l?d +?d?d?d?u?l?u?l?d?d?d +?l?d?l?d?l?d?d?d?d?l +?u?u?d?u?u?d?d?d?d?d +?u?u?u?u?l?l?l?l?d?d +?d?d?d?d?d?d?d?l?l?l?s +?d?s?d?s?d?s?d?s?l +?u?d?l?d?l?l?l?d?l +?u?d?u?d?u?d?l?l?l +?l?l?u?l?u?l?d?d?d +?l?l?l?d?d?d?u?l?l +?u?l?l?u?l?u?d?d?d +?u?u?d?d?u?u?d?u?u +?u?u?u?u?d?u?d?u?d +?d?d?d?l?u?l?l?l?l +?u?u?u?u?l?u?d?d?d +?u?l?l?d?l?l?u?d?d +?u?l?l?u?u?l?d?d?d +?l?d?d?l?d?d?l?l?l?l +?d?d?d?l?l?l?u?l?l +?u?u?u?u?d?d?u?u?d +?u?d?u?u?u?d?u?u?d +?u?d?l?u?d?l?u?d?l +?u?d?l?d?l?u?d?l?l +?u?d?l?d?l?d?l?l?l +?l?u?l?l?l?u?d?d?d +?u?u?d?u?u?d?d?u?u +?d?d?d?u?l?u?l?l?l +?l?l?l?l?l?d?u?d?d +?u?l?d?u?l?l?l?d?d +?u?l?d?d?d?u?l?l?l +?d?d?d?u?l?l?l?l?u +?l?l?l?l?l?d?u?u?u +?l?l?u?l?l?l?l?l?d +?s?u?s?l?l?s?u?s +?l?l?l?s?s?l?s?s +?l?l?s?s?s?s?l?l +?s?l?l?l?l?l?l?l?d?d +?d?d?d?d?d?d?s?s?s?l +?l?d?s?l?l?l?l?l?l +?s?u?l?l?l?l?l?l?d +?l?l?l?l?d?d?l?l?l?d +?l?l?l?l?l?s?s?l?l +?l?l?l?l?l?l?d?l?l?d +?u?u?u?l?l?l?l?l?d?d +?d?d?l?l?l?l?l?d?s +?l?d?l?l?l?d?d?l?s +?l?l?d?l?d?l?l?d?s +?l?d?l?l?l?d?l?d?s +?l?l?l?d?d?d?l?s?l +?l?d?s?l?l?l?l?d?d +?l?d?l?l?s?l?d?d?l +?d?d?d?u?s?l?l?l?l +?l?l?l?l?s?d?l?d?d +?u?u?s?l?l?l?l?d?d +?l?l?l?l?d?d?l?d?s +?u?u?u?u?u?u?l?l?l +?l?l?l?s?s?l?l?l?l +?d?d?s?s?d?d?s?s?d?d +?l?l?l?l?l?s?s?s?d +?l?d?l?d?d?l?d?l?d?l +?l?l?l?d?d?l?d?l?d?d +?d?d?d?d?l?l?l?d?l?l +?s?s?s?u?u?s?s?s +?u?u?u?u?s?d?d?d?d?d +?l?l?l?l?l?s?l?s?d +?d?s?s?d?l?s?l?s +?l?s?s?s?s?l?d?d +?s?s?s?s?l?u?d?d +?u?s?u?s?s?d?d?s +?s?s?l?d?l?s?s?d +?l?s?d?d?s?s?l?s +?s?u?l?s?d?d?s?s +?u?s?l?s?d?s?d?s +?u?s?d?s?u?s?d?s +?l?s?d?s?d?s?l?s +?u?s?d?s?s?s?d?l +?d?d?s?l?s?l?s?s +?s?s?u?l?d?d?s?s +?s?s?l?l?s?d?d?s +?d?s?s?l?d?s?s?l +?s?s?l?s?s?d?d?l +?s?s?s?l?d?d?l?s +?d?d?u?l?s?s?s?s +?l?l?s?d?d?s?s?s +?l?u?d?d?s?s?s?s +?s?s?d?d?u?u?s?s +?s?d?s?s?d?s?l?l +?u?d?s?d?s?s?u?s +?l?d?s?s?d?l?s?s +?s?u?s?s?u?s?d?d +?s?s?l?d?d?l?s?s +?s?l?d?l?s?d?s?s +?u?s?s?u?s?s?d?d +?u?s?u?s?d?d?s?s +?d?d?s?s?l?s?s?l +?s?l?s?s?l?s?d?d +?s?s?l?d?s?l?d?s +?s?d?l?s?s?l?s?d +?l?s?s?d?s?l?d?s +?s?s?d?s?l?d?s?l +?s?l?s?l?d?d?s?s +?s?s?l?s?l?s?d?d +?l?s?d?s?l?s?d?s +?d?s?s?l?s?l?s?d +?d?d?s?s?s?u?u?s +?u?s?l?s?s?s?d?d +?s?l?l?s?s?d?d?s +?s?l?d?s?l?d?s?s +?l?s?d?d?s?l?s?s +?s?d?d?l?s?l?s?s +?u?d?s?l?d?s?s?s +?s?u?s?d?l?d?s?s +?u?l?s?s?s?s?d?d +?d?d?u?u?s?s?s?s +?s?d?l?s?s?d?l?s +?d?s?s?s?s?l?u?d +?u?u?s?s?s?s?d?d +?s?u?s?s?s?u?d?d +?l?s?s?s?l?s?d?d +?s?s?s?s?u?u?d?d +?l?s?l?d?d?s?s?s +?d?s?s?l?s?s?l?d +?s?d?s?d?s?l?l?s +?d?d?s?u?u?s?s?s +?s?s?d?l?d?l?s?s +?d?s?u?s?u?s?s?d +?s?s?s?d?d?s?l?l +?d?d?l?s?l?s?s?s +?l?s?s?d?d?s?s?l +?u?l?d?d?s?s?s?s +?u?u?d?d?s?s?s?s +?u?s?s?s?l?d?d?s +?l?s?s?s?d?l?d?s +?u?u?u?l?u?l?u?d +?u?d?l?u?l?u?u?l +?u?u?u?u?l?d?l?u +?l?d?l?u?l?u?l?l +?u?l?u?d?l?l?l?u +?u?l?u?d?l?l?u?u +?u?u?u?l?d?u?u?l +?u?u?l?d?u?l?u?u +?l?d?u?l?u?u?u?l +?d?l?u?u?l?u?l?u +?u?u?d?u?u?u?u?l +?u?u?l?l?u?u?l?d?d +?d?u?l?l?u?u?u?l +?l?u?u?l?l?d?u?u +?d?l?u?u?l?l?u?u +?l?d?u?u?u?l?u?u +?l?d?u?u?u?l?u?l +?l?l?l?u?u?l?u?d +?u?u?l?u?d?l?l?l +?l?l?l?l?l?l?d?u?d +?l?u?l?u?u?l?l?d +?l?u?d?u?u?u?l?l +?l?u?d?l?u?u?u?u +?l?l?u?l?u?l?d?l +?u?u?l?l?d?u?u?l +?l?l?u?l?d?l?u?u +?d?d?l?l?u?u?u?u?u +?l?u?u?u?l?l?u?d +?l?l?d?u?u?u?l?u +?u?l?u?u?u?u?l?d +?l?l?u?l?d?u?l?l +?d?l?l?u?l?u?u?u +?d?l?l?u?l?u?u?l +?u?u?d?u?l?u?u?u +?u?l?u?l?d?u?u?l +?u?l?l?u?d?u?u?l +?l?u?l?l?u?u?d?u +?l?u?l?l?u?u?d?l +?l?l?u?d?u?l?u?l +?l?u?u?d?l?l?u?l +?l?u?u?d?l?l?u?u +?u?d?u?u?l?u?l?u +?l?u?u?u?u?d?l?u +?u?d?l?l?u?u?l?u +?l?u?u?d?u?l?u?l +?l?d?u?u?u?l?l?u +?l?l?d?u?l?l?u?u +?l?l?d?u?l?l?u?l +?l?u?l?d?l?u?l?u +?u?u?u?l?u?d?u?l +?l?u?u?u?d?u?l?l +?u?u?l?l?d?l?u?u +?d?l?u?l?u?l?u?u +?l?d?u?l?u?l?l?l +?u?d?u?l?u?l?u?u +?l?u?u?l?u?l?d?l +?u?l?l?u?d?u?l?u +?l?l?u?u?u?d?u?l +?u?l?d?l?u?u?u?l +?u?l?u?l?l?d?u?l +?l?l?u?u?l?l?u?d +?u?u?l?l?l?d?l?u +?u?d?u?u?u?u?l?u +?l?u?l?u?u?l?d?u +?u?u?l?u?u?u?d?u +?l?u?l?u?u?d?l?l +?u?u?d?l?u?u?u?l +?l?u?u?l?u?l?d?u +?l?u?l?d?u?u?l?l +?u?d?l?u?l?l?u?u +?u?d?l?l?u?u?u?l +?u?l?l?d?l?u?l?u +?u?d?l?u?u?u?l?l +?u?u?l?l?d?u?l?l +?l?u?u?d?u?l?l?l +?l?u?u?l?l?l?u?d +?u?u?l?u?l?u?u?d +?d?l?l?l?u?l?u?u +?l?l?u?u?l?u?u?d +?l?u?l?u?l?l?u?d +?u?u?l?d?l?l?u?l +?u?l?d?l?l?u?u?l +?u?u?u?l?l?d?l?u +?l?l?u?u?d?u?u?u +?l?l?u?u?d?u?u?l +?l?u?u?l?u?l?l?d +?d?u?u?u?l?u?l?u +?d?u?u?u?u?l?u?l +?l?u?u?l?u?u?d?u +?l?d?u?l?l?l?l?u +?d?u?l?u?l?l?u?u +?u?d?l?u?u?l?u?l +?d?l?l?l?u?l?u?l +?u?l?u?l?u?u?d?u +?u?d?l?u?l?u?l?l +?u?u?u?u?l?u?d?u +?u?l?u?u?l?l?d?l +?l?d?u?l?l?u?u?l +?u?l?d?u?u?l?u?l +?u?u?u?l?u?l?d?l +?l?d?l?u?u?l?u?l +?l?u?u?u?l?u?l?d +?u?u?l?u?u?l?d?l +?l?u?l?l?l?u?l?d?d +?u?l?u?u?d?u?l?l +?u?u?l?d?l?u?l?l +?d?u?u?u?l?u?u?l +?d?u?u?u?l?u?u?u +?u?u?l?d?u?u?u?u +?u?u?l?d?l?l?u?u +?l?l?u?l?u?d?l?u +?u?u?l?u?l?u?d?l +?l?u?u?l?l?u?d?l +?l?u?l?l?d?u?u?u +?u?u?u?l?d?l?u?u +?u?l?l?u?l?u?d?u +?u?l?l?l?u?u?d?l +?u?u?u?d?l?u?l?l +?l?u?u?l?u?u?d?l +?l?l?u?d?l?u?l?l +?u?l?d?l?u?l?u?u +?l?l?u?l?u?d?l?l +?l?l?u?u?u?l?d?l +?d?u?l?u?u?u?l?u +?u?d?u?u?l?l?l?u +?d?u?u?l?l?l?u?l +?u?d?d?u?l?l?l?l?l +?l?d?l?u?l?l?u?u +?l?u?u?u?u?l?l?d +?l?d?l?u?u?u?l?u +?l?l?d?u?u?l?l?u +?l?l?u?l?l?d?u?l +?l?l?u?u?l?u?d?l +?d?l?l?l?u?u?l?u +?d?u?l?u?l?u?u?l +?l?l?d?l?u?l?u?l +?u?d?u?l?l?u?u?l +?u?u?l?u?u?u?l?d +?d?d?l?l?l?l?l?u?u +?u?d?l?d?l?l?l?l?l +?l?l?l?d?u?u?l?u +?u?u?l?u?d?l?u?u +?u?l?u?u?u?l?d?u +?u?u?u?u?l?d?u?l +?u?u?u?u?l?d?u?u +?l?d?l?u?l?u?u?l +?l?d?u?l?l?l?u?u +?u?l?u?u?d?l?u?l +?u?u?l?d?u?l?l?u +?u?u?l?u?d?l?u?l +?u?l?u?u?l?l?d?u +?d?l?u?u?l?u?u?u +?d?l?u?u?u?l?l?u +?u?u?u?l?u?l?l?d +?u?u?u?d?u?u?d?u?u +?d?u?u?l?l?l?l?u +?d?l?u?u?l?l?u?l +?l?l?u?u?l?d?l?l +?u?l?d?l?d?l?l?l?l +?u?d?u?l?l?u?l?u +?d?u?l?l?u?l?u?l +?l?u?u?d?l?u?u?u +?u?d?u?l?u?u?l?l +?u?u?d?l?l?l?l?l?l +?d?u?l?u?u?l?l?l +?l?l?d?l?u?l?l?u +?l?u?d?l?u?u?l?u +?l?d?l?u?u?l?l?u +?l?u?l?d?u?u?l?u +?l?u?l?d?u?u?u?u +?u?l?l?l?u?d?u?u +?d?u?u?l?u?u?u?u +?l?u?u?l?d?u?l?l +?u?d?u?u?u?l?l?u +?l?u?l?u?u?d?u?u +?u?u?u?l?u?d?l?u +?u?u?d?l?l?u?u?l +?l?l?l?u?l?u?l?d +?u?l?u?u?l?d?l?l +?u?l?u?u?l?d?l?u +?u?u?l?u?u?l?d?u +?u?u?u?l?u?d?l?l +?l?u?l?l?u?d?u?u +?u?u?d?l?l?l?u?l +?l?d?l?u?u?l?u?u +?l?u?u?u?d?l?u?l +?u?l?u?u?d?u?l?u +?u?l?u?d?l?u?l?l +?u?l?u?u?l?u?d?l +?u?u?l?u?u?u?u?d +?u?l?l?u?u?l?u?d +?d?u?u?l?l?u?u?l +?d?u?u?l?l?u?u?u +?u?l?u?u?d?u?u?u +?u?u?d?u?u?u?l?u +?d?l?u?l?u?l?l?u +?l?u?l?d?u?l?u?l +?l?l?l?u?l?d?u?u +?l?l?l?l?u?l?d?u +?u?u?l?u?u?d?l?u +?u?u?l?u?u?d?l?l +?l?u?l?u?l?l?d?l +?u?l?u?l?l?d?l?u +?u?u?u?d?l?u?u?l +?l?d?u?u?u?u?l?u +?l?l?l?u?d?u?l?u +?l?d?u?l?u?u?l?l +?l?l?u?d?l?u?l?u +?l?l?d?u?l?u?u?u +?l?u?l?l?u?u?u?d +?l?u?u?l?l?u?u?d +?d?u?l?u?l?l?u?l +?u?u?l?u?u?d?u?l +?l?u?l?l?l?d?u?l +?l?u?l?l?l?d?u?u +?u?u?d?l?u?u?l?l +?u?u?d?l?u?u?l?u +?u?u?d?u?l?l?u?l +?d?u?u?u?u?u?l?u +?d?l?u?l?u?u?u?l +?u?u?l?u?u?l?u?d +?l?d?l?l?u?u?l?l +?u?l?l?l?d?l?l?d?l +?u?u?u?d?l?u?l?u +?u?u?l?d?l?u?l?u +?u?l?u?d?l?u?u?u +?d?l?u?l?l?u?l?u +?l?u?d?u?l?l?l?u +?u?u?u?u?u?d?d?l?l +?l?u?l?d?l?u?u?l +?u?l?l?d?u?u?l?u +?l?l?u?u?d?u?l?u +?l?d?u?u?l?u?l?l +?l?d?u?u?l?u?l?u +?l?l?l?l?l?d?s?s?s +?l?l?l?s?d?d?s?l?l +?u?s?u?s?s?d?d?d?d +?l?l?s?d?d?s?d?d?s +?u?s?u?s?d?d?s?d?d +?l?l?d?s?d?s?d?s?d +?l?l?s?d?s?d?s?d?d +?l?s?l?l?l?s?l?l?l +?l?l?s?l?l?l?l?l?d?d +?l?d?l?d?l?d?l?l?d?l +?l?l?l?l?s?l?l?l?s +?l?l?s?d?d?d?d?d?d?s +?d?d?d?d?d?d?s?l?s?l +?s?d?d?d?d?d?d?s?l?l +?l?l?l?s?d?s?l?l?l +?l?s?l?l?l?s?d?s +?s?u?l?l?l?d?s?s +?l?l?s?s?d?l?s?l +?u?u?s?u?u?s?d?s +?l?l?s?d?s?s?l?l +?u?s?l?l?s?l?s?d +?s?u?u?s?s?l?l?d +?l?l?l?s?s?d?u?s +?s?l?l?l?l?d?s?s +?u?l?l?l?s?s?d?s +?s?l?s?d?l?l?l?s +?u?d?l?l?s?l?s?s +?l?l?s?d?s?l?s?l +?s?l?l?d?s?l?l?s +?l?d?s?l?s?l?s?l +?l?s?l?l?l?d?s?s +?s?l?l?s?s?l?l?d +?l?l?s?d?l?s?l?s +?l?s?d?l?s?l?s?l +?u?l?l?l?s?d?s?s +?s?l?l?s?l?s?l?d +?l?s?l?d?l?s?s?l +?s?s?l?l?l?l?d?s +?l?s?l?d?s?l?s?l +?l?s?l?s?d?l?s?l +?l?s?d?l?l?l?s?s +?l?s?l?s?l?s?l?s?d +?d?s?l?l?l?l?s?s +?d?s?s?s?u?u?u?u +?l?l?s?l?s?l?s?d +?l?s?l?s?l?d?l?s +?l?s?l?d?l?l?s?s +?s?l?l?s?d?l?l?s +?u?u?s?u?u?s?s?d +?l?s?l?l?s?d?l?s +?d?u?s?u?s?u?s?u +?l?l?l?s?s?l?s?d +?l?d?l?s?l?s?s?l +?u?d?s?s?l?l?l?s +?u?l?u?l?s?s?s?d +?l?l?s?s?l?l?s?d +?u?s?l?l?d?l?s?s +?l?s?s?l?d?l?l?s +?s?l?l?l?d?l?s?s +?d?d?d?s?d?d?d?s?d?d?d?d +?l?l?l?l?s?l?d?l?l +?u?u?s?u?u?u?u?u?d +?d?d?d?l?l?l?s?d?d?d +?l?l?l?d?s?d?d?d?d?d +?d?d?d?d?d?d?l?s?l?l +?d?d?s?l?l?l?l?s?d +?d?s?l?l?l?l?s?d?d +?s?l?l?d?d?d?l?l?s +?l?l?l?l?d?d?s?s?d +?u?l?l?l?s?d?s?d?d +?l?s?d?d?d?s?l?l?l +?l?l?d?d?d?l?l?s?s +?l?l?l?s?l?l?l?l?s +?l?d?l?l?d?l?d?l?d?l +?l?d?l?l?l?l?d?l?d?d +?d?u?l?l?l?l?u?l?l +?l?l?s?l?l?l?l?d?d?d +?s?l?l?l?l?d?d?d?d?d +?l?s?s?s?s?s?s?d +?l?d?s?s?s?s?s?s +?s?l?l?u?u?l?l?s +?u?u?s?u?u?u?s?u +?s?u?u?u?s?u?u?u +?l?l?l?l?u?s?u?s +?l?l?l?u?u?u?s?s +?l?l?s?l?l?l?s?l?l +?u?u?u?s?u?u?s?u +?s?l?l?l?u?l?l?s +?s?u?l?u?l?l?l?s +?u?s?u?u?s?u?u?u +?u?l?l?s?l?s?l?l +?u?l?l?l?s?u?s?u +?l?l?s?l?s?l?l?u +?s?u?s?u?l?l?l?l +?u?s?s?u?l?l?l?l +?d?d?d?d?d?d?l?d?d?d?l +?l?l?d?l?l?d?l?d?d?d +?l?s?l?l?l?l?s?l?l +?u?l?l?d?d?s?l?l?l +?d?l?l?l?l?l?l?s?d +?l?d?l?l?l?l?d?l?s +?l?l?l?l?d?l?l?s?d +?u?u?u?l?l?l?d?d?s +?d?d?l?l?s?l?l?l?l +?l?l?u?l?l?s?s?s +?u?s?s?s?l?l?l?l +?l?l?s?s?l?l?l?s +?l?s?s?l?s?l?l?l +?l?s?l?l?s?l?l?s +?s?l?s?l?s?l?l?l +?l?l?s?s?l?s?l?l +?s?l?l?l?l?l?l?d?d?d +?d?d?d?s?d?d?d?d?u?d +?s?d?d?d?d?d?u?d?d?d +?d?d?l?s?d?d?d?d?d?d +?d?d?d?l?d?d?d?d?d?s +?d?s?l?d?d?d?d?d?d?d +?d?d?d?d?l?d?d?s?d?d +?d?d?d?d?d?d?d?s?l?d +?d?s?d?d?l?d?d?d?d?d +?d?d?l?d?d?d?s?d?d?d +?d?d?u?d?d?d?d?d?d?s +?d?l?s?d?d?d?d?d?d?d +?d?d?d?l?d?d?s?d?d?d +?d?d?d?l?d?d?d?d?s?d +?d?d?d?d?d?s?d?d?d?u +?d?d?l?d?d?d?d?d?d?s +?d?d?d?d?d?d?l?d?s?d +?d?d?d?s?l?d?d?d?d?d +?d?d?d?d?u?d?d?d?d?s +?d?d?d?d?d?l?d?d?s?d +?d?d?d?d?l?d?d?d?s?d +?d?s?d?d?d?d?d?d?d?l +?l?l?d?l?d?l?l?d?l?d +?s?d?d?s?l?l?l?l?l +?u?l?l?l?l?s?d?d?s +?d?d?d?d?u?d?d?d?d?d?d +?d?d?d?d?d?d?u?d?d?d?d +?d?d?d?d?s?d?d?d?d?d?d?d +?l?l?l?d?u?l?l?l?l +?u?l?d?u?l?l?l?l?l +?l?l?l?l?l?d?u?l?l +?d?l?l?l?l?l?l?l?u +?u?u?l?l?l?l?l?d?d?d +?u?l?l?l?l?u?l?l?l?l +?d?d?u?d?u?d?d?u?d?d +?u?d?d?d?u?u?d?d?d?d +?d?u?d?d?d?d?u?u?d?d +?d?l?d?l?d?d?d?d?d?l +?u?d?d?d?d?d?u?d?u?d +?d?l?l?d?d?d?l?d?d?d +?u?d?d?l?d?l?d?d?d?d +?d?d?l?d?d?l?d?l?d?d +?d?d?d?d?d?l?d?d?l?l +?u?d?d?l?l?d?d?d?d?d +?u?d?d?u?d?d?d?d?u?d +?u?u?d?d?d?d?u?d?d?d +?d?d?l?d?d?d?d?l?l?d +?d?d?d?d?d?d?d?d?u?l?u +?d?d?l?d?l?d?d?d?l?d +?d?d?d?d?u?u?d?d?d?u +?d?d?d?l?l?d?d?d?l?d +?l?d?d?l?d?d?d?d?d?l +?d?d?d?l?d?d?d?l?d?l +?d?d?d?d?d?d?u?d?u?u +?u?d?d?u?d?u?d?d?d?d +?d?d?d?d?u?d?l?d?l?d +?d?d?d?l?d?l?d?l?d?d +?d?d?u?d?d?d?d?u?u?d +?d?d?d?d?d?d?u?l?l?d +?d?d?u?u?d?d?d?d?d?u +?u?d?d?d?d?d?d?d?u?l +?u?d?l?d?u?d?d?d?d?d +?d?l?d?d?d?d?l?d?d?l +?d?d?u?l?l?d?d?d?d?d +?d?u?u?d?u?d?d?d?d?d +?d?d?l?l?d?d?d?l?d?d +?d?d?d?d?d?d?u?u?d?u +?u?u?d?d?u?d?d?d?d?d +?u?d?d?d?u?d?u?d?d?d +?d?l?l?d?d?d?d?d?l?d +?u?u?d?d?d?d?d?d?u?d +?u?d?d?d?u?d?d?u?d?d +?u?d?d?l?d?u?d?d?d?d +?d?d?d?d?u?d?u?d?d?u +?u?l?d?d?d?l?d?d?d?d +?d?l?d?u?d?d?d?u?d?d +?d?d?d?d?l?d?l?l?d?d +?d?d?d?d?d?d?d?l?l?l?d +?d?d?l?d?d?l?l?d?d?d +?u?l?d?d?l?d?d?d?d?d +?u?u?d?d?d?l?d?d?d?d +?d?d?d?u?u?d?u?d?d?d +?l?d?u?l?d?d?d?d?d?d +?u?d?d?d?l?d?d?d?d?u +?l?d?d?d?d?d?d?d?u?u +?d?d?l?d?l?d?d?l?d?d +?d?d?d?d?d?l?d?l?d?l +?d?d?l?d?d?d?l?d?d?l +?u?d?l?d?d?l?d?d?d?d +?d?l?d?l?d?d?d?d?l?d +?s?s?s?s?s?l?l?d +?s?s?s?s?s?d?l?l +?l?l?l?u?l?s?l?l +?u?u?l?l?u?l?l?s +?u?l?u?l?l?l?u?s +?u?l?u?s?u?l?l?u +?u?u?u?u?u?u?s?l +?l?s?l?l?d?l?l?l?l +?l?u?s?u?u?u?u?u +?l?l?u?l?l?l?u?s +?u?l?u?l?s?u?l?l +?u?l?u?l?u?s?u?l +?s?l?l?l?l?u?u?u +?l?l?u?u?u?s?l?l +?u?u?s?u?u?l?l?l +?l?l?u?u?l?l?l?s +?l?s?u?u?l?l?l?l +?u?l?l?s?u?l?l?u +?l?l?l?s?u?u?l?l +?l?l?l?l?l?l?l?s?u +?s?l?l?l?l?l?u?l +?l?l?l?s?u?l?l?u +?l?l?l?u?u?l?l?s +?u?l?l?l?l?u?s?l +?u?l?s?u?u?u?u?u +?l?l?l?u?s?u?l?l +?l?u?u?u?s?l?u?u +?u?l?s?u?l?u?l?u +?l?l?l?u?l?u?l?s +?u?u?l?l?l?s?l?l +?l?l?u?u?l?l?u?s +?l?l?s?l?l?l?u?l +?l?l?l?l?l?u?l?s +?l?u?l?l?l?l?s?l +?u?l?u?l?u?u?l?s +?s?l?u?l?u?l?u?l +?u?l?u?u?l?u?l?s +?l?u?s?l?u?u?u?u +?l?s?l?l?l?u?l?l +?u?l?s?l?l?l?l?l?l +?l?l?l?s?l?d?d?d?d?d +?d?d?d?d?d?d?d?d?s?d?d?d +?l?l?u?u?u?l?l?d?d +?u?d?u?u?u?u?u?d?u +?u?u?l?l?u?u?u?d?d +?u?u?d?u?u?u?u?d?u +?u?u?u?l?u?u?u?d?d +?u?u?u?u?u?u?s?u?u +?d?d?d?s?s?s?d?d?d?d +?d?d?s?d?d?d?s?d?d?s +?d?d?d?s?d?d?s?d?d?s +?l?l?l?l?l?l?d?d?d?d?s +?l?l?l?l?l?s?s?s?l +?s?s?s?l?l?l?l?s +?s?l?s?l?l?s?l?s +?s?s?s?s?u?u?u?u +?l?l?s?l?l?s?d?d?d?d +?l?l?u?l?l?l?l?l?l +?l?l?l?l?d?u?l?l?l +?d?l?l?l?l?u?l?l?l +?u?l?l?d?d?d?d?l?l?l +?u?l?l?l?l?l?s?s?s +?l?s?s?l?l?l?l?l?l +?d?d?s?d?d?s?d?d?d?d?l +?l?d?l?d?l?d?d?d?l?d +?u?u?u?d?d?d?d?u?d?d +?l?l?l?l?d?d?d?l?d?d +?d?d?l?d?d?l?d?l?d?l +?l?d?d?l?d?d?d?l?d?l +?l?d?d?l?l?d?d?d?d?l +?l?l?d?d?d?d?l?l?l?d +?l?d?d?d?d?l?d?d?l?l +?d?d?l?d?l?d?l?d?d?l +?u?d?u?d?u?d?u?d?d?d +?d?l?l?d?d?d?d?l?d?l +?u?l?l?d?l?d?d?d?d?d +?d?l?d?d?l?l?l?d?d?d +?d?d?d?d?l?l?l?d?l?d +?u?d?d?d?d?d?d?u?u?u +?d?d?l?d?l?d?l?l?d?d +?d?l?l?l?d?d?d?l?d?d +?u?u?d?d?d?l?l?d?d?d +?d?d?d?l?d?d?l?l?l?d +?l?d?d?d?l?d?l?d?l?d +?d?l?d?l?d?d?l?d?d?l +?l?d?d?l?d?l?l?d?d?l +?u?u?d?d?u?d?d?u?d?d +?l?l?l?l?l?s?l?d?l +?l?l?l?s?l?l?l?d?l +?l?l?l?l?s?l?l?d?l +?u?u?u?u?u?d?u?u?u?u +?l?l?l?d?d?d?l?l?l?d?d?d +?l?d?l?l?l?l?d?l?l?l +?u?u?d?d?d?d?d?d?s?s +?d?d?d?s?s?s?s?s?s +?s?u?u?u?u?u?s?d?d +?l?l?l?l?l?d?s?s?d +?d?l?l?l?d?d?d?d?d?d?d +?u?l?d?d?d?d?d?d?d?d?d?d +?u?l?s?u?l?l?l?d?d +?s?d?d?u?u?u?u?u?u +?l?l?d?l?l?l?d?l?s +?l?l?l?l?l?d?s?d?l +?l?l?d?l?l?l?l?s?d +?l?s?d?l?l?l?l?l?d +?l?s?l?l?l?l?l?d?d?d +?l?l?l?l?l?d?d?s?u +?u?l?l?l?l?u?l?l?l?d +?l?l?l?d?d?d?d?d?d?d?l +?d?d?s?d?d?l?l?l?l?l +?s?l?d?d?d?d?d?s?s +?d?d?s?d?s?s?d?l?d +?s?s?s?d?d?d?d?l?d +?u?s?s?s?d?d?d?d?d +?d?d?d?d?d?s?s?l?s +?s?s?l?d?d?d?d?d?s +?s?s?s?d?d?d?d?d?l +?u?s?d?d?s?d?s?d?d +?l?d?d?s?d?s?d?s?d +?d?d?d?s?d?s?s?d?u +?l?d?d?s?d?d?d?s?s +?l?d?s?s?s?d?d?d?d +?d?l?d?s?d?d?d?s?s +?l?s?d?d?s?d?s?d?d +?u?d?d?d?d?d?s?s?s +?l?d?s?d?d?s?d?d?s +?s?d?d?d?s?l?d?d?s +?s?l?d?s?d?d?s?d?d +?d?d?d?d?s?d?s?l?s +?l?d?d?s?d?s?d?d?s +?d?l?s?d?d?s?d?d?s +?u?l?l?d?d?d?d?u?l?l +?u?l?l?l?u?u?d?d?d?d +?d?d?d?d?d?d?d?d?d?d?s?l +?d?d?s?d?d?s?d?d?d?l +?s?l?s?d?d?d?d?d?d?d +?d?d?d?d?d?d?d?s?u?s +?s?s?d?d?d?d?d?d?d?l +?s?s?l?d?d?d?d?d?d?d +?u?l?l?l?l?u?l?l?s +?l?d?l?l?l?s?l?l?l +?l?s?l?l?l?l?d?l?l +?u?l?l?l?l?l?u?u?u +?l?s?d?d?l?l?s?d?d +?l?l?l?d?d?s?d?s?d +?l?l?l?d?d?d?s?d?s +?d?s?d?d?d?s?l?l?l +?l?l?d?d?d?d?s?l?s +?s?s?u?u?u?d?d?d?d +?d?s?l?l?l?d?s?d?d +?u?l?l?d?d?s?d?d?s +?l?s?l?l?d?d?s?d?d +?d?d?s?s?l?l?l?d?d +?d?d?d?d?u?u?u?s?s +?s?d?d?d?d?u?u?u?s +?l?s?l?d?l?s?d?d?d +?s?l?u?l?s?d?d?d?d +?l?l?s?d?d?d?d?s?l +?d?d?d?d?s?s?u?u?u +?l?d?l?d?l?s?d?d?s +?l?d?d?l?l?d?d?s?s +?l?d?l?d?l?s?s?d?d +?d?l?d?l?d?d?l?s?s +?l?d?d?l?d?d?l?s?s +?d?d?d?l?l?l?s?s?d +?l?d?d?d?d?l?l?s?s +?l?l?l?d?s?s?d?d?d +?d?d?l?s?l?l?s?d?d +?d?d?d?d?l?l?s?s?l +?u?s?l?s?l?d?d?d?d +?s?s?d?d?l?l?l?d?d +?u?l?u?d?d?d?d?s?s +?s?d?d?u?u?u?d?d?s +?l?l?l?d?s?d?d?s?d +?d?d?d?d?u?s?u?s?u +?u?u?u?s?d?s?d?d?d +?d?l?s?d?l?s?d?l?d +?u?u?l?d?d?d?d?s?s +?d?s?d?s?d?d?u?u?u +?u?l?u?s?d?d?d?d?s +?l?s?d?d?d?l?l?s?d +?l?l?l?d?d?d?d?s?s?s +?s?d?d?u?u?u?s?d?d +?l?l?l?s?d?d?d?s?d +?l?l?s?d?d?s?l?d?d +?d?d?d?d?l?s?l?l?s +?s?s?l?l?d?l?d?d?d +?u?s?d?d?d?d?s?u?u +?s?l?u?l?d?d?d?d?s +?d?d?d?s?s?d?l?l?l +?d?d?s?u?l?u?s?d?d +?d?d?l?s?s?l?l?d?d +?d?d?d?d?s?s?u?l?u +?l?d?l?l?l?l?l?l?l?d +?d?d?d?d?d?d?d?d?d?d?d?u +?l?d?l?d?l?l?d?l?l?d +?d?d?d?l?d?d?d?l?d?d?d +?d?d?d?d?l?d?d?d?d?d?l +?d?l?l?d?d?d?d?d?d?d?d +?l?d?d?d?l?d?d?d?d?d?d +?l?l?l?d?d?d?d?d?s?d +?d?d?d?s?l?l?l?d?d?d +?u?u?l?l?l?u?l?l?l +?s?u?u?u?u?u?u?u?u +?l?l?l?l?l?s?s?d?d?d +?l?l?l?l?l?l?s?s?d?d +?s?l?l?l?l?l?l?d?d?s +?d?d?d?d?d?d?l?l?l?l?l?l +?s?l?d?l?d?l?l?d?l +?l?d?l?l?d?l?l?d?s +?d?d?d?u?u?u?s?u?u +?d?s?l?l?l?l?l?d?d +?u?l?s?l?l?d?l?d?d +?u?u?u?s?u?u?d?d?d +?u?u?l?l?l?d?d?d?s +?l?d?l?l?d?d?l?l?s +?l?l?l?d?d?s?d?l?l +?l?l?l?l?s?d?d?l?d +?l?u?l?u?l?s?d?d?d +?l?d?l?d?l?d?s?l?l +?l?d?l?l?l?s?l?d?d +?l?l?d?s?l?l?l?d?d +?l?l?l?s?l?d?d?d?l +?u?l?u?l?u?d?d?d?s +?l?l?l?l?d?d?d?s?u +?l?d?l?d?s?d?l?l?l +?d?l?l?l?l?l?d?s?d +?l?u?u?u?u?d?d?d?s +?l?l?l?l?d?l?d?d?s +?l?d?d?d?l?l?l?s?l +?l?s?l?d?l?l?l?d?d +?u?u?u?s?u?u?u?u?d +?l?s?l?s?l?s?s?s +?u?l?l?l?l?l?l?d?d?s +?l?d?d?d?d?d?d?d?d?d?d?d?d +?s?s?l?l?l?l?l?l?d +?l?l?d?d?l?d?l?l?d?d +?d?d?d?u?l?l?l?l?d?d +?l?d?l?d?l?d?d?l?d?l +?l?l?l?d?d?d?d?l?d?l +?l?l?d?d?d?l?l?d?d?l +?d?d?l?l?l?l?d?d?d?l +?d?d?l?l?l?d?d?d?l?l +?d?l?d?l?d?l?d?l?l?d +?l?l?l?l?s?l?l?l?l?d +?l?l?l?l?l?l?d?l?u +?d?u?l?l?u?l?l?l?l +?u?u?l?l?l?u?l?l?d +?l?s?l?s?l?l?d?d?d +?u?u?u?u?u?s?d?d?s +?l?l?s?s?l?l?d?d?d +?d?d?d?d?l?l?l?l?s?s +?s?l?d?l?d?l?d?l?s +?l?s?l?s?l?l?l?d?d +?l?d?l?l?d?l?l?l?d?d +?l?d?l?l?l?d?l?l?d?d +?l?l?l?d?d?d?d?d?d?l?l +?u?s?u?u?u?u?u?u?u +?s?s?s?l?l?l?l?l?l +?l?l?u?l?l?u?l?d?d +?d?d?u?u?u?u?l?l?l +?d?d?u?l?u?l?l?l?l +?u?d?u?u?d?u?u?u?u +?u?u?d?u?d?u?u?u?u +?u?l?l?u?u?u?u?d?d +?u?u?d?d?u?l?l?l?l +?u?u?u?l?l?u?u?d?d +?l?d?l?l?d?l?l?d?l?l +?u?l?l?l?l?l?d?u?d +?u?l?d?d?u?l?l?l?l +?s?d?d?d?d?l?l?l?l?l +?l?s?s?s?s?s?s?s +?u?l?u?l?u?l?u?l?d?d +?d?s?s?d?s?s?s?u +?d?d?l?s?s?s?s?s +?s?s?s?s?s?l?d?d +?d?d?s?s?s?s?s?l +?l?d?d?s?s?s?s?s +?s?l?s?d?d?s?s?s +?s?s?d?s?u?d?s?s +?s?s?d?s?l?s?d?s +?s?s?s?d?u?d?s?s +?l?s?s?s?s?d?d?s +?l?s?d?s?d?s?s?s +?d?d?s?s?s?l?s?s +?s?s?s?l?s?s?d?d +?d?s?s?d?l?s?s?s +?s?d?d?s?s?l?s?s +?l?d?s?s?s?s?s?d +?s?s?u?s?d?d?s?s +?s?l?l?l?l?u?d?l +?l?l?l?u?l?s?l?d +?u?u?u?l?s?l?l?d +?u?u?d?l?u?s?u?u +?l?u?l?l?l?d?l?s +?u?l?l?u?s?d?l?u +?u?u?u?s?d?u?l?l +?l?d?l?l?l?u?s?u +?u?d?l?l?l?s?l?u +?u?l?l?l?s?d?l?u +?l?l?d?l?l?s?l?u +?d?u?u?l?u?s?u?u +?d?u?u?l?u?s?u?l +?l?l?l?d?l?l?d?l?s +?u?l?d?u?l?u?s?u +?u?u?d?u?s?u?l?l +?l?l?d?l?l?u?s?l +?u?l?u?d?l?l?l?s +?l?l?u?s?l?d?l?l +?l?u?u?d?s?l?u?u +?l?u?u?l?u?u?d?s +?l?u?l?d?l?s?l?l +?l?u?l?d?l?s?l?u +?u?u?l?d?l?l?l?s +?l?u?l?u?u?u?d?s +?u?l?u?u?l?l?s?d +?l?d?l?l?s?u?l?l +?u?u?u?l?u?u?s?d +?l?l?l?s?u?l?d?l +?l?l?d?l?u?s?u?u +?u?u?l?d?u?u?s?u +?s?u?l?l?l?l?u?d +?l?l?s?u?u?u?u?d +?l?l?l?u?u?l?s?d +?u?u?s?d?u?l?l?l +?s?d?l?l?u?u?l?l +?u?l?l?l?u?s?d?l +?d?l?u?s?u?l?u?l +?l?s?d?l?l?l?u?l +?l?u?u?d?u?s?u?l +?l?u?u?d?u?s?u?u +?u?l?u?l?s?l?d?u +?d?u?l?u?l?u?s?l +?u?l?l?l?s?d?u?u +?u?l?l?l?s?d?u?l +?d?l?s?l?l?l?u?l +?u?l?u?l?d?l?s?l +?u?u?u?s?l?d?u?u +?l?s?l?l?u?d?u?l +?l?u?u?s?l?u?d?u +?l?u?d?l?u?u?u?s +?l?l?l?l?s?u?l?d +?l?l?l?u?s?l?l?d +?u?l?s?l?l?d?u?u +?l?l?d?l?l?s?u?l +?l?u?s?l?l?d?l?u +?s?u?l?l?d?l?u?u +?l?s?l?l?d?u?u?u +?l?d?u?s?u?u?u?u +?u?d?u?u?u?s?l?l +?u?l?u?u?l?u?s?d +?s?l?u?u?l?d?u?l +?l?u?l?s?l?l?l?d +?s?d?l?u?u?u?u?u +?d?u?s?u?u?u?u?u +?s?d?u?l?u?u?l?l +?l?s?u?u?d?l?l?l +?l?l?s?u?l?l?d?u +?u?l?l?s?l?d?u?u +?l?s?u?l?u?d?u?u +?l?l?u?l?d?u?l?s +?s?l?d?l?l?l?u?u +?l?l?l?u?s?d?u?l +?l?d?l?l?u?s?l?u +?u?s?d?l?l?l?l?u +?u?l?l?s?l?u?u?d +?d?l?u?l?l?s?l?l +?l?l?s?d?l?u?u?u +?u?l?s?l?u?l?d?l +?l?s?l?u?l?u?u?d +?u?l?u?s?d?u?u?u +?l?l?l?l?s?u?u?d +?d?l?s?l?u?l?l?l +?u?l?l?d?l?l?u?s +?s?d?u?l?l?l?u?l +?l?l?l?d?u?s?l?l +?u?s?l?l?l?u?d?l +?u?l?u?d?s?u?l?u +?l?l?s?l?d?l?l?u +?u?s?l?d?u?l?l?u +?l?l?l?l?u?d?u?s +?l?l?d?l?u?u?s?u +?d?l?u?u?u?u?u?s +?u?d?l?l?u?u?l?s +?l?u?u?d?l?s?l?l +?s?l?u?u?l?u?u?d +?u?d?s?u?l?l?l?l +?u?l?u?l?l?d?u?s +?u?l?d?l?u?l?u?s +?d?l?l?l?l?l?l?s?s +?l?l?l?d?l?l?u?s +?l?u?l?u?u?l?d?s +?u?s?u?u?d?u?u?l +?l?s?l?u?u?d?u?u +?d?l?l?u?l?l?s?l +?d?u?u?u?l?l?s?l +?u?l?l?u?d?s?u?l +?u?u?s?u?d?u?u?u +?u?s?l?d?u?u?u?l +?l?l?l?u?l?l?s?d +?s?l?l?d?u?u?u?u +?s?d?l?l?l?u?u?u +?l?l?u?u?s?l?d?l +?u?u?l?u?u?l?s?d +?u?u?d?s?u?l?l?l +?u?u?l?s?l?u?d?u +?u?l?s?u?d?l?u?u +?l?u?l?l?s?l?l?d +?u?u?l?s?d?u?l?u +?l?u?l?l?u?l?d?s +?l?u?u?u?u?u?s?d?d +?u?l?u?l?d?s?u?l +?u?l?l?s?l?u?d?l +?u?u?l?l?s?u?u?d +?u?l?u?l?s?d?u?u +?s?d?l?l?l?l?u?l +?l?l?u?u?d?u?s?l +?l?l?l?d?u?u?s?l +?l?s?u?u?l?d?u?u +?u?l?s?u?l?l?d?l +?l?l?l?s?u?l?u?d +?s?u?u?l?d?l?l?u +?s?u?u?l?d?l?l?l +?d?l?u?l?s?l?l?l +?u?l?d?u?l?s?l?l +?d?u?l?l?u?l?s?u +?s?l?u?d?u?l?u?l +?d?u?u?l?l?l?s?l +?l?s?l?u?l?d?u?l +?u?l?s?l?d?l?u?u +?u?l?s?d?l?l?l?u +?u?l?u?u?l?d?l?s +?u?u?u?s?u?l?d?l +?l?d?u?l?l?u?l?s +?u?d?l?s?u?u?u?l +?u?u?s?d?u?u?u?l +?l?l?u?u?l?s?d?u +?d?s?u?l?u?l?l?l +?s?l?l?u?d?l?l?u +?u?l?l?d?u?u?u?s +?d?l?s?u?u?u?u?u +?u?l?l?u?u?u?s?d +?u?l?s?l?l?d?u?l +?l?l?l?l?d?u?l?s +?u?l?s?u?l?d?l?l +?l?u?l?u?u?d?l?s +?l?l?l?l?s?l?d?d?l +?l?u?l?l?u?l?s?d +?l?u?d?s?l?l?l?u +?u?u?l?s?u?u?l?d +?l?u?l?u?u?u?s?d +?l?u?l?d?u?u?l?s +?u?l?d?u?s?l?l?u +?u?l?s?d?l?u?l?l +?u?d?l?l?u?s?u?u +?l?d?l?l?u?l?l?s +?u?l?d?u?s?u?u?u +?d?s?u?u?l?l?u?u +?l?l?d?l?l?l?u?s +?u?l?l?d?u?l?s?l +?u?l?s?u?l?d?l?u +?u?l?d?l?l?l?u?s +?l?l?d?u?l?l?l?s +?d?l?l?s?u?l?l?u +?s?u?u?d?u?u?u?u +?u?s?l?d?u?u?l?l +?l?s?d?l?u?l?l?l +?l?d?u?l?s?l?l?u +?u?l?d?s?u?u?l?l +?u?u?s?l?l?d?l?l +?u?l?l?d?u?s?u?l +?s?u?l?l?l?l?d?u +?u?l?d?l?l?u?u?s +?u?u?u?l?l?d?l?s +?u?l?u?d?s?l?u?l +?s?u?l?u?l?d?u?l +?l?l?s?u?l?l?l?d +?d?u?u?s?l?l?l?u +?u?s?u?l?l?l?d?l +?d?s?l?l?l?u?u?u +?l?l?d?u?u?u?s?u +?l?l?d?u?u?u?s?l +?s?l?l?l?l?u?l?d +?s?u?l?l?u?l?l?d +?d?l?l?s?l?l?u?l +?d?u?l?u?l?l?s?l +?u?d?l?l?u?s?l?u +?u?d?u?u?l?u?s?u +?u?l?s?u?d?l?l?l +?u?d?u?u?u?l?s?u +?u?l?u?u?s?d?u?u +?u?l?d?u?l?s?u?l +?u?u?s?l?l?d?l?u +?u?u?l?l?l?d?l?s +?u?l?l?u?u?l?s?d +?u?d?s?u?u?u?u?u +?l?l?u?l?l?l?d?s +?l?l?u?d?l?l?l?s +?u?d?u?s?l?u?u?u +?l?d?s?l?l?u?l?l +?l?u?u?s?d?u?l?l +?u?d?u?s?u?l?u?l +?l?d?l?s?l?l?u?u +?u?l?u?u?l?l?d?s +?u?u?l?l?l?s?u?d +?d?l?l?l?u?l?l?s +?u?d?l?s?u?l?l?u +?u?s?l?u?d?l?l?l +?u?l?u?d?u?l?u?s +?d?l?u?l?u?l?l?s +?d?u?u?u?u?u?s?u +?l?l?d?l?l?l?s?u +?l?s?l?l?l?l?u?d +?d?u?u?u?l?u?u?s +?s?d?l?l?u?u?u?u +?s?d?l?l?u?u?u?l +?s?l?u?l?l?d?l?l +?u?u?u?u?d?l?l?s +?d?s?l?l?l?l?u?l +?l?s?l?u?d?l?l?l +?d?u?l?u?s?l?u?l +?l?d?l?u?s?l?l?l +?l?l?u?u?d?l?s?u +?u?l?u?d?l?l?s?u +?l?u?l?u?d?u?l?s +?u?d?l?u?u?l?l?s +?l?l?d?l?u?l?s?l +?l?l?l?d?u?u?s?u +?s?l?l?d?l?l?l?u +?d?u?l?u?s?u?u?u +?u?l?u?l?d?l?u?s +?l?d?u?u?u?u?u?s +?l?u?l?u?d?u?u?s +?l?l?d?u?s?l?l?l +?l?l?d?u?s?l?l?u +?d?u?u?l?s?u?l?l +?u?l?l?l?s?u?d?l +?l?d?s?l?l?u?u?u +?l?l?s?d?u?u?l?l +?d?l?l?s?u?u?u?u +?l?l?l?l?d?s?u?u +?u?s?l?l?u?l?d?l +?d?d?l?l?l?l?l?s?l +?s?u?d?u?l?l?u?l +?l?u?l?l?l?d?s?l +?s?u?l?d?l?u?u?u +?l?u?d?l?u?l?l?s +?u?u?s?u?u?d?l?l +?l?l?l?l?s?u?d?l +?u?d?u?u?l?l?l?s +?u?d?l?l?l?u?l?s +?u?u?u?u?s?l?l?d +?l?l?u?l?l?d?l?s +?u?d?l?l?u?l?l?s +?l?l?l?l?s?d?l?u +?l?u?s?l?d?l?l?u +?l?l?l?l?d?l?l?d?s +?s?d?u?l?u?l?l?l +?u?l?d?s?l?l?l?u +?l?l?s?d?l?l?u?u +?l?l?l?u?d?l?l?s +?s?l?l?l?d?u?l?l +?l?s?u?d?u?u?u?u +?l?u?l?d?l?l?l?s +?u?d?l?u?l?s?u?l +?d?l?s?u?l?u?u?u +?u?l?l?l?l?s?d?u +?u?l?l?l?d?s?u?u +?u?l?l?l?s?u?d?u +?l?l?s?d?u?u?l?u +?l?u?u?u?u?l?s?d +?l?u?s?u?d?u?l?l +?u?l?l?u?s?u?l?d +?u?l?d?u?l?u?s?l +?u?s?l?u?l?l?l?d +?l?u?d?u?l?s?u?u +?u?l?u?l?l?s?d?l +?u?u?s?l?l?l?d?u +?l?d?l?u?u?s?l?l +?l?u?d?l?l?s?l?l +?u?l?u?l?l?u?d?s +?l?l?l?s?l?l?d?u +?u?d?u?u?s?u?u?u +?l?l?u?s?d?l?u?u +?u?s?d?l?u?l?l?l +?l?l?s?l?l?d?u?u +?l?u?l?l?d?l?l?s +?u?s?u?u?l?l?d?l +?s?u?u?u?d?u?u?u +?u?l?s?l?u?d?l?u +?l?l?s?l?u?l?d?l +?u?d?u?s?l?l?l?l +?u?l?u?u?l?s?d?u +?s?u?l?l?d?u?u?u +?l?s?u?l?l?l?d?u +?u?l?l?d?u?s?l?l +?l?d?s?u?u?l?u?u +?u?l?u?s?d?u?l?u +?u?u?s?l?u?d?u?l +?l?u?u?u?d?l?s?l +?l?l?d?l?u?u?l?s +?u?l?s?d?l?l?u?u +?d?s?u?l?u?l?u?u +?l?d?l?u?l?l?s?l +?u?s?u?u?u?u?d?u +?d?s?l?l?u?l?u?u +?l?l?l?u?s?l?d?l +?s?l?l?u?u?l?l?d +?u?l?u?s?l?l?d?l +?u?l?d?l?s?l?u?l +?u?l?u?s?l?l?d?u +?d?l?l?u?s?l?u?u +?l?l?l?s?l?u?d?u +?l?s?l?d?u?l?l?l +?u?u?u?s?l?d?l?u +?u?u?u?s?l?d?l?l +?l?l?d?l?u?l?l?s +?l?d?l?l?l?s?u?l +?l?u?u?d?l?l?s?l +?u?l?s?l?l?l?u?d +?l?l?u?l?u?d?s?u +?u?l?d?l?l?s?u?u +?u?d?l?s?l?l?u?l +?u?u?l?l?s?l?l?d +?l?s?u?l?l?d?l?l +?s?l?u?d?l?l?l?l +?u?d?l?l?u?s?l?l +?l?u?l?l?l?d?u?s +?l?d?u?u?s?l?u?l +?l?d?l?l?l?u?l?s +?u?l?d?u?u?s?l?u +?l?l?l?d?l?s?u?l +?l?l?l?d?l?s?u?u +?l?l?l?l?u?d?s?l +?s?u?u?l?l?l?d?u +?u?l?s?u?l?u?l?d +?l?d?l?l?s?l?u?l +?d?l?l?u?l?u?s?l +?l?l?l?l?s?l?l?d?d?d +?d?u?l?u?s?l?l?l +?u?d?u?l?u?u?u?s +?d?s?u?l?l?u?l?l +?l?u?l?d?u?l?l?s +?s?l?u?l?d?u?l?u +?l?u?u?u?u?u?d?d?s +?s?u?l?l?l?d?l?l +?s?l?u?l?l?l?l?d +?l?s?u?u?u?d?u?u +?u?d?l?s?u?u?u?u +?u?l?l?l?u?s?l?d +?u?u?l?l?d?s?l?l +?u?d?l?l?l?l?u?s +?d?u?s?l?l?u?l?u +?s?l?d?l?l?u?l?u +?u?u?l?s?l?d?l?l +?l?s?l?l?u?d?l?l +?d?u?l?u?u?l?s?u +?u?l?u?l?s?l?l?d +?s?l?u?u?u?u?d?l +?u?l?d?l?l?s?u?l +?u?l?l?s?l?l?d?u +?u?s?d?u?u?l?l?l +?u?s?l?d?l?l?u?u +?l?d?u?s?l?l?l?u +?l?l?s?l?l?l?l?s?d +?l?s?d?u?l?u?l?u +?l?l?l?u?u?s?u?d +?u?l?l?l?u?u?d?s +?u?l?u?d?u?s?u?u +?s?l?l?d?l?u?l?u +?d?l?u?l?u?l?s?l +?s?d?u?u?u?u?l?l +?s?l?l?l?d?l?u?u +?u?l?u?u?u?l?d?s +?l?l?l?l?d?l?s?u +?u?u?l?l?u?l?d?s +?l?l?s?l?d?l?u?l +?u?d?u?l?l?l?l?s +?u?u?u?u?l?l?d?s +?u?l?u?l?l?s?l?d +?s?l?d?l?l?l?l?u +?s?u?l?l?l?u?d?l +?u?l?l?d?l?s?u?l +?u?l?u?d?l?s?u?l +?l?l?d?s?l?l?u?l +?u?u?l?l?l?s?l?d +?l?u?l?u?s?l?d?l +?l?l?l?s?l?d?u?l +?s?l?l?l?l?d?u?l +?l?l?u?u?l?l?s?d +?l?u?l?u?l?l?d?s +?d?l?l?l?s?l?u?l +?u?s?l?l?u?d?u?u +?u?u?u?l?l?d?s?l +?s?d?u?u?l?l?u?u +?l?l?d?u?s?l?u?l +?d?l?s?u?u?l?l?l +?l?u?s?l?l?d?l?l +?d?s?u?u?u?l?l?l +?s?l?l?u?l?u?l?d +?u?l?d?l?u?l?l?s +?d?l?l?s?u?u?l?l +?d?s?l?u?u?u?u?u +?u?l?s?l?d?l?l?u +?l?d?l?l?l?s?l?u +?l?s?l?l?l?d?u?l +?u?u?d?l?u?u?l?s +?l?l?d?u?u?l?l?s +?l?u?u?u?s?u?u?d +?s?u?u?u?u?d?l?l +?l?u?l?s?u?u?u?d +?d?l?l?u?u?u?u?s +?l?u?l?u?d?l?u?s +?u?d?u?l?s?l?l?l +?d?u?l?s?l?l?l?l +?l?d?l?l?l?l?u?s +?u?d?l?l?s?u?u?l +?l?l?l?s?l?l?u?d +?s?u?u?u?u?u?u?d?d +?u?l?u?d?u?u?l?s +?l?l?u?l?l?u?s?d +?u?l?d?u?u?u?u?s +?s?u?d?u?u?u?u?u +?s?l?l?l?u?l?d?l +?l?l?l?l?u?l?s?d +?l?l?l?d?s?l?l?u +?l?l?l?l?d?l?u?s +?u?u?s?u?u?l?u?d +?l?l?u?d?s?l?l?l +?d?u?u?u?u?l?s?l +?l?u?l?u?l?u?l?u?l +?d?d?l?l?l?l?s?s?s +?s?s?s?s?d?d?d?d?l +?s?s?l?d?d?d?d?s?s +?u?d?d?d?d?s?s?s?s +?s?s?l?s?s?d?d?d?d +?s?s?s?l?s?d?d?d?d +?u?u?l?d?d?d?l?l?l +?d?u?u?u?u?d?u?u?d +?u?l?d?l?l?l?d?l?d +?u?d?d?l?l?l?d?l?l +?u?u?d?d?d?u?l?l?u +?u?u?d?d?d?u?l?l?l +?u?l?d?l?l?l?d?d?l +?u?l?u?u?u?u?d?d?d +?d?u?u?u?d?d?u?u?u +?u?u?u?l?d?l?d?l?d +?d?d?d?l?u?u?u?u?u +?u?l?l?d?d?d?l?l?u +?l?u?u?l?l?u?d?d?d +?u?d?d?l?l?d?l?l?l +?l?l?u?l?l?u?d?d?d +?u?u?d?u?d?u?u?d?u +?u?u?u?u?d?d?u?d?u +?u?l?d?d?l?l?d?l?l +?u?d?l?l?l?l?d?l?d +?u?l?d?l?l?d?l?d?l +?u?u?u?u?u?d?d?d?l +?u?d?d?u?u?u?u?u?d +?l?l?u?l?l?l?d?d?d?d +?u?d?u?u?d?u?u?u?d +?l?u?u?u?u?l?d?d?d +?u?d?d?l?l?l?l?d?l +?l?l?l?l?d?d?d?l?u +?d?d?d?l?l?u?u?u?u +?d?d?d?u?u?u?u?l?l +?u?u?d?u?d?u?u?u?d +?l?d?d?l?l?l?d?l?u +?d?u?d?d?l?l?l?l?l +?d?l?l?l?l?l?u?d?d +?u?l?d?l?d?l?l?l?d +?u?d?d?u?u?u?d?u?u +?u?u?l?l?u?l?d?d?d +?u?d?u?u?d?u?d?u?u +?u?u?d?l?l?l?l?d?d +?u?l?l?l?d?l?u?d?d +?u?l?d?l?d?l?l?d?l +?u?u?u?u?d?l?l?d?d +?u?d?l?l?l?l?u?d?d +?u?u?l?u?u?l?d?d?d +?u?l?d?l?l?d?d?l?l +?u?u?u?l?u?l?d?d?d +?d?d?s?d?d?d?d?d?d?d?d?d +?d?d?d?d?d?s?d?d?d?d?d?d +?l?l?d?d?d?d?l?d?d?d?d +?d?d?d?d?d?l?l?l?l?d?d +?l?d?l?d?l?l?l?l?l?l +?s?s?d?l?l?l?s?s +?s?l?s?l?l?s?s?d +?l?s?l?s?l?d?s?s +?u?s?u?s?u?s?s?d +?s?d?l?l?l?s?s?s +?d?s?s?l?l?l?s?s +?s?s?u?d?u?u?s?s +?l?d?s?l?s?s?l?s +?u?l?u?u?u?u?u?l +?u?u?u?l?l?l?u?l +?l?l?l?u?u?l?u?l +?u?l?l?u?u?u?l?u +?l?l?l?l?l?l?l?u?l +?l?l?u?u?l?u?u?u +?u?u?l?l?u?l?u?u +?u?u?l?u?u?u?l?u +?u?u?u?u?u?l?u?l +?l?l?u?l?u?l?u?u +?u?u?l?l?l?l?u?l +?u?u?l?u?l?l?l?u +?u?u?u?u?u?u?l?u +?l?u?u?u?l?l?u?u +?l?u?u?u?l?l?u?l +?d?l?l?u?l?l?l?l?l +?l?u?l?l?u?u?l?u +?l?u?l?u?u?u?l?l +?l?u?u?u?u?u?l?u +?l?u?u?l?u?l?u?u +?l?u?l?l?u?u?l?l +?u?l?l?l?l?l?l?s?l +?u?u?l?l?l?u?l?u +?l?l?u?l?u?u?u?l +?l?u?u?u?l?l?l?u +?l?l?l?l?l?l?u?l?d +?u?u?l?u?u?l?l?u +?l?u?l?l?l?u?u?u +?l?u?u?l?l?u?u?u +?u?l?l?u?l?u?u?u +?u?l?u?u?l?u?l?l +?l?l?u?l?l?u?l?u +?d?l?l?l?l?l?d?l?l?l +?s?d?l?l?l?l?l?l?s +?d?s?d?s?d?d?d?d?l?l +?s?d?d?d?d?d?d?l?l?s +?s?l?s?l?d?d?d?d?d?d +?d?d?s?l?l?s?d?d?d?d +?s?s?l?l?d?d?d?d?d?d +?s?l?l?s?d?d?d?d?d?d +?u?s?u?s?d?d?d?d?d?d +?d?d?s?l?l?l?l?l?l?l +?l?l?l?s?d?d?d?s?s +?s?s?s?u?u?u?d?d?d +?s?s?s?d?d?d?u?u?u +?u?u?u?u?l?l?l?d?d?d +?l?l?l?l?l?l?d?s?l +?u?l?l?l?l?l?d?d?d?s +?d?d?d?d?d?d?l?l?l?l?d +?l?d?l?d?l?d?l?l?l?d +?l?l?l?l?d?d?d?d?u?u +?s?l?s?s?l?l?l?l +?l?s?l?s?l?s?l?u +?l?l?l?l?u?s?s?s +?u?s?u?s?u?s?l?l +?u?l?l?l?u?s?s?s +?l?l?l?s?l?s?s?l +?l?l?s?l?s?s?l?l +?u?s?s?s?u?l?l?l +?d?d?d?d?d?d?s?d?d?d?l +?s?d?d?d?d?d?d?d?d?d?l +?u?u?u?u?u?u?u?u?d?d?d +?u?s?l?l?l?l?s?d?d +?u?u?u?u?u?s?s?d?d +?d?d?l?d?d?d?l?l?l?l +?l?d?l?d?l?d?l?d?d?l +?d?d?l?l?d?l?l?l?d?d +?l?d?l?d?d?d?d?l?l?l +?l?d?l?d?d?d?l?d?l?l +?l?d?l?l?d?d?l?l?d?d +?d?d?d?d?u?u?u?u?u?d +?l?l?l?l?u?d?d?d?d?d +?l?l?d?d?l?l?d?l?d?d +?l?d?d?l?d?l?l?d?l?d +?d?d?u?u?u?u?u?d?d?d +?l?s?l?l?l?l?l?l?d?d +?d?d?d?d?d?d?l?d?d?d?d?d +?s?u?s?u?s?u?s?u +?l?s?s?s?l?s?l?l +?u?u?l?l?s?s?s?s +?l?s?s?l?l?l?s?s +?s?d?l?l?l?l?l?l?l?l +?d?s?d?s?d?d?d?d?d?d +?d?d?d?s?d?d?d?d?d?s +?d?s?d?d?s?d?d?d?d?d +?d?d?s?d?d?s?d?d?d?d?d +?d?d?s?d?d?d?d?d?d?s +?d?s?d?d?d?d?d?d?d?s?d +?s?d?d?d?d?d?d?d?s?d +?s?d?d?d?d?d?s?d?d?d +?d?d?d?d?d?d?s?d?s?d +?d?d?d?d?d?s?d?d?s?d +?d?d?d?d?d?d?l?l?l?l?s +?l?l?l?s?s?s?l?l?l +?d?l?s?l?l?l?l?l?l +?l?d?l?s?l?l?l?l?l +?s?l?l?l?l?l?d?d?d?s +?u?u?u?l?l?l?u?u?u +?s?s?s?s?s?s?s?l +?l?l?l?l?l?l?l?l?s?s +?u?l?l?l?l?l?s?l?l +?l?d?l?d?d?d?s?d?d?d +?d?d?d?d?d?d?d?d?l?s?l +?s?u?l?d?d?d?d?d?d?d +?d?d?d?s?d?d?l?l?d?d +?d?d?d?d?l?l?d?d?d?s +?d?d?d?l?l?s?d?d?d?d +?l?d?d?d?s?l?d?d?d?d +?u?l?d?d?d?s?d?d?d?d +?d?d?s?d?d?d?d?d?l?l +?d?d?d?s?d?d?d?d?u?u +?d?d?d?d?d?d?s?l?d?l +?d?d?d?d?d?d?d?u?s?u +?s?d?l?l?d?d?d?d?d?d +?l?u?s?d?d?d?d?d?d?d +?u?u?d?d?d?d?d?s?d?d +?d?u?d?s?d?l?d?d?d?d +?d?d?d?d?d?d?d?s?l?u +?l?d?l?d?d?d?d?d?d?s +?u?s?u?l?l?s?u?l +?l?u?u?u?u?u?s?s +?s?l?l?l?l?l?s?u +?u?l?s?s?u?l?u?l +?u?s?s?u?u?u?u?u +?u?l?l?l?u?u?s?s +?l?l?s?u?s?l?l?l +?l?l?l?u?l?l?s?s +?s?u?l?l?l?u?l?s +?l?l?l?s?l?s?l?u +?u?l?l?l?l?s?s?u +?u?l?s?u?l?l?l?s +?s?l?l?l?l?u?l?s +?l?l?s?l?u?s?l?l +?s?l?u?l?l?u?l?s +?s?l?l?u?l?l?l?s +?l?l?l?l?s?u?s?u +?u?u?s?s?l?l?l?l +?s?s?l?l?l?l?l?u +?l?l?l?s?l?l?s?u +?l?l?l?s?s?u?u?u +?u?l?l?l?s?u?s?l +?s?l?u?l?l?l?l?s +?u?u?s?l?l?l?l?s +?s?l?l?l?s?l?l?u +?s?l?u?u?u?u?u?s +?l?l?u?u?l?l?s?s +?d?d?s?d?s?d?d?l?l?l +?l?u?d?d?d?d?d?d?d?d?d +?l?d?d?l?d?d?d?d?d?d?d +?d?d?d?l?d?d?l?d?d?d?d +?s?u?l?l?l?l?l?l?l +?u?l?l?l?l?l?l?u?s +?l?l?l?u?u?u?u?u?u +?u?l?l?l?l?l?l?u?l +?l?d?l?d?s?l?l?l?l +?l?s?l?d?l?l?l?l?d +?l?l?l?u?u?u?s?d?d +?l?s?l?l?l?l?d?d?l +?d?d?l?l?l?l?s?l?l +?l?l?d?s?d?l?l?l?l +?d?l?l?l?l?d?l?l?s +?l?l?l?l?d?d?l?s?l +?l?l?s?l?s?l?l?l?l +?l?d?d?d?l?d?d?l?l?d +?d?d?d?d?l?l?d?l?l?d +?d?l?l?d?d?l?d?d?d?l +?d?l?d?d?l?d?d?d?l?l +?u?u?u?d?d?u?d?d?d?d +?d?l?d?d?d?d?l?l?l?d +?u?l?d?d?u?l?d?d?d?d +?u?d?d?u?d?u?d?d?u?d +?d?l?d?d?l?d?l?l?d?d +?d?d?d?u?l?l?u?d?d?d +?l?d?d?u?d?d?l?d?d?u +?l?d?l?l?d?d?d?d?d?l +?u?d?d?l?d?d?u?d?d?l +?u?d?l?d?l?d?l?d?d?d +?d?l?d?d?l?d?l?d?d?l +?l?d?l?d?d?d?l?d?l?d +?d?d?d?d?l?l?d?l?d?l +?l?d?d?d?d?l?l?d?l?d +?d?l?d?l?l?d?d?l?d?d +?d?d?d?l?l?l?d?l?d?d +?d?l?l?d?l?d?l?d?d?d +?l?l?d?d?d?d?d?l?d?l +?d?d?d?u?u?d?d?d?u?u +?u?u?d?d?d?d?u?u?d?d +?d?d?l?l?d?d?d?l?l?d +?d?l?d?d?l?l?d?d?l?d +?d?d?d?l?l?d?l?l?d?d +?l?l?d?d?d?l?d?d?l?d +?u?d?u?d?u?d?d?d?u?d +?d?l?d?d?d?l?l?d?l?d +?d?d?d?d?d?d?l?u?l?u +?l?l?d?d?l?d?d?d?l?d +?u?d?d?l?d?d?l?d?d?u +?d?d?d?d?d?d?u?u?u?l +?d?l?d?d?l?d?l?d?l?d +?l?d?d?d?d?l?d?l?d?l +?d?d?u?u?d?d?u?u?d?d +?l?d?d?d?d?d?l?l?l?d +?d?l?d?l?d?l?d?d?l?d +?u?u?l?l?d?d?l?l?l +?d?u?l?l?l?d?u?l?l +?u?u?u?l?l?l?u?d?d +?u?l?u?u?u?u?u?d?d +?u?u?u?u?d?u?u?d?u +?d?u?u?u?u?u?d?u?u +?u?l?l?l?u?u?l?d?d +?l?l?l?u?u?l?l?d?d +?u?l?l?u?l?l?d?l?d +?u?u?d?u?u?u?d?u?u +?d?u?l?u?l?u?l?u?d +?l?l?u?l?u?l?l?d?d +?l?l?l?s?l?d?l?l?l +?u?l?l?l?l?d?l?l?s +?l?s?l?l?l?l?l?d?l +?l?l?s?l?l?l?l?d?l +?l?s?l?l?l?d?l?l?l +?u?s?l?l?l?l?d?d?d?d +?l?l?l?l?d?s?d?s?d?d +?s?s?l?l?l?s?s?d?d +?l?l?d?d?d?d?d?d?s?l +?l?l?d?d?d?d?d?d?l?s +?d?d?d?d?d?d?s?u?l?l +?d?d?u?l?l?s?d?d?d?d +?l?l?l?u?u?u?u?u?d +?l?s?d?d?s?d?d?s?d?d +?l?l?l?l?l?l?l?u?s +?l?s?l?l?s?l?l?d?d +?l?l?l?l?l?d?s?d?s +?l?l?l?d?d?l?l?s?s +?s?l?l?d?d?l?l?l?s +?l?d?l?d?l?d?l?l?l?l +?l?l?l?l?l?l?u?d?d?d +?d?d?d?d?d?d?d?d?d?d?l?l?l +?d?d?d?d?d?d?d?d?d?d?l?d +?u?l?l?l?u?l?l?l?l?d +?u?l?l?l?l?l?l?l?d?d?d +?d?s?s?s?s?d?d?d?d +?s?d?d?d?d?s?s?s?d +?s?s?s?d?d?d?d?d?s +?d?s?d?s?d?d?s?d?s +?d?d?d?d?s?s?s?s?d +?d?d?d?d?s?d?s?s?s +?s?s?d?d?d?d?s?s?d +?s?d?d?s?d?s?d?d?s +?s?s?d?d?d?s?s?d?d +?s?d?s?d?d?s?d?d?s +?d?s?s?d?d?s?s?d?d +?d?s?d?s?d?s?d?d?s +?d?d?s?d?s?d?d?s?s +?s?s?d?d?s?d?s?d?d +?s?s?s?d?d?d?s?d?d +?u?d?l?l?l?u?d?d?d +?l?d?l?l?d?d?u?u?d +?l?d?l?d?l?u?d?d?u +?u?d?d?u?d?u?u?d?u +?u?u?d?l?d?l?l?d?d +?l?d?d?u?l?d?l?u?d +?u?d?l?l?d?u?d?l?d +?d?u?l?d?d?u?u?d?l +?l?u?l?u?d?l?d?d?d +?u?u?d?u?u?d?u?d?d +?d?d?d?d?u?u?l?u?l +?d?u?d?d?u?u?u?l?d +?u?l?l?d?d?l?d?l?d +?l?u?l?d?d?u?l?d?d +?l?l?d?d?u?u?l?d?d +?d?d?d?u?u?d?l?l?l +?u?d?d?d?d?u?l?l?u +?l?d?l?u?d?d?l?d?l +?d?d?d?u?l?l?d?l?l +?u?d?d?l?d?l?l?d?l +?d?u?u?d?u?u?u?d?d +?l?u?l?d?l?d?u?d?d +?d?l?l?l?d?d?u?d?l +?l?d?u?d?l?d?l?d?u +?l?u?u?l?d?d?l?d?d +?u?d?u?d?d?d?u?l?l +?d?u?d?d?u?d?l?l?l +?l?l?d?l?d?d?l?u?d +?u?d?l?d?d?l?u?u?d +?d?u?d?d?u?u?u?d?u +?l?l?d?l?d?l?l?d?d?d +?l?d?u?l?d?l?l?d?d +?l?l?d?d?d?d?l?l?u +?l?u?d?d?l?u?l?d?d +?u?d?d?l?d?u?l?u?d +?d?l?d?d?d?l?u?u?u +?d?u?d?u?l?u?l?d?d +?d?l?d?l?l?d?l?l?d?d +?l?d?d?d?u?d?u?u?u +?l?l?l?l?d?d?d?u?d +?d?l?d?l?l?l?d?d?l +?u?d?d?d?l?u?u?l?d +?u?l?d?l?d?d?l?l?d +?u?l?u?u?d?d?d?d?u +?l?l?d?d?d?d?u?l?u +?u?l?l?l?d?d?d?u?d +?d?l?l?l?l?d?l?d?d?d +?d?l?u?l?d?d?l?d?u +?l?l?d?l?u?d?u?d?d +?d?d?u?l?d?d?l?l?l +?u?d?d?u?d?u?d?u?l +?d?u?d?u?d?u?d?u?l +?d?u?d?u?d?u?d?u?u +?u?u?d?d?u?d?l?d?l +?l?d?d?d?d?u?u?u?u +?l?l?l?d?u?u?d?d?d +?u?d?l?l?d?l?u?d?d +?d?l?d?l?d?l?d?u?u +?u?d?l?d?d?l?l?d?l +?u?d?l?l?u?d?l?d?d +?d?l?d?u?u?u?d?d?u +?l?d?l?d?d?l?d?d?l?l +?d?d?u?u?d?u?u?l?d +?u?d?d?d?u?l?l?d?l +?u?d?u?u?d?u?u?d?d +?d?u?l?l?l?d?d?l?d +?l?d?l?l?d?u?l?d?d +?u?u?d?d?u?d?d?u?u +?l?d?d?d?d?l?u?u?u +?d?d?u?l?l?u?d?d?u +?u?d?u?d?u?d?u?l?d +?u?l?u?l?d?d?d?d?l +?u?d?d?d?u?u?d?u?u +?l?u?d?l?d?u?d?l?d +?u?l?d?d?u?u?d?d?l +?d?d?d?l?d?l?l?l?u +?d?d?d?u?u?u?d?u?u +?d?l?l?u?l?l?d?d?d +?l?d?l?d?l?d?u?d?l +?d?l?d?l?d?l?d?l?u +?u?l?d?u?l?u?d?d?d +?d?d?l?u?l?l?d?d?l +?d?l?d?u?l?d?u?l?d +?u?d?d?l?u?l?d?d?l +?d?u?u?d?d?l?l?l?d +?l?l?l?d?l?u?d?d?d +?u?u?d?d?l?l?d?l?d +?l?d?d?d?d?l?l?u?l +?u?u?u?u?d?d?l?d?d +?l?d?l?u?d?l?l?d?d +?d?l?d?u?u?u?d?d?l +?u?d?l?d?u?l?d?u?d +?d?l?d?u?l?d?l?d?l +?d?u?l?d?u?d?l?l?d +?l?d?d?d?u?d?l?l?l +?u?l?d?u?l?d?u?d?d +?d?d?u?u?u?d?d?l?l +?d?d?u?u?u?d?d?l?u +?u?d?u?d?l?u?l?d?d +?l?d?d?u?l?l?l?d?d +?u?l?d?d?d?u?u?d?u +?d?l?l?d?u?u?d?d?u +?d?d?d?u?u?u?u?d?u +?d?l?l?l?u?l?d?d?d +?u?l?d?d?l?u?d?l?d +?u?d?d?d?u?d?l?l?l +?l?l?d?d?d?l?u?u?d +?u?d?u?l?u?l?d?d?d +?u?l?d?l?d?d?l?d?u +?u?u?u?u?d?d?d?u?d +?d?d?d?d?l?l?l?u?l +?l?d?d?l?l?u?l?d?d +?u?l?d?u?d?l?d?d?l +?l?l?l?d?d?l?u?d?d +?u?u?d?u?d?u?d?d?u +?l?l?d?d?u?l?u?d?d +?d?u?d?l?d?l?l?l?d +?u?l?d?l?l?u?d?d?d +?l?d?u?l?l?l?d?d?d +?u?d?l?l?u?d?d?d?l +?u?l?d?u?d?l?l?d?d +?u?d?l?l?u?u?d?d?d +?u?d?l?d?d?l?d?l?l +?u?d?u?d?l?d?l?d?l +?d?l?d?l?d?l?u?l?d +?u?d?l?d?u?l?l?d?d +?d?u?l?l?d?d?u?u?d +?l?l?u?d?d?l?l?d?d +?d?d?u?d?u?l?u?d?l +?d?d?u?u?u?u?d?u?d +?u?d?u?l?l?l?d?d?d +?u?d?u?l?d?d?u?l?d +?u?d?u?u?d?d?u?u?d +?d?d?l?u?u?u?l?d?d +?d?l?l?d?l?l?d?u?d +?d?u?d?l?d?l?d?u?u +?d?u?d?l?d?l?d?l?l +?l?d?l?d?l?d?d?u?u +?l?l?d?u?u?d?d?l?d +?u?d?d?d?l?u?l?u?d +?d?l?l?u?d?l?l?d?d +?u?l?d?d?l?u?d?d?l +?d?d?d?u?l?d?u?l?u +?d?d?u?l?l?l?d?l?d +?l?d?l?d?d?l?l?d?u +?d?d?l?l?u?d?l?u?d +?d?d?u?l?u?d?d?u?l +?d?d?l?u?u?l?u?d?d +?l?l?l?d?l?d?u?d?d +?l?u?d?l?u?d?l?d?d +?d?d?u?d?l?u?d?u?l +?l?d?d?u?l?l?d?d?u +?u?d?d?u?d?u?u?u?d +?d?l?d?l?l?l?u?d?d +?u?d?u?l?d?l?u?d?d +?u?d?d?u?l?l?l?d?d +?u?l?u?d?d?u?l?d?d +?l?l?d?u?l?d?d?l?d +?l?l?l?u?d?d?d?d?l +?u?d?u?l?d?l?d?d?u +?u?d?d?l?u?u?l?d?d +?d?u?d?l?d?u?d?l?l +?d?u?d?l?d?u?d?l?u +?d?l?u?l?d?u?d?l?d +?u?l?d?u?l?d?d?l?d +?u?l?d?u?l?d?l?d?d +?u?l?d?l?l?d?u?d?d +?u?d?l?l?d?u?l?d?d +?l?d?d?d?l?d?u?l?l +?u?d?d?l?d?l?u?d?l +?d?d?u?l?u?d?d?l?u +?u?l?d?l?d?u?d?d?l +?l?l?l?l?d?u?d?d?d +?l?l?d?l?d?d?l?d?u +?d?d?l?l?u?l?d?l?d +?d?u?d?l?d?u?u?d?l +?u?d?d?l?l?d?l?l?d +?u?l?d?d?l?l?d?d?u +?u?u?l?d?d?u?l?d?d +?u?d?d?d?u?d?u?u?u +?d?d?d?d?l?u?u?l?l +?l?u?l?d?d?d?d?l?u +?d?d?u?l?l?d?d?u?l +?u?d?d?u?d?d?u?l?l +?u?u?d?d?l?l?u?d?d +?l?u?l?d?l?d?l?d?d +?d?l?l?l?l?d?d?d?u +?u?l?d?d?u?d?d?l?u +?d?d?u?u?u?d?d?u?u +?u?d?l?d?d?u?u?u?d +?u?l?d?d?d?u?l?d?u +?u?d?d?d?u?u?u?d?l +?d?d?d?d?l?u?l?l?l +?d?d?d?u?l?d?l?u?u +?d?d?u?l?l?d?l?l?d +?l?u?l?d?l?d?d?l?d +?l?d?d?l?u?l?d?d?l +?d?d?d?l?u?l?d?l?l +?u?d?d?d?d?l?l?l?u +?l?d?l?d?l?u?d?l?d +?u?u?u?d?d?d?d?u?l +?d?d?l?l?l?l?d?l?d?d +?l?l?l?u?d?d?d?d?u +?l?l?d?l?l?u?d?d?d +?d?d?u?u?d?d?l?l?l +?l?d?l?d?l?l?d?d?d?l +?u?d?u?u?d?d?u?d?u +?u?d?d?u?d?d?u?u?u +?u?d?d?l?d?d?u?l?u +?u?u?d?u?d?d?l?d?l +?d?d?l?l?l?l?d?u?d +?u?l?d?u?u?u?d?d?d +?d?d?u?l?u?d?l?l?d +?d?u?l?d?l?l?d?l?d +?l?u?u?d?d?d?d?u?u +?u?u?d?u?l?u?d?d?d +?u?u?d?u?l?l?d?d?d +?l?u?u?d?d?u?u?d?d +?d?d?l?d?u?l?l?l?d +?l?d?l?l?u?u?d?d?d +?u?d?l?d?d?d?l?l?l +?d?l?l?l?u?u?d?d?d +?d?d?l?l?u?u?l?d?d +?u?l?d?d?u?d?l?l?d +?d?d?u?d?d?u?u?u?u +?u?d?l?l?d?d?l?d?u +?l?d?d?u?d?d?u?l?u +?u?d?d?u?u?d?d?l?l +?d?d?l?l?l?u?l?d?d +?l?u?d?d?l?l?l?d?d +?l?d?d?d?l?l?d?u?u +?d?l?u?l?l?d?d?u?d +?u?d?u?l?l?d?u?d?d +?d?u?l?u?u?d?d?l?d +?u?l?d?d?l?u?l?d?d +?d?u?d?u?u?d?u?u?d +?l?d?u?u?d?d?u?u?d +?u?d?u?u?d?d?l?d?l +?d?l?l?d?l?l?d?d?u +?l?d?u?d?l?d?u?d?l +?u?l?d?l?d?l?u?d?d +?u?d?l?d?l?u?l?d?d +?u?l?l?d?u?d?d?l?d +?l?l?l?d?d?d?l?d?u +?l?l?d?d?u?u?d?d?u +?l?u?d?d?d?d?l?u?u +?d?u?l?d?l?u?d?d?l +?d?u?u?d?u?u?d?d?u +?l?d?l?d?l?d?u?l?d +?l?d?u?d?u?d?l?l?d +?d?l?d?u?u?d?l?l?d +?u?d?u?d?u?u?l?d?d +?d?d?d?u?u?d?u?u?u +?l?u?d?d?d?d?l?l?u +?l?l?u?l?d?d?d?d?u +?l?l?d?u?u?l?d?d?d +?d?l?u?l?d?u?l?d?d +?u?l?d?d?l?l?d?u?d +?u?u?d?d?d?u?d?u?u +?u?l?l?d?d?u?d?d?u +?u?l?l?d?l?u?d?d?d +?d?d?l?l?u?d?l?d?u +?d?d?l?l?u?d?l?d?l +?d?l?d?l?l?d?u?l?d +?u?d?d?l?u?l?u?d?d +?d?d?u?l?d?d?u?l?l +?l?d?d?u?u?d?l?d?l +?u?d?l?d?d?l?d?u?u +?u?l?l?l?d?u?d?d?d +?u?l?u?d?d?d?d?l?l +?u?l?u?l?d?d?u?d?d +?l?d?l?d?u?l?d?d?l +?d?d?d?d?l?u?l?l?u +?u?d?d?l?l?d?l?d?u +?u?d?u?d?l?d?l?d?u +?d?u?u?u?d?u?d?u?d +?u?d?d?l?l?u?d?l?d +?d?u?l?l?d?l?d?d?l +?u?u?l?l?d?d?d?d?u +?d?u?l?u?l?d?u?d?d +?l?u?d?l?u?u?d?d?d +?d?u?d?l?d?l?d?u?l +?d?d?l?l?d?d?u?u?u +?u?u?u?d?d?u?d?d?u +?u?l?u?d?l?l?d?d?d +?d?d?d?d?l?l?u?u?l +?l?l?l?d?d?d?d?u?l +?u?l?d?d?d?l?l?l?d +?u?l?d?l?l?d?d?l?d +?u?u?l?l?d?l?d?d?d +?u?d?l?l?d?l?d?u?d +?l?u?l?l?d?d?d?d?u +?d?u?d?u?u?d?u?d?u +?u?d?d?u?l?d?d?u?l +?l?l?u?l?d?l?d?d?d +?u?l?u?d?d?d?d?u?l +?u?u?u?d?u?d?d?d?u +?u?l?u?d?d?u?u?d?d +?l?d?d?u?l?d?d?l?l +?l?l?l?d?d?d?u?d?u +?u?l?l?d?u?d?l?d?d +?l?u?d?d?l?d?d?u?l +?u?d?l?d?d?u?l?d?l +?d?u?l?l?d?u?l?d?d +?l?u?d?d?d?u?l?l?d +?u?d?u?d?l?d?l?l?d +?d?l?l?l?d?l?l?l?d?d +?u?d?d?l?l?d?d?u?l +?l?u?l?l?d?d?d?d?l +?l?l?l?d?u?d?d?u?d +?u?u?d?d?d?l?l?l?d +?l?d?d?l?u?u?u?d?d +?l?u?d?l?d?l?l?d?d +?u?u?u?u?s?l?l?l?l +?l?s?l?s?l?d?d?d?d?d +?d?s?d?d?s?d?d?d?d?s +?d?d?s?s?s?d?d?d?d?d +?d?d?d?d?d?d?s?s?d?s +?d?d?s?d?d?s?d?s?d?d +?l?l?s?d?s?l?l?l?l +?s?l?l?l?d?l?l?l?s +?s?l?l?l?l?l?l?l?l?s +?l?l?s?l?l?l?d?l?l +?d?l?l?l?l?l?l?s?l +?s?l?l?l?d?l?l?l?l +?u?u?u?u?s?u?u?u?d +?l?l?l?l?l?l?l?d?d?d?d?d +?l?d?d?s?s?s?l?d?d +?s?s?s?d?d?d?d?l?l +?l?s?l?s?s?d?d?d?d +?l?l?s?s?d?d?d?d?s +?s?l?l?d?d?d?d?s?s +?s?s?l?s?l?d?d?d?d +?d?s?d?s?d?d?l?s?l +?s?l?l?s?d?d?d?d?s +?d?d?s?l?s?l?s?d?d +?s?s?s?d?d?d?d?u?u +?s?l?d?d?d?d?l?s?s +?s?d?d?s?d?d?s?l?l +?u?s?u?s?d?d?d?d?s +?l?s?l?s?d?d?d?s?d +?d?d?d?d?s?l?s?l?s +?l?l?l?l?l?d?d?l?l?d +?l?d?d?d?d?d?d?d?d?s?d +?s?s?d?d?d?d?d?d?l?l +?l?l?d?s?d?s?d?d?d?d +?l?l?s?s?d?d?d?d?d?d +?d?l?l?l?u?l?l?l?l +?u?d?u?l?l?l?l?l?l +?u?u?u?u?u?u?u?l?d +?l?u?l?u?l?u?l?u?d +?u?u?u?u?u?u?u?s?u +?l?l?l?l?l?s?l?l?d?d +?u?u?u?u?u?u?s?s?s +?l?l?d?l?d?l?l?l?d?d +?u?u?l?l?u?u?d?d?d?d +?d?d?d?d?u?u?u?l?l?l +?l?d?l?d?l?l?l?l?d?d +?l?l?d?d?d?l?l?l?l?d +?d?d?l?d?d?l?l?l?l?l +?l?l?l?l?d?s?s?d?d +?l?l?l?l?d?s?d?d?s +?s?u?l?l?l?d?d?d?s +?u?u?s?u?u?s?d?d?d +?u?u?u?u?s?s?d?d?d +?s?l?d?l?l?d?l?d?s +?u?u?l?l?d?d?s?s?d +?l?d?d?d?l?l?l?s?s +?l?l?s?l?l?s?l?l?d +?u?u?s?s?s?s?s?s +?l?l?l?d?l?l?l?l?d?l +?d?d?d?d?d?d?d?d?d?d?u?u +?d?d?l?d?d?d?l?d?d?d?l +?l?d?d?d?d?l?l?d?d?d?d +?l?l?s?l?l?d?d?d?d?d +?u?l?l?l?s?l?l?l?d +?u?l?l?l?d?l?l?l?s +?l?s?l?d?l?l?l?l?l +?l?l?d?l?s?l?l?l?l +?s?d?d?d?s?l?l?l?s +?d?l?d?l?d?l?s?s?s +?u?l?l?l?l?d?d?s?d?d +?l?l?d?l?l?l?l?d?l?l +?l?d?l?l?l?l?l?d?l?l +?s?d?d?u?l?l?l?l?l +?l?l?s?l?l?d?l?l?d +?u?l?l?d?l?l?l?d?s +?u?l?l?d?d?l?l?l?s +?l?d?l?l?l?l?l?d?s +?l?l?l?d?l?l?l?s?d +?l?d?d?l?l?s?l?l?l +?u?l?u?l?l?l?s?d?d +?l?d?l?d?l?s?l?l?l +?l?l?u?l?l?l?s?d?d +?l?s?l?l?l?l?d?l?d +?u?u?l?l?s?s?d?d?d?d +?u?s?u?l?l?l?l?l?l +?s?l?l?l?l?l?s?d?d?d +?s?s?s?d?d?d?d?d?d?d?d +?l?d?d?l?l?l?d?d?l?l +?u?u?u?u?l?l?d?d?d?d +?d?l?d?l?d?l?d?l?l?l +?l?l?s?l?l?l?l?l?l?l +?s?s?s?s?d?d?s?s +?s?s?d?d?s?s?s?s +?s?d?s?s?s?s?s?d +?u?u?u?s?l?d?s?l +?u?s?d?l?l?l?l?s +?u?u?u?u?d?s?l?s +?s?l?u?u?u?u?s?d +?l?l?l?l?s?d?d?s?l +?s?d?l?l?l?s?u?l +?s?s?l?l?d?u?l?l +?d?s?l?s?u?l?l?u +?l?l?d?l?l?s?l?s +?u?d?u?s?u?l?u?s +?s?d?s?l?u?l?u?l +?u?s?d?s?l?l?l?l +?u?u?l?u?s?s?l?d +?l?s?l?l?l?s?d?l +?u?s?l?s?l?d?l?l +?d?u?l?s?u?l?u?s +?u?u?d?u?s?u?s?u +?u?l?l?l?s?l?d?s +?u?s?u?d?u?u?u?s +?l?l?u?s?d?s?u?l +?l?l?d?l?s?l?s?l +?l?l?l?l?d?u?s?s +?l?d?l?l?s?u?l?s +?l?d?s?u?l?l?s?l +?l?s?l?u?u?l?d?s +?u?l?s?d?u?l?l?s +?l?s?l?l?u?s?d?l +?l?d?l?s?l?l?u?s +?u?l?l?l?u?s?d?s +?l?d?s?l?s?l?u?l +?l?s?s?d?u?l?l?l +?l?l?s?l?l?s?u?d +?l?d?l?s?l?s?l?u +?l?s?l?l?l?u?d?s +?s?s?u?u?d?u?u?u +?l?l?l?u?s?d?l?s +?s?d?u?u?u?l?l?s +?u?d?l?l?s?s?l?l +?u?u?d?l?s?s?l?u +?u?d?u?u?u?s?l?s +?u?u?s?u?d?u?s?u +?s?l?u?d?l?u?l?s +?l?l?u?s?u?s?d?l +?l?l?u?u?u?d?s?s +?u?u?s?s?u?d?u?u +?u?u?u?u?d?s?s?u +?l?d?s?l?l?s?l?u +?u?d?s?u?l?u?l?s +?u?d?u?s?u?l?l?s +?s?l?u?l?u?d?u?s +?s?l?l?l?d?u?u?s +?u?l?u?s?l?d?s?l +?u?u?u?u?d?u?s?s +?d?l?l?s?l?s?l?u +?s?u?s?l?l?d?u?l +?l?d?u?l?s?l?s?u +?u?l?u?s?d?s?l?l +?l?l?s?l?d?l?l?s +?l?u?s?l?l?u?d?s +?s?l?l?d?l?l?l?l?s +?s?u?u?u?u?l?d?s +?u?s?l?d?l?l?l?s +?u?s?s?l?u?d?l?l +?l?l?s?s?d?l?u?l +?s?l?u?l?u?l?d?s +?d?s?u?u?l?l?l?s +?s?l?u?l?d?s?l?u +?d?s?l?s?l?l?l?l +?s?d?l?l?l?u?u?s +?s?l?d?l?l?s?u?u +?u?l?u?l?u?s?s?d +?l?l?s?l?u?d?s?u +?u?d?l?s?l?l?s?l +?l?l?u?u?d?u?s?s +?u?s?l?l?l?d?l?s +?l?s?s?l?d?l?u?u +?l?s?l?l?u?l?d?s +?l?u?l?l?s?d?s?l +?u?s?l?s?l?l?l?d +?l?u?l?s?u?s?d?l +?u?l?d?l?s?l?s?l +?u?u?s?l?l?d?u?s +?u?s?d?u?l?l?l?s +?l?l?s?d?u?s?u?u +?s?l?l?l?d?u?s?l +?l?s?l?l?d?l?s?l +?l?u?l?d?l?l?s?s +?u?l?l?d?u?s?u?s +?s?s?l?d?l?l?l?l +?s?u?d?l?s?u?u?u +?l?d?l?s?u?u?u?s +?u?l?u?s?d?l?l?s +?u?u?u?d?u?u?s?s +?l?d?s?u?s?l?l?l +?l?l?u?u?l?s?d?s +?l?l?l?s?d?l?s?u +?l?s?u?s?l?l?l?d +?s?u?l?l?s?u?l?d +?l?u?u?u?s?d?s?l +?u?s?d?l?s?u?l?l +?s?l?u?l?u?l?s?d +?u?s?l?d?l?l?s?u +?u?s?l?d?s?l?l?u +?l?l?d?l?s?s?l?l +?u?l?s?l?d?u?s?l +?d?l?s?l?s?l?u?l +?s?l?s?d?l?l?l?l +?d?u?s?u?s?l?l?u +?l?l?d?l?s?u?s?u +?s?u?u?d?u?u?u?s +?u?s?l?l?l?d?u?s +?l?u?u?s?u?d?s?u +?u?s?u?l?l?d?l?s +?s?u?l?u?d?l?u?s +?s?l?l?u?s?d?l?u +?u?u?l?l?l?d?s?s +?u?u?u?s?l?l?s?d +?l?d?s?u?l?l?s?u +?d?u?l?u?l?l?s?s +?s?d?l?l?l?s?l?u +?l?u?u?u?u?d?s?s +?u?u?s?d?l?l?l?s +?u?l?s?l?d?l?l?s +?u?s?l?u?d?s?l?l +?l?d?s?u?l?u?s?l +?l?s?l?l?d?s?u?l +?u?s?u?u?s?u?d?u +?s?s?l?u?l?l?d?l +?s?d?s?l?l?l?l?u +?u?u?s?d?s?u?u?u +?s?u?u?u?l?u?d?s +?u?s?l?d?l?s?l?l +?s?d?s?u?u?u?u?u +?u?d?l?l?l?s?u?s +?s?u?l?d?u?l?u?s +?l?s?u?d?l?l?s?l +?l?u?l?s?u?d?s?u +?d?s?l?l?l?l?u?s +?s?l?l?u?l?s?l?d +?d?u?l?u?s?l?u?s +?l?d?l?u?s?l?l?s +?s?s?u?u?u?d?u?l +?u?s?d?s?u?u?u?u +?s?l?l?d?s?l?l?l +?l?l?s?d?u?u?u?s +?l?u?l?u?l?d?s?s +?l?d?s?s?u?l?l?l +?u?s?u?l?s?u?l?d +?u?l?s?d?l?s?l?l +?d?l?l?s?u?u?u?s +?u?l?s?d?l?l?l?s +?d?l?l?s?s?l?l?l +?d?u?u?u?u?s?l?s +?u?d?l?s?u?l?s?l +?u?l?d?s?l?l?l?s +?s?s?l?l?l?l?d?l +?d?s?u?s?u?l?l?l +?u?u?u?s?d?s?u?u +?u?l?l?s?d?s?l?l +?s?d?u?l?s?l?l?l +?u?u?u?d?s?l?s?l +?u?s?u?s?u?l?l?d +?u?s?l?d?s?u?u?u +?l?l?l?l?s?u?s?d +?s?l?s?l?u?d?l?l +?l?d?l?s?l?s?u?u +?s?d?l?u?l?u?l?s +?l?d?l?s?l?l?s?u +?u?s?u?d?u?u?s?u +?u?l?u?u?s?l?s?d +?l?d?l?s?l?u?s?u +?l?d?l?s?l?u?s?l +?u?l?s?u?l?s?u?d +?u?s?s?u?u?u?u?d +?d?l?s?u?u?s?u?u +?s?s?u?u?d?u?l?l +?s?u?u?u?u?s?u?d +?l?u?u?s?s?d?u?u +?l?l?u?d?l?l?s?s +?u?s?u?u?s?u?u?d +?s?d?l?l?l?u?s?l +?u?u?l?l?s?s?d?u +?u?l?l?s?l?s?l?d +?d?l?l?l?u?l?s?s +?l?s?l?s?d?l?l?l?l +?d?l?l?l?l?s?s?l +?l?d?u?s?l?l?l?s +?u?l?d?s?l?l?s?l +?s?l?l?u?d?l?u?s +?s?u?l?u?s?u?d?l +?l?l?d?s?l?s?l?u +?l?s?s?d?l?l?u?l +?d?l?s?l?s?l?l?l +?u?d?u?s?s?u?u?u +?u?u?s?d?s?l?l?l +?u?l?s?l?l?l?d?s +?s?u?l?d?l?l?u?s +?l?l?l?l?s?s?d?l +?l?l?l?l?s?s?d?u +?l?l?s?u?d?l?u?s +?u?d?s?u?l?l?l?s +?u?u?u?d?u?s?s?u +?s?l?l?l?s?l?d?u +?l?u?l?s?d?s?l?u +?s?d?l?l?l?l?u?s +?l?d?l?l?l?s?u?s +?s?d?u?l?l?l?s?l +?u?l?u?l?d?s?l?s +?l?l?u?s?d?l?l?s +?s?u?s?u?l?u?l?d +?d?u?u?u?s?u?u?s +?u?d?l?l?s?s?u?u +?u?l?u?l?u?s?d?s +?l?l?s?l?u?l?d?s +?s?s?l?u?l?d?l?l +?d?l?l?l?s?u?u?s +?u?d?s?l?l?s?u?l +?s?u?s?l?d?l?l?l +?u?u?l?l?d?u?s?s +?d?l?l?l?l?s?u?s +?s?l?d?l?l?u?u?s +?l?u?u?d?l?s?s?l +?u?d?s?l?s?l?u?l +?l?u?l?s?l?u?s?d +?u?l?l?u?s?s?u?d +?l?d?u?l?u?l?s?s +?l?u?d?s?s?u?l?l +?l?d?l?l?s?s?l?l +?u?l?d?l?s?s?l?l +?d?u?u?s?l?l?l?s +?l?l?l?u?u?d?s?s +?s?l?l?l?l?s?d?u +?s?l?l?l?l?s?d?l +?u?u?s?s?l?l?d?l +?l?d?u?s?s?u?u?l +?l?d?l?l?s?u?s?u +?u?u?s?u?s?l?l?d +?s?l?s?d?u?u?l?u +?u?s?u?s?l?l?l?d +?l?l?u?l?s?d?s?u +?u?u?u?s?s?d?u?u +?l?u?u?s?u?s?l?d +?u?u?u?u?d?l?s?s +?u?l?s?s?l?l?l?d +?s?l?d?l?s?l?l?u +?u?u?s?u?s?u?u?d +?u?u?s?s?l?l?l?d +?u?l?s?l?l?s?l?d +?d?s?u?l?l?l?l?s +?u?s?l?l?s?u?u?d +?u?s?l?d?l?s?u?l +?l?s?d?u?l?l?s?u +?u?l?d?l?l?s?l?s +?l?s?u?d?l?s?l?l +?u?d?s?s?l?l?l?l +?u?l?u?s?u?s?u?d +?s?s?u?u?u?u?u?d +?u?d?s?l?l?s?l?l +?u?s?d?l?l?s?l?l +?s?l?u?d?l?l?u?s +?l?u?s?s?l?d?u?u +?l?l?s?s?l?d?l?u +?l?s?l?u?u?s?l?d +?d?u?l?s?l?l?s?l +?d?l?u?u?u?s?u?s +?s?u?u?s?l?l?d?l +?d?s?s?l?l?u?l?l +?u?d?s?s?u?l?l?l +?s?u?u?d?u?s?l?u +?u?s?u?u?u?s?u?d +?u?u?u?s?s?d?l?l +?s?l?u?l?l?l?d?s +?l?d?u?s?l?l?u?s +?s?u?d?l?l?s?l?l +?u?u?u?l?l?d?s?s +?u?s?l?u?s?l?d?l +?s?l?l?l?s?d?u?l +?u?d?l?u?l?l?s?s +?u?u?s?u?l?l?s?d +?u?d?l?l?l?s?s?l +?u?s?u?l?u?l?s?d +?u?s?l?l?d?l?s?l +?s?u?s?u?u?u?u?d +?s?u?l?l?u?l?d?s +?s?l?s?l?l?u?d?l +?l?l?l?s?u?d?s?l +?s?l?l?u?s?l?d?l +?u?s?l?l?u?s?l?d +?s?u?d?l?s?u?l?l +?u?l?d?l?u?s?u?s +?l?l?s?l?d?l?s?l +?d?l?l?s?l?l?l?s +?s?l?l?s?u?l?l?d +?u?l?l?l?u?d?s?s +?u?s?u?s?u?d?l?l +?s?s?l?l?l?d?l?u +?l?s?u?d?s?l?l?u +?u?s?u?s?u?l?u?d +?u?u?l?u?d?s?s?l +?s?l?u?u?l?s?d?u +?s?l?s?l?l?d?l?u +?d?l?l?s?u?l?s?l +?u?l?l?d?l?s?l?s +?s?d?u?u?u?s?l?l +?l?l?u?l?d?l?s?s +?s?l?s?l?d?u?l?l +?l?l?d?l?l?d?l?l?l?d +?l?d?l?l?l?l?l?l?d?l +?d?d?d?d?d?d?d?u?d?d?d +?s?s?s?s?l?l?l?d?d +?d?u?u?l?l?l?l?l?l +?u?l?l?l?u?d?l?l?l +?d?u?u?u?l?l?l?l?l +?l?d?l?l?d?l?l?l?l?l +?l?l?d?d?d?l?l?d?d?d?d +?u?l?s?d?d?d?u?l?l +?l?d?l?l?l?l?d?s?d +?l?l?l?l?s?u?d?d?d +?l?d?d?d?s?l?l?l?l +?u?l?l?l?d?l?d?d?s +?l?d?l?d?l?d?l?s?l +?u?u?u?d?d?d?s?u?u +?d?l?d?l?l?d?l?l?s +?u?d?l?l?d?l?l?d?s +?l?d?d?l?l?s?d?l?l +?u?l?l?l?d?l?s?d?d +?l?l?d?d?l?l?l?s?d +?l?l?d?d?l?l?s?l?d +?l?d?d?l?s?l?d?l?l +?s?l?l?l?l?d?d?d?l +?l?d?l?l?l?d?d?s?l +?u?l?l?u?l?s?d?d?d +?l?d?l?d?s?l?l?l?d +?u?u?s?d?d?d?u?u?u +?s?d?d?d?u?l?l?l?l +?l?l?d?l?l?l?d?d?s +?l?d?l?l?d?l?s?l?d +?l?d?l?d?l?s?l?d?l +?u?l?l?s?l?d?l?d?d +?l?l?l?l?l?s?l?d?d?d +?l?d?s?l?d?l?l?l?d +?s?d?l?l?l?d?l?l?d +?l?d?l?d?d?l?l?l?s +?d?u?l?l?l?l?d?d?s +?s?l?l?d?l?l?d?d?l +?l?l?d?l?l?d?l?d?s +?d?l?s?l?l?l?l?d?d +?l?d?d?l?l?d?l?l?s +?u?d?d?l?l?l?l?d?s +?l?l?l?d?d?s?l?l?d +?d?l?l?d?l?l?d?l?s +?d?d?l?l?d?l?l?l?s +?u?l?l?s?l?l?d?d?d +?l?d?s?d?d?l?l?l?l +?l?l?d?d?d?l?l?s?l +?u?u?u?u?d?d?d?s?u +?l?l?l?d?s?d?d?l?l +?l?l?d?l?d?l?s?l?d +?s?d?d?l?l?l?l?d?d?s +?d?d?l?l?l?l?l?l?l?s +?l?d?d?l?l?d?l?d?l?d +?d?l?d?l?l?d?l?d?l?d +?u?l?d?l?l?l?d?d?d?d +?l?l?d?l?d?l?d?l?d?d +?l?d?d?l?l?d?d?l?l?d +?d?l?l?d?d?l?l?l?d?d +?l?d?l?l?l?d?d?l?d?d +?l?l?d?d?d?d?d?d?l?l?l +?u?u?d?d?d?d?d?u?u?u +?l?l?d?d?l?d?l?d?l?d +?d?l?l?d?d?d?d?l?l?l +?l?l?d?l?l?d?d?l?d?d +?d?d?l?l?d?d?d?l?l?l +?l?l?d?l?l?d?d?d?d?l +?d?d?d?l?l?l?d?d?l?l +?u?u?u?l?l?d?d?d?d?d +?l?l?l?d?l?d?d?l?d?d +?d?l?l?l?d?l?l?l?l?l +?s?s?l?d?l?s?s?s +?l?l?d?s?s?s?s?s +?s?l?s?s?l?s?s?d +?s?s?l?d?s?l?s?s +?u?l?l?l?l?l?u?s?d +?l?u?u?u?u?u?s?l +?l?l?l?l?s?u?l?u +?l?l?l?u?s?l?l?u +?u?l?u?s?u?u?u?u +?l?u?l?u?l?u?s?l +?l?l?l?l?l?d?s?l?l +?l?l?u?l?u?l?s?l +?l?l?l?u?l?l?s?l +?u?l?l?s?l?u?l?u +?u?u?l?l?l?l?s?l +?u?l?u?l?u?l?u?l?s +?u?l?l?l?s?u?u?l +?u?u?l?l?l?u?s?u +?l?l?u?s?l?l?l?l +?u?u?l?l?u?s?u?u +?u?s?l?u?l?u?l?u +?u?l?s?u?l?l?l?u +?s?u?l?l?u?u?l?u +?l?u?u?l?l?l?l?s +?l?l?u?u?l?s?l?l +?l?l?u?u?l?s?l?u +?l?l?u?l?s?l?l?l +?l?l?u?u?l?u?l?s +?u?u?s?u?u?u?l?l +?u?l?l?u?u?u?u?s +?u?u?u?s?u?u?u?l +?u?u?u?u?l?l?u?s +?u?l?l?l?s?l?u?u +?l?l?u?u?u?u?u?s +?l?u?l?s?u?l?u?l +?u?s?l?l?u?u?u?u +?u?l?l?l?u?l?u?s +?l?u?l?s?l?u?l?u +?u?l?l?u?l?s?l?l +?u?l?l?u?l?l?s?l +?u?u?u?l?l?l?s?l +?s?l?l?u?u?l?l?l +?u?l?u?l?u?l?s?l +?u?l?l?u?s?l?l?l +?u?l?u?s?u?l?u?u +?l?l?l?l?u?u?s?u +?l?l?s?l?u?l?l?l +?u?l?s?u?l?u?l?l +?l?u?l?s?l?l?u?l +?s?l?u?l?l?l?l?l +?s?u?u?u?l?l?l?l +?u?l?u?l?s?l?l?l +?u?u?l?l?l?u?l?s +?u?u?u?u?s?u?u?l +?u?l?l?s?u?u?l?l +?u?u?l?l?u?u?u?s +?s?u?l?u?l?l?l?l +?u?u?u?u?s?l?u?u +?l?u?u?s?l?u?u?u +?u?l?l?l?u?u?l?s +?s?l?l?l?u?l?u?l +?u?u?u?u?l?u?u?s +?l?l?l?s?l?l?u?l +?l?l?u?l?l?u?l?s +?l?s?l?s?d?s?d?s?d +?u?l?l?l?l?d?l?d?l +?u?u?u?d?u?d?u?u?u +?u?l?l?l?d?d?u?u?u +?u?l?u?u?l?u?l?d?d +?u?u?u?d?d?u?l?l?l +?l?l?l?l?d?d?l?l?u +?l?u?l?d?d?l?l?l?l +?u?u?u?u?u?l?u?d?d +?u?l?l?d?l?l?l?d?l +?l?u?u?l?u?u?u?d?d +?u?u?u?u?u?d?u?d?u +?u?u?u?u?l?u?u?d?d +?u?u?u?d?u?u?u?d?u +?l?d?l?l?l?l?d?l?u +?l?l?l?l?d?d?u?l?l +?d?d?u?l?u?l?u?l?u +?u?l?u?l?d?d?u?l?u +?d?d?u?l?l?l?l?u?u +?d?u?l?l?l?l?l?u?d +?d?u?l?l?d?l?l?l?l +?d?u?d?u?u?u?u?u?u +?l?u?l?l?u?l?l?d?d +?u?u?u?u?d?d?d?d?u?u +?l?l?l?u?l?l?d?d?d?d +?l?d?l?l?l?d?l?d?l?d +?l?d?d?d?d?d?d?d?l?l?l +?l?s?l?l?l?l?l?s?d +?l?l?l?l?s?l?s?l?l +?d?d?d?d?d?d?d?d?u?u?d +?d?d?d?d?d?d?d?d?l?d?l +?u?d?d?d?d?u?d?d?d?d?d +?d?d?d?d?d?d?d?l?d?d?l +?l?s?l?s?s?l?s?l +?l?l?s?l?l?s?s?s +?s?l?l?s?s?l?l?s +?u?s?l?l?l?s?s?s +?s?s?s?s?u?l?l?l +?l?u?l?u?s?s?s?s +?u?l?l?l?l?l?l?l?l?d?d +?d?l?l?l?d?l?l?l?l?d +?u?u?u?u?u?u?u?u?u?d?d +?l?s?l?l?s?l?l?l?l +?s?l?l?l?l?s?s?d?d +?u?l?l?l?d?s?d?d?d?d +?u?l?l?l?d?d?d?d?d?s +?d?d?d?d?d?d?u?l?l?l?l +?u?l?u?l?l?l?l?l?d?d +?d?d?d?d?d?d?d?u?l?l?l +?s?s?s?s?s?s?s?u +?u?l?l?u?l?u?l?l?l +?u?l?l?l?u?l?u?l?l +?l?l?d?l?l?s?l?l?l +?l?l?s?l?d?l?l?l?l +?u?s?d?l?l?l?l?l?l +?l?l?l?l?d?l?s?l?l +?s?l?l?l?l?l?d?l?l +?l?l?l?s?l?l?d?l?l +?u?u?u?u?u?d?d?s?d?d +?l?l?d?l?l?l?l?l?l?d +?u?l?u?d?d?u?l?u?d?d +?u?l?l?l?l?d?l?l?l?l +?d?d?s?d?d?s?d?d?l?d +?d?d?d?d?d?s?l?s?d?d +?d?d?d?d?d?d?d?u?s?s +?s?u?s?d?d?d?d?d?d?d +?l?d?d?s?d?d?s?d?d?d +?d?s?d?d?s?d?d?d?d?u +?u?s?d?d?d?d?d?s?d?d +?d?d?d?s?d?d?d?d?s?l +?s?s?l?l?l?l?s?l +?s?s?l?s?l?l?l?l +?s?l?s?l?l?l?s?l +?s?s?l?l?s?l?l?l +?u?s?u?u?u?u?s?s +?u?u?u?s?s?s?u?u +?s?s?u?l?l?l?l?s +?u?l?s?l?l?l?s?s +?s?l?l?s?l?s?l?u +?s?u?u?u?u?s?u?s +?u?s?u?s?u?u?s?u +?s?u?s?u?l?l?l?s +?s?s?u?u?u?u?u?s +?u?u?s?s?s?u?u?u +?u?s?u?s?u?s?u?u +?s?l?l?s?l?l?s?l +?u?u?u?u?d?d?d?d?d?d?d?d +?d?d?d?s?d?d?d?d?d?d?l +?u?u?u?s?l?l?l?l?l +?u?u?u?u?u?u?d?d?d?s +?u?l?s?l?l?l?s?d?d +?l?l?l?s?l?s?l?d?d +?d?d?d?d?d?l?l?l?s?d +?l?l?s?d?d?d?d?d?d?l +?l?d?d?l?l?s?d?d?d?d +?l?l?d?d?d?d?l?s?d?d +?l?l?u?s?d?d?d?d?d?d +?l?d?l?d?l?s?d?d?d?d +?d?d?d?d?d?d?u?l?l?s +?d?d?u?l?l?d?d?d?d?s +?u?l?u?d?d?d?d?d?d?s +?d?d?l?l?l?d?d?s?d?d +?d?d?u?d?d?u?d?d?u?s +?l?s?s?s?l?s?s?s +?l?d?l?s?l?l?l?d?l +?u?l?d?d?l?l?l?l?s +?d?l?l?l?l?s?d?l?l +?l?l?d?l?l?l?l?d?s +?l?s?l?l?l?d?l?l?d +?s?l?l?d?l?l?d?l?l +?l?d?l?l?s?l?l?d?l +?l?l?l?l?l?u?s?d?d +?s?u?u?l?l?l?l?d?d +?u?l?l?l?l?l?l?l?s?d +?l?d?d?d?d?l?d?d?l?d?d +?l?l?d?d?l?d?d?d?d?d?d +?l?l?l?l?d?d?d?s?s?s +?u?l?l?l?u?l?l?l?u +?l?l?d?l?d?l?d?l?d?l +?u?l?l?d?d?l?l?l?d?d +?u?l?l?l?l?d?d?d?d?l +?d?d?l?l?l?l?l?d?d?l +?d?l?l?d?l?l?d?l?l?d +?l?l?s?d?d?s?d?d?d?d +?d?s?l?l?l?s?d?d?d?d +?u?l?l?u?l?l?l?s?d +?u?l?l?d?l?l?l?l?s +?u?l?l?l?u?l?l?s?d +?d?d?l?l?l?d?d?l?d?d?d +?l?l?l?s?l?l?l?s?d?d +?d?d?s?d?d?s?d?d?s?s +?d?d?d?s?s?s?s?d?d?d +?l?d?l?l?d?d?l?d?l?d +?l?d?d?l?d?l?d?l?d?l +?l?l?d?l?d?d?l?l?d?d +?d?d?l?l?d?l?d?d?l?l +?d?l?d?l?l?d?l?d?d?l +?u?l?u?l?l?d?d?d?d?d +?d?l?l?d?l?d?l?d?l?d +?l?d?l?d?d?l?l?l?d?d +?u?d?u?u?u?u?d?d?d?d +?l?u?u?u?u?d?d?d?d?d +?l?l?l?l?l?l?s?d?d?s +?u?u?u?u?u?u?l?l?d +?l?l?d?u?l?l?l?l?l +?u?u?u?u?u?d?l?l?l +?u?s?u?s?u?s?u?d?d +?l?l?l?l?d?d?d?d?l?l?l +?u?u?u?u?d?d?u?u?u?u +?l?l?d?l?d?l?d?s?d +?d?l?l?l?d?l?s?d?d +?s?d?l?l?d?l?d?l?d +?u?d?d?s?d?u?l?u?d +?d?l?d?l?l?d?d?l?s +?d?d?u?u?u?l?s?d?d +?u?d?d?l?l?l?s?d?d +?s?d?u?d?u?d?u?d?u +?l?d?l?d?d?s?l?d?l +?u?l?s?l?u?d?d?d?d +?u?l?d?d?s?l?d?d?l +?u?l?l?d?d?s?u?d?d +?s?s?l?l?l?l?d?d?d?d +?u?l?d?d?l?l?s?d?d +?d?d?d?l?l?l?d?l?s +?l?d?l?d?d?d?s?l?l +?l?d?d?l?d?d?s?u?u +?u?s?d?d?d?l?l?l?d +?u?l?s?u?u?d?d?d?d +?d?u?u?u?u?s?d?d?d +?u?s?d?l?d?l?d?l?d +?d?l?l?d?d?l?l?d?s +?d?d?d?l?l?d?l?l?s +?u?l?u?s?l?d?d?d?d +?d?u?l?l?d?d?s?d?l +?l?d?s?l?d?d?l?d?l +?l?d?l?d?l?d?l?s?d +?s?l?l?l?d?d?d?d?l +?l?d?l?d?l?d?s?d?l +?u?u?u?l?d?s?d?d?d +?l?u?l?d?l?s?d?d?d +?d?d?u?s?u?l?l?d?d +?u?l?d?d?u?l?s?d?d +?u?d?d?l?d?l?l?s?d +?u?u?l?l?d?d?s?d?d +?l?d?d?d?l?l?d?s?l +?u?l?u?u?d?d?d?d?s +?u?s?d?d?u?l?l?d?d +?u?u?l?l?d?s?d?d?d +?d?d?d?d?u?s?u?u?u +?l?s?l?d?l?d?d?l?d +?u?l?u?l?d?s?d?d?d +?l?l?u?d?l?d?d?d?s +?l?d?d?l?d?l?l?s?d +?s?d?d?u?u?d?d?u?u +?u?l?d?d?d?d?u?u?s +?d?d?s?l?d?l?d?l?l +?s?d?d?d?d?u?u?l?l +?u?d?d?u?u?u?d?d?s +?l?d?l?l?d?d?l?d?s +?u?l?d?d?s?l?l?d?d +?l?d?s?l?d?d?d?l?l +?l?d?d?l?l?d?d?s?u +?s?d?l?d?l?l?d?d?l +?u?u?u?l?d?d?d?d?s +?l?d?d?l?d?d?s?l?l +?d?l?l?d?l?u?d?d?s +?u?d?d?s?u?u?d?u?d +?l?s?d?l?d?l?d?d?l +?d?d?d?s?d?u?u?u?u +?l?d?d?d?l?d?l?l?s +?d?d?s?d?d?u?l?l?u +?u?d?d?s?u?l?l?d?d +?s?l?d?d?l?l?l?d?d +?l?s?d?l?d?l?d?l?d +?u?s?u?u?d?u?d?d?d +?u?s?d?d?l?d?l?l?d +?d?l?l?s?l?l?d?d?d +?u?s?d?d?d?l?d?l?l +?l?s?l?d?d?l?d?d?l +?l?d?d?l?s?l?l?d?d +?u?u?d?u?d?u?s?d?d +?l?d?d?s?l?d?l?d?l +?u?d?l?d?s?l?d?u?d +?s?d?u?u?u?l?d?d?d +?u?l?s?d?d?d?d?l?l +?l?d?l?s?l?l?d?d?d +?d?d?u?l?l?u?s?d?d +?l?s?u?l?l?d?d?d?d +?u?d?d?l?u?d?l?d?s +?d?l?u?l?d?s?l?d?d +?l?l?d?d?l?d?l?s?d +?d?l?l?s?l?d?d?l?d +?d?d?u?l?s?u?l?d?d +?s?d?l?d?d?d?l?l?l +?s?d?l?d?l?l?d?l?d +?d?u?l?l?l?d?d?d?s +?d?l?d?s?l?d?l?d?l +?d?d?u?u?s?d?d?u?u +?s?l?l?d?l?d?d?d?l +?l?l?d?s?l?l?d?d?d +?u?u?d?d?s?d?d?u?u +?u?l?l?d?d?l?d?d?s +?u?l?d?l?d?s?l?d?d +?s?l?l?d?d?d?d?l?l +?l?l?d?d?d?d?u?u?s +?s?d?l?u?l?d?l?d?d +?l?l?d?d?s?l?d?l?d +?d?u?u?d?u?d?u?s?d +?d?l?l?d?d?s?d?l?l +?s?l?l?l?d?d?d?l?d +?u?u?l?s?l?d?d?d?d +?l?s?d?d?l?d?l?l?d +?l?s?u?l?d?l?d?d?d +?l?l?d?d?d?d?l?s?l +?d?u?d?l?d?l?d?l?s +?s?u?u?l?l?d?d?d?d +?d?u?s?l?l?d?u?d?d +?u?d?l?l?d?s?l?d?d +?d?d?d?s?u?l?l?l?d +?l?l?l?d?s?d?l?d?d +?d?l?l?s?l?d?l?d?d +?l?u?l?d?d?s?u?d?d +?d?u?d?l?s?d?l?d?u +?d?u?u?u?u?d?d?s?d +?u?s?d?l?l?d?l?d?d +?l?d?d?l?d?l?d?s?l +?l?d?d?d?d?l?u?u?s +?l?l?d?d?l?s?d?d?l +?d?d?d?d?s?l?u?l?l +?u?s?l?d?l?u?d?d?d +?l?d?l?l?d?d?s?l?d +?d?l?u?l?l?s?d?d?d +?l?s?d?d?d?l?l?l?d +?l?d?d?l?d?d?l?s?l +?l?l?d?s?d?d?d?l?l +?d?d?u?u?s?d?d?l?l +?l?d?l?d?d?l?d?u?s +?u?d?d?d?d?s?l?l?l +?u?d?u?d?d?d?u?u?s +?u?d?d?l?d?l?d?l?s +?l?d?l?d?d?l?l?d?s +?d?d?s?d?l?l?l?l?d +?u?d?l?d?l?s?d?l?d +?d?d?d?u?l?d?l?l?s +?u?u?d?d?l?l?d?d?s +?d?d?d?d?u?l?s?u?l +?d?d?d?d?u?u?s?u?l +?d?d?d?d?u?u?s?u?u +?s?d?d?u?d?l?l?u?d +?d?l?d?l?l?d?l?s?d +?u?l?u?d?d?d?d?s?l +?d?l?d?s?d?d?l?l?l +?d?d?d?d?u?u?u?l?s +?u?d?d?l?l?s?l?d?d +?l?l?l?d?l?d?d?s?d +?l?d?d?s?l?d?d?l?l +?l?d?l?d?l?d?d?s?l +?l?l?l?s?d?l?d?d?d +?u?d?d?u?d?d?s?l?l +?u?u?s?d?d?d?d?u?u +?l?d?u?u?s?l?d?d?d +?l?d?s?l?l?u?d?d?d +?u?d?d?l?u?d?d?l?s +?l?d?l?d?l?s?l?d?d +?l?d?l?l?d?l?d?s?d +?d?d?u?u?d?d?l?l?s +?u?d?s?d?l?l?d?l?d +?l?l?l?d?d?s?d?l?d +?u?d?l?d?l?l?d?s?d +?u?u?d?d?s?l?l?d?d +?u?l?d?d?u?d?l?d?s +?u?s?u?d?d?l?l?d?d +?u?s?d?d?l?l?d?d?l +?l?l?d?d?l?d?d?l?s +?d?u?d?u?d?u?u?d?s +?d?u?d?d?l?l?s?u?d +?u?l?d?d?l?l?d?d?s +?u?d?u?d?s?u?d?d?u +?l?l?d?d?d?s?d?l?l +?d?d?d?d?u?u?l?l?s +?u?d?d?u?u?u?d?s?d +?l?d?d?d?s?l?d?l?l +?d?l?l?l?d?d?l?d?s +?l?d?s?l?l?d?d?l?d +?l?l?d?l?d?l?d?d?s +?u?d?l?d?s?d?l?d?l +?d?d?u?l?s?d?d?u?l +?l?d?s?d?l?l?d?d?l +?s?d?u?d?d?d?u?u?u +?d?s?l?l?d?l?d?d?l +?l?l?d?d?l?l?d?s?d +?s?d?l?d?l?l?l?d?d +?u?d?u?d?u?d?l?d?s +?d?d?d?s?u?d?u?u?u +?u?d?l?d?l?d?d?l?s +?d?l?d?l?d?d?l?l?s +?u?s?u?d?l?l?d?d?d +?s?u?l?l?d?d?l?d?d +?l?d?d?l?s?d?l?d?l +?l?d?d?l?l?s?l?d?d +?u?d?u?s?u?u?d?d?d +?u?u?d?d?l?l?s?d?d +?u?s?d?d?d?d?u?l?l +?d?l?l?d?s?d?d?l?l +?d?u?s?u?l?d?d?l?d +?u?l?d?u?d?l?s?d?d +?l?d?d?d?s?l?l?d?l +?l?s?l?l?d?d?l?d?d +?d?s?d?l?l?l?l?d?d +?d?d?l?l?l?d?d?s?l +?u?d?l?u?d?l?s?d?d +?l?d?d?l?l?l?d?s?d +?u?d?l?l?d?l?d?d?s +?u?d?l?l?d?d?d?s?l +?u?l?d?d?s?d?d?l?u +?l?l?s?d?d?l?d?d?l +?s?u?l?u?l?d?d?d?d +?l?l?u?u?d?d?d?d?s +?u?s?l?l?d?d?d?d?l +?l?l?s?l?u?d?d?d?d +?l?l?l?l?l?s?d?d?d?d?d +?l?d?s?l?d?l?l?d?d +?s?d?l?l?l?d?l?d?d +?d?d?d?d?l?u?s?l?u +?l?l?l?d?d?d?s?l?d +?d?u?u?d?u?u?d?d?s +?d?l?d?l?d?d?l?s?l +?l?d?d?s?u?d?u?u?d +?l?l?u?l?d?d?d?d?s +?d?d?l?d?d?l?s?l?l +?u?s?l?d?u?d?l?d?d +?d?u?l?u?l?s?d?d?d +?u?u?d?d?d?u?d?u?s +?l?l?s?d?d?d?d?u?u +?u?l?d?l?d?l?s?d?d +?s?l?u?u?u?d?d?d?d +?d?d?d?d?u?s?u?l?l +?s?d?l?l?d?d?d?l?l +?u?s?l?d?l?l?d?d?d +?s?d?d?d?u?u?u?u?d +?l?l?d?u?u?s?d?d?d +?d?s?d?l?l?l?d?d?l +?l?s?l?l?d?l?d?d?d +?d?s?l?l?l?l?d?d?d +?l?d?d?l?l?d?l?d?s +?l?d?s?d?l?l?d?l?d +?u?d?u?s?d?d?u?d?u +?d?u?d?d?d?u?u?s?u +?l?u?d?d?u?l?d?d?s +?l?l?u?l?d?d?d?s?d +?l?u?s?l?u?d?d?d?d +?u?d?u?d?l?d?l?d?s +?s?l?d?d?l?d?d?l?l +?s?l?d?l?l?l?d?d?d +?l?d?l?d?s?u?l?d?d +?s?l?d?l?l?d?d?l?d +?d?d?u?u?u?u?s?d?d +?d?l?d?l?s?l?d?l?d +?s?l?d?l?d?l?d?d?l +?d?d?u?u?l?l?s?d?d +?s?l?d?d?u?u?l?d?d +?d?d?d?d?s?l?l?l?u +?l?u?u?l?d?d?d?d?s +?u?d?l?d?l?l?d?d?s +?u?l?d?u?u?s?d?d?d +?l?d?d?d?d?l?l?s?l +?d?l?d?l?d?s?d?l?l +?d?d?l?l?d?d?u?u?s +?d?d?d?d?s?u?u?u?l +?s?d?d?l?l?d?d?l?l +?u?u?u?s?d?u?d?d?d +?s?u?l?u?u?d?d?d?d +?u?s?d?d?d?d?l?l?l +?d?u?d?u?s?d?u?d?u +?d?d?d?l?u?u?u?d?s +?l?d?s?d?d?d?l?l?l +?l?d?l?d?l?l?d?s?d +?d?d?d?l?l?s?l?l?d +?l?u?d?u?u?d?d?s?d +?u?l?l?d?u?d?d?d?s +?d?l?d?l?d?l?s?l?d +?l?u?u?u?d?d?d?d?s +?u?l?s?l?d?l?d?d?d +?u?u?u?s?l?d?d?d?d +?u?s?d?u?l?l?d?d?d +?l?l?d?l?l?d?s?d?d +?s?d?d?d?d?u?l?u?l +?l?l?s?d?l?d?d?l?d +?u?d?d?u?l?u?s?d?d +?u?l?u?d?d?l?d?d?s +?d?d?l?l?s?d?l?l?d +?u?l?l?u?d?d?d?d?s +?u?l?d?d?d?u?l?s?d +?d?d?d?s?l?l?l?d?l +?d?d?l?l?u?u?s?d?d +?u?d?d?d?u?s?u?d?u +?d?l?d?s?l?l?d?d?l +?u?s?l?l?u?d?d?d?d +?l?l?l?d?d?s?l?d?d +?u?l?u?l?l?u?l?l?l +?l?d?l?l?d?l?l?l?d?l +?d?l?l?l?l?d?l?l?l?d +?l?l?l?d?d?d?d?l?l?l?l +?d?l?d?d?d?d?l?l?d?l +?d?d?u?d?u?d?d?u?d?u +?d?d?d?l?d?l?l?l?d?d +?l?d?d?d?l?l?d?d?l?d +?l?l?d?d?u?u?d?d?d?d +?l?l?d?d?d?l?d?l?d?d +?d?l?d?d?d?l?l?l?d?d +?d?d?l?d?d?l?d?l?l?d +?d?d?l?d?d?d?d?l?l?l +?u?d?l?d?l?l?d?d?d?d +?l?d?d?d?l?l?d?l?d?d +?l?l?d?l?d?d?d?d?l?d +?d?l?d?d?l?l?d?l?d?d +?d?l?l?l?d?d?d?d?l?d +?u?l?d?l?l?d?d?d?d?d +?u?u?d?d?d?d?d?u?u?d +?l?d?d?d?d?l?l?d?d?l +?u?u?u?d?u?d?d?d?d?d +?u?u?u?d?d?d?d?d?d?l +?u?d?u?u?d?u?d?d?d?d +?d?u?u?u?u?d?d?d?d?d +?l?d?l?l?d?d?d?d?l?d +?d?d?l?l?l?d?l?d?d?d +?l?u?u?l?d?d?d?d?d?d +?u?l?d?d?d?l?l?d?d?d +?d?d?d?l?d?l?l?d?d?l +?l?d?l?d?d?l?d?d?l?d?d +?l?d?l?d?d?l?d?d?d?l +?l?l?d?d?d?l?d?d?d?l +?l?l?d?l?d?d?l?d?d?d +?u?u?d?d?u?l?d?d?d?d +?d?d?d?l?d?l?d?l?l?d +?l?l?d?l?d?d?d?d?d?l +?d?l?l?d?d?l?d?l?d?d +?d?d?l?l?d?l?l?d?d?d +?d?d?l?l?d?d?l?d?l?d +?d?d?d?d?d?d?l?u?u?u +?d?d?d?d?d?u?u?u?u?d +?d?d?l?d?l?l?d?d?l?d +?l?d?d?d?d?d?l?d?l?l +?d?d?l?d?l?d?d?d?l?l +?d?l?d?d?l?d?d?l?l?d +?d?d?d?d?l?d?l?l?d?l +?u?d?l?u?d?l?d?d?d?d +?u?d?d?u?d?d?u?u?d?d +?d?d?d?d?l?d?l?d?l?l +?u?u?u?d?d?d?u?d?d?d +?d?d?u?l?d?d?u?l?d?d +?u?d?d?d?l?l?l?d?d?d +?d?d?u?d?u?d?u?d?u?d +?u?u?d?d?d?d?l?l?d?d +?u?u?d?d?l?l?d?d?d?d +?l?s?l?s?l?l?l?l?d +?l?l?l?l?l?l?s?u?s +?d?l?l?l?l?l?l?d?d?d?d +?l?s?s?s?s?d?d?d?d +?d?d?d?d?s?s?s?l?s +?d?d?s?s?l?s?s?d?d +?s?d?d?s?l?s?d?d?s +?s?s?d?d?d?d?s?s?l +?s?s?d?d?l?d?d?s?s +?s?s?s?s?l?d?d?d?d +?l?s?s?s?d?d?s?d?d +?d?u?l?l?l?l?l?l?l?l +?u?u?l?d?d?d?l?l?u +?u?u?d?d?d?u?u?l?l +?l?u?l?l?u?u?d?d?d +?l?l?d?d?l?d?l?l?u +?l?l?l?u?u?l?d?d?d +?d?d?u?u?u?d?u?u?u +?l?l?l?d?d?d?l?l?u +?l?l?l?u?u?d?d?l?d +?u?l?l?l?d?d?d?l?u +?l?l?d?u?u?d?l?l?d +?u?d?d?d?u?l?l?l?l +?u?u?l?u?d?l?u?d?d +?u?u?u?u?d?u?d?d?u +?u?l?d?l?d?d?l?l?l +?u?u?l?u?l?l?d?d?d +?u?u?u?d?u?d?u?u?d +?d?d?d?l?l?u?l?l?l +?u?d?l?l?u?l?d?d?l +?l?l?d?d?d?u?l?l?l +?u?l?l?d?l?u?l?d?d +?l?l?l?u?l?u?d?d?d +?u?d?l?l?d?l?l?d?u +?u?u?u?d?d?u?d?u?u +?d?l?d?l?d?l?u?u?u +?l?d?d?d?l?l?l?u?u +?l?u?u?l?u?u?d?d?d +?u?u?u?l?l?u?d?d?d +?d?l?l?l?d?d?u?u?u +?l?l?l?l?d?l?u?d?d +?l?l?l?d?d?d?l?u?l +?u?d?l?u?l?l?l?d?d +?u?u?u?u?d?d?d?u?l +?u?l?l?d?d?u?d?l?l +?u?u?u?d?l?l?l?d?d +?l?d?d?l?u?l?l?l?d +?l?l?l?d?l?l?d?d?u +?u?u?d?u?u?d?l?l?d +?u?d?u?u?u?d?u?d?u +?l?d?u?d?l?d?l?u?u +?u?d?u?u?d?d?u?u?u +?u?u?u?d?d?l?l?l?d?d +?d?u?l?d?l?l?l?l?d +?u?d?l?u?d?l?l?d?u +?l?l?d?d?d?u?l?u?l +?d?l?l?d?d?l?u?u?u +?l?l?l?l?d?u?l?d?d +?u?d?u?d?u?u?d?u?u +?l?l?l?l?u?d?d?d?l +?l?d?u?u?u?u?u?d?d +?u?d?u?u?l?u?d?u?d +?u?l?u?l?l?d?d?d?u +?u?u?l?u?u?u?d?d?d +?u?u?d?d?d?d?l?l?l?l +?u?l?u?l?u?d?d?d?l +?u?l?u?l?u?d?d?d?u +?u?d?u?d?d?l?l?l?l +?u?l?u?d?u?d?u?d?u +?u?u?d?u?u?u?d?u?d +?d?l?l?l?u?u?u?d?d +?u?l?u?d?d?d?l?u?l +?l?d?l?d?l?d?u?u?u +?u?l?d?d?d?u?u?u?u +?u?d?l?l?u?l?d?l?d +?l?d?d?l?u?l?d?l?l +?u?d?l?d?u?l?u?d?l +?u?d?l?l?d?l?u?l?d +?l?l?d?d?l?l?l?l?l?d +?l?l?l?d?d?u?l?l?d +?l?u?d?l?l?l?l?d?d +?l?l?d?d?d?u?u?l?l +?u?l?l?l?d?u?d?d?l +?d?u?l?l?d?l?l?l?d +?u?u?d?d?u?d?u?u?u +?l?l?u?d?d?d?l?l?l +?d?l?l?d?l?l?d?l?u +?u?d?l?l?u?l?l?d?d +?u?d?d?d?l?l?l?u?u +?u?d?l?l?d?d?l?u?l +?u?l?l?l?u?d?d?d?l +?u?l?l?d?l?u?d?d?l +?u?l?l?l?l?d?u?d?d +?u?d?u?d?d?u?u?u?u +?u?l?l?l?l?d?d?u?d +?u?u?d?d?d?d?u?u?u?u +?d?l?l?l?l?u?u?d?d +?u?l?u?l?d?d?d?l?l +?u?u?u?d?d?l?l?l?d +?u?d?d?l?u?u?d?l?u +?l?l?d?d?d?u?u?u?u +?d?u?l?l?d?d?l?l?l +?d?d?l?l?l?l?l?l?l?l?l +?s?l?l?l?l?l?l?s?d?d +?d?d?s?d?d?d?d?d?d?s?d +?s?l?l?l?l?l?l?l?l?l +?l?l?d?l?l?d?l?l?l?l +?l?l?l?l?l?d?l?s?l +?u?l?l?s?l?l?l?l?d +?l?l?l?l?l?l?l?l?s?d?d +?l?l?l?l?l?s?l?l?s +?s?l?l?l?l?l?l?s?s +?l?l?l?l?l?d?s?d?d?d +?l?d?d?d?d?d?d?d?d?s?s +?u?u?u?u?d?d?d?u?u?u +?l?d?l?l?l?l?d?l?l?d +?l?l?d?l?l?d?l?l?d?l +?d?l?l?l?l?d?d?d?d?d?d +?d?u?s?d?u?s?d?u?s +?s?l?l?l?d?d?d?s?s +?l?l?l?s?d?s?d?s?d +?s?d?s?d?s?d?l?l?l +?d?d?u?u?u?u?u?d?d?d?d +?l?l?s?l?l?l?l?l?s +?d?d?d?d?s?d?d?d?d?l?l +?l?l?d?d?d?d?s?d?d?d?d +?l?l?l?l?l?s?d?d?d?s +?l?d?l?l?d?d?d?d?d?d?d +?l?l?s?s?s?s?d?d?d +?u?l?l?l?u?l?u?d?d +?u?u?u?u?l?l?u?d?d +?u?l?u?u?l?l?u?d?d +?l?l?u?l?l?l?u?d?d +?l?u?u?u?u?l?l?d?d +?d?l?l?l?l?l?u?u?u +?d?d?l?l?l?l?u?l?l +?u?d?l?l?l?l?l?u?d +?u?u?l?l?u?l?l?d?d +?d?u?u?l?l?l?l?l?d +?u?l?l?l?l?u?d?d?l +?d?d?l?l?l?l?u?u?u +?d?u?l?l?l?l?l?d?l +?l?l?l?l?l?u?d?d?l +?l?l?d?d?l?l?l?l?u +?d?l?l?l?l?d?l?u?u +?l?l?l?l?l?d?d?u?l +?u?u?l?u?l?l?l?d?d +?d?d?u?l?l?l?l?u?l +?d?l?l?l?l?u?u?u?u +?l?l?l?l?l?d?d?l?u +?u?l?l?u?d?d?l?l?l +?l?l?l?u?l?l?u?d?d +?d?d?l?l?l?u?l?l?l +?u?l?l?l?l?d?d?u?l +?u?u?l?l?l?l?d?d?l +?l?u?l?l?l?l?u?d?d +?d?d?l?u?u?u?u?u?u +?u?u?u?d?d?d?d?d?d?d?d?d +?l?l?l?s?s?l?l?d?d +?l?s?l?l?l?s?l?d?d +?d?d?s?l?l?s?l?l?l +?d?l?l?l?d?d?l?l?l?d +?d?d?d?d?u?l?l?u?l?l +?d?d?d?l?l?l?d?l?l?l +?d?d?d?l?l?l?l?l?d?l +?d?d?d?l?l?l?l?d?l?l +?d?d?d?l?l?d?l?l?l?l +?d?d?d?d?u?u?l?l?l?l +?l?l?l?l?l?l?l?s?d?d?d +?d?d?l?l?l?l?l?s?d?d +?l?d?l?d?l?d?l?d?l?s +?u?l?l?l?l?l?l?s?u +?l?s?u?l?d?s?s?l +?s?s?l?l?l?s?l?d +?l?s?d?s?u?l?s?l +?l?l?d?s?l?s?l?s +?l?l?s?d?l?s?s?l +?l?s?d?u?u?u?s?s +?s?l?s?s?l?u?u?d +?s?s?s?u?l?l?l?d +?s?s?l?s?l?l?l?d +?s?l?s?s?l?d?l?l +?u?l?l?s?s?s?l?d +?d?s?u?u?u?u?s?s +?u?s?l?s?u?s?l?d +?s?s?s?u?u?u?u?d +?s?s?d?l?u?l?u?s +?s?l?l?u?l?s?d?s +?s?l?d?l?s?l?l?s +?s?l?l?s?d?s?l?l +?s?l?s?l?l?l?s?d +?s?l?s?l?s?l?d?u +?s?l?l?s?s?d?l?l +?s?l?s?l?u?d?s?l +?l?s?l?l?d?s?l?s +?d?u?s?l?u?s?l?s +?l?u?l?s?s?l?s?d +?u?l?s?l?d?s?l?s +?l?l?s?s?l?s?d?l +?u?l?u?s?s?s?l?d +?s?s?s?l?l?d?l?l +?l?s?s?l?l?s?d?u +?u?s?d?s?l?l?u?s +?u?l?l?d?s?s?s?u +?l?l?d?s?l?l?s?s +?s?d?s?u?s?l?l?l +?l?d?l?l?s?l?s?s +?s?s?l?l?d?u?u?s +?u?d?l?s?l?s?l?s +?s?l?l?d?s?u?u?s +?l?l?s?s?d?u?s?l +?u?d?s?s?l?s?l?l +?d?l?s?l?l?l?s?s +?s?s?d?u?l?l?s?l +?l?s?l?d?s?l?l?s +?u?d?s?l?l?s?s?l +?d?u?u?s?u?u?s?s +?s?u?s?s?u?u?u?d +?l?s?s?u?s?d?l?l +?s?u?d?u?u?s?s?u +?d?u?u?u?u?s?s?s +?u?s?s?l?l?l?s?d +?s?l?s?l?s?d?l?l +?l?u?s?l?s?d?s?l +?d?l?s?u?l?s?l?s +?u?u?s?s?d?s?u?u +?l?l?l?d?s?s?l?s +?l?d?l?l?s?s?l?s +?u?u?s?d?u?u?s?s +?l?l?u?s?s?d?s?l +?d?s?l?l?l?s?l?s +?s?u?l?s?s?d?l?l +?u?d?s?l?s?l?s?u +?s?l?l?d?u?u?s?s +?l?s?l?s?l?d?s?l +?u?l?u?s?d?s?s?u +?s?d?l?s?l?l?s?l +?u?s?s?l?s?l?d?l +?u?u?s?s?s?d?l?l +?l?s?u?s?l?s?u?d +?s?d?l?s?l?l?l?s +?l?s?s?l?u?s?d?u +?u?s?l?s?d?l?s?l +?s?d?u?l?u?l?s?s +?l?l?l?s?s?s?d?l +?u?u?d?l?s?s?s?u +?u?l?u?l?s?d?s?s +?l?l?s?s?s?d?u?l +?l?s?s?l?d?l?s?l +?s?l?s?s?d?l?l?l +?s?s?u?d?u?u?u?s +?u?s?s?s?l?d?l?u +?s?s?d?u?u?u?u?s +?u?u?l?l?d?s?s?s +?s?l?s?s?l?l?d?l +?u?s?s?s?u?d?u?u +?u?s?u?u?u?s?s?d +?l?s?s?d?s?l?l?l +?d?s?l?s?u?s?l?u +?l?l?l?s?l?d?s?s +?u?l?s?l?l?d?s?s +?u?s?l?l?l?s?s?d +?l?s?s?l?s?l?d?l +?s?l?s?l?s?l?l?d +?s?l?l?l?s?d?l?s +?u?l?s?u?u?s?d?s +?s?l?d?s?l?l?l?s +?s?d?s?l?l?s?l?l +?u?l?u?s?s?u?s?d +?l?l?s?s?l?s?l?d +?u?l?l?u?d?s?s?s +?u?d?u?u?u?s?s?s +?d?l?l?s?s?s?l?l +?u?u?u?s?d?l?s?s +?s?s?s?u?u?l?l?d +?s?u?l?s?l?l?d?s +?u?s?l?s?l?s?u?d +?u?s?s?d?s?u?u?u +?d?u?u?s?s?s?u?u +?u?s?s?l?l?s?l?d +?s?l?s?l?l?d?s?l +?u?d?s?u?s?l?l?s +?d?l?l?s?l?s?s?l +?s?s?d?u?u?s?u?l +?u?s?d?u?s?u?s?u +?s?l?s?l?l?s?l?d +?u?l?d?s?s?l?s?l +?s?u?d?u?u?s?u?s +?u?l?l?s?l?d?s?s +?l?s?l?s?d?l?l?s +?l?u?s?s?d?s?l?u +?s?d?l?l?u?u?s?s +?s?u?s?u?s?u?u?d +?s?s?s?l?d?l?l?l +?d?s?s?l?l?l?s?l +?s?l?d?l?s?l?s?l +?d?l?l?u?u?s?s?s +?s?s?u?l?u?s?d?l +?l?l?s?s?s?l?d?l +?l?l?l?s?s?d?s?l +?s?u?u?u?u?d?s?s +?s?u?l?s?l?l?s?d +?s?l?s?l?u?s?d?l +?s?l?d?l?s?u?s?u +?s?s?u?l?s?u?d?l +?s?u?l?s?u?l?d?s +?d?l?l?s?s?l?l?s +?l?d?s?s?l?s?l?l +?s?d?s?l?l?l?s?u +?s?u?u?u?d?l?s?s +?s?s?l?d?l?l?s?l +?l?l?s?l?d?s?s?l +?d?l?s?s?l?l?l?s +?u?l?s?d?u?s?u?s +?u?l?d?u?l?s?s?s +?l?s?d?l?l?s?s?l +?l?s?l?l?l?s?s?d +?s?d?s?l?l?u?s?l +?s?u?s?u?u?d?u?s +?l?s?u?s?s?l?d?l +?s?l?d?u?s?s?u?l +?u?l?s?u?s?l?s?d +?u?s?s?s?u?d?l?l +?u?d?l?l?u?s?s?s +?s?u?l?s?l?d?s?u +?u?d?s?l?l?s?l?s +?u?u?s?l?s?d?l?s +?s?u?u?s?d?u?u?s +?d?u?l?l?s?l?s?s +?u?s?s?u?l?l?d?s +?d?s?s?s?l?l?u?u +?d?s?l?l?s?s?u?u +?l?l?s?u?s?d?u?s +?s?l?l?u?s?l?s?d +?d?s?l?s?l?l?s?l +?l?s?l?l?d?s?s?l +?s?s?u?s?l?l?l?d +?l?s?l?s?s?l?l?d +?d?l?s?s?s?l?l?l +?s?d?s?u?u?u?l?s +?s?l?s?l?s?l?d?l +?s?l?d?l?l?l?s?s +?l?s?s?s?l?l?l?d +?l?d?s?s?l?l?s?l +?s?l?s?d?s?l?l?l +?s?l?l?l?s?d?s?l +?d?s?s?l?l?l?l?s +?u?d?l?l?l?s?s?s +?s?u?d?l?l?l?s?s +?s?l?l?l?s?s?l?d +?l?l?l?s?u?d?s?s +?l?s?d?l?s?l?l?s +?l?l?l?s?d?s?l?s +?s?u?s?u?u?u?d?s +?l?l?s?d?l?l?s?s +?s?u?d?u?u?l?s?s +?u?u?u?u?s?d?s?s +?s?u?l?d?l?u?s?s +?s?l?s?u?l?d?u?s +?s?l?s?l?l?d?l?s +?l?u?l?s?d?s?s?u +?u?s?l?l?s?s?l?d +?d?u?l?s?s?u?l?s +?l?l?s?l?s?s?d?l +?d?d?d?d?d?d?d?d?d?d?u?l +?d?u?u?u?u?u?u?u?s +?u?l?d?l?l?l?l?l?s +?u?l?l?l?s?d?l?l?l +?l?d?l?l?l?d?l?l?l?l +?s?l?d?l?d?l?l?d?s +?l?d?l?d?l?d?l?s?s +?u?l?l?u?d?d?d?s?s +?l?l?l?s?d?d?d?s?l +?u?l?u?l?s?d?d?d?s +?s?s?u?l?l?l?d?d?d +?s?l?l?d?d?l?d?l?s +?u?s?u?s?u?u?d?d?d +?l?l?u?u?s?s?d?d?d +?d?d?d?s?l?l?s?l?l +?d?l?d?l?s?u?s?u?d +?s?d?l?l?l?l?s?d?d +?l?l?l?d?d?d?s?s?l +?d?d?l?l?l?s?l?d?s +?s?d?l?l?l?d?l?d?s +?l?l?d?d?l?l?d?s?s +?u?l?l?l?s?d?d?d?s +?s?u?s?u?d?l?d?l?d +?l?l?s?l?s?l?d?d?d +?u?l?u?l?d?d?d?s?s +?u?s?l?l?l?d?d?d?s +?u?u?u?u?d?d?d?d?d?s +?d?d?s?d?d?d?l?l?l?l +?d?d?d?d?d?l?s?l?l?l +?l?l?l?l?l?l?s?l?d?d +?u?s?s?s?s?s?s?d +?s?s?s?l?d?s?s?s +?s?u?u?u?u?l?u?s +?l?l?u?l?l?l?s?s +?u?l?u?u?l?l?s?s +?u?u?u?u?l?l?s?s +?u?l?s?l?l?l?s?l +?l?l?s?l?l?s?u?l +?l?l?s?l?l?s?u?u +?s?s?u?l?u?l?u?l +?l?l?l?u?s?l?l?s +?u?s?s?u?u?u?u?l +?l?l?l?s?s?u?l?l +?l?l?u?u?u?u?s?s +?u?l?l?l?s?s?l?u +?l?l?l?l?s?u?u?s +?l?u?s?u?u?u?u?s +?s?l?l?l?l?s?l?u +?l?s?l?l?l?s?u?l +?s?l?l?l?l?u?u?s +?s?l?l?l?l?s?u?u +?s?l?l?l?s?u?u?u +?u?u?l?l?u?s?u?s +?u?u?u?s?u?s?u?u +?u?l?u?l?l?s?s?l +?s?s?u?l?l?l?l?u +?l?s?s?l?l?u?u?u +?l?l?l?u?l?u?s?s +?l?l?l?s?l?u?s?l +?u?s?u?l?s?u?l?l +?s?u?l?u?u?l?u?s +?l?u?u?u?l?l?s?s +?s?s?l?u?l?l?l?l +?l?l?s?s?l?l?l?u +?s?l?l?l?u?u?u?s +?u?l?s?l?u?s?l?u +?l?u?l?s?l?u?l?s +?l?s?s?l?l?l?l?u +?s?u?u?u?s?l?l?l +?u?l?l?s?u?s?u?l +?u?l?l?l?s?l?s?l +?u?s?u?l?l?l?s?l +?l?s?l?l?u?s?l?l +?l?u?l?s?l?l?u?s +?u?s?l?l?l?s?l?u +?u?l?u?l?s?l?l?s +?l?l?l?l?s?s?l?u +?u?l?l?s?l?l?s?l +?s?l?l?u?u?u?u?s +?l?s?l?s?u?u?u?u +?l?s?u?l?s?l?l?l +?l?l?s?l?l?l?u?s +?u?s?l?u?l?u?l?s +?l?u?l?l?l?l?s?s +?l?l?l?s?u?s?l?l +?s?l?l?s?u?u?u?u +?u?l?s?s?l?l?l?u +?l?l?l?l?s?l?s?u +?l?l?l?s?l?l?u?s +?u?l?s?l?s?l?l?l +?l?u?u?u?u?s?l?s +?l?s?l?l?l?l?s?u +?u?l?l?l?l?l?u?l?l?l +?d?d?d?d?d?l?d?d?d?d?l +?d?d?d?d?d?d?l?d?d?l?d +?l?d?d?d?d?d?d?d?d?l?d +?d?d?l?l?l?l?d?d?d?d?d +?d?d?u?l?l?l?l?d?d?d +?l?d?d?l?d?l?d?l?l?d +?d?l?d?l?d?l?l?d?l?d +?l?l?l?d?d?d?l?d?d?l +?l?d?l?l?d?d?l?d?d?l +?u?u?u?u?l?d?d?d?d?d +?d?d?l?l?l?d?d?l?l?d +?l?d?d?l?d?d?d?l?l?l +?l?d?d?l?l?l?d?d?d?l +?l?d?d?l?l?d?l?l?d?d +?l?d?l?d?d?l?l?d?l?d +?u?l?l?d?l?l?d?d?d?d +?l?d?d?l?d?d?l?d?l?l +?d?d?d?l?d?d?l?l?l?l +?l?l?l?l?l?l?l?u?d?d +?l?l?l?d?l?l?l?d?l?l +?u?l?l?l?l?s?u?d?d +?l?l?l?d?l?d?l?l?s +?u?l?s?d?d?l?l?l?l +?l?l?d?l?d?l?l?l?s +?l?l?d?d?l?l?l?s?l +?s?l?l?l?d?d?l?l?l +?l?l?l?u?l?l?s?d?d +?u?d?l?l?s?u?d?l?l +?l?d?l?s?l?d?l?l?l +?l?d?s?l?l?l?l?l?d +?u?l?l?l?d?d?l?l?s +?l?l?l?l?s?l?d?l?d +?l?l?l?l?l?u?d?d?s +?u?s?d?d?l?l?l?l?l +?u?l?l?l?l?s?d?d?l +?l?l?d?d?l?l?s?l?l +?u?l?l?l?s?d?d?l?l +?d?l?l?l?l?l?d?l?s +?l?l?d?l?s?l?d?l?l +?l?l?s?l?d?l?l?d?l +?d?l?l?s?d?l?l?l?l +?l?l?l?l?d?s?d?l?l +?d?s?d?s?d?s?d?s?d?s +?l?l?l?s?s?s?d?d?d?d +?u?l?u?l?l?l?l?d?d?d +?s?l?d?d?d?d?d?d?d?d?d +?d?d?d?d?d?d?d?d?d?s?u +?u?l?l?l?l?d?d?d?d?u +?l?d?d?l?l?l?l?d?d?l +?d?d?u?l?u?l?u?l?d?d +?l?l?l?l?u?l?d?d?d?d +?s?l?s?l?s?l?s?s +?s?s?s?l?l?l?s?s +?s?s?s?s?s?u?u?u +?u?l?l?s?s?s?s?s +?d?d?d?s?d?d?d?d?d?d?d?d +?l?l?l?d?d?s?s?s?s +?l?l?l?s?d?d?s?d?d?d +?l?l?l?l?l?l?d?u?l +?u?l?l?l?l?u?d?l?l +?l?l?l?d?l?l?d?l?l?d +?s?s?l?s?l?s?s?s +?u?l?l?l?u?u?l?l?l +?l?l?l?l?l?l?l?s?l?l +?l?l?l?d?d?s?d?d?s?d?d +?d?d?u?d?d?d?d?d?l?u +?d?d?d?d?d?u?u?d?u?d +?u?l?d?d?d?d?d?d?d?l +?u?d?u?d?l?d?d?d?d?d +?l?d?d?l?d?d?d?u?d?d +?d?d?l?d?d?d?l?d?l?d +?d?d?d?d?d?l?l?d?l?d +?d?d?d?u?d?u?d?u?d?d +?d?u?d?d?d?d?d?d?u?u +?u?d?d?u?d?d?d?d?l?d +?d?d?d?d?l?d?d?l?d?d?l +?d?d?d?d?u?d?u?d?u?d +?d?l?d?d?l?d?d?d?l?d +?d?u?l?u?d?d?d?d?d?d +?l?l?d?d?d?d?d?d?d?u +?d?d?u?d?u?d?u?d?d?d +?d?d?d?d?u?u?d?d?d?l +?l?d?l?d?l?d?l?d?d?d?d +?d?d?d?d?d?d?d?l?u?l +?d?d?d?d?d?u?l?l?d?d +?l?d?l?d?d?u?d?d?d?d +?d?d?l?l?u?d?d?d?d?d +?l?u?d?l?d?d?d?d?d?d +?d?d?d?d?l?u?l?d?d?d +?d?u?d?d?u?d?d?d?d?u +?l?d?d?u?d?d?l?d?d?d +?d?d?d?d?d?d?u?d?l?l +?d?d?u?l?d?l?d?d?d?d +?d?l?l?d?d?d?d?l?d?d +?d?u?d?u?d?d?d?u?d?d +?d?u?d?u?d?d?u?d?d?d +?d?l?l?u?d?d?d?d?d?d +?d?d?d?d?d?u?d?u?d?u +?u?d?d?d?d?u?d?d?d?u +?d?d?l?d?l?l?d?d?d?d +?d?d?l?d?d?u?d?u?d?d +?d?u?d?d?u?d?d?u?d?d +?d?d?d?d?d?d?l?l?d?u +?d?d?l?d?d?d?d?l?d?l +?d?l?d?l?d?d?l?d?d?d +?u?d?d?u?d?d?u?d?d?d?d +?d?u?d?l?d?d?d?d?l?d +?d?d?d?d?l?d?d?l?d?l +?d?l?d?d?l?d?l?d?d?d +?d?l?d?d?d?d?l?d?l?d +?u?l?d?u?d?d?d?d?d?d +?d?d?d?d?u?u?d?u?d?d +?d?d?d?u?u?d?d?d?d?l +?u?d?d?d?d?u?d?u?d?d +?u?d?d?d?l?d?l?d?d?d +?d?d?d?d?l?l?d?d?d?u +?d?l?d?d?u?d?d?l?d?d +?d?u?d?d?l?d?l?d?d?d +?l?d?l?d?u?d?d?d?d?d +?u?d?d?d?l?l?d?d?d?d +?u?d?u?d?d?d?d?d?d?u +?d?d?d?d?u?u?d?d?u?d +?u?d?d?d?d?u?d?d?u?d +?d?d?d?d?d?u?l?u?d?d +?d?d?u?d?d?l?d?d?d?l +?d?u?u?d?d?u?d?d?d?d +?u?u?d?d?d?u?d?d?d?d +?d?d?d?d?u?d?d?d?l?l +?d?d?d?d?d?l?u?d?u?d +?l?l?d?d?u?d?d?d?d?d +?u?d?u?l?d?d?d?d?d?d +?u?d?d?d?u?l?d?d?d?d +?d?d?d?u?u?d?d?d?u?d +?d?u?d?d?l?l?d?d?d?d +?d?u?u?d?d?d?d?d?d?u +?u?d?d?d?d?d?d?d?l?u +?d?d?d?d?u?d?d?l?l?d +?u?d?d?d?d?d?l?u?d?d +?u?d?d?d?d?d?d?l?l?d +?u?d?d?d?l?d?d?l?d?d +?d?d?l?d?l?u?d?d?d?d +?d?d?d?u?d?d?u?d?d?u +?d?d?u?d?d?u?d?d?u?d +?d?l?l?d?u?d?d?d?d?d +?d?d?u?d?d?u?d?d?d?u +?d?d?d?d?l?d?l?u?d?d +?u?d?d?d?d?d?d?u?l?d +?l?d?d?d?d?d?l?d?l?d +?d?u?d?d?d?d?d?u?u?d +?d?l?u?d?d?d?d?d?d?l +?u?d?d?d?d?d?u?d?d?u +?d?u?d?u?d?d?d?d?u?d +?d?d?d?l?d?l?d?d?d?l +?u?d?d?d?d?l?d?d?l?d +?d?u?d?d?d?d?u?d?d?u +?d?d?d?d?d?u?d?l?d?u +?l?d?d?d?u?d?d?d?d?l +?d?d?u?u?d?u?d?d?d?d +?d?u?u?u?d?d?d?d?d?d +?u?d?u?d?d?l?d?d?d?d +?d?d?u?l?d?d?u?d?d?d +?d?l?d?d?d?d?d?d?u?u +?u?d?d?d?l?d?d?d?d?l +?u?d?d?u?u?d?d?d?d?d +?s?l?l?l?l?d?l?l?l +?l?l?l?d?l?l?s?l?l +?l?l?l?d?l?s?l?l?l +?u?l?l?l?s?u?l?l?d +?l?l?l?l?u?u?u?u?d?d +?u?l?l?l?l?l?s?s?d +?l?l?l?l?d?d?s?d?d?d?d +?d?d?s?d?d?s?l?l?l?l +?u?l?l?l?d?d?d?d?s?s +?d?d?d?d?d?d?l?l?d?d?d?d +?u?l?l?l?l?l?l?l?l?s +?u?l?l?l?d?d?d?d?d?d?d?d +?d?d?s?d?d?d?s?s?d?d +?d?s?d?d?d?d?d?d?s?s +?d?s?s?d?d?s?d?d?d?d +?d?d?d?d?d?d?s?s?s?d +?s?s?d?d?d?d?d?d?d?s +?d?d?d?s?d?s?d?s?d?d +?d?d?d?d?d?d?d?d?d?d?d?d?l +?s?s?s?s?u?u?l?l +?l?l?s?s?s?l?l?s +?l?s?l?s?l?s?s?l +?l?l?s?l?s?l?s?s +?u?s?l?l?s?l?s?s +?l?s?s?l?s?l?l?s +?u?s?u?u?u?s?s?s +?s?l?s?l?s?s?l?l +?u?u?s?u?u?s?s?s +?l?s?l?s?l?l?s?s +?u?l?l?l?u?l?l?l?l?l +?u?l?l?u?l?l?l?l?s +?d?d?d?d?d?d?s?d?d?d?s +?d?d?d?d?d?d?s?s?d?d?d +?s?d?d?d?d?d?d?s?d?d?d +?d?l?l?l?l?l?l?d?l?l +?u?u?u?u?u?l?d?d?d?d +?d?l?d?l?l?l?l?d?l?d +?l?u?l?u?l?u?d?d?d?d +?l?l?l?d?l?d?l?l?d?d +?d?l?d?l?l?l?l?l?d?d +?l?s?u?s?l?l?l?l?l +?l?l?l?l?u?u?u?d?d?d +?l?l?l?d?d?d?d?d?l?l?l +?s?d?d?d?l?l?d?d?d?s +?s?u?u?d?d?d?d?d?d?s +?d?d?d?d?d?d?s?s?u?u +?d?d?d?d?d?d?s?l?l?s +?s?d?d?d?d?l?l?l?l?s +?s?s?d?s?s?d?s?s?d diff --git a/nv/amp_a0_v1.cu b/nv/amp_a0_v1.cu new file mode 100644 index 0000000000..cff9dd3139 --- /dev/null +++ b/nv/amp_a0_v1.cu @@ -0,0 +1,58 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define VECT_SIZE1 + +#include "include/constants.h" +#include "include/kernel_vendor.h" +#include "types_nv.c" + +__device__ static u32x swap_workaround (const u32x v) +{ + #if __CUDA_ARCH__ >= 200 + return __byte_perm (v, 0, 0x0123); + #else + return (v << 24) + ((v & 0x0000FF00) << 8) + ((v & 0x00FF0000) >> 8) + (v >> 24); + #endif +} + +#include "include/rp_gpu.h" +#include "rp_nv.c" + +__device__ __constant__ gpu_rule_t c_rules[1024]; + +extern "C" __global__ void __launch_bounds__ (256, 1) amp (pw_t *pws, pw_t *pws_amp, gpu_rule_t *rules_buf, comb_t *combs_buf, bf_t *bfs_buf, const u32 combs_mode, const u32 gid_max) +{ + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + const u32 pw_len = pws[gid].pw_len; + + u32x w0[4]; + u32x w1[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + const u32 out_len = apply_rules (c_rules[0].cmds, w0, w1, pw_len); + + pws_amp[gid].i[0] = w0[0]; + pws_amp[gid].i[1] = w0[1]; + pws_amp[gid].i[2] = w0[2]; + pws_amp[gid].i[3] = w0[3]; + pws_amp[gid].i[4] = w1[0]; + pws_amp[gid].i[5] = w1[1]; + pws_amp[gid].i[6] = w1[2]; + pws_amp[gid].i[7] = w1[3]; + + pws_amp[gid].pw_len = out_len; +} diff --git a/nv/amp_a0_v2.cu b/nv/amp_a0_v2.cu new file mode 100644 index 0000000000..a6a01d7ddb --- /dev/null +++ b/nv/amp_a0_v2.cu @@ -0,0 +1,58 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define VECT_SIZE2 + +#include "include/constants.h" +#include "include/kernel_vendor.h" +#include "types_nv.c" + +__device__ static u32x swap_workaround (const u32x v) +{ + #if __CUDA_ARCH__ >= 200 + return __byte_perm (v, 0, 0x0123); + #else + return (v << 24) + ((v & 0x0000FF00) << 8) + ((v & 0x00FF0000) >> 8) + (v >> 24); + #endif +} + +#include "include/rp_gpu.h" +#include "rp_nv.c" + +__device__ __constant__ gpu_rule_t c_rules[1024]; + +extern "C" __global__ void __launch_bounds__ (256, 1) amp (pw_t *pws, pw_t *pws_amp, gpu_rule_t *rules_buf, comb_t *combs_buf, bf_t *bfs_buf, const u32 combs_mode, const u32 gid_max) +{ + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + const u32 pw_len = pws[gid].pw_len; + + u32x w0[4]; + u32x w1[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + const u32 out_len = apply_rules (c_rules[0].cmds, w0, w1, pw_len); + + pws_amp[gid].i[0] = w0[0]; + pws_amp[gid].i[1] = w0[1]; + pws_amp[gid].i[2] = w0[2]; + pws_amp[gid].i[3] = w0[3]; + pws_amp[gid].i[4] = w1[0]; + pws_amp[gid].i[5] = w1[1]; + pws_amp[gid].i[6] = w1[2]; + pws_amp[gid].i[7] = w1[3]; + + pws_amp[gid].pw_len = out_len; +} diff --git a/nv/amp_a0_v4.cu b/nv/amp_a0_v4.cu new file mode 100644 index 0000000000..1f4a0c049d --- /dev/null +++ b/nv/amp_a0_v4.cu @@ -0,0 +1,58 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define VECT_SIZE4 + +#include "include/constants.h" +#include "include/kernel_vendor.h" +#include "types_nv.c" + +__device__ static u32x swap_workaround (const u32x v) +{ + #if __CUDA_ARCH__ >= 200 + return __byte_perm (v, 0, 0x0123); + #else + return (v << 24) + ((v & 0x0000FF00) << 8) + ((v & 0x00FF0000) >> 8) + (v >> 24); + #endif +} + +#include "include/rp_gpu.h" +#include "rp_nv.c" + +__device__ __constant__ gpu_rule_t c_rules[1024]; + +extern "C" __global__ void __launch_bounds__ (256, 1) amp (pw_t *pws, pw_t *pws_amp, gpu_rule_t *rules_buf, comb_t *combs_buf, bf_t *bfs_buf, const u32 combs_mode, const u32 gid_max) +{ + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + const u32 pw_len = pws[gid].pw_len; + + u32x w0[4]; + u32x w1[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + const u32 out_len = apply_rules (c_rules[0].cmds, w0, w1, pw_len); + + pws_amp[gid].i[0] = w0[0]; + pws_amp[gid].i[1] = w0[1]; + pws_amp[gid].i[2] = w0[2]; + pws_amp[gid].i[3] = w0[3]; + pws_amp[gid].i[4] = w1[0]; + pws_amp[gid].i[5] = w1[1]; + pws_amp[gid].i[6] = w1[2]; + pws_amp[gid].i[7] = w1[3]; + + pws_amp[gid].pw_len = out_len; +} diff --git a/nv/amp_a1_v1.cu b/nv/amp_a1_v1.cu new file mode 100644 index 0000000000..0b232dc7c6 --- /dev/null +++ b/nv/amp_a1_v1.cu @@ -0,0 +1,702 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define VECT_SIZE1 + +#include "include/constants.h" +#include "types_nv.c" + +__device__ static void switch_buffer_by_offset (u32 w0[4], u32 w1[4], u32 w2[4], u32 w3[4], const u32 offset) +{ + #if __CUDA_ARCH__ >= 200 + + const int offset_minus_4 = 4 - (offset % 4); + + int selector = (0x76543210 >> (offset_minus_4 * 4)) & 0xffff; + + switch (offset / 4) + { + case 0: + w3[1] = __byte_perm (w3[0], w3[1], selector); + w3[0] = __byte_perm (w2[3], w3[0], selector); + w2[3] = __byte_perm (w2[2], w2[3], selector); + w2[2] = __byte_perm (w2[1], w2[2], selector); + w2[1] = __byte_perm (w2[0], w2[1], selector); + w2[0] = __byte_perm (w1[3], w2[0], selector); + w1[3] = __byte_perm (w1[2], w1[3], selector); + w1[2] = __byte_perm (w1[1], w1[2], selector); + w1[1] = __byte_perm (w1[0], w1[1], selector); + w1[0] = __byte_perm (w0[3], w1[0], selector); + w0[3] = __byte_perm (w0[2], w0[3], selector); + w0[2] = __byte_perm (w0[1], w0[2], selector); + w0[1] = __byte_perm (w0[0], w0[1], selector); + w0[0] = __byte_perm ( 0, w0[0], selector); + + break; + + case 1: + w3[1] = __byte_perm (w2[3], w3[0], selector); + w3[0] = __byte_perm (w2[2], w2[3], selector); + w2[3] = __byte_perm (w2[1], w2[2], selector); + w2[2] = __byte_perm (w2[0], w2[1], selector); + w2[1] = __byte_perm (w1[3], w2[0], selector); + w2[0] = __byte_perm (w1[2], w1[3], selector); + w1[3] = __byte_perm (w1[1], w1[2], selector); + w1[2] = __byte_perm (w1[0], w1[1], selector); + w1[1] = __byte_perm (w0[3], w1[0], selector); + w1[0] = __byte_perm (w0[2], w0[3], selector); + w0[3] = __byte_perm (w0[1], w0[2], selector); + w0[2] = __byte_perm (w0[0], w0[1], selector); + w0[1] = __byte_perm ( 0, w0[0], selector); + w0[0] = 0; + + break; + + case 2: + w3[1] = __byte_perm (w2[2], w2[3], selector); + w3[0] = __byte_perm (w2[1], w2[2], selector); + w2[3] = __byte_perm (w2[0], w2[1], selector); + w2[2] = __byte_perm (w1[3], w2[0], selector); + w2[1] = __byte_perm (w1[2], w1[3], selector); + w2[0] = __byte_perm (w1[1], w1[2], selector); + w1[3] = __byte_perm (w1[0], w1[1], selector); + w1[2] = __byte_perm (w0[3], w1[0], selector); + w1[1] = __byte_perm (w0[2], w0[3], selector); + w1[0] = __byte_perm (w0[1], w0[2], selector); + w0[3] = __byte_perm (w0[0], w0[1], selector); + w0[2] = __byte_perm ( 0, w0[0], selector); + w0[1] = 0; + w0[0] = 0; + + break; + + case 3: + w3[1] = __byte_perm (w2[1], w2[2], selector); + w3[0] = __byte_perm (w2[0], w2[1], selector); + w2[3] = __byte_perm (w1[3], w2[0], selector); + w2[2] = __byte_perm (w1[2], w1[3], selector); + w2[1] = __byte_perm (w1[1], w1[2], selector); + w2[0] = __byte_perm (w1[0], w1[1], selector); + w1[3] = __byte_perm (w0[3], w1[0], selector); + w1[2] = __byte_perm (w0[2], w0[3], selector); + w1[1] = __byte_perm (w0[1], w0[2], selector); + w1[0] = __byte_perm (w0[0], w0[1], selector); + w0[3] = __byte_perm ( 0, w0[0], selector); + w0[2] = 0; + w0[1] = 0; + w0[0] = 0; + + break; + + case 4: + w3[1] = __byte_perm (w2[0], w2[1], selector); + w3[0] = __byte_perm (w1[3], w2[0], selector); + w2[3] = __byte_perm (w1[2], w1[3], selector); + w2[2] = __byte_perm (w1[1], w1[2], selector); + w2[1] = __byte_perm (w1[0], w1[1], selector); + w2[0] = __byte_perm (w0[3], w1[0], selector); + w1[3] = __byte_perm (w0[2], w0[3], selector); + w1[2] = __byte_perm (w0[1], w0[2], selector); + w1[1] = __byte_perm (w0[0], w0[1], selector); + w1[0] = __byte_perm ( 0, w0[0], selector); + w0[3] = 0; + w0[2] = 0; + w0[1] = 0; + w0[0] = 0; + + break; + + case 5: + w3[1] = __byte_perm (w1[3], w2[0], selector); + w3[0] = __byte_perm (w1[2], w1[3], selector); + w2[3] = __byte_perm (w1[1], w1[2], selector); + w2[2] = __byte_perm (w1[0], w1[1], selector); + w2[1] = __byte_perm (w0[3], w1[0], selector); + w2[0] = __byte_perm (w0[2], w0[3], selector); + w1[3] = __byte_perm (w0[1], w0[2], selector); + w1[2] = __byte_perm (w0[0], w0[1], selector); + w1[1] = __byte_perm ( 0, w0[0], selector); + w1[0] = 0; + w0[3] = 0; + w0[2] = 0; + w0[1] = 0; + w0[0] = 0; + + break; + + case 6: + w3[1] = __byte_perm (w1[2], w1[3], selector); + w3[0] = __byte_perm (w1[1], w1[2], selector); + w2[3] = __byte_perm (w1[0], w1[1], selector); + w2[2] = __byte_perm (w0[3], w1[0], selector); + w2[1] = __byte_perm (w0[2], w0[3], selector); + w2[0] = __byte_perm (w0[1], w0[2], selector); + w1[3] = __byte_perm (w0[0], w0[1], selector); + w1[2] = __byte_perm ( 0, w0[0], selector); + w1[1] = 0; + w1[0] = 0; + w0[3] = 0; + w0[2] = 0; + w0[1] = 0; + w0[0] = 0; + + break; + + case 7: + w3[1] = __byte_perm (w1[1], w1[2], selector); + w3[0] = __byte_perm (w1[0], w1[1], selector); + w2[3] = __byte_perm (w0[3], w1[0], selector); + w2[2] = __byte_perm (w0[2], w0[3], selector); + w2[1] = __byte_perm (w0[1], w0[2], selector); + w2[0] = __byte_perm (w0[0], w0[1], selector); + w1[3] = __byte_perm ( 0, w0[0], selector); + w1[2] = 0; + w1[1] = 0; + w1[0] = 0; + w0[3] = 0; + w0[2] = 0; + w0[1] = 0; + w0[0] = 0; + + break; + + case 8: + w3[1] = __byte_perm (w1[0], w1[1], selector); + w3[0] = __byte_perm (w0[3], w1[0], selector); + w2[3] = __byte_perm (w0[2], w0[3], selector); + w2[2] = __byte_perm (w0[1], w0[2], selector); + w2[1] = __byte_perm (w0[0], w0[1], selector); + w2[0] = __byte_perm ( 0, w0[0], selector); + w1[3] = 0; + w1[2] = 0; + w1[1] = 0; + w1[0] = 0; + w0[3] = 0; + w0[2] = 0; + w0[1] = 0; + w0[0] = 0; + + break; + + case 9: + w3[1] = __byte_perm (w0[3], w1[0], selector); + w3[0] = __byte_perm (w0[2], w0[3], selector); + w2[3] = __byte_perm (w0[1], w0[2], selector); + w2[2] = __byte_perm (w0[0], w0[1], selector); + w2[1] = __byte_perm ( 0, w0[0], selector); + w2[0] = 0; + w1[3] = 0; + w1[2] = 0; + w1[1] = 0; + w1[0] = 0; + w0[3] = 0; + w0[2] = 0; + w0[1] = 0; + w0[0] = 0; + + break; + + case 10: + w3[1] = __byte_perm (w0[2], w0[3], selector); + w3[0] = __byte_perm (w0[1], w0[2], selector); + w2[3] = __byte_perm (w0[0], w0[1], selector); + w2[2] = __byte_perm ( 0, w0[0], selector); + w2[1] = 0; + w2[0] = 0; + w1[3] = 0; + w1[2] = 0; + w1[1] = 0; + w1[0] = 0; + w0[3] = 0; + w0[2] = 0; + w0[1] = 0; + w0[0] = 0; + + break; + + case 11: + w3[1] = __byte_perm (w0[1], w0[2], selector); + w3[0] = __byte_perm (w0[0], w0[1], selector); + w2[3] = __byte_perm ( 0, w0[0], selector); + w2[2] = 0; + w2[1] = 0; + w2[0] = 0; + w1[3] = 0; + w1[2] = 0; + w1[1] = 0; + w1[0] = 0; + w0[3] = 0; + w0[2] = 0; + w0[1] = 0; + w0[0] = 0; + + break; + + case 12: + w3[1] = __byte_perm (w0[0], w0[1], selector); + w3[0] = __byte_perm ( 0, w0[0], selector); + w2[3] = 0; + w2[2] = 0; + w2[1] = 0; + w2[0] = 0; + w1[3] = 0; + w1[2] = 0; + w1[1] = 0; + w1[0] = 0; + w0[3] = 0; + w0[2] = 0; + w0[1] = 0; + w0[0] = 0; + + break; + + case 13: + w3[1] = __byte_perm ( 0, w0[0], selector); + w3[0] = 0; + w2[3] = 0; + w2[2] = 0; + w2[1] = 0; + w2[0] = 0; + w1[3] = 0; + w1[2] = 0; + w1[1] = 0; + w1[0] = 0; + w0[3] = 0; + w0[2] = 0; + w0[1] = 0; + w0[0] = 0; + + break; + } + + #else + + u32 tmp0[4]; + u32 tmp1[4]; + u32 tmp2[1]; + + switch (offset % 4) + { + case 0: + tmp0[0] = w0[0]; + tmp0[1] = w0[1]; + tmp0[2] = w0[2]; + tmp0[3] = w0[3]; + tmp1[0] = w1[0]; + tmp1[1] = w1[1]; + tmp1[2] = w1[2]; + tmp1[3] = w1[3]; + tmp2[0] = 0; + break; + + case 1: + tmp0[0] = w0[0] << 8; + tmp0[1] = w0[0] >> 24 | w0[1] << 8; + tmp0[2] = w0[1] >> 24 | w0[2] << 8; + tmp0[3] = w0[2] >> 24 | w0[3] << 8; + tmp1[0] = w0[3] >> 24 | w1[0] << 8; + tmp1[1] = w1[0] >> 24 | w1[1] << 8; + tmp1[2] = w1[1] >> 24 | w1[2] << 8; + tmp1[3] = w1[2] >> 24 | w1[3] << 8; + tmp2[0] = w1[3] >> 24; + break; + + case 2: + tmp0[0] = w0[0] << 16; + tmp0[1] = w0[0] >> 16 | w0[1] << 16; + tmp0[2] = w0[1] >> 16 | w0[2] << 16; + tmp0[3] = w0[2] >> 16 | w0[3] << 16; + tmp1[0] = w0[3] >> 16 | w1[0] << 16; + tmp1[1] = w1[0] >> 16 | w1[1] << 16; + tmp1[2] = w1[1] >> 16 | w1[2] << 16; + tmp1[3] = w1[2] >> 16 | w1[3] << 16; + tmp2[0] = w1[3] >> 16; + break; + + case 3: + tmp0[0] = w0[0] << 24; + tmp0[1] = w0[0] >> 8 | w0[1] << 24; + tmp0[2] = w0[1] >> 8 | w0[2] << 24; + tmp0[3] = w0[2] >> 8 | w0[3] << 24; + tmp1[0] = w0[3] >> 8 | w1[0] << 24; + tmp1[1] = w1[0] >> 8 | w1[1] << 24; + tmp1[2] = w1[1] >> 8 | w1[2] << 24; + tmp1[3] = w1[2] >> 8 | w1[3] << 24; + tmp2[0] = w1[3] >> 8; + break; + } + + switch (offset / 4) + { + case 0: + w0[0] = tmp0[0]; + w0[1] = tmp0[1]; + w0[2] = tmp0[2]; + w0[3] = tmp0[3]; + w1[0] = tmp1[0]; + w1[1] = tmp1[1]; + w1[2] = tmp1[2]; + w1[3] = tmp1[3]; + w2[0] = tmp2[0]; + break; + + case 1: + w0[0] = 0; + w0[1] = tmp0[0]; + w0[2] = tmp0[1]; + w0[3] = tmp0[2]; + w1[0] = tmp0[3]; + w1[1] = tmp1[0]; + w1[2] = tmp1[1]; + w1[3] = tmp1[2]; + w2[0] = tmp1[3]; + w2[1] = tmp2[0]; + break; + + case 2: + w0[0] = 0; + w0[1] = 0; + w0[2] = tmp0[0]; + w0[3] = tmp0[1]; + w1[0] = tmp0[2]; + w1[1] = tmp0[3]; + w1[2] = tmp1[0]; + w1[3] = tmp1[1]; + w2[0] = tmp1[2]; + w2[1] = tmp1[3]; + w2[2] = tmp2[0]; + break; + + case 3: + w0[0] = 0; + w0[1] = 0; + w0[2] = 0; + w0[3] = tmp0[0]; + w1[0] = tmp0[1]; + w1[1] = tmp0[2]; + w1[2] = tmp0[3]; + w1[3] = tmp1[0]; + w2[0] = tmp1[1]; + w2[1] = tmp1[2]; + w2[2] = tmp1[3]; + w2[3] = tmp2[0]; + break; + + case 4: + w0[0] = 0; + w0[1] = 0; + w0[2] = 0; + w0[3] = 0; + w1[0] = tmp0[0]; + w1[1] = tmp0[1]; + w1[2] = tmp0[2]; + w1[3] = tmp0[3]; + w2[0] = tmp1[0]; + w2[1] = tmp1[1]; + w2[2] = tmp1[2]; + w2[3] = tmp1[3]; + w3[0] = tmp2[0]; + break; + + case 5: + w0[0] = 0; + w0[1] = 0; + w0[2] = 0; + w0[3] = 0; + w1[0] = 0; + w1[1] = tmp0[0]; + w1[2] = tmp0[1]; + w1[3] = tmp0[2]; + w2[0] = tmp0[3]; + w2[1] = tmp1[0]; + w2[2] = tmp1[1]; + w2[3] = tmp1[2]; + w3[0] = tmp1[3]; + w3[1] = tmp2[0]; + break; + + case 6: + w0[0] = 0; + w0[1] = 0; + w0[2] = 0; + w0[3] = 0; + w1[0] = 0; + w1[1] = 0; + w1[2] = tmp0[0]; + w1[3] = tmp0[1]; + w2[0] = tmp0[2]; + w2[1] = tmp0[3]; + w2[2] = tmp1[0]; + w2[3] = tmp1[1]; + w3[0] = tmp1[2]; + w3[1] = tmp1[3]; + w3[2] = tmp2[0]; + break; + + case 7: + w0[0] = 0; + w0[1] = 0; + w0[2] = 0; + w0[3] = 0; + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = tmp0[0]; + w2[0] = tmp0[1]; + w2[1] = tmp0[2]; + w2[2] = tmp0[3]; + w2[3] = tmp1[0]; + w3[0] = tmp1[1]; + w3[1] = tmp1[2]; + w3[2] = tmp1[3]; + w3[3] = tmp2[0]; + break; + + case 8: + w0[0] = 0; + w0[1] = 0; + w0[2] = 0; + w0[3] = 0; + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + w2[0] = tmp0[0]; + w2[1] = tmp0[1]; + w2[2] = tmp0[2]; + w2[3] = tmp0[3]; + w3[0] = tmp1[0]; + w3[1] = tmp1[1]; + w3[2] = tmp1[2]; + w3[3] = tmp1[3]; + break; + + case 9: + w0[0] = 0; + w0[1] = 0; + w0[2] = 0; + w0[3] = 0; + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + w2[0] = 0; + w2[1] = tmp0[0]; + w2[2] = tmp0[1]; + w2[3] = tmp0[2]; + w3[0] = tmp0[3]; + w3[1] = tmp1[0]; + w3[2] = tmp1[1]; + w3[3] = tmp1[2]; + break; + + case 10: + w0[0] = 0; + w0[1] = 0; + w0[2] = 0; + w0[3] = 0; + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + w2[0] = 0; + w2[1] = 0; + w2[2] = tmp0[0]; + w2[3] = tmp0[1]; + w3[0] = tmp0[2]; + w3[1] = tmp0[3]; + w3[2] = tmp1[0]; + w3[3] = tmp1[1]; + break; + + case 11: + w0[0] = 0; + w0[1] = 0; + w0[2] = 0; + w0[3] = 0; + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = tmp0[0]; + w3[0] = tmp0[1]; + w3[1] = tmp0[2]; + w3[2] = tmp0[3]; + w3[3] = tmp1[0]; + break; + + case 12: + w0[0] = 0; + w0[1] = 0; + w0[2] = 0; + w0[3] = 0; + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + w3[0] = tmp0[0]; + w3[1] = tmp0[1]; + w3[2] = tmp0[2]; + w3[3] = tmp0[3]; + break; + + case 13: + w0[0] = 0; + w0[1] = 0; + w0[2] = 0; + w0[3] = 0; + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + w3[0] = 0; + w3[1] = tmp0[0]; + w3[2] = tmp0[1]; + w3[3] = tmp0[2]; + break; + + } + + #endif +} + +__device__ __constant__ comb_t c_combs[1024]; + +extern "C" __global__ void __launch_bounds__ (256, 1) amp (pw_t *pws, pw_t *pws_amp, gpu_rule_t *rules_buf, comb_t *combs_buf, bf_t *bfs_buf, const u32 combs_mode, const u32 gid_max) +{ + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + const u32 pw_l_len = pws[gid].pw_len; + + u32 wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32 wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32 wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32 wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_r_len = c_combs[0].pw_len; + + u32 wordr0[4]; + + wordr0[0] = c_combs[0].i[0]; + wordr0[1] = c_combs[0].i[1]; + wordr0[2] = c_combs[0].i[2]; + wordr0[3] = c_combs[0].i[3]; + + u32 wordr1[4]; + + wordr1[0] = c_combs[0].i[4]; + wordr1[1] = c_combs[0].i[5]; + wordr1[2] = c_combs[0].i[6]; + wordr1[3] = c_combs[0].i[7]; + + u32 wordr2[4]; + + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + + u32 wordr3[4]; + + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, pw_r_len); + } + + u32 w0[4]; + + w0[0] = wordl0[0] | wordr0[0]; + w0[1] = wordl0[1] | wordr0[1]; + w0[2] = wordl0[2] | wordr0[2]; + w0[3] = wordl0[3] | wordr0[3]; + + u32 w1[4]; + + w1[0] = wordl1[0] | wordr1[0]; + w1[1] = wordl1[1] | wordr1[1]; + w1[2] = wordl1[2] | wordr1[2]; + w1[3] = wordl1[3] | wordr1[3]; + + u32 w2[4]; + + w2[0] = wordl2[0] | wordr2[0]; + w2[1] = wordl2[1] | wordr2[1]; + w2[2] = wordl2[2] | wordr2[2]; + w2[3] = wordl2[3] | wordr2[3]; + + u32 w3[4]; + + w3[0] = wordl3[0] | wordr3[0]; + w3[1] = wordl3[1] | wordr3[1]; + w3[2] = wordl3[2] | wordr3[2]; + w3[3] = wordl3[3] | wordr3[3]; + + const u32 pw_len = pw_l_len + pw_r_len; + + pws_amp[gid].i[ 0] = w0[0]; + pws_amp[gid].i[ 1] = w0[1]; + pws_amp[gid].i[ 2] = w0[2]; + pws_amp[gid].i[ 3] = w0[3]; + pws_amp[gid].i[ 4] = w1[0]; + pws_amp[gid].i[ 5] = w1[1]; + pws_amp[gid].i[ 6] = w1[2]; + pws_amp[gid].i[ 7] = w1[3]; + pws_amp[gid].i[ 8] = w2[0]; + pws_amp[gid].i[ 9] = w2[1]; + pws_amp[gid].i[10] = w2[2]; + pws_amp[gid].i[11] = w2[3]; + pws_amp[gid].i[12] = w3[0]; + pws_amp[gid].i[13] = w3[1]; + pws_amp[gid].i[14] = w3[2]; + pws_amp[gid].i[15] = w3[3]; + + pws_amp[gid].pw_len = pw_len; +} diff --git a/nv/amp_a1_v2.cu b/nv/amp_a1_v2.cu new file mode 100644 index 0000000000..36228efc79 --- /dev/null +++ b/nv/amp_a1_v2.cu @@ -0,0 +1,702 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define VECT_SIZE2 + +#include "include/constants.h" +#include "types_nv.c" + +__device__ static void switch_buffer_by_offset (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], const u32 offset) +{ + #if __CUDA_ARCH__ >= 200 + + const int offset_minus_4 = 4 - (offset % 4); + + int selector = (0x76543210 >> (offset_minus_4 * 4)) & 0xffff; + + switch (offset / 4) + { + case 0: + w3[1] = __byte_perm (w3[0], w3[1], selector); + w3[0] = __byte_perm (w2[3], w3[0], selector); + w2[3] = __byte_perm (w2[2], w2[3], selector); + w2[2] = __byte_perm (w2[1], w2[2], selector); + w2[1] = __byte_perm (w2[0], w2[1], selector); + w2[0] = __byte_perm (w1[3], w2[0], selector); + w1[3] = __byte_perm (w1[2], w1[3], selector); + w1[2] = __byte_perm (w1[1], w1[2], selector); + w1[1] = __byte_perm (w1[0], w1[1], selector); + w1[0] = __byte_perm (w0[3], w1[0], selector); + w0[3] = __byte_perm (w0[2], w0[3], selector); + w0[2] = __byte_perm (w0[1], w0[2], selector); + w0[1] = __byte_perm (w0[0], w0[1], selector); + w0[0] = __byte_perm ( 0, w0[0], selector); + + break; + + case 1: + w3[1] = __byte_perm (w2[3], w3[0], selector); + w3[0] = __byte_perm (w2[2], w2[3], selector); + w2[3] = __byte_perm (w2[1], w2[2], selector); + w2[2] = __byte_perm (w2[0], w2[1], selector); + w2[1] = __byte_perm (w1[3], w2[0], selector); + w2[0] = __byte_perm (w1[2], w1[3], selector); + w1[3] = __byte_perm (w1[1], w1[2], selector); + w1[2] = __byte_perm (w1[0], w1[1], selector); + w1[1] = __byte_perm (w0[3], w1[0], selector); + w1[0] = __byte_perm (w0[2], w0[3], selector); + w0[3] = __byte_perm (w0[1], w0[2], selector); + w0[2] = __byte_perm (w0[0], w0[1], selector); + w0[1] = __byte_perm ( 0, w0[0], selector); + w0[0] = 0; + + break; + + case 2: + w3[1] = __byte_perm (w2[2], w2[3], selector); + w3[0] = __byte_perm (w2[1], w2[2], selector); + w2[3] = __byte_perm (w2[0], w2[1], selector); + w2[2] = __byte_perm (w1[3], w2[0], selector); + w2[1] = __byte_perm (w1[2], w1[3], selector); + w2[0] = __byte_perm (w1[1], w1[2], selector); + w1[3] = __byte_perm (w1[0], w1[1], selector); + w1[2] = __byte_perm (w0[3], w1[0], selector); + w1[1] = __byte_perm (w0[2], w0[3], selector); + w1[0] = __byte_perm (w0[1], w0[2], selector); + w0[3] = __byte_perm (w0[0], w0[1], selector); + w0[2] = __byte_perm ( 0, w0[0], selector); + w0[1] = 0; + w0[0] = 0; + + break; + + case 3: + w3[1] = __byte_perm (w2[1], w2[2], selector); + w3[0] = __byte_perm (w2[0], w2[1], selector); + w2[3] = __byte_perm (w1[3], w2[0], selector); + w2[2] = __byte_perm (w1[2], w1[3], selector); + w2[1] = __byte_perm (w1[1], w1[2], selector); + w2[0] = __byte_perm (w1[0], w1[1], selector); + w1[3] = __byte_perm (w0[3], w1[0], selector); + w1[2] = __byte_perm (w0[2], w0[3], selector); + w1[1] = __byte_perm (w0[1], w0[2], selector); + w1[0] = __byte_perm (w0[0], w0[1], selector); + w0[3] = __byte_perm ( 0, w0[0], selector); + w0[2] = 0; + w0[1] = 0; + w0[0] = 0; + + break; + + case 4: + w3[1] = __byte_perm (w2[0], w2[1], selector); + w3[0] = __byte_perm (w1[3], w2[0], selector); + w2[3] = __byte_perm (w1[2], w1[3], selector); + w2[2] = __byte_perm (w1[1], w1[2], selector); + w2[1] = __byte_perm (w1[0], w1[1], selector); + w2[0] = __byte_perm (w0[3], w1[0], selector); + w1[3] = __byte_perm (w0[2], w0[3], selector); + w1[2] = __byte_perm (w0[1], w0[2], selector); + w1[1] = __byte_perm (w0[0], w0[1], selector); + w1[0] = __byte_perm ( 0, w0[0], selector); + w0[3] = 0; + w0[2] = 0; + w0[1] = 0; + w0[0] = 0; + + break; + + case 5: + w3[1] = __byte_perm (w1[3], w2[0], selector); + w3[0] = __byte_perm (w1[2], w1[3], selector); + w2[3] = __byte_perm (w1[1], w1[2], selector); + w2[2] = __byte_perm (w1[0], w1[1], selector); + w2[1] = __byte_perm (w0[3], w1[0], selector); + w2[0] = __byte_perm (w0[2], w0[3], selector); + w1[3] = __byte_perm (w0[1], w0[2], selector); + w1[2] = __byte_perm (w0[0], w0[1], selector); + w1[1] = __byte_perm ( 0, w0[0], selector); + w1[0] = 0; + w0[3] = 0; + w0[2] = 0; + w0[1] = 0; + w0[0] = 0; + + break; + + case 6: + w3[1] = __byte_perm (w1[2], w1[3], selector); + w3[0] = __byte_perm (w1[1], w1[2], selector); + w2[3] = __byte_perm (w1[0], w1[1], selector); + w2[2] = __byte_perm (w0[3], w1[0], selector); + w2[1] = __byte_perm (w0[2], w0[3], selector); + w2[0] = __byte_perm (w0[1], w0[2], selector); + w1[3] = __byte_perm (w0[0], w0[1], selector); + w1[2] = __byte_perm ( 0, w0[0], selector); + w1[1] = 0; + w1[0] = 0; + w0[3] = 0; + w0[2] = 0; + w0[1] = 0; + w0[0] = 0; + + break; + + case 7: + w3[1] = __byte_perm (w1[1], w1[2], selector); + w3[0] = __byte_perm (w1[0], w1[1], selector); + w2[3] = __byte_perm (w0[3], w1[0], selector); + w2[2] = __byte_perm (w0[2], w0[3], selector); + w2[1] = __byte_perm (w0[1], w0[2], selector); + w2[0] = __byte_perm (w0[0], w0[1], selector); + w1[3] = __byte_perm ( 0, w0[0], selector); + w1[2] = 0; + w1[1] = 0; + w1[0] = 0; + w0[3] = 0; + w0[2] = 0; + w0[1] = 0; + w0[0] = 0; + + break; + + case 8: + w3[1] = __byte_perm (w1[0], w1[1], selector); + w3[0] = __byte_perm (w0[3], w1[0], selector); + w2[3] = __byte_perm (w0[2], w0[3], selector); + w2[2] = __byte_perm (w0[1], w0[2], selector); + w2[1] = __byte_perm (w0[0], w0[1], selector); + w2[0] = __byte_perm ( 0, w0[0], selector); + w1[3] = 0; + w1[2] = 0; + w1[1] = 0; + w1[0] = 0; + w0[3] = 0; + w0[2] = 0; + w0[1] = 0; + w0[0] = 0; + + break; + + case 9: + w3[1] = __byte_perm (w0[3], w1[0], selector); + w3[0] = __byte_perm (w0[2], w0[3], selector); + w2[3] = __byte_perm (w0[1], w0[2], selector); + w2[2] = __byte_perm (w0[0], w0[1], selector); + w2[1] = __byte_perm ( 0, w0[0], selector); + w2[0] = 0; + w1[3] = 0; + w1[2] = 0; + w1[1] = 0; + w1[0] = 0; + w0[3] = 0; + w0[2] = 0; + w0[1] = 0; + w0[0] = 0; + + break; + + case 10: + w3[1] = __byte_perm (w0[2], w0[3], selector); + w3[0] = __byte_perm (w0[1], w0[2], selector); + w2[3] = __byte_perm (w0[0], w0[1], selector); + w2[2] = __byte_perm ( 0, w0[0], selector); + w2[1] = 0; + w2[0] = 0; + w1[3] = 0; + w1[2] = 0; + w1[1] = 0; + w1[0] = 0; + w0[3] = 0; + w0[2] = 0; + w0[1] = 0; + w0[0] = 0; + + break; + + case 11: + w3[1] = __byte_perm (w0[1], w0[2], selector); + w3[0] = __byte_perm (w0[0], w0[1], selector); + w2[3] = __byte_perm ( 0, w0[0], selector); + w2[2] = 0; + w2[1] = 0; + w2[0] = 0; + w1[3] = 0; + w1[2] = 0; + w1[1] = 0; + w1[0] = 0; + w0[3] = 0; + w0[2] = 0; + w0[1] = 0; + w0[0] = 0; + + break; + + case 12: + w3[1] = __byte_perm (w0[0], w0[1], selector); + w3[0] = __byte_perm ( 0, w0[0], selector); + w2[3] = 0; + w2[2] = 0; + w2[1] = 0; + w2[0] = 0; + w1[3] = 0; + w1[2] = 0; + w1[1] = 0; + w1[0] = 0; + w0[3] = 0; + w0[2] = 0; + w0[1] = 0; + w0[0] = 0; + + break; + + case 13: + w3[1] = __byte_perm ( 0, w0[0], selector); + w3[0] = 0; + w2[3] = 0; + w2[2] = 0; + w2[1] = 0; + w2[0] = 0; + w1[3] = 0; + w1[2] = 0; + w1[1] = 0; + w1[0] = 0; + w0[3] = 0; + w0[2] = 0; + w0[1] = 0; + w0[0] = 0; + + break; + } + + #else + + u32x tmp0[4]; + u32x tmp1[4]; + u32x tmp2[1]; + + switch (offset % 4) + { + case 0: + tmp0[0] = w0[0]; + tmp0[1] = w0[1]; + tmp0[2] = w0[2]; + tmp0[3] = w0[3]; + tmp1[0] = w1[0]; + tmp1[1] = w1[1]; + tmp1[2] = w1[2]; + tmp1[3] = w1[3]; + tmp2[0] = 0; + break; + + case 1: + tmp0[0] = w0[0] << 8; + tmp0[1] = w0[0] >> 24 | w0[1] << 8; + tmp0[2] = w0[1] >> 24 | w0[2] << 8; + tmp0[3] = w0[2] >> 24 | w0[3] << 8; + tmp1[0] = w0[3] >> 24 | w1[0] << 8; + tmp1[1] = w1[0] >> 24 | w1[1] << 8; + tmp1[2] = w1[1] >> 24 | w1[2] << 8; + tmp1[3] = w1[2] >> 24 | w1[3] << 8; + tmp2[0] = w1[3] >> 24; + break; + + case 2: + tmp0[0] = w0[0] << 16; + tmp0[1] = w0[0] >> 16 | w0[1] << 16; + tmp0[2] = w0[1] >> 16 | w0[2] << 16; + tmp0[3] = w0[2] >> 16 | w0[3] << 16; + tmp1[0] = w0[3] >> 16 | w1[0] << 16; + tmp1[1] = w1[0] >> 16 | w1[1] << 16; + tmp1[2] = w1[1] >> 16 | w1[2] << 16; + tmp1[3] = w1[2] >> 16 | w1[3] << 16; + tmp2[0] = w1[3] >> 16; + break; + + case 3: + tmp0[0] = w0[0] << 24; + tmp0[1] = w0[0] >> 8 | w0[1] << 24; + tmp0[2] = w0[1] >> 8 | w0[2] << 24; + tmp0[3] = w0[2] >> 8 | w0[3] << 24; + tmp1[0] = w0[3] >> 8 | w1[0] << 24; + tmp1[1] = w1[0] >> 8 | w1[1] << 24; + tmp1[2] = w1[1] >> 8 | w1[2] << 24; + tmp1[3] = w1[2] >> 8 | w1[3] << 24; + tmp2[0] = w1[3] >> 8; + break; + } + + switch (offset / 4) + { + case 0: + w0[0] = tmp0[0]; + w0[1] = tmp0[1]; + w0[2] = tmp0[2]; + w0[3] = tmp0[3]; + w1[0] = tmp1[0]; + w1[1] = tmp1[1]; + w1[2] = tmp1[2]; + w1[3] = tmp1[3]; + w2[0] = tmp2[0]; + break; + + case 1: + w0[0] = 0; + w0[1] = tmp0[0]; + w0[2] = tmp0[1]; + w0[3] = tmp0[2]; + w1[0] = tmp0[3]; + w1[1] = tmp1[0]; + w1[2] = tmp1[1]; + w1[3] = tmp1[2]; + w2[0] = tmp1[3]; + w2[1] = tmp2[0]; + break; + + case 2: + w0[0] = 0; + w0[1] = 0; + w0[2] = tmp0[0]; + w0[3] = tmp0[1]; + w1[0] = tmp0[2]; + w1[1] = tmp0[3]; + w1[2] = tmp1[0]; + w1[3] = tmp1[1]; + w2[0] = tmp1[2]; + w2[1] = tmp1[3]; + w2[2] = tmp2[0]; + break; + + case 3: + w0[0] = 0; + w0[1] = 0; + w0[2] = 0; + w0[3] = tmp0[0]; + w1[0] = tmp0[1]; + w1[1] = tmp0[2]; + w1[2] = tmp0[3]; + w1[3] = tmp1[0]; + w2[0] = tmp1[1]; + w2[1] = tmp1[2]; + w2[2] = tmp1[3]; + w2[3] = tmp2[0]; + break; + + case 4: + w0[0] = 0; + w0[1] = 0; + w0[2] = 0; + w0[3] = 0; + w1[0] = tmp0[0]; + w1[1] = tmp0[1]; + w1[2] = tmp0[2]; + w1[3] = tmp0[3]; + w2[0] = tmp1[0]; + w2[1] = tmp1[1]; + w2[2] = tmp1[2]; + w2[3] = tmp1[3]; + w3[0] = tmp2[0]; + break; + + case 5: + w0[0] = 0; + w0[1] = 0; + w0[2] = 0; + w0[3] = 0; + w1[0] = 0; + w1[1] = tmp0[0]; + w1[2] = tmp0[1]; + w1[3] = tmp0[2]; + w2[0] = tmp0[3]; + w2[1] = tmp1[0]; + w2[2] = tmp1[1]; + w2[3] = tmp1[2]; + w3[0] = tmp1[3]; + w3[1] = tmp2[0]; + break; + + case 6: + w0[0] = 0; + w0[1] = 0; + w0[2] = 0; + w0[3] = 0; + w1[0] = 0; + w1[1] = 0; + w1[2] = tmp0[0]; + w1[3] = tmp0[1]; + w2[0] = tmp0[2]; + w2[1] = tmp0[3]; + w2[2] = tmp1[0]; + w2[3] = tmp1[1]; + w3[0] = tmp1[2]; + w3[1] = tmp1[3]; + w3[2] = tmp2[0]; + break; + + case 7: + w0[0] = 0; + w0[1] = 0; + w0[2] = 0; + w0[3] = 0; + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = tmp0[0]; + w2[0] = tmp0[1]; + w2[1] = tmp0[2]; + w2[2] = tmp0[3]; + w2[3] = tmp1[0]; + w3[0] = tmp1[1]; + w3[1] = tmp1[2]; + w3[2] = tmp1[3]; + w3[3] = tmp2[0]; + break; + + case 8: + w0[0] = 0; + w0[1] = 0; + w0[2] = 0; + w0[3] = 0; + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + w2[0] = tmp0[0]; + w2[1] = tmp0[1]; + w2[2] = tmp0[2]; + w2[3] = tmp0[3]; + w3[0] = tmp1[0]; + w3[1] = tmp1[1]; + w3[2] = tmp1[2]; + w3[3] = tmp1[3]; + break; + + case 9: + w0[0] = 0; + w0[1] = 0; + w0[2] = 0; + w0[3] = 0; + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + w2[0] = 0; + w2[1] = tmp0[0]; + w2[2] = tmp0[1]; + w2[3] = tmp0[2]; + w3[0] = tmp0[3]; + w3[1] = tmp1[0]; + w3[2] = tmp1[1]; + w3[3] = tmp1[2]; + break; + + case 10: + w0[0] = 0; + w0[1] = 0; + w0[2] = 0; + w0[3] = 0; + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + w2[0] = 0; + w2[1] = 0; + w2[2] = tmp0[0]; + w2[3] = tmp0[1]; + w3[0] = tmp0[2]; + w3[1] = tmp0[3]; + w3[2] = tmp1[0]; + w3[3] = tmp1[1]; + break; + + case 11: + w0[0] = 0; + w0[1] = 0; + w0[2] = 0; + w0[3] = 0; + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = tmp0[0]; + w3[0] = tmp0[1]; + w3[1] = tmp0[2]; + w3[2] = tmp0[3]; + w3[3] = tmp1[0]; + break; + + case 12: + w0[0] = 0; + w0[1] = 0; + w0[2] = 0; + w0[3] = 0; + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + w3[0] = tmp0[0]; + w3[1] = tmp0[1]; + w3[2] = tmp0[2]; + w3[3] = tmp0[3]; + break; + + case 13: + w0[0] = 0; + w0[1] = 0; + w0[2] = 0; + w0[3] = 0; + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + w3[0] = 0; + w3[1] = tmp0[0]; + w3[2] = tmp0[1]; + w3[3] = tmp0[2]; + break; + + } + + #endif +} + +__device__ __constant__ comb_t c_combs[1024]; + +extern "C" __global__ void __launch_bounds__ (256, 1) amp (pw_t *pws, pw_t *pws_amp, gpu_rule_t *rules_buf, comb_t *combs_buf, bf_t *bfs_buf, const u32 combs_mode, const u32 gid_max) +{ + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + const u32 pw_l_len = pws[gid].pw_len; + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_r_len = c_combs[0].pw_len; + + u32x wordr0[4]; + + wordr0[0] = c_combs[0].i[0]; + wordr0[1] = c_combs[0].i[1]; + wordr0[2] = c_combs[0].i[2]; + wordr0[3] = c_combs[0].i[3]; + + u32x wordr1[4]; + + wordr1[0] = c_combs[0].i[4]; + wordr1[1] = c_combs[0].i[5]; + wordr1[2] = c_combs[0].i[6]; + wordr1[3] = c_combs[0].i[7]; + + u32x wordr2[4]; + + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + + u32x wordr3[4]; + + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, pw_r_len); + } + + u32x w0[4]; + + w0[0] = wordl0[0] | wordr0[0]; + w0[1] = wordl0[1] | wordr0[1]; + w0[2] = wordl0[2] | wordr0[2]; + w0[3] = wordl0[3] | wordr0[3]; + + u32x w1[4]; + + w1[0] = wordl1[0] | wordr1[0]; + w1[1] = wordl1[1] | wordr1[1]; + w1[2] = wordl1[2] | wordr1[2]; + w1[3] = wordl1[3] | wordr1[3]; + + u32x w2[4]; + + w2[0] = wordl2[0] | wordr2[0]; + w2[1] = wordl2[1] | wordr2[1]; + w2[2] = wordl2[2] | wordr2[2]; + w2[3] = wordl2[3] | wordr2[3]; + + u32x w3[4]; + + w3[0] = wordl3[0] | wordr3[0]; + w3[1] = wordl3[1] | wordr3[1]; + w3[2] = wordl3[2] | wordr3[2]; + w3[3] = wordl3[3] | wordr3[3]; + + const u32 pw_len = pw_l_len + pw_r_len; + + pws_amp[gid].i[ 0] = w0[0]; + pws_amp[gid].i[ 1] = w0[1]; + pws_amp[gid].i[ 2] = w0[2]; + pws_amp[gid].i[ 3] = w0[3]; + pws_amp[gid].i[ 4] = w1[0]; + pws_amp[gid].i[ 5] = w1[1]; + pws_amp[gid].i[ 6] = w1[2]; + pws_amp[gid].i[ 7] = w1[3]; + pws_amp[gid].i[ 8] = w2[0]; + pws_amp[gid].i[ 9] = w2[1]; + pws_amp[gid].i[10] = w2[2]; + pws_amp[gid].i[11] = w2[3]; + pws_amp[gid].i[12] = w3[0]; + pws_amp[gid].i[13] = w3[1]; + pws_amp[gid].i[14] = w3[2]; + pws_amp[gid].i[15] = w3[3]; + + pws_amp[gid].pw_len = pw_len; +} diff --git a/nv/amp_a1_v4.cu b/nv/amp_a1_v4.cu new file mode 100644 index 0000000000..c8e6e08c4e --- /dev/null +++ b/nv/amp_a1_v4.cu @@ -0,0 +1,702 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define VECT_SIZE4 + +#include "include/constants.h" +#include "types_nv.c" + +__device__ static void switch_buffer_by_offset (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], const u32 offset) +{ + #if __CUDA_ARCH__ >= 200 + + const int offset_minus_4 = 4 - (offset % 4); + + int selector = (0x76543210 >> (offset_minus_4 * 4)) & 0xffff; + + switch (offset / 4) + { + case 0: + w3[1] = __byte_perm (w3[0], w3[1], selector); + w3[0] = __byte_perm (w2[3], w3[0], selector); + w2[3] = __byte_perm (w2[2], w2[3], selector); + w2[2] = __byte_perm (w2[1], w2[2], selector); + w2[1] = __byte_perm (w2[0], w2[1], selector); + w2[0] = __byte_perm (w1[3], w2[0], selector); + w1[3] = __byte_perm (w1[2], w1[3], selector); + w1[2] = __byte_perm (w1[1], w1[2], selector); + w1[1] = __byte_perm (w1[0], w1[1], selector); + w1[0] = __byte_perm (w0[3], w1[0], selector); + w0[3] = __byte_perm (w0[2], w0[3], selector); + w0[2] = __byte_perm (w0[1], w0[2], selector); + w0[1] = __byte_perm (w0[0], w0[1], selector); + w0[0] = __byte_perm ( 0, w0[0], selector); + + break; + + case 1: + w3[1] = __byte_perm (w2[3], w3[0], selector); + w3[0] = __byte_perm (w2[2], w2[3], selector); + w2[3] = __byte_perm (w2[1], w2[2], selector); + w2[2] = __byte_perm (w2[0], w2[1], selector); + w2[1] = __byte_perm (w1[3], w2[0], selector); + w2[0] = __byte_perm (w1[2], w1[3], selector); + w1[3] = __byte_perm (w1[1], w1[2], selector); + w1[2] = __byte_perm (w1[0], w1[1], selector); + w1[1] = __byte_perm (w0[3], w1[0], selector); + w1[0] = __byte_perm (w0[2], w0[3], selector); + w0[3] = __byte_perm (w0[1], w0[2], selector); + w0[2] = __byte_perm (w0[0], w0[1], selector); + w0[1] = __byte_perm ( 0, w0[0], selector); + w0[0] = 0; + + break; + + case 2: + w3[1] = __byte_perm (w2[2], w2[3], selector); + w3[0] = __byte_perm (w2[1], w2[2], selector); + w2[3] = __byte_perm (w2[0], w2[1], selector); + w2[2] = __byte_perm (w1[3], w2[0], selector); + w2[1] = __byte_perm (w1[2], w1[3], selector); + w2[0] = __byte_perm (w1[1], w1[2], selector); + w1[3] = __byte_perm (w1[0], w1[1], selector); + w1[2] = __byte_perm (w0[3], w1[0], selector); + w1[1] = __byte_perm (w0[2], w0[3], selector); + w1[0] = __byte_perm (w0[1], w0[2], selector); + w0[3] = __byte_perm (w0[0], w0[1], selector); + w0[2] = __byte_perm ( 0, w0[0], selector); + w0[1] = 0; + w0[0] = 0; + + break; + + case 3: + w3[1] = __byte_perm (w2[1], w2[2], selector); + w3[0] = __byte_perm (w2[0], w2[1], selector); + w2[3] = __byte_perm (w1[3], w2[0], selector); + w2[2] = __byte_perm (w1[2], w1[3], selector); + w2[1] = __byte_perm (w1[1], w1[2], selector); + w2[0] = __byte_perm (w1[0], w1[1], selector); + w1[3] = __byte_perm (w0[3], w1[0], selector); + w1[2] = __byte_perm (w0[2], w0[3], selector); + w1[1] = __byte_perm (w0[1], w0[2], selector); + w1[0] = __byte_perm (w0[0], w0[1], selector); + w0[3] = __byte_perm ( 0, w0[0], selector); + w0[2] = 0; + w0[1] = 0; + w0[0] = 0; + + break; + + case 4: + w3[1] = __byte_perm (w2[0], w2[1], selector); + w3[0] = __byte_perm (w1[3], w2[0], selector); + w2[3] = __byte_perm (w1[2], w1[3], selector); + w2[2] = __byte_perm (w1[1], w1[2], selector); + w2[1] = __byte_perm (w1[0], w1[1], selector); + w2[0] = __byte_perm (w0[3], w1[0], selector); + w1[3] = __byte_perm (w0[2], w0[3], selector); + w1[2] = __byte_perm (w0[1], w0[2], selector); + w1[1] = __byte_perm (w0[0], w0[1], selector); + w1[0] = __byte_perm ( 0, w0[0], selector); + w0[3] = 0; + w0[2] = 0; + w0[1] = 0; + w0[0] = 0; + + break; + + case 5: + w3[1] = __byte_perm (w1[3], w2[0], selector); + w3[0] = __byte_perm (w1[2], w1[3], selector); + w2[3] = __byte_perm (w1[1], w1[2], selector); + w2[2] = __byte_perm (w1[0], w1[1], selector); + w2[1] = __byte_perm (w0[3], w1[0], selector); + w2[0] = __byte_perm (w0[2], w0[3], selector); + w1[3] = __byte_perm (w0[1], w0[2], selector); + w1[2] = __byte_perm (w0[0], w0[1], selector); + w1[1] = __byte_perm ( 0, w0[0], selector); + w1[0] = 0; + w0[3] = 0; + w0[2] = 0; + w0[1] = 0; + w0[0] = 0; + + break; + + case 6: + w3[1] = __byte_perm (w1[2], w1[3], selector); + w3[0] = __byte_perm (w1[1], w1[2], selector); + w2[3] = __byte_perm (w1[0], w1[1], selector); + w2[2] = __byte_perm (w0[3], w1[0], selector); + w2[1] = __byte_perm (w0[2], w0[3], selector); + w2[0] = __byte_perm (w0[1], w0[2], selector); + w1[3] = __byte_perm (w0[0], w0[1], selector); + w1[2] = __byte_perm ( 0, w0[0], selector); + w1[1] = 0; + w1[0] = 0; + w0[3] = 0; + w0[2] = 0; + w0[1] = 0; + w0[0] = 0; + + break; + + case 7: + w3[1] = __byte_perm (w1[1], w1[2], selector); + w3[0] = __byte_perm (w1[0], w1[1], selector); + w2[3] = __byte_perm (w0[3], w1[0], selector); + w2[2] = __byte_perm (w0[2], w0[3], selector); + w2[1] = __byte_perm (w0[1], w0[2], selector); + w2[0] = __byte_perm (w0[0], w0[1], selector); + w1[3] = __byte_perm ( 0, w0[0], selector); + w1[2] = 0; + w1[1] = 0; + w1[0] = 0; + w0[3] = 0; + w0[2] = 0; + w0[1] = 0; + w0[0] = 0; + + break; + + case 8: + w3[1] = __byte_perm (w1[0], w1[1], selector); + w3[0] = __byte_perm (w0[3], w1[0], selector); + w2[3] = __byte_perm (w0[2], w0[3], selector); + w2[2] = __byte_perm (w0[1], w0[2], selector); + w2[1] = __byte_perm (w0[0], w0[1], selector); + w2[0] = __byte_perm ( 0, w0[0], selector); + w1[3] = 0; + w1[2] = 0; + w1[1] = 0; + w1[0] = 0; + w0[3] = 0; + w0[2] = 0; + w0[1] = 0; + w0[0] = 0; + + break; + + case 9: + w3[1] = __byte_perm (w0[3], w1[0], selector); + w3[0] = __byte_perm (w0[2], w0[3], selector); + w2[3] = __byte_perm (w0[1], w0[2], selector); + w2[2] = __byte_perm (w0[0], w0[1], selector); + w2[1] = __byte_perm ( 0, w0[0], selector); + w2[0] = 0; + w1[3] = 0; + w1[2] = 0; + w1[1] = 0; + w1[0] = 0; + w0[3] = 0; + w0[2] = 0; + w0[1] = 0; + w0[0] = 0; + + break; + + case 10: + w3[1] = __byte_perm (w0[2], w0[3], selector); + w3[0] = __byte_perm (w0[1], w0[2], selector); + w2[3] = __byte_perm (w0[0], w0[1], selector); + w2[2] = __byte_perm ( 0, w0[0], selector); + w2[1] = 0; + w2[0] = 0; + w1[3] = 0; + w1[2] = 0; + w1[1] = 0; + w1[0] = 0; + w0[3] = 0; + w0[2] = 0; + w0[1] = 0; + w0[0] = 0; + + break; + + case 11: + w3[1] = __byte_perm (w0[1], w0[2], selector); + w3[0] = __byte_perm (w0[0], w0[1], selector); + w2[3] = __byte_perm ( 0, w0[0], selector); + w2[2] = 0; + w2[1] = 0; + w2[0] = 0; + w1[3] = 0; + w1[2] = 0; + w1[1] = 0; + w1[0] = 0; + w0[3] = 0; + w0[2] = 0; + w0[1] = 0; + w0[0] = 0; + + break; + + case 12: + w3[1] = __byte_perm (w0[0], w0[1], selector); + w3[0] = __byte_perm ( 0, w0[0], selector); + w2[3] = 0; + w2[2] = 0; + w2[1] = 0; + w2[0] = 0; + w1[3] = 0; + w1[2] = 0; + w1[1] = 0; + w1[0] = 0; + w0[3] = 0; + w0[2] = 0; + w0[1] = 0; + w0[0] = 0; + + break; + + case 13: + w3[1] = __byte_perm ( 0, w0[0], selector); + w3[0] = 0; + w2[3] = 0; + w2[2] = 0; + w2[1] = 0; + w2[0] = 0; + w1[3] = 0; + w1[2] = 0; + w1[1] = 0; + w1[0] = 0; + w0[3] = 0; + w0[2] = 0; + w0[1] = 0; + w0[0] = 0; + + break; + } + + #else + + u32x tmp0[4]; + u32x tmp1[4]; + u32x tmp2[1]; + + switch (offset % 4) + { + case 0: + tmp0[0] = w0[0]; + tmp0[1] = w0[1]; + tmp0[2] = w0[2]; + tmp0[3] = w0[3]; + tmp1[0] = w1[0]; + tmp1[1] = w1[1]; + tmp1[2] = w1[2]; + tmp1[3] = w1[3]; + tmp2[0] = 0; + break; + + case 1: + tmp0[0] = w0[0] << 8; + tmp0[1] = w0[0] >> 24 | w0[1] << 8; + tmp0[2] = w0[1] >> 24 | w0[2] << 8; + tmp0[3] = w0[2] >> 24 | w0[3] << 8; + tmp1[0] = w0[3] >> 24 | w1[0] << 8; + tmp1[1] = w1[0] >> 24 | w1[1] << 8; + tmp1[2] = w1[1] >> 24 | w1[2] << 8; + tmp1[3] = w1[2] >> 24 | w1[3] << 8; + tmp2[0] = w1[3] >> 24; + break; + + case 2: + tmp0[0] = w0[0] << 16; + tmp0[1] = w0[0] >> 16 | w0[1] << 16; + tmp0[2] = w0[1] >> 16 | w0[2] << 16; + tmp0[3] = w0[2] >> 16 | w0[3] << 16; + tmp1[0] = w0[3] >> 16 | w1[0] << 16; + tmp1[1] = w1[0] >> 16 | w1[1] << 16; + tmp1[2] = w1[1] >> 16 | w1[2] << 16; + tmp1[3] = w1[2] >> 16 | w1[3] << 16; + tmp2[0] = w1[3] >> 16; + break; + + case 3: + tmp0[0] = w0[0] << 24; + tmp0[1] = w0[0] >> 8 | w0[1] << 24; + tmp0[2] = w0[1] >> 8 | w0[2] << 24; + tmp0[3] = w0[2] >> 8 | w0[3] << 24; + tmp1[0] = w0[3] >> 8 | w1[0] << 24; + tmp1[1] = w1[0] >> 8 | w1[1] << 24; + tmp1[2] = w1[1] >> 8 | w1[2] << 24; + tmp1[3] = w1[2] >> 8 | w1[3] << 24; + tmp2[0] = w1[3] >> 8; + break; + } + + switch (offset / 4) + { + case 0: + w0[0] = tmp0[0]; + w0[1] = tmp0[1]; + w0[2] = tmp0[2]; + w0[3] = tmp0[3]; + w1[0] = tmp1[0]; + w1[1] = tmp1[1]; + w1[2] = tmp1[2]; + w1[3] = tmp1[3]; + w2[0] = tmp2[0]; + break; + + case 1: + w0[0] = 0; + w0[1] = tmp0[0]; + w0[2] = tmp0[1]; + w0[3] = tmp0[2]; + w1[0] = tmp0[3]; + w1[1] = tmp1[0]; + w1[2] = tmp1[1]; + w1[3] = tmp1[2]; + w2[0] = tmp1[3]; + w2[1] = tmp2[0]; + break; + + case 2: + w0[0] = 0; + w0[1] = 0; + w0[2] = tmp0[0]; + w0[3] = tmp0[1]; + w1[0] = tmp0[2]; + w1[1] = tmp0[3]; + w1[2] = tmp1[0]; + w1[3] = tmp1[1]; + w2[0] = tmp1[2]; + w2[1] = tmp1[3]; + w2[2] = tmp2[0]; + break; + + case 3: + w0[0] = 0; + w0[1] = 0; + w0[2] = 0; + w0[3] = tmp0[0]; + w1[0] = tmp0[1]; + w1[1] = tmp0[2]; + w1[2] = tmp0[3]; + w1[3] = tmp1[0]; + w2[0] = tmp1[1]; + w2[1] = tmp1[2]; + w2[2] = tmp1[3]; + w2[3] = tmp2[0]; + break; + + case 4: + w0[0] = 0; + w0[1] = 0; + w0[2] = 0; + w0[3] = 0; + w1[0] = tmp0[0]; + w1[1] = tmp0[1]; + w1[2] = tmp0[2]; + w1[3] = tmp0[3]; + w2[0] = tmp1[0]; + w2[1] = tmp1[1]; + w2[2] = tmp1[2]; + w2[3] = tmp1[3]; + w3[0] = tmp2[0]; + break; + + case 5: + w0[0] = 0; + w0[1] = 0; + w0[2] = 0; + w0[3] = 0; + w1[0] = 0; + w1[1] = tmp0[0]; + w1[2] = tmp0[1]; + w1[3] = tmp0[2]; + w2[0] = tmp0[3]; + w2[1] = tmp1[0]; + w2[2] = tmp1[1]; + w2[3] = tmp1[2]; + w3[0] = tmp1[3]; + w3[1] = tmp2[0]; + break; + + case 6: + w0[0] = 0; + w0[1] = 0; + w0[2] = 0; + w0[3] = 0; + w1[0] = 0; + w1[1] = 0; + w1[2] = tmp0[0]; + w1[3] = tmp0[1]; + w2[0] = tmp0[2]; + w2[1] = tmp0[3]; + w2[2] = tmp1[0]; + w2[3] = tmp1[1]; + w3[0] = tmp1[2]; + w3[1] = tmp1[3]; + w3[2] = tmp2[0]; + break; + + case 7: + w0[0] = 0; + w0[1] = 0; + w0[2] = 0; + w0[3] = 0; + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = tmp0[0]; + w2[0] = tmp0[1]; + w2[1] = tmp0[2]; + w2[2] = tmp0[3]; + w2[3] = tmp1[0]; + w3[0] = tmp1[1]; + w3[1] = tmp1[2]; + w3[2] = tmp1[3]; + w3[3] = tmp2[0]; + break; + + case 8: + w0[0] = 0; + w0[1] = 0; + w0[2] = 0; + w0[3] = 0; + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + w2[0] = tmp0[0]; + w2[1] = tmp0[1]; + w2[2] = tmp0[2]; + w2[3] = tmp0[3]; + w3[0] = tmp1[0]; + w3[1] = tmp1[1]; + w3[2] = tmp1[2]; + w3[3] = tmp1[3]; + break; + + case 9: + w0[0] = 0; + w0[1] = 0; + w0[2] = 0; + w0[3] = 0; + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + w2[0] = 0; + w2[1] = tmp0[0]; + w2[2] = tmp0[1]; + w2[3] = tmp0[2]; + w3[0] = tmp0[3]; + w3[1] = tmp1[0]; + w3[2] = tmp1[1]; + w3[3] = tmp1[2]; + break; + + case 10: + w0[0] = 0; + w0[1] = 0; + w0[2] = 0; + w0[3] = 0; + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + w2[0] = 0; + w2[1] = 0; + w2[2] = tmp0[0]; + w2[3] = tmp0[1]; + w3[0] = tmp0[2]; + w3[1] = tmp0[3]; + w3[2] = tmp1[0]; + w3[3] = tmp1[1]; + break; + + case 11: + w0[0] = 0; + w0[1] = 0; + w0[2] = 0; + w0[3] = 0; + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = tmp0[0]; + w3[0] = tmp0[1]; + w3[1] = tmp0[2]; + w3[2] = tmp0[3]; + w3[3] = tmp1[0]; + break; + + case 12: + w0[0] = 0; + w0[1] = 0; + w0[2] = 0; + w0[3] = 0; + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + w3[0] = tmp0[0]; + w3[1] = tmp0[1]; + w3[2] = tmp0[2]; + w3[3] = tmp0[3]; + break; + + case 13: + w0[0] = 0; + w0[1] = 0; + w0[2] = 0; + w0[3] = 0; + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + w3[0] = 0; + w3[1] = tmp0[0]; + w3[2] = tmp0[1]; + w3[3] = tmp0[2]; + break; + + } + + #endif +} + +__device__ __constant__ comb_t c_combs[1024]; + +extern "C" __global__ void __launch_bounds__ (256, 1) amp (pw_t *pws, pw_t *pws_amp, gpu_rule_t *rules_buf, comb_t *combs_buf, bf_t *bfs_buf, const u32 combs_mode, const u32 gid_max) +{ + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + const u32 pw_l_len = pws[gid].pw_len; + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_r_len = c_combs[0].pw_len; + + u32x wordr0[4]; + + wordr0[0] = c_combs[0].i[0]; + wordr0[1] = c_combs[0].i[1]; + wordr0[2] = c_combs[0].i[2]; + wordr0[3] = c_combs[0].i[3]; + + u32x wordr1[4]; + + wordr1[0] = c_combs[0].i[4]; + wordr1[1] = c_combs[0].i[5]; + wordr1[2] = c_combs[0].i[6]; + wordr1[3] = c_combs[0].i[7]; + + u32x wordr2[4]; + + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + + u32x wordr3[4]; + + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, pw_r_len); + } + + u32x w0[4]; + + w0[0] = wordl0[0] | wordr0[0]; + w0[1] = wordl0[1] | wordr0[1]; + w0[2] = wordl0[2] | wordr0[2]; + w0[3] = wordl0[3] | wordr0[3]; + + u32x w1[4]; + + w1[0] = wordl1[0] | wordr1[0]; + w1[1] = wordl1[1] | wordr1[1]; + w1[2] = wordl1[2] | wordr1[2]; + w1[3] = wordl1[3] | wordr1[3]; + + u32x w2[4]; + + w2[0] = wordl2[0] | wordr2[0]; + w2[1] = wordl2[1] | wordr2[1]; + w2[2] = wordl2[2] | wordr2[2]; + w2[3] = wordl2[3] | wordr2[3]; + + u32x w3[4]; + + w3[0] = wordl3[0] | wordr3[0]; + w3[1] = wordl3[1] | wordr3[1]; + w3[2] = wordl3[2] | wordr3[2]; + w3[3] = wordl3[3] | wordr3[3]; + + const u32 pw_len = pw_l_len + pw_r_len; + + pws_amp[gid].i[ 0] = w0[0]; + pws_amp[gid].i[ 1] = w0[1]; + pws_amp[gid].i[ 2] = w0[2]; + pws_amp[gid].i[ 3] = w0[3]; + pws_amp[gid].i[ 4] = w1[0]; + pws_amp[gid].i[ 5] = w1[1]; + pws_amp[gid].i[ 6] = w1[2]; + pws_amp[gid].i[ 7] = w1[3]; + pws_amp[gid].i[ 8] = w2[0]; + pws_amp[gid].i[ 9] = w2[1]; + pws_amp[gid].i[10] = w2[2]; + pws_amp[gid].i[11] = w2[3]; + pws_amp[gid].i[12] = w3[0]; + pws_amp[gid].i[13] = w3[1]; + pws_amp[gid].i[14] = w3[2]; + pws_amp[gid].i[15] = w3[3]; + + pws_amp[gid].pw_len = pw_len; +} diff --git a/nv/amp_a3_v1.cu b/nv/amp_a3_v1.cu new file mode 100644 index 0000000000..9fd5ebf645 --- /dev/null +++ b/nv/amp_a3_v1.cu @@ -0,0 +1,63 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define VECT_SIZE1 + +#include "include/constants.h" +#include "types_nv.c" + +__device__ __constant__ bf_t c_bfs[1024]; + +extern "C" __global__ void __launch_bounds__ (256, 1) amp (pw_t *pws, pw_t *pws_amp, gpu_rule_t *rules_buf, comb_t *combs_buf, bf_t *bfs_buf, const u32 combs_mode, const u32 gid_max) +{ + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + const u32 pw_len = pws[gid].pw_len; + + u32x w0[4]; + u32x w1[4]; + u32x w2[4]; + u32x w3[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + w2[0] = pws[gid].i[ 8]; + w2[1] = pws[gid].i[ 9]; + w2[2] = pws[gid].i[10]; + w2[3] = pws[gid].i[11]; + w3[0] = pws[gid].i[12]; + w3[1] = pws[gid].i[13]; + w3[2] = pws[gid].i[14]; + w3[3] = pws[gid].i[15]; + + const u32 w0r = c_bfs[0].i; + + pws_amp[gid].i[ 0] = w0[0] | w0r; + pws_amp[gid].i[ 1] = w0[1]; + pws_amp[gid].i[ 2] = w0[2]; + pws_amp[gid].i[ 3] = w0[3]; + pws_amp[gid].i[ 4] = w1[0]; + pws_amp[gid].i[ 5] = w1[1]; + pws_amp[gid].i[ 6] = w1[2]; + pws_amp[gid].i[ 7] = w1[3]; + pws_amp[gid].i[ 8] = w2[0]; + pws_amp[gid].i[ 9] = w2[1]; + pws_amp[gid].i[10] = w2[2]; + pws_amp[gid].i[11] = w2[3]; + pws_amp[gid].i[12] = w3[0]; + pws_amp[gid].i[13] = w3[1]; + pws_amp[gid].i[14] = w3[2]; + pws_amp[gid].i[15] = w3[3]; + + pws_amp[gid].pw_len = pw_len; +} diff --git a/nv/amp_a3_v2.cu b/nv/amp_a3_v2.cu new file mode 100644 index 0000000000..f7e18814e8 --- /dev/null +++ b/nv/amp_a3_v2.cu @@ -0,0 +1,63 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define VECT_SIZE2 + +#include "include/constants.h" +#include "types_nv.c" + +__device__ __constant__ bf_t c_bfs[1024]; + +extern "C" __global__ void __launch_bounds__ (256, 1) amp (pw_t *pws, pw_t *pws_amp, gpu_rule_t *rules_buf, comb_t *combs_buf, bf_t *bfs_buf, const u32 combs_mode, const u32 gid_max) +{ + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + const u32 pw_len = pws[gid].pw_len; + + u32x w0[4]; + u32x w1[4]; + u32x w2[4]; + u32x w3[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + w2[0] = pws[gid].i[ 8]; + w2[1] = pws[gid].i[ 9]; + w2[2] = pws[gid].i[10]; + w2[3] = pws[gid].i[11]; + w3[0] = pws[gid].i[12]; + w3[1] = pws[gid].i[13]; + w3[2] = pws[gid].i[14]; + w3[3] = pws[gid].i[15]; + + const u32 w0r = c_bfs[0].i; + + pws_amp[gid].i[ 0] = w0[0] | w0r; + pws_amp[gid].i[ 1] = w0[1]; + pws_amp[gid].i[ 2] = w0[2]; + pws_amp[gid].i[ 3] = w0[3]; + pws_amp[gid].i[ 4] = w1[0]; + pws_amp[gid].i[ 5] = w1[1]; + pws_amp[gid].i[ 6] = w1[2]; + pws_amp[gid].i[ 7] = w1[3]; + pws_amp[gid].i[ 8] = w2[0]; + pws_amp[gid].i[ 9] = w2[1]; + pws_amp[gid].i[10] = w2[2]; + pws_amp[gid].i[11] = w2[3]; + pws_amp[gid].i[12] = w3[0]; + pws_amp[gid].i[13] = w3[1]; + pws_amp[gid].i[14] = w3[2]; + pws_amp[gid].i[15] = w3[3]; + + pws_amp[gid].pw_len = pw_len; +} diff --git a/nv/amp_a3_v4.cu b/nv/amp_a3_v4.cu new file mode 100644 index 0000000000..082bbc7089 --- /dev/null +++ b/nv/amp_a3_v4.cu @@ -0,0 +1,63 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define VECT_SIZE4 + +#include "include/constants.h" +#include "types_nv.c" + +__device__ __constant__ bf_t c_bfs[1024]; + +extern "C" __global__ void __launch_bounds__ (256, 1) amp (pw_t *pws, pw_t *pws_amp, gpu_rule_t *rules_buf, comb_t *combs_buf, bf_t *bfs_buf, const u32 combs_mode, const u32 gid_max) +{ + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + const u32 pw_len = pws[gid].pw_len; + + u32x w0[4]; + u32x w1[4]; + u32x w2[4]; + u32x w3[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + w2[0] = pws[gid].i[ 8]; + w2[1] = pws[gid].i[ 9]; + w2[2] = pws[gid].i[10]; + w2[3] = pws[gid].i[11]; + w3[0] = pws[gid].i[12]; + w3[1] = pws[gid].i[13]; + w3[2] = pws[gid].i[14]; + w3[3] = pws[gid].i[15]; + + const u32 w0r = c_bfs[0].i; + + pws_amp[gid].i[ 0] = w0[0] | w0r; + pws_amp[gid].i[ 1] = w0[1]; + pws_amp[gid].i[ 2] = w0[2]; + pws_amp[gid].i[ 3] = w0[3]; + pws_amp[gid].i[ 4] = w1[0]; + pws_amp[gid].i[ 5] = w1[1]; + pws_amp[gid].i[ 6] = w1[2]; + pws_amp[gid].i[ 7] = w1[3]; + pws_amp[gid].i[ 8] = w2[0]; + pws_amp[gid].i[ 9] = w2[1]; + pws_amp[gid].i[10] = w2[2]; + pws_amp[gid].i[11] = w2[3]; + pws_amp[gid].i[12] = w3[0]; + pws_amp[gid].i[13] = w3[1]; + pws_amp[gid].i[14] = w3[2]; + pws_amp[gid].i[15] = w3[3]; + + pws_amp[gid].pw_len = pw_len; +} diff --git a/nv/check_multi_vect1_comp4.c b/nv/check_multi_vect1_comp4.c new file mode 100644 index 0000000000..39772fc19c --- /dev/null +++ b/nv/check_multi_vect1_comp4.c @@ -0,0 +1,34 @@ +u32 digest_tp[4]; + +digest_tp[0] = r0; +digest_tp[1] = r1; +digest_tp[2] = r2; +digest_tp[3] = r3; + +if (check (digest_tp, + bitmaps_buf_s1_a, + bitmaps_buf_s1_b, + bitmaps_buf_s1_c, + bitmaps_buf_s1_d, + bitmaps_buf_s2_a, + bitmaps_buf_s2_b, + bitmaps_buf_s2_c, + bitmaps_buf_s2_d, + bitmap_mask, + bitmap_shift1, + bitmap_shift2)) +{ + int hash_pos = find_hash (digest_tp, digests_cnt, &digests_buf[digests_offset]); + + if (hash_pos != -1) + { + const u32 final_hash_pos = digests_offset + hash_pos; + + if (atomicAdd (&hashes_shown[final_hash_pos], 1) == 0) + { + mark_hash_s0 (plains_buf, hashes_shown, final_hash_pos, gid, il_pos); + + d_return_buf[lid] = 1; + } + } +} diff --git a/nv/check_multi_vect1_comp4_warp.c b/nv/check_multi_vect1_comp4_warp.c new file mode 100644 index 0000000000..500d37dd39 --- /dev/null +++ b/nv/check_multi_vect1_comp4_warp.c @@ -0,0 +1,34 @@ +u32 digest_tp[4]; + +digest_tp[0] = r0; +digest_tp[1] = r1; +digest_tp[2] = r2; +digest_tp[3] = r3; + +if (check (digest_tp, + bitmaps_buf_s1_a, + bitmaps_buf_s1_b, + bitmaps_buf_s1_c, + bitmaps_buf_s1_d, + bitmaps_buf_s2_a, + bitmaps_buf_s2_b, + bitmaps_buf_s2_c, + bitmaps_buf_s2_d, + bitmap_mask, + bitmap_shift1, + bitmap_shift2)) +{ + int hash_pos = find_hash (digest_tp, digests_cnt, &digests_buf[digests_offset]); + + if (hash_pos != -1) + { + const u32 final_hash_pos = digests_offset + hash_pos; + + if ((atomicAdd (&hashes_shown[final_hash_pos], 1) == 0) && (check_vector_accessible (il_pos, bf_loops, bfs_cnt, 0) == 1)) + { + mark_hash_s0_warp (plains_buf, hashes_shown, final_hash_pos, gid, il_pos); + + d_return_buf[lid] = 1; + } + } +} diff --git a/nv/check_multi_vect1_comp4_warp_bs.c b/nv/check_multi_vect1_comp4_warp_bs.c new file mode 100644 index 0000000000..031227ee15 --- /dev/null +++ b/nv/check_multi_vect1_comp4_warp_bs.c @@ -0,0 +1,34 @@ +u32 digest_tp[4]; + +digest_tp[0] = r0; +digest_tp[1] = r1; +digest_tp[2] = r2; +digest_tp[3] = r3; + +if (check (digest_tp, + bitmaps_buf_s1_a, + bitmaps_buf_s1_b, + bitmaps_buf_s1_c, + bitmaps_buf_s1_d, + bitmaps_buf_s2_a, + bitmaps_buf_s2_b, + bitmaps_buf_s2_c, + bitmaps_buf_s2_d, + bitmap_mask, + bitmap_shift1, + bitmap_shift2)) +{ + int hash_pos = find_hash (digest_tp, digests_cnt, &digests_buf[digests_offset]); + + if (hash_pos != -1) + { + const u32 final_hash_pos = digests_offset + hash_pos; + + if ((atomicAdd (&hashes_shown[final_hash_pos], 1) == 0) && (check_vector_accessible (il_pos + slice, bf_loops, bfs_cnt, 0) == 1)) + { + mark_hash_s0_warp (plains_buf, hashes_shown, final_hash_pos, gid, il_pos + slice); + + d_return_buf[lid] = 1; + } + } +} diff --git a/nv/check_multi_vect2_comp4.c b/nv/check_multi_vect2_comp4.c new file mode 100644 index 0000000000..c1a7f65bcd --- /dev/null +++ b/nv/check_multi_vect2_comp4.c @@ -0,0 +1,67 @@ +u32 digest_tp[4]; + +digest_tp[0] = r0.x; +digest_tp[1] = r1.x; +digest_tp[2] = r2.x; +digest_tp[3] = r3.x; + +if (check (digest_tp, + bitmaps_buf_s1_a, + bitmaps_buf_s1_b, + bitmaps_buf_s1_c, + bitmaps_buf_s1_d, + bitmaps_buf_s2_a, + bitmaps_buf_s2_b, + bitmaps_buf_s2_c, + bitmaps_buf_s2_d, + bitmap_mask, + bitmap_shift1, + bitmap_shift2)) +{ + int hash_pos = find_hash (digest_tp, digests_cnt, &digests_buf[digests_offset]); + + if (hash_pos != -1) + { + const u32 final_hash_pos = digests_offset + hash_pos; + + if (atomicAdd (&hashes_shown[final_hash_pos], 1) == 0) + { + mark_hash_s0 (plains_buf, hashes_shown, final_hash_pos, gid, il_pos); + + d_return_buf[lid] = 1; + } + } +} + +digest_tp[0] = r0.y; +digest_tp[1] = r1.y; +digest_tp[2] = r2.y; +digest_tp[3] = r3.y; + +if (check (digest_tp, + bitmaps_buf_s1_a, + bitmaps_buf_s1_b, + bitmaps_buf_s1_c, + bitmaps_buf_s1_d, + bitmaps_buf_s2_a, + bitmaps_buf_s2_b, + bitmaps_buf_s2_c, + bitmaps_buf_s2_d, + bitmap_mask, + bitmap_shift1, + bitmap_shift2)) +{ + int hash_pos = find_hash (digest_tp, digests_cnt, &digests_buf[digests_offset]); + + if (hash_pos != -1) + { + const u32 final_hash_pos = digests_offset + hash_pos; + + if (atomicAdd (&hashes_shown[final_hash_pos], 1) == 0) + { + mark_hash_s1 (plains_buf, hashes_shown, final_hash_pos, gid, il_pos); + + d_return_buf[lid] = 1; + } + } +} diff --git a/nv/check_multi_vect2_comp4_warp.c b/nv/check_multi_vect2_comp4_warp.c new file mode 100644 index 0000000000..749790c6e9 --- /dev/null +++ b/nv/check_multi_vect2_comp4_warp.c @@ -0,0 +1,67 @@ +u32 digest_tp[4]; + +digest_tp[0] = r0.x; +digest_tp[1] = r1.x; +digest_tp[2] = r2.x; +digest_tp[3] = r3.x; + +if (check (digest_tp, + bitmaps_buf_s1_a, + bitmaps_buf_s1_b, + bitmaps_buf_s1_c, + bitmaps_buf_s1_d, + bitmaps_buf_s2_a, + bitmaps_buf_s2_b, + bitmaps_buf_s2_c, + bitmaps_buf_s2_d, + bitmap_mask, + bitmap_shift1, + bitmap_shift2)) +{ + int hash_pos = find_hash (digest_tp, digests_cnt, &digests_buf[digests_offset]); + + if (hash_pos != -1) + { + const u32 final_hash_pos = digests_offset + hash_pos; + + if ((atomicAdd (&hashes_shown[final_hash_pos], 1) == 0) && (check_vector_accessible (il_pos, bf_loops, bfs_cnt, 0) == 1)) + { + mark_hash_s0_warp (plains_buf, hashes_shown, final_hash_pos, gid, il_pos); + + d_return_buf[lid] = 1; + } + } +} + +digest_tp[0] = r0.y; +digest_tp[1] = r1.y; +digest_tp[2] = r2.y; +digest_tp[3] = r3.y; + +if (check (digest_tp, + bitmaps_buf_s1_a, + bitmaps_buf_s1_b, + bitmaps_buf_s1_c, + bitmaps_buf_s1_d, + bitmaps_buf_s2_a, + bitmaps_buf_s2_b, + bitmaps_buf_s2_c, + bitmaps_buf_s2_d, + bitmap_mask, + bitmap_shift1, + bitmap_shift2)) +{ + int hash_pos = find_hash (digest_tp, digests_cnt, &digests_buf[digests_offset]); + + if (hash_pos != -1) + { + const u32 final_hash_pos = digests_offset + hash_pos; + + if ((atomicAdd (&hashes_shown[final_hash_pos], 1) == 0) && (check_vector_accessible (il_pos, bf_loops, bfs_cnt, 1) == 1)) + { + mark_hash_s1_warp (plains_buf, hashes_shown, final_hash_pos, gid, il_pos); + + d_return_buf[lid] = 1; + } + } +} diff --git a/nv/check_multi_vect4_comp4.c b/nv/check_multi_vect4_comp4.c new file mode 100644 index 0000000000..1e83553ec1 --- /dev/null +++ b/nv/check_multi_vect4_comp4.c @@ -0,0 +1,133 @@ +u32 digest_tp[4]; + +digest_tp[0] = r0.x; +digest_tp[1] = r1.x; +digest_tp[2] = r2.x; +digest_tp[3] = r3.x; + +if (check (digest_tp, + bitmaps_buf_s1_a, + bitmaps_buf_s1_b, + bitmaps_buf_s1_c, + bitmaps_buf_s1_d, + bitmaps_buf_s2_a, + bitmaps_buf_s2_b, + bitmaps_buf_s2_c, + bitmaps_buf_s2_d, + bitmap_mask, + bitmap_shift1, + bitmap_shift2)) +{ + int hash_pos = find_hash (digest_tp, digests_cnt, &digests_buf[digests_offset]); + + if (hash_pos != -1) + { + const u32 final_hash_pos = digests_offset + hash_pos; + + if (atomicAdd (&hashes_shown[final_hash_pos], 1) == 0) + { + mark_hash_s0 (plains_buf, hashes_shown, final_hash_pos, gid, il_pos); + + d_return_buf[lid] = 1; + } + } +} + +digest_tp[0] = r0.y; +digest_tp[1] = r1.y; +digest_tp[2] = r2.y; +digest_tp[3] = r3.y; + +if (check (digest_tp, + bitmaps_buf_s1_a, + bitmaps_buf_s1_b, + bitmaps_buf_s1_c, + bitmaps_buf_s1_d, + bitmaps_buf_s2_a, + bitmaps_buf_s2_b, + bitmaps_buf_s2_c, + bitmaps_buf_s2_d, + bitmap_mask, + bitmap_shift1, + bitmap_shift2)) +{ + int hash_pos = find_hash (digest_tp, digests_cnt, &digests_buf[digests_offset]); + + if (hash_pos != -1) + { + const u32 final_hash_pos = digests_offset + hash_pos; + + if (atomicAdd (&hashes_shown[final_hash_pos], 1) == 0) + { + mark_hash_s1 (plains_buf, hashes_shown, final_hash_pos, gid, il_pos); + + d_return_buf[lid] = 1; + } + } +} + +digest_tp[0] = r0.z; +digest_tp[1] = r1.z; +digest_tp[2] = r2.z; +digest_tp[3] = r3.z; + +if (check (digest_tp, + bitmaps_buf_s1_a, + bitmaps_buf_s1_b, + bitmaps_buf_s1_c, + bitmaps_buf_s1_d, + bitmaps_buf_s2_a, + bitmaps_buf_s2_b, + bitmaps_buf_s2_c, + bitmaps_buf_s2_d, + bitmap_mask, + bitmap_shift1, + bitmap_shift2)) +{ + int hash_pos = find_hash (digest_tp, digests_cnt, &digests_buf[digests_offset]); + + if (hash_pos != -1) + { + const u32 final_hash_pos = digests_offset + hash_pos; + + if (atomicAdd (&hashes_shown[final_hash_pos], 1) == 0) + { + mark_hash_s2 (plains_buf, hashes_shown, final_hash_pos, gid, il_pos); + + d_return_buf[lid] = 1; + } + } +} + +digest_tp[0] = r0.w; +digest_tp[1] = r1.w; +digest_tp[2] = r2.w; +digest_tp[3] = r3.w; + +if (check (digest_tp, + bitmaps_buf_s1_a, + bitmaps_buf_s1_b, + bitmaps_buf_s1_c, + bitmaps_buf_s1_d, + bitmaps_buf_s2_a, + bitmaps_buf_s2_b, + bitmaps_buf_s2_c, + bitmaps_buf_s2_d, + bitmap_mask, + bitmap_shift1, + bitmap_shift2)) +{ + int hash_pos = find_hash (digest_tp, digests_cnt, &digests_buf[digests_offset]); + + if (hash_pos != -1) + { + const u32 final_hash_pos = digests_offset + hash_pos; + + if (atomicAdd (&hashes_shown[final_hash_pos], 1) == 0) + { + mark_hash_s3 (plains_buf, hashes_shown, final_hash_pos, gid, il_pos); + + d_return_buf[lid] = 1; + } + } +} diff --git a/nv/check_multi_vect4_comp4_warp.c b/nv/check_multi_vect4_comp4_warp.c new file mode 100644 index 0000000000..5710ba430c --- /dev/null +++ b/nv/check_multi_vect4_comp4_warp.c @@ -0,0 +1,133 @@ +u32 digest_tp[4]; + +digest_tp[0] = r0.x; +digest_tp[1] = r1.x; +digest_tp[2] = r2.x; +digest_tp[3] = r3.x; + +if (check (digest_tp, + bitmaps_buf_s1_a, + bitmaps_buf_s1_b, + bitmaps_buf_s1_c, + bitmaps_buf_s1_d, + bitmaps_buf_s2_a, + bitmaps_buf_s2_b, + bitmaps_buf_s2_c, + bitmaps_buf_s2_d, + bitmap_mask, + bitmap_shift1, + bitmap_shift2)) +{ + int hash_pos = find_hash (digest_tp, digests_cnt, &digests_buf[digests_offset]); + + if (hash_pos != -1) + { + const u32 final_hash_pos = digests_offset + hash_pos; + + if ((atomicAdd (&hashes_shown[final_hash_pos], 1) == 0) && (check_vector_accessible (il_pos, bf_loops, bfs_cnt, 0) == 1)) + { + mark_hash_s0_warp (plains_buf, hashes_shown, final_hash_pos, gid, il_pos); + + d_return_buf[lid] = 1; + } + } +} + +digest_tp[0] = r0.y; +digest_tp[1] = r1.y; +digest_tp[2] = r2.y; +digest_tp[3] = r3.y; + +if (check (digest_tp, + bitmaps_buf_s1_a, + bitmaps_buf_s1_b, + bitmaps_buf_s1_c, + bitmaps_buf_s1_d, + bitmaps_buf_s2_a, + bitmaps_buf_s2_b, + bitmaps_buf_s2_c, + bitmaps_buf_s2_d, + bitmap_mask, + bitmap_shift1, + bitmap_shift2)) +{ + int hash_pos = find_hash (digest_tp, digests_cnt, &digests_buf[digests_offset]); + + if (hash_pos != -1) + { + const u32 final_hash_pos = digests_offset + hash_pos; + + if ((atomicAdd (&hashes_shown[final_hash_pos], 1) == 0) && (check_vector_accessible (il_pos, bf_loops, bfs_cnt, 1) == 1)) + { + mark_hash_s1_warp (plains_buf, hashes_shown, final_hash_pos, gid, il_pos); + + d_return_buf[lid] = 1; + } + } +} + +digest_tp[0] = r0.z; +digest_tp[1] = r1.z; +digest_tp[2] = r2.z; +digest_tp[3] = r3.z; + +if (check (digest_tp, + bitmaps_buf_s1_a, + bitmaps_buf_s1_b, + bitmaps_buf_s1_c, + bitmaps_buf_s1_d, + bitmaps_buf_s2_a, + bitmaps_buf_s2_b, + bitmaps_buf_s2_c, + bitmaps_buf_s2_d, + bitmap_mask, + bitmap_shift1, + bitmap_shift2)) +{ + int hash_pos = find_hash (digest_tp, digests_cnt, &digests_buf[digests_offset]); + + if (hash_pos != -1) + { + const u32 final_hash_pos = digests_offset + hash_pos; + + if ((atomicAdd (&hashes_shown[final_hash_pos], 1) == 0) && (check_vector_accessible (il_pos, bf_loops, bfs_cnt, 2) == 1)) + { + mark_hash_s2_warp (plains_buf, hashes_shown, final_hash_pos, gid, il_pos); + + d_return_buf[lid] = 1; + } + } +} + +digest_tp[0] = r0.w; +digest_tp[1] = r1.w; +digest_tp[2] = r2.w; +digest_tp[3] = r3.w; + +if (check (digest_tp, + bitmaps_buf_s1_a, + bitmaps_buf_s1_b, + bitmaps_buf_s1_c, + bitmaps_buf_s1_d, + bitmaps_buf_s2_a, + bitmaps_buf_s2_b, + bitmaps_buf_s2_c, + bitmaps_buf_s2_d, + bitmap_mask, + bitmap_shift1, + bitmap_shift2)) +{ + int hash_pos = find_hash (digest_tp, digests_cnt, &digests_buf[digests_offset]); + + if (hash_pos != -1) + { + const u32 final_hash_pos = digests_offset + hash_pos; + + if ((atomicAdd (&hashes_shown[final_hash_pos], 1) == 0) && (check_vector_accessible (il_pos, bf_loops, bfs_cnt, 3) == 1)) + { + mark_hash_s3_warp (plains_buf, hashes_shown, final_hash_pos, gid, il_pos); + + d_return_buf[lid] = 1; + } + } +} diff --git a/nv/check_single_vect1_comp4.c b/nv/check_single_vect1_comp4.c new file mode 100644 index 0000000000..c49d06ef93 --- /dev/null +++ b/nv/check_single_vect1_comp4.c @@ -0,0 +1,14 @@ +if ((r0 == search[0]) + && (r1 == search[1]) + && (r2 == search[2]) + && (r3 == search[3])) +{ + const u32 final_hash_pos = digests_offset + 0; + + if (atomicAdd (&hashes_shown[final_hash_pos], 1) == 0) + { + mark_hash_s0 (plains_buf, hashes_shown, final_hash_pos, gid, il_pos); + + d_return_buf[lid] = 1; + } +} diff --git a/nv/check_single_vect1_comp4_warp.c b/nv/check_single_vect1_comp4_warp.c new file mode 100644 index 0000000000..ee990a664b --- /dev/null +++ b/nv/check_single_vect1_comp4_warp.c @@ -0,0 +1,14 @@ +if ((r0 == search[0]) + && (r1 == search[1]) + && (r2 == search[2]) + && (r3 == search[3])) +{ + const u32 final_hash_pos = digests_offset + 0; + + if ((atomicAdd (&hashes_shown[final_hash_pos], 1) == 0) && (check_vector_accessible (il_pos, bf_loops, bfs_cnt, 0) == 1)) + { + mark_hash_s0_warp (plains_buf, hashes_shown, final_hash_pos, gid, il_pos); + + d_return_buf[lid] = 1; + } +} diff --git a/nv/check_single_vect1_comp4_warp_bs.c b/nv/check_single_vect1_comp4_warp_bs.c new file mode 100644 index 0000000000..3d5729f617 --- /dev/null +++ b/nv/check_single_vect1_comp4_warp_bs.c @@ -0,0 +1,3 @@ +mark_hash_s0_warp (plains_buf, hashes_shown, 0, gid, il_pos + slice); + +d_return_buf[lid] = 1; diff --git a/nv/check_single_vect2_comp4.c b/nv/check_single_vect2_comp4.c new file mode 100644 index 0000000000..f7a79873a9 --- /dev/null +++ b/nv/check_single_vect2_comp4.c @@ -0,0 +1,29 @@ +if ((r0.x == search[0]) + && (r1.x == search[1]) + && (r2.x == search[2]) + && (r3.x == search[3])) +{ + const u32 final_hash_pos = digests_offset + 0; + + if (atomicAdd (&hashes_shown[final_hash_pos], 1) == 0) + { + mark_hash_s0 (plains_buf, hashes_shown, final_hash_pos, gid, il_pos); + + d_return_buf[lid] = 1; + } +} + +if ((r0.y == search[0]) + && (r1.y == search[1]) + && (r2.y == search[2]) + && (r3.y == search[3])) +{ + const u32 final_hash_pos = digests_offset + 0; + + if (atomicAdd (&hashes_shown[final_hash_pos], 1) == 0) + { + mark_hash_s1 (plains_buf, hashes_shown, final_hash_pos, gid, il_pos); + + d_return_buf[lid] = 1; + } +} diff --git a/nv/check_single_vect2_comp4_warp.c b/nv/check_single_vect2_comp4_warp.c new file mode 100644 index 0000000000..fc261c5dc2 --- /dev/null +++ b/nv/check_single_vect2_comp4_warp.c @@ -0,0 +1,29 @@ +if ((r0.x == search[0]) + && (r1.x == search[1]) + && (r2.x == search[2]) + && (r3.x == search[3])) +{ + const u32 final_hash_pos = digests_offset + 0; + + if ((atomicAdd (&hashes_shown[final_hash_pos], 1) == 0) && (check_vector_accessible (il_pos, bf_loops, bfs_cnt, 0) == 1)) + { + mark_hash_s0_warp (plains_buf, hashes_shown, final_hash_pos, gid, il_pos); + + d_return_buf[lid] = 1; + } +} + +if ((r0.y == search[0]) + && (r1.y == search[1]) + && (r2.y == search[2]) + && (r3.y == search[3])) +{ + const u32 final_hash_pos = digests_offset + 0; + + if ((atomicAdd (&hashes_shown[final_hash_pos], 1) == 0) && (check_vector_accessible (il_pos, bf_loops, bfs_cnt, 1) == 1)) + { + mark_hash_s1_warp (plains_buf, hashes_shown, final_hash_pos, gid, il_pos); + + d_return_buf[lid] = 1; + } +} diff --git a/nv/check_single_vect4_comp4.c b/nv/check_single_vect4_comp4.c new file mode 100644 index 0000000000..cde5eb7c25 --- /dev/null +++ b/nv/check_single_vect4_comp4.c @@ -0,0 +1,59 @@ +if ((r0.x == search[0]) + && (r1.x == search[1]) + && (r2.x == search[2]) + && (r3.x == search[3])) +{ + const u32 final_hash_pos = digests_offset + 0; + + if (atomicAdd (&hashes_shown[final_hash_pos], 1) == 0) + { + mark_hash_s0 (plains_buf, hashes_shown, final_hash_pos, gid, il_pos); + + d_return_buf[lid] = 1; + } +} + +if ((r0.y == search[0]) + && (r1.y == search[1]) + && (r2.y == search[2]) + && (r3.y == search[3])) +{ + const u32 final_hash_pos = digests_offset + 0; + + if (atomicAdd (&hashes_shown[final_hash_pos], 1) == 0) + { + mark_hash_s1 (plains_buf, hashes_shown, final_hash_pos, gid, il_pos); + + d_return_buf[lid] = 1; + } +} + +if ((r0.z == search[0]) + && (r1.z == search[1]) + && (r2.z == search[2]) + && (r3.z == search[3])) +{ + const u32 final_hash_pos = digests_offset + 0; + + if (atomicAdd (&hashes_shown[final_hash_pos], 1) == 0) + { + mark_hash_s2 (plains_buf, hashes_shown, final_hash_pos, gid, il_pos); + + d_return_buf[lid] = 1; + } +} + +if ((r0.w == search[0]) + && (r1.w == search[1]) + && (r2.w == search[2]) + && (r3.w == search[3])) +{ + const u32 final_hash_pos = digests_offset + 0; + + if (atomicAdd (&hashes_shown[final_hash_pos], 1) == 0) + { + mark_hash_s3 (plains_buf, hashes_shown, final_hash_pos, gid, il_pos); + + d_return_buf[lid] = 1; + } +} diff --git a/nv/check_single_vect4_comp4_warp.c b/nv/check_single_vect4_comp4_warp.c new file mode 100644 index 0000000000..c54179462a --- /dev/null +++ b/nv/check_single_vect4_comp4_warp.c @@ -0,0 +1,59 @@ +if ((r0.x == search[0]) + && (r1.x == search[1]) + && (r2.x == search[2]) + && (r3.x == search[3])) +{ + const u32 final_hash_pos = digests_offset + 0; + + if ((atomicAdd (&hashes_shown[final_hash_pos], 1) == 0) && (check_vector_accessible (il_pos, bf_loops, bfs_cnt, 0) == 1)) + { + mark_hash_s0_warp (plains_buf, hashes_shown, final_hash_pos, gid, il_pos); + + d_return_buf[lid] = 1; + } +} + +if ((r0.y == search[0]) + && (r1.y == search[1]) + && (r2.y == search[2]) + && (r3.y == search[3])) +{ + const u32 final_hash_pos = digests_offset + 0; + + if ((atomicAdd (&hashes_shown[final_hash_pos], 1) == 0) && (check_vector_accessible (il_pos, bf_loops, bfs_cnt, 1) == 1)) + { + mark_hash_s1_warp (plains_buf, hashes_shown, final_hash_pos, gid, il_pos); + + d_return_buf[lid] = 1; + } +} + +if ((r0.z == search[0]) + && (r1.z == search[1]) + && (r2.z == search[2]) + && (r3.z == search[3])) +{ + const u32 final_hash_pos = digests_offset + 0; + + if ((atomicAdd (&hashes_shown[final_hash_pos], 1) == 0) && (check_vector_accessible (il_pos, bf_loops, bfs_cnt, 2) == 1)) + { + mark_hash_s2_warp (plains_buf, hashes_shown, final_hash_pos, gid, il_pos); + + d_return_buf[lid] = 1; + } +} + +if ((r0.w == search[0]) + && (r1.w == search[1]) + && (r2.w == search[2]) + && (r3.w == search[3])) +{ + const u32 final_hash_pos = digests_offset + 0; + + if ((atomicAdd (&hashes_shown[final_hash_pos], 1) == 0) && (check_vector_accessible (il_pos, bf_loops, bfs_cnt, 3) == 1)) + { + mark_hash_s3_warp (plains_buf, hashes_shown, final_hash_pos, gid, il_pos); + + d_return_buf[lid] = 1; + } +} diff --git a/nv/common_nv.c b/nv/common_nv.c new file mode 100644 index 0000000000..7ff8799c6e --- /dev/null +++ b/nv/common_nv.c @@ -0,0 +1,15025 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +__device__ static int device_memcmp (const u32 d1[4], const u32 *d2) +{ + if (d1[3] > d2[DGST_R3]) return ( 1); + if (d1[3] < d2[DGST_R3]) return (-1); + if (d1[2] > d2[DGST_R2]) return ( 1); + if (d1[2] < d2[DGST_R2]) return (-1); + if (d1[1] > d2[DGST_R1]) return ( 1); + if (d1[1] < d2[DGST_R1]) return (-1); + if (d1[0] > d2[DGST_R0]) return ( 1); + if (d1[0] < d2[DGST_R0]) return (-1); + + return (0); +} + +__device__ static int find_hash (const u32 digest[4], const u32 digests_cnt, const digest_t *digests_buf) +{ + for (u32 l = 0, r = digests_cnt; r; r >>= 1) + { + const u32 m = r >> 1; + + const u32 c = l + m; + + const int cmp = device_memcmp (digest, digests_buf[c].digest_buf); + + if (cmp > 0) + { + l += m + 1; + + r--; + } + + if (cmp == 0) return (c); + } + + return (-1); +} + +__device__ static u32 check_bitmap (const u32 *bitmap, const u32 bitmap_mask, const u32 bitmap_shift, const u32 digest) +{ + return (bitmap[(digest >> bitmap_shift) & bitmap_mask] & (1 << (digest & 0x1f))); +} + +__device__ static u32 check (const u32 digest[2], const u32 *bitmap_s1_a, const u32 *bitmap_s1_b, const u32 *bitmap_s1_c, const u32 *bitmap_s1_d, const u32 *bitmap_s2_a, const u32 *bitmap_s2_b, const u32 *bitmap_s2_c, const u32 *bitmap_s2_d, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2) +{ + if (check_bitmap (bitmap_s1_a, bitmap_mask, bitmap_shift1, digest[0]) == 0) return (0); + if (check_bitmap (bitmap_s1_b, bitmap_mask, bitmap_shift1, digest[1]) == 0) return (0); + if (check_bitmap (bitmap_s1_c, bitmap_mask, bitmap_shift1, digest[2]) == 0) return (0); + if (check_bitmap (bitmap_s1_d, bitmap_mask, bitmap_shift1, digest[3]) == 0) return (0); + + if (check_bitmap (bitmap_s2_a, bitmap_mask, bitmap_shift2, digest[0]) == 0) return (0); + if (check_bitmap (bitmap_s2_b, bitmap_mask, bitmap_shift2, digest[1]) == 0) return (0); + if (check_bitmap (bitmap_s2_c, bitmap_mask, bitmap_shift2, digest[2]) == 0) return (0); + if (check_bitmap (bitmap_s2_d, bitmap_mask, bitmap_shift2, digest[3]) == 0) return (0); + + return (1); +} + +#ifdef VECT_SIZE1 +__device__ static void mark_hash_s0 (plain_t *plains_buf, u32 *hashes_shown, const int hash_pos, const u32 gid, const u32 il_pos) +{ + hashes_shown[hash_pos] = 1; + + plains_buf[hash_pos].gidvid = (gid * 1) + 0; + plains_buf[hash_pos].il_pos = il_pos; +} + +__device__ static void mark_hash_s0_warp (plain_t *plains_buf, u32 *hashes_shown, const int hash_pos, const u32 gid, const u32 il_pos) +{ + hashes_shown[hash_pos] = 1; + + plains_buf[hash_pos].gidvid = gid; + plains_buf[hash_pos].il_pos = (il_pos * 1) + 0; +} +#endif + +#ifdef VECT_SIZE2 +__device__ static void mark_hash_s0 (plain_t *plains_buf, u32 *hashes_shown, const int hash_pos, const u32 gid, const u32 il_pos) +{ + hashes_shown[hash_pos] = 1; + + plains_buf[hash_pos].gidvid = (gid * 2) + 0; + plains_buf[hash_pos].il_pos = il_pos; +} + +__device__ static void mark_hash_s1 (plain_t *plains_buf, u32 *hashes_shown, const int hash_pos, const u32 gid, const u32 il_pos) +{ + hashes_shown[hash_pos] = 1; + + plains_buf[hash_pos].gidvid = (gid * 2) + 1; + plains_buf[hash_pos].il_pos = il_pos; +} + +__device__ static void mark_hash_s0_warp (plain_t *plains_buf, u32 *hashes_shown, const int hash_pos, const u32 gid, const u32 il_pos) +{ + hashes_shown[hash_pos] = 1; + + plains_buf[hash_pos].gidvid = gid; + plains_buf[hash_pos].il_pos = (il_pos * 2) + 0; +} + +__device__ static void mark_hash_s1_warp (plain_t *plains_buf, u32 *hashes_shown, const int hash_pos, const u32 gid, const u32 il_pos) +{ + hashes_shown[hash_pos] = 1; + + plains_buf[hash_pos].gidvid = gid; + plains_buf[hash_pos].il_pos = (il_pos * 2) + 1; +} +#endif + +#ifdef VECT_SIZE4 +__device__ static void mark_hash_s0 (plain_t *plains_buf, u32 *hashes_shown, const int hash_pos, const u32 gid, const u32 il_pos) +{ + hashes_shown[hash_pos] = 1; + + plains_buf[hash_pos].gidvid = (gid * 4) + 0; + plains_buf[hash_pos].il_pos = il_pos; +} + +__device__ static void mark_hash_s1 (plain_t *plains_buf, u32 *hashes_shown, const int hash_pos, const u32 gid, const u32 il_pos) +{ + hashes_shown[hash_pos] = 1; + + plains_buf[hash_pos].gidvid = (gid * 4) + 1; + plains_buf[hash_pos].il_pos = il_pos; +} + +__device__ static void mark_hash_s2 (plain_t *plains_buf, u32 *hashes_shown, const int hash_pos, const u32 gid, const u32 il_pos) +{ + hashes_shown[hash_pos] = 1; + + plains_buf[hash_pos].gidvid = (gid * 4) + 2; + plains_buf[hash_pos].il_pos = il_pos; +} + +__device__ static void mark_hash_s3 (plain_t *plains_buf, u32 *hashes_shown, const int hash_pos, const u32 gid, const u32 il_pos) +{ + hashes_shown[hash_pos] = 1; + + plains_buf[hash_pos].gidvid = (gid * 4) + 3; + plains_buf[hash_pos].il_pos = il_pos; +} + +__device__ static void mark_hash_s0_warp (plain_t *plains_buf, u32 *hashes_shown, const int hash_pos, const u32 gid, const u32 il_pos) +{ + hashes_shown[hash_pos] = 1; + + plains_buf[hash_pos].gidvid = gid; + plains_buf[hash_pos].il_pos = (il_pos * 4) + 0; +} + +__device__ static void mark_hash_s1_warp (plain_t *plains_buf, u32 *hashes_shown, const int hash_pos, const u32 gid, const u32 il_pos) +{ + hashes_shown[hash_pos] = 1; + + plains_buf[hash_pos].gidvid = gid; + plains_buf[hash_pos].il_pos = (il_pos * 4) + 1; +} + +__device__ static void mark_hash_s2_warp (plain_t *plains_buf, u32 *hashes_shown, const int hash_pos, const u32 gid, const u32 il_pos) +{ + hashes_shown[hash_pos] = 1; + + plains_buf[hash_pos].gidvid = gid; + plains_buf[hash_pos].il_pos = (il_pos * 4) + 2; +} + +__device__ static void mark_hash_s3_warp (plain_t *plains_buf, u32 *hashes_shown, const int hash_pos, const u32 gid, const u32 il_pos) +{ + hashes_shown[hash_pos] = 1; + + plains_buf[hash_pos].gidvid = gid; + plains_buf[hash_pos].il_pos = (il_pos * 4) + 3; +} +#endif + +/** + * scalar + */ + +__device__ static u32 swap_workaround (const u32 v) +{ + #if __CUDA_ARCH__ >= 200 + return __byte_perm (v, 0, 0x0123); + + #else + return (v << 24) + ((v & 0x0000FF00) << 8) + ((v & 0x00FF0000) >> 8) + (v >> 24); + + #endif +} + +__device__ static u64 swap_workaround (const u64 v) +{ + return (((v & 0xff00000000000000ull) >> 56) + | ((v & 0x00ff000000000000ull) >> 40) + | ((v & 0x0000ff0000000000ull) >> 24) + | ((v & 0x000000ff00000000ull) >> 8) + | ((v & 0x00000000ff000000ull) << 8) + | ((v & 0x0000000000ff0000ull) << 24) + | ((v & 0x000000000000ff00ull) << 40) + | ((v & 0x00000000000000ffull) << 56)); +} + +__device__ static void truncate_block (u32 w[4], const u32 len) +{ + switch (len) + { + case 0: w[0] &= 0; + w[1] &= 0; + w[2] &= 0; + w[3] &= 0; + break; + case 1: w[0] &= 0x000000FF; + w[1] &= 0; + w[2] &= 0; + w[3] &= 0; + break; + case 2: w[0] &= 0x0000FFFF; + w[1] &= 0; + w[2] &= 0; + w[3] &= 0; + break; + case 3: w[0] &= 0x00FFFFFF; + w[1] &= 0; + w[2] &= 0; + w[3] &= 0; + break; + case 4: w[1] &= 0; + w[2] &= 0; + w[3] &= 0; + break; + case 5: w[1] &= 0x000000FF; + w[2] &= 0; + w[3] &= 0; + break; + case 6: w[1] &= 0x0000FFFF; + w[2] &= 0; + w[3] &= 0; + break; + case 7: w[1] &= 0x00FFFFFF; + w[2] &= 0; + w[3] &= 0; + break; + case 8: w[2] &= 0; + w[3] &= 0; + break; + case 9: w[2] &= 0x000000FF; + w[3] &= 0; + break; + case 10: w[2] &= 0x0000FFFF; + w[3] &= 0; + break; + case 11: w[2] &= 0x00FFFFFF; + w[3] &= 0; + break; + case 12: w[3] &= 0; + break; + case 13: w[3] &= 0x000000FF; + break; + case 14: w[3] &= 0x0000FFFF; + break; + case 15: w[3] &= 0x00FFFFFF; + break; + } +} + +__device__ static void make_unicode (const u32 in[4], u32 out1[4], u32 out2[4]) +{ + #if __CUDA_ARCH__ >= 200 + out2[3] = __byte_perm (in[3], 0, 0x7372); + out2[2] = __byte_perm (in[3], 0, 0x7170); + out2[1] = __byte_perm (in[2], 0, 0x7372); + out2[0] = __byte_perm (in[2], 0, 0x7170); + out1[3] = __byte_perm (in[1], 0, 0x7372); + out1[2] = __byte_perm (in[1], 0, 0x7170); + out1[1] = __byte_perm (in[0], 0, 0x7372); + out1[0] = __byte_perm (in[0], 0, 0x7170); + #else + out2[3] = ((in[3] >> 8) & 0x00FF0000) | ((in[3] >> 16) & 0x000000FF); + out2[2] = ((in[3] << 8) & 0x00FF0000) | ((in[3] >> 0) & 0x000000FF); + out2[1] = ((in[2] >> 8) & 0x00FF0000) | ((in[2] >> 16) & 0x000000FF); + out2[0] = ((in[2] << 8) & 0x00FF0000) | ((in[2] >> 0) & 0x000000FF); + out1[3] = ((in[1] >> 8) & 0x00FF0000) | ((in[1] >> 16) & 0x000000FF); + out1[2] = ((in[1] << 8) & 0x00FF0000) | ((in[1] >> 0) & 0x000000FF); + out1[1] = ((in[0] >> 8) & 0x00FF0000) | ((in[0] >> 16) & 0x000000FF); + out1[0] = ((in[0] << 8) & 0x00FF0000) | ((in[0] >> 0) & 0x000000FF); + #endif +} + +__device__ static void undo_unicode (const u32 in1[4], const u32 in2[4], u32 out[4]) +{ + #if __CUDA_ARCH__ >= 200 + out[0] = __byte_perm (in1[0], in1[1], 0x6420); + out[1] = __byte_perm (in1[2], in1[3], 0x6420); + out[2] = __byte_perm (in2[0], in2[1], 0x6420); + out[3] = __byte_perm (in2[2], in2[3], 0x6420); + #else + out[0] = ((in1[0] & 0x000000ff) >> 0) | ((in1[0] & 0x00ff0000) >> 8) + | ((in1[1] & 0x000000ff) << 16) | ((in1[1] & 0x00ff0000) << 8); + out[1] = ((in1[2] & 0x000000ff) >> 0) | ((in1[2] & 0x00ff0000) >> 8) + | ((in1[3] & 0x000000ff) << 16) | ((in1[3] & 0x00ff0000) << 8); + out[2] = ((in2[0] & 0x000000ff) >> 0) | ((in2[0] & 0x00ff0000) >> 8) + | ((in2[1] & 0x000000ff) << 16) | ((in2[1] & 0x00ff0000) << 8); + out[3] = ((in2[2] & 0x000000ff) >> 0) | ((in2[2] & 0x00ff0000) >> 8) + | ((in2[3] & 0x000000ff) << 16) | ((in2[3] & 0x00ff0000) << 8); + #endif +} + +__device__ static void append_0x01_1 (u32 w0[4], const u32 offset) +{ + switch (offset) + { + case 0: + w0[0] = 0x01; + break; + + case 1: + w0[0] = w0[0] | 0x0100; + break; + + case 2: + w0[0] = w0[0] | 0x010000; + break; + + case 3: + w0[0] = w0[0] | 0x01000000; + break; + + case 4: + w0[1] = 0x01; + break; + + case 5: + w0[1] = w0[1] | 0x0100; + break; + + case 6: + w0[1] = w0[1] | 0x010000; + break; + + case 7: + w0[1] = w0[1] | 0x01000000; + break; + + case 8: + w0[2] = 0x01; + break; + + case 9: + w0[2] = w0[2] | 0x0100; + break; + + case 10: + w0[2] = w0[2] | 0x010000; + break; + + case 11: + w0[2] = w0[2] | 0x01000000; + break; + + case 12: + w0[3] = 0x01; + break; + + case 13: + w0[3] = w0[3] | 0x0100; + break; + + case 14: + w0[3] = w0[3] | 0x010000; + break; + + case 15: + w0[3] = w0[3] | 0x01000000; + break; + } +} + +__device__ static void append_0x01_2 (u32 w0[4], u32 w1[4], const u32 offset) +{ + switch (offset) + { + case 0: + w0[0] = 0x01; + break; + + case 1: + w0[0] = w0[0] | 0x0100; + break; + + case 2: + w0[0] = w0[0] | 0x010000; + break; + + case 3: + w0[0] = w0[0] | 0x01000000; + break; + + case 4: + w0[1] = 0x01; + break; + + case 5: + w0[1] = w0[1] | 0x0100; + break; + + case 6: + w0[1] = w0[1] | 0x010000; + break; + + case 7: + w0[1] = w0[1] | 0x01000000; + break; + + case 8: + w0[2] = 0x01; + break; + + case 9: + w0[2] = w0[2] | 0x0100; + break; + + case 10: + w0[2] = w0[2] | 0x010000; + break; + + case 11: + w0[2] = w0[2] | 0x01000000; + break; + + case 12: + w0[3] = 0x01; + break; + + case 13: + w0[3] = w0[3] | 0x0100; + break; + + case 14: + w0[3] = w0[3] | 0x010000; + break; + + case 15: + w0[3] = w0[3] | 0x01000000; + break; + + case 16: + w1[0] = 0x01; + break; + + case 17: + w1[0] = w1[0] | 0x0100; + break; + + case 18: + w1[0] = w1[0] | 0x010000; + break; + + case 19: + w1[0] = w1[0] | 0x01000000; + break; + + case 20: + w1[1] = 0x01; + break; + + case 21: + w1[1] = w1[1] | 0x0100; + break; + + case 22: + w1[1] = w1[1] | 0x010000; + break; + + case 23: + w1[1] = w1[1] | 0x01000000; + break; + + case 24: + w1[2] = 0x01; + break; + + case 25: + w1[2] = w1[2] | 0x0100; + break; + + case 26: + w1[2] = w1[2] | 0x010000; + break; + + case 27: + w1[2] = w1[2] | 0x01000000; + break; + + case 28: + w1[3] = 0x01; + break; + + case 29: + w1[3] = w1[3] | 0x0100; + break; + + case 30: + w1[3] = w1[3] | 0x010000; + break; + + case 31: + w1[3] = w1[3] | 0x01000000; + break; + } +} + +__device__ static void append_0x01_3 (u32 w0[4], u32 w1[4], u32 w2[4], const u32 offset) +{ + switch (offset) + { + case 0: + w0[0] = 0x01; + break; + + case 1: + w0[0] = w0[0] | 0x0100; + break; + + case 2: + w0[0] = w0[0] | 0x010000; + break; + + case 3: + w0[0] = w0[0] | 0x01000000; + break; + + case 4: + w0[1] = 0x01; + break; + + case 5: + w0[1] = w0[1] | 0x0100; + break; + + case 6: + w0[1] = w0[1] | 0x010000; + break; + + case 7: + w0[1] = w0[1] | 0x01000000; + break; + + case 8: + w0[2] = 0x01; + break; + + case 9: + w0[2] = w0[2] | 0x0100; + break; + + case 10: + w0[2] = w0[2] | 0x010000; + break; + + case 11: + w0[2] = w0[2] | 0x01000000; + break; + + case 12: + w0[3] = 0x01; + break; + + case 13: + w0[3] = w0[3] | 0x0100; + break; + + case 14: + w0[3] = w0[3] | 0x010000; + break; + + case 15: + w0[3] = w0[3] | 0x01000000; + break; + + case 16: + w1[0] = 0x01; + break; + + case 17: + w1[0] = w1[0] | 0x0100; + break; + + case 18: + w1[0] = w1[0] | 0x010000; + break; + + case 19: + w1[0] = w1[0] | 0x01000000; + break; + + case 20: + w1[1] = 0x01; + break; + + case 21: + w1[1] = w1[1] | 0x0100; + break; + + case 22: + w1[1] = w1[1] | 0x010000; + break; + + case 23: + w1[1] = w1[1] | 0x01000000; + break; + + case 24: + w1[2] = 0x01; + break; + + case 25: + w1[2] = w1[2] | 0x0100; + break; + + case 26: + w1[2] = w1[2] | 0x010000; + break; + + case 27: + w1[2] = w1[2] | 0x01000000; + break; + + case 28: + w1[3] = 0x01; + break; + + case 29: + w1[3] = w1[3] | 0x0100; + break; + + case 30: + w1[3] = w1[3] | 0x010000; + break; + + case 31: + w1[3] = w1[3] | 0x01000000; + break; + + case 32: + w2[0] = 0x01; + break; + + case 33: + w2[0] = w2[0] | 0x0100; + break; + + case 34: + w2[0] = w2[0] | 0x010000; + break; + + case 35: + w2[0] = w2[0] | 0x01000000; + break; + + case 36: + w2[1] = 0x01; + break; + + case 37: + w2[1] = w2[1] | 0x0100; + break; + + case 38: + w2[1] = w2[1] | 0x010000; + break; + + case 39: + w2[1] = w2[1] | 0x01000000; + break; + + case 40: + w2[2] = 0x01; + break; + + case 41: + w2[2] = w2[2] | 0x0100; + break; + + case 42: + w2[2] = w2[2] | 0x010000; + break; + + case 43: + w2[2] = w2[2] | 0x01000000; + break; + + case 44: + w2[3] = 0x01; + break; + + case 45: + w2[3] = w2[3] | 0x0100; + break; + + case 46: + w2[3] = w2[3] | 0x010000; + break; + + case 47: + w2[3] = w2[3] | 0x01000000; + break; + } +} + +__device__ static void append_0x01_4 (u32 w0[4], u32 w1[4], u32 w2[4], u32 w3[4], const u32 offset) +{ + switch (offset) + { + case 0: + w0[0] = 0x01; + break; + + case 1: + w0[0] = w0[0] | 0x0100; + break; + + case 2: + w0[0] = w0[0] | 0x010000; + break; + + case 3: + w0[0] = w0[0] | 0x01000000; + break; + + case 4: + w0[1] = 0x01; + break; + + case 5: + w0[1] = w0[1] | 0x0100; + break; + + case 6: + w0[1] = w0[1] | 0x010000; + break; + + case 7: + w0[1] = w0[1] | 0x01000000; + break; + + case 8: + w0[2] = 0x01; + break; + + case 9: + w0[2] = w0[2] | 0x0100; + break; + + case 10: + w0[2] = w0[2] | 0x010000; + break; + + case 11: + w0[2] = w0[2] | 0x01000000; + break; + + case 12: + w0[3] = 0x01; + break; + + case 13: + w0[3] = w0[3] | 0x0100; + break; + + case 14: + w0[3] = w0[3] | 0x010000; + break; + + case 15: + w0[3] = w0[3] | 0x01000000; + break; + + case 16: + w1[0] = 0x01; + break; + + case 17: + w1[0] = w1[0] | 0x0100; + break; + + case 18: + w1[0] = w1[0] | 0x010000; + break; + + case 19: + w1[0] = w1[0] | 0x01000000; + break; + + case 20: + w1[1] = 0x01; + break; + + case 21: + w1[1] = w1[1] | 0x0100; + break; + + case 22: + w1[1] = w1[1] | 0x010000; + break; + + case 23: + w1[1] = w1[1] | 0x01000000; + break; + + case 24: + w1[2] = 0x01; + break; + + case 25: + w1[2] = w1[2] | 0x0100; + break; + + case 26: + w1[2] = w1[2] | 0x010000; + break; + + case 27: + w1[2] = w1[2] | 0x01000000; + break; + + case 28: + w1[3] = 0x01; + break; + + case 29: + w1[3] = w1[3] | 0x0100; + break; + + case 30: + w1[3] = w1[3] | 0x010000; + break; + + case 31: + w1[3] = w1[3] | 0x01000000; + break; + + case 32: + w2[0] = 0x01; + break; + + case 33: + w2[0] = w2[0] | 0x0100; + break; + + case 34: + w2[0] = w2[0] | 0x010000; + break; + + case 35: + w2[0] = w2[0] | 0x01000000; + break; + + case 36: + w2[1] = 0x01; + break; + + case 37: + w2[1] = w2[1] | 0x0100; + break; + + case 38: + w2[1] = w2[1] | 0x010000; + break; + + case 39: + w2[1] = w2[1] | 0x01000000; + break; + + case 40: + w2[2] = 0x01; + break; + + case 41: + w2[2] = w2[2] | 0x0100; + break; + + case 42: + w2[2] = w2[2] | 0x010000; + break; + + case 43: + w2[2] = w2[2] | 0x01000000; + break; + + case 44: + w2[3] = 0x01; + break; + + case 45: + w2[3] = w2[3] | 0x0100; + break; + + case 46: + w2[3] = w2[3] | 0x010000; + break; + + case 47: + w2[3] = w2[3] | 0x01000000; + break; + + case 48: + w3[0] = 0x01; + break; + + case 49: + w3[0] = w3[0] | 0x0100; + break; + + case 50: + w3[0] = w3[0] | 0x010000; + break; + + case 51: + w3[0] = w3[0] | 0x01000000; + break; + + case 52: + w3[1] = 0x01; + break; + + case 53: + w3[1] = w3[1] | 0x0100; + break; + + case 54: + w3[1] = w3[1] | 0x010000; + break; + + case 55: + w3[1] = w3[1] | 0x01000000; + break; + + case 56: + w3[2] = 0x01; + break; + + case 57: + w3[2] = w3[2] | 0x0100; + break; + + case 58: + w3[2] = w3[2] | 0x010000; + break; + + case 59: + w3[2] = w3[2] | 0x01000000; + break; + + case 60: + w3[3] = 0x01; + break; + + case 61: + w3[3] = w3[3] | 0x0100; + break; + + case 62: + w3[3] = w3[3] | 0x010000; + break; + + case 63: + w3[3] = w3[3] | 0x01000000; + break; + } +} + +__device__ static void append_0x01_8 (u32 w0[4], u32 w1[4], u32 w2[4], u32 w3[4], u32 w4[4], u32 w5[4], u32 w6[4], u32 w7[4], const u32 offset) +{ + switch (offset) + { + case 0: + w0[0] = 0x01; + break; + + case 1: + w0[0] = w0[0] | 0x0100; + break; + + case 2: + w0[0] = w0[0] | 0x010000; + break; + + case 3: + w0[0] = w0[0] | 0x01000000; + break; + + case 4: + w0[1] = 0x01; + break; + + case 5: + w0[1] = w0[1] | 0x0100; + break; + + case 6: + w0[1] = w0[1] | 0x010000; + break; + + case 7: + w0[1] = w0[1] | 0x01000000; + break; + + case 8: + w0[2] = 0x01; + break; + + case 9: + w0[2] = w0[2] | 0x0100; + break; + + case 10: + w0[2] = w0[2] | 0x010000; + break; + + case 11: + w0[2] = w0[2] | 0x01000000; + break; + + case 12: + w0[3] = 0x01; + break; + + case 13: + w0[3] = w0[3] | 0x0100; + break; + + case 14: + w0[3] = w0[3] | 0x010000; + break; + + case 15: + w0[3] = w0[3] | 0x01000000; + break; + + case 16: + w1[0] = 0x01; + break; + + case 17: + w1[0] = w1[0] | 0x0100; + break; + + case 18: + w1[0] = w1[0] | 0x010000; + break; + + case 19: + w1[0] = w1[0] | 0x01000000; + break; + + case 20: + w1[1] = 0x01; + break; + + case 21: + w1[1] = w1[1] | 0x0100; + break; + + case 22: + w1[1] = w1[1] | 0x010000; + break; + + case 23: + w1[1] = w1[1] | 0x01000000; + break; + + case 24: + w1[2] = 0x01; + break; + + case 25: + w1[2] = w1[2] | 0x0100; + break; + + case 26: + w1[2] = w1[2] | 0x010000; + break; + + case 27: + w1[2] = w1[2] | 0x01000000; + break; + + case 28: + w1[3] = 0x01; + break; + + case 29: + w1[3] = w1[3] | 0x0100; + break; + + case 30: + w1[3] = w1[3] | 0x010000; + break; + + case 31: + w1[3] = w1[3] | 0x01000000; + break; + + case 32: + w2[0] = 0x01; + break; + + case 33: + w2[0] = w2[0] | 0x0100; + break; + + case 34: + w2[0] = w2[0] | 0x010000; + break; + + case 35: + w2[0] = w2[0] | 0x01000000; + break; + + case 36: + w2[1] = 0x01; + break; + + case 37: + w2[1] = w2[1] | 0x0100; + break; + + case 38: + w2[1] = w2[1] | 0x010000; + break; + + case 39: + w2[1] = w2[1] | 0x01000000; + break; + + case 40: + w2[2] = 0x01; + break; + + case 41: + w2[2] = w2[2] | 0x0100; + break; + + case 42: + w2[2] = w2[2] | 0x010000; + break; + + case 43: + w2[2] = w2[2] | 0x01000000; + break; + + case 44: + w2[3] = 0x01; + break; + + case 45: + w2[3] = w2[3] | 0x0100; + break; + + case 46: + w2[3] = w2[3] | 0x010000; + break; + + case 47: + w2[3] = w2[3] | 0x01000000; + break; + + case 48: + w3[0] = 0x01; + break; + + case 49: + w3[0] = w3[0] | 0x0100; + break; + + case 50: + w3[0] = w3[0] | 0x010000; + break; + + case 51: + w3[0] = w3[0] | 0x01000000; + break; + + case 52: + w3[1] = 0x01; + break; + + case 53: + w3[1] = w3[1] | 0x0100; + break; + + case 54: + w3[1] = w3[1] | 0x010000; + break; + + case 55: + w3[1] = w3[1] | 0x01000000; + break; + + case 56: + w3[2] = 0x01; + break; + + case 57: + w3[2] = w3[2] | 0x0100; + break; + + case 58: + w3[2] = w3[2] | 0x010000; + break; + + case 59: + w3[2] = w3[2] | 0x01000000; + break; + + case 60: + w3[3] = 0x01; + break; + + case 61: + w3[3] = w3[3] | 0x0100; + break; + + case 62: + w3[3] = w3[3] | 0x010000; + break; + + case 63: + w3[3] = w3[3] | 0x01000000; + break; + + case 64: + w4[0] = 0x01; + break; + + case 65: + w4[0] = w4[0] | 0x0100; + break; + + case 66: + w4[0] = w4[0] | 0x010000; + break; + + case 67: + w4[0] = w4[0] | 0x01000000; + break; + + case 68: + w4[1] = 0x01; + break; + + case 69: + w4[1] = w4[1] | 0x0100; + break; + + case 70: + w4[1] = w4[1] | 0x010000; + break; + + case 71: + w4[1] = w4[1] | 0x01000000; + break; + + case 72: + w4[2] = 0x01; + break; + + case 73: + w4[2] = w4[2] | 0x0100; + break; + + case 74: + w4[2] = w4[2] | 0x010000; + break; + + case 75: + w4[2] = w4[2] | 0x01000000; + break; + + case 76: + w4[3] = 0x01; + break; + + case 77: + w4[3] = w4[3] | 0x0100; + break; + + case 78: + w4[3] = w4[3] | 0x010000; + break; + + case 79: + w4[3] = w4[3] | 0x01000000; + break; + + case 80: + w5[0] = 0x01; + break; + + case 81: + w5[0] = w5[0] | 0x0100; + break; + + case 82: + w5[0] = w5[0] | 0x010000; + break; + + case 83: + w5[0] = w5[0] | 0x01000000; + break; + + case 84: + w5[1] = 0x01; + break; + + case 85: + w5[1] = w5[1] | 0x0100; + break; + + case 86: + w5[1] = w5[1] | 0x010000; + break; + + case 87: + w5[1] = w5[1] | 0x01000000; + break; + + case 88: + w5[2] = 0x01; + break; + + case 89: + w5[2] = w5[2] | 0x0100; + break; + + case 90: + w5[2] = w5[2] | 0x010000; + break; + + case 91: + w5[2] = w5[2] | 0x01000000; + break; + + case 92: + w5[3] = 0x01; + break; + + case 93: + w5[3] = w5[3] | 0x0100; + break; + + case 94: + w5[3] = w5[3] | 0x010000; + break; + + case 95: + w5[3] = w5[3] | 0x01000000; + break; + + case 96: + w6[0] = 0x01; + break; + + case 97: + w6[0] = w6[0] | 0x0100; + break; + + case 98: + w6[0] = w6[0] | 0x010000; + break; + + case 99: + w6[0] = w6[0] | 0x01000000; + break; + + case 100: + w6[1] = 0x01; + break; + + case 101: + w6[1] = w6[1] | 0x0100; + break; + + case 102: + w6[1] = w6[1] | 0x010000; + break; + + case 103: + w6[1] = w6[1] | 0x01000000; + break; + + case 104: + w6[2] = 0x01; + break; + + case 105: + w6[2] = w6[2] | 0x0100; + break; + + case 106: + w6[2] = w6[2] | 0x010000; + break; + + case 107: + w6[2] = w6[2] | 0x01000000; + break; + + case 108: + w6[3] = 0x01; + break; + + case 109: + w6[3] = w6[3] | 0x0100; + break; + + case 110: + w6[3] = w6[3] | 0x010000; + break; + + case 111: + w6[3] = w6[3] | 0x01000000; + break; + + case 112: + w7[0] = 0x01; + break; + + case 113: + w7[0] = w7[0] | 0x0100; + break; + + case 114: + w7[0] = w7[0] | 0x010000; + break; + + case 115: + w7[0] = w7[0] | 0x01000000; + break; + + case 116: + w7[1] = 0x01; + break; + + case 117: + w7[1] = w7[1] | 0x0100; + break; + + case 118: + w7[1] = w7[1] | 0x010000; + break; + + case 119: + w7[1] = w7[1] | 0x01000000; + break; + + case 120: + w7[2] = 0x01; + break; + + case 121: + w7[2] = w7[2] | 0x0100; + break; + + case 122: + w7[2] = w7[2] | 0x010000; + break; + + case 123: + w7[2] = w7[2] | 0x01000000; + break; + + case 124: + w7[3] = 0x01; + break; + + case 125: + w7[3] = w7[3] | 0x0100; + break; + + case 126: + w7[3] = w7[3] | 0x010000; + break; + + case 127: + w7[3] = w7[3] | 0x01000000; + break; + } +} + +__device__ static void append_0x02_1 (u32 w0[4], const u32 offset) +{ + switch (offset) + { + case 0: + w0[0] = 0x02; + break; + + case 1: + w0[0] = w0[0] | 0x0200; + break; + + case 2: + w0[0] = w0[0] | 0x020000; + break; + + case 3: + w0[0] = w0[0] | 0x02000000; + break; + + case 4: + w0[1] = 0x02; + break; + + case 5: + w0[1] = w0[1] | 0x0200; + break; + + case 6: + w0[1] = w0[1] | 0x020000; + break; + + case 7: + w0[1] = w0[1] | 0x02000000; + break; + + case 8: + w0[2] = 0x02; + break; + + case 9: + w0[2] = w0[2] | 0x0200; + break; + + case 10: + w0[2] = w0[2] | 0x020000; + break; + + case 11: + w0[2] = w0[2] | 0x02000000; + break; + + case 12: + w0[3] = 0x02; + break; + + case 13: + w0[3] = w0[3] | 0x0200; + break; + + case 14: + w0[3] = w0[3] | 0x020000; + break; + + case 15: + w0[3] = w0[3] | 0x02000000; + break; + } +} + +__device__ static void append_0x02_2 (u32 w0[4], u32 w1[4], const u32 offset) +{ + switch (offset) + { + case 0: + w0[0] = 0x02; + break; + + case 1: + w0[0] = w0[0] | 0x0200; + break; + + case 2: + w0[0] = w0[0] | 0x020000; + break; + + case 3: + w0[0] = w0[0] | 0x02000000; + break; + + case 4: + w0[1] = 0x02; + break; + + case 5: + w0[1] = w0[1] | 0x0200; + break; + + case 6: + w0[1] = w0[1] | 0x020000; + break; + + case 7: + w0[1] = w0[1] | 0x02000000; + break; + + case 8: + w0[2] = 0x02; + break; + + case 9: + w0[2] = w0[2] | 0x0200; + break; + + case 10: + w0[2] = w0[2] | 0x020000; + break; + + case 11: + w0[2] = w0[2] | 0x02000000; + break; + + case 12: + w0[3] = 0x02; + break; + + case 13: + w0[3] = w0[3] | 0x0200; + break; + + case 14: + w0[3] = w0[3] | 0x020000; + break; + + case 15: + w0[3] = w0[3] | 0x02000000; + break; + + case 16: + w1[0] = 0x02; + break; + + case 17: + w1[0] = w1[0] | 0x0200; + break; + + case 18: + w1[0] = w1[0] | 0x020000; + break; + + case 19: + w1[0] = w1[0] | 0x02000000; + break; + + case 20: + w1[1] = 0x02; + break; + + case 21: + w1[1] = w1[1] | 0x0200; + break; + + case 22: + w1[1] = w1[1] | 0x020000; + break; + + case 23: + w1[1] = w1[1] | 0x02000000; + break; + + case 24: + w1[2] = 0x02; + break; + + case 25: + w1[2] = w1[2] | 0x0200; + break; + + case 26: + w1[2] = w1[2] | 0x020000; + break; + + case 27: + w1[2] = w1[2] | 0x02000000; + break; + + case 28: + w1[3] = 0x02; + break; + + case 29: + w1[3] = w1[3] | 0x0200; + break; + + case 30: + w1[3] = w1[3] | 0x020000; + break; + + case 31: + w1[3] = w1[3] | 0x02000000; + break; + } +} + +__device__ static void append_0x02_3 (u32 w0[4], u32 w1[4], u32 w2[4], const u32 offset) +{ + switch (offset) + { + case 0: + w0[0] = 0x02; + break; + + case 1: + w0[0] = w0[0] | 0x0200; + break; + + case 2: + w0[0] = w0[0] | 0x020000; + break; + + case 3: + w0[0] = w0[0] | 0x02000000; + break; + + case 4: + w0[1] = 0x02; + break; + + case 5: + w0[1] = w0[1] | 0x0200; + break; + + case 6: + w0[1] = w0[1] | 0x020000; + break; + + case 7: + w0[1] = w0[1] | 0x02000000; + break; + + case 8: + w0[2] = 0x02; + break; + + case 9: + w0[2] = w0[2] | 0x0200; + break; + + case 10: + w0[2] = w0[2] | 0x020000; + break; + + case 11: + w0[2] = w0[2] | 0x02000000; + break; + + case 12: + w0[3] = 0x02; + break; + + case 13: + w0[3] = w0[3] | 0x0200; + break; + + case 14: + w0[3] = w0[3] | 0x020000; + break; + + case 15: + w0[3] = w0[3] | 0x02000000; + break; + + case 16: + w1[0] = 0x02; + break; + + case 17: + w1[0] = w1[0] | 0x0200; + break; + + case 18: + w1[0] = w1[0] | 0x020000; + break; + + case 19: + w1[0] = w1[0] | 0x02000000; + break; + + case 20: + w1[1] = 0x02; + break; + + case 21: + w1[1] = w1[1] | 0x0200; + break; + + case 22: + w1[1] = w1[1] | 0x020000; + break; + + case 23: + w1[1] = w1[1] | 0x02000000; + break; + + case 24: + w1[2] = 0x02; + break; + + case 25: + w1[2] = w1[2] | 0x0200; + break; + + case 26: + w1[2] = w1[2] | 0x020000; + break; + + case 27: + w1[2] = w1[2] | 0x02000000; + break; + + case 28: + w1[3] = 0x02; + break; + + case 29: + w1[3] = w1[3] | 0x0200; + break; + + case 30: + w1[3] = w1[3] | 0x020000; + break; + + case 31: + w1[3] = w1[3] | 0x02000000; + break; + + case 32: + w2[0] = 0x02; + break; + + case 33: + w2[0] = w2[0] | 0x0200; + break; + + case 34: + w2[0] = w2[0] | 0x020000; + break; + + case 35: + w2[0] = w2[0] | 0x02000000; + break; + + case 36: + w2[1] = 0x02; + break; + + case 37: + w2[1] = w2[1] | 0x0200; + break; + + case 38: + w2[1] = w2[1] | 0x020000; + break; + + case 39: + w2[1] = w2[1] | 0x02000000; + break; + + case 40: + w2[2] = 0x02; + break; + + case 41: + w2[2] = w2[2] | 0x0200; + break; + + case 42: + w2[2] = w2[2] | 0x020000; + break; + + case 43: + w2[2] = w2[2] | 0x02000000; + break; + + case 44: + w2[3] = 0x02; + break; + + case 45: + w2[3] = w2[3] | 0x0200; + break; + + case 46: + w2[3] = w2[3] | 0x020000; + break; + + case 47: + w2[3] = w2[3] | 0x02000000; + break; + } +} + +__device__ static void append_0x02_4 (u32 w0[4], u32 w1[4], u32 w2[4], u32 w3[4], const u32 offset) +{ + switch (offset) + { + case 0: + w0[0] = 0x02; + break; + + case 1: + w0[0] = w0[0] | 0x0200; + break; + + case 2: + w0[0] = w0[0] | 0x020000; + break; + + case 3: + w0[0] = w0[0] | 0x02000000; + break; + + case 4: + w0[1] = 0x02; + break; + + case 5: + w0[1] = w0[1] | 0x0200; + break; + + case 6: + w0[1] = w0[1] | 0x020000; + break; + + case 7: + w0[1] = w0[1] | 0x02000000; + break; + + case 8: + w0[2] = 0x02; + break; + + case 9: + w0[2] = w0[2] | 0x0200; + break; + + case 10: + w0[2] = w0[2] | 0x020000; + break; + + case 11: + w0[2] = w0[2] | 0x02000000; + break; + + case 12: + w0[3] = 0x02; + break; + + case 13: + w0[3] = w0[3] | 0x0200; + break; + + case 14: + w0[3] = w0[3] | 0x020000; + break; + + case 15: + w0[3] = w0[3] | 0x02000000; + break; + + case 16: + w1[0] = 0x02; + break; + + case 17: + w1[0] = w1[0] | 0x0200; + break; + + case 18: + w1[0] = w1[0] | 0x020000; + break; + + case 19: + w1[0] = w1[0] | 0x02000000; + break; + + case 20: + w1[1] = 0x02; + break; + + case 21: + w1[1] = w1[1] | 0x0200; + break; + + case 22: + w1[1] = w1[1] | 0x020000; + break; + + case 23: + w1[1] = w1[1] | 0x02000000; + break; + + case 24: + w1[2] = 0x02; + break; + + case 25: + w1[2] = w1[2] | 0x0200; + break; + + case 26: + w1[2] = w1[2] | 0x020000; + break; + + case 27: + w1[2] = w1[2] | 0x02000000; + break; + + case 28: + w1[3] = 0x02; + break; + + case 29: + w1[3] = w1[3] | 0x0200; + break; + + case 30: + w1[3] = w1[3] | 0x020000; + break; + + case 31: + w1[3] = w1[3] | 0x02000000; + break; + + case 32: + w2[0] = 0x02; + break; + + case 33: + w2[0] = w2[0] | 0x0200; + break; + + case 34: + w2[0] = w2[0] | 0x020000; + break; + + case 35: + w2[0] = w2[0] | 0x02000000; + break; + + case 36: + w2[1] = 0x02; + break; + + case 37: + w2[1] = w2[1] | 0x0200; + break; + + case 38: + w2[1] = w2[1] | 0x020000; + break; + + case 39: + w2[1] = w2[1] | 0x02000000; + break; + + case 40: + w2[2] = 0x02; + break; + + case 41: + w2[2] = w2[2] | 0x0200; + break; + + case 42: + w2[2] = w2[2] | 0x020000; + break; + + case 43: + w2[2] = w2[2] | 0x02000000; + break; + + case 44: + w2[3] = 0x02; + break; + + case 45: + w2[3] = w2[3] | 0x0200; + break; + + case 46: + w2[3] = w2[3] | 0x020000; + break; + + case 47: + w2[3] = w2[3] | 0x02000000; + break; + + case 48: + w3[0] = 0x02; + break; + + case 49: + w3[0] = w3[0] | 0x0200; + break; + + case 50: + w3[0] = w3[0] | 0x020000; + break; + + case 51: + w3[0] = w3[0] | 0x02000000; + break; + + case 52: + w3[1] = 0x02; + break; + + case 53: + w3[1] = w3[1] | 0x0200; + break; + + case 54: + w3[1] = w3[1] | 0x020000; + break; + + case 55: + w3[1] = w3[1] | 0x02000000; + break; + + case 56: + w3[2] = 0x02; + break; + + case 57: + w3[2] = w3[2] | 0x0200; + break; + + case 58: + w3[2] = w3[2] | 0x020000; + break; + + case 59: + w3[2] = w3[2] | 0x02000000; + break; + + case 60: + w3[3] = 0x02; + break; + + case 61: + w3[3] = w3[3] | 0x0200; + break; + + case 62: + w3[3] = w3[3] | 0x020000; + break; + + case 63: + w3[3] = w3[3] | 0x02000000; + break; + } +} + +__device__ static void append_0x02_8 (u32 w0[4], u32 w1[4], u32 w2[4], u32 w3[4], u32 w4[4], u32 w5[4], u32 w6[4], u32 w7[4], const u32 offset) +{ + switch (offset) + { + case 0: + w0[0] = 0x02; + break; + + case 1: + w0[0] = w0[0] | 0x0200; + break; + + case 2: + w0[0] = w0[0] | 0x020000; + break; + + case 3: + w0[0] = w0[0] | 0x02000000; + break; + + case 4: + w0[1] = 0x02; + break; + + case 5: + w0[1] = w0[1] | 0x0200; + break; + + case 6: + w0[1] = w0[1] | 0x020000; + break; + + case 7: + w0[1] = w0[1] | 0x02000000; + break; + + case 8: + w0[2] = 0x02; + break; + + case 9: + w0[2] = w0[2] | 0x0200; + break; + + case 10: + w0[2] = w0[2] | 0x020000; + break; + + case 11: + w0[2] = w0[2] | 0x02000000; + break; + + case 12: + w0[3] = 0x02; + break; + + case 13: + w0[3] = w0[3] | 0x0200; + break; + + case 14: + w0[3] = w0[3] | 0x020000; + break; + + case 15: + w0[3] = w0[3] | 0x02000000; + break; + + case 16: + w1[0] = 0x02; + break; + + case 17: + w1[0] = w1[0] | 0x0200; + break; + + case 18: + w1[0] = w1[0] | 0x020000; + break; + + case 19: + w1[0] = w1[0] | 0x02000000; + break; + + case 20: + w1[1] = 0x02; + break; + + case 21: + w1[1] = w1[1] | 0x0200; + break; + + case 22: + w1[1] = w1[1] | 0x020000; + break; + + case 23: + w1[1] = w1[1] | 0x02000000; + break; + + case 24: + w1[2] = 0x02; + break; + + case 25: + w1[2] = w1[2] | 0x0200; + break; + + case 26: + w1[2] = w1[2] | 0x020000; + break; + + case 27: + w1[2] = w1[2] | 0x02000000; + break; + + case 28: + w1[3] = 0x02; + break; + + case 29: + w1[3] = w1[3] | 0x0200; + break; + + case 30: + w1[3] = w1[3] | 0x020000; + break; + + case 31: + w1[3] = w1[3] | 0x02000000; + break; + + case 32: + w2[0] = 0x02; + break; + + case 33: + w2[0] = w2[0] | 0x0200; + break; + + case 34: + w2[0] = w2[0] | 0x020000; + break; + + case 35: + w2[0] = w2[0] | 0x02000000; + break; + + case 36: + w2[1] = 0x02; + break; + + case 37: + w2[1] = w2[1] | 0x0200; + break; + + case 38: + w2[1] = w2[1] | 0x020000; + break; + + case 39: + w2[1] = w2[1] | 0x02000000; + break; + + case 40: + w2[2] = 0x02; + break; + + case 41: + w2[2] = w2[2] | 0x0200; + break; + + case 42: + w2[2] = w2[2] | 0x020000; + break; + + case 43: + w2[2] = w2[2] | 0x02000000; + break; + + case 44: + w2[3] = 0x02; + break; + + case 45: + w2[3] = w2[3] | 0x0200; + break; + + case 46: + w2[3] = w2[3] | 0x020000; + break; + + case 47: + w2[3] = w2[3] | 0x02000000; + break; + + case 48: + w3[0] = 0x02; + break; + + case 49: + w3[0] = w3[0] | 0x0200; + break; + + case 50: + w3[0] = w3[0] | 0x020000; + break; + + case 51: + w3[0] = w3[0] | 0x02000000; + break; + + case 52: + w3[1] = 0x02; + break; + + case 53: + w3[1] = w3[1] | 0x0200; + break; + + case 54: + w3[1] = w3[1] | 0x020000; + break; + + case 55: + w3[1] = w3[1] | 0x02000000; + break; + + case 56: + w3[2] = 0x02; + break; + + case 57: + w3[2] = w3[2] | 0x0200; + break; + + case 58: + w3[2] = w3[2] | 0x020000; + break; + + case 59: + w3[2] = w3[2] | 0x02000000; + break; + + case 60: + w3[3] = 0x02; + break; + + case 61: + w3[3] = w3[3] | 0x0200; + break; + + case 62: + w3[3] = w3[3] | 0x020000; + break; + + case 63: + w3[3] = w3[3] | 0x02000000; + break; + + case 64: + w4[0] = 0x02; + break; + + case 65: + w4[0] = w4[0] | 0x0200; + break; + + case 66: + w4[0] = w4[0] | 0x020000; + break; + + case 67: + w4[0] = w4[0] | 0x02000000; + break; + + case 68: + w4[1] = 0x02; + break; + + case 69: + w4[1] = w4[1] | 0x0200; + break; + + case 70: + w4[1] = w4[1] | 0x020000; + break; + + case 71: + w4[1] = w4[1] | 0x02000000; + break; + + case 72: + w4[2] = 0x02; + break; + + case 73: + w4[2] = w4[2] | 0x0200; + break; + + case 74: + w4[2] = w4[2] | 0x020000; + break; + + case 75: + w4[2] = w4[2] | 0x02000000; + break; + + case 76: + w4[3] = 0x02; + break; + + case 77: + w4[3] = w4[3] | 0x0200; + break; + + case 78: + w4[3] = w4[3] | 0x020000; + break; + + case 79: + w4[3] = w4[3] | 0x02000000; + break; + + case 80: + w5[0] = 0x02; + break; + + case 81: + w5[0] = w5[0] | 0x0200; + break; + + case 82: + w5[0] = w5[0] | 0x020000; + break; + + case 83: + w5[0] = w5[0] | 0x02000000; + break; + + case 84: + w5[1] = 0x02; + break; + + case 85: + w5[1] = w5[1] | 0x0200; + break; + + case 86: + w5[1] = w5[1] | 0x020000; + break; + + case 87: + w5[1] = w5[1] | 0x02000000; + break; + + case 88: + w5[2] = 0x02; + break; + + case 89: + w5[2] = w5[2] | 0x0200; + break; + + case 90: + w5[2] = w5[2] | 0x020000; + break; + + case 91: + w5[2] = w5[2] | 0x02000000; + break; + + case 92: + w5[3] = 0x02; + break; + + case 93: + w5[3] = w5[3] | 0x0200; + break; + + case 94: + w5[3] = w5[3] | 0x020000; + break; + + case 95: + w5[3] = w5[3] | 0x02000000; + break; + + case 96: + w6[0] = 0x02; + break; + + case 97: + w6[0] = w6[0] | 0x0200; + break; + + case 98: + w6[0] = w6[0] | 0x020000; + break; + + case 99: + w6[0] = w6[0] | 0x02000000; + break; + + case 100: + w6[1] = 0x02; + break; + + case 101: + w6[1] = w6[1] | 0x0200; + break; + + case 102: + w6[1] = w6[1] | 0x020000; + break; + + case 103: + w6[1] = w6[1] | 0x02000000; + break; + + case 104: + w6[2] = 0x02; + break; + + case 105: + w6[2] = w6[2] | 0x0200; + break; + + case 106: + w6[2] = w6[2] | 0x020000; + break; + + case 107: + w6[2] = w6[2] | 0x02000000; + break; + + case 108: + w6[3] = 0x02; + break; + + case 109: + w6[3] = w6[3] | 0x0200; + break; + + case 110: + w6[3] = w6[3] | 0x020000; + break; + + case 111: + w6[3] = w6[3] | 0x02000000; + break; + + case 112: + w7[0] = 0x02; + break; + + case 113: + w7[0] = w7[0] | 0x0200; + break; + + case 114: + w7[0] = w7[0] | 0x020000; + break; + + case 115: + w7[0] = w7[0] | 0x02000000; + break; + + case 116: + w7[1] = 0x02; + break; + + case 117: + w7[1] = w7[1] | 0x0200; + break; + + case 118: + w7[1] = w7[1] | 0x020000; + break; + + case 119: + w7[1] = w7[1] | 0x02000000; + break; + + case 120: + w7[2] = 0x02; + break; + + case 121: + w7[2] = w7[2] | 0x0200; + break; + + case 122: + w7[2] = w7[2] | 0x020000; + break; + + case 123: + w7[2] = w7[2] | 0x02000000; + break; + + case 124: + w7[3] = 0x02; + break; + + case 125: + w7[3] = w7[3] | 0x0200; + break; + + case 126: + w7[3] = w7[3] | 0x020000; + break; + + case 127: + w7[3] = w7[3] | 0x02000000; + break; + } +} + +__device__ static void append_0x80_1 (u32 w0[4], const u32 offset) +{ + switch (offset) + { + case 0: + w0[0] = 0x80; + break; + + case 1: + w0[0] = w0[0] | 0x8000; + break; + + case 2: + w0[0] = w0[0] | 0x800000; + break; + + case 3: + w0[0] = w0[0] | 0x80000000; + break; + + case 4: + w0[1] = 0x80; + break; + + case 5: + w0[1] = w0[1] | 0x8000; + break; + + case 6: + w0[1] = w0[1] | 0x800000; + break; + + case 7: + w0[1] = w0[1] | 0x80000000; + break; + + case 8: + w0[2] = 0x80; + break; + + case 9: + w0[2] = w0[2] | 0x8000; + break; + + case 10: + w0[2] = w0[2] | 0x800000; + break; + + case 11: + w0[2] = w0[2] | 0x80000000; + break; + + case 12: + w0[3] = 0x80; + break; + + case 13: + w0[3] = w0[3] | 0x8000; + break; + + case 14: + w0[3] = w0[3] | 0x800000; + break; + + case 15: + w0[3] = w0[3] | 0x80000000; + break; + } +} + +__device__ static void append_0x80_2 (u32 w0[4], u32 w1[4], const u32 offset) +{ + switch (offset) + { + case 0: + w0[0] = 0x80; + break; + + case 1: + w0[0] = w0[0] | 0x8000; + break; + + case 2: + w0[0] = w0[0] | 0x800000; + break; + + case 3: + w0[0] = w0[0] | 0x80000000; + break; + + case 4: + w0[1] = 0x80; + break; + + case 5: + w0[1] = w0[1] | 0x8000; + break; + + case 6: + w0[1] = w0[1] | 0x800000; + break; + + case 7: + w0[1] = w0[1] | 0x80000000; + break; + + case 8: + w0[2] = 0x80; + break; + + case 9: + w0[2] = w0[2] | 0x8000; + break; + + case 10: + w0[2] = w0[2] | 0x800000; + break; + + case 11: + w0[2] = w0[2] | 0x80000000; + break; + + case 12: + w0[3] = 0x80; + break; + + case 13: + w0[3] = w0[3] | 0x8000; + break; + + case 14: + w0[3] = w0[3] | 0x800000; + break; + + case 15: + w0[3] = w0[3] | 0x80000000; + break; + + case 16: + w1[0] = 0x80; + break; + + case 17: + w1[0] = w1[0] | 0x8000; + break; + + case 18: + w1[0] = w1[0] | 0x800000; + break; + + case 19: + w1[0] = w1[0] | 0x80000000; + break; + + case 20: + w1[1] = 0x80; + break; + + case 21: + w1[1] = w1[1] | 0x8000; + break; + + case 22: + w1[1] = w1[1] | 0x800000; + break; + + case 23: + w1[1] = w1[1] | 0x80000000; + break; + + case 24: + w1[2] = 0x80; + break; + + case 25: + w1[2] = w1[2] | 0x8000; + break; + + case 26: + w1[2] = w1[2] | 0x800000; + break; + + case 27: + w1[2] = w1[2] | 0x80000000; + break; + + case 28: + w1[3] = 0x80; + break; + + case 29: + w1[3] = w1[3] | 0x8000; + break; + + case 30: + w1[3] = w1[3] | 0x800000; + break; + + case 31: + w1[3] = w1[3] | 0x80000000; + break; + } +} + +__device__ static void append_0x80_3 (u32 w0[4], u32 w1[4], u32 w2[4], const u32 offset) +{ + switch (offset) + { + case 0: + w0[0] = 0x80; + break; + + case 1: + w0[0] = w0[0] | 0x8000; + break; + + case 2: + w0[0] = w0[0] | 0x800000; + break; + + case 3: + w0[0] = w0[0] | 0x80000000; + break; + + case 4: + w0[1] = 0x80; + break; + + case 5: + w0[1] = w0[1] | 0x8000; + break; + + case 6: + w0[1] = w0[1] | 0x800000; + break; + + case 7: + w0[1] = w0[1] | 0x80000000; + break; + + case 8: + w0[2] = 0x80; + break; + + case 9: + w0[2] = w0[2] | 0x8000; + break; + + case 10: + w0[2] = w0[2] | 0x800000; + break; + + case 11: + w0[2] = w0[2] | 0x80000000; + break; + + case 12: + w0[3] = 0x80; + break; + + case 13: + w0[3] = w0[3] | 0x8000; + break; + + case 14: + w0[3] = w0[3] | 0x800000; + break; + + case 15: + w0[3] = w0[3] | 0x80000000; + break; + + case 16: + w1[0] = 0x80; + break; + + case 17: + w1[0] = w1[0] | 0x8000; + break; + + case 18: + w1[0] = w1[0] | 0x800000; + break; + + case 19: + w1[0] = w1[0] | 0x80000000; + break; + + case 20: + w1[1] = 0x80; + break; + + case 21: + w1[1] = w1[1] | 0x8000; + break; + + case 22: + w1[1] = w1[1] | 0x800000; + break; + + case 23: + w1[1] = w1[1] | 0x80000000; + break; + + case 24: + w1[2] = 0x80; + break; + + case 25: + w1[2] = w1[2] | 0x8000; + break; + + case 26: + w1[2] = w1[2] | 0x800000; + break; + + case 27: + w1[2] = w1[2] | 0x80000000; + break; + + case 28: + w1[3] = 0x80; + break; + + case 29: + w1[3] = w1[3] | 0x8000; + break; + + case 30: + w1[3] = w1[3] | 0x800000; + break; + + case 31: + w1[3] = w1[3] | 0x80000000; + break; + + case 32: + w2[0] = 0x80; + break; + + case 33: + w2[0] = w2[0] | 0x8000; + break; + + case 34: + w2[0] = w2[0] | 0x800000; + break; + + case 35: + w2[0] = w2[0] | 0x80000000; + break; + + case 36: + w2[1] = 0x80; + break; + + case 37: + w2[1] = w2[1] | 0x8000; + break; + + case 38: + w2[1] = w2[1] | 0x800000; + break; + + case 39: + w2[1] = w2[1] | 0x80000000; + break; + + case 40: + w2[2] = 0x80; + break; + + case 41: + w2[2] = w2[2] | 0x8000; + break; + + case 42: + w2[2] = w2[2] | 0x800000; + break; + + case 43: + w2[2] = w2[2] | 0x80000000; + break; + + case 44: + w2[3] = 0x80; + break; + + case 45: + w2[3] = w2[3] | 0x8000; + break; + + case 46: + w2[3] = w2[3] | 0x800000; + break; + + case 47: + w2[3] = w2[3] | 0x80000000; + break; + } +} + +__device__ static void append_0x80_4 (u32 w0[4], u32 w1[4], u32 w2[4], u32 w3[4], const u32 offset) +{ + switch (offset) + { + case 0: + w0[0] = 0x80; + break; + + case 1: + w0[0] = w0[0] | 0x8000; + break; + + case 2: + w0[0] = w0[0] | 0x800000; + break; + + case 3: + w0[0] = w0[0] | 0x80000000; + break; + + case 4: + w0[1] = 0x80; + break; + + case 5: + w0[1] = w0[1] | 0x8000; + break; + + case 6: + w0[1] = w0[1] | 0x800000; + break; + + case 7: + w0[1] = w0[1] | 0x80000000; + break; + + case 8: + w0[2] = 0x80; + break; + + case 9: + w0[2] = w0[2] | 0x8000; + break; + + case 10: + w0[2] = w0[2] | 0x800000; + break; + + case 11: + w0[2] = w0[2] | 0x80000000; + break; + + case 12: + w0[3] = 0x80; + break; + + case 13: + w0[3] = w0[3] | 0x8000; + break; + + case 14: + w0[3] = w0[3] | 0x800000; + break; + + case 15: + w0[3] = w0[3] | 0x80000000; + break; + + case 16: + w1[0] = 0x80; + break; + + case 17: + w1[0] = w1[0] | 0x8000; + break; + + case 18: + w1[0] = w1[0] | 0x800000; + break; + + case 19: + w1[0] = w1[0] | 0x80000000; + break; + + case 20: + w1[1] = 0x80; + break; + + case 21: + w1[1] = w1[1] | 0x8000; + break; + + case 22: + w1[1] = w1[1] | 0x800000; + break; + + case 23: + w1[1] = w1[1] | 0x80000000; + break; + + case 24: + w1[2] = 0x80; + break; + + case 25: + w1[2] = w1[2] | 0x8000; + break; + + case 26: + w1[2] = w1[2] | 0x800000; + break; + + case 27: + w1[2] = w1[2] | 0x80000000; + break; + + case 28: + w1[3] = 0x80; + break; + + case 29: + w1[3] = w1[3] | 0x8000; + break; + + case 30: + w1[3] = w1[3] | 0x800000; + break; + + case 31: + w1[3] = w1[3] | 0x80000000; + break; + + case 32: + w2[0] = 0x80; + break; + + case 33: + w2[0] = w2[0] | 0x8000; + break; + + case 34: + w2[0] = w2[0] | 0x800000; + break; + + case 35: + w2[0] = w2[0] | 0x80000000; + break; + + case 36: + w2[1] = 0x80; + break; + + case 37: + w2[1] = w2[1] | 0x8000; + break; + + case 38: + w2[1] = w2[1] | 0x800000; + break; + + case 39: + w2[1] = w2[1] | 0x80000000; + break; + + case 40: + w2[2] = 0x80; + break; + + case 41: + w2[2] = w2[2] | 0x8000; + break; + + case 42: + w2[2] = w2[2] | 0x800000; + break; + + case 43: + w2[2] = w2[2] | 0x80000000; + break; + + case 44: + w2[3] = 0x80; + break; + + case 45: + w2[3] = w2[3] | 0x8000; + break; + + case 46: + w2[3] = w2[3] | 0x800000; + break; + + case 47: + w2[3] = w2[3] | 0x80000000; + break; + + case 48: + w3[0] = 0x80; + break; + + case 49: + w3[0] = w3[0] | 0x8000; + break; + + case 50: + w3[0] = w3[0] | 0x800000; + break; + + case 51: + w3[0] = w3[0] | 0x80000000; + break; + + case 52: + w3[1] = 0x80; + break; + + case 53: + w3[1] = w3[1] | 0x8000; + break; + + case 54: + w3[1] = w3[1] | 0x800000; + break; + + case 55: + w3[1] = w3[1] | 0x80000000; + break; + + case 56: + w3[2] = 0x80; + break; + + case 57: + w3[2] = w3[2] | 0x8000; + break; + + case 58: + w3[2] = w3[2] | 0x800000; + break; + + case 59: + w3[2] = w3[2] | 0x80000000; + break; + + case 60: + w3[3] = 0x80; + break; + + case 61: + w3[3] = w3[3] | 0x8000; + break; + + case 62: + w3[3] = w3[3] | 0x800000; + break; + + case 63: + w3[3] = w3[3] | 0x80000000; + break; + } +} + +__device__ static void append_0x80_8 (u32 w0[4], u32 w1[4], u32 w2[4], u32 w3[4], u32 w4[4], u32 w5[4], u32 w6[4], u32 w7[4], const u32 offset) +{ + switch (offset) + { + case 0: + w0[0] = 0x80; + break; + + case 1: + w0[0] = w0[0] | 0x8000; + break; + + case 2: + w0[0] = w0[0] | 0x800000; + break; + + case 3: + w0[0] = w0[0] | 0x80000000; + break; + + case 4: + w0[1] = 0x80; + break; + + case 5: + w0[1] = w0[1] | 0x8000; + break; + + case 6: + w0[1] = w0[1] | 0x800000; + break; + + case 7: + w0[1] = w0[1] | 0x80000000; + break; + + case 8: + w0[2] = 0x80; + break; + + case 9: + w0[2] = w0[2] | 0x8000; + break; + + case 10: + w0[2] = w0[2] | 0x800000; + break; + + case 11: + w0[2] = w0[2] | 0x80000000; + break; + + case 12: + w0[3] = 0x80; + break; + + case 13: + w0[3] = w0[3] | 0x8000; + break; + + case 14: + w0[3] = w0[3] | 0x800000; + break; + + case 15: + w0[3] = w0[3] | 0x80000000; + break; + + case 16: + w1[0] = 0x80; + break; + + case 17: + w1[0] = w1[0] | 0x8000; + break; + + case 18: + w1[0] = w1[0] | 0x800000; + break; + + case 19: + w1[0] = w1[0] | 0x80000000; + break; + + case 20: + w1[1] = 0x80; + break; + + case 21: + w1[1] = w1[1] | 0x8000; + break; + + case 22: + w1[1] = w1[1] | 0x800000; + break; + + case 23: + w1[1] = w1[1] | 0x80000000; + break; + + case 24: + w1[2] = 0x80; + break; + + case 25: + w1[2] = w1[2] | 0x8000; + break; + + case 26: + w1[2] = w1[2] | 0x800000; + break; + + case 27: + w1[2] = w1[2] | 0x80000000; + break; + + case 28: + w1[3] = 0x80; + break; + + case 29: + w1[3] = w1[3] | 0x8000; + break; + + case 30: + w1[3] = w1[3] | 0x800000; + break; + + case 31: + w1[3] = w1[3] | 0x80000000; + break; + + case 32: + w2[0] = 0x80; + break; + + case 33: + w2[0] = w2[0] | 0x8000; + break; + + case 34: + w2[0] = w2[0] | 0x800000; + break; + + case 35: + w2[0] = w2[0] | 0x80000000; + break; + + case 36: + w2[1] = 0x80; + break; + + case 37: + w2[1] = w2[1] | 0x8000; + break; + + case 38: + w2[1] = w2[1] | 0x800000; + break; + + case 39: + w2[1] = w2[1] | 0x80000000; + break; + + case 40: + w2[2] = 0x80; + break; + + case 41: + w2[2] = w2[2] | 0x8000; + break; + + case 42: + w2[2] = w2[2] | 0x800000; + break; + + case 43: + w2[2] = w2[2] | 0x80000000; + break; + + case 44: + w2[3] = 0x80; + break; + + case 45: + w2[3] = w2[3] | 0x8000; + break; + + case 46: + w2[3] = w2[3] | 0x800000; + break; + + case 47: + w2[3] = w2[3] | 0x80000000; + break; + + case 48: + w3[0] = 0x80; + break; + + case 49: + w3[0] = w3[0] | 0x8000; + break; + + case 50: + w3[0] = w3[0] | 0x800000; + break; + + case 51: + w3[0] = w3[0] | 0x80000000; + break; + + case 52: + w3[1] = 0x80; + break; + + case 53: + w3[1] = w3[1] | 0x8000; + break; + + case 54: + w3[1] = w3[1] | 0x800000; + break; + + case 55: + w3[1] = w3[1] | 0x80000000; + break; + + case 56: + w3[2] = 0x80; + break; + + case 57: + w3[2] = w3[2] | 0x8000; + break; + + case 58: + w3[2] = w3[2] | 0x800000; + break; + + case 59: + w3[2] = w3[2] | 0x80000000; + break; + + case 60: + w3[3] = 0x80; + break; + + case 61: + w3[3] = w3[3] | 0x8000; + break; + + case 62: + w3[3] = w3[3] | 0x800000; + break; + + case 63: + w3[3] = w3[3] | 0x80000000; + break; + + case 64: + w4[0] = 0x80; + break; + + case 65: + w4[0] = w4[0] | 0x8000; + break; + + case 66: + w4[0] = w4[0] | 0x800000; + break; + + case 67: + w4[0] = w4[0] | 0x80000000; + break; + + case 68: + w4[1] = 0x80; + break; + + case 69: + w4[1] = w4[1] | 0x8000; + break; + + case 70: + w4[1] = w4[1] | 0x800000; + break; + + case 71: + w4[1] = w4[1] | 0x80000000; + break; + + case 72: + w4[2] = 0x80; + break; + + case 73: + w4[2] = w4[2] | 0x8000; + break; + + case 74: + w4[2] = w4[2] | 0x800000; + break; + + case 75: + w4[2] = w4[2] | 0x80000000; + break; + + case 76: + w4[3] = 0x80; + break; + + case 77: + w4[3] = w4[3] | 0x8000; + break; + + case 78: + w4[3] = w4[3] | 0x800000; + break; + + case 79: + w4[3] = w4[3] | 0x80000000; + break; + + case 80: + w5[0] = 0x80; + break; + + case 81: + w5[0] = w5[0] | 0x8000; + break; + + case 82: + w5[0] = w5[0] | 0x800000; + break; + + case 83: + w5[0] = w5[0] | 0x80000000; + break; + + case 84: + w5[1] = 0x80; + break; + + case 85: + w5[1] = w5[1] | 0x8000; + break; + + case 86: + w5[1] = w5[1] | 0x800000; + break; + + case 87: + w5[1] = w5[1] | 0x80000000; + break; + + case 88: + w5[2] = 0x80; + break; + + case 89: + w5[2] = w5[2] | 0x8000; + break; + + case 90: + w5[2] = w5[2] | 0x800000; + break; + + case 91: + w5[2] = w5[2] | 0x80000000; + break; + + case 92: + w5[3] = 0x80; + break; + + case 93: + w5[3] = w5[3] | 0x8000; + break; + + case 94: + w5[3] = w5[3] | 0x800000; + break; + + case 95: + w5[3] = w5[3] | 0x80000000; + break; + + case 96: + w6[0] = 0x80; + break; + + case 97: + w6[0] = w6[0] | 0x8000; + break; + + case 98: + w6[0] = w6[0] | 0x800000; + break; + + case 99: + w6[0] = w6[0] | 0x80000000; + break; + + case 100: + w6[1] = 0x80; + break; + + case 101: + w6[1] = w6[1] | 0x8000; + break; + + case 102: + w6[1] = w6[1] | 0x800000; + break; + + case 103: + w6[1] = w6[1] | 0x80000000; + break; + + case 104: + w6[2] = 0x80; + break; + + case 105: + w6[2] = w6[2] | 0x8000; + break; + + case 106: + w6[2] = w6[2] | 0x800000; + break; + + case 107: + w6[2] = w6[2] | 0x80000000; + break; + + case 108: + w6[3] = 0x80; + break; + + case 109: + w6[3] = w6[3] | 0x8000; + break; + + case 110: + w6[3] = w6[3] | 0x800000; + break; + + case 111: + w6[3] = w6[3] | 0x80000000; + break; + + case 112: + w7[0] = 0x80; + break; + + case 113: + w7[0] = w7[0] | 0x8000; + break; + + case 114: + w7[0] = w7[0] | 0x800000; + break; + + case 115: + w7[0] = w7[0] | 0x80000000; + break; + + case 116: + w7[1] = 0x80; + break; + + case 117: + w7[1] = w7[1] | 0x8000; + break; + + case 118: + w7[1] = w7[1] | 0x800000; + break; + + case 119: + w7[1] = w7[1] | 0x80000000; + break; + + case 120: + w7[2] = 0x80; + break; + + case 121: + w7[2] = w7[2] | 0x8000; + break; + + case 122: + w7[2] = w7[2] | 0x800000; + break; + + case 123: + w7[2] = w7[2] | 0x80000000; + break; + + case 124: + w7[3] = 0x80; + break; + + case 125: + w7[3] = w7[3] | 0x8000; + break; + + case 126: + w7[3] = w7[3] | 0x800000; + break; + + case 127: + w7[3] = w7[3] | 0x80000000; + break; + } +} + +__device__ static void append_0x80_4 (u32 w[16], const u32 offset) +{ + switch (offset) + { + case 0: + w[ 0] = 0x80; + break; + + case 1: + w[ 0] = w[ 0] | 0x8000; + break; + + case 2: + w[ 0] = w[ 0] | 0x800000; + break; + + case 3: + w[ 0] = w[ 0] | 0x80000000; + break; + + case 4: + w[ 1] = 0x80; + break; + + case 5: + w[ 1] = w[ 1] | 0x8000; + break; + + case 6: + w[ 1] = w[ 1] | 0x800000; + break; + + case 7: + w[ 1] = w[ 1] | 0x80000000; + break; + + case 8: + w[ 2] = 0x80; + break; + + case 9: + w[ 2] = w[ 2] | 0x8000; + break; + + case 10: + w[ 2] = w[ 2] | 0x800000; + break; + + case 11: + w[ 2] = w[ 2] | 0x80000000; + break; + + case 12: + w[ 3] = 0x80; + break; + + case 13: + w[ 3] = w[ 3] | 0x8000; + break; + + case 14: + w[ 3] = w[ 3] | 0x800000; + break; + + case 15: + w[ 3] = w[ 3] | 0x80000000; + break; + + case 16: + w[ 4] = 0x80; + break; + + case 17: + w[ 4] = w[ 4] | 0x8000; + break; + + case 18: + w[ 4] = w[ 4] | 0x800000; + break; + + case 19: + w[ 4] = w[ 4] | 0x80000000; + break; + + case 20: + w[ 5] = 0x80; + break; + + case 21: + w[ 5] = w[ 5] | 0x8000; + break; + + case 22: + w[ 5] = w[ 5] | 0x800000; + break; + + case 23: + w[ 5] = w[ 5] | 0x80000000; + break; + + case 24: + w[ 6] = 0x80; + break; + + case 25: + w[ 6] = w[ 6] | 0x8000; + break; + + case 26: + w[ 6] = w[ 6] | 0x800000; + break; + + case 27: + w[ 6] = w[ 6] | 0x80000000; + break; + + case 28: + w[ 7] = 0x80; + break; + + case 29: + w[ 7] = w[ 7] | 0x8000; + break; + + case 30: + w[ 7] = w[ 7] | 0x800000; + break; + + case 31: + w[ 7] = w[ 7] | 0x80000000; + break; + + case 32: + w[ 8] = 0x80; + break; + + case 33: + w[ 8] = w[ 8] | 0x8000; + break; + + case 34: + w[ 8] = w[ 8] | 0x800000; + break; + + case 35: + w[ 8] = w[ 8] | 0x80000000; + break; + + case 36: + w[ 9] = 0x80; + break; + + case 37: + w[ 9] = w[ 9] | 0x8000; + break; + + case 38: + w[ 9] = w[ 9] | 0x800000; + break; + + case 39: + w[ 9] = w[ 9] | 0x80000000; + break; + + case 40: + w[10] = 0x80; + break; + + case 41: + w[10] = w[10] | 0x8000; + break; + + case 42: + w[10] = w[10] | 0x800000; + break; + + case 43: + w[10] = w[10] | 0x80000000; + break; + + case 44: + w[11] = 0x80; + break; + + case 45: + w[11] = w[11] | 0x8000; + break; + + case 46: + w[11] = w[11] | 0x800000; + break; + + case 47: + w[11] = w[11] | 0x80000000; + break; + + case 48: + w[12] = 0x80; + break; + + case 49: + w[12] = w[12] | 0x8000; + break; + + case 50: + w[12] = w[12] | 0x800000; + break; + + case 51: + w[12] = w[12] | 0x80000000; + break; + + case 52: + w[13] = 0x80; + break; + + case 53: + w[13] = w[13] | 0x8000; + break; + + case 54: + w[13] = w[13] | 0x800000; + break; + + case 55: + w[13] = w[13] | 0x80000000; + break; + + case 56: + w[14] = 0x80; + break; + + case 57: + w[14] = w[14] | 0x8000; + break; + + case 58: + w[14] = w[14] | 0x800000; + break; + + case 59: + w[14] = w[14] | 0x80000000; + break; + + case 60: + w[15] = 0x80; + break; + + case 61: + w[15] = w[15] | 0x8000; + break; + + case 62: + w[15] = w[15] | 0x800000; + break; + + case 63: + w[15] = w[15] | 0x80000000; + break; + } +} + +__device__ static void append_0x80_8 (u32 w[32], const u32 offset) +{ + switch (offset) + { + case 0: + w[ 0] = 0x80; + break; + + case 1: + w[ 0] = w[ 0] | 0x8000; + break; + + case 2: + w[ 0] = w[ 0] | 0x800000; + break; + + case 3: + w[ 0] = w[ 0] | 0x80000000; + break; + + case 4: + w[ 1] = 0x80; + break; + + case 5: + w[ 1] = w[ 1] | 0x8000; + break; + + case 6: + w[ 1] = w[ 1] | 0x800000; + break; + + case 7: + w[ 1] = w[ 1] | 0x80000000; + break; + + case 8: + w[ 2] = 0x80; + break; + + case 9: + w[ 2] = w[ 2] | 0x8000; + break; + + case 10: + w[ 2] = w[ 2] | 0x800000; + break; + + case 11: + w[ 2] = w[ 2] | 0x80000000; + break; + + case 12: + w[ 3] = 0x80; + break; + + case 13: + w[ 3] = w[ 3] | 0x8000; + break; + + case 14: + w[ 3] = w[ 3] | 0x800000; + break; + + case 15: + w[ 3] = w[ 3] | 0x80000000; + break; + + case 16: + w[ 4] = 0x80; + break; + + case 17: + w[ 4] = w[ 4] | 0x8000; + break; + + case 18: + w[ 4] = w[ 4] | 0x800000; + break; + + case 19: + w[ 4] = w[ 4] | 0x80000000; + break; + + case 20: + w[ 5] = 0x80; + break; + + case 21: + w[ 5] = w[ 5] | 0x8000; + break; + + case 22: + w[ 5] = w[ 5] | 0x800000; + break; + + case 23: + w[ 5] = w[ 5] | 0x80000000; + break; + + case 24: + w[ 6] = 0x80; + break; + + case 25: + w[ 6] = w[ 6] | 0x8000; + break; + + case 26: + w[ 6] = w[ 6] | 0x800000; + break; + + case 27: + w[ 6] = w[ 6] | 0x80000000; + break; + + case 28: + w[ 7] = 0x80; + break; + + case 29: + w[ 7] = w[ 7] | 0x8000; + break; + + case 30: + w[ 7] = w[ 7] | 0x800000; + break; + + case 31: + w[ 7] = w[ 7] | 0x80000000; + break; + + case 32: + w[ 8] = 0x80; + break; + + case 33: + w[ 8] = w[ 8] | 0x8000; + break; + + case 34: + w[ 8] = w[ 8] | 0x800000; + break; + + case 35: + w[ 8] = w[ 8] | 0x80000000; + break; + + case 36: + w[ 9] = 0x80; + break; + + case 37: + w[ 9] = w[ 9] | 0x8000; + break; + + case 38: + w[ 9] = w[ 9] | 0x800000; + break; + + case 39: + w[ 9] = w[ 9] | 0x80000000; + break; + + case 40: + w[10] = 0x80; + break; + + case 41: + w[10] = w[10] | 0x8000; + break; + + case 42: + w[10] = w[10] | 0x800000; + break; + + case 43: + w[10] = w[10] | 0x80000000; + break; + + case 44: + w[11] = 0x80; + break; + + case 45: + w[11] = w[11] | 0x8000; + break; + + case 46: + w[11] = w[11] | 0x800000; + break; + + case 47: + w[11] = w[11] | 0x80000000; + break; + + case 48: + w[12] = 0x80; + break; + + case 49: + w[12] = w[12] | 0x8000; + break; + + case 50: + w[12] = w[12] | 0x800000; + break; + + case 51: + w[12] = w[12] | 0x80000000; + break; + + case 52: + w[13] = 0x80; + break; + + case 53: + w[13] = w[13] | 0x8000; + break; + + case 54: + w[13] = w[13] | 0x800000; + break; + + case 55: + w[13] = w[13] | 0x80000000; + break; + + case 56: + w[14] = 0x80; + break; + + case 57: + w[14] = w[14] | 0x8000; + break; + + case 58: + w[14] = w[14] | 0x800000; + break; + + case 59: + w[14] = w[14] | 0x80000000; + break; + + case 60: + w[15] = 0x80; + break; + + case 61: + w[15] = w[15] | 0x8000; + break; + + case 62: + w[15] = w[15] | 0x800000; + break; + + case 63: + w[15] = w[15] | 0x80000000; + break; + + case 64: + w[16] = 0x80; + break; + + case 65: + w[16] = w[16] | 0x8000; + break; + + case 66: + w[16] = w[16] | 0x800000; + break; + + case 67: + w[16] = w[16] | 0x80000000; + break; + + case 68: + w[17] = 0x80; + break; + + case 69: + w[17] = w[17] | 0x8000; + break; + + case 70: + w[17] = w[17] | 0x800000; + break; + + case 71: + w[17] = w[17] | 0x80000000; + break; + + case 72: + w[18] = 0x80; + break; + + case 73: + w[18] = w[18] | 0x8000; + break; + + case 74: + w[18] = w[18] | 0x800000; + break; + + case 75: + w[18] = w[18] | 0x80000000; + break; + + case 76: + w[19] = 0x80; + break; + + case 77: + w[19] = w[19] | 0x8000; + break; + + case 78: + w[19] = w[19] | 0x800000; + break; + + case 79: + w[19] = w[19] | 0x80000000; + break; + + case 80: + w[20] = 0x80; + break; + + case 81: + w[20] = w[20] | 0x8000; + break; + + case 82: + w[20] = w[20] | 0x800000; + break; + + case 83: + w[20] = w[20] | 0x80000000; + break; + + case 84: + w[21] = 0x80; + break; + + case 85: + w[21] = w[21] | 0x8000; + break; + + case 86: + w[21] = w[21] | 0x800000; + break; + + case 87: + w[21] = w[21] | 0x80000000; + break; + + case 88: + w[22] = 0x80; + break; + + case 89: + w[22] = w[22] | 0x8000; + break; + + case 90: + w[22] = w[22] | 0x800000; + break; + + case 91: + w[22] = w[22] | 0x80000000; + break; + + case 92: + w[23] = 0x80; + break; + + case 93: + w[23] = w[23] | 0x8000; + break; + + case 94: + w[23] = w[23] | 0x800000; + break; + + case 95: + w[23] = w[23] | 0x80000000; + break; + + case 96: + w[24] = 0x80; + break; + + case 97: + w[24] = w[24] | 0x8000; + break; + + case 98: + w[24] = w[24] | 0x800000; + break; + + case 99: + w[24] = w[24] | 0x80000000; + break; + + case 100: + w[25] = 0x80; + break; + + case 101: + w[25] = w[25] | 0x8000; + break; + + case 102: + w[25] = w[25] | 0x800000; + break; + + case 103: + w[25] = w[25] | 0x80000000; + break; + + case 104: + w[26] = 0x80; + break; + + case 105: + w[26] = w[26] | 0x8000; + break; + + case 106: + w[26] = w[26] | 0x800000; + break; + + case 107: + w[26] = w[26] | 0x80000000; + break; + + case 108: + w[27] = 0x80; + break; + + case 109: + w[27] = w[27] | 0x8000; + break; + + case 110: + w[27] = w[27] | 0x800000; + break; + + case 111: + w[27] = w[27] | 0x80000000; + break; + + case 112: + w[28] = 0x80; + break; + + case 113: + w[28] = w[28] | 0x8000; + break; + + case 114: + w[28] = w[28] | 0x800000; + break; + + case 115: + w[28] = w[28] | 0x80000000; + break; + + case 116: + w[29] = 0x80; + break; + + case 117: + w[29] = w[29] | 0x8000; + break; + + case 118: + w[29] = w[29] | 0x800000; + break; + + case 119: + w[29] = w[29] | 0x80000000; + break; + + case 120: + w[30] = 0x80; + break; + + case 121: + w[30] = w[30] | 0x8000; + break; + + case 122: + w[30] = w[30] | 0x800000; + break; + + case 123: + w[30] = w[30] | 0x80000000; + break; + + case 124: + w[31] = 0x80; + break; + + case 125: + w[31] = w[31] | 0x8000; + break; + + case 126: + w[31] = w[31] | 0x800000; + break; + + case 127: + w[31] = w[31] | 0x80000000; + break; + } +} + +__device__ static void device_memcat2L (const u32 offset, u32 dst0[2], u32 src_l0[2], u32 src_r0[2]) +{ + switch (offset) + { + case 1: + dst0[0] = src_l0[0] | src_r0[0] << 8; + dst0[1] = src_r0[0] >> 24 | src_r0[1] << 8; + break; + + case 2: + dst0[0] = src_l0[0] | src_r0[0] << 16; + dst0[1] = src_r0[0] >> 16 | src_r0[1] << 16; + break; + + case 3: + dst0[0] = src_l0[0] | src_r0[0] << 24; + dst0[1] = src_r0[0] >> 8 | src_r0[1] << 24; + break; + + case 4: + dst0[1] = src_r0[0]; + break; + + case 5: + dst0[1] = src_l0[1] | src_r0[0] << 8; + break; + + case 6: + dst0[1] = src_l0[1] | src_r0[0] << 16; + break; + + case 7: + dst0[1] = src_l0[1] | src_r0[0] << 24; + break; + } +} + +__device__ static void device_memcat4L (const u32 offset, u32 dst0[4], u32 src_l0[4], u32 src_r0[4]) +{ + switch (offset) + { + case 1: + dst0[0] = src_l0[0] | src_r0[0] << 8; + dst0[1] = src_r0[0] >> 24 | src_r0[1] << 8; + dst0[2] = src_r0[1] >> 24 | src_r0[2] << 8; + dst0[3] = src_r0[2] >> 24 | src_r0[3] << 8; + break; + + case 2: + dst0[0] = src_l0[0] | src_r0[0] << 16; + dst0[1] = src_r0[0] >> 16 | src_r0[1] << 16; + dst0[2] = src_r0[1] >> 16 | src_r0[2] << 16; + dst0[3] = src_r0[2] >> 16 | src_r0[3] << 16; + break; + + case 3: + dst0[0] = src_l0[0] | src_r0[0] << 24; + dst0[1] = src_r0[0] >> 8 | src_r0[1] << 24; + dst0[2] = src_r0[1] >> 8 | src_r0[2] << 24; + dst0[3] = src_r0[2] >> 8 | src_r0[3] << 24; + break; + + case 4: + dst0[1] = src_r0[0]; + dst0[2] = src_r0[1]; + dst0[3] = src_r0[2]; + break; + + case 5: + dst0[1] = src_l0[1] | src_r0[0] << 8; + dst0[2] = src_r0[0] >> 24 | src_r0[1] << 8; + dst0[3] = src_r0[1] >> 24 | src_r0[2] << 8; + break; + + case 6: + dst0[1] = src_l0[1] | src_r0[0] << 16; + dst0[2] = src_r0[0] >> 16 | src_r0[1] << 16; + dst0[3] = src_r0[1] >> 16 | src_r0[2] << 16; + break; + + case 7: + dst0[1] = src_l0[1] | src_r0[0] << 24; + dst0[2] = src_r0[0] >> 8 | src_r0[1] << 24; + dst0[3] = src_r0[1] >> 8 | src_r0[2] << 24; + break; + + case 8: + dst0[2] = src_r0[0]; + dst0[3] = src_r0[1]; + break; + + case 9: + dst0[2] = src_l0[2] | src_r0[0] << 8; + dst0[3] = src_r0[0] >> 24 | src_r0[1] << 8; + break; + + case 10: + dst0[2] = src_l0[2] | src_r0[0] << 16; + dst0[3] = src_r0[0] >> 16 | src_r0[1] << 16; + break; + + case 11: + dst0[2] = src_l0[2] | src_r0[0] << 24; + dst0[3] = src_r0[0] >> 8 | src_r0[1] << 24; + break; + + case 12: + dst0[3] = src_r0[0]; + break; + + case 13: + dst0[3] = src_l0[3] | src_r0[0] << 8; + break; + + case 14: + dst0[3] = src_l0[3] | src_r0[0] << 16; + break; + + case 15: + dst0[3] = src_l0[3] | src_r0[0] << 24; + break; + } +} + +__device__ static void device_memcat8L (const u32 offset, u32 dst0[4], u32 dst1[4], u32 src_l0[4], u32 src_l1[4], u32 src_r0[4]) +{ + switch (offset) + { + case 1: + dst0[0] = src_l0[0] | src_r0[0] << 8; + dst0[1] = src_r0[0] >> 24 | src_r0[1] << 8; + dst0[2] = src_r0[1] >> 24 | src_r0[2] << 8; + dst0[3] = src_r0[2] >> 24 | src_r0[3] << 8; + dst1[0] = src_r0[3] >> 24; + break; + + case 2: + dst0[0] = src_l0[0] | src_r0[0] << 16; + dst0[1] = src_r0[0] >> 16 | src_r0[1] << 16; + dst0[2] = src_r0[1] >> 16 | src_r0[2] << 16; + dst0[3] = src_r0[2] >> 16 | src_r0[3] << 16; + dst1[0] = src_r0[3] >> 16; + break; + + case 3: + dst0[0] = src_l0[0] | src_r0[0] << 24; + dst0[1] = src_r0[0] >> 8 | src_r0[1] << 24; + dst0[2] = src_r0[1] >> 8 | src_r0[2] << 24; + dst0[3] = src_r0[2] >> 8 | src_r0[3] << 24; + dst1[0] = src_r0[3] >> 8; + break; + + case 4: + dst0[1] = src_r0[0]; + dst0[2] = src_r0[1]; + dst0[3] = src_r0[2]; + dst1[0] = src_r0[3]; + break; + + case 5: + dst0[1] = src_l0[1] | src_r0[0] << 8; + dst0[2] = src_r0[0] >> 24 | src_r0[1] << 8; + dst0[3] = src_r0[1] >> 24 | src_r0[2] << 8; + dst1[0] = src_r0[2] >> 24 | src_r0[3] << 8; + dst1[1] = src_r0[3] >> 24; + break; + + case 6: + dst0[1] = src_l0[1] | src_r0[0] << 16; + dst0[2] = src_r0[0] >> 16 | src_r0[1] << 16; + dst0[3] = src_r0[1] >> 16 | src_r0[2] << 16; + dst1[0] = src_r0[2] >> 16 | src_r0[3] << 16; + dst1[1] = src_r0[3] >> 16; + break; + + case 7: + dst0[1] = src_l0[1] | src_r0[0] << 24; + dst0[2] = src_r0[0] >> 8 | src_r0[1] << 24; + dst0[3] = src_r0[1] >> 8 | src_r0[2] << 24; + dst1[0] = src_r0[2] >> 8 | src_r0[3] << 24; + dst1[1] = src_r0[3] >> 8; + break; + + case 8: + dst0[2] = src_r0[0]; + dst0[3] = src_r0[1]; + dst1[0] = src_r0[2]; + dst1[1] = src_r0[3]; + break; + + case 9: + dst0[2] = src_l0[2] | src_r0[0] << 8; + dst0[3] = src_r0[0] >> 24 | src_r0[1] << 8; + dst1[0] = src_r0[1] >> 24 | src_r0[2] << 8; + dst1[1] = src_r0[2] >> 24 | src_r0[3] << 8; + dst1[2] = src_r0[3] >> 24; + break; + + case 10: + dst0[2] = src_l0[2] | src_r0[0] << 16; + dst0[3] = src_r0[0] >> 16 | src_r0[1] << 16; + dst1[0] = src_r0[1] >> 16 | src_r0[2] << 16; + dst1[1] = src_r0[2] >> 16 | src_r0[3] << 16; + dst1[2] = src_r0[3] >> 16; + break; + + case 11: + dst0[2] = src_l0[2] | src_r0[0] << 24; + dst0[3] = src_r0[0] >> 8 | src_r0[1] << 24; + dst1[0] = src_r0[1] >> 8 | src_r0[2] << 24; + dst1[1] = src_r0[2] >> 8 | src_r0[3] << 24; + dst1[2] = src_r0[3] >> 8; + break; + + case 12: + dst0[3] = src_r0[0]; + dst1[0] = src_r0[1]; + dst1[1] = src_r0[2]; + dst1[2] = src_r0[3]; + break; + + case 13: + dst0[3] = src_l0[3] | src_r0[0] << 8; + dst1[0] = src_r0[0] >> 24 | src_r0[1] << 8; + dst1[1] = src_r0[1] >> 24 | src_r0[2] << 8; + dst1[2] = src_r0[2] >> 24 | src_r0[3] << 8; + dst1[3] = src_r0[3] >> 24; + break; + + case 14: + dst0[3] = src_l0[3] | src_r0[0] << 16; + dst1[0] = src_r0[0] >> 16 | src_r0[1] << 16; + dst1[1] = src_r0[1] >> 16 | src_r0[2] << 16; + dst1[2] = src_r0[2] >> 16 | src_r0[3] << 16; + dst1[3] = src_r0[3] >> 16; + break; + + case 15: + dst0[3] = src_l0[3] | src_r0[0] << 24; + dst1[0] = src_r0[0] >> 8 | src_r0[1] << 24; + dst1[1] = src_r0[1] >> 8 | src_r0[2] << 24; + dst1[2] = src_r0[2] >> 8 | src_r0[3] << 24; + dst1[3] = src_r0[3] >> 8; + break; + + case 16: + dst1[0] = src_r0[0]; + dst1[1] = src_r0[1]; + dst1[2] = src_r0[2]; + dst1[3] = src_r0[3]; + break; + + case 17: + dst1[0] = src_l1[0] | src_r0[0] << 8; + dst1[1] = src_r0[0] >> 24 | src_r0[1] << 8; + dst1[2] = src_r0[1] >> 24 | src_r0[2] << 8; + dst1[3] = src_r0[2] >> 24 | src_r0[3] << 8; + break; + + case 18: + dst1[0] = src_l1[0] | src_r0[0] << 16; + dst1[1] = src_r0[0] >> 16 | src_r0[1] << 16; + dst1[2] = src_r0[1] >> 16 | src_r0[2] << 16; + dst1[3] = src_r0[2] >> 16 | src_r0[3] << 16; + break; + + case 19: + dst1[0] = src_l1[0] | src_r0[0] << 24; + dst1[1] = src_r0[0] >> 8 | src_r0[1] << 24; + dst1[2] = src_r0[1] >> 8 | src_r0[2] << 24; + dst1[3] = src_r0[2] >> 8 | src_r0[3] << 24; + break; + + case 20: + dst1[1] = src_r0[0]; + dst1[2] = src_r0[1]; + dst1[3] = src_r0[2]; + break; + + case 21: + dst1[1] = src_l1[1] | src_r0[0] << 8; + dst1[2] = src_r0[0] >> 24 | src_r0[1] << 8; + dst1[3] = src_r0[1] >> 24 | src_r0[2] << 8; + break; + + case 22: + dst1[1] = src_l1[1] | src_r0[0] << 16; + dst1[2] = src_r0[0] >> 16 | src_r0[1] << 16; + dst1[3] = src_r0[1] >> 16 | src_r0[2] << 16; + break; + + case 23: + dst1[1] = src_l1[1] | src_r0[0] << 24; + dst1[2] = src_r0[0] >> 8 | src_r0[1] << 24; + dst1[3] = src_r0[1] >> 8 | src_r0[2] << 24; + break; + + case 24: + dst1[2] = src_r0[0]; + dst1[3] = src_r0[1]; + break; + + case 25: + dst1[2] = src_l1[2] | src_r0[0] << 8; + dst1[3] = src_r0[0] >> 24 | src_r0[1] << 8; + break; + + case 26: + dst1[2] = src_l1[2] | src_r0[0] << 16; + dst1[3] = src_r0[0] >> 16 | src_r0[1] << 16; + break; + + case 27: + dst1[2] = src_l1[2] | src_r0[0] << 24; + dst1[3] = src_r0[0] >> 8 | src_r0[1] << 24; + break; + + case 28: + dst1[3] = src_r0[0]; + break; + + case 29: + dst1[3] = src_l1[3] | src_r0[0] << 8; + break; + + case 30: + dst1[3] = src_l1[3] | src_r0[0] << 16; + break; + + case 31: + dst1[3] = src_l1[3] | src_r0[0] << 24; + break; + } +} + +__device__ static void device_memcat12L (const u32 offset, u32 dst0[4], u32 dst1[4], u32 dst2[4], u32 src_l0[4], u32 src_l1[4], u32 src_l2[4], u32 src_r0[4]) +{ + switch (offset) + { + case 1: + dst0[0] = src_l0[0] | src_r0[0] << 8; + dst0[1] = src_r0[0] >> 24 | src_r0[1] << 8; + dst0[2] = src_r0[1] >> 24 | src_r0[2] << 8; + dst0[3] = src_r0[2] >> 24 | src_r0[3] << 8; + dst1[0] = src_r0[3] >> 24; + break; + + case 2: + dst0[0] = src_l0[0] | src_r0[0] << 16; + dst0[1] = src_r0[0] >> 16 | src_r0[1] << 16; + dst0[2] = src_r0[1] >> 16 | src_r0[2] << 16; + dst0[3] = src_r0[2] >> 16 | src_r0[3] << 16; + dst1[0] = src_r0[3] >> 16; + break; + + case 3: + dst0[0] = src_l0[0] | src_r0[0] << 24; + dst0[1] = src_r0[0] >> 8 | src_r0[1] << 24; + dst0[2] = src_r0[1] >> 8 | src_r0[2] << 24; + dst0[3] = src_r0[2] >> 8 | src_r0[3] << 24; + dst1[0] = src_r0[3] >> 8; + break; + + case 4: + dst0[1] = src_r0[0]; + dst0[2] = src_r0[1]; + dst0[3] = src_r0[2]; + dst1[0] = src_r0[3]; + break; + + case 5: + dst0[1] = src_l0[1] | src_r0[0] << 8; + dst0[2] = src_r0[0] >> 24 | src_r0[1] << 8; + dst0[3] = src_r0[1] >> 24 | src_r0[2] << 8; + dst1[0] = src_r0[2] >> 24 | src_r0[3] << 8; + dst1[1] = src_r0[3] >> 24; + break; + + case 6: + dst0[1] = src_l0[1] | src_r0[0] << 16; + dst0[2] = src_r0[0] >> 16 | src_r0[1] << 16; + dst0[3] = src_r0[1] >> 16 | src_r0[2] << 16; + dst1[0] = src_r0[2] >> 16 | src_r0[3] << 16; + dst1[1] = src_r0[3] >> 16; + break; + + case 7: + dst0[1] = src_l0[1] | src_r0[0] << 24; + dst0[2] = src_r0[0] >> 8 | src_r0[1] << 24; + dst0[3] = src_r0[1] >> 8 | src_r0[2] << 24; + dst1[0] = src_r0[2] >> 8 | src_r0[3] << 24; + dst1[1] = src_r0[3] >> 8; + break; + + case 8: + dst0[2] = src_r0[0]; + dst0[3] = src_r0[1]; + dst1[0] = src_r0[2]; + dst1[1] = src_r0[3]; + break; + + case 9: + dst0[2] = src_l0[2] | src_r0[0] << 8; + dst0[3] = src_r0[0] >> 24 | src_r0[1] << 8; + dst1[0] = src_r0[1] >> 24 | src_r0[2] << 8; + dst1[1] = src_r0[2] >> 24 | src_r0[3] << 8; + dst1[2] = src_r0[3] >> 24; + break; + + case 10: + dst0[2] = src_l0[2] | src_r0[0] << 16; + dst0[3] = src_r0[0] >> 16 | src_r0[1] << 16; + dst1[0] = src_r0[1] >> 16 | src_r0[2] << 16; + dst1[1] = src_r0[2] >> 16 | src_r0[3] << 16; + dst1[2] = src_r0[3] >> 16; + break; + + case 11: + dst0[2] = src_l0[2] | src_r0[0] << 24; + dst0[3] = src_r0[0] >> 8 | src_r0[1] << 24; + dst1[0] = src_r0[1] >> 8 | src_r0[2] << 24; + dst1[1] = src_r0[2] >> 8 | src_r0[3] << 24; + dst1[2] = src_r0[3] >> 8; + break; + + case 12: + dst0[3] = src_r0[0]; + dst1[0] = src_r0[1]; + dst1[1] = src_r0[2]; + dst1[2] = src_r0[3]; + break; + + case 13: + dst0[3] = src_l0[3] | src_r0[0] << 8; + dst1[0] = src_r0[0] >> 24 | src_r0[1] << 8; + dst1[1] = src_r0[1] >> 24 | src_r0[2] << 8; + dst1[2] = src_r0[2] >> 24 | src_r0[3] << 8; + dst1[3] = src_r0[3] >> 24; + break; + + case 14: + dst0[3] = src_l0[3] | src_r0[0] << 16; + dst1[0] = src_r0[0] >> 16 | src_r0[1] << 16; + dst1[1] = src_r0[1] >> 16 | src_r0[2] << 16; + dst1[2] = src_r0[2] >> 16 | src_r0[3] << 16; + dst1[3] = src_r0[3] >> 16; + break; + + case 15: + dst0[3] = src_l0[3] | src_r0[0] << 24; + dst1[0] = src_r0[0] >> 8 | src_r0[1] << 24; + dst1[1] = src_r0[1] >> 8 | src_r0[2] << 24; + dst1[2] = src_r0[2] >> 8 | src_r0[3] << 24; + dst1[3] = src_r0[3] >> 8; + break; + + case 16: + dst1[0] = src_r0[0]; + dst1[1] = src_r0[1]; + dst1[2] = src_r0[2]; + dst1[3] = src_r0[3]; + break; + + case 17: + dst1[0] = src_l1[0] | src_r0[0] << 8; + dst1[1] = src_r0[0] >> 24 | src_r0[1] << 8; + dst1[2] = src_r0[1] >> 24 | src_r0[2] << 8; + dst1[3] = src_r0[2] >> 24 | src_r0[3] << 8; + dst2[0] = src_r0[3] >> 24; + break; + + case 18: + dst1[0] = src_l1[0] | src_r0[0] << 16; + dst1[1] = src_r0[0] >> 16 | src_r0[1] << 16; + dst1[2] = src_r0[1] >> 16 | src_r0[2] << 16; + dst1[3] = src_r0[2] >> 16 | src_r0[3] << 16; + dst2[0] = src_r0[3] >> 16; + break; + + case 19: + dst1[0] = src_l1[0] | src_r0[0] << 24; + dst1[1] = src_r0[0] >> 8 | src_r0[1] << 24; + dst1[2] = src_r0[1] >> 8 | src_r0[2] << 24; + dst1[3] = src_r0[2] >> 8 | src_r0[3] << 24; + dst2[0] = src_r0[3] >> 8; + break; + + case 20: + dst1[1] = src_r0[0]; + dst1[2] = src_r0[1]; + dst1[3] = src_r0[2]; + dst2[0] = src_r0[3]; + break; + + case 21: + dst1[1] = src_l1[1] | src_r0[0] << 8; + dst1[2] = src_r0[0] >> 24 | src_r0[1] << 8; + dst1[3] = src_r0[1] >> 24 | src_r0[2] << 8; + dst2[0] = src_r0[2] >> 24 | src_r0[3] << 8; + dst2[1] = src_r0[3] >> 24; + break; + + case 22: + dst1[1] = src_l1[1] | src_r0[0] << 16; + dst1[2] = src_r0[0] >> 16 | src_r0[1] << 16; + dst1[3] = src_r0[1] >> 16 | src_r0[2] << 16; + dst2[0] = src_r0[2] >> 16 | src_r0[3] << 16; + dst2[1] = src_r0[3] >> 16; + break; + + case 23: + dst1[1] = src_l1[1] | src_r0[0] << 24; + dst1[2] = src_r0[0] >> 8 | src_r0[1] << 24; + dst1[3] = src_r0[1] >> 8 | src_r0[2] << 24; + dst2[0] = src_r0[2] >> 8 | src_r0[3] << 24; + dst2[1] = src_r0[3] >> 8; + break; + + case 24: + dst1[2] = src_r0[0]; + dst1[3] = src_r0[1]; + dst2[0] = src_r0[2]; + dst2[1] = src_r0[3]; + break; + + case 25: + dst1[2] = src_l1[2] | src_r0[0] << 8; + dst1[3] = src_r0[0] >> 24 | src_r0[1] << 8; + dst2[0] = src_r0[1] >> 24 | src_r0[2] << 8; + dst2[1] = src_r0[2] >> 24 | src_r0[3] << 8; + dst2[2] = src_r0[3] >> 24; + break; + + case 26: + dst1[2] = src_l1[2] | src_r0[0] << 16; + dst1[3] = src_r0[0] >> 16 | src_r0[1] << 16; + dst2[0] = src_r0[1] >> 16 | src_r0[2] << 16; + dst2[1] = src_r0[2] >> 16 | src_r0[3] << 16; + dst2[2] = src_r0[3] >> 16; + break; + + case 27: + dst1[2] = src_l1[2] | src_r0[0] << 24; + dst1[3] = src_r0[0] >> 8 | src_r0[1] << 24; + dst2[0] = src_r0[1] >> 8 | src_r0[2] << 24; + dst2[1] = src_r0[2] >> 8 | src_r0[3] << 24; + dst2[2] = src_r0[3] >> 8; + break; + + case 28: + dst1[3] = src_r0[0]; + dst2[0] = src_r0[1]; + dst2[1] = src_r0[2]; + dst2[2] = src_r0[3]; + break; + + case 29: + dst1[3] = src_l1[3] | src_r0[0] << 8; + dst2[0] = src_r0[0] >> 24 | src_r0[1] << 8; + dst2[1] = src_r0[1] >> 24 | src_r0[2] << 8; + dst2[2] = src_r0[2] >> 24 | src_r0[3] << 8; + dst2[3] = src_r0[3] >> 24; + break; + + case 30: + dst1[3] = src_l1[3] | src_r0[0] << 16; + dst2[0] = src_r0[0] >> 16 | src_r0[1] << 16; + dst2[1] = src_r0[1] >> 16 | src_r0[2] << 16; + dst2[2] = src_r0[2] >> 16 | src_r0[3] << 16; + dst2[3] = src_r0[3] >> 16; + break; + + case 31: + dst1[3] = src_l1[3] | src_r0[0] << 24; + dst2[0] = src_r0[0] >> 8 | src_r0[1] << 24; + dst2[1] = src_r0[1] >> 8 | src_r0[2] << 24; + dst2[2] = src_r0[2] >> 8 | src_r0[3] << 24; + dst2[3] = src_r0[3] >> 8; + break; + + case 32: + dst2[0] = src_r0[0]; + dst2[1] = src_r0[1]; + dst2[2] = src_r0[2]; + dst2[3] = src_r0[3]; + break; + + case 33: + dst2[0] = src_l2[0] | src_r0[0] << 8; + dst2[1] = src_r0[0] >> 24 | src_r0[1] << 8; + dst2[2] = src_r0[1] >> 24 | src_r0[2] << 8; + dst2[3] = src_r0[2] >> 24 | src_r0[3] << 8; + break; + + case 34: + dst2[0] = src_l2[0] | src_r0[0] << 16; + dst2[1] = src_r0[0] >> 16 | src_r0[1] << 16; + dst2[2] = src_r0[1] >> 16 | src_r0[2] << 16; + dst2[3] = src_r0[2] >> 16 | src_r0[3] << 16; + break; + + case 35: + dst2[0] = src_l2[0] | src_r0[0] << 24; + dst2[1] = src_r0[0] >> 8 | src_r0[1] << 24; + dst2[2] = src_r0[1] >> 8 | src_r0[2] << 24; + dst2[3] = src_r0[2] >> 8 | src_r0[3] << 24; + break; + + case 36: + dst2[1] = src_r0[0]; + dst2[2] = src_r0[1]; + dst2[3] = src_r0[2]; + break; + + case 37: + dst2[1] = src_l2[1] | src_r0[0] << 8; + dst2[2] = src_r0[0] >> 24 | src_r0[1] << 8; + dst2[3] = src_r0[1] >> 24 | src_r0[2] << 8; + break; + + case 38: + dst2[1] = src_l2[1] | src_r0[0] << 16; + dst2[2] = src_r0[0] >> 16 | src_r0[1] << 16; + dst2[3] = src_r0[1] >> 16 | src_r0[2] << 16; + break; + + case 39: + dst2[1] = src_l2[1] | src_r0[0] << 24; + dst2[2] = src_r0[0] >> 8 | src_r0[1] << 24; + dst2[3] = src_r0[1] >> 8 | src_r0[2] << 24; + break; + + case 40: + dst2[2] = src_r0[0]; + dst2[3] = src_r0[1]; + break; + + case 41: + dst2[2] = src_l2[2] | src_r0[0] << 8; + dst2[3] = src_r0[0] >> 24 | src_r0[1] << 8; + break; + + case 42: + dst2[2] = src_l2[2] | src_r0[0] << 16; + dst2[3] = src_r0[0] >> 16 | src_r0[1] << 16; + break; + + case 43: + dst2[2] = src_l2[2] | src_r0[0] << 24; + dst2[3] = src_r0[0] >> 8 | src_r0[1] << 24; + break; + + case 44: + dst2[3] = src_r0[0]; + break; + + case 45: + dst2[3] = src_l2[3] | src_r0[0] << 8; + break; + + case 46: + dst2[3] = src_l2[3] | src_r0[0] << 16; + break; + + case 47: + dst2[3] = src_l2[3] | src_r0[0] << 24; + break; + } +} + +__device__ static void device_memcat12L (const u32 offset, u32 dst0[4], u32 dst1[4], u32 dst2[4], u32 src_l0[4], u32 src_l1[4], u32 src_l2[4], u32 src_r0[4], u32 src_r1[4]) +{ + switch (offset) + { + case 0: + dst0[0] = src_r0[0]; + dst0[1] = src_r0[1]; + dst0[2] = src_r0[2]; + dst0[3] = src_r0[3]; + dst1[0] = src_r1[0]; + dst1[1] = src_r1[1]; + dst1[2] = src_r1[2]; + dst1[3] = src_r1[3]; + break; + + case 1: + dst0[0] = src_l0[0] | src_r0[0] << 8; + dst0[1] = src_r0[0] >> 24 | src_r0[1] << 8; + dst0[2] = src_r0[1] >> 24 | src_r0[2] << 8; + dst0[3] = src_r0[2] >> 24 | src_r0[3] << 8; + dst1[0] = src_r0[3] >> 24 | src_r1[0] << 8; + dst1[1] = src_r1[0] >> 24 | src_r1[1] << 8; + dst1[2] = src_r1[1] >> 24 | src_r1[2] << 8; + dst1[3] = src_r1[2] >> 24 | src_r1[3] << 8; + dst2[0] = src_r1[3] >> 24; + break; + + case 2: + dst0[0] = src_l0[0] | src_r0[0] << 16; + dst0[1] = src_r0[0] >> 16 | src_r0[1] << 16; + dst0[2] = src_r0[1] >> 16 | src_r0[2] << 16; + dst0[3] = src_r0[2] >> 16 | src_r0[3] << 16; + dst1[0] = src_r0[3] >> 16 | src_r1[0] << 16; + dst1[1] = src_r1[0] >> 16 | src_r1[1] << 16; + dst1[2] = src_r1[1] >> 16 | src_r1[2] << 16; + dst1[3] = src_r1[2] >> 16 | src_r1[3] << 16; + dst2[0] = src_r1[3] >> 16; + break; + + case 3: + dst0[0] = src_l0[0] | src_r0[0] << 24; + dst0[1] = src_r0[0] >> 8 | src_r0[1] << 24; + dst0[2] = src_r0[1] >> 8 | src_r0[2] << 24; + dst0[3] = src_r0[2] >> 8 | src_r0[3] << 24; + dst1[0] = src_r0[3] >> 8 | src_r1[0] << 24; + dst1[1] = src_r1[0] >> 8 | src_r1[1] << 24; + dst1[2] = src_r1[1] >> 8 | src_r1[2] << 24; + dst1[3] = src_r1[2] >> 8 | src_r1[3] << 24; + dst2[0] = src_r1[3] >> 8; + break; + + case 4: + dst0[1] = src_r0[0]; + dst0[2] = src_r0[1]; + dst0[3] = src_r0[2]; + dst1[0] = src_r0[3]; + dst1[1] = src_r1[0]; + dst1[2] = src_r1[1]; + dst1[3] = src_r1[2]; + dst2[0] = src_r1[3]; + break; + + case 5: + dst0[1] = src_l0[1] | src_r0[0] << 8; + dst0[2] = src_r0[0] >> 24 | src_r0[1] << 8; + dst0[3] = src_r0[1] >> 24 | src_r0[2] << 8; + dst1[0] = src_r0[2] >> 24 | src_r0[3] << 8; + dst1[1] = src_r0[3] >> 24 | src_r1[0] << 8; + dst1[2] = src_r1[0] >> 24 | src_r1[1] << 8; + dst1[3] = src_r1[1] >> 24 | src_r1[2] << 8; + dst2[0] = src_r1[2] >> 24 | src_r1[3] << 8; + dst2[1] = src_r1[3] >> 24; + break; + + case 6: + dst0[1] = src_l0[1] | src_r0[0] << 16; + dst0[2] = src_r0[0] >> 16 | src_r0[1] << 16; + dst0[3] = src_r0[1] >> 16 | src_r0[2] << 16; + dst1[0] = src_r0[2] >> 16 | src_r0[3] << 16; + dst1[1] = src_r0[3] >> 16 | src_r1[0] << 16; + dst1[2] = src_r1[0] >> 16 | src_r1[1] << 16; + dst1[3] = src_r1[1] >> 16 | src_r1[2] << 16; + dst2[0] = src_r1[2] >> 16 | src_r1[3] << 16; + dst2[1] = src_r1[3] >> 16; + break; + + case 7: + dst0[1] = src_l0[1] | src_r0[0] << 24; + dst0[2] = src_r0[0] >> 8 | src_r0[1] << 24; + dst0[3] = src_r0[1] >> 8 | src_r0[2] << 24; + dst1[0] = src_r0[2] >> 8 | src_r0[3] << 24; + dst1[1] = src_r0[3] >> 8 | src_r1[0] << 24; + dst1[2] = src_r1[0] >> 8 | src_r1[1] << 24; + dst1[3] = src_r1[1] >> 8 | src_r1[2] << 24; + dst2[0] = src_r1[2] >> 8 | src_r1[3] << 24; + dst2[1] = src_r1[3] >> 8; + break; + + case 8: + dst0[2] = src_r0[0]; + dst0[3] = src_r0[1]; + dst1[0] = src_r0[2]; + dst1[1] = src_r0[3]; + dst1[2] = src_r1[0]; + dst1[3] = src_r1[1]; + dst2[0] = src_r1[2]; + dst2[1] = src_r1[3]; + break; + + case 9: + dst0[2] = src_l0[2] | src_r0[0] << 8; + dst0[3] = src_r0[0] >> 24 | src_r0[1] << 8; + dst1[0] = src_r0[1] >> 24 | src_r0[2] << 8; + dst1[1] = src_r0[2] >> 24 | src_r0[3] << 8; + dst1[2] = src_r0[3] >> 24 | src_r1[0] << 8; + dst1[3] = src_r1[0] >> 24 | src_r1[1] << 8; + dst2[0] = src_r1[1] >> 24 | src_r1[2] << 8; + dst2[1] = src_r1[2] >> 24 | src_r1[3] << 8; + dst2[2] = src_r1[3] >> 24; + break; + + case 10: + dst0[2] = src_l0[2] | src_r0[0] << 16; + dst0[3] = src_r0[0] >> 16 | src_r0[1] << 16; + dst1[0] = src_r0[1] >> 16 | src_r0[2] << 16; + dst1[1] = src_r0[2] >> 16 | src_r0[3] << 16; + dst1[2] = src_r0[3] >> 16 | src_r1[0] << 16; + dst1[3] = src_r1[0] >> 16 | src_r1[1] << 16; + dst2[0] = src_r1[1] >> 16 | src_r1[2] << 16; + dst2[1] = src_r1[2] >> 16 | src_r1[3] << 16; + dst2[2] = src_r1[3] >> 16; + break; + + case 11: + dst0[2] = src_l0[2] | src_r0[0] << 24; + dst0[3] = src_r0[0] >> 8 | src_r0[1] << 24; + dst1[0] = src_r0[1] >> 8 | src_r0[2] << 24; + dst1[1] = src_r0[2] >> 8 | src_r0[3] << 24; + dst1[2] = src_r0[3] >> 8 | src_r1[0] << 24; + dst1[3] = src_r1[0] >> 8 | src_r1[1] << 24; + dst2[0] = src_r1[1] >> 8 | src_r1[2] << 24; + dst2[1] = src_r1[2] >> 8 | src_r1[3] << 24; + dst2[2] = src_r1[3] >> 8; + break; + + case 12: + dst0[3] = src_r0[0]; + dst1[0] = src_r0[1]; + dst1[1] = src_r0[2]; + dst1[2] = src_r0[3]; + dst1[3] = src_r1[0]; + dst2[0] = src_r1[1]; + dst2[1] = src_r1[2]; + dst2[2] = src_r1[3]; + break; + + case 13: + dst0[3] = src_l0[3] | src_r0[0] << 8; + dst1[0] = src_r0[0] >> 24 | src_r0[1] << 8; + dst1[1] = src_r0[1] >> 24 | src_r0[2] << 8; + dst1[2] = src_r0[2] >> 24 | src_r0[3] << 8; + dst1[3] = src_r0[3] >> 24 | src_r1[0] << 8; + dst2[0] = src_r1[0] >> 24 | src_r1[1] << 8; + dst2[1] = src_r1[1] >> 24 | src_r1[2] << 8; + dst2[2] = src_r1[2] >> 24 | src_r1[3] << 8; + dst2[3] = src_r1[3] >> 24; + break; + + case 14: + dst0[3] = src_l0[3] | src_r0[0] << 16; + dst1[0] = src_r0[0] >> 16 | src_r0[1] << 16; + dst1[1] = src_r0[1] >> 16 | src_r0[2] << 16; + dst1[2] = src_r0[2] >> 16 | src_r0[3] << 16; + dst1[3] = src_r0[3] >> 16 | src_r1[0] << 16; + dst2[0] = src_r1[0] >> 16 | src_r1[1] << 16; + dst2[1] = src_r1[1] >> 16 | src_r1[2] << 16; + dst2[2] = src_r1[2] >> 16 | src_r1[3] << 16; + dst2[3] = src_r1[3] >> 16; + break; + + case 15: + dst0[3] = src_l0[3] | src_r0[0] << 24; + dst1[0] = src_r0[0] >> 8 | src_r0[1] << 24; + dst1[1] = src_r0[1] >> 8 | src_r0[2] << 24; + dst1[2] = src_r0[2] >> 8 | src_r0[3] << 24; + dst1[3] = src_r0[3] >> 8 | src_r1[0] << 24; + dst2[0] = src_r1[0] >> 8 | src_r1[1] << 24; + dst2[1] = src_r1[1] >> 8 | src_r1[2] << 24; + dst2[2] = src_r1[2] >> 8 | src_r1[3] << 24; + dst2[3] = src_r1[3] >> 8; + break; + + case 16: + dst1[0] = src_r0[0]; + dst1[1] = src_r0[1]; + dst1[2] = src_r0[2]; + dst1[3] = src_r0[3]; + dst2[0] = src_r1[0]; + dst2[1] = src_r1[1]; + dst2[2] = src_r1[2]; + dst2[3] = src_r1[3]; + break; + + case 17: + dst1[0] = src_l1[0] | src_r0[0] << 8; + dst1[1] = src_r0[0] >> 24 | src_r0[1] << 8; + dst1[2] = src_r0[1] >> 24 | src_r0[2] << 8; + dst1[3] = src_r0[2] >> 24 | src_r0[3] << 8; + dst2[0] = src_r0[3] >> 24 | src_r1[0] << 8; + dst2[1] = src_r1[0] >> 24 | src_r1[1] << 8; + dst2[2] = src_r1[1] >> 24 | src_r1[2] << 8; + dst2[3] = src_r1[2] >> 24 | src_r1[3] << 8; + break; + + case 18: + dst1[0] = src_l1[0] | src_r0[0] << 16; + dst1[1] = src_r0[0] >> 16 | src_r0[1] << 16; + dst1[2] = src_r0[1] >> 16 | src_r0[2] << 16; + dst1[3] = src_r0[2] >> 16 | src_r0[3] << 16; + dst2[0] = src_r0[3] >> 16 | src_r1[0] << 16; + dst2[1] = src_r1[0] >> 16 | src_r1[1] << 16; + dst2[2] = src_r1[1] >> 16 | src_r1[2] << 16; + dst2[3] = src_r1[2] >> 16 | src_r1[3] << 16; + break; + + case 19: + dst1[0] = src_l1[0] | src_r0[0] << 24; + dst1[1] = src_r0[0] >> 8 | src_r0[1] << 24; + dst1[2] = src_r0[1] >> 8 | src_r0[2] << 24; + dst1[3] = src_r0[2] >> 8 | src_r0[3] << 24; + dst2[0] = src_r0[3] >> 8 | src_r1[0] << 24; + dst2[1] = src_r1[0] >> 8 | src_r1[1] << 24; + dst2[2] = src_r1[1] >> 8 | src_r1[2] << 24; + dst2[3] = src_r1[2] >> 8 | src_r1[3] << 24; + break; + + case 20: + dst1[1] = src_r1[0]; + dst1[2] = src_r0[1]; + dst1[3] = src_r0[2]; + dst2[0] = src_r0[3]; + dst2[1] = src_r1[0]; + dst2[2] = src_r1[1]; + dst2[3] = src_r1[2]; + break; + + case 21: + dst1[1] = src_l1[1] | src_r0[0] << 8; + dst1[2] = src_r0[0] >> 24 | src_r0[1] << 8; + dst1[3] = src_r0[1] >> 24 | src_r0[2] << 8; + dst2[0] = src_r0[2] >> 24 | src_r0[3] << 8; + dst2[1] = src_r0[3] >> 24 | src_r1[0] << 8; + dst2[2] = src_r1[0] >> 24 | src_r1[1] << 8; + dst2[3] = src_r1[1] >> 24 | src_r1[2] << 8; + break; + + case 22: + dst1[1] = src_l1[1] | src_r0[0] << 16; + dst1[2] = src_r0[0] >> 16 | src_r0[1] << 16; + dst1[3] = src_r0[1] >> 16 | src_r0[2] << 16; + dst2[0] = src_r0[2] >> 16 | src_r0[3] << 16; + dst2[1] = src_r0[3] >> 16 | src_r1[0] << 16; + dst2[2] = src_r1[0] >> 16 | src_r1[1] << 16; + dst2[3] = src_r1[1] >> 16 | src_r1[2] << 16; + break; + + case 23: + dst1[1] = src_l1[1] | src_r0[0] << 24; + dst1[2] = src_r0[0] >> 8 | src_r0[1] << 24; + dst1[3] = src_r0[1] >> 8 | src_r0[2] << 24; + dst2[0] = src_r0[2] >> 8 | src_r0[3] << 24; + dst2[1] = src_r0[3] >> 8 | src_r1[0] << 24; + dst2[2] = src_r1[0] >> 8 | src_r1[1] << 24; + dst2[3] = src_r1[1] >> 8 | src_r1[2] << 24; + break; + + case 24: + dst1[2] = src_r1[0]; + dst1[3] = src_r0[1]; + dst2[0] = src_r0[2]; + dst2[1] = src_r0[3]; + dst2[2] = src_r1[0]; + dst2[3] = src_r1[1]; + break; + + case 25: + dst1[2] = src_l1[2] | src_r0[0] << 8; + dst1[3] = src_r0[0] >> 24 | src_r0[1] << 8; + dst2[0] = src_r0[1] >> 24 | src_r0[2] << 8; + dst2[1] = src_r0[2] >> 24 | src_r0[3] << 8; + dst2[2] = src_r0[3] >> 24 | src_r1[0] << 8; + dst2[3] = src_r1[0] >> 24 | src_r1[1] << 8; + break; + + case 26: + dst1[2] = src_l1[2] | src_r0[0] << 16; + dst1[3] = src_r0[0] >> 16 | src_r0[1] << 16; + dst2[0] = src_r0[1] >> 16 | src_r0[2] << 16; + dst2[1] = src_r0[2] >> 16 | src_r0[3] << 16; + dst2[2] = src_r0[3] >> 16 | src_r1[0] << 16; + dst2[3] = src_r1[0] >> 16 | src_r1[1] << 16; + break; + + case 27: + dst1[2] = src_l1[2] | src_r0[0] << 24; + dst1[3] = src_r0[0] >> 8 | src_r0[1] << 24; + dst2[0] = src_r0[1] >> 8 | src_r0[2] << 24; + dst2[1] = src_r0[2] >> 8 | src_r0[3] << 24; + dst2[2] = src_r0[3] >> 8 | src_r1[0] << 24; + dst2[3] = src_r1[0] >> 8 | src_r1[1] << 24; + break; + + case 28: + dst1[3] = src_r1[0]; + dst2[0] = src_r0[1]; + dst2[1] = src_r0[2]; + dst2[2] = src_r0[3]; + dst2[3] = src_r1[0]; + break; + + case 29: + dst1[3] = src_l1[3] | src_r0[0] << 8; + dst2[0] = src_r0[0] >> 24 | src_r0[1] << 8; + dst2[1] = src_r0[1] >> 24 | src_r0[2] << 8; + dst2[2] = src_r0[2] >> 24 | src_r0[3] << 8; + dst2[3] = src_r0[3] >> 24 | src_r1[0] << 8; + break; + + case 30: + dst1[3] = src_l1[3] | src_r0[0] << 16; + dst2[0] = src_r0[0] >> 16 | src_r0[1] << 16; + dst2[1] = src_r0[1] >> 16 | src_r0[2] << 16; + dst2[2] = src_r0[2] >> 16 | src_r0[3] << 16; + dst2[3] = src_r0[3] >> 16 | src_r1[0] << 16; + break; + + case 31: + dst1[3] = src_l1[3] | src_r0[0] << 24; + dst2[0] = src_r0[0] >> 8 | src_r0[1] << 24; + dst2[1] = src_r0[1] >> 8 | src_r0[2] << 24; + dst2[2] = src_r0[2] >> 8 | src_r0[3] << 24; + dst2[3] = src_r0[3] >> 8 | src_r1[0] << 24; + break; + + case 32: + dst2[0] = src_r0[0]; + dst2[1] = src_r0[1]; + dst2[2] = src_r0[2]; + dst2[3] = src_r0[3]; + break; + + case 33: + dst2[0] = src_l2[0] | src_r0[0] << 8; + dst2[1] = src_r0[0] >> 24 | src_r0[1] << 8; + dst2[2] = src_r0[1] >> 24 | src_r0[2] << 8; + dst2[3] = src_r0[2] >> 24 | src_r0[3] << 8; + break; + + case 34: + dst2[0] = src_l2[0] | src_r0[0] << 16; + dst2[1] = src_r0[0] >> 16 | src_r0[1] << 16; + dst2[2] = src_r0[1] >> 16 | src_r0[2] << 16; + dst2[3] = src_r0[2] >> 16 | src_r0[3] << 16; + break; + + case 35: + dst2[0] = src_l2[0] | src_r0[0] << 24; + dst2[1] = src_r0[0] >> 8 | src_r0[1] << 24; + dst2[2] = src_r0[1] >> 8 | src_r0[2] << 24; + dst2[3] = src_r0[2] >> 8 | src_r0[3] << 24; + break; + + case 36: + dst2[1] = src_r0[0]; + dst2[2] = src_r0[1]; + dst2[3] = src_r0[2]; + break; + + case 37: + dst2[1] = src_l2[1] | src_r0[0] << 8; + dst2[2] = src_r0[0] >> 24 | src_r0[1] << 8; + dst2[3] = src_r0[1] >> 24 | src_r0[2] << 8; + break; + + case 38: + dst2[1] = src_l2[1] | src_r0[0] << 16; + dst2[2] = src_r0[0] >> 16 | src_r0[1] << 16; + dst2[3] = src_r0[1] >> 16 | src_r0[2] << 16; + break; + + case 39: + dst2[1] = src_l2[1] | src_r0[0] << 24; + dst2[2] = src_r0[0] >> 8 | src_r0[1] << 24; + dst2[3] = src_r0[1] >> 8 | src_r0[2] << 24; + break; + + case 40: + dst2[2] = src_r0[0]; + dst2[3] = src_r0[1]; + break; + + case 41: + dst2[2] = src_l2[2] | src_r0[0] << 8; + dst2[3] = src_r0[0] >> 24 | src_r0[1] << 8; + break; + + case 42: + dst2[2] = src_l2[2] | src_r0[0] << 16; + dst2[3] = src_r0[0] >> 16 | src_r0[1] << 16; + break; + + case 43: + dst2[2] = src_l2[2] | src_r0[0] << 24; + dst2[3] = src_r0[0] >> 8 | src_r0[1] << 24; + break; + + case 44: + dst2[3] = src_r0[0]; + break; + + case 45: + dst2[3] = src_l2[3] | src_r0[0] << 8; + break; + + case 46: + dst2[3] = src_l2[3] | src_r0[0] << 16; + break; + + case 47: + dst2[3] = src_l2[3] | src_r0[0] << 24; + break; + } +} + +__device__ static void memcat16_9 (u32 w0[4], u32 w1[4], u32 w2[4], u32 w3[4], const u32 append0[4], const u32 append1[4], const u32 append2[4], const u32 offset) +{ + switch (offset) + { + case 0: + w0[0] = append0[0]; + w0[1] = append0[1]; + w0[2] = append0[2]; + w0[3] = append0[3]; + w1[0] = append1[0]; + w1[1] = append1[1]; + w1[2] = append1[2]; + w1[3] = append1[3]; + w2[0] = append2[0]; + break; + + case 1: + w0[0] = w0[0] | append0[0] << 8; + w0[1] = append0[0] >> 24 | append0[1] << 8; + w0[2] = append0[1] >> 24 | append0[2] << 8; + w0[3] = append0[2] >> 24 | append0[3] << 8; + w1[0] = append0[3] >> 24 | append1[0] << 8; + w1[1] = append1[0] >> 24 | append1[1] << 8; + w1[2] = append1[1] >> 24 | append1[2] << 8; + w1[3] = append1[2] >> 24 | append1[3] << 8; + w2[0] = append1[3] >> 24 | append2[0] << 8; + w2[1] = append2[0] >> 24; + break; + + case 2: + w0[0] = w0[0] | append0[0] << 16; + w0[1] = append0[0] >> 16 | append0[1] << 16; + w0[2] = append0[1] >> 16 | append0[2] << 16; + w0[3] = append0[2] >> 16 | append0[3] << 16; + w1[0] = append0[3] >> 16 | append1[0] << 16; + w1[1] = append1[0] >> 16 | append1[1] << 16; + w1[2] = append1[1] >> 16 | append1[2] << 16; + w1[3] = append1[2] >> 16 | append1[3] << 16; + w2[0] = append1[3] >> 16 | append2[0] << 16; + w2[1] = append2[0] >> 16; + break; + + case 3: + w0[0] = w0[0] | append0[0] << 24; + w0[1] = append0[0] >> 8 | append0[1] << 24; + w0[2] = append0[1] >> 8 | append0[2] << 24; + w0[3] = append0[2] >> 8 | append0[3] << 24; + w1[0] = append0[3] >> 8 | append1[0] << 24; + w1[1] = append1[0] >> 8 | append1[1] << 24; + w1[2] = append1[1] >> 8 | append1[2] << 24; + w1[3] = append1[2] >> 8 | append1[3] << 24; + w2[0] = append1[3] >> 8 | append2[0] << 24; + w2[1] = append2[0] >> 8; + break; + + case 4: + w0[1] = append0[0]; + w0[2] = append0[1]; + w0[3] = append0[2]; + w1[0] = append0[3]; + w1[1] = append1[0]; + w1[2] = append1[1]; + w1[3] = append1[2]; + w2[0] = append1[3]; + w2[1] = append2[0]; + break; + + case 5: + w0[1] = w0[1] | append0[0] << 8; + w0[2] = append0[0] >> 24 | append0[1] << 8; + w0[3] = append0[1] >> 24 | append0[2] << 8; + w1[0] = append0[2] >> 24 | append0[3] << 8; + w1[1] = append0[3] >> 24 | append1[0] << 8; + w1[2] = append1[0] >> 24 | append1[1] << 8; + w1[3] = append1[1] >> 24 | append1[2] << 8; + w2[0] = append1[2] >> 24 | append1[3] << 8; + w2[1] = append1[3] >> 24 | append2[0] << 8; + w2[2] = append2[0] >> 24; + break; + + case 6: + w0[1] = w0[1] | append0[0] << 16; + w0[2] = append0[0] >> 16 | append0[1] << 16; + w0[3] = append0[1] >> 16 | append0[2] << 16; + w1[0] = append0[2] >> 16 | append0[3] << 16; + w1[1] = append0[3] >> 16 | append1[0] << 16; + w1[2] = append1[0] >> 16 | append1[1] << 16; + w1[3] = append1[1] >> 16 | append1[2] << 16; + w2[0] = append1[2] >> 16 | append1[3] << 16; + w2[1] = append1[3] >> 16 | append2[0] << 16; + w2[2] = append2[0] >> 16; + break; + + case 7: + w0[1] = w0[1] | append0[0] << 24; + w0[2] = append0[0] >> 8 | append0[1] << 24; + w0[3] = append0[1] >> 8 | append0[2] << 24; + w1[0] = append0[2] >> 8 | append0[3] << 24; + w1[1] = append0[3] >> 8 | append1[0] << 24; + w1[2] = append1[0] >> 8 | append1[1] << 24; + w1[3] = append1[1] >> 8 | append1[2] << 24; + w2[0] = append1[2] >> 8 | append1[3] << 24; + w2[1] = append1[3] >> 8 | append2[0] << 24; + w2[2] = append2[0] >> 8; + break; + + case 8: + w0[2] = append0[0]; + w0[3] = append0[1]; + w1[0] = append0[2]; + w1[1] = append0[3]; + w1[2] = append1[0]; + w1[3] = append1[1]; + w2[0] = append1[2]; + w2[1] = append1[3]; + w2[2] = append2[0]; + break; + + case 9: + w0[2] = w0[2] | append0[0] << 8; + w0[3] = append0[0] >> 24 | append0[1] << 8; + w1[0] = append0[1] >> 24 | append0[2] << 8; + w1[1] = append0[2] >> 24 | append0[3] << 8; + w1[2] = append0[3] >> 24 | append1[0] << 8; + w1[3] = append1[0] >> 24 | append1[1] << 8; + w2[0] = append1[1] >> 24 | append1[2] << 8; + w2[1] = append1[2] >> 24 | append1[3] << 8; + w2[2] = append1[3] >> 24 | append2[0] << 8; + w2[3] = append2[0] >> 24; + break; + + case 10: + w0[2] = w0[2] | append0[0] << 16; + w0[3] = append0[0] >> 16 | append0[1] << 16; + w1[0] = append0[1] >> 16 | append0[2] << 16; + w1[1] = append0[2] >> 16 | append0[3] << 16; + w1[2] = append0[3] >> 16 | append1[0] << 16; + w1[3] = append1[0] >> 16 | append1[1] << 16; + w2[0] = append1[1] >> 16 | append1[2] << 16; + w2[1] = append1[2] >> 16 | append1[3] << 16; + w2[2] = append1[3] >> 16 | append2[0] << 16; + w2[3] = append2[0] >> 16; + break; + + case 11: + w0[2] = w0[2] | append0[0] << 24; + w0[3] = append0[0] >> 8 | append0[1] << 24; + w1[0] = append0[1] >> 8 | append0[2] << 24; + w1[1] = append0[2] >> 8 | append0[3] << 24; + w1[2] = append0[3] >> 8 | append1[0] << 24; + w1[3] = append1[0] >> 8 | append1[1] << 24; + w2[0] = append1[1] >> 8 | append1[2] << 24; + w2[1] = append1[2] >> 8 | append1[3] << 24; + w2[2] = append1[3] >> 8 | append2[0] << 24; + w2[3] = append2[0] >> 8; + break; + + case 12: + w0[3] = append0[0]; + w1[0] = append0[1]; + w1[1] = append0[2]; + w1[2] = append0[3]; + w1[3] = append1[0]; + w2[0] = append1[1]; + w2[1] = append1[2]; + w2[2] = append1[3]; + w2[3] = append2[0]; + break; + + case 13: + w0[3] = w0[3] | append0[0] << 8; + w1[0] = append0[0] >> 24 | append0[1] << 8; + w1[1] = append0[1] >> 24 | append0[2] << 8; + w1[2] = append0[2] >> 24 | append0[3] << 8; + w1[3] = append0[3] >> 24 | append1[0] << 8; + w2[0] = append1[0] >> 24 | append1[1] << 8; + w2[1] = append1[1] >> 24 | append1[2] << 8; + w2[2] = append1[2] >> 24 | append1[3] << 8; + w2[3] = append1[3] >> 24 | append2[0] << 8; + w3[0] = append2[0] >> 24; + break; + + case 14: + w0[3] = w0[3] | append0[0] << 16; + w1[0] = append0[0] >> 16 | append0[1] << 16; + w1[1] = append0[1] >> 16 | append0[2] << 16; + w1[2] = append0[2] >> 16 | append0[3] << 16; + w1[3] = append0[3] >> 16 | append1[0] << 16; + w2[0] = append1[0] >> 16 | append1[1] << 16; + w2[1] = append1[1] >> 16 | append1[2] << 16; + w2[2] = append1[2] >> 16 | append1[3] << 16; + w2[3] = append1[3] >> 16 | append2[0] << 16; + w3[0] = append2[0] >> 16; + break; + + case 15: + w0[3] = w0[3] | append0[0] << 24; + w1[0] = append0[0] >> 8 | append0[1] << 24; + w1[1] = append0[1] >> 8 | append0[2] << 24; + w1[2] = append0[2] >> 8 | append0[3] << 24; + w1[3] = append0[3] >> 8 | append1[0] << 24; + w2[0] = append1[0] >> 8 | append1[1] << 24; + w2[1] = append1[1] >> 8 | append1[2] << 24; + w2[2] = append1[2] >> 8 | append1[3] << 24; + w2[3] = append1[3] >> 8 | append2[0] << 24; + w3[0] = append2[0] >> 8; + break; + } +} + +__device__ static void memcat32_8 (u32 w0[4], u32 w1[4], u32 w2[4], u32 w3[4], const u32 append0[4], const u32 append1[4], const u32 offset) +{ + switch (offset) + { + case 0: + w0[0] = append0[0]; + w0[1] = append0[1]; + w0[2] = append0[2]; + w0[3] = append0[3]; + w1[0] = append1[0]; + w1[1] = append1[1]; + w1[2] = append1[2]; + w1[3] = append1[3]; + break; + + case 1: + w0[0] = w0[0] | append0[0] << 8; + w0[1] = append0[0] >> 24 | append0[1] << 8; + w0[2] = append0[1] >> 24 | append0[2] << 8; + w0[3] = append0[2] >> 24 | append0[3] << 8; + w1[0] = append0[3] >> 24 | append1[0] << 8; + w1[1] = append1[0] >> 24 | append1[1] << 8; + w1[2] = append1[1] >> 24 | append1[2] << 8; + w1[3] = append1[2] >> 24 | append1[3] << 8; + w2[0] = append1[3] >> 24; + break; + + case 2: + w0[0] = w0[0] | append0[0] << 16; + w0[1] = append0[0] >> 16 | append0[1] << 16; + w0[2] = append0[1] >> 16 | append0[2] << 16; + w0[3] = append0[2] >> 16 | append0[3] << 16; + w1[0] = append0[3] >> 16 | append1[0] << 16; + w1[1] = append1[0] >> 16 | append1[1] << 16; + w1[2] = append1[1] >> 16 | append1[2] << 16; + w1[3] = append1[2] >> 16 | append1[3] << 16; + w2[0] = append1[3] >> 16; + break; + + case 3: + w0[0] = w0[0] | append0[0] << 24; + w0[1] = append0[0] >> 8 | append0[1] << 24; + w0[2] = append0[1] >> 8 | append0[2] << 24; + w0[3] = append0[2] >> 8 | append0[3] << 24; + w1[0] = append0[3] >> 8 | append1[0] << 24; + w1[1] = append1[0] >> 8 | append1[1] << 24; + w1[2] = append1[1] >> 8 | append1[2] << 24; + w1[3] = append1[2] >> 8 | append1[3] << 24; + w2[0] = append1[3] >> 8; + break; + + case 4: + w0[1] = append0[0]; + w0[2] = append0[1]; + w0[3] = append0[2]; + w1[0] = append0[3]; + w1[1] = append1[0]; + w1[2] = append1[1]; + w1[3] = append1[2]; + w2[0] = append1[3]; + break; + + case 5: + w0[1] = w0[1] | append0[0] << 8; + w0[2] = append0[0] >> 24 | append0[1] << 8; + w0[3] = append0[1] >> 24 | append0[2] << 8; + w1[0] = append0[2] >> 24 | append0[3] << 8; + w1[1] = append0[3] >> 24 | append1[0] << 8; + w1[2] = append1[0] >> 24 | append1[1] << 8; + w1[3] = append1[1] >> 24 | append1[2] << 8; + w2[0] = append1[2] >> 24 | append1[3] << 8; + w2[1] = append1[3] >> 24; + break; + + case 6: + w0[1] = w0[1] | append0[0] << 16; + w0[2] = append0[0] >> 16 | append0[1] << 16; + w0[3] = append0[1] >> 16 | append0[2] << 16; + w1[0] = append0[2] >> 16 | append0[3] << 16; + w1[1] = append0[3] >> 16 | append1[0] << 16; + w1[2] = append1[0] >> 16 | append1[1] << 16; + w1[3] = append1[1] >> 16 | append1[2] << 16; + w2[0] = append1[2] >> 16 | append1[3] << 16; + w2[1] = append1[3] >> 16; + break; + + case 7: + w0[1] = w0[1] | append0[0] << 24; + w0[2] = append0[0] >> 8 | append0[1] << 24; + w0[3] = append0[1] >> 8 | append0[2] << 24; + w1[0] = append0[2] >> 8 | append0[3] << 24; + w1[1] = append0[3] >> 8 | append1[0] << 24; + w1[2] = append1[0] >> 8 | append1[1] << 24; + w1[3] = append1[1] >> 8 | append1[2] << 24; + w2[0] = append1[2] >> 8 | append1[3] << 24; + w2[1] = append1[3] >> 8; + break; + + case 8: + w0[2] = append0[0]; + w0[3] = append0[1]; + w1[0] = append0[2]; + w1[1] = append0[3]; + w1[2] = append1[0]; + w1[3] = append1[1]; + w2[0] = append1[2]; + w2[1] = append1[3]; + break; + + case 9: + w0[2] = w0[2] | append0[0] << 8; + w0[3] = append0[0] >> 24 | append0[1] << 8; + w1[0] = append0[1] >> 24 | append0[2] << 8; + w1[1] = append0[2] >> 24 | append0[3] << 8; + w1[2] = append0[3] >> 24 | append1[0] << 8; + w1[3] = append1[0] >> 24 | append1[1] << 8; + w2[0] = append1[1] >> 24 | append1[2] << 8; + w2[1] = append1[2] >> 24 | append1[3] << 8; + w2[2] = append1[3] >> 24; + break; + + case 10: + w0[2] = w0[2] | append0[0] << 16; + w0[3] = append0[0] >> 16 | append0[1] << 16; + w1[0] = append0[1] >> 16 | append0[2] << 16; + w1[1] = append0[2] >> 16 | append0[3] << 16; + w1[2] = append0[3] >> 16 | append1[0] << 16; + w1[3] = append1[0] >> 16 | append1[1] << 16; + w2[0] = append1[1] >> 16 | append1[2] << 16; + w2[1] = append1[2] >> 16 | append1[3] << 16; + w2[2] = append1[3] >> 16; + break; + + case 11: + w0[2] = w0[2] | append0[0] << 24; + w0[3] = append0[0] >> 8 | append0[1] << 24; + w1[0] = append0[1] >> 8 | append0[2] << 24; + w1[1] = append0[2] >> 8 | append0[3] << 24; + w1[2] = append0[3] >> 8 | append1[0] << 24; + w1[3] = append1[0] >> 8 | append1[1] << 24; + w2[0] = append1[1] >> 8 | append1[2] << 24; + w2[1] = append1[2] >> 8 | append1[3] << 24; + w2[2] = append1[3] >> 8; + break; + + case 12: + w0[3] = append0[0]; + w1[0] = append0[1]; + w1[1] = append0[2]; + w1[2] = append0[3]; + w1[3] = append1[0]; + w2[0] = append1[1]; + w2[1] = append1[2]; + w2[2] = append1[3]; + break; + + case 13: + w0[3] = w0[3] | append0[0] << 8; + w1[0] = append0[0] >> 24 | append0[1] << 8; + w1[1] = append0[1] >> 24 | append0[2] << 8; + w1[2] = append0[2] >> 24 | append0[3] << 8; + w1[3] = append0[3] >> 24 | append1[0] << 8; + w2[0] = append1[0] >> 24 | append1[1] << 8; + w2[1] = append1[1] >> 24 | append1[2] << 8; + w2[2] = append1[2] >> 24 | append1[3] << 8; + w2[3] = append1[3] >> 24; + break; + + case 14: + w0[3] = w0[3] | append0[0] << 16; + w1[0] = append0[0] >> 16 | append0[1] << 16; + w1[1] = append0[1] >> 16 | append0[2] << 16; + w1[2] = append0[2] >> 16 | append0[3] << 16; + w1[3] = append0[3] >> 16 | append1[0] << 16; + w2[0] = append1[0] >> 16 | append1[1] << 16; + w2[1] = append1[1] >> 16 | append1[2] << 16; + w2[2] = append1[2] >> 16 | append1[3] << 16; + w2[3] = append1[3] >> 16; + break; + + case 15: + w0[3] = w0[3] | append0[0] << 24; + w1[0] = append0[0] >> 8 | append0[1] << 24; + w1[1] = append0[1] >> 8 | append0[2] << 24; + w1[2] = append0[2] >> 8 | append0[3] << 24; + w1[3] = append0[3] >> 8 | append1[0] << 24; + w2[0] = append1[0] >> 8 | append1[1] << 24; + w2[1] = append1[1] >> 8 | append1[2] << 24; + w2[2] = append1[2] >> 8 | append1[3] << 24; + w2[3] = append1[3] >> 8; + break; + + case 16: + w1[0] = append0[0]; + w1[1] = append0[1]; + w1[2] = append0[2]; + w1[3] = append0[3]; + w2[0] = append1[0]; + w2[1] = append1[1]; + w2[2] = append1[2]; + w2[3] = append1[3]; + break; + + case 17: + w1[0] = w1[0] | append0[0] << 8; + w1[1] = append0[0] >> 24 | append0[1] << 8; + w1[2] = append0[1] >> 24 | append0[2] << 8; + w1[3] = append0[2] >> 24 | append0[3] << 8; + w2[0] = append0[3] >> 24 | append1[0] << 8; + w2[1] = append1[0] >> 24 | append1[1] << 8; + w2[2] = append1[1] >> 24 | append1[2] << 8; + w2[3] = append1[2] >> 24 | append1[3] << 8; + w3[0] = append1[3] >> 24; + break; + + case 18: + w1[0] = w1[0] | append0[0] << 16; + w1[1] = append0[0] >> 16 | append0[1] << 16; + w1[2] = append0[1] >> 16 | append0[2] << 16; + w1[3] = append0[2] >> 16 | append0[3] << 16; + w2[0] = append0[3] >> 16 | append1[0] << 16; + w2[1] = append1[0] >> 16 | append1[1] << 16; + w2[2] = append1[1] >> 16 | append1[2] << 16; + w2[3] = append1[2] >> 16 | append1[3] << 16; + w3[0] = append1[3] >> 16; + break; + + case 19: + w1[0] = w1[0] | append0[0] << 24; + w1[1] = append0[0] >> 8 | append0[1] << 24; + w1[2] = append0[1] >> 8 | append0[2] << 24; + w1[3] = append0[2] >> 8 | append0[3] << 24; + w2[0] = append0[3] >> 8 | append1[0] << 24; + w2[1] = append1[0] >> 8 | append1[1] << 24; + w2[2] = append1[1] >> 8 | append1[2] << 24; + w2[3] = append1[2] >> 8 | append1[3] << 24; + w3[0] = append1[3] >> 8; + break; + + case 20: + w1[1] = append0[0]; + w1[2] = append0[1]; + w1[3] = append0[2]; + w2[0] = append0[3]; + w2[1] = append1[0]; + w2[2] = append1[1]; + w2[3] = append1[2]; + w3[0] = append1[3]; + break; + + case 21: + w1[1] = w1[1] | append0[0] << 8; + w1[2] = append0[0] >> 24 | append0[1] << 8; + w1[3] = append0[1] >> 24 | append0[2] << 8; + w2[0] = append0[2] >> 24 | append0[3] << 8; + w2[1] = append0[3] >> 24 | append1[0] << 8; + w2[2] = append1[0] >> 24 | append1[1] << 8; + w2[3] = append1[1] >> 24 | append1[2] << 8; + w3[0] = append1[2] >> 24 | append1[3] << 8; + w3[1] = append1[3] >> 24; + break; + + case 22: + w1[1] = w1[1] | append0[0] << 16; + w1[2] = append0[0] >> 16 | append0[1] << 16; + w1[3] = append0[1] >> 16 | append0[2] << 16; + w2[0] = append0[2] >> 16 | append0[3] << 16; + w2[1] = append0[3] >> 16 | append1[0] << 16; + w2[2] = append1[0] >> 16 | append1[1] << 16; + w2[3] = append1[1] >> 16 | append1[2] << 16; + w3[0] = append1[2] >> 16 | append1[3] << 16; + w3[1] = append1[3] >> 16; + break; + + case 23: + w1[1] = w1[1] | append0[0] << 24; + w1[2] = append0[0] >> 8 | append0[1] << 24; + w1[3] = append0[1] >> 8 | append0[2] << 24; + w2[0] = append0[2] >> 8 | append0[3] << 24; + w2[1] = append0[3] >> 8 | append1[0] << 24; + w2[2] = append1[0] >> 8 | append1[1] << 24; + w2[3] = append1[1] >> 8 | append1[2] << 24; + w3[0] = append1[2] >> 8 | append1[3] << 24; + w3[1] = append1[3] >> 8; + break; + + case 24: + w1[2] = append0[0]; + w1[3] = append0[1]; + w2[0] = append0[2]; + w2[1] = append0[3]; + w2[2] = append1[0]; + w2[3] = append1[1]; + w3[0] = append1[2]; + w3[1] = append1[3]; + break; + + case 25: + w1[2] = w1[2] | append0[0] << 8; + w1[3] = append0[0] >> 24 | append0[1] << 8; + w2[0] = append0[1] >> 24 | append0[2] << 8; + w2[1] = append0[2] >> 24 | append0[3] << 8; + w2[2] = append0[3] >> 24 | append1[0] << 8; + w2[3] = append1[0] >> 24 | append1[1] << 8; + w3[0] = append1[1] >> 24 | append1[2] << 8; + w3[1] = append1[2] >> 24 | append1[3] << 8; + break; + + case 26: + w1[2] = w1[2] | append0[0] << 16; + w1[3] = append0[0] >> 16 | append0[1] << 16; + w2[0] = append0[1] >> 16 | append0[2] << 16; + w2[1] = append0[2] >> 16 | append0[3] << 16; + w2[2] = append0[3] >> 16 | append1[0] << 16; + w2[3] = append1[0] >> 16 | append1[1] << 16; + w3[0] = append1[1] >> 16 | append1[2] << 16; + w3[1] = append1[2] >> 16 | append1[3] << 16; + break; + + case 27: + w1[2] = w1[2] | append0[0] << 24; + w1[3] = append0[0] >> 8 | append0[1] << 24; + w2[0] = append0[1] >> 8 | append0[2] << 24; + w2[1] = append0[2] >> 8 | append0[3] << 24; + w2[2] = append0[3] >> 8 | append1[0] << 24; + w2[3] = append1[0] >> 8 | append1[1] << 24; + w3[0] = append1[1] >> 8 | append1[2] << 24; + w3[1] = append1[2] >> 8 | append1[3] << 24; + break; + + case 28: + w1[3] = append0[0]; + w2[0] = append0[1]; + w2[1] = append0[2]; + w2[2] = append0[3]; + w2[3] = append1[0]; + w3[0] = append1[1]; + w3[1] = append1[2]; + break; + + case 29: + w1[3] = w1[3] | append0[0] << 8; + w2[0] = append0[0] >> 24 | append0[1] << 8; + w2[1] = append0[1] >> 24 | append0[2] << 8; + w2[2] = append0[2] >> 24 | append0[3] << 8; + w2[3] = append0[3] >> 24 | append1[0] << 8; + w3[0] = append1[0] >> 24 | append1[1] << 8; + w3[1] = append1[1] >> 24 | append1[2] << 8; + break; + + case 30: + w1[3] = w1[3] | append0[0] << 16; + w2[0] = append0[0] >> 16 | append0[1] << 16; + w2[1] = append0[1] >> 16 | append0[2] << 16; + w2[2] = append0[2] >> 16 | append0[3] << 16; + w2[3] = append0[3] >> 16 | append1[0] << 16; + w3[0] = append1[0] >> 16 | append1[1] << 16; + w3[1] = append1[1] >> 16 | append1[2] << 16; + break; + + case 31: + w1[3] = w1[3] | append0[0] << 24; + w2[0] = append0[0] >> 8 | append0[1] << 24; + w2[1] = append0[1] >> 8 | append0[2] << 24; + w2[2] = append0[2] >> 8 | append0[3] << 24; + w2[3] = append0[3] >> 8 | append1[0] << 24; + w3[0] = append1[0] >> 8 | append1[1] << 24; + w3[1] = append1[1] >> 8 | append1[2] << 24; + break; + + case 32: + w2[0] = append0[0]; + w2[1] = append0[1]; + w2[2] = append0[2]; + w2[3] = append0[3]; + w3[0] = append1[0]; + w3[1] = append1[1]; + break; + } +} + +__device__ static void memcat32_9 (u32 w0[4], u32 w1[4], u32 w2[4], u32 w3[4], const u32 append0[4], const u32 append1[4], const u32 append2[4], const u32 offset) +{ + switch (offset) + { + case 0: + w0[0] = append0[0]; + w0[1] = append0[1]; + w0[2] = append0[2]; + w0[3] = append0[3]; + w1[0] = append1[0]; + w1[1] = append1[1]; + w1[2] = append1[2]; + w1[3] = append1[3]; + w2[0] = append2[0]; + break; + + case 1: + w0[0] = w0[0] | append0[0] << 8; + w0[1] = append0[0] >> 24 | append0[1] << 8; + w0[2] = append0[1] >> 24 | append0[2] << 8; + w0[3] = append0[2] >> 24 | append0[3] << 8; + w1[0] = append0[3] >> 24 | append1[0] << 8; + w1[1] = append1[0] >> 24 | append1[1] << 8; + w1[2] = append1[1] >> 24 | append1[2] << 8; + w1[3] = append1[2] >> 24 | append1[3] << 8; + w2[0] = append1[3] >> 24 | append2[0] << 8; + w2[1] = append2[0] >> 24; + break; + + case 2: + w0[0] = w0[0] | append0[0] << 16; + w0[1] = append0[0] >> 16 | append0[1] << 16; + w0[2] = append0[1] >> 16 | append0[2] << 16; + w0[3] = append0[2] >> 16 | append0[3] << 16; + w1[0] = append0[3] >> 16 | append1[0] << 16; + w1[1] = append1[0] >> 16 | append1[1] << 16; + w1[2] = append1[1] >> 16 | append1[2] << 16; + w1[3] = append1[2] >> 16 | append1[3] << 16; + w2[0] = append1[3] >> 16 | append2[0] << 16; + w2[1] = append2[0] >> 16; + break; + + case 3: + w0[0] = w0[0] | append0[0] << 24; + w0[1] = append0[0] >> 8 | append0[1] << 24; + w0[2] = append0[1] >> 8 | append0[2] << 24; + w0[3] = append0[2] >> 8 | append0[3] << 24; + w1[0] = append0[3] >> 8 | append1[0] << 24; + w1[1] = append1[0] >> 8 | append1[1] << 24; + w1[2] = append1[1] >> 8 | append1[2] << 24; + w1[3] = append1[2] >> 8 | append1[3] << 24; + w2[0] = append1[3] >> 8 | append2[0] << 24; + w2[1] = append2[0] >> 8; + break; + + case 4: + w0[1] = append0[0]; + w0[2] = append0[1]; + w0[3] = append0[2]; + w1[0] = append0[3]; + w1[1] = append1[0]; + w1[2] = append1[1]; + w1[3] = append1[2]; + w2[0] = append1[3]; + w2[1] = append2[0]; + break; + + case 5: + w0[1] = w0[1] | append0[0] << 8; + w0[2] = append0[0] >> 24 | append0[1] << 8; + w0[3] = append0[1] >> 24 | append0[2] << 8; + w1[0] = append0[2] >> 24 | append0[3] << 8; + w1[1] = append0[3] >> 24 | append1[0] << 8; + w1[2] = append1[0] >> 24 | append1[1] << 8; + w1[3] = append1[1] >> 24 | append1[2] << 8; + w2[0] = append1[2] >> 24 | append1[3] << 8; + w2[1] = append1[3] >> 24 | append2[0] << 8; + w2[2] = append2[0] >> 24; + break; + + case 6: + w0[1] = w0[1] | append0[0] << 16; + w0[2] = append0[0] >> 16 | append0[1] << 16; + w0[3] = append0[1] >> 16 | append0[2] << 16; + w1[0] = append0[2] >> 16 | append0[3] << 16; + w1[1] = append0[3] >> 16 | append1[0] << 16; + w1[2] = append1[0] >> 16 | append1[1] << 16; + w1[3] = append1[1] >> 16 | append1[2] << 16; + w2[0] = append1[2] >> 16 | append1[3] << 16; + w2[1] = append1[3] >> 16 | append2[0] << 16; + w2[2] = append2[0] >> 16; + break; + + case 7: + w0[1] = w0[1] | append0[0] << 24; + w0[2] = append0[0] >> 8 | append0[1] << 24; + w0[3] = append0[1] >> 8 | append0[2] << 24; + w1[0] = append0[2] >> 8 | append0[3] << 24; + w1[1] = append0[3] >> 8 | append1[0] << 24; + w1[2] = append1[0] >> 8 | append1[1] << 24; + w1[3] = append1[1] >> 8 | append1[2] << 24; + w2[0] = append1[2] >> 8 | append1[3] << 24; + w2[1] = append1[3] >> 8 | append2[0] << 24; + w2[2] = append2[0] >> 8; + break; + + case 8: + w0[2] = append0[0]; + w0[3] = append0[1]; + w1[0] = append0[2]; + w1[1] = append0[3]; + w1[2] = append1[0]; + w1[3] = append1[1]; + w2[0] = append1[2]; + w2[1] = append1[3]; + w2[2] = append2[0]; + break; + + case 9: + w0[2] = w0[2] | append0[0] << 8; + w0[3] = append0[0] >> 24 | append0[1] << 8; + w1[0] = append0[1] >> 24 | append0[2] << 8; + w1[1] = append0[2] >> 24 | append0[3] << 8; + w1[2] = append0[3] >> 24 | append1[0] << 8; + w1[3] = append1[0] >> 24 | append1[1] << 8; + w2[0] = append1[1] >> 24 | append1[2] << 8; + w2[1] = append1[2] >> 24 | append1[3] << 8; + w2[2] = append1[3] >> 24 | append2[0] << 8; + w2[3] = append2[0] >> 24; + break; + + case 10: + w0[2] = w0[2] | append0[0] << 16; + w0[3] = append0[0] >> 16 | append0[1] << 16; + w1[0] = append0[1] >> 16 | append0[2] << 16; + w1[1] = append0[2] >> 16 | append0[3] << 16; + w1[2] = append0[3] >> 16 | append1[0] << 16; + w1[3] = append1[0] >> 16 | append1[1] << 16; + w2[0] = append1[1] >> 16 | append1[2] << 16; + w2[1] = append1[2] >> 16 | append1[3] << 16; + w2[2] = append1[3] >> 16 | append2[0] << 16; + w2[3] = append2[0] >> 16; + break; + + case 11: + w0[2] = w0[2] | append0[0] << 24; + w0[3] = append0[0] >> 8 | append0[1] << 24; + w1[0] = append0[1] >> 8 | append0[2] << 24; + w1[1] = append0[2] >> 8 | append0[3] << 24; + w1[2] = append0[3] >> 8 | append1[0] << 24; + w1[3] = append1[0] >> 8 | append1[1] << 24; + w2[0] = append1[1] >> 8 | append1[2] << 24; + w2[1] = append1[2] >> 8 | append1[3] << 24; + w2[2] = append1[3] >> 8 | append2[0] << 24; + w2[3] = append2[0] >> 8; + break; + + case 12: + w0[3] = append0[0]; + w1[0] = append0[1]; + w1[1] = append0[2]; + w1[2] = append0[3]; + w1[3] = append1[0]; + w2[0] = append1[1]; + w2[1] = append1[2]; + w2[2] = append1[3]; + w2[3] = append2[0]; + break; + + case 13: + w0[3] = w0[3] | append0[0] << 8; + w1[0] = append0[0] >> 24 | append0[1] << 8; + w1[1] = append0[1] >> 24 | append0[2] << 8; + w1[2] = append0[2] >> 24 | append0[3] << 8; + w1[3] = append0[3] >> 24 | append1[0] << 8; + w2[0] = append1[0] >> 24 | append1[1] << 8; + w2[1] = append1[1] >> 24 | append1[2] << 8; + w2[2] = append1[2] >> 24 | append1[3] << 8; + w2[3] = append1[3] >> 24 | append2[0] << 8; + w3[0] = append2[0] >> 24; + break; + + case 14: + w0[3] = w0[3] | append0[0] << 16; + w1[0] = append0[0] >> 16 | append0[1] << 16; + w1[1] = append0[1] >> 16 | append0[2] << 16; + w1[2] = append0[2] >> 16 | append0[3] << 16; + w1[3] = append0[3] >> 16 | append1[0] << 16; + w2[0] = append1[0] >> 16 | append1[1] << 16; + w2[1] = append1[1] >> 16 | append1[2] << 16; + w2[2] = append1[2] >> 16 | append1[3] << 16; + w2[3] = append1[3] >> 16 | append2[0] << 16; + w3[0] = append2[0] >> 16; + break; + + case 15: + w0[3] = w0[3] | append0[0] << 24; + w1[0] = append0[0] >> 8 | append0[1] << 24; + w1[1] = append0[1] >> 8 | append0[2] << 24; + w1[2] = append0[2] >> 8 | append0[3] << 24; + w1[3] = append0[3] >> 8 | append1[0] << 24; + w2[0] = append1[0] >> 8 | append1[1] << 24; + w2[1] = append1[1] >> 8 | append1[2] << 24; + w2[2] = append1[2] >> 8 | append1[3] << 24; + w2[3] = append1[3] >> 8 | append2[0] << 24; + w3[0] = append2[0] >> 8; + break; + + case 16: + w1[0] = append0[0]; + w1[1] = append0[1]; + w1[2] = append0[2]; + w1[3] = append0[3]; + w2[0] = append1[0]; + w2[1] = append1[1]; + w2[2] = append1[2]; + w2[3] = append1[3]; + w3[0] = append2[0]; + break; + + case 17: + w1[0] = w1[0] | append0[0] << 8; + w1[1] = append0[0] >> 24 | append0[1] << 8; + w1[2] = append0[1] >> 24 | append0[2] << 8; + w1[3] = append0[2] >> 24 | append0[3] << 8; + w2[0] = append0[3] >> 24 | append1[0] << 8; + w2[1] = append1[0] >> 24 | append1[1] << 8; + w2[2] = append1[1] >> 24 | append1[2] << 8; + w2[3] = append1[2] >> 24 | append1[3] << 8; + w3[0] = append1[3] >> 24 | append2[0] << 8; + w3[1] = append2[0] >> 24; + break; + + case 18: + w1[0] = w1[0] | append0[0] << 16; + w1[1] = append0[0] >> 16 | append0[1] << 16; + w1[2] = append0[1] >> 16 | append0[2] << 16; + w1[3] = append0[2] >> 16 | append0[3] << 16; + w2[0] = append0[3] >> 16 | append1[0] << 16; + w2[1] = append1[0] >> 16 | append1[1] << 16; + w2[2] = append1[1] >> 16 | append1[2] << 16; + w2[3] = append1[2] >> 16 | append1[3] << 16; + w3[0] = append1[3] >> 16 | append2[0] << 16; + w3[1] = append2[0] >> 16; + break; + + case 19: + w1[0] = w1[0] | append0[0] << 24; + w1[1] = append0[0] >> 8 | append0[1] << 24; + w1[2] = append0[1] >> 8 | append0[2] << 24; + w1[3] = append0[2] >> 8 | append0[3] << 24; + w2[0] = append0[3] >> 8 | append1[0] << 24; + w2[1] = append1[0] >> 8 | append1[1] << 24; + w2[2] = append1[1] >> 8 | append1[2] << 24; + w2[3] = append1[2] >> 8 | append1[3] << 24; + w3[0] = append1[3] >> 8 | append2[0] << 24; + w3[1] = append2[0] >> 8; + break; + + case 20: + w1[1] = append0[0]; + w1[2] = append0[1]; + w1[3] = append0[2]; + w2[0] = append0[3]; + w2[1] = append1[0]; + w2[2] = append1[1]; + w2[3] = append1[2]; + w3[0] = append1[3]; + w3[1] = append2[0]; + break; + + case 21: + w1[1] = w1[1] | append0[0] << 8; + w1[2] = append0[0] >> 24 | append0[1] << 8; + w1[3] = append0[1] >> 24 | append0[2] << 8; + w2[0] = append0[2] >> 24 | append0[3] << 8; + w2[1] = append0[3] >> 24 | append1[0] << 8; + w2[2] = append1[0] >> 24 | append1[1] << 8; + w2[3] = append1[1] >> 24 | append1[2] << 8; + w3[0] = append1[2] >> 24 | append1[3] << 8; + w3[1] = append1[3] >> 24 | append2[0] << 8; + break; + + case 22: + w1[1] = w1[1] | append0[0] << 16; + w1[2] = append0[0] >> 16 | append0[1] << 16; + w1[3] = append0[1] >> 16 | append0[2] << 16; + w2[0] = append0[2] >> 16 | append0[3] << 16; + w2[1] = append0[3] >> 16 | append1[0] << 16; + w2[2] = append1[0] >> 16 | append1[1] << 16; + w2[3] = append1[1] >> 16 | append1[2] << 16; + w3[0] = append1[2] >> 16 | append1[3] << 16; + w3[1] = append1[3] >> 16 | append2[0] << 16; + break; + + case 23: + w1[1] = w1[1] | append0[0] << 24; + w1[2] = append0[0] >> 8 | append0[1] << 24; + w1[3] = append0[1] >> 8 | append0[2] << 24; + w2[0] = append0[2] >> 8 | append0[3] << 24; + w2[1] = append0[3] >> 8 | append1[0] << 24; + w2[2] = append1[0] >> 8 | append1[1] << 24; + w2[3] = append1[1] >> 8 | append1[2] << 24; + w3[0] = append1[2] >> 8 | append1[3] << 24; + w3[1] = append1[3] >> 8 | append2[0] << 24; + break; + + case 24: + w1[2] = append0[0]; + w1[3] = append0[1]; + w2[0] = append0[2]; + w2[1] = append0[3]; + w2[2] = append1[0]; + w2[3] = append1[1]; + w3[0] = append1[2]; + w3[1] = append1[3]; + break; + + case 25: + w1[2] = w1[2] | append0[0] << 8; + w1[3] = append0[0] >> 24 | append0[1] << 8; + w2[0] = append0[1] >> 24 | append0[2] << 8; + w2[1] = append0[2] >> 24 | append0[3] << 8; + w2[2] = append0[3] >> 24 | append1[0] << 8; + w2[3] = append1[0] >> 24 | append1[1] << 8; + w3[0] = append1[1] >> 24 | append1[2] << 8; + w3[1] = append1[2] >> 24 | append1[3] << 8; + break; + + case 26: + w1[2] = w1[2] | append0[0] << 16; + w1[3] = append0[0] >> 16 | append0[1] << 16; + w2[0] = append0[1] >> 16 | append0[2] << 16; + w2[1] = append0[2] >> 16 | append0[3] << 16; + w2[2] = append0[3] >> 16 | append1[0] << 16; + w2[3] = append1[0] >> 16 | append1[1] << 16; + w3[0] = append1[1] >> 16 | append1[2] << 16; + w3[1] = append1[2] >> 16 | append1[3] << 16; + break; + + case 27: + w1[2] = w1[2] | append0[0] << 24; + w1[3] = append0[0] >> 8 | append0[1] << 24; + w2[0] = append0[1] >> 8 | append0[2] << 24; + w2[1] = append0[2] >> 8 | append0[3] << 24; + w2[2] = append0[3] >> 8 | append1[0] << 24; + w2[3] = append1[0] >> 8 | append1[1] << 24; + w3[0] = append1[1] >> 8 | append1[2] << 24; + w3[1] = append1[2] >> 8 | append1[3] << 24; + break; + + case 28: + w1[3] = append0[0]; + w2[0] = append0[1]; + w2[1] = append0[2]; + w2[2] = append0[3]; + w2[3] = append1[0]; + w3[0] = append1[1]; + w3[1] = append1[2]; + break; + + case 29: + w1[3] = w1[3] | append0[0] << 8; + w2[0] = append0[0] >> 24 | append0[1] << 8; + w2[1] = append0[1] >> 24 | append0[2] << 8; + w2[2] = append0[2] >> 24 | append0[3] << 8; + w2[3] = append0[3] >> 24 | append1[0] << 8; + w3[0] = append1[0] >> 24 | append1[1] << 8; + w3[1] = append1[1] >> 24 | append1[2] << 8; + break; + + case 30: + w1[3] = w1[3] | append0[0] << 16; + w2[0] = append0[0] >> 16 | append0[1] << 16; + w2[1] = append0[1] >> 16 | append0[2] << 16; + w2[2] = append0[2] >> 16 | append0[3] << 16; + w2[3] = append0[3] >> 16 | append1[0] << 16; + w3[0] = append1[0] >> 16 | append1[1] << 16; + w3[1] = append1[1] >> 16 | append1[2] << 16; + break; + + case 31: + w1[3] = w1[3] | append0[0] << 24; + w2[0] = append0[0] >> 8 | append0[1] << 24; + w2[1] = append0[1] >> 8 | append0[2] << 24; + w2[2] = append0[2] >> 8 | append0[3] << 24; + w2[3] = append0[3] >> 8 | append1[0] << 24; + w3[0] = append1[0] >> 8 | append1[1] << 24; + w3[1] = append1[1] >> 8 | append1[2] << 24; + break; + + case 32: + w2[0] = append0[0]; + w2[1] = append0[1]; + w2[2] = append0[2]; + w2[3] = append0[3]; + w3[0] = append1[0]; + w3[1] = append1[1]; + break; + } +} + +__device__ static void switch_buffer_by_offset (u32 w0[4], u32 w1[4], u32 w2[4], u32 w3[4], const u32 offset) +{ + #if __CUDA_ARCH__ >= 200 + + const int offset_minus_4 = 4 - (offset % 4); + + const int selector = (0x76543210 >> (offset_minus_4 * 4)) & 0xffff; + + switch (offset / 4) + { + case 0: + w3[1] = __byte_perm (w3[0], w3[1], selector); + w3[0] = __byte_perm (w2[3], w3[0], selector); + w2[3] = __byte_perm (w2[2], w2[3], selector); + w2[2] = __byte_perm (w2[1], w2[2], selector); + w2[1] = __byte_perm (w2[0], w2[1], selector); + w2[0] = __byte_perm (w1[3], w2[0], selector); + w1[3] = __byte_perm (w1[2], w1[3], selector); + w1[2] = __byte_perm (w1[1], w1[2], selector); + w1[1] = __byte_perm (w1[0], w1[1], selector); + w1[0] = __byte_perm (w0[3], w1[0], selector); + w0[3] = __byte_perm (w0[2], w0[3], selector); + w0[2] = __byte_perm (w0[1], w0[2], selector); + w0[1] = __byte_perm (w0[0], w0[1], selector); + w0[0] = __byte_perm ( 0, w0[0], selector); + + break; + + case 1: + w3[1] = __byte_perm (w2[3], w3[0], selector); + w3[0] = __byte_perm (w2[2], w2[3], selector); + w2[3] = __byte_perm (w2[1], w2[2], selector); + w2[2] = __byte_perm (w2[0], w2[1], selector); + w2[1] = __byte_perm (w1[3], w2[0], selector); + w2[0] = __byte_perm (w1[2], w1[3], selector); + w1[3] = __byte_perm (w1[1], w1[2], selector); + w1[2] = __byte_perm (w1[0], w1[1], selector); + w1[1] = __byte_perm (w0[3], w1[0], selector); + w1[0] = __byte_perm (w0[2], w0[3], selector); + w0[3] = __byte_perm (w0[1], w0[2], selector); + w0[2] = __byte_perm (w0[0], w0[1], selector); + w0[1] = __byte_perm ( 0, w0[0], selector); + w0[0] = 0; + + break; + + case 2: + w3[1] = __byte_perm (w2[2], w2[3], selector); + w3[0] = __byte_perm (w2[1], w2[2], selector); + w2[3] = __byte_perm (w2[0], w2[1], selector); + w2[2] = __byte_perm (w1[3], w2[0], selector); + w2[1] = __byte_perm (w1[2], w1[3], selector); + w2[0] = __byte_perm (w1[1], w1[2], selector); + w1[3] = __byte_perm (w1[0], w1[1], selector); + w1[2] = __byte_perm (w0[3], w1[0], selector); + w1[1] = __byte_perm (w0[2], w0[3], selector); + w1[0] = __byte_perm (w0[1], w0[2], selector); + w0[3] = __byte_perm (w0[0], w0[1], selector); + w0[2] = __byte_perm ( 0, w0[0], selector); + w0[1] = 0; + w0[0] = 0; + + break; + + case 3: + w3[1] = __byte_perm (w2[1], w2[2], selector); + w3[0] = __byte_perm (w2[0], w2[1], selector); + w2[3] = __byte_perm (w1[3], w2[0], selector); + w2[2] = __byte_perm (w1[2], w1[3], selector); + w2[1] = __byte_perm (w1[1], w1[2], selector); + w2[0] = __byte_perm (w1[0], w1[1], selector); + w1[3] = __byte_perm (w0[3], w1[0], selector); + w1[2] = __byte_perm (w0[2], w0[3], selector); + w1[1] = __byte_perm (w0[1], w0[2], selector); + w1[0] = __byte_perm (w0[0], w0[1], selector); + w0[3] = __byte_perm ( 0, w0[0], selector); + w0[2] = 0; + w0[1] = 0; + w0[0] = 0; + + break; + + case 4: + w3[1] = __byte_perm (w2[0], w2[1], selector); + w3[0] = __byte_perm (w1[3], w2[0], selector); + w2[3] = __byte_perm (w1[2], w1[3], selector); + w2[2] = __byte_perm (w1[1], w1[2], selector); + w2[1] = __byte_perm (w1[0], w1[1], selector); + w2[0] = __byte_perm (w0[3], w1[0], selector); + w1[3] = __byte_perm (w0[2], w0[3], selector); + w1[2] = __byte_perm (w0[1], w0[2], selector); + w1[1] = __byte_perm (w0[0], w0[1], selector); + w1[0] = __byte_perm ( 0, w0[0], selector); + w0[3] = 0; + w0[2] = 0; + w0[1] = 0; + w0[0] = 0; + + break; + + case 5: + w3[1] = __byte_perm (w1[3], w2[0], selector); + w3[0] = __byte_perm (w1[2], w1[3], selector); + w2[3] = __byte_perm (w1[1], w1[2], selector); + w2[2] = __byte_perm (w1[0], w1[1], selector); + w2[1] = __byte_perm (w0[3], w1[0], selector); + w2[0] = __byte_perm (w0[2], w0[3], selector); + w1[3] = __byte_perm (w0[1], w0[2], selector); + w1[2] = __byte_perm (w0[0], w0[1], selector); + w1[1] = __byte_perm ( 0, w0[0], selector); + w1[0] = 0; + w0[3] = 0; + w0[2] = 0; + w0[1] = 0; + w0[0] = 0; + + break; + + case 6: + w3[1] = __byte_perm (w1[2], w1[3], selector); + w3[0] = __byte_perm (w1[1], w1[2], selector); + w2[3] = __byte_perm (w1[0], w1[1], selector); + w2[2] = __byte_perm (w0[3], w1[0], selector); + w2[1] = __byte_perm (w0[2], w0[3], selector); + w2[0] = __byte_perm (w0[1], w0[2], selector); + w1[3] = __byte_perm (w0[0], w0[1], selector); + w1[2] = __byte_perm ( 0, w0[0], selector); + w1[1] = 0; + w1[0] = 0; + w0[3] = 0; + w0[2] = 0; + w0[1] = 0; + w0[0] = 0; + + break; + + case 7: + w3[1] = __byte_perm (w1[1], w1[2], selector); + w3[0] = __byte_perm (w1[0], w1[1], selector); + w2[3] = __byte_perm (w0[3], w1[0], selector); + w2[2] = __byte_perm (w0[2], w0[3], selector); + w2[1] = __byte_perm (w0[1], w0[2], selector); + w2[0] = __byte_perm (w0[0], w0[1], selector); + w1[3] = __byte_perm ( 0, w0[0], selector); + w1[2] = 0; + w1[1] = 0; + w1[0] = 0; + w0[3] = 0; + w0[2] = 0; + w0[1] = 0; + w0[0] = 0; + + break; + + case 8: + w3[1] = __byte_perm (w1[0], w1[1], selector); + w3[0] = __byte_perm (w0[3], w1[0], selector); + w2[3] = __byte_perm (w0[2], w0[3], selector); + w2[2] = __byte_perm (w0[1], w0[2], selector); + w2[1] = __byte_perm (w0[0], w0[1], selector); + w2[0] = __byte_perm ( 0, w0[0], selector); + w1[3] = 0; + w1[2] = 0; + w1[1] = 0; + w1[0] = 0; + w0[3] = 0; + w0[2] = 0; + w0[1] = 0; + w0[0] = 0; + + break; + + case 9: + w3[1] = __byte_perm (w0[3], w1[0], selector); + w3[0] = __byte_perm (w0[2], w0[3], selector); + w2[3] = __byte_perm (w0[1], w0[2], selector); + w2[2] = __byte_perm (w0[0], w0[1], selector); + w2[1] = __byte_perm ( 0, w0[0], selector); + w2[0] = 0; + w1[3] = 0; + w1[2] = 0; + w1[1] = 0; + w1[0] = 0; + w0[3] = 0; + w0[2] = 0; + w0[1] = 0; + w0[0] = 0; + + break; + + case 10: + w3[1] = __byte_perm (w0[2], w0[3], selector); + w3[0] = __byte_perm (w0[1], w0[2], selector); + w2[3] = __byte_perm (w0[0], w0[1], selector); + w2[2] = __byte_perm ( 0, w0[0], selector); + w2[1] = 0; + w2[0] = 0; + w1[3] = 0; + w1[2] = 0; + w1[1] = 0; + w1[0] = 0; + w0[3] = 0; + w0[2] = 0; + w0[1] = 0; + w0[0] = 0; + + break; + + case 11: + w3[1] = __byte_perm (w0[1], w0[2], selector); + w3[0] = __byte_perm (w0[0], w0[1], selector); + w2[3] = __byte_perm ( 0, w0[0], selector); + w2[2] = 0; + w2[1] = 0; + w2[0] = 0; + w1[3] = 0; + w1[2] = 0; + w1[1] = 0; + w1[0] = 0; + w0[3] = 0; + w0[2] = 0; + w0[1] = 0; + w0[0] = 0; + + break; + + case 12: + w3[1] = __byte_perm (w0[0], w0[1], selector); + w3[0] = __byte_perm ( 0, w0[0], selector); + w2[3] = 0; + w2[2] = 0; + w2[1] = 0; + w2[0] = 0; + w1[3] = 0; + w1[2] = 0; + w1[1] = 0; + w1[0] = 0; + w0[3] = 0; + w0[2] = 0; + w0[1] = 0; + w0[0] = 0; + + break; + + case 13: + w3[1] = __byte_perm ( 0, w0[0], selector); + w3[0] = 0; + w2[3] = 0; + w2[2] = 0; + w2[1] = 0; + w2[0] = 0; + w1[3] = 0; + w1[2] = 0; + w1[1] = 0; + w1[0] = 0; + w0[3] = 0; + w0[2] = 0; + w0[1] = 0; + w0[0] = 0; + + break; + } + + #else + + u32 tmp0[4]; + u32 tmp1[4]; + u32 tmp2[1]; + + switch (offset % 4) + { + case 0: + tmp0[0] = w0[0]; + tmp0[1] = w0[1]; + tmp0[2] = w0[2]; + tmp0[3] = w0[3]; + tmp1[0] = w1[0]; + tmp1[1] = w1[1]; + tmp1[2] = w1[2]; + tmp1[3] = w1[3]; + tmp2[0] = 0; + break; + + case 1: + tmp0[0] = w0[0] << 8; + tmp0[1] = w0[0] >> 24 | w0[1] << 8; + tmp0[2] = w0[1] >> 24 | w0[2] << 8; + tmp0[3] = w0[2] >> 24 | w0[3] << 8; + tmp1[0] = w0[3] >> 24 | w1[0] << 8; + tmp1[1] = w1[0] >> 24 | w1[1] << 8; + tmp1[2] = w1[1] >> 24 | w1[2] << 8; + tmp1[3] = w1[2] >> 24 | w1[3] << 8; + tmp2[0] = w1[3] >> 24; + break; + + case 2: + tmp0[0] = w0[0] << 16; + tmp0[1] = w0[0] >> 16 | w0[1] << 16; + tmp0[2] = w0[1] >> 16 | w0[2] << 16; + tmp0[3] = w0[2] >> 16 | w0[3] << 16; + tmp1[0] = w0[3] >> 16 | w1[0] << 16; + tmp1[1] = w1[0] >> 16 | w1[1] << 16; + tmp1[2] = w1[1] >> 16 | w1[2] << 16; + tmp1[3] = w1[2] >> 16 | w1[3] << 16; + tmp2[0] = w1[3] >> 16; + break; + + case 3: + tmp0[0] = w0[0] << 24; + tmp0[1] = w0[0] >> 8 | w0[1] << 24; + tmp0[2] = w0[1] >> 8 | w0[2] << 24; + tmp0[3] = w0[2] >> 8 | w0[3] << 24; + tmp1[0] = w0[3] >> 8 | w1[0] << 24; + tmp1[1] = w1[0] >> 8 | w1[1] << 24; + tmp1[2] = w1[1] >> 8 | w1[2] << 24; + tmp1[3] = w1[2] >> 8 | w1[3] << 24; + tmp2[0] = w1[3] >> 8; + break; + } + + switch (offset / 4) + { + case 0: + w0[0] = tmp0[0]; + w0[1] = tmp0[1]; + w0[2] = tmp0[2]; + w0[3] = tmp0[3]; + w1[0] = tmp1[0]; + w1[1] = tmp1[1]; + w1[2] = tmp1[2]; + w1[3] = tmp1[3]; + w2[0] = tmp2[0]; + break; + + case 1: + w0[0] = 0; + w0[1] = tmp0[0]; + w0[2] = tmp0[1]; + w0[3] = tmp0[2]; + w1[0] = tmp0[3]; + w1[1] = tmp1[0]; + w1[2] = tmp1[1]; + w1[3] = tmp1[2]; + w2[0] = tmp1[3]; + w2[1] = tmp2[0]; + break; + + case 2: + w0[0] = 0; + w0[1] = 0; + w0[2] = tmp0[0]; + w0[3] = tmp0[1]; + w1[0] = tmp0[2]; + w1[1] = tmp0[3]; + w1[2] = tmp1[0]; + w1[3] = tmp1[1]; + w2[0] = tmp1[2]; + w2[1] = tmp1[3]; + w2[2] = tmp2[0]; + break; + + case 3: + w0[0] = 0; + w0[1] = 0; + w0[2] = 0; + w0[3] = tmp0[0]; + w1[0] = tmp0[1]; + w1[1] = tmp0[2]; + w1[2] = tmp0[3]; + w1[3] = tmp1[0]; + w2[0] = tmp1[1]; + w2[1] = tmp1[2]; + w2[2] = tmp1[3]; + w2[3] = tmp2[0]; + break; + + case 4: + w0[0] = 0; + w0[1] = 0; + w0[2] = 0; + w0[3] = 0; + w1[0] = tmp0[0]; + w1[1] = tmp0[1]; + w1[2] = tmp0[2]; + w1[3] = tmp0[3]; + w2[0] = tmp1[0]; + w2[1] = tmp1[1]; + w2[2] = tmp1[2]; + w2[3] = tmp1[3]; + w3[0] = tmp2[0]; + break; + + case 5: + w0[0] = 0; + w0[1] = 0; + w0[2] = 0; + w0[3] = 0; + w1[0] = 0; + w1[1] = tmp0[0]; + w1[2] = tmp0[1]; + w1[3] = tmp0[2]; + w2[0] = tmp0[3]; + w2[1] = tmp1[0]; + w2[2] = tmp1[1]; + w2[3] = tmp1[2]; + w3[0] = tmp1[3]; + w3[1] = tmp2[0]; + break; + + case 6: + w0[0] = 0; + w0[1] = 0; + w0[2] = 0; + w0[3] = 0; + w1[0] = 0; + w1[1] = 0; + w1[2] = tmp0[0]; + w1[3] = tmp0[1]; + w2[0] = tmp0[2]; + w2[1] = tmp0[3]; + w2[2] = tmp1[0]; + w2[3] = tmp1[1]; + w3[0] = tmp1[2]; + w3[1] = tmp1[3]; + w3[2] = tmp2[0]; + break; + + case 7: + w0[0] = 0; + w0[1] = 0; + w0[2] = 0; + w0[3] = 0; + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = tmp0[0]; + w2[0] = tmp0[1]; + w2[1] = tmp0[2]; + w2[2] = tmp0[3]; + w2[3] = tmp1[0]; + w3[0] = tmp1[1]; + w3[1] = tmp1[2]; + w3[2] = tmp1[3]; + w3[3] = tmp2[0]; + break; + + case 8: + w0[0] = 0; + w0[1] = 0; + w0[2] = 0; + w0[3] = 0; + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + w2[0] = tmp0[0]; + w2[1] = tmp0[1]; + w2[2] = tmp0[2]; + w2[3] = tmp0[3]; + w3[0] = tmp1[0]; + w3[1] = tmp1[1]; + w3[2] = tmp1[2]; + w3[3] = tmp1[3]; + break; + + case 9: + w0[0] = 0; + w0[1] = 0; + w0[2] = 0; + w0[3] = 0; + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + w2[0] = 0; + w2[1] = tmp0[0]; + w2[2] = tmp0[1]; + w2[3] = tmp0[2]; + w3[0] = tmp0[3]; + w3[1] = tmp1[0]; + w3[2] = tmp1[1]; + w3[3] = tmp1[2]; + break; + + case 10: + w0[0] = 0; + w0[1] = 0; + w0[2] = 0; + w0[3] = 0; + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + w2[0] = 0; + w2[1] = 0; + w2[2] = tmp0[0]; + w2[3] = tmp0[1]; + w3[0] = tmp0[2]; + w3[1] = tmp0[3]; + w3[2] = tmp1[0]; + w3[3] = tmp1[1]; + break; + + case 11: + w0[0] = 0; + w0[1] = 0; + w0[2] = 0; + w0[3] = 0; + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = tmp0[0]; + w3[0] = tmp0[1]; + w3[1] = tmp0[2]; + w3[2] = tmp0[3]; + w3[3] = tmp1[0]; + break; + + case 12: + w0[0] = 0; + w0[1] = 0; + w0[2] = 0; + w0[3] = 0; + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + w3[0] = tmp0[0]; + w3[1] = tmp0[1]; + w3[2] = tmp0[2]; + w3[3] = tmp0[3]; + break; + + case 13: + w0[0] = 0; + w0[1] = 0; + w0[2] = 0; + w0[3] = 0; + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + w3[0] = 0; + w3[1] = tmp0[0]; + w3[2] = tmp0[1]; + w3[3] = tmp0[2]; + break; + + } + + #endif +} + +__device__ static void switch_buffer_by_offset_be (u32 w0[4], u32 w1[4], u32 w2[4], u32 w3[4], const u32 offset) +{ + const int selector = (0x76543210 >> ((offset & 3) * 4)) & 0xffff; + + switch (offset / 4) + { + case 0: + w3[1] = __byte_perm (w3[1], w3[0], selector); + w3[0] = __byte_perm (w3[0], w2[3], selector); + w2[3] = __byte_perm (w2[3], w2[2], selector); + w2[2] = __byte_perm (w2[2], w2[1], selector); + w2[1] = __byte_perm (w2[1], w2[0], selector); + w2[0] = __byte_perm (w2[0], w1[3], selector); + w1[3] = __byte_perm (w1[3], w1[2], selector); + w1[2] = __byte_perm (w1[2], w1[1], selector); + w1[1] = __byte_perm (w1[1], w1[0], selector); + w1[0] = __byte_perm (w1[0], w0[3], selector); + w0[3] = __byte_perm (w0[3], w0[2], selector); + w0[2] = __byte_perm (w0[2], w0[1], selector); + w0[1] = __byte_perm (w0[1], w0[0], selector); + w0[0] = __byte_perm (w0[0], 0, selector); + break; + + case 1: + w3[1] = __byte_perm (w3[0], w2[3], selector); + w3[0] = __byte_perm (w2[3], w2[2], selector); + w2[3] = __byte_perm (w2[2], w2[1], selector); + w2[2] = __byte_perm (w2[1], w2[0], selector); + w2[1] = __byte_perm (w2[0], w1[3], selector); + w2[0] = __byte_perm (w1[3], w1[2], selector); + w1[3] = __byte_perm (w1[2], w1[1], selector); + w1[2] = __byte_perm (w1[1], w1[0], selector); + w1[1] = __byte_perm (w1[0], w0[3], selector); + w1[0] = __byte_perm (w0[3], w0[2], selector); + w0[3] = __byte_perm (w0[2], w0[1], selector); + w0[2] = __byte_perm (w0[1], w0[0], selector); + w0[1] = __byte_perm (w0[0], 0, selector); + w0[0] = 0; + break; + + case 2: + w3[1] = __byte_perm (w2[3], w2[2], selector); + w3[0] = __byte_perm (w2[2], w2[1], selector); + w2[3] = __byte_perm (w2[1], w2[0], selector); + w2[2] = __byte_perm (w2[0], w1[3], selector); + w2[1] = __byte_perm (w1[3], w1[2], selector); + w2[0] = __byte_perm (w1[2], w1[1], selector); + w1[3] = __byte_perm (w1[1], w1[0], selector); + w1[2] = __byte_perm (w1[0], w0[3], selector); + w1[1] = __byte_perm (w0[3], w0[2], selector); + w1[0] = __byte_perm (w0[2], w0[1], selector); + w0[3] = __byte_perm (w0[1], w0[0], selector); + w0[2] = __byte_perm (w0[0], 0, selector); + w0[1] = 0; + w0[0] = 0; + break; + + case 3: + w3[1] = __byte_perm (w2[2], w2[1], selector); + w3[0] = __byte_perm (w2[1], w2[0], selector); + w2[3] = __byte_perm (w2[0], w1[3], selector); + w2[2] = __byte_perm (w1[3], w1[2], selector); + w2[1] = __byte_perm (w1[2], w1[1], selector); + w2[0] = __byte_perm (w1[1], w1[0], selector); + w1[3] = __byte_perm (w1[0], w0[3], selector); + w1[2] = __byte_perm (w0[3], w0[2], selector); + w1[1] = __byte_perm (w0[2], w0[1], selector); + w1[0] = __byte_perm (w0[1], w0[0], selector); + w0[3] = __byte_perm (w0[0], 0, selector); + w0[2] = 0; + w0[1] = 0; + w0[0] = 0; + break; + + case 4: + w3[1] = __byte_perm (w2[1], w2[0], selector); + w3[0] = __byte_perm (w2[0], w1[3], selector); + w2[3] = __byte_perm (w1[3], w1[2], selector); + w2[2] = __byte_perm (w1[2], w1[1], selector); + w2[1] = __byte_perm (w1[1], w1[0], selector); + w2[0] = __byte_perm (w1[0], w0[3], selector); + w1[3] = __byte_perm (w0[3], w0[2], selector); + w1[2] = __byte_perm (w0[2], w0[1], selector); + w1[1] = __byte_perm (w0[1], w0[0], selector); + w1[0] = __byte_perm (w0[0], 0, selector); + w0[3] = 0; + w0[2] = 0; + w0[1] = 0; + w0[0] = 0; + break; + + case 5: + w3[1] = __byte_perm (w2[0], w1[3], selector); + w3[0] = __byte_perm (w1[3], w1[2], selector); + w2[3] = __byte_perm (w1[2], w1[1], selector); + w2[2] = __byte_perm (w1[1], w1[0], selector); + w2[1] = __byte_perm (w1[0], w0[3], selector); + w2[0] = __byte_perm (w0[3], w0[2], selector); + w1[3] = __byte_perm (w0[2], w0[1], selector); + w1[2] = __byte_perm (w0[1], w0[0], selector); + w1[1] = __byte_perm (w0[0], 0, selector); + w1[0] = 0; + w0[3] = 0; + w0[2] = 0; + w0[1] = 0; + w0[0] = 0; + break; + + case 6: + w3[1] = __byte_perm (w1[3], w1[2], selector); + w3[0] = __byte_perm (w1[2], w1[1], selector); + w2[3] = __byte_perm (w1[1], w1[0], selector); + w2[2] = __byte_perm (w1[0], w0[3], selector); + w2[1] = __byte_perm (w0[3], w0[2], selector); + w2[0] = __byte_perm (w0[2], w0[1], selector); + w1[3] = __byte_perm (w0[1], w0[0], selector); + w1[2] = __byte_perm (w0[0], 0, selector); + w1[1] = 0; + w1[0] = 0; + w0[3] = 0; + w0[2] = 0; + w0[1] = 0; + w0[0] = 0; + break; + + case 7: + w3[1] = __byte_perm (w1[2], w1[1], selector); + w3[0] = __byte_perm (w1[1], w1[0], selector); + w2[3] = __byte_perm (w1[0], w0[3], selector); + w2[2] = __byte_perm (w0[3], w0[2], selector); + w2[1] = __byte_perm (w0[2], w0[1], selector); + w2[0] = __byte_perm (w0[1], w0[0], selector); + w1[3] = __byte_perm (w0[0], 0, selector); + w1[2] = 0; + w1[1] = 0; + w1[0] = 0; + w0[3] = 0; + w0[2] = 0; + w0[1] = 0; + w0[0] = 0; + break; + + case 8: + w3[1] = __byte_perm (w1[1], w1[0], selector); + w3[0] = __byte_perm (w1[0], w0[3], selector); + w2[3] = __byte_perm (w0[3], w0[2], selector); + w2[2] = __byte_perm (w0[2], w0[1], selector); + w2[1] = __byte_perm (w0[1], w0[0], selector); + w2[0] = __byte_perm (w0[0], 0, selector); + w1[3] = 0; + w1[2] = 0; + w1[1] = 0; + w1[0] = 0; + w0[3] = 0; + w0[2] = 0; + w0[1] = 0; + w0[0] = 0; + break; + + case 9: + w3[1] = __byte_perm (w1[0], w0[3], selector); + w3[0] = __byte_perm (w0[3], w0[2], selector); + w2[3] = __byte_perm (w0[2], w0[1], selector); + w2[2] = __byte_perm (w0[1], w0[0], selector); + w2[1] = __byte_perm (w0[0], 0, selector); + w2[0] = 0; + w1[3] = 0; + w1[2] = 0; + w1[1] = 0; + w1[0] = 0; + w0[3] = 0; + w0[2] = 0; + w0[1] = 0; + w0[0] = 0; + break; + + case 10: + w3[1] = __byte_perm (w0[3], w0[2], selector); + w3[0] = __byte_perm (w0[2], w0[1], selector); + w2[3] = __byte_perm (w0[1], w0[0], selector); + w2[2] = __byte_perm (w0[0], 0, selector); + w2[1] = 0; + w2[0] = 0; + w1[3] = 0; + w1[2] = 0; + w1[1] = 0; + w1[0] = 0; + w0[3] = 0; + w0[2] = 0; + w0[1] = 0; + w0[0] = 0; + break; + + case 11: + w3[1] = __byte_perm (w0[2], w0[1], selector); + w3[0] = __byte_perm (w0[1], w0[0], selector); + w2[3] = __byte_perm (w0[0], 0, selector); + w2[2] = 0; + w2[1] = 0; + w2[0] = 0; + w1[3] = 0; + w1[2] = 0; + w1[1] = 0; + w1[0] = 0; + w0[3] = 0; + w0[2] = 0; + w0[1] = 0; + w0[0] = 0; + break; + + case 12: + w3[1] = __byte_perm (w0[1], w0[0], selector); + w3[0] = __byte_perm (w0[0], 0, selector); + w2[3] = 0; + w2[2] = 0; + w2[1] = 0; + w2[0] = 0; + w1[3] = 0; + w1[2] = 0; + w1[1] = 0; + w1[0] = 0; + w0[3] = 0; + w0[2] = 0; + w0[1] = 0; + w0[0] = 0; + break; + + case 13: + w3[1] = __byte_perm (w0[0], 0, selector); + w3[0] = 0; + w2[3] = 0; + w2[2] = 0; + w2[1] = 0; + w2[0] = 0; + w1[3] = 0; + w1[2] = 0; + w1[1] = 0; + w1[0] = 0; + w0[3] = 0; + w0[2] = 0; + w0[1] = 0; + w0[0] = 0; + break; + } +} + +/** + * vector + */ + +#ifndef VECT_SIZE1 +__device__ static u32x swap_workaround (const u32x v) +{ + #if __CUDA_ARCH__ >= 200 + return __byte_perm (v, 0, 0x0123); + + #else + return (v << 24) + ((v & 0x0000FF00) << 8) + ((v & 0x00FF0000) >> 8) + (v >> 24); + + #endif +} + +__device__ static u64x swap_workaround (const u64x v) +{ + return (((v & 0xff00000000000000) >> 56) + | ((v & 0x00ff000000000000) >> 40) + | ((v & 0x0000ff0000000000) >> 24) + | ((v & 0x000000ff00000000) >> 8) + | ((v & 0x00000000ff000000) << 8) + | ((v & 0x0000000000ff0000) << 24) + | ((v & 0x000000000000ff00) << 40) + | ((v & 0x00000000000000ff) << 56)); +} + +__device__ static void truncate_block (u32x w[4], const u32 len) +{ + switch (len) + { + case 0: w[0] &= 0; + w[1] &= 0; + w[2] &= 0; + w[3] &= 0; + break; + case 1: w[0] &= 0x000000FF; + w[1] &= 0; + w[2] &= 0; + w[3] &= 0; + break; + case 2: w[0] &= 0x0000FFFF; + w[1] &= 0; + w[2] &= 0; + w[3] &= 0; + break; + case 3: w[0] &= 0x00FFFFFF; + w[1] &= 0; + w[2] &= 0; + w[3] &= 0; + break; + case 4: w[1] &= 0; + w[2] &= 0; + w[3] &= 0; + break; + case 5: w[1] &= 0x000000FF; + w[2] &= 0; + w[3] &= 0; + break; + case 6: w[1] &= 0x0000FFFF; + w[2] &= 0; + w[3] &= 0; + break; + case 7: w[1] &= 0x00FFFFFF; + w[2] &= 0; + w[3] &= 0; + break; + case 8: w[2] &= 0; + w[3] &= 0; + break; + case 9: w[2] &= 0x000000FF; + w[3] &= 0; + break; + case 10: w[2] &= 0x0000FFFF; + w[3] &= 0; + break; + case 11: w[2] &= 0x00FFFFFF; + w[3] &= 0; + break; + case 12: w[3] &= 0; + break; + case 13: w[3] &= 0x000000FF; + break; + case 14: w[3] &= 0x0000FFFF; + break; + case 15: w[3] &= 0x00FFFFFF; + break; + } +} + +__device__ static void make_unicode (const u32x in[4], u32x out1[4], u32x out2[4]) +{ + #if __CUDA_ARCH__ >= 200 + out2[3] = __byte_perm (in[3], 0, 0x7372); + out2[2] = __byte_perm (in[3], 0, 0x7170); + out2[1] = __byte_perm (in[2], 0, 0x7372); + out2[0] = __byte_perm (in[2], 0, 0x7170); + out1[3] = __byte_perm (in[1], 0, 0x7372); + out1[2] = __byte_perm (in[1], 0, 0x7170); + out1[1] = __byte_perm (in[0], 0, 0x7372); + out1[0] = __byte_perm (in[0], 0, 0x7170); + #else + out2[3] = ((in[3] >> 8) & 0x00FF0000) | ((in[3] >> 16) & 0x000000FF); + out2[2] = ((in[3] << 8) & 0x00FF0000) | ((in[3] >> 0) & 0x000000FF); + out2[1] = ((in[2] >> 8) & 0x00FF0000) | ((in[2] >> 16) & 0x000000FF); + out2[0] = ((in[2] << 8) & 0x00FF0000) | ((in[2] >> 0) & 0x000000FF); + out1[3] = ((in[1] >> 8) & 0x00FF0000) | ((in[1] >> 16) & 0x000000FF); + out1[2] = ((in[1] << 8) & 0x00FF0000) | ((in[1] >> 0) & 0x000000FF); + out1[1] = ((in[0] >> 8) & 0x00FF0000) | ((in[0] >> 16) & 0x000000FF); + out1[0] = ((in[0] << 8) & 0x00FF0000) | ((in[0] >> 0) & 0x000000FF); + #endif +} + +__device__ static void append_0x01_1 (u32x w0[4], const u32 offset) +{ + switch (offset) + { + case 0: + w0[0] = 0x01; + break; + + case 1: + w0[0] = w0[0] | 0x0100; + break; + + case 2: + w0[0] = w0[0] | 0x010000; + break; + + case 3: + w0[0] = w0[0] | 0x01000000; + break; + + case 4: + w0[1] = 0x01; + break; + + case 5: + w0[1] = w0[1] | 0x0100; + break; + + case 6: + w0[1] = w0[1] | 0x010000; + break; + + case 7: + w0[1] = w0[1] | 0x01000000; + break; + + case 8: + w0[2] = 0x01; + break; + + case 9: + w0[2] = w0[2] | 0x0100; + break; + + case 10: + w0[2] = w0[2] | 0x010000; + break; + + case 11: + w0[2] = w0[2] | 0x01000000; + break; + + case 12: + w0[3] = 0x01; + break; + + case 13: + w0[3] = w0[3] | 0x0100; + break; + + case 14: + w0[3] = w0[3] | 0x010000; + break; + + case 15: + w0[3] = w0[3] | 0x01000000; + break; + } +} + +__device__ static void append_0x01_2 (u32x w0[4], u32x w1[4], const u32 offset) +{ + switch (offset) + { + case 0: + w0[0] = 0x01; + break; + + case 1: + w0[0] = w0[0] | 0x0100; + break; + + case 2: + w0[0] = w0[0] | 0x010000; + break; + + case 3: + w0[0] = w0[0] | 0x01000000; + break; + + case 4: + w0[1] = 0x01; + break; + + case 5: + w0[1] = w0[1] | 0x0100; + break; + + case 6: + w0[1] = w0[1] | 0x010000; + break; + + case 7: + w0[1] = w0[1] | 0x01000000; + break; + + case 8: + w0[2] = 0x01; + break; + + case 9: + w0[2] = w0[2] | 0x0100; + break; + + case 10: + w0[2] = w0[2] | 0x010000; + break; + + case 11: + w0[2] = w0[2] | 0x01000000; + break; + + case 12: + w0[3] = 0x01; + break; + + case 13: + w0[3] = w0[3] | 0x0100; + break; + + case 14: + w0[3] = w0[3] | 0x010000; + break; + + case 15: + w0[3] = w0[3] | 0x01000000; + break; + + case 16: + w1[0] = 0x01; + break; + + case 17: + w1[0] = w1[0] | 0x0100; + break; + + case 18: + w1[0] = w1[0] | 0x010000; + break; + + case 19: + w1[0] = w1[0] | 0x01000000; + break; + + case 20: + w1[1] = 0x01; + break; + + case 21: + w1[1] = w1[1] | 0x0100; + break; + + case 22: + w1[1] = w1[1] | 0x010000; + break; + + case 23: + w1[1] = w1[1] | 0x01000000; + break; + + case 24: + w1[2] = 0x01; + break; + + case 25: + w1[2] = w1[2] | 0x0100; + break; + + case 26: + w1[2] = w1[2] | 0x010000; + break; + + case 27: + w1[2] = w1[2] | 0x01000000; + break; + + case 28: + w1[3] = 0x01; + break; + + case 29: + w1[3] = w1[3] | 0x0100; + break; + + case 30: + w1[3] = w1[3] | 0x010000; + break; + + case 31: + w1[3] = w1[3] | 0x01000000; + break; + } +} + +__device__ static void append_0x01_3 (u32x w0[4], u32x w1[4], u32x w2[4], const u32 offset) +{ + switch (offset) + { + case 0: + w0[0] = 0x01; + break; + + case 1: + w0[0] = w0[0] | 0x0100; + break; + + case 2: + w0[0] = w0[0] | 0x010000; + break; + + case 3: + w0[0] = w0[0] | 0x01000000; + break; + + case 4: + w0[1] = 0x01; + break; + + case 5: + w0[1] = w0[1] | 0x0100; + break; + + case 6: + w0[1] = w0[1] | 0x010000; + break; + + case 7: + w0[1] = w0[1] | 0x01000000; + break; + + case 8: + w0[2] = 0x01; + break; + + case 9: + w0[2] = w0[2] | 0x0100; + break; + + case 10: + w0[2] = w0[2] | 0x010000; + break; + + case 11: + w0[2] = w0[2] | 0x01000000; + break; + + case 12: + w0[3] = 0x01; + break; + + case 13: + w0[3] = w0[3] | 0x0100; + break; + + case 14: + w0[3] = w0[3] | 0x010000; + break; + + case 15: + w0[3] = w0[3] | 0x01000000; + break; + + case 16: + w1[0] = 0x01; + break; + + case 17: + w1[0] = w1[0] | 0x0100; + break; + + case 18: + w1[0] = w1[0] | 0x010000; + break; + + case 19: + w1[0] = w1[0] | 0x01000000; + break; + + case 20: + w1[1] = 0x01; + break; + + case 21: + w1[1] = w1[1] | 0x0100; + break; + + case 22: + w1[1] = w1[1] | 0x010000; + break; + + case 23: + w1[1] = w1[1] | 0x01000000; + break; + + case 24: + w1[2] = 0x01; + break; + + case 25: + w1[2] = w1[2] | 0x0100; + break; + + case 26: + w1[2] = w1[2] | 0x010000; + break; + + case 27: + w1[2] = w1[2] | 0x01000000; + break; + + case 28: + w1[3] = 0x01; + break; + + case 29: + w1[3] = w1[3] | 0x0100; + break; + + case 30: + w1[3] = w1[3] | 0x010000; + break; + + case 31: + w1[3] = w1[3] | 0x01000000; + break; + + case 32: + w2[0] = 0x01; + break; + + case 33: + w2[0] = w2[0] | 0x0100; + break; + + case 34: + w2[0] = w2[0] | 0x010000; + break; + + case 35: + w2[0] = w2[0] | 0x01000000; + break; + + case 36: + w2[1] = 0x01; + break; + + case 37: + w2[1] = w2[1] | 0x0100; + break; + + case 38: + w2[1] = w2[1] | 0x010000; + break; + + case 39: + w2[1] = w2[1] | 0x01000000; + break; + + case 40: + w2[2] = 0x01; + break; + + case 41: + w2[2] = w2[2] | 0x0100; + break; + + case 42: + w2[2] = w2[2] | 0x010000; + break; + + case 43: + w2[2] = w2[2] | 0x01000000; + break; + + case 44: + w2[3] = 0x01; + break; + + case 45: + w2[3] = w2[3] | 0x0100; + break; + + case 46: + w2[3] = w2[3] | 0x010000; + break; + + case 47: + w2[3] = w2[3] | 0x01000000; + break; + } +} + +__device__ static void append_0x01_4 (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], const u32 offset) +{ + switch (offset) + { + case 0: + w0[0] = 0x01; + break; + + case 1: + w0[0] = w0[0] | 0x0100; + break; + + case 2: + w0[0] = w0[0] | 0x010000; + break; + + case 3: + w0[0] = w0[0] | 0x01000000; + break; + + case 4: + w0[1] = 0x01; + break; + + case 5: + w0[1] = w0[1] | 0x0100; + break; + + case 6: + w0[1] = w0[1] | 0x010000; + break; + + case 7: + w0[1] = w0[1] | 0x01000000; + break; + + case 8: + w0[2] = 0x01; + break; + + case 9: + w0[2] = w0[2] | 0x0100; + break; + + case 10: + w0[2] = w0[2] | 0x010000; + break; + + case 11: + w0[2] = w0[2] | 0x01000000; + break; + + case 12: + w0[3] = 0x01; + break; + + case 13: + w0[3] = w0[3] | 0x0100; + break; + + case 14: + w0[3] = w0[3] | 0x010000; + break; + + case 15: + w0[3] = w0[3] | 0x01000000; + break; + + case 16: + w1[0] = 0x01; + break; + + case 17: + w1[0] = w1[0] | 0x0100; + break; + + case 18: + w1[0] = w1[0] | 0x010000; + break; + + case 19: + w1[0] = w1[0] | 0x01000000; + break; + + case 20: + w1[1] = 0x01; + break; + + case 21: + w1[1] = w1[1] | 0x0100; + break; + + case 22: + w1[1] = w1[1] | 0x010000; + break; + + case 23: + w1[1] = w1[1] | 0x01000000; + break; + + case 24: + w1[2] = 0x01; + break; + + case 25: + w1[2] = w1[2] | 0x0100; + break; + + case 26: + w1[2] = w1[2] | 0x010000; + break; + + case 27: + w1[2] = w1[2] | 0x01000000; + break; + + case 28: + w1[3] = 0x01; + break; + + case 29: + w1[3] = w1[3] | 0x0100; + break; + + case 30: + w1[3] = w1[3] | 0x010000; + break; + + case 31: + w1[3] = w1[3] | 0x01000000; + break; + + case 32: + w2[0] = 0x01; + break; + + case 33: + w2[0] = w2[0] | 0x0100; + break; + + case 34: + w2[0] = w2[0] | 0x010000; + break; + + case 35: + w2[0] = w2[0] | 0x01000000; + break; + + case 36: + w2[1] = 0x01; + break; + + case 37: + w2[1] = w2[1] | 0x0100; + break; + + case 38: + w2[1] = w2[1] | 0x010000; + break; + + case 39: + w2[1] = w2[1] | 0x01000000; + break; + + case 40: + w2[2] = 0x01; + break; + + case 41: + w2[2] = w2[2] | 0x0100; + break; + + case 42: + w2[2] = w2[2] | 0x010000; + break; + + case 43: + w2[2] = w2[2] | 0x01000000; + break; + + case 44: + w2[3] = 0x01; + break; + + case 45: + w2[3] = w2[3] | 0x0100; + break; + + case 46: + w2[3] = w2[3] | 0x010000; + break; + + case 47: + w2[3] = w2[3] | 0x01000000; + break; + + case 48: + w3[0] = 0x01; + break; + + case 49: + w3[0] = w3[0] | 0x0100; + break; + + case 50: + w3[0] = w3[0] | 0x010000; + break; + + case 51: + w3[0] = w3[0] | 0x01000000; + break; + + case 52: + w3[1] = 0x01; + break; + + case 53: + w3[1] = w3[1] | 0x0100; + break; + + case 54: + w3[1] = w3[1] | 0x010000; + break; + + case 55: + w3[1] = w3[1] | 0x01000000; + break; + + case 56: + w3[2] = 0x01; + break; + + case 57: + w3[2] = w3[2] | 0x0100; + break; + + case 58: + w3[2] = w3[2] | 0x010000; + break; + + case 59: + w3[2] = w3[2] | 0x01000000; + break; + + case 60: + w3[3] = 0x01; + break; + + case 61: + w3[3] = w3[3] | 0x0100; + break; + + case 62: + w3[3] = w3[3] | 0x010000; + break; + + case 63: + w3[3] = w3[3] | 0x01000000; + break; + } +} + +__device__ static void append_0x01_8 (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], u32x w4[4], u32x w5[4], u32x w6[4], u32x w7[4], const u32 offset) +{ + switch (offset) + { + case 0: + w0[0] = 0x01; + break; + + case 1: + w0[0] = w0[0] | 0x0100; + break; + + case 2: + w0[0] = w0[0] | 0x010000; + break; + + case 3: + w0[0] = w0[0] | 0x01000000; + break; + + case 4: + w0[1] = 0x01; + break; + + case 5: + w0[1] = w0[1] | 0x0100; + break; + + case 6: + w0[1] = w0[1] | 0x010000; + break; + + case 7: + w0[1] = w0[1] | 0x01000000; + break; + + case 8: + w0[2] = 0x01; + break; + + case 9: + w0[2] = w0[2] | 0x0100; + break; + + case 10: + w0[2] = w0[2] | 0x010000; + break; + + case 11: + w0[2] = w0[2] | 0x01000000; + break; + + case 12: + w0[3] = 0x01; + break; + + case 13: + w0[3] = w0[3] | 0x0100; + break; + + case 14: + w0[3] = w0[3] | 0x010000; + break; + + case 15: + w0[3] = w0[3] | 0x01000000; + break; + + case 16: + w1[0] = 0x01; + break; + + case 17: + w1[0] = w1[0] | 0x0100; + break; + + case 18: + w1[0] = w1[0] | 0x010000; + break; + + case 19: + w1[0] = w1[0] | 0x01000000; + break; + + case 20: + w1[1] = 0x01; + break; + + case 21: + w1[1] = w1[1] | 0x0100; + break; + + case 22: + w1[1] = w1[1] | 0x010000; + break; + + case 23: + w1[1] = w1[1] | 0x01000000; + break; + + case 24: + w1[2] = 0x01; + break; + + case 25: + w1[2] = w1[2] | 0x0100; + break; + + case 26: + w1[2] = w1[2] | 0x010000; + break; + + case 27: + w1[2] = w1[2] | 0x01000000; + break; + + case 28: + w1[3] = 0x01; + break; + + case 29: + w1[3] = w1[3] | 0x0100; + break; + + case 30: + w1[3] = w1[3] | 0x010000; + break; + + case 31: + w1[3] = w1[3] | 0x01000000; + break; + + case 32: + w2[0] = 0x01; + break; + + case 33: + w2[0] = w2[0] | 0x0100; + break; + + case 34: + w2[0] = w2[0] | 0x010000; + break; + + case 35: + w2[0] = w2[0] | 0x01000000; + break; + + case 36: + w2[1] = 0x01; + break; + + case 37: + w2[1] = w2[1] | 0x0100; + break; + + case 38: + w2[1] = w2[1] | 0x010000; + break; + + case 39: + w2[1] = w2[1] | 0x01000000; + break; + + case 40: + w2[2] = 0x01; + break; + + case 41: + w2[2] = w2[2] | 0x0100; + break; + + case 42: + w2[2] = w2[2] | 0x010000; + break; + + case 43: + w2[2] = w2[2] | 0x01000000; + break; + + case 44: + w2[3] = 0x01; + break; + + case 45: + w2[3] = w2[3] | 0x0100; + break; + + case 46: + w2[3] = w2[3] | 0x010000; + break; + + case 47: + w2[3] = w2[3] | 0x01000000; + break; + + case 48: + w3[0] = 0x01; + break; + + case 49: + w3[0] = w3[0] | 0x0100; + break; + + case 50: + w3[0] = w3[0] | 0x010000; + break; + + case 51: + w3[0] = w3[0] | 0x01000000; + break; + + case 52: + w3[1] = 0x01; + break; + + case 53: + w3[1] = w3[1] | 0x0100; + break; + + case 54: + w3[1] = w3[1] | 0x010000; + break; + + case 55: + w3[1] = w3[1] | 0x01000000; + break; + + case 56: + w3[2] = 0x01; + break; + + case 57: + w3[2] = w3[2] | 0x0100; + break; + + case 58: + w3[2] = w3[2] | 0x010000; + break; + + case 59: + w3[2] = w3[2] | 0x01000000; + break; + + case 60: + w3[3] = 0x01; + break; + + case 61: + w3[3] = w3[3] | 0x0100; + break; + + case 62: + w3[3] = w3[3] | 0x010000; + break; + + case 63: + w3[3] = w3[3] | 0x01000000; + break; + + case 64: + w4[0] = 0x01; + break; + + case 65: + w4[0] = w4[0] | 0x0100; + break; + + case 66: + w4[0] = w4[0] | 0x010000; + break; + + case 67: + w4[0] = w4[0] | 0x01000000; + break; + + case 68: + w4[1] = 0x01; + break; + + case 69: + w4[1] = w4[1] | 0x0100; + break; + + case 70: + w4[1] = w4[1] | 0x010000; + break; + + case 71: + w4[1] = w4[1] | 0x01000000; + break; + + case 72: + w4[2] = 0x01; + break; + + case 73: + w4[2] = w4[2] | 0x0100; + break; + + case 74: + w4[2] = w4[2] | 0x010000; + break; + + case 75: + w4[2] = w4[2] | 0x01000000; + break; + + case 76: + w4[3] = 0x01; + break; + + case 77: + w4[3] = w4[3] | 0x0100; + break; + + case 78: + w4[3] = w4[3] | 0x010000; + break; + + case 79: + w4[3] = w4[3] | 0x01000000; + break; + + case 80: + w5[0] = 0x01; + break; + + case 81: + w5[0] = w5[0] | 0x0100; + break; + + case 82: + w5[0] = w5[0] | 0x010000; + break; + + case 83: + w5[0] = w5[0] | 0x01000000; + break; + + case 84: + w5[1] = 0x01; + break; + + case 85: + w5[1] = w5[1] | 0x0100; + break; + + case 86: + w5[1] = w5[1] | 0x010000; + break; + + case 87: + w5[1] = w5[1] | 0x01000000; + break; + + case 88: + w5[2] = 0x01; + break; + + case 89: + w5[2] = w5[2] | 0x0100; + break; + + case 90: + w5[2] = w5[2] | 0x010000; + break; + + case 91: + w5[2] = w5[2] | 0x01000000; + break; + + case 92: + w5[3] = 0x01; + break; + + case 93: + w5[3] = w5[3] | 0x0100; + break; + + case 94: + w5[3] = w5[3] | 0x010000; + break; + + case 95: + w5[3] = w5[3] | 0x01000000; + break; + + case 96: + w6[0] = 0x01; + break; + + case 97: + w6[0] = w6[0] | 0x0100; + break; + + case 98: + w6[0] = w6[0] | 0x010000; + break; + + case 99: + w6[0] = w6[0] | 0x01000000; + break; + + case 100: + w6[1] = 0x01; + break; + + case 101: + w6[1] = w6[1] | 0x0100; + break; + + case 102: + w6[1] = w6[1] | 0x010000; + break; + + case 103: + w6[1] = w6[1] | 0x01000000; + break; + + case 104: + w6[2] = 0x01; + break; + + case 105: + w6[2] = w6[2] | 0x0100; + break; + + case 106: + w6[2] = w6[2] | 0x010000; + break; + + case 107: + w6[2] = w6[2] | 0x01000000; + break; + + case 108: + w6[3] = 0x01; + break; + + case 109: + w6[3] = w6[3] | 0x0100; + break; + + case 110: + w6[3] = w6[3] | 0x010000; + break; + + case 111: + w6[3] = w6[3] | 0x01000000; + break; + + case 112: + w7[0] = 0x01; + break; + + case 113: + w7[0] = w7[0] | 0x0100; + break; + + case 114: + w7[0] = w7[0] | 0x010000; + break; + + case 115: + w7[0] = w7[0] | 0x01000000; + break; + + case 116: + w7[1] = 0x01; + break; + + case 117: + w7[1] = w7[1] | 0x0100; + break; + + case 118: + w7[1] = w7[1] | 0x010000; + break; + + case 119: + w7[1] = w7[1] | 0x01000000; + break; + + case 120: + w7[2] = 0x01; + break; + + case 121: + w7[2] = w7[2] | 0x0100; + break; + + case 122: + w7[2] = w7[2] | 0x010000; + break; + + case 123: + w7[2] = w7[2] | 0x01000000; + break; + + case 124: + w7[3] = 0x01; + break; + + case 125: + w7[3] = w7[3] | 0x0100; + break; + + case 126: + w7[3] = w7[3] | 0x010000; + break; + + case 127: + w7[3] = w7[3] | 0x01000000; + break; + } +} + +__device__ static void append_0x02_1 (u32x w0[4], const u32 offset) +{ + switch (offset) + { + case 0: + w0[0] = 0x02; + break; + + case 1: + w0[0] = w0[0] | 0x0200; + break; + + case 2: + w0[0] = w0[0] | 0x020000; + break; + + case 3: + w0[0] = w0[0] | 0x02000000; + break; + + case 4: + w0[1] = 0x02; + break; + + case 5: + w0[1] = w0[1] | 0x0200; + break; + + case 6: + w0[1] = w0[1] | 0x020000; + break; + + case 7: + w0[1] = w0[1] | 0x02000000; + break; + + case 8: + w0[2] = 0x02; + break; + + case 9: + w0[2] = w0[2] | 0x0200; + break; + + case 10: + w0[2] = w0[2] | 0x020000; + break; + + case 11: + w0[2] = w0[2] | 0x02000000; + break; + + case 12: + w0[3] = 0x02; + break; + + case 13: + w0[3] = w0[3] | 0x0200; + break; + + case 14: + w0[3] = w0[3] | 0x020000; + break; + + case 15: + w0[3] = w0[3] | 0x02000000; + break; + } +} + +__device__ static void append_0x02_2 (u32x w0[4], u32x w1[4], const u32 offset) +{ + switch (offset) + { + case 0: + w0[0] = 0x02; + break; + + case 1: + w0[0] = w0[0] | 0x0200; + break; + + case 2: + w0[0] = w0[0] | 0x020000; + break; + + case 3: + w0[0] = w0[0] | 0x02000000; + break; + + case 4: + w0[1] = 0x02; + break; + + case 5: + w0[1] = w0[1] | 0x0200; + break; + + case 6: + w0[1] = w0[1] | 0x020000; + break; + + case 7: + w0[1] = w0[1] | 0x02000000; + break; + + case 8: + w0[2] = 0x02; + break; + + case 9: + w0[2] = w0[2] | 0x0200; + break; + + case 10: + w0[2] = w0[2] | 0x020000; + break; + + case 11: + w0[2] = w0[2] | 0x02000000; + break; + + case 12: + w0[3] = 0x02; + break; + + case 13: + w0[3] = w0[3] | 0x0200; + break; + + case 14: + w0[3] = w0[3] | 0x020000; + break; + + case 15: + w0[3] = w0[3] | 0x02000000; + break; + + case 16: + w1[0] = 0x02; + break; + + case 17: + w1[0] = w1[0] | 0x0200; + break; + + case 18: + w1[0] = w1[0] | 0x020000; + break; + + case 19: + w1[0] = w1[0] | 0x02000000; + break; + + case 20: + w1[1] = 0x02; + break; + + case 21: + w1[1] = w1[1] | 0x0200; + break; + + case 22: + w1[1] = w1[1] | 0x020000; + break; + + case 23: + w1[1] = w1[1] | 0x02000000; + break; + + case 24: + w1[2] = 0x02; + break; + + case 25: + w1[2] = w1[2] | 0x0200; + break; + + case 26: + w1[2] = w1[2] | 0x020000; + break; + + case 27: + w1[2] = w1[2] | 0x02000000; + break; + + case 28: + w1[3] = 0x02; + break; + + case 29: + w1[3] = w1[3] | 0x0200; + break; + + case 30: + w1[3] = w1[3] | 0x020000; + break; + + case 31: + w1[3] = w1[3] | 0x02000000; + break; + } +} + +__device__ static void append_0x02_3 (u32x w0[4], u32x w1[4], u32x w2[4], const u32 offset) +{ + switch (offset) + { + case 0: + w0[0] = 0x02; + break; + + case 1: + w0[0] = w0[0] | 0x0200; + break; + + case 2: + w0[0] = w0[0] | 0x020000; + break; + + case 3: + w0[0] = w0[0] | 0x02000000; + break; + + case 4: + w0[1] = 0x02; + break; + + case 5: + w0[1] = w0[1] | 0x0200; + break; + + case 6: + w0[1] = w0[1] | 0x020000; + break; + + case 7: + w0[1] = w0[1] | 0x02000000; + break; + + case 8: + w0[2] = 0x02; + break; + + case 9: + w0[2] = w0[2] | 0x0200; + break; + + case 10: + w0[2] = w0[2] | 0x020000; + break; + + case 11: + w0[2] = w0[2] | 0x02000000; + break; + + case 12: + w0[3] = 0x02; + break; + + case 13: + w0[3] = w0[3] | 0x0200; + break; + + case 14: + w0[3] = w0[3] | 0x020000; + break; + + case 15: + w0[3] = w0[3] | 0x02000000; + break; + + case 16: + w1[0] = 0x02; + break; + + case 17: + w1[0] = w1[0] | 0x0200; + break; + + case 18: + w1[0] = w1[0] | 0x020000; + break; + + case 19: + w1[0] = w1[0] | 0x02000000; + break; + + case 20: + w1[1] = 0x02; + break; + + case 21: + w1[1] = w1[1] | 0x0200; + break; + + case 22: + w1[1] = w1[1] | 0x020000; + break; + + case 23: + w1[1] = w1[1] | 0x02000000; + break; + + case 24: + w1[2] = 0x02; + break; + + case 25: + w1[2] = w1[2] | 0x0200; + break; + + case 26: + w1[2] = w1[2] | 0x020000; + break; + + case 27: + w1[2] = w1[2] | 0x02000000; + break; + + case 28: + w1[3] = 0x02; + break; + + case 29: + w1[3] = w1[3] | 0x0200; + break; + + case 30: + w1[3] = w1[3] | 0x020000; + break; + + case 31: + w1[3] = w1[3] | 0x02000000; + break; + + case 32: + w2[0] = 0x02; + break; + + case 33: + w2[0] = w2[0] | 0x0200; + break; + + case 34: + w2[0] = w2[0] | 0x020000; + break; + + case 35: + w2[0] = w2[0] | 0x02000000; + break; + + case 36: + w2[1] = 0x02; + break; + + case 37: + w2[1] = w2[1] | 0x0200; + break; + + case 38: + w2[1] = w2[1] | 0x020000; + break; + + case 39: + w2[1] = w2[1] | 0x02000000; + break; + + case 40: + w2[2] = 0x02; + break; + + case 41: + w2[2] = w2[2] | 0x0200; + break; + + case 42: + w2[2] = w2[2] | 0x020000; + break; + + case 43: + w2[2] = w2[2] | 0x02000000; + break; + + case 44: + w2[3] = 0x02; + break; + + case 45: + w2[3] = w2[3] | 0x0200; + break; + + case 46: + w2[3] = w2[3] | 0x020000; + break; + + case 47: + w2[3] = w2[3] | 0x02000000; + break; + } +} + +__device__ static void append_0x02_4 (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], const u32 offset) +{ + switch (offset) + { + case 0: + w0[0] = 0x02; + break; + + case 1: + w0[0] = w0[0] | 0x0200; + break; + + case 2: + w0[0] = w0[0] | 0x020000; + break; + + case 3: + w0[0] = w0[0] | 0x02000000; + break; + + case 4: + w0[1] = 0x02; + break; + + case 5: + w0[1] = w0[1] | 0x0200; + break; + + case 6: + w0[1] = w0[1] | 0x020000; + break; + + case 7: + w0[1] = w0[1] | 0x02000000; + break; + + case 8: + w0[2] = 0x02; + break; + + case 9: + w0[2] = w0[2] | 0x0200; + break; + + case 10: + w0[2] = w0[2] | 0x020000; + break; + + case 11: + w0[2] = w0[2] | 0x02000000; + break; + + case 12: + w0[3] = 0x02; + break; + + case 13: + w0[3] = w0[3] | 0x0200; + break; + + case 14: + w0[3] = w0[3] | 0x020000; + break; + + case 15: + w0[3] = w0[3] | 0x02000000; + break; + + case 16: + w1[0] = 0x02; + break; + + case 17: + w1[0] = w1[0] | 0x0200; + break; + + case 18: + w1[0] = w1[0] | 0x020000; + break; + + case 19: + w1[0] = w1[0] | 0x02000000; + break; + + case 20: + w1[1] = 0x02; + break; + + case 21: + w1[1] = w1[1] | 0x0200; + break; + + case 22: + w1[1] = w1[1] | 0x020000; + break; + + case 23: + w1[1] = w1[1] | 0x02000000; + break; + + case 24: + w1[2] = 0x02; + break; + + case 25: + w1[2] = w1[2] | 0x0200; + break; + + case 26: + w1[2] = w1[2] | 0x020000; + break; + + case 27: + w1[2] = w1[2] | 0x02000000; + break; + + case 28: + w1[3] = 0x02; + break; + + case 29: + w1[3] = w1[3] | 0x0200; + break; + + case 30: + w1[3] = w1[3] | 0x020000; + break; + + case 31: + w1[3] = w1[3] | 0x02000000; + break; + + case 32: + w2[0] = 0x02; + break; + + case 33: + w2[0] = w2[0] | 0x0200; + break; + + case 34: + w2[0] = w2[0] | 0x020000; + break; + + case 35: + w2[0] = w2[0] | 0x02000000; + break; + + case 36: + w2[1] = 0x02; + break; + + case 37: + w2[1] = w2[1] | 0x0200; + break; + + case 38: + w2[1] = w2[1] | 0x020000; + break; + + case 39: + w2[1] = w2[1] | 0x02000000; + break; + + case 40: + w2[2] = 0x02; + break; + + case 41: + w2[2] = w2[2] | 0x0200; + break; + + case 42: + w2[2] = w2[2] | 0x020000; + break; + + case 43: + w2[2] = w2[2] | 0x02000000; + break; + + case 44: + w2[3] = 0x02; + break; + + case 45: + w2[3] = w2[3] | 0x0200; + break; + + case 46: + w2[3] = w2[3] | 0x020000; + break; + + case 47: + w2[3] = w2[3] | 0x02000000; + break; + + case 48: + w3[0] = 0x02; + break; + + case 49: + w3[0] = w3[0] | 0x0200; + break; + + case 50: + w3[0] = w3[0] | 0x020000; + break; + + case 51: + w3[0] = w3[0] | 0x02000000; + break; + + case 52: + w3[1] = 0x02; + break; + + case 53: + w3[1] = w3[1] | 0x0200; + break; + + case 54: + w3[1] = w3[1] | 0x020000; + break; + + case 55: + w3[1] = w3[1] | 0x02000000; + break; + + case 56: + w3[2] = 0x02; + break; + + case 57: + w3[2] = w3[2] | 0x0200; + break; + + case 58: + w3[2] = w3[2] | 0x020000; + break; + + case 59: + w3[2] = w3[2] | 0x02000000; + break; + + case 60: + w3[3] = 0x02; + break; + + case 61: + w3[3] = w3[3] | 0x0200; + break; + + case 62: + w3[3] = w3[3] | 0x020000; + break; + + case 63: + w3[3] = w3[3] | 0x02000000; + break; + } +} + +__device__ static void append_0x02_8 (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], u32x w4[4], u32x w5[4], u32x w6[4], u32x w7[4], const u32 offset) +{ + switch (offset) + { + case 0: + w0[0] = 0x02; + break; + + case 1: + w0[0] = w0[0] | 0x0200; + break; + + case 2: + w0[0] = w0[0] | 0x020000; + break; + + case 3: + w0[0] = w0[0] | 0x02000000; + break; + + case 4: + w0[1] = 0x02; + break; + + case 5: + w0[1] = w0[1] | 0x0200; + break; + + case 6: + w0[1] = w0[1] | 0x020000; + break; + + case 7: + w0[1] = w0[1] | 0x02000000; + break; + + case 8: + w0[2] = 0x02; + break; + + case 9: + w0[2] = w0[2] | 0x0200; + break; + + case 10: + w0[2] = w0[2] | 0x020000; + break; + + case 11: + w0[2] = w0[2] | 0x02000000; + break; + + case 12: + w0[3] = 0x02; + break; + + case 13: + w0[3] = w0[3] | 0x0200; + break; + + case 14: + w0[3] = w0[3] | 0x020000; + break; + + case 15: + w0[3] = w0[3] | 0x02000000; + break; + + case 16: + w1[0] = 0x02; + break; + + case 17: + w1[0] = w1[0] | 0x0200; + break; + + case 18: + w1[0] = w1[0] | 0x020000; + break; + + case 19: + w1[0] = w1[0] | 0x02000000; + break; + + case 20: + w1[1] = 0x02; + break; + + case 21: + w1[1] = w1[1] | 0x0200; + break; + + case 22: + w1[1] = w1[1] | 0x020000; + break; + + case 23: + w1[1] = w1[1] | 0x02000000; + break; + + case 24: + w1[2] = 0x02; + break; + + case 25: + w1[2] = w1[2] | 0x0200; + break; + + case 26: + w1[2] = w1[2] | 0x020000; + break; + + case 27: + w1[2] = w1[2] | 0x02000000; + break; + + case 28: + w1[3] = 0x02; + break; + + case 29: + w1[3] = w1[3] | 0x0200; + break; + + case 30: + w1[3] = w1[3] | 0x020000; + break; + + case 31: + w1[3] = w1[3] | 0x02000000; + break; + + case 32: + w2[0] = 0x02; + break; + + case 33: + w2[0] = w2[0] | 0x0200; + break; + + case 34: + w2[0] = w2[0] | 0x020000; + break; + + case 35: + w2[0] = w2[0] | 0x02000000; + break; + + case 36: + w2[1] = 0x02; + break; + + case 37: + w2[1] = w2[1] | 0x0200; + break; + + case 38: + w2[1] = w2[1] | 0x020000; + break; + + case 39: + w2[1] = w2[1] | 0x02000000; + break; + + case 40: + w2[2] = 0x02; + break; + + case 41: + w2[2] = w2[2] | 0x0200; + break; + + case 42: + w2[2] = w2[2] | 0x020000; + break; + + case 43: + w2[2] = w2[2] | 0x02000000; + break; + + case 44: + w2[3] = 0x02; + break; + + case 45: + w2[3] = w2[3] | 0x0200; + break; + + case 46: + w2[3] = w2[3] | 0x020000; + break; + + case 47: + w2[3] = w2[3] | 0x02000000; + break; + + case 48: + w3[0] = 0x02; + break; + + case 49: + w3[0] = w3[0] | 0x0200; + break; + + case 50: + w3[0] = w3[0] | 0x020000; + break; + + case 51: + w3[0] = w3[0] | 0x02000000; + break; + + case 52: + w3[1] = 0x02; + break; + + case 53: + w3[1] = w3[1] | 0x0200; + break; + + case 54: + w3[1] = w3[1] | 0x020000; + break; + + case 55: + w3[1] = w3[1] | 0x02000000; + break; + + case 56: + w3[2] = 0x02; + break; + + case 57: + w3[2] = w3[2] | 0x0200; + break; + + case 58: + w3[2] = w3[2] | 0x020000; + break; + + case 59: + w3[2] = w3[2] | 0x02000000; + break; + + case 60: + w3[3] = 0x02; + break; + + case 61: + w3[3] = w3[3] | 0x0200; + break; + + case 62: + w3[3] = w3[3] | 0x020000; + break; + + case 63: + w3[3] = w3[3] | 0x02000000; + break; + + case 64: + w4[0] = 0x02; + break; + + case 65: + w4[0] = w4[0] | 0x0200; + break; + + case 66: + w4[0] = w4[0] | 0x020000; + break; + + case 67: + w4[0] = w4[0] | 0x02000000; + break; + + case 68: + w4[1] = 0x02; + break; + + case 69: + w4[1] = w4[1] | 0x0200; + break; + + case 70: + w4[1] = w4[1] | 0x020000; + break; + + case 71: + w4[1] = w4[1] | 0x02000000; + break; + + case 72: + w4[2] = 0x02; + break; + + case 73: + w4[2] = w4[2] | 0x0200; + break; + + case 74: + w4[2] = w4[2] | 0x020000; + break; + + case 75: + w4[2] = w4[2] | 0x02000000; + break; + + case 76: + w4[3] = 0x02; + break; + + case 77: + w4[3] = w4[3] | 0x0200; + break; + + case 78: + w4[3] = w4[3] | 0x020000; + break; + + case 79: + w4[3] = w4[3] | 0x02000000; + break; + + case 80: + w5[0] = 0x02; + break; + + case 81: + w5[0] = w5[0] | 0x0200; + break; + + case 82: + w5[0] = w5[0] | 0x020000; + break; + + case 83: + w5[0] = w5[0] | 0x02000000; + break; + + case 84: + w5[1] = 0x02; + break; + + case 85: + w5[1] = w5[1] | 0x0200; + break; + + case 86: + w5[1] = w5[1] | 0x020000; + break; + + case 87: + w5[1] = w5[1] | 0x02000000; + break; + + case 88: + w5[2] = 0x02; + break; + + case 89: + w5[2] = w5[2] | 0x0200; + break; + + case 90: + w5[2] = w5[2] | 0x020000; + break; + + case 91: + w5[2] = w5[2] | 0x02000000; + break; + + case 92: + w5[3] = 0x02; + break; + + case 93: + w5[3] = w5[3] | 0x0200; + break; + + case 94: + w5[3] = w5[3] | 0x020000; + break; + + case 95: + w5[3] = w5[3] | 0x02000000; + break; + + case 96: + w6[0] = 0x02; + break; + + case 97: + w6[0] = w6[0] | 0x0200; + break; + + case 98: + w6[0] = w6[0] | 0x020000; + break; + + case 99: + w6[0] = w6[0] | 0x02000000; + break; + + case 100: + w6[1] = 0x02; + break; + + case 101: + w6[1] = w6[1] | 0x0200; + break; + + case 102: + w6[1] = w6[1] | 0x020000; + break; + + case 103: + w6[1] = w6[1] | 0x02000000; + break; + + case 104: + w6[2] = 0x02; + break; + + case 105: + w6[2] = w6[2] | 0x0200; + break; + + case 106: + w6[2] = w6[2] | 0x020000; + break; + + case 107: + w6[2] = w6[2] | 0x02000000; + break; + + case 108: + w6[3] = 0x02; + break; + + case 109: + w6[3] = w6[3] | 0x0200; + break; + + case 110: + w6[3] = w6[3] | 0x020000; + break; + + case 111: + w6[3] = w6[3] | 0x02000000; + break; + + case 112: + w7[0] = 0x02; + break; + + case 113: + w7[0] = w7[0] | 0x0200; + break; + + case 114: + w7[0] = w7[0] | 0x020000; + break; + + case 115: + w7[0] = w7[0] | 0x02000000; + break; + + case 116: + w7[1] = 0x02; + break; + + case 117: + w7[1] = w7[1] | 0x0200; + break; + + case 118: + w7[1] = w7[1] | 0x020000; + break; + + case 119: + w7[1] = w7[1] | 0x02000000; + break; + + case 120: + w7[2] = 0x02; + break; + + case 121: + w7[2] = w7[2] | 0x0200; + break; + + case 122: + w7[2] = w7[2] | 0x020000; + break; + + case 123: + w7[2] = w7[2] | 0x02000000; + break; + + case 124: + w7[3] = 0x02; + break; + + case 125: + w7[3] = w7[3] | 0x0200; + break; + + case 126: + w7[3] = w7[3] | 0x020000; + break; + + case 127: + w7[3] = w7[3] | 0x02000000; + break; + } +} + +__device__ static void append_0x80_1 (u32x w0[4], const u32 offset) +{ + switch (offset) + { + case 0: + w0[0] = 0x80; + break; + + case 1: + w0[0] = w0[0] | 0x8000; + break; + + case 2: + w0[0] = w0[0] | 0x800000; + break; + + case 3: + w0[0] = w0[0] | 0x80000000; + break; + + case 4: + w0[1] = 0x80; + break; + + case 5: + w0[1] = w0[1] | 0x8000; + break; + + case 6: + w0[1] = w0[1] | 0x800000; + break; + + case 7: + w0[1] = w0[1] | 0x80000000; + break; + + case 8: + w0[2] = 0x80; + break; + + case 9: + w0[2] = w0[2] | 0x8000; + break; + + case 10: + w0[2] = w0[2] | 0x800000; + break; + + case 11: + w0[2] = w0[2] | 0x80000000; + break; + + case 12: + w0[3] = 0x80; + break; + + case 13: + w0[3] = w0[3] | 0x8000; + break; + + case 14: + w0[3] = w0[3] | 0x800000; + break; + + case 15: + w0[3] = w0[3] | 0x80000000; + break; + } +} + +__device__ static void append_0x80_2 (u32x w0[4], u32x w1[4], const u32 offset) +{ + switch (offset) + { + case 0: + w0[0] = 0x80; + break; + + case 1: + w0[0] = w0[0] | 0x8000; + break; + + case 2: + w0[0] = w0[0] | 0x800000; + break; + + case 3: + w0[0] = w0[0] | 0x80000000; + break; + + case 4: + w0[1] = 0x80; + break; + + case 5: + w0[1] = w0[1] | 0x8000; + break; + + case 6: + w0[1] = w0[1] | 0x800000; + break; + + case 7: + w0[1] = w0[1] | 0x80000000; + break; + + case 8: + w0[2] = 0x80; + break; + + case 9: + w0[2] = w0[2] | 0x8000; + break; + + case 10: + w0[2] = w0[2] | 0x800000; + break; + + case 11: + w0[2] = w0[2] | 0x80000000; + break; + + case 12: + w0[3] = 0x80; + break; + + case 13: + w0[3] = w0[3] | 0x8000; + break; + + case 14: + w0[3] = w0[3] | 0x800000; + break; + + case 15: + w0[3] = w0[3] | 0x80000000; + break; + + case 16: + w1[0] = 0x80; + break; + + case 17: + w1[0] = w1[0] | 0x8000; + break; + + case 18: + w1[0] = w1[0] | 0x800000; + break; + + case 19: + w1[0] = w1[0] | 0x80000000; + break; + + case 20: + w1[1] = 0x80; + break; + + case 21: + w1[1] = w1[1] | 0x8000; + break; + + case 22: + w1[1] = w1[1] | 0x800000; + break; + + case 23: + w1[1] = w1[1] | 0x80000000; + break; + + case 24: + w1[2] = 0x80; + break; + + case 25: + w1[2] = w1[2] | 0x8000; + break; + + case 26: + w1[2] = w1[2] | 0x800000; + break; + + case 27: + w1[2] = w1[2] | 0x80000000; + break; + + case 28: + w1[3] = 0x80; + break; + + case 29: + w1[3] = w1[3] | 0x8000; + break; + + case 30: + w1[3] = w1[3] | 0x800000; + break; + + case 31: + w1[3] = w1[3] | 0x80000000; + break; + } +} + +__device__ static void append_0x80_3 (u32x w0[4], u32x w1[4], u32x w2[4], const u32 offset) +{ + switch (offset) + { + case 0: + w0[0] = 0x80; + break; + + case 1: + w0[0] = w0[0] | 0x8000; + break; + + case 2: + w0[0] = w0[0] | 0x800000; + break; + + case 3: + w0[0] = w0[0] | 0x80000000; + break; + + case 4: + w0[1] = 0x80; + break; + + case 5: + w0[1] = w0[1] | 0x8000; + break; + + case 6: + w0[1] = w0[1] | 0x800000; + break; + + case 7: + w0[1] = w0[1] | 0x80000000; + break; + + case 8: + w0[2] = 0x80; + break; + + case 9: + w0[2] = w0[2] | 0x8000; + break; + + case 10: + w0[2] = w0[2] | 0x800000; + break; + + case 11: + w0[2] = w0[2] | 0x80000000; + break; + + case 12: + w0[3] = 0x80; + break; + + case 13: + w0[3] = w0[3] | 0x8000; + break; + + case 14: + w0[3] = w0[3] | 0x800000; + break; + + case 15: + w0[3] = w0[3] | 0x80000000; + break; + + case 16: + w1[0] = 0x80; + break; + + case 17: + w1[0] = w1[0] | 0x8000; + break; + + case 18: + w1[0] = w1[0] | 0x800000; + break; + + case 19: + w1[0] = w1[0] | 0x80000000; + break; + + case 20: + w1[1] = 0x80; + break; + + case 21: + w1[1] = w1[1] | 0x8000; + break; + + case 22: + w1[1] = w1[1] | 0x800000; + break; + + case 23: + w1[1] = w1[1] | 0x80000000; + break; + + case 24: + w1[2] = 0x80; + break; + + case 25: + w1[2] = w1[2] | 0x8000; + break; + + case 26: + w1[2] = w1[2] | 0x800000; + break; + + case 27: + w1[2] = w1[2] | 0x80000000; + break; + + case 28: + w1[3] = 0x80; + break; + + case 29: + w1[3] = w1[3] | 0x8000; + break; + + case 30: + w1[3] = w1[3] | 0x800000; + break; + + case 31: + w1[3] = w1[3] | 0x80000000; + break; + + case 32: + w2[0] = 0x80; + break; + + case 33: + w2[0] = w2[0] | 0x8000; + break; + + case 34: + w2[0] = w2[0] | 0x800000; + break; + + case 35: + w2[0] = w2[0] | 0x80000000; + break; + + case 36: + w2[1] = 0x80; + break; + + case 37: + w2[1] = w2[1] | 0x8000; + break; + + case 38: + w2[1] = w2[1] | 0x800000; + break; + + case 39: + w2[1] = w2[1] | 0x80000000; + break; + + case 40: + w2[2] = 0x80; + break; + + case 41: + w2[2] = w2[2] | 0x8000; + break; + + case 42: + w2[2] = w2[2] | 0x800000; + break; + + case 43: + w2[2] = w2[2] | 0x80000000; + break; + + case 44: + w2[3] = 0x80; + break; + + case 45: + w2[3] = w2[3] | 0x8000; + break; + + case 46: + w2[3] = w2[3] | 0x800000; + break; + + case 47: + w2[3] = w2[3] | 0x80000000; + break; + } +} + +__device__ static void append_0x80_4 (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], const u32 offset) +{ + switch (offset) + { + case 0: + w0[0] = 0x80; + break; + + case 1: + w0[0] = w0[0] | 0x8000; + break; + + case 2: + w0[0] = w0[0] | 0x800000; + break; + + case 3: + w0[0] = w0[0] | 0x80000000; + break; + + case 4: + w0[1] = 0x80; + break; + + case 5: + w0[1] = w0[1] | 0x8000; + break; + + case 6: + w0[1] = w0[1] | 0x800000; + break; + + case 7: + w0[1] = w0[1] | 0x80000000; + break; + + case 8: + w0[2] = 0x80; + break; + + case 9: + w0[2] = w0[2] | 0x8000; + break; + + case 10: + w0[2] = w0[2] | 0x800000; + break; + + case 11: + w0[2] = w0[2] | 0x80000000; + break; + + case 12: + w0[3] = 0x80; + break; + + case 13: + w0[3] = w0[3] | 0x8000; + break; + + case 14: + w0[3] = w0[3] | 0x800000; + break; + + case 15: + w0[3] = w0[3] | 0x80000000; + break; + + case 16: + w1[0] = 0x80; + break; + + case 17: + w1[0] = w1[0] | 0x8000; + break; + + case 18: + w1[0] = w1[0] | 0x800000; + break; + + case 19: + w1[0] = w1[0] | 0x80000000; + break; + + case 20: + w1[1] = 0x80; + break; + + case 21: + w1[1] = w1[1] | 0x8000; + break; + + case 22: + w1[1] = w1[1] | 0x800000; + break; + + case 23: + w1[1] = w1[1] | 0x80000000; + break; + + case 24: + w1[2] = 0x80; + break; + + case 25: + w1[2] = w1[2] | 0x8000; + break; + + case 26: + w1[2] = w1[2] | 0x800000; + break; + + case 27: + w1[2] = w1[2] | 0x80000000; + break; + + case 28: + w1[3] = 0x80; + break; + + case 29: + w1[3] = w1[3] | 0x8000; + break; + + case 30: + w1[3] = w1[3] | 0x800000; + break; + + case 31: + w1[3] = w1[3] | 0x80000000; + break; + + case 32: + w2[0] = 0x80; + break; + + case 33: + w2[0] = w2[0] | 0x8000; + break; + + case 34: + w2[0] = w2[0] | 0x800000; + break; + + case 35: + w2[0] = w2[0] | 0x80000000; + break; + + case 36: + w2[1] = 0x80; + break; + + case 37: + w2[1] = w2[1] | 0x8000; + break; + + case 38: + w2[1] = w2[1] | 0x800000; + break; + + case 39: + w2[1] = w2[1] | 0x80000000; + break; + + case 40: + w2[2] = 0x80; + break; + + case 41: + w2[2] = w2[2] | 0x8000; + break; + + case 42: + w2[2] = w2[2] | 0x800000; + break; + + case 43: + w2[2] = w2[2] | 0x80000000; + break; + + case 44: + w2[3] = 0x80; + break; + + case 45: + w2[3] = w2[3] | 0x8000; + break; + + case 46: + w2[3] = w2[3] | 0x800000; + break; + + case 47: + w2[3] = w2[3] | 0x80000000; + break; + + case 48: + w3[0] = 0x80; + break; + + case 49: + w3[0] = w3[0] | 0x8000; + break; + + case 50: + w3[0] = w3[0] | 0x800000; + break; + + case 51: + w3[0] = w3[0] | 0x80000000; + break; + + case 52: + w3[1] = 0x80; + break; + + case 53: + w3[1] = w3[1] | 0x8000; + break; + + case 54: + w3[1] = w3[1] | 0x800000; + break; + + case 55: + w3[1] = w3[1] | 0x80000000; + break; + + case 56: + w3[2] = 0x80; + break; + + case 57: + w3[2] = w3[2] | 0x8000; + break; + + case 58: + w3[2] = w3[2] | 0x800000; + break; + + case 59: + w3[2] = w3[2] | 0x80000000; + break; + + case 60: + w3[3] = 0x80; + break; + + case 61: + w3[3] = w3[3] | 0x8000; + break; + + case 62: + w3[3] = w3[3] | 0x800000; + break; + + case 63: + w3[3] = w3[3] | 0x80000000; + break; + } +} + +__device__ static void append_0x80_8 (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], u32x w4[4], u32x w5[4], u32x w6[4], u32x w7[4], const u32 offset) +{ + switch (offset) + { + case 0: + w0[0] = 0x80; + break; + + case 1: + w0[0] = w0[0] | 0x8000; + break; + + case 2: + w0[0] = w0[0] | 0x800000; + break; + + case 3: + w0[0] = w0[0] | 0x80000000; + break; + + case 4: + w0[1] = 0x80; + break; + + case 5: + w0[1] = w0[1] | 0x8000; + break; + + case 6: + w0[1] = w0[1] | 0x800000; + break; + + case 7: + w0[1] = w0[1] | 0x80000000; + break; + + case 8: + w0[2] = 0x80; + break; + + case 9: + w0[2] = w0[2] | 0x8000; + break; + + case 10: + w0[2] = w0[2] | 0x800000; + break; + + case 11: + w0[2] = w0[2] | 0x80000000; + break; + + case 12: + w0[3] = 0x80; + break; + + case 13: + w0[3] = w0[3] | 0x8000; + break; + + case 14: + w0[3] = w0[3] | 0x800000; + break; + + case 15: + w0[3] = w0[3] | 0x80000000; + break; + + case 16: + w1[0] = 0x80; + break; + + case 17: + w1[0] = w1[0] | 0x8000; + break; + + case 18: + w1[0] = w1[0] | 0x800000; + break; + + case 19: + w1[0] = w1[0] | 0x80000000; + break; + + case 20: + w1[1] = 0x80; + break; + + case 21: + w1[1] = w1[1] | 0x8000; + break; + + case 22: + w1[1] = w1[1] | 0x800000; + break; + + case 23: + w1[1] = w1[1] | 0x80000000; + break; + + case 24: + w1[2] = 0x80; + break; + + case 25: + w1[2] = w1[2] | 0x8000; + break; + + case 26: + w1[2] = w1[2] | 0x800000; + break; + + case 27: + w1[2] = w1[2] | 0x80000000; + break; + + case 28: + w1[3] = 0x80; + break; + + case 29: + w1[3] = w1[3] | 0x8000; + break; + + case 30: + w1[3] = w1[3] | 0x800000; + break; + + case 31: + w1[3] = w1[3] | 0x80000000; + break; + + case 32: + w2[0] = 0x80; + break; + + case 33: + w2[0] = w2[0] | 0x8000; + break; + + case 34: + w2[0] = w2[0] | 0x800000; + break; + + case 35: + w2[0] = w2[0] | 0x80000000; + break; + + case 36: + w2[1] = 0x80; + break; + + case 37: + w2[1] = w2[1] | 0x8000; + break; + + case 38: + w2[1] = w2[1] | 0x800000; + break; + + case 39: + w2[1] = w2[1] | 0x80000000; + break; + + case 40: + w2[2] = 0x80; + break; + + case 41: + w2[2] = w2[2] | 0x8000; + break; + + case 42: + w2[2] = w2[2] | 0x800000; + break; + + case 43: + w2[2] = w2[2] | 0x80000000; + break; + + case 44: + w2[3] = 0x80; + break; + + case 45: + w2[3] = w2[3] | 0x8000; + break; + + case 46: + w2[3] = w2[3] | 0x800000; + break; + + case 47: + w2[3] = w2[3] | 0x80000000; + break; + + case 48: + w3[0] = 0x80; + break; + + case 49: + w3[0] = w3[0] | 0x8000; + break; + + case 50: + w3[0] = w3[0] | 0x800000; + break; + + case 51: + w3[0] = w3[0] | 0x80000000; + break; + + case 52: + w3[1] = 0x80; + break; + + case 53: + w3[1] = w3[1] | 0x8000; + break; + + case 54: + w3[1] = w3[1] | 0x800000; + break; + + case 55: + w3[1] = w3[1] | 0x80000000; + break; + + case 56: + w3[2] = 0x80; + break; + + case 57: + w3[2] = w3[2] | 0x8000; + break; + + case 58: + w3[2] = w3[2] | 0x800000; + break; + + case 59: + w3[2] = w3[2] | 0x80000000; + break; + + case 60: + w3[3] = 0x80; + break; + + case 61: + w3[3] = w3[3] | 0x8000; + break; + + case 62: + w3[3] = w3[3] | 0x800000; + break; + + case 63: + w3[3] = w3[3] | 0x80000000; + break; + + case 64: + w4[0] = 0x80; + break; + + case 65: + w4[0] = w4[0] | 0x8000; + break; + + case 66: + w4[0] = w4[0] | 0x800000; + break; + + case 67: + w4[0] = w4[0] | 0x80000000; + break; + + case 68: + w4[1] = 0x80; + break; + + case 69: + w4[1] = w4[1] | 0x8000; + break; + + case 70: + w4[1] = w4[1] | 0x800000; + break; + + case 71: + w4[1] = w4[1] | 0x80000000; + break; + + case 72: + w4[2] = 0x80; + break; + + case 73: + w4[2] = w4[2] | 0x8000; + break; + + case 74: + w4[2] = w4[2] | 0x800000; + break; + + case 75: + w4[2] = w4[2] | 0x80000000; + break; + + case 76: + w4[3] = 0x80; + break; + + case 77: + w4[3] = w4[3] | 0x8000; + break; + + case 78: + w4[3] = w4[3] | 0x800000; + break; + + case 79: + w4[3] = w4[3] | 0x80000000; + break; + + case 80: + w5[0] = 0x80; + break; + + case 81: + w5[0] = w5[0] | 0x8000; + break; + + case 82: + w5[0] = w5[0] | 0x800000; + break; + + case 83: + w5[0] = w5[0] | 0x80000000; + break; + + case 84: + w5[1] = 0x80; + break; + + case 85: + w5[1] = w5[1] | 0x8000; + break; + + case 86: + w5[1] = w5[1] | 0x800000; + break; + + case 87: + w5[1] = w5[1] | 0x80000000; + break; + + case 88: + w5[2] = 0x80; + break; + + case 89: + w5[2] = w5[2] | 0x8000; + break; + + case 90: + w5[2] = w5[2] | 0x800000; + break; + + case 91: + w5[2] = w5[2] | 0x80000000; + break; + + case 92: + w5[3] = 0x80; + break; + + case 93: + w5[3] = w5[3] | 0x8000; + break; + + case 94: + w5[3] = w5[3] | 0x800000; + break; + + case 95: + w5[3] = w5[3] | 0x80000000; + break; + + case 96: + w6[0] = 0x80; + break; + + case 97: + w6[0] = w6[0] | 0x8000; + break; + + case 98: + w6[0] = w6[0] | 0x800000; + break; + + case 99: + w6[0] = w6[0] | 0x80000000; + break; + + case 100: + w6[1] = 0x80; + break; + + case 101: + w6[1] = w6[1] | 0x8000; + break; + + case 102: + w6[1] = w6[1] | 0x800000; + break; + + case 103: + w6[1] = w6[1] | 0x80000000; + break; + + case 104: + w6[2] = 0x80; + break; + + case 105: + w6[2] = w6[2] | 0x8000; + break; + + case 106: + w6[2] = w6[2] | 0x800000; + break; + + case 107: + w6[2] = w6[2] | 0x80000000; + break; + + case 108: + w6[3] = 0x80; + break; + + case 109: + w6[3] = w6[3] | 0x8000; + break; + + case 110: + w6[3] = w6[3] | 0x800000; + break; + + case 111: + w6[3] = w6[3] | 0x80000000; + break; + + case 112: + w7[0] = 0x80; + break; + + case 113: + w7[0] = w7[0] | 0x8000; + break; + + case 114: + w7[0] = w7[0] | 0x800000; + break; + + case 115: + w7[0] = w7[0] | 0x80000000; + break; + + case 116: + w7[1] = 0x80; + break; + + case 117: + w7[1] = w7[1] | 0x8000; + break; + + case 118: + w7[1] = w7[1] | 0x800000; + break; + + case 119: + w7[1] = w7[1] | 0x80000000; + break; + + case 120: + w7[2] = 0x80; + break; + + case 121: + w7[2] = w7[2] | 0x8000; + break; + + case 122: + w7[2] = w7[2] | 0x800000; + break; + + case 123: + w7[2] = w7[2] | 0x80000000; + break; + + case 124: + w7[3] = 0x80; + break; + + case 125: + w7[3] = w7[3] | 0x8000; + break; + + case 126: + w7[3] = w7[3] | 0x800000; + break; + + case 127: + w7[3] = w7[3] | 0x80000000; + break; + } +} + +__device__ static void device_memcat2L (const u32 offset, u32x dst0[2], u32x src_l0[2], u32 src_r0[2]) +{ + switch (offset) + { + case 1: + dst0[0] = src_l0[0] | src_r0[0] << 8; + dst0[1] = src_r0[0] >> 24 | src_r0[1] << 8; + break; + + case 2: + dst0[0] = src_l0[0] | src_r0[0] << 16; + dst0[1] = src_r0[0] >> 16 | src_r0[1] << 16; + break; + + case 3: + dst0[0] = src_l0[0] | src_r0[0] << 24; + dst0[1] = src_r0[0] >> 8 | src_r0[1] << 24; + break; + + case 4: + dst0[1] = src_r0[0]; + break; + + case 5: + dst0[1] = src_l0[1] | src_r0[0] << 8; + break; + + case 6: + dst0[1] = src_l0[1] | src_r0[0] << 16; + break; + + case 7: + dst0[1] = src_l0[1] | src_r0[0] << 24; + break; + } +} + +__device__ static void device_memcat2L (const u32 offset, u32x dst0[2], u32x src_l0[2], u32x src_r0[2]) +{ + switch (offset) + { + case 1: + dst0[0] = src_l0[0] | src_r0[0] << 8; + dst0[1] = src_r0[0] >> 24 | src_r0[1] << 8; + break; + + case 2: + dst0[0] = src_l0[0] | src_r0[0] << 16; + dst0[1] = src_r0[0] >> 16 | src_r0[1] << 16; + break; + + case 3: + dst0[0] = src_l0[0] | src_r0[0] << 24; + dst0[1] = src_r0[0] >> 8 | src_r0[1] << 24; + break; + + case 4: + dst0[1] = src_r0[0]; + break; + + case 5: + dst0[1] = src_l0[1] | src_r0[0] << 8; + break; + + case 6: + dst0[1] = src_l0[1] | src_r0[0] << 16; + break; + + case 7: + dst0[1] = src_l0[1] | src_r0[0] << 24; + break; + } +} + +__device__ static void device_memcat4L (const u32 offset, u32x dst0[4], u32x src_l0[4], u32 src_r0[4]) +{ + switch (offset) + { + case 1: + dst0[0] = src_l0[0] | src_r0[0] << 8; + dst0[1] = src_r0[0] >> 24 | src_r0[1] << 8; + dst0[2] = src_r0[1] >> 24 | src_r0[2] << 8; + dst0[3] = src_r0[2] >> 24 | src_r0[3] << 8; + break; + + case 2: + dst0[0] = src_l0[0] | src_r0[0] << 16; + dst0[1] = src_r0[0] >> 16 | src_r0[1] << 16; + dst0[2] = src_r0[1] >> 16 | src_r0[2] << 16; + dst0[3] = src_r0[2] >> 16 | src_r0[3] << 16; + break; + + case 3: + dst0[0] = src_l0[0] | src_r0[0] << 24; + dst0[1] = src_r0[0] >> 8 | src_r0[1] << 24; + dst0[2] = src_r0[1] >> 8 | src_r0[2] << 24; + dst0[3] = src_r0[2] >> 8 | src_r0[3] << 24; + break; + + case 4: + dst0[1] = src_r0[0]; + dst0[2] = src_r0[1]; + dst0[3] = src_r0[2]; + break; + + case 5: + dst0[1] = src_l0[1] | src_r0[0] << 8; + dst0[2] = src_r0[0] >> 24 | src_r0[1] << 8; + dst0[3] = src_r0[1] >> 24 | src_r0[2] << 8; + break; + + case 6: + dst0[1] = src_l0[1] | src_r0[0] << 16; + dst0[2] = src_r0[0] >> 16 | src_r0[1] << 16; + dst0[3] = src_r0[1] >> 16 | src_r0[2] << 16; + break; + + case 7: + dst0[1] = src_l0[1] | src_r0[0] << 24; + dst0[2] = src_r0[0] >> 8 | src_r0[1] << 24; + dst0[3] = src_r0[1] >> 8 | src_r0[2] << 24; + break; + + case 8: + dst0[2] = src_r0[0]; + dst0[3] = src_r0[1]; + break; + + case 9: + dst0[2] = src_l0[2] | src_r0[0] << 8; + dst0[3] = src_r0[0] >> 24 | src_r0[1] << 8; + break; + + case 10: + dst0[2] = src_l0[2] | src_r0[0] << 16; + dst0[3] = src_r0[0] >> 16 | src_r0[1] << 16; + break; + + case 11: + dst0[2] = src_l0[2] | src_r0[0] << 24; + dst0[3] = src_r0[0] >> 8 | src_r0[1] << 24; + break; + + case 12: + dst0[3] = src_r0[0]; + break; + + case 13: + dst0[3] = src_l0[3] | src_r0[0] << 8; + break; + + case 14: + dst0[3] = src_l0[3] | src_r0[0] << 16; + break; + + case 15: + dst0[3] = src_l0[3] | src_r0[0] << 24; + break; + } +} + +__device__ static void device_memcat4L (const u32 offset, u32x dst0[4], u32x src_l0[4], u32x src_r0[4]) +{ + switch (offset) + { + case 1: + dst0[0] = src_l0[0] | src_r0[0] << 8; + dst0[1] = src_r0[0] >> 24 | src_r0[1] << 8; + dst0[2] = src_r0[1] >> 24 | src_r0[2] << 8; + dst0[3] = src_r0[2] >> 24 | src_r0[3] << 8; + break; + + case 2: + dst0[0] = src_l0[0] | src_r0[0] << 16; + dst0[1] = src_r0[0] >> 16 | src_r0[1] << 16; + dst0[2] = src_r0[1] >> 16 | src_r0[2] << 16; + dst0[3] = src_r0[2] >> 16 | src_r0[3] << 16; + break; + + case 3: + dst0[0] = src_l0[0] | src_r0[0] << 24; + dst0[1] = src_r0[0] >> 8 | src_r0[1] << 24; + dst0[2] = src_r0[1] >> 8 | src_r0[2] << 24; + dst0[3] = src_r0[2] >> 8 | src_r0[3] << 24; + break; + + case 4: + dst0[1] = src_r0[0]; + dst0[2] = src_r0[1]; + dst0[3] = src_r0[2]; + break; + + case 5: + dst0[1] = src_l0[1] | src_r0[0] << 8; + dst0[2] = src_r0[0] >> 24 | src_r0[1] << 8; + dst0[3] = src_r0[1] >> 24 | src_r0[2] << 8; + break; + + case 6: + dst0[1] = src_l0[1] | src_r0[0] << 16; + dst0[2] = src_r0[0] >> 16 | src_r0[1] << 16; + dst0[3] = src_r0[1] >> 16 | src_r0[2] << 16; + break; + + case 7: + dst0[1] = src_l0[1] | src_r0[0] << 24; + dst0[2] = src_r0[0] >> 8 | src_r0[1] << 24; + dst0[3] = src_r0[1] >> 8 | src_r0[2] << 24; + break; + + case 8: + dst0[2] = src_r0[0]; + dst0[3] = src_r0[1]; + break; + + case 9: + dst0[2] = src_l0[2] | src_r0[0] << 8; + dst0[3] = src_r0[0] >> 24 | src_r0[1] << 8; + break; + + case 10: + dst0[2] = src_l0[2] | src_r0[0] << 16; + dst0[3] = src_r0[0] >> 16 | src_r0[1] << 16; + break; + + case 11: + dst0[2] = src_l0[2] | src_r0[0] << 24; + dst0[3] = src_r0[0] >> 8 | src_r0[1] << 24; + break; + + case 12: + dst0[3] = src_r0[0]; + break; + + case 13: + dst0[3] = src_l0[3] | src_r0[0] << 8; + break; + + case 14: + dst0[3] = src_l0[3] | src_r0[0] << 16; + break; + + case 15: + dst0[3] = src_l0[3] | src_r0[0] << 24; + break; + } +} + +__device__ static void device_memcat8L (const u32 offset, u32x dst0[4], u32x dst1[4], u32x src_l0[4], u32x src_l1[4], u32 src_r0[4]) +{ + switch (offset) + { + case 1: + dst0[0] = src_l0[0] | src_r0[0] << 8; + dst0[1] = src_r0[0] >> 24 | src_r0[1] << 8; + dst0[2] = src_r0[1] >> 24 | src_r0[2] << 8; + dst0[3] = src_r0[2] >> 24 | src_r0[3] << 8; + dst1[0] = src_r0[3] >> 24; + break; + + case 2: + dst0[0] = src_l0[0] | src_r0[0] << 16; + dst0[1] = src_r0[0] >> 16 | src_r0[1] << 16; + dst0[2] = src_r0[1] >> 16 | src_r0[2] << 16; + dst0[3] = src_r0[2] >> 16 | src_r0[3] << 16; + dst1[0] = src_r0[3] >> 16; + break; + + case 3: + dst0[0] = src_l0[0] | src_r0[0] << 24; + dst0[1] = src_r0[0] >> 8 | src_r0[1] << 24; + dst0[2] = src_r0[1] >> 8 | src_r0[2] << 24; + dst0[3] = src_r0[2] >> 8 | src_r0[3] << 24; + dst1[0] = src_r0[3] >> 8; + break; + + case 4: + dst0[1] = src_r0[0]; + dst0[2] = src_r0[1]; + dst0[3] = src_r0[2]; + dst1[0] = src_r0[3]; + break; + + case 5: + dst0[1] = src_l0[1] | src_r0[0] << 8; + dst0[2] = src_r0[0] >> 24 | src_r0[1] << 8; + dst0[3] = src_r0[1] >> 24 | src_r0[2] << 8; + dst1[0] = src_r0[2] >> 24 | src_r0[3] << 8; + dst1[1] = src_r0[3] >> 24; + break; + + case 6: + dst0[1] = src_l0[1] | src_r0[0] << 16; + dst0[2] = src_r0[0] >> 16 | src_r0[1] << 16; + dst0[3] = src_r0[1] >> 16 | src_r0[2] << 16; + dst1[0] = src_r0[2] >> 16 | src_r0[3] << 16; + dst1[1] = src_r0[3] >> 16; + break; + + case 7: + dst0[1] = src_l0[1] | src_r0[0] << 24; + dst0[2] = src_r0[0] >> 8 | src_r0[1] << 24; + dst0[3] = src_r0[1] >> 8 | src_r0[2] << 24; + dst1[0] = src_r0[2] >> 8 | src_r0[3] << 24; + dst1[1] = src_r0[3] >> 8; + break; + + case 8: + dst0[2] = src_r0[0]; + dst0[3] = src_r0[1]; + dst1[0] = src_r0[2]; + dst1[1] = src_r0[3]; + break; + + case 9: + dst0[2] = src_l0[2] | src_r0[0] << 8; + dst0[3] = src_r0[0] >> 24 | src_r0[1] << 8; + dst1[0] = src_r0[1] >> 24 | src_r0[2] << 8; + dst1[1] = src_r0[2] >> 24 | src_r0[3] << 8; + dst1[2] = src_r0[3] >> 24; + break; + + case 10: + dst0[2] = src_l0[2] | src_r0[0] << 16; + dst0[3] = src_r0[0] >> 16 | src_r0[1] << 16; + dst1[0] = src_r0[1] >> 16 | src_r0[2] << 16; + dst1[1] = src_r0[2] >> 16 | src_r0[3] << 16; + dst1[2] = src_r0[3] >> 16; + break; + + case 11: + dst0[2] = src_l0[2] | src_r0[0] << 24; + dst0[3] = src_r0[0] >> 8 | src_r0[1] << 24; + dst1[0] = src_r0[1] >> 8 | src_r0[2] << 24; + dst1[1] = src_r0[2] >> 8 | src_r0[3] << 24; + dst1[2] = src_r0[3] >> 8; + break; + + case 12: + dst0[3] = src_r0[0]; + dst1[0] = src_r0[1]; + dst1[1] = src_r0[2]; + dst1[2] = src_r0[3]; + break; + + case 13: + dst0[3] = src_l0[3] | src_r0[0] << 8; + dst1[0] = src_r0[0] >> 24 | src_r0[1] << 8; + dst1[1] = src_r0[1] >> 24 | src_r0[2] << 8; + dst1[2] = src_r0[2] >> 24 | src_r0[3] << 8; + dst1[3] = src_r0[3] >> 24; + break; + + case 14: + dst0[3] = src_l0[3] | src_r0[0] << 16; + dst1[0] = src_r0[0] >> 16 | src_r0[1] << 16; + dst1[1] = src_r0[1] >> 16 | src_r0[2] << 16; + dst1[2] = src_r0[2] >> 16 | src_r0[3] << 16; + dst1[3] = src_r0[3] >> 16; + break; + + case 15: + dst0[3] = src_l0[3] | src_r0[0] << 24; + dst1[0] = src_r0[0] >> 8 | src_r0[1] << 24; + dst1[1] = src_r0[1] >> 8 | src_r0[2] << 24; + dst1[2] = src_r0[2] >> 8 | src_r0[3] << 24; + dst1[3] = src_r0[3] >> 8; + break; + + case 16: + dst1[0] = src_r0[0]; + dst1[1] = src_r0[1]; + dst1[2] = src_r0[2]; + dst1[3] = src_r0[3]; + break; + + case 17: + dst1[0] = src_l1[0] | src_r0[0] << 8; + dst1[1] = src_r0[0] >> 24 | src_r0[1] << 8; + dst1[2] = src_r0[1] >> 24 | src_r0[2] << 8; + dst1[3] = src_r0[2] >> 24 | src_r0[3] << 8; + break; + + case 18: + dst1[0] = src_l1[0] | src_r0[0] << 16; + dst1[1] = src_r0[0] >> 16 | src_r0[1] << 16; + dst1[2] = src_r0[1] >> 16 | src_r0[2] << 16; + dst1[3] = src_r0[2] >> 16 | src_r0[3] << 16; + break; + + case 19: + dst1[0] = src_l1[0] | src_r0[0] << 24; + dst1[1] = src_r0[0] >> 8 | src_r0[1] << 24; + dst1[2] = src_r0[1] >> 8 | src_r0[2] << 24; + dst1[3] = src_r0[2] >> 8 | src_r0[3] << 24; + break; + + case 20: + dst1[1] = src_r0[0]; + dst1[2] = src_r0[1]; + dst1[3] = src_r0[2]; + break; + + case 21: + dst1[1] = src_l1[1] | src_r0[0] << 8; + dst1[2] = src_r0[0] >> 24 | src_r0[1] << 8; + dst1[3] = src_r0[1] >> 24 | src_r0[2] << 8; + break; + + case 22: + dst1[1] = src_l1[1] | src_r0[0] << 16; + dst1[2] = src_r0[0] >> 16 | src_r0[1] << 16; + dst1[3] = src_r0[1] >> 16 | src_r0[2] << 16; + break; + + case 23: + dst1[1] = src_l1[1] | src_r0[0] << 24; + dst1[2] = src_r0[0] >> 8 | src_r0[1] << 24; + dst1[3] = src_r0[1] >> 8 | src_r0[2] << 24; + break; + + case 24: + dst1[2] = src_r0[0]; + dst1[3] = src_r0[1]; + break; + + case 25: + dst1[2] = src_l1[2] | src_r0[0] << 8; + dst1[3] = src_r0[0] >> 24 | src_r0[1] << 8; + break; + + case 26: + dst1[2] = src_l1[2] | src_r0[0] << 16; + dst1[3] = src_r0[0] >> 16 | src_r0[1] << 16; + break; + + case 27: + dst1[2] = src_l1[2] | src_r0[0] << 24; + dst1[3] = src_r0[0] >> 8 | src_r0[1] << 24; + break; + + case 28: + dst1[3] = src_r0[0]; + break; + + case 29: + dst1[3] = src_l1[3] | src_r0[0] << 8; + break; + + case 30: + dst1[3] = src_l1[3] | src_r0[0] << 16; + break; + + case 31: + dst1[3] = src_l1[3] | src_r0[0] << 24; + break; + } +} + +__device__ static void device_memcat8L (const u32 offset, u32x dst0[4], u32x dst1[4], u32x src_l0[4], u32x src_l1[4], u32x src_r0[4]) +{ + switch (offset) + { + case 1: + dst0[0] = src_l0[0] | src_r0[0] << 8; + dst0[1] = src_r0[0] >> 24 | src_r0[1] << 8; + dst0[2] = src_r0[1] >> 24 | src_r0[2] << 8; + dst0[3] = src_r0[2] >> 24 | src_r0[3] << 8; + dst1[0] = src_r0[3] >> 24; + break; + + case 2: + dst0[0] = src_l0[0] | src_r0[0] << 16; + dst0[1] = src_r0[0] >> 16 | src_r0[1] << 16; + dst0[2] = src_r0[1] >> 16 | src_r0[2] << 16; + dst0[3] = src_r0[2] >> 16 | src_r0[3] << 16; + dst1[0] = src_r0[3] >> 16; + break; + + case 3: + dst0[0] = src_l0[0] | src_r0[0] << 24; + dst0[1] = src_r0[0] >> 8 | src_r0[1] << 24; + dst0[2] = src_r0[1] >> 8 | src_r0[2] << 24; + dst0[3] = src_r0[2] >> 8 | src_r0[3] << 24; + dst1[0] = src_r0[3] >> 8; + break; + + case 4: + dst0[1] = src_r0[0]; + dst0[2] = src_r0[1]; + dst0[3] = src_r0[2]; + dst1[0] = src_r0[3]; + break; + + case 5: + dst0[1] = src_l0[1] | src_r0[0] << 8; + dst0[2] = src_r0[0] >> 24 | src_r0[1] << 8; + dst0[3] = src_r0[1] >> 24 | src_r0[2] << 8; + dst1[0] = src_r0[2] >> 24 | src_r0[3] << 8; + dst1[1] = src_r0[3] >> 24; + break; + + case 6: + dst0[1] = src_l0[1] | src_r0[0] << 16; + dst0[2] = src_r0[0] >> 16 | src_r0[1] << 16; + dst0[3] = src_r0[1] >> 16 | src_r0[2] << 16; + dst1[0] = src_r0[2] >> 16 | src_r0[3] << 16; + dst1[1] = src_r0[3] >> 16; + break; + + case 7: + dst0[1] = src_l0[1] | src_r0[0] << 24; + dst0[2] = src_r0[0] >> 8 | src_r0[1] << 24; + dst0[3] = src_r0[1] >> 8 | src_r0[2] << 24; + dst1[0] = src_r0[2] >> 8 | src_r0[3] << 24; + dst1[1] = src_r0[3] >> 8; + break; + + case 8: + dst0[2] = src_r0[0]; + dst0[3] = src_r0[1]; + dst1[0] = src_r0[2]; + dst1[1] = src_r0[3]; + break; + + case 9: + dst0[2] = src_l0[2] | src_r0[0] << 8; + dst0[3] = src_r0[0] >> 24 | src_r0[1] << 8; + dst1[0] = src_r0[1] >> 24 | src_r0[2] << 8; + dst1[1] = src_r0[2] >> 24 | src_r0[3] << 8; + dst1[2] = src_r0[3] >> 24; + break; + + case 10: + dst0[2] = src_l0[2] | src_r0[0] << 16; + dst0[3] = src_r0[0] >> 16 | src_r0[1] << 16; + dst1[0] = src_r0[1] >> 16 | src_r0[2] << 16; + dst1[1] = src_r0[2] >> 16 | src_r0[3] << 16; + dst1[2] = src_r0[3] >> 16; + break; + + case 11: + dst0[2] = src_l0[2] | src_r0[0] << 24; + dst0[3] = src_r0[0] >> 8 | src_r0[1] << 24; + dst1[0] = src_r0[1] >> 8 | src_r0[2] << 24; + dst1[1] = src_r0[2] >> 8 | src_r0[3] << 24; + dst1[2] = src_r0[3] >> 8; + break; + + case 12: + dst0[3] = src_r0[0]; + dst1[0] = src_r0[1]; + dst1[1] = src_r0[2]; + dst1[2] = src_r0[3]; + break; + + case 13: + dst0[3] = src_l0[3] | src_r0[0] << 8; + dst1[0] = src_r0[0] >> 24 | src_r0[1] << 8; + dst1[1] = src_r0[1] >> 24 | src_r0[2] << 8; + dst1[2] = src_r0[2] >> 24 | src_r0[3] << 8; + dst1[3] = src_r0[3] >> 24; + break; + + case 14: + dst0[3] = src_l0[3] | src_r0[0] << 16; + dst1[0] = src_r0[0] >> 16 | src_r0[1] << 16; + dst1[1] = src_r0[1] >> 16 | src_r0[2] << 16; + dst1[2] = src_r0[2] >> 16 | src_r0[3] << 16; + dst1[3] = src_r0[3] >> 16; + break; + + case 15: + dst0[3] = src_l0[3] | src_r0[0] << 24; + dst1[0] = src_r0[0] >> 8 | src_r0[1] << 24; + dst1[1] = src_r0[1] >> 8 | src_r0[2] << 24; + dst1[2] = src_r0[2] >> 8 | src_r0[3] << 24; + dst1[3] = src_r0[3] >> 8; + break; + + case 16: + dst1[0] = src_r0[0]; + dst1[1] = src_r0[1]; + dst1[2] = src_r0[2]; + dst1[3] = src_r0[3]; + break; + + case 17: + dst1[0] = src_l1[0] | src_r0[0] << 8; + dst1[1] = src_r0[0] >> 24 | src_r0[1] << 8; + dst1[2] = src_r0[1] >> 24 | src_r0[2] << 8; + dst1[3] = src_r0[2] >> 24 | src_r0[3] << 8; + break; + + case 18: + dst1[0] = src_l1[0] | src_r0[0] << 16; + dst1[1] = src_r0[0] >> 16 | src_r0[1] << 16; + dst1[2] = src_r0[1] >> 16 | src_r0[2] << 16; + dst1[3] = src_r0[2] >> 16 | src_r0[3] << 16; + break; + + case 19: + dst1[0] = src_l1[0] | src_r0[0] << 24; + dst1[1] = src_r0[0] >> 8 | src_r0[1] << 24; + dst1[2] = src_r0[1] >> 8 | src_r0[2] << 24; + dst1[3] = src_r0[2] >> 8 | src_r0[3] << 24; + break; + + case 20: + dst1[1] = src_r0[0]; + dst1[2] = src_r0[1]; + dst1[3] = src_r0[2]; + break; + + case 21: + dst1[1] = src_l1[1] | src_r0[0] << 8; + dst1[2] = src_r0[0] >> 24 | src_r0[1] << 8; + dst1[3] = src_r0[1] >> 24 | src_r0[2] << 8; + break; + + case 22: + dst1[1] = src_l1[1] | src_r0[0] << 16; + dst1[2] = src_r0[0] >> 16 | src_r0[1] << 16; + dst1[3] = src_r0[1] >> 16 | src_r0[2] << 16; + break; + + case 23: + dst1[1] = src_l1[1] | src_r0[0] << 24; + dst1[2] = src_r0[0] >> 8 | src_r0[1] << 24; + dst1[3] = src_r0[1] >> 8 | src_r0[2] << 24; + break; + + case 24: + dst1[2] = src_r0[0]; + dst1[3] = src_r0[1]; + break; + + case 25: + dst1[2] = src_l1[2] | src_r0[0] << 8; + dst1[3] = src_r0[0] >> 24 | src_r0[1] << 8; + break; + + case 26: + dst1[2] = src_l1[2] | src_r0[0] << 16; + dst1[3] = src_r0[0] >> 16 | src_r0[1] << 16; + break; + + case 27: + dst1[2] = src_l1[2] | src_r0[0] << 24; + dst1[3] = src_r0[0] >> 8 | src_r0[1] << 24; + break; + + case 28: + dst1[3] = src_r0[0]; + break; + + case 29: + dst1[3] = src_l1[3] | src_r0[0] << 8; + break; + + case 30: + dst1[3] = src_l1[3] | src_r0[0] << 16; + break; + + case 31: + dst1[3] = src_l1[3] | src_r0[0] << 24; + break; + } +} + +__device__ static void device_memcat12L (const u32 offset, u32x dst0[4], u32x dst1[4], u32x dst2[4], u32x src_l0[4], u32x src_l1[4], u32x src_l2[4], u32 src_r0[4]) +{ + switch (offset) + { + case 1: + dst0[0] = src_l0[0] | src_r0[0] << 8; + dst0[1] = src_r0[0] >> 24 | src_r0[1] << 8; + dst0[2] = src_r0[1] >> 24 | src_r0[2] << 8; + dst0[3] = src_r0[2] >> 24 | src_r0[3] << 8; + dst1[0] = src_r0[3] >> 24; + break; + + case 2: + dst0[0] = src_l0[0] | src_r0[0] << 16; + dst0[1] = src_r0[0] >> 16 | src_r0[1] << 16; + dst0[2] = src_r0[1] >> 16 | src_r0[2] << 16; + dst0[3] = src_r0[2] >> 16 | src_r0[3] << 16; + dst1[0] = src_r0[3] >> 16; + break; + + case 3: + dst0[0] = src_l0[0] | src_r0[0] << 24; + dst0[1] = src_r0[0] >> 8 | src_r0[1] << 24; + dst0[2] = src_r0[1] >> 8 | src_r0[2] << 24; + dst0[3] = src_r0[2] >> 8 | src_r0[3] << 24; + dst1[0] = src_r0[3] >> 8; + break; + + case 4: + dst0[1] = src_r0[0]; + dst0[2] = src_r0[1]; + dst0[3] = src_r0[2]; + dst1[0] = src_r0[3]; + break; + + case 5: + dst0[1] = src_l0[1] | src_r0[0] << 8; + dst0[2] = src_r0[0] >> 24 | src_r0[1] << 8; + dst0[3] = src_r0[1] >> 24 | src_r0[2] << 8; + dst1[0] = src_r0[2] >> 24 | src_r0[3] << 8; + dst1[1] = src_r0[3] >> 24; + break; + + case 6: + dst0[1] = src_l0[1] | src_r0[0] << 16; + dst0[2] = src_r0[0] >> 16 | src_r0[1] << 16; + dst0[3] = src_r0[1] >> 16 | src_r0[2] << 16; + dst1[0] = src_r0[2] >> 16 | src_r0[3] << 16; + dst1[1] = src_r0[3] >> 16; + break; + + case 7: + dst0[1] = src_l0[1] | src_r0[0] << 24; + dst0[2] = src_r0[0] >> 8 | src_r0[1] << 24; + dst0[3] = src_r0[1] >> 8 | src_r0[2] << 24; + dst1[0] = src_r0[2] >> 8 | src_r0[3] << 24; + dst1[1] = src_r0[3] >> 8; + break; + + case 8: + dst0[2] = src_r0[0]; + dst0[3] = src_r0[1]; + dst1[0] = src_r0[2]; + dst1[1] = src_r0[3]; + break; + + case 9: + dst0[2] = src_l0[2] | src_r0[0] << 8; + dst0[3] = src_r0[0] >> 24 | src_r0[1] << 8; + dst1[0] = src_r0[1] >> 24 | src_r0[2] << 8; + dst1[1] = src_r0[2] >> 24 | src_r0[3] << 8; + dst1[2] = src_r0[3] >> 24; + break; + + case 10: + dst0[2] = src_l0[2] | src_r0[0] << 16; + dst0[3] = src_r0[0] >> 16 | src_r0[1] << 16; + dst1[0] = src_r0[1] >> 16 | src_r0[2] << 16; + dst1[1] = src_r0[2] >> 16 | src_r0[3] << 16; + dst1[2] = src_r0[3] >> 16; + break; + + case 11: + dst0[2] = src_l0[2] | src_r0[0] << 24; + dst0[3] = src_r0[0] >> 8 | src_r0[1] << 24; + dst1[0] = src_r0[1] >> 8 | src_r0[2] << 24; + dst1[1] = src_r0[2] >> 8 | src_r0[3] << 24; + dst1[2] = src_r0[3] >> 8; + break; + + case 12: + dst0[3] = src_r0[0]; + dst1[0] = src_r0[1]; + dst1[1] = src_r0[2]; + dst1[2] = src_r0[3]; + break; + + case 13: + dst0[3] = src_l0[3] | src_r0[0] << 8; + dst1[0] = src_r0[0] >> 24 | src_r0[1] << 8; + dst1[1] = src_r0[1] >> 24 | src_r0[2] << 8; + dst1[2] = src_r0[2] >> 24 | src_r0[3] << 8; + dst1[3] = src_r0[3] >> 24; + break; + + case 14: + dst0[3] = src_l0[3] | src_r0[0] << 16; + dst1[0] = src_r0[0] >> 16 | src_r0[1] << 16; + dst1[1] = src_r0[1] >> 16 | src_r0[2] << 16; + dst1[2] = src_r0[2] >> 16 | src_r0[3] << 16; + dst1[3] = src_r0[3] >> 16; + break; + + case 15: + dst0[3] = src_l0[3] | src_r0[0] << 24; + dst1[0] = src_r0[0] >> 8 | src_r0[1] << 24; + dst1[1] = src_r0[1] >> 8 | src_r0[2] << 24; + dst1[2] = src_r0[2] >> 8 | src_r0[3] << 24; + dst1[3] = src_r0[3] >> 8; + break; + + case 16: + dst1[0] = src_r0[0]; + dst1[1] = src_r0[1]; + dst1[2] = src_r0[2]; + dst1[3] = src_r0[3]; + break; + + case 17: + dst1[0] = src_l1[0] | src_r0[0] << 8; + dst1[1] = src_r0[0] >> 24 | src_r0[1] << 8; + dst1[2] = src_r0[1] >> 24 | src_r0[2] << 8; + dst1[3] = src_r0[2] >> 24 | src_r0[3] << 8; + dst2[0] = src_r0[3] >> 24; + break; + + case 18: + dst1[0] = src_l1[0] | src_r0[0] << 16; + dst1[1] = src_r0[0] >> 16 | src_r0[1] << 16; + dst1[2] = src_r0[1] >> 16 | src_r0[2] << 16; + dst1[3] = src_r0[2] >> 16 | src_r0[3] << 16; + dst2[0] = src_r0[3] >> 16; + break; + + case 19: + dst1[0] = src_l1[0] | src_r0[0] << 24; + dst1[1] = src_r0[0] >> 8 | src_r0[1] << 24; + dst1[2] = src_r0[1] >> 8 | src_r0[2] << 24; + dst1[3] = src_r0[2] >> 8 | src_r0[3] << 24; + dst2[0] = src_r0[3] >> 8; + break; + + case 20: + dst1[1] = src_r0[0]; + dst1[2] = src_r0[1]; + dst1[3] = src_r0[2]; + dst2[0] = src_r0[3]; + break; + + case 21: + dst1[1] = src_l1[1] | src_r0[0] << 8; + dst1[2] = src_r0[0] >> 24 | src_r0[1] << 8; + dst1[3] = src_r0[1] >> 24 | src_r0[2] << 8; + dst2[0] = src_r0[2] >> 24 | src_r0[3] << 8; + dst2[1] = src_r0[3] >> 24; + break; + + case 22: + dst1[1] = src_l1[1] | src_r0[0] << 16; + dst1[2] = src_r0[0] >> 16 | src_r0[1] << 16; + dst1[3] = src_r0[1] >> 16 | src_r0[2] << 16; + dst2[0] = src_r0[2] >> 16 | src_r0[3] << 16; + dst2[1] = src_r0[3] >> 16; + break; + + case 23: + dst1[1] = src_l1[1] | src_r0[0] << 24; + dst1[2] = src_r0[0] >> 8 | src_r0[1] << 24; + dst1[3] = src_r0[1] >> 8 | src_r0[2] << 24; + dst2[0] = src_r0[2] >> 8 | src_r0[3] << 24; + dst2[1] = src_r0[3] >> 8; + break; + + case 24: + dst1[2] = src_r0[0]; + dst1[3] = src_r0[1]; + dst2[0] = src_r0[2]; + dst2[1] = src_r0[3]; + break; + + case 25: + dst1[2] = src_l1[2] | src_r0[0] << 8; + dst1[3] = src_r0[0] >> 24 | src_r0[1] << 8; + dst2[0] = src_r0[1] >> 24 | src_r0[2] << 8; + dst2[1] = src_r0[2] >> 24 | src_r0[3] << 8; + dst2[2] = src_r0[3] >> 24; + break; + + case 26: + dst1[2] = src_l1[2] | src_r0[0] << 16; + dst1[3] = src_r0[0] >> 16 | src_r0[1] << 16; + dst2[0] = src_r0[1] >> 16 | src_r0[2] << 16; + dst2[1] = src_r0[2] >> 16 | src_r0[3] << 16; + dst2[2] = src_r0[3] >> 16; + break; + + case 27: + dst1[2] = src_l1[2] | src_r0[0] << 24; + dst1[3] = src_r0[0] >> 8 | src_r0[1] << 24; + dst2[0] = src_r0[1] >> 8 | src_r0[2] << 24; + dst2[1] = src_r0[2] >> 8 | src_r0[3] << 24; + dst2[2] = src_r0[3] >> 8; + break; + + case 28: + dst1[3] = src_r0[0]; + dst2[0] = src_r0[1]; + dst2[1] = src_r0[2]; + dst2[2] = src_r0[3]; + break; + + case 29: + dst1[3] = src_l1[3] | src_r0[0] << 8; + dst2[0] = src_r0[0] >> 24 | src_r0[1] << 8; + dst2[1] = src_r0[1] >> 24 | src_r0[2] << 8; + dst2[2] = src_r0[2] >> 24 | src_r0[3] << 8; + dst2[3] = src_r0[3] >> 24; + break; + + case 30: + dst1[3] = src_l1[3] | src_r0[0] << 16; + dst2[0] = src_r0[0] >> 16 | src_r0[1] << 16; + dst2[1] = src_r0[1] >> 16 | src_r0[2] << 16; + dst2[2] = src_r0[2] >> 16 | src_r0[3] << 16; + dst2[3] = src_r0[3] >> 16; + break; + + case 31: + dst1[3] = src_l1[3] | src_r0[0] << 24; + dst2[0] = src_r0[0] >> 8 | src_r0[1] << 24; + dst2[1] = src_r0[1] >> 8 | src_r0[2] << 24; + dst2[2] = src_r0[2] >> 8 | src_r0[3] << 24; + dst2[3] = src_r0[3] >> 8; + break; + + case 32: + dst2[0] = src_r0[0]; + dst2[1] = src_r0[1]; + dst2[2] = src_r0[2]; + dst2[3] = src_r0[3]; + break; + + case 33: + dst2[0] = src_l2[0] | src_r0[0] << 8; + dst2[1] = src_r0[0] >> 24 | src_r0[1] << 8; + dst2[2] = src_r0[1] >> 24 | src_r0[2] << 8; + dst2[3] = src_r0[2] >> 24 | src_r0[3] << 8; + break; + + case 34: + dst2[0] = src_l2[0] | src_r0[0] << 16; + dst2[1] = src_r0[0] >> 16 | src_r0[1] << 16; + dst2[2] = src_r0[1] >> 16 | src_r0[2] << 16; + dst2[3] = src_r0[2] >> 16 | src_r0[3] << 16; + break; + + case 35: + dst2[0] = src_l2[0] | src_r0[0] << 24; + dst2[1] = src_r0[0] >> 8 | src_r0[1] << 24; + dst2[2] = src_r0[1] >> 8 | src_r0[2] << 24; + dst2[3] = src_r0[2] >> 8 | src_r0[3] << 24; + break; + + case 36: + dst2[1] = src_r0[0]; + dst2[2] = src_r0[1]; + dst2[3] = src_r0[2]; + break; + + case 37: + dst2[1] = src_l2[1] | src_r0[0] << 8; + dst2[2] = src_r0[0] >> 24 | src_r0[1] << 8; + dst2[3] = src_r0[1] >> 24 | src_r0[2] << 8; + break; + + case 38: + dst2[1] = src_l2[1] | src_r0[0] << 16; + dst2[2] = src_r0[0] >> 16 | src_r0[1] << 16; + dst2[3] = src_r0[1] >> 16 | src_r0[2] << 16; + break; + + case 39: + dst2[1] = src_l2[1] | src_r0[0] << 24; + dst2[2] = src_r0[0] >> 8 | src_r0[1] << 24; + dst2[3] = src_r0[1] >> 8 | src_r0[2] << 24; + break; + + case 40: + dst2[2] = src_r0[0]; + dst2[3] = src_r0[1]; + break; + + case 41: + dst2[2] = src_l2[2] | src_r0[0] << 8; + dst2[3] = src_r0[0] >> 24 | src_r0[1] << 8; + break; + + case 42: + dst2[2] = src_l2[2] | src_r0[0] << 16; + dst2[3] = src_r0[0] >> 16 | src_r0[1] << 16; + break; + + case 43: + dst2[2] = src_l2[2] | src_r0[0] << 24; + dst2[3] = src_r0[0] >> 8 | src_r0[1] << 24; + break; + + case 44: + dst2[3] = src_r0[0]; + break; + + case 45: + dst2[3] = src_l2[3] | src_r0[0] << 8; + break; + + case 46: + dst2[3] = src_l2[3] | src_r0[0] << 16; + break; + + case 47: + dst2[3] = src_l2[3] | src_r0[0] << 24; + break; + } +} + +__device__ static void device_memcat12L (const u32 offset, u32x dst0[4], u32x dst1[4], u32x dst2[4], u32x src_l0[4], u32x src_l1[4], u32x src_l2[4], u32x src_r0[4]) +{ + switch (offset) + { + case 1: + dst0[0] = src_l0[0] | src_r0[0] << 8; + dst0[1] = src_r0[0] >> 24 | src_r0[1] << 8; + dst0[2] = src_r0[1] >> 24 | src_r0[2] << 8; + dst0[3] = src_r0[2] >> 24 | src_r0[3] << 8; + dst1[0] = src_r0[3] >> 24; + break; + + case 2: + dst0[0] = src_l0[0] | src_r0[0] << 16; + dst0[1] = src_r0[0] >> 16 | src_r0[1] << 16; + dst0[2] = src_r0[1] >> 16 | src_r0[2] << 16; + dst0[3] = src_r0[2] >> 16 | src_r0[3] << 16; + dst1[0] = src_r0[3] >> 16; + break; + + case 3: + dst0[0] = src_l0[0] | src_r0[0] << 24; + dst0[1] = src_r0[0] >> 8 | src_r0[1] << 24; + dst0[2] = src_r0[1] >> 8 | src_r0[2] << 24; + dst0[3] = src_r0[2] >> 8 | src_r0[3] << 24; + dst1[0] = src_r0[3] >> 8; + break; + + case 4: + dst0[1] = src_r0[0]; + dst0[2] = src_r0[1]; + dst0[3] = src_r0[2]; + dst1[0] = src_r0[3]; + break; + + case 5: + dst0[1] = src_l0[1] | src_r0[0] << 8; + dst0[2] = src_r0[0] >> 24 | src_r0[1] << 8; + dst0[3] = src_r0[1] >> 24 | src_r0[2] << 8; + dst1[0] = src_r0[2] >> 24 | src_r0[3] << 8; + dst1[1] = src_r0[3] >> 24; + break; + + case 6: + dst0[1] = src_l0[1] | src_r0[0] << 16; + dst0[2] = src_r0[0] >> 16 | src_r0[1] << 16; + dst0[3] = src_r0[1] >> 16 | src_r0[2] << 16; + dst1[0] = src_r0[2] >> 16 | src_r0[3] << 16; + dst1[1] = src_r0[3] >> 16; + break; + + case 7: + dst0[1] = src_l0[1] | src_r0[0] << 24; + dst0[2] = src_r0[0] >> 8 | src_r0[1] << 24; + dst0[3] = src_r0[1] >> 8 | src_r0[2] << 24; + dst1[0] = src_r0[2] >> 8 | src_r0[3] << 24; + dst1[1] = src_r0[3] >> 8; + break; + + case 8: + dst0[2] = src_r0[0]; + dst0[3] = src_r0[1]; + dst1[0] = src_r0[2]; + dst1[1] = src_r0[3]; + break; + + case 9: + dst0[2] = src_l0[2] | src_r0[0] << 8; + dst0[3] = src_r0[0] >> 24 | src_r0[1] << 8; + dst1[0] = src_r0[1] >> 24 | src_r0[2] << 8; + dst1[1] = src_r0[2] >> 24 | src_r0[3] << 8; + dst1[2] = src_r0[3] >> 24; + break; + + case 10: + dst0[2] = src_l0[2] | src_r0[0] << 16; + dst0[3] = src_r0[0] >> 16 | src_r0[1] << 16; + dst1[0] = src_r0[1] >> 16 | src_r0[2] << 16; + dst1[1] = src_r0[2] >> 16 | src_r0[3] << 16; + dst1[2] = src_r0[3] >> 16; + break; + + case 11: + dst0[2] = src_l0[2] | src_r0[0] << 24; + dst0[3] = src_r0[0] >> 8 | src_r0[1] << 24; + dst1[0] = src_r0[1] >> 8 | src_r0[2] << 24; + dst1[1] = src_r0[2] >> 8 | src_r0[3] << 24; + dst1[2] = src_r0[3] >> 8; + break; + + case 12: + dst0[3] = src_r0[0]; + dst1[0] = src_r0[1]; + dst1[1] = src_r0[2]; + dst1[2] = src_r0[3]; + break; + + case 13: + dst0[3] = src_l0[3] | src_r0[0] << 8; + dst1[0] = src_r0[0] >> 24 | src_r0[1] << 8; + dst1[1] = src_r0[1] >> 24 | src_r0[2] << 8; + dst1[2] = src_r0[2] >> 24 | src_r0[3] << 8; + dst1[3] = src_r0[3] >> 24; + break; + + case 14: + dst0[3] = src_l0[3] | src_r0[0] << 16; + dst1[0] = src_r0[0] >> 16 | src_r0[1] << 16; + dst1[1] = src_r0[1] >> 16 | src_r0[2] << 16; + dst1[2] = src_r0[2] >> 16 | src_r0[3] << 16; + dst1[3] = src_r0[3] >> 16; + break; + + case 15: + dst0[3] = src_l0[3] | src_r0[0] << 24; + dst1[0] = src_r0[0] >> 8 | src_r0[1] << 24; + dst1[1] = src_r0[1] >> 8 | src_r0[2] << 24; + dst1[2] = src_r0[2] >> 8 | src_r0[3] << 24; + dst1[3] = src_r0[3] >> 8; + break; + + case 16: + dst1[0] = src_r0[0]; + dst1[1] = src_r0[1]; + dst1[2] = src_r0[2]; + dst1[3] = src_r0[3]; + break; + + case 17: + dst1[0] = src_l1[0] | src_r0[0] << 8; + dst1[1] = src_r0[0] >> 24 | src_r0[1] << 8; + dst1[2] = src_r0[1] >> 24 | src_r0[2] << 8; + dst1[3] = src_r0[2] >> 24 | src_r0[3] << 8; + dst2[0] = src_r0[3] >> 24; + break; + + case 18: + dst1[0] = src_l1[0] | src_r0[0] << 16; + dst1[1] = src_r0[0] >> 16 | src_r0[1] << 16; + dst1[2] = src_r0[1] >> 16 | src_r0[2] << 16; + dst1[3] = src_r0[2] >> 16 | src_r0[3] << 16; + dst2[0] = src_r0[3] >> 16; + break; + + case 19: + dst1[0] = src_l1[0] | src_r0[0] << 24; + dst1[1] = src_r0[0] >> 8 | src_r0[1] << 24; + dst1[2] = src_r0[1] >> 8 | src_r0[2] << 24; + dst1[3] = src_r0[2] >> 8 | src_r0[3] << 24; + dst2[0] = src_r0[3] >> 8; + break; + + case 20: + dst1[1] = src_r0[0]; + dst1[2] = src_r0[1]; + dst1[3] = src_r0[2]; + dst2[0] = src_r0[3]; + break; + + case 21: + dst1[1] = src_l1[1] | src_r0[0] << 8; + dst1[2] = src_r0[0] >> 24 | src_r0[1] << 8; + dst1[3] = src_r0[1] >> 24 | src_r0[2] << 8; + dst2[0] = src_r0[2] >> 24 | src_r0[3] << 8; + dst2[1] = src_r0[3] >> 24; + break; + + case 22: + dst1[1] = src_l1[1] | src_r0[0] << 16; + dst1[2] = src_r0[0] >> 16 | src_r0[1] << 16; + dst1[3] = src_r0[1] >> 16 | src_r0[2] << 16; + dst2[0] = src_r0[2] >> 16 | src_r0[3] << 16; + dst2[1] = src_r0[3] >> 16; + break; + + case 23: + dst1[1] = src_l1[1] | src_r0[0] << 24; + dst1[2] = src_r0[0] >> 8 | src_r0[1] << 24; + dst1[3] = src_r0[1] >> 8 | src_r0[2] << 24; + dst2[0] = src_r0[2] >> 8 | src_r0[3] << 24; + dst2[1] = src_r0[3] >> 8; + break; + + case 24: + dst1[2] = src_r0[0]; + dst1[3] = src_r0[1]; + dst2[0] = src_r0[2]; + dst2[1] = src_r0[3]; + break; + + case 25: + dst1[2] = src_l1[2] | src_r0[0] << 8; + dst1[3] = src_r0[0] >> 24 | src_r0[1] << 8; + dst2[0] = src_r0[1] >> 24 | src_r0[2] << 8; + dst2[1] = src_r0[2] >> 24 | src_r0[3] << 8; + dst2[2] = src_r0[3] >> 24; + break; + + case 26: + dst1[2] = src_l1[2] | src_r0[0] << 16; + dst1[3] = src_r0[0] >> 16 | src_r0[1] << 16; + dst2[0] = src_r0[1] >> 16 | src_r0[2] << 16; + dst2[1] = src_r0[2] >> 16 | src_r0[3] << 16; + dst2[2] = src_r0[3] >> 16; + break; + + case 27: + dst1[2] = src_l1[2] | src_r0[0] << 24; + dst1[3] = src_r0[0] >> 8 | src_r0[1] << 24; + dst2[0] = src_r0[1] >> 8 | src_r0[2] << 24; + dst2[1] = src_r0[2] >> 8 | src_r0[3] << 24; + dst2[2] = src_r0[3] >> 8; + break; + + case 28: + dst1[3] = src_r0[0]; + dst2[0] = src_r0[1]; + dst2[1] = src_r0[2]; + dst2[2] = src_r0[3]; + break; + + case 29: + dst1[3] = src_l1[3] | src_r0[0] << 8; + dst2[0] = src_r0[0] >> 24 | src_r0[1] << 8; + dst2[1] = src_r0[1] >> 24 | src_r0[2] << 8; + dst2[2] = src_r0[2] >> 24 | src_r0[3] << 8; + dst2[3] = src_r0[3] >> 24; + break; + + case 30: + dst1[3] = src_l1[3] | src_r0[0] << 16; + dst2[0] = src_r0[0] >> 16 | src_r0[1] << 16; + dst2[1] = src_r0[1] >> 16 | src_r0[2] << 16; + dst2[2] = src_r0[2] >> 16 | src_r0[3] << 16; + dst2[3] = src_r0[3] >> 16; + break; + + case 31: + dst1[3] = src_l1[3] | src_r0[0] << 24; + dst2[0] = src_r0[0] >> 8 | src_r0[1] << 24; + dst2[1] = src_r0[1] >> 8 | src_r0[2] << 24; + dst2[2] = src_r0[2] >> 8 | src_r0[3] << 24; + dst2[3] = src_r0[3] >> 8; + break; + + case 32: + dst2[0] = src_r0[0]; + dst2[1] = src_r0[1]; + dst2[2] = src_r0[2]; + dst2[3] = src_r0[3]; + break; + + case 33: + dst2[0] = src_l2[0] | src_r0[0] << 8; + dst2[1] = src_r0[0] >> 24 | src_r0[1] << 8; + dst2[2] = src_r0[1] >> 24 | src_r0[2] << 8; + dst2[3] = src_r0[2] >> 24 | src_r0[3] << 8; + break; + + case 34: + dst2[0] = src_l2[0] | src_r0[0] << 16; + dst2[1] = src_r0[0] >> 16 | src_r0[1] << 16; + dst2[2] = src_r0[1] >> 16 | src_r0[2] << 16; + dst2[3] = src_r0[2] >> 16 | src_r0[3] << 16; + break; + + case 35: + dst2[0] = src_l2[0] | src_r0[0] << 24; + dst2[1] = src_r0[0] >> 8 | src_r0[1] << 24; + dst2[2] = src_r0[1] >> 8 | src_r0[2] << 24; + dst2[3] = src_r0[2] >> 8 | src_r0[3] << 24; + break; + + case 36: + dst2[1] = src_r0[0]; + dst2[2] = src_r0[1]; + dst2[3] = src_r0[2]; + break; + + case 37: + dst2[1] = src_l2[1] | src_r0[0] << 8; + dst2[2] = src_r0[0] >> 24 | src_r0[1] << 8; + dst2[3] = src_r0[1] >> 24 | src_r0[2] << 8; + break; + + case 38: + dst2[1] = src_l2[1] | src_r0[0] << 16; + dst2[2] = src_r0[0] >> 16 | src_r0[1] << 16; + dst2[3] = src_r0[1] >> 16 | src_r0[2] << 16; + break; + + case 39: + dst2[1] = src_l2[1] | src_r0[0] << 24; + dst2[2] = src_r0[0] >> 8 | src_r0[1] << 24; + dst2[3] = src_r0[1] >> 8 | src_r0[2] << 24; + break; + + case 40: + dst2[2] = src_r0[0]; + dst2[3] = src_r0[1]; + break; + + case 41: + dst2[2] = src_l2[2] | src_r0[0] << 8; + dst2[3] = src_r0[0] >> 24 | src_r0[1] << 8; + break; + + case 42: + dst2[2] = src_l2[2] | src_r0[0] << 16; + dst2[3] = src_r0[0] >> 16 | src_r0[1] << 16; + break; + + case 43: + dst2[2] = src_l2[2] | src_r0[0] << 24; + dst2[3] = src_r0[0] >> 8 | src_r0[1] << 24; + break; + + case 44: + dst2[3] = src_r0[0]; + break; + + case 45: + dst2[3] = src_l2[3] | src_r0[0] << 8; + break; + + case 46: + dst2[3] = src_l2[3] | src_r0[0] << 16; + break; + + case 47: + dst2[3] = src_l2[3] | src_r0[0] << 24; + break; + } +} + +__device__ static void device_memcat12L (const u32 offset, u32x dst0[4], u32x dst1[4], u32x dst2[4], u32x src_l0[4], u32x src_l1[4], u32x src_l2[4], u32x src_r0[4], u32x src_r1[4]) +{ + switch (offset) + { + case 0: + dst0[0] = src_r0[0]; + dst0[1] = src_r0[1]; + dst0[2] = src_r0[2]; + dst0[3] = src_r0[3]; + dst1[0] = src_r1[0]; + dst1[1] = src_r1[1]; + dst1[2] = src_r1[2]; + dst1[3] = src_r1[3]; + break; + + case 1: + dst0[0] = src_l0[0] | src_r0[0] << 8; + dst0[1] = src_r0[0] >> 24 | src_r0[1] << 8; + dst0[2] = src_r0[1] >> 24 | src_r0[2] << 8; + dst0[3] = src_r0[2] >> 24 | src_r0[3] << 8; + dst1[0] = src_r0[3] >> 24 | src_r1[0] << 8; + dst1[1] = src_r1[0] >> 24 | src_r1[1] << 8; + dst1[2] = src_r1[1] >> 24 | src_r1[2] << 8; + dst1[3] = src_r1[2] >> 24 | src_r1[3] << 8; + dst2[0] = src_r1[3] >> 24; + break; + + case 2: + dst0[0] = src_l0[0] | src_r0[0] << 16; + dst0[1] = src_r0[0] >> 16 | src_r0[1] << 16; + dst0[2] = src_r0[1] >> 16 | src_r0[2] << 16; + dst0[3] = src_r0[2] >> 16 | src_r0[3] << 16; + dst1[0] = src_r0[3] >> 16 | src_r1[0] << 16; + dst1[1] = src_r1[0] >> 16 | src_r1[1] << 16; + dst1[2] = src_r1[1] >> 16 | src_r1[2] << 16; + dst1[3] = src_r1[2] >> 16 | src_r1[3] << 16; + dst2[0] = src_r1[3] >> 16; + break; + + case 3: + dst0[0] = src_l0[0] | src_r0[0] << 24; + dst0[1] = src_r0[0] >> 8 | src_r0[1] << 24; + dst0[2] = src_r0[1] >> 8 | src_r0[2] << 24; + dst0[3] = src_r0[2] >> 8 | src_r0[3] << 24; + dst1[0] = src_r0[3] >> 8 | src_r1[0] << 24; + dst1[1] = src_r1[0] >> 8 | src_r1[1] << 24; + dst1[2] = src_r1[1] >> 8 | src_r1[2] << 24; + dst1[3] = src_r1[2] >> 8 | src_r1[3] << 24; + dst2[0] = src_r1[3] >> 8; + break; + + case 4: + dst0[1] = src_r0[0]; + dst0[2] = src_r0[1]; + dst0[3] = src_r0[2]; + dst1[0] = src_r0[3]; + dst1[1] = src_r1[0]; + dst1[2] = src_r1[1]; + dst1[3] = src_r1[2]; + dst2[0] = src_r1[3]; + break; + + case 5: + dst0[1] = src_l0[1] | src_r0[0] << 8; + dst0[2] = src_r0[0] >> 24 | src_r0[1] << 8; + dst0[3] = src_r0[1] >> 24 | src_r0[2] << 8; + dst1[0] = src_r0[2] >> 24 | src_r0[3] << 8; + dst1[1] = src_r0[3] >> 24 | src_r1[0] << 8; + dst1[2] = src_r1[0] >> 24 | src_r1[1] << 8; + dst1[3] = src_r1[1] >> 24 | src_r1[2] << 8; + dst2[0] = src_r1[2] >> 24 | src_r1[3] << 8; + dst2[1] = src_r1[3] >> 24; + break; + + case 6: + dst0[1] = src_l0[1] | src_r0[0] << 16; + dst0[2] = src_r0[0] >> 16 | src_r0[1] << 16; + dst0[3] = src_r0[1] >> 16 | src_r0[2] << 16; + dst1[0] = src_r0[2] >> 16 | src_r0[3] << 16; + dst1[1] = src_r0[3] >> 16 | src_r1[0] << 16; + dst1[2] = src_r1[0] >> 16 | src_r1[1] << 16; + dst1[3] = src_r1[1] >> 16 | src_r1[2] << 16; + dst2[0] = src_r1[2] >> 16 | src_r1[3] << 16; + dst2[1] = src_r1[3] >> 16; + break; + + case 7: + dst0[1] = src_l0[1] | src_r0[0] << 24; + dst0[2] = src_r0[0] >> 8 | src_r0[1] << 24; + dst0[3] = src_r0[1] >> 8 | src_r0[2] << 24; + dst1[0] = src_r0[2] >> 8 | src_r0[3] << 24; + dst1[1] = src_r0[3] >> 8 | src_r1[0] << 24; + dst1[2] = src_r1[0] >> 8 | src_r1[1] << 24; + dst1[3] = src_r1[1] >> 8 | src_r1[2] << 24; + dst2[0] = src_r1[2] >> 8 | src_r1[3] << 24; + dst2[1] = src_r1[3] >> 8; + break; + + case 8: + dst0[2] = src_r0[0]; + dst0[3] = src_r0[1]; + dst1[0] = src_r0[2]; + dst1[1] = src_r0[3]; + dst1[2] = src_r1[0]; + dst1[3] = src_r1[1]; + dst2[0] = src_r1[2]; + dst2[1] = src_r1[3]; + break; + + case 9: + dst0[2] = src_l0[2] | src_r0[0] << 8; + dst0[3] = src_r0[0] >> 24 | src_r0[1] << 8; + dst1[0] = src_r0[1] >> 24 | src_r0[2] << 8; + dst1[1] = src_r0[2] >> 24 | src_r0[3] << 8; + dst1[2] = src_r0[3] >> 24 | src_r1[0] << 8; + dst1[3] = src_r1[0] >> 24 | src_r1[1] << 8; + dst2[0] = src_r1[1] >> 24 | src_r1[2] << 8; + dst2[1] = src_r1[2] >> 24 | src_r1[3] << 8; + dst2[2] = src_r1[3] >> 24; + break; + + case 10: + dst0[2] = src_l0[2] | src_r0[0] << 16; + dst0[3] = src_r0[0] >> 16 | src_r0[1] << 16; + dst1[0] = src_r0[1] >> 16 | src_r0[2] << 16; + dst1[1] = src_r0[2] >> 16 | src_r0[3] << 16; + dst1[2] = src_r0[3] >> 16 | src_r1[0] << 16; + dst1[3] = src_r1[0] >> 16 | src_r1[1] << 16; + dst2[0] = src_r1[1] >> 16 | src_r1[2] << 16; + dst2[1] = src_r1[2] >> 16 | src_r1[3] << 16; + dst2[2] = src_r1[3] >> 16; + break; + + case 11: + dst0[2] = src_l0[2] | src_r0[0] << 24; + dst0[3] = src_r0[0] >> 8 | src_r0[1] << 24; + dst1[0] = src_r0[1] >> 8 | src_r0[2] << 24; + dst1[1] = src_r0[2] >> 8 | src_r0[3] << 24; + dst1[2] = src_r0[3] >> 8 | src_r1[0] << 24; + dst1[3] = src_r1[0] >> 8 | src_r1[1] << 24; + dst2[0] = src_r1[1] >> 8 | src_r1[2] << 24; + dst2[1] = src_r1[2] >> 8 | src_r1[3] << 24; + dst2[2] = src_r1[3] >> 8; + break; + + case 12: + dst0[3] = src_r0[0]; + dst1[0] = src_r0[1]; + dst1[1] = src_r0[2]; + dst1[2] = src_r0[3]; + dst1[3] = src_r1[0]; + dst2[0] = src_r1[1]; + dst2[1] = src_r1[2]; + dst2[2] = src_r1[3]; + break; + + case 13: + dst0[3] = src_l0[3] | src_r0[0] << 8; + dst1[0] = src_r0[0] >> 24 | src_r0[1] << 8; + dst1[1] = src_r0[1] >> 24 | src_r0[2] << 8; + dst1[2] = src_r0[2] >> 24 | src_r0[3] << 8; + dst1[3] = src_r0[3] >> 24 | src_r1[0] << 8; + dst2[0] = src_r1[0] >> 24 | src_r1[1] << 8; + dst2[1] = src_r1[1] >> 24 | src_r1[2] << 8; + dst2[2] = src_r1[2] >> 24 | src_r1[3] << 8; + dst2[3] = src_r1[3] >> 24; + break; + + case 14: + dst0[3] = src_l0[3] | src_r0[0] << 16; + dst1[0] = src_r0[0] >> 16 | src_r0[1] << 16; + dst1[1] = src_r0[1] >> 16 | src_r0[2] << 16; + dst1[2] = src_r0[2] >> 16 | src_r0[3] << 16; + dst1[3] = src_r0[3] >> 16 | src_r1[0] << 16; + dst2[0] = src_r1[0] >> 16 | src_r1[1] << 16; + dst2[1] = src_r1[1] >> 16 | src_r1[2] << 16; + dst2[2] = src_r1[2] >> 16 | src_r1[3] << 16; + dst2[3] = src_r1[3] >> 16; + break; + + case 15: + dst0[3] = src_l0[3] | src_r0[0] << 24; + dst1[0] = src_r0[0] >> 8 | src_r0[1] << 24; + dst1[1] = src_r0[1] >> 8 | src_r0[2] << 24; + dst1[2] = src_r0[2] >> 8 | src_r0[3] << 24; + dst1[3] = src_r0[3] >> 8 | src_r1[0] << 24; + dst2[0] = src_r1[0] >> 8 | src_r1[1] << 24; + dst2[1] = src_r1[1] >> 8 | src_r1[2] << 24; + dst2[2] = src_r1[2] >> 8 | src_r1[3] << 24; + dst2[3] = src_r1[3] >> 8; + break; + + case 16: + dst1[0] = src_r0[0]; + dst1[1] = src_r0[1]; + dst1[2] = src_r0[2]; + dst1[3] = src_r0[3]; + dst2[0] = src_r1[0]; + dst2[1] = src_r1[1]; + dst2[2] = src_r1[2]; + dst2[3] = src_r1[3]; + break; + + case 17: + dst1[0] = src_l1[0] | src_r0[0] << 8; + dst1[1] = src_r0[0] >> 24 | src_r0[1] << 8; + dst1[2] = src_r0[1] >> 24 | src_r0[2] << 8; + dst1[3] = src_r0[2] >> 24 | src_r0[3] << 8; + dst2[0] = src_r0[3] >> 24 | src_r1[0] << 8; + dst2[1] = src_r1[0] >> 24 | src_r1[1] << 8; + dst2[2] = src_r1[1] >> 24 | src_r1[2] << 8; + dst2[3] = src_r1[2] >> 24 | src_r1[3] << 8; + break; + + case 18: + dst1[0] = src_l1[0] | src_r0[0] << 16; + dst1[1] = src_r0[0] >> 16 | src_r0[1] << 16; + dst1[2] = src_r0[1] >> 16 | src_r0[2] << 16; + dst1[3] = src_r0[2] >> 16 | src_r0[3] << 16; + dst2[0] = src_r0[3] >> 16 | src_r1[0] << 16; + dst2[1] = src_r1[0] >> 16 | src_r1[1] << 16; + dst2[2] = src_r1[1] >> 16 | src_r1[2] << 16; + dst2[3] = src_r1[2] >> 16 | src_r1[3] << 16; + break; + + case 19: + dst1[0] = src_l1[0] | src_r0[0] << 24; + dst1[1] = src_r0[0] >> 8 | src_r0[1] << 24; + dst1[2] = src_r0[1] >> 8 | src_r0[2] << 24; + dst1[3] = src_r0[2] >> 8 | src_r0[3] << 24; + dst2[0] = src_r0[3] >> 8 | src_r1[0] << 24; + dst2[1] = src_r1[0] >> 8 | src_r1[1] << 24; + dst2[2] = src_r1[1] >> 8 | src_r1[2] << 24; + dst2[3] = src_r1[2] >> 8 | src_r1[3] << 24; + break; + + case 20: + dst1[1] = src_r1[0]; + dst1[2] = src_r0[1]; + dst1[3] = src_r0[2]; + dst2[0] = src_r0[3]; + dst2[1] = src_r1[0]; + dst2[2] = src_r1[1]; + dst2[3] = src_r1[2]; + break; + + case 21: + dst1[1] = src_l1[1] | src_r0[0] << 8; + dst1[2] = src_r0[0] >> 24 | src_r0[1] << 8; + dst1[3] = src_r0[1] >> 24 | src_r0[2] << 8; + dst2[0] = src_r0[2] >> 24 | src_r0[3] << 8; + dst2[1] = src_r0[3] >> 24 | src_r1[0] << 8; + dst2[2] = src_r1[0] >> 24 | src_r1[1] << 8; + dst2[3] = src_r1[1] >> 24 | src_r1[2] << 8; + break; + + case 22: + dst1[1] = src_l1[1] | src_r0[0] << 16; + dst1[2] = src_r0[0] >> 16 | src_r0[1] << 16; + dst1[3] = src_r0[1] >> 16 | src_r0[2] << 16; + dst2[0] = src_r0[2] >> 16 | src_r0[3] << 16; + dst2[1] = src_r0[3] >> 16 | src_r1[0] << 16; + dst2[2] = src_r1[0] >> 16 | src_r1[1] << 16; + dst2[3] = src_r1[1] >> 16 | src_r1[2] << 16; + break; + + case 23: + dst1[1] = src_l1[1] | src_r0[0] << 24; + dst1[2] = src_r0[0] >> 8 | src_r0[1] << 24; + dst1[3] = src_r0[1] >> 8 | src_r0[2] << 24; + dst2[0] = src_r0[2] >> 8 | src_r0[3] << 24; + dst2[1] = src_r0[3] >> 8 | src_r1[0] << 24; + dst2[2] = src_r1[0] >> 8 | src_r1[1] << 24; + dst2[3] = src_r1[1] >> 8 | src_r1[2] << 24; + break; + + case 24: + dst1[2] = src_r1[0]; + dst1[3] = src_r0[1]; + dst2[0] = src_r0[2]; + dst2[1] = src_r0[3]; + dst2[2] = src_r1[0]; + dst2[3] = src_r1[1]; + break; + + case 25: + dst1[2] = src_l1[2] | src_r0[0] << 8; + dst1[3] = src_r0[0] >> 24 | src_r0[1] << 8; + dst2[0] = src_r0[1] >> 24 | src_r0[2] << 8; + dst2[1] = src_r0[2] >> 24 | src_r0[3] << 8; + dst2[2] = src_r0[3] >> 24 | src_r1[0] << 8; + dst2[3] = src_r1[0] >> 24 | src_r1[1] << 8; + break; + + case 26: + dst1[2] = src_l1[2] | src_r0[0] << 16; + dst1[3] = src_r0[0] >> 16 | src_r0[1] << 16; + dst2[0] = src_r0[1] >> 16 | src_r0[2] << 16; + dst2[1] = src_r0[2] >> 16 | src_r0[3] << 16; + dst2[2] = src_r0[3] >> 16 | src_r1[0] << 16; + dst2[3] = src_r1[0] >> 16 | src_r1[1] << 16; + break; + + case 27: + dst1[2] = src_l1[2] | src_r0[0] << 24; + dst1[3] = src_r0[0] >> 8 | src_r0[1] << 24; + dst2[0] = src_r0[1] >> 8 | src_r0[2] << 24; + dst2[1] = src_r0[2] >> 8 | src_r0[3] << 24; + dst2[2] = src_r0[3] >> 8 | src_r1[0] << 24; + dst2[3] = src_r1[0] >> 8 | src_r1[1] << 24; + break; + + case 28: + dst1[3] = src_r1[0]; + dst2[0] = src_r0[1]; + dst2[1] = src_r0[2]; + dst2[2] = src_r0[3]; + dst2[3] = src_r1[0]; + break; + + case 29: + dst1[3] = src_l1[3] | src_r0[0] << 8; + dst2[0] = src_r0[0] >> 24 | src_r0[1] << 8; + dst2[1] = src_r0[1] >> 24 | src_r0[2] << 8; + dst2[2] = src_r0[2] >> 24 | src_r0[3] << 8; + dst2[3] = src_r0[3] >> 24 | src_r1[0] << 8; + break; + + case 30: + dst1[3] = src_l1[3] | src_r0[0] << 16; + dst2[0] = src_r0[0] >> 16 | src_r0[1] << 16; + dst2[1] = src_r0[1] >> 16 | src_r0[2] << 16; + dst2[2] = src_r0[2] >> 16 | src_r0[3] << 16; + dst2[3] = src_r0[3] >> 16 | src_r1[0] << 16; + break; + + case 31: + dst1[3] = src_l1[3] | src_r0[0] << 24; + dst2[0] = src_r0[0] >> 8 | src_r0[1] << 24; + dst2[1] = src_r0[1] >> 8 | src_r0[2] << 24; + dst2[2] = src_r0[2] >> 8 | src_r0[3] << 24; + dst2[3] = src_r0[3] >> 8 | src_r1[0] << 24; + break; + + case 32: + dst2[0] = src_r0[0]; + dst2[1] = src_r0[1]; + dst2[2] = src_r0[2]; + dst2[3] = src_r0[3]; + break; + + case 33: + dst2[0] = src_l2[0] | src_r0[0] << 8; + dst2[1] = src_r0[0] >> 24 | src_r0[1] << 8; + dst2[2] = src_r0[1] >> 24 | src_r0[2] << 8; + dst2[3] = src_r0[2] >> 24 | src_r0[3] << 8; + break; + + case 34: + dst2[0] = src_l2[0] | src_r0[0] << 16; + dst2[1] = src_r0[0] >> 16 | src_r0[1] << 16; + dst2[2] = src_r0[1] >> 16 | src_r0[2] << 16; + dst2[3] = src_r0[2] >> 16 | src_r0[3] << 16; + break; + + case 35: + dst2[0] = src_l2[0] | src_r0[0] << 24; + dst2[1] = src_r0[0] >> 8 | src_r0[1] << 24; + dst2[2] = src_r0[1] >> 8 | src_r0[2] << 24; + dst2[3] = src_r0[2] >> 8 | src_r0[3] << 24; + break; + + case 36: + dst2[1] = src_r0[0]; + dst2[2] = src_r0[1]; + dst2[3] = src_r0[2]; + break; + + case 37: + dst2[1] = src_l2[1] | src_r0[0] << 8; + dst2[2] = src_r0[0] >> 24 | src_r0[1] << 8; + dst2[3] = src_r0[1] >> 24 | src_r0[2] << 8; + break; + + case 38: + dst2[1] = src_l2[1] | src_r0[0] << 16; + dst2[2] = src_r0[0] >> 16 | src_r0[1] << 16; + dst2[3] = src_r0[1] >> 16 | src_r0[2] << 16; + break; + + case 39: + dst2[1] = src_l2[1] | src_r0[0] << 24; + dst2[2] = src_r0[0] >> 8 | src_r0[1] << 24; + dst2[3] = src_r0[1] >> 8 | src_r0[2] << 24; + break; + + case 40: + dst2[2] = src_r0[0]; + dst2[3] = src_r0[1]; + break; + + case 41: + dst2[2] = src_l2[2] | src_r0[0] << 8; + dst2[3] = src_r0[0] >> 24 | src_r0[1] << 8; + break; + + case 42: + dst2[2] = src_l2[2] | src_r0[0] << 16; + dst2[3] = src_r0[0] >> 16 | src_r0[1] << 16; + break; + + case 43: + dst2[2] = src_l2[2] | src_r0[0] << 24; + dst2[3] = src_r0[0] >> 8 | src_r0[1] << 24; + break; + + case 44: + dst2[3] = src_r0[0]; + break; + + case 45: + dst2[3] = src_l2[3] | src_r0[0] << 8; + break; + + case 46: + dst2[3] = src_l2[3] | src_r0[0] << 16; + break; + + case 47: + dst2[3] = src_l2[3] | src_r0[0] << 24; + break; + } +} + +__device__ static void memcat16_9 (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], const u32 append0[4], const u32 append1[4], const u32 append2[4], const u32 offset) +{ + switch (offset) + { + case 0: + w0[0] = append0[0]; + w0[1] = append0[1]; + w0[2] = append0[2]; + w0[3] = append0[3]; + w1[0] = append1[0]; + w1[1] = append1[1]; + w1[2] = append1[2]; + w1[3] = append1[3]; + w2[0] = append2[0]; + break; + + case 1: + w0[0] = w0[0] | append0[0] << 8; + w0[1] = append0[0] >> 24 | append0[1] << 8; + w0[2] = append0[1] >> 24 | append0[2] << 8; + w0[3] = append0[2] >> 24 | append0[3] << 8; + w1[0] = append0[3] >> 24 | append1[0] << 8; + w1[1] = append1[0] >> 24 | append1[1] << 8; + w1[2] = append1[1] >> 24 | append1[2] << 8; + w1[3] = append1[2] >> 24 | append1[3] << 8; + w2[0] = append1[3] >> 24 | append2[0] << 8; + w2[1] = append2[0] >> 24; + break; + + case 2: + w0[0] = w0[0] | append0[0] << 16; + w0[1] = append0[0] >> 16 | append0[1] << 16; + w0[2] = append0[1] >> 16 | append0[2] << 16; + w0[3] = append0[2] >> 16 | append0[3] << 16; + w1[0] = append0[3] >> 16 | append1[0] << 16; + w1[1] = append1[0] >> 16 | append1[1] << 16; + w1[2] = append1[1] >> 16 | append1[2] << 16; + w1[3] = append1[2] >> 16 | append1[3] << 16; + w2[0] = append1[3] >> 16 | append2[0] << 16; + w2[1] = append2[0] >> 16; + break; + + case 3: + w0[0] = w0[0] | append0[0] << 24; + w0[1] = append0[0] >> 8 | append0[1] << 24; + w0[2] = append0[1] >> 8 | append0[2] << 24; + w0[3] = append0[2] >> 8 | append0[3] << 24; + w1[0] = append0[3] >> 8 | append1[0] << 24; + w1[1] = append1[0] >> 8 | append1[1] << 24; + w1[2] = append1[1] >> 8 | append1[2] << 24; + w1[3] = append1[2] >> 8 | append1[3] << 24; + w2[0] = append1[3] >> 8 | append2[0] << 24; + w2[1] = append2[0] >> 8; + break; + + case 4: + w0[1] = append0[0]; + w0[2] = append0[1]; + w0[3] = append0[2]; + w1[0] = append0[3]; + w1[1] = append1[0]; + w1[2] = append1[1]; + w1[3] = append1[2]; + w2[0] = append1[3]; + w2[1] = append2[0]; + break; + + case 5: + w0[1] = w0[1] | append0[0] << 8; + w0[2] = append0[0] >> 24 | append0[1] << 8; + w0[3] = append0[1] >> 24 | append0[2] << 8; + w1[0] = append0[2] >> 24 | append0[3] << 8; + w1[1] = append0[3] >> 24 | append1[0] << 8; + w1[2] = append1[0] >> 24 | append1[1] << 8; + w1[3] = append1[1] >> 24 | append1[2] << 8; + w2[0] = append1[2] >> 24 | append1[3] << 8; + w2[1] = append1[3] >> 24 | append2[0] << 8; + w2[2] = append2[0] >> 24; + break; + + case 6: + w0[1] = w0[1] | append0[0] << 16; + w0[2] = append0[0] >> 16 | append0[1] << 16; + w0[3] = append0[1] >> 16 | append0[2] << 16; + w1[0] = append0[2] >> 16 | append0[3] << 16; + w1[1] = append0[3] >> 16 | append1[0] << 16; + w1[2] = append1[0] >> 16 | append1[1] << 16; + w1[3] = append1[1] >> 16 | append1[2] << 16; + w2[0] = append1[2] >> 16 | append1[3] << 16; + w2[1] = append1[3] >> 16 | append2[0] << 16; + w2[2] = append2[0] >> 16; + break; + + case 7: + w0[1] = w0[1] | append0[0] << 24; + w0[2] = append0[0] >> 8 | append0[1] << 24; + w0[3] = append0[1] >> 8 | append0[2] << 24; + w1[0] = append0[2] >> 8 | append0[3] << 24; + w1[1] = append0[3] >> 8 | append1[0] << 24; + w1[2] = append1[0] >> 8 | append1[1] << 24; + w1[3] = append1[1] >> 8 | append1[2] << 24; + w2[0] = append1[2] >> 8 | append1[3] << 24; + w2[1] = append1[3] >> 8 | append2[0] << 24; + w2[2] = append2[0] >> 8; + break; + + case 8: + w0[2] = append0[0]; + w0[3] = append0[1]; + w1[0] = append0[2]; + w1[1] = append0[3]; + w1[2] = append1[0]; + w1[3] = append1[1]; + w2[0] = append1[2]; + w2[1] = append1[3]; + w2[2] = append2[0]; + break; + + case 9: + w0[2] = w0[2] | append0[0] << 8; + w0[3] = append0[0] >> 24 | append0[1] << 8; + w1[0] = append0[1] >> 24 | append0[2] << 8; + w1[1] = append0[2] >> 24 | append0[3] << 8; + w1[2] = append0[3] >> 24 | append1[0] << 8; + w1[3] = append1[0] >> 24 | append1[1] << 8; + w2[0] = append1[1] >> 24 | append1[2] << 8; + w2[1] = append1[2] >> 24 | append1[3] << 8; + w2[2] = append1[3] >> 24 | append2[0] << 8; + w2[3] = append2[0] >> 24; + break; + + case 10: + w0[2] = w0[2] | append0[0] << 16; + w0[3] = append0[0] >> 16 | append0[1] << 16; + w1[0] = append0[1] >> 16 | append0[2] << 16; + w1[1] = append0[2] >> 16 | append0[3] << 16; + w1[2] = append0[3] >> 16 | append1[0] << 16; + w1[3] = append1[0] >> 16 | append1[1] << 16; + w2[0] = append1[1] >> 16 | append1[2] << 16; + w2[1] = append1[2] >> 16 | append1[3] << 16; + w2[2] = append1[3] >> 16 | append2[0] << 16; + w2[3] = append2[0] >> 16; + break; + + case 11: + w0[2] = w0[2] | append0[0] << 24; + w0[3] = append0[0] >> 8 | append0[1] << 24; + w1[0] = append0[1] >> 8 | append0[2] << 24; + w1[1] = append0[2] >> 8 | append0[3] << 24; + w1[2] = append0[3] >> 8 | append1[0] << 24; + w1[3] = append1[0] >> 8 | append1[1] << 24; + w2[0] = append1[1] >> 8 | append1[2] << 24; + w2[1] = append1[2] >> 8 | append1[3] << 24; + w2[2] = append1[3] >> 8 | append2[0] << 24; + w2[3] = append2[0] >> 8; + break; + + case 12: + w0[3] = append0[0]; + w1[0] = append0[1]; + w1[1] = append0[2]; + w1[2] = append0[3]; + w1[3] = append1[0]; + w2[0] = append1[1]; + w2[1] = append1[2]; + w2[2] = append1[3]; + w2[3] = append2[0]; + break; + + case 13: + w0[3] = w0[3] | append0[0] << 8; + w1[0] = append0[0] >> 24 | append0[1] << 8; + w1[1] = append0[1] >> 24 | append0[2] << 8; + w1[2] = append0[2] >> 24 | append0[3] << 8; + w1[3] = append0[3] >> 24 | append1[0] << 8; + w2[0] = append1[0] >> 24 | append1[1] << 8; + w2[1] = append1[1] >> 24 | append1[2] << 8; + w2[2] = append1[2] >> 24 | append1[3] << 8; + w2[3] = append1[3] >> 24 | append2[0] << 8; + w3[0] = append2[0] >> 24; + break; + + case 14: + w0[3] = w0[3] | append0[0] << 16; + w1[0] = append0[0] >> 16 | append0[1] << 16; + w1[1] = append0[1] >> 16 | append0[2] << 16; + w1[2] = append0[2] >> 16 | append0[3] << 16; + w1[3] = append0[3] >> 16 | append1[0] << 16; + w2[0] = append1[0] >> 16 | append1[1] << 16; + w2[1] = append1[1] >> 16 | append1[2] << 16; + w2[2] = append1[2] >> 16 | append1[3] << 16; + w2[3] = append1[3] >> 16 | append2[0] << 16; + w3[0] = append2[0] >> 16; + break; + + case 15: + w0[3] = w0[3] | append0[0] << 24; + w1[0] = append0[0] >> 8 | append0[1] << 24; + w1[1] = append0[1] >> 8 | append0[2] << 24; + w1[2] = append0[2] >> 8 | append0[3] << 24; + w1[3] = append0[3] >> 8 | append1[0] << 24; + w2[0] = append1[0] >> 8 | append1[1] << 24; + w2[1] = append1[1] >> 8 | append1[2] << 24; + w2[2] = append1[2] >> 8 | append1[3] << 24; + w2[3] = append1[3] >> 8 | append2[0] << 24; + w3[0] = append2[0] >> 8; + break; + } +} + +__device__ static void memcat16_9 (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], const u32x append0[4], const u32x append1[4], const u32x append2[4], const u32 offset) +{ + switch (offset) + { + case 0: + w0[0] = append0[0]; + w0[1] = append0[1]; + w0[2] = append0[2]; + w0[3] = append0[3]; + w1[0] = append1[0]; + w1[1] = append1[1]; + w1[2] = append1[2]; + w1[3] = append1[3]; + w2[0] = append2[0]; + break; + + case 1: + w0[0] = w0[0] | append0[0] << 8; + w0[1] = append0[0] >> 24 | append0[1] << 8; + w0[2] = append0[1] >> 24 | append0[2] << 8; + w0[3] = append0[2] >> 24 | append0[3] << 8; + w1[0] = append0[3] >> 24 | append1[0] << 8; + w1[1] = append1[0] >> 24 | append1[1] << 8; + w1[2] = append1[1] >> 24 | append1[2] << 8; + w1[3] = append1[2] >> 24 | append1[3] << 8; + w2[0] = append1[3] >> 24 | append2[0] << 8; + w2[1] = append2[0] >> 24; + break; + + case 2: + w0[0] = w0[0] | append0[0] << 16; + w0[1] = append0[0] >> 16 | append0[1] << 16; + w0[2] = append0[1] >> 16 | append0[2] << 16; + w0[3] = append0[2] >> 16 | append0[3] << 16; + w1[0] = append0[3] >> 16 | append1[0] << 16; + w1[1] = append1[0] >> 16 | append1[1] << 16; + w1[2] = append1[1] >> 16 | append1[2] << 16; + w1[3] = append1[2] >> 16 | append1[3] << 16; + w2[0] = append1[3] >> 16 | append2[0] << 16; + w2[1] = append2[0] >> 16; + break; + + case 3: + w0[0] = w0[0] | append0[0] << 24; + w0[1] = append0[0] >> 8 | append0[1] << 24; + w0[2] = append0[1] >> 8 | append0[2] << 24; + w0[3] = append0[2] >> 8 | append0[3] << 24; + w1[0] = append0[3] >> 8 | append1[0] << 24; + w1[1] = append1[0] >> 8 | append1[1] << 24; + w1[2] = append1[1] >> 8 | append1[2] << 24; + w1[3] = append1[2] >> 8 | append1[3] << 24; + w2[0] = append1[3] >> 8 | append2[0] << 24; + w2[1] = append2[0] >> 8; + break; + + case 4: + w0[1] = append0[0]; + w0[2] = append0[1]; + w0[3] = append0[2]; + w1[0] = append0[3]; + w1[1] = append1[0]; + w1[2] = append1[1]; + w1[3] = append1[2]; + w2[0] = append1[3]; + w2[1] = append2[0]; + break; + + case 5: + w0[1] = w0[1] | append0[0] << 8; + w0[2] = append0[0] >> 24 | append0[1] << 8; + w0[3] = append0[1] >> 24 | append0[2] << 8; + w1[0] = append0[2] >> 24 | append0[3] << 8; + w1[1] = append0[3] >> 24 | append1[0] << 8; + w1[2] = append1[0] >> 24 | append1[1] << 8; + w1[3] = append1[1] >> 24 | append1[2] << 8; + w2[0] = append1[2] >> 24 | append1[3] << 8; + w2[1] = append1[3] >> 24 | append2[0] << 8; + w2[2] = append2[0] >> 24; + break; + + case 6: + w0[1] = w0[1] | append0[0] << 16; + w0[2] = append0[0] >> 16 | append0[1] << 16; + w0[3] = append0[1] >> 16 | append0[2] << 16; + w1[0] = append0[2] >> 16 | append0[3] << 16; + w1[1] = append0[3] >> 16 | append1[0] << 16; + w1[2] = append1[0] >> 16 | append1[1] << 16; + w1[3] = append1[1] >> 16 | append1[2] << 16; + w2[0] = append1[2] >> 16 | append1[3] << 16; + w2[1] = append1[3] >> 16 | append2[0] << 16; + w2[2] = append2[0] >> 16; + break; + + case 7: + w0[1] = w0[1] | append0[0] << 24; + w0[2] = append0[0] >> 8 | append0[1] << 24; + w0[3] = append0[1] >> 8 | append0[2] << 24; + w1[0] = append0[2] >> 8 | append0[3] << 24; + w1[1] = append0[3] >> 8 | append1[0] << 24; + w1[2] = append1[0] >> 8 | append1[1] << 24; + w1[3] = append1[1] >> 8 | append1[2] << 24; + w2[0] = append1[2] >> 8 | append1[3] << 24; + w2[1] = append1[3] >> 8 | append2[0] << 24; + w2[2] = append2[0] >> 8; + break; + + case 8: + w0[2] = append0[0]; + w0[3] = append0[1]; + w1[0] = append0[2]; + w1[1] = append0[3]; + w1[2] = append1[0]; + w1[3] = append1[1]; + w2[0] = append1[2]; + w2[1] = append1[3]; + w2[2] = append2[0]; + break; + + case 9: + w0[2] = w0[2] | append0[0] << 8; + w0[3] = append0[0] >> 24 | append0[1] << 8; + w1[0] = append0[1] >> 24 | append0[2] << 8; + w1[1] = append0[2] >> 24 | append0[3] << 8; + w1[2] = append0[3] >> 24 | append1[0] << 8; + w1[3] = append1[0] >> 24 | append1[1] << 8; + w2[0] = append1[1] >> 24 | append1[2] << 8; + w2[1] = append1[2] >> 24 | append1[3] << 8; + w2[2] = append1[3] >> 24 | append2[0] << 8; + w2[3] = append2[0] >> 24; + break; + + case 10: + w0[2] = w0[2] | append0[0] << 16; + w0[3] = append0[0] >> 16 | append0[1] << 16; + w1[0] = append0[1] >> 16 | append0[2] << 16; + w1[1] = append0[2] >> 16 | append0[3] << 16; + w1[2] = append0[3] >> 16 | append1[0] << 16; + w1[3] = append1[0] >> 16 | append1[1] << 16; + w2[0] = append1[1] >> 16 | append1[2] << 16; + w2[1] = append1[2] >> 16 | append1[3] << 16; + w2[2] = append1[3] >> 16 | append2[0] << 16; + w2[3] = append2[0] >> 16; + break; + + case 11: + w0[2] = w0[2] | append0[0] << 24; + w0[3] = append0[0] >> 8 | append0[1] << 24; + w1[0] = append0[1] >> 8 | append0[2] << 24; + w1[1] = append0[2] >> 8 | append0[3] << 24; + w1[2] = append0[3] >> 8 | append1[0] << 24; + w1[3] = append1[0] >> 8 | append1[1] << 24; + w2[0] = append1[1] >> 8 | append1[2] << 24; + w2[1] = append1[2] >> 8 | append1[3] << 24; + w2[2] = append1[3] >> 8 | append2[0] << 24; + w2[3] = append2[0] >> 8; + break; + + case 12: + w0[3] = append0[0]; + w1[0] = append0[1]; + w1[1] = append0[2]; + w1[2] = append0[3]; + w1[3] = append1[0]; + w2[0] = append1[1]; + w2[1] = append1[2]; + w2[2] = append1[3]; + w2[3] = append2[0]; + break; + + case 13: + w0[3] = w0[3] | append0[0] << 8; + w1[0] = append0[0] >> 24 | append0[1] << 8; + w1[1] = append0[1] >> 24 | append0[2] << 8; + w1[2] = append0[2] >> 24 | append0[3] << 8; + w1[3] = append0[3] >> 24 | append1[0] << 8; + w2[0] = append1[0] >> 24 | append1[1] << 8; + w2[1] = append1[1] >> 24 | append1[2] << 8; + w2[2] = append1[2] >> 24 | append1[3] << 8; + w2[3] = append1[3] >> 24 | append2[0] << 8; + w3[0] = append2[0] >> 24; + break; + + case 14: + w0[3] = w0[3] | append0[0] << 16; + w1[0] = append0[0] >> 16 | append0[1] << 16; + w1[1] = append0[1] >> 16 | append0[2] << 16; + w1[2] = append0[2] >> 16 | append0[3] << 16; + w1[3] = append0[3] >> 16 | append1[0] << 16; + w2[0] = append1[0] >> 16 | append1[1] << 16; + w2[1] = append1[1] >> 16 | append1[2] << 16; + w2[2] = append1[2] >> 16 | append1[3] << 16; + w2[3] = append1[3] >> 16 | append2[0] << 16; + w3[0] = append2[0] >> 16; + break; + + case 15: + w0[3] = w0[3] | append0[0] << 24; + w1[0] = append0[0] >> 8 | append0[1] << 24; + w1[1] = append0[1] >> 8 | append0[2] << 24; + w1[2] = append0[2] >> 8 | append0[3] << 24; + w1[3] = append0[3] >> 8 | append1[0] << 24; + w2[0] = append1[0] >> 8 | append1[1] << 24; + w2[1] = append1[1] >> 8 | append1[2] << 24; + w2[2] = append1[2] >> 8 | append1[3] << 24; + w2[3] = append1[3] >> 8 | append2[0] << 24; + w3[0] = append2[0] >> 8; + break; + } +} + +__device__ static void memcat32_8 (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], const u32 append0[4], const u32 append1[4], const u32 offset) +{ + switch (offset) + { + case 0: + w0[0] = append0[0]; + w0[1] = append0[1]; + w0[2] = append0[2]; + w0[3] = append0[3]; + w1[0] = append1[0]; + w1[1] = append1[1]; + w1[2] = append1[2]; + w1[3] = append1[3]; + break; + + case 1: + w0[0] = w0[0] | append0[0] << 8; + w0[1] = append0[0] >> 24 | append0[1] << 8; + w0[2] = append0[1] >> 24 | append0[2] << 8; + w0[3] = append0[2] >> 24 | append0[3] << 8; + w1[0] = append0[3] >> 24 | append1[0] << 8; + w1[1] = append1[0] >> 24 | append1[1] << 8; + w1[2] = append1[1] >> 24 | append1[2] << 8; + w1[3] = append1[2] >> 24 | append1[3] << 8; + w2[0] = append1[3] >> 24; + break; + + case 2: + w0[0] = w0[0] | append0[0] << 16; + w0[1] = append0[0] >> 16 | append0[1] << 16; + w0[2] = append0[1] >> 16 | append0[2] << 16; + w0[3] = append0[2] >> 16 | append0[3] << 16; + w1[0] = append0[3] >> 16 | append1[0] << 16; + w1[1] = append1[0] >> 16 | append1[1] << 16; + w1[2] = append1[1] >> 16 | append1[2] << 16; + w1[3] = append1[2] >> 16 | append1[3] << 16; + w2[0] = append1[3] >> 16; + break; + + case 3: + w0[0] = w0[0] | append0[0] << 24; + w0[1] = append0[0] >> 8 | append0[1] << 24; + w0[2] = append0[1] >> 8 | append0[2] << 24; + w0[3] = append0[2] >> 8 | append0[3] << 24; + w1[0] = append0[3] >> 8 | append1[0] << 24; + w1[1] = append1[0] >> 8 | append1[1] << 24; + w1[2] = append1[1] >> 8 | append1[2] << 24; + w1[3] = append1[2] >> 8 | append1[3] << 24; + w2[0] = append1[3] >> 8; + break; + + case 4: + w0[1] = append0[0]; + w0[2] = append0[1]; + w0[3] = append0[2]; + w1[0] = append0[3]; + w1[1] = append1[0]; + w1[2] = append1[1]; + w1[3] = append1[2]; + w2[0] = append1[3]; + break; + + case 5: + w0[1] = w0[1] | append0[0] << 8; + w0[2] = append0[0] >> 24 | append0[1] << 8; + w0[3] = append0[1] >> 24 | append0[2] << 8; + w1[0] = append0[2] >> 24 | append0[3] << 8; + w1[1] = append0[3] >> 24 | append1[0] << 8; + w1[2] = append1[0] >> 24 | append1[1] << 8; + w1[3] = append1[1] >> 24 | append1[2] << 8; + w2[0] = append1[2] >> 24 | append1[3] << 8; + w2[1] = append1[3] >> 24; + break; + + case 6: + w0[1] = w0[1] | append0[0] << 16; + w0[2] = append0[0] >> 16 | append0[1] << 16; + w0[3] = append0[1] >> 16 | append0[2] << 16; + w1[0] = append0[2] >> 16 | append0[3] << 16; + w1[1] = append0[3] >> 16 | append1[0] << 16; + w1[2] = append1[0] >> 16 | append1[1] << 16; + w1[3] = append1[1] >> 16 | append1[2] << 16; + w2[0] = append1[2] >> 16 | append1[3] << 16; + w2[1] = append1[3] >> 16; + break; + + case 7: + w0[1] = w0[1] | append0[0] << 24; + w0[2] = append0[0] >> 8 | append0[1] << 24; + w0[3] = append0[1] >> 8 | append0[2] << 24; + w1[0] = append0[2] >> 8 | append0[3] << 24; + w1[1] = append0[3] >> 8 | append1[0] << 24; + w1[2] = append1[0] >> 8 | append1[1] << 24; + w1[3] = append1[1] >> 8 | append1[2] << 24; + w2[0] = append1[2] >> 8 | append1[3] << 24; + w2[1] = append1[3] >> 8; + break; + + case 8: + w0[2] = append0[0]; + w0[3] = append0[1]; + w1[0] = append0[2]; + w1[1] = append0[3]; + w1[2] = append1[0]; + w1[3] = append1[1]; + w2[0] = append1[2]; + w2[1] = append1[3]; + break; + + case 9: + w0[2] = w0[2] | append0[0] << 8; + w0[3] = append0[0] >> 24 | append0[1] << 8; + w1[0] = append0[1] >> 24 | append0[2] << 8; + w1[1] = append0[2] >> 24 | append0[3] << 8; + w1[2] = append0[3] >> 24 | append1[0] << 8; + w1[3] = append1[0] >> 24 | append1[1] << 8; + w2[0] = append1[1] >> 24 | append1[2] << 8; + w2[1] = append1[2] >> 24 | append1[3] << 8; + w2[2] = append1[3] >> 24; + break; + + case 10: + w0[2] = w0[2] | append0[0] << 16; + w0[3] = append0[0] >> 16 | append0[1] << 16; + w1[0] = append0[1] >> 16 | append0[2] << 16; + w1[1] = append0[2] >> 16 | append0[3] << 16; + w1[2] = append0[3] >> 16 | append1[0] << 16; + w1[3] = append1[0] >> 16 | append1[1] << 16; + w2[0] = append1[1] >> 16 | append1[2] << 16; + w2[1] = append1[2] >> 16 | append1[3] << 16; + w2[2] = append1[3] >> 16; + break; + + case 11: + w0[2] = w0[2] | append0[0] << 24; + w0[3] = append0[0] >> 8 | append0[1] << 24; + w1[0] = append0[1] >> 8 | append0[2] << 24; + w1[1] = append0[2] >> 8 | append0[3] << 24; + w1[2] = append0[3] >> 8 | append1[0] << 24; + w1[3] = append1[0] >> 8 | append1[1] << 24; + w2[0] = append1[1] >> 8 | append1[2] << 24; + w2[1] = append1[2] >> 8 | append1[3] << 24; + w2[2] = append1[3] >> 8; + break; + + case 12: + w0[3] = append0[0]; + w1[0] = append0[1]; + w1[1] = append0[2]; + w1[2] = append0[3]; + w1[3] = append1[0]; + w2[0] = append1[1]; + w2[1] = append1[2]; + w2[2] = append1[3]; + break; + + case 13: + w0[3] = w0[3] | append0[0] << 8; + w1[0] = append0[0] >> 24 | append0[1] << 8; + w1[1] = append0[1] >> 24 | append0[2] << 8; + w1[2] = append0[2] >> 24 | append0[3] << 8; + w1[3] = append0[3] >> 24 | append1[0] << 8; + w2[0] = append1[0] >> 24 | append1[1] << 8; + w2[1] = append1[1] >> 24 | append1[2] << 8; + w2[2] = append1[2] >> 24 | append1[3] << 8; + w2[3] = append1[3] >> 24; + break; + + case 14: + w0[3] = w0[3] | append0[0] << 16; + w1[0] = append0[0] >> 16 | append0[1] << 16; + w1[1] = append0[1] >> 16 | append0[2] << 16; + w1[2] = append0[2] >> 16 | append0[3] << 16; + w1[3] = append0[3] >> 16 | append1[0] << 16; + w2[0] = append1[0] >> 16 | append1[1] << 16; + w2[1] = append1[1] >> 16 | append1[2] << 16; + w2[2] = append1[2] >> 16 | append1[3] << 16; + w2[3] = append1[3] >> 16; + break; + + case 15: + w0[3] = w0[3] | append0[0] << 24; + w1[0] = append0[0] >> 8 | append0[1] << 24; + w1[1] = append0[1] >> 8 | append0[2] << 24; + w1[2] = append0[2] >> 8 | append0[3] << 24; + w1[3] = append0[3] >> 8 | append1[0] << 24; + w2[0] = append1[0] >> 8 | append1[1] << 24; + w2[1] = append1[1] >> 8 | append1[2] << 24; + w2[2] = append1[2] >> 8 | append1[3] << 24; + w2[3] = append1[3] >> 8; + break; + + case 16: + w1[0] = append0[0]; + w1[1] = append0[1]; + w1[2] = append0[2]; + w1[3] = append0[3]; + w2[0] = append1[0]; + w2[1] = append1[1]; + w2[2] = append1[2]; + w2[3] = append1[3]; + break; + + case 17: + w1[0] = w1[0] | append0[0] << 8; + w1[1] = append0[0] >> 24 | append0[1] << 8; + w1[2] = append0[1] >> 24 | append0[2] << 8; + w1[3] = append0[2] >> 24 | append0[3] << 8; + w2[0] = append0[3] >> 24 | append1[0] << 8; + w2[1] = append1[0] >> 24 | append1[1] << 8; + w2[2] = append1[1] >> 24 | append1[2] << 8; + w2[3] = append1[2] >> 24 | append1[3] << 8; + w3[0] = append1[3] >> 24; + break; + + case 18: + w1[0] = w1[0] | append0[0] << 16; + w1[1] = append0[0] >> 16 | append0[1] << 16; + w1[2] = append0[1] >> 16 | append0[2] << 16; + w1[3] = append0[2] >> 16 | append0[3] << 16; + w2[0] = append0[3] >> 16 | append1[0] << 16; + w2[1] = append1[0] >> 16 | append1[1] << 16; + w2[2] = append1[1] >> 16 | append1[2] << 16; + w2[3] = append1[2] >> 16 | append1[3] << 16; + w3[0] = append1[3] >> 16; + break; + + case 19: + w1[0] = w1[0] | append0[0] << 24; + w1[1] = append0[0] >> 8 | append0[1] << 24; + w1[2] = append0[1] >> 8 | append0[2] << 24; + w1[3] = append0[2] >> 8 | append0[3] << 24; + w2[0] = append0[3] >> 8 | append1[0] << 24; + w2[1] = append1[0] >> 8 | append1[1] << 24; + w2[2] = append1[1] >> 8 | append1[2] << 24; + w2[3] = append1[2] >> 8 | append1[3] << 24; + w3[0] = append1[3] >> 8; + break; + + case 20: + w1[1] = append0[0]; + w1[2] = append0[1]; + w1[3] = append0[2]; + w2[0] = append0[3]; + w2[1] = append1[0]; + w2[2] = append1[1]; + w2[3] = append1[2]; + w3[0] = append1[3]; + break; + + case 21: + w1[1] = w1[1] | append0[0] << 8; + w1[2] = append0[0] >> 24 | append0[1] << 8; + w1[3] = append0[1] >> 24 | append0[2] << 8; + w2[0] = append0[2] >> 24 | append0[3] << 8; + w2[1] = append0[3] >> 24 | append1[0] << 8; + w2[2] = append1[0] >> 24 | append1[1] << 8; + w2[3] = append1[1] >> 24 | append1[2] << 8; + w3[0] = append1[2] >> 24 | append1[3] << 8; + w3[1] = append1[3] >> 24; + break; + + case 22: + w1[1] = w1[1] | append0[0] << 16; + w1[2] = append0[0] >> 16 | append0[1] << 16; + w1[3] = append0[1] >> 16 | append0[2] << 16; + w2[0] = append0[2] >> 16 | append0[3] << 16; + w2[1] = append0[3] >> 16 | append1[0] << 16; + w2[2] = append1[0] >> 16 | append1[1] << 16; + w2[3] = append1[1] >> 16 | append1[2] << 16; + w3[0] = append1[2] >> 16 | append1[3] << 16; + w3[1] = append1[3] >> 16; + break; + + case 23: + w1[1] = w1[1] | append0[0] << 24; + w1[2] = append0[0] >> 8 | append0[1] << 24; + w1[3] = append0[1] >> 8 | append0[2] << 24; + w2[0] = append0[2] >> 8 | append0[3] << 24; + w2[1] = append0[3] >> 8 | append1[0] << 24; + w2[2] = append1[0] >> 8 | append1[1] << 24; + w2[3] = append1[1] >> 8 | append1[2] << 24; + w3[0] = append1[2] >> 8 | append1[3] << 24; + w3[1] = append1[3] >> 8; + break; + + case 24: + w1[2] = append0[0]; + w1[3] = append0[1]; + w2[0] = append0[2]; + w2[1] = append0[3]; + w2[2] = append1[0]; + w2[3] = append1[1]; + w3[0] = append1[2]; + w3[1] = append1[3]; + break; + + case 25: + w1[2] = w1[2] | append0[0] << 8; + w1[3] = append0[0] >> 24 | append0[1] << 8; + w2[0] = append0[1] >> 24 | append0[2] << 8; + w2[1] = append0[2] >> 24 | append0[3] << 8; + w2[2] = append0[3] >> 24 | append1[0] << 8; + w2[3] = append1[0] >> 24 | append1[1] << 8; + w3[0] = append1[1] >> 24 | append1[2] << 8; + w3[1] = append1[2] >> 24 | append1[3] << 8; + break; + + case 26: + w1[2] = w1[2] | append0[0] << 16; + w1[3] = append0[0] >> 16 | append0[1] << 16; + w2[0] = append0[1] >> 16 | append0[2] << 16; + w2[1] = append0[2] >> 16 | append0[3] << 16; + w2[2] = append0[3] >> 16 | append1[0] << 16; + w2[3] = append1[0] >> 16 | append1[1] << 16; + w3[0] = append1[1] >> 16 | append1[2] << 16; + w3[1] = append1[2] >> 16 | append1[3] << 16; + break; + + case 27: + w1[2] = w1[2] | append0[0] << 24; + w1[3] = append0[0] >> 8 | append0[1] << 24; + w2[0] = append0[1] >> 8 | append0[2] << 24; + w2[1] = append0[2] >> 8 | append0[3] << 24; + w2[2] = append0[3] >> 8 | append1[0] << 24; + w2[3] = append1[0] >> 8 | append1[1] << 24; + w3[0] = append1[1] >> 8 | append1[2] << 24; + w3[1] = append1[2] >> 8 | append1[3] << 24; + break; + + case 28: + w1[3] = append0[0]; + w2[0] = append0[1]; + w2[1] = append0[2]; + w2[2] = append0[3]; + w2[3] = append1[0]; + w3[0] = append1[1]; + w3[1] = append1[2]; + break; + + case 29: + w1[3] = w1[3] | append0[0] << 8; + w2[0] = append0[0] >> 24 | append0[1] << 8; + w2[1] = append0[1] >> 24 | append0[2] << 8; + w2[2] = append0[2] >> 24 | append0[3] << 8; + w2[3] = append0[3] >> 24 | append1[0] << 8; + w3[0] = append1[0] >> 24 | append1[1] << 8; + w3[1] = append1[1] >> 24 | append1[2] << 8; + break; + + case 30: + w1[3] = w1[3] | append0[0] << 16; + w2[0] = append0[0] >> 16 | append0[1] << 16; + w2[1] = append0[1] >> 16 | append0[2] << 16; + w2[2] = append0[2] >> 16 | append0[3] << 16; + w2[3] = append0[3] >> 16 | append1[0] << 16; + w3[0] = append1[0] >> 16 | append1[1] << 16; + w3[1] = append1[1] >> 16 | append1[2] << 16; + break; + + case 31: + w1[3] = w1[3] | append0[0] << 24; + w2[0] = append0[0] >> 8 | append0[1] << 24; + w2[1] = append0[1] >> 8 | append0[2] << 24; + w2[2] = append0[2] >> 8 | append0[3] << 24; + w2[3] = append0[3] >> 8 | append1[0] << 24; + w3[0] = append1[0] >> 8 | append1[1] << 24; + w3[1] = append1[1] >> 8 | append1[2] << 24; + break; + + case 32: + w2[0] = append0[0]; + w2[1] = append0[1]; + w2[2] = append0[2]; + w2[3] = append0[3]; + w3[0] = append1[0]; + w3[1] = append1[1]; + break; + } +} + +__device__ static void memcat32_9 (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], const u32 append0[4], const u32 append1[4], const u32 append2[4], const u32 offset) +{ + switch (offset) + { + case 0: + w0[0] = append0[0]; + w0[1] = append0[1]; + w0[2] = append0[2]; + w0[3] = append0[3]; + w1[0] = append1[0]; + w1[1] = append1[1]; + w1[2] = append1[2]; + w1[3] = append1[3]; + w2[0] = append2[0]; + break; + + case 1: + w0[0] = w0[0] | append0[0] << 8; + w0[1] = append0[0] >> 24 | append0[1] << 8; + w0[2] = append0[1] >> 24 | append0[2] << 8; + w0[3] = append0[2] >> 24 | append0[3] << 8; + w1[0] = append0[3] >> 24 | append1[0] << 8; + w1[1] = append1[0] >> 24 | append1[1] << 8; + w1[2] = append1[1] >> 24 | append1[2] << 8; + w1[3] = append1[2] >> 24 | append1[3] << 8; + w2[0] = append1[3] >> 24 | append2[0] << 8; + w2[1] = append2[0] >> 24; + break; + + case 2: + w0[0] = w0[0] | append0[0] << 16; + w0[1] = append0[0] >> 16 | append0[1] << 16; + w0[2] = append0[1] >> 16 | append0[2] << 16; + w0[3] = append0[2] >> 16 | append0[3] << 16; + w1[0] = append0[3] >> 16 | append1[0] << 16; + w1[1] = append1[0] >> 16 | append1[1] << 16; + w1[2] = append1[1] >> 16 | append1[2] << 16; + w1[3] = append1[2] >> 16 | append1[3] << 16; + w2[0] = append1[3] >> 16 | append2[0] << 16; + w2[1] = append2[0] >> 16; + break; + + case 3: + w0[0] = w0[0] | append0[0] << 24; + w0[1] = append0[0] >> 8 | append0[1] << 24; + w0[2] = append0[1] >> 8 | append0[2] << 24; + w0[3] = append0[2] >> 8 | append0[3] << 24; + w1[0] = append0[3] >> 8 | append1[0] << 24; + w1[1] = append1[0] >> 8 | append1[1] << 24; + w1[2] = append1[1] >> 8 | append1[2] << 24; + w1[3] = append1[2] >> 8 | append1[3] << 24; + w2[0] = append1[3] >> 8 | append2[0] << 24; + w2[1] = append2[0] >> 8; + break; + + case 4: + w0[1] = append0[0]; + w0[2] = append0[1]; + w0[3] = append0[2]; + w1[0] = append0[3]; + w1[1] = append1[0]; + w1[2] = append1[1]; + w1[3] = append1[2]; + w2[0] = append1[3]; + w2[1] = append2[0]; + break; + + case 5: + w0[1] = w0[1] | append0[0] << 8; + w0[2] = append0[0] >> 24 | append0[1] << 8; + w0[3] = append0[1] >> 24 | append0[2] << 8; + w1[0] = append0[2] >> 24 | append0[3] << 8; + w1[1] = append0[3] >> 24 | append1[0] << 8; + w1[2] = append1[0] >> 24 | append1[1] << 8; + w1[3] = append1[1] >> 24 | append1[2] << 8; + w2[0] = append1[2] >> 24 | append1[3] << 8; + w2[1] = append1[3] >> 24 | append2[0] << 8; + w2[2] = append2[0] >> 24; + break; + + case 6: + w0[1] = w0[1] | append0[0] << 16; + w0[2] = append0[0] >> 16 | append0[1] << 16; + w0[3] = append0[1] >> 16 | append0[2] << 16; + w1[0] = append0[2] >> 16 | append0[3] << 16; + w1[1] = append0[3] >> 16 | append1[0] << 16; + w1[2] = append1[0] >> 16 | append1[1] << 16; + w1[3] = append1[1] >> 16 | append1[2] << 16; + w2[0] = append1[2] >> 16 | append1[3] << 16; + w2[1] = append1[3] >> 16 | append2[0] << 16; + w2[2] = append2[0] >> 16; + break; + + case 7: + w0[1] = w0[1] | append0[0] << 24; + w0[2] = append0[0] >> 8 | append0[1] << 24; + w0[3] = append0[1] >> 8 | append0[2] << 24; + w1[0] = append0[2] >> 8 | append0[3] << 24; + w1[1] = append0[3] >> 8 | append1[0] << 24; + w1[2] = append1[0] >> 8 | append1[1] << 24; + w1[3] = append1[1] >> 8 | append1[2] << 24; + w2[0] = append1[2] >> 8 | append1[3] << 24; + w2[1] = append1[3] >> 8 | append2[0] << 24; + w2[2] = append2[0] >> 8; + break; + + case 8: + w0[2] = append0[0]; + w0[3] = append0[1]; + w1[0] = append0[2]; + w1[1] = append0[3]; + w1[2] = append1[0]; + w1[3] = append1[1]; + w2[0] = append1[2]; + w2[1] = append1[3]; + w2[2] = append2[0]; + break; + + case 9: + w0[2] = w0[2] | append0[0] << 8; + w0[3] = append0[0] >> 24 | append0[1] << 8; + w1[0] = append0[1] >> 24 | append0[2] << 8; + w1[1] = append0[2] >> 24 | append0[3] << 8; + w1[2] = append0[3] >> 24 | append1[0] << 8; + w1[3] = append1[0] >> 24 | append1[1] << 8; + w2[0] = append1[1] >> 24 | append1[2] << 8; + w2[1] = append1[2] >> 24 | append1[3] << 8; + w2[2] = append1[3] >> 24 | append2[0] << 8; + w2[3] = append2[0] >> 24; + break; + + case 10: + w0[2] = w0[2] | append0[0] << 16; + w0[3] = append0[0] >> 16 | append0[1] << 16; + w1[0] = append0[1] >> 16 | append0[2] << 16; + w1[1] = append0[2] >> 16 | append0[3] << 16; + w1[2] = append0[3] >> 16 | append1[0] << 16; + w1[3] = append1[0] >> 16 | append1[1] << 16; + w2[0] = append1[1] >> 16 | append1[2] << 16; + w2[1] = append1[2] >> 16 | append1[3] << 16; + w2[2] = append1[3] >> 16 | append2[0] << 16; + w2[3] = append2[0] >> 16; + break; + + case 11: + w0[2] = w0[2] | append0[0] << 24; + w0[3] = append0[0] >> 8 | append0[1] << 24; + w1[0] = append0[1] >> 8 | append0[2] << 24; + w1[1] = append0[2] >> 8 | append0[3] << 24; + w1[2] = append0[3] >> 8 | append1[0] << 24; + w1[3] = append1[0] >> 8 | append1[1] << 24; + w2[0] = append1[1] >> 8 | append1[2] << 24; + w2[1] = append1[2] >> 8 | append1[3] << 24; + w2[2] = append1[3] >> 8 | append2[0] << 24; + w2[3] = append2[0] >> 8; + break; + + case 12: + w0[3] = append0[0]; + w1[0] = append0[1]; + w1[1] = append0[2]; + w1[2] = append0[3]; + w1[3] = append1[0]; + w2[0] = append1[1]; + w2[1] = append1[2]; + w2[2] = append1[3]; + w2[3] = append2[0]; + break; + + case 13: + w0[3] = w0[3] | append0[0] << 8; + w1[0] = append0[0] >> 24 | append0[1] << 8; + w1[1] = append0[1] >> 24 | append0[2] << 8; + w1[2] = append0[2] >> 24 | append0[3] << 8; + w1[3] = append0[3] >> 24 | append1[0] << 8; + w2[0] = append1[0] >> 24 | append1[1] << 8; + w2[1] = append1[1] >> 24 | append1[2] << 8; + w2[2] = append1[2] >> 24 | append1[3] << 8; + w2[3] = append1[3] >> 24 | append2[0] << 8; + w3[0] = append2[0] >> 24; + break; + + case 14: + w0[3] = w0[3] | append0[0] << 16; + w1[0] = append0[0] >> 16 | append0[1] << 16; + w1[1] = append0[1] >> 16 | append0[2] << 16; + w1[2] = append0[2] >> 16 | append0[3] << 16; + w1[3] = append0[3] >> 16 | append1[0] << 16; + w2[0] = append1[0] >> 16 | append1[1] << 16; + w2[1] = append1[1] >> 16 | append1[2] << 16; + w2[2] = append1[2] >> 16 | append1[3] << 16; + w2[3] = append1[3] >> 16 | append2[0] << 16; + w3[0] = append2[0] >> 16; + break; + + case 15: + w0[3] = w0[3] | append0[0] << 24; + w1[0] = append0[0] >> 8 | append0[1] << 24; + w1[1] = append0[1] >> 8 | append0[2] << 24; + w1[2] = append0[2] >> 8 | append0[3] << 24; + w1[3] = append0[3] >> 8 | append1[0] << 24; + w2[0] = append1[0] >> 8 | append1[1] << 24; + w2[1] = append1[1] >> 8 | append1[2] << 24; + w2[2] = append1[2] >> 8 | append1[3] << 24; + w2[3] = append1[3] >> 8 | append2[0] << 24; + w3[0] = append2[0] >> 8; + break; + + case 16: + w1[0] = append0[0]; + w1[1] = append0[1]; + w1[2] = append0[2]; + w1[3] = append0[3]; + w2[0] = append1[0]; + w2[1] = append1[1]; + w2[2] = append1[2]; + w2[3] = append1[3]; + w3[0] = append2[0]; + break; + + case 17: + w1[0] = w1[0] | append0[0] << 8; + w1[1] = append0[0] >> 24 | append0[1] << 8; + w1[2] = append0[1] >> 24 | append0[2] << 8; + w1[3] = append0[2] >> 24 | append0[3] << 8; + w2[0] = append0[3] >> 24 | append1[0] << 8; + w2[1] = append1[0] >> 24 | append1[1] << 8; + w2[2] = append1[1] >> 24 | append1[2] << 8; + w2[3] = append1[2] >> 24 | append1[3] << 8; + w3[0] = append1[3] >> 24 | append2[0] << 8; + w3[1] = append2[0] >> 24; + break; + + case 18: + w1[0] = w1[0] | append0[0] << 16; + w1[1] = append0[0] >> 16 | append0[1] << 16; + w1[2] = append0[1] >> 16 | append0[2] << 16; + w1[3] = append0[2] >> 16 | append0[3] << 16; + w2[0] = append0[3] >> 16 | append1[0] << 16; + w2[1] = append1[0] >> 16 | append1[1] << 16; + w2[2] = append1[1] >> 16 | append1[2] << 16; + w2[3] = append1[2] >> 16 | append1[3] << 16; + w3[0] = append1[3] >> 16 | append2[0] << 16; + w3[1] = append2[0] >> 16; + break; + + case 19: + w1[0] = w1[0] | append0[0] << 24; + w1[1] = append0[0] >> 8 | append0[1] << 24; + w1[2] = append0[1] >> 8 | append0[2] << 24; + w1[3] = append0[2] >> 8 | append0[3] << 24; + w2[0] = append0[3] >> 8 | append1[0] << 24; + w2[1] = append1[0] >> 8 | append1[1] << 24; + w2[2] = append1[1] >> 8 | append1[2] << 24; + w2[3] = append1[2] >> 8 | append1[3] << 24; + w3[0] = append1[3] >> 8 | append2[0] << 24; + w3[1] = append2[0] >> 8; + break; + + case 20: + w1[1] = append0[0]; + w1[2] = append0[1]; + w1[3] = append0[2]; + w2[0] = append0[3]; + w2[1] = append1[0]; + w2[2] = append1[1]; + w2[3] = append1[2]; + w3[0] = append1[3]; + w3[1] = append2[0]; + break; + + case 21: + w1[1] = w1[1] | append0[0] << 8; + w1[2] = append0[0] >> 24 | append0[1] << 8; + w1[3] = append0[1] >> 24 | append0[2] << 8; + w2[0] = append0[2] >> 24 | append0[3] << 8; + w2[1] = append0[3] >> 24 | append1[0] << 8; + w2[2] = append1[0] >> 24 | append1[1] << 8; + w2[3] = append1[1] >> 24 | append1[2] << 8; + w3[0] = append1[2] >> 24 | append1[3] << 8; + w3[1] = append1[3] >> 24 | append2[0] << 8; + break; + + case 22: + w1[1] = w1[1] | append0[0] << 16; + w1[2] = append0[0] >> 16 | append0[1] << 16; + w1[3] = append0[1] >> 16 | append0[2] << 16; + w2[0] = append0[2] >> 16 | append0[3] << 16; + w2[1] = append0[3] >> 16 | append1[0] << 16; + w2[2] = append1[0] >> 16 | append1[1] << 16; + w2[3] = append1[1] >> 16 | append1[2] << 16; + w3[0] = append1[2] >> 16 | append1[3] << 16; + w3[1] = append1[3] >> 16 | append2[0] << 16; + break; + + case 23: + w1[1] = w1[1] | append0[0] << 24; + w1[2] = append0[0] >> 8 | append0[1] << 24; + w1[3] = append0[1] >> 8 | append0[2] << 24; + w2[0] = append0[2] >> 8 | append0[3] << 24; + w2[1] = append0[3] >> 8 | append1[0] << 24; + w2[2] = append1[0] >> 8 | append1[1] << 24; + w2[3] = append1[1] >> 8 | append1[2] << 24; + w3[0] = append1[2] >> 8 | append1[3] << 24; + w3[1] = append1[3] >> 8 | append2[0] << 24; + break; + + case 24: + w1[2] = append0[0]; + w1[3] = append0[1]; + w2[0] = append0[2]; + w2[1] = append0[3]; + w2[2] = append1[0]; + w2[3] = append1[1]; + w3[0] = append1[2]; + w3[1] = append1[3]; + break; + + case 25: + w1[2] = w1[2] | append0[0] << 8; + w1[3] = append0[0] >> 24 | append0[1] << 8; + w2[0] = append0[1] >> 24 | append0[2] << 8; + w2[1] = append0[2] >> 24 | append0[3] << 8; + w2[2] = append0[3] >> 24 | append1[0] << 8; + w2[3] = append1[0] >> 24 | append1[1] << 8; + w3[0] = append1[1] >> 24 | append1[2] << 8; + w3[1] = append1[2] >> 24 | append1[3] << 8; + break; + + case 26: + w1[2] = w1[2] | append0[0] << 16; + w1[3] = append0[0] >> 16 | append0[1] << 16; + w2[0] = append0[1] >> 16 | append0[2] << 16; + w2[1] = append0[2] >> 16 | append0[3] << 16; + w2[2] = append0[3] >> 16 | append1[0] << 16; + w2[3] = append1[0] >> 16 | append1[1] << 16; + w3[0] = append1[1] >> 16 | append1[2] << 16; + w3[1] = append1[2] >> 16 | append1[3] << 16; + break; + + case 27: + w1[2] = w1[2] | append0[0] << 24; + w1[3] = append0[0] >> 8 | append0[1] << 24; + w2[0] = append0[1] >> 8 | append0[2] << 24; + w2[1] = append0[2] >> 8 | append0[3] << 24; + w2[2] = append0[3] >> 8 | append1[0] << 24; + w2[3] = append1[0] >> 8 | append1[1] << 24; + w3[0] = append1[1] >> 8 | append1[2] << 24; + w3[1] = append1[2] >> 8 | append1[3] << 24; + break; + + case 28: + w1[3] = append0[0]; + w2[0] = append0[1]; + w2[1] = append0[2]; + w2[2] = append0[3]; + w2[3] = append1[0]; + w3[0] = append1[1]; + w3[1] = append1[2]; + break; + + case 29: + w1[3] = w1[3] | append0[0] << 8; + w2[0] = append0[0] >> 24 | append0[1] << 8; + w2[1] = append0[1] >> 24 | append0[2] << 8; + w2[2] = append0[2] >> 24 | append0[3] << 8; + w2[3] = append0[3] >> 24 | append1[0] << 8; + w3[0] = append1[0] >> 24 | append1[1] << 8; + w3[1] = append1[1] >> 24 | append1[2] << 8; + break; + + case 30: + w1[3] = w1[3] | append0[0] << 16; + w2[0] = append0[0] >> 16 | append0[1] << 16; + w2[1] = append0[1] >> 16 | append0[2] << 16; + w2[2] = append0[2] >> 16 | append0[3] << 16; + w2[3] = append0[3] >> 16 | append1[0] << 16; + w3[0] = append1[0] >> 16 | append1[1] << 16; + w3[1] = append1[1] >> 16 | append1[2] << 16; + break; + + case 31: + w1[3] = w1[3] | append0[0] << 24; + w2[0] = append0[0] >> 8 | append0[1] << 24; + w2[1] = append0[1] >> 8 | append0[2] << 24; + w2[2] = append0[2] >> 8 | append0[3] << 24; + w2[3] = append0[3] >> 8 | append1[0] << 24; + w3[0] = append1[0] >> 8 | append1[1] << 24; + w3[1] = append1[1] >> 8 | append1[2] << 24; + break; + + case 32: + w2[0] = append0[0]; + w2[1] = append0[1]; + w2[2] = append0[2]; + w2[3] = append0[3]; + w3[0] = append1[0]; + w3[1] = append1[1]; + break; + } +} + +__device__ static void switch_buffer_by_offset (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], const u32 offset) +{ + #if __CUDA_ARCH__ >= 200 + + const int offset_minus_4 = 4 - (offset % 4); + + const int selector = (0x76543210 >> (offset_minus_4 * 4)) & 0xffff; + + switch (offset / 4) + { + case 0: + w3[1] = __byte_perm (w3[0], w3[1], selector); + w3[0] = __byte_perm (w2[3], w3[0], selector); + w2[3] = __byte_perm (w2[2], w2[3], selector); + w2[2] = __byte_perm (w2[1], w2[2], selector); + w2[1] = __byte_perm (w2[0], w2[1], selector); + w2[0] = __byte_perm (w1[3], w2[0], selector); + w1[3] = __byte_perm (w1[2], w1[3], selector); + w1[2] = __byte_perm (w1[1], w1[2], selector); + w1[1] = __byte_perm (w1[0], w1[1], selector); + w1[0] = __byte_perm (w0[3], w1[0], selector); + w0[3] = __byte_perm (w0[2], w0[3], selector); + w0[2] = __byte_perm (w0[1], w0[2], selector); + w0[1] = __byte_perm (w0[0], w0[1], selector); + w0[0] = __byte_perm ( 0, w0[0], selector); + + break; + + case 1: + w3[1] = __byte_perm (w2[3], w3[0], selector); + w3[0] = __byte_perm (w2[2], w2[3], selector); + w2[3] = __byte_perm (w2[1], w2[2], selector); + w2[2] = __byte_perm (w2[0], w2[1], selector); + w2[1] = __byte_perm (w1[3], w2[0], selector); + w2[0] = __byte_perm (w1[2], w1[3], selector); + w1[3] = __byte_perm (w1[1], w1[2], selector); + w1[2] = __byte_perm (w1[0], w1[1], selector); + w1[1] = __byte_perm (w0[3], w1[0], selector); + w1[0] = __byte_perm (w0[2], w0[3], selector); + w0[3] = __byte_perm (w0[1], w0[2], selector); + w0[2] = __byte_perm (w0[0], w0[1], selector); + w0[1] = __byte_perm ( 0, w0[0], selector); + w0[0] = 0; + + break; + + case 2: + w3[1] = __byte_perm (w2[2], w2[3], selector); + w3[0] = __byte_perm (w2[1], w2[2], selector); + w2[3] = __byte_perm (w2[0], w2[1], selector); + w2[2] = __byte_perm (w1[3], w2[0], selector); + w2[1] = __byte_perm (w1[2], w1[3], selector); + w2[0] = __byte_perm (w1[1], w1[2], selector); + w1[3] = __byte_perm (w1[0], w1[1], selector); + w1[2] = __byte_perm (w0[3], w1[0], selector); + w1[1] = __byte_perm (w0[2], w0[3], selector); + w1[0] = __byte_perm (w0[1], w0[2], selector); + w0[3] = __byte_perm (w0[0], w0[1], selector); + w0[2] = __byte_perm ( 0, w0[0], selector); + w0[1] = 0; + w0[0] = 0; + + break; + + case 3: + w3[1] = __byte_perm (w2[1], w2[2], selector); + w3[0] = __byte_perm (w2[0], w2[1], selector); + w2[3] = __byte_perm (w1[3], w2[0], selector); + w2[2] = __byte_perm (w1[2], w1[3], selector); + w2[1] = __byte_perm (w1[1], w1[2], selector); + w2[0] = __byte_perm (w1[0], w1[1], selector); + w1[3] = __byte_perm (w0[3], w1[0], selector); + w1[2] = __byte_perm (w0[2], w0[3], selector); + w1[1] = __byte_perm (w0[1], w0[2], selector); + w1[0] = __byte_perm (w0[0], w0[1], selector); + w0[3] = __byte_perm ( 0, w0[0], selector); + w0[2] = 0; + w0[1] = 0; + w0[0] = 0; + + break; + + case 4: + w3[1] = __byte_perm (w2[0], w2[1], selector); + w3[0] = __byte_perm (w1[3], w2[0], selector); + w2[3] = __byte_perm (w1[2], w1[3], selector); + w2[2] = __byte_perm (w1[1], w1[2], selector); + w2[1] = __byte_perm (w1[0], w1[1], selector); + w2[0] = __byte_perm (w0[3], w1[0], selector); + w1[3] = __byte_perm (w0[2], w0[3], selector); + w1[2] = __byte_perm (w0[1], w0[2], selector); + w1[1] = __byte_perm (w0[0], w0[1], selector); + w1[0] = __byte_perm ( 0, w0[0], selector); + w0[3] = 0; + w0[2] = 0; + w0[1] = 0; + w0[0] = 0; + + break; + + case 5: + w3[1] = __byte_perm (w1[3], w2[0], selector); + w3[0] = __byte_perm (w1[2], w1[3], selector); + w2[3] = __byte_perm (w1[1], w1[2], selector); + w2[2] = __byte_perm (w1[0], w1[1], selector); + w2[1] = __byte_perm (w0[3], w1[0], selector); + w2[0] = __byte_perm (w0[2], w0[3], selector); + w1[3] = __byte_perm (w0[1], w0[2], selector); + w1[2] = __byte_perm (w0[0], w0[1], selector); + w1[1] = __byte_perm ( 0, w0[0], selector); + w1[0] = 0; + w0[3] = 0; + w0[2] = 0; + w0[1] = 0; + w0[0] = 0; + + break; + + case 6: + w3[1] = __byte_perm (w1[2], w1[3], selector); + w3[0] = __byte_perm (w1[1], w1[2], selector); + w2[3] = __byte_perm (w1[0], w1[1], selector); + w2[2] = __byte_perm (w0[3], w1[0], selector); + w2[1] = __byte_perm (w0[2], w0[3], selector); + w2[0] = __byte_perm (w0[1], w0[2], selector); + w1[3] = __byte_perm (w0[0], w0[1], selector); + w1[2] = __byte_perm ( 0, w0[0], selector); + w1[1] = 0; + w1[0] = 0; + w0[3] = 0; + w0[2] = 0; + w0[1] = 0; + w0[0] = 0; + + break; + + case 7: + w3[1] = __byte_perm (w1[1], w1[2], selector); + w3[0] = __byte_perm (w1[0], w1[1], selector); + w2[3] = __byte_perm (w0[3], w1[0], selector); + w2[2] = __byte_perm (w0[2], w0[3], selector); + w2[1] = __byte_perm (w0[1], w0[2], selector); + w2[0] = __byte_perm (w0[0], w0[1], selector); + w1[3] = __byte_perm ( 0, w0[0], selector); + w1[2] = 0; + w1[1] = 0; + w1[0] = 0; + w0[3] = 0; + w0[2] = 0; + w0[1] = 0; + w0[0] = 0; + + break; + + case 8: + w3[1] = __byte_perm (w1[0], w1[1], selector); + w3[0] = __byte_perm (w0[3], w1[0], selector); + w2[3] = __byte_perm (w0[2], w0[3], selector); + w2[2] = __byte_perm (w0[1], w0[2], selector); + w2[1] = __byte_perm (w0[0], w0[1], selector); + w2[0] = __byte_perm ( 0, w0[0], selector); + w1[3] = 0; + w1[2] = 0; + w1[1] = 0; + w1[0] = 0; + w0[3] = 0; + w0[2] = 0; + w0[1] = 0; + w0[0] = 0; + + break; + + case 9: + w3[1] = __byte_perm (w0[3], w1[0], selector); + w3[0] = __byte_perm (w0[2], w0[3], selector); + w2[3] = __byte_perm (w0[1], w0[2], selector); + w2[2] = __byte_perm (w0[0], w0[1], selector); + w2[1] = __byte_perm ( 0, w0[0], selector); + w2[0] = 0; + w1[3] = 0; + w1[2] = 0; + w1[1] = 0; + w1[0] = 0; + w0[3] = 0; + w0[2] = 0; + w0[1] = 0; + w0[0] = 0; + + break; + + case 10: + w3[1] = __byte_perm (w0[2], w0[3], selector); + w3[0] = __byte_perm (w0[1], w0[2], selector); + w2[3] = __byte_perm (w0[0], w0[1], selector); + w2[2] = __byte_perm ( 0, w0[0], selector); + w2[1] = 0; + w2[0] = 0; + w1[3] = 0; + w1[2] = 0; + w1[1] = 0; + w1[0] = 0; + w0[3] = 0; + w0[2] = 0; + w0[1] = 0; + w0[0] = 0; + + break; + + case 11: + w3[1] = __byte_perm (w0[1], w0[2], selector); + w3[0] = __byte_perm (w0[0], w0[1], selector); + w2[3] = __byte_perm ( 0, w0[0], selector); + w2[2] = 0; + w2[1] = 0; + w2[0] = 0; + w1[3] = 0; + w1[2] = 0; + w1[1] = 0; + w1[0] = 0; + w0[3] = 0; + w0[2] = 0; + w0[1] = 0; + w0[0] = 0; + + break; + + case 12: + w3[1] = __byte_perm (w0[0], w0[1], selector); + w3[0] = __byte_perm ( 0, w0[0], selector); + w2[3] = 0; + w2[2] = 0; + w2[1] = 0; + w2[0] = 0; + w1[3] = 0; + w1[2] = 0; + w1[1] = 0; + w1[0] = 0; + w0[3] = 0; + w0[2] = 0; + w0[1] = 0; + w0[0] = 0; + + break; + + case 13: + w3[1] = __byte_perm ( 0, w0[0], selector); + w3[0] = 0; + w2[3] = 0; + w2[2] = 0; + w2[1] = 0; + w2[0] = 0; + w1[3] = 0; + w1[2] = 0; + w1[1] = 0; + w1[0] = 0; + w0[3] = 0; + w0[2] = 0; + w0[1] = 0; + w0[0] = 0; + + break; + } + + #else + + u32x tmp0[4]; + u32x tmp1[4]; + u32x tmp2[1]; + + switch (offset % 4) + { + case 0: + tmp0[0] = w0[0]; + tmp0[1] = w0[1]; + tmp0[2] = w0[2]; + tmp0[3] = w0[3]; + tmp1[0] = w1[0]; + tmp1[1] = w1[1]; + tmp1[2] = w1[2]; + tmp1[3] = w1[3]; + tmp2[0] = 0; + break; + + case 1: + tmp0[0] = w0[0] << 8; + tmp0[1] = w0[0] >> 24 | w0[1] << 8; + tmp0[2] = w0[1] >> 24 | w0[2] << 8; + tmp0[3] = w0[2] >> 24 | w0[3] << 8; + tmp1[0] = w0[3] >> 24 | w1[0] << 8; + tmp1[1] = w1[0] >> 24 | w1[1] << 8; + tmp1[2] = w1[1] >> 24 | w1[2] << 8; + tmp1[3] = w1[2] >> 24 | w1[3] << 8; + tmp2[0] = w1[3] >> 24; + break; + + case 2: + tmp0[0] = w0[0] << 16; + tmp0[1] = w0[0] >> 16 | w0[1] << 16; + tmp0[2] = w0[1] >> 16 | w0[2] << 16; + tmp0[3] = w0[2] >> 16 | w0[3] << 16; + tmp1[0] = w0[3] >> 16 | w1[0] << 16; + tmp1[1] = w1[0] >> 16 | w1[1] << 16; + tmp1[2] = w1[1] >> 16 | w1[2] << 16; + tmp1[3] = w1[2] >> 16 | w1[3] << 16; + tmp2[0] = w1[3] >> 16; + break; + + case 3: + tmp0[0] = w0[0] << 24; + tmp0[1] = w0[0] >> 8 | w0[1] << 24; + tmp0[2] = w0[1] >> 8 | w0[2] << 24; + tmp0[3] = w0[2] >> 8 | w0[3] << 24; + tmp1[0] = w0[3] >> 8 | w1[0] << 24; + tmp1[1] = w1[0] >> 8 | w1[1] << 24; + tmp1[2] = w1[1] >> 8 | w1[2] << 24; + tmp1[3] = w1[2] >> 8 | w1[3] << 24; + tmp2[0] = w1[3] >> 8; + break; + } + + switch (offset / 4) + { + case 0: + w0[0] = tmp0[0]; + w0[1] = tmp0[1]; + w0[2] = tmp0[2]; + w0[3] = tmp0[3]; + w1[0] = tmp1[0]; + w1[1] = tmp1[1]; + w1[2] = tmp1[2]; + w1[3] = tmp1[3]; + w2[0] = tmp2[0]; + break; + + case 1: + w0[0] = 0; + w0[1] = tmp0[0]; + w0[2] = tmp0[1]; + w0[3] = tmp0[2]; + w1[0] = tmp0[3]; + w1[1] = tmp1[0]; + w1[2] = tmp1[1]; + w1[3] = tmp1[2]; + w2[0] = tmp1[3]; + w2[1] = tmp2[0]; + break; + + case 2: + w0[0] = 0; + w0[1] = 0; + w0[2] = tmp0[0]; + w0[3] = tmp0[1]; + w1[0] = tmp0[2]; + w1[1] = tmp0[3]; + w1[2] = tmp1[0]; + w1[3] = tmp1[1]; + w2[0] = tmp1[2]; + w2[1] = tmp1[3]; + w2[2] = tmp2[0]; + break; + + case 3: + w0[0] = 0; + w0[1] = 0; + w0[2] = 0; + w0[3] = tmp0[0]; + w1[0] = tmp0[1]; + w1[1] = tmp0[2]; + w1[2] = tmp0[3]; + w1[3] = tmp1[0]; + w2[0] = tmp1[1]; + w2[1] = tmp1[2]; + w2[2] = tmp1[3]; + w2[3] = tmp2[0]; + break; + + case 4: + w0[0] = 0; + w0[1] = 0; + w0[2] = 0; + w0[3] = 0; + w1[0] = tmp0[0]; + w1[1] = tmp0[1]; + w1[2] = tmp0[2]; + w1[3] = tmp0[3]; + w2[0] = tmp1[0]; + w2[1] = tmp1[1]; + w2[2] = tmp1[2]; + w2[3] = tmp1[3]; + w3[0] = tmp2[0]; + break; + + case 5: + w0[0] = 0; + w0[1] = 0; + w0[2] = 0; + w0[3] = 0; + w1[0] = 0; + w1[1] = tmp0[0]; + w1[2] = tmp0[1]; + w1[3] = tmp0[2]; + w2[0] = tmp0[3]; + w2[1] = tmp1[0]; + w2[2] = tmp1[1]; + w2[3] = tmp1[2]; + w3[0] = tmp1[3]; + w3[1] = tmp2[0]; + break; + + case 6: + w0[0] = 0; + w0[1] = 0; + w0[2] = 0; + w0[3] = 0; + w1[0] = 0; + w1[1] = 0; + w1[2] = tmp0[0]; + w1[3] = tmp0[1]; + w2[0] = tmp0[2]; + w2[1] = tmp0[3]; + w2[2] = tmp1[0]; + w2[3] = tmp1[1]; + w3[0] = tmp1[2]; + w3[1] = tmp1[3]; + w3[2] = tmp2[0]; + break; + + case 7: + w0[0] = 0; + w0[1] = 0; + w0[2] = 0; + w0[3] = 0; + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = tmp0[0]; + w2[0] = tmp0[1]; + w2[1] = tmp0[2]; + w2[2] = tmp0[3]; + w2[3] = tmp1[0]; + w3[0] = tmp1[1]; + w3[1] = tmp1[2]; + w3[2] = tmp1[3]; + w3[3] = tmp2[0]; + break; + + case 8: + w0[0] = 0; + w0[1] = 0; + w0[2] = 0; + w0[3] = 0; + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + w2[0] = tmp0[0]; + w2[1] = tmp0[1]; + w2[2] = tmp0[2]; + w2[3] = tmp0[3]; + w3[0] = tmp1[0]; + w3[1] = tmp1[1]; + w3[2] = tmp1[2]; + w3[3] = tmp1[3]; + break; + + case 9: + w0[0] = 0; + w0[1] = 0; + w0[2] = 0; + w0[3] = 0; + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + w2[0] = 0; + w2[1] = tmp0[0]; + w2[2] = tmp0[1]; + w2[3] = tmp0[2]; + w3[0] = tmp0[3]; + w3[1] = tmp1[0]; + w3[2] = tmp1[1]; + w3[3] = tmp1[2]; + break; + + case 10: + w0[0] = 0; + w0[1] = 0; + w0[2] = 0; + w0[3] = 0; + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + w2[0] = 0; + w2[1] = 0; + w2[2] = tmp0[0]; + w2[3] = tmp0[1]; + w3[0] = tmp0[2]; + w3[1] = tmp0[3]; + w3[2] = tmp1[0]; + w3[3] = tmp1[1]; + break; + + case 11: + w0[0] = 0; + w0[1] = 0; + w0[2] = 0; + w0[3] = 0; + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = tmp0[0]; + w3[0] = tmp0[1]; + w3[1] = tmp0[2]; + w3[2] = tmp0[3]; + w3[3] = tmp1[0]; + break; + + case 12: + w0[0] = 0; + w0[1] = 0; + w0[2] = 0; + w0[3] = 0; + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + w3[0] = tmp0[0]; + w3[1] = tmp0[1]; + w3[2] = tmp0[2]; + w3[3] = tmp0[3]; + break; + + case 13: + w0[0] = 0; + w0[1] = 0; + w0[2] = 0; + w0[3] = 0; + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + w3[0] = 0; + w3[1] = tmp0[0]; + w3[2] = tmp0[1]; + w3[3] = tmp0[2]; + break; + + } + + #endif +} + +__device__ static void switch_buffer_by_offset_be (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], const u32 offset) +{ + const int selector = (0x76543210 >> ((offset & 3) * 4)) & 0xffff; + + switch (offset / 4) + { + case 0: + w3[1] = __byte_perm (w3[1], w3[0], selector); + w3[0] = __byte_perm (w3[0], w2[3], selector); + w2[3] = __byte_perm (w2[3], w2[2], selector); + w2[2] = __byte_perm (w2[2], w2[1], selector); + w2[1] = __byte_perm (w2[1], w2[0], selector); + w2[0] = __byte_perm (w2[0], w1[3], selector); + w1[3] = __byte_perm (w1[3], w1[2], selector); + w1[2] = __byte_perm (w1[2], w1[1], selector); + w1[1] = __byte_perm (w1[1], w1[0], selector); + w1[0] = __byte_perm (w1[0], w0[3], selector); + w0[3] = __byte_perm (w0[3], w0[2], selector); + w0[2] = __byte_perm (w0[2], w0[1], selector); + w0[1] = __byte_perm (w0[1], w0[0], selector); + w0[0] = __byte_perm (w0[0], 0, selector); + break; + + case 1: + w3[1] = __byte_perm (w3[0], w2[3], selector); + w3[0] = __byte_perm (w2[3], w2[2], selector); + w2[3] = __byte_perm (w2[2], w2[1], selector); + w2[2] = __byte_perm (w2[1], w2[0], selector); + w2[1] = __byte_perm (w2[0], w1[3], selector); + w2[0] = __byte_perm (w1[3], w1[2], selector); + w1[3] = __byte_perm (w1[2], w1[1], selector); + w1[2] = __byte_perm (w1[1], w1[0], selector); + w1[1] = __byte_perm (w1[0], w0[3], selector); + w1[0] = __byte_perm (w0[3], w0[2], selector); + w0[3] = __byte_perm (w0[2], w0[1], selector); + w0[2] = __byte_perm (w0[1], w0[0], selector); + w0[1] = __byte_perm (w0[0], 0, selector); + w0[0] = 0; + break; + + case 2: + w3[1] = __byte_perm (w2[3], w2[2], selector); + w3[0] = __byte_perm (w2[2], w2[1], selector); + w2[3] = __byte_perm (w2[1], w2[0], selector); + w2[2] = __byte_perm (w2[0], w1[3], selector); + w2[1] = __byte_perm (w1[3], w1[2], selector); + w2[0] = __byte_perm (w1[2], w1[1], selector); + w1[3] = __byte_perm (w1[1], w1[0], selector); + w1[2] = __byte_perm (w1[0], w0[3], selector); + w1[1] = __byte_perm (w0[3], w0[2], selector); + w1[0] = __byte_perm (w0[2], w0[1], selector); + w0[3] = __byte_perm (w0[1], w0[0], selector); + w0[2] = __byte_perm (w0[0], 0, selector); + w0[1] = 0; + w0[0] = 0; + break; + + case 3: + w3[1] = __byte_perm (w2[2], w2[1], selector); + w3[0] = __byte_perm (w2[1], w2[0], selector); + w2[3] = __byte_perm (w2[0], w1[3], selector); + w2[2] = __byte_perm (w1[3], w1[2], selector); + w2[1] = __byte_perm (w1[2], w1[1], selector); + w2[0] = __byte_perm (w1[1], w1[0], selector); + w1[3] = __byte_perm (w1[0], w0[3], selector); + w1[2] = __byte_perm (w0[3], w0[2], selector); + w1[1] = __byte_perm (w0[2], w0[1], selector); + w1[0] = __byte_perm (w0[1], w0[0], selector); + w0[3] = __byte_perm (w0[0], 0, selector); + w0[2] = 0; + w0[1] = 0; + w0[0] = 0; + break; + + case 4: + w3[1] = __byte_perm (w2[1], w2[0], selector); + w3[0] = __byte_perm (w2[0], w1[3], selector); + w2[3] = __byte_perm (w1[3], w1[2], selector); + w2[2] = __byte_perm (w1[2], w1[1], selector); + w2[1] = __byte_perm (w1[1], w1[0], selector); + w2[0] = __byte_perm (w1[0], w0[3], selector); + w1[3] = __byte_perm (w0[3], w0[2], selector); + w1[2] = __byte_perm (w0[2], w0[1], selector); + w1[1] = __byte_perm (w0[1], w0[0], selector); + w1[0] = __byte_perm (w0[0], 0, selector); + w0[3] = 0; + w0[2] = 0; + w0[1] = 0; + w0[0] = 0; + break; + + case 5: + w3[1] = __byte_perm (w2[0], w1[3], selector); + w3[0] = __byte_perm (w1[3], w1[2], selector); + w2[3] = __byte_perm (w1[2], w1[1], selector); + w2[2] = __byte_perm (w1[1], w1[0], selector); + w2[1] = __byte_perm (w1[0], w0[3], selector); + w2[0] = __byte_perm (w0[3], w0[2], selector); + w1[3] = __byte_perm (w0[2], w0[1], selector); + w1[2] = __byte_perm (w0[1], w0[0], selector); + w1[1] = __byte_perm (w0[0], 0, selector); + w1[0] = 0; + w0[3] = 0; + w0[2] = 0; + w0[1] = 0; + w0[0] = 0; + break; + + case 6: + w3[1] = __byte_perm (w1[3], w1[2], selector); + w3[0] = __byte_perm (w1[2], w1[1], selector); + w2[3] = __byte_perm (w1[1], w1[0], selector); + w2[2] = __byte_perm (w1[0], w0[3], selector); + w2[1] = __byte_perm (w0[3], w0[2], selector); + w2[0] = __byte_perm (w0[2], w0[1], selector); + w1[3] = __byte_perm (w0[1], w0[0], selector); + w1[2] = __byte_perm (w0[0], 0, selector); + w1[1] = 0; + w1[0] = 0; + w0[3] = 0; + w0[2] = 0; + w0[1] = 0; + w0[0] = 0; + break; + + case 7: + w3[1] = __byte_perm (w1[2], w1[1], selector); + w3[0] = __byte_perm (w1[1], w1[0], selector); + w2[3] = __byte_perm (w1[0], w0[3], selector); + w2[2] = __byte_perm (w0[3], w0[2], selector); + w2[1] = __byte_perm (w0[2], w0[1], selector); + w2[0] = __byte_perm (w0[1], w0[0], selector); + w1[3] = __byte_perm (w0[0], 0, selector); + w1[2] = 0; + w1[1] = 0; + w1[0] = 0; + w0[3] = 0; + w0[2] = 0; + w0[1] = 0; + w0[0] = 0; + break; + + case 8: + w3[1] = __byte_perm (w1[1], w1[0], selector); + w3[0] = __byte_perm (w1[0], w0[3], selector); + w2[3] = __byte_perm (w0[3], w0[2], selector); + w2[2] = __byte_perm (w0[2], w0[1], selector); + w2[1] = __byte_perm (w0[1], w0[0], selector); + w2[0] = __byte_perm (w0[0], 0, selector); + w1[3] = 0; + w1[2] = 0; + w1[1] = 0; + w1[0] = 0; + w0[3] = 0; + w0[2] = 0; + w0[1] = 0; + w0[0] = 0; + break; + + case 9: + w3[1] = __byte_perm (w1[0], w0[3], selector); + w3[0] = __byte_perm (w0[3], w0[2], selector); + w2[3] = __byte_perm (w0[2], w0[1], selector); + w2[2] = __byte_perm (w0[1], w0[0], selector); + w2[1] = __byte_perm (w0[0], 0, selector); + w2[0] = 0; + w1[3] = 0; + w1[2] = 0; + w1[1] = 0; + w1[0] = 0; + w0[3] = 0; + w0[2] = 0; + w0[1] = 0; + w0[0] = 0; + break; + + case 10: + w3[1] = __byte_perm (w0[3], w0[2], selector); + w3[0] = __byte_perm (w0[2], w0[1], selector); + w2[3] = __byte_perm (w0[1], w0[0], selector); + w2[2] = __byte_perm (w0[0], 0, selector); + w2[1] = 0; + w2[0] = 0; + w1[3] = 0; + w1[2] = 0; + w1[1] = 0; + w1[0] = 0; + w0[3] = 0; + w0[2] = 0; + w0[1] = 0; + w0[0] = 0; + break; + + case 11: + w3[1] = __byte_perm (w0[2], w0[1], selector); + w3[0] = __byte_perm (w0[1], w0[0], selector); + w2[3] = __byte_perm (w0[0], 0, selector); + w2[2] = 0; + w2[1] = 0; + w2[0] = 0; + w1[3] = 0; + w1[2] = 0; + w1[1] = 0; + w1[0] = 0; + w0[3] = 0; + w0[2] = 0; + w0[1] = 0; + w0[0] = 0; + break; + + case 12: + w3[1] = __byte_perm (w0[1], w0[0], selector); + w3[0] = __byte_perm (w0[0], 0, selector); + w2[3] = 0; + w2[2] = 0; + w2[1] = 0; + w2[0] = 0; + w1[3] = 0; + w1[2] = 0; + w1[1] = 0; + w1[0] = 0; + w0[3] = 0; + w0[2] = 0; + w0[1] = 0; + w0[0] = 0; + break; + + case 13: + w3[1] = __byte_perm (w0[0], 0, selector); + w3[0] = 0; + w2[3] = 0; + w2[2] = 0; + w2[1] = 0; + w2[0] = 0; + w1[3] = 0; + w1[2] = 0; + w1[1] = 0; + w1[0] = 0; + w0[3] = 0; + w0[2] = 0; + w0[1] = 0; + w0[0] = 0; + break; + } +} + +#endif + +__device__ static u32 check_vector_accessible (const u32 il_pos, const u32 bf_loops, const u32 bfs_cnt, const u32 element) +{ + #ifdef VECT_SIZE1 + + // nothing to do here + + #else + + if ((il_pos + 1) == bf_loops) + { + #ifdef VECT_SIZE2 + u32 bfs_over = bfs_cnt % 2; + + if (bfs_over == 0) bfs_over = 2; + #endif + + #ifdef VECT_SIZE4 + u32 bfs_over = bfs_cnt % 4; + + if (bfs_over == 0) bfs_over = 4; + #endif + + if (element >= bfs_over) return 0; + } + + #endif + + return 1; +} diff --git a/nv/gpu_aes256_nv.c b/nv/gpu_aes256_nv.c new file mode 100644 index 0000000000..825f1919fe --- /dev/null +++ b/nv/gpu_aes256_nv.c @@ -0,0 +1,1048 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +__device__ __constant__ u32 te0[256] = +{ + 0xc66363a5, 0xf87c7c84, 0xee777799, 0xf67b7b8d, + 0xfff2f20d, 0xd66b6bbd, 0xde6f6fb1, 0x91c5c554, + 0x60303050, 0x02010103, 0xce6767a9, 0x562b2b7d, + 0xe7fefe19, 0xb5d7d762, 0x4dababe6, 0xec76769a, + 0x8fcaca45, 0x1f82829d, 0x89c9c940, 0xfa7d7d87, + 0xeffafa15, 0xb25959eb, 0x8e4747c9, 0xfbf0f00b, + 0x41adadec, 0xb3d4d467, 0x5fa2a2fd, 0x45afafea, + 0x239c9cbf, 0x53a4a4f7, 0xe4727296, 0x9bc0c05b, + 0x75b7b7c2, 0xe1fdfd1c, 0x3d9393ae, 0x4c26266a, + 0x6c36365a, 0x7e3f3f41, 0xf5f7f702, 0x83cccc4f, + 0x6834345c, 0x51a5a5f4, 0xd1e5e534, 0xf9f1f108, + 0xe2717193, 0xabd8d873, 0x62313153, 0x2a15153f, + 0x0804040c, 0x95c7c752, 0x46232365, 0x9dc3c35e, + 0x30181828, 0x379696a1, 0x0a05050f, 0x2f9a9ab5, + 0x0e070709, 0x24121236, 0x1b80809b, 0xdfe2e23d, + 0xcdebeb26, 0x4e272769, 0x7fb2b2cd, 0xea75759f, + 0x1209091b, 0x1d83839e, 0x582c2c74, 0x341a1a2e, + 0x361b1b2d, 0xdc6e6eb2, 0xb45a5aee, 0x5ba0a0fb, + 0xa45252f6, 0x763b3b4d, 0xb7d6d661, 0x7db3b3ce, + 0x5229297b, 0xdde3e33e, 0x5e2f2f71, 0x13848497, + 0xa65353f5, 0xb9d1d168, 0x00000000, 0xc1eded2c, + 0x40202060, 0xe3fcfc1f, 0x79b1b1c8, 0xb65b5bed, + 0xd46a6abe, 0x8dcbcb46, 0x67bebed9, 0x7239394b, + 0x944a4ade, 0x984c4cd4, 0xb05858e8, 0x85cfcf4a, + 0xbbd0d06b, 0xc5efef2a, 0x4faaaae5, 0xedfbfb16, + 0x864343c5, 0x9a4d4dd7, 0x66333355, 0x11858594, + 0x8a4545cf, 0xe9f9f910, 0x04020206, 0xfe7f7f81, + 0xa05050f0, 0x783c3c44, 0x259f9fba, 0x4ba8a8e3, + 0xa25151f3, 0x5da3a3fe, 0x804040c0, 0x058f8f8a, + 0x3f9292ad, 0x219d9dbc, 0x70383848, 0xf1f5f504, + 0x63bcbcdf, 0x77b6b6c1, 0xafdada75, 0x42212163, + 0x20101030, 0xe5ffff1a, 0xfdf3f30e, 0xbfd2d26d, + 0x81cdcd4c, 0x180c0c14, 0x26131335, 0xc3ecec2f, + 0xbe5f5fe1, 0x359797a2, 0x884444cc, 0x2e171739, + 0x93c4c457, 0x55a7a7f2, 0xfc7e7e82, 0x7a3d3d47, + 0xc86464ac, 0xba5d5de7, 0x3219192b, 0xe6737395, + 0xc06060a0, 0x19818198, 0x9e4f4fd1, 0xa3dcdc7f, + 0x44222266, 0x542a2a7e, 0x3b9090ab, 0x0b888883, + 0x8c4646ca, 0xc7eeee29, 0x6bb8b8d3, 0x2814143c, + 0xa7dede79, 0xbc5e5ee2, 0x160b0b1d, 0xaddbdb76, + 0xdbe0e03b, 0x64323256, 0x743a3a4e, 0x140a0a1e, + 0x924949db, 0x0c06060a, 0x4824246c, 0xb85c5ce4, + 0x9fc2c25d, 0xbdd3d36e, 0x43acacef, 0xc46262a6, + 0x399191a8, 0x319595a4, 0xd3e4e437, 0xf279798b, + 0xd5e7e732, 0x8bc8c843, 0x6e373759, 0xda6d6db7, + 0x018d8d8c, 0xb1d5d564, 0x9c4e4ed2, 0x49a9a9e0, + 0xd86c6cb4, 0xac5656fa, 0xf3f4f407, 0xcfeaea25, + 0xca6565af, 0xf47a7a8e, 0x47aeaee9, 0x10080818, + 0x6fbabad5, 0xf0787888, 0x4a25256f, 0x5c2e2e72, + 0x381c1c24, 0x57a6a6f1, 0x73b4b4c7, 0x97c6c651, + 0xcbe8e823, 0xa1dddd7c, 0xe874749c, 0x3e1f1f21, + 0x964b4bdd, 0x61bdbddc, 0x0d8b8b86, 0x0f8a8a85, + 0xe0707090, 0x7c3e3e42, 0x71b5b5c4, 0xcc6666aa, + 0x904848d8, 0x06030305, 0xf7f6f601, 0x1c0e0e12, + 0xc26161a3, 0x6a35355f, 0xae5757f9, 0x69b9b9d0, + 0x17868691, 0x99c1c158, 0x3a1d1d27, 0x279e9eb9, + 0xd9e1e138, 0xebf8f813, 0x2b9898b3, 0x22111133, + 0xd26969bb, 0xa9d9d970, 0x078e8e89, 0x339494a7, + 0x2d9b9bb6, 0x3c1e1e22, 0x15878792, 0xc9e9e920, + 0x87cece49, 0xaa5555ff, 0x50282878, 0xa5dfdf7a, + 0x038c8c8f, 0x59a1a1f8, 0x09898980, 0x1a0d0d17, + 0x65bfbfda, 0xd7e6e631, 0x844242c6, 0xd06868b8, + 0x824141c3, 0x299999b0, 0x5a2d2d77, 0x1e0f0f11, + 0x7bb0b0cb, 0xa85454fc, 0x6dbbbbd6, 0x2c16163a, +}; + +__device__ __constant__ u32 te1[256] = +{ + 0xa5c66363, 0x84f87c7c, 0x99ee7777, 0x8df67b7b, + 0x0dfff2f2, 0xbdd66b6b, 0xb1de6f6f, 0x5491c5c5, + 0x50603030, 0x03020101, 0xa9ce6767, 0x7d562b2b, + 0x19e7fefe, 0x62b5d7d7, 0xe64dabab, 0x9aec7676, + 0x458fcaca, 0x9d1f8282, 0x4089c9c9, 0x87fa7d7d, + 0x15effafa, 0xebb25959, 0xc98e4747, 0x0bfbf0f0, + 0xec41adad, 0x67b3d4d4, 0xfd5fa2a2, 0xea45afaf, + 0xbf239c9c, 0xf753a4a4, 0x96e47272, 0x5b9bc0c0, + 0xc275b7b7, 0x1ce1fdfd, 0xae3d9393, 0x6a4c2626, + 0x5a6c3636, 0x417e3f3f, 0x02f5f7f7, 0x4f83cccc, + 0x5c683434, 0xf451a5a5, 0x34d1e5e5, 0x08f9f1f1, + 0x93e27171, 0x73abd8d8, 0x53623131, 0x3f2a1515, + 0x0c080404, 0x5295c7c7, 0x65462323, 0x5e9dc3c3, + 0x28301818, 0xa1379696, 0x0f0a0505, 0xb52f9a9a, + 0x090e0707, 0x36241212, 0x9b1b8080, 0x3ddfe2e2, + 0x26cdebeb, 0x694e2727, 0xcd7fb2b2, 0x9fea7575, + 0x1b120909, 0x9e1d8383, 0x74582c2c, 0x2e341a1a, + 0x2d361b1b, 0xb2dc6e6e, 0xeeb45a5a, 0xfb5ba0a0, + 0xf6a45252, 0x4d763b3b, 0x61b7d6d6, 0xce7db3b3, + 0x7b522929, 0x3edde3e3, 0x715e2f2f, 0x97138484, + 0xf5a65353, 0x68b9d1d1, 0x00000000, 0x2cc1eded, + 0x60402020, 0x1fe3fcfc, 0xc879b1b1, 0xedb65b5b, + 0xbed46a6a, 0x468dcbcb, 0xd967bebe, 0x4b723939, + 0xde944a4a, 0xd4984c4c, 0xe8b05858, 0x4a85cfcf, + 0x6bbbd0d0, 0x2ac5efef, 0xe54faaaa, 0x16edfbfb, + 0xc5864343, 0xd79a4d4d, 0x55663333, 0x94118585, + 0xcf8a4545, 0x10e9f9f9, 0x06040202, 0x81fe7f7f, + 0xf0a05050, 0x44783c3c, 0xba259f9f, 0xe34ba8a8, + 0xf3a25151, 0xfe5da3a3, 0xc0804040, 0x8a058f8f, + 0xad3f9292, 0xbc219d9d, 0x48703838, 0x04f1f5f5, + 0xdf63bcbc, 0xc177b6b6, 0x75afdada, 0x63422121, + 0x30201010, 0x1ae5ffff, 0x0efdf3f3, 0x6dbfd2d2, + 0x4c81cdcd, 0x14180c0c, 0x35261313, 0x2fc3ecec, + 0xe1be5f5f, 0xa2359797, 0xcc884444, 0x392e1717, + 0x5793c4c4, 0xf255a7a7, 0x82fc7e7e, 0x477a3d3d, + 0xacc86464, 0xe7ba5d5d, 0x2b321919, 0x95e67373, + 0xa0c06060, 0x98198181, 0xd19e4f4f, 0x7fa3dcdc, + 0x66442222, 0x7e542a2a, 0xab3b9090, 0x830b8888, + 0xca8c4646, 0x29c7eeee, 0xd36bb8b8, 0x3c281414, + 0x79a7dede, 0xe2bc5e5e, 0x1d160b0b, 0x76addbdb, + 0x3bdbe0e0, 0x56643232, 0x4e743a3a, 0x1e140a0a, + 0xdb924949, 0x0a0c0606, 0x6c482424, 0xe4b85c5c, + 0x5d9fc2c2, 0x6ebdd3d3, 0xef43acac, 0xa6c46262, + 0xa8399191, 0xa4319595, 0x37d3e4e4, 0x8bf27979, + 0x32d5e7e7, 0x438bc8c8, 0x596e3737, 0xb7da6d6d, + 0x8c018d8d, 0x64b1d5d5, 0xd29c4e4e, 0xe049a9a9, + 0xb4d86c6c, 0xfaac5656, 0x07f3f4f4, 0x25cfeaea, + 0xafca6565, 0x8ef47a7a, 0xe947aeae, 0x18100808, + 0xd56fbaba, 0x88f07878, 0x6f4a2525, 0x725c2e2e, + 0x24381c1c, 0xf157a6a6, 0xc773b4b4, 0x5197c6c6, + 0x23cbe8e8, 0x7ca1dddd, 0x9ce87474, 0x213e1f1f, + 0xdd964b4b, 0xdc61bdbd, 0x860d8b8b, 0x850f8a8a, + 0x90e07070, 0x427c3e3e, 0xc471b5b5, 0xaacc6666, + 0xd8904848, 0x05060303, 0x01f7f6f6, 0x121c0e0e, + 0xa3c26161, 0x5f6a3535, 0xf9ae5757, 0xd069b9b9, + 0x91178686, 0x5899c1c1, 0x273a1d1d, 0xb9279e9e, + 0x38d9e1e1, 0x13ebf8f8, 0xb32b9898, 0x33221111, + 0xbbd26969, 0x70a9d9d9, 0x89078e8e, 0xa7339494, + 0xb62d9b9b, 0x223c1e1e, 0x92158787, 0x20c9e9e9, + 0x4987cece, 0xffaa5555, 0x78502828, 0x7aa5dfdf, + 0x8f038c8c, 0xf859a1a1, 0x80098989, 0x171a0d0d, + 0xda65bfbf, 0x31d7e6e6, 0xc6844242, 0xb8d06868, + 0xc3824141, 0xb0299999, 0x775a2d2d, 0x111e0f0f, + 0xcb7bb0b0, 0xfca85454, 0xd66dbbbb, 0x3a2c1616, +}; + +__device__ __constant__ u32 te2[256] = +{ + 0x63a5c663, 0x7c84f87c, 0x7799ee77, 0x7b8df67b, + 0xf20dfff2, 0x6bbdd66b, 0x6fb1de6f, 0xc55491c5, + 0x30506030, 0x01030201, 0x67a9ce67, 0x2b7d562b, + 0xfe19e7fe, 0xd762b5d7, 0xabe64dab, 0x769aec76, + 0xca458fca, 0x829d1f82, 0xc94089c9, 0x7d87fa7d, + 0xfa15effa, 0x59ebb259, 0x47c98e47, 0xf00bfbf0, + 0xadec41ad, 0xd467b3d4, 0xa2fd5fa2, 0xafea45af, + 0x9cbf239c, 0xa4f753a4, 0x7296e472, 0xc05b9bc0, + 0xb7c275b7, 0xfd1ce1fd, 0x93ae3d93, 0x266a4c26, + 0x365a6c36, 0x3f417e3f, 0xf702f5f7, 0xcc4f83cc, + 0x345c6834, 0xa5f451a5, 0xe534d1e5, 0xf108f9f1, + 0x7193e271, 0xd873abd8, 0x31536231, 0x153f2a15, + 0x040c0804, 0xc75295c7, 0x23654623, 0xc35e9dc3, + 0x18283018, 0x96a13796, 0x050f0a05, 0x9ab52f9a, + 0x07090e07, 0x12362412, 0x809b1b80, 0xe23ddfe2, + 0xeb26cdeb, 0x27694e27, 0xb2cd7fb2, 0x759fea75, + 0x091b1209, 0x839e1d83, 0x2c74582c, 0x1a2e341a, + 0x1b2d361b, 0x6eb2dc6e, 0x5aeeb45a, 0xa0fb5ba0, + 0x52f6a452, 0x3b4d763b, 0xd661b7d6, 0xb3ce7db3, + 0x297b5229, 0xe33edde3, 0x2f715e2f, 0x84971384, + 0x53f5a653, 0xd168b9d1, 0x00000000, 0xed2cc1ed, + 0x20604020, 0xfc1fe3fc, 0xb1c879b1, 0x5bedb65b, + 0x6abed46a, 0xcb468dcb, 0xbed967be, 0x394b7239, + 0x4ade944a, 0x4cd4984c, 0x58e8b058, 0xcf4a85cf, + 0xd06bbbd0, 0xef2ac5ef, 0xaae54faa, 0xfb16edfb, + 0x43c58643, 0x4dd79a4d, 0x33556633, 0x85941185, + 0x45cf8a45, 0xf910e9f9, 0x02060402, 0x7f81fe7f, + 0x50f0a050, 0x3c44783c, 0x9fba259f, 0xa8e34ba8, + 0x51f3a251, 0xa3fe5da3, 0x40c08040, 0x8f8a058f, + 0x92ad3f92, 0x9dbc219d, 0x38487038, 0xf504f1f5, + 0xbcdf63bc, 0xb6c177b6, 0xda75afda, 0x21634221, + 0x10302010, 0xff1ae5ff, 0xf30efdf3, 0xd26dbfd2, + 0xcd4c81cd, 0x0c14180c, 0x13352613, 0xec2fc3ec, + 0x5fe1be5f, 0x97a23597, 0x44cc8844, 0x17392e17, + 0xc45793c4, 0xa7f255a7, 0x7e82fc7e, 0x3d477a3d, + 0x64acc864, 0x5de7ba5d, 0x192b3219, 0x7395e673, + 0x60a0c060, 0x81981981, 0x4fd19e4f, 0xdc7fa3dc, + 0x22664422, 0x2a7e542a, 0x90ab3b90, 0x88830b88, + 0x46ca8c46, 0xee29c7ee, 0xb8d36bb8, 0x143c2814, + 0xde79a7de, 0x5ee2bc5e, 0x0b1d160b, 0xdb76addb, + 0xe03bdbe0, 0x32566432, 0x3a4e743a, 0x0a1e140a, + 0x49db9249, 0x060a0c06, 0x246c4824, 0x5ce4b85c, + 0xc25d9fc2, 0xd36ebdd3, 0xacef43ac, 0x62a6c462, + 0x91a83991, 0x95a43195, 0xe437d3e4, 0x798bf279, + 0xe732d5e7, 0xc8438bc8, 0x37596e37, 0x6db7da6d, + 0x8d8c018d, 0xd564b1d5, 0x4ed29c4e, 0xa9e049a9, + 0x6cb4d86c, 0x56faac56, 0xf407f3f4, 0xea25cfea, + 0x65afca65, 0x7a8ef47a, 0xaee947ae, 0x08181008, + 0xbad56fba, 0x7888f078, 0x256f4a25, 0x2e725c2e, + 0x1c24381c, 0xa6f157a6, 0xb4c773b4, 0xc65197c6, + 0xe823cbe8, 0xdd7ca1dd, 0x749ce874, 0x1f213e1f, + 0x4bdd964b, 0xbddc61bd, 0x8b860d8b, 0x8a850f8a, + 0x7090e070, 0x3e427c3e, 0xb5c471b5, 0x66aacc66, + 0x48d89048, 0x03050603, 0xf601f7f6, 0x0e121c0e, + 0x61a3c261, 0x355f6a35, 0x57f9ae57, 0xb9d069b9, + 0x86911786, 0xc15899c1, 0x1d273a1d, 0x9eb9279e, + 0xe138d9e1, 0xf813ebf8, 0x98b32b98, 0x11332211, + 0x69bbd269, 0xd970a9d9, 0x8e89078e, 0x94a73394, + 0x9bb62d9b, 0x1e223c1e, 0x87921587, 0xe920c9e9, + 0xce4987ce, 0x55ffaa55, 0x28785028, 0xdf7aa5df, + 0x8c8f038c, 0xa1f859a1, 0x89800989, 0x0d171a0d, + 0xbfda65bf, 0xe631d7e6, 0x42c68442, 0x68b8d068, + 0x41c38241, 0x99b02999, 0x2d775a2d, 0x0f111e0f, + 0xb0cb7bb0, 0x54fca854, 0xbbd66dbb, 0x163a2c16, +}; + +__device__ __constant__ u32 te3[256] = +{ + 0x6363a5c6, 0x7c7c84f8, 0x777799ee, 0x7b7b8df6, + 0xf2f20dff, 0x6b6bbdd6, 0x6f6fb1de, 0xc5c55491, + 0x30305060, 0x01010302, 0x6767a9ce, 0x2b2b7d56, + 0xfefe19e7, 0xd7d762b5, 0xababe64d, 0x76769aec, + 0xcaca458f, 0x82829d1f, 0xc9c94089, 0x7d7d87fa, + 0xfafa15ef, 0x5959ebb2, 0x4747c98e, 0xf0f00bfb, + 0xadadec41, 0xd4d467b3, 0xa2a2fd5f, 0xafafea45, + 0x9c9cbf23, 0xa4a4f753, 0x727296e4, 0xc0c05b9b, + 0xb7b7c275, 0xfdfd1ce1, 0x9393ae3d, 0x26266a4c, + 0x36365a6c, 0x3f3f417e, 0xf7f702f5, 0xcccc4f83, + 0x34345c68, 0xa5a5f451, 0xe5e534d1, 0xf1f108f9, + 0x717193e2, 0xd8d873ab, 0x31315362, 0x15153f2a, + 0x04040c08, 0xc7c75295, 0x23236546, 0xc3c35e9d, + 0x18182830, 0x9696a137, 0x05050f0a, 0x9a9ab52f, + 0x0707090e, 0x12123624, 0x80809b1b, 0xe2e23ddf, + 0xebeb26cd, 0x2727694e, 0xb2b2cd7f, 0x75759fea, + 0x09091b12, 0x83839e1d, 0x2c2c7458, 0x1a1a2e34, + 0x1b1b2d36, 0x6e6eb2dc, 0x5a5aeeb4, 0xa0a0fb5b, + 0x5252f6a4, 0x3b3b4d76, 0xd6d661b7, 0xb3b3ce7d, + 0x29297b52, 0xe3e33edd, 0x2f2f715e, 0x84849713, + 0x5353f5a6, 0xd1d168b9, 0x00000000, 0xeded2cc1, + 0x20206040, 0xfcfc1fe3, 0xb1b1c879, 0x5b5bedb6, + 0x6a6abed4, 0xcbcb468d, 0xbebed967, 0x39394b72, + 0x4a4ade94, 0x4c4cd498, 0x5858e8b0, 0xcfcf4a85, + 0xd0d06bbb, 0xefef2ac5, 0xaaaae54f, 0xfbfb16ed, + 0x4343c586, 0x4d4dd79a, 0x33335566, 0x85859411, + 0x4545cf8a, 0xf9f910e9, 0x02020604, 0x7f7f81fe, + 0x5050f0a0, 0x3c3c4478, 0x9f9fba25, 0xa8a8e34b, + 0x5151f3a2, 0xa3a3fe5d, 0x4040c080, 0x8f8f8a05, + 0x9292ad3f, 0x9d9dbc21, 0x38384870, 0xf5f504f1, + 0xbcbcdf63, 0xb6b6c177, 0xdada75af, 0x21216342, + 0x10103020, 0xffff1ae5, 0xf3f30efd, 0xd2d26dbf, + 0xcdcd4c81, 0x0c0c1418, 0x13133526, 0xecec2fc3, + 0x5f5fe1be, 0x9797a235, 0x4444cc88, 0x1717392e, + 0xc4c45793, 0xa7a7f255, 0x7e7e82fc, 0x3d3d477a, + 0x6464acc8, 0x5d5de7ba, 0x19192b32, 0x737395e6, + 0x6060a0c0, 0x81819819, 0x4f4fd19e, 0xdcdc7fa3, + 0x22226644, 0x2a2a7e54, 0x9090ab3b, 0x8888830b, + 0x4646ca8c, 0xeeee29c7, 0xb8b8d36b, 0x14143c28, + 0xdede79a7, 0x5e5ee2bc, 0x0b0b1d16, 0xdbdb76ad, + 0xe0e03bdb, 0x32325664, 0x3a3a4e74, 0x0a0a1e14, + 0x4949db92, 0x06060a0c, 0x24246c48, 0x5c5ce4b8, + 0xc2c25d9f, 0xd3d36ebd, 0xacacef43, 0x6262a6c4, + 0x9191a839, 0x9595a431, 0xe4e437d3, 0x79798bf2, + 0xe7e732d5, 0xc8c8438b, 0x3737596e, 0x6d6db7da, + 0x8d8d8c01, 0xd5d564b1, 0x4e4ed29c, 0xa9a9e049, + 0x6c6cb4d8, 0x5656faac, 0xf4f407f3, 0xeaea25cf, + 0x6565afca, 0x7a7a8ef4, 0xaeaee947, 0x08081810, + 0xbabad56f, 0x787888f0, 0x25256f4a, 0x2e2e725c, + 0x1c1c2438, 0xa6a6f157, 0xb4b4c773, 0xc6c65197, + 0xe8e823cb, 0xdddd7ca1, 0x74749ce8, 0x1f1f213e, + 0x4b4bdd96, 0xbdbddc61, 0x8b8b860d, 0x8a8a850f, + 0x707090e0, 0x3e3e427c, 0xb5b5c471, 0x6666aacc, + 0x4848d890, 0x03030506, 0xf6f601f7, 0x0e0e121c, + 0x6161a3c2, 0x35355f6a, 0x5757f9ae, 0xb9b9d069, + 0x86869117, 0xc1c15899, 0x1d1d273a, 0x9e9eb927, + 0xe1e138d9, 0xf8f813eb, 0x9898b32b, 0x11113322, + 0x6969bbd2, 0xd9d970a9, 0x8e8e8907, 0x9494a733, + 0x9b9bb62d, 0x1e1e223c, 0x87879215, 0xe9e920c9, + 0xcece4987, 0x5555ffaa, 0x28287850, 0xdfdf7aa5, + 0x8c8c8f03, 0xa1a1f859, 0x89898009, 0x0d0d171a, + 0xbfbfda65, 0xe6e631d7, 0x4242c684, 0x6868b8d0, + 0x4141c382, 0x9999b029, 0x2d2d775a, 0x0f0f111e, + 0xb0b0cb7b, 0x5454fca8, 0xbbbbd66d, 0x16163a2c, +}; + +__device__ __constant__ u32 te4[256] = +{ + 0x63636363, 0x7c7c7c7c, 0x77777777, 0x7b7b7b7b, + 0xf2f2f2f2, 0x6b6b6b6b, 0x6f6f6f6f, 0xc5c5c5c5, + 0x30303030, 0x01010101, 0x67676767, 0x2b2b2b2b, + 0xfefefefe, 0xd7d7d7d7, 0xabababab, 0x76767676, + 0xcacacaca, 0x82828282, 0xc9c9c9c9, 0x7d7d7d7d, + 0xfafafafa, 0x59595959, 0x47474747, 0xf0f0f0f0, + 0xadadadad, 0xd4d4d4d4, 0xa2a2a2a2, 0xafafafaf, + 0x9c9c9c9c, 0xa4a4a4a4, 0x72727272, 0xc0c0c0c0, + 0xb7b7b7b7, 0xfdfdfdfd, 0x93939393, 0x26262626, + 0x36363636, 0x3f3f3f3f, 0xf7f7f7f7, 0xcccccccc, + 0x34343434, 0xa5a5a5a5, 0xe5e5e5e5, 0xf1f1f1f1, + 0x71717171, 0xd8d8d8d8, 0x31313131, 0x15151515, + 0x04040404, 0xc7c7c7c7, 0x23232323, 0xc3c3c3c3, + 0x18181818, 0x96969696, 0x05050505, 0x9a9a9a9a, + 0x07070707, 0x12121212, 0x80808080, 0xe2e2e2e2, + 0xebebebeb, 0x27272727, 0xb2b2b2b2, 0x75757575, + 0x09090909, 0x83838383, 0x2c2c2c2c, 0x1a1a1a1a, + 0x1b1b1b1b, 0x6e6e6e6e, 0x5a5a5a5a, 0xa0a0a0a0, + 0x52525252, 0x3b3b3b3b, 0xd6d6d6d6, 0xb3b3b3b3, + 0x29292929, 0xe3e3e3e3, 0x2f2f2f2f, 0x84848484, + 0x53535353, 0xd1d1d1d1, 0x00000000, 0xedededed, + 0x20202020, 0xfcfcfcfc, 0xb1b1b1b1, 0x5b5b5b5b, + 0x6a6a6a6a, 0xcbcbcbcb, 0xbebebebe, 0x39393939, + 0x4a4a4a4a, 0x4c4c4c4c, 0x58585858, 0xcfcfcfcf, + 0xd0d0d0d0, 0xefefefef, 0xaaaaaaaa, 0xfbfbfbfb, + 0x43434343, 0x4d4d4d4d, 0x33333333, 0x85858585, + 0x45454545, 0xf9f9f9f9, 0x02020202, 0x7f7f7f7f, + 0x50505050, 0x3c3c3c3c, 0x9f9f9f9f, 0xa8a8a8a8, + 0x51515151, 0xa3a3a3a3, 0x40404040, 0x8f8f8f8f, + 0x92929292, 0x9d9d9d9d, 0x38383838, 0xf5f5f5f5, + 0xbcbcbcbc, 0xb6b6b6b6, 0xdadadada, 0x21212121, + 0x10101010, 0xffffffff, 0xf3f3f3f3, 0xd2d2d2d2, + 0xcdcdcdcd, 0x0c0c0c0c, 0x13131313, 0xecececec, + 0x5f5f5f5f, 0x97979797, 0x44444444, 0x17171717, + 0xc4c4c4c4, 0xa7a7a7a7, 0x7e7e7e7e, 0x3d3d3d3d, + 0x64646464, 0x5d5d5d5d, 0x19191919, 0x73737373, + 0x60606060, 0x81818181, 0x4f4f4f4f, 0xdcdcdcdc, + 0x22222222, 0x2a2a2a2a, 0x90909090, 0x88888888, + 0x46464646, 0xeeeeeeee, 0xb8b8b8b8, 0x14141414, + 0xdededede, 0x5e5e5e5e, 0x0b0b0b0b, 0xdbdbdbdb, + 0xe0e0e0e0, 0x32323232, 0x3a3a3a3a, 0x0a0a0a0a, + 0x49494949, 0x06060606, 0x24242424, 0x5c5c5c5c, + 0xc2c2c2c2, 0xd3d3d3d3, 0xacacacac, 0x62626262, + 0x91919191, 0x95959595, 0xe4e4e4e4, 0x79797979, + 0xe7e7e7e7, 0xc8c8c8c8, 0x37373737, 0x6d6d6d6d, + 0x8d8d8d8d, 0xd5d5d5d5, 0x4e4e4e4e, 0xa9a9a9a9, + 0x6c6c6c6c, 0x56565656, 0xf4f4f4f4, 0xeaeaeaea, + 0x65656565, 0x7a7a7a7a, 0xaeaeaeae, 0x08080808, + 0xbabababa, 0x78787878, 0x25252525, 0x2e2e2e2e, + 0x1c1c1c1c, 0xa6a6a6a6, 0xb4b4b4b4, 0xc6c6c6c6, + 0xe8e8e8e8, 0xdddddddd, 0x74747474, 0x1f1f1f1f, + 0x4b4b4b4b, 0xbdbdbdbd, 0x8b8b8b8b, 0x8a8a8a8a, + 0x70707070, 0x3e3e3e3e, 0xb5b5b5b5, 0x66666666, + 0x48484848, 0x03030303, 0xf6f6f6f6, 0x0e0e0e0e, + 0x61616161, 0x35353535, 0x57575757, 0xb9b9b9b9, + 0x86868686, 0xc1c1c1c1, 0x1d1d1d1d, 0x9e9e9e9e, + 0xe1e1e1e1, 0xf8f8f8f8, 0x98989898, 0x11111111, + 0x69696969, 0xd9d9d9d9, 0x8e8e8e8e, 0x94949494, + 0x9b9b9b9b, 0x1e1e1e1e, 0x87878787, 0xe9e9e9e9, + 0xcececece, 0x55555555, 0x28282828, 0xdfdfdfdf, + 0x8c8c8c8c, 0xa1a1a1a1, 0x89898989, 0x0d0d0d0d, + 0xbfbfbfbf, 0xe6e6e6e6, 0x42424242, 0x68686868, + 0x41414141, 0x99999999, 0x2d2d2d2d, 0x0f0f0f0f, + 0xb0b0b0b0, 0x54545454, 0xbbbbbbbb, 0x16161616, +}; + +__device__ __constant__ u32 td0[256] = +{ + 0x51f4a750, 0x7e416553, 0x1a17a4c3, 0x3a275e96, + 0x3bab6bcb, 0x1f9d45f1, 0xacfa58ab, 0x4be30393, + 0x2030fa55, 0xad766df6, 0x88cc7691, 0xf5024c25, + 0x4fe5d7fc, 0xc52acbd7, 0x26354480, 0xb562a38f, + 0xdeb15a49, 0x25ba1b67, 0x45ea0e98, 0x5dfec0e1, + 0xc32f7502, 0x814cf012, 0x8d4697a3, 0x6bd3f9c6, + 0x038f5fe7, 0x15929c95, 0xbf6d7aeb, 0x955259da, + 0xd4be832d, 0x587421d3, 0x49e06929, 0x8ec9c844, + 0x75c2896a, 0xf48e7978, 0x99583e6b, 0x27b971dd, + 0xbee14fb6, 0xf088ad17, 0xc920ac66, 0x7dce3ab4, + 0x63df4a18, 0xe51a3182, 0x97513360, 0x62537f45, + 0xb16477e0, 0xbb6bae84, 0xfe81a01c, 0xf9082b94, + 0x70486858, 0x8f45fd19, 0x94de6c87, 0x527bf8b7, + 0xab73d323, 0x724b02e2, 0xe31f8f57, 0x6655ab2a, + 0xb2eb2807, 0x2fb5c203, 0x86c57b9a, 0xd33708a5, + 0x302887f2, 0x23bfa5b2, 0x02036aba, 0xed16825c, + 0x8acf1c2b, 0xa779b492, 0xf307f2f0, 0x4e69e2a1, + 0x65daf4cd, 0x0605bed5, 0xd134621f, 0xc4a6fe8a, + 0x342e539d, 0xa2f355a0, 0x058ae132, 0xa4f6eb75, + 0x0b83ec39, 0x4060efaa, 0x5e719f06, 0xbd6e1051, + 0x3e218af9, 0x96dd063d, 0xdd3e05ae, 0x4de6bd46, + 0x91548db5, 0x71c45d05, 0x0406d46f, 0x605015ff, + 0x1998fb24, 0xd6bde997, 0x894043cc, 0x67d99e77, + 0xb0e842bd, 0x07898b88, 0xe7195b38, 0x79c8eedb, + 0xa17c0a47, 0x7c420fe9, 0xf8841ec9, 0x00000000, + 0x09808683, 0x322bed48, 0x1e1170ac, 0x6c5a724e, + 0xfd0efffb, 0x0f853856, 0x3daed51e, 0x362d3927, + 0x0a0fd964, 0x685ca621, 0x9b5b54d1, 0x24362e3a, + 0x0c0a67b1, 0x9357e70f, 0xb4ee96d2, 0x1b9b919e, + 0x80c0c54f, 0x61dc20a2, 0x5a774b69, 0x1c121a16, + 0xe293ba0a, 0xc0a02ae5, 0x3c22e043, 0x121b171d, + 0x0e090d0b, 0xf28bc7ad, 0x2db6a8b9, 0x141ea9c8, + 0x57f11985, 0xaf75074c, 0xee99ddbb, 0xa37f60fd, + 0xf701269f, 0x5c72f5bc, 0x44663bc5, 0x5bfb7e34, + 0x8b432976, 0xcb23c6dc, 0xb6edfc68, 0xb8e4f163, + 0xd731dcca, 0x42638510, 0x13972240, 0x84c61120, + 0x854a247d, 0xd2bb3df8, 0xaef93211, 0xc729a16d, + 0x1d9e2f4b, 0xdcb230f3, 0x0d8652ec, 0x77c1e3d0, + 0x2bb3166c, 0xa970b999, 0x119448fa, 0x47e96422, + 0xa8fc8cc4, 0xa0f03f1a, 0x567d2cd8, 0x223390ef, + 0x87494ec7, 0xd938d1c1, 0x8ccaa2fe, 0x98d40b36, + 0xa6f581cf, 0xa57ade28, 0xdab78e26, 0x3fadbfa4, + 0x2c3a9de4, 0x5078920d, 0x6a5fcc9b, 0x547e4662, + 0xf68d13c2, 0x90d8b8e8, 0x2e39f75e, 0x82c3aff5, + 0x9f5d80be, 0x69d0937c, 0x6fd52da9, 0xcf2512b3, + 0xc8ac993b, 0x10187da7, 0xe89c636e, 0xdb3bbb7b, + 0xcd267809, 0x6e5918f4, 0xec9ab701, 0x834f9aa8, + 0xe6956e65, 0xaaffe67e, 0x21bccf08, 0xef15e8e6, + 0xbae79bd9, 0x4a6f36ce, 0xea9f09d4, 0x29b07cd6, + 0x31a4b2af, 0x2a3f2331, 0xc6a59430, 0x35a266c0, + 0x744ebc37, 0xfc82caa6, 0xe090d0b0, 0x33a7d815, + 0xf104984a, 0x41ecdaf7, 0x7fcd500e, 0x1791f62f, + 0x764dd68d, 0x43efb04d, 0xccaa4d54, 0xe49604df, + 0x9ed1b5e3, 0x4c6a881b, 0xc12c1fb8, 0x4665517f, + 0x9d5eea04, 0x018c355d, 0xfa877473, 0xfb0b412e, + 0xb3671d5a, 0x92dbd252, 0xe9105633, 0x6dd64713, + 0x9ad7618c, 0x37a10c7a, 0x59f8148e, 0xeb133c89, + 0xcea927ee, 0xb761c935, 0xe11ce5ed, 0x7a47b13c, + 0x9cd2df59, 0x55f2733f, 0x1814ce79, 0x73c737bf, + 0x53f7cdea, 0x5ffdaa5b, 0xdf3d6f14, 0x7844db86, + 0xcaaff381, 0xb968c43e, 0x3824342c, 0xc2a3405f, + 0x161dc372, 0xbce2250c, 0x283c498b, 0xff0d9541, + 0x39a80171, 0x080cb3de, 0xd8b4e49c, 0x6456c190, + 0x7bcb8461, 0xd532b670, 0x486c5c74, 0xd0b85742, +}; + +__device__ __constant__ u32 td1[256] = +{ + 0x5051f4a7, 0x537e4165, 0xc31a17a4, 0x963a275e, + 0xcb3bab6b, 0xf11f9d45, 0xabacfa58, 0x934be303, + 0x552030fa, 0xf6ad766d, 0x9188cc76, 0x25f5024c, + 0xfc4fe5d7, 0xd7c52acb, 0x80263544, 0x8fb562a3, + 0x49deb15a, 0x6725ba1b, 0x9845ea0e, 0xe15dfec0, + 0x02c32f75, 0x12814cf0, 0xa38d4697, 0xc66bd3f9, + 0xe7038f5f, 0x9515929c, 0xebbf6d7a, 0xda955259, + 0x2dd4be83, 0xd3587421, 0x2949e069, 0x448ec9c8, + 0x6a75c289, 0x78f48e79, 0x6b99583e, 0xdd27b971, + 0xb6bee14f, 0x17f088ad, 0x66c920ac, 0xb47dce3a, + 0x1863df4a, 0x82e51a31, 0x60975133, 0x4562537f, + 0xe0b16477, 0x84bb6bae, 0x1cfe81a0, 0x94f9082b, + 0x58704868, 0x198f45fd, 0x8794de6c, 0xb7527bf8, + 0x23ab73d3, 0xe2724b02, 0x57e31f8f, 0x2a6655ab, + 0x07b2eb28, 0x032fb5c2, 0x9a86c57b, 0xa5d33708, + 0xf2302887, 0xb223bfa5, 0xba02036a, 0x5ced1682, + 0x2b8acf1c, 0x92a779b4, 0xf0f307f2, 0xa14e69e2, + 0xcd65daf4, 0xd50605be, 0x1fd13462, 0x8ac4a6fe, + 0x9d342e53, 0xa0a2f355, 0x32058ae1, 0x75a4f6eb, + 0x390b83ec, 0xaa4060ef, 0x065e719f, 0x51bd6e10, + 0xf93e218a, 0x3d96dd06, 0xaedd3e05, 0x464de6bd, + 0xb591548d, 0x0571c45d, 0x6f0406d4, 0xff605015, + 0x241998fb, 0x97d6bde9, 0xcc894043, 0x7767d99e, + 0xbdb0e842, 0x8807898b, 0x38e7195b, 0xdb79c8ee, + 0x47a17c0a, 0xe97c420f, 0xc9f8841e, 0x00000000, + 0x83098086, 0x48322bed, 0xac1e1170, 0x4e6c5a72, + 0xfbfd0eff, 0x560f8538, 0x1e3daed5, 0x27362d39, + 0x640a0fd9, 0x21685ca6, 0xd19b5b54, 0x3a24362e, + 0xb10c0a67, 0x0f9357e7, 0xd2b4ee96, 0x9e1b9b91, + 0x4f80c0c5, 0xa261dc20, 0x695a774b, 0x161c121a, + 0x0ae293ba, 0xe5c0a02a, 0x433c22e0, 0x1d121b17, + 0x0b0e090d, 0xadf28bc7, 0xb92db6a8, 0xc8141ea9, + 0x8557f119, 0x4caf7507, 0xbbee99dd, 0xfda37f60, + 0x9ff70126, 0xbc5c72f5, 0xc544663b, 0x345bfb7e, + 0x768b4329, 0xdccb23c6, 0x68b6edfc, 0x63b8e4f1, + 0xcad731dc, 0x10426385, 0x40139722, 0x2084c611, + 0x7d854a24, 0xf8d2bb3d, 0x11aef932, 0x6dc729a1, + 0x4b1d9e2f, 0xf3dcb230, 0xec0d8652, 0xd077c1e3, + 0x6c2bb316, 0x99a970b9, 0xfa119448, 0x2247e964, + 0xc4a8fc8c, 0x1aa0f03f, 0xd8567d2c, 0xef223390, + 0xc787494e, 0xc1d938d1, 0xfe8ccaa2, 0x3698d40b, + 0xcfa6f581, 0x28a57ade, 0x26dab78e, 0xa43fadbf, + 0xe42c3a9d, 0x0d507892, 0x9b6a5fcc, 0x62547e46, + 0xc2f68d13, 0xe890d8b8, 0x5e2e39f7, 0xf582c3af, + 0xbe9f5d80, 0x7c69d093, 0xa96fd52d, 0xb3cf2512, + 0x3bc8ac99, 0xa710187d, 0x6ee89c63, 0x7bdb3bbb, + 0x09cd2678, 0xf46e5918, 0x01ec9ab7, 0xa8834f9a, + 0x65e6956e, 0x7eaaffe6, 0x0821bccf, 0xe6ef15e8, + 0xd9bae79b, 0xce4a6f36, 0xd4ea9f09, 0xd629b07c, + 0xaf31a4b2, 0x312a3f23, 0x30c6a594, 0xc035a266, + 0x37744ebc, 0xa6fc82ca, 0xb0e090d0, 0x1533a7d8, + 0x4af10498, 0xf741ecda, 0x0e7fcd50, 0x2f1791f6, + 0x8d764dd6, 0x4d43efb0, 0x54ccaa4d, 0xdfe49604, + 0xe39ed1b5, 0x1b4c6a88, 0xb8c12c1f, 0x7f466551, + 0x049d5eea, 0x5d018c35, 0x73fa8774, 0x2efb0b41, + 0x5ab3671d, 0x5292dbd2, 0x33e91056, 0x136dd647, + 0x8c9ad761, 0x7a37a10c, 0x8e59f814, 0x89eb133c, + 0xeecea927, 0x35b761c9, 0xede11ce5, 0x3c7a47b1, + 0x599cd2df, 0x3f55f273, 0x791814ce, 0xbf73c737, + 0xea53f7cd, 0x5b5ffdaa, 0x14df3d6f, 0x867844db, + 0x81caaff3, 0x3eb968c4, 0x2c382434, 0x5fc2a340, + 0x72161dc3, 0x0cbce225, 0x8b283c49, 0x41ff0d95, + 0x7139a801, 0xde080cb3, 0x9cd8b4e4, 0x906456c1, + 0x617bcb84, 0x70d532b6, 0x74486c5c, 0x42d0b857, +}; + +__device__ __constant__ u32 td2[256] = +{ + 0xa75051f4, 0x65537e41, 0xa4c31a17, 0x5e963a27, + 0x6bcb3bab, 0x45f11f9d, 0x58abacfa, 0x03934be3, + 0xfa552030, 0x6df6ad76, 0x769188cc, 0x4c25f502, + 0xd7fc4fe5, 0xcbd7c52a, 0x44802635, 0xa38fb562, + 0x5a49deb1, 0x1b6725ba, 0x0e9845ea, 0xc0e15dfe, + 0x7502c32f, 0xf012814c, 0x97a38d46, 0xf9c66bd3, + 0x5fe7038f, 0x9c951592, 0x7aebbf6d, 0x59da9552, + 0x832dd4be, 0x21d35874, 0x692949e0, 0xc8448ec9, + 0x896a75c2, 0x7978f48e, 0x3e6b9958, 0x71dd27b9, + 0x4fb6bee1, 0xad17f088, 0xac66c920, 0x3ab47dce, + 0x4a1863df, 0x3182e51a, 0x33609751, 0x7f456253, + 0x77e0b164, 0xae84bb6b, 0xa01cfe81, 0x2b94f908, + 0x68587048, 0xfd198f45, 0x6c8794de, 0xf8b7527b, + 0xd323ab73, 0x02e2724b, 0x8f57e31f, 0xab2a6655, + 0x2807b2eb, 0xc2032fb5, 0x7b9a86c5, 0x08a5d337, + 0x87f23028, 0xa5b223bf, 0x6aba0203, 0x825ced16, + 0x1c2b8acf, 0xb492a779, 0xf2f0f307, 0xe2a14e69, + 0xf4cd65da, 0xbed50605, 0x621fd134, 0xfe8ac4a6, + 0x539d342e, 0x55a0a2f3, 0xe132058a, 0xeb75a4f6, + 0xec390b83, 0xefaa4060, 0x9f065e71, 0x1051bd6e, + 0x8af93e21, 0x063d96dd, 0x05aedd3e, 0xbd464de6, + 0x8db59154, 0x5d0571c4, 0xd46f0406, 0x15ff6050, + 0xfb241998, 0xe997d6bd, 0x43cc8940, 0x9e7767d9, + 0x42bdb0e8, 0x8b880789, 0x5b38e719, 0xeedb79c8, + 0x0a47a17c, 0x0fe97c42, 0x1ec9f884, 0x00000000, + 0x86830980, 0xed48322b, 0x70ac1e11, 0x724e6c5a, + 0xfffbfd0e, 0x38560f85, 0xd51e3dae, 0x3927362d, + 0xd9640a0f, 0xa621685c, 0x54d19b5b, 0x2e3a2436, + 0x67b10c0a, 0xe70f9357, 0x96d2b4ee, 0x919e1b9b, + 0xc54f80c0, 0x20a261dc, 0x4b695a77, 0x1a161c12, + 0xba0ae293, 0x2ae5c0a0, 0xe0433c22, 0x171d121b, + 0x0d0b0e09, 0xc7adf28b, 0xa8b92db6, 0xa9c8141e, + 0x198557f1, 0x074caf75, 0xddbbee99, 0x60fda37f, + 0x269ff701, 0xf5bc5c72, 0x3bc54466, 0x7e345bfb, + 0x29768b43, 0xc6dccb23, 0xfc68b6ed, 0xf163b8e4, + 0xdccad731, 0x85104263, 0x22401397, 0x112084c6, + 0x247d854a, 0x3df8d2bb, 0x3211aef9, 0xa16dc729, + 0x2f4b1d9e, 0x30f3dcb2, 0x52ec0d86, 0xe3d077c1, + 0x166c2bb3, 0xb999a970, 0x48fa1194, 0x642247e9, + 0x8cc4a8fc, 0x3f1aa0f0, 0x2cd8567d, 0x90ef2233, + 0x4ec78749, 0xd1c1d938, 0xa2fe8cca, 0x0b3698d4, + 0x81cfa6f5, 0xde28a57a, 0x8e26dab7, 0xbfa43fad, + 0x9de42c3a, 0x920d5078, 0xcc9b6a5f, 0x4662547e, + 0x13c2f68d, 0xb8e890d8, 0xf75e2e39, 0xaff582c3, + 0x80be9f5d, 0x937c69d0, 0x2da96fd5, 0x12b3cf25, + 0x993bc8ac, 0x7da71018, 0x636ee89c, 0xbb7bdb3b, + 0x7809cd26, 0x18f46e59, 0xb701ec9a, 0x9aa8834f, + 0x6e65e695, 0xe67eaaff, 0xcf0821bc, 0xe8e6ef15, + 0x9bd9bae7, 0x36ce4a6f, 0x09d4ea9f, 0x7cd629b0, + 0xb2af31a4, 0x23312a3f, 0x9430c6a5, 0x66c035a2, + 0xbc37744e, 0xcaa6fc82, 0xd0b0e090, 0xd81533a7, + 0x984af104, 0xdaf741ec, 0x500e7fcd, 0xf62f1791, + 0xd68d764d, 0xb04d43ef, 0x4d54ccaa, 0x04dfe496, + 0xb5e39ed1, 0x881b4c6a, 0x1fb8c12c, 0x517f4665, + 0xea049d5e, 0x355d018c, 0x7473fa87, 0x412efb0b, + 0x1d5ab367, 0xd25292db, 0x5633e910, 0x47136dd6, + 0x618c9ad7, 0x0c7a37a1, 0x148e59f8, 0x3c89eb13, + 0x27eecea9, 0xc935b761, 0xe5ede11c, 0xb13c7a47, + 0xdf599cd2, 0x733f55f2, 0xce791814, 0x37bf73c7, + 0xcdea53f7, 0xaa5b5ffd, 0x6f14df3d, 0xdb867844, + 0xf381caaf, 0xc43eb968, 0x342c3824, 0x405fc2a3, + 0xc372161d, 0x250cbce2, 0x498b283c, 0x9541ff0d, + 0x017139a8, 0xb3de080c, 0xe49cd8b4, 0xc1906456, + 0x84617bcb, 0xb670d532, 0x5c74486c, 0x5742d0b8, +}; + +__device__ __constant__ u32 td3[256] = +{ + 0xf4a75051, 0x4165537e, 0x17a4c31a, 0x275e963a, + 0xab6bcb3b, 0x9d45f11f, 0xfa58abac, 0xe303934b, + 0x30fa5520, 0x766df6ad, 0xcc769188, 0x024c25f5, + 0xe5d7fc4f, 0x2acbd7c5, 0x35448026, 0x62a38fb5, + 0xb15a49de, 0xba1b6725, 0xea0e9845, 0xfec0e15d, + 0x2f7502c3, 0x4cf01281, 0x4697a38d, 0xd3f9c66b, + 0x8f5fe703, 0x929c9515, 0x6d7aebbf, 0x5259da95, + 0xbe832dd4, 0x7421d358, 0xe0692949, 0xc9c8448e, + 0xc2896a75, 0x8e7978f4, 0x583e6b99, 0xb971dd27, + 0xe14fb6be, 0x88ad17f0, 0x20ac66c9, 0xce3ab47d, + 0xdf4a1863, 0x1a3182e5, 0x51336097, 0x537f4562, + 0x6477e0b1, 0x6bae84bb, 0x81a01cfe, 0x082b94f9, + 0x48685870, 0x45fd198f, 0xde6c8794, 0x7bf8b752, + 0x73d323ab, 0x4b02e272, 0x1f8f57e3, 0x55ab2a66, + 0xeb2807b2, 0xb5c2032f, 0xc57b9a86, 0x3708a5d3, + 0x2887f230, 0xbfa5b223, 0x036aba02, 0x16825ced, + 0xcf1c2b8a, 0x79b492a7, 0x07f2f0f3, 0x69e2a14e, + 0xdaf4cd65, 0x05bed506, 0x34621fd1, 0xa6fe8ac4, + 0x2e539d34, 0xf355a0a2, 0x8ae13205, 0xf6eb75a4, + 0x83ec390b, 0x60efaa40, 0x719f065e, 0x6e1051bd, + 0x218af93e, 0xdd063d96, 0x3e05aedd, 0xe6bd464d, + 0x548db591, 0xc45d0571, 0x06d46f04, 0x5015ff60, + 0x98fb2419, 0xbde997d6, 0x4043cc89, 0xd99e7767, + 0xe842bdb0, 0x898b8807, 0x195b38e7, 0xc8eedb79, + 0x7c0a47a1, 0x420fe97c, 0x841ec9f8, 0x00000000, + 0x80868309, 0x2bed4832, 0x1170ac1e, 0x5a724e6c, + 0x0efffbfd, 0x8538560f, 0xaed51e3d, 0x2d392736, + 0x0fd9640a, 0x5ca62168, 0x5b54d19b, 0x362e3a24, + 0x0a67b10c, 0x57e70f93, 0xee96d2b4, 0x9b919e1b, + 0xc0c54f80, 0xdc20a261, 0x774b695a, 0x121a161c, + 0x93ba0ae2, 0xa02ae5c0, 0x22e0433c, 0x1b171d12, + 0x090d0b0e, 0x8bc7adf2, 0xb6a8b92d, 0x1ea9c814, + 0xf1198557, 0x75074caf, 0x99ddbbee, 0x7f60fda3, + 0x01269ff7, 0x72f5bc5c, 0x663bc544, 0xfb7e345b, + 0x4329768b, 0x23c6dccb, 0xedfc68b6, 0xe4f163b8, + 0x31dccad7, 0x63851042, 0x97224013, 0xc6112084, + 0x4a247d85, 0xbb3df8d2, 0xf93211ae, 0x29a16dc7, + 0x9e2f4b1d, 0xb230f3dc, 0x8652ec0d, 0xc1e3d077, + 0xb3166c2b, 0x70b999a9, 0x9448fa11, 0xe9642247, + 0xfc8cc4a8, 0xf03f1aa0, 0x7d2cd856, 0x3390ef22, + 0x494ec787, 0x38d1c1d9, 0xcaa2fe8c, 0xd40b3698, + 0xf581cfa6, 0x7ade28a5, 0xb78e26da, 0xadbfa43f, + 0x3a9de42c, 0x78920d50, 0x5fcc9b6a, 0x7e466254, + 0x8d13c2f6, 0xd8b8e890, 0x39f75e2e, 0xc3aff582, + 0x5d80be9f, 0xd0937c69, 0xd52da96f, 0x2512b3cf, + 0xac993bc8, 0x187da710, 0x9c636ee8, 0x3bbb7bdb, + 0x267809cd, 0x5918f46e, 0x9ab701ec, 0x4f9aa883, + 0x956e65e6, 0xffe67eaa, 0xbccf0821, 0x15e8e6ef, + 0xe79bd9ba, 0x6f36ce4a, 0x9f09d4ea, 0xb07cd629, + 0xa4b2af31, 0x3f23312a, 0xa59430c6, 0xa266c035, + 0x4ebc3774, 0x82caa6fc, 0x90d0b0e0, 0xa7d81533, + 0x04984af1, 0xecdaf741, 0xcd500e7f, 0x91f62f17, + 0x4dd68d76, 0xefb04d43, 0xaa4d54cc, 0x9604dfe4, + 0xd1b5e39e, 0x6a881b4c, 0x2c1fb8c1, 0x65517f46, + 0x5eea049d, 0x8c355d01, 0x877473fa, 0x0b412efb, + 0x671d5ab3, 0xdbd25292, 0x105633e9, 0xd647136d, + 0xd7618c9a, 0xa10c7a37, 0xf8148e59, 0x133c89eb, + 0xa927eece, 0x61c935b7, 0x1ce5ede1, 0x47b13c7a, + 0xd2df599c, 0xf2733f55, 0x14ce7918, 0xc737bf73, + 0xf7cdea53, 0xfdaa5b5f, 0x3d6f14df, 0x44db8678, + 0xaff381ca, 0x68c43eb9, 0x24342c38, 0xa3405fc2, + 0x1dc37216, 0xe2250cbc, 0x3c498b28, 0x0d9541ff, + 0xa8017139, 0x0cb3de08, 0xb4e49cd8, 0x56c19064, + 0xcb84617b, 0x32b670d5, 0x6c5c7448, 0xb85742d0, +}; + +__device__ __constant__ u32 td4[256] = +{ + 0x52525252, 0x09090909, 0x6a6a6a6a, 0xd5d5d5d5, + 0x30303030, 0x36363636, 0xa5a5a5a5, 0x38383838, + 0xbfbfbfbf, 0x40404040, 0xa3a3a3a3, 0x9e9e9e9e, + 0x81818181, 0xf3f3f3f3, 0xd7d7d7d7, 0xfbfbfbfb, + 0x7c7c7c7c, 0xe3e3e3e3, 0x39393939, 0x82828282, + 0x9b9b9b9b, 0x2f2f2f2f, 0xffffffff, 0x87878787, + 0x34343434, 0x8e8e8e8e, 0x43434343, 0x44444444, + 0xc4c4c4c4, 0xdededede, 0xe9e9e9e9, 0xcbcbcbcb, + 0x54545454, 0x7b7b7b7b, 0x94949494, 0x32323232, + 0xa6a6a6a6, 0xc2c2c2c2, 0x23232323, 0x3d3d3d3d, + 0xeeeeeeee, 0x4c4c4c4c, 0x95959595, 0x0b0b0b0b, + 0x42424242, 0xfafafafa, 0xc3c3c3c3, 0x4e4e4e4e, + 0x08080808, 0x2e2e2e2e, 0xa1a1a1a1, 0x66666666, + 0x28282828, 0xd9d9d9d9, 0x24242424, 0xb2b2b2b2, + 0x76767676, 0x5b5b5b5b, 0xa2a2a2a2, 0x49494949, + 0x6d6d6d6d, 0x8b8b8b8b, 0xd1d1d1d1, 0x25252525, + 0x72727272, 0xf8f8f8f8, 0xf6f6f6f6, 0x64646464, + 0x86868686, 0x68686868, 0x98989898, 0x16161616, + 0xd4d4d4d4, 0xa4a4a4a4, 0x5c5c5c5c, 0xcccccccc, + 0x5d5d5d5d, 0x65656565, 0xb6b6b6b6, 0x92929292, + 0x6c6c6c6c, 0x70707070, 0x48484848, 0x50505050, + 0xfdfdfdfd, 0xedededed, 0xb9b9b9b9, 0xdadadada, + 0x5e5e5e5e, 0x15151515, 0x46464646, 0x57575757, + 0xa7a7a7a7, 0x8d8d8d8d, 0x9d9d9d9d, 0x84848484, + 0x90909090, 0xd8d8d8d8, 0xabababab, 0x00000000, + 0x8c8c8c8c, 0xbcbcbcbc, 0xd3d3d3d3, 0x0a0a0a0a, + 0xf7f7f7f7, 0xe4e4e4e4, 0x58585858, 0x05050505, + 0xb8b8b8b8, 0xb3b3b3b3, 0x45454545, 0x06060606, + 0xd0d0d0d0, 0x2c2c2c2c, 0x1e1e1e1e, 0x8f8f8f8f, + 0xcacacaca, 0x3f3f3f3f, 0x0f0f0f0f, 0x02020202, + 0xc1c1c1c1, 0xafafafaf, 0xbdbdbdbd, 0x03030303, + 0x01010101, 0x13131313, 0x8a8a8a8a, 0x6b6b6b6b, + 0x3a3a3a3a, 0x91919191, 0x11111111, 0x41414141, + 0x4f4f4f4f, 0x67676767, 0xdcdcdcdc, 0xeaeaeaea, + 0x97979797, 0xf2f2f2f2, 0xcfcfcfcf, 0xcececece, + 0xf0f0f0f0, 0xb4b4b4b4, 0xe6e6e6e6, 0x73737373, + 0x96969696, 0xacacacac, 0x74747474, 0x22222222, + 0xe7e7e7e7, 0xadadadad, 0x35353535, 0x85858585, + 0xe2e2e2e2, 0xf9f9f9f9, 0x37373737, 0xe8e8e8e8, + 0x1c1c1c1c, 0x75757575, 0xdfdfdfdf, 0x6e6e6e6e, + 0x47474747, 0xf1f1f1f1, 0x1a1a1a1a, 0x71717171, + 0x1d1d1d1d, 0x29292929, 0xc5c5c5c5, 0x89898989, + 0x6f6f6f6f, 0xb7b7b7b7, 0x62626262, 0x0e0e0e0e, + 0xaaaaaaaa, 0x18181818, 0xbebebebe, 0x1b1b1b1b, + 0xfcfcfcfc, 0x56565656, 0x3e3e3e3e, 0x4b4b4b4b, + 0xc6c6c6c6, 0xd2d2d2d2, 0x79797979, 0x20202020, + 0x9a9a9a9a, 0xdbdbdbdb, 0xc0c0c0c0, 0xfefefefe, + 0x78787878, 0xcdcdcdcd, 0x5a5a5a5a, 0xf4f4f4f4, + 0x1f1f1f1f, 0xdddddddd, 0xa8a8a8a8, 0x33333333, + 0x88888888, 0x07070707, 0xc7c7c7c7, 0x31313131, + 0xb1b1b1b1, 0x12121212, 0x10101010, 0x59595959, + 0x27272727, 0x80808080, 0xecececec, 0x5f5f5f5f, + 0x60606060, 0x51515151, 0x7f7f7f7f, 0xa9a9a9a9, + 0x19191919, 0xb5b5b5b5, 0x4a4a4a4a, 0x0d0d0d0d, + 0x2d2d2d2d, 0xe5e5e5e5, 0x7a7a7a7a, 0x9f9f9f9f, + 0x93939393, 0xc9c9c9c9, 0x9c9c9c9c, 0xefefefef, + 0xa0a0a0a0, 0xe0e0e0e0, 0x3b3b3b3b, 0x4d4d4d4d, + 0xaeaeaeae, 0x2a2a2a2a, 0xf5f5f5f5, 0xb0b0b0b0, + 0xc8c8c8c8, 0xebebebeb, 0xbbbbbbbb, 0x3c3c3c3c, + 0x83838383, 0x53535353, 0x99999999, 0x61616161, + 0x17171717, 0x2b2b2b2b, 0x04040404, 0x7e7e7e7e, + 0xbabababa, 0x77777777, 0xd6d6d6d6, 0x26262626, + 0xe1e1e1e1, 0x69696969, 0x14141414, 0x63636363, + 0x55555555, 0x21212121, 0x0c0c0c0c, 0x7d7d7d7d, +}; + +__device__ __constant__ u32 rcon[] = +{ + 0x01000000, 0x02000000, 0x04000000, 0x08000000, + 0x10000000, 0x20000000, 0x40000000, 0x80000000, + 0x1b000000, 0x36000000, +}; + +__device__ static void aes256_ExpandKey (u32 *ks, const u32 *ukey) +{ + ks[0] = ukey[0]; + ks[1] = ukey[1]; + ks[2] = ukey[2]; + ks[3] = ukey[3]; + ks[4] = ukey[4]; + ks[5] = ukey[5]; + ks[6] = ukey[6]; + ks[7] = ukey[7]; + + int i; + int j; + + i = 0; + j = 0; + + while (1) + { + u32 temp = ks[j + 7]; + + ks[j + 8] = ks[j + 0] + ^ (te2[(temp >> 16) & 0xff] & 0xff000000) + ^ (te3[(temp >> 8) & 0xff] & 0x00ff0000) + ^ (te0[(temp >> 0) & 0xff] & 0x0000ff00) + ^ (te1[(temp >> 24) & 0xff] & 0x000000ff) + ^ rcon[i]; + + ks[j + 9] = ks[j + 1] ^ ks[j + 8]; + ks[j + 10] = ks[j + 2] ^ ks[j + 9]; + ks[j + 11] = ks[j + 3] ^ ks[j + 10]; + + if (++i == 7) break; + + temp = ks[j + 11]; + + ks[j + 12] = ks[j + 4] + ^ (te2[(temp >> 24) & 0xff] & 0xff000000) + ^ (te3[(temp >> 16) & 0xff] & 0x00ff0000) + ^ (te0[(temp >> 8) & 0xff] & 0x0000ff00) + ^ (te1[(temp >> 0) & 0xff] & 0x000000ff); + + ks[j + 13] = ks[j + 5] ^ ks[j + 12]; + ks[j + 14] = ks[j + 6] ^ ks[j + 13]; + ks[j + 15] = ks[j + 7] ^ ks[j + 14]; + + j += 8; + } +} + +__device__ static void aes256_InvertKey (u32 *ks) +{ + for (u32 i = 0, j = 56; i < j; i += 4, j -= 4) + { + u32 temp; + + temp = ks[i + 0]; ks[i + 0] = ks[j + 0]; ks[j + 0] = temp; + temp = ks[i + 1]; ks[i + 1] = ks[j + 1]; ks[j + 1] = temp; + temp = ks[i + 2]; ks[i + 2] = ks[j + 2]; ks[j + 2] = temp; + temp = ks[i + 3]; ks[i + 3] = ks[j + 3]; ks[j + 3] = temp; + } + + for (u32 i = 1, j = 4; i < 14; i += 1, j += 4) + { + ks[j + 0] = + td0[te1[(ks[j + 0] >> 24) & 0xff] & 0xff] ^ + td1[te1[(ks[j + 0] >> 16) & 0xff] & 0xff] ^ + td2[te1[(ks[j + 0] >> 8) & 0xff] & 0xff] ^ + td3[te1[(ks[j + 0] >> 0) & 0xff] & 0xff]; + + ks[j + 1] = + td0[te1[(ks[j + 1] >> 24) & 0xff] & 0xff] ^ + td1[te1[(ks[j + 1] >> 16) & 0xff] & 0xff] ^ + td2[te1[(ks[j + 1] >> 8) & 0xff] & 0xff] ^ + td3[te1[(ks[j + 1] >> 0) & 0xff] & 0xff]; + + ks[j + 2] = + td0[te1[(ks[j + 2] >> 24) & 0xff] & 0xff] ^ + td1[te1[(ks[j + 2] >> 16) & 0xff] & 0xff] ^ + td2[te1[(ks[j + 2] >> 8) & 0xff] & 0xff] ^ + td3[te1[(ks[j + 2] >> 0) & 0xff] & 0xff]; + + ks[j + 3] = + td0[te1[(ks[j + 3] >> 24) & 0xff] & 0xff] ^ + td1[te1[(ks[j + 3] >> 16) & 0xff] & 0xff] ^ + td2[te1[(ks[j + 3] >> 8) & 0xff] & 0xff] ^ + td3[te1[(ks[j + 3] >> 0) & 0xff] & 0xff]; + } +} + +__device__ static void aes256_set_encrypt_key (u32 *ks, const u32 *ukey) +{ + u32 ukey_s[8]; + + ukey_s[0] = swap_workaround (ukey[0]); + ukey_s[1] = swap_workaround (ukey[1]); + ukey_s[2] = swap_workaround (ukey[2]); + ukey_s[3] = swap_workaround (ukey[3]); + ukey_s[4] = swap_workaround (ukey[4]); + ukey_s[5] = swap_workaround (ukey[5]); + ukey_s[6] = swap_workaround (ukey[6]); + ukey_s[7] = swap_workaround (ukey[7]); + + aes256_ExpandKey (ks, ukey_s); +} + +__device__ static void aes256_set_decrypt_key (u32 *ks, const u32 *ukey) +{ + u32 ukey_s[8]; + + ukey_s[0] = swap_workaround (ukey[0]); + ukey_s[1] = swap_workaround (ukey[1]); + ukey_s[2] = swap_workaround (ukey[2]); + ukey_s[3] = swap_workaround (ukey[3]); + ukey_s[4] = swap_workaround (ukey[4]); + ukey_s[5] = swap_workaround (ukey[5]); + ukey_s[6] = swap_workaround (ukey[6]); + ukey_s[7] = swap_workaround (ukey[7]); + + aes256_ExpandKey (ks, ukey_s); + + aes256_InvertKey (ks); +} + +__device__ static void aes256_decrypt (const u32 *ks, const u32 *in, u32 *out) +{ + u32 in_s[4]; + + in_s[0] = swap_workaround (in[0]); + in_s[1] = swap_workaround (in[1]); + in_s[2] = swap_workaround (in[2]); + in_s[3] = swap_workaround (in[3]); + + u32 s0 = in_s[0] ^ ks[0]; + u32 s1 = in_s[1] ^ ks[1]; + u32 s2 = in_s[2] ^ ks[2]; + u32 s3 = in_s[3] ^ ks[3]; + + u32 t0; + u32 t1; + u32 t2; + u32 t3; + + t0 = td0[s0 >> 24] ^ td1[(s3 >> 16) & 0xff] ^ td2[(s2 >> 8) & 0xff] ^ td3[s1 & 0xff] ^ ks[ 4]; + t1 = td0[s1 >> 24] ^ td1[(s0 >> 16) & 0xff] ^ td2[(s3 >> 8) & 0xff] ^ td3[s2 & 0xff] ^ ks[ 5]; + t2 = td0[s2 >> 24] ^ td1[(s1 >> 16) & 0xff] ^ td2[(s0 >> 8) & 0xff] ^ td3[s3 & 0xff] ^ ks[ 6]; + t3 = td0[s3 >> 24] ^ td1[(s2 >> 16) & 0xff] ^ td2[(s1 >> 8) & 0xff] ^ td3[s0 & 0xff] ^ ks[ 7]; + s0 = td0[t0 >> 24] ^ td1[(t3 >> 16) & 0xff] ^ td2[(t2 >> 8) & 0xff] ^ td3[t1 & 0xff] ^ ks[ 8]; + s1 = td0[t1 >> 24] ^ td1[(t0 >> 16) & 0xff] ^ td2[(t3 >> 8) & 0xff] ^ td3[t2 & 0xff] ^ ks[ 9]; + s2 = td0[t2 >> 24] ^ td1[(t1 >> 16) & 0xff] ^ td2[(t0 >> 8) & 0xff] ^ td3[t3 & 0xff] ^ ks[10]; + s3 = td0[t3 >> 24] ^ td1[(t2 >> 16) & 0xff] ^ td2[(t1 >> 8) & 0xff] ^ td3[t0 & 0xff] ^ ks[11]; + t0 = td0[s0 >> 24] ^ td1[(s3 >> 16) & 0xff] ^ td2[(s2 >> 8) & 0xff] ^ td3[s1 & 0xff] ^ ks[12]; + t1 = td0[s1 >> 24] ^ td1[(s0 >> 16) & 0xff] ^ td2[(s3 >> 8) & 0xff] ^ td3[s2 & 0xff] ^ ks[13]; + t2 = td0[s2 >> 24] ^ td1[(s1 >> 16) & 0xff] ^ td2[(s0 >> 8) & 0xff] ^ td3[s3 & 0xff] ^ ks[14]; + t3 = td0[s3 >> 24] ^ td1[(s2 >> 16) & 0xff] ^ td2[(s1 >> 8) & 0xff] ^ td3[s0 & 0xff] ^ ks[15]; + s0 = td0[t0 >> 24] ^ td1[(t3 >> 16) & 0xff] ^ td2[(t2 >> 8) & 0xff] ^ td3[t1 & 0xff] ^ ks[16]; + s1 = td0[t1 >> 24] ^ td1[(t0 >> 16) & 0xff] ^ td2[(t3 >> 8) & 0xff] ^ td3[t2 & 0xff] ^ ks[17]; + s2 = td0[t2 >> 24] ^ td1[(t1 >> 16) & 0xff] ^ td2[(t0 >> 8) & 0xff] ^ td3[t3 & 0xff] ^ ks[18]; + s3 = td0[t3 >> 24] ^ td1[(t2 >> 16) & 0xff] ^ td2[(t1 >> 8) & 0xff] ^ td3[t0 & 0xff] ^ ks[19]; + t0 = td0[s0 >> 24] ^ td1[(s3 >> 16) & 0xff] ^ td2[(s2 >> 8) & 0xff] ^ td3[s1 & 0xff] ^ ks[20]; + t1 = td0[s1 >> 24] ^ td1[(s0 >> 16) & 0xff] ^ td2[(s3 >> 8) & 0xff] ^ td3[s2 & 0xff] ^ ks[21]; + t2 = td0[s2 >> 24] ^ td1[(s1 >> 16) & 0xff] ^ td2[(s0 >> 8) & 0xff] ^ td3[s3 & 0xff] ^ ks[22]; + t3 = td0[s3 >> 24] ^ td1[(s2 >> 16) & 0xff] ^ td2[(s1 >> 8) & 0xff] ^ td3[s0 & 0xff] ^ ks[23]; + s0 = td0[t0 >> 24] ^ td1[(t3 >> 16) & 0xff] ^ td2[(t2 >> 8) & 0xff] ^ td3[t1 & 0xff] ^ ks[24]; + s1 = td0[t1 >> 24] ^ td1[(t0 >> 16) & 0xff] ^ td2[(t3 >> 8) & 0xff] ^ td3[t2 & 0xff] ^ ks[25]; + s2 = td0[t2 >> 24] ^ td1[(t1 >> 16) & 0xff] ^ td2[(t0 >> 8) & 0xff] ^ td3[t3 & 0xff] ^ ks[26]; + s3 = td0[t3 >> 24] ^ td1[(t2 >> 16) & 0xff] ^ td2[(t1 >> 8) & 0xff] ^ td3[t0 & 0xff] ^ ks[27]; + t0 = td0[s0 >> 24] ^ td1[(s3 >> 16) & 0xff] ^ td2[(s2 >> 8) & 0xff] ^ td3[s1 & 0xff] ^ ks[28]; + t1 = td0[s1 >> 24] ^ td1[(s0 >> 16) & 0xff] ^ td2[(s3 >> 8) & 0xff] ^ td3[s2 & 0xff] ^ ks[29]; + t2 = td0[s2 >> 24] ^ td1[(s1 >> 16) & 0xff] ^ td2[(s0 >> 8) & 0xff] ^ td3[s3 & 0xff] ^ ks[30]; + t3 = td0[s3 >> 24] ^ td1[(s2 >> 16) & 0xff] ^ td2[(s1 >> 8) & 0xff] ^ td3[s0 & 0xff] ^ ks[31]; + s0 = td0[t0 >> 24] ^ td1[(t3 >> 16) & 0xff] ^ td2[(t2 >> 8) & 0xff] ^ td3[t1 & 0xff] ^ ks[32]; + s1 = td0[t1 >> 24] ^ td1[(t0 >> 16) & 0xff] ^ td2[(t3 >> 8) & 0xff] ^ td3[t2 & 0xff] ^ ks[33]; + s2 = td0[t2 >> 24] ^ td1[(t1 >> 16) & 0xff] ^ td2[(t0 >> 8) & 0xff] ^ td3[t3 & 0xff] ^ ks[34]; + s3 = td0[t3 >> 24] ^ td1[(t2 >> 16) & 0xff] ^ td2[(t1 >> 8) & 0xff] ^ td3[t0 & 0xff] ^ ks[35]; + t0 = td0[s0 >> 24] ^ td1[(s3 >> 16) & 0xff] ^ td2[(s2 >> 8) & 0xff] ^ td3[s1 & 0xff] ^ ks[36]; + t1 = td0[s1 >> 24] ^ td1[(s0 >> 16) & 0xff] ^ td2[(s3 >> 8) & 0xff] ^ td3[s2 & 0xff] ^ ks[37]; + t2 = td0[s2 >> 24] ^ td1[(s1 >> 16) & 0xff] ^ td2[(s0 >> 8) & 0xff] ^ td3[s3 & 0xff] ^ ks[38]; + t3 = td0[s3 >> 24] ^ td1[(s2 >> 16) & 0xff] ^ td2[(s1 >> 8) & 0xff] ^ td3[s0 & 0xff] ^ ks[39]; + s0 = td0[t0 >> 24] ^ td1[(t3 >> 16) & 0xff] ^ td2[(t2 >> 8) & 0xff] ^ td3[t1 & 0xff] ^ ks[40]; + s1 = td0[t1 >> 24] ^ td1[(t0 >> 16) & 0xff] ^ td2[(t3 >> 8) & 0xff] ^ td3[t2 & 0xff] ^ ks[41]; + s2 = td0[t2 >> 24] ^ td1[(t1 >> 16) & 0xff] ^ td2[(t0 >> 8) & 0xff] ^ td3[t3 & 0xff] ^ ks[42]; + s3 = td0[t3 >> 24] ^ td1[(t2 >> 16) & 0xff] ^ td2[(t1 >> 8) & 0xff] ^ td3[t0 & 0xff] ^ ks[43]; + t0 = td0[s0 >> 24] ^ td1[(s3 >> 16) & 0xff] ^ td2[(s2 >> 8) & 0xff] ^ td3[s1 & 0xff] ^ ks[44]; + t1 = td0[s1 >> 24] ^ td1[(s0 >> 16) & 0xff] ^ td2[(s3 >> 8) & 0xff] ^ td3[s2 & 0xff] ^ ks[45]; + t2 = td0[s2 >> 24] ^ td1[(s1 >> 16) & 0xff] ^ td2[(s0 >> 8) & 0xff] ^ td3[s3 & 0xff] ^ ks[46]; + t3 = td0[s3 >> 24] ^ td1[(s2 >> 16) & 0xff] ^ td2[(s1 >> 8) & 0xff] ^ td3[s0 & 0xff] ^ ks[47]; + s0 = td0[t0 >> 24] ^ td1[(t3 >> 16) & 0xff] ^ td2[(t2 >> 8) & 0xff] ^ td3[t1 & 0xff] ^ ks[48]; + s1 = td0[t1 >> 24] ^ td1[(t0 >> 16) & 0xff] ^ td2[(t3 >> 8) & 0xff] ^ td3[t2 & 0xff] ^ ks[49]; + s2 = td0[t2 >> 24] ^ td1[(t1 >> 16) & 0xff] ^ td2[(t0 >> 8) & 0xff] ^ td3[t3 & 0xff] ^ ks[50]; + s3 = td0[t3 >> 24] ^ td1[(t2 >> 16) & 0xff] ^ td2[(t1 >> 8) & 0xff] ^ td3[t0 & 0xff] ^ ks[51]; + t0 = td0[s0 >> 24] ^ td1[(s3 >> 16) & 0xff] ^ td2[(s2 >> 8) & 0xff] ^ td3[s1 & 0xff] ^ ks[52]; + t1 = td0[s1 >> 24] ^ td1[(s0 >> 16) & 0xff] ^ td2[(s3 >> 8) & 0xff] ^ td3[s2 & 0xff] ^ ks[53]; + t2 = td0[s2 >> 24] ^ td1[(s1 >> 16) & 0xff] ^ td2[(s0 >> 8) & 0xff] ^ td3[s3 & 0xff] ^ ks[54]; + t3 = td0[s3 >> 24] ^ td1[(s2 >> 16) & 0xff] ^ td2[(s1 >> 8) & 0xff] ^ td3[s0 & 0xff] ^ ks[55]; + + out[0] = (td4[(t0 >> 24) & 0xff] & 0xff000000) + ^ (td4[(t3 >> 16) & 0xff] & 0x00ff0000) + ^ (td4[(t2 >> 8) & 0xff] & 0x0000ff00) + ^ (td4[(t1 >> 0) & 0xff] & 0x000000ff) + ^ ks[56]; + + out[1] = (td4[(t1 >> 24) & 0xff] & 0xff000000) + ^ (td4[(t0 >> 16) & 0xff] & 0x00ff0000) + ^ (td4[(t3 >> 8) & 0xff] & 0x0000ff00) + ^ (td4[(t2 >> 0) & 0xff] & 0x000000ff) + ^ ks[57]; + + out[2] = (td4[(t2 >> 24) & 0xff] & 0xff000000) + ^ (td4[(t1 >> 16) & 0xff] & 0x00ff0000) + ^ (td4[(t0 >> 8) & 0xff] & 0x0000ff00) + ^ (td4[(t3 >> 0) & 0xff] & 0x000000ff) + ^ ks[58]; + + out[3] = (td4[(t3 >> 24) & 0xff] & 0xff000000) + ^ (td4[(t2 >> 16) & 0xff] & 0x00ff0000) + ^ (td4[(t1 >> 8) & 0xff] & 0x0000ff00) + ^ (td4[(t0 >> 0) & 0xff] & 0x000000ff) + ^ ks[59]; + + out[0] = swap_workaround (out[0]); + out[1] = swap_workaround (out[1]); + out[2] = swap_workaround (out[2]); + out[3] = swap_workaround (out[3]); +} + +__device__ static void aes256_encrypt (const u32 *ks, const u32 *in, u32 *out) +{ + u32 in_s[4]; + + in_s[0] = swap_workaround (in[0]); + in_s[1] = swap_workaround (in[1]); + in_s[2] = swap_workaround (in[2]); + in_s[3] = swap_workaround (in[3]); + + u32 s0 = in_s[0] ^ ks[0]; + u32 s1 = in_s[1] ^ ks[1]; + u32 s2 = in_s[2] ^ ks[2]; + u32 s3 = in_s[3] ^ ks[3]; + + u32 t0; + u32 t1; + u32 t2; + u32 t3; + + t0 = te0[s0 >> 24] ^ te1[(s1 >> 16) & 0xff] ^ te2[(s2 >> 8) & 0xff] ^ te3[s3 & 0xff] ^ ks[ 4]; + t1 = te0[s1 >> 24] ^ te1[(s2 >> 16) & 0xff] ^ te2[(s3 >> 8) & 0xff] ^ te3[s0 & 0xff] ^ ks[ 5]; + t2 = te0[s2 >> 24] ^ te1[(s3 >> 16) & 0xff] ^ te2[(s0 >> 8) & 0xff] ^ te3[s1 & 0xff] ^ ks[ 6]; + t3 = te0[s3 >> 24] ^ te1[(s0 >> 16) & 0xff] ^ te2[(s1 >> 8) & 0xff] ^ te3[s2 & 0xff] ^ ks[ 7]; + s0 = te0[t0 >> 24] ^ te1[(t1 >> 16) & 0xff] ^ te2[(t2 >> 8) & 0xff] ^ te3[t3 & 0xff] ^ ks[ 8]; + s1 = te0[t1 >> 24] ^ te1[(t2 >> 16) & 0xff] ^ te2[(t3 >> 8) & 0xff] ^ te3[t0 & 0xff] ^ ks[ 9]; + s2 = te0[t2 >> 24] ^ te1[(t3 >> 16) & 0xff] ^ te2[(t0 >> 8) & 0xff] ^ te3[t1 & 0xff] ^ ks[10]; + s3 = te0[t3 >> 24] ^ te1[(t0 >> 16) & 0xff] ^ te2[(t1 >> 8) & 0xff] ^ te3[t2 & 0xff] ^ ks[11]; + t0 = te0[s0 >> 24] ^ te1[(s1 >> 16) & 0xff] ^ te2[(s2 >> 8) & 0xff] ^ te3[s3 & 0xff] ^ ks[12]; + t1 = te0[s1 >> 24] ^ te1[(s2 >> 16) & 0xff] ^ te2[(s3 >> 8) & 0xff] ^ te3[s0 & 0xff] ^ ks[13]; + t2 = te0[s2 >> 24] ^ te1[(s3 >> 16) & 0xff] ^ te2[(s0 >> 8) & 0xff] ^ te3[s1 & 0xff] ^ ks[14]; + t3 = te0[s3 >> 24] ^ te1[(s0 >> 16) & 0xff] ^ te2[(s1 >> 8) & 0xff] ^ te3[s2 & 0xff] ^ ks[15]; + s0 = te0[t0 >> 24] ^ te1[(t1 >> 16) & 0xff] ^ te2[(t2 >> 8) & 0xff] ^ te3[t3 & 0xff] ^ ks[16]; + s1 = te0[t1 >> 24] ^ te1[(t2 >> 16) & 0xff] ^ te2[(t3 >> 8) & 0xff] ^ te3[t0 & 0xff] ^ ks[17]; + s2 = te0[t2 >> 24] ^ te1[(t3 >> 16) & 0xff] ^ te2[(t0 >> 8) & 0xff] ^ te3[t1 & 0xff] ^ ks[18]; + s3 = te0[t3 >> 24] ^ te1[(t0 >> 16) & 0xff] ^ te2[(t1 >> 8) & 0xff] ^ te3[t2 & 0xff] ^ ks[19]; + t0 = te0[s0 >> 24] ^ te1[(s1 >> 16) & 0xff] ^ te2[(s2 >> 8) & 0xff] ^ te3[s3 & 0xff] ^ ks[20]; + t1 = te0[s1 >> 24] ^ te1[(s2 >> 16) & 0xff] ^ te2[(s3 >> 8) & 0xff] ^ te3[s0 & 0xff] ^ ks[21]; + t2 = te0[s2 >> 24] ^ te1[(s3 >> 16) & 0xff] ^ te2[(s0 >> 8) & 0xff] ^ te3[s1 & 0xff] ^ ks[22]; + t3 = te0[s3 >> 24] ^ te1[(s0 >> 16) & 0xff] ^ te2[(s1 >> 8) & 0xff] ^ te3[s2 & 0xff] ^ ks[23]; + s0 = te0[t0 >> 24] ^ te1[(t1 >> 16) & 0xff] ^ te2[(t2 >> 8) & 0xff] ^ te3[t3 & 0xff] ^ ks[24]; + s1 = te0[t1 >> 24] ^ te1[(t2 >> 16) & 0xff] ^ te2[(t3 >> 8) & 0xff] ^ te3[t0 & 0xff] ^ ks[25]; + s2 = te0[t2 >> 24] ^ te1[(t3 >> 16) & 0xff] ^ te2[(t0 >> 8) & 0xff] ^ te3[t1 & 0xff] ^ ks[26]; + s3 = te0[t3 >> 24] ^ te1[(t0 >> 16) & 0xff] ^ te2[(t1 >> 8) & 0xff] ^ te3[t2 & 0xff] ^ ks[27]; + t0 = te0[s0 >> 24] ^ te1[(s1 >> 16) & 0xff] ^ te2[(s2 >> 8) & 0xff] ^ te3[s3 & 0xff] ^ ks[28]; + t1 = te0[s1 >> 24] ^ te1[(s2 >> 16) & 0xff] ^ te2[(s3 >> 8) & 0xff] ^ te3[s0 & 0xff] ^ ks[29]; + t2 = te0[s2 >> 24] ^ te1[(s3 >> 16) & 0xff] ^ te2[(s0 >> 8) & 0xff] ^ te3[s1 & 0xff] ^ ks[30]; + t3 = te0[s3 >> 24] ^ te1[(s0 >> 16) & 0xff] ^ te2[(s1 >> 8) & 0xff] ^ te3[s2 & 0xff] ^ ks[31]; + s0 = te0[t0 >> 24] ^ te1[(t1 >> 16) & 0xff] ^ te2[(t2 >> 8) & 0xff] ^ te3[t3 & 0xff] ^ ks[32]; + s1 = te0[t1 >> 24] ^ te1[(t2 >> 16) & 0xff] ^ te2[(t3 >> 8) & 0xff] ^ te3[t0 & 0xff] ^ ks[33]; + s2 = te0[t2 >> 24] ^ te1[(t3 >> 16) & 0xff] ^ te2[(t0 >> 8) & 0xff] ^ te3[t1 & 0xff] ^ ks[34]; + s3 = te0[t3 >> 24] ^ te1[(t0 >> 16) & 0xff] ^ te2[(t1 >> 8) & 0xff] ^ te3[t2 & 0xff] ^ ks[35]; + t0 = te0[s0 >> 24] ^ te1[(s1 >> 16) & 0xff] ^ te2[(s2 >> 8) & 0xff] ^ te3[s3 & 0xff] ^ ks[36]; + t1 = te0[s1 >> 24] ^ te1[(s2 >> 16) & 0xff] ^ te2[(s3 >> 8) & 0xff] ^ te3[s0 & 0xff] ^ ks[37]; + t2 = te0[s2 >> 24] ^ te1[(s3 >> 16) & 0xff] ^ te2[(s0 >> 8) & 0xff] ^ te3[s1 & 0xff] ^ ks[38]; + t3 = te0[s3 >> 24] ^ te1[(s0 >> 16) & 0xff] ^ te2[(s1 >> 8) & 0xff] ^ te3[s2 & 0xff] ^ ks[39]; + s0 = te0[t0 >> 24] ^ te1[(t1 >> 16) & 0xff] ^ te2[(t2 >> 8) & 0xff] ^ te3[t3 & 0xff] ^ ks[40]; + s1 = te0[t1 >> 24] ^ te1[(t2 >> 16) & 0xff] ^ te2[(t3 >> 8) & 0xff] ^ te3[t0 & 0xff] ^ ks[41]; + s2 = te0[t2 >> 24] ^ te1[(t3 >> 16) & 0xff] ^ te2[(t0 >> 8) & 0xff] ^ te3[t1 & 0xff] ^ ks[42]; + s3 = te0[t3 >> 24] ^ te1[(t0 >> 16) & 0xff] ^ te2[(t1 >> 8) & 0xff] ^ te3[t2 & 0xff] ^ ks[43]; + t0 = te0[s0 >> 24] ^ te1[(s1 >> 16) & 0xff] ^ te2[(s2 >> 8) & 0xff] ^ te3[s3 & 0xff] ^ ks[44]; + t1 = te0[s1 >> 24] ^ te1[(s2 >> 16) & 0xff] ^ te2[(s3 >> 8) & 0xff] ^ te3[s0 & 0xff] ^ ks[45]; + t2 = te0[s2 >> 24] ^ te1[(s3 >> 16) & 0xff] ^ te2[(s0 >> 8) & 0xff] ^ te3[s1 & 0xff] ^ ks[46]; + t3 = te0[s3 >> 24] ^ te1[(s0 >> 16) & 0xff] ^ te2[(s1 >> 8) & 0xff] ^ te3[s2 & 0xff] ^ ks[47]; + s0 = te0[t0 >> 24] ^ te1[(t1 >> 16) & 0xff] ^ te2[(t2 >> 8) & 0xff] ^ te3[t3 & 0xff] ^ ks[48]; + s1 = te0[t1 >> 24] ^ te1[(t2 >> 16) & 0xff] ^ te2[(t3 >> 8) & 0xff] ^ te3[t0 & 0xff] ^ ks[49]; + s2 = te0[t2 >> 24] ^ te1[(t3 >> 16) & 0xff] ^ te2[(t0 >> 8) & 0xff] ^ te3[t1 & 0xff] ^ ks[50]; + s3 = te0[t3 >> 24] ^ te1[(t0 >> 16) & 0xff] ^ te2[(t1 >> 8) & 0xff] ^ te3[t2 & 0xff] ^ ks[51]; + t0 = te0[s0 >> 24] ^ te1[(s1 >> 16) & 0xff] ^ te2[(s2 >> 8) & 0xff] ^ te3[s3 & 0xff] ^ ks[52]; + t1 = te0[s1 >> 24] ^ te1[(s2 >> 16) & 0xff] ^ te2[(s3 >> 8) & 0xff] ^ te3[s0 & 0xff] ^ ks[53]; + t2 = te0[s2 >> 24] ^ te1[(s3 >> 16) & 0xff] ^ te2[(s0 >> 8) & 0xff] ^ te3[s1 & 0xff] ^ ks[54]; + t3 = te0[s3 >> 24] ^ te1[(s0 >> 16) & 0xff] ^ te2[(s1 >> 8) & 0xff] ^ te3[s2 & 0xff] ^ ks[55]; + + out[0] = (te4[(t0 >> 24) & 0xff] & 0xff000000) + ^ (te4[(t1 >> 16) & 0xff] & 0x00ff0000) + ^ (te4[(t2 >> 8) & 0xff] & 0x0000ff00) + ^ (te4[(t3 >> 0) & 0xff] & 0x000000ff) + ^ ks[56]; + + out[1] = (te4[(t1 >> 24) & 0xff] & 0xff000000) + ^ (te4[(t2 >> 16) & 0xff] & 0x00ff0000) + ^ (te4[(t3 >> 8) & 0xff] & 0x0000ff00) + ^ (te4[(t0 >> 0) & 0xff] & 0x000000ff) + ^ ks[57]; + + out[2] = (te4[(t2 >> 24) & 0xff] & 0xff000000) + ^ (te4[(t3 >> 16) & 0xff] & 0x00ff0000) + ^ (te4[(t0 >> 8) & 0xff] & 0x0000ff00) + ^ (te4[(t1 >> 0) & 0xff] & 0x000000ff) + ^ ks[58]; + + out[3] = (te4[(t3 >> 24) & 0xff] & 0xff000000) + ^ (te4[(t0 >> 16) & 0xff] & 0x00ff0000) + ^ (te4[(t1 >> 8) & 0xff] & 0x0000ff00) + ^ (te4[(t2 >> 0) & 0xff] & 0x000000ff) + ^ ks[59]; + + out[0] = swap_workaround (out[0]); + out[1] = swap_workaround (out[1]); + out[2] = swap_workaround (out[2]); + out[3] = swap_workaround (out[3]); +} + +__device__ static void aes256_decrypt_xts (const u32 *ukey1, const u32 *ukey2, const u32 *in, u32 *out) +{ + u32 T[4] = { 0 }; + u32 Z[4] = { 0 }; + + out[0] = in[0]; + out[1] = in[1]; + out[2] = in[2]; + out[3] = in[3]; + + u32 ks[60]; + + aes256_set_encrypt_key (ks, ukey2); + aes256_encrypt (ks, Z, T); + + out[0] ^= T[0]; + out[1] ^= T[1]; + out[2] ^= T[2]; + out[3] ^= T[3]; + + aes256_set_decrypt_key (ks, ukey1); + aes256_decrypt (ks, out, out); + + out[0] ^= T[0]; + out[1] ^= T[1]; + out[2] ^= T[2]; + out[3] ^= T[3]; +} diff --git a/nv/gpu_serpent256_nv.c b/nv/gpu_serpent256_nv.c new file mode 100644 index 0000000000..8f2d01e8ed --- /dev/null +++ b/nv/gpu_serpent256_nv.c @@ -0,0 +1,583 @@ +/* This is an independent implementation of the encryption algorithm: */ +/* */ +/* Serpent by Ross Anderson, Eli Biham and Lars Knudsen */ +/* */ +/* which is a candidate algorithm in the Advanced Encryption Standard */ +/* programme of the US National Institute of Standards and Technology. */ +/* */ +/* Copyright in this implementation is held by Dr B R Gladman but I */ +/* hereby give permission for its free direct or derivative use subject */ +/* to acknowledgment of its origin and compliance with any conditions */ +/* that the originators of the algorithm place on its exploitation. */ +/* */ +/* Dr Brian Gladman (gladman@seven77.demon.co.uk) 14th January 1999 */ +/* */ +/* -------------------------------------------------------------------- */ +/* */ +/* Cleaned and optimized for GPU use with oclHashcat by Jens Steube */ + +/* 15 terms */ + +#define sb0(a,b,c,d,e,f,g,h) \ + t1 = a ^ d; \ + t2 = a & d; \ + t3 = c ^ t1; \ + t6 = b & t1; \ + t4 = b ^ t3; \ + t10 = ~t3; \ + h = t2 ^ t4; \ + t7 = a ^ t6; \ + t14 = ~t7; \ + t8 = c | t7; \ + t11 = t3 ^ t7; \ + g = t4 ^ t8; \ + t12 = h & t11; \ + f = t10 ^ t12; \ + e = t12 ^ t14 + +/* 15 terms */ + +#define ib0(a,b,c,d,e,f,g,h) \ + t1 = ~a; \ + t2 = a ^ b; \ + t3 = t1 | t2; \ + t4 = d ^ t3; \ + t7 = d & t2; \ + t5 = c ^ t4; \ + t8 = t1 ^ t7; \ + g = t2 ^ t5; \ + t11 = a & t4; \ + t9 = g & t8; \ + t14 = t5 ^ t8; \ + f = t4 ^ t9; \ + t12 = t5 | f; \ + h = t11 ^ t12; \ + e = h ^ t14 + +/* 14 terms! */ + +#define sb1(a,b,c,d,e,f,g,h) \ + t1 = ~a; \ + t2 = b ^ t1; \ + t3 = a | t2; \ + t4 = d | t2; \ + t5 = c ^ t3; \ + g = d ^ t5; \ + t7 = b ^ t4; \ + t8 = t2 ^ g; \ + t9 = t5 & t7; \ + h = t8 ^ t9; \ + t11 = t5 ^ t7; \ + f = h ^ t11; \ + t13 = t8 & t11; \ + e = t5 ^ t13 + +/* 17 terms */ + +#define ib1(a,b,c,d,e,f,g,h) \ + t1 = a ^ d; \ + t2 = a & b; \ + t3 = b ^ c; \ + t4 = a ^ t3; \ + t5 = b | d; \ + t7 = c | t1; \ + h = t4 ^ t5; \ + t8 = b ^ t7; \ + t11 = ~t2; \ + t9 = t4 & t8; \ + f = t1 ^ t9; \ + t13 = t9 ^ t11; \ + t12 = h & f; \ + g = t12 ^ t13; \ + t15 = a & d; \ + t16 = c ^ t13; \ + e = t15 ^ t16 + +/* 16 terms */ + +#define sb2(a,b,c,d,e,f,g,h) \ + t1 = ~a; \ + t2 = b ^ d; \ + t3 = c & t1; \ + t13 = d | t1; \ + e = t2 ^ t3; \ + t5 = c ^ t1; \ + t6 = c ^ e; \ + t7 = b & t6; \ + t10 = e | t5; \ + h = t5 ^ t7; \ + t9 = d | t7; \ + t11 = t9 & t10; \ + t14 = t2 ^ h; \ + g = a ^ t11; \ + t15 = g ^ t13; \ + f = t14 ^ t15 + +/* 16 terms */ + +#define ib2(a,b,c,d,e,f,g,h) \ + t1 = b ^ d; \ + t2 = ~t1; \ + t3 = a ^ c; \ + t4 = c ^ t1; \ + t7 = a | t2; \ + t5 = b & t4; \ + t8 = d ^ t7; \ + t11 = ~t4; \ + e = t3 ^ t5; \ + t9 = t3 | t8; \ + t14 = d & t11; \ + h = t1 ^ t9; \ + t12 = e | h; \ + f = t11 ^ t12; \ + t15 = t3 ^ t12; \ + g = t14 ^ t15 + +/* 17 terms */ + +#define sb3(a,b,c,d,e,f,g,h) \ + t1 = a ^ c; \ + t2 = d ^ t1; \ + t3 = a & t2; \ + t4 = d ^ t3; \ + t5 = b & t4; \ + g = t2 ^ t5; \ + t7 = a | g; \ + t8 = b | d; \ + t11 = a | d; \ + t9 = t4 & t7; \ + f = t8 ^ t9; \ + t12 = b ^ t11; \ + t13 = g ^ t9; \ + t15 = t3 ^ t8; \ + h = t12 ^ t13; \ + t16 = c & t15; \ + e = t12 ^ t16 + +/* 16 term solution that performs less well than 17 term one + in my environment (PPro/PII) + +#define sb3(a,b,c,d,e,f,g,h) \ + t1 = a ^ b; \ + t2 = a & c; \ + t3 = a | d; \ + t4 = c ^ d; \ + t5 = t1 & t3; \ + t6 = t2 | t5; \ + g = t4 ^ t6; \ + t8 = b ^ t3; \ + t9 = t6 ^ t8; \ + t10 = t4 & t9; \ + e = t1 ^ t10; \ + t12 = g & e; \ + f = t9 ^ t12; \ + t14 = b | d; \ + t15 = t4 ^ t12; \ + h = t14 ^ t15 +*/ + +/* 17 terms */ + +#define ib3(a,b,c,d,e,f,g,h) \ + t1 = b ^ c; \ + t2 = b | c; \ + t3 = a ^ c; \ + t7 = a ^ d; \ + t4 = t2 ^ t3; \ + t5 = d | t4; \ + t9 = t2 ^ t7; \ + e = t1 ^ t5; \ + t8 = t1 | t5; \ + t11 = a & t4; \ + g = t8 ^ t9; \ + t12 = e | t9; \ + f = t11 ^ t12; \ + t14 = a & g; \ + t15 = t2 ^ t14; \ + t16 = e & t15; \ + h = t4 ^ t16 + +/* 15 terms */ + +#define sb4(a,b,c,d,e,f,g,h) \ + t1 = a ^ d; \ + t2 = d & t1; \ + t3 = c ^ t2; \ + t4 = b | t3; \ + h = t1 ^ t4; \ + t6 = ~b; \ + t7 = t1 | t6; \ + e = t3 ^ t7; \ + t9 = a & e; \ + t10 = t1 ^ t6; \ + t11 = t4 & t10; \ + g = t9 ^ t11; \ + t13 = a ^ t3; \ + t14 = t10 & g; \ + f = t13 ^ t14 + +/* 17 terms */ + +#define ib4(a,b,c,d,e,f,g,h) \ + t1 = c ^ d; \ + t2 = c | d; \ + t3 = b ^ t2; \ + t4 = a & t3; \ + f = t1 ^ t4; \ + t6 = a ^ d; \ + t7 = b | d; \ + t8 = t6 & t7; \ + h = t3 ^ t8; \ + t10 = ~a; \ + t11 = c ^ h; \ + t12 = t10 | t11;\ + e = t3 ^ t12; \ + t14 = c | t4; \ + t15 = t7 ^ t14; \ + t16 = h | t10; \ + g = t15 ^ t16 + +/* 16 terms */ + +#define sb5(a,b,c,d,e,f,g,h) \ + t1 = ~a; \ + t2 = a ^ b; \ + t3 = a ^ d; \ + t4 = c ^ t1; \ + t5 = t2 | t3; \ + e = t4 ^ t5; \ + t7 = d & e; \ + t8 = t2 ^ e; \ + t10 = t1 | e; \ + f = t7 ^ t8; \ + t11 = t2 | t7; \ + t12 = t3 ^ t10; \ + t14 = b ^ t7; \ + g = t11 ^ t12; \ + t15 = f & t12; \ + h = t14 ^ t15 + +/* 16 terms */ + +#define ib5(a,b,c,d,e,f,g,h) \ + t1 = ~c; \ + t2 = b & t1; \ + t3 = d ^ t2; \ + t4 = a & t3; \ + t5 = b ^ t1; \ + h = t4 ^ t5; \ + t7 = b | h; \ + t8 = a & t7; \ + f = t3 ^ t8; \ + t10 = a | d; \ + t11 = t1 ^ t7; \ + e = t10 ^ t11; \ + t13 = a ^ c; \ + t14 = b & t10; \ + t15 = t4 | t13; \ + g = t14 ^ t15 + +/* 15 terms */ + +#define sb6(a,b,c,d,e,f,g,h) \ + t1 = ~a; \ + t2 = a ^ d; \ + t3 = b ^ t2; \ + t4 = t1 | t2; \ + t5 = c ^ t4; \ + f = b ^ t5; \ + t13 = ~t5; \ + t7 = t2 | f; \ + t8 = d ^ t7; \ + t9 = t5 & t8; \ + g = t3 ^ t9; \ + t11 = t5 ^ t8; \ + e = g ^ t11; \ + t14 = t3 & t11; \ + h = t13 ^ t14 + +/* 15 terms */ + +#define ib6(a,b,c,d,e,f,g,h) \ + t1 = ~a; \ + t2 = a ^ b; \ + t3 = c ^ t2; \ + t4 = c | t1; \ + t5 = d ^ t4; \ + t13 = d & t1; \ + f = t3 ^ t5; \ + t7 = t3 & t5; \ + t8 = t2 ^ t7; \ + t9 = b | t8; \ + h = t5 ^ t9; \ + t11 = b | h; \ + e = t8 ^ t11; \ + t14 = t3 ^ t11; \ + g = t13 ^ t14 + +/* 17 terms */ + +#define sb7(a,b,c,d,e,f,g,h) \ + t1 = ~c; \ + t2 = b ^ c; \ + t3 = b | t1; \ + t4 = d ^ t3; \ + t5 = a & t4; \ + t7 = a ^ d; \ + h = t2 ^ t5; \ + t8 = b ^ t5; \ + t9 = t2 | t8; \ + t11 = d & t3; \ + f = t7 ^ t9; \ + t12 = t5 ^ f; \ + t15 = t1 | t4; \ + t13 = h & t12; \ + g = t11 ^ t13; \ + t16 = t12 ^ g; \ + e = t15 ^ t16 + +/* 17 terms */ + +#define ib7(a,b,c,d,e,f,g,h) \ + t1 = a & b; \ + t2 = a | b; \ + t3 = c | t1; \ + t4 = d & t2; \ + h = t3 ^ t4; \ + t6 = ~d; \ + t7 = b ^ t4; \ + t8 = h ^ t6; \ + t11 = c ^ t7; \ + t9 = t7 | t8; \ + f = a ^ t9; \ + t12 = d | f; \ + e = t11 ^ t12; \ + t14 = a & h; \ + t15 = t3 ^ f; \ + t16 = e ^ t14; \ + g = t15 ^ t16 + +#define k_xor(r,a,b,c,d) \ + a ^= ks[4 * r + 8]; \ + b ^= ks[4 * r + 9]; \ + c ^= ks[4 * r + 10]; \ + d ^= ks[4 * r + 11] + +#define k_set(r,a,b,c,d) \ + a = ks[4 * r + 8]; \ + b = ks[4 * r + 9]; \ + c = ks[4 * r + 10]; \ + d = ks[4 * r + 11] + +#define k_get(r,a,b,c,d) \ + ks[4 * r + 8] = a; \ + ks[4 * r + 9] = b; \ + ks[4 * r + 10] = c; \ + ks[4 * r + 11] = d + +/* the linear transformation and its inverse */ + +#define rot(a,b,c,d) \ + a = rotl32(a, 13); \ + c = rotl32(c, 3); \ + d ^= c ^ (a << 3); \ + b ^= a ^ c; \ + d = rotl32(d, 7); \ + b = rotl32(b, 1); \ + a ^= b ^ d; \ + c ^= d ^ (b << 7); \ + a = rotl32(a, 5); \ + c = rotl32(c, 22) + +#define irot(a,b,c,d) \ + c = rotr32(c, 22); \ + a = rotr32(a, 5); \ + c ^= d ^ (b << 7); \ + a ^= b ^ d; \ + d = rotr32(d, 7); \ + b = rotr32(b, 1); \ + d ^= c ^ (a << 3); \ + b ^= a ^ c; \ + c = rotr32(c, 3); \ + a = rotr32(a, 13) + +__device__ static void serpent256_set_key (u32 *ks, const u32 *ukey) +{ + #pragma unroll + for (int i = 0; i < 8; i++) + { + ks[i] = ukey[i]; + } + + #pragma unroll + for (int i = 0; i < 132; i++) + { + ks[i + 8] = rotl32 (ks[i + 7] ^ ks[i + 5] ^ ks[i + 3] ^ ks[i + 0] ^ 0x9e3779b9 ^ i, 11); + } + + u32 a,b,c,d,e,f,g,h; + u32 t1,t2,t3,t4,t5,t6,t7,t8,t9,t10,t11,t12,t13,t14,t15,t16; + + k_set( 0,a,b,c,d); sb3(a,b,c,d,e,f,g,h); k_get( 0,e,f,g,h); + k_set( 1,a,b,c,d); sb2(a,b,c,d,e,f,g,h); k_get( 1,e,f,g,h); + k_set( 2,a,b,c,d); sb1(a,b,c,d,e,f,g,h); k_get( 2,e,f,g,h); + k_set( 3,a,b,c,d); sb0(a,b,c,d,e,f,g,h); k_get( 3,e,f,g,h); + k_set( 4,a,b,c,d); sb7(a,b,c,d,e,f,g,h); k_get( 4,e,f,g,h); + k_set( 5,a,b,c,d); sb6(a,b,c,d,e,f,g,h); k_get( 5,e,f,g,h); + k_set( 6,a,b,c,d); sb5(a,b,c,d,e,f,g,h); k_get( 6,e,f,g,h); + k_set( 7,a,b,c,d); sb4(a,b,c,d,e,f,g,h); k_get( 7,e,f,g,h); + k_set( 8,a,b,c,d); sb3(a,b,c,d,e,f,g,h); k_get( 8,e,f,g,h); + k_set( 9,a,b,c,d); sb2(a,b,c,d,e,f,g,h); k_get( 9,e,f,g,h); + k_set(10,a,b,c,d); sb1(a,b,c,d,e,f,g,h); k_get(10,e,f,g,h); + k_set(11,a,b,c,d); sb0(a,b,c,d,e,f,g,h); k_get(11,e,f,g,h); + k_set(12,a,b,c,d); sb7(a,b,c,d,e,f,g,h); k_get(12,e,f,g,h); + k_set(13,a,b,c,d); sb6(a,b,c,d,e,f,g,h); k_get(13,e,f,g,h); + k_set(14,a,b,c,d); sb5(a,b,c,d,e,f,g,h); k_get(14,e,f,g,h); + k_set(15,a,b,c,d); sb4(a,b,c,d,e,f,g,h); k_get(15,e,f,g,h); + k_set(16,a,b,c,d); sb3(a,b,c,d,e,f,g,h); k_get(16,e,f,g,h); + k_set(17,a,b,c,d); sb2(a,b,c,d,e,f,g,h); k_get(17,e,f,g,h); + k_set(18,a,b,c,d); sb1(a,b,c,d,e,f,g,h); k_get(18,e,f,g,h); + k_set(19,a,b,c,d); sb0(a,b,c,d,e,f,g,h); k_get(19,e,f,g,h); + k_set(20,a,b,c,d); sb7(a,b,c,d,e,f,g,h); k_get(20,e,f,g,h); + k_set(21,a,b,c,d); sb6(a,b,c,d,e,f,g,h); k_get(21,e,f,g,h); + k_set(22,a,b,c,d); sb5(a,b,c,d,e,f,g,h); k_get(22,e,f,g,h); + k_set(23,a,b,c,d); sb4(a,b,c,d,e,f,g,h); k_get(23,e,f,g,h); + k_set(24,a,b,c,d); sb3(a,b,c,d,e,f,g,h); k_get(24,e,f,g,h); + k_set(25,a,b,c,d); sb2(a,b,c,d,e,f,g,h); k_get(25,e,f,g,h); + k_set(26,a,b,c,d); sb1(a,b,c,d,e,f,g,h); k_get(26,e,f,g,h); + k_set(27,a,b,c,d); sb0(a,b,c,d,e,f,g,h); k_get(27,e,f,g,h); + k_set(28,a,b,c,d); sb7(a,b,c,d,e,f,g,h); k_get(28,e,f,g,h); + k_set(29,a,b,c,d); sb6(a,b,c,d,e,f,g,h); k_get(29,e,f,g,h); + k_set(30,a,b,c,d); sb5(a,b,c,d,e,f,g,h); k_get(30,e,f,g,h); + k_set(31,a,b,c,d); sb4(a,b,c,d,e,f,g,h); k_get(31,e,f,g,h); + k_set(32,a,b,c,d); sb3(a,b,c,d,e,f,g,h); k_get(32,e,f,g,h); +} + +__device__ static void serpent256_encrypt (const u32 *ks, const u32 *in, u32 *out) +{ + u32 a,b,c,d,e,f,g,h; + u32 t1,t2,t3,t4,t5,t6,t7,t8,t9,t10,t11,t12,t13,t14,t15,t16; + + a = in[0]; + b = in[1]; + c = in[2]; + d = in[3]; + + k_xor( 0,a,b,c,d); sb0(a,b,c,d,e,f,g,h); rot(e,f,g,h); + k_xor( 1,e,f,g,h); sb1(e,f,g,h,a,b,c,d); rot(a,b,c,d); + k_xor( 2,a,b,c,d); sb2(a,b,c,d,e,f,g,h); rot(e,f,g,h); + k_xor( 3,e,f,g,h); sb3(e,f,g,h,a,b,c,d); rot(a,b,c,d); + k_xor( 4,a,b,c,d); sb4(a,b,c,d,e,f,g,h); rot(e,f,g,h); + k_xor( 5,e,f,g,h); sb5(e,f,g,h,a,b,c,d); rot(a,b,c,d); + k_xor( 6,a,b,c,d); sb6(a,b,c,d,e,f,g,h); rot(e,f,g,h); + k_xor( 7,e,f,g,h); sb7(e,f,g,h,a,b,c,d); rot(a,b,c,d); + k_xor( 8,a,b,c,d); sb0(a,b,c,d,e,f,g,h); rot(e,f,g,h); + k_xor( 9,e,f,g,h); sb1(e,f,g,h,a,b,c,d); rot(a,b,c,d); + k_xor(10,a,b,c,d); sb2(a,b,c,d,e,f,g,h); rot(e,f,g,h); + k_xor(11,e,f,g,h); sb3(e,f,g,h,a,b,c,d); rot(a,b,c,d); + k_xor(12,a,b,c,d); sb4(a,b,c,d,e,f,g,h); rot(e,f,g,h); + k_xor(13,e,f,g,h); sb5(e,f,g,h,a,b,c,d); rot(a,b,c,d); + k_xor(14,a,b,c,d); sb6(a,b,c,d,e,f,g,h); rot(e,f,g,h); + k_xor(15,e,f,g,h); sb7(e,f,g,h,a,b,c,d); rot(a,b,c,d); + k_xor(16,a,b,c,d); sb0(a,b,c,d,e,f,g,h); rot(e,f,g,h); + k_xor(17,e,f,g,h); sb1(e,f,g,h,a,b,c,d); rot(a,b,c,d); + k_xor(18,a,b,c,d); sb2(a,b,c,d,e,f,g,h); rot(e,f,g,h); + k_xor(19,e,f,g,h); sb3(e,f,g,h,a,b,c,d); rot(a,b,c,d); + k_xor(20,a,b,c,d); sb4(a,b,c,d,e,f,g,h); rot(e,f,g,h); + k_xor(21,e,f,g,h); sb5(e,f,g,h,a,b,c,d); rot(a,b,c,d); + k_xor(22,a,b,c,d); sb6(a,b,c,d,e,f,g,h); rot(e,f,g,h); + k_xor(23,e,f,g,h); sb7(e,f,g,h,a,b,c,d); rot(a,b,c,d); + k_xor(24,a,b,c,d); sb0(a,b,c,d,e,f,g,h); rot(e,f,g,h); + k_xor(25,e,f,g,h); sb1(e,f,g,h,a,b,c,d); rot(a,b,c,d); + k_xor(26,a,b,c,d); sb2(a,b,c,d,e,f,g,h); rot(e,f,g,h); + k_xor(27,e,f,g,h); sb3(e,f,g,h,a,b,c,d); rot(a,b,c,d); + k_xor(28,a,b,c,d); sb4(a,b,c,d,e,f,g,h); rot(e,f,g,h); + k_xor(29,e,f,g,h); sb5(e,f,g,h,a,b,c,d); rot(a,b,c,d); + k_xor(30,a,b,c,d); sb6(a,b,c,d,e,f,g,h); rot(e,f,g,h); + k_xor(31,e,f,g,h); sb7(e,f,g,h,a,b,c,d); + k_xor(32,a,b,c,d); + + out[0] = a; + out[1] = b; + out[2] = c; + out[3] = d; +} + +__device__ static void serpent256_decrypt (const u32 *ks, const u32 *in, u32 *out) +{ + u32 a,b,c,d,e,f,g,h; + u32 t1,t2,t3,t4,t5,t6,t7,t8,t9,t10,t11,t12,t13,t14,t15,t16; + + a = in[0]; + b = in[1]; + c = in[2]; + d = in[3]; + + k_xor(32,a,b,c,d); + ib7(a,b,c,d,e,f,g,h); k_xor(31,e,f,g,h); + irot(e,f,g,h); ib6(e,f,g,h,a,b,c,d); k_xor(30,a,b,c,d); + irot(a,b,c,d); ib5(a,b,c,d,e,f,g,h); k_xor(29,e,f,g,h); + irot(e,f,g,h); ib4(e,f,g,h,a,b,c,d); k_xor(28,a,b,c,d); + irot(a,b,c,d); ib3(a,b,c,d,e,f,g,h); k_xor(27,e,f,g,h); + irot(e,f,g,h); ib2(e,f,g,h,a,b,c,d); k_xor(26,a,b,c,d); + irot(a,b,c,d); ib1(a,b,c,d,e,f,g,h); k_xor(25,e,f,g,h); + irot(e,f,g,h); ib0(e,f,g,h,a,b,c,d); k_xor(24,a,b,c,d); + irot(a,b,c,d); ib7(a,b,c,d,e,f,g,h); k_xor(23,e,f,g,h); + irot(e,f,g,h); ib6(e,f,g,h,a,b,c,d); k_xor(22,a,b,c,d); + irot(a,b,c,d); ib5(a,b,c,d,e,f,g,h); k_xor(21,e,f,g,h); + irot(e,f,g,h); ib4(e,f,g,h,a,b,c,d); k_xor(20,a,b,c,d); + irot(a,b,c,d); ib3(a,b,c,d,e,f,g,h); k_xor(19,e,f,g,h); + irot(e,f,g,h); ib2(e,f,g,h,a,b,c,d); k_xor(18,a,b,c,d); + irot(a,b,c,d); ib1(a,b,c,d,e,f,g,h); k_xor(17,e,f,g,h); + irot(e,f,g,h); ib0(e,f,g,h,a,b,c,d); k_xor(16,a,b,c,d); + irot(a,b,c,d); ib7(a,b,c,d,e,f,g,h); k_xor(15,e,f,g,h); + irot(e,f,g,h); ib6(e,f,g,h,a,b,c,d); k_xor(14,a,b,c,d); + irot(a,b,c,d); ib5(a,b,c,d,e,f,g,h); k_xor(13,e,f,g,h); + irot(e,f,g,h); ib4(e,f,g,h,a,b,c,d); k_xor(12,a,b,c,d); + irot(a,b,c,d); ib3(a,b,c,d,e,f,g,h); k_xor(11,e,f,g,h); + irot(e,f,g,h); ib2(e,f,g,h,a,b,c,d); k_xor(10,a,b,c,d); + irot(a,b,c,d); ib1(a,b,c,d,e,f,g,h); k_xor( 9,e,f,g,h); + irot(e,f,g,h); ib0(e,f,g,h,a,b,c,d); k_xor( 8,a,b,c,d); + irot(a,b,c,d); ib7(a,b,c,d,e,f,g,h); k_xor( 7,e,f,g,h); + irot(e,f,g,h); ib6(e,f,g,h,a,b,c,d); k_xor( 6,a,b,c,d); + irot(a,b,c,d); ib5(a,b,c,d,e,f,g,h); k_xor( 5,e,f,g,h); + irot(e,f,g,h); ib4(e,f,g,h,a,b,c,d); k_xor( 4,a,b,c,d); + irot(a,b,c,d); ib3(a,b,c,d,e,f,g,h); k_xor( 3,e,f,g,h); + irot(e,f,g,h); ib2(e,f,g,h,a,b,c,d); k_xor( 2,a,b,c,d); + irot(a,b,c,d); ib1(a,b,c,d,e,f,g,h); k_xor( 1,e,f,g,h); + irot(e,f,g,h); ib0(e,f,g,h,a,b,c,d); k_xor( 0,a,b,c,d); + + out[0] = a; + out[1] = b; + out[2] = c; + out[3] = d; +} + +__device__ static void serpent256_decrypt_xts (const u32 *ukey1, const u32 *ukey2, const u32 *in, u32 *out) +{ + u32 T[4] = { 0 }; + u32 Z[4] = { 0 }; + + out[0] = in[0]; + out[1] = in[1]; + out[2] = in[2]; + out[3] = in[3]; + + u32 ks[140]; + + serpent256_set_key (ks, ukey2); + serpent256_encrypt (ks, Z, T); + + out[0] ^= T[0]; + out[1] ^= T[1]; + out[2] ^= T[2]; + out[3] ^= T[3]; + + serpent256_set_key (ks, ukey1); + serpent256_decrypt (ks, out, out); + + out[0] ^= T[0]; + out[1] ^= T[1]; + out[2] ^= T[2]; + out[3] ^= T[3]; +} diff --git a/nv/gpu_twofish256_nv.c b/nv/gpu_twofish256_nv.c new file mode 100644 index 0000000000..fcc7ee9e03 --- /dev/null +++ b/nv/gpu_twofish256_nv.c @@ -0,0 +1,466 @@ +/* This is an independent implementation of the encryption algorithm: */ +/* */ +/* Twofish by Bruce Schneier and colleagues */ +/* */ +/* which is a candidate algorithm in the Advanced Encryption Standard */ +/* programme of the US National Institute of Standards and Technology. */ +/* */ +/* Copyright in this implementation is held by Dr B R Gladman but I */ +/* hereby give permission for its free direct or derivative use subject */ +/* to acknowledgment of its origin and compliance with any conditions */ +/* that the originators of t he algorithm place on its exploitation. */ +/* */ +/* My thanks to Doug Whiting and Niels Ferguson for comments that led */ +/* to improvements in this implementation. */ +/* */ +/* Dr Brian Gladman (gladman@seven77.demon.co.uk) 14th January 1999 */ +/* */ +/* -------------------------------------------------------------------- */ +/* */ +/* Cleaned and optimized for GPU use with oclHashcat by Jens Steube */ + +#define extract_byte(x,n) (((x) >> (8 * (n))) & 0xff) + +__device__ __constant__ u32 q_tab[2][256] = +{ + { + 0xA9, 0x67, 0xB3, 0xE8, 0x04, 0xFD, 0xA3, 0x76, 0x9A, 0x92, 0x80, 0x78, + 0xE4, 0xDD, 0xD1, 0x38, 0x0D, 0xC6, 0x35, 0x98, 0x18, 0xF7, 0xEC, 0x6C, + 0x43, 0x75, 0x37, 0x26, 0xFA, 0x13, 0x94, 0x48, 0xF2, 0xD0, 0x8B, 0x30, + 0x84, 0x54, 0xDF, 0x23, 0x19, 0x5B, 0x3D, 0x59, 0xF3, 0xAE, 0xA2, 0x82, + 0x63, 0x01, 0x83, 0x2E, 0xD9, 0x51, 0x9B, 0x7C, 0xA6, 0xEB, 0xA5, 0xBE, + 0x16, 0x0C, 0xE3, 0x61, 0xC0, 0x8C, 0x3A, 0xF5, 0x73, 0x2C, 0x25, 0x0B, + 0xBB, 0x4E, 0x89, 0x6B, 0x53, 0x6A, 0xB4, 0xF1, 0xE1, 0xE6, 0xBD, 0x45, + 0xE2, 0xF4, 0xB6, 0x66, 0xCC, 0x95, 0x03, 0x56, 0xD4, 0x1C, 0x1E, 0xD7, + 0xFB, 0xC3, 0x8E, 0xB5, 0xE9, 0xCF, 0xBF, 0xBA, 0xEA, 0x77, 0x39, 0xAF, + 0x33, 0xC9, 0x62, 0x71, 0x81, 0x79, 0x09, 0xAD, 0x24, 0xCD, 0xF9, 0xD8, + 0xE5, 0xC5, 0xB9, 0x4D, 0x44, 0x08, 0x86, 0xE7, 0xA1, 0x1D, 0xAA, 0xED, + 0x06, 0x70, 0xB2, 0xD2, 0x41, 0x7B, 0xA0, 0x11, 0x31, 0xC2, 0x27, 0x90, + 0x20, 0xF6, 0x60, 0xFF, 0x96, 0x5C, 0xB1, 0xAB, 0x9E, 0x9C, 0x52, 0x1B, + 0x5F, 0x93, 0x0A, 0xEF, 0x91, 0x85, 0x49, 0xEE, 0x2D, 0x4F, 0x8F, 0x3B, + 0x47, 0x87, 0x6D, 0x46, 0xD6, 0x3E, 0x69, 0x64, 0x2A, 0xCE, 0xCB, 0x2F, + 0xFC, 0x97, 0x05, 0x7A, 0xAC, 0x7F, 0xD5, 0x1A, 0x4B, 0x0E, 0xA7, 0x5A, + 0x28, 0x14, 0x3F, 0x29, 0x88, 0x3C, 0x4C, 0x02, 0xB8, 0xDA, 0xB0, 0x17, + 0x55, 0x1F, 0x8A, 0x7D, 0x57, 0xC7, 0x8D, 0x74, 0xB7, 0xC4, 0x9F, 0x72, + 0x7E, 0x15, 0x22, 0x12, 0x58, 0x07, 0x99, 0x34, 0x6E, 0x50, 0xDE, 0x68, + 0x65, 0xBC, 0xDB, 0xF8, 0xC8, 0xA8, 0x2B, 0x40, 0xDC, 0xFE, 0x32, 0xA4, + 0xCA, 0x10, 0x21, 0xF0, 0xD3, 0x5D, 0x0F, 0x00, 0x6F, 0x9D, 0x36, 0x42, + 0x4A, 0x5E, 0xC1, 0xE0 + }, + { + 0x75, 0xF3, 0xC6, 0xF4, 0xDB, 0x7B, 0xFB, 0xC8, 0x4A, 0xD3, 0xE6, 0x6B, + 0x45, 0x7D, 0xE8, 0x4B, 0xD6, 0x32, 0xD8, 0xFD, 0x37, 0x71, 0xF1, 0xE1, + 0x30, 0x0F, 0xF8, 0x1B, 0x87, 0xFA, 0x06, 0x3F, 0x5E, 0xBA, 0xAE, 0x5B, + 0x8A, 0x00, 0xBC, 0x9D, 0x6D, 0xC1, 0xB1, 0x0E, 0x80, 0x5D, 0xD2, 0xD5, + 0xA0, 0x84, 0x07, 0x14, 0xB5, 0x90, 0x2C, 0xA3, 0xB2, 0x73, 0x4C, 0x54, + 0x92, 0x74, 0x36, 0x51, 0x38, 0xB0, 0xBD, 0x5A, 0xFC, 0x60, 0x62, 0x96, + 0x6C, 0x42, 0xF7, 0x10, 0x7C, 0x28, 0x27, 0x8C, 0x13, 0x95, 0x9C, 0xC7, + 0x24, 0x46, 0x3B, 0x70, 0xCA, 0xE3, 0x85, 0xCB, 0x11, 0xD0, 0x93, 0xB8, + 0xA6, 0x83, 0x20, 0xFF, 0x9F, 0x77, 0xC3, 0xCC, 0x03, 0x6F, 0x08, 0xBF, + 0x40, 0xE7, 0x2B, 0xE2, 0x79, 0x0C, 0xAA, 0x82, 0x41, 0x3A, 0xEA, 0xB9, + 0xE4, 0x9A, 0xA4, 0x97, 0x7E, 0xDA, 0x7A, 0x17, 0x66, 0x94, 0xA1, 0x1D, + 0x3D, 0xF0, 0xDE, 0xB3, 0x0B, 0x72, 0xA7, 0x1C, 0xEF, 0xD1, 0x53, 0x3E, + 0x8F, 0x33, 0x26, 0x5F, 0xEC, 0x76, 0x2A, 0x49, 0x81, 0x88, 0xEE, 0x21, + 0xC4, 0x1A, 0xEB, 0xD9, 0xC5, 0x39, 0x99, 0xCD, 0xAD, 0x31, 0x8B, 0x01, + 0x18, 0x23, 0xDD, 0x1F, 0x4E, 0x2D, 0xF9, 0x48, 0x4F, 0xF2, 0x65, 0x8E, + 0x78, 0x5C, 0x58, 0x19, 0x8D, 0xE5, 0x98, 0x57, 0x67, 0x7F, 0x05, 0x64, + 0xAF, 0x63, 0xB6, 0xFE, 0xF5, 0xB7, 0x3C, 0xA5, 0xCE, 0xE9, 0x68, 0x44, + 0xE0, 0x4D, 0x43, 0x69, 0x29, 0x2E, 0xAC, 0x15, 0x59, 0xA8, 0x0A, 0x9E, + 0x6E, 0x47, 0xDF, 0x34, 0x35, 0x6A, 0xCF, 0xDC, 0x22, 0xC9, 0xC0, 0x9B, + 0x89, 0xD4, 0xED, 0xAB, 0x12, 0xA2, 0x0D, 0x52, 0xBB, 0x02, 0x2F, 0xA9, + 0xD7, 0x61, 0x1E, 0xB4, 0x50, 0x04, 0xF6, 0xC2, 0x16, 0x25, 0x86, 0x56, + 0x55, 0x09, 0xBE, 0x91 + } +}; + +#define q(n,x) q_tab[n][x] + +__device__ __constant__ u32 m_tab[4][256] = +{ + { 0xBCBC3275, 0xECEC21F3, 0x202043C6, 0xB3B3C9F4, 0xDADA03DB, 0x02028B7B, + 0xE2E22BFB, 0x9E9EFAC8, 0xC9C9EC4A, 0xD4D409D3, 0x18186BE6, 0x1E1E9F6B, + 0x98980E45, 0xB2B2387D, 0xA6A6D2E8, 0x2626B74B, 0x3C3C57D6, 0x93938A32, + 0x8282EED8, 0x525298FD, 0x7B7BD437, 0xBBBB3771, 0x5B5B97F1, 0x474783E1, + 0x24243C30, 0x5151E20F, 0xBABAC6F8, 0x4A4AF31B, 0xBFBF4887, 0x0D0D70FA, + 0xB0B0B306, 0x7575DE3F, 0xD2D2FD5E, 0x7D7D20BA, 0x666631AE, 0x3A3AA35B, + 0x59591C8A, 0x00000000, 0xCDCD93BC, 0x1A1AE09D, 0xAEAE2C6D, 0x7F7FABC1, + 0x2B2BC7B1, 0xBEBEB90E, 0xE0E0A080, 0x8A8A105D, 0x3B3B52D2, 0x6464BAD5, + 0xD8D888A0, 0xE7E7A584, 0x5F5FE807, 0x1B1B1114, 0x2C2CC2B5, 0xFCFCB490, + 0x3131272C, 0x808065A3, 0x73732AB2, 0x0C0C8173, 0x79795F4C, 0x6B6B4154, + 0x4B4B0292, 0x53536974, 0x94948F36, 0x83831F51, 0x2A2A3638, 0xC4C49CB0, + 0x2222C8BD, 0xD5D5F85A, 0xBDBDC3FC, 0x48487860, 0xFFFFCE62, 0x4C4C0796, + 0x4141776C, 0xC7C7E642, 0xEBEB24F7, 0x1C1C1410, 0x5D5D637C, 0x36362228, + 0x6767C027, 0xE9E9AF8C, 0x4444F913, 0x1414EA95, 0xF5F5BB9C, 0xCFCF18C7, + 0x3F3F2D24, 0xC0C0E346, 0x7272DB3B, 0x54546C70, 0x29294CCA, 0xF0F035E3, + 0x0808FE85, 0xC6C617CB, 0xF3F34F11, 0x8C8CE4D0, 0xA4A45993, 0xCACA96B8, + 0x68683BA6, 0xB8B84D83, 0x38382820, 0xE5E52EFF, 0xADAD569F, 0x0B0B8477, + 0xC8C81DC3, 0x9999FFCC, 0x5858ED03, 0x19199A6F, 0x0E0E0A08, 0x95957EBF, + 0x70705040, 0xF7F730E7, 0x6E6ECF2B, 0x1F1F6EE2, 0xB5B53D79, 0x09090F0C, + 0x616134AA, 0x57571682, 0x9F9F0B41, 0x9D9D803A, 0x111164EA, 0x2525CDB9, + 0xAFAFDDE4, 0x4545089A, 0xDFDF8DA4, 0xA3A35C97, 0xEAEAD57E, 0x353558DA, + 0xEDEDD07A, 0x4343FC17, 0xF8F8CB66, 0xFBFBB194, 0x3737D3A1, 0xFAFA401D, + 0xC2C2683D, 0xB4B4CCF0, 0x32325DDE, 0x9C9C71B3, 0x5656E70B, 0xE3E3DA72, + 0x878760A7, 0x15151B1C, 0xF9F93AEF, 0x6363BFD1, 0x3434A953, 0x9A9A853E, + 0xB1B1428F, 0x7C7CD133, 0x88889B26, 0x3D3DA65F, 0xA1A1D7EC, 0xE4E4DF76, + 0x8181942A, 0x91910149, 0x0F0FFB81, 0xEEEEAA88, 0x161661EE, 0xD7D77321, + 0x9797F5C4, 0xA5A5A81A, 0xFEFE3FEB, 0x6D6DB5D9, 0x7878AEC5, 0xC5C56D39, + 0x1D1DE599, 0x7676A4CD, 0x3E3EDCAD, 0xCBCB6731, 0xB6B6478B, 0xEFEF5B01, + 0x12121E18, 0x6060C523, 0x6A6AB0DD, 0x4D4DF61F, 0xCECEE94E, 0xDEDE7C2D, + 0x55559DF9, 0x7E7E5A48, 0x2121B24F, 0x03037AF2, 0xA0A02665, 0x5E5E198E, + 0x5A5A6678, 0x65654B5C, 0x62624E58, 0xFDFD4519, 0x0606F48D, 0x404086E5, + 0xF2F2BE98, 0x3333AC57, 0x17179067, 0x05058E7F, 0xE8E85E05, 0x4F4F7D64, + 0x89896AAF, 0x10109563, 0x74742FB6, 0x0A0A75FE, 0x5C5C92F5, 0x9B9B74B7, + 0x2D2D333C, 0x3030D6A5, 0x2E2E49CE, 0x494989E9, 0x46467268, 0x77775544, + 0xA8A8D8E0, 0x9696044D, 0x2828BD43, 0xA9A92969, 0xD9D97929, 0x8686912E, + 0xD1D187AC, 0xF4F44A15, 0x8D8D1559, 0xD6D682A8, 0xB9B9BC0A, 0x42420D9E, + 0xF6F6C16E, 0x2F2FB847, 0xDDDD06DF, 0x23233934, 0xCCCC6235, 0xF1F1C46A, + 0xC1C112CF, 0x8585EBDC, 0x8F8F9E22, 0x7171A1C9, 0x9090F0C0, 0xAAAA539B, + 0x0101F189, 0x8B8BE1D4, 0x4E4E8CED, 0x8E8E6FAB, 0xABABA212, 0x6F6F3EA2, + 0xE6E6540D, 0xDBDBF252, 0x92927BBB, 0xB7B7B602, 0x6969CA2F, 0x3939D9A9, + 0xD3D30CD7, 0xA7A72361, 0xA2A2AD1E, 0xC3C399B4, 0x6C6C4450, 0x07070504, + 0x04047FF6, 0x272746C2, 0xACACA716, 0xD0D07625, 0x50501386, 0xDCDCF756, + 0x84841A55, 0xE1E15109, 0x7A7A25BE, 0x1313EF91 }, + + { 0xA9D93939, 0x67901717, 0xB3719C9C, 0xE8D2A6A6, 0x04050707, 0xFD985252, + 0xA3658080, 0x76DFE4E4, 0x9A084545, 0x92024B4B, 0x80A0E0E0, 0x78665A5A, + 0xE4DDAFAF, 0xDDB06A6A, 0xD1BF6363, 0x38362A2A, 0x0D54E6E6, 0xC6432020, + 0x3562CCCC, 0x98BEF2F2, 0x181E1212, 0xF724EBEB, 0xECD7A1A1, 0x6C774141, + 0x43BD2828, 0x7532BCBC, 0x37D47B7B, 0x269B8888, 0xFA700D0D, 0x13F94444, + 0x94B1FBFB, 0x485A7E7E, 0xF27A0303, 0xD0E48C8C, 0x8B47B6B6, 0x303C2424, + 0x84A5E7E7, 0x54416B6B, 0xDF06DDDD, 0x23C56060, 0x1945FDFD, 0x5BA33A3A, + 0x3D68C2C2, 0x59158D8D, 0xF321ECEC, 0xAE316666, 0xA23E6F6F, 0x82165757, + 0x63951010, 0x015BEFEF, 0x834DB8B8, 0x2E918686, 0xD9B56D6D, 0x511F8383, + 0x9B53AAAA, 0x7C635D5D, 0xA63B6868, 0xEB3FFEFE, 0xA5D63030, 0xBE257A7A, + 0x16A7ACAC, 0x0C0F0909, 0xE335F0F0, 0x6123A7A7, 0xC0F09090, 0x8CAFE9E9, + 0x3A809D9D, 0xF5925C5C, 0x73810C0C, 0x2C273131, 0x2576D0D0, 0x0BE75656, + 0xBB7B9292, 0x4EE9CECE, 0x89F10101, 0x6B9F1E1E, 0x53A93434, 0x6AC4F1F1, + 0xB499C3C3, 0xF1975B5B, 0xE1834747, 0xE66B1818, 0xBDC82222, 0x450E9898, + 0xE26E1F1F, 0xF4C9B3B3, 0xB62F7474, 0x66CBF8F8, 0xCCFF9999, 0x95EA1414, + 0x03ED5858, 0x56F7DCDC, 0xD4E18B8B, 0x1C1B1515, 0x1EADA2A2, 0xD70CD3D3, + 0xFB2BE2E2, 0xC31DC8C8, 0x8E195E5E, 0xB5C22C2C, 0xE9894949, 0xCF12C1C1, + 0xBF7E9595, 0xBA207D7D, 0xEA641111, 0x77840B0B, 0x396DC5C5, 0xAF6A8989, + 0x33D17C7C, 0xC9A17171, 0x62CEFFFF, 0x7137BBBB, 0x81FB0F0F, 0x793DB5B5, + 0x0951E1E1, 0xADDC3E3E, 0x242D3F3F, 0xCDA47676, 0xF99D5555, 0xD8EE8282, + 0xE5864040, 0xC5AE7878, 0xB9CD2525, 0x4D049696, 0x44557777, 0x080A0E0E, + 0x86135050, 0xE730F7F7, 0xA1D33737, 0x1D40FAFA, 0xAA346161, 0xED8C4E4E, + 0x06B3B0B0, 0x706C5454, 0xB22A7373, 0xD2523B3B, 0x410B9F9F, 0x7B8B0202, + 0xA088D8D8, 0x114FF3F3, 0x3167CBCB, 0xC2462727, 0x27C06767, 0x90B4FCFC, + 0x20283838, 0xF67F0404, 0x60784848, 0xFF2EE5E5, 0x96074C4C, 0x5C4B6565, + 0xB1C72B2B, 0xAB6F8E8E, 0x9E0D4242, 0x9CBBF5F5, 0x52F2DBDB, 0x1BF34A4A, + 0x5FA63D3D, 0x9359A4A4, 0x0ABCB9B9, 0xEF3AF9F9, 0x91EF1313, 0x85FE0808, + 0x49019191, 0xEE611616, 0x2D7CDEDE, 0x4FB22121, 0x8F42B1B1, 0x3BDB7272, + 0x47B82F2F, 0x8748BFBF, 0x6D2CAEAE, 0x46E3C0C0, 0xD6573C3C, 0x3E859A9A, + 0x6929A9A9, 0x647D4F4F, 0x2A948181, 0xCE492E2E, 0xCB17C6C6, 0x2FCA6969, + 0xFCC3BDBD, 0x975CA3A3, 0x055EE8E8, 0x7AD0EDED, 0xAC87D1D1, 0x7F8E0505, + 0xD5BA6464, 0x1AA8A5A5, 0x4BB72626, 0x0EB9BEBE, 0xA7608787, 0x5AF8D5D5, + 0x28223636, 0x14111B1B, 0x3FDE7575, 0x2979D9D9, 0x88AAEEEE, 0x3C332D2D, + 0x4C5F7979, 0x02B6B7B7, 0xB896CACA, 0xDA583535, 0xB09CC4C4, 0x17FC4343, + 0x551A8484, 0x1FF64D4D, 0x8A1C5959, 0x7D38B2B2, 0x57AC3333, 0xC718CFCF, + 0x8DF40606, 0x74695353, 0xB7749B9B, 0xC4F59797, 0x9F56ADAD, 0x72DAE3E3, + 0x7ED5EAEA, 0x154AF4F4, 0x229E8F8F, 0x12A2ABAB, 0x584E6262, 0x07E85F5F, + 0x99E51D1D, 0x34392323, 0x6EC1F6F6, 0x50446C6C, 0xDE5D3232, 0x68724646, + 0x6526A0A0, 0xBC93CDCD, 0xDB03DADA, 0xF8C6BABA, 0xC8FA9E9E, 0xA882D6D6, + 0x2BCF6E6E, 0x40507070, 0xDCEB8585, 0xFE750A0A, 0x328A9393, 0xA48DDFDF, + 0xCA4C2929, 0x10141C1C, 0x2173D7D7, 0xF0CCB4B4, 0xD309D4D4, 0x5D108A8A, + 0x0FE25151, 0x00000000, 0x6F9A1919, 0x9DE01A1A, 0x368F9494, 0x42E6C7C7, + 0x4AECC9C9, 0x5EFDD2D2, 0xC1AB7F7F, 0xE0D8A8A8 }, + + { 0xBC75BC32, 0xECF3EC21, 0x20C62043, 0xB3F4B3C9, 0xDADBDA03, 0x027B028B, + 0xE2FBE22B, 0x9EC89EFA, 0xC94AC9EC, 0xD4D3D409, 0x18E6186B, 0x1E6B1E9F, + 0x9845980E, 0xB27DB238, 0xA6E8A6D2, 0x264B26B7, 0x3CD63C57, 0x9332938A, + 0x82D882EE, 0x52FD5298, 0x7B377BD4, 0xBB71BB37, 0x5BF15B97, 0x47E14783, + 0x2430243C, 0x510F51E2, 0xBAF8BAC6, 0x4A1B4AF3, 0xBF87BF48, 0x0DFA0D70, + 0xB006B0B3, 0x753F75DE, 0xD25ED2FD, 0x7DBA7D20, 0x66AE6631, 0x3A5B3AA3, + 0x598A591C, 0x00000000, 0xCDBCCD93, 0x1A9D1AE0, 0xAE6DAE2C, 0x7FC17FAB, + 0x2BB12BC7, 0xBE0EBEB9, 0xE080E0A0, 0x8A5D8A10, 0x3BD23B52, 0x64D564BA, + 0xD8A0D888, 0xE784E7A5, 0x5F075FE8, 0x1B141B11, 0x2CB52CC2, 0xFC90FCB4, + 0x312C3127, 0x80A38065, 0x73B2732A, 0x0C730C81, 0x794C795F, 0x6B546B41, + 0x4B924B02, 0x53745369, 0x9436948F, 0x8351831F, 0x2A382A36, 0xC4B0C49C, + 0x22BD22C8, 0xD55AD5F8, 0xBDFCBDC3, 0x48604878, 0xFF62FFCE, 0x4C964C07, + 0x416C4177, 0xC742C7E6, 0xEBF7EB24, 0x1C101C14, 0x5D7C5D63, 0x36283622, + 0x672767C0, 0xE98CE9AF, 0x441344F9, 0x149514EA, 0xF59CF5BB, 0xCFC7CF18, + 0x3F243F2D, 0xC046C0E3, 0x723B72DB, 0x5470546C, 0x29CA294C, 0xF0E3F035, + 0x088508FE, 0xC6CBC617, 0xF311F34F, 0x8CD08CE4, 0xA493A459, 0xCAB8CA96, + 0x68A6683B, 0xB883B84D, 0x38203828, 0xE5FFE52E, 0xAD9FAD56, 0x0B770B84, + 0xC8C3C81D, 0x99CC99FF, 0x580358ED, 0x196F199A, 0x0E080E0A, 0x95BF957E, + 0x70407050, 0xF7E7F730, 0x6E2B6ECF, 0x1FE21F6E, 0xB579B53D, 0x090C090F, + 0x61AA6134, 0x57825716, 0x9F419F0B, 0x9D3A9D80, 0x11EA1164, 0x25B925CD, + 0xAFE4AFDD, 0x459A4508, 0xDFA4DF8D, 0xA397A35C, 0xEA7EEAD5, 0x35DA3558, + 0xED7AEDD0, 0x431743FC, 0xF866F8CB, 0xFB94FBB1, 0x37A137D3, 0xFA1DFA40, + 0xC23DC268, 0xB4F0B4CC, 0x32DE325D, 0x9CB39C71, 0x560B56E7, 0xE372E3DA, + 0x87A78760, 0x151C151B, 0xF9EFF93A, 0x63D163BF, 0x345334A9, 0x9A3E9A85, + 0xB18FB142, 0x7C337CD1, 0x8826889B, 0x3D5F3DA6, 0xA1ECA1D7, 0xE476E4DF, + 0x812A8194, 0x91499101, 0x0F810FFB, 0xEE88EEAA, 0x16EE1661, 0xD721D773, + 0x97C497F5, 0xA51AA5A8, 0xFEEBFE3F, 0x6DD96DB5, 0x78C578AE, 0xC539C56D, + 0x1D991DE5, 0x76CD76A4, 0x3EAD3EDC, 0xCB31CB67, 0xB68BB647, 0xEF01EF5B, + 0x1218121E, 0x602360C5, 0x6ADD6AB0, 0x4D1F4DF6, 0xCE4ECEE9, 0xDE2DDE7C, + 0x55F9559D, 0x7E487E5A, 0x214F21B2, 0x03F2037A, 0xA065A026, 0x5E8E5E19, + 0x5A785A66, 0x655C654B, 0x6258624E, 0xFD19FD45, 0x068D06F4, 0x40E54086, + 0xF298F2BE, 0x335733AC, 0x17671790, 0x057F058E, 0xE805E85E, 0x4F644F7D, + 0x89AF896A, 0x10631095, 0x74B6742F, 0x0AFE0A75, 0x5CF55C92, 0x9BB79B74, + 0x2D3C2D33, 0x30A530D6, 0x2ECE2E49, 0x49E94989, 0x46684672, 0x77447755, + 0xA8E0A8D8, 0x964D9604, 0x284328BD, 0xA969A929, 0xD929D979, 0x862E8691, + 0xD1ACD187, 0xF415F44A, 0x8D598D15, 0xD6A8D682, 0xB90AB9BC, 0x429E420D, + 0xF66EF6C1, 0x2F472FB8, 0xDDDFDD06, 0x23342339, 0xCC35CC62, 0xF16AF1C4, + 0xC1CFC112, 0x85DC85EB, 0x8F228F9E, 0x71C971A1, 0x90C090F0, 0xAA9BAA53, + 0x018901F1, 0x8BD48BE1, 0x4EED4E8C, 0x8EAB8E6F, 0xAB12ABA2, 0x6FA26F3E, + 0xE60DE654, 0xDB52DBF2, 0x92BB927B, 0xB702B7B6, 0x692F69CA, 0x39A939D9, + 0xD3D7D30C, 0xA761A723, 0xA21EA2AD, 0xC3B4C399, 0x6C506C44, 0x07040705, + 0x04F6047F, 0x27C22746, 0xAC16ACA7, 0xD025D076, 0x50865013, 0xDC56DCF7, + 0x8455841A, 0xE109E151, 0x7ABE7A25, 0x139113EF }, + + { 0xD939A9D9, 0x90176790, 0x719CB371, 0xD2A6E8D2, 0x05070405, 0x9852FD98, + 0x6580A365, 0xDFE476DF, 0x08459A08, 0x024B9202, 0xA0E080A0, 0x665A7866, + 0xDDAFE4DD, 0xB06ADDB0, 0xBF63D1BF, 0x362A3836, 0x54E60D54, 0x4320C643, + 0x62CC3562, 0xBEF298BE, 0x1E12181E, 0x24EBF724, 0xD7A1ECD7, 0x77416C77, + 0xBD2843BD, 0x32BC7532, 0xD47B37D4, 0x9B88269B, 0x700DFA70, 0xF94413F9, + 0xB1FB94B1, 0x5A7E485A, 0x7A03F27A, 0xE48CD0E4, 0x47B68B47, 0x3C24303C, + 0xA5E784A5, 0x416B5441, 0x06DDDF06, 0xC56023C5, 0x45FD1945, 0xA33A5BA3, + 0x68C23D68, 0x158D5915, 0x21ECF321, 0x3166AE31, 0x3E6FA23E, 0x16578216, + 0x95106395, 0x5BEF015B, 0x4DB8834D, 0x91862E91, 0xB56DD9B5, 0x1F83511F, + 0x53AA9B53, 0x635D7C63, 0x3B68A63B, 0x3FFEEB3F, 0xD630A5D6, 0x257ABE25, + 0xA7AC16A7, 0x0F090C0F, 0x35F0E335, 0x23A76123, 0xF090C0F0, 0xAFE98CAF, + 0x809D3A80, 0x925CF592, 0x810C7381, 0x27312C27, 0x76D02576, 0xE7560BE7, + 0x7B92BB7B, 0xE9CE4EE9, 0xF10189F1, 0x9F1E6B9F, 0xA93453A9, 0xC4F16AC4, + 0x99C3B499, 0x975BF197, 0x8347E183, 0x6B18E66B, 0xC822BDC8, 0x0E98450E, + 0x6E1FE26E, 0xC9B3F4C9, 0x2F74B62F, 0xCBF866CB, 0xFF99CCFF, 0xEA1495EA, + 0xED5803ED, 0xF7DC56F7, 0xE18BD4E1, 0x1B151C1B, 0xADA21EAD, 0x0CD3D70C, + 0x2BE2FB2B, 0x1DC8C31D, 0x195E8E19, 0xC22CB5C2, 0x8949E989, 0x12C1CF12, + 0x7E95BF7E, 0x207DBA20, 0x6411EA64, 0x840B7784, 0x6DC5396D, 0x6A89AF6A, + 0xD17C33D1, 0xA171C9A1, 0xCEFF62CE, 0x37BB7137, 0xFB0F81FB, 0x3DB5793D, + 0x51E10951, 0xDC3EADDC, 0x2D3F242D, 0xA476CDA4, 0x9D55F99D, 0xEE82D8EE, + 0x8640E586, 0xAE78C5AE, 0xCD25B9CD, 0x04964D04, 0x55774455, 0x0A0E080A, + 0x13508613, 0x30F7E730, 0xD337A1D3, 0x40FA1D40, 0x3461AA34, 0x8C4EED8C, + 0xB3B006B3, 0x6C54706C, 0x2A73B22A, 0x523BD252, 0x0B9F410B, 0x8B027B8B, + 0x88D8A088, 0x4FF3114F, 0x67CB3167, 0x4627C246, 0xC06727C0, 0xB4FC90B4, + 0x28382028, 0x7F04F67F, 0x78486078, 0x2EE5FF2E, 0x074C9607, 0x4B655C4B, + 0xC72BB1C7, 0x6F8EAB6F, 0x0D429E0D, 0xBBF59CBB, 0xF2DB52F2, 0xF34A1BF3, + 0xA63D5FA6, 0x59A49359, 0xBCB90ABC, 0x3AF9EF3A, 0xEF1391EF, 0xFE0885FE, + 0x01914901, 0x6116EE61, 0x7CDE2D7C, 0xB2214FB2, 0x42B18F42, 0xDB723BDB, + 0xB82F47B8, 0x48BF8748, 0x2CAE6D2C, 0xE3C046E3, 0x573CD657, 0x859A3E85, + 0x29A96929, 0x7D4F647D, 0x94812A94, 0x492ECE49, 0x17C6CB17, 0xCA692FCA, + 0xC3BDFCC3, 0x5CA3975C, 0x5EE8055E, 0xD0ED7AD0, 0x87D1AC87, 0x8E057F8E, + 0xBA64D5BA, 0xA8A51AA8, 0xB7264BB7, 0xB9BE0EB9, 0x6087A760, 0xF8D55AF8, + 0x22362822, 0x111B1411, 0xDE753FDE, 0x79D92979, 0xAAEE88AA, 0x332D3C33, + 0x5F794C5F, 0xB6B702B6, 0x96CAB896, 0x5835DA58, 0x9CC4B09C, 0xFC4317FC, + 0x1A84551A, 0xF64D1FF6, 0x1C598A1C, 0x38B27D38, 0xAC3357AC, 0x18CFC718, + 0xF4068DF4, 0x69537469, 0x749BB774, 0xF597C4F5, 0x56AD9F56, 0xDAE372DA, + 0xD5EA7ED5, 0x4AF4154A, 0x9E8F229E, 0xA2AB12A2, 0x4E62584E, 0xE85F07E8, + 0xE51D99E5, 0x39233439, 0xC1F66EC1, 0x446C5044, 0x5D32DE5D, 0x72466872, + 0x26A06526, 0x93CDBC93, 0x03DADB03, 0xC6BAF8C6, 0xFA9EC8FA, 0x82D6A882, + 0xCF6E2BCF, 0x50704050, 0xEB85DCEB, 0x750AFE75, 0x8A93328A, 0x8DDFA48D, + 0x4C29CA4C, 0x141C1014, 0x73D72173, 0xCCB4F0CC, 0x09D4D309, 0x108A5D10, + 0xE2510FE2, 0x00000000, 0x9A196F9A, 0xE01A9DE0, 0x8F94368F, 0xE6C742E6, + 0xECC94AEC, 0xFDD25EFD, 0xAB7FC1AB, 0xD8A8E0D8 } +}; + +#define mds(n,x) m_tab[n][x] + +__device__ static u32 h_fun (u32 *sk, u32 *lk, const u32 x, const u32 *key) +{ + u32 b0, b1, b2, b3; + + b0 = extract_byte (x, 0); + b1 = extract_byte (x, 1); + b2 = extract_byte (x, 2); + b3 = extract_byte (x, 3); + + b0 = q (1, b0) ^ extract_byte (key[3], 0); + b1 = q (0, b1) ^ extract_byte (key[3], 1); + b2 = q (0, b2) ^ extract_byte (key[3], 2); + b3 = q (1, b3) ^ extract_byte (key[3], 3); + + b0 = q (1, b0) ^ extract_byte (key[2], 0); + b1 = q (1, b1) ^ extract_byte (key[2], 1); + b2 = q (0, b2) ^ extract_byte (key[2], 2); + b3 = q (0, b3) ^ extract_byte (key[2], 3); + + b0 = q (0, (q (0, b0) ^ extract_byte (key[1], 0))) ^ extract_byte (key[0], 0); + b1 = q (0, (q (1, b1) ^ extract_byte (key[1], 1))) ^ extract_byte (key[0], 1); + b2 = q (1, (q (0, b2) ^ extract_byte (key[1], 2))) ^ extract_byte (key[0], 2); + b3 = q (1, (q (1, b3) ^ extract_byte (key[1], 3))) ^ extract_byte (key[0], 3); + + return mds (0, b0) ^ mds (1, b1) ^ mds (2, b2) ^ mds (3, b3); +} + +#define q40(x,k) q (0, q (0, q (1, q (1, x) ^ extract_byte (k[3], 0)) ^ extract_byte (k[2], 0)) ^ extract_byte (k[1], 0)) ^ extract_byte (k[0], 0) +#define q41(x,k) q (0, q (1, q (1, q (0, x) ^ extract_byte (k[3], 1)) ^ extract_byte (k[2], 1)) ^ extract_byte (k[1], 1)) ^ extract_byte (k[0], 1) +#define q42(x,k) q (1, q (0, q (0, q (0, x) ^ extract_byte (k[3], 2)) ^ extract_byte (k[2], 2)) ^ extract_byte (k[1], 2)) ^ extract_byte (k[0], 2) +#define q43(x,k) q (1, q (1, q (0, q (1, x) ^ extract_byte (k[3], 3)) ^ extract_byte (k[2], 3)) ^ extract_byte (k[1], 3)) ^ extract_byte (k[0], 3) + +#define g1_fun(x) \ + (mds (0, q40 (extract_byte (x, 3), sk)) ^ \ + mds (1, q41 (extract_byte (x, 0), sk)) ^ \ + mds (2, q42 (extract_byte (x, 1), sk)) ^ \ + mds (3, q43 (extract_byte (x, 2), sk))) + +#define g0_fun(x) \ + (mds (0, q40 (extract_byte (x, 0), sk)) ^ \ + mds (1, q41 (extract_byte (x, 1), sk)) ^ \ + mds (2, q42 (extract_byte (x, 2), sk)) ^ \ + mds (3, q43 (extract_byte (x, 3), sk))) + +__device__ static u32 mds_rem (u32 p0, u32 p1) +{ + #define G_MOD 0x14d + + for (int i = 0; i < 8; i++) + { + u32 t = p1 >> 24; + + p1 = (p1 << 8) | (p0 >> 24); + + p0 <<= 8; + + u32 u = (t << 1); + + if (t & 0x80) u ^= G_MOD; + + p1 ^= t ^ (u << 16); + + u ^= (t >> 1); + + if (t & 0x01) u ^= G_MOD >> 1; + + p1 ^= (u << 24) | (u << 8); + } + + return p1; +} + +__device__ static void twofish256_set_key (u32 *sk, u32 *lk, const u32 *ukey) +{ + u32 me_key[4]; + + me_key[0] = ukey[0]; + me_key[1] = ukey[2]; + me_key[2] = ukey[4]; + me_key[3] = ukey[6]; + + u32 mo_key[4]; + + mo_key[0] = ukey[1]; + mo_key[1] = ukey[3]; + mo_key[2] = ukey[5]; + mo_key[3] = ukey[7]; + + sk[3] = mds_rem (me_key[0], mo_key[0]); + sk[2] = mds_rem (me_key[1], mo_key[1]); + sk[1] = mds_rem (me_key[2], mo_key[2]); + sk[0] = mds_rem (me_key[3], mo_key[3]); + + for (int i = 0; i < 40; i += 2) + { + u32 a = 0x01010101 * i; + u32 b = 0x01010101 + a; + + a = h_fun (sk, lk, a, me_key); + b = h_fun (sk, lk, b, mo_key); + + b = rotl32 (b, 8); + + lk[i + 0] = a + b; + lk[i + 1] = rotl32 (a + 2 * b, 9); + } +} + +#define f_rnd(i) \ +{ \ + u32 t0 = g0_fun (data[0]); \ + u32 t1 = g1_fun (data[1]); \ + data[2] = rotr32 (data[2] ^ (t0 + t1 + lk[4 * (i) + 8]), 1); \ + data[3] = rotl32 (data[3], 1) ^ (t0 + 2 * t1 + lk[4 * (i) + 9]); \ + u32 t2 = g0_fun (data[2]); \ + u32 t3 = g1_fun (data[3]); \ + data[0] = rotr32 (data[0] ^ (t2 + t3 + lk[4 * (i) + 10]), 1); \ + data[1] = rotl32 (data[1], 1) ^ (t2 + 2 * t3 + lk[4 * (i) + 11]); \ +} + +__device__ static void twofish256_encrypt (const u32 *sk, const u32 *lk, const u32 *in, u32 *out) +{ + u32 data[4]; + + data[0] = in[0] ^ lk[0]; + data[1] = in[1] ^ lk[1]; + data[2] = in[2] ^ lk[2]; + data[3] = in[3] ^ lk[3]; + + f_rnd (0); + f_rnd (1); + f_rnd (2); + f_rnd (3); + f_rnd (4); + f_rnd (5); + f_rnd (6); + f_rnd (7); + + out[0] = data[2] ^ lk[4]; + out[1] = data[3] ^ lk[5]; + out[2] = data[0] ^ lk[6]; + out[3] = data[1] ^ lk[7]; +} + +#define i_rnd(i) \ +{ \ + u32 t0 = g0_fun (data[0]); \ + u32 t1 = g1_fun (data[1]); \ + data[2] = rotl32 (data[2], 1) ^ (t0 + t1 + lk[4 * (i) + 10]); \ + data[3] = rotr32 (data[3] ^ (t0 + 2 * t1 + lk[4 * (i) + 11]), 1); \ + u32 t2 = g0_fun (data[2]); \ + u32 t3 = g1_fun (data[3]); \ + data[0] = rotl32 (data[0], 1) ^ (t2 + t3 + lk[4 * (i) + 8]); \ + data[1] = rotr32 (data[1] ^ (t2 + 2 * t3 + lk[4 * (i) + 9]), 1); \ +} + +__device__ static void twofish256_decrypt (const u32 *sk, const u32 *lk, const u32 *in, u32 *out) +{ + u32 data[4]; + + data[0] = in[0] ^ lk[4]; + data[1] = in[1] ^ lk[5]; + data[2] = in[2] ^ lk[6]; + data[3] = in[3] ^ lk[7]; + + i_rnd (7); + i_rnd (6); + i_rnd (5); + i_rnd (4); + i_rnd (3); + i_rnd (2); + i_rnd (1); + i_rnd (0); + + out[0] = data[2] ^ lk[0]; + out[1] = data[3] ^ lk[1]; + out[2] = data[0] ^ lk[2]; + out[3] = data[1] ^ lk[3]; +} + +__device__ static void twofish256_decrypt_xts (const u32 *ukey1, const u32 *ukey2, const u32 *in, u32 *out) +{ + u32 T[4] = { 0 }; + u32 Z[4] = { 0 }; + + out[0] = in[0]; + out[1] = in[1]; + out[2] = in[2]; + out[3] = in[3]; + + u32 sk[4]; u32 lk[40]; + + twofish256_set_key (sk, lk, ukey2); + twofish256_encrypt (sk, lk, Z, T); + + out[0] ^= T[0]; + out[1] ^= T[1]; + out[2] ^= T[2]; + out[3] ^= T[3]; + + twofish256_set_key (sk, lk, ukey1); + twofish256_decrypt (sk, lk, out, out); + + out[0] ^= T[0]; + out[1] ^= T[1]; + out[2] ^= T[2]; + out[3] ^= T[3]; +} diff --git a/nv/m00000_a0.cu b/nv/m00000_a0.cu new file mode 100644 index 0000000000..e9c7c10bdd --- /dev/null +++ b/nv/m00000_a0.cu @@ -0,0 +1,392 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _MD5_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW2 +#define VECT_SIZE1 +#endif + +#define DGST_R0 0 +#define DGST_R1 3 +#define DGST_R2 2 +#define DGST_R3 1 + +#include "include/kernel_functions.c" +#include "types_nv.c" +#include "common_nv.c" +#include "include/rp_gpu.h" +#include "rp_nv.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +__device__ __constant__ gpu_rule_t c_rules[1024]; + +extern "C" __global__ void __launch_bounds__ (256, 1) m00000_m04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + u32x pw_buf1[4]; + + pw_buf1[0] = pws[gid].i[ 4]; + pw_buf1[1] = pws[gid].i[ 5]; + pw_buf1[2] = pws[gid].i[ 6]; + pw_buf1[3] = pws[gid].i[ 7]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + + w0[0] = pw_buf0[0]; + w0[1] = pw_buf0[1]; + w0[2] = pw_buf0[2]; + w0[3] = pw_buf0[3]; + + u32x w1[4]; + + w1[0] = pw_buf1[0]; + w1[1] = pw_buf1[1]; + w1[2] = pw_buf1[2]; + w1[3] = pw_buf1[3]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 out_len = apply_rules (c_rules[il_pos].cmds, w0, w1, pw_len); + + append_0x80_2 (w0, w1, out_len); + + w3[2] = out_len * 8; + + u32x tmp2; + + u32x a = MD5M_A; + u32x b = MD5M_B; + u32x c = MD5M_C; + u32x d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H1, a, b, c, d, w1[1], MD5C20, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w2[0], MD5C21, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w2[3], MD5C22, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w3[2], MD5C23, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w0[1], MD5C24, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w1[0], MD5C25, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w1[3], MD5C26, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w2[2], MD5C27, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w3[1], MD5C28, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w0[0], MD5C29, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w0[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w1[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w2[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w3[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w3[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w0[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1[0], MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w2[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2[1], MD5C3f, MD5S33); + + + const u32x r0 = a; + const u32x r1 = d; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_M + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m00000_m08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m00000_m16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m00000_s04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + u32x pw_buf1[4]; + + pw_buf1[0] = pws[gid].i[ 4]; + pw_buf1[1] = pws[gid].i[ 5]; + pw_buf1[2] = pws[gid].i[ 6]; + pw_buf1[3] = pws[gid].i[ 7]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + + w0[0] = pw_buf0[0]; + w0[1] = pw_buf0[1]; + w0[2] = pw_buf0[2]; + w0[3] = pw_buf0[3]; + + u32x w1[4]; + + w1[0] = pw_buf1[0]; + w1[1] = pw_buf1[1]; + w1[2] = pw_buf1[2]; + w1[3] = pw_buf1[3]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 out_len = apply_rules (c_rules[il_pos].cmds, w0, w1, pw_len); + + append_0x80_2 (w0, w1, out_len); + + w3[2] = out_len * 8; + + u32x tmp2; + + u32x a = MD5M_A; + u32x b = MD5M_B; + u32x c = MD5M_C; + u32x d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H1, a, b, c, d, w1[1], MD5C20, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w2[0], MD5C21, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w2[3], MD5C22, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w3[2], MD5C23, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w0[1], MD5C24, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w1[0], MD5C25, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w1[3], MD5C26, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w2[2], MD5C27, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w3[1], MD5C28, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w0[0], MD5C29, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w0[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w1[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w2[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w3[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w3[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w0[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1[0], MD5C3c, MD5S30); + + bool q_cond = (search[0] != a); + + if (q_cond) continue; + + MD5_STEP (MD5_I , d, a, b, c, w2[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2[1], MD5C3f, MD5S33); + + + const u32x r0 = a; + const u32x r1 = d; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_S + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m00000_s08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m00000_s16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/nv/m00000_a1.cu b/nv/m00000_a1.cu new file mode 100644 index 0000000000..851877337f --- /dev/null +++ b/nv/m00000_a1.cu @@ -0,0 +1,494 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _MD5_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW2 +#define VECT_SIZE4 +#endif + +#define DGST_R0 0 +#define DGST_R1 3 +#define DGST_R2 2 +#define DGST_R3 1 + +#include "include/kernel_functions.c" +#include "types_nv.c" +#include "common_nv.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +__device__ __constant__ comb_t c_combs[1024]; + +extern "C" __global__ void __launch_bounds__ (256, 1) m00000_m04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + append_0x80_2 (wordl0, wordl1, pw_l_len); + + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, c_combs[0].pw_len); + } + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = c_combs[il_pos].pw_len; + + const u32 pw_len = pw_l_len + pw_r_len; + + u32 wordr0[4]; + + wordr0[0] = c_combs[il_pos].i[0]; + wordr0[1] = c_combs[il_pos].i[1]; + wordr0[2] = c_combs[il_pos].i[2]; + wordr0[3] = c_combs[il_pos].i[3]; + + u32 wordr1[4]; + + wordr1[0] = c_combs[il_pos].i[4]; + wordr1[1] = c_combs[il_pos].i[5]; + wordr1[2] = c_combs[il_pos].i[6]; + wordr1[3] = c_combs[il_pos].i[7]; + + u32 wordr2[4]; + + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + + u32 wordr3[4]; + + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + u32x w0[4]; + + w0[0] = wordl0[0] | wordr0[0]; + w0[1] = wordl0[1] | wordr0[1]; + w0[2] = wordl0[2] | wordr0[2]; + w0[3] = wordl0[3] | wordr0[3]; + + u32x w1[4]; + + w1[0] = wordl1[0] | wordr1[0]; + w1[1] = wordl1[1] | wordr1[1]; + w1[2] = wordl1[2] | wordr1[2]; + w1[3] = wordl1[3] | wordr1[3]; + + u32x w2[4]; + + w2[0] = wordl2[0] | wordr2[0]; + w2[1] = wordl2[1] | wordr2[1]; + w2[2] = wordl2[2] | wordr2[2]; + w2[3] = wordl2[3] | wordr2[3]; + + u32x w3[4]; + + w3[0] = wordl3[0] | wordr3[0]; + w3[1] = wordl3[1] | wordr3[1]; + w3[2] = pw_len * 8; + w3[3] = 0; + + u32x tmp2; + + u32x a = MD5M_A; + u32x b = MD5M_B; + u32x c = MD5M_C; + u32x d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H1, a, b, c, d, w1[1], MD5C20, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w2[0], MD5C21, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w2[3], MD5C22, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w3[2], MD5C23, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w0[1], MD5C24, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w1[0], MD5C25, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w1[3], MD5C26, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w2[2], MD5C27, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w3[1], MD5C28, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w0[0], MD5C29, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w0[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w1[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w2[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w3[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w3[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w0[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1[0], MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w2[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2[1], MD5C3f, MD5S33); + + + const u32x r0 = a; + const u32x r1 = d; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_M + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m00000_m08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m00000_m16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m00000_s04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + append_0x80_2 (wordl0, wordl1, pw_l_len); + + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, c_combs[0].pw_len); + } + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = c_combs[il_pos].pw_len; + + const u32 pw_len = pw_l_len + pw_r_len; + + u32 wordr0[4]; + + wordr0[0] = c_combs[il_pos].i[0]; + wordr0[1] = c_combs[il_pos].i[1]; + wordr0[2] = c_combs[il_pos].i[2]; + wordr0[3] = c_combs[il_pos].i[3]; + + u32 wordr1[4]; + + wordr1[0] = c_combs[il_pos].i[4]; + wordr1[1] = c_combs[il_pos].i[5]; + wordr1[2] = c_combs[il_pos].i[6]; + wordr1[3] = c_combs[il_pos].i[7]; + + u32 wordr2[4]; + + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + + u32 wordr3[4]; + + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + u32x w0[4]; + + w0[0] = wordl0[0] | wordr0[0]; + w0[1] = wordl0[1] | wordr0[1]; + w0[2] = wordl0[2] | wordr0[2]; + w0[3] = wordl0[3] | wordr0[3]; + + u32x w1[4]; + + w1[0] = wordl1[0] | wordr1[0]; + w1[1] = wordl1[1] | wordr1[1]; + w1[2] = wordl1[2] | wordr1[2]; + w1[3] = wordl1[3] | wordr1[3]; + + u32x w2[4]; + + w2[0] = wordl2[0] | wordr2[0]; + w2[1] = wordl2[1] | wordr2[1]; + w2[2] = wordl2[2] | wordr2[2]; + w2[3] = wordl2[3] | wordr2[3]; + + u32x w3[4]; + + w3[0] = wordl3[0] | wordr3[0]; + w3[1] = wordl3[1] | wordr3[1]; + w3[2] = pw_len * 8; + w3[3] = 0; + + u32x tmp2; + + u32x a = MD5M_A; + u32x b = MD5M_B; + u32x c = MD5M_C; + u32x d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H1, a, b, c, d, w1[1], MD5C20, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w2[0], MD5C21, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w2[3], MD5C22, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w3[2], MD5C23, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w0[1], MD5C24, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w1[0], MD5C25, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w1[3], MD5C26, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w2[2], MD5C27, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w3[1], MD5C28, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w0[0], MD5C29, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w0[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w1[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w2[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w3[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w3[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w0[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1[0], MD5C3c, MD5S30); + + bool q_cond = (search[0] != a); + + if (q_cond) continue; + + MD5_STEP (MD5_I , d, a, b, c, w2[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2[1], MD5C3f, MD5S33); + + + const u32x r0 = a; + const u32x r1 = d; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_S + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m00000_s08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m00000_s16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/nv/m00000_a3.cu b/nv/m00000_a3.cu new file mode 100644 index 0000000000..3ac7d75f6d --- /dev/null +++ b/nv/m00000_a3.cu @@ -0,0 +1,703 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _MD5_ +#define _SCALAR_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW2 +#define VECT_SIZE4 +#endif + +#define DGST_R0 0 +#define DGST_R1 3 +#define DGST_R2 2 +#define DGST_R3 1 + +#include "include/kernel_functions.c" +#include "types_nv.c" +#include "common_nv.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4_warp.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4_warp.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4_warp.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4_warp.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4_warp.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4_warp.c" +#endif + +#define MD5_STEP_REV(f,a,b,c,d,x,t,s) \ +{ \ + a -= b; \ + a = rotr32 (a, s); \ + a -= f (b, c, d); \ + a -= x; \ + a -= t; \ +} + +#define MD5_STEP_REV1(f,a,b,c,d,x,t,s) \ +{ \ + a -= b; \ + a = rotr32 (a, s); \ + a -= x; \ + a -= t; \ +} + +__device__ __constant__ u32x c_bfs[1024]; + +__device__ static void m00000m (u32 w[16], const u32 pw_len, const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const u32x * words_buf_r, void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset) +{ + /** + * modifier + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + const u32 lid = threadIdx.x; + + + /** + * base + */ + + const u32 F_w0c00 = 0 + MD5C00; + const u32 F_w1c01 = w[ 1] + MD5C01; + const u32 F_w2c02 = w[ 2] + MD5C02; + const u32 F_w3c03 = w[ 3] + MD5C03; + const u32 F_w4c04 = w[ 4] + MD5C04; + const u32 F_w5c05 = w[ 5] + MD5C05; + const u32 F_w6c06 = w[ 6] + MD5C06; + const u32 F_w7c07 = w[ 7] + MD5C07; + const u32 F_w8c08 = w[ 8] + MD5C08; + const u32 F_w9c09 = w[ 9] + MD5C09; + const u32 F_wac0a = w[10] + MD5C0a; + const u32 F_wbc0b = w[11] + MD5C0b; + const u32 F_wcc0c = w[12] + MD5C0c; + const u32 F_wdc0d = w[13] + MD5C0d; + const u32 F_wec0e = w[14] + MD5C0e; + const u32 F_wfc0f = w[15] + MD5C0f; + + const u32 G_w1c10 = w[ 1] + MD5C10; + const u32 G_w6c11 = w[ 6] + MD5C11; + const u32 G_wbc12 = w[11] + MD5C12; + const u32 G_w0c13 = 0 + MD5C13; + const u32 G_w5c14 = w[ 5] + MD5C14; + const u32 G_wac15 = w[10] + MD5C15; + const u32 G_wfc16 = w[15] + MD5C16; + const u32 G_w4c17 = w[ 4] + MD5C17; + const u32 G_w9c18 = w[ 9] + MD5C18; + const u32 G_wec19 = w[14] + MD5C19; + const u32 G_w3c1a = w[ 3] + MD5C1a; + const u32 G_w8c1b = w[ 8] + MD5C1b; + const u32 G_wdc1c = w[13] + MD5C1c; + const u32 G_w2c1d = w[ 2] + MD5C1d; + const u32 G_w7c1e = w[ 7] + MD5C1e; + const u32 G_wcc1f = w[12] + MD5C1f; + + const u32 H_w5c20 = w[ 5] + MD5C20; + const u32 H_w8c21 = w[ 8] + MD5C21; + const u32 H_wbc22 = w[11] + MD5C22; + const u32 H_wec23 = w[14] + MD5C23; + const u32 H_w1c24 = w[ 1] + MD5C24; + const u32 H_w4c25 = w[ 4] + MD5C25; + const u32 H_w7c26 = w[ 7] + MD5C26; + const u32 H_wac27 = w[10] + MD5C27; + const u32 H_wdc28 = w[13] + MD5C28; + const u32 H_w0c29 = 0 + MD5C29; + const u32 H_w3c2a = w[ 3] + MD5C2a; + const u32 H_w6c2b = w[ 6] + MD5C2b; + const u32 H_w9c2c = w[ 9] + MD5C2c; + const u32 H_wcc2d = w[12] + MD5C2d; + const u32 H_wfc2e = w[15] + MD5C2e; + const u32 H_w2c2f = w[ 2] + MD5C2f; + + const u32 I_w0c30 = 0 + MD5C30; + const u32 I_w7c31 = w[ 7] + MD5C31; + const u32 I_wec32 = w[14] + MD5C32; + const u32 I_w5c33 = w[ 5] + MD5C33; + const u32 I_wcc34 = w[12] + MD5C34; + const u32 I_w3c35 = w[ 3] + MD5C35; + const u32 I_wac36 = w[10] + MD5C36; + const u32 I_w1c37 = w[ 1] + MD5C37; + const u32 I_w8c38 = w[ 8] + MD5C38; + const u32 I_wfc39 = w[15] + MD5C39; + const u32 I_w6c3a = w[ 6] + MD5C3a; + const u32 I_wdc3b = w[13] + MD5C3b; + const u32 I_w4c3c = w[ 4] + MD5C3c; + const u32 I_wbc3d = w[11] + MD5C3d; + const u32 I_w2c3e = w[ 2] + MD5C3e; + const u32 I_w9c3f = w[ 9] + MD5C3f; + + /** + * loop + */ + + const u32 bf_loops = ceil ((float) bfs_cnt / VECT_DIV); + + u32x w0l = w[0]; + + for (u32 il_pos = 0; il_pos < bf_loops; il_pos++) + { + const u32x w0r = c_bfs[il_pos]; + + const u32x w0 = w0l | w0r; + + u32x tmp2; + + u32x a = MD5M_A; + u32x b = MD5M_B; + u32x c = MD5M_C; + u32x d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0, F_w0c00, MD5S00); + MD5_STEP0(MD5_Fo, d, a, b, c, F_w1c01, MD5S01); + MD5_STEP0(MD5_Fo, c, d, a, b, F_w2c02, MD5S02); + MD5_STEP0(MD5_Fo, b, c, d, a, F_w3c03, MD5S03); + MD5_STEP0(MD5_Fo, a, b, c, d, F_w4c04, MD5S00); + MD5_STEP0(MD5_Fo, d, a, b, c, F_w5c05, MD5S01); + MD5_STEP0(MD5_Fo, c, d, a, b, F_w6c06, MD5S02); + MD5_STEP0(MD5_Fo, b, c, d, a, F_w7c07, MD5S03); + MD5_STEP0(MD5_Fo, a, b, c, d, F_w8c08, MD5S00); + MD5_STEP0(MD5_Fo, d, a, b, c, F_w9c09, MD5S01); + MD5_STEP0(MD5_Fo, c, d, a, b, F_wac0a, MD5S02); + MD5_STEP0(MD5_Fo, b, c, d, a, F_wbc0b, MD5S03); + MD5_STEP0(MD5_Fo, a, b, c, d, F_wcc0c, MD5S00); + MD5_STEP0(MD5_Fo, d, a, b, c, F_wdc0d, MD5S01); + MD5_STEP0(MD5_Fo, c, d, a, b, F_wec0e, MD5S02); + MD5_STEP0(MD5_Fo, b, c, d, a, F_wfc0f, MD5S03); + + MD5_STEP0(MD5_Go, a, b, c, d, G_w1c10, MD5S10); + MD5_STEP0(MD5_Go, d, a, b, c, G_w6c11, MD5S11); + MD5_STEP0(MD5_Go, c, d, a, b, G_wbc12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0, G_w0c13, MD5S13); + MD5_STEP0(MD5_Go, a, b, c, d, G_w5c14, MD5S10); + MD5_STEP0(MD5_Go, d, a, b, c, G_wac15, MD5S11); + MD5_STEP0(MD5_Go, c, d, a, b, G_wfc16, MD5S12); + MD5_STEP0(MD5_Go, b, c, d, a, G_w4c17, MD5S13); + MD5_STEP0(MD5_Go, a, b, c, d, G_w9c18, MD5S10); + MD5_STEP0(MD5_Go, d, a, b, c, G_wec19, MD5S11); + MD5_STEP0(MD5_Go, c, d, a, b, G_w3c1a, MD5S12); + MD5_STEP0(MD5_Go, b, c, d, a, G_w8c1b, MD5S13); + MD5_STEP0(MD5_Go, a, b, c, d, G_wdc1c, MD5S10); + MD5_STEP0(MD5_Go, d, a, b, c, G_w2c1d, MD5S11); + MD5_STEP0(MD5_Go, c, d, a, b, G_w7c1e, MD5S12); + MD5_STEP0(MD5_Go, b, c, d, a, G_wcc1f, MD5S13); + + MD5_STEP0(MD5_H1, a, b, c, d, H_w5c20, MD5S20); + MD5_STEP0(MD5_H2, d, a, b, c, H_w8c21, MD5S21); + MD5_STEP0(MD5_H1, c, d, a, b, H_wbc22, MD5S22); + MD5_STEP0(MD5_H2, b, c, d, a, H_wec23, MD5S23); + MD5_STEP0(MD5_H1, a, b, c, d, H_w1c24, MD5S20); + MD5_STEP0(MD5_H2, d, a, b, c, H_w4c25, MD5S21); + MD5_STEP0(MD5_H1, c, d, a, b, H_w7c26, MD5S22); + MD5_STEP0(MD5_H2, b, c, d, a, H_wac27, MD5S23); + MD5_STEP0(MD5_H1, a, b, c, d, H_wdc28, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w0, H_w0c29, MD5S21); + MD5_STEP0(MD5_H1, c, d, a, b, H_w3c2a, MD5S22); + MD5_STEP0(MD5_H2, b, c, d, a, H_w6c2b, MD5S23); + MD5_STEP0(MD5_H1, a, b, c, d, H_w9c2c, MD5S20); + MD5_STEP0(MD5_H2, d, a, b, c, H_wcc2d, MD5S21); + MD5_STEP0(MD5_H1, c, d, a, b, H_wfc2e, MD5S22); + MD5_STEP0(MD5_H2, b, c, d, a, H_w2c2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0, I_w0c30, MD5S30); + MD5_STEP0(MD5_I , d, a, b, c, I_w7c31, MD5S31); + MD5_STEP0(MD5_I , c, d, a, b, I_wec32, MD5S32); + MD5_STEP0(MD5_I , b, c, d, a, I_w5c33, MD5S33); + MD5_STEP0(MD5_I , a, b, c, d, I_wcc34, MD5S30); + MD5_STEP0(MD5_I , d, a, b, c, I_w3c35, MD5S31); + MD5_STEP0(MD5_I , c, d, a, b, I_wac36, MD5S32); + MD5_STEP0(MD5_I , b, c, d, a, I_w1c37, MD5S33); + MD5_STEP0(MD5_I , a, b, c, d, I_w8c38, MD5S30); + MD5_STEP0(MD5_I , d, a, b, c, I_wfc39, MD5S31); + MD5_STEP0(MD5_I , c, d, a, b, I_w6c3a, MD5S32); + MD5_STEP0(MD5_I , b, c, d, a, I_wdc3b, MD5S33); + MD5_STEP0(MD5_I , a, b, c, d, I_w4c3c, MD5S30); + MD5_STEP0(MD5_I , d, a, b, c, I_wbc3d, MD5S31); + MD5_STEP0(MD5_I , c, d, a, b, I_w2c3e, MD5S32); + MD5_STEP0(MD5_I , b, c, d, a, I_w9c3f, MD5S33); + + + const u32x r0 = a; + const u32x r1 = d; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_M + } +} + +__device__ static void m00000s (u32 w[16], const u32 pw_len, const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const u32x * words_buf_r, void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset) +{ + /** + * modifier + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 F_w0c00 = 0 + MD5C00; + const u32 F_w1c01 = w[ 1] + MD5C01; + const u32 F_w2c02 = w[ 2] + MD5C02; + const u32 F_w3c03 = w[ 3] + MD5C03; + const u32 F_w4c04 = w[ 4] + MD5C04; + const u32 F_w5c05 = w[ 5] + MD5C05; + const u32 F_w6c06 = w[ 6] + MD5C06; + const u32 F_w7c07 = w[ 7] + MD5C07; + const u32 F_w8c08 = w[ 8] + MD5C08; + const u32 F_w9c09 = w[ 9] + MD5C09; + const u32 F_wac0a = w[10] + MD5C0a; + const u32 F_wbc0b = w[11] + MD5C0b; + const u32 F_wcc0c = w[12] + MD5C0c; + const u32 F_wdc0d = w[13] + MD5C0d; + const u32 F_wec0e = w[14] + MD5C0e; + const u32 F_wfc0f = w[15] + MD5C0f; + + const u32 G_w1c10 = w[ 1] + MD5C10; + const u32 G_w6c11 = w[ 6] + MD5C11; + const u32 G_wbc12 = w[11] + MD5C12; + const u32 G_w0c13 = 0 + MD5C13; + const u32 G_w5c14 = w[ 5] + MD5C14; + const u32 G_wac15 = w[10] + MD5C15; + const u32 G_wfc16 = w[15] + MD5C16; + const u32 G_w4c17 = w[ 4] + MD5C17; + const u32 G_w9c18 = w[ 9] + MD5C18; + const u32 G_wec19 = w[14] + MD5C19; + const u32 G_w3c1a = w[ 3] + MD5C1a; + const u32 G_w8c1b = w[ 8] + MD5C1b; + const u32 G_wdc1c = w[13] + MD5C1c; + const u32 G_w2c1d = w[ 2] + MD5C1d; + const u32 G_w7c1e = w[ 7] + MD5C1e; + const u32 G_wcc1f = w[12] + MD5C1f; + + const u32 H_w5c20 = w[ 5] + MD5C20; + const u32 H_w8c21 = w[ 8] + MD5C21; + const u32 H_wbc22 = w[11] + MD5C22; + const u32 H_wec23 = w[14] + MD5C23; + const u32 H_w1c24 = w[ 1] + MD5C24; + const u32 H_w4c25 = w[ 4] + MD5C25; + const u32 H_w7c26 = w[ 7] + MD5C26; + const u32 H_wac27 = w[10] + MD5C27; + const u32 H_wdc28 = w[13] + MD5C28; + const u32 H_w0c29 = 0 + MD5C29; + const u32 H_w3c2a = w[ 3] + MD5C2a; + const u32 H_w6c2b = w[ 6] + MD5C2b; + const u32 H_w9c2c = w[ 9] + MD5C2c; + const u32 H_wcc2d = w[12] + MD5C2d; + const u32 H_wfc2e = w[15] + MD5C2e; + const u32 H_w2c2f = w[ 2] + MD5C2f; + + const u32 I_w0c30 = 0 + MD5C30; + const u32 I_w7c31 = w[ 7] + MD5C31; + const u32 I_wec32 = w[14] + MD5C32; + const u32 I_w5c33 = w[ 5] + MD5C33; + const u32 I_wcc34 = w[12] + MD5C34; + const u32 I_w3c35 = w[ 3] + MD5C35; + const u32 I_wac36 = w[10] + MD5C36; + const u32 I_w1c37 = w[ 1] + MD5C37; + const u32 I_w8c38 = w[ 8] + MD5C38; + const u32 I_wfc39 = w[15] + MD5C39; + const u32 I_w6c3a = w[ 6] + MD5C3a; + const u32 I_wdc3b = w[13] + MD5C3b; + const u32 I_w4c3c = w[ 4] + MD5C3c; + const u32 I_wbc3d = w[11] + MD5C3d; + const u32 I_w2c3e = w[ 2] + MD5C3e; + const u32 I_w9c3f = w[ 9] + MD5C3f; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * reverse + */ + + u32 a_rev = digests_buf[digests_offset].digest_buf[0]; + u32 b_rev = digests_buf[digests_offset].digest_buf[1]; + u32 c_rev = digests_buf[digests_offset].digest_buf[2]; + u32 d_rev = digests_buf[digests_offset].digest_buf[3]; + + MD5_STEP_REV (MD5_I, b_rev, c_rev, d_rev, a_rev, w[ 9], MD5C3f, MD5S33); + MD5_STEP_REV (MD5_I, c_rev, d_rev, a_rev, b_rev, w[ 2], MD5C3e, MD5S32); + MD5_STEP_REV (MD5_I, d_rev, a_rev, b_rev, c_rev, w[11], MD5C3d, MD5S31); + MD5_STEP_REV (MD5_I, a_rev, b_rev, c_rev, d_rev, w[ 4], MD5C3c, MD5S30); + MD5_STEP_REV (MD5_I, b_rev, c_rev, d_rev, a_rev, w[13], MD5C3b, MD5S33); + MD5_STEP_REV (MD5_I, c_rev, d_rev, a_rev, b_rev, w[ 6], MD5C3a, MD5S32); + MD5_STEP_REV (MD5_I, d_rev, a_rev, b_rev, c_rev, w[15], MD5C39, MD5S31); + MD5_STEP_REV (MD5_I, a_rev, b_rev, c_rev, d_rev, w[ 8], MD5C38, MD5S30); + MD5_STEP_REV (MD5_I, b_rev, c_rev, d_rev, a_rev, w[ 1], MD5C37, MD5S33); + MD5_STEP_REV (MD5_I, c_rev, d_rev, a_rev, b_rev, w[10], MD5C36, MD5S32); + MD5_STEP_REV (MD5_I, d_rev, a_rev, b_rev, c_rev, w[ 3], MD5C35, MD5S31); + MD5_STEP_REV (MD5_I, a_rev, b_rev, c_rev, d_rev, w[12], MD5C34, MD5S30); + MD5_STEP_REV (MD5_I, b_rev, c_rev, d_rev, a_rev, w[ 5], MD5C33, MD5S33); + MD5_STEP_REV (MD5_I, c_rev, d_rev, a_rev, b_rev, w[14], MD5C32, MD5S32); + MD5_STEP_REV (MD5_I, d_rev, a_rev, b_rev, c_rev, w[ 7], MD5C31, MD5S31); + MD5_STEP_REV (MD5_I, a_rev, b_rev, c_rev, d_rev, 0, MD5C30, MD5S30); + + const u32x pre_cd = c_rev ^ d_rev; + + MD5_STEP_REV1(MD5_H, b_rev, c_rev, d_rev, a_rev, w[ 2], MD5C2f, MD5S23); + MD5_STEP_REV1(MD5_H, c_rev, d_rev, a_rev, b_rev, w[15], MD5C2e, MD5S22); + + /** + * loop + */ + + const u32 bf_loops = ceil ((float) bfs_cnt / VECT_DIV); + + u32x w0l = w[0]; + + for (u32 il_pos = 0; il_pos < bf_loops; il_pos++) + { + const u32x w0r = c_bfs[il_pos]; + + const u32x w0 = w0l | w0r; + + const u32x pre_d = d_rev; + const u32x pre_a = a_rev - w0; + const u32x pre_b = b_rev - (pre_a ^ pre_cd); + const u32x pre_c = c_rev - (pre_a ^ pre_b ^ pre_d); + + u32x tmp2; + + u32x a = MD5M_A; + u32x b = MD5M_B; + u32x c = MD5M_C; + u32x d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0, F_w0c00, MD5S00); + MD5_STEP0(MD5_Fo, d, a, b, c, F_w1c01, MD5S01); + MD5_STEP0(MD5_Fo, c, d, a, b, F_w2c02, MD5S02); + MD5_STEP0(MD5_Fo, b, c, d, a, F_w3c03, MD5S03); + MD5_STEP0(MD5_Fo, a, b, c, d, F_w4c04, MD5S00); + MD5_STEP0(MD5_Fo, d, a, b, c, F_w5c05, MD5S01); + MD5_STEP0(MD5_Fo, c, d, a, b, F_w6c06, MD5S02); + MD5_STEP0(MD5_Fo, b, c, d, a, F_w7c07, MD5S03); + MD5_STEP0(MD5_Fo, a, b, c, d, F_w8c08, MD5S00); + MD5_STEP0(MD5_Fo, d, a, b, c, F_w9c09, MD5S01); + MD5_STEP0(MD5_Fo, c, d, a, b, F_wac0a, MD5S02); + MD5_STEP0(MD5_Fo, b, c, d, a, F_wbc0b, MD5S03); + MD5_STEP0(MD5_Fo, a, b, c, d, F_wcc0c, MD5S00); + MD5_STEP0(MD5_Fo, d, a, b, c, F_wdc0d, MD5S01); + MD5_STEP0(MD5_Fo, c, d, a, b, F_wec0e, MD5S02); + MD5_STEP0(MD5_Fo, b, c, d, a, F_wfc0f, MD5S03); + + MD5_STEP0(MD5_Go, a, b, c, d, G_w1c10, MD5S10); + MD5_STEP0(MD5_Go, d, a, b, c, G_w6c11, MD5S11); + MD5_STEP0(MD5_Go, c, d, a, b, G_wbc12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0, G_w0c13, MD5S13); + MD5_STEP0(MD5_Go, a, b, c, d, G_w5c14, MD5S10); + MD5_STEP0(MD5_Go, d, a, b, c, G_wac15, MD5S11); + MD5_STEP0(MD5_Go, c, d, a, b, G_wfc16, MD5S12); + MD5_STEP0(MD5_Go, b, c, d, a, G_w4c17, MD5S13); + MD5_STEP0(MD5_Go, a, b, c, d, G_w9c18, MD5S10); + MD5_STEP0(MD5_Go, d, a, b, c, G_wec19, MD5S11); + MD5_STEP0(MD5_Go, c, d, a, b, G_w3c1a, MD5S12); + MD5_STEP0(MD5_Go, b, c, d, a, G_w8c1b, MD5S13); + MD5_STEP0(MD5_Go, a, b, c, d, G_wdc1c, MD5S10); + MD5_STEP0(MD5_Go, d, a, b, c, G_w2c1d, MD5S11); + MD5_STEP0(MD5_Go, c, d, a, b, G_w7c1e, MD5S12); + MD5_STEP0(MD5_Go, b, c, d, a, G_wcc1f, MD5S13); + + MD5_STEP0(MD5_H1, a, b, c, d, H_w5c20, MD5S20); + MD5_STEP0(MD5_H2, d, a, b, c, H_w8c21, MD5S21); + MD5_STEP0(MD5_H1, c, d, a, b, H_wbc22, MD5S22); + MD5_STEP0(MD5_H2, b, c, d, a, H_wec23, MD5S23); + MD5_STEP0(MD5_H1, a, b, c, d, H_w1c24, MD5S20); + MD5_STEP0(MD5_H2, d, a, b, c, H_w4c25, MD5S21); + MD5_STEP0(MD5_H1, c, d, a, b, H_w7c26, MD5S22); + MD5_STEP0(MD5_H2, b, c, d, a, H_wac27, MD5S23); + MD5_STEP0(MD5_H1, a, b, c, d, H_wdc28, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w0, H_w0c29, MD5S21); + MD5_STEP0(MD5_H1, c, d, a, b, H_w3c2a, MD5S22); + + bool q_cond = (pre_c != c); + + if (q_cond) continue; + + MD5_STEP0(MD5_H2, b, c, d, a, H_w6c2b, MD5S23); + MD5_STEP0(MD5_H1, a, b, c, d, H_w9c2c, MD5S20); + MD5_STEP0(MD5_H2, d, a, b, c, H_wcc2d, MD5S21); + MD5_STEP0(MD5_H1, c, d, a, b, H_wfc2e, MD5S22); + MD5_STEP0(MD5_H2, b, c, d, a, H_w2c2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0, I_w0c30, MD5S30); + MD5_STEP0(MD5_I , d, a, b, c, I_w7c31, MD5S31); + MD5_STEP0(MD5_I , c, d, a, b, I_wec32, MD5S32); + MD5_STEP0(MD5_I , b, c, d, a, I_w5c33, MD5S33); + MD5_STEP0(MD5_I , a, b, c, d, I_wcc34, MD5S30); + MD5_STEP0(MD5_I , d, a, b, c, I_w3c35, MD5S31); + MD5_STEP0(MD5_I , c, d, a, b, I_wac36, MD5S32); + MD5_STEP0(MD5_I , b, c, d, a, I_w1c37, MD5S33); + MD5_STEP0(MD5_I , a, b, c, d, I_w8c38, MD5S30); + MD5_STEP0(MD5_I , d, a, b, c, I_wfc39, MD5S31); + MD5_STEP0(MD5_I , c, d, a, b, I_w6c3a, MD5S32); + MD5_STEP0(MD5_I , b, c, d, a, I_wdc3b, MD5S33); + MD5_STEP0(MD5_I , a, b, c, d, I_w4c3c, MD5S30); + MD5_STEP0(MD5_I , d, a, b, c, I_wbc3d, MD5S31); + MD5_STEP0(MD5_I , c, d, a, b, I_w2c3e, MD5S32); + MD5_STEP0(MD5_I , b, c, d, a, I_w9c3f, MD5S33); + + + const u32x r0 = a; + const u32x r1 = d; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_S + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m00000_m04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const u32x * words_buf_r, void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32 w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = 0; + w[ 5] = 0; + w[ 6] = 0; + w[ 7] = 0; + w[ 8] = 0; + w[ 9] = 0; + w[10] = 0; + w[11] = 0; + w[12] = 0; + w[13] = 0; + w[14] = pws[gid].i[14]; + w[15] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m00000m (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m00000_m08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const u32x * words_buf_r, void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32 w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = pws[gid].i[ 4]; + w[ 5] = pws[gid].i[ 5]; + w[ 6] = pws[gid].i[ 6]; + w[ 7] = pws[gid].i[ 7]; + w[ 8] = 0; + w[ 9] = 0; + w[10] = 0; + w[11] = 0; + w[12] = 0; + w[13] = 0; + w[14] = pws[gid].i[14]; + w[15] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m00000m (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m00000_m16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const u32x * words_buf_r, void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32 w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = pws[gid].i[ 4]; + w[ 5] = pws[gid].i[ 5]; + w[ 6] = pws[gid].i[ 6]; + w[ 7] = pws[gid].i[ 7]; + w[ 8] = pws[gid].i[ 8]; + w[ 9] = pws[gid].i[ 9]; + w[10] = pws[gid].i[10]; + w[11] = pws[gid].i[11]; + w[12] = pws[gid].i[12]; + w[13] = pws[gid].i[13]; + w[14] = pws[gid].i[14]; + w[15] = pws[gid].i[15]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m00000m (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m00000_s04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const u32x * words_buf_r, void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32 w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = 0; + w[ 5] = 0; + w[ 6] = 0; + w[ 7] = 0; + w[ 8] = 0; + w[ 9] = 0; + w[10] = 0; + w[11] = 0; + w[12] = 0; + w[13] = 0; + w[14] = pws[gid].i[14]; + w[15] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m00000s (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m00000_s08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const u32x * words_buf_r, void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32 w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = pws[gid].i[ 4]; + w[ 5] = pws[gid].i[ 5]; + w[ 6] = pws[gid].i[ 6]; + w[ 7] = pws[gid].i[ 7]; + w[ 8] = 0; + w[ 9] = 0; + w[10] = 0; + w[11] = 0; + w[12] = 0; + w[13] = 0; + w[14] = pws[gid].i[14]; + w[15] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m00000s (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m00000_s16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const u32x * words_buf_r, void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32 w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = pws[gid].i[ 4]; + w[ 5] = pws[gid].i[ 5]; + w[ 6] = pws[gid].i[ 6]; + w[ 7] = pws[gid].i[ 7]; + w[ 8] = pws[gid].i[ 8]; + w[ 9] = pws[gid].i[ 9]; + w[10] = pws[gid].i[10]; + w[11] = pws[gid].i[11]; + w[12] = pws[gid].i[12]; + w[13] = pws[gid].i[13]; + w[14] = pws[gid].i[14]; + w[15] = pws[gid].i[15]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m00000s (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} diff --git a/nv/m00010_a0.cu b/nv/m00010_a0.cu new file mode 100644 index 0000000000..0b2a1effeb --- /dev/null +++ b/nv/m00010_a0.cu @@ -0,0 +1,548 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _MD5_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW2 +#define VECT_SIZE1 +#endif + +#define DGST_R0 0 +#define DGST_R1 3 +#define DGST_R2 2 +#define DGST_R3 1 + +#include "include/kernel_functions.c" +#include "types_nv.c" +#include "common_nv.c" +#include "include/rp_gpu.h" +#include "rp_nv.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +__device__ __constant__ gpu_rule_t c_rules[1024]; + +extern "C" __global__ void __launch_bounds__ (256, 1) m00010_m04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + u32x pw_buf1[4]; + + pw_buf1[0] = pws[gid].i[ 4]; + pw_buf1[1] = pws[gid].i[ 5]; + pw_buf1[2] = pws[gid].i[ 6]; + pw_buf1[3] = pws[gid].i[ 7]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[7]; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + + w0[0] = pw_buf0[0]; + w0[1] = pw_buf0[1]; + w0[2] = pw_buf0[2]; + w0[3] = pw_buf0[3]; + + u32x w1[4]; + + w1[0] = pw_buf1[0]; + w1[1] = pw_buf1[1]; + w1[2] = pw_buf1[2]; + w1[3] = pw_buf1[3]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 out_len = apply_rules (c_rules[il_pos].cmds, w0, w1, pw_len); + + /** + * append salt + */ + + u32 s0[4]; + + s0[0] = salt_buf0[0]; + s0[1] = salt_buf0[1]; + s0[2] = salt_buf0[2]; + s0[3] = salt_buf0[3]; + + u32 s1[4]; + + s1[0] = salt_buf1[0]; + s1[1] = salt_buf1[1]; + s1[2] = salt_buf1[2]; + s1[3] = salt_buf1[3]; + + u32 s2[4]; + + s2[0] = 0; + s2[1] = 0; + s2[2] = 0; + s2[3] = 0; + + u32 s3[4]; + + s3[0] = 0; + s3[1] = 0; + s3[2] = 0; + s3[3] = 0; + + switch_buffer_by_offset (s0, s1, s2, s3, out_len); + + const u32 pw_salt_len = out_len + salt_len; + + w0[0] |= s0[0]; + w0[1] |= s0[1]; + w0[2] |= s0[2]; + w0[3] |= s0[3]; + + w1[0] |= s1[0]; + w1[1] |= s1[1]; + w1[2] |= s1[2]; + w1[3] |= s1[3]; + + w2[0] |= s2[0]; + w2[1] |= s2[1]; + w2[2] |= s2[2]; + w2[3] |= s2[3]; + + w3[0] |= s3[0]; + w3[1] |= s3[1]; + w3[2] = pw_salt_len * 8; + w3[3] = 0; + + append_0x80_4 (w0, w1, w2, w3, pw_salt_len); + + /** + * md5 + */ + + u32x tmp2; + + u32x a = MD5M_A; + u32x b = MD5M_B; + u32x c = MD5M_C; + u32x d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H1, a, b, c, d, w1[1], MD5C20, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w2[0], MD5C21, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w2[3], MD5C22, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w3[2], MD5C23, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w0[1], MD5C24, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w1[0], MD5C25, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w1[3], MD5C26, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w2[2], MD5C27, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w3[1], MD5C28, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w0[0], MD5C29, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w0[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w1[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w2[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w3[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w3[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w0[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1[0], MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w2[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2[1], MD5C3f, MD5S33); + + + const u32x r0 = a; + const u32x r1 = d; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_M + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m00010_m08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m00010_m16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m00010_s04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + u32x pw_buf1[4]; + + pw_buf1[0] = pws[gid].i[ 4]; + pw_buf1[1] = pws[gid].i[ 5]; + pw_buf1[2] = pws[gid].i[ 6]; + pw_buf1[3] = pws[gid].i[ 7]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[7]; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + + w0[0] = pw_buf0[0]; + w0[1] = pw_buf0[1]; + w0[2] = pw_buf0[2]; + w0[3] = pw_buf0[3]; + + u32x w1[4]; + + w1[0] = pw_buf1[0]; + w1[1] = pw_buf1[1]; + w1[2] = pw_buf1[2]; + w1[3] = pw_buf1[3]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 out_len = apply_rules (c_rules[il_pos].cmds, w0, w1, pw_len); + + /** + * append salt + */ + + u32 s0[4]; + + s0[0] = salt_buf0[0]; + s0[1] = salt_buf0[1]; + s0[2] = salt_buf0[2]; + s0[3] = salt_buf0[3]; + + u32 s1[4]; + + s1[0] = salt_buf1[0]; + s1[1] = salt_buf1[1]; + s1[2] = salt_buf1[2]; + s1[3] = salt_buf1[3]; + + u32 s2[4]; + + s2[0] = 0; + s2[1] = 0; + s2[2] = 0; + s2[3] = 0; + + u32 s3[4]; + + s3[0] = 0; + s3[1] = 0; + s3[2] = 0; + s3[3] = 0; + + switch_buffer_by_offset (s0, s1, s2, s3, out_len); + + const u32 pw_salt_len = out_len + salt_len; + + w0[0] |= s0[0]; + w0[1] |= s0[1]; + w0[2] |= s0[2]; + w0[3] |= s0[3]; + + w1[0] |= s1[0]; + w1[1] |= s1[1]; + w1[2] |= s1[2]; + w1[3] |= s1[3]; + + w2[0] |= s2[0]; + w2[1] |= s2[1]; + w2[2] |= s2[2]; + w2[3] |= s2[3]; + + w3[0] |= s3[0]; + w3[1] |= s3[1]; + w3[2] = pw_salt_len * 8; + w3[3] = 0; + + append_0x80_4 (w0, w1, w2, w3, pw_salt_len); + + /** + * md5 + */ + + u32x tmp2; + + u32x a = MD5M_A; + u32x b = MD5M_B; + u32x c = MD5M_C; + u32x d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H1, a, b, c, d, w1[1], MD5C20, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w2[0], MD5C21, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w2[3], MD5C22, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w3[2], MD5C23, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w0[1], MD5C24, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w1[0], MD5C25, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w1[3], MD5C26, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w2[2], MD5C27, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w3[1], MD5C28, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w0[0], MD5C29, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w0[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w1[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w2[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w3[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w3[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w0[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1[0], MD5C3c, MD5S30); + + bool q_cond = (search[0] != a); + + if (q_cond) continue; + + MD5_STEP (MD5_I , d, a, b, c, w2[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2[1], MD5C3f, MD5S33); + + + const u32x r0 = a; + const u32x r1 = d; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_S + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m00010_s08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m00010_s16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/nv/m00010_a1.cu b/nv/m00010_a1.cu new file mode 100644 index 0000000000..086de70484 --- /dev/null +++ b/nv/m00010_a1.cu @@ -0,0 +1,614 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _MD5_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW2 +#define VECT_SIZE4 +#endif + +#define DGST_R0 0 +#define DGST_R1 3 +#define DGST_R2 2 +#define DGST_R3 1 + +#include "include/kernel_functions.c" +#include "types_nv.c" +#include "common_nv.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +__device__ __constant__ comb_t c_combs[1024]; + +extern "C" __global__ void __launch_bounds__ (256, 1) m00010_m04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, c_combs[0].pw_len); + } + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[7]; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = c_combs[il_pos].pw_len; + + const u32 pw_len = pw_l_len + pw_r_len; + + u32 wordr0[4]; + + wordr0[0] = c_combs[il_pos].i[0]; + wordr0[1] = c_combs[il_pos].i[1]; + wordr0[2] = c_combs[il_pos].i[2]; + wordr0[3] = c_combs[il_pos].i[3]; + + u32 wordr1[4]; + + wordr1[0] = c_combs[il_pos].i[4]; + wordr1[1] = c_combs[il_pos].i[5]; + wordr1[2] = c_combs[il_pos].i[6]; + wordr1[3] = c_combs[il_pos].i[7]; + + u32 wordr2[4]; + + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + + u32 wordr3[4]; + + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + /** + * append salt + */ + + u32 s0[4]; + + s0[0] = salt_buf0[0]; + s0[1] = salt_buf0[1]; + s0[2] = salt_buf0[2]; + s0[3] = salt_buf0[3]; + + u32 s1[4]; + + s1[0] = salt_buf1[0]; + s1[1] = salt_buf1[1]; + s1[2] = salt_buf1[2]; + s1[3] = salt_buf1[3]; + + u32 s2[4]; + + s2[0] = 0; + s2[1] = 0; + s2[2] = 0; + s2[3] = 0; + + u32 s3[4]; + + s3[0] = 0; + s3[1] = 0; + s3[2] = 0; + s3[3] = 0; + + switch_buffer_by_offset (s0, s1, s2, s3, pw_len); + + const u32 pw_salt_len = pw_len + salt_len; + + u32x w0[4]; + + w0[0] = wordl0[0] | wordr0[0] | s0[0]; + w0[1] = wordl0[1] | wordr0[1] | s0[1]; + w0[2] = wordl0[2] | wordr0[2] | s0[2]; + w0[3] = wordl0[3] | wordr0[3] | s0[3]; + + u32x w1[4]; + + w1[0] = wordl1[0] | wordr1[0] | s1[0]; + w1[1] = wordl1[1] | wordr1[1] | s1[1]; + w1[2] = wordl1[2] | wordr1[2] | s1[2]; + w1[3] = wordl1[3] | wordr1[3] | s1[3]; + + u32x w2[4]; + + w2[0] = wordl2[0] | wordr2[0] | s2[0]; + w2[1] = wordl2[1] | wordr2[1] | s2[1]; + w2[2] = wordl2[2] | wordr2[2] | s2[2]; + w2[3] = wordl2[3] | wordr2[3] | s2[3]; + + u32x w3[4]; + + w3[0] = wordl3[0] | wordr3[0] | s3[0]; + w3[1] = wordl3[1] | wordr3[1] | s3[1]; + w3[2] = pw_salt_len * 8; + w3[3] = 0; + + append_0x80_4 (w0, w1, w2, w3, pw_salt_len); + + /** + * md5 + */ + + u32x tmp2; + + u32x a = MD5M_A; + u32x b = MD5M_B; + u32x c = MD5M_C; + u32x d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H1, a, b, c, d, w1[1], MD5C20, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w2[0], MD5C21, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w2[3], MD5C22, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w3[2], MD5C23, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w0[1], MD5C24, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w1[0], MD5C25, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w1[3], MD5C26, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w2[2], MD5C27, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w3[1], MD5C28, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w0[0], MD5C29, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w0[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w1[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w2[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w3[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w3[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w0[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1[0], MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w2[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2[1], MD5C3f, MD5S33); + + + const u32x r0 = a; + const u32x r1 = d; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_M + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m00010_m08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m00010_m16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m00010_s04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, c_combs[0].pw_len); + } + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[7]; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = c_combs[il_pos].pw_len; + + const u32 pw_len = pw_l_len + pw_r_len; + + u32 wordr0[4]; + + wordr0[0] = c_combs[il_pos].i[0]; + wordr0[1] = c_combs[il_pos].i[1]; + wordr0[2] = c_combs[il_pos].i[2]; + wordr0[3] = c_combs[il_pos].i[3]; + + u32 wordr1[4]; + + wordr1[0] = c_combs[il_pos].i[4]; + wordr1[1] = c_combs[il_pos].i[5]; + wordr1[2] = c_combs[il_pos].i[6]; + wordr1[3] = c_combs[il_pos].i[7]; + + u32 wordr2[4]; + + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + + u32 wordr3[4]; + + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + /** + * append salt + */ + + u32 s0[4]; + + s0[0] = salt_buf0[0]; + s0[1] = salt_buf0[1]; + s0[2] = salt_buf0[2]; + s0[3] = salt_buf0[3]; + + u32 s1[4]; + + s1[0] = salt_buf1[0]; + s1[1] = salt_buf1[1]; + s1[2] = salt_buf1[2]; + s1[3] = salt_buf1[3]; + + u32 s2[4]; + + s2[0] = 0; + s2[1] = 0; + s2[2] = 0; + s2[3] = 0; + + u32 s3[4]; + + s3[0] = 0; + s3[1] = 0; + s3[2] = 0; + s3[3] = 0; + + switch_buffer_by_offset (s0, s1, s2, s3, pw_len); + + const u32 pw_salt_len = pw_len + salt_len; + + u32x w0[4]; + + w0[0] = wordl0[0] | wordr0[0] | s0[0]; + w0[1] = wordl0[1] | wordr0[1] | s0[1]; + w0[2] = wordl0[2] | wordr0[2] | s0[2]; + w0[3] = wordl0[3] | wordr0[3] | s0[3]; + + u32x w1[4]; + + w1[0] = wordl1[0] | wordr1[0] | s1[0]; + w1[1] = wordl1[1] | wordr1[1] | s1[1]; + w1[2] = wordl1[2] | wordr1[2] | s1[2]; + w1[3] = wordl1[3] | wordr1[3] | s1[3]; + + u32x w2[4]; + + w2[0] = wordl2[0] | wordr2[0] | s2[0]; + w2[1] = wordl2[1] | wordr2[1] | s2[1]; + w2[2] = wordl2[2] | wordr2[2] | s2[2]; + w2[3] = wordl2[3] | wordr2[3] | s2[3]; + + u32x w3[4]; + + w3[0] = wordl3[0] | wordr3[0] | s3[0]; + w3[1] = wordl3[1] | wordr3[1] | s3[1]; + w3[2] = pw_salt_len * 8; + w3[3] = 0; + + append_0x80_4 (w0, w1, w2, w3, pw_salt_len); + + /** + * md5 + */ + + u32x tmp2; + + u32x a = MD5M_A; + u32x b = MD5M_B; + u32x c = MD5M_C; + u32x d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H1, a, b, c, d, w1[1], MD5C20, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w2[0], MD5C21, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w2[3], MD5C22, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w3[2], MD5C23, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w0[1], MD5C24, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w1[0], MD5C25, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w1[3], MD5C26, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w2[2], MD5C27, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w3[1], MD5C28, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w0[0], MD5C29, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w0[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w1[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w2[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w3[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w3[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w0[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1[0], MD5C3c, MD5S30); + + bool q_cond = (search[0] != a); + + if (q_cond) continue; + + MD5_STEP (MD5_I , d, a, b, c, w2[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2[1], MD5C3f, MD5S33); + + + const u32x r0 = a; + const u32x r1 = d; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_S + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m00010_s08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m00010_s16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/nv/m00010_a3.cu b/nv/m00010_a3.cu new file mode 100644 index 0000000000..034463f28c --- /dev/null +++ b/nv/m00010_a3.cu @@ -0,0 +1,759 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _MD5_ +#define _SCALAR_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW2 +#define VECT_SIZE4 +#endif + +#define DGST_R0 0 +#define DGST_R1 3 +#define DGST_R2 2 +#define DGST_R3 1 + +#include "include/kernel_functions.c" +#include "types_nv.c" +#include "common_nv.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4_warp.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4_warp.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4_warp.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4_warp.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4_warp.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4_warp.c" +#endif + +#define MD5_STEP_REV(f,a,b,c,d,x,t,s) \ +{ \ + a -= b; \ + a = rotr32 (a, s); \ + a -= f (b, c, d); \ + a -= x; \ + a -= t; \ +} + +#define MD5_STEP_REV1(f,a,b,c,d,x,t,s) \ +{ \ + a -= b; \ + a = rotr32 (a, s); \ + a -= x; \ + a -= t; \ +} + +__device__ __constant__ u32x c_bfs[1024]; + +__device__ static void m00010m (u32 w[16], const u32 pw_len, const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const u32x * words_buf_r, void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset) +{ + /** + * modifier + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + const u32 lid = threadIdx.x; + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[ 1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[ 2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[ 3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[ 4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[ 5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[ 6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[ 7]; + + u32 salt_buf2[4]; + + salt_buf2[0] = salt_bufs[salt_pos].salt_buf[ 8]; + salt_buf2[1] = 0; + salt_buf2[2] = 0; + salt_buf2[3] = 0; + + u32 salt_buf3[4]; + + salt_buf3[0] = 0; + salt_buf3[1] = 0; + salt_buf3[2] = 0; + salt_buf3[3] = 0; + + switch_buffer_by_offset (salt_buf0, salt_buf1, salt_buf2, salt_buf3, pw_len); + + w[ 0] |= salt_buf0[0]; + w[ 1] |= salt_buf0[1]; + w[ 2] |= salt_buf0[2]; + w[ 3] |= salt_buf0[3]; + w[ 4] |= salt_buf1[0]; + w[ 5] |= salt_buf1[1]; + w[ 6] |= salt_buf1[2]; + w[ 7] |= salt_buf1[3]; + w[ 8] |= salt_buf2[0]; + w[ 9] |= salt_buf2[1]; + w[10] |= salt_buf2[2]; + w[11] |= salt_buf2[3]; + w[12] |= salt_buf3[0]; + w[13] |= salt_buf3[1]; + w[14] |= salt_buf3[2]; + w[15] |= salt_buf3[3]; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + const u32 pw_salt_len = pw_len + salt_len; + + w[14] = pw_salt_len * 8; + + /** + * base + */ + + const u32 F_w0c00 = 0 + MD5C00; + const u32 F_w1c01 = w[ 1] + MD5C01; + const u32 F_w2c02 = w[ 2] + MD5C02; + const u32 F_w3c03 = w[ 3] + MD5C03; + const u32 F_w4c04 = w[ 4] + MD5C04; + const u32 F_w5c05 = w[ 5] + MD5C05; + const u32 F_w6c06 = w[ 6] + MD5C06; + const u32 F_w7c07 = w[ 7] + MD5C07; + const u32 F_w8c08 = w[ 8] + MD5C08; + const u32 F_w9c09 = w[ 9] + MD5C09; + const u32 F_wac0a = w[10] + MD5C0a; + const u32 F_wbc0b = w[11] + MD5C0b; + const u32 F_wcc0c = w[12] + MD5C0c; + const u32 F_wdc0d = w[13] + MD5C0d; + const u32 F_wec0e = w[14] + MD5C0e; + const u32 F_wfc0f = w[15] + MD5C0f; + + const u32 G_w1c10 = w[ 1] + MD5C10; + const u32 G_w6c11 = w[ 6] + MD5C11; + const u32 G_wbc12 = w[11] + MD5C12; + const u32 G_w0c13 = 0 + MD5C13; + const u32 G_w5c14 = w[ 5] + MD5C14; + const u32 G_wac15 = w[10] + MD5C15; + const u32 G_wfc16 = w[15] + MD5C16; + const u32 G_w4c17 = w[ 4] + MD5C17; + const u32 G_w9c18 = w[ 9] + MD5C18; + const u32 G_wec19 = w[14] + MD5C19; + const u32 G_w3c1a = w[ 3] + MD5C1a; + const u32 G_w8c1b = w[ 8] + MD5C1b; + const u32 G_wdc1c = w[13] + MD5C1c; + const u32 G_w2c1d = w[ 2] + MD5C1d; + const u32 G_w7c1e = w[ 7] + MD5C1e; + const u32 G_wcc1f = w[12] + MD5C1f; + + const u32 H_w5c20 = w[ 5] + MD5C20; + const u32 H_w8c21 = w[ 8] + MD5C21; + const u32 H_wbc22 = w[11] + MD5C22; + const u32 H_wec23 = w[14] + MD5C23; + const u32 H_w1c24 = w[ 1] + MD5C24; + const u32 H_w4c25 = w[ 4] + MD5C25; + const u32 H_w7c26 = w[ 7] + MD5C26; + const u32 H_wac27 = w[10] + MD5C27; + const u32 H_wdc28 = w[13] + MD5C28; + const u32 H_w0c29 = 0 + MD5C29; + const u32 H_w3c2a = w[ 3] + MD5C2a; + const u32 H_w6c2b = w[ 6] + MD5C2b; + const u32 H_w9c2c = w[ 9] + MD5C2c; + const u32 H_wcc2d = w[12] + MD5C2d; + const u32 H_wfc2e = w[15] + MD5C2e; + const u32 H_w2c2f = w[ 2] + MD5C2f; + + const u32 I_w0c30 = 0 + MD5C30; + const u32 I_w7c31 = w[ 7] + MD5C31; + const u32 I_wec32 = w[14] + MD5C32; + const u32 I_w5c33 = w[ 5] + MD5C33; + const u32 I_wcc34 = w[12] + MD5C34; + const u32 I_w3c35 = w[ 3] + MD5C35; + const u32 I_wac36 = w[10] + MD5C36; + const u32 I_w1c37 = w[ 1] + MD5C37; + const u32 I_w8c38 = w[ 8] + MD5C38; + const u32 I_wfc39 = w[15] + MD5C39; + const u32 I_w6c3a = w[ 6] + MD5C3a; + const u32 I_wdc3b = w[13] + MD5C3b; + const u32 I_w4c3c = w[ 4] + MD5C3c; + const u32 I_wbc3d = w[11] + MD5C3d; + const u32 I_w2c3e = w[ 2] + MD5C3e; + const u32 I_w9c3f = w[ 9] + MD5C3f; + + /** + * loop + */ + + const u32 bf_loops = ceil ((float) bfs_cnt / VECT_DIV); + + u32x w0l = w[0]; + + for (u32 il_pos = 0; il_pos < bf_loops; il_pos++) + { + const u32x w0r = c_bfs[il_pos]; + + const u32x w0 = w0l | w0r; + + u32x tmp2; + + u32x a = MD5M_A; + u32x b = MD5M_B; + u32x c = MD5M_C; + u32x d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0, F_w0c00, MD5S00); + MD5_STEP0(MD5_Fo, d, a, b, c, F_w1c01, MD5S01); + MD5_STEP0(MD5_Fo, c, d, a, b, F_w2c02, MD5S02); + MD5_STEP0(MD5_Fo, b, c, d, a, F_w3c03, MD5S03); + MD5_STEP0(MD5_Fo, a, b, c, d, F_w4c04, MD5S00); + MD5_STEP0(MD5_Fo, d, a, b, c, F_w5c05, MD5S01); + MD5_STEP0(MD5_Fo, c, d, a, b, F_w6c06, MD5S02); + MD5_STEP0(MD5_Fo, b, c, d, a, F_w7c07, MD5S03); + MD5_STEP0(MD5_Fo, a, b, c, d, F_w8c08, MD5S00); + MD5_STEP0(MD5_Fo, d, a, b, c, F_w9c09, MD5S01); + MD5_STEP0(MD5_Fo, c, d, a, b, F_wac0a, MD5S02); + MD5_STEP0(MD5_Fo, b, c, d, a, F_wbc0b, MD5S03); + MD5_STEP0(MD5_Fo, a, b, c, d, F_wcc0c, MD5S00); + MD5_STEP0(MD5_Fo, d, a, b, c, F_wdc0d, MD5S01); + MD5_STEP0(MD5_Fo, c, d, a, b, F_wec0e, MD5S02); + MD5_STEP0(MD5_Fo, b, c, d, a, F_wfc0f, MD5S03); + + MD5_STEP0(MD5_Go, a, b, c, d, G_w1c10, MD5S10); + MD5_STEP0(MD5_Go, d, a, b, c, G_w6c11, MD5S11); + MD5_STEP0(MD5_Go, c, d, a, b, G_wbc12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0, G_w0c13, MD5S13); + MD5_STEP0(MD5_Go, a, b, c, d, G_w5c14, MD5S10); + MD5_STEP0(MD5_Go, d, a, b, c, G_wac15, MD5S11); + MD5_STEP0(MD5_Go, c, d, a, b, G_wfc16, MD5S12); + MD5_STEP0(MD5_Go, b, c, d, a, G_w4c17, MD5S13); + MD5_STEP0(MD5_Go, a, b, c, d, G_w9c18, MD5S10); + MD5_STEP0(MD5_Go, d, a, b, c, G_wec19, MD5S11); + MD5_STEP0(MD5_Go, c, d, a, b, G_w3c1a, MD5S12); + MD5_STEP0(MD5_Go, b, c, d, a, G_w8c1b, MD5S13); + MD5_STEP0(MD5_Go, a, b, c, d, G_wdc1c, MD5S10); + MD5_STEP0(MD5_Go, d, a, b, c, G_w2c1d, MD5S11); + MD5_STEP0(MD5_Go, c, d, a, b, G_w7c1e, MD5S12); + MD5_STEP0(MD5_Go, b, c, d, a, G_wcc1f, MD5S13); + + MD5_STEP0(MD5_H1, a, b, c, d, H_w5c20, MD5S20); + MD5_STEP0(MD5_H2, d, a, b, c, H_w8c21, MD5S21); + MD5_STEP0(MD5_H1, c, d, a, b, H_wbc22, MD5S22); + MD5_STEP0(MD5_H2, b, c, d, a, H_wec23, MD5S23); + MD5_STEP0(MD5_H1, a, b, c, d, H_w1c24, MD5S20); + MD5_STEP0(MD5_H2, d, a, b, c, H_w4c25, MD5S21); + MD5_STEP0(MD5_H1, c, d, a, b, H_w7c26, MD5S22); + MD5_STEP0(MD5_H2, b, c, d, a, H_wac27, MD5S23); + MD5_STEP0(MD5_H1, a, b, c, d, H_wdc28, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w0, H_w0c29, MD5S21); + MD5_STEP0(MD5_H1, c, d, a, b, H_w3c2a, MD5S22); + MD5_STEP0(MD5_H2, b, c, d, a, H_w6c2b, MD5S23); + MD5_STEP0(MD5_H1, a, b, c, d, H_w9c2c, MD5S20); + MD5_STEP0(MD5_H2, d, a, b, c, H_wcc2d, MD5S21); + MD5_STEP0(MD5_H1, c, d, a, b, H_wfc2e, MD5S22); + MD5_STEP0(MD5_H2, b, c, d, a, H_w2c2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0, I_w0c30, MD5S30); + MD5_STEP0(MD5_I , d, a, b, c, I_w7c31, MD5S31); + MD5_STEP0(MD5_I , c, d, a, b, I_wec32, MD5S32); + MD5_STEP0(MD5_I , b, c, d, a, I_w5c33, MD5S33); + MD5_STEP0(MD5_I , a, b, c, d, I_wcc34, MD5S30); + MD5_STEP0(MD5_I , d, a, b, c, I_w3c35, MD5S31); + MD5_STEP0(MD5_I , c, d, a, b, I_wac36, MD5S32); + MD5_STEP0(MD5_I , b, c, d, a, I_w1c37, MD5S33); + MD5_STEP0(MD5_I , a, b, c, d, I_w8c38, MD5S30); + MD5_STEP0(MD5_I , d, a, b, c, I_wfc39, MD5S31); + MD5_STEP0(MD5_I , c, d, a, b, I_w6c3a, MD5S32); + MD5_STEP0(MD5_I , b, c, d, a, I_wdc3b, MD5S33); + MD5_STEP0(MD5_I , a, b, c, d, I_w4c3c, MD5S30); + MD5_STEP0(MD5_I , d, a, b, c, I_wbc3d, MD5S31); + MD5_STEP0(MD5_I , c, d, a, b, I_w2c3e, MD5S32); + MD5_STEP0(MD5_I , b, c, d, a, I_w9c3f, MD5S33); + + + const u32x r0 = a; + const u32x r1 = d; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_M + } +} + +__device__ static void m00010s (u32 w[16], const u32 pw_len, const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const u32x * words_buf_r, void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset) +{ + /** + * modifier + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 F_w0c00 = 0 + MD5C00; + const u32 F_w1c01 = w[ 1] + MD5C01; + const u32 F_w2c02 = w[ 2] + MD5C02; + const u32 F_w3c03 = w[ 3] + MD5C03; + const u32 F_w4c04 = w[ 4] + MD5C04; + const u32 F_w5c05 = w[ 5] + MD5C05; + const u32 F_w6c06 = w[ 6] + MD5C06; + const u32 F_w7c07 = w[ 7] + MD5C07; + const u32 F_w8c08 = w[ 8] + MD5C08; + const u32 F_w9c09 = w[ 9] + MD5C09; + const u32 F_wac0a = w[10] + MD5C0a; + const u32 F_wbc0b = w[11] + MD5C0b; + const u32 F_wcc0c = w[12] + MD5C0c; + const u32 F_wdc0d = w[13] + MD5C0d; + const u32 F_wec0e = w[14] + MD5C0e; + const u32 F_wfc0f = w[15] + MD5C0f; + + const u32 G_w1c10 = w[ 1] + MD5C10; + const u32 G_w6c11 = w[ 6] + MD5C11; + const u32 G_wbc12 = w[11] + MD5C12; + const u32 G_w0c13 = 0 + MD5C13; + const u32 G_w5c14 = w[ 5] + MD5C14; + const u32 G_wac15 = w[10] + MD5C15; + const u32 G_wfc16 = w[15] + MD5C16; + const u32 G_w4c17 = w[ 4] + MD5C17; + const u32 G_w9c18 = w[ 9] + MD5C18; + const u32 G_wec19 = w[14] + MD5C19; + const u32 G_w3c1a = w[ 3] + MD5C1a; + const u32 G_w8c1b = w[ 8] + MD5C1b; + const u32 G_wdc1c = w[13] + MD5C1c; + const u32 G_w2c1d = w[ 2] + MD5C1d; + const u32 G_w7c1e = w[ 7] + MD5C1e; + const u32 G_wcc1f = w[12] + MD5C1f; + + const u32 H_w5c20 = w[ 5] + MD5C20; + const u32 H_w8c21 = w[ 8] + MD5C21; + const u32 H_wbc22 = w[11] + MD5C22; + const u32 H_wec23 = w[14] + MD5C23; + const u32 H_w1c24 = w[ 1] + MD5C24; + const u32 H_w4c25 = w[ 4] + MD5C25; + const u32 H_w7c26 = w[ 7] + MD5C26; + const u32 H_wac27 = w[10] + MD5C27; + const u32 H_wdc28 = w[13] + MD5C28; + const u32 H_w0c29 = 0 + MD5C29; + const u32 H_w3c2a = w[ 3] + MD5C2a; + const u32 H_w6c2b = w[ 6] + MD5C2b; + const u32 H_w9c2c = w[ 9] + MD5C2c; + const u32 H_wcc2d = w[12] + MD5C2d; + const u32 H_wfc2e = w[15] + MD5C2e; + const u32 H_w2c2f = w[ 2] + MD5C2f; + + const u32 I_w0c30 = 0 + MD5C30; + const u32 I_w7c31 = w[ 7] + MD5C31; + const u32 I_wec32 = w[14] + MD5C32; + const u32 I_w5c33 = w[ 5] + MD5C33; + const u32 I_wcc34 = w[12] + MD5C34; + const u32 I_w3c35 = w[ 3] + MD5C35; + const u32 I_wac36 = w[10] + MD5C36; + const u32 I_w1c37 = w[ 1] + MD5C37; + const u32 I_w8c38 = w[ 8] + MD5C38; + const u32 I_wfc39 = w[15] + MD5C39; + const u32 I_w6c3a = w[ 6] + MD5C3a; + const u32 I_wdc3b = w[13] + MD5C3b; + const u32 I_w4c3c = w[ 4] + MD5C3c; + const u32 I_wbc3d = w[11] + MD5C3d; + const u32 I_w2c3e = w[ 2] + MD5C3e; + const u32 I_w9c3f = w[ 9] + MD5C3f; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * reverse + */ + + u32 a_rev = digests_buf[digests_offset].digest_buf[0]; + u32 b_rev = digests_buf[digests_offset].digest_buf[1]; + u32 c_rev = digests_buf[digests_offset].digest_buf[2]; + u32 d_rev = digests_buf[digests_offset].digest_buf[3]; + + MD5_STEP_REV (MD5_I, b_rev, c_rev, d_rev, a_rev, w[ 9], MD5C3f, MD5S33); + MD5_STEP_REV (MD5_I, c_rev, d_rev, a_rev, b_rev, w[ 2], MD5C3e, MD5S32); + MD5_STEP_REV (MD5_I, d_rev, a_rev, b_rev, c_rev, w[11], MD5C3d, MD5S31); + MD5_STEP_REV (MD5_I, a_rev, b_rev, c_rev, d_rev, w[ 4], MD5C3c, MD5S30); + MD5_STEP_REV (MD5_I, b_rev, c_rev, d_rev, a_rev, w[13], MD5C3b, MD5S33); + MD5_STEP_REV (MD5_I, c_rev, d_rev, a_rev, b_rev, w[ 6], MD5C3a, MD5S32); + MD5_STEP_REV (MD5_I, d_rev, a_rev, b_rev, c_rev, w[15], MD5C39, MD5S31); + MD5_STEP_REV (MD5_I, a_rev, b_rev, c_rev, d_rev, w[ 8], MD5C38, MD5S30); + MD5_STEP_REV (MD5_I, b_rev, c_rev, d_rev, a_rev, w[ 1], MD5C37, MD5S33); + MD5_STEP_REV (MD5_I, c_rev, d_rev, a_rev, b_rev, w[10], MD5C36, MD5S32); + MD5_STEP_REV (MD5_I, d_rev, a_rev, b_rev, c_rev, w[ 3], MD5C35, MD5S31); + MD5_STEP_REV (MD5_I, a_rev, b_rev, c_rev, d_rev, w[12], MD5C34, MD5S30); + MD5_STEP_REV (MD5_I, b_rev, c_rev, d_rev, a_rev, w[ 5], MD5C33, MD5S33); + MD5_STEP_REV (MD5_I, c_rev, d_rev, a_rev, b_rev, w[14], MD5C32, MD5S32); + MD5_STEP_REV (MD5_I, d_rev, a_rev, b_rev, c_rev, w[ 7], MD5C31, MD5S31); + MD5_STEP_REV (MD5_I, a_rev, b_rev, c_rev, d_rev, 0, MD5C30, MD5S30); + + const u32x pre_cd = c_rev ^ d_rev; + + MD5_STEP_REV1(MD5_H, b_rev, c_rev, d_rev, a_rev, w[ 2], MD5C2f, MD5S23); + MD5_STEP_REV1(MD5_H, c_rev, d_rev, a_rev, b_rev, w[15], MD5C2e, MD5S22); + + /** + * loop + */ + + const u32 bf_loops = ceil ((float) bfs_cnt / VECT_DIV); + + u32x w0l = w[0]; + + for (u32 il_pos = 0; il_pos < bf_loops; il_pos++) + { + const u32x w0r = c_bfs[il_pos]; + + const u32x w0 = w0l | w0r; + + const u32x pre_d = d_rev; + const u32x pre_a = a_rev - w0; + const u32x pre_b = b_rev - (pre_a ^ pre_cd); + const u32x pre_c = c_rev - (pre_a ^ pre_b ^ pre_d); + + u32x tmp2; + + u32x a = MD5M_A; + u32x b = MD5M_B; + u32x c = MD5M_C; + u32x d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0, F_w0c00, MD5S00); + MD5_STEP0(MD5_Fo, d, a, b, c, F_w1c01, MD5S01); + MD5_STEP0(MD5_Fo, c, d, a, b, F_w2c02, MD5S02); + MD5_STEP0(MD5_Fo, b, c, d, a, F_w3c03, MD5S03); + MD5_STEP0(MD5_Fo, a, b, c, d, F_w4c04, MD5S00); + MD5_STEP0(MD5_Fo, d, a, b, c, F_w5c05, MD5S01); + MD5_STEP0(MD5_Fo, c, d, a, b, F_w6c06, MD5S02); + MD5_STEP0(MD5_Fo, b, c, d, a, F_w7c07, MD5S03); + MD5_STEP0(MD5_Fo, a, b, c, d, F_w8c08, MD5S00); + MD5_STEP0(MD5_Fo, d, a, b, c, F_w9c09, MD5S01); + MD5_STEP0(MD5_Fo, c, d, a, b, F_wac0a, MD5S02); + MD5_STEP0(MD5_Fo, b, c, d, a, F_wbc0b, MD5S03); + MD5_STEP0(MD5_Fo, a, b, c, d, F_wcc0c, MD5S00); + MD5_STEP0(MD5_Fo, d, a, b, c, F_wdc0d, MD5S01); + MD5_STEP0(MD5_Fo, c, d, a, b, F_wec0e, MD5S02); + MD5_STEP0(MD5_Fo, b, c, d, a, F_wfc0f, MD5S03); + + MD5_STEP0(MD5_Go, a, b, c, d, G_w1c10, MD5S10); + MD5_STEP0(MD5_Go, d, a, b, c, G_w6c11, MD5S11); + MD5_STEP0(MD5_Go, c, d, a, b, G_wbc12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0, G_w0c13, MD5S13); + MD5_STEP0(MD5_Go, a, b, c, d, G_w5c14, MD5S10); + MD5_STEP0(MD5_Go, d, a, b, c, G_wac15, MD5S11); + MD5_STEP0(MD5_Go, c, d, a, b, G_wfc16, MD5S12); + MD5_STEP0(MD5_Go, b, c, d, a, G_w4c17, MD5S13); + MD5_STEP0(MD5_Go, a, b, c, d, G_w9c18, MD5S10); + MD5_STEP0(MD5_Go, d, a, b, c, G_wec19, MD5S11); + MD5_STEP0(MD5_Go, c, d, a, b, G_w3c1a, MD5S12); + MD5_STEP0(MD5_Go, b, c, d, a, G_w8c1b, MD5S13); + MD5_STEP0(MD5_Go, a, b, c, d, G_wdc1c, MD5S10); + MD5_STEP0(MD5_Go, d, a, b, c, G_w2c1d, MD5S11); + MD5_STEP0(MD5_Go, c, d, a, b, G_w7c1e, MD5S12); + MD5_STEP0(MD5_Go, b, c, d, a, G_wcc1f, MD5S13); + + MD5_STEP0(MD5_H1, a, b, c, d, H_w5c20, MD5S20); + MD5_STEP0(MD5_H2, d, a, b, c, H_w8c21, MD5S21); + MD5_STEP0(MD5_H1, c, d, a, b, H_wbc22, MD5S22); + MD5_STEP0(MD5_H2, b, c, d, a, H_wec23, MD5S23); + MD5_STEP0(MD5_H1, a, b, c, d, H_w1c24, MD5S20); + MD5_STEP0(MD5_H2, d, a, b, c, H_w4c25, MD5S21); + MD5_STEP0(MD5_H1, c, d, a, b, H_w7c26, MD5S22); + MD5_STEP0(MD5_H2, b, c, d, a, H_wac27, MD5S23); + MD5_STEP0(MD5_H1, a, b, c, d, H_wdc28, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w0, H_w0c29, MD5S21); + MD5_STEP0(MD5_H1, c, d, a, b, H_w3c2a, MD5S22); + + bool q_cond = (pre_c != c); + + if (q_cond) continue; + + MD5_STEP0(MD5_H2, b, c, d, a, H_w6c2b, MD5S23); + MD5_STEP0(MD5_H1, a, b, c, d, H_w9c2c, MD5S20); + MD5_STEP0(MD5_H2, d, a, b, c, H_wcc2d, MD5S21); + MD5_STEP0(MD5_H1, c, d, a, b, H_wfc2e, MD5S22); + MD5_STEP0(MD5_H2, b, c, d, a, H_w2c2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0, I_w0c30, MD5S30); + MD5_STEP0(MD5_I , d, a, b, c, I_w7c31, MD5S31); + MD5_STEP0(MD5_I , c, d, a, b, I_wec32, MD5S32); + MD5_STEP0(MD5_I , b, c, d, a, I_w5c33, MD5S33); + MD5_STEP0(MD5_I , a, b, c, d, I_wcc34, MD5S30); + MD5_STEP0(MD5_I , d, a, b, c, I_w3c35, MD5S31); + MD5_STEP0(MD5_I , c, d, a, b, I_wac36, MD5S32); + MD5_STEP0(MD5_I , b, c, d, a, I_w1c37, MD5S33); + MD5_STEP0(MD5_I , a, b, c, d, I_w8c38, MD5S30); + MD5_STEP0(MD5_I , d, a, b, c, I_wfc39, MD5S31); + MD5_STEP0(MD5_I , c, d, a, b, I_w6c3a, MD5S32); + MD5_STEP0(MD5_I , b, c, d, a, I_wdc3b, MD5S33); + MD5_STEP0(MD5_I , a, b, c, d, I_w4c3c, MD5S30); + MD5_STEP0(MD5_I , d, a, b, c, I_wbc3d, MD5S31); + MD5_STEP0(MD5_I , c, d, a, b, I_w2c3e, MD5S32); + MD5_STEP0(MD5_I , b, c, d, a, I_w9c3f, MD5S33); + + + const u32x r0 = a; + const u32x r1 = d; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_S + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m00010_m04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const u32x * words_buf_r, void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32 w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = 0; + w[ 5] = 0; + w[ 6] = 0; + w[ 7] = 0; + w[ 8] = 0; + w[ 9] = 0; + w[10] = 0; + w[11] = 0; + w[12] = 0; + w[13] = 0; + w[14] = pws[gid].i[14]; + w[15] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m00010m (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m00010_m08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const u32x * words_buf_r, void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32 w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = pws[gid].i[ 4]; + w[ 5] = pws[gid].i[ 5]; + w[ 6] = pws[gid].i[ 6]; + w[ 7] = pws[gid].i[ 7]; + w[ 8] = 0; + w[ 9] = 0; + w[10] = 0; + w[11] = 0; + w[12] = 0; + w[13] = 0; + w[14] = pws[gid].i[14]; + w[15] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m00010m (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m00010_m16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const u32x * words_buf_r, void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32 w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = pws[gid].i[ 4]; + w[ 5] = pws[gid].i[ 5]; + w[ 6] = pws[gid].i[ 6]; + w[ 7] = pws[gid].i[ 7]; + w[ 8] = pws[gid].i[ 8]; + w[ 9] = pws[gid].i[ 9]; + w[10] = pws[gid].i[10]; + w[11] = pws[gid].i[11]; + w[12] = pws[gid].i[12]; + w[13] = pws[gid].i[13]; + w[14] = pws[gid].i[14]; + w[15] = pws[gid].i[15]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m00010m (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m00010_s04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const u32x * words_buf_r, void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32 w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = 0; + w[ 5] = 0; + w[ 6] = 0; + w[ 7] = 0; + w[ 8] = 0; + w[ 9] = 0; + w[10] = 0; + w[11] = 0; + w[12] = 0; + w[13] = 0; + w[14] = pws[gid].i[14]; + w[15] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m00010s (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m00010_s08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const u32x * words_buf_r, void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32 w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = pws[gid].i[ 4]; + w[ 5] = pws[gid].i[ 5]; + w[ 6] = pws[gid].i[ 6]; + w[ 7] = pws[gid].i[ 7]; + w[ 8] = 0; + w[ 9] = 0; + w[10] = 0; + w[11] = 0; + w[12] = 0; + w[13] = 0; + w[14] = pws[gid].i[14]; + w[15] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m00010s (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m00010_s16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const u32x * words_buf_r, void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32 w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = pws[gid].i[ 4]; + w[ 5] = pws[gid].i[ 5]; + w[ 6] = pws[gid].i[ 6]; + w[ 7] = pws[gid].i[ 7]; + w[ 8] = pws[gid].i[ 8]; + w[ 9] = pws[gid].i[ 9]; + w[10] = pws[gid].i[10]; + w[11] = pws[gid].i[11]; + w[12] = pws[gid].i[12]; + w[13] = pws[gid].i[13]; + w[14] = pws[gid].i[14]; + w[15] = pws[gid].i[15]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m00010s (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} diff --git a/nv/m00020_a0.cu b/nv/m00020_a0.cu new file mode 100644 index 0000000000..568d90bf20 --- /dev/null +++ b/nv/m00020_a0.cu @@ -0,0 +1,506 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _MD5_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW2 +#define VECT_SIZE1 +#endif + +#define DGST_R0 0 +#define DGST_R1 3 +#define DGST_R2 2 +#define DGST_R3 1 + +#include "include/kernel_functions.c" +#include "types_nv.c" +#include "common_nv.c" +#include "include/rp_gpu.h" +#include "rp_nv.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +__device__ __constant__ gpu_rule_t c_rules[1024]; + +extern "C" __global__ void __launch_bounds__ (256, 1) m00020_m04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + u32x pw_buf1[4]; + + pw_buf1[0] = pws[gid].i[ 4]; + pw_buf1[1] = pws[gid].i[ 5]; + pw_buf1[2] = pws[gid].i[ 6]; + pw_buf1[3] = pws[gid].i[ 7]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[7]; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + u32x w1[4]; + u32x w2[4]; + u32x w3[4]; + + w0[0] = pw_buf0[0]; + w0[1] = pw_buf0[1]; + w0[2] = pw_buf0[2]; + w0[3] = pw_buf0[3]; + w1[0] = pw_buf1[0]; + w1[1] = pw_buf1[1]; + w1[2] = pw_buf1[2]; + w1[3] = pw_buf1[3]; + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 out_len = apply_rules (c_rules[il_pos].cmds, w0, w1, pw_len); + + /** + * prepend salt + */ + + const u32 out_salt_len = out_len + salt_len; + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + w0_t[0] = w0[0]; + w0_t[1] = w0[1]; + w0_t[2] = w0[2]; + w0_t[3] = w0[3]; + w1_t[0] = w1[0]; + w1_t[1] = w1[1]; + w1_t[2] = w1[2]; + w1_t[3] = w1[3]; + w2_t[0] = w2[0]; + w2_t[1] = w2[1]; + w2_t[2] = w2[2]; + w2_t[3] = w2[3]; + w3_t[0] = w3[0]; + w3_t[1] = w3[1]; + w3_t[2] = w3[2]; + w3_t[3] = w3[3]; + + switch_buffer_by_offset (w0_t, w1_t, w2_t, w3_t, salt_len); + + w0_t[0] |= salt_buf0[0]; + w0_t[1] |= salt_buf0[1]; + w0_t[2] |= salt_buf0[2]; + w0_t[3] |= salt_buf0[3]; + w1_t[0] |= salt_buf1[0]; + w1_t[1] |= salt_buf1[1]; + w1_t[2] |= salt_buf1[2]; + w1_t[3] |= salt_buf1[3]; + + append_0x80_4 (w0_t, w1_t, w2_t, w3_t, out_salt_len); + + w3_t[2] = out_salt_len * 8; + + /** + * md5 + */ + + u32x tmp2; + + u32x a = MD5M_A; + u32x b = MD5M_B; + u32x c = MD5M_C; + u32x d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0_t[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0_t[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0_t[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1_t[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1_t[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1_t[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2_t[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2_t[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2_t[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3_t[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3_t[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3_t[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0_t[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1_t[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2_t[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1_t[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1_t[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2_t[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3_t[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0_t[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2_t[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3_t[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0_t[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1_t[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3_t[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H1, a, b, c, d, w1_t[1], MD5C20, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w2_t[0], MD5C21, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w2_t[3], MD5C22, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w3_t[2], MD5C23, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w0_t[1], MD5C24, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w1_t[0], MD5C25, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w1_t[3], MD5C26, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w2_t[2], MD5C27, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w3_t[1], MD5C28, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w0_t[0], MD5C29, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w0_t[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w1_t[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w2_t[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w3_t[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w3_t[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w0_t[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1_t[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3_t[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3_t[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0_t[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0_t[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2_t[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1_t[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3_t[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1_t[0], MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w2_t[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0_t[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2_t[1], MD5C3f, MD5S33); + + + const u32x r0 = a; + const u32x r1 = d; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_M + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m00020_m08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m00020_m16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m00020_s04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + u32x pw_buf1[4]; + + pw_buf1[0] = pws[gid].i[ 4]; + pw_buf1[1] = pws[gid].i[ 5]; + pw_buf1[2] = pws[gid].i[ 6]; + pw_buf1[3] = pws[gid].i[ 7]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[7]; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + u32x w1[4]; + u32x w2[4]; + u32x w3[4]; + + w0[0] = pw_buf0[0]; + w0[1] = pw_buf0[1]; + w0[2] = pw_buf0[2]; + w0[3] = pw_buf0[3]; + w1[0] = pw_buf1[0]; + w1[1] = pw_buf1[1]; + w1[2] = pw_buf1[2]; + w1[3] = pw_buf1[3]; + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 out_len = apply_rules (c_rules[il_pos].cmds, w0, w1, pw_len); + + /** + * prepend salt + */ + + const u32 out_salt_len = out_len + salt_len; + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + w0_t[0] = w0[0]; + w0_t[1] = w0[1]; + w0_t[2] = w0[2]; + w0_t[3] = w0[3]; + w1_t[0] = w1[0]; + w1_t[1] = w1[1]; + w1_t[2] = w1[2]; + w1_t[3] = w1[3]; + w2_t[0] = w2[0]; + w2_t[1] = w2[1]; + w2_t[2] = w2[2]; + w2_t[3] = w2[3]; + w3_t[0] = w3[0]; + w3_t[1] = w3[1]; + w3_t[2] = w3[2]; + w3_t[3] = w3[3]; + + switch_buffer_by_offset (w0_t, w1_t, w2_t, w3_t, salt_len); + + w0_t[0] |= salt_buf0[0]; + w0_t[1] |= salt_buf0[1]; + w0_t[2] |= salt_buf0[2]; + w0_t[3] |= salt_buf0[3]; + w1_t[0] |= salt_buf1[0]; + w1_t[1] |= salt_buf1[1]; + w1_t[2] |= salt_buf1[2]; + w1_t[3] |= salt_buf1[3]; + + append_0x80_4 (w0_t, w1_t, w2_t, w3_t, out_salt_len); + + w3_t[2] = out_salt_len * 8; + + /** + * md5 + */ + + u32x tmp2; + + u32x a = MD5M_A; + u32x b = MD5M_B; + u32x c = MD5M_C; + u32x d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0_t[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0_t[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0_t[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1_t[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1_t[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1_t[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2_t[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2_t[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2_t[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3_t[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3_t[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3_t[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0_t[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1_t[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2_t[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1_t[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1_t[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2_t[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3_t[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0_t[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2_t[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3_t[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0_t[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1_t[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3_t[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H1, a, b, c, d, w1_t[1], MD5C20, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w2_t[0], MD5C21, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w2_t[3], MD5C22, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w3_t[2], MD5C23, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w0_t[1], MD5C24, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w1_t[0], MD5C25, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w1_t[3], MD5C26, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w2_t[2], MD5C27, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w3_t[1], MD5C28, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w0_t[0], MD5C29, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w0_t[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w1_t[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w2_t[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w3_t[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w3_t[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w0_t[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1_t[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3_t[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3_t[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0_t[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0_t[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2_t[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1_t[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3_t[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1_t[0], MD5C3c, MD5S30); + + bool q_cond = (search[0] != a); + + if (q_cond) continue; + + MD5_STEP (MD5_I , d, a, b, c, w2_t[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0_t[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2_t[1], MD5C3f, MD5S33); + + + const u32x r0 = a; + const u32x r1 = d; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_S + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m00020_s08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m00020_s16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/nv/m00020_a1.cu b/nv/m00020_a1.cu new file mode 100644 index 0000000000..41a52f7f6f --- /dev/null +++ b/nv/m00020_a1.cu @@ -0,0 +1,602 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _MD5_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW2 +#define VECT_SIZE4 +#endif + +#define DGST_R0 0 +#define DGST_R1 3 +#define DGST_R2 2 +#define DGST_R3 1 + +#include "include/kernel_functions.c" +#include "types_nv.c" +#include "common_nv.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +__device__ __constant__ comb_t c_combs[1024]; + +extern "C" __global__ void __launch_bounds__ (256, 1) m00020_m04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, c_combs[0].pw_len); + } + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[7]; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = c_combs[il_pos].pw_len; + + const u32 pw_len = pw_l_len + pw_r_len; + + u32 wordr0[4]; + u32 wordr1[4]; + u32 wordr2[4]; + u32 wordr3[4]; + + wordr0[0] = c_combs[il_pos].i[0]; + wordr0[1] = c_combs[il_pos].i[1]; + wordr0[2] = c_combs[il_pos].i[2]; + wordr0[3] = c_combs[il_pos].i[3]; + wordr1[0] = c_combs[il_pos].i[4]; + wordr1[1] = c_combs[il_pos].i[5]; + wordr1[2] = c_combs[il_pos].i[6]; + wordr1[3] = c_combs[il_pos].i[7]; + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + u32x w0[4]; + u32x w1[4]; + u32x w2[4]; + u32x w3[4]; + + w0[0] = wordl0[0] | wordr0[0]; + w0[1] = wordl0[1] | wordr0[1]; + w0[2] = wordl0[2] | wordr0[2]; + w0[3] = wordl0[3] | wordr0[3]; + w1[0] = wordl1[0] | wordr1[0]; + w1[1] = wordl1[1] | wordr1[1]; + w1[2] = wordl1[2] | wordr1[2]; + w1[3] = wordl1[3] | wordr1[3]; + w2[0] = wordl2[0] | wordr2[0]; + w2[1] = wordl2[1] | wordr2[1]; + w2[2] = wordl2[2] | wordr2[2]; + w2[3] = wordl2[3] | wordr2[3]; + w3[0] = wordl3[0] | wordr3[0]; + w3[1] = wordl3[1] | wordr3[1]; + w3[2] = wordl3[2] | wordr3[2]; + w3[3] = wordl3[3] | wordr3[3]; + + /** + * prepend salt + */ + + const u32 pw_salt_len = pw_len + salt_len; + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + w0_t[0] = w0[0]; + w0_t[1] = w0[1]; + w0_t[2] = w0[2]; + w0_t[3] = w0[3]; + w1_t[0] = w1[0]; + w1_t[1] = w1[1]; + w1_t[2] = w1[2]; + w1_t[3] = w1[3]; + w2_t[0] = w2[0]; + w2_t[1] = w2[1]; + w2_t[2] = w2[2]; + w2_t[3] = w2[3]; + w3_t[0] = w3[0]; + w3_t[1] = w3[1]; + w3_t[2] = w3[2]; + w3_t[3] = w3[3]; + + switch_buffer_by_offset (w0_t, w1_t, w2_t, w3_t, salt_len); + + w0_t[0] |= salt_buf0[0]; + w0_t[1] |= salt_buf0[1]; + w0_t[2] |= salt_buf0[2]; + w0_t[3] |= salt_buf0[3]; + w1_t[0] |= salt_buf1[0]; + w1_t[1] |= salt_buf1[1]; + w1_t[2] |= salt_buf1[2]; + w1_t[3] |= salt_buf1[3]; + + append_0x80_4 (w0_t, w1_t, w2_t, w3_t, pw_salt_len); + + w3_t[2] = pw_salt_len * 8; + + /** + * md5 + */ + + u32x tmp2; + + u32x a = MD5M_A; + u32x b = MD5M_B; + u32x c = MD5M_C; + u32x d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0_t[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0_t[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0_t[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1_t[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1_t[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1_t[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2_t[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2_t[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2_t[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3_t[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3_t[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3_t[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0_t[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1_t[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2_t[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1_t[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1_t[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2_t[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3_t[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0_t[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2_t[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3_t[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0_t[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1_t[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3_t[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H1, a, b, c, d, w1_t[1], MD5C20, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w2_t[0], MD5C21, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w2_t[3], MD5C22, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w3_t[2], MD5C23, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w0_t[1], MD5C24, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w1_t[0], MD5C25, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w1_t[3], MD5C26, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w2_t[2], MD5C27, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w3_t[1], MD5C28, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w0_t[0], MD5C29, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w0_t[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w1_t[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w2_t[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w3_t[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w3_t[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w0_t[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1_t[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3_t[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3_t[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0_t[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0_t[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2_t[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1_t[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3_t[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1_t[0], MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w2_t[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0_t[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2_t[1], MD5C3f, MD5S33); + + + const u32x r0 = a; + const u32x r1 = d; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_M + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m00020_m08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m00020_m16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m00020_s04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, c_combs[0].pw_len); + } + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[7]; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = c_combs[il_pos].pw_len; + + const u32 pw_len = pw_l_len + pw_r_len; + + u32 wordr0[4]; + u32 wordr1[4]; + u32 wordr2[4]; + u32 wordr3[4]; + + wordr0[0] = c_combs[il_pos].i[0]; + wordr0[1] = c_combs[il_pos].i[1]; + wordr0[2] = c_combs[il_pos].i[2]; + wordr0[3] = c_combs[il_pos].i[3]; + wordr1[0] = c_combs[il_pos].i[4]; + wordr1[1] = c_combs[il_pos].i[5]; + wordr1[2] = c_combs[il_pos].i[6]; + wordr1[3] = c_combs[il_pos].i[7]; + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + u32x w0[4]; + u32x w1[4]; + u32x w2[4]; + u32x w3[4]; + + w0[0] = wordl0[0] | wordr0[0]; + w0[1] = wordl0[1] | wordr0[1]; + w0[2] = wordl0[2] | wordr0[2]; + w0[3] = wordl0[3] | wordr0[3]; + w1[0] = wordl1[0] | wordr1[0]; + w1[1] = wordl1[1] | wordr1[1]; + w1[2] = wordl1[2] | wordr1[2]; + w1[3] = wordl1[3] | wordr1[3]; + w2[0] = wordl2[0] | wordr2[0]; + w2[1] = wordl2[1] | wordr2[1]; + w2[2] = wordl2[2] | wordr2[2]; + w2[3] = wordl2[3] | wordr2[3]; + w3[0] = wordl3[0] | wordr3[0]; + w3[1] = wordl3[1] | wordr3[1]; + w3[2] = wordl3[2] | wordr3[2]; + w3[3] = wordl3[3] | wordr3[3]; + + /** + * prepend salt + */ + + const u32 pw_salt_len = pw_len + salt_len; + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + w0_t[0] = w0[0]; + w0_t[1] = w0[1]; + w0_t[2] = w0[2]; + w0_t[3] = w0[3]; + w1_t[0] = w1[0]; + w1_t[1] = w1[1]; + w1_t[2] = w1[2]; + w1_t[3] = w1[3]; + w2_t[0] = w2[0]; + w2_t[1] = w2[1]; + w2_t[2] = w2[2]; + w2_t[3] = w2[3]; + w3_t[0] = w3[0]; + w3_t[1] = w3[1]; + w3_t[2] = w3[2]; + w3_t[3] = w3[3]; + + switch_buffer_by_offset (w0_t, w1_t, w2_t, w3_t, salt_len); + + w3_t[2] = pw_salt_len * 8; + + w0_t[0] |= salt_buf0[0]; + w0_t[1] |= salt_buf0[1]; + w0_t[2] |= salt_buf0[2]; + w0_t[3] |= salt_buf0[3]; + w1_t[0] |= salt_buf1[0]; + w1_t[1] |= salt_buf1[1]; + w1_t[2] |= salt_buf1[2]; + w1_t[3] |= salt_buf1[3]; + + append_0x80_4 (w0_t, w1_t, w2_t, w3_t, pw_salt_len); + + w3_t[2] = pw_salt_len * 8; + + /** + * md5 + */ + + u32x tmp2; + + u32x a = MD5M_A; + u32x b = MD5M_B; + u32x c = MD5M_C; + u32x d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0_t[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0_t[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0_t[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1_t[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1_t[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1_t[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2_t[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2_t[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2_t[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3_t[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3_t[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3_t[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0_t[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1_t[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2_t[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1_t[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1_t[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2_t[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3_t[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0_t[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2_t[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3_t[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0_t[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1_t[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3_t[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H1, a, b, c, d, w1_t[1], MD5C20, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w2_t[0], MD5C21, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w2_t[3], MD5C22, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w3_t[2], MD5C23, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w0_t[1], MD5C24, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w1_t[0], MD5C25, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w1_t[3], MD5C26, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w2_t[2], MD5C27, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w3_t[1], MD5C28, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w0_t[0], MD5C29, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w0_t[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w1_t[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w2_t[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w3_t[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w3_t[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w0_t[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1_t[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3_t[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3_t[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0_t[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0_t[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2_t[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1_t[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3_t[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1_t[0], MD5C3c, MD5S30); + + bool q_cond = (search[0] != a); + + if (q_cond) continue; + + MD5_STEP (MD5_I , d, a, b, c, w2_t[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0_t[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2_t[1], MD5C3f, MD5S33); + + + const u32x r0 = a; + const u32x r1 = d; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_S + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m00020_s08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m00020_s16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/nv/m00020_a3.cu b/nv/m00020_a3.cu new file mode 100644 index 0000000000..faf9a69339 --- /dev/null +++ b/nv/m00020_a3.cu @@ -0,0 +1,728 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _MD5_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW2 +#define VECT_SIZE4 +#endif + +#define DGST_R0 0 +#define DGST_R1 3 +#define DGST_R2 2 +#define DGST_R3 1 + +#include "include/kernel_functions.c" +#include "types_nv.c" +#include "common_nv.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +__device__ __constant__ bf_t c_bfs[1024]; + +__device__ static void m00020m (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], const u32 pw_len, const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset) +{ + /** + * modifier + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + const u32 lid = threadIdx.x; + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[ 1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[ 2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[ 3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[ 4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[ 5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[ 6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[ 7]; + + u32 salt_buf2[4]; + + salt_buf2[0] = 0; + salt_buf2[1] = 0; + salt_buf2[2] = 0; + salt_buf2[3] = 0; + + u32 salt_buf3[4]; + + salt_buf3[0] = 0; + salt_buf3[1] = 0; + salt_buf3[2] = 0; + salt_buf3[3] = 0; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + const u32 pw_salt_len = pw_len + salt_len; + + /** + * loop + */ + + u32x w0l = w0[0]; + + for (u32 il_pos = 0; il_pos < bfs_cnt; il_pos++) + { + const u32 w0r = c_bfs[il_pos].i; + + w0[0] = w0l | w0r; + + /** + * prepend salt + */ + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + w0_t[0] = w0[0]; + w0_t[1] = w0[1]; + w0_t[2] = w0[2]; + w0_t[3] = w0[3]; + w1_t[0] = w1[0]; + w1_t[1] = w1[1]; + w1_t[2] = w1[2]; + w1_t[3] = w1[3]; + w2_t[0] = w2[0]; + w2_t[1] = w2[1]; + w2_t[2] = w2[2]; + w2_t[3] = w2[3]; + w3_t[0] = w3[0]; + w3_t[1] = w3[1]; + w3_t[2] = w3[2]; + w3_t[3] = w3[3]; + + switch_buffer_by_offset (w0_t, w1_t, w2_t, w3_t, salt_len); + + w3_t[2] = pw_salt_len * 8; + + w0_t[0] |= salt_buf0[0]; + w0_t[1] |= salt_buf0[1]; + w0_t[2] |= salt_buf0[2]; + w0_t[3] |= salt_buf0[3]; + w1_t[0] |= salt_buf1[0]; + w1_t[1] |= salt_buf1[1]; + w1_t[2] |= salt_buf1[2]; + w1_t[3] |= salt_buf1[3]; + w2_t[0] |= salt_buf2[0]; + w2_t[1] |= salt_buf2[1]; + w2_t[2] |= salt_buf2[2]; + w2_t[3] |= salt_buf2[3]; + w3_t[0] |= salt_buf3[0]; + w3_t[1] |= salt_buf3[1]; + w3_t[2] |= salt_buf3[2]; + w3_t[3] |= salt_buf3[3]; + + /** + * md5 + */ + + u32x tmp2; + + u32x a = MD5M_A; + u32x b = MD5M_B; + u32x c = MD5M_C; + u32x d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0_t[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0_t[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0_t[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1_t[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1_t[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1_t[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2_t[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2_t[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2_t[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3_t[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3_t[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3_t[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0_t[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1_t[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2_t[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1_t[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1_t[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2_t[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3_t[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0_t[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2_t[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3_t[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0_t[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1_t[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3_t[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H1, a, b, c, d, w1_t[1], MD5C20, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w2_t[0], MD5C21, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w2_t[3], MD5C22, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w3_t[2], MD5C23, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w0_t[1], MD5C24, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w1_t[0], MD5C25, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w1_t[3], MD5C26, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w2_t[2], MD5C27, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w3_t[1], MD5C28, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w0_t[0], MD5C29, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w0_t[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w1_t[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w2_t[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w3_t[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w3_t[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w0_t[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1_t[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3_t[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3_t[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0_t[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0_t[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2_t[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1_t[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3_t[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1_t[0], MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w2_t[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0_t[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2_t[1], MD5C3f, MD5S33); + + + const u32x r0 = a; + const u32x r1 = d; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_M + } +} + +__device__ static void m00020s (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], const u32 pw_len, const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset) +{ + /** + * modifier + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + const u32 lid = threadIdx.x; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[ 1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[ 2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[ 3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[ 4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[ 5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[ 6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[ 7]; + + u32 salt_buf2[4]; + + salt_buf2[0] = 0; + salt_buf2[1] = 0; + salt_buf2[2] = 0; + salt_buf2[3] = 0; + + u32 salt_buf3[4]; + + salt_buf3[0] = 0; + salt_buf3[1] = 0; + salt_buf3[2] = 0; + salt_buf3[3] = 0; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + const u32 pw_salt_len = pw_len + salt_len; + + /** + * loop + */ + + u32x w0l = w0[0]; + + for (u32 il_pos = 0; il_pos < bfs_cnt; il_pos++) + { + const u32 w0r = c_bfs[il_pos].i; + + w0[0] = w0l | w0r; + + /** + * prepend salt + */ + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + w0_t[0] = w0[0]; + w0_t[1] = w0[1]; + w0_t[2] = w0[2]; + w0_t[3] = w0[3]; + w1_t[0] = w1[0]; + w1_t[1] = w1[1]; + w1_t[2] = w1[2]; + w1_t[3] = w1[3]; + w2_t[0] = w2[0]; + w2_t[1] = w2[1]; + w2_t[2] = w2[2]; + w2_t[3] = w2[3]; + w3_t[0] = w3[0]; + w3_t[1] = w3[1]; + w3_t[2] = w3[2]; + w3_t[3] = w3[3]; + + switch_buffer_by_offset (w0_t, w1_t, w2_t, w3_t, salt_len); + + w3_t[2] = pw_salt_len * 8; + + w0_t[0] |= salt_buf0[0]; + w0_t[1] |= salt_buf0[1]; + w0_t[2] |= salt_buf0[2]; + w0_t[3] |= salt_buf0[3]; + w1_t[0] |= salt_buf1[0]; + w1_t[1] |= salt_buf1[1]; + w1_t[2] |= salt_buf1[2]; + w1_t[3] |= salt_buf1[3]; + w2_t[0] |= salt_buf2[0]; + w2_t[1] |= salt_buf2[1]; + w2_t[2] |= salt_buf2[2]; + w2_t[3] |= salt_buf2[3]; + w3_t[0] |= salt_buf3[0]; + w3_t[1] |= salt_buf3[1]; + w3_t[2] |= salt_buf3[2]; + w3_t[3] |= salt_buf3[3]; + + /** + * md5 + */ + + u32x tmp2; + + u32x a = MD5M_A; + u32x b = MD5M_B; + u32x c = MD5M_C; + u32x d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0_t[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0_t[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0_t[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1_t[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1_t[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1_t[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2_t[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2_t[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2_t[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3_t[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3_t[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3_t[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0_t[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1_t[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2_t[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1_t[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1_t[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2_t[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3_t[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0_t[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2_t[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3_t[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0_t[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1_t[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3_t[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H1, a, b, c, d, w1_t[1], MD5C20, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w2_t[0], MD5C21, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w2_t[3], MD5C22, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w3_t[2], MD5C23, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w0_t[1], MD5C24, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w1_t[0], MD5C25, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w1_t[3], MD5C26, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w2_t[2], MD5C27, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w3_t[1], MD5C28, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w0_t[0], MD5C29, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w0_t[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w1_t[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w2_t[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w3_t[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w3_t[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w0_t[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1_t[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3_t[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3_t[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0_t[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0_t[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2_t[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1_t[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3_t[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1_t[0], MD5C3c, MD5S30); + + bool q_cond = (search[0] != a); + + if (q_cond) continue; + + MD5_STEP (MD5_I , d, a, b, c, w2_t[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0_t[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2_t[1], MD5C3f, MD5S33); + + + const u32x r0 = a; + const u32x r1 = d; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_S + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m00020_m04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m00020m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m00020_m08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m00020m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m00020_m16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = pws[gid].i[ 8]; + w2[1] = pws[gid].i[ 9]; + w2[2] = pws[gid].i[10]; + w2[3] = pws[gid].i[11]; + + u32x w3[4]; + + w3[0] = pws[gid].i[12]; + w3[1] = pws[gid].i[13]; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m00020m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m00020_s04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m00020s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m00020_s08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m00020s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m00020_s16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = pws[gid].i[ 8]; + w2[1] = pws[gid].i[ 9]; + w2[2] = pws[gid].i[10]; + w2[3] = pws[gid].i[11]; + + u32x w3[4]; + + w3[0] = pws[gid].i[12]; + w3[1] = pws[gid].i[13]; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m00020s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} diff --git a/nv/m00030_a0.cu b/nv/m00030_a0.cu new file mode 100644 index 0000000000..b5eb7fb986 --- /dev/null +++ b/nv/m00030_a0.cu @@ -0,0 +1,558 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _MD5_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW2 +#define VECT_SIZE1 +#endif + +#define DGST_R0 0 +#define DGST_R1 3 +#define DGST_R2 2 +#define DGST_R3 1 + +#include "include/kernel_functions.c" +#include "types_nv.c" +#include "common_nv.c" +#include "include/rp_gpu.h" +#include "rp_nv.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +__device__ __constant__ gpu_rule_t c_rules[1024]; + +extern "C" __global__ void __launch_bounds__ (256, 1) m00030_m04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + u32x pw_buf1[4]; + + pw_buf1[0] = pws[gid].i[ 4]; + pw_buf1[1] = pws[gid].i[ 5]; + pw_buf1[2] = pws[gid].i[ 6]; + pw_buf1[3] = pws[gid].i[ 7]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[7]; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + + w0[0] = pw_buf0[0]; + w0[1] = pw_buf0[1]; + w0[2] = pw_buf0[2]; + w0[3] = pw_buf0[3]; + + u32x w1[4]; + + w1[0] = pw_buf1[0]; + w1[1] = pw_buf1[1]; + w1[2] = pw_buf1[2]; + w1[3] = pw_buf1[3]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 out_len = apply_rules (c_rules[il_pos].cmds, w0, w1, pw_len); + + /** + * append salt + */ + + u32 s0[4]; + + s0[0] = salt_buf0[0]; + s0[1] = salt_buf0[1]; + s0[2] = salt_buf0[2]; + s0[3] = salt_buf0[3]; + + u32 s1[4]; + + s1[0] = salt_buf1[0]; + s1[1] = salt_buf1[1]; + s1[2] = salt_buf1[2]; + s1[3] = salt_buf1[3]; + + u32 s2[4]; + + s2[0] = 0; + s2[1] = 0; + s2[2] = 0; + s2[3] = 0; + + u32 s3[4]; + + s3[0] = 0; + s3[1] = 0; + s3[2] = 0; + s3[3] = 0; + + switch_buffer_by_offset (s0, s1, s2, s3, (out_len * 2)); + + const u32 out_salt_len = (out_len * 2) + salt_len; + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + make_unicode (w0, w0_t, w1_t); + make_unicode (w1, w2_t, w3_t); + + w0_t[0] |= s0[0]; + w0_t[1] |= s0[1]; + w0_t[2] |= s0[2]; + w0_t[3] |= s0[3]; + w1_t[0] |= s1[0]; + w1_t[1] |= s1[1]; + w1_t[2] |= s1[2]; + w1_t[3] |= s1[3]; + w2_t[0] |= s2[0]; + w2_t[1] |= s2[1]; + w2_t[2] |= s2[2]; + w2_t[3] |= s2[3]; + w3_t[0] |= s3[0]; + w3_t[1] |= s3[1]; + w3_t[2] |= s3[2]; + w3_t[3] |= s3[3]; + + append_0x80_4 (w0_t, w1_t, w2_t, w3_t, out_salt_len); + + w3_t[2] = out_salt_len * 8; + + /** + * md5 + */ + + u32x a = MD5M_A; + u32x b = MD5M_B; + u32x c = MD5M_C; + u32x d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0_t[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0_t[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0_t[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1_t[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1_t[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1_t[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2_t[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2_t[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2_t[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3_t[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3_t[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3_t[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0_t[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1_t[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2_t[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1_t[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1_t[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2_t[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3_t[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0_t[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2_t[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3_t[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0_t[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1_t[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3_t[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H , a, b, c, d, w1_t[1], MD5C20, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w2_t[0], MD5C21, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w2_t[3], MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w3_t[2], MD5C23, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w0_t[1], MD5C24, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w1_t[0], MD5C25, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w1_t[3], MD5C26, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w2_t[2], MD5C27, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w3_t[1], MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w0_t[0], MD5C29, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w0_t[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w1_t[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w2_t[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w3_t[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w3_t[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w0_t[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1_t[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3_t[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3_t[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0_t[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0_t[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2_t[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1_t[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3_t[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1_t[0], MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w2_t[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0_t[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2_t[1], MD5C3f, MD5S33); + + + const u32x r0 = a; + const u32x r1 = d; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_M + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m00030_m08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m00030_m16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m00030_s04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + u32x pw_buf1[4]; + + pw_buf1[0] = pws[gid].i[ 4]; + pw_buf1[1] = pws[gid].i[ 5]; + pw_buf1[2] = pws[gid].i[ 6]; + pw_buf1[3] = pws[gid].i[ 7]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[7]; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + + w0[0] = pw_buf0[0]; + w0[1] = pw_buf0[1]; + w0[2] = pw_buf0[2]; + w0[3] = pw_buf0[3]; + + u32x w1[4]; + + w1[0] = pw_buf1[0]; + w1[1] = pw_buf1[1]; + w1[2] = pw_buf1[2]; + w1[3] = pw_buf1[3]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 out_len = apply_rules (c_rules[il_pos].cmds, w0, w1, pw_len); + + /** + * append salt + */ + + u32 s0[4]; + + s0[0] = salt_buf0[0]; + s0[1] = salt_buf0[1]; + s0[2] = salt_buf0[2]; + s0[3] = salt_buf0[3]; + + u32 s1[4]; + + s1[0] = salt_buf1[0]; + s1[1] = salt_buf1[1]; + s1[2] = salt_buf1[2]; + s1[3] = salt_buf1[3]; + + u32 s2[4]; + + s2[0] = 0; + s2[1] = 0; + s2[2] = 0; + s2[3] = 0; + + u32 s3[4]; + + s3[0] = 0; + s3[1] = 0; + s3[2] = 0; + s3[3] = 0; + + switch_buffer_by_offset (s0, s1, s2, s3, (out_len * 2)); + + const u32 out_salt_len = (out_len * 2) + salt_len; + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + make_unicode (w0, w0_t, w1_t); + make_unicode (w1, w2_t, w3_t); + + w0_t[0] |= s0[0]; + w0_t[1] |= s0[1]; + w0_t[2] |= s0[2]; + w0_t[3] |= s0[3]; + w1_t[0] |= s1[0]; + w1_t[1] |= s1[1]; + w1_t[2] |= s1[2]; + w1_t[3] |= s1[3]; + w2_t[0] |= s2[0]; + w2_t[1] |= s2[1]; + w2_t[2] |= s2[2]; + w2_t[3] |= s2[3]; + w3_t[0] |= s3[0]; + w3_t[1] |= s3[1]; + w3_t[2] |= s3[2]; + w3_t[3] |= s3[3]; + + append_0x80_4 (w0_t, w1_t, w2_t, w3_t, out_salt_len); + + w3_t[2] = out_salt_len * 8; + + /** + * md5 + */ + + u32x a = MD5M_A; + u32x b = MD5M_B; + u32x c = MD5M_C; + u32x d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0_t[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0_t[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0_t[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1_t[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1_t[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1_t[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2_t[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2_t[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2_t[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3_t[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3_t[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3_t[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0_t[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1_t[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2_t[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1_t[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1_t[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2_t[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3_t[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0_t[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2_t[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3_t[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0_t[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1_t[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3_t[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H , a, b, c, d, w1_t[1], MD5C20, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w2_t[0], MD5C21, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w2_t[3], MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w3_t[2], MD5C23, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w0_t[1], MD5C24, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w1_t[0], MD5C25, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w1_t[3], MD5C26, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w2_t[2], MD5C27, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w3_t[1], MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w0_t[0], MD5C29, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w0_t[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w1_t[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w2_t[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w3_t[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w3_t[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w0_t[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1_t[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3_t[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3_t[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0_t[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0_t[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2_t[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1_t[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3_t[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1_t[0], MD5C3c, MD5S30); + + bool q_cond = (search[0] != a); + + if (q_cond) continue; + + MD5_STEP (MD5_I , d, a, b, c, w2_t[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0_t[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2_t[1], MD5C3f, MD5S33); + + + const u32x r0 = a; + const u32x r1 = d; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_S + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m00030_s08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m00030_s16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/nv/m00030_a1.cu b/nv/m00030_a1.cu new file mode 100644 index 0000000000..b8e6e7fe39 --- /dev/null +++ b/nv/m00030_a1.cu @@ -0,0 +1,652 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _MD5_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW2 +#define VECT_SIZE4 +#endif + +#define DGST_R0 0 +#define DGST_R1 3 +#define DGST_R2 2 +#define DGST_R3 1 + +#include "include/kernel_functions.c" +#include "types_nv.c" +#include "common_nv.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +__device__ __constant__ comb_t c_combs[1024]; + +extern "C" __global__ void __launch_bounds__ (256, 1) m00030_m04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, c_combs[0].pw_len); + } + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[7]; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = c_combs[il_pos].pw_len; + + const u32 pw_len = pw_l_len + pw_r_len; + + u32 wordr0[4]; + + wordr0[0] = c_combs[il_pos].i[0]; + wordr0[1] = c_combs[il_pos].i[1]; + wordr0[2] = c_combs[il_pos].i[2]; + wordr0[3] = c_combs[il_pos].i[3]; + + u32 wordr1[4]; + + wordr1[0] = c_combs[il_pos].i[4]; + wordr1[1] = c_combs[il_pos].i[5]; + wordr1[2] = c_combs[il_pos].i[6]; + wordr1[3] = c_combs[il_pos].i[7]; + + u32 wordr2[4]; + + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + + u32 wordr3[4]; + + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + /** + * append salt + */ + + u32 s0[4]; + + s0[0] = salt_buf0[0]; + s0[1] = salt_buf0[1]; + s0[2] = salt_buf0[2]; + s0[3] = salt_buf0[3]; + + u32 s1[4]; + + s1[0] = salt_buf1[0]; + s1[1] = salt_buf1[1]; + s1[2] = salt_buf1[2]; + s1[3] = salt_buf1[3]; + + u32 s2[4]; + + s2[0] = 0; + s2[1] = 0; + s2[2] = 0; + s2[3] = 0; + + u32 s3[4]; + + s3[0] = 0; + s3[1] = 0; + s3[2] = 0; + s3[3] = 0; + + switch_buffer_by_offset (s0, s1, s2, s3, (pw_len * 2)); + + const u32 pw_salt_len = (pw_len * 2) + salt_len; + + u32x w0[4]; + u32x w1[4]; + u32x w2[4]; + u32x w3[4]; + + w0[0] = wordl0[0] | wordr0[0]; + w0[1] = wordl0[1] | wordr0[1]; + w0[2] = wordl0[2] | wordr0[2]; + w0[3] = wordl0[3] | wordr0[3]; + w1[0] = wordl1[0] | wordr1[0]; + w1[1] = wordl1[1] | wordr1[1]; + w1[2] = wordl1[2] | wordr1[2]; + w1[3] = wordl1[3] | wordr1[3]; + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + make_unicode (w0, w0_t, w1_t); + make_unicode (w1, w2_t, w3_t); + + w0_t[0] |= s0[0]; + w0_t[1] |= s0[1]; + w0_t[2] |= s0[2]; + w0_t[3] |= s0[3]; + w1_t[0] |= s1[0]; + w1_t[1] |= s1[1]; + w1_t[2] |= s1[2]; + w1_t[3] |= s1[3]; + w2_t[0] |= s2[0]; + w2_t[1] |= s2[1]; + w2_t[2] |= s2[2]; + w2_t[3] |= s2[3]; + w3_t[0] |= s3[0]; + w3_t[1] |= s3[1]; + w3_t[2] |= s3[2]; + w3_t[3] |= s3[3]; + + append_0x80_4 (w0_t, w1_t, w2_t, w3_t, pw_salt_len); + + w3_t[2] = pw_salt_len * 8; + + /** + * md5 + */ + + u32x a = MD5M_A; + u32x b = MD5M_B; + u32x c = MD5M_C; + u32x d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0_t[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0_t[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0_t[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1_t[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1_t[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1_t[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2_t[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2_t[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2_t[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3_t[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3_t[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3_t[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0_t[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1_t[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2_t[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1_t[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1_t[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2_t[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3_t[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0_t[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2_t[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3_t[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0_t[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1_t[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3_t[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H , a, b, c, d, w1_t[1], MD5C20, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w2_t[0], MD5C21, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w2_t[3], MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w3_t[2], MD5C23, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w0_t[1], MD5C24, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w1_t[0], MD5C25, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w1_t[3], MD5C26, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w2_t[2], MD5C27, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w3_t[1], MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w0_t[0], MD5C29, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w0_t[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w1_t[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w2_t[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w3_t[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w3_t[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w0_t[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1_t[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3_t[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3_t[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0_t[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0_t[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2_t[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1_t[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3_t[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1_t[0], MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w2_t[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0_t[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2_t[1], MD5C3f, MD5S33); + + + const u32x r0 = a; + const u32x r1 = d; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_M + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m00030_m08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m00030_m16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m00030_s04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, c_combs[0].pw_len); + } + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[7]; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = c_combs[il_pos].pw_len; + + const u32 pw_len = pw_l_len + pw_r_len; + + u32 wordr0[4]; + + wordr0[0] = c_combs[il_pos].i[0]; + wordr0[1] = c_combs[il_pos].i[1]; + wordr0[2] = c_combs[il_pos].i[2]; + wordr0[3] = c_combs[il_pos].i[3]; + + u32 wordr1[4]; + + wordr1[0] = c_combs[il_pos].i[4]; + wordr1[1] = c_combs[il_pos].i[5]; + wordr1[2] = c_combs[il_pos].i[6]; + wordr1[3] = c_combs[il_pos].i[7]; + + u32 wordr2[4]; + + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + + u32 wordr3[4]; + + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + /** + * append salt + */ + + u32 s0[4]; + + s0[0] = salt_buf0[0]; + s0[1] = salt_buf0[1]; + s0[2] = salt_buf0[2]; + s0[3] = salt_buf0[3]; + + u32 s1[4]; + + s1[0] = salt_buf1[0]; + s1[1] = salt_buf1[1]; + s1[2] = salt_buf1[2]; + s1[3] = salt_buf1[3]; + + u32 s2[4]; + + s2[0] = 0; + s2[1] = 0; + s2[2] = 0; + s2[3] = 0; + + u32 s3[4]; + + s3[0] = 0; + s3[1] = 0; + s3[2] = 0; + s3[3] = 0; + + switch_buffer_by_offset (s0, s1, s2, s3, (pw_len * 2)); + + const u32 pw_salt_len = (pw_len * 2) + salt_len; + + u32x w0[4]; + u32x w1[4]; + u32x w2[4]; + u32x w3[4]; + + w0[0] = wordl0[0] | wordr0[0]; + w0[1] = wordl0[1] | wordr0[1]; + w0[2] = wordl0[2] | wordr0[2]; + w0[3] = wordl0[3] | wordr0[3]; + w1[0] = wordl1[0] | wordr1[0]; + w1[1] = wordl1[1] | wordr1[1]; + w1[2] = wordl1[2] | wordr1[2]; + w1[3] = wordl1[3] | wordr1[3]; + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + make_unicode (w0, w0_t, w1_t); + make_unicode (w1, w2_t, w3_t); + + w0_t[0] |= s0[0]; + w0_t[1] |= s0[1]; + w0_t[2] |= s0[2]; + w0_t[3] |= s0[3]; + w1_t[0] |= s1[0]; + w1_t[1] |= s1[1]; + w1_t[2] |= s1[2]; + w1_t[3] |= s1[3]; + w2_t[0] |= s2[0]; + w2_t[1] |= s2[1]; + w2_t[2] |= s2[2]; + w2_t[3] |= s2[3]; + w3_t[0] |= s3[0]; + w3_t[1] |= s3[1]; + w3_t[2] |= s3[2]; + w3_t[3] |= s3[3]; + + append_0x80_4 (w0_t, w1_t, w2_t, w3_t, pw_salt_len); + + w3_t[2] = pw_salt_len * 8; + + /** + * md5 + */ + + u32x a = MD5M_A; + u32x b = MD5M_B; + u32x c = MD5M_C; + u32x d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0_t[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0_t[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0_t[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1_t[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1_t[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1_t[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2_t[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2_t[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2_t[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3_t[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3_t[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3_t[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0_t[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1_t[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2_t[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1_t[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1_t[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2_t[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3_t[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0_t[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2_t[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3_t[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0_t[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1_t[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3_t[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H , a, b, c, d, w1_t[1], MD5C20, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w2_t[0], MD5C21, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w2_t[3], MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w3_t[2], MD5C23, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w0_t[1], MD5C24, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w1_t[0], MD5C25, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w1_t[3], MD5C26, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w2_t[2], MD5C27, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w3_t[1], MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w0_t[0], MD5C29, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w0_t[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w1_t[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w2_t[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w3_t[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w3_t[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w0_t[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1_t[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3_t[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3_t[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0_t[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0_t[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2_t[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1_t[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3_t[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1_t[0], MD5C3c, MD5S30); + + bool q_cond = (search[0] != a); + + if (q_cond) continue; + + MD5_STEP (MD5_I , d, a, b, c, w2_t[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0_t[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2_t[1], MD5C3f, MD5S33); + + + const u32x r0 = a; + const u32x r1 = d; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_S + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m00030_s08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m00030_s16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/nv/m00030_a3.cu b/nv/m00030_a3.cu new file mode 100644 index 0000000000..6900bc060f --- /dev/null +++ b/nv/m00030_a3.cu @@ -0,0 +1,755 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _MD5_ +#define _SCALAR_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW2 +#define VECT_SIZE4 +#endif + +#define DGST_R0 0 +#define DGST_R1 3 +#define DGST_R2 2 +#define DGST_R3 1 + +#include "include/kernel_functions.c" +#include "types_nv.c" +#include "common_nv.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4_warp.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4_warp.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4_warp.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4_warp.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4_warp.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4_warp.c" +#endif + +#define MD5_STEP_REV(f,a,b,c,d,x,t,s) \ +{ \ + a -= b; \ + a = rotr32 (a, s); \ + a -= f (b, c, d); \ + a -= x; \ + a -= t; \ +} + +#define MD5_STEP_REV1(f,a,b,c,d,x,t,s) \ +{ \ + a -= b; \ + a = rotr32 (a, s); \ + a -= x; \ + a -= t; \ +} + +__device__ __constant__ u32x c_bfs[1024]; + +__device__ static void m00030m (u32 w[16], const u32 pw_len, const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const u32x * words_buf_r, void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset) +{ + /** + * modifier + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + const u32 lid = threadIdx.x; + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[ 1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[ 2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[ 3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[ 4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[ 5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[ 6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[ 7]; + + u32 salt_buf2[4]; + + salt_buf2[0] = salt_bufs[salt_pos].salt_buf[ 8]; + salt_buf2[1] = 0; + salt_buf2[2] = 0; + salt_buf2[3] = 0; + + u32 salt_buf3[4]; + + salt_buf3[0] = 0; + salt_buf3[1] = 0; + salt_buf3[2] = 0; + salt_buf3[3] = 0; + + switch_buffer_by_offset (salt_buf0, salt_buf1, salt_buf2, salt_buf3, pw_len); + + w[ 0] |= salt_buf0[0]; + w[ 1] |= salt_buf0[1]; + w[ 2] |= salt_buf0[2]; + w[ 3] |= salt_buf0[3]; + w[ 4] |= salt_buf1[0]; + w[ 5] |= salt_buf1[1]; + w[ 6] |= salt_buf1[2]; + w[ 7] |= salt_buf1[3]; + w[ 8] |= salt_buf2[0]; + w[ 9] |= salt_buf2[1]; + w[10] |= salt_buf2[2]; + w[11] |= salt_buf2[3]; + w[12] |= salt_buf3[0]; + w[13] |= salt_buf3[1]; + w[14] |= salt_buf3[2]; + w[15] |= salt_buf3[3]; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + const u32 pw_salt_len = pw_len + salt_len; + + w[14] = pw_salt_len * 8; + + /** + * base + */ + + const u32 F_w0c00 = 0 + MD5C00; + const u32 F_w1c01 = w[ 1] + MD5C01; + const u32 F_w2c02 = w[ 2] + MD5C02; + const u32 F_w3c03 = w[ 3] + MD5C03; + const u32 F_w4c04 = w[ 4] + MD5C04; + const u32 F_w5c05 = w[ 5] + MD5C05; + const u32 F_w6c06 = w[ 6] + MD5C06; + const u32 F_w7c07 = w[ 7] + MD5C07; + const u32 F_w8c08 = w[ 8] + MD5C08; + const u32 F_w9c09 = w[ 9] + MD5C09; + const u32 F_wac0a = w[10] + MD5C0a; + const u32 F_wbc0b = w[11] + MD5C0b; + const u32 F_wcc0c = w[12] + MD5C0c; + const u32 F_wdc0d = w[13] + MD5C0d; + const u32 F_wec0e = w[14] + MD5C0e; + const u32 F_wfc0f = w[15] + MD5C0f; + + const u32 G_w1c10 = w[ 1] + MD5C10; + const u32 G_w6c11 = w[ 6] + MD5C11; + const u32 G_wbc12 = w[11] + MD5C12; + const u32 G_w0c13 = 0 + MD5C13; + const u32 G_w5c14 = w[ 5] + MD5C14; + const u32 G_wac15 = w[10] + MD5C15; + const u32 G_wfc16 = w[15] + MD5C16; + const u32 G_w4c17 = w[ 4] + MD5C17; + const u32 G_w9c18 = w[ 9] + MD5C18; + const u32 G_wec19 = w[14] + MD5C19; + const u32 G_w3c1a = w[ 3] + MD5C1a; + const u32 G_w8c1b = w[ 8] + MD5C1b; + const u32 G_wdc1c = w[13] + MD5C1c; + const u32 G_w2c1d = w[ 2] + MD5C1d; + const u32 G_w7c1e = w[ 7] + MD5C1e; + const u32 G_wcc1f = w[12] + MD5C1f; + + const u32 H_w5c20 = w[ 5] + MD5C20; + const u32 H_w8c21 = w[ 8] + MD5C21; + const u32 H_wbc22 = w[11] + MD5C22; + const u32 H_wec23 = w[14] + MD5C23; + const u32 H_w1c24 = w[ 1] + MD5C24; + const u32 H_w4c25 = w[ 4] + MD5C25; + const u32 H_w7c26 = w[ 7] + MD5C26; + const u32 H_wac27 = w[10] + MD5C27; + const u32 H_wdc28 = w[13] + MD5C28; + const u32 H_w0c29 = 0 + MD5C29; + const u32 H_w3c2a = w[ 3] + MD5C2a; + const u32 H_w6c2b = w[ 6] + MD5C2b; + const u32 H_w9c2c = w[ 9] + MD5C2c; + const u32 H_wcc2d = w[12] + MD5C2d; + const u32 H_wfc2e = w[15] + MD5C2e; + const u32 H_w2c2f = w[ 2] + MD5C2f; + + const u32 I_w0c30 = 0 + MD5C30; + const u32 I_w7c31 = w[ 7] + MD5C31; + const u32 I_wec32 = w[14] + MD5C32; + const u32 I_w5c33 = w[ 5] + MD5C33; + const u32 I_wcc34 = w[12] + MD5C34; + const u32 I_w3c35 = w[ 3] + MD5C35; + const u32 I_wac36 = w[10] + MD5C36; + const u32 I_w1c37 = w[ 1] + MD5C37; + const u32 I_w8c38 = w[ 8] + MD5C38; + const u32 I_wfc39 = w[15] + MD5C39; + const u32 I_w6c3a = w[ 6] + MD5C3a; + const u32 I_wdc3b = w[13] + MD5C3b; + const u32 I_w4c3c = w[ 4] + MD5C3c; + const u32 I_wbc3d = w[11] + MD5C3d; + const u32 I_w2c3e = w[ 2] + MD5C3e; + const u32 I_w9c3f = w[ 9] + MD5C3f; + + /** + * loop + */ + + const u32 bf_loops = ceil ((float) bfs_cnt / VECT_DIV); + + u32x w0l = w[0]; + + for (u32 il_pos = 0; il_pos < bf_loops; il_pos++) + { + const u32x w0r = c_bfs[il_pos]; + + const u32x w0 = w0l | w0r; + + u32x a = MD5M_A; + u32x b = MD5M_B; + u32x c = MD5M_C; + u32x d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0, F_w0c00, MD5S00); + MD5_STEP0(MD5_Fo, d, a, b, c, F_w1c01, MD5S01); + MD5_STEP0(MD5_Fo, c, d, a, b, F_w2c02, MD5S02); + MD5_STEP0(MD5_Fo, b, c, d, a, F_w3c03, MD5S03); + MD5_STEP0(MD5_Fo, a, b, c, d, F_w4c04, MD5S00); + MD5_STEP0(MD5_Fo, d, a, b, c, F_w5c05, MD5S01); + MD5_STEP0(MD5_Fo, c, d, a, b, F_w6c06, MD5S02); + MD5_STEP0(MD5_Fo, b, c, d, a, F_w7c07, MD5S03); + MD5_STEP0(MD5_Fo, a, b, c, d, F_w8c08, MD5S00); + MD5_STEP0(MD5_Fo, d, a, b, c, F_w9c09, MD5S01); + MD5_STEP0(MD5_Fo, c, d, a, b, F_wac0a, MD5S02); + MD5_STEP0(MD5_Fo, b, c, d, a, F_wbc0b, MD5S03); + MD5_STEP0(MD5_Fo, a, b, c, d, F_wcc0c, MD5S00); + MD5_STEP0(MD5_Fo, d, a, b, c, F_wdc0d, MD5S01); + MD5_STEP0(MD5_Fo, c, d, a, b, F_wec0e, MD5S02); + MD5_STEP0(MD5_Fo, b, c, d, a, F_wfc0f, MD5S03); + + MD5_STEP0(MD5_Go, a, b, c, d, G_w1c10, MD5S10); + MD5_STEP0(MD5_Go, d, a, b, c, G_w6c11, MD5S11); + MD5_STEP0(MD5_Go, c, d, a, b, G_wbc12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0, G_w0c13, MD5S13); + MD5_STEP0(MD5_Go, a, b, c, d, G_w5c14, MD5S10); + MD5_STEP0(MD5_Go, d, a, b, c, G_wac15, MD5S11); + MD5_STEP0(MD5_Go, c, d, a, b, G_wfc16, MD5S12); + MD5_STEP0(MD5_Go, b, c, d, a, G_w4c17, MD5S13); + MD5_STEP0(MD5_Go, a, b, c, d, G_w9c18, MD5S10); + MD5_STEP0(MD5_Go, d, a, b, c, G_wec19, MD5S11); + MD5_STEP0(MD5_Go, c, d, a, b, G_w3c1a, MD5S12); + MD5_STEP0(MD5_Go, b, c, d, a, G_w8c1b, MD5S13); + MD5_STEP0(MD5_Go, a, b, c, d, G_wdc1c, MD5S10); + MD5_STEP0(MD5_Go, d, a, b, c, G_w2c1d, MD5S11); + MD5_STEP0(MD5_Go, c, d, a, b, G_w7c1e, MD5S12); + MD5_STEP0(MD5_Go, b, c, d, a, G_wcc1f, MD5S13); + + MD5_STEP0(MD5_H , a, b, c, d, H_w5c20, MD5S20); + MD5_STEP0(MD5_H , d, a, b, c, H_w8c21, MD5S21); + MD5_STEP0(MD5_H , c, d, a, b, H_wbc22, MD5S22); + MD5_STEP0(MD5_H , b, c, d, a, H_wec23, MD5S23); + MD5_STEP0(MD5_H , a, b, c, d, H_w1c24, MD5S20); + MD5_STEP0(MD5_H , d, a, b, c, H_w4c25, MD5S21); + MD5_STEP0(MD5_H , c, d, a, b, H_w7c26, MD5S22); + MD5_STEP0(MD5_H , b, c, d, a, H_wac27, MD5S23); + MD5_STEP0(MD5_H , a, b, c, d, H_wdc28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w0, H_w0c29, MD5S21); + MD5_STEP0(MD5_H , c, d, a, b, H_w3c2a, MD5S22); + MD5_STEP0(MD5_H , b, c, d, a, H_w6c2b, MD5S23); + MD5_STEP0(MD5_H , a, b, c, d, H_w9c2c, MD5S20); + MD5_STEP0(MD5_H , d, a, b, c, H_wcc2d, MD5S21); + MD5_STEP0(MD5_H , c, d, a, b, H_wfc2e, MD5S22); + MD5_STEP0(MD5_H , b, c, d, a, H_w2c2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0, I_w0c30, MD5S30); + MD5_STEP0(MD5_I , d, a, b, c, I_w7c31, MD5S31); + MD5_STEP0(MD5_I , c, d, a, b, I_wec32, MD5S32); + MD5_STEP0(MD5_I , b, c, d, a, I_w5c33, MD5S33); + MD5_STEP0(MD5_I , a, b, c, d, I_wcc34, MD5S30); + MD5_STEP0(MD5_I , d, a, b, c, I_w3c35, MD5S31); + MD5_STEP0(MD5_I , c, d, a, b, I_wac36, MD5S32); + MD5_STEP0(MD5_I , b, c, d, a, I_w1c37, MD5S33); + MD5_STEP0(MD5_I , a, b, c, d, I_w8c38, MD5S30); + MD5_STEP0(MD5_I , d, a, b, c, I_wfc39, MD5S31); + MD5_STEP0(MD5_I , c, d, a, b, I_w6c3a, MD5S32); + MD5_STEP0(MD5_I , b, c, d, a, I_wdc3b, MD5S33); + MD5_STEP0(MD5_I , a, b, c, d, I_w4c3c, MD5S30); + MD5_STEP0(MD5_I , d, a, b, c, I_wbc3d, MD5S31); + MD5_STEP0(MD5_I , c, d, a, b, I_w2c3e, MD5S32); + MD5_STEP0(MD5_I , b, c, d, a, I_w9c3f, MD5S33); + + + const u32x r0 = a; + const u32x r1 = d; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_M + } +} + +__device__ static void m00030s (u32 w[16], const u32 pw_len, const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const u32x * words_buf_r, void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset) +{ + /** + * modifier + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 F_w0c00 = 0 + MD5C00; + const u32 F_w1c01 = w[ 1] + MD5C01; + const u32 F_w2c02 = w[ 2] + MD5C02; + const u32 F_w3c03 = w[ 3] + MD5C03; + const u32 F_w4c04 = w[ 4] + MD5C04; + const u32 F_w5c05 = w[ 5] + MD5C05; + const u32 F_w6c06 = w[ 6] + MD5C06; + const u32 F_w7c07 = w[ 7] + MD5C07; + const u32 F_w8c08 = w[ 8] + MD5C08; + const u32 F_w9c09 = w[ 9] + MD5C09; + const u32 F_wac0a = w[10] + MD5C0a; + const u32 F_wbc0b = w[11] + MD5C0b; + const u32 F_wcc0c = w[12] + MD5C0c; + const u32 F_wdc0d = w[13] + MD5C0d; + const u32 F_wec0e = w[14] + MD5C0e; + const u32 F_wfc0f = w[15] + MD5C0f; + + const u32 G_w1c10 = w[ 1] + MD5C10; + const u32 G_w6c11 = w[ 6] + MD5C11; + const u32 G_wbc12 = w[11] + MD5C12; + const u32 G_w0c13 = 0 + MD5C13; + const u32 G_w5c14 = w[ 5] + MD5C14; + const u32 G_wac15 = w[10] + MD5C15; + const u32 G_wfc16 = w[15] + MD5C16; + const u32 G_w4c17 = w[ 4] + MD5C17; + const u32 G_w9c18 = w[ 9] + MD5C18; + const u32 G_wec19 = w[14] + MD5C19; + const u32 G_w3c1a = w[ 3] + MD5C1a; + const u32 G_w8c1b = w[ 8] + MD5C1b; + const u32 G_wdc1c = w[13] + MD5C1c; + const u32 G_w2c1d = w[ 2] + MD5C1d; + const u32 G_w7c1e = w[ 7] + MD5C1e; + const u32 G_wcc1f = w[12] + MD5C1f; + + const u32 H_w5c20 = w[ 5] + MD5C20; + const u32 H_w8c21 = w[ 8] + MD5C21; + const u32 H_wbc22 = w[11] + MD5C22; + const u32 H_wec23 = w[14] + MD5C23; + const u32 H_w1c24 = w[ 1] + MD5C24; + const u32 H_w4c25 = w[ 4] + MD5C25; + const u32 H_w7c26 = w[ 7] + MD5C26; + const u32 H_wac27 = w[10] + MD5C27; + const u32 H_wdc28 = w[13] + MD5C28; + const u32 H_w0c29 = 0 + MD5C29; + const u32 H_w3c2a = w[ 3] + MD5C2a; + const u32 H_w6c2b = w[ 6] + MD5C2b; + const u32 H_w9c2c = w[ 9] + MD5C2c; + const u32 H_wcc2d = w[12] + MD5C2d; + const u32 H_wfc2e = w[15] + MD5C2e; + const u32 H_w2c2f = w[ 2] + MD5C2f; + + const u32 I_w0c30 = 0 + MD5C30; + const u32 I_w7c31 = w[ 7] + MD5C31; + const u32 I_wec32 = w[14] + MD5C32; + const u32 I_w5c33 = w[ 5] + MD5C33; + const u32 I_wcc34 = w[12] + MD5C34; + const u32 I_w3c35 = w[ 3] + MD5C35; + const u32 I_wac36 = w[10] + MD5C36; + const u32 I_w1c37 = w[ 1] + MD5C37; + const u32 I_w8c38 = w[ 8] + MD5C38; + const u32 I_wfc39 = w[15] + MD5C39; + const u32 I_w6c3a = w[ 6] + MD5C3a; + const u32 I_wdc3b = w[13] + MD5C3b; + const u32 I_w4c3c = w[ 4] + MD5C3c; + const u32 I_wbc3d = w[11] + MD5C3d; + const u32 I_w2c3e = w[ 2] + MD5C3e; + const u32 I_w9c3f = w[ 9] + MD5C3f; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * reverse + */ + + u32 a_rev = digests_buf[digests_offset].digest_buf[0]; + u32 b_rev = digests_buf[digests_offset].digest_buf[1]; + u32 c_rev = digests_buf[digests_offset].digest_buf[2]; + u32 d_rev = digests_buf[digests_offset].digest_buf[3]; + + MD5_STEP_REV (MD5_I, b_rev, c_rev, d_rev, a_rev, w[ 9], MD5C3f, MD5S33); + MD5_STEP_REV (MD5_I, c_rev, d_rev, a_rev, b_rev, w[ 2], MD5C3e, MD5S32); + MD5_STEP_REV (MD5_I, d_rev, a_rev, b_rev, c_rev, w[11], MD5C3d, MD5S31); + MD5_STEP_REV (MD5_I, a_rev, b_rev, c_rev, d_rev, w[ 4], MD5C3c, MD5S30); + MD5_STEP_REV (MD5_I, b_rev, c_rev, d_rev, a_rev, w[13], MD5C3b, MD5S33); + MD5_STEP_REV (MD5_I, c_rev, d_rev, a_rev, b_rev, w[ 6], MD5C3a, MD5S32); + MD5_STEP_REV (MD5_I, d_rev, a_rev, b_rev, c_rev, w[15], MD5C39, MD5S31); + MD5_STEP_REV (MD5_I, a_rev, b_rev, c_rev, d_rev, w[ 8], MD5C38, MD5S30); + MD5_STEP_REV (MD5_I, b_rev, c_rev, d_rev, a_rev, w[ 1], MD5C37, MD5S33); + MD5_STEP_REV (MD5_I, c_rev, d_rev, a_rev, b_rev, w[10], MD5C36, MD5S32); + MD5_STEP_REV (MD5_I, d_rev, a_rev, b_rev, c_rev, w[ 3], MD5C35, MD5S31); + MD5_STEP_REV (MD5_I, a_rev, b_rev, c_rev, d_rev, w[12], MD5C34, MD5S30); + MD5_STEP_REV (MD5_I, b_rev, c_rev, d_rev, a_rev, w[ 5], MD5C33, MD5S33); + MD5_STEP_REV (MD5_I, c_rev, d_rev, a_rev, b_rev, w[14], MD5C32, MD5S32); + MD5_STEP_REV (MD5_I, d_rev, a_rev, b_rev, c_rev, w[ 7], MD5C31, MD5S31); + MD5_STEP_REV (MD5_I, a_rev, b_rev, c_rev, d_rev, 0, MD5C30, MD5S30); + + const u32x pre_cd = c_rev ^ d_rev; + + MD5_STEP_REV1(MD5_H, b_rev, c_rev, d_rev, a_rev, w[ 2], MD5C2f, MD5S23); + MD5_STEP_REV1(MD5_H, c_rev, d_rev, a_rev, b_rev, w[15], MD5C2e, MD5S22); + + /** + * loop + */ + + const u32 bf_loops = ceil ((float) bfs_cnt / VECT_DIV); + + u32x w0l = w[0]; + + for (u32 il_pos = 0; il_pos < bf_loops; il_pos++) + { + const u32x w0r = c_bfs[il_pos]; + + const u32x w0 = w0l | w0r; + + const u32x pre_d = d_rev; + const u32x pre_a = a_rev - w0; + const u32x pre_b = b_rev - (pre_a ^ pre_cd); + const u32x pre_c = c_rev - (pre_a ^ pre_b ^ pre_d); + + u32x a = MD5M_A; + u32x b = MD5M_B; + u32x c = MD5M_C; + u32x d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0, F_w0c00, MD5S00); + MD5_STEP0(MD5_Fo, d, a, b, c, F_w1c01, MD5S01); + MD5_STEP0(MD5_Fo, c, d, a, b, F_w2c02, MD5S02); + MD5_STEP0(MD5_Fo, b, c, d, a, F_w3c03, MD5S03); + MD5_STEP0(MD5_Fo, a, b, c, d, F_w4c04, MD5S00); + MD5_STEP0(MD5_Fo, d, a, b, c, F_w5c05, MD5S01); + MD5_STEP0(MD5_Fo, c, d, a, b, F_w6c06, MD5S02); + MD5_STEP0(MD5_Fo, b, c, d, a, F_w7c07, MD5S03); + MD5_STEP0(MD5_Fo, a, b, c, d, F_w8c08, MD5S00); + MD5_STEP0(MD5_Fo, d, a, b, c, F_w9c09, MD5S01); + MD5_STEP0(MD5_Fo, c, d, a, b, F_wac0a, MD5S02); + MD5_STEP0(MD5_Fo, b, c, d, a, F_wbc0b, MD5S03); + MD5_STEP0(MD5_Fo, a, b, c, d, F_wcc0c, MD5S00); + MD5_STEP0(MD5_Fo, d, a, b, c, F_wdc0d, MD5S01); + MD5_STEP0(MD5_Fo, c, d, a, b, F_wec0e, MD5S02); + MD5_STEP0(MD5_Fo, b, c, d, a, F_wfc0f, MD5S03); + + MD5_STEP0(MD5_Go, a, b, c, d, G_w1c10, MD5S10); + MD5_STEP0(MD5_Go, d, a, b, c, G_w6c11, MD5S11); + MD5_STEP0(MD5_Go, c, d, a, b, G_wbc12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0, G_w0c13, MD5S13); + MD5_STEP0(MD5_Go, a, b, c, d, G_w5c14, MD5S10); + MD5_STEP0(MD5_Go, d, a, b, c, G_wac15, MD5S11); + MD5_STEP0(MD5_Go, c, d, a, b, G_wfc16, MD5S12); + MD5_STEP0(MD5_Go, b, c, d, a, G_w4c17, MD5S13); + MD5_STEP0(MD5_Go, a, b, c, d, G_w9c18, MD5S10); + MD5_STEP0(MD5_Go, d, a, b, c, G_wec19, MD5S11); + MD5_STEP0(MD5_Go, c, d, a, b, G_w3c1a, MD5S12); + MD5_STEP0(MD5_Go, b, c, d, a, G_w8c1b, MD5S13); + MD5_STEP0(MD5_Go, a, b, c, d, G_wdc1c, MD5S10); + MD5_STEP0(MD5_Go, d, a, b, c, G_w2c1d, MD5S11); + MD5_STEP0(MD5_Go, c, d, a, b, G_w7c1e, MD5S12); + MD5_STEP0(MD5_Go, b, c, d, a, G_wcc1f, MD5S13); + + MD5_STEP0(MD5_H , a, b, c, d, H_w5c20, MD5S20); + MD5_STEP0(MD5_H , d, a, b, c, H_w8c21, MD5S21); + MD5_STEP0(MD5_H , c, d, a, b, H_wbc22, MD5S22); + MD5_STEP0(MD5_H , b, c, d, a, H_wec23, MD5S23); + MD5_STEP0(MD5_H , a, b, c, d, H_w1c24, MD5S20); + MD5_STEP0(MD5_H , d, a, b, c, H_w4c25, MD5S21); + MD5_STEP0(MD5_H , c, d, a, b, H_w7c26, MD5S22); + MD5_STEP0(MD5_H , b, c, d, a, H_wac27, MD5S23); + MD5_STEP0(MD5_H , a, b, c, d, H_wdc28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w0, H_w0c29, MD5S21); + MD5_STEP0(MD5_H , c, d, a, b, H_w3c2a, MD5S22); + + bool q_cond = (pre_c != c); + + if (q_cond) continue; + + MD5_STEP0(MD5_H , b, c, d, a, H_w6c2b, MD5S23); + MD5_STEP0(MD5_H , a, b, c, d, H_w9c2c, MD5S20); + MD5_STEP0(MD5_H , d, a, b, c, H_wcc2d, MD5S21); + MD5_STEP0(MD5_H , c, d, a, b, H_wfc2e, MD5S22); + MD5_STEP0(MD5_H , b, c, d, a, H_w2c2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0, I_w0c30, MD5S30); + MD5_STEP0(MD5_I , d, a, b, c, I_w7c31, MD5S31); + MD5_STEP0(MD5_I , c, d, a, b, I_wec32, MD5S32); + MD5_STEP0(MD5_I , b, c, d, a, I_w5c33, MD5S33); + MD5_STEP0(MD5_I , a, b, c, d, I_wcc34, MD5S30); + MD5_STEP0(MD5_I , d, a, b, c, I_w3c35, MD5S31); + MD5_STEP0(MD5_I , c, d, a, b, I_wac36, MD5S32); + MD5_STEP0(MD5_I , b, c, d, a, I_w1c37, MD5S33); + MD5_STEP0(MD5_I , a, b, c, d, I_w8c38, MD5S30); + MD5_STEP0(MD5_I , d, a, b, c, I_wfc39, MD5S31); + MD5_STEP0(MD5_I , c, d, a, b, I_w6c3a, MD5S32); + MD5_STEP0(MD5_I , b, c, d, a, I_wdc3b, MD5S33); + MD5_STEP0(MD5_I , a, b, c, d, I_w4c3c, MD5S30); + MD5_STEP0(MD5_I , d, a, b, c, I_wbc3d, MD5S31); + MD5_STEP0(MD5_I , c, d, a, b, I_w2c3e, MD5S32); + MD5_STEP0(MD5_I , b, c, d, a, I_w9c3f, MD5S33); + + + const u32x r0 = a; + const u32x r1 = d; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_S + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m00030_m04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const u32x * words_buf_r, void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32 w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = 0; + w[ 5] = 0; + w[ 6] = 0; + w[ 7] = 0; + w[ 8] = 0; + w[ 9] = 0; + w[10] = 0; + w[11] = 0; + w[12] = 0; + w[13] = 0; + w[14] = pws[gid].i[14]; + w[15] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m00030m (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m00030_m08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const u32x * words_buf_r, void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32 w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = pws[gid].i[ 4]; + w[ 5] = pws[gid].i[ 5]; + w[ 6] = pws[gid].i[ 6]; + w[ 7] = pws[gid].i[ 7]; + w[ 8] = 0; + w[ 9] = 0; + w[10] = 0; + w[11] = 0; + w[12] = 0; + w[13] = 0; + w[14] = pws[gid].i[14]; + w[15] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m00030m (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m00030_m16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const u32x * words_buf_r, void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32 w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = pws[gid].i[ 4]; + w[ 5] = pws[gid].i[ 5]; + w[ 6] = pws[gid].i[ 6]; + w[ 7] = pws[gid].i[ 7]; + w[ 8] = pws[gid].i[ 8]; + w[ 9] = pws[gid].i[ 9]; + w[10] = pws[gid].i[10]; + w[11] = pws[gid].i[11]; + w[12] = pws[gid].i[12]; + w[13] = pws[gid].i[13]; + w[14] = pws[gid].i[14]; + w[15] = pws[gid].i[15]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m00030m (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m00030_s04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const u32x * words_buf_r, void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32 w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = 0; + w[ 5] = 0; + w[ 6] = 0; + w[ 7] = 0; + w[ 8] = 0; + w[ 9] = 0; + w[10] = 0; + w[11] = 0; + w[12] = 0; + w[13] = 0; + w[14] = pws[gid].i[14]; + w[15] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m00030s (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m00030_s08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const u32x * words_buf_r, void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32 w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = pws[gid].i[ 4]; + w[ 5] = pws[gid].i[ 5]; + w[ 6] = pws[gid].i[ 6]; + w[ 7] = pws[gid].i[ 7]; + w[ 8] = 0; + w[ 9] = 0; + w[10] = 0; + w[11] = 0; + w[12] = 0; + w[13] = 0; + w[14] = pws[gid].i[14]; + w[15] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m00030s (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m00030_s16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const u32x * words_buf_r, void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32 w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = pws[gid].i[ 4]; + w[ 5] = pws[gid].i[ 5]; + w[ 6] = pws[gid].i[ 6]; + w[ 7] = pws[gid].i[ 7]; + w[ 8] = pws[gid].i[ 8]; + w[ 9] = pws[gid].i[ 9]; + w[10] = pws[gid].i[10]; + w[11] = pws[gid].i[11]; + w[12] = pws[gid].i[12]; + w[13] = pws[gid].i[13]; + w[14] = pws[gid].i[14]; + w[15] = pws[gid].i[15]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m00030s (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} diff --git a/nv/m00040_a0.cu b/nv/m00040_a0.cu new file mode 100644 index 0000000000..e657a3c11e --- /dev/null +++ b/nv/m00040_a0.cu @@ -0,0 +1,486 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _MD5_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW2 +#define VECT_SIZE1 +#endif + +#define DGST_R0 0 +#define DGST_R1 3 +#define DGST_R2 2 +#define DGST_R3 1 + +#include "include/kernel_functions.c" +#include "types_nv.c" +#include "common_nv.c" +#include "include/rp_gpu.h" +#include "rp_nv.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +__device__ __constant__ gpu_rule_t c_rules[1024]; + +extern "C" __global__ void __launch_bounds__ (256, 1) m00040_m04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + u32x pw_buf1[4]; + + pw_buf1[0] = pws[gid].i[ 4]; + pw_buf1[1] = pws[gid].i[ 5]; + pw_buf1[2] = pws[gid].i[ 6]; + pw_buf1[3] = pws[gid].i[ 7]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[7]; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + + w0[0] = pw_buf0[0]; + w0[1] = pw_buf0[1]; + w0[2] = pw_buf0[2]; + w0[3] = pw_buf0[3]; + + u32x w1[4]; + + w1[0] = pw_buf1[0]; + w1[1] = pw_buf1[1]; + w1[2] = pw_buf1[2]; + w1[3] = pw_buf1[3]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 out_len = apply_rules (c_rules[il_pos].cmds, w0, w1, pw_len); + + /** + * prepend salt + */ + + const u32 out_salt_len = (out_len * 2) + salt_len; + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + make_unicode (w0, w0_t, w1_t); + make_unicode (w1, w2_t, w3_t); + + switch_buffer_by_offset (w0_t, w1_t, w2_t, w3_t, salt_len); + + w0_t[0] |= salt_buf0[0]; + w0_t[1] |= salt_buf0[1]; + w0_t[2] |= salt_buf0[2]; + w0_t[3] |= salt_buf0[3]; + w1_t[0] |= salt_buf1[0]; + w1_t[1] |= salt_buf1[1]; + w1_t[2] |= salt_buf1[2]; + w1_t[3] |= salt_buf1[3]; + + append_0x80_4 (w0_t, w1_t, w2_t, w3_t, out_salt_len); + + w3_t[2] = out_salt_len * 8; + + /** + * md5 + */ + + u32x a = MD5M_A; + u32x b = MD5M_B; + u32x c = MD5M_C; + u32x d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0_t[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0_t[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0_t[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1_t[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1_t[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1_t[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2_t[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2_t[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2_t[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3_t[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3_t[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3_t[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0_t[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1_t[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2_t[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1_t[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1_t[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2_t[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3_t[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0_t[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2_t[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3_t[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0_t[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1_t[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3_t[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H , a, b, c, d, w1_t[1], MD5C20, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w2_t[0], MD5C21, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w2_t[3], MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w3_t[2], MD5C23, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w0_t[1], MD5C24, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w1_t[0], MD5C25, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w1_t[3], MD5C26, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w2_t[2], MD5C27, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w3_t[1], MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w0_t[0], MD5C29, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w0_t[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w1_t[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w2_t[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w3_t[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w3_t[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w0_t[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1_t[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3_t[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3_t[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0_t[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0_t[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2_t[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1_t[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3_t[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1_t[0], MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w2_t[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0_t[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2_t[1], MD5C3f, MD5S33); + + + const u32x r0 = a; + const u32x r1 = d; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_M + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m00040_m08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m00040_m16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m00040_s04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + u32x pw_buf1[4]; + + pw_buf1[0] = pws[gid].i[ 4]; + pw_buf1[1] = pws[gid].i[ 5]; + pw_buf1[2] = pws[gid].i[ 6]; + pw_buf1[3] = pws[gid].i[ 7]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[7]; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + + w0[0] = pw_buf0[0]; + w0[1] = pw_buf0[1]; + w0[2] = pw_buf0[2]; + w0[3] = pw_buf0[3]; + + u32x w1[4]; + + w1[0] = pw_buf1[0]; + w1[1] = pw_buf1[1]; + w1[2] = pw_buf1[2]; + w1[3] = pw_buf1[3]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 out_len = apply_rules (c_rules[il_pos].cmds, w0, w1, pw_len); + + /** + * prepend salt + */ + + const u32 out_salt_len = (out_len * 2) + salt_len; + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + make_unicode (w0, w0_t, w1_t); + make_unicode (w1, w2_t, w3_t); + + switch_buffer_by_offset (w0_t, w1_t, w2_t, w3_t, salt_len); + + w0_t[0] |= salt_buf0[0]; + w0_t[1] |= salt_buf0[1]; + w0_t[2] |= salt_buf0[2]; + w0_t[3] |= salt_buf0[3]; + w1_t[0] |= salt_buf1[0]; + w1_t[1] |= salt_buf1[1]; + w1_t[2] |= salt_buf1[2]; + w1_t[3] |= salt_buf1[3]; + + append_0x80_4 (w0_t, w1_t, w2_t, w3_t, out_salt_len); + + w3_t[2] = out_salt_len * 8; + + /** + * md5 + */ + + u32x a = MD5M_A; + u32x b = MD5M_B; + u32x c = MD5M_C; + u32x d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0_t[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0_t[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0_t[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1_t[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1_t[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1_t[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2_t[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2_t[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2_t[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3_t[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3_t[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3_t[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0_t[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1_t[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2_t[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1_t[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1_t[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2_t[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3_t[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0_t[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2_t[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3_t[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0_t[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1_t[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3_t[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H , a, b, c, d, w1_t[1], MD5C20, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w2_t[0], MD5C21, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w2_t[3], MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w3_t[2], MD5C23, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w0_t[1], MD5C24, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w1_t[0], MD5C25, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w1_t[3], MD5C26, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w2_t[2], MD5C27, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w3_t[1], MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w0_t[0], MD5C29, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w0_t[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w1_t[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w2_t[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w3_t[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w3_t[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w0_t[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1_t[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3_t[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3_t[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0_t[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0_t[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2_t[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1_t[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3_t[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1_t[0], MD5C3c, MD5S30); + + bool q_cond = (search[0] != a); + + if (q_cond) continue; + + MD5_STEP (MD5_I , d, a, b, c, w2_t[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0_t[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2_t[1], MD5C3f, MD5S33); + + + const u32x r0 = a; + const u32x r1 = d; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_S + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m00040_s08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m00040_s16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/nv/m00040_a1.cu b/nv/m00040_a1.cu new file mode 100644 index 0000000000..2492f095e5 --- /dev/null +++ b/nv/m00040_a1.cu @@ -0,0 +1,580 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _MD5_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW2 +#define VECT_SIZE4 +#endif + +#define DGST_R0 0 +#define DGST_R1 3 +#define DGST_R2 2 +#define DGST_R3 1 + +#include "include/kernel_functions.c" +#include "types_nv.c" +#include "common_nv.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +__device__ __constant__ comb_t c_combs[1024]; + +extern "C" __global__ void __launch_bounds__ (256, 1) m00040_m04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, c_combs[0].pw_len); + } + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[7]; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = c_combs[il_pos].pw_len; + + const u32 pw_len = pw_l_len + pw_r_len; + + u32 wordr0[4]; + + wordr0[0] = c_combs[il_pos].i[0]; + wordr0[1] = c_combs[il_pos].i[1]; + wordr0[2] = c_combs[il_pos].i[2]; + wordr0[3] = c_combs[il_pos].i[3]; + + u32 wordr1[4]; + + wordr1[0] = c_combs[il_pos].i[4]; + wordr1[1] = c_combs[il_pos].i[5]; + wordr1[2] = c_combs[il_pos].i[6]; + wordr1[3] = c_combs[il_pos].i[7]; + + u32 wordr2[4]; + + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + + u32 wordr3[4]; + + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + /** + * prepend salt + */ + + const u32 pw_salt_len = (pw_len * 2) + salt_len; + + u32x w0[4]; + u32x w1[4]; + u32x w2[4]; + u32x w3[4]; + + w0[0] = wordl0[0] | wordr0[0]; + w0[1] = wordl0[1] | wordr0[1]; + w0[2] = wordl0[2] | wordr0[2]; + w0[3] = wordl0[3] | wordr0[3]; + w1[0] = wordl1[0] | wordr1[0]; + w1[1] = wordl1[1] | wordr1[1]; + w1[2] = wordl1[2] | wordr1[2]; + w1[3] = wordl1[3] | wordr1[3]; + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + make_unicode (w0, w0_t, w1_t); + make_unicode (w1, w2_t, w3_t); + + switch_buffer_by_offset (w0_t, w1_t, w2_t, w3_t, salt_len); + + w0_t[0] |= salt_buf0[0]; + w0_t[1] |= salt_buf0[1]; + w0_t[2] |= salt_buf0[2]; + w0_t[3] |= salt_buf0[3]; + w1_t[0] |= salt_buf1[0]; + w1_t[1] |= salt_buf1[1]; + w1_t[2] |= salt_buf1[2]; + w1_t[3] |= salt_buf1[3]; + + append_0x80_4 (w0_t, w1_t, w2_t, w3_t, pw_salt_len); + + w3_t[2] = pw_salt_len * 8; + + /** + * md5 + */ + + u32x a = MD5M_A; + u32x b = MD5M_B; + u32x c = MD5M_C; + u32x d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0_t[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0_t[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0_t[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1_t[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1_t[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1_t[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2_t[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2_t[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2_t[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3_t[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3_t[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3_t[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0_t[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1_t[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2_t[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1_t[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1_t[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2_t[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3_t[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0_t[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2_t[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3_t[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0_t[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1_t[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3_t[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H , a, b, c, d, w1_t[1], MD5C20, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w2_t[0], MD5C21, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w2_t[3], MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w3_t[2], MD5C23, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w0_t[1], MD5C24, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w1_t[0], MD5C25, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w1_t[3], MD5C26, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w2_t[2], MD5C27, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w3_t[1], MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w0_t[0], MD5C29, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w0_t[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w1_t[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w2_t[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w3_t[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w3_t[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w0_t[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1_t[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3_t[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3_t[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0_t[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0_t[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2_t[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1_t[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3_t[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1_t[0], MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w2_t[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0_t[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2_t[1], MD5C3f, MD5S33); + + + const u32x r0 = a; + const u32x r1 = d; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_M + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m00040_m08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m00040_m16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m00040_s04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, c_combs[0].pw_len); + } + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[7]; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = c_combs[il_pos].pw_len; + + const u32 pw_len = pw_l_len + pw_r_len; + + u32 wordr0[4]; + + wordr0[0] = c_combs[il_pos].i[0]; + wordr0[1] = c_combs[il_pos].i[1]; + wordr0[2] = c_combs[il_pos].i[2]; + wordr0[3] = c_combs[il_pos].i[3]; + + u32 wordr1[4]; + + wordr1[0] = c_combs[il_pos].i[4]; + wordr1[1] = c_combs[il_pos].i[5]; + wordr1[2] = c_combs[il_pos].i[6]; + wordr1[3] = c_combs[il_pos].i[7]; + + u32 wordr2[4]; + + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + + u32 wordr3[4]; + + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + /** + * prepend salt + */ + + const u32 pw_salt_len = (pw_len * 2) + salt_len; + + u32x w0[4]; + u32x w1[4]; + u32x w2[4]; + u32x w3[4]; + + w0[0] = wordl0[0] | wordr0[0]; + w0[1] = wordl0[1] | wordr0[1]; + w0[2] = wordl0[2] | wordr0[2]; + w0[3] = wordl0[3] | wordr0[3]; + w1[0] = wordl1[0] | wordr1[0]; + w1[1] = wordl1[1] | wordr1[1]; + w1[2] = wordl1[2] | wordr1[2]; + w1[3] = wordl1[3] | wordr1[3]; + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + make_unicode (w0, w0_t, w1_t); + make_unicode (w1, w2_t, w3_t); + + switch_buffer_by_offset (w0_t, w1_t, w2_t, w3_t, salt_len); + + w0_t[0] |= salt_buf0[0]; + w0_t[1] |= salt_buf0[1]; + w0_t[2] |= salt_buf0[2]; + w0_t[3] |= salt_buf0[3]; + w1_t[0] |= salt_buf1[0]; + w1_t[1] |= salt_buf1[1]; + w1_t[2] |= salt_buf1[2]; + w1_t[3] |= salt_buf1[3]; + + append_0x80_4 (w0_t, w1_t, w2_t, w3_t, pw_salt_len); + + w3_t[2] = pw_salt_len * 8; + + /** + * md5 + */ + + u32x a = MD5M_A; + u32x b = MD5M_B; + u32x c = MD5M_C; + u32x d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0_t[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0_t[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0_t[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1_t[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1_t[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1_t[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2_t[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2_t[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2_t[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3_t[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3_t[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3_t[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0_t[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1_t[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2_t[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1_t[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1_t[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2_t[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3_t[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0_t[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2_t[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3_t[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0_t[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1_t[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3_t[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H , a, b, c, d, w1_t[1], MD5C20, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w2_t[0], MD5C21, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w2_t[3], MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w3_t[2], MD5C23, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w0_t[1], MD5C24, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w1_t[0], MD5C25, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w1_t[3], MD5C26, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w2_t[2], MD5C27, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w3_t[1], MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w0_t[0], MD5C29, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w0_t[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w1_t[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w2_t[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w3_t[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w3_t[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w0_t[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1_t[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3_t[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3_t[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0_t[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0_t[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2_t[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1_t[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3_t[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1_t[0], MD5C3c, MD5S30); + + bool q_cond = (search[0] != a); + + if (q_cond) continue; + + MD5_STEP (MD5_I , d, a, b, c, w2_t[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0_t[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2_t[1], MD5C3f, MD5S33); + + + const u32x r0 = a; + const u32x r1 = d; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_S + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m00040_s08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m00040_s16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/nv/m00040_a3.cu b/nv/m00040_a3.cu new file mode 100644 index 0000000000..46b2856157 --- /dev/null +++ b/nv/m00040_a3.cu @@ -0,0 +1,724 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _MD5_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW2 +#define VECT_SIZE4 +#endif + +#define DGST_R0 0 +#define DGST_R1 3 +#define DGST_R2 2 +#define DGST_R3 1 + +#include "include/kernel_functions.c" +#include "types_nv.c" +#include "common_nv.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +__device__ __constant__ bf_t c_bfs[1024]; + +__device__ static void m00040m (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], const u32 pw_len, const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset) +{ + /** + * modifier + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + const u32 lid = threadIdx.x; + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[ 1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[ 2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[ 3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[ 4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[ 5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[ 6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[ 7]; + + u32 salt_buf2[4]; + + salt_buf2[0] = 0; + salt_buf2[1] = 0; + salt_buf2[2] = 0; + salt_buf2[3] = 0; + + u32 salt_buf3[4]; + + salt_buf3[0] = 0; + salt_buf3[1] = 0; + salt_buf3[2] = 0; + salt_buf3[3] = 0; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + const u32 pw_salt_len = pw_len + salt_len; + + /** + * loop + */ + + u32x w0l = w0[0]; + + for (u32 il_pos = 0; il_pos < bfs_cnt; il_pos++) + { + const u32 w0r = c_bfs[il_pos].i; + + w0[0] = w0l | w0r; + + /** + * prepend salt + */ + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + w0_t[0] = w0[0]; + w0_t[1] = w0[1]; + w0_t[2] = w0[2]; + w0_t[3] = w0[3]; + w1_t[0] = w1[0]; + w1_t[1] = w1[1]; + w1_t[2] = w1[2]; + w1_t[3] = w1[3]; + w2_t[0] = w2[0]; + w2_t[1] = w2[1]; + w2_t[2] = w2[2]; + w2_t[3] = w2[3]; + w3_t[0] = w3[0]; + w3_t[1] = w3[1]; + w3_t[2] = w3[2]; + w3_t[3] = w3[3]; + + switch_buffer_by_offset (w0_t, w1_t, w2_t, w3_t, salt_len); + + w3_t[2] = pw_salt_len * 8; + + w0_t[0] |= salt_buf0[0]; + w0_t[1] |= salt_buf0[1]; + w0_t[2] |= salt_buf0[2]; + w0_t[3] |= salt_buf0[3]; + w1_t[0] |= salt_buf1[0]; + w1_t[1] |= salt_buf1[1]; + w1_t[2] |= salt_buf1[2]; + w1_t[3] |= salt_buf1[3]; + w2_t[0] |= salt_buf2[0]; + w2_t[1] |= salt_buf2[1]; + w2_t[2] |= salt_buf2[2]; + w2_t[3] |= salt_buf2[3]; + w3_t[0] |= salt_buf3[0]; + w3_t[1] |= salt_buf3[1]; + w3_t[2] |= salt_buf3[2]; + w3_t[3] |= salt_buf3[3]; + + /** + * md5 + */ + + u32x a = MD5M_A; + u32x b = MD5M_B; + u32x c = MD5M_C; + u32x d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0_t[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0_t[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0_t[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1_t[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1_t[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1_t[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2_t[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2_t[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2_t[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3_t[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3_t[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3_t[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0_t[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1_t[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2_t[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1_t[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1_t[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2_t[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3_t[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0_t[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2_t[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3_t[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0_t[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1_t[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3_t[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H , a, b, c, d, w1_t[1], MD5C20, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w2_t[0], MD5C21, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w2_t[3], MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w3_t[2], MD5C23, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w0_t[1], MD5C24, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w1_t[0], MD5C25, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w1_t[3], MD5C26, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w2_t[2], MD5C27, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w3_t[1], MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w0_t[0], MD5C29, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w0_t[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w1_t[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w2_t[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w3_t[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w3_t[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w0_t[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1_t[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3_t[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3_t[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0_t[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0_t[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2_t[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1_t[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3_t[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1_t[0], MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w2_t[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0_t[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2_t[1], MD5C3f, MD5S33); + + + const u32x r0 = a; + const u32x r1 = d; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_M + } +} + +__device__ static void m00040s (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], const u32 pw_len, const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset) +{ + /** + * modifier + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + const u32 lid = threadIdx.x; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[ 1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[ 2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[ 3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[ 4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[ 5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[ 6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[ 7]; + + u32 salt_buf2[4]; + + salt_buf2[0] = 0; + salt_buf2[1] = 0; + salt_buf2[2] = 0; + salt_buf2[3] = 0; + + u32 salt_buf3[4]; + + salt_buf3[0] = 0; + salt_buf3[1] = 0; + salt_buf3[2] = 0; + salt_buf3[3] = 0; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + const u32 pw_salt_len = pw_len + salt_len; + + /** + * loop + */ + + u32x w0l = w0[0]; + + for (u32 il_pos = 0; il_pos < bfs_cnt; il_pos++) + { + const u32 w0r = c_bfs[il_pos].i; + + w0[0] = w0l | w0r; + + /** + * prepend salt + */ + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + w0_t[0] = w0[0]; + w0_t[1] = w0[1]; + w0_t[2] = w0[2]; + w0_t[3] = w0[3]; + w1_t[0] = w1[0]; + w1_t[1] = w1[1]; + w1_t[2] = w1[2]; + w1_t[3] = w1[3]; + w2_t[0] = w2[0]; + w2_t[1] = w2[1]; + w2_t[2] = w2[2]; + w2_t[3] = w2[3]; + w3_t[0] = w3[0]; + w3_t[1] = w3[1]; + w3_t[2] = w3[2]; + w3_t[3] = w3[3]; + + switch_buffer_by_offset (w0_t, w1_t, w2_t, w3_t, salt_len); + + w3_t[2] = pw_salt_len * 8; + + w0_t[0] |= salt_buf0[0]; + w0_t[1] |= salt_buf0[1]; + w0_t[2] |= salt_buf0[2]; + w0_t[3] |= salt_buf0[3]; + w1_t[0] |= salt_buf1[0]; + w1_t[1] |= salt_buf1[1]; + w1_t[2] |= salt_buf1[2]; + w1_t[3] |= salt_buf1[3]; + w2_t[0] |= salt_buf2[0]; + w2_t[1] |= salt_buf2[1]; + w2_t[2] |= salt_buf2[2]; + w2_t[3] |= salt_buf2[3]; + w3_t[0] |= salt_buf3[0]; + w3_t[1] |= salt_buf3[1]; + w3_t[2] |= salt_buf3[2]; + w3_t[3] |= salt_buf3[3]; + + /** + * md5 + */ + + u32x a = MD5M_A; + u32x b = MD5M_B; + u32x c = MD5M_C; + u32x d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0_t[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0_t[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0_t[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1_t[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1_t[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1_t[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2_t[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2_t[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2_t[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3_t[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3_t[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3_t[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0_t[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1_t[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2_t[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1_t[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1_t[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2_t[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3_t[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0_t[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2_t[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3_t[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0_t[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1_t[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3_t[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H , a, b, c, d, w1_t[1], MD5C20, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w2_t[0], MD5C21, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w2_t[3], MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w3_t[2], MD5C23, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w0_t[1], MD5C24, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w1_t[0], MD5C25, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w1_t[3], MD5C26, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w2_t[2], MD5C27, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w3_t[1], MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w0_t[0], MD5C29, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w0_t[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w1_t[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w2_t[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w3_t[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w3_t[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w0_t[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1_t[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3_t[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3_t[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0_t[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0_t[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2_t[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1_t[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3_t[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1_t[0], MD5C3c, MD5S30); + + bool q_cond = (search[0] != a); + + if (q_cond) continue; + + MD5_STEP (MD5_I , d, a, b, c, w2_t[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0_t[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2_t[1], MD5C3f, MD5S33); + + + const u32x r0 = a; + const u32x r1 = d; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_S + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m00040_m04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m00040m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m00040_m08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m00040m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m00040_m16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = pws[gid].i[ 8]; + w2[1] = pws[gid].i[ 9]; + w2[2] = pws[gid].i[10]; + w2[3] = pws[gid].i[11]; + + u32x w3[4]; + + w3[0] = pws[gid].i[12]; + w3[1] = pws[gid].i[13]; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m00040m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m00040_s04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m00040s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m00040_s08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m00040s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m00040_s16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = pws[gid].i[ 8]; + w2[1] = pws[gid].i[ 9]; + w2[2] = pws[gid].i[10]; + w2[3] = pws[gid].i[11]; + + u32x w3[4]; + + w3[0] = pws[gid].i[12]; + w3[1] = pws[gid].i[13]; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m00040s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} diff --git a/nv/m00050_a0.cu b/nv/m00050_a0.cu new file mode 100644 index 0000000000..507a26da05 --- /dev/null +++ b/nv/m00050_a0.cu @@ -0,0 +1,596 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _MD5_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW2 +#define VECT_SIZE1 +#endif + +#define DGST_R0 0 +#define DGST_R1 3 +#define DGST_R2 2 +#define DGST_R3 1 + +#include "include/kernel_functions.c" +#include "types_nv.c" +#include "common_nv.c" +#include "include/rp_gpu.h" +#include "rp_nv.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +__device__ static void md5_transform (const u32x w0[4], const u32x w1[4], const u32x w2[4], const u32x w3[4], u32x digest[4]) +{ + u32x a = digest[0]; + u32x b = digest[1]; + u32x c = digest[2]; + u32x d = digest[3]; + + u32x w0_t = w0[0]; + u32x w1_t = w0[1]; + u32x w2_t = w0[2]; + u32x w3_t = w0[3]; + u32x w4_t = w1[0]; + u32x w5_t = w1[1]; + u32x w6_t = w1[2]; + u32x w7_t = w1[3]; + u32x w8_t = w2[0]; + u32x w9_t = w2[1]; + u32x wa_t = w2[2]; + u32x wb_t = w2[3]; + u32x wc_t = w3[0]; + u32x wd_t = w3[1]; + u32x we_t = w3[2]; + u32x wf_t = w3[3]; + + u32x tmp2; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t, MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t, MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t, MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t, MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w4_t, MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w5_t, MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w6_t, MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w7_t, MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w8_t, MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w9_t, MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, wa_t, MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, wb_t, MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, wc_t, MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, wd_t, MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, we_t, MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, wf_t, MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w1_t, MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w6_t, MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, wb_t, MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t, MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w5_t, MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, wa_t, MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, wf_t, MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w4_t, MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w9_t, MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, we_t, MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t, MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w8_t, MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, wd_t, MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t, MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w7_t, MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, wc_t, MD5C1f, MD5S13); + + MD5_STEP (MD5_H1, a, b, c, d, w5_t, MD5C20, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w8_t, MD5C21, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, wb_t, MD5C22, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, we_t, MD5C23, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w1_t, MD5C24, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w4_t, MD5C25, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w7_t, MD5C26, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, wa_t, MD5C27, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, wd_t, MD5C28, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w0_t, MD5C29, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w3_t, MD5C2a, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w6_t, MD5C2b, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w9_t, MD5C2c, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, wc_t, MD5C2d, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, wf_t, MD5C2e, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w2_t, MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t, MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w7_t, MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, we_t, MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w5_t, MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, wc_t, MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t, MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, wa_t, MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t, MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w8_t, MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, wf_t, MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w6_t, MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, wd_t, MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w4_t, MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, wb_t, MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t, MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w9_t, MD5C3f, MD5S33); + + digest[0] += a; + digest[1] += b; + digest[2] += c; + digest[3] += d; +} + +__device__ static void hmac_md5_pad (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], u32x ipad[4], u32x opad[4]) +{ + w0[0] = w0[0] ^ 0x36363636; + w0[1] = w0[1] ^ 0x36363636; + w0[2] = w0[2] ^ 0x36363636; + w0[3] = w0[3] ^ 0x36363636; + w1[0] = w1[0] ^ 0x36363636; + w1[1] = w1[1] ^ 0x36363636; + w1[2] = w1[2] ^ 0x36363636; + w1[3] = w1[3] ^ 0x36363636; + w2[0] = w2[0] ^ 0x36363636; + w2[1] = w2[1] ^ 0x36363636; + w2[2] = w2[2] ^ 0x36363636; + w2[3] = w2[3] ^ 0x36363636; + w3[0] = w3[0] ^ 0x36363636; + w3[1] = w3[1] ^ 0x36363636; + w3[2] = w3[2] ^ 0x36363636; + w3[3] = w3[3] ^ 0x36363636; + + ipad[0] = MD5M_A; + ipad[1] = MD5M_B; + ipad[2] = MD5M_C; + ipad[3] = MD5M_D; + + md5_transform (w0, w1, w2, w3, ipad); + + w0[0] = w0[0] ^ 0x6a6a6a6a; + w0[1] = w0[1] ^ 0x6a6a6a6a; + w0[2] = w0[2] ^ 0x6a6a6a6a; + w0[3] = w0[3] ^ 0x6a6a6a6a; + w1[0] = w1[0] ^ 0x6a6a6a6a; + w1[1] = w1[1] ^ 0x6a6a6a6a; + w1[2] = w1[2] ^ 0x6a6a6a6a; + w1[3] = w1[3] ^ 0x6a6a6a6a; + w2[0] = w2[0] ^ 0x6a6a6a6a; + w2[1] = w2[1] ^ 0x6a6a6a6a; + w2[2] = w2[2] ^ 0x6a6a6a6a; + w2[3] = w2[3] ^ 0x6a6a6a6a; + w3[0] = w3[0] ^ 0x6a6a6a6a; + w3[1] = w3[1] ^ 0x6a6a6a6a; + w3[2] = w3[2] ^ 0x6a6a6a6a; + w3[3] = w3[3] ^ 0x6a6a6a6a; + + opad[0] = MD5M_A; + opad[1] = MD5M_B; + opad[2] = MD5M_C; + opad[3] = MD5M_D; + + md5_transform (w0, w1, w2, w3, opad); +} + +__device__ static void hmac_md5_run (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], u32x ipad[4], u32x opad[4], u32x digest[4]) +{ + digest[0] = ipad[0]; + digest[1] = ipad[1]; + digest[2] = ipad[2]; + digest[3] = ipad[3]; + + md5_transform (w0, w1, w2, w3, digest); + + w0[0] = digest[0]; + w0[1] = digest[1]; + w0[2] = digest[2]; + w0[3] = digest[3]; + w1[0] = 0x80; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + w3[0] = 0; + w3[1] = 0; + w3[2] = (64 + 16) * 8; + w3[3] = 0; + + digest[0] = opad[0]; + digest[1] = opad[1]; + digest[2] = opad[2]; + digest[3] = opad[3]; + + md5_transform (w0, w1, w2, w3, digest); +} + +__device__ __constant__ gpu_rule_t c_rules[1024]; + +extern "C" __global__ void __launch_bounds__ (256, 1) m00050_m04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + u32x pw_buf1[4]; + + pw_buf1[0] = pws[gid].i[ 4]; + pw_buf1[1] = pws[gid].i[ 5]; + pw_buf1[2] = pws[gid].i[ 6]; + pw_buf1[3] = pws[gid].i[ 7]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[ 1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[ 2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[ 3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[ 4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[ 5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[ 6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[ 7]; + + u32 salt_buf2[4]; + + salt_buf2[0] = salt_bufs[salt_pos].salt_buf[ 8]; + salt_buf2[1] = salt_bufs[salt_pos].salt_buf[ 9]; + salt_buf2[2] = salt_bufs[salt_pos].salt_buf[10]; + salt_buf2[3] = salt_bufs[salt_pos].salt_buf[11]; + + u32 salt_buf3[4]; + + salt_buf3[0] = salt_bufs[salt_pos].salt_buf[12]; + salt_buf3[1] = salt_bufs[salt_pos].salt_buf[13]; + salt_buf3[2] = salt_bufs[salt_pos].salt_buf[14]; + salt_buf3[3] = salt_bufs[salt_pos].salt_buf[15]; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + + w0[0] = pw_buf0[0]; + w0[1] = pw_buf0[1]; + w0[2] = pw_buf0[2]; + w0[3] = pw_buf0[3]; + + u32x w1[4]; + + w1[0] = pw_buf1[0]; + w1[1] = pw_buf1[1]; + w1[2] = pw_buf1[2]; + w1[3] = pw_buf1[3]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 out_len = apply_rules (c_rules[il_pos].cmds, w0, w1, pw_len); + + /** + * pads + */ + + u32x w0_t[4]; + + w0_t[0] = w0[0]; + w0_t[1] = w0[1]; + w0_t[2] = w0[2]; + w0_t[3] = w0[3]; + + u32x w1_t[4]; + + w1_t[0] = w1[0]; + w1_t[1] = w1[1]; + w1_t[2] = w1[2]; + w1_t[3] = w1[3]; + + u32x w2_t[4]; + + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + + u32x w3_t[4]; + + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = 0; + + u32x ipad[4]; + u32x opad[4]; + + hmac_md5_pad (w0_t, w1_t, w2_t, w3_t, ipad, opad); + + w0_t[0] = salt_buf0[0]; + w0_t[1] = salt_buf0[1]; + w0_t[2] = salt_buf0[2]; + w0_t[3] = salt_buf0[3]; + w1_t[0] = salt_buf1[0]; + w1_t[1] = salt_buf1[1]; + w1_t[2] = salt_buf1[2]; + w1_t[3] = salt_buf1[3]; + w2_t[0] = salt_buf2[0]; + w2_t[1] = salt_buf2[1]; + w2_t[2] = salt_buf2[2]; + w2_t[3] = salt_buf2[3]; + w3_t[0] = salt_buf3[0]; + w3_t[1] = salt_buf3[1]; + w3_t[2] = (64 + salt_len) * 8; + w3_t[3] = 0; + + u32x digest[4]; + + hmac_md5_run (w0_t, w1_t, w2_t, w3_t, ipad, opad, digest); + + const u32x r0 = digest[0]; + const u32x r1 = digest[3]; + const u32x r2 = digest[2]; + const u32x r3 = digest[1]; + + #include VECT_COMPARE_M + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m00050_m08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m00050_m16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m00050_s04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + u32x pw_buf1[4]; + + pw_buf1[0] = pws[gid].i[ 4]; + pw_buf1[1] = pws[gid].i[ 5]; + pw_buf1[2] = pws[gid].i[ 6]; + pw_buf1[3] = pws[gid].i[ 7]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[ 1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[ 2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[ 3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[ 4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[ 5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[ 6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[ 7]; + + u32 salt_buf2[4]; + + salt_buf2[0] = salt_bufs[salt_pos].salt_buf[ 8]; + salt_buf2[1] = salt_bufs[salt_pos].salt_buf[ 9]; + salt_buf2[2] = salt_bufs[salt_pos].salt_buf[10]; + salt_buf2[3] = salt_bufs[salt_pos].salt_buf[11]; + + u32 salt_buf3[4]; + + salt_buf3[0] = salt_bufs[salt_pos].salt_buf[12]; + salt_buf3[1] = salt_bufs[salt_pos].salt_buf[13]; + salt_buf3[2] = salt_bufs[salt_pos].salt_buf[14]; + salt_buf3[3] = salt_bufs[salt_pos].salt_buf[15]; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + + w0[0] = pw_buf0[0]; + w0[1] = pw_buf0[1]; + w0[2] = pw_buf0[2]; + w0[3] = pw_buf0[3]; + + u32x w1[4]; + + w1[0] = pw_buf1[0]; + w1[1] = pw_buf1[1]; + w1[2] = pw_buf1[2]; + w1[3] = pw_buf1[3]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 out_len = apply_rules (c_rules[il_pos].cmds, w0, w1, pw_len); + + /** + * pads + */ + + u32x w0_t[4]; + + w0_t[0] = w0[0]; + w0_t[1] = w0[1]; + w0_t[2] = w0[2]; + w0_t[3] = w0[3]; + + u32x w1_t[4]; + + w1_t[0] = w1[0]; + w1_t[1] = w1[1]; + w1_t[2] = w1[2]; + w1_t[3] = w1[3]; + + u32x w2_t[4]; + + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + + u32x w3_t[4]; + + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = 0; + + u32x ipad[4]; + u32x opad[4]; + + hmac_md5_pad (w0_t, w1_t, w2_t, w3_t, ipad, opad); + + w0_t[0] = salt_buf0[0]; + w0_t[1] = salt_buf0[1]; + w0_t[2] = salt_buf0[2]; + w0_t[3] = salt_buf0[3]; + w1_t[0] = salt_buf1[0]; + w1_t[1] = salt_buf1[1]; + w1_t[2] = salt_buf1[2]; + w1_t[3] = salt_buf1[3]; + w2_t[0] = salt_buf2[0]; + w2_t[1] = salt_buf2[1]; + w2_t[2] = salt_buf2[2]; + w2_t[3] = salt_buf2[3]; + w3_t[0] = salt_buf3[0]; + w3_t[1] = salt_buf3[1]; + w3_t[2] = (64 + salt_len) * 8; + w3_t[3] = 0; + + u32x digest[4]; + + hmac_md5_run (w0_t, w1_t, w2_t, w3_t, ipad, opad, digest); + + const u32x r0 = digest[0]; + const u32x r1 = digest[3]; + const u32x r2 = digest[2]; + const u32x r3 = digest[1]; + + #include VECT_COMPARE_S + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m00050_s08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m00050_s16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/nv/m00050_a1.cu b/nv/m00050_a1.cu new file mode 100644 index 0000000000..92f17848e3 --- /dev/null +++ b/nv/m00050_a1.cu @@ -0,0 +1,702 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _MD5_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW2 +#define VECT_SIZE4 +#endif + +#define DGST_R0 0 +#define DGST_R1 3 +#define DGST_R2 2 +#define DGST_R3 1 + +#include "include/kernel_functions.c" +#include "types_nv.c" +#include "common_nv.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +__device__ static void md5_transform (const u32x w0[4], const u32x w1[4], const u32x w2[4], const u32x w3[4], u32x digest[4]) +{ + u32x a = digest[0]; + u32x b = digest[1]; + u32x c = digest[2]; + u32x d = digest[3]; + + u32x w0_t = w0[0]; + u32x w1_t = w0[1]; + u32x w2_t = w0[2]; + u32x w3_t = w0[3]; + u32x w4_t = w1[0]; + u32x w5_t = w1[1]; + u32x w6_t = w1[2]; + u32x w7_t = w1[3]; + u32x w8_t = w2[0]; + u32x w9_t = w2[1]; + u32x wa_t = w2[2]; + u32x wb_t = w2[3]; + u32x wc_t = w3[0]; + u32x wd_t = w3[1]; + u32x we_t = w3[2]; + u32x wf_t = w3[3]; + + u32x tmp2; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t, MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t, MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t, MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t, MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w4_t, MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w5_t, MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w6_t, MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w7_t, MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w8_t, MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w9_t, MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, wa_t, MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, wb_t, MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, wc_t, MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, wd_t, MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, we_t, MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, wf_t, MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w1_t, MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w6_t, MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, wb_t, MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t, MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w5_t, MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, wa_t, MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, wf_t, MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w4_t, MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w9_t, MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, we_t, MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t, MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w8_t, MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, wd_t, MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t, MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w7_t, MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, wc_t, MD5C1f, MD5S13); + + MD5_STEP (MD5_H1, a, b, c, d, w5_t, MD5C20, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w8_t, MD5C21, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, wb_t, MD5C22, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, we_t, MD5C23, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w1_t, MD5C24, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w4_t, MD5C25, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w7_t, MD5C26, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, wa_t, MD5C27, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, wd_t, MD5C28, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w0_t, MD5C29, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w3_t, MD5C2a, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w6_t, MD5C2b, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w9_t, MD5C2c, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, wc_t, MD5C2d, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, wf_t, MD5C2e, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w2_t, MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t, MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w7_t, MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, we_t, MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w5_t, MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, wc_t, MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t, MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, wa_t, MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t, MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w8_t, MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, wf_t, MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w6_t, MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, wd_t, MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w4_t, MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, wb_t, MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t, MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w9_t, MD5C3f, MD5S33); + + digest[0] += a; + digest[1] += b; + digest[2] += c; + digest[3] += d; +} + +__device__ static void hmac_md5_pad (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], u32x ipad[4], u32x opad[4]) +{ + w0[0] = w0[0] ^ 0x36363636; + w0[1] = w0[1] ^ 0x36363636; + w0[2] = w0[2] ^ 0x36363636; + w0[3] = w0[3] ^ 0x36363636; + w1[0] = w1[0] ^ 0x36363636; + w1[1] = w1[1] ^ 0x36363636; + w1[2] = w1[2] ^ 0x36363636; + w1[3] = w1[3] ^ 0x36363636; + w2[0] = w2[0] ^ 0x36363636; + w2[1] = w2[1] ^ 0x36363636; + w2[2] = w2[2] ^ 0x36363636; + w2[3] = w2[3] ^ 0x36363636; + w3[0] = w3[0] ^ 0x36363636; + w3[1] = w3[1] ^ 0x36363636; + w3[2] = w3[2] ^ 0x36363636; + w3[3] = w3[3] ^ 0x36363636; + + ipad[0] = MD5M_A; + ipad[1] = MD5M_B; + ipad[2] = MD5M_C; + ipad[3] = MD5M_D; + + md5_transform (w0, w1, w2, w3, ipad); + + w0[0] = w0[0] ^ 0x6a6a6a6a; + w0[1] = w0[1] ^ 0x6a6a6a6a; + w0[2] = w0[2] ^ 0x6a6a6a6a; + w0[3] = w0[3] ^ 0x6a6a6a6a; + w1[0] = w1[0] ^ 0x6a6a6a6a; + w1[1] = w1[1] ^ 0x6a6a6a6a; + w1[2] = w1[2] ^ 0x6a6a6a6a; + w1[3] = w1[3] ^ 0x6a6a6a6a; + w2[0] = w2[0] ^ 0x6a6a6a6a; + w2[1] = w2[1] ^ 0x6a6a6a6a; + w2[2] = w2[2] ^ 0x6a6a6a6a; + w2[3] = w2[3] ^ 0x6a6a6a6a; + w3[0] = w3[0] ^ 0x6a6a6a6a; + w3[1] = w3[1] ^ 0x6a6a6a6a; + w3[2] = w3[2] ^ 0x6a6a6a6a; + w3[3] = w3[3] ^ 0x6a6a6a6a; + + opad[0] = MD5M_A; + opad[1] = MD5M_B; + opad[2] = MD5M_C; + opad[3] = MD5M_D; + + md5_transform (w0, w1, w2, w3, opad); +} + +__device__ static void hmac_md5_run (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], u32x ipad[4], u32x opad[4], u32x digest[4]) +{ + digest[0] = ipad[0]; + digest[1] = ipad[1]; + digest[2] = ipad[2]; + digest[3] = ipad[3]; + + md5_transform (w0, w1, w2, w3, digest); + + w0[0] = digest[0]; + w0[1] = digest[1]; + w0[2] = digest[2]; + w0[3] = digest[3]; + w1[0] = 0x80; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + w3[0] = 0; + w3[1] = 0; + w3[2] = (64 + 16) * 8; + w3[3] = 0; + + digest[0] = opad[0]; + digest[1] = opad[1]; + digest[2] = opad[2]; + digest[3] = opad[3]; + + md5_transform (w0, w1, w2, w3, digest); +} + +__device__ __constant__ comb_t c_combs[1024]; + +extern "C" __global__ void __launch_bounds__ (256, 1) m00050_m04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, c_combs[0].pw_len); + } + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[ 1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[ 2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[ 3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[ 4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[ 5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[ 6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[ 7]; + + u32 salt_buf2[4]; + + salt_buf2[0] = salt_bufs[salt_pos].salt_buf[ 8]; + salt_buf2[1] = salt_bufs[salt_pos].salt_buf[ 9]; + salt_buf2[2] = salt_bufs[salt_pos].salt_buf[10]; + salt_buf2[3] = salt_bufs[salt_pos].salt_buf[11]; + + u32 salt_buf3[4]; + + salt_buf3[0] = salt_bufs[salt_pos].salt_buf[12]; + salt_buf3[1] = salt_bufs[salt_pos].salt_buf[13]; + salt_buf3[2] = salt_bufs[salt_pos].salt_buf[14]; + salt_buf3[3] = salt_bufs[salt_pos].salt_buf[15]; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = c_combs[il_pos].pw_len; + + const u32 pw_len = pw_l_len + pw_r_len; + + u32 wordr0[4]; + + wordr0[0] = c_combs[il_pos].i[0]; + wordr0[1] = c_combs[il_pos].i[1]; + wordr0[2] = c_combs[il_pos].i[2]; + wordr0[3] = c_combs[il_pos].i[3]; + + u32 wordr1[4]; + + wordr1[0] = c_combs[il_pos].i[4]; + wordr1[1] = c_combs[il_pos].i[5]; + wordr1[2] = c_combs[il_pos].i[6]; + wordr1[3] = c_combs[il_pos].i[7]; + + u32 wordr2[4]; + + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + + u32 wordr3[4]; + + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + u32x w0[4]; + + w0[0] = wordl0[0] | wordr0[0]; + w0[1] = wordl0[1] | wordr0[1]; + w0[2] = wordl0[2] | wordr0[2]; + w0[3] = wordl0[3] | wordr0[3]; + + u32x w1[4]; + + w1[0] = wordl1[0] | wordr1[0]; + w1[1] = wordl1[1] | wordr1[1]; + w1[2] = wordl1[2] | wordr1[2]; + w1[3] = wordl1[3] | wordr1[3]; + + u32x w2[4]; + + w2[0] = wordl2[0] | wordr2[0]; + w2[1] = wordl2[1] | wordr2[1]; + w2[2] = wordl2[2] | wordr2[2]; + w2[3] = wordl2[3] | wordr2[3]; + + u32x w3[4]; + + w3[0] = wordl3[0] | wordr3[0]; + w3[1] = wordl3[1] | wordr3[1]; + w3[2] = wordl3[2] | wordr3[2]; + w3[3] = wordl3[3] | wordr3[3]; + + /** + * pads + */ + + u32x w0_t[4]; + + w0_t[0] = w0[0]; + w0_t[1] = w0[1]; + w0_t[2] = w0[2]; + w0_t[3] = w0[3]; + + u32x w1_t[4]; + + w1_t[0] = w1[0]; + w1_t[1] = w1[1]; + w1_t[2] = w1[2]; + w1_t[3] = w1[3]; + + u32x w2_t[4]; + + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + + u32x w3_t[4]; + + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = 0; + + u32x ipad[4]; + u32x opad[4]; + + hmac_md5_pad (w0_t, w1_t, w2_t, w3_t, ipad, opad); + + w0_t[0] = salt_buf0[0]; + w0_t[1] = salt_buf0[1]; + w0_t[2] = salt_buf0[2]; + w0_t[3] = salt_buf0[3]; + w1_t[0] = salt_buf1[0]; + w1_t[1] = salt_buf1[1]; + w1_t[2] = salt_buf1[2]; + w1_t[3] = salt_buf1[3]; + w2_t[0] = salt_buf2[0]; + w2_t[1] = salt_buf2[1]; + w2_t[2] = salt_buf2[2]; + w2_t[3] = salt_buf2[3]; + w3_t[0] = salt_buf3[0]; + w3_t[1] = salt_buf3[1]; + w3_t[2] = (64 + salt_len) * 8; + w3_t[3] = 0; + + u32x digest[4]; + + hmac_md5_run (w0_t, w1_t, w2_t, w3_t, ipad, opad, digest); + + const u32x r0 = digest[0]; + const u32x r1 = digest[3]; + const u32x r2 = digest[2]; + const u32x r3 = digest[1]; + + #include VECT_COMPARE_M + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m00050_m08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m00050_m16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m00050_s04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, c_combs[0].pw_len); + } + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[ 1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[ 2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[ 3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[ 4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[ 5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[ 6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[ 7]; + + u32 salt_buf2[4]; + + salt_buf2[0] = salt_bufs[salt_pos].salt_buf[ 8]; + salt_buf2[1] = salt_bufs[salt_pos].salt_buf[ 9]; + salt_buf2[2] = salt_bufs[salt_pos].salt_buf[10]; + salt_buf2[3] = salt_bufs[salt_pos].salt_buf[11]; + + u32 salt_buf3[4]; + + salt_buf3[0] = salt_bufs[salt_pos].salt_buf[12]; + salt_buf3[1] = salt_bufs[salt_pos].salt_buf[13]; + salt_buf3[2] = salt_bufs[salt_pos].salt_buf[14]; + salt_buf3[3] = salt_bufs[salt_pos].salt_buf[15]; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = c_combs[il_pos].pw_len; + + const u32 pw_len = pw_l_len + pw_r_len; + + u32 wordr0[4]; + + wordr0[0] = c_combs[il_pos].i[0]; + wordr0[1] = c_combs[il_pos].i[1]; + wordr0[2] = c_combs[il_pos].i[2]; + wordr0[3] = c_combs[il_pos].i[3]; + + u32 wordr1[4]; + + wordr1[0] = c_combs[il_pos].i[4]; + wordr1[1] = c_combs[il_pos].i[5]; + wordr1[2] = c_combs[il_pos].i[6]; + wordr1[3] = c_combs[il_pos].i[7]; + + u32 wordr2[4]; + + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + + u32 wordr3[4]; + + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + u32x w0[4]; + + w0[0] = wordl0[0] | wordr0[0]; + w0[1] = wordl0[1] | wordr0[1]; + w0[2] = wordl0[2] | wordr0[2]; + w0[3] = wordl0[3] | wordr0[3]; + + u32x w1[4]; + + w1[0] = wordl1[0] | wordr1[0]; + w1[1] = wordl1[1] | wordr1[1]; + w1[2] = wordl1[2] | wordr1[2]; + w1[3] = wordl1[3] | wordr1[3]; + + u32x w2[4]; + + w2[0] = wordl2[0] | wordr2[0]; + w2[1] = wordl2[1] | wordr2[1]; + w2[2] = wordl2[2] | wordr2[2]; + w2[3] = wordl2[3] | wordr2[3]; + + u32x w3[4]; + + w3[0] = wordl3[0] | wordr3[0]; + w3[1] = wordl3[1] | wordr3[1]; + w3[2] = wordl3[2] | wordr3[2]; + w3[3] = wordl3[3] | wordr3[3]; + + /** + * pads + */ + + u32x w0_t[4]; + + w0_t[0] = w0[0]; + w0_t[1] = w0[1]; + w0_t[2] = w0[2]; + w0_t[3] = w0[3]; + + u32x w1_t[4]; + + w1_t[0] = w1[0]; + w1_t[1] = w1[1]; + w1_t[2] = w1[2]; + w1_t[3] = w1[3]; + + u32x w2_t[4]; + + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + + u32x w3_t[4]; + + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = 0; + + u32x ipad[4]; + u32x opad[4]; + + hmac_md5_pad (w0_t, w1_t, w2_t, w3_t, ipad, opad); + + w0_t[0] = salt_buf0[0]; + w0_t[1] = salt_buf0[1]; + w0_t[2] = salt_buf0[2]; + w0_t[3] = salt_buf0[3]; + w1_t[0] = salt_buf1[0]; + w1_t[1] = salt_buf1[1]; + w1_t[2] = salt_buf1[2]; + w1_t[3] = salt_buf1[3]; + w2_t[0] = salt_buf2[0]; + w2_t[1] = salt_buf2[1]; + w2_t[2] = salt_buf2[2]; + w2_t[3] = salt_buf2[3]; + w3_t[0] = salt_buf3[0]; + w3_t[1] = salt_buf3[1]; + w3_t[2] = (64 + salt_len) * 8; + w3_t[3] = 0; + + u32x digest[4]; + + hmac_md5_run (w0_t, w1_t, w2_t, w3_t, ipad, opad, digest); + + const u32x r0 = digest[0]; + const u32x r1 = digest[3]; + const u32x r2 = digest[2]; + const u32x r3 = digest[1]; + + #include VECT_COMPARE_S + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m00050_s08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m00050_s16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/nv/m00050_a3.cu b/nv/m00050_a3.cu new file mode 100644 index 0000000000..1948aa5a2d --- /dev/null +++ b/nv/m00050_a3.cu @@ -0,0 +1,766 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _MD5_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW2 +#define VECT_SIZE4 +#endif + +#define DGST_R0 0 +#define DGST_R1 3 +#define DGST_R2 2 +#define DGST_R3 1 + +#include "include/kernel_functions.c" +#include "types_nv.c" +#include "common_nv.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +__device__ static void md5_transform (const u32x w0[4], const u32x w1[4], const u32x w2[4], const u32x w3[4], u32x digest[4]) +{ + u32x a = digest[0]; + u32x b = digest[1]; + u32x c = digest[2]; + u32x d = digest[3]; + + u32x w0_t = w0[0]; + u32x w1_t = w0[1]; + u32x w2_t = w0[2]; + u32x w3_t = w0[3]; + u32x w4_t = w1[0]; + u32x w5_t = w1[1]; + u32x w6_t = w1[2]; + u32x w7_t = w1[3]; + u32x w8_t = w2[0]; + u32x w9_t = w2[1]; + u32x wa_t = w2[2]; + u32x wb_t = w2[3]; + u32x wc_t = w3[0]; + u32x wd_t = w3[1]; + u32x we_t = w3[2]; + u32x wf_t = w3[3]; + + u32x tmp2; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t, MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t, MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t, MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t, MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w4_t, MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w5_t, MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w6_t, MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w7_t, MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w8_t, MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w9_t, MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, wa_t, MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, wb_t, MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, wc_t, MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, wd_t, MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, we_t, MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, wf_t, MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w1_t, MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w6_t, MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, wb_t, MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t, MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w5_t, MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, wa_t, MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, wf_t, MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w4_t, MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w9_t, MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, we_t, MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t, MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w8_t, MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, wd_t, MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t, MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w7_t, MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, wc_t, MD5C1f, MD5S13); + + MD5_STEP (MD5_H1, a, b, c, d, w5_t, MD5C20, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w8_t, MD5C21, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, wb_t, MD5C22, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, we_t, MD5C23, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w1_t, MD5C24, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w4_t, MD5C25, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w7_t, MD5C26, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, wa_t, MD5C27, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, wd_t, MD5C28, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w0_t, MD5C29, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w3_t, MD5C2a, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w6_t, MD5C2b, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w9_t, MD5C2c, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, wc_t, MD5C2d, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, wf_t, MD5C2e, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w2_t, MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t, MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w7_t, MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, we_t, MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w5_t, MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, wc_t, MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t, MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, wa_t, MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t, MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w8_t, MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, wf_t, MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w6_t, MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, wd_t, MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w4_t, MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, wb_t, MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t, MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w9_t, MD5C3f, MD5S33); + + digest[0] += a; + digest[1] += b; + digest[2] += c; + digest[3] += d; +} + +__device__ static void hmac_md5_pad (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], u32x ipad[4], u32x opad[4]) +{ + w0[0] = w0[0] ^ 0x36363636; + w0[1] = w0[1] ^ 0x36363636; + w0[2] = w0[2] ^ 0x36363636; + w0[3] = w0[3] ^ 0x36363636; + w1[0] = w1[0] ^ 0x36363636; + w1[1] = w1[1] ^ 0x36363636; + w1[2] = w1[2] ^ 0x36363636; + w1[3] = w1[3] ^ 0x36363636; + w2[0] = w2[0] ^ 0x36363636; + w2[1] = w2[1] ^ 0x36363636; + w2[2] = w2[2] ^ 0x36363636; + w2[3] = w2[3] ^ 0x36363636; + w3[0] = w3[0] ^ 0x36363636; + w3[1] = w3[1] ^ 0x36363636; + w3[2] = w3[2] ^ 0x36363636; + w3[3] = w3[3] ^ 0x36363636; + + ipad[0] = MD5M_A; + ipad[1] = MD5M_B; + ipad[2] = MD5M_C; + ipad[3] = MD5M_D; + + md5_transform (w0, w1, w2, w3, ipad); + + w0[0] = w0[0] ^ 0x6a6a6a6a; + w0[1] = w0[1] ^ 0x6a6a6a6a; + w0[2] = w0[2] ^ 0x6a6a6a6a; + w0[3] = w0[3] ^ 0x6a6a6a6a; + w1[0] = w1[0] ^ 0x6a6a6a6a; + w1[1] = w1[1] ^ 0x6a6a6a6a; + w1[2] = w1[2] ^ 0x6a6a6a6a; + w1[3] = w1[3] ^ 0x6a6a6a6a; + w2[0] = w2[0] ^ 0x6a6a6a6a; + w2[1] = w2[1] ^ 0x6a6a6a6a; + w2[2] = w2[2] ^ 0x6a6a6a6a; + w2[3] = w2[3] ^ 0x6a6a6a6a; + w3[0] = w3[0] ^ 0x6a6a6a6a; + w3[1] = w3[1] ^ 0x6a6a6a6a; + w3[2] = w3[2] ^ 0x6a6a6a6a; + w3[3] = w3[3] ^ 0x6a6a6a6a; + + opad[0] = MD5M_A; + opad[1] = MD5M_B; + opad[2] = MD5M_C; + opad[3] = MD5M_D; + + md5_transform (w0, w1, w2, w3, opad); +} + +__device__ static void hmac_md5_run (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], u32x ipad[4], u32x opad[4], u32x digest[4]) +{ + digest[0] = ipad[0]; + digest[1] = ipad[1]; + digest[2] = ipad[2]; + digest[3] = ipad[3]; + + md5_transform (w0, w1, w2, w3, digest); + + w0[0] = digest[0]; + w0[1] = digest[1]; + w0[2] = digest[2]; + w0[3] = digest[3]; + w1[0] = 0x80; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + w3[0] = 0; + w3[1] = 0; + w3[2] = (64 + 16) * 8; + w3[3] = 0; + + digest[0] = opad[0]; + digest[1] = opad[1]; + digest[2] = opad[2]; + digest[3] = opad[3]; + + md5_transform (w0, w1, w2, w3, digest); +} + +__device__ __constant__ bf_t c_bfs[1024]; + +__device__ static void m00050m (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], const u32 pw_len, const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset) +{ + /** + * modifier + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + const u32 lid = threadIdx.x; + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[ 1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[ 2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[ 3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[ 4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[ 5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[ 6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[ 7]; + + u32 salt_buf2[4]; + + salt_buf2[0] = salt_bufs[salt_pos].salt_buf[ 8]; + salt_buf2[1] = salt_bufs[salt_pos].salt_buf[ 9]; + salt_buf2[2] = salt_bufs[salt_pos].salt_buf[10]; + salt_buf2[3] = salt_bufs[salt_pos].salt_buf[11]; + + u32 salt_buf3[4]; + + salt_buf3[0] = salt_bufs[salt_pos].salt_buf[12]; + salt_buf3[1] = salt_bufs[salt_pos].salt_buf[13]; + salt_buf3[2] = salt_bufs[salt_pos].salt_buf[14]; + salt_buf3[3] = salt_bufs[salt_pos].salt_buf[15]; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + /** + * loop + */ + + u32x w0l = w0[0]; + + for (u32 il_pos = 0; il_pos < bfs_cnt; il_pos++) + { + const u32 w0r = c_bfs[il_pos].i; + + w0[0] = w0l | w0r; + + /** + * pads + */ + + u32x w0_t[4]; + + w0_t[0] = w0[0]; + w0_t[1] = w0[1]; + w0_t[2] = w0[2]; + w0_t[3] = w0[3]; + + u32x w1_t[4]; + + w1_t[0] = w1[0]; + w1_t[1] = w1[1]; + w1_t[2] = w1[2]; + w1_t[3] = w1[3]; + + u32x w2_t[4]; + + w2_t[0] = w2[0]; + w2_t[1] = w2[1]; + w2_t[2] = w2[2]; + w2_t[3] = w2[3]; + + u32x w3_t[4]; + + w3_t[0] = w3[0]; + w3_t[1] = w3[1]; + w3_t[2] = 0; + w3_t[3] = 0; + + u32x ipad[4]; + u32x opad[4]; + + hmac_md5_pad (w0_t, w1_t, w2_t, w3_t, ipad, opad); + + w0_t[0] = salt_buf0[0]; + w0_t[1] = salt_buf0[1]; + w0_t[2] = salt_buf0[2]; + w0_t[3] = salt_buf0[3]; + w1_t[0] = salt_buf1[0]; + w1_t[1] = salt_buf1[1]; + w1_t[2] = salt_buf1[2]; + w1_t[3] = salt_buf1[3]; + w2_t[0] = salt_buf2[0]; + w2_t[1] = salt_buf2[1]; + w2_t[2] = salt_buf2[2]; + w2_t[3] = salt_buf2[3]; + w3_t[0] = salt_buf3[0]; + w3_t[1] = salt_buf3[1]; + w3_t[2] = (64 + salt_len) * 8; + w3_t[3] = 0; + + u32x digest[4]; + + hmac_md5_run (w0_t, w1_t, w2_t, w3_t, ipad, opad, digest); + + const u32x r0 = digest[0]; + const u32x r1 = digest[3]; + const u32x r2 = digest[2]; + const u32x r3 = digest[1]; + + #include VECT_COMPARE_M + } +} + +__device__ static void m00050s (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], const u32 pw_len, const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset) +{ + /** + * modifier + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + const u32 lid = threadIdx.x; + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[ 1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[ 2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[ 3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[ 4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[ 5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[ 6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[ 7]; + + u32 salt_buf2[4]; + + salt_buf2[0] = salt_bufs[salt_pos].salt_buf[ 8]; + salt_buf2[1] = salt_bufs[salt_pos].salt_buf[ 9]; + salt_buf2[2] = salt_bufs[salt_pos].salt_buf[10]; + salt_buf2[3] = salt_bufs[salt_pos].salt_buf[11]; + + u32 salt_buf3[4]; + + salt_buf3[0] = salt_bufs[salt_pos].salt_buf[12]; + salt_buf3[1] = salt_bufs[salt_pos].salt_buf[13]; + salt_buf3[2] = salt_bufs[salt_pos].salt_buf[14]; + salt_buf3[3] = salt_bufs[salt_pos].salt_buf[15]; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * loop + */ + + u32x w0l = w0[0]; + + for (u32 il_pos = 0; il_pos < bfs_cnt; il_pos++) + { + const u32 w0r = c_bfs[il_pos].i; + + w0[0] = w0l | w0r; + + /** + * pads + */ + + u32x w0_t[4]; + + w0_t[0] = w0[0]; + w0_t[1] = w0[1]; + w0_t[2] = w0[2]; + w0_t[3] = w0[3]; + + u32x w1_t[4]; + + w1_t[0] = w1[0]; + w1_t[1] = w1[1]; + w1_t[2] = w1[2]; + w1_t[3] = w1[3]; + + u32x w2_t[4]; + + w2_t[0] = w2[0]; + w2_t[1] = w2[1]; + w2_t[2] = w2[2]; + w2_t[3] = w2[3]; + + u32x w3_t[4]; + + w3_t[0] = w3[0]; + w3_t[1] = w3[1]; + w3_t[2] = 0; + w3_t[3] = 0; + + u32x ipad[4]; + u32x opad[4]; + + hmac_md5_pad (w0_t, w1_t, w2_t, w3_t, ipad, opad); + + w0_t[0] = salt_buf0[0]; + w0_t[1] = salt_buf0[1]; + w0_t[2] = salt_buf0[2]; + w0_t[3] = salt_buf0[3]; + w1_t[0] = salt_buf1[0]; + w1_t[1] = salt_buf1[1]; + w1_t[2] = salt_buf1[2]; + w1_t[3] = salt_buf1[3]; + w2_t[0] = salt_buf2[0]; + w2_t[1] = salt_buf2[1]; + w2_t[2] = salt_buf2[2]; + w2_t[3] = salt_buf2[3]; + w3_t[0] = salt_buf3[0]; + w3_t[1] = salt_buf3[1]; + w3_t[2] = (64 + salt_len) * 8; + w3_t[3] = 0; + + u32x digest[4]; + + hmac_md5_run (w0_t, w1_t, w2_t, w3_t, ipad, opad, digest); + + const u32x r0 = digest[0]; + const u32x r1 = digest[3]; + const u32x r2 = digest[2]; + const u32x r3 = digest[1]; + + #include VECT_COMPARE_S + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m00050_m04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m00050m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m00050_m08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m00050m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m00050_m16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = pws[gid].i[ 8]; + w2[1] = pws[gid].i[ 9]; + w2[2] = pws[gid].i[10]; + w2[3] = pws[gid].i[11]; + + u32x w3[4]; + + w3[0] = pws[gid].i[12]; + w3[1] = pws[gid].i[13]; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m00050m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m00050_s04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m00050s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m00050_s08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m00050s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m00050_s16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = pws[gid].i[ 8]; + w2[1] = pws[gid].i[ 9]; + w2[2] = pws[gid].i[10]; + w2[3] = pws[gid].i[11]; + + u32x w3[4]; + + w3[0] = pws[gid].i[12]; + w3[1] = pws[gid].i[13]; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m00050s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} diff --git a/nv/m00060_a0.cu b/nv/m00060_a0.cu new file mode 100644 index 0000000000..9f43842bd6 --- /dev/null +++ b/nv/m00060_a0.cu @@ -0,0 +1,568 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _MD5_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW2 +#define VECT_SIZE1 +#endif + +#define DGST_R0 0 +#define DGST_R1 3 +#define DGST_R2 2 +#define DGST_R3 1 + +#include "include/kernel_functions.c" +#include "types_nv.c" +#include "common_nv.c" +#include "include/rp_gpu.h" +#include "rp_nv.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +__device__ static void md5_transform (const u32x w0[4], const u32x w1[4], const u32x w2[4], const u32x w3[4], u32x digest[4]) +{ + u32x a = digest[0]; + u32x b = digest[1]; + u32x c = digest[2]; + u32x d = digest[3]; + + u32x w0_t = w0[0]; + u32x w1_t = w0[1]; + u32x w2_t = w0[2]; + u32x w3_t = w0[3]; + u32x w4_t = w1[0]; + u32x w5_t = w1[1]; + u32x w6_t = w1[2]; + u32x w7_t = w1[3]; + u32x w8_t = w2[0]; + u32x w9_t = w2[1]; + u32x wa_t = w2[2]; + u32x wb_t = w2[3]; + u32x wc_t = w3[0]; + u32x wd_t = w3[1]; + u32x we_t = w3[2]; + u32x wf_t = w3[3]; + + u32x tmp2; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t, MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t, MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t, MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t, MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w4_t, MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w5_t, MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w6_t, MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w7_t, MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w8_t, MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w9_t, MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, wa_t, MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, wb_t, MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, wc_t, MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, wd_t, MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, we_t, MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, wf_t, MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w1_t, MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w6_t, MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, wb_t, MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t, MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w5_t, MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, wa_t, MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, wf_t, MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w4_t, MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w9_t, MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, we_t, MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t, MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w8_t, MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, wd_t, MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t, MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w7_t, MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, wc_t, MD5C1f, MD5S13); + + MD5_STEP (MD5_H1, a, b, c, d, w5_t, MD5C20, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w8_t, MD5C21, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, wb_t, MD5C22, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, we_t, MD5C23, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w1_t, MD5C24, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w4_t, MD5C25, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w7_t, MD5C26, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, wa_t, MD5C27, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, wd_t, MD5C28, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w0_t, MD5C29, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w3_t, MD5C2a, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w6_t, MD5C2b, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w9_t, MD5C2c, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, wc_t, MD5C2d, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, wf_t, MD5C2e, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w2_t, MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t, MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w7_t, MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, we_t, MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w5_t, MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, wc_t, MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t, MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, wa_t, MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t, MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w8_t, MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, wf_t, MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w6_t, MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, wd_t, MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w4_t, MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, wb_t, MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t, MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w9_t, MD5C3f, MD5S33); + + digest[0] += a; + digest[1] += b; + digest[2] += c; + digest[3] += d; +} + +__device__ static void hmac_md5_pad (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], u32x ipad[4], u32x opad[4]) +{ + w0[0] = w0[0] ^ 0x36363636; + w0[1] = w0[1] ^ 0x36363636; + w0[2] = w0[2] ^ 0x36363636; + w0[3] = w0[3] ^ 0x36363636; + w1[0] = w1[0] ^ 0x36363636; + w1[1] = w1[1] ^ 0x36363636; + w1[2] = w1[2] ^ 0x36363636; + w1[3] = w1[3] ^ 0x36363636; + w2[0] = w2[0] ^ 0x36363636; + w2[1] = w2[1] ^ 0x36363636; + w2[2] = w2[2] ^ 0x36363636; + w2[3] = w2[3] ^ 0x36363636; + w3[0] = w3[0] ^ 0x36363636; + w3[1] = w3[1] ^ 0x36363636; + w3[2] = w3[2] ^ 0x36363636; + w3[3] = w3[3] ^ 0x36363636; + + ipad[0] = MD5M_A; + ipad[1] = MD5M_B; + ipad[2] = MD5M_C; + ipad[3] = MD5M_D; + + md5_transform (w0, w1, w2, w3, ipad); + + w0[0] = w0[0] ^ 0x6a6a6a6a; + w0[1] = w0[1] ^ 0x6a6a6a6a; + w0[2] = w0[2] ^ 0x6a6a6a6a; + w0[3] = w0[3] ^ 0x6a6a6a6a; + w1[0] = w1[0] ^ 0x6a6a6a6a; + w1[1] = w1[1] ^ 0x6a6a6a6a; + w1[2] = w1[2] ^ 0x6a6a6a6a; + w1[3] = w1[3] ^ 0x6a6a6a6a; + w2[0] = w2[0] ^ 0x6a6a6a6a; + w2[1] = w2[1] ^ 0x6a6a6a6a; + w2[2] = w2[2] ^ 0x6a6a6a6a; + w2[3] = w2[3] ^ 0x6a6a6a6a; + w3[0] = w3[0] ^ 0x6a6a6a6a; + w3[1] = w3[1] ^ 0x6a6a6a6a; + w3[2] = w3[2] ^ 0x6a6a6a6a; + w3[3] = w3[3] ^ 0x6a6a6a6a; + + opad[0] = MD5M_A; + opad[1] = MD5M_B; + opad[2] = MD5M_C; + opad[3] = MD5M_D; + + md5_transform (w0, w1, w2, w3, opad); +} + +__device__ static void hmac_md5_run (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], u32x ipad[4], u32x opad[4], u32x digest[4]) +{ + digest[0] = ipad[0]; + digest[1] = ipad[1]; + digest[2] = ipad[2]; + digest[3] = ipad[3]; + + md5_transform (w0, w1, w2, w3, digest); + + w0[0] = digest[0]; + w0[1] = digest[1]; + w0[2] = digest[2]; + w0[3] = digest[3]; + w1[0] = 0x80; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + w3[0] = 0; + w3[1] = 0; + w3[2] = (64 + 16) * 8; + w3[3] = 0; + + digest[0] = opad[0]; + digest[1] = opad[1]; + digest[2] = opad[2]; + digest[3] = opad[3]; + + md5_transform (w0, w1, w2, w3, digest); +} + +__device__ __constant__ gpu_rule_t c_rules[1024]; + +extern "C" __global__ void __launch_bounds__ (256, 1) m00060_m04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + u32x pw_buf1[4]; + + pw_buf1[0] = pws[gid].i[ 4]; + pw_buf1[1] = pws[gid].i[ 5]; + pw_buf1[2] = pws[gid].i[ 6]; + pw_buf1[3] = pws[gid].i[ 7]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[ 1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[ 2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[ 3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[ 4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[ 5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[ 6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[ 7]; + + /** + * pads + */ + + u32x w0_t[4]; + + w0_t[0] = salt_buf0[0]; + w0_t[1] = salt_buf0[1]; + w0_t[2] = salt_buf0[2]; + w0_t[3] = salt_buf0[3]; + + u32x w1_t[4]; + + w1_t[0] = salt_buf1[0]; + w1_t[1] = salt_buf1[1]; + w1_t[2] = salt_buf1[2]; + w1_t[3] = salt_buf1[3]; + + u32x w2_t[4]; + + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + + u32x w3_t[4]; + + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = 0; + + u32x ipad[4]; + u32x opad[4]; + + hmac_md5_pad (w0_t, w1_t, w2_t, w3_t, ipad, opad); + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + + w0[0] = pw_buf0[0]; + w0[1] = pw_buf0[1]; + w0[2] = pw_buf0[2]; + w0[3] = pw_buf0[3]; + + u32x w1[4]; + + w1[0] = pw_buf1[0]; + w1[1] = pw_buf1[1]; + w1[2] = pw_buf1[2]; + w1[3] = pw_buf1[3]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 out_len = apply_rules (c_rules[il_pos].cmds, w0, w1, pw_len); + + append_0x80_2 (w0, w1, out_len); + + w0_t[0] = w0[0]; + w0_t[1] = w0[1]; + w0_t[2] = w0[2]; + w0_t[3] = w0[3]; + w1_t[0] = w1[0]; + w1_t[1] = w1[1]; + w1_t[2] = w1[2]; + w1_t[3] = w1[3]; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = (64 + out_len) * 8; + w3_t[3] = 0; + + u32x digest[4]; + + hmac_md5_run (w0_t, w1_t, w2_t, w3_t, ipad, opad, digest); + + const u32x r0 = digest[0]; + const u32x r1 = digest[3]; + const u32x r2 = digest[2]; + const u32x r3 = digest[1]; + + #include VECT_COMPARE_M + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m00060_m08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m00060_m16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m00060_s04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + u32x pw_buf1[4]; + + pw_buf1[0] = pws[gid].i[ 4]; + pw_buf1[1] = pws[gid].i[ 5]; + pw_buf1[2] = pws[gid].i[ 6]; + pw_buf1[3] = pws[gid].i[ 7]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[ 1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[ 2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[ 3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[ 4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[ 5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[ 6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[ 7]; + + /** + * pads + */ + + u32x w0_t[4]; + + w0_t[0] = salt_buf0[0]; + w0_t[1] = salt_buf0[1]; + w0_t[2] = salt_buf0[2]; + w0_t[3] = salt_buf0[3]; + + u32x w1_t[4]; + + w1_t[0] = salt_buf1[0]; + w1_t[1] = salt_buf1[1]; + w1_t[2] = salt_buf1[2]; + w1_t[3] = salt_buf1[3]; + + u32x w2_t[4]; + + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + + u32x w3_t[4]; + + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = 0; + + u32x ipad[4]; + u32x opad[4]; + + hmac_md5_pad (w0_t, w1_t, w2_t, w3_t, ipad, opad); + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + + w0[0] = pw_buf0[0]; + w0[1] = pw_buf0[1]; + w0[2] = pw_buf0[2]; + w0[3] = pw_buf0[3]; + + u32x w1[4]; + + w1[0] = pw_buf1[0]; + w1[1] = pw_buf1[1]; + w1[2] = pw_buf1[2]; + w1[3] = pw_buf1[3]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 out_len = apply_rules (c_rules[il_pos].cmds, w0, w1, pw_len); + + append_0x80_2 (w0, w1, out_len); + + w0_t[0] = w0[0]; + w0_t[1] = w0[1]; + w0_t[2] = w0[2]; + w0_t[3] = w0[3]; + w1_t[0] = w1[0]; + w1_t[1] = w1[1]; + w1_t[2] = w1[2]; + w1_t[3] = w1[3]; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = (64 + out_len) * 8; + w3_t[3] = 0; + + u32x digest[4]; + + hmac_md5_run (w0_t, w1_t, w2_t, w3_t, ipad, opad, digest); + + const u32x r0 = digest[0]; + const u32x r1 = digest[3]; + const u32x r2 = digest[2]; + const u32x r3 = digest[1]; + + #include VECT_COMPARE_S + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m00060_s08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m00060_s16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/nv/m00060_a1.cu b/nv/m00060_a1.cu new file mode 100644 index 0000000000..95dcf938e4 --- /dev/null +++ b/nv/m00060_a1.cu @@ -0,0 +1,674 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _MD5_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW2 +#define VECT_SIZE4 +#endif + +#define DGST_R0 0 +#define DGST_R1 3 +#define DGST_R2 2 +#define DGST_R3 1 + +#include "include/kernel_functions.c" +#include "types_nv.c" +#include "common_nv.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +__device__ static void md5_transform (const u32x w0[4], const u32x w1[4], const u32x w2[4], const u32x w3[4], u32x digest[4]) +{ + u32x a = digest[0]; + u32x b = digest[1]; + u32x c = digest[2]; + u32x d = digest[3]; + + u32x w0_t = w0[0]; + u32x w1_t = w0[1]; + u32x w2_t = w0[2]; + u32x w3_t = w0[3]; + u32x w4_t = w1[0]; + u32x w5_t = w1[1]; + u32x w6_t = w1[2]; + u32x w7_t = w1[3]; + u32x w8_t = w2[0]; + u32x w9_t = w2[1]; + u32x wa_t = w2[2]; + u32x wb_t = w2[3]; + u32x wc_t = w3[0]; + u32x wd_t = w3[1]; + u32x we_t = w3[2]; + u32x wf_t = w3[3]; + + u32x tmp2; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t, MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t, MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t, MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t, MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w4_t, MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w5_t, MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w6_t, MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w7_t, MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w8_t, MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w9_t, MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, wa_t, MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, wb_t, MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, wc_t, MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, wd_t, MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, we_t, MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, wf_t, MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w1_t, MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w6_t, MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, wb_t, MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t, MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w5_t, MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, wa_t, MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, wf_t, MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w4_t, MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w9_t, MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, we_t, MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t, MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w8_t, MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, wd_t, MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t, MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w7_t, MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, wc_t, MD5C1f, MD5S13); + + MD5_STEP (MD5_H1, a, b, c, d, w5_t, MD5C20, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w8_t, MD5C21, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, wb_t, MD5C22, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, we_t, MD5C23, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w1_t, MD5C24, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w4_t, MD5C25, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w7_t, MD5C26, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, wa_t, MD5C27, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, wd_t, MD5C28, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w0_t, MD5C29, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w3_t, MD5C2a, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w6_t, MD5C2b, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w9_t, MD5C2c, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, wc_t, MD5C2d, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, wf_t, MD5C2e, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w2_t, MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t, MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w7_t, MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, we_t, MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w5_t, MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, wc_t, MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t, MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, wa_t, MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t, MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w8_t, MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, wf_t, MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w6_t, MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, wd_t, MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w4_t, MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, wb_t, MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t, MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w9_t, MD5C3f, MD5S33); + + digest[0] += a; + digest[1] += b; + digest[2] += c; + digest[3] += d; +} + +__device__ static void hmac_md5_pad (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], u32x ipad[4], u32x opad[4]) +{ + w0[0] = w0[0] ^ 0x36363636; + w0[1] = w0[1] ^ 0x36363636; + w0[2] = w0[2] ^ 0x36363636; + w0[3] = w0[3] ^ 0x36363636; + w1[0] = w1[0] ^ 0x36363636; + w1[1] = w1[1] ^ 0x36363636; + w1[2] = w1[2] ^ 0x36363636; + w1[3] = w1[3] ^ 0x36363636; + w2[0] = w2[0] ^ 0x36363636; + w2[1] = w2[1] ^ 0x36363636; + w2[2] = w2[2] ^ 0x36363636; + w2[3] = w2[3] ^ 0x36363636; + w3[0] = w3[0] ^ 0x36363636; + w3[1] = w3[1] ^ 0x36363636; + w3[2] = w3[2] ^ 0x36363636; + w3[3] = w3[3] ^ 0x36363636; + + ipad[0] = MD5M_A; + ipad[1] = MD5M_B; + ipad[2] = MD5M_C; + ipad[3] = MD5M_D; + + md5_transform (w0, w1, w2, w3, ipad); + + w0[0] = w0[0] ^ 0x6a6a6a6a; + w0[1] = w0[1] ^ 0x6a6a6a6a; + w0[2] = w0[2] ^ 0x6a6a6a6a; + w0[3] = w0[3] ^ 0x6a6a6a6a; + w1[0] = w1[0] ^ 0x6a6a6a6a; + w1[1] = w1[1] ^ 0x6a6a6a6a; + w1[2] = w1[2] ^ 0x6a6a6a6a; + w1[3] = w1[3] ^ 0x6a6a6a6a; + w2[0] = w2[0] ^ 0x6a6a6a6a; + w2[1] = w2[1] ^ 0x6a6a6a6a; + w2[2] = w2[2] ^ 0x6a6a6a6a; + w2[3] = w2[3] ^ 0x6a6a6a6a; + w3[0] = w3[0] ^ 0x6a6a6a6a; + w3[1] = w3[1] ^ 0x6a6a6a6a; + w3[2] = w3[2] ^ 0x6a6a6a6a; + w3[3] = w3[3] ^ 0x6a6a6a6a; + + opad[0] = MD5M_A; + opad[1] = MD5M_B; + opad[2] = MD5M_C; + opad[3] = MD5M_D; + + md5_transform (w0, w1, w2, w3, opad); +} + +__device__ static void hmac_md5_run (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], u32x ipad[4], u32x opad[4], u32x digest[4]) +{ + digest[0] = ipad[0]; + digest[1] = ipad[1]; + digest[2] = ipad[2]; + digest[3] = ipad[3]; + + md5_transform (w0, w1, w2, w3, digest); + + w0[0] = digest[0]; + w0[1] = digest[1]; + w0[2] = digest[2]; + w0[3] = digest[3]; + w1[0] = 0x80; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + w3[0] = 0; + w3[1] = 0; + w3[2] = (64 + 16) * 8; + w3[3] = 0; + + digest[0] = opad[0]; + digest[1] = opad[1]; + digest[2] = opad[2]; + digest[3] = opad[3]; + + md5_transform (w0, w1, w2, w3, digest); +} + +__device__ __constant__ comb_t c_combs[1024]; + +extern "C" __global__ void __launch_bounds__ (256, 1) m00060_m04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, c_combs[0].pw_len); + } + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[ 1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[ 2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[ 3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[ 4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[ 5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[ 6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[ 7]; + + /** + * pads + */ + + u32x w0_t[4]; + + w0_t[0] = salt_buf0[0]; + w0_t[1] = salt_buf0[1]; + w0_t[2] = salt_buf0[2]; + w0_t[3] = salt_buf0[3]; + + u32x w1_t[4]; + + w1_t[0] = salt_buf1[0]; + w1_t[1] = salt_buf1[1]; + w1_t[2] = salt_buf1[2]; + w1_t[3] = salt_buf1[3]; + + u32x w2_t[4]; + + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + + u32x w3_t[4]; + + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = 0; + + u32x ipad[4]; + u32x opad[4]; + + hmac_md5_pad (w0_t, w1_t, w2_t, w3_t, ipad, opad); + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = c_combs[il_pos].pw_len; + + const u32 pw_len = pw_l_len + pw_r_len; + + u32 wordr0[4]; + + wordr0[0] = c_combs[il_pos].i[0]; + wordr0[1] = c_combs[il_pos].i[1]; + wordr0[2] = c_combs[il_pos].i[2]; + wordr0[3] = c_combs[il_pos].i[3]; + + u32 wordr1[4]; + + wordr1[0] = c_combs[il_pos].i[4]; + wordr1[1] = c_combs[il_pos].i[5]; + wordr1[2] = c_combs[il_pos].i[6]; + wordr1[3] = c_combs[il_pos].i[7]; + + u32 wordr2[4]; + + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + + u32 wordr3[4]; + + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + u32x w0[4]; + + w0[0] = wordl0[0] | wordr0[0]; + w0[1] = wordl0[1] | wordr0[1]; + w0[2] = wordl0[2] | wordr0[2]; + w0[3] = wordl0[3] | wordr0[3]; + + u32x w1[4]; + + w1[0] = wordl1[0] | wordr1[0]; + w1[1] = wordl1[1] | wordr1[1]; + w1[2] = wordl1[2] | wordr1[2]; + w1[3] = wordl1[3] | wordr1[3]; + + u32x w2[4]; + + w2[0] = wordl2[0] | wordr2[0]; + w2[1] = wordl2[1] | wordr2[1]; + w2[2] = wordl2[2] | wordr2[2]; + w2[3] = wordl2[3] | wordr2[3]; + + u32x w3[4]; + + w3[0] = wordl3[0] | wordr3[0]; + w3[1] = wordl3[1] | wordr3[1]; + w3[2] = 0; + w3[3] = 0; + + append_0x80_4 (w0, w1, w2, w3, pw_len); + + w0_t[0] = w0[0]; + w0_t[1] = w0[1]; + w0_t[2] = w0[2]; + w0_t[3] = w0[3]; + w1_t[0] = w1[0]; + w1_t[1] = w1[1]; + w1_t[2] = w1[2]; + w1_t[3] = w1[3]; + w2_t[0] = w2[0]; + w2_t[1] = w2[1]; + w2_t[2] = w2[2]; + w2_t[3] = w2[3]; + w3_t[0] = w3[0]; + w3_t[1] = w3[1]; + w3_t[2] = (64 + pw_len) * 8; + w3_t[3] = 0; + + u32x digest[4]; + + hmac_md5_run (w0_t, w1_t, w2_t, w3_t, ipad, opad, digest); + + const u32x r0 = digest[0]; + const u32x r1 = digest[3]; + const u32x r2 = digest[2]; + const u32x r3 = digest[1]; + + #include VECT_COMPARE_M + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m00060_m08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m00060_m16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m00060_s04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, c_combs[0].pw_len); + } + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[ 1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[ 2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[ 3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[ 4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[ 5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[ 6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[ 7]; + + /** + * pads + */ + + u32x w0_t[4]; + + w0_t[0] = salt_buf0[0]; + w0_t[1] = salt_buf0[1]; + w0_t[2] = salt_buf0[2]; + w0_t[3] = salt_buf0[3]; + + u32x w1_t[4]; + + w1_t[0] = salt_buf1[0]; + w1_t[1] = salt_buf1[1]; + w1_t[2] = salt_buf1[2]; + w1_t[3] = salt_buf1[3]; + + u32x w2_t[4]; + + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + + u32x w3_t[4]; + + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = 0; + + u32x ipad[4]; + u32x opad[4]; + + hmac_md5_pad (w0_t, w1_t, w2_t, w3_t, ipad, opad); + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = c_combs[il_pos].pw_len; + + const u32 pw_len = pw_l_len + pw_r_len; + + u32 wordr0[4]; + + wordr0[0] = c_combs[il_pos].i[0]; + wordr0[1] = c_combs[il_pos].i[1]; + wordr0[2] = c_combs[il_pos].i[2]; + wordr0[3] = c_combs[il_pos].i[3]; + + u32 wordr1[4]; + + wordr1[0] = c_combs[il_pos].i[4]; + wordr1[1] = c_combs[il_pos].i[5]; + wordr1[2] = c_combs[il_pos].i[6]; + wordr1[3] = c_combs[il_pos].i[7]; + + u32 wordr2[4]; + + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + + u32 wordr3[4]; + + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + u32x w0[4]; + + w0[0] = wordl0[0] | wordr0[0]; + w0[1] = wordl0[1] | wordr0[1]; + w0[2] = wordl0[2] | wordr0[2]; + w0[3] = wordl0[3] | wordr0[3]; + + u32x w1[4]; + + w1[0] = wordl1[0] | wordr1[0]; + w1[1] = wordl1[1] | wordr1[1]; + w1[2] = wordl1[2] | wordr1[2]; + w1[3] = wordl1[3] | wordr1[3]; + + u32x w2[4]; + + w2[0] = wordl2[0] | wordr2[0]; + w2[1] = wordl2[1] | wordr2[1]; + w2[2] = wordl2[2] | wordr2[2]; + w2[3] = wordl2[3] | wordr2[3]; + + u32x w3[4]; + + w3[0] = wordl3[0] | wordr3[0]; + w3[1] = wordl3[1] | wordr3[1]; + w3[2] = 0; + w3[3] = 0; + + append_0x80_4 (w0, w1, w2, w3, pw_len); + + w0_t[0] = w0[0]; + w0_t[1] = w0[1]; + w0_t[2] = w0[2]; + w0_t[3] = w0[3]; + w1_t[0] = w1[0]; + w1_t[1] = w1[1]; + w1_t[2] = w1[2]; + w1_t[3] = w1[3]; + w2_t[0] = w2[0]; + w2_t[1] = w2[1]; + w2_t[2] = w2[2]; + w2_t[3] = w2[3]; + w3_t[0] = w3[0]; + w3_t[1] = w3[1]; + w3_t[2] = (64 + pw_len) * 8; + w3_t[3] = 0; + + u32x digest[4]; + + hmac_md5_run (w0_t, w1_t, w2_t, w3_t, ipad, opad, digest); + + const u32x r0 = digest[0]; + const u32x r1 = digest[3]; + const u32x r2 = digest[2]; + const u32x r3 = digest[1]; + + #include VECT_COMPARE_S + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m00060_s08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m00060_s16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/nv/m00060_a3.cu b/nv/m00060_a3.cu new file mode 100644 index 0000000000..b55d58b9af --- /dev/null +++ b/nv/m00060_a3.cu @@ -0,0 +1,738 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _MD5_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW2 +#define VECT_SIZE4 +#endif + +#define DGST_R0 0 +#define DGST_R1 3 +#define DGST_R2 2 +#define DGST_R3 1 + +#include "include/kernel_functions.c" +#include "types_nv.c" +#include "common_nv.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +__device__ static void md5_transform (const u32x w0[4], const u32x w1[4], const u32x w2[4], const u32x w3[4], u32x digest[4]) +{ + u32x a = digest[0]; + u32x b = digest[1]; + u32x c = digest[2]; + u32x d = digest[3]; + + u32x w0_t = w0[0]; + u32x w1_t = w0[1]; + u32x w2_t = w0[2]; + u32x w3_t = w0[3]; + u32x w4_t = w1[0]; + u32x w5_t = w1[1]; + u32x w6_t = w1[2]; + u32x w7_t = w1[3]; + u32x w8_t = w2[0]; + u32x w9_t = w2[1]; + u32x wa_t = w2[2]; + u32x wb_t = w2[3]; + u32x wc_t = w3[0]; + u32x wd_t = w3[1]; + u32x we_t = w3[2]; + u32x wf_t = w3[3]; + + u32x tmp2; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t, MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t, MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t, MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t, MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w4_t, MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w5_t, MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w6_t, MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w7_t, MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w8_t, MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w9_t, MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, wa_t, MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, wb_t, MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, wc_t, MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, wd_t, MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, we_t, MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, wf_t, MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w1_t, MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w6_t, MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, wb_t, MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t, MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w5_t, MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, wa_t, MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, wf_t, MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w4_t, MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w9_t, MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, we_t, MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t, MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w8_t, MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, wd_t, MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t, MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w7_t, MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, wc_t, MD5C1f, MD5S13); + + MD5_STEP (MD5_H1, a, b, c, d, w5_t, MD5C20, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w8_t, MD5C21, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, wb_t, MD5C22, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, we_t, MD5C23, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w1_t, MD5C24, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w4_t, MD5C25, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w7_t, MD5C26, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, wa_t, MD5C27, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, wd_t, MD5C28, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w0_t, MD5C29, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w3_t, MD5C2a, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w6_t, MD5C2b, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w9_t, MD5C2c, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, wc_t, MD5C2d, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, wf_t, MD5C2e, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w2_t, MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t, MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w7_t, MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, we_t, MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w5_t, MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, wc_t, MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t, MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, wa_t, MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t, MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w8_t, MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, wf_t, MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w6_t, MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, wd_t, MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w4_t, MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, wb_t, MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t, MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w9_t, MD5C3f, MD5S33); + + digest[0] += a; + digest[1] += b; + digest[2] += c; + digest[3] += d; +} + +__device__ static void hmac_md5_pad (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], u32x ipad[4], u32x opad[4]) +{ + w0[0] = w0[0] ^ 0x36363636; + w0[1] = w0[1] ^ 0x36363636; + w0[2] = w0[2] ^ 0x36363636; + w0[3] = w0[3] ^ 0x36363636; + w1[0] = w1[0] ^ 0x36363636; + w1[1] = w1[1] ^ 0x36363636; + w1[2] = w1[2] ^ 0x36363636; + w1[3] = w1[3] ^ 0x36363636; + w2[0] = w2[0] ^ 0x36363636; + w2[1] = w2[1] ^ 0x36363636; + w2[2] = w2[2] ^ 0x36363636; + w2[3] = w2[3] ^ 0x36363636; + w3[0] = w3[0] ^ 0x36363636; + w3[1] = w3[1] ^ 0x36363636; + w3[2] = w3[2] ^ 0x36363636; + w3[3] = w3[3] ^ 0x36363636; + + ipad[0] = MD5M_A; + ipad[1] = MD5M_B; + ipad[2] = MD5M_C; + ipad[3] = MD5M_D; + + md5_transform (w0, w1, w2, w3, ipad); + + w0[0] = w0[0] ^ 0x6a6a6a6a; + w0[1] = w0[1] ^ 0x6a6a6a6a; + w0[2] = w0[2] ^ 0x6a6a6a6a; + w0[3] = w0[3] ^ 0x6a6a6a6a; + w1[0] = w1[0] ^ 0x6a6a6a6a; + w1[1] = w1[1] ^ 0x6a6a6a6a; + w1[2] = w1[2] ^ 0x6a6a6a6a; + w1[3] = w1[3] ^ 0x6a6a6a6a; + w2[0] = w2[0] ^ 0x6a6a6a6a; + w2[1] = w2[1] ^ 0x6a6a6a6a; + w2[2] = w2[2] ^ 0x6a6a6a6a; + w2[3] = w2[3] ^ 0x6a6a6a6a; + w3[0] = w3[0] ^ 0x6a6a6a6a; + w3[1] = w3[1] ^ 0x6a6a6a6a; + w3[2] = w3[2] ^ 0x6a6a6a6a; + w3[3] = w3[3] ^ 0x6a6a6a6a; + + opad[0] = MD5M_A; + opad[1] = MD5M_B; + opad[2] = MD5M_C; + opad[3] = MD5M_D; + + md5_transform (w0, w1, w2, w3, opad); +} + +__device__ static void hmac_md5_run (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], u32x ipad[4], u32x opad[4], u32x digest[4]) +{ + digest[0] = ipad[0]; + digest[1] = ipad[1]; + digest[2] = ipad[2]; + digest[3] = ipad[3]; + + md5_transform (w0, w1, w2, w3, digest); + + w0[0] = digest[0]; + w0[1] = digest[1]; + w0[2] = digest[2]; + w0[3] = digest[3]; + w1[0] = 0x80; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + w3[0] = 0; + w3[1] = 0; + w3[2] = (64 + 16) * 8; + w3[3] = 0; + + digest[0] = opad[0]; + digest[1] = opad[1]; + digest[2] = opad[2]; + digest[3] = opad[3]; + + md5_transform (w0, w1, w2, w3, digest); +} + +__device__ __constant__ bf_t c_bfs[1024]; + +__device__ static void m00060m (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], const u32 pw_len, const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset) +{ + /** + * modifier + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + const u32 lid = threadIdx.x; + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[ 1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[ 2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[ 3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[ 4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[ 5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[ 6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[ 7]; + + /** + * pads + */ + + u32x w0_t[4]; + + w0_t[0] = salt_buf0[0]; + w0_t[1] = salt_buf0[1]; + w0_t[2] = salt_buf0[2]; + w0_t[3] = salt_buf0[3]; + + u32x w1_t[4]; + + w1_t[0] = salt_buf1[0]; + w1_t[1] = salt_buf1[1]; + w1_t[2] = salt_buf1[2]; + w1_t[3] = salt_buf1[3]; + + u32x w2_t[4]; + + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + + u32x w3_t[4]; + + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = 0; + + u32x ipad[4]; + u32x opad[4]; + + hmac_md5_pad (w0_t, w1_t, w2_t, w3_t, ipad, opad); + + /** + * loop + */ + + u32x w0l = w0[0]; + + for (u32 il_pos = 0; il_pos < bfs_cnt; il_pos++) + { + const u32 w0r = c_bfs[il_pos].i; + + w0[0] = w0l | w0r; + + append_0x80_4 (w0, w1, w2, w3, pw_len); + + w0_t[0] = w0[0]; + w0_t[1] = w0[1]; + w0_t[2] = w0[2]; + w0_t[3] = w0[3]; + w1_t[0] = w1[0]; + w1_t[1] = w1[1]; + w1_t[2] = w1[2]; + w1_t[3] = w1[3]; + w2_t[0] = w2[0]; + w2_t[1] = w2[1]; + w2_t[2] = w2[2]; + w2_t[3] = w2[3]; + w3_t[0] = w3[0]; + w3_t[1] = w3[1]; + w3_t[2] = (64 + pw_len) * 8; + w3_t[3] = 0; + + u32x digest[4]; + + hmac_md5_run (w0_t, w1_t, w2_t, w3_t, ipad, opad, digest); + + const u32x r0 = digest[0]; + const u32x r1 = digest[3]; + const u32x r2 = digest[2]; + const u32x r3 = digest[1]; + + #include VECT_COMPARE_M + } +} + +__device__ static void m00060s (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], const u32 pw_len, const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset) +{ + /** + * modifier + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + const u32 lid = threadIdx.x; + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[ 1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[ 2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[ 3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[ 4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[ 5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[ 6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[ 7]; + + /** + * pads + */ + + u32x w0_t[4]; + + w0_t[0] = salt_buf0[0]; + w0_t[1] = salt_buf0[1]; + w0_t[2] = salt_buf0[2]; + w0_t[3] = salt_buf0[3]; + + u32x w1_t[4]; + + w1_t[0] = salt_buf1[0]; + w1_t[1] = salt_buf1[1]; + w1_t[2] = salt_buf1[2]; + w1_t[3] = salt_buf1[3]; + + u32x w2_t[4]; + + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + + u32x w3_t[4]; + + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = 0; + + u32x ipad[4]; + u32x opad[4]; + + hmac_md5_pad (w0_t, w1_t, w2_t, w3_t, ipad, opad); + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * loop + */ + + u32x w0l = w0[0]; + + for (u32 il_pos = 0; il_pos < bfs_cnt; il_pos++) + { + const u32 w0r = c_bfs[il_pos].i; + + w0[0] = w0l | w0r; + + append_0x80_4 (w0, w1, w2, w3, pw_len); + + w0_t[0] = w0[0]; + w0_t[1] = w0[1]; + w0_t[2] = w0[2]; + w0_t[3] = w0[3]; + w1_t[0] = w1[0]; + w1_t[1] = w1[1]; + w1_t[2] = w1[2]; + w1_t[3] = w1[3]; + w2_t[0] = w2[0]; + w2_t[1] = w2[1]; + w2_t[2] = w2[2]; + w2_t[3] = w2[3]; + w3_t[0] = w3[0]; + w3_t[1] = w3[1]; + w3_t[2] = (64 + pw_len) * 8; + w3_t[3] = 0; + + u32x digest[4]; + + hmac_md5_run (w0_t, w1_t, w2_t, w3_t, ipad, opad, digest); + + const u32x r0 = digest[0]; + const u32x r1 = digest[3]; + const u32x r2 = digest[2]; + const u32x r3 = digest[1]; + + #include VECT_COMPARE_S + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m00060_m04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m00060m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m00060_m08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m00060m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m00060_m16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = pws[gid].i[ 8]; + w2[1] = pws[gid].i[ 9]; + w2[2] = pws[gid].i[10]; + w2[3] = pws[gid].i[11]; + + u32x w3[4]; + + w3[0] = pws[gid].i[12]; + w3[1] = pws[gid].i[13]; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m00060m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m00060_s04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m00060s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m00060_s08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m00060s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m00060_s16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = pws[gid].i[ 8]; + w2[1] = pws[gid].i[ 9]; + w2[2] = pws[gid].i[10]; + w2[3] = pws[gid].i[11]; + + u32x w3[4]; + + w3[0] = pws[gid].i[12]; + w3[1] = pws[gid].i[13]; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m00060s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} diff --git a/nv/m00100_a0.cu b/nv/m00100_a0.cu new file mode 100644 index 0000000000..fb3167410d --- /dev/null +++ b/nv/m00100_a0.cu @@ -0,0 +1,488 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _SHA1_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW2 +#define VECT_SIZE1 +#endif + +#define DGST_R0 3 +#define DGST_R1 4 +#define DGST_R2 2 +#define DGST_R3 1 + +#include "include/kernel_functions.c" +#include "types_nv.c" +#include "common_nv.c" +#include "include/rp_gpu.h" +#include "rp_nv.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +__device__ __constant__ gpu_rule_t c_rules[1024]; + +extern "C" __global__ void __launch_bounds__ (256, 1) m00100_m04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + u32x pw_buf1[4]; + + pw_buf1[0] = pws[gid].i[ 4]; + pw_buf1[1] = pws[gid].i[ 5]; + pw_buf1[2] = pws[gid].i[ 6]; + pw_buf1[3] = pws[gid].i[ 7]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + + w0[0] = pw_buf0[0]; + w0[1] = pw_buf0[1]; + w0[2] = pw_buf0[2]; + w0[3] = pw_buf0[3]; + + u32x w1[4]; + + w1[0] = pw_buf1[0]; + w1[1] = pw_buf1[1]; + w1[2] = pw_buf1[2]; + w1[3] = pw_buf1[3]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 out_len = apply_rules (c_rules[il_pos].cmds, w0, w1, pw_len); + + append_0x80_2 (w0, w1, out_len); + + /** + * sha1 + */ + + u32x w0_t = swap_workaround (w0[0]); + u32x w1_t = swap_workaround (w0[1]); + u32x w2_t = swap_workaround (w0[2]); + u32x w3_t = swap_workaround (w0[3]); + u32x w4_t = swap_workaround (w1[0]); + u32x w5_t = swap_workaround (w1[1]); + u32x w6_t = swap_workaround (w1[2]); + u32x w7_t = swap_workaround (w1[3]); + u32x w8_t = swap_workaround (w2[0]); + u32x w9_t = swap_workaround (w2[1]); + u32x wa_t = swap_workaround (w2[2]); + u32x wb_t = swap_workaround (w2[3]); + u32x wc_t = swap_workaround (w3[0]); + u32x wd_t = swap_workaround (w3[1]); + u32x we_t = 0; + u32x wf_t = out_len * 8; + + u32x a = SHA1M_A; + u32x b = SHA1M_B; + u32x c = SHA1M_C; + u32x d = SHA1M_D; + u32x e = SHA1M_E; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w0_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w1_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w2_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w3_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w4_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w5_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w6_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w7_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w8_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w9_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wa_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, wb_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, wc_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, wd_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, we_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F0o, e, a, b, c, d, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F0o, d, e, a, b, c, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F0o, c, d, e, a, b, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F0o, b, c, d, e, a, w3_t); + + #undef K + #define K SHA1C01 + + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w7_t); + + #undef K + #define K SHA1C02 + + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wb_t); + + #undef K + #define K SHA1C03 + + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wf_t); + + + const u32x r0 = d; + const u32x r1 = e; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_M + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m00100_m08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m00100_m16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m00100_s04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + u32x pw_buf1[4]; + + pw_buf1[0] = pws[gid].i[ 4]; + pw_buf1[1] = pws[gid].i[ 5]; + pw_buf1[2] = pws[gid].i[ 6]; + pw_buf1[3] = pws[gid].i[ 7]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3], + }; + + /** + * reverse + */ + + const u32 e_rev = rotl32 (search[1], 2u); + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + + w0[0] = pw_buf0[0]; + w0[1] = pw_buf0[1]; + w0[2] = pw_buf0[2]; + w0[3] = pw_buf0[3]; + + u32x w1[4]; + + w1[0] = pw_buf1[0]; + w1[1] = pw_buf1[1]; + w1[2] = pw_buf1[2]; + w1[3] = pw_buf1[3]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 out_len = apply_rules (c_rules[il_pos].cmds, w0, w1, pw_len); + + append_0x80_2 (w0, w1, out_len); + + /** + * sha1 + */ + + u32x w0_t = swap_workaround (w0[0]); + u32x w1_t = swap_workaround (w0[1]); + u32x w2_t = swap_workaround (w0[2]); + u32x w3_t = swap_workaround (w0[3]); + u32x w4_t = swap_workaround (w1[0]); + u32x w5_t = swap_workaround (w1[1]); + u32x w6_t = swap_workaround (w1[2]); + u32x w7_t = swap_workaround (w1[3]); + u32x w8_t = swap_workaround (w2[0]); + u32x w9_t = swap_workaround (w2[1]); + u32x wa_t = swap_workaround (w2[2]); + u32x wb_t = swap_workaround (w2[3]); + u32x wc_t = swap_workaround (w3[0]); + u32x wd_t = swap_workaround (w3[1]); + u32x we_t = 0; + u32x wf_t = out_len * 8; + + u32x a = SHA1M_A; + u32x b = SHA1M_B; + u32x c = SHA1M_C; + u32x d = SHA1M_D; + u32x e = SHA1M_E; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w0_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w1_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w2_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w3_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w4_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w5_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w6_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w7_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w8_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w9_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wa_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, wb_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, wc_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, wd_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, we_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F0o, e, a, b, c, d, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F0o, d, e, a, b, c, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F0o, c, d, e, a, b, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F0o, b, c, d, e, a, w3_t); + + #undef K + #define K SHA1C01 + + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w7_t); + + #undef K + #define K SHA1C02 + + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wb_t); + + #undef K + #define K SHA1C03 + + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wb_t); + + if (e != e_rev) continue; + + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wf_t); + + + const u32x r0 = d; + const u32x r1 = e; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_S + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m00100_s08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m00100_s16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/nv/m00100_a1.cu b/nv/m00100_a1.cu new file mode 100644 index 0000000000..db0d411909 --- /dev/null +++ b/nv/m00100_a1.cu @@ -0,0 +1,598 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _SHA1_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW2 +#define VECT_SIZE4 +#endif + +#define DGST_R0 3 +#define DGST_R1 4 +#define DGST_R2 2 +#define DGST_R3 1 + +#include "include/kernel_functions.c" +#include "types_nv.c" +#include "common_nv.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +__device__ __constant__ comb_t c_combs[1024]; + +extern "C" __global__ void __launch_bounds__ (256, 1) m00100_m04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + append_0x80_2 (wordl0, wordl1, pw_l_len); + + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, c_combs[0].pw_len); + } + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = c_combs[il_pos].pw_len; + + const u32 pw_len = pw_l_len + pw_r_len; + + u32 wordr0[4]; + + wordr0[0] = c_combs[il_pos].i[0]; + wordr0[1] = c_combs[il_pos].i[1]; + wordr0[2] = c_combs[il_pos].i[2]; + wordr0[3] = c_combs[il_pos].i[3]; + + u32 wordr1[4]; + + wordr1[0] = c_combs[il_pos].i[4]; + wordr1[1] = c_combs[il_pos].i[5]; + wordr1[2] = c_combs[il_pos].i[6]; + wordr1[3] = c_combs[il_pos].i[7]; + + u32 wordr2[4]; + + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + + u32 wordr3[4]; + + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + append_0x80_2 (wordr0, wordr1, pw_r_len); + + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + u32x w0[4]; + + w0[0] = wordl0[0] | wordr0[0]; + w0[1] = wordl0[1] | wordr0[1]; + w0[2] = wordl0[2] | wordr0[2]; + w0[3] = wordl0[3] | wordr0[3]; + + u32x w1[4]; + + w1[0] = wordl1[0] | wordr1[0]; + w1[1] = wordl1[1] | wordr1[1]; + w1[2] = wordl1[2] | wordr1[2]; + w1[3] = wordl1[3] | wordr1[3]; + + u32x w2[4]; + + w2[0] = wordl2[0] | wordr2[0]; + w2[1] = wordl2[1] | wordr2[1]; + w2[2] = wordl2[2] | wordr2[2]; + w2[3] = wordl2[3] | wordr2[3]; + + u32x w3[4]; + + w3[0] = wordl3[0] | wordr3[0]; + w3[1] = wordl3[1] | wordr3[1]; + w3[2] = 0; + w3[3] = 0; + + /** + * sha1 + */ + + u32x w0_t = swap_workaround (w0[0]); + u32x w1_t = swap_workaround (w0[1]); + u32x w2_t = swap_workaround (w0[2]); + u32x w3_t = swap_workaround (w0[3]); + u32x w4_t = swap_workaround (w1[0]); + u32x w5_t = swap_workaround (w1[1]); + u32x w6_t = swap_workaround (w1[2]); + u32x w7_t = swap_workaround (w1[3]); + u32x w8_t = swap_workaround (w2[0]); + u32x w9_t = swap_workaround (w2[1]); + u32x wa_t = swap_workaround (w2[2]); + u32x wb_t = swap_workaround (w2[3]); + u32x wc_t = swap_workaround (w3[0]); + u32x wd_t = swap_workaround (w3[1]); + u32x we_t = 0; + u32x wf_t = pw_len * 8; + + u32x a = SHA1M_A; + u32x b = SHA1M_B; + u32x c = SHA1M_C; + u32x d = SHA1M_D; + u32x e = SHA1M_E; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w0_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w1_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w2_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w3_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w4_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w5_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w6_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w7_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w8_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w9_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wa_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, wb_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, wc_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, wd_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, we_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F0o, e, a, b, c, d, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F0o, d, e, a, b, c, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F0o, c, d, e, a, b, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F0o, b, c, d, e, a, w3_t); + + #undef K + #define K SHA1C01 + + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w7_t); + + #undef K + #define K SHA1C02 + + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wb_t); + + #undef K + #define K SHA1C03 + + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wf_t); + + + const u32x r0 = d; + const u32x r1 = e; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_M + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m00100_m08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m00100_m16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m00100_s04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + append_0x80_2 (wordl0, wordl1, pw_l_len); + + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, c_combs[0].pw_len); + } + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3], + }; + + /** + * reverse + */ + + const u32 e_rev = rotl32 (search[1], 2u); + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = c_combs[il_pos].pw_len; + + const u32 pw_len = pw_l_len + pw_r_len; + + u32 wordr0[4]; + + wordr0[0] = c_combs[il_pos].i[0]; + wordr0[1] = c_combs[il_pos].i[1]; + wordr0[2] = c_combs[il_pos].i[2]; + wordr0[3] = c_combs[il_pos].i[3]; + + u32 wordr1[4]; + + wordr1[0] = c_combs[il_pos].i[4]; + wordr1[1] = c_combs[il_pos].i[5]; + wordr1[2] = c_combs[il_pos].i[6]; + wordr1[3] = c_combs[il_pos].i[7]; + + u32 wordr2[4]; + + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + + u32 wordr3[4]; + + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + append_0x80_2 (wordr0, wordr1, pw_r_len); + + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + u32x w0[4]; + + w0[0] = wordl0[0] | wordr0[0]; + w0[1] = wordl0[1] | wordr0[1]; + w0[2] = wordl0[2] | wordr0[2]; + w0[3] = wordl0[3] | wordr0[3]; + + u32x w1[4]; + + w1[0] = wordl1[0] | wordr1[0]; + w1[1] = wordl1[1] | wordr1[1]; + w1[2] = wordl1[2] | wordr1[2]; + w1[3] = wordl1[3] | wordr1[3]; + + u32x w2[4]; + + w2[0] = wordl2[0] | wordr2[0]; + w2[1] = wordl2[1] | wordr2[1]; + w2[2] = wordl2[2] | wordr2[2]; + w2[3] = wordl2[3] | wordr2[3]; + + u32x w3[4]; + + w3[0] = wordl3[0] | wordr3[0]; + w3[1] = wordl3[1] | wordr3[1]; + w3[2] = 0; + w3[3] = 0; + + /** + * sha1 + */ + + u32x w0_t = swap_workaround (w0[0]); + u32x w1_t = swap_workaround (w0[1]); + u32x w2_t = swap_workaround (w0[2]); + u32x w3_t = swap_workaround (w0[3]); + u32x w4_t = swap_workaround (w1[0]); + u32x w5_t = swap_workaround (w1[1]); + u32x w6_t = swap_workaround (w1[2]); + u32x w7_t = swap_workaround (w1[3]); + u32x w8_t = swap_workaround (w2[0]); + u32x w9_t = swap_workaround (w2[1]); + u32x wa_t = swap_workaround (w2[2]); + u32x wb_t = swap_workaround (w2[3]); + u32x wc_t = swap_workaround (w3[0]); + u32x wd_t = swap_workaround (w3[1]); + u32x we_t = 0; + u32x wf_t = pw_len * 8; + + u32x a = SHA1M_A; + u32x b = SHA1M_B; + u32x c = SHA1M_C; + u32x d = SHA1M_D; + u32x e = SHA1M_E; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w0_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w1_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w2_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w3_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w4_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w5_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w6_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w7_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w8_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w9_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wa_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, wb_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, wc_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, wd_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, we_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F0o, e, a, b, c, d, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F0o, d, e, a, b, c, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F0o, c, d, e, a, b, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F0o, b, c, d, e, a, w3_t); + + #undef K + #define K SHA1C01 + + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w7_t); + + #undef K + #define K SHA1C02 + + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wb_t); + + #undef K + #define K SHA1C03 + + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wb_t); + + if (e != e_rev) continue; + + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wf_t); + + + const u32x r0 = d; + const u32x r1 = e; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_S + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m00100_s08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m00100_s16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/nv/m00100_a3.cu b/nv/m00100_a3.cu new file mode 100644 index 0000000000..88cacefe39 --- /dev/null +++ b/nv/m00100_a3.cu @@ -0,0 +1,830 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _SHA1_ +#define _SCALAR_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW2 +#define VECT_SIZE4 +#endif + +#define DGST_R0 3 +#define DGST_R1 4 +#define DGST_R2 2 +#define DGST_R3 1 + +#include "include/kernel_functions.c" +#include "types_nv.c" +#include "common_nv.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4_warp.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4_warp.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4_warp.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4_warp.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4_warp.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4_warp.c" +#endif + +__device__ __constant__ u32x c_bfs[1024]; + +__device__ static void m00100m (u32 w[16], const u32 pw_len, const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const u32x *words_buf_r, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset) +{ + /** + * modifier + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 c_16s = rotl32 ((w[13] ^ w[ 8] ^ w[ 2] ), 1u); + const u32 c_17s = rotl32 ((w[14] ^ w[ 9] ^ w[ 3] ^ w[ 1]), 1u); + const u32 c_18s = rotl32 ((w[15] ^ w[10] ^ w[ 4] ^ w[ 2]), 1u); + const u32 c_19s = rotl32 ((c_16s ^ w[11] ^ w[ 5] ^ w[ 3]), 1u); + const u32 c_20s = rotl32 ((c_17s ^ w[12] ^ w[ 6] ^ w[ 4]), 1u); + const u32 c_21s = rotl32 ((c_18s ^ w[13] ^ w[ 7] ^ w[ 5]), 1u); + const u32 c_22s = rotl32 ((c_19s ^ w[14] ^ w[ 8] ^ w[ 6]), 1u); + const u32 c_23s = rotl32 ((c_20s ^ w[15] ^ w[ 9] ^ w[ 7]), 1u); + const u32 c_24s = rotl32 ((c_21s ^ c_16s ^ w[10] ^ w[ 8]), 1u); + const u32 c_25s = rotl32 ((c_22s ^ c_17s ^ w[11] ^ w[ 9]), 1u); + const u32 c_26s = rotl32 ((c_23s ^ c_18s ^ w[12] ^ w[10]), 1u); + const u32 c_27s = rotl32 ((c_24s ^ c_19s ^ w[13] ^ w[11]), 1u); + const u32 c_28s = rotl32 ((c_25s ^ c_20s ^ w[14] ^ w[12]), 1u); + const u32 c_29s = rotl32 ((c_26s ^ c_21s ^ w[15] ^ w[13]), 1u); + const u32 c_30s = rotl32 ((c_27s ^ c_22s ^ c_16s ^ w[14]), 1u); + const u32 c_31s = rotl32 ((c_28s ^ c_23s ^ c_17s ^ w[15]), 1u); + const u32 c_32s = rotl32 ((c_29s ^ c_24s ^ c_18s ^ c_16s), 1u); + const u32 c_33s = rotl32 ((c_30s ^ c_25s ^ c_19s ^ c_17s), 1u); + const u32 c_34s = rotl32 ((c_31s ^ c_26s ^ c_20s ^ c_18s), 1u); + const u32 c_35s = rotl32 ((c_32s ^ c_27s ^ c_21s ^ c_19s), 1u); + const u32 c_36s = rotl32 ((c_33s ^ c_28s ^ c_22s ^ c_20s), 1u); + const u32 c_37s = rotl32 ((c_34s ^ c_29s ^ c_23s ^ c_21s), 1u); + const u32 c_38s = rotl32 ((c_35s ^ c_30s ^ c_24s ^ c_22s), 1u); + const u32 c_39s = rotl32 ((c_36s ^ c_31s ^ c_25s ^ c_23s), 1u); + const u32 c_40s = rotl32 ((c_37s ^ c_32s ^ c_26s ^ c_24s), 1u); + const u32 c_41s = rotl32 ((c_38s ^ c_33s ^ c_27s ^ c_25s), 1u); + const u32 c_42s = rotl32 ((c_39s ^ c_34s ^ c_28s ^ c_26s), 1u); + const u32 c_43s = rotl32 ((c_40s ^ c_35s ^ c_29s ^ c_27s), 1u); + const u32 c_44s = rotl32 ((c_41s ^ c_36s ^ c_30s ^ c_28s), 1u); + const u32 c_45s = rotl32 ((c_42s ^ c_37s ^ c_31s ^ c_29s), 1u); + const u32 c_46s = rotl32 ((c_43s ^ c_38s ^ c_32s ^ c_30s), 1u); + const u32 c_47s = rotl32 ((c_44s ^ c_39s ^ c_33s ^ c_31s), 1u); + const u32 c_48s = rotl32 ((c_45s ^ c_40s ^ c_34s ^ c_32s), 1u); + const u32 c_49s = rotl32 ((c_46s ^ c_41s ^ c_35s ^ c_33s), 1u); + const u32 c_50s = rotl32 ((c_47s ^ c_42s ^ c_36s ^ c_34s), 1u); + const u32 c_51s = rotl32 ((c_48s ^ c_43s ^ c_37s ^ c_35s), 1u); + const u32 c_52s = rotl32 ((c_49s ^ c_44s ^ c_38s ^ c_36s), 1u); + const u32 c_53s = rotl32 ((c_50s ^ c_45s ^ c_39s ^ c_37s), 1u); + const u32 c_54s = rotl32 ((c_51s ^ c_46s ^ c_40s ^ c_38s), 1u); + const u32 c_55s = rotl32 ((c_52s ^ c_47s ^ c_41s ^ c_39s), 1u); + const u32 c_56s = rotl32 ((c_53s ^ c_48s ^ c_42s ^ c_40s), 1u); + const u32 c_57s = rotl32 ((c_54s ^ c_49s ^ c_43s ^ c_41s), 1u); + const u32 c_58s = rotl32 ((c_55s ^ c_50s ^ c_44s ^ c_42s), 1u); + const u32 c_59s = rotl32 ((c_56s ^ c_51s ^ c_45s ^ c_43s), 1u); + const u32 c_60s = rotl32 ((c_57s ^ c_52s ^ c_46s ^ c_44s), 1u); + const u32 c_61s = rotl32 ((c_58s ^ c_53s ^ c_47s ^ c_45s), 1u); + const u32 c_62s = rotl32 ((c_59s ^ c_54s ^ c_48s ^ c_46s), 1u); + const u32 c_63s = rotl32 ((c_60s ^ c_55s ^ c_49s ^ c_47s), 1u); + const u32 c_64s = rotl32 ((c_61s ^ c_56s ^ c_50s ^ c_48s), 1u); + const u32 c_65s = rotl32 ((c_62s ^ c_57s ^ c_51s ^ c_49s), 1u); + const u32 c_66s = rotl32 ((c_63s ^ c_58s ^ c_52s ^ c_50s), 1u); + const u32 c_67s = rotl32 ((c_64s ^ c_59s ^ c_53s ^ c_51s), 1u); + const u32 c_68s = rotl32 ((c_65s ^ c_60s ^ c_54s ^ c_52s), 1u); + const u32 c_69s = rotl32 ((c_66s ^ c_61s ^ c_55s ^ c_53s), 1u); + const u32 c_70s = rotl32 ((c_67s ^ c_62s ^ c_56s ^ c_54s), 1u); + const u32 c_71s = rotl32 ((c_68s ^ c_63s ^ c_57s ^ c_55s), 1u); + const u32 c_72s = rotl32 ((c_69s ^ c_64s ^ c_58s ^ c_56s), 1u); + const u32 c_73s = rotl32 ((c_70s ^ c_65s ^ c_59s ^ c_57s), 1u); + const u32 c_74s = rotl32 ((c_71s ^ c_66s ^ c_60s ^ c_58s), 1u); + const u32 c_75s = rotl32 ((c_72s ^ c_67s ^ c_61s ^ c_59s), 1u); + const u32 c_76s = rotl32 ((c_73s ^ c_68s ^ c_62s ^ c_60s), 1u); + const u32 c_77s = rotl32 ((c_74s ^ c_69s ^ c_63s ^ c_61s), 1u); + const u32 c_78s = rotl32 ((c_75s ^ c_70s ^ c_64s ^ c_62s), 1u); + const u32 c_79s = rotl32 ((c_76s ^ c_71s ^ c_65s ^ c_63s), 1u); + + const u32 c_17sK = c_17s + SHA1C00; + const u32 c_18sK = c_18s + SHA1C00; + const u32 c_20sK = c_20s + SHA1C01; + const u32 c_21sK = c_21s + SHA1C01; + const u32 c_23sK = c_23s + SHA1C01; + const u32 c_26sK = c_26s + SHA1C01; + const u32 c_27sK = c_27s + SHA1C01; + const u32 c_29sK = c_29s + SHA1C01; + const u32 c_33sK = c_33s + SHA1C01; + const u32 c_39sK = c_39s + SHA1C01; + const u32 c_41sK = c_41s + SHA1C02; + const u32 c_45sK = c_45s + SHA1C02; + const u32 c_53sK = c_53s + SHA1C02; + const u32 c_65sK = c_65s + SHA1C03; + const u32 c_69sK = c_69s + SHA1C03; + + const u32 w1 = w[ 1] + SHA1C00; + const u32 w2 = w[ 2] + SHA1C00; + const u32 w3 = w[ 3] + SHA1C00; + const u32 w4 = w[ 4] + SHA1C00; + const u32 w5 = w[ 5] + SHA1C00; + const u32 w6 = w[ 6] + SHA1C00; + const u32 w7 = w[ 7] + SHA1C00; + const u32 w8 = w[ 8] + SHA1C00; + const u32 w9 = w[ 9] + SHA1C00; + const u32 wa = w[10] + SHA1C00; + const u32 wb = w[11] + SHA1C00; + const u32 wc = w[12] + SHA1C00; + const u32 wd = w[13] + SHA1C00; + const u32 we = w[14] + SHA1C00; + const u32 wf = w[15] + SHA1C00; + + /** + * loop + */ + + const u32 bf_loops = ceil ((float) bfs_cnt / VECT_DIV); + + u32x w0l = w[0]; + + for (u32 il_pos = 0; il_pos < bf_loops; il_pos++) + { + const u32x w0r = c_bfs[il_pos]; + + const u32x w0 = w0l | w0r; + + const u32x w0s01 = rotl32 (w0, 1u); + const u32x w0s02 = rotl32 (w0, 2u); + const u32x w0s03 = rotl32 (w0, 3u); + const u32x w0s04 = rotl32 (w0, 4u); + const u32x w0s05 = rotl32 (w0, 5u); + const u32x w0s06 = rotl32 (w0, 6u); + const u32x w0s07 = rotl32 (w0, 7u); + const u32x w0s08 = rotl32 (w0, 8u); + const u32x w0s09 = rotl32 (w0, 9u); + const u32x w0s10 = rotl32 (w0, 10u); + const u32x w0s11 = rotl32 (w0, 11u); + const u32x w0s12 = rotl32 (w0, 12u); + const u32x w0s13 = rotl32 (w0, 13u); + const u32x w0s14 = rotl32 (w0, 14u); + const u32x w0s15 = rotl32 (w0, 15u); + const u32x w0s16 = rotl32 (w0, 16u); + const u32x w0s17 = rotl32 (w0, 17u); + const u32x w0s18 = rotl32 (w0, 18u); + const u32x w0s19 = rotl32 (w0, 19u); + const u32x w0s20 = rotl32 (w0, 20u); + const u32x w0s21 = rotl32 (w0, 21u); + const u32x w0s22 = rotl32 (w0, 22U); + + const u32x w0s04___w0s06 = w0s04 ^ w0s06; + const u32x w0s04___w0s08 = w0s04 ^ w0s08; + const u32x w0s08___w0s12 = w0s08 ^ w0s12; + const u32x w0s04___w0s06___w0s07 = w0s04___w0s06 ^ w0s07; + + u32x a = SHA1M_A; + u32x b = SHA1M_B; + u32x c = SHA1M_C; + u32x d = SHA1M_D; + u32x e = SHA1M_E; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w0); + SHA1_STEPX(SHA1_F0o, e, a, b, c, d, w1); + SHA1_STEPX(SHA1_F0o, d, e, a, b, c, w2); + SHA1_STEPX(SHA1_F0o, c, d, e, a, b, w3); + SHA1_STEPX(SHA1_F0o, b, c, d, e, a, w4); + SHA1_STEPX(SHA1_F0o, a, b, c, d, e, w5); + SHA1_STEPX(SHA1_F0o, e, a, b, c, d, w6); + SHA1_STEPX(SHA1_F0o, d, e, a, b, c, w7); + SHA1_STEPX(SHA1_F0o, c, d, e, a, b, w8); + SHA1_STEPX(SHA1_F0o, b, c, d, e, a, w9); + SHA1_STEPX(SHA1_F0o, a, b, c, d, e, wa); + SHA1_STEPX(SHA1_F0o, e, a, b, c, d, wb); + SHA1_STEPX(SHA1_F0o, d, e, a, b, c, wc); + SHA1_STEPX(SHA1_F0o, c, d, e, a, b, wd); + SHA1_STEPX(SHA1_F0o, b, c, d, e, a, we); + SHA1_STEPX(SHA1_F0o, a, b, c, d, e, wf); + + SHA1_STEP (SHA1_F0o, e, a, b, c, d, (c_16s ^ w0s01)); + SHA1_STEPX(SHA1_F0o, d, e, a, b, c, (c_17sK)); + SHA1_STEPX(SHA1_F0o, c, d, e, a, b, (c_18sK)); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, (c_19s ^ w0s02)); + + #undef K + #define K SHA1C01 + + SHA1_STEPX(SHA1_F1 , a, b, c, d, e, (c_20sK)); + SHA1_STEPX(SHA1_F1 , e, a, b, c, d, (c_21sK)); + SHA1_STEP (SHA1_F1 , d, e, a, b, c, (c_22s ^ w0s03)); + SHA1_STEPX(SHA1_F1 , c, d, e, a, b, (c_23sK)); + SHA1_STEP (SHA1_F1 , b, c, d, e, a, (c_24s ^ w0s02)); + SHA1_STEP (SHA1_F1 , a, b, c, d, e, (c_25s ^ w0s04)); + SHA1_STEPX(SHA1_F1 , e, a, b, c, d, (c_26sK)); + SHA1_STEPX(SHA1_F1 , d, e, a, b, c, (c_27sK)); + SHA1_STEP (SHA1_F1 , c, d, e, a, b, (c_28s ^ w0s05)); + SHA1_STEPX(SHA1_F1 , b, c, d, e, a, (c_29sK)); + SHA1_STEP (SHA1_F1 , a, b, c, d, e, (c_30s ^ w0s02 ^ w0s04)); + SHA1_STEP (SHA1_F1 , e, a, b, c, d, (c_31s ^ w0s06)); + SHA1_STEP (SHA1_F1 , d, e, a, b, c, (c_32s ^ w0s02 ^ w0s03)); + SHA1_STEPX(SHA1_F1 , c, d, e, a, b, (c_33sK)); + SHA1_STEP (SHA1_F1 , b, c, d, e, a, (c_34s ^ w0s07)); + SHA1_STEP (SHA1_F1 , a, b, c, d, e, (c_35s ^ w0s04)); + SHA1_STEP (SHA1_F1 , e, a, b, c, d, (c_36s ^ w0s04___w0s06)); + SHA1_STEP (SHA1_F1 , d, e, a, b, c, (c_37s ^ w0s08)); + SHA1_STEP (SHA1_F1 , c, d, e, a, b, (c_38s ^ w0s04)); + SHA1_STEPX(SHA1_F1 , b, c, d, e, a, (c_39sK)); + + #undef K + #define K SHA1C02 + + SHA1_STEP (SHA1_F2o, a, b, c, d, e, (c_40s ^ w0s04 ^ w0s09)); + SHA1_STEPX(SHA1_F2o, e, a, b, c, d, (c_41sK)); + SHA1_STEP (SHA1_F2o, d, e, a, b, c, (c_42s ^ w0s06 ^ w0s08)); + SHA1_STEP (SHA1_F2o, c, d, e, a, b, (c_43s ^ w0s10)); + SHA1_STEP (SHA1_F2o, b, c, d, e, a, (c_44s ^ w0s03 ^ w0s06 ^ w0s07)); + SHA1_STEPX(SHA1_F2o, a, b, c, d, e, (c_45sK)); + SHA1_STEP (SHA1_F2o, e, a, b, c, d, (c_46s ^ w0s04 ^ w0s11)); + SHA1_STEP (SHA1_F2o, d, e, a, b, c, (c_47s ^ w0s04___w0s08)); + SHA1_STEP (SHA1_F2o, c, d, e, a, b, (c_48s ^ w0s03 ^ w0s04___w0s08 ^ w0s05 ^ w0s10)); + SHA1_STEP (SHA1_F2o, b, c, d, e, a, (c_49s ^ w0s12)); + SHA1_STEP (SHA1_F2o, a, b, c, d, e, (c_50s ^ w0s08)); + SHA1_STEP (SHA1_F2o, e, a, b, c, d, (c_51s ^ w0s04___w0s06)); + SHA1_STEP (SHA1_F2o, d, e, a, b, c, (c_52s ^ w0s04___w0s08 ^ w0s13)); + SHA1_STEPX(SHA1_F2o, c, d, e, a, b, (c_53sK)); + SHA1_STEP (SHA1_F2o, b, c, d, e, a, (c_54s ^ w0s07 ^ w0s10 ^ w0s12)); + SHA1_STEP (SHA1_F2o, a, b, c, d, e, (c_55s ^ w0s14)); + SHA1_STEP (SHA1_F2o, e, a, b, c, d, (c_56s ^ w0s04___w0s06___w0s07 ^ w0s10 ^ w0s11)); + SHA1_STEP (SHA1_F2o, d, e, a, b, c, (c_57s ^ w0s08)); + SHA1_STEP (SHA1_F2o, c, d, e, a, b, (c_58s ^ w0s04___w0s08 ^ w0s15)); + SHA1_STEP (SHA1_F2o, b, c, d, e, a, (c_59s ^ w0s08___w0s12)); + + #undef K + #define K SHA1C03 + + SHA1_STEP (SHA1_F1 , a, b, c, d, e, (c_60s ^ w0s04 ^ w0s08___w0s12 ^ w0s07 ^ w0s14)); + SHA1_STEP (SHA1_F1 , e, a, b, c, d, (c_61s ^ w0s16)); + SHA1_STEP (SHA1_F1 , d, e, a, b, c, (c_62s ^ w0s04___w0s06 ^ w0s08___w0s12)); + SHA1_STEP (SHA1_F1 , c, d, e, a, b, (c_63s ^ w0s08)); + SHA1_STEP (SHA1_F1 , b, c, d, e, a, (c_64s ^ w0s04___w0s06___w0s07 ^ w0s08___w0s12 ^ w0s17)); + SHA1_STEPX(SHA1_F1 , a, b, c, d, e, (c_65sK)); + SHA1_STEP (SHA1_F1 , e, a, b, c, d, (c_66s ^ w0s14 ^ w0s16)); + SHA1_STEP (SHA1_F1 , d, e, a, b, c, (c_67s ^ w0s08 ^ w0s18)); + SHA1_STEP (SHA1_F1 , c, d, e, a, b, (c_68s ^ w0s11 ^ w0s14 ^ w0s15)); + SHA1_STEPX(SHA1_F1 , b, c, d, e, a, (c_69sK)); + SHA1_STEP (SHA1_F1 , a, b, c, d, e, (c_70s ^ w0s12 ^ w0s19)); + SHA1_STEP (SHA1_F1 , e, a, b, c, d, (c_71s ^ w0s12 ^ w0s16)); + SHA1_STEP (SHA1_F1 , d, e, a, b, c, (c_72s ^ w0s05 ^ w0s11 ^ w0s12 ^ w0s13 ^ w0s16 ^ w0s18)); + SHA1_STEP (SHA1_F1 , c, d, e, a, b, (c_73s ^ w0s20)); + SHA1_STEP (SHA1_F1 , b, c, d, e, a, (c_74s ^ w0s08 ^ w0s16)); + SHA1_STEP (SHA1_F1 , a, b, c, d, e, (c_75s ^ w0s06 ^ w0s12 ^ w0s14)); + SHA1_STEP (SHA1_F1 , e, a, b, c, d, (c_76s ^ w0s07 ^ w0s08___w0s12 ^ w0s16 ^ w0s21)); + SHA1_STEP (SHA1_F1 , d, e, a, b, c, (c_77s)); + SHA1_STEP (SHA1_F1 , c, d, e, a, b, (c_78s ^ w0s07 ^ w0s08 ^ w0s15 ^ w0s18 ^ w0s20)); + SHA1_STEP (SHA1_F1 , b, c, d, e, a, (c_79s ^ w0s08 ^ w0s22)); + + + const u32x r0 = d; + const u32x r1 = e; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_M + } +} + +__device__ static void m00100s (u32 w[16], const u32 pw_len, const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const u32x *words_buf_r, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset) +{ + /** + * modifier + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 c_16s = rotl32 ((w[13] ^ w[ 8] ^ w[ 2] ), 1u); + const u32 c_17s = rotl32 ((w[14] ^ w[ 9] ^ w[ 3] ^ w[ 1]), 1u); + const u32 c_18s = rotl32 ((w[15] ^ w[10] ^ w[ 4] ^ w[ 2]), 1u); + const u32 c_19s = rotl32 ((c_16s ^ w[11] ^ w[ 5] ^ w[ 3]), 1u); + const u32 c_20s = rotl32 ((c_17s ^ w[12] ^ w[ 6] ^ w[ 4]), 1u); + const u32 c_21s = rotl32 ((c_18s ^ w[13] ^ w[ 7] ^ w[ 5]), 1u); + const u32 c_22s = rotl32 ((c_19s ^ w[14] ^ w[ 8] ^ w[ 6]), 1u); + const u32 c_23s = rotl32 ((c_20s ^ w[15] ^ w[ 9] ^ w[ 7]), 1u); + const u32 c_24s = rotl32 ((c_21s ^ c_16s ^ w[10] ^ w[ 8]), 1u); + const u32 c_25s = rotl32 ((c_22s ^ c_17s ^ w[11] ^ w[ 9]), 1u); + const u32 c_26s = rotl32 ((c_23s ^ c_18s ^ w[12] ^ w[10]), 1u); + const u32 c_27s = rotl32 ((c_24s ^ c_19s ^ w[13] ^ w[11]), 1u); + const u32 c_28s = rotl32 ((c_25s ^ c_20s ^ w[14] ^ w[12]), 1u); + const u32 c_29s = rotl32 ((c_26s ^ c_21s ^ w[15] ^ w[13]), 1u); + const u32 c_30s = rotl32 ((c_27s ^ c_22s ^ c_16s ^ w[14]), 1u); + const u32 c_31s = rotl32 ((c_28s ^ c_23s ^ c_17s ^ w[15]), 1u); + const u32 c_32s = rotl32 ((c_29s ^ c_24s ^ c_18s ^ c_16s), 1u); + const u32 c_33s = rotl32 ((c_30s ^ c_25s ^ c_19s ^ c_17s), 1u); + const u32 c_34s = rotl32 ((c_31s ^ c_26s ^ c_20s ^ c_18s), 1u); + const u32 c_35s = rotl32 ((c_32s ^ c_27s ^ c_21s ^ c_19s), 1u); + const u32 c_36s = rotl32 ((c_33s ^ c_28s ^ c_22s ^ c_20s), 1u); + const u32 c_37s = rotl32 ((c_34s ^ c_29s ^ c_23s ^ c_21s), 1u); + const u32 c_38s = rotl32 ((c_35s ^ c_30s ^ c_24s ^ c_22s), 1u); + const u32 c_39s = rotl32 ((c_36s ^ c_31s ^ c_25s ^ c_23s), 1u); + const u32 c_40s = rotl32 ((c_37s ^ c_32s ^ c_26s ^ c_24s), 1u); + const u32 c_41s = rotl32 ((c_38s ^ c_33s ^ c_27s ^ c_25s), 1u); + const u32 c_42s = rotl32 ((c_39s ^ c_34s ^ c_28s ^ c_26s), 1u); + const u32 c_43s = rotl32 ((c_40s ^ c_35s ^ c_29s ^ c_27s), 1u); + const u32 c_44s = rotl32 ((c_41s ^ c_36s ^ c_30s ^ c_28s), 1u); + const u32 c_45s = rotl32 ((c_42s ^ c_37s ^ c_31s ^ c_29s), 1u); + const u32 c_46s = rotl32 ((c_43s ^ c_38s ^ c_32s ^ c_30s), 1u); + const u32 c_47s = rotl32 ((c_44s ^ c_39s ^ c_33s ^ c_31s), 1u); + const u32 c_48s = rotl32 ((c_45s ^ c_40s ^ c_34s ^ c_32s), 1u); + const u32 c_49s = rotl32 ((c_46s ^ c_41s ^ c_35s ^ c_33s), 1u); + const u32 c_50s = rotl32 ((c_47s ^ c_42s ^ c_36s ^ c_34s), 1u); + const u32 c_51s = rotl32 ((c_48s ^ c_43s ^ c_37s ^ c_35s), 1u); + const u32 c_52s = rotl32 ((c_49s ^ c_44s ^ c_38s ^ c_36s), 1u); + const u32 c_53s = rotl32 ((c_50s ^ c_45s ^ c_39s ^ c_37s), 1u); + const u32 c_54s = rotl32 ((c_51s ^ c_46s ^ c_40s ^ c_38s), 1u); + const u32 c_55s = rotl32 ((c_52s ^ c_47s ^ c_41s ^ c_39s), 1u); + const u32 c_56s = rotl32 ((c_53s ^ c_48s ^ c_42s ^ c_40s), 1u); + const u32 c_57s = rotl32 ((c_54s ^ c_49s ^ c_43s ^ c_41s), 1u); + const u32 c_58s = rotl32 ((c_55s ^ c_50s ^ c_44s ^ c_42s), 1u); + const u32 c_59s = rotl32 ((c_56s ^ c_51s ^ c_45s ^ c_43s), 1u); + const u32 c_60s = rotl32 ((c_57s ^ c_52s ^ c_46s ^ c_44s), 1u); + const u32 c_61s = rotl32 ((c_58s ^ c_53s ^ c_47s ^ c_45s), 1u); + const u32 c_62s = rotl32 ((c_59s ^ c_54s ^ c_48s ^ c_46s), 1u); + const u32 c_63s = rotl32 ((c_60s ^ c_55s ^ c_49s ^ c_47s), 1u); + const u32 c_64s = rotl32 ((c_61s ^ c_56s ^ c_50s ^ c_48s), 1u); + const u32 c_65s = rotl32 ((c_62s ^ c_57s ^ c_51s ^ c_49s), 1u); + const u32 c_66s = rotl32 ((c_63s ^ c_58s ^ c_52s ^ c_50s), 1u); + const u32 c_67s = rotl32 ((c_64s ^ c_59s ^ c_53s ^ c_51s), 1u); + const u32 c_68s = rotl32 ((c_65s ^ c_60s ^ c_54s ^ c_52s), 1u); + const u32 c_69s = rotl32 ((c_66s ^ c_61s ^ c_55s ^ c_53s), 1u); + const u32 c_70s = rotl32 ((c_67s ^ c_62s ^ c_56s ^ c_54s), 1u); + const u32 c_71s = rotl32 ((c_68s ^ c_63s ^ c_57s ^ c_55s), 1u); + const u32 c_72s = rotl32 ((c_69s ^ c_64s ^ c_58s ^ c_56s), 1u); + const u32 c_73s = rotl32 ((c_70s ^ c_65s ^ c_59s ^ c_57s), 1u); + const u32 c_74s = rotl32 ((c_71s ^ c_66s ^ c_60s ^ c_58s), 1u); + const u32 c_75s = rotl32 ((c_72s ^ c_67s ^ c_61s ^ c_59s), 1u); + + const u32 c_17sK = c_17s + SHA1C00; + const u32 c_18sK = c_18s + SHA1C00; + const u32 c_20sK = c_20s + SHA1C01; + const u32 c_21sK = c_21s + SHA1C01; + const u32 c_23sK = c_23s + SHA1C01; + const u32 c_26sK = c_26s + SHA1C01; + const u32 c_27sK = c_27s + SHA1C01; + const u32 c_29sK = c_29s + SHA1C01; + const u32 c_33sK = c_33s + SHA1C01; + const u32 c_39sK = c_39s + SHA1C01; + const u32 c_41sK = c_41s + SHA1C02; + const u32 c_45sK = c_45s + SHA1C02; + const u32 c_53sK = c_53s + SHA1C02; + const u32 c_65sK = c_65s + SHA1C03; + const u32 c_69sK = c_69s + SHA1C03; + + const u32 w1 = w[ 1] + SHA1C00; + const u32 w2 = w[ 2] + SHA1C00; + const u32 w3 = w[ 3] + SHA1C00; + const u32 w4 = w[ 4] + SHA1C00; + const u32 w5 = w[ 5] + SHA1C00; + const u32 w6 = w[ 6] + SHA1C00; + const u32 w7 = w[ 7] + SHA1C00; + const u32 w8 = w[ 8] + SHA1C00; + const u32 w9 = w[ 9] + SHA1C00; + const u32 wa = w[10] + SHA1C00; + const u32 wb = w[11] + SHA1C00; + const u32 wc = w[12] + SHA1C00; + const u32 wd = w[13] + SHA1C00; + const u32 we = w[14] + SHA1C00; + const u32 wf = w[15] + SHA1C00; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3], + }; + + /** + * reverse + */ + + const u32 e_rev = rotl32 (search[1], 2u) - SHA1C03; + + /** + * loop + */ + + const u32 bf_loops = ceil ((float) bfs_cnt / VECT_DIV); + + u32x w0l = w[0]; + + for (u32 il_pos = 0; il_pos < bf_loops; il_pos++) + { + const u32x w0r = c_bfs[il_pos]; + + const u32x w0 = w0l | w0r; + + const u32x w0s01 = rotl32 (w0, 1u); + const u32x w0s02 = rotl32 (w0, 2u); + const u32x w0s03 = rotl32 (w0, 3u); + const u32x w0s04 = rotl32 (w0, 4u); + const u32x w0s05 = rotl32 (w0, 5u); + const u32x w0s06 = rotl32 (w0, 6u); + const u32x w0s07 = rotl32 (w0, 7u); + const u32x w0s08 = rotl32 (w0, 8u); + const u32x w0s09 = rotl32 (w0, 9u); + const u32x w0s10 = rotl32 (w0, 10u); + const u32x w0s11 = rotl32 (w0, 11u); + const u32x w0s12 = rotl32 (w0, 12u); + const u32x w0s13 = rotl32 (w0, 13u); + const u32x w0s14 = rotl32 (w0, 14u); + const u32x w0s15 = rotl32 (w0, 15u); + const u32x w0s16 = rotl32 (w0, 16u); + const u32x w0s17 = rotl32 (w0, 17u); + const u32x w0s18 = rotl32 (w0, 18u); + const u32x w0s19 = rotl32 (w0, 19u); + const u32x w0s20 = rotl32 (w0, 20u); + + const u32x w0s04___w0s06 = w0s04 ^ w0s06; + const u32x w0s04___w0s08 = w0s04 ^ w0s08; + const u32x w0s08___w0s12 = w0s08 ^ w0s12; + const u32x w0s04___w0s06___w0s07 = w0s04___w0s06 ^ w0s07; + + u32x a = SHA1M_A; + u32x b = SHA1M_B; + u32x c = SHA1M_C; + u32x d = SHA1M_D; + u32x e = SHA1M_E; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w0); + SHA1_STEPX(SHA1_F0o, e, a, b, c, d, w1); + SHA1_STEPX(SHA1_F0o, d, e, a, b, c, w2); + SHA1_STEPX(SHA1_F0o, c, d, e, a, b, w3); + SHA1_STEPX(SHA1_F0o, b, c, d, e, a, w4); + SHA1_STEPX(SHA1_F0o, a, b, c, d, e, w5); + SHA1_STEPX(SHA1_F0o, e, a, b, c, d, w6); + SHA1_STEPX(SHA1_F0o, d, e, a, b, c, w7); + SHA1_STEPX(SHA1_F0o, c, d, e, a, b, w8); + SHA1_STEPX(SHA1_F0o, b, c, d, e, a, w9); + SHA1_STEPX(SHA1_F0o, a, b, c, d, e, wa); + SHA1_STEPX(SHA1_F0o, e, a, b, c, d, wb); + SHA1_STEPX(SHA1_F0o, d, e, a, b, c, wc); + SHA1_STEPX(SHA1_F0o, c, d, e, a, b, wd); + SHA1_STEPX(SHA1_F0o, b, c, d, e, a, we); + SHA1_STEPX(SHA1_F0o, a, b, c, d, e, wf); + + SHA1_STEP (SHA1_F0o, e, a, b, c, d, (c_16s ^ w0s01)); + SHA1_STEPX(SHA1_F0o, d, e, a, b, c, (c_17sK)); + SHA1_STEPX(SHA1_F0o, c, d, e, a, b, (c_18sK)); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, (c_19s ^ w0s02)); + + #undef K + #define K SHA1C01 + + SHA1_STEPX(SHA1_F1 , a, b, c, d, e, (c_20sK)); + SHA1_STEPX(SHA1_F1 , e, a, b, c, d, (c_21sK)); + SHA1_STEP (SHA1_F1 , d, e, a, b, c, (c_22s ^ w0s03)); + SHA1_STEPX(SHA1_F1 , c, d, e, a, b, (c_23sK)); + SHA1_STEP (SHA1_F1 , b, c, d, e, a, (c_24s ^ w0s02)); + SHA1_STEP (SHA1_F1 , a, b, c, d, e, (c_25s ^ w0s04)); + SHA1_STEPX(SHA1_F1 , e, a, b, c, d, (c_26sK)); + SHA1_STEPX(SHA1_F1 , d, e, a, b, c, (c_27sK)); + SHA1_STEP (SHA1_F1 , c, d, e, a, b, (c_28s ^ w0s05)); + SHA1_STEPX(SHA1_F1 , b, c, d, e, a, (c_29sK)); + SHA1_STEP (SHA1_F1 , a, b, c, d, e, (c_30s ^ w0s02 ^ w0s04)); + SHA1_STEP (SHA1_F1 , e, a, b, c, d, (c_31s ^ w0s06)); + SHA1_STEP (SHA1_F1 , d, e, a, b, c, (c_32s ^ w0s02 ^ w0s03)); + SHA1_STEPX(SHA1_F1 , c, d, e, a, b, (c_33sK)); + SHA1_STEP (SHA1_F1 , b, c, d, e, a, (c_34s ^ w0s07)); + SHA1_STEP (SHA1_F1 , a, b, c, d, e, (c_35s ^ w0s04)); + SHA1_STEP (SHA1_F1 , e, a, b, c, d, (c_36s ^ w0s04___w0s06)); + SHA1_STEP (SHA1_F1 , d, e, a, b, c, (c_37s ^ w0s08)); + SHA1_STEP (SHA1_F1 , c, d, e, a, b, (c_38s ^ w0s04)); + SHA1_STEPX(SHA1_F1 , b, c, d, e, a, (c_39sK)); + + #undef K + #define K SHA1C02 + + SHA1_STEP (SHA1_F2o, a, b, c, d, e, (c_40s ^ w0s04 ^ w0s09)); + SHA1_STEPX(SHA1_F2o, e, a, b, c, d, (c_41sK)); + SHA1_STEP (SHA1_F2o, d, e, a, b, c, (c_42s ^ w0s06 ^ w0s08)); + SHA1_STEP (SHA1_F2o, c, d, e, a, b, (c_43s ^ w0s10)); + SHA1_STEP (SHA1_F2o, b, c, d, e, a, (c_44s ^ w0s03 ^ w0s06 ^ w0s07)); + SHA1_STEPX(SHA1_F2o, a, b, c, d, e, (c_45sK)); + SHA1_STEP (SHA1_F2o, e, a, b, c, d, (c_46s ^ w0s04 ^ w0s11)); + SHA1_STEP (SHA1_F2o, d, e, a, b, c, (c_47s ^ w0s04___w0s08)); + SHA1_STEP (SHA1_F2o, c, d, e, a, b, (c_48s ^ w0s03 ^ w0s04___w0s08 ^ w0s05 ^ w0s10)); + SHA1_STEP (SHA1_F2o, b, c, d, e, a, (c_49s ^ w0s12)); + SHA1_STEP (SHA1_F2o, a, b, c, d, e, (c_50s ^ w0s08)); + SHA1_STEP (SHA1_F2o, e, a, b, c, d, (c_51s ^ w0s04___w0s06)); + SHA1_STEP (SHA1_F2o, d, e, a, b, c, (c_52s ^ w0s04___w0s08 ^ w0s13)); + SHA1_STEPX(SHA1_F2o, c, d, e, a, b, (c_53sK)); + SHA1_STEP (SHA1_F2o, b, c, d, e, a, (c_54s ^ w0s07 ^ w0s10 ^ w0s12)); + SHA1_STEP (SHA1_F2o, a, b, c, d, e, (c_55s ^ w0s14)); + SHA1_STEP (SHA1_F2o, e, a, b, c, d, (c_56s ^ w0s04___w0s06___w0s07 ^ w0s10 ^ w0s11)); + SHA1_STEP (SHA1_F2o, d, e, a, b, c, (c_57s ^ w0s08)); + SHA1_STEP (SHA1_F2o, c, d, e, a, b, (c_58s ^ w0s04___w0s08 ^ w0s15)); + SHA1_STEP (SHA1_F2o, b, c, d, e, a, (c_59s ^ w0s08___w0s12)); + + #undef K + #define K SHA1C03 + + SHA1_STEP (SHA1_F1 , a, b, c, d, e, (c_60s ^ w0s04 ^ w0s08___w0s12 ^ w0s07 ^ w0s14)); + SHA1_STEP (SHA1_F1 , e, a, b, c, d, (c_61s ^ w0s16)); + SHA1_STEP (SHA1_F1 , d, e, a, b, c, (c_62s ^ w0s04___w0s06 ^ w0s08___w0s12)); + SHA1_STEP (SHA1_F1 , c, d, e, a, b, (c_63s ^ w0s08)); + SHA1_STEP (SHA1_F1 , b, c, d, e, a, (c_64s ^ w0s04___w0s06___w0s07 ^ w0s08___w0s12 ^ w0s17)); + SHA1_STEPX(SHA1_F1 , a, b, c, d, e, (c_65sK)); + SHA1_STEP (SHA1_F1 , e, a, b, c, d, (c_66s ^ w0s14 ^ w0s16)); + SHA1_STEP (SHA1_F1 , d, e, a, b, c, (c_67s ^ w0s08 ^ w0s18)); + SHA1_STEP (SHA1_F1 , c, d, e, a, b, (c_68s ^ w0s11 ^ w0s14 ^ w0s15)); + SHA1_STEPX(SHA1_F1 , b, c, d, e, a, (c_69sK)); + SHA1_STEP (SHA1_F1 , a, b, c, d, e, (c_70s ^ w0s12 ^ w0s19)); + SHA1_STEP (SHA1_F1 , e, a, b, c, d, (c_71s ^ w0s12 ^ w0s16)); + SHA1_STEP (SHA1_F1 , d, e, a, b, c, (c_72s ^ w0s05 ^ w0s11 ^ w0s12 ^ w0s13 ^ w0s16 ^ w0s18)); + SHA1_STEP (SHA1_F1 , c, d, e, a, b, (c_73s ^ w0s20)); + SHA1_STEP (SHA1_F1 , b, c, d, e, a, (c_74s ^ w0s08 ^ w0s16)); + + SHA1_STEP_PE (SHA1_F1, a, b, c, d, e, (c_75s ^ w0s06 ^ w0s12 ^ w0s14)); + + bool q_cond = (e_rev != e); + + if (q_cond) continue; + + SHA1_STEP_PB (SHA1_F1, a, b, c, d, e, 0); + + const u32 c_76s = rotl32 ((c_73s ^ c_68s ^ c_62s ^ c_60s), 1u); + const u32 c_77s = rotl32 ((c_74s ^ c_69s ^ c_63s ^ c_61s), 1u); + const u32 c_78s = rotl32 ((c_75s ^ c_70s ^ c_64s ^ c_62s), 1u); + const u32 c_79s = rotl32 ((c_76s ^ c_71s ^ c_65s ^ c_63s), 1u); + + const u32x w0s21 = rotl32 (w0, 21u); + const u32x w0s22 = rotl32 (w0, 22U); + + SHA1_STEP (SHA1_F1 , e, a, b, c, d, (c_76s ^ w0s07 ^ w0s08___w0s12 ^ w0s16 ^ w0s21)); + SHA1_STEP (SHA1_F1 , d, e, a, b, c, (c_77s)); + SHA1_STEP (SHA1_F1 , c, d, e, a, b, (c_78s ^ w0s07 ^ w0s08 ^ w0s15 ^ w0s18 ^ w0s20)); + SHA1_STEP (SHA1_F1 , b, c, d, e, a, (c_79s ^ w0s08 ^ w0s22)); + + + const u32x r0 = d; + const u32x r1 = e; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_S + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m00100_m04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const u32x *words_buf_r, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32 w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = 0; + w[ 5] = 0; + w[ 6] = 0; + w[ 7] = 0; + w[ 8] = 0; + w[ 9] = 0; + w[10] = 0; + w[11] = 0; + w[12] = 0; + w[13] = 0; + w[14] = 0; + w[15] = pws[gid].i[15]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m00100m (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m00100_m08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const u32x *words_buf_r, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32 w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = pws[gid].i[ 4]; + w[ 5] = pws[gid].i[ 5]; + w[ 6] = pws[gid].i[ 6]; + w[ 7] = pws[gid].i[ 7]; + w[ 8] = 0; + w[ 9] = 0; + w[10] = 0; + w[11] = 0; + w[12] = 0; + w[13] = 0; + w[14] = 0; + w[15] = pws[gid].i[15]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m00100m (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m00100_m16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const u32x *words_buf_r, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32 w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = pws[gid].i[ 4]; + w[ 5] = pws[gid].i[ 5]; + w[ 6] = pws[gid].i[ 6]; + w[ 7] = pws[gid].i[ 7]; + w[ 8] = pws[gid].i[ 8]; + w[ 9] = pws[gid].i[ 9]; + w[10] = pws[gid].i[10]; + w[11] = pws[gid].i[11]; + w[12] = pws[gid].i[12]; + w[13] = pws[gid].i[13]; + w[14] = pws[gid].i[14]; + w[15] = pws[gid].i[15]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m00100m (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m00100_s04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const u32x *words_buf_r, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32 w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = 0; + w[ 5] = 0; + w[ 6] = 0; + w[ 7] = 0; + w[ 8] = 0; + w[ 9] = 0; + w[10] = 0; + w[11] = 0; + w[12] = 0; + w[13] = 0; + w[14] = 0; + w[15] = pws[gid].i[15]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m00100s (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m00100_s08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const u32x *words_buf_r, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32 w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = pws[gid].i[ 4]; + w[ 5] = pws[gid].i[ 5]; + w[ 6] = pws[gid].i[ 6]; + w[ 7] = pws[gid].i[ 7]; + w[ 8] = 0; + w[ 9] = 0; + w[10] = 0; + w[11] = 0; + w[12] = 0; + w[13] = 0; + w[14] = 0; + w[15] = pws[gid].i[15]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m00100s (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m00100_s16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const u32x *words_buf_r, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32 w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = pws[gid].i[ 4]; + w[ 5] = pws[gid].i[ 5]; + w[ 6] = pws[gid].i[ 6]; + w[ 7] = pws[gid].i[ 7]; + w[ 8] = pws[gid].i[ 8]; + w[ 9] = pws[gid].i[ 9]; + w[10] = pws[gid].i[10]; + w[11] = pws[gid].i[11]; + w[12] = pws[gid].i[12]; + w[13] = pws[gid].i[13]; + w[14] = pws[gid].i[14]; + w[15] = pws[gid].i[15]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m00100s (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} diff --git a/nv/m00110_a0.cu b/nv/m00110_a0.cu new file mode 100644 index 0000000000..31a6341dfd --- /dev/null +++ b/nv/m00110_a0.cu @@ -0,0 +1,640 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _SHA1_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW2 +#define VECT_SIZE1 +#endif + +#define DGST_R0 3 +#define DGST_R1 4 +#define DGST_R2 2 +#define DGST_R3 1 + +#include "include/kernel_functions.c" +#include "types_nv.c" +#include "common_nv.c" +#include "include/rp_gpu.h" +#include "rp_nv.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +__device__ __constant__ gpu_rule_t c_rules[1024]; + +extern "C" __global__ void __launch_bounds__ (256, 1) m00110_m04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + u32x pw_buf1[4]; + + pw_buf1[0] = pws[gid].i[ 4]; + pw_buf1[1] = pws[gid].i[ 5]; + pw_buf1[2] = pws[gid].i[ 6]; + pw_buf1[3] = pws[gid].i[ 7]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[7]; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + + w0[0] = pw_buf0[0]; + w0[1] = pw_buf0[1]; + w0[2] = pw_buf0[2]; + w0[3] = pw_buf0[3]; + + u32x w1[4]; + + w1[0] = pw_buf1[0]; + w1[1] = pw_buf1[1]; + w1[2] = pw_buf1[2]; + w1[3] = pw_buf1[3]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 out_len = apply_rules (c_rules[il_pos].cmds, w0, w1, pw_len); + + /** + * append salt + */ + + u32 s0[4]; + + s0[0] = salt_buf0[0]; + s0[1] = salt_buf0[1]; + s0[2] = salt_buf0[2]; + s0[3] = salt_buf0[3]; + + u32 s1[4]; + + s1[0] = salt_buf1[0]; + s1[1] = salt_buf1[1]; + s1[2] = salt_buf1[2]; + s1[3] = salt_buf1[3]; + + u32 s2[4]; + + s2[0] = 0; + s2[1] = 0; + s2[2] = 0; + s2[3] = 0; + + u32 s3[4]; + + s3[0] = 0; + s3[1] = 0; + s3[2] = 0; + s3[3] = 0; + + switch_buffer_by_offset (s0, s1, s2, s3, out_len); + + const u32 pw_salt_len = out_len + salt_len; + + w0[0] |= s0[0]; + w0[1] |= s0[1]; + w0[2] |= s0[2]; + w0[3] |= s0[3]; + + w1[0] |= s1[0]; + w1[1] |= s1[1]; + w1[2] |= s1[2]; + w1[3] |= s1[3]; + + w2[0] |= s2[0]; + w2[1] |= s2[1]; + w2[2] |= s2[2]; + w2[3] |= s2[3]; + + w3[0] |= s3[0]; + w3[1] |= s3[1]; + w3[2] |= s3[2]; + w3[3] |= s3[3]; + + append_0x80_4 (w0, w1, w2, w3, pw_salt_len); + + /** + * sha1 + */ + + u32x w0_t = swap_workaround (w0[0]); + u32x w1_t = swap_workaround (w0[1]); + u32x w2_t = swap_workaround (w0[2]); + u32x w3_t = swap_workaround (w0[3]); + u32x w4_t = swap_workaround (w1[0]); + u32x w5_t = swap_workaround (w1[1]); + u32x w6_t = swap_workaround (w1[2]); + u32x w7_t = swap_workaround (w1[3]); + u32x w8_t = swap_workaround (w2[0]); + u32x w9_t = swap_workaround (w2[1]); + u32x wa_t = swap_workaround (w2[2]); + u32x wb_t = swap_workaround (w2[3]); + u32x wc_t = swap_workaround (w3[0]); + u32x wd_t = swap_workaround (w3[1]); + u32x we_t = 0; + u32x wf_t = pw_salt_len * 8; + + u32x a = SHA1M_A; + u32x b = SHA1M_B; + u32x c = SHA1M_C; + u32x d = SHA1M_D; + u32x e = SHA1M_E; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w0_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w1_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w2_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w3_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w4_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w5_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w6_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w7_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w8_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w9_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wa_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, wb_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, wc_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, wd_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, we_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F0o, e, a, b, c, d, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F0o, d, e, a, b, c, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F0o, c, d, e, a, b, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F0o, b, c, d, e, a, w3_t); + + #undef K + #define K SHA1C01 + + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w7_t); + + #undef K + #define K SHA1C02 + + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wb_t); + + #undef K + #define K SHA1C03 + + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wf_t); + + + const u32x r0 = d; + const u32x r1 = e; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_M + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m00110_m08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m00110_m16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m00110_s04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + u32x pw_buf1[4]; + + pw_buf1[0] = pws[gid].i[ 4]; + pw_buf1[1] = pws[gid].i[ 5]; + pw_buf1[2] = pws[gid].i[ 6]; + pw_buf1[3] = pws[gid].i[ 7]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[7]; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * reverse + */ + + const u32 e_rev = rotl32 (search[1], 2u); + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + + w0[0] = pw_buf0[0]; + w0[1] = pw_buf0[1]; + w0[2] = pw_buf0[2]; + w0[3] = pw_buf0[3]; + + u32x w1[4]; + + w1[0] = pw_buf1[0]; + w1[1] = pw_buf1[1]; + w1[2] = pw_buf1[2]; + w1[3] = pw_buf1[3]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 out_len = apply_rules (c_rules[il_pos].cmds, w0, w1, pw_len); + + /** + * append salt + */ + + u32 s0[4]; + + s0[0] = salt_buf0[0]; + s0[1] = salt_buf0[1]; + s0[2] = salt_buf0[2]; + s0[3] = salt_buf0[3]; + + u32 s1[4]; + + s1[0] = salt_buf1[0]; + s1[1] = salt_buf1[1]; + s1[2] = salt_buf1[2]; + s1[3] = salt_buf1[3]; + + u32 s2[4]; + + s2[0] = 0; + s2[1] = 0; + s2[2] = 0; + s2[3] = 0; + + u32 s3[4]; + + s3[0] = 0; + s3[1] = 0; + s3[2] = 0; + s3[3] = 0; + + switch_buffer_by_offset (s0, s1, s2, s3, out_len); + + const u32 pw_salt_len = out_len + salt_len; + + w0[0] |= s0[0]; + w0[1] |= s0[1]; + w0[2] |= s0[2]; + w0[3] |= s0[3]; + + w1[0] |= s1[0]; + w1[1] |= s1[1]; + w1[2] |= s1[2]; + w1[3] |= s1[3]; + + w2[0] |= s2[0]; + w2[1] |= s2[1]; + w2[2] |= s2[2]; + w2[3] |= s2[3]; + + w3[0] |= s3[0]; + w3[1] |= s3[1]; + w3[2] |= s3[2]; + w3[3] |= s3[3]; + + append_0x80_4 (w0, w1, w2, w3, pw_salt_len); + + /** + * sha1 + */ + + u32x w0_t = swap_workaround (w0[0]); + u32x w1_t = swap_workaround (w0[1]); + u32x w2_t = swap_workaround (w0[2]); + u32x w3_t = swap_workaround (w0[3]); + u32x w4_t = swap_workaround (w1[0]); + u32x w5_t = swap_workaround (w1[1]); + u32x w6_t = swap_workaround (w1[2]); + u32x w7_t = swap_workaround (w1[3]); + u32x w8_t = swap_workaround (w2[0]); + u32x w9_t = swap_workaround (w2[1]); + u32x wa_t = swap_workaround (w2[2]); + u32x wb_t = swap_workaround (w2[3]); + u32x wc_t = swap_workaround (w3[0]); + u32x wd_t = swap_workaround (w3[1]); + u32x we_t = 0; + u32x wf_t = pw_salt_len * 8; + + u32x a = SHA1M_A; + u32x b = SHA1M_B; + u32x c = SHA1M_C; + u32x d = SHA1M_D; + u32x e = SHA1M_E; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w0_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w1_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w2_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w3_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w4_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w5_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w6_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w7_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w8_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w9_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wa_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, wb_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, wc_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, wd_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, we_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F0o, e, a, b, c, d, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F0o, d, e, a, b, c, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F0o, c, d, e, a, b, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F0o, b, c, d, e, a, w3_t); + + #undef K + #define K SHA1C01 + + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w7_t); + + #undef K + #define K SHA1C02 + + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wb_t); + + #undef K + #define K SHA1C03 + + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wb_t); + + if (e != e_rev) continue; + + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wf_t); + + + const u32x r0 = d; + const u32x r1 = e; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_S + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m00110_s08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m00110_s16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/nv/m00110_a1.cu b/nv/m00110_a1.cu new file mode 100644 index 0000000000..d764a0fb71 --- /dev/null +++ b/nv/m00110_a1.cu @@ -0,0 +1,706 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _SHA1_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW2 +#define VECT_SIZE4 +#endif + +#define DGST_R0 3 +#define DGST_R1 4 +#define DGST_R2 2 +#define DGST_R3 1 + +#include "include/kernel_functions.c" +#include "types_nv.c" +#include "common_nv.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +__device__ __constant__ comb_t c_combs[1024]; + +extern "C" __global__ void __launch_bounds__ (256, 1) m00110_m04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, c_combs[0].pw_len); + } + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[7]; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = c_combs[il_pos].pw_len; + + const u32 pw_len = pw_l_len + pw_r_len; + + u32 wordr0[4]; + + wordr0[0] = c_combs[il_pos].i[0]; + wordr0[1] = c_combs[il_pos].i[1]; + wordr0[2] = c_combs[il_pos].i[2]; + wordr0[3] = c_combs[il_pos].i[3]; + + u32 wordr1[4]; + + wordr1[0] = c_combs[il_pos].i[4]; + wordr1[1] = c_combs[il_pos].i[5]; + wordr1[2] = c_combs[il_pos].i[6]; + wordr1[3] = c_combs[il_pos].i[7]; + + u32 wordr2[4]; + + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + + u32 wordr3[4]; + + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + /** + * append salt + */ + + u32 s0[4]; + + s0[0] = salt_buf0[0]; + s0[1] = salt_buf0[1]; + s0[2] = salt_buf0[2]; + s0[3] = salt_buf0[3]; + + u32 s1[4]; + + s1[0] = salt_buf1[0]; + s1[1] = salt_buf1[1]; + s1[2] = salt_buf1[2]; + s1[3] = salt_buf1[3]; + + u32 s2[4]; + + s2[0] = 0; + s2[1] = 0; + s2[2] = 0; + s2[3] = 0; + + u32 s3[4]; + + s3[0] = 0; + s3[1] = 0; + s3[2] = 0; + s3[3] = 0; + + switch_buffer_by_offset (s0, s1, s2, s3, pw_len); + + const u32 pw_salt_len = pw_len + salt_len; + + u32x w0[4]; + + w0[0] = wordl0[0] | wordr0[0] | s0[0]; + w0[1] = wordl0[1] | wordr0[1] | s0[1]; + w0[2] = wordl0[2] | wordr0[2] | s0[2]; + w0[3] = wordl0[3] | wordr0[3] | s0[3]; + + u32x w1[4]; + + w1[0] = wordl1[0] | wordr1[0] | s1[0]; + w1[1] = wordl1[1] | wordr1[1] | s1[1]; + w1[2] = wordl1[2] | wordr1[2] | s1[2]; + w1[3] = wordl1[3] | wordr1[3] | s1[3]; + + u32x w2[4]; + + w2[0] = wordl2[0] | wordr2[0] | s2[0]; + w2[1] = wordl2[1] | wordr2[1] | s2[1]; + w2[2] = wordl2[2] | wordr2[2] | s2[2]; + w2[3] = wordl2[3] | wordr2[3] | s2[3]; + + u32x w3[4]; + + w3[0] = wordl3[0] | wordr3[0] | s3[0]; + w3[1] = wordl3[1] | wordr3[1] | s3[1]; + w3[2] = 0; + w3[3] = 0; + + append_0x80_4 (w0, w1, w2, w3, pw_salt_len); + + /** + * sha1 + */ + + u32x w0_t = swap_workaround (w0[0]); + u32x w1_t = swap_workaround (w0[1]); + u32x w2_t = swap_workaround (w0[2]); + u32x w3_t = swap_workaround (w0[3]); + u32x w4_t = swap_workaround (w1[0]); + u32x w5_t = swap_workaround (w1[1]); + u32x w6_t = swap_workaround (w1[2]); + u32x w7_t = swap_workaround (w1[3]); + u32x w8_t = swap_workaround (w2[0]); + u32x w9_t = swap_workaround (w2[1]); + u32x wa_t = swap_workaround (w2[2]); + u32x wb_t = swap_workaround (w2[3]); + u32x wc_t = swap_workaround (w3[0]); + u32x wd_t = swap_workaround (w3[1]); + u32x we_t = 0; + u32x wf_t = pw_salt_len * 8; + + u32x a = SHA1M_A; + u32x b = SHA1M_B; + u32x c = SHA1M_C; + u32x d = SHA1M_D; + u32x e = SHA1M_E; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w0_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w1_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w2_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w3_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w4_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w5_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w6_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w7_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w8_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w9_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wa_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, wb_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, wc_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, wd_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, we_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F0o, e, a, b, c, d, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F0o, d, e, a, b, c, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F0o, c, d, e, a, b, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F0o, b, c, d, e, a, w3_t); + + #undef K + #define K SHA1C01 + + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w7_t); + + #undef K + #define K SHA1C02 + + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wb_t); + + #undef K + #define K SHA1C03 + + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wf_t); + + + const u32x r0 = d; + const u32x r1 = e; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_M + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m00110_m08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m00110_m16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m00110_s04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, c_combs[0].pw_len); + } + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[7]; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * reverse + */ + + const u32 e_rev = rotl32 (search[1], 2u); + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = c_combs[il_pos].pw_len; + + const u32 pw_len = pw_l_len + pw_r_len; + + u32 wordr0[4]; + + wordr0[0] = c_combs[il_pos].i[0]; + wordr0[1] = c_combs[il_pos].i[1]; + wordr0[2] = c_combs[il_pos].i[2]; + wordr0[3] = c_combs[il_pos].i[3]; + + u32 wordr1[4]; + + wordr1[0] = c_combs[il_pos].i[4]; + wordr1[1] = c_combs[il_pos].i[5]; + wordr1[2] = c_combs[il_pos].i[6]; + wordr1[3] = c_combs[il_pos].i[7]; + + u32 wordr2[4]; + + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + + u32 wordr3[4]; + + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + /** + * append salt + */ + + u32 s0[4]; + + s0[0] = salt_buf0[0]; + s0[1] = salt_buf0[1]; + s0[2] = salt_buf0[2]; + s0[3] = salt_buf0[3]; + + u32 s1[4]; + + s1[0] = salt_buf1[0]; + s1[1] = salt_buf1[1]; + s1[2] = salt_buf1[2]; + s1[3] = salt_buf1[3]; + + u32 s2[4]; + + s2[0] = 0; + s2[1] = 0; + s2[2] = 0; + s2[3] = 0; + + u32 s3[4]; + + s3[0] = 0; + s3[1] = 0; + s3[2] = 0; + s3[3] = 0; + + switch_buffer_by_offset (s0, s1, s2, s3, pw_len); + + const u32 pw_salt_len = pw_len + salt_len; + + u32x w0[4]; + + w0[0] = wordl0[0] | wordr0[0] | s0[0]; + w0[1] = wordl0[1] | wordr0[1] | s0[1]; + w0[2] = wordl0[2] | wordr0[2] | s0[2]; + w0[3] = wordl0[3] | wordr0[3] | s0[3]; + + u32x w1[4]; + + w1[0] = wordl1[0] | wordr1[0] | s1[0]; + w1[1] = wordl1[1] | wordr1[1] | s1[1]; + w1[2] = wordl1[2] | wordr1[2] | s1[2]; + w1[3] = wordl1[3] | wordr1[3] | s1[3]; + + u32x w2[4]; + + w2[0] = wordl2[0] | wordr2[0] | s2[0]; + w2[1] = wordl2[1] | wordr2[1] | s2[1]; + w2[2] = wordl2[2] | wordr2[2] | s2[2]; + w2[3] = wordl2[3] | wordr2[3] | s2[3]; + + u32x w3[4]; + + w3[0] = wordl3[0] | wordr3[0] | s3[0]; + w3[1] = wordl3[1] | wordr3[1] | s3[1]; + w3[2] = 0; + w3[3] = 0; + + append_0x80_4 (w0, w1, w2, w3, pw_salt_len); + + /** + * sha1 + */ + + u32x w0_t = swap_workaround (w0[0]); + u32x w1_t = swap_workaround (w0[1]); + u32x w2_t = swap_workaround (w0[2]); + u32x w3_t = swap_workaround (w0[3]); + u32x w4_t = swap_workaround (w1[0]); + u32x w5_t = swap_workaround (w1[1]); + u32x w6_t = swap_workaround (w1[2]); + u32x w7_t = swap_workaround (w1[3]); + u32x w8_t = swap_workaround (w2[0]); + u32x w9_t = swap_workaround (w2[1]); + u32x wa_t = swap_workaround (w2[2]); + u32x wb_t = swap_workaround (w2[3]); + u32x wc_t = swap_workaround (w3[0]); + u32x wd_t = swap_workaround (w3[1]); + u32x we_t = 0; + u32x wf_t = pw_salt_len * 8; + + u32x a = SHA1M_A; + u32x b = SHA1M_B; + u32x c = SHA1M_C; + u32x d = SHA1M_D; + u32x e = SHA1M_E; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w0_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w1_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w2_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w3_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w4_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w5_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w6_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w7_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w8_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w9_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wa_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, wb_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, wc_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, wd_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, we_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F0o, e, a, b, c, d, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F0o, d, e, a, b, c, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F0o, c, d, e, a, b, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F0o, b, c, d, e, a, w3_t); + + #undef K + #define K SHA1C01 + + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w7_t); + + #undef K + #define K SHA1C02 + + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wb_t); + + #undef K + #define K SHA1C03 + + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wb_t); + + if (e != e_rev) continue; + + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wf_t); + + + const u32x r0 = d; + const u32x r1 = e; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_S + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m00110_s08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m00110_s16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/nv/m00110_a3.cu b/nv/m00110_a3.cu new file mode 100644 index 0000000000..0f0b80e4a3 --- /dev/null +++ b/nv/m00110_a3.cu @@ -0,0 +1,887 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _SHA1_ +#define _SCALAR_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW2 +#define VECT_SIZE4 +#endif + +#define DGST_R0 3 +#define DGST_R1 4 +#define DGST_R2 2 +#define DGST_R3 1 + +#include "include/kernel_functions.c" +#include "types_nv.c" +#include "common_nv.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4_warp.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4_warp.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4_warp.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4_warp.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4_warp.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4_warp.c" +#endif + +__device__ __constant__ u32x c_bfs[1024]; + +__device__ static void m00110m (u32 w[16], const u32 pw_len, const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const u32x *words_buf_r, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset) +{ + /** + * modifier + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + const u32 lid = threadIdx.x; + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[ 1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[ 2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[ 3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[ 4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[ 5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[ 6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[ 7]; + + u32 salt_buf2[4]; + + salt_buf2[0] = salt_bufs[salt_pos].salt_buf[ 8]; + salt_buf2[1] = 0; + salt_buf2[2] = 0; + salt_buf2[3] = 0; + + u32 salt_buf3[4]; + + salt_buf3[0] = 0; + salt_buf3[1] = 0; + salt_buf3[2] = 0; + salt_buf3[3] = 0; + + switch_buffer_by_offset (salt_buf0, salt_buf1, salt_buf2, salt_buf3, pw_len); + + w[ 0] |= swap_workaround (salt_buf0[0]); + w[ 1] |= swap_workaround (salt_buf0[1]); + w[ 2] |= swap_workaround (salt_buf0[2]); + w[ 3] |= swap_workaround (salt_buf0[3]); + w[ 4] |= swap_workaround (salt_buf1[0]); + w[ 5] |= swap_workaround (salt_buf1[1]); + w[ 6] |= swap_workaround (salt_buf1[2]); + w[ 7] |= swap_workaround (salt_buf1[3]); + w[ 8] |= swap_workaround (salt_buf2[0]); + w[ 9] |= swap_workaround (salt_buf2[1]); + w[10] |= swap_workaround (salt_buf2[2]); + w[11] |= swap_workaround (salt_buf2[3]); + w[12] |= swap_workaround (salt_buf3[0]); + w[13] |= swap_workaround (salt_buf3[1]); + w[14] |= swap_workaround (salt_buf3[2]); + w[15] |= swap_workaround (salt_buf3[3]); + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + const u32 pw_salt_len = pw_len + salt_len; + + w[15] = pw_salt_len * 8; + + /** + * base + */ + + const u32 c_16s = rotl32 ((w[13] ^ w[ 8] ^ w[ 2] ), 1u); + const u32 c_17s = rotl32 ((w[14] ^ w[ 9] ^ w[ 3] ^ w[ 1]), 1u); + const u32 c_18s = rotl32 ((w[15] ^ w[10] ^ w[ 4] ^ w[ 2]), 1u); + const u32 c_19s = rotl32 ((c_16s ^ w[11] ^ w[ 5] ^ w[ 3]), 1u); + const u32 c_20s = rotl32 ((c_17s ^ w[12] ^ w[ 6] ^ w[ 4]), 1u); + const u32 c_21s = rotl32 ((c_18s ^ w[13] ^ w[ 7] ^ w[ 5]), 1u); + const u32 c_22s = rotl32 ((c_19s ^ w[14] ^ w[ 8] ^ w[ 6]), 1u); + const u32 c_23s = rotl32 ((c_20s ^ w[15] ^ w[ 9] ^ w[ 7]), 1u); + const u32 c_24s = rotl32 ((c_21s ^ c_16s ^ w[10] ^ w[ 8]), 1u); + const u32 c_25s = rotl32 ((c_22s ^ c_17s ^ w[11] ^ w[ 9]), 1u); + const u32 c_26s = rotl32 ((c_23s ^ c_18s ^ w[12] ^ w[10]), 1u); + const u32 c_27s = rotl32 ((c_24s ^ c_19s ^ w[13] ^ w[11]), 1u); + const u32 c_28s = rotl32 ((c_25s ^ c_20s ^ w[14] ^ w[12]), 1u); + const u32 c_29s = rotl32 ((c_26s ^ c_21s ^ w[15] ^ w[13]), 1u); + const u32 c_30s = rotl32 ((c_27s ^ c_22s ^ c_16s ^ w[14]), 1u); + const u32 c_31s = rotl32 ((c_28s ^ c_23s ^ c_17s ^ w[15]), 1u); + const u32 c_32s = rotl32 ((c_29s ^ c_24s ^ c_18s ^ c_16s), 1u); + const u32 c_33s = rotl32 ((c_30s ^ c_25s ^ c_19s ^ c_17s), 1u); + const u32 c_34s = rotl32 ((c_31s ^ c_26s ^ c_20s ^ c_18s), 1u); + const u32 c_35s = rotl32 ((c_32s ^ c_27s ^ c_21s ^ c_19s), 1u); + const u32 c_36s = rotl32 ((c_33s ^ c_28s ^ c_22s ^ c_20s), 1u); + const u32 c_37s = rotl32 ((c_34s ^ c_29s ^ c_23s ^ c_21s), 1u); + const u32 c_38s = rotl32 ((c_35s ^ c_30s ^ c_24s ^ c_22s), 1u); + const u32 c_39s = rotl32 ((c_36s ^ c_31s ^ c_25s ^ c_23s), 1u); + const u32 c_40s = rotl32 ((c_37s ^ c_32s ^ c_26s ^ c_24s), 1u); + const u32 c_41s = rotl32 ((c_38s ^ c_33s ^ c_27s ^ c_25s), 1u); + const u32 c_42s = rotl32 ((c_39s ^ c_34s ^ c_28s ^ c_26s), 1u); + const u32 c_43s = rotl32 ((c_40s ^ c_35s ^ c_29s ^ c_27s), 1u); + const u32 c_44s = rotl32 ((c_41s ^ c_36s ^ c_30s ^ c_28s), 1u); + const u32 c_45s = rotl32 ((c_42s ^ c_37s ^ c_31s ^ c_29s), 1u); + const u32 c_46s = rotl32 ((c_43s ^ c_38s ^ c_32s ^ c_30s), 1u); + const u32 c_47s = rotl32 ((c_44s ^ c_39s ^ c_33s ^ c_31s), 1u); + const u32 c_48s = rotl32 ((c_45s ^ c_40s ^ c_34s ^ c_32s), 1u); + const u32 c_49s = rotl32 ((c_46s ^ c_41s ^ c_35s ^ c_33s), 1u); + const u32 c_50s = rotl32 ((c_47s ^ c_42s ^ c_36s ^ c_34s), 1u); + const u32 c_51s = rotl32 ((c_48s ^ c_43s ^ c_37s ^ c_35s), 1u); + const u32 c_52s = rotl32 ((c_49s ^ c_44s ^ c_38s ^ c_36s), 1u); + const u32 c_53s = rotl32 ((c_50s ^ c_45s ^ c_39s ^ c_37s), 1u); + const u32 c_54s = rotl32 ((c_51s ^ c_46s ^ c_40s ^ c_38s), 1u); + const u32 c_55s = rotl32 ((c_52s ^ c_47s ^ c_41s ^ c_39s), 1u); + const u32 c_56s = rotl32 ((c_53s ^ c_48s ^ c_42s ^ c_40s), 1u); + const u32 c_57s = rotl32 ((c_54s ^ c_49s ^ c_43s ^ c_41s), 1u); + const u32 c_58s = rotl32 ((c_55s ^ c_50s ^ c_44s ^ c_42s), 1u); + const u32 c_59s = rotl32 ((c_56s ^ c_51s ^ c_45s ^ c_43s), 1u); + const u32 c_60s = rotl32 ((c_57s ^ c_52s ^ c_46s ^ c_44s), 1u); + const u32 c_61s = rotl32 ((c_58s ^ c_53s ^ c_47s ^ c_45s), 1u); + const u32 c_62s = rotl32 ((c_59s ^ c_54s ^ c_48s ^ c_46s), 1u); + const u32 c_63s = rotl32 ((c_60s ^ c_55s ^ c_49s ^ c_47s), 1u); + const u32 c_64s = rotl32 ((c_61s ^ c_56s ^ c_50s ^ c_48s), 1u); + const u32 c_65s = rotl32 ((c_62s ^ c_57s ^ c_51s ^ c_49s), 1u); + const u32 c_66s = rotl32 ((c_63s ^ c_58s ^ c_52s ^ c_50s), 1u); + const u32 c_67s = rotl32 ((c_64s ^ c_59s ^ c_53s ^ c_51s), 1u); + const u32 c_68s = rotl32 ((c_65s ^ c_60s ^ c_54s ^ c_52s), 1u); + const u32 c_69s = rotl32 ((c_66s ^ c_61s ^ c_55s ^ c_53s), 1u); + const u32 c_70s = rotl32 ((c_67s ^ c_62s ^ c_56s ^ c_54s), 1u); + const u32 c_71s = rotl32 ((c_68s ^ c_63s ^ c_57s ^ c_55s), 1u); + const u32 c_72s = rotl32 ((c_69s ^ c_64s ^ c_58s ^ c_56s), 1u); + const u32 c_73s = rotl32 ((c_70s ^ c_65s ^ c_59s ^ c_57s), 1u); + const u32 c_74s = rotl32 ((c_71s ^ c_66s ^ c_60s ^ c_58s), 1u); + const u32 c_75s = rotl32 ((c_72s ^ c_67s ^ c_61s ^ c_59s), 1u); + const u32 c_76s = rotl32 ((c_73s ^ c_68s ^ c_62s ^ c_60s), 1u); + const u32 c_77s = rotl32 ((c_74s ^ c_69s ^ c_63s ^ c_61s), 1u); + const u32 c_78s = rotl32 ((c_75s ^ c_70s ^ c_64s ^ c_62s), 1u); + const u32 c_79s = rotl32 ((c_76s ^ c_71s ^ c_65s ^ c_63s), 1u); + + const u32 c_17sK = c_17s + SHA1C00; + const u32 c_18sK = c_18s + SHA1C00; + const u32 c_20sK = c_20s + SHA1C01; + const u32 c_21sK = c_21s + SHA1C01; + const u32 c_23sK = c_23s + SHA1C01; + const u32 c_26sK = c_26s + SHA1C01; + const u32 c_27sK = c_27s + SHA1C01; + const u32 c_29sK = c_29s + SHA1C01; + const u32 c_33sK = c_33s + SHA1C01; + const u32 c_39sK = c_39s + SHA1C01; + const u32 c_41sK = c_41s + SHA1C02; + const u32 c_45sK = c_45s + SHA1C02; + const u32 c_53sK = c_53s + SHA1C02; + const u32 c_65sK = c_65s + SHA1C03; + const u32 c_69sK = c_69s + SHA1C03; + + const u32 w1 = w[ 1] + SHA1C00; + const u32 w2 = w[ 2] + SHA1C00; + const u32 w3 = w[ 3] + SHA1C00; + const u32 w4 = w[ 4] + SHA1C00; + const u32 w5 = w[ 5] + SHA1C00; + const u32 w6 = w[ 6] + SHA1C00; + const u32 w7 = w[ 7] + SHA1C00; + const u32 w8 = w[ 8] + SHA1C00; + const u32 w9 = w[ 9] + SHA1C00; + const u32 wa = w[10] + SHA1C00; + const u32 wb = w[11] + SHA1C00; + const u32 wc = w[12] + SHA1C00; + const u32 wd = w[13] + SHA1C00; + const u32 we = w[14] + SHA1C00; + const u32 wf = w[15] + SHA1C00; + + /** + * loop + */ + + const u32 bf_loops = ceil ((float) bfs_cnt / VECT_DIV); + + u32x w0l = w[0]; + + for (u32 il_pos = 0; il_pos < bf_loops; il_pos++) + { + const u32x w0r = c_bfs[il_pos]; + + const u32x w0 = w0l | w0r; + + const u32x w0s01 = rotl32 (w0, 1u); + const u32x w0s02 = rotl32 (w0, 2u); + const u32x w0s03 = rotl32 (w0, 3u); + const u32x w0s04 = rotl32 (w0, 4u); + const u32x w0s05 = rotl32 (w0, 5u); + const u32x w0s06 = rotl32 (w0, 6u); + const u32x w0s07 = rotl32 (w0, 7u); + const u32x w0s08 = rotl32 (w0, 8u); + const u32x w0s09 = rotl32 (w0, 9u); + const u32x w0s10 = rotl32 (w0, 10u); + const u32x w0s11 = rotl32 (w0, 11u); + const u32x w0s12 = rotl32 (w0, 12u); + const u32x w0s13 = rotl32 (w0, 13u); + const u32x w0s14 = rotl32 (w0, 14u); + const u32x w0s15 = rotl32 (w0, 15u); + const u32x w0s16 = rotl32 (w0, 16u); + const u32x w0s17 = rotl32 (w0, 17u); + const u32x w0s18 = rotl32 (w0, 18u); + const u32x w0s19 = rotl32 (w0, 19u); + const u32x w0s20 = rotl32 (w0, 20u); + const u32x w0s21 = rotl32 (w0, 21u); + const u32x w0s22 = rotl32 (w0, 22U); + + const u32x w0s04___w0s06 = w0s04 ^ w0s06; + const u32x w0s04___w0s08 = w0s04 ^ w0s08; + const u32x w0s08___w0s12 = w0s08 ^ w0s12; + const u32x w0s04___w0s06___w0s07 = w0s04___w0s06 ^ w0s07; + + u32x a = SHA1M_A; + u32x b = SHA1M_B; + u32x c = SHA1M_C; + u32x d = SHA1M_D; + u32x e = SHA1M_E; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w0); + SHA1_STEPX(SHA1_F0o, e, a, b, c, d, w1); + SHA1_STEPX(SHA1_F0o, d, e, a, b, c, w2); + SHA1_STEPX(SHA1_F0o, c, d, e, a, b, w3); + SHA1_STEPX(SHA1_F0o, b, c, d, e, a, w4); + SHA1_STEPX(SHA1_F0o, a, b, c, d, e, w5); + SHA1_STEPX(SHA1_F0o, e, a, b, c, d, w6); + SHA1_STEPX(SHA1_F0o, d, e, a, b, c, w7); + SHA1_STEPX(SHA1_F0o, c, d, e, a, b, w8); + SHA1_STEPX(SHA1_F0o, b, c, d, e, a, w9); + SHA1_STEPX(SHA1_F0o, a, b, c, d, e, wa); + SHA1_STEPX(SHA1_F0o, e, a, b, c, d, wb); + SHA1_STEPX(SHA1_F0o, d, e, a, b, c, wc); + SHA1_STEPX(SHA1_F0o, c, d, e, a, b, wd); + SHA1_STEPX(SHA1_F0o, b, c, d, e, a, we); + SHA1_STEPX(SHA1_F0o, a, b, c, d, e, wf); + + SHA1_STEP (SHA1_F0o, e, a, b, c, d, (c_16s ^ w0s01)); + SHA1_STEPX(SHA1_F0o, d, e, a, b, c, (c_17sK)); + SHA1_STEPX(SHA1_F0o, c, d, e, a, b, (c_18sK)); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, (c_19s ^ w0s02)); + + #undef K + #define K SHA1C01 + + SHA1_STEPX(SHA1_F1 , a, b, c, d, e, (c_20sK)); + SHA1_STEPX(SHA1_F1 , e, a, b, c, d, (c_21sK)); + SHA1_STEP (SHA1_F1 , d, e, a, b, c, (c_22s ^ w0s03)); + SHA1_STEPX(SHA1_F1 , c, d, e, a, b, (c_23sK)); + SHA1_STEP (SHA1_F1 , b, c, d, e, a, (c_24s ^ w0s02)); + SHA1_STEP (SHA1_F1 , a, b, c, d, e, (c_25s ^ w0s04)); + SHA1_STEPX(SHA1_F1 , e, a, b, c, d, (c_26sK)); + SHA1_STEPX(SHA1_F1 , d, e, a, b, c, (c_27sK)); + SHA1_STEP (SHA1_F1 , c, d, e, a, b, (c_28s ^ w0s05)); + SHA1_STEPX(SHA1_F1 , b, c, d, e, a, (c_29sK)); + SHA1_STEP (SHA1_F1 , a, b, c, d, e, (c_30s ^ w0s02 ^ w0s04)); + SHA1_STEP (SHA1_F1 , e, a, b, c, d, (c_31s ^ w0s06)); + SHA1_STEP (SHA1_F1 , d, e, a, b, c, (c_32s ^ w0s02 ^ w0s03)); + SHA1_STEPX(SHA1_F1 , c, d, e, a, b, (c_33sK)); + SHA1_STEP (SHA1_F1 , b, c, d, e, a, (c_34s ^ w0s07)); + SHA1_STEP (SHA1_F1 , a, b, c, d, e, (c_35s ^ w0s04)); + SHA1_STEP (SHA1_F1 , e, a, b, c, d, (c_36s ^ w0s04___w0s06)); + SHA1_STEP (SHA1_F1 , d, e, a, b, c, (c_37s ^ w0s08)); + SHA1_STEP (SHA1_F1 , c, d, e, a, b, (c_38s ^ w0s04)); + SHA1_STEPX(SHA1_F1 , b, c, d, e, a, (c_39sK)); + + #undef K + #define K SHA1C02 + + SHA1_STEP (SHA1_F2o, a, b, c, d, e, (c_40s ^ w0s04 ^ w0s09)); + SHA1_STEPX(SHA1_F2o, e, a, b, c, d, (c_41sK)); + SHA1_STEP (SHA1_F2o, d, e, a, b, c, (c_42s ^ w0s06 ^ w0s08)); + SHA1_STEP (SHA1_F2o, c, d, e, a, b, (c_43s ^ w0s10)); + SHA1_STEP (SHA1_F2o, b, c, d, e, a, (c_44s ^ w0s03 ^ w0s06 ^ w0s07)); + SHA1_STEPX(SHA1_F2o, a, b, c, d, e, (c_45sK)); + SHA1_STEP (SHA1_F2o, e, a, b, c, d, (c_46s ^ w0s04 ^ w0s11)); + SHA1_STEP (SHA1_F2o, d, e, a, b, c, (c_47s ^ w0s04___w0s08)); + SHA1_STEP (SHA1_F2o, c, d, e, a, b, (c_48s ^ w0s03 ^ w0s04___w0s08 ^ w0s05 ^ w0s10)); + SHA1_STEP (SHA1_F2o, b, c, d, e, a, (c_49s ^ w0s12)); + SHA1_STEP (SHA1_F2o, a, b, c, d, e, (c_50s ^ w0s08)); + SHA1_STEP (SHA1_F2o, e, a, b, c, d, (c_51s ^ w0s04___w0s06)); + SHA1_STEP (SHA1_F2o, d, e, a, b, c, (c_52s ^ w0s04___w0s08 ^ w0s13)); + SHA1_STEPX(SHA1_F2o, c, d, e, a, b, (c_53sK)); + SHA1_STEP (SHA1_F2o, b, c, d, e, a, (c_54s ^ w0s07 ^ w0s10 ^ w0s12)); + SHA1_STEP (SHA1_F2o, a, b, c, d, e, (c_55s ^ w0s14)); + SHA1_STEP (SHA1_F2o, e, a, b, c, d, (c_56s ^ w0s04___w0s06___w0s07 ^ w0s10 ^ w0s11)); + SHA1_STEP (SHA1_F2o, d, e, a, b, c, (c_57s ^ w0s08)); + SHA1_STEP (SHA1_F2o, c, d, e, a, b, (c_58s ^ w0s04___w0s08 ^ w0s15)); + SHA1_STEP (SHA1_F2o, b, c, d, e, a, (c_59s ^ w0s08___w0s12)); + + #undef K + #define K SHA1C03 + + SHA1_STEP (SHA1_F1 , a, b, c, d, e, (c_60s ^ w0s04 ^ w0s08___w0s12 ^ w0s07 ^ w0s14)); + SHA1_STEP (SHA1_F1 , e, a, b, c, d, (c_61s ^ w0s16)); + SHA1_STEP (SHA1_F1 , d, e, a, b, c, (c_62s ^ w0s04___w0s06 ^ w0s08___w0s12)); + SHA1_STEP (SHA1_F1 , c, d, e, a, b, (c_63s ^ w0s08)); + SHA1_STEP (SHA1_F1 , b, c, d, e, a, (c_64s ^ w0s04___w0s06___w0s07 ^ w0s08___w0s12 ^ w0s17)); + SHA1_STEPX(SHA1_F1 , a, b, c, d, e, (c_65sK)); + SHA1_STEP (SHA1_F1 , e, a, b, c, d, (c_66s ^ w0s14 ^ w0s16)); + SHA1_STEP (SHA1_F1 , d, e, a, b, c, (c_67s ^ w0s08 ^ w0s18)); + SHA1_STEP (SHA1_F1 , c, d, e, a, b, (c_68s ^ w0s11 ^ w0s14 ^ w0s15)); + SHA1_STEPX(SHA1_F1 , b, c, d, e, a, (c_69sK)); + SHA1_STEP (SHA1_F1 , a, b, c, d, e, (c_70s ^ w0s12 ^ w0s19)); + SHA1_STEP (SHA1_F1 , e, a, b, c, d, (c_71s ^ w0s12 ^ w0s16)); + SHA1_STEP (SHA1_F1 , d, e, a, b, c, (c_72s ^ w0s05 ^ w0s11 ^ w0s12 ^ w0s13 ^ w0s16 ^ w0s18)); + SHA1_STEP (SHA1_F1 , c, d, e, a, b, (c_73s ^ w0s20)); + SHA1_STEP (SHA1_F1 , b, c, d, e, a, (c_74s ^ w0s08 ^ w0s16)); + SHA1_STEP (SHA1_F1 , a, b, c, d, e, (c_75s ^ w0s06 ^ w0s12 ^ w0s14)); + SHA1_STEP (SHA1_F1 , e, a, b, c, d, (c_76s ^ w0s07 ^ w0s08___w0s12 ^ w0s16 ^ w0s21)); + SHA1_STEP (SHA1_F1 , d, e, a, b, c, (c_77s)); + SHA1_STEP (SHA1_F1 , c, d, e, a, b, (c_78s ^ w0s07 ^ w0s08 ^ w0s15 ^ w0s18 ^ w0s20)); + SHA1_STEP (SHA1_F1 , b, c, d, e, a, (c_79s ^ w0s08 ^ w0s22)); + + + const u32x r0 = d; + const u32x r1 = e; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_M + } +} + +__device__ static void m00110s (u32 w[16], const u32 pw_len, const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const u32x *words_buf_r, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset) +{ + /** + * modifier + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 c_16s = rotl32 ((w[13] ^ w[ 8] ^ w[ 2] ), 1u); + const u32 c_17s = rotl32 ((w[14] ^ w[ 9] ^ w[ 3] ^ w[ 1]), 1u); + const u32 c_18s = rotl32 ((w[15] ^ w[10] ^ w[ 4] ^ w[ 2]), 1u); + const u32 c_19s = rotl32 ((c_16s ^ w[11] ^ w[ 5] ^ w[ 3]), 1u); + const u32 c_20s = rotl32 ((c_17s ^ w[12] ^ w[ 6] ^ w[ 4]), 1u); + const u32 c_21s = rotl32 ((c_18s ^ w[13] ^ w[ 7] ^ w[ 5]), 1u); + const u32 c_22s = rotl32 ((c_19s ^ w[14] ^ w[ 8] ^ w[ 6]), 1u); + const u32 c_23s = rotl32 ((c_20s ^ w[15] ^ w[ 9] ^ w[ 7]), 1u); + const u32 c_24s = rotl32 ((c_21s ^ c_16s ^ w[10] ^ w[ 8]), 1u); + const u32 c_25s = rotl32 ((c_22s ^ c_17s ^ w[11] ^ w[ 9]), 1u); + const u32 c_26s = rotl32 ((c_23s ^ c_18s ^ w[12] ^ w[10]), 1u); + const u32 c_27s = rotl32 ((c_24s ^ c_19s ^ w[13] ^ w[11]), 1u); + const u32 c_28s = rotl32 ((c_25s ^ c_20s ^ w[14] ^ w[12]), 1u); + const u32 c_29s = rotl32 ((c_26s ^ c_21s ^ w[15] ^ w[13]), 1u); + const u32 c_30s = rotl32 ((c_27s ^ c_22s ^ c_16s ^ w[14]), 1u); + const u32 c_31s = rotl32 ((c_28s ^ c_23s ^ c_17s ^ w[15]), 1u); + const u32 c_32s = rotl32 ((c_29s ^ c_24s ^ c_18s ^ c_16s), 1u); + const u32 c_33s = rotl32 ((c_30s ^ c_25s ^ c_19s ^ c_17s), 1u); + const u32 c_34s = rotl32 ((c_31s ^ c_26s ^ c_20s ^ c_18s), 1u); + const u32 c_35s = rotl32 ((c_32s ^ c_27s ^ c_21s ^ c_19s), 1u); + const u32 c_36s = rotl32 ((c_33s ^ c_28s ^ c_22s ^ c_20s), 1u); + const u32 c_37s = rotl32 ((c_34s ^ c_29s ^ c_23s ^ c_21s), 1u); + const u32 c_38s = rotl32 ((c_35s ^ c_30s ^ c_24s ^ c_22s), 1u); + const u32 c_39s = rotl32 ((c_36s ^ c_31s ^ c_25s ^ c_23s), 1u); + const u32 c_40s = rotl32 ((c_37s ^ c_32s ^ c_26s ^ c_24s), 1u); + const u32 c_41s = rotl32 ((c_38s ^ c_33s ^ c_27s ^ c_25s), 1u); + const u32 c_42s = rotl32 ((c_39s ^ c_34s ^ c_28s ^ c_26s), 1u); + const u32 c_43s = rotl32 ((c_40s ^ c_35s ^ c_29s ^ c_27s), 1u); + const u32 c_44s = rotl32 ((c_41s ^ c_36s ^ c_30s ^ c_28s), 1u); + const u32 c_45s = rotl32 ((c_42s ^ c_37s ^ c_31s ^ c_29s), 1u); + const u32 c_46s = rotl32 ((c_43s ^ c_38s ^ c_32s ^ c_30s), 1u); + const u32 c_47s = rotl32 ((c_44s ^ c_39s ^ c_33s ^ c_31s), 1u); + const u32 c_48s = rotl32 ((c_45s ^ c_40s ^ c_34s ^ c_32s), 1u); + const u32 c_49s = rotl32 ((c_46s ^ c_41s ^ c_35s ^ c_33s), 1u); + const u32 c_50s = rotl32 ((c_47s ^ c_42s ^ c_36s ^ c_34s), 1u); + const u32 c_51s = rotl32 ((c_48s ^ c_43s ^ c_37s ^ c_35s), 1u); + const u32 c_52s = rotl32 ((c_49s ^ c_44s ^ c_38s ^ c_36s), 1u); + const u32 c_53s = rotl32 ((c_50s ^ c_45s ^ c_39s ^ c_37s), 1u); + const u32 c_54s = rotl32 ((c_51s ^ c_46s ^ c_40s ^ c_38s), 1u); + const u32 c_55s = rotl32 ((c_52s ^ c_47s ^ c_41s ^ c_39s), 1u); + const u32 c_56s = rotl32 ((c_53s ^ c_48s ^ c_42s ^ c_40s), 1u); + const u32 c_57s = rotl32 ((c_54s ^ c_49s ^ c_43s ^ c_41s), 1u); + const u32 c_58s = rotl32 ((c_55s ^ c_50s ^ c_44s ^ c_42s), 1u); + const u32 c_59s = rotl32 ((c_56s ^ c_51s ^ c_45s ^ c_43s), 1u); + const u32 c_60s = rotl32 ((c_57s ^ c_52s ^ c_46s ^ c_44s), 1u); + const u32 c_61s = rotl32 ((c_58s ^ c_53s ^ c_47s ^ c_45s), 1u); + const u32 c_62s = rotl32 ((c_59s ^ c_54s ^ c_48s ^ c_46s), 1u); + const u32 c_63s = rotl32 ((c_60s ^ c_55s ^ c_49s ^ c_47s), 1u); + const u32 c_64s = rotl32 ((c_61s ^ c_56s ^ c_50s ^ c_48s), 1u); + const u32 c_65s = rotl32 ((c_62s ^ c_57s ^ c_51s ^ c_49s), 1u); + const u32 c_66s = rotl32 ((c_63s ^ c_58s ^ c_52s ^ c_50s), 1u); + const u32 c_67s = rotl32 ((c_64s ^ c_59s ^ c_53s ^ c_51s), 1u); + const u32 c_68s = rotl32 ((c_65s ^ c_60s ^ c_54s ^ c_52s), 1u); + const u32 c_69s = rotl32 ((c_66s ^ c_61s ^ c_55s ^ c_53s), 1u); + const u32 c_70s = rotl32 ((c_67s ^ c_62s ^ c_56s ^ c_54s), 1u); + const u32 c_71s = rotl32 ((c_68s ^ c_63s ^ c_57s ^ c_55s), 1u); + const u32 c_72s = rotl32 ((c_69s ^ c_64s ^ c_58s ^ c_56s), 1u); + const u32 c_73s = rotl32 ((c_70s ^ c_65s ^ c_59s ^ c_57s), 1u); + const u32 c_74s = rotl32 ((c_71s ^ c_66s ^ c_60s ^ c_58s), 1u); + const u32 c_75s = rotl32 ((c_72s ^ c_67s ^ c_61s ^ c_59s), 1u); + + const u32 c_17sK = c_17s + SHA1C00; + const u32 c_18sK = c_18s + SHA1C00; + const u32 c_20sK = c_20s + SHA1C01; + const u32 c_21sK = c_21s + SHA1C01; + const u32 c_23sK = c_23s + SHA1C01; + const u32 c_26sK = c_26s + SHA1C01; + const u32 c_27sK = c_27s + SHA1C01; + const u32 c_29sK = c_29s + SHA1C01; + const u32 c_33sK = c_33s + SHA1C01; + const u32 c_39sK = c_39s + SHA1C01; + const u32 c_41sK = c_41s + SHA1C02; + const u32 c_45sK = c_45s + SHA1C02; + const u32 c_53sK = c_53s + SHA1C02; + const u32 c_65sK = c_65s + SHA1C03; + const u32 c_69sK = c_69s + SHA1C03; + + const u32 w1 = w[ 1] + SHA1C00; + const u32 w2 = w[ 2] + SHA1C00; + const u32 w3 = w[ 3] + SHA1C00; + const u32 w4 = w[ 4] + SHA1C00; + const u32 w5 = w[ 5] + SHA1C00; + const u32 w6 = w[ 6] + SHA1C00; + const u32 w7 = w[ 7] + SHA1C00; + const u32 w8 = w[ 8] + SHA1C00; + const u32 w9 = w[ 9] + SHA1C00; + const u32 wa = w[10] + SHA1C00; + const u32 wb = w[11] + SHA1C00; + const u32 wc = w[12] + SHA1C00; + const u32 wd = w[13] + SHA1C00; + const u32 we = w[14] + SHA1C00; + const u32 wf = w[15] + SHA1C00; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * reverse + */ + + const u32 e_rev = rotl32 (search[1], 2u) - SHA1C03; + + /** + * loop + */ + + const u32 bf_loops = ceil ((float) bfs_cnt / VECT_DIV); + + u32x w0l = w[0]; + + for (u32 il_pos = 0; il_pos < bf_loops; il_pos++) + { + const u32x w0r = c_bfs[il_pos]; + + const u32x w0 = w0l | w0r; + + const u32x w0s01 = rotl32 (w0, 1u); + const u32x w0s02 = rotl32 (w0, 2u); + const u32x w0s03 = rotl32 (w0, 3u); + const u32x w0s04 = rotl32 (w0, 4u); + const u32x w0s05 = rotl32 (w0, 5u); + const u32x w0s06 = rotl32 (w0, 6u); + const u32x w0s07 = rotl32 (w0, 7u); + const u32x w0s08 = rotl32 (w0, 8u); + const u32x w0s09 = rotl32 (w0, 9u); + const u32x w0s10 = rotl32 (w0, 10u); + const u32x w0s11 = rotl32 (w0, 11u); + const u32x w0s12 = rotl32 (w0, 12u); + const u32x w0s13 = rotl32 (w0, 13u); + const u32x w0s14 = rotl32 (w0, 14u); + const u32x w0s15 = rotl32 (w0, 15u); + const u32x w0s16 = rotl32 (w0, 16u); + const u32x w0s17 = rotl32 (w0, 17u); + const u32x w0s18 = rotl32 (w0, 18u); + const u32x w0s19 = rotl32 (w0, 19u); + const u32x w0s20 = rotl32 (w0, 20u); + + const u32x w0s04___w0s06 = w0s04 ^ w0s06; + const u32x w0s04___w0s08 = w0s04 ^ w0s08; + const u32x w0s08___w0s12 = w0s08 ^ w0s12; + const u32x w0s04___w0s06___w0s07 = w0s04___w0s06 ^ w0s07; + + u32x a = SHA1M_A; + u32x b = SHA1M_B; + u32x c = SHA1M_C; + u32x d = SHA1M_D; + u32x e = SHA1M_E; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w0); + SHA1_STEPX(SHA1_F0o, e, a, b, c, d, w1); + SHA1_STEPX(SHA1_F0o, d, e, a, b, c, w2); + SHA1_STEPX(SHA1_F0o, c, d, e, a, b, w3); + SHA1_STEPX(SHA1_F0o, b, c, d, e, a, w4); + SHA1_STEPX(SHA1_F0o, a, b, c, d, e, w5); + SHA1_STEPX(SHA1_F0o, e, a, b, c, d, w6); + SHA1_STEPX(SHA1_F0o, d, e, a, b, c, w7); + SHA1_STEPX(SHA1_F0o, c, d, e, a, b, w8); + SHA1_STEPX(SHA1_F0o, b, c, d, e, a, w9); + SHA1_STEPX(SHA1_F0o, a, b, c, d, e, wa); + SHA1_STEPX(SHA1_F0o, e, a, b, c, d, wb); + SHA1_STEPX(SHA1_F0o, d, e, a, b, c, wc); + SHA1_STEPX(SHA1_F0o, c, d, e, a, b, wd); + SHA1_STEPX(SHA1_F0o, b, c, d, e, a, we); + SHA1_STEPX(SHA1_F0o, a, b, c, d, e, wf); + + SHA1_STEP (SHA1_F0o, e, a, b, c, d, (c_16s ^ w0s01)); + SHA1_STEPX(SHA1_F0o, d, e, a, b, c, (c_17sK)); + SHA1_STEPX(SHA1_F0o, c, d, e, a, b, (c_18sK)); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, (c_19s ^ w0s02)); + + #undef K + #define K SHA1C01 + + SHA1_STEPX(SHA1_F1 , a, b, c, d, e, (c_20sK)); + SHA1_STEPX(SHA1_F1 , e, a, b, c, d, (c_21sK)); + SHA1_STEP (SHA1_F1 , d, e, a, b, c, (c_22s ^ w0s03)); + SHA1_STEPX(SHA1_F1 , c, d, e, a, b, (c_23sK)); + SHA1_STEP (SHA1_F1 , b, c, d, e, a, (c_24s ^ w0s02)); + SHA1_STEP (SHA1_F1 , a, b, c, d, e, (c_25s ^ w0s04)); + SHA1_STEPX(SHA1_F1 , e, a, b, c, d, (c_26sK)); + SHA1_STEPX(SHA1_F1 , d, e, a, b, c, (c_27sK)); + SHA1_STEP (SHA1_F1 , c, d, e, a, b, (c_28s ^ w0s05)); + SHA1_STEPX(SHA1_F1 , b, c, d, e, a, (c_29sK)); + SHA1_STEP (SHA1_F1 , a, b, c, d, e, (c_30s ^ w0s02 ^ w0s04)); + SHA1_STEP (SHA1_F1 , e, a, b, c, d, (c_31s ^ w0s06)); + SHA1_STEP (SHA1_F1 , d, e, a, b, c, (c_32s ^ w0s02 ^ w0s03)); + SHA1_STEPX(SHA1_F1 , c, d, e, a, b, (c_33sK)); + SHA1_STEP (SHA1_F1 , b, c, d, e, a, (c_34s ^ w0s07)); + SHA1_STEP (SHA1_F1 , a, b, c, d, e, (c_35s ^ w0s04)); + SHA1_STEP (SHA1_F1 , e, a, b, c, d, (c_36s ^ w0s04___w0s06)); + SHA1_STEP (SHA1_F1 , d, e, a, b, c, (c_37s ^ w0s08)); + SHA1_STEP (SHA1_F1 , c, d, e, a, b, (c_38s ^ w0s04)); + SHA1_STEPX(SHA1_F1 , b, c, d, e, a, (c_39sK)); + + #undef K + #define K SHA1C02 + + SHA1_STEP (SHA1_F2o, a, b, c, d, e, (c_40s ^ w0s04 ^ w0s09)); + SHA1_STEPX(SHA1_F2o, e, a, b, c, d, (c_41sK)); + SHA1_STEP (SHA1_F2o, d, e, a, b, c, (c_42s ^ w0s06 ^ w0s08)); + SHA1_STEP (SHA1_F2o, c, d, e, a, b, (c_43s ^ w0s10)); + SHA1_STEP (SHA1_F2o, b, c, d, e, a, (c_44s ^ w0s03 ^ w0s06 ^ w0s07)); + SHA1_STEPX(SHA1_F2o, a, b, c, d, e, (c_45sK)); + SHA1_STEP (SHA1_F2o, e, a, b, c, d, (c_46s ^ w0s04 ^ w0s11)); + SHA1_STEP (SHA1_F2o, d, e, a, b, c, (c_47s ^ w0s04___w0s08)); + SHA1_STEP (SHA1_F2o, c, d, e, a, b, (c_48s ^ w0s03 ^ w0s04___w0s08 ^ w0s05 ^ w0s10)); + SHA1_STEP (SHA1_F2o, b, c, d, e, a, (c_49s ^ w0s12)); + SHA1_STEP (SHA1_F2o, a, b, c, d, e, (c_50s ^ w0s08)); + SHA1_STEP (SHA1_F2o, e, a, b, c, d, (c_51s ^ w0s04___w0s06)); + SHA1_STEP (SHA1_F2o, d, e, a, b, c, (c_52s ^ w0s04___w0s08 ^ w0s13)); + SHA1_STEPX(SHA1_F2o, c, d, e, a, b, (c_53sK)); + SHA1_STEP (SHA1_F2o, b, c, d, e, a, (c_54s ^ w0s07 ^ w0s10 ^ w0s12)); + SHA1_STEP (SHA1_F2o, a, b, c, d, e, (c_55s ^ w0s14)); + SHA1_STEP (SHA1_F2o, e, a, b, c, d, (c_56s ^ w0s04___w0s06___w0s07 ^ w0s10 ^ w0s11)); + SHA1_STEP (SHA1_F2o, d, e, a, b, c, (c_57s ^ w0s08)); + SHA1_STEP (SHA1_F2o, c, d, e, a, b, (c_58s ^ w0s04___w0s08 ^ w0s15)); + SHA1_STEP (SHA1_F2o, b, c, d, e, a, (c_59s ^ w0s08___w0s12)); + + #undef K + #define K SHA1C03 + + SHA1_STEP (SHA1_F1 , a, b, c, d, e, (c_60s ^ w0s04 ^ w0s08___w0s12 ^ w0s07 ^ w0s14)); + SHA1_STEP (SHA1_F1 , e, a, b, c, d, (c_61s ^ w0s16)); + SHA1_STEP (SHA1_F1 , d, e, a, b, c, (c_62s ^ w0s04___w0s06 ^ w0s08___w0s12)); + SHA1_STEP (SHA1_F1 , c, d, e, a, b, (c_63s ^ w0s08)); + SHA1_STEP (SHA1_F1 , b, c, d, e, a, (c_64s ^ w0s04___w0s06___w0s07 ^ w0s08___w0s12 ^ w0s17)); + SHA1_STEPX(SHA1_F1 , a, b, c, d, e, (c_65sK)); + SHA1_STEP (SHA1_F1 , e, a, b, c, d, (c_66s ^ w0s14 ^ w0s16)); + SHA1_STEP (SHA1_F1 , d, e, a, b, c, (c_67s ^ w0s08 ^ w0s18)); + SHA1_STEP (SHA1_F1 , c, d, e, a, b, (c_68s ^ w0s11 ^ w0s14 ^ w0s15)); + SHA1_STEPX(SHA1_F1 , b, c, d, e, a, (c_69sK)); + SHA1_STEP (SHA1_F1 , a, b, c, d, e, (c_70s ^ w0s12 ^ w0s19)); + SHA1_STEP (SHA1_F1 , e, a, b, c, d, (c_71s ^ w0s12 ^ w0s16)); + SHA1_STEP (SHA1_F1 , d, e, a, b, c, (c_72s ^ w0s05 ^ w0s11 ^ w0s12 ^ w0s13 ^ w0s16 ^ w0s18)); + SHA1_STEP (SHA1_F1 , c, d, e, a, b, (c_73s ^ w0s20)); + SHA1_STEP (SHA1_F1 , b, c, d, e, a, (c_74s ^ w0s08 ^ w0s16)); + + SHA1_STEP_PE (SHA1_F1, a, b, c, d, e, (c_75s ^ w0s06 ^ w0s12 ^ w0s14)); + + bool q_cond = (e_rev != e); + + if (q_cond) continue; + + SHA1_STEP_PB (SHA1_F1, a, b, c, d, e, 0); + + const u32 c_76s = rotl32 ((c_73s ^ c_68s ^ c_62s ^ c_60s), 1u); + const u32 c_77s = rotl32 ((c_74s ^ c_69s ^ c_63s ^ c_61s), 1u); + const u32 c_78s = rotl32 ((c_75s ^ c_70s ^ c_64s ^ c_62s), 1u); + const u32 c_79s = rotl32 ((c_76s ^ c_71s ^ c_65s ^ c_63s), 1u); + + const u32x w0s21 = rotl32 (w0, 21u); + const u32x w0s22 = rotl32 (w0, 22U); + + SHA1_STEP (SHA1_F1 , e, a, b, c, d, (c_76s ^ w0s07 ^ w0s08___w0s12 ^ w0s16 ^ w0s21)); + SHA1_STEP (SHA1_F1 , d, e, a, b, c, (c_77s)); + SHA1_STEP (SHA1_F1 , c, d, e, a, b, (c_78s ^ w0s07 ^ w0s08 ^ w0s15 ^ w0s18 ^ w0s20)); + SHA1_STEP (SHA1_F1 , b, c, d, e, a, (c_79s ^ w0s08 ^ w0s22)); + + + const u32x r0 = d; + const u32x r1 = e; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_S + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m00110_m04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const u32x *words_buf_r, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32 w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = 0; + w[ 5] = 0; + w[ 6] = 0; + w[ 7] = 0; + w[ 8] = 0; + w[ 9] = 0; + w[10] = 0; + w[11] = 0; + w[12] = 0; + w[13] = 0; + w[14] = 0; + w[15] = pws[gid].i[15]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m00110m (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m00110_m08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const u32x *words_buf_r, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32 w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = pws[gid].i[ 4]; + w[ 5] = pws[gid].i[ 5]; + w[ 6] = pws[gid].i[ 6]; + w[ 7] = pws[gid].i[ 7]; + w[ 8] = 0; + w[ 9] = 0; + w[10] = 0; + w[11] = 0; + w[12] = 0; + w[13] = 0; + w[14] = 0; + w[15] = pws[gid].i[15]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m00110m (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m00110_m16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const u32x *words_buf_r, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32 w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = pws[gid].i[ 4]; + w[ 5] = pws[gid].i[ 5]; + w[ 6] = pws[gid].i[ 6]; + w[ 7] = pws[gid].i[ 7]; + w[ 8] = pws[gid].i[ 8]; + w[ 9] = pws[gid].i[ 9]; + w[10] = pws[gid].i[10]; + w[11] = pws[gid].i[11]; + w[12] = pws[gid].i[12]; + w[13] = pws[gid].i[13]; + w[14] = pws[gid].i[14]; + w[15] = pws[gid].i[15]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m00110m (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m00110_s04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const u32x *words_buf_r, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32 w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = 0; + w[ 5] = 0; + w[ 6] = 0; + w[ 7] = 0; + w[ 8] = 0; + w[ 9] = 0; + w[10] = 0; + w[11] = 0; + w[12] = 0; + w[13] = 0; + w[14] = 0; + w[15] = pws[gid].i[15]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m00110s (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m00110_s08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const u32x *words_buf_r, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32 w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = pws[gid].i[ 4]; + w[ 5] = pws[gid].i[ 5]; + w[ 6] = pws[gid].i[ 6]; + w[ 7] = pws[gid].i[ 7]; + w[ 8] = 0; + w[ 9] = 0; + w[10] = 0; + w[11] = 0; + w[12] = 0; + w[13] = 0; + w[14] = 0; + w[15] = pws[gid].i[15]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m00110s (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m00110_s16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const u32x *words_buf_r, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32 w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = pws[gid].i[ 4]; + w[ 5] = pws[gid].i[ 5]; + w[ 6] = pws[gid].i[ 6]; + w[ 7] = pws[gid].i[ 7]; + w[ 8] = pws[gid].i[ 8]; + w[ 9] = pws[gid].i[ 9]; + w[10] = pws[gid].i[10]; + w[11] = pws[gid].i[11]; + w[12] = pws[gid].i[12]; + w[13] = pws[gid].i[13]; + w[14] = pws[gid].i[14]; + w[15] = pws[gid].i[15]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m00110s (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} diff --git a/nv/m00120_a0.cu b/nv/m00120_a0.cu new file mode 100644 index 0000000000..286b033f2b --- /dev/null +++ b/nv/m00120_a0.cu @@ -0,0 +1,598 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _SHA1_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW2 +#define VECT_SIZE1 +#endif + +#define DGST_R0 3 +#define DGST_R1 4 +#define DGST_R2 2 +#define DGST_R3 1 + +#include "include/kernel_functions.c" +#include "types_nv.c" +#include "common_nv.c" +#include "include/rp_gpu.h" +#include "rp_nv.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +__device__ __constant__ gpu_rule_t c_rules[1024]; + +extern "C" __global__ void __launch_bounds__ (256, 1) m00120_m04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + u32x pw_buf1[4]; + + pw_buf1[0] = pws[gid].i[ 4]; + pw_buf1[1] = pws[gid].i[ 5]; + pw_buf1[2] = pws[gid].i[ 6]; + pw_buf1[3] = pws[gid].i[ 7]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[7]; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + u32x w1[4]; + u32x w2[4]; + u32x w3[4]; + + w0[0] = pw_buf0[0]; + w0[1] = pw_buf0[1]; + w0[2] = pw_buf0[2]; + w0[3] = pw_buf0[3]; + w1[0] = pw_buf1[0]; + w1[1] = pw_buf1[1]; + w1[2] = pw_buf1[2]; + w1[3] = pw_buf1[3]; + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 out_len = apply_rules (c_rules[il_pos].cmds, w0, w1, pw_len); + + /** + * prepend salt + */ + + const u32 out_salt_len = out_len + salt_len; + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + w0_t[0] = w0[0]; + w0_t[1] = w0[1]; + w0_t[2] = w0[2]; + w0_t[3] = w0[3]; + w1_t[0] = w1[0]; + w1_t[1] = w1[1]; + w1_t[2] = w1[2]; + w1_t[3] = w1[3]; + w2_t[0] = w2[0]; + w2_t[1] = w2[1]; + w2_t[2] = w2[2]; + w2_t[3] = w2[3]; + w3_t[0] = w3[0]; + w3_t[1] = w3[1]; + w3_t[2] = w3[2]; + w3_t[3] = w3[3]; + + switch_buffer_by_offset (w0_t, w1_t, w2_t, w3_t, salt_len); + + w0_t[0] |= salt_buf0[0]; + w0_t[1] |= salt_buf0[1]; + w0_t[2] |= salt_buf0[2]; + w0_t[3] |= salt_buf0[3]; + w1_t[0] |= salt_buf1[0]; + w1_t[1] |= salt_buf1[1]; + w1_t[2] |= salt_buf1[2]; + w1_t[3] |= salt_buf1[3]; + + append_0x80_4 (w0_t, w1_t, w2_t, w3_t, out_salt_len); + + w3_t[3] = out_salt_len * 8; + + /** + * sha1 + */ + + w0_t[0] = swap_workaround (w0_t[0]); + w0_t[1] = swap_workaround (w0_t[1]); + w0_t[2] = swap_workaround (w0_t[2]); + w0_t[3] = swap_workaround (w0_t[3]); + w1_t[0] = swap_workaround (w1_t[0]); + w1_t[1] = swap_workaround (w1_t[1]); + w1_t[2] = swap_workaround (w1_t[2]); + w1_t[3] = swap_workaround (w1_t[3]); + w2_t[0] = swap_workaround (w2_t[0]); + w2_t[1] = swap_workaround (w2_t[1]); + w2_t[2] = swap_workaround (w2_t[2]); + w2_t[3] = swap_workaround (w2_t[3]); + w3_t[0] = swap_workaround (w3_t[0]); + w3_t[1] = swap_workaround (w3_t[1]); + //w3_t[2] = swap_workaround (w3_t[2]); + //w3_t[3] = swap_workaround (w3_t[3]); + + u32x a = SHA1M_A; + u32x b = SHA1M_B; + u32x c = SHA1M_C; + u32x d = SHA1M_D; + u32x e = SHA1M_E; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w0_t[0]); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w0_t[1]); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w0_t[2]); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w0_t[3]); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w1_t[0]); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w1_t[1]); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w1_t[2]); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w1_t[3]); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w2_t[0]); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w2_t[1]); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w2_t[2]); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w2_t[3]); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w3_t[0]); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w3_t[1]); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w3_t[2]); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w3_t[3]); + w0_t[0] = rotl32 ((w3_t[1] ^ w2_t[0] ^ w0_t[2] ^ w0_t[0]), 1u); SHA1_STEP (SHA1_F0o, e, a, b, c, d, w0_t[0]); + w0_t[1] = rotl32 ((w3_t[2] ^ w2_t[1] ^ w0_t[3] ^ w0_t[1]), 1u); SHA1_STEP (SHA1_F0o, d, e, a, b, c, w0_t[1]); + w0_t[2] = rotl32 ((w3_t[3] ^ w2_t[2] ^ w1_t[0] ^ w0_t[2]), 1u); SHA1_STEP (SHA1_F0o, c, d, e, a, b, w0_t[2]); + w0_t[3] = rotl32 ((w0_t[0] ^ w2_t[3] ^ w1_t[1] ^ w0_t[3]), 1u); SHA1_STEP (SHA1_F0o, b, c, d, e, a, w0_t[3]); + + #undef K + #define K SHA1C01 + + w1_t[0] = rotl32 ((w0_t[1] ^ w3_t[0] ^ w1_t[2] ^ w1_t[0]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w1_t[0]); + w1_t[1] = rotl32 ((w0_t[2] ^ w3_t[1] ^ w1_t[3] ^ w1_t[1]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w1_t[1]); + w1_t[2] = rotl32 ((w0_t[3] ^ w3_t[2] ^ w2_t[0] ^ w1_t[2]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w1_t[2]); + w1_t[3] = rotl32 ((w1_t[0] ^ w3_t[3] ^ w2_t[1] ^ w1_t[3]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1_t[3]); + w2_t[0] = rotl32 ((w1_t[1] ^ w0_t[0] ^ w2_t[2] ^ w2_t[0]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w2_t[0]); + w2_t[1] = rotl32 ((w1_t[2] ^ w0_t[1] ^ w2_t[3] ^ w2_t[1]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w2_t[1]); + w2_t[2] = rotl32 ((w1_t[3] ^ w0_t[2] ^ w3_t[0] ^ w2_t[2]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w2_t[2]); + w2_t[3] = rotl32 ((w2_t[0] ^ w0_t[3] ^ w3_t[1] ^ w2_t[3]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w2_t[3]); + w3_t[0] = rotl32 ((w2_t[1] ^ w1_t[0] ^ w3_t[2] ^ w3_t[0]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w3_t[0]); + w3_t[1] = rotl32 ((w2_t[2] ^ w1_t[1] ^ w3_t[3] ^ w3_t[1]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w3_t[1]); + w3_t[2] = rotl32 ((w2_t[3] ^ w1_t[2] ^ w0_t[0] ^ w3_t[2]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w3_t[2]); + w3_t[3] = rotl32 ((w3_t[0] ^ w1_t[3] ^ w0_t[1] ^ w3_t[3]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w3_t[3]); + w0_t[0] = rotl32 ((w3_t[1] ^ w2_t[0] ^ w0_t[2] ^ w0_t[0]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w0_t[0]); + w0_t[1] = rotl32 ((w3_t[2] ^ w2_t[1] ^ w0_t[3] ^ w0_t[1]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w0_t[1]); + w0_t[2] = rotl32 ((w3_t[3] ^ w2_t[2] ^ w1_t[0] ^ w0_t[2]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w0_t[2]); + w0_t[3] = rotl32 ((w0_t[0] ^ w2_t[3] ^ w1_t[1] ^ w0_t[3]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w0_t[3]); + w1_t[0] = rotl32 ((w0_t[1] ^ w3_t[0] ^ w1_t[2] ^ w1_t[0]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w1_t[0]); + w1_t[1] = rotl32 ((w0_t[2] ^ w3_t[1] ^ w1_t[3] ^ w1_t[1]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w1_t[1]); + w1_t[2] = rotl32 ((w0_t[3] ^ w3_t[2] ^ w2_t[0] ^ w1_t[2]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1_t[2]); + w1_t[3] = rotl32 ((w1_t[0] ^ w3_t[3] ^ w2_t[1] ^ w1_t[3]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w1_t[3]); + + #undef K + #define K SHA1C02 + + w2_t[0] = rotl32 ((w1_t[1] ^ w0_t[0] ^ w2_t[2] ^ w2_t[0]), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w2_t[0]); + w2_t[1] = rotl32 ((w1_t[2] ^ w0_t[1] ^ w2_t[3] ^ w2_t[1]), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w2_t[1]); + w2_t[2] = rotl32 ((w1_t[3] ^ w0_t[2] ^ w3_t[0] ^ w2_t[2]), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w2_t[2]); + w2_t[3] = rotl32 ((w2_t[0] ^ w0_t[3] ^ w3_t[1] ^ w2_t[3]), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w2_t[3]); + w3_t[0] = rotl32 ((w2_t[1] ^ w1_t[0] ^ w3_t[2] ^ w3_t[0]), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w3_t[0]); + w3_t[1] = rotl32 ((w2_t[2] ^ w1_t[1] ^ w3_t[3] ^ w3_t[1]), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w3_t[1]); + w3_t[2] = rotl32 ((w2_t[3] ^ w1_t[2] ^ w0_t[0] ^ w3_t[2]), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w3_t[2]); + w3_t[3] = rotl32 ((w3_t[0] ^ w1_t[3] ^ w0_t[1] ^ w3_t[3]), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w3_t[3]); + w0_t[0] = rotl32 ((w3_t[1] ^ w2_t[0] ^ w0_t[2] ^ w0_t[0]), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w0_t[0]); + w0_t[1] = rotl32 ((w3_t[2] ^ w2_t[1] ^ w0_t[3] ^ w0_t[1]), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w0_t[1]); + w0_t[2] = rotl32 ((w3_t[3] ^ w2_t[2] ^ w1_t[0] ^ w0_t[2]), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w0_t[2]); + w0_t[3] = rotl32 ((w0_t[0] ^ w2_t[3] ^ w1_t[1] ^ w0_t[3]), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w0_t[3]); + w1_t[0] = rotl32 ((w0_t[1] ^ w3_t[0] ^ w1_t[2] ^ w1_t[0]), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w1_t[0]); + w1_t[1] = rotl32 ((w0_t[2] ^ w3_t[1] ^ w1_t[3] ^ w1_t[1]), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w1_t[1]); + w1_t[2] = rotl32 ((w0_t[3] ^ w3_t[2] ^ w2_t[0] ^ w1_t[2]), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w1_t[2]); + w1_t[3] = rotl32 ((w1_t[0] ^ w3_t[3] ^ w2_t[1] ^ w1_t[3]), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w1_t[3]); + w2_t[0] = rotl32 ((w1_t[1] ^ w0_t[0] ^ w2_t[2] ^ w2_t[0]), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w2_t[0]); + w2_t[1] = rotl32 ((w1_t[2] ^ w0_t[1] ^ w2_t[3] ^ w2_t[1]), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w2_t[1]); + w2_t[2] = rotl32 ((w1_t[3] ^ w0_t[2] ^ w3_t[0] ^ w2_t[2]), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w2_t[2]); + w2_t[3] = rotl32 ((w2_t[0] ^ w0_t[3] ^ w3_t[1] ^ w2_t[3]), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w2_t[3]); + + #undef K + #define K SHA1C03 + + w3_t[0] = rotl32 ((w2_t[1] ^ w1_t[0] ^ w3_t[2] ^ w3_t[0]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w3_t[0]); + w3_t[1] = rotl32 ((w2_t[2] ^ w1_t[1] ^ w3_t[3] ^ w3_t[1]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w3_t[1]); + w3_t[2] = rotl32 ((w2_t[3] ^ w1_t[2] ^ w0_t[0] ^ w3_t[2]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w3_t[2]); + w3_t[3] = rotl32 ((w3_t[0] ^ w1_t[3] ^ w0_t[1] ^ w3_t[3]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w3_t[3]); + w0_t[0] = rotl32 ((w3_t[1] ^ w2_t[0] ^ w0_t[2] ^ w0_t[0]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w0_t[0]); + w0_t[1] = rotl32 ((w3_t[2] ^ w2_t[1] ^ w0_t[3] ^ w0_t[1]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w0_t[1]); + w0_t[2] = rotl32 ((w3_t[3] ^ w2_t[2] ^ w1_t[0] ^ w0_t[2]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w0_t[2]); + w0_t[3] = rotl32 ((w0_t[0] ^ w2_t[3] ^ w1_t[1] ^ w0_t[3]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w0_t[3]); + w1_t[0] = rotl32 ((w0_t[1] ^ w3_t[0] ^ w1_t[2] ^ w1_t[0]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1_t[0]); + w1_t[1] = rotl32 ((w0_t[2] ^ w3_t[1] ^ w1_t[3] ^ w1_t[1]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w1_t[1]); + w1_t[2] = rotl32 ((w0_t[3] ^ w3_t[2] ^ w2_t[0] ^ w1_t[2]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w1_t[2]); + w1_t[3] = rotl32 ((w1_t[0] ^ w3_t[3] ^ w2_t[1] ^ w1_t[3]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w1_t[3]); + w2_t[0] = rotl32 ((w1_t[1] ^ w0_t[0] ^ w2_t[2] ^ w2_t[0]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w2_t[0]); + w2_t[1] = rotl32 ((w1_t[2] ^ w0_t[1] ^ w2_t[3] ^ w2_t[1]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w2_t[1]); + w2_t[2] = rotl32 ((w1_t[3] ^ w0_t[2] ^ w3_t[0] ^ w2_t[2]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w2_t[2]); + w2_t[3] = rotl32 ((w2_t[0] ^ w0_t[3] ^ w3_t[1] ^ w2_t[3]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w2_t[3]); + w3_t[0] = rotl32 ((w2_t[1] ^ w1_t[0] ^ w3_t[2] ^ w3_t[0]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w3_t[0]); + w3_t[1] = rotl32 ((w2_t[2] ^ w1_t[1] ^ w3_t[3] ^ w3_t[1]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w3_t[1]); + w3_t[2] = rotl32 ((w2_t[3] ^ w1_t[2] ^ w0_t[0] ^ w3_t[2]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w3_t[2]); + w3_t[3] = rotl32 ((w3_t[0] ^ w1_t[3] ^ w0_t[1] ^ w3_t[3]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w3_t[3]); + + + const u32x r0 = d; + const u32x r1 = e; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_M + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m00120_m08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m00120_m16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m00120_s04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + u32x pw_buf1[4]; + + pw_buf1[0] = pws[gid].i[ 4]; + pw_buf1[1] = pws[gid].i[ 5]; + pw_buf1[2] = pws[gid].i[ 6]; + pw_buf1[3] = pws[gid].i[ 7]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[7]; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * reverse + */ + + const u32 e_rev = rotl32 (search[1], 2u); + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + u32x w1[4]; + u32x w2[4]; + u32x w3[4]; + + w0[0] = pw_buf0[0]; + w0[1] = pw_buf0[1]; + w0[2] = pw_buf0[2]; + w0[3] = pw_buf0[3]; + w1[0] = pw_buf1[0]; + w1[1] = pw_buf1[1]; + w1[2] = pw_buf1[2]; + w1[3] = pw_buf1[3]; + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 out_len = apply_rules (c_rules[il_pos].cmds, w0, w1, pw_len); + + /** + * prepend salt + */ + + const u32 out_salt_len = out_len + salt_len; + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + w0_t[0] = w0[0]; + w0_t[1] = w0[1]; + w0_t[2] = w0[2]; + w0_t[3] = w0[3]; + w1_t[0] = w1[0]; + w1_t[1] = w1[1]; + w1_t[2] = w1[2]; + w1_t[3] = w1[3]; + w2_t[0] = w2[0]; + w2_t[1] = w2[1]; + w2_t[2] = w2[2]; + w2_t[3] = w2[3]; + w3_t[0] = w3[0]; + w3_t[1] = w3[1]; + w3_t[2] = w3[2]; + w3_t[3] = w3[3]; + + switch_buffer_by_offset (w0_t, w1_t, w2_t, w3_t, salt_len); + + w0_t[0] |= salt_buf0[0]; + w0_t[1] |= salt_buf0[1]; + w0_t[2] |= salt_buf0[2]; + w0_t[3] |= salt_buf0[3]; + w1_t[0] |= salt_buf1[0]; + w1_t[1] |= salt_buf1[1]; + w1_t[2] |= salt_buf1[2]; + w1_t[3] |= salt_buf1[3]; + + append_0x80_4 (w0_t, w1_t, w2_t, w3_t, out_salt_len); + + w3_t[3] = out_salt_len * 8; + + /** + * sha1 + */ + + w0_t[0] = swap_workaround (w0_t[0]); + w0_t[1] = swap_workaround (w0_t[1]); + w0_t[2] = swap_workaround (w0_t[2]); + w0_t[3] = swap_workaround (w0_t[3]); + w1_t[0] = swap_workaround (w1_t[0]); + w1_t[1] = swap_workaround (w1_t[1]); + w1_t[2] = swap_workaround (w1_t[2]); + w1_t[3] = swap_workaround (w1_t[3]); + w2_t[0] = swap_workaround (w2_t[0]); + w2_t[1] = swap_workaround (w2_t[1]); + w2_t[2] = swap_workaround (w2_t[2]); + w2_t[3] = swap_workaround (w2_t[3]); + w3_t[0] = swap_workaround (w3_t[0]); + w3_t[1] = swap_workaround (w3_t[1]); + //w3_t[2] = swap_workaround (w3_t[2]); + //w3_t[3] = swap_workaround (w3_t[3]); + + u32x a = SHA1M_A; + u32x b = SHA1M_B; + u32x c = SHA1M_C; + u32x d = SHA1M_D; + u32x e = SHA1M_E; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w0_t[0]); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w0_t[1]); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w0_t[2]); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w0_t[3]); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w1_t[0]); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w1_t[1]); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w1_t[2]); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w1_t[3]); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w2_t[0]); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w2_t[1]); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w2_t[2]); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w2_t[3]); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w3_t[0]); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w3_t[1]); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w3_t[2]); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w3_t[3]); + w0_t[0] = rotl32 ((w3_t[1] ^ w2_t[0] ^ w0_t[2] ^ w0_t[0]), 1u); SHA1_STEP (SHA1_F0o, e, a, b, c, d, w0_t[0]); + w0_t[1] = rotl32 ((w3_t[2] ^ w2_t[1] ^ w0_t[3] ^ w0_t[1]), 1u); SHA1_STEP (SHA1_F0o, d, e, a, b, c, w0_t[1]); + w0_t[2] = rotl32 ((w3_t[3] ^ w2_t[2] ^ w1_t[0] ^ w0_t[2]), 1u); SHA1_STEP (SHA1_F0o, c, d, e, a, b, w0_t[2]); + w0_t[3] = rotl32 ((w0_t[0] ^ w2_t[3] ^ w1_t[1] ^ w0_t[3]), 1u); SHA1_STEP (SHA1_F0o, b, c, d, e, a, w0_t[3]); + + #undef K + #define K SHA1C01 + + w1_t[0] = rotl32 ((w0_t[1] ^ w3_t[0] ^ w1_t[2] ^ w1_t[0]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w1_t[0]); + w1_t[1] = rotl32 ((w0_t[2] ^ w3_t[1] ^ w1_t[3] ^ w1_t[1]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w1_t[1]); + w1_t[2] = rotl32 ((w0_t[3] ^ w3_t[2] ^ w2_t[0] ^ w1_t[2]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w1_t[2]); + w1_t[3] = rotl32 ((w1_t[0] ^ w3_t[3] ^ w2_t[1] ^ w1_t[3]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1_t[3]); + w2_t[0] = rotl32 ((w1_t[1] ^ w0_t[0] ^ w2_t[2] ^ w2_t[0]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w2_t[0]); + w2_t[1] = rotl32 ((w1_t[2] ^ w0_t[1] ^ w2_t[3] ^ w2_t[1]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w2_t[1]); + w2_t[2] = rotl32 ((w1_t[3] ^ w0_t[2] ^ w3_t[0] ^ w2_t[2]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w2_t[2]); + w2_t[3] = rotl32 ((w2_t[0] ^ w0_t[3] ^ w3_t[1] ^ w2_t[3]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w2_t[3]); + w3_t[0] = rotl32 ((w2_t[1] ^ w1_t[0] ^ w3_t[2] ^ w3_t[0]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w3_t[0]); + w3_t[1] = rotl32 ((w2_t[2] ^ w1_t[1] ^ w3_t[3] ^ w3_t[1]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w3_t[1]); + w3_t[2] = rotl32 ((w2_t[3] ^ w1_t[2] ^ w0_t[0] ^ w3_t[2]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w3_t[2]); + w3_t[3] = rotl32 ((w3_t[0] ^ w1_t[3] ^ w0_t[1] ^ w3_t[3]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w3_t[3]); + w0_t[0] = rotl32 ((w3_t[1] ^ w2_t[0] ^ w0_t[2] ^ w0_t[0]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w0_t[0]); + w0_t[1] = rotl32 ((w3_t[2] ^ w2_t[1] ^ w0_t[3] ^ w0_t[1]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w0_t[1]); + w0_t[2] = rotl32 ((w3_t[3] ^ w2_t[2] ^ w1_t[0] ^ w0_t[2]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w0_t[2]); + w0_t[3] = rotl32 ((w0_t[0] ^ w2_t[3] ^ w1_t[1] ^ w0_t[3]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w0_t[3]); + w1_t[0] = rotl32 ((w0_t[1] ^ w3_t[0] ^ w1_t[2] ^ w1_t[0]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w1_t[0]); + w1_t[1] = rotl32 ((w0_t[2] ^ w3_t[1] ^ w1_t[3] ^ w1_t[1]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w1_t[1]); + w1_t[2] = rotl32 ((w0_t[3] ^ w3_t[2] ^ w2_t[0] ^ w1_t[2]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1_t[2]); + w1_t[3] = rotl32 ((w1_t[0] ^ w3_t[3] ^ w2_t[1] ^ w1_t[3]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w1_t[3]); + + #undef K + #define K SHA1C02 + + w2_t[0] = rotl32 ((w1_t[1] ^ w0_t[0] ^ w2_t[2] ^ w2_t[0]), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w2_t[0]); + w2_t[1] = rotl32 ((w1_t[2] ^ w0_t[1] ^ w2_t[3] ^ w2_t[1]), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w2_t[1]); + w2_t[2] = rotl32 ((w1_t[3] ^ w0_t[2] ^ w3_t[0] ^ w2_t[2]), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w2_t[2]); + w2_t[3] = rotl32 ((w2_t[0] ^ w0_t[3] ^ w3_t[1] ^ w2_t[3]), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w2_t[3]); + w3_t[0] = rotl32 ((w2_t[1] ^ w1_t[0] ^ w3_t[2] ^ w3_t[0]), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w3_t[0]); + w3_t[1] = rotl32 ((w2_t[2] ^ w1_t[1] ^ w3_t[3] ^ w3_t[1]), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w3_t[1]); + w3_t[2] = rotl32 ((w2_t[3] ^ w1_t[2] ^ w0_t[0] ^ w3_t[2]), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w3_t[2]); + w3_t[3] = rotl32 ((w3_t[0] ^ w1_t[3] ^ w0_t[1] ^ w3_t[3]), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w3_t[3]); + w0_t[0] = rotl32 ((w3_t[1] ^ w2_t[0] ^ w0_t[2] ^ w0_t[0]), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w0_t[0]); + w0_t[1] = rotl32 ((w3_t[2] ^ w2_t[1] ^ w0_t[3] ^ w0_t[1]), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w0_t[1]); + w0_t[2] = rotl32 ((w3_t[3] ^ w2_t[2] ^ w1_t[0] ^ w0_t[2]), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w0_t[2]); + w0_t[3] = rotl32 ((w0_t[0] ^ w2_t[3] ^ w1_t[1] ^ w0_t[3]), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w0_t[3]); + w1_t[0] = rotl32 ((w0_t[1] ^ w3_t[0] ^ w1_t[2] ^ w1_t[0]), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w1_t[0]); + w1_t[1] = rotl32 ((w0_t[2] ^ w3_t[1] ^ w1_t[3] ^ w1_t[1]), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w1_t[1]); + w1_t[2] = rotl32 ((w0_t[3] ^ w3_t[2] ^ w2_t[0] ^ w1_t[2]), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w1_t[2]); + w1_t[3] = rotl32 ((w1_t[0] ^ w3_t[3] ^ w2_t[1] ^ w1_t[3]), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w1_t[3]); + w2_t[0] = rotl32 ((w1_t[1] ^ w0_t[0] ^ w2_t[2] ^ w2_t[0]), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w2_t[0]); + w2_t[1] = rotl32 ((w1_t[2] ^ w0_t[1] ^ w2_t[3] ^ w2_t[1]), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w2_t[1]); + w2_t[2] = rotl32 ((w1_t[3] ^ w0_t[2] ^ w3_t[0] ^ w2_t[2]), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w2_t[2]); + w2_t[3] = rotl32 ((w2_t[0] ^ w0_t[3] ^ w3_t[1] ^ w2_t[3]), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w2_t[3]); + + #undef K + #define K SHA1C03 + + w3_t[0] = rotl32 ((w2_t[1] ^ w1_t[0] ^ w3_t[2] ^ w3_t[0]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w3_t[0]); + w3_t[1] = rotl32 ((w2_t[2] ^ w1_t[1] ^ w3_t[3] ^ w3_t[1]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w3_t[1]); + w3_t[2] = rotl32 ((w2_t[3] ^ w1_t[2] ^ w0_t[0] ^ w3_t[2]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w3_t[2]); + w3_t[3] = rotl32 ((w3_t[0] ^ w1_t[3] ^ w0_t[1] ^ w3_t[3]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w3_t[3]); + w0_t[0] = rotl32 ((w3_t[1] ^ w2_t[0] ^ w0_t[2] ^ w0_t[0]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w0_t[0]); + w0_t[1] = rotl32 ((w3_t[2] ^ w2_t[1] ^ w0_t[3] ^ w0_t[1]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w0_t[1]); + w0_t[2] = rotl32 ((w3_t[3] ^ w2_t[2] ^ w1_t[0] ^ w0_t[2]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w0_t[2]); + w0_t[3] = rotl32 ((w0_t[0] ^ w2_t[3] ^ w1_t[1] ^ w0_t[3]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w0_t[3]); + w1_t[0] = rotl32 ((w0_t[1] ^ w3_t[0] ^ w1_t[2] ^ w1_t[0]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1_t[0]); + w1_t[1] = rotl32 ((w0_t[2] ^ w3_t[1] ^ w1_t[3] ^ w1_t[1]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w1_t[1]); + w1_t[2] = rotl32 ((w0_t[3] ^ w3_t[2] ^ w2_t[0] ^ w1_t[2]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w1_t[2]); + w1_t[3] = rotl32 ((w1_t[0] ^ w3_t[3] ^ w2_t[1] ^ w1_t[3]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w1_t[3]); + w2_t[0] = rotl32 ((w1_t[1] ^ w0_t[0] ^ w2_t[2] ^ w2_t[0]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w2_t[0]); + w2_t[1] = rotl32 ((w1_t[2] ^ w0_t[1] ^ w2_t[3] ^ w2_t[1]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w2_t[1]); + w2_t[2] = rotl32 ((w1_t[3] ^ w0_t[2] ^ w3_t[0] ^ w2_t[2]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w2_t[2]); + w2_t[3] = rotl32 ((w2_t[0] ^ w0_t[3] ^ w3_t[1] ^ w2_t[3]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w2_t[3]); + w3_t[0] = rotl32 ((w2_t[1] ^ w1_t[0] ^ w3_t[2] ^ w3_t[0]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w3_t[0]); + + if (e != e_rev) continue; + + w3_t[1] = rotl32 ((w2_t[2] ^ w1_t[1] ^ w3_t[3] ^ w3_t[1]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w3_t[1]); + w3_t[2] = rotl32 ((w2_t[3] ^ w1_t[2] ^ w0_t[0] ^ w3_t[2]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w3_t[2]); + w3_t[3] = rotl32 ((w3_t[0] ^ w1_t[3] ^ w0_t[1] ^ w3_t[3]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w3_t[3]); + + + const u32x r0 = d; + const u32x r1 = e; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_S + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m00120_s08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m00120_s16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/nv/m00120_a1.cu b/nv/m00120_a1.cu new file mode 100644 index 0000000000..10e99edd37 --- /dev/null +++ b/nv/m00120_a1.cu @@ -0,0 +1,692 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _SHA1_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW2 +#define VECT_SIZE4 +#endif + +#define DGST_R0 3 +#define DGST_R1 4 +#define DGST_R2 2 +#define DGST_R3 1 + +#include "include/kernel_functions.c" +#include "types_nv.c" +#include "common_nv.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +__device__ __constant__ comb_t c_combs[1024]; + +extern "C" __global__ void __launch_bounds__ (256, 1) m00120_m04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, c_combs[0].pw_len); + } + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[7]; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = c_combs[il_pos].pw_len; + + const u32 pw_len = pw_l_len + pw_r_len; + + u32 wordr0[4]; + u32 wordr1[4]; + u32 wordr2[4]; + u32 wordr3[4]; + + wordr0[0] = c_combs[il_pos].i[0]; + wordr0[1] = c_combs[il_pos].i[1]; + wordr0[2] = c_combs[il_pos].i[2]; + wordr0[3] = c_combs[il_pos].i[3]; + wordr1[0] = c_combs[il_pos].i[4]; + wordr1[1] = c_combs[il_pos].i[5]; + wordr1[2] = c_combs[il_pos].i[6]; + wordr1[3] = c_combs[il_pos].i[7]; + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + u32x w0[4]; + u32x w1[4]; + u32x w2[4]; + u32x w3[4]; + + w0[0] = wordl0[0] | wordr0[0]; + w0[1] = wordl0[1] | wordr0[1]; + w0[2] = wordl0[2] | wordr0[2]; + w0[3] = wordl0[3] | wordr0[3]; + w1[0] = wordl1[0] | wordr1[0]; + w1[1] = wordl1[1] | wordr1[1]; + w1[2] = wordl1[2] | wordr1[2]; + w1[3] = wordl1[3] | wordr1[3]; + w2[0] = wordl2[0] | wordr2[0]; + w2[1] = wordl2[1] | wordr2[1]; + w2[2] = wordl2[2] | wordr2[2]; + w2[3] = wordl2[3] | wordr2[3]; + w3[0] = wordl3[0] | wordr3[0]; + w3[1] = wordl3[1] | wordr3[1]; + w3[2] = wordl3[2] | wordr3[2]; + w3[3] = wordl3[3] | wordr3[3]; + + /** + * prepend salt + */ + + const u32 pw_salt_len = pw_len + salt_len; + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + w0_t[0] = w0[0]; + w0_t[1] = w0[1]; + w0_t[2] = w0[2]; + w0_t[3] = w0[3]; + w1_t[0] = w1[0]; + w1_t[1] = w1[1]; + w1_t[2] = w1[2]; + w1_t[3] = w1[3]; + w2_t[0] = w2[0]; + w2_t[1] = w2[1]; + w2_t[2] = w2[2]; + w2_t[3] = w2[3]; + w3_t[0] = w3[0]; + w3_t[1] = w3[1]; + w3_t[2] = w3[2]; + w3_t[3] = w3[3]; + + switch_buffer_by_offset (w0_t, w1_t, w2_t, w3_t, salt_len); + + w0_t[0] |= salt_buf0[0]; + w0_t[1] |= salt_buf0[1]; + w0_t[2] |= salt_buf0[2]; + w0_t[3] |= salt_buf0[3]; + w1_t[0] |= salt_buf1[0]; + w1_t[1] |= salt_buf1[1]; + w1_t[2] |= salt_buf1[2]; + w1_t[3] |= salt_buf1[3]; + + append_0x80_4 (w0_t, w1_t, w2_t, w3_t, pw_salt_len); + + w3_t[3] = pw_salt_len * 8; + + /** + * sha1 + */ + + w0_t[0] = swap_workaround (w0_t[0]); + w0_t[1] = swap_workaround (w0_t[1]); + w0_t[2] = swap_workaround (w0_t[2]); + w0_t[3] = swap_workaround (w0_t[3]); + w1_t[0] = swap_workaround (w1_t[0]); + w1_t[1] = swap_workaround (w1_t[1]); + w1_t[2] = swap_workaround (w1_t[2]); + w1_t[3] = swap_workaround (w1_t[3]); + w2_t[0] = swap_workaround (w2_t[0]); + w2_t[1] = swap_workaround (w2_t[1]); + w2_t[2] = swap_workaround (w2_t[2]); + w2_t[3] = swap_workaround (w2_t[3]); + w3_t[0] = swap_workaround (w3_t[0]); + w3_t[1] = swap_workaround (w3_t[1]); + //w3_t[2] = swap_workaround (w3_t[2]); + //w3_t[3] = swap_workaround (w3_t[3]); + + u32x a = SHA1M_A; + u32x b = SHA1M_B; + u32x c = SHA1M_C; + u32x d = SHA1M_D; + u32x e = SHA1M_E; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w0_t[0]); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w0_t[1]); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w0_t[2]); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w0_t[3]); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w1_t[0]); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w1_t[1]); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w1_t[2]); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w1_t[3]); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w2_t[0]); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w2_t[1]); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w2_t[2]); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w2_t[3]); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w3_t[0]); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w3_t[1]); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w3_t[2]); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w3_t[3]); + w0_t[0] = rotl32 ((w3_t[1] ^ w2_t[0] ^ w0_t[2] ^ w0_t[0]), 1u); SHA1_STEP (SHA1_F0o, e, a, b, c, d, w0_t[0]); + w0_t[1] = rotl32 ((w3_t[2] ^ w2_t[1] ^ w0_t[3] ^ w0_t[1]), 1u); SHA1_STEP (SHA1_F0o, d, e, a, b, c, w0_t[1]); + w0_t[2] = rotl32 ((w3_t[3] ^ w2_t[2] ^ w1_t[0] ^ w0_t[2]), 1u); SHA1_STEP (SHA1_F0o, c, d, e, a, b, w0_t[2]); + w0_t[3] = rotl32 ((w0_t[0] ^ w2_t[3] ^ w1_t[1] ^ w0_t[3]), 1u); SHA1_STEP (SHA1_F0o, b, c, d, e, a, w0_t[3]); + + #undef K + #define K SHA1C01 + + w1_t[0] = rotl32 ((w0_t[1] ^ w3_t[0] ^ w1_t[2] ^ w1_t[0]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w1_t[0]); + w1_t[1] = rotl32 ((w0_t[2] ^ w3_t[1] ^ w1_t[3] ^ w1_t[1]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w1_t[1]); + w1_t[2] = rotl32 ((w0_t[3] ^ w3_t[2] ^ w2_t[0] ^ w1_t[2]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w1_t[2]); + w1_t[3] = rotl32 ((w1_t[0] ^ w3_t[3] ^ w2_t[1] ^ w1_t[3]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1_t[3]); + w2_t[0] = rotl32 ((w1_t[1] ^ w0_t[0] ^ w2_t[2] ^ w2_t[0]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w2_t[0]); + w2_t[1] = rotl32 ((w1_t[2] ^ w0_t[1] ^ w2_t[3] ^ w2_t[1]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w2_t[1]); + w2_t[2] = rotl32 ((w1_t[3] ^ w0_t[2] ^ w3_t[0] ^ w2_t[2]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w2_t[2]); + w2_t[3] = rotl32 ((w2_t[0] ^ w0_t[3] ^ w3_t[1] ^ w2_t[3]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w2_t[3]); + w3_t[0] = rotl32 ((w2_t[1] ^ w1_t[0] ^ w3_t[2] ^ w3_t[0]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w3_t[0]); + w3_t[1] = rotl32 ((w2_t[2] ^ w1_t[1] ^ w3_t[3] ^ w3_t[1]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w3_t[1]); + w3_t[2] = rotl32 ((w2_t[3] ^ w1_t[2] ^ w0_t[0] ^ w3_t[2]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w3_t[2]); + w3_t[3] = rotl32 ((w3_t[0] ^ w1_t[3] ^ w0_t[1] ^ w3_t[3]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w3_t[3]); + w0_t[0] = rotl32 ((w3_t[1] ^ w2_t[0] ^ w0_t[2] ^ w0_t[0]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w0_t[0]); + w0_t[1] = rotl32 ((w3_t[2] ^ w2_t[1] ^ w0_t[3] ^ w0_t[1]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w0_t[1]); + w0_t[2] = rotl32 ((w3_t[3] ^ w2_t[2] ^ w1_t[0] ^ w0_t[2]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w0_t[2]); + w0_t[3] = rotl32 ((w0_t[0] ^ w2_t[3] ^ w1_t[1] ^ w0_t[3]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w0_t[3]); + w1_t[0] = rotl32 ((w0_t[1] ^ w3_t[0] ^ w1_t[2] ^ w1_t[0]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w1_t[0]); + w1_t[1] = rotl32 ((w0_t[2] ^ w3_t[1] ^ w1_t[3] ^ w1_t[1]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w1_t[1]); + w1_t[2] = rotl32 ((w0_t[3] ^ w3_t[2] ^ w2_t[0] ^ w1_t[2]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1_t[2]); + w1_t[3] = rotl32 ((w1_t[0] ^ w3_t[3] ^ w2_t[1] ^ w1_t[3]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w1_t[3]); + + #undef K + #define K SHA1C02 + + w2_t[0] = rotl32 ((w1_t[1] ^ w0_t[0] ^ w2_t[2] ^ w2_t[0]), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w2_t[0]); + w2_t[1] = rotl32 ((w1_t[2] ^ w0_t[1] ^ w2_t[3] ^ w2_t[1]), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w2_t[1]); + w2_t[2] = rotl32 ((w1_t[3] ^ w0_t[2] ^ w3_t[0] ^ w2_t[2]), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w2_t[2]); + w2_t[3] = rotl32 ((w2_t[0] ^ w0_t[3] ^ w3_t[1] ^ w2_t[3]), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w2_t[3]); + w3_t[0] = rotl32 ((w2_t[1] ^ w1_t[0] ^ w3_t[2] ^ w3_t[0]), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w3_t[0]); + w3_t[1] = rotl32 ((w2_t[2] ^ w1_t[1] ^ w3_t[3] ^ w3_t[1]), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w3_t[1]); + w3_t[2] = rotl32 ((w2_t[3] ^ w1_t[2] ^ w0_t[0] ^ w3_t[2]), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w3_t[2]); + w3_t[3] = rotl32 ((w3_t[0] ^ w1_t[3] ^ w0_t[1] ^ w3_t[3]), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w3_t[3]); + w0_t[0] = rotl32 ((w3_t[1] ^ w2_t[0] ^ w0_t[2] ^ w0_t[0]), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w0_t[0]); + w0_t[1] = rotl32 ((w3_t[2] ^ w2_t[1] ^ w0_t[3] ^ w0_t[1]), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w0_t[1]); + w0_t[2] = rotl32 ((w3_t[3] ^ w2_t[2] ^ w1_t[0] ^ w0_t[2]), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w0_t[2]); + w0_t[3] = rotl32 ((w0_t[0] ^ w2_t[3] ^ w1_t[1] ^ w0_t[3]), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w0_t[3]); + w1_t[0] = rotl32 ((w0_t[1] ^ w3_t[0] ^ w1_t[2] ^ w1_t[0]), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w1_t[0]); + w1_t[1] = rotl32 ((w0_t[2] ^ w3_t[1] ^ w1_t[3] ^ w1_t[1]), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w1_t[1]); + w1_t[2] = rotl32 ((w0_t[3] ^ w3_t[2] ^ w2_t[0] ^ w1_t[2]), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w1_t[2]); + w1_t[3] = rotl32 ((w1_t[0] ^ w3_t[3] ^ w2_t[1] ^ w1_t[3]), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w1_t[3]); + w2_t[0] = rotl32 ((w1_t[1] ^ w0_t[0] ^ w2_t[2] ^ w2_t[0]), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w2_t[0]); + w2_t[1] = rotl32 ((w1_t[2] ^ w0_t[1] ^ w2_t[3] ^ w2_t[1]), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w2_t[1]); + w2_t[2] = rotl32 ((w1_t[3] ^ w0_t[2] ^ w3_t[0] ^ w2_t[2]), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w2_t[2]); + w2_t[3] = rotl32 ((w2_t[0] ^ w0_t[3] ^ w3_t[1] ^ w2_t[3]), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w2_t[3]); + + #undef K + #define K SHA1C03 + + w3_t[0] = rotl32 ((w2_t[1] ^ w1_t[0] ^ w3_t[2] ^ w3_t[0]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w3_t[0]); + w3_t[1] = rotl32 ((w2_t[2] ^ w1_t[1] ^ w3_t[3] ^ w3_t[1]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w3_t[1]); + w3_t[2] = rotl32 ((w2_t[3] ^ w1_t[2] ^ w0_t[0] ^ w3_t[2]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w3_t[2]); + w3_t[3] = rotl32 ((w3_t[0] ^ w1_t[3] ^ w0_t[1] ^ w3_t[3]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w3_t[3]); + w0_t[0] = rotl32 ((w3_t[1] ^ w2_t[0] ^ w0_t[2] ^ w0_t[0]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w0_t[0]); + w0_t[1] = rotl32 ((w3_t[2] ^ w2_t[1] ^ w0_t[3] ^ w0_t[1]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w0_t[1]); + w0_t[2] = rotl32 ((w3_t[3] ^ w2_t[2] ^ w1_t[0] ^ w0_t[2]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w0_t[2]); + w0_t[3] = rotl32 ((w0_t[0] ^ w2_t[3] ^ w1_t[1] ^ w0_t[3]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w0_t[3]); + w1_t[0] = rotl32 ((w0_t[1] ^ w3_t[0] ^ w1_t[2] ^ w1_t[0]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1_t[0]); + w1_t[1] = rotl32 ((w0_t[2] ^ w3_t[1] ^ w1_t[3] ^ w1_t[1]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w1_t[1]); + w1_t[2] = rotl32 ((w0_t[3] ^ w3_t[2] ^ w2_t[0] ^ w1_t[2]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w1_t[2]); + w1_t[3] = rotl32 ((w1_t[0] ^ w3_t[3] ^ w2_t[1] ^ w1_t[3]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w1_t[3]); + w2_t[0] = rotl32 ((w1_t[1] ^ w0_t[0] ^ w2_t[2] ^ w2_t[0]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w2_t[0]); + w2_t[1] = rotl32 ((w1_t[2] ^ w0_t[1] ^ w2_t[3] ^ w2_t[1]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w2_t[1]); + w2_t[2] = rotl32 ((w1_t[3] ^ w0_t[2] ^ w3_t[0] ^ w2_t[2]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w2_t[2]); + w2_t[3] = rotl32 ((w2_t[0] ^ w0_t[3] ^ w3_t[1] ^ w2_t[3]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w2_t[3]); + w3_t[0] = rotl32 ((w2_t[1] ^ w1_t[0] ^ w3_t[2] ^ w3_t[0]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w3_t[0]); + w3_t[1] = rotl32 ((w2_t[2] ^ w1_t[1] ^ w3_t[3] ^ w3_t[1]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w3_t[1]); + w3_t[2] = rotl32 ((w2_t[3] ^ w1_t[2] ^ w0_t[0] ^ w3_t[2]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w3_t[2]); + w3_t[3] = rotl32 ((w3_t[0] ^ w1_t[3] ^ w0_t[1] ^ w3_t[3]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w3_t[3]); + + + const u32x r0 = d; + const u32x r1 = e; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_M + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m00120_m08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m00120_m16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m00120_s04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, c_combs[0].pw_len); + } + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[7]; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * reverse + */ + + const u32 e_rev = rotl32 (search[1], 2u); + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = c_combs[il_pos].pw_len; + + const u32 pw_len = pw_l_len + pw_r_len; + + u32 wordr0[4]; + u32 wordr1[4]; + u32 wordr2[4]; + u32 wordr3[4]; + + wordr0[0] = c_combs[il_pos].i[0]; + wordr0[1] = c_combs[il_pos].i[1]; + wordr0[2] = c_combs[il_pos].i[2]; + wordr0[3] = c_combs[il_pos].i[3]; + wordr1[0] = c_combs[il_pos].i[4]; + wordr1[1] = c_combs[il_pos].i[5]; + wordr1[2] = c_combs[il_pos].i[6]; + wordr1[3] = c_combs[il_pos].i[7]; + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + u32x w0[4]; + u32x w1[4]; + u32x w2[4]; + u32x w3[4]; + + w0[0] = wordl0[0] | wordr0[0]; + w0[1] = wordl0[1] | wordr0[1]; + w0[2] = wordl0[2] | wordr0[2]; + w0[3] = wordl0[3] | wordr0[3]; + w1[0] = wordl1[0] | wordr1[0]; + w1[1] = wordl1[1] | wordr1[1]; + w1[2] = wordl1[2] | wordr1[2]; + w1[3] = wordl1[3] | wordr1[3]; + w2[0] = wordl2[0] | wordr2[0]; + w2[1] = wordl2[1] | wordr2[1]; + w2[2] = wordl2[2] | wordr2[2]; + w2[3] = wordl2[3] | wordr2[3]; + w3[0] = wordl3[0] | wordr3[0]; + w3[1] = wordl3[1] | wordr3[1]; + w3[2] = wordl3[2] | wordr3[2]; + w3[3] = wordl3[3] | wordr3[3]; + + /** + * prepend salt + */ + + const u32 pw_salt_len = pw_len + salt_len; + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + w0_t[0] = w0[0]; + w0_t[1] = w0[1]; + w0_t[2] = w0[2]; + w0_t[3] = w0[3]; + w1_t[0] = w1[0]; + w1_t[1] = w1[1]; + w1_t[2] = w1[2]; + w1_t[3] = w1[3]; + w2_t[0] = w2[0]; + w2_t[1] = w2[1]; + w2_t[2] = w2[2]; + w2_t[3] = w2[3]; + w3_t[0] = w3[0]; + w3_t[1] = w3[1]; + w3_t[2] = w3[2]; + w3_t[3] = w3[3]; + + switch_buffer_by_offset (w0_t, w1_t, w2_t, w3_t, salt_len); + + w0_t[0] |= salt_buf0[0]; + w0_t[1] |= salt_buf0[1]; + w0_t[2] |= salt_buf0[2]; + w0_t[3] |= salt_buf0[3]; + w1_t[0] |= salt_buf1[0]; + w1_t[1] |= salt_buf1[1]; + w1_t[2] |= salt_buf1[2]; + w1_t[3] |= salt_buf1[3]; + + append_0x80_4 (w0_t, w1_t, w2_t, w3_t, pw_salt_len); + + w3_t[3] = pw_salt_len * 8; + + /** + * sha1 + */ + + w0_t[0] = swap_workaround (w0_t[0]); + w0_t[1] = swap_workaround (w0_t[1]); + w0_t[2] = swap_workaround (w0_t[2]); + w0_t[3] = swap_workaround (w0_t[3]); + w1_t[0] = swap_workaround (w1_t[0]); + w1_t[1] = swap_workaround (w1_t[1]); + w1_t[2] = swap_workaround (w1_t[2]); + w1_t[3] = swap_workaround (w1_t[3]); + w2_t[0] = swap_workaround (w2_t[0]); + w2_t[1] = swap_workaround (w2_t[1]); + w2_t[2] = swap_workaround (w2_t[2]); + w2_t[3] = swap_workaround (w2_t[3]); + w3_t[0] = swap_workaround (w3_t[0]); + w3_t[1] = swap_workaround (w3_t[1]); + //w3_t[2] = swap_workaround (w3_t[2]); + //w3_t[3] = swap_workaround (w3_t[3]); + + u32x a = SHA1M_A; + u32x b = SHA1M_B; + u32x c = SHA1M_C; + u32x d = SHA1M_D; + u32x e = SHA1M_E; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w0_t[0]); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w0_t[1]); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w0_t[2]); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w0_t[3]); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w1_t[0]); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w1_t[1]); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w1_t[2]); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w1_t[3]); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w2_t[0]); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w2_t[1]); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w2_t[2]); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w2_t[3]); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w3_t[0]); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w3_t[1]); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w3_t[2]); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w3_t[3]); + w0_t[0] = rotl32 ((w3_t[1] ^ w2_t[0] ^ w0_t[2] ^ w0_t[0]), 1u); SHA1_STEP (SHA1_F0o, e, a, b, c, d, w0_t[0]); + w0_t[1] = rotl32 ((w3_t[2] ^ w2_t[1] ^ w0_t[3] ^ w0_t[1]), 1u); SHA1_STEP (SHA1_F0o, d, e, a, b, c, w0_t[1]); + w0_t[2] = rotl32 ((w3_t[3] ^ w2_t[2] ^ w1_t[0] ^ w0_t[2]), 1u); SHA1_STEP (SHA1_F0o, c, d, e, a, b, w0_t[2]); + w0_t[3] = rotl32 ((w0_t[0] ^ w2_t[3] ^ w1_t[1] ^ w0_t[3]), 1u); SHA1_STEP (SHA1_F0o, b, c, d, e, a, w0_t[3]); + + #undef K + #define K SHA1C01 + + w1_t[0] = rotl32 ((w0_t[1] ^ w3_t[0] ^ w1_t[2] ^ w1_t[0]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w1_t[0]); + w1_t[1] = rotl32 ((w0_t[2] ^ w3_t[1] ^ w1_t[3] ^ w1_t[1]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w1_t[1]); + w1_t[2] = rotl32 ((w0_t[3] ^ w3_t[2] ^ w2_t[0] ^ w1_t[2]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w1_t[2]); + w1_t[3] = rotl32 ((w1_t[0] ^ w3_t[3] ^ w2_t[1] ^ w1_t[3]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1_t[3]); + w2_t[0] = rotl32 ((w1_t[1] ^ w0_t[0] ^ w2_t[2] ^ w2_t[0]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w2_t[0]); + w2_t[1] = rotl32 ((w1_t[2] ^ w0_t[1] ^ w2_t[3] ^ w2_t[1]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w2_t[1]); + w2_t[2] = rotl32 ((w1_t[3] ^ w0_t[2] ^ w3_t[0] ^ w2_t[2]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w2_t[2]); + w2_t[3] = rotl32 ((w2_t[0] ^ w0_t[3] ^ w3_t[1] ^ w2_t[3]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w2_t[3]); + w3_t[0] = rotl32 ((w2_t[1] ^ w1_t[0] ^ w3_t[2] ^ w3_t[0]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w3_t[0]); + w3_t[1] = rotl32 ((w2_t[2] ^ w1_t[1] ^ w3_t[3] ^ w3_t[1]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w3_t[1]); + w3_t[2] = rotl32 ((w2_t[3] ^ w1_t[2] ^ w0_t[0] ^ w3_t[2]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w3_t[2]); + w3_t[3] = rotl32 ((w3_t[0] ^ w1_t[3] ^ w0_t[1] ^ w3_t[3]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w3_t[3]); + w0_t[0] = rotl32 ((w3_t[1] ^ w2_t[0] ^ w0_t[2] ^ w0_t[0]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w0_t[0]); + w0_t[1] = rotl32 ((w3_t[2] ^ w2_t[1] ^ w0_t[3] ^ w0_t[1]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w0_t[1]); + w0_t[2] = rotl32 ((w3_t[3] ^ w2_t[2] ^ w1_t[0] ^ w0_t[2]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w0_t[2]); + w0_t[3] = rotl32 ((w0_t[0] ^ w2_t[3] ^ w1_t[1] ^ w0_t[3]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w0_t[3]); + w1_t[0] = rotl32 ((w0_t[1] ^ w3_t[0] ^ w1_t[2] ^ w1_t[0]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w1_t[0]); + w1_t[1] = rotl32 ((w0_t[2] ^ w3_t[1] ^ w1_t[3] ^ w1_t[1]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w1_t[1]); + w1_t[2] = rotl32 ((w0_t[3] ^ w3_t[2] ^ w2_t[0] ^ w1_t[2]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1_t[2]); + w1_t[3] = rotl32 ((w1_t[0] ^ w3_t[3] ^ w2_t[1] ^ w1_t[3]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w1_t[3]); + + #undef K + #define K SHA1C02 + + w2_t[0] = rotl32 ((w1_t[1] ^ w0_t[0] ^ w2_t[2] ^ w2_t[0]), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w2_t[0]); + w2_t[1] = rotl32 ((w1_t[2] ^ w0_t[1] ^ w2_t[3] ^ w2_t[1]), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w2_t[1]); + w2_t[2] = rotl32 ((w1_t[3] ^ w0_t[2] ^ w3_t[0] ^ w2_t[2]), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w2_t[2]); + w2_t[3] = rotl32 ((w2_t[0] ^ w0_t[3] ^ w3_t[1] ^ w2_t[3]), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w2_t[3]); + w3_t[0] = rotl32 ((w2_t[1] ^ w1_t[0] ^ w3_t[2] ^ w3_t[0]), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w3_t[0]); + w3_t[1] = rotl32 ((w2_t[2] ^ w1_t[1] ^ w3_t[3] ^ w3_t[1]), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w3_t[1]); + w3_t[2] = rotl32 ((w2_t[3] ^ w1_t[2] ^ w0_t[0] ^ w3_t[2]), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w3_t[2]); + w3_t[3] = rotl32 ((w3_t[0] ^ w1_t[3] ^ w0_t[1] ^ w3_t[3]), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w3_t[3]); + w0_t[0] = rotl32 ((w3_t[1] ^ w2_t[0] ^ w0_t[2] ^ w0_t[0]), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w0_t[0]); + w0_t[1] = rotl32 ((w3_t[2] ^ w2_t[1] ^ w0_t[3] ^ w0_t[1]), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w0_t[1]); + w0_t[2] = rotl32 ((w3_t[3] ^ w2_t[2] ^ w1_t[0] ^ w0_t[2]), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w0_t[2]); + w0_t[3] = rotl32 ((w0_t[0] ^ w2_t[3] ^ w1_t[1] ^ w0_t[3]), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w0_t[3]); + w1_t[0] = rotl32 ((w0_t[1] ^ w3_t[0] ^ w1_t[2] ^ w1_t[0]), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w1_t[0]); + w1_t[1] = rotl32 ((w0_t[2] ^ w3_t[1] ^ w1_t[3] ^ w1_t[1]), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w1_t[1]); + w1_t[2] = rotl32 ((w0_t[3] ^ w3_t[2] ^ w2_t[0] ^ w1_t[2]), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w1_t[2]); + w1_t[3] = rotl32 ((w1_t[0] ^ w3_t[3] ^ w2_t[1] ^ w1_t[3]), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w1_t[3]); + w2_t[0] = rotl32 ((w1_t[1] ^ w0_t[0] ^ w2_t[2] ^ w2_t[0]), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w2_t[0]); + w2_t[1] = rotl32 ((w1_t[2] ^ w0_t[1] ^ w2_t[3] ^ w2_t[1]), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w2_t[1]); + w2_t[2] = rotl32 ((w1_t[3] ^ w0_t[2] ^ w3_t[0] ^ w2_t[2]), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w2_t[2]); + w2_t[3] = rotl32 ((w2_t[0] ^ w0_t[3] ^ w3_t[1] ^ w2_t[3]), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w2_t[3]); + + #undef K + #define K SHA1C03 + + w3_t[0] = rotl32 ((w2_t[1] ^ w1_t[0] ^ w3_t[2] ^ w3_t[0]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w3_t[0]); + w3_t[1] = rotl32 ((w2_t[2] ^ w1_t[1] ^ w3_t[3] ^ w3_t[1]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w3_t[1]); + w3_t[2] = rotl32 ((w2_t[3] ^ w1_t[2] ^ w0_t[0] ^ w3_t[2]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w3_t[2]); + w3_t[3] = rotl32 ((w3_t[0] ^ w1_t[3] ^ w0_t[1] ^ w3_t[3]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w3_t[3]); + w0_t[0] = rotl32 ((w3_t[1] ^ w2_t[0] ^ w0_t[2] ^ w0_t[0]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w0_t[0]); + w0_t[1] = rotl32 ((w3_t[2] ^ w2_t[1] ^ w0_t[3] ^ w0_t[1]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w0_t[1]); + w0_t[2] = rotl32 ((w3_t[3] ^ w2_t[2] ^ w1_t[0] ^ w0_t[2]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w0_t[2]); + w0_t[3] = rotl32 ((w0_t[0] ^ w2_t[3] ^ w1_t[1] ^ w0_t[3]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w0_t[3]); + w1_t[0] = rotl32 ((w0_t[1] ^ w3_t[0] ^ w1_t[2] ^ w1_t[0]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1_t[0]); + w1_t[1] = rotl32 ((w0_t[2] ^ w3_t[1] ^ w1_t[3] ^ w1_t[1]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w1_t[1]); + w1_t[2] = rotl32 ((w0_t[3] ^ w3_t[2] ^ w2_t[0] ^ w1_t[2]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w1_t[2]); + w1_t[3] = rotl32 ((w1_t[0] ^ w3_t[3] ^ w2_t[1] ^ w1_t[3]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w1_t[3]); + w2_t[0] = rotl32 ((w1_t[1] ^ w0_t[0] ^ w2_t[2] ^ w2_t[0]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w2_t[0]); + w2_t[1] = rotl32 ((w1_t[2] ^ w0_t[1] ^ w2_t[3] ^ w2_t[1]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w2_t[1]); + w2_t[2] = rotl32 ((w1_t[3] ^ w0_t[2] ^ w3_t[0] ^ w2_t[2]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w2_t[2]); + w2_t[3] = rotl32 ((w2_t[0] ^ w0_t[3] ^ w3_t[1] ^ w2_t[3]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w2_t[3]); + w3_t[0] = rotl32 ((w2_t[1] ^ w1_t[0] ^ w3_t[2] ^ w3_t[0]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w3_t[0]); + + if (e != e_rev) continue; + + w3_t[1] = rotl32 ((w2_t[2] ^ w1_t[1] ^ w3_t[3] ^ w3_t[1]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w3_t[1]); + w3_t[2] = rotl32 ((w2_t[3] ^ w1_t[2] ^ w0_t[0] ^ w3_t[2]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w3_t[2]); + w3_t[3] = rotl32 ((w3_t[0] ^ w1_t[3] ^ w0_t[1] ^ w3_t[3]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w3_t[3]); + + + const u32x r0 = d; + const u32x r1 = e; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_S + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m00120_s08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m00120_s16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/nv/m00120_a3.cu b/nv/m00120_a3.cu new file mode 100644 index 0000000000..dfe9b0de00 --- /dev/null +++ b/nv/m00120_a3.cu @@ -0,0 +1,996 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _SHA1_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW2 +#define VECT_SIZE4 +#endif + +#define DGST_R0 3 +#define DGST_R1 4 +#define DGST_R2 2 +#define DGST_R3 1 + +#include "include/kernel_functions.c" +#include "types_nv.c" +#include "common_nv.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +__device__ __constant__ bf_t c_bfs[1024]; + +__device__ static void overwrite_at (u32x sw[16], const u32x w0, const u32 salt_len) +{ + switch (salt_len) + { + case 0: sw[0] = w0; + break; + case 1: sw[0] = (sw[0] & 0xff000000) | (w0 >> 8); + sw[1] = (sw[1] & 0x00ffffff) | (w0 << 24); + break; + case 2: sw[0] = (sw[0] & 0xffff0000) | (w0 >> 16); + sw[1] = (sw[1] & 0x0000ffff) | (w0 << 16); + break; + case 3: sw[0] = (sw[0] & 0xffffff00) | (w0 >> 24); + sw[1] = (sw[1] & 0x000000ff) | (w0 << 8); + break; + case 4: sw[1] = w0; + break; + case 5: sw[1] = (sw[1] & 0xff000000) | (w0 >> 8); + sw[2] = (sw[2] & 0x00ffffff) | (w0 << 24); + break; + case 6: sw[1] = (sw[1] & 0xffff0000) | (w0 >> 16); + sw[2] = (sw[2] & 0x0000ffff) | (w0 << 16); + break; + case 7: sw[1] = (sw[1] & 0xffffff00) | (w0 >> 24); + sw[2] = (sw[2] & 0x000000ff) | (w0 << 8); + break; + case 8: sw[2] = w0; + break; + case 9: sw[2] = (sw[2] & 0xff000000) | (w0 >> 8); + sw[3] = (sw[3] & 0x00ffffff) | (w0 << 24); + break; + case 10: sw[2] = (sw[2] & 0xffff0000) | (w0 >> 16); + sw[3] = (sw[3] & 0x0000ffff) | (w0 << 16); + break; + case 11: sw[2] = (sw[2] & 0xffffff00) | (w0 >> 24); + sw[3] = (sw[3] & 0x000000ff) | (w0 << 8); + break; + case 12: sw[3] = w0; + break; + case 13: sw[3] = (sw[3] & 0xff000000) | (w0 >> 8); + sw[4] = (sw[4] & 0x00ffffff) | (w0 << 24); + break; + case 14: sw[3] = (sw[3] & 0xffff0000) | (w0 >> 16); + sw[4] = (sw[4] & 0x0000ffff) | (w0 << 16); + break; + case 15: sw[3] = (sw[3] & 0xffffff00) | (w0 >> 24); + sw[4] = (sw[4] & 0x000000ff) | (w0 << 8); + break; + case 16: sw[4] = w0; + break; + case 17: sw[4] = (sw[4] & 0xff000000) | (w0 >> 8); + sw[5] = (sw[5] & 0x00ffffff) | (w0 << 24); + break; + case 18: sw[4] = (sw[4] & 0xffff0000) | (w0 >> 16); + sw[5] = (sw[5] & 0x0000ffff) | (w0 << 16); + break; + case 19: sw[4] = (sw[4] & 0xffffff00) | (w0 >> 24); + sw[5] = (sw[5] & 0x000000ff) | (w0 << 8); + break; + case 20: sw[5] = w0; + break; + case 21: sw[5] = (sw[5] & 0xff000000) | (w0 >> 8); + sw[6] = (sw[6] & 0x00ffffff) | (w0 << 24); + break; + case 22: sw[5] = (sw[5] & 0xffff0000) | (w0 >> 16); + sw[6] = (sw[6] & 0x0000ffff) | (w0 << 16); + break; + case 23: sw[5] = (sw[5] & 0xffffff00) | (w0 >> 24); + sw[6] = (sw[6] & 0x000000ff) | (w0 << 8); + break; + case 24: sw[6] = w0; + break; + case 25: sw[6] = (sw[6] & 0xff000000) | (w0 >> 8); + sw[7] = (sw[7] & 0x00ffffff) | (w0 << 24); + break; + case 26: sw[6] = (sw[6] & 0xffff0000) | (w0 >> 16); + sw[7] = (sw[7] & 0x0000ffff) | (w0 << 16); + break; + case 27: sw[6] = (sw[6] & 0xffffff00) | (w0 >> 24); + sw[7] = (sw[7] & 0x000000ff) | (w0 << 8); + break; + case 28: sw[7] = w0; + break; + case 29: sw[7] = (sw[7] & 0xff000000) | (w0 >> 8); + sw[8] = (sw[8] & 0x00ffffff) | (w0 << 24); + break; + case 30: sw[7] = (sw[7] & 0xffff0000) | (w0 >> 16); + sw[8] = (sw[8] & 0x0000ffff) | (w0 << 16); + break; + case 31: sw[7] = (sw[7] & 0xffffff00) | (w0 >> 24); + sw[8] = (sw[8] & 0x000000ff) | (w0 << 8); + break; + } +} + +__device__ static void m00120m (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], const u32 pw_len, const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset) +{ + /** + * modifier + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + const u32 lid = threadIdx.x; + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[ 1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[ 2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[ 3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[ 4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[ 5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[ 6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[ 7]; + + u32 salt_buf2[4]; + + salt_buf2[0] = 0; + salt_buf2[1] = 0; + salt_buf2[2] = 0; + salt_buf2[3] = 0; + + u32 salt_buf3[4]; + + salt_buf3[0] = 0; + salt_buf3[1] = 0; + salt_buf3[2] = 0; + salt_buf3[3] = 0; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + const u32 pw_salt_len = pw_len + salt_len; + + /** + * prepend salt + */ + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + w0_t[0] = swap_workaround (w0[0]); + w0_t[1] = swap_workaround (w0[1]); + w0_t[2] = swap_workaround (w0[2]); + w0_t[3] = swap_workaround (w0[3]); + w1_t[0] = swap_workaround (w1[0]); + w1_t[1] = swap_workaround (w1[1]); + w1_t[2] = swap_workaround (w1[2]); + w1_t[3] = swap_workaround (w1[3]); + w2_t[0] = swap_workaround (w2[0]); + w2_t[1] = swap_workaround (w2[1]); + w2_t[2] = swap_workaround (w2[2]); + w2_t[3] = swap_workaround (w2[3]); + w3_t[0] = swap_workaround (w3[0]); + w3_t[1] = swap_workaround (w3[1]); + w3_t[2] = swap_workaround (w3[2]); + w3_t[3] = swap_workaround (w3[3]); + + switch_buffer_by_offset (w0_t, w1_t, w2_t, w3_t, salt_len); + + w0_t[0] |= salt_buf0[0]; + w0_t[1] |= salt_buf0[1]; + w0_t[2] |= salt_buf0[2]; + w0_t[3] |= salt_buf0[3]; + w1_t[0] |= salt_buf1[0]; + w1_t[1] |= salt_buf1[1]; + w1_t[2] |= salt_buf1[2]; + w1_t[3] |= salt_buf1[3]; + w2_t[0] |= salt_buf2[0]; + w2_t[1] |= salt_buf2[1]; + w2_t[2] |= salt_buf2[2]; + w2_t[3] |= salt_buf2[3]; + w3_t[0] |= salt_buf3[0]; + w3_t[1] |= salt_buf3[1]; + w3_t[2] |= salt_buf3[2]; + w3_t[3] |= salt_buf3[3]; + + w0_t[0] = swap_workaround (w0_t[0]); + w0_t[1] = swap_workaround (w0_t[1]); + w0_t[2] = swap_workaround (w0_t[2]); + w0_t[3] = swap_workaround (w0_t[3]); + w1_t[0] = swap_workaround (w1_t[0]); + w1_t[1] = swap_workaround (w1_t[1]); + w1_t[2] = swap_workaround (w1_t[2]); + w1_t[3] = swap_workaround (w1_t[3]); + w2_t[0] = swap_workaround (w2_t[0]); + w2_t[1] = swap_workaround (w2_t[1]); + w2_t[2] = swap_workaround (w2_t[2]); + w2_t[3] = swap_workaround (w2_t[3]); + w3_t[0] = swap_workaround (w3_t[0]); + w3_t[1] = swap_workaround (w3_t[1]); + w3_t[2] = swap_workaround (w3_t[2]); + w3_t[3] = swap_workaround (w3_t[3]); + + /** + * loop + */ + + u32x w0l = w0[0]; + + for (u32 il_pos = 0; il_pos < bfs_cnt; il_pos++) + { + const u32 w0r = c_bfs[il_pos].i; + + const u32x w0n = w0l | w0r; + + u32x wx[16]; + + wx[ 0] = w0_t[0]; + wx[ 1] = w0_t[1]; + wx[ 2] = w0_t[2]; + wx[ 3] = w0_t[3]; + wx[ 4] = w1_t[0]; + wx[ 5] = w1_t[1]; + wx[ 6] = w1_t[2]; + wx[ 7] = w1_t[3]; + wx[ 8] = w2_t[0]; + wx[ 9] = w2_t[1]; + wx[10] = w2_t[2]; + wx[11] = w2_t[3]; + wx[12] = w3_t[0]; + wx[13] = w3_t[1]; + wx[14] = w3_t[2]; + wx[15] = w3_t[3]; + + overwrite_at (wx, w0n, salt_len); + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + w0_t[0] = wx[ 0]; + w0_t[1] = wx[ 1]; + w0_t[2] = wx[ 2]; + w0_t[3] = wx[ 3]; + w1_t[0] = wx[ 4]; + w1_t[1] = wx[ 5]; + w1_t[2] = wx[ 6]; + w1_t[3] = wx[ 7]; + w2_t[0] = wx[ 8]; + w2_t[1] = wx[ 9]; + w2_t[2] = wx[10]; + w2_t[3] = wx[11]; + w3_t[0] = wx[12]; + w3_t[1] = wx[13]; + w3_t[2] = 0; + w3_t[3] = pw_salt_len * 8; + + /** + * sha1 + */ + + u32x a = SHA1M_A; + u32x b = SHA1M_B; + u32x c = SHA1M_C; + u32x d = SHA1M_D; + u32x e = SHA1M_E; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w0_t[0]); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w0_t[1]); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w0_t[2]); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w0_t[3]); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w1_t[0]); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w1_t[1]); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w1_t[2]); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w1_t[3]); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w2_t[0]); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w2_t[1]); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w2_t[2]); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w2_t[3]); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w3_t[0]); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w3_t[1]); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w3_t[2]); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w3_t[3]); + w0_t[0] = rotl32 ((w3_t[1] ^ w2_t[0] ^ w0_t[2] ^ w0_t[0]), 1u); SHA1_STEP (SHA1_F0o, e, a, b, c, d, w0_t[0]); + w0_t[1] = rotl32 ((w3_t[2] ^ w2_t[1] ^ w0_t[3] ^ w0_t[1]), 1u); SHA1_STEP (SHA1_F0o, d, e, a, b, c, w0_t[1]); + w0_t[2] = rotl32 ((w3_t[3] ^ w2_t[2] ^ w1_t[0] ^ w0_t[2]), 1u); SHA1_STEP (SHA1_F0o, c, d, e, a, b, w0_t[2]); + w0_t[3] = rotl32 ((w0_t[0] ^ w2_t[3] ^ w1_t[1] ^ w0_t[3]), 1u); SHA1_STEP (SHA1_F0o, b, c, d, e, a, w0_t[3]); + + #undef K + #define K SHA1C01 + + w1_t[0] = rotl32 ((w0_t[1] ^ w3_t[0] ^ w1_t[2] ^ w1_t[0]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w1_t[0]); + w1_t[1] = rotl32 ((w0_t[2] ^ w3_t[1] ^ w1_t[3] ^ w1_t[1]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w1_t[1]); + w1_t[2] = rotl32 ((w0_t[3] ^ w3_t[2] ^ w2_t[0] ^ w1_t[2]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w1_t[2]); + w1_t[3] = rotl32 ((w1_t[0] ^ w3_t[3] ^ w2_t[1] ^ w1_t[3]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1_t[3]); + w2_t[0] = rotl32 ((w1_t[1] ^ w0_t[0] ^ w2_t[2] ^ w2_t[0]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w2_t[0]); + w2_t[1] = rotl32 ((w1_t[2] ^ w0_t[1] ^ w2_t[3] ^ w2_t[1]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w2_t[1]); + w2_t[2] = rotl32 ((w1_t[3] ^ w0_t[2] ^ w3_t[0] ^ w2_t[2]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w2_t[2]); + w2_t[3] = rotl32 ((w2_t[0] ^ w0_t[3] ^ w3_t[1] ^ w2_t[3]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w2_t[3]); + w3_t[0] = rotl32 ((w2_t[1] ^ w1_t[0] ^ w3_t[2] ^ w3_t[0]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w3_t[0]); + w3_t[1] = rotl32 ((w2_t[2] ^ w1_t[1] ^ w3_t[3] ^ w3_t[1]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w3_t[1]); + w3_t[2] = rotl32 ((w2_t[3] ^ w1_t[2] ^ w0_t[0] ^ w3_t[2]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w3_t[2]); + w3_t[3] = rotl32 ((w3_t[0] ^ w1_t[3] ^ w0_t[1] ^ w3_t[3]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w3_t[3]); + w0_t[0] = rotl32 ((w3_t[1] ^ w2_t[0] ^ w0_t[2] ^ w0_t[0]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w0_t[0]); + w0_t[1] = rotl32 ((w3_t[2] ^ w2_t[1] ^ w0_t[3] ^ w0_t[1]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w0_t[1]); + w0_t[2] = rotl32 ((w3_t[3] ^ w2_t[2] ^ w1_t[0] ^ w0_t[2]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w0_t[2]); + w0_t[3] = rotl32 ((w0_t[0] ^ w2_t[3] ^ w1_t[1] ^ w0_t[3]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w0_t[3]); + w1_t[0] = rotl32 ((w0_t[1] ^ w3_t[0] ^ w1_t[2] ^ w1_t[0]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w1_t[0]); + w1_t[1] = rotl32 ((w0_t[2] ^ w3_t[1] ^ w1_t[3] ^ w1_t[1]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w1_t[1]); + w1_t[2] = rotl32 ((w0_t[3] ^ w3_t[2] ^ w2_t[0] ^ w1_t[2]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1_t[2]); + w1_t[3] = rotl32 ((w1_t[0] ^ w3_t[3] ^ w2_t[1] ^ w1_t[3]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w1_t[3]); + + #undef K + #define K SHA1C02 + + w2_t[0] = rotl32 ((w1_t[1] ^ w0_t[0] ^ w2_t[2] ^ w2_t[0]), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w2_t[0]); + w2_t[1] = rotl32 ((w1_t[2] ^ w0_t[1] ^ w2_t[3] ^ w2_t[1]), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w2_t[1]); + w2_t[2] = rotl32 ((w1_t[3] ^ w0_t[2] ^ w3_t[0] ^ w2_t[2]), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w2_t[2]); + w2_t[3] = rotl32 ((w2_t[0] ^ w0_t[3] ^ w3_t[1] ^ w2_t[3]), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w2_t[3]); + w3_t[0] = rotl32 ((w2_t[1] ^ w1_t[0] ^ w3_t[2] ^ w3_t[0]), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w3_t[0]); + w3_t[1] = rotl32 ((w2_t[2] ^ w1_t[1] ^ w3_t[3] ^ w3_t[1]), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w3_t[1]); + w3_t[2] = rotl32 ((w2_t[3] ^ w1_t[2] ^ w0_t[0] ^ w3_t[2]), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w3_t[2]); + w3_t[3] = rotl32 ((w3_t[0] ^ w1_t[3] ^ w0_t[1] ^ w3_t[3]), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w3_t[3]); + w0_t[0] = rotl32 ((w3_t[1] ^ w2_t[0] ^ w0_t[2] ^ w0_t[0]), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w0_t[0]); + w0_t[1] = rotl32 ((w3_t[2] ^ w2_t[1] ^ w0_t[3] ^ w0_t[1]), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w0_t[1]); + w0_t[2] = rotl32 ((w3_t[3] ^ w2_t[2] ^ w1_t[0] ^ w0_t[2]), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w0_t[2]); + w0_t[3] = rotl32 ((w0_t[0] ^ w2_t[3] ^ w1_t[1] ^ w0_t[3]), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w0_t[3]); + w1_t[0] = rotl32 ((w0_t[1] ^ w3_t[0] ^ w1_t[2] ^ w1_t[0]), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w1_t[0]); + w1_t[1] = rotl32 ((w0_t[2] ^ w3_t[1] ^ w1_t[3] ^ w1_t[1]), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w1_t[1]); + w1_t[2] = rotl32 ((w0_t[3] ^ w3_t[2] ^ w2_t[0] ^ w1_t[2]), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w1_t[2]); + w1_t[3] = rotl32 ((w1_t[0] ^ w3_t[3] ^ w2_t[1] ^ w1_t[3]), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w1_t[3]); + w2_t[0] = rotl32 ((w1_t[1] ^ w0_t[0] ^ w2_t[2] ^ w2_t[0]), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w2_t[0]); + w2_t[1] = rotl32 ((w1_t[2] ^ w0_t[1] ^ w2_t[3] ^ w2_t[1]), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w2_t[1]); + w2_t[2] = rotl32 ((w1_t[3] ^ w0_t[2] ^ w3_t[0] ^ w2_t[2]), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w2_t[2]); + w2_t[3] = rotl32 ((w2_t[0] ^ w0_t[3] ^ w3_t[1] ^ w2_t[3]), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w2_t[3]); + + #undef K + #define K SHA1C03 + + w3_t[0] = rotl32 ((w2_t[1] ^ w1_t[0] ^ w3_t[2] ^ w3_t[0]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w3_t[0]); + w3_t[1] = rotl32 ((w2_t[2] ^ w1_t[1] ^ w3_t[3] ^ w3_t[1]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w3_t[1]); + w3_t[2] = rotl32 ((w2_t[3] ^ w1_t[2] ^ w0_t[0] ^ w3_t[2]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w3_t[2]); + w3_t[3] = rotl32 ((w3_t[0] ^ w1_t[3] ^ w0_t[1] ^ w3_t[3]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w3_t[3]); + w0_t[0] = rotl32 ((w3_t[1] ^ w2_t[0] ^ w0_t[2] ^ w0_t[0]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w0_t[0]); + w0_t[1] = rotl32 ((w3_t[2] ^ w2_t[1] ^ w0_t[3] ^ w0_t[1]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w0_t[1]); + w0_t[2] = rotl32 ((w3_t[3] ^ w2_t[2] ^ w1_t[0] ^ w0_t[2]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w0_t[2]); + w0_t[3] = rotl32 ((w0_t[0] ^ w2_t[3] ^ w1_t[1] ^ w0_t[3]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w0_t[3]); + w1_t[0] = rotl32 ((w0_t[1] ^ w3_t[0] ^ w1_t[2] ^ w1_t[0]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1_t[0]); + w1_t[1] = rotl32 ((w0_t[2] ^ w3_t[1] ^ w1_t[3] ^ w1_t[1]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w1_t[1]); + w1_t[2] = rotl32 ((w0_t[3] ^ w3_t[2] ^ w2_t[0] ^ w1_t[2]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w1_t[2]); + w1_t[3] = rotl32 ((w1_t[0] ^ w3_t[3] ^ w2_t[1] ^ w1_t[3]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w1_t[3]); + w2_t[0] = rotl32 ((w1_t[1] ^ w0_t[0] ^ w2_t[2] ^ w2_t[0]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w2_t[0]); + w2_t[1] = rotl32 ((w1_t[2] ^ w0_t[1] ^ w2_t[3] ^ w2_t[1]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w2_t[1]); + w2_t[2] = rotl32 ((w1_t[3] ^ w0_t[2] ^ w3_t[0] ^ w2_t[2]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w2_t[2]); + w2_t[3] = rotl32 ((w2_t[0] ^ w0_t[3] ^ w3_t[1] ^ w2_t[3]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w2_t[3]); + w3_t[0] = rotl32 ((w2_t[1] ^ w1_t[0] ^ w3_t[2] ^ w3_t[0]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w3_t[0]); + w3_t[1] = rotl32 ((w2_t[2] ^ w1_t[1] ^ w3_t[3] ^ w3_t[1]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w3_t[1]); + w3_t[2] = rotl32 ((w2_t[3] ^ w1_t[2] ^ w0_t[0] ^ w3_t[2]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w3_t[2]); + w3_t[3] = rotl32 ((w3_t[0] ^ w1_t[3] ^ w0_t[1] ^ w3_t[3]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w3_t[3]); + + const u32x r0 = d; + const u32x r1 = e; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_M + } +} + +__device__ static void m00120s (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], const u32 pw_len, const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset) +{ + /** + * modifier + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + const u32 lid = threadIdx.x; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * reverse + */ + + const u32 e_rev = rotl32 (search[1], 2u); + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[ 1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[ 2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[ 3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[ 4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[ 5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[ 6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[ 7]; + + u32 salt_buf2[4]; + + salt_buf2[0] = 0; + salt_buf2[1] = 0; + salt_buf2[2] = 0; + salt_buf2[3] = 0; + + u32 salt_buf3[4]; + + salt_buf3[0] = 0; + salt_buf3[1] = 0; + salt_buf3[2] = 0; + salt_buf3[3] = 0; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + const u32 pw_salt_len = pw_len + salt_len; + + /** + * prepend salt + */ + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + w0_t[0] = swap_workaround (w0[0]); + w0_t[1] = swap_workaround (w0[1]); + w0_t[2] = swap_workaround (w0[2]); + w0_t[3] = swap_workaround (w0[3]); + w1_t[0] = swap_workaround (w1[0]); + w1_t[1] = swap_workaround (w1[1]); + w1_t[2] = swap_workaround (w1[2]); + w1_t[3] = swap_workaround (w1[3]); + w2_t[0] = swap_workaround (w2[0]); + w2_t[1] = swap_workaround (w2[1]); + w2_t[2] = swap_workaround (w2[2]); + w2_t[3] = swap_workaround (w2[3]); + w3_t[0] = swap_workaround (w3[0]); + w3_t[1] = swap_workaround (w3[1]); + w3_t[2] = swap_workaround (w3[2]); + w3_t[3] = swap_workaround (w3[3]); + + switch_buffer_by_offset (w0_t, w1_t, w2_t, w3_t, salt_len); + + w0_t[0] |= salt_buf0[0]; + w0_t[1] |= salt_buf0[1]; + w0_t[2] |= salt_buf0[2]; + w0_t[3] |= salt_buf0[3]; + w1_t[0] |= salt_buf1[0]; + w1_t[1] |= salt_buf1[1]; + w1_t[2] |= salt_buf1[2]; + w1_t[3] |= salt_buf1[3]; + w2_t[0] |= salt_buf2[0]; + w2_t[1] |= salt_buf2[1]; + w2_t[2] |= salt_buf2[2]; + w2_t[3] |= salt_buf2[3]; + w3_t[0] |= salt_buf3[0]; + w3_t[1] |= salt_buf3[1]; + w3_t[2] |= salt_buf3[2]; + w3_t[3] |= salt_buf3[3]; + + w0_t[0] = swap_workaround (w0_t[0]); + w0_t[1] = swap_workaround (w0_t[1]); + w0_t[2] = swap_workaround (w0_t[2]); + w0_t[3] = swap_workaround (w0_t[3]); + w1_t[0] = swap_workaround (w1_t[0]); + w1_t[1] = swap_workaround (w1_t[1]); + w1_t[2] = swap_workaround (w1_t[2]); + w1_t[3] = swap_workaround (w1_t[3]); + w2_t[0] = swap_workaround (w2_t[0]); + w2_t[1] = swap_workaround (w2_t[1]); + w2_t[2] = swap_workaround (w2_t[2]); + w2_t[3] = swap_workaround (w2_t[3]); + w3_t[0] = swap_workaround (w3_t[0]); + w3_t[1] = swap_workaround (w3_t[1]); + w3_t[2] = swap_workaround (w3_t[2]); + w3_t[3] = swap_workaround (w3_t[3]); + + /** + * loop + */ + + u32x w0l = w0[0]; + + for (u32 il_pos = 0; il_pos < bfs_cnt; il_pos++) + { + const u32 w0r = c_bfs[il_pos].i; + + const u32x w0n = w0l | w0r; + + u32x wx[16]; + + wx[ 0] = w0_t[0]; + wx[ 1] = w0_t[1]; + wx[ 2] = w0_t[2]; + wx[ 3] = w0_t[3]; + wx[ 4] = w1_t[0]; + wx[ 5] = w1_t[1]; + wx[ 6] = w1_t[2]; + wx[ 7] = w1_t[3]; + wx[ 8] = w2_t[0]; + wx[ 9] = w2_t[1]; + wx[10] = w2_t[2]; + wx[11] = w2_t[3]; + wx[12] = w3_t[0]; + wx[13] = w3_t[1]; + wx[14] = w3_t[2]; + wx[15] = w3_t[3]; + + overwrite_at (wx, w0n, salt_len); + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + w0_t[0] = wx[ 0]; + w0_t[1] = wx[ 1]; + w0_t[2] = wx[ 2]; + w0_t[3] = wx[ 3]; + w1_t[0] = wx[ 4]; + w1_t[1] = wx[ 5]; + w1_t[2] = wx[ 6]; + w1_t[3] = wx[ 7]; + w2_t[0] = wx[ 8]; + w2_t[1] = wx[ 9]; + w2_t[2] = wx[10]; + w2_t[3] = wx[11]; + w3_t[0] = wx[12]; + w3_t[1] = wx[13]; + w3_t[2] = 0; + w3_t[3] = pw_salt_len * 8; + + /** + * sha1 + */ + + u32x a = SHA1M_A; + u32x b = SHA1M_B; + u32x c = SHA1M_C; + u32x d = SHA1M_D; + u32x e = SHA1M_E; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w0_t[0]); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w0_t[1]); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w0_t[2]); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w0_t[3]); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w1_t[0]); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w1_t[1]); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w1_t[2]); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w1_t[3]); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w2_t[0]); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w2_t[1]); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w2_t[2]); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w2_t[3]); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w3_t[0]); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w3_t[1]); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w3_t[2]); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w3_t[3]); + w0_t[0] = rotl32 ((w3_t[1] ^ w2_t[0] ^ w0_t[2] ^ w0_t[0]), 1u); SHA1_STEP (SHA1_F0o, e, a, b, c, d, w0_t[0]); + w0_t[1] = rotl32 ((w3_t[2] ^ w2_t[1] ^ w0_t[3] ^ w0_t[1]), 1u); SHA1_STEP (SHA1_F0o, d, e, a, b, c, w0_t[1]); + w0_t[2] = rotl32 ((w3_t[3] ^ w2_t[2] ^ w1_t[0] ^ w0_t[2]), 1u); SHA1_STEP (SHA1_F0o, c, d, e, a, b, w0_t[2]); + w0_t[3] = rotl32 ((w0_t[0] ^ w2_t[3] ^ w1_t[1] ^ w0_t[3]), 1u); SHA1_STEP (SHA1_F0o, b, c, d, e, a, w0_t[3]); + + #undef K + #define K SHA1C01 + + w1_t[0] = rotl32 ((w0_t[1] ^ w3_t[0] ^ w1_t[2] ^ w1_t[0]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w1_t[0]); + w1_t[1] = rotl32 ((w0_t[2] ^ w3_t[1] ^ w1_t[3] ^ w1_t[1]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w1_t[1]); + w1_t[2] = rotl32 ((w0_t[3] ^ w3_t[2] ^ w2_t[0] ^ w1_t[2]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w1_t[2]); + w1_t[3] = rotl32 ((w1_t[0] ^ w3_t[3] ^ w2_t[1] ^ w1_t[3]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1_t[3]); + w2_t[0] = rotl32 ((w1_t[1] ^ w0_t[0] ^ w2_t[2] ^ w2_t[0]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w2_t[0]); + w2_t[1] = rotl32 ((w1_t[2] ^ w0_t[1] ^ w2_t[3] ^ w2_t[1]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w2_t[1]); + w2_t[2] = rotl32 ((w1_t[3] ^ w0_t[2] ^ w3_t[0] ^ w2_t[2]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w2_t[2]); + w2_t[3] = rotl32 ((w2_t[0] ^ w0_t[3] ^ w3_t[1] ^ w2_t[3]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w2_t[3]); + w3_t[0] = rotl32 ((w2_t[1] ^ w1_t[0] ^ w3_t[2] ^ w3_t[0]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w3_t[0]); + w3_t[1] = rotl32 ((w2_t[2] ^ w1_t[1] ^ w3_t[3] ^ w3_t[1]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w3_t[1]); + w3_t[2] = rotl32 ((w2_t[3] ^ w1_t[2] ^ w0_t[0] ^ w3_t[2]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w3_t[2]); + w3_t[3] = rotl32 ((w3_t[0] ^ w1_t[3] ^ w0_t[1] ^ w3_t[3]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w3_t[3]); + w0_t[0] = rotl32 ((w3_t[1] ^ w2_t[0] ^ w0_t[2] ^ w0_t[0]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w0_t[0]); + w0_t[1] = rotl32 ((w3_t[2] ^ w2_t[1] ^ w0_t[3] ^ w0_t[1]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w0_t[1]); + w0_t[2] = rotl32 ((w3_t[3] ^ w2_t[2] ^ w1_t[0] ^ w0_t[2]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w0_t[2]); + w0_t[3] = rotl32 ((w0_t[0] ^ w2_t[3] ^ w1_t[1] ^ w0_t[3]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w0_t[3]); + w1_t[0] = rotl32 ((w0_t[1] ^ w3_t[0] ^ w1_t[2] ^ w1_t[0]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w1_t[0]); + w1_t[1] = rotl32 ((w0_t[2] ^ w3_t[1] ^ w1_t[3] ^ w1_t[1]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w1_t[1]); + w1_t[2] = rotl32 ((w0_t[3] ^ w3_t[2] ^ w2_t[0] ^ w1_t[2]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1_t[2]); + w1_t[3] = rotl32 ((w1_t[0] ^ w3_t[3] ^ w2_t[1] ^ w1_t[3]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w1_t[3]); + + #undef K + #define K SHA1C02 + + w2_t[0] = rotl32 ((w1_t[1] ^ w0_t[0] ^ w2_t[2] ^ w2_t[0]), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w2_t[0]); + w2_t[1] = rotl32 ((w1_t[2] ^ w0_t[1] ^ w2_t[3] ^ w2_t[1]), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w2_t[1]); + w2_t[2] = rotl32 ((w1_t[3] ^ w0_t[2] ^ w3_t[0] ^ w2_t[2]), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w2_t[2]); + w2_t[3] = rotl32 ((w2_t[0] ^ w0_t[3] ^ w3_t[1] ^ w2_t[3]), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w2_t[3]); + w3_t[0] = rotl32 ((w2_t[1] ^ w1_t[0] ^ w3_t[2] ^ w3_t[0]), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w3_t[0]); + w3_t[1] = rotl32 ((w2_t[2] ^ w1_t[1] ^ w3_t[3] ^ w3_t[1]), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w3_t[1]); + w3_t[2] = rotl32 ((w2_t[3] ^ w1_t[2] ^ w0_t[0] ^ w3_t[2]), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w3_t[2]); + w3_t[3] = rotl32 ((w3_t[0] ^ w1_t[3] ^ w0_t[1] ^ w3_t[3]), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w3_t[3]); + w0_t[0] = rotl32 ((w3_t[1] ^ w2_t[0] ^ w0_t[2] ^ w0_t[0]), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w0_t[0]); + w0_t[1] = rotl32 ((w3_t[2] ^ w2_t[1] ^ w0_t[3] ^ w0_t[1]), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w0_t[1]); + w0_t[2] = rotl32 ((w3_t[3] ^ w2_t[2] ^ w1_t[0] ^ w0_t[2]), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w0_t[2]); + w0_t[3] = rotl32 ((w0_t[0] ^ w2_t[3] ^ w1_t[1] ^ w0_t[3]), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w0_t[3]); + w1_t[0] = rotl32 ((w0_t[1] ^ w3_t[0] ^ w1_t[2] ^ w1_t[0]), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w1_t[0]); + w1_t[1] = rotl32 ((w0_t[2] ^ w3_t[1] ^ w1_t[3] ^ w1_t[1]), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w1_t[1]); + w1_t[2] = rotl32 ((w0_t[3] ^ w3_t[2] ^ w2_t[0] ^ w1_t[2]), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w1_t[2]); + w1_t[3] = rotl32 ((w1_t[0] ^ w3_t[3] ^ w2_t[1] ^ w1_t[3]), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w1_t[3]); + w2_t[0] = rotl32 ((w1_t[1] ^ w0_t[0] ^ w2_t[2] ^ w2_t[0]), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w2_t[0]); + w2_t[1] = rotl32 ((w1_t[2] ^ w0_t[1] ^ w2_t[3] ^ w2_t[1]), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w2_t[1]); + w2_t[2] = rotl32 ((w1_t[3] ^ w0_t[2] ^ w3_t[0] ^ w2_t[2]), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w2_t[2]); + w2_t[3] = rotl32 ((w2_t[0] ^ w0_t[3] ^ w3_t[1] ^ w2_t[3]), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w2_t[3]); + + #undef K + #define K SHA1C03 + + w3_t[0] = rotl32 ((w2_t[1] ^ w1_t[0] ^ w3_t[2] ^ w3_t[0]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w3_t[0]); + w3_t[1] = rotl32 ((w2_t[2] ^ w1_t[1] ^ w3_t[3] ^ w3_t[1]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w3_t[1]); + w3_t[2] = rotl32 ((w2_t[3] ^ w1_t[2] ^ w0_t[0] ^ w3_t[2]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w3_t[2]); + w3_t[3] = rotl32 ((w3_t[0] ^ w1_t[3] ^ w0_t[1] ^ w3_t[3]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w3_t[3]); + w0_t[0] = rotl32 ((w3_t[1] ^ w2_t[0] ^ w0_t[2] ^ w0_t[0]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w0_t[0]); + w0_t[1] = rotl32 ((w3_t[2] ^ w2_t[1] ^ w0_t[3] ^ w0_t[1]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w0_t[1]); + w0_t[2] = rotl32 ((w3_t[3] ^ w2_t[2] ^ w1_t[0] ^ w0_t[2]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w0_t[2]); + w0_t[3] = rotl32 ((w0_t[0] ^ w2_t[3] ^ w1_t[1] ^ w0_t[3]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w0_t[3]); + w1_t[0] = rotl32 ((w0_t[1] ^ w3_t[0] ^ w1_t[2] ^ w1_t[0]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1_t[0]); + w1_t[1] = rotl32 ((w0_t[2] ^ w3_t[1] ^ w1_t[3] ^ w1_t[1]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w1_t[1]); + w1_t[2] = rotl32 ((w0_t[3] ^ w3_t[2] ^ w2_t[0] ^ w1_t[2]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w1_t[2]); + w1_t[3] = rotl32 ((w1_t[0] ^ w3_t[3] ^ w2_t[1] ^ w1_t[3]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w1_t[3]); + w2_t[0] = rotl32 ((w1_t[1] ^ w0_t[0] ^ w2_t[2] ^ w2_t[0]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w2_t[0]); + w2_t[1] = rotl32 ((w1_t[2] ^ w0_t[1] ^ w2_t[3] ^ w2_t[1]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w2_t[1]); + w2_t[2] = rotl32 ((w1_t[3] ^ w0_t[2] ^ w3_t[0] ^ w2_t[2]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w2_t[2]); + w2_t[3] = rotl32 ((w2_t[0] ^ w0_t[3] ^ w3_t[1] ^ w2_t[3]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w2_t[3]); + w3_t[0] = rotl32 ((w2_t[1] ^ w1_t[0] ^ w3_t[2] ^ w3_t[0]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w3_t[0]); + + if (e != e_rev) continue; + + w3_t[1] = rotl32 ((w2_t[2] ^ w1_t[1] ^ w3_t[3] ^ w3_t[1]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w3_t[1]); + w3_t[2] = rotl32 ((w2_t[3] ^ w1_t[2] ^ w0_t[0] ^ w3_t[2]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w3_t[2]); + w3_t[3] = rotl32 ((w3_t[0] ^ w1_t[3] ^ w0_t[1] ^ w3_t[3]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w3_t[3]); + + + const u32x r0 = d; + const u32x r1 = e; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_S + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m00120_m04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m00120m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m00120_m08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m00120m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m00120_m16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = pws[gid].i[ 8]; + w2[1] = pws[gid].i[ 9]; + w2[2] = pws[gid].i[10]; + w2[3] = pws[gid].i[11]; + + u32x w3[4]; + + w3[0] = pws[gid].i[12]; + w3[1] = pws[gid].i[13]; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m00120m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m00120_s04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m00120s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m00120_s08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m00120s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m00120_s16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = pws[gid].i[ 8]; + w2[1] = pws[gid].i[ 9]; + w2[2] = pws[gid].i[10]; + w2[3] = pws[gid].i[11]; + + u32x w3[4]; + + w3[0] = pws[gid].i[12]; + w3[1] = pws[gid].i[13]; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m00120s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} diff --git a/nv/m00130_a0.cu b/nv/m00130_a0.cu new file mode 100644 index 0000000000..a658bce008 --- /dev/null +++ b/nv/m00130_a0.cu @@ -0,0 +1,654 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _SHA1_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW2 +#define VECT_SIZE1 +#endif + +#define DGST_R0 3 +#define DGST_R1 4 +#define DGST_R2 2 +#define DGST_R3 1 + +#include "include/kernel_functions.c" +#include "types_nv.c" +#include "common_nv.c" +#include "include/rp_gpu.h" +#include "rp_nv.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +__device__ __constant__ gpu_rule_t c_rules[1024]; + +extern "C" __global__ void __launch_bounds__ (256, 1) m00130_m04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + u32x pw_buf1[4]; + + pw_buf1[0] = pws[gid].i[ 4]; + pw_buf1[1] = pws[gid].i[ 5]; + pw_buf1[2] = pws[gid].i[ 6]; + pw_buf1[3] = pws[gid].i[ 7]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[7]; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + + w0[0] = pw_buf0[0]; + w0[1] = pw_buf0[1]; + w0[2] = pw_buf0[2]; + w0[3] = pw_buf0[3]; + + u32x w1[4]; + + w1[0] = pw_buf1[0]; + w1[1] = pw_buf1[1]; + w1[2] = pw_buf1[2]; + w1[3] = pw_buf1[3]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 out_len = apply_rules (c_rules[il_pos].cmds, w0, w1, pw_len); + + /** + * append salt + */ + + u32 s0[4]; + + s0[0] = salt_buf0[0]; + s0[1] = salt_buf0[1]; + s0[2] = salt_buf0[2]; + s0[3] = salt_buf0[3]; + + u32 s1[4]; + + s1[0] = salt_buf1[0]; + s1[1] = salt_buf1[1]; + s1[2] = salt_buf1[2]; + s1[3] = salt_buf1[3]; + + u32 s2[4]; + + s2[0] = 0; + s2[1] = 0; + s2[2] = 0; + s2[3] = 0; + + u32 s3[4]; + + s3[0] = 0; + s3[1] = 0; + s3[2] = 0; + s3[3] = 0; + + switch_buffer_by_offset (s0, s1, s2, s3, (out_len * 2)); + + const u32 out_salt_len = (out_len * 2) + salt_len; + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + make_unicode (w0, w0_t, w1_t); + make_unicode (w1, w2_t, w3_t); + + w0_t[0] |= s0[0]; + w0_t[1] |= s0[1]; + w0_t[2] |= s0[2]; + w0_t[3] |= s0[3]; + w1_t[0] |= s1[0]; + w1_t[1] |= s1[1]; + w1_t[2] |= s1[2]; + w1_t[3] |= s1[3]; + w2_t[0] |= s2[0]; + w2_t[1] |= s2[1]; + w2_t[2] |= s2[2]; + w2_t[3] |= s2[3]; + w3_t[0] |= s3[0]; + w3_t[1] |= s3[1]; + w3_t[2] |= s3[2]; + w3_t[3] |= s3[3]; + + append_0x80_4 (w0_t, w1_t, w2_t, w3_t, out_salt_len); + + w3_t[3] = out_salt_len * 8; + + /** + * sha1 + */ + + w0_t[0] = swap_workaround (w0_t[0]); + w0_t[1] = swap_workaround (w0_t[1]); + w0_t[2] = swap_workaround (w0_t[2]); + w0_t[3] = swap_workaround (w0_t[3]); + w1_t[0] = swap_workaround (w1_t[0]); + w1_t[1] = swap_workaround (w1_t[1]); + w1_t[2] = swap_workaround (w1_t[2]); + w1_t[3] = swap_workaround (w1_t[3]); + w2_t[0] = swap_workaround (w2_t[0]); + w2_t[1] = swap_workaround (w2_t[1]); + w2_t[2] = swap_workaround (w2_t[2]); + w2_t[3] = swap_workaround (w2_t[3]); + w3_t[0] = swap_workaround (w3_t[0]); + w3_t[1] = swap_workaround (w3_t[1]); + //w3_t[2] = swap_workaround (w3_t[2]); + //w3_t[3] = swap_workaround (w3_t[3]); + + u32x a = SHA1M_A; + u32x b = SHA1M_B; + u32x c = SHA1M_C; + u32x d = SHA1M_D; + u32x e = SHA1M_E; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w0_t[0]); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w0_t[1]); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w0_t[2]); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w0_t[3]); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w1_t[0]); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w1_t[1]); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w1_t[2]); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w1_t[3]); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w2_t[0]); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w2_t[1]); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w2_t[2]); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w2_t[3]); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w3_t[0]); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w3_t[1]); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w3_t[2]); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w3_t[3]); + w0_t[0] = rotl32 ((w3_t[1] ^ w2_t[0] ^ w0_t[2] ^ w0_t[0]), 1u); SHA1_STEP (SHA1_F0o, e, a, b, c, d, w0_t[0]); + w0_t[1] = rotl32 ((w3_t[2] ^ w2_t[1] ^ w0_t[3] ^ w0_t[1]), 1u); SHA1_STEP (SHA1_F0o, d, e, a, b, c, w0_t[1]); + w0_t[2] = rotl32 ((w3_t[3] ^ w2_t[2] ^ w1_t[0] ^ w0_t[2]), 1u); SHA1_STEP (SHA1_F0o, c, d, e, a, b, w0_t[2]); + w0_t[3] = rotl32 ((w0_t[0] ^ w2_t[3] ^ w1_t[1] ^ w0_t[3]), 1u); SHA1_STEP (SHA1_F0o, b, c, d, e, a, w0_t[3]); + + #undef K + #define K SHA1C01 + + w1_t[0] = rotl32 ((w0_t[1] ^ w3_t[0] ^ w1_t[2] ^ w1_t[0]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w1_t[0]); + w1_t[1] = rotl32 ((w0_t[2] ^ w3_t[1] ^ w1_t[3] ^ w1_t[1]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w1_t[1]); + w1_t[2] = rotl32 ((w0_t[3] ^ w3_t[2] ^ w2_t[0] ^ w1_t[2]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w1_t[2]); + w1_t[3] = rotl32 ((w1_t[0] ^ w3_t[3] ^ w2_t[1] ^ w1_t[3]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1_t[3]); + w2_t[0] = rotl32 ((w1_t[1] ^ w0_t[0] ^ w2_t[2] ^ w2_t[0]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w2_t[0]); + w2_t[1] = rotl32 ((w1_t[2] ^ w0_t[1] ^ w2_t[3] ^ w2_t[1]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w2_t[1]); + w2_t[2] = rotl32 ((w1_t[3] ^ w0_t[2] ^ w3_t[0] ^ w2_t[2]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w2_t[2]); + w2_t[3] = rotl32 ((w2_t[0] ^ w0_t[3] ^ w3_t[1] ^ w2_t[3]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w2_t[3]); + w3_t[0] = rotl32 ((w2_t[1] ^ w1_t[0] ^ w3_t[2] ^ w3_t[0]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w3_t[0]); + w3_t[1] = rotl32 ((w2_t[2] ^ w1_t[1] ^ w3_t[3] ^ w3_t[1]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w3_t[1]); + w3_t[2] = rotl32 ((w2_t[3] ^ w1_t[2] ^ w0_t[0] ^ w3_t[2]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w3_t[2]); + w3_t[3] = rotl32 ((w3_t[0] ^ w1_t[3] ^ w0_t[1] ^ w3_t[3]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w3_t[3]); + w0_t[0] = rotl32 ((w3_t[1] ^ w2_t[0] ^ w0_t[2] ^ w0_t[0]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w0_t[0]); + w0_t[1] = rotl32 ((w3_t[2] ^ w2_t[1] ^ w0_t[3] ^ w0_t[1]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w0_t[1]); + w0_t[2] = rotl32 ((w3_t[3] ^ w2_t[2] ^ w1_t[0] ^ w0_t[2]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w0_t[2]); + w0_t[3] = rotl32 ((w0_t[0] ^ w2_t[3] ^ w1_t[1] ^ w0_t[3]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w0_t[3]); + w1_t[0] = rotl32 ((w0_t[1] ^ w3_t[0] ^ w1_t[2] ^ w1_t[0]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w1_t[0]); + w1_t[1] = rotl32 ((w0_t[2] ^ w3_t[1] ^ w1_t[3] ^ w1_t[1]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w1_t[1]); + w1_t[2] = rotl32 ((w0_t[3] ^ w3_t[2] ^ w2_t[0] ^ w1_t[2]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1_t[2]); + w1_t[3] = rotl32 ((w1_t[0] ^ w3_t[3] ^ w2_t[1] ^ w1_t[3]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w1_t[3]); + + #undef K + #define K SHA1C02 + + w2_t[0] = rotl32 ((w1_t[1] ^ w0_t[0] ^ w2_t[2] ^ w2_t[0]), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w2_t[0]); + w2_t[1] = rotl32 ((w1_t[2] ^ w0_t[1] ^ w2_t[3] ^ w2_t[1]), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w2_t[1]); + w2_t[2] = rotl32 ((w1_t[3] ^ w0_t[2] ^ w3_t[0] ^ w2_t[2]), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w2_t[2]); + w2_t[3] = rotl32 ((w2_t[0] ^ w0_t[3] ^ w3_t[1] ^ w2_t[3]), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w2_t[3]); + w3_t[0] = rotl32 ((w2_t[1] ^ w1_t[0] ^ w3_t[2] ^ w3_t[0]), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w3_t[0]); + w3_t[1] = rotl32 ((w2_t[2] ^ w1_t[1] ^ w3_t[3] ^ w3_t[1]), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w3_t[1]); + w3_t[2] = rotl32 ((w2_t[3] ^ w1_t[2] ^ w0_t[0] ^ w3_t[2]), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w3_t[2]); + w3_t[3] = rotl32 ((w3_t[0] ^ w1_t[3] ^ w0_t[1] ^ w3_t[3]), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w3_t[3]); + w0_t[0] = rotl32 ((w3_t[1] ^ w2_t[0] ^ w0_t[2] ^ w0_t[0]), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w0_t[0]); + w0_t[1] = rotl32 ((w3_t[2] ^ w2_t[1] ^ w0_t[3] ^ w0_t[1]), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w0_t[1]); + w0_t[2] = rotl32 ((w3_t[3] ^ w2_t[2] ^ w1_t[0] ^ w0_t[2]), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w0_t[2]); + w0_t[3] = rotl32 ((w0_t[0] ^ w2_t[3] ^ w1_t[1] ^ w0_t[3]), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w0_t[3]); + w1_t[0] = rotl32 ((w0_t[1] ^ w3_t[0] ^ w1_t[2] ^ w1_t[0]), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w1_t[0]); + w1_t[1] = rotl32 ((w0_t[2] ^ w3_t[1] ^ w1_t[3] ^ w1_t[1]), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w1_t[1]); + w1_t[2] = rotl32 ((w0_t[3] ^ w3_t[2] ^ w2_t[0] ^ w1_t[2]), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w1_t[2]); + w1_t[3] = rotl32 ((w1_t[0] ^ w3_t[3] ^ w2_t[1] ^ w1_t[3]), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w1_t[3]); + w2_t[0] = rotl32 ((w1_t[1] ^ w0_t[0] ^ w2_t[2] ^ w2_t[0]), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w2_t[0]); + w2_t[1] = rotl32 ((w1_t[2] ^ w0_t[1] ^ w2_t[3] ^ w2_t[1]), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w2_t[1]); + w2_t[2] = rotl32 ((w1_t[3] ^ w0_t[2] ^ w3_t[0] ^ w2_t[2]), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w2_t[2]); + w2_t[3] = rotl32 ((w2_t[0] ^ w0_t[3] ^ w3_t[1] ^ w2_t[3]), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w2_t[3]); + + #undef K + #define K SHA1C03 + + w3_t[0] = rotl32 ((w2_t[1] ^ w1_t[0] ^ w3_t[2] ^ w3_t[0]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w3_t[0]); + w3_t[1] = rotl32 ((w2_t[2] ^ w1_t[1] ^ w3_t[3] ^ w3_t[1]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w3_t[1]); + w3_t[2] = rotl32 ((w2_t[3] ^ w1_t[2] ^ w0_t[0] ^ w3_t[2]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w3_t[2]); + w3_t[3] = rotl32 ((w3_t[0] ^ w1_t[3] ^ w0_t[1] ^ w3_t[3]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w3_t[3]); + w0_t[0] = rotl32 ((w3_t[1] ^ w2_t[0] ^ w0_t[2] ^ w0_t[0]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w0_t[0]); + w0_t[1] = rotl32 ((w3_t[2] ^ w2_t[1] ^ w0_t[3] ^ w0_t[1]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w0_t[1]); + w0_t[2] = rotl32 ((w3_t[3] ^ w2_t[2] ^ w1_t[0] ^ w0_t[2]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w0_t[2]); + w0_t[3] = rotl32 ((w0_t[0] ^ w2_t[3] ^ w1_t[1] ^ w0_t[3]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w0_t[3]); + w1_t[0] = rotl32 ((w0_t[1] ^ w3_t[0] ^ w1_t[2] ^ w1_t[0]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1_t[0]); + w1_t[1] = rotl32 ((w0_t[2] ^ w3_t[1] ^ w1_t[3] ^ w1_t[1]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w1_t[1]); + w1_t[2] = rotl32 ((w0_t[3] ^ w3_t[2] ^ w2_t[0] ^ w1_t[2]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w1_t[2]); + w1_t[3] = rotl32 ((w1_t[0] ^ w3_t[3] ^ w2_t[1] ^ w1_t[3]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w1_t[3]); + w2_t[0] = rotl32 ((w1_t[1] ^ w0_t[0] ^ w2_t[2] ^ w2_t[0]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w2_t[0]); + w2_t[1] = rotl32 ((w1_t[2] ^ w0_t[1] ^ w2_t[3] ^ w2_t[1]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w2_t[1]); + w2_t[2] = rotl32 ((w1_t[3] ^ w0_t[2] ^ w3_t[0] ^ w2_t[2]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w2_t[2]); + w2_t[3] = rotl32 ((w2_t[0] ^ w0_t[3] ^ w3_t[1] ^ w2_t[3]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w2_t[3]); + w3_t[0] = rotl32 ((w2_t[1] ^ w1_t[0] ^ w3_t[2] ^ w3_t[0]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w3_t[0]); + w3_t[1] = rotl32 ((w2_t[2] ^ w1_t[1] ^ w3_t[3] ^ w3_t[1]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w3_t[1]); + w3_t[2] = rotl32 ((w2_t[3] ^ w1_t[2] ^ w0_t[0] ^ w3_t[2]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w3_t[2]); + w3_t[3] = rotl32 ((w3_t[0] ^ w1_t[3] ^ w0_t[1] ^ w3_t[3]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w3_t[3]); + + + const u32x r0 = d; + const u32x r1 = e; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_M + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m00130_m08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m00130_m16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m00130_s04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + u32x pw_buf1[4]; + + pw_buf1[0] = pws[gid].i[ 4]; + pw_buf1[1] = pws[gid].i[ 5]; + pw_buf1[2] = pws[gid].i[ 6]; + pw_buf1[3] = pws[gid].i[ 7]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[7]; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * reverse + */ + + const u32 e_rev = rotl32 (search[1], 2u); + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + + w0[0] = pw_buf0[0]; + w0[1] = pw_buf0[1]; + w0[2] = pw_buf0[2]; + w0[3] = pw_buf0[3]; + + u32x w1[4]; + + w1[0] = pw_buf1[0]; + w1[1] = pw_buf1[1]; + w1[2] = pw_buf1[2]; + w1[3] = pw_buf1[3]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 out_len = apply_rules (c_rules[il_pos].cmds, w0, w1, pw_len); + + /** + * append salt + */ + + u32 s0[4]; + + s0[0] = salt_buf0[0]; + s0[1] = salt_buf0[1]; + s0[2] = salt_buf0[2]; + s0[3] = salt_buf0[3]; + + u32 s1[4]; + + s1[0] = salt_buf1[0]; + s1[1] = salt_buf1[1]; + s1[2] = salt_buf1[2]; + s1[3] = salt_buf1[3]; + + u32 s2[4]; + + s2[0] = 0; + s2[1] = 0; + s2[2] = 0; + s2[3] = 0; + + u32 s3[4]; + + s3[0] = 0; + s3[1] = 0; + s3[2] = 0; + s3[3] = 0; + + switch_buffer_by_offset (s0, s1, s2, s3, (out_len * 2)); + + const u32 out_salt_len = (out_len * 2) + salt_len; + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + make_unicode (w0, w0_t, w1_t); + make_unicode (w1, w2_t, w3_t); + + w0_t[0] |= s0[0]; + w0_t[1] |= s0[1]; + w0_t[2] |= s0[2]; + w0_t[3] |= s0[3]; + w1_t[0] |= s1[0]; + w1_t[1] |= s1[1]; + w1_t[2] |= s1[2]; + w1_t[3] |= s1[3]; + w2_t[0] |= s2[0]; + w2_t[1] |= s2[1]; + w2_t[2] |= s2[2]; + w2_t[3] |= s2[3]; + w3_t[0] |= s3[0]; + w3_t[1] |= s3[1]; + w3_t[2] |= s3[2]; + w3_t[3] |= s3[3]; + + append_0x80_4 (w0_t, w1_t, w2_t, w3_t, out_salt_len); + + w3_t[3] = out_salt_len * 8; + + /** + * sha1 + */ + + w0_t[0] = swap_workaround (w0_t[0]); + w0_t[1] = swap_workaround (w0_t[1]); + w0_t[2] = swap_workaround (w0_t[2]); + w0_t[3] = swap_workaround (w0_t[3]); + w1_t[0] = swap_workaround (w1_t[0]); + w1_t[1] = swap_workaround (w1_t[1]); + w1_t[2] = swap_workaround (w1_t[2]); + w1_t[3] = swap_workaround (w1_t[3]); + w2_t[0] = swap_workaround (w2_t[0]); + w2_t[1] = swap_workaround (w2_t[1]); + w2_t[2] = swap_workaround (w2_t[2]); + w2_t[3] = swap_workaround (w2_t[3]); + w3_t[0] = swap_workaround (w3_t[0]); + w3_t[1] = swap_workaround (w3_t[1]); + //w3_t[2] = swap_workaround (w3_t[2]); + //w3_t[3] = swap_workaround (w3_t[3]); + + u32x a = SHA1M_A; + u32x b = SHA1M_B; + u32x c = SHA1M_C; + u32x d = SHA1M_D; + u32x e = SHA1M_E; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w0_t[0]); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w0_t[1]); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w0_t[2]); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w0_t[3]); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w1_t[0]); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w1_t[1]); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w1_t[2]); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w1_t[3]); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w2_t[0]); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w2_t[1]); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w2_t[2]); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w2_t[3]); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w3_t[0]); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w3_t[1]); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w3_t[2]); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w3_t[3]); + w0_t[0] = rotl32 ((w3_t[1] ^ w2_t[0] ^ w0_t[2] ^ w0_t[0]), 1u); SHA1_STEP (SHA1_F0o, e, a, b, c, d, w0_t[0]); + w0_t[1] = rotl32 ((w3_t[2] ^ w2_t[1] ^ w0_t[3] ^ w0_t[1]), 1u); SHA1_STEP (SHA1_F0o, d, e, a, b, c, w0_t[1]); + w0_t[2] = rotl32 ((w3_t[3] ^ w2_t[2] ^ w1_t[0] ^ w0_t[2]), 1u); SHA1_STEP (SHA1_F0o, c, d, e, a, b, w0_t[2]); + w0_t[3] = rotl32 ((w0_t[0] ^ w2_t[3] ^ w1_t[1] ^ w0_t[3]), 1u); SHA1_STEP (SHA1_F0o, b, c, d, e, a, w0_t[3]); + + #undef K + #define K SHA1C01 + + w1_t[0] = rotl32 ((w0_t[1] ^ w3_t[0] ^ w1_t[2] ^ w1_t[0]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w1_t[0]); + w1_t[1] = rotl32 ((w0_t[2] ^ w3_t[1] ^ w1_t[3] ^ w1_t[1]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w1_t[1]); + w1_t[2] = rotl32 ((w0_t[3] ^ w3_t[2] ^ w2_t[0] ^ w1_t[2]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w1_t[2]); + w1_t[3] = rotl32 ((w1_t[0] ^ w3_t[3] ^ w2_t[1] ^ w1_t[3]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1_t[3]); + w2_t[0] = rotl32 ((w1_t[1] ^ w0_t[0] ^ w2_t[2] ^ w2_t[0]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w2_t[0]); + w2_t[1] = rotl32 ((w1_t[2] ^ w0_t[1] ^ w2_t[3] ^ w2_t[1]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w2_t[1]); + w2_t[2] = rotl32 ((w1_t[3] ^ w0_t[2] ^ w3_t[0] ^ w2_t[2]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w2_t[2]); + w2_t[3] = rotl32 ((w2_t[0] ^ w0_t[3] ^ w3_t[1] ^ w2_t[3]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w2_t[3]); + w3_t[0] = rotl32 ((w2_t[1] ^ w1_t[0] ^ w3_t[2] ^ w3_t[0]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w3_t[0]); + w3_t[1] = rotl32 ((w2_t[2] ^ w1_t[1] ^ w3_t[3] ^ w3_t[1]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w3_t[1]); + w3_t[2] = rotl32 ((w2_t[3] ^ w1_t[2] ^ w0_t[0] ^ w3_t[2]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w3_t[2]); + w3_t[3] = rotl32 ((w3_t[0] ^ w1_t[3] ^ w0_t[1] ^ w3_t[3]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w3_t[3]); + w0_t[0] = rotl32 ((w3_t[1] ^ w2_t[0] ^ w0_t[2] ^ w0_t[0]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w0_t[0]); + w0_t[1] = rotl32 ((w3_t[2] ^ w2_t[1] ^ w0_t[3] ^ w0_t[1]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w0_t[1]); + w0_t[2] = rotl32 ((w3_t[3] ^ w2_t[2] ^ w1_t[0] ^ w0_t[2]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w0_t[2]); + w0_t[3] = rotl32 ((w0_t[0] ^ w2_t[3] ^ w1_t[1] ^ w0_t[3]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w0_t[3]); + w1_t[0] = rotl32 ((w0_t[1] ^ w3_t[0] ^ w1_t[2] ^ w1_t[0]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w1_t[0]); + w1_t[1] = rotl32 ((w0_t[2] ^ w3_t[1] ^ w1_t[3] ^ w1_t[1]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w1_t[1]); + w1_t[2] = rotl32 ((w0_t[3] ^ w3_t[2] ^ w2_t[0] ^ w1_t[2]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1_t[2]); + w1_t[3] = rotl32 ((w1_t[0] ^ w3_t[3] ^ w2_t[1] ^ w1_t[3]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w1_t[3]); + + #undef K + #define K SHA1C02 + + w2_t[0] = rotl32 ((w1_t[1] ^ w0_t[0] ^ w2_t[2] ^ w2_t[0]), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w2_t[0]); + w2_t[1] = rotl32 ((w1_t[2] ^ w0_t[1] ^ w2_t[3] ^ w2_t[1]), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w2_t[1]); + w2_t[2] = rotl32 ((w1_t[3] ^ w0_t[2] ^ w3_t[0] ^ w2_t[2]), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w2_t[2]); + w2_t[3] = rotl32 ((w2_t[0] ^ w0_t[3] ^ w3_t[1] ^ w2_t[3]), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w2_t[3]); + w3_t[0] = rotl32 ((w2_t[1] ^ w1_t[0] ^ w3_t[2] ^ w3_t[0]), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w3_t[0]); + w3_t[1] = rotl32 ((w2_t[2] ^ w1_t[1] ^ w3_t[3] ^ w3_t[1]), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w3_t[1]); + w3_t[2] = rotl32 ((w2_t[3] ^ w1_t[2] ^ w0_t[0] ^ w3_t[2]), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w3_t[2]); + w3_t[3] = rotl32 ((w3_t[0] ^ w1_t[3] ^ w0_t[1] ^ w3_t[3]), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w3_t[3]); + w0_t[0] = rotl32 ((w3_t[1] ^ w2_t[0] ^ w0_t[2] ^ w0_t[0]), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w0_t[0]); + w0_t[1] = rotl32 ((w3_t[2] ^ w2_t[1] ^ w0_t[3] ^ w0_t[1]), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w0_t[1]); + w0_t[2] = rotl32 ((w3_t[3] ^ w2_t[2] ^ w1_t[0] ^ w0_t[2]), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w0_t[2]); + w0_t[3] = rotl32 ((w0_t[0] ^ w2_t[3] ^ w1_t[1] ^ w0_t[3]), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w0_t[3]); + w1_t[0] = rotl32 ((w0_t[1] ^ w3_t[0] ^ w1_t[2] ^ w1_t[0]), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w1_t[0]); + w1_t[1] = rotl32 ((w0_t[2] ^ w3_t[1] ^ w1_t[3] ^ w1_t[1]), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w1_t[1]); + w1_t[2] = rotl32 ((w0_t[3] ^ w3_t[2] ^ w2_t[0] ^ w1_t[2]), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w1_t[2]); + w1_t[3] = rotl32 ((w1_t[0] ^ w3_t[3] ^ w2_t[1] ^ w1_t[3]), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w1_t[3]); + w2_t[0] = rotl32 ((w1_t[1] ^ w0_t[0] ^ w2_t[2] ^ w2_t[0]), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w2_t[0]); + w2_t[1] = rotl32 ((w1_t[2] ^ w0_t[1] ^ w2_t[3] ^ w2_t[1]), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w2_t[1]); + w2_t[2] = rotl32 ((w1_t[3] ^ w0_t[2] ^ w3_t[0] ^ w2_t[2]), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w2_t[2]); + w2_t[3] = rotl32 ((w2_t[0] ^ w0_t[3] ^ w3_t[1] ^ w2_t[3]), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w2_t[3]); + + #undef K + #define K SHA1C03 + + w3_t[0] = rotl32 ((w2_t[1] ^ w1_t[0] ^ w3_t[2] ^ w3_t[0]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w3_t[0]); + w3_t[1] = rotl32 ((w2_t[2] ^ w1_t[1] ^ w3_t[3] ^ w3_t[1]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w3_t[1]); + w3_t[2] = rotl32 ((w2_t[3] ^ w1_t[2] ^ w0_t[0] ^ w3_t[2]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w3_t[2]); + w3_t[3] = rotl32 ((w3_t[0] ^ w1_t[3] ^ w0_t[1] ^ w3_t[3]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w3_t[3]); + w0_t[0] = rotl32 ((w3_t[1] ^ w2_t[0] ^ w0_t[2] ^ w0_t[0]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w0_t[0]); + w0_t[1] = rotl32 ((w3_t[2] ^ w2_t[1] ^ w0_t[3] ^ w0_t[1]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w0_t[1]); + w0_t[2] = rotl32 ((w3_t[3] ^ w2_t[2] ^ w1_t[0] ^ w0_t[2]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w0_t[2]); + w0_t[3] = rotl32 ((w0_t[0] ^ w2_t[3] ^ w1_t[1] ^ w0_t[3]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w0_t[3]); + w1_t[0] = rotl32 ((w0_t[1] ^ w3_t[0] ^ w1_t[2] ^ w1_t[0]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1_t[0]); + w1_t[1] = rotl32 ((w0_t[2] ^ w3_t[1] ^ w1_t[3] ^ w1_t[1]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w1_t[1]); + w1_t[2] = rotl32 ((w0_t[3] ^ w3_t[2] ^ w2_t[0] ^ w1_t[2]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w1_t[2]); + w1_t[3] = rotl32 ((w1_t[0] ^ w3_t[3] ^ w2_t[1] ^ w1_t[3]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w1_t[3]); + w2_t[0] = rotl32 ((w1_t[1] ^ w0_t[0] ^ w2_t[2] ^ w2_t[0]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w2_t[0]); + w2_t[1] = rotl32 ((w1_t[2] ^ w0_t[1] ^ w2_t[3] ^ w2_t[1]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w2_t[1]); + w2_t[2] = rotl32 ((w1_t[3] ^ w0_t[2] ^ w3_t[0] ^ w2_t[2]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w2_t[2]); + w2_t[3] = rotl32 ((w2_t[0] ^ w0_t[3] ^ w3_t[1] ^ w2_t[3]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w2_t[3]); + + if (e != e_rev) continue; + + w3_t[0] = rotl32 ((w2_t[1] ^ w1_t[0] ^ w3_t[2] ^ w3_t[0]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w3_t[0]); + w3_t[1] = rotl32 ((w2_t[2] ^ w1_t[1] ^ w3_t[3] ^ w3_t[1]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w3_t[1]); + w3_t[2] = rotl32 ((w2_t[3] ^ w1_t[2] ^ w0_t[0] ^ w3_t[2]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w3_t[2]); + w3_t[3] = rotl32 ((w3_t[0] ^ w1_t[3] ^ w0_t[1] ^ w3_t[3]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w3_t[3]); + + + const u32x r0 = d; + const u32x r1 = e; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_S + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m00130_s08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m00130_s16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/nv/m00130_a1.cu b/nv/m00130_a1.cu new file mode 100644 index 0000000000..22ceaa1e0e --- /dev/null +++ b/nv/m00130_a1.cu @@ -0,0 +1,748 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _SHA1_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW2 +#define VECT_SIZE4 +#endif + +#define DGST_R0 3 +#define DGST_R1 4 +#define DGST_R2 2 +#define DGST_R3 1 + +#include "include/kernel_functions.c" +#include "types_nv.c" +#include "common_nv.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +__device__ __constant__ comb_t c_combs[1024]; + +extern "C" __global__ void __launch_bounds__ (256, 1) m00130_m04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, c_combs[0].pw_len); + } + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[7]; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = c_combs[il_pos].pw_len; + + const u32 pw_len = pw_l_len + pw_r_len; + + u32 wordr0[4]; + + wordr0[0] = c_combs[il_pos].i[0]; + wordr0[1] = c_combs[il_pos].i[1]; + wordr0[2] = c_combs[il_pos].i[2]; + wordr0[3] = c_combs[il_pos].i[3]; + + u32 wordr1[4]; + + wordr1[0] = c_combs[il_pos].i[4]; + wordr1[1] = c_combs[il_pos].i[5]; + wordr1[2] = c_combs[il_pos].i[6]; + wordr1[3] = c_combs[il_pos].i[7]; + + u32 wordr2[4]; + + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + + u32 wordr3[4]; + + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + /** + * append salt + */ + + u32 s0[4]; + + s0[0] = salt_buf0[0]; + s0[1] = salt_buf0[1]; + s0[2] = salt_buf0[2]; + s0[3] = salt_buf0[3]; + + u32 s1[4]; + + s1[0] = salt_buf1[0]; + s1[1] = salt_buf1[1]; + s1[2] = salt_buf1[2]; + s1[3] = salt_buf1[3]; + + u32 s2[4]; + + s2[0] = 0; + s2[1] = 0; + s2[2] = 0; + s2[3] = 0; + + u32 s3[4]; + + s3[0] = 0; + s3[1] = 0; + s3[2] = 0; + s3[3] = 0; + + switch_buffer_by_offset (s0, s1, s2, s3, (pw_len * 2)); + + const u32 pw_salt_len = (pw_len * 2) + salt_len; + + u32x w0[4]; + u32x w1[4]; + u32x w2[4]; + u32x w3[4]; + + w0[0] = wordl0[0] | wordr0[0]; + w0[1] = wordl0[1] | wordr0[1]; + w0[2] = wordl0[2] | wordr0[2]; + w0[3] = wordl0[3] | wordr0[3]; + w1[0] = wordl1[0] | wordr1[0]; + w1[1] = wordl1[1] | wordr1[1]; + w1[2] = wordl1[2] | wordr1[2]; + w1[3] = wordl1[3] | wordr1[3]; + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + make_unicode (w0, w0_t, w1_t); + make_unicode (w1, w2_t, w3_t); + + w0_t[0] |= s0[0]; + w0_t[1] |= s0[1]; + w0_t[2] |= s0[2]; + w0_t[3] |= s0[3]; + w1_t[0] |= s1[0]; + w1_t[1] |= s1[1]; + w1_t[2] |= s1[2]; + w1_t[3] |= s1[3]; + w2_t[0] |= s2[0]; + w2_t[1] |= s2[1]; + w2_t[2] |= s2[2]; + w2_t[3] |= s2[3]; + w3_t[0] |= s3[0]; + w3_t[1] |= s3[1]; + w3_t[2] |= s3[2]; + w3_t[3] |= s3[3]; + + append_0x80_4 (w0_t, w1_t, w2_t, w3_t, pw_salt_len); + + w3_t[3] = pw_salt_len * 8; + + /** + * sha1 + */ + + w0_t[0] = swap_workaround (w0_t[0]); + w0_t[1] = swap_workaround (w0_t[1]); + w0_t[2] = swap_workaround (w0_t[2]); + w0_t[3] = swap_workaround (w0_t[3]); + w1_t[0] = swap_workaround (w1_t[0]); + w1_t[1] = swap_workaround (w1_t[1]); + w1_t[2] = swap_workaround (w1_t[2]); + w1_t[3] = swap_workaround (w1_t[3]); + w2_t[0] = swap_workaround (w2_t[0]); + w2_t[1] = swap_workaround (w2_t[1]); + w2_t[2] = swap_workaround (w2_t[2]); + w2_t[3] = swap_workaround (w2_t[3]); + w3_t[0] = swap_workaround (w3_t[0]); + w3_t[1] = swap_workaround (w3_t[1]); + //w3_t[2] = swap_workaround (w3_t[2]); + //w3_t[3] = swap_workaround (w3_t[3]); + + u32x a = SHA1M_A; + u32x b = SHA1M_B; + u32x c = SHA1M_C; + u32x d = SHA1M_D; + u32x e = SHA1M_E; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w0_t[0]); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w0_t[1]); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w0_t[2]); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w0_t[3]); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w1_t[0]); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w1_t[1]); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w1_t[2]); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w1_t[3]); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w2_t[0]); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w2_t[1]); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w2_t[2]); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w2_t[3]); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w3_t[0]); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w3_t[1]); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w3_t[2]); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w3_t[3]); + w0_t[0] = rotl32 ((w3_t[1] ^ w2_t[0] ^ w0_t[2] ^ w0_t[0]), 1u); SHA1_STEP (SHA1_F0o, e, a, b, c, d, w0_t[0]); + w0_t[1] = rotl32 ((w3_t[2] ^ w2_t[1] ^ w0_t[3] ^ w0_t[1]), 1u); SHA1_STEP (SHA1_F0o, d, e, a, b, c, w0_t[1]); + w0_t[2] = rotl32 ((w3_t[3] ^ w2_t[2] ^ w1_t[0] ^ w0_t[2]), 1u); SHA1_STEP (SHA1_F0o, c, d, e, a, b, w0_t[2]); + w0_t[3] = rotl32 ((w0_t[0] ^ w2_t[3] ^ w1_t[1] ^ w0_t[3]), 1u); SHA1_STEP (SHA1_F0o, b, c, d, e, a, w0_t[3]); + + #undef K + #define K SHA1C01 + + w1_t[0] = rotl32 ((w0_t[1] ^ w3_t[0] ^ w1_t[2] ^ w1_t[0]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w1_t[0]); + w1_t[1] = rotl32 ((w0_t[2] ^ w3_t[1] ^ w1_t[3] ^ w1_t[1]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w1_t[1]); + w1_t[2] = rotl32 ((w0_t[3] ^ w3_t[2] ^ w2_t[0] ^ w1_t[2]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w1_t[2]); + w1_t[3] = rotl32 ((w1_t[0] ^ w3_t[3] ^ w2_t[1] ^ w1_t[3]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1_t[3]); + w2_t[0] = rotl32 ((w1_t[1] ^ w0_t[0] ^ w2_t[2] ^ w2_t[0]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w2_t[0]); + w2_t[1] = rotl32 ((w1_t[2] ^ w0_t[1] ^ w2_t[3] ^ w2_t[1]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w2_t[1]); + w2_t[2] = rotl32 ((w1_t[3] ^ w0_t[2] ^ w3_t[0] ^ w2_t[2]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w2_t[2]); + w2_t[3] = rotl32 ((w2_t[0] ^ w0_t[3] ^ w3_t[1] ^ w2_t[3]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w2_t[3]); + w3_t[0] = rotl32 ((w2_t[1] ^ w1_t[0] ^ w3_t[2] ^ w3_t[0]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w3_t[0]); + w3_t[1] = rotl32 ((w2_t[2] ^ w1_t[1] ^ w3_t[3] ^ w3_t[1]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w3_t[1]); + w3_t[2] = rotl32 ((w2_t[3] ^ w1_t[2] ^ w0_t[0] ^ w3_t[2]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w3_t[2]); + w3_t[3] = rotl32 ((w3_t[0] ^ w1_t[3] ^ w0_t[1] ^ w3_t[3]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w3_t[3]); + w0_t[0] = rotl32 ((w3_t[1] ^ w2_t[0] ^ w0_t[2] ^ w0_t[0]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w0_t[0]); + w0_t[1] = rotl32 ((w3_t[2] ^ w2_t[1] ^ w0_t[3] ^ w0_t[1]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w0_t[1]); + w0_t[2] = rotl32 ((w3_t[3] ^ w2_t[2] ^ w1_t[0] ^ w0_t[2]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w0_t[2]); + w0_t[3] = rotl32 ((w0_t[0] ^ w2_t[3] ^ w1_t[1] ^ w0_t[3]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w0_t[3]); + w1_t[0] = rotl32 ((w0_t[1] ^ w3_t[0] ^ w1_t[2] ^ w1_t[0]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w1_t[0]); + w1_t[1] = rotl32 ((w0_t[2] ^ w3_t[1] ^ w1_t[3] ^ w1_t[1]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w1_t[1]); + w1_t[2] = rotl32 ((w0_t[3] ^ w3_t[2] ^ w2_t[0] ^ w1_t[2]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1_t[2]); + w1_t[3] = rotl32 ((w1_t[0] ^ w3_t[3] ^ w2_t[1] ^ w1_t[3]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w1_t[3]); + + #undef K + #define K SHA1C02 + + w2_t[0] = rotl32 ((w1_t[1] ^ w0_t[0] ^ w2_t[2] ^ w2_t[0]), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w2_t[0]); + w2_t[1] = rotl32 ((w1_t[2] ^ w0_t[1] ^ w2_t[3] ^ w2_t[1]), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w2_t[1]); + w2_t[2] = rotl32 ((w1_t[3] ^ w0_t[2] ^ w3_t[0] ^ w2_t[2]), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w2_t[2]); + w2_t[3] = rotl32 ((w2_t[0] ^ w0_t[3] ^ w3_t[1] ^ w2_t[3]), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w2_t[3]); + w3_t[0] = rotl32 ((w2_t[1] ^ w1_t[0] ^ w3_t[2] ^ w3_t[0]), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w3_t[0]); + w3_t[1] = rotl32 ((w2_t[2] ^ w1_t[1] ^ w3_t[3] ^ w3_t[1]), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w3_t[1]); + w3_t[2] = rotl32 ((w2_t[3] ^ w1_t[2] ^ w0_t[0] ^ w3_t[2]), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w3_t[2]); + w3_t[3] = rotl32 ((w3_t[0] ^ w1_t[3] ^ w0_t[1] ^ w3_t[3]), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w3_t[3]); + w0_t[0] = rotl32 ((w3_t[1] ^ w2_t[0] ^ w0_t[2] ^ w0_t[0]), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w0_t[0]); + w0_t[1] = rotl32 ((w3_t[2] ^ w2_t[1] ^ w0_t[3] ^ w0_t[1]), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w0_t[1]); + w0_t[2] = rotl32 ((w3_t[3] ^ w2_t[2] ^ w1_t[0] ^ w0_t[2]), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w0_t[2]); + w0_t[3] = rotl32 ((w0_t[0] ^ w2_t[3] ^ w1_t[1] ^ w0_t[3]), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w0_t[3]); + w1_t[0] = rotl32 ((w0_t[1] ^ w3_t[0] ^ w1_t[2] ^ w1_t[0]), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w1_t[0]); + w1_t[1] = rotl32 ((w0_t[2] ^ w3_t[1] ^ w1_t[3] ^ w1_t[1]), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w1_t[1]); + w1_t[2] = rotl32 ((w0_t[3] ^ w3_t[2] ^ w2_t[0] ^ w1_t[2]), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w1_t[2]); + w1_t[3] = rotl32 ((w1_t[0] ^ w3_t[3] ^ w2_t[1] ^ w1_t[3]), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w1_t[3]); + w2_t[0] = rotl32 ((w1_t[1] ^ w0_t[0] ^ w2_t[2] ^ w2_t[0]), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w2_t[0]); + w2_t[1] = rotl32 ((w1_t[2] ^ w0_t[1] ^ w2_t[3] ^ w2_t[1]), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w2_t[1]); + w2_t[2] = rotl32 ((w1_t[3] ^ w0_t[2] ^ w3_t[0] ^ w2_t[2]), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w2_t[2]); + w2_t[3] = rotl32 ((w2_t[0] ^ w0_t[3] ^ w3_t[1] ^ w2_t[3]), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w2_t[3]); + + #undef K + #define K SHA1C03 + + w3_t[0] = rotl32 ((w2_t[1] ^ w1_t[0] ^ w3_t[2] ^ w3_t[0]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w3_t[0]); + w3_t[1] = rotl32 ((w2_t[2] ^ w1_t[1] ^ w3_t[3] ^ w3_t[1]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w3_t[1]); + w3_t[2] = rotl32 ((w2_t[3] ^ w1_t[2] ^ w0_t[0] ^ w3_t[2]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w3_t[2]); + w3_t[3] = rotl32 ((w3_t[0] ^ w1_t[3] ^ w0_t[1] ^ w3_t[3]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w3_t[3]); + w0_t[0] = rotl32 ((w3_t[1] ^ w2_t[0] ^ w0_t[2] ^ w0_t[0]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w0_t[0]); + w0_t[1] = rotl32 ((w3_t[2] ^ w2_t[1] ^ w0_t[3] ^ w0_t[1]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w0_t[1]); + w0_t[2] = rotl32 ((w3_t[3] ^ w2_t[2] ^ w1_t[0] ^ w0_t[2]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w0_t[2]); + w0_t[3] = rotl32 ((w0_t[0] ^ w2_t[3] ^ w1_t[1] ^ w0_t[3]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w0_t[3]); + w1_t[0] = rotl32 ((w0_t[1] ^ w3_t[0] ^ w1_t[2] ^ w1_t[0]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1_t[0]); + w1_t[1] = rotl32 ((w0_t[2] ^ w3_t[1] ^ w1_t[3] ^ w1_t[1]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w1_t[1]); + w1_t[2] = rotl32 ((w0_t[3] ^ w3_t[2] ^ w2_t[0] ^ w1_t[2]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w1_t[2]); + w1_t[3] = rotl32 ((w1_t[0] ^ w3_t[3] ^ w2_t[1] ^ w1_t[3]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w1_t[3]); + w2_t[0] = rotl32 ((w1_t[1] ^ w0_t[0] ^ w2_t[2] ^ w2_t[0]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w2_t[0]); + w2_t[1] = rotl32 ((w1_t[2] ^ w0_t[1] ^ w2_t[3] ^ w2_t[1]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w2_t[1]); + w2_t[2] = rotl32 ((w1_t[3] ^ w0_t[2] ^ w3_t[0] ^ w2_t[2]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w2_t[2]); + w2_t[3] = rotl32 ((w2_t[0] ^ w0_t[3] ^ w3_t[1] ^ w2_t[3]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w2_t[3]); + w3_t[0] = rotl32 ((w2_t[1] ^ w1_t[0] ^ w3_t[2] ^ w3_t[0]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w3_t[0]); + w3_t[1] = rotl32 ((w2_t[2] ^ w1_t[1] ^ w3_t[3] ^ w3_t[1]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w3_t[1]); + w3_t[2] = rotl32 ((w2_t[3] ^ w1_t[2] ^ w0_t[0] ^ w3_t[2]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w3_t[2]); + w3_t[3] = rotl32 ((w3_t[0] ^ w1_t[3] ^ w0_t[1] ^ w3_t[3]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w3_t[3]); + + + const u32x r0 = d; + const u32x r1 = e; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_M + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m00130_m08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m00130_m16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m00130_s04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, c_combs[0].pw_len); + } + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[7]; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * reverse + */ + + const u32 e_rev = rotl32 (search[1], 2u); + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = c_combs[il_pos].pw_len; + + const u32 pw_len = pw_l_len + pw_r_len; + + u32 wordr0[4]; + + wordr0[0] = c_combs[il_pos].i[0]; + wordr0[1] = c_combs[il_pos].i[1]; + wordr0[2] = c_combs[il_pos].i[2]; + wordr0[3] = c_combs[il_pos].i[3]; + + u32 wordr1[4]; + + wordr1[0] = c_combs[il_pos].i[4]; + wordr1[1] = c_combs[il_pos].i[5]; + wordr1[2] = c_combs[il_pos].i[6]; + wordr1[3] = c_combs[il_pos].i[7]; + + u32 wordr2[4]; + + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + + u32 wordr3[4]; + + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + /** + * append salt + */ + + u32 s0[4]; + + s0[0] = salt_buf0[0]; + s0[1] = salt_buf0[1]; + s0[2] = salt_buf0[2]; + s0[3] = salt_buf0[3]; + + u32 s1[4]; + + s1[0] = salt_buf1[0]; + s1[1] = salt_buf1[1]; + s1[2] = salt_buf1[2]; + s1[3] = salt_buf1[3]; + + u32 s2[4]; + + s2[0] = 0; + s2[1] = 0; + s2[2] = 0; + s2[3] = 0; + + u32 s3[4]; + + s3[0] = 0; + s3[1] = 0; + s3[2] = 0; + s3[3] = 0; + + switch_buffer_by_offset (s0, s1, s2, s3, (pw_len * 2)); + + const u32 pw_salt_len = (pw_len * 2) + salt_len; + + u32x w0[4]; + u32x w1[4]; + u32x w2[4]; + u32x w3[4]; + + w0[0] = wordl0[0] | wordr0[0]; + w0[1] = wordl0[1] | wordr0[1]; + w0[2] = wordl0[2] | wordr0[2]; + w0[3] = wordl0[3] | wordr0[3]; + w1[0] = wordl1[0] | wordr1[0]; + w1[1] = wordl1[1] | wordr1[1]; + w1[2] = wordl1[2] | wordr1[2]; + w1[3] = wordl1[3] | wordr1[3]; + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + make_unicode (w0, w0_t, w1_t); + make_unicode (w1, w2_t, w3_t); + + w0_t[0] |= s0[0]; + w0_t[1] |= s0[1]; + w0_t[2] |= s0[2]; + w0_t[3] |= s0[3]; + w1_t[0] |= s1[0]; + w1_t[1] |= s1[1]; + w1_t[2] |= s1[2]; + w1_t[3] |= s1[3]; + w2_t[0] |= s2[0]; + w2_t[1] |= s2[1]; + w2_t[2] |= s2[2]; + w2_t[3] |= s2[3]; + w3_t[0] |= s3[0]; + w3_t[1] |= s3[1]; + w3_t[2] |= s3[2]; + w3_t[3] |= s3[3]; + + append_0x80_4 (w0_t, w1_t, w2_t, w3_t, pw_salt_len); + + w3_t[3] = pw_salt_len * 8; + + /** + * sha1 + */ + + w0_t[0] = swap_workaround (w0_t[0]); + w0_t[1] = swap_workaround (w0_t[1]); + w0_t[2] = swap_workaround (w0_t[2]); + w0_t[3] = swap_workaround (w0_t[3]); + w1_t[0] = swap_workaround (w1_t[0]); + w1_t[1] = swap_workaround (w1_t[1]); + w1_t[2] = swap_workaround (w1_t[2]); + w1_t[3] = swap_workaround (w1_t[3]); + w2_t[0] = swap_workaround (w2_t[0]); + w2_t[1] = swap_workaround (w2_t[1]); + w2_t[2] = swap_workaround (w2_t[2]); + w2_t[3] = swap_workaround (w2_t[3]); + w3_t[0] = swap_workaround (w3_t[0]); + w3_t[1] = swap_workaround (w3_t[1]); + //w3_t[2] = swap_workaround (w3_t[2]); + //w3_t[3] = swap_workaround (w3_t[3]); + + u32x a = SHA1M_A; + u32x b = SHA1M_B; + u32x c = SHA1M_C; + u32x d = SHA1M_D; + u32x e = SHA1M_E; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w0_t[0]); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w0_t[1]); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w0_t[2]); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w0_t[3]); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w1_t[0]); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w1_t[1]); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w1_t[2]); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w1_t[3]); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w2_t[0]); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w2_t[1]); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w2_t[2]); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w2_t[3]); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w3_t[0]); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w3_t[1]); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w3_t[2]); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w3_t[3]); + w0_t[0] = rotl32 ((w3_t[1] ^ w2_t[0] ^ w0_t[2] ^ w0_t[0]), 1u); SHA1_STEP (SHA1_F0o, e, a, b, c, d, w0_t[0]); + w0_t[1] = rotl32 ((w3_t[2] ^ w2_t[1] ^ w0_t[3] ^ w0_t[1]), 1u); SHA1_STEP (SHA1_F0o, d, e, a, b, c, w0_t[1]); + w0_t[2] = rotl32 ((w3_t[3] ^ w2_t[2] ^ w1_t[0] ^ w0_t[2]), 1u); SHA1_STEP (SHA1_F0o, c, d, e, a, b, w0_t[2]); + w0_t[3] = rotl32 ((w0_t[0] ^ w2_t[3] ^ w1_t[1] ^ w0_t[3]), 1u); SHA1_STEP (SHA1_F0o, b, c, d, e, a, w0_t[3]); + + #undef K + #define K SHA1C01 + + w1_t[0] = rotl32 ((w0_t[1] ^ w3_t[0] ^ w1_t[2] ^ w1_t[0]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w1_t[0]); + w1_t[1] = rotl32 ((w0_t[2] ^ w3_t[1] ^ w1_t[3] ^ w1_t[1]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w1_t[1]); + w1_t[2] = rotl32 ((w0_t[3] ^ w3_t[2] ^ w2_t[0] ^ w1_t[2]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w1_t[2]); + w1_t[3] = rotl32 ((w1_t[0] ^ w3_t[3] ^ w2_t[1] ^ w1_t[3]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1_t[3]); + w2_t[0] = rotl32 ((w1_t[1] ^ w0_t[0] ^ w2_t[2] ^ w2_t[0]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w2_t[0]); + w2_t[1] = rotl32 ((w1_t[2] ^ w0_t[1] ^ w2_t[3] ^ w2_t[1]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w2_t[1]); + w2_t[2] = rotl32 ((w1_t[3] ^ w0_t[2] ^ w3_t[0] ^ w2_t[2]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w2_t[2]); + w2_t[3] = rotl32 ((w2_t[0] ^ w0_t[3] ^ w3_t[1] ^ w2_t[3]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w2_t[3]); + w3_t[0] = rotl32 ((w2_t[1] ^ w1_t[0] ^ w3_t[2] ^ w3_t[0]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w3_t[0]); + w3_t[1] = rotl32 ((w2_t[2] ^ w1_t[1] ^ w3_t[3] ^ w3_t[1]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w3_t[1]); + w3_t[2] = rotl32 ((w2_t[3] ^ w1_t[2] ^ w0_t[0] ^ w3_t[2]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w3_t[2]); + w3_t[3] = rotl32 ((w3_t[0] ^ w1_t[3] ^ w0_t[1] ^ w3_t[3]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w3_t[3]); + w0_t[0] = rotl32 ((w3_t[1] ^ w2_t[0] ^ w0_t[2] ^ w0_t[0]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w0_t[0]); + w0_t[1] = rotl32 ((w3_t[2] ^ w2_t[1] ^ w0_t[3] ^ w0_t[1]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w0_t[1]); + w0_t[2] = rotl32 ((w3_t[3] ^ w2_t[2] ^ w1_t[0] ^ w0_t[2]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w0_t[2]); + w0_t[3] = rotl32 ((w0_t[0] ^ w2_t[3] ^ w1_t[1] ^ w0_t[3]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w0_t[3]); + w1_t[0] = rotl32 ((w0_t[1] ^ w3_t[0] ^ w1_t[2] ^ w1_t[0]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w1_t[0]); + w1_t[1] = rotl32 ((w0_t[2] ^ w3_t[1] ^ w1_t[3] ^ w1_t[1]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w1_t[1]); + w1_t[2] = rotl32 ((w0_t[3] ^ w3_t[2] ^ w2_t[0] ^ w1_t[2]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1_t[2]); + w1_t[3] = rotl32 ((w1_t[0] ^ w3_t[3] ^ w2_t[1] ^ w1_t[3]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w1_t[3]); + + #undef K + #define K SHA1C02 + + w2_t[0] = rotl32 ((w1_t[1] ^ w0_t[0] ^ w2_t[2] ^ w2_t[0]), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w2_t[0]); + w2_t[1] = rotl32 ((w1_t[2] ^ w0_t[1] ^ w2_t[3] ^ w2_t[1]), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w2_t[1]); + w2_t[2] = rotl32 ((w1_t[3] ^ w0_t[2] ^ w3_t[0] ^ w2_t[2]), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w2_t[2]); + w2_t[3] = rotl32 ((w2_t[0] ^ w0_t[3] ^ w3_t[1] ^ w2_t[3]), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w2_t[3]); + w3_t[0] = rotl32 ((w2_t[1] ^ w1_t[0] ^ w3_t[2] ^ w3_t[0]), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w3_t[0]); + w3_t[1] = rotl32 ((w2_t[2] ^ w1_t[1] ^ w3_t[3] ^ w3_t[1]), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w3_t[1]); + w3_t[2] = rotl32 ((w2_t[3] ^ w1_t[2] ^ w0_t[0] ^ w3_t[2]), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w3_t[2]); + w3_t[3] = rotl32 ((w3_t[0] ^ w1_t[3] ^ w0_t[1] ^ w3_t[3]), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w3_t[3]); + w0_t[0] = rotl32 ((w3_t[1] ^ w2_t[0] ^ w0_t[2] ^ w0_t[0]), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w0_t[0]); + w0_t[1] = rotl32 ((w3_t[2] ^ w2_t[1] ^ w0_t[3] ^ w0_t[1]), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w0_t[1]); + w0_t[2] = rotl32 ((w3_t[3] ^ w2_t[2] ^ w1_t[0] ^ w0_t[2]), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w0_t[2]); + w0_t[3] = rotl32 ((w0_t[0] ^ w2_t[3] ^ w1_t[1] ^ w0_t[3]), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w0_t[3]); + w1_t[0] = rotl32 ((w0_t[1] ^ w3_t[0] ^ w1_t[2] ^ w1_t[0]), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w1_t[0]); + w1_t[1] = rotl32 ((w0_t[2] ^ w3_t[1] ^ w1_t[3] ^ w1_t[1]), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w1_t[1]); + w1_t[2] = rotl32 ((w0_t[3] ^ w3_t[2] ^ w2_t[0] ^ w1_t[2]), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w1_t[2]); + w1_t[3] = rotl32 ((w1_t[0] ^ w3_t[3] ^ w2_t[1] ^ w1_t[3]), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w1_t[3]); + w2_t[0] = rotl32 ((w1_t[1] ^ w0_t[0] ^ w2_t[2] ^ w2_t[0]), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w2_t[0]); + w2_t[1] = rotl32 ((w1_t[2] ^ w0_t[1] ^ w2_t[3] ^ w2_t[1]), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w2_t[1]); + w2_t[2] = rotl32 ((w1_t[3] ^ w0_t[2] ^ w3_t[0] ^ w2_t[2]), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w2_t[2]); + w2_t[3] = rotl32 ((w2_t[0] ^ w0_t[3] ^ w3_t[1] ^ w2_t[3]), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w2_t[3]); + + #undef K + #define K SHA1C03 + + w3_t[0] = rotl32 ((w2_t[1] ^ w1_t[0] ^ w3_t[2] ^ w3_t[0]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w3_t[0]); + w3_t[1] = rotl32 ((w2_t[2] ^ w1_t[1] ^ w3_t[3] ^ w3_t[1]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w3_t[1]); + w3_t[2] = rotl32 ((w2_t[3] ^ w1_t[2] ^ w0_t[0] ^ w3_t[2]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w3_t[2]); + w3_t[3] = rotl32 ((w3_t[0] ^ w1_t[3] ^ w0_t[1] ^ w3_t[3]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w3_t[3]); + w0_t[0] = rotl32 ((w3_t[1] ^ w2_t[0] ^ w0_t[2] ^ w0_t[0]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w0_t[0]); + w0_t[1] = rotl32 ((w3_t[2] ^ w2_t[1] ^ w0_t[3] ^ w0_t[1]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w0_t[1]); + w0_t[2] = rotl32 ((w3_t[3] ^ w2_t[2] ^ w1_t[0] ^ w0_t[2]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w0_t[2]); + w0_t[3] = rotl32 ((w0_t[0] ^ w2_t[3] ^ w1_t[1] ^ w0_t[3]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w0_t[3]); + w1_t[0] = rotl32 ((w0_t[1] ^ w3_t[0] ^ w1_t[2] ^ w1_t[0]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1_t[0]); + w1_t[1] = rotl32 ((w0_t[2] ^ w3_t[1] ^ w1_t[3] ^ w1_t[1]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w1_t[1]); + w1_t[2] = rotl32 ((w0_t[3] ^ w3_t[2] ^ w2_t[0] ^ w1_t[2]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w1_t[2]); + w1_t[3] = rotl32 ((w1_t[0] ^ w3_t[3] ^ w2_t[1] ^ w1_t[3]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w1_t[3]); + w2_t[0] = rotl32 ((w1_t[1] ^ w0_t[0] ^ w2_t[2] ^ w2_t[0]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w2_t[0]); + w2_t[1] = rotl32 ((w1_t[2] ^ w0_t[1] ^ w2_t[3] ^ w2_t[1]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w2_t[1]); + w2_t[2] = rotl32 ((w1_t[3] ^ w0_t[2] ^ w3_t[0] ^ w2_t[2]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w2_t[2]); + w2_t[3] = rotl32 ((w2_t[0] ^ w0_t[3] ^ w3_t[1] ^ w2_t[3]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w2_t[3]); + + if (e != e_rev) continue; + + w3_t[0] = rotl32 ((w2_t[1] ^ w1_t[0] ^ w3_t[2] ^ w3_t[0]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w3_t[0]); + w3_t[1] = rotl32 ((w2_t[2] ^ w1_t[1] ^ w3_t[3] ^ w3_t[1]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w3_t[1]); + w3_t[2] = rotl32 ((w2_t[3] ^ w1_t[2] ^ w0_t[0] ^ w3_t[2]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w3_t[2]); + w3_t[3] = rotl32 ((w3_t[0] ^ w1_t[3] ^ w0_t[1] ^ w3_t[3]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w3_t[3]); + + + const u32x r0 = d; + const u32x r1 = e; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_S + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m00130_s08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m00130_s16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/nv/m00130_a3.cu b/nv/m00130_a3.cu new file mode 100644 index 0000000000..665e589969 --- /dev/null +++ b/nv/m00130_a3.cu @@ -0,0 +1,887 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _SHA1_ +#define _SCALAR_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW2 +#define VECT_SIZE4 +#endif + +#define DGST_R0 3 +#define DGST_R1 4 +#define DGST_R2 2 +#define DGST_R3 1 + +#include "include/kernel_functions.c" +#include "types_nv.c" +#include "common_nv.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4_warp.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4_warp.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4_warp.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4_warp.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4_warp.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4_warp.c" +#endif + +__device__ __constant__ u32x c_bfs[1024]; + +__device__ static void m00130m (u32 w[16], const u32 pw_len, const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const u32x *words_buf_r, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset) +{ + /** + * modifier + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + const u32 lid = threadIdx.x; + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[ 1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[ 2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[ 3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[ 4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[ 5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[ 6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[ 7]; + + u32 salt_buf2[4]; + + salt_buf2[0] = salt_bufs[salt_pos].salt_buf[ 8]; + salt_buf2[1] = 0; + salt_buf2[2] = 0; + salt_buf2[3] = 0; + + u32 salt_buf3[4]; + + salt_buf3[0] = 0; + salt_buf3[1] = 0; + salt_buf3[2] = 0; + salt_buf3[3] = 0; + + switch_buffer_by_offset (salt_buf0, salt_buf1, salt_buf2, salt_buf3, pw_len); + + w[ 0] |= swap_workaround (salt_buf0[0]); + w[ 1] |= swap_workaround (salt_buf0[1]); + w[ 2] |= swap_workaround (salt_buf0[2]); + w[ 3] |= swap_workaround (salt_buf0[3]); + w[ 4] |= swap_workaround (salt_buf1[0]); + w[ 5] |= swap_workaround (salt_buf1[1]); + w[ 6] |= swap_workaround (salt_buf1[2]); + w[ 7] |= swap_workaround (salt_buf1[3]); + w[ 8] |= swap_workaround (salt_buf2[0]); + w[ 9] |= swap_workaround (salt_buf2[1]); + w[10] |= swap_workaround (salt_buf2[2]); + w[11] |= swap_workaround (salt_buf2[3]); + w[12] |= swap_workaround (salt_buf3[0]); + w[13] |= swap_workaround (salt_buf3[1]); + w[14] |= swap_workaround (salt_buf3[2]); + w[15] |= swap_workaround (salt_buf3[3]); + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + const u32 pw_salt_len = pw_len + salt_len; + + w[15] = pw_salt_len * 8; + + /** + * base + */ + + const u32 c_16s = rotl32 ((w[13] ^ w[ 8] ^ w[ 2] ), 1u); + const u32 c_17s = rotl32 ((w[14] ^ w[ 9] ^ w[ 3] ^ w[ 1]), 1u); + const u32 c_18s = rotl32 ((w[15] ^ w[10] ^ w[ 4] ^ w[ 2]), 1u); + const u32 c_19s = rotl32 ((c_16s ^ w[11] ^ w[ 5] ^ w[ 3]), 1u); + const u32 c_20s = rotl32 ((c_17s ^ w[12] ^ w[ 6] ^ w[ 4]), 1u); + const u32 c_21s = rotl32 ((c_18s ^ w[13] ^ w[ 7] ^ w[ 5]), 1u); + const u32 c_22s = rotl32 ((c_19s ^ w[14] ^ w[ 8] ^ w[ 6]), 1u); + const u32 c_23s = rotl32 ((c_20s ^ w[15] ^ w[ 9] ^ w[ 7]), 1u); + const u32 c_24s = rotl32 ((c_21s ^ c_16s ^ w[10] ^ w[ 8]), 1u); + const u32 c_25s = rotl32 ((c_22s ^ c_17s ^ w[11] ^ w[ 9]), 1u); + const u32 c_26s = rotl32 ((c_23s ^ c_18s ^ w[12] ^ w[10]), 1u); + const u32 c_27s = rotl32 ((c_24s ^ c_19s ^ w[13] ^ w[11]), 1u); + const u32 c_28s = rotl32 ((c_25s ^ c_20s ^ w[14] ^ w[12]), 1u); + const u32 c_29s = rotl32 ((c_26s ^ c_21s ^ w[15] ^ w[13]), 1u); + const u32 c_30s = rotl32 ((c_27s ^ c_22s ^ c_16s ^ w[14]), 1u); + const u32 c_31s = rotl32 ((c_28s ^ c_23s ^ c_17s ^ w[15]), 1u); + const u32 c_32s = rotl32 ((c_29s ^ c_24s ^ c_18s ^ c_16s), 1u); + const u32 c_33s = rotl32 ((c_30s ^ c_25s ^ c_19s ^ c_17s), 1u); + const u32 c_34s = rotl32 ((c_31s ^ c_26s ^ c_20s ^ c_18s), 1u); + const u32 c_35s = rotl32 ((c_32s ^ c_27s ^ c_21s ^ c_19s), 1u); + const u32 c_36s = rotl32 ((c_33s ^ c_28s ^ c_22s ^ c_20s), 1u); + const u32 c_37s = rotl32 ((c_34s ^ c_29s ^ c_23s ^ c_21s), 1u); + const u32 c_38s = rotl32 ((c_35s ^ c_30s ^ c_24s ^ c_22s), 1u); + const u32 c_39s = rotl32 ((c_36s ^ c_31s ^ c_25s ^ c_23s), 1u); + const u32 c_40s = rotl32 ((c_37s ^ c_32s ^ c_26s ^ c_24s), 1u); + const u32 c_41s = rotl32 ((c_38s ^ c_33s ^ c_27s ^ c_25s), 1u); + const u32 c_42s = rotl32 ((c_39s ^ c_34s ^ c_28s ^ c_26s), 1u); + const u32 c_43s = rotl32 ((c_40s ^ c_35s ^ c_29s ^ c_27s), 1u); + const u32 c_44s = rotl32 ((c_41s ^ c_36s ^ c_30s ^ c_28s), 1u); + const u32 c_45s = rotl32 ((c_42s ^ c_37s ^ c_31s ^ c_29s), 1u); + const u32 c_46s = rotl32 ((c_43s ^ c_38s ^ c_32s ^ c_30s), 1u); + const u32 c_47s = rotl32 ((c_44s ^ c_39s ^ c_33s ^ c_31s), 1u); + const u32 c_48s = rotl32 ((c_45s ^ c_40s ^ c_34s ^ c_32s), 1u); + const u32 c_49s = rotl32 ((c_46s ^ c_41s ^ c_35s ^ c_33s), 1u); + const u32 c_50s = rotl32 ((c_47s ^ c_42s ^ c_36s ^ c_34s), 1u); + const u32 c_51s = rotl32 ((c_48s ^ c_43s ^ c_37s ^ c_35s), 1u); + const u32 c_52s = rotl32 ((c_49s ^ c_44s ^ c_38s ^ c_36s), 1u); + const u32 c_53s = rotl32 ((c_50s ^ c_45s ^ c_39s ^ c_37s), 1u); + const u32 c_54s = rotl32 ((c_51s ^ c_46s ^ c_40s ^ c_38s), 1u); + const u32 c_55s = rotl32 ((c_52s ^ c_47s ^ c_41s ^ c_39s), 1u); + const u32 c_56s = rotl32 ((c_53s ^ c_48s ^ c_42s ^ c_40s), 1u); + const u32 c_57s = rotl32 ((c_54s ^ c_49s ^ c_43s ^ c_41s), 1u); + const u32 c_58s = rotl32 ((c_55s ^ c_50s ^ c_44s ^ c_42s), 1u); + const u32 c_59s = rotl32 ((c_56s ^ c_51s ^ c_45s ^ c_43s), 1u); + const u32 c_60s = rotl32 ((c_57s ^ c_52s ^ c_46s ^ c_44s), 1u); + const u32 c_61s = rotl32 ((c_58s ^ c_53s ^ c_47s ^ c_45s), 1u); + const u32 c_62s = rotl32 ((c_59s ^ c_54s ^ c_48s ^ c_46s), 1u); + const u32 c_63s = rotl32 ((c_60s ^ c_55s ^ c_49s ^ c_47s), 1u); + const u32 c_64s = rotl32 ((c_61s ^ c_56s ^ c_50s ^ c_48s), 1u); + const u32 c_65s = rotl32 ((c_62s ^ c_57s ^ c_51s ^ c_49s), 1u); + const u32 c_66s = rotl32 ((c_63s ^ c_58s ^ c_52s ^ c_50s), 1u); + const u32 c_67s = rotl32 ((c_64s ^ c_59s ^ c_53s ^ c_51s), 1u); + const u32 c_68s = rotl32 ((c_65s ^ c_60s ^ c_54s ^ c_52s), 1u); + const u32 c_69s = rotl32 ((c_66s ^ c_61s ^ c_55s ^ c_53s), 1u); + const u32 c_70s = rotl32 ((c_67s ^ c_62s ^ c_56s ^ c_54s), 1u); + const u32 c_71s = rotl32 ((c_68s ^ c_63s ^ c_57s ^ c_55s), 1u); + const u32 c_72s = rotl32 ((c_69s ^ c_64s ^ c_58s ^ c_56s), 1u); + const u32 c_73s = rotl32 ((c_70s ^ c_65s ^ c_59s ^ c_57s), 1u); + const u32 c_74s = rotl32 ((c_71s ^ c_66s ^ c_60s ^ c_58s), 1u); + const u32 c_75s = rotl32 ((c_72s ^ c_67s ^ c_61s ^ c_59s), 1u); + const u32 c_76s = rotl32 ((c_73s ^ c_68s ^ c_62s ^ c_60s), 1u); + const u32 c_77s = rotl32 ((c_74s ^ c_69s ^ c_63s ^ c_61s), 1u); + const u32 c_78s = rotl32 ((c_75s ^ c_70s ^ c_64s ^ c_62s), 1u); + const u32 c_79s = rotl32 ((c_76s ^ c_71s ^ c_65s ^ c_63s), 1u); + + const u32 c_17sK = c_17s + SHA1C00; + const u32 c_18sK = c_18s + SHA1C00; + const u32 c_20sK = c_20s + SHA1C01; + const u32 c_21sK = c_21s + SHA1C01; + const u32 c_23sK = c_23s + SHA1C01; + const u32 c_26sK = c_26s + SHA1C01; + const u32 c_27sK = c_27s + SHA1C01; + const u32 c_29sK = c_29s + SHA1C01; + const u32 c_33sK = c_33s + SHA1C01; + const u32 c_39sK = c_39s + SHA1C01; + const u32 c_41sK = c_41s + SHA1C02; + const u32 c_45sK = c_45s + SHA1C02; + const u32 c_53sK = c_53s + SHA1C02; + const u32 c_65sK = c_65s + SHA1C03; + const u32 c_69sK = c_69s + SHA1C03; + + const u32 w1 = w[ 1] + SHA1C00; + const u32 w2 = w[ 2] + SHA1C00; + const u32 w3 = w[ 3] + SHA1C00; + const u32 w4 = w[ 4] + SHA1C00; + const u32 w5 = w[ 5] + SHA1C00; + const u32 w6 = w[ 6] + SHA1C00; + const u32 w7 = w[ 7] + SHA1C00; + const u32 w8 = w[ 8] + SHA1C00; + const u32 w9 = w[ 9] + SHA1C00; + const u32 wa = w[10] + SHA1C00; + const u32 wb = w[11] + SHA1C00; + const u32 wc = w[12] + SHA1C00; + const u32 wd = w[13] + SHA1C00; + const u32 we = w[14] + SHA1C00; + const u32 wf = w[15] + SHA1C00; + + /** + * loop + */ + + const u32 bf_loops = ceil ((float) bfs_cnt / VECT_DIV); + + u32x w0l = w[0]; + + for (u32 il_pos = 0; il_pos < bf_loops; il_pos++) + { + const u32x w0r = c_bfs[il_pos]; + + const u32x w0 = w0l | w0r; + + const u32x w0s01 = rotl32 (w0, 1u); + const u32x w0s02 = rotl32 (w0, 2u); + const u32x w0s03 = rotl32 (w0, 3u); + const u32x w0s04 = rotl32 (w0, 4u); + const u32x w0s05 = rotl32 (w0, 5u); + const u32x w0s06 = rotl32 (w0, 6u); + const u32x w0s07 = rotl32 (w0, 7u); + const u32x w0s08 = rotl32 (w0, 8u); + const u32x w0s09 = rotl32 (w0, 9u); + const u32x w0s10 = rotl32 (w0, 10u); + const u32x w0s11 = rotl32 (w0, 11u); + const u32x w0s12 = rotl32 (w0, 12u); + const u32x w0s13 = rotl32 (w0, 13u); + const u32x w0s14 = rotl32 (w0, 14u); + const u32x w0s15 = rotl32 (w0, 15u); + const u32x w0s16 = rotl32 (w0, 16u); + const u32x w0s17 = rotl32 (w0, 17u); + const u32x w0s18 = rotl32 (w0, 18u); + const u32x w0s19 = rotl32 (w0, 19u); + const u32x w0s20 = rotl32 (w0, 20u); + const u32x w0s21 = rotl32 (w0, 21u); + const u32x w0s22 = rotl32 (w0, 22U); + + const u32x w0s04___w0s06 = w0s04 ^ w0s06; + const u32x w0s04___w0s08 = w0s04 ^ w0s08; + const u32x w0s08___w0s12 = w0s08 ^ w0s12; + const u32x w0s04___w0s06___w0s07 = w0s04___w0s06 ^ w0s07; + + u32x a = SHA1M_A; + u32x b = SHA1M_B; + u32x c = SHA1M_C; + u32x d = SHA1M_D; + u32x e = SHA1M_E; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w0); + SHA1_STEPX(SHA1_F0o, e, a, b, c, d, w1); + SHA1_STEPX(SHA1_F0o, d, e, a, b, c, w2); + SHA1_STEPX(SHA1_F0o, c, d, e, a, b, w3); + SHA1_STEPX(SHA1_F0o, b, c, d, e, a, w4); + SHA1_STEPX(SHA1_F0o, a, b, c, d, e, w5); + SHA1_STEPX(SHA1_F0o, e, a, b, c, d, w6); + SHA1_STEPX(SHA1_F0o, d, e, a, b, c, w7); + SHA1_STEPX(SHA1_F0o, c, d, e, a, b, w8); + SHA1_STEPX(SHA1_F0o, b, c, d, e, a, w9); + SHA1_STEPX(SHA1_F0o, a, b, c, d, e, wa); + SHA1_STEPX(SHA1_F0o, e, a, b, c, d, wb); + SHA1_STEPX(SHA1_F0o, d, e, a, b, c, wc); + SHA1_STEPX(SHA1_F0o, c, d, e, a, b, wd); + SHA1_STEPX(SHA1_F0o, b, c, d, e, a, we); + SHA1_STEPX(SHA1_F0o, a, b, c, d, e, wf); + + SHA1_STEP (SHA1_F0o, e, a, b, c, d, (c_16s ^ w0s01)); + SHA1_STEPX(SHA1_F0o, d, e, a, b, c, (c_17sK)); + SHA1_STEPX(SHA1_F0o, c, d, e, a, b, (c_18sK)); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, (c_19s ^ w0s02)); + + #undef K + #define K SHA1C01 + + SHA1_STEPX(SHA1_F1 , a, b, c, d, e, (c_20sK)); + SHA1_STEPX(SHA1_F1 , e, a, b, c, d, (c_21sK)); + SHA1_STEP (SHA1_F1 , d, e, a, b, c, (c_22s ^ w0s03)); + SHA1_STEPX(SHA1_F1 , c, d, e, a, b, (c_23sK)); + SHA1_STEP (SHA1_F1 , b, c, d, e, a, (c_24s ^ w0s02)); + SHA1_STEP (SHA1_F1 , a, b, c, d, e, (c_25s ^ w0s04)); + SHA1_STEPX(SHA1_F1 , e, a, b, c, d, (c_26sK)); + SHA1_STEPX(SHA1_F1 , d, e, a, b, c, (c_27sK)); + SHA1_STEP (SHA1_F1 , c, d, e, a, b, (c_28s ^ w0s05)); + SHA1_STEPX(SHA1_F1 , b, c, d, e, a, (c_29sK)); + SHA1_STEP (SHA1_F1 , a, b, c, d, e, (c_30s ^ w0s02 ^ w0s04)); + SHA1_STEP (SHA1_F1 , e, a, b, c, d, (c_31s ^ w0s06)); + SHA1_STEP (SHA1_F1 , d, e, a, b, c, (c_32s ^ w0s02 ^ w0s03)); + SHA1_STEPX(SHA1_F1 , c, d, e, a, b, (c_33sK)); + SHA1_STEP (SHA1_F1 , b, c, d, e, a, (c_34s ^ w0s07)); + SHA1_STEP (SHA1_F1 , a, b, c, d, e, (c_35s ^ w0s04)); + SHA1_STEP (SHA1_F1 , e, a, b, c, d, (c_36s ^ w0s04___w0s06)); + SHA1_STEP (SHA1_F1 , d, e, a, b, c, (c_37s ^ w0s08)); + SHA1_STEP (SHA1_F1 , c, d, e, a, b, (c_38s ^ w0s04)); + SHA1_STEPX(SHA1_F1 , b, c, d, e, a, (c_39sK)); + + #undef K + #define K SHA1C02 + + SHA1_STEP (SHA1_F2o, a, b, c, d, e, (c_40s ^ w0s04 ^ w0s09)); + SHA1_STEPX(SHA1_F2o, e, a, b, c, d, (c_41sK)); + SHA1_STEP (SHA1_F2o, d, e, a, b, c, (c_42s ^ w0s06 ^ w0s08)); + SHA1_STEP (SHA1_F2o, c, d, e, a, b, (c_43s ^ w0s10)); + SHA1_STEP (SHA1_F2o, b, c, d, e, a, (c_44s ^ w0s03 ^ w0s06 ^ w0s07)); + SHA1_STEPX(SHA1_F2o, a, b, c, d, e, (c_45sK)); + SHA1_STEP (SHA1_F2o, e, a, b, c, d, (c_46s ^ w0s04 ^ w0s11)); + SHA1_STEP (SHA1_F2o, d, e, a, b, c, (c_47s ^ w0s04___w0s08)); + SHA1_STEP (SHA1_F2o, c, d, e, a, b, (c_48s ^ w0s03 ^ w0s04___w0s08 ^ w0s05 ^ w0s10)); + SHA1_STEP (SHA1_F2o, b, c, d, e, a, (c_49s ^ w0s12)); + SHA1_STEP (SHA1_F2o, a, b, c, d, e, (c_50s ^ w0s08)); + SHA1_STEP (SHA1_F2o, e, a, b, c, d, (c_51s ^ w0s04___w0s06)); + SHA1_STEP (SHA1_F2o, d, e, a, b, c, (c_52s ^ w0s04___w0s08 ^ w0s13)); + SHA1_STEPX(SHA1_F2o, c, d, e, a, b, (c_53sK)); + SHA1_STEP (SHA1_F2o, b, c, d, e, a, (c_54s ^ w0s07 ^ w0s10 ^ w0s12)); + SHA1_STEP (SHA1_F2o, a, b, c, d, e, (c_55s ^ w0s14)); + SHA1_STEP (SHA1_F2o, e, a, b, c, d, (c_56s ^ w0s04___w0s06___w0s07 ^ w0s10 ^ w0s11)); + SHA1_STEP (SHA1_F2o, d, e, a, b, c, (c_57s ^ w0s08)); + SHA1_STEP (SHA1_F2o, c, d, e, a, b, (c_58s ^ w0s04___w0s08 ^ w0s15)); + SHA1_STEP (SHA1_F2o, b, c, d, e, a, (c_59s ^ w0s08___w0s12)); + + #undef K + #define K SHA1C03 + + SHA1_STEP (SHA1_F1 , a, b, c, d, e, (c_60s ^ w0s04 ^ w0s08___w0s12 ^ w0s07 ^ w0s14)); + SHA1_STEP (SHA1_F1 , e, a, b, c, d, (c_61s ^ w0s16)); + SHA1_STEP (SHA1_F1 , d, e, a, b, c, (c_62s ^ w0s04___w0s06 ^ w0s08___w0s12)); + SHA1_STEP (SHA1_F1 , c, d, e, a, b, (c_63s ^ w0s08)); + SHA1_STEP (SHA1_F1 , b, c, d, e, a, (c_64s ^ w0s04___w0s06___w0s07 ^ w0s08___w0s12 ^ w0s17)); + SHA1_STEPX(SHA1_F1 , a, b, c, d, e, (c_65sK)); + SHA1_STEP (SHA1_F1 , e, a, b, c, d, (c_66s ^ w0s14 ^ w0s16)); + SHA1_STEP (SHA1_F1 , d, e, a, b, c, (c_67s ^ w0s08 ^ w0s18)); + SHA1_STEP (SHA1_F1 , c, d, e, a, b, (c_68s ^ w0s11 ^ w0s14 ^ w0s15)); + SHA1_STEPX(SHA1_F1 , b, c, d, e, a, (c_69sK)); + SHA1_STEP (SHA1_F1 , a, b, c, d, e, (c_70s ^ w0s12 ^ w0s19)); + SHA1_STEP (SHA1_F1 , e, a, b, c, d, (c_71s ^ w0s12 ^ w0s16)); + SHA1_STEP (SHA1_F1 , d, e, a, b, c, (c_72s ^ w0s05 ^ w0s11 ^ w0s12 ^ w0s13 ^ w0s16 ^ w0s18)); + SHA1_STEP (SHA1_F1 , c, d, e, a, b, (c_73s ^ w0s20)); + SHA1_STEP (SHA1_F1 , b, c, d, e, a, (c_74s ^ w0s08 ^ w0s16)); + SHA1_STEP (SHA1_F1 , a, b, c, d, e, (c_75s ^ w0s06 ^ w0s12 ^ w0s14)); + SHA1_STEP (SHA1_F1 , e, a, b, c, d, (c_76s ^ w0s07 ^ w0s08___w0s12 ^ w0s16 ^ w0s21)); + SHA1_STEP (SHA1_F1 , d, e, a, b, c, (c_77s)); + SHA1_STEP (SHA1_F1 , c, d, e, a, b, (c_78s ^ w0s07 ^ w0s08 ^ w0s15 ^ w0s18 ^ w0s20)); + SHA1_STEP (SHA1_F1 , b, c, d, e, a, (c_79s ^ w0s08 ^ w0s22)); + + + const u32x r0 = d; + const u32x r1 = e; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_M + } +} + +__device__ static void m00130s (u32 w[16], const u32 pw_len, const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const u32x *words_buf_r, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset) +{ + /** + * modifier + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 c_16s = rotl32 ((w[13] ^ w[ 8] ^ w[ 2] ), 1u); + const u32 c_17s = rotl32 ((w[14] ^ w[ 9] ^ w[ 3] ^ w[ 1]), 1u); + const u32 c_18s = rotl32 ((w[15] ^ w[10] ^ w[ 4] ^ w[ 2]), 1u); + const u32 c_19s = rotl32 ((c_16s ^ w[11] ^ w[ 5] ^ w[ 3]), 1u); + const u32 c_20s = rotl32 ((c_17s ^ w[12] ^ w[ 6] ^ w[ 4]), 1u); + const u32 c_21s = rotl32 ((c_18s ^ w[13] ^ w[ 7] ^ w[ 5]), 1u); + const u32 c_22s = rotl32 ((c_19s ^ w[14] ^ w[ 8] ^ w[ 6]), 1u); + const u32 c_23s = rotl32 ((c_20s ^ w[15] ^ w[ 9] ^ w[ 7]), 1u); + const u32 c_24s = rotl32 ((c_21s ^ c_16s ^ w[10] ^ w[ 8]), 1u); + const u32 c_25s = rotl32 ((c_22s ^ c_17s ^ w[11] ^ w[ 9]), 1u); + const u32 c_26s = rotl32 ((c_23s ^ c_18s ^ w[12] ^ w[10]), 1u); + const u32 c_27s = rotl32 ((c_24s ^ c_19s ^ w[13] ^ w[11]), 1u); + const u32 c_28s = rotl32 ((c_25s ^ c_20s ^ w[14] ^ w[12]), 1u); + const u32 c_29s = rotl32 ((c_26s ^ c_21s ^ w[15] ^ w[13]), 1u); + const u32 c_30s = rotl32 ((c_27s ^ c_22s ^ c_16s ^ w[14]), 1u); + const u32 c_31s = rotl32 ((c_28s ^ c_23s ^ c_17s ^ w[15]), 1u); + const u32 c_32s = rotl32 ((c_29s ^ c_24s ^ c_18s ^ c_16s), 1u); + const u32 c_33s = rotl32 ((c_30s ^ c_25s ^ c_19s ^ c_17s), 1u); + const u32 c_34s = rotl32 ((c_31s ^ c_26s ^ c_20s ^ c_18s), 1u); + const u32 c_35s = rotl32 ((c_32s ^ c_27s ^ c_21s ^ c_19s), 1u); + const u32 c_36s = rotl32 ((c_33s ^ c_28s ^ c_22s ^ c_20s), 1u); + const u32 c_37s = rotl32 ((c_34s ^ c_29s ^ c_23s ^ c_21s), 1u); + const u32 c_38s = rotl32 ((c_35s ^ c_30s ^ c_24s ^ c_22s), 1u); + const u32 c_39s = rotl32 ((c_36s ^ c_31s ^ c_25s ^ c_23s), 1u); + const u32 c_40s = rotl32 ((c_37s ^ c_32s ^ c_26s ^ c_24s), 1u); + const u32 c_41s = rotl32 ((c_38s ^ c_33s ^ c_27s ^ c_25s), 1u); + const u32 c_42s = rotl32 ((c_39s ^ c_34s ^ c_28s ^ c_26s), 1u); + const u32 c_43s = rotl32 ((c_40s ^ c_35s ^ c_29s ^ c_27s), 1u); + const u32 c_44s = rotl32 ((c_41s ^ c_36s ^ c_30s ^ c_28s), 1u); + const u32 c_45s = rotl32 ((c_42s ^ c_37s ^ c_31s ^ c_29s), 1u); + const u32 c_46s = rotl32 ((c_43s ^ c_38s ^ c_32s ^ c_30s), 1u); + const u32 c_47s = rotl32 ((c_44s ^ c_39s ^ c_33s ^ c_31s), 1u); + const u32 c_48s = rotl32 ((c_45s ^ c_40s ^ c_34s ^ c_32s), 1u); + const u32 c_49s = rotl32 ((c_46s ^ c_41s ^ c_35s ^ c_33s), 1u); + const u32 c_50s = rotl32 ((c_47s ^ c_42s ^ c_36s ^ c_34s), 1u); + const u32 c_51s = rotl32 ((c_48s ^ c_43s ^ c_37s ^ c_35s), 1u); + const u32 c_52s = rotl32 ((c_49s ^ c_44s ^ c_38s ^ c_36s), 1u); + const u32 c_53s = rotl32 ((c_50s ^ c_45s ^ c_39s ^ c_37s), 1u); + const u32 c_54s = rotl32 ((c_51s ^ c_46s ^ c_40s ^ c_38s), 1u); + const u32 c_55s = rotl32 ((c_52s ^ c_47s ^ c_41s ^ c_39s), 1u); + const u32 c_56s = rotl32 ((c_53s ^ c_48s ^ c_42s ^ c_40s), 1u); + const u32 c_57s = rotl32 ((c_54s ^ c_49s ^ c_43s ^ c_41s), 1u); + const u32 c_58s = rotl32 ((c_55s ^ c_50s ^ c_44s ^ c_42s), 1u); + const u32 c_59s = rotl32 ((c_56s ^ c_51s ^ c_45s ^ c_43s), 1u); + const u32 c_60s = rotl32 ((c_57s ^ c_52s ^ c_46s ^ c_44s), 1u); + const u32 c_61s = rotl32 ((c_58s ^ c_53s ^ c_47s ^ c_45s), 1u); + const u32 c_62s = rotl32 ((c_59s ^ c_54s ^ c_48s ^ c_46s), 1u); + const u32 c_63s = rotl32 ((c_60s ^ c_55s ^ c_49s ^ c_47s), 1u); + const u32 c_64s = rotl32 ((c_61s ^ c_56s ^ c_50s ^ c_48s), 1u); + const u32 c_65s = rotl32 ((c_62s ^ c_57s ^ c_51s ^ c_49s), 1u); + const u32 c_66s = rotl32 ((c_63s ^ c_58s ^ c_52s ^ c_50s), 1u); + const u32 c_67s = rotl32 ((c_64s ^ c_59s ^ c_53s ^ c_51s), 1u); + const u32 c_68s = rotl32 ((c_65s ^ c_60s ^ c_54s ^ c_52s), 1u); + const u32 c_69s = rotl32 ((c_66s ^ c_61s ^ c_55s ^ c_53s), 1u); + const u32 c_70s = rotl32 ((c_67s ^ c_62s ^ c_56s ^ c_54s), 1u); + const u32 c_71s = rotl32 ((c_68s ^ c_63s ^ c_57s ^ c_55s), 1u); + const u32 c_72s = rotl32 ((c_69s ^ c_64s ^ c_58s ^ c_56s), 1u); + const u32 c_73s = rotl32 ((c_70s ^ c_65s ^ c_59s ^ c_57s), 1u); + const u32 c_74s = rotl32 ((c_71s ^ c_66s ^ c_60s ^ c_58s), 1u); + const u32 c_75s = rotl32 ((c_72s ^ c_67s ^ c_61s ^ c_59s), 1u); + + const u32 c_17sK = c_17s + SHA1C00; + const u32 c_18sK = c_18s + SHA1C00; + const u32 c_20sK = c_20s + SHA1C01; + const u32 c_21sK = c_21s + SHA1C01; + const u32 c_23sK = c_23s + SHA1C01; + const u32 c_26sK = c_26s + SHA1C01; + const u32 c_27sK = c_27s + SHA1C01; + const u32 c_29sK = c_29s + SHA1C01; + const u32 c_33sK = c_33s + SHA1C01; + const u32 c_39sK = c_39s + SHA1C01; + const u32 c_41sK = c_41s + SHA1C02; + const u32 c_45sK = c_45s + SHA1C02; + const u32 c_53sK = c_53s + SHA1C02; + const u32 c_65sK = c_65s + SHA1C03; + const u32 c_69sK = c_69s + SHA1C03; + + const u32 w1 = w[ 1] + SHA1C00; + const u32 w2 = w[ 2] + SHA1C00; + const u32 w3 = w[ 3] + SHA1C00; + const u32 w4 = w[ 4] + SHA1C00; + const u32 w5 = w[ 5] + SHA1C00; + const u32 w6 = w[ 6] + SHA1C00; + const u32 w7 = w[ 7] + SHA1C00; + const u32 w8 = w[ 8] + SHA1C00; + const u32 w9 = w[ 9] + SHA1C00; + const u32 wa = w[10] + SHA1C00; + const u32 wb = w[11] + SHA1C00; + const u32 wc = w[12] + SHA1C00; + const u32 wd = w[13] + SHA1C00; + const u32 we = w[14] + SHA1C00; + const u32 wf = w[15] + SHA1C00; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * reverse + */ + + const u32 e_rev = rotl32 (search[1], 2u) - SHA1C03; + + /** + * loop + */ + + const u32 bf_loops = ceil ((float) bfs_cnt / VECT_DIV); + + u32x w0l = w[0]; + + for (u32 il_pos = 0; il_pos < bf_loops; il_pos++) + { + const u32x w0r = c_bfs[il_pos]; + + const u32x w0 = w0l | w0r; + + const u32x w0s01 = rotl32 (w0, 1u); + const u32x w0s02 = rotl32 (w0, 2u); + const u32x w0s03 = rotl32 (w0, 3u); + const u32x w0s04 = rotl32 (w0, 4u); + const u32x w0s05 = rotl32 (w0, 5u); + const u32x w0s06 = rotl32 (w0, 6u); + const u32x w0s07 = rotl32 (w0, 7u); + const u32x w0s08 = rotl32 (w0, 8u); + const u32x w0s09 = rotl32 (w0, 9u); + const u32x w0s10 = rotl32 (w0, 10u); + const u32x w0s11 = rotl32 (w0, 11u); + const u32x w0s12 = rotl32 (w0, 12u); + const u32x w0s13 = rotl32 (w0, 13u); + const u32x w0s14 = rotl32 (w0, 14u); + const u32x w0s15 = rotl32 (w0, 15u); + const u32x w0s16 = rotl32 (w0, 16u); + const u32x w0s17 = rotl32 (w0, 17u); + const u32x w0s18 = rotl32 (w0, 18u); + const u32x w0s19 = rotl32 (w0, 19u); + const u32x w0s20 = rotl32 (w0, 20u); + + const u32x w0s04___w0s06 = w0s04 ^ w0s06; + const u32x w0s04___w0s08 = w0s04 ^ w0s08; + const u32x w0s08___w0s12 = w0s08 ^ w0s12; + const u32x w0s04___w0s06___w0s07 = w0s04___w0s06 ^ w0s07; + + u32x a = SHA1M_A; + u32x b = SHA1M_B; + u32x c = SHA1M_C; + u32x d = SHA1M_D; + u32x e = SHA1M_E; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w0); + SHA1_STEPX(SHA1_F0o, e, a, b, c, d, w1); + SHA1_STEPX(SHA1_F0o, d, e, a, b, c, w2); + SHA1_STEPX(SHA1_F0o, c, d, e, a, b, w3); + SHA1_STEPX(SHA1_F0o, b, c, d, e, a, w4); + SHA1_STEPX(SHA1_F0o, a, b, c, d, e, w5); + SHA1_STEPX(SHA1_F0o, e, a, b, c, d, w6); + SHA1_STEPX(SHA1_F0o, d, e, a, b, c, w7); + SHA1_STEPX(SHA1_F0o, c, d, e, a, b, w8); + SHA1_STEPX(SHA1_F0o, b, c, d, e, a, w9); + SHA1_STEPX(SHA1_F0o, a, b, c, d, e, wa); + SHA1_STEPX(SHA1_F0o, e, a, b, c, d, wb); + SHA1_STEPX(SHA1_F0o, d, e, a, b, c, wc); + SHA1_STEPX(SHA1_F0o, c, d, e, a, b, wd); + SHA1_STEPX(SHA1_F0o, b, c, d, e, a, we); + SHA1_STEPX(SHA1_F0o, a, b, c, d, e, wf); + + SHA1_STEP (SHA1_F0o, e, a, b, c, d, (c_16s ^ w0s01)); + SHA1_STEPX(SHA1_F0o, d, e, a, b, c, (c_17sK)); + SHA1_STEPX(SHA1_F0o, c, d, e, a, b, (c_18sK)); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, (c_19s ^ w0s02)); + + #undef K + #define K SHA1C01 + + SHA1_STEPX(SHA1_F1 , a, b, c, d, e, (c_20sK)); + SHA1_STEPX(SHA1_F1 , e, a, b, c, d, (c_21sK)); + SHA1_STEP (SHA1_F1 , d, e, a, b, c, (c_22s ^ w0s03)); + SHA1_STEPX(SHA1_F1 , c, d, e, a, b, (c_23sK)); + SHA1_STEP (SHA1_F1 , b, c, d, e, a, (c_24s ^ w0s02)); + SHA1_STEP (SHA1_F1 , a, b, c, d, e, (c_25s ^ w0s04)); + SHA1_STEPX(SHA1_F1 , e, a, b, c, d, (c_26sK)); + SHA1_STEPX(SHA1_F1 , d, e, a, b, c, (c_27sK)); + SHA1_STEP (SHA1_F1 , c, d, e, a, b, (c_28s ^ w0s05)); + SHA1_STEPX(SHA1_F1 , b, c, d, e, a, (c_29sK)); + SHA1_STEP (SHA1_F1 , a, b, c, d, e, (c_30s ^ w0s02 ^ w0s04)); + SHA1_STEP (SHA1_F1 , e, a, b, c, d, (c_31s ^ w0s06)); + SHA1_STEP (SHA1_F1 , d, e, a, b, c, (c_32s ^ w0s02 ^ w0s03)); + SHA1_STEPX(SHA1_F1 , c, d, e, a, b, (c_33sK)); + SHA1_STEP (SHA1_F1 , b, c, d, e, a, (c_34s ^ w0s07)); + SHA1_STEP (SHA1_F1 , a, b, c, d, e, (c_35s ^ w0s04)); + SHA1_STEP (SHA1_F1 , e, a, b, c, d, (c_36s ^ w0s04___w0s06)); + SHA1_STEP (SHA1_F1 , d, e, a, b, c, (c_37s ^ w0s08)); + SHA1_STEP (SHA1_F1 , c, d, e, a, b, (c_38s ^ w0s04)); + SHA1_STEPX(SHA1_F1 , b, c, d, e, a, (c_39sK)); + + #undef K + #define K SHA1C02 + + SHA1_STEP (SHA1_F2o, a, b, c, d, e, (c_40s ^ w0s04 ^ w0s09)); + SHA1_STEPX(SHA1_F2o, e, a, b, c, d, (c_41sK)); + SHA1_STEP (SHA1_F2o, d, e, a, b, c, (c_42s ^ w0s06 ^ w0s08)); + SHA1_STEP (SHA1_F2o, c, d, e, a, b, (c_43s ^ w0s10)); + SHA1_STEP (SHA1_F2o, b, c, d, e, a, (c_44s ^ w0s03 ^ w0s06 ^ w0s07)); + SHA1_STEPX(SHA1_F2o, a, b, c, d, e, (c_45sK)); + SHA1_STEP (SHA1_F2o, e, a, b, c, d, (c_46s ^ w0s04 ^ w0s11)); + SHA1_STEP (SHA1_F2o, d, e, a, b, c, (c_47s ^ w0s04___w0s08)); + SHA1_STEP (SHA1_F2o, c, d, e, a, b, (c_48s ^ w0s03 ^ w0s04___w0s08 ^ w0s05 ^ w0s10)); + SHA1_STEP (SHA1_F2o, b, c, d, e, a, (c_49s ^ w0s12)); + SHA1_STEP (SHA1_F2o, a, b, c, d, e, (c_50s ^ w0s08)); + SHA1_STEP (SHA1_F2o, e, a, b, c, d, (c_51s ^ w0s04___w0s06)); + SHA1_STEP (SHA1_F2o, d, e, a, b, c, (c_52s ^ w0s04___w0s08 ^ w0s13)); + SHA1_STEPX(SHA1_F2o, c, d, e, a, b, (c_53sK)); + SHA1_STEP (SHA1_F2o, b, c, d, e, a, (c_54s ^ w0s07 ^ w0s10 ^ w0s12)); + SHA1_STEP (SHA1_F2o, a, b, c, d, e, (c_55s ^ w0s14)); + SHA1_STEP (SHA1_F2o, e, a, b, c, d, (c_56s ^ w0s04___w0s06___w0s07 ^ w0s10 ^ w0s11)); + SHA1_STEP (SHA1_F2o, d, e, a, b, c, (c_57s ^ w0s08)); + SHA1_STEP (SHA1_F2o, c, d, e, a, b, (c_58s ^ w0s04___w0s08 ^ w0s15)); + SHA1_STEP (SHA1_F2o, b, c, d, e, a, (c_59s ^ w0s08___w0s12)); + + #undef K + #define K SHA1C03 + + SHA1_STEP (SHA1_F1 , a, b, c, d, e, (c_60s ^ w0s04 ^ w0s08___w0s12 ^ w0s07 ^ w0s14)); + SHA1_STEP (SHA1_F1 , e, a, b, c, d, (c_61s ^ w0s16)); + SHA1_STEP (SHA1_F1 , d, e, a, b, c, (c_62s ^ w0s04___w0s06 ^ w0s08___w0s12)); + SHA1_STEP (SHA1_F1 , c, d, e, a, b, (c_63s ^ w0s08)); + SHA1_STEP (SHA1_F1 , b, c, d, e, a, (c_64s ^ w0s04___w0s06___w0s07 ^ w0s08___w0s12 ^ w0s17)); + SHA1_STEPX(SHA1_F1 , a, b, c, d, e, (c_65sK)); + SHA1_STEP (SHA1_F1 , e, a, b, c, d, (c_66s ^ w0s14 ^ w0s16)); + SHA1_STEP (SHA1_F1 , d, e, a, b, c, (c_67s ^ w0s08 ^ w0s18)); + SHA1_STEP (SHA1_F1 , c, d, e, a, b, (c_68s ^ w0s11 ^ w0s14 ^ w0s15)); + SHA1_STEPX(SHA1_F1 , b, c, d, e, a, (c_69sK)); + SHA1_STEP (SHA1_F1 , a, b, c, d, e, (c_70s ^ w0s12 ^ w0s19)); + SHA1_STEP (SHA1_F1 , e, a, b, c, d, (c_71s ^ w0s12 ^ w0s16)); + SHA1_STEP (SHA1_F1 , d, e, a, b, c, (c_72s ^ w0s05 ^ w0s11 ^ w0s12 ^ w0s13 ^ w0s16 ^ w0s18)); + SHA1_STEP (SHA1_F1 , c, d, e, a, b, (c_73s ^ w0s20)); + SHA1_STEP (SHA1_F1 , b, c, d, e, a, (c_74s ^ w0s08 ^ w0s16)); + + SHA1_STEP_PE (SHA1_F1, a, b, c, d, e, (c_75s ^ w0s06 ^ w0s12 ^ w0s14)); + + bool q_cond = (e_rev != e); + + if (q_cond) continue; + + SHA1_STEP_PB (SHA1_F1, a, b, c, d, e, 0); + + const u32 c_76s = rotl32 ((c_73s ^ c_68s ^ c_62s ^ c_60s), 1u); + const u32 c_77s = rotl32 ((c_74s ^ c_69s ^ c_63s ^ c_61s), 1u); + const u32 c_78s = rotl32 ((c_75s ^ c_70s ^ c_64s ^ c_62s), 1u); + const u32 c_79s = rotl32 ((c_76s ^ c_71s ^ c_65s ^ c_63s), 1u); + + const u32x w0s21 = rotl32 (w0, 21u); + const u32x w0s22 = rotl32 (w0, 22U); + + SHA1_STEP (SHA1_F1 , e, a, b, c, d, (c_76s ^ w0s07 ^ w0s08___w0s12 ^ w0s16 ^ w0s21)); + SHA1_STEP (SHA1_F1 , d, e, a, b, c, (c_77s)); + SHA1_STEP (SHA1_F1 , c, d, e, a, b, (c_78s ^ w0s07 ^ w0s08 ^ w0s15 ^ w0s18 ^ w0s20)); + SHA1_STEP (SHA1_F1 , b, c, d, e, a, (c_79s ^ w0s08 ^ w0s22)); + + + const u32x r0 = d; + const u32x r1 = e; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_S + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m00130_m04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const u32x *words_buf_r, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32 w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = 0; + w[ 5] = 0; + w[ 6] = 0; + w[ 7] = 0; + w[ 8] = 0; + w[ 9] = 0; + w[10] = 0; + w[11] = 0; + w[12] = 0; + w[13] = 0; + w[14] = 0; + w[15] = pws[gid].i[15]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m00130m (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m00130_m08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const u32x *words_buf_r, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32 w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = pws[gid].i[ 4]; + w[ 5] = pws[gid].i[ 5]; + w[ 6] = pws[gid].i[ 6]; + w[ 7] = pws[gid].i[ 7]; + w[ 8] = 0; + w[ 9] = 0; + w[10] = 0; + w[11] = 0; + w[12] = 0; + w[13] = 0; + w[14] = 0; + w[15] = pws[gid].i[15]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m00130m (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m00130_m16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const u32x *words_buf_r, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32 w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = pws[gid].i[ 4]; + w[ 5] = pws[gid].i[ 5]; + w[ 6] = pws[gid].i[ 6]; + w[ 7] = pws[gid].i[ 7]; + w[ 8] = pws[gid].i[ 8]; + w[ 9] = pws[gid].i[ 9]; + w[10] = pws[gid].i[10]; + w[11] = pws[gid].i[11]; + w[12] = pws[gid].i[12]; + w[13] = pws[gid].i[13]; + w[14] = pws[gid].i[14]; + w[15] = pws[gid].i[15]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m00130m (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m00130_s04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const u32x *words_buf_r, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32 w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = 0; + w[ 5] = 0; + w[ 6] = 0; + w[ 7] = 0; + w[ 8] = 0; + w[ 9] = 0; + w[10] = 0; + w[11] = 0; + w[12] = 0; + w[13] = 0; + w[14] = 0; + w[15] = pws[gid].i[15]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m00130s (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m00130_s08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const u32x *words_buf_r, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32 w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = pws[gid].i[ 4]; + w[ 5] = pws[gid].i[ 5]; + w[ 6] = pws[gid].i[ 6]; + w[ 7] = pws[gid].i[ 7]; + w[ 8] = 0; + w[ 9] = 0; + w[10] = 0; + w[11] = 0; + w[12] = 0; + w[13] = 0; + w[14] = 0; + w[15] = pws[gid].i[15]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m00130s (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m00130_s16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const u32x *words_buf_r, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32 w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = pws[gid].i[ 4]; + w[ 5] = pws[gid].i[ 5]; + w[ 6] = pws[gid].i[ 6]; + w[ 7] = pws[gid].i[ 7]; + w[ 8] = pws[gid].i[ 8]; + w[ 9] = pws[gid].i[ 9]; + w[10] = pws[gid].i[10]; + w[11] = pws[gid].i[11]; + w[12] = pws[gid].i[12]; + w[13] = pws[gid].i[13]; + w[14] = pws[gid].i[14]; + w[15] = pws[gid].i[15]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m00130s (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} diff --git a/nv/m00140_a0.cu b/nv/m00140_a0.cu new file mode 100644 index 0000000000..3b0ecff010 --- /dev/null +++ b/nv/m00140_a0.cu @@ -0,0 +1,582 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _SHA1_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW2 +#define VECT_SIZE1 +#endif + +#define DGST_R0 3 +#define DGST_R1 4 +#define DGST_R2 2 +#define DGST_R3 1 + +#include "include/kernel_functions.c" +#include "types_nv.c" +#include "common_nv.c" +#include "include/rp_gpu.h" +#include "rp_nv.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +__device__ __constant__ gpu_rule_t c_rules[1024]; + +extern "C" __global__ void __launch_bounds__ (256, 1) m00140_m04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + u32x pw_buf1[4]; + + pw_buf1[0] = pws[gid].i[ 4]; + pw_buf1[1] = pws[gid].i[ 5]; + pw_buf1[2] = pws[gid].i[ 6]; + pw_buf1[3] = pws[gid].i[ 7]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[7]; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + + w0[0] = pw_buf0[0]; + w0[1] = pw_buf0[1]; + w0[2] = pw_buf0[2]; + w0[3] = pw_buf0[3]; + + u32x w1[4]; + + w1[0] = pw_buf1[0]; + w1[1] = pw_buf1[1]; + w1[2] = pw_buf1[2]; + w1[3] = pw_buf1[3]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 out_len = apply_rules (c_rules[il_pos].cmds, w0, w1, pw_len); + + /** + * prepend salt + */ + + const u32 out_salt_len = (out_len * 2) + salt_len; + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + make_unicode (w0, w0_t, w1_t); + make_unicode (w1, w2_t, w3_t); + + switch_buffer_by_offset (w0_t, w1_t, w2_t, w3_t, salt_len); + + w0_t[0] |= salt_buf0[0]; + w0_t[1] |= salt_buf0[1]; + w0_t[2] |= salt_buf0[2]; + w0_t[3] |= salt_buf0[3]; + w1_t[0] |= salt_buf1[0]; + w1_t[1] |= salt_buf1[1]; + w1_t[2] |= salt_buf1[2]; + w1_t[3] |= salt_buf1[3]; + + append_0x80_4 (w0_t, w1_t, w2_t, w3_t, out_salt_len); + + w3_t[3] = out_salt_len * 8; + + /** + * sha1 + */ + + w0_t[0] = swap_workaround (w0_t[0]); + w0_t[1] = swap_workaround (w0_t[1]); + w0_t[2] = swap_workaround (w0_t[2]); + w0_t[3] = swap_workaround (w0_t[3]); + w1_t[0] = swap_workaround (w1_t[0]); + w1_t[1] = swap_workaround (w1_t[1]); + w1_t[2] = swap_workaround (w1_t[2]); + w1_t[3] = swap_workaround (w1_t[3]); + w2_t[0] = swap_workaround (w2_t[0]); + w2_t[1] = swap_workaround (w2_t[1]); + w2_t[2] = swap_workaround (w2_t[2]); + w2_t[3] = swap_workaround (w2_t[3]); + w3_t[0] = swap_workaround (w3_t[0]); + w3_t[1] = swap_workaround (w3_t[1]); + //w3_t[2] = swap_workaround (w3_t[2]); + //w3_t[3] = swap_workaround (w3_t[3]); + + u32x a = SHA1M_A; + u32x b = SHA1M_B; + u32x c = SHA1M_C; + u32x d = SHA1M_D; + u32x e = SHA1M_E; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w0_t[0]); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w0_t[1]); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w0_t[2]); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w0_t[3]); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w1_t[0]); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w1_t[1]); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w1_t[2]); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w1_t[3]); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w2_t[0]); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w2_t[1]); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w2_t[2]); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w2_t[3]); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w3_t[0]); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w3_t[1]); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w3_t[2]); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w3_t[3]); + w0_t[0] = rotl32 ((w3_t[1] ^ w2_t[0] ^ w0_t[2] ^ w0_t[0]), 1u); SHA1_STEP (SHA1_F0o, e, a, b, c, d, w0_t[0]); + w0_t[1] = rotl32 ((w3_t[2] ^ w2_t[1] ^ w0_t[3] ^ w0_t[1]), 1u); SHA1_STEP (SHA1_F0o, d, e, a, b, c, w0_t[1]); + w0_t[2] = rotl32 ((w3_t[3] ^ w2_t[2] ^ w1_t[0] ^ w0_t[2]), 1u); SHA1_STEP (SHA1_F0o, c, d, e, a, b, w0_t[2]); + w0_t[3] = rotl32 ((w0_t[0] ^ w2_t[3] ^ w1_t[1] ^ w0_t[3]), 1u); SHA1_STEP (SHA1_F0o, b, c, d, e, a, w0_t[3]); + + #undef K + #define K SHA1C01 + + w1_t[0] = rotl32 ((w0_t[1] ^ w3_t[0] ^ w1_t[2] ^ w1_t[0]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w1_t[0]); + w1_t[1] = rotl32 ((w0_t[2] ^ w3_t[1] ^ w1_t[3] ^ w1_t[1]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w1_t[1]); + w1_t[2] = rotl32 ((w0_t[3] ^ w3_t[2] ^ w2_t[0] ^ w1_t[2]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w1_t[2]); + w1_t[3] = rotl32 ((w1_t[0] ^ w3_t[3] ^ w2_t[1] ^ w1_t[3]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1_t[3]); + w2_t[0] = rotl32 ((w1_t[1] ^ w0_t[0] ^ w2_t[2] ^ w2_t[0]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w2_t[0]); + w2_t[1] = rotl32 ((w1_t[2] ^ w0_t[1] ^ w2_t[3] ^ w2_t[1]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w2_t[1]); + w2_t[2] = rotl32 ((w1_t[3] ^ w0_t[2] ^ w3_t[0] ^ w2_t[2]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w2_t[2]); + w2_t[3] = rotl32 ((w2_t[0] ^ w0_t[3] ^ w3_t[1] ^ w2_t[3]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w2_t[3]); + w3_t[0] = rotl32 ((w2_t[1] ^ w1_t[0] ^ w3_t[2] ^ w3_t[0]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w3_t[0]); + w3_t[1] = rotl32 ((w2_t[2] ^ w1_t[1] ^ w3_t[3] ^ w3_t[1]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w3_t[1]); + w3_t[2] = rotl32 ((w2_t[3] ^ w1_t[2] ^ w0_t[0] ^ w3_t[2]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w3_t[2]); + w3_t[3] = rotl32 ((w3_t[0] ^ w1_t[3] ^ w0_t[1] ^ w3_t[3]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w3_t[3]); + w0_t[0] = rotl32 ((w3_t[1] ^ w2_t[0] ^ w0_t[2] ^ w0_t[0]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w0_t[0]); + w0_t[1] = rotl32 ((w3_t[2] ^ w2_t[1] ^ w0_t[3] ^ w0_t[1]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w0_t[1]); + w0_t[2] = rotl32 ((w3_t[3] ^ w2_t[2] ^ w1_t[0] ^ w0_t[2]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w0_t[2]); + w0_t[3] = rotl32 ((w0_t[0] ^ w2_t[3] ^ w1_t[1] ^ w0_t[3]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w0_t[3]); + w1_t[0] = rotl32 ((w0_t[1] ^ w3_t[0] ^ w1_t[2] ^ w1_t[0]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w1_t[0]); + w1_t[1] = rotl32 ((w0_t[2] ^ w3_t[1] ^ w1_t[3] ^ w1_t[1]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w1_t[1]); + w1_t[2] = rotl32 ((w0_t[3] ^ w3_t[2] ^ w2_t[0] ^ w1_t[2]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1_t[2]); + w1_t[3] = rotl32 ((w1_t[0] ^ w3_t[3] ^ w2_t[1] ^ w1_t[3]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w1_t[3]); + + #undef K + #define K SHA1C02 + + w2_t[0] = rotl32 ((w1_t[1] ^ w0_t[0] ^ w2_t[2] ^ w2_t[0]), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w2_t[0]); + w2_t[1] = rotl32 ((w1_t[2] ^ w0_t[1] ^ w2_t[3] ^ w2_t[1]), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w2_t[1]); + w2_t[2] = rotl32 ((w1_t[3] ^ w0_t[2] ^ w3_t[0] ^ w2_t[2]), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w2_t[2]); + w2_t[3] = rotl32 ((w2_t[0] ^ w0_t[3] ^ w3_t[1] ^ w2_t[3]), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w2_t[3]); + w3_t[0] = rotl32 ((w2_t[1] ^ w1_t[0] ^ w3_t[2] ^ w3_t[0]), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w3_t[0]); + w3_t[1] = rotl32 ((w2_t[2] ^ w1_t[1] ^ w3_t[3] ^ w3_t[1]), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w3_t[1]); + w3_t[2] = rotl32 ((w2_t[3] ^ w1_t[2] ^ w0_t[0] ^ w3_t[2]), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w3_t[2]); + w3_t[3] = rotl32 ((w3_t[0] ^ w1_t[3] ^ w0_t[1] ^ w3_t[3]), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w3_t[3]); + w0_t[0] = rotl32 ((w3_t[1] ^ w2_t[0] ^ w0_t[2] ^ w0_t[0]), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w0_t[0]); + w0_t[1] = rotl32 ((w3_t[2] ^ w2_t[1] ^ w0_t[3] ^ w0_t[1]), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w0_t[1]); + w0_t[2] = rotl32 ((w3_t[3] ^ w2_t[2] ^ w1_t[0] ^ w0_t[2]), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w0_t[2]); + w0_t[3] = rotl32 ((w0_t[0] ^ w2_t[3] ^ w1_t[1] ^ w0_t[3]), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w0_t[3]); + w1_t[0] = rotl32 ((w0_t[1] ^ w3_t[0] ^ w1_t[2] ^ w1_t[0]), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w1_t[0]); + w1_t[1] = rotl32 ((w0_t[2] ^ w3_t[1] ^ w1_t[3] ^ w1_t[1]), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w1_t[1]); + w1_t[2] = rotl32 ((w0_t[3] ^ w3_t[2] ^ w2_t[0] ^ w1_t[2]), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w1_t[2]); + w1_t[3] = rotl32 ((w1_t[0] ^ w3_t[3] ^ w2_t[1] ^ w1_t[3]), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w1_t[3]); + w2_t[0] = rotl32 ((w1_t[1] ^ w0_t[0] ^ w2_t[2] ^ w2_t[0]), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w2_t[0]); + w2_t[1] = rotl32 ((w1_t[2] ^ w0_t[1] ^ w2_t[3] ^ w2_t[1]), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w2_t[1]); + w2_t[2] = rotl32 ((w1_t[3] ^ w0_t[2] ^ w3_t[0] ^ w2_t[2]), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w2_t[2]); + w2_t[3] = rotl32 ((w2_t[0] ^ w0_t[3] ^ w3_t[1] ^ w2_t[3]), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w2_t[3]); + + #undef K + #define K SHA1C03 + + w3_t[0] = rotl32 ((w2_t[1] ^ w1_t[0] ^ w3_t[2] ^ w3_t[0]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w3_t[0]); + w3_t[1] = rotl32 ((w2_t[2] ^ w1_t[1] ^ w3_t[3] ^ w3_t[1]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w3_t[1]); + w3_t[2] = rotl32 ((w2_t[3] ^ w1_t[2] ^ w0_t[0] ^ w3_t[2]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w3_t[2]); + w3_t[3] = rotl32 ((w3_t[0] ^ w1_t[3] ^ w0_t[1] ^ w3_t[3]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w3_t[3]); + w0_t[0] = rotl32 ((w3_t[1] ^ w2_t[0] ^ w0_t[2] ^ w0_t[0]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w0_t[0]); + w0_t[1] = rotl32 ((w3_t[2] ^ w2_t[1] ^ w0_t[3] ^ w0_t[1]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w0_t[1]); + w0_t[2] = rotl32 ((w3_t[3] ^ w2_t[2] ^ w1_t[0] ^ w0_t[2]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w0_t[2]); + w0_t[3] = rotl32 ((w0_t[0] ^ w2_t[3] ^ w1_t[1] ^ w0_t[3]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w0_t[3]); + w1_t[0] = rotl32 ((w0_t[1] ^ w3_t[0] ^ w1_t[2] ^ w1_t[0]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1_t[0]); + w1_t[1] = rotl32 ((w0_t[2] ^ w3_t[1] ^ w1_t[3] ^ w1_t[1]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w1_t[1]); + w1_t[2] = rotl32 ((w0_t[3] ^ w3_t[2] ^ w2_t[0] ^ w1_t[2]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w1_t[2]); + w1_t[3] = rotl32 ((w1_t[0] ^ w3_t[3] ^ w2_t[1] ^ w1_t[3]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w1_t[3]); + w2_t[0] = rotl32 ((w1_t[1] ^ w0_t[0] ^ w2_t[2] ^ w2_t[0]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w2_t[0]); + w2_t[1] = rotl32 ((w1_t[2] ^ w0_t[1] ^ w2_t[3] ^ w2_t[1]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w2_t[1]); + w2_t[2] = rotl32 ((w1_t[3] ^ w0_t[2] ^ w3_t[0] ^ w2_t[2]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w2_t[2]); + w2_t[3] = rotl32 ((w2_t[0] ^ w0_t[3] ^ w3_t[1] ^ w2_t[3]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w2_t[3]); + w3_t[0] = rotl32 ((w2_t[1] ^ w1_t[0] ^ w3_t[2] ^ w3_t[0]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w3_t[0]); + w3_t[1] = rotl32 ((w2_t[2] ^ w1_t[1] ^ w3_t[3] ^ w3_t[1]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w3_t[1]); + w3_t[2] = rotl32 ((w2_t[3] ^ w1_t[2] ^ w0_t[0] ^ w3_t[2]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w3_t[2]); + w3_t[3] = rotl32 ((w3_t[0] ^ w1_t[3] ^ w0_t[1] ^ w3_t[3]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w3_t[3]); + + + const u32x r0 = d; + const u32x r1 = e; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_M + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m00140_m08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m00140_m16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m00140_s04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + u32x pw_buf1[4]; + + pw_buf1[0] = pws[gid].i[ 4]; + pw_buf1[1] = pws[gid].i[ 5]; + pw_buf1[2] = pws[gid].i[ 6]; + pw_buf1[3] = pws[gid].i[ 7]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[7]; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * reverse + */ + + const u32 e_rev = rotl32 (search[1], 2u); + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + + w0[0] = pw_buf0[0]; + w0[1] = pw_buf0[1]; + w0[2] = pw_buf0[2]; + w0[3] = pw_buf0[3]; + + u32x w1[4]; + + w1[0] = pw_buf1[0]; + w1[1] = pw_buf1[1]; + w1[2] = pw_buf1[2]; + w1[3] = pw_buf1[3]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 out_len = apply_rules (c_rules[il_pos].cmds, w0, w1, pw_len); + + /** + * prepend salt + */ + + const u32 out_salt_len = (out_len * 2) + salt_len; + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + make_unicode (w0, w0_t, w1_t); + make_unicode (w1, w2_t, w3_t); + + switch_buffer_by_offset (w0_t, w1_t, w2_t, w3_t, salt_len); + + w0_t[0] |= salt_buf0[0]; + w0_t[1] |= salt_buf0[1]; + w0_t[2] |= salt_buf0[2]; + w0_t[3] |= salt_buf0[3]; + w1_t[0] |= salt_buf1[0]; + w1_t[1] |= salt_buf1[1]; + w1_t[2] |= salt_buf1[2]; + w1_t[3] |= salt_buf1[3]; + + append_0x80_4 (w0_t, w1_t, w2_t, w3_t, out_salt_len); + + w3_t[3] = out_salt_len * 8; + + /** + * sha1 + */ + + w0_t[0] = swap_workaround (w0_t[0]); + w0_t[1] = swap_workaround (w0_t[1]); + w0_t[2] = swap_workaround (w0_t[2]); + w0_t[3] = swap_workaround (w0_t[3]); + w1_t[0] = swap_workaround (w1_t[0]); + w1_t[1] = swap_workaround (w1_t[1]); + w1_t[2] = swap_workaround (w1_t[2]); + w1_t[3] = swap_workaround (w1_t[3]); + w2_t[0] = swap_workaround (w2_t[0]); + w2_t[1] = swap_workaround (w2_t[1]); + w2_t[2] = swap_workaround (w2_t[2]); + w2_t[3] = swap_workaround (w2_t[3]); + w3_t[0] = swap_workaround (w3_t[0]); + w3_t[1] = swap_workaround (w3_t[1]); + //w3_t[2] = swap_workaround (w3_t[2]); + //w3_t[3] = swap_workaround (w3_t[3]); + + u32x a = SHA1M_A; + u32x b = SHA1M_B; + u32x c = SHA1M_C; + u32x d = SHA1M_D; + u32x e = SHA1M_E; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w0_t[0]); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w0_t[1]); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w0_t[2]); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w0_t[3]); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w1_t[0]); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w1_t[1]); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w1_t[2]); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w1_t[3]); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w2_t[0]); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w2_t[1]); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w2_t[2]); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w2_t[3]); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w3_t[0]); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w3_t[1]); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w3_t[2]); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w3_t[3]); + w0_t[0] = rotl32 ((w3_t[1] ^ w2_t[0] ^ w0_t[2] ^ w0_t[0]), 1u); SHA1_STEP (SHA1_F0o, e, a, b, c, d, w0_t[0]); + w0_t[1] = rotl32 ((w3_t[2] ^ w2_t[1] ^ w0_t[3] ^ w0_t[1]), 1u); SHA1_STEP (SHA1_F0o, d, e, a, b, c, w0_t[1]); + w0_t[2] = rotl32 ((w3_t[3] ^ w2_t[2] ^ w1_t[0] ^ w0_t[2]), 1u); SHA1_STEP (SHA1_F0o, c, d, e, a, b, w0_t[2]); + w0_t[3] = rotl32 ((w0_t[0] ^ w2_t[3] ^ w1_t[1] ^ w0_t[3]), 1u); SHA1_STEP (SHA1_F0o, b, c, d, e, a, w0_t[3]); + + #undef K + #define K SHA1C01 + + w1_t[0] = rotl32 ((w0_t[1] ^ w3_t[0] ^ w1_t[2] ^ w1_t[0]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w1_t[0]); + w1_t[1] = rotl32 ((w0_t[2] ^ w3_t[1] ^ w1_t[3] ^ w1_t[1]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w1_t[1]); + w1_t[2] = rotl32 ((w0_t[3] ^ w3_t[2] ^ w2_t[0] ^ w1_t[2]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w1_t[2]); + w1_t[3] = rotl32 ((w1_t[0] ^ w3_t[3] ^ w2_t[1] ^ w1_t[3]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1_t[3]); + w2_t[0] = rotl32 ((w1_t[1] ^ w0_t[0] ^ w2_t[2] ^ w2_t[0]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w2_t[0]); + w2_t[1] = rotl32 ((w1_t[2] ^ w0_t[1] ^ w2_t[3] ^ w2_t[1]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w2_t[1]); + w2_t[2] = rotl32 ((w1_t[3] ^ w0_t[2] ^ w3_t[0] ^ w2_t[2]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w2_t[2]); + w2_t[3] = rotl32 ((w2_t[0] ^ w0_t[3] ^ w3_t[1] ^ w2_t[3]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w2_t[3]); + w3_t[0] = rotl32 ((w2_t[1] ^ w1_t[0] ^ w3_t[2] ^ w3_t[0]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w3_t[0]); + w3_t[1] = rotl32 ((w2_t[2] ^ w1_t[1] ^ w3_t[3] ^ w3_t[1]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w3_t[1]); + w3_t[2] = rotl32 ((w2_t[3] ^ w1_t[2] ^ w0_t[0] ^ w3_t[2]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w3_t[2]); + w3_t[3] = rotl32 ((w3_t[0] ^ w1_t[3] ^ w0_t[1] ^ w3_t[3]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w3_t[3]); + w0_t[0] = rotl32 ((w3_t[1] ^ w2_t[0] ^ w0_t[2] ^ w0_t[0]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w0_t[0]); + w0_t[1] = rotl32 ((w3_t[2] ^ w2_t[1] ^ w0_t[3] ^ w0_t[1]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w0_t[1]); + w0_t[2] = rotl32 ((w3_t[3] ^ w2_t[2] ^ w1_t[0] ^ w0_t[2]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w0_t[2]); + w0_t[3] = rotl32 ((w0_t[0] ^ w2_t[3] ^ w1_t[1] ^ w0_t[3]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w0_t[3]); + w1_t[0] = rotl32 ((w0_t[1] ^ w3_t[0] ^ w1_t[2] ^ w1_t[0]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w1_t[0]); + w1_t[1] = rotl32 ((w0_t[2] ^ w3_t[1] ^ w1_t[3] ^ w1_t[1]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w1_t[1]); + w1_t[2] = rotl32 ((w0_t[3] ^ w3_t[2] ^ w2_t[0] ^ w1_t[2]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1_t[2]); + w1_t[3] = rotl32 ((w1_t[0] ^ w3_t[3] ^ w2_t[1] ^ w1_t[3]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w1_t[3]); + + #undef K + #define K SHA1C02 + + w2_t[0] = rotl32 ((w1_t[1] ^ w0_t[0] ^ w2_t[2] ^ w2_t[0]), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w2_t[0]); + w2_t[1] = rotl32 ((w1_t[2] ^ w0_t[1] ^ w2_t[3] ^ w2_t[1]), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w2_t[1]); + w2_t[2] = rotl32 ((w1_t[3] ^ w0_t[2] ^ w3_t[0] ^ w2_t[2]), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w2_t[2]); + w2_t[3] = rotl32 ((w2_t[0] ^ w0_t[3] ^ w3_t[1] ^ w2_t[3]), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w2_t[3]); + w3_t[0] = rotl32 ((w2_t[1] ^ w1_t[0] ^ w3_t[2] ^ w3_t[0]), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w3_t[0]); + w3_t[1] = rotl32 ((w2_t[2] ^ w1_t[1] ^ w3_t[3] ^ w3_t[1]), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w3_t[1]); + w3_t[2] = rotl32 ((w2_t[3] ^ w1_t[2] ^ w0_t[0] ^ w3_t[2]), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w3_t[2]); + w3_t[3] = rotl32 ((w3_t[0] ^ w1_t[3] ^ w0_t[1] ^ w3_t[3]), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w3_t[3]); + w0_t[0] = rotl32 ((w3_t[1] ^ w2_t[0] ^ w0_t[2] ^ w0_t[0]), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w0_t[0]); + w0_t[1] = rotl32 ((w3_t[2] ^ w2_t[1] ^ w0_t[3] ^ w0_t[1]), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w0_t[1]); + w0_t[2] = rotl32 ((w3_t[3] ^ w2_t[2] ^ w1_t[0] ^ w0_t[2]), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w0_t[2]); + w0_t[3] = rotl32 ((w0_t[0] ^ w2_t[3] ^ w1_t[1] ^ w0_t[3]), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w0_t[3]); + w1_t[0] = rotl32 ((w0_t[1] ^ w3_t[0] ^ w1_t[2] ^ w1_t[0]), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w1_t[0]); + w1_t[1] = rotl32 ((w0_t[2] ^ w3_t[1] ^ w1_t[3] ^ w1_t[1]), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w1_t[1]); + w1_t[2] = rotl32 ((w0_t[3] ^ w3_t[2] ^ w2_t[0] ^ w1_t[2]), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w1_t[2]); + w1_t[3] = rotl32 ((w1_t[0] ^ w3_t[3] ^ w2_t[1] ^ w1_t[3]), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w1_t[3]); + w2_t[0] = rotl32 ((w1_t[1] ^ w0_t[0] ^ w2_t[2] ^ w2_t[0]), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w2_t[0]); + w2_t[1] = rotl32 ((w1_t[2] ^ w0_t[1] ^ w2_t[3] ^ w2_t[1]), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w2_t[1]); + w2_t[2] = rotl32 ((w1_t[3] ^ w0_t[2] ^ w3_t[0] ^ w2_t[2]), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w2_t[2]); + w2_t[3] = rotl32 ((w2_t[0] ^ w0_t[3] ^ w3_t[1] ^ w2_t[3]), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w2_t[3]); + + #undef K + #define K SHA1C03 + + w3_t[0] = rotl32 ((w2_t[1] ^ w1_t[0] ^ w3_t[2] ^ w3_t[0]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w3_t[0]); + w3_t[1] = rotl32 ((w2_t[2] ^ w1_t[1] ^ w3_t[3] ^ w3_t[1]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w3_t[1]); + w3_t[2] = rotl32 ((w2_t[3] ^ w1_t[2] ^ w0_t[0] ^ w3_t[2]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w3_t[2]); + w3_t[3] = rotl32 ((w3_t[0] ^ w1_t[3] ^ w0_t[1] ^ w3_t[3]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w3_t[3]); + w0_t[0] = rotl32 ((w3_t[1] ^ w2_t[0] ^ w0_t[2] ^ w0_t[0]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w0_t[0]); + w0_t[1] = rotl32 ((w3_t[2] ^ w2_t[1] ^ w0_t[3] ^ w0_t[1]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w0_t[1]); + w0_t[2] = rotl32 ((w3_t[3] ^ w2_t[2] ^ w1_t[0] ^ w0_t[2]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w0_t[2]); + w0_t[3] = rotl32 ((w0_t[0] ^ w2_t[3] ^ w1_t[1] ^ w0_t[3]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w0_t[3]); + w1_t[0] = rotl32 ((w0_t[1] ^ w3_t[0] ^ w1_t[2] ^ w1_t[0]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1_t[0]); + w1_t[1] = rotl32 ((w0_t[2] ^ w3_t[1] ^ w1_t[3] ^ w1_t[1]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w1_t[1]); + w1_t[2] = rotl32 ((w0_t[3] ^ w3_t[2] ^ w2_t[0] ^ w1_t[2]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w1_t[2]); + w1_t[3] = rotl32 ((w1_t[0] ^ w3_t[3] ^ w2_t[1] ^ w1_t[3]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w1_t[3]); + w2_t[0] = rotl32 ((w1_t[1] ^ w0_t[0] ^ w2_t[2] ^ w2_t[0]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w2_t[0]); + w2_t[1] = rotl32 ((w1_t[2] ^ w0_t[1] ^ w2_t[3] ^ w2_t[1]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w2_t[1]); + w2_t[2] = rotl32 ((w1_t[3] ^ w0_t[2] ^ w3_t[0] ^ w2_t[2]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w2_t[2]); + w2_t[3] = rotl32 ((w2_t[0] ^ w0_t[3] ^ w3_t[1] ^ w2_t[3]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w2_t[3]); + w3_t[0] = rotl32 ((w2_t[1] ^ w1_t[0] ^ w3_t[2] ^ w3_t[0]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w3_t[0]); + + if (e != e_rev) continue; + + w3_t[1] = rotl32 ((w2_t[2] ^ w1_t[1] ^ w3_t[3] ^ w3_t[1]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w3_t[1]); + w3_t[2] = rotl32 ((w2_t[3] ^ w1_t[2] ^ w0_t[0] ^ w3_t[2]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w3_t[2]); + w3_t[3] = rotl32 ((w3_t[0] ^ w1_t[3] ^ w0_t[1] ^ w3_t[3]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w3_t[3]); + + + const u32x r0 = d; + const u32x r1 = e; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_S + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m00140_s08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m00140_s16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/nv/m00140_a1.cu b/nv/m00140_a1.cu new file mode 100644 index 0000000000..a56cee51f2 --- /dev/null +++ b/nv/m00140_a1.cu @@ -0,0 +1,676 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _SHA1_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW2 +#define VECT_SIZE4 +#endif + +#define DGST_R0 3 +#define DGST_R1 4 +#define DGST_R2 2 +#define DGST_R3 1 + +#include "include/kernel_functions.c" +#include "types_nv.c" +#include "common_nv.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +__device__ __constant__ comb_t c_combs[1024]; + +extern "C" __global__ void __launch_bounds__ (256, 1) m00140_m04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, c_combs[0].pw_len); + } + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[7]; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = c_combs[il_pos].pw_len; + + const u32 pw_len = pw_l_len + pw_r_len; + + u32 wordr0[4]; + + wordr0[0] = c_combs[il_pos].i[0]; + wordr0[1] = c_combs[il_pos].i[1]; + wordr0[2] = c_combs[il_pos].i[2]; + wordr0[3] = c_combs[il_pos].i[3]; + + u32 wordr1[4]; + + wordr1[0] = c_combs[il_pos].i[4]; + wordr1[1] = c_combs[il_pos].i[5]; + wordr1[2] = c_combs[il_pos].i[6]; + wordr1[3] = c_combs[il_pos].i[7]; + + u32 wordr2[4]; + + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + + u32 wordr3[4]; + + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + /** + * prepend salt + */ + + const u32 pw_salt_len = (pw_len * 2) + salt_len; + + u32x w0[4]; + u32x w1[4]; + u32x w2[4]; + u32x w3[4]; + + w0[0] = wordl0[0] | wordr0[0]; + w0[1] = wordl0[1] | wordr0[1]; + w0[2] = wordl0[2] | wordr0[2]; + w0[3] = wordl0[3] | wordr0[3]; + w1[0] = wordl1[0] | wordr1[0]; + w1[1] = wordl1[1] | wordr1[1]; + w1[2] = wordl1[2] | wordr1[2]; + w1[3] = wordl1[3] | wordr1[3]; + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + make_unicode (w0, w0_t, w1_t); + make_unicode (w1, w2_t, w3_t); + + switch_buffer_by_offset (w0_t, w1_t, w2_t, w3_t, salt_len); + + w0_t[0] |= salt_buf0[0]; + w0_t[1] |= salt_buf0[1]; + w0_t[2] |= salt_buf0[2]; + w0_t[3] |= salt_buf0[3]; + w1_t[0] |= salt_buf1[0]; + w1_t[1] |= salt_buf1[1]; + w1_t[2] |= salt_buf1[2]; + w1_t[3] |= salt_buf1[3]; + + append_0x80_4 (w0_t, w1_t, w2_t, w3_t, pw_salt_len); + + w3_t[3] = pw_salt_len * 8; + + /** + * sha1 + */ + + w0_t[0] = swap_workaround (w0_t[0]); + w0_t[1] = swap_workaround (w0_t[1]); + w0_t[2] = swap_workaround (w0_t[2]); + w0_t[3] = swap_workaround (w0_t[3]); + w1_t[0] = swap_workaround (w1_t[0]); + w1_t[1] = swap_workaround (w1_t[1]); + w1_t[2] = swap_workaround (w1_t[2]); + w1_t[3] = swap_workaround (w1_t[3]); + w2_t[0] = swap_workaround (w2_t[0]); + w2_t[1] = swap_workaround (w2_t[1]); + w2_t[2] = swap_workaround (w2_t[2]); + w2_t[3] = swap_workaround (w2_t[3]); + w3_t[0] = swap_workaround (w3_t[0]); + w3_t[1] = swap_workaround (w3_t[1]); + //w3_t[2] = swap_workaround (w3_t[2]); + //w3_t[3] = swap_workaround (w3_t[3]); + + u32x a = SHA1M_A; + u32x b = SHA1M_B; + u32x c = SHA1M_C; + u32x d = SHA1M_D; + u32x e = SHA1M_E; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w0_t[0]); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w0_t[1]); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w0_t[2]); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w0_t[3]); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w1_t[0]); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w1_t[1]); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w1_t[2]); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w1_t[3]); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w2_t[0]); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w2_t[1]); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w2_t[2]); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w2_t[3]); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w3_t[0]); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w3_t[1]); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w3_t[2]); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w3_t[3]); + w0_t[0] = rotl32 ((w3_t[1] ^ w2_t[0] ^ w0_t[2] ^ w0_t[0]), 1u); SHA1_STEP (SHA1_F0o, e, a, b, c, d, w0_t[0]); + w0_t[1] = rotl32 ((w3_t[2] ^ w2_t[1] ^ w0_t[3] ^ w0_t[1]), 1u); SHA1_STEP (SHA1_F0o, d, e, a, b, c, w0_t[1]); + w0_t[2] = rotl32 ((w3_t[3] ^ w2_t[2] ^ w1_t[0] ^ w0_t[2]), 1u); SHA1_STEP (SHA1_F0o, c, d, e, a, b, w0_t[2]); + w0_t[3] = rotl32 ((w0_t[0] ^ w2_t[3] ^ w1_t[1] ^ w0_t[3]), 1u); SHA1_STEP (SHA1_F0o, b, c, d, e, a, w0_t[3]); + + #undef K + #define K SHA1C01 + + w1_t[0] = rotl32 ((w0_t[1] ^ w3_t[0] ^ w1_t[2] ^ w1_t[0]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w1_t[0]); + w1_t[1] = rotl32 ((w0_t[2] ^ w3_t[1] ^ w1_t[3] ^ w1_t[1]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w1_t[1]); + w1_t[2] = rotl32 ((w0_t[3] ^ w3_t[2] ^ w2_t[0] ^ w1_t[2]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w1_t[2]); + w1_t[3] = rotl32 ((w1_t[0] ^ w3_t[3] ^ w2_t[1] ^ w1_t[3]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1_t[3]); + w2_t[0] = rotl32 ((w1_t[1] ^ w0_t[0] ^ w2_t[2] ^ w2_t[0]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w2_t[0]); + w2_t[1] = rotl32 ((w1_t[2] ^ w0_t[1] ^ w2_t[3] ^ w2_t[1]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w2_t[1]); + w2_t[2] = rotl32 ((w1_t[3] ^ w0_t[2] ^ w3_t[0] ^ w2_t[2]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w2_t[2]); + w2_t[3] = rotl32 ((w2_t[0] ^ w0_t[3] ^ w3_t[1] ^ w2_t[3]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w2_t[3]); + w3_t[0] = rotl32 ((w2_t[1] ^ w1_t[0] ^ w3_t[2] ^ w3_t[0]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w3_t[0]); + w3_t[1] = rotl32 ((w2_t[2] ^ w1_t[1] ^ w3_t[3] ^ w3_t[1]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w3_t[1]); + w3_t[2] = rotl32 ((w2_t[3] ^ w1_t[2] ^ w0_t[0] ^ w3_t[2]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w3_t[2]); + w3_t[3] = rotl32 ((w3_t[0] ^ w1_t[3] ^ w0_t[1] ^ w3_t[3]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w3_t[3]); + w0_t[0] = rotl32 ((w3_t[1] ^ w2_t[0] ^ w0_t[2] ^ w0_t[0]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w0_t[0]); + w0_t[1] = rotl32 ((w3_t[2] ^ w2_t[1] ^ w0_t[3] ^ w0_t[1]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w0_t[1]); + w0_t[2] = rotl32 ((w3_t[3] ^ w2_t[2] ^ w1_t[0] ^ w0_t[2]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w0_t[2]); + w0_t[3] = rotl32 ((w0_t[0] ^ w2_t[3] ^ w1_t[1] ^ w0_t[3]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w0_t[3]); + w1_t[0] = rotl32 ((w0_t[1] ^ w3_t[0] ^ w1_t[2] ^ w1_t[0]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w1_t[0]); + w1_t[1] = rotl32 ((w0_t[2] ^ w3_t[1] ^ w1_t[3] ^ w1_t[1]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w1_t[1]); + w1_t[2] = rotl32 ((w0_t[3] ^ w3_t[2] ^ w2_t[0] ^ w1_t[2]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1_t[2]); + w1_t[3] = rotl32 ((w1_t[0] ^ w3_t[3] ^ w2_t[1] ^ w1_t[3]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w1_t[3]); + + #undef K + #define K SHA1C02 + + w2_t[0] = rotl32 ((w1_t[1] ^ w0_t[0] ^ w2_t[2] ^ w2_t[0]), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w2_t[0]); + w2_t[1] = rotl32 ((w1_t[2] ^ w0_t[1] ^ w2_t[3] ^ w2_t[1]), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w2_t[1]); + w2_t[2] = rotl32 ((w1_t[3] ^ w0_t[2] ^ w3_t[0] ^ w2_t[2]), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w2_t[2]); + w2_t[3] = rotl32 ((w2_t[0] ^ w0_t[3] ^ w3_t[1] ^ w2_t[3]), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w2_t[3]); + w3_t[0] = rotl32 ((w2_t[1] ^ w1_t[0] ^ w3_t[2] ^ w3_t[0]), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w3_t[0]); + w3_t[1] = rotl32 ((w2_t[2] ^ w1_t[1] ^ w3_t[3] ^ w3_t[1]), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w3_t[1]); + w3_t[2] = rotl32 ((w2_t[3] ^ w1_t[2] ^ w0_t[0] ^ w3_t[2]), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w3_t[2]); + w3_t[3] = rotl32 ((w3_t[0] ^ w1_t[3] ^ w0_t[1] ^ w3_t[3]), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w3_t[3]); + w0_t[0] = rotl32 ((w3_t[1] ^ w2_t[0] ^ w0_t[2] ^ w0_t[0]), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w0_t[0]); + w0_t[1] = rotl32 ((w3_t[2] ^ w2_t[1] ^ w0_t[3] ^ w0_t[1]), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w0_t[1]); + w0_t[2] = rotl32 ((w3_t[3] ^ w2_t[2] ^ w1_t[0] ^ w0_t[2]), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w0_t[2]); + w0_t[3] = rotl32 ((w0_t[0] ^ w2_t[3] ^ w1_t[1] ^ w0_t[3]), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w0_t[3]); + w1_t[0] = rotl32 ((w0_t[1] ^ w3_t[0] ^ w1_t[2] ^ w1_t[0]), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w1_t[0]); + w1_t[1] = rotl32 ((w0_t[2] ^ w3_t[1] ^ w1_t[3] ^ w1_t[1]), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w1_t[1]); + w1_t[2] = rotl32 ((w0_t[3] ^ w3_t[2] ^ w2_t[0] ^ w1_t[2]), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w1_t[2]); + w1_t[3] = rotl32 ((w1_t[0] ^ w3_t[3] ^ w2_t[1] ^ w1_t[3]), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w1_t[3]); + w2_t[0] = rotl32 ((w1_t[1] ^ w0_t[0] ^ w2_t[2] ^ w2_t[0]), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w2_t[0]); + w2_t[1] = rotl32 ((w1_t[2] ^ w0_t[1] ^ w2_t[3] ^ w2_t[1]), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w2_t[1]); + w2_t[2] = rotl32 ((w1_t[3] ^ w0_t[2] ^ w3_t[0] ^ w2_t[2]), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w2_t[2]); + w2_t[3] = rotl32 ((w2_t[0] ^ w0_t[3] ^ w3_t[1] ^ w2_t[3]), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w2_t[3]); + + #undef K + #define K SHA1C03 + + w3_t[0] = rotl32 ((w2_t[1] ^ w1_t[0] ^ w3_t[2] ^ w3_t[0]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w3_t[0]); + w3_t[1] = rotl32 ((w2_t[2] ^ w1_t[1] ^ w3_t[3] ^ w3_t[1]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w3_t[1]); + w3_t[2] = rotl32 ((w2_t[3] ^ w1_t[2] ^ w0_t[0] ^ w3_t[2]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w3_t[2]); + w3_t[3] = rotl32 ((w3_t[0] ^ w1_t[3] ^ w0_t[1] ^ w3_t[3]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w3_t[3]); + w0_t[0] = rotl32 ((w3_t[1] ^ w2_t[0] ^ w0_t[2] ^ w0_t[0]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w0_t[0]); + w0_t[1] = rotl32 ((w3_t[2] ^ w2_t[1] ^ w0_t[3] ^ w0_t[1]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w0_t[1]); + w0_t[2] = rotl32 ((w3_t[3] ^ w2_t[2] ^ w1_t[0] ^ w0_t[2]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w0_t[2]); + w0_t[3] = rotl32 ((w0_t[0] ^ w2_t[3] ^ w1_t[1] ^ w0_t[3]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w0_t[3]); + w1_t[0] = rotl32 ((w0_t[1] ^ w3_t[0] ^ w1_t[2] ^ w1_t[0]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1_t[0]); + w1_t[1] = rotl32 ((w0_t[2] ^ w3_t[1] ^ w1_t[3] ^ w1_t[1]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w1_t[1]); + w1_t[2] = rotl32 ((w0_t[3] ^ w3_t[2] ^ w2_t[0] ^ w1_t[2]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w1_t[2]); + w1_t[3] = rotl32 ((w1_t[0] ^ w3_t[3] ^ w2_t[1] ^ w1_t[3]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w1_t[3]); + w2_t[0] = rotl32 ((w1_t[1] ^ w0_t[0] ^ w2_t[2] ^ w2_t[0]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w2_t[0]); + w2_t[1] = rotl32 ((w1_t[2] ^ w0_t[1] ^ w2_t[3] ^ w2_t[1]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w2_t[1]); + w2_t[2] = rotl32 ((w1_t[3] ^ w0_t[2] ^ w3_t[0] ^ w2_t[2]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w2_t[2]); + w2_t[3] = rotl32 ((w2_t[0] ^ w0_t[3] ^ w3_t[1] ^ w2_t[3]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w2_t[3]); + w3_t[0] = rotl32 ((w2_t[1] ^ w1_t[0] ^ w3_t[2] ^ w3_t[0]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w3_t[0]); + w3_t[1] = rotl32 ((w2_t[2] ^ w1_t[1] ^ w3_t[3] ^ w3_t[1]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w3_t[1]); + w3_t[2] = rotl32 ((w2_t[3] ^ w1_t[2] ^ w0_t[0] ^ w3_t[2]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w3_t[2]); + w3_t[3] = rotl32 ((w3_t[0] ^ w1_t[3] ^ w0_t[1] ^ w3_t[3]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w3_t[3]); + + + const u32x r0 = d; + const u32x r1 = e; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_M + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m00140_m08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m00140_m16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m00140_s04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, c_combs[0].pw_len); + } + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[7]; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * reverse + */ + + const u32 e_rev = rotl32 (search[1], 2u); + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = c_combs[il_pos].pw_len; + + const u32 pw_len = pw_l_len + pw_r_len; + + u32 wordr0[4]; + + wordr0[0] = c_combs[il_pos].i[0]; + wordr0[1] = c_combs[il_pos].i[1]; + wordr0[2] = c_combs[il_pos].i[2]; + wordr0[3] = c_combs[il_pos].i[3]; + + u32 wordr1[4]; + + wordr1[0] = c_combs[il_pos].i[4]; + wordr1[1] = c_combs[il_pos].i[5]; + wordr1[2] = c_combs[il_pos].i[6]; + wordr1[3] = c_combs[il_pos].i[7]; + + u32 wordr2[4]; + + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + + u32 wordr3[4]; + + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + /** + * prepend salt + */ + + const u32 pw_salt_len = (pw_len * 2) + salt_len; + + u32x w0[4]; + u32x w1[4]; + u32x w2[4]; + u32x w3[4]; + + w0[0] = wordl0[0] | wordr0[0]; + w0[1] = wordl0[1] | wordr0[1]; + w0[2] = wordl0[2] | wordr0[2]; + w0[3] = wordl0[3] | wordr0[3]; + w1[0] = wordl1[0] | wordr1[0]; + w1[1] = wordl1[1] | wordr1[1]; + w1[2] = wordl1[2] | wordr1[2]; + w1[3] = wordl1[3] | wordr1[3]; + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + make_unicode (w0, w0_t, w1_t); + make_unicode (w1, w2_t, w3_t); + + switch_buffer_by_offset (w0_t, w1_t, w2_t, w3_t, salt_len); + + w0_t[0] |= salt_buf0[0]; + w0_t[1] |= salt_buf0[1]; + w0_t[2] |= salt_buf0[2]; + w0_t[3] |= salt_buf0[3]; + w1_t[0] |= salt_buf1[0]; + w1_t[1] |= salt_buf1[1]; + w1_t[2] |= salt_buf1[2]; + w1_t[3] |= salt_buf1[3]; + + append_0x80_4 (w0_t, w1_t, w2_t, w3_t, pw_salt_len); + + w3_t[3] = pw_salt_len * 8; + + /** + * sha1 + */ + + w0_t[0] = swap_workaround (w0_t[0]); + w0_t[1] = swap_workaround (w0_t[1]); + w0_t[2] = swap_workaround (w0_t[2]); + w0_t[3] = swap_workaround (w0_t[3]); + w1_t[0] = swap_workaround (w1_t[0]); + w1_t[1] = swap_workaround (w1_t[1]); + w1_t[2] = swap_workaround (w1_t[2]); + w1_t[3] = swap_workaround (w1_t[3]); + w2_t[0] = swap_workaround (w2_t[0]); + w2_t[1] = swap_workaround (w2_t[1]); + w2_t[2] = swap_workaround (w2_t[2]); + w2_t[3] = swap_workaround (w2_t[3]); + w3_t[0] = swap_workaround (w3_t[0]); + w3_t[1] = swap_workaround (w3_t[1]); + //w3_t[2] = swap_workaround (w3_t[2]); + //w3_t[3] = swap_workaround (w3_t[3]); + + u32x a = SHA1M_A; + u32x b = SHA1M_B; + u32x c = SHA1M_C; + u32x d = SHA1M_D; + u32x e = SHA1M_E; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w0_t[0]); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w0_t[1]); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w0_t[2]); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w0_t[3]); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w1_t[0]); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w1_t[1]); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w1_t[2]); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w1_t[3]); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w2_t[0]); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w2_t[1]); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w2_t[2]); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w2_t[3]); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w3_t[0]); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w3_t[1]); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w3_t[2]); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w3_t[3]); + w0_t[0] = rotl32 ((w3_t[1] ^ w2_t[0] ^ w0_t[2] ^ w0_t[0]), 1u); SHA1_STEP (SHA1_F0o, e, a, b, c, d, w0_t[0]); + w0_t[1] = rotl32 ((w3_t[2] ^ w2_t[1] ^ w0_t[3] ^ w0_t[1]), 1u); SHA1_STEP (SHA1_F0o, d, e, a, b, c, w0_t[1]); + w0_t[2] = rotl32 ((w3_t[3] ^ w2_t[2] ^ w1_t[0] ^ w0_t[2]), 1u); SHA1_STEP (SHA1_F0o, c, d, e, a, b, w0_t[2]); + w0_t[3] = rotl32 ((w0_t[0] ^ w2_t[3] ^ w1_t[1] ^ w0_t[3]), 1u); SHA1_STEP (SHA1_F0o, b, c, d, e, a, w0_t[3]); + + #undef K + #define K SHA1C01 + + w1_t[0] = rotl32 ((w0_t[1] ^ w3_t[0] ^ w1_t[2] ^ w1_t[0]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w1_t[0]); + w1_t[1] = rotl32 ((w0_t[2] ^ w3_t[1] ^ w1_t[3] ^ w1_t[1]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w1_t[1]); + w1_t[2] = rotl32 ((w0_t[3] ^ w3_t[2] ^ w2_t[0] ^ w1_t[2]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w1_t[2]); + w1_t[3] = rotl32 ((w1_t[0] ^ w3_t[3] ^ w2_t[1] ^ w1_t[3]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1_t[3]); + w2_t[0] = rotl32 ((w1_t[1] ^ w0_t[0] ^ w2_t[2] ^ w2_t[0]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w2_t[0]); + w2_t[1] = rotl32 ((w1_t[2] ^ w0_t[1] ^ w2_t[3] ^ w2_t[1]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w2_t[1]); + w2_t[2] = rotl32 ((w1_t[3] ^ w0_t[2] ^ w3_t[0] ^ w2_t[2]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w2_t[2]); + w2_t[3] = rotl32 ((w2_t[0] ^ w0_t[3] ^ w3_t[1] ^ w2_t[3]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w2_t[3]); + w3_t[0] = rotl32 ((w2_t[1] ^ w1_t[0] ^ w3_t[2] ^ w3_t[0]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w3_t[0]); + w3_t[1] = rotl32 ((w2_t[2] ^ w1_t[1] ^ w3_t[3] ^ w3_t[1]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w3_t[1]); + w3_t[2] = rotl32 ((w2_t[3] ^ w1_t[2] ^ w0_t[0] ^ w3_t[2]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w3_t[2]); + w3_t[3] = rotl32 ((w3_t[0] ^ w1_t[3] ^ w0_t[1] ^ w3_t[3]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w3_t[3]); + w0_t[0] = rotl32 ((w3_t[1] ^ w2_t[0] ^ w0_t[2] ^ w0_t[0]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w0_t[0]); + w0_t[1] = rotl32 ((w3_t[2] ^ w2_t[1] ^ w0_t[3] ^ w0_t[1]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w0_t[1]); + w0_t[2] = rotl32 ((w3_t[3] ^ w2_t[2] ^ w1_t[0] ^ w0_t[2]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w0_t[2]); + w0_t[3] = rotl32 ((w0_t[0] ^ w2_t[3] ^ w1_t[1] ^ w0_t[3]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w0_t[3]); + w1_t[0] = rotl32 ((w0_t[1] ^ w3_t[0] ^ w1_t[2] ^ w1_t[0]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w1_t[0]); + w1_t[1] = rotl32 ((w0_t[2] ^ w3_t[1] ^ w1_t[3] ^ w1_t[1]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w1_t[1]); + w1_t[2] = rotl32 ((w0_t[3] ^ w3_t[2] ^ w2_t[0] ^ w1_t[2]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1_t[2]); + w1_t[3] = rotl32 ((w1_t[0] ^ w3_t[3] ^ w2_t[1] ^ w1_t[3]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w1_t[3]); + + #undef K + #define K SHA1C02 + + w2_t[0] = rotl32 ((w1_t[1] ^ w0_t[0] ^ w2_t[2] ^ w2_t[0]), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w2_t[0]); + w2_t[1] = rotl32 ((w1_t[2] ^ w0_t[1] ^ w2_t[3] ^ w2_t[1]), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w2_t[1]); + w2_t[2] = rotl32 ((w1_t[3] ^ w0_t[2] ^ w3_t[0] ^ w2_t[2]), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w2_t[2]); + w2_t[3] = rotl32 ((w2_t[0] ^ w0_t[3] ^ w3_t[1] ^ w2_t[3]), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w2_t[3]); + w3_t[0] = rotl32 ((w2_t[1] ^ w1_t[0] ^ w3_t[2] ^ w3_t[0]), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w3_t[0]); + w3_t[1] = rotl32 ((w2_t[2] ^ w1_t[1] ^ w3_t[3] ^ w3_t[1]), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w3_t[1]); + w3_t[2] = rotl32 ((w2_t[3] ^ w1_t[2] ^ w0_t[0] ^ w3_t[2]), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w3_t[2]); + w3_t[3] = rotl32 ((w3_t[0] ^ w1_t[3] ^ w0_t[1] ^ w3_t[3]), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w3_t[3]); + w0_t[0] = rotl32 ((w3_t[1] ^ w2_t[0] ^ w0_t[2] ^ w0_t[0]), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w0_t[0]); + w0_t[1] = rotl32 ((w3_t[2] ^ w2_t[1] ^ w0_t[3] ^ w0_t[1]), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w0_t[1]); + w0_t[2] = rotl32 ((w3_t[3] ^ w2_t[2] ^ w1_t[0] ^ w0_t[2]), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w0_t[2]); + w0_t[3] = rotl32 ((w0_t[0] ^ w2_t[3] ^ w1_t[1] ^ w0_t[3]), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w0_t[3]); + w1_t[0] = rotl32 ((w0_t[1] ^ w3_t[0] ^ w1_t[2] ^ w1_t[0]), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w1_t[0]); + w1_t[1] = rotl32 ((w0_t[2] ^ w3_t[1] ^ w1_t[3] ^ w1_t[1]), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w1_t[1]); + w1_t[2] = rotl32 ((w0_t[3] ^ w3_t[2] ^ w2_t[0] ^ w1_t[2]), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w1_t[2]); + w1_t[3] = rotl32 ((w1_t[0] ^ w3_t[3] ^ w2_t[1] ^ w1_t[3]), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w1_t[3]); + w2_t[0] = rotl32 ((w1_t[1] ^ w0_t[0] ^ w2_t[2] ^ w2_t[0]), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w2_t[0]); + w2_t[1] = rotl32 ((w1_t[2] ^ w0_t[1] ^ w2_t[3] ^ w2_t[1]), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w2_t[1]); + w2_t[2] = rotl32 ((w1_t[3] ^ w0_t[2] ^ w3_t[0] ^ w2_t[2]), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w2_t[2]); + w2_t[3] = rotl32 ((w2_t[0] ^ w0_t[3] ^ w3_t[1] ^ w2_t[3]), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w2_t[3]); + + #undef K + #define K SHA1C03 + + w3_t[0] = rotl32 ((w2_t[1] ^ w1_t[0] ^ w3_t[2] ^ w3_t[0]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w3_t[0]); + w3_t[1] = rotl32 ((w2_t[2] ^ w1_t[1] ^ w3_t[3] ^ w3_t[1]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w3_t[1]); + w3_t[2] = rotl32 ((w2_t[3] ^ w1_t[2] ^ w0_t[0] ^ w3_t[2]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w3_t[2]); + w3_t[3] = rotl32 ((w3_t[0] ^ w1_t[3] ^ w0_t[1] ^ w3_t[3]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w3_t[3]); + w0_t[0] = rotl32 ((w3_t[1] ^ w2_t[0] ^ w0_t[2] ^ w0_t[0]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w0_t[0]); + w0_t[1] = rotl32 ((w3_t[2] ^ w2_t[1] ^ w0_t[3] ^ w0_t[1]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w0_t[1]); + w0_t[2] = rotl32 ((w3_t[3] ^ w2_t[2] ^ w1_t[0] ^ w0_t[2]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w0_t[2]); + w0_t[3] = rotl32 ((w0_t[0] ^ w2_t[3] ^ w1_t[1] ^ w0_t[3]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w0_t[3]); + w1_t[0] = rotl32 ((w0_t[1] ^ w3_t[0] ^ w1_t[2] ^ w1_t[0]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1_t[0]); + w1_t[1] = rotl32 ((w0_t[2] ^ w3_t[1] ^ w1_t[3] ^ w1_t[1]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w1_t[1]); + w1_t[2] = rotl32 ((w0_t[3] ^ w3_t[2] ^ w2_t[0] ^ w1_t[2]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w1_t[2]); + w1_t[3] = rotl32 ((w1_t[0] ^ w3_t[3] ^ w2_t[1] ^ w1_t[3]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w1_t[3]); + w2_t[0] = rotl32 ((w1_t[1] ^ w0_t[0] ^ w2_t[2] ^ w2_t[0]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w2_t[0]); + w2_t[1] = rotl32 ((w1_t[2] ^ w0_t[1] ^ w2_t[3] ^ w2_t[1]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w2_t[1]); + w2_t[2] = rotl32 ((w1_t[3] ^ w0_t[2] ^ w3_t[0] ^ w2_t[2]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w2_t[2]); + w2_t[3] = rotl32 ((w2_t[0] ^ w0_t[3] ^ w3_t[1] ^ w2_t[3]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w2_t[3]); + w3_t[0] = rotl32 ((w2_t[1] ^ w1_t[0] ^ w3_t[2] ^ w3_t[0]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w3_t[0]); + + if (e != e_rev) continue; + + w3_t[1] = rotl32 ((w2_t[2] ^ w1_t[1] ^ w3_t[3] ^ w3_t[1]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w3_t[1]); + w3_t[2] = rotl32 ((w2_t[3] ^ w1_t[2] ^ w0_t[0] ^ w3_t[2]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w3_t[2]); + w3_t[3] = rotl32 ((w3_t[0] ^ w1_t[3] ^ w0_t[1] ^ w3_t[3]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w3_t[3]); + + + const u32x r0 = d; + const u32x r1 = e; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_S + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m00140_s08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m00140_s16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/nv/m00140_a3.cu b/nv/m00140_a3.cu new file mode 100644 index 0000000000..b94a99bedf --- /dev/null +++ b/nv/m00140_a3.cu @@ -0,0 +1,997 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _SHA1_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW2 +#define VECT_SIZE4 +#endif + +#define DGST_R0 3 +#define DGST_R1 4 +#define DGST_R2 2 +#define DGST_R3 1 + +#include "include/kernel_functions.c" +#include "types_nv.c" +#include "common_nv.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +__device__ __constant__ bf_t c_bfs[1024]; + +__device__ static void overwrite_at (u32x sw[16], const u32x w0, const u32 salt_len) +{ + switch (salt_len) + { + case 0: sw[0] = w0; + break; + case 1: sw[0] = (sw[0] & 0xff000000) | (w0 >> 8); + sw[1] = (sw[1] & 0x00ffffff) | (w0 << 24); + break; + case 2: sw[0] = (sw[0] & 0xffff0000) | (w0 >> 16); + sw[1] = (sw[1] & 0x0000ffff) | (w0 << 16); + break; + case 3: sw[0] = (sw[0] & 0xffffff00) | (w0 >> 24); + sw[1] = (sw[1] & 0x000000ff) | (w0 << 8); + break; + case 4: sw[1] = w0; + break; + case 5: sw[1] = (sw[1] & 0xff000000) | (w0 >> 8); + sw[2] = (sw[2] & 0x00ffffff) | (w0 << 24); + break; + case 6: sw[1] = (sw[1] & 0xffff0000) | (w0 >> 16); + sw[2] = (sw[2] & 0x0000ffff) | (w0 << 16); + break; + case 7: sw[1] = (sw[1] & 0xffffff00) | (w0 >> 24); + sw[2] = (sw[2] & 0x000000ff) | (w0 << 8); + break; + case 8: sw[2] = w0; + break; + case 9: sw[2] = (sw[2] & 0xff000000) | (w0 >> 8); + sw[3] = (sw[3] & 0x00ffffff) | (w0 << 24); + break; + case 10: sw[2] = (sw[2] & 0xffff0000) | (w0 >> 16); + sw[3] = (sw[3] & 0x0000ffff) | (w0 << 16); + break; + case 11: sw[2] = (sw[2] & 0xffffff00) | (w0 >> 24); + sw[3] = (sw[3] & 0x000000ff) | (w0 << 8); + break; + case 12: sw[3] = w0; + break; + case 13: sw[3] = (sw[3] & 0xff000000) | (w0 >> 8); + sw[4] = (sw[4] & 0x00ffffff) | (w0 << 24); + break; + case 14: sw[3] = (sw[3] & 0xffff0000) | (w0 >> 16); + sw[4] = (sw[4] & 0x0000ffff) | (w0 << 16); + break; + case 15: sw[3] = (sw[3] & 0xffffff00) | (w0 >> 24); + sw[4] = (sw[4] & 0x000000ff) | (w0 << 8); + break; + case 16: sw[4] = w0; + break; + case 17: sw[4] = (sw[4] & 0xff000000) | (w0 >> 8); + sw[5] = (sw[5] & 0x00ffffff) | (w0 << 24); + break; + case 18: sw[4] = (sw[4] & 0xffff0000) | (w0 >> 16); + sw[5] = (sw[5] & 0x0000ffff) | (w0 << 16); + break; + case 19: sw[4] = (sw[4] & 0xffffff00) | (w0 >> 24); + sw[5] = (sw[5] & 0x000000ff) | (w0 << 8); + break; + case 20: sw[5] = w0; + break; + case 21: sw[5] = (sw[5] & 0xff000000) | (w0 >> 8); + sw[6] = (sw[6] & 0x00ffffff) | (w0 << 24); + break; + case 22: sw[5] = (sw[5] & 0xffff0000) | (w0 >> 16); + sw[6] = (sw[6] & 0x0000ffff) | (w0 << 16); + break; + case 23: sw[5] = (sw[5] & 0xffffff00) | (w0 >> 24); + sw[6] = (sw[6] & 0x000000ff) | (w0 << 8); + break; + case 24: sw[6] = w0; + break; + case 25: sw[6] = (sw[6] & 0xff000000) | (w0 >> 8); + sw[7] = (sw[7] & 0x00ffffff) | (w0 << 24); + break; + case 26: sw[6] = (sw[6] & 0xffff0000) | (w0 >> 16); + sw[7] = (sw[7] & 0x0000ffff) | (w0 << 16); + break; + case 27: sw[6] = (sw[6] & 0xffffff00) | (w0 >> 24); + sw[7] = (sw[7] & 0x000000ff) | (w0 << 8); + break; + case 28: sw[7] = w0; + break; + case 29: sw[7] = (sw[7] & 0xff000000) | (w0 >> 8); + sw[8] = (sw[8] & 0x00ffffff) | (w0 << 24); + break; + case 30: sw[7] = (sw[7] & 0xffff0000) | (w0 >> 16); + sw[8] = (sw[8] & 0x0000ffff) | (w0 << 16); + break; + case 31: sw[7] = (sw[7] & 0xffffff00) | (w0 >> 24); + sw[8] = (sw[8] & 0x000000ff) | (w0 << 8); + break; + } +} + +__device__ static void m00140m (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], const u32 pw_len, const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset) +{ + /** + * modifier + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + const u32 lid = threadIdx.x; + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[ 1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[ 2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[ 3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[ 4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[ 5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[ 6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[ 7]; + + u32 salt_buf2[4]; + + salt_buf2[0] = 0; + salt_buf2[1] = 0; + salt_buf2[2] = 0; + salt_buf2[3] = 0; + + u32 salt_buf3[4]; + + salt_buf3[0] = 0; + salt_buf3[1] = 0; + salt_buf3[2] = 0; + salt_buf3[3] = 0; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + const u32 pw_salt_len = pw_len + salt_len; + + /** + * prepend salt + */ + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + w0_t[0] = swap_workaround (w0[0]); + w0_t[1] = swap_workaround (w0[1]); + w0_t[2] = swap_workaround (w0[2]); + w0_t[3] = swap_workaround (w0[3]); + w1_t[0] = swap_workaround (w1[0]); + w1_t[1] = swap_workaround (w1[1]); + w1_t[2] = swap_workaround (w1[2]); + w1_t[3] = swap_workaround (w1[3]); + w2_t[0] = swap_workaround (w2[0]); + w2_t[1] = swap_workaround (w2[1]); + w2_t[2] = swap_workaround (w2[2]); + w2_t[3] = swap_workaround (w2[3]); + w3_t[0] = swap_workaround (w3[0]); + w3_t[1] = swap_workaround (w3[1]); + w3_t[2] = swap_workaround (w3[2]); + w3_t[3] = swap_workaround (w3[3]); + + switch_buffer_by_offset (w0_t, w1_t, w2_t, w3_t, salt_len); + + w0_t[0] |= salt_buf0[0]; + w0_t[1] |= salt_buf0[1]; + w0_t[2] |= salt_buf0[2]; + w0_t[3] |= salt_buf0[3]; + w1_t[0] |= salt_buf1[0]; + w1_t[1] |= salt_buf1[1]; + w1_t[2] |= salt_buf1[2]; + w1_t[3] |= salt_buf1[3]; + w2_t[0] |= salt_buf2[0]; + w2_t[1] |= salt_buf2[1]; + w2_t[2] |= salt_buf2[2]; + w2_t[3] |= salt_buf2[3]; + w3_t[0] |= salt_buf3[0]; + w3_t[1] |= salt_buf3[1]; + w3_t[2] |= salt_buf3[2]; + w3_t[3] |= salt_buf3[3]; + + w0_t[0] = swap_workaround (w0_t[0]); + w0_t[1] = swap_workaround (w0_t[1]); + w0_t[2] = swap_workaround (w0_t[2]); + w0_t[3] = swap_workaround (w0_t[3]); + w1_t[0] = swap_workaround (w1_t[0]); + w1_t[1] = swap_workaround (w1_t[1]); + w1_t[2] = swap_workaround (w1_t[2]); + w1_t[3] = swap_workaround (w1_t[3]); + w2_t[0] = swap_workaround (w2_t[0]); + w2_t[1] = swap_workaround (w2_t[1]); + w2_t[2] = swap_workaround (w2_t[2]); + w2_t[3] = swap_workaround (w2_t[3]); + w3_t[0] = swap_workaround (w3_t[0]); + w3_t[1] = swap_workaround (w3_t[1]); + w3_t[2] = swap_workaround (w3_t[2]); + w3_t[3] = swap_workaround (w3_t[3]); + + /** + * loop + */ + + u32x w0l = w0[0]; + + for (u32 il_pos = 0; il_pos < bfs_cnt; il_pos++) + { + const u32 w0r = c_bfs[il_pos].i; + + const u32x w0n = w0l | w0r; + + u32x wx[16]; + + wx[ 0] = w0_t[0]; + wx[ 1] = w0_t[1]; + wx[ 2] = w0_t[2]; + wx[ 3] = w0_t[3]; + wx[ 4] = w1_t[0]; + wx[ 5] = w1_t[1]; + wx[ 6] = w1_t[2]; + wx[ 7] = w1_t[3]; + wx[ 8] = w2_t[0]; + wx[ 9] = w2_t[1]; + wx[10] = w2_t[2]; + wx[11] = w2_t[3]; + wx[12] = w3_t[0]; + wx[13] = w3_t[1]; + wx[14] = w3_t[2]; + wx[15] = w3_t[3]; + + overwrite_at (wx, w0n, salt_len); + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + w0_t[0] = wx[ 0]; + w0_t[1] = wx[ 1]; + w0_t[2] = wx[ 2]; + w0_t[3] = wx[ 3]; + w1_t[0] = wx[ 4]; + w1_t[1] = wx[ 5]; + w1_t[2] = wx[ 6]; + w1_t[3] = wx[ 7]; + w2_t[0] = wx[ 8]; + w2_t[1] = wx[ 9]; + w2_t[2] = wx[10]; + w2_t[3] = wx[11]; + w3_t[0] = wx[12]; + w3_t[1] = wx[13]; + w3_t[2] = 0; + w3_t[3] = pw_salt_len * 8; + + /** + * sha1 + */ + + u32x a = SHA1M_A; + u32x b = SHA1M_B; + u32x c = SHA1M_C; + u32x d = SHA1M_D; + u32x e = SHA1M_E; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w0_t[0]); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w0_t[1]); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w0_t[2]); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w0_t[3]); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w1_t[0]); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w1_t[1]); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w1_t[2]); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w1_t[3]); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w2_t[0]); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w2_t[1]); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w2_t[2]); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w2_t[3]); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w3_t[0]); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w3_t[1]); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w3_t[2]); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w3_t[3]); + w0_t[0] = rotl32 ((w3_t[1] ^ w2_t[0] ^ w0_t[2] ^ w0_t[0]), 1u); SHA1_STEP (SHA1_F0o, e, a, b, c, d, w0_t[0]); + w0_t[1] = rotl32 ((w3_t[2] ^ w2_t[1] ^ w0_t[3] ^ w0_t[1]), 1u); SHA1_STEP (SHA1_F0o, d, e, a, b, c, w0_t[1]); + w0_t[2] = rotl32 ((w3_t[3] ^ w2_t[2] ^ w1_t[0] ^ w0_t[2]), 1u); SHA1_STEP (SHA1_F0o, c, d, e, a, b, w0_t[2]); + w0_t[3] = rotl32 ((w0_t[0] ^ w2_t[3] ^ w1_t[1] ^ w0_t[3]), 1u); SHA1_STEP (SHA1_F0o, b, c, d, e, a, w0_t[3]); + + #undef K + #define K SHA1C01 + + w1_t[0] = rotl32 ((w0_t[1] ^ w3_t[0] ^ w1_t[2] ^ w1_t[0]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w1_t[0]); + w1_t[1] = rotl32 ((w0_t[2] ^ w3_t[1] ^ w1_t[3] ^ w1_t[1]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w1_t[1]); + w1_t[2] = rotl32 ((w0_t[3] ^ w3_t[2] ^ w2_t[0] ^ w1_t[2]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w1_t[2]); + w1_t[3] = rotl32 ((w1_t[0] ^ w3_t[3] ^ w2_t[1] ^ w1_t[3]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1_t[3]); + w2_t[0] = rotl32 ((w1_t[1] ^ w0_t[0] ^ w2_t[2] ^ w2_t[0]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w2_t[0]); + w2_t[1] = rotl32 ((w1_t[2] ^ w0_t[1] ^ w2_t[3] ^ w2_t[1]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w2_t[1]); + w2_t[2] = rotl32 ((w1_t[3] ^ w0_t[2] ^ w3_t[0] ^ w2_t[2]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w2_t[2]); + w2_t[3] = rotl32 ((w2_t[0] ^ w0_t[3] ^ w3_t[1] ^ w2_t[3]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w2_t[3]); + w3_t[0] = rotl32 ((w2_t[1] ^ w1_t[0] ^ w3_t[2] ^ w3_t[0]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w3_t[0]); + w3_t[1] = rotl32 ((w2_t[2] ^ w1_t[1] ^ w3_t[3] ^ w3_t[1]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w3_t[1]); + w3_t[2] = rotl32 ((w2_t[3] ^ w1_t[2] ^ w0_t[0] ^ w3_t[2]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w3_t[2]); + w3_t[3] = rotl32 ((w3_t[0] ^ w1_t[3] ^ w0_t[1] ^ w3_t[3]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w3_t[3]); + w0_t[0] = rotl32 ((w3_t[1] ^ w2_t[0] ^ w0_t[2] ^ w0_t[0]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w0_t[0]); + w0_t[1] = rotl32 ((w3_t[2] ^ w2_t[1] ^ w0_t[3] ^ w0_t[1]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w0_t[1]); + w0_t[2] = rotl32 ((w3_t[3] ^ w2_t[2] ^ w1_t[0] ^ w0_t[2]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w0_t[2]); + w0_t[3] = rotl32 ((w0_t[0] ^ w2_t[3] ^ w1_t[1] ^ w0_t[3]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w0_t[3]); + w1_t[0] = rotl32 ((w0_t[1] ^ w3_t[0] ^ w1_t[2] ^ w1_t[0]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w1_t[0]); + w1_t[1] = rotl32 ((w0_t[2] ^ w3_t[1] ^ w1_t[3] ^ w1_t[1]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w1_t[1]); + w1_t[2] = rotl32 ((w0_t[3] ^ w3_t[2] ^ w2_t[0] ^ w1_t[2]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1_t[2]); + w1_t[3] = rotl32 ((w1_t[0] ^ w3_t[3] ^ w2_t[1] ^ w1_t[3]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w1_t[3]); + + #undef K + #define K SHA1C02 + + w2_t[0] = rotl32 ((w1_t[1] ^ w0_t[0] ^ w2_t[2] ^ w2_t[0]), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w2_t[0]); + w2_t[1] = rotl32 ((w1_t[2] ^ w0_t[1] ^ w2_t[3] ^ w2_t[1]), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w2_t[1]); + w2_t[2] = rotl32 ((w1_t[3] ^ w0_t[2] ^ w3_t[0] ^ w2_t[2]), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w2_t[2]); + w2_t[3] = rotl32 ((w2_t[0] ^ w0_t[3] ^ w3_t[1] ^ w2_t[3]), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w2_t[3]); + w3_t[0] = rotl32 ((w2_t[1] ^ w1_t[0] ^ w3_t[2] ^ w3_t[0]), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w3_t[0]); + w3_t[1] = rotl32 ((w2_t[2] ^ w1_t[1] ^ w3_t[3] ^ w3_t[1]), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w3_t[1]); + w3_t[2] = rotl32 ((w2_t[3] ^ w1_t[2] ^ w0_t[0] ^ w3_t[2]), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w3_t[2]); + w3_t[3] = rotl32 ((w3_t[0] ^ w1_t[3] ^ w0_t[1] ^ w3_t[3]), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w3_t[3]); + w0_t[0] = rotl32 ((w3_t[1] ^ w2_t[0] ^ w0_t[2] ^ w0_t[0]), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w0_t[0]); + w0_t[1] = rotl32 ((w3_t[2] ^ w2_t[1] ^ w0_t[3] ^ w0_t[1]), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w0_t[1]); + w0_t[2] = rotl32 ((w3_t[3] ^ w2_t[2] ^ w1_t[0] ^ w0_t[2]), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w0_t[2]); + w0_t[3] = rotl32 ((w0_t[0] ^ w2_t[3] ^ w1_t[1] ^ w0_t[3]), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w0_t[3]); + w1_t[0] = rotl32 ((w0_t[1] ^ w3_t[0] ^ w1_t[2] ^ w1_t[0]), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w1_t[0]); + w1_t[1] = rotl32 ((w0_t[2] ^ w3_t[1] ^ w1_t[3] ^ w1_t[1]), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w1_t[1]); + w1_t[2] = rotl32 ((w0_t[3] ^ w3_t[2] ^ w2_t[0] ^ w1_t[2]), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w1_t[2]); + w1_t[3] = rotl32 ((w1_t[0] ^ w3_t[3] ^ w2_t[1] ^ w1_t[3]), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w1_t[3]); + w2_t[0] = rotl32 ((w1_t[1] ^ w0_t[0] ^ w2_t[2] ^ w2_t[0]), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w2_t[0]); + w2_t[1] = rotl32 ((w1_t[2] ^ w0_t[1] ^ w2_t[3] ^ w2_t[1]), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w2_t[1]); + w2_t[2] = rotl32 ((w1_t[3] ^ w0_t[2] ^ w3_t[0] ^ w2_t[2]), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w2_t[2]); + w2_t[3] = rotl32 ((w2_t[0] ^ w0_t[3] ^ w3_t[1] ^ w2_t[3]), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w2_t[3]); + + #undef K + #define K SHA1C03 + + w3_t[0] = rotl32 ((w2_t[1] ^ w1_t[0] ^ w3_t[2] ^ w3_t[0]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w3_t[0]); + w3_t[1] = rotl32 ((w2_t[2] ^ w1_t[1] ^ w3_t[3] ^ w3_t[1]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w3_t[1]); + w3_t[2] = rotl32 ((w2_t[3] ^ w1_t[2] ^ w0_t[0] ^ w3_t[2]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w3_t[2]); + w3_t[3] = rotl32 ((w3_t[0] ^ w1_t[3] ^ w0_t[1] ^ w3_t[3]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w3_t[3]); + w0_t[0] = rotl32 ((w3_t[1] ^ w2_t[0] ^ w0_t[2] ^ w0_t[0]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w0_t[0]); + w0_t[1] = rotl32 ((w3_t[2] ^ w2_t[1] ^ w0_t[3] ^ w0_t[1]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w0_t[1]); + w0_t[2] = rotl32 ((w3_t[3] ^ w2_t[2] ^ w1_t[0] ^ w0_t[2]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w0_t[2]); + w0_t[3] = rotl32 ((w0_t[0] ^ w2_t[3] ^ w1_t[1] ^ w0_t[3]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w0_t[3]); + w1_t[0] = rotl32 ((w0_t[1] ^ w3_t[0] ^ w1_t[2] ^ w1_t[0]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1_t[0]); + w1_t[1] = rotl32 ((w0_t[2] ^ w3_t[1] ^ w1_t[3] ^ w1_t[1]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w1_t[1]); + w1_t[2] = rotl32 ((w0_t[3] ^ w3_t[2] ^ w2_t[0] ^ w1_t[2]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w1_t[2]); + w1_t[3] = rotl32 ((w1_t[0] ^ w3_t[3] ^ w2_t[1] ^ w1_t[3]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w1_t[3]); + w2_t[0] = rotl32 ((w1_t[1] ^ w0_t[0] ^ w2_t[2] ^ w2_t[0]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w2_t[0]); + w2_t[1] = rotl32 ((w1_t[2] ^ w0_t[1] ^ w2_t[3] ^ w2_t[1]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w2_t[1]); + w2_t[2] = rotl32 ((w1_t[3] ^ w0_t[2] ^ w3_t[0] ^ w2_t[2]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w2_t[2]); + w2_t[3] = rotl32 ((w2_t[0] ^ w0_t[3] ^ w3_t[1] ^ w2_t[3]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w2_t[3]); + w3_t[0] = rotl32 ((w2_t[1] ^ w1_t[0] ^ w3_t[2] ^ w3_t[0]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w3_t[0]); + w3_t[1] = rotl32 ((w2_t[2] ^ w1_t[1] ^ w3_t[3] ^ w3_t[1]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w3_t[1]); + w3_t[2] = rotl32 ((w2_t[3] ^ w1_t[2] ^ w0_t[0] ^ w3_t[2]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w3_t[2]); + w3_t[3] = rotl32 ((w3_t[0] ^ w1_t[3] ^ w0_t[1] ^ w3_t[3]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w3_t[3]); + + + const u32x r0 = d; + const u32x r1 = e; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_M + } +} + +__device__ static void m00140s (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], const u32 pw_len, const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset) +{ + /** + * modifier + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + const u32 lid = threadIdx.x; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * reverse + */ + + const u32 e_rev = rotl32 (search[1], 2u); + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[ 1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[ 2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[ 3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[ 4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[ 5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[ 6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[ 7]; + + u32 salt_buf2[4]; + + salt_buf2[0] = 0; + salt_buf2[1] = 0; + salt_buf2[2] = 0; + salt_buf2[3] = 0; + + u32 salt_buf3[4]; + + salt_buf3[0] = 0; + salt_buf3[1] = 0; + salt_buf3[2] = 0; + salt_buf3[3] = 0; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + const u32 pw_salt_len = pw_len + salt_len; + + /** + * prepend salt + */ + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + w0_t[0] = swap_workaround (w0[0]); + w0_t[1] = swap_workaround (w0[1]); + w0_t[2] = swap_workaround (w0[2]); + w0_t[3] = swap_workaround (w0[3]); + w1_t[0] = swap_workaround (w1[0]); + w1_t[1] = swap_workaround (w1[1]); + w1_t[2] = swap_workaround (w1[2]); + w1_t[3] = swap_workaround (w1[3]); + w2_t[0] = swap_workaround (w2[0]); + w2_t[1] = swap_workaround (w2[1]); + w2_t[2] = swap_workaround (w2[2]); + w2_t[3] = swap_workaround (w2[3]); + w3_t[0] = swap_workaround (w3[0]); + w3_t[1] = swap_workaround (w3[1]); + w3_t[2] = swap_workaround (w3[2]); + w3_t[3] = swap_workaround (w3[3]); + + switch_buffer_by_offset (w0_t, w1_t, w2_t, w3_t, salt_len); + + w0_t[0] |= salt_buf0[0]; + w0_t[1] |= salt_buf0[1]; + w0_t[2] |= salt_buf0[2]; + w0_t[3] |= salt_buf0[3]; + w1_t[0] |= salt_buf1[0]; + w1_t[1] |= salt_buf1[1]; + w1_t[2] |= salt_buf1[2]; + w1_t[3] |= salt_buf1[3]; + w2_t[0] |= salt_buf2[0]; + w2_t[1] |= salt_buf2[1]; + w2_t[2] |= salt_buf2[2]; + w2_t[3] |= salt_buf2[3]; + w3_t[0] |= salt_buf3[0]; + w3_t[1] |= salt_buf3[1]; + w3_t[2] |= salt_buf3[2]; + w3_t[3] |= salt_buf3[3]; + + w0_t[0] = swap_workaround (w0_t[0]); + w0_t[1] = swap_workaround (w0_t[1]); + w0_t[2] = swap_workaround (w0_t[2]); + w0_t[3] = swap_workaround (w0_t[3]); + w1_t[0] = swap_workaround (w1_t[0]); + w1_t[1] = swap_workaround (w1_t[1]); + w1_t[2] = swap_workaround (w1_t[2]); + w1_t[3] = swap_workaround (w1_t[3]); + w2_t[0] = swap_workaround (w2_t[0]); + w2_t[1] = swap_workaround (w2_t[1]); + w2_t[2] = swap_workaround (w2_t[2]); + w2_t[3] = swap_workaround (w2_t[3]); + w3_t[0] = swap_workaround (w3_t[0]); + w3_t[1] = swap_workaround (w3_t[1]); + w3_t[2] = swap_workaround (w3_t[2]); + w3_t[3] = swap_workaround (w3_t[3]); + + /** + * loop + */ + + u32x w0l = w0[0]; + + for (u32 il_pos = 0; il_pos < bfs_cnt; il_pos++) + { + const u32 w0r = c_bfs[il_pos].i; + + const u32x w0n = w0l | w0r; + + u32x wx[16]; + + wx[ 0] = w0_t[0]; + wx[ 1] = w0_t[1]; + wx[ 2] = w0_t[2]; + wx[ 3] = w0_t[3]; + wx[ 4] = w1_t[0]; + wx[ 5] = w1_t[1]; + wx[ 6] = w1_t[2]; + wx[ 7] = w1_t[3]; + wx[ 8] = w2_t[0]; + wx[ 9] = w2_t[1]; + wx[10] = w2_t[2]; + wx[11] = w2_t[3]; + wx[12] = w3_t[0]; + wx[13] = w3_t[1]; + wx[14] = w3_t[2]; + wx[15] = w3_t[3]; + + overwrite_at (wx, w0n, salt_len); + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + w0_t[0] = wx[ 0]; + w0_t[1] = wx[ 1]; + w0_t[2] = wx[ 2]; + w0_t[3] = wx[ 3]; + w1_t[0] = wx[ 4]; + w1_t[1] = wx[ 5]; + w1_t[2] = wx[ 6]; + w1_t[3] = wx[ 7]; + w2_t[0] = wx[ 8]; + w2_t[1] = wx[ 9]; + w2_t[2] = wx[10]; + w2_t[3] = wx[11]; + w3_t[0] = wx[12]; + w3_t[1] = wx[13]; + w3_t[2] = 0; + w3_t[3] = pw_salt_len * 8; + + /** + * sha1 + */ + + u32x a = SHA1M_A; + u32x b = SHA1M_B; + u32x c = SHA1M_C; + u32x d = SHA1M_D; + u32x e = SHA1M_E; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w0_t[0]); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w0_t[1]); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w0_t[2]); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w0_t[3]); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w1_t[0]); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w1_t[1]); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w1_t[2]); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w1_t[3]); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w2_t[0]); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w2_t[1]); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w2_t[2]); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w2_t[3]); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w3_t[0]); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w3_t[1]); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w3_t[2]); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w3_t[3]); + w0_t[0] = rotl32 ((w3_t[1] ^ w2_t[0] ^ w0_t[2] ^ w0_t[0]), 1u); SHA1_STEP (SHA1_F0o, e, a, b, c, d, w0_t[0]); + w0_t[1] = rotl32 ((w3_t[2] ^ w2_t[1] ^ w0_t[3] ^ w0_t[1]), 1u); SHA1_STEP (SHA1_F0o, d, e, a, b, c, w0_t[1]); + w0_t[2] = rotl32 ((w3_t[3] ^ w2_t[2] ^ w1_t[0] ^ w0_t[2]), 1u); SHA1_STEP (SHA1_F0o, c, d, e, a, b, w0_t[2]); + w0_t[3] = rotl32 ((w0_t[0] ^ w2_t[3] ^ w1_t[1] ^ w0_t[3]), 1u); SHA1_STEP (SHA1_F0o, b, c, d, e, a, w0_t[3]); + + #undef K + #define K SHA1C01 + + w1_t[0] = rotl32 ((w0_t[1] ^ w3_t[0] ^ w1_t[2] ^ w1_t[0]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w1_t[0]); + w1_t[1] = rotl32 ((w0_t[2] ^ w3_t[1] ^ w1_t[3] ^ w1_t[1]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w1_t[1]); + w1_t[2] = rotl32 ((w0_t[3] ^ w3_t[2] ^ w2_t[0] ^ w1_t[2]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w1_t[2]); + w1_t[3] = rotl32 ((w1_t[0] ^ w3_t[3] ^ w2_t[1] ^ w1_t[3]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1_t[3]); + w2_t[0] = rotl32 ((w1_t[1] ^ w0_t[0] ^ w2_t[2] ^ w2_t[0]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w2_t[0]); + w2_t[1] = rotl32 ((w1_t[2] ^ w0_t[1] ^ w2_t[3] ^ w2_t[1]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w2_t[1]); + w2_t[2] = rotl32 ((w1_t[3] ^ w0_t[2] ^ w3_t[0] ^ w2_t[2]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w2_t[2]); + w2_t[3] = rotl32 ((w2_t[0] ^ w0_t[3] ^ w3_t[1] ^ w2_t[3]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w2_t[3]); + w3_t[0] = rotl32 ((w2_t[1] ^ w1_t[0] ^ w3_t[2] ^ w3_t[0]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w3_t[0]); + w3_t[1] = rotl32 ((w2_t[2] ^ w1_t[1] ^ w3_t[3] ^ w3_t[1]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w3_t[1]); + w3_t[2] = rotl32 ((w2_t[3] ^ w1_t[2] ^ w0_t[0] ^ w3_t[2]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w3_t[2]); + w3_t[3] = rotl32 ((w3_t[0] ^ w1_t[3] ^ w0_t[1] ^ w3_t[3]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w3_t[3]); + w0_t[0] = rotl32 ((w3_t[1] ^ w2_t[0] ^ w0_t[2] ^ w0_t[0]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w0_t[0]); + w0_t[1] = rotl32 ((w3_t[2] ^ w2_t[1] ^ w0_t[3] ^ w0_t[1]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w0_t[1]); + w0_t[2] = rotl32 ((w3_t[3] ^ w2_t[2] ^ w1_t[0] ^ w0_t[2]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w0_t[2]); + w0_t[3] = rotl32 ((w0_t[0] ^ w2_t[3] ^ w1_t[1] ^ w0_t[3]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w0_t[3]); + w1_t[0] = rotl32 ((w0_t[1] ^ w3_t[0] ^ w1_t[2] ^ w1_t[0]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w1_t[0]); + w1_t[1] = rotl32 ((w0_t[2] ^ w3_t[1] ^ w1_t[3] ^ w1_t[1]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w1_t[1]); + w1_t[2] = rotl32 ((w0_t[3] ^ w3_t[2] ^ w2_t[0] ^ w1_t[2]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1_t[2]); + w1_t[3] = rotl32 ((w1_t[0] ^ w3_t[3] ^ w2_t[1] ^ w1_t[3]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w1_t[3]); + + #undef K + #define K SHA1C02 + + w2_t[0] = rotl32 ((w1_t[1] ^ w0_t[0] ^ w2_t[2] ^ w2_t[0]), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w2_t[0]); + w2_t[1] = rotl32 ((w1_t[2] ^ w0_t[1] ^ w2_t[3] ^ w2_t[1]), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w2_t[1]); + w2_t[2] = rotl32 ((w1_t[3] ^ w0_t[2] ^ w3_t[0] ^ w2_t[2]), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w2_t[2]); + w2_t[3] = rotl32 ((w2_t[0] ^ w0_t[3] ^ w3_t[1] ^ w2_t[3]), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w2_t[3]); + w3_t[0] = rotl32 ((w2_t[1] ^ w1_t[0] ^ w3_t[2] ^ w3_t[0]), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w3_t[0]); + w3_t[1] = rotl32 ((w2_t[2] ^ w1_t[1] ^ w3_t[3] ^ w3_t[1]), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w3_t[1]); + w3_t[2] = rotl32 ((w2_t[3] ^ w1_t[2] ^ w0_t[0] ^ w3_t[2]), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w3_t[2]); + w3_t[3] = rotl32 ((w3_t[0] ^ w1_t[3] ^ w0_t[1] ^ w3_t[3]), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w3_t[3]); + w0_t[0] = rotl32 ((w3_t[1] ^ w2_t[0] ^ w0_t[2] ^ w0_t[0]), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w0_t[0]); + w0_t[1] = rotl32 ((w3_t[2] ^ w2_t[1] ^ w0_t[3] ^ w0_t[1]), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w0_t[1]); + w0_t[2] = rotl32 ((w3_t[3] ^ w2_t[2] ^ w1_t[0] ^ w0_t[2]), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w0_t[2]); + w0_t[3] = rotl32 ((w0_t[0] ^ w2_t[3] ^ w1_t[1] ^ w0_t[3]), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w0_t[3]); + w1_t[0] = rotl32 ((w0_t[1] ^ w3_t[0] ^ w1_t[2] ^ w1_t[0]), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w1_t[0]); + w1_t[1] = rotl32 ((w0_t[2] ^ w3_t[1] ^ w1_t[3] ^ w1_t[1]), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w1_t[1]); + w1_t[2] = rotl32 ((w0_t[3] ^ w3_t[2] ^ w2_t[0] ^ w1_t[2]), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w1_t[2]); + w1_t[3] = rotl32 ((w1_t[0] ^ w3_t[3] ^ w2_t[1] ^ w1_t[3]), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w1_t[3]); + w2_t[0] = rotl32 ((w1_t[1] ^ w0_t[0] ^ w2_t[2] ^ w2_t[0]), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w2_t[0]); + w2_t[1] = rotl32 ((w1_t[2] ^ w0_t[1] ^ w2_t[3] ^ w2_t[1]), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w2_t[1]); + w2_t[2] = rotl32 ((w1_t[3] ^ w0_t[2] ^ w3_t[0] ^ w2_t[2]), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w2_t[2]); + w2_t[3] = rotl32 ((w2_t[0] ^ w0_t[3] ^ w3_t[1] ^ w2_t[3]), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w2_t[3]); + + #undef K + #define K SHA1C03 + + w3_t[0] = rotl32 ((w2_t[1] ^ w1_t[0] ^ w3_t[2] ^ w3_t[0]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w3_t[0]); + w3_t[1] = rotl32 ((w2_t[2] ^ w1_t[1] ^ w3_t[3] ^ w3_t[1]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w3_t[1]); + w3_t[2] = rotl32 ((w2_t[3] ^ w1_t[2] ^ w0_t[0] ^ w3_t[2]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w3_t[2]); + w3_t[3] = rotl32 ((w3_t[0] ^ w1_t[3] ^ w0_t[1] ^ w3_t[3]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w3_t[3]); + w0_t[0] = rotl32 ((w3_t[1] ^ w2_t[0] ^ w0_t[2] ^ w0_t[0]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w0_t[0]); + w0_t[1] = rotl32 ((w3_t[2] ^ w2_t[1] ^ w0_t[3] ^ w0_t[1]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w0_t[1]); + w0_t[2] = rotl32 ((w3_t[3] ^ w2_t[2] ^ w1_t[0] ^ w0_t[2]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w0_t[2]); + w0_t[3] = rotl32 ((w0_t[0] ^ w2_t[3] ^ w1_t[1] ^ w0_t[3]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w0_t[3]); + w1_t[0] = rotl32 ((w0_t[1] ^ w3_t[0] ^ w1_t[2] ^ w1_t[0]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1_t[0]); + w1_t[1] = rotl32 ((w0_t[2] ^ w3_t[1] ^ w1_t[3] ^ w1_t[1]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w1_t[1]); + w1_t[2] = rotl32 ((w0_t[3] ^ w3_t[2] ^ w2_t[0] ^ w1_t[2]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w1_t[2]); + w1_t[3] = rotl32 ((w1_t[0] ^ w3_t[3] ^ w2_t[1] ^ w1_t[3]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w1_t[3]); + w2_t[0] = rotl32 ((w1_t[1] ^ w0_t[0] ^ w2_t[2] ^ w2_t[0]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w2_t[0]); + w2_t[1] = rotl32 ((w1_t[2] ^ w0_t[1] ^ w2_t[3] ^ w2_t[1]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w2_t[1]); + w2_t[2] = rotl32 ((w1_t[3] ^ w0_t[2] ^ w3_t[0] ^ w2_t[2]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w2_t[2]); + w2_t[3] = rotl32 ((w2_t[0] ^ w0_t[3] ^ w3_t[1] ^ w2_t[3]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w2_t[3]); + w3_t[0] = rotl32 ((w2_t[1] ^ w1_t[0] ^ w3_t[2] ^ w3_t[0]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w3_t[0]); + + if (e != e_rev) continue; + + w3_t[1] = rotl32 ((w2_t[2] ^ w1_t[1] ^ w3_t[3] ^ w3_t[1]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w3_t[1]); + w3_t[2] = rotl32 ((w2_t[3] ^ w1_t[2] ^ w0_t[0] ^ w3_t[2]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w3_t[2]); + w3_t[3] = rotl32 ((w3_t[0] ^ w1_t[3] ^ w0_t[1] ^ w3_t[3]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w3_t[3]); + + + const u32x r0 = d; + const u32x r1 = e; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_S + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m00140_m04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m00140m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m00140_m08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m00140m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m00140_m16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = pws[gid].i[ 8]; + w2[1] = pws[gid].i[ 9]; + w2[2] = pws[gid].i[10]; + w2[3] = pws[gid].i[11]; + + u32x w3[4]; + + w3[0] = pws[gid].i[12]; + w3[1] = pws[gid].i[13]; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m00140m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m00140_s04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m00140s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m00140_s08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m00140s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m00140_s16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = pws[gid].i[ 8]; + w2[1] = pws[gid].i[ 9]; + w2[2] = pws[gid].i[10]; + w2[3] = pws[gid].i[11]; + + u32x w3[4]; + + w3[0] = pws[gid].i[12]; + w3[1] = pws[gid].i[13]; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m00140s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} diff --git a/nv/m00150_a0.cu b/nv/m00150_a0.cu new file mode 100644 index 0000000000..fd5ac23364 --- /dev/null +++ b/nv/m00150_a0.cu @@ -0,0 +1,600 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _SHA1_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW2 +#define VECT_SIZE1 +#endif + +#define DGST_R0 3 +#define DGST_R1 4 +#define DGST_R2 2 +#define DGST_R3 1 + +#include "include/kernel_functions.c" +#include "types_nv.c" +#include "common_nv.c" +#include "include/rp_gpu.h" +#include "rp_nv.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +__device__ static void sha1_transform (const u32x w0[4], const u32x w1[4], const u32x w2[4], const u32x w3[4], u32x digest[5]) +{ + u32x A = digest[0]; + u32x B = digest[1]; + u32x C = digest[2]; + u32x D = digest[3]; + u32x E = digest[4]; + + u32x w0_t = w0[0]; + u32x w1_t = w0[1]; + u32x w2_t = w0[2]; + u32x w3_t = w0[3]; + u32x w4_t = w1[0]; + u32x w5_t = w1[1]; + u32x w6_t = w1[2]; + u32x w7_t = w1[3]; + u32x w8_t = w2[0]; + u32x w9_t = w2[1]; + u32x wa_t = w2[2]; + u32x wb_t = w2[3]; + u32x wc_t = w3[0]; + u32x wd_t = w3[1]; + u32x we_t = w3[2]; + u32x wf_t = w3[3]; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, A, B, C, D, E, w0_t); + SHA1_STEP (SHA1_F0o, E, A, B, C, D, w1_t); + SHA1_STEP (SHA1_F0o, D, E, A, B, C, w2_t); + SHA1_STEP (SHA1_F0o, C, D, E, A, B, w3_t); + SHA1_STEP (SHA1_F0o, B, C, D, E, A, w4_t); + SHA1_STEP (SHA1_F0o, A, B, C, D, E, w5_t); + SHA1_STEP (SHA1_F0o, E, A, B, C, D, w6_t); + SHA1_STEP (SHA1_F0o, D, E, A, B, C, w7_t); + SHA1_STEP (SHA1_F0o, C, D, E, A, B, w8_t); + SHA1_STEP (SHA1_F0o, B, C, D, E, A, w9_t); + SHA1_STEP (SHA1_F0o, A, B, C, D, E, wa_t); + SHA1_STEP (SHA1_F0o, E, A, B, C, D, wb_t); + SHA1_STEP (SHA1_F0o, D, E, A, B, C, wc_t); + SHA1_STEP (SHA1_F0o, C, D, E, A, B, wd_t); + SHA1_STEP (SHA1_F0o, B, C, D, E, A, we_t); + SHA1_STEP (SHA1_F0o, A, B, C, D, E, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F0o, E, A, B, C, D, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F0o, D, E, A, B, C, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F0o, C, D, E, A, B, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F0o, B, C, D, E, A, w3_t); + + #undef K + #define K SHA1C01 + + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w7_t); + + #undef K + #define K SHA1C02 + + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, wb_t); + + #undef K + #define K SHA1C03 + + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, wf_t); + + digest[0] += A; + digest[1] += B; + digest[2] += C; + digest[3] += D; + digest[4] += E; +} + +__device__ static void hmac_sha1_pad (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], u32x ipad[5], u32x opad[5]) +{ + w0[0] = w0[0] ^ 0x36363636; + w0[1] = w0[1] ^ 0x36363636; + w0[2] = w0[2] ^ 0x36363636; + w0[3] = w0[3] ^ 0x36363636; + w1[0] = w1[0] ^ 0x36363636; + w1[1] = w1[1] ^ 0x36363636; + w1[2] = w1[2] ^ 0x36363636; + w1[3] = w1[3] ^ 0x36363636; + w2[0] = w2[0] ^ 0x36363636; + w2[1] = w2[1] ^ 0x36363636; + w2[2] = w2[2] ^ 0x36363636; + w2[3] = w2[3] ^ 0x36363636; + w3[0] = w3[0] ^ 0x36363636; + w3[1] = w3[1] ^ 0x36363636; + w3[2] = w3[2] ^ 0x36363636; + w3[3] = w3[3] ^ 0x36363636; + + ipad[0] = SHA1M_A; + ipad[1] = SHA1M_B; + ipad[2] = SHA1M_C; + ipad[3] = SHA1M_D; + ipad[4] = SHA1M_E; + + sha1_transform (w0, w1, w2, w3, ipad); + + w0[0] = w0[0] ^ 0x6a6a6a6a; + w0[1] = w0[1] ^ 0x6a6a6a6a; + w0[2] = w0[2] ^ 0x6a6a6a6a; + w0[3] = w0[3] ^ 0x6a6a6a6a; + w1[0] = w1[0] ^ 0x6a6a6a6a; + w1[1] = w1[1] ^ 0x6a6a6a6a; + w1[2] = w1[2] ^ 0x6a6a6a6a; + w1[3] = w1[3] ^ 0x6a6a6a6a; + w2[0] = w2[0] ^ 0x6a6a6a6a; + w2[1] = w2[1] ^ 0x6a6a6a6a; + w2[2] = w2[2] ^ 0x6a6a6a6a; + w2[3] = w2[3] ^ 0x6a6a6a6a; + w3[0] = w3[0] ^ 0x6a6a6a6a; + w3[1] = w3[1] ^ 0x6a6a6a6a; + w3[2] = w3[2] ^ 0x6a6a6a6a; + w3[3] = w3[3] ^ 0x6a6a6a6a; + + opad[0] = SHA1M_A; + opad[1] = SHA1M_B; + opad[2] = SHA1M_C; + opad[3] = SHA1M_D; + opad[4] = SHA1M_E; + + sha1_transform (w0, w1, w2, w3, opad); +} + +__device__ static void hmac_sha1_run (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], u32x ipad[5], u32x opad[5], u32x digest[5]) +{ + digest[0] = ipad[0]; + digest[1] = ipad[1]; + digest[2] = ipad[2]; + digest[3] = ipad[3]; + digest[4] = ipad[4]; + + sha1_transform (w0, w1, w2, w3, digest); + + w0[0] = digest[0]; + w0[1] = digest[1]; + w0[2] = digest[2]; + w0[3] = digest[3]; + w1[0] = digest[4]; + w1[1] = 0x80000000; + w1[2] = 0; + w1[3] = 0; + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = (64 + 20) * 8; + + digest[0] = opad[0]; + digest[1] = opad[1]; + digest[2] = opad[2]; + digest[3] = opad[3]; + digest[4] = opad[4]; + + sha1_transform (w0, w1, w2, w3, digest); +} + +__device__ __constant__ gpu_rule_t c_rules[1024]; + +extern "C" __global__ void __launch_bounds__ (256, 1) m00150_m04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + u32x pw_buf1[4]; + + pw_buf1[0] = pws[gid].i[ 4]; + pw_buf1[1] = pws[gid].i[ 5]; + pw_buf1[2] = pws[gid].i[ 6]; + pw_buf1[3] = pws[gid].i[ 7]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[ 1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[ 2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[ 3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[ 4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[ 5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[ 6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[ 7]; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + + w0[0] = pw_buf0[0]; + w0[1] = pw_buf0[1]; + w0[2] = pw_buf0[2]; + w0[3] = pw_buf0[3]; + + u32x w1[4]; + + w1[0] = pw_buf1[0]; + w1[1] = pw_buf1[1]; + w1[2] = pw_buf1[2]; + w1[3] = pw_buf1[3]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 out_len = apply_rules (c_rules[il_pos].cmds, w0, w1, pw_len); + + /** + * pads + */ + + u32x w0_t[4]; + + w0_t[0] = swap_workaround (w0[0]); + w0_t[1] = swap_workaround (w0[1]); + w0_t[2] = swap_workaround (w0[2]); + w0_t[3] = swap_workaround (w0[3]); + + u32x w1_t[4]; + + w1_t[0] = swap_workaround (w1[0]); + w1_t[1] = swap_workaround (w1[1]); + w1_t[2] = swap_workaround (w1[2]); + w1_t[3] = swap_workaround (w1[3]); + + u32x w2_t[4]; + + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + + u32x w3_t[4]; + + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = 0; + + u32x ipad[5]; + u32x opad[5]; + + hmac_sha1_pad (w0_t, w1_t, w2_t, w3_t, ipad, opad); + + w0_t[0] = swap_workaround (salt_buf0[0]); + w0_t[1] = swap_workaround (salt_buf0[1]); + w0_t[2] = swap_workaround (salt_buf0[2]); + w0_t[3] = swap_workaround (salt_buf0[3]); + w1_t[0] = swap_workaround (salt_buf1[0]); + w1_t[1] = swap_workaround (salt_buf1[1]); + w1_t[2] = swap_workaround (salt_buf1[2]); + w1_t[3] = swap_workaround (salt_buf1[3]); + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = (64 + salt_len) * 8; + + u32x digest[5]; + + hmac_sha1_run (w0_t, w1_t, w2_t, w3_t, ipad, opad, digest); + + const u32x r0 = digest[3]; + const u32x r1 = digest[4]; + const u32x r2 = digest[2]; + const u32x r3 = digest[1]; + + #include VECT_COMPARE_M + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m00150_m08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m00150_m16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m00150_s04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + u32x pw_buf1[4]; + + pw_buf1[0] = pws[gid].i[ 4]; + pw_buf1[1] = pws[gid].i[ 5]; + pw_buf1[2] = pws[gid].i[ 6]; + pw_buf1[3] = pws[gid].i[ 7]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[ 1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[ 2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[ 3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[ 4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[ 5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[ 6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[ 7]; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + + w0[0] = pw_buf0[0]; + w0[1] = pw_buf0[1]; + w0[2] = pw_buf0[2]; + w0[3] = pw_buf0[3]; + + u32x w1[4]; + + w1[0] = pw_buf1[0]; + w1[1] = pw_buf1[1]; + w1[2] = pw_buf1[2]; + w1[3] = pw_buf1[3]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 out_len = apply_rules (c_rules[il_pos].cmds, w0, w1, pw_len); + + /** + * pads + */ + + u32x w0_t[4]; + + w0_t[0] = swap_workaround (w0[0]); + w0_t[1] = swap_workaround (w0[1]); + w0_t[2] = swap_workaround (w0[2]); + w0_t[3] = swap_workaround (w0[3]); + + u32x w1_t[4]; + + w1_t[0] = swap_workaround (w1[0]); + w1_t[1] = swap_workaround (w1[1]); + w1_t[2] = swap_workaround (w1[2]); + w1_t[3] = swap_workaround (w1[3]); + + u32x w2_t[4]; + + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + + u32x w3_t[4]; + + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = 0; + + u32x ipad[5]; + u32x opad[5]; + + hmac_sha1_pad (w0_t, w1_t, w2_t, w3_t, ipad, opad); + + w0_t[0] = swap_workaround (salt_buf0[0]); + w0_t[1] = swap_workaround (salt_buf0[1]); + w0_t[2] = swap_workaround (salt_buf0[2]); + w0_t[3] = swap_workaround (salt_buf0[3]); + w1_t[0] = swap_workaround (salt_buf1[0]); + w1_t[1] = swap_workaround (salt_buf1[1]); + w1_t[2] = swap_workaround (salt_buf1[2]); + w1_t[3] = swap_workaround (salt_buf1[3]); + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = (64 + salt_len) * 8; + + u32x digest[5]; + + hmac_sha1_run (w0_t, w1_t, w2_t, w3_t, ipad, opad, digest); + + const u32x r0 = digest[3]; + const u32x r1 = digest[4]; + const u32x r2 = digest[2]; + const u32x r3 = digest[1]; + + #include VECT_COMPARE_S + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m00150_s08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m00150_s16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/nv/m00150_a1.cu b/nv/m00150_a1.cu new file mode 100644 index 0000000000..9311a47692 --- /dev/null +++ b/nv/m00150_a1.cu @@ -0,0 +1,706 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _SHA1_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW2 +#define VECT_SIZE4 +#endif + +#define DGST_R0 3 +#define DGST_R1 4 +#define DGST_R2 2 +#define DGST_R3 1 + +#include "include/kernel_functions.c" +#include "types_nv.c" +#include "common_nv.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +__device__ static void sha1_transform (const u32x w0[4], const u32x w1[4], const u32x w2[4], const u32x w3[4], u32x digest[5]) +{ + u32x A = digest[0]; + u32x B = digest[1]; + u32x C = digest[2]; + u32x D = digest[3]; + u32x E = digest[4]; + + u32x w0_t = w0[0]; + u32x w1_t = w0[1]; + u32x w2_t = w0[2]; + u32x w3_t = w0[3]; + u32x w4_t = w1[0]; + u32x w5_t = w1[1]; + u32x w6_t = w1[2]; + u32x w7_t = w1[3]; + u32x w8_t = w2[0]; + u32x w9_t = w2[1]; + u32x wa_t = w2[2]; + u32x wb_t = w2[3]; + u32x wc_t = w3[0]; + u32x wd_t = w3[1]; + u32x we_t = w3[2]; + u32x wf_t = w3[3]; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, A, B, C, D, E, w0_t); + SHA1_STEP (SHA1_F0o, E, A, B, C, D, w1_t); + SHA1_STEP (SHA1_F0o, D, E, A, B, C, w2_t); + SHA1_STEP (SHA1_F0o, C, D, E, A, B, w3_t); + SHA1_STEP (SHA1_F0o, B, C, D, E, A, w4_t); + SHA1_STEP (SHA1_F0o, A, B, C, D, E, w5_t); + SHA1_STEP (SHA1_F0o, E, A, B, C, D, w6_t); + SHA1_STEP (SHA1_F0o, D, E, A, B, C, w7_t); + SHA1_STEP (SHA1_F0o, C, D, E, A, B, w8_t); + SHA1_STEP (SHA1_F0o, B, C, D, E, A, w9_t); + SHA1_STEP (SHA1_F0o, A, B, C, D, E, wa_t); + SHA1_STEP (SHA1_F0o, E, A, B, C, D, wb_t); + SHA1_STEP (SHA1_F0o, D, E, A, B, C, wc_t); + SHA1_STEP (SHA1_F0o, C, D, E, A, B, wd_t); + SHA1_STEP (SHA1_F0o, B, C, D, E, A, we_t); + SHA1_STEP (SHA1_F0o, A, B, C, D, E, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F0o, E, A, B, C, D, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F0o, D, E, A, B, C, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F0o, C, D, E, A, B, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F0o, B, C, D, E, A, w3_t); + + #undef K + #define K SHA1C01 + + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w7_t); + + #undef K + #define K SHA1C02 + + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, wb_t); + + #undef K + #define K SHA1C03 + + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, wf_t); + + digest[0] += A; + digest[1] += B; + digest[2] += C; + digest[3] += D; + digest[4] += E; +} + +__device__ static void hmac_sha1_pad (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], u32x ipad[5], u32x opad[5]) +{ + w0[0] = w0[0] ^ 0x36363636; + w0[1] = w0[1] ^ 0x36363636; + w0[2] = w0[2] ^ 0x36363636; + w0[3] = w0[3] ^ 0x36363636; + w1[0] = w1[0] ^ 0x36363636; + w1[1] = w1[1] ^ 0x36363636; + w1[2] = w1[2] ^ 0x36363636; + w1[3] = w1[3] ^ 0x36363636; + w2[0] = w2[0] ^ 0x36363636; + w2[1] = w2[1] ^ 0x36363636; + w2[2] = w2[2] ^ 0x36363636; + w2[3] = w2[3] ^ 0x36363636; + w3[0] = w3[0] ^ 0x36363636; + w3[1] = w3[1] ^ 0x36363636; + w3[2] = w3[2] ^ 0x36363636; + w3[3] = w3[3] ^ 0x36363636; + + ipad[0] = SHA1M_A; + ipad[1] = SHA1M_B; + ipad[2] = SHA1M_C; + ipad[3] = SHA1M_D; + ipad[4] = SHA1M_E; + + sha1_transform (w0, w1, w2, w3, ipad); + + w0[0] = w0[0] ^ 0x6a6a6a6a; + w0[1] = w0[1] ^ 0x6a6a6a6a; + w0[2] = w0[2] ^ 0x6a6a6a6a; + w0[3] = w0[3] ^ 0x6a6a6a6a; + w1[0] = w1[0] ^ 0x6a6a6a6a; + w1[1] = w1[1] ^ 0x6a6a6a6a; + w1[2] = w1[2] ^ 0x6a6a6a6a; + w1[3] = w1[3] ^ 0x6a6a6a6a; + w2[0] = w2[0] ^ 0x6a6a6a6a; + w2[1] = w2[1] ^ 0x6a6a6a6a; + w2[2] = w2[2] ^ 0x6a6a6a6a; + w2[3] = w2[3] ^ 0x6a6a6a6a; + w3[0] = w3[0] ^ 0x6a6a6a6a; + w3[1] = w3[1] ^ 0x6a6a6a6a; + w3[2] = w3[2] ^ 0x6a6a6a6a; + w3[3] = w3[3] ^ 0x6a6a6a6a; + + opad[0] = SHA1M_A; + opad[1] = SHA1M_B; + opad[2] = SHA1M_C; + opad[3] = SHA1M_D; + opad[4] = SHA1M_E; + + sha1_transform (w0, w1, w2, w3, opad); +} + +__device__ static void hmac_sha1_run (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], u32x ipad[5], u32x opad[5], u32x digest[5]) +{ + digest[0] = ipad[0]; + digest[1] = ipad[1]; + digest[2] = ipad[2]; + digest[3] = ipad[3]; + digest[4] = ipad[4]; + + sha1_transform (w0, w1, w2, w3, digest); + + w0[0] = digest[0]; + w0[1] = digest[1]; + w0[2] = digest[2]; + w0[3] = digest[3]; + w1[0] = digest[4]; + w1[1] = 0x80000000; + w1[2] = 0; + w1[3] = 0; + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = (64 + 20) * 8; + + digest[0] = opad[0]; + digest[1] = opad[1]; + digest[2] = opad[2]; + digest[3] = opad[3]; + digest[4] = opad[4]; + + sha1_transform (w0, w1, w2, w3, digest); +} + +__device__ __constant__ comb_t c_combs[1024]; + +extern "C" __global__ void __launch_bounds__ (256, 1) m00150_m04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, c_combs[0].pw_len); + } + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[ 1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[ 2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[ 3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[ 4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[ 5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[ 6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[ 7]; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = c_combs[il_pos].pw_len; + + const u32 pw_len = pw_l_len + pw_r_len; + + u32 wordr0[4]; + + wordr0[0] = c_combs[il_pos].i[0]; + wordr0[1] = c_combs[il_pos].i[1]; + wordr0[2] = c_combs[il_pos].i[2]; + wordr0[3] = c_combs[il_pos].i[3]; + + u32 wordr1[4]; + + wordr1[0] = c_combs[il_pos].i[4]; + wordr1[1] = c_combs[il_pos].i[5]; + wordr1[2] = c_combs[il_pos].i[6]; + wordr1[3] = c_combs[il_pos].i[7]; + + u32 wordr2[4]; + + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + + u32 wordr3[4]; + + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + u32x w0[4]; + + w0[0] = wordl0[0] | wordr0[0]; + w0[1] = wordl0[1] | wordr0[1]; + w0[2] = wordl0[2] | wordr0[2]; + w0[3] = wordl0[3] | wordr0[3]; + + u32x w1[4]; + + w1[0] = wordl1[0] | wordr1[0]; + w1[1] = wordl1[1] | wordr1[1]; + w1[2] = wordl1[2] | wordr1[2]; + w1[3] = wordl1[3] | wordr1[3]; + + u32x w2[4]; + + w2[0] = wordl2[0] | wordr2[0]; + w2[1] = wordl2[1] | wordr2[1]; + w2[2] = wordl2[2] | wordr2[2]; + w2[3] = wordl2[3] | wordr2[3]; + + u32x w3[4]; + + w3[0] = wordl3[0] | wordr3[0]; + w3[1] = wordl3[1] | wordr3[1]; + w3[2] = wordl3[2] | wordr3[2]; + w3[3] = wordl3[3] | wordr3[3]; + + /** + * pads + */ + + u32x w0_t[4]; + + w0_t[0] = swap_workaround (w0[0]); + w0_t[1] = swap_workaround (w0[1]); + w0_t[2] = swap_workaround (w0[2]); + w0_t[3] = swap_workaround (w0[3]); + + u32x w1_t[4]; + + w1_t[0] = swap_workaround (w1[0]); + w1_t[1] = swap_workaround (w1[1]); + w1_t[2] = swap_workaround (w1[2]); + w1_t[3] = swap_workaround (w1[3]); + + u32x w2_t[4]; + + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + + u32x w3_t[4]; + + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = 0; + + u32x ipad[5]; + u32x opad[5]; + + hmac_sha1_pad (w0_t, w1_t, w2_t, w3_t, ipad, opad); + + w0_t[0] = swap_workaround (salt_buf0[0]); + w0_t[1] = swap_workaround (salt_buf0[1]); + w0_t[2] = swap_workaround (salt_buf0[2]); + w0_t[3] = swap_workaround (salt_buf0[3]); + w1_t[0] = swap_workaround (salt_buf1[0]); + w1_t[1] = swap_workaround (salt_buf1[1]); + w1_t[2] = swap_workaround (salt_buf1[2]); + w1_t[3] = swap_workaround (salt_buf1[3]); + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = (64 + salt_len) * 8; + + u32x digest[5]; + + hmac_sha1_run (w0_t, w1_t, w2_t, w3_t, ipad, opad, digest); + + const u32x r0 = digest[3]; + const u32x r1 = digest[4]; + const u32x r2 = digest[2]; + const u32x r3 = digest[1]; + + #include VECT_COMPARE_M + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m00150_m08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m00150_m16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m00150_s04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, c_combs[0].pw_len); + } + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[ 1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[ 2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[ 3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[ 4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[ 5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[ 6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[ 7]; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = c_combs[il_pos].pw_len; + + const u32 pw_len = pw_l_len + pw_r_len; + + u32 wordr0[4]; + + wordr0[0] = c_combs[il_pos].i[0]; + wordr0[1] = c_combs[il_pos].i[1]; + wordr0[2] = c_combs[il_pos].i[2]; + wordr0[3] = c_combs[il_pos].i[3]; + + u32 wordr1[4]; + + wordr1[0] = c_combs[il_pos].i[4]; + wordr1[1] = c_combs[il_pos].i[5]; + wordr1[2] = c_combs[il_pos].i[6]; + wordr1[3] = c_combs[il_pos].i[7]; + + u32 wordr2[4]; + + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + + u32 wordr3[4]; + + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + u32x w0[4]; + + w0[0] = wordl0[0] | wordr0[0]; + w0[1] = wordl0[1] | wordr0[1]; + w0[2] = wordl0[2] | wordr0[2]; + w0[3] = wordl0[3] | wordr0[3]; + + u32x w1[4]; + + w1[0] = wordl1[0] | wordr1[0]; + w1[1] = wordl1[1] | wordr1[1]; + w1[2] = wordl1[2] | wordr1[2]; + w1[3] = wordl1[3] | wordr1[3]; + + u32x w2[4]; + + w2[0] = wordl2[0] | wordr2[0]; + w2[1] = wordl2[1] | wordr2[1]; + w2[2] = wordl2[2] | wordr2[2]; + w2[3] = wordl2[3] | wordr2[3]; + + u32x w3[4]; + + w3[0] = wordl3[0] | wordr3[0]; + w3[1] = wordl3[1] | wordr3[1]; + w3[2] = wordl3[2] | wordr3[2]; + w3[3] = wordl3[3] | wordr3[3]; + + /** + * pads + */ + + u32x w0_t[4]; + + w0_t[0] = swap_workaround (w0[0]); + w0_t[1] = swap_workaround (w0[1]); + w0_t[2] = swap_workaround (w0[2]); + w0_t[3] = swap_workaround (w0[3]); + + u32x w1_t[4]; + + w1_t[0] = swap_workaround (w1[0]); + w1_t[1] = swap_workaround (w1[1]); + w1_t[2] = swap_workaround (w1[2]); + w1_t[3] = swap_workaround (w1[3]); + + u32x w2_t[4]; + + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + + u32x w3_t[4]; + + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = 0; + + u32x ipad[5]; + u32x opad[5]; + + hmac_sha1_pad (w0_t, w1_t, w2_t, w3_t, ipad, opad); + + w0_t[0] = swap_workaround (salt_buf0[0]); + w0_t[1] = swap_workaround (salt_buf0[1]); + w0_t[2] = swap_workaround (salt_buf0[2]); + w0_t[3] = swap_workaround (salt_buf0[3]); + w1_t[0] = swap_workaround (salt_buf1[0]); + w1_t[1] = swap_workaround (salt_buf1[1]); + w1_t[2] = swap_workaround (salt_buf1[2]); + w1_t[3] = swap_workaround (salt_buf1[3]); + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = (64 + salt_len) * 8; + + u32x digest[5]; + + hmac_sha1_run (w0_t, w1_t, w2_t, w3_t, ipad, opad, digest); + + const u32x r0 = digest[3]; + const u32x r1 = digest[4]; + const u32x r2 = digest[2]; + const u32x r3 = digest[1]; + + #include VECT_COMPARE_S + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m00150_s08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m00150_s16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/nv/m00150_a3.cu b/nv/m00150_a3.cu new file mode 100644 index 0000000000..4f0a8972e5 --- /dev/null +++ b/nv/m00150_a3.cu @@ -0,0 +1,770 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _SHA1_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW2 +#define VECT_SIZE4 +#endif + +#define DGST_R0 3 +#define DGST_R1 4 +#define DGST_R2 2 +#define DGST_R3 1 + +#include "include/kernel_functions.c" +#include "types_nv.c" +#include "common_nv.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +__device__ static void sha1_transform (const u32x w0[4], const u32x w1[4], const u32x w2[4], const u32x w3[4], u32x digest[5]) +{ + u32x A = digest[0]; + u32x B = digest[1]; + u32x C = digest[2]; + u32x D = digest[3]; + u32x E = digest[4]; + + u32x w0_t = w0[0]; + u32x w1_t = w0[1]; + u32x w2_t = w0[2]; + u32x w3_t = w0[3]; + u32x w4_t = w1[0]; + u32x w5_t = w1[1]; + u32x w6_t = w1[2]; + u32x w7_t = w1[3]; + u32x w8_t = w2[0]; + u32x w9_t = w2[1]; + u32x wa_t = w2[2]; + u32x wb_t = w2[3]; + u32x wc_t = w3[0]; + u32x wd_t = w3[1]; + u32x we_t = w3[2]; + u32x wf_t = w3[3]; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, A, B, C, D, E, w0_t); + SHA1_STEP (SHA1_F0o, E, A, B, C, D, w1_t); + SHA1_STEP (SHA1_F0o, D, E, A, B, C, w2_t); + SHA1_STEP (SHA1_F0o, C, D, E, A, B, w3_t); + SHA1_STEP (SHA1_F0o, B, C, D, E, A, w4_t); + SHA1_STEP (SHA1_F0o, A, B, C, D, E, w5_t); + SHA1_STEP (SHA1_F0o, E, A, B, C, D, w6_t); + SHA1_STEP (SHA1_F0o, D, E, A, B, C, w7_t); + SHA1_STEP (SHA1_F0o, C, D, E, A, B, w8_t); + SHA1_STEP (SHA1_F0o, B, C, D, E, A, w9_t); + SHA1_STEP (SHA1_F0o, A, B, C, D, E, wa_t); + SHA1_STEP (SHA1_F0o, E, A, B, C, D, wb_t); + SHA1_STEP (SHA1_F0o, D, E, A, B, C, wc_t); + SHA1_STEP (SHA1_F0o, C, D, E, A, B, wd_t); + SHA1_STEP (SHA1_F0o, B, C, D, E, A, we_t); + SHA1_STEP (SHA1_F0o, A, B, C, D, E, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F0o, E, A, B, C, D, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F0o, D, E, A, B, C, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F0o, C, D, E, A, B, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F0o, B, C, D, E, A, w3_t); + + #undef K + #define K SHA1C01 + + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w7_t); + + #undef K + #define K SHA1C02 + + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, wb_t); + + #undef K + #define K SHA1C03 + + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, wf_t); + + digest[0] += A; + digest[1] += B; + digest[2] += C; + digest[3] += D; + digest[4] += E; +} + +__device__ static void hmac_sha1_pad (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], u32x ipad[5], u32x opad[5]) +{ + w0[0] = w0[0] ^ 0x36363636; + w0[1] = w0[1] ^ 0x36363636; + w0[2] = w0[2] ^ 0x36363636; + w0[3] = w0[3] ^ 0x36363636; + w1[0] = w1[0] ^ 0x36363636; + w1[1] = w1[1] ^ 0x36363636; + w1[2] = w1[2] ^ 0x36363636; + w1[3] = w1[3] ^ 0x36363636; + w2[0] = w2[0] ^ 0x36363636; + w2[1] = w2[1] ^ 0x36363636; + w2[2] = w2[2] ^ 0x36363636; + w2[3] = w2[3] ^ 0x36363636; + w3[0] = w3[0] ^ 0x36363636; + w3[1] = w3[1] ^ 0x36363636; + w3[2] = w3[2] ^ 0x36363636; + w3[3] = w3[3] ^ 0x36363636; + + ipad[0] = SHA1M_A; + ipad[1] = SHA1M_B; + ipad[2] = SHA1M_C; + ipad[3] = SHA1M_D; + ipad[4] = SHA1M_E; + + sha1_transform (w0, w1, w2, w3, ipad); + + w0[0] = w0[0] ^ 0x6a6a6a6a; + w0[1] = w0[1] ^ 0x6a6a6a6a; + w0[2] = w0[2] ^ 0x6a6a6a6a; + w0[3] = w0[3] ^ 0x6a6a6a6a; + w1[0] = w1[0] ^ 0x6a6a6a6a; + w1[1] = w1[1] ^ 0x6a6a6a6a; + w1[2] = w1[2] ^ 0x6a6a6a6a; + w1[3] = w1[3] ^ 0x6a6a6a6a; + w2[0] = w2[0] ^ 0x6a6a6a6a; + w2[1] = w2[1] ^ 0x6a6a6a6a; + w2[2] = w2[2] ^ 0x6a6a6a6a; + w2[3] = w2[3] ^ 0x6a6a6a6a; + w3[0] = w3[0] ^ 0x6a6a6a6a; + w3[1] = w3[1] ^ 0x6a6a6a6a; + w3[2] = w3[2] ^ 0x6a6a6a6a; + w3[3] = w3[3] ^ 0x6a6a6a6a; + + opad[0] = SHA1M_A; + opad[1] = SHA1M_B; + opad[2] = SHA1M_C; + opad[3] = SHA1M_D; + opad[4] = SHA1M_E; + + sha1_transform (w0, w1, w2, w3, opad); +} + +__device__ static void hmac_sha1_run (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], u32x ipad[5], u32x opad[5], u32x digest[5]) +{ + digest[0] = ipad[0]; + digest[1] = ipad[1]; + digest[2] = ipad[2]; + digest[3] = ipad[3]; + digest[4] = ipad[4]; + + sha1_transform (w0, w1, w2, w3, digest); + + w0[0] = digest[0]; + w0[1] = digest[1]; + w0[2] = digest[2]; + w0[3] = digest[3]; + w1[0] = digest[4]; + w1[1] = 0x80000000; + w1[2] = 0; + w1[3] = 0; + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = (64 + 20) * 8; + + digest[0] = opad[0]; + digest[1] = opad[1]; + digest[2] = opad[2]; + digest[3] = opad[3]; + digest[4] = opad[4]; + + sha1_transform (w0, w1, w2, w3, digest); +} + +__device__ __constant__ bf_t c_bfs[1024]; + +__device__ static void m00150m (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], const u32 pw_len, const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset) +{ + /** + * modifier + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + const u32 lid = threadIdx.x; + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[ 1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[ 2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[ 3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[ 4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[ 5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[ 6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[ 7]; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + /** + * loop + */ + + u32x w0l = w0[0]; + + for (u32 il_pos = 0; il_pos < bfs_cnt; il_pos++) + { + const u32 w0r = c_bfs[il_pos].i; + + w0[0] = w0l | w0r; + + /** + * pads + */ + + u32x w0_t[4]; + + w0_t[0] = w0[0]; + w0_t[1] = w0[1]; + w0_t[2] = w0[2]; + w0_t[3] = w0[3]; + + u32x w1_t[4]; + + w1_t[0] = w1[0]; + w1_t[1] = w1[1]; + w1_t[2] = w1[2]; + w1_t[3] = w1[3]; + + u32x w2_t[4]; + + w2_t[0] = w2[0]; + w2_t[1] = w2[1]; + w2_t[2] = w2[2]; + w2_t[3] = w2[3]; + + u32x w3_t[4]; + + w3_t[0] = w3[0]; + w3_t[1] = w3[1]; + w3_t[2] = 0; + w3_t[3] = 0; + + u32x ipad[5]; + u32x opad[5]; + + hmac_sha1_pad (w0_t, w1_t, w2_t, w3_t, ipad, opad); + + w0_t[0] = swap_workaround (salt_buf0[0]); + w0_t[1] = swap_workaround (salt_buf0[1]); + w0_t[2] = swap_workaround (salt_buf0[2]); + w0_t[3] = swap_workaround (salt_buf0[3]); + w1_t[0] = swap_workaround (salt_buf1[0]); + w1_t[1] = swap_workaround (salt_buf1[1]); + w1_t[2] = swap_workaround (salt_buf1[2]); + w1_t[3] = swap_workaround (salt_buf1[3]); + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = (64 + salt_len) * 8; + + u32x digest[5]; + + hmac_sha1_run (w0_t, w1_t, w2_t, w3_t, ipad, opad, digest); + + const u32x r0 = digest[3]; + const u32x r1 = digest[4]; + const u32x r2 = digest[2]; + const u32x r3 = digest[1]; + + #include VECT_COMPARE_M + } +} + +__device__ static void m00150s (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], const u32 pw_len, const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset) +{ + /** + * modifier + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + const u32 lid = threadIdx.x; + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[ 1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[ 2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[ 3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[ 4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[ 5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[ 6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[ 7]; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * loop + */ + + u32x w0l = w0[0]; + + for (u32 il_pos = 0; il_pos < bfs_cnt; il_pos++) + { + const u32 w0r = c_bfs[il_pos].i; + + w0[0] = w0l | w0r; + + /** + * pads + */ + + u32x w0_t[4]; + + w0_t[0] = w0[0]; + w0_t[1] = w0[1]; + w0_t[2] = w0[2]; + w0_t[3] = w0[3]; + + u32x w1_t[4]; + + w1_t[0] = w1[0]; + w1_t[1] = w1[1]; + w1_t[2] = w1[2]; + w1_t[3] = w1[3]; + + u32x w2_t[4]; + + w2_t[0] = w2[0]; + w2_t[1] = w2[1]; + w2_t[2] = w2[2]; + w2_t[3] = w2[3]; + + u32x w3_t[4]; + + w3_t[0] = w3[0]; + w3_t[1] = w3[1]; + w3_t[2] = 0; + w3_t[3] = 0; + + u32x ipad[5]; + u32x opad[5]; + + hmac_sha1_pad (w0_t, w1_t, w2_t, w3_t, ipad, opad); + + w0_t[0] = swap_workaround (salt_buf0[0]); + w0_t[1] = swap_workaround (salt_buf0[1]); + w0_t[2] = swap_workaround (salt_buf0[2]); + w0_t[3] = swap_workaround (salt_buf0[3]); + w1_t[0] = swap_workaround (salt_buf1[0]); + w1_t[1] = swap_workaround (salt_buf1[1]); + w1_t[2] = swap_workaround (salt_buf1[2]); + w1_t[3] = swap_workaround (salt_buf1[3]); + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = (64 + salt_len) * 8; + + u32x digest[5]; + + hmac_sha1_run (w0_t, w1_t, w2_t, w3_t, ipad, opad, digest); + + const u32x r0 = digest[3]; + const u32x r1 = digest[4]; + const u32x r2 = digest[2]; + const u32x r3 = digest[1]; + + #include VECT_COMPARE_S + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m00150_m04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m00150m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m00150_m08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m00150m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m00150_m16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = pws[gid].i[ 8]; + w2[1] = pws[gid].i[ 9]; + w2[2] = pws[gid].i[10]; + w2[3] = pws[gid].i[11]; + + u32x w3[4]; + + w3[0] = pws[gid].i[12]; + w3[1] = pws[gid].i[13]; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m00150m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m00150_s04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m00150s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m00150_s08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m00150s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m00150_s16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = pws[gid].i[ 8]; + w2[1] = pws[gid].i[ 9]; + w2[2] = pws[gid].i[10]; + w2[3] = pws[gid].i[11]; + + u32x w3[4]; + + w3[0] = pws[gid].i[12]; + w3[1] = pws[gid].i[13]; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m00150s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} diff --git a/nv/m00160_a0.cu b/nv/m00160_a0.cu new file mode 100644 index 0000000000..40f56bb82d --- /dev/null +++ b/nv/m00160_a0.cu @@ -0,0 +1,600 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _SHA1_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW2 +#define VECT_SIZE1 +#endif + +#define DGST_R0 3 +#define DGST_R1 4 +#define DGST_R2 2 +#define DGST_R3 1 + +#include "include/kernel_functions.c" +#include "types_nv.c" +#include "common_nv.c" +#include "include/rp_gpu.h" +#include "rp_nv.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +__device__ static void sha1_transform (const u32x w0[4], const u32x w1[4], const u32x w2[4], const u32x w3[4], u32x digest[5]) +{ + u32x A = digest[0]; + u32x B = digest[1]; + u32x C = digest[2]; + u32x D = digest[3]; + u32x E = digest[4]; + + u32x w0_t = w0[0]; + u32x w1_t = w0[1]; + u32x w2_t = w0[2]; + u32x w3_t = w0[3]; + u32x w4_t = w1[0]; + u32x w5_t = w1[1]; + u32x w6_t = w1[2]; + u32x w7_t = w1[3]; + u32x w8_t = w2[0]; + u32x w9_t = w2[1]; + u32x wa_t = w2[2]; + u32x wb_t = w2[3]; + u32x wc_t = w3[0]; + u32x wd_t = w3[1]; + u32x we_t = w3[2]; + u32x wf_t = w3[3]; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, A, B, C, D, E, w0_t); + SHA1_STEP (SHA1_F0o, E, A, B, C, D, w1_t); + SHA1_STEP (SHA1_F0o, D, E, A, B, C, w2_t); + SHA1_STEP (SHA1_F0o, C, D, E, A, B, w3_t); + SHA1_STEP (SHA1_F0o, B, C, D, E, A, w4_t); + SHA1_STEP (SHA1_F0o, A, B, C, D, E, w5_t); + SHA1_STEP (SHA1_F0o, E, A, B, C, D, w6_t); + SHA1_STEP (SHA1_F0o, D, E, A, B, C, w7_t); + SHA1_STEP (SHA1_F0o, C, D, E, A, B, w8_t); + SHA1_STEP (SHA1_F0o, B, C, D, E, A, w9_t); + SHA1_STEP (SHA1_F0o, A, B, C, D, E, wa_t); + SHA1_STEP (SHA1_F0o, E, A, B, C, D, wb_t); + SHA1_STEP (SHA1_F0o, D, E, A, B, C, wc_t); + SHA1_STEP (SHA1_F0o, C, D, E, A, B, wd_t); + SHA1_STEP (SHA1_F0o, B, C, D, E, A, we_t); + SHA1_STEP (SHA1_F0o, A, B, C, D, E, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F0o, E, A, B, C, D, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F0o, D, E, A, B, C, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F0o, C, D, E, A, B, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F0o, B, C, D, E, A, w3_t); + + #undef K + #define K SHA1C01 + + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w7_t); + + #undef K + #define K SHA1C02 + + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, wb_t); + + #undef K + #define K SHA1C03 + + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, wf_t); + + digest[0] += A; + digest[1] += B; + digest[2] += C; + digest[3] += D; + digest[4] += E; +} + +__device__ static void hmac_sha1_pad (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], u32x ipad[5], u32x opad[5]) +{ + w0[0] = w0[0] ^ 0x36363636; + w0[1] = w0[1] ^ 0x36363636; + w0[2] = w0[2] ^ 0x36363636; + w0[3] = w0[3] ^ 0x36363636; + w1[0] = w1[0] ^ 0x36363636; + w1[1] = w1[1] ^ 0x36363636; + w1[2] = w1[2] ^ 0x36363636; + w1[3] = w1[3] ^ 0x36363636; + w2[0] = w2[0] ^ 0x36363636; + w2[1] = w2[1] ^ 0x36363636; + w2[2] = w2[2] ^ 0x36363636; + w2[3] = w2[3] ^ 0x36363636; + w3[0] = w3[0] ^ 0x36363636; + w3[1] = w3[1] ^ 0x36363636; + w3[2] = w3[2] ^ 0x36363636; + w3[3] = w3[3] ^ 0x36363636; + + ipad[0] = SHA1M_A; + ipad[1] = SHA1M_B; + ipad[2] = SHA1M_C; + ipad[3] = SHA1M_D; + ipad[4] = SHA1M_E; + + sha1_transform (w0, w1, w2, w3, ipad); + + w0[0] = w0[0] ^ 0x6a6a6a6a; + w0[1] = w0[1] ^ 0x6a6a6a6a; + w0[2] = w0[2] ^ 0x6a6a6a6a; + w0[3] = w0[3] ^ 0x6a6a6a6a; + w1[0] = w1[0] ^ 0x6a6a6a6a; + w1[1] = w1[1] ^ 0x6a6a6a6a; + w1[2] = w1[2] ^ 0x6a6a6a6a; + w1[3] = w1[3] ^ 0x6a6a6a6a; + w2[0] = w2[0] ^ 0x6a6a6a6a; + w2[1] = w2[1] ^ 0x6a6a6a6a; + w2[2] = w2[2] ^ 0x6a6a6a6a; + w2[3] = w2[3] ^ 0x6a6a6a6a; + w3[0] = w3[0] ^ 0x6a6a6a6a; + w3[1] = w3[1] ^ 0x6a6a6a6a; + w3[2] = w3[2] ^ 0x6a6a6a6a; + w3[3] = w3[3] ^ 0x6a6a6a6a; + + opad[0] = SHA1M_A; + opad[1] = SHA1M_B; + opad[2] = SHA1M_C; + opad[3] = SHA1M_D; + opad[4] = SHA1M_E; + + sha1_transform (w0, w1, w2, w3, opad); +} + +__device__ static void hmac_sha1_run (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], u32x ipad[5], u32x opad[5], u32x digest[5]) +{ + digest[0] = ipad[0]; + digest[1] = ipad[1]; + digest[2] = ipad[2]; + digest[3] = ipad[3]; + digest[4] = ipad[4]; + + sha1_transform (w0, w1, w2, w3, digest); + + w0[0] = digest[0]; + w0[1] = digest[1]; + w0[2] = digest[2]; + w0[3] = digest[3]; + w1[0] = digest[4]; + w1[1] = 0x80000000; + w1[2] = 0; + w1[3] = 0; + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = (64 + 20) * 8; + + digest[0] = opad[0]; + digest[1] = opad[1]; + digest[2] = opad[2]; + digest[3] = opad[3]; + digest[4] = opad[4]; + + sha1_transform (w0, w1, w2, w3, digest); +} + +__device__ __constant__ gpu_rule_t c_rules[1024]; + +extern "C" __global__ void __launch_bounds__ (256, 1) m00160_m04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + u32x pw_buf1[4]; + + pw_buf1[0] = pws[gid].i[ 4]; + pw_buf1[1] = pws[gid].i[ 5]; + pw_buf1[2] = pws[gid].i[ 6]; + pw_buf1[3] = pws[gid].i[ 7]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[ 1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[ 2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[ 3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[ 4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[ 5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[ 6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[ 7]; + + /** + * pads + */ + + u32x w0_t[4]; + + w0_t[0] = swap_workaround (salt_buf0[0]); + w0_t[1] = swap_workaround (salt_buf0[1]); + w0_t[2] = swap_workaround (salt_buf0[2]); + w0_t[3] = swap_workaround (salt_buf0[3]); + + u32x w1_t[4]; + + w1_t[0] = swap_workaround (salt_buf1[0]); + w1_t[1] = swap_workaround (salt_buf1[1]); + w1_t[2] = swap_workaround (salt_buf1[2]); + w1_t[3] = swap_workaround (salt_buf1[3]); + + u32x w2_t[4]; + + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + + u32x w3_t[4]; + + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = 0; + + u32x ipad[5]; + u32x opad[5]; + + hmac_sha1_pad (w0_t, w1_t, w2_t, w3_t, ipad, opad); + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + + w0[0] = pw_buf0[0]; + w0[1] = pw_buf0[1]; + w0[2] = pw_buf0[2]; + w0[3] = pw_buf0[3]; + + u32x w1[4]; + + w1[0] = pw_buf1[0]; + w1[1] = pw_buf1[1]; + w1[2] = pw_buf1[2]; + w1[3] = pw_buf1[3]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 out_len = apply_rules (c_rules[il_pos].cmds, w0, w1, pw_len); + + append_0x80_2 (w0, w1, out_len); + + w0_t[0] = swap_workaround (w0[0]); + w0_t[1] = swap_workaround (w0[1]); + w0_t[2] = swap_workaround (w0[2]); + w0_t[3] = swap_workaround (w0[3]); + w1_t[0] = swap_workaround (w1[0]); + w1_t[1] = swap_workaround (w1[1]); + w1_t[2] = swap_workaround (w1[2]); + w1_t[3] = swap_workaround (w1[3]); + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = (64 + out_len) * 8; + + u32x digest[5]; + + hmac_sha1_run (w0_t, w1_t, w2_t, w3_t, ipad, opad, digest); + + const u32x r0 = digest[3]; + const u32x r1 = digest[4]; + const u32x r2 = digest[2]; + const u32x r3 = digest[1]; + + #include VECT_COMPARE_M + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m00160_m08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m00160_m16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m00160_s04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + u32x pw_buf1[4]; + + pw_buf1[0] = pws[gid].i[ 4]; + pw_buf1[1] = pws[gid].i[ 5]; + pw_buf1[2] = pws[gid].i[ 6]; + pw_buf1[3] = pws[gid].i[ 7]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[ 1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[ 2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[ 3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[ 4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[ 5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[ 6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[ 7]; + + /** + * pads + */ + + u32x w0_t[4]; + + w0_t[0] = swap_workaround (salt_buf0[0]); + w0_t[1] = swap_workaround (salt_buf0[1]); + w0_t[2] = swap_workaround (salt_buf0[2]); + w0_t[3] = swap_workaround (salt_buf0[3]); + + u32x w1_t[4]; + + w1_t[0] = swap_workaround (salt_buf1[0]); + w1_t[1] = swap_workaround (salt_buf1[1]); + w1_t[2] = swap_workaround (salt_buf1[2]); + w1_t[3] = swap_workaround (salt_buf1[3]); + + u32x w2_t[4]; + + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + + u32x w3_t[4]; + + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = 0; + + u32x ipad[5]; + u32x opad[5]; + + hmac_sha1_pad (w0_t, w1_t, w2_t, w3_t, ipad, opad); + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + + w0[0] = pw_buf0[0]; + w0[1] = pw_buf0[1]; + w0[2] = pw_buf0[2]; + w0[3] = pw_buf0[3]; + + u32x w1[4]; + + w1[0] = pw_buf1[0]; + w1[1] = pw_buf1[1]; + w1[2] = pw_buf1[2]; + w1[3] = pw_buf1[3]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 out_len = apply_rules (c_rules[il_pos].cmds, w0, w1, pw_len); + + append_0x80_2 (w0, w1, out_len); + + w0_t[0] = swap_workaround (w0[0]); + w0_t[1] = swap_workaround (w0[1]); + w0_t[2] = swap_workaround (w0[2]); + w0_t[3] = swap_workaround (w0[3]); + w1_t[0] = swap_workaround (w1[0]); + w1_t[1] = swap_workaround (w1[1]); + w1_t[2] = swap_workaround (w1[2]); + w1_t[3] = swap_workaround (w1[3]); + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = (64 + out_len) * 8; + + u32x digest[5]; + + hmac_sha1_run (w0_t, w1_t, w2_t, w3_t, ipad, opad, digest); + + const u32x r0 = digest[3]; + const u32x r1 = digest[4]; + const u32x r2 = digest[2]; + const u32x r3 = digest[1]; + + #include VECT_COMPARE_S + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m00160_s08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m00160_s16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/nv/m00160_a1.cu b/nv/m00160_a1.cu new file mode 100644 index 0000000000..96e7dd6478 --- /dev/null +++ b/nv/m00160_a1.cu @@ -0,0 +1,706 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _SHA1_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW2 +#define VECT_SIZE4 +#endif + +#define DGST_R0 3 +#define DGST_R1 4 +#define DGST_R2 2 +#define DGST_R3 1 + +#include "include/kernel_functions.c" +#include "types_nv.c" +#include "common_nv.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +__device__ static void sha1_transform (const u32x w0[4], const u32x w1[4], const u32x w2[4], const u32x w3[4], u32x digest[5]) +{ + u32x A = digest[0]; + u32x B = digest[1]; + u32x C = digest[2]; + u32x D = digest[3]; + u32x E = digest[4]; + + u32x w0_t = w0[0]; + u32x w1_t = w0[1]; + u32x w2_t = w0[2]; + u32x w3_t = w0[3]; + u32x w4_t = w1[0]; + u32x w5_t = w1[1]; + u32x w6_t = w1[2]; + u32x w7_t = w1[3]; + u32x w8_t = w2[0]; + u32x w9_t = w2[1]; + u32x wa_t = w2[2]; + u32x wb_t = w2[3]; + u32x wc_t = w3[0]; + u32x wd_t = w3[1]; + u32x we_t = w3[2]; + u32x wf_t = w3[3]; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, A, B, C, D, E, w0_t); + SHA1_STEP (SHA1_F0o, E, A, B, C, D, w1_t); + SHA1_STEP (SHA1_F0o, D, E, A, B, C, w2_t); + SHA1_STEP (SHA1_F0o, C, D, E, A, B, w3_t); + SHA1_STEP (SHA1_F0o, B, C, D, E, A, w4_t); + SHA1_STEP (SHA1_F0o, A, B, C, D, E, w5_t); + SHA1_STEP (SHA1_F0o, E, A, B, C, D, w6_t); + SHA1_STEP (SHA1_F0o, D, E, A, B, C, w7_t); + SHA1_STEP (SHA1_F0o, C, D, E, A, B, w8_t); + SHA1_STEP (SHA1_F0o, B, C, D, E, A, w9_t); + SHA1_STEP (SHA1_F0o, A, B, C, D, E, wa_t); + SHA1_STEP (SHA1_F0o, E, A, B, C, D, wb_t); + SHA1_STEP (SHA1_F0o, D, E, A, B, C, wc_t); + SHA1_STEP (SHA1_F0o, C, D, E, A, B, wd_t); + SHA1_STEP (SHA1_F0o, B, C, D, E, A, we_t); + SHA1_STEP (SHA1_F0o, A, B, C, D, E, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F0o, E, A, B, C, D, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F0o, D, E, A, B, C, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F0o, C, D, E, A, B, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F0o, B, C, D, E, A, w3_t); + + #undef K + #define K SHA1C01 + + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w7_t); + + #undef K + #define K SHA1C02 + + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, wb_t); + + #undef K + #define K SHA1C03 + + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, wf_t); + + digest[0] += A; + digest[1] += B; + digest[2] += C; + digest[3] += D; + digest[4] += E; +} + +__device__ static void hmac_sha1_pad (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], u32x ipad[5], u32x opad[5]) +{ + w0[0] = w0[0] ^ 0x36363636; + w0[1] = w0[1] ^ 0x36363636; + w0[2] = w0[2] ^ 0x36363636; + w0[3] = w0[3] ^ 0x36363636; + w1[0] = w1[0] ^ 0x36363636; + w1[1] = w1[1] ^ 0x36363636; + w1[2] = w1[2] ^ 0x36363636; + w1[3] = w1[3] ^ 0x36363636; + w2[0] = w2[0] ^ 0x36363636; + w2[1] = w2[1] ^ 0x36363636; + w2[2] = w2[2] ^ 0x36363636; + w2[3] = w2[3] ^ 0x36363636; + w3[0] = w3[0] ^ 0x36363636; + w3[1] = w3[1] ^ 0x36363636; + w3[2] = w3[2] ^ 0x36363636; + w3[3] = w3[3] ^ 0x36363636; + + ipad[0] = SHA1M_A; + ipad[1] = SHA1M_B; + ipad[2] = SHA1M_C; + ipad[3] = SHA1M_D; + ipad[4] = SHA1M_E; + + sha1_transform (w0, w1, w2, w3, ipad); + + w0[0] = w0[0] ^ 0x6a6a6a6a; + w0[1] = w0[1] ^ 0x6a6a6a6a; + w0[2] = w0[2] ^ 0x6a6a6a6a; + w0[3] = w0[3] ^ 0x6a6a6a6a; + w1[0] = w1[0] ^ 0x6a6a6a6a; + w1[1] = w1[1] ^ 0x6a6a6a6a; + w1[2] = w1[2] ^ 0x6a6a6a6a; + w1[3] = w1[3] ^ 0x6a6a6a6a; + w2[0] = w2[0] ^ 0x6a6a6a6a; + w2[1] = w2[1] ^ 0x6a6a6a6a; + w2[2] = w2[2] ^ 0x6a6a6a6a; + w2[3] = w2[3] ^ 0x6a6a6a6a; + w3[0] = w3[0] ^ 0x6a6a6a6a; + w3[1] = w3[1] ^ 0x6a6a6a6a; + w3[2] = w3[2] ^ 0x6a6a6a6a; + w3[3] = w3[3] ^ 0x6a6a6a6a; + + opad[0] = SHA1M_A; + opad[1] = SHA1M_B; + opad[2] = SHA1M_C; + opad[3] = SHA1M_D; + opad[4] = SHA1M_E; + + sha1_transform (w0, w1, w2, w3, opad); +} + +__device__ static void hmac_sha1_run (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], u32x ipad[5], u32x opad[5], u32x digest[5]) +{ + digest[0] = ipad[0]; + digest[1] = ipad[1]; + digest[2] = ipad[2]; + digest[3] = ipad[3]; + digest[4] = ipad[4]; + + sha1_transform (w0, w1, w2, w3, digest); + + w0[0] = digest[0]; + w0[1] = digest[1]; + w0[2] = digest[2]; + w0[3] = digest[3]; + w1[0] = digest[4]; + w1[1] = 0x80000000; + w1[2] = 0; + w1[3] = 0; + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = (64 + 20) * 8; + + digest[0] = opad[0]; + digest[1] = opad[1]; + digest[2] = opad[2]; + digest[3] = opad[3]; + digest[4] = opad[4]; + + sha1_transform (w0, w1, w2, w3, digest); +} + +__device__ __constant__ comb_t c_combs[1024]; + +extern "C" __global__ void __launch_bounds__ (256, 1) m00160_m04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, c_combs[0].pw_len); + } + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[ 1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[ 2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[ 3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[ 4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[ 5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[ 6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[ 7]; + + /** + * pads + */ + + u32x w0_t[4]; + + w0_t[0] = swap_workaround (salt_buf0[0]); + w0_t[1] = swap_workaround (salt_buf0[1]); + w0_t[2] = swap_workaround (salt_buf0[2]); + w0_t[3] = swap_workaround (salt_buf0[3]); + + u32x w1_t[4]; + + w1_t[0] = swap_workaround (salt_buf1[0]); + w1_t[1] = swap_workaround (salt_buf1[1]); + w1_t[2] = swap_workaround (salt_buf1[2]); + w1_t[3] = swap_workaround (salt_buf1[3]); + + u32x w2_t[4]; + + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + + u32x w3_t[4]; + + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = 0; + + u32x ipad[5]; + u32x opad[5]; + + hmac_sha1_pad (w0_t, w1_t, w2_t, w3_t, ipad, opad); + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = c_combs[il_pos].pw_len; + + const u32 pw_len = pw_l_len + pw_r_len; + + u32 wordr0[4]; + + wordr0[0] = c_combs[il_pos].i[0]; + wordr0[1] = c_combs[il_pos].i[1]; + wordr0[2] = c_combs[il_pos].i[2]; + wordr0[3] = c_combs[il_pos].i[3]; + + u32 wordr1[4]; + + wordr1[0] = c_combs[il_pos].i[4]; + wordr1[1] = c_combs[il_pos].i[5]; + wordr1[2] = c_combs[il_pos].i[6]; + wordr1[3] = c_combs[il_pos].i[7]; + + u32 wordr2[4]; + + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + + u32 wordr3[4]; + + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + u32x w0[4]; + + w0[0] = wordl0[0] | wordr0[0]; + w0[1] = wordl0[1] | wordr0[1]; + w0[2] = wordl0[2] | wordr0[2]; + w0[3] = wordl0[3] | wordr0[3]; + + u32x w1[4]; + + w1[0] = wordl1[0] | wordr1[0]; + w1[1] = wordl1[1] | wordr1[1]; + w1[2] = wordl1[2] | wordr1[2]; + w1[3] = wordl1[3] | wordr1[3]; + + u32x w2[4]; + + w2[0] = wordl2[0] | wordr2[0]; + w2[1] = wordl2[1] | wordr2[1]; + w2[2] = wordl2[2] | wordr2[2]; + w2[3] = wordl2[3] | wordr2[3]; + + u32x w3[4]; + + w3[0] = wordl3[0] | wordr3[0]; + w3[1] = wordl3[1] | wordr3[1]; + w3[2] = 0; + w3[3] = 0; + + append_0x80_4 (w0, w1, w2, w3, pw_len); + + w0_t[0] = swap_workaround (w0[0]); + w0_t[1] = swap_workaround (w0[1]); + w0_t[2] = swap_workaround (w0[2]); + w0_t[3] = swap_workaround (w0[3]); + w1_t[0] = swap_workaround (w1[0]); + w1_t[1] = swap_workaround (w1[1]); + w1_t[2] = swap_workaround (w1[2]); + w1_t[3] = swap_workaround (w1[3]); + w2_t[0] = swap_workaround (w2[0]); + w2_t[1] = swap_workaround (w2[1]); + w2_t[2] = swap_workaround (w2[2]); + w2_t[3] = swap_workaround (w2[3]); + w3_t[0] = swap_workaround (w3[0]); + w3_t[1] = swap_workaround (w3[1]); + w3_t[2] = 0; + w3_t[3] = (64 + pw_len) * 8; + + u32x digest[5]; + + hmac_sha1_run (w0_t, w1_t, w2_t, w3_t, ipad, opad, digest); + + const u32x r0 = digest[3]; + const u32x r1 = digest[4]; + const u32x r2 = digest[2]; + const u32x r3 = digest[1]; + + #include VECT_COMPARE_M + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m00160_m08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m00160_m16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m00160_s04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, c_combs[0].pw_len); + } + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[ 1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[ 2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[ 3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[ 4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[ 5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[ 6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[ 7]; + + /** + * pads + */ + + u32x w0_t[4]; + + w0_t[0] = swap_workaround (salt_buf0[0]); + w0_t[1] = swap_workaround (salt_buf0[1]); + w0_t[2] = swap_workaround (salt_buf0[2]); + w0_t[3] = swap_workaround (salt_buf0[3]); + + u32x w1_t[4]; + + w1_t[0] = swap_workaround (salt_buf1[0]); + w1_t[1] = swap_workaround (salt_buf1[1]); + w1_t[2] = swap_workaround (salt_buf1[2]); + w1_t[3] = swap_workaround (salt_buf1[3]); + + u32x w2_t[4]; + + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + + u32x w3_t[4]; + + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = 0; + + u32x ipad[5]; + u32x opad[5]; + + hmac_sha1_pad (w0_t, w1_t, w2_t, w3_t, ipad, opad); + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = c_combs[il_pos].pw_len; + + const u32 pw_len = pw_l_len + pw_r_len; + + u32 wordr0[4]; + + wordr0[0] = c_combs[il_pos].i[0]; + wordr0[1] = c_combs[il_pos].i[1]; + wordr0[2] = c_combs[il_pos].i[2]; + wordr0[3] = c_combs[il_pos].i[3]; + + u32 wordr1[4]; + + wordr1[0] = c_combs[il_pos].i[4]; + wordr1[1] = c_combs[il_pos].i[5]; + wordr1[2] = c_combs[il_pos].i[6]; + wordr1[3] = c_combs[il_pos].i[7]; + + u32 wordr2[4]; + + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + + u32 wordr3[4]; + + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + u32x w0[4]; + + w0[0] = wordl0[0] | wordr0[0]; + w0[1] = wordl0[1] | wordr0[1]; + w0[2] = wordl0[2] | wordr0[2]; + w0[3] = wordl0[3] | wordr0[3]; + + u32x w1[4]; + + w1[0] = wordl1[0] | wordr1[0]; + w1[1] = wordl1[1] | wordr1[1]; + w1[2] = wordl1[2] | wordr1[2]; + w1[3] = wordl1[3] | wordr1[3]; + + u32x w2[4]; + + w2[0] = wordl2[0] | wordr2[0]; + w2[1] = wordl2[1] | wordr2[1]; + w2[2] = wordl2[2] | wordr2[2]; + w2[3] = wordl2[3] | wordr2[3]; + + u32x w3[4]; + + w3[0] = wordl3[0] | wordr3[0]; + w3[1] = wordl3[1] | wordr3[1]; + w3[2] = 0; + w3[3] = 0; + + append_0x80_4 (w0, w1, w2, w3, pw_len); + + w0_t[0] = swap_workaround (w0[0]); + w0_t[1] = swap_workaround (w0[1]); + w0_t[2] = swap_workaround (w0[2]); + w0_t[3] = swap_workaround (w0[3]); + w1_t[0] = swap_workaround (w1[0]); + w1_t[1] = swap_workaround (w1[1]); + w1_t[2] = swap_workaround (w1[2]); + w1_t[3] = swap_workaround (w1[3]); + w2_t[0] = swap_workaround (w2[0]); + w2_t[1] = swap_workaround (w2[1]); + w2_t[2] = swap_workaround (w2[2]); + w2_t[3] = swap_workaround (w2[3]); + w3_t[0] = swap_workaround (w3[0]); + w3_t[1] = swap_workaround (w3[1]); + w3_t[2] = 0; + w3_t[3] = (64 + pw_len) * 8; + + u32x digest[5]; + + hmac_sha1_run (w0_t, w1_t, w2_t, w3_t, ipad, opad, digest); + + const u32x r0 = digest[3]; + const u32x r1 = digest[4]; + const u32x r2 = digest[2]; + const u32x r3 = digest[1]; + + #include VECT_COMPARE_S + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m00160_s08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m00160_s16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/nv/m00160_a3.cu b/nv/m00160_a3.cu new file mode 100644 index 0000000000..a5c4ef98de --- /dev/null +++ b/nv/m00160_a3.cu @@ -0,0 +1,767 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _SHA1_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW2 +#define VECT_SIZE4 +#endif + +#define DGST_R0 3 +#define DGST_R1 4 +#define DGST_R2 2 +#define DGST_R3 1 + +#include "include/kernel_functions.c" +#include "types_nv.c" +#include "common_nv.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +__device__ static void sha1_transform (const u32x w0[4], const u32x w1[4], const u32x w2[4], const u32x w3[4], u32x digest[5]) +{ + u32x A = digest[0]; + u32x B = digest[1]; + u32x C = digest[2]; + u32x D = digest[3]; + u32x E = digest[4]; + + u32x w0_t = w0[0]; + u32x w1_t = w0[1]; + u32x w2_t = w0[2]; + u32x w3_t = w0[3]; + u32x w4_t = w1[0]; + u32x w5_t = w1[1]; + u32x w6_t = w1[2]; + u32x w7_t = w1[3]; + u32x w8_t = w2[0]; + u32x w9_t = w2[1]; + u32x wa_t = w2[2]; + u32x wb_t = w2[3]; + u32x wc_t = w3[0]; + u32x wd_t = w3[1]; + u32x we_t = w3[2]; + u32x wf_t = w3[3]; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, A, B, C, D, E, w0_t); + SHA1_STEP (SHA1_F0o, E, A, B, C, D, w1_t); + SHA1_STEP (SHA1_F0o, D, E, A, B, C, w2_t); + SHA1_STEP (SHA1_F0o, C, D, E, A, B, w3_t); + SHA1_STEP (SHA1_F0o, B, C, D, E, A, w4_t); + SHA1_STEP (SHA1_F0o, A, B, C, D, E, w5_t); + SHA1_STEP (SHA1_F0o, E, A, B, C, D, w6_t); + SHA1_STEP (SHA1_F0o, D, E, A, B, C, w7_t); + SHA1_STEP (SHA1_F0o, C, D, E, A, B, w8_t); + SHA1_STEP (SHA1_F0o, B, C, D, E, A, w9_t); + SHA1_STEP (SHA1_F0o, A, B, C, D, E, wa_t); + SHA1_STEP (SHA1_F0o, E, A, B, C, D, wb_t); + SHA1_STEP (SHA1_F0o, D, E, A, B, C, wc_t); + SHA1_STEP (SHA1_F0o, C, D, E, A, B, wd_t); + SHA1_STEP (SHA1_F0o, B, C, D, E, A, we_t); + SHA1_STEP (SHA1_F0o, A, B, C, D, E, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F0o, E, A, B, C, D, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F0o, D, E, A, B, C, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F0o, C, D, E, A, B, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F0o, B, C, D, E, A, w3_t); + + #undef K + #define K SHA1C01 + + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w7_t); + + #undef K + #define K SHA1C02 + + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, wb_t); + + #undef K + #define K SHA1C03 + + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, wf_t); + + digest[0] += A; + digest[1] += B; + digest[2] += C; + digest[3] += D; + digest[4] += E; +} + +__device__ static void hmac_sha1_pad (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], u32x ipad[5], u32x opad[5]) +{ + w0[0] = w0[0] ^ 0x36363636; + w0[1] = w0[1] ^ 0x36363636; + w0[2] = w0[2] ^ 0x36363636; + w0[3] = w0[3] ^ 0x36363636; + w1[0] = w1[0] ^ 0x36363636; + w1[1] = w1[1] ^ 0x36363636; + w1[2] = w1[2] ^ 0x36363636; + w1[3] = w1[3] ^ 0x36363636; + w2[0] = w2[0] ^ 0x36363636; + w2[1] = w2[1] ^ 0x36363636; + w2[2] = w2[2] ^ 0x36363636; + w2[3] = w2[3] ^ 0x36363636; + w3[0] = w3[0] ^ 0x36363636; + w3[1] = w3[1] ^ 0x36363636; + w3[2] = w3[2] ^ 0x36363636; + w3[3] = w3[3] ^ 0x36363636; + + ipad[0] = SHA1M_A; + ipad[1] = SHA1M_B; + ipad[2] = SHA1M_C; + ipad[3] = SHA1M_D; + ipad[4] = SHA1M_E; + + sha1_transform (w0, w1, w2, w3, ipad); + + w0[0] = w0[0] ^ 0x6a6a6a6a; + w0[1] = w0[1] ^ 0x6a6a6a6a; + w0[2] = w0[2] ^ 0x6a6a6a6a; + w0[3] = w0[3] ^ 0x6a6a6a6a; + w1[0] = w1[0] ^ 0x6a6a6a6a; + w1[1] = w1[1] ^ 0x6a6a6a6a; + w1[2] = w1[2] ^ 0x6a6a6a6a; + w1[3] = w1[3] ^ 0x6a6a6a6a; + w2[0] = w2[0] ^ 0x6a6a6a6a; + w2[1] = w2[1] ^ 0x6a6a6a6a; + w2[2] = w2[2] ^ 0x6a6a6a6a; + w2[3] = w2[3] ^ 0x6a6a6a6a; + w3[0] = w3[0] ^ 0x6a6a6a6a; + w3[1] = w3[1] ^ 0x6a6a6a6a; + w3[2] = w3[2] ^ 0x6a6a6a6a; + w3[3] = w3[3] ^ 0x6a6a6a6a; + + opad[0] = SHA1M_A; + opad[1] = SHA1M_B; + opad[2] = SHA1M_C; + opad[3] = SHA1M_D; + opad[4] = SHA1M_E; + + sha1_transform (w0, w1, w2, w3, opad); +} + +__device__ static void hmac_sha1_run (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], u32x ipad[5], u32x opad[5], u32x digest[5]) +{ + digest[0] = ipad[0]; + digest[1] = ipad[1]; + digest[2] = ipad[2]; + digest[3] = ipad[3]; + digest[4] = ipad[4]; + + sha1_transform (w0, w1, w2, w3, digest); + + w0[0] = digest[0]; + w0[1] = digest[1]; + w0[2] = digest[2]; + w0[3] = digest[3]; + w1[0] = digest[4]; + w1[1] = 0x80000000; + w1[2] = 0; + w1[3] = 0; + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = (64 + 20) * 8; + + digest[0] = opad[0]; + digest[1] = opad[1]; + digest[2] = opad[2]; + digest[3] = opad[3]; + digest[4] = opad[4]; + + sha1_transform (w0, w1, w2, w3, digest); +} + +__device__ __constant__ bf_t c_bfs[1024]; + +__device__ static void m00160m (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], const u32 pw_len, const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset) +{ + /** + * modifier + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + const u32 lid = threadIdx.x; + + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[ 1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[ 2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[ 3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[ 4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[ 5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[ 6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[ 7]; + + /** + * pads + */ + + u32x w0_t[4]; + + w0_t[0] = swap_workaround (salt_buf0[0]); + w0_t[1] = swap_workaround (salt_buf0[1]); + w0_t[2] = swap_workaround (salt_buf0[2]); + w0_t[3] = swap_workaround (salt_buf0[3]); + + u32x w1_t[4]; + + w1_t[0] = swap_workaround (salt_buf1[0]); + w1_t[1] = swap_workaround (salt_buf1[1]); + w1_t[2] = swap_workaround (salt_buf1[2]); + w1_t[3] = swap_workaround (salt_buf1[3]); + + u32x w2_t[4]; + + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + + u32x w3_t[4]; + + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = 0; + + u32x ipad[5]; + u32x opad[5]; + + hmac_sha1_pad (w0_t, w1_t, w2_t, w3_t, ipad, opad); + + /** + * loop + */ + + u32x w0l = w0[0]; + + for (u32 il_pos = 0; il_pos < bfs_cnt; il_pos++) + { + const u32 w0r = c_bfs[il_pos].i; + + w0[0] = w0l | w0r; + + w0_t[0] = w0[0]; + w0_t[1] = w0[1]; + w0_t[2] = w0[2]; + w0_t[3] = w0[3]; + w1_t[0] = w1[0]; + w1_t[1] = w1[1]; + w1_t[2] = w1[2]; + w1_t[3] = w1[3]; + w2_t[0] = w2[0]; + w2_t[1] = w2[1]; + w2_t[2] = w2[2]; + w2_t[3] = w2[3]; + w3_t[0] = w3[0]; + w3_t[1] = w3[1]; + w3_t[2] = 0; + w3_t[3] = (64 + pw_len) * 8; + + u32x digest[5]; + + hmac_sha1_run (w0_t, w1_t, w2_t, w3_t, ipad, opad, digest); + + const u32x r0 = digest[3]; + const u32x r1 = digest[4]; + const u32x r2 = digest[2]; + const u32x r3 = digest[1]; + + #include VECT_COMPARE_M + } +} + +__device__ static void m00160s (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], const u32 pw_len, const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset) +{ + /** + * modifier + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + const u32 lid = threadIdx.x; + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[ 1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[ 2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[ 3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[ 4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[ 5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[ 6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[ 7]; + + /** + * pads + */ + + u32x w0_t[4]; + + w0_t[0] = swap_workaround (salt_buf0[0]); + w0_t[1] = swap_workaround (salt_buf0[1]); + w0_t[2] = swap_workaround (salt_buf0[2]); + w0_t[3] = swap_workaround (salt_buf0[3]); + + u32x w1_t[4]; + + w1_t[0] = swap_workaround (salt_buf1[0]); + w1_t[1] = swap_workaround (salt_buf1[1]); + w1_t[2] = swap_workaround (salt_buf1[2]); + w1_t[3] = swap_workaround (salt_buf1[3]); + + u32x w2_t[4]; + + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + + u32x w3_t[4]; + + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = 0; + + u32x ipad[5]; + u32x opad[5]; + + hmac_sha1_pad (w0_t, w1_t, w2_t, w3_t, ipad, opad); + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * loop + */ + + u32x w0l = w0[0]; + + for (u32 il_pos = 0; il_pos < bfs_cnt; il_pos++) + { + const u32 w0r = c_bfs[il_pos].i; + + w0[0] = w0l | w0r; + + w0_t[0] = w0[0]; + w0_t[1] = w0[1]; + w0_t[2] = w0[2]; + w0_t[3] = w0[3]; + w1_t[0] = w1[0]; + w1_t[1] = w1[1]; + w1_t[2] = w1[2]; + w1_t[3] = w1[3]; + w2_t[0] = w2[0]; + w2_t[1] = w2[1]; + w2_t[2] = w2[2]; + w2_t[3] = w2[3]; + w3_t[0] = w3[0]; + w3_t[1] = w3[1]; + w3_t[2] = 0; + w3_t[3] = (64 + pw_len) * 8; + + u32x digest[5]; + + hmac_sha1_run (w0_t, w1_t, w2_t, w3_t, ipad, opad, digest); + + const u32x r0 = digest[3]; + const u32x r1 = digest[4]; + const u32x r2 = digest[2]; + const u32x r3 = digest[1]; + + #include VECT_COMPARE_S + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m00160_m04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m00160m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m00160_m08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m00160m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m00160_m16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = pws[gid].i[ 8]; + w2[1] = pws[gid].i[ 9]; + w2[2] = pws[gid].i[10]; + w2[3] = pws[gid].i[11]; + + u32x w3[4]; + + w3[0] = pws[gid].i[12]; + w3[1] = pws[gid].i[13]; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m00160m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m00160_s04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m00160s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m00160_s08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m00160s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m00160_s16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = pws[gid].i[ 8]; + w2[1] = pws[gid].i[ 9]; + w2[2] = pws[gid].i[10]; + w2[3] = pws[gid].i[11]; + + u32x w3[4]; + + w3[0] = pws[gid].i[12]; + w3[1] = pws[gid].i[13]; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m00160s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} diff --git a/nv/m00190_a0.cu b/nv/m00190_a0.cu new file mode 100644 index 0000000000..f1d9685b2c --- /dev/null +++ b/nv/m00190_a0.cu @@ -0,0 +1,513 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _SHA1_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW2 +#define VECT_SIZE1 +#endif + +#define DGST_R0 0 +#define DGST_R1 4 +#define DGST_R2 3 +#define DGST_R3 2 + +#include "include/kernel_functions.c" +#include "types_nv.c" +#include "common_nv.c" +#include "include/rp_gpu.h" +#include "rp_nv.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +__device__ __constant__ gpu_rule_t c_rules[1024]; + +extern "C" __global__ void __launch_bounds__ (256, 1) m00190_m04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + u32x pw_buf1[4]; + + pw_buf1[0] = pws[gid].i[ 4]; + pw_buf1[1] = pws[gid].i[ 5]; + pw_buf1[2] = pws[gid].i[ 6]; + pw_buf1[3] = pws[gid].i[ 7]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + + w0[0] = pw_buf0[0]; + w0[1] = pw_buf0[1]; + w0[2] = pw_buf0[2]; + w0[3] = pw_buf0[3]; + + u32x w1[4]; + + w1[0] = pw_buf1[0]; + w1[1] = pw_buf1[1]; + w1[2] = pw_buf1[2]; + w1[3] = pw_buf1[3]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 out_len = apply_rules (c_rules[il_pos].cmds, w0, w1, pw_len); + + append_0x80_2 (w0, w1, out_len); + + /** + * sha1 + */ + + u32x w0_t = swap_workaround (w0[0]); + u32x w1_t = swap_workaround (w0[1]); + u32x w2_t = swap_workaround (w0[2]); + u32x w3_t = swap_workaround (w0[3]); + u32x w4_t = swap_workaround (w1[0]); + u32x w5_t = swap_workaround (w1[1]); + u32x w6_t = swap_workaround (w1[2]); + u32x w7_t = swap_workaround (w1[3]); + u32x w8_t = swap_workaround (w2[0]); + u32x w9_t = swap_workaround (w2[1]); + u32x wa_t = swap_workaround (w2[2]); + u32x wb_t = swap_workaround (w2[3]); + u32x wc_t = swap_workaround (w3[0]); + u32x wd_t = swap_workaround (w3[1]); + u32x we_t = 0; + u32x wf_t = out_len * 8; + + u32x a = SHA1M_A; + u32x b = SHA1M_B; + u32x c = SHA1M_C; + u32x d = SHA1M_D; + u32x e = SHA1M_E; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w0_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w1_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w2_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w3_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w4_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w5_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w6_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w7_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w8_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w9_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wa_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, wb_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, wc_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, wd_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, we_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F0o, e, a, b, c, d, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F0o, d, e, a, b, c, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F0o, c, d, e, a, b, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F0o, b, c, d, e, a, w3_t); + + #undef K + #define K SHA1C01 + + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w7_t); + + #undef K + #define K SHA1C02 + + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wb_t); + + #undef K + #define K SHA1C03 + + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wf_t); + + a += SHA1M_A; + e += SHA1M_E; + d += SHA1M_D; + c += SHA1M_C; + + { + const u32x r0 = a; + const u32x r1 = e; + const u32x r2 = d; + const u32x r3 = c; + + #include VECT_COMPARE_M + } + + a &= 0x00000fff; + + { + const u32x r0 = a; + const u32x r1 = e; + const u32x r2 = d; + const u32x r3 = c; + + #include VECT_COMPARE_M + } + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m00190_m08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m00190_m16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m00190_s04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + u32x pw_buf1[4]; + + pw_buf1[0] = pws[gid].i[ 4]; + pw_buf1[1] = pws[gid].i[ 5]; + pw_buf1[2] = pws[gid].i[ 6]; + pw_buf1[3] = pws[gid].i[ 7]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3], + }; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + + w0[0] = pw_buf0[0]; + w0[1] = pw_buf0[1]; + w0[2] = pw_buf0[2]; + w0[3] = pw_buf0[3]; + + u32x w1[4]; + + w1[0] = pw_buf1[0]; + w1[1] = pw_buf1[1]; + w1[2] = pw_buf1[2]; + w1[3] = pw_buf1[3]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 out_len = apply_rules (c_rules[il_pos].cmds, w0, w1, pw_len); + + append_0x80_2 (w0, w1, out_len); + + /** + * sha1 + */ + + u32x w0_t = swap_workaround (w0[0]); + u32x w1_t = swap_workaround (w0[1]); + u32x w2_t = swap_workaround (w0[2]); + u32x w3_t = swap_workaround (w0[3]); + u32x w4_t = swap_workaround (w1[0]); + u32x w5_t = swap_workaround (w1[1]); + u32x w6_t = swap_workaround (w1[2]); + u32x w7_t = swap_workaround (w1[3]); + u32x w8_t = swap_workaround (w2[0]); + u32x w9_t = swap_workaround (w2[1]); + u32x wa_t = swap_workaround (w2[2]); + u32x wb_t = swap_workaround (w2[3]); + u32x wc_t = swap_workaround (w3[0]); + u32x wd_t = swap_workaround (w3[1]); + u32x we_t = 0; + u32x wf_t = out_len * 8; + + u32x a = SHA1M_A; + u32x b = SHA1M_B; + u32x c = SHA1M_C; + u32x d = SHA1M_D; + u32x e = SHA1M_E; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w0_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w1_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w2_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w3_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w4_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w5_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w6_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w7_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w8_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w9_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wa_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, wb_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, wc_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, wd_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, we_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F0o, e, a, b, c, d, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F0o, d, e, a, b, c, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F0o, c, d, e, a, b, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F0o, b, c, d, e, a, w3_t); + + #undef K + #define K SHA1C01 + + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w7_t); + + #undef K + #define K SHA1C02 + + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wb_t); + + #undef K + #define K SHA1C03 + + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wf_t); + + a += SHA1M_A; + e += SHA1M_E; + d += SHA1M_D; + c += SHA1M_C; + + { + const u32x r0 = a; + const u32x r1 = e; + const u32x r2 = d; + const u32x r3 = c; + + #include VECT_COMPARE_S + } + + a &= 0x00000fff; + + { + const u32x r0 = a; + const u32x r1 = e; + const u32x r2 = d; + const u32x r3 = c; + + #include VECT_COMPARE_S + } + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m00190_s08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m00190_s16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/nv/m00190_a1.cu b/nv/m00190_a1.cu new file mode 100644 index 0000000000..27100af84a --- /dev/null +++ b/nv/m00190_a1.cu @@ -0,0 +1,623 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _SHA1_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW2 +#define VECT_SIZE4 +#endif + +#define DGST_R0 0 +#define DGST_R1 4 +#define DGST_R2 3 +#define DGST_R3 2 + +#include "include/kernel_functions.c" +#include "types_nv.c" +#include "common_nv.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +__device__ __constant__ comb_t c_combs[1024]; + +extern "C" __global__ void __launch_bounds__ (256, 1) m00190_m04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + append_0x80_2 (wordl0, wordl1, pw_l_len); + + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, c_combs[0].pw_len); + } + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = c_combs[il_pos].pw_len; + + const u32 pw_len = pw_l_len + pw_r_len; + + u32 wordr0[4]; + + wordr0[0] = c_combs[il_pos].i[0]; + wordr0[1] = c_combs[il_pos].i[1]; + wordr0[2] = c_combs[il_pos].i[2]; + wordr0[3] = c_combs[il_pos].i[3]; + + u32 wordr1[4]; + + wordr1[0] = c_combs[il_pos].i[4]; + wordr1[1] = c_combs[il_pos].i[5]; + wordr1[2] = c_combs[il_pos].i[6]; + wordr1[3] = c_combs[il_pos].i[7]; + + u32 wordr2[4]; + + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + + u32 wordr3[4]; + + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + append_0x80_2 (wordr0, wordr1, pw_r_len); + + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + u32x w0[4]; + + w0[0] = wordl0[0] | wordr0[0]; + w0[1] = wordl0[1] | wordr0[1]; + w0[2] = wordl0[2] | wordr0[2]; + w0[3] = wordl0[3] | wordr0[3]; + + u32x w1[4]; + + w1[0] = wordl1[0] | wordr1[0]; + w1[1] = wordl1[1] | wordr1[1]; + w1[2] = wordl1[2] | wordr1[2]; + w1[3] = wordl1[3] | wordr1[3]; + + u32x w2[4]; + + w2[0] = wordl2[0] | wordr2[0]; + w2[1] = wordl2[1] | wordr2[1]; + w2[2] = wordl2[2] | wordr2[2]; + w2[3] = wordl2[3] | wordr2[3]; + + u32x w3[4]; + + w3[0] = wordl3[0] | wordr3[0]; + w3[1] = wordl3[1] | wordr3[1]; + w3[2] = 0; + w3[3] = 0; + + /** + * sha1 + */ + + u32x w0_t = swap_workaround (w0[0]); + u32x w1_t = swap_workaround (w0[1]); + u32x w2_t = swap_workaround (w0[2]); + u32x w3_t = swap_workaround (w0[3]); + u32x w4_t = swap_workaround (w1[0]); + u32x w5_t = swap_workaround (w1[1]); + u32x w6_t = swap_workaround (w1[2]); + u32x w7_t = swap_workaround (w1[3]); + u32x w8_t = swap_workaround (w2[0]); + u32x w9_t = swap_workaround (w2[1]); + u32x wa_t = swap_workaround (w2[2]); + u32x wb_t = swap_workaround (w2[3]); + u32x wc_t = swap_workaround (w3[0]); + u32x wd_t = swap_workaround (w3[1]); + u32x we_t = 0; + u32x wf_t = pw_len * 8; + + u32x a = SHA1M_A; + u32x b = SHA1M_B; + u32x c = SHA1M_C; + u32x d = SHA1M_D; + u32x e = SHA1M_E; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w0_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w1_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w2_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w3_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w4_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w5_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w6_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w7_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w8_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w9_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wa_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, wb_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, wc_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, wd_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, we_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F0o, e, a, b, c, d, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F0o, d, e, a, b, c, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F0o, c, d, e, a, b, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F0o, b, c, d, e, a, w3_t); + + #undef K + #define K SHA1C01 + + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w7_t); + + #undef K + #define K SHA1C02 + + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wb_t); + + #undef K + #define K SHA1C03 + + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wf_t); + + a += SHA1M_A; + e += SHA1M_E; + d += SHA1M_D; + c += SHA1M_C; + + { + const u32x r0 = a; + const u32x r1 = e; + const u32x r2 = d; + const u32x r3 = c; + + #include VECT_COMPARE_M + } + + a &= 0x00000fff; + + { + const u32x r0 = a; + const u32x r1 = e; + const u32x r2 = d; + const u32x r3 = c; + + #include VECT_COMPARE_M + } + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m00190_m08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m00190_m16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m00190_s04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + append_0x80_2 (wordl0, wordl1, pw_l_len); + + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, c_combs[0].pw_len); + } + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3], + }; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = c_combs[il_pos].pw_len; + + const u32 pw_len = pw_l_len + pw_r_len; + + u32 wordr0[4]; + + wordr0[0] = c_combs[il_pos].i[0]; + wordr0[1] = c_combs[il_pos].i[1]; + wordr0[2] = c_combs[il_pos].i[2]; + wordr0[3] = c_combs[il_pos].i[3]; + + u32 wordr1[4]; + + wordr1[0] = c_combs[il_pos].i[4]; + wordr1[1] = c_combs[il_pos].i[5]; + wordr1[2] = c_combs[il_pos].i[6]; + wordr1[3] = c_combs[il_pos].i[7]; + + u32 wordr2[4]; + + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + + u32 wordr3[4]; + + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + append_0x80_2 (wordr0, wordr1, pw_r_len); + + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + u32x w0[4]; + + w0[0] = wordl0[0] | wordr0[0]; + w0[1] = wordl0[1] | wordr0[1]; + w0[2] = wordl0[2] | wordr0[2]; + w0[3] = wordl0[3] | wordr0[3]; + + u32x w1[4]; + + w1[0] = wordl1[0] | wordr1[0]; + w1[1] = wordl1[1] | wordr1[1]; + w1[2] = wordl1[2] | wordr1[2]; + w1[3] = wordl1[3] | wordr1[3]; + + u32x w2[4]; + + w2[0] = wordl2[0] | wordr2[0]; + w2[1] = wordl2[1] | wordr2[1]; + w2[2] = wordl2[2] | wordr2[2]; + w2[3] = wordl2[3] | wordr2[3]; + + u32x w3[4]; + + w3[0] = wordl3[0] | wordr3[0]; + w3[1] = wordl3[1] | wordr3[1]; + w3[2] = 0; + w3[3] = 0; + + /** + * sha1 + */ + + u32x w0_t = swap_workaround (w0[0]); + u32x w1_t = swap_workaround (w0[1]); + u32x w2_t = swap_workaround (w0[2]); + u32x w3_t = swap_workaround (w0[3]); + u32x w4_t = swap_workaround (w1[0]); + u32x w5_t = swap_workaround (w1[1]); + u32x w6_t = swap_workaround (w1[2]); + u32x w7_t = swap_workaround (w1[3]); + u32x w8_t = swap_workaround (w2[0]); + u32x w9_t = swap_workaround (w2[1]); + u32x wa_t = swap_workaround (w2[2]); + u32x wb_t = swap_workaround (w2[3]); + u32x wc_t = swap_workaround (w3[0]); + u32x wd_t = swap_workaround (w3[1]); + u32x we_t = 0; + u32x wf_t = pw_len * 8; + + u32x a = SHA1M_A; + u32x b = SHA1M_B; + u32x c = SHA1M_C; + u32x d = SHA1M_D; + u32x e = SHA1M_E; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w0_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w1_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w2_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w3_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w4_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w5_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w6_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w7_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w8_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w9_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wa_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, wb_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, wc_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, wd_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, we_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F0o, e, a, b, c, d, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F0o, d, e, a, b, c, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F0o, c, d, e, a, b, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F0o, b, c, d, e, a, w3_t); + + #undef K + #define K SHA1C01 + + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w7_t); + + #undef K + #define K SHA1C02 + + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wb_t); + + #undef K + #define K SHA1C03 + + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wf_t); + + a += SHA1M_A; + e += SHA1M_E; + d += SHA1M_D; + c += SHA1M_C; + + { + const u32x r0 = a; + const u32x r1 = e; + const u32x r2 = d; + const u32x r3 = c; + + #include VECT_COMPARE_S + } + + a &= 0x00000fff; + + { + const u32x r0 = a; + const u32x r1 = e; + const u32x r2 = d; + const u32x r3 = c; + + #include VECT_COMPARE_S + } + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m00190_s08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m00190_s16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/nv/m00190_a3.cu b/nv/m00190_a3.cu new file mode 100644 index 0000000000..cd72f5889f --- /dev/null +++ b/nv/m00190_a3.cu @@ -0,0 +1,851 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _SHA1_ +#define _SCALAR_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW2 +#define VECT_SIZE4 +#endif + +#define DGST_R0 0 +#define DGST_R1 4 +#define DGST_R2 3 +#define DGST_R3 2 + +#include "include/kernel_functions.c" +#include "types_nv.c" +#include "common_nv.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4_warp.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4_warp.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4_warp.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4_warp.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4_warp.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4_warp.c" +#endif + +__device__ __constant__ u32x c_bfs[1024]; + +__device__ static void m00190m (u32 w[16], const u32 pw_len, const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const u32x *words_buf_r, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset) +{ + /** + * modifier + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 c_16s = rotl32 ((w[13] ^ w[ 8] ^ w[ 2] ), 1u); + const u32 c_17s = rotl32 ((w[14] ^ w[ 9] ^ w[ 3] ^ w[ 1]), 1u); + const u32 c_18s = rotl32 ((w[15] ^ w[10] ^ w[ 4] ^ w[ 2]), 1u); + const u32 c_19s = rotl32 ((c_16s ^ w[11] ^ w[ 5] ^ w[ 3]), 1u); + const u32 c_20s = rotl32 ((c_17s ^ w[12] ^ w[ 6] ^ w[ 4]), 1u); + const u32 c_21s = rotl32 ((c_18s ^ w[13] ^ w[ 7] ^ w[ 5]), 1u); + const u32 c_22s = rotl32 ((c_19s ^ w[14] ^ w[ 8] ^ w[ 6]), 1u); + const u32 c_23s = rotl32 ((c_20s ^ w[15] ^ w[ 9] ^ w[ 7]), 1u); + const u32 c_24s = rotl32 ((c_21s ^ c_16s ^ w[10] ^ w[ 8]), 1u); + const u32 c_25s = rotl32 ((c_22s ^ c_17s ^ w[11] ^ w[ 9]), 1u); + const u32 c_26s = rotl32 ((c_23s ^ c_18s ^ w[12] ^ w[10]), 1u); + const u32 c_27s = rotl32 ((c_24s ^ c_19s ^ w[13] ^ w[11]), 1u); + const u32 c_28s = rotl32 ((c_25s ^ c_20s ^ w[14] ^ w[12]), 1u); + const u32 c_29s = rotl32 ((c_26s ^ c_21s ^ w[15] ^ w[13]), 1u); + const u32 c_30s = rotl32 ((c_27s ^ c_22s ^ c_16s ^ w[14]), 1u); + const u32 c_31s = rotl32 ((c_28s ^ c_23s ^ c_17s ^ w[15]), 1u); + const u32 c_32s = rotl32 ((c_29s ^ c_24s ^ c_18s ^ c_16s), 1u); + const u32 c_33s = rotl32 ((c_30s ^ c_25s ^ c_19s ^ c_17s), 1u); + const u32 c_34s = rotl32 ((c_31s ^ c_26s ^ c_20s ^ c_18s), 1u); + const u32 c_35s = rotl32 ((c_32s ^ c_27s ^ c_21s ^ c_19s), 1u); + const u32 c_36s = rotl32 ((c_33s ^ c_28s ^ c_22s ^ c_20s), 1u); + const u32 c_37s = rotl32 ((c_34s ^ c_29s ^ c_23s ^ c_21s), 1u); + const u32 c_38s = rotl32 ((c_35s ^ c_30s ^ c_24s ^ c_22s), 1u); + const u32 c_39s = rotl32 ((c_36s ^ c_31s ^ c_25s ^ c_23s), 1u); + const u32 c_40s = rotl32 ((c_37s ^ c_32s ^ c_26s ^ c_24s), 1u); + const u32 c_41s = rotl32 ((c_38s ^ c_33s ^ c_27s ^ c_25s), 1u); + const u32 c_42s = rotl32 ((c_39s ^ c_34s ^ c_28s ^ c_26s), 1u); + const u32 c_43s = rotl32 ((c_40s ^ c_35s ^ c_29s ^ c_27s), 1u); + const u32 c_44s = rotl32 ((c_41s ^ c_36s ^ c_30s ^ c_28s), 1u); + const u32 c_45s = rotl32 ((c_42s ^ c_37s ^ c_31s ^ c_29s), 1u); + const u32 c_46s = rotl32 ((c_43s ^ c_38s ^ c_32s ^ c_30s), 1u); + const u32 c_47s = rotl32 ((c_44s ^ c_39s ^ c_33s ^ c_31s), 1u); + const u32 c_48s = rotl32 ((c_45s ^ c_40s ^ c_34s ^ c_32s), 1u); + const u32 c_49s = rotl32 ((c_46s ^ c_41s ^ c_35s ^ c_33s), 1u); + const u32 c_50s = rotl32 ((c_47s ^ c_42s ^ c_36s ^ c_34s), 1u); + const u32 c_51s = rotl32 ((c_48s ^ c_43s ^ c_37s ^ c_35s), 1u); + const u32 c_52s = rotl32 ((c_49s ^ c_44s ^ c_38s ^ c_36s), 1u); + const u32 c_53s = rotl32 ((c_50s ^ c_45s ^ c_39s ^ c_37s), 1u); + const u32 c_54s = rotl32 ((c_51s ^ c_46s ^ c_40s ^ c_38s), 1u); + const u32 c_55s = rotl32 ((c_52s ^ c_47s ^ c_41s ^ c_39s), 1u); + const u32 c_56s = rotl32 ((c_53s ^ c_48s ^ c_42s ^ c_40s), 1u); + const u32 c_57s = rotl32 ((c_54s ^ c_49s ^ c_43s ^ c_41s), 1u); + const u32 c_58s = rotl32 ((c_55s ^ c_50s ^ c_44s ^ c_42s), 1u); + const u32 c_59s = rotl32 ((c_56s ^ c_51s ^ c_45s ^ c_43s), 1u); + const u32 c_60s = rotl32 ((c_57s ^ c_52s ^ c_46s ^ c_44s), 1u); + const u32 c_61s = rotl32 ((c_58s ^ c_53s ^ c_47s ^ c_45s), 1u); + const u32 c_62s = rotl32 ((c_59s ^ c_54s ^ c_48s ^ c_46s), 1u); + const u32 c_63s = rotl32 ((c_60s ^ c_55s ^ c_49s ^ c_47s), 1u); + const u32 c_64s = rotl32 ((c_61s ^ c_56s ^ c_50s ^ c_48s), 1u); + const u32 c_65s = rotl32 ((c_62s ^ c_57s ^ c_51s ^ c_49s), 1u); + const u32 c_66s = rotl32 ((c_63s ^ c_58s ^ c_52s ^ c_50s), 1u); + const u32 c_67s = rotl32 ((c_64s ^ c_59s ^ c_53s ^ c_51s), 1u); + const u32 c_68s = rotl32 ((c_65s ^ c_60s ^ c_54s ^ c_52s), 1u); + const u32 c_69s = rotl32 ((c_66s ^ c_61s ^ c_55s ^ c_53s), 1u); + const u32 c_70s = rotl32 ((c_67s ^ c_62s ^ c_56s ^ c_54s), 1u); + const u32 c_71s = rotl32 ((c_68s ^ c_63s ^ c_57s ^ c_55s), 1u); + const u32 c_72s = rotl32 ((c_69s ^ c_64s ^ c_58s ^ c_56s), 1u); + const u32 c_73s = rotl32 ((c_70s ^ c_65s ^ c_59s ^ c_57s), 1u); + const u32 c_74s = rotl32 ((c_71s ^ c_66s ^ c_60s ^ c_58s), 1u); + const u32 c_75s = rotl32 ((c_72s ^ c_67s ^ c_61s ^ c_59s), 1u); + const u32 c_76s = rotl32 ((c_73s ^ c_68s ^ c_62s ^ c_60s), 1u); + const u32 c_77s = rotl32 ((c_74s ^ c_69s ^ c_63s ^ c_61s), 1u); + const u32 c_78s = rotl32 ((c_75s ^ c_70s ^ c_64s ^ c_62s), 1u); + const u32 c_79s = rotl32 ((c_76s ^ c_71s ^ c_65s ^ c_63s), 1u); + + const u32 c_17sK = c_17s + SHA1C00; + const u32 c_18sK = c_18s + SHA1C00; + const u32 c_20sK = c_20s + SHA1C01; + const u32 c_21sK = c_21s + SHA1C01; + const u32 c_23sK = c_23s + SHA1C01; + const u32 c_26sK = c_26s + SHA1C01; + const u32 c_27sK = c_27s + SHA1C01; + const u32 c_29sK = c_29s + SHA1C01; + const u32 c_33sK = c_33s + SHA1C01; + const u32 c_39sK = c_39s + SHA1C01; + const u32 c_41sK = c_41s + SHA1C02; + const u32 c_45sK = c_45s + SHA1C02; + const u32 c_53sK = c_53s + SHA1C02; + const u32 c_65sK = c_65s + SHA1C03; + const u32 c_69sK = c_69s + SHA1C03; + + const u32 w1 = w[ 1] + SHA1C00; + const u32 w2 = w[ 2] + SHA1C00; + const u32 w3 = w[ 3] + SHA1C00; + const u32 w4 = w[ 4] + SHA1C00; + const u32 w5 = w[ 5] + SHA1C00; + const u32 w6 = w[ 6] + SHA1C00; + const u32 w7 = w[ 7] + SHA1C00; + const u32 w8 = w[ 8] + SHA1C00; + const u32 w9 = w[ 9] + SHA1C00; + const u32 wa = w[10] + SHA1C00; + const u32 wb = w[11] + SHA1C00; + const u32 wc = w[12] + SHA1C00; + const u32 wd = w[13] + SHA1C00; + const u32 we = w[14] + SHA1C00; + const u32 wf = w[15] + SHA1C00; + + /** + * loop + */ + + const u32 bf_loops = ceil ((float) bfs_cnt / VECT_DIV); + + u32x w0l = w[0]; + + for (u32 il_pos = 0; il_pos < bf_loops; il_pos++) + { + const u32x w0r = c_bfs[il_pos]; + + const u32x w0 = w0l | w0r; + + const u32x w0s01 = rotl32 (w0, 1u); + const u32x w0s02 = rotl32 (w0, 2u); + const u32x w0s03 = rotl32 (w0, 3u); + const u32x w0s04 = rotl32 (w0, 4u); + const u32x w0s05 = rotl32 (w0, 5u); + const u32x w0s06 = rotl32 (w0, 6u); + const u32x w0s07 = rotl32 (w0, 7u); + const u32x w0s08 = rotl32 (w0, 8u); + const u32x w0s09 = rotl32 (w0, 9u); + const u32x w0s10 = rotl32 (w0, 10u); + const u32x w0s11 = rotl32 (w0, 11u); + const u32x w0s12 = rotl32 (w0, 12u); + const u32x w0s13 = rotl32 (w0, 13u); + const u32x w0s14 = rotl32 (w0, 14u); + const u32x w0s15 = rotl32 (w0, 15u); + const u32x w0s16 = rotl32 (w0, 16u); + const u32x w0s17 = rotl32 (w0, 17u); + const u32x w0s18 = rotl32 (w0, 18u); + const u32x w0s19 = rotl32 (w0, 19u); + const u32x w0s20 = rotl32 (w0, 20u); + const u32x w0s21 = rotl32 (w0, 21u); + const u32x w0s22 = rotl32 (w0, 22U); + + const u32x w0s04___w0s06 = w0s04 ^ w0s06; + const u32x w0s04___w0s08 = w0s04 ^ w0s08; + const u32x w0s08___w0s12 = w0s08 ^ w0s12; + const u32x w0s04___w0s06___w0s07 = w0s04___w0s06 ^ w0s07; + + u32x a = SHA1M_A; + u32x b = SHA1M_B; + u32x c = SHA1M_C; + u32x d = SHA1M_D; + u32x e = SHA1M_E; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w0); + SHA1_STEPX(SHA1_F0o, e, a, b, c, d, w1); + SHA1_STEPX(SHA1_F0o, d, e, a, b, c, w2); + SHA1_STEPX(SHA1_F0o, c, d, e, a, b, w3); + SHA1_STEPX(SHA1_F0o, b, c, d, e, a, w4); + SHA1_STEPX(SHA1_F0o, a, b, c, d, e, w5); + SHA1_STEPX(SHA1_F0o, e, a, b, c, d, w6); + SHA1_STEPX(SHA1_F0o, d, e, a, b, c, w7); + SHA1_STEPX(SHA1_F0o, c, d, e, a, b, w8); + SHA1_STEPX(SHA1_F0o, b, c, d, e, a, w9); + SHA1_STEPX(SHA1_F0o, a, b, c, d, e, wa); + SHA1_STEPX(SHA1_F0o, e, a, b, c, d, wb); + SHA1_STEPX(SHA1_F0o, d, e, a, b, c, wc); + SHA1_STEPX(SHA1_F0o, c, d, e, a, b, wd); + SHA1_STEPX(SHA1_F0o, b, c, d, e, a, we); + SHA1_STEPX(SHA1_F0o, a, b, c, d, e, wf); + + SHA1_STEP (SHA1_F0o, e, a, b, c, d, (c_16s ^ w0s01)); + SHA1_STEPX(SHA1_F0o, d, e, a, b, c, (c_17sK)); + SHA1_STEPX(SHA1_F0o, c, d, e, a, b, (c_18sK)); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, (c_19s ^ w0s02)); + + #undef K + #define K SHA1C01 + + SHA1_STEPX(SHA1_F1 , a, b, c, d, e, (c_20sK)); + SHA1_STEPX(SHA1_F1 , e, a, b, c, d, (c_21sK)); + SHA1_STEP (SHA1_F1 , d, e, a, b, c, (c_22s ^ w0s03)); + SHA1_STEPX(SHA1_F1 , c, d, e, a, b, (c_23sK)); + SHA1_STEP (SHA1_F1 , b, c, d, e, a, (c_24s ^ w0s02)); + SHA1_STEP (SHA1_F1 , a, b, c, d, e, (c_25s ^ w0s04)); + SHA1_STEPX(SHA1_F1 , e, a, b, c, d, (c_26sK)); + SHA1_STEPX(SHA1_F1 , d, e, a, b, c, (c_27sK)); + SHA1_STEP (SHA1_F1 , c, d, e, a, b, (c_28s ^ w0s05)); + SHA1_STEPX(SHA1_F1 , b, c, d, e, a, (c_29sK)); + SHA1_STEP (SHA1_F1 , a, b, c, d, e, (c_30s ^ w0s02 ^ w0s04)); + SHA1_STEP (SHA1_F1 , e, a, b, c, d, (c_31s ^ w0s06)); + SHA1_STEP (SHA1_F1 , d, e, a, b, c, (c_32s ^ w0s02 ^ w0s03)); + SHA1_STEPX(SHA1_F1 , c, d, e, a, b, (c_33sK)); + SHA1_STEP (SHA1_F1 , b, c, d, e, a, (c_34s ^ w0s07)); + SHA1_STEP (SHA1_F1 , a, b, c, d, e, (c_35s ^ w0s04)); + SHA1_STEP (SHA1_F1 , e, a, b, c, d, (c_36s ^ w0s04___w0s06)); + SHA1_STEP (SHA1_F1 , d, e, a, b, c, (c_37s ^ w0s08)); + SHA1_STEP (SHA1_F1 , c, d, e, a, b, (c_38s ^ w0s04)); + SHA1_STEPX(SHA1_F1 , b, c, d, e, a, (c_39sK)); + + #undef K + #define K SHA1C02 + + SHA1_STEP (SHA1_F2o, a, b, c, d, e, (c_40s ^ w0s04 ^ w0s09)); + SHA1_STEPX(SHA1_F2o, e, a, b, c, d, (c_41sK)); + SHA1_STEP (SHA1_F2o, d, e, a, b, c, (c_42s ^ w0s06 ^ w0s08)); + SHA1_STEP (SHA1_F2o, c, d, e, a, b, (c_43s ^ w0s10)); + SHA1_STEP (SHA1_F2o, b, c, d, e, a, (c_44s ^ w0s03 ^ w0s06 ^ w0s07)); + SHA1_STEPX(SHA1_F2o, a, b, c, d, e, (c_45sK)); + SHA1_STEP (SHA1_F2o, e, a, b, c, d, (c_46s ^ w0s04 ^ w0s11)); + SHA1_STEP (SHA1_F2o, d, e, a, b, c, (c_47s ^ w0s04___w0s08)); + SHA1_STEP (SHA1_F2o, c, d, e, a, b, (c_48s ^ w0s03 ^ w0s04___w0s08 ^ w0s05 ^ w0s10)); + SHA1_STEP (SHA1_F2o, b, c, d, e, a, (c_49s ^ w0s12)); + SHA1_STEP (SHA1_F2o, a, b, c, d, e, (c_50s ^ w0s08)); + SHA1_STEP (SHA1_F2o, e, a, b, c, d, (c_51s ^ w0s04___w0s06)); + SHA1_STEP (SHA1_F2o, d, e, a, b, c, (c_52s ^ w0s04___w0s08 ^ w0s13)); + SHA1_STEPX(SHA1_F2o, c, d, e, a, b, (c_53sK)); + SHA1_STEP (SHA1_F2o, b, c, d, e, a, (c_54s ^ w0s07 ^ w0s10 ^ w0s12)); + SHA1_STEP (SHA1_F2o, a, b, c, d, e, (c_55s ^ w0s14)); + SHA1_STEP (SHA1_F2o, e, a, b, c, d, (c_56s ^ w0s04___w0s06___w0s07 ^ w0s10 ^ w0s11)); + SHA1_STEP (SHA1_F2o, d, e, a, b, c, (c_57s ^ w0s08)); + SHA1_STEP (SHA1_F2o, c, d, e, a, b, (c_58s ^ w0s04___w0s08 ^ w0s15)); + SHA1_STEP (SHA1_F2o, b, c, d, e, a, (c_59s ^ w0s08___w0s12)); + + #undef K + #define K SHA1C03 + + SHA1_STEP (SHA1_F1 , a, b, c, d, e, (c_60s ^ w0s04 ^ w0s08___w0s12 ^ w0s07 ^ w0s14)); + SHA1_STEP (SHA1_F1 , e, a, b, c, d, (c_61s ^ w0s16)); + SHA1_STEP (SHA1_F1 , d, e, a, b, c, (c_62s ^ w0s04___w0s06 ^ w0s08___w0s12)); + SHA1_STEP (SHA1_F1 , c, d, e, a, b, (c_63s ^ w0s08)); + SHA1_STEP (SHA1_F1 , b, c, d, e, a, (c_64s ^ w0s04___w0s06___w0s07 ^ w0s08___w0s12 ^ w0s17)); + SHA1_STEPX(SHA1_F1 , a, b, c, d, e, (c_65sK)); + SHA1_STEP (SHA1_F1 , e, a, b, c, d, (c_66s ^ w0s14 ^ w0s16)); + SHA1_STEP (SHA1_F1 , d, e, a, b, c, (c_67s ^ w0s08 ^ w0s18)); + SHA1_STEP (SHA1_F1 , c, d, e, a, b, (c_68s ^ w0s11 ^ w0s14 ^ w0s15)); + SHA1_STEPX(SHA1_F1 , b, c, d, e, a, (c_69sK)); + SHA1_STEP (SHA1_F1 , a, b, c, d, e, (c_70s ^ w0s12 ^ w0s19)); + SHA1_STEP (SHA1_F1 , e, a, b, c, d, (c_71s ^ w0s12 ^ w0s16)); + SHA1_STEP (SHA1_F1 , d, e, a, b, c, (c_72s ^ w0s05 ^ w0s11 ^ w0s12 ^ w0s13 ^ w0s16 ^ w0s18)); + SHA1_STEP (SHA1_F1 , c, d, e, a, b, (c_73s ^ w0s20)); + SHA1_STEP (SHA1_F1 , b, c, d, e, a, (c_74s ^ w0s08 ^ w0s16)); + SHA1_STEP (SHA1_F1 , a, b, c, d, e, (c_75s ^ w0s06 ^ w0s12 ^ w0s14)); + SHA1_STEP (SHA1_F1 , e, a, b, c, d, (c_76s ^ w0s07 ^ w0s08___w0s12 ^ w0s16 ^ w0s21)); + SHA1_STEP (SHA1_F1 , d, e, a, b, c, (c_77s)); + SHA1_STEP (SHA1_F1 , c, d, e, a, b, (c_78s ^ w0s07 ^ w0s08 ^ w0s15 ^ w0s18 ^ w0s20)); + SHA1_STEP (SHA1_F1 , b, c, d, e, a, (c_79s ^ w0s08 ^ w0s22)); + + a += SHA1M_A; + e += SHA1M_E; + d += SHA1M_D; + c += SHA1M_C; + + { + const u32x r0 = a; + const u32x r1 = e; + const u32x r2 = d; + const u32x r3 = c; + + #include VECT_COMPARE_M + } + + a &= 0x00000fff; + + { + const u32x r0 = a; + const u32x r1 = e; + const u32x r2 = d; + const u32x r3 = c; + + #include VECT_COMPARE_M + } + } +} + +__device__ static void m00190s (u32 w[16], const u32 pw_len, const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const u32x *words_buf_r, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset) +{ + /** + * modifier + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 c_16s = rotl32 ((w[13] ^ w[ 8] ^ w[ 2] ), 1u); + const u32 c_17s = rotl32 ((w[14] ^ w[ 9] ^ w[ 3] ^ w[ 1]), 1u); + const u32 c_18s = rotl32 ((w[15] ^ w[10] ^ w[ 4] ^ w[ 2]), 1u); + const u32 c_19s = rotl32 ((c_16s ^ w[11] ^ w[ 5] ^ w[ 3]), 1u); + const u32 c_20s = rotl32 ((c_17s ^ w[12] ^ w[ 6] ^ w[ 4]), 1u); + const u32 c_21s = rotl32 ((c_18s ^ w[13] ^ w[ 7] ^ w[ 5]), 1u); + const u32 c_22s = rotl32 ((c_19s ^ w[14] ^ w[ 8] ^ w[ 6]), 1u); + const u32 c_23s = rotl32 ((c_20s ^ w[15] ^ w[ 9] ^ w[ 7]), 1u); + const u32 c_24s = rotl32 ((c_21s ^ c_16s ^ w[10] ^ w[ 8]), 1u); + const u32 c_25s = rotl32 ((c_22s ^ c_17s ^ w[11] ^ w[ 9]), 1u); + const u32 c_26s = rotl32 ((c_23s ^ c_18s ^ w[12] ^ w[10]), 1u); + const u32 c_27s = rotl32 ((c_24s ^ c_19s ^ w[13] ^ w[11]), 1u); + const u32 c_28s = rotl32 ((c_25s ^ c_20s ^ w[14] ^ w[12]), 1u); + const u32 c_29s = rotl32 ((c_26s ^ c_21s ^ w[15] ^ w[13]), 1u); + const u32 c_30s = rotl32 ((c_27s ^ c_22s ^ c_16s ^ w[14]), 1u); + const u32 c_31s = rotl32 ((c_28s ^ c_23s ^ c_17s ^ w[15]), 1u); + const u32 c_32s = rotl32 ((c_29s ^ c_24s ^ c_18s ^ c_16s), 1u); + const u32 c_33s = rotl32 ((c_30s ^ c_25s ^ c_19s ^ c_17s), 1u); + const u32 c_34s = rotl32 ((c_31s ^ c_26s ^ c_20s ^ c_18s), 1u); + const u32 c_35s = rotl32 ((c_32s ^ c_27s ^ c_21s ^ c_19s), 1u); + const u32 c_36s = rotl32 ((c_33s ^ c_28s ^ c_22s ^ c_20s), 1u); + const u32 c_37s = rotl32 ((c_34s ^ c_29s ^ c_23s ^ c_21s), 1u); + const u32 c_38s = rotl32 ((c_35s ^ c_30s ^ c_24s ^ c_22s), 1u); + const u32 c_39s = rotl32 ((c_36s ^ c_31s ^ c_25s ^ c_23s), 1u); + const u32 c_40s = rotl32 ((c_37s ^ c_32s ^ c_26s ^ c_24s), 1u); + const u32 c_41s = rotl32 ((c_38s ^ c_33s ^ c_27s ^ c_25s), 1u); + const u32 c_42s = rotl32 ((c_39s ^ c_34s ^ c_28s ^ c_26s), 1u); + const u32 c_43s = rotl32 ((c_40s ^ c_35s ^ c_29s ^ c_27s), 1u); + const u32 c_44s = rotl32 ((c_41s ^ c_36s ^ c_30s ^ c_28s), 1u); + const u32 c_45s = rotl32 ((c_42s ^ c_37s ^ c_31s ^ c_29s), 1u); + const u32 c_46s = rotl32 ((c_43s ^ c_38s ^ c_32s ^ c_30s), 1u); + const u32 c_47s = rotl32 ((c_44s ^ c_39s ^ c_33s ^ c_31s), 1u); + const u32 c_48s = rotl32 ((c_45s ^ c_40s ^ c_34s ^ c_32s), 1u); + const u32 c_49s = rotl32 ((c_46s ^ c_41s ^ c_35s ^ c_33s), 1u); + const u32 c_50s = rotl32 ((c_47s ^ c_42s ^ c_36s ^ c_34s), 1u); + const u32 c_51s = rotl32 ((c_48s ^ c_43s ^ c_37s ^ c_35s), 1u); + const u32 c_52s = rotl32 ((c_49s ^ c_44s ^ c_38s ^ c_36s), 1u); + const u32 c_53s = rotl32 ((c_50s ^ c_45s ^ c_39s ^ c_37s), 1u); + const u32 c_54s = rotl32 ((c_51s ^ c_46s ^ c_40s ^ c_38s), 1u); + const u32 c_55s = rotl32 ((c_52s ^ c_47s ^ c_41s ^ c_39s), 1u); + const u32 c_56s = rotl32 ((c_53s ^ c_48s ^ c_42s ^ c_40s), 1u); + const u32 c_57s = rotl32 ((c_54s ^ c_49s ^ c_43s ^ c_41s), 1u); + const u32 c_58s = rotl32 ((c_55s ^ c_50s ^ c_44s ^ c_42s), 1u); + const u32 c_59s = rotl32 ((c_56s ^ c_51s ^ c_45s ^ c_43s), 1u); + const u32 c_60s = rotl32 ((c_57s ^ c_52s ^ c_46s ^ c_44s), 1u); + const u32 c_61s = rotl32 ((c_58s ^ c_53s ^ c_47s ^ c_45s), 1u); + const u32 c_62s = rotl32 ((c_59s ^ c_54s ^ c_48s ^ c_46s), 1u); + const u32 c_63s = rotl32 ((c_60s ^ c_55s ^ c_49s ^ c_47s), 1u); + const u32 c_64s = rotl32 ((c_61s ^ c_56s ^ c_50s ^ c_48s), 1u); + const u32 c_65s = rotl32 ((c_62s ^ c_57s ^ c_51s ^ c_49s), 1u); + const u32 c_66s = rotl32 ((c_63s ^ c_58s ^ c_52s ^ c_50s), 1u); + const u32 c_67s = rotl32 ((c_64s ^ c_59s ^ c_53s ^ c_51s), 1u); + const u32 c_68s = rotl32 ((c_65s ^ c_60s ^ c_54s ^ c_52s), 1u); + const u32 c_69s = rotl32 ((c_66s ^ c_61s ^ c_55s ^ c_53s), 1u); + const u32 c_70s = rotl32 ((c_67s ^ c_62s ^ c_56s ^ c_54s), 1u); + const u32 c_71s = rotl32 ((c_68s ^ c_63s ^ c_57s ^ c_55s), 1u); + const u32 c_72s = rotl32 ((c_69s ^ c_64s ^ c_58s ^ c_56s), 1u); + const u32 c_73s = rotl32 ((c_70s ^ c_65s ^ c_59s ^ c_57s), 1u); + const u32 c_74s = rotl32 ((c_71s ^ c_66s ^ c_60s ^ c_58s), 1u); + const u32 c_75s = rotl32 ((c_72s ^ c_67s ^ c_61s ^ c_59s), 1u); + + const u32 c_17sK = c_17s + SHA1C00; + const u32 c_18sK = c_18s + SHA1C00; + const u32 c_20sK = c_20s + SHA1C01; + const u32 c_21sK = c_21s + SHA1C01; + const u32 c_23sK = c_23s + SHA1C01; + const u32 c_26sK = c_26s + SHA1C01; + const u32 c_27sK = c_27s + SHA1C01; + const u32 c_29sK = c_29s + SHA1C01; + const u32 c_33sK = c_33s + SHA1C01; + const u32 c_39sK = c_39s + SHA1C01; + const u32 c_41sK = c_41s + SHA1C02; + const u32 c_45sK = c_45s + SHA1C02; + const u32 c_53sK = c_53s + SHA1C02; + const u32 c_65sK = c_65s + SHA1C03; + const u32 c_69sK = c_69s + SHA1C03; + + const u32 w1 = w[ 1] + SHA1C00; + const u32 w2 = w[ 2] + SHA1C00; + const u32 w3 = w[ 3] + SHA1C00; + const u32 w4 = w[ 4] + SHA1C00; + const u32 w5 = w[ 5] + SHA1C00; + const u32 w6 = w[ 6] + SHA1C00; + const u32 w7 = w[ 7] + SHA1C00; + const u32 w8 = w[ 8] + SHA1C00; + const u32 w9 = w[ 9] + SHA1C00; + const u32 wa = w[10] + SHA1C00; + const u32 wb = w[11] + SHA1C00; + const u32 wc = w[12] + SHA1C00; + const u32 wd = w[13] + SHA1C00; + const u32 we = w[14] + SHA1C00; + const u32 wf = w[15] + SHA1C00; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3], + }; + + /** + * loop + */ + + const u32 bf_loops = ceil ((float) bfs_cnt / VECT_DIV); + + u32x w0l = w[0]; + + for (u32 il_pos = 0; il_pos < bf_loops; il_pos++) + { + const u32x w0r = c_bfs[il_pos]; + + const u32x w0 = w0l | w0r; + + const u32x w0s01 = rotl32 (w0, 1u); + const u32x w0s02 = rotl32 (w0, 2u); + const u32x w0s03 = rotl32 (w0, 3u); + const u32x w0s04 = rotl32 (w0, 4u); + const u32x w0s05 = rotl32 (w0, 5u); + const u32x w0s06 = rotl32 (w0, 6u); + const u32x w0s07 = rotl32 (w0, 7u); + const u32x w0s08 = rotl32 (w0, 8u); + const u32x w0s09 = rotl32 (w0, 9u); + const u32x w0s10 = rotl32 (w0, 10u); + const u32x w0s11 = rotl32 (w0, 11u); + const u32x w0s12 = rotl32 (w0, 12u); + const u32x w0s13 = rotl32 (w0, 13u); + const u32x w0s14 = rotl32 (w0, 14u); + const u32x w0s15 = rotl32 (w0, 15u); + const u32x w0s16 = rotl32 (w0, 16u); + const u32x w0s17 = rotl32 (w0, 17u); + const u32x w0s18 = rotl32 (w0, 18u); + const u32x w0s19 = rotl32 (w0, 19u); + const u32x w0s20 = rotl32 (w0, 20u); + + const u32x w0s04___w0s06 = w0s04 ^ w0s06; + const u32x w0s04___w0s08 = w0s04 ^ w0s08; + const u32x w0s08___w0s12 = w0s08 ^ w0s12; + const u32x w0s04___w0s06___w0s07 = w0s04___w0s06 ^ w0s07; + + u32x a = SHA1M_A; + u32x b = SHA1M_B; + u32x c = SHA1M_C; + u32x d = SHA1M_D; + u32x e = SHA1M_E; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w0); + SHA1_STEPX(SHA1_F0o, e, a, b, c, d, w1); + SHA1_STEPX(SHA1_F0o, d, e, a, b, c, w2); + SHA1_STEPX(SHA1_F0o, c, d, e, a, b, w3); + SHA1_STEPX(SHA1_F0o, b, c, d, e, a, w4); + SHA1_STEPX(SHA1_F0o, a, b, c, d, e, w5); + SHA1_STEPX(SHA1_F0o, e, a, b, c, d, w6); + SHA1_STEPX(SHA1_F0o, d, e, a, b, c, w7); + SHA1_STEPX(SHA1_F0o, c, d, e, a, b, w8); + SHA1_STEPX(SHA1_F0o, b, c, d, e, a, w9); + SHA1_STEPX(SHA1_F0o, a, b, c, d, e, wa); + SHA1_STEPX(SHA1_F0o, e, a, b, c, d, wb); + SHA1_STEPX(SHA1_F0o, d, e, a, b, c, wc); + SHA1_STEPX(SHA1_F0o, c, d, e, a, b, wd); + SHA1_STEPX(SHA1_F0o, b, c, d, e, a, we); + SHA1_STEPX(SHA1_F0o, a, b, c, d, e, wf); + + SHA1_STEP (SHA1_F0o, e, a, b, c, d, (c_16s ^ w0s01)); + SHA1_STEPX(SHA1_F0o, d, e, a, b, c, (c_17sK)); + SHA1_STEPX(SHA1_F0o, c, d, e, a, b, (c_18sK)); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, (c_19s ^ w0s02)); + + #undef K + #define K SHA1C01 + + SHA1_STEPX(SHA1_F1 , a, b, c, d, e, (c_20sK)); + SHA1_STEPX(SHA1_F1 , e, a, b, c, d, (c_21sK)); + SHA1_STEP (SHA1_F1 , d, e, a, b, c, (c_22s ^ w0s03)); + SHA1_STEPX(SHA1_F1 , c, d, e, a, b, (c_23sK)); + SHA1_STEP (SHA1_F1 , b, c, d, e, a, (c_24s ^ w0s02)); + SHA1_STEP (SHA1_F1 , a, b, c, d, e, (c_25s ^ w0s04)); + SHA1_STEPX(SHA1_F1 , e, a, b, c, d, (c_26sK)); + SHA1_STEPX(SHA1_F1 , d, e, a, b, c, (c_27sK)); + SHA1_STEP (SHA1_F1 , c, d, e, a, b, (c_28s ^ w0s05)); + SHA1_STEPX(SHA1_F1 , b, c, d, e, a, (c_29sK)); + SHA1_STEP (SHA1_F1 , a, b, c, d, e, (c_30s ^ w0s02 ^ w0s04)); + SHA1_STEP (SHA1_F1 , e, a, b, c, d, (c_31s ^ w0s06)); + SHA1_STEP (SHA1_F1 , d, e, a, b, c, (c_32s ^ w0s02 ^ w0s03)); + SHA1_STEPX(SHA1_F1 , c, d, e, a, b, (c_33sK)); + SHA1_STEP (SHA1_F1 , b, c, d, e, a, (c_34s ^ w0s07)); + SHA1_STEP (SHA1_F1 , a, b, c, d, e, (c_35s ^ w0s04)); + SHA1_STEP (SHA1_F1 , e, a, b, c, d, (c_36s ^ w0s04___w0s06)); + SHA1_STEP (SHA1_F1 , d, e, a, b, c, (c_37s ^ w0s08)); + SHA1_STEP (SHA1_F1 , c, d, e, a, b, (c_38s ^ w0s04)); + SHA1_STEPX(SHA1_F1 , b, c, d, e, a, (c_39sK)); + + #undef K + #define K SHA1C02 + + SHA1_STEP (SHA1_F2o, a, b, c, d, e, (c_40s ^ w0s04 ^ w0s09)); + SHA1_STEPX(SHA1_F2o, e, a, b, c, d, (c_41sK)); + SHA1_STEP (SHA1_F2o, d, e, a, b, c, (c_42s ^ w0s06 ^ w0s08)); + SHA1_STEP (SHA1_F2o, c, d, e, a, b, (c_43s ^ w0s10)); + SHA1_STEP (SHA1_F2o, b, c, d, e, a, (c_44s ^ w0s03 ^ w0s06 ^ w0s07)); + SHA1_STEPX(SHA1_F2o, a, b, c, d, e, (c_45sK)); + SHA1_STEP (SHA1_F2o, e, a, b, c, d, (c_46s ^ w0s04 ^ w0s11)); + SHA1_STEP (SHA1_F2o, d, e, a, b, c, (c_47s ^ w0s04___w0s08)); + SHA1_STEP (SHA1_F2o, c, d, e, a, b, (c_48s ^ w0s03 ^ w0s04___w0s08 ^ w0s05 ^ w0s10)); + SHA1_STEP (SHA1_F2o, b, c, d, e, a, (c_49s ^ w0s12)); + SHA1_STEP (SHA1_F2o, a, b, c, d, e, (c_50s ^ w0s08)); + SHA1_STEP (SHA1_F2o, e, a, b, c, d, (c_51s ^ w0s04___w0s06)); + SHA1_STEP (SHA1_F2o, d, e, a, b, c, (c_52s ^ w0s04___w0s08 ^ w0s13)); + SHA1_STEPX(SHA1_F2o, c, d, e, a, b, (c_53sK)); + SHA1_STEP (SHA1_F2o, b, c, d, e, a, (c_54s ^ w0s07 ^ w0s10 ^ w0s12)); + SHA1_STEP (SHA1_F2o, a, b, c, d, e, (c_55s ^ w0s14)); + SHA1_STEP (SHA1_F2o, e, a, b, c, d, (c_56s ^ w0s04___w0s06___w0s07 ^ w0s10 ^ w0s11)); + SHA1_STEP (SHA1_F2o, d, e, a, b, c, (c_57s ^ w0s08)); + SHA1_STEP (SHA1_F2o, c, d, e, a, b, (c_58s ^ w0s04___w0s08 ^ w0s15)); + SHA1_STEP (SHA1_F2o, b, c, d, e, a, (c_59s ^ w0s08___w0s12)); + + #undef K + #define K SHA1C03 + + SHA1_STEP (SHA1_F1 , a, b, c, d, e, (c_60s ^ w0s04 ^ w0s08___w0s12 ^ w0s07 ^ w0s14)); + SHA1_STEP (SHA1_F1 , e, a, b, c, d, (c_61s ^ w0s16)); + SHA1_STEP (SHA1_F1 , d, e, a, b, c, (c_62s ^ w0s04___w0s06 ^ w0s08___w0s12)); + SHA1_STEP (SHA1_F1 , c, d, e, a, b, (c_63s ^ w0s08)); + SHA1_STEP (SHA1_F1 , b, c, d, e, a, (c_64s ^ w0s04___w0s06___w0s07 ^ w0s08___w0s12 ^ w0s17)); + SHA1_STEPX(SHA1_F1 , a, b, c, d, e, (c_65sK)); + SHA1_STEP (SHA1_F1 , e, a, b, c, d, (c_66s ^ w0s14 ^ w0s16)); + SHA1_STEP (SHA1_F1 , d, e, a, b, c, (c_67s ^ w0s08 ^ w0s18)); + SHA1_STEP (SHA1_F1 , c, d, e, a, b, (c_68s ^ w0s11 ^ w0s14 ^ w0s15)); + SHA1_STEPX(SHA1_F1 , b, c, d, e, a, (c_69sK)); + SHA1_STEP (SHA1_F1 , a, b, c, d, e, (c_70s ^ w0s12 ^ w0s19)); + SHA1_STEP (SHA1_F1 , e, a, b, c, d, (c_71s ^ w0s12 ^ w0s16)); + SHA1_STEP (SHA1_F1 , d, e, a, b, c, (c_72s ^ w0s05 ^ w0s11 ^ w0s12 ^ w0s13 ^ w0s16 ^ w0s18)); + SHA1_STEP (SHA1_F1 , c, d, e, a, b, (c_73s ^ w0s20)); + SHA1_STEP (SHA1_F1 , b, c, d, e, a, (c_74s ^ w0s08 ^ w0s16)); + SHA1_STEP (SHA1_F1 , a, b, c, d, e, (c_75s ^ w0s06 ^ w0s12 ^ w0s14)); + + const u32 c_76s = rotl32 ((c_73s ^ c_68s ^ c_62s ^ c_60s), 1u); + const u32 c_77s = rotl32 ((c_74s ^ c_69s ^ c_63s ^ c_61s), 1u); + const u32 c_78s = rotl32 ((c_75s ^ c_70s ^ c_64s ^ c_62s), 1u); + const u32 c_79s = rotl32 ((c_76s ^ c_71s ^ c_65s ^ c_63s), 1u); + + const u32x w0s21 = rotl32 (w0, 21u); + const u32x w0s22 = rotl32 (w0, 22U); + + SHA1_STEP (SHA1_F1 , e, a, b, c, d, (c_76s ^ w0s07 ^ w0s08___w0s12 ^ w0s16 ^ w0s21)); + SHA1_STEP (SHA1_F1 , d, e, a, b, c, (c_77s)); + SHA1_STEP (SHA1_F1 , c, d, e, a, b, (c_78s ^ w0s07 ^ w0s08 ^ w0s15 ^ w0s18 ^ w0s20)); + SHA1_STEP (SHA1_F1 , b, c, d, e, a, (c_79s ^ w0s08 ^ w0s22)); + + a += SHA1M_A; + e += SHA1M_E; + d += SHA1M_D; + c += SHA1M_C; + + { + const u32x r0 = a; + const u32x r1 = e; + const u32x r2 = d; + const u32x r3 = c; + + #include VECT_COMPARE_S + } + + a &= 0x00000fff; + + { + const u32x r0 = a; + const u32x r1 = e; + const u32x r2 = d; + const u32x r3 = c; + + #include VECT_COMPARE_S + } + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m00190_m04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const u32x *words_buf_r, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32 w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = 0; + w[ 5] = 0; + w[ 6] = 0; + w[ 7] = 0; + w[ 8] = 0; + w[ 9] = 0; + w[10] = 0; + w[11] = 0; + w[12] = 0; + w[13] = 0; + w[14] = 0; + w[15] = pws[gid].i[15]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m00190m (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m00190_m08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const u32x *words_buf_r, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32 w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = pws[gid].i[ 4]; + w[ 5] = pws[gid].i[ 5]; + w[ 6] = pws[gid].i[ 6]; + w[ 7] = pws[gid].i[ 7]; + w[ 8] = 0; + w[ 9] = 0; + w[10] = 0; + w[11] = 0; + w[12] = 0; + w[13] = 0; + w[14] = 0; + w[15] = pws[gid].i[15]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m00190m (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m00190_m16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const u32x *words_buf_r, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32 w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = pws[gid].i[ 4]; + w[ 5] = pws[gid].i[ 5]; + w[ 6] = pws[gid].i[ 6]; + w[ 7] = pws[gid].i[ 7]; + w[ 8] = pws[gid].i[ 8]; + w[ 9] = pws[gid].i[ 9]; + w[10] = pws[gid].i[10]; + w[11] = pws[gid].i[11]; + w[12] = pws[gid].i[12]; + w[13] = pws[gid].i[13]; + w[14] = pws[gid].i[14]; + w[15] = pws[gid].i[15]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m00190m (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m00190_s04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const u32x *words_buf_r, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32 w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = 0; + w[ 5] = 0; + w[ 6] = 0; + w[ 7] = 0; + w[ 8] = 0; + w[ 9] = 0; + w[10] = 0; + w[11] = 0; + w[12] = 0; + w[13] = 0; + w[14] = 0; + w[15] = pws[gid].i[15]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m00190s (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m00190_s08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const u32x *words_buf_r, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32 w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = pws[gid].i[ 4]; + w[ 5] = pws[gid].i[ 5]; + w[ 6] = pws[gid].i[ 6]; + w[ 7] = pws[gid].i[ 7]; + w[ 8] = 0; + w[ 9] = 0; + w[10] = 0; + w[11] = 0; + w[12] = 0; + w[13] = 0; + w[14] = 0; + w[15] = pws[gid].i[15]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m00190s (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m00190_s16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const u32x *words_buf_r, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32 w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = pws[gid].i[ 4]; + w[ 5] = pws[gid].i[ 5]; + w[ 6] = pws[gid].i[ 6]; + w[ 7] = pws[gid].i[ 7]; + w[ 8] = pws[gid].i[ 8]; + w[ 9] = pws[gid].i[ 9]; + w[10] = pws[gid].i[10]; + w[11] = pws[gid].i[11]; + w[12] = pws[gid].i[12]; + w[13] = pws[gid].i[13]; + w[14] = pws[gid].i[14]; + w[15] = pws[gid].i[15]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m00190s (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} diff --git a/nv/m00200_a0.cu b/nv/m00200_a0.cu new file mode 100644 index 0000000000..f4590e8c02 --- /dev/null +++ b/nv/m00200_a0.cu @@ -0,0 +1,361 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _MYSQL323_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW2 +#define VECT_SIZE1 +#endif + +#define DGST_R0 0 +#define DGST_R1 1 +#define DGST_R2 2 +#define DGST_R3 3 + +#include "include/kernel_functions.c" +#include "types_nv.c" +#include "common_nv.c" +#include "include/rp_gpu.h" +#include "rp_nv.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +__device__ __constant__ gpu_rule_t c_rules[1024]; + +extern "C" __global__ void __launch_bounds__ (256, 1) m00200_m04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + u32x pw_buf1[4]; + + pw_buf1[0] = pws[gid].i[ 4]; + pw_buf1[1] = pws[gid].i[ 5]; + pw_buf1[2] = pws[gid].i[ 6]; + pw_buf1[3] = pws[gid].i[ 7]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + + w0[0] = pw_buf0[0]; + w0[1] = pw_buf0[1]; + w0[2] = pw_buf0[2]; + w0[3] = pw_buf0[3]; + + u32x w1[4]; + + w1[0] = pw_buf1[0]; + w1[1] = pw_buf1[1]; + w1[2] = pw_buf1[2]; + w1[3] = pw_buf1[3]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 out_len = apply_rules (c_rules[il_pos].cmds, w0, w1, pw_len); + + u32x w_t[16]; + + w_t[ 0] = w0[0]; + w_t[ 1] = w0[1]; + w_t[ 2] = w0[2]; + w_t[ 3] = w0[3]; + w_t[ 4] = w1[0]; + w_t[ 5] = w1[1]; + w_t[ 6] = w1[2]; + w_t[ 7] = w1[3]; + w_t[ 8] = 0; + w_t[ 9] = 0; + w_t[10] = 0; + w_t[11] = 0; + w_t[12] = 0; + w_t[13] = 0; + w_t[14] = 0; + w_t[15] = 0; + + u32x a = MYSQL323_A; + u32x b = MYSQL323_B; + + u32x add = 7; + + #define ROUND(v) \ + { \ + a ^= (((a & 0x3f) + add) * (v)) + (a << 8); \ + b += (b << 8) ^ a; \ + add += v; \ + } + + int i; + int j; + + for (i = 0, j = 0; i <= (int) out_len - 4; i += 4, j += 1) + { + const u32x wj = w_t[j]; + + ROUND ((wj >> 0) & 0xff); + ROUND ((wj >> 8) & 0xff); + ROUND ((wj >> 16) & 0xff); + ROUND ((wj >> 24) & 0xff); + } + + const u32x wj = w_t[j]; + + const u32 left = out_len - i; + + if (left == 3) + { + ROUND ((wj >> 0) & 0xff); + ROUND ((wj >> 8) & 0xff); + ROUND ((wj >> 16) & 0xff); + } + else if (left == 2) + { + ROUND ((wj >> 0) & 0xff); + ROUND ((wj >> 8) & 0xff); + } + else if (left == 1) + { + ROUND ((wj >> 0) & 0xff); + } + + a &= 0x7fffffff; + b &= 0x7fffffff; + + const u32x r0 = a; + const u32x r1 = b; + const u32x r2 = 0; + const u32x r3 = 0; + + #include VECT_COMPARE_M + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m00200_m08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m00200_m16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m00200_s04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + u32x pw_buf1[4]; + + pw_buf1[0] = pws[gid].i[ 4]; + pw_buf1[1] = pws[gid].i[ 5]; + pw_buf1[2] = pws[gid].i[ 6]; + pw_buf1[3] = pws[gid].i[ 7]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + + w0[0] = pw_buf0[0]; + w0[1] = pw_buf0[1]; + w0[2] = pw_buf0[2]; + w0[3] = pw_buf0[3]; + + u32x w1[4]; + + w1[0] = pw_buf1[0]; + w1[1] = pw_buf1[1]; + w1[2] = pw_buf1[2]; + w1[3] = pw_buf1[3]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 out_len = apply_rules (c_rules[il_pos].cmds, w0, w1, pw_len); + + u32x w_t[16]; + + w_t[ 0] = w0[0]; + w_t[ 1] = w0[1]; + w_t[ 2] = w0[2]; + w_t[ 3] = w0[3]; + w_t[ 4] = w1[0]; + w_t[ 5] = w1[1]; + w_t[ 6] = w1[2]; + w_t[ 7] = w1[3]; + w_t[ 8] = 0; + w_t[ 9] = 0; + w_t[10] = 0; + w_t[11] = 0; + w_t[12] = 0; + w_t[13] = 0; + w_t[14] = 0; + w_t[15] = 0; + + u32x a = MYSQL323_A; + u32x b = MYSQL323_B; + + u32x add = 7; + + #define ROUND(v) \ + { \ + a ^= (((a & 0x3f) + add) * (v)) + (a << 8); \ + b += (b << 8) ^ a; \ + add += v; \ + } + + int i; + int j; + + for (i = 0, j = 0; i <= (int) out_len - 4; i += 4, j += 1) + { + const u32x wj = w_t[j]; + + ROUND ((wj >> 0) & 0xff); + ROUND ((wj >> 8) & 0xff); + ROUND ((wj >> 16) & 0xff); + ROUND ((wj >> 24) & 0xff); + } + + const u32x wj = w_t[j]; + + const u32 left = out_len - i; + + if (left == 3) + { + ROUND ((wj >> 0) & 0xff); + ROUND ((wj >> 8) & 0xff); + ROUND ((wj >> 16) & 0xff); + } + else if (left == 2) + { + ROUND ((wj >> 0) & 0xff); + ROUND ((wj >> 8) & 0xff); + } + else if (left == 1) + { + ROUND ((wj >> 0) & 0xff); + } + + a &= 0x7fffffff; + b &= 0x7fffffff; + + const u32x r0 = a; + const u32x r1 = b; + const u32x r2 = 0; + const u32x r3 = 0; + + #include VECT_COMPARE_S + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m00200_s08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m00200_s16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/nv/m00200_a1.cu b/nv/m00200_a1.cu new file mode 100644 index 0000000000..ae9b03244d --- /dev/null +++ b/nv/m00200_a1.cu @@ -0,0 +1,411 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _MYSQL323_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW2 +#define VECT_SIZE4 +#endif + +#define DGST_R0 0 +#define DGST_R1 1 +#define DGST_R2 2 +#define DGST_R3 3 + +#include "include/kernel_functions.c" +#include "types_nv.c" +#include "common_nv.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +__device__ __constant__ comb_t c_combs[1024]; + +extern "C" __global__ void __launch_bounds__ (256, 1) m00200_m04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, c_combs[0].pw_len); + } + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = c_combs[il_pos].pw_len; + + const u32 pw_len = pw_l_len + pw_r_len; + + u32 wordr0[4]; + + wordr0[0] = c_combs[il_pos].i[0]; + wordr0[1] = c_combs[il_pos].i[1]; + wordr0[2] = c_combs[il_pos].i[2]; + wordr0[3] = c_combs[il_pos].i[3]; + + u32 wordr1[4]; + + wordr1[0] = c_combs[il_pos].i[4]; + wordr1[1] = c_combs[il_pos].i[5]; + wordr1[2] = c_combs[il_pos].i[6]; + wordr1[3] = c_combs[il_pos].i[7]; + + u32 wordr2[4]; + + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + + u32 wordr3[4]; + + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + u32x w_t[16]; + + w_t[ 0] = wordl0[0] | wordr0[0]; + w_t[ 1] = wordl0[1] | wordr0[1]; + w_t[ 2] = wordl0[2] | wordr0[2]; + w_t[ 3] = wordl0[3] | wordr0[3]; + w_t[ 4] = wordl1[0] | wordr1[0]; + w_t[ 5] = wordl1[1] | wordr1[1]; + w_t[ 6] = wordl1[2] | wordr1[2]; + w_t[ 7] = wordl1[3] | wordr1[3]; + w_t[ 8] = wordl2[0] | wordr2[0]; + w_t[ 9] = wordl2[1] | wordr2[1]; + w_t[10] = wordl2[2] | wordr2[2]; + w_t[11] = wordl2[3] | wordr2[3]; + w_t[12] = wordl3[0] | wordr3[0]; + w_t[13] = wordl3[1] | wordr3[1]; + w_t[14] = wordl3[2] | wordr3[2]; + w_t[15] = 0; + + u32x a = MYSQL323_A; + u32x b = MYSQL323_B; + + u32x add = 7; + + #define ROUND(v) \ + { \ + a ^= (((a & 0x3f) + add) * (v)) + (a << 8); \ + b += (b << 8) ^ a; \ + add += v; \ + } + + int i; + int j; + + for (i = 0, j = 0; i <= (int) pw_len - 4; i += 4, j += 1) + { + const u32x wj = w_t[j]; + + ROUND ((wj >> 0) & 0xff); + ROUND ((wj >> 8) & 0xff); + ROUND ((wj >> 16) & 0xff); + ROUND ((wj >> 24) & 0xff); + } + + const u32x wj = w_t[j]; + + const u32 left = pw_len - i; + + if (left == 3) + { + ROUND ((wj >> 0) & 0xff); + ROUND ((wj >> 8) & 0xff); + ROUND ((wj >> 16) & 0xff); + } + else if (left == 2) + { + ROUND ((wj >> 0) & 0xff); + ROUND ((wj >> 8) & 0xff); + } + else if (left == 1) + { + ROUND ((wj >> 0) & 0xff); + } + + a &= 0x7fffffff; + b &= 0x7fffffff; + + const u32x r0 = a; + const u32x r1 = b; + const u32x r2 = 0; + const u32x r3 = 0; + + #include VECT_COMPARE_M + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m00200_m08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m00200_m16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m00200_s04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, c_combs[0].pw_len); + } + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = c_combs[il_pos].pw_len; + + const u32 pw_len = pw_l_len + pw_r_len; + + u32 wordr0[4]; + + wordr0[0] = c_combs[il_pos].i[0]; + wordr0[1] = c_combs[il_pos].i[1]; + wordr0[2] = c_combs[il_pos].i[2]; + wordr0[3] = c_combs[il_pos].i[3]; + + u32 wordr1[4]; + + wordr1[0] = c_combs[il_pos].i[4]; + wordr1[1] = c_combs[il_pos].i[5]; + wordr1[2] = c_combs[il_pos].i[6]; + wordr1[3] = c_combs[il_pos].i[7]; + + u32 wordr2[4]; + + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + + u32 wordr3[4]; + + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + u32x w_t[16]; + + w_t[ 0] = wordl0[0] | wordr0[0]; + w_t[ 1] = wordl0[1] | wordr0[1]; + w_t[ 2] = wordl0[2] | wordr0[2]; + w_t[ 3] = wordl0[3] | wordr0[3]; + w_t[ 4] = wordl1[0] | wordr1[0]; + w_t[ 5] = wordl1[1] | wordr1[1]; + w_t[ 6] = wordl1[2] | wordr1[2]; + w_t[ 7] = wordl1[3] | wordr1[3]; + w_t[ 8] = wordl2[0] | wordr2[0]; + w_t[ 9] = wordl2[1] | wordr2[1]; + w_t[10] = wordl2[2] | wordr2[2]; + w_t[11] = wordl2[3] | wordr2[3]; + w_t[12] = wordl3[0] | wordr3[0]; + w_t[13] = wordl3[1] | wordr3[1]; + w_t[14] = wordl3[2] | wordr3[2]; + w_t[15] = 0; + + u32x a = MYSQL323_A; + u32x b = MYSQL323_B; + + u32x add = 7; + + #define ROUND(v) \ + { \ + a ^= (((a & 0x3f) + add) * (v)) + (a << 8); \ + b += (b << 8) ^ a; \ + add += v; \ + } + + int i; + int j; + + for (i = 0, j = 0; i <= (int) pw_len - 4; i += 4, j += 1) + { + const u32x wj = w_t[j]; + + ROUND ((wj >> 0) & 0xff); + ROUND ((wj >> 8) & 0xff); + ROUND ((wj >> 16) & 0xff); + ROUND ((wj >> 24) & 0xff); + } + + const u32x wj = w_t[j]; + + const u32 left = pw_len - i; + + if (left == 3) + { + ROUND ((wj >> 0) & 0xff); + ROUND ((wj >> 8) & 0xff); + ROUND ((wj >> 16) & 0xff); + } + else if (left == 2) + { + ROUND ((wj >> 0) & 0xff); + ROUND ((wj >> 8) & 0xff); + } + else if (left == 1) + { + ROUND ((wj >> 0) & 0xff); + } + + a &= 0x7fffffff; + b &= 0x7fffffff; + + const u32x r0 = a; + const u32x r1 = b; + const u32x r2 = 0; + const u32x r3 = 0; + + #include VECT_COMPARE_S + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m00200_s08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m00200_s16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/nv/m00200_a3.cu b/nv/m00200_a3.cu new file mode 100644 index 0000000000..939ab68417 --- /dev/null +++ b/nv/m00200_a3.cu @@ -0,0 +1,490 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _MYSQL323_ +#define _SCALAR_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW2 +#define VECT_SIZE4 +#endif + +#define DGST_R0 0 +#define DGST_R1 1 +#define DGST_R2 2 +#define DGST_R3 3 + +#include "include/kernel_functions.c" +#include "types_nv.c" +#include "common_nv.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4_warp.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4_warp.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4_warp.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4_warp.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4_warp.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4_warp.c" +#endif + +__device__ __constant__ u32x c_bfs[1024]; + +__device__ static void m00200m (u32 w[16], const u32 pw_len, const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const u32x * words_buf_r, void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset) +{ + /** + * modifier + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + const u32 lid = threadIdx.x; + + /** + * loop + */ + + const u32 bf_loops = ceil ((float) bfs_cnt / VECT_DIV); + + u32x w0l = w[0]; + + for (u32 il_pos = 0; il_pos < bf_loops; il_pos++) + { + const u32x w0r = c_bfs[il_pos]; + + const u32x w0 = w0l | w0r; + + u32x a = MYSQL323_A; + u32x b = MYSQL323_B; + + u32x add = 7; + + #define ROUND(v) \ + { \ + a ^= (((a & 0x3f) + add) * (v)) + (a << 8); \ + b += (b << 8) ^ a; \ + add += v; \ + } + + if (pw_len >= 4) + { + ROUND ((w0 >> 0) & 0xff); + ROUND ((w0 >> 8) & 0xff); + ROUND ((w0 >> 16) & 0xff); + ROUND ((w0 >> 24) & 0xff); + } + else if (pw_len == 3) + { + ROUND ((w0 >> 0) & 0xff); + ROUND ((w0 >> 8) & 0xff); + ROUND ((w0 >> 16) & 0xff); + } + else if (pw_len == 2) + { + ROUND ((w0 >> 0) & 0xff); + ROUND ((w0 >> 8) & 0xff); + } + else if (pw_len == 1) + { + ROUND ((w0 >> 0) & 0xff); + } + + int i; + int j; + + for (i = 4, j = 1; i <= (int) pw_len - 4; i += 4, j += 1) + { + const u32 wj = w[j]; + + ROUND ((wj >> 0) & 0xff); + ROUND ((wj >> 8) & 0xff); + ROUND ((wj >> 16) & 0xff); + ROUND ((wj >> 24) & 0xff); + } + + const u32 wj = w[j]; + + const u32 left = pw_len - i; + + if (left == 3) + { + ROUND ((wj >> 0) & 0xff); + ROUND ((wj >> 8) & 0xff); + ROUND ((wj >> 16) & 0xff); + } + else if (left == 2) + { + ROUND ((wj >> 0) & 0xff); + ROUND ((wj >> 8) & 0xff); + } + else if (left == 1) + { + ROUND ((wj >> 0) & 0xff); + } + + a &= 0x7fffffff; + b &= 0x7fffffff; + + const u32x r0 = a; + const u32x r1 = b; + const u32x r2 = 0; + const u32x r3 = 0; + + #include VECT_COMPARE_M + } +} + +__device__ static void m00200s (u32 w[16], const u32 pw_len, const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const u32x * words_buf_r, void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset) +{ + /** + * modifier + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + const u32 lid = threadIdx.x; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * loop + */ + + const u32 bf_loops = ceil ((float) bfs_cnt / VECT_DIV); + + u32x w0l = w[0]; + + for (u32 il_pos = 0; il_pos < bf_loops; il_pos++) + { + const u32x w0r = c_bfs[il_pos]; + + const u32x w0 = w0l | w0r; + + u32x a = MYSQL323_A; + u32x b = MYSQL323_B; + + u32x add = 7; + + #define ROUND(v) \ + { \ + a ^= (((a & 0x3f) + add) * (v)) + (a << 8); \ + b += (b << 8) ^ a; \ + add += v; \ + } + + if (pw_len >= 4) + { + ROUND ((w0 >> 0) & 0xff); + ROUND ((w0 >> 8) & 0xff); + ROUND ((w0 >> 16) & 0xff); + ROUND ((w0 >> 24) & 0xff); + } + else if (pw_len == 3) + { + ROUND ((w0 >> 0) & 0xff); + ROUND ((w0 >> 8) & 0xff); + ROUND ((w0 >> 16) & 0xff); + } + else if (pw_len == 2) + { + ROUND ((w0 >> 0) & 0xff); + ROUND ((w0 >> 8) & 0xff); + } + else if (pw_len == 1) + { + ROUND ((w0 >> 0) & 0xff); + } + + int i; + int j; + + for (i = 4, j = 1; i <= (int) pw_len - 4; i += 4, j += 1) + { + const u32 wj = w[j]; + + ROUND ((wj >> 0) & 0xff); + ROUND ((wj >> 8) & 0xff); + ROUND ((wj >> 16) & 0xff); + ROUND ((wj >> 24) & 0xff); + } + + const u32 wj = w[j]; + + const u32 left = pw_len - i; + + if (left == 3) + { + ROUND ((wj >> 0) & 0xff); + ROUND ((wj >> 8) & 0xff); + ROUND ((wj >> 16) & 0xff); + } + else if (left == 2) + { + ROUND ((wj >> 0) & 0xff); + ROUND ((wj >> 8) & 0xff); + } + else if (left == 1) + { + ROUND ((wj >> 0) & 0xff); + } + + a &= 0x7fffffff; + b &= 0x7fffffff; + + const u32x r0 = a; + const u32x r1 = b; + const u32x r2 = 0; + const u32x r3 = 0; + + #include VECT_COMPARE_S + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m00200_m04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const u32x * words_buf_r, void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32 w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = 0; + w[ 5] = 0; + w[ 6] = 0; + w[ 7] = 0; + w[ 8] = 0; + w[ 9] = 0; + w[10] = 0; + w[11] = 0; + w[12] = 0; + w[13] = 0; + w[14] = 0; + w[15] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m00200m (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m00200_m08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const u32x * words_buf_r, void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32 w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = pws[gid].i[ 4]; + w[ 5] = pws[gid].i[ 5]; + w[ 6] = pws[gid].i[ 6]; + w[ 7] = pws[gid].i[ 7]; + w[ 8] = 0; + w[ 9] = 0; + w[10] = 0; + w[11] = 0; + w[12] = 0; + w[13] = 0; + w[14] = 0; + w[15] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m00200m (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m00200_m16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const u32x * words_buf_r, void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32 w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = pws[gid].i[ 4]; + w[ 5] = pws[gid].i[ 5]; + w[ 6] = pws[gid].i[ 6]; + w[ 7] = pws[gid].i[ 7]; + w[ 8] = pws[gid].i[ 8]; + w[ 9] = pws[gid].i[ 9]; + w[10] = pws[gid].i[10]; + w[11] = pws[gid].i[11]; + w[12] = pws[gid].i[12]; + w[13] = pws[gid].i[13]; + w[14] = pws[gid].i[14]; + w[15] = pws[gid].i[15]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m00200m (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m00200_s04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const u32x * words_buf_r, void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32 w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = 0; + w[ 5] = 0; + w[ 6] = 0; + w[ 7] = 0; + w[ 8] = 0; + w[ 9] = 0; + w[10] = 0; + w[11] = 0; + w[12] = 0; + w[13] = 0; + w[14] = 0; + w[15] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m00200s (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m00200_s08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const u32x * words_buf_r, void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32 w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = pws[gid].i[ 4]; + w[ 5] = pws[gid].i[ 5]; + w[ 6] = pws[gid].i[ 6]; + w[ 7] = pws[gid].i[ 7]; + w[ 8] = 0; + w[ 9] = 0; + w[10] = 0; + w[11] = 0; + w[12] = 0; + w[13] = 0; + w[14] = 0; + w[15] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m00200s (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m00200_s16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const u32x * words_buf_r, void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32 w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = pws[gid].i[ 4]; + w[ 5] = pws[gid].i[ 5]; + w[ 6] = pws[gid].i[ 6]; + w[ 7] = pws[gid].i[ 7]; + w[ 8] = pws[gid].i[ 8]; + w[ 9] = pws[gid].i[ 9]; + w[10] = pws[gid].i[10]; + w[11] = pws[gid].i[11]; + w[12] = pws[gid].i[12]; + w[13] = pws[gid].i[13]; + w[14] = pws[gid].i[14]; + w[15] = pws[gid].i[15]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m00200s (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} diff --git a/nv/m00300_a0.cu b/nv/m00300_a0.cu new file mode 100644 index 0000000000..9c8a6d33a1 --- /dev/null +++ b/nv/m00300_a0.cu @@ -0,0 +1,738 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _SHA1_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW2 +#define VECT_SIZE1 +#endif + +#define DGST_R0 3 +#define DGST_R1 4 +#define DGST_R2 2 +#define DGST_R3 1 + +#include "include/kernel_functions.c" +#include "types_nv.c" +#include "common_nv.c" +#include "include/rp_gpu.h" +#include "rp_nv.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4_warp.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4_warp.c" +#endif + +__device__ __constant__ gpu_rule_t c_rules[1024]; + +extern "C" __global__ void __launch_bounds__ (256, 1) m00300_m04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + u32x pw_buf1[4]; + + pw_buf1[0] = pws[gid].i[ 4]; + pw_buf1[1] = pws[gid].i[ 5]; + pw_buf1[2] = pws[gid].i[ 6]; + pw_buf1[3] = pws[gid].i[ 7]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + + w0[0] = pw_buf0[0]; + w0[1] = pw_buf0[1]; + w0[2] = pw_buf0[2]; + w0[3] = pw_buf0[3]; + + u32x w1[4]; + + w1[0] = pw_buf1[0]; + w1[1] = pw_buf1[1]; + w1[2] = pw_buf1[2]; + w1[3] = pw_buf1[3]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 out_len = apply_rules (c_rules[il_pos].cmds, w0, w1, pw_len); + + append_0x80_2 (w0, w1, out_len); + + /** + * sha1 + */ + + u32x w0_t = swap_workaround (w0[0]); + u32x w1_t = swap_workaround (w0[1]); + u32x w2_t = swap_workaround (w0[2]); + u32x w3_t = swap_workaround (w0[3]); + u32x w4_t = swap_workaround (w1[0]); + u32x w5_t = swap_workaround (w1[1]); + u32x w6_t = swap_workaround (w1[2]); + u32x w7_t = swap_workaround (w1[3]); + u32x w8_t = swap_workaround (w2[0]); + u32x w9_t = swap_workaround (w2[1]); + u32x wa_t = swap_workaround (w2[2]); + u32x wb_t = swap_workaround (w2[3]); + u32x wc_t = swap_workaround (w3[0]); + u32x wd_t = swap_workaround (w3[1]); + u32x we_t = 0; + u32x wf_t = out_len * 8; + + u32x a = SHA1M_A; + u32x b = SHA1M_B; + u32x c = SHA1M_C; + u32x d = SHA1M_D; + u32x e = SHA1M_E; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w0_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w1_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w2_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w3_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w4_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w5_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w6_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w7_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w8_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w9_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wa_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, wb_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, wc_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, wd_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, we_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F0o, e, a, b, c, d, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F0o, d, e, a, b, c, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F0o, c, d, e, a, b, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F0o, b, c, d, e, a, w3_t); + + #undef K + #define K SHA1C01 + + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w7_t); + + #undef K + #define K SHA1C02 + + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wb_t); + + #undef K + #define K SHA1C03 + + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wf_t); + + a += SHA1M_A; + b += SHA1M_B; + c += SHA1M_C; + d += SHA1M_D; + e += SHA1M_E; + + w0_t = a; + w1_t = b; + w2_t = c; + w3_t = d; + w4_t = e; + w5_t = 0x80000000; + w6_t = 0; + w7_t = 0; + w8_t = 0; + w9_t = 0; + wa_t = 0; + wb_t = 0; + wc_t = 0; + wd_t = 0; + we_t = 0; + wf_t = 20 * 8; + + a = SHA1M_A; + b = SHA1M_B; + c = SHA1M_C; + d = SHA1M_D; + e = SHA1M_E; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w0_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w1_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w2_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w3_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w4_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w5_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w6_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w7_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w8_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w9_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wa_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, wb_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, wc_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, wd_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, we_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F0o, e, a, b, c, d, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F0o, d, e, a, b, c, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F0o, c, d, e, a, b, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F0o, b, c, d, e, a, w3_t); + + #undef K + #define K SHA1C01 + + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w7_t); + + #undef K + #define K SHA1C02 + + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wb_t); + + #undef K + #define K SHA1C03 + + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wf_t); + + + const u32x r0 = d; + const u32x r1 = e; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_M + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m00300_m08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m00300_m16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m00300_s04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + u32x pw_buf1[4]; + + pw_buf1[0] = pws[gid].i[ 4]; + pw_buf1[1] = pws[gid].i[ 5]; + pw_buf1[2] = pws[gid].i[ 6]; + pw_buf1[3] = pws[gid].i[ 7]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3], + }; + + /** + * reverse + */ + + const u32 e_rev = rotl32 (search[1], 2u); + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + + w0[0] = pw_buf0[0]; + w0[1] = pw_buf0[1]; + w0[2] = pw_buf0[2]; + w0[3] = pw_buf0[3]; + + u32x w1[4]; + + w1[0] = pw_buf1[0]; + w1[1] = pw_buf1[1]; + w1[2] = pw_buf1[2]; + w1[3] = pw_buf1[3]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 out_len = apply_rules (c_rules[il_pos].cmds, w0, w1, pw_len); + + append_0x80_2 (w0, w1, out_len); + + /** + * sha1 + */ + + u32x w0_t = swap_workaround (w0[0]); + u32x w1_t = swap_workaround (w0[1]); + u32x w2_t = swap_workaround (w0[2]); + u32x w3_t = swap_workaround (w0[3]); + u32x w4_t = swap_workaround (w1[0]); + u32x w5_t = swap_workaround (w1[1]); + u32x w6_t = swap_workaround (w1[2]); + u32x w7_t = swap_workaround (w1[3]); + u32x w8_t = swap_workaround (w2[0]); + u32x w9_t = swap_workaround (w2[1]); + u32x wa_t = swap_workaround (w2[2]); + u32x wb_t = swap_workaround (w2[3]); + u32x wc_t = swap_workaround (w3[0]); + u32x wd_t = swap_workaround (w3[1]); + u32x we_t = 0; + u32x wf_t = out_len * 8; + + u32x a = SHA1M_A; + u32x b = SHA1M_B; + u32x c = SHA1M_C; + u32x d = SHA1M_D; + u32x e = SHA1M_E; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w0_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w1_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w2_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w3_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w4_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w5_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w6_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w7_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w8_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w9_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wa_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, wb_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, wc_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, wd_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, we_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F0o, e, a, b, c, d, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F0o, d, e, a, b, c, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F0o, c, d, e, a, b, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F0o, b, c, d, e, a, w3_t); + + #undef K + #define K SHA1C01 + + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w7_t); + + #undef K + #define K SHA1C02 + + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wb_t); + + #undef K + #define K SHA1C03 + + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wf_t); + + a += SHA1M_A; + b += SHA1M_B; + c += SHA1M_C; + d += SHA1M_D; + e += SHA1M_E; + + w0_t = a; + w1_t = b; + w2_t = c; + w3_t = d; + w4_t = e; + w5_t = 0x80000000; + w6_t = 0; + w7_t = 0; + w8_t = 0; + w9_t = 0; + wa_t = 0; + wb_t = 0; + wc_t = 0; + wd_t = 0; + we_t = 0; + wf_t = 20 * 8; + + a = SHA1M_A; + b = SHA1M_B; + c = SHA1M_C; + d = SHA1M_D; + e = SHA1M_E; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w0_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w1_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w2_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w3_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w4_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w5_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w6_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w7_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w8_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w9_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wa_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, wb_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, wc_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, wd_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, we_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F0o, e, a, b, c, d, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F0o, d, e, a, b, c, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F0o, c, d, e, a, b, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F0o, b, c, d, e, a, w3_t); + + #undef K + #define K SHA1C01 + + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w7_t); + + #undef K + #define K SHA1C02 + + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wb_t); + + #undef K + #define K SHA1C03 + + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wb_t); + + if (e != e_rev) continue; + + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wf_t); + + + const u32x r0 = d; + const u32x r1 = e; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_S + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m00300_s08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m00300_s16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/nv/m00300_a1.cu b/nv/m00300_a1.cu new file mode 100644 index 0000000000..5f00e6799f --- /dev/null +++ b/nv/m00300_a1.cu @@ -0,0 +1,848 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _SHA1_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW2 +#define VECT_SIZE1 +#endif + +#define DGST_R0 3 +#define DGST_R1 4 +#define DGST_R2 2 +#define DGST_R3 1 + +#include "include/kernel_functions.c" +#include "types_nv.c" +#include "common_nv.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4_warp.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4_warp.c" +#endif + +__device__ __constant__ comb_t c_combs[1024]; + +extern "C" __global__ void __launch_bounds__ (256, 1) m00300_m04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + append_0x80_2 (wordl0, wordl1, pw_l_len); + + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, c_combs[0].pw_len); + } + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = c_combs[il_pos].pw_len; + + const u32 pw_len = pw_l_len + pw_r_len; + + u32 wordr0[4]; + + wordr0[0] = c_combs[il_pos].i[0]; + wordr0[1] = c_combs[il_pos].i[1]; + wordr0[2] = c_combs[il_pos].i[2]; + wordr0[3] = c_combs[il_pos].i[3]; + + u32 wordr1[4]; + + wordr1[0] = c_combs[il_pos].i[4]; + wordr1[1] = c_combs[il_pos].i[5]; + wordr1[2] = c_combs[il_pos].i[6]; + wordr1[3] = c_combs[il_pos].i[7]; + + u32 wordr2[4]; + + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + + u32 wordr3[4]; + + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + append_0x80_2 (wordr0, wordr1, pw_r_len); + + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + u32x w0[4]; + + w0[0] = wordl0[0] | wordr0[0]; + w0[1] = wordl0[1] | wordr0[1]; + w0[2] = wordl0[2] | wordr0[2]; + w0[3] = wordl0[3] | wordr0[3]; + + u32x w1[4]; + + w1[0] = wordl1[0] | wordr1[0]; + w1[1] = wordl1[1] | wordr1[1]; + w1[2] = wordl1[2] | wordr1[2]; + w1[3] = wordl1[3] | wordr1[3]; + + u32x w2[4]; + + w2[0] = wordl2[0] | wordr2[0]; + w2[1] = wordl2[1] | wordr2[1]; + w2[2] = wordl2[2] | wordr2[2]; + w2[3] = wordl2[3] | wordr2[3]; + + u32x w3[4]; + + w3[0] = wordl3[0] | wordr3[0]; + w3[1] = wordl3[1] | wordr3[1]; + w3[2] = 0; + w3[3] = 0; + + /** + * sha1 + */ + + u32x w0_t = swap_workaround (w0[0]); + u32x w1_t = swap_workaround (w0[1]); + u32x w2_t = swap_workaround (w0[2]); + u32x w3_t = swap_workaround (w0[3]); + u32x w4_t = swap_workaround (w1[0]); + u32x w5_t = swap_workaround (w1[1]); + u32x w6_t = swap_workaround (w1[2]); + u32x w7_t = swap_workaround (w1[3]); + u32x w8_t = swap_workaround (w2[0]); + u32x w9_t = swap_workaround (w2[1]); + u32x wa_t = swap_workaround (w2[2]); + u32x wb_t = swap_workaround (w2[3]); + u32x wc_t = swap_workaround (w3[0]); + u32x wd_t = swap_workaround (w3[1]); + u32x we_t = 0; + u32x wf_t = pw_len * 8; + + u32x a = SHA1M_A; + u32x b = SHA1M_B; + u32x c = SHA1M_C; + u32x d = SHA1M_D; + u32x e = SHA1M_E; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w0_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w1_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w2_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w3_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w4_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w5_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w6_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w7_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w8_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w9_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wa_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, wb_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, wc_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, wd_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, we_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F0o, e, a, b, c, d, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F0o, d, e, a, b, c, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F0o, c, d, e, a, b, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F0o, b, c, d, e, a, w3_t); + + #undef K + #define K SHA1C01 + + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w7_t); + + #undef K + #define K SHA1C02 + + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wb_t); + + #undef K + #define K SHA1C03 + + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wf_t); + + a += SHA1M_A; + b += SHA1M_B; + c += SHA1M_C; + d += SHA1M_D; + e += SHA1M_E; + + w0_t = a; + w1_t = b; + w2_t = c; + w3_t = d; + w4_t = e; + w5_t = 0x80000000; + w6_t = 0; + w7_t = 0; + w8_t = 0; + w9_t = 0; + wa_t = 0; + wb_t = 0; + wc_t = 0; + wd_t = 0; + we_t = 0; + wf_t = 20 * 8; + + a = SHA1M_A; + b = SHA1M_B; + c = SHA1M_C; + d = SHA1M_D; + e = SHA1M_E; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w0_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w1_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w2_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w3_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w4_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w5_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w6_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w7_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w8_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w9_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wa_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, wb_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, wc_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, wd_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, we_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F0o, e, a, b, c, d, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F0o, d, e, a, b, c, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F0o, c, d, e, a, b, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F0o, b, c, d, e, a, w3_t); + + #undef K + #define K SHA1C01 + + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w7_t); + + #undef K + #define K SHA1C02 + + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wb_t); + + #undef K + #define K SHA1C03 + + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wf_t); + + + const u32x r0 = d; + const u32x r1 = e; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_M + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m00300_m08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m00300_m16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m00300_s04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + append_0x80_2 (wordl0, wordl1, pw_l_len); + + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, c_combs[0].pw_len); + } + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3], + }; + + /** + * reverse + */ + + const u32 e_rev = rotl32 (search[1], 2u); + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = c_combs[il_pos].pw_len; + + const u32 pw_len = pw_l_len + pw_r_len; + + u32 wordr0[4]; + + wordr0[0] = c_combs[il_pos].i[0]; + wordr0[1] = c_combs[il_pos].i[1]; + wordr0[2] = c_combs[il_pos].i[2]; + wordr0[3] = c_combs[il_pos].i[3]; + + u32 wordr1[4]; + + wordr1[0] = c_combs[il_pos].i[4]; + wordr1[1] = c_combs[il_pos].i[5]; + wordr1[2] = c_combs[il_pos].i[6]; + wordr1[3] = c_combs[il_pos].i[7]; + + u32 wordr2[4]; + + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + + u32 wordr3[4]; + + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + append_0x80_2 (wordr0, wordr1, pw_r_len); + + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + u32x w0[4]; + + w0[0] = wordl0[0] | wordr0[0]; + w0[1] = wordl0[1] | wordr0[1]; + w0[2] = wordl0[2] | wordr0[2]; + w0[3] = wordl0[3] | wordr0[3]; + + u32x w1[4]; + + w1[0] = wordl1[0] | wordr1[0]; + w1[1] = wordl1[1] | wordr1[1]; + w1[2] = wordl1[2] | wordr1[2]; + w1[3] = wordl1[3] | wordr1[3]; + + u32x w2[4]; + + w2[0] = wordl2[0] | wordr2[0]; + w2[1] = wordl2[1] | wordr2[1]; + w2[2] = wordl2[2] | wordr2[2]; + w2[3] = wordl2[3] | wordr2[3]; + + u32x w3[4]; + + w3[0] = wordl3[0] | wordr3[0]; + w3[1] = wordl3[1] | wordr3[1]; + w3[2] = 0; + w3[3] = 0; + + /** + * sha1 + */ + + u32x w0_t = swap_workaround (w0[0]); + u32x w1_t = swap_workaround (w0[1]); + u32x w2_t = swap_workaround (w0[2]); + u32x w3_t = swap_workaround (w0[3]); + u32x w4_t = swap_workaround (w1[0]); + u32x w5_t = swap_workaround (w1[1]); + u32x w6_t = swap_workaround (w1[2]); + u32x w7_t = swap_workaround (w1[3]); + u32x w8_t = swap_workaround (w2[0]); + u32x w9_t = swap_workaround (w2[1]); + u32x wa_t = swap_workaround (w2[2]); + u32x wb_t = swap_workaround (w2[3]); + u32x wc_t = swap_workaround (w3[0]); + u32x wd_t = swap_workaround (w3[1]); + u32x we_t = 0; + u32x wf_t = pw_len * 8; + + u32x a = SHA1M_A; + u32x b = SHA1M_B; + u32x c = SHA1M_C; + u32x d = SHA1M_D; + u32x e = SHA1M_E; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w0_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w1_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w2_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w3_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w4_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w5_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w6_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w7_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w8_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w9_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wa_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, wb_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, wc_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, wd_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, we_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F0o, e, a, b, c, d, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F0o, d, e, a, b, c, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F0o, c, d, e, a, b, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F0o, b, c, d, e, a, w3_t); + + #undef K + #define K SHA1C01 + + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w7_t); + + #undef K + #define K SHA1C02 + + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wb_t); + + #undef K + #define K SHA1C03 + + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wf_t); + + a += SHA1M_A; + b += SHA1M_B; + c += SHA1M_C; + d += SHA1M_D; + e += SHA1M_E; + + w0_t = a; + w1_t = b; + w2_t = c; + w3_t = d; + w4_t = e; + w5_t = 0x80000000; + w6_t = 0; + w7_t = 0; + w8_t = 0; + w9_t = 0; + wa_t = 0; + wb_t = 0; + wc_t = 0; + wd_t = 0; + we_t = 0; + wf_t = 20 * 8; + + a = SHA1M_A; + b = SHA1M_B; + c = SHA1M_C; + d = SHA1M_D; + e = SHA1M_E; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w0_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w1_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w2_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w3_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w4_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w5_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w6_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w7_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w8_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w9_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wa_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, wb_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, wc_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, wd_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, we_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F0o, e, a, b, c, d, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F0o, d, e, a, b, c, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F0o, c, d, e, a, b, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F0o, b, c, d, e, a, w3_t); + + #undef K + #define K SHA1C01 + + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w7_t); + + #undef K + #define K SHA1C02 + + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wb_t); + + #undef K + #define K SHA1C03 + + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wb_t); + + if (e != e_rev) continue; + + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wf_t); + + + const u32x r0 = d; + const u32x r1 = e; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_S + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m00300_s08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m00300_s16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/nv/m00300_a3.cu b/nv/m00300_a3.cu new file mode 100644 index 0000000000..b0a2558db8 --- /dev/null +++ b/nv/m00300_a3.cu @@ -0,0 +1,1078 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _SHA1_ +#define _SCALAR_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW2 +#define VECT_SIZE1 +#endif + +#define DGST_R0 3 +#define DGST_R1 4 +#define DGST_R2 2 +#define DGST_R3 1 + +#include "include/kernel_functions.c" +#include "types_nv.c" +#include "common_nv.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4_warp.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4_warp.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4_warp.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4_warp.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4_warp.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4_warp.c" +#endif + +__device__ __constant__ u32x c_bfs[1024]; + +__device__ static void m00300m (u32 w[16], const u32 pw_len, const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const u32x *words_buf_r, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset) +{ + /** + * modifier + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 c_16s = rotl32 ((w[13] ^ w[ 8] ^ w[ 2] ), 1u); + const u32 c_17s = rotl32 ((w[14] ^ w[ 9] ^ w[ 3] ^ w[ 1]), 1u); + const u32 c_18s = rotl32 ((w[15] ^ w[10] ^ w[ 4] ^ w[ 2]), 1u); + const u32 c_19s = rotl32 ((c_16s ^ w[11] ^ w[ 5] ^ w[ 3]), 1u); + const u32 c_20s = rotl32 ((c_17s ^ w[12] ^ w[ 6] ^ w[ 4]), 1u); + const u32 c_21s = rotl32 ((c_18s ^ w[13] ^ w[ 7] ^ w[ 5]), 1u); + const u32 c_22s = rotl32 ((c_19s ^ w[14] ^ w[ 8] ^ w[ 6]), 1u); + const u32 c_23s = rotl32 ((c_20s ^ w[15] ^ w[ 9] ^ w[ 7]), 1u); + const u32 c_24s = rotl32 ((c_21s ^ c_16s ^ w[10] ^ w[ 8]), 1u); + const u32 c_25s = rotl32 ((c_22s ^ c_17s ^ w[11] ^ w[ 9]), 1u); + const u32 c_26s = rotl32 ((c_23s ^ c_18s ^ w[12] ^ w[10]), 1u); + const u32 c_27s = rotl32 ((c_24s ^ c_19s ^ w[13] ^ w[11]), 1u); + const u32 c_28s = rotl32 ((c_25s ^ c_20s ^ w[14] ^ w[12]), 1u); + const u32 c_29s = rotl32 ((c_26s ^ c_21s ^ w[15] ^ w[13]), 1u); + const u32 c_30s = rotl32 ((c_27s ^ c_22s ^ c_16s ^ w[14]), 1u); + const u32 c_31s = rotl32 ((c_28s ^ c_23s ^ c_17s ^ w[15]), 1u); + const u32 c_32s = rotl32 ((c_29s ^ c_24s ^ c_18s ^ c_16s), 1u); + const u32 c_33s = rotl32 ((c_30s ^ c_25s ^ c_19s ^ c_17s), 1u); + const u32 c_34s = rotl32 ((c_31s ^ c_26s ^ c_20s ^ c_18s), 1u); + const u32 c_35s = rotl32 ((c_32s ^ c_27s ^ c_21s ^ c_19s), 1u); + const u32 c_36s = rotl32 ((c_33s ^ c_28s ^ c_22s ^ c_20s), 1u); + const u32 c_37s = rotl32 ((c_34s ^ c_29s ^ c_23s ^ c_21s), 1u); + const u32 c_38s = rotl32 ((c_35s ^ c_30s ^ c_24s ^ c_22s), 1u); + const u32 c_39s = rotl32 ((c_36s ^ c_31s ^ c_25s ^ c_23s), 1u); + const u32 c_40s = rotl32 ((c_37s ^ c_32s ^ c_26s ^ c_24s), 1u); + const u32 c_41s = rotl32 ((c_38s ^ c_33s ^ c_27s ^ c_25s), 1u); + const u32 c_42s = rotl32 ((c_39s ^ c_34s ^ c_28s ^ c_26s), 1u); + const u32 c_43s = rotl32 ((c_40s ^ c_35s ^ c_29s ^ c_27s), 1u); + const u32 c_44s = rotl32 ((c_41s ^ c_36s ^ c_30s ^ c_28s), 1u); + const u32 c_45s = rotl32 ((c_42s ^ c_37s ^ c_31s ^ c_29s), 1u); + const u32 c_46s = rotl32 ((c_43s ^ c_38s ^ c_32s ^ c_30s), 1u); + const u32 c_47s = rotl32 ((c_44s ^ c_39s ^ c_33s ^ c_31s), 1u); + const u32 c_48s = rotl32 ((c_45s ^ c_40s ^ c_34s ^ c_32s), 1u); + const u32 c_49s = rotl32 ((c_46s ^ c_41s ^ c_35s ^ c_33s), 1u); + const u32 c_50s = rotl32 ((c_47s ^ c_42s ^ c_36s ^ c_34s), 1u); + const u32 c_51s = rotl32 ((c_48s ^ c_43s ^ c_37s ^ c_35s), 1u); + const u32 c_52s = rotl32 ((c_49s ^ c_44s ^ c_38s ^ c_36s), 1u); + const u32 c_53s = rotl32 ((c_50s ^ c_45s ^ c_39s ^ c_37s), 1u); + const u32 c_54s = rotl32 ((c_51s ^ c_46s ^ c_40s ^ c_38s), 1u); + const u32 c_55s = rotl32 ((c_52s ^ c_47s ^ c_41s ^ c_39s), 1u); + const u32 c_56s = rotl32 ((c_53s ^ c_48s ^ c_42s ^ c_40s), 1u); + const u32 c_57s = rotl32 ((c_54s ^ c_49s ^ c_43s ^ c_41s), 1u); + const u32 c_58s = rotl32 ((c_55s ^ c_50s ^ c_44s ^ c_42s), 1u); + const u32 c_59s = rotl32 ((c_56s ^ c_51s ^ c_45s ^ c_43s), 1u); + const u32 c_60s = rotl32 ((c_57s ^ c_52s ^ c_46s ^ c_44s), 1u); + const u32 c_61s = rotl32 ((c_58s ^ c_53s ^ c_47s ^ c_45s), 1u); + const u32 c_62s = rotl32 ((c_59s ^ c_54s ^ c_48s ^ c_46s), 1u); + const u32 c_63s = rotl32 ((c_60s ^ c_55s ^ c_49s ^ c_47s), 1u); + const u32 c_64s = rotl32 ((c_61s ^ c_56s ^ c_50s ^ c_48s), 1u); + const u32 c_65s = rotl32 ((c_62s ^ c_57s ^ c_51s ^ c_49s), 1u); + const u32 c_66s = rotl32 ((c_63s ^ c_58s ^ c_52s ^ c_50s), 1u); + const u32 c_67s = rotl32 ((c_64s ^ c_59s ^ c_53s ^ c_51s), 1u); + const u32 c_68s = rotl32 ((c_65s ^ c_60s ^ c_54s ^ c_52s), 1u); + const u32 c_69s = rotl32 ((c_66s ^ c_61s ^ c_55s ^ c_53s), 1u); + const u32 c_70s = rotl32 ((c_67s ^ c_62s ^ c_56s ^ c_54s), 1u); + const u32 c_71s = rotl32 ((c_68s ^ c_63s ^ c_57s ^ c_55s), 1u); + const u32 c_72s = rotl32 ((c_69s ^ c_64s ^ c_58s ^ c_56s), 1u); + const u32 c_73s = rotl32 ((c_70s ^ c_65s ^ c_59s ^ c_57s), 1u); + const u32 c_74s = rotl32 ((c_71s ^ c_66s ^ c_60s ^ c_58s), 1u); + const u32 c_75s = rotl32 ((c_72s ^ c_67s ^ c_61s ^ c_59s), 1u); + const u32 c_76s = rotl32 ((c_73s ^ c_68s ^ c_62s ^ c_60s), 1u); + const u32 c_77s = rotl32 ((c_74s ^ c_69s ^ c_63s ^ c_61s), 1u); + const u32 c_78s = rotl32 ((c_75s ^ c_70s ^ c_64s ^ c_62s), 1u); + const u32 c_79s = rotl32 ((c_76s ^ c_71s ^ c_65s ^ c_63s), 1u); + + const u32 c_17sK = c_17s + SHA1C00; + const u32 c_18sK = c_18s + SHA1C00; + const u32 c_20sK = c_20s + SHA1C01; + const u32 c_21sK = c_21s + SHA1C01; + const u32 c_23sK = c_23s + SHA1C01; + const u32 c_26sK = c_26s + SHA1C01; + const u32 c_27sK = c_27s + SHA1C01; + const u32 c_29sK = c_29s + SHA1C01; + const u32 c_33sK = c_33s + SHA1C01; + const u32 c_39sK = c_39s + SHA1C01; + const u32 c_41sK = c_41s + SHA1C02; + const u32 c_45sK = c_45s + SHA1C02; + const u32 c_53sK = c_53s + SHA1C02; + const u32 c_65sK = c_65s + SHA1C03; + const u32 c_69sK = c_69s + SHA1C03; + + const u32 w1 = w[ 1] + SHA1C00; + const u32 w2 = w[ 2] + SHA1C00; + const u32 w3 = w[ 3] + SHA1C00; + const u32 w4 = w[ 4] + SHA1C00; + const u32 w5 = w[ 5] + SHA1C00; + const u32 w6 = w[ 6] + SHA1C00; + const u32 w7 = w[ 7] + SHA1C00; + const u32 w8 = w[ 8] + SHA1C00; + const u32 w9 = w[ 9] + SHA1C00; + const u32 wa = w[10] + SHA1C00; + const u32 wb = w[11] + SHA1C00; + const u32 wc = w[12] + SHA1C00; + const u32 wd = w[13] + SHA1C00; + const u32 we = w[14] + SHA1C00; + const u32 wf = w[15] + SHA1C00; + + /** + * loop + */ + + const u32 bf_loops = ceil ((float) bfs_cnt / VECT_DIV); + + u32x w0l = w[0]; + + for (u32 il_pos = 0; il_pos < bf_loops; il_pos++) + { + const u32x w0r = c_bfs[il_pos]; + + const u32x w0 = w0l | w0r; + + const u32x w0s01 = rotl32 (w0, 1u); + const u32x w0s02 = rotl32 (w0, 2u); + const u32x w0s03 = rotl32 (w0, 3u); + const u32x w0s04 = rotl32 (w0, 4u); + const u32x w0s05 = rotl32 (w0, 5u); + const u32x w0s06 = rotl32 (w0, 6u); + const u32x w0s07 = rotl32 (w0, 7u); + const u32x w0s08 = rotl32 (w0, 8u); + const u32x w0s09 = rotl32 (w0, 9u); + const u32x w0s10 = rotl32 (w0, 10u); + const u32x w0s11 = rotl32 (w0, 11u); + const u32x w0s12 = rotl32 (w0, 12u); + const u32x w0s13 = rotl32 (w0, 13u); + const u32x w0s14 = rotl32 (w0, 14u); + const u32x w0s15 = rotl32 (w0, 15u); + const u32x w0s16 = rotl32 (w0, 16u); + const u32x w0s17 = rotl32 (w0, 17u); + const u32x w0s18 = rotl32 (w0, 18u); + const u32x w0s19 = rotl32 (w0, 19u); + const u32x w0s20 = rotl32 (w0, 20u); + const u32x w0s21 = rotl32 (w0, 21u); + const u32x w0s22 = rotl32 (w0, 22U); + + const u32x w0s04___w0s06 = w0s04 ^ w0s06; + const u32x w0s04___w0s08 = w0s04 ^ w0s08; + const u32x w0s08___w0s12 = w0s08 ^ w0s12; + const u32x w0s04___w0s06___w0s07 = w0s04___w0s06 ^ w0s07; + + u32x a = SHA1M_A; + u32x b = SHA1M_B; + u32x c = SHA1M_C; + u32x d = SHA1M_D; + u32x e = SHA1M_E; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w0); + SHA1_STEPX(SHA1_F0o, e, a, b, c, d, w1); + SHA1_STEPX(SHA1_F0o, d, e, a, b, c, w2); + SHA1_STEPX(SHA1_F0o, c, d, e, a, b, w3); + SHA1_STEPX(SHA1_F0o, b, c, d, e, a, w4); + SHA1_STEPX(SHA1_F0o, a, b, c, d, e, w5); + SHA1_STEPX(SHA1_F0o, e, a, b, c, d, w6); + SHA1_STEPX(SHA1_F0o, d, e, a, b, c, w7); + SHA1_STEPX(SHA1_F0o, c, d, e, a, b, w8); + SHA1_STEPX(SHA1_F0o, b, c, d, e, a, w9); + SHA1_STEPX(SHA1_F0o, a, b, c, d, e, wa); + SHA1_STEPX(SHA1_F0o, e, a, b, c, d, wb); + SHA1_STEPX(SHA1_F0o, d, e, a, b, c, wc); + SHA1_STEPX(SHA1_F0o, c, d, e, a, b, wd); + SHA1_STEPX(SHA1_F0o, b, c, d, e, a, we); + SHA1_STEPX(SHA1_F0o, a, b, c, d, e, wf); + + SHA1_STEP (SHA1_F0o, e, a, b, c, d, (c_16s ^ w0s01)); + SHA1_STEPX(SHA1_F0o, d, e, a, b, c, (c_17sK)); + SHA1_STEPX(SHA1_F0o, c, d, e, a, b, (c_18sK)); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, (c_19s ^ w0s02)); + + #undef K + #define K SHA1C01 + + SHA1_STEPX(SHA1_F1 , a, b, c, d, e, (c_20sK)); + SHA1_STEPX(SHA1_F1 , e, a, b, c, d, (c_21sK)); + SHA1_STEP (SHA1_F1 , d, e, a, b, c, (c_22s ^ w0s03)); + SHA1_STEPX(SHA1_F1 , c, d, e, a, b, (c_23sK)); + SHA1_STEP (SHA1_F1 , b, c, d, e, a, (c_24s ^ w0s02)); + SHA1_STEP (SHA1_F1 , a, b, c, d, e, (c_25s ^ w0s04)); + SHA1_STEPX(SHA1_F1 , e, a, b, c, d, (c_26sK)); + SHA1_STEPX(SHA1_F1 , d, e, a, b, c, (c_27sK)); + SHA1_STEP (SHA1_F1 , c, d, e, a, b, (c_28s ^ w0s05)); + SHA1_STEPX(SHA1_F1 , b, c, d, e, a, (c_29sK)); + SHA1_STEP (SHA1_F1 , a, b, c, d, e, (c_30s ^ w0s02 ^ w0s04)); + SHA1_STEP (SHA1_F1 , e, a, b, c, d, (c_31s ^ w0s06)); + SHA1_STEP (SHA1_F1 , d, e, a, b, c, (c_32s ^ w0s02 ^ w0s03)); + SHA1_STEPX(SHA1_F1 , c, d, e, a, b, (c_33sK)); + SHA1_STEP (SHA1_F1 , b, c, d, e, a, (c_34s ^ w0s07)); + SHA1_STEP (SHA1_F1 , a, b, c, d, e, (c_35s ^ w0s04)); + SHA1_STEP (SHA1_F1 , e, a, b, c, d, (c_36s ^ w0s04___w0s06)); + SHA1_STEP (SHA1_F1 , d, e, a, b, c, (c_37s ^ w0s08)); + SHA1_STEP (SHA1_F1 , c, d, e, a, b, (c_38s ^ w0s04)); + SHA1_STEPX(SHA1_F1 , b, c, d, e, a, (c_39sK)); + + #undef K + #define K SHA1C02 + + SHA1_STEP (SHA1_F2o, a, b, c, d, e, (c_40s ^ w0s04 ^ w0s09)); + SHA1_STEPX(SHA1_F2o, e, a, b, c, d, (c_41sK)); + SHA1_STEP (SHA1_F2o, d, e, a, b, c, (c_42s ^ w0s06 ^ w0s08)); + SHA1_STEP (SHA1_F2o, c, d, e, a, b, (c_43s ^ w0s10)); + SHA1_STEP (SHA1_F2o, b, c, d, e, a, (c_44s ^ w0s03 ^ w0s06 ^ w0s07)); + SHA1_STEPX(SHA1_F2o, a, b, c, d, e, (c_45sK)); + SHA1_STEP (SHA1_F2o, e, a, b, c, d, (c_46s ^ w0s04 ^ w0s11)); + SHA1_STEP (SHA1_F2o, d, e, a, b, c, (c_47s ^ w0s04___w0s08)); + SHA1_STEP (SHA1_F2o, c, d, e, a, b, (c_48s ^ w0s03 ^ w0s04___w0s08 ^ w0s05 ^ w0s10)); + SHA1_STEP (SHA1_F2o, b, c, d, e, a, (c_49s ^ w0s12)); + SHA1_STEP (SHA1_F2o, a, b, c, d, e, (c_50s ^ w0s08)); + SHA1_STEP (SHA1_F2o, e, a, b, c, d, (c_51s ^ w0s04___w0s06)); + SHA1_STEP (SHA1_F2o, d, e, a, b, c, (c_52s ^ w0s04___w0s08 ^ w0s13)); + SHA1_STEPX(SHA1_F2o, c, d, e, a, b, (c_53sK)); + SHA1_STEP (SHA1_F2o, b, c, d, e, a, (c_54s ^ w0s07 ^ w0s10 ^ w0s12)); + SHA1_STEP (SHA1_F2o, a, b, c, d, e, (c_55s ^ w0s14)); + SHA1_STEP (SHA1_F2o, e, a, b, c, d, (c_56s ^ w0s04___w0s06___w0s07 ^ w0s10 ^ w0s11)); + SHA1_STEP (SHA1_F2o, d, e, a, b, c, (c_57s ^ w0s08)); + SHA1_STEP (SHA1_F2o, c, d, e, a, b, (c_58s ^ w0s04___w0s08 ^ w0s15)); + SHA1_STEP (SHA1_F2o, b, c, d, e, a, (c_59s ^ w0s08___w0s12)); + + #undef K + #define K SHA1C03 + + SHA1_STEP (SHA1_F1 , a, b, c, d, e, (c_60s ^ w0s04 ^ w0s08___w0s12 ^ w0s07 ^ w0s14)); + SHA1_STEP (SHA1_F1 , e, a, b, c, d, (c_61s ^ w0s16)); + SHA1_STEP (SHA1_F1 , d, e, a, b, c, (c_62s ^ w0s04___w0s06 ^ w0s08___w0s12)); + SHA1_STEP (SHA1_F1 , c, d, e, a, b, (c_63s ^ w0s08)); + SHA1_STEP (SHA1_F1 , b, c, d, e, a, (c_64s ^ w0s04___w0s06___w0s07 ^ w0s08___w0s12 ^ w0s17)); + SHA1_STEPX(SHA1_F1 , a, b, c, d, e, (c_65sK)); + SHA1_STEP (SHA1_F1 , e, a, b, c, d, (c_66s ^ w0s14 ^ w0s16)); + SHA1_STEP (SHA1_F1 , d, e, a, b, c, (c_67s ^ w0s08 ^ w0s18)); + SHA1_STEP (SHA1_F1 , c, d, e, a, b, (c_68s ^ w0s11 ^ w0s14 ^ w0s15)); + SHA1_STEPX(SHA1_F1 , b, c, d, e, a, (c_69sK)); + SHA1_STEP (SHA1_F1 , a, b, c, d, e, (c_70s ^ w0s12 ^ w0s19)); + SHA1_STEP (SHA1_F1 , e, a, b, c, d, (c_71s ^ w0s12 ^ w0s16)); + SHA1_STEP (SHA1_F1 , d, e, a, b, c, (c_72s ^ w0s05 ^ w0s11 ^ w0s12 ^ w0s13 ^ w0s16 ^ w0s18)); + SHA1_STEP (SHA1_F1 , c, d, e, a, b, (c_73s ^ w0s20)); + SHA1_STEP (SHA1_F1 , b, c, d, e, a, (c_74s ^ w0s08 ^ w0s16)); + SHA1_STEP (SHA1_F1 , a, b, c, d, e, (c_75s ^ w0s06 ^ w0s12 ^ w0s14)); + SHA1_STEP (SHA1_F1 , e, a, b, c, d, (c_76s ^ w0s07 ^ w0s08___w0s12 ^ w0s16 ^ w0s21)); + SHA1_STEP (SHA1_F1 , d, e, a, b, c, (c_77s)); + SHA1_STEP (SHA1_F1 , c, d, e, a, b, (c_78s ^ w0s07 ^ w0s08 ^ w0s15 ^ w0s18 ^ w0s20)); + SHA1_STEP (SHA1_F1 , b, c, d, e, a, (c_79s ^ w0s08 ^ w0s22)); + + a += SHA1M_A; + b += SHA1M_B; + c += SHA1M_C; + d += SHA1M_D; + e += SHA1M_E; + + u32x w0_t = a; + u32x w1_t = b; + u32x w2_t = c; + u32x w3_t = d; + u32x w4_t = e; + u32x w5_t = 0x80000000; + u32x w6_t = 0; + u32x w7_t = 0; + u32x w8_t = 0; + u32x w9_t = 0; + u32x wa_t = 0; + u32x wb_t = 0; + u32x wc_t = 0; + u32x wd_t = 0; + u32x we_t = 0; + u32x wf_t = 20 * 8; + + a = SHA1M_A; + b = SHA1M_B; + c = SHA1M_C; + d = SHA1M_D; + e = SHA1M_E; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w0_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w1_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w2_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w3_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w4_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w5_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w6_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w7_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w8_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w9_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wa_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, wb_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, wc_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, wd_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, we_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F0o, e, a, b, c, d, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F0o, d, e, a, b, c, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F0o, c, d, e, a, b, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F0o, b, c, d, e, a, w3_t); + + #undef K + #define K SHA1C01 + + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w7_t); + + #undef K + #define K SHA1C02 + + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wb_t); + + #undef K + #define K SHA1C03 + + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wf_t); + + + const u32x r0 = d; + const u32x r1 = e; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_M + } +} + +__device__ static void m00300s (u32 w[16], const u32 pw_len, const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const u32x *words_buf_r, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset) +{ + /** + * modifier + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 c_16s = rotl32 ((w[13] ^ w[ 8] ^ w[ 2] ), 1u); + const u32 c_17s = rotl32 ((w[14] ^ w[ 9] ^ w[ 3] ^ w[ 1]), 1u); + const u32 c_18s = rotl32 ((w[15] ^ w[10] ^ w[ 4] ^ w[ 2]), 1u); + const u32 c_19s = rotl32 ((c_16s ^ w[11] ^ w[ 5] ^ w[ 3]), 1u); + const u32 c_20s = rotl32 ((c_17s ^ w[12] ^ w[ 6] ^ w[ 4]), 1u); + const u32 c_21s = rotl32 ((c_18s ^ w[13] ^ w[ 7] ^ w[ 5]), 1u); + const u32 c_22s = rotl32 ((c_19s ^ w[14] ^ w[ 8] ^ w[ 6]), 1u); + const u32 c_23s = rotl32 ((c_20s ^ w[15] ^ w[ 9] ^ w[ 7]), 1u); + const u32 c_24s = rotl32 ((c_21s ^ c_16s ^ w[10] ^ w[ 8]), 1u); + const u32 c_25s = rotl32 ((c_22s ^ c_17s ^ w[11] ^ w[ 9]), 1u); + const u32 c_26s = rotl32 ((c_23s ^ c_18s ^ w[12] ^ w[10]), 1u); + const u32 c_27s = rotl32 ((c_24s ^ c_19s ^ w[13] ^ w[11]), 1u); + const u32 c_28s = rotl32 ((c_25s ^ c_20s ^ w[14] ^ w[12]), 1u); + const u32 c_29s = rotl32 ((c_26s ^ c_21s ^ w[15] ^ w[13]), 1u); + const u32 c_30s = rotl32 ((c_27s ^ c_22s ^ c_16s ^ w[14]), 1u); + const u32 c_31s = rotl32 ((c_28s ^ c_23s ^ c_17s ^ w[15]), 1u); + const u32 c_32s = rotl32 ((c_29s ^ c_24s ^ c_18s ^ c_16s), 1u); + const u32 c_33s = rotl32 ((c_30s ^ c_25s ^ c_19s ^ c_17s), 1u); + const u32 c_34s = rotl32 ((c_31s ^ c_26s ^ c_20s ^ c_18s), 1u); + const u32 c_35s = rotl32 ((c_32s ^ c_27s ^ c_21s ^ c_19s), 1u); + const u32 c_36s = rotl32 ((c_33s ^ c_28s ^ c_22s ^ c_20s), 1u); + const u32 c_37s = rotl32 ((c_34s ^ c_29s ^ c_23s ^ c_21s), 1u); + const u32 c_38s = rotl32 ((c_35s ^ c_30s ^ c_24s ^ c_22s), 1u); + const u32 c_39s = rotl32 ((c_36s ^ c_31s ^ c_25s ^ c_23s), 1u); + const u32 c_40s = rotl32 ((c_37s ^ c_32s ^ c_26s ^ c_24s), 1u); + const u32 c_41s = rotl32 ((c_38s ^ c_33s ^ c_27s ^ c_25s), 1u); + const u32 c_42s = rotl32 ((c_39s ^ c_34s ^ c_28s ^ c_26s), 1u); + const u32 c_43s = rotl32 ((c_40s ^ c_35s ^ c_29s ^ c_27s), 1u); + const u32 c_44s = rotl32 ((c_41s ^ c_36s ^ c_30s ^ c_28s), 1u); + const u32 c_45s = rotl32 ((c_42s ^ c_37s ^ c_31s ^ c_29s), 1u); + const u32 c_46s = rotl32 ((c_43s ^ c_38s ^ c_32s ^ c_30s), 1u); + const u32 c_47s = rotl32 ((c_44s ^ c_39s ^ c_33s ^ c_31s), 1u); + const u32 c_48s = rotl32 ((c_45s ^ c_40s ^ c_34s ^ c_32s), 1u); + const u32 c_49s = rotl32 ((c_46s ^ c_41s ^ c_35s ^ c_33s), 1u); + const u32 c_50s = rotl32 ((c_47s ^ c_42s ^ c_36s ^ c_34s), 1u); + const u32 c_51s = rotl32 ((c_48s ^ c_43s ^ c_37s ^ c_35s), 1u); + const u32 c_52s = rotl32 ((c_49s ^ c_44s ^ c_38s ^ c_36s), 1u); + const u32 c_53s = rotl32 ((c_50s ^ c_45s ^ c_39s ^ c_37s), 1u); + const u32 c_54s = rotl32 ((c_51s ^ c_46s ^ c_40s ^ c_38s), 1u); + const u32 c_55s = rotl32 ((c_52s ^ c_47s ^ c_41s ^ c_39s), 1u); + const u32 c_56s = rotl32 ((c_53s ^ c_48s ^ c_42s ^ c_40s), 1u); + const u32 c_57s = rotl32 ((c_54s ^ c_49s ^ c_43s ^ c_41s), 1u); + const u32 c_58s = rotl32 ((c_55s ^ c_50s ^ c_44s ^ c_42s), 1u); + const u32 c_59s = rotl32 ((c_56s ^ c_51s ^ c_45s ^ c_43s), 1u); + const u32 c_60s = rotl32 ((c_57s ^ c_52s ^ c_46s ^ c_44s), 1u); + const u32 c_61s = rotl32 ((c_58s ^ c_53s ^ c_47s ^ c_45s), 1u); + const u32 c_62s = rotl32 ((c_59s ^ c_54s ^ c_48s ^ c_46s), 1u); + const u32 c_63s = rotl32 ((c_60s ^ c_55s ^ c_49s ^ c_47s), 1u); + const u32 c_64s = rotl32 ((c_61s ^ c_56s ^ c_50s ^ c_48s), 1u); + const u32 c_65s = rotl32 ((c_62s ^ c_57s ^ c_51s ^ c_49s), 1u); + const u32 c_66s = rotl32 ((c_63s ^ c_58s ^ c_52s ^ c_50s), 1u); + const u32 c_67s = rotl32 ((c_64s ^ c_59s ^ c_53s ^ c_51s), 1u); + const u32 c_68s = rotl32 ((c_65s ^ c_60s ^ c_54s ^ c_52s), 1u); + const u32 c_69s = rotl32 ((c_66s ^ c_61s ^ c_55s ^ c_53s), 1u); + const u32 c_70s = rotl32 ((c_67s ^ c_62s ^ c_56s ^ c_54s), 1u); + const u32 c_71s = rotl32 ((c_68s ^ c_63s ^ c_57s ^ c_55s), 1u); + const u32 c_72s = rotl32 ((c_69s ^ c_64s ^ c_58s ^ c_56s), 1u); + const u32 c_73s = rotl32 ((c_70s ^ c_65s ^ c_59s ^ c_57s), 1u); + const u32 c_74s = rotl32 ((c_71s ^ c_66s ^ c_60s ^ c_58s), 1u); + const u32 c_75s = rotl32 ((c_72s ^ c_67s ^ c_61s ^ c_59s), 1u); + + const u32 c_17sK = c_17s + SHA1C00; + const u32 c_18sK = c_18s + SHA1C00; + const u32 c_20sK = c_20s + SHA1C01; + const u32 c_21sK = c_21s + SHA1C01; + const u32 c_23sK = c_23s + SHA1C01; + const u32 c_26sK = c_26s + SHA1C01; + const u32 c_27sK = c_27s + SHA1C01; + const u32 c_29sK = c_29s + SHA1C01; + const u32 c_33sK = c_33s + SHA1C01; + const u32 c_39sK = c_39s + SHA1C01; + const u32 c_41sK = c_41s + SHA1C02; + const u32 c_45sK = c_45s + SHA1C02; + const u32 c_53sK = c_53s + SHA1C02; + const u32 c_65sK = c_65s + SHA1C03; + const u32 c_69sK = c_69s + SHA1C03; + + const u32 w1 = w[ 1] + SHA1C00; + const u32 w2 = w[ 2] + SHA1C00; + const u32 w3 = w[ 3] + SHA1C00; + const u32 w4 = w[ 4] + SHA1C00; + const u32 w5 = w[ 5] + SHA1C00; + const u32 w6 = w[ 6] + SHA1C00; + const u32 w7 = w[ 7] + SHA1C00; + const u32 w8 = w[ 8] + SHA1C00; + const u32 w9 = w[ 9] + SHA1C00; + const u32 wa = w[10] + SHA1C00; + const u32 wb = w[11] + SHA1C00; + const u32 wc = w[12] + SHA1C00; + const u32 wd = w[13] + SHA1C00; + const u32 we = w[14] + SHA1C00; + const u32 wf = w[15] + SHA1C00; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3], + }; + + /** + * reverse + */ + + const u32 e_rev = rotl32 (search[1], 2u); + + /** + * loop + */ + + const u32 bf_loops = ceil ((float) bfs_cnt / VECT_DIV); + + u32x w0l = w[0]; + + for (u32 il_pos = 0; il_pos < bf_loops; il_pos++) + { + const u32x w0r = c_bfs[il_pos]; + + const u32x w0 = w0l | w0r; + + const u32x w0s01 = rotl32 (w0, 1u); + const u32x w0s02 = rotl32 (w0, 2u); + const u32x w0s03 = rotl32 (w0, 3u); + const u32x w0s04 = rotl32 (w0, 4u); + const u32x w0s05 = rotl32 (w0, 5u); + const u32x w0s06 = rotl32 (w0, 6u); + const u32x w0s07 = rotl32 (w0, 7u); + const u32x w0s08 = rotl32 (w0, 8u); + const u32x w0s09 = rotl32 (w0, 9u); + const u32x w0s10 = rotl32 (w0, 10u); + const u32x w0s11 = rotl32 (w0, 11u); + const u32x w0s12 = rotl32 (w0, 12u); + const u32x w0s13 = rotl32 (w0, 13u); + const u32x w0s14 = rotl32 (w0, 14u); + const u32x w0s15 = rotl32 (w0, 15u); + const u32x w0s16 = rotl32 (w0, 16u); + const u32x w0s17 = rotl32 (w0, 17u); + const u32x w0s18 = rotl32 (w0, 18u); + const u32x w0s19 = rotl32 (w0, 19u); + const u32x w0s20 = rotl32 (w0, 20u); + + const u32x w0s04___w0s06 = w0s04 ^ w0s06; + const u32x w0s04___w0s08 = w0s04 ^ w0s08; + const u32x w0s08___w0s12 = w0s08 ^ w0s12; + const u32x w0s04___w0s06___w0s07 = w0s04___w0s06 ^ w0s07; + + u32x a = SHA1M_A; + u32x b = SHA1M_B; + u32x c = SHA1M_C; + u32x d = SHA1M_D; + u32x e = SHA1M_E; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w0); + SHA1_STEPX(SHA1_F0o, e, a, b, c, d, w1); + SHA1_STEPX(SHA1_F0o, d, e, a, b, c, w2); + SHA1_STEPX(SHA1_F0o, c, d, e, a, b, w3); + SHA1_STEPX(SHA1_F0o, b, c, d, e, a, w4); + SHA1_STEPX(SHA1_F0o, a, b, c, d, e, w5); + SHA1_STEPX(SHA1_F0o, e, a, b, c, d, w6); + SHA1_STEPX(SHA1_F0o, d, e, a, b, c, w7); + SHA1_STEPX(SHA1_F0o, c, d, e, a, b, w8); + SHA1_STEPX(SHA1_F0o, b, c, d, e, a, w9); + SHA1_STEPX(SHA1_F0o, a, b, c, d, e, wa); + SHA1_STEPX(SHA1_F0o, e, a, b, c, d, wb); + SHA1_STEPX(SHA1_F0o, d, e, a, b, c, wc); + SHA1_STEPX(SHA1_F0o, c, d, e, a, b, wd); + SHA1_STEPX(SHA1_F0o, b, c, d, e, a, we); + SHA1_STEPX(SHA1_F0o, a, b, c, d, e, wf); + + SHA1_STEP (SHA1_F0o, e, a, b, c, d, (c_16s ^ w0s01)); + SHA1_STEPX(SHA1_F0o, d, e, a, b, c, (c_17sK)); + SHA1_STEPX(SHA1_F0o, c, d, e, a, b, (c_18sK)); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, (c_19s ^ w0s02)); + + #undef K + #define K SHA1C01 + + SHA1_STEPX(SHA1_F1 , a, b, c, d, e, (c_20sK)); + SHA1_STEPX(SHA1_F1 , e, a, b, c, d, (c_21sK)); + SHA1_STEP (SHA1_F1 , d, e, a, b, c, (c_22s ^ w0s03)); + SHA1_STEPX(SHA1_F1 , c, d, e, a, b, (c_23sK)); + SHA1_STEP (SHA1_F1 , b, c, d, e, a, (c_24s ^ w0s02)); + SHA1_STEP (SHA1_F1 , a, b, c, d, e, (c_25s ^ w0s04)); + SHA1_STEPX(SHA1_F1 , e, a, b, c, d, (c_26sK)); + SHA1_STEPX(SHA1_F1 , d, e, a, b, c, (c_27sK)); + SHA1_STEP (SHA1_F1 , c, d, e, a, b, (c_28s ^ w0s05)); + SHA1_STEPX(SHA1_F1 , b, c, d, e, a, (c_29sK)); + SHA1_STEP (SHA1_F1 , a, b, c, d, e, (c_30s ^ w0s02 ^ w0s04)); + SHA1_STEP (SHA1_F1 , e, a, b, c, d, (c_31s ^ w0s06)); + SHA1_STEP (SHA1_F1 , d, e, a, b, c, (c_32s ^ w0s02 ^ w0s03)); + SHA1_STEPX(SHA1_F1 , c, d, e, a, b, (c_33sK)); + SHA1_STEP (SHA1_F1 , b, c, d, e, a, (c_34s ^ w0s07)); + SHA1_STEP (SHA1_F1 , a, b, c, d, e, (c_35s ^ w0s04)); + SHA1_STEP (SHA1_F1 , e, a, b, c, d, (c_36s ^ w0s04___w0s06)); + SHA1_STEP (SHA1_F1 , d, e, a, b, c, (c_37s ^ w0s08)); + SHA1_STEP (SHA1_F1 , c, d, e, a, b, (c_38s ^ w0s04)); + SHA1_STEPX(SHA1_F1 , b, c, d, e, a, (c_39sK)); + + #undef K + #define K SHA1C02 + + SHA1_STEP (SHA1_F2o, a, b, c, d, e, (c_40s ^ w0s04 ^ w0s09)); + SHA1_STEPX(SHA1_F2o, e, a, b, c, d, (c_41sK)); + SHA1_STEP (SHA1_F2o, d, e, a, b, c, (c_42s ^ w0s06 ^ w0s08)); + SHA1_STEP (SHA1_F2o, c, d, e, a, b, (c_43s ^ w0s10)); + SHA1_STEP (SHA1_F2o, b, c, d, e, a, (c_44s ^ w0s03 ^ w0s06 ^ w0s07)); + SHA1_STEPX(SHA1_F2o, a, b, c, d, e, (c_45sK)); + SHA1_STEP (SHA1_F2o, e, a, b, c, d, (c_46s ^ w0s04 ^ w0s11)); + SHA1_STEP (SHA1_F2o, d, e, a, b, c, (c_47s ^ w0s04___w0s08)); + SHA1_STEP (SHA1_F2o, c, d, e, a, b, (c_48s ^ w0s03 ^ w0s04___w0s08 ^ w0s05 ^ w0s10)); + SHA1_STEP (SHA1_F2o, b, c, d, e, a, (c_49s ^ w0s12)); + SHA1_STEP (SHA1_F2o, a, b, c, d, e, (c_50s ^ w0s08)); + SHA1_STEP (SHA1_F2o, e, a, b, c, d, (c_51s ^ w0s04___w0s06)); + SHA1_STEP (SHA1_F2o, d, e, a, b, c, (c_52s ^ w0s04___w0s08 ^ w0s13)); + SHA1_STEPX(SHA1_F2o, c, d, e, a, b, (c_53sK)); + SHA1_STEP (SHA1_F2o, b, c, d, e, a, (c_54s ^ w0s07 ^ w0s10 ^ w0s12)); + SHA1_STEP (SHA1_F2o, a, b, c, d, e, (c_55s ^ w0s14)); + SHA1_STEP (SHA1_F2o, e, a, b, c, d, (c_56s ^ w0s04___w0s06___w0s07 ^ w0s10 ^ w0s11)); + SHA1_STEP (SHA1_F2o, d, e, a, b, c, (c_57s ^ w0s08)); + SHA1_STEP (SHA1_F2o, c, d, e, a, b, (c_58s ^ w0s04___w0s08 ^ w0s15)); + SHA1_STEP (SHA1_F2o, b, c, d, e, a, (c_59s ^ w0s08___w0s12)); + + #undef K + #define K SHA1C03 + + SHA1_STEP (SHA1_F1 , a, b, c, d, e, (c_60s ^ w0s04 ^ w0s08___w0s12 ^ w0s07 ^ w0s14)); + SHA1_STEP (SHA1_F1 , e, a, b, c, d, (c_61s ^ w0s16)); + SHA1_STEP (SHA1_F1 , d, e, a, b, c, (c_62s ^ w0s04___w0s06 ^ w0s08___w0s12)); + SHA1_STEP (SHA1_F1 , c, d, e, a, b, (c_63s ^ w0s08)); + SHA1_STEP (SHA1_F1 , b, c, d, e, a, (c_64s ^ w0s04___w0s06___w0s07 ^ w0s08___w0s12 ^ w0s17)); + SHA1_STEPX(SHA1_F1 , a, b, c, d, e, (c_65sK)); + SHA1_STEP (SHA1_F1 , e, a, b, c, d, (c_66s ^ w0s14 ^ w0s16)); + SHA1_STEP (SHA1_F1 , d, e, a, b, c, (c_67s ^ w0s08 ^ w0s18)); + SHA1_STEP (SHA1_F1 , c, d, e, a, b, (c_68s ^ w0s11 ^ w0s14 ^ w0s15)); + SHA1_STEPX(SHA1_F1 , b, c, d, e, a, (c_69sK)); + SHA1_STEP (SHA1_F1 , a, b, c, d, e, (c_70s ^ w0s12 ^ w0s19)); + SHA1_STEP (SHA1_F1 , e, a, b, c, d, (c_71s ^ w0s12 ^ w0s16)); + SHA1_STEP (SHA1_F1 , d, e, a, b, c, (c_72s ^ w0s05 ^ w0s11 ^ w0s12 ^ w0s13 ^ w0s16 ^ w0s18)); + SHA1_STEP (SHA1_F1 , c, d, e, a, b, (c_73s ^ w0s20)); + SHA1_STEP (SHA1_F1 , b, c, d, e, a, (c_74s ^ w0s08 ^ w0s16)); + SHA1_STEP (SHA1_F1 , a, b, c, d, e, (c_75s ^ w0s06 ^ w0s12 ^ w0s14)); + + const u32 c_76s = rotl32 ((c_73s ^ c_68s ^ c_62s ^ c_60s), 1u); + const u32 c_77s = rotl32 ((c_74s ^ c_69s ^ c_63s ^ c_61s), 1u); + const u32 c_78s = rotl32 ((c_75s ^ c_70s ^ c_64s ^ c_62s), 1u); + const u32 c_79s = rotl32 ((c_76s ^ c_71s ^ c_65s ^ c_63s), 1u); + + const u32x w0s21 = rotl32 (w0, 21u); + const u32x w0s22 = rotl32 (w0, 22U); + + SHA1_STEP (SHA1_F1 , e, a, b, c, d, (c_76s ^ w0s07 ^ w0s08___w0s12 ^ w0s16 ^ w0s21)); + SHA1_STEP (SHA1_F1 , d, e, a, b, c, (c_77s)); + SHA1_STEP (SHA1_F1 , c, d, e, a, b, (c_78s ^ w0s07 ^ w0s08 ^ w0s15 ^ w0s18 ^ w0s20)); + SHA1_STEP (SHA1_F1 , b, c, d, e, a, (c_79s ^ w0s08 ^ w0s22)); + + a += SHA1M_A; + b += SHA1M_B; + c += SHA1M_C; + d += SHA1M_D; + e += SHA1M_E; + + u32x w0_t = a; + u32x w1_t = b; + u32x w2_t = c; + u32x w3_t = d; + u32x w4_t = e; + u32x w5_t = 0x80000000; + u32x w6_t = 0; + u32x w7_t = 0; + u32x w8_t = 0; + u32x w9_t = 0; + u32x wa_t = 0; + u32x wb_t = 0; + u32x wc_t = 0; + u32x wd_t = 0; + u32x we_t = 0; + u32x wf_t = 20 * 8; + + a = SHA1M_A; + b = SHA1M_B; + c = SHA1M_C; + d = SHA1M_D; + e = SHA1M_E; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w0_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w1_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w2_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w3_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w4_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w5_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w6_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w7_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w8_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w9_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wa_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, wb_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, wc_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, wd_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, we_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F0o, e, a, b, c, d, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F0o, d, e, a, b, c, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F0o, c, d, e, a, b, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F0o, b, c, d, e, a, w3_t); + + #undef K + #define K SHA1C01 + + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w7_t); + + #undef K + #define K SHA1C02 + + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wb_t); + + #undef K + #define K SHA1C03 + + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wb_t); + + bool q_cond = (e_rev != e); + + if (q_cond) continue; + + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wf_t); + + + const u32x r0 = d; + const u32x r1 = e; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_S + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m00300_m04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const u32x *words_buf_r, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32 w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = 0; + w[ 5] = 0; + w[ 6] = 0; + w[ 7] = 0; + w[ 8] = 0; + w[ 9] = 0; + w[10] = 0; + w[11] = 0; + w[12] = 0; + w[13] = 0; + w[14] = 0; + w[15] = pws[gid].i[15]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m00300m (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m00300_m08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const u32x *words_buf_r, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32 w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = pws[gid].i[ 4]; + w[ 5] = pws[gid].i[ 5]; + w[ 6] = pws[gid].i[ 6]; + w[ 7] = pws[gid].i[ 7]; + w[ 8] = 0; + w[ 9] = 0; + w[10] = 0; + w[11] = 0; + w[12] = 0; + w[13] = 0; + w[14] = 0; + w[15] = pws[gid].i[15]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m00300m (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m00300_m16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const u32x *words_buf_r, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32 w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = pws[gid].i[ 4]; + w[ 5] = pws[gid].i[ 5]; + w[ 6] = pws[gid].i[ 6]; + w[ 7] = pws[gid].i[ 7]; + w[ 8] = pws[gid].i[ 8]; + w[ 9] = pws[gid].i[ 9]; + w[10] = pws[gid].i[10]; + w[11] = pws[gid].i[11]; + w[12] = pws[gid].i[12]; + w[13] = pws[gid].i[13]; + w[14] = pws[gid].i[14]; + w[15] = pws[gid].i[15]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m00300m (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m00300_s04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const u32x *words_buf_r, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32 w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = 0; + w[ 5] = 0; + w[ 6] = 0; + w[ 7] = 0; + w[ 8] = 0; + w[ 9] = 0; + w[10] = 0; + w[11] = 0; + w[12] = 0; + w[13] = 0; + w[14] = 0; + w[15] = pws[gid].i[15]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m00300s (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m00300_s08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const u32x *words_buf_r, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32 w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = pws[gid].i[ 4]; + w[ 5] = pws[gid].i[ 5]; + w[ 6] = pws[gid].i[ 6]; + w[ 7] = pws[gid].i[ 7]; + w[ 8] = 0; + w[ 9] = 0; + w[10] = 0; + w[11] = 0; + w[12] = 0; + w[13] = 0; + w[14] = 0; + w[15] = pws[gid].i[15]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m00300s (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m00300_s16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const u32x *words_buf_r, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32 w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = pws[gid].i[ 4]; + w[ 5] = pws[gid].i[ 5]; + w[ 6] = pws[gid].i[ 6]; + w[ 7] = pws[gid].i[ 7]; + w[ 8] = pws[gid].i[ 8]; + w[ 9] = pws[gid].i[ 9]; + w[10] = pws[gid].i[10]; + w[11] = pws[gid].i[11]; + w[12] = pws[gid].i[12]; + w[13] = pws[gid].i[13]; + w[14] = pws[gid].i[14]; + w[15] = pws[gid].i[15]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m00300s (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} diff --git a/nv/m00400.cu b/nv/m00400.cu new file mode 100644 index 0000000000..f2cb53cdce --- /dev/null +++ b/nv/m00400.cu @@ -0,0 +1,358 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _MD5_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW2 +#define VECT_SIZE2 +#endif + +#define DGST_R0 0 +#define DGST_R1 1 +#define DGST_R2 2 +#define DGST_R3 3 + +#include "include/kernel_functions.c" +#include "types_nv.c" +#include "common_nv.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +__device__ static void md5_transform (const u32x w0[4], const u32x w1[4], const u32x w2[4], const u32x w3[4], u32x digest[4]) +{ + u32x a = digest[0]; + u32x b = digest[1]; + u32x c = digest[2]; + u32x d = digest[3]; + + u32x w0_t = w0[0]; + u32x w1_t = w0[1]; + u32x w2_t = w0[2]; + u32x w3_t = w0[3]; + u32x w4_t = w1[0]; + u32x w5_t = w1[1]; + u32x w6_t = w1[2]; + u32x w7_t = w1[3]; + u32x w8_t = w2[0]; + u32x w9_t = w2[1]; + u32x wa_t = w2[2]; + u32x wb_t = w2[3]; + u32x wc_t = w3[0]; + u32x wd_t = w3[1]; + u32x we_t = w3[2]; + u32x wf_t = 0; + + u32x tmp2; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t, MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t, MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t, MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t, MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w4_t, MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w5_t, MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w6_t, MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w7_t, MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w8_t, MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w9_t, MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, wa_t, MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, wb_t, MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, wc_t, MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, wd_t, MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, we_t, MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, wf_t, MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w1_t, MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w6_t, MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, wb_t, MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t, MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w5_t, MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, wa_t, MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, wf_t, MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w4_t, MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w9_t, MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, we_t, MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t, MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w8_t, MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, wd_t, MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t, MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w7_t, MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, wc_t, MD5C1f, MD5S13); + + MD5_STEP (MD5_H1, a, b, c, d, w5_t, MD5C20, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w8_t, MD5C21, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, wb_t, MD5C22, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, we_t, MD5C23, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w1_t, MD5C24, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w4_t, MD5C25, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w7_t, MD5C26, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, wa_t, MD5C27, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, wd_t, MD5C28, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w0_t, MD5C29, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w3_t, MD5C2a, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w6_t, MD5C2b, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w9_t, MD5C2c, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, wc_t, MD5C2d, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, wf_t, MD5C2e, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w2_t, MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t, MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w7_t, MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, we_t, MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w5_t, MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, wc_t, MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t, MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, wa_t, MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t, MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w8_t, MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, wf_t, MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w6_t, MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, wd_t, MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w4_t, MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, wb_t, MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t, MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w9_t, MD5C3f, MD5S33); + + digest[0] += a; + digest[1] += b; + digest[2] += c; + digest[3] += d; +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m00400_init (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, phpass_tmp_t *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = pws[gid].i[ 8]; + w2[1] = pws[gid].i[ 9]; + w2[2] = 0; + w2[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * salt + */ + + u32 salt_buf[2]; + + salt_buf[0] = salt_bufs[salt_pos].salt_buf[0]; + salt_buf[1] = salt_bufs[salt_pos].salt_buf[1]; + + /** + * init + */ + + u32 block_len = 8 + pw_len; + + u32x block0[4]; + + block0[0] = salt_buf[0]; + block0[1] = salt_buf[1]; + block0[2] = w0[0]; + block0[3] = w0[1]; + + u32x block1[4]; + + block1[0] = w0[2]; + block1[1] = w0[3]; + block1[2] = w1[0]; + block1[3] = w1[1]; + + u32x block2[4]; + + block2[0] = w1[2]; + block2[1] = w1[3]; + block2[2] = w2[0]; + block2[3] = w2[1]; + + u32x block3[4]; + + block3[0] = 0; + block3[1] = 0; + block3[2] = block_len * 8; + block3[3] = 0; + + append_0x80_4 (block0, block1, block2, block3, block_len); + + /** + * init + */ + + u32x digest[4]; + + digest[0] = MD5M_A; + digest[1] = MD5M_B; + digest[2] = MD5M_C; + digest[3] = MD5M_D; + + md5_transform (block0, block1, block2, block3, digest); + + tmps[gid].digest_buf[0] = digest[0]; + tmps[gid].digest_buf[1] = digest[1]; + tmps[gid].digest_buf[2] = digest[2]; + tmps[gid].digest_buf[3] = digest[3]; +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m00400_loop (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, phpass_tmp_t *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = pws[gid].i[ 8]; + w2[1] = pws[gid].i[ 9]; + w2[2] = 0; + w2[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * digest + */ + + u32x digest[4]; + + digest[0] = tmps[gid].digest_buf[0]; + digest[1] = tmps[gid].digest_buf[1]; + digest[2] = tmps[gid].digest_buf[2]; + digest[3] = tmps[gid].digest_buf[3]; + + /** + * loop + */ + + u32 block_len = (16 + pw_len); + + u32x block0[4]; + + block0[0] = 0; + block0[1] = 0; + block0[2] = 0; + block0[3] = 0; + + u32x block1[4]; + + block1[0] = w0[0]; + block1[1] = w0[1]; + block1[2] = w0[2]; + block1[3] = w0[3]; + + u32x block2[4]; + + block2[0] = w1[0]; + block2[1] = w1[1]; + block2[2] = w1[2]; + block2[3] = w1[3]; + + u32x block3[4]; + + block3[0] = w2[0]; + block3[1] = w2[1]; + block3[2] = block_len * 8; + block3[3] = 0; + + append_0x80_4 (block0, block1, block2, block3, block_len); + + /** + * init + */ + + for (u32 i = 0; i < loop_cnt; i++) + { + block0[0] = digest[0]; + block0[1] = digest[1]; + block0[2] = digest[2]; + block0[3] = digest[3]; + + digest[0] = MD5M_A; + digest[1] = MD5M_B; + digest[2] = MD5M_C; + digest[3] = MD5M_D; + + md5_transform (block0, block1, block2, block3, digest); + } + + tmps[gid].digest_buf[0] = digest[0]; + tmps[gid].digest_buf[1] = digest[1]; + tmps[gid].digest_buf[2] = digest[2]; + tmps[gid].digest_buf[3] = digest[3]; +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m00400_comp (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, phpass_tmp_t *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + const u32 lid = threadIdx.x; + + /** + * digest + */ + + const u32x r0 = tmps[gid].digest_buf[DGST_R0]; + const u32x r1 = tmps[gid].digest_buf[DGST_R1]; + const u32x r2 = tmps[gid].digest_buf[DGST_R2]; + const u32x r3 = tmps[gid].digest_buf[DGST_R3]; + + #define il_pos 0 + + #include VECT_COMPARE_M +} diff --git a/nv/m00500.cu b/nv/m00500.cu new file mode 100644 index 0000000000..b582d90443 --- /dev/null +++ b/nv/m00500.cu @@ -0,0 +1,1174 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _MD5_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW2 +#define VECT_SIZE2 +#endif + +#define DGST_R0 0 +#define DGST_R1 1 +#define DGST_R2 2 +#define DGST_R3 3 + +#include "include/kernel_functions.c" +#include "types_nv.c" +#include "common_nv.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +#define md5crypt_magic 0x00243124 + +__device__ static void md5_transform (const u32x w0[4], const u32x w1[4], const u32x w2[4], const u32x w3[4], u32x digest[4]) +{ + u32x a = digest[0]; + u32x b = digest[1]; + u32x c = digest[2]; + u32x d = digest[3]; + + u32x w0_t = w0[0]; + u32x w1_t = w0[1]; + u32x w2_t = w0[2]; + u32x w3_t = w0[3]; + u32x w4_t = w1[0]; + u32x w5_t = w1[1]; + u32x w6_t = w1[2]; + u32x w7_t = w1[3]; + u32x w8_t = w2[0]; + u32x w9_t = w2[1]; + u32x wa_t = w2[2]; + u32x wb_t = w2[3]; + u32x wc_t = w3[0]; + u32x wd_t = w3[1]; + u32x we_t = w3[2]; + u32x wf_t = 0; + + u32x tmp2; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t, MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t, MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t, MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t, MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w4_t, MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w5_t, MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w6_t, MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w7_t, MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w8_t, MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w9_t, MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, wa_t, MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, wb_t, MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, wc_t, MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, wd_t, MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, we_t, MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, wf_t, MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w1_t, MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w6_t, MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, wb_t, MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t, MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w5_t, MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, wa_t, MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, wf_t, MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w4_t, MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w9_t, MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, we_t, MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t, MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w8_t, MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, wd_t, MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t, MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w7_t, MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, wc_t, MD5C1f, MD5S13); + + MD5_STEP (MD5_H1, a, b, c, d, w5_t, MD5C20, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w8_t, MD5C21, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, wb_t, MD5C22, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, we_t, MD5C23, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w1_t, MD5C24, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w4_t, MD5C25, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w7_t, MD5C26, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, wa_t, MD5C27, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, wd_t, MD5C28, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w0_t, MD5C29, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w3_t, MD5C2a, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w6_t, MD5C2b, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w9_t, MD5C2c, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, wc_t, MD5C2d, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, wf_t, MD5C2e, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w2_t, MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t, MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w7_t, MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, we_t, MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w5_t, MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, wc_t, MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t, MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, wa_t, MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t, MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w8_t, MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, wf_t, MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w6_t, MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, wd_t, MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w4_t, MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, wb_t, MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t, MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w9_t, MD5C3f, MD5S33); + + digest[0] += a; + digest[1] += b; + digest[2] += c; + digest[3] += d; +} + +__device__ static void memcat16 (u32x block0[4], u32x block1[4], u32x block2[4], u32x block3[4], const u32 block_len, const u32x append[4]) +{ + u32x tmp0; + u32x tmp1; + u32x tmp2; + u32x tmp3; + u32x tmp4; + + #if __CUDA_ARCH__ >= 200 + + const int offset_minus_4 = 4 - (block_len & 3); + + const int selector = (0x76543210 >> (offset_minus_4 * 4)) & 0xffff; + + tmp0 = __byte_perm ( 0, append[0], selector); + tmp1 = __byte_perm (append[0], append[1], selector); + tmp2 = __byte_perm (append[1], append[2], selector); + tmp3 = __byte_perm (append[2], append[3], selector); + tmp4 = __byte_perm (append[3], 0, selector); + + #else + + const u32 mod = block_len & 3; + + switch (mod) + { + case 0: tmp0 = append[0]; + tmp1 = append[1]; + tmp2 = append[2]; + tmp3 = append[3]; + tmp4 = 0; + break; + case 1: tmp0 = append[0] << 8; + tmp1 = append[0] >> 24 | append[1] << 8; + tmp2 = append[1] >> 24 | append[2] << 8; + tmp3 = append[2] >> 24 | append[3] << 8; + tmp4 = append[3] >> 24; + break; + case 2: tmp0 = append[0] << 16; + tmp1 = append[0] >> 16 | append[1] << 16; + tmp2 = append[1] >> 16 | append[2] << 16; + tmp3 = append[2] >> 16 | append[3] << 16; + tmp4 = append[3] >> 16; + break; + case 3: tmp0 = append[0] << 24; + tmp1 = append[0] >> 8 | append[1] << 24; + tmp2 = append[1] >> 8 | append[2] << 24; + tmp3 = append[2] >> 8 | append[3] << 24; + tmp4 = append[3] >> 8; + break; + } + + #endif + + const u32 div = block_len / 4; + + switch (div) + { + case 0: block0[0] |= tmp0; + block0[1] = tmp1; + block0[2] = tmp2; + block0[3] = tmp3; + block1[0] = tmp4; + break; + case 1: block0[1] |= tmp0; + block0[2] = tmp1; + block0[3] = tmp2; + block1[0] = tmp3; + block1[1] = tmp4; + break; + case 2: block0[2] |= tmp0; + block0[3] = tmp1; + block1[0] = tmp2; + block1[1] = tmp3; + block1[2] = tmp4; + break; + case 3: block0[3] |= tmp0; + block1[0] = tmp1; + block1[1] = tmp2; + block1[2] = tmp3; + block1[3] = tmp4; + break; + case 4: block1[0] |= tmp0; + block1[1] = tmp1; + block1[2] = tmp2; + block1[3] = tmp3; + block2[0] = tmp4; + break; + case 5: block1[1] |= tmp0; + block1[2] = tmp1; + block1[3] = tmp2; + block2[0] = tmp3; + block2[1] = tmp4; + break; + case 6: block1[2] |= tmp0; + block1[3] = tmp1; + block2[0] = tmp2; + block2[1] = tmp3; + block2[2] = tmp4; + break; + case 7: block1[3] |= tmp0; + block2[0] = tmp1; + block2[1] = tmp2; + block2[2] = tmp3; + block2[3] = tmp4; + break; + case 8: block2[0] |= tmp0; + block2[1] = tmp1; + block2[2] = tmp2; + block2[3] = tmp3; + block3[0] = tmp4; + break; + case 9: block2[1] |= tmp0; + block2[2] = tmp1; + block2[3] = tmp2; + block3[0] = tmp3; + block3[1] = tmp4; + break; + } + + return; +} + +__device__ static void memcat16_x80 (u32x block0[4], u32x block1[4], u32x block2[4], u32x block3[4], const u32 block_len, const u32x append[4]) +{ + u32x tmp0; + u32x tmp1; + u32x tmp2; + u32x tmp3; + u32x tmp4; + + #if __CUDA_ARCH__ >= 200 + + const int offset_minus_4 = 4 - (block_len & 3); + + const int selector = (0x76543210 >> (offset_minus_4 * 4)) & 0xffff; + + tmp0 = __byte_perm ( 0, append[0], selector); + tmp1 = __byte_perm (append[0], append[1], selector); + tmp2 = __byte_perm (append[1], append[2], selector); + tmp3 = __byte_perm (append[2], append[3], selector); + tmp4 = __byte_perm (append[3], 0x80, selector); + + #else + + const u32 mod = block_len & 3; + + switch (mod) + { + case 0: tmp0 = append[0]; + tmp1 = append[1]; + tmp2 = append[2]; + tmp3 = append[3]; + tmp4 = 0x80; + break; + case 1: tmp0 = append[0] << 8; + tmp1 = append[0] >> 24 | append[1] << 8; + tmp2 = append[1] >> 24 | append[2] << 8; + tmp3 = append[2] >> 24 | append[3] << 8; + tmp4 = append[3] >> 24; + break; + case 2: tmp0 = append[0] << 16; + tmp1 = append[0] >> 16 | append[1] << 16; + tmp2 = append[1] >> 16 | append[2] << 16; + tmp3 = append[2] >> 16 | append[3] << 16; + tmp4 = append[3] >> 16; + break; + case 3: tmp0 = append[0] << 24; + tmp1 = append[0] >> 8 | append[1] << 24; + tmp2 = append[1] >> 8 | append[2] << 24; + tmp3 = append[2] >> 8 | append[3] << 24; + tmp4 = append[3] >> 8; + break; + } + + #endif + + const u32 div = block_len / 4; + + switch (div) + { + case 0: block0[0] |= tmp0; + block0[1] = tmp1; + block0[2] = tmp2; + block0[3] = tmp3; + block1[0] = tmp4; + break; + case 1: block0[1] |= tmp0; + block0[2] = tmp1; + block0[3] = tmp2; + block1[0] = tmp3; + block1[1] = tmp4; + break; + case 2: block0[2] |= tmp0; + block0[3] = tmp1; + block1[0] = tmp2; + block1[1] = tmp3; + block1[2] = tmp4; + break; + case 3: block0[3] |= tmp0; + block1[0] = tmp1; + block1[1] = tmp2; + block1[2] = tmp3; + block1[3] = tmp4; + break; + case 4: block1[0] |= tmp0; + block1[1] = tmp1; + block1[2] = tmp2; + block1[3] = tmp3; + block2[0] = tmp4; + break; + case 5: block1[1] |= tmp0; + block1[2] = tmp1; + block1[3] = tmp2; + block2[0] = tmp3; + block2[1] = tmp4; + break; + case 6: block1[2] |= tmp0; + block1[3] = tmp1; + block2[0] = tmp2; + block2[1] = tmp3; + block2[2] = tmp4; + break; + case 7: block1[3] |= tmp0; + block2[0] = tmp1; + block2[1] = tmp2; + block2[2] = tmp3; + block2[3] = tmp4; + break; + case 8: block2[0] |= tmp0; + block2[1] = tmp1; + block2[2] = tmp2; + block2[3] = tmp3; + block3[0] = tmp4; + break; + case 9: block2[1] |= tmp0; + block2[2] = tmp1; + block2[3] = tmp2; + block3[0] = tmp3; + block3[1] = tmp4; + break; + } + + return; +} + +__device__ static void memcat8 (u32x block0[4], u32x block1[4], u32x block2[4], u32x block3[4], const u32 block_len, const u32 append[2]) +{ + u32x tmp0; + u32x tmp1; + u32x tmp2; + + #if __CUDA_ARCH__ >= 200 + + const int offset_minus_4 = 4 - (block_len & 3); + + const int selector = (0x76543210 >> (offset_minus_4 * 4)) & 0xffff; + + tmp0 = __byte_perm ( 0, append[0], selector); + tmp1 = __byte_perm (append[0], append[1], selector); + tmp2 = __byte_perm (append[1], 0, selector); + + #else + + const u32 mod = block_len & 3; + + switch (mod) + { + case 0: tmp0 = append[0]; + tmp1 = append[1]; + tmp2 = 0; + break; + case 1: tmp0 = append[0] << 8; + tmp1 = append[0] >> 24 | append[1] << 8; + tmp2 = append[1] >> 24; + break; + case 2: tmp0 = append[0] << 16; + tmp1 = append[0] >> 16 | append[1] << 16; + tmp2 = append[1] >> 16; + break; + case 3: tmp0 = append[0] << 24; + tmp1 = append[0] >> 8 | append[1] << 24; + tmp2 = append[1] >> 8; + break; + } + + #endif + + const u32 div = block_len / 4; + + switch (div) + { + case 0: block0[0] |= tmp0; + block0[1] = tmp1; + block0[2] = tmp2; + break; + case 1: block0[1] |= tmp0; + block0[2] = tmp1; + block0[3] = tmp2; + break; + case 2: block0[2] |= tmp0; + block0[3] = tmp1; + block1[0] = tmp2; + break; + case 3: block0[3] |= tmp0; + block1[0] = tmp1; + block1[1] = tmp2; + break; + case 4: block1[0] |= tmp0; + block1[1] = tmp1; + block1[2] = tmp2; + break; + case 5: block1[1] |= tmp0; + block1[2] = tmp1; + block1[3] = tmp2; + break; + case 6: block1[2] |= tmp0; + block1[3] = tmp1; + block2[0] = tmp2; + break; + case 7: block1[3] |= tmp0; + block2[0] = tmp1; + block2[1] = tmp2; + break; + case 8: block2[0] |= tmp0; + block2[1] = tmp1; + block2[2] = tmp2; + break; + case 9: block2[1] |= tmp0; + block2[2] = tmp1; + block2[3] = tmp2; + break; + case 10: block2[2] |= tmp0; + block2[3] = tmp1; + block3[0] = tmp2; + break; + case 11: block2[3] |= tmp0; + block3[0] = tmp1; + block3[1] = tmp2; + break; + } + + return; +} + +__device__ static void append_sign (u32x block0[4], u32x block1[4], const u32 block_len) +{ + switch (block_len) + { + case 0: + block0[0] = md5crypt_magic; + break; + + case 1: + block0[0] = block0[0] | md5crypt_magic << 8; + block0[1] = md5crypt_magic >> 24; + break; + + case 2: + block0[0] = block0[0] | md5crypt_magic << 16; + block0[1] = md5crypt_magic >> 16; + break; + + case 3: + block0[0] = block0[0] | md5crypt_magic << 24; + block0[1] = md5crypt_magic >> 8; + break; + + case 4: + block0[1] = md5crypt_magic; + break; + + case 5: + block0[1] = block0[1] | md5crypt_magic << 8; + block0[2] = md5crypt_magic >> 24; + break; + + case 6: + block0[1] = block0[1] | md5crypt_magic << 16; + block0[2] = md5crypt_magic >> 16; + break; + + case 7: + block0[1] = block0[1] | md5crypt_magic << 24; + block0[2] = md5crypt_magic >> 8; + break; + + case 8: + block0[2] = md5crypt_magic; + break; + + case 9: + block0[2] = block0[2] | md5crypt_magic << 8; + block0[3] = md5crypt_magic >> 24; + break; + + case 10: + block0[2] = block0[2] | md5crypt_magic << 16; + block0[3] = md5crypt_magic >> 16; + break; + + case 11: + block0[2] = block0[2] | md5crypt_magic << 24; + block0[3] = md5crypt_magic >> 8; + break; + + case 12: + block0[3] = md5crypt_magic; + break; + + case 13: + block0[3] = block0[3] | md5crypt_magic << 8; + block1[0] = md5crypt_magic >> 24; + break; + + case 14: + block0[3] = block0[3] | md5crypt_magic << 16; + block1[0] = md5crypt_magic >> 16; + break; + + case 15: + block0[3] = block0[3] | md5crypt_magic << 24; + block1[0] = md5crypt_magic >> 8; + break; + } +} + +__device__ static void append_1st (u32x block0[4], u32x block1[4], u32x block2[4], u32x block3[4], const u32 block_len, const u32x append) +{ + switch (block_len) + { + case 0: + block0[0] = append; + break; + + case 1: + block0[0] = block0[0] | append << 8; + break; + + case 2: + block0[0] = block0[0] | append << 16; + break; + + case 3: + block0[0] = block0[0] | append << 24; + break; + + case 4: + block0[1] = append; + break; + + case 5: + block0[1] = block0[1] | append << 8; + break; + + case 6: + block0[1] = block0[1] | append << 16; + break; + + case 7: + block0[1] = block0[1] | append << 24; + break; + + case 8: + block0[2] = append; + break; + + case 9: + block0[2] = block0[2] | append << 8; + break; + + case 10: + block0[2] = block0[2] | append << 16; + break; + + case 11: + block0[2] = block0[2] | append << 24; + break; + + case 12: + block0[3] = append; + break; + + case 13: + block0[3] = block0[3] | append << 8; + break; + + case 14: + block0[3] = block0[3] | append << 16; + break; + + case 15: + block0[3] = block0[3] | append << 24; + break; + + case 16: + block1[0] = append; + break; + + case 17: + block1[0] = block1[0] | append << 8; + break; + + case 18: + block1[0] = block1[0] | append << 16; + break; + + case 19: + block1[0] = block1[0] | append << 24; + break; + + case 20: + block1[1] = append; + break; + + case 21: + block1[1] = block1[1] | append << 8; + break; + + case 22: + block1[1] = block1[1] | append << 16; + break; + + case 23: + block1[1] = block1[1] | append << 24; + break; + + case 24: + block1[2] = append; + break; + + case 25: + block1[2] = block1[2] | append << 8; + break; + + case 26: + block1[2] = block1[2] | append << 16; + break; + + case 27: + block1[2] = block1[2] | append << 24; + break; + + case 28: + block1[3] = append; + break; + + case 29: + block1[3] = block1[3] | append << 8; + break; + + case 30: + block1[3] = block1[3] | append << 16; + break; + + case 31: + block1[3] = block1[3] | append << 24; + break; + + case 32: + block2[0] = append; + break; + + case 33: + block2[0] = block2[0] | append << 8; + break; + + case 34: + block2[0] = block2[0] | append << 16; + break; + + case 35: + block2[0] = block2[0] | append << 24; + break; + + case 36: + block2[1] = append; + break; + + case 37: + block2[1] = block2[1] | append << 8; + break; + + case 38: + block2[1] = block2[1] | append << 16; + break; + + case 39: + block2[1] = block2[1] | append << 24; + break; + + case 40: + block2[2] = append; + break; + + case 41: + block2[2] = block2[2] | append << 8; + break; + + case 42: + block2[2] = block2[2] | append << 16; + break; + + case 43: + block2[2] = block2[2] | append << 24; + break; + + case 44: + block2[3] = append; + break; + + case 45: + block2[3] = block2[3] | append << 8; + break; + + case 46: + block2[3] = block2[3] | append << 16; + break; + + case 47: + block2[3] = block2[3] | append << 24; + break; + + case 48: + block3[0] = append; + break; + + case 49: + block3[0] = block3[0] | append << 8; + break; + + case 50: + block3[0] = block3[0] | append << 16; + break; + + case 51: + block3[0] = block3[0] | append << 24; + break; + + case 52: + block3[1] = append; + break; + + case 53: + block3[1] = block3[1] | append << 8; + break; + + case 54: + block3[1] = block3[1] | append << 16; + break; + + case 55: + block3[1] = block3[1] | append << 24; + break; + + case 56: + block3[2] = append; + break; + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m00500_init (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, md5crypt_tmp_t *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[0]; + w0[1] = pws[gid].i[1]; + w0[2] = pws[gid].i[2]; + w0[3] = pws[gid].i[3]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * salt + */ + + u32 salt_buf[2]; + + salt_buf[0] = salt_bufs[salt_pos].salt_buf[0]; + salt_buf[1] = salt_bufs[salt_pos].salt_buf[1]; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + /** + * init + */ + + //memcat16 (block0, block1, block2, block3, block_len, w0); + //block_len += pw_len; + + u32 block_len = pw_len; + + u32x block0[4]; + + block0[0] = w0[0]; + block0[1] = w0[1]; + block0[2] = w0[2]; + block0[3] = w0[3]; + + u32x block1[4]; + + block1[0] = 0; + block1[1] = 0; + block1[2] = 0; + block1[3] = 0; + + u32x block2[4]; + + block2[0] = 0; + block2[1] = 0; + block2[2] = 0; + block2[3] = 0; + + u32x block3[4]; + + block3[0] = 0; + block3[1] = 0; + block3[2] = 0; + block3[3] = 0; + + memcat8 (block0, block1, block2, block3, block_len, salt_buf); + + block_len += salt_len; + + memcat16 (block0, block1, block2, block3, block_len, w0); + + block_len += pw_len; + + append_0x80_4 (block0, block1, block2, block3, block_len); + + block3[2] = block_len * 8; + + u32x digest[4]; + + digest[0] = MD5M_A; + digest[1] = MD5M_B; + digest[2] = MD5M_C; + digest[3] = MD5M_D; + + md5_transform (block0, block1, block2, block3, digest); + + /* The password first, since that is what is most unknown */ + /* Then our magic string */ + /* Then the raw salt */ + /* Then just as many characters of the MD5(pw,salt,pw) */ + + //memcat16 (block0, block1, block2, block3, block_len, w); + //block_len += pw_len; + + block_len = pw_len; + + block0[0] = w0[0]; + block0[1] = w0[1]; + block0[2] = w0[2]; + block0[3] = w0[3]; + + block1[0] = 0; + block1[1] = 0; + block1[2] = 0; + block1[3] = 0; + + block2[0] = 0; + block2[1] = 0; + block2[2] = 0; + block2[3] = 0; + + block3[0] = 0; + block3[1] = 0; + block3[2] = 0; + block3[3] = 0; + + append_sign (block0, block1, block_len); + + block_len += 3; + + memcat8 (block0, block1, block2, block3, block_len, salt_buf); + + block_len += salt_len; + + truncate_block (digest, pw_len); + + memcat16 (block0, block1, block2, block3, block_len, digest); + + block_len += pw_len; + + /* Then something really weird... */ + + u32x append = block0[0] & 0xFF; + + for (u32 j = pw_len; j; j >>= 1) + { + if ((j & 1) == 0) + { + append_1st (block0, block1, block2, block3, block_len, append); + } + + block_len++; + } + + append_0x80_4 (block0, block1, block2, block3, block_len); + + block3[2] = block_len * 8; + + digest[0] = MD5M_A; + digest[1] = MD5M_B; + digest[2] = MD5M_C; + digest[3] = MD5M_D; + + md5_transform (block0, block1, block2, block3, digest); + + tmps[gid].digest_buf[0] = digest[0]; + tmps[gid].digest_buf[1] = digest[1]; + tmps[gid].digest_buf[2] = digest[2]; + tmps[gid].digest_buf[3] = digest[3]; +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m00500_loop (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, md5crypt_tmp_t *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[0]; + w0[1] = pws[gid].i[1]; + w0[2] = pws[gid].i[2]; + w0[3] = pws[gid].i[3]; + + const u32 pw_len = pws[gid].pw_len; + + u32x w0_x80[4]; + + w0_x80[0] = w0[0]; + w0_x80[1] = w0[1]; + w0_x80[2] = w0[2]; + w0_x80[3] = w0[3]; + + append_0x80_1 (w0_x80, pw_len); + + /** + * salt + */ + + u32 salt_buf[2]; + + salt_buf[0] = salt_bufs[salt_pos].salt_buf[0]; + salt_buf[1] = salt_bufs[salt_pos].salt_buf[1]; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + /** + * digest + */ + + u32x digest[4]; + + digest[0] = tmps[gid].digest_buf[0]; + digest[1] = tmps[gid].digest_buf[1]; + digest[2] = tmps[gid].digest_buf[2]; + digest[3] = tmps[gid].digest_buf[3]; + + /** + * loop + */ + + /* and now, just to make sure things don't run too fast */ + + u32 block_len; + + u32x block0[4]; + + block0[0] = 0; + block0[1] = 0; + block0[2] = 0; + block0[3] = 0; + + u32x block1[4]; + + block1[0] = 0; + block1[1] = 0; + block1[2] = 0; + block1[3] = 0; + + u32x block2[4]; + + block2[0] = 0; + block2[1] = 0; + block2[2] = 0; + block2[3] = 0; + + u32x block3[4]; + + block3[0] = 0; + block3[1] = 0; + block3[2] = 0; + block3[3] = 0; + + for (u32 i = 0, j = loop_pos; i < loop_cnt; i++, j++) + { + block1[0] = 0; + block1[1] = 0; + block1[2] = 0; + block1[3] = 0; + block2[0] = 0; + block2[1] = 0; + block2[2] = 0; + block2[3] = 0; + block3[0] = 0; + block3[1] = 0; + + const u32 j1 = (j & 1) ? 1 : 0; + const u32 j3 = (j % 3) ? 1 : 0; + const u32 j7 = (j % 7) ? 1 : 0; + + if (j1) + { + block0[0] = w0[0]; + block0[1] = w0[1]; + block0[2] = w0[2]; + block0[3] = w0[3]; + + block_len = pw_len; + + if (j3) + { + memcat8 (block0, block1, block2, block3, block_len, salt_buf); + + block_len += salt_len; + } + + if (j7) + { + memcat16 (block0, block1, block2, block3, block_len, w0); + + block_len += pw_len; + } + + memcat16_x80 (block0, block1, block2, block3, block_len, digest); + + block_len += 16; + } + else + { + block0[0] = digest[0]; + block0[1] = digest[1]; + block0[2] = digest[2]; + block0[3] = digest[3]; + + block_len = 16; + + if (j3 && j7) + { + block1[0] = salt_buf[0]; + block1[1] = salt_buf[1]; + + block_len += salt_len; + + memcat16 (block0, block1, block2, block3, block_len, w0); + + block_len += pw_len; + } + else if (j3) + { + block1[0] = salt_buf[0]; + block1[1] = salt_buf[1]; + + block_len += salt_len; + } + else if (j7) + { + block1[0] = w0[0]; + block1[1] = w0[1]; + block1[2] = w0[2]; + block1[3] = w0[3]; + + block_len += pw_len; + } + + memcat16 (block0, block1, block2, block3, block_len, w0_x80); + + block_len += pw_len; + } + + block3[2] = block_len * 8; + + digest[0] = MD5M_A; + digest[1] = MD5M_B; + digest[2] = MD5M_C; + digest[3] = MD5M_D; + + md5_transform (block0, block1, block2, block3, digest); + } + + tmps[gid].digest_buf[0] = digest[0]; + tmps[gid].digest_buf[1] = digest[1]; + tmps[gid].digest_buf[2] = digest[2]; + tmps[gid].digest_buf[3] = digest[3]; +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m00500_comp (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, md5crypt_tmp_t *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + const u32 lid = threadIdx.x; + + /** + * digest + */ + + const u32x r0 = tmps[gid].digest_buf[DGST_R0]; + const u32x r1 = tmps[gid].digest_buf[DGST_R1]; + const u32x r2 = tmps[gid].digest_buf[DGST_R2]; + const u32x r3 = tmps[gid].digest_buf[DGST_R3]; + + #define il_pos 0 + + #include VECT_COMPARE_M +} diff --git a/nv/m00900_a0.cu b/nv/m00900_a0.cu new file mode 100644 index 0000000000..d22f0161d0 --- /dev/null +++ b/nv/m00900_a0.cu @@ -0,0 +1,347 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _MD4_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW2 +#define VECT_SIZE1 +#endif + +#define DGST_R0 0 +#define DGST_R1 3 +#define DGST_R2 2 +#define DGST_R3 1 + +#include "include/kernel_functions.c" +#include "types_nv.c" +#include "common_nv.c" +#include "include/rp_gpu.h" +#include "rp_nv.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +__device__ __constant__ gpu_rule_t c_rules[1024]; + +extern "C" __global__ void __launch_bounds__ (256, 1) m00900_m04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + u32x pw_buf1[4]; + + pw_buf1[0] = pws[gid].i[ 4]; + pw_buf1[1] = pws[gid].i[ 5]; + pw_buf1[2] = pws[gid].i[ 6]; + pw_buf1[3] = pws[gid].i[ 7]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + + w0[0] = pw_buf0[0]; + w0[1] = pw_buf0[1]; + w0[2] = pw_buf0[2]; + w0[3] = pw_buf0[3]; + + u32x w1[4]; + + w1[0] = pw_buf1[0]; + w1[1] = pw_buf1[1]; + w1[2] = pw_buf1[2]; + w1[3] = pw_buf1[3]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 out_len = apply_rules (c_rules[il_pos].cmds, w0, w1, pw_len); + + append_0x80_2 (w0, w1, out_len); + + w3[2] = out_len * 8; + + u32x a = MD4M_A; + u32x b = MD4M_B; + u32x c = MD4M_C; + u32x d = MD4M_D; + + MD4_STEP (MD4_Fo, a, b, c, d, w0[0], MD4C00, MD4S00); + MD4_STEP (MD4_Fo, d, a, b, c, w0[1], MD4C00, MD4S01); + MD4_STEP (MD4_Fo, c, d, a, b, w0[2], MD4C00, MD4S02); + MD4_STEP (MD4_Fo, b, c, d, a, w0[3], MD4C00, MD4S03); + MD4_STEP (MD4_Fo, a, b, c, d, w1[0], MD4C00, MD4S00); + MD4_STEP (MD4_Fo, d, a, b, c, w1[1], MD4C00, MD4S01); + MD4_STEP (MD4_Fo, c, d, a, b, w1[2], MD4C00, MD4S02); + MD4_STEP (MD4_Fo, b, c, d, a, w1[3], MD4C00, MD4S03); + MD4_STEP (MD4_Fo, a, b, c, d, w2[0], MD4C00, MD4S00); + MD4_STEP (MD4_Fo, d, a, b, c, w2[1], MD4C00, MD4S01); + MD4_STEP (MD4_Fo, c, d, a, b, w2[2], MD4C00, MD4S02); + MD4_STEP (MD4_Fo, b, c, d, a, w2[3], MD4C00, MD4S03); + MD4_STEP (MD4_Fo, a, b, c, d, w3[0], MD4C00, MD4S00); + MD4_STEP (MD4_Fo, d, a, b, c, w3[1], MD4C00, MD4S01); + MD4_STEP (MD4_Fo, c, d, a, b, w3[2], MD4C00, MD4S02); + MD4_STEP (MD4_Fo, b, c, d, a, w3[3], MD4C00, MD4S03); + + MD4_STEP (MD4_Go, a, b, c, d, w0[0], MD4C01, MD4S10); + MD4_STEP (MD4_Go, d, a, b, c, w1[0], MD4C01, MD4S11); + MD4_STEP (MD4_Go, c, d, a, b, w2[0], MD4C01, MD4S12); + MD4_STEP (MD4_Go, b, c, d, a, w3[0], MD4C01, MD4S13); + MD4_STEP (MD4_Go, a, b, c, d, w0[1], MD4C01, MD4S10); + MD4_STEP (MD4_Go, d, a, b, c, w1[1], MD4C01, MD4S11); + MD4_STEP (MD4_Go, c, d, a, b, w2[1], MD4C01, MD4S12); + MD4_STEP (MD4_Go, b, c, d, a, w3[1], MD4C01, MD4S13); + MD4_STEP (MD4_Go, a, b, c, d, w0[2], MD4C01, MD4S10); + MD4_STEP (MD4_Go, d, a, b, c, w1[2], MD4C01, MD4S11); + MD4_STEP (MD4_Go, c, d, a, b, w2[2], MD4C01, MD4S12); + MD4_STEP (MD4_Go, b, c, d, a, w3[2], MD4C01, MD4S13); + MD4_STEP (MD4_Go, a, b, c, d, w0[3], MD4C01, MD4S10); + MD4_STEP (MD4_Go, d, a, b, c, w1[3], MD4C01, MD4S11); + MD4_STEP (MD4_Go, c, d, a, b, w2[3], MD4C01, MD4S12); + MD4_STEP (MD4_Go, b, c, d, a, w3[3], MD4C01, MD4S13); + + MD4_STEP (MD4_H , a, b, c, d, w0[0], MD4C02, MD4S20); + MD4_STEP (MD4_H , d, a, b, c, w2[0], MD4C02, MD4S21); + MD4_STEP (MD4_H , c, d, a, b, w1[0], MD4C02, MD4S22); + MD4_STEP (MD4_H , b, c, d, a, w3[0], MD4C02, MD4S23); + MD4_STEP (MD4_H , a, b, c, d, w0[2], MD4C02, MD4S20); + MD4_STEP (MD4_H , d, a, b, c, w2[2], MD4C02, MD4S21); + MD4_STEP (MD4_H , c, d, a, b, w1[2], MD4C02, MD4S22); + MD4_STEP (MD4_H , b, c, d, a, w3[2], MD4C02, MD4S23); + MD4_STEP (MD4_H , a, b, c, d, w0[1], MD4C02, MD4S20); + MD4_STEP (MD4_H , d, a, b, c, w2[1], MD4C02, MD4S21); + MD4_STEP (MD4_H , c, d, a, b, w1[1], MD4C02, MD4S22); + MD4_STEP (MD4_H , b, c, d, a, w3[1], MD4C02, MD4S23); + MD4_STEP (MD4_H , a, b, c, d, w0[3], MD4C02, MD4S20); + MD4_STEP (MD4_H , d, a, b, c, w2[3], MD4C02, MD4S21); + MD4_STEP (MD4_H , c, d, a, b, w1[3], MD4C02, MD4S22); + MD4_STEP (MD4_H , b, c, d, a, w3[3], MD4C02, MD4S23); + + const u32x r0 = a; + const u32x r1 = d; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_M + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m00900_m08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m00900_m16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m00900_s04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + u32x pw_buf1[4]; + + pw_buf1[0] = pws[gid].i[ 4]; + pw_buf1[1] = pws[gid].i[ 5]; + pw_buf1[2] = pws[gid].i[ 6]; + pw_buf1[3] = pws[gid].i[ 7]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + + w0[0] = pw_buf0[0]; + w0[1] = pw_buf0[1]; + w0[2] = pw_buf0[2]; + w0[3] = pw_buf0[3]; + + u32x w1[4]; + + w1[0] = pw_buf1[0]; + w1[1] = pw_buf1[1]; + w1[2] = pw_buf1[2]; + w1[3] = pw_buf1[3]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 out_len = apply_rules (c_rules[il_pos].cmds, w0, w1, pw_len); + + append_0x80_2 (w0, w1, out_len); + + w3[2] = out_len * 8; + + u32x a = MD4M_A; + u32x b = MD4M_B; + u32x c = MD4M_C; + u32x d = MD4M_D; + + MD4_STEP (MD4_Fo, a, b, c, d, w0[0], MD4C00, MD4S00); + MD4_STEP (MD4_Fo, d, a, b, c, w0[1], MD4C00, MD4S01); + MD4_STEP (MD4_Fo, c, d, a, b, w0[2], MD4C00, MD4S02); + MD4_STEP (MD4_Fo, b, c, d, a, w0[3], MD4C00, MD4S03); + MD4_STEP (MD4_Fo, a, b, c, d, w1[0], MD4C00, MD4S00); + MD4_STEP (MD4_Fo, d, a, b, c, w1[1], MD4C00, MD4S01); + MD4_STEP (MD4_Fo, c, d, a, b, w1[2], MD4C00, MD4S02); + MD4_STEP (MD4_Fo, b, c, d, a, w1[3], MD4C00, MD4S03); + MD4_STEP (MD4_Fo, a, b, c, d, w2[0], MD4C00, MD4S00); + MD4_STEP (MD4_Fo, d, a, b, c, w2[1], MD4C00, MD4S01); + MD4_STEP (MD4_Fo, c, d, a, b, w2[2], MD4C00, MD4S02); + MD4_STEP (MD4_Fo, b, c, d, a, w2[3], MD4C00, MD4S03); + MD4_STEP (MD4_Fo, a, b, c, d, w3[0], MD4C00, MD4S00); + MD4_STEP (MD4_Fo, d, a, b, c, w3[1], MD4C00, MD4S01); + MD4_STEP (MD4_Fo, c, d, a, b, w3[2], MD4C00, MD4S02); + MD4_STEP (MD4_Fo, b, c, d, a, w3[3], MD4C00, MD4S03); + + MD4_STEP (MD4_Go, a, b, c, d, w0[0], MD4C01, MD4S10); + MD4_STEP (MD4_Go, d, a, b, c, w1[0], MD4C01, MD4S11); + MD4_STEP (MD4_Go, c, d, a, b, w2[0], MD4C01, MD4S12); + MD4_STEP (MD4_Go, b, c, d, a, w3[0], MD4C01, MD4S13); + MD4_STEP (MD4_Go, a, b, c, d, w0[1], MD4C01, MD4S10); + MD4_STEP (MD4_Go, d, a, b, c, w1[1], MD4C01, MD4S11); + MD4_STEP (MD4_Go, c, d, a, b, w2[1], MD4C01, MD4S12); + MD4_STEP (MD4_Go, b, c, d, a, w3[1], MD4C01, MD4S13); + MD4_STEP (MD4_Go, a, b, c, d, w0[2], MD4C01, MD4S10); + MD4_STEP (MD4_Go, d, a, b, c, w1[2], MD4C01, MD4S11); + MD4_STEP (MD4_Go, c, d, a, b, w2[2], MD4C01, MD4S12); + MD4_STEP (MD4_Go, b, c, d, a, w3[2], MD4C01, MD4S13); + MD4_STEP (MD4_Go, a, b, c, d, w0[3], MD4C01, MD4S10); + MD4_STEP (MD4_Go, d, a, b, c, w1[3], MD4C01, MD4S11); + MD4_STEP (MD4_Go, c, d, a, b, w2[3], MD4C01, MD4S12); + MD4_STEP (MD4_Go, b, c, d, a, w3[3], MD4C01, MD4S13); + + MD4_STEP (MD4_H , a, b, c, d, w0[0], MD4C02, MD4S20); + MD4_STEP (MD4_H , d, a, b, c, w2[0], MD4C02, MD4S21); + MD4_STEP (MD4_H , c, d, a, b, w1[0], MD4C02, MD4S22); + MD4_STEP (MD4_H , b, c, d, a, w3[0], MD4C02, MD4S23); + MD4_STEP (MD4_H , a, b, c, d, w0[2], MD4C02, MD4S20); + MD4_STEP (MD4_H , d, a, b, c, w2[2], MD4C02, MD4S21); + MD4_STEP (MD4_H , c, d, a, b, w1[2], MD4C02, MD4S22); + MD4_STEP (MD4_H , b, c, d, a, w3[2], MD4C02, MD4S23); + MD4_STEP (MD4_H , a, b, c, d, w0[1], MD4C02, MD4S20); + MD4_STEP (MD4_H , d, a, b, c, w2[1], MD4C02, MD4S21); + MD4_STEP (MD4_H , c, d, a, b, w1[1], MD4C02, MD4S22); + MD4_STEP (MD4_H , b, c, d, a, w3[1], MD4C02, MD4S23); + MD4_STEP (MD4_H , a, b, c, d, w0[3], MD4C02, MD4S20); + MD4_STEP (MD4_H , d, a, b, c, w2[3], MD4C02, MD4S21); + MD4_STEP (MD4_H , c, d, a, b, w1[3], MD4C02, MD4S22); + MD4_STEP (MD4_H , b, c, d, a, w3[3], MD4C02, MD4S23); + + const u32x r0 = a; + const u32x r1 = d; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_S + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m00900_s08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m00900_s16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/nv/m00900_a1.cu b/nv/m00900_a1.cu new file mode 100644 index 0000000000..f568544b46 --- /dev/null +++ b/nv/m00900_a1.cu @@ -0,0 +1,449 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _MD4_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW2 +#define VECT_SIZE4 +#endif + +#define DGST_R0 0 +#define DGST_R1 3 +#define DGST_R2 2 +#define DGST_R3 1 + +#include "include/kernel_functions.c" +#include "types_nv.c" +#include "common_nv.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +__device__ __constant__ comb_t c_combs[1024]; + +extern "C" __global__ void __launch_bounds__ (256, 1) m00900_m04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + append_0x80_2 (wordl0, wordl1, pw_l_len); + + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, c_combs[0].pw_len); + } + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = c_combs[il_pos].pw_len; + + const u32 pw_len = pw_l_len + pw_r_len; + + u32 wordr0[4]; + + wordr0[0] = c_combs[il_pos].i[0]; + wordr0[1] = c_combs[il_pos].i[1]; + wordr0[2] = c_combs[il_pos].i[2]; + wordr0[3] = c_combs[il_pos].i[3]; + + u32 wordr1[4]; + + wordr1[0] = c_combs[il_pos].i[4]; + wordr1[1] = c_combs[il_pos].i[5]; + wordr1[2] = c_combs[il_pos].i[6]; + wordr1[3] = c_combs[il_pos].i[7]; + + u32 wordr2[4]; + + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + + u32 wordr3[4]; + + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + u32x w0[4]; + + w0[0] = wordl0[0] | wordr0[0]; + w0[1] = wordl0[1] | wordr0[1]; + w0[2] = wordl0[2] | wordr0[2]; + w0[3] = wordl0[3] | wordr0[3]; + + u32x w1[4]; + + w1[0] = wordl1[0] | wordr1[0]; + w1[1] = wordl1[1] | wordr1[1]; + w1[2] = wordl1[2] | wordr1[2]; + w1[3] = wordl1[3] | wordr1[3]; + + u32x w2[4]; + + w2[0] = wordl2[0] | wordr2[0]; + w2[1] = wordl2[1] | wordr2[1]; + w2[2] = wordl2[2] | wordr2[2]; + w2[3] = wordl2[3] | wordr2[3]; + + u32x w3[4]; + + w3[0] = wordl3[0] | wordr3[0]; + w3[1] = wordl3[1] | wordr3[1]; + w3[2] = pw_len * 8; + w3[3] = 0; + + u32x a = MD4M_A; + u32x b = MD4M_B; + u32x c = MD4M_C; + u32x d = MD4M_D; + + MD4_STEP (MD4_Fo, a, b, c, d, w0[0], MD4C00, MD4S00); + MD4_STEP (MD4_Fo, d, a, b, c, w0[1], MD4C00, MD4S01); + MD4_STEP (MD4_Fo, c, d, a, b, w0[2], MD4C00, MD4S02); + MD4_STEP (MD4_Fo, b, c, d, a, w0[3], MD4C00, MD4S03); + MD4_STEP (MD4_Fo, a, b, c, d, w1[0], MD4C00, MD4S00); + MD4_STEP (MD4_Fo, d, a, b, c, w1[1], MD4C00, MD4S01); + MD4_STEP (MD4_Fo, c, d, a, b, w1[2], MD4C00, MD4S02); + MD4_STEP (MD4_Fo, b, c, d, a, w1[3], MD4C00, MD4S03); + MD4_STEP (MD4_Fo, a, b, c, d, w2[0], MD4C00, MD4S00); + MD4_STEP (MD4_Fo, d, a, b, c, w2[1], MD4C00, MD4S01); + MD4_STEP (MD4_Fo, c, d, a, b, w2[2], MD4C00, MD4S02); + MD4_STEP (MD4_Fo, b, c, d, a, w2[3], MD4C00, MD4S03); + MD4_STEP (MD4_Fo, a, b, c, d, w3[0], MD4C00, MD4S00); + MD4_STEP (MD4_Fo, d, a, b, c, w3[1], MD4C00, MD4S01); + MD4_STEP (MD4_Fo, c, d, a, b, w3[2], MD4C00, MD4S02); + MD4_STEP (MD4_Fo, b, c, d, a, w3[3], MD4C00, MD4S03); + + MD4_STEP (MD4_Go, a, b, c, d, w0[0], MD4C01, MD4S10); + MD4_STEP (MD4_Go, d, a, b, c, w1[0], MD4C01, MD4S11); + MD4_STEP (MD4_Go, c, d, a, b, w2[0], MD4C01, MD4S12); + MD4_STEP (MD4_Go, b, c, d, a, w3[0], MD4C01, MD4S13); + MD4_STEP (MD4_Go, a, b, c, d, w0[1], MD4C01, MD4S10); + MD4_STEP (MD4_Go, d, a, b, c, w1[1], MD4C01, MD4S11); + MD4_STEP (MD4_Go, c, d, a, b, w2[1], MD4C01, MD4S12); + MD4_STEP (MD4_Go, b, c, d, a, w3[1], MD4C01, MD4S13); + MD4_STEP (MD4_Go, a, b, c, d, w0[2], MD4C01, MD4S10); + MD4_STEP (MD4_Go, d, a, b, c, w1[2], MD4C01, MD4S11); + MD4_STEP (MD4_Go, c, d, a, b, w2[2], MD4C01, MD4S12); + MD4_STEP (MD4_Go, b, c, d, a, w3[2], MD4C01, MD4S13); + MD4_STEP (MD4_Go, a, b, c, d, w0[3], MD4C01, MD4S10); + MD4_STEP (MD4_Go, d, a, b, c, w1[3], MD4C01, MD4S11); + MD4_STEP (MD4_Go, c, d, a, b, w2[3], MD4C01, MD4S12); + MD4_STEP (MD4_Go, b, c, d, a, w3[3], MD4C01, MD4S13); + + MD4_STEP (MD4_H , a, b, c, d, w0[0], MD4C02, MD4S20); + MD4_STEP (MD4_H , d, a, b, c, w2[0], MD4C02, MD4S21); + MD4_STEP (MD4_H , c, d, a, b, w1[0], MD4C02, MD4S22); + MD4_STEP (MD4_H , b, c, d, a, w3[0], MD4C02, MD4S23); + MD4_STEP (MD4_H , a, b, c, d, w0[2], MD4C02, MD4S20); + MD4_STEP (MD4_H , d, a, b, c, w2[2], MD4C02, MD4S21); + MD4_STEP (MD4_H , c, d, a, b, w1[2], MD4C02, MD4S22); + MD4_STEP (MD4_H , b, c, d, a, w3[2], MD4C02, MD4S23); + MD4_STEP (MD4_H , a, b, c, d, w0[1], MD4C02, MD4S20); + MD4_STEP (MD4_H , d, a, b, c, w2[1], MD4C02, MD4S21); + MD4_STEP (MD4_H , c, d, a, b, w1[1], MD4C02, MD4S22); + MD4_STEP (MD4_H , b, c, d, a, w3[1], MD4C02, MD4S23); + MD4_STEP (MD4_H , a, b, c, d, w0[3], MD4C02, MD4S20); + MD4_STEP (MD4_H , d, a, b, c, w2[3], MD4C02, MD4S21); + MD4_STEP (MD4_H , c, d, a, b, w1[3], MD4C02, MD4S22); + MD4_STEP (MD4_H , b, c, d, a, w3[3], MD4C02, MD4S23); + + const u32x r0 = a; + const u32x r1 = d; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_M + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m00900_m08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m00900_m16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m00900_s04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + append_0x80_2 (wordl0, wordl1, pw_l_len); + + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, c_combs[0].pw_len); + } + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = c_combs[il_pos].pw_len; + + const u32 pw_len = pw_l_len + pw_r_len; + + u32 wordr0[4]; + + wordr0[0] = c_combs[il_pos].i[0]; + wordr0[1] = c_combs[il_pos].i[1]; + wordr0[2] = c_combs[il_pos].i[2]; + wordr0[3] = c_combs[il_pos].i[3]; + + u32 wordr1[4]; + + wordr1[0] = c_combs[il_pos].i[4]; + wordr1[1] = c_combs[il_pos].i[5]; + wordr1[2] = c_combs[il_pos].i[6]; + wordr1[3] = c_combs[il_pos].i[7]; + + u32 wordr2[4]; + + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + + u32 wordr3[4]; + + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + u32x w0[4]; + + w0[0] = wordl0[0] | wordr0[0]; + w0[1] = wordl0[1] | wordr0[1]; + w0[2] = wordl0[2] | wordr0[2]; + w0[3] = wordl0[3] | wordr0[3]; + + u32x w1[4]; + + w1[0] = wordl1[0] | wordr1[0]; + w1[1] = wordl1[1] | wordr1[1]; + w1[2] = wordl1[2] | wordr1[2]; + w1[3] = wordl1[3] | wordr1[3]; + + u32x w2[4]; + + w2[0] = wordl2[0] | wordr2[0]; + w2[1] = wordl2[1] | wordr2[1]; + w2[2] = wordl2[2] | wordr2[2]; + w2[3] = wordl2[3] | wordr2[3]; + + u32x w3[4]; + + w3[0] = wordl3[0] | wordr3[0]; + w3[1] = wordl3[1] | wordr3[1]; + w3[2] = pw_len * 8; + w3[3] = 0; + + u32x a = MD4M_A; + u32x b = MD4M_B; + u32x c = MD4M_C; + u32x d = MD4M_D; + + MD4_STEP (MD4_Fo, a, b, c, d, w0[0], MD4C00, MD4S00); + MD4_STEP (MD4_Fo, d, a, b, c, w0[1], MD4C00, MD4S01); + MD4_STEP (MD4_Fo, c, d, a, b, w0[2], MD4C00, MD4S02); + MD4_STEP (MD4_Fo, b, c, d, a, w0[3], MD4C00, MD4S03); + MD4_STEP (MD4_Fo, a, b, c, d, w1[0], MD4C00, MD4S00); + MD4_STEP (MD4_Fo, d, a, b, c, w1[1], MD4C00, MD4S01); + MD4_STEP (MD4_Fo, c, d, a, b, w1[2], MD4C00, MD4S02); + MD4_STEP (MD4_Fo, b, c, d, a, w1[3], MD4C00, MD4S03); + MD4_STEP (MD4_Fo, a, b, c, d, w2[0], MD4C00, MD4S00); + MD4_STEP (MD4_Fo, d, a, b, c, w2[1], MD4C00, MD4S01); + MD4_STEP (MD4_Fo, c, d, a, b, w2[2], MD4C00, MD4S02); + MD4_STEP (MD4_Fo, b, c, d, a, w2[3], MD4C00, MD4S03); + MD4_STEP (MD4_Fo, a, b, c, d, w3[0], MD4C00, MD4S00); + MD4_STEP (MD4_Fo, d, a, b, c, w3[1], MD4C00, MD4S01); + MD4_STEP (MD4_Fo, c, d, a, b, w3[2], MD4C00, MD4S02); + MD4_STEP (MD4_Fo, b, c, d, a, w3[3], MD4C00, MD4S03); + + MD4_STEP (MD4_Go, a, b, c, d, w0[0], MD4C01, MD4S10); + MD4_STEP (MD4_Go, d, a, b, c, w1[0], MD4C01, MD4S11); + MD4_STEP (MD4_Go, c, d, a, b, w2[0], MD4C01, MD4S12); + MD4_STEP (MD4_Go, b, c, d, a, w3[0], MD4C01, MD4S13); + MD4_STEP (MD4_Go, a, b, c, d, w0[1], MD4C01, MD4S10); + MD4_STEP (MD4_Go, d, a, b, c, w1[1], MD4C01, MD4S11); + MD4_STEP (MD4_Go, c, d, a, b, w2[1], MD4C01, MD4S12); + MD4_STEP (MD4_Go, b, c, d, a, w3[1], MD4C01, MD4S13); + MD4_STEP (MD4_Go, a, b, c, d, w0[2], MD4C01, MD4S10); + MD4_STEP (MD4_Go, d, a, b, c, w1[2], MD4C01, MD4S11); + MD4_STEP (MD4_Go, c, d, a, b, w2[2], MD4C01, MD4S12); + MD4_STEP (MD4_Go, b, c, d, a, w3[2], MD4C01, MD4S13); + MD4_STEP (MD4_Go, a, b, c, d, w0[3], MD4C01, MD4S10); + MD4_STEP (MD4_Go, d, a, b, c, w1[3], MD4C01, MD4S11); + MD4_STEP (MD4_Go, c, d, a, b, w2[3], MD4C01, MD4S12); + MD4_STEP (MD4_Go, b, c, d, a, w3[3], MD4C01, MD4S13); + + MD4_STEP (MD4_H , a, b, c, d, w0[0], MD4C02, MD4S20); + MD4_STEP (MD4_H , d, a, b, c, w2[0], MD4C02, MD4S21); + MD4_STEP (MD4_H , c, d, a, b, w1[0], MD4C02, MD4S22); + MD4_STEP (MD4_H , b, c, d, a, w3[0], MD4C02, MD4S23); + MD4_STEP (MD4_H , a, b, c, d, w0[2], MD4C02, MD4S20); + MD4_STEP (MD4_H , d, a, b, c, w2[2], MD4C02, MD4S21); + MD4_STEP (MD4_H , c, d, a, b, w1[2], MD4C02, MD4S22); + MD4_STEP (MD4_H , b, c, d, a, w3[2], MD4C02, MD4S23); + MD4_STEP (MD4_H , a, b, c, d, w0[1], MD4C02, MD4S20); + MD4_STEP (MD4_H , d, a, b, c, w2[1], MD4C02, MD4S21); + MD4_STEP (MD4_H , c, d, a, b, w1[1], MD4C02, MD4S22); + MD4_STEP (MD4_H , b, c, d, a, w3[1], MD4C02, MD4S23); + MD4_STEP (MD4_H , a, b, c, d, w0[3], MD4C02, MD4S20); + MD4_STEP (MD4_H , d, a, b, c, w2[3], MD4C02, MD4S21); + MD4_STEP (MD4_H , c, d, a, b, w1[3], MD4C02, MD4S22); + MD4_STEP (MD4_H , b, c, d, a, w3[3], MD4C02, MD4S23); + + const u32x r0 = a; + const u32x r1 = d; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_S + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m00900_s08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m00900_s16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/nv/m00900_a3.cu b/nv/m00900_a3.cu new file mode 100644 index 0000000000..19b31930ec --- /dev/null +++ b/nv/m00900_a3.cu @@ -0,0 +1,630 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _MD4_ +#define _SCALAR_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW2 +#define VECT_SIZE4 +#endif + +#define DGST_R0 0 +#define DGST_R1 3 +#define DGST_R2 2 +#define DGST_R3 1 + +#include "include/kernel_functions.c" +#include "types_nv.c" +#include "common_nv.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4_warp.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4_warp.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4_warp.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4_warp.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4_warp.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4_warp.c" +#endif + +#define MD4_STEP_REV(f,a,b,c,d,x,t,s) \ +{ \ + a = rotr32 (a, s); \ + a -= f (b, c, d); \ + a -= x; \ + a -= t; \ +} + +#define MD4_STEP_REV1(f,a,b,c,d,x,t,s) \ +{ \ + a = rotr32 (a, s); \ + a -= x; \ + a -= t; \ +} + +__device__ __constant__ u32x c_bfs[1024]; + +__device__ static void m00900m (u32 w[16], const u32 pw_len, const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const u32x * words_buf_r, void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset) +{ + /** + * modifier + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 F_w0c00 = 0 + MD4C00; + const u32 F_w1c00 = w[ 1] + MD4C00; + const u32 F_w2c00 = w[ 2] + MD4C00; + const u32 F_w3c00 = w[ 3] + MD4C00; + const u32 F_w4c00 = w[ 4] + MD4C00; + const u32 F_w5c00 = w[ 5] + MD4C00; + const u32 F_w6c00 = w[ 6] + MD4C00; + const u32 F_w7c00 = w[ 7] + MD4C00; + const u32 F_w8c00 = w[ 8] + MD4C00; + const u32 F_w9c00 = w[ 9] + MD4C00; + const u32 F_wac00 = w[10] + MD4C00; + const u32 F_wbc00 = w[11] + MD4C00; + const u32 F_wcc00 = w[12] + MD4C00; + const u32 F_wdc00 = w[13] + MD4C00; + const u32 F_wec00 = w[14] + MD4C00; + const u32 F_wfc00 = w[15] + MD4C00; + + const u32 G_w0c01 = 0 + MD4C01; + const u32 G_w4c01 = w[ 4] + MD4C01; + const u32 G_w8c01 = w[ 8] + MD4C01; + const u32 G_wcc01 = w[12] + MD4C01; + const u32 G_w1c01 = w[ 1] + MD4C01; + const u32 G_w5c01 = w[ 5] + MD4C01; + const u32 G_w9c01 = w[ 9] + MD4C01; + const u32 G_wdc01 = w[13] + MD4C01; + const u32 G_w2c01 = w[ 2] + MD4C01; + const u32 G_w6c01 = w[ 6] + MD4C01; + const u32 G_wac01 = w[10] + MD4C01; + const u32 G_wec01 = w[14] + MD4C01; + const u32 G_w3c01 = w[ 3] + MD4C01; + const u32 G_w7c01 = w[ 7] + MD4C01; + const u32 G_wbc01 = w[11] + MD4C01; + const u32 G_wfc01 = w[15] + MD4C01; + + const u32 H_w0c02 = 0 + MD4C02; + const u32 H_w8c02 = w[ 8] + MD4C02; + const u32 H_w4c02 = w[ 4] + MD4C02; + const u32 H_wcc02 = w[12] + MD4C02; + const u32 H_w2c02 = w[ 2] + MD4C02; + const u32 H_wac02 = w[10] + MD4C02; + const u32 H_w6c02 = w[ 6] + MD4C02; + const u32 H_wec02 = w[14] + MD4C02; + const u32 H_w1c02 = w[ 1] + MD4C02; + const u32 H_w9c02 = w[ 9] + MD4C02; + const u32 H_w5c02 = w[ 5] + MD4C02; + const u32 H_wdc02 = w[13] + MD4C02; + const u32 H_w3c02 = w[ 3] + MD4C02; + const u32 H_wbc02 = w[11] + MD4C02; + const u32 H_w7c02 = w[ 7] + MD4C02; + const u32 H_wfc02 = w[15] + MD4C02; + + /** + * loop + */ + + const u32 bf_loops = ceil ((float) bfs_cnt / VECT_DIV); + + u32x w0l = w[0]; + + for (u32 il_pos = 0; il_pos < bf_loops; il_pos++) + { + const u32x w0r = c_bfs[il_pos]; + + const u32x w0 = w0l | w0r; + + u32x a = MD4M_A; + u32x b = MD4M_B; + u32x c = MD4M_C; + u32x d = MD4M_D; + + MD4_STEP (MD4_Fo, a, b, c, d, w0, F_w0c00, MD4S00); + MD4_STEP0(MD4_Fo, d, a, b, c, F_w1c00, MD4S01); + MD4_STEP0(MD4_Fo, c, d, a, b, F_w2c00, MD4S02); + MD4_STEP0(MD4_Fo, b, c, d, a, F_w3c00, MD4S03); + MD4_STEP0(MD4_Fo, a, b, c, d, F_w4c00, MD4S00); + MD4_STEP0(MD4_Fo, d, a, b, c, F_w5c00, MD4S01); + MD4_STEP0(MD4_Fo, c, d, a, b, F_w6c00, MD4S02); + MD4_STEP0(MD4_Fo, b, c, d, a, F_w7c00, MD4S03); + MD4_STEP0(MD4_Fo, a, b, c, d, F_w8c00, MD4S00); + MD4_STEP0(MD4_Fo, d, a, b, c, F_w9c00, MD4S01); + MD4_STEP0(MD4_Fo, c, d, a, b, F_wac00, MD4S02); + MD4_STEP0(MD4_Fo, b, c, d, a, F_wbc00, MD4S03); + MD4_STEP0(MD4_Fo, a, b, c, d, F_wcc00, MD4S00); + MD4_STEP0(MD4_Fo, d, a, b, c, F_wdc00, MD4S01); + MD4_STEP0(MD4_Fo, c, d, a, b, F_wec00, MD4S02); + MD4_STEP0(MD4_Fo, b, c, d, a, F_wfc00, MD4S03); + + MD4_STEP (MD4_Go, a, b, c, d, w0, G_w0c01, MD4S10); + MD4_STEP0(MD4_Go, d, a, b, c, G_w4c01, MD4S11); + MD4_STEP0(MD4_Go, c, d, a, b, G_w8c01, MD4S12); + MD4_STEP0(MD4_Go, b, c, d, a, G_wcc01, MD4S13); + MD4_STEP0(MD4_Go, a, b, c, d, G_w1c01, MD4S10); + MD4_STEP0(MD4_Go, d, a, b, c, G_w5c01, MD4S11); + MD4_STEP0(MD4_Go, c, d, a, b, G_w9c01, MD4S12); + MD4_STEP0(MD4_Go, b, c, d, a, G_wdc01, MD4S13); + MD4_STEP0(MD4_Go, a, b, c, d, G_w2c01, MD4S10); + MD4_STEP0(MD4_Go, d, a, b, c, G_w6c01, MD4S11); + MD4_STEP0(MD4_Go, c, d, a, b, G_wac01, MD4S12); + MD4_STEP0(MD4_Go, b, c, d, a, G_wec01, MD4S13); + MD4_STEP0(MD4_Go, a, b, c, d, G_w3c01, MD4S10); + MD4_STEP0(MD4_Go, d, a, b, c, G_w7c01, MD4S11); + MD4_STEP0(MD4_Go, c, d, a, b, G_wbc01, MD4S12); + MD4_STEP0(MD4_Go, b, c, d, a, G_wfc01, MD4S13); + + MD4_STEP (MD4_H , a, b, c, d, w0, H_w0c02, MD4S20); + MD4_STEP0(MD4_H , d, a, b, c, H_w8c02, MD4S21); + MD4_STEP0(MD4_H , c, d, a, b, H_w4c02, MD4S22); + MD4_STEP0(MD4_H , b, c, d, a, H_wcc02, MD4S23); + MD4_STEP0(MD4_H , a, b, c, d, H_w2c02, MD4S20); + MD4_STEP0(MD4_H , d, a, b, c, H_wac02, MD4S21); + MD4_STEP0(MD4_H , c, d, a, b, H_w6c02, MD4S22); + MD4_STEP0(MD4_H , b, c, d, a, H_wec02, MD4S23); + MD4_STEP0(MD4_H , a, b, c, d, H_w1c02, MD4S20); + MD4_STEP0(MD4_H , d, a, b, c, H_w9c02, MD4S21); + MD4_STEP0(MD4_H , c, d, a, b, H_w5c02, MD4S22); + MD4_STEP0(MD4_H , b, c, d, a, H_wdc02, MD4S23); + MD4_STEP0(MD4_H , a, b, c, d, H_w3c02, MD4S20); + MD4_STEP0(MD4_H , d, a, b, c, H_wbc02, MD4S21); + MD4_STEP0(MD4_H , c, d, a, b, H_w7c02, MD4S22); + MD4_STEP0(MD4_H , b, c, d, a, H_wfc02, MD4S23); + + const u32x r0 = a; + const u32x r1 = d; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_M + } +} + +__device__ static void m00900s (u32 w[16], const u32 pw_len, const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const u32x * words_buf_r, void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset) +{ + /** + * modifier + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 F_w0c00 = 0 + MD4C00; + const u32 F_w1c00 = w[ 1] + MD4C00; + const u32 F_w2c00 = w[ 2] + MD4C00; + const u32 F_w3c00 = w[ 3] + MD4C00; + const u32 F_w4c00 = w[ 4] + MD4C00; + const u32 F_w5c00 = w[ 5] + MD4C00; + const u32 F_w6c00 = w[ 6] + MD4C00; + const u32 F_w7c00 = w[ 7] + MD4C00; + const u32 F_w8c00 = w[ 8] + MD4C00; + const u32 F_w9c00 = w[ 9] + MD4C00; + const u32 F_wac00 = w[10] + MD4C00; + const u32 F_wbc00 = w[11] + MD4C00; + const u32 F_wcc00 = w[12] + MD4C00; + const u32 F_wdc00 = w[13] + MD4C00; + const u32 F_wec00 = w[14] + MD4C00; + const u32 F_wfc00 = w[15] + MD4C00; + + const u32 G_w0c01 = 0 + MD4C01; + const u32 G_w4c01 = w[ 4] + MD4C01; + const u32 G_w8c01 = w[ 8] + MD4C01; + const u32 G_wcc01 = w[12] + MD4C01; + const u32 G_w1c01 = w[ 1] + MD4C01; + const u32 G_w5c01 = w[ 5] + MD4C01; + const u32 G_w9c01 = w[ 9] + MD4C01; + const u32 G_wdc01 = w[13] + MD4C01; + const u32 G_w2c01 = w[ 2] + MD4C01; + const u32 G_w6c01 = w[ 6] + MD4C01; + const u32 G_wac01 = w[10] + MD4C01; + const u32 G_wec01 = w[14] + MD4C01; + const u32 G_w3c01 = w[ 3] + MD4C01; + const u32 G_w7c01 = w[ 7] + MD4C01; + const u32 G_wbc01 = w[11] + MD4C01; + const u32 G_wfc01 = w[15] + MD4C01; + + const u32 H_w0c02 = 0 + MD4C02; + const u32 H_w8c02 = w[ 8] + MD4C02; + const u32 H_w4c02 = w[ 4] + MD4C02; + const u32 H_wcc02 = w[12] + MD4C02; + const u32 H_w2c02 = w[ 2] + MD4C02; + const u32 H_wac02 = w[10] + MD4C02; + const u32 H_w6c02 = w[ 6] + MD4C02; + const u32 H_wec02 = w[14] + MD4C02; + const u32 H_w1c02 = w[ 1] + MD4C02; + const u32 H_w9c02 = w[ 9] + MD4C02; + const u32 H_w5c02 = w[ 5] + MD4C02; + const u32 H_wdc02 = w[13] + MD4C02; + const u32 H_w3c02 = w[ 3] + MD4C02; + const u32 H_wbc02 = w[11] + MD4C02; + const u32 H_w7c02 = w[ 7] + MD4C02; + const u32 H_wfc02 = w[15] + MD4C02; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * reverse + */ + + u32 a_rev = digests_buf[digests_offset].digest_buf[0]; + u32 b_rev = digests_buf[digests_offset].digest_buf[1]; + u32 c_rev = digests_buf[digests_offset].digest_buf[2]; + u32 d_rev = digests_buf[digests_offset].digest_buf[3]; + + MD4_STEP_REV (MD4_H, b_rev, c_rev, d_rev, a_rev, w[15], MD4C02, MD4S23); + MD4_STEP_REV (MD4_H, c_rev, d_rev, a_rev, b_rev, w[ 7], MD4C02, MD4S22); + MD4_STEP_REV (MD4_H, d_rev, a_rev, b_rev, c_rev, w[11], MD4C02, MD4S21); + MD4_STEP_REV (MD4_H, a_rev, b_rev, c_rev, d_rev, w[ 3], MD4C02, MD4S20); + MD4_STEP_REV (MD4_H, b_rev, c_rev, d_rev, a_rev, w[13], MD4C02, MD4S23); + MD4_STEP_REV (MD4_H, c_rev, d_rev, a_rev, b_rev, w[ 5], MD4C02, MD4S22); + MD4_STEP_REV (MD4_H, d_rev, a_rev, b_rev, c_rev, w[ 9], MD4C02, MD4S21); + MD4_STEP_REV (MD4_H, a_rev, b_rev, c_rev, d_rev, w[ 1], MD4C02, MD4S20); + MD4_STEP_REV (MD4_H, b_rev, c_rev, d_rev, a_rev, w[14], MD4C02, MD4S23); + MD4_STEP_REV (MD4_H, c_rev, d_rev, a_rev, b_rev, w[ 6], MD4C02, MD4S22); + MD4_STEP_REV (MD4_H, d_rev, a_rev, b_rev, c_rev, w[10], MD4C02, MD4S21); + MD4_STEP_REV (MD4_H, a_rev, b_rev, c_rev, d_rev, w[ 2], MD4C02, MD4S20); + MD4_STEP_REV (MD4_H, b_rev, c_rev, d_rev, a_rev, w[12], MD4C02, MD4S23); + MD4_STEP_REV (MD4_H, c_rev, d_rev, a_rev, b_rev, w[ 4], MD4C02, MD4S22); + MD4_STEP_REV (MD4_H, d_rev, a_rev, b_rev, c_rev, w[ 8], MD4C02, MD4S21); + MD4_STEP_REV (MD4_H, a_rev, b_rev, c_rev, d_rev, 0, MD4C02, MD4S20); + + const u32x sav_c = c_rev; + const u32x sav_d = d_rev; + + MD4_STEP_REV1(MD4_G, b_rev, c_rev, d_rev, a_rev, w[15], MD4C01, MD4S13); + MD4_STEP_REV1(MD4_G, c_rev, d_rev, a_rev, b_rev, w[11], MD4C01, MD4S12); + + /** + * loop + */ + + const u32 bf_loops = ceil ((float) bfs_cnt / VECT_DIV); + + u32x w0l = w[0]; + + for (u32 il_pos = 0; il_pos < bf_loops; il_pos++) + { + const u32x w0r = c_bfs[il_pos]; + + const u32x w0 = w0l | w0r; + + u32x pre_a = a_rev; + u32x pre_b = b_rev; + u32x pre_c = c_rev; + + pre_a = pre_a - w0; + pre_b = pre_b - MD4_G (sav_c, sav_d, pre_a); + pre_c = pre_c - MD4_G (sav_d, pre_a, pre_b); + + u32x a = MD4M_A; + u32x b = MD4M_B; + u32x c = MD4M_C; + u32x d = MD4M_D; + + MD4_STEP (MD4_Fo, a, b, c, d, w0, F_w0c00, MD4S00); + MD4_STEP0(MD4_Fo, d, a, b, c, F_w1c00, MD4S01); + MD4_STEP0(MD4_Fo, c, d, a, b, F_w2c00, MD4S02); + MD4_STEP0(MD4_Fo, b, c, d, a, F_w3c00, MD4S03); + MD4_STEP0(MD4_Fo, a, b, c, d, F_w4c00, MD4S00); + MD4_STEP0(MD4_Fo, d, a, b, c, F_w5c00, MD4S01); + MD4_STEP0(MD4_Fo, c, d, a, b, F_w6c00, MD4S02); + MD4_STEP0(MD4_Fo, b, c, d, a, F_w7c00, MD4S03); + MD4_STEP0(MD4_Fo, a, b, c, d, F_w8c00, MD4S00); + MD4_STEP0(MD4_Fo, d, a, b, c, F_w9c00, MD4S01); + MD4_STEP0(MD4_Fo, c, d, a, b, F_wac00, MD4S02); + MD4_STEP0(MD4_Fo, b, c, d, a, F_wbc00, MD4S03); + MD4_STEP0(MD4_Fo, a, b, c, d, F_wcc00, MD4S00); + MD4_STEP0(MD4_Fo, d, a, b, c, F_wdc00, MD4S01); + MD4_STEP0(MD4_Fo, c, d, a, b, F_wec00, MD4S02); + MD4_STEP0(MD4_Fo, b, c, d, a, F_wfc00, MD4S03); + + MD4_STEP (MD4_Go, a, b, c, d, w0, G_w0c01, MD4S10); + MD4_STEP0(MD4_Go, d, a, b, c, G_w4c01, MD4S11); + MD4_STEP0(MD4_Go, c, d, a, b, G_w8c01, MD4S12); + MD4_STEP0(MD4_Go, b, c, d, a, G_wcc01, MD4S13); + MD4_STEP0(MD4_Go, a, b, c, d, G_w1c01, MD4S10); + MD4_STEP0(MD4_Go, d, a, b, c, G_w5c01, MD4S11); + MD4_STEP0(MD4_Go, c, d, a, b, G_w9c01, MD4S12); + MD4_STEP0(MD4_Go, b, c, d, a, G_wdc01, MD4S13); + MD4_STEP0(MD4_Go, a, b, c, d, G_w2c01, MD4S10); + MD4_STEP0(MD4_Go, d, a, b, c, G_w6c01, MD4S11); + MD4_STEP0(MD4_Go, c, d, a, b, G_wac01, MD4S12); + + bool q_cond = (pre_c != c); + + if (q_cond) continue; + + MD4_STEP0(MD4_Go, b, c, d, a, G_wec01, MD4S13); + MD4_STEP0(MD4_Go, a, b, c, d, G_w3c01, MD4S10); + MD4_STEP0(MD4_Go, d, a, b, c, G_w7c01, MD4S11); + MD4_STEP0(MD4_Go, c, d, a, b, G_wbc01, MD4S12); + MD4_STEP0(MD4_Go, b, c, d, a, G_wfc01, MD4S13); + + MD4_STEP (MD4_H , a, b, c, d, w0, H_w0c02, MD4S20); + MD4_STEP0(MD4_H , d, a, b, c, H_w8c02, MD4S21); + MD4_STEP0(MD4_H , c, d, a, b, H_w4c02, MD4S22); + MD4_STEP0(MD4_H , b, c, d, a, H_wcc02, MD4S23); + MD4_STEP0(MD4_H , a, b, c, d, H_w2c02, MD4S20); + MD4_STEP0(MD4_H , d, a, b, c, H_wac02, MD4S21); + MD4_STEP0(MD4_H , c, d, a, b, H_w6c02, MD4S22); + MD4_STEP0(MD4_H , b, c, d, a, H_wec02, MD4S23); + MD4_STEP0(MD4_H , a, b, c, d, H_w1c02, MD4S20); + MD4_STEP0(MD4_H , d, a, b, c, H_w9c02, MD4S21); + MD4_STEP0(MD4_H , c, d, a, b, H_w5c02, MD4S22); + MD4_STEP0(MD4_H , b, c, d, a, H_wdc02, MD4S23); + MD4_STEP0(MD4_H , a, b, c, d, H_w3c02, MD4S20); + MD4_STEP0(MD4_H , d, a, b, c, H_wbc02, MD4S21); + MD4_STEP0(MD4_H , c, d, a, b, H_w7c02, MD4S22); + MD4_STEP0(MD4_H , b, c, d, a, H_wfc02, MD4S23); + + const u32x r0 = a; + const u32x r1 = d; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_S + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m00900_m04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const u32x *words_buf_r,void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32 w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = 0; + w[ 5] = 0; + w[ 6] = 0; + w[ 7] = 0; + w[ 8] = 0; + w[ 9] = 0; + w[10] = 0; + w[11] = 0; + w[12] = 0; + w[13] = 0; + w[14] = pws[gid].i[14]; + w[15] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m00900m (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m00900_m08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const u32x *words_buf_r,void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32 w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = pws[gid].i[ 4]; + w[ 5] = pws[gid].i[ 5]; + w[ 6] = pws[gid].i[ 6]; + w[ 7] = pws[gid].i[ 7]; + w[ 8] = 0; + w[ 9] = 0; + w[10] = 0; + w[11] = 0; + w[12] = 0; + w[13] = 0; + w[14] = pws[gid].i[14]; + w[15] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m00900m (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m00900_m16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const u32x *words_buf_r,void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32 w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = pws[gid].i[ 4]; + w[ 5] = pws[gid].i[ 5]; + w[ 6] = pws[gid].i[ 6]; + w[ 7] = pws[gid].i[ 7]; + w[ 8] = pws[gid].i[ 8]; + w[ 9] = pws[gid].i[ 9]; + w[10] = pws[gid].i[10]; + w[11] = pws[gid].i[11]; + w[12] = pws[gid].i[12]; + w[13] = pws[gid].i[13]; + w[14] = pws[gid].i[14]; + w[15] = pws[gid].i[15]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m00900m (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m00900_s04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const u32x *words_buf_r,void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32 w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = 0; + w[ 5] = 0; + w[ 6] = 0; + w[ 7] = 0; + w[ 8] = 0; + w[ 9] = 0; + w[10] = 0; + w[11] = 0; + w[12] = 0; + w[13] = 0; + w[14] = pws[gid].i[14]; + w[15] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m00900s (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m00900_s08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const u32x *words_buf_r,void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32 w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = pws[gid].i[ 4]; + w[ 5] = pws[gid].i[ 5]; + w[ 6] = pws[gid].i[ 6]; + w[ 7] = pws[gid].i[ 7]; + w[ 8] = 0; + w[ 9] = 0; + w[10] = 0; + w[11] = 0; + w[12] = 0; + w[13] = 0; + w[14] = pws[gid].i[14]; + w[15] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m00900s (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m00900_s16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const u32x *words_buf_r,void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32 w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = pws[gid].i[ 4]; + w[ 5] = pws[gid].i[ 5]; + w[ 6] = pws[gid].i[ 6]; + w[ 7] = pws[gid].i[ 7]; + w[ 8] = pws[gid].i[ 8]; + w[ 9] = pws[gid].i[ 9]; + w[10] = pws[gid].i[10]; + w[11] = pws[gid].i[11]; + w[12] = pws[gid].i[12]; + w[13] = pws[gid].i[13]; + w[14] = pws[gid].i[14]; + w[15] = pws[gid].i[15]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m00900s (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} diff --git a/nv/m01000_a0.cu b/nv/m01000_a0.cu new file mode 100644 index 0000000000..54f1e20637 --- /dev/null +++ b/nv/m01000_a0.cu @@ -0,0 +1,367 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _MD4_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW2 +#define VECT_SIZE1 +#endif + +#define DGST_R0 0 +#define DGST_R1 3 +#define DGST_R2 2 +#define DGST_R3 1 + +#include "include/kernel_functions.c" +#include "types_nv.c" +#include "common_nv.c" +#include "include/rp_gpu.h" +#include "rp_nv.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +__device__ __constant__ gpu_rule_t c_rules[1024]; + +extern "C" __global__ void __launch_bounds__ (256, 1) m01000_m04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + u32x pw_buf1[4]; + + pw_buf1[0] = pws[gid].i[ 4]; + pw_buf1[1] = pws[gid].i[ 5]; + pw_buf1[2] = pws[gid].i[ 6]; + pw_buf1[3] = pws[gid].i[ 7]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + + w0[0] = pw_buf0[0]; + w0[1] = pw_buf0[1]; + w0[2] = pw_buf0[2]; + w0[3] = pw_buf0[3]; + + u32x w1[4]; + + w1[0] = pw_buf1[0]; + w1[1] = pw_buf1[1]; + w1[2] = pw_buf1[2]; + w1[3] = pw_buf1[3]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 out_len = apply_rules (c_rules[il_pos].cmds, w0, w1, pw_len); + + append_0x80_2 (w0, w1, out_len); + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + make_unicode (w0, w0_t, w1_t); + make_unicode (w1, w2_t, w3_t); + + w3_t[2] = out_len * 8 * 2; + + u32x tmp2; + + u32x a = MD4M_A; + u32x b = MD4M_B; + u32x c = MD4M_C; + u32x d = MD4M_D; + + MD4_STEP (MD4_Fo, a, b, c, d, w0_t[0], MD4C00, MD4S00); + MD4_STEP (MD4_Fo, d, a, b, c, w0_t[1], MD4C00, MD4S01); + MD4_STEP (MD4_Fo, c, d, a, b, w0_t[2], MD4C00, MD4S02); + MD4_STEP (MD4_Fo, b, c, d, a, w0_t[3], MD4C00, MD4S03); + MD4_STEP (MD4_Fo, a, b, c, d, w1_t[0], MD4C00, MD4S00); + MD4_STEP (MD4_Fo, d, a, b, c, w1_t[1], MD4C00, MD4S01); + MD4_STEP (MD4_Fo, c, d, a, b, w1_t[2], MD4C00, MD4S02); + MD4_STEP (MD4_Fo, b, c, d, a, w1_t[3], MD4C00, MD4S03); + MD4_STEP (MD4_Fo, a, b, c, d, w2_t[0], MD4C00, MD4S00); + MD4_STEP (MD4_Fo, d, a, b, c, w2_t[1], MD4C00, MD4S01); + MD4_STEP (MD4_Fo, c, d, a, b, w2_t[2], MD4C00, MD4S02); + MD4_STEP (MD4_Fo, b, c, d, a, w2_t[3], MD4C00, MD4S03); + MD4_STEP (MD4_Fo, a, b, c, d, w3_t[0], MD4C00, MD4S00); + MD4_STEP (MD4_Fo, d, a, b, c, w3_t[1], MD4C00, MD4S01); + MD4_STEP (MD4_Fo, c, d, a, b, w3_t[2], MD4C00, MD4S02); + MD4_STEP (MD4_Fo, b, c, d, a, w3_t[3], MD4C00, MD4S03); + + MD4_STEP (MD4_Go, a, b, c, d, w0_t[0], MD4C01, MD4S10); + MD4_STEP (MD4_Go, d, a, b, c, w1_t[0], MD4C01, MD4S11); + MD4_STEP (MD4_Go, c, d, a, b, w2_t[0], MD4C01, MD4S12); + MD4_STEP (MD4_Go, b, c, d, a, w3_t[0], MD4C01, MD4S13); + MD4_STEP (MD4_Go, a, b, c, d, w0_t[1], MD4C01, MD4S10); + MD4_STEP (MD4_Go, d, a, b, c, w1_t[1], MD4C01, MD4S11); + MD4_STEP (MD4_Go, c, d, a, b, w2_t[1], MD4C01, MD4S12); + MD4_STEP (MD4_Go, b, c, d, a, w3_t[1], MD4C01, MD4S13); + MD4_STEP (MD4_Go, a, b, c, d, w0_t[2], MD4C01, MD4S10); + MD4_STEP (MD4_Go, d, a, b, c, w1_t[2], MD4C01, MD4S11); + MD4_STEP (MD4_Go, c, d, a, b, w2_t[2], MD4C01, MD4S12); + MD4_STEP (MD4_Go, b, c, d, a, w3_t[2], MD4C01, MD4S13); + MD4_STEP (MD4_Go, a, b, c, d, w0_t[3], MD4C01, MD4S10); + MD4_STEP (MD4_Go, d, a, b, c, w1_t[3], MD4C01, MD4S11); + MD4_STEP (MD4_Go, c, d, a, b, w2_t[3], MD4C01, MD4S12); + MD4_STEP (MD4_Go, b, c, d, a, w3_t[3], MD4C01, MD4S13); + + MD4_STEP (MD4_H1, a, b, c, d, w0_t[0], MD4C02, MD4S20); + MD4_STEP (MD4_H2, d, a, b, c, w2_t[0], MD4C02, MD4S21); + MD4_STEP (MD4_H1, c, d, a, b, w1_t[0], MD4C02, MD4S22); + MD4_STEP (MD4_H2, b, c, d, a, w3_t[0], MD4C02, MD4S23); + MD4_STEP (MD4_H1, a, b, c, d, w0_t[2], MD4C02, MD4S20); + MD4_STEP (MD4_H2, d, a, b, c, w2_t[2], MD4C02, MD4S21); + MD4_STEP (MD4_H1, c, d, a, b, w1_t[2], MD4C02, MD4S22); + MD4_STEP (MD4_H2, b, c, d, a, w3_t[2], MD4C02, MD4S23); + MD4_STEP (MD4_H1, a, b, c, d, w0_t[1], MD4C02, MD4S20); + MD4_STEP (MD4_H2, d, a, b, c, w2_t[1], MD4C02, MD4S21); + MD4_STEP (MD4_H1, c, d, a, b, w1_t[1], MD4C02, MD4S22); + MD4_STEP (MD4_H2, b, c, d, a, w3_t[1], MD4C02, MD4S23); + MD4_STEP (MD4_H1, a, b, c, d, w0_t[3], MD4C02, MD4S20); + MD4_STEP (MD4_H2, d, a, b, c, w2_t[3], MD4C02, MD4S21); + MD4_STEP (MD4_H1, c, d, a, b, w1_t[3], MD4C02, MD4S22); + MD4_STEP (MD4_H2, b, c, d, a, w3_t[3], MD4C02, MD4S23); + + const u32x r0 = a; + const u32x r1 = d; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_M + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m01000_m08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m01000_m16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m01000_s04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + u32x pw_buf1[4]; + + pw_buf1[0] = pws[gid].i[ 4]; + pw_buf1[1] = pws[gid].i[ 5]; + pw_buf1[2] = pws[gid].i[ 6]; + pw_buf1[3] = pws[gid].i[ 7]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + + w0[0] = pw_buf0[0]; + w0[1] = pw_buf0[1]; + w0[2] = pw_buf0[2]; + w0[3] = pw_buf0[3]; + + u32x w1[4]; + + w1[0] = pw_buf1[0]; + w1[1] = pw_buf1[1]; + w1[2] = pw_buf1[2]; + w1[3] = pw_buf1[3]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 out_len = apply_rules (c_rules[il_pos].cmds, w0, w1, pw_len); + + append_0x80_2 (w0, w1, out_len); + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + make_unicode (w0, w0_t, w1_t); + make_unicode (w1, w2_t, w3_t); + + w3_t[2] = out_len * 8 * 2; + + u32x tmp2; + + u32x a = MD4M_A; + u32x b = MD4M_B; + u32x c = MD4M_C; + u32x d = MD4M_D; + + MD4_STEP (MD4_Fo, a, b, c, d, w0_t[0], MD4C00, MD4S00); + MD4_STEP (MD4_Fo, d, a, b, c, w0_t[1], MD4C00, MD4S01); + MD4_STEP (MD4_Fo, c, d, a, b, w0_t[2], MD4C00, MD4S02); + MD4_STEP (MD4_Fo, b, c, d, a, w0_t[3], MD4C00, MD4S03); + MD4_STEP (MD4_Fo, a, b, c, d, w1_t[0], MD4C00, MD4S00); + MD4_STEP (MD4_Fo, d, a, b, c, w1_t[1], MD4C00, MD4S01); + MD4_STEP (MD4_Fo, c, d, a, b, w1_t[2], MD4C00, MD4S02); + MD4_STEP (MD4_Fo, b, c, d, a, w1_t[3], MD4C00, MD4S03); + MD4_STEP (MD4_Fo, a, b, c, d, w2_t[0], MD4C00, MD4S00); + MD4_STEP (MD4_Fo, d, a, b, c, w2_t[1], MD4C00, MD4S01); + MD4_STEP (MD4_Fo, c, d, a, b, w2_t[2], MD4C00, MD4S02); + MD4_STEP (MD4_Fo, b, c, d, a, w2_t[3], MD4C00, MD4S03); + MD4_STEP (MD4_Fo, a, b, c, d, w3_t[0], MD4C00, MD4S00); + MD4_STEP (MD4_Fo, d, a, b, c, w3_t[1], MD4C00, MD4S01); + MD4_STEP (MD4_Fo, c, d, a, b, w3_t[2], MD4C00, MD4S02); + MD4_STEP (MD4_Fo, b, c, d, a, w3_t[3], MD4C00, MD4S03); + + MD4_STEP (MD4_Go, a, b, c, d, w0_t[0], MD4C01, MD4S10); + MD4_STEP (MD4_Go, d, a, b, c, w1_t[0], MD4C01, MD4S11); + MD4_STEP (MD4_Go, c, d, a, b, w2_t[0], MD4C01, MD4S12); + MD4_STEP (MD4_Go, b, c, d, a, w3_t[0], MD4C01, MD4S13); + MD4_STEP (MD4_Go, a, b, c, d, w0_t[1], MD4C01, MD4S10); + MD4_STEP (MD4_Go, d, a, b, c, w1_t[1], MD4C01, MD4S11); + MD4_STEP (MD4_Go, c, d, a, b, w2_t[1], MD4C01, MD4S12); + MD4_STEP (MD4_Go, b, c, d, a, w3_t[1], MD4C01, MD4S13); + MD4_STEP (MD4_Go, a, b, c, d, w0_t[2], MD4C01, MD4S10); + MD4_STEP (MD4_Go, d, a, b, c, w1_t[2], MD4C01, MD4S11); + MD4_STEP (MD4_Go, c, d, a, b, w2_t[2], MD4C01, MD4S12); + MD4_STEP (MD4_Go, b, c, d, a, w3_t[2], MD4C01, MD4S13); + MD4_STEP (MD4_Go, a, b, c, d, w0_t[3], MD4C01, MD4S10); + MD4_STEP (MD4_Go, d, a, b, c, w1_t[3], MD4C01, MD4S11); + MD4_STEP (MD4_Go, c, d, a, b, w2_t[3], MD4C01, MD4S12); + MD4_STEP (MD4_Go, b, c, d, a, w3_t[3], MD4C01, MD4S13); + + MD4_STEP (MD4_H1, a, b, c, d, w0_t[0], MD4C02, MD4S20); + MD4_STEP (MD4_H2, d, a, b, c, w2_t[0], MD4C02, MD4S21); + MD4_STEP (MD4_H1, c, d, a, b, w1_t[0], MD4C02, MD4S22); + MD4_STEP (MD4_H2, b, c, d, a, w3_t[0], MD4C02, MD4S23); + MD4_STEP (MD4_H1, a, b, c, d, w0_t[2], MD4C02, MD4S20); + MD4_STEP (MD4_H2, d, a, b, c, w2_t[2], MD4C02, MD4S21); + MD4_STEP (MD4_H1, c, d, a, b, w1_t[2], MD4C02, MD4S22); + MD4_STEP (MD4_H2, b, c, d, a, w3_t[2], MD4C02, MD4S23); + MD4_STEP (MD4_H1, a, b, c, d, w0_t[1], MD4C02, MD4S20); + MD4_STEP (MD4_H2, d, a, b, c, w2_t[1], MD4C02, MD4S21); + MD4_STEP (MD4_H1, c, d, a, b, w1_t[1], MD4C02, MD4S22); + MD4_STEP (MD4_H2, b, c, d, a, w3_t[1], MD4C02, MD4S23); + MD4_STEP (MD4_H1, a, b, c, d, w0_t[3], MD4C02, MD4S20); + MD4_STEP (MD4_H2, d, a, b, c, w2_t[3], MD4C02, MD4S21); + MD4_STEP (MD4_H1, c, d, a, b, w1_t[3], MD4C02, MD4S22); + MD4_STEP (MD4_H2, b, c, d, a, w3_t[3], MD4C02, MD4S23); + + const u32x r0 = a; + const u32x r1 = d; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_S + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m01000_s08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m01000_s16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/nv/m01000_a1.cu b/nv/m01000_a1.cu new file mode 100644 index 0000000000..4bd32dc462 --- /dev/null +++ b/nv/m01000_a1.cu @@ -0,0 +1,473 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _MD4_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW2 +#define VECT_SIZE4 +#endif + +#define DGST_R0 0 +#define DGST_R1 3 +#define DGST_R2 2 +#define DGST_R3 1 + +#include "include/kernel_functions.c" +#include "types_nv.c" +#include "common_nv.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +__device__ __constant__ comb_t c_combs[1024]; + +extern "C" __global__ void __launch_bounds__ (256, 1) m01000_m04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + append_0x80_2 (wordl0, wordl1, pw_l_len); + + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, c_combs[0].pw_len); + } + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = c_combs[il_pos].pw_len; + + const u32 pw_len = pw_l_len + pw_r_len; + + u32 wordr0[4]; + + wordr0[0] = c_combs[il_pos].i[0]; + wordr0[1] = c_combs[il_pos].i[1]; + wordr0[2] = c_combs[il_pos].i[2]; + wordr0[3] = c_combs[il_pos].i[3]; + + u32 wordr1[4]; + + wordr1[0] = c_combs[il_pos].i[4]; + wordr1[1] = c_combs[il_pos].i[5]; + wordr1[2] = c_combs[il_pos].i[6]; + wordr1[3] = c_combs[il_pos].i[7]; + + u32 wordr2[4]; + + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + + u32 wordr3[4]; + + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + u32x w0[4]; + + w0[0] = wordl0[0] | wordr0[0]; + w0[1] = wordl0[1] | wordr0[1]; + w0[2] = wordl0[2] | wordr0[2]; + w0[3] = wordl0[3] | wordr0[3]; + + u32x w1[4]; + + w1[0] = wordl1[0] | wordr1[0]; + w1[1] = wordl1[1] | wordr1[1]; + w1[2] = wordl1[2] | wordr1[2]; + w1[3] = wordl1[3] | wordr1[3]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + make_unicode (w0, w0_t, w1_t); + make_unicode (w1, w2_t, w3_t); + + w3_t[2] = pw_len * 8 * 2; + + u32x tmp2; + + u32x a = MD4M_A; + u32x b = MD4M_B; + u32x c = MD4M_C; + u32x d = MD4M_D; + + MD4_STEP (MD4_Fo, a, b, c, d, w0_t[0], MD4C00, MD4S00); + MD4_STEP (MD4_Fo, d, a, b, c, w0_t[1], MD4C00, MD4S01); + MD4_STEP (MD4_Fo, c, d, a, b, w0_t[2], MD4C00, MD4S02); + MD4_STEP (MD4_Fo, b, c, d, a, w0_t[3], MD4C00, MD4S03); + MD4_STEP (MD4_Fo, a, b, c, d, w1_t[0], MD4C00, MD4S00); + MD4_STEP (MD4_Fo, d, a, b, c, w1_t[1], MD4C00, MD4S01); + MD4_STEP (MD4_Fo, c, d, a, b, w1_t[2], MD4C00, MD4S02); + MD4_STEP (MD4_Fo, b, c, d, a, w1_t[3], MD4C00, MD4S03); + MD4_STEP (MD4_Fo, a, b, c, d, w2_t[0], MD4C00, MD4S00); + MD4_STEP (MD4_Fo, d, a, b, c, w2_t[1], MD4C00, MD4S01); + MD4_STEP (MD4_Fo, c, d, a, b, w2_t[2], MD4C00, MD4S02); + MD4_STEP (MD4_Fo, b, c, d, a, w2_t[3], MD4C00, MD4S03); + MD4_STEP (MD4_Fo, a, b, c, d, w3_t[0], MD4C00, MD4S00); + MD4_STEP (MD4_Fo, d, a, b, c, w3_t[1], MD4C00, MD4S01); + MD4_STEP (MD4_Fo, c, d, a, b, w3_t[2], MD4C00, MD4S02); + MD4_STEP (MD4_Fo, b, c, d, a, w3_t[3], MD4C00, MD4S03); + + MD4_STEP (MD4_Go, a, b, c, d, w0_t[0], MD4C01, MD4S10); + MD4_STEP (MD4_Go, d, a, b, c, w1_t[0], MD4C01, MD4S11); + MD4_STEP (MD4_Go, c, d, a, b, w2_t[0], MD4C01, MD4S12); + MD4_STEP (MD4_Go, b, c, d, a, w3_t[0], MD4C01, MD4S13); + MD4_STEP (MD4_Go, a, b, c, d, w0_t[1], MD4C01, MD4S10); + MD4_STEP (MD4_Go, d, a, b, c, w1_t[1], MD4C01, MD4S11); + MD4_STEP (MD4_Go, c, d, a, b, w2_t[1], MD4C01, MD4S12); + MD4_STEP (MD4_Go, b, c, d, a, w3_t[1], MD4C01, MD4S13); + MD4_STEP (MD4_Go, a, b, c, d, w0_t[2], MD4C01, MD4S10); + MD4_STEP (MD4_Go, d, a, b, c, w1_t[2], MD4C01, MD4S11); + MD4_STEP (MD4_Go, c, d, a, b, w2_t[2], MD4C01, MD4S12); + MD4_STEP (MD4_Go, b, c, d, a, w3_t[2], MD4C01, MD4S13); + MD4_STEP (MD4_Go, a, b, c, d, w0_t[3], MD4C01, MD4S10); + MD4_STEP (MD4_Go, d, a, b, c, w1_t[3], MD4C01, MD4S11); + MD4_STEP (MD4_Go, c, d, a, b, w2_t[3], MD4C01, MD4S12); + MD4_STEP (MD4_Go, b, c, d, a, w3_t[3], MD4C01, MD4S13); + + MD4_STEP (MD4_H1, a, b, c, d, w0_t[0], MD4C02, MD4S20); + MD4_STEP (MD4_H2, d, a, b, c, w2_t[0], MD4C02, MD4S21); + MD4_STEP (MD4_H1, c, d, a, b, w1_t[0], MD4C02, MD4S22); + MD4_STEP (MD4_H2, b, c, d, a, w3_t[0], MD4C02, MD4S23); + MD4_STEP (MD4_H1, a, b, c, d, w0_t[2], MD4C02, MD4S20); + MD4_STEP (MD4_H2, d, a, b, c, w2_t[2], MD4C02, MD4S21); + MD4_STEP (MD4_H1, c, d, a, b, w1_t[2], MD4C02, MD4S22); + MD4_STEP (MD4_H2, b, c, d, a, w3_t[2], MD4C02, MD4S23); + MD4_STEP (MD4_H1, a, b, c, d, w0_t[1], MD4C02, MD4S20); + MD4_STEP (MD4_H2, d, a, b, c, w2_t[1], MD4C02, MD4S21); + MD4_STEP (MD4_H1, c, d, a, b, w1_t[1], MD4C02, MD4S22); + MD4_STEP (MD4_H2, b, c, d, a, w3_t[1], MD4C02, MD4S23); + MD4_STEP (MD4_H1, a, b, c, d, w0_t[3], MD4C02, MD4S20); + MD4_STEP (MD4_H2, d, a, b, c, w2_t[3], MD4C02, MD4S21); + MD4_STEP (MD4_H1, c, d, a, b, w1_t[3], MD4C02, MD4S22); + MD4_STEP (MD4_H2, b, c, d, a, w3_t[3], MD4C02, MD4S23); + + const u32x r0 = a; + const u32x r1 = d; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_M + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m01000_m08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m01000_m16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m01000_s04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + append_0x80_2 (wordl0, wordl1, pw_l_len); + + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, c_combs[0].pw_len); + } + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = c_combs[il_pos].pw_len; + + const u32 pw_len = pw_l_len + pw_r_len; + + u32 wordr0[4]; + + wordr0[0] = c_combs[il_pos].i[0]; + wordr0[1] = c_combs[il_pos].i[1]; + wordr0[2] = c_combs[il_pos].i[2]; + wordr0[3] = c_combs[il_pos].i[3]; + + u32 wordr1[4]; + + wordr1[0] = c_combs[il_pos].i[4]; + wordr1[1] = c_combs[il_pos].i[5]; + wordr1[2] = c_combs[il_pos].i[6]; + wordr1[3] = c_combs[il_pos].i[7]; + + u32 wordr2[4]; + + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + + u32 wordr3[4]; + + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + u32x w0[4]; + + w0[0] = wordl0[0] | wordr0[0]; + w0[1] = wordl0[1] | wordr0[1]; + w0[2] = wordl0[2] | wordr0[2]; + w0[3] = wordl0[3] | wordr0[3]; + + u32x w1[4]; + + w1[0] = wordl1[0] | wordr1[0]; + w1[1] = wordl1[1] | wordr1[1]; + w1[2] = wordl1[2] | wordr1[2]; + w1[3] = wordl1[3] | wordr1[3]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + make_unicode (w0, w0_t, w1_t); + make_unicode (w1, w2_t, w3_t); + + w3_t[2] = pw_len * 8 * 2; + + u32x tmp2; + + u32x a = MD4M_A; + u32x b = MD4M_B; + u32x c = MD4M_C; + u32x d = MD4M_D; + + MD4_STEP (MD4_Fo, a, b, c, d, w0_t[0], MD4C00, MD4S00); + MD4_STEP (MD4_Fo, d, a, b, c, w0_t[1], MD4C00, MD4S01); + MD4_STEP (MD4_Fo, c, d, a, b, w0_t[2], MD4C00, MD4S02); + MD4_STEP (MD4_Fo, b, c, d, a, w0_t[3], MD4C00, MD4S03); + MD4_STEP (MD4_Fo, a, b, c, d, w1_t[0], MD4C00, MD4S00); + MD4_STEP (MD4_Fo, d, a, b, c, w1_t[1], MD4C00, MD4S01); + MD4_STEP (MD4_Fo, c, d, a, b, w1_t[2], MD4C00, MD4S02); + MD4_STEP (MD4_Fo, b, c, d, a, w1_t[3], MD4C00, MD4S03); + MD4_STEP (MD4_Fo, a, b, c, d, w2_t[0], MD4C00, MD4S00); + MD4_STEP (MD4_Fo, d, a, b, c, w2_t[1], MD4C00, MD4S01); + MD4_STEP (MD4_Fo, c, d, a, b, w2_t[2], MD4C00, MD4S02); + MD4_STEP (MD4_Fo, b, c, d, a, w2_t[3], MD4C00, MD4S03); + MD4_STEP (MD4_Fo, a, b, c, d, w3_t[0], MD4C00, MD4S00); + MD4_STEP (MD4_Fo, d, a, b, c, w3_t[1], MD4C00, MD4S01); + MD4_STEP (MD4_Fo, c, d, a, b, w3_t[2], MD4C00, MD4S02); + MD4_STEP (MD4_Fo, b, c, d, a, w3_t[3], MD4C00, MD4S03); + + MD4_STEP (MD4_Go, a, b, c, d, w0_t[0], MD4C01, MD4S10); + MD4_STEP (MD4_Go, d, a, b, c, w1_t[0], MD4C01, MD4S11); + MD4_STEP (MD4_Go, c, d, a, b, w2_t[0], MD4C01, MD4S12); + MD4_STEP (MD4_Go, b, c, d, a, w3_t[0], MD4C01, MD4S13); + MD4_STEP (MD4_Go, a, b, c, d, w0_t[1], MD4C01, MD4S10); + MD4_STEP (MD4_Go, d, a, b, c, w1_t[1], MD4C01, MD4S11); + MD4_STEP (MD4_Go, c, d, a, b, w2_t[1], MD4C01, MD4S12); + MD4_STEP (MD4_Go, b, c, d, a, w3_t[1], MD4C01, MD4S13); + MD4_STEP (MD4_Go, a, b, c, d, w0_t[2], MD4C01, MD4S10); + MD4_STEP (MD4_Go, d, a, b, c, w1_t[2], MD4C01, MD4S11); + MD4_STEP (MD4_Go, c, d, a, b, w2_t[2], MD4C01, MD4S12); + MD4_STEP (MD4_Go, b, c, d, a, w3_t[2], MD4C01, MD4S13); + MD4_STEP (MD4_Go, a, b, c, d, w0_t[3], MD4C01, MD4S10); + MD4_STEP (MD4_Go, d, a, b, c, w1_t[3], MD4C01, MD4S11); + MD4_STEP (MD4_Go, c, d, a, b, w2_t[3], MD4C01, MD4S12); + MD4_STEP (MD4_Go, b, c, d, a, w3_t[3], MD4C01, MD4S13); + + MD4_STEP (MD4_H1, a, b, c, d, w0_t[0], MD4C02, MD4S20); + MD4_STEP (MD4_H2, d, a, b, c, w2_t[0], MD4C02, MD4S21); + MD4_STEP (MD4_H1, c, d, a, b, w1_t[0], MD4C02, MD4S22); + MD4_STEP (MD4_H2, b, c, d, a, w3_t[0], MD4C02, MD4S23); + MD4_STEP (MD4_H1, a, b, c, d, w0_t[2], MD4C02, MD4S20); + MD4_STEP (MD4_H2, d, a, b, c, w2_t[2], MD4C02, MD4S21); + MD4_STEP (MD4_H1, c, d, a, b, w1_t[2], MD4C02, MD4S22); + MD4_STEP (MD4_H2, b, c, d, a, w3_t[2], MD4C02, MD4S23); + MD4_STEP (MD4_H1, a, b, c, d, w0_t[1], MD4C02, MD4S20); + MD4_STEP (MD4_H2, d, a, b, c, w2_t[1], MD4C02, MD4S21); + MD4_STEP (MD4_H1, c, d, a, b, w1_t[1], MD4C02, MD4S22); + MD4_STEP (MD4_H2, b, c, d, a, w3_t[1], MD4C02, MD4S23); + MD4_STEP (MD4_H1, a, b, c, d, w0_t[3], MD4C02, MD4S20); + MD4_STEP (MD4_H2, d, a, b, c, w2_t[3], MD4C02, MD4S21); + MD4_STEP (MD4_H1, c, d, a, b, w1_t[3], MD4C02, MD4S22); + MD4_STEP (MD4_H2, b, c, d, a, w3_t[3], MD4C02, MD4S23); + + const u32x r0 = a; + const u32x r1 = d; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_S + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m01000_s08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m01000_s16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/nv/m01000_a3.cu b/nv/m01000_a3.cu new file mode 100644 index 0000000000..d28e4a2715 --- /dev/null +++ b/nv/m01000_a3.cu @@ -0,0 +1,634 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _MD4_ +#define _SCALAR_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW2 +#define VECT_SIZE4 +#endif + +#define DGST_R0 0 +#define DGST_R1 3 +#define DGST_R2 2 +#define DGST_R3 1 + +#include "include/kernel_functions.c" +#include "types_nv.c" +#include "common_nv.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4_warp.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4_warp.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4_warp.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4_warp.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4_warp.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4_warp.c" +#endif + +#define MD4_STEP_REV(f,a,b,c,d,x,t,s) \ +{ \ + a = rotr32 (a, s); \ + a -= f (b, c, d); \ + a -= x; \ + a -= t; \ +} + +#define MD4_STEP_REV1(f,a,b,c,d,x,t,s) \ +{ \ + a = rotr32 (a, s); \ + a -= x; \ + a -= t; \ +} + +__device__ __constant__ u32x c_bfs[1024]; + +__device__ static void m01000m (u32 w[16], const u32 pw_len, const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const u32x * words_buf_r, void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset) +{ + /** + * modifier + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 F_w0c00 = 0 + MD4C00; + const u32 F_w1c00 = w[ 1] + MD4C00; + const u32 F_w2c00 = w[ 2] + MD4C00; + const u32 F_w3c00 = w[ 3] + MD4C00; + const u32 F_w4c00 = w[ 4] + MD4C00; + const u32 F_w5c00 = w[ 5] + MD4C00; + const u32 F_w6c00 = w[ 6] + MD4C00; + const u32 F_w7c00 = w[ 7] + MD4C00; + const u32 F_w8c00 = w[ 8] + MD4C00; + const u32 F_w9c00 = w[ 9] + MD4C00; + const u32 F_wac00 = w[10] + MD4C00; + const u32 F_wbc00 = w[11] + MD4C00; + const u32 F_wcc00 = w[12] + MD4C00; + const u32 F_wdc00 = w[13] + MD4C00; + const u32 F_wec00 = w[14] + MD4C00; + const u32 F_wfc00 = w[15] + MD4C00; + + const u32 G_w0c01 = 0 + MD4C01; + const u32 G_w4c01 = w[ 4] + MD4C01; + const u32 G_w8c01 = w[ 8] + MD4C01; + const u32 G_wcc01 = w[12] + MD4C01; + const u32 G_w1c01 = w[ 1] + MD4C01; + const u32 G_w5c01 = w[ 5] + MD4C01; + const u32 G_w9c01 = w[ 9] + MD4C01; + const u32 G_wdc01 = w[13] + MD4C01; + const u32 G_w2c01 = w[ 2] + MD4C01; + const u32 G_w6c01 = w[ 6] + MD4C01; + const u32 G_wac01 = w[10] + MD4C01; + const u32 G_wec01 = w[14] + MD4C01; + const u32 G_w3c01 = w[ 3] + MD4C01; + const u32 G_w7c01 = w[ 7] + MD4C01; + const u32 G_wbc01 = w[11] + MD4C01; + const u32 G_wfc01 = w[15] + MD4C01; + + const u32 H_w0c02 = 0 + MD4C02; + const u32 H_w8c02 = w[ 8] + MD4C02; + const u32 H_w4c02 = w[ 4] + MD4C02; + const u32 H_wcc02 = w[12] + MD4C02; + const u32 H_w2c02 = w[ 2] + MD4C02; + const u32 H_wac02 = w[10] + MD4C02; + const u32 H_w6c02 = w[ 6] + MD4C02; + const u32 H_wec02 = w[14] + MD4C02; + const u32 H_w1c02 = w[ 1] + MD4C02; + const u32 H_w9c02 = w[ 9] + MD4C02; + const u32 H_w5c02 = w[ 5] + MD4C02; + const u32 H_wdc02 = w[13] + MD4C02; + const u32 H_w3c02 = w[ 3] + MD4C02; + const u32 H_wbc02 = w[11] + MD4C02; + const u32 H_w7c02 = w[ 7] + MD4C02; + const u32 H_wfc02 = w[15] + MD4C02; + + /** + * loop + */ + + const u32 bf_loops = ceil ((float) bfs_cnt / VECT_DIV); + + u32x w0l = w[0]; + + for (u32 il_pos = 0; il_pos < bf_loops; il_pos++) + { + const u32x w0r = c_bfs[il_pos]; + + const u32x w0 = w0l | w0r; + + u32x tmp2; + + u32x a = MD4M_A; + u32x b = MD4M_B; + u32x c = MD4M_C; + u32x d = MD4M_D; + + MD4_STEP (MD4_Fo, a, b, c, d, w0, F_w0c00, MD4S00); + MD4_STEP0(MD4_Fo, d, a, b, c, F_w1c00, MD4S01); + MD4_STEP0(MD4_Fo, c, d, a, b, F_w2c00, MD4S02); + MD4_STEP0(MD4_Fo, b, c, d, a, F_w3c00, MD4S03); + MD4_STEP0(MD4_Fo, a, b, c, d, F_w4c00, MD4S00); + MD4_STEP0(MD4_Fo, d, a, b, c, F_w5c00, MD4S01); + MD4_STEP0(MD4_Fo, c, d, a, b, F_w6c00, MD4S02); + MD4_STEP0(MD4_Fo, b, c, d, a, F_w7c00, MD4S03); + MD4_STEP0(MD4_Fo, a, b, c, d, F_w8c00, MD4S00); + MD4_STEP0(MD4_Fo, d, a, b, c, F_w9c00, MD4S01); + MD4_STEP0(MD4_Fo, c, d, a, b, F_wac00, MD4S02); + MD4_STEP0(MD4_Fo, b, c, d, a, F_wbc00, MD4S03); + MD4_STEP0(MD4_Fo, a, b, c, d, F_wcc00, MD4S00); + MD4_STEP0(MD4_Fo, d, a, b, c, F_wdc00, MD4S01); + MD4_STEP0(MD4_Fo, c, d, a, b, F_wec00, MD4S02); + MD4_STEP0(MD4_Fo, b, c, d, a, F_wfc00, MD4S03); + + MD4_STEP (MD4_Go, a, b, c, d, w0, G_w0c01, MD4S10); + MD4_STEP0(MD4_Go, d, a, b, c, G_w4c01, MD4S11); + MD4_STEP0(MD4_Go, c, d, a, b, G_w8c01, MD4S12); + MD4_STEP0(MD4_Go, b, c, d, a, G_wcc01, MD4S13); + MD4_STEP0(MD4_Go, a, b, c, d, G_w1c01, MD4S10); + MD4_STEP0(MD4_Go, d, a, b, c, G_w5c01, MD4S11); + MD4_STEP0(MD4_Go, c, d, a, b, G_w9c01, MD4S12); + MD4_STEP0(MD4_Go, b, c, d, a, G_wdc01, MD4S13); + MD4_STEP0(MD4_Go, a, b, c, d, G_w2c01, MD4S10); + MD4_STEP0(MD4_Go, d, a, b, c, G_w6c01, MD4S11); + MD4_STEP0(MD4_Go, c, d, a, b, G_wac01, MD4S12); + MD4_STEP0(MD4_Go, b, c, d, a, G_wec01, MD4S13); + MD4_STEP0(MD4_Go, a, b, c, d, G_w3c01, MD4S10); + MD4_STEP0(MD4_Go, d, a, b, c, G_w7c01, MD4S11); + MD4_STEP0(MD4_Go, c, d, a, b, G_wbc01, MD4S12); + MD4_STEP0(MD4_Go, b, c, d, a, G_wfc01, MD4S13); + + MD4_STEP (MD4_H1, a, b, c, d, w0, H_w0c02, MD4S20); + MD4_STEP0(MD4_H2, d, a, b, c, H_w8c02, MD4S21); + MD4_STEP0(MD4_H1, c, d, a, b, H_w4c02, MD4S22); + MD4_STEP0(MD4_H2, b, c, d, a, H_wcc02, MD4S23); + MD4_STEP0(MD4_H1, a, b, c, d, H_w2c02, MD4S20); + MD4_STEP0(MD4_H2, d, a, b, c, H_wac02, MD4S21); + MD4_STEP0(MD4_H1, c, d, a, b, H_w6c02, MD4S22); + MD4_STEP0(MD4_H2, b, c, d, a, H_wec02, MD4S23); + MD4_STEP0(MD4_H1, a, b, c, d, H_w1c02, MD4S20); + MD4_STEP0(MD4_H2, d, a, b, c, H_w9c02, MD4S21); + MD4_STEP0(MD4_H1, c, d, a, b, H_w5c02, MD4S22); + MD4_STEP0(MD4_H2, b, c, d, a, H_wdc02, MD4S23); + MD4_STEP0(MD4_H1, a, b, c, d, H_w3c02, MD4S20); + MD4_STEP0(MD4_H2, d, a, b, c, H_wbc02, MD4S21); + MD4_STEP0(MD4_H1, c, d, a, b, H_w7c02, MD4S22); + MD4_STEP0(MD4_H2, b, c, d, a, H_wfc02, MD4S23); + + const u32x r0 = a; + const u32x r1 = d; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_M + } +} + +__device__ static void m01000s (u32 w[16], const u32 pw_len, const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const u32x * words_buf_r, void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset) +{ + /** + * modifier + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 F_w0c00 = 0 + MD4C00; + const u32 F_w1c00 = w[ 1] + MD4C00; + const u32 F_w2c00 = w[ 2] + MD4C00; + const u32 F_w3c00 = w[ 3] + MD4C00; + const u32 F_w4c00 = w[ 4] + MD4C00; + const u32 F_w5c00 = w[ 5] + MD4C00; + const u32 F_w6c00 = w[ 6] + MD4C00; + const u32 F_w7c00 = w[ 7] + MD4C00; + const u32 F_w8c00 = w[ 8] + MD4C00; + const u32 F_w9c00 = w[ 9] + MD4C00; + const u32 F_wac00 = w[10] + MD4C00; + const u32 F_wbc00 = w[11] + MD4C00; + const u32 F_wcc00 = w[12] + MD4C00; + const u32 F_wdc00 = w[13] + MD4C00; + const u32 F_wec00 = w[14] + MD4C00; + const u32 F_wfc00 = w[15] + MD4C00; + + const u32 G_w0c01 = 0 + MD4C01; + const u32 G_w4c01 = w[ 4] + MD4C01; + const u32 G_w8c01 = w[ 8] + MD4C01; + const u32 G_wcc01 = w[12] + MD4C01; + const u32 G_w1c01 = w[ 1] + MD4C01; + const u32 G_w5c01 = w[ 5] + MD4C01; + const u32 G_w9c01 = w[ 9] + MD4C01; + const u32 G_wdc01 = w[13] + MD4C01; + const u32 G_w2c01 = w[ 2] + MD4C01; + const u32 G_w6c01 = w[ 6] + MD4C01; + const u32 G_wac01 = w[10] + MD4C01; + const u32 G_wec01 = w[14] + MD4C01; + const u32 G_w3c01 = w[ 3] + MD4C01; + const u32 G_w7c01 = w[ 7] + MD4C01; + const u32 G_wbc01 = w[11] + MD4C01; + const u32 G_wfc01 = w[15] + MD4C01; + + const u32 H_w0c02 = 0 + MD4C02; + const u32 H_w8c02 = w[ 8] + MD4C02; + const u32 H_w4c02 = w[ 4] + MD4C02; + const u32 H_wcc02 = w[12] + MD4C02; + const u32 H_w2c02 = w[ 2] + MD4C02; + const u32 H_wac02 = w[10] + MD4C02; + const u32 H_w6c02 = w[ 6] + MD4C02; + const u32 H_wec02 = w[14] + MD4C02; + const u32 H_w1c02 = w[ 1] + MD4C02; + const u32 H_w9c02 = w[ 9] + MD4C02; + const u32 H_w5c02 = w[ 5] + MD4C02; + const u32 H_wdc02 = w[13] + MD4C02; + const u32 H_w3c02 = w[ 3] + MD4C02; + const u32 H_wbc02 = w[11] + MD4C02; + const u32 H_w7c02 = w[ 7] + MD4C02; + const u32 H_wfc02 = w[15] + MD4C02; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * reverse + */ + + u32 a_rev = digests_buf[digests_offset].digest_buf[0]; + u32 b_rev = digests_buf[digests_offset].digest_buf[1]; + u32 c_rev = digests_buf[digests_offset].digest_buf[2]; + u32 d_rev = digests_buf[digests_offset].digest_buf[3]; + + MD4_STEP_REV (MD4_H, b_rev, c_rev, d_rev, a_rev, w[15], MD4C02, MD4S23); + MD4_STEP_REV (MD4_H, c_rev, d_rev, a_rev, b_rev, w[ 7], MD4C02, MD4S22); + MD4_STEP_REV (MD4_H, d_rev, a_rev, b_rev, c_rev, w[11], MD4C02, MD4S21); + MD4_STEP_REV (MD4_H, a_rev, b_rev, c_rev, d_rev, w[ 3], MD4C02, MD4S20); + MD4_STEP_REV (MD4_H, b_rev, c_rev, d_rev, a_rev, w[13], MD4C02, MD4S23); + MD4_STEP_REV (MD4_H, c_rev, d_rev, a_rev, b_rev, w[ 5], MD4C02, MD4S22); + MD4_STEP_REV (MD4_H, d_rev, a_rev, b_rev, c_rev, w[ 9], MD4C02, MD4S21); + MD4_STEP_REV (MD4_H, a_rev, b_rev, c_rev, d_rev, w[ 1], MD4C02, MD4S20); + MD4_STEP_REV (MD4_H, b_rev, c_rev, d_rev, a_rev, w[14], MD4C02, MD4S23); + MD4_STEP_REV (MD4_H, c_rev, d_rev, a_rev, b_rev, w[ 6], MD4C02, MD4S22); + MD4_STEP_REV (MD4_H, d_rev, a_rev, b_rev, c_rev, w[10], MD4C02, MD4S21); + MD4_STEP_REV (MD4_H, a_rev, b_rev, c_rev, d_rev, w[ 2], MD4C02, MD4S20); + MD4_STEP_REV (MD4_H, b_rev, c_rev, d_rev, a_rev, w[12], MD4C02, MD4S23); + MD4_STEP_REV (MD4_H, c_rev, d_rev, a_rev, b_rev, w[ 4], MD4C02, MD4S22); + MD4_STEP_REV (MD4_H, d_rev, a_rev, b_rev, c_rev, w[ 8], MD4C02, MD4S21); + MD4_STEP_REV (MD4_H, a_rev, b_rev, c_rev, d_rev, 0, MD4C02, MD4S20); + + const u32x sav_c = c_rev; + const u32x sav_d = d_rev; + + MD4_STEP_REV1(MD4_G, b_rev, c_rev, d_rev, a_rev, w[15], MD4C01, MD4S13); + MD4_STEP_REV1(MD4_G, c_rev, d_rev, a_rev, b_rev, w[11], MD4C01, MD4S12); + + /** + * loop + */ + + const u32 bf_loops = ceil ((float) bfs_cnt / VECT_DIV); + + u32x w0l = w[0]; + + for (u32 il_pos = 0; il_pos < bf_loops; il_pos++) + { + const u32x w0r = c_bfs[il_pos]; + + const u32x w0 = w0l | w0r; + + u32x pre_a = a_rev; + u32x pre_b = b_rev; + u32x pre_c = c_rev; + + pre_a = pre_a - w0; + pre_b = pre_b - MD4_G (sav_c, sav_d, pre_a); + pre_c = pre_c - MD4_G (sav_d, pre_a, pre_b); + + u32x tmp2; + + u32x a = MD4M_A; + u32x b = MD4M_B; + u32x c = MD4M_C; + u32x d = MD4M_D; + + MD4_STEP (MD4_Fo, a, b, c, d, w0, F_w0c00, MD4S00); + MD4_STEP0(MD4_Fo, d, a, b, c, F_w1c00, MD4S01); + MD4_STEP0(MD4_Fo, c, d, a, b, F_w2c00, MD4S02); + MD4_STEP0(MD4_Fo, b, c, d, a, F_w3c00, MD4S03); + MD4_STEP0(MD4_Fo, a, b, c, d, F_w4c00, MD4S00); + MD4_STEP0(MD4_Fo, d, a, b, c, F_w5c00, MD4S01); + MD4_STEP0(MD4_Fo, c, d, a, b, F_w6c00, MD4S02); + MD4_STEP0(MD4_Fo, b, c, d, a, F_w7c00, MD4S03); + MD4_STEP0(MD4_Fo, a, b, c, d, F_w8c00, MD4S00); + MD4_STEP0(MD4_Fo, d, a, b, c, F_w9c00, MD4S01); + MD4_STEP0(MD4_Fo, c, d, a, b, F_wac00, MD4S02); + MD4_STEP0(MD4_Fo, b, c, d, a, F_wbc00, MD4S03); + MD4_STEP0(MD4_Fo, a, b, c, d, F_wcc00, MD4S00); + MD4_STEP0(MD4_Fo, d, a, b, c, F_wdc00, MD4S01); + MD4_STEP0(MD4_Fo, c, d, a, b, F_wec00, MD4S02); + MD4_STEP0(MD4_Fo, b, c, d, a, F_wfc00, MD4S03); + + MD4_STEP (MD4_Go, a, b, c, d, w0, G_w0c01, MD4S10); + MD4_STEP0(MD4_Go, d, a, b, c, G_w4c01, MD4S11); + MD4_STEP0(MD4_Go, c, d, a, b, G_w8c01, MD4S12); + MD4_STEP0(MD4_Go, b, c, d, a, G_wcc01, MD4S13); + MD4_STEP0(MD4_Go, a, b, c, d, G_w1c01, MD4S10); + MD4_STEP0(MD4_Go, d, a, b, c, G_w5c01, MD4S11); + MD4_STEP0(MD4_Go, c, d, a, b, G_w9c01, MD4S12); + MD4_STEP0(MD4_Go, b, c, d, a, G_wdc01, MD4S13); + MD4_STEP0(MD4_Go, a, b, c, d, G_w2c01, MD4S10); + MD4_STEP0(MD4_Go, d, a, b, c, G_w6c01, MD4S11); + MD4_STEP0(MD4_Go, c, d, a, b, G_wac01, MD4S12); + + bool q_cond = (pre_c != c); + + if (q_cond) continue; + + MD4_STEP0(MD4_Go, b, c, d, a, G_wec01, MD4S13); + MD4_STEP0(MD4_Go, a, b, c, d, G_w3c01, MD4S10); + MD4_STEP0(MD4_Go, d, a, b, c, G_w7c01, MD4S11); + MD4_STEP0(MD4_Go, c, d, a, b, G_wbc01, MD4S12); + MD4_STEP0(MD4_Go, b, c, d, a, G_wfc01, MD4S13); + + MD4_STEP (MD4_H1, a, b, c, d, w0, H_w0c02, MD4S20); + MD4_STEP0(MD4_H2, d, a, b, c, H_w8c02, MD4S21); + MD4_STEP0(MD4_H1, c, d, a, b, H_w4c02, MD4S22); + MD4_STEP0(MD4_H2, b, c, d, a, H_wcc02, MD4S23); + MD4_STEP0(MD4_H1, a, b, c, d, H_w2c02, MD4S20); + MD4_STEP0(MD4_H2, d, a, b, c, H_wac02, MD4S21); + MD4_STEP0(MD4_H1, c, d, a, b, H_w6c02, MD4S22); + MD4_STEP0(MD4_H2, b, c, d, a, H_wec02, MD4S23); + MD4_STEP0(MD4_H1, a, b, c, d, H_w1c02, MD4S20); + MD4_STEP0(MD4_H2, d, a, b, c, H_w9c02, MD4S21); + MD4_STEP0(MD4_H1, c, d, a, b, H_w5c02, MD4S22); + MD4_STEP0(MD4_H2, b, c, d, a, H_wdc02, MD4S23); + MD4_STEP0(MD4_H1, a, b, c, d, H_w3c02, MD4S20); + MD4_STEP0(MD4_H2, d, a, b, c, H_wbc02, MD4S21); + MD4_STEP0(MD4_H1, c, d, a, b, H_w7c02, MD4S22); + MD4_STEP0(MD4_H2, b, c, d, a, H_wfc02, MD4S23); + + const u32x r0 = a; + const u32x r1 = d; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_S + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m01000_m04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const u32x *words_buf_r,void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32 w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = 0; + w[ 5] = 0; + w[ 6] = 0; + w[ 7] = 0; + w[ 8] = 0; + w[ 9] = 0; + w[10] = 0; + w[11] = 0; + w[12] = 0; + w[13] = 0; + w[14] = pws[gid].i[14]; + w[15] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m01000m (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m01000_m08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const u32x *words_buf_r,void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32 w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = pws[gid].i[ 4]; + w[ 5] = pws[gid].i[ 5]; + w[ 6] = pws[gid].i[ 6]; + w[ 7] = pws[gid].i[ 7]; + w[ 8] = 0; + w[ 9] = 0; + w[10] = 0; + w[11] = 0; + w[12] = 0; + w[13] = 0; + w[14] = pws[gid].i[14]; + w[15] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m01000m (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m01000_m16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const u32x *words_buf_r,void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32 w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = pws[gid].i[ 4]; + w[ 5] = pws[gid].i[ 5]; + w[ 6] = pws[gid].i[ 6]; + w[ 7] = pws[gid].i[ 7]; + w[ 8] = pws[gid].i[ 8]; + w[ 9] = pws[gid].i[ 9]; + w[10] = pws[gid].i[10]; + w[11] = pws[gid].i[11]; + w[12] = pws[gid].i[12]; + w[13] = pws[gid].i[13]; + w[14] = pws[gid].i[14]; + w[15] = pws[gid].i[15]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m01000m (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m01000_s04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const u32x *words_buf_r,void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32 w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = 0; + w[ 5] = 0; + w[ 6] = 0; + w[ 7] = 0; + w[ 8] = 0; + w[ 9] = 0; + w[10] = 0; + w[11] = 0; + w[12] = 0; + w[13] = 0; + w[14] = pws[gid].i[14]; + w[15] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m01000s (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m01000_s08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const u32x *words_buf_r,void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32 w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = pws[gid].i[ 4]; + w[ 5] = pws[gid].i[ 5]; + w[ 6] = pws[gid].i[ 6]; + w[ 7] = pws[gid].i[ 7]; + w[ 8] = 0; + w[ 9] = 0; + w[10] = 0; + w[11] = 0; + w[12] = 0; + w[13] = 0; + w[14] = pws[gid].i[14]; + w[15] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m01000s (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m01000_s16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const u32x *words_buf_r,void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32 w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = pws[gid].i[ 4]; + w[ 5] = pws[gid].i[ 5]; + w[ 6] = pws[gid].i[ 6]; + w[ 7] = pws[gid].i[ 7]; + w[ 8] = pws[gid].i[ 8]; + w[ 9] = pws[gid].i[ 9]; + w[10] = pws[gid].i[10]; + w[11] = pws[gid].i[11]; + w[12] = pws[gid].i[12]; + w[13] = pws[gid].i[13]; + w[14] = pws[gid].i[14]; + w[15] = pws[gid].i[15]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m01000s (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} diff --git a/nv/m01100_a0.cu b/nv/m01100_a0.cu new file mode 100644 index 0000000000..4c93f4b4e2 --- /dev/null +++ b/nv/m01100_a0.cu @@ -0,0 +1,578 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _MD4_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW2 +#define VECT_SIZE1 +#endif + +#define DGST_R0 0 +#define DGST_R1 3 +#define DGST_R2 2 +#define DGST_R3 1 + +#include "include/kernel_functions.c" +#include "types_nv.c" +#include "common_nv.c" +#include "include/rp_gpu.h" +#include "rp_nv.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +__device__ __constant__ gpu_rule_t c_rules[1024]; + +extern "C" __global__ void __launch_bounds__ (256, 1) m01100_m04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + u32x pw_buf1[4]; + + pw_buf1[0] = pws[gid].i[ 4]; + pw_buf1[1] = pws[gid].i[ 5]; + pw_buf1[2] = pws[gid].i[ 6]; + pw_buf1[3] = pws[gid].i[ 7]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[ 1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[ 2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[ 3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[ 4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[ 5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[ 6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[ 7]; + + u32 salt_buf2[4]; + + salt_buf2[0] = salt_bufs[salt_pos].salt_buf[ 8]; + salt_buf2[1] = salt_bufs[salt_pos].salt_buf[ 9]; + salt_buf2[2] = 0; + salt_buf2[3] = 0; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + + w0[0] = pw_buf0[0]; + w0[1] = pw_buf0[1]; + w0[2] = pw_buf0[2]; + w0[3] = pw_buf0[3]; + + u32x w1[4]; + + w1[0] = pw_buf1[0]; + w1[1] = pw_buf1[1]; + w1[2] = pw_buf1[2]; + w1[3] = pw_buf1[3]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 out_len = apply_rules (c_rules[il_pos].cmds, w0, w1, pw_len); + + append_0x80_2 (w0, w1, out_len); + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + make_unicode (w0, w0_t, w1_t); + make_unicode (w1, w2_t, w3_t); + + w3_t[2] = out_len * 8 * 2; + + u32x a = MD4M_A; + u32x b = MD4M_B; + u32x c = MD4M_C; + u32x d = MD4M_D; + + MD4_STEP (MD4_Fo, a, b, c, d, w0_t[0], MD4C00, MD4S00); + MD4_STEP (MD4_Fo, d, a, b, c, w0_t[1], MD4C00, MD4S01); + MD4_STEP (MD4_Fo, c, d, a, b, w0_t[2], MD4C00, MD4S02); + MD4_STEP (MD4_Fo, b, c, d, a, w0_t[3], MD4C00, MD4S03); + MD4_STEP (MD4_Fo, a, b, c, d, w1_t[0], MD4C00, MD4S00); + MD4_STEP (MD4_Fo, d, a, b, c, w1_t[1], MD4C00, MD4S01); + MD4_STEP (MD4_Fo, c, d, a, b, w1_t[2], MD4C00, MD4S02); + MD4_STEP (MD4_Fo, b, c, d, a, w1_t[3], MD4C00, MD4S03); + MD4_STEP (MD4_Fo, a, b, c, d, w2_t[0], MD4C00, MD4S00); + MD4_STEP (MD4_Fo, d, a, b, c, w2_t[1], MD4C00, MD4S01); + MD4_STEP (MD4_Fo, c, d, a, b, w2_t[2], MD4C00, MD4S02); + MD4_STEP (MD4_Fo, b, c, d, a, w2_t[3], MD4C00, MD4S03); + MD4_STEP (MD4_Fo, a, b, c, d, w3_t[0], MD4C00, MD4S00); + MD4_STEP (MD4_Fo, d, a, b, c, w3_t[1], MD4C00, MD4S01); + MD4_STEP (MD4_Fo, c, d, a, b, w3_t[2], MD4C00, MD4S02); + MD4_STEP (MD4_Fo, b, c, d, a, w3_t[3], MD4C00, MD4S03); + + MD4_STEP (MD4_Go, a, b, c, d, w0_t[0], MD4C01, MD4S10); + MD4_STEP (MD4_Go, d, a, b, c, w1_t[0], MD4C01, MD4S11); + MD4_STEP (MD4_Go, c, d, a, b, w2_t[0], MD4C01, MD4S12); + MD4_STEP (MD4_Go, b, c, d, a, w3_t[0], MD4C01, MD4S13); + MD4_STEP (MD4_Go, a, b, c, d, w0_t[1], MD4C01, MD4S10); + MD4_STEP (MD4_Go, d, a, b, c, w1_t[1], MD4C01, MD4S11); + MD4_STEP (MD4_Go, c, d, a, b, w2_t[1], MD4C01, MD4S12); + MD4_STEP (MD4_Go, b, c, d, a, w3_t[1], MD4C01, MD4S13); + MD4_STEP (MD4_Go, a, b, c, d, w0_t[2], MD4C01, MD4S10); + MD4_STEP (MD4_Go, d, a, b, c, w1_t[2], MD4C01, MD4S11); + MD4_STEP (MD4_Go, c, d, a, b, w2_t[2], MD4C01, MD4S12); + MD4_STEP (MD4_Go, b, c, d, a, w3_t[2], MD4C01, MD4S13); + MD4_STEP (MD4_Go, a, b, c, d, w0_t[3], MD4C01, MD4S10); + MD4_STEP (MD4_Go, d, a, b, c, w1_t[3], MD4C01, MD4S11); + MD4_STEP (MD4_Go, c, d, a, b, w2_t[3], MD4C01, MD4S12); + MD4_STEP (MD4_Go, b, c, d, a, w3_t[3], MD4C01, MD4S13); + + MD4_STEP (MD4_H , a, b, c, d, w0_t[0], MD4C02, MD4S20); + MD4_STEP (MD4_H , d, a, b, c, w2_t[0], MD4C02, MD4S21); + MD4_STEP (MD4_H , c, d, a, b, w1_t[0], MD4C02, MD4S22); + MD4_STEP (MD4_H , b, c, d, a, w3_t[0], MD4C02, MD4S23); + MD4_STEP (MD4_H , a, b, c, d, w0_t[2], MD4C02, MD4S20); + MD4_STEP (MD4_H , d, a, b, c, w2_t[2], MD4C02, MD4S21); + MD4_STEP (MD4_H , c, d, a, b, w1_t[2], MD4C02, MD4S22); + MD4_STEP (MD4_H , b, c, d, a, w3_t[2], MD4C02, MD4S23); + MD4_STEP (MD4_H , a, b, c, d, w0_t[1], MD4C02, MD4S20); + MD4_STEP (MD4_H , d, a, b, c, w2_t[1], MD4C02, MD4S21); + MD4_STEP (MD4_H , c, d, a, b, w1_t[1], MD4C02, MD4S22); + MD4_STEP (MD4_H , b, c, d, a, w3_t[1], MD4C02, MD4S23); + MD4_STEP (MD4_H , a, b, c, d, w0_t[3], MD4C02, MD4S20); + MD4_STEP (MD4_H , d, a, b, c, w2_t[3], MD4C02, MD4S21); + MD4_STEP (MD4_H , c, d, a, b, w1_t[3], MD4C02, MD4S22); + MD4_STEP (MD4_H , b, c, d, a, w3_t[3], MD4C02, MD4S23); + + a += MD4M_A; + b += MD4M_B; + c += MD4M_C; + d += MD4M_D; + + w0_t[0] = a; + w0_t[1] = b; + w0_t[2] = c; + w0_t[3] = d; + w1_t[0] = salt_buf0[0]; + w1_t[1] = salt_buf0[1]; + w1_t[2] = salt_buf0[2]; + w1_t[3] = salt_buf0[3]; + w2_t[0] = salt_buf1[0]; + w2_t[1] = salt_buf1[1]; + w2_t[2] = salt_buf1[2]; + w2_t[3] = salt_buf1[3]; + w3_t[0] = salt_buf2[0]; + w3_t[1] = salt_buf2[1]; + w3_t[2] = (16 + salt_len) * 8; + w3_t[3] = 0; + + a = MD4M_A; + b = MD4M_B; + c = MD4M_C; + d = MD4M_D; + + MD4_STEP (MD4_Fo, a, b, c, d, w0_t[0], MD4C00, MD4S00); + MD4_STEP (MD4_Fo, d, a, b, c, w0_t[1], MD4C00, MD4S01); + MD4_STEP (MD4_Fo, c, d, a, b, w0_t[2], MD4C00, MD4S02); + MD4_STEP (MD4_Fo, b, c, d, a, w0_t[3], MD4C00, MD4S03); + MD4_STEP (MD4_Fo, a, b, c, d, w1_t[0], MD4C00, MD4S00); + MD4_STEP (MD4_Fo, d, a, b, c, w1_t[1], MD4C00, MD4S01); + MD4_STEP (MD4_Fo, c, d, a, b, w1_t[2], MD4C00, MD4S02); + MD4_STEP (MD4_Fo, b, c, d, a, w1_t[3], MD4C00, MD4S03); + MD4_STEP (MD4_Fo, a, b, c, d, w2_t[0], MD4C00, MD4S00); + MD4_STEP (MD4_Fo, d, a, b, c, w2_t[1], MD4C00, MD4S01); + MD4_STEP (MD4_Fo, c, d, a, b, w2_t[2], MD4C00, MD4S02); + MD4_STEP (MD4_Fo, b, c, d, a, w2_t[3], MD4C00, MD4S03); + MD4_STEP (MD4_Fo, a, b, c, d, w3_t[0], MD4C00, MD4S00); + MD4_STEP (MD4_Fo, d, a, b, c, w3_t[1], MD4C00, MD4S01); + MD4_STEP (MD4_Fo, c, d, a, b, w3_t[2], MD4C00, MD4S02); + MD4_STEP (MD4_Fo, b, c, d, a, w3_t[3], MD4C00, MD4S03); + + MD4_STEP (MD4_Go, a, b, c, d, w0_t[0], MD4C01, MD4S10); + MD4_STEP (MD4_Go, d, a, b, c, w1_t[0], MD4C01, MD4S11); + MD4_STEP (MD4_Go, c, d, a, b, w2_t[0], MD4C01, MD4S12); + MD4_STEP (MD4_Go, b, c, d, a, w3_t[0], MD4C01, MD4S13); + MD4_STEP (MD4_Go, a, b, c, d, w0_t[1], MD4C01, MD4S10); + MD4_STEP (MD4_Go, d, a, b, c, w1_t[1], MD4C01, MD4S11); + MD4_STEP (MD4_Go, c, d, a, b, w2_t[1], MD4C01, MD4S12); + MD4_STEP (MD4_Go, b, c, d, a, w3_t[1], MD4C01, MD4S13); + MD4_STEP (MD4_Go, a, b, c, d, w0_t[2], MD4C01, MD4S10); + MD4_STEP (MD4_Go, d, a, b, c, w1_t[2], MD4C01, MD4S11); + MD4_STEP (MD4_Go, c, d, a, b, w2_t[2], MD4C01, MD4S12); + MD4_STEP (MD4_Go, b, c, d, a, w3_t[2], MD4C01, MD4S13); + MD4_STEP (MD4_Go, a, b, c, d, w0_t[3], MD4C01, MD4S10); + MD4_STEP (MD4_Go, d, a, b, c, w1_t[3], MD4C01, MD4S11); + MD4_STEP (MD4_Go, c, d, a, b, w2_t[3], MD4C01, MD4S12); + MD4_STEP (MD4_Go, b, c, d, a, w3_t[3], MD4C01, MD4S13); + + MD4_STEP (MD4_H , a, b, c, d, w0_t[0], MD4C02, MD4S20); + MD4_STEP (MD4_H , d, a, b, c, w2_t[0], MD4C02, MD4S21); + MD4_STEP (MD4_H , c, d, a, b, w1_t[0], MD4C02, MD4S22); + MD4_STEP (MD4_H , b, c, d, a, w3_t[0], MD4C02, MD4S23); + MD4_STEP (MD4_H , a, b, c, d, w0_t[2], MD4C02, MD4S20); + MD4_STEP (MD4_H , d, a, b, c, w2_t[2], MD4C02, MD4S21); + MD4_STEP (MD4_H , c, d, a, b, w1_t[2], MD4C02, MD4S22); + MD4_STEP (MD4_H , b, c, d, a, w3_t[2], MD4C02, MD4S23); + MD4_STEP (MD4_H , a, b, c, d, w0_t[1], MD4C02, MD4S20); + MD4_STEP (MD4_H , d, a, b, c, w2_t[1], MD4C02, MD4S21); + MD4_STEP (MD4_H , c, d, a, b, w1_t[1], MD4C02, MD4S22); + MD4_STEP (MD4_H , b, c, d, a, w3_t[1], MD4C02, MD4S23); + MD4_STEP (MD4_H , a, b, c, d, w0_t[3], MD4C02, MD4S20); + MD4_STEP (MD4_H , d, a, b, c, w2_t[3], MD4C02, MD4S21); + MD4_STEP (MD4_H , c, d, a, b, w1_t[3], MD4C02, MD4S22); + MD4_STEP (MD4_H , b, c, d, a, w3_t[3], MD4C02, MD4S23); + + const u32x r0 = a; + const u32x r1 = d; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_M + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m01100_m08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m01100_m16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m01100_s04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + u32x pw_buf1[4]; + + pw_buf1[0] = pws[gid].i[ 4]; + pw_buf1[1] = pws[gid].i[ 5]; + pw_buf1[2] = pws[gid].i[ 6]; + pw_buf1[3] = pws[gid].i[ 7]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[ 1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[ 2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[ 3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[ 4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[ 5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[ 6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[ 7]; + + u32 salt_buf2[4]; + + salt_buf2[0] = salt_bufs[salt_pos].salt_buf[ 8]; + salt_buf2[1] = salt_bufs[salt_pos].salt_buf[ 9]; + salt_buf2[2] = 0; + salt_buf2[3] = 0; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + + w0[0] = pw_buf0[0]; + w0[1] = pw_buf0[1]; + w0[2] = pw_buf0[2]; + w0[3] = pw_buf0[3]; + + u32x w1[4]; + + w1[0] = pw_buf1[0]; + w1[1] = pw_buf1[1]; + w1[2] = pw_buf1[2]; + w1[3] = pw_buf1[3]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 out_len = apply_rules (c_rules[il_pos].cmds, w0, w1, pw_len); + + append_0x80_2 (w0, w1, out_len); + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + make_unicode (w0, w0_t, w1_t); + make_unicode (w1, w2_t, w3_t); + + w3_t[2] = out_len * 8 * 2; + + u32x a = MD4M_A; + u32x b = MD4M_B; + u32x c = MD4M_C; + u32x d = MD4M_D; + + MD4_STEP (MD4_Fo, a, b, c, d, w0_t[0], MD4C00, MD4S00); + MD4_STEP (MD4_Fo, d, a, b, c, w0_t[1], MD4C00, MD4S01); + MD4_STEP (MD4_Fo, c, d, a, b, w0_t[2], MD4C00, MD4S02); + MD4_STEP (MD4_Fo, b, c, d, a, w0_t[3], MD4C00, MD4S03); + MD4_STEP (MD4_Fo, a, b, c, d, w1_t[0], MD4C00, MD4S00); + MD4_STEP (MD4_Fo, d, a, b, c, w1_t[1], MD4C00, MD4S01); + MD4_STEP (MD4_Fo, c, d, a, b, w1_t[2], MD4C00, MD4S02); + MD4_STEP (MD4_Fo, b, c, d, a, w1_t[3], MD4C00, MD4S03); + MD4_STEP (MD4_Fo, a, b, c, d, w2_t[0], MD4C00, MD4S00); + MD4_STEP (MD4_Fo, d, a, b, c, w2_t[1], MD4C00, MD4S01); + MD4_STEP (MD4_Fo, c, d, a, b, w2_t[2], MD4C00, MD4S02); + MD4_STEP (MD4_Fo, b, c, d, a, w2_t[3], MD4C00, MD4S03); + MD4_STEP (MD4_Fo, a, b, c, d, w3_t[0], MD4C00, MD4S00); + MD4_STEP (MD4_Fo, d, a, b, c, w3_t[1], MD4C00, MD4S01); + MD4_STEP (MD4_Fo, c, d, a, b, w3_t[2], MD4C00, MD4S02); + MD4_STEP (MD4_Fo, b, c, d, a, w3_t[3], MD4C00, MD4S03); + + MD4_STEP (MD4_Go, a, b, c, d, w0_t[0], MD4C01, MD4S10); + MD4_STEP (MD4_Go, d, a, b, c, w1_t[0], MD4C01, MD4S11); + MD4_STEP (MD4_Go, c, d, a, b, w2_t[0], MD4C01, MD4S12); + MD4_STEP (MD4_Go, b, c, d, a, w3_t[0], MD4C01, MD4S13); + MD4_STEP (MD4_Go, a, b, c, d, w0_t[1], MD4C01, MD4S10); + MD4_STEP (MD4_Go, d, a, b, c, w1_t[1], MD4C01, MD4S11); + MD4_STEP (MD4_Go, c, d, a, b, w2_t[1], MD4C01, MD4S12); + MD4_STEP (MD4_Go, b, c, d, a, w3_t[1], MD4C01, MD4S13); + MD4_STEP (MD4_Go, a, b, c, d, w0_t[2], MD4C01, MD4S10); + MD4_STEP (MD4_Go, d, a, b, c, w1_t[2], MD4C01, MD4S11); + MD4_STEP (MD4_Go, c, d, a, b, w2_t[2], MD4C01, MD4S12); + MD4_STEP (MD4_Go, b, c, d, a, w3_t[2], MD4C01, MD4S13); + MD4_STEP (MD4_Go, a, b, c, d, w0_t[3], MD4C01, MD4S10); + MD4_STEP (MD4_Go, d, a, b, c, w1_t[3], MD4C01, MD4S11); + MD4_STEP (MD4_Go, c, d, a, b, w2_t[3], MD4C01, MD4S12); + MD4_STEP (MD4_Go, b, c, d, a, w3_t[3], MD4C01, MD4S13); + + MD4_STEP (MD4_H , a, b, c, d, w0_t[0], MD4C02, MD4S20); + MD4_STEP (MD4_H , d, a, b, c, w2_t[0], MD4C02, MD4S21); + MD4_STEP (MD4_H , c, d, a, b, w1_t[0], MD4C02, MD4S22); + MD4_STEP (MD4_H , b, c, d, a, w3_t[0], MD4C02, MD4S23); + MD4_STEP (MD4_H , a, b, c, d, w0_t[2], MD4C02, MD4S20); + MD4_STEP (MD4_H , d, a, b, c, w2_t[2], MD4C02, MD4S21); + MD4_STEP (MD4_H , c, d, a, b, w1_t[2], MD4C02, MD4S22); + MD4_STEP (MD4_H , b, c, d, a, w3_t[2], MD4C02, MD4S23); + MD4_STEP (MD4_H , a, b, c, d, w0_t[1], MD4C02, MD4S20); + MD4_STEP (MD4_H , d, a, b, c, w2_t[1], MD4C02, MD4S21); + MD4_STEP (MD4_H , c, d, a, b, w1_t[1], MD4C02, MD4S22); + MD4_STEP (MD4_H , b, c, d, a, w3_t[1], MD4C02, MD4S23); + MD4_STEP (MD4_H , a, b, c, d, w0_t[3], MD4C02, MD4S20); + MD4_STEP (MD4_H , d, a, b, c, w2_t[3], MD4C02, MD4S21); + MD4_STEP (MD4_H , c, d, a, b, w1_t[3], MD4C02, MD4S22); + MD4_STEP (MD4_H , b, c, d, a, w3_t[3], MD4C02, MD4S23); + + a += MD4M_A; + b += MD4M_B; + c += MD4M_C; + d += MD4M_D; + + w0_t[0] = a; + w0_t[1] = b; + w0_t[2] = c; + w0_t[3] = d; + w1_t[0] = salt_buf0[0]; + w1_t[1] = salt_buf0[1]; + w1_t[2] = salt_buf0[2]; + w1_t[3] = salt_buf0[3]; + w2_t[0] = salt_buf1[0]; + w2_t[1] = salt_buf1[1]; + w2_t[2] = salt_buf1[2]; + w2_t[3] = salt_buf1[3]; + w3_t[0] = salt_buf2[0]; + w3_t[1] = salt_buf2[1]; + w3_t[2] = (16 + salt_len) * 8; + w3_t[3] = 0; + + a = MD4M_A; + b = MD4M_B; + c = MD4M_C; + d = MD4M_D; + + MD4_STEP (MD4_Fo, a, b, c, d, w0_t[0], MD4C00, MD4S00); + MD4_STEP (MD4_Fo, d, a, b, c, w0_t[1], MD4C00, MD4S01); + MD4_STEP (MD4_Fo, c, d, a, b, w0_t[2], MD4C00, MD4S02); + MD4_STEP (MD4_Fo, b, c, d, a, w0_t[3], MD4C00, MD4S03); + MD4_STEP (MD4_Fo, a, b, c, d, w1_t[0], MD4C00, MD4S00); + MD4_STEP (MD4_Fo, d, a, b, c, w1_t[1], MD4C00, MD4S01); + MD4_STEP (MD4_Fo, c, d, a, b, w1_t[2], MD4C00, MD4S02); + MD4_STEP (MD4_Fo, b, c, d, a, w1_t[3], MD4C00, MD4S03); + MD4_STEP (MD4_Fo, a, b, c, d, w2_t[0], MD4C00, MD4S00); + MD4_STEP (MD4_Fo, d, a, b, c, w2_t[1], MD4C00, MD4S01); + MD4_STEP (MD4_Fo, c, d, a, b, w2_t[2], MD4C00, MD4S02); + MD4_STEP (MD4_Fo, b, c, d, a, w2_t[3], MD4C00, MD4S03); + MD4_STEP (MD4_Fo, a, b, c, d, w3_t[0], MD4C00, MD4S00); + MD4_STEP (MD4_Fo, d, a, b, c, w3_t[1], MD4C00, MD4S01); + MD4_STEP (MD4_Fo, c, d, a, b, w3_t[2], MD4C00, MD4S02); + MD4_STEP (MD4_Fo, b, c, d, a, w3_t[3], MD4C00, MD4S03); + + MD4_STEP (MD4_Go, a, b, c, d, w0_t[0], MD4C01, MD4S10); + MD4_STEP (MD4_Go, d, a, b, c, w1_t[0], MD4C01, MD4S11); + MD4_STEP (MD4_Go, c, d, a, b, w2_t[0], MD4C01, MD4S12); + MD4_STEP (MD4_Go, b, c, d, a, w3_t[0], MD4C01, MD4S13); + MD4_STEP (MD4_Go, a, b, c, d, w0_t[1], MD4C01, MD4S10); + MD4_STEP (MD4_Go, d, a, b, c, w1_t[1], MD4C01, MD4S11); + MD4_STEP (MD4_Go, c, d, a, b, w2_t[1], MD4C01, MD4S12); + MD4_STEP (MD4_Go, b, c, d, a, w3_t[1], MD4C01, MD4S13); + MD4_STEP (MD4_Go, a, b, c, d, w0_t[2], MD4C01, MD4S10); + MD4_STEP (MD4_Go, d, a, b, c, w1_t[2], MD4C01, MD4S11); + MD4_STEP (MD4_Go, c, d, a, b, w2_t[2], MD4C01, MD4S12); + MD4_STEP (MD4_Go, b, c, d, a, w3_t[2], MD4C01, MD4S13); + MD4_STEP (MD4_Go, a, b, c, d, w0_t[3], MD4C01, MD4S10); + MD4_STEP (MD4_Go, d, a, b, c, w1_t[3], MD4C01, MD4S11); + MD4_STEP (MD4_Go, c, d, a, b, w2_t[3], MD4C01, MD4S12); + MD4_STEP (MD4_Go, b, c, d, a, w3_t[3], MD4C01, MD4S13); + + MD4_STEP (MD4_H , a, b, c, d, w0_t[0], MD4C02, MD4S20); + MD4_STEP (MD4_H , d, a, b, c, w2_t[0], MD4C02, MD4S21); + MD4_STEP (MD4_H , c, d, a, b, w1_t[0], MD4C02, MD4S22); + MD4_STEP (MD4_H , b, c, d, a, w3_t[0], MD4C02, MD4S23); + MD4_STEP (MD4_H , a, b, c, d, w0_t[2], MD4C02, MD4S20); + MD4_STEP (MD4_H , d, a, b, c, w2_t[2], MD4C02, MD4S21); + MD4_STEP (MD4_H , c, d, a, b, w1_t[2], MD4C02, MD4S22); + MD4_STEP (MD4_H , b, c, d, a, w3_t[2], MD4C02, MD4S23); + MD4_STEP (MD4_H , a, b, c, d, w0_t[1], MD4C02, MD4S20); + MD4_STEP (MD4_H , d, a, b, c, w2_t[1], MD4C02, MD4S21); + MD4_STEP (MD4_H , c, d, a, b, w1_t[1], MD4C02, MD4S22); + MD4_STEP (MD4_H , b, c, d, a, w3_t[1], MD4C02, MD4S23); + MD4_STEP (MD4_H , a, b, c, d, w0_t[3], MD4C02, MD4S20); + + bool q_cond = (search[0] != a); + + if (q_cond) continue; + + MD4_STEP (MD4_H , d, a, b, c, w2_t[3], MD4C02, MD4S21); + MD4_STEP (MD4_H , c, d, a, b, w1_t[3], MD4C02, MD4S22); + MD4_STEP (MD4_H , b, c, d, a, w3_t[3], MD4C02, MD4S23); + + const u32x r0 = a; + const u32x r1 = d; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_S + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m01100_s08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m01100_s16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/nv/m01100_a1.cu b/nv/m01100_a1.cu new file mode 100644 index 0000000000..048b2745cf --- /dev/null +++ b/nv/m01100_a1.cu @@ -0,0 +1,684 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _MD4_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW2 +#define VECT_SIZE4 +#endif + +#define DGST_R0 0 +#define DGST_R1 3 +#define DGST_R2 2 +#define DGST_R3 1 + +#include "include/kernel_functions.c" +#include "types_nv.c" +#include "common_nv.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +__device__ __constant__ comb_t c_combs[1024]; + +extern "C" __global__ void __launch_bounds__ (256, 1) m01100_m04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + append_0x80_2 (wordl0, wordl1, pw_l_len); + + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, c_combs[0].pw_len); + } + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[ 1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[ 2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[ 3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[ 4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[ 5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[ 6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[ 7]; + + u32 salt_buf2[4]; + + salt_buf2[0] = salt_bufs[salt_pos].salt_buf[ 8]; + salt_buf2[1] = salt_bufs[salt_pos].salt_buf[ 9]; + salt_buf2[2] = 0; + salt_buf2[3] = 0; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = c_combs[il_pos].pw_len; + + const u32 pw_len = pw_l_len + pw_r_len; + + u32 wordr0[4]; + + wordr0[0] = c_combs[il_pos].i[0]; + wordr0[1] = c_combs[il_pos].i[1]; + wordr0[2] = c_combs[il_pos].i[2]; + wordr0[3] = c_combs[il_pos].i[3]; + + u32 wordr1[4]; + + wordr1[0] = c_combs[il_pos].i[4]; + wordr1[1] = c_combs[il_pos].i[5]; + wordr1[2] = c_combs[il_pos].i[6]; + wordr1[3] = c_combs[il_pos].i[7]; + + u32 wordr2[4]; + + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + + u32 wordr3[4]; + + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + u32x w0[4]; + + w0[0] = wordl0[0] | wordr0[0]; + w0[1] = wordl0[1] | wordr0[1]; + w0[2] = wordl0[2] | wordr0[2]; + w0[3] = wordl0[3] | wordr0[3]; + + u32x w1[4]; + + w1[0] = wordl1[0] | wordr1[0]; + w1[1] = wordl1[1] | wordr1[1]; + w1[2] = wordl1[2] | wordr1[2]; + w1[3] = wordl1[3] | wordr1[3]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + make_unicode (w0, w0_t, w1_t); + make_unicode (w1, w2_t, w3_t); + + w3_t[2] = pw_len * 8 * 2; + + u32x a = MD4M_A; + u32x b = MD4M_B; + u32x c = MD4M_C; + u32x d = MD4M_D; + + MD4_STEP (MD4_Fo, a, b, c, d, w0_t[0], MD4C00, MD4S00); + MD4_STEP (MD4_Fo, d, a, b, c, w0_t[1], MD4C00, MD4S01); + MD4_STEP (MD4_Fo, c, d, a, b, w0_t[2], MD4C00, MD4S02); + MD4_STEP (MD4_Fo, b, c, d, a, w0_t[3], MD4C00, MD4S03); + MD4_STEP (MD4_Fo, a, b, c, d, w1_t[0], MD4C00, MD4S00); + MD4_STEP (MD4_Fo, d, a, b, c, w1_t[1], MD4C00, MD4S01); + MD4_STEP (MD4_Fo, c, d, a, b, w1_t[2], MD4C00, MD4S02); + MD4_STEP (MD4_Fo, b, c, d, a, w1_t[3], MD4C00, MD4S03); + MD4_STEP (MD4_Fo, a, b, c, d, w2_t[0], MD4C00, MD4S00); + MD4_STEP (MD4_Fo, d, a, b, c, w2_t[1], MD4C00, MD4S01); + MD4_STEP (MD4_Fo, c, d, a, b, w2_t[2], MD4C00, MD4S02); + MD4_STEP (MD4_Fo, b, c, d, a, w2_t[3], MD4C00, MD4S03); + MD4_STEP (MD4_Fo, a, b, c, d, w3_t[0], MD4C00, MD4S00); + MD4_STEP (MD4_Fo, d, a, b, c, w3_t[1], MD4C00, MD4S01); + MD4_STEP (MD4_Fo, c, d, a, b, w3_t[2], MD4C00, MD4S02); + MD4_STEP (MD4_Fo, b, c, d, a, w3_t[3], MD4C00, MD4S03); + + MD4_STEP (MD4_Go, a, b, c, d, w0_t[0], MD4C01, MD4S10); + MD4_STEP (MD4_Go, d, a, b, c, w1_t[0], MD4C01, MD4S11); + MD4_STEP (MD4_Go, c, d, a, b, w2_t[0], MD4C01, MD4S12); + MD4_STEP (MD4_Go, b, c, d, a, w3_t[0], MD4C01, MD4S13); + MD4_STEP (MD4_Go, a, b, c, d, w0_t[1], MD4C01, MD4S10); + MD4_STEP (MD4_Go, d, a, b, c, w1_t[1], MD4C01, MD4S11); + MD4_STEP (MD4_Go, c, d, a, b, w2_t[1], MD4C01, MD4S12); + MD4_STEP (MD4_Go, b, c, d, a, w3_t[1], MD4C01, MD4S13); + MD4_STEP (MD4_Go, a, b, c, d, w0_t[2], MD4C01, MD4S10); + MD4_STEP (MD4_Go, d, a, b, c, w1_t[2], MD4C01, MD4S11); + MD4_STEP (MD4_Go, c, d, a, b, w2_t[2], MD4C01, MD4S12); + MD4_STEP (MD4_Go, b, c, d, a, w3_t[2], MD4C01, MD4S13); + MD4_STEP (MD4_Go, a, b, c, d, w0_t[3], MD4C01, MD4S10); + MD4_STEP (MD4_Go, d, a, b, c, w1_t[3], MD4C01, MD4S11); + MD4_STEP (MD4_Go, c, d, a, b, w2_t[3], MD4C01, MD4S12); + MD4_STEP (MD4_Go, b, c, d, a, w3_t[3], MD4C01, MD4S13); + + MD4_STEP (MD4_H , a, b, c, d, w0_t[0], MD4C02, MD4S20); + MD4_STEP (MD4_H , d, a, b, c, w2_t[0], MD4C02, MD4S21); + MD4_STEP (MD4_H , c, d, a, b, w1_t[0], MD4C02, MD4S22); + MD4_STEP (MD4_H , b, c, d, a, w3_t[0], MD4C02, MD4S23); + MD4_STEP (MD4_H , a, b, c, d, w0_t[2], MD4C02, MD4S20); + MD4_STEP (MD4_H , d, a, b, c, w2_t[2], MD4C02, MD4S21); + MD4_STEP (MD4_H , c, d, a, b, w1_t[2], MD4C02, MD4S22); + MD4_STEP (MD4_H , b, c, d, a, w3_t[2], MD4C02, MD4S23); + MD4_STEP (MD4_H , a, b, c, d, w0_t[1], MD4C02, MD4S20); + MD4_STEP (MD4_H , d, a, b, c, w2_t[1], MD4C02, MD4S21); + MD4_STEP (MD4_H , c, d, a, b, w1_t[1], MD4C02, MD4S22); + MD4_STEP (MD4_H , b, c, d, a, w3_t[1], MD4C02, MD4S23); + MD4_STEP (MD4_H , a, b, c, d, w0_t[3], MD4C02, MD4S20); + MD4_STEP (MD4_H , d, a, b, c, w2_t[3], MD4C02, MD4S21); + MD4_STEP (MD4_H , c, d, a, b, w1_t[3], MD4C02, MD4S22); + MD4_STEP (MD4_H , b, c, d, a, w3_t[3], MD4C02, MD4S23); + + a += MD4M_A; + b += MD4M_B; + c += MD4M_C; + d += MD4M_D; + + w0_t[0] = a; + w0_t[1] = b; + w0_t[2] = c; + w0_t[3] = d; + w1_t[0] = salt_buf0[0]; + w1_t[1] = salt_buf0[1]; + w1_t[2] = salt_buf0[2]; + w1_t[3] = salt_buf0[3]; + w2_t[0] = salt_buf1[0]; + w2_t[1] = salt_buf1[1]; + w2_t[2] = salt_buf1[2]; + w2_t[3] = salt_buf1[3]; + w3_t[0] = salt_buf2[0]; + w3_t[1] = salt_buf2[1]; + w3_t[2] = (16 + salt_len) * 8; + w3_t[3] = 0; + + a = MD4M_A; + b = MD4M_B; + c = MD4M_C; + d = MD4M_D; + + MD4_STEP (MD4_Fo, a, b, c, d, w0_t[0], MD4C00, MD4S00); + MD4_STEP (MD4_Fo, d, a, b, c, w0_t[1], MD4C00, MD4S01); + MD4_STEP (MD4_Fo, c, d, a, b, w0_t[2], MD4C00, MD4S02); + MD4_STEP (MD4_Fo, b, c, d, a, w0_t[3], MD4C00, MD4S03); + MD4_STEP (MD4_Fo, a, b, c, d, w1_t[0], MD4C00, MD4S00); + MD4_STEP (MD4_Fo, d, a, b, c, w1_t[1], MD4C00, MD4S01); + MD4_STEP (MD4_Fo, c, d, a, b, w1_t[2], MD4C00, MD4S02); + MD4_STEP (MD4_Fo, b, c, d, a, w1_t[3], MD4C00, MD4S03); + MD4_STEP (MD4_Fo, a, b, c, d, w2_t[0], MD4C00, MD4S00); + MD4_STEP (MD4_Fo, d, a, b, c, w2_t[1], MD4C00, MD4S01); + MD4_STEP (MD4_Fo, c, d, a, b, w2_t[2], MD4C00, MD4S02); + MD4_STEP (MD4_Fo, b, c, d, a, w2_t[3], MD4C00, MD4S03); + MD4_STEP (MD4_Fo, a, b, c, d, w3_t[0], MD4C00, MD4S00); + MD4_STEP (MD4_Fo, d, a, b, c, w3_t[1], MD4C00, MD4S01); + MD4_STEP (MD4_Fo, c, d, a, b, w3_t[2], MD4C00, MD4S02); + MD4_STEP (MD4_Fo, b, c, d, a, w3_t[3], MD4C00, MD4S03); + + MD4_STEP (MD4_Go, a, b, c, d, w0_t[0], MD4C01, MD4S10); + MD4_STEP (MD4_Go, d, a, b, c, w1_t[0], MD4C01, MD4S11); + MD4_STEP (MD4_Go, c, d, a, b, w2_t[0], MD4C01, MD4S12); + MD4_STEP (MD4_Go, b, c, d, a, w3_t[0], MD4C01, MD4S13); + MD4_STEP (MD4_Go, a, b, c, d, w0_t[1], MD4C01, MD4S10); + MD4_STEP (MD4_Go, d, a, b, c, w1_t[1], MD4C01, MD4S11); + MD4_STEP (MD4_Go, c, d, a, b, w2_t[1], MD4C01, MD4S12); + MD4_STEP (MD4_Go, b, c, d, a, w3_t[1], MD4C01, MD4S13); + MD4_STEP (MD4_Go, a, b, c, d, w0_t[2], MD4C01, MD4S10); + MD4_STEP (MD4_Go, d, a, b, c, w1_t[2], MD4C01, MD4S11); + MD4_STEP (MD4_Go, c, d, a, b, w2_t[2], MD4C01, MD4S12); + MD4_STEP (MD4_Go, b, c, d, a, w3_t[2], MD4C01, MD4S13); + MD4_STEP (MD4_Go, a, b, c, d, w0_t[3], MD4C01, MD4S10); + MD4_STEP (MD4_Go, d, a, b, c, w1_t[3], MD4C01, MD4S11); + MD4_STEP (MD4_Go, c, d, a, b, w2_t[3], MD4C01, MD4S12); + MD4_STEP (MD4_Go, b, c, d, a, w3_t[3], MD4C01, MD4S13); + + MD4_STEP (MD4_H , a, b, c, d, w0_t[0], MD4C02, MD4S20); + MD4_STEP (MD4_H , d, a, b, c, w2_t[0], MD4C02, MD4S21); + MD4_STEP (MD4_H , c, d, a, b, w1_t[0], MD4C02, MD4S22); + MD4_STEP (MD4_H , b, c, d, a, w3_t[0], MD4C02, MD4S23); + MD4_STEP (MD4_H , a, b, c, d, w0_t[2], MD4C02, MD4S20); + MD4_STEP (MD4_H , d, a, b, c, w2_t[2], MD4C02, MD4S21); + MD4_STEP (MD4_H , c, d, a, b, w1_t[2], MD4C02, MD4S22); + MD4_STEP (MD4_H , b, c, d, a, w3_t[2], MD4C02, MD4S23); + MD4_STEP (MD4_H , a, b, c, d, w0_t[1], MD4C02, MD4S20); + MD4_STEP (MD4_H , d, a, b, c, w2_t[1], MD4C02, MD4S21); + MD4_STEP (MD4_H , c, d, a, b, w1_t[1], MD4C02, MD4S22); + MD4_STEP (MD4_H , b, c, d, a, w3_t[1], MD4C02, MD4S23); + MD4_STEP (MD4_H , a, b, c, d, w0_t[3], MD4C02, MD4S20); + MD4_STEP (MD4_H , d, a, b, c, w2_t[3], MD4C02, MD4S21); + MD4_STEP (MD4_H , c, d, a, b, w1_t[3], MD4C02, MD4S22); + MD4_STEP (MD4_H , b, c, d, a, w3_t[3], MD4C02, MD4S23); + + const u32x r0 = a; + const u32x r1 = d; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_M + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m01100_m08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m01100_m16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m01100_s04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + append_0x80_2 (wordl0, wordl1, pw_l_len); + + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, c_combs[0].pw_len); + } + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[ 1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[ 2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[ 3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[ 4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[ 5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[ 6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[ 7]; + + u32 salt_buf2[4]; + + salt_buf2[0] = salt_bufs[salt_pos].salt_buf[ 8]; + salt_buf2[1] = salt_bufs[salt_pos].salt_buf[ 9]; + salt_buf2[2] = 0; + salt_buf2[3] = 0; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = c_combs[il_pos].pw_len; + + const u32 pw_len = pw_l_len + pw_r_len; + + u32 wordr0[4]; + + wordr0[0] = c_combs[il_pos].i[0]; + wordr0[1] = c_combs[il_pos].i[1]; + wordr0[2] = c_combs[il_pos].i[2]; + wordr0[3] = c_combs[il_pos].i[3]; + + u32 wordr1[4]; + + wordr1[0] = c_combs[il_pos].i[4]; + wordr1[1] = c_combs[il_pos].i[5]; + wordr1[2] = c_combs[il_pos].i[6]; + wordr1[3] = c_combs[il_pos].i[7]; + + u32 wordr2[4]; + + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + + u32 wordr3[4]; + + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + u32x w0[4]; + + w0[0] = wordl0[0] | wordr0[0]; + w0[1] = wordl0[1] | wordr0[1]; + w0[2] = wordl0[2] | wordr0[2]; + w0[3] = wordl0[3] | wordr0[3]; + + u32x w1[4]; + + w1[0] = wordl1[0] | wordr1[0]; + w1[1] = wordl1[1] | wordr1[1]; + w1[2] = wordl1[2] | wordr1[2]; + w1[3] = wordl1[3] | wordr1[3]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + make_unicode (w0, w0_t, w1_t); + make_unicode (w1, w2_t, w3_t); + + w3_t[2] = pw_len * 8 * 2; + + u32x a = MD4M_A; + u32x b = MD4M_B; + u32x c = MD4M_C; + u32x d = MD4M_D; + + MD4_STEP (MD4_Fo, a, b, c, d, w0_t[0], MD4C00, MD4S00); + MD4_STEP (MD4_Fo, d, a, b, c, w0_t[1], MD4C00, MD4S01); + MD4_STEP (MD4_Fo, c, d, a, b, w0_t[2], MD4C00, MD4S02); + MD4_STEP (MD4_Fo, b, c, d, a, w0_t[3], MD4C00, MD4S03); + MD4_STEP (MD4_Fo, a, b, c, d, w1_t[0], MD4C00, MD4S00); + MD4_STEP (MD4_Fo, d, a, b, c, w1_t[1], MD4C00, MD4S01); + MD4_STEP (MD4_Fo, c, d, a, b, w1_t[2], MD4C00, MD4S02); + MD4_STEP (MD4_Fo, b, c, d, a, w1_t[3], MD4C00, MD4S03); + MD4_STEP (MD4_Fo, a, b, c, d, w2_t[0], MD4C00, MD4S00); + MD4_STEP (MD4_Fo, d, a, b, c, w2_t[1], MD4C00, MD4S01); + MD4_STEP (MD4_Fo, c, d, a, b, w2_t[2], MD4C00, MD4S02); + MD4_STEP (MD4_Fo, b, c, d, a, w2_t[3], MD4C00, MD4S03); + MD4_STEP (MD4_Fo, a, b, c, d, w3_t[0], MD4C00, MD4S00); + MD4_STEP (MD4_Fo, d, a, b, c, w3_t[1], MD4C00, MD4S01); + MD4_STEP (MD4_Fo, c, d, a, b, w3_t[2], MD4C00, MD4S02); + MD4_STEP (MD4_Fo, b, c, d, a, w3_t[3], MD4C00, MD4S03); + + MD4_STEP (MD4_Go, a, b, c, d, w0_t[0], MD4C01, MD4S10); + MD4_STEP (MD4_Go, d, a, b, c, w1_t[0], MD4C01, MD4S11); + MD4_STEP (MD4_Go, c, d, a, b, w2_t[0], MD4C01, MD4S12); + MD4_STEP (MD4_Go, b, c, d, a, w3_t[0], MD4C01, MD4S13); + MD4_STEP (MD4_Go, a, b, c, d, w0_t[1], MD4C01, MD4S10); + MD4_STEP (MD4_Go, d, a, b, c, w1_t[1], MD4C01, MD4S11); + MD4_STEP (MD4_Go, c, d, a, b, w2_t[1], MD4C01, MD4S12); + MD4_STEP (MD4_Go, b, c, d, a, w3_t[1], MD4C01, MD4S13); + MD4_STEP (MD4_Go, a, b, c, d, w0_t[2], MD4C01, MD4S10); + MD4_STEP (MD4_Go, d, a, b, c, w1_t[2], MD4C01, MD4S11); + MD4_STEP (MD4_Go, c, d, a, b, w2_t[2], MD4C01, MD4S12); + MD4_STEP (MD4_Go, b, c, d, a, w3_t[2], MD4C01, MD4S13); + MD4_STEP (MD4_Go, a, b, c, d, w0_t[3], MD4C01, MD4S10); + MD4_STEP (MD4_Go, d, a, b, c, w1_t[3], MD4C01, MD4S11); + MD4_STEP (MD4_Go, c, d, a, b, w2_t[3], MD4C01, MD4S12); + MD4_STEP (MD4_Go, b, c, d, a, w3_t[3], MD4C01, MD4S13); + + MD4_STEP (MD4_H , a, b, c, d, w0_t[0], MD4C02, MD4S20); + MD4_STEP (MD4_H , d, a, b, c, w2_t[0], MD4C02, MD4S21); + MD4_STEP (MD4_H , c, d, a, b, w1_t[0], MD4C02, MD4S22); + MD4_STEP (MD4_H , b, c, d, a, w3_t[0], MD4C02, MD4S23); + MD4_STEP (MD4_H , a, b, c, d, w0_t[2], MD4C02, MD4S20); + MD4_STEP (MD4_H , d, a, b, c, w2_t[2], MD4C02, MD4S21); + MD4_STEP (MD4_H , c, d, a, b, w1_t[2], MD4C02, MD4S22); + MD4_STEP (MD4_H , b, c, d, a, w3_t[2], MD4C02, MD4S23); + MD4_STEP (MD4_H , a, b, c, d, w0_t[1], MD4C02, MD4S20); + MD4_STEP (MD4_H , d, a, b, c, w2_t[1], MD4C02, MD4S21); + MD4_STEP (MD4_H , c, d, a, b, w1_t[1], MD4C02, MD4S22); + MD4_STEP (MD4_H , b, c, d, a, w3_t[1], MD4C02, MD4S23); + MD4_STEP (MD4_H , a, b, c, d, w0_t[3], MD4C02, MD4S20); + MD4_STEP (MD4_H , d, a, b, c, w2_t[3], MD4C02, MD4S21); + MD4_STEP (MD4_H , c, d, a, b, w1_t[3], MD4C02, MD4S22); + MD4_STEP (MD4_H , b, c, d, a, w3_t[3], MD4C02, MD4S23); + + a += MD4M_A; + b += MD4M_B; + c += MD4M_C; + d += MD4M_D; + + w0_t[0] = a; + w0_t[1] = b; + w0_t[2] = c; + w0_t[3] = d; + w1_t[0] = salt_buf0[0]; + w1_t[1] = salt_buf0[1]; + w1_t[2] = salt_buf0[2]; + w1_t[3] = salt_buf0[3]; + w2_t[0] = salt_buf1[0]; + w2_t[1] = salt_buf1[1]; + w2_t[2] = salt_buf1[2]; + w2_t[3] = salt_buf1[3]; + w3_t[0] = salt_buf2[0]; + w3_t[1] = salt_buf2[1]; + w3_t[2] = (16 + salt_len) * 8; + w3_t[3] = 0; + + a = MD4M_A; + b = MD4M_B; + c = MD4M_C; + d = MD4M_D; + + MD4_STEP (MD4_Fo, a, b, c, d, w0_t[0], MD4C00, MD4S00); + MD4_STEP (MD4_Fo, d, a, b, c, w0_t[1], MD4C00, MD4S01); + MD4_STEP (MD4_Fo, c, d, a, b, w0_t[2], MD4C00, MD4S02); + MD4_STEP (MD4_Fo, b, c, d, a, w0_t[3], MD4C00, MD4S03); + MD4_STEP (MD4_Fo, a, b, c, d, w1_t[0], MD4C00, MD4S00); + MD4_STEP (MD4_Fo, d, a, b, c, w1_t[1], MD4C00, MD4S01); + MD4_STEP (MD4_Fo, c, d, a, b, w1_t[2], MD4C00, MD4S02); + MD4_STEP (MD4_Fo, b, c, d, a, w1_t[3], MD4C00, MD4S03); + MD4_STEP (MD4_Fo, a, b, c, d, w2_t[0], MD4C00, MD4S00); + MD4_STEP (MD4_Fo, d, a, b, c, w2_t[1], MD4C00, MD4S01); + MD4_STEP (MD4_Fo, c, d, a, b, w2_t[2], MD4C00, MD4S02); + MD4_STEP (MD4_Fo, b, c, d, a, w2_t[3], MD4C00, MD4S03); + MD4_STEP (MD4_Fo, a, b, c, d, w3_t[0], MD4C00, MD4S00); + MD4_STEP (MD4_Fo, d, a, b, c, w3_t[1], MD4C00, MD4S01); + MD4_STEP (MD4_Fo, c, d, a, b, w3_t[2], MD4C00, MD4S02); + MD4_STEP (MD4_Fo, b, c, d, a, w3_t[3], MD4C00, MD4S03); + + MD4_STEP (MD4_Go, a, b, c, d, w0_t[0], MD4C01, MD4S10); + MD4_STEP (MD4_Go, d, a, b, c, w1_t[0], MD4C01, MD4S11); + MD4_STEP (MD4_Go, c, d, a, b, w2_t[0], MD4C01, MD4S12); + MD4_STEP (MD4_Go, b, c, d, a, w3_t[0], MD4C01, MD4S13); + MD4_STEP (MD4_Go, a, b, c, d, w0_t[1], MD4C01, MD4S10); + MD4_STEP (MD4_Go, d, a, b, c, w1_t[1], MD4C01, MD4S11); + MD4_STEP (MD4_Go, c, d, a, b, w2_t[1], MD4C01, MD4S12); + MD4_STEP (MD4_Go, b, c, d, a, w3_t[1], MD4C01, MD4S13); + MD4_STEP (MD4_Go, a, b, c, d, w0_t[2], MD4C01, MD4S10); + MD4_STEP (MD4_Go, d, a, b, c, w1_t[2], MD4C01, MD4S11); + MD4_STEP (MD4_Go, c, d, a, b, w2_t[2], MD4C01, MD4S12); + MD4_STEP (MD4_Go, b, c, d, a, w3_t[2], MD4C01, MD4S13); + MD4_STEP (MD4_Go, a, b, c, d, w0_t[3], MD4C01, MD4S10); + MD4_STEP (MD4_Go, d, a, b, c, w1_t[3], MD4C01, MD4S11); + MD4_STEP (MD4_Go, c, d, a, b, w2_t[3], MD4C01, MD4S12); + MD4_STEP (MD4_Go, b, c, d, a, w3_t[3], MD4C01, MD4S13); + + MD4_STEP (MD4_H , a, b, c, d, w0_t[0], MD4C02, MD4S20); + MD4_STEP (MD4_H , d, a, b, c, w2_t[0], MD4C02, MD4S21); + MD4_STEP (MD4_H , c, d, a, b, w1_t[0], MD4C02, MD4S22); + MD4_STEP (MD4_H , b, c, d, a, w3_t[0], MD4C02, MD4S23); + MD4_STEP (MD4_H , a, b, c, d, w0_t[2], MD4C02, MD4S20); + MD4_STEP (MD4_H , d, a, b, c, w2_t[2], MD4C02, MD4S21); + MD4_STEP (MD4_H , c, d, a, b, w1_t[2], MD4C02, MD4S22); + MD4_STEP (MD4_H , b, c, d, a, w3_t[2], MD4C02, MD4S23); + MD4_STEP (MD4_H , a, b, c, d, w0_t[1], MD4C02, MD4S20); + MD4_STEP (MD4_H , d, a, b, c, w2_t[1], MD4C02, MD4S21); + MD4_STEP (MD4_H , c, d, a, b, w1_t[1], MD4C02, MD4S22); + MD4_STEP (MD4_H , b, c, d, a, w3_t[1], MD4C02, MD4S23); + MD4_STEP (MD4_H , a, b, c, d, w0_t[3], MD4C02, MD4S20); + + bool q_cond = (search[0] != a); + + if (q_cond) continue; + + MD4_STEP (MD4_H , d, a, b, c, w2_t[3], MD4C02, MD4S21); + MD4_STEP (MD4_H , c, d, a, b, w1_t[3], MD4C02, MD4S22); + MD4_STEP (MD4_H , b, c, d, a, w3_t[3], MD4C02, MD4S23); + + const u32x r0 = a; + const u32x r1 = d; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_S + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m01100_s08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m01100_s16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/nv/m01100_a3.cu b/nv/m01100_a3.cu new file mode 100644 index 0000000000..c6d2be4c93 --- /dev/null +++ b/nv/m01100_a3.cu @@ -0,0 +1,727 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _MD4_ +#define _SCALAR_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW2 +#define VECT_SIZE4 +#endif + +#define DGST_R0 0 +#define DGST_R1 3 +#define DGST_R2 2 +#define DGST_R3 1 + +#include "include/kernel_functions.c" +#include "types_nv.c" +#include "common_nv.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4_warp.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4_warp.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4_warp.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4_warp.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4_warp.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4_warp.c" +#endif + +__device__ __constant__ u32x c_bfs[1024]; + +__device__ static void m01100m (u32 w[16], const u32 pw_len, const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const u32x *words_buf_r, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset) +{ + /** + * modifier + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + const u32 lid = threadIdx.x; + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[ 1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[ 2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[ 3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[ 4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[ 5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[ 6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[ 7]; + + u32 salt_buf2[4]; + + salt_buf2[0] = salt_bufs[salt_pos].salt_buf[ 8]; + salt_buf2[1] = salt_bufs[salt_pos].salt_buf[ 9]; + salt_buf2[2] = 0; + salt_buf2[3] = 0; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + /** + * base + */ + + const u32 F_w0c00 = 0 + MD4C00; + const u32 F_w1c00 = w[ 1] + MD4C00; + const u32 F_w2c00 = w[ 2] + MD4C00; + const u32 F_w3c00 = w[ 3] + MD4C00; + const u32 F_w4c00 = w[ 4] + MD4C00; + const u32 F_w5c00 = w[ 5] + MD4C00; + const u32 F_w6c00 = w[ 6] + MD4C00; + const u32 F_w7c00 = w[ 7] + MD4C00; + const u32 F_w8c00 = w[ 8] + MD4C00; + const u32 F_w9c00 = w[ 9] + MD4C00; + const u32 F_wac00 = w[10] + MD4C00; + const u32 F_wbc00 = w[11] + MD4C00; + const u32 F_wcc00 = w[12] + MD4C00; + const u32 F_wdc00 = w[13] + MD4C00; + const u32 F_wec00 = w[14] + MD4C00; + const u32 F_wfc00 = w[15] + MD4C00; + + const u32 G_w0c01 = 0 + MD4C01; + const u32 G_w4c01 = w[ 4] + MD4C01; + const u32 G_w8c01 = w[ 8] + MD4C01; + const u32 G_wcc01 = w[12] + MD4C01; + const u32 G_w1c01 = w[ 1] + MD4C01; + const u32 G_w5c01 = w[ 5] + MD4C01; + const u32 G_w9c01 = w[ 9] + MD4C01; + const u32 G_wdc01 = w[13] + MD4C01; + const u32 G_w2c01 = w[ 2] + MD4C01; + const u32 G_w6c01 = w[ 6] + MD4C01; + const u32 G_wac01 = w[10] + MD4C01; + const u32 G_wec01 = w[14] + MD4C01; + const u32 G_w3c01 = w[ 3] + MD4C01; + const u32 G_w7c01 = w[ 7] + MD4C01; + const u32 G_wbc01 = w[11] + MD4C01; + const u32 G_wfc01 = w[15] + MD4C01; + + const u32 H_w0c02 = 0 + MD4C02; + const u32 H_w8c02 = w[ 8] + MD4C02; + const u32 H_w4c02 = w[ 4] + MD4C02; + const u32 H_wcc02 = w[12] + MD4C02; + const u32 H_w2c02 = w[ 2] + MD4C02; + const u32 H_wac02 = w[10] + MD4C02; + const u32 H_w6c02 = w[ 6] + MD4C02; + const u32 H_wec02 = w[14] + MD4C02; + const u32 H_w1c02 = w[ 1] + MD4C02; + const u32 H_w9c02 = w[ 9] + MD4C02; + const u32 H_w5c02 = w[ 5] + MD4C02; + const u32 H_wdc02 = w[13] + MD4C02; + const u32 H_w3c02 = w[ 3] + MD4C02; + const u32 H_wbc02 = w[11] + MD4C02; + const u32 H_w7c02 = w[ 7] + MD4C02; + const u32 H_wfc02 = w[15] + MD4C02; + + /** + * loop + */ + + const u32 bf_loops = ceil ((float) bfs_cnt / VECT_DIV); + + u32x w0l = w[0]; + + for (u32 il_pos = 0; il_pos < bf_loops; il_pos++) + { + const u32x w0r = c_bfs[il_pos]; + + const u32x w0 = w0l | w0r; + + u32x a = MD4M_A; + u32x b = MD4M_B; + u32x c = MD4M_C; + u32x d = MD4M_D; + + MD4_STEP (MD4_Fo, a, b, c, d, w0, F_w0c00, MD4S00); + MD4_STEP0(MD4_Fo, d, a, b, c, F_w1c00, MD4S01); + MD4_STEP0(MD4_Fo, c, d, a, b, F_w2c00, MD4S02); + MD4_STEP0(MD4_Fo, b, c, d, a, F_w3c00, MD4S03); + MD4_STEP0(MD4_Fo, a, b, c, d, F_w4c00, MD4S00); + MD4_STEP0(MD4_Fo, d, a, b, c, F_w5c00, MD4S01); + MD4_STEP0(MD4_Fo, c, d, a, b, F_w6c00, MD4S02); + MD4_STEP0(MD4_Fo, b, c, d, a, F_w7c00, MD4S03); + MD4_STEP0(MD4_Fo, a, b, c, d, F_w8c00, MD4S00); + MD4_STEP0(MD4_Fo, d, a, b, c, F_w9c00, MD4S01); + MD4_STEP0(MD4_Fo, c, d, a, b, F_wac00, MD4S02); + MD4_STEP0(MD4_Fo, b, c, d, a, F_wbc00, MD4S03); + MD4_STEP0(MD4_Fo, a, b, c, d, F_wcc00, MD4S00); + MD4_STEP0(MD4_Fo, d, a, b, c, F_wdc00, MD4S01); + MD4_STEP0(MD4_Fo, c, d, a, b, F_wec00, MD4S02); + MD4_STEP0(MD4_Fo, b, c, d, a, F_wfc00, MD4S03); + + MD4_STEP (MD4_Go, a, b, c, d, w0, G_w0c01, MD4S10); + MD4_STEP0(MD4_Go, d, a, b, c, G_w4c01, MD4S11); + MD4_STEP0(MD4_Go, c, d, a, b, G_w8c01, MD4S12); + MD4_STEP0(MD4_Go, b, c, d, a, G_wcc01, MD4S13); + MD4_STEP0(MD4_Go, a, b, c, d, G_w1c01, MD4S10); + MD4_STEP0(MD4_Go, d, a, b, c, G_w5c01, MD4S11); + MD4_STEP0(MD4_Go, c, d, a, b, G_w9c01, MD4S12); + MD4_STEP0(MD4_Go, b, c, d, a, G_wdc01, MD4S13); + MD4_STEP0(MD4_Go, a, b, c, d, G_w2c01, MD4S10); + MD4_STEP0(MD4_Go, d, a, b, c, G_w6c01, MD4S11); + MD4_STEP0(MD4_Go, c, d, a, b, G_wac01, MD4S12); + MD4_STEP0(MD4_Go, b, c, d, a, G_wec01, MD4S13); + MD4_STEP0(MD4_Go, a, b, c, d, G_w3c01, MD4S10); + MD4_STEP0(MD4_Go, d, a, b, c, G_w7c01, MD4S11); + MD4_STEP0(MD4_Go, c, d, a, b, G_wbc01, MD4S12); + MD4_STEP0(MD4_Go, b, c, d, a, G_wfc01, MD4S13); + + MD4_STEP (MD4_H , a, b, c, d, w0, H_w0c02, MD4S20); + MD4_STEP0(MD4_H , d, a, b, c, H_w8c02, MD4S21); + MD4_STEP0(MD4_H , c, d, a, b, H_w4c02, MD4S22); + MD4_STEP0(MD4_H , b, c, d, a, H_wcc02, MD4S23); + MD4_STEP0(MD4_H , a, b, c, d, H_w2c02, MD4S20); + MD4_STEP0(MD4_H , d, a, b, c, H_wac02, MD4S21); + MD4_STEP0(MD4_H , c, d, a, b, H_w6c02, MD4S22); + MD4_STEP0(MD4_H , b, c, d, a, H_wec02, MD4S23); + MD4_STEP0(MD4_H , a, b, c, d, H_w1c02, MD4S20); + MD4_STEP0(MD4_H , d, a, b, c, H_w9c02, MD4S21); + MD4_STEP0(MD4_H , c, d, a, b, H_w5c02, MD4S22); + MD4_STEP0(MD4_H , b, c, d, a, H_wdc02, MD4S23); + MD4_STEP0(MD4_H , a, b, c, d, H_w3c02, MD4S20); + MD4_STEP0(MD4_H , d, a, b, c, H_wbc02, MD4S21); + MD4_STEP0(MD4_H , c, d, a, b, H_w7c02, MD4S22); + MD4_STEP0(MD4_H , b, c, d, a, H_wfc02, MD4S23); + + a += MD4M_A; + b += MD4M_B; + c += MD4M_C; + d += MD4M_D; + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + w0_t[0] = a; + w0_t[1] = b; + w0_t[2] = c; + w0_t[3] = d; + w1_t[0] = salt_buf0[0]; + w1_t[1] = salt_buf0[1]; + w1_t[2] = salt_buf0[2]; + w1_t[3] = salt_buf0[3]; + w2_t[0] = salt_buf1[0]; + w2_t[1] = salt_buf1[1]; + w2_t[2] = salt_buf1[2]; + w2_t[3] = salt_buf1[3]; + w3_t[0] = salt_buf2[0]; + w3_t[1] = salt_buf2[1]; + w3_t[2] = (16 + salt_len) * 8; + w3_t[3] = 0; + + a = MD4M_A; + b = MD4M_B; + c = MD4M_C; + d = MD4M_D; + + MD4_STEP (MD4_Fo, a, b, c, d, w0_t[0], MD4C00, MD4S00); + MD4_STEP (MD4_Fo, d, a, b, c, w0_t[1], MD4C00, MD4S01); + MD4_STEP (MD4_Fo, c, d, a, b, w0_t[2], MD4C00, MD4S02); + MD4_STEP (MD4_Fo, b, c, d, a, w0_t[3], MD4C00, MD4S03); + MD4_STEP (MD4_Fo, a, b, c, d, w1_t[0], MD4C00, MD4S00); + MD4_STEP (MD4_Fo, d, a, b, c, w1_t[1], MD4C00, MD4S01); + MD4_STEP (MD4_Fo, c, d, a, b, w1_t[2], MD4C00, MD4S02); + MD4_STEP (MD4_Fo, b, c, d, a, w1_t[3], MD4C00, MD4S03); + MD4_STEP (MD4_Fo, a, b, c, d, w2_t[0], MD4C00, MD4S00); + MD4_STEP (MD4_Fo, d, a, b, c, w2_t[1], MD4C00, MD4S01); + MD4_STEP (MD4_Fo, c, d, a, b, w2_t[2], MD4C00, MD4S02); + MD4_STEP (MD4_Fo, b, c, d, a, w2_t[3], MD4C00, MD4S03); + MD4_STEP (MD4_Fo, a, b, c, d, w3_t[0], MD4C00, MD4S00); + MD4_STEP (MD4_Fo, d, a, b, c, w3_t[1], MD4C00, MD4S01); + MD4_STEP (MD4_Fo, c, d, a, b, w3_t[2], MD4C00, MD4S02); + MD4_STEP (MD4_Fo, b, c, d, a, w3_t[3], MD4C00, MD4S03); + + MD4_STEP (MD4_Go, a, b, c, d, w0_t[0], MD4C01, MD4S10); + MD4_STEP (MD4_Go, d, a, b, c, w1_t[0], MD4C01, MD4S11); + MD4_STEP (MD4_Go, c, d, a, b, w2_t[0], MD4C01, MD4S12); + MD4_STEP (MD4_Go, b, c, d, a, w3_t[0], MD4C01, MD4S13); + MD4_STEP (MD4_Go, a, b, c, d, w0_t[1], MD4C01, MD4S10); + MD4_STEP (MD4_Go, d, a, b, c, w1_t[1], MD4C01, MD4S11); + MD4_STEP (MD4_Go, c, d, a, b, w2_t[1], MD4C01, MD4S12); + MD4_STEP (MD4_Go, b, c, d, a, w3_t[1], MD4C01, MD4S13); + MD4_STEP (MD4_Go, a, b, c, d, w0_t[2], MD4C01, MD4S10); + MD4_STEP (MD4_Go, d, a, b, c, w1_t[2], MD4C01, MD4S11); + MD4_STEP (MD4_Go, c, d, a, b, w2_t[2], MD4C01, MD4S12); + MD4_STEP (MD4_Go, b, c, d, a, w3_t[2], MD4C01, MD4S13); + MD4_STEP (MD4_Go, a, b, c, d, w0_t[3], MD4C01, MD4S10); + MD4_STEP (MD4_Go, d, a, b, c, w1_t[3], MD4C01, MD4S11); + MD4_STEP (MD4_Go, c, d, a, b, w2_t[3], MD4C01, MD4S12); + MD4_STEP (MD4_Go, b, c, d, a, w3_t[3], MD4C01, MD4S13); + + MD4_STEP (MD4_H , a, b, c, d, w0_t[0], MD4C02, MD4S20); + MD4_STEP (MD4_H , d, a, b, c, w2_t[0], MD4C02, MD4S21); + MD4_STEP (MD4_H , c, d, a, b, w1_t[0], MD4C02, MD4S22); + MD4_STEP (MD4_H , b, c, d, a, w3_t[0], MD4C02, MD4S23); + MD4_STEP (MD4_H , a, b, c, d, w0_t[2], MD4C02, MD4S20); + MD4_STEP (MD4_H , d, a, b, c, w2_t[2], MD4C02, MD4S21); + MD4_STEP (MD4_H , c, d, a, b, w1_t[2], MD4C02, MD4S22); + MD4_STEP (MD4_H , b, c, d, a, w3_t[2], MD4C02, MD4S23); + MD4_STEP (MD4_H , a, b, c, d, w0_t[1], MD4C02, MD4S20); + MD4_STEP (MD4_H , d, a, b, c, w2_t[1], MD4C02, MD4S21); + MD4_STEP (MD4_H , c, d, a, b, w1_t[1], MD4C02, MD4S22); + MD4_STEP (MD4_H , b, c, d, a, w3_t[1], MD4C02, MD4S23); + MD4_STEP (MD4_H , a, b, c, d, w0_t[3], MD4C02, MD4S20); + MD4_STEP (MD4_H , d, a, b, c, w2_t[3], MD4C02, MD4S21); + MD4_STEP (MD4_H , c, d, a, b, w1_t[3], MD4C02, MD4S22); + MD4_STEP (MD4_H , b, c, d, a, w3_t[3], MD4C02, MD4S23); + + const u32x r0 = a; + const u32x r1 = d; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_M + } +} + +__device__ static void m01100s (u32 w[16], const u32 pw_len, const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const u32x *words_buf_r, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset) +{ + /** + * modifier + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + const u32 lid = threadIdx.x; + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[ 1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[ 2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[ 3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[ 4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[ 5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[ 6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[ 7]; + + u32 salt_buf2[4]; + + salt_buf2[0] = salt_bufs[salt_pos].salt_buf[ 8]; + salt_buf2[1] = salt_bufs[salt_pos].salt_buf[ 9]; + salt_buf2[2] = 0; + salt_buf2[3] = 0; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + /** + * base + */ + + const u32 F_w0c00 = 0 + MD4C00; + const u32 F_w1c00 = w[ 1] + MD4C00; + const u32 F_w2c00 = w[ 2] + MD4C00; + const u32 F_w3c00 = w[ 3] + MD4C00; + const u32 F_w4c00 = w[ 4] + MD4C00; + const u32 F_w5c00 = w[ 5] + MD4C00; + const u32 F_w6c00 = w[ 6] + MD4C00; + const u32 F_w7c00 = w[ 7] + MD4C00; + const u32 F_w8c00 = w[ 8] + MD4C00; + const u32 F_w9c00 = w[ 9] + MD4C00; + const u32 F_wac00 = w[10] + MD4C00; + const u32 F_wbc00 = w[11] + MD4C00; + const u32 F_wcc00 = w[12] + MD4C00; + const u32 F_wdc00 = w[13] + MD4C00; + const u32 F_wec00 = w[14] + MD4C00; + const u32 F_wfc00 = w[15] + MD4C00; + + const u32 G_w0c01 = 0 + MD4C01; + const u32 G_w4c01 = w[ 4] + MD4C01; + const u32 G_w8c01 = w[ 8] + MD4C01; + const u32 G_wcc01 = w[12] + MD4C01; + const u32 G_w1c01 = w[ 1] + MD4C01; + const u32 G_w5c01 = w[ 5] + MD4C01; + const u32 G_w9c01 = w[ 9] + MD4C01; + const u32 G_wdc01 = w[13] + MD4C01; + const u32 G_w2c01 = w[ 2] + MD4C01; + const u32 G_w6c01 = w[ 6] + MD4C01; + const u32 G_wac01 = w[10] + MD4C01; + const u32 G_wec01 = w[14] + MD4C01; + const u32 G_w3c01 = w[ 3] + MD4C01; + const u32 G_w7c01 = w[ 7] + MD4C01; + const u32 G_wbc01 = w[11] + MD4C01; + const u32 G_wfc01 = w[15] + MD4C01; + + const u32 H_w0c02 = 0 + MD4C02; + const u32 H_w8c02 = w[ 8] + MD4C02; + const u32 H_w4c02 = w[ 4] + MD4C02; + const u32 H_wcc02 = w[12] + MD4C02; + const u32 H_w2c02 = w[ 2] + MD4C02; + const u32 H_wac02 = w[10] + MD4C02; + const u32 H_w6c02 = w[ 6] + MD4C02; + const u32 H_wec02 = w[14] + MD4C02; + const u32 H_w1c02 = w[ 1] + MD4C02; + const u32 H_w9c02 = w[ 9] + MD4C02; + const u32 H_w5c02 = w[ 5] + MD4C02; + const u32 H_wdc02 = w[13] + MD4C02; + const u32 H_w3c02 = w[ 3] + MD4C02; + const u32 H_wbc02 = w[11] + MD4C02; + const u32 H_w7c02 = w[ 7] + MD4C02; + const u32 H_wfc02 = w[15] + MD4C02; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * loop + */ + + const u32 bf_loops = ceil ((float) bfs_cnt / VECT_DIV); + + u32x w0l = w[0]; + + for (u32 il_pos = 0; il_pos < bf_loops; il_pos++) + { + const u32x w0r = c_bfs[il_pos]; + + const u32x w0 = w0l | w0r; + + u32x a = MD4M_A; + u32x b = MD4M_B; + u32x c = MD4M_C; + u32x d = MD4M_D; + + MD4_STEP (MD4_Fo, a, b, c, d, w0, F_w0c00, MD4S00); + MD4_STEP0(MD4_Fo, d, a, b, c, F_w1c00, MD4S01); + MD4_STEP0(MD4_Fo, c, d, a, b, F_w2c00, MD4S02); + MD4_STEP0(MD4_Fo, b, c, d, a, F_w3c00, MD4S03); + MD4_STEP0(MD4_Fo, a, b, c, d, F_w4c00, MD4S00); + MD4_STEP0(MD4_Fo, d, a, b, c, F_w5c00, MD4S01); + MD4_STEP0(MD4_Fo, c, d, a, b, F_w6c00, MD4S02); + MD4_STEP0(MD4_Fo, b, c, d, a, F_w7c00, MD4S03); + MD4_STEP0(MD4_Fo, a, b, c, d, F_w8c00, MD4S00); + MD4_STEP0(MD4_Fo, d, a, b, c, F_w9c00, MD4S01); + MD4_STEP0(MD4_Fo, c, d, a, b, F_wac00, MD4S02); + MD4_STEP0(MD4_Fo, b, c, d, a, F_wbc00, MD4S03); + MD4_STEP0(MD4_Fo, a, b, c, d, F_wcc00, MD4S00); + MD4_STEP0(MD4_Fo, d, a, b, c, F_wdc00, MD4S01); + MD4_STEP0(MD4_Fo, c, d, a, b, F_wec00, MD4S02); + MD4_STEP0(MD4_Fo, b, c, d, a, F_wfc00, MD4S03); + + MD4_STEP (MD4_Go, a, b, c, d, w0, G_w0c01, MD4S10); + MD4_STEP0(MD4_Go, d, a, b, c, G_w4c01, MD4S11); + MD4_STEP0(MD4_Go, c, d, a, b, G_w8c01, MD4S12); + MD4_STEP0(MD4_Go, b, c, d, a, G_wcc01, MD4S13); + MD4_STEP0(MD4_Go, a, b, c, d, G_w1c01, MD4S10); + MD4_STEP0(MD4_Go, d, a, b, c, G_w5c01, MD4S11); + MD4_STEP0(MD4_Go, c, d, a, b, G_w9c01, MD4S12); + MD4_STEP0(MD4_Go, b, c, d, a, G_wdc01, MD4S13); + MD4_STEP0(MD4_Go, a, b, c, d, G_w2c01, MD4S10); + MD4_STEP0(MD4_Go, d, a, b, c, G_w6c01, MD4S11); + MD4_STEP0(MD4_Go, c, d, a, b, G_wac01, MD4S12); + MD4_STEP0(MD4_Go, b, c, d, a, G_wec01, MD4S13); + MD4_STEP0(MD4_Go, a, b, c, d, G_w3c01, MD4S10); + MD4_STEP0(MD4_Go, d, a, b, c, G_w7c01, MD4S11); + MD4_STEP0(MD4_Go, c, d, a, b, G_wbc01, MD4S12); + MD4_STEP0(MD4_Go, b, c, d, a, G_wfc01, MD4S13); + + MD4_STEP (MD4_H , a, b, c, d, w0, H_w0c02, MD4S20); + MD4_STEP0(MD4_H , d, a, b, c, H_w8c02, MD4S21); + MD4_STEP0(MD4_H , c, d, a, b, H_w4c02, MD4S22); + MD4_STEP0(MD4_H , b, c, d, a, H_wcc02, MD4S23); + MD4_STEP0(MD4_H , a, b, c, d, H_w2c02, MD4S20); + MD4_STEP0(MD4_H , d, a, b, c, H_wac02, MD4S21); + MD4_STEP0(MD4_H , c, d, a, b, H_w6c02, MD4S22); + MD4_STEP0(MD4_H , b, c, d, a, H_wec02, MD4S23); + MD4_STEP0(MD4_H , a, b, c, d, H_w1c02, MD4S20); + MD4_STEP0(MD4_H , d, a, b, c, H_w9c02, MD4S21); + MD4_STEP0(MD4_H , c, d, a, b, H_w5c02, MD4S22); + MD4_STEP0(MD4_H , b, c, d, a, H_wdc02, MD4S23); + MD4_STEP0(MD4_H , a, b, c, d, H_w3c02, MD4S20); + MD4_STEP0(MD4_H , d, a, b, c, H_wbc02, MD4S21); + MD4_STEP0(MD4_H , c, d, a, b, H_w7c02, MD4S22); + MD4_STEP0(MD4_H , b, c, d, a, H_wfc02, MD4S23); + + a += MD4M_A; + b += MD4M_B; + c += MD4M_C; + d += MD4M_D; + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + w0_t[0] = a; + w0_t[1] = b; + w0_t[2] = c; + w0_t[3] = d; + w1_t[0] = salt_buf0[0]; + w1_t[1] = salt_buf0[1]; + w1_t[2] = salt_buf0[2]; + w1_t[3] = salt_buf0[3]; + w2_t[0] = salt_buf1[0]; + w2_t[1] = salt_buf1[1]; + w2_t[2] = salt_buf1[2]; + w2_t[3] = salt_buf1[3]; + w3_t[0] = salt_buf2[0]; + w3_t[1] = salt_buf2[1]; + w3_t[2] = (16 + salt_len) * 8; + w3_t[3] = 0; + + a = MD4M_A; + b = MD4M_B; + c = MD4M_C; + d = MD4M_D; + + MD4_STEP (MD4_Fo, a, b, c, d, w0_t[0], MD4C00, MD4S00); + MD4_STEP (MD4_Fo, d, a, b, c, w0_t[1], MD4C00, MD4S01); + MD4_STEP (MD4_Fo, c, d, a, b, w0_t[2], MD4C00, MD4S02); + MD4_STEP (MD4_Fo, b, c, d, a, w0_t[3], MD4C00, MD4S03); + MD4_STEP (MD4_Fo, a, b, c, d, w1_t[0], MD4C00, MD4S00); + MD4_STEP (MD4_Fo, d, a, b, c, w1_t[1], MD4C00, MD4S01); + MD4_STEP (MD4_Fo, c, d, a, b, w1_t[2], MD4C00, MD4S02); + MD4_STEP (MD4_Fo, b, c, d, a, w1_t[3], MD4C00, MD4S03); + MD4_STEP (MD4_Fo, a, b, c, d, w2_t[0], MD4C00, MD4S00); + MD4_STEP (MD4_Fo, d, a, b, c, w2_t[1], MD4C00, MD4S01); + MD4_STEP (MD4_Fo, c, d, a, b, w2_t[2], MD4C00, MD4S02); + MD4_STEP (MD4_Fo, b, c, d, a, w2_t[3], MD4C00, MD4S03); + MD4_STEP (MD4_Fo, a, b, c, d, w3_t[0], MD4C00, MD4S00); + MD4_STEP (MD4_Fo, d, a, b, c, w3_t[1], MD4C00, MD4S01); + MD4_STEP (MD4_Fo, c, d, a, b, w3_t[2], MD4C00, MD4S02); + MD4_STEP (MD4_Fo, b, c, d, a, w3_t[3], MD4C00, MD4S03); + + MD4_STEP (MD4_Go, a, b, c, d, w0_t[0], MD4C01, MD4S10); + MD4_STEP (MD4_Go, d, a, b, c, w1_t[0], MD4C01, MD4S11); + MD4_STEP (MD4_Go, c, d, a, b, w2_t[0], MD4C01, MD4S12); + MD4_STEP (MD4_Go, b, c, d, a, w3_t[0], MD4C01, MD4S13); + MD4_STEP (MD4_Go, a, b, c, d, w0_t[1], MD4C01, MD4S10); + MD4_STEP (MD4_Go, d, a, b, c, w1_t[1], MD4C01, MD4S11); + MD4_STEP (MD4_Go, c, d, a, b, w2_t[1], MD4C01, MD4S12); + MD4_STEP (MD4_Go, b, c, d, a, w3_t[1], MD4C01, MD4S13); + MD4_STEP (MD4_Go, a, b, c, d, w0_t[2], MD4C01, MD4S10); + MD4_STEP (MD4_Go, d, a, b, c, w1_t[2], MD4C01, MD4S11); + MD4_STEP (MD4_Go, c, d, a, b, w2_t[2], MD4C01, MD4S12); + MD4_STEP (MD4_Go, b, c, d, a, w3_t[2], MD4C01, MD4S13); + MD4_STEP (MD4_Go, a, b, c, d, w0_t[3], MD4C01, MD4S10); + MD4_STEP (MD4_Go, d, a, b, c, w1_t[3], MD4C01, MD4S11); + MD4_STEP (MD4_Go, c, d, a, b, w2_t[3], MD4C01, MD4S12); + MD4_STEP (MD4_Go, b, c, d, a, w3_t[3], MD4C01, MD4S13); + + MD4_STEP (MD4_H , a, b, c, d, w0_t[0], MD4C02, MD4S20); + MD4_STEP (MD4_H , d, a, b, c, w2_t[0], MD4C02, MD4S21); + MD4_STEP (MD4_H , c, d, a, b, w1_t[0], MD4C02, MD4S22); + MD4_STEP (MD4_H , b, c, d, a, w3_t[0], MD4C02, MD4S23); + MD4_STEP (MD4_H , a, b, c, d, w0_t[2], MD4C02, MD4S20); + MD4_STEP (MD4_H , d, a, b, c, w2_t[2], MD4C02, MD4S21); + MD4_STEP (MD4_H , c, d, a, b, w1_t[2], MD4C02, MD4S22); + MD4_STEP (MD4_H , b, c, d, a, w3_t[2], MD4C02, MD4S23); + MD4_STEP (MD4_H , a, b, c, d, w0_t[1], MD4C02, MD4S20); + MD4_STEP (MD4_H , d, a, b, c, w2_t[1], MD4C02, MD4S21); + MD4_STEP (MD4_H , c, d, a, b, w1_t[1], MD4C02, MD4S22); + MD4_STEP (MD4_H , b, c, d, a, w3_t[1], MD4C02, MD4S23); + MD4_STEP (MD4_H , a, b, c, d, w0_t[3], MD4C02, MD4S20); + + bool q_cond = (search[0] != a); + + if (q_cond) continue; + + MD4_STEP (MD4_H , d, a, b, c, w2_t[3], MD4C02, MD4S21); + MD4_STEP (MD4_H , c, d, a, b, w1_t[3], MD4C02, MD4S22); + MD4_STEP (MD4_H , b, c, d, a, w3_t[3], MD4C02, MD4S23); + + const u32x r0 = a; + const u32x r1 = d; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_S + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m01100_m04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const u32x *words_buf_r, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32 w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = 0; + w[ 5] = 0; + w[ 6] = 0; + w[ 7] = 0; + w[ 8] = 0; + w[ 9] = 0; + w[10] = 0; + w[11] = 0; + w[12] = 0; + w[13] = 0; + w[14] = pws[gid].i[14]; + w[15] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m01100m (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m01100_m08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const u32x *words_buf_r, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32 w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = pws[gid].i[ 4]; + w[ 5] = pws[gid].i[ 5]; + w[ 6] = pws[gid].i[ 6]; + w[ 7] = pws[gid].i[ 7]; + w[ 8] = 0; + w[ 9] = 0; + w[10] = 0; + w[11] = 0; + w[12] = 0; + w[13] = 0; + w[14] = pws[gid].i[14]; + w[15] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m01100m (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m01100_m16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const u32x *words_buf_r, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m01100_s04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const u32x *words_buf_r, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32 w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = 0; + w[ 5] = 0; + w[ 6] = 0; + w[ 7] = 0; + w[ 8] = 0; + w[ 9] = 0; + w[10] = 0; + w[11] = 0; + w[12] = 0; + w[13] = 0; + w[14] = pws[gid].i[14]; + w[15] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m01100s (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m01100_s08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const u32x *words_buf_r, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32 w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = pws[gid].i[ 4]; + w[ 5] = pws[gid].i[ 5]; + w[ 6] = pws[gid].i[ 6]; + w[ 7] = pws[gid].i[ 7]; + w[ 8] = 0; + w[ 9] = 0; + w[10] = 0; + w[11] = 0; + w[12] = 0; + w[13] = 0; + w[14] = pws[gid].i[14]; + w[15] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m01100s (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m01100_s16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const u32x *words_buf_r, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/nv/m01400_a0.cu b/nv/m01400_a0.cu new file mode 100644 index 0000000000..2e6f5c59f1 --- /dev/null +++ b/nv/m01400_a0.cu @@ -0,0 +1,429 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _SHA256_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW2 +#define VECT_SIZE1 +#endif + +#define DGST_R0 3 +#define DGST_R1 7 +#define DGST_R2 2 +#define DGST_R3 6 + +#include "include/kernel_functions.c" +#include "types_nv.c" +#include "common_nv.c" +#include "include/rp_gpu.h" +#include "rp_nv.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +__device__ __constant__ gpu_rule_t c_rules[1024]; + +extern "C" __global__ void __launch_bounds__ (256, 1) m01400_m04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + u32x pw_buf1[4]; + + pw_buf1[0] = pws[gid].i[ 4]; + pw_buf1[1] = pws[gid].i[ 5]; + pw_buf1[2] = pws[gid].i[ 6]; + pw_buf1[3] = pws[gid].i[ 7]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + + w0[0] = pw_buf0[0]; + w0[1] = pw_buf0[1]; + w0[2] = pw_buf0[2]; + w0[3] = pw_buf0[3]; + + u32x w1[4]; + + w1[0] = pw_buf1[0]; + w1[1] = pw_buf1[1]; + w1[2] = pw_buf1[2]; + w1[3] = pw_buf1[3]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 out_len = apply_rules (c_rules[il_pos].cmds, w0, w1, pw_len); + + append_0x80_2 (w0, w1, out_len); + + /** + * SHA256 + */ + + u32x w0_t = swap_workaround (w0[0]); + u32x w1_t = swap_workaround (w0[1]); + u32x w2_t = swap_workaround (w0[2]); + u32x w3_t = swap_workaround (w0[3]); + u32x w4_t = swap_workaround (w1[0]); + u32x w5_t = swap_workaround (w1[1]); + u32x w6_t = swap_workaround (w1[2]); + u32x w7_t = swap_workaround (w1[3]); + u32x w8_t = 0; + u32x w9_t = 0; + u32x wa_t = 0; + u32x wb_t = 0; + u32x wc_t = 0; + u32x wd_t = 0; + u32x we_t = 0; + u32x wf_t = out_len * 8; + + u32x a = SHA256M_A; + u32x b = SHA256M_B; + u32x c = SHA256M_C; + u32x d = SHA256M_D; + u32x e = SHA256M_E; + u32x f = SHA256M_F; + u32x g = SHA256M_G; + u32x h = SHA256M_H; + + SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C00); + SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C01); + SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C02); + SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C03); + SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C04); + SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C05); + SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C06); + SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C07); + SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C08); + SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C09); + SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C0a); + SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C0b); + SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C0c); + SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C0d); + SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C0e); + SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C0f); + + w0_t = SHA256_EXPAND (we_t, w9_t, w1_t, w0_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C10); + w1_t = SHA256_EXPAND (wf_t, wa_t, w2_t, w1_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C11); + w2_t = SHA256_EXPAND (w0_t, wb_t, w3_t, w2_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C12); + w3_t = SHA256_EXPAND (w1_t, wc_t, w4_t, w3_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C13); + w4_t = SHA256_EXPAND (w2_t, wd_t, w5_t, w4_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C14); + w5_t = SHA256_EXPAND (w3_t, we_t, w6_t, w5_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C15); + w6_t = SHA256_EXPAND (w4_t, wf_t, w7_t, w6_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C16); + w7_t = SHA256_EXPAND (w5_t, w0_t, w8_t, w7_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C17); + w8_t = SHA256_EXPAND (w6_t, w1_t, w9_t, w8_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C18); + w9_t = SHA256_EXPAND (w7_t, w2_t, wa_t, w9_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C19); + wa_t = SHA256_EXPAND (w8_t, w3_t, wb_t, wa_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C1a); + wb_t = SHA256_EXPAND (w9_t, w4_t, wc_t, wb_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C1b); + wc_t = SHA256_EXPAND (wa_t, w5_t, wd_t, wc_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C1c); + wd_t = SHA256_EXPAND (wb_t, w6_t, we_t, wd_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C1d); + we_t = SHA256_EXPAND (wc_t, w7_t, wf_t, we_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C1e); + wf_t = SHA256_EXPAND (wd_t, w8_t, w0_t, wf_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C1f); + + w0_t = SHA256_EXPAND (we_t, w9_t, w1_t, w0_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C20); + w1_t = SHA256_EXPAND (wf_t, wa_t, w2_t, w1_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C21); + w2_t = SHA256_EXPAND (w0_t, wb_t, w3_t, w2_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C22); + w3_t = SHA256_EXPAND (w1_t, wc_t, w4_t, w3_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C23); + w4_t = SHA256_EXPAND (w2_t, wd_t, w5_t, w4_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C24); + w5_t = SHA256_EXPAND (w3_t, we_t, w6_t, w5_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C25); + w6_t = SHA256_EXPAND (w4_t, wf_t, w7_t, w6_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C26); + w7_t = SHA256_EXPAND (w5_t, w0_t, w8_t, w7_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C27); + w8_t = SHA256_EXPAND (w6_t, w1_t, w9_t, w8_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C28); + w9_t = SHA256_EXPAND (w7_t, w2_t, wa_t, w9_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C29); + wa_t = SHA256_EXPAND (w8_t, w3_t, wb_t, wa_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C2a); + wb_t = SHA256_EXPAND (w9_t, w4_t, wc_t, wb_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C2b); + wc_t = SHA256_EXPAND (wa_t, w5_t, wd_t, wc_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C2c); + wd_t = SHA256_EXPAND (wb_t, w6_t, we_t, wd_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C2d); + we_t = SHA256_EXPAND (wc_t, w7_t, wf_t, we_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C2e); + wf_t = SHA256_EXPAND (wd_t, w8_t, w0_t, wf_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C2f); + + w0_t = SHA256_EXPAND (we_t, w9_t, w1_t, w0_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C30); + w1_t = SHA256_EXPAND (wf_t, wa_t, w2_t, w1_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C31); + w2_t = SHA256_EXPAND (w0_t, wb_t, w3_t, w2_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C32); + w3_t = SHA256_EXPAND (w1_t, wc_t, w4_t, w3_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C33); + w4_t = SHA256_EXPAND (w2_t, wd_t, w5_t, w4_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C34); + w5_t = SHA256_EXPAND (w3_t, we_t, w6_t, w5_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C35); + w6_t = SHA256_EXPAND (w4_t, wf_t, w7_t, w6_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C36); + w7_t = SHA256_EXPAND (w5_t, w0_t, w8_t, w7_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C37); + w8_t = SHA256_EXPAND (w6_t, w1_t, w9_t, w8_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C38); + w9_t = SHA256_EXPAND (w7_t, w2_t, wa_t, w9_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C39); + wa_t = SHA256_EXPAND (w8_t, w3_t, wb_t, wa_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C3a); + wb_t = SHA256_EXPAND (w9_t, w4_t, wc_t, wb_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C3b); + wc_t = SHA256_EXPAND (wa_t, w5_t, wd_t, wc_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C3c); + wd_t = SHA256_EXPAND (wb_t, w6_t, we_t, wd_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C3d); + we_t = SHA256_EXPAND (wc_t, w7_t, wf_t, we_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C3e); + wf_t = SHA256_EXPAND (wd_t, w8_t, w0_t, wf_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C3f); + + + const u32x r0 = d; + const u32x r1 = h; + const u32x r2 = c; + const u32x r3 = g; + + #include VECT_COMPARE_M + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m01400_m08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m01400_m16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m01400_s04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + u32x pw_buf1[4]; + + pw_buf1[0] = pws[gid].i[ 4]; + pw_buf1[1] = pws[gid].i[ 5]; + pw_buf1[2] = pws[gid].i[ 6]; + pw_buf1[3] = pws[gid].i[ 7]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3], + }; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + + w0[0] = pw_buf0[0]; + w0[1] = pw_buf0[1]; + w0[2] = pw_buf0[2]; + w0[3] = pw_buf0[3]; + + u32x w1[4]; + + w1[0] = pw_buf1[0]; + w1[1] = pw_buf1[1]; + w1[2] = pw_buf1[2]; + w1[3] = pw_buf1[3]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 out_len = apply_rules (c_rules[il_pos].cmds, w0, w1, pw_len); + + append_0x80_2 (w0, w1, out_len); + + /** + * SHA256 + */ + + u32x w0_t = swap_workaround (w0[0]); + u32x w1_t = swap_workaround (w0[1]); + u32x w2_t = swap_workaround (w0[2]); + u32x w3_t = swap_workaround (w0[3]); + u32x w4_t = swap_workaround (w1[0]); + u32x w5_t = swap_workaround (w1[1]); + u32x w6_t = swap_workaround (w1[2]); + u32x w7_t = swap_workaround (w1[3]); + u32x w8_t = 0; + u32x w9_t = 0; + u32x wa_t = 0; + u32x wb_t = 0; + u32x wc_t = 0; + u32x wd_t = 0; + u32x we_t = 0; + u32x wf_t = out_len * 8; + + u32x a = SHA256M_A; + u32x b = SHA256M_B; + u32x c = SHA256M_C; + u32x d = SHA256M_D; + u32x e = SHA256M_E; + u32x f = SHA256M_F; + u32x g = SHA256M_G; + u32x h = SHA256M_H; + + SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C00); + SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C01); + SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C02); + SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C03); + SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C04); + SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C05); + SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C06); + SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C07); + SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C08); + SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C09); + SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C0a); + SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C0b); + SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C0c); + SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C0d); + SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C0e); + SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C0f); + + w0_t = SHA256_EXPAND (we_t, w9_t, w1_t, w0_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C10); + w1_t = SHA256_EXPAND (wf_t, wa_t, w2_t, w1_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C11); + w2_t = SHA256_EXPAND (w0_t, wb_t, w3_t, w2_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C12); + w3_t = SHA256_EXPAND (w1_t, wc_t, w4_t, w3_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C13); + w4_t = SHA256_EXPAND (w2_t, wd_t, w5_t, w4_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C14); + w5_t = SHA256_EXPAND (w3_t, we_t, w6_t, w5_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C15); + w6_t = SHA256_EXPAND (w4_t, wf_t, w7_t, w6_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C16); + w7_t = SHA256_EXPAND (w5_t, w0_t, w8_t, w7_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C17); + w8_t = SHA256_EXPAND (w6_t, w1_t, w9_t, w8_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C18); + w9_t = SHA256_EXPAND (w7_t, w2_t, wa_t, w9_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C19); + wa_t = SHA256_EXPAND (w8_t, w3_t, wb_t, wa_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C1a); + wb_t = SHA256_EXPAND (w9_t, w4_t, wc_t, wb_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C1b); + wc_t = SHA256_EXPAND (wa_t, w5_t, wd_t, wc_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C1c); + wd_t = SHA256_EXPAND (wb_t, w6_t, we_t, wd_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C1d); + we_t = SHA256_EXPAND (wc_t, w7_t, wf_t, we_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C1e); + wf_t = SHA256_EXPAND (wd_t, w8_t, w0_t, wf_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C1f); + + w0_t = SHA256_EXPAND (we_t, w9_t, w1_t, w0_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C20); + w1_t = SHA256_EXPAND (wf_t, wa_t, w2_t, w1_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C21); + w2_t = SHA256_EXPAND (w0_t, wb_t, w3_t, w2_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C22); + w3_t = SHA256_EXPAND (w1_t, wc_t, w4_t, w3_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C23); + w4_t = SHA256_EXPAND (w2_t, wd_t, w5_t, w4_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C24); + w5_t = SHA256_EXPAND (w3_t, we_t, w6_t, w5_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C25); + w6_t = SHA256_EXPAND (w4_t, wf_t, w7_t, w6_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C26); + w7_t = SHA256_EXPAND (w5_t, w0_t, w8_t, w7_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C27); + w8_t = SHA256_EXPAND (w6_t, w1_t, w9_t, w8_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C28); + w9_t = SHA256_EXPAND (w7_t, w2_t, wa_t, w9_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C29); + wa_t = SHA256_EXPAND (w8_t, w3_t, wb_t, wa_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C2a); + wb_t = SHA256_EXPAND (w9_t, w4_t, wc_t, wb_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C2b); + wc_t = SHA256_EXPAND (wa_t, w5_t, wd_t, wc_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C2c); + wd_t = SHA256_EXPAND (wb_t, w6_t, we_t, wd_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C2d); + we_t = SHA256_EXPAND (wc_t, w7_t, wf_t, we_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C2e); + wf_t = SHA256_EXPAND (wd_t, w8_t, w0_t, wf_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C2f); + + w0_t = SHA256_EXPAND (we_t, w9_t, w1_t, w0_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C30); + w1_t = SHA256_EXPAND (wf_t, wa_t, w2_t, w1_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C31); + w2_t = SHA256_EXPAND (w0_t, wb_t, w3_t, w2_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C32); + w3_t = SHA256_EXPAND (w1_t, wc_t, w4_t, w3_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C33); + w4_t = SHA256_EXPAND (w2_t, wd_t, w5_t, w4_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C34); + w5_t = SHA256_EXPAND (w3_t, we_t, w6_t, w5_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C35); + w6_t = SHA256_EXPAND (w4_t, wf_t, w7_t, w6_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C36); + w7_t = SHA256_EXPAND (w5_t, w0_t, w8_t, w7_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C37); + w8_t = SHA256_EXPAND (w6_t, w1_t, w9_t, w8_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C38); + w9_t = SHA256_EXPAND (w7_t, w2_t, wa_t, w9_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C39); + wa_t = SHA256_EXPAND (w8_t, w3_t, wb_t, wa_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C3a); + wb_t = SHA256_EXPAND (w9_t, w4_t, wc_t, wb_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C3b); + wc_t = SHA256_EXPAND (wa_t, w5_t, wd_t, wc_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C3c); + wd_t = SHA256_EXPAND (wb_t, w6_t, we_t, wd_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C3d); + we_t = SHA256_EXPAND (wc_t, w7_t, wf_t, we_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C3e); + wf_t = SHA256_EXPAND (wd_t, w8_t, w0_t, wf_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C3f); + + + const u32x r0 = d; + const u32x r1 = h; + const u32x r2 = c; + const u32x r3 = g; + + #include VECT_COMPARE_S + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m01400_s08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m01400_s16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/nv/m01400_a1.cu b/nv/m01400_a1.cu new file mode 100644 index 0000000000..dcdc544d6e --- /dev/null +++ b/nv/m01400_a1.cu @@ -0,0 +1,527 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _SHA256_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW2 +#define VECT_SIZE1 +#endif + +#define DGST_R0 3 +#define DGST_R1 7 +#define DGST_R2 2 +#define DGST_R3 6 + +#include "include/kernel_functions.c" +#include "types_nv.c" +#include "common_nv.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +__device__ __constant__ comb_t c_combs[1024]; + +extern "C" __global__ void __launch_bounds__ (256, 1) m01400_m04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + append_0x80_2 (wordl0, wordl1, pw_l_len); + + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, c_combs[0].pw_len); + } + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = c_combs[il_pos].pw_len; + + const u32 pw_len = pw_l_len + pw_r_len; + + u32 wordr0[4]; + + wordr0[0] = c_combs[il_pos].i[0]; + wordr0[1] = c_combs[il_pos].i[1]; + wordr0[2] = c_combs[il_pos].i[2]; + wordr0[3] = c_combs[il_pos].i[3]; + + u32 wordr1[4]; + + wordr1[0] = c_combs[il_pos].i[4]; + wordr1[1] = c_combs[il_pos].i[5]; + wordr1[2] = c_combs[il_pos].i[6]; + wordr1[3] = c_combs[il_pos].i[7]; + + u32 wordr2[4]; + + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + + u32 wordr3[4]; + + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + append_0x80_2 (wordr0, wordr1, pw_r_len); + + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + u32x w0[4]; + u32x w1[4]; + u32x w2[4]; + u32x w3[4]; + + w0[0] = wordl0[0] | wordr0[0]; + w0[1] = wordl0[1] | wordr0[1]; + w0[2] = wordl0[2] | wordr0[2]; + w0[3] = wordl0[3] | wordr0[3]; + w1[0] = wordl1[0] | wordr1[0]; + w1[1] = wordl1[1] | wordr1[1]; + w1[2] = wordl1[2] | wordr1[2]; + w1[3] = wordl1[3] | wordr1[3]; + w2[0] = wordl2[0] | wordr2[0]; + w2[1] = wordl2[1] | wordr2[1]; + w2[2] = wordl2[2] | wordr2[2]; + w2[3] = wordl2[3] | wordr2[3]; + w3[0] = wordl3[0] | wordr3[0]; + w3[1] = wordl3[1] | wordr3[1]; + w3[2] = wordl3[2] | wordr3[2]; + w3[3] = wordl3[3] | wordr3[3]; + + /** + * SHA256 + */ + + u32x w0_t = swap_workaround (w0[0]); + u32x w1_t = swap_workaround (w0[1]); + u32x w2_t = swap_workaround (w0[2]); + u32x w3_t = swap_workaround (w0[3]); + u32x w4_t = swap_workaround (w1[0]); + u32x w5_t = swap_workaround (w1[1]); + u32x w6_t = swap_workaround (w1[2]); + u32x w7_t = swap_workaround (w1[3]); + u32x w8_t = swap_workaround (w2[0]); + u32x w9_t = swap_workaround (w2[1]); + u32x wa_t = swap_workaround (w2[2]); + u32x wb_t = swap_workaround (w2[3]); + u32x wc_t = swap_workaround (w3[0]); + u32x wd_t = swap_workaround (w3[1]); + u32x we_t = 0; + u32x wf_t = pw_len * 8; + + u32x a = SHA256M_A; + u32x b = SHA256M_B; + u32x c = SHA256M_C; + u32x d = SHA256M_D; + u32x e = SHA256M_E; + u32x f = SHA256M_F; + u32x g = SHA256M_G; + u32x h = SHA256M_H; + + SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C00); + SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C01); + SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C02); + SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C03); + SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C04); + SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C05); + SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C06); + SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C07); + SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C08); + SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C09); + SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C0a); + SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C0b); + SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C0c); + SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C0d); + SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C0e); + SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C0f); + + w0_t = SHA256_EXPAND (we_t, w9_t, w1_t, w0_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C10); + w1_t = SHA256_EXPAND (wf_t, wa_t, w2_t, w1_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C11); + w2_t = SHA256_EXPAND (w0_t, wb_t, w3_t, w2_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C12); + w3_t = SHA256_EXPAND (w1_t, wc_t, w4_t, w3_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C13); + w4_t = SHA256_EXPAND (w2_t, wd_t, w5_t, w4_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C14); + w5_t = SHA256_EXPAND (w3_t, we_t, w6_t, w5_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C15); + w6_t = SHA256_EXPAND (w4_t, wf_t, w7_t, w6_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C16); + w7_t = SHA256_EXPAND (w5_t, w0_t, w8_t, w7_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C17); + w8_t = SHA256_EXPAND (w6_t, w1_t, w9_t, w8_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C18); + w9_t = SHA256_EXPAND (w7_t, w2_t, wa_t, w9_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C19); + wa_t = SHA256_EXPAND (w8_t, w3_t, wb_t, wa_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C1a); + wb_t = SHA256_EXPAND (w9_t, w4_t, wc_t, wb_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C1b); + wc_t = SHA256_EXPAND (wa_t, w5_t, wd_t, wc_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C1c); + wd_t = SHA256_EXPAND (wb_t, w6_t, we_t, wd_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C1d); + we_t = SHA256_EXPAND (wc_t, w7_t, wf_t, we_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C1e); + wf_t = SHA256_EXPAND (wd_t, w8_t, w0_t, wf_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C1f); + + w0_t = SHA256_EXPAND (we_t, w9_t, w1_t, w0_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C20); + w1_t = SHA256_EXPAND (wf_t, wa_t, w2_t, w1_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C21); + w2_t = SHA256_EXPAND (w0_t, wb_t, w3_t, w2_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C22); + w3_t = SHA256_EXPAND (w1_t, wc_t, w4_t, w3_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C23); + w4_t = SHA256_EXPAND (w2_t, wd_t, w5_t, w4_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C24); + w5_t = SHA256_EXPAND (w3_t, we_t, w6_t, w5_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C25); + w6_t = SHA256_EXPAND (w4_t, wf_t, w7_t, w6_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C26); + w7_t = SHA256_EXPAND (w5_t, w0_t, w8_t, w7_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C27); + w8_t = SHA256_EXPAND (w6_t, w1_t, w9_t, w8_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C28); + w9_t = SHA256_EXPAND (w7_t, w2_t, wa_t, w9_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C29); + wa_t = SHA256_EXPAND (w8_t, w3_t, wb_t, wa_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C2a); + wb_t = SHA256_EXPAND (w9_t, w4_t, wc_t, wb_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C2b); + wc_t = SHA256_EXPAND (wa_t, w5_t, wd_t, wc_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C2c); + wd_t = SHA256_EXPAND (wb_t, w6_t, we_t, wd_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C2d); + we_t = SHA256_EXPAND (wc_t, w7_t, wf_t, we_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C2e); + wf_t = SHA256_EXPAND (wd_t, w8_t, w0_t, wf_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C2f); + + w0_t = SHA256_EXPAND (we_t, w9_t, w1_t, w0_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C30); + w1_t = SHA256_EXPAND (wf_t, wa_t, w2_t, w1_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C31); + w2_t = SHA256_EXPAND (w0_t, wb_t, w3_t, w2_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C32); + w3_t = SHA256_EXPAND (w1_t, wc_t, w4_t, w3_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C33); + w4_t = SHA256_EXPAND (w2_t, wd_t, w5_t, w4_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C34); + w5_t = SHA256_EXPAND (w3_t, we_t, w6_t, w5_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C35); + w6_t = SHA256_EXPAND (w4_t, wf_t, w7_t, w6_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C36); + w7_t = SHA256_EXPAND (w5_t, w0_t, w8_t, w7_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C37); + w8_t = SHA256_EXPAND (w6_t, w1_t, w9_t, w8_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C38); + w9_t = SHA256_EXPAND (w7_t, w2_t, wa_t, w9_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C39); + wa_t = SHA256_EXPAND (w8_t, w3_t, wb_t, wa_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C3a); + wb_t = SHA256_EXPAND (w9_t, w4_t, wc_t, wb_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C3b); + wc_t = SHA256_EXPAND (wa_t, w5_t, wd_t, wc_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C3c); + wd_t = SHA256_EXPAND (wb_t, w6_t, we_t, wd_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C3d); + we_t = SHA256_EXPAND (wc_t, w7_t, wf_t, we_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C3e); + wf_t = SHA256_EXPAND (wd_t, w8_t, w0_t, wf_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C3f); + + + const u32x r0 = d; + const u32x r1 = h; + const u32x r2 = c; + const u32x r3 = g; + + #include VECT_COMPARE_M + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m01400_m08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m01400_m16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m01400_s04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + append_0x80_2 (wordl0, wordl1, pw_l_len); + + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, c_combs[0].pw_len); + } + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3], + }; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = c_combs[il_pos].pw_len; + + const u32 pw_len = pw_l_len + pw_r_len; + + u32 wordr0[4]; + + wordr0[0] = c_combs[il_pos].i[0]; + wordr0[1] = c_combs[il_pos].i[1]; + wordr0[2] = c_combs[il_pos].i[2]; + wordr0[3] = c_combs[il_pos].i[3]; + + u32 wordr1[4]; + + wordr1[0] = c_combs[il_pos].i[4]; + wordr1[1] = c_combs[il_pos].i[5]; + wordr1[2] = c_combs[il_pos].i[6]; + wordr1[3] = c_combs[il_pos].i[7]; + + u32 wordr2[4]; + + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + + u32 wordr3[4]; + + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + append_0x80_2 (wordr0, wordr1, pw_r_len); + + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + u32x w0[4]; + u32x w1[4]; + u32x w2[4]; + u32x w3[4]; + + w0[0] = wordl0[0] | wordr0[0]; + w0[1] = wordl0[1] | wordr0[1]; + w0[2] = wordl0[2] | wordr0[2]; + w0[3] = wordl0[3] | wordr0[3]; + w1[0] = wordl1[0] | wordr1[0]; + w1[1] = wordl1[1] | wordr1[1]; + w1[2] = wordl1[2] | wordr1[2]; + w1[3] = wordl1[3] | wordr1[3]; + w2[0] = wordl2[0] | wordr2[0]; + w2[1] = wordl2[1] | wordr2[1]; + w2[2] = wordl2[2] | wordr2[2]; + w2[3] = wordl2[3] | wordr2[3]; + w3[0] = wordl3[0] | wordr3[0]; + w3[1] = wordl3[1] | wordr3[1]; + w3[2] = wordl3[2] | wordr3[2]; + w3[3] = wordl3[3] | wordr3[3]; + + /** + * SHA256 + */ + + u32x w0_t = swap_workaround (w0[0]); + u32x w1_t = swap_workaround (w0[1]); + u32x w2_t = swap_workaround (w0[2]); + u32x w3_t = swap_workaround (w0[3]); + u32x w4_t = swap_workaround (w1[0]); + u32x w5_t = swap_workaround (w1[1]); + u32x w6_t = swap_workaround (w1[2]); + u32x w7_t = swap_workaround (w1[3]); + u32x w8_t = swap_workaround (w2[0]); + u32x w9_t = swap_workaround (w2[1]); + u32x wa_t = swap_workaround (w2[2]); + u32x wb_t = swap_workaround (w2[3]); + u32x wc_t = swap_workaround (w3[0]); + u32x wd_t = swap_workaround (w3[1]); + u32x we_t = 0; + u32x wf_t = pw_len * 8; + + u32x a = SHA256M_A; + u32x b = SHA256M_B; + u32x c = SHA256M_C; + u32x d = SHA256M_D; + u32x e = SHA256M_E; + u32x f = SHA256M_F; + u32x g = SHA256M_G; + u32x h = SHA256M_H; + + SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C00); + SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C01); + SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C02); + SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C03); + SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C04); + SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C05); + SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C06); + SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C07); + SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C08); + SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C09); + SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C0a); + SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C0b); + SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C0c); + SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C0d); + SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C0e); + SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C0f); + + w0_t = SHA256_EXPAND (we_t, w9_t, w1_t, w0_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C10); + w1_t = SHA256_EXPAND (wf_t, wa_t, w2_t, w1_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C11); + w2_t = SHA256_EXPAND (w0_t, wb_t, w3_t, w2_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C12); + w3_t = SHA256_EXPAND (w1_t, wc_t, w4_t, w3_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C13); + w4_t = SHA256_EXPAND (w2_t, wd_t, w5_t, w4_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C14); + w5_t = SHA256_EXPAND (w3_t, we_t, w6_t, w5_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C15); + w6_t = SHA256_EXPAND (w4_t, wf_t, w7_t, w6_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C16); + w7_t = SHA256_EXPAND (w5_t, w0_t, w8_t, w7_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C17); + w8_t = SHA256_EXPAND (w6_t, w1_t, w9_t, w8_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C18); + w9_t = SHA256_EXPAND (w7_t, w2_t, wa_t, w9_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C19); + wa_t = SHA256_EXPAND (w8_t, w3_t, wb_t, wa_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C1a); + wb_t = SHA256_EXPAND (w9_t, w4_t, wc_t, wb_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C1b); + wc_t = SHA256_EXPAND (wa_t, w5_t, wd_t, wc_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C1c); + wd_t = SHA256_EXPAND (wb_t, w6_t, we_t, wd_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C1d); + we_t = SHA256_EXPAND (wc_t, w7_t, wf_t, we_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C1e); + wf_t = SHA256_EXPAND (wd_t, w8_t, w0_t, wf_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C1f); + + w0_t = SHA256_EXPAND (we_t, w9_t, w1_t, w0_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C20); + w1_t = SHA256_EXPAND (wf_t, wa_t, w2_t, w1_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C21); + w2_t = SHA256_EXPAND (w0_t, wb_t, w3_t, w2_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C22); + w3_t = SHA256_EXPAND (w1_t, wc_t, w4_t, w3_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C23); + w4_t = SHA256_EXPAND (w2_t, wd_t, w5_t, w4_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C24); + w5_t = SHA256_EXPAND (w3_t, we_t, w6_t, w5_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C25); + w6_t = SHA256_EXPAND (w4_t, wf_t, w7_t, w6_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C26); + w7_t = SHA256_EXPAND (w5_t, w0_t, w8_t, w7_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C27); + w8_t = SHA256_EXPAND (w6_t, w1_t, w9_t, w8_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C28); + w9_t = SHA256_EXPAND (w7_t, w2_t, wa_t, w9_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C29); + wa_t = SHA256_EXPAND (w8_t, w3_t, wb_t, wa_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C2a); + wb_t = SHA256_EXPAND (w9_t, w4_t, wc_t, wb_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C2b); + wc_t = SHA256_EXPAND (wa_t, w5_t, wd_t, wc_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C2c); + wd_t = SHA256_EXPAND (wb_t, w6_t, we_t, wd_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C2d); + we_t = SHA256_EXPAND (wc_t, w7_t, wf_t, we_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C2e); + wf_t = SHA256_EXPAND (wd_t, w8_t, w0_t, wf_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C2f); + + w0_t = SHA256_EXPAND (we_t, w9_t, w1_t, w0_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C30); + w1_t = SHA256_EXPAND (wf_t, wa_t, w2_t, w1_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C31); + w2_t = SHA256_EXPAND (w0_t, wb_t, w3_t, w2_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C32); + w3_t = SHA256_EXPAND (w1_t, wc_t, w4_t, w3_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C33); + w4_t = SHA256_EXPAND (w2_t, wd_t, w5_t, w4_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C34); + w5_t = SHA256_EXPAND (w3_t, we_t, w6_t, w5_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C35); + w6_t = SHA256_EXPAND (w4_t, wf_t, w7_t, w6_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C36); + w7_t = SHA256_EXPAND (w5_t, w0_t, w8_t, w7_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C37); + w8_t = SHA256_EXPAND (w6_t, w1_t, w9_t, w8_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C38); + w9_t = SHA256_EXPAND (w7_t, w2_t, wa_t, w9_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C39); + wa_t = SHA256_EXPAND (w8_t, w3_t, wb_t, wa_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C3a); + wb_t = SHA256_EXPAND (w9_t, w4_t, wc_t, wb_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C3b); + wc_t = SHA256_EXPAND (wa_t, w5_t, wd_t, wc_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C3c); + wd_t = SHA256_EXPAND (wb_t, w6_t, we_t, wd_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C3d); + we_t = SHA256_EXPAND (wc_t, w7_t, wf_t, we_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C3e); + wf_t = SHA256_EXPAND (wd_t, w8_t, w0_t, wf_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C3f); + + + const u32x r0 = d; + const u32x r1 = h; + const u32x r2 = c; + const u32x r3 = g; + + #include VECT_COMPARE_S + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m01400_s08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m01400_s16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/nv/m01400_a3.cu b/nv/m01400_a3.cu new file mode 100644 index 0000000000..0709f07d79 --- /dev/null +++ b/nv/m01400_a3.cu @@ -0,0 +1,538 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _SHA256_ +#define _SCALAR_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW2 +#define VECT_SIZE1 +#endif + +#define DGST_R0 3 +#define DGST_R1 7 +#define DGST_R2 2 +#define DGST_R3 6 + +#include "include/kernel_functions.c" +#include "types_nv.c" +#include "common_nv.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4_warp.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4_warp.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4_warp.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4_warp.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4_warp.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4_warp.c" +#endif + +__device__ __constant__ u32x c_bfs[1024]; + +__device__ static void m01400m (u32 w[16], const u32 pw_len, const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const u32x *words_buf_r, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset) +{ + /** + * modifier + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + const u32 lid = threadIdx.x; + + /** + * loop + */ + + const u32 bf_loops = ceil ((float) bfs_cnt / VECT_DIV); + + u32x w0l = w[0]; + + for (u32 il_pos = 0; il_pos < bf_loops; il_pos++) + { + const u32x w0r = c_bfs[il_pos]; + + const u32x w0 = w0l | w0r; + + u32x w0_t = w0; + u32x w1_t = w[ 1]; + u32x w2_t = w[ 2]; + u32x w3_t = w[ 3]; + u32x w4_t = w[ 4]; + u32x w5_t = w[ 5]; + u32x w6_t = w[ 6]; + u32x w7_t = w[ 7]; + u32x w8_t = w[ 8]; + u32x w9_t = w[ 9]; + u32x wa_t = w[10]; + u32x wb_t = w[11]; + u32x wc_t = w[12]; + u32x wd_t = w[13]; + u32x we_t = w[14]; + u32x wf_t = w[15]; + + u32x a = SHA256M_A; + u32x b = SHA256M_B; + u32x c = SHA256M_C; + u32x d = SHA256M_D; + u32x e = SHA256M_E; + u32x f = SHA256M_F; + u32x g = SHA256M_G; + u32x h = SHA256M_H; + + SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C00); + SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C01); + SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C02); + SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C03); + SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C04); + SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C05); + SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C06); + SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C07); + SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C08); + SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C09); + SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C0a); + SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C0b); + SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C0c); + SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C0d); + SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C0e); + SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C0f); + + w0_t = SHA256_EXPAND (we_t, w9_t, w1_t, w0_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C10); + w1_t = SHA256_EXPAND (wf_t, wa_t, w2_t, w1_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C11); + w2_t = SHA256_EXPAND (w0_t, wb_t, w3_t, w2_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C12); + w3_t = SHA256_EXPAND (w1_t, wc_t, w4_t, w3_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C13); + w4_t = SHA256_EXPAND (w2_t, wd_t, w5_t, w4_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C14); + w5_t = SHA256_EXPAND (w3_t, we_t, w6_t, w5_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C15); + w6_t = SHA256_EXPAND (w4_t, wf_t, w7_t, w6_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C16); + w7_t = SHA256_EXPAND (w5_t, w0_t, w8_t, w7_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C17); + w8_t = SHA256_EXPAND (w6_t, w1_t, w9_t, w8_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C18); + w9_t = SHA256_EXPAND (w7_t, w2_t, wa_t, w9_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C19); + wa_t = SHA256_EXPAND (w8_t, w3_t, wb_t, wa_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C1a); + wb_t = SHA256_EXPAND (w9_t, w4_t, wc_t, wb_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C1b); + wc_t = SHA256_EXPAND (wa_t, w5_t, wd_t, wc_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C1c); + wd_t = SHA256_EXPAND (wb_t, w6_t, we_t, wd_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C1d); + we_t = SHA256_EXPAND (wc_t, w7_t, wf_t, we_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C1e); + wf_t = SHA256_EXPAND (wd_t, w8_t, w0_t, wf_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C1f); + + w0_t = SHA256_EXPAND (we_t, w9_t, w1_t, w0_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C20); + w1_t = SHA256_EXPAND (wf_t, wa_t, w2_t, w1_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C21); + w2_t = SHA256_EXPAND (w0_t, wb_t, w3_t, w2_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C22); + w3_t = SHA256_EXPAND (w1_t, wc_t, w4_t, w3_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C23); + w4_t = SHA256_EXPAND (w2_t, wd_t, w5_t, w4_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C24); + w5_t = SHA256_EXPAND (w3_t, we_t, w6_t, w5_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C25); + w6_t = SHA256_EXPAND (w4_t, wf_t, w7_t, w6_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C26); + w7_t = SHA256_EXPAND (w5_t, w0_t, w8_t, w7_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C27); + w8_t = SHA256_EXPAND (w6_t, w1_t, w9_t, w8_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C28); + w9_t = SHA256_EXPAND (w7_t, w2_t, wa_t, w9_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C29); + wa_t = SHA256_EXPAND (w8_t, w3_t, wb_t, wa_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C2a); + wb_t = SHA256_EXPAND (w9_t, w4_t, wc_t, wb_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C2b); + wc_t = SHA256_EXPAND (wa_t, w5_t, wd_t, wc_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C2c); + wd_t = SHA256_EXPAND (wb_t, w6_t, we_t, wd_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C2d); + we_t = SHA256_EXPAND (wc_t, w7_t, wf_t, we_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C2e); + wf_t = SHA256_EXPAND (wd_t, w8_t, w0_t, wf_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C2f); + + w0_t = SHA256_EXPAND (we_t, w9_t, w1_t, w0_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C30); + w1_t = SHA256_EXPAND (wf_t, wa_t, w2_t, w1_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C31); + w2_t = SHA256_EXPAND (w0_t, wb_t, w3_t, w2_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C32); + w3_t = SHA256_EXPAND (w1_t, wc_t, w4_t, w3_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C33); + w4_t = SHA256_EXPAND (w2_t, wd_t, w5_t, w4_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C34); + w5_t = SHA256_EXPAND (w3_t, we_t, w6_t, w5_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C35); + w6_t = SHA256_EXPAND (w4_t, wf_t, w7_t, w6_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C36); + w7_t = SHA256_EXPAND (w5_t, w0_t, w8_t, w7_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C37); + w8_t = SHA256_EXPAND (w6_t, w1_t, w9_t, w8_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C38); + w9_t = SHA256_EXPAND (w7_t, w2_t, wa_t, w9_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C39); + wa_t = SHA256_EXPAND (w8_t, w3_t, wb_t, wa_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C3a); + wb_t = SHA256_EXPAND (w9_t, w4_t, wc_t, wb_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C3b); + wc_t = SHA256_EXPAND (wa_t, w5_t, wd_t, wc_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C3c); + wd_t = SHA256_EXPAND (wb_t, w6_t, we_t, wd_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C3d); + we_t = SHA256_EXPAND (wc_t, w7_t, wf_t, we_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C3e); + wf_t = SHA256_EXPAND (wd_t, w8_t, w0_t, wf_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C3f); + + + const u32x r0 = d; + const u32x r1 = h; + const u32x r2 = c; + const u32x r3 = g; + + #include VECT_COMPARE_M + } +} + +__device__ static void m01400s (u32 w[16], const u32 pw_len, const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const u32x *words_buf_r, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset) +{ + /** + * modifier + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + const u32 lid = threadIdx.x; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3], + }; + + /** + * loop + */ + + const u32 bf_loops = ceil ((float) bfs_cnt / VECT_DIV); + + u32x w0l = w[0]; + + for (u32 il_pos = 0; il_pos < bf_loops; il_pos++) + { + const u32x w0r = c_bfs[il_pos]; + + const u32x w0 = w0l | w0r; + + u32x w0_t = w0; + u32x w1_t = w[ 1]; + u32x w2_t = w[ 2]; + u32x w3_t = w[ 3]; + u32x w4_t = w[ 4]; + u32x w5_t = w[ 5]; + u32x w6_t = w[ 6]; + u32x w7_t = w[ 7]; + u32x w8_t = w[ 8]; + u32x w9_t = w[ 9]; + u32x wa_t = w[10]; + u32x wb_t = w[11]; + u32x wc_t = w[12]; + u32x wd_t = w[13]; + u32x we_t = w[14]; + u32x wf_t = w[15]; + + u32x a = SHA256M_A; + u32x b = SHA256M_B; + u32x c = SHA256M_C; + u32x d = SHA256M_D; + u32x e = SHA256M_E; + u32x f = SHA256M_F; + u32x g = SHA256M_G; + u32x h = SHA256M_H; + + SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C00); + SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C01); + SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C02); + SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C03); + SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C04); + SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C05); + SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C06); + SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C07); + SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C08); + SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C09); + SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C0a); + SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C0b); + SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C0c); + SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C0d); + SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C0e); + SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C0f); + + w0_t = SHA256_EXPAND (we_t, w9_t, w1_t, w0_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C10); + w1_t = SHA256_EXPAND (wf_t, wa_t, w2_t, w1_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C11); + w2_t = SHA256_EXPAND (w0_t, wb_t, w3_t, w2_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C12); + w3_t = SHA256_EXPAND (w1_t, wc_t, w4_t, w3_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C13); + w4_t = SHA256_EXPAND (w2_t, wd_t, w5_t, w4_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C14); + w5_t = SHA256_EXPAND (w3_t, we_t, w6_t, w5_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C15); + w6_t = SHA256_EXPAND (w4_t, wf_t, w7_t, w6_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C16); + w7_t = SHA256_EXPAND (w5_t, w0_t, w8_t, w7_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C17); + w8_t = SHA256_EXPAND (w6_t, w1_t, w9_t, w8_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C18); + w9_t = SHA256_EXPAND (w7_t, w2_t, wa_t, w9_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C19); + wa_t = SHA256_EXPAND (w8_t, w3_t, wb_t, wa_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C1a); + wb_t = SHA256_EXPAND (w9_t, w4_t, wc_t, wb_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C1b); + wc_t = SHA256_EXPAND (wa_t, w5_t, wd_t, wc_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C1c); + wd_t = SHA256_EXPAND (wb_t, w6_t, we_t, wd_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C1d); + we_t = SHA256_EXPAND (wc_t, w7_t, wf_t, we_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C1e); + wf_t = SHA256_EXPAND (wd_t, w8_t, w0_t, wf_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C1f); + + w0_t = SHA256_EXPAND (we_t, w9_t, w1_t, w0_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C20); + w1_t = SHA256_EXPAND (wf_t, wa_t, w2_t, w1_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C21); + w2_t = SHA256_EXPAND (w0_t, wb_t, w3_t, w2_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C22); + w3_t = SHA256_EXPAND (w1_t, wc_t, w4_t, w3_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C23); + w4_t = SHA256_EXPAND (w2_t, wd_t, w5_t, w4_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C24); + w5_t = SHA256_EXPAND (w3_t, we_t, w6_t, w5_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C25); + w6_t = SHA256_EXPAND (w4_t, wf_t, w7_t, w6_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C26); + w7_t = SHA256_EXPAND (w5_t, w0_t, w8_t, w7_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C27); + w8_t = SHA256_EXPAND (w6_t, w1_t, w9_t, w8_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C28); + w9_t = SHA256_EXPAND (w7_t, w2_t, wa_t, w9_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C29); + wa_t = SHA256_EXPAND (w8_t, w3_t, wb_t, wa_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C2a); + wb_t = SHA256_EXPAND (w9_t, w4_t, wc_t, wb_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C2b); + wc_t = SHA256_EXPAND (wa_t, w5_t, wd_t, wc_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C2c); + wd_t = SHA256_EXPAND (wb_t, w6_t, we_t, wd_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C2d); + we_t = SHA256_EXPAND (wc_t, w7_t, wf_t, we_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C2e); + wf_t = SHA256_EXPAND (wd_t, w8_t, w0_t, wf_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C2f); + + w0_t = SHA256_EXPAND (we_t, w9_t, w1_t, w0_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C30); + w1_t = SHA256_EXPAND (wf_t, wa_t, w2_t, w1_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C31); + w2_t = SHA256_EXPAND (w0_t, wb_t, w3_t, w2_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C32); + w3_t = SHA256_EXPAND (w1_t, wc_t, w4_t, w3_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C33); + w4_t = SHA256_EXPAND (w2_t, wd_t, w5_t, w4_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C34); + w5_t = SHA256_EXPAND (w3_t, we_t, w6_t, w5_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C35); + w6_t = SHA256_EXPAND (w4_t, wf_t, w7_t, w6_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C36); + w7_t = SHA256_EXPAND (w5_t, w0_t, w8_t, w7_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C37); + w8_t = SHA256_EXPAND (w6_t, w1_t, w9_t, w8_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C38); + w9_t = SHA256_EXPAND (w7_t, w2_t, wa_t, w9_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C39); + wa_t = SHA256_EXPAND (w8_t, w3_t, wb_t, wa_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C3a); + wb_t = SHA256_EXPAND (w9_t, w4_t, wc_t, wb_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C3b); + wc_t = SHA256_EXPAND (wa_t, w5_t, wd_t, wc_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C3c); + wd_t = SHA256_EXPAND (wb_t, w6_t, we_t, wd_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C3d); + we_t = SHA256_EXPAND (wc_t, w7_t, wf_t, we_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C3e); + wf_t = SHA256_EXPAND (wd_t, w8_t, w0_t, wf_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C3f); + + + const u32x r0 = d; + const u32x r1 = h; + const u32x r2 = c; + const u32x r3 = g; + + #include VECT_COMPARE_S + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m01400_m04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const u32x *words_buf_r, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32 w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = 0; + w[ 5] = 0; + w[ 6] = 0; + w[ 7] = 0; + w[ 8] = 0; + w[ 9] = 0; + w[10] = 0; + w[11] = 0; + w[12] = 0; + w[13] = 0; + w[14] = 0; + w[15] = pws[gid].i[15]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m01400m (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m01400_m08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const u32x *words_buf_r, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32 w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = pws[gid].i[ 4]; + w[ 5] = pws[gid].i[ 5]; + w[ 6] = pws[gid].i[ 6]; + w[ 7] = pws[gid].i[ 7]; + w[ 8] = 0; + w[ 9] = 0; + w[10] = 0; + w[11] = 0; + w[12] = 0; + w[13] = 0; + w[14] = 0; + w[15] = pws[gid].i[15]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m01400m (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m01400_m16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const u32x *words_buf_r, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32 w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = pws[gid].i[ 4]; + w[ 5] = pws[gid].i[ 5]; + w[ 6] = pws[gid].i[ 6]; + w[ 7] = pws[gid].i[ 7]; + w[ 8] = pws[gid].i[ 8]; + w[ 9] = pws[gid].i[ 9]; + w[10] = pws[gid].i[10]; + w[11] = pws[gid].i[11]; + w[12] = pws[gid].i[12]; + w[13] = pws[gid].i[13]; + w[14] = pws[gid].i[14]; + w[15] = pws[gid].i[15]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m01400m (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m01400_s04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const u32x *words_buf_r, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32 w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = 0; + w[ 5] = 0; + w[ 6] = 0; + w[ 7] = 0; + w[ 8] = 0; + w[ 9] = 0; + w[10] = 0; + w[11] = 0; + w[12] = 0; + w[13] = 0; + w[14] = 0; + w[15] = pws[gid].i[15]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m01400s (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m01400_s08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const u32x *words_buf_r, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32 w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = pws[gid].i[ 4]; + w[ 5] = pws[gid].i[ 5]; + w[ 6] = pws[gid].i[ 6]; + w[ 7] = pws[gid].i[ 7]; + w[ 8] = 0; + w[ 9] = 0; + w[10] = 0; + w[11] = 0; + w[12] = 0; + w[13] = 0; + w[14] = 0; + w[15] = pws[gid].i[15]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m01400s (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m01400_s16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const u32x *words_buf_r, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32 w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = pws[gid].i[ 4]; + w[ 5] = pws[gid].i[ 5]; + w[ 6] = pws[gid].i[ 6]; + w[ 7] = pws[gid].i[ 7]; + w[ 8] = pws[gid].i[ 8]; + w[ 9] = pws[gid].i[ 9]; + w[10] = pws[gid].i[10]; + w[11] = pws[gid].i[11]; + w[12] = pws[gid].i[12]; + w[13] = pws[gid].i[13]; + w[14] = pws[gid].i[14]; + w[15] = pws[gid].i[15]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m01400s (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} diff --git a/nv/m01410_a0.cu b/nv/m01410_a0.cu new file mode 100644 index 0000000000..f2ae6035e0 --- /dev/null +++ b/nv/m01410_a0.cu @@ -0,0 +1,581 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _SHA256_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW2 +#define VECT_SIZE1 +#endif + +#define DGST_R0 3 +#define DGST_R1 7 +#define DGST_R2 2 +#define DGST_R3 6 + +#include "include/kernel_functions.c" +#include "types_nv.c" +#include "common_nv.c" +#include "include/rp_gpu.h" +#include "rp_nv.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +__device__ __constant__ gpu_rule_t c_rules[1024]; + +extern "C" __global__ void __launch_bounds__ (256, 1) m01410_m04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + u32x pw_buf1[4]; + + pw_buf1[0] = pws[gid].i[ 4]; + pw_buf1[1] = pws[gid].i[ 5]; + pw_buf1[2] = pws[gid].i[ 6]; + pw_buf1[3] = pws[gid].i[ 7]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[7]; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + + w0[0] = pw_buf0[0]; + w0[1] = pw_buf0[1]; + w0[2] = pw_buf0[2]; + w0[3] = pw_buf0[3]; + + u32x w1[4]; + + w1[0] = pw_buf1[0]; + w1[1] = pw_buf1[1]; + w1[2] = pw_buf1[2]; + w1[3] = pw_buf1[3]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 out_len = apply_rules (c_rules[il_pos].cmds, w0, w1, pw_len); + + /** + * append salt + */ + + u32 s0[4]; + + s0[0] = salt_buf0[0]; + s0[1] = salt_buf0[1]; + s0[2] = salt_buf0[2]; + s0[3] = salt_buf0[3]; + + u32 s1[4]; + + s1[0] = salt_buf1[0]; + s1[1] = salt_buf1[1]; + s1[2] = salt_buf1[2]; + s1[3] = salt_buf1[3]; + + u32 s2[4]; + + s2[0] = 0; + s2[1] = 0; + s2[2] = 0; + s2[3] = 0; + + u32 s3[4]; + + s3[0] = 0; + s3[1] = 0; + s3[2] = 0; + s3[3] = 0; + + switch_buffer_by_offset (s0, s1, s2, s3, out_len); + + const u32 out_salt_len = out_len + salt_len; + + w0[0] |= s0[0]; + w0[1] |= s0[1]; + w0[2] |= s0[2]; + w0[3] |= s0[3]; + + w1[0] |= s1[0]; + w1[1] |= s1[1]; + w1[2] |= s1[2]; + w1[3] |= s1[3]; + + w2[0] |= s2[0]; + w2[1] |= s2[1]; + w2[2] |= s2[2]; + w2[3] |= s2[3]; + + w3[0] |= s3[0]; + w3[1] |= s3[1]; + w3[2] |= s3[2]; + w3[3] |= s3[3]; + + append_0x80_4 (w0, w1, w2, w3, out_salt_len); + + /** + * sha256 + */ + + u32x w0_t = swap_workaround (w0[0]); + u32x w1_t = swap_workaround (w0[1]); + u32x w2_t = swap_workaround (w0[2]); + u32x w3_t = swap_workaround (w0[3]); + u32x w4_t = swap_workaround (w1[0]); + u32x w5_t = swap_workaround (w1[1]); + u32x w6_t = swap_workaround (w1[2]); + u32x w7_t = swap_workaround (w1[3]); + u32x w8_t = swap_workaround (w2[0]); + u32x w9_t = swap_workaround (w2[1]); + u32x wa_t = swap_workaround (w2[2]); + u32x wb_t = swap_workaround (w2[3]); + u32x wc_t = swap_workaround (w3[0]); + u32x wd_t = swap_workaround (w3[1]); + u32x we_t = 0; + u32x wf_t = out_salt_len * 8; + + u32x a = SHA256M_A; + u32x b = SHA256M_B; + u32x c = SHA256M_C; + u32x d = SHA256M_D; + u32x e = SHA256M_E; + u32x f = SHA256M_F; + u32x g = SHA256M_G; + u32x h = SHA256M_H; + + SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C00); + SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C01); + SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C02); + SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C03); + SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C04); + SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C05); + SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C06); + SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C07); + SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C08); + SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C09); + SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C0a); + SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C0b); + SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C0c); + SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C0d); + SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C0e); + SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C0f); + + w0_t = SHA256_EXPAND (we_t, w9_t, w1_t, w0_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C10); + w1_t = SHA256_EXPAND (wf_t, wa_t, w2_t, w1_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C11); + w2_t = SHA256_EXPAND (w0_t, wb_t, w3_t, w2_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C12); + w3_t = SHA256_EXPAND (w1_t, wc_t, w4_t, w3_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C13); + w4_t = SHA256_EXPAND (w2_t, wd_t, w5_t, w4_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C14); + w5_t = SHA256_EXPAND (w3_t, we_t, w6_t, w5_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C15); + w6_t = SHA256_EXPAND (w4_t, wf_t, w7_t, w6_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C16); + w7_t = SHA256_EXPAND (w5_t, w0_t, w8_t, w7_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C17); + w8_t = SHA256_EXPAND (w6_t, w1_t, w9_t, w8_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C18); + w9_t = SHA256_EXPAND (w7_t, w2_t, wa_t, w9_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C19); + wa_t = SHA256_EXPAND (w8_t, w3_t, wb_t, wa_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C1a); + wb_t = SHA256_EXPAND (w9_t, w4_t, wc_t, wb_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C1b); + wc_t = SHA256_EXPAND (wa_t, w5_t, wd_t, wc_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C1c); + wd_t = SHA256_EXPAND (wb_t, w6_t, we_t, wd_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C1d); + we_t = SHA256_EXPAND (wc_t, w7_t, wf_t, we_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C1e); + wf_t = SHA256_EXPAND (wd_t, w8_t, w0_t, wf_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C1f); + + w0_t = SHA256_EXPAND (we_t, w9_t, w1_t, w0_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C20); + w1_t = SHA256_EXPAND (wf_t, wa_t, w2_t, w1_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C21); + w2_t = SHA256_EXPAND (w0_t, wb_t, w3_t, w2_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C22); + w3_t = SHA256_EXPAND (w1_t, wc_t, w4_t, w3_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C23); + w4_t = SHA256_EXPAND (w2_t, wd_t, w5_t, w4_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C24); + w5_t = SHA256_EXPAND (w3_t, we_t, w6_t, w5_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C25); + w6_t = SHA256_EXPAND (w4_t, wf_t, w7_t, w6_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C26); + w7_t = SHA256_EXPAND (w5_t, w0_t, w8_t, w7_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C27); + w8_t = SHA256_EXPAND (w6_t, w1_t, w9_t, w8_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C28); + w9_t = SHA256_EXPAND (w7_t, w2_t, wa_t, w9_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C29); + wa_t = SHA256_EXPAND (w8_t, w3_t, wb_t, wa_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C2a); + wb_t = SHA256_EXPAND (w9_t, w4_t, wc_t, wb_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C2b); + wc_t = SHA256_EXPAND (wa_t, w5_t, wd_t, wc_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C2c); + wd_t = SHA256_EXPAND (wb_t, w6_t, we_t, wd_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C2d); + we_t = SHA256_EXPAND (wc_t, w7_t, wf_t, we_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C2e); + wf_t = SHA256_EXPAND (wd_t, w8_t, w0_t, wf_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C2f); + + w0_t = SHA256_EXPAND (we_t, w9_t, w1_t, w0_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C30); + w1_t = SHA256_EXPAND (wf_t, wa_t, w2_t, w1_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C31); + w2_t = SHA256_EXPAND (w0_t, wb_t, w3_t, w2_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C32); + w3_t = SHA256_EXPAND (w1_t, wc_t, w4_t, w3_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C33); + w4_t = SHA256_EXPAND (w2_t, wd_t, w5_t, w4_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C34); + w5_t = SHA256_EXPAND (w3_t, we_t, w6_t, w5_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C35); + w6_t = SHA256_EXPAND (w4_t, wf_t, w7_t, w6_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C36); + w7_t = SHA256_EXPAND (w5_t, w0_t, w8_t, w7_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C37); + w8_t = SHA256_EXPAND (w6_t, w1_t, w9_t, w8_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C38); + w9_t = SHA256_EXPAND (w7_t, w2_t, wa_t, w9_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C39); + wa_t = SHA256_EXPAND (w8_t, w3_t, wb_t, wa_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C3a); + wb_t = SHA256_EXPAND (w9_t, w4_t, wc_t, wb_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C3b); + wc_t = SHA256_EXPAND (wa_t, w5_t, wd_t, wc_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C3c); + wd_t = SHA256_EXPAND (wb_t, w6_t, we_t, wd_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C3d); + we_t = SHA256_EXPAND (wc_t, w7_t, wf_t, we_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C3e); + wf_t = SHA256_EXPAND (wd_t, w8_t, w0_t, wf_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C3f); + + + const u32x r0 = d; + const u32x r1 = h; + const u32x r2 = c; + const u32x r3 = g; + + #include VECT_COMPARE_M + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m01410_m08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m01410_m16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m01410_s04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + u32x pw_buf1[4]; + + pw_buf1[0] = pws[gid].i[ 4]; + pw_buf1[1] = pws[gid].i[ 5]; + pw_buf1[2] = pws[gid].i[ 6]; + pw_buf1[3] = pws[gid].i[ 7]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[7]; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + + w0[0] = pw_buf0[0]; + w0[1] = pw_buf0[1]; + w0[2] = pw_buf0[2]; + w0[3] = pw_buf0[3]; + + u32x w1[4]; + + w1[0] = pw_buf1[0]; + w1[1] = pw_buf1[1]; + w1[2] = pw_buf1[2]; + w1[3] = pw_buf1[3]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 out_len = apply_rules (c_rules[il_pos].cmds, w0, w1, pw_len); + + /** + * append salt + */ + + u32 s0[4]; + + s0[0] = salt_buf0[0]; + s0[1] = salt_buf0[1]; + s0[2] = salt_buf0[2]; + s0[3] = salt_buf0[3]; + + u32 s1[4]; + + s1[0] = salt_buf1[0]; + s1[1] = salt_buf1[1]; + s1[2] = salt_buf1[2]; + s1[3] = salt_buf1[3]; + + u32 s2[4]; + + s2[0] = 0; + s2[1] = 0; + s2[2] = 0; + s2[3] = 0; + + u32 s3[4]; + + s3[0] = 0; + s3[1] = 0; + s3[2] = 0; + s3[3] = 0; + + switch_buffer_by_offset (s0, s1, s2, s3, out_len); + + const u32 out_salt_len = out_len + salt_len; + + w0[0] |= s0[0]; + w0[1] |= s0[1]; + w0[2] |= s0[2]; + w0[3] |= s0[3]; + + w1[0] |= s1[0]; + w1[1] |= s1[1]; + w1[2] |= s1[2]; + w1[3] |= s1[3]; + + w2[0] |= s2[0]; + w2[1] |= s2[1]; + w2[2] |= s2[2]; + w2[3] |= s2[3]; + + w3[0] |= s3[0]; + w3[1] |= s3[1]; + w3[2] |= s3[2]; + w3[3] |= s3[3]; + + append_0x80_4 (w0, w1, w2, w3, out_salt_len); + + /** + * sha256 + */ + + u32x w0_t = swap_workaround (w0[0]); + u32x w1_t = swap_workaround (w0[1]); + u32x w2_t = swap_workaround (w0[2]); + u32x w3_t = swap_workaround (w0[3]); + u32x w4_t = swap_workaround (w1[0]); + u32x w5_t = swap_workaround (w1[1]); + u32x w6_t = swap_workaround (w1[2]); + u32x w7_t = swap_workaround (w1[3]); + u32x w8_t = swap_workaround (w2[0]); + u32x w9_t = swap_workaround (w2[1]); + u32x wa_t = swap_workaround (w2[2]); + u32x wb_t = swap_workaround (w2[3]); + u32x wc_t = swap_workaround (w3[0]); + u32x wd_t = swap_workaround (w3[1]); + u32x we_t = 0; + u32x wf_t = out_salt_len * 8; + + u32x a = SHA256M_A; + u32x b = SHA256M_B; + u32x c = SHA256M_C; + u32x d = SHA256M_D; + u32x e = SHA256M_E; + u32x f = SHA256M_F; + u32x g = SHA256M_G; + u32x h = SHA256M_H; + + SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C00); + SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C01); + SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C02); + SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C03); + SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C04); + SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C05); + SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C06); + SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C07); + SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C08); + SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C09); + SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C0a); + SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C0b); + SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C0c); + SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C0d); + SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C0e); + SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C0f); + + w0_t = SHA256_EXPAND (we_t, w9_t, w1_t, w0_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C10); + w1_t = SHA256_EXPAND (wf_t, wa_t, w2_t, w1_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C11); + w2_t = SHA256_EXPAND (w0_t, wb_t, w3_t, w2_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C12); + w3_t = SHA256_EXPAND (w1_t, wc_t, w4_t, w3_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C13); + w4_t = SHA256_EXPAND (w2_t, wd_t, w5_t, w4_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C14); + w5_t = SHA256_EXPAND (w3_t, we_t, w6_t, w5_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C15); + w6_t = SHA256_EXPAND (w4_t, wf_t, w7_t, w6_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C16); + w7_t = SHA256_EXPAND (w5_t, w0_t, w8_t, w7_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C17); + w8_t = SHA256_EXPAND (w6_t, w1_t, w9_t, w8_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C18); + w9_t = SHA256_EXPAND (w7_t, w2_t, wa_t, w9_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C19); + wa_t = SHA256_EXPAND (w8_t, w3_t, wb_t, wa_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C1a); + wb_t = SHA256_EXPAND (w9_t, w4_t, wc_t, wb_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C1b); + wc_t = SHA256_EXPAND (wa_t, w5_t, wd_t, wc_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C1c); + wd_t = SHA256_EXPAND (wb_t, w6_t, we_t, wd_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C1d); + we_t = SHA256_EXPAND (wc_t, w7_t, wf_t, we_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C1e); + wf_t = SHA256_EXPAND (wd_t, w8_t, w0_t, wf_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C1f); + + w0_t = SHA256_EXPAND (we_t, w9_t, w1_t, w0_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C20); + w1_t = SHA256_EXPAND (wf_t, wa_t, w2_t, w1_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C21); + w2_t = SHA256_EXPAND (w0_t, wb_t, w3_t, w2_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C22); + w3_t = SHA256_EXPAND (w1_t, wc_t, w4_t, w3_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C23); + w4_t = SHA256_EXPAND (w2_t, wd_t, w5_t, w4_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C24); + w5_t = SHA256_EXPAND (w3_t, we_t, w6_t, w5_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C25); + w6_t = SHA256_EXPAND (w4_t, wf_t, w7_t, w6_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C26); + w7_t = SHA256_EXPAND (w5_t, w0_t, w8_t, w7_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C27); + w8_t = SHA256_EXPAND (w6_t, w1_t, w9_t, w8_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C28); + w9_t = SHA256_EXPAND (w7_t, w2_t, wa_t, w9_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C29); + wa_t = SHA256_EXPAND (w8_t, w3_t, wb_t, wa_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C2a); + wb_t = SHA256_EXPAND (w9_t, w4_t, wc_t, wb_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C2b); + wc_t = SHA256_EXPAND (wa_t, w5_t, wd_t, wc_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C2c); + wd_t = SHA256_EXPAND (wb_t, w6_t, we_t, wd_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C2d); + we_t = SHA256_EXPAND (wc_t, w7_t, wf_t, we_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C2e); + wf_t = SHA256_EXPAND (wd_t, w8_t, w0_t, wf_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C2f); + + w0_t = SHA256_EXPAND (we_t, w9_t, w1_t, w0_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C30); + w1_t = SHA256_EXPAND (wf_t, wa_t, w2_t, w1_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C31); + w2_t = SHA256_EXPAND (w0_t, wb_t, w3_t, w2_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C32); + w3_t = SHA256_EXPAND (w1_t, wc_t, w4_t, w3_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C33); + w4_t = SHA256_EXPAND (w2_t, wd_t, w5_t, w4_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C34); + w5_t = SHA256_EXPAND (w3_t, we_t, w6_t, w5_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C35); + w6_t = SHA256_EXPAND (w4_t, wf_t, w7_t, w6_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C36); + w7_t = SHA256_EXPAND (w5_t, w0_t, w8_t, w7_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C37); + w8_t = SHA256_EXPAND (w6_t, w1_t, w9_t, w8_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C38); + w9_t = SHA256_EXPAND (w7_t, w2_t, wa_t, w9_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C39); + wa_t = SHA256_EXPAND (w8_t, w3_t, wb_t, wa_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C3a); + wb_t = SHA256_EXPAND (w9_t, w4_t, wc_t, wb_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C3b); + wc_t = SHA256_EXPAND (wa_t, w5_t, wd_t, wc_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C3c); + wd_t = SHA256_EXPAND (wb_t, w6_t, we_t, wd_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C3d); + we_t = SHA256_EXPAND (wc_t, w7_t, wf_t, we_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C3e); + wf_t = SHA256_EXPAND (wd_t, w8_t, w0_t, wf_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C3f); + + + const u32x r0 = d; + const u32x r1 = h; + const u32x r2 = c; + const u32x r3 = g; + + #include VECT_COMPARE_S + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m01410_s08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m01410_s16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/nv/m01410_a1.cu b/nv/m01410_a1.cu new file mode 100644 index 0000000000..18000985fe --- /dev/null +++ b/nv/m01410_a1.cu @@ -0,0 +1,635 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _SHA256_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW2 +#define VECT_SIZE1 +#endif + +#define DGST_R0 3 +#define DGST_R1 7 +#define DGST_R2 2 +#define DGST_R3 6 + +#include "include/kernel_functions.c" +#include "types_nv.c" +#include "common_nv.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +__device__ __constant__ comb_t c_combs[1024]; + +extern "C" __global__ void __launch_bounds__ (256, 1) m01410_m04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, c_combs[0].pw_len); + } + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[7]; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = c_combs[il_pos].pw_len; + + const u32 pw_len = pw_l_len + pw_r_len; + + u32 wordr0[4]; + + wordr0[0] = c_combs[il_pos].i[0]; + wordr0[1] = c_combs[il_pos].i[1]; + wordr0[2] = c_combs[il_pos].i[2]; + wordr0[3] = c_combs[il_pos].i[3]; + + u32 wordr1[4]; + + wordr1[0] = c_combs[il_pos].i[4]; + wordr1[1] = c_combs[il_pos].i[5]; + wordr1[2] = c_combs[il_pos].i[6]; + wordr1[3] = c_combs[il_pos].i[7]; + + u32 wordr2[4]; + + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + + u32 wordr3[4]; + + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + /** + * append salt + */ + + u32 s0[4]; + + s0[0] = salt_buf0[0]; + s0[1] = salt_buf0[1]; + s0[2] = salt_buf0[2]; + s0[3] = salt_buf0[3]; + + u32 s1[4]; + + s1[0] = salt_buf1[0]; + s1[1] = salt_buf1[1]; + s1[2] = salt_buf1[2]; + s1[3] = salt_buf1[3]; + + u32 s2[4]; + + s2[0] = 0; + s2[1] = 0; + s2[2] = 0; + s2[3] = 0; + + u32 s3[4]; + + s3[0] = 0; + s3[1] = 0; + s3[2] = 0; + s3[3] = 0; + + switch_buffer_by_offset (s0, s1, s2, s3, pw_len); + + const u32 pw_salt_len = pw_len + salt_len; + + u32x w0[4]; + u32x w1[4]; + u32x w2[4]; + u32x w3[4]; + + w0[0] = wordl0[0] | wordr0[0] | s0[0]; + w0[1] = wordl0[1] | wordr0[1] | s0[1]; + w0[2] = wordl0[2] | wordr0[2] | s0[2]; + w0[3] = wordl0[3] | wordr0[3] | s0[3]; + w1[0] = wordl1[0] | wordr1[0] | s1[0]; + w1[1] = wordl1[1] | wordr1[1] | s1[1]; + w1[2] = wordl1[2] | wordr1[2] | s1[2]; + w1[3] = wordl1[3] | wordr1[3] | s1[3]; + w2[0] = wordl2[0] | wordr2[0] | s2[0]; + w2[1] = wordl2[1] | wordr2[1] | s2[1]; + w2[2] = wordl2[2] | wordr2[2] | s2[2]; + w2[3] = wordl2[3] | wordr2[3] | s2[3]; + w3[0] = wordl3[0] | wordr3[0] | s3[0]; + w3[1] = wordl3[1] | wordr3[1] | s3[1]; + w3[2] = wordl3[2] | wordr3[2] | s3[2]; + w3[3] = wordl3[3] | wordr3[3] | s3[3]; + + append_0x80_4 (w0, w1, w2, w3, pw_salt_len); + + /** + * sha256 + */ + + u32x w0_t = swap_workaround (w0[0]); + u32x w1_t = swap_workaround (w0[1]); + u32x w2_t = swap_workaround (w0[2]); + u32x w3_t = swap_workaround (w0[3]); + u32x w4_t = swap_workaround (w1[0]); + u32x w5_t = swap_workaround (w1[1]); + u32x w6_t = swap_workaround (w1[2]); + u32x w7_t = swap_workaround (w1[3]); + u32x w8_t = swap_workaround (w2[0]); + u32x w9_t = swap_workaround (w2[1]); + u32x wa_t = swap_workaround (w2[2]); + u32x wb_t = swap_workaround (w2[3]); + u32x wc_t = swap_workaround (w3[0]); + u32x wd_t = swap_workaround (w3[1]); + u32x we_t = 0; + u32x wf_t = pw_salt_len * 8; + + u32x a = SHA256M_A; + u32x b = SHA256M_B; + u32x c = SHA256M_C; + u32x d = SHA256M_D; + u32x e = SHA256M_E; + u32x f = SHA256M_F; + u32x g = SHA256M_G; + u32x h = SHA256M_H; + + SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C00); + SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C01); + SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C02); + SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C03); + SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C04); + SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C05); + SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C06); + SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C07); + SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C08); + SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C09); + SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C0a); + SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C0b); + SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C0c); + SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C0d); + SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C0e); + SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C0f); + + w0_t = SHA256_EXPAND (we_t, w9_t, w1_t, w0_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C10); + w1_t = SHA256_EXPAND (wf_t, wa_t, w2_t, w1_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C11); + w2_t = SHA256_EXPAND (w0_t, wb_t, w3_t, w2_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C12); + w3_t = SHA256_EXPAND (w1_t, wc_t, w4_t, w3_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C13); + w4_t = SHA256_EXPAND (w2_t, wd_t, w5_t, w4_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C14); + w5_t = SHA256_EXPAND (w3_t, we_t, w6_t, w5_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C15); + w6_t = SHA256_EXPAND (w4_t, wf_t, w7_t, w6_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C16); + w7_t = SHA256_EXPAND (w5_t, w0_t, w8_t, w7_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C17); + w8_t = SHA256_EXPAND (w6_t, w1_t, w9_t, w8_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C18); + w9_t = SHA256_EXPAND (w7_t, w2_t, wa_t, w9_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C19); + wa_t = SHA256_EXPAND (w8_t, w3_t, wb_t, wa_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C1a); + wb_t = SHA256_EXPAND (w9_t, w4_t, wc_t, wb_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C1b); + wc_t = SHA256_EXPAND (wa_t, w5_t, wd_t, wc_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C1c); + wd_t = SHA256_EXPAND (wb_t, w6_t, we_t, wd_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C1d); + we_t = SHA256_EXPAND (wc_t, w7_t, wf_t, we_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C1e); + wf_t = SHA256_EXPAND (wd_t, w8_t, w0_t, wf_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C1f); + + w0_t = SHA256_EXPAND (we_t, w9_t, w1_t, w0_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C20); + w1_t = SHA256_EXPAND (wf_t, wa_t, w2_t, w1_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C21); + w2_t = SHA256_EXPAND (w0_t, wb_t, w3_t, w2_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C22); + w3_t = SHA256_EXPAND (w1_t, wc_t, w4_t, w3_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C23); + w4_t = SHA256_EXPAND (w2_t, wd_t, w5_t, w4_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C24); + w5_t = SHA256_EXPAND (w3_t, we_t, w6_t, w5_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C25); + w6_t = SHA256_EXPAND (w4_t, wf_t, w7_t, w6_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C26); + w7_t = SHA256_EXPAND (w5_t, w0_t, w8_t, w7_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C27); + w8_t = SHA256_EXPAND (w6_t, w1_t, w9_t, w8_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C28); + w9_t = SHA256_EXPAND (w7_t, w2_t, wa_t, w9_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C29); + wa_t = SHA256_EXPAND (w8_t, w3_t, wb_t, wa_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C2a); + wb_t = SHA256_EXPAND (w9_t, w4_t, wc_t, wb_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C2b); + wc_t = SHA256_EXPAND (wa_t, w5_t, wd_t, wc_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C2c); + wd_t = SHA256_EXPAND (wb_t, w6_t, we_t, wd_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C2d); + we_t = SHA256_EXPAND (wc_t, w7_t, wf_t, we_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C2e); + wf_t = SHA256_EXPAND (wd_t, w8_t, w0_t, wf_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C2f); + + w0_t = SHA256_EXPAND (we_t, w9_t, w1_t, w0_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C30); + w1_t = SHA256_EXPAND (wf_t, wa_t, w2_t, w1_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C31); + w2_t = SHA256_EXPAND (w0_t, wb_t, w3_t, w2_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C32); + w3_t = SHA256_EXPAND (w1_t, wc_t, w4_t, w3_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C33); + w4_t = SHA256_EXPAND (w2_t, wd_t, w5_t, w4_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C34); + w5_t = SHA256_EXPAND (w3_t, we_t, w6_t, w5_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C35); + w6_t = SHA256_EXPAND (w4_t, wf_t, w7_t, w6_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C36); + w7_t = SHA256_EXPAND (w5_t, w0_t, w8_t, w7_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C37); + w8_t = SHA256_EXPAND (w6_t, w1_t, w9_t, w8_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C38); + w9_t = SHA256_EXPAND (w7_t, w2_t, wa_t, w9_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C39); + wa_t = SHA256_EXPAND (w8_t, w3_t, wb_t, wa_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C3a); + wb_t = SHA256_EXPAND (w9_t, w4_t, wc_t, wb_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C3b); + wc_t = SHA256_EXPAND (wa_t, w5_t, wd_t, wc_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C3c); + wd_t = SHA256_EXPAND (wb_t, w6_t, we_t, wd_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C3d); + we_t = SHA256_EXPAND (wc_t, w7_t, wf_t, we_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C3e); + wf_t = SHA256_EXPAND (wd_t, w8_t, w0_t, wf_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C3f); + + + const u32x r0 = d; + const u32x r1 = h; + const u32x r2 = c; + const u32x r3 = g; + + #include VECT_COMPARE_M + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m01410_m08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m01410_m16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m01410_s04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, c_combs[0].pw_len); + } + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[7]; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = c_combs[il_pos].pw_len; + + const u32 pw_len = pw_l_len + pw_r_len; + + u32 wordr0[4]; + + wordr0[0] = c_combs[il_pos].i[0]; + wordr0[1] = c_combs[il_pos].i[1]; + wordr0[2] = c_combs[il_pos].i[2]; + wordr0[3] = c_combs[il_pos].i[3]; + + u32 wordr1[4]; + + wordr1[0] = c_combs[il_pos].i[4]; + wordr1[1] = c_combs[il_pos].i[5]; + wordr1[2] = c_combs[il_pos].i[6]; + wordr1[3] = c_combs[il_pos].i[7]; + + u32 wordr2[4]; + + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + + u32 wordr3[4]; + + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + /** + * append salt + */ + + u32 s0[4]; + + s0[0] = salt_buf0[0]; + s0[1] = salt_buf0[1]; + s0[2] = salt_buf0[2]; + s0[3] = salt_buf0[3]; + + u32 s1[4]; + + s1[0] = salt_buf1[0]; + s1[1] = salt_buf1[1]; + s1[2] = salt_buf1[2]; + s1[3] = salt_buf1[3]; + + u32 s2[4]; + + s2[0] = 0; + s2[1] = 0; + s2[2] = 0; + s2[3] = 0; + + u32 s3[4]; + + s3[0] = 0; + s3[1] = 0; + s3[2] = 0; + s3[3] = 0; + + switch_buffer_by_offset (s0, s1, s2, s3, pw_len); + + const u32 pw_salt_len = pw_len + salt_len; + + u32x w0[4]; + u32x w1[4]; + u32x w2[4]; + u32x w3[4]; + + w0[0] = wordl0[0] | wordr0[0] | s0[0]; + w0[1] = wordl0[1] | wordr0[1] | s0[1]; + w0[2] = wordl0[2] | wordr0[2] | s0[2]; + w0[3] = wordl0[3] | wordr0[3] | s0[3]; + w1[0] = wordl1[0] | wordr1[0] | s1[0]; + w1[1] = wordl1[1] | wordr1[1] | s1[1]; + w1[2] = wordl1[2] | wordr1[2] | s1[2]; + w1[3] = wordl1[3] | wordr1[3] | s1[3]; + w2[0] = wordl2[0] | wordr2[0] | s2[0]; + w2[1] = wordl2[1] | wordr2[1] | s2[1]; + w2[2] = wordl2[2] | wordr2[2] | s2[2]; + w2[3] = wordl2[3] | wordr2[3] | s2[3]; + w3[0] = wordl3[0] | wordr3[0] | s3[0]; + w3[1] = wordl3[1] | wordr3[1] | s3[1]; + w3[2] = wordl3[2] | wordr3[2] | s3[2]; + w3[3] = wordl3[3] | wordr3[3] | s3[3]; + + append_0x80_4 (w0, w1, w2, w3, pw_salt_len); + + /** + * sha256 + */ + + u32x w0_t = swap_workaround (w0[0]); + u32x w1_t = swap_workaround (w0[1]); + u32x w2_t = swap_workaround (w0[2]); + u32x w3_t = swap_workaround (w0[3]); + u32x w4_t = swap_workaround (w1[0]); + u32x w5_t = swap_workaround (w1[1]); + u32x w6_t = swap_workaround (w1[2]); + u32x w7_t = swap_workaround (w1[3]); + u32x w8_t = swap_workaround (w2[0]); + u32x w9_t = swap_workaround (w2[1]); + u32x wa_t = swap_workaround (w2[2]); + u32x wb_t = swap_workaround (w2[3]); + u32x wc_t = swap_workaround (w3[0]); + u32x wd_t = swap_workaround (w3[1]); + u32x we_t = 0; + u32x wf_t = pw_salt_len * 8; + + u32x a = SHA256M_A; + u32x b = SHA256M_B; + u32x c = SHA256M_C; + u32x d = SHA256M_D; + u32x e = SHA256M_E; + u32x f = SHA256M_F; + u32x g = SHA256M_G; + u32x h = SHA256M_H; + + SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C00); + SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C01); + SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C02); + SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C03); + SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C04); + SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C05); + SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C06); + SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C07); + SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C08); + SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C09); + SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C0a); + SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C0b); + SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C0c); + SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C0d); + SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C0e); + SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C0f); + + w0_t = SHA256_EXPAND (we_t, w9_t, w1_t, w0_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C10); + w1_t = SHA256_EXPAND (wf_t, wa_t, w2_t, w1_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C11); + w2_t = SHA256_EXPAND (w0_t, wb_t, w3_t, w2_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C12); + w3_t = SHA256_EXPAND (w1_t, wc_t, w4_t, w3_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C13); + w4_t = SHA256_EXPAND (w2_t, wd_t, w5_t, w4_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C14); + w5_t = SHA256_EXPAND (w3_t, we_t, w6_t, w5_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C15); + w6_t = SHA256_EXPAND (w4_t, wf_t, w7_t, w6_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C16); + w7_t = SHA256_EXPAND (w5_t, w0_t, w8_t, w7_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C17); + w8_t = SHA256_EXPAND (w6_t, w1_t, w9_t, w8_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C18); + w9_t = SHA256_EXPAND (w7_t, w2_t, wa_t, w9_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C19); + wa_t = SHA256_EXPAND (w8_t, w3_t, wb_t, wa_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C1a); + wb_t = SHA256_EXPAND (w9_t, w4_t, wc_t, wb_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C1b); + wc_t = SHA256_EXPAND (wa_t, w5_t, wd_t, wc_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C1c); + wd_t = SHA256_EXPAND (wb_t, w6_t, we_t, wd_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C1d); + we_t = SHA256_EXPAND (wc_t, w7_t, wf_t, we_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C1e); + wf_t = SHA256_EXPAND (wd_t, w8_t, w0_t, wf_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C1f); + + w0_t = SHA256_EXPAND (we_t, w9_t, w1_t, w0_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C20); + w1_t = SHA256_EXPAND (wf_t, wa_t, w2_t, w1_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C21); + w2_t = SHA256_EXPAND (w0_t, wb_t, w3_t, w2_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C22); + w3_t = SHA256_EXPAND (w1_t, wc_t, w4_t, w3_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C23); + w4_t = SHA256_EXPAND (w2_t, wd_t, w5_t, w4_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C24); + w5_t = SHA256_EXPAND (w3_t, we_t, w6_t, w5_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C25); + w6_t = SHA256_EXPAND (w4_t, wf_t, w7_t, w6_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C26); + w7_t = SHA256_EXPAND (w5_t, w0_t, w8_t, w7_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C27); + w8_t = SHA256_EXPAND (w6_t, w1_t, w9_t, w8_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C28); + w9_t = SHA256_EXPAND (w7_t, w2_t, wa_t, w9_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C29); + wa_t = SHA256_EXPAND (w8_t, w3_t, wb_t, wa_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C2a); + wb_t = SHA256_EXPAND (w9_t, w4_t, wc_t, wb_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C2b); + wc_t = SHA256_EXPAND (wa_t, w5_t, wd_t, wc_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C2c); + wd_t = SHA256_EXPAND (wb_t, w6_t, we_t, wd_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C2d); + we_t = SHA256_EXPAND (wc_t, w7_t, wf_t, we_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C2e); + wf_t = SHA256_EXPAND (wd_t, w8_t, w0_t, wf_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C2f); + + w0_t = SHA256_EXPAND (we_t, w9_t, w1_t, w0_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C30); + w1_t = SHA256_EXPAND (wf_t, wa_t, w2_t, w1_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C31); + w2_t = SHA256_EXPAND (w0_t, wb_t, w3_t, w2_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C32); + w3_t = SHA256_EXPAND (w1_t, wc_t, w4_t, w3_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C33); + w4_t = SHA256_EXPAND (w2_t, wd_t, w5_t, w4_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C34); + w5_t = SHA256_EXPAND (w3_t, we_t, w6_t, w5_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C35); + w6_t = SHA256_EXPAND (w4_t, wf_t, w7_t, w6_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C36); + w7_t = SHA256_EXPAND (w5_t, w0_t, w8_t, w7_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C37); + w8_t = SHA256_EXPAND (w6_t, w1_t, w9_t, w8_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C38); + w9_t = SHA256_EXPAND (w7_t, w2_t, wa_t, w9_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C39); + wa_t = SHA256_EXPAND (w8_t, w3_t, wb_t, wa_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C3a); + wb_t = SHA256_EXPAND (w9_t, w4_t, wc_t, wb_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C3b); + wc_t = SHA256_EXPAND (wa_t, w5_t, wd_t, wc_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C3c); + wd_t = SHA256_EXPAND (wb_t, w6_t, we_t, wd_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C3d); + we_t = SHA256_EXPAND (wc_t, w7_t, wf_t, we_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C3e); + wf_t = SHA256_EXPAND (wd_t, w8_t, w0_t, wf_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C3f); + + + const u32x r0 = d; + const u32x r1 = h; + const u32x r2 = c; + const u32x r3 = g; + + #include VECT_COMPARE_S + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m01410_s08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m01410_s16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/nv/m01410_a3.cu b/nv/m01410_a3.cu new file mode 100644 index 0000000000..1ae083cdd9 --- /dev/null +++ b/nv/m01410_a3.cu @@ -0,0 +1,595 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _SHA256_ +#define _SCALAR_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW2 +#define VECT_SIZE1 +#endif + +#define DGST_R0 3 +#define DGST_R1 7 +#define DGST_R2 2 +#define DGST_R3 6 + +#include "include/kernel_functions.c" +#include "types_nv.c" +#include "common_nv.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4_warp.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4_warp.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4_warp.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4_warp.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4_warp.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4_warp.c" +#endif + +__device__ __constant__ u32x c_bfs[1024]; + +__device__ static void m01410m (u32 w[16], const u32 pw_len, const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const u32x *words_buf_r, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset) +{ + /** + * modifier + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + const u32 lid = threadIdx.x; + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[ 1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[ 2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[ 3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[ 4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[ 5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[ 6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[ 7]; + + u32 salt_buf2[4]; + + salt_buf2[0] = salt_bufs[salt_pos].salt_buf[ 8]; + salt_buf2[1] = 0; + salt_buf2[2] = 0; + salt_buf2[3] = 0; + + u32 salt_buf3[4]; + + salt_buf3[0] = 0; + salt_buf3[1] = 0; + salt_buf3[2] = 0; + salt_buf3[3] = 0; + + switch_buffer_by_offset (salt_buf0, salt_buf1, salt_buf2, salt_buf3, pw_len); + + w[ 0] |= swap_workaround (salt_buf0[0]); + w[ 1] |= swap_workaround (salt_buf0[1]); + w[ 2] |= swap_workaround (salt_buf0[2]); + w[ 3] |= swap_workaround (salt_buf0[3]); + w[ 4] |= swap_workaround (salt_buf1[0]); + w[ 5] |= swap_workaround (salt_buf1[1]); + w[ 6] |= swap_workaround (salt_buf1[2]); + w[ 7] |= swap_workaround (salt_buf1[3]); + w[ 8] |= swap_workaround (salt_buf2[0]); + w[ 9] |= swap_workaround (salt_buf2[1]); + w[10] |= swap_workaround (salt_buf2[2]); + w[11] |= swap_workaround (salt_buf2[3]); + w[12] |= swap_workaround (salt_buf3[0]); + w[13] |= swap_workaround (salt_buf3[1]); + w[14] |= swap_workaround (salt_buf3[2]); + w[15] |= swap_workaround (salt_buf3[3]); + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + const u32 pw_salt_len = pw_len + salt_len; + + w[15] = pw_salt_len * 8; + + /** + * loop + */ + + const u32 bf_loops = ceil ((float) bfs_cnt / VECT_DIV); + + u32x w0l = w[0]; + + for (u32 il_pos = 0; il_pos < bf_loops; il_pos++) + { + const u32x w0r = c_bfs[il_pos]; + + const u32x w0 = w0l | w0r; + + u32x w0_t = w0; + u32x w1_t = w[ 1]; + u32x w2_t = w[ 2]; + u32x w3_t = w[ 3]; + u32x w4_t = w[ 4]; + u32x w5_t = w[ 5]; + u32x w6_t = w[ 6]; + u32x w7_t = w[ 7]; + u32x w8_t = w[ 8]; + u32x w9_t = w[ 9]; + u32x wa_t = w[10]; + u32x wb_t = w[11]; + u32x wc_t = w[12]; + u32x wd_t = w[13]; + u32x we_t = w[14]; + u32x wf_t = w[15]; + + u32x a = SHA256M_A; + u32x b = SHA256M_B; + u32x c = SHA256M_C; + u32x d = SHA256M_D; + u32x e = SHA256M_E; + u32x f = SHA256M_F; + u32x g = SHA256M_G; + u32x h = SHA256M_H; + + SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C00); + SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C01); + SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C02); + SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C03); + SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C04); + SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C05); + SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C06); + SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C07); + SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C08); + SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C09); + SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C0a); + SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C0b); + SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C0c); + SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C0d); + SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C0e); + SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C0f); + + w0_t = SHA256_EXPAND (we_t, w9_t, w1_t, w0_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C10); + w1_t = SHA256_EXPAND (wf_t, wa_t, w2_t, w1_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C11); + w2_t = SHA256_EXPAND (w0_t, wb_t, w3_t, w2_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C12); + w3_t = SHA256_EXPAND (w1_t, wc_t, w4_t, w3_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C13); + w4_t = SHA256_EXPAND (w2_t, wd_t, w5_t, w4_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C14); + w5_t = SHA256_EXPAND (w3_t, we_t, w6_t, w5_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C15); + w6_t = SHA256_EXPAND (w4_t, wf_t, w7_t, w6_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C16); + w7_t = SHA256_EXPAND (w5_t, w0_t, w8_t, w7_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C17); + w8_t = SHA256_EXPAND (w6_t, w1_t, w9_t, w8_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C18); + w9_t = SHA256_EXPAND (w7_t, w2_t, wa_t, w9_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C19); + wa_t = SHA256_EXPAND (w8_t, w3_t, wb_t, wa_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C1a); + wb_t = SHA256_EXPAND (w9_t, w4_t, wc_t, wb_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C1b); + wc_t = SHA256_EXPAND (wa_t, w5_t, wd_t, wc_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C1c); + wd_t = SHA256_EXPAND (wb_t, w6_t, we_t, wd_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C1d); + we_t = SHA256_EXPAND (wc_t, w7_t, wf_t, we_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C1e); + wf_t = SHA256_EXPAND (wd_t, w8_t, w0_t, wf_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C1f); + + w0_t = SHA256_EXPAND (we_t, w9_t, w1_t, w0_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C20); + w1_t = SHA256_EXPAND (wf_t, wa_t, w2_t, w1_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C21); + w2_t = SHA256_EXPAND (w0_t, wb_t, w3_t, w2_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C22); + w3_t = SHA256_EXPAND (w1_t, wc_t, w4_t, w3_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C23); + w4_t = SHA256_EXPAND (w2_t, wd_t, w5_t, w4_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C24); + w5_t = SHA256_EXPAND (w3_t, we_t, w6_t, w5_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C25); + w6_t = SHA256_EXPAND (w4_t, wf_t, w7_t, w6_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C26); + w7_t = SHA256_EXPAND (w5_t, w0_t, w8_t, w7_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C27); + w8_t = SHA256_EXPAND (w6_t, w1_t, w9_t, w8_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C28); + w9_t = SHA256_EXPAND (w7_t, w2_t, wa_t, w9_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C29); + wa_t = SHA256_EXPAND (w8_t, w3_t, wb_t, wa_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C2a); + wb_t = SHA256_EXPAND (w9_t, w4_t, wc_t, wb_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C2b); + wc_t = SHA256_EXPAND (wa_t, w5_t, wd_t, wc_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C2c); + wd_t = SHA256_EXPAND (wb_t, w6_t, we_t, wd_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C2d); + we_t = SHA256_EXPAND (wc_t, w7_t, wf_t, we_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C2e); + wf_t = SHA256_EXPAND (wd_t, w8_t, w0_t, wf_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C2f); + + w0_t = SHA256_EXPAND (we_t, w9_t, w1_t, w0_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C30); + w1_t = SHA256_EXPAND (wf_t, wa_t, w2_t, w1_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C31); + w2_t = SHA256_EXPAND (w0_t, wb_t, w3_t, w2_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C32); + w3_t = SHA256_EXPAND (w1_t, wc_t, w4_t, w3_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C33); + w4_t = SHA256_EXPAND (w2_t, wd_t, w5_t, w4_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C34); + w5_t = SHA256_EXPAND (w3_t, we_t, w6_t, w5_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C35); + w6_t = SHA256_EXPAND (w4_t, wf_t, w7_t, w6_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C36); + w7_t = SHA256_EXPAND (w5_t, w0_t, w8_t, w7_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C37); + w8_t = SHA256_EXPAND (w6_t, w1_t, w9_t, w8_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C38); + w9_t = SHA256_EXPAND (w7_t, w2_t, wa_t, w9_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C39); + wa_t = SHA256_EXPAND (w8_t, w3_t, wb_t, wa_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C3a); + wb_t = SHA256_EXPAND (w9_t, w4_t, wc_t, wb_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C3b); + wc_t = SHA256_EXPAND (wa_t, w5_t, wd_t, wc_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C3c); + wd_t = SHA256_EXPAND (wb_t, w6_t, we_t, wd_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C3d); + we_t = SHA256_EXPAND (wc_t, w7_t, wf_t, we_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C3e); + wf_t = SHA256_EXPAND (wd_t, w8_t, w0_t, wf_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C3f); + + + const u32x r0 = d; + const u32x r1 = h; + const u32x r2 = c; + const u32x r3 = g; + + #include VECT_COMPARE_M + } +} + +__device__ static void m01410s (u32 w[16], const u32 pw_len, const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const u32x *words_buf_r, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset) +{ + /** + * modifier + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + const u32 lid = threadIdx.x; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * loop + */ + + const u32 bf_loops = ceil ((float) bfs_cnt / VECT_DIV); + + u32x w0l = w[0]; + + for (u32 il_pos = 0; il_pos < bf_loops; il_pos++) + { + const u32x w0r = c_bfs[il_pos]; + + const u32x w0 = w0l | w0r; + + u32x w0_t = w0; + u32x w1_t = w[ 1]; + u32x w2_t = w[ 2]; + u32x w3_t = w[ 3]; + u32x w4_t = w[ 4]; + u32x w5_t = w[ 5]; + u32x w6_t = w[ 6]; + u32x w7_t = w[ 7]; + u32x w8_t = w[ 8]; + u32x w9_t = w[ 9]; + u32x wa_t = w[10]; + u32x wb_t = w[11]; + u32x wc_t = w[12]; + u32x wd_t = w[13]; + u32x we_t = w[14]; + u32x wf_t = w[15]; + + u32x a = SHA256M_A; + u32x b = SHA256M_B; + u32x c = SHA256M_C; + u32x d = SHA256M_D; + u32x e = SHA256M_E; + u32x f = SHA256M_F; + u32x g = SHA256M_G; + u32x h = SHA256M_H; + + SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C00); + SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C01); + SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C02); + SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C03); + SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C04); + SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C05); + SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C06); + SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C07); + SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C08); + SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C09); + SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C0a); + SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C0b); + SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C0c); + SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C0d); + SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C0e); + SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C0f); + + w0_t = SHA256_EXPAND (we_t, w9_t, w1_t, w0_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C10); + w1_t = SHA256_EXPAND (wf_t, wa_t, w2_t, w1_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C11); + w2_t = SHA256_EXPAND (w0_t, wb_t, w3_t, w2_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C12); + w3_t = SHA256_EXPAND (w1_t, wc_t, w4_t, w3_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C13); + w4_t = SHA256_EXPAND (w2_t, wd_t, w5_t, w4_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C14); + w5_t = SHA256_EXPAND (w3_t, we_t, w6_t, w5_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C15); + w6_t = SHA256_EXPAND (w4_t, wf_t, w7_t, w6_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C16); + w7_t = SHA256_EXPAND (w5_t, w0_t, w8_t, w7_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C17); + w8_t = SHA256_EXPAND (w6_t, w1_t, w9_t, w8_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C18); + w9_t = SHA256_EXPAND (w7_t, w2_t, wa_t, w9_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C19); + wa_t = SHA256_EXPAND (w8_t, w3_t, wb_t, wa_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C1a); + wb_t = SHA256_EXPAND (w9_t, w4_t, wc_t, wb_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C1b); + wc_t = SHA256_EXPAND (wa_t, w5_t, wd_t, wc_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C1c); + wd_t = SHA256_EXPAND (wb_t, w6_t, we_t, wd_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C1d); + we_t = SHA256_EXPAND (wc_t, w7_t, wf_t, we_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C1e); + wf_t = SHA256_EXPAND (wd_t, w8_t, w0_t, wf_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C1f); + + w0_t = SHA256_EXPAND (we_t, w9_t, w1_t, w0_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C20); + w1_t = SHA256_EXPAND (wf_t, wa_t, w2_t, w1_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C21); + w2_t = SHA256_EXPAND (w0_t, wb_t, w3_t, w2_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C22); + w3_t = SHA256_EXPAND (w1_t, wc_t, w4_t, w3_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C23); + w4_t = SHA256_EXPAND (w2_t, wd_t, w5_t, w4_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C24); + w5_t = SHA256_EXPAND (w3_t, we_t, w6_t, w5_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C25); + w6_t = SHA256_EXPAND (w4_t, wf_t, w7_t, w6_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C26); + w7_t = SHA256_EXPAND (w5_t, w0_t, w8_t, w7_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C27); + w8_t = SHA256_EXPAND (w6_t, w1_t, w9_t, w8_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C28); + w9_t = SHA256_EXPAND (w7_t, w2_t, wa_t, w9_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C29); + wa_t = SHA256_EXPAND (w8_t, w3_t, wb_t, wa_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C2a); + wb_t = SHA256_EXPAND (w9_t, w4_t, wc_t, wb_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C2b); + wc_t = SHA256_EXPAND (wa_t, w5_t, wd_t, wc_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C2c); + wd_t = SHA256_EXPAND (wb_t, w6_t, we_t, wd_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C2d); + we_t = SHA256_EXPAND (wc_t, w7_t, wf_t, we_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C2e); + wf_t = SHA256_EXPAND (wd_t, w8_t, w0_t, wf_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C2f); + + w0_t = SHA256_EXPAND (we_t, w9_t, w1_t, w0_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C30); + w1_t = SHA256_EXPAND (wf_t, wa_t, w2_t, w1_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C31); + w2_t = SHA256_EXPAND (w0_t, wb_t, w3_t, w2_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C32); + w3_t = SHA256_EXPAND (w1_t, wc_t, w4_t, w3_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C33); + w4_t = SHA256_EXPAND (w2_t, wd_t, w5_t, w4_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C34); + w5_t = SHA256_EXPAND (w3_t, we_t, w6_t, w5_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C35); + w6_t = SHA256_EXPAND (w4_t, wf_t, w7_t, w6_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C36); + w7_t = SHA256_EXPAND (w5_t, w0_t, w8_t, w7_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C37); + w8_t = SHA256_EXPAND (w6_t, w1_t, w9_t, w8_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C38); + w9_t = SHA256_EXPAND (w7_t, w2_t, wa_t, w9_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C39); + wa_t = SHA256_EXPAND (w8_t, w3_t, wb_t, wa_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C3a); + wb_t = SHA256_EXPAND (w9_t, w4_t, wc_t, wb_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C3b); + wc_t = SHA256_EXPAND (wa_t, w5_t, wd_t, wc_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C3c); + wd_t = SHA256_EXPAND (wb_t, w6_t, we_t, wd_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C3d); + we_t = SHA256_EXPAND (wc_t, w7_t, wf_t, we_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C3e); + wf_t = SHA256_EXPAND (wd_t, w8_t, w0_t, wf_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C3f); + + + const u32x r0 = d; + const u32x r1 = h; + const u32x r2 = c; + const u32x r3 = g; + + #include VECT_COMPARE_S + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m01410_m04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const u32x *words_buf_r, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32 w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = 0; + w[ 5] = 0; + w[ 6] = 0; + w[ 7] = 0; + w[ 8] = 0; + w[ 9] = 0; + w[10] = 0; + w[11] = 0; + w[12] = 0; + w[13] = 0; + w[14] = 0; + w[15] = pws[gid].i[15]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m01410m (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m01410_m08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const u32x *words_buf_r, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32 w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = pws[gid].i[ 4]; + w[ 5] = pws[gid].i[ 5]; + w[ 6] = pws[gid].i[ 6]; + w[ 7] = pws[gid].i[ 7]; + w[ 8] = 0; + w[ 9] = 0; + w[10] = 0; + w[11] = 0; + w[12] = 0; + w[13] = 0; + w[14] = 0; + w[15] = pws[gid].i[15]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m01410m (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m01410_m16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const u32x *words_buf_r, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32 w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = pws[gid].i[ 4]; + w[ 5] = pws[gid].i[ 5]; + w[ 6] = pws[gid].i[ 6]; + w[ 7] = pws[gid].i[ 7]; + w[ 8] = pws[gid].i[ 8]; + w[ 9] = pws[gid].i[ 9]; + w[10] = pws[gid].i[10]; + w[11] = pws[gid].i[11]; + w[12] = pws[gid].i[12]; + w[13] = pws[gid].i[13]; + w[14] = pws[gid].i[14]; + w[15] = pws[gid].i[15]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m01410m (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m01410_s04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const u32x *words_buf_r, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32 w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = 0; + w[ 5] = 0; + w[ 6] = 0; + w[ 7] = 0; + w[ 8] = 0; + w[ 9] = 0; + w[10] = 0; + w[11] = 0; + w[12] = 0; + w[13] = 0; + w[14] = 0; + w[15] = pws[gid].i[15]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m01410s (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m01410_s08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const u32x *words_buf_r, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32 w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = pws[gid].i[ 4]; + w[ 5] = pws[gid].i[ 5]; + w[ 6] = pws[gid].i[ 6]; + w[ 7] = pws[gid].i[ 7]; + w[ 8] = 0; + w[ 9] = 0; + w[10] = 0; + w[11] = 0; + w[12] = 0; + w[13] = 0; + w[14] = 0; + w[15] = pws[gid].i[15]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m01410s (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m01410_s16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const u32x *words_buf_r, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32 w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = pws[gid].i[ 4]; + w[ 5] = pws[gid].i[ 5]; + w[ 6] = pws[gid].i[ 6]; + w[ 7] = pws[gid].i[ 7]; + w[ 8] = pws[gid].i[ 8]; + w[ 9] = pws[gid].i[ 9]; + w[10] = pws[gid].i[10]; + w[11] = pws[gid].i[11]; + w[12] = pws[gid].i[12]; + w[13] = pws[gid].i[13]; + w[14] = pws[gid].i[14]; + w[15] = pws[gid].i[15]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m01410s (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} diff --git a/nv/m01420_a0.cu b/nv/m01420_a0.cu new file mode 100644 index 0000000000..e256794af5 --- /dev/null +++ b/nv/m01420_a0.cu @@ -0,0 +1,503 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _SHA256_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW2 +#define VECT_SIZE1 +#endif + +#define DGST_R0 3 +#define DGST_R1 7 +#define DGST_R2 2 +#define DGST_R3 6 + +#include "include/kernel_functions.c" +#include "types_nv.c" +#include "common_nv.c" +#include "include/rp_gpu.h" +#include "rp_nv.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +__device__ __constant__ gpu_rule_t c_rules[1024]; + +extern "C" __global__ void __launch_bounds__ (256, 1) m01420_m04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + u32x pw_buf1[4]; + + pw_buf1[0] = pws[gid].i[ 4]; + pw_buf1[1] = pws[gid].i[ 5]; + pw_buf1[2] = pws[gid].i[ 6]; + pw_buf1[3] = pws[gid].i[ 7]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[7]; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + + w0[0] = pw_buf0[0]; + w0[1] = pw_buf0[1]; + w0[2] = pw_buf0[2]; + w0[3] = pw_buf0[3]; + + u32x w1[4]; + + w1[0] = pw_buf1[0]; + w1[1] = pw_buf1[1]; + w1[2] = pw_buf1[2]; + w1[3] = pw_buf1[3]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 out_len = apply_rules (c_rules[il_pos].cmds, w0, w1, pw_len); + + /** + * prepend salt + */ + + const u32 out_salt_len = out_len + salt_len; + + switch_buffer_by_offset (w0, w1, w2, w3, salt_len); + + w0[0] |= salt_buf0[0]; + w0[1] |= salt_buf0[1]; + w0[2] |= salt_buf0[2]; + w0[3] |= salt_buf0[3]; + w1[0] |= salt_buf1[0]; + w1[1] |= salt_buf1[1]; + w1[2] |= salt_buf1[2]; + w1[3] |= salt_buf1[3]; + + append_0x80_4 (w0, w1, w2, w3, out_salt_len); + + /** + * sha256 + */ + + u32x w0_t = swap_workaround (w0[0]); + u32x w1_t = swap_workaround (w0[1]); + u32x w2_t = swap_workaround (w0[2]); + u32x w3_t = swap_workaround (w0[3]); + u32x w4_t = swap_workaround (w1[0]); + u32x w5_t = swap_workaround (w1[1]); + u32x w6_t = swap_workaround (w1[2]); + u32x w7_t = swap_workaround (w1[3]); + u32x w8_t = swap_workaround (w2[0]); + u32x w9_t = swap_workaround (w2[1]); + u32x wa_t = swap_workaround (w2[2]); + u32x wb_t = swap_workaround (w2[3]); + u32x wc_t = swap_workaround (w3[0]); + u32x wd_t = swap_workaround (w3[1]); + u32x we_t = 0; + u32x wf_t = out_salt_len * 8; + + u32x a = SHA256M_A; + u32x b = SHA256M_B; + u32x c = SHA256M_C; + u32x d = SHA256M_D; + u32x e = SHA256M_E; + u32x f = SHA256M_F; + u32x g = SHA256M_G; + u32x h = SHA256M_H; + + SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C00); + SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C01); + SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C02); + SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C03); + SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C04); + SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C05); + SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C06); + SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C07); + SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C08); + SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C09); + SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C0a); + SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C0b); + SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C0c); + SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C0d); + SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C0e); + SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C0f); + + w0_t = SHA256_EXPAND (we_t, w9_t, w1_t, w0_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C10); + w1_t = SHA256_EXPAND (wf_t, wa_t, w2_t, w1_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C11); + w2_t = SHA256_EXPAND (w0_t, wb_t, w3_t, w2_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C12); + w3_t = SHA256_EXPAND (w1_t, wc_t, w4_t, w3_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C13); + w4_t = SHA256_EXPAND (w2_t, wd_t, w5_t, w4_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C14); + w5_t = SHA256_EXPAND (w3_t, we_t, w6_t, w5_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C15); + w6_t = SHA256_EXPAND (w4_t, wf_t, w7_t, w6_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C16); + w7_t = SHA256_EXPAND (w5_t, w0_t, w8_t, w7_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C17); + w8_t = SHA256_EXPAND (w6_t, w1_t, w9_t, w8_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C18); + w9_t = SHA256_EXPAND (w7_t, w2_t, wa_t, w9_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C19); + wa_t = SHA256_EXPAND (w8_t, w3_t, wb_t, wa_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C1a); + wb_t = SHA256_EXPAND (w9_t, w4_t, wc_t, wb_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C1b); + wc_t = SHA256_EXPAND (wa_t, w5_t, wd_t, wc_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C1c); + wd_t = SHA256_EXPAND (wb_t, w6_t, we_t, wd_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C1d); + we_t = SHA256_EXPAND (wc_t, w7_t, wf_t, we_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C1e); + wf_t = SHA256_EXPAND (wd_t, w8_t, w0_t, wf_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C1f); + + w0_t = SHA256_EXPAND (we_t, w9_t, w1_t, w0_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C20); + w1_t = SHA256_EXPAND (wf_t, wa_t, w2_t, w1_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C21); + w2_t = SHA256_EXPAND (w0_t, wb_t, w3_t, w2_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C22); + w3_t = SHA256_EXPAND (w1_t, wc_t, w4_t, w3_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C23); + w4_t = SHA256_EXPAND (w2_t, wd_t, w5_t, w4_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C24); + w5_t = SHA256_EXPAND (w3_t, we_t, w6_t, w5_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C25); + w6_t = SHA256_EXPAND (w4_t, wf_t, w7_t, w6_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C26); + w7_t = SHA256_EXPAND (w5_t, w0_t, w8_t, w7_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C27); + w8_t = SHA256_EXPAND (w6_t, w1_t, w9_t, w8_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C28); + w9_t = SHA256_EXPAND (w7_t, w2_t, wa_t, w9_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C29); + wa_t = SHA256_EXPAND (w8_t, w3_t, wb_t, wa_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C2a); + wb_t = SHA256_EXPAND (w9_t, w4_t, wc_t, wb_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C2b); + wc_t = SHA256_EXPAND (wa_t, w5_t, wd_t, wc_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C2c); + wd_t = SHA256_EXPAND (wb_t, w6_t, we_t, wd_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C2d); + we_t = SHA256_EXPAND (wc_t, w7_t, wf_t, we_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C2e); + wf_t = SHA256_EXPAND (wd_t, w8_t, w0_t, wf_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C2f); + + w0_t = SHA256_EXPAND (we_t, w9_t, w1_t, w0_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C30); + w1_t = SHA256_EXPAND (wf_t, wa_t, w2_t, w1_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C31); + w2_t = SHA256_EXPAND (w0_t, wb_t, w3_t, w2_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C32); + w3_t = SHA256_EXPAND (w1_t, wc_t, w4_t, w3_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C33); + w4_t = SHA256_EXPAND (w2_t, wd_t, w5_t, w4_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C34); + w5_t = SHA256_EXPAND (w3_t, we_t, w6_t, w5_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C35); + w6_t = SHA256_EXPAND (w4_t, wf_t, w7_t, w6_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C36); + w7_t = SHA256_EXPAND (w5_t, w0_t, w8_t, w7_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C37); + w8_t = SHA256_EXPAND (w6_t, w1_t, w9_t, w8_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C38); + w9_t = SHA256_EXPAND (w7_t, w2_t, wa_t, w9_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C39); + wa_t = SHA256_EXPAND (w8_t, w3_t, wb_t, wa_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C3a); + wb_t = SHA256_EXPAND (w9_t, w4_t, wc_t, wb_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C3b); + wc_t = SHA256_EXPAND (wa_t, w5_t, wd_t, wc_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C3c); + wd_t = SHA256_EXPAND (wb_t, w6_t, we_t, wd_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C3d); + we_t = SHA256_EXPAND (wc_t, w7_t, wf_t, we_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C3e); + wf_t = SHA256_EXPAND (wd_t, w8_t, w0_t, wf_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C3f); + + + const u32x r0 = d; + const u32x r1 = h; + const u32x r2 = c; + const u32x r3 = g; + + #include VECT_COMPARE_M + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m01420_m08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m01420_m16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m01420_s04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + u32x pw_buf1[4]; + + pw_buf1[0] = pws[gid].i[ 4]; + pw_buf1[1] = pws[gid].i[ 5]; + pw_buf1[2] = pws[gid].i[ 6]; + pw_buf1[3] = pws[gid].i[ 7]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[7]; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + + w0[0] = pw_buf0[0]; + w0[1] = pw_buf0[1]; + w0[2] = pw_buf0[2]; + w0[3] = pw_buf0[3]; + + u32x w1[4]; + + w1[0] = pw_buf1[0]; + w1[1] = pw_buf1[1]; + w1[2] = pw_buf1[2]; + w1[3] = pw_buf1[3]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 out_len = apply_rules (c_rules[il_pos].cmds, w0, w1, pw_len); + + /** + * prepend salt + */ + + const u32 out_salt_len = out_len + salt_len; + + switch_buffer_by_offset (w0, w1, w2, w3, salt_len); + + w0[0] |= salt_buf0[0]; + w0[1] |= salt_buf0[1]; + w0[2] |= salt_buf0[2]; + w0[3] |= salt_buf0[3]; + w1[0] |= salt_buf1[0]; + w1[1] |= salt_buf1[1]; + w1[2] |= salt_buf1[2]; + w1[3] |= salt_buf1[3]; + + append_0x80_4 (w0, w1, w2, w3, out_salt_len); + + /** + * sha256 + */ + + u32x w0_t = swap_workaround (w0[0]); + u32x w1_t = swap_workaround (w0[1]); + u32x w2_t = swap_workaround (w0[2]); + u32x w3_t = swap_workaround (w0[3]); + u32x w4_t = swap_workaround (w1[0]); + u32x w5_t = swap_workaround (w1[1]); + u32x w6_t = swap_workaround (w1[2]); + u32x w7_t = swap_workaround (w1[3]); + u32x w8_t = swap_workaround (w2[0]); + u32x w9_t = swap_workaround (w2[1]); + u32x wa_t = swap_workaround (w2[2]); + u32x wb_t = swap_workaround (w2[3]); + u32x wc_t = swap_workaround (w3[0]); + u32x wd_t = swap_workaround (w3[1]); + u32x we_t = 0; + u32x wf_t = out_salt_len * 8; + + u32x a = SHA256M_A; + u32x b = SHA256M_B; + u32x c = SHA256M_C; + u32x d = SHA256M_D; + u32x e = SHA256M_E; + u32x f = SHA256M_F; + u32x g = SHA256M_G; + u32x h = SHA256M_H; + + SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C00); + SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C01); + SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C02); + SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C03); + SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C04); + SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C05); + SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C06); + SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C07); + SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C08); + SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C09); + SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C0a); + SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C0b); + SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C0c); + SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C0d); + SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C0e); + SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C0f); + + w0_t = SHA256_EXPAND (we_t, w9_t, w1_t, w0_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C10); + w1_t = SHA256_EXPAND (wf_t, wa_t, w2_t, w1_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C11); + w2_t = SHA256_EXPAND (w0_t, wb_t, w3_t, w2_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C12); + w3_t = SHA256_EXPAND (w1_t, wc_t, w4_t, w3_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C13); + w4_t = SHA256_EXPAND (w2_t, wd_t, w5_t, w4_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C14); + w5_t = SHA256_EXPAND (w3_t, we_t, w6_t, w5_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C15); + w6_t = SHA256_EXPAND (w4_t, wf_t, w7_t, w6_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C16); + w7_t = SHA256_EXPAND (w5_t, w0_t, w8_t, w7_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C17); + w8_t = SHA256_EXPAND (w6_t, w1_t, w9_t, w8_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C18); + w9_t = SHA256_EXPAND (w7_t, w2_t, wa_t, w9_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C19); + wa_t = SHA256_EXPAND (w8_t, w3_t, wb_t, wa_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C1a); + wb_t = SHA256_EXPAND (w9_t, w4_t, wc_t, wb_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C1b); + wc_t = SHA256_EXPAND (wa_t, w5_t, wd_t, wc_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C1c); + wd_t = SHA256_EXPAND (wb_t, w6_t, we_t, wd_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C1d); + we_t = SHA256_EXPAND (wc_t, w7_t, wf_t, we_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C1e); + wf_t = SHA256_EXPAND (wd_t, w8_t, w0_t, wf_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C1f); + + w0_t = SHA256_EXPAND (we_t, w9_t, w1_t, w0_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C20); + w1_t = SHA256_EXPAND (wf_t, wa_t, w2_t, w1_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C21); + w2_t = SHA256_EXPAND (w0_t, wb_t, w3_t, w2_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C22); + w3_t = SHA256_EXPAND (w1_t, wc_t, w4_t, w3_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C23); + w4_t = SHA256_EXPAND (w2_t, wd_t, w5_t, w4_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C24); + w5_t = SHA256_EXPAND (w3_t, we_t, w6_t, w5_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C25); + w6_t = SHA256_EXPAND (w4_t, wf_t, w7_t, w6_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C26); + w7_t = SHA256_EXPAND (w5_t, w0_t, w8_t, w7_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C27); + w8_t = SHA256_EXPAND (w6_t, w1_t, w9_t, w8_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C28); + w9_t = SHA256_EXPAND (w7_t, w2_t, wa_t, w9_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C29); + wa_t = SHA256_EXPAND (w8_t, w3_t, wb_t, wa_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C2a); + wb_t = SHA256_EXPAND (w9_t, w4_t, wc_t, wb_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C2b); + wc_t = SHA256_EXPAND (wa_t, w5_t, wd_t, wc_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C2c); + wd_t = SHA256_EXPAND (wb_t, w6_t, we_t, wd_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C2d); + we_t = SHA256_EXPAND (wc_t, w7_t, wf_t, we_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C2e); + wf_t = SHA256_EXPAND (wd_t, w8_t, w0_t, wf_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C2f); + + w0_t = SHA256_EXPAND (we_t, w9_t, w1_t, w0_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C30); + w1_t = SHA256_EXPAND (wf_t, wa_t, w2_t, w1_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C31); + w2_t = SHA256_EXPAND (w0_t, wb_t, w3_t, w2_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C32); + w3_t = SHA256_EXPAND (w1_t, wc_t, w4_t, w3_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C33); + w4_t = SHA256_EXPAND (w2_t, wd_t, w5_t, w4_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C34); + w5_t = SHA256_EXPAND (w3_t, we_t, w6_t, w5_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C35); + w6_t = SHA256_EXPAND (w4_t, wf_t, w7_t, w6_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C36); + w7_t = SHA256_EXPAND (w5_t, w0_t, w8_t, w7_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C37); + w8_t = SHA256_EXPAND (w6_t, w1_t, w9_t, w8_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C38); + w9_t = SHA256_EXPAND (w7_t, w2_t, wa_t, w9_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C39); + wa_t = SHA256_EXPAND (w8_t, w3_t, wb_t, wa_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C3a); + wb_t = SHA256_EXPAND (w9_t, w4_t, wc_t, wb_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C3b); + wc_t = SHA256_EXPAND (wa_t, w5_t, wd_t, wc_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C3c); + wd_t = SHA256_EXPAND (wb_t, w6_t, we_t, wd_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C3d); + we_t = SHA256_EXPAND (wc_t, w7_t, wf_t, we_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C3e); + wf_t = SHA256_EXPAND (wd_t, w8_t, w0_t, wf_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C3f); + + + const u32x r0 = d; + const u32x r1 = h; + const u32x r2 = c; + const u32x r3 = g; + + #include VECT_COMPARE_S + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m01420_s08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m01420_s16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/nv/m01420_a1.cu b/nv/m01420_a1.cu new file mode 100644 index 0000000000..0d8bda5548 --- /dev/null +++ b/nv/m01420_a1.cu @@ -0,0 +1,585 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _SHA256_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW2 +#define VECT_SIZE1 +#endif + +#define DGST_R0 3 +#define DGST_R1 7 +#define DGST_R2 2 +#define DGST_R3 6 + +#include "include/kernel_functions.c" +#include "types_nv.c" +#include "common_nv.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +__device__ __constant__ comb_t c_combs[1024]; + +extern "C" __global__ void __launch_bounds__ (256, 1) m01420_m04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, c_combs[0].pw_len); + } + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[7]; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = c_combs[il_pos].pw_len; + + const u32 pw_len = pw_l_len + pw_r_len; + + u32 wordr0[4]; + u32 wordr1[4]; + u32 wordr2[4]; + u32 wordr3[4]; + + wordr0[0] = c_combs[il_pos].i[0]; + wordr0[1] = c_combs[il_pos].i[1]; + wordr0[2] = c_combs[il_pos].i[2]; + wordr0[3] = c_combs[il_pos].i[3]; + wordr1[0] = c_combs[il_pos].i[4]; + wordr1[1] = c_combs[il_pos].i[5]; + wordr1[2] = c_combs[il_pos].i[6]; + wordr1[3] = c_combs[il_pos].i[7]; + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + u32x w0[4]; + u32x w1[4]; + u32x w2[4]; + u32x w3[4]; + + w0[0] = wordl0[0] | wordr0[0]; + w0[1] = wordl0[1] | wordr0[1]; + w0[2] = wordl0[2] | wordr0[2]; + w0[3] = wordl0[3] | wordr0[3]; + w1[0] = wordl1[0] | wordr1[0]; + w1[1] = wordl1[1] | wordr1[1]; + w1[2] = wordl1[2] | wordr1[2]; + w1[3] = wordl1[3] | wordr1[3]; + w2[0] = wordl2[0] | wordr2[0]; + w2[1] = wordl2[1] | wordr2[1]; + w2[2] = wordl2[2] | wordr2[2]; + w2[3] = wordl2[3] | wordr2[3]; + w3[0] = wordl3[0] | wordr3[0]; + w3[1] = wordl3[1] | wordr3[1]; + w3[2] = wordl3[2] | wordr3[2]; + w3[3] = wordl3[3] | wordr3[3]; + + /** + * prepend salt + */ + + const u32 pw_salt_len = pw_len + salt_len; + + switch_buffer_by_offset (w0, w1, w2, w3, salt_len); + + w0[0] |= salt_buf0[0]; + w0[1] |= salt_buf0[1]; + w0[2] |= salt_buf0[2]; + w0[3] |= salt_buf0[3]; + w1[0] |= salt_buf1[0]; + w1[1] |= salt_buf1[1]; + w1[2] |= salt_buf1[2]; + w1[3] |= salt_buf1[3]; + + append_0x80_4 (w0, w1, w2, w3, pw_salt_len); + + /** + * sha256 + */ + + u32x w0_t = swap_workaround (w0[0]); + u32x w1_t = swap_workaround (w0[1]); + u32x w2_t = swap_workaround (w0[2]); + u32x w3_t = swap_workaround (w0[3]); + u32x w4_t = swap_workaround (w1[0]); + u32x w5_t = swap_workaround (w1[1]); + u32x w6_t = swap_workaround (w1[2]); + u32x w7_t = swap_workaround (w1[3]); + u32x w8_t = swap_workaround (w2[0]); + u32x w9_t = swap_workaround (w2[1]); + u32x wa_t = swap_workaround (w2[2]); + u32x wb_t = swap_workaround (w2[3]); + u32x wc_t = swap_workaround (w3[0]); + u32x wd_t = swap_workaround (w3[1]); + u32x we_t = 0; + u32x wf_t = pw_salt_len * 8; + + u32x a = SHA256M_A; + u32x b = SHA256M_B; + u32x c = SHA256M_C; + u32x d = SHA256M_D; + u32x e = SHA256M_E; + u32x f = SHA256M_F; + u32x g = SHA256M_G; + u32x h = SHA256M_H; + + SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C00); + SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C01); + SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C02); + SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C03); + SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C04); + SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C05); + SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C06); + SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C07); + SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C08); + SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C09); + SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C0a); + SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C0b); + SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C0c); + SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C0d); + SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C0e); + SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C0f); + + w0_t = SHA256_EXPAND (we_t, w9_t, w1_t, w0_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C10); + w1_t = SHA256_EXPAND (wf_t, wa_t, w2_t, w1_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C11); + w2_t = SHA256_EXPAND (w0_t, wb_t, w3_t, w2_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C12); + w3_t = SHA256_EXPAND (w1_t, wc_t, w4_t, w3_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C13); + w4_t = SHA256_EXPAND (w2_t, wd_t, w5_t, w4_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C14); + w5_t = SHA256_EXPAND (w3_t, we_t, w6_t, w5_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C15); + w6_t = SHA256_EXPAND (w4_t, wf_t, w7_t, w6_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C16); + w7_t = SHA256_EXPAND (w5_t, w0_t, w8_t, w7_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C17); + w8_t = SHA256_EXPAND (w6_t, w1_t, w9_t, w8_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C18); + w9_t = SHA256_EXPAND (w7_t, w2_t, wa_t, w9_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C19); + wa_t = SHA256_EXPAND (w8_t, w3_t, wb_t, wa_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C1a); + wb_t = SHA256_EXPAND (w9_t, w4_t, wc_t, wb_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C1b); + wc_t = SHA256_EXPAND (wa_t, w5_t, wd_t, wc_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C1c); + wd_t = SHA256_EXPAND (wb_t, w6_t, we_t, wd_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C1d); + we_t = SHA256_EXPAND (wc_t, w7_t, wf_t, we_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C1e); + wf_t = SHA256_EXPAND (wd_t, w8_t, w0_t, wf_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C1f); + + w0_t = SHA256_EXPAND (we_t, w9_t, w1_t, w0_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C20); + w1_t = SHA256_EXPAND (wf_t, wa_t, w2_t, w1_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C21); + w2_t = SHA256_EXPAND (w0_t, wb_t, w3_t, w2_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C22); + w3_t = SHA256_EXPAND (w1_t, wc_t, w4_t, w3_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C23); + w4_t = SHA256_EXPAND (w2_t, wd_t, w5_t, w4_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C24); + w5_t = SHA256_EXPAND (w3_t, we_t, w6_t, w5_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C25); + w6_t = SHA256_EXPAND (w4_t, wf_t, w7_t, w6_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C26); + w7_t = SHA256_EXPAND (w5_t, w0_t, w8_t, w7_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C27); + w8_t = SHA256_EXPAND (w6_t, w1_t, w9_t, w8_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C28); + w9_t = SHA256_EXPAND (w7_t, w2_t, wa_t, w9_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C29); + wa_t = SHA256_EXPAND (w8_t, w3_t, wb_t, wa_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C2a); + wb_t = SHA256_EXPAND (w9_t, w4_t, wc_t, wb_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C2b); + wc_t = SHA256_EXPAND (wa_t, w5_t, wd_t, wc_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C2c); + wd_t = SHA256_EXPAND (wb_t, w6_t, we_t, wd_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C2d); + we_t = SHA256_EXPAND (wc_t, w7_t, wf_t, we_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C2e); + wf_t = SHA256_EXPAND (wd_t, w8_t, w0_t, wf_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C2f); + + w0_t = SHA256_EXPAND (we_t, w9_t, w1_t, w0_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C30); + w1_t = SHA256_EXPAND (wf_t, wa_t, w2_t, w1_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C31); + w2_t = SHA256_EXPAND (w0_t, wb_t, w3_t, w2_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C32); + w3_t = SHA256_EXPAND (w1_t, wc_t, w4_t, w3_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C33); + w4_t = SHA256_EXPAND (w2_t, wd_t, w5_t, w4_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C34); + w5_t = SHA256_EXPAND (w3_t, we_t, w6_t, w5_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C35); + w6_t = SHA256_EXPAND (w4_t, wf_t, w7_t, w6_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C36); + w7_t = SHA256_EXPAND (w5_t, w0_t, w8_t, w7_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C37); + w8_t = SHA256_EXPAND (w6_t, w1_t, w9_t, w8_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C38); + w9_t = SHA256_EXPAND (w7_t, w2_t, wa_t, w9_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C39); + wa_t = SHA256_EXPAND (w8_t, w3_t, wb_t, wa_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C3a); + wb_t = SHA256_EXPAND (w9_t, w4_t, wc_t, wb_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C3b); + wc_t = SHA256_EXPAND (wa_t, w5_t, wd_t, wc_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C3c); + wd_t = SHA256_EXPAND (wb_t, w6_t, we_t, wd_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C3d); + we_t = SHA256_EXPAND (wc_t, w7_t, wf_t, we_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C3e); + wf_t = SHA256_EXPAND (wd_t, w8_t, w0_t, wf_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C3f); + + + const u32x r0 = d; + const u32x r1 = h; + const u32x r2 = c; + const u32x r3 = g; + + #include VECT_COMPARE_M + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m01420_m08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m01420_m16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m01420_s04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, c_combs[0].pw_len); + } + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[7]; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = c_combs[il_pos].pw_len; + + const u32 pw_len = pw_l_len + pw_r_len; + + u32 wordr0[4]; + u32 wordr1[4]; + u32 wordr2[4]; + u32 wordr3[4]; + + wordr0[0] = c_combs[il_pos].i[0]; + wordr0[1] = c_combs[il_pos].i[1]; + wordr0[2] = c_combs[il_pos].i[2]; + wordr0[3] = c_combs[il_pos].i[3]; + wordr1[0] = c_combs[il_pos].i[4]; + wordr1[1] = c_combs[il_pos].i[5]; + wordr1[2] = c_combs[il_pos].i[6]; + wordr1[3] = c_combs[il_pos].i[7]; + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + u32x w0[4]; + u32x w1[4]; + u32x w2[4]; + u32x w3[4]; + + w0[0] = wordl0[0] | wordr0[0]; + w0[1] = wordl0[1] | wordr0[1]; + w0[2] = wordl0[2] | wordr0[2]; + w0[3] = wordl0[3] | wordr0[3]; + w1[0] = wordl1[0] | wordr1[0]; + w1[1] = wordl1[1] | wordr1[1]; + w1[2] = wordl1[2] | wordr1[2]; + w1[3] = wordl1[3] | wordr1[3]; + w2[0] = wordl2[0] | wordr2[0]; + w2[1] = wordl2[1] | wordr2[1]; + w2[2] = wordl2[2] | wordr2[2]; + w2[3] = wordl2[3] | wordr2[3]; + w3[0] = wordl3[0] | wordr3[0]; + w3[1] = wordl3[1] | wordr3[1]; + w3[2] = wordl3[2] | wordr3[2]; + w3[3] = wordl3[3] | wordr3[3]; + + /** + * prepend salt + */ + + const u32 pw_salt_len = pw_len + salt_len; + + switch_buffer_by_offset (w0, w1, w2, w3, salt_len); + + w0[0] |= salt_buf0[0]; + w0[1] |= salt_buf0[1]; + w0[2] |= salt_buf0[2]; + w0[3] |= salt_buf0[3]; + w1[0] |= salt_buf1[0]; + w1[1] |= salt_buf1[1]; + w1[2] |= salt_buf1[2]; + w1[3] |= salt_buf1[3]; + + append_0x80_4 (w0, w1, w2, w3, pw_salt_len); + + /** + * sha256 + */ + + u32x w0_t = swap_workaround (w0[0]); + u32x w1_t = swap_workaround (w0[1]); + u32x w2_t = swap_workaround (w0[2]); + u32x w3_t = swap_workaround (w0[3]); + u32x w4_t = swap_workaround (w1[0]); + u32x w5_t = swap_workaround (w1[1]); + u32x w6_t = swap_workaround (w1[2]); + u32x w7_t = swap_workaround (w1[3]); + u32x w8_t = swap_workaround (w2[0]); + u32x w9_t = swap_workaround (w2[1]); + u32x wa_t = swap_workaround (w2[2]); + u32x wb_t = swap_workaround (w2[3]); + u32x wc_t = swap_workaround (w3[0]); + u32x wd_t = swap_workaround (w3[1]); + u32x we_t = 0; + u32x wf_t = pw_salt_len * 8; + + u32x a = SHA256M_A; + u32x b = SHA256M_B; + u32x c = SHA256M_C; + u32x d = SHA256M_D; + u32x e = SHA256M_E; + u32x f = SHA256M_F; + u32x g = SHA256M_G; + u32x h = SHA256M_H; + + SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C00); + SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C01); + SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C02); + SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C03); + SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C04); + SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C05); + SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C06); + SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C07); + SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C08); + SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C09); + SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C0a); + SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C0b); + SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C0c); + SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C0d); + SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C0e); + SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C0f); + + w0_t = SHA256_EXPAND (we_t, w9_t, w1_t, w0_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C10); + w1_t = SHA256_EXPAND (wf_t, wa_t, w2_t, w1_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C11); + w2_t = SHA256_EXPAND (w0_t, wb_t, w3_t, w2_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C12); + w3_t = SHA256_EXPAND (w1_t, wc_t, w4_t, w3_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C13); + w4_t = SHA256_EXPAND (w2_t, wd_t, w5_t, w4_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C14); + w5_t = SHA256_EXPAND (w3_t, we_t, w6_t, w5_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C15); + w6_t = SHA256_EXPAND (w4_t, wf_t, w7_t, w6_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C16); + w7_t = SHA256_EXPAND (w5_t, w0_t, w8_t, w7_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C17); + w8_t = SHA256_EXPAND (w6_t, w1_t, w9_t, w8_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C18); + w9_t = SHA256_EXPAND (w7_t, w2_t, wa_t, w9_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C19); + wa_t = SHA256_EXPAND (w8_t, w3_t, wb_t, wa_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C1a); + wb_t = SHA256_EXPAND (w9_t, w4_t, wc_t, wb_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C1b); + wc_t = SHA256_EXPAND (wa_t, w5_t, wd_t, wc_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C1c); + wd_t = SHA256_EXPAND (wb_t, w6_t, we_t, wd_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C1d); + we_t = SHA256_EXPAND (wc_t, w7_t, wf_t, we_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C1e); + wf_t = SHA256_EXPAND (wd_t, w8_t, w0_t, wf_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C1f); + + w0_t = SHA256_EXPAND (we_t, w9_t, w1_t, w0_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C20); + w1_t = SHA256_EXPAND (wf_t, wa_t, w2_t, w1_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C21); + w2_t = SHA256_EXPAND (w0_t, wb_t, w3_t, w2_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C22); + w3_t = SHA256_EXPAND (w1_t, wc_t, w4_t, w3_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C23); + w4_t = SHA256_EXPAND (w2_t, wd_t, w5_t, w4_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C24); + w5_t = SHA256_EXPAND (w3_t, we_t, w6_t, w5_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C25); + w6_t = SHA256_EXPAND (w4_t, wf_t, w7_t, w6_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C26); + w7_t = SHA256_EXPAND (w5_t, w0_t, w8_t, w7_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C27); + w8_t = SHA256_EXPAND (w6_t, w1_t, w9_t, w8_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C28); + w9_t = SHA256_EXPAND (w7_t, w2_t, wa_t, w9_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C29); + wa_t = SHA256_EXPAND (w8_t, w3_t, wb_t, wa_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C2a); + wb_t = SHA256_EXPAND (w9_t, w4_t, wc_t, wb_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C2b); + wc_t = SHA256_EXPAND (wa_t, w5_t, wd_t, wc_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C2c); + wd_t = SHA256_EXPAND (wb_t, w6_t, we_t, wd_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C2d); + we_t = SHA256_EXPAND (wc_t, w7_t, wf_t, we_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C2e); + wf_t = SHA256_EXPAND (wd_t, w8_t, w0_t, wf_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C2f); + + w0_t = SHA256_EXPAND (we_t, w9_t, w1_t, w0_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C30); + w1_t = SHA256_EXPAND (wf_t, wa_t, w2_t, w1_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C31); + w2_t = SHA256_EXPAND (w0_t, wb_t, w3_t, w2_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C32); + w3_t = SHA256_EXPAND (w1_t, wc_t, w4_t, w3_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C33); + w4_t = SHA256_EXPAND (w2_t, wd_t, w5_t, w4_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C34); + w5_t = SHA256_EXPAND (w3_t, we_t, w6_t, w5_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C35); + w6_t = SHA256_EXPAND (w4_t, wf_t, w7_t, w6_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C36); + w7_t = SHA256_EXPAND (w5_t, w0_t, w8_t, w7_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C37); + w8_t = SHA256_EXPAND (w6_t, w1_t, w9_t, w8_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C38); + w9_t = SHA256_EXPAND (w7_t, w2_t, wa_t, w9_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C39); + wa_t = SHA256_EXPAND (w8_t, w3_t, wb_t, wa_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C3a); + wb_t = SHA256_EXPAND (w9_t, w4_t, wc_t, wb_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C3b); + wc_t = SHA256_EXPAND (wa_t, w5_t, wd_t, wc_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C3c); + wd_t = SHA256_EXPAND (wb_t, w6_t, we_t, wd_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C3d); + we_t = SHA256_EXPAND (wc_t, w7_t, wf_t, we_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C3e); + wf_t = SHA256_EXPAND (wd_t, w8_t, w0_t, wf_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C3f); + + + const u32x r0 = d; + const u32x r1 = h; + const u32x r2 = c; + const u32x r3 = g; + + #include VECT_COMPARE_S + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m01420_s08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m01420_s16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/nv/m01420_a3.cu b/nv/m01420_a3.cu new file mode 100644 index 0000000000..3bd4a05e1c --- /dev/null +++ b/nv/m01420_a3.cu @@ -0,0 +1,757 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _SHA256_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW2 +#define VECT_SIZE1 +#endif + +#define DGST_R0 3 +#define DGST_R1 7 +#define DGST_R2 2 +#define DGST_R3 6 + +#include "include/kernel_functions.c" +#include "types_nv.c" +#include "common_nv.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +__device__ __constant__ bf_t c_bfs[1024]; + +__device__ static void m01420m (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], const u32 pw_len, const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset) +{ + /** + * modifier + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + const u32 lid = threadIdx.x; + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[ 1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[ 2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[ 3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[ 4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[ 5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[ 6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[ 7]; + + u32 salt_buf2[4]; + + salt_buf2[0] = 0; + salt_buf2[1] = 0; + salt_buf2[2] = 0; + salt_buf2[3] = 0; + + u32 salt_buf3[4]; + + salt_buf3[0] = 0; + salt_buf3[1] = 0; + salt_buf3[2] = 0; + salt_buf3[3] = 0; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + const u32 pw_salt_len = pw_len + salt_len; + + /** + * loop + */ + + u32x w0l = w0[0]; + + for (u32 il_pos = 0; il_pos < bfs_cnt; il_pos++) + { + const u32 w0r = c_bfs[il_pos].i; + + w0[0] = w0l | w0r; + + /** + * prepend salt + */ + + u32x w0_t2[4]; + u32x w1_t2[4]; + u32x w2_t2[4]; + u32x w3_t2[4]; + + w0_t2[0] = swap_workaround (w0[0]); + w0_t2[1] = swap_workaround (w0[1]); + w0_t2[2] = swap_workaround (w0[2]); + w0_t2[3] = swap_workaround (w0[3]); + w1_t2[0] = swap_workaround (w1[0]); + w1_t2[1] = swap_workaround (w1[1]); + w1_t2[2] = swap_workaround (w1[2]); + w1_t2[3] = swap_workaround (w1[3]); + w2_t2[0] = swap_workaround (w2[0]); + w2_t2[1] = swap_workaround (w2[1]); + w2_t2[2] = swap_workaround (w2[2]); + w2_t2[3] = swap_workaround (w2[3]); + w3_t2[0] = swap_workaround (w3[0]); + w3_t2[1] = swap_workaround (w3[1]); + w3_t2[2] = swap_workaround (w3[2]); + w3_t2[3] = swap_workaround (w3[3]); + + switch_buffer_by_offset (w0_t2, w1_t2, w2_t2, w3_t2, salt_len); + + w0_t2[0] |= salt_buf0[0]; + w0_t2[1] |= salt_buf0[1]; + w0_t2[2] |= salt_buf0[2]; + w0_t2[3] |= salt_buf0[3]; + w1_t2[0] |= salt_buf1[0]; + w1_t2[1] |= salt_buf1[1]; + w1_t2[2] |= salt_buf1[2]; + w1_t2[3] |= salt_buf1[3]; + w2_t2[0] |= salt_buf2[0]; + w2_t2[1] |= salt_buf2[1]; + w2_t2[2] |= salt_buf2[2]; + w2_t2[3] |= salt_buf2[3]; + w3_t2[0] |= salt_buf3[0]; + w3_t2[1] |= salt_buf3[1]; + w3_t2[2] |= salt_buf3[2]; + w3_t2[3] |= salt_buf3[3]; + + /** + * sha256 + */ + + u32x w0_t = swap_workaround (w0_t2[0]); + u32x w1_t = swap_workaround (w0_t2[1]); + u32x w2_t = swap_workaround (w0_t2[2]); + u32x w3_t = swap_workaround (w0_t2[3]); + u32x w4_t = swap_workaround (w1_t2[0]); + u32x w5_t = swap_workaround (w1_t2[1]); + u32x w6_t = swap_workaround (w1_t2[2]); + u32x w7_t = swap_workaround (w1_t2[3]); + u32x w8_t = swap_workaround (w2_t2[0]); + u32x w9_t = swap_workaround (w2_t2[1]); + u32x wa_t = swap_workaround (w2_t2[2]); + u32x wb_t = swap_workaround (w2_t2[3]); + u32x wc_t = swap_workaround (w3_t2[0]); + u32x wd_t = swap_workaround (w3_t2[1]); + u32x we_t = 0; + u32x wf_t = pw_salt_len * 8; + + u32x a = SHA256M_A; + u32x b = SHA256M_B; + u32x c = SHA256M_C; + u32x d = SHA256M_D; + u32x e = SHA256M_E; + u32x f = SHA256M_F; + u32x g = SHA256M_G; + u32x h = SHA256M_H; + + SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C00); + SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C01); + SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C02); + SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C03); + SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C04); + SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C05); + SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C06); + SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C07); + SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C08); + SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C09); + SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C0a); + SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C0b); + SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C0c); + SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C0d); + SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C0e); + SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C0f); + + w0_t = SHA256_EXPAND (we_t, w9_t, w1_t, w0_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C10); + w1_t = SHA256_EXPAND (wf_t, wa_t, w2_t, w1_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C11); + w2_t = SHA256_EXPAND (w0_t, wb_t, w3_t, w2_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C12); + w3_t = SHA256_EXPAND (w1_t, wc_t, w4_t, w3_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C13); + w4_t = SHA256_EXPAND (w2_t, wd_t, w5_t, w4_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C14); + w5_t = SHA256_EXPAND (w3_t, we_t, w6_t, w5_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C15); + w6_t = SHA256_EXPAND (w4_t, wf_t, w7_t, w6_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C16); + w7_t = SHA256_EXPAND (w5_t, w0_t, w8_t, w7_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C17); + w8_t = SHA256_EXPAND (w6_t, w1_t, w9_t, w8_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C18); + w9_t = SHA256_EXPAND (w7_t, w2_t, wa_t, w9_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C19); + wa_t = SHA256_EXPAND (w8_t, w3_t, wb_t, wa_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C1a); + wb_t = SHA256_EXPAND (w9_t, w4_t, wc_t, wb_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C1b); + wc_t = SHA256_EXPAND (wa_t, w5_t, wd_t, wc_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C1c); + wd_t = SHA256_EXPAND (wb_t, w6_t, we_t, wd_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C1d); + we_t = SHA256_EXPAND (wc_t, w7_t, wf_t, we_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C1e); + wf_t = SHA256_EXPAND (wd_t, w8_t, w0_t, wf_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C1f); + + w0_t = SHA256_EXPAND (we_t, w9_t, w1_t, w0_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C20); + w1_t = SHA256_EXPAND (wf_t, wa_t, w2_t, w1_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C21); + w2_t = SHA256_EXPAND (w0_t, wb_t, w3_t, w2_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C22); + w3_t = SHA256_EXPAND (w1_t, wc_t, w4_t, w3_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C23); + w4_t = SHA256_EXPAND (w2_t, wd_t, w5_t, w4_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C24); + w5_t = SHA256_EXPAND (w3_t, we_t, w6_t, w5_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C25); + w6_t = SHA256_EXPAND (w4_t, wf_t, w7_t, w6_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C26); + w7_t = SHA256_EXPAND (w5_t, w0_t, w8_t, w7_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C27); + w8_t = SHA256_EXPAND (w6_t, w1_t, w9_t, w8_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C28); + w9_t = SHA256_EXPAND (w7_t, w2_t, wa_t, w9_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C29); + wa_t = SHA256_EXPAND (w8_t, w3_t, wb_t, wa_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C2a); + wb_t = SHA256_EXPAND (w9_t, w4_t, wc_t, wb_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C2b); + wc_t = SHA256_EXPAND (wa_t, w5_t, wd_t, wc_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C2c); + wd_t = SHA256_EXPAND (wb_t, w6_t, we_t, wd_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C2d); + we_t = SHA256_EXPAND (wc_t, w7_t, wf_t, we_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C2e); + wf_t = SHA256_EXPAND (wd_t, w8_t, w0_t, wf_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C2f); + + w0_t = SHA256_EXPAND (we_t, w9_t, w1_t, w0_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C30); + w1_t = SHA256_EXPAND (wf_t, wa_t, w2_t, w1_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C31); + w2_t = SHA256_EXPAND (w0_t, wb_t, w3_t, w2_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C32); + w3_t = SHA256_EXPAND (w1_t, wc_t, w4_t, w3_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C33); + w4_t = SHA256_EXPAND (w2_t, wd_t, w5_t, w4_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C34); + w5_t = SHA256_EXPAND (w3_t, we_t, w6_t, w5_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C35); + w6_t = SHA256_EXPAND (w4_t, wf_t, w7_t, w6_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C36); + w7_t = SHA256_EXPAND (w5_t, w0_t, w8_t, w7_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C37); + w8_t = SHA256_EXPAND (w6_t, w1_t, w9_t, w8_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C38); + w9_t = SHA256_EXPAND (w7_t, w2_t, wa_t, w9_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C39); + wa_t = SHA256_EXPAND (w8_t, w3_t, wb_t, wa_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C3a); + wb_t = SHA256_EXPAND (w9_t, w4_t, wc_t, wb_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C3b); + wc_t = SHA256_EXPAND (wa_t, w5_t, wd_t, wc_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C3c); + wd_t = SHA256_EXPAND (wb_t, w6_t, we_t, wd_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C3d); + we_t = SHA256_EXPAND (wc_t, w7_t, wf_t, we_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C3e); + wf_t = SHA256_EXPAND (wd_t, w8_t, w0_t, wf_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C3f); + + + const u32x r0 = d; + const u32x r1 = h; + const u32x r2 = c; + const u32x r3 = g; + + #include VECT_COMPARE_M + } +} + +__device__ static void m01420s (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], const u32 pw_len, const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset) +{ + /** + * modifier + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + const u32 lid = threadIdx.x; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[ 1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[ 2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[ 3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[ 4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[ 5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[ 6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[ 7]; + + u32 salt_buf2[4]; + + salt_buf2[0] = 0; + salt_buf2[1] = 0; + salt_buf2[2] = 0; + salt_buf2[3] = 0; + + u32 salt_buf3[4]; + + salt_buf3[0] = 0; + salt_buf3[1] = 0; + salt_buf3[2] = 0; + salt_buf3[3] = 0; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + const u32 pw_salt_len = pw_len + salt_len; + + /** + * loop + */ + + u32x w0l = w0[0]; + + for (u32 il_pos = 0; il_pos < bfs_cnt; il_pos++) + { + const u32 w0r = c_bfs[il_pos].i; + + w0[0] = w0l | w0r; + + /** + * prepend salt + */ + + u32x w0_t2[4]; + u32x w1_t2[4]; + u32x w2_t2[4]; + u32x w3_t2[4]; + + w0_t2[0] = swap_workaround (w0[0]); + w0_t2[1] = swap_workaround (w0[1]); + w0_t2[2] = swap_workaround (w0[2]); + w0_t2[3] = swap_workaround (w0[3]); + w1_t2[0] = swap_workaround (w1[0]); + w1_t2[1] = swap_workaround (w1[1]); + w1_t2[2] = swap_workaround (w1[2]); + w1_t2[3] = swap_workaround (w1[3]); + w2_t2[0] = swap_workaround (w2[0]); + w2_t2[1] = swap_workaround (w2[1]); + w2_t2[2] = swap_workaround (w2[2]); + w2_t2[3] = swap_workaround (w2[3]); + w3_t2[0] = swap_workaround (w3[0]); + w3_t2[1] = swap_workaround (w3[1]); + w3_t2[2] = swap_workaround (w3[2]); + w3_t2[3] = swap_workaround (w3[3]); + + switch_buffer_by_offset (w0_t2, w1_t2, w2_t2, w3_t2, salt_len); + + w0_t2[0] |= salt_buf0[0]; + w0_t2[1] |= salt_buf0[1]; + w0_t2[2] |= salt_buf0[2]; + w0_t2[3] |= salt_buf0[3]; + w1_t2[0] |= salt_buf1[0]; + w1_t2[1] |= salt_buf1[1]; + w1_t2[2] |= salt_buf1[2]; + w1_t2[3] |= salt_buf1[3]; + w2_t2[0] |= salt_buf2[0]; + w2_t2[1] |= salt_buf2[1]; + w2_t2[2] |= salt_buf2[2]; + w2_t2[3] |= salt_buf2[3]; + w3_t2[0] |= salt_buf3[0]; + w3_t2[1] |= salt_buf3[1]; + w3_t2[2] |= salt_buf3[2]; + w3_t2[3] |= salt_buf3[3]; + + /** + * sha256 + */ + + u32x w0_t = swap_workaround (w0_t2[0]); + u32x w1_t = swap_workaround (w0_t2[1]); + u32x w2_t = swap_workaround (w0_t2[2]); + u32x w3_t = swap_workaround (w0_t2[3]); + u32x w4_t = swap_workaround (w1_t2[0]); + u32x w5_t = swap_workaround (w1_t2[1]); + u32x w6_t = swap_workaround (w1_t2[2]); + u32x w7_t = swap_workaround (w1_t2[3]); + u32x w8_t = swap_workaround (w2_t2[0]); + u32x w9_t = swap_workaround (w2_t2[1]); + u32x wa_t = swap_workaround (w2_t2[2]); + u32x wb_t = swap_workaround (w2_t2[3]); + u32x wc_t = swap_workaround (w3_t2[0]); + u32x wd_t = swap_workaround (w3_t2[1]); + u32x we_t = 0; + u32x wf_t = pw_salt_len * 8; + + u32x a = SHA256M_A; + u32x b = SHA256M_B; + u32x c = SHA256M_C; + u32x d = SHA256M_D; + u32x e = SHA256M_E; + u32x f = SHA256M_F; + u32x g = SHA256M_G; + u32x h = SHA256M_H; + + SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C00); + SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C01); + SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C02); + SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C03); + SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C04); + SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C05); + SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C06); + SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C07); + SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C08); + SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C09); + SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C0a); + SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C0b); + SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C0c); + SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C0d); + SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C0e); + SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C0f); + + w0_t = SHA256_EXPAND (we_t, w9_t, w1_t, w0_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C10); + w1_t = SHA256_EXPAND (wf_t, wa_t, w2_t, w1_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C11); + w2_t = SHA256_EXPAND (w0_t, wb_t, w3_t, w2_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C12); + w3_t = SHA256_EXPAND (w1_t, wc_t, w4_t, w3_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C13); + w4_t = SHA256_EXPAND (w2_t, wd_t, w5_t, w4_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C14); + w5_t = SHA256_EXPAND (w3_t, we_t, w6_t, w5_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C15); + w6_t = SHA256_EXPAND (w4_t, wf_t, w7_t, w6_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C16); + w7_t = SHA256_EXPAND (w5_t, w0_t, w8_t, w7_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C17); + w8_t = SHA256_EXPAND (w6_t, w1_t, w9_t, w8_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C18); + w9_t = SHA256_EXPAND (w7_t, w2_t, wa_t, w9_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C19); + wa_t = SHA256_EXPAND (w8_t, w3_t, wb_t, wa_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C1a); + wb_t = SHA256_EXPAND (w9_t, w4_t, wc_t, wb_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C1b); + wc_t = SHA256_EXPAND (wa_t, w5_t, wd_t, wc_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C1c); + wd_t = SHA256_EXPAND (wb_t, w6_t, we_t, wd_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C1d); + we_t = SHA256_EXPAND (wc_t, w7_t, wf_t, we_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C1e); + wf_t = SHA256_EXPAND (wd_t, w8_t, w0_t, wf_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C1f); + + w0_t = SHA256_EXPAND (we_t, w9_t, w1_t, w0_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C20); + w1_t = SHA256_EXPAND (wf_t, wa_t, w2_t, w1_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C21); + w2_t = SHA256_EXPAND (w0_t, wb_t, w3_t, w2_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C22); + w3_t = SHA256_EXPAND (w1_t, wc_t, w4_t, w3_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C23); + w4_t = SHA256_EXPAND (w2_t, wd_t, w5_t, w4_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C24); + w5_t = SHA256_EXPAND (w3_t, we_t, w6_t, w5_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C25); + w6_t = SHA256_EXPAND (w4_t, wf_t, w7_t, w6_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C26); + w7_t = SHA256_EXPAND (w5_t, w0_t, w8_t, w7_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C27); + w8_t = SHA256_EXPAND (w6_t, w1_t, w9_t, w8_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C28); + w9_t = SHA256_EXPAND (w7_t, w2_t, wa_t, w9_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C29); + wa_t = SHA256_EXPAND (w8_t, w3_t, wb_t, wa_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C2a); + wb_t = SHA256_EXPAND (w9_t, w4_t, wc_t, wb_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C2b); + wc_t = SHA256_EXPAND (wa_t, w5_t, wd_t, wc_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C2c); + wd_t = SHA256_EXPAND (wb_t, w6_t, we_t, wd_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C2d); + we_t = SHA256_EXPAND (wc_t, w7_t, wf_t, we_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C2e); + wf_t = SHA256_EXPAND (wd_t, w8_t, w0_t, wf_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C2f); + + w0_t = SHA256_EXPAND (we_t, w9_t, w1_t, w0_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C30); + w1_t = SHA256_EXPAND (wf_t, wa_t, w2_t, w1_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C31); + w2_t = SHA256_EXPAND (w0_t, wb_t, w3_t, w2_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C32); + w3_t = SHA256_EXPAND (w1_t, wc_t, w4_t, w3_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C33); + w4_t = SHA256_EXPAND (w2_t, wd_t, w5_t, w4_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C34); + w5_t = SHA256_EXPAND (w3_t, we_t, w6_t, w5_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C35); + w6_t = SHA256_EXPAND (w4_t, wf_t, w7_t, w6_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C36); + w7_t = SHA256_EXPAND (w5_t, w0_t, w8_t, w7_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C37); + w8_t = SHA256_EXPAND (w6_t, w1_t, w9_t, w8_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C38); + w9_t = SHA256_EXPAND (w7_t, w2_t, wa_t, w9_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C39); + wa_t = SHA256_EXPAND (w8_t, w3_t, wb_t, wa_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C3a); + wb_t = SHA256_EXPAND (w9_t, w4_t, wc_t, wb_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C3b); + wc_t = SHA256_EXPAND (wa_t, w5_t, wd_t, wc_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C3c); + wd_t = SHA256_EXPAND (wb_t, w6_t, we_t, wd_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C3d); + we_t = SHA256_EXPAND (wc_t, w7_t, wf_t, we_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C3e); + wf_t = SHA256_EXPAND (wd_t, w8_t, w0_t, wf_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C3f); + + + const u32x r0 = d; + const u32x r1 = h; + const u32x r2 = c; + const u32x r3 = g; + + #include VECT_COMPARE_S + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m01420_m04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m01420m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m01420_m08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m01420m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m01420_m16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = pws[gid].i[ 8]; + w2[1] = pws[gid].i[ 9]; + w2[2] = pws[gid].i[10]; + w2[3] = pws[gid].i[11]; + + u32x w3[4]; + + w3[0] = pws[gid].i[12]; + w3[1] = pws[gid].i[13]; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m01420m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m01420_s04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m01420s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m01420_s08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m01420s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m01420_s16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = pws[gid].i[ 8]; + w2[1] = pws[gid].i[ 9]; + w2[2] = pws[gid].i[10]; + w2[3] = pws[gid].i[11]; + + u32x w3[4]; + + w3[0] = pws[gid].i[12]; + w3[1] = pws[gid].i[13]; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m01420s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} diff --git a/nv/m01430_a0.cu b/nv/m01430_a0.cu new file mode 100644 index 0000000000..bb873136f8 --- /dev/null +++ b/nv/m01430_a0.cu @@ -0,0 +1,591 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _SHA256_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW2 +#define VECT_SIZE1 +#endif + +#define DGST_R0 3 +#define DGST_R1 7 +#define DGST_R2 2 +#define DGST_R3 6 + +#include "include/kernel_functions.c" +#include "types_nv.c" +#include "common_nv.c" +#include "include/rp_gpu.h" +#include "rp_nv.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +__device__ __constant__ gpu_rule_t c_rules[1024]; + +extern "C" __global__ void __launch_bounds__ (256, 1) m01430_m04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + u32x pw_buf1[4]; + + pw_buf1[0] = pws[gid].i[ 4]; + pw_buf1[1] = pws[gid].i[ 5]; + pw_buf1[2] = pws[gid].i[ 6]; + pw_buf1[3] = pws[gid].i[ 7]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[7]; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + + w0[0] = pw_buf0[0]; + w0[1] = pw_buf0[1]; + w0[2] = pw_buf0[2]; + w0[3] = pw_buf0[3]; + + u32x w1[4]; + + w1[0] = pw_buf1[0]; + w1[1] = pw_buf1[1]; + w1[2] = pw_buf1[2]; + w1[3] = pw_buf1[3]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 out_len = apply_rules (c_rules[il_pos].cmds, w0, w1, pw_len); + + /** + * append salt + */ + + u32 s0[4]; + + s0[0] = salt_buf0[0]; + s0[1] = salt_buf0[1]; + s0[2] = salt_buf0[2]; + s0[3] = salt_buf0[3]; + + u32 s1[4]; + + s1[0] = salt_buf1[0]; + s1[1] = salt_buf1[1]; + s1[2] = salt_buf1[2]; + s1[3] = salt_buf1[3]; + + u32 s2[4]; + + s2[0] = 0; + s2[1] = 0; + s2[2] = 0; + s2[3] = 0; + + u32 s3[4]; + + s3[0] = 0; + s3[1] = 0; + s3[2] = 0; + s3[3] = 0; + + switch_buffer_by_offset (s0, s1, s2, s3, (out_len * 2)); + + const u32 out_salt_len = (out_len * 2) + salt_len; + + u32x w0_t2[4]; + u32x w1_t2[4]; + u32x w2_t2[4]; + u32x w3_t2[4]; + + make_unicode (w0, w0_t2, w1_t2); + make_unicode (w1, w2_t2, w3_t2); + + w0_t2[0] |= s0[0]; + w0_t2[1] |= s0[1]; + w0_t2[2] |= s0[2]; + w0_t2[3] |= s0[3]; + w1_t2[0] |= s1[0]; + w1_t2[1] |= s1[1]; + w1_t2[2] |= s1[2]; + w1_t2[3] |= s1[3]; + w2_t2[0] |= s2[0]; + w2_t2[1] |= s2[1]; + w2_t2[2] |= s2[2]; + w2_t2[3] |= s2[3]; + w3_t2[0] |= s3[0]; + w3_t2[1] |= s3[1]; + w3_t2[2] |= s3[2]; + w3_t2[3] |= s3[3]; + + append_0x80_4 (w0_t2, w1_t2, w2_t2, w3_t2, out_salt_len); + + /** + * sha256 + */ + + u32x w0_t = swap_workaround (w0_t2[0]); + u32x w1_t = swap_workaround (w0_t2[1]); + u32x w2_t = swap_workaround (w0_t2[2]); + u32x w3_t = swap_workaround (w0_t2[3]); + u32x w4_t = swap_workaround (w1_t2[0]); + u32x w5_t = swap_workaround (w1_t2[1]); + u32x w6_t = swap_workaround (w1_t2[2]); + u32x w7_t = swap_workaround (w1_t2[3]); + u32x w8_t = swap_workaround (w2_t2[0]); + u32x w9_t = swap_workaround (w2_t2[1]); + u32x wa_t = swap_workaround (w2_t2[2]); + u32x wb_t = swap_workaround (w2_t2[3]); + u32x wc_t = swap_workaround (w3_t2[0]); + u32x wd_t = swap_workaround (w3_t2[1]); + u32x we_t = 0; + u32x wf_t = out_salt_len * 8; + + u32x a = SHA256M_A; + u32x b = SHA256M_B; + u32x c = SHA256M_C; + u32x d = SHA256M_D; + u32x e = SHA256M_E; + u32x f = SHA256M_F; + u32x g = SHA256M_G; + u32x h = SHA256M_H; + + SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C00); + SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C01); + SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C02); + SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C03); + SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C04); + SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C05); + SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C06); + SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C07); + SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C08); + SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C09); + SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C0a); + SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C0b); + SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C0c); + SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C0d); + SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C0e); + SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C0f); + + w0_t = SHA256_EXPAND (we_t, w9_t, w1_t, w0_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C10); + w1_t = SHA256_EXPAND (wf_t, wa_t, w2_t, w1_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C11); + w2_t = SHA256_EXPAND (w0_t, wb_t, w3_t, w2_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C12); + w3_t = SHA256_EXPAND (w1_t, wc_t, w4_t, w3_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C13); + w4_t = SHA256_EXPAND (w2_t, wd_t, w5_t, w4_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C14); + w5_t = SHA256_EXPAND (w3_t, we_t, w6_t, w5_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C15); + w6_t = SHA256_EXPAND (w4_t, wf_t, w7_t, w6_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C16); + w7_t = SHA256_EXPAND (w5_t, w0_t, w8_t, w7_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C17); + w8_t = SHA256_EXPAND (w6_t, w1_t, w9_t, w8_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C18); + w9_t = SHA256_EXPAND (w7_t, w2_t, wa_t, w9_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C19); + wa_t = SHA256_EXPAND (w8_t, w3_t, wb_t, wa_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C1a); + wb_t = SHA256_EXPAND (w9_t, w4_t, wc_t, wb_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C1b); + wc_t = SHA256_EXPAND (wa_t, w5_t, wd_t, wc_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C1c); + wd_t = SHA256_EXPAND (wb_t, w6_t, we_t, wd_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C1d); + we_t = SHA256_EXPAND (wc_t, w7_t, wf_t, we_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C1e); + wf_t = SHA256_EXPAND (wd_t, w8_t, w0_t, wf_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C1f); + + w0_t = SHA256_EXPAND (we_t, w9_t, w1_t, w0_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C20); + w1_t = SHA256_EXPAND (wf_t, wa_t, w2_t, w1_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C21); + w2_t = SHA256_EXPAND (w0_t, wb_t, w3_t, w2_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C22); + w3_t = SHA256_EXPAND (w1_t, wc_t, w4_t, w3_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C23); + w4_t = SHA256_EXPAND (w2_t, wd_t, w5_t, w4_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C24); + w5_t = SHA256_EXPAND (w3_t, we_t, w6_t, w5_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C25); + w6_t = SHA256_EXPAND (w4_t, wf_t, w7_t, w6_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C26); + w7_t = SHA256_EXPAND (w5_t, w0_t, w8_t, w7_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C27); + w8_t = SHA256_EXPAND (w6_t, w1_t, w9_t, w8_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C28); + w9_t = SHA256_EXPAND (w7_t, w2_t, wa_t, w9_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C29); + wa_t = SHA256_EXPAND (w8_t, w3_t, wb_t, wa_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C2a); + wb_t = SHA256_EXPAND (w9_t, w4_t, wc_t, wb_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C2b); + wc_t = SHA256_EXPAND (wa_t, w5_t, wd_t, wc_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C2c); + wd_t = SHA256_EXPAND (wb_t, w6_t, we_t, wd_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C2d); + we_t = SHA256_EXPAND (wc_t, w7_t, wf_t, we_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C2e); + wf_t = SHA256_EXPAND (wd_t, w8_t, w0_t, wf_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C2f); + + w0_t = SHA256_EXPAND (we_t, w9_t, w1_t, w0_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C30); + w1_t = SHA256_EXPAND (wf_t, wa_t, w2_t, w1_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C31); + w2_t = SHA256_EXPAND (w0_t, wb_t, w3_t, w2_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C32); + w3_t = SHA256_EXPAND (w1_t, wc_t, w4_t, w3_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C33); + w4_t = SHA256_EXPAND (w2_t, wd_t, w5_t, w4_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C34); + w5_t = SHA256_EXPAND (w3_t, we_t, w6_t, w5_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C35); + w6_t = SHA256_EXPAND (w4_t, wf_t, w7_t, w6_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C36); + w7_t = SHA256_EXPAND (w5_t, w0_t, w8_t, w7_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C37); + w8_t = SHA256_EXPAND (w6_t, w1_t, w9_t, w8_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C38); + w9_t = SHA256_EXPAND (w7_t, w2_t, wa_t, w9_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C39); + wa_t = SHA256_EXPAND (w8_t, w3_t, wb_t, wa_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C3a); + wb_t = SHA256_EXPAND (w9_t, w4_t, wc_t, wb_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C3b); + wc_t = SHA256_EXPAND (wa_t, w5_t, wd_t, wc_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C3c); + wd_t = SHA256_EXPAND (wb_t, w6_t, we_t, wd_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C3d); + we_t = SHA256_EXPAND (wc_t, w7_t, wf_t, we_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C3e); + wf_t = SHA256_EXPAND (wd_t, w8_t, w0_t, wf_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C3f); + + + const u32x r0 = d; + const u32x r1 = h; + const u32x r2 = c; + const u32x r3 = g; + + #include VECT_COMPARE_M + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m01430_m08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m01430_m16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m01430_s04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + u32x pw_buf1[4]; + + pw_buf1[0] = pws[gid].i[ 4]; + pw_buf1[1] = pws[gid].i[ 5]; + pw_buf1[2] = pws[gid].i[ 6]; + pw_buf1[3] = pws[gid].i[ 7]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[7]; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + + w0[0] = pw_buf0[0]; + w0[1] = pw_buf0[1]; + w0[2] = pw_buf0[2]; + w0[3] = pw_buf0[3]; + + u32x w1[4]; + + w1[0] = pw_buf1[0]; + w1[1] = pw_buf1[1]; + w1[2] = pw_buf1[2]; + w1[3] = pw_buf1[3]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 out_len = apply_rules (c_rules[il_pos].cmds, w0, w1, pw_len); + + /** + * append salt + */ + + u32 s0[4]; + + s0[0] = salt_buf0[0]; + s0[1] = salt_buf0[1]; + s0[2] = salt_buf0[2]; + s0[3] = salt_buf0[3]; + + u32 s1[4]; + + s1[0] = salt_buf1[0]; + s1[1] = salt_buf1[1]; + s1[2] = salt_buf1[2]; + s1[3] = salt_buf1[3]; + + u32 s2[4]; + + s2[0] = 0; + s2[1] = 0; + s2[2] = 0; + s2[3] = 0; + + u32 s3[4]; + + s3[0] = 0; + s3[1] = 0; + s3[2] = 0; + s3[3] = 0; + + switch_buffer_by_offset (s0, s1, s2, s3, (out_len * 2)); + + const u32 out_salt_len = (out_len * 2) + salt_len; + + u32x w0_t2[4]; + u32x w1_t2[4]; + u32x w2_t2[4]; + u32x w3_t2[4]; + + make_unicode (w0, w0_t2, w1_t2); + make_unicode (w1, w2_t2, w3_t2); + + w0_t2[0] |= s0[0]; + w0_t2[1] |= s0[1]; + w0_t2[2] |= s0[2]; + w0_t2[3] |= s0[3]; + w1_t2[0] |= s1[0]; + w1_t2[1] |= s1[1]; + w1_t2[2] |= s1[2]; + w1_t2[3] |= s1[3]; + w2_t2[0] |= s2[0]; + w2_t2[1] |= s2[1]; + w2_t2[2] |= s2[2]; + w2_t2[3] |= s2[3]; + w3_t2[0] |= s3[0]; + w3_t2[1] |= s3[1]; + w3_t2[2] |= s3[2]; + w3_t2[3] |= s3[3]; + + append_0x80_4 (w0_t2, w1_t2, w2_t2, w3_t2, out_salt_len); + + /** + * sha256 + */ + + u32x w0_t = swap_workaround (w0_t2[0]); + u32x w1_t = swap_workaround (w0_t2[1]); + u32x w2_t = swap_workaround (w0_t2[2]); + u32x w3_t = swap_workaround (w0_t2[3]); + u32x w4_t = swap_workaround (w1_t2[0]); + u32x w5_t = swap_workaround (w1_t2[1]); + u32x w6_t = swap_workaround (w1_t2[2]); + u32x w7_t = swap_workaround (w1_t2[3]); + u32x w8_t = swap_workaround (w2_t2[0]); + u32x w9_t = swap_workaround (w2_t2[1]); + u32x wa_t = swap_workaround (w2_t2[2]); + u32x wb_t = swap_workaround (w2_t2[3]); + u32x wc_t = swap_workaround (w3_t2[0]); + u32x wd_t = swap_workaround (w3_t2[1]); + u32x we_t = 0; + u32x wf_t = out_salt_len * 8; + + u32x a = SHA256M_A; + u32x b = SHA256M_B; + u32x c = SHA256M_C; + u32x d = SHA256M_D; + u32x e = SHA256M_E; + u32x f = SHA256M_F; + u32x g = SHA256M_G; + u32x h = SHA256M_H; + + SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C00); + SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C01); + SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C02); + SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C03); + SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C04); + SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C05); + SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C06); + SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C07); + SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C08); + SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C09); + SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C0a); + SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C0b); + SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C0c); + SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C0d); + SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C0e); + SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C0f); + + w0_t = SHA256_EXPAND (we_t, w9_t, w1_t, w0_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C10); + w1_t = SHA256_EXPAND (wf_t, wa_t, w2_t, w1_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C11); + w2_t = SHA256_EXPAND (w0_t, wb_t, w3_t, w2_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C12); + w3_t = SHA256_EXPAND (w1_t, wc_t, w4_t, w3_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C13); + w4_t = SHA256_EXPAND (w2_t, wd_t, w5_t, w4_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C14); + w5_t = SHA256_EXPAND (w3_t, we_t, w6_t, w5_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C15); + w6_t = SHA256_EXPAND (w4_t, wf_t, w7_t, w6_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C16); + w7_t = SHA256_EXPAND (w5_t, w0_t, w8_t, w7_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C17); + w8_t = SHA256_EXPAND (w6_t, w1_t, w9_t, w8_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C18); + w9_t = SHA256_EXPAND (w7_t, w2_t, wa_t, w9_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C19); + wa_t = SHA256_EXPAND (w8_t, w3_t, wb_t, wa_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C1a); + wb_t = SHA256_EXPAND (w9_t, w4_t, wc_t, wb_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C1b); + wc_t = SHA256_EXPAND (wa_t, w5_t, wd_t, wc_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C1c); + wd_t = SHA256_EXPAND (wb_t, w6_t, we_t, wd_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C1d); + we_t = SHA256_EXPAND (wc_t, w7_t, wf_t, we_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C1e); + wf_t = SHA256_EXPAND (wd_t, w8_t, w0_t, wf_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C1f); + + w0_t = SHA256_EXPAND (we_t, w9_t, w1_t, w0_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C20); + w1_t = SHA256_EXPAND (wf_t, wa_t, w2_t, w1_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C21); + w2_t = SHA256_EXPAND (w0_t, wb_t, w3_t, w2_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C22); + w3_t = SHA256_EXPAND (w1_t, wc_t, w4_t, w3_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C23); + w4_t = SHA256_EXPAND (w2_t, wd_t, w5_t, w4_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C24); + w5_t = SHA256_EXPAND (w3_t, we_t, w6_t, w5_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C25); + w6_t = SHA256_EXPAND (w4_t, wf_t, w7_t, w6_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C26); + w7_t = SHA256_EXPAND (w5_t, w0_t, w8_t, w7_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C27); + w8_t = SHA256_EXPAND (w6_t, w1_t, w9_t, w8_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C28); + w9_t = SHA256_EXPAND (w7_t, w2_t, wa_t, w9_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C29); + wa_t = SHA256_EXPAND (w8_t, w3_t, wb_t, wa_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C2a); + wb_t = SHA256_EXPAND (w9_t, w4_t, wc_t, wb_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C2b); + wc_t = SHA256_EXPAND (wa_t, w5_t, wd_t, wc_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C2c); + wd_t = SHA256_EXPAND (wb_t, w6_t, we_t, wd_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C2d); + we_t = SHA256_EXPAND (wc_t, w7_t, wf_t, we_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C2e); + wf_t = SHA256_EXPAND (wd_t, w8_t, w0_t, wf_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C2f); + + w0_t = SHA256_EXPAND (we_t, w9_t, w1_t, w0_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C30); + w1_t = SHA256_EXPAND (wf_t, wa_t, w2_t, w1_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C31); + w2_t = SHA256_EXPAND (w0_t, wb_t, w3_t, w2_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C32); + w3_t = SHA256_EXPAND (w1_t, wc_t, w4_t, w3_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C33); + w4_t = SHA256_EXPAND (w2_t, wd_t, w5_t, w4_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C34); + w5_t = SHA256_EXPAND (w3_t, we_t, w6_t, w5_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C35); + w6_t = SHA256_EXPAND (w4_t, wf_t, w7_t, w6_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C36); + w7_t = SHA256_EXPAND (w5_t, w0_t, w8_t, w7_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C37); + w8_t = SHA256_EXPAND (w6_t, w1_t, w9_t, w8_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C38); + w9_t = SHA256_EXPAND (w7_t, w2_t, wa_t, w9_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C39); + wa_t = SHA256_EXPAND (w8_t, w3_t, wb_t, wa_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C3a); + wb_t = SHA256_EXPAND (w9_t, w4_t, wc_t, wb_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C3b); + wc_t = SHA256_EXPAND (wa_t, w5_t, wd_t, wc_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C3c); + wd_t = SHA256_EXPAND (wb_t, w6_t, we_t, wd_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C3d); + we_t = SHA256_EXPAND (wc_t, w7_t, wf_t, we_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C3e); + wf_t = SHA256_EXPAND (wd_t, w8_t, w0_t, wf_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C3f); + + + const u32x r0 = d; + const u32x r1 = h; + const u32x r2 = c; + const u32x r3 = g; + + #include VECT_COMPARE_S + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m01430_s08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m01430_s16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/nv/m01430_a1.cu b/nv/m01430_a1.cu new file mode 100644 index 0000000000..92caed487d --- /dev/null +++ b/nv/m01430_a1.cu @@ -0,0 +1,673 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _SHA256_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW2 +#define VECT_SIZE1 +#endif + +#define DGST_R0 3 +#define DGST_R1 7 +#define DGST_R2 2 +#define DGST_R3 6 + +#include "include/kernel_functions.c" +#include "types_nv.c" +#include "common_nv.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +__device__ __constant__ comb_t c_combs[1024]; + +extern "C" __global__ void __launch_bounds__ (256, 1) m01430_m04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, c_combs[0].pw_len); + } + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[7]; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = c_combs[il_pos].pw_len; + + const u32 pw_len = pw_l_len + pw_r_len; + + u32 wordr0[4]; + u32 wordr1[4]; + u32 wordr2[4]; + u32 wordr3[4]; + + wordr0[0] = c_combs[il_pos].i[0]; + wordr0[1] = c_combs[il_pos].i[1]; + wordr0[2] = c_combs[il_pos].i[2]; + wordr0[3] = c_combs[il_pos].i[3]; + wordr1[0] = c_combs[il_pos].i[4]; + wordr1[1] = c_combs[il_pos].i[5]; + wordr1[2] = c_combs[il_pos].i[6]; + wordr1[3] = c_combs[il_pos].i[7]; + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + u32x w0[4]; + u32x w1[4]; + u32x w2[4]; + u32x w3[4]; + + w0[0] = wordl0[0] | wordr0[0]; + w0[1] = wordl0[1] | wordr0[1]; + w0[2] = wordl0[2] | wordr0[2]; + w0[3] = wordl0[3] | wordr0[3]; + w1[0] = wordl1[0] | wordr1[0]; + w1[1] = wordl1[1] | wordr1[1]; + w1[2] = wordl1[2] | wordr1[2]; + w1[3] = wordl1[3] | wordr1[3]; + w2[0] = wordl2[0] | wordr2[0]; + w2[1] = wordl2[1] | wordr2[1]; + w2[2] = wordl2[2] | wordr2[2]; + w2[3] = wordl2[3] | wordr2[3]; + w3[0] = wordl3[0] | wordr3[0]; + w3[1] = wordl3[1] | wordr3[1]; + w3[2] = wordl3[2] | wordr3[2]; + w3[3] = wordl3[3] | wordr3[3]; + + /** + * append salt + */ + + u32 s0[4]; + + s0[0] = salt_buf0[0]; + s0[1] = salt_buf0[1]; + s0[2] = salt_buf0[2]; + s0[3] = salt_buf0[3]; + + u32 s1[4]; + + s1[0] = salt_buf1[0]; + s1[1] = salt_buf1[1]; + s1[2] = salt_buf1[2]; + s1[3] = salt_buf1[3]; + + u32 s2[4]; + + s2[0] = 0; + s2[1] = 0; + s2[2] = 0; + s2[3] = 0; + + u32 s3[4]; + + s3[0] = 0; + s3[1] = 0; + s3[2] = 0; + s3[3] = 0; + + switch_buffer_by_offset (s0, s1, s2, s3, (pw_len * 2)); + + const u32 pw_salt_len = (pw_len * 2) + salt_len; + + u32x w0_t2[4]; + u32x w1_t2[4]; + u32x w2_t2[4]; + u32x w3_t2[4]; + + make_unicode (w0, w0_t2, w1_t2); + make_unicode (w1, w2_t2, w3_t2); + + w0_t2[0] |= s0[0]; + w0_t2[1] |= s0[1]; + w0_t2[2] |= s0[2]; + w0_t2[3] |= s0[3]; + w1_t2[0] |= s1[0]; + w1_t2[1] |= s1[1]; + w1_t2[2] |= s1[2]; + w1_t2[3] |= s1[3]; + w2_t2[0] |= s2[0]; + w2_t2[1] |= s2[1]; + w2_t2[2] |= s2[2]; + w2_t2[3] |= s2[3]; + w3_t2[0] |= s3[0]; + w3_t2[1] |= s3[1]; + w3_t2[2] |= s3[2]; + w3_t2[3] |= s3[3]; + + append_0x80_4 (w0_t2, w1_t2, w2_t2, w3_t2, pw_salt_len); + + /** + * sha256 + */ + + u32x w0_t = swap_workaround (w0_t2[0]); + u32x w1_t = swap_workaround (w0_t2[1]); + u32x w2_t = swap_workaround (w0_t2[2]); + u32x w3_t = swap_workaround (w0_t2[3]); + u32x w4_t = swap_workaround (w1_t2[0]); + u32x w5_t = swap_workaround (w1_t2[1]); + u32x w6_t = swap_workaround (w1_t2[2]); + u32x w7_t = swap_workaround (w1_t2[3]); + u32x w8_t = swap_workaround (w2_t2[0]); + u32x w9_t = swap_workaround (w2_t2[1]); + u32x wa_t = swap_workaround (w2_t2[2]); + u32x wb_t = swap_workaround (w2_t2[3]); + u32x wc_t = swap_workaround (w3_t2[0]); + u32x wd_t = swap_workaround (w3_t2[1]); + u32x we_t = 0; + u32x wf_t = pw_salt_len * 8; + + u32x a = SHA256M_A; + u32x b = SHA256M_B; + u32x c = SHA256M_C; + u32x d = SHA256M_D; + u32x e = SHA256M_E; + u32x f = SHA256M_F; + u32x g = SHA256M_G; + u32x h = SHA256M_H; + + SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C00); + SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C01); + SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C02); + SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C03); + SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C04); + SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C05); + SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C06); + SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C07); + SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C08); + SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C09); + SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C0a); + SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C0b); + SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C0c); + SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C0d); + SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C0e); + SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C0f); + + w0_t = SHA256_EXPAND (we_t, w9_t, w1_t, w0_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C10); + w1_t = SHA256_EXPAND (wf_t, wa_t, w2_t, w1_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C11); + w2_t = SHA256_EXPAND (w0_t, wb_t, w3_t, w2_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C12); + w3_t = SHA256_EXPAND (w1_t, wc_t, w4_t, w3_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C13); + w4_t = SHA256_EXPAND (w2_t, wd_t, w5_t, w4_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C14); + w5_t = SHA256_EXPAND (w3_t, we_t, w6_t, w5_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C15); + w6_t = SHA256_EXPAND (w4_t, wf_t, w7_t, w6_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C16); + w7_t = SHA256_EXPAND (w5_t, w0_t, w8_t, w7_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C17); + w8_t = SHA256_EXPAND (w6_t, w1_t, w9_t, w8_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C18); + w9_t = SHA256_EXPAND (w7_t, w2_t, wa_t, w9_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C19); + wa_t = SHA256_EXPAND (w8_t, w3_t, wb_t, wa_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C1a); + wb_t = SHA256_EXPAND (w9_t, w4_t, wc_t, wb_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C1b); + wc_t = SHA256_EXPAND (wa_t, w5_t, wd_t, wc_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C1c); + wd_t = SHA256_EXPAND (wb_t, w6_t, we_t, wd_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C1d); + we_t = SHA256_EXPAND (wc_t, w7_t, wf_t, we_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C1e); + wf_t = SHA256_EXPAND (wd_t, w8_t, w0_t, wf_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C1f); + + w0_t = SHA256_EXPAND (we_t, w9_t, w1_t, w0_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C20); + w1_t = SHA256_EXPAND (wf_t, wa_t, w2_t, w1_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C21); + w2_t = SHA256_EXPAND (w0_t, wb_t, w3_t, w2_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C22); + w3_t = SHA256_EXPAND (w1_t, wc_t, w4_t, w3_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C23); + w4_t = SHA256_EXPAND (w2_t, wd_t, w5_t, w4_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C24); + w5_t = SHA256_EXPAND (w3_t, we_t, w6_t, w5_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C25); + w6_t = SHA256_EXPAND (w4_t, wf_t, w7_t, w6_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C26); + w7_t = SHA256_EXPAND (w5_t, w0_t, w8_t, w7_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C27); + w8_t = SHA256_EXPAND (w6_t, w1_t, w9_t, w8_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C28); + w9_t = SHA256_EXPAND (w7_t, w2_t, wa_t, w9_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C29); + wa_t = SHA256_EXPAND (w8_t, w3_t, wb_t, wa_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C2a); + wb_t = SHA256_EXPAND (w9_t, w4_t, wc_t, wb_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C2b); + wc_t = SHA256_EXPAND (wa_t, w5_t, wd_t, wc_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C2c); + wd_t = SHA256_EXPAND (wb_t, w6_t, we_t, wd_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C2d); + we_t = SHA256_EXPAND (wc_t, w7_t, wf_t, we_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C2e); + wf_t = SHA256_EXPAND (wd_t, w8_t, w0_t, wf_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C2f); + + w0_t = SHA256_EXPAND (we_t, w9_t, w1_t, w0_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C30); + w1_t = SHA256_EXPAND (wf_t, wa_t, w2_t, w1_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C31); + w2_t = SHA256_EXPAND (w0_t, wb_t, w3_t, w2_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C32); + w3_t = SHA256_EXPAND (w1_t, wc_t, w4_t, w3_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C33); + w4_t = SHA256_EXPAND (w2_t, wd_t, w5_t, w4_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C34); + w5_t = SHA256_EXPAND (w3_t, we_t, w6_t, w5_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C35); + w6_t = SHA256_EXPAND (w4_t, wf_t, w7_t, w6_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C36); + w7_t = SHA256_EXPAND (w5_t, w0_t, w8_t, w7_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C37); + w8_t = SHA256_EXPAND (w6_t, w1_t, w9_t, w8_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C38); + w9_t = SHA256_EXPAND (w7_t, w2_t, wa_t, w9_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C39); + wa_t = SHA256_EXPAND (w8_t, w3_t, wb_t, wa_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C3a); + wb_t = SHA256_EXPAND (w9_t, w4_t, wc_t, wb_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C3b); + wc_t = SHA256_EXPAND (wa_t, w5_t, wd_t, wc_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C3c); + wd_t = SHA256_EXPAND (wb_t, w6_t, we_t, wd_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C3d); + we_t = SHA256_EXPAND (wc_t, w7_t, wf_t, we_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C3e); + wf_t = SHA256_EXPAND (wd_t, w8_t, w0_t, wf_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C3f); + + + const u32x r0 = d; + const u32x r1 = h; + const u32x r2 = c; + const u32x r3 = g; + + #include VECT_COMPARE_M + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m01430_m08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m01430_m16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m01430_s04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, c_combs[0].pw_len); + } + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[7]; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = c_combs[il_pos].pw_len; + + const u32 pw_len = pw_l_len + pw_r_len; + + u32 wordr0[4]; + u32 wordr1[4]; + u32 wordr2[4]; + u32 wordr3[4]; + + wordr0[0] = c_combs[il_pos].i[0]; + wordr0[1] = c_combs[il_pos].i[1]; + wordr0[2] = c_combs[il_pos].i[2]; + wordr0[3] = c_combs[il_pos].i[3]; + wordr1[0] = c_combs[il_pos].i[4]; + wordr1[1] = c_combs[il_pos].i[5]; + wordr1[2] = c_combs[il_pos].i[6]; + wordr1[3] = c_combs[il_pos].i[7]; + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + u32x w0[4]; + u32x w1[4]; + u32x w2[4]; + u32x w3[4]; + + w0[0] = wordl0[0] | wordr0[0]; + w0[1] = wordl0[1] | wordr0[1]; + w0[2] = wordl0[2] | wordr0[2]; + w0[3] = wordl0[3] | wordr0[3]; + w1[0] = wordl1[0] | wordr1[0]; + w1[1] = wordl1[1] | wordr1[1]; + w1[2] = wordl1[2] | wordr1[2]; + w1[3] = wordl1[3] | wordr1[3]; + w2[0] = wordl2[0] | wordr2[0]; + w2[1] = wordl2[1] | wordr2[1]; + w2[2] = wordl2[2] | wordr2[2]; + w2[3] = wordl2[3] | wordr2[3]; + w3[0] = wordl3[0] | wordr3[0]; + w3[1] = wordl3[1] | wordr3[1]; + w3[2] = wordl3[2] | wordr3[2]; + w3[3] = wordl3[3] | wordr3[3]; + + /** + * append salt + */ + + u32 s0[4]; + + s0[0] = salt_buf0[0]; + s0[1] = salt_buf0[1]; + s0[2] = salt_buf0[2]; + s0[3] = salt_buf0[3]; + + u32 s1[4]; + + s1[0] = salt_buf1[0]; + s1[1] = salt_buf1[1]; + s1[2] = salt_buf1[2]; + s1[3] = salt_buf1[3]; + + u32 s2[4]; + + s2[0] = 0; + s2[1] = 0; + s2[2] = 0; + s2[3] = 0; + + u32 s3[4]; + + s3[0] = 0; + s3[1] = 0; + s3[2] = 0; + s3[3] = 0; + + switch_buffer_by_offset (s0, s1, s2, s3, (pw_len * 2)); + + const u32 pw_salt_len = (pw_len * 2) + salt_len; + + u32x w0_t2[4]; + u32x w1_t2[4]; + u32x w2_t2[4]; + u32x w3_t2[4]; + + make_unicode (w0, w0_t2, w1_t2); + make_unicode (w1, w2_t2, w3_t2); + + w0_t2[0] |= s0[0]; + w0_t2[1] |= s0[1]; + w0_t2[2] |= s0[2]; + w0_t2[3] |= s0[3]; + w1_t2[0] |= s1[0]; + w1_t2[1] |= s1[1]; + w1_t2[2] |= s1[2]; + w1_t2[3] |= s1[3]; + w2_t2[0] |= s2[0]; + w2_t2[1] |= s2[1]; + w2_t2[2] |= s2[2]; + w2_t2[3] |= s2[3]; + w3_t2[0] |= s3[0]; + w3_t2[1] |= s3[1]; + w3_t2[2] |= s3[2]; + w3_t2[3] |= s3[3]; + + append_0x80_4 (w0_t2, w1_t2, w2_t2, w3_t2, pw_salt_len); + + /** + * sha256 + */ + + u32x w0_t = swap_workaround (w0_t2[0]); + u32x w1_t = swap_workaround (w0_t2[1]); + u32x w2_t = swap_workaround (w0_t2[2]); + u32x w3_t = swap_workaround (w0_t2[3]); + u32x w4_t = swap_workaround (w1_t2[0]); + u32x w5_t = swap_workaround (w1_t2[1]); + u32x w6_t = swap_workaround (w1_t2[2]); + u32x w7_t = swap_workaround (w1_t2[3]); + u32x w8_t = swap_workaround (w2_t2[0]); + u32x w9_t = swap_workaround (w2_t2[1]); + u32x wa_t = swap_workaround (w2_t2[2]); + u32x wb_t = swap_workaround (w2_t2[3]); + u32x wc_t = swap_workaround (w3_t2[0]); + u32x wd_t = swap_workaround (w3_t2[1]); + u32x we_t = 0; + u32x wf_t = pw_salt_len * 8; + + u32x a = SHA256M_A; + u32x b = SHA256M_B; + u32x c = SHA256M_C; + u32x d = SHA256M_D; + u32x e = SHA256M_E; + u32x f = SHA256M_F; + u32x g = SHA256M_G; + u32x h = SHA256M_H; + + SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C00); + SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C01); + SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C02); + SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C03); + SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C04); + SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C05); + SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C06); + SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C07); + SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C08); + SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C09); + SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C0a); + SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C0b); + SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C0c); + SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C0d); + SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C0e); + SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C0f); + + w0_t = SHA256_EXPAND (we_t, w9_t, w1_t, w0_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C10); + w1_t = SHA256_EXPAND (wf_t, wa_t, w2_t, w1_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C11); + w2_t = SHA256_EXPAND (w0_t, wb_t, w3_t, w2_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C12); + w3_t = SHA256_EXPAND (w1_t, wc_t, w4_t, w3_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C13); + w4_t = SHA256_EXPAND (w2_t, wd_t, w5_t, w4_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C14); + w5_t = SHA256_EXPAND (w3_t, we_t, w6_t, w5_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C15); + w6_t = SHA256_EXPAND (w4_t, wf_t, w7_t, w6_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C16); + w7_t = SHA256_EXPAND (w5_t, w0_t, w8_t, w7_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C17); + w8_t = SHA256_EXPAND (w6_t, w1_t, w9_t, w8_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C18); + w9_t = SHA256_EXPAND (w7_t, w2_t, wa_t, w9_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C19); + wa_t = SHA256_EXPAND (w8_t, w3_t, wb_t, wa_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C1a); + wb_t = SHA256_EXPAND (w9_t, w4_t, wc_t, wb_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C1b); + wc_t = SHA256_EXPAND (wa_t, w5_t, wd_t, wc_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C1c); + wd_t = SHA256_EXPAND (wb_t, w6_t, we_t, wd_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C1d); + we_t = SHA256_EXPAND (wc_t, w7_t, wf_t, we_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C1e); + wf_t = SHA256_EXPAND (wd_t, w8_t, w0_t, wf_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C1f); + + w0_t = SHA256_EXPAND (we_t, w9_t, w1_t, w0_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C20); + w1_t = SHA256_EXPAND (wf_t, wa_t, w2_t, w1_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C21); + w2_t = SHA256_EXPAND (w0_t, wb_t, w3_t, w2_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C22); + w3_t = SHA256_EXPAND (w1_t, wc_t, w4_t, w3_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C23); + w4_t = SHA256_EXPAND (w2_t, wd_t, w5_t, w4_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C24); + w5_t = SHA256_EXPAND (w3_t, we_t, w6_t, w5_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C25); + w6_t = SHA256_EXPAND (w4_t, wf_t, w7_t, w6_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C26); + w7_t = SHA256_EXPAND (w5_t, w0_t, w8_t, w7_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C27); + w8_t = SHA256_EXPAND (w6_t, w1_t, w9_t, w8_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C28); + w9_t = SHA256_EXPAND (w7_t, w2_t, wa_t, w9_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C29); + wa_t = SHA256_EXPAND (w8_t, w3_t, wb_t, wa_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C2a); + wb_t = SHA256_EXPAND (w9_t, w4_t, wc_t, wb_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C2b); + wc_t = SHA256_EXPAND (wa_t, w5_t, wd_t, wc_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C2c); + wd_t = SHA256_EXPAND (wb_t, w6_t, we_t, wd_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C2d); + we_t = SHA256_EXPAND (wc_t, w7_t, wf_t, we_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C2e); + wf_t = SHA256_EXPAND (wd_t, w8_t, w0_t, wf_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C2f); + + w0_t = SHA256_EXPAND (we_t, w9_t, w1_t, w0_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C30); + w1_t = SHA256_EXPAND (wf_t, wa_t, w2_t, w1_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C31); + w2_t = SHA256_EXPAND (w0_t, wb_t, w3_t, w2_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C32); + w3_t = SHA256_EXPAND (w1_t, wc_t, w4_t, w3_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C33); + w4_t = SHA256_EXPAND (w2_t, wd_t, w5_t, w4_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C34); + w5_t = SHA256_EXPAND (w3_t, we_t, w6_t, w5_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C35); + w6_t = SHA256_EXPAND (w4_t, wf_t, w7_t, w6_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C36); + w7_t = SHA256_EXPAND (w5_t, w0_t, w8_t, w7_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C37); + w8_t = SHA256_EXPAND (w6_t, w1_t, w9_t, w8_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C38); + w9_t = SHA256_EXPAND (w7_t, w2_t, wa_t, w9_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C39); + wa_t = SHA256_EXPAND (w8_t, w3_t, wb_t, wa_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C3a); + wb_t = SHA256_EXPAND (w9_t, w4_t, wc_t, wb_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C3b); + wc_t = SHA256_EXPAND (wa_t, w5_t, wd_t, wc_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C3c); + wd_t = SHA256_EXPAND (wb_t, w6_t, we_t, wd_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C3d); + we_t = SHA256_EXPAND (wc_t, w7_t, wf_t, we_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C3e); + wf_t = SHA256_EXPAND (wd_t, w8_t, w0_t, wf_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C3f); + + + const u32x r0 = d; + const u32x r1 = h; + const u32x r2 = c; + const u32x r3 = g; + + #include VECT_COMPARE_S + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m01430_s08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m01430_s16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/nv/m01430_a3.cu b/nv/m01430_a3.cu new file mode 100644 index 0000000000..13fac010b4 --- /dev/null +++ b/nv/m01430_a3.cu @@ -0,0 +1,595 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _SHA256_ +#define _SCALAR_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW2 +#define VECT_SIZE1 +#endif + +#define DGST_R0 3 +#define DGST_R1 7 +#define DGST_R2 2 +#define DGST_R3 6 + +#include "include/kernel_functions.c" +#include "types_nv.c" +#include "common_nv.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4_warp.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4_warp.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4_warp.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4_warp.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4_warp.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4_warp.c" +#endif + +__device__ __constant__ u32x c_bfs[1024]; + +__device__ static void m01430m (u32 w[16], const u32 pw_len, const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const u32x *words_buf_r, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset) +{ + /** + * modifier + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + const u32 lid = threadIdx.x; + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[ 1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[ 2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[ 3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[ 4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[ 5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[ 6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[ 7]; + + u32 salt_buf2[4]; + + salt_buf2[0] = salt_bufs[salt_pos].salt_buf[ 8]; + salt_buf2[1] = 0; + salt_buf2[2] = 0; + salt_buf2[3] = 0; + + u32 salt_buf3[4]; + + salt_buf3[0] = 0; + salt_buf3[1] = 0; + salt_buf3[2] = 0; + salt_buf3[3] = 0; + + switch_buffer_by_offset (salt_buf0, salt_buf1, salt_buf2, salt_buf3, pw_len); + + w[ 0] |= swap_workaround (salt_buf0[0]); + w[ 1] |= swap_workaround (salt_buf0[1]); + w[ 2] |= swap_workaround (salt_buf0[2]); + w[ 3] |= swap_workaround (salt_buf0[3]); + w[ 4] |= swap_workaround (salt_buf1[0]); + w[ 5] |= swap_workaround (salt_buf1[1]); + w[ 6] |= swap_workaround (salt_buf1[2]); + w[ 7] |= swap_workaround (salt_buf1[3]); + w[ 8] |= swap_workaround (salt_buf2[0]); + w[ 9] |= swap_workaround (salt_buf2[1]); + w[10] |= swap_workaround (salt_buf2[2]); + w[11] |= swap_workaround (salt_buf2[3]); + w[12] |= swap_workaround (salt_buf3[0]); + w[13] |= swap_workaround (salt_buf3[1]); + w[14] |= swap_workaround (salt_buf3[2]); + w[15] |= swap_workaround (salt_buf3[3]); + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + const u32 pw_salt_len = pw_len + salt_len; + + w[15] = pw_salt_len * 8; + + /** + * loop + */ + + const u32 bf_loops = ceil ((float) bfs_cnt / VECT_DIV); + + u32x w0l = w[0]; + + for (u32 il_pos = 0; il_pos < bf_loops; il_pos++) + { + const u32x w0r = c_bfs[il_pos]; + + const u32x w0 = w0l | w0r; + + u32x w0_t = w0; + u32x w1_t = w[ 1]; + u32x w2_t = w[ 2]; + u32x w3_t = w[ 3]; + u32x w4_t = w[ 4]; + u32x w5_t = w[ 5]; + u32x w6_t = w[ 6]; + u32x w7_t = w[ 7]; + u32x w8_t = w[ 8]; + u32x w9_t = w[ 9]; + u32x wa_t = w[10]; + u32x wb_t = w[11]; + u32x wc_t = w[12]; + u32x wd_t = w[13]; + u32x we_t = w[14]; + u32x wf_t = w[15]; + + u32x a = SHA256M_A; + u32x b = SHA256M_B; + u32x c = SHA256M_C; + u32x d = SHA256M_D; + u32x e = SHA256M_E; + u32x f = SHA256M_F; + u32x g = SHA256M_G; + u32x h = SHA256M_H; + + SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C00); + SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C01); + SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C02); + SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C03); + SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C04); + SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C05); + SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C06); + SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C07); + SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C08); + SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C09); + SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C0a); + SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C0b); + SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C0c); + SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C0d); + SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C0e); + SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C0f); + + w0_t = SHA256_EXPAND (we_t, w9_t, w1_t, w0_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C10); + w1_t = SHA256_EXPAND (wf_t, wa_t, w2_t, w1_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C11); + w2_t = SHA256_EXPAND (w0_t, wb_t, w3_t, w2_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C12); + w3_t = SHA256_EXPAND (w1_t, wc_t, w4_t, w3_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C13); + w4_t = SHA256_EXPAND (w2_t, wd_t, w5_t, w4_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C14); + w5_t = SHA256_EXPAND (w3_t, we_t, w6_t, w5_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C15); + w6_t = SHA256_EXPAND (w4_t, wf_t, w7_t, w6_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C16); + w7_t = SHA256_EXPAND (w5_t, w0_t, w8_t, w7_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C17); + w8_t = SHA256_EXPAND (w6_t, w1_t, w9_t, w8_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C18); + w9_t = SHA256_EXPAND (w7_t, w2_t, wa_t, w9_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C19); + wa_t = SHA256_EXPAND (w8_t, w3_t, wb_t, wa_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C1a); + wb_t = SHA256_EXPAND (w9_t, w4_t, wc_t, wb_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C1b); + wc_t = SHA256_EXPAND (wa_t, w5_t, wd_t, wc_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C1c); + wd_t = SHA256_EXPAND (wb_t, w6_t, we_t, wd_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C1d); + we_t = SHA256_EXPAND (wc_t, w7_t, wf_t, we_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C1e); + wf_t = SHA256_EXPAND (wd_t, w8_t, w0_t, wf_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C1f); + + w0_t = SHA256_EXPAND (we_t, w9_t, w1_t, w0_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C20); + w1_t = SHA256_EXPAND (wf_t, wa_t, w2_t, w1_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C21); + w2_t = SHA256_EXPAND (w0_t, wb_t, w3_t, w2_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C22); + w3_t = SHA256_EXPAND (w1_t, wc_t, w4_t, w3_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C23); + w4_t = SHA256_EXPAND (w2_t, wd_t, w5_t, w4_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C24); + w5_t = SHA256_EXPAND (w3_t, we_t, w6_t, w5_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C25); + w6_t = SHA256_EXPAND (w4_t, wf_t, w7_t, w6_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C26); + w7_t = SHA256_EXPAND (w5_t, w0_t, w8_t, w7_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C27); + w8_t = SHA256_EXPAND (w6_t, w1_t, w9_t, w8_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C28); + w9_t = SHA256_EXPAND (w7_t, w2_t, wa_t, w9_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C29); + wa_t = SHA256_EXPAND (w8_t, w3_t, wb_t, wa_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C2a); + wb_t = SHA256_EXPAND (w9_t, w4_t, wc_t, wb_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C2b); + wc_t = SHA256_EXPAND (wa_t, w5_t, wd_t, wc_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C2c); + wd_t = SHA256_EXPAND (wb_t, w6_t, we_t, wd_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C2d); + we_t = SHA256_EXPAND (wc_t, w7_t, wf_t, we_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C2e); + wf_t = SHA256_EXPAND (wd_t, w8_t, w0_t, wf_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C2f); + + w0_t = SHA256_EXPAND (we_t, w9_t, w1_t, w0_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C30); + w1_t = SHA256_EXPAND (wf_t, wa_t, w2_t, w1_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C31); + w2_t = SHA256_EXPAND (w0_t, wb_t, w3_t, w2_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C32); + w3_t = SHA256_EXPAND (w1_t, wc_t, w4_t, w3_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C33); + w4_t = SHA256_EXPAND (w2_t, wd_t, w5_t, w4_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C34); + w5_t = SHA256_EXPAND (w3_t, we_t, w6_t, w5_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C35); + w6_t = SHA256_EXPAND (w4_t, wf_t, w7_t, w6_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C36); + w7_t = SHA256_EXPAND (w5_t, w0_t, w8_t, w7_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C37); + w8_t = SHA256_EXPAND (w6_t, w1_t, w9_t, w8_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C38); + w9_t = SHA256_EXPAND (w7_t, w2_t, wa_t, w9_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C39); + wa_t = SHA256_EXPAND (w8_t, w3_t, wb_t, wa_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C3a); + wb_t = SHA256_EXPAND (w9_t, w4_t, wc_t, wb_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C3b); + wc_t = SHA256_EXPAND (wa_t, w5_t, wd_t, wc_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C3c); + wd_t = SHA256_EXPAND (wb_t, w6_t, we_t, wd_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C3d); + we_t = SHA256_EXPAND (wc_t, w7_t, wf_t, we_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C3e); + wf_t = SHA256_EXPAND (wd_t, w8_t, w0_t, wf_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C3f); + + + const u32x r0 = d; + const u32x r1 = h; + const u32x r2 = c; + const u32x r3 = g; + + #include VECT_COMPARE_M + } +} + +__device__ static void m01430s (u32 w[16], const u32 pw_len, const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const u32x *words_buf_r, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset) +{ + /** + * modifier + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + const u32 lid = threadIdx.x; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * loop + */ + + const u32 bf_loops = ceil ((float) bfs_cnt / VECT_DIV); + + u32x w0l = w[0]; + + for (u32 il_pos = 0; il_pos < bf_loops; il_pos++) + { + const u32x w0r = c_bfs[il_pos]; + + const u32x w0 = w0l | w0r; + + u32x w0_t = w0; + u32x w1_t = w[ 1]; + u32x w2_t = w[ 2]; + u32x w3_t = w[ 3]; + u32x w4_t = w[ 4]; + u32x w5_t = w[ 5]; + u32x w6_t = w[ 6]; + u32x w7_t = w[ 7]; + u32x w8_t = w[ 8]; + u32x w9_t = w[ 9]; + u32x wa_t = w[10]; + u32x wb_t = w[11]; + u32x wc_t = w[12]; + u32x wd_t = w[13]; + u32x we_t = w[14]; + u32x wf_t = w[15]; + + u32x a = SHA256M_A; + u32x b = SHA256M_B; + u32x c = SHA256M_C; + u32x d = SHA256M_D; + u32x e = SHA256M_E; + u32x f = SHA256M_F; + u32x g = SHA256M_G; + u32x h = SHA256M_H; + + SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C00); + SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C01); + SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C02); + SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C03); + SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C04); + SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C05); + SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C06); + SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C07); + SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C08); + SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C09); + SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C0a); + SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C0b); + SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C0c); + SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C0d); + SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C0e); + SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C0f); + + w0_t = SHA256_EXPAND (we_t, w9_t, w1_t, w0_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C10); + w1_t = SHA256_EXPAND (wf_t, wa_t, w2_t, w1_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C11); + w2_t = SHA256_EXPAND (w0_t, wb_t, w3_t, w2_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C12); + w3_t = SHA256_EXPAND (w1_t, wc_t, w4_t, w3_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C13); + w4_t = SHA256_EXPAND (w2_t, wd_t, w5_t, w4_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C14); + w5_t = SHA256_EXPAND (w3_t, we_t, w6_t, w5_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C15); + w6_t = SHA256_EXPAND (w4_t, wf_t, w7_t, w6_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C16); + w7_t = SHA256_EXPAND (w5_t, w0_t, w8_t, w7_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C17); + w8_t = SHA256_EXPAND (w6_t, w1_t, w9_t, w8_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C18); + w9_t = SHA256_EXPAND (w7_t, w2_t, wa_t, w9_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C19); + wa_t = SHA256_EXPAND (w8_t, w3_t, wb_t, wa_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C1a); + wb_t = SHA256_EXPAND (w9_t, w4_t, wc_t, wb_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C1b); + wc_t = SHA256_EXPAND (wa_t, w5_t, wd_t, wc_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C1c); + wd_t = SHA256_EXPAND (wb_t, w6_t, we_t, wd_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C1d); + we_t = SHA256_EXPAND (wc_t, w7_t, wf_t, we_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C1e); + wf_t = SHA256_EXPAND (wd_t, w8_t, w0_t, wf_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C1f); + + w0_t = SHA256_EXPAND (we_t, w9_t, w1_t, w0_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C20); + w1_t = SHA256_EXPAND (wf_t, wa_t, w2_t, w1_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C21); + w2_t = SHA256_EXPAND (w0_t, wb_t, w3_t, w2_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C22); + w3_t = SHA256_EXPAND (w1_t, wc_t, w4_t, w3_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C23); + w4_t = SHA256_EXPAND (w2_t, wd_t, w5_t, w4_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C24); + w5_t = SHA256_EXPAND (w3_t, we_t, w6_t, w5_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C25); + w6_t = SHA256_EXPAND (w4_t, wf_t, w7_t, w6_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C26); + w7_t = SHA256_EXPAND (w5_t, w0_t, w8_t, w7_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C27); + w8_t = SHA256_EXPAND (w6_t, w1_t, w9_t, w8_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C28); + w9_t = SHA256_EXPAND (w7_t, w2_t, wa_t, w9_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C29); + wa_t = SHA256_EXPAND (w8_t, w3_t, wb_t, wa_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C2a); + wb_t = SHA256_EXPAND (w9_t, w4_t, wc_t, wb_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C2b); + wc_t = SHA256_EXPAND (wa_t, w5_t, wd_t, wc_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C2c); + wd_t = SHA256_EXPAND (wb_t, w6_t, we_t, wd_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C2d); + we_t = SHA256_EXPAND (wc_t, w7_t, wf_t, we_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C2e); + wf_t = SHA256_EXPAND (wd_t, w8_t, w0_t, wf_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C2f); + + w0_t = SHA256_EXPAND (we_t, w9_t, w1_t, w0_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C30); + w1_t = SHA256_EXPAND (wf_t, wa_t, w2_t, w1_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C31); + w2_t = SHA256_EXPAND (w0_t, wb_t, w3_t, w2_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C32); + w3_t = SHA256_EXPAND (w1_t, wc_t, w4_t, w3_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C33); + w4_t = SHA256_EXPAND (w2_t, wd_t, w5_t, w4_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C34); + w5_t = SHA256_EXPAND (w3_t, we_t, w6_t, w5_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C35); + w6_t = SHA256_EXPAND (w4_t, wf_t, w7_t, w6_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C36); + w7_t = SHA256_EXPAND (w5_t, w0_t, w8_t, w7_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C37); + w8_t = SHA256_EXPAND (w6_t, w1_t, w9_t, w8_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C38); + w9_t = SHA256_EXPAND (w7_t, w2_t, wa_t, w9_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C39); + wa_t = SHA256_EXPAND (w8_t, w3_t, wb_t, wa_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C3a); + wb_t = SHA256_EXPAND (w9_t, w4_t, wc_t, wb_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C3b); + wc_t = SHA256_EXPAND (wa_t, w5_t, wd_t, wc_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C3c); + wd_t = SHA256_EXPAND (wb_t, w6_t, we_t, wd_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C3d); + we_t = SHA256_EXPAND (wc_t, w7_t, wf_t, we_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C3e); + wf_t = SHA256_EXPAND (wd_t, w8_t, w0_t, wf_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C3f); + + + const u32x r0 = d; + const u32x r1 = h; + const u32x r2 = c; + const u32x r3 = g; + + #include VECT_COMPARE_S + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m01430_m04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const u32x *words_buf_r, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32 w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = 0; + w[ 5] = 0; + w[ 6] = 0; + w[ 7] = 0; + w[ 8] = 0; + w[ 9] = 0; + w[10] = 0; + w[11] = 0; + w[12] = 0; + w[13] = 0; + w[14] = 0; + w[15] = pws[gid].i[15]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m01430m (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m01430_m08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const u32x *words_buf_r, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32 w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = pws[gid].i[ 4]; + w[ 5] = pws[gid].i[ 5]; + w[ 6] = pws[gid].i[ 6]; + w[ 7] = pws[gid].i[ 7]; + w[ 8] = 0; + w[ 9] = 0; + w[10] = 0; + w[11] = 0; + w[12] = 0; + w[13] = 0; + w[14] = 0; + w[15] = pws[gid].i[15]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m01430m (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m01430_m16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const u32x *words_buf_r, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32 w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = pws[gid].i[ 4]; + w[ 5] = pws[gid].i[ 5]; + w[ 6] = pws[gid].i[ 6]; + w[ 7] = pws[gid].i[ 7]; + w[ 8] = pws[gid].i[ 8]; + w[ 9] = pws[gid].i[ 9]; + w[10] = pws[gid].i[10]; + w[11] = pws[gid].i[11]; + w[12] = pws[gid].i[12]; + w[13] = pws[gid].i[13]; + w[14] = pws[gid].i[14]; + w[15] = pws[gid].i[15]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m01430m (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m01430_s04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const u32x *words_buf_r, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32 w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = 0; + w[ 5] = 0; + w[ 6] = 0; + w[ 7] = 0; + w[ 8] = 0; + w[ 9] = 0; + w[10] = 0; + w[11] = 0; + w[12] = 0; + w[13] = 0; + w[14] = 0; + w[15] = pws[gid].i[15]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m01430s (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m01430_s08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const u32x *words_buf_r, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32 w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = pws[gid].i[ 4]; + w[ 5] = pws[gid].i[ 5]; + w[ 6] = pws[gid].i[ 6]; + w[ 7] = pws[gid].i[ 7]; + w[ 8] = 0; + w[ 9] = 0; + w[10] = 0; + w[11] = 0; + w[12] = 0; + w[13] = 0; + w[14] = 0; + w[15] = pws[gid].i[15]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m01430s (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m01430_s16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const u32x *words_buf_r, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32 w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = pws[gid].i[ 4]; + w[ 5] = pws[gid].i[ 5]; + w[ 6] = pws[gid].i[ 6]; + w[ 7] = pws[gid].i[ 7]; + w[ 8] = pws[gid].i[ 8]; + w[ 9] = pws[gid].i[ 9]; + w[10] = pws[gid].i[10]; + w[11] = pws[gid].i[11]; + w[12] = pws[gid].i[12]; + w[13] = pws[gid].i[13]; + w[14] = pws[gid].i[14]; + w[15] = pws[gid].i[15]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m01430s (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} diff --git a/nv/m01440_a0.cu b/nv/m01440_a0.cu new file mode 100644 index 0000000000..68d6f92255 --- /dev/null +++ b/nv/m01440_a0.cu @@ -0,0 +1,507 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _SHA256_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW2 +#define VECT_SIZE1 +#endif + +#define DGST_R0 3 +#define DGST_R1 7 +#define DGST_R2 2 +#define DGST_R3 6 + +#include "include/kernel_functions.c" +#include "types_nv.c" +#include "common_nv.c" +#include "include/rp_gpu.h" +#include "rp_nv.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +__device__ __constant__ gpu_rule_t c_rules[1024]; + +extern "C" __global__ void __launch_bounds__ (256, 1) m01440_m04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + u32x pw_buf1[4]; + + pw_buf1[0] = pws[gid].i[ 4]; + pw_buf1[1] = pws[gid].i[ 5]; + pw_buf1[2] = pws[gid].i[ 6]; + pw_buf1[3] = pws[gid].i[ 7]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[7]; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + u32x w1[4]; + u32x w2[4]; + u32x w3[4]; + + w0[0] = pw_buf0[0]; + w0[1] = pw_buf0[1]; + w0[2] = pw_buf0[2]; + w0[3] = pw_buf0[3]; + w1[0] = pw_buf1[0]; + w1[1] = pw_buf1[1]; + w1[2] = pw_buf1[2]; + w1[3] = pw_buf1[3]; + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 out_len = apply_rules (c_rules[il_pos].cmds, w0, w1, pw_len); + + /** + * prepend salt + */ + + const u32 out_salt_len = (out_len * 2) + salt_len; + + u32x w0_t2[4]; + u32x w1_t2[4]; + u32x w2_t2[4]; + u32x w3_t2[4]; + + make_unicode (w0, w0_t2, w1_t2); + make_unicode (w1, w2_t2, w3_t2); + + switch_buffer_by_offset (w0_t2, w1_t2, w2_t2, w3_t2, salt_len); + + w0_t2[0] |= salt_buf0[0]; + w0_t2[1] |= salt_buf0[1]; + w0_t2[2] |= salt_buf0[2]; + w0_t2[3] |= salt_buf0[3]; + w1_t2[0] |= salt_buf1[0]; + w1_t2[1] |= salt_buf1[1]; + w1_t2[2] |= salt_buf1[2]; + w1_t2[3] |= salt_buf1[3]; + + append_0x80_4 (w0_t2, w1_t2, w2_t2, w3_t2, out_salt_len); + + /** + * sha256 + */ + + u32x w0_t = swap_workaround (w0_t2[0]); + u32x w1_t = swap_workaround (w0_t2[1]); + u32x w2_t = swap_workaround (w0_t2[2]); + u32x w3_t = swap_workaround (w0_t2[3]); + u32x w4_t = swap_workaround (w1_t2[0]); + u32x w5_t = swap_workaround (w1_t2[1]); + u32x w6_t = swap_workaround (w1_t2[2]); + u32x w7_t = swap_workaround (w1_t2[3]); + u32x w8_t = swap_workaround (w2_t2[0]); + u32x w9_t = swap_workaround (w2_t2[1]); + u32x wa_t = swap_workaround (w2_t2[2]); + u32x wb_t = swap_workaround (w2_t2[3]); + u32x wc_t = swap_workaround (w3_t2[0]); + u32x wd_t = swap_workaround (w3_t2[1]); + u32x we_t = 0; + u32x wf_t = out_salt_len * 8; + + u32x a = SHA256M_A; + u32x b = SHA256M_B; + u32x c = SHA256M_C; + u32x d = SHA256M_D; + u32x e = SHA256M_E; + u32x f = SHA256M_F; + u32x g = SHA256M_G; + u32x h = SHA256M_H; + + SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C00); + SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C01); + SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C02); + SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C03); + SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C04); + SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C05); + SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C06); + SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C07); + SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C08); + SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C09); + SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C0a); + SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C0b); + SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C0c); + SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C0d); + SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C0e); + SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C0f); + + w0_t = SHA256_EXPAND (we_t, w9_t, w1_t, w0_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C10); + w1_t = SHA256_EXPAND (wf_t, wa_t, w2_t, w1_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C11); + w2_t = SHA256_EXPAND (w0_t, wb_t, w3_t, w2_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C12); + w3_t = SHA256_EXPAND (w1_t, wc_t, w4_t, w3_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C13); + w4_t = SHA256_EXPAND (w2_t, wd_t, w5_t, w4_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C14); + w5_t = SHA256_EXPAND (w3_t, we_t, w6_t, w5_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C15); + w6_t = SHA256_EXPAND (w4_t, wf_t, w7_t, w6_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C16); + w7_t = SHA256_EXPAND (w5_t, w0_t, w8_t, w7_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C17); + w8_t = SHA256_EXPAND (w6_t, w1_t, w9_t, w8_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C18); + w9_t = SHA256_EXPAND (w7_t, w2_t, wa_t, w9_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C19); + wa_t = SHA256_EXPAND (w8_t, w3_t, wb_t, wa_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C1a); + wb_t = SHA256_EXPAND (w9_t, w4_t, wc_t, wb_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C1b); + wc_t = SHA256_EXPAND (wa_t, w5_t, wd_t, wc_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C1c); + wd_t = SHA256_EXPAND (wb_t, w6_t, we_t, wd_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C1d); + we_t = SHA256_EXPAND (wc_t, w7_t, wf_t, we_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C1e); + wf_t = SHA256_EXPAND (wd_t, w8_t, w0_t, wf_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C1f); + + w0_t = SHA256_EXPAND (we_t, w9_t, w1_t, w0_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C20); + w1_t = SHA256_EXPAND (wf_t, wa_t, w2_t, w1_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C21); + w2_t = SHA256_EXPAND (w0_t, wb_t, w3_t, w2_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C22); + w3_t = SHA256_EXPAND (w1_t, wc_t, w4_t, w3_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C23); + w4_t = SHA256_EXPAND (w2_t, wd_t, w5_t, w4_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C24); + w5_t = SHA256_EXPAND (w3_t, we_t, w6_t, w5_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C25); + w6_t = SHA256_EXPAND (w4_t, wf_t, w7_t, w6_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C26); + w7_t = SHA256_EXPAND (w5_t, w0_t, w8_t, w7_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C27); + w8_t = SHA256_EXPAND (w6_t, w1_t, w9_t, w8_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C28); + w9_t = SHA256_EXPAND (w7_t, w2_t, wa_t, w9_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C29); + wa_t = SHA256_EXPAND (w8_t, w3_t, wb_t, wa_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C2a); + wb_t = SHA256_EXPAND (w9_t, w4_t, wc_t, wb_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C2b); + wc_t = SHA256_EXPAND (wa_t, w5_t, wd_t, wc_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C2c); + wd_t = SHA256_EXPAND (wb_t, w6_t, we_t, wd_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C2d); + we_t = SHA256_EXPAND (wc_t, w7_t, wf_t, we_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C2e); + wf_t = SHA256_EXPAND (wd_t, w8_t, w0_t, wf_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C2f); + + w0_t = SHA256_EXPAND (we_t, w9_t, w1_t, w0_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C30); + w1_t = SHA256_EXPAND (wf_t, wa_t, w2_t, w1_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C31); + w2_t = SHA256_EXPAND (w0_t, wb_t, w3_t, w2_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C32); + w3_t = SHA256_EXPAND (w1_t, wc_t, w4_t, w3_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C33); + w4_t = SHA256_EXPAND (w2_t, wd_t, w5_t, w4_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C34); + w5_t = SHA256_EXPAND (w3_t, we_t, w6_t, w5_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C35); + w6_t = SHA256_EXPAND (w4_t, wf_t, w7_t, w6_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C36); + w7_t = SHA256_EXPAND (w5_t, w0_t, w8_t, w7_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C37); + w8_t = SHA256_EXPAND (w6_t, w1_t, w9_t, w8_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C38); + w9_t = SHA256_EXPAND (w7_t, w2_t, wa_t, w9_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C39); + wa_t = SHA256_EXPAND (w8_t, w3_t, wb_t, wa_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C3a); + wb_t = SHA256_EXPAND (w9_t, w4_t, wc_t, wb_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C3b); + wc_t = SHA256_EXPAND (wa_t, w5_t, wd_t, wc_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C3c); + wd_t = SHA256_EXPAND (wb_t, w6_t, we_t, wd_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C3d); + we_t = SHA256_EXPAND (wc_t, w7_t, wf_t, we_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C3e); + wf_t = SHA256_EXPAND (wd_t, w8_t, w0_t, wf_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C3f); + + + const u32x r0 = d; + const u32x r1 = h; + const u32x r2 = c; + const u32x r3 = g; + + #include VECT_COMPARE_M + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m01440_m08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m01440_m16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m01440_s04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + u32x pw_buf1[4]; + + pw_buf1[0] = pws[gid].i[ 4]; + pw_buf1[1] = pws[gid].i[ 5]; + pw_buf1[2] = pws[gid].i[ 6]; + pw_buf1[3] = pws[gid].i[ 7]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[7]; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + u32x w1[4]; + u32x w2[4]; + u32x w3[4]; + + w0[0] = pw_buf0[0]; + w0[1] = pw_buf0[1]; + w0[2] = pw_buf0[2]; + w0[3] = pw_buf0[3]; + w1[0] = pw_buf1[0]; + w1[1] = pw_buf1[1]; + w1[2] = pw_buf1[2]; + w1[3] = pw_buf1[3]; + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 out_len = apply_rules (c_rules[il_pos].cmds, w0, w1, pw_len); + + /** + * prepend salt + */ + + const u32 out_salt_len = (out_len * 2) + salt_len; + + u32x w0_t2[4]; + u32x w1_t2[4]; + u32x w2_t2[4]; + u32x w3_t2[4]; + + make_unicode (w0, w0_t2, w1_t2); + make_unicode (w1, w2_t2, w3_t2); + + switch_buffer_by_offset (w0_t2, w1_t2, w2_t2, w3_t2, salt_len); + + w0_t2[0] |= salt_buf0[0]; + w0_t2[1] |= salt_buf0[1]; + w0_t2[2] |= salt_buf0[2]; + w0_t2[3] |= salt_buf0[3]; + w1_t2[0] |= salt_buf1[0]; + w1_t2[1] |= salt_buf1[1]; + w1_t2[2] |= salt_buf1[2]; + w1_t2[3] |= salt_buf1[3]; + + append_0x80_4 (w0_t2, w1_t2, w2_t2, w3_t2, out_salt_len); + + /** + * sha256 + */ + + u32x w0_t = swap_workaround (w0_t2[0]); + u32x w1_t = swap_workaround (w0_t2[1]); + u32x w2_t = swap_workaround (w0_t2[2]); + u32x w3_t = swap_workaround (w0_t2[3]); + u32x w4_t = swap_workaround (w1_t2[0]); + u32x w5_t = swap_workaround (w1_t2[1]); + u32x w6_t = swap_workaround (w1_t2[2]); + u32x w7_t = swap_workaround (w1_t2[3]); + u32x w8_t = swap_workaround (w2_t2[0]); + u32x w9_t = swap_workaround (w2_t2[1]); + u32x wa_t = swap_workaround (w2_t2[2]); + u32x wb_t = swap_workaround (w2_t2[3]); + u32x wc_t = swap_workaround (w3_t2[0]); + u32x wd_t = swap_workaround (w3_t2[1]); + u32x we_t = 0; + u32x wf_t = out_salt_len * 8; + + u32x a = SHA256M_A; + u32x b = SHA256M_B; + u32x c = SHA256M_C; + u32x d = SHA256M_D; + u32x e = SHA256M_E; + u32x f = SHA256M_F; + u32x g = SHA256M_G; + u32x h = SHA256M_H; + + SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C00); + SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C01); + SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C02); + SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C03); + SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C04); + SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C05); + SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C06); + SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C07); + SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C08); + SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C09); + SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C0a); + SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C0b); + SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C0c); + SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C0d); + SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C0e); + SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C0f); + + w0_t = SHA256_EXPAND (we_t, w9_t, w1_t, w0_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C10); + w1_t = SHA256_EXPAND (wf_t, wa_t, w2_t, w1_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C11); + w2_t = SHA256_EXPAND (w0_t, wb_t, w3_t, w2_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C12); + w3_t = SHA256_EXPAND (w1_t, wc_t, w4_t, w3_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C13); + w4_t = SHA256_EXPAND (w2_t, wd_t, w5_t, w4_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C14); + w5_t = SHA256_EXPAND (w3_t, we_t, w6_t, w5_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C15); + w6_t = SHA256_EXPAND (w4_t, wf_t, w7_t, w6_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C16); + w7_t = SHA256_EXPAND (w5_t, w0_t, w8_t, w7_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C17); + w8_t = SHA256_EXPAND (w6_t, w1_t, w9_t, w8_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C18); + w9_t = SHA256_EXPAND (w7_t, w2_t, wa_t, w9_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C19); + wa_t = SHA256_EXPAND (w8_t, w3_t, wb_t, wa_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C1a); + wb_t = SHA256_EXPAND (w9_t, w4_t, wc_t, wb_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C1b); + wc_t = SHA256_EXPAND (wa_t, w5_t, wd_t, wc_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C1c); + wd_t = SHA256_EXPAND (wb_t, w6_t, we_t, wd_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C1d); + we_t = SHA256_EXPAND (wc_t, w7_t, wf_t, we_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C1e); + wf_t = SHA256_EXPAND (wd_t, w8_t, w0_t, wf_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C1f); + + w0_t = SHA256_EXPAND (we_t, w9_t, w1_t, w0_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C20); + w1_t = SHA256_EXPAND (wf_t, wa_t, w2_t, w1_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C21); + w2_t = SHA256_EXPAND (w0_t, wb_t, w3_t, w2_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C22); + w3_t = SHA256_EXPAND (w1_t, wc_t, w4_t, w3_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C23); + w4_t = SHA256_EXPAND (w2_t, wd_t, w5_t, w4_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C24); + w5_t = SHA256_EXPAND (w3_t, we_t, w6_t, w5_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C25); + w6_t = SHA256_EXPAND (w4_t, wf_t, w7_t, w6_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C26); + w7_t = SHA256_EXPAND (w5_t, w0_t, w8_t, w7_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C27); + w8_t = SHA256_EXPAND (w6_t, w1_t, w9_t, w8_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C28); + w9_t = SHA256_EXPAND (w7_t, w2_t, wa_t, w9_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C29); + wa_t = SHA256_EXPAND (w8_t, w3_t, wb_t, wa_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C2a); + wb_t = SHA256_EXPAND (w9_t, w4_t, wc_t, wb_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C2b); + wc_t = SHA256_EXPAND (wa_t, w5_t, wd_t, wc_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C2c); + wd_t = SHA256_EXPAND (wb_t, w6_t, we_t, wd_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C2d); + we_t = SHA256_EXPAND (wc_t, w7_t, wf_t, we_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C2e); + wf_t = SHA256_EXPAND (wd_t, w8_t, w0_t, wf_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C2f); + + w0_t = SHA256_EXPAND (we_t, w9_t, w1_t, w0_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C30); + w1_t = SHA256_EXPAND (wf_t, wa_t, w2_t, w1_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C31); + w2_t = SHA256_EXPAND (w0_t, wb_t, w3_t, w2_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C32); + w3_t = SHA256_EXPAND (w1_t, wc_t, w4_t, w3_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C33); + w4_t = SHA256_EXPAND (w2_t, wd_t, w5_t, w4_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C34); + w5_t = SHA256_EXPAND (w3_t, we_t, w6_t, w5_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C35); + w6_t = SHA256_EXPAND (w4_t, wf_t, w7_t, w6_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C36); + w7_t = SHA256_EXPAND (w5_t, w0_t, w8_t, w7_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C37); + w8_t = SHA256_EXPAND (w6_t, w1_t, w9_t, w8_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C38); + w9_t = SHA256_EXPAND (w7_t, w2_t, wa_t, w9_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C39); + wa_t = SHA256_EXPAND (w8_t, w3_t, wb_t, wa_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C3a); + wb_t = SHA256_EXPAND (w9_t, w4_t, wc_t, wb_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C3b); + wc_t = SHA256_EXPAND (wa_t, w5_t, wd_t, wc_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C3c); + wd_t = SHA256_EXPAND (wb_t, w6_t, we_t, wd_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C3d); + we_t = SHA256_EXPAND (wc_t, w7_t, wf_t, we_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C3e); + wf_t = SHA256_EXPAND (wd_t, w8_t, w0_t, wf_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C3f); + + + const u32x r0 = d; + const u32x r1 = h; + const u32x r2 = c; + const u32x r3 = g; + + #include VECT_COMPARE_S + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m01440_s08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m01440_s16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/nv/m01440_a1.cu b/nv/m01440_a1.cu new file mode 100644 index 0000000000..7b2baddd56 --- /dev/null +++ b/nv/m01440_a1.cu @@ -0,0 +1,601 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _SHA256_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW2 +#define VECT_SIZE1 +#endif + +#define DGST_R0 3 +#define DGST_R1 7 +#define DGST_R2 2 +#define DGST_R3 6 + +#include "include/kernel_functions.c" +#include "types_nv.c" +#include "common_nv.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +__device__ __constant__ comb_t c_combs[1024]; + +extern "C" __global__ void __launch_bounds__ (256, 1) m01440_m04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, c_combs[0].pw_len); + } + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[7]; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = c_combs[il_pos].pw_len; + + const u32 pw_len = pw_l_len + pw_r_len; + + u32 wordr0[4]; + u32 wordr1[4]; + u32 wordr2[4]; + u32 wordr3[4]; + + wordr0[0] = c_combs[il_pos].i[0]; + wordr0[1] = c_combs[il_pos].i[1]; + wordr0[2] = c_combs[il_pos].i[2]; + wordr0[3] = c_combs[il_pos].i[3]; + wordr1[0] = c_combs[il_pos].i[4]; + wordr1[1] = c_combs[il_pos].i[5]; + wordr1[2] = c_combs[il_pos].i[6]; + wordr1[3] = c_combs[il_pos].i[7]; + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + u32x w0[4]; + u32x w1[4]; + u32x w2[4]; + u32x w3[4]; + + w0[0] = wordl0[0] | wordr0[0]; + w0[1] = wordl0[1] | wordr0[1]; + w0[2] = wordl0[2] | wordr0[2]; + w0[3] = wordl0[3] | wordr0[3]; + w1[0] = wordl1[0] | wordr1[0]; + w1[1] = wordl1[1] | wordr1[1]; + w1[2] = wordl1[2] | wordr1[2]; + w1[3] = wordl1[3] | wordr1[3]; + w2[0] = wordl2[0] | wordr2[0]; + w2[1] = wordl2[1] | wordr2[1]; + w2[2] = wordl2[2] | wordr2[2]; + w2[3] = wordl2[3] | wordr2[3]; + w3[0] = wordl3[0] | wordr3[0]; + w3[1] = wordl3[1] | wordr3[1]; + w3[2] = wordl3[2] | wordr3[2]; + w3[3] = wordl3[3] | wordr3[3]; + + /** + * prepend salt + */ + + const u32 pw_salt_len = (pw_len * 2) + salt_len; + + u32x w0_t2[4]; + u32x w1_t2[4]; + u32x w2_t2[4]; + u32x w3_t2[4]; + + make_unicode (w0, w0_t2, w1_t2); + make_unicode (w1, w2_t2, w3_t2); + + switch_buffer_by_offset (w0_t2, w1_t2, w2_t2, w3_t2, salt_len); + + w0_t2[0] |= salt_buf0[0]; + w0_t2[1] |= salt_buf0[1]; + w0_t2[2] |= salt_buf0[2]; + w0_t2[3] |= salt_buf0[3]; + w1_t2[0] |= salt_buf1[0]; + w1_t2[1] |= salt_buf1[1]; + w1_t2[2] |= salt_buf1[2]; + w1_t2[3] |= salt_buf1[3]; + + append_0x80_4 (w0_t2, w1_t2, w2_t2, w3_t2, pw_salt_len); + + /** + * sha256 + */ + + u32x w0_t = swap_workaround (w0_t2[0]); + u32x w1_t = swap_workaround (w0_t2[1]); + u32x w2_t = swap_workaround (w0_t2[2]); + u32x w3_t = swap_workaround (w0_t2[3]); + u32x w4_t = swap_workaround (w1_t2[0]); + u32x w5_t = swap_workaround (w1_t2[1]); + u32x w6_t = swap_workaround (w1_t2[2]); + u32x w7_t = swap_workaround (w1_t2[3]); + u32x w8_t = swap_workaround (w2_t2[0]); + u32x w9_t = swap_workaround (w2_t2[1]); + u32x wa_t = swap_workaround (w2_t2[2]); + u32x wb_t = swap_workaround (w2_t2[3]); + u32x wc_t = swap_workaround (w3_t2[0]); + u32x wd_t = swap_workaround (w3_t2[1]); + u32x we_t = 0; + u32x wf_t = pw_salt_len * 8; + + u32x a = SHA256M_A; + u32x b = SHA256M_B; + u32x c = SHA256M_C; + u32x d = SHA256M_D; + u32x e = SHA256M_E; + u32x f = SHA256M_F; + u32x g = SHA256M_G; + u32x h = SHA256M_H; + + SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C00); + SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C01); + SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C02); + SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C03); + SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C04); + SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C05); + SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C06); + SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C07); + SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C08); + SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C09); + SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C0a); + SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C0b); + SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C0c); + SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C0d); + SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C0e); + SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C0f); + + w0_t = SHA256_EXPAND (we_t, w9_t, w1_t, w0_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C10); + w1_t = SHA256_EXPAND (wf_t, wa_t, w2_t, w1_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C11); + w2_t = SHA256_EXPAND (w0_t, wb_t, w3_t, w2_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C12); + w3_t = SHA256_EXPAND (w1_t, wc_t, w4_t, w3_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C13); + w4_t = SHA256_EXPAND (w2_t, wd_t, w5_t, w4_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C14); + w5_t = SHA256_EXPAND (w3_t, we_t, w6_t, w5_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C15); + w6_t = SHA256_EXPAND (w4_t, wf_t, w7_t, w6_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C16); + w7_t = SHA256_EXPAND (w5_t, w0_t, w8_t, w7_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C17); + w8_t = SHA256_EXPAND (w6_t, w1_t, w9_t, w8_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C18); + w9_t = SHA256_EXPAND (w7_t, w2_t, wa_t, w9_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C19); + wa_t = SHA256_EXPAND (w8_t, w3_t, wb_t, wa_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C1a); + wb_t = SHA256_EXPAND (w9_t, w4_t, wc_t, wb_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C1b); + wc_t = SHA256_EXPAND (wa_t, w5_t, wd_t, wc_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C1c); + wd_t = SHA256_EXPAND (wb_t, w6_t, we_t, wd_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C1d); + we_t = SHA256_EXPAND (wc_t, w7_t, wf_t, we_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C1e); + wf_t = SHA256_EXPAND (wd_t, w8_t, w0_t, wf_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C1f); + + w0_t = SHA256_EXPAND (we_t, w9_t, w1_t, w0_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C20); + w1_t = SHA256_EXPAND (wf_t, wa_t, w2_t, w1_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C21); + w2_t = SHA256_EXPAND (w0_t, wb_t, w3_t, w2_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C22); + w3_t = SHA256_EXPAND (w1_t, wc_t, w4_t, w3_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C23); + w4_t = SHA256_EXPAND (w2_t, wd_t, w5_t, w4_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C24); + w5_t = SHA256_EXPAND (w3_t, we_t, w6_t, w5_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C25); + w6_t = SHA256_EXPAND (w4_t, wf_t, w7_t, w6_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C26); + w7_t = SHA256_EXPAND (w5_t, w0_t, w8_t, w7_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C27); + w8_t = SHA256_EXPAND (w6_t, w1_t, w9_t, w8_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C28); + w9_t = SHA256_EXPAND (w7_t, w2_t, wa_t, w9_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C29); + wa_t = SHA256_EXPAND (w8_t, w3_t, wb_t, wa_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C2a); + wb_t = SHA256_EXPAND (w9_t, w4_t, wc_t, wb_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C2b); + wc_t = SHA256_EXPAND (wa_t, w5_t, wd_t, wc_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C2c); + wd_t = SHA256_EXPAND (wb_t, w6_t, we_t, wd_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C2d); + we_t = SHA256_EXPAND (wc_t, w7_t, wf_t, we_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C2e); + wf_t = SHA256_EXPAND (wd_t, w8_t, w0_t, wf_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C2f); + + w0_t = SHA256_EXPAND (we_t, w9_t, w1_t, w0_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C30); + w1_t = SHA256_EXPAND (wf_t, wa_t, w2_t, w1_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C31); + w2_t = SHA256_EXPAND (w0_t, wb_t, w3_t, w2_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C32); + w3_t = SHA256_EXPAND (w1_t, wc_t, w4_t, w3_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C33); + w4_t = SHA256_EXPAND (w2_t, wd_t, w5_t, w4_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C34); + w5_t = SHA256_EXPAND (w3_t, we_t, w6_t, w5_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C35); + w6_t = SHA256_EXPAND (w4_t, wf_t, w7_t, w6_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C36); + w7_t = SHA256_EXPAND (w5_t, w0_t, w8_t, w7_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C37); + w8_t = SHA256_EXPAND (w6_t, w1_t, w9_t, w8_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C38); + w9_t = SHA256_EXPAND (w7_t, w2_t, wa_t, w9_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C39); + wa_t = SHA256_EXPAND (w8_t, w3_t, wb_t, wa_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C3a); + wb_t = SHA256_EXPAND (w9_t, w4_t, wc_t, wb_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C3b); + wc_t = SHA256_EXPAND (wa_t, w5_t, wd_t, wc_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C3c); + wd_t = SHA256_EXPAND (wb_t, w6_t, we_t, wd_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C3d); + we_t = SHA256_EXPAND (wc_t, w7_t, wf_t, we_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C3e); + wf_t = SHA256_EXPAND (wd_t, w8_t, w0_t, wf_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C3f); + + + const u32x r0 = d; + const u32x r1 = h; + const u32x r2 = c; + const u32x r3 = g; + + #include VECT_COMPARE_M + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m01440_m08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m01440_m16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m01440_s04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, c_combs[0].pw_len); + } + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[7]; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = c_combs[il_pos].pw_len; + + const u32 pw_len = pw_l_len + pw_r_len; + + u32 wordr0[4]; + u32 wordr1[4]; + u32 wordr2[4]; + u32 wordr3[4]; + + wordr0[0] = c_combs[il_pos].i[0]; + wordr0[1] = c_combs[il_pos].i[1]; + wordr0[2] = c_combs[il_pos].i[2]; + wordr0[3] = c_combs[il_pos].i[3]; + wordr1[0] = c_combs[il_pos].i[4]; + wordr1[1] = c_combs[il_pos].i[5]; + wordr1[2] = c_combs[il_pos].i[6]; + wordr1[3] = c_combs[il_pos].i[7]; + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + u32x w0[4]; + u32x w1[4]; + u32x w2[4]; + u32x w3[4]; + + w0[0] = wordl0[0] | wordr0[0]; + w0[1] = wordl0[1] | wordr0[1]; + w0[2] = wordl0[2] | wordr0[2]; + w0[3] = wordl0[3] | wordr0[3]; + w1[0] = wordl1[0] | wordr1[0]; + w1[1] = wordl1[1] | wordr1[1]; + w1[2] = wordl1[2] | wordr1[2]; + w1[3] = wordl1[3] | wordr1[3]; + w2[0] = wordl2[0] | wordr2[0]; + w2[1] = wordl2[1] | wordr2[1]; + w2[2] = wordl2[2] | wordr2[2]; + w2[3] = wordl2[3] | wordr2[3]; + w3[0] = wordl3[0] | wordr3[0]; + w3[1] = wordl3[1] | wordr3[1]; + w3[2] = wordl3[2] | wordr3[2]; + w3[3] = wordl3[3] | wordr3[3]; + + /** + * prepend salt + */ + + const u32 pw_salt_len = (pw_len * 2) + salt_len; + + u32x w0_t2[4]; + u32x w1_t2[4]; + u32x w2_t2[4]; + u32x w3_t2[4]; + + make_unicode (w0, w0_t2, w1_t2); + make_unicode (w1, w2_t2, w3_t2); + + switch_buffer_by_offset (w0_t2, w1_t2, w2_t2, w3_t2, salt_len); + + w0_t2[0] |= salt_buf0[0]; + w0_t2[1] |= salt_buf0[1]; + w0_t2[2] |= salt_buf0[2]; + w0_t2[3] |= salt_buf0[3]; + w1_t2[0] |= salt_buf1[0]; + w1_t2[1] |= salt_buf1[1]; + w1_t2[2] |= salt_buf1[2]; + w1_t2[3] |= salt_buf1[3]; + + append_0x80_4 (w0_t2, w1_t2, w2_t2, w3_t2, pw_salt_len); + + /** + * sha256 + */ + + u32x w0_t = swap_workaround (w0_t2[0]); + u32x w1_t = swap_workaround (w0_t2[1]); + u32x w2_t = swap_workaround (w0_t2[2]); + u32x w3_t = swap_workaround (w0_t2[3]); + u32x w4_t = swap_workaround (w1_t2[0]); + u32x w5_t = swap_workaround (w1_t2[1]); + u32x w6_t = swap_workaround (w1_t2[2]); + u32x w7_t = swap_workaround (w1_t2[3]); + u32x w8_t = swap_workaround (w2_t2[0]); + u32x w9_t = swap_workaround (w2_t2[1]); + u32x wa_t = swap_workaround (w2_t2[2]); + u32x wb_t = swap_workaround (w2_t2[3]); + u32x wc_t = swap_workaround (w3_t2[0]); + u32x wd_t = swap_workaround (w3_t2[1]); + u32x we_t = 0; + u32x wf_t = pw_salt_len * 8; + + u32x a = SHA256M_A; + u32x b = SHA256M_B; + u32x c = SHA256M_C; + u32x d = SHA256M_D; + u32x e = SHA256M_E; + u32x f = SHA256M_F; + u32x g = SHA256M_G; + u32x h = SHA256M_H; + + SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C00); + SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C01); + SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C02); + SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C03); + SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C04); + SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C05); + SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C06); + SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C07); + SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C08); + SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C09); + SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C0a); + SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C0b); + SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C0c); + SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C0d); + SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C0e); + SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C0f); + + w0_t = SHA256_EXPAND (we_t, w9_t, w1_t, w0_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C10); + w1_t = SHA256_EXPAND (wf_t, wa_t, w2_t, w1_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C11); + w2_t = SHA256_EXPAND (w0_t, wb_t, w3_t, w2_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C12); + w3_t = SHA256_EXPAND (w1_t, wc_t, w4_t, w3_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C13); + w4_t = SHA256_EXPAND (w2_t, wd_t, w5_t, w4_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C14); + w5_t = SHA256_EXPAND (w3_t, we_t, w6_t, w5_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C15); + w6_t = SHA256_EXPAND (w4_t, wf_t, w7_t, w6_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C16); + w7_t = SHA256_EXPAND (w5_t, w0_t, w8_t, w7_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C17); + w8_t = SHA256_EXPAND (w6_t, w1_t, w9_t, w8_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C18); + w9_t = SHA256_EXPAND (w7_t, w2_t, wa_t, w9_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C19); + wa_t = SHA256_EXPAND (w8_t, w3_t, wb_t, wa_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C1a); + wb_t = SHA256_EXPAND (w9_t, w4_t, wc_t, wb_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C1b); + wc_t = SHA256_EXPAND (wa_t, w5_t, wd_t, wc_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C1c); + wd_t = SHA256_EXPAND (wb_t, w6_t, we_t, wd_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C1d); + we_t = SHA256_EXPAND (wc_t, w7_t, wf_t, we_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C1e); + wf_t = SHA256_EXPAND (wd_t, w8_t, w0_t, wf_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C1f); + + w0_t = SHA256_EXPAND (we_t, w9_t, w1_t, w0_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C20); + w1_t = SHA256_EXPAND (wf_t, wa_t, w2_t, w1_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C21); + w2_t = SHA256_EXPAND (w0_t, wb_t, w3_t, w2_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C22); + w3_t = SHA256_EXPAND (w1_t, wc_t, w4_t, w3_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C23); + w4_t = SHA256_EXPAND (w2_t, wd_t, w5_t, w4_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C24); + w5_t = SHA256_EXPAND (w3_t, we_t, w6_t, w5_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C25); + w6_t = SHA256_EXPAND (w4_t, wf_t, w7_t, w6_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C26); + w7_t = SHA256_EXPAND (w5_t, w0_t, w8_t, w7_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C27); + w8_t = SHA256_EXPAND (w6_t, w1_t, w9_t, w8_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C28); + w9_t = SHA256_EXPAND (w7_t, w2_t, wa_t, w9_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C29); + wa_t = SHA256_EXPAND (w8_t, w3_t, wb_t, wa_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C2a); + wb_t = SHA256_EXPAND (w9_t, w4_t, wc_t, wb_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C2b); + wc_t = SHA256_EXPAND (wa_t, w5_t, wd_t, wc_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C2c); + wd_t = SHA256_EXPAND (wb_t, w6_t, we_t, wd_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C2d); + we_t = SHA256_EXPAND (wc_t, w7_t, wf_t, we_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C2e); + wf_t = SHA256_EXPAND (wd_t, w8_t, w0_t, wf_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C2f); + + w0_t = SHA256_EXPAND (we_t, w9_t, w1_t, w0_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C30); + w1_t = SHA256_EXPAND (wf_t, wa_t, w2_t, w1_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C31); + w2_t = SHA256_EXPAND (w0_t, wb_t, w3_t, w2_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C32); + w3_t = SHA256_EXPAND (w1_t, wc_t, w4_t, w3_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C33); + w4_t = SHA256_EXPAND (w2_t, wd_t, w5_t, w4_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C34); + w5_t = SHA256_EXPAND (w3_t, we_t, w6_t, w5_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C35); + w6_t = SHA256_EXPAND (w4_t, wf_t, w7_t, w6_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C36); + w7_t = SHA256_EXPAND (w5_t, w0_t, w8_t, w7_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C37); + w8_t = SHA256_EXPAND (w6_t, w1_t, w9_t, w8_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C38); + w9_t = SHA256_EXPAND (w7_t, w2_t, wa_t, w9_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C39); + wa_t = SHA256_EXPAND (w8_t, w3_t, wb_t, wa_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C3a); + wb_t = SHA256_EXPAND (w9_t, w4_t, wc_t, wb_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C3b); + wc_t = SHA256_EXPAND (wa_t, w5_t, wd_t, wc_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C3c); + wd_t = SHA256_EXPAND (wb_t, w6_t, we_t, wd_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C3d); + we_t = SHA256_EXPAND (wc_t, w7_t, wf_t, we_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C3e); + wf_t = SHA256_EXPAND (wd_t, w8_t, w0_t, wf_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C3f); + + + const u32x r0 = d; + const u32x r1 = h; + const u32x r2 = c; + const u32x r3 = g; + + #include VECT_COMPARE_S + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m01440_s08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m01440_s16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/nv/m01440_a3.cu b/nv/m01440_a3.cu new file mode 100644 index 0000000000..bac6f9d83b --- /dev/null +++ b/nv/m01440_a3.cu @@ -0,0 +1,757 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _SHA256_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW2 +#define VECT_SIZE1 +#endif + +#define DGST_R0 3 +#define DGST_R1 7 +#define DGST_R2 2 +#define DGST_R3 6 + +#include "include/kernel_functions.c" +#include "types_nv.c" +#include "common_nv.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +__device__ __constant__ bf_t c_bfs[1024]; + +__device__ static void m01440m (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], const u32 pw_len, const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset) +{ + /** + * modifier + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + const u32 lid = threadIdx.x; + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[ 1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[ 2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[ 3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[ 4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[ 5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[ 6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[ 7]; + + u32 salt_buf2[4]; + + salt_buf2[0] = 0; + salt_buf2[1] = 0; + salt_buf2[2] = 0; + salt_buf2[3] = 0; + + u32 salt_buf3[4]; + + salt_buf3[0] = 0; + salt_buf3[1] = 0; + salt_buf3[2] = 0; + salt_buf3[3] = 0; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + const u32 pw_salt_len = pw_len + salt_len; + + /** + * loop + */ + + u32x w0l = w0[0]; + + for (u32 il_pos = 0; il_pos < bfs_cnt; il_pos++) + { + const u32 w0r = c_bfs[il_pos].i; + + w0[0] = w0l | w0r; + + /** + * prepend salt + */ + + u32x w0_t2[4]; + u32x w1_t2[4]; + u32x w2_t2[4]; + u32x w3_t2[4]; + + w0_t2[0] = swap_workaround (w0[0]); + w0_t2[1] = swap_workaround (w0[1]); + w0_t2[2] = swap_workaround (w0[2]); + w0_t2[3] = swap_workaround (w0[3]); + w1_t2[0] = swap_workaround (w1[0]); + w1_t2[1] = swap_workaround (w1[1]); + w1_t2[2] = swap_workaround (w1[2]); + w1_t2[3] = swap_workaround (w1[3]); + w2_t2[0] = swap_workaround (w2[0]); + w2_t2[1] = swap_workaround (w2[1]); + w2_t2[2] = swap_workaround (w2[2]); + w2_t2[3] = swap_workaround (w2[3]); + w3_t2[0] = swap_workaround (w3[0]); + w3_t2[1] = swap_workaround (w3[1]); + w3_t2[2] = swap_workaround (w3[2]); + w3_t2[3] = swap_workaround (w3[3]); + + switch_buffer_by_offset (w0_t2, w1_t2, w2_t2, w3_t2, salt_len); + + w0_t2[0] |= salt_buf0[0]; + w0_t2[1] |= salt_buf0[1]; + w0_t2[2] |= salt_buf0[2]; + w0_t2[3] |= salt_buf0[3]; + w1_t2[0] |= salt_buf1[0]; + w1_t2[1] |= salt_buf1[1]; + w1_t2[2] |= salt_buf1[2]; + w1_t2[3] |= salt_buf1[3]; + w2_t2[0] |= salt_buf2[0]; + w2_t2[1] |= salt_buf2[1]; + w2_t2[2] |= salt_buf2[2]; + w2_t2[3] |= salt_buf2[3]; + w3_t2[0] |= salt_buf3[0]; + w3_t2[1] |= salt_buf3[1]; + w3_t2[2] |= salt_buf3[2]; + w3_t2[3] |= salt_buf3[3]; + + /** + * sha256 + */ + + u32x w0_t = swap_workaround (w0_t2[0]); + u32x w1_t = swap_workaround (w0_t2[1]); + u32x w2_t = swap_workaround (w0_t2[2]); + u32x w3_t = swap_workaround (w0_t2[3]); + u32x w4_t = swap_workaround (w1_t2[0]); + u32x w5_t = swap_workaround (w1_t2[1]); + u32x w6_t = swap_workaround (w1_t2[2]); + u32x w7_t = swap_workaround (w1_t2[3]); + u32x w8_t = swap_workaround (w2_t2[0]); + u32x w9_t = swap_workaround (w2_t2[1]); + u32x wa_t = swap_workaround (w2_t2[2]); + u32x wb_t = swap_workaround (w2_t2[3]); + u32x wc_t = swap_workaround (w3_t2[0]); + u32x wd_t = swap_workaround (w3_t2[1]); + u32x we_t = 0; + u32x wf_t = pw_salt_len * 8; + + u32x a = SHA256M_A; + u32x b = SHA256M_B; + u32x c = SHA256M_C; + u32x d = SHA256M_D; + u32x e = SHA256M_E; + u32x f = SHA256M_F; + u32x g = SHA256M_G; + u32x h = SHA256M_H; + + SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C00); + SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C01); + SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C02); + SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C03); + SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C04); + SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C05); + SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C06); + SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C07); + SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C08); + SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C09); + SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C0a); + SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C0b); + SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C0c); + SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C0d); + SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C0e); + SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C0f); + + w0_t = SHA256_EXPAND (we_t, w9_t, w1_t, w0_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C10); + w1_t = SHA256_EXPAND (wf_t, wa_t, w2_t, w1_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C11); + w2_t = SHA256_EXPAND (w0_t, wb_t, w3_t, w2_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C12); + w3_t = SHA256_EXPAND (w1_t, wc_t, w4_t, w3_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C13); + w4_t = SHA256_EXPAND (w2_t, wd_t, w5_t, w4_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C14); + w5_t = SHA256_EXPAND (w3_t, we_t, w6_t, w5_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C15); + w6_t = SHA256_EXPAND (w4_t, wf_t, w7_t, w6_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C16); + w7_t = SHA256_EXPAND (w5_t, w0_t, w8_t, w7_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C17); + w8_t = SHA256_EXPAND (w6_t, w1_t, w9_t, w8_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C18); + w9_t = SHA256_EXPAND (w7_t, w2_t, wa_t, w9_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C19); + wa_t = SHA256_EXPAND (w8_t, w3_t, wb_t, wa_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C1a); + wb_t = SHA256_EXPAND (w9_t, w4_t, wc_t, wb_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C1b); + wc_t = SHA256_EXPAND (wa_t, w5_t, wd_t, wc_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C1c); + wd_t = SHA256_EXPAND (wb_t, w6_t, we_t, wd_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C1d); + we_t = SHA256_EXPAND (wc_t, w7_t, wf_t, we_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C1e); + wf_t = SHA256_EXPAND (wd_t, w8_t, w0_t, wf_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C1f); + + w0_t = SHA256_EXPAND (we_t, w9_t, w1_t, w0_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C20); + w1_t = SHA256_EXPAND (wf_t, wa_t, w2_t, w1_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C21); + w2_t = SHA256_EXPAND (w0_t, wb_t, w3_t, w2_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C22); + w3_t = SHA256_EXPAND (w1_t, wc_t, w4_t, w3_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C23); + w4_t = SHA256_EXPAND (w2_t, wd_t, w5_t, w4_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C24); + w5_t = SHA256_EXPAND (w3_t, we_t, w6_t, w5_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C25); + w6_t = SHA256_EXPAND (w4_t, wf_t, w7_t, w6_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C26); + w7_t = SHA256_EXPAND (w5_t, w0_t, w8_t, w7_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C27); + w8_t = SHA256_EXPAND (w6_t, w1_t, w9_t, w8_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C28); + w9_t = SHA256_EXPAND (w7_t, w2_t, wa_t, w9_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C29); + wa_t = SHA256_EXPAND (w8_t, w3_t, wb_t, wa_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C2a); + wb_t = SHA256_EXPAND (w9_t, w4_t, wc_t, wb_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C2b); + wc_t = SHA256_EXPAND (wa_t, w5_t, wd_t, wc_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C2c); + wd_t = SHA256_EXPAND (wb_t, w6_t, we_t, wd_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C2d); + we_t = SHA256_EXPAND (wc_t, w7_t, wf_t, we_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C2e); + wf_t = SHA256_EXPAND (wd_t, w8_t, w0_t, wf_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C2f); + + w0_t = SHA256_EXPAND (we_t, w9_t, w1_t, w0_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C30); + w1_t = SHA256_EXPAND (wf_t, wa_t, w2_t, w1_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C31); + w2_t = SHA256_EXPAND (w0_t, wb_t, w3_t, w2_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C32); + w3_t = SHA256_EXPAND (w1_t, wc_t, w4_t, w3_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C33); + w4_t = SHA256_EXPAND (w2_t, wd_t, w5_t, w4_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C34); + w5_t = SHA256_EXPAND (w3_t, we_t, w6_t, w5_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C35); + w6_t = SHA256_EXPAND (w4_t, wf_t, w7_t, w6_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C36); + w7_t = SHA256_EXPAND (w5_t, w0_t, w8_t, w7_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C37); + w8_t = SHA256_EXPAND (w6_t, w1_t, w9_t, w8_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C38); + w9_t = SHA256_EXPAND (w7_t, w2_t, wa_t, w9_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C39); + wa_t = SHA256_EXPAND (w8_t, w3_t, wb_t, wa_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C3a); + wb_t = SHA256_EXPAND (w9_t, w4_t, wc_t, wb_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C3b); + wc_t = SHA256_EXPAND (wa_t, w5_t, wd_t, wc_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C3c); + wd_t = SHA256_EXPAND (wb_t, w6_t, we_t, wd_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C3d); + we_t = SHA256_EXPAND (wc_t, w7_t, wf_t, we_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C3e); + wf_t = SHA256_EXPAND (wd_t, w8_t, w0_t, wf_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C3f); + + + const u32x r0 = d; + const u32x r1 = h; + const u32x r2 = c; + const u32x r3 = g; + + #include VECT_COMPARE_M + } +} + +__device__ static void m01440s (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], const u32 pw_len, const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset) +{ + /** + * modifier + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + const u32 lid = threadIdx.x; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[ 1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[ 2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[ 3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[ 4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[ 5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[ 6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[ 7]; + + u32 salt_buf2[4]; + + salt_buf2[0] = 0; + salt_buf2[1] = 0; + salt_buf2[2] = 0; + salt_buf2[3] = 0; + + u32 salt_buf3[4]; + + salt_buf3[0] = 0; + salt_buf3[1] = 0; + salt_buf3[2] = 0; + salt_buf3[3] = 0; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + const u32 pw_salt_len = pw_len + salt_len; + + /** + * loop + */ + + u32x w0l = w0[0]; + + for (u32 il_pos = 0; il_pos < bfs_cnt; il_pos++) + { + const u32 w0r = c_bfs[il_pos].i; + + w0[0] = w0l | w0r; + + /** + * prepend salt + */ + + u32x w0_t2[4]; + u32x w1_t2[4]; + u32x w2_t2[4]; + u32x w3_t2[4]; + + w0_t2[0] = swap_workaround (w0[0]); + w0_t2[1] = swap_workaround (w0[1]); + w0_t2[2] = swap_workaround (w0[2]); + w0_t2[3] = swap_workaround (w0[3]); + w1_t2[0] = swap_workaround (w1[0]); + w1_t2[1] = swap_workaround (w1[1]); + w1_t2[2] = swap_workaround (w1[2]); + w1_t2[3] = swap_workaround (w1[3]); + w2_t2[0] = swap_workaround (w2[0]); + w2_t2[1] = swap_workaround (w2[1]); + w2_t2[2] = swap_workaround (w2[2]); + w2_t2[3] = swap_workaround (w2[3]); + w3_t2[0] = swap_workaround (w3[0]); + w3_t2[1] = swap_workaround (w3[1]); + w3_t2[2] = swap_workaround (w3[2]); + w3_t2[3] = swap_workaround (w3[3]); + + switch_buffer_by_offset (w0_t2, w1_t2, w2_t2, w3_t2, salt_len); + + w0_t2[0] |= salt_buf0[0]; + w0_t2[1] |= salt_buf0[1]; + w0_t2[2] |= salt_buf0[2]; + w0_t2[3] |= salt_buf0[3]; + w1_t2[0] |= salt_buf1[0]; + w1_t2[1] |= salt_buf1[1]; + w1_t2[2] |= salt_buf1[2]; + w1_t2[3] |= salt_buf1[3]; + w2_t2[0] |= salt_buf2[0]; + w2_t2[1] |= salt_buf2[1]; + w2_t2[2] |= salt_buf2[2]; + w2_t2[3] |= salt_buf2[3]; + w3_t2[0] |= salt_buf3[0]; + w3_t2[1] |= salt_buf3[1]; + w3_t2[2] |= salt_buf3[2]; + w3_t2[3] |= salt_buf3[3]; + + /** + * sha256 + */ + + u32x w0_t = swap_workaround (w0_t2[0]); + u32x w1_t = swap_workaround (w0_t2[1]); + u32x w2_t = swap_workaround (w0_t2[2]); + u32x w3_t = swap_workaround (w0_t2[3]); + u32x w4_t = swap_workaround (w1_t2[0]); + u32x w5_t = swap_workaround (w1_t2[1]); + u32x w6_t = swap_workaround (w1_t2[2]); + u32x w7_t = swap_workaround (w1_t2[3]); + u32x w8_t = swap_workaround (w2_t2[0]); + u32x w9_t = swap_workaround (w2_t2[1]); + u32x wa_t = swap_workaround (w2_t2[2]); + u32x wb_t = swap_workaround (w2_t2[3]); + u32x wc_t = swap_workaround (w3_t2[0]); + u32x wd_t = swap_workaround (w3_t2[1]); + u32x we_t = 0; + u32x wf_t = pw_salt_len * 8; + + u32x a = SHA256M_A; + u32x b = SHA256M_B; + u32x c = SHA256M_C; + u32x d = SHA256M_D; + u32x e = SHA256M_E; + u32x f = SHA256M_F; + u32x g = SHA256M_G; + u32x h = SHA256M_H; + + SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C00); + SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C01); + SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C02); + SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C03); + SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C04); + SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C05); + SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C06); + SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C07); + SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C08); + SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C09); + SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C0a); + SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C0b); + SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C0c); + SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C0d); + SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C0e); + SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C0f); + + w0_t = SHA256_EXPAND (we_t, w9_t, w1_t, w0_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C10); + w1_t = SHA256_EXPAND (wf_t, wa_t, w2_t, w1_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C11); + w2_t = SHA256_EXPAND (w0_t, wb_t, w3_t, w2_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C12); + w3_t = SHA256_EXPAND (w1_t, wc_t, w4_t, w3_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C13); + w4_t = SHA256_EXPAND (w2_t, wd_t, w5_t, w4_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C14); + w5_t = SHA256_EXPAND (w3_t, we_t, w6_t, w5_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C15); + w6_t = SHA256_EXPAND (w4_t, wf_t, w7_t, w6_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C16); + w7_t = SHA256_EXPAND (w5_t, w0_t, w8_t, w7_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C17); + w8_t = SHA256_EXPAND (w6_t, w1_t, w9_t, w8_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C18); + w9_t = SHA256_EXPAND (w7_t, w2_t, wa_t, w9_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C19); + wa_t = SHA256_EXPAND (w8_t, w3_t, wb_t, wa_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C1a); + wb_t = SHA256_EXPAND (w9_t, w4_t, wc_t, wb_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C1b); + wc_t = SHA256_EXPAND (wa_t, w5_t, wd_t, wc_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C1c); + wd_t = SHA256_EXPAND (wb_t, w6_t, we_t, wd_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C1d); + we_t = SHA256_EXPAND (wc_t, w7_t, wf_t, we_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C1e); + wf_t = SHA256_EXPAND (wd_t, w8_t, w0_t, wf_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C1f); + + w0_t = SHA256_EXPAND (we_t, w9_t, w1_t, w0_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C20); + w1_t = SHA256_EXPAND (wf_t, wa_t, w2_t, w1_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C21); + w2_t = SHA256_EXPAND (w0_t, wb_t, w3_t, w2_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C22); + w3_t = SHA256_EXPAND (w1_t, wc_t, w4_t, w3_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C23); + w4_t = SHA256_EXPAND (w2_t, wd_t, w5_t, w4_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C24); + w5_t = SHA256_EXPAND (w3_t, we_t, w6_t, w5_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C25); + w6_t = SHA256_EXPAND (w4_t, wf_t, w7_t, w6_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C26); + w7_t = SHA256_EXPAND (w5_t, w0_t, w8_t, w7_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C27); + w8_t = SHA256_EXPAND (w6_t, w1_t, w9_t, w8_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C28); + w9_t = SHA256_EXPAND (w7_t, w2_t, wa_t, w9_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C29); + wa_t = SHA256_EXPAND (w8_t, w3_t, wb_t, wa_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C2a); + wb_t = SHA256_EXPAND (w9_t, w4_t, wc_t, wb_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C2b); + wc_t = SHA256_EXPAND (wa_t, w5_t, wd_t, wc_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C2c); + wd_t = SHA256_EXPAND (wb_t, w6_t, we_t, wd_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C2d); + we_t = SHA256_EXPAND (wc_t, w7_t, wf_t, we_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C2e); + wf_t = SHA256_EXPAND (wd_t, w8_t, w0_t, wf_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C2f); + + w0_t = SHA256_EXPAND (we_t, w9_t, w1_t, w0_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C30); + w1_t = SHA256_EXPAND (wf_t, wa_t, w2_t, w1_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C31); + w2_t = SHA256_EXPAND (w0_t, wb_t, w3_t, w2_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C32); + w3_t = SHA256_EXPAND (w1_t, wc_t, w4_t, w3_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C33); + w4_t = SHA256_EXPAND (w2_t, wd_t, w5_t, w4_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C34); + w5_t = SHA256_EXPAND (w3_t, we_t, w6_t, w5_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C35); + w6_t = SHA256_EXPAND (w4_t, wf_t, w7_t, w6_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C36); + w7_t = SHA256_EXPAND (w5_t, w0_t, w8_t, w7_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C37); + w8_t = SHA256_EXPAND (w6_t, w1_t, w9_t, w8_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C38); + w9_t = SHA256_EXPAND (w7_t, w2_t, wa_t, w9_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C39); + wa_t = SHA256_EXPAND (w8_t, w3_t, wb_t, wa_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C3a); + wb_t = SHA256_EXPAND (w9_t, w4_t, wc_t, wb_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C3b); + wc_t = SHA256_EXPAND (wa_t, w5_t, wd_t, wc_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C3c); + wd_t = SHA256_EXPAND (wb_t, w6_t, we_t, wd_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C3d); + we_t = SHA256_EXPAND (wc_t, w7_t, wf_t, we_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C3e); + wf_t = SHA256_EXPAND (wd_t, w8_t, w0_t, wf_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C3f); + + + const u32x r0 = d; + const u32x r1 = h; + const u32x r2 = c; + const u32x r3 = g; + + #include VECT_COMPARE_S + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m01440_m04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m01440m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m01440_m08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m01440m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m01440_m16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = pws[gid].i[ 8]; + w2[1] = pws[gid].i[ 9]; + w2[2] = pws[gid].i[10]; + w2[3] = pws[gid].i[11]; + + u32x w3[4]; + + w3[0] = pws[gid].i[12]; + w3[1] = pws[gid].i[13]; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m01440m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m01440_s04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m01440s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m01440_s08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m01440s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m01440_s16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = pws[gid].i[ 8]; + w2[1] = pws[gid].i[ 9]; + w2[2] = pws[gid].i[10]; + w2[3] = pws[gid].i[11]; + + u32x w3[4]; + + w3[0] = pws[gid].i[12]; + w3[1] = pws[gid].i[13]; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m01440s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} diff --git a/nv/m01450_a0.cu b/nv/m01450_a0.cu new file mode 100644 index 0000000000..52bea27939 --- /dev/null +++ b/nv/m01450_a0.cu @@ -0,0 +1,589 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _SHA256_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW2 +#define VECT_SIZE1 +#endif + +#define DGST_R0 3 +#define DGST_R1 7 +#define DGST_R2 2 +#define DGST_R3 6 + +#include "include/kernel_functions.c" +#include "types_nv.c" +#include "common_nv.c" +#include "include/rp_gpu.h" +#include "rp_nv.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +__device__ __constant__ u32 k_sha256[64] = +{ + SHA256C00, SHA256C01, SHA256C02, SHA256C03, + SHA256C04, SHA256C05, SHA256C06, SHA256C07, + SHA256C08, SHA256C09, SHA256C0a, SHA256C0b, + SHA256C0c, SHA256C0d, SHA256C0e, SHA256C0f, + SHA256C10, SHA256C11, SHA256C12, SHA256C13, + SHA256C14, SHA256C15, SHA256C16, SHA256C17, + SHA256C18, SHA256C19, SHA256C1a, SHA256C1b, + SHA256C1c, SHA256C1d, SHA256C1e, SHA256C1f, + SHA256C20, SHA256C21, SHA256C22, SHA256C23, + SHA256C24, SHA256C25, SHA256C26, SHA256C27, + SHA256C28, SHA256C29, SHA256C2a, SHA256C2b, + SHA256C2c, SHA256C2d, SHA256C2e, SHA256C2f, + SHA256C30, SHA256C31, SHA256C32, SHA256C33, + SHA256C34, SHA256C35, SHA256C36, SHA256C37, + SHA256C38, SHA256C39, SHA256C3a, SHA256C3b, + SHA256C3c, SHA256C3d, SHA256C3e, SHA256C3f, +}; + +__device__ __constant__ gpu_rule_t c_rules[1024]; + +__device__ static void sha256_transform (const u32x w0[4], const u32x w1[4], const u32x w2[4], const u32x w3[4], u32x digest[8]) +{ + u32x a = digest[0]; + u32x b = digest[1]; + u32x c = digest[2]; + u32x d = digest[3]; + u32x e = digest[4]; + u32x f = digest[5]; + u32x g = digest[6]; + u32x h = digest[7]; + + u32x w0_t = w0[0]; + u32x w1_t = w0[1]; + u32x w2_t = w0[2]; + u32x w3_t = w0[3]; + u32x w4_t = w1[0]; + u32x w5_t = w1[1]; + u32x w6_t = w1[2]; + u32x w7_t = w1[3]; + u32x w8_t = w2[0]; + u32x w9_t = w2[1]; + u32x wa_t = w2[2]; + u32x wb_t = w2[3]; + u32x wc_t = w3[0]; + u32x wd_t = w3[1]; + u32x we_t = w3[2]; + u32x wf_t = w3[3]; + + #define ROUND_EXPAND() \ + { \ + w0_t = SHA256_EXPAND (we_t, w9_t, w1_t, w0_t); \ + w1_t = SHA256_EXPAND (wf_t, wa_t, w2_t, w1_t); \ + w2_t = SHA256_EXPAND (w0_t, wb_t, w3_t, w2_t); \ + w3_t = SHA256_EXPAND (w1_t, wc_t, w4_t, w3_t); \ + w4_t = SHA256_EXPAND (w2_t, wd_t, w5_t, w4_t); \ + w5_t = SHA256_EXPAND (w3_t, we_t, w6_t, w5_t); \ + w6_t = SHA256_EXPAND (w4_t, wf_t, w7_t, w6_t); \ + w7_t = SHA256_EXPAND (w5_t, w0_t, w8_t, w7_t); \ + w8_t = SHA256_EXPAND (w6_t, w1_t, w9_t, w8_t); \ + w9_t = SHA256_EXPAND (w7_t, w2_t, wa_t, w9_t); \ + wa_t = SHA256_EXPAND (w8_t, w3_t, wb_t, wa_t); \ + wb_t = SHA256_EXPAND (w9_t, w4_t, wc_t, wb_t); \ + wc_t = SHA256_EXPAND (wa_t, w5_t, wd_t, wc_t); \ + wd_t = SHA256_EXPAND (wb_t, w6_t, we_t, wd_t); \ + we_t = SHA256_EXPAND (wc_t, w7_t, wf_t, we_t); \ + wf_t = SHA256_EXPAND (wd_t, w8_t, w0_t, wf_t); \ + } + + #define ROUND_STEP(i) \ + { \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, k_sha256[i + 0]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, k_sha256[i + 1]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, k_sha256[i + 2]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, k_sha256[i + 3]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, k_sha256[i + 4]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, k_sha256[i + 5]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, k_sha256[i + 6]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, k_sha256[i + 7]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, k_sha256[i + 8]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, k_sha256[i + 9]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, k_sha256[i + 10]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, k_sha256[i + 11]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, k_sha256[i + 12]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, k_sha256[i + 13]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, k_sha256[i + 14]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, k_sha256[i + 15]); \ + } + + ROUND_STEP (0); + + for (int i = 16; i < 64; i += 16) + { + ROUND_EXPAND (); ROUND_STEP (i); + } + + digest[0] += a; + digest[1] += b; + digest[2] += c; + digest[3] += d; + digest[4] += e; + digest[5] += f; + digest[6] += g; + digest[7] += h; +} + +__device__ static void hmac_sha256_pad (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], u32x ipad[8], u32x opad[8]) +{ + w0[0] = w0[0] ^ 0x36363636; + w0[1] = w0[1] ^ 0x36363636; + w0[2] = w0[2] ^ 0x36363636; + w0[3] = w0[3] ^ 0x36363636; + w1[0] = w1[0] ^ 0x36363636; + w1[1] = w1[1] ^ 0x36363636; + w1[2] = w1[2] ^ 0x36363636; + w1[3] = w1[3] ^ 0x36363636; + w2[0] = w2[0] ^ 0x36363636; + w2[1] = w2[1] ^ 0x36363636; + w2[2] = w2[2] ^ 0x36363636; + w2[3] = w2[3] ^ 0x36363636; + w3[0] = w3[0] ^ 0x36363636; + w3[1] = w3[1] ^ 0x36363636; + w3[2] = w3[2] ^ 0x36363636; + w3[3] = w3[3] ^ 0x36363636; + + ipad[0] = SHA256M_A; + ipad[1] = SHA256M_B; + ipad[2] = SHA256M_C; + ipad[3] = SHA256M_D; + ipad[4] = SHA256M_E; + ipad[5] = SHA256M_F; + ipad[6] = SHA256M_G; + ipad[7] = SHA256M_H; + + sha256_transform (w0, w1, w2, w3, ipad); + + w0[0] = w0[0] ^ 0x6a6a6a6a; + w0[1] = w0[1] ^ 0x6a6a6a6a; + w0[2] = w0[2] ^ 0x6a6a6a6a; + w0[3] = w0[3] ^ 0x6a6a6a6a; + w1[0] = w1[0] ^ 0x6a6a6a6a; + w1[1] = w1[1] ^ 0x6a6a6a6a; + w1[2] = w1[2] ^ 0x6a6a6a6a; + w1[3] = w1[3] ^ 0x6a6a6a6a; + w2[0] = w2[0] ^ 0x6a6a6a6a; + w2[1] = w2[1] ^ 0x6a6a6a6a; + w2[2] = w2[2] ^ 0x6a6a6a6a; + w2[3] = w2[3] ^ 0x6a6a6a6a; + w3[0] = w3[0] ^ 0x6a6a6a6a; + w3[1] = w3[1] ^ 0x6a6a6a6a; + w3[2] = w3[2] ^ 0x6a6a6a6a; + w3[3] = w3[3] ^ 0x6a6a6a6a; + + opad[0] = SHA256M_A; + opad[1] = SHA256M_B; + opad[2] = SHA256M_C; + opad[3] = SHA256M_D; + opad[4] = SHA256M_E; + opad[5] = SHA256M_F; + opad[6] = SHA256M_G; + opad[7] = SHA256M_H; + + sha256_transform (w0, w1, w2, w3, opad); +} + +__device__ static void hmac_sha256_run (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], u32x ipad[8], u32x opad[8], u32x digest[8]) +{ + digest[0] = ipad[0]; + digest[1] = ipad[1]; + digest[2] = ipad[2]; + digest[3] = ipad[3]; + digest[4] = ipad[4]; + digest[5] = ipad[5]; + digest[6] = ipad[6]; + digest[7] = ipad[7]; + + sha256_transform (w0, w1, w2, w3, digest); + + w0[0] = digest[0]; + w0[1] = digest[1]; + w0[2] = digest[2]; + w0[3] = digest[3]; + w1[0] = digest[4]; + w1[1] = digest[5]; + w1[2] = digest[6]; + w1[3] = digest[7]; + w2[0] = 0x80000000; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = (64 + 32) * 8; + + digest[0] = opad[0]; + digest[1] = opad[1]; + digest[2] = opad[2]; + digest[3] = opad[3]; + digest[4] = opad[4]; + digest[5] = opad[5]; + digest[6] = opad[6]; + digest[7] = opad[7]; + + sha256_transform (w0, w1, w2, w3, digest); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m01450_m04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + u32x pw_buf1[4]; + + pw_buf1[0] = pws[gid].i[ 4]; + pw_buf1[1] = pws[gid].i[ 5]; + pw_buf1[2] = pws[gid].i[ 6]; + pw_buf1[3] = pws[gid].i[ 7]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[ 1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[ 2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[ 3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[ 4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[ 5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[ 6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[ 7]; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + + w0[0] = pw_buf0[0]; + w0[1] = pw_buf0[1]; + w0[2] = pw_buf0[2]; + w0[3] = pw_buf0[3]; + + u32x w1[4]; + + w1[0] = pw_buf1[0]; + w1[1] = pw_buf1[1]; + w1[2] = pw_buf1[2]; + w1[3] = pw_buf1[3]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 out_len = apply_rules (c_rules[il_pos].cmds, w0, w1, pw_len); + + /** + * pads + */ + + u32x w0_t[4]; + + w0_t[0] = swap_workaround (w0[0]); + w0_t[1] = swap_workaround (w0[1]); + w0_t[2] = swap_workaround (w0[2]); + w0_t[3] = swap_workaround (w0[3]); + + u32x w1_t[4]; + + w1_t[0] = swap_workaround (w1[0]); + w1_t[1] = swap_workaround (w1[1]); + w1_t[2] = swap_workaround (w1[2]); + w1_t[3] = swap_workaround (w1[3]); + + u32x w2_t[4]; + + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + + u32x w3_t[4]; + + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = 0; + + u32x ipad[8]; + u32x opad[8]; + + hmac_sha256_pad (w0_t, w1_t, w2_t, w3_t, ipad, opad); + + w0_t[0] = swap_workaround (salt_buf0[0]); + w0_t[1] = swap_workaround (salt_buf0[1]); + w0_t[2] = swap_workaround (salt_buf0[2]); + w0_t[3] = swap_workaround (salt_buf0[3]); + w1_t[0] = swap_workaround (salt_buf1[0]); + w1_t[1] = swap_workaround (salt_buf1[1]); + w1_t[2] = swap_workaround (salt_buf1[2]); + w1_t[3] = swap_workaround (salt_buf1[3]); + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = (64 + salt_len) * 8; + + u32x digest[8]; + + hmac_sha256_run (w0_t, w1_t, w2_t, w3_t, ipad, opad, digest); + + const u32x r0 = digest[3]; + const u32x r1 = digest[7]; + const u32x r2 = digest[2]; + const u32x r3 = digest[6]; + + #include VECT_COMPARE_M + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m01450_m08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m01450_m16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m01450_s04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + u32x pw_buf1[4]; + + pw_buf1[0] = pws[gid].i[ 4]; + pw_buf1[1] = pws[gid].i[ 5]; + pw_buf1[2] = pws[gid].i[ 6]; + pw_buf1[3] = pws[gid].i[ 7]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[ 1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[ 2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[ 3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[ 4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[ 5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[ 6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[ 7]; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + + w0[0] = pw_buf0[0]; + w0[1] = pw_buf0[1]; + w0[2] = pw_buf0[2]; + w0[3] = pw_buf0[3]; + + u32x w1[4]; + + w1[0] = pw_buf1[0]; + w1[1] = pw_buf1[1]; + w1[2] = pw_buf1[2]; + w1[3] = pw_buf1[3]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 out_len = apply_rules (c_rules[il_pos].cmds, w0, w1, pw_len); + + /** + * pads + */ + + u32x w0_t[4]; + + w0_t[0] = swap_workaround (w0[0]); + w0_t[1] = swap_workaround (w0[1]); + w0_t[2] = swap_workaround (w0[2]); + w0_t[3] = swap_workaround (w0[3]); + + u32x w1_t[4]; + + w1_t[0] = swap_workaround (w1[0]); + w1_t[1] = swap_workaround (w1[1]); + w1_t[2] = swap_workaround (w1[2]); + w1_t[3] = swap_workaround (w1[3]); + + u32x w2_t[4]; + + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + + u32x w3_t[4]; + + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = 0; + + u32x ipad[8]; + u32x opad[8]; + + hmac_sha256_pad (w0_t, w1_t, w2_t, w3_t, ipad, opad); + + w0_t[0] = swap_workaround (salt_buf0[0]); + w0_t[1] = swap_workaround (salt_buf0[1]); + w0_t[2] = swap_workaround (salt_buf0[2]); + w0_t[3] = swap_workaround (salt_buf0[3]); + w1_t[0] = swap_workaround (salt_buf1[0]); + w1_t[1] = swap_workaround (salt_buf1[1]); + w1_t[2] = swap_workaround (salt_buf1[2]); + w1_t[3] = swap_workaround (salt_buf1[3]); + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = (64 + salt_len) * 8; + + u32x digest[8]; + + hmac_sha256_run (w0_t, w1_t, w2_t, w3_t, ipad, opad, digest); + + const u32x r0 = digest[3]; + const u32x r1 = digest[7]; + const u32x r2 = digest[2]; + const u32x r3 = digest[6]; + + #include VECT_COMPARE_S + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m01450_s08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m01450_s16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/nv/m01450_a1.cu b/nv/m01450_a1.cu new file mode 100644 index 0000000000..6c79920d03 --- /dev/null +++ b/nv/m01450_a1.cu @@ -0,0 +1,704 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _SHA256_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW2 +#define VECT_SIZE1 +#endif + +#define DGST_R0 3 +#define DGST_R1 7 +#define DGST_R2 2 +#define DGST_R3 6 + +#include "include/kernel_functions.c" +#include "types_nv.c" +#include "common_nv.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +__device__ __constant__ u32 k_sha256[64] = +{ + SHA256C00, SHA256C01, SHA256C02, SHA256C03, + SHA256C04, SHA256C05, SHA256C06, SHA256C07, + SHA256C08, SHA256C09, SHA256C0a, SHA256C0b, + SHA256C0c, SHA256C0d, SHA256C0e, SHA256C0f, + SHA256C10, SHA256C11, SHA256C12, SHA256C13, + SHA256C14, SHA256C15, SHA256C16, SHA256C17, + SHA256C18, SHA256C19, SHA256C1a, SHA256C1b, + SHA256C1c, SHA256C1d, SHA256C1e, SHA256C1f, + SHA256C20, SHA256C21, SHA256C22, SHA256C23, + SHA256C24, SHA256C25, SHA256C26, SHA256C27, + SHA256C28, SHA256C29, SHA256C2a, SHA256C2b, + SHA256C2c, SHA256C2d, SHA256C2e, SHA256C2f, + SHA256C30, SHA256C31, SHA256C32, SHA256C33, + SHA256C34, SHA256C35, SHA256C36, SHA256C37, + SHA256C38, SHA256C39, SHA256C3a, SHA256C3b, + SHA256C3c, SHA256C3d, SHA256C3e, SHA256C3f, +}; + +__device__ __constant__ comb_t c_combs[1024]; + +__device__ static void sha256_transform (const u32x w0[4], const u32x w1[4], const u32x w2[4], const u32x w3[4], u32x digest[8]) +{ + u32x a = digest[0]; + u32x b = digest[1]; + u32x c = digest[2]; + u32x d = digest[3]; + u32x e = digest[4]; + u32x f = digest[5]; + u32x g = digest[6]; + u32x h = digest[7]; + + u32x w0_t = w0[0]; + u32x w1_t = w0[1]; + u32x w2_t = w0[2]; + u32x w3_t = w0[3]; + u32x w4_t = w1[0]; + u32x w5_t = w1[1]; + u32x w6_t = w1[2]; + u32x w7_t = w1[3]; + u32x w8_t = w2[0]; + u32x w9_t = w2[1]; + u32x wa_t = w2[2]; + u32x wb_t = w2[3]; + u32x wc_t = w3[0]; + u32x wd_t = w3[1]; + u32x we_t = w3[2]; + u32x wf_t = w3[3]; + + #define ROUND_EXPAND() \ + { \ + w0_t = SHA256_EXPAND (we_t, w9_t, w1_t, w0_t); \ + w1_t = SHA256_EXPAND (wf_t, wa_t, w2_t, w1_t); \ + w2_t = SHA256_EXPAND (w0_t, wb_t, w3_t, w2_t); \ + w3_t = SHA256_EXPAND (w1_t, wc_t, w4_t, w3_t); \ + w4_t = SHA256_EXPAND (w2_t, wd_t, w5_t, w4_t); \ + w5_t = SHA256_EXPAND (w3_t, we_t, w6_t, w5_t); \ + w6_t = SHA256_EXPAND (w4_t, wf_t, w7_t, w6_t); \ + w7_t = SHA256_EXPAND (w5_t, w0_t, w8_t, w7_t); \ + w8_t = SHA256_EXPAND (w6_t, w1_t, w9_t, w8_t); \ + w9_t = SHA256_EXPAND (w7_t, w2_t, wa_t, w9_t); \ + wa_t = SHA256_EXPAND (w8_t, w3_t, wb_t, wa_t); \ + wb_t = SHA256_EXPAND (w9_t, w4_t, wc_t, wb_t); \ + wc_t = SHA256_EXPAND (wa_t, w5_t, wd_t, wc_t); \ + wd_t = SHA256_EXPAND (wb_t, w6_t, we_t, wd_t); \ + we_t = SHA256_EXPAND (wc_t, w7_t, wf_t, we_t); \ + wf_t = SHA256_EXPAND (wd_t, w8_t, w0_t, wf_t); \ + } + + #define ROUND_STEP(i) \ + { \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, k_sha256[i + 0]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, k_sha256[i + 1]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, k_sha256[i + 2]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, k_sha256[i + 3]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, k_sha256[i + 4]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, k_sha256[i + 5]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, k_sha256[i + 6]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, k_sha256[i + 7]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, k_sha256[i + 8]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, k_sha256[i + 9]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, k_sha256[i + 10]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, k_sha256[i + 11]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, k_sha256[i + 12]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, k_sha256[i + 13]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, k_sha256[i + 14]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, k_sha256[i + 15]); \ + } + + ROUND_STEP (0); + + for (int i = 16; i < 64; i += 16) + { + ROUND_EXPAND (); ROUND_STEP (i); + } + + digest[0] += a; + digest[1] += b; + digest[2] += c; + digest[3] += d; + digest[4] += e; + digest[5] += f; + digest[6] += g; + digest[7] += h; +} + +__device__ static void hmac_sha256_pad (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], u32x ipad[8], u32x opad[8]) +{ + w0[0] = w0[0] ^ 0x36363636; + w0[1] = w0[1] ^ 0x36363636; + w0[2] = w0[2] ^ 0x36363636; + w0[3] = w0[3] ^ 0x36363636; + w1[0] = w1[0] ^ 0x36363636; + w1[1] = w1[1] ^ 0x36363636; + w1[2] = w1[2] ^ 0x36363636; + w1[3] = w1[3] ^ 0x36363636; + w2[0] = w2[0] ^ 0x36363636; + w2[1] = w2[1] ^ 0x36363636; + w2[2] = w2[2] ^ 0x36363636; + w2[3] = w2[3] ^ 0x36363636; + w3[0] = w3[0] ^ 0x36363636; + w3[1] = w3[1] ^ 0x36363636; + w3[2] = w3[2] ^ 0x36363636; + w3[3] = w3[3] ^ 0x36363636; + + ipad[0] = SHA256M_A; + ipad[1] = SHA256M_B; + ipad[2] = SHA256M_C; + ipad[3] = SHA256M_D; + ipad[4] = SHA256M_E; + ipad[5] = SHA256M_F; + ipad[6] = SHA256M_G; + ipad[7] = SHA256M_H; + + sha256_transform (w0, w1, w2, w3, ipad); + + w0[0] = w0[0] ^ 0x6a6a6a6a; + w0[1] = w0[1] ^ 0x6a6a6a6a; + w0[2] = w0[2] ^ 0x6a6a6a6a; + w0[3] = w0[3] ^ 0x6a6a6a6a; + w1[0] = w1[0] ^ 0x6a6a6a6a; + w1[1] = w1[1] ^ 0x6a6a6a6a; + w1[2] = w1[2] ^ 0x6a6a6a6a; + w1[3] = w1[3] ^ 0x6a6a6a6a; + w2[0] = w2[0] ^ 0x6a6a6a6a; + w2[1] = w2[1] ^ 0x6a6a6a6a; + w2[2] = w2[2] ^ 0x6a6a6a6a; + w2[3] = w2[3] ^ 0x6a6a6a6a; + w3[0] = w3[0] ^ 0x6a6a6a6a; + w3[1] = w3[1] ^ 0x6a6a6a6a; + w3[2] = w3[2] ^ 0x6a6a6a6a; + w3[3] = w3[3] ^ 0x6a6a6a6a; + + opad[0] = SHA256M_A; + opad[1] = SHA256M_B; + opad[2] = SHA256M_C; + opad[3] = SHA256M_D; + opad[4] = SHA256M_E; + opad[5] = SHA256M_F; + opad[6] = SHA256M_G; + opad[7] = SHA256M_H; + + sha256_transform (w0, w1, w2, w3, opad); +} + +__device__ static void hmac_sha256_run (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], u32x ipad[8], u32x opad[8], u32x digest[8]) +{ + digest[0] = ipad[0]; + digest[1] = ipad[1]; + digest[2] = ipad[2]; + digest[3] = ipad[3]; + digest[4] = ipad[4]; + digest[5] = ipad[5]; + digest[6] = ipad[6]; + digest[7] = ipad[7]; + + sha256_transform (w0, w1, w2, w3, digest); + + w0[0] = digest[0]; + w0[1] = digest[1]; + w0[2] = digest[2]; + w0[3] = digest[3]; + w1[0] = digest[4]; + w1[1] = digest[5]; + w1[2] = digest[6]; + w1[3] = digest[7]; + w2[0] = 0x80000000; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = (64 + 32) * 8; + + digest[0] = opad[0]; + digest[1] = opad[1]; + digest[2] = opad[2]; + digest[3] = opad[3]; + digest[4] = opad[4]; + digest[5] = opad[5]; + digest[6] = opad[6]; + digest[7] = opad[7]; + + sha256_transform (w0, w1, w2, w3, digest); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m01450_m04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, c_combs[0].pw_len); + } + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[ 1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[ 2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[ 3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[ 4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[ 5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[ 6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[ 7]; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = c_combs[il_pos].pw_len; + + const u32 pw_len = pw_l_len + pw_r_len; + + u32 wordr0[4]; + + wordr0[0] = c_combs[il_pos].i[0]; + wordr0[1] = c_combs[il_pos].i[1]; + wordr0[2] = c_combs[il_pos].i[2]; + wordr0[3] = c_combs[il_pos].i[3]; + + u32 wordr1[4]; + + wordr1[0] = c_combs[il_pos].i[4]; + wordr1[1] = c_combs[il_pos].i[5]; + wordr1[2] = c_combs[il_pos].i[6]; + wordr1[3] = c_combs[il_pos].i[7]; + + u32 wordr2[4]; + + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + + u32 wordr3[4]; + + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + u32x w0[4]; + + w0[0] = wordl0[0] | wordr0[0]; + w0[1] = wordl0[1] | wordr0[1]; + w0[2] = wordl0[2] | wordr0[2]; + w0[3] = wordl0[3] | wordr0[3]; + + u32x w1[4]; + + w1[0] = wordl1[0] | wordr1[0]; + w1[1] = wordl1[1] | wordr1[1]; + w1[2] = wordl1[2] | wordr1[2]; + w1[3] = wordl1[3] | wordr1[3]; + + u32x w2[4]; + + w2[0] = wordl2[0] | wordr2[0]; + w2[1] = wordl2[1] | wordr2[1]; + w2[2] = wordl2[2] | wordr2[2]; + w2[3] = wordl2[3] | wordr2[3]; + + u32x w3[4]; + + w3[0] = wordl3[0] | wordr3[0]; + w3[1] = wordl3[1] | wordr3[1]; + w3[2] = wordl3[2] | wordr3[2]; + w3[3] = wordl3[3] | wordr3[3]; + + /** + * pads + */ + + u32x w0_t[4]; + + w0_t[0] = swap_workaround (w0[0]); + w0_t[1] = swap_workaround (w0[1]); + w0_t[2] = swap_workaround (w0[2]); + w0_t[3] = swap_workaround (w0[3]); + + u32x w1_t[4]; + + w1_t[0] = swap_workaround (w1[0]); + w1_t[1] = swap_workaround (w1[1]); + w1_t[2] = swap_workaround (w1[2]); + w1_t[3] = swap_workaround (w1[3]); + + u32x w2_t[4]; + + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + + u32x w3_t[4]; + + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = 0; + + u32x ipad[8]; + u32x opad[8]; + + hmac_sha256_pad (w0_t, w1_t, w2_t, w3_t, ipad, opad); + + w0_t[0] = swap_workaround (salt_buf0[0]); + w0_t[1] = swap_workaround (salt_buf0[1]); + w0_t[2] = swap_workaround (salt_buf0[2]); + w0_t[3] = swap_workaround (salt_buf0[3]); + w1_t[0] = swap_workaround (salt_buf1[0]); + w1_t[1] = swap_workaround (salt_buf1[1]); + w1_t[2] = swap_workaround (salt_buf1[2]); + w1_t[3] = swap_workaround (salt_buf1[3]); + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = (64 + salt_len) * 8; + + u32x digest[8]; + + hmac_sha256_run (w0_t, w1_t, w2_t, w3_t, ipad, opad, digest); + + const u32x r0 = digest[3]; + const u32x r1 = digest[7]; + const u32x r2 = digest[2]; + const u32x r3 = digest[6]; + + #include VECT_COMPARE_M + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m01450_m08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m01450_m16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m01450_s04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, c_combs[0].pw_len); + } + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[ 1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[ 2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[ 3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[ 4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[ 5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[ 6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[ 7]; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = c_combs[il_pos].pw_len; + + const u32 pw_len = pw_l_len + pw_r_len; + + u32 wordr0[4]; + + wordr0[0] = c_combs[il_pos].i[0]; + wordr0[1] = c_combs[il_pos].i[1]; + wordr0[2] = c_combs[il_pos].i[2]; + wordr0[3] = c_combs[il_pos].i[3]; + + u32 wordr1[4]; + + wordr1[0] = c_combs[il_pos].i[4]; + wordr1[1] = c_combs[il_pos].i[5]; + wordr1[2] = c_combs[il_pos].i[6]; + wordr1[3] = c_combs[il_pos].i[7]; + + u32 wordr2[4]; + + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + + u32 wordr3[4]; + + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + u32x w0[4]; + + w0[0] = wordl0[0] | wordr0[0]; + w0[1] = wordl0[1] | wordr0[1]; + w0[2] = wordl0[2] | wordr0[2]; + w0[3] = wordl0[3] | wordr0[3]; + + u32x w1[4]; + + w1[0] = wordl1[0] | wordr1[0]; + w1[1] = wordl1[1] | wordr1[1]; + w1[2] = wordl1[2] | wordr1[2]; + w1[3] = wordl1[3] | wordr1[3]; + + u32x w2[4]; + + w2[0] = wordl2[0] | wordr2[0]; + w2[1] = wordl2[1] | wordr2[1]; + w2[2] = wordl2[2] | wordr2[2]; + w2[3] = wordl2[3] | wordr2[3]; + + u32x w3[4]; + + w3[0] = wordl3[0] | wordr3[0]; + w3[1] = wordl3[1] | wordr3[1]; + w3[2] = wordl3[2] | wordr3[2]; + w3[3] = wordl3[3] | wordr3[3]; + + /** + * pads + */ + + u32x w0_t[4]; + + w0_t[0] = swap_workaround (w0[0]); + w0_t[1] = swap_workaround (w0[1]); + w0_t[2] = swap_workaround (w0[2]); + w0_t[3] = swap_workaround (w0[3]); + + u32x w1_t[4]; + + w1_t[0] = swap_workaround (w1[0]); + w1_t[1] = swap_workaround (w1[1]); + w1_t[2] = swap_workaround (w1[2]); + w1_t[3] = swap_workaround (w1[3]); + + u32x w2_t[4]; + + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + + u32x w3_t[4]; + + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = 0; + + u32x ipad[8]; + u32x opad[8]; + + hmac_sha256_pad (w0_t, w1_t, w2_t, w3_t, ipad, opad); + + w0_t[0] = swap_workaround (salt_buf0[0]); + w0_t[1] = swap_workaround (salt_buf0[1]); + w0_t[2] = swap_workaround (salt_buf0[2]); + w0_t[3] = swap_workaround (salt_buf0[3]); + w1_t[0] = swap_workaround (salt_buf1[0]); + w1_t[1] = swap_workaround (salt_buf1[1]); + w1_t[2] = swap_workaround (salt_buf1[2]); + w1_t[3] = swap_workaround (salt_buf1[3]); + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = (64 + salt_len) * 8; + + u32x digest[8]; + + hmac_sha256_run (w0_t, w1_t, w2_t, w3_t, ipad, opad, digest); + + const u32x a = digest[0]; + const u32x b = digest[1]; + const u32x c = digest[2]; + const u32x d = digest[3]; + const u32x e = digest[4]; + const u32x f = digest[5]; + const u32x g = digest[6]; + const u32x h = digest[7]; + + const u32x r0 = digest[3]; + const u32x r1 = digest[7]; + const u32x r2 = digest[2]; + const u32x r3 = digest[6]; + + #include VECT_COMPARE_S + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m01450_s08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m01450_s16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/nv/m01450_a3.cu b/nv/m01450_a3.cu new file mode 100644 index 0000000000..4db52e1f43 --- /dev/null +++ b/nv/m01450_a3.cu @@ -0,0 +1,759 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _SHA256_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW2 +#define VECT_SIZE1 +#endif + +#define DGST_R0 3 +#define DGST_R1 7 +#define DGST_R2 2 +#define DGST_R3 6 + +#include "include/kernel_functions.c" +#include "types_nv.c" +#include "common_nv.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +__device__ __constant__ u32 k_sha256[64] = +{ + SHA256C00, SHA256C01, SHA256C02, SHA256C03, + SHA256C04, SHA256C05, SHA256C06, SHA256C07, + SHA256C08, SHA256C09, SHA256C0a, SHA256C0b, + SHA256C0c, SHA256C0d, SHA256C0e, SHA256C0f, + SHA256C10, SHA256C11, SHA256C12, SHA256C13, + SHA256C14, SHA256C15, SHA256C16, SHA256C17, + SHA256C18, SHA256C19, SHA256C1a, SHA256C1b, + SHA256C1c, SHA256C1d, SHA256C1e, SHA256C1f, + SHA256C20, SHA256C21, SHA256C22, SHA256C23, + SHA256C24, SHA256C25, SHA256C26, SHA256C27, + SHA256C28, SHA256C29, SHA256C2a, SHA256C2b, + SHA256C2c, SHA256C2d, SHA256C2e, SHA256C2f, + SHA256C30, SHA256C31, SHA256C32, SHA256C33, + SHA256C34, SHA256C35, SHA256C36, SHA256C37, + SHA256C38, SHA256C39, SHA256C3a, SHA256C3b, + SHA256C3c, SHA256C3d, SHA256C3e, SHA256C3f, +}; + +__device__ __constant__ bf_t c_bfs[1024]; + +__device__ static void sha256_transform (const u32x w0[4], const u32x w1[4], const u32x w2[4], const u32x w3[4], u32x digest[8]) +{ + u32x a = digest[0]; + u32x b = digest[1]; + u32x c = digest[2]; + u32x d = digest[3]; + u32x e = digest[4]; + u32x f = digest[5]; + u32x g = digest[6]; + u32x h = digest[7]; + + u32x w0_t = w0[0]; + u32x w1_t = w0[1]; + u32x w2_t = w0[2]; + u32x w3_t = w0[3]; + u32x w4_t = w1[0]; + u32x w5_t = w1[1]; + u32x w6_t = w1[2]; + u32x w7_t = w1[3]; + u32x w8_t = w2[0]; + u32x w9_t = w2[1]; + u32x wa_t = w2[2]; + u32x wb_t = w2[3]; + u32x wc_t = w3[0]; + u32x wd_t = w3[1]; + u32x we_t = w3[2]; + u32x wf_t = w3[3]; + + #define ROUND_EXPAND() \ + { \ + w0_t = SHA256_EXPAND (we_t, w9_t, w1_t, w0_t); \ + w1_t = SHA256_EXPAND (wf_t, wa_t, w2_t, w1_t); \ + w2_t = SHA256_EXPAND (w0_t, wb_t, w3_t, w2_t); \ + w3_t = SHA256_EXPAND (w1_t, wc_t, w4_t, w3_t); \ + w4_t = SHA256_EXPAND (w2_t, wd_t, w5_t, w4_t); \ + w5_t = SHA256_EXPAND (w3_t, we_t, w6_t, w5_t); \ + w6_t = SHA256_EXPAND (w4_t, wf_t, w7_t, w6_t); \ + w7_t = SHA256_EXPAND (w5_t, w0_t, w8_t, w7_t); \ + w8_t = SHA256_EXPAND (w6_t, w1_t, w9_t, w8_t); \ + w9_t = SHA256_EXPAND (w7_t, w2_t, wa_t, w9_t); \ + wa_t = SHA256_EXPAND (w8_t, w3_t, wb_t, wa_t); \ + wb_t = SHA256_EXPAND (w9_t, w4_t, wc_t, wb_t); \ + wc_t = SHA256_EXPAND (wa_t, w5_t, wd_t, wc_t); \ + wd_t = SHA256_EXPAND (wb_t, w6_t, we_t, wd_t); \ + we_t = SHA256_EXPAND (wc_t, w7_t, wf_t, we_t); \ + wf_t = SHA256_EXPAND (wd_t, w8_t, w0_t, wf_t); \ + } + + #define ROUND_STEP(i) \ + { \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, k_sha256[i + 0]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, k_sha256[i + 1]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, k_sha256[i + 2]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, k_sha256[i + 3]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, k_sha256[i + 4]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, k_sha256[i + 5]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, k_sha256[i + 6]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, k_sha256[i + 7]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, k_sha256[i + 8]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, k_sha256[i + 9]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, k_sha256[i + 10]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, k_sha256[i + 11]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, k_sha256[i + 12]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, k_sha256[i + 13]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, k_sha256[i + 14]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, k_sha256[i + 15]); \ + } + + ROUND_STEP (0); + + for (int i = 16; i < 64; i += 16) + { + ROUND_EXPAND (); ROUND_STEP (i); + } + + digest[0] += a; + digest[1] += b; + digest[2] += c; + digest[3] += d; + digest[4] += e; + digest[5] += f; + digest[6] += g; + digest[7] += h; +} + +__device__ static void hmac_sha256_pad (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], u32x ipad[8], u32x opad[8]) +{ + w0[0] = w0[0] ^ 0x36363636; + w0[1] = w0[1] ^ 0x36363636; + w0[2] = w0[2] ^ 0x36363636; + w0[3] = w0[3] ^ 0x36363636; + w1[0] = w1[0] ^ 0x36363636; + w1[1] = w1[1] ^ 0x36363636; + w1[2] = w1[2] ^ 0x36363636; + w1[3] = w1[3] ^ 0x36363636; + w2[0] = w2[0] ^ 0x36363636; + w2[1] = w2[1] ^ 0x36363636; + w2[2] = w2[2] ^ 0x36363636; + w2[3] = w2[3] ^ 0x36363636; + w3[0] = w3[0] ^ 0x36363636; + w3[1] = w3[1] ^ 0x36363636; + w3[2] = w3[2] ^ 0x36363636; + w3[3] = w3[3] ^ 0x36363636; + + ipad[0] = SHA256M_A; + ipad[1] = SHA256M_B; + ipad[2] = SHA256M_C; + ipad[3] = SHA256M_D; + ipad[4] = SHA256M_E; + ipad[5] = SHA256M_F; + ipad[6] = SHA256M_G; + ipad[7] = SHA256M_H; + + sha256_transform (w0, w1, w2, w3, ipad); + + w0[0] = w0[0] ^ 0x6a6a6a6a; + w0[1] = w0[1] ^ 0x6a6a6a6a; + w0[2] = w0[2] ^ 0x6a6a6a6a; + w0[3] = w0[3] ^ 0x6a6a6a6a; + w1[0] = w1[0] ^ 0x6a6a6a6a; + w1[1] = w1[1] ^ 0x6a6a6a6a; + w1[2] = w1[2] ^ 0x6a6a6a6a; + w1[3] = w1[3] ^ 0x6a6a6a6a; + w2[0] = w2[0] ^ 0x6a6a6a6a; + w2[1] = w2[1] ^ 0x6a6a6a6a; + w2[2] = w2[2] ^ 0x6a6a6a6a; + w2[3] = w2[3] ^ 0x6a6a6a6a; + w3[0] = w3[0] ^ 0x6a6a6a6a; + w3[1] = w3[1] ^ 0x6a6a6a6a; + w3[2] = w3[2] ^ 0x6a6a6a6a; + w3[3] = w3[3] ^ 0x6a6a6a6a; + + opad[0] = SHA256M_A; + opad[1] = SHA256M_B; + opad[2] = SHA256M_C; + opad[3] = SHA256M_D; + opad[4] = SHA256M_E; + opad[5] = SHA256M_F; + opad[6] = SHA256M_G; + opad[7] = SHA256M_H; + + sha256_transform (w0, w1, w2, w3, opad); +} + +__device__ static void hmac_sha256_run (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], u32x ipad[8], u32x opad[8], u32x digest[8]) +{ + digest[0] = ipad[0]; + digest[1] = ipad[1]; + digest[2] = ipad[2]; + digest[3] = ipad[3]; + digest[4] = ipad[4]; + digest[5] = ipad[5]; + digest[6] = ipad[6]; + digest[7] = ipad[7]; + + sha256_transform (w0, w1, w2, w3, digest); + + w0[0] = digest[0]; + w0[1] = digest[1]; + w0[2] = digest[2]; + w0[3] = digest[3]; + w1[0] = digest[4]; + w1[1] = digest[5]; + w1[2] = digest[6]; + w1[3] = digest[7]; + w2[0] = 0x80000000; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = (64 + 32) * 8; + + digest[0] = opad[0]; + digest[1] = opad[1]; + digest[2] = opad[2]; + digest[3] = opad[3]; + digest[4] = opad[4]; + digest[5] = opad[5]; + digest[6] = opad[6]; + digest[7] = opad[7]; + + sha256_transform (w0, w1, w2, w3, digest); +} + +__device__ static void m01450m (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], const u32 pw_len, const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset) +{ + /** + * modifier + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + const u32 lid = threadIdx.x; + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[ 1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[ 2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[ 3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[ 4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[ 5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[ 6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[ 7]; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + /** + * loop + */ + + u32x w0l = w0[0]; + + for (u32 il_pos = 0; il_pos < bfs_cnt; il_pos++) + { + const u32 w0r = c_bfs[il_pos].i; + + w0[0] = w0l | w0r; + + /** + * pads + */ + + u32x w0_t[4]; + + w0_t[0] = w0[0]; + w0_t[1] = w0[1]; + w0_t[2] = w0[2]; + w0_t[3] = w0[3]; + + u32x w1_t[4]; + + w1_t[0] = w1[0]; + w1_t[1] = w1[1]; + w1_t[2] = w1[2]; + w1_t[3] = w1[3]; + + u32x w2_t[4]; + + w2_t[0] = w2[0]; + w2_t[1] = w2[1]; + w2_t[2] = w2[2]; + w2_t[3] = w2[3]; + + u32x w3_t[4]; + + w3_t[0] = w3[0]; + w3_t[1] = w3[1]; + w3_t[2] = 0; + w3_t[3] = 0; + + u32x ipad[8]; + u32x opad[8]; + + hmac_sha256_pad (w0_t, w1_t, w2_t, w3_t, ipad, opad); + + w0_t[0] = swap_workaround (salt_buf0[0]); + w0_t[1] = swap_workaround (salt_buf0[1]); + w0_t[2] = swap_workaround (salt_buf0[2]); + w0_t[3] = swap_workaround (salt_buf0[3]); + w1_t[0] = swap_workaround (salt_buf1[0]); + w1_t[1] = swap_workaround (salt_buf1[1]); + w1_t[2] = swap_workaround (salt_buf1[2]); + w1_t[3] = swap_workaround (salt_buf1[3]); + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = (64 + salt_len) * 8; + + u32x digest[8]; + + hmac_sha256_run (w0_t, w1_t, w2_t, w3_t, ipad, opad, digest); + + const u32x r0 = digest[3]; + const u32x r1 = digest[7]; + const u32x r2 = digest[2]; + const u32x r3 = digest[6]; + + #include VECT_COMPARE_M + } +} + +__device__ static void m01450s (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], const u32 pw_len, const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset) +{ + /** + * modifier + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + const u32 lid = threadIdx.x; + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[ 1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[ 2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[ 3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[ 4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[ 5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[ 6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[ 7]; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * loop + */ + + u32x w0l = w0[0]; + + for (u32 il_pos = 0; il_pos < bfs_cnt; il_pos++) + { + const u32 w0r = c_bfs[il_pos].i; + + w0[0] = w0l | w0r; + + /** + * pads + */ + + u32x w0_t[4]; + + w0_t[0] = w0[0]; + w0_t[1] = w0[1]; + w0_t[2] = w0[2]; + w0_t[3] = w0[3]; + + u32x w1_t[4]; + + w1_t[0] = w1[0]; + w1_t[1] = w1[1]; + w1_t[2] = w1[2]; + w1_t[3] = w1[3]; + + u32x w2_t[4]; + + w2_t[0] = w2[0]; + w2_t[1] = w2[1]; + w2_t[2] = w2[2]; + w2_t[3] = w2[3]; + + u32x w3_t[4]; + + w3_t[0] = w3[0]; + w3_t[1] = w3[1]; + w3_t[2] = 0; + w3_t[3] = 0; + + u32x ipad[8]; + u32x opad[8]; + + hmac_sha256_pad (w0_t, w1_t, w2_t, w3_t, ipad, opad); + + w0_t[0] = swap_workaround (salt_buf0[0]); + w0_t[1] = swap_workaround (salt_buf0[1]); + w0_t[2] = swap_workaround (salt_buf0[2]); + w0_t[3] = swap_workaround (salt_buf0[3]); + w1_t[0] = swap_workaround (salt_buf1[0]); + w1_t[1] = swap_workaround (salt_buf1[1]); + w1_t[2] = swap_workaround (salt_buf1[2]); + w1_t[3] = swap_workaround (salt_buf1[3]); + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = (64 + salt_len) * 8; + + u32x digest[8]; + + hmac_sha256_run (w0_t, w1_t, w2_t, w3_t, ipad, opad, digest); + + const u32x r0 = digest[3]; + const u32x r1 = digest[7]; + const u32x r2 = digest[2]; + const u32x r3 = digest[6]; + + #include VECT_COMPARE_S + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m01450_m04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m01450m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m01450_m08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m01450m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m01450_m16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = pws[gid].i[ 8]; + w2[1] = pws[gid].i[ 9]; + w2[2] = pws[gid].i[10]; + w2[3] = pws[gid].i[11]; + + u32x w3[4]; + + w3[0] = pws[gid].i[12]; + w3[1] = pws[gid].i[13]; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m01450m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m01450_s04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m01450s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m01450_s08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m01450s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m01450_s16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = pws[gid].i[ 8]; + w2[1] = pws[gid].i[ 9]; + w2[2] = pws[gid].i[10]; + w2[3] = pws[gid].i[11]; + + u32x w3[4]; + + w3[0] = pws[gid].i[12]; + w3[1] = pws[gid].i[13]; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m01450s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} diff --git a/nv/m01460_a0.cu b/nv/m01460_a0.cu new file mode 100644 index 0000000000..7a06bb2fde --- /dev/null +++ b/nv/m01460_a0.cu @@ -0,0 +1,589 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _SHA256_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW2 +#define VECT_SIZE1 +#endif + +#define DGST_R0 3 +#define DGST_R1 7 +#define DGST_R2 2 +#define DGST_R3 6 + +#include "include/kernel_functions.c" +#include "types_nv.c" +#include "common_nv.c" +#include "include/rp_gpu.h" +#include "rp_nv.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +__device__ __constant__ u32 k_sha256[64] = +{ + SHA256C00, SHA256C01, SHA256C02, SHA256C03, + SHA256C04, SHA256C05, SHA256C06, SHA256C07, + SHA256C08, SHA256C09, SHA256C0a, SHA256C0b, + SHA256C0c, SHA256C0d, SHA256C0e, SHA256C0f, + SHA256C10, SHA256C11, SHA256C12, SHA256C13, + SHA256C14, SHA256C15, SHA256C16, SHA256C17, + SHA256C18, SHA256C19, SHA256C1a, SHA256C1b, + SHA256C1c, SHA256C1d, SHA256C1e, SHA256C1f, + SHA256C20, SHA256C21, SHA256C22, SHA256C23, + SHA256C24, SHA256C25, SHA256C26, SHA256C27, + SHA256C28, SHA256C29, SHA256C2a, SHA256C2b, + SHA256C2c, SHA256C2d, SHA256C2e, SHA256C2f, + SHA256C30, SHA256C31, SHA256C32, SHA256C33, + SHA256C34, SHA256C35, SHA256C36, SHA256C37, + SHA256C38, SHA256C39, SHA256C3a, SHA256C3b, + SHA256C3c, SHA256C3d, SHA256C3e, SHA256C3f, +}; + +__device__ __constant__ gpu_rule_t c_rules[1024]; + +__device__ static void sha256_transform (const u32x w0[4], const u32x w1[4], const u32x w2[4], const u32x w3[4], u32x digest[8]) +{ + u32x a = digest[0]; + u32x b = digest[1]; + u32x c = digest[2]; + u32x d = digest[3]; + u32x e = digest[4]; + u32x f = digest[5]; + u32x g = digest[6]; + u32x h = digest[7]; + + u32x w0_t = w0[0]; + u32x w1_t = w0[1]; + u32x w2_t = w0[2]; + u32x w3_t = w0[3]; + u32x w4_t = w1[0]; + u32x w5_t = w1[1]; + u32x w6_t = w1[2]; + u32x w7_t = w1[3]; + u32x w8_t = w2[0]; + u32x w9_t = w2[1]; + u32x wa_t = w2[2]; + u32x wb_t = w2[3]; + u32x wc_t = w3[0]; + u32x wd_t = w3[1]; + u32x we_t = w3[2]; + u32x wf_t = w3[3]; + + #define ROUND_EXPAND() \ + { \ + w0_t = SHA256_EXPAND (we_t, w9_t, w1_t, w0_t); \ + w1_t = SHA256_EXPAND (wf_t, wa_t, w2_t, w1_t); \ + w2_t = SHA256_EXPAND (w0_t, wb_t, w3_t, w2_t); \ + w3_t = SHA256_EXPAND (w1_t, wc_t, w4_t, w3_t); \ + w4_t = SHA256_EXPAND (w2_t, wd_t, w5_t, w4_t); \ + w5_t = SHA256_EXPAND (w3_t, we_t, w6_t, w5_t); \ + w6_t = SHA256_EXPAND (w4_t, wf_t, w7_t, w6_t); \ + w7_t = SHA256_EXPAND (w5_t, w0_t, w8_t, w7_t); \ + w8_t = SHA256_EXPAND (w6_t, w1_t, w9_t, w8_t); \ + w9_t = SHA256_EXPAND (w7_t, w2_t, wa_t, w9_t); \ + wa_t = SHA256_EXPAND (w8_t, w3_t, wb_t, wa_t); \ + wb_t = SHA256_EXPAND (w9_t, w4_t, wc_t, wb_t); \ + wc_t = SHA256_EXPAND (wa_t, w5_t, wd_t, wc_t); \ + wd_t = SHA256_EXPAND (wb_t, w6_t, we_t, wd_t); \ + we_t = SHA256_EXPAND (wc_t, w7_t, wf_t, we_t); \ + wf_t = SHA256_EXPAND (wd_t, w8_t, w0_t, wf_t); \ + } + + #define ROUND_STEP(i) \ + { \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, k_sha256[i + 0]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, k_sha256[i + 1]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, k_sha256[i + 2]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, k_sha256[i + 3]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, k_sha256[i + 4]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, k_sha256[i + 5]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, k_sha256[i + 6]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, k_sha256[i + 7]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, k_sha256[i + 8]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, k_sha256[i + 9]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, k_sha256[i + 10]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, k_sha256[i + 11]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, k_sha256[i + 12]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, k_sha256[i + 13]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, k_sha256[i + 14]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, k_sha256[i + 15]); \ + } + + ROUND_STEP (0); + + for (int i = 16; i < 64; i += 16) + { + ROUND_EXPAND (); ROUND_STEP (i); + } + + digest[0] += a; + digest[1] += b; + digest[2] += c; + digest[3] += d; + digest[4] += e; + digest[5] += f; + digest[6] += g; + digest[7] += h; +} + +__device__ static void hmac_sha256_pad (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], u32x ipad[8], u32x opad[8]) +{ + w0[0] = w0[0] ^ 0x36363636; + w0[1] = w0[1] ^ 0x36363636; + w0[2] = w0[2] ^ 0x36363636; + w0[3] = w0[3] ^ 0x36363636; + w1[0] = w1[0] ^ 0x36363636; + w1[1] = w1[1] ^ 0x36363636; + w1[2] = w1[2] ^ 0x36363636; + w1[3] = w1[3] ^ 0x36363636; + w2[0] = w2[0] ^ 0x36363636; + w2[1] = w2[1] ^ 0x36363636; + w2[2] = w2[2] ^ 0x36363636; + w2[3] = w2[3] ^ 0x36363636; + w3[0] = w3[0] ^ 0x36363636; + w3[1] = w3[1] ^ 0x36363636; + w3[2] = w3[2] ^ 0x36363636; + w3[3] = w3[3] ^ 0x36363636; + + ipad[0] = SHA256M_A; + ipad[1] = SHA256M_B; + ipad[2] = SHA256M_C; + ipad[3] = SHA256M_D; + ipad[4] = SHA256M_E; + ipad[5] = SHA256M_F; + ipad[6] = SHA256M_G; + ipad[7] = SHA256M_H; + + sha256_transform (w0, w1, w2, w3, ipad); + + w0[0] = w0[0] ^ 0x6a6a6a6a; + w0[1] = w0[1] ^ 0x6a6a6a6a; + w0[2] = w0[2] ^ 0x6a6a6a6a; + w0[3] = w0[3] ^ 0x6a6a6a6a; + w1[0] = w1[0] ^ 0x6a6a6a6a; + w1[1] = w1[1] ^ 0x6a6a6a6a; + w1[2] = w1[2] ^ 0x6a6a6a6a; + w1[3] = w1[3] ^ 0x6a6a6a6a; + w2[0] = w2[0] ^ 0x6a6a6a6a; + w2[1] = w2[1] ^ 0x6a6a6a6a; + w2[2] = w2[2] ^ 0x6a6a6a6a; + w2[3] = w2[3] ^ 0x6a6a6a6a; + w3[0] = w3[0] ^ 0x6a6a6a6a; + w3[1] = w3[1] ^ 0x6a6a6a6a; + w3[2] = w3[2] ^ 0x6a6a6a6a; + w3[3] = w3[3] ^ 0x6a6a6a6a; + + opad[0] = SHA256M_A; + opad[1] = SHA256M_B; + opad[2] = SHA256M_C; + opad[3] = SHA256M_D; + opad[4] = SHA256M_E; + opad[5] = SHA256M_F; + opad[6] = SHA256M_G; + opad[7] = SHA256M_H; + + sha256_transform (w0, w1, w2, w3, opad); +} + +__device__ static void hmac_sha256_run (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], u32x ipad[8], u32x opad[8], u32x digest[8]) +{ + digest[0] = ipad[0]; + digest[1] = ipad[1]; + digest[2] = ipad[2]; + digest[3] = ipad[3]; + digest[4] = ipad[4]; + digest[5] = ipad[5]; + digest[6] = ipad[6]; + digest[7] = ipad[7]; + + sha256_transform (w0, w1, w2, w3, digest); + + w0[0] = digest[0]; + w0[1] = digest[1]; + w0[2] = digest[2]; + w0[3] = digest[3]; + w1[0] = digest[4]; + w1[1] = digest[5]; + w1[2] = digest[6]; + w1[3] = digest[7]; + w2[0] = 0x80000000; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = (64 + 32) * 8; + + digest[0] = opad[0]; + digest[1] = opad[1]; + digest[2] = opad[2]; + digest[3] = opad[3]; + digest[4] = opad[4]; + digest[5] = opad[5]; + digest[6] = opad[6]; + digest[7] = opad[7]; + + sha256_transform (w0, w1, w2, w3, digest); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m01460_m04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + u32x pw_buf1[4]; + + pw_buf1[0] = pws[gid].i[ 4]; + pw_buf1[1] = pws[gid].i[ 5]; + pw_buf1[2] = pws[gid].i[ 6]; + pw_buf1[3] = pws[gid].i[ 7]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[ 1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[ 2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[ 3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[ 4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[ 5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[ 6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[ 7]; + + /** + * pads + */ + + u32x w0_t[4]; + + w0_t[0] = swap_workaround (salt_buf0[0]); + w0_t[1] = swap_workaround (salt_buf0[1]); + w0_t[2] = swap_workaround (salt_buf0[2]); + w0_t[3] = swap_workaround (salt_buf0[3]); + + u32x w1_t[4]; + + w1_t[0] = swap_workaround (salt_buf1[0]); + w1_t[1] = swap_workaround (salt_buf1[1]); + w1_t[2] = swap_workaround (salt_buf1[2]); + w1_t[3] = swap_workaround (salt_buf1[3]); + + u32x w2_t[4]; + + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + + u32x w3_t[4]; + + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = 0; + + u32x ipad[8]; + u32x opad[8]; + + hmac_sha256_pad (w0_t, w1_t, w2_t, w3_t, ipad, opad); + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + + w0[0] = pw_buf0[0]; + w0[1] = pw_buf0[1]; + w0[2] = pw_buf0[2]; + w0[3] = pw_buf0[3]; + + u32x w1[4]; + + w1[0] = pw_buf1[0]; + w1[1] = pw_buf1[1]; + w1[2] = pw_buf1[2]; + w1[3] = pw_buf1[3]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 out_len = apply_rules (c_rules[il_pos].cmds, w0, w1, pw_len); + + append_0x80_2 (w0, w1, out_len); + + w0_t[0] = swap_workaround (w0[0]); + w0_t[1] = swap_workaround (w0[1]); + w0_t[2] = swap_workaround (w0[2]); + w0_t[3] = swap_workaround (w0[3]); + w1_t[0] = swap_workaround (w1[0]); + w1_t[1] = swap_workaround (w1[1]); + w1_t[2] = swap_workaround (w1[2]); + w1_t[3] = swap_workaround (w1[3]); + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = (64 + out_len) * 8; + + u32x digest[8]; + + hmac_sha256_run (w0_t, w1_t, w2_t, w3_t, ipad, opad, digest); + + const u32x r0 = digest[3]; + const u32x r1 = digest[7]; + const u32x r2 = digest[2]; + const u32x r3 = digest[6]; + + #include VECT_COMPARE_M + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m01460_m08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m01460_m16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m01460_s04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + u32x pw_buf1[4]; + + pw_buf1[0] = pws[gid].i[ 4]; + pw_buf1[1] = pws[gid].i[ 5]; + pw_buf1[2] = pws[gid].i[ 6]; + pw_buf1[3] = pws[gid].i[ 7]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[ 1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[ 2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[ 3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[ 4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[ 5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[ 6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[ 7]; + + /** + * pads + */ + + u32x w0_t[4]; + + w0_t[0] = swap_workaround (salt_buf0[0]); + w0_t[1] = swap_workaround (salt_buf0[1]); + w0_t[2] = swap_workaround (salt_buf0[2]); + w0_t[3] = swap_workaround (salt_buf0[3]); + + u32x w1_t[4]; + + w1_t[0] = swap_workaround (salt_buf1[0]); + w1_t[1] = swap_workaround (salt_buf1[1]); + w1_t[2] = swap_workaround (salt_buf1[2]); + w1_t[3] = swap_workaround (salt_buf1[3]); + + u32x w2_t[4]; + + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + + u32x w3_t[4]; + + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = 0; + + u32x ipad[8]; + u32x opad[8]; + + hmac_sha256_pad (w0_t, w1_t, w2_t, w3_t, ipad, opad); + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + + w0[0] = pw_buf0[0]; + w0[1] = pw_buf0[1]; + w0[2] = pw_buf0[2]; + w0[3] = pw_buf0[3]; + + u32x w1[4]; + + w1[0] = pw_buf1[0]; + w1[1] = pw_buf1[1]; + w1[2] = pw_buf1[2]; + w1[3] = pw_buf1[3]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 out_len = apply_rules (c_rules[il_pos].cmds, w0, w1, pw_len); + + append_0x80_2 (w0, w1, out_len); + + w0_t[0] = swap_workaround (w0[0]); + w0_t[1] = swap_workaround (w0[1]); + w0_t[2] = swap_workaround (w0[2]); + w0_t[3] = swap_workaround (w0[3]); + w1_t[0] = swap_workaround (w1[0]); + w1_t[1] = swap_workaround (w1[1]); + w1_t[2] = swap_workaround (w1[2]); + w1_t[3] = swap_workaround (w1[3]); + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = (64 + out_len) * 8; + + u32x digest[8]; + + hmac_sha256_run (w0_t, w1_t, w2_t, w3_t, ipad, opad, digest); + + const u32x r0 = digest[3]; + const u32x r1 = digest[7]; + const u32x r2 = digest[2]; + const u32x r3 = digest[6]; + + #include VECT_COMPARE_S + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m01460_s08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m01460_s16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/nv/m01460_a1.cu b/nv/m01460_a1.cu new file mode 100644 index 0000000000..042754bffd --- /dev/null +++ b/nv/m01460_a1.cu @@ -0,0 +1,695 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _SHA256_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW2 +#define VECT_SIZE1 +#endif + +#define DGST_R0 3 +#define DGST_R1 7 +#define DGST_R2 2 +#define DGST_R3 6 + +#include "include/kernel_functions.c" +#include "types_nv.c" +#include "common_nv.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +__device__ __constant__ u32 k_sha256[64] = +{ + SHA256C00, SHA256C01, SHA256C02, SHA256C03, + SHA256C04, SHA256C05, SHA256C06, SHA256C07, + SHA256C08, SHA256C09, SHA256C0a, SHA256C0b, + SHA256C0c, SHA256C0d, SHA256C0e, SHA256C0f, + SHA256C10, SHA256C11, SHA256C12, SHA256C13, + SHA256C14, SHA256C15, SHA256C16, SHA256C17, + SHA256C18, SHA256C19, SHA256C1a, SHA256C1b, + SHA256C1c, SHA256C1d, SHA256C1e, SHA256C1f, + SHA256C20, SHA256C21, SHA256C22, SHA256C23, + SHA256C24, SHA256C25, SHA256C26, SHA256C27, + SHA256C28, SHA256C29, SHA256C2a, SHA256C2b, + SHA256C2c, SHA256C2d, SHA256C2e, SHA256C2f, + SHA256C30, SHA256C31, SHA256C32, SHA256C33, + SHA256C34, SHA256C35, SHA256C36, SHA256C37, + SHA256C38, SHA256C39, SHA256C3a, SHA256C3b, + SHA256C3c, SHA256C3d, SHA256C3e, SHA256C3f, +}; + +__device__ __constant__ comb_t c_combs[1024]; + +__device__ static void sha256_transform (const u32x w0[4], const u32x w1[4], const u32x w2[4], const u32x w3[4], u32x digest[8]) +{ + u32x a = digest[0]; + u32x b = digest[1]; + u32x c = digest[2]; + u32x d = digest[3]; + u32x e = digest[4]; + u32x f = digest[5]; + u32x g = digest[6]; + u32x h = digest[7]; + + u32x w0_t = w0[0]; + u32x w1_t = w0[1]; + u32x w2_t = w0[2]; + u32x w3_t = w0[3]; + u32x w4_t = w1[0]; + u32x w5_t = w1[1]; + u32x w6_t = w1[2]; + u32x w7_t = w1[3]; + u32x w8_t = w2[0]; + u32x w9_t = w2[1]; + u32x wa_t = w2[2]; + u32x wb_t = w2[3]; + u32x wc_t = w3[0]; + u32x wd_t = w3[1]; + u32x we_t = w3[2]; + u32x wf_t = w3[3]; + + #define ROUND_EXPAND() \ + { \ + w0_t = SHA256_EXPAND (we_t, w9_t, w1_t, w0_t); \ + w1_t = SHA256_EXPAND (wf_t, wa_t, w2_t, w1_t); \ + w2_t = SHA256_EXPAND (w0_t, wb_t, w3_t, w2_t); \ + w3_t = SHA256_EXPAND (w1_t, wc_t, w4_t, w3_t); \ + w4_t = SHA256_EXPAND (w2_t, wd_t, w5_t, w4_t); \ + w5_t = SHA256_EXPAND (w3_t, we_t, w6_t, w5_t); \ + w6_t = SHA256_EXPAND (w4_t, wf_t, w7_t, w6_t); \ + w7_t = SHA256_EXPAND (w5_t, w0_t, w8_t, w7_t); \ + w8_t = SHA256_EXPAND (w6_t, w1_t, w9_t, w8_t); \ + w9_t = SHA256_EXPAND (w7_t, w2_t, wa_t, w9_t); \ + wa_t = SHA256_EXPAND (w8_t, w3_t, wb_t, wa_t); \ + wb_t = SHA256_EXPAND (w9_t, w4_t, wc_t, wb_t); \ + wc_t = SHA256_EXPAND (wa_t, w5_t, wd_t, wc_t); \ + wd_t = SHA256_EXPAND (wb_t, w6_t, we_t, wd_t); \ + we_t = SHA256_EXPAND (wc_t, w7_t, wf_t, we_t); \ + wf_t = SHA256_EXPAND (wd_t, w8_t, w0_t, wf_t); \ + } + + #define ROUND_STEP(i) \ + { \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, k_sha256[i + 0]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, k_sha256[i + 1]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, k_sha256[i + 2]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, k_sha256[i + 3]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, k_sha256[i + 4]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, k_sha256[i + 5]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, k_sha256[i + 6]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, k_sha256[i + 7]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, k_sha256[i + 8]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, k_sha256[i + 9]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, k_sha256[i + 10]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, k_sha256[i + 11]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, k_sha256[i + 12]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, k_sha256[i + 13]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, k_sha256[i + 14]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, k_sha256[i + 15]); \ + } + + ROUND_STEP (0); + + for (int i = 16; i < 64; i += 16) + { + ROUND_EXPAND (); ROUND_STEP (i); + } + + digest[0] += a; + digest[1] += b; + digest[2] += c; + digest[3] += d; + digest[4] += e; + digest[5] += f; + digest[6] += g; + digest[7] += h; +} + +__device__ static void hmac_sha256_pad (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], u32x ipad[8], u32x opad[8]) +{ + w0[0] = w0[0] ^ 0x36363636; + w0[1] = w0[1] ^ 0x36363636; + w0[2] = w0[2] ^ 0x36363636; + w0[3] = w0[3] ^ 0x36363636; + w1[0] = w1[0] ^ 0x36363636; + w1[1] = w1[1] ^ 0x36363636; + w1[2] = w1[2] ^ 0x36363636; + w1[3] = w1[3] ^ 0x36363636; + w2[0] = w2[0] ^ 0x36363636; + w2[1] = w2[1] ^ 0x36363636; + w2[2] = w2[2] ^ 0x36363636; + w2[3] = w2[3] ^ 0x36363636; + w3[0] = w3[0] ^ 0x36363636; + w3[1] = w3[1] ^ 0x36363636; + w3[2] = w3[2] ^ 0x36363636; + w3[3] = w3[3] ^ 0x36363636; + + ipad[0] = SHA256M_A; + ipad[1] = SHA256M_B; + ipad[2] = SHA256M_C; + ipad[3] = SHA256M_D; + ipad[4] = SHA256M_E; + ipad[5] = SHA256M_F; + ipad[6] = SHA256M_G; + ipad[7] = SHA256M_H; + + sha256_transform (w0, w1, w2, w3, ipad); + + w0[0] = w0[0] ^ 0x6a6a6a6a; + w0[1] = w0[1] ^ 0x6a6a6a6a; + w0[2] = w0[2] ^ 0x6a6a6a6a; + w0[3] = w0[3] ^ 0x6a6a6a6a; + w1[0] = w1[0] ^ 0x6a6a6a6a; + w1[1] = w1[1] ^ 0x6a6a6a6a; + w1[2] = w1[2] ^ 0x6a6a6a6a; + w1[3] = w1[3] ^ 0x6a6a6a6a; + w2[0] = w2[0] ^ 0x6a6a6a6a; + w2[1] = w2[1] ^ 0x6a6a6a6a; + w2[2] = w2[2] ^ 0x6a6a6a6a; + w2[3] = w2[3] ^ 0x6a6a6a6a; + w3[0] = w3[0] ^ 0x6a6a6a6a; + w3[1] = w3[1] ^ 0x6a6a6a6a; + w3[2] = w3[2] ^ 0x6a6a6a6a; + w3[3] = w3[3] ^ 0x6a6a6a6a; + + opad[0] = SHA256M_A; + opad[1] = SHA256M_B; + opad[2] = SHA256M_C; + opad[3] = SHA256M_D; + opad[4] = SHA256M_E; + opad[5] = SHA256M_F; + opad[6] = SHA256M_G; + opad[7] = SHA256M_H; + + sha256_transform (w0, w1, w2, w3, opad); +} + +__device__ static void hmac_sha256_run (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], u32x ipad[8], u32x opad[8], u32x digest[8]) +{ + digest[0] = ipad[0]; + digest[1] = ipad[1]; + digest[2] = ipad[2]; + digest[3] = ipad[3]; + digest[4] = ipad[4]; + digest[5] = ipad[5]; + digest[6] = ipad[6]; + digest[7] = ipad[7]; + + sha256_transform (w0, w1, w2, w3, digest); + + w0[0] = digest[0]; + w0[1] = digest[1]; + w0[2] = digest[2]; + w0[3] = digest[3]; + w1[0] = digest[4]; + w1[1] = digest[5]; + w1[2] = digest[6]; + w1[3] = digest[7]; + w2[0] = 0x80000000; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = (64 + 32) * 8; + + digest[0] = opad[0]; + digest[1] = opad[1]; + digest[2] = opad[2]; + digest[3] = opad[3]; + digest[4] = opad[4]; + digest[5] = opad[5]; + digest[6] = opad[6]; + digest[7] = opad[7]; + + sha256_transform (w0, w1, w2, w3, digest); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m01460_m04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, c_combs[0].pw_len); + } + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[ 1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[ 2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[ 3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[ 4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[ 5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[ 6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[ 7]; + + /** + * pads + */ + + u32x w0_t[4]; + + w0_t[0] = swap_workaround (salt_buf0[0]); + w0_t[1] = swap_workaround (salt_buf0[1]); + w0_t[2] = swap_workaround (salt_buf0[2]); + w0_t[3] = swap_workaround (salt_buf0[3]); + + u32x w1_t[4]; + + w1_t[0] = swap_workaround (salt_buf1[0]); + w1_t[1] = swap_workaround (salt_buf1[1]); + w1_t[2] = swap_workaround (salt_buf1[2]); + w1_t[3] = swap_workaround (salt_buf1[3]); + + u32x w2_t[4]; + + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + + u32x w3_t[4]; + + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = 0; + + u32x ipad[8]; + u32x opad[8]; + + hmac_sha256_pad (w0_t, w1_t, w2_t, w3_t, ipad, opad); + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = c_combs[il_pos].pw_len; + + const u32 pw_len = pw_l_len + pw_r_len; + + u32 wordr0[4]; + + wordr0[0] = c_combs[il_pos].i[0]; + wordr0[1] = c_combs[il_pos].i[1]; + wordr0[2] = c_combs[il_pos].i[2]; + wordr0[3] = c_combs[il_pos].i[3]; + + u32 wordr1[4]; + + wordr1[0] = c_combs[il_pos].i[4]; + wordr1[1] = c_combs[il_pos].i[5]; + wordr1[2] = c_combs[il_pos].i[6]; + wordr1[3] = c_combs[il_pos].i[7]; + + u32 wordr2[4]; + + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + + u32 wordr3[4]; + + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + u32x w0[4]; + + w0[0] = wordl0[0] | wordr0[0]; + w0[1] = wordl0[1] | wordr0[1]; + w0[2] = wordl0[2] | wordr0[2]; + w0[3] = wordl0[3] | wordr0[3]; + + u32x w1[4]; + + w1[0] = wordl1[0] | wordr1[0]; + w1[1] = wordl1[1] | wordr1[1]; + w1[2] = wordl1[2] | wordr1[2]; + w1[3] = wordl1[3] | wordr1[3]; + + u32x w2[4]; + + w2[0] = wordl2[0] | wordr2[0]; + w2[1] = wordl2[1] | wordr2[1]; + w2[2] = wordl2[2] | wordr2[2]; + w2[3] = wordl2[3] | wordr2[3]; + + u32x w3[4]; + + w3[0] = wordl3[0] | wordr3[0]; + w3[1] = wordl3[1] | wordr3[1]; + w3[2] = 0; + w3[3] = 0; + + append_0x80_4 (w0, w1, w2, w3, pw_len); + + w0_t[0] = swap_workaround (w0[0]); + w0_t[1] = swap_workaround (w0[1]); + w0_t[2] = swap_workaround (w0[2]); + w0_t[3] = swap_workaround (w0[3]); + w1_t[0] = swap_workaround (w1[0]); + w1_t[1] = swap_workaround (w1[1]); + w1_t[2] = swap_workaround (w1[2]); + w1_t[3] = swap_workaround (w1[3]); + w2_t[0] = swap_workaround (w2[0]); + w2_t[1] = swap_workaround (w2[1]); + w2_t[2] = swap_workaround (w2[2]); + w2_t[3] = swap_workaround (w2[3]); + w3_t[0] = swap_workaround (w3[0]); + w3_t[1] = swap_workaround (w3[1]); + w3_t[2] = 0; + w3_t[3] = (64 + pw_len) * 8; + + u32x digest[8]; + + hmac_sha256_run (w0_t, w1_t, w2_t, w3_t, ipad, opad, digest); + + const u32x r0 = digest[3]; + const u32x r1 = digest[7]; + const u32x r2 = digest[2]; + const u32x r3 = digest[6]; + + #include VECT_COMPARE_M + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m01460_m08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m01460_m16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m01460_s04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, c_combs[0].pw_len); + } + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[ 1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[ 2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[ 3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[ 4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[ 5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[ 6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[ 7]; + + /** + * pads + */ + + u32x w0_t[4]; + + w0_t[0] = swap_workaround (salt_buf0[0]); + w0_t[1] = swap_workaround (salt_buf0[1]); + w0_t[2] = swap_workaround (salt_buf0[2]); + w0_t[3] = swap_workaround (salt_buf0[3]); + + u32x w1_t[4]; + + w1_t[0] = swap_workaround (salt_buf1[0]); + w1_t[1] = swap_workaround (salt_buf1[1]); + w1_t[2] = swap_workaround (salt_buf1[2]); + w1_t[3] = swap_workaround (salt_buf1[3]); + + u32x w2_t[4]; + + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + + u32x w3_t[4]; + + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = 0; + + u32x ipad[8]; + u32x opad[8]; + + hmac_sha256_pad (w0_t, w1_t, w2_t, w3_t, ipad, opad); + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = c_combs[il_pos].pw_len; + + const u32 pw_len = pw_l_len + pw_r_len; + + u32 wordr0[4]; + + wordr0[0] = c_combs[il_pos].i[0]; + wordr0[1] = c_combs[il_pos].i[1]; + wordr0[2] = c_combs[il_pos].i[2]; + wordr0[3] = c_combs[il_pos].i[3]; + + u32 wordr1[4]; + + wordr1[0] = c_combs[il_pos].i[4]; + wordr1[1] = c_combs[il_pos].i[5]; + wordr1[2] = c_combs[il_pos].i[6]; + wordr1[3] = c_combs[il_pos].i[7]; + + u32 wordr2[4]; + + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + + u32 wordr3[4]; + + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + u32x w0[4]; + + w0[0] = wordl0[0] | wordr0[0]; + w0[1] = wordl0[1] | wordr0[1]; + w0[2] = wordl0[2] | wordr0[2]; + w0[3] = wordl0[3] | wordr0[3]; + + u32x w1[4]; + + w1[0] = wordl1[0] | wordr1[0]; + w1[1] = wordl1[1] | wordr1[1]; + w1[2] = wordl1[2] | wordr1[2]; + w1[3] = wordl1[3] | wordr1[3]; + + u32x w2[4]; + + w2[0] = wordl2[0] | wordr2[0]; + w2[1] = wordl2[1] | wordr2[1]; + w2[2] = wordl2[2] | wordr2[2]; + w2[3] = wordl2[3] | wordr2[3]; + + u32x w3[4]; + + w3[0] = wordl3[0] | wordr3[0]; + w3[1] = wordl3[1] | wordr3[1]; + w3[2] = 0; + w3[3] = 0; + + append_0x80_4 (w0, w1, w2, w3, pw_len); + + w0_t[0] = swap_workaround (w0[0]); + w0_t[1] = swap_workaround (w0[1]); + w0_t[2] = swap_workaround (w0[2]); + w0_t[3] = swap_workaround (w0[3]); + w1_t[0] = swap_workaround (w1[0]); + w1_t[1] = swap_workaround (w1[1]); + w1_t[2] = swap_workaround (w1[2]); + w1_t[3] = swap_workaround (w1[3]); + w2_t[0] = swap_workaround (w2[0]); + w2_t[1] = swap_workaround (w2[1]); + w2_t[2] = swap_workaround (w2[2]); + w2_t[3] = swap_workaround (w2[3]); + w3_t[0] = swap_workaround (w3[0]); + w3_t[1] = swap_workaround (w3[1]); + w3_t[2] = 0; + w3_t[3] = (64 + pw_len) * 8; + + u32x digest[8]; + + hmac_sha256_run (w0_t, w1_t, w2_t, w3_t, ipad, opad, digest); + + const u32x r0 = digest[3]; + const u32x r1 = digest[7]; + const u32x r2 = digest[2]; + const u32x r3 = digest[6]; + + #include VECT_COMPARE_S + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m01460_s08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m01460_s16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/nv/m01460_a3.cu b/nv/m01460_a3.cu new file mode 100644 index 0000000000..29b5263ca4 --- /dev/null +++ b/nv/m01460_a3.cu @@ -0,0 +1,755 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _SHA256_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW2 +#define VECT_SIZE1 +#endif + +#define DGST_R0 3 +#define DGST_R1 7 +#define DGST_R2 2 +#define DGST_R3 6 + +#include "include/kernel_functions.c" +#include "types_nv.c" +#include "common_nv.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +__device__ __constant__ u32 k_sha256[64] = +{ + SHA256C00, SHA256C01, SHA256C02, SHA256C03, + SHA256C04, SHA256C05, SHA256C06, SHA256C07, + SHA256C08, SHA256C09, SHA256C0a, SHA256C0b, + SHA256C0c, SHA256C0d, SHA256C0e, SHA256C0f, + SHA256C10, SHA256C11, SHA256C12, SHA256C13, + SHA256C14, SHA256C15, SHA256C16, SHA256C17, + SHA256C18, SHA256C19, SHA256C1a, SHA256C1b, + SHA256C1c, SHA256C1d, SHA256C1e, SHA256C1f, + SHA256C20, SHA256C21, SHA256C22, SHA256C23, + SHA256C24, SHA256C25, SHA256C26, SHA256C27, + SHA256C28, SHA256C29, SHA256C2a, SHA256C2b, + SHA256C2c, SHA256C2d, SHA256C2e, SHA256C2f, + SHA256C30, SHA256C31, SHA256C32, SHA256C33, + SHA256C34, SHA256C35, SHA256C36, SHA256C37, + SHA256C38, SHA256C39, SHA256C3a, SHA256C3b, + SHA256C3c, SHA256C3d, SHA256C3e, SHA256C3f, +}; + +__device__ __constant__ bf_t c_bfs[1024]; + +__device__ static void sha256_transform (const u32x w0[4], const u32x w1[4], const u32x w2[4], const u32x w3[4], u32x digest[8]) +{ + u32x a = digest[0]; + u32x b = digest[1]; + u32x c = digest[2]; + u32x d = digest[3]; + u32x e = digest[4]; + u32x f = digest[5]; + u32x g = digest[6]; + u32x h = digest[7]; + + u32x w0_t = w0[0]; + u32x w1_t = w0[1]; + u32x w2_t = w0[2]; + u32x w3_t = w0[3]; + u32x w4_t = w1[0]; + u32x w5_t = w1[1]; + u32x w6_t = w1[2]; + u32x w7_t = w1[3]; + u32x w8_t = w2[0]; + u32x w9_t = w2[1]; + u32x wa_t = w2[2]; + u32x wb_t = w2[3]; + u32x wc_t = w3[0]; + u32x wd_t = w3[1]; + u32x we_t = w3[2]; + u32x wf_t = w3[3]; + + #define ROUND_EXPAND() \ + { \ + w0_t = SHA256_EXPAND (we_t, w9_t, w1_t, w0_t); \ + w1_t = SHA256_EXPAND (wf_t, wa_t, w2_t, w1_t); \ + w2_t = SHA256_EXPAND (w0_t, wb_t, w3_t, w2_t); \ + w3_t = SHA256_EXPAND (w1_t, wc_t, w4_t, w3_t); \ + w4_t = SHA256_EXPAND (w2_t, wd_t, w5_t, w4_t); \ + w5_t = SHA256_EXPAND (w3_t, we_t, w6_t, w5_t); \ + w6_t = SHA256_EXPAND (w4_t, wf_t, w7_t, w6_t); \ + w7_t = SHA256_EXPAND (w5_t, w0_t, w8_t, w7_t); \ + w8_t = SHA256_EXPAND (w6_t, w1_t, w9_t, w8_t); \ + w9_t = SHA256_EXPAND (w7_t, w2_t, wa_t, w9_t); \ + wa_t = SHA256_EXPAND (w8_t, w3_t, wb_t, wa_t); \ + wb_t = SHA256_EXPAND (w9_t, w4_t, wc_t, wb_t); \ + wc_t = SHA256_EXPAND (wa_t, w5_t, wd_t, wc_t); \ + wd_t = SHA256_EXPAND (wb_t, w6_t, we_t, wd_t); \ + we_t = SHA256_EXPAND (wc_t, w7_t, wf_t, we_t); \ + wf_t = SHA256_EXPAND (wd_t, w8_t, w0_t, wf_t); \ + } + + #define ROUND_STEP(i) \ + { \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, k_sha256[i + 0]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, k_sha256[i + 1]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, k_sha256[i + 2]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, k_sha256[i + 3]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, k_sha256[i + 4]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, k_sha256[i + 5]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, k_sha256[i + 6]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, k_sha256[i + 7]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, k_sha256[i + 8]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, k_sha256[i + 9]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, k_sha256[i + 10]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, k_sha256[i + 11]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, k_sha256[i + 12]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, k_sha256[i + 13]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, k_sha256[i + 14]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, k_sha256[i + 15]); \ + } + + ROUND_STEP (0); + + for (int i = 16; i < 64; i += 16) + { + ROUND_EXPAND (); ROUND_STEP (i); + } + + digest[0] += a; + digest[1] += b; + digest[2] += c; + digest[3] += d; + digest[4] += e; + digest[5] += f; + digest[6] += g; + digest[7] += h; +} + +__device__ static void hmac_sha256_pad (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], u32x ipad[8], u32x opad[8]) +{ + w0[0] = w0[0] ^ 0x36363636; + w0[1] = w0[1] ^ 0x36363636; + w0[2] = w0[2] ^ 0x36363636; + w0[3] = w0[3] ^ 0x36363636; + w1[0] = w1[0] ^ 0x36363636; + w1[1] = w1[1] ^ 0x36363636; + w1[2] = w1[2] ^ 0x36363636; + w1[3] = w1[3] ^ 0x36363636; + w2[0] = w2[0] ^ 0x36363636; + w2[1] = w2[1] ^ 0x36363636; + w2[2] = w2[2] ^ 0x36363636; + w2[3] = w2[3] ^ 0x36363636; + w3[0] = w3[0] ^ 0x36363636; + w3[1] = w3[1] ^ 0x36363636; + w3[2] = w3[2] ^ 0x36363636; + w3[3] = w3[3] ^ 0x36363636; + + ipad[0] = SHA256M_A; + ipad[1] = SHA256M_B; + ipad[2] = SHA256M_C; + ipad[3] = SHA256M_D; + ipad[4] = SHA256M_E; + ipad[5] = SHA256M_F; + ipad[6] = SHA256M_G; + ipad[7] = SHA256M_H; + + sha256_transform (w0, w1, w2, w3, ipad); + + w0[0] = w0[0] ^ 0x6a6a6a6a; + w0[1] = w0[1] ^ 0x6a6a6a6a; + w0[2] = w0[2] ^ 0x6a6a6a6a; + w0[3] = w0[3] ^ 0x6a6a6a6a; + w1[0] = w1[0] ^ 0x6a6a6a6a; + w1[1] = w1[1] ^ 0x6a6a6a6a; + w1[2] = w1[2] ^ 0x6a6a6a6a; + w1[3] = w1[3] ^ 0x6a6a6a6a; + w2[0] = w2[0] ^ 0x6a6a6a6a; + w2[1] = w2[1] ^ 0x6a6a6a6a; + w2[2] = w2[2] ^ 0x6a6a6a6a; + w2[3] = w2[3] ^ 0x6a6a6a6a; + w3[0] = w3[0] ^ 0x6a6a6a6a; + w3[1] = w3[1] ^ 0x6a6a6a6a; + w3[2] = w3[2] ^ 0x6a6a6a6a; + w3[3] = w3[3] ^ 0x6a6a6a6a; + + opad[0] = SHA256M_A; + opad[1] = SHA256M_B; + opad[2] = SHA256M_C; + opad[3] = SHA256M_D; + opad[4] = SHA256M_E; + opad[5] = SHA256M_F; + opad[6] = SHA256M_G; + opad[7] = SHA256M_H; + + sha256_transform (w0, w1, w2, w3, opad); +} + +__device__ static void hmac_sha256_run (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], u32x ipad[8], u32x opad[8], u32x digest[8]) +{ + digest[0] = ipad[0]; + digest[1] = ipad[1]; + digest[2] = ipad[2]; + digest[3] = ipad[3]; + digest[4] = ipad[4]; + digest[5] = ipad[5]; + digest[6] = ipad[6]; + digest[7] = ipad[7]; + + sha256_transform (w0, w1, w2, w3, digest); + + w0[0] = digest[0]; + w0[1] = digest[1]; + w0[2] = digest[2]; + w0[3] = digest[3]; + w1[0] = digest[4]; + w1[1] = digest[5]; + w1[2] = digest[6]; + w1[3] = digest[7]; + w2[0] = 0x80000000; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = (64 + 32) * 8; + + digest[0] = opad[0]; + digest[1] = opad[1]; + digest[2] = opad[2]; + digest[3] = opad[3]; + digest[4] = opad[4]; + digest[5] = opad[5]; + digest[6] = opad[6]; + digest[7] = opad[7]; + + sha256_transform (w0, w1, w2, w3, digest); +} + +__device__ static void m01460m (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], const u32 pw_len, const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset) +{ + /** + * modifier + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + const u32 lid = threadIdx.x; + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[ 1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[ 2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[ 3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[ 4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[ 5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[ 6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[ 7]; + + /** + * pads + */ + + u32x w0_t[4]; + + w0_t[0] = swap_workaround (salt_buf0[0]); + w0_t[1] = swap_workaround (salt_buf0[1]); + w0_t[2] = swap_workaround (salt_buf0[2]); + w0_t[3] = swap_workaround (salt_buf0[3]); + + u32x w1_t[4]; + + w1_t[0] = swap_workaround (salt_buf1[0]); + w1_t[1] = swap_workaround (salt_buf1[1]); + w1_t[2] = swap_workaround (salt_buf1[2]); + w1_t[3] = swap_workaround (salt_buf1[3]); + + u32x w2_t[4]; + + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + + u32x w3_t[4]; + + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = 0; + + u32x ipad[8]; + u32x opad[8]; + + hmac_sha256_pad (w0_t, w1_t, w2_t, w3_t, ipad, opad); + + /** + * loop + */ + + u32x w0l = w0[0]; + + for (u32 il_pos = 0; il_pos < bfs_cnt; il_pos++) + { + const u32 w0r = c_bfs[il_pos].i; + + w0[0] = w0l | w0r; + + w0_t[0] = w0[0]; + w0_t[1] = w0[1]; + w0_t[2] = w0[2]; + w0_t[3] = w0[3]; + w1_t[0] = w1[0]; + w1_t[1] = w1[1]; + w1_t[2] = w1[2]; + w1_t[3] = w1[3]; + w2_t[0] = w2[0]; + w2_t[1] = w2[1]; + w2_t[2] = w2[2]; + w2_t[3] = w2[3]; + w3_t[0] = w3[0]; + w3_t[1] = w3[1]; + w3_t[2] = 0; + w3_t[3] = (64 + pw_len) * 8; + + u32x digest[8]; + + hmac_sha256_run (w0_t, w1_t, w2_t, w3_t, ipad, opad, digest); + + const u32x r0 = digest[3]; + const u32x r1 = digest[7]; + const u32x r2 = digest[2]; + const u32x r3 = digest[6]; + + #include VECT_COMPARE_M + } +} + +__device__ static void m01460s (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], const u32 pw_len, const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset) +{ + /** + * modifier + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + const u32 lid = threadIdx.x; + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[ 1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[ 2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[ 3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[ 4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[ 5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[ 6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[ 7]; + + /** + * pads + */ + + u32x w0_t[4]; + + w0_t[0] = swap_workaround (salt_buf0[0]); + w0_t[1] = swap_workaround (salt_buf0[1]); + w0_t[2] = swap_workaround (salt_buf0[2]); + w0_t[3] = swap_workaround (salt_buf0[3]); + + u32x w1_t[4]; + + w1_t[0] = swap_workaround (salt_buf1[0]); + w1_t[1] = swap_workaround (salt_buf1[1]); + w1_t[2] = swap_workaround (salt_buf1[2]); + w1_t[3] = swap_workaround (salt_buf1[3]); + + u32x w2_t[4]; + + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + + u32x w3_t[4]; + + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = 0; + + u32x ipad[8]; + u32x opad[8]; + + hmac_sha256_pad (w0_t, w1_t, w2_t, w3_t, ipad, opad); + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * loop + */ + + u32x w0l = w0[0]; + + for (u32 il_pos = 0; il_pos < bfs_cnt; il_pos++) + { + const u32 w0r = c_bfs[il_pos].i; + + w0[0] = w0l | w0r; + + w0_t[0] = w0[0]; + w0_t[1] = w0[1]; + w0_t[2] = w0[2]; + w0_t[3] = w0[3]; + w1_t[0] = w1[0]; + w1_t[1] = w1[1]; + w1_t[2] = w1[2]; + w1_t[3] = w1[3]; + w2_t[0] = w2[0]; + w2_t[1] = w2[1]; + w2_t[2] = w2[2]; + w2_t[3] = w2[3]; + w3_t[0] = w3[0]; + w3_t[1] = w3[1]; + w3_t[2] = 0; + w3_t[3] = (64 + pw_len) * 8; + + u32x digest[8]; + + hmac_sha256_run (w0_t, w1_t, w2_t, w3_t, ipad, opad, digest); + + const u32x r0 = digest[3]; + const u32x r1 = digest[7]; + const u32x r2 = digest[2]; + const u32x r3 = digest[6]; + + #include VECT_COMPARE_S + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m01460_m04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m01460m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m01460_m08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m01460m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m01460_m16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = pws[gid].i[ 8]; + w2[1] = pws[gid].i[ 9]; + w2[2] = pws[gid].i[10]; + w2[3] = pws[gid].i[11]; + + u32x w3[4]; + + w3[0] = pws[gid].i[12]; + w3[1] = pws[gid].i[13]; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m01460m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m01460_s04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m01460s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m01460_s08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m01460s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m01460_s16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = pws[gid].i[ 8]; + w2[1] = pws[gid].i[ 9]; + w2[2] = pws[gid].i[10]; + w2[3] = pws[gid].i[11]; + + u32x w3[4]; + + w3[0] = pws[gid].i[12]; + w3[1] = pws[gid].i[13]; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m01460s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} diff --git a/nv/m01500_a0.cu b/nv/m01500_a0.cu new file mode 100644 index 0000000000..2b230e79f7 --- /dev/null +++ b/nv/m01500_a0.cu @@ -0,0 +1,766 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _DES_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW2 +#define VECT_SIZE1 +#endif + +#define DGST_R0 0 +#define DGST_R1 1 +#define DGST_R2 2 +#define DGST_R3 3 + +#include "include/kernel_functions.c" +#include "types_nv.c" +#include "common_nv.c" +#include "include/rp_gpu.h" +#include "rp_nv.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +__device__ __constant__ gpu_rule_t c_rules[1024]; + +#define PERM_OP(a,b,tt,n,m) \ +{ \ + tt = a >> n; \ + tt = tt ^ b; \ + tt = tt & m; \ + b = b ^ tt; \ + tt = tt << n; \ + a = a ^ tt; \ +} + +#define HPERM_OP(a,tt,n,m) \ +{ \ + tt = a << (16 + n); \ + tt = tt ^ a; \ + tt = tt & m; \ + a = a ^ tt; \ + tt = tt >> (16 + n); \ + a = a ^ tt; \ +} + +__device__ __constant__ u32 c_SPtrans[8][64] = +{ + /* nibble 0 */ + 0x00820200, 0x00020000, 0x80800000, 0x80820200, + 0x00800000, 0x80020200, 0x80020000, 0x80800000, + 0x80020200, 0x00820200, 0x00820000, 0x80000200, + 0x80800200, 0x00800000, 0x00000000, 0x80020000, + 0x00020000, 0x80000000, 0x00800200, 0x00020200, + 0x80820200, 0x00820000, 0x80000200, 0x00800200, + 0x80000000, 0x00000200, 0x00020200, 0x80820000, + 0x00000200, 0x80800200, 0x80820000, 0x00000000, + 0x00000000, 0x80820200, 0x00800200, 0x80020000, + 0x00820200, 0x00020000, 0x80000200, 0x00800200, + 0x80820000, 0x00000200, 0x00020200, 0x80800000, + 0x80020200, 0x80000000, 0x80800000, 0x00820000, + 0x80820200, 0x00020200, 0x00820000, 0x80800200, + 0x00800000, 0x80000200, 0x80020000, 0x00000000, + 0x00020000, 0x00800000, 0x80800200, 0x00820200, + 0x80000000, 0x80820000, 0x00000200, 0x80020200, + /* nibble 1 */ + 0x10042004, 0x00000000, 0x00042000, 0x10040000, + 0x10000004, 0x00002004, 0x10002000, 0x00042000, + 0x00002000, 0x10040004, 0x00000004, 0x10002000, + 0x00040004, 0x10042000, 0x10040000, 0x00000004, + 0x00040000, 0x10002004, 0x10040004, 0x00002000, + 0x00042004, 0x10000000, 0x00000000, 0x00040004, + 0x10002004, 0x00042004, 0x10042000, 0x10000004, + 0x10000000, 0x00040000, 0x00002004, 0x10042004, + 0x00040004, 0x10042000, 0x10002000, 0x00042004, + 0x10042004, 0x00040004, 0x10000004, 0x00000000, + 0x10000000, 0x00002004, 0x00040000, 0x10040004, + 0x00002000, 0x10000000, 0x00042004, 0x10002004, + 0x10042000, 0x00002000, 0x00000000, 0x10000004, + 0x00000004, 0x10042004, 0x00042000, 0x10040000, + 0x10040004, 0x00040000, 0x00002004, 0x10002000, + 0x10002004, 0x00000004, 0x10040000, 0x00042000, + /* nibble 2 */ + 0x41000000, 0x01010040, 0x00000040, 0x41000040, + 0x40010000, 0x01000000, 0x41000040, 0x00010040, + 0x01000040, 0x00010000, 0x01010000, 0x40000000, + 0x41010040, 0x40000040, 0x40000000, 0x41010000, + 0x00000000, 0x40010000, 0x01010040, 0x00000040, + 0x40000040, 0x41010040, 0x00010000, 0x41000000, + 0x41010000, 0x01000040, 0x40010040, 0x01010000, + 0x00010040, 0x00000000, 0x01000000, 0x40010040, + 0x01010040, 0x00000040, 0x40000000, 0x00010000, + 0x40000040, 0x40010000, 0x01010000, 0x41000040, + 0x00000000, 0x01010040, 0x00010040, 0x41010000, + 0x40010000, 0x01000000, 0x41010040, 0x40000000, + 0x40010040, 0x41000000, 0x01000000, 0x41010040, + 0x00010000, 0x01000040, 0x41000040, 0x00010040, + 0x01000040, 0x00000000, 0x41010000, 0x40000040, + 0x41000000, 0x40010040, 0x00000040, 0x01010000, + /* nibble 3 */ + 0x00100402, 0x04000400, 0x00000002, 0x04100402, + 0x00000000, 0x04100000, 0x04000402, 0x00100002, + 0x04100400, 0x04000002, 0x04000000, 0x00000402, + 0x04000002, 0x00100402, 0x00100000, 0x04000000, + 0x04100002, 0x00100400, 0x00000400, 0x00000002, + 0x00100400, 0x04000402, 0x04100000, 0x00000400, + 0x00000402, 0x00000000, 0x00100002, 0x04100400, + 0x04000400, 0x04100002, 0x04100402, 0x00100000, + 0x04100002, 0x00000402, 0x00100000, 0x04000002, + 0x00100400, 0x04000400, 0x00000002, 0x04100000, + 0x04000402, 0x00000000, 0x00000400, 0x00100002, + 0x00000000, 0x04100002, 0x04100400, 0x00000400, + 0x04000000, 0x04100402, 0x00100402, 0x00100000, + 0x04100402, 0x00000002, 0x04000400, 0x00100402, + 0x00100002, 0x00100400, 0x04100000, 0x04000402, + 0x00000402, 0x04000000, 0x04000002, 0x04100400, + /* nibble 4 */ + 0x02000000, 0x00004000, 0x00000100, 0x02004108, + 0x02004008, 0x02000100, 0x00004108, 0x02004000, + 0x00004000, 0x00000008, 0x02000008, 0x00004100, + 0x02000108, 0x02004008, 0x02004100, 0x00000000, + 0x00004100, 0x02000000, 0x00004008, 0x00000108, + 0x02000100, 0x00004108, 0x00000000, 0x02000008, + 0x00000008, 0x02000108, 0x02004108, 0x00004008, + 0x02004000, 0x00000100, 0x00000108, 0x02004100, + 0x02004100, 0x02000108, 0x00004008, 0x02004000, + 0x00004000, 0x00000008, 0x02000008, 0x02000100, + 0x02000000, 0x00004100, 0x02004108, 0x00000000, + 0x00004108, 0x02000000, 0x00000100, 0x00004008, + 0x02000108, 0x00000100, 0x00000000, 0x02004108, + 0x02004008, 0x02004100, 0x00000108, 0x00004000, + 0x00004100, 0x02004008, 0x02000100, 0x00000108, + 0x00000008, 0x00004108, 0x02004000, 0x02000008, + /* nibble 5 */ + 0x20000010, 0x00080010, 0x00000000, 0x20080800, + 0x00080010, 0x00000800, 0x20000810, 0x00080000, + 0x00000810, 0x20080810, 0x00080800, 0x20000000, + 0x20000800, 0x20000010, 0x20080000, 0x00080810, + 0x00080000, 0x20000810, 0x20080010, 0x00000000, + 0x00000800, 0x00000010, 0x20080800, 0x20080010, + 0x20080810, 0x20080000, 0x20000000, 0x00000810, + 0x00000010, 0x00080800, 0x00080810, 0x20000800, + 0x00000810, 0x20000000, 0x20000800, 0x00080810, + 0x20080800, 0x00080010, 0x00000000, 0x20000800, + 0x20000000, 0x00000800, 0x20080010, 0x00080000, + 0x00080010, 0x20080810, 0x00080800, 0x00000010, + 0x20080810, 0x00080800, 0x00080000, 0x20000810, + 0x20000010, 0x20080000, 0x00080810, 0x00000000, + 0x00000800, 0x20000010, 0x20000810, 0x20080800, + 0x20080000, 0x00000810, 0x00000010, 0x20080010, + /* nibble 6 */ + 0x00001000, 0x00000080, 0x00400080, 0x00400001, + 0x00401081, 0x00001001, 0x00001080, 0x00000000, + 0x00400000, 0x00400081, 0x00000081, 0x00401000, + 0x00000001, 0x00401080, 0x00401000, 0x00000081, + 0x00400081, 0x00001000, 0x00001001, 0x00401081, + 0x00000000, 0x00400080, 0x00400001, 0x00001080, + 0x00401001, 0x00001081, 0x00401080, 0x00000001, + 0x00001081, 0x00401001, 0x00000080, 0x00400000, + 0x00001081, 0x00401000, 0x00401001, 0x00000081, + 0x00001000, 0x00000080, 0x00400000, 0x00401001, + 0x00400081, 0x00001081, 0x00001080, 0x00000000, + 0x00000080, 0x00400001, 0x00000001, 0x00400080, + 0x00000000, 0x00400081, 0x00400080, 0x00001080, + 0x00000081, 0x00001000, 0x00401081, 0x00400000, + 0x00401080, 0x00000001, 0x00001001, 0x00401081, + 0x00400001, 0x00401080, 0x00401000, 0x00001001, + /* nibble 7 */ + 0x08200020, 0x08208000, 0x00008020, 0x00000000, + 0x08008000, 0x00200020, 0x08200000, 0x08208020, + 0x00000020, 0x08000000, 0x00208000, 0x00008020, + 0x00208020, 0x08008020, 0x08000020, 0x08200000, + 0x00008000, 0x00208020, 0x00200020, 0x08008000, + 0x08208020, 0x08000020, 0x00000000, 0x00208000, + 0x08000000, 0x00200000, 0x08008020, 0x08200020, + 0x00200000, 0x00008000, 0x08208000, 0x00000020, + 0x00200000, 0x00008000, 0x08000020, 0x08208020, + 0x00008020, 0x08000000, 0x00000000, 0x00208000, + 0x08200020, 0x08008020, 0x08008000, 0x00200020, + 0x08208000, 0x00000020, 0x00200020, 0x08008000, + 0x08208020, 0x00200000, 0x08200000, 0x08000020, + 0x00208000, 0x00008020, 0x08008020, 0x08200000, + 0x00000020, 0x08208000, 0x00208020, 0x00000000, + 0x08000000, 0x08200020, 0x00008000, 0x00208020 +}; + +__device__ __constant__ u32 c_skb[8][64] = +{ + /* for C bits (numbered as per FIPS 46) 1 2 3 4 5 6 */ + 0x00000000, 0x00000010, 0x20000000, 0x20000010, + 0x00010000, 0x00010010, 0x20010000, 0x20010010, + 0x00000800, 0x00000810, 0x20000800, 0x20000810, + 0x00010800, 0x00010810, 0x20010800, 0x20010810, + 0x00000020, 0x00000030, 0x20000020, 0x20000030, + 0x00010020, 0x00010030, 0x20010020, 0x20010030, + 0x00000820, 0x00000830, 0x20000820, 0x20000830, + 0x00010820, 0x00010830, 0x20010820, 0x20010830, + 0x00080000, 0x00080010, 0x20080000, 0x20080010, + 0x00090000, 0x00090010, 0x20090000, 0x20090010, + 0x00080800, 0x00080810, 0x20080800, 0x20080810, + 0x00090800, 0x00090810, 0x20090800, 0x20090810, + 0x00080020, 0x00080030, 0x20080020, 0x20080030, + 0x00090020, 0x00090030, 0x20090020, 0x20090030, + 0x00080820, 0x00080830, 0x20080820, 0x20080830, + 0x00090820, 0x00090830, 0x20090820, 0x20090830, + /* for C bits (numbered as per FIPS 46) 7 8 10 11 12 13 */ + 0x00000000, 0x02000000, 0x00002000, 0x02002000, + 0x00200000, 0x02200000, 0x00202000, 0x02202000, + 0x00000004, 0x02000004, 0x00002004, 0x02002004, + 0x00200004, 0x02200004, 0x00202004, 0x02202004, + 0x00000400, 0x02000400, 0x00002400, 0x02002400, + 0x00200400, 0x02200400, 0x00202400, 0x02202400, + 0x00000404, 0x02000404, 0x00002404, 0x02002404, + 0x00200404, 0x02200404, 0x00202404, 0x02202404, + 0x10000000, 0x12000000, 0x10002000, 0x12002000, + 0x10200000, 0x12200000, 0x10202000, 0x12202000, + 0x10000004, 0x12000004, 0x10002004, 0x12002004, + 0x10200004, 0x12200004, 0x10202004, 0x12202004, + 0x10000400, 0x12000400, 0x10002400, 0x12002400, + 0x10200400, 0x12200400, 0x10202400, 0x12202400, + 0x10000404, 0x12000404, 0x10002404, 0x12002404, + 0x10200404, 0x12200404, 0x10202404, 0x12202404, + /* for C bits (numbered as per FIPS 46) 14 15 16 17 19 20 */ + 0x00000000, 0x00000001, 0x00040000, 0x00040001, + 0x01000000, 0x01000001, 0x01040000, 0x01040001, + 0x00000002, 0x00000003, 0x00040002, 0x00040003, + 0x01000002, 0x01000003, 0x01040002, 0x01040003, + 0x00000200, 0x00000201, 0x00040200, 0x00040201, + 0x01000200, 0x01000201, 0x01040200, 0x01040201, + 0x00000202, 0x00000203, 0x00040202, 0x00040203, + 0x01000202, 0x01000203, 0x01040202, 0x01040203, + 0x08000000, 0x08000001, 0x08040000, 0x08040001, + 0x09000000, 0x09000001, 0x09040000, 0x09040001, + 0x08000002, 0x08000003, 0x08040002, 0x08040003, + 0x09000002, 0x09000003, 0x09040002, 0x09040003, + 0x08000200, 0x08000201, 0x08040200, 0x08040201, + 0x09000200, 0x09000201, 0x09040200, 0x09040201, + 0x08000202, 0x08000203, 0x08040202, 0x08040203, + 0x09000202, 0x09000203, 0x09040202, 0x09040203, + /* for C bits (numbered as per FIPS 46) 21 23 24 26 27 28 */ + 0x00000000, 0x00100000, 0x00000100, 0x00100100, + 0x00000008, 0x00100008, 0x00000108, 0x00100108, + 0x00001000, 0x00101000, 0x00001100, 0x00101100, + 0x00001008, 0x00101008, 0x00001108, 0x00101108, + 0x04000000, 0x04100000, 0x04000100, 0x04100100, + 0x04000008, 0x04100008, 0x04000108, 0x04100108, + 0x04001000, 0x04101000, 0x04001100, 0x04101100, + 0x04001008, 0x04101008, 0x04001108, 0x04101108, + 0x00020000, 0x00120000, 0x00020100, 0x00120100, + 0x00020008, 0x00120008, 0x00020108, 0x00120108, + 0x00021000, 0x00121000, 0x00021100, 0x00121100, + 0x00021008, 0x00121008, 0x00021108, 0x00121108, + 0x04020000, 0x04120000, 0x04020100, 0x04120100, + 0x04020008, 0x04120008, 0x04020108, 0x04120108, + 0x04021000, 0x04121000, 0x04021100, 0x04121100, + 0x04021008, 0x04121008, 0x04021108, 0x04121108, + /* for D bits (numbered as per FIPS 46) 1 2 3 4 5 6 */ + 0x00000000, 0x10000000, 0x00010000, 0x10010000, + 0x00000004, 0x10000004, 0x00010004, 0x10010004, + 0x20000000, 0x30000000, 0x20010000, 0x30010000, + 0x20000004, 0x30000004, 0x20010004, 0x30010004, + 0x00100000, 0x10100000, 0x00110000, 0x10110000, + 0x00100004, 0x10100004, 0x00110004, 0x10110004, + 0x20100000, 0x30100000, 0x20110000, 0x30110000, + 0x20100004, 0x30100004, 0x20110004, 0x30110004, + 0x00001000, 0x10001000, 0x00011000, 0x10011000, + 0x00001004, 0x10001004, 0x00011004, 0x10011004, + 0x20001000, 0x30001000, 0x20011000, 0x30011000, + 0x20001004, 0x30001004, 0x20011004, 0x30011004, + 0x00101000, 0x10101000, 0x00111000, 0x10111000, + 0x00101004, 0x10101004, 0x00111004, 0x10111004, + 0x20101000, 0x30101000, 0x20111000, 0x30111000, + 0x20101004, 0x30101004, 0x20111004, 0x30111004, + /* for D bits (numbered as per FIPS 46) 8 9 11 12 13 14 */ + 0x00000000, 0x08000000, 0x00000008, 0x08000008, + 0x00000400, 0x08000400, 0x00000408, 0x08000408, + 0x00020000, 0x08020000, 0x00020008, 0x08020008, + 0x00020400, 0x08020400, 0x00020408, 0x08020408, + 0x00000001, 0x08000001, 0x00000009, 0x08000009, + 0x00000401, 0x08000401, 0x00000409, 0x08000409, + 0x00020001, 0x08020001, 0x00020009, 0x08020009, + 0x00020401, 0x08020401, 0x00020409, 0x08020409, + 0x02000000, 0x0A000000, 0x02000008, 0x0A000008, + 0x02000400, 0x0A000400, 0x02000408, 0x0A000408, + 0x02020000, 0x0A020000, 0x02020008, 0x0A020008, + 0x02020400, 0x0A020400, 0x02020408, 0x0A020408, + 0x02000001, 0x0A000001, 0x02000009, 0x0A000009, + 0x02000401, 0x0A000401, 0x02000409, 0x0A000409, + 0x02020001, 0x0A020001, 0x02020009, 0x0A020009, + 0x02020401, 0x0A020401, 0x02020409, 0x0A020409, + /* for D bits (numbered as per FIPS 46) 16 17 18 19 20 21 */ + 0x00000000, 0x00000100, 0x00080000, 0x00080100, + 0x01000000, 0x01000100, 0x01080000, 0x01080100, + 0x00000010, 0x00000110, 0x00080010, 0x00080110, + 0x01000010, 0x01000110, 0x01080010, 0x01080110, + 0x00200000, 0x00200100, 0x00280000, 0x00280100, + 0x01200000, 0x01200100, 0x01280000, 0x01280100, + 0x00200010, 0x00200110, 0x00280010, 0x00280110, + 0x01200010, 0x01200110, 0x01280010, 0x01280110, + 0x00000200, 0x00000300, 0x00080200, 0x00080300, + 0x01000200, 0x01000300, 0x01080200, 0x01080300, + 0x00000210, 0x00000310, 0x00080210, 0x00080310, + 0x01000210, 0x01000310, 0x01080210, 0x01080310, + 0x00200200, 0x00200300, 0x00280200, 0x00280300, + 0x01200200, 0x01200300, 0x01280200, 0x01280300, + 0x00200210, 0x00200310, 0x00280210, 0x00280310, + 0x01200210, 0x01200310, 0x01280210, 0x01280310, + /* for D bits (numbered as per FIPS 46) 22 23 24 25 27 28 */ + 0x00000000, 0x04000000, 0x00040000, 0x04040000, + 0x00000002, 0x04000002, 0x00040002, 0x04040002, + 0x00002000, 0x04002000, 0x00042000, 0x04042000, + 0x00002002, 0x04002002, 0x00042002, 0x04042002, + 0x00000020, 0x04000020, 0x00040020, 0x04040020, + 0x00000022, 0x04000022, 0x00040022, 0x04040022, + 0x00002020, 0x04002020, 0x00042020, 0x04042020, + 0x00002022, 0x04002022, 0x00042022, 0x04042022, + 0x00000800, 0x04000800, 0x00040800, 0x04040800, + 0x00000802, 0x04000802, 0x00040802, 0x04040802, + 0x00002800, 0x04002800, 0x00042800, 0x04042800, + 0x00002802, 0x04002802, 0x00042802, 0x04042802, + 0x00000820, 0x04000820, 0x00040820, 0x04040820, + 0x00000822, 0x04000822, 0x00040822, 0x04040822, + 0x00002820, 0x04002820, 0x00042820, 0x04042820, + 0x00002822, 0x04002822, 0x00042822, 0x04042822 +}; + +#ifdef VECT_SIZE1 +#define BOX(i,n,S) u32x ((S)[(n)][(i)]) +#endif + +#ifdef VECT_SIZE2 +#define BOX(i,n,S) u32x ((S)[(n)][(i).x], (S)[(n)][(i).y]) +#endif + +__device__ static void _des_crypt_keysetup (u32x c, u32x d, u32x Kc[16], u32x Kd[16], u32 s_skb[8][64]) +{ + u32x tt; + + PERM_OP (d, c, tt, 4, 0x0f0f0f0f); + HPERM_OP (c, tt, 2, 0xcccc0000); + HPERM_OP (d, tt, 2, 0xcccc0000); + PERM_OP (d, c, tt, 1, 0x55555555); + PERM_OP (c, d, tt, 8, 0x00ff00ff); + PERM_OP (d, c, tt, 1, 0x55555555); + + d = ((d & 0x000000ff) << 16) + | ((d & 0x0000ff00) << 0) + | ((d & 0x00ff0000) >> 16) + | ((c & 0xf0000000) >> 4); + + c = c & 0x0fffffff; + + #pragma unroll + for (u32 i = 0; i < 16; i++) + { + if ((i < 2) || (i == 8) || (i == 15)) + { + c = ((c >> 1) | (c << 27)); + d = ((d >> 1) | (d << 27)); + } + else + { + c = ((c >> 2) | (c << 26)); + d = ((d >> 2) | (d << 26)); + } + + c = c & 0x0fffffff; + d = d & 0x0fffffff; + + const u32x c00 = (c >> 0) & 0x0000003f; + const u32x c06 = (c >> 6) & 0x00383003; + const u32x c07 = (c >> 7) & 0x0000003c; + const u32x c13 = (c >> 13) & 0x0000060f; + const u32x c20 = (c >> 20) & 0x00000001; + + u32x s = BOX (((c00 >> 0) & 0xff), 0, s_skb) + | BOX (((c06 >> 0) & 0xff) + |((c07 >> 0) & 0xff), 1, s_skb) + | BOX (((c13 >> 0) & 0xff) + |((c06 >> 8) & 0xff), 2, s_skb) + | BOX (((c20 >> 0) & 0xff) + |((c13 >> 8) & 0xff) + |((c06 >> 16) & 0xff), 3, s_skb); + + const u32x d00 = (d >> 0) & 0x00003c3f; + const u32x d07 = (d >> 7) & 0x00003f03; + const u32x d21 = (d >> 21) & 0x0000000f; + const u32x d22 = (d >> 22) & 0x00000030; + + u32x t = BOX (((d00 >> 0) & 0xff), 4, s_skb) + | BOX (((d07 >> 0) & 0xff) + |((d00 >> 8) & 0xff), 5, s_skb) + | BOX (((d07 >> 8) & 0xff), 6, s_skb) + | BOX (((d21 >> 0) & 0xff) + |((d22 >> 0) & 0xff), 7, s_skb); + + #if __CUDA_ARCH__ >= 200 + Kc[i] = __byte_perm (s, t, 0x5410); + Kd[i] = __byte_perm (s, t, 0x7632); + #else + Kc[i] = ((t << 16) | (s & 0x0000ffff)); + Kd[i] = ((s >> 16) | (t & 0xffff0000)); + #endif + } +} + +__device__ static void _des_crypt_encrypt (u32x iv[2], u32 mask, u32x Kc[16], u32x Kd[16], u32 s_SPtrans[8][64]) +{ + const u32 E1 = (mask >> 2) & 0x3f0; + + const u32 E0 = mask & 0x3f; + + u32x r = 0; + u32x l = 0; + + for (u32 i = 0; i < 25; i++) + { + #pragma unroll + for (u32 j = 0; j < 16; j += 2) + { + u32x t; + u32x u; + + t = r ^ (r >> 16); + u = t & E0; + t = t & E1; + u = u ^ (u << 16); + u = u ^ r; + u = u ^ Kc[j + 0]; + t = t ^ (t << 16); + t = t ^ r; + t = rotl32 (t, 28u); + t = t ^ Kd[j + 0]; + + l ^= BOX (((u >> 0) & 0x3f), 0, s_SPtrans) + | BOX (((u >> 8) & 0x3f), 2, s_SPtrans) + | BOX (((u >> 16) & 0x3f), 4, s_SPtrans) + | BOX (((u >> 24) & 0x3f), 6, s_SPtrans) + | BOX (((t >> 0) & 0x3f), 1, s_SPtrans) + | BOX (((t >> 8) & 0x3f), 3, s_SPtrans) + | BOX (((t >> 16) & 0x3f), 5, s_SPtrans) + | BOX (((t >> 24) & 0x3f), 7, s_SPtrans); + + t = l ^ (l >> 16); + u = t & E0; + t = t & E1; + u = u ^ (u << 16); + u = u ^ l; + u = u ^ Kc[j + 1]; + t = t ^ (t << 16); + t = t ^ l; + t = rotl32 (t, 28u); + t = t ^ Kd[j + 1]; + + r ^= BOX (((u >> 0) & 0x3f), 0, s_SPtrans) + | BOX (((u >> 8) & 0x3f), 2, s_SPtrans) + | BOX (((u >> 16) & 0x3f), 4, s_SPtrans) + | BOX (((u >> 24) & 0x3f), 6, s_SPtrans) + | BOX (((t >> 0) & 0x3f), 1, s_SPtrans) + | BOX (((t >> 8) & 0x3f), 3, s_SPtrans) + | BOX (((t >> 16) & 0x3f), 5, s_SPtrans) + | BOX (((t >> 24) & 0x3f), 7, s_SPtrans); + } + + u32x tt; + + tt = l; + l = r; + r = tt; + } + + iv[0] = rotl32 (r, 31); + iv[1] = rotl32 (l, 31); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m01500_m04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = 0; + pw_buf0[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * sbox, kbox + */ + + __shared__ u32 s_skb[8][64]; + __shared__ u32 s_SPtrans[8][64]; + + if (lid < 64) + { + s_skb[0][lid] = c_skb[0][lid]; + s_skb[1][lid] = c_skb[1][lid]; + s_skb[2][lid] = c_skb[2][lid]; + s_skb[3][lid] = c_skb[3][lid]; + s_skb[4][lid] = c_skb[4][lid]; + s_skb[5][lid] = c_skb[5][lid]; + s_skb[6][lid] = c_skb[6][lid]; + s_skb[7][lid] = c_skb[7][lid]; + + s_SPtrans[0][lid] = c_SPtrans[0][lid]; + s_SPtrans[1][lid] = c_SPtrans[1][lid]; + s_SPtrans[2][lid] = c_SPtrans[2][lid]; + s_SPtrans[3][lid] = c_SPtrans[3][lid]; + s_SPtrans[4][lid] = c_SPtrans[4][lid]; + s_SPtrans[5][lid] = c_SPtrans[5][lid]; + s_SPtrans[6][lid] = c_SPtrans[6][lid]; + s_SPtrans[7][lid] = c_SPtrans[7][lid]; + } + + __syncthreads (); + + if (gid >= gid_max) return; + + /** + * salt + */ + + const u32 mask = salt_bufs[salt_pos].salt_buf[0]; + + /** + * main + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + + w0[0] = pw_buf0[0]; + w0[1] = pw_buf0[1]; + w0[2] = 0; + w0[3] = 0; + + u32x w1[4]; + + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + u32 out_len = apply_rules (c_rules[il_pos].cmds, w0, w1, pw_len); + + out_len = (out_len >= 8) ? 8 : out_len; + + u32x data[2]; + + data[0] = (w0[0] << 1) & 0xfefefefe; + data[1] = (w0[1] << 1) & 0xfefefefe; + + u32x Kc[16]; + u32x Kd[16]; + + _des_crypt_keysetup (data[0], data[1], Kc, Kd, s_skb); + + u32x iv[2]; + + _des_crypt_encrypt (iv, mask, Kc, Kd, s_SPtrans); + + const u32x r0 = iv[0]; + const u32x r1 = iv[1]; + const u32x r2 = 0; + const u32x r3 = 0; + + #include VECT_COMPARE_M + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m01500_m08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m01500_m16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m01500_s04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = 0; + pw_buf0[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * sbox, kbox + */ + + __shared__ u32 s_skb[8][64]; + __shared__ u32 s_SPtrans[8][64]; + + if (lid < 64) + { + s_skb[0][lid] = c_skb[0][lid]; + s_skb[1][lid] = c_skb[1][lid]; + s_skb[2][lid] = c_skb[2][lid]; + s_skb[3][lid] = c_skb[3][lid]; + s_skb[4][lid] = c_skb[4][lid]; + s_skb[5][lid] = c_skb[5][lid]; + s_skb[6][lid] = c_skb[6][lid]; + s_skb[7][lid] = c_skb[7][lid]; + + s_SPtrans[0][lid] = c_SPtrans[0][lid]; + s_SPtrans[1][lid] = c_SPtrans[1][lid]; + s_SPtrans[2][lid] = c_SPtrans[2][lid]; + s_SPtrans[3][lid] = c_SPtrans[3][lid]; + s_SPtrans[4][lid] = c_SPtrans[4][lid]; + s_SPtrans[5][lid] = c_SPtrans[5][lid]; + s_SPtrans[6][lid] = c_SPtrans[6][lid]; + s_SPtrans[7][lid] = c_SPtrans[7][lid]; + } + + __syncthreads (); + + if (gid >= gid_max) return; + + /** + * salt + */ + + const u32 mask = salt_bufs[salt_pos].salt_buf[0]; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * main + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + + w0[0] = pw_buf0[0]; + w0[1] = pw_buf0[1]; + w0[2] = 0; + w0[3] = 0; + + u32x w1[4]; + + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + u32 out_len = apply_rules (c_rules[il_pos].cmds, w0, w1, pw_len); + + out_len = (out_len >= 8) ? 8 : out_len; + + u32x data[2]; + + data[0] = (w0[0] << 1) & 0xfefefefe; + data[1] = (w0[1] << 1) & 0xfefefefe; + + u32x Kc[16]; + u32x Kd[16]; + + _des_crypt_keysetup (data[0], data[1], Kc, Kd, s_skb); + + u32x iv[2]; + + _des_crypt_encrypt (iv, mask, Kc, Kd, s_SPtrans); + + const u32x r0 = iv[0]; + const u32x r1 = iv[1]; + const u32x r2 = 0; + const u32x r3 = 0; + + #include VECT_COMPARE_S + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m01500_s08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m01500_s16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/nv/m01500_a1.cu b/nv/m01500_a1.cu new file mode 100644 index 0000000000..530609920b --- /dev/null +++ b/nv/m01500_a1.cu @@ -0,0 +1,886 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _DES_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW2 +#define VECT_SIZE1 +#endif + +#define DGST_R0 0 +#define DGST_R1 1 +#define DGST_R2 2 +#define DGST_R3 3 + +#include "include/kernel_functions.c" +#include "types_nv.c" +#include "common_nv.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +__device__ __constant__ comb_t c_combs[1024]; + +#define PERM_OP(a,b,tt,n,m) \ +{ \ + tt = a >> n; \ + tt = tt ^ b; \ + tt = tt & m; \ + b = b ^ tt; \ + tt = tt << n; \ + a = a ^ tt; \ +} + +#define HPERM_OP(a,tt,n,m) \ +{ \ + tt = a << (16 + n); \ + tt = tt ^ a; \ + tt = tt & m; \ + a = a ^ tt; \ + tt = tt >> (16 + n); \ + a = a ^ tt; \ +} + +__device__ __constant__ u32 c_SPtrans[8][64] = +{ + /* nibble 0 */ + 0x00820200, 0x00020000, 0x80800000, 0x80820200, + 0x00800000, 0x80020200, 0x80020000, 0x80800000, + 0x80020200, 0x00820200, 0x00820000, 0x80000200, + 0x80800200, 0x00800000, 0x00000000, 0x80020000, + 0x00020000, 0x80000000, 0x00800200, 0x00020200, + 0x80820200, 0x00820000, 0x80000200, 0x00800200, + 0x80000000, 0x00000200, 0x00020200, 0x80820000, + 0x00000200, 0x80800200, 0x80820000, 0x00000000, + 0x00000000, 0x80820200, 0x00800200, 0x80020000, + 0x00820200, 0x00020000, 0x80000200, 0x00800200, + 0x80820000, 0x00000200, 0x00020200, 0x80800000, + 0x80020200, 0x80000000, 0x80800000, 0x00820000, + 0x80820200, 0x00020200, 0x00820000, 0x80800200, + 0x00800000, 0x80000200, 0x80020000, 0x00000000, + 0x00020000, 0x00800000, 0x80800200, 0x00820200, + 0x80000000, 0x80820000, 0x00000200, 0x80020200, + /* nibble 1 */ + 0x10042004, 0x00000000, 0x00042000, 0x10040000, + 0x10000004, 0x00002004, 0x10002000, 0x00042000, + 0x00002000, 0x10040004, 0x00000004, 0x10002000, + 0x00040004, 0x10042000, 0x10040000, 0x00000004, + 0x00040000, 0x10002004, 0x10040004, 0x00002000, + 0x00042004, 0x10000000, 0x00000000, 0x00040004, + 0x10002004, 0x00042004, 0x10042000, 0x10000004, + 0x10000000, 0x00040000, 0x00002004, 0x10042004, + 0x00040004, 0x10042000, 0x10002000, 0x00042004, + 0x10042004, 0x00040004, 0x10000004, 0x00000000, + 0x10000000, 0x00002004, 0x00040000, 0x10040004, + 0x00002000, 0x10000000, 0x00042004, 0x10002004, + 0x10042000, 0x00002000, 0x00000000, 0x10000004, + 0x00000004, 0x10042004, 0x00042000, 0x10040000, + 0x10040004, 0x00040000, 0x00002004, 0x10002000, + 0x10002004, 0x00000004, 0x10040000, 0x00042000, + /* nibble 2 */ + 0x41000000, 0x01010040, 0x00000040, 0x41000040, + 0x40010000, 0x01000000, 0x41000040, 0x00010040, + 0x01000040, 0x00010000, 0x01010000, 0x40000000, + 0x41010040, 0x40000040, 0x40000000, 0x41010000, + 0x00000000, 0x40010000, 0x01010040, 0x00000040, + 0x40000040, 0x41010040, 0x00010000, 0x41000000, + 0x41010000, 0x01000040, 0x40010040, 0x01010000, + 0x00010040, 0x00000000, 0x01000000, 0x40010040, + 0x01010040, 0x00000040, 0x40000000, 0x00010000, + 0x40000040, 0x40010000, 0x01010000, 0x41000040, + 0x00000000, 0x01010040, 0x00010040, 0x41010000, + 0x40010000, 0x01000000, 0x41010040, 0x40000000, + 0x40010040, 0x41000000, 0x01000000, 0x41010040, + 0x00010000, 0x01000040, 0x41000040, 0x00010040, + 0x01000040, 0x00000000, 0x41010000, 0x40000040, + 0x41000000, 0x40010040, 0x00000040, 0x01010000, + /* nibble 3 */ + 0x00100402, 0x04000400, 0x00000002, 0x04100402, + 0x00000000, 0x04100000, 0x04000402, 0x00100002, + 0x04100400, 0x04000002, 0x04000000, 0x00000402, + 0x04000002, 0x00100402, 0x00100000, 0x04000000, + 0x04100002, 0x00100400, 0x00000400, 0x00000002, + 0x00100400, 0x04000402, 0x04100000, 0x00000400, + 0x00000402, 0x00000000, 0x00100002, 0x04100400, + 0x04000400, 0x04100002, 0x04100402, 0x00100000, + 0x04100002, 0x00000402, 0x00100000, 0x04000002, + 0x00100400, 0x04000400, 0x00000002, 0x04100000, + 0x04000402, 0x00000000, 0x00000400, 0x00100002, + 0x00000000, 0x04100002, 0x04100400, 0x00000400, + 0x04000000, 0x04100402, 0x00100402, 0x00100000, + 0x04100402, 0x00000002, 0x04000400, 0x00100402, + 0x00100002, 0x00100400, 0x04100000, 0x04000402, + 0x00000402, 0x04000000, 0x04000002, 0x04100400, + /* nibble 4 */ + 0x02000000, 0x00004000, 0x00000100, 0x02004108, + 0x02004008, 0x02000100, 0x00004108, 0x02004000, + 0x00004000, 0x00000008, 0x02000008, 0x00004100, + 0x02000108, 0x02004008, 0x02004100, 0x00000000, + 0x00004100, 0x02000000, 0x00004008, 0x00000108, + 0x02000100, 0x00004108, 0x00000000, 0x02000008, + 0x00000008, 0x02000108, 0x02004108, 0x00004008, + 0x02004000, 0x00000100, 0x00000108, 0x02004100, + 0x02004100, 0x02000108, 0x00004008, 0x02004000, + 0x00004000, 0x00000008, 0x02000008, 0x02000100, + 0x02000000, 0x00004100, 0x02004108, 0x00000000, + 0x00004108, 0x02000000, 0x00000100, 0x00004008, + 0x02000108, 0x00000100, 0x00000000, 0x02004108, + 0x02004008, 0x02004100, 0x00000108, 0x00004000, + 0x00004100, 0x02004008, 0x02000100, 0x00000108, + 0x00000008, 0x00004108, 0x02004000, 0x02000008, + /* nibble 5 */ + 0x20000010, 0x00080010, 0x00000000, 0x20080800, + 0x00080010, 0x00000800, 0x20000810, 0x00080000, + 0x00000810, 0x20080810, 0x00080800, 0x20000000, + 0x20000800, 0x20000010, 0x20080000, 0x00080810, + 0x00080000, 0x20000810, 0x20080010, 0x00000000, + 0x00000800, 0x00000010, 0x20080800, 0x20080010, + 0x20080810, 0x20080000, 0x20000000, 0x00000810, + 0x00000010, 0x00080800, 0x00080810, 0x20000800, + 0x00000810, 0x20000000, 0x20000800, 0x00080810, + 0x20080800, 0x00080010, 0x00000000, 0x20000800, + 0x20000000, 0x00000800, 0x20080010, 0x00080000, + 0x00080010, 0x20080810, 0x00080800, 0x00000010, + 0x20080810, 0x00080800, 0x00080000, 0x20000810, + 0x20000010, 0x20080000, 0x00080810, 0x00000000, + 0x00000800, 0x20000010, 0x20000810, 0x20080800, + 0x20080000, 0x00000810, 0x00000010, 0x20080010, + /* nibble 6 */ + 0x00001000, 0x00000080, 0x00400080, 0x00400001, + 0x00401081, 0x00001001, 0x00001080, 0x00000000, + 0x00400000, 0x00400081, 0x00000081, 0x00401000, + 0x00000001, 0x00401080, 0x00401000, 0x00000081, + 0x00400081, 0x00001000, 0x00001001, 0x00401081, + 0x00000000, 0x00400080, 0x00400001, 0x00001080, + 0x00401001, 0x00001081, 0x00401080, 0x00000001, + 0x00001081, 0x00401001, 0x00000080, 0x00400000, + 0x00001081, 0x00401000, 0x00401001, 0x00000081, + 0x00001000, 0x00000080, 0x00400000, 0x00401001, + 0x00400081, 0x00001081, 0x00001080, 0x00000000, + 0x00000080, 0x00400001, 0x00000001, 0x00400080, + 0x00000000, 0x00400081, 0x00400080, 0x00001080, + 0x00000081, 0x00001000, 0x00401081, 0x00400000, + 0x00401080, 0x00000001, 0x00001001, 0x00401081, + 0x00400001, 0x00401080, 0x00401000, 0x00001001, + /* nibble 7 */ + 0x08200020, 0x08208000, 0x00008020, 0x00000000, + 0x08008000, 0x00200020, 0x08200000, 0x08208020, + 0x00000020, 0x08000000, 0x00208000, 0x00008020, + 0x00208020, 0x08008020, 0x08000020, 0x08200000, + 0x00008000, 0x00208020, 0x00200020, 0x08008000, + 0x08208020, 0x08000020, 0x00000000, 0x00208000, + 0x08000000, 0x00200000, 0x08008020, 0x08200020, + 0x00200000, 0x00008000, 0x08208000, 0x00000020, + 0x00200000, 0x00008000, 0x08000020, 0x08208020, + 0x00008020, 0x08000000, 0x00000000, 0x00208000, + 0x08200020, 0x08008020, 0x08008000, 0x00200020, + 0x08208000, 0x00000020, 0x00200020, 0x08008000, + 0x08208020, 0x00200000, 0x08200000, 0x08000020, + 0x00208000, 0x00008020, 0x08008020, 0x08200000, + 0x00000020, 0x08208000, 0x00208020, 0x00000000, + 0x08000000, 0x08200020, 0x00008000, 0x00208020 +}; + +__device__ __constant__ u32 c_skb[8][64] = +{ + /* for C bits (numbered as per FIPS 46) 1 2 3 4 5 6 */ + 0x00000000, 0x00000010, 0x20000000, 0x20000010, + 0x00010000, 0x00010010, 0x20010000, 0x20010010, + 0x00000800, 0x00000810, 0x20000800, 0x20000810, + 0x00010800, 0x00010810, 0x20010800, 0x20010810, + 0x00000020, 0x00000030, 0x20000020, 0x20000030, + 0x00010020, 0x00010030, 0x20010020, 0x20010030, + 0x00000820, 0x00000830, 0x20000820, 0x20000830, + 0x00010820, 0x00010830, 0x20010820, 0x20010830, + 0x00080000, 0x00080010, 0x20080000, 0x20080010, + 0x00090000, 0x00090010, 0x20090000, 0x20090010, + 0x00080800, 0x00080810, 0x20080800, 0x20080810, + 0x00090800, 0x00090810, 0x20090800, 0x20090810, + 0x00080020, 0x00080030, 0x20080020, 0x20080030, + 0x00090020, 0x00090030, 0x20090020, 0x20090030, + 0x00080820, 0x00080830, 0x20080820, 0x20080830, + 0x00090820, 0x00090830, 0x20090820, 0x20090830, + /* for C bits (numbered as per FIPS 46) 7 8 10 11 12 13 */ + 0x00000000, 0x02000000, 0x00002000, 0x02002000, + 0x00200000, 0x02200000, 0x00202000, 0x02202000, + 0x00000004, 0x02000004, 0x00002004, 0x02002004, + 0x00200004, 0x02200004, 0x00202004, 0x02202004, + 0x00000400, 0x02000400, 0x00002400, 0x02002400, + 0x00200400, 0x02200400, 0x00202400, 0x02202400, + 0x00000404, 0x02000404, 0x00002404, 0x02002404, + 0x00200404, 0x02200404, 0x00202404, 0x02202404, + 0x10000000, 0x12000000, 0x10002000, 0x12002000, + 0x10200000, 0x12200000, 0x10202000, 0x12202000, + 0x10000004, 0x12000004, 0x10002004, 0x12002004, + 0x10200004, 0x12200004, 0x10202004, 0x12202004, + 0x10000400, 0x12000400, 0x10002400, 0x12002400, + 0x10200400, 0x12200400, 0x10202400, 0x12202400, + 0x10000404, 0x12000404, 0x10002404, 0x12002404, + 0x10200404, 0x12200404, 0x10202404, 0x12202404, + /* for C bits (numbered as per FIPS 46) 14 15 16 17 19 20 */ + 0x00000000, 0x00000001, 0x00040000, 0x00040001, + 0x01000000, 0x01000001, 0x01040000, 0x01040001, + 0x00000002, 0x00000003, 0x00040002, 0x00040003, + 0x01000002, 0x01000003, 0x01040002, 0x01040003, + 0x00000200, 0x00000201, 0x00040200, 0x00040201, + 0x01000200, 0x01000201, 0x01040200, 0x01040201, + 0x00000202, 0x00000203, 0x00040202, 0x00040203, + 0x01000202, 0x01000203, 0x01040202, 0x01040203, + 0x08000000, 0x08000001, 0x08040000, 0x08040001, + 0x09000000, 0x09000001, 0x09040000, 0x09040001, + 0x08000002, 0x08000003, 0x08040002, 0x08040003, + 0x09000002, 0x09000003, 0x09040002, 0x09040003, + 0x08000200, 0x08000201, 0x08040200, 0x08040201, + 0x09000200, 0x09000201, 0x09040200, 0x09040201, + 0x08000202, 0x08000203, 0x08040202, 0x08040203, + 0x09000202, 0x09000203, 0x09040202, 0x09040203, + /* for C bits (numbered as per FIPS 46) 21 23 24 26 27 28 */ + 0x00000000, 0x00100000, 0x00000100, 0x00100100, + 0x00000008, 0x00100008, 0x00000108, 0x00100108, + 0x00001000, 0x00101000, 0x00001100, 0x00101100, + 0x00001008, 0x00101008, 0x00001108, 0x00101108, + 0x04000000, 0x04100000, 0x04000100, 0x04100100, + 0x04000008, 0x04100008, 0x04000108, 0x04100108, + 0x04001000, 0x04101000, 0x04001100, 0x04101100, + 0x04001008, 0x04101008, 0x04001108, 0x04101108, + 0x00020000, 0x00120000, 0x00020100, 0x00120100, + 0x00020008, 0x00120008, 0x00020108, 0x00120108, + 0x00021000, 0x00121000, 0x00021100, 0x00121100, + 0x00021008, 0x00121008, 0x00021108, 0x00121108, + 0x04020000, 0x04120000, 0x04020100, 0x04120100, + 0x04020008, 0x04120008, 0x04020108, 0x04120108, + 0x04021000, 0x04121000, 0x04021100, 0x04121100, + 0x04021008, 0x04121008, 0x04021108, 0x04121108, + /* for D bits (numbered as per FIPS 46) 1 2 3 4 5 6 */ + 0x00000000, 0x10000000, 0x00010000, 0x10010000, + 0x00000004, 0x10000004, 0x00010004, 0x10010004, + 0x20000000, 0x30000000, 0x20010000, 0x30010000, + 0x20000004, 0x30000004, 0x20010004, 0x30010004, + 0x00100000, 0x10100000, 0x00110000, 0x10110000, + 0x00100004, 0x10100004, 0x00110004, 0x10110004, + 0x20100000, 0x30100000, 0x20110000, 0x30110000, + 0x20100004, 0x30100004, 0x20110004, 0x30110004, + 0x00001000, 0x10001000, 0x00011000, 0x10011000, + 0x00001004, 0x10001004, 0x00011004, 0x10011004, + 0x20001000, 0x30001000, 0x20011000, 0x30011000, + 0x20001004, 0x30001004, 0x20011004, 0x30011004, + 0x00101000, 0x10101000, 0x00111000, 0x10111000, + 0x00101004, 0x10101004, 0x00111004, 0x10111004, + 0x20101000, 0x30101000, 0x20111000, 0x30111000, + 0x20101004, 0x30101004, 0x20111004, 0x30111004, + /* for D bits (numbered as per FIPS 46) 8 9 11 12 13 14 */ + 0x00000000, 0x08000000, 0x00000008, 0x08000008, + 0x00000400, 0x08000400, 0x00000408, 0x08000408, + 0x00020000, 0x08020000, 0x00020008, 0x08020008, + 0x00020400, 0x08020400, 0x00020408, 0x08020408, + 0x00000001, 0x08000001, 0x00000009, 0x08000009, + 0x00000401, 0x08000401, 0x00000409, 0x08000409, + 0x00020001, 0x08020001, 0x00020009, 0x08020009, + 0x00020401, 0x08020401, 0x00020409, 0x08020409, + 0x02000000, 0x0A000000, 0x02000008, 0x0A000008, + 0x02000400, 0x0A000400, 0x02000408, 0x0A000408, + 0x02020000, 0x0A020000, 0x02020008, 0x0A020008, + 0x02020400, 0x0A020400, 0x02020408, 0x0A020408, + 0x02000001, 0x0A000001, 0x02000009, 0x0A000009, + 0x02000401, 0x0A000401, 0x02000409, 0x0A000409, + 0x02020001, 0x0A020001, 0x02020009, 0x0A020009, + 0x02020401, 0x0A020401, 0x02020409, 0x0A020409, + /* for D bits (numbered as per FIPS 46) 16 17 18 19 20 21 */ + 0x00000000, 0x00000100, 0x00080000, 0x00080100, + 0x01000000, 0x01000100, 0x01080000, 0x01080100, + 0x00000010, 0x00000110, 0x00080010, 0x00080110, + 0x01000010, 0x01000110, 0x01080010, 0x01080110, + 0x00200000, 0x00200100, 0x00280000, 0x00280100, + 0x01200000, 0x01200100, 0x01280000, 0x01280100, + 0x00200010, 0x00200110, 0x00280010, 0x00280110, + 0x01200010, 0x01200110, 0x01280010, 0x01280110, + 0x00000200, 0x00000300, 0x00080200, 0x00080300, + 0x01000200, 0x01000300, 0x01080200, 0x01080300, + 0x00000210, 0x00000310, 0x00080210, 0x00080310, + 0x01000210, 0x01000310, 0x01080210, 0x01080310, + 0x00200200, 0x00200300, 0x00280200, 0x00280300, + 0x01200200, 0x01200300, 0x01280200, 0x01280300, + 0x00200210, 0x00200310, 0x00280210, 0x00280310, + 0x01200210, 0x01200310, 0x01280210, 0x01280310, + /* for D bits (numbered as per FIPS 46) 22 23 24 25 27 28 */ + 0x00000000, 0x04000000, 0x00040000, 0x04040000, + 0x00000002, 0x04000002, 0x00040002, 0x04040002, + 0x00002000, 0x04002000, 0x00042000, 0x04042000, + 0x00002002, 0x04002002, 0x00042002, 0x04042002, + 0x00000020, 0x04000020, 0x00040020, 0x04040020, + 0x00000022, 0x04000022, 0x00040022, 0x04040022, + 0x00002020, 0x04002020, 0x00042020, 0x04042020, + 0x00002022, 0x04002022, 0x00042022, 0x04042022, + 0x00000800, 0x04000800, 0x00040800, 0x04040800, + 0x00000802, 0x04000802, 0x00040802, 0x04040802, + 0x00002800, 0x04002800, 0x00042800, 0x04042800, + 0x00002802, 0x04002802, 0x00042802, 0x04042802, + 0x00000820, 0x04000820, 0x00040820, 0x04040820, + 0x00000822, 0x04000822, 0x00040822, 0x04040822, + 0x00002820, 0x04002820, 0x00042820, 0x04042820, + 0x00002822, 0x04002822, 0x00042822, 0x04042822 +}; + +#ifdef VECT_SIZE1 +#define BOX(i,n,S) u32x ((S)[(n)][(i)]) +#endif + +#ifdef VECT_SIZE2 +#define BOX(i,n,S) u32x ((S)[(n)][(i).x], (S)[(n)][(i).y]) +#endif + +__device__ static void _des_crypt_keysetup (u32x c, u32x d, u32x Kc[16], u32x Kd[16], u32 s_skb[8][64]) +{ + u32x tt; + + PERM_OP (d, c, tt, 4, 0x0f0f0f0f); + HPERM_OP (c, tt, 2, 0xcccc0000); + HPERM_OP (d, tt, 2, 0xcccc0000); + PERM_OP (d, c, tt, 1, 0x55555555); + PERM_OP (c, d, tt, 8, 0x00ff00ff); + PERM_OP (d, c, tt, 1, 0x55555555); + + d = ((d & 0x000000ff) << 16) + | ((d & 0x0000ff00) << 0) + | ((d & 0x00ff0000) >> 16) + | ((c & 0xf0000000) >> 4); + + c = c & 0x0fffffff; + + #pragma unroll + for (u32 i = 0; i < 16; i++) + { + if ((i < 2) || (i == 8) || (i == 15)) + { + c = ((c >> 1) | (c << 27)); + d = ((d >> 1) | (d << 27)); + } + else + { + c = ((c >> 2) | (c << 26)); + d = ((d >> 2) | (d << 26)); + } + + c = c & 0x0fffffff; + d = d & 0x0fffffff; + + const u32x c00 = (c >> 0) & 0x0000003f; + const u32x c06 = (c >> 6) & 0x00383003; + const u32x c07 = (c >> 7) & 0x0000003c; + const u32x c13 = (c >> 13) & 0x0000060f; + const u32x c20 = (c >> 20) & 0x00000001; + + u32x s = BOX (((c00 >> 0) & 0xff), 0, s_skb) + | BOX (((c06 >> 0) & 0xff) + |((c07 >> 0) & 0xff), 1, s_skb) + | BOX (((c13 >> 0) & 0xff) + |((c06 >> 8) & 0xff), 2, s_skb) + | BOX (((c20 >> 0) & 0xff) + |((c13 >> 8) & 0xff) + |((c06 >> 16) & 0xff), 3, s_skb); + + const u32x d00 = (d >> 0) & 0x00003c3f; + const u32x d07 = (d >> 7) & 0x00003f03; + const u32x d21 = (d >> 21) & 0x0000000f; + const u32x d22 = (d >> 22) & 0x00000030; + + u32x t = BOX (((d00 >> 0) & 0xff), 4, s_skb) + | BOX (((d07 >> 0) & 0xff) + |((d00 >> 8) & 0xff), 5, s_skb) + | BOX (((d07 >> 8) & 0xff), 6, s_skb) + | BOX (((d21 >> 0) & 0xff) + |((d22 >> 0) & 0xff), 7, s_skb); + + #if __CUDA_ARCH__ >= 200 + Kc[i] = __byte_perm (s, t, 0x5410); + Kd[i] = __byte_perm (s, t, 0x7632); + #else + Kc[i] = ((t << 16) | (s & 0x0000ffff)); + Kd[i] = ((s >> 16) | (t & 0xffff0000)); + #endif + } +} + +__device__ static void _des_crypt_encrypt (u32x iv[2], u32 mask, u32x Kc[16], u32x Kd[16], u32 s_SPtrans[8][64]) +{ + const u32 E1 = (mask >> 2) & 0x3f0; + + const u32 E0 = mask & 0x3f; + + u32x r = 0; + u32x l = 0; + + for (u32 i = 0; i < 25; i++) + { + #pragma unroll + for (u32 j = 0; j < 16; j += 2) + { + u32x t; + u32x u; + + t = r ^ (r >> 16); + u = t & E0; + t = t & E1; + u = u ^ (u << 16); + u = u ^ r; + u = u ^ Kc[j + 0]; + t = t ^ (t << 16); + t = t ^ r; + t = rotl32 (t, 28u); + t = t ^ Kd[j + 0]; + + l ^= BOX (((u >> 0) & 0x3f), 0, s_SPtrans) + | BOX (((u >> 8) & 0x3f), 2, s_SPtrans) + | BOX (((u >> 16) & 0x3f), 4, s_SPtrans) + | BOX (((u >> 24) & 0x3f), 6, s_SPtrans) + | BOX (((t >> 0) & 0x3f), 1, s_SPtrans) + | BOX (((t >> 8) & 0x3f), 3, s_SPtrans) + | BOX (((t >> 16) & 0x3f), 5, s_SPtrans) + | BOX (((t >> 24) & 0x3f), 7, s_SPtrans); + + t = l ^ (l >> 16); + u = t & E0; + t = t & E1; + u = u ^ (u << 16); + u = u ^ l; + u = u ^ Kc[j + 1]; + t = t ^ (t << 16); + t = t ^ l; + t = rotl32 (t, 28u); + t = t ^ Kd[j + 1]; + + r ^= BOX (((u >> 0) & 0x3f), 0, s_SPtrans) + | BOX (((u >> 8) & 0x3f), 2, s_SPtrans) + | BOX (((u >> 16) & 0x3f), 4, s_SPtrans) + | BOX (((u >> 24) & 0x3f), 6, s_SPtrans) + | BOX (((t >> 0) & 0x3f), 1, s_SPtrans) + | BOX (((t >> 8) & 0x3f), 3, s_SPtrans) + | BOX (((t >> 16) & 0x3f), 5, s_SPtrans) + | BOX (((t >> 24) & 0x3f), 7, s_SPtrans); + } + + u32x tt; + + tt = l; + l = r; + r = tt; + } + + iv[0] = rotl32 (r, 31); + iv[1] = rotl32 (l, 31); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m01500_m04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = 0; + wordl0[3] = 0; + + u32x wordl1[4]; + + wordl1[0] = 0; + wordl1[1] = 0; + wordl1[2] = 0; + wordl1[3] = 0; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, c_combs[0].pw_len); + } + + /** + * sbox, kbox + */ + + __shared__ u32 s_skb[8][64]; + __shared__ u32 s_SPtrans[8][64]; + + if (lid < 64) + { + s_skb[0][lid] = c_skb[0][lid]; + s_skb[1][lid] = c_skb[1][lid]; + s_skb[2][lid] = c_skb[2][lid]; + s_skb[3][lid] = c_skb[3][lid]; + s_skb[4][lid] = c_skb[4][lid]; + s_skb[5][lid] = c_skb[5][lid]; + s_skb[6][lid] = c_skb[6][lid]; + s_skb[7][lid] = c_skb[7][lid]; + + s_SPtrans[0][lid] = c_SPtrans[0][lid]; + s_SPtrans[1][lid] = c_SPtrans[1][lid]; + s_SPtrans[2][lid] = c_SPtrans[2][lid]; + s_SPtrans[3][lid] = c_SPtrans[3][lid]; + s_SPtrans[4][lid] = c_SPtrans[4][lid]; + s_SPtrans[5][lid] = c_SPtrans[5][lid]; + s_SPtrans[6][lid] = c_SPtrans[6][lid]; + s_SPtrans[7][lid] = c_SPtrans[7][lid]; + } + + __syncthreads (); + + if (gid >= gid_max) return; + + /** + * salt + */ + + const u32 mask = salt_bufs[salt_pos].salt_buf[0]; + + /** + * main + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = c_combs[il_pos].pw_len; + + u32 pw_len = pw_l_len + pw_r_len; + + pw_len = (pw_len >= 8) ? 8 : pw_len; + + u32 wordr0[4]; + + wordr0[0] = c_combs[il_pos].i[0]; + wordr0[1] = c_combs[il_pos].i[1]; + wordr0[2] = 0; + wordr0[3] = 0; + + u32 wordr1[4]; + + wordr1[0] = 0; + wordr1[1] = 0; + wordr1[2] = 0; + wordr1[3] = 0; + + u32 wordr2[4]; + + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + + u32 wordr3[4]; + + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + u32x w0[4]; + + w0[0] = wordl0[0] | wordr0[0]; + w0[1] = wordl0[1] | wordr0[1]; + w0[2] = 0; + w0[3] = 0; + + u32x w1[4]; + + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + u32x data[2]; + + data[0] = (w0[0] << 1) & 0xfefefefe; + data[1] = (w0[1] << 1) & 0xfefefefe; + + u32x Kc[16]; + u32x Kd[16]; + + _des_crypt_keysetup (data[0], data[1], Kc, Kd, s_skb); + + u32x iv[2]; + + _des_crypt_encrypt (iv, mask, Kc, Kd, s_SPtrans); + + const u32x r0 = iv[0]; + const u32x r1 = iv[1]; + const u32x r2 = 0; + const u32x r3 = 0; + + #include VECT_COMPARE_M + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m01500_m08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m01500_m16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m01500_s04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = 0; + wordl0[3] = 0; + + u32x wordl1[4]; + + wordl1[0] = 0; + wordl1[1] = 0; + wordl1[2] = 0; + wordl1[3] = 0; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, c_combs[0].pw_len); + } + + /** + * sbox, kbox + */ + + __shared__ u32 s_skb[8][64]; + __shared__ u32 s_SPtrans[8][64]; + + if (lid < 64) + { + s_skb[0][lid] = c_skb[0][lid]; + s_skb[1][lid] = c_skb[1][lid]; + s_skb[2][lid] = c_skb[2][lid]; + s_skb[3][lid] = c_skb[3][lid]; + s_skb[4][lid] = c_skb[4][lid]; + s_skb[5][lid] = c_skb[5][lid]; + s_skb[6][lid] = c_skb[6][lid]; + s_skb[7][lid] = c_skb[7][lid]; + + s_SPtrans[0][lid] = c_SPtrans[0][lid]; + s_SPtrans[1][lid] = c_SPtrans[1][lid]; + s_SPtrans[2][lid] = c_SPtrans[2][lid]; + s_SPtrans[3][lid] = c_SPtrans[3][lid]; + s_SPtrans[4][lid] = c_SPtrans[4][lid]; + s_SPtrans[5][lid] = c_SPtrans[5][lid]; + s_SPtrans[6][lid] = c_SPtrans[6][lid]; + s_SPtrans[7][lid] = c_SPtrans[7][lid]; + } + + __syncthreads (); + + if (gid >= gid_max) return; + + /** + * salt + */ + + const u32 mask = salt_bufs[salt_pos].salt_buf[0]; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * main + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = c_combs[il_pos].pw_len; + + u32 pw_len = pw_l_len + pw_r_len; + + pw_len = (pw_len >= 8) ? 8 : pw_len; + + u32 wordr0[4]; + + wordr0[0] = c_combs[il_pos].i[0]; + wordr0[1] = c_combs[il_pos].i[1]; + wordr0[2] = 0; + wordr0[3] = 0; + + u32 wordr1[4]; + + wordr1[0] = 0; + wordr1[1] = 0; + wordr1[2] = 0; + wordr1[3] = 0; + + u32 wordr2[4]; + + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + + u32 wordr3[4]; + + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + u32x w0[4]; + + w0[0] = wordl0[0] | wordr0[0]; + w0[1] = wordl0[1] | wordr0[1]; + w0[2] = 0; + w0[3] = 0; + + u32x w1[4]; + + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + u32x data[2]; + + data[0] = (w0[0] << 1) & 0xfefefefe; + data[1] = (w0[1] << 1) & 0xfefefefe; + + u32x Kc[16]; + u32x Kd[16]; + + _des_crypt_keysetup (data[0], data[1], Kc, Kd, s_skb); + + u32x iv[2]; + + _des_crypt_encrypt (iv, mask, Kc, Kd, s_SPtrans); + + const u32x r0 = iv[0]; + const u32x r1 = iv[1]; + const u32x r2 = 0; + const u32x r3 = 0; + + #include VECT_COMPARE_S + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m01500_s08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m01500_s16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/nv/m01500_a3.cu b/nv/m01500_a3.cu new file mode 100644 index 0000000000..0804f3d07e --- /dev/null +++ b/nv/m01500_a3.cu @@ -0,0 +1,2046 @@ +/** + * Author......: Jens Steube + * License.....: MIT + * NOTE........: sboxes for maxwell were taken from DeepLearningJohnDoe, license below + * : sboxes for others were takes fron JtR, license below + */ + +#define _DES_ +#define _SCALAR_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW2 +#define VECT_SIZE1 +#endif + +#define DGST_R0 0 +#define DGST_R1 1 +#define DGST_R2 2 +#define DGST_R3 3 + +#include "include/kernel_functions.c" +#include "types_nv.c" +#include "common_nv.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4_warp_bs.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4_warp_bs.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4_warp_bs.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4_warp_bs.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4_warp_bs.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4_warp_bs.c" +#endif + +#define KXX_DECL +#define sXXX_DECL + +#define myselx(a,b,c) ((c) ? (b) : (a)) + +__device__ __constant__ u32x c_bfs[1024]; +__device__ __constant__ bs_word_t c_tm[32]; +__device__ __shared__ u32 s_S[64]; + +#if __CUDA_ARCH__ >= 500 + +// +// Bitslice DES S-boxes with LOP3.LUT instructions +// For NVIDIA Maxwell architecture and CUDA 7.5 RC +// by DeepLearningJohnDoe, version 0.1.6, 2015/07/19 +// +// Gate counts: 25 24 25 18 25 24 24 23 +// Average: 23.5 +// Depth: 8 7 7 6 8 10 10 8 +// Average: 8 +// +// Note that same S-box function with a lower gate count isn't necessarily faster. +// +// These Boolean expressions corresponding to DES S-boxes were +// discovered by +// +// This file itself is Copyright (c) 2015 by +// Redistribution and use in source and binary forms, with or without +// modification, are permitted. +// +// The underlying mathematical formulas are NOT copyrighted. +// + +#define LUT(a,b,c,d,e) u32 a; asm ("lop3.b32 %0, %1, %2, %3, "#e";" : "=r"(a): "r"(b), "r"(c), "r"(d)); + +__device__ static void s1 (const u32 a1, const u32 a2, const u32 a3, const u32 a4, const u32 a5, const u32 a6, u32 *out1, u32 *out2, u32 *out3, u32 *out4) +{ + LUT(xAA55AA5500550055, a1, a4, a6, 0xC1) + LUT(xA55AA55AF0F5F0F5, a3, a6, xAA55AA5500550055, 0x9E) + LUT(x5F5F5F5FA5A5A5A5, a1, a3, a6, 0xD6) + LUT(xF5A0F5A0A55AA55A, a4, xAA55AA5500550055, x5F5F5F5FA5A5A5A5, 0x56) + LUT(x947A947AD1E7D1E7, a2, xA55AA55AF0F5F0F5, xF5A0F5A0A55AA55A, 0x6C) + LUT(x5FFF5FFFFFFAFFFA, a6, xAA55AA5500550055, x5F5F5F5FA5A5A5A5, 0x7B) + LUT(xB96CB96C69936993, a2, xF5A0F5A0A55AA55A, x5FFF5FFFFFFAFFFA, 0xD6) + LUT(x3, a5, x947A947AD1E7D1E7, xB96CB96C69936993, 0x6A) + LUT(x55EE55EE55EE55EE, a1, a2, a4, 0x7A) + LUT(x084C084CB77BB77B, a2, a6, xF5A0F5A0A55AA55A, 0xC9) + LUT(x9C329C32E295E295, x947A947AD1E7D1E7, x55EE55EE55EE55EE, x084C084CB77BB77B, 0x72) + LUT(xA51EA51E50E050E0, a3, a6, x55EE55EE55EE55EE, 0x29) + LUT(x4AD34AD3BE3CBE3C, a2, x947A947AD1E7D1E7, xA51EA51E50E050E0, 0x95) + LUT(x2, a5, x9C329C32E295E295, x4AD34AD3BE3CBE3C, 0xC6) + LUT(xD955D95595D195D1, a1, a2, x9C329C32E295E295, 0xD2) + LUT(x8058805811621162, x947A947AD1E7D1E7, x55EE55EE55EE55EE, x084C084CB77BB77B, 0x90) + LUT(x7D0F7D0FC4B3C4B3, xA51EA51E50E050E0, xD955D95595D195D1, x8058805811621162, 0x76) + LUT(x0805080500010001, a3, xAA55AA5500550055, xD955D95595D195D1, 0x80) + LUT(x4A964A96962D962D, xB96CB96C69936993, x4AD34AD3BE3CBE3C, x0805080500010001, 0xA6) + LUT(x4, a5, x7D0F7D0FC4B3C4B3, x4A964A96962D962D, 0xA6) + LUT(x148014807B087B08, a1, xAA55AA5500550055, x947A947AD1E7D1E7, 0x21) + LUT(x94D894D86B686B68, xA55AA55AF0F5F0F5, x8058805811621162, x148014807B087B08, 0x6A) + LUT(x5555555540044004, a1, a6, x084C084CB77BB77B, 0x70) + LUT(xAFB4AFB4BF5BBF5B, x5F5F5F5FA5A5A5A5, xA51EA51E50E050E0, x5555555540044004, 0x97) + LUT(x1, a5, x94D894D86B686B68, xAFB4AFB4BF5BBF5B, 0x6C) + + *out1 ^= x1; + *out2 ^= x2; + *out3 ^= x3; + *out4 ^= x4; +} + +__device__ static void s2 (const u32 a1, const u32 a2, const u32 a3, const u32 a4, const u32 a5, const u32 a6, u32 *out1, u32 *out2, u32 *out3, u32 *out4) +{ + LUT(xEEEEEEEE99999999, a1, a2, a6, 0x97) + LUT(xFFFFEEEE66666666, a5, a6, xEEEEEEEE99999999, 0x67) + LUT(x5555FFFFFFFF0000, a1, a5, a6, 0x76) + LUT(x6666DDDD5555AAAA, a2, xFFFFEEEE66666666, x5555FFFFFFFF0000, 0x69) + LUT(x6969D3D35353ACAC, a3, xFFFFEEEE66666666, x6666DDDD5555AAAA, 0x6A) + LUT(xCFCF3030CFCF3030, a2, a3, a5, 0x65) + LUT(xE4E4EEEE9999F0F0, a3, xEEEEEEEE99999999, x5555FFFFFFFF0000, 0x8D) + LUT(xE5E5BABACDCDB0B0, a1, xCFCF3030CFCF3030, xE4E4EEEE9999F0F0, 0xCA) + LUT(x3, a4, x6969D3D35353ACAC, xE5E5BABACDCDB0B0, 0xC6) + LUT(x3333CCCC00000000, a2, a5, a6, 0x14) + LUT(xCCCCDDDDFFFF0F0F, a5, xE4E4EEEE9999F0F0, x3333CCCC00000000, 0xB5) + LUT(x00000101F0F0F0F0, a3, a6, xFFFFEEEE66666666, 0x1C) + LUT(x9A9A64646A6A9595, a1, xCFCF3030CFCF3030, x00000101F0F0F0F0, 0x96) + LUT(x2, a4, xCCCCDDDDFFFF0F0F, x9A9A64646A6A9595, 0x6A) + LUT(x3333BBBB3333FFFF, a1, a2, x6666DDDD5555AAAA, 0xDE) + LUT(x1414141441410000, a1, a3, xE4E4EEEE9999F0F0, 0x90) + LUT(x7F7FF3F3F5F53939, x6969D3D35353ACAC, x9A9A64646A6A9595, x3333BBBB3333FFFF, 0x79) + LUT(x9494E3E34B4B3939, a5, x1414141441410000, x7F7FF3F3F5F53939, 0x29) + LUT(x1, a4, x3333BBBB3333FFFF, x9494E3E34B4B3939, 0xA6) + LUT(xB1B1BBBBCCCCA5A5, a1, a1, xE4E4EEEE9999F0F0, 0x4A) + LUT(xFFFFECECEEEEDDDD, a2, x3333CCCC00000000, x9A9A64646A6A9595, 0xEF) + LUT(xB1B1A9A9DCDC8787, xE5E5BABACDCDB0B0, xB1B1BBBBCCCCA5A5, xFFFFECECEEEEDDDD, 0x8D) + LUT(xFFFFCCCCEEEE4444, a2, a5, xFFFFEEEE66666666, 0x2B) + LUT(x4, a4, xB1B1A9A9DCDC8787, xFFFFCCCCEEEE4444, 0x6C) + + *out1 ^= x1; + *out2 ^= x2; + *out3 ^= x3; + *out4 ^= x4; +} + +__device__ static void s3 (const u32 a1, const u32 a2, const u32 a3, const u32 a4, const u32 a5, const u32 a6, u32 *out1, u32 *out2, u32 *out3, u32 *out4) +{ + LUT(xA50FA50FA50FA50F, a1, a3, a4, 0xC9) + LUT(xF0F00F0FF0F0F0F0, a3, a5, a6, 0x4B) + LUT(xAF0FA0AAAF0FAF0F, a1, xA50FA50FA50FA50F, xF0F00F0FF0F0F0F0, 0x4D) + LUT(x5AA5A55A5AA55AA5, a1, a4, xF0F00F0FF0F0F0F0, 0x69) + LUT(xAA005FFFAA005FFF, a3, a5, xA50FA50FA50FA50F, 0xD6) + LUT(x5AA5A55A0F5AFAA5, a6, x5AA5A55A5AA55AA5, xAA005FFFAA005FFF, 0x9C) + LUT(x1, a2, xAF0FA0AAAF0FAF0F, x5AA5A55A0F5AFAA5, 0xA6) + LUT(xAA55AA5500AA00AA, a1, a4, a6, 0x49) + LUT(xFAFAA50FFAFAA50F, a1, a5, xA50FA50FA50FA50F, 0x9B) + LUT(x50AF0F5AFA50A5A5, a1, xAA55AA5500AA00AA, xFAFAA50FFAFAA50F, 0x66) + LUT(xAFAFAFAFFAFAFAFA, a1, a3, a6, 0x6F) + LUT(xAFAFFFFFFFFAFAFF, a4, x50AF0F5AFA50A5A5, xAFAFAFAFFAFAFAFA, 0xEB) + LUT(x4, a2, x50AF0F5AFA50A5A5, xAFAFFFFFFFFAFAFF, 0x6C) + LUT(x500F500F500F500F, a1, a3, a4, 0x98) + LUT(xF0505A0505A5050F, x5AA5A55A0F5AFAA5, xAA55AA5500AA00AA, xAFAFAFAFFAFAFAFA, 0x1D) + LUT(xF0505A05AA55AAFF, a6, x500F500F500F500F, xF0505A0505A5050F, 0x9A) + LUT(xFF005F55FF005F55, a1, a4, xAA005FFFAA005FFF, 0xB2) + LUT(xA55F5AF0A55F5AF0, a5, xA50FA50FA50FA50F, x5AA5A55A5AA55AA5, 0x3D) + LUT(x5A5F05A5A55F5AF0, a6, xFF005F55FF005F55, xA55F5AF0A55F5AF0, 0xA6) + LUT(x3, a2, xF0505A05AA55AAFF, x5A5F05A5A55F5AF0, 0xA6) + LUT(x0F0F0F0FA5A5A5A5, a1, a3, a6, 0xC6) + LUT(x5FFFFF5FFFA0FFA0, x5AA5A55A5AA55AA5, xAFAFAFAFFAFAFAFA, x0F0F0F0FA5A5A5A5, 0xDB) + LUT(xF5555AF500A05FFF, a5, xFAFAA50FFAFAA50F, xF0505A0505A5050F, 0xB9) + LUT(x05A5AAF55AFA55A5, xF0505A05AA55AAFF, x0F0F0F0FA5A5A5A5, xF5555AF500A05FFF, 0x9B) + LUT(x2, a2, x5FFFFF5FFFA0FFA0, x05A5AAF55AFA55A5, 0xA6) + + *out1 ^= x1; + *out2 ^= x2; + *out3 ^= x3; + *out4 ^= x4; +} + +__device__ static void s4 (const u32 a1, const u32 a2, const u32 a3, const u32 a4, const u32 a5, const u32 a6, u32 *out1, u32 *out2, u32 *out3, u32 *out4) +{ + LUT(x55F055F055F055F0, a1, a3, a4, 0x72) + LUT(xA500F5F0A500F5F0, a3, a5, x55F055F055F055F0, 0xAD) + LUT(xF50AF50AF50AF50A, a1, a3, a4, 0x59) + LUT(xF5FA0FFFF5FA0FFF, a3, a5, xF50AF50AF50AF50A, 0xE7) + LUT(x61C8F93C61C8F93C, a2, xA500F5F0A500F5F0, xF5FA0FFFF5FA0FFF, 0xC6) + LUT(x9999666699996666, a1, a2, a5, 0x69) + LUT(x22C022C022C022C0, a2, a4, x55F055F055F055F0, 0x18) + LUT(xB35C94A6B35C94A6, xF5FA0FFFF5FA0FFF, x9999666699996666, x22C022C022C022C0, 0x63) + LUT(x4, a6, x61C8F93C61C8F93C, xB35C94A6B35C94A6, 0x6A) + LUT(x4848484848484848, a1, a2, a3, 0x12) + LUT(x55500AAA55500AAA, a1, a5, xF5FA0FFFF5FA0FFF, 0x28) + LUT(x3C90B3D63C90B3D6, x61C8F93C61C8F93C, x4848484848484848, x55500AAA55500AAA, 0x1E) + LUT(x8484333384843333, a1, x9999666699996666, x4848484848484848, 0x14) + LUT(x4452F1AC4452F1AC, xF50AF50AF50AF50A, xF5FA0FFFF5FA0FFF, xB35C94A6B35C94A6, 0x78) + LUT(x9586CA379586CA37, x55500AAA55500AAA, x8484333384843333, x4452F1AC4452F1AC, 0xD6) + LUT(x2, a6, x3C90B3D63C90B3D6, x9586CA379586CA37, 0x6A) + LUT(x1, a6, x3C90B3D63C90B3D6, x9586CA379586CA37, 0xA9) + LUT(x3, a6, x61C8F93C61C8F93C, xB35C94A6B35C94A6, 0x56) + + *out1 ^= x1; + *out2 ^= x2; + *out3 ^= x3; + *out4 ^= x4; +} + +__device__ static void s5 (const u32 a1, const u32 a2, const u32 a3, const u32 a4, const u32 a5, const u32 a6, u32 *out1, u32 *out2, u32 *out3, u32 *out4) +{ + LUT(xA0A0A0A0FFFFFFFF, a1, a3, a6, 0xAB) + LUT(xFFFF00005555FFFF, a1, a5, a6, 0xB9) + LUT(xB3B320207777FFFF, a2, xA0A0A0A0FFFFFFFF, xFFFF00005555FFFF, 0xE8) + LUT(x50505A5A5A5A5050, a1, a3, xFFFF00005555FFFF, 0x34) + LUT(xA2A2FFFF2222FFFF, a1, a5, xB3B320207777FFFF, 0xCE) + LUT(x2E2E6969A4A46363, a2, x50505A5A5A5A5050, xA2A2FFFF2222FFFF, 0x29) + LUT(x3, a4, xB3B320207777FFFF, x2E2E6969A4A46363, 0xA6) + LUT(xA5A50A0AA5A50A0A, a1, a3, a5, 0x49) + LUT(x969639396969C6C6, a2, a6, xA5A50A0AA5A50A0A, 0x96) + LUT(x1B1B1B1B1B1B1B1B, a1, a2, a3, 0xCA) + LUT(xBFBFBFBFF6F6F9F9, a3, xA0A0A0A0FFFFFFFF, x969639396969C6C6, 0x7E) + LUT(x5B5BA4A4B8B81D1D, xFFFF00005555FFFF, x1B1B1B1B1B1B1B1B, xBFBFBFBFF6F6F9F9, 0x96) + LUT(x2, a4, x969639396969C6C6, x5B5BA4A4B8B81D1D, 0xCA) + LUT(x5555BBBBFFFF5555, a1, a2, xFFFF00005555FFFF, 0xE5) + LUT(x6D6D9C9C95956969, x50505A5A5A5A5050, xA2A2FFFF2222FFFF, x969639396969C6C6, 0x97) + LUT(x1A1A67676A6AB4B4, xA5A50A0AA5A50A0A, x5555BBBBFFFF5555, x6D6D9C9C95956969, 0x47) + LUT(xA0A0FFFFAAAA0000, a3, xFFFF00005555FFFF, xA5A50A0AA5A50A0A, 0x3B) + LUT(x36369C9CC1C1D6D6, x969639396969C6C6, x6D6D9C9C95956969, xA0A0FFFFAAAA0000, 0xD9) + LUT(x1, a4, x1A1A67676A6AB4B4, x36369C9CC1C1D6D6, 0xCA) + LUT(x5555F0F0F5F55555, a1, a3, xFFFF00005555FFFF, 0xB1) + LUT(x79790202DCDC0808, xA2A2FFFF2222FFFF, xA5A50A0AA5A50A0A, x969639396969C6C6, 0x47) + LUT(x6C6CF2F229295D5D, xBFBFBFBFF6F6F9F9, x5555F0F0F5F55555, x79790202DCDC0808, 0x6E) + LUT(xA3A3505010101A1A, a2, xA2A2FFFF2222FFFF, x36369C9CC1C1D6D6, 0x94) + LUT(x7676C7C74F4FC7C7, a1, x2E2E6969A4A46363, xA3A3505010101A1A, 0xD9) + LUT(x4, a4, x6C6CF2F229295D5D, x7676C7C74F4FC7C7, 0xC6) + + *out1 ^= x1; + *out2 ^= x2; + *out3 ^= x3; + *out4 ^= x4; +} + +__device__ static void s6 (const u32 a1, const u32 a2, const u32 a3, const u32 a4, const u32 a5, const u32 a6, u32 *out1, u32 *out2, u32 *out3, u32 *out4) +{ + LUT(x5050F5F55050F5F5, a1, a3, a5, 0xB2) + LUT(x6363C6C66363C6C6, a1, a2, x5050F5F55050F5F5, 0x66) + LUT(xAAAA5555AAAA5555, a1, a1, a5, 0xA9) + LUT(x3A3A65653A3A6565, a3, x6363C6C66363C6C6, xAAAA5555AAAA5555, 0xA9) + LUT(x5963A3C65963A3C6, a4, x6363C6C66363C6C6, x3A3A65653A3A6565, 0xC6) + LUT(xE7E76565E7E76565, a5, x6363C6C66363C6C6, x3A3A65653A3A6565, 0xAD) + LUT(x455D45DF455D45DF, a1, a4, xE7E76565E7E76565, 0xE4) + LUT(x4, a6, x5963A3C65963A3C6, x455D45DF455D45DF, 0x6C) + LUT(x1101220211012202, a2, xAAAA5555AAAA5555, x5963A3C65963A3C6, 0x20) + LUT(xF00F0FF0F00F0FF0, a3, a4, a5, 0x69) + LUT(x16E94A9716E94A97, xE7E76565E7E76565, x1101220211012202, xF00F0FF0F00F0FF0, 0x9E) + LUT(x2992922929929229, a1, a2, xF00F0FF0F00F0FF0, 0x49) + LUT(xAFAF9823AFAF9823, a5, x5050F5F55050F5F5, x2992922929929229, 0x93) + LUT(x3, a6, x16E94A9716E94A97, xAFAF9823AFAF9823, 0x6C) + LUT(x4801810248018102, a4, x5963A3C65963A3C6, x1101220211012202, 0xA4) + LUT(x5EE8FFFD5EE8FFFD, a5, x16E94A9716E94A97, x4801810248018102, 0x76) + LUT(xF0FF00FFF0FF00FF, a3, a4, a5, 0xCD) + LUT(x942D9A67942D9A67, x3A3A65653A3A6565, x5EE8FFFD5EE8FFFD, xF0FF00FFF0FF00FF, 0x86) + LUT(x1, a6, x5EE8FFFD5EE8FFFD, x942D9A67942D9A67, 0xA6) + LUT(x6A40D4ED6F4DD4EE, a2, x4, xAFAF9823AFAF9823, 0x2D) + LUT(x6CA89C7869A49C79, x1101220211012202, x16E94A9716E94A97, x6A40D4ED6F4DD4EE, 0x26) + LUT(xD6DE73F9D6DE73F9, a3, x6363C6C66363C6C6, x455D45DF455D45DF, 0x6B) + LUT(x925E63E1965A63E1, x3A3A65653A3A6565, x6CA89C7869A49C79, xD6DE73F9D6DE73F9, 0xA2) + LUT(x2, a6, x6CA89C7869A49C79, x925E63E1965A63E1, 0xCA) + + + *out1 ^= x1; + *out2 ^= x2; + *out3 ^= x3; + *out4 ^= x4; +} + +__device__ static void s7 (const u32 a1, const u32 a2, const u32 a3, const u32 a4, const u32 a5, const u32 a6, u32 *out1, u32 *out2, u32 *out3, u32 *out4) +{ + LUT(x88AA88AA88AA88AA, a1, a2, a4, 0x0B) + LUT(xAAAAFF00AAAAFF00, a1, a4, a5, 0x27) + LUT(xADAFF8A5ADAFF8A5, a3, x88AA88AA88AA88AA, xAAAAFF00AAAAFF00, 0x9E) + LUT(x0A0AF5F50A0AF5F5, a1, a3, a5, 0xA6) + LUT(x6B69C5DC6B69C5DC, a2, xADAFF8A5ADAFF8A5, x0A0AF5F50A0AF5F5, 0x6B) + LUT(x1C69B2DC1C69B2DC, a4, x88AA88AA88AA88AA, x6B69C5DC6B69C5DC, 0xA9) + LUT(x1, a6, xADAFF8A5ADAFF8A5, x1C69B2DC1C69B2DC, 0x6A) + LUT(x9C9C9C9C9C9C9C9C, a1, a2, a3, 0x63) + LUT(xE6E63BFDE6E63BFD, a2, xAAAAFF00AAAAFF00, x0A0AF5F50A0AF5F5, 0xE7) + LUT(x6385639E6385639E, a4, x9C9C9C9C9C9C9C9C, xE6E63BFDE6E63BFD, 0x93) + LUT(x5959C4CE5959C4CE, a2, x6B69C5DC6B69C5DC, xE6E63BFDE6E63BFD, 0x5D) + LUT(x5B53F53B5B53F53B, a4, x0A0AF5F50A0AF5F5, x5959C4CE5959C4CE, 0x6E) + LUT(x3, a6, x6385639E6385639E, x5B53F53B5B53F53B, 0xC6) + LUT(xFAF505FAFAF505FA, a3, a4, x0A0AF5F50A0AF5F5, 0x6D) + LUT(x6A65956A6A65956A, a3, x9C9C9C9C9C9C9C9C, xFAF505FAFAF505FA, 0xA6) + LUT(x8888CCCC8888CCCC, a1, a2, a5, 0x23) + LUT(x94E97A9494E97A94, x1C69B2DC1C69B2DC, x6A65956A6A65956A, x8888CCCC8888CCCC, 0x72) + LUT(x4, a6, x6A65956A6A65956A, x94E97A9494E97A94, 0xAC) + LUT(xA050A050A050A050, a1, a3, a4, 0x21) + LUT(xC1B87A2BC1B87A2B, xAAAAFF00AAAAFF00, x5B53F53B5B53F53B, x94E97A9494E97A94, 0xA4) + LUT(xE96016B7E96016B7, x8888CCCC8888CCCC, xA050A050A050A050, xC1B87A2BC1B87A2B, 0x96) + LUT(xE3CF1FD5E3CF1FD5, x88AA88AA88AA88AA, x6A65956A6A65956A, xE96016B7E96016B7, 0x3E) + LUT(x6776675B6776675B, xADAFF8A5ADAFF8A5, x94E97A9494E97A94, xE3CF1FD5E3CF1FD5, 0x6B) + LUT(x2, a6, xE96016B7E96016B7, x6776675B6776675B, 0xC6) + + + *out1 ^= x1; + *out2 ^= x2; + *out3 ^= x3; + *out4 ^= x4; +} + +__device__ static void s8 (const u32 a1, const u32 a2, const u32 a3, const u32 a4, const u32 a5, const u32 a6, u32 *out1, u32 *out2, u32 *out3, u32 *out4) +{ + LUT(xEEEE3333EEEE3333, a1, a2, a5, 0x9D) + LUT(xBBBBBBBBBBBBBBBB, a1, a1, a2, 0x83) + LUT(xDDDDAAAADDDDAAAA, a1, a2, a5, 0x5B) + LUT(x29295A5A29295A5A, a3, xBBBBBBBBBBBBBBBB, xDDDDAAAADDDDAAAA, 0x85) + LUT(xC729695AC729695A, a4, xEEEE3333EEEE3333, x29295A5A29295A5A, 0xA6) + LUT(x3BF77B7B3BF77B7B, a2, a5, xC729695AC729695A, 0xF9) + LUT(x2900FF002900FF00, a4, a5, x29295A5A29295A5A, 0x0E) + LUT(x56B3803F56B3803F, xBBBBBBBBBBBBBBBB, x3BF77B7B3BF77B7B, x2900FF002900FF00, 0x61) + LUT(x4, a6, xC729695AC729695A, x56B3803F56B3803F, 0x6C) + LUT(xFBFBFBFBFBFBFBFB, a1, a2, a3, 0xDF) + LUT(x3012B7B73012B7B7, a2, a5, xC729695AC729695A, 0xD4) + LUT(x34E9B34C34E9B34C, a4, xFBFBFBFBFBFBFBFB, x3012B7B73012B7B7, 0x69) + LUT(xBFEAEBBEBFEAEBBE, a1, x29295A5A29295A5A, x34E9B34C34E9B34C, 0x6F) + LUT(xFFAEAFFEFFAEAFFE, a3, xBBBBBBBBBBBBBBBB, xBFEAEBBEBFEAEBBE, 0xB9) + LUT(x2, a6, x34E9B34C34E9B34C, xFFAEAFFEFFAEAFFE, 0xC6) + LUT(xCFDE88BBCFDE88BB, a2, xDDDDAAAADDDDAAAA, x34E9B34C34E9B34C, 0x5C) + LUT(x3055574530555745, a1, xC729695AC729695A, xCFDE88BBCFDE88BB, 0x71) + LUT(x99DDEEEE99DDEEEE, a4, xBBBBBBBBBBBBBBBB, xDDDDAAAADDDDAAAA, 0xB9) + LUT(x693CD926693CD926, x3BF77B7B3BF77B7B, x34E9B34C34E9B34C, x99DDEEEE99DDEEEE, 0x69) + LUT(x3, a6, x3055574530555745, x693CD926693CD926, 0x6A) + LUT(x9955EE559955EE55, a1, a4, x99DDEEEE99DDEEEE, 0xE2) + LUT(x9D48FA949D48FA94, x3BF77B7B3BF77B7B, xBFEAEBBEBFEAEBBE, x9955EE559955EE55, 0x9C) + LUT(x1, a6, xC729695AC729695A, x9D48FA949D48FA94, 0x39) + + + *out1 ^= x1; + *out2 ^= x2; + *out3 ^= x3; + *out4 ^= x4; +} + +#else + +/* + * Bitslice DES S-boxes for x86 with MMX/SSE2/AVX and for typical RISC + * architectures. These use AND, OR, XOR, NOT, and AND-NOT gates. + * + * Gate counts: 49 44 46 33 48 46 46 41 + * Average: 44.125 + * + * Several same-gate-count expressions for each S-box are included (for use on + * different CPUs/GPUs). + * + * These Boolean expressions corresponding to DES S-boxes have been generated + * by Roman Rusakov for use in Openwall's + * John the Ripper password cracker: http://www.openwall.com/john/ + * Being mathematical formulas, they are not copyrighted and are free for reuse + * by anyone. + * + * This file (a specific representation of the S-box expressions, surrounding + * logic) is Copyright (c) 2011 by Solar Designer . + * Redistribution and use in source and binary forms, with or without + * modification, are permitted. (This is a heavily cut-down "BSD license".) + * + * The effort has been sponsored by Rapid7: http://www.rapid7.com + */ + +__device__ static void s1 (const u32 a1, const u32 a2, const u32 a3, const u32 a4, const u32 a5, const u32 a6, u32 *out1, u32 *out2, u32 *out3, u32 *out4) +{ + u32 x55005500, x5A0F5A0F, x3333FFFF, x66666666, x22226666, x2D2D6969, + x25202160; + u32 x00FFFF00, x33CCCC33, x4803120C, x2222FFFF, x6A21EDF3, x4A01CC93; + u32 x5555FFFF, x7F75FFFF, x00D20096, x7FA7FF69; + u32 x0A0A0000, x0AD80096, x00999900, x0AD99996; + u32 x22332233, x257AA5F0, x054885C0, xFAB77A3F, x2221EDF3, xD89697CC; + u32 x05B77AC0, x05F77AD6, x36C48529, x6391D07C, xBB0747B0; + u32 x4C460000, x4EDF9996, x2D4E49EA, xBBFFFFB0, x96B1B65A; + u32 x5AFF5AFF, x52B11215, x4201C010, x10B0D205; + u32 x00, x01, x10, x11, x20, x21, x30, x31; + + x55005500 = a1 & ~a5; + x5A0F5A0F = a4 ^ x55005500; + x3333FFFF = a3 | a6; + x66666666 = a1 ^ a3; + x22226666 = x3333FFFF & x66666666; + x2D2D6969 = a4 ^ x22226666; + x25202160 = x2D2D6969 & ~x5A0F5A0F; + + x00FFFF00 = a5 ^ a6; + x33CCCC33 = a3 ^ x00FFFF00; + x4803120C = x5A0F5A0F & ~x33CCCC33; + x2222FFFF = a6 | x22226666; + x6A21EDF3 = x4803120C ^ x2222FFFF; + x4A01CC93 = x6A21EDF3 & ~x25202160; + + x5555FFFF = a1 | a6; + x7F75FFFF = x6A21EDF3 | x5555FFFF; + x00D20096 = a5 & ~x2D2D6969; + x7FA7FF69 = x7F75FFFF ^ x00D20096; + + x0A0A0000 = a4 & ~x5555FFFF; + x0AD80096 = x00D20096 ^ x0A0A0000; + x00999900 = x00FFFF00 & ~x66666666; + x0AD99996 = x0AD80096 | x00999900; + + x22332233 = a3 & ~x55005500; + x257AA5F0 = x5A0F5A0F ^ x7F75FFFF; + x054885C0 = x257AA5F0 & ~x22332233; + xFAB77A3F = ~x054885C0; + x2221EDF3 = x3333FFFF & x6A21EDF3; + xD89697CC = xFAB77A3F ^ x2221EDF3; + x20 = x7FA7FF69 & ~a2; + x21 = x20 ^ xD89697CC; + *out3 ^= x21; + + x05B77AC0 = x00FFFF00 ^ x054885C0; + x05F77AD6 = x00D20096 | x05B77AC0; + x36C48529 = x3333FFFF ^ x05F77AD6; + x6391D07C = a1 ^ x36C48529; + xBB0747B0 = xD89697CC ^ x6391D07C; + x00 = x25202160 | a2; + x01 = x00 ^ xBB0747B0; + *out1 ^= x01; + + x4C460000 = x3333FFFF ^ x7F75FFFF; + x4EDF9996 = x0AD99996 | x4C460000; + x2D4E49EA = x6391D07C ^ x4EDF9996; + xBBFFFFB0 = x00FFFF00 | xBB0747B0; + x96B1B65A = x2D4E49EA ^ xBBFFFFB0; + x10 = x4A01CC93 | a2; + x11 = x10 ^ x96B1B65A; + *out2 ^= x11; + + x5AFF5AFF = a5 | x5A0F5A0F; + x52B11215 = x5AFF5AFF & ~x2D4E49EA; + x4201C010 = x4A01CC93 & x6391D07C; + x10B0D205 = x52B11215 ^ x4201C010; + x30 = x10B0D205 | a2; + x31 = x30 ^ x0AD99996; + *out4 ^= x31; +} + +__device__ static void s2 (const u32 a1, const u32 a2, const u32 a3, const u32 a4, const u32 a5, const u32 a6, u32 *out1, u32 *out2, u32 *out3, u32 *out4) +{ + u32 x33CC33CC; + u32 x55550000, x00AA00FF, x33BB33FF; + u32 x33CC0000, x11441144, x11BB11BB, x003311BB; + u32 x00000F0F, x336600FF, x332200FF, x332200F0; + u32 x0302000F, xAAAAAAAA, xA9A8AAA5, x33CCCC33, x33CCC030, x9A646A95; + u32 x00333303, x118822B8, xA8208805, x3CC3C33C, x94E34B39; + u32 x0331330C, x3FF3F33C, xA9DF596A, xA9DF5F6F, x962CAC53; + u32 xA9466A6A, x3DA52153, x29850143, x33C0330C, x1A45324F; + u32 x0A451047, xBBDFDD7B, xB19ACD3C; + u32 x00, x01, x10, x11, x20, x21, x30, x31; + + x33CC33CC = a2 ^ a5; + + x55550000 = a1 & ~a6; + x00AA00FF = a5 & ~x55550000; + x33BB33FF = a2 | x00AA00FF; + + x33CC0000 = x33CC33CC & ~a6; + x11441144 = a1 & x33CC33CC; + x11BB11BB = a5 ^ x11441144; + x003311BB = x11BB11BB & ~x33CC0000; + + x00000F0F = a3 & a6; + x336600FF = x00AA00FF ^ x33CC0000; + x332200FF = x33BB33FF & x336600FF; + x332200F0 = x332200FF & ~x00000F0F; + + x0302000F = a3 & x332200FF; + xAAAAAAAA = ~a1; + xA9A8AAA5 = x0302000F ^ xAAAAAAAA; + x33CCCC33 = a6 ^ x33CC33CC; + x33CCC030 = x33CCCC33 & ~x00000F0F; + x9A646A95 = xA9A8AAA5 ^ x33CCC030; + x10 = a4 & ~x332200F0; + x11 = x10 ^ x9A646A95; + *out2 ^= x11; + + x00333303 = a2 & ~x33CCC030; + x118822B8 = x11BB11BB ^ x00333303; + xA8208805 = xA9A8AAA5 & ~x118822B8; + x3CC3C33C = a3 ^ x33CCCC33; + x94E34B39 = xA8208805 ^ x3CC3C33C; + x00 = x33BB33FF & ~a4; + x01 = x00 ^ x94E34B39; + *out1 ^= x01; + + x0331330C = x0302000F ^ x00333303; + x3FF3F33C = x3CC3C33C | x0331330C; + xA9DF596A = x33BB33FF ^ x9A646A95; + xA9DF5F6F = x00000F0F | xA9DF596A; + x962CAC53 = x3FF3F33C ^ xA9DF5F6F; + + xA9466A6A = x332200FF ^ x9A646A95; + x3DA52153 = x94E34B39 ^ xA9466A6A; + x29850143 = xA9DF5F6F & x3DA52153; + x33C0330C = x33CC33CC & x3FF3F33C; + x1A45324F = x29850143 ^ x33C0330C; + x20 = x1A45324F | a4; + x21 = x20 ^ x962CAC53; + *out3 ^= x21; + + x0A451047 = x1A45324F & ~x118822B8; + xBBDFDD7B = x33CCCC33 | xA9DF596A; + xB19ACD3C = x0A451047 ^ xBBDFDD7B; + x30 = x003311BB | a4; + x31 = x30 ^ xB19ACD3C; + *out4 ^= x31; +} + +__device__ static void s3 (const u32 a1, const u32 a2, const u32 a3, const u32 a4, const u32 a5, const u32 a6, u32 *out1, u32 *out2, u32 *out3, u32 *out4) +{ + u32 x44444444, x0F0FF0F0, x4F4FF4F4, x00FFFF00, x00AAAA00, x4FE55EF4; + u32 x3C3CC3C3, x3C3C0000, x7373F4F4, x0C840A00; + u32 x00005EF4, x00FF5EFF, x00555455, x3C699796; + u32 x000FF000, x55AA55AA, x26D9A15E, x2FDFAF5F, x2FD00F5F; + u32 x55AAFFAA, x28410014, x000000FF, x000000CC, x284100D8; + u32 x204100D0, x3C3CC3FF, x1C3CC32F, x4969967A; + u32 x4CC44CC4, x40C040C0, xC3C33C3C, x9669C396, xD6A98356; + u32 xD6E9C3D6, x4CEEEEC4, x9A072D12, x001A000B, x9A1F2D1B; + u32 x00, x01, x10, x11, x20, x21, x30, x31; + + x44444444 = a1 & ~a2; + x0F0FF0F0 = a3 ^ a6; + x4F4FF4F4 = x44444444 | x0F0FF0F0; + x00FFFF00 = a4 ^ a6; + x00AAAA00 = x00FFFF00 & ~a1; + x4FE55EF4 = x4F4FF4F4 ^ x00AAAA00; + + x3C3CC3C3 = a2 ^ x0F0FF0F0; + x3C3C0000 = x3C3CC3C3 & ~a6; + x7373F4F4 = x4F4FF4F4 ^ x3C3C0000; + x0C840A00 = x4FE55EF4 & ~x7373F4F4; + + x00005EF4 = a6 & x4FE55EF4; + x00FF5EFF = a4 | x00005EF4; + x00555455 = a1 & x00FF5EFF; + x3C699796 = x3C3CC3C3 ^ x00555455; + x30 = x4FE55EF4 & ~a5; + x31 = x30 ^ x3C699796; + *out4 ^= x31; + + x000FF000 = x0F0FF0F0 & x00FFFF00; + x55AA55AA = a1 ^ a4; + x26D9A15E = x7373F4F4 ^ x55AA55AA; + x2FDFAF5F = a3 | x26D9A15E; + x2FD00F5F = x2FDFAF5F & ~x000FF000; + + x55AAFFAA = x00AAAA00 | x55AA55AA; + x28410014 = x3C699796 & ~x55AAFFAA; + x000000FF = a4 & a6; + x000000CC = x000000FF & ~a2; + x284100D8 = x28410014 ^ x000000CC; + + x204100D0 = x7373F4F4 & x284100D8; + x3C3CC3FF = x3C3CC3C3 | x000000FF; + x1C3CC32F = x3C3CC3FF & ~x204100D0; + x4969967A = a1 ^ x1C3CC32F; + x10 = x2FD00F5F & a5; + x11 = x10 ^ x4969967A; + *out2 ^= x11; + + x4CC44CC4 = x4FE55EF4 & ~a2; + x40C040C0 = x4CC44CC4 & ~a3; + xC3C33C3C = ~x3C3CC3C3; + x9669C396 = x55AAFFAA ^ xC3C33C3C; + xD6A98356 = x40C040C0 ^ x9669C396; + x00 = a5 & ~x0C840A00; + x01 = x00 ^ xD6A98356; + *out1 ^= x01; + + xD6E9C3D6 = x40C040C0 | x9669C396; + x4CEEEEC4 = x00AAAA00 | x4CC44CC4; + x9A072D12 = xD6E9C3D6 ^ x4CEEEEC4; + x001A000B = a4 & ~x4FE55EF4; + x9A1F2D1B = x9A072D12 | x001A000B; + x20 = a5 & ~x284100D8; + x21 = x20 ^ x9A1F2D1B; + *out3 ^= x21; +} + +__device__ static void s4 (const u32 a1, const u32 a2, const u32 a3, const u32 a4, const u32 a5, const u32 a6, u32 *out1, u32 *out2, u32 *out3, u32 *out4) +{ + u32 x5A5A5A5A, x0F0FF0F0; + u32 x33FF33FF, x33FFCC00, x0C0030F0, x0C0CC0C0, x0CF3C03F, x5EFBDA7F, + x52FBCA0F, x61C8F93C; + u32 x00C0C03C, x0F0F30C0, x3B92A366, x30908326, x3C90B3D6; + u32 x33CC33CC, x0C0CFFFF, x379E5C99, x04124C11, x56E9861E, xA91679E1; + u32 x9586CA37, x8402C833, x84C2C83F, xB35C94A6; + u32 x00, x01, x10, x11, x20, x21, x30, x31; + + x5A5A5A5A = a1 ^ a3; + x0F0FF0F0 = a3 ^ a5; + x33FF33FF = a2 | a4; + x33FFCC00 = a5 ^ x33FF33FF; + x0C0030F0 = x0F0FF0F0 & ~x33FFCC00; + x0C0CC0C0 = x0F0FF0F0 & ~a2; + x0CF3C03F = a4 ^ x0C0CC0C0; + x5EFBDA7F = x5A5A5A5A | x0CF3C03F; + x52FBCA0F = x5EFBDA7F & ~x0C0030F0; + x61C8F93C = a2 ^ x52FBCA0F; + + x00C0C03C = x0CF3C03F & x61C8F93C; + x0F0F30C0 = x0F0FF0F0 & ~x00C0C03C; + x3B92A366 = x5A5A5A5A ^ x61C8F93C; + x30908326 = x3B92A366 & ~x0F0F30C0; + x3C90B3D6 = x0C0030F0 ^ x30908326; + + x33CC33CC = a2 ^ a4; + x0C0CFFFF = a5 | x0C0CC0C0; + x379E5C99 = x3B92A366 ^ x0C0CFFFF; + x04124C11 = x379E5C99 & ~x33CC33CC; + x56E9861E = x52FBCA0F ^ x04124C11; + x00 = a6 & ~x3C90B3D6; + x01 = x00 ^ x56E9861E; + *out1 ^= x01; + + xA91679E1 = ~x56E9861E; + x10 = x3C90B3D6 & ~a6; + x11 = x10 ^ xA91679E1; + *out2 ^= x11; + + x9586CA37 = x3C90B3D6 ^ xA91679E1; + x8402C833 = x9586CA37 & ~x33CC33CC; + x84C2C83F = x00C0C03C | x8402C833; + xB35C94A6 = x379E5C99 ^ x84C2C83F; + x20 = x61C8F93C | a6; + x21 = x20 ^ xB35C94A6; + *out3 ^= x21; + + x30 = a6 & x61C8F93C; + x31 = x30 ^ xB35C94A6; + *out4 ^= x31; +} + +__device__ static void s5 (const u32 a1, const u32 a2, const u32 a3, const u32 a4, const u32 a5, const u32 a6, u32 *out1, u32 *out2, u32 *out3, u32 *out4) +{ + u32 x77777777, x77770000, x22225555, x11116666, x1F1F6F6F; + u32 x70700000, x43433333, x00430033, x55557777, x55167744, x5A19784B; + u32 x5A1987B4, x7A3BD7F5, x003B00F5, x221955A0, x05050707, x271C52A7; + u32 x2A2A82A0, x6969B193, x1FE06F90, x16804E00, xE97FB1FF; + u32 x43403302, x35CAED30, x37DEFFB7, x349ECCB5, x0B01234A; + u32 x101884B4, x0FF8EB24, x41413333, x4FF9FB37, x4FC2FBC2; + u32 x22222222, x16BCEE97, x0F080B04, x19B4E593; + u32 x5C5C5C5C, x4448184C, x2DDABE71, x6992A63D; + u32 x00, x01, x10, x11, x20, x21, x30, x31; + + x77777777 = a1 | a3; + x77770000 = x77777777 & ~a6; + x22225555 = a1 ^ x77770000; + x11116666 = a3 ^ x22225555; + x1F1F6F6F = a4 | x11116666; + + x70700000 = x77770000 & ~a4; + x43433333 = a3 ^ x70700000; + x00430033 = a5 & x43433333; + x55557777 = a1 | x11116666; + x55167744 = x00430033 ^ x55557777; + x5A19784B = a4 ^ x55167744; + + x5A1987B4 = a6 ^ x5A19784B; + x7A3BD7F5 = x22225555 | x5A1987B4; + x003B00F5 = a5 & x7A3BD7F5; + x221955A0 = x22225555 ^ x003B00F5; + x05050707 = a4 & x55557777; + x271C52A7 = x221955A0 ^ x05050707; + + x2A2A82A0 = x7A3BD7F5 & ~a1; + x6969B193 = x43433333 ^ x2A2A82A0; + x1FE06F90 = a5 ^ x1F1F6F6F; + x16804E00 = x1FE06F90 & ~x6969B193; + xE97FB1FF = ~x16804E00; + x20 = xE97FB1FF & ~a2; + x21 = x20 ^ x5A19784B; + *out3 ^= x21; + + x43403302 = x43433333 & ~x003B00F5; + x35CAED30 = x2A2A82A0 ^ x1FE06F90; + x37DEFFB7 = x271C52A7 | x35CAED30; + x349ECCB5 = x37DEFFB7 & ~x43403302; + x0B01234A = x1F1F6F6F & ~x349ECCB5; + + x101884B4 = x5A1987B4 & x349ECCB5; + x0FF8EB24 = x1FE06F90 ^ x101884B4; + x41413333 = x43433333 & x55557777; + x4FF9FB37 = x0FF8EB24 | x41413333; + x4FC2FBC2 = x003B00F5 ^ x4FF9FB37; + x30 = x4FC2FBC2 & a2; + x31 = x30 ^ x271C52A7; + *out4 ^= x31; + + x22222222 = a1 ^ x77777777; + x16BCEE97 = x349ECCB5 ^ x22222222; + x0F080B04 = a4 & x0FF8EB24; + x19B4E593 = x16BCEE97 ^ x0F080B04; + x00 = x0B01234A | a2; + x01 = x00 ^ x19B4E593; + *out1 ^= x01; + + x5C5C5C5C = x1F1F6F6F ^ x43433333; + x4448184C = x5C5C5C5C & ~x19B4E593; + x2DDABE71 = x22225555 ^ x0FF8EB24; + x6992A63D = x4448184C ^ x2DDABE71; + x10 = x1F1F6F6F & a2; + x11 = x10 ^ x6992A63D; + *out2 ^= x11; +} + +__device__ static void s6 (const u32 a1, const u32 a2, const u32 a3, const u32 a4, const u32 a5, const u32 a6, u32 *out1, u32 *out2, u32 *out3, u32 *out4) +{ + u32 x33CC33CC; + u32 x3333FFFF, x11115555, x22DD6699, x22DD9966, x00220099; + u32 x00551144, x33662277, x5A5A5A5A, x7B7E7A7F, x59A31CE6; + u32 x09030C06, x09030000, x336622FF, x3A6522FF; + u32 x484D494C, x0000B6B3, x0F0FB9BC, x00FC00F9, x0FFFB9FD; + u32 x5DF75DF7, x116600F7, x1E69B94B, x1668B94B; + u32 x7B7B7B7B, x411E5984, x1FFFFDFD, x5EE1A479; + u32 x3CB4DFD2, x004B002D, xB7B2B6B3, xCCC9CDC8, xCC82CDE5; + u32 x0055EEBB, x5A5AECE9, x0050ECA9, xC5CAC1CE, xC59A2D67; + u32 x00, x01, x10, x11, x20, x21, x30, x31; + + x33CC33CC = a2 ^ a5; + + x3333FFFF = a2 | a6; + x11115555 = a1 & x3333FFFF; + x22DD6699 = x33CC33CC ^ x11115555; + x22DD9966 = a6 ^ x22DD6699; + x00220099 = a5 & ~x22DD9966; + + x00551144 = a1 & x22DD9966; + x33662277 = a2 ^ x00551144; + x5A5A5A5A = a1 ^ a3; + x7B7E7A7F = x33662277 | x5A5A5A5A; + x59A31CE6 = x22DD6699 ^ x7B7E7A7F; + + x09030C06 = a3 & x59A31CE6; + x09030000 = x09030C06 & ~a6; + x336622FF = x00220099 | x33662277; + x3A6522FF = x09030000 ^ x336622FF; + x30 = x3A6522FF & a4; + x31 = x30 ^ x59A31CE6; + *out4 ^= x31; + + x484D494C = a2 ^ x7B7E7A7F; + x0000B6B3 = a6 & ~x484D494C; + x0F0FB9BC = a3 ^ x0000B6B3; + x00FC00F9 = a5 & ~x09030C06; + x0FFFB9FD = x0F0FB9BC | x00FC00F9; + + x5DF75DF7 = a1 | x59A31CE6; + x116600F7 = x336622FF & x5DF75DF7; + x1E69B94B = x0F0FB9BC ^ x116600F7; + x1668B94B = x1E69B94B & ~x09030000; + x20 = x00220099 | a4; + x21 = x20 ^ x1668B94B; + *out3 ^= x21; + + x7B7B7B7B = a2 | x5A5A5A5A; + x411E5984 = x3A6522FF ^ x7B7B7B7B; + x1FFFFDFD = x11115555 | x0FFFB9FD; + x5EE1A479 = x411E5984 ^ x1FFFFDFD; + + x3CB4DFD2 = x22DD6699 ^ x1E69B94B; + x004B002D = a5 & ~x3CB4DFD2; + xB7B2B6B3 = ~x484D494C; + xCCC9CDC8 = x7B7B7B7B ^ xB7B2B6B3; + xCC82CDE5 = x004B002D ^ xCCC9CDC8; + x10 = xCC82CDE5 & ~a4; + x11 = x10 ^ x5EE1A479; + *out2 ^= x11; + + x0055EEBB = a6 ^ x00551144; + x5A5AECE9 = a1 ^ x0F0FB9BC; + x0050ECA9 = x0055EEBB & x5A5AECE9; + xC5CAC1CE = x09030C06 ^ xCCC9CDC8; + xC59A2D67 = x0050ECA9 ^ xC5CAC1CE; + x00 = x0FFFB9FD & ~a4; + x01 = x00 ^ xC59A2D67; + *out1 ^= x01; +} + +__device__ static void s7 (const u32 a1, const u32 a2, const u32 a3, const u32 a4, const u32 a5, const u32 a6, u32 *out1, u32 *out2, u32 *out3, u32 *out4) +{ + u32 x0FF00FF0, x3CC33CC3, x00003CC3, x0F000F00, x5A555A55, x00001841; + u32 x00000F00, x33333C33, x7B777E77, x0FF0F00F, x74878E78; + u32 x003C003C, x5A7D5A7D, x333300F0, x694E5A8D; + u32 x0FF0CCCC, x000F0303, x5A505854, x33CC000F, x699C585B; + u32 x7F878F78, x21101013, x7F979F7B, x30030CC0, x4F9493BB; + u32 x6F9CDBFB, x0000DBFB, x00005151, x26DAC936, x26DA9867; + u32 x27DA9877, x27DA438C, x2625C9C9, x27FFCBCD; + u32 x27FF1036, x27FF103E, xB06B6C44, x97947C7A; + u32 x00, x01, x10, x11, x20, x21, x30, x31; + + x0FF00FF0 = a4 ^ a5; + x3CC33CC3 = a3 ^ x0FF00FF0; + x00003CC3 = a6 & x3CC33CC3; + x0F000F00 = a4 & x0FF00FF0; + x5A555A55 = a2 ^ x0F000F00; + x00001841 = x00003CC3 & x5A555A55; + + x00000F00 = a6 & x0F000F00; + x33333C33 = a3 ^ x00000F00; + x7B777E77 = x5A555A55 | x33333C33; + x0FF0F00F = a6 ^ x0FF00FF0; + x74878E78 = x7B777E77 ^ x0FF0F00F; + x30 = a1 & ~x00001841; + x31 = x30 ^ x74878E78; + *out4 ^= x31; + + x003C003C = a5 & ~x3CC33CC3; + x5A7D5A7D = x5A555A55 | x003C003C; + x333300F0 = x00003CC3 ^ x33333C33; + x694E5A8D = x5A7D5A7D ^ x333300F0; + + x0FF0CCCC = x00003CC3 ^ x0FF0F00F; + x000F0303 = a4 & ~x0FF0CCCC; + x5A505854 = x5A555A55 & ~x000F0303; + x33CC000F = a5 ^ x333300F0; + x699C585B = x5A505854 ^ x33CC000F; + + x7F878F78 = x0F000F00 | x74878E78; + x21101013 = a3 & x699C585B; + x7F979F7B = x7F878F78 | x21101013; + x30030CC0 = x3CC33CC3 & ~x0FF0F00F; + x4F9493BB = x7F979F7B ^ x30030CC0; + x00 = x4F9493BB & ~a1; + x01 = x00 ^ x694E5A8D; + *out1 ^= x01; + + x6F9CDBFB = x699C585B | x4F9493BB; + x0000DBFB = a6 & x6F9CDBFB; + x00005151 = a2 & x0000DBFB; + x26DAC936 = x694E5A8D ^ x4F9493BB; + x26DA9867 = x00005151 ^ x26DAC936; + + x27DA9877 = x21101013 | x26DA9867; + x27DA438C = x0000DBFB ^ x27DA9877; + x2625C9C9 = a5 ^ x26DAC936; + x27FFCBCD = x27DA438C | x2625C9C9; + x20 = x27FFCBCD & a1; + x21 = x20 ^ x699C585B; + *out3 ^= x21; + + x27FF1036 = x0000DBFB ^ x27FFCBCD; + x27FF103E = x003C003C | x27FF1036; + xB06B6C44 = ~x4F9493BB; + x97947C7A = x27FF103E ^ xB06B6C44; + x10 = x97947C7A & ~a1; + x11 = x10 ^ x26DA9867; + *out2 ^= x11; +} + +__device__ static void s8 (const u32 a1, const u32 a2, const u32 a3, const u32 a4, const u32 a5, const u32 a6, u32 *out1, u32 *out2, u32 *out3, u32 *out4) +{ + u32 x0C0C0C0C, x0000F0F0, x00FFF00F, x00555005, x00515001; + u32 x33000330, x77555775, x30303030, x3030CFCF, x30104745, x30555745; + u32 xFF000FF0, xCF1048B5, x080A080A, xC71A40BF, xCB164CB3; + u32 x9E4319E6, x000019E6, xF429738C, xF4296A6A, xC729695A; + u32 xC47C3D2F, xF77F3F3F, x9E43E619, x693CD926; + u32 xF719A695, xF4FF73FF, x03E6D56A, x56B3803F; + u32 xF700A600, x61008000, x03B7856B, x62B7056B; + u32 x00, x01, x10, x11, x20, x21, x30, x31; + + x0C0C0C0C = a3 & ~a2; + x0000F0F0 = a5 & ~a3; + x00FFF00F = a4 ^ x0000F0F0; + x00555005 = a1 & x00FFF00F; + x00515001 = x00555005 & ~x0C0C0C0C; + + x33000330 = a2 & ~x00FFF00F; + x77555775 = a1 | x33000330; + x30303030 = a2 & ~a3; + x3030CFCF = a5 ^ x30303030; + x30104745 = x77555775 & x3030CFCF; + x30555745 = x00555005 | x30104745; + + xFF000FF0 = ~x00FFF00F; + xCF1048B5 = x30104745 ^ xFF000FF0; + x080A080A = a3 & ~x77555775; + xC71A40BF = xCF1048B5 ^ x080A080A; + xCB164CB3 = x0C0C0C0C ^ xC71A40BF; + x10 = x00515001 | a6; + x11 = x10 ^ xCB164CB3; + *out2 ^= x11; + + x9E4319E6 = a1 ^ xCB164CB3; + x000019E6 = a5 & x9E4319E6; + xF429738C = a2 ^ xC71A40BF; + xF4296A6A = x000019E6 ^ xF429738C; + xC729695A = x33000330 ^ xF4296A6A; + + xC47C3D2F = x30555745 ^ xF4296A6A; + xF77F3F3F = a2 | xC47C3D2F; + x9E43E619 = a5 ^ x9E4319E6; + x693CD926 = xF77F3F3F ^ x9E43E619; + x20 = x30555745 & a6; + x21 = x20 ^ x693CD926; + *out3 ^= x21; + + xF719A695 = x3030CFCF ^ xC729695A; + xF4FF73FF = a4 | xF429738C; + x03E6D56A = xF719A695 ^ xF4FF73FF; + x56B3803F = a1 ^ x03E6D56A; + x30 = x56B3803F & a6; + x31 = x30 ^ xC729695A; + *out4 ^= x31; + + xF700A600 = xF719A695 & ~a4; + x61008000 = x693CD926 & xF700A600; + x03B7856B = x00515001 ^ x03E6D56A; + x62B7056B = x61008000 ^ x03B7856B; + x00 = x62B7056B | a6; + x01 = x00 ^ xC729695A; + *out1 ^= x01; +} + +#endif + +#define SWAP(a, b) { u32 tmp=a;a=b;b=tmp; } + +#define DATASWAP \ + SWAP(D00, D32); \ + SWAP(D01, D33); \ + SWAP(D02, D34); \ + SWAP(D03, D35); \ + SWAP(D04, D36); \ + SWAP(D05, D37); \ + SWAP(D06, D38); \ + SWAP(D07, D39); \ + SWAP(D08, D40); \ + SWAP(D09, D41); \ + SWAP(D10, D42); \ + SWAP(D11, D43); \ + SWAP(D12, D44); \ + SWAP(D13, D45); \ + SWAP(D14, D46); \ + SWAP(D15, D47); \ + SWAP(D16, D48); \ + SWAP(D17, D49); \ + SWAP(D18, D50); \ + SWAP(D19, D51); \ + SWAP(D20, D52); \ + SWAP(D21, D53); \ + SWAP(D22, D54); \ + SWAP(D23, D55); \ + SWAP(D24, D56); \ + SWAP(D25, D57); \ + SWAP(D26, D58); \ + SWAP(D27, D59); \ + SWAP(D28, D60); \ + SWAP(D29, D61); \ + SWAP(D30, D62); \ + SWAP(D31, D63); + +#define KEYSET00 { k00 = K08; k01 = K44; k02 = K29; k03 = K52; k04 = K42; k05 = K14; k06 = K28; k07 = K49; k08 = K01; k09 = K07; k10 = K16; k11 = K36; k12 = K02; k13 = K30; k14 = K22; k15 = K21; k16 = K38; k17 = K50; k18 = K51; k19 = K00; k20 = K31; k21 = K23; k22 = K15; k23 = K35; k24 = K19; k25 = K24; k26 = K34; k27 = K47; k28 = K32; k29 = K03; k30 = K41; k31 = K26; k32 = K04; k33 = K46; k34 = K20; k35 = K25; k36 = K53; k37 = K18; k38 = K33; k39 = K55; k40 = K13; k41 = K17; k42 = K39; k43 = K12; k44 = K11; k45 = K54; k46 = K48; k47 = K27; } +#define KEYSET10 { k00 = K49; k01 = K28; k02 = K45; k03 = K36; k04 = K01; k05 = K30; k06 = K44; k07 = K08; k08 = K42; k09 = K23; k10 = K00; k11 = K52; k12 = K43; k13 = K14; k14 = K38; k15 = K37; k16 = K22; k17 = K09; k18 = K35; k19 = K16; k20 = K15; k21 = K07; k22 = K31; k23 = K51; k24 = K03; k25 = K40; k26 = K46; k27 = K04; k28 = K20; k29 = K19; k30 = K53; k31 = K10; k32 = K47; k33 = K34; k34 = K32; k35 = K13; k36 = K41; k37 = K06; k38 = K17; k39 = K12; k40 = K25; k41 = K33; k42 = K27; k43 = K55; k44 = K54; k45 = K11; k46 = K05; k47 = K39; } +#define KEYSET01 { k00 = K01; k01 = K37; k02 = K22; k03 = K45; k04 = K35; k05 = K07; k06 = K21; k07 = K42; k08 = K51; k09 = K00; k10 = K09; k11 = K29; k12 = K52; k13 = K23; k14 = K15; k15 = K14; k16 = K31; k17 = K43; k18 = K44; k19 = K50; k20 = K49; k21 = K16; k22 = K08; k23 = K28; k24 = K12; k25 = K17; k26 = K27; k27 = K40; k28 = K25; k29 = K55; k30 = K34; k31 = K19; k32 = K24; k33 = K39; k34 = K13; k35 = K18; k36 = K46; k37 = K11; k38 = K26; k39 = K48; k40 = K06; k41 = K10; k42 = K32; k43 = K05; k44 = K04; k45 = K47; k46 = K41; k47 = K20; } +#define KEYSET11 { k00 = K35; k01 = K14; k02 = K31; k03 = K22; k04 = K44; k05 = K16; k06 = K30; k07 = K51; k08 = K28; k09 = K09; k10 = K43; k11 = K38; k12 = K29; k13 = K00; k14 = K49; k15 = K23; k16 = K08; k17 = K52; k18 = K21; k19 = K02; k20 = K01; k21 = K50; k22 = K42; k23 = K37; k24 = K48; k25 = K26; k26 = K32; k27 = K17; k28 = K06; k29 = K05; k30 = K39; k31 = K55; k32 = K33; k33 = K20; k34 = K18; k35 = K54; k36 = K27; k37 = K47; k38 = K03; k39 = K53; k40 = K11; k41 = K19; k42 = K13; k43 = K41; k44 = K40; k45 = K24; k46 = K46; k47 = K25; } +#define KEYSET02 { k00 = K44; k01 = K23; k02 = K08; k03 = K31; k04 = K21; k05 = K50; k06 = K07; k07 = K28; k08 = K37; k09 = K43; k10 = K52; k11 = K15; k12 = K38; k13 = K09; k14 = K01; k15 = K00; k16 = K42; k17 = K29; k18 = K30; k19 = K36; k20 = K35; k21 = K02; k22 = K51; k23 = K14; k24 = K53; k25 = K03; k26 = K13; k27 = K26; k28 = K11; k29 = K41; k30 = K20; k31 = K05; k32 = K10; k33 = K25; k34 = K54; k35 = K04; k36 = K32; k37 = K24; k38 = K12; k39 = K34; k40 = K47; k41 = K55; k42 = K18; k43 = K46; k44 = K17; k45 = K33; k46 = K27; k47 = K06; } +#define KEYSET12 { k00 = K21; k01 = K00; k02 = K42; k03 = K08; k04 = K30; k05 = K02; k06 = K16; k07 = K37; k08 = K14; k09 = K52; k10 = K29; k11 = K49; k12 = K15; k13 = K43; k14 = K35; k15 = K09; k16 = K51; k17 = K38; k18 = K07; k19 = K45; k20 = K44; k21 = K36; k22 = K28; k23 = K23; k24 = K34; k25 = K12; k26 = K18; k27 = K03; k28 = K47; k29 = K46; k30 = K25; k31 = K41; k32 = K19; k33 = K06; k34 = K04; k35 = K40; k36 = K13; k37 = K33; k38 = K48; k39 = K39; k40 = K24; k41 = K05; k42 = K54; k43 = K27; k44 = K26; k45 = K10; k46 = K32; k47 = K11; } +#define KEYSET03 { k00 = K30; k01 = K09; k02 = K51; k03 = K42; k04 = K07; k05 = K36; k06 = K50; k07 = K14; k08 = K23; k09 = K29; k10 = K38; k11 = K01; k12 = K49; k13 = K52; k14 = K44; k15 = K43; k16 = K28; k17 = K15; k18 = K16; k19 = K22; k20 = K21; k21 = K45; k22 = K37; k23 = K00; k24 = K39; k25 = K48; k26 = K54; k27 = K12; k28 = K24; k29 = K27; k30 = K06; k31 = K46; k32 = K55; k33 = K11; k34 = K40; k35 = K17; k36 = K18; k37 = K10; k38 = K53; k39 = K20; k40 = K33; k41 = K41; k42 = K04; k43 = K32; k44 = K03; k45 = K19; k46 = K13; k47 = K47; } +#define KEYSET13 { k00 = K07; k01 = K43; k02 = K28; k03 = K51; k04 = K16; k05 = K45; k06 = K02; k07 = K23; k08 = K00; k09 = K38; k10 = K15; k11 = K35; k12 = K01; k13 = K29; k14 = K21; k15 = K52; k16 = K37; k17 = K49; k18 = K50; k19 = K31; k20 = K30; k21 = K22; k22 = K14; k23 = K09; k24 = K20; k25 = K53; k26 = K04; k27 = K48; k28 = K33; k29 = K32; k30 = K11; k31 = K27; k32 = K05; k33 = K47; k34 = K17; k35 = K26; k36 = K54; k37 = K19; k38 = K34; k39 = K25; k40 = K10; k41 = K46; k42 = K40; k43 = K13; k44 = K12; k45 = K55; k46 = K18; k47 = K24; } +#define KEYSET04 { k00 = K16; k01 = K52; k02 = K37; k03 = K28; k04 = K50; k05 = K22; k06 = K36; k07 = K00; k08 = K09; k09 = K15; k10 = K49; k11 = K44; k12 = K35; k13 = K38; k14 = K30; k15 = K29; k16 = K14; k17 = K01; k18 = K02; k19 = K08; k20 = K07; k21 = K31; k22 = K23; k23 = K43; k24 = K25; k25 = K34; k26 = K40; k27 = K53; k28 = K10; k29 = K13; k30 = K47; k31 = K32; k32 = K41; k33 = K24; k34 = K26; k35 = K03; k36 = K04; k37 = K55; k38 = K39; k39 = K06; k40 = K19; k41 = K27; k42 = K17; k43 = K18; k44 = K48; k45 = K05; k46 = K54; k47 = K33; } +#define KEYSET14 { k00 = K50; k01 = K29; k02 = K14; k03 = K37; k04 = K02; k05 = K31; k06 = K45; k07 = K09; k08 = K43; k09 = K49; k10 = K01; k11 = K21; k12 = K44; k13 = K15; k14 = K07; k15 = K38; k16 = K23; k17 = K35; k18 = K36; k19 = K42; k20 = K16; k21 = K08; k22 = K00; k23 = K52; k24 = K06; k25 = K39; k26 = K17; k27 = K34; k28 = K19; k29 = K18; k30 = K24; k31 = K13; k32 = K46; k33 = K33; k34 = K03; k35 = K12; k36 = K40; k37 = K05; k38 = K20; k39 = K11; k40 = K55; k41 = K32; k42 = K26; k43 = K54; k44 = K53; k45 = K41; k46 = K04; k47 = K10; } +#define KEYSET05 { k00 = K02; k01 = K38; k02 = K23; k03 = K14; k04 = K36; k05 = K08; k06 = K22; k07 = K43; k08 = K52; k09 = K01; k10 = K35; k11 = K30; k12 = K21; k13 = K49; k14 = K16; k15 = K15; k16 = K00; k17 = K44; k18 = K45; k19 = K51; k20 = K50; k21 = K42; k22 = K09; k23 = K29; k24 = K11; k25 = K20; k26 = K26; k27 = K39; k28 = K55; k29 = K54; k30 = K33; k31 = K18; k32 = K27; k33 = K10; k34 = K12; k35 = K48; k36 = K17; k37 = K41; k38 = K25; k39 = K47; k40 = K05; k41 = K13; k42 = K03; k43 = K04; k44 = K34; k45 = K46; k46 = K40; k47 = K19; } +#define KEYSET15 { k00 = K36; k01 = K15; k02 = K00; k03 = K23; k04 = K45; k05 = K42; k06 = K31; k07 = K52; k08 = K29; k09 = K35; k10 = K44; k11 = K07; k12 = K30; k13 = K01; k14 = K50; k15 = K49; k16 = K09; k17 = K21; k18 = K22; k19 = K28; k20 = K02; k21 = K51; k22 = K43; k23 = K38; k24 = K47; k25 = K25; k26 = K03; k27 = K20; k28 = K05; k29 = K04; k30 = K10; k31 = K54; k32 = K32; k33 = K19; k34 = K48; k35 = K53; k36 = K26; k37 = K46; k38 = K06; k39 = K24; k40 = K41; k41 = K18; k42 = K12; k43 = K40; k44 = K39; k45 = K27; k46 = K17; k47 = K55; } +#define KEYSET06 { k00 = K45; k01 = K49; k02 = K09; k03 = K00; k04 = K22; k05 = K51; k06 = K08; k07 = K29; k08 = K38; k09 = K44; k10 = K21; k11 = K16; k12 = K07; k13 = K35; k14 = K02; k15 = K01; k16 = K43; k17 = K30; k18 = K31; k19 = K37; k20 = K36; k21 = K28; k22 = K52; k23 = K15; k24 = K24; k25 = K06; k26 = K12; k27 = K25; k28 = K41; k29 = K40; k30 = K19; k31 = K04; k32 = K13; k33 = K55; k34 = K53; k35 = K34; k36 = K03; k37 = K27; k38 = K11; k39 = K33; k40 = K46; k41 = K54; k42 = K48; k43 = K17; k44 = K20; k45 = K32; k46 = K26; k47 = K05; } +#define KEYSET16 { k00 = K22; k01 = K01; k02 = K43; k03 = K09; k04 = K31; k05 = K28; k06 = K42; k07 = K38; k08 = K15; k09 = K21; k10 = K30; k11 = K50; k12 = K16; k13 = K44; k14 = K36; k15 = K35; k16 = K52; k17 = K07; k18 = K08; k19 = K14; k20 = K45; k21 = K37; k22 = K29; k23 = K49; k24 = K33; k25 = K11; k26 = K48; k27 = K06; k28 = K46; k29 = K17; k30 = K55; k31 = K40; k32 = K18; k33 = K05; k34 = K34; k35 = K39; k36 = K12; k37 = K32; k38 = K47; k39 = K10; k40 = K27; k41 = K04; k42 = K53; k43 = K26; k44 = K25; k45 = K13; k46 = K03; k47 = K41; } +#define KEYSET07 { k00 = K31; k01 = K35; k02 = K52; k03 = K43; k04 = K08; k05 = K37; k06 = K51; k07 = K15; k08 = K49; k09 = K30; k10 = K07; k11 = K02; k12 = K50; k13 = K21; k14 = K45; k15 = K44; k16 = K29; k17 = K16; k18 = K42; k19 = K23; k20 = K22; k21 = K14; k22 = K38; k23 = K01; k24 = K10; k25 = K47; k26 = K53; k27 = K11; k28 = K27; k29 = K26; k30 = K05; k31 = K17; k32 = K54; k33 = K41; k34 = K39; k35 = K20; k36 = K48; k37 = K13; k38 = K24; k39 = K19; k40 = K32; k41 = K40; k42 = K34; k43 = K03; k44 = K06; k45 = K18; k46 = K12; k47 = K46; } +#define KEYSET17 { k00 = K15; k01 = K51; k02 = K36; k03 = K02; k04 = K49; k05 = K21; k06 = K35; k07 = K31; k08 = K08; k09 = K14; k10 = K23; k11 = K43; k12 = K09; k13 = K37; k14 = K29; k15 = K28; k16 = K45; k17 = K00; k18 = K01; k19 = K07; k20 = K38; k21 = K30; k22 = K22; k23 = K42; k24 = K26; k25 = K04; k26 = K41; k27 = K54; k28 = K39; k29 = K10; k30 = K48; k31 = K33; k32 = K11; k33 = K53; k34 = K27; k35 = K32; k36 = K05; k37 = K25; k38 = K40; k39 = K03; k40 = K20; k41 = K24; k42 = K46; k43 = K19; k44 = K18; k45 = K06; k46 = K55; k47 = K34; } + +__device__ static void DESCrypt (const u32 SALT, const u32 K00, const u32 K01, const u32 K02, const u32 K03, const u32 K04, const u32 K05, const u32 K06, const u32 K07, const u32 K08, const u32 K09, const u32 K10, const u32 K11, const u32 K12, const u32 K13, const u32 K14, const u32 K15, const u32 K16, const u32 K17, const u32 K18, const u32 K19, const u32 K20, const u32 K21, const u32 K22, const u32 K23, const u32 K24, const u32 K25, const u32 K26, const u32 K27, const u32 K28, const u32 K29, const u32 K30, const u32 K31, const u32 K32, const u32 K33, const u32 K34, const u32 K35, const u32 K36, const u32 K37, const u32 K38, const u32 K39, const u32 K40, const u32 K41, const u32 K42, const u32 K43, const u32 K44, const u32 K45, const u32 K46, const u32 K47, const u32 K48, const u32 K49, const u32 K50, const u32 K51, const u32 K52, const u32 K53, const u32 K54, const u32 K55, u32 &D00, u32 &D01, u32 &D02, u32 &D03, u32 &D04, u32 &D05, u32 &D06, u32 &D07, u32 &D08, u32 &D09, u32 &D10, u32 &D11, u32 &D12, u32 &D13, u32 &D14, u32 &D15, u32 &D16, u32 &D17, u32 &D18, u32 &D19, u32 &D20, u32 &D21, u32 &D22, u32 &D23, u32 &D24, u32 &D25, u32 &D26, u32 &D27, u32 &D28, u32 &D29, u32 &D30, u32 &D31, u32 &D32, u32 &D33, u32 &D34, u32 &D35, u32 &D36, u32 &D37, u32 &D38, u32 &D39, u32 &D40, u32 &D41, u32 &D42, u32 &D43, u32 &D44, u32 &D45, u32 &D46, u32 &D47, u32 &D48, u32 &D49, u32 &D50, u32 &D51, u32 &D52, u32 &D53, u32 &D54, u32 &D55, u32 &D56, u32 &D57, u32 &D58, u32 &D59, u32 &D60, u32 &D61, u32 &D62, u32 &D63) +{ + sXXX_DECL u32 s001 = (0x001 & SALT) ? 0xffffffff : 0; + sXXX_DECL u32 s002 = (0x002 & SALT) ? 0xffffffff : 0; + sXXX_DECL u32 s004 = (0x004 & SALT) ? 0xffffffff : 0; + sXXX_DECL u32 s008 = (0x008 & SALT) ? 0xffffffff : 0; + sXXX_DECL u32 s010 = (0x010 & SALT) ? 0xffffffff : 0; + sXXX_DECL u32 s020 = (0x020 & SALT) ? 0xffffffff : 0; + sXXX_DECL u32 s040 = (0x040 & SALT) ? 0xffffffff : 0; + sXXX_DECL u32 s080 = (0x080 & SALT) ? 0xffffffff : 0; + sXXX_DECL u32 s100 = (0x100 & SALT) ? 0xffffffff : 0; + sXXX_DECL u32 s200 = (0x200 & SALT) ? 0xffffffff : 0; + sXXX_DECL u32 s400 = (0x400 & SALT) ? 0xffffffff : 0; + sXXX_DECL u32 s800 = (0x800 & SALT) ? 0xffffffff : 0; + + KXX_DECL u32 k00, k01, k02, k03, k04, k05; + KXX_DECL u32 k06, k07, k08, k09, k10, k11; + KXX_DECL u32 k12, k13, k14, k15, k16, k17; + KXX_DECL u32 k18, k19, k20, k21, k22, k23; + KXX_DECL u32 k24, k25, k26, k27, k28, k29; + KXX_DECL u32 k30, k31, k32, k33, k34, k35; + KXX_DECL u32 k36, k37, k38, k39, k40, k41; + KXX_DECL u32 k42, k43, k44, k45, k46, k47; + + for (u32 ii = 0; ii < 25; ii++) + { + #if __CUDA_ARCH__ >= 500 + #pragma unroll 1 + #else + #pragma unroll + #endif + + for (u32 i = 0; i < 2; i++) + { + if (i) KEYSET10 else KEYSET00 + + s1(myselx (D63, D47, s001) ^ k00, myselx (D32, D48, s002) ^ k01, myselx (D33, D49, s004) ^ k02, myselx (D34, D50, s008) ^ k03, myselx (D35, D51, s010) ^ k04, myselx (D36, D52, s020) ^ k05, &D08, &D16, &D22, &D30); + s2(myselx (D35, D51, s040) ^ k06, myselx (D36, D52, s080) ^ k07, myselx (D37, D53, s100) ^ k08, myselx (D38, D54, s200) ^ k09, myselx (D39, D55, s400) ^ k10, myselx (D40, D56, s800) ^ k11, &D12, &D27, &D01, &D17); + s3( D39 ^ k12, D40 ^ k13, D41 ^ k14, D42 ^ k15, D43 ^ k16, D44 ^ k17, &D23, &D15, &D29, &D05); + s4( D43 ^ k18, D44 ^ k19, D45 ^ k20, D46 ^ k21, D47 ^ k22, D48 ^ k23, &D25, &D19, &D09, &D00); + s5(myselx (D47, D63, s001) ^ k24, myselx (D48, D32, s002) ^ k25, myselx (D49, D33, s004) ^ k26, myselx (D50, D34, s008) ^ k27, myselx (D51, D35, s010) ^ k28, myselx (D52, D36, s020) ^ k29, &D07, &D13, &D24, &D02); + s6(myselx (D51, D35, s040) ^ k30, myselx (D52, D36, s080) ^ k31, myselx (D53, D37, s100) ^ k32, myselx (D54, D38, s200) ^ k33, myselx (D55, D39, s400) ^ k34, myselx (D56, D40, s800) ^ k35, &D03, &D28, &D10, &D18); + s7( D55 ^ k36, D56 ^ k37, D57 ^ k38, D58 ^ k39, D59 ^ k40, D60 ^ k41, &D31, &D11, &D21, &D06); + s8( D59 ^ k42, D60 ^ k43, D61 ^ k44, D62 ^ k45, D63 ^ k46, D32 ^ k47, &D04, &D26, &D14, &D20); + + if (i) KEYSET11 else KEYSET01 + + s1(myselx (D31, D15, s001) ^ k00, myselx (D00, D16, s002) ^ k01, myselx (D01, D17, s004) ^ k02, myselx (D02, D18, s008) ^ k03, myselx (D03, D19, s010) ^ k04, myselx (D04, D20, s020) ^ k05, &D40, &D48, &D54, &D62); + s2(myselx (D03, D19, s040) ^ k06, myselx (D04, D20, s080) ^ k07, myselx (D05, D21, s100) ^ k08, myselx (D06, D22, s200) ^ k09, myselx (D07, D23, s400) ^ k10, myselx (D08, D24, s800) ^ k11, &D44, &D59, &D33, &D49); + s3( D07 ^ k12, D08 ^ k13, D09 ^ k14, D10 ^ k15, D11 ^ k16, D12 ^ k17, &D55, &D47, &D61, &D37); + s4( D11 ^ k18, D12 ^ k19, D13 ^ k20, D14 ^ k21, D15 ^ k22, D16 ^ k23, &D57, &D51, &D41, &D32); + s5(myselx (D15, D31, s001) ^ k24, myselx (D16, D00, s002) ^ k25, myselx (D17, D01, s004) ^ k26, myselx (D18, D02, s008) ^ k27, myselx (D19, D03, s010) ^ k28, myselx (D20, D04, s020) ^ k29, &D39, &D45, &D56, &D34); + s6(myselx (D19, D03, s040) ^ k30, myselx (D20, D04, s080) ^ k31, myselx (D21, D05, s100) ^ k32, myselx (D22, D06, s200) ^ k33, myselx (D23, D07, s400) ^ k34, myselx (D24, D08, s800) ^ k35, &D35, &D60, &D42, &D50); + s7( D23 ^ k36, D24 ^ k37, D25 ^ k38, D26 ^ k39, D27 ^ k40, D28 ^ k41, &D63, &D43, &D53, &D38); + s8( D27 ^ k42, D28 ^ k43, D29 ^ k44, D30 ^ k45, D31 ^ k46, D00 ^ k47, &D36, &D58, &D46, &D52); + + if (i) KEYSET12 else KEYSET02 + + s1(myselx (D63, D47, s001) ^ k00, myselx (D32, D48, s002) ^ k01, myselx (D33, D49, s004) ^ k02, myselx (D34, D50, s008) ^ k03, myselx (D35, D51, s010) ^ k04, myselx (D36, D52, s020) ^ k05, &D08, &D16, &D22, &D30); + s2(myselx (D35, D51, s040) ^ k06, myselx (D36, D52, s080) ^ k07, myselx (D37, D53, s100) ^ k08, myselx (D38, D54, s200) ^ k09, myselx (D39, D55, s400) ^ k10, myselx (D40, D56, s800) ^ k11, &D12, &D27, &D01, &D17); + s3( D39 ^ k12, D40 ^ k13, D41 ^ k14, D42 ^ k15, D43 ^ k16, D44 ^ k17, &D23, &D15, &D29, &D05); + s4( D43 ^ k18, D44 ^ k19, D45 ^ k20, D46 ^ k21, D47 ^ k22, D48 ^ k23, &D25, &D19, &D09, &D00); + s5(myselx (D47, D63, s001) ^ k24, myselx (D48, D32, s002) ^ k25, myselx (D49, D33, s004) ^ k26, myselx (D50, D34, s008) ^ k27, myselx (D51, D35, s010) ^ k28, myselx (D52, D36, s020) ^ k29, &D07, &D13, &D24, &D02); + s6(myselx (D51, D35, s040) ^ k30, myselx (D52, D36, s080) ^ k31, myselx (D53, D37, s100) ^ k32, myselx (D54, D38, s200) ^ k33, myselx (D55, D39, s400) ^ k34, myselx (D56, D40, s800) ^ k35, &D03, &D28, &D10, &D18); + s7( D55 ^ k36, D56 ^ k37, D57 ^ k38, D58 ^ k39, D59 ^ k40, D60 ^ k41, &D31, &D11, &D21, &D06); + s8( D59 ^ k42, D60 ^ k43, D61 ^ k44, D62 ^ k45, D63 ^ k46, D32 ^ k47, &D04, &D26, &D14, &D20); + + if (i) KEYSET13 else KEYSET03 + + s1(myselx (D31, D15, s001) ^ k00, myselx (D00, D16, s002) ^ k01, myselx (D01, D17, s004) ^ k02, myselx (D02, D18, s008) ^ k03, myselx (D03, D19, s010) ^ k04, myselx (D04, D20, s020) ^ k05, &D40, &D48, &D54, &D62); + s2(myselx (D03, D19, s040) ^ k06, myselx (D04, D20, s080) ^ k07, myselx (D05, D21, s100) ^ k08, myselx (D06, D22, s200) ^ k09, myselx (D07, D23, s400) ^ k10, myselx (D08, D24, s800) ^ k11, &D44, &D59, &D33, &D49); + s3( D07 ^ k12, D08 ^ k13, D09 ^ k14, D10 ^ k15, D11 ^ k16, D12 ^ k17, &D55, &D47, &D61, &D37); + s4( D11 ^ k18, D12 ^ k19, D13 ^ k20, D14 ^ k21, D15 ^ k22, D16 ^ k23, &D57, &D51, &D41, &D32); + s5(myselx (D15, D31, s001) ^ k24, myselx (D16, D00, s002) ^ k25, myselx (D17, D01, s004) ^ k26, myselx (D18, D02, s008) ^ k27, myselx (D19, D03, s010) ^ k28, myselx (D20, D04, s020) ^ k29, &D39, &D45, &D56, &D34); + s6(myselx (D19, D03, s040) ^ k30, myselx (D20, D04, s080) ^ k31, myselx (D21, D05, s100) ^ k32, myselx (D22, D06, s200) ^ k33, myselx (D23, D07, s400) ^ k34, myselx (D24, D08, s800) ^ k35, &D35, &D60, &D42, &D50); + s7( D23 ^ k36, D24 ^ k37, D25 ^ k38, D26 ^ k39, D27 ^ k40, D28 ^ k41, &D63, &D43, &D53, &D38); + s8( D27 ^ k42, D28 ^ k43, D29 ^ k44, D30 ^ k45, D31 ^ k46, D00 ^ k47, &D36, &D58, &D46, &D52); + + if (i) KEYSET14 else KEYSET04 + + s1(myselx (D63, D47, s001) ^ k00, myselx (D32, D48, s002) ^ k01, myselx (D33, D49, s004) ^ k02, myselx (D34, D50, s008) ^ k03, myselx (D35, D51, s010) ^ k04, myselx (D36, D52, s020) ^ k05, &D08, &D16, &D22, &D30); + s2(myselx (D35, D51, s040) ^ k06, myselx (D36, D52, s080) ^ k07, myselx (D37, D53, s100) ^ k08, myselx (D38, D54, s200) ^ k09, myselx (D39, D55, s400) ^ k10, myselx (D40, D56, s800) ^ k11, &D12, &D27, &D01, &D17); + s3( D39 ^ k12, D40 ^ k13, D41 ^ k14, D42 ^ k15, D43 ^ k16, D44 ^ k17, &D23, &D15, &D29, &D05); + s4( D43 ^ k18, D44 ^ k19, D45 ^ k20, D46 ^ k21, D47 ^ k22, D48 ^ k23, &D25, &D19, &D09, &D00); + s5(myselx (D47, D63, s001) ^ k24, myselx (D48, D32, s002) ^ k25, myselx (D49, D33, s004) ^ k26, myselx (D50, D34, s008) ^ k27, myselx (D51, D35, s010) ^ k28, myselx (D52, D36, s020) ^ k29, &D07, &D13, &D24, &D02); + s6(myselx (D51, D35, s040) ^ k30, myselx (D52, D36, s080) ^ k31, myselx (D53, D37, s100) ^ k32, myselx (D54, D38, s200) ^ k33, myselx (D55, D39, s400) ^ k34, myselx (D56, D40, s800) ^ k35, &D03, &D28, &D10, &D18); + s7( D55 ^ k36, D56 ^ k37, D57 ^ k38, D58 ^ k39, D59 ^ k40, D60 ^ k41, &D31, &D11, &D21, &D06); + s8( D59 ^ k42, D60 ^ k43, D61 ^ k44, D62 ^ k45, D63 ^ k46, D32 ^ k47, &D04, &D26, &D14, &D20); + + if (i) KEYSET15 else KEYSET05 + + s1(myselx (D31, D15, s001) ^ k00, myselx (D00, D16, s002) ^ k01, myselx (D01, D17, s004) ^ k02, myselx (D02, D18, s008) ^ k03, myselx (D03, D19, s010) ^ k04, myselx (D04, D20, s020) ^ k05, &D40, &D48, &D54, &D62); + s2(myselx (D03, D19, s040) ^ k06, myselx (D04, D20, s080) ^ k07, myselx (D05, D21, s100) ^ k08, myselx (D06, D22, s200) ^ k09, myselx (D07, D23, s400) ^ k10, myselx (D08, D24, s800) ^ k11, &D44, &D59, &D33, &D49); + s3( D07 ^ k12, D08 ^ k13, D09 ^ k14, D10 ^ k15, D11 ^ k16, D12 ^ k17, &D55, &D47, &D61, &D37); + s4( D11 ^ k18, D12 ^ k19, D13 ^ k20, D14 ^ k21, D15 ^ k22, D16 ^ k23, &D57, &D51, &D41, &D32); + s5(myselx (D15, D31, s001) ^ k24, myselx (D16, D00, s002) ^ k25, myselx (D17, D01, s004) ^ k26, myselx (D18, D02, s008) ^ k27, myselx (D19, D03, s010) ^ k28, myselx (D20, D04, s020) ^ k29, &D39, &D45, &D56, &D34); + s6(myselx (D19, D03, s040) ^ k30, myselx (D20, D04, s080) ^ k31, myselx (D21, D05, s100) ^ k32, myselx (D22, D06, s200) ^ k33, myselx (D23, D07, s400) ^ k34, myselx (D24, D08, s800) ^ k35, &D35, &D60, &D42, &D50); + s7( D23 ^ k36, D24 ^ k37, D25 ^ k38, D26 ^ k39, D27 ^ k40, D28 ^ k41, &D63, &D43, &D53, &D38); + s8( D27 ^ k42, D28 ^ k43, D29 ^ k44, D30 ^ k45, D31 ^ k46, D00 ^ k47, &D36, &D58, &D46, &D52); + + if (i) KEYSET16 else KEYSET06 + + s1(myselx (D63, D47, s001) ^ k00, myselx (D32, D48, s002) ^ k01, myselx (D33, D49, s004) ^ k02, myselx (D34, D50, s008) ^ k03, myselx (D35, D51, s010) ^ k04, myselx (D36, D52, s020) ^ k05, &D08, &D16, &D22, &D30); + s2(myselx (D35, D51, s040) ^ k06, myselx (D36, D52, s080) ^ k07, myselx (D37, D53, s100) ^ k08, myselx (D38, D54, s200) ^ k09, myselx (D39, D55, s400) ^ k10, myselx (D40, D56, s800) ^ k11, &D12, &D27, &D01, &D17); + s3( D39 ^ k12, D40 ^ k13, D41 ^ k14, D42 ^ k15, D43 ^ k16, D44 ^ k17, &D23, &D15, &D29, &D05); + s4( D43 ^ k18, D44 ^ k19, D45 ^ k20, D46 ^ k21, D47 ^ k22, D48 ^ k23, &D25, &D19, &D09, &D00); + s5(myselx (D47, D63, s001) ^ k24, myselx (D48, D32, s002) ^ k25, myselx (D49, D33, s004) ^ k26, myselx (D50, D34, s008) ^ k27, myselx (D51, D35, s010) ^ k28, myselx (D52, D36, s020) ^ k29, &D07, &D13, &D24, &D02); + s6(myselx (D51, D35, s040) ^ k30, myselx (D52, D36, s080) ^ k31, myselx (D53, D37, s100) ^ k32, myselx (D54, D38, s200) ^ k33, myselx (D55, D39, s400) ^ k34, myselx (D56, D40, s800) ^ k35, &D03, &D28, &D10, &D18); + s7( D55 ^ k36, D56 ^ k37, D57 ^ k38, D58 ^ k39, D59 ^ k40, D60 ^ k41, &D31, &D11, &D21, &D06); + s8( D59 ^ k42, D60 ^ k43, D61 ^ k44, D62 ^ k45, D63 ^ k46, D32 ^ k47, &D04, &D26, &D14, &D20); + + if (i) KEYSET17 else KEYSET07 + + s1(myselx (D31, D15, s001) ^ k00, myselx (D00, D16, s002) ^ k01, myselx (D01, D17, s004) ^ k02, myselx (D02, D18, s008) ^ k03, myselx (D03, D19, s010) ^ k04, myselx (D04, D20, s020) ^ k05, &D40, &D48, &D54, &D62); + s2(myselx (D03, D19, s040) ^ k06, myselx (D04, D20, s080) ^ k07, myselx (D05, D21, s100) ^ k08, myselx (D06, D22, s200) ^ k09, myselx (D07, D23, s400) ^ k10, myselx (D08, D24, s800) ^ k11, &D44, &D59, &D33, &D49); + s3( D07 ^ k12, D08 ^ k13, D09 ^ k14, D10 ^ k15, D11 ^ k16, D12 ^ k17, &D55, &D47, &D61, &D37); + s4( D11 ^ k18, D12 ^ k19, D13 ^ k20, D14 ^ k21, D15 ^ k22, D16 ^ k23, &D57, &D51, &D41, &D32); + s5(myselx (D15, D31, s001) ^ k24, myselx (D16, D00, s002) ^ k25, myselx (D17, D01, s004) ^ k26, myselx (D18, D02, s008) ^ k27, myselx (D19, D03, s010) ^ k28, myselx (D20, D04, s020) ^ k29, &D39, &D45, &D56, &D34); + s6(myselx (D19, D03, s040) ^ k30, myselx (D20, D04, s080) ^ k31, myselx (D21, D05, s100) ^ k32, myselx (D22, D06, s200) ^ k33, myselx (D23, D07, s400) ^ k34, myselx (D24, D08, s800) ^ k35, &D35, &D60, &D42, &D50); + s7( D23 ^ k36, D24 ^ k37, D25 ^ k38, D26 ^ k39, D27 ^ k40, D28 ^ k41, &D63, &D43, &D53, &D38); + s8( D27 ^ k42, D28 ^ k43, D29 ^ k44, D30 ^ k45, D31 ^ k46, D00 ^ k47, &D36, &D58, &D46, &D52); + } + + DATASWAP; + } + + DATASWAP; +} + +__device__ static void transpose32c (u32 data[32]) +{ + #define swap(x,y,j,m) \ + t = ((x) ^ ((y) >> (j))) & (m); \ + (x) = (x) ^ t; \ + (y) = (y) ^ (t << (j)); + + u32 t; + + swap (data[ 0], data[16], 16, 0x0000ffff); + swap (data[ 1], data[17], 16, 0x0000ffff); + swap (data[ 2], data[18], 16, 0x0000ffff); + swap (data[ 3], data[19], 16, 0x0000ffff); + swap (data[ 4], data[20], 16, 0x0000ffff); + swap (data[ 5], data[21], 16, 0x0000ffff); + swap (data[ 6], data[22], 16, 0x0000ffff); + swap (data[ 7], data[23], 16, 0x0000ffff); + swap (data[ 8], data[24], 16, 0x0000ffff); + swap (data[ 9], data[25], 16, 0x0000ffff); + swap (data[10], data[26], 16, 0x0000ffff); + swap (data[11], data[27], 16, 0x0000ffff); + swap (data[12], data[28], 16, 0x0000ffff); + swap (data[13], data[29], 16, 0x0000ffff); + swap (data[14], data[30], 16, 0x0000ffff); + swap (data[15], data[31], 16, 0x0000ffff); + swap (data[ 0], data[ 8], 8, 0x00ff00ff); + swap (data[ 1], data[ 9], 8, 0x00ff00ff); + swap (data[ 2], data[10], 8, 0x00ff00ff); + swap (data[ 3], data[11], 8, 0x00ff00ff); + swap (data[ 4], data[12], 8, 0x00ff00ff); + swap (data[ 5], data[13], 8, 0x00ff00ff); + swap (data[ 6], data[14], 8, 0x00ff00ff); + swap (data[ 7], data[15], 8, 0x00ff00ff); + swap (data[ 0], data[ 4], 4, 0x0f0f0f0f); + swap (data[ 1], data[ 5], 4, 0x0f0f0f0f); + swap (data[ 2], data[ 6], 4, 0x0f0f0f0f); + swap (data[ 3], data[ 7], 4, 0x0f0f0f0f); + swap (data[ 0], data[ 2], 2, 0x33333333); + swap (data[ 1], data[ 3], 2, 0x33333333); + swap (data[ 0], data[ 1], 1, 0x55555555); + swap (data[ 2], data[ 3], 1, 0x55555555); + swap (data[ 4], data[ 6], 2, 0x33333333); + swap (data[ 5], data[ 7], 2, 0x33333333); + swap (data[ 4], data[ 5], 1, 0x55555555); + swap (data[ 6], data[ 7], 1, 0x55555555); + swap (data[ 8], data[12], 4, 0x0f0f0f0f); + swap (data[ 9], data[13], 4, 0x0f0f0f0f); + swap (data[10], data[14], 4, 0x0f0f0f0f); + swap (data[11], data[15], 4, 0x0f0f0f0f); + swap (data[ 8], data[10], 2, 0x33333333); + swap (data[ 9], data[11], 2, 0x33333333); + swap (data[ 8], data[ 9], 1, 0x55555555); + swap (data[10], data[11], 1, 0x55555555); + swap (data[12], data[14], 2, 0x33333333); + swap (data[13], data[15], 2, 0x33333333); + swap (data[12], data[13], 1, 0x55555555); + swap (data[14], data[15], 1, 0x55555555); + swap (data[16], data[24], 8, 0x00ff00ff); + swap (data[17], data[25], 8, 0x00ff00ff); + swap (data[18], data[26], 8, 0x00ff00ff); + swap (data[19], data[27], 8, 0x00ff00ff); + swap (data[20], data[28], 8, 0x00ff00ff); + swap (data[21], data[29], 8, 0x00ff00ff); + swap (data[22], data[30], 8, 0x00ff00ff); + swap (data[23], data[31], 8, 0x00ff00ff); + swap (data[16], data[20], 4, 0x0f0f0f0f); + swap (data[17], data[21], 4, 0x0f0f0f0f); + swap (data[18], data[22], 4, 0x0f0f0f0f); + swap (data[19], data[23], 4, 0x0f0f0f0f); + swap (data[16], data[18], 2, 0x33333333); + swap (data[17], data[19], 2, 0x33333333); + swap (data[16], data[17], 1, 0x55555555); + swap (data[18], data[19], 1, 0x55555555); + swap (data[20], data[22], 2, 0x33333333); + swap (data[21], data[23], 2, 0x33333333); + swap (data[20], data[21], 1, 0x55555555); + swap (data[22], data[23], 1, 0x55555555); + swap (data[24], data[28], 4, 0x0f0f0f0f); + swap (data[25], data[29], 4, 0x0f0f0f0f); + swap (data[26], data[30], 4, 0x0f0f0f0f); + swap (data[27], data[31], 4, 0x0f0f0f0f); + swap (data[24], data[26], 2, 0x33333333); + swap (data[25], data[27], 2, 0x33333333); + swap (data[24], data[25], 1, 0x55555555); + swap (data[26], data[27], 1, 0x55555555); + swap (data[28], data[30], 2, 0x33333333); + swap (data[29], data[31], 2, 0x33333333); + swap (data[28], data[29], 1, 0x55555555); + swap (data[30], data[31], 1, 0x55555555); +} + +__device__ static void m01500m (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const u32x *words_buf_r, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset) +{ + /** + * modifier + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + const u32 lid = threadIdx.x; + + /** + * salt + */ + + const u32 salt = salt_bufs[salt_pos].salt_buf[0]; + + /** + * keys + */ + + const u32 w0s = (pws[gid].i[0] << 1) & 0xfefefefe; + const u32 w1s = (pws[gid].i[1] << 1) & 0xfefefefe; + + const u32 K00 = -((w0s >> ( 0 + 7)) & 1); + const u32 K01 = -((w0s >> ( 0 + 6)) & 1); + const u32 K02 = -((w0s >> ( 0 + 5)) & 1); + const u32 K03 = -((w0s >> ( 0 + 4)) & 1); + const u32 K04 = -((w0s >> ( 0 + 3)) & 1); + const u32 K05 = -((w0s >> ( 0 + 2)) & 1); + const u32 K06 = -((w0s >> ( 0 + 1)) & 1); + const u32 K07 = -((w0s >> ( 8 + 7)) & 1); + const u32 K08 = -((w0s >> ( 8 + 6)) & 1); + const u32 K09 = -((w0s >> ( 8 + 5)) & 1); + const u32 K10 = -((w0s >> ( 8 + 4)) & 1); + const u32 K11 = -((w0s >> ( 8 + 3)) & 1); + const u32 K12 = -((w0s >> ( 8 + 2)) & 1); + const u32 K13 = -((w0s >> ( 8 + 1)) & 1); + const u32 K14 = -((w0s >> (16 + 7)) & 1); + const u32 K15 = -((w0s >> (16 + 6)) & 1); + const u32 K16 = -((w0s >> (16 + 5)) & 1); + const u32 K17 = -((w0s >> (16 + 4)) & 1); + const u32 K18 = -((w0s >> (16 + 3)) & 1); + const u32 K19 = -((w0s >> (16 + 2)) & 1); + const u32 K20 = -((w0s >> (16 + 1)) & 1); + const u32 K21 = -((w0s >> (24 + 7)) & 1); + const u32 K22 = -((w0s >> (24 + 6)) & 1); + const u32 K23 = -((w0s >> (24 + 5)) & 1); + const u32 K24 = -((w0s >> (24 + 4)) & 1); + const u32 K25 = -((w0s >> (24 + 3)) & 1); + const u32 K26 = -((w0s >> (24 + 2)) & 1); + const u32 K27 = -((w0s >> (24 + 1)) & 1); + const u32 K28 = -((w1s >> ( 0 + 7)) & 1); + const u32 K29 = -((w1s >> ( 0 + 6)) & 1); + const u32 K30 = -((w1s >> ( 0 + 5)) & 1); + const u32 K31 = -((w1s >> ( 0 + 4)) & 1); + const u32 K32 = -((w1s >> ( 0 + 3)) & 1); + const u32 K33 = -((w1s >> ( 0 + 2)) & 1); + const u32 K34 = -((w1s >> ( 0 + 1)) & 1); + const u32 K35 = -((w1s >> ( 8 + 7)) & 1); + const u32 K36 = -((w1s >> ( 8 + 6)) & 1); + const u32 K37 = -((w1s >> ( 8 + 5)) & 1); + const u32 K38 = -((w1s >> ( 8 + 4)) & 1); + const u32 K39 = -((w1s >> ( 8 + 3)) & 1); + const u32 K40 = -((w1s >> ( 8 + 2)) & 1); + const u32 K41 = -((w1s >> ( 8 + 1)) & 1); + const u32 K42 = -((w1s >> (16 + 7)) & 1); + const u32 K43 = -((w1s >> (16 + 6)) & 1); + const u32 K44 = -((w1s >> (16 + 5)) & 1); + const u32 K45 = -((w1s >> (16 + 4)) & 1); + const u32 K46 = -((w1s >> (16 + 3)) & 1); + const u32 K47 = -((w1s >> (16 + 2)) & 1); + const u32 K48 = -((w1s >> (16 + 1)) & 1); + const u32 K49 = -((w1s >> (24 + 7)) & 1); + const u32 K50 = -((w1s >> (24 + 6)) & 1); + const u32 K51 = -((w1s >> (24 + 5)) & 1); + const u32 K52 = -((w1s >> (24 + 4)) & 1); + const u32 K53 = -((w1s >> (24 + 3)) & 1); + const u32 K54 = -((w1s >> (24 + 2)) & 1); + const u32 K55 = -((w1s >> (24 + 1)) & 1); + + /** + * loop + */ + + const u32 bf_loops = bfs_cnt; + + for (u32 il_pos = 0, pc_pos = 0; il_pos < bf_loops; il_pos += 32, pc_pos++) + { + u32 k00 = K00; + u32 k01 = K01; + u32 k02 = K02; + u32 k03 = K03; + u32 k04 = K04; + u32 k05 = K05; + u32 k06 = K06; + u32 k07 = K07; + u32 k08 = K08; + u32 k09 = K09; + u32 k10 = K10; + u32 k11 = K11; + u32 k12 = K12; + u32 k13 = K13; + u32 k14 = K14; + u32 k15 = K15; + u32 k16 = K16; + u32 k17 = K17; + u32 k18 = K18; + u32 k19 = K19; + u32 k20 = K20; + u32 k21 = K21; + u32 k22 = K22; + u32 k23 = K23; + u32 k24 = K24; + u32 k25 = K25; + u32 k26 = K26; + u32 k27 = K27; + + k00 |= c_tm[pc_pos].b[ 0]; + k01 |= c_tm[pc_pos].b[ 1]; + k02 |= c_tm[pc_pos].b[ 2]; + k03 |= c_tm[pc_pos].b[ 3]; + k04 |= c_tm[pc_pos].b[ 4]; + k05 |= c_tm[pc_pos].b[ 5]; + k06 |= c_tm[pc_pos].b[ 6]; + k07 |= c_tm[pc_pos].b[ 7]; + k08 |= c_tm[pc_pos].b[ 8]; + k09 |= c_tm[pc_pos].b[ 9]; + k10 |= c_tm[pc_pos].b[10]; + k11 |= c_tm[pc_pos].b[11]; + k12 |= c_tm[pc_pos].b[12]; + k13 |= c_tm[pc_pos].b[13]; + k14 |= c_tm[pc_pos].b[14]; + k15 |= c_tm[pc_pos].b[15]; + k16 |= c_tm[pc_pos].b[16]; + k17 |= c_tm[pc_pos].b[17]; + k18 |= c_tm[pc_pos].b[18]; + k19 |= c_tm[pc_pos].b[19]; + k20 |= c_tm[pc_pos].b[20]; + k21 |= c_tm[pc_pos].b[21]; + k22 |= c_tm[pc_pos].b[22]; + k23 |= c_tm[pc_pos].b[23]; + k24 |= c_tm[pc_pos].b[24]; + k25 |= c_tm[pc_pos].b[25]; + k26 |= c_tm[pc_pos].b[26]; + k27 |= c_tm[pc_pos].b[27]; + + u32 D00 = 0; + u32 D01 = 0; + u32 D02 = 0; + u32 D03 = 0; + u32 D04 = 0; + u32 D05 = 0; + u32 D06 = 0; + u32 D07 = 0; + u32 D08 = 0; + u32 D09 = 0; + u32 D10 = 0; + u32 D11 = 0; + u32 D12 = 0; + u32 D13 = 0; + u32 D14 = 0; + u32 D15 = 0; + u32 D16 = 0; + u32 D17 = 0; + u32 D18 = 0; + u32 D19 = 0; + u32 D20 = 0; + u32 D21 = 0; + u32 D22 = 0; + u32 D23 = 0; + u32 D24 = 0; + u32 D25 = 0; + u32 D26 = 0; + u32 D27 = 0; + u32 D28 = 0; + u32 D29 = 0; + u32 D30 = 0; + u32 D31 = 0; + u32 D32 = 0; + u32 D33 = 0; + u32 D34 = 0; + u32 D35 = 0; + u32 D36 = 0; + u32 D37 = 0; + u32 D38 = 0; + u32 D39 = 0; + u32 D40 = 0; + u32 D41 = 0; + u32 D42 = 0; + u32 D43 = 0; + u32 D44 = 0; + u32 D45 = 0; + u32 D46 = 0; + u32 D47 = 0; + u32 D48 = 0; + u32 D49 = 0; + u32 D50 = 0; + u32 D51 = 0; + u32 D52 = 0; + u32 D53 = 0; + u32 D54 = 0; + u32 D55 = 0; + u32 D56 = 0; + u32 D57 = 0; + u32 D58 = 0; + u32 D59 = 0; + u32 D60 = 0; + u32 D61 = 0; + u32 D62 = 0; + u32 D63 = 0; + + DESCrypt + ( + salt, + k00, k01, k02, k03, k04, k05, k06, + k07, k08, k09, k10, k11, k12, k13, + k14, k15, k16, k17, k18, k19, k20, + k21, k22, k23, k24, k25, k26, k27, + K28, K29, K30, K31, K32, K33, K34, + K35, K36, K37, K38, K39, K40, K41, + K42, K43, K44, K45, K46, K47, K48, + K49, K50, K51, K52, K53, K54, K55, + D00, D01, D02, D03, D04, D05, D06, D07, + D08, D09, D10, D11, D12, D13, D14, D15, + D16, D17, D18, D19, D20, D21, D22, D23, + D24, D25, D26, D27, D28, D29, D30, D31, + D32, D33, D34, D35, D36, D37, D38, D39, + D40, D41, D42, D43, D44, D45, D46, D47, + D48, D49, D50, D51, D52, D53, D54, D55, + D56, D57, D58, D59, D60, D61, D62, D63 + ); + + u32 out[64]; + + out[ 0] = D00; + out[ 1] = D01; + out[ 2] = D02; + out[ 3] = D03; + out[ 4] = D04; + out[ 5] = D05; + out[ 6] = D06; + out[ 7] = D07; + out[ 8] = D08; + out[ 9] = D09; + out[10] = D10; + out[11] = D11; + out[12] = D12; + out[13] = D13; + out[14] = D14; + out[15] = D15; + out[16] = D16; + out[17] = D17; + out[18] = D18; + out[19] = D19; + out[20] = D20; + out[21] = D21; + out[22] = D22; + out[23] = D23; + out[24] = D24; + out[25] = D25; + out[26] = D26; + out[27] = D27; + out[28] = D28; + out[29] = D29; + out[30] = D30; + out[31] = D31; + out[32] = D32; + out[33] = D33; + out[34] = D34; + out[35] = D35; + out[36] = D36; + out[37] = D37; + out[38] = D38; + out[39] = D39; + out[40] = D40; + out[41] = D41; + out[42] = D42; + out[43] = D43; + out[44] = D44; + out[45] = D45; + out[46] = D46; + out[47] = D47; + out[48] = D48; + out[49] = D49; + out[50] = D50; + out[51] = D51; + out[52] = D52; + out[53] = D53; + out[54] = D54; + out[55] = D55; + out[56] = D56; + out[57] = D57; + out[58] = D58; + out[59] = D59; + out[60] = D60; + out[61] = D61; + out[62] = D62; + out[63] = D63; + + if (digests_cnt < 16) + { + for (u32 d = 0; d < digests_cnt; d++) + { + const u32 final_hash_pos = digests_offset + d; + + if (hashes_shown[final_hash_pos]) continue; + + u32 search[2]; + + search[0] = digests_buf[final_hash_pos].digest_buf[DGST_R0]; + search[1] = digests_buf[final_hash_pos].digest_buf[DGST_R1]; + + u32 tmpResult = 0; + + #pragma unroll + for (int i = 0; i < 32; i++) + { + const u32 b0 = -((search[0] >> i) & 1); + const u32 b1 = -((search[1] >> i) & 1); + + tmpResult |= out[ 0 + i] ^ b0; + tmpResult |= out[32 + i] ^ b1; + } + + if (tmpResult == 0xffffffff) continue; + + const u32 slice = 31 - __clz (~tmpResult); + + const u32x r0 = search[0]; + const u32x r1 = search[1]; + const u32x r2 = 0; + const u32x r3 = 0; + + #include VECT_COMPARE_M + } + } + else + { + u32 out0[32]; + u32 out1[32]; + + #pragma unroll + for (int i = 0; i < 32; i++) + { + out0[i] = out[ 0 + 31 - i]; + out1[i] = out[32 + 31 - i]; + } + + transpose32c (out0); + transpose32c (out1); + + #pragma unroll + for (int slice = 0; slice < 32; slice++) + { + const u32x r0 = out0[31 - slice]; + const u32x r1 = out1[31 - slice]; + const u32x r2 = 0; + const u32x r3 = 0; + + #include VECT_COMPARE_M + } + } + } +} + +__device__ static void m01500s (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const u32x *words_buf_r, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset) +{ + /** + * modifier + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + const u32 lid = threadIdx.x; + + /** + * salt + */ + + const u32 salt = salt_bufs[salt_pos].salt_buf[0]; + + /** + * digest + */ + + #define S00 s_S[ 0] + #define S01 s_S[ 1] + #define S02 s_S[ 2] + #define S03 s_S[ 3] + #define S04 s_S[ 4] + #define S05 s_S[ 5] + #define S06 s_S[ 6] + #define S07 s_S[ 7] + #define S08 s_S[ 8] + #define S09 s_S[ 9] + #define S10 s_S[10] + #define S11 s_S[11] + #define S12 s_S[12] + #define S13 s_S[13] + #define S14 s_S[14] + #define S15 s_S[15] + #define S16 s_S[16] + #define S17 s_S[17] + #define S18 s_S[18] + #define S19 s_S[19] + #define S20 s_S[20] + #define S21 s_S[21] + #define S22 s_S[22] + #define S23 s_S[23] + #define S24 s_S[24] + #define S25 s_S[25] + #define S26 s_S[26] + #define S27 s_S[27] + #define S28 s_S[28] + #define S29 s_S[29] + #define S30 s_S[30] + #define S31 s_S[31] + #define S32 s_S[32] + #define S33 s_S[33] + #define S34 s_S[34] + #define S35 s_S[35] + #define S36 s_S[36] + #define S37 s_S[37] + #define S38 s_S[38] + #define S39 s_S[39] + #define S40 s_S[40] + #define S41 s_S[41] + #define S42 s_S[42] + #define S43 s_S[43] + #define S44 s_S[44] + #define S45 s_S[45] + #define S46 s_S[46] + #define S47 s_S[47] + #define S48 s_S[48] + #define S49 s_S[49] + #define S50 s_S[50] + #define S51 s_S[51] + #define S52 s_S[52] + #define S53 s_S[53] + #define S54 s_S[54] + #define S55 s_S[55] + #define S56 s_S[56] + #define S57 s_S[57] + #define S58 s_S[58] + #define S59 s_S[59] + #define S60 s_S[60] + #define S61 s_S[61] + #define S62 s_S[62] + #define S63 s_S[63] + + /** + * keys + */ + + const u32 w0s = (pws[gid].i[0] << 1) & 0xfefefefe; + const u32 w1s = (pws[gid].i[1] << 1) & 0xfefefefe; + + const u32 K00 = -((w0s >> ( 0 + 7)) & 1); + const u32 K01 = -((w0s >> ( 0 + 6)) & 1); + const u32 K02 = -((w0s >> ( 0 + 5)) & 1); + const u32 K03 = -((w0s >> ( 0 + 4)) & 1); + const u32 K04 = -((w0s >> ( 0 + 3)) & 1); + const u32 K05 = -((w0s >> ( 0 + 2)) & 1); + const u32 K06 = -((w0s >> ( 0 + 1)) & 1); + const u32 K07 = -((w0s >> ( 8 + 7)) & 1); + const u32 K08 = -((w0s >> ( 8 + 6)) & 1); + const u32 K09 = -((w0s >> ( 8 + 5)) & 1); + const u32 K10 = -((w0s >> ( 8 + 4)) & 1); + const u32 K11 = -((w0s >> ( 8 + 3)) & 1); + const u32 K12 = -((w0s >> ( 8 + 2)) & 1); + const u32 K13 = -((w0s >> ( 8 + 1)) & 1); + const u32 K14 = -((w0s >> (16 + 7)) & 1); + const u32 K15 = -((w0s >> (16 + 6)) & 1); + const u32 K16 = -((w0s >> (16 + 5)) & 1); + const u32 K17 = -((w0s >> (16 + 4)) & 1); + const u32 K18 = -((w0s >> (16 + 3)) & 1); + const u32 K19 = -((w0s >> (16 + 2)) & 1); + const u32 K20 = -((w0s >> (16 + 1)) & 1); + const u32 K21 = -((w0s >> (24 + 7)) & 1); + const u32 K22 = -((w0s >> (24 + 6)) & 1); + const u32 K23 = -((w0s >> (24 + 5)) & 1); + const u32 K24 = -((w0s >> (24 + 4)) & 1); + const u32 K25 = -((w0s >> (24 + 3)) & 1); + const u32 K26 = -((w0s >> (24 + 2)) & 1); + const u32 K27 = -((w0s >> (24 + 1)) & 1); + const u32 K28 = -((w1s >> ( 0 + 7)) & 1); + const u32 K29 = -((w1s >> ( 0 + 6)) & 1); + const u32 K30 = -((w1s >> ( 0 + 5)) & 1); + const u32 K31 = -((w1s >> ( 0 + 4)) & 1); + const u32 K32 = -((w1s >> ( 0 + 3)) & 1); + const u32 K33 = -((w1s >> ( 0 + 2)) & 1); + const u32 K34 = -((w1s >> ( 0 + 1)) & 1); + const u32 K35 = -((w1s >> ( 8 + 7)) & 1); + const u32 K36 = -((w1s >> ( 8 + 6)) & 1); + const u32 K37 = -((w1s >> ( 8 + 5)) & 1); + const u32 K38 = -((w1s >> ( 8 + 4)) & 1); + const u32 K39 = -((w1s >> ( 8 + 3)) & 1); + const u32 K40 = -((w1s >> ( 8 + 2)) & 1); + const u32 K41 = -((w1s >> ( 8 + 1)) & 1); + const u32 K42 = -((w1s >> (16 + 7)) & 1); + const u32 K43 = -((w1s >> (16 + 6)) & 1); + const u32 K44 = -((w1s >> (16 + 5)) & 1); + const u32 K45 = -((w1s >> (16 + 4)) & 1); + const u32 K46 = -((w1s >> (16 + 3)) & 1); + const u32 K47 = -((w1s >> (16 + 2)) & 1); + const u32 K48 = -((w1s >> (16 + 1)) & 1); + const u32 K49 = -((w1s >> (24 + 7)) & 1); + const u32 K50 = -((w1s >> (24 + 6)) & 1); + const u32 K51 = -((w1s >> (24 + 5)) & 1); + const u32 K52 = -((w1s >> (24 + 4)) & 1); + const u32 K53 = -((w1s >> (24 + 3)) & 1); + const u32 K54 = -((w1s >> (24 + 2)) & 1); + const u32 K55 = -((w1s >> (24 + 1)) & 1); + + /** + * loop + */ + + const u32 bf_loops = bfs_cnt; + + for (u32 il_pos = 0, pc_pos = 0; il_pos < bf_loops; il_pos += 32, pc_pos++) + { + u32 k00 = K00; + u32 k01 = K01; + u32 k02 = K02; + u32 k03 = K03; + u32 k04 = K04; + u32 k05 = K05; + u32 k06 = K06; + u32 k07 = K07; + u32 k08 = K08; + u32 k09 = K09; + u32 k10 = K10; + u32 k11 = K11; + u32 k12 = K12; + u32 k13 = K13; + u32 k14 = K14; + u32 k15 = K15; + u32 k16 = K16; + u32 k17 = K17; + u32 k18 = K18; + u32 k19 = K19; + u32 k20 = K20; + u32 k21 = K21; + u32 k22 = K22; + u32 k23 = K23; + u32 k24 = K24; + u32 k25 = K25; + u32 k26 = K26; + u32 k27 = K27; + + k00 |= c_tm[pc_pos].b[ 0]; + k01 |= c_tm[pc_pos].b[ 1]; + k02 |= c_tm[pc_pos].b[ 2]; + k03 |= c_tm[pc_pos].b[ 3]; + k04 |= c_tm[pc_pos].b[ 4]; + k05 |= c_tm[pc_pos].b[ 5]; + k06 |= c_tm[pc_pos].b[ 6]; + k07 |= c_tm[pc_pos].b[ 7]; + k08 |= c_tm[pc_pos].b[ 8]; + k09 |= c_tm[pc_pos].b[ 9]; + k10 |= c_tm[pc_pos].b[10]; + k11 |= c_tm[pc_pos].b[11]; + k12 |= c_tm[pc_pos].b[12]; + k13 |= c_tm[pc_pos].b[13]; + k14 |= c_tm[pc_pos].b[14]; + k15 |= c_tm[pc_pos].b[15]; + k16 |= c_tm[pc_pos].b[16]; + k17 |= c_tm[pc_pos].b[17]; + k18 |= c_tm[pc_pos].b[18]; + k19 |= c_tm[pc_pos].b[19]; + k20 |= c_tm[pc_pos].b[20]; + k21 |= c_tm[pc_pos].b[21]; + k22 |= c_tm[pc_pos].b[22]; + k23 |= c_tm[pc_pos].b[23]; + k24 |= c_tm[pc_pos].b[24]; + k25 |= c_tm[pc_pos].b[25]; + k26 |= c_tm[pc_pos].b[26]; + k27 |= c_tm[pc_pos].b[27]; + + u32 D00 = 0; + u32 D01 = 0; + u32 D02 = 0; + u32 D03 = 0; + u32 D04 = 0; + u32 D05 = 0; + u32 D06 = 0; + u32 D07 = 0; + u32 D08 = 0; + u32 D09 = 0; + u32 D10 = 0; + u32 D11 = 0; + u32 D12 = 0; + u32 D13 = 0; + u32 D14 = 0; + u32 D15 = 0; + u32 D16 = 0; + u32 D17 = 0; + u32 D18 = 0; + u32 D19 = 0; + u32 D20 = 0; + u32 D21 = 0; + u32 D22 = 0; + u32 D23 = 0; + u32 D24 = 0; + u32 D25 = 0; + u32 D26 = 0; + u32 D27 = 0; + u32 D28 = 0; + u32 D29 = 0; + u32 D30 = 0; + u32 D31 = 0; + u32 D32 = 0; + u32 D33 = 0; + u32 D34 = 0; + u32 D35 = 0; + u32 D36 = 0; + u32 D37 = 0; + u32 D38 = 0; + u32 D39 = 0; + u32 D40 = 0; + u32 D41 = 0; + u32 D42 = 0; + u32 D43 = 0; + u32 D44 = 0; + u32 D45 = 0; + u32 D46 = 0; + u32 D47 = 0; + u32 D48 = 0; + u32 D49 = 0; + u32 D50 = 0; + u32 D51 = 0; + u32 D52 = 0; + u32 D53 = 0; + u32 D54 = 0; + u32 D55 = 0; + u32 D56 = 0; + u32 D57 = 0; + u32 D58 = 0; + u32 D59 = 0; + u32 D60 = 0; + u32 D61 = 0; + u32 D62 = 0; + u32 D63 = 0; + + DESCrypt + ( + salt, + k00, k01, k02, k03, k04, k05, k06, + k07, k08, k09, k10, k11, k12, k13, + k14, k15, k16, k17, k18, k19, k20, + k21, k22, k23, k24, k25, k26, k27, + K28, K29, K30, K31, K32, K33, K34, + K35, K36, K37, K38, K39, K40, K41, + K42, K43, K44, K45, K46, K47, K48, + K49, K50, K51, K52, K53, K54, K55, + D00, D01, D02, D03, D04, D05, D06, D07, + D08, D09, D10, D11, D12, D13, D14, D15, + D16, D17, D18, D19, D20, D21, D22, D23, + D24, D25, D26, D27, D28, D29, D30, D31, + D32, D33, D34, D35, D36, D37, D38, D39, + D40, D41, D42, D43, D44, D45, D46, D47, + D48, D49, D50, D51, D52, D53, D54, D55, + D56, D57, D58, D59, D60, D61, D62, D63 + ); + + u32 tmpResult = 0; + + tmpResult |= D00 ^ S00; + tmpResult |= D01 ^ S01; + tmpResult |= D02 ^ S02; + tmpResult |= D03 ^ S03; + tmpResult |= D04 ^ S04; + tmpResult |= D05 ^ S05; + tmpResult |= D06 ^ S06; + tmpResult |= D07 ^ S07; + tmpResult |= D08 ^ S08; + tmpResult |= D09 ^ S09; + tmpResult |= D10 ^ S10; + tmpResult |= D11 ^ S11; + tmpResult |= D12 ^ S12; + tmpResult |= D13 ^ S13; + tmpResult |= D14 ^ S14; + tmpResult |= D15 ^ S15; + tmpResult |= D16 ^ S16; + tmpResult |= D17 ^ S17; + tmpResult |= D18 ^ S18; + tmpResult |= D19 ^ S19; + tmpResult |= D20 ^ S20; + tmpResult |= D21 ^ S21; + tmpResult |= D22 ^ S22; + tmpResult |= D23 ^ S23; + tmpResult |= D24 ^ S24; + tmpResult |= D25 ^ S25; + tmpResult |= D26 ^ S26; + tmpResult |= D27 ^ S27; + tmpResult |= D28 ^ S28; + tmpResult |= D29 ^ S29; + tmpResult |= D30 ^ S30; + tmpResult |= D31 ^ S31; + tmpResult |= D32 ^ S32; + tmpResult |= D33 ^ S33; + tmpResult |= D34 ^ S34; + tmpResult |= D35 ^ S35; + tmpResult |= D36 ^ S36; + tmpResult |= D37 ^ S37; + tmpResult |= D38 ^ S38; + tmpResult |= D39 ^ S39; + tmpResult |= D40 ^ S40; + tmpResult |= D41 ^ S41; + tmpResult |= D42 ^ S42; + tmpResult |= D43 ^ S43; + tmpResult |= D44 ^ S44; + tmpResult |= D45 ^ S45; + tmpResult |= D46 ^ S46; + tmpResult |= D47 ^ S47; + + if (tmpResult == 0xffffffff) continue; + + tmpResult |= D48 ^ S48; + tmpResult |= D49 ^ S49; + tmpResult |= D50 ^ S50; + tmpResult |= D51 ^ S51; + tmpResult |= D52 ^ S52; + tmpResult |= D53 ^ S53; + tmpResult |= D54 ^ S54; + tmpResult |= D55 ^ S55; + tmpResult |= D56 ^ S56; + tmpResult |= D57 ^ S57; + tmpResult |= D58 ^ S58; + tmpResult |= D59 ^ S59; + tmpResult |= D60 ^ S60; + tmpResult |= D61 ^ S61; + tmpResult |= D62 ^ S62; + tmpResult |= D63 ^ S63; + + if (tmpResult == 0xffffffff) continue; + + const u32 slice = 31 - __clz (~tmpResult); + + #include VECT_COMPARE_S + } +} + +extern "C" __global__ void __launch_bounds__ (64, 1) m01500_tb (pw_t *pws) +{ + // not used here, inlined code +} + +extern "C" __global__ void __launch_bounds__ (32, 1) m01500_tm (const u32 *d_bfs, bs_word_t *d_tm) +{ + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + const u32 block = gid / 32; + const u32 slice = gid % 32; + + const u32 w0 = c_bfs[gid]; + + const u32 w0s = (w0 << 1) & 0xfefefefe; + + #pragma unroll + for (int i = 0, j = 0; i < 32; i += 8, j += 7) + { + atomicOr (&d_tm[block].b[j + 0], (((w0s >> (i + 7)) & 1) << slice)); + atomicOr (&d_tm[block].b[j + 1], (((w0s >> (i + 6)) & 1) << slice)); + atomicOr (&d_tm[block].b[j + 2], (((w0s >> (i + 5)) & 1) << slice)); + atomicOr (&d_tm[block].b[j + 3], (((w0s >> (i + 4)) & 1) << slice)); + atomicOr (&d_tm[block].b[j + 4], (((w0s >> (i + 3)) & 1) << slice)); + atomicOr (&d_tm[block].b[j + 5], (((w0s >> (i + 2)) & 1) << slice)); + atomicOr (&d_tm[block].b[j + 6], (((w0s >> (i + 1)) & 1) << slice)); + } +} + +extern "C" __global__ void __launch_bounds__ (64, 1) m01500_m04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const u32x *words_buf_r, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + const u32 lid = threadIdx.x; + + const u32 s0 = digests_buf[digests_offset].digest_buf[0]; + const u32 s1 = digests_buf[digests_offset].digest_buf[1]; + + if (lid < 32) + { + s_S[lid] = -((s0 >> lid - 0) & 1); + } + else if (lid < 64) + { + s_S[lid] = -((s1 >> lid - 32) & 1); + } + + __syncthreads (); + + if (gid >= gid_max) return; + + /** + * main + */ + + m01500m (pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (64, 1) m01500_m08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const u32x *words_buf_r, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (64, 1) m01500_m16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const u32x *words_buf_r, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (64, 1) m01500_s04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const u32x *words_buf_r, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + const u32 lid = threadIdx.x; + + const u32 s0 = digests_buf[digests_offset].digest_buf[0]; + const u32 s1 = digests_buf[digests_offset].digest_buf[1]; + + if (lid < 32) + { + s_S[lid] = -((s0 >> lid - 0) & 1); + } + else if (lid < 64) + { + s_S[lid] = -((s1 >> lid - 32) & 1); + } + + __syncthreads (); + + if (gid >= gid_max) return; + + /** + * main + */ + + m01500s (pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (64, 1) m01500_s08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const u32x *words_buf_r, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (64, 1) m01500_s16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const u32x *words_buf_r, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/nv/m01600.cu b/nv/m01600.cu new file mode 100644 index 0000000000..c4ad2effa6 --- /dev/null +++ b/nv/m01600.cu @@ -0,0 +1,1187 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _MD5_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW2 +#define VECT_SIZE1 +#endif + +#define DGST_R0 0 +#define DGST_R1 1 +#define DGST_R2 2 +#define DGST_R3 3 + +#include "include/kernel_functions.c" +#include "types_nv.c" +#include "common_nv.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#define md5apr1_magic0 0x72706124 +#define md5apr1_magic1 0x00002431 + +__device__ static void md5_transform (const u32x w0[4], const u32x w1[4], const u32x w2[4], const u32x w3[4], u32x digest[4]) +{ + u32x a = digest[0]; + u32x b = digest[1]; + u32x c = digest[2]; + u32x d = digest[3]; + + u32x w0_t = w0[0]; + u32x w1_t = w0[1]; + u32x w2_t = w0[2]; + u32x w3_t = w0[3]; + u32x w4_t = w1[0]; + u32x w5_t = w1[1]; + u32x w6_t = w1[2]; + u32x w7_t = w1[3]; + u32x w8_t = w2[0]; + u32x w9_t = w2[1]; + u32x wa_t = w2[2]; + u32x wb_t = w2[3]; + u32x wc_t = w3[0]; + u32x wd_t = w3[1]; + u32x we_t = w3[2]; + u32x wf_t = 0; + + u32x tmp2; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t, MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t, MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t, MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t, MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w4_t, MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w5_t, MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w6_t, MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w7_t, MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w8_t, MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w9_t, MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, wa_t, MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, wb_t, MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, wc_t, MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, wd_t, MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, we_t, MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, wf_t, MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w1_t, MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w6_t, MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, wb_t, MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t, MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w5_t, MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, wa_t, MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, wf_t, MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w4_t, MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w9_t, MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, we_t, MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t, MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w8_t, MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, wd_t, MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t, MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w7_t, MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, wc_t, MD5C1f, MD5S13); + + MD5_STEP (MD5_H1, a, b, c, d, w5_t, MD5C20, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w8_t, MD5C21, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, wb_t, MD5C22, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, we_t, MD5C23, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w1_t, MD5C24, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w4_t, MD5C25, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w7_t, MD5C26, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, wa_t, MD5C27, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, wd_t, MD5C28, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w0_t, MD5C29, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w3_t, MD5C2a, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w6_t, MD5C2b, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w9_t, MD5C2c, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, wc_t, MD5C2d, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, wf_t, MD5C2e, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w2_t, MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t, MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w7_t, MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, we_t, MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w5_t, MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, wc_t, MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t, MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, wa_t, MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t, MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w8_t, MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, wf_t, MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w6_t, MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, wd_t, MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w4_t, MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, wb_t, MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t, MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w9_t, MD5C3f, MD5S33); + + digest[0] += a; + digest[1] += b; + digest[2] += c; + digest[3] += d; +} + +__device__ static void memcat16 (u32x block0[4], u32x block1[4], u32x block2[4], u32x block3[4], const u32 block_len, const u32x append[4]) +{ + u32x tmp0; + u32x tmp1; + u32x tmp2; + u32x tmp3; + u32x tmp4; + + #if __CUDA_ARCH__ >= 200 + + const int offset_minus_4 = 4 - (block_len & 3); + + const int selector = (0x76543210 >> (offset_minus_4 * 4)) & 0xffff; + + tmp0 = __byte_perm ( 0, append[0], selector); + tmp1 = __byte_perm (append[0], append[1], selector); + tmp2 = __byte_perm (append[1], append[2], selector); + tmp3 = __byte_perm (append[2], append[3], selector); + tmp4 = __byte_perm (append[3], 0, selector); + + #else + + const u32 mod = block_len & 3; + + switch (mod) + { + case 0: tmp0 = append[0]; + tmp1 = append[1]; + tmp2 = append[2]; + tmp3 = append[3]; + tmp4 = 0; + break; + case 1: tmp0 = append[0] << 8; + tmp1 = append[0] >> 24 | append[1] << 8; + tmp2 = append[1] >> 24 | append[2] << 8; + tmp3 = append[2] >> 24 | append[3] << 8; + tmp4 = append[3] >> 24; + break; + case 2: tmp0 = append[0] << 16; + tmp1 = append[0] >> 16 | append[1] << 16; + tmp2 = append[1] >> 16 | append[2] << 16; + tmp3 = append[2] >> 16 | append[3] << 16; + tmp4 = append[3] >> 16; + break; + case 3: tmp0 = append[0] << 24; + tmp1 = append[0] >> 8 | append[1] << 24; + tmp2 = append[1] >> 8 | append[2] << 24; + tmp3 = append[2] >> 8 | append[3] << 24; + tmp4 = append[3] >> 8; + break; + } + + #endif + + const u32 div = block_len / 4; + + switch (div) + { + case 0: block0[0] |= tmp0; + block0[1] = tmp1; + block0[2] = tmp2; + block0[3] = tmp3; + block1[0] = tmp4; + break; + case 1: block0[1] |= tmp0; + block0[2] = tmp1; + block0[3] = tmp2; + block1[0] = tmp3; + block1[1] = tmp4; + break; + case 2: block0[2] |= tmp0; + block0[3] = tmp1; + block1[0] = tmp2; + block1[1] = tmp3; + block1[2] = tmp4; + break; + case 3: block0[3] |= tmp0; + block1[0] = tmp1; + block1[1] = tmp2; + block1[2] = tmp3; + block1[3] = tmp4; + break; + case 4: block1[0] |= tmp0; + block1[1] = tmp1; + block1[2] = tmp2; + block1[3] = tmp3; + block2[0] = tmp4; + break; + case 5: block1[1] |= tmp0; + block1[2] = tmp1; + block1[3] = tmp2; + block2[0] = tmp3; + block2[1] = tmp4; + break; + case 6: block1[2] |= tmp0; + block1[3] = tmp1; + block2[0] = tmp2; + block2[1] = tmp3; + block2[2] = tmp4; + break; + case 7: block1[3] |= tmp0; + block2[0] = tmp1; + block2[1] = tmp2; + block2[2] = tmp3; + block2[3] = tmp4; + break; + case 8: block2[0] |= tmp0; + block2[1] = tmp1; + block2[2] = tmp2; + block2[3] = tmp3; + block3[0] = tmp4; + break; + case 9: block2[1] |= tmp0; + block2[2] = tmp1; + block2[3] = tmp2; + block3[0] = tmp3; + block3[1] = tmp4; + break; + } + + return; +} + +__device__ static void memcat16_x80 (u32x block0[4], u32x block1[4], u32x block2[4], u32x block3[4], const u32 block_len, const u32x append[4]) +{ + u32x tmp0; + u32x tmp1; + u32x tmp2; + u32x tmp3; + u32x tmp4; + + #if __CUDA_ARCH__ >= 200 + + const int offset_minus_4 = 4 - (block_len & 3); + + const int selector = (0x76543210 >> (offset_minus_4 * 4)) & 0xffff; + + tmp0 = __byte_perm ( 0, append[0], selector); + tmp1 = __byte_perm (append[0], append[1], selector); + tmp2 = __byte_perm (append[1], append[2], selector); + tmp3 = __byte_perm (append[2], append[3], selector); + tmp4 = __byte_perm (append[3], 0x80, selector); + + #else + + const u32 mod = block_len & 3; + + switch (mod) + { + case 0: tmp0 = append[0]; + tmp1 = append[1]; + tmp2 = append[2]; + tmp3 = append[3]; + tmp4 = 0x80; + break; + case 1: tmp0 = append[0] << 8; + tmp1 = append[0] >> 24 | append[1] << 8; + tmp2 = append[1] >> 24 | append[2] << 8; + tmp3 = append[2] >> 24 | append[3] << 8; + tmp4 = append[3] >> 24; + break; + case 2: tmp0 = append[0] << 16; + tmp1 = append[0] >> 16 | append[1] << 16; + tmp2 = append[1] >> 16 | append[2] << 16; + tmp3 = append[2] >> 16 | append[3] << 16; + tmp4 = append[3] >> 16; + break; + case 3: tmp0 = append[0] << 24; + tmp1 = append[0] >> 8 | append[1] << 24; + tmp2 = append[1] >> 8 | append[2] << 24; + tmp3 = append[2] >> 8 | append[3] << 24; + tmp4 = append[3] >> 8; + break; + } + + #endif + + const u32 div = block_len / 4; + + switch (div) + { + case 0: block0[0] |= tmp0; + block0[1] = tmp1; + block0[2] = tmp2; + block0[3] = tmp3; + block1[0] = tmp4; + break; + case 1: block0[1] |= tmp0; + block0[2] = tmp1; + block0[3] = tmp2; + block1[0] = tmp3; + block1[1] = tmp4; + break; + case 2: block0[2] |= tmp0; + block0[3] = tmp1; + block1[0] = tmp2; + block1[1] = tmp3; + block1[2] = tmp4; + break; + case 3: block0[3] |= tmp0; + block1[0] = tmp1; + block1[1] = tmp2; + block1[2] = tmp3; + block1[3] = tmp4; + break; + case 4: block1[0] |= tmp0; + block1[1] = tmp1; + block1[2] = tmp2; + block1[3] = tmp3; + block2[0] = tmp4; + break; + case 5: block1[1] |= tmp0; + block1[2] = tmp1; + block1[3] = tmp2; + block2[0] = tmp3; + block2[1] = tmp4; + break; + case 6: block1[2] |= tmp0; + block1[3] = tmp1; + block2[0] = tmp2; + block2[1] = tmp3; + block2[2] = tmp4; + break; + case 7: block1[3] |= tmp0; + block2[0] = tmp1; + block2[1] = tmp2; + block2[2] = tmp3; + block2[3] = tmp4; + break; + case 8: block2[0] |= tmp0; + block2[1] = tmp1; + block2[2] = tmp2; + block2[3] = tmp3; + block3[0] = tmp4; + break; + case 9: block2[1] |= tmp0; + block2[2] = tmp1; + block2[3] = tmp2; + block3[0] = tmp3; + block3[1] = tmp4; + break; + } + + return; +} + +__device__ static void memcat8 (u32x block0[4], u32x block1[4], u32x block2[4], u32x block3[4], const u32 block_len, const u32 append[2]) +{ + u32x tmp0; + u32x tmp1; + u32x tmp2; + + #if __CUDA_ARCH__ >= 200 + + const int offset_minus_4 = 4 - (block_len & 3); + + const int selector = (0x76543210 >> (offset_minus_4 * 4)) & 0xffff; + + tmp0 = __byte_perm ( 0, append[0], selector); + tmp1 = __byte_perm (append[0], append[1], selector); + tmp2 = __byte_perm (append[1], 0, selector); + + #else + + const u32 mod = block_len & 3; + + switch (mod) + { + case 0: tmp0 = append[0]; + tmp1 = append[1]; + tmp2 = 0; + break; + case 1: tmp0 = append[0] << 8; + tmp1 = append[0] >> 24 | append[1] << 8; + tmp2 = append[1] >> 24; + break; + case 2: tmp0 = append[0] << 16; + tmp1 = append[0] >> 16 | append[1] << 16; + tmp2 = append[1] >> 16; + break; + case 3: tmp0 = append[0] << 24; + tmp1 = append[0] >> 8 | append[1] << 24; + tmp2 = append[1] >> 8; + break; + } + + #endif + + const u32 div = block_len / 4; + + switch (div) + { + case 0: block0[0] |= tmp0; + block0[1] = tmp1; + block0[2] = tmp2; + break; + case 1: block0[1] |= tmp0; + block0[2] = tmp1; + block0[3] = tmp2; + break; + case 2: block0[2] |= tmp0; + block0[3] = tmp1; + block1[0] = tmp2; + break; + case 3: block0[3] |= tmp0; + block1[0] = tmp1; + block1[1] = tmp2; + break; + case 4: block1[0] |= tmp0; + block1[1] = tmp1; + block1[2] = tmp2; + break; + case 5: block1[1] |= tmp0; + block1[2] = tmp1; + block1[3] = tmp2; + break; + case 6: block1[2] |= tmp0; + block1[3] = tmp1; + block2[0] = tmp2; + break; + case 7: block1[3] |= tmp0; + block2[0] = tmp1; + block2[1] = tmp2; + break; + case 8: block2[0] |= tmp0; + block2[1] = tmp1; + block2[2] = tmp2; + break; + case 9: block2[1] |= tmp0; + block2[2] = tmp1; + block2[3] = tmp2; + break; + case 10: block2[2] |= tmp0; + block2[3] = tmp1; + block3[0] = tmp2; + break; + case 11: block2[3] |= tmp0; + block3[0] = tmp1; + block3[1] = tmp2; + break; + } + + return; +} + +__device__ static void append_sign (u32x block0[4], u32x block1[4], const u32 block_len) +{ + switch (block_len) + { + case 0: + block0[0] = md5apr1_magic0; + block0[1] = md5apr1_magic1; + break; + + case 1: + block0[0] = block0[0] | md5apr1_magic0 << 8; + block0[1] = md5apr1_magic0 >> 24 | md5apr1_magic1 << 8; + block0[2] = md5apr1_magic1 >> 24; + break; + + case 2: + block0[0] = block0[0] | md5apr1_magic0 << 16; + block0[1] = md5apr1_magic0 >> 16 | md5apr1_magic1 << 16; + block0[2] = md5apr1_magic1 >> 16; + break; + + case 3: + block0[0] = block0[0] | md5apr1_magic0 << 24; + block0[1] = md5apr1_magic0 >> 8 | md5apr1_magic1 << 24; + block0[2] = md5apr1_magic1 >> 8; + break; + + case 4: + block0[1] = md5apr1_magic0; + block0[2] = md5apr1_magic1; + break; + + case 5: + block0[1] = block0[1] | md5apr1_magic0 << 8; + block0[2] = md5apr1_magic0 >> 24 | md5apr1_magic1 << 8; + block0[3] = md5apr1_magic1 >> 24; + break; + + case 6: + block0[1] = block0[1] | md5apr1_magic0 << 16; + block0[2] = md5apr1_magic0 >> 16 | md5apr1_magic1 << 16; + block0[3] = md5apr1_magic1 >> 16; + break; + + case 7: + block0[1] = block0[1] | md5apr1_magic0 << 24; + block0[2] = md5apr1_magic0 >> 8 | md5apr1_magic1 << 24; + block0[3] = md5apr1_magic1 >> 8; + break; + + case 8: + block0[2] = md5apr1_magic0; + block0[3] = md5apr1_magic1; + break; + + case 9: + block0[2] = block0[2] | md5apr1_magic0 << 8; + block0[3] = md5apr1_magic0 >> 24 | md5apr1_magic1 << 8; + block1[0] = md5apr1_magic1 >> 24; + break; + + case 10: + block0[2] = block0[2] | md5apr1_magic0 << 16; + block0[3] = md5apr1_magic0 >> 16 | md5apr1_magic1 << 16; + block1[0] = md5apr1_magic1 >> 16; + break; + + case 11: + block0[2] = block0[2] | md5apr1_magic0 << 24; + block0[3] = md5apr1_magic0 >> 8 | md5apr1_magic1 << 24; + block1[0] = md5apr1_magic1 >> 8; + break; + + case 12: + block0[3] = md5apr1_magic0; + block1[0] = md5apr1_magic1; + break; + + case 13: + block0[3] = block0[3] | md5apr1_magic0 << 8; + block1[0] = md5apr1_magic0 >> 24 | md5apr1_magic1 << 8; + block1[1] = md5apr1_magic1 >> 24; + break; + + case 14: + block0[3] = block0[3] | md5apr1_magic0 << 16; + block1[0] = md5apr1_magic0 >> 16 | md5apr1_magic1 << 16; + block1[1] = md5apr1_magic1 >> 16; + break; + + case 15: + block0[3] = block0[3] | md5apr1_magic0 << 24; + block1[0] = md5apr1_magic0 >> 8 | md5apr1_magic1 << 24; + block1[1] = md5apr1_magic1 >> 8; + break; + } +} + +__device__ static void append_1st (u32x block0[4], u32x block1[4], u32x block2[4], u32x block3[4], const u32 block_len, const u32x append) +{ + switch (block_len) + { + case 0: + block0[0] = append; + break; + + case 1: + block0[0] = block0[0] | append << 8; + break; + + case 2: + block0[0] = block0[0] | append << 16; + break; + + case 3: + block0[0] = block0[0] | append << 24; + break; + + case 4: + block0[1] = append; + break; + + case 5: + block0[1] = block0[1] | append << 8; + break; + + case 6: + block0[1] = block0[1] | append << 16; + break; + + case 7: + block0[1] = block0[1] | append << 24; + break; + + case 8: + block0[2] = append; + break; + + case 9: + block0[2] = block0[2] | append << 8; + break; + + case 10: + block0[2] = block0[2] | append << 16; + break; + + case 11: + block0[2] = block0[2] | append << 24; + break; + + case 12: + block0[3] = append; + break; + + case 13: + block0[3] = block0[3] | append << 8; + break; + + case 14: + block0[3] = block0[3] | append << 16; + break; + + case 15: + block0[3] = block0[3] | append << 24; + break; + + case 16: + block1[0] = append; + break; + + case 17: + block1[0] = block1[0] | append << 8; + break; + + case 18: + block1[0] = block1[0] | append << 16; + break; + + case 19: + block1[0] = block1[0] | append << 24; + break; + + case 20: + block1[1] = append; + break; + + case 21: + block1[1] = block1[1] | append << 8; + break; + + case 22: + block1[1] = block1[1] | append << 16; + break; + + case 23: + block1[1] = block1[1] | append << 24; + break; + + case 24: + block1[2] = append; + break; + + case 25: + block1[2] = block1[2] | append << 8; + break; + + case 26: + block1[2] = block1[2] | append << 16; + break; + + case 27: + block1[2] = block1[2] | append << 24; + break; + + case 28: + block1[3] = append; + break; + + case 29: + block1[3] = block1[3] | append << 8; + break; + + case 30: + block1[3] = block1[3] | append << 16; + break; + + case 31: + block1[3] = block1[3] | append << 24; + break; + + case 32: + block2[0] = append; + break; + + case 33: + block2[0] = block2[0] | append << 8; + break; + + case 34: + block2[0] = block2[0] | append << 16; + break; + + case 35: + block2[0] = block2[0] | append << 24; + break; + + case 36: + block2[1] = append; + break; + + case 37: + block2[1] = block2[1] | append << 8; + break; + + case 38: + block2[1] = block2[1] | append << 16; + break; + + case 39: + block2[1] = block2[1] | append << 24; + break; + + case 40: + block2[2] = append; + break; + + case 41: + block2[2] = block2[2] | append << 8; + break; + + case 42: + block2[2] = block2[2] | append << 16; + break; + + case 43: + block2[2] = block2[2] | append << 24; + break; + + case 44: + block2[3] = append; + break; + + case 45: + block2[3] = block2[3] | append << 8; + break; + + case 46: + block2[3] = block2[3] | append << 16; + break; + + case 47: + block2[3] = block2[3] | append << 24; + break; + + case 48: + block3[0] = append; + break; + + case 49: + block3[0] = block3[0] | append << 8; + break; + + case 50: + block3[0] = block3[0] | append << 16; + break; + + case 51: + block3[0] = block3[0] | append << 24; + break; + + case 52: + block3[1] = append; + break; + + case 53: + block3[1] = block3[1] | append << 8; + break; + + case 54: + block3[1] = block3[1] | append << 16; + break; + + case 55: + block3[1] = block3[1] | append << 24; + break; + + case 56: + block3[2] = append; + break; + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m01600_init (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, md5crypt_tmp_t *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[0]; + w0[1] = pws[gid].i[1]; + w0[2] = pws[gid].i[2]; + w0[3] = pws[gid].i[3]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * salt + */ + + u32 salt_buf[2]; + + salt_buf[0] = salt_bufs[salt_pos].salt_buf[0]; + salt_buf[1] = salt_bufs[salt_pos].salt_buf[1]; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + /** + * init + */ + + //memcat16 (block0, block1, block2, block3, block_len, w0); + //block_len += pw_len; + + u32 block_len = pw_len; + + u32x block0[4]; + + block0[0] = w0[0]; + block0[1] = w0[1]; + block0[2] = w0[2]; + block0[3] = w0[3]; + + u32x block1[4]; + + block1[0] = 0; + block1[1] = 0; + block1[2] = 0; + block1[3] = 0; + + u32x block2[4]; + + block2[0] = 0; + block2[1] = 0; + block2[2] = 0; + block2[3] = 0; + + u32x block3[4]; + + block3[0] = 0; + block3[1] = 0; + block3[2] = 0; + block3[3] = 0; + + memcat8 (block0, block1, block2, block3, block_len, salt_buf); + + block_len += salt_len; + + memcat16 (block0, block1, block2, block3, block_len, w0); + + block_len += pw_len; + + append_0x80_4 (block0, block1, block2, block3, block_len); + + block3[2] = block_len * 8; + + u32x digest[4]; + + digest[0] = MD5M_A; + digest[1] = MD5M_B; + digest[2] = MD5M_C; + digest[3] = MD5M_D; + + md5_transform (block0, block1, block2, block3, digest); + + /* The password first, since that is what is most unknown */ + /* Then our magic string */ + /* Then the raw salt */ + /* Then just as many characters of the MD5(pw,salt,pw) */ + + //memcat16 (block0, block1, block2, block3, block_len, w); + //block_len += pw_len; + + block_len = pw_len; + + block0[0] = w0[0]; + block0[1] = w0[1]; + block0[2] = w0[2]; + block0[3] = w0[3]; + + block1[0] = 0; + block1[1] = 0; + block1[2] = 0; + block1[3] = 0; + + block2[0] = 0; + block2[1] = 0; + block2[2] = 0; + block2[3] = 0; + + block3[0] = 0; + block3[1] = 0; + block3[2] = 0; + block3[3] = 0; + + append_sign (block0, block1, block_len); + + block_len += 6; + + memcat8 (block0, block1, block2, block3, block_len, salt_buf); + + block_len += salt_len; + + truncate_block (digest, pw_len); + + memcat16 (block0, block1, block2, block3, block_len, digest); + + block_len += pw_len; + + /* Then something really weird... */ + + u32x append = block0[0] & 0xFF; + + for (u32 j = pw_len; j; j >>= 1) + { + if ((j & 1) == 0) + { + append_1st (block0, block1, block2, block3, block_len, append); + } + + block_len++; + } + + append_0x80_4 (block0, block1, block2, block3, block_len); + + block3[2] = block_len * 8; + + digest[0] = MD5M_A; + digest[1] = MD5M_B; + digest[2] = MD5M_C; + digest[3] = MD5M_D; + + md5_transform (block0, block1, block2, block3, digest); + + tmps[gid].digest_buf[0] = digest[0]; + tmps[gid].digest_buf[1] = digest[1]; + tmps[gid].digest_buf[2] = digest[2]; + tmps[gid].digest_buf[3] = digest[3]; +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m01600_loop (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, md5crypt_tmp_t *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[0]; + w0[1] = pws[gid].i[1]; + w0[2] = pws[gid].i[2]; + w0[3] = pws[gid].i[3]; + + const u32 pw_len = pws[gid].pw_len; + + u32x w0_x80[4]; + + w0_x80[0] = w0[0]; + w0_x80[1] = w0[1]; + w0_x80[2] = w0[2]; + w0_x80[3] = w0[3]; + + append_0x80_1 (w0_x80, pw_len); + + /** + * salt + */ + + u32 salt_buf[2]; + + salt_buf[0] = salt_bufs[salt_pos].salt_buf[0]; + salt_buf[1] = salt_bufs[salt_pos].salt_buf[1]; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + /** + * digest + */ + + u32x digest[4]; + + digest[0] = tmps[gid].digest_buf[0]; + digest[1] = tmps[gid].digest_buf[1]; + digest[2] = tmps[gid].digest_buf[2]; + digest[3] = tmps[gid].digest_buf[3]; + + /** + * loop + */ + + /* and now, just to make sure things don't run too fast */ + + u32 block_len; + + u32x block0[4]; + + block0[0] = 0; + block0[1] = 0; + block0[2] = 0; + block0[3] = 0; + + u32x block1[4]; + + block1[0] = 0; + block1[1] = 0; + block1[2] = 0; + block1[3] = 0; + + u32x block2[4]; + + block2[0] = 0; + block2[1] = 0; + block2[2] = 0; + block2[3] = 0; + + u32x block3[4]; + + block3[0] = 0; + block3[1] = 0; + block3[2] = 0; + block3[3] = 0; + + for (u32 i = 0, j = loop_pos; i < loop_cnt; i++, j++) + { + block1[0] = 0; + block1[1] = 0; + block1[2] = 0; + block1[3] = 0; + block2[0] = 0; + block2[1] = 0; + block2[2] = 0; + block2[3] = 0; + block3[0] = 0; + block3[1] = 0; + + const u32 j1 = (j & 1) ? 1 : 0; + const u32 j3 = (j % 3) ? 1 : 0; + const u32 j7 = (j % 7) ? 1 : 0; + + if (j1) + { + block0[0] = w0[0]; + block0[1] = w0[1]; + block0[2] = w0[2]; + block0[3] = w0[3]; + + block_len = pw_len; + + if (j3) + { + memcat8 (block0, block1, block2, block3, block_len, salt_buf); + + block_len += salt_len; + } + + if (j7) + { + memcat16 (block0, block1, block2, block3, block_len, w0); + + block_len += pw_len; + } + + memcat16_x80 (block0, block1, block2, block3, block_len, digest); + + block_len += 16; + } + else + { + block0[0] = digest[0]; + block0[1] = digest[1]; + block0[2] = digest[2]; + block0[3] = digest[3]; + + block_len = 16; + + if (j3 && j7) + { + block1[0] = salt_buf[0]; + block1[1] = salt_buf[1]; + + block_len += salt_len; + + memcat16 (block0, block1, block2, block3, block_len, w0); + + block_len += pw_len; + } + else if (j3) + { + block1[0] = salt_buf[0]; + block1[1] = salt_buf[1]; + + block_len += salt_len; + } + else if (j7) + { + block1[0] = w0[0]; + block1[1] = w0[1]; + block1[2] = w0[2]; + block1[3] = w0[3]; + + block_len += pw_len; + } + + memcat16 (block0, block1, block2, block3, block_len, w0_x80); + + block_len += pw_len; + } + + block3[2] = block_len * 8; + + digest[0] = MD5M_A; + digest[1] = MD5M_B; + digest[2] = MD5M_C; + digest[3] = MD5M_D; + + md5_transform (block0, block1, block2, block3, digest); + } + + tmps[gid].digest_buf[0] = digest[0]; + tmps[gid].digest_buf[1] = digest[1]; + tmps[gid].digest_buf[2] = digest[2]; + tmps[gid].digest_buf[3] = digest[3]; +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m01600_comp (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, md5crypt_tmp_t *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + const u32 lid = threadIdx.x; + + /** + * digest + */ + + const u32x r0 = tmps[gid].digest_buf[DGST_R0]; + const u32x r1 = tmps[gid].digest_buf[DGST_R1]; + const u32x r2 = tmps[gid].digest_buf[DGST_R2]; + const u32x r3 = tmps[gid].digest_buf[DGST_R3]; + + #define il_pos 0 + + #include VECT_COMPARE_M +} diff --git a/nv/m01700_a0.cu b/nv/m01700_a0.cu new file mode 100644 index 0000000000..a4d7ea82aa --- /dev/null +++ b/nv/m01700_a0.cu @@ -0,0 +1,431 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _SHA512_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW2 +#define VECT_SIZE1 +#endif + +#define DGST_R0 14 +#define DGST_R1 15 +#define DGST_R2 6 +#define DGST_R3 7 + +#include "include/kernel_functions.c" +#include "types_nv.c" +#include "common_nv.c" +#include "include/rp_gpu.h" +#include "rp_nv.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +__device__ __constant__ gpu_rule_t c_rules[1024]; + +__device__ __constant__ u64 k_sha512[80] = +{ + SHA512C00, SHA512C01, SHA512C02, SHA512C03, + SHA512C04, SHA512C05, SHA512C06, SHA512C07, + SHA512C08, SHA512C09, SHA512C0a, SHA512C0b, + SHA512C0c, SHA512C0d, SHA512C0e, SHA512C0f, + SHA512C10, SHA512C11, SHA512C12, SHA512C13, + SHA512C14, SHA512C15, SHA512C16, SHA512C17, + SHA512C18, SHA512C19, SHA512C1a, SHA512C1b, + SHA512C1c, SHA512C1d, SHA512C1e, SHA512C1f, + SHA512C20, SHA512C21, SHA512C22, SHA512C23, + SHA512C24, SHA512C25, SHA512C26, SHA512C27, + SHA512C28, SHA512C29, SHA512C2a, SHA512C2b, + SHA512C2c, SHA512C2d, SHA512C2e, SHA512C2f, + SHA512C30, SHA512C31, SHA512C32, SHA512C33, + SHA512C34, SHA512C35, SHA512C36, SHA512C37, + SHA512C38, SHA512C39, SHA512C3a, SHA512C3b, + SHA512C3c, SHA512C3d, SHA512C3e, SHA512C3f, + SHA512C40, SHA512C41, SHA512C42, SHA512C43, + SHA512C44, SHA512C45, SHA512C46, SHA512C47, + SHA512C48, SHA512C49, SHA512C4a, SHA512C4b, + SHA512C4c, SHA512C4d, SHA512C4e, SHA512C4f, +}; + +__device__ static void sha512_transform (const u32x w0[4], const u32x w1[4], const u32x w2[4], const u32x w3[4], u64x digest[8]) +{ + u64x w0_t = hl32_to_64 (w0[0], w0[1]); + u64x w1_t = hl32_to_64 (w0[2], w0[3]); + u64x w2_t = hl32_to_64 (w1[0], w1[1]); + u64x w3_t = hl32_to_64 (w1[2], w1[3]); + u64x w4_t = hl32_to_64 (w2[0], w2[1]); + u64x w5_t = hl32_to_64 (w2[2], w2[3]); + u64x w6_t = hl32_to_64 (w3[0], w3[1]); + u64x w7_t = 0; + u64x w8_t = 0; + u64x w9_t = 0; + u64x wa_t = 0; + u64x wb_t = 0; + u64x wc_t = 0; + u64x wd_t = 0; + u64x we_t = 0; + u64x wf_t = hl32_to_64 (w3[2], w3[3]); + + u64x a = digest[0]; + u64x b = digest[1]; + u64x c = digest[2]; + u64x d = digest[3]; + u64x e = digest[4]; + u64x f = digest[5]; + u64x g = digest[6]; + u64x h = digest[7]; + + #define ROUND_EXPAND() \ + { \ + w0_t = SHA512_EXPAND (we_t, w9_t, w1_t, w0_t); \ + w1_t = SHA512_EXPAND (wf_t, wa_t, w2_t, w1_t); \ + w2_t = SHA512_EXPAND (w0_t, wb_t, w3_t, w2_t); \ + w3_t = SHA512_EXPAND (w1_t, wc_t, w4_t, w3_t); \ + w4_t = SHA512_EXPAND (w2_t, wd_t, w5_t, w4_t); \ + w5_t = SHA512_EXPAND (w3_t, we_t, w6_t, w5_t); \ + w6_t = SHA512_EXPAND (w4_t, wf_t, w7_t, w6_t); \ + w7_t = SHA512_EXPAND (w5_t, w0_t, w8_t, w7_t); \ + w8_t = SHA512_EXPAND (w6_t, w1_t, w9_t, w8_t); \ + w9_t = SHA512_EXPAND (w7_t, w2_t, wa_t, w9_t); \ + wa_t = SHA512_EXPAND (w8_t, w3_t, wb_t, wa_t); \ + wb_t = SHA512_EXPAND (w9_t, w4_t, wc_t, wb_t); \ + wc_t = SHA512_EXPAND (wa_t, w5_t, wd_t, wc_t); \ + wd_t = SHA512_EXPAND (wb_t, w6_t, we_t, wd_t); \ + we_t = SHA512_EXPAND (wc_t, w7_t, wf_t, we_t); \ + wf_t = SHA512_EXPAND (wd_t, w8_t, w0_t, wf_t); \ + } + + #define ROUND_STEP(i) \ + { \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, a, b, c, d, e, f, g, h, w0_t, k_sha512[i + 0]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, h, a, b, c, d, e, f, g, w1_t, k_sha512[i + 1]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, g, h, a, b, c, d, e, f, w2_t, k_sha512[i + 2]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, f, g, h, a, b, c, d, e, w3_t, k_sha512[i + 3]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, e, f, g, h, a, b, c, d, w4_t, k_sha512[i + 4]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, d, e, f, g, h, a, b, c, w5_t, k_sha512[i + 5]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, c, d, e, f, g, h, a, b, w6_t, k_sha512[i + 6]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, b, c, d, e, f, g, h, a, w7_t, k_sha512[i + 7]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, a, b, c, d, e, f, g, h, w8_t, k_sha512[i + 8]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, h, a, b, c, d, e, f, g, w9_t, k_sha512[i + 9]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, g, h, a, b, c, d, e, f, wa_t, k_sha512[i + 10]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, f, g, h, a, b, c, d, e, wb_t, k_sha512[i + 11]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, e, f, g, h, a, b, c, d, wc_t, k_sha512[i + 12]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, d, e, f, g, h, a, b, c, wd_t, k_sha512[i + 13]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, c, d, e, f, g, h, a, b, we_t, k_sha512[i + 14]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, b, c, d, e, f, g, h, a, wf_t, k_sha512[i + 15]); \ + } + + ROUND_STEP (0); + + for (int i = 16; i < 80; i += 16) + { + ROUND_EXPAND (); ROUND_STEP (i); + } + + /* rev + digest[0] += a; + digest[1] += b; + digest[2] += c; + digest[3] += d; + digest[4] += e; + digest[5] += f; + digest[6] += g; + digest[7] += h; + */ + + digest[0] = a; + digest[1] = b; + digest[2] = c; + digest[3] = d; + digest[4] = e; + digest[5] = f; + digest[6] = g; + digest[7] = h; +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m01700_m04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + u32x pw_buf1[4]; + + pw_buf1[0] = pws[gid].i[ 4]; + pw_buf1[1] = pws[gid].i[ 5]; + pw_buf1[2] = pws[gid].i[ 6]; + pw_buf1[3] = pws[gid].i[ 7]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + + w0[0] = pw_buf0[0]; + w0[1] = pw_buf0[1]; + w0[2] = pw_buf0[2]; + w0[3] = pw_buf0[3]; + + u32x w1[4]; + + w1[0] = pw_buf1[0]; + w1[1] = pw_buf1[1]; + w1[2] = pw_buf1[2]; + w1[3] = pw_buf1[3]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 out_len = apply_rules (c_rules[il_pos].cmds, w0, w1, pw_len); + + append_0x80_2 (w0, w1, out_len); + + /** + * SHA512 + */ + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + w0_t[0] = swap_workaround (w0[0]); + w0_t[1] = swap_workaround (w0[1]); + w0_t[2] = swap_workaround (w0[2]); + w0_t[3] = swap_workaround (w0[3]); + w1_t[0] = swap_workaround (w1[0]); + w1_t[1] = swap_workaround (w1[1]); + w1_t[2] = swap_workaround (w1[2]); + w1_t[3] = swap_workaround (w1[3]); + w2_t[0] = swap_workaround (w2[0]); + w2_t[1] = swap_workaround (w2[1]); + w2_t[2] = swap_workaround (w2[2]); + w2_t[3] = swap_workaround (w2[3]); + w3_t[0] = swap_workaround (w3[0]); + w3_t[1] = swap_workaround (w3[1]); + w3_t[2] = 0; + w3_t[3] = out_len * 8; + + u64x digest[8]; + + digest[0] = SHA512M_A; + digest[1] = SHA512M_B; + digest[2] = SHA512M_C; + digest[3] = SHA512M_D; + digest[4] = SHA512M_E; + digest[5] = SHA512M_F; + digest[6] = SHA512M_G; + digest[7] = SHA512M_H; + + sha512_transform (w0_t, w1_t, w2_t, w3_t, digest); + + + const u32x r0 = l32_from_64 (digest[7]); + const u32x r1 = h32_from_64 (digest[7]); + const u32x r2 = l32_from_64 (digest[3]); + const u32x r3 = h32_from_64 (digest[3]); + + #include VECT_COMPARE_M + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m01700_m08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m01700_m16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m01700_s04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + u32x pw_buf1[4]; + + pw_buf1[0] = pws[gid].i[ 4]; + pw_buf1[1] = pws[gid].i[ 5]; + pw_buf1[2] = pws[gid].i[ 6]; + pw_buf1[3] = pws[gid].i[ 7]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + + w0[0] = pw_buf0[0]; + w0[1] = pw_buf0[1]; + w0[2] = pw_buf0[2]; + w0[3] = pw_buf0[3]; + + u32x w1[4]; + + w1[0] = pw_buf1[0]; + w1[1] = pw_buf1[1]; + w1[2] = pw_buf1[2]; + w1[3] = pw_buf1[3]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 out_len = apply_rules (c_rules[il_pos].cmds, w0, w1, pw_len); + + append_0x80_2 (w0, w1, out_len); + + /** + * SHA512 + */ + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + w0_t[0] = swap_workaround (w0[0]); + w0_t[1] = swap_workaround (w0[1]); + w0_t[2] = swap_workaround (w0[2]); + w0_t[3] = swap_workaround (w0[3]); + w1_t[0] = swap_workaround (w1[0]); + w1_t[1] = swap_workaround (w1[1]); + w1_t[2] = swap_workaround (w1[2]); + w1_t[3] = swap_workaround (w1[3]); + w2_t[0] = swap_workaround (w2[0]); + w2_t[1] = swap_workaround (w2[1]); + w2_t[2] = swap_workaround (w2[2]); + w2_t[3] = swap_workaround (w2[3]); + w3_t[0] = swap_workaround (w3[0]); + w3_t[1] = swap_workaround (w3[1]); + w3_t[2] = 0; + w3_t[3] = out_len * 8; + + u64x digest[8]; + + digest[0] = SHA512M_A; + digest[1] = SHA512M_B; + digest[2] = SHA512M_C; + digest[3] = SHA512M_D; + digest[4] = SHA512M_E; + digest[5] = SHA512M_F; + digest[6] = SHA512M_G; + digest[7] = SHA512M_H; + + sha512_transform (w0_t, w1_t, w2_t, w3_t, digest); + + + const u32x r0 = l32_from_64 (digest[7]); + const u32x r1 = h32_from_64 (digest[7]); + const u32x r2 = l32_from_64 (digest[3]); + const u32x r3 = h32_from_64 (digest[3]); + + #include VECT_COMPARE_S + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m01700_s08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m01700_s16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/nv/m01700_a1.cu b/nv/m01700_a1.cu new file mode 100644 index 0000000000..cfdc5ad180 --- /dev/null +++ b/nv/m01700_a1.cu @@ -0,0 +1,529 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _SHA512_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW2 +#define VECT_SIZE1 +#endif + +#define DGST_R0 14 +#define DGST_R1 15 +#define DGST_R2 6 +#define DGST_R3 7 + +#include "include/kernel_functions.c" +#include "types_nv.c" +#include "common_nv.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +__device__ __constant__ comb_t c_combs[1024]; + +__device__ __constant__ u64 k_sha512[80] = +{ + SHA512C00, SHA512C01, SHA512C02, SHA512C03, + SHA512C04, SHA512C05, SHA512C06, SHA512C07, + SHA512C08, SHA512C09, SHA512C0a, SHA512C0b, + SHA512C0c, SHA512C0d, SHA512C0e, SHA512C0f, + SHA512C10, SHA512C11, SHA512C12, SHA512C13, + SHA512C14, SHA512C15, SHA512C16, SHA512C17, + SHA512C18, SHA512C19, SHA512C1a, SHA512C1b, + SHA512C1c, SHA512C1d, SHA512C1e, SHA512C1f, + SHA512C20, SHA512C21, SHA512C22, SHA512C23, + SHA512C24, SHA512C25, SHA512C26, SHA512C27, + SHA512C28, SHA512C29, SHA512C2a, SHA512C2b, + SHA512C2c, SHA512C2d, SHA512C2e, SHA512C2f, + SHA512C30, SHA512C31, SHA512C32, SHA512C33, + SHA512C34, SHA512C35, SHA512C36, SHA512C37, + SHA512C38, SHA512C39, SHA512C3a, SHA512C3b, + SHA512C3c, SHA512C3d, SHA512C3e, SHA512C3f, + SHA512C40, SHA512C41, SHA512C42, SHA512C43, + SHA512C44, SHA512C45, SHA512C46, SHA512C47, + SHA512C48, SHA512C49, SHA512C4a, SHA512C4b, + SHA512C4c, SHA512C4d, SHA512C4e, SHA512C4f, +}; + +__device__ static void sha512_transform (const u32x w0[4], const u32x w1[4], const u32x w2[4], const u32x w3[4], u64x digest[8]) +{ + u64x w0_t = hl32_to_64 (w0[0], w0[1]); + u64x w1_t = hl32_to_64 (w0[2], w0[3]); + u64x w2_t = hl32_to_64 (w1[0], w1[1]); + u64x w3_t = hl32_to_64 (w1[2], w1[3]); + u64x w4_t = hl32_to_64 (w2[0], w2[1]); + u64x w5_t = hl32_to_64 (w2[2], w2[3]); + u64x w6_t = hl32_to_64 (w3[0], w3[1]); + u64x w7_t = 0; + u64x w8_t = 0; + u64x w9_t = 0; + u64x wa_t = 0; + u64x wb_t = 0; + u64x wc_t = 0; + u64x wd_t = 0; + u64x we_t = 0; + u64x wf_t = hl32_to_64 (w3[2], w3[3]); + + u64x a = digest[0]; + u64x b = digest[1]; + u64x c = digest[2]; + u64x d = digest[3]; + u64x e = digest[4]; + u64x f = digest[5]; + u64x g = digest[6]; + u64x h = digest[7]; + + #define ROUND_EXPAND() \ + { \ + w0_t = SHA512_EXPAND (we_t, w9_t, w1_t, w0_t); \ + w1_t = SHA512_EXPAND (wf_t, wa_t, w2_t, w1_t); \ + w2_t = SHA512_EXPAND (w0_t, wb_t, w3_t, w2_t); \ + w3_t = SHA512_EXPAND (w1_t, wc_t, w4_t, w3_t); \ + w4_t = SHA512_EXPAND (w2_t, wd_t, w5_t, w4_t); \ + w5_t = SHA512_EXPAND (w3_t, we_t, w6_t, w5_t); \ + w6_t = SHA512_EXPAND (w4_t, wf_t, w7_t, w6_t); \ + w7_t = SHA512_EXPAND (w5_t, w0_t, w8_t, w7_t); \ + w8_t = SHA512_EXPAND (w6_t, w1_t, w9_t, w8_t); \ + w9_t = SHA512_EXPAND (w7_t, w2_t, wa_t, w9_t); \ + wa_t = SHA512_EXPAND (w8_t, w3_t, wb_t, wa_t); \ + wb_t = SHA512_EXPAND (w9_t, w4_t, wc_t, wb_t); \ + wc_t = SHA512_EXPAND (wa_t, w5_t, wd_t, wc_t); \ + wd_t = SHA512_EXPAND (wb_t, w6_t, we_t, wd_t); \ + we_t = SHA512_EXPAND (wc_t, w7_t, wf_t, we_t); \ + wf_t = SHA512_EXPAND (wd_t, w8_t, w0_t, wf_t); \ + } + + #define ROUND_STEP(i) \ + { \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, a, b, c, d, e, f, g, h, w0_t, k_sha512[i + 0]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, h, a, b, c, d, e, f, g, w1_t, k_sha512[i + 1]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, g, h, a, b, c, d, e, f, w2_t, k_sha512[i + 2]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, f, g, h, a, b, c, d, e, w3_t, k_sha512[i + 3]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, e, f, g, h, a, b, c, d, w4_t, k_sha512[i + 4]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, d, e, f, g, h, a, b, c, w5_t, k_sha512[i + 5]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, c, d, e, f, g, h, a, b, w6_t, k_sha512[i + 6]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, b, c, d, e, f, g, h, a, w7_t, k_sha512[i + 7]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, a, b, c, d, e, f, g, h, w8_t, k_sha512[i + 8]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, h, a, b, c, d, e, f, g, w9_t, k_sha512[i + 9]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, g, h, a, b, c, d, e, f, wa_t, k_sha512[i + 10]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, f, g, h, a, b, c, d, e, wb_t, k_sha512[i + 11]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, e, f, g, h, a, b, c, d, wc_t, k_sha512[i + 12]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, d, e, f, g, h, a, b, c, wd_t, k_sha512[i + 13]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, c, d, e, f, g, h, a, b, we_t, k_sha512[i + 14]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, b, c, d, e, f, g, h, a, wf_t, k_sha512[i + 15]); \ + } + + ROUND_STEP (0); + + for (int i = 16; i < 80; i += 16) + { + ROUND_EXPAND (); ROUND_STEP (i); + } + + /* rev + digest[0] += a; + digest[1] += b; + digest[2] += c; + digest[3] += d; + digest[4] += e; + digest[5] += f; + digest[6] += g; + digest[7] += h; + */ + + digest[0] = a; + digest[1] = b; + digest[2] = c; + digest[3] = d; + digest[4] = e; + digest[5] = f; + digest[6] = g; + digest[7] = h; +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m01700_m04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + append_0x80_2 (wordl0, wordl1, pw_l_len); + + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, c_combs[0].pw_len); + } + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = c_combs[il_pos].pw_len; + + const u32 pw_len = pw_l_len + pw_r_len; + + u32 wordr0[4]; + + wordr0[0] = c_combs[il_pos].i[0]; + wordr0[1] = c_combs[il_pos].i[1]; + wordr0[2] = c_combs[il_pos].i[2]; + wordr0[3] = c_combs[il_pos].i[3]; + + u32 wordr1[4]; + + wordr1[0] = c_combs[il_pos].i[4]; + wordr1[1] = c_combs[il_pos].i[5]; + wordr1[2] = c_combs[il_pos].i[6]; + wordr1[3] = c_combs[il_pos].i[7]; + + u32 wordr2[4]; + + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + + u32 wordr3[4]; + + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + append_0x80_2 (wordr0, wordr1, pw_r_len); + + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + u32x w0[4]; + u32x w1[4]; + u32x w2[4]; + u32x w3[4]; + + w0[0] = wordl0[0] | wordr0[0]; + w0[1] = wordl0[1] | wordr0[1]; + w0[2] = wordl0[2] | wordr0[2]; + w0[3] = wordl0[3] | wordr0[3]; + w1[0] = wordl1[0] | wordr1[0]; + w1[1] = wordl1[1] | wordr1[1]; + w1[2] = wordl1[2] | wordr1[2]; + w1[3] = wordl1[3] | wordr1[3]; + w2[0] = wordl2[0] | wordr2[0]; + w2[1] = wordl2[1] | wordr2[1]; + w2[2] = wordl2[2] | wordr2[2]; + w2[3] = wordl2[3] | wordr2[3]; + w3[0] = wordl3[0] | wordr3[0]; + w3[1] = wordl3[1] | wordr3[1]; + w3[2] = wordl3[2] | wordr3[2]; + w3[3] = wordl3[3] | wordr3[3]; + + /** + * SHA512 + */ + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + w0_t[0] = swap_workaround (w0[0]); + w0_t[1] = swap_workaround (w0[1]); + w0_t[2] = swap_workaround (w0[2]); + w0_t[3] = swap_workaround (w0[3]); + w1_t[0] = swap_workaround (w1[0]); + w1_t[1] = swap_workaround (w1[1]); + w1_t[2] = swap_workaround (w1[2]); + w1_t[3] = swap_workaround (w1[3]); + w2_t[0] = swap_workaround (w2[0]); + w2_t[1] = swap_workaround (w2[1]); + w2_t[2] = swap_workaround (w2[2]); + w2_t[3] = swap_workaround (w2[3]); + w3_t[0] = swap_workaround (w3[0]); + w3_t[1] = swap_workaround (w3[1]); + w3_t[2] = 0; + w3_t[3] = pw_len * 8; + + u64x digest[8]; + + digest[0] = SHA512M_A; + digest[1] = SHA512M_B; + digest[2] = SHA512M_C; + digest[3] = SHA512M_D; + digest[4] = SHA512M_E; + digest[5] = SHA512M_F; + digest[6] = SHA512M_G; + digest[7] = SHA512M_H; + + sha512_transform (w0_t, w1_t, w2_t, w3_t, digest); + + + const u32x r0 = l32_from_64 (digest[7]); + const u32x r1 = h32_from_64 (digest[7]); + const u32x r2 = l32_from_64 (digest[3]); + const u32x r3 = h32_from_64 (digest[3]); + + #include VECT_COMPARE_M + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m01700_m08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m01700_m16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m01700_s04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + append_0x80_2 (wordl0, wordl1, pw_l_len); + + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, c_combs[0].pw_len); + } + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = c_combs[il_pos].pw_len; + + const u32 pw_len = pw_l_len + pw_r_len; + + u32 wordr0[4]; + + wordr0[0] = c_combs[il_pos].i[0]; + wordr0[1] = c_combs[il_pos].i[1]; + wordr0[2] = c_combs[il_pos].i[2]; + wordr0[3] = c_combs[il_pos].i[3]; + + u32 wordr1[4]; + + wordr1[0] = c_combs[il_pos].i[4]; + wordr1[1] = c_combs[il_pos].i[5]; + wordr1[2] = c_combs[il_pos].i[6]; + wordr1[3] = c_combs[il_pos].i[7]; + + u32 wordr2[4]; + + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + + u32 wordr3[4]; + + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + append_0x80_2 (wordr0, wordr1, pw_r_len); + + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + u32x w0[4]; + u32x w1[4]; + u32x w2[4]; + u32x w3[4]; + + w0[0] = wordl0[0] | wordr0[0]; + w0[1] = wordl0[1] | wordr0[1]; + w0[2] = wordl0[2] | wordr0[2]; + w0[3] = wordl0[3] | wordr0[3]; + w1[0] = wordl1[0] | wordr1[0]; + w1[1] = wordl1[1] | wordr1[1]; + w1[2] = wordl1[2] | wordr1[2]; + w1[3] = wordl1[3] | wordr1[3]; + w2[0] = wordl2[0] | wordr2[0]; + w2[1] = wordl2[1] | wordr2[1]; + w2[2] = wordl2[2] | wordr2[2]; + w2[3] = wordl2[3] | wordr2[3]; + w3[0] = wordl3[0] | wordr3[0]; + w3[1] = wordl3[1] | wordr3[1]; + w3[2] = wordl3[2] | wordr3[2]; + w3[3] = wordl3[3] | wordr3[3]; + + /** + * SHA512 + */ + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + w0_t[0] = swap_workaround (w0[0]); + w0_t[1] = swap_workaround (w0[1]); + w0_t[2] = swap_workaround (w0[2]); + w0_t[3] = swap_workaround (w0[3]); + w1_t[0] = swap_workaround (w1[0]); + w1_t[1] = swap_workaround (w1[1]); + w1_t[2] = swap_workaround (w1[2]); + w1_t[3] = swap_workaround (w1[3]); + w2_t[0] = swap_workaround (w2[0]); + w2_t[1] = swap_workaround (w2[1]); + w2_t[2] = swap_workaround (w2[2]); + w2_t[3] = swap_workaround (w2[3]); + w3_t[0] = swap_workaround (w3[0]); + w3_t[1] = swap_workaround (w3[1]); + w3_t[2] = 0; + w3_t[3] = pw_len * 8; + + u64x digest[8]; + + digest[0] = SHA512M_A; + digest[1] = SHA512M_B; + digest[2] = SHA512M_C; + digest[3] = SHA512M_D; + digest[4] = SHA512M_E; + digest[5] = SHA512M_F; + digest[6] = SHA512M_G; + digest[7] = SHA512M_H; + + sha512_transform (w0_t, w1_t, w2_t, w3_t, digest); + + + const u32x r0 = l32_from_64 (digest[7]); + const u32x r1 = h32_from_64 (digest[7]); + const u32x r2 = l32_from_64 (digest[3]); + const u32x r3 = h32_from_64 (digest[3]); + + #include VECT_COMPARE_S + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m01700_s08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m01700_s16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/nv/m01700_a3.cu b/nv/m01700_a3.cu new file mode 100644 index 0000000000..0525f3489d --- /dev/null +++ b/nv/m01700_a3.cu @@ -0,0 +1,540 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _SHA512_ +#define _SCALAR_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW2 +#define VECT_SIZE1 +#endif + +#define DGST_R0 14 +#define DGST_R1 15 +#define DGST_R2 6 +#define DGST_R3 7 + +#include "include/kernel_functions.c" +#include "types_nv.c" +#include "common_nv.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4_warp.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4_warp.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4_warp.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4_warp.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4_warp.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4_warp.c" +#endif + +__device__ __constant__ u32x c_bfs[1024]; + +__device__ __constant__ u64 k_sha512[80] = +{ + SHA512C00, SHA512C01, SHA512C02, SHA512C03, + SHA512C04, SHA512C05, SHA512C06, SHA512C07, + SHA512C08, SHA512C09, SHA512C0a, SHA512C0b, + SHA512C0c, SHA512C0d, SHA512C0e, SHA512C0f, + SHA512C10, SHA512C11, SHA512C12, SHA512C13, + SHA512C14, SHA512C15, SHA512C16, SHA512C17, + SHA512C18, SHA512C19, SHA512C1a, SHA512C1b, + SHA512C1c, SHA512C1d, SHA512C1e, SHA512C1f, + SHA512C20, SHA512C21, SHA512C22, SHA512C23, + SHA512C24, SHA512C25, SHA512C26, SHA512C27, + SHA512C28, SHA512C29, SHA512C2a, SHA512C2b, + SHA512C2c, SHA512C2d, SHA512C2e, SHA512C2f, + SHA512C30, SHA512C31, SHA512C32, SHA512C33, + SHA512C34, SHA512C35, SHA512C36, SHA512C37, + SHA512C38, SHA512C39, SHA512C3a, SHA512C3b, + SHA512C3c, SHA512C3d, SHA512C3e, SHA512C3f, + SHA512C40, SHA512C41, SHA512C42, SHA512C43, + SHA512C44, SHA512C45, SHA512C46, SHA512C47, + SHA512C48, SHA512C49, SHA512C4a, SHA512C4b, + SHA512C4c, SHA512C4d, SHA512C4e, SHA512C4f, +}; + +__device__ static void sha512_transform (const u32x w0[4], const u32x w1[4], const u32x w2[4], const u32x w3[4], u64x digest[8]) +{ + u64x w0_t = hl32_to_64 (w0[0], w0[1]); + u64x w1_t = hl32_to_64 (w0[2], w0[3]); + u64x w2_t = hl32_to_64 (w1[0], w1[1]); + u64x w3_t = hl32_to_64 (w1[2], w1[3]); + u64x w4_t = hl32_to_64 (w2[0], w2[1]); + u64x w5_t = hl32_to_64 (w2[2], w2[3]); + u64x w6_t = hl32_to_64 (w3[0], w3[1]); + u64x w7_t = 0; + u64x w8_t = 0; + u64x w9_t = 0; + u64x wa_t = 0; + u64x wb_t = 0; + u64x wc_t = 0; + u64x wd_t = 0; + u64x we_t = 0; + u64x wf_t = hl32_to_64 (w3[2], w3[3]); + + u64x a = digest[0]; + u64x b = digest[1]; + u64x c = digest[2]; + u64x d = digest[3]; + u64x e = digest[4]; + u64x f = digest[5]; + u64x g = digest[6]; + u64x h = digest[7]; + + #define ROUND_EXPAND() \ + { \ + w0_t = SHA512_EXPAND (we_t, w9_t, w1_t, w0_t); \ + w1_t = SHA512_EXPAND (wf_t, wa_t, w2_t, w1_t); \ + w2_t = SHA512_EXPAND (w0_t, wb_t, w3_t, w2_t); \ + w3_t = SHA512_EXPAND (w1_t, wc_t, w4_t, w3_t); \ + w4_t = SHA512_EXPAND (w2_t, wd_t, w5_t, w4_t); \ + w5_t = SHA512_EXPAND (w3_t, we_t, w6_t, w5_t); \ + w6_t = SHA512_EXPAND (w4_t, wf_t, w7_t, w6_t); \ + w7_t = SHA512_EXPAND (w5_t, w0_t, w8_t, w7_t); \ + w8_t = SHA512_EXPAND (w6_t, w1_t, w9_t, w8_t); \ + w9_t = SHA512_EXPAND (w7_t, w2_t, wa_t, w9_t); \ + wa_t = SHA512_EXPAND (w8_t, w3_t, wb_t, wa_t); \ + wb_t = SHA512_EXPAND (w9_t, w4_t, wc_t, wb_t); \ + wc_t = SHA512_EXPAND (wa_t, w5_t, wd_t, wc_t); \ + wd_t = SHA512_EXPAND (wb_t, w6_t, we_t, wd_t); \ + we_t = SHA512_EXPAND (wc_t, w7_t, wf_t, we_t); \ + wf_t = SHA512_EXPAND (wd_t, w8_t, w0_t, wf_t); \ + } + + #define ROUND_STEP(i) \ + { \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, a, b, c, d, e, f, g, h, w0_t, k_sha512[i + 0]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, h, a, b, c, d, e, f, g, w1_t, k_sha512[i + 1]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, g, h, a, b, c, d, e, f, w2_t, k_sha512[i + 2]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, f, g, h, a, b, c, d, e, w3_t, k_sha512[i + 3]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, e, f, g, h, a, b, c, d, w4_t, k_sha512[i + 4]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, d, e, f, g, h, a, b, c, w5_t, k_sha512[i + 5]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, c, d, e, f, g, h, a, b, w6_t, k_sha512[i + 6]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, b, c, d, e, f, g, h, a, w7_t, k_sha512[i + 7]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, a, b, c, d, e, f, g, h, w8_t, k_sha512[i + 8]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, h, a, b, c, d, e, f, g, w9_t, k_sha512[i + 9]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, g, h, a, b, c, d, e, f, wa_t, k_sha512[i + 10]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, f, g, h, a, b, c, d, e, wb_t, k_sha512[i + 11]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, e, f, g, h, a, b, c, d, wc_t, k_sha512[i + 12]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, d, e, f, g, h, a, b, c, wd_t, k_sha512[i + 13]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, c, d, e, f, g, h, a, b, we_t, k_sha512[i + 14]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, b, c, d, e, f, g, h, a, wf_t, k_sha512[i + 15]); \ + } + + ROUND_STEP (0); + + for (int i = 16; i < 80; i += 16) + { + ROUND_EXPAND (); ROUND_STEP (i); + } + + /* rev + digest[0] += a; + digest[1] += b; + digest[2] += c; + digest[3] += d; + digest[4] += e; + digest[5] += f; + digest[6] += g; + digest[7] += h; + */ + + digest[0] = a; + digest[1] = b; + digest[2] = c; + digest[3] = d; + digest[4] = e; + digest[5] = f; + digest[6] = g; + digest[7] = h; +} + +__device__ static void m01700m (u32 w[16], const u32 pw_len, const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const u32x *words_buf_r, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset) +{ + /** + * modifier + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + const u32 lid = threadIdx.x; + + /** + * loop + */ + + const u32 bf_loops = ceil ((float) bfs_cnt / VECT_DIV); + + u32x w0l = w[0]; + + for (u32 il_pos = 0; il_pos < bf_loops; il_pos++) + { + const u32x w0r = c_bfs[il_pos]; + + const u32x w0 = w0l | w0r; + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + w0_t[0] = w0; + w0_t[1] = w[ 1]; + w0_t[2] = w[ 2]; + w0_t[3] = w[ 3]; + w1_t[0] = w[ 4]; + w1_t[1] = w[ 5]; + w1_t[2] = w[ 6]; + w1_t[3] = w[ 7]; + w2_t[0] = w[ 8]; + w2_t[1] = w[ 9]; + w2_t[2] = w[10]; + w2_t[3] = w[11]; + w3_t[0] = w[12]; + w3_t[1] = w[13]; + w3_t[2] = w[14]; + w3_t[3] = w[15]; + + u64x digest[8]; + + digest[0] = SHA512M_A; + digest[1] = SHA512M_B; + digest[2] = SHA512M_C; + digest[3] = SHA512M_D; + digest[4] = SHA512M_E; + digest[5] = SHA512M_F; + digest[6] = SHA512M_G; + digest[7] = SHA512M_H; + + sha512_transform (w0_t, w1_t, w2_t, w3_t, digest); + + + const u32x r0 = l32_from_64 (digest[7]); + const u32x r1 = h32_from_64 (digest[7]); + const u32x r2 = l32_from_64 (digest[3]); + const u32x r3 = h32_from_64 (digest[3]); + + #include VECT_COMPARE_M + } +} + +__device__ static void m01700s (u32 w[16], const u32 pw_len, const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const u32x *words_buf_r, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset) +{ + /** + * modifier + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + const u32 lid = threadIdx.x; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * loop + */ + + const u32 bf_loops = ceil ((float) bfs_cnt / VECT_DIV); + + u32x w0l = w[0]; + + for (u32 il_pos = 0; il_pos < bf_loops; il_pos++) + { + const u32x w0r = c_bfs[il_pos]; + + const u32x w0 = w0l | w0r; + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + w0_t[0] = w0; + w0_t[1] = w[ 1]; + w0_t[2] = w[ 2]; + w0_t[3] = w[ 3]; + w1_t[0] = w[ 4]; + w1_t[1] = w[ 5]; + w1_t[2] = w[ 6]; + w1_t[3] = w[ 7]; + w2_t[0] = w[ 8]; + w2_t[1] = w[ 9]; + w2_t[2] = w[10]; + w2_t[3] = w[11]; + w3_t[0] = w[12]; + w3_t[1] = w[13]; + w3_t[2] = w[14]; + w3_t[3] = w[15]; + + u64x digest[8]; + + digest[0] = SHA512M_A; + digest[1] = SHA512M_B; + digest[2] = SHA512M_C; + digest[3] = SHA512M_D; + digest[4] = SHA512M_E; + digest[5] = SHA512M_F; + digest[6] = SHA512M_G; + digest[7] = SHA512M_H; + + sha512_transform (w0_t, w1_t, w2_t, w3_t, digest); + + + const u32x r0 = l32_from_64 (digest[7]); + const u32x r1 = h32_from_64 (digest[7]); + const u32x r2 = l32_from_64 (digest[3]); + const u32x r3 = h32_from_64 (digest[3]); + + #include VECT_COMPARE_S + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m01700_m04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const u32x *words_buf_r, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32 w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = 0; + w[ 5] = 0; + w[ 6] = 0; + w[ 7] = 0; + w[ 8] = 0; + w[ 9] = 0; + w[10] = 0; + w[11] = 0; + w[12] = 0; + w[13] = 0; + w[14] = 0; + w[15] = pws[gid].i[15]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m01700m (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m01700_m08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const u32x *words_buf_r, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32 w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = pws[gid].i[ 4]; + w[ 5] = pws[gid].i[ 5]; + w[ 6] = pws[gid].i[ 6]; + w[ 7] = pws[gid].i[ 7]; + w[ 8] = 0; + w[ 9] = 0; + w[10] = 0; + w[11] = 0; + w[12] = 0; + w[13] = 0; + w[14] = 0; + w[15] = pws[gid].i[15]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m01700m (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m01700_m16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const u32x *words_buf_r, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32 w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = pws[gid].i[ 4]; + w[ 5] = pws[gid].i[ 5]; + w[ 6] = pws[gid].i[ 6]; + w[ 7] = pws[gid].i[ 7]; + w[ 8] = pws[gid].i[ 8]; + w[ 9] = pws[gid].i[ 9]; + w[10] = pws[gid].i[10]; + w[11] = pws[gid].i[11]; + w[12] = pws[gid].i[12]; + w[13] = pws[gid].i[13]; + w[14] = pws[gid].i[14]; + w[15] = pws[gid].i[15]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m01700m (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m01700_s04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const u32x *words_buf_r, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32 w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = 0; + w[ 5] = 0; + w[ 6] = 0; + w[ 7] = 0; + w[ 8] = 0; + w[ 9] = 0; + w[10] = 0; + w[11] = 0; + w[12] = 0; + w[13] = 0; + w[14] = 0; + w[15] = pws[gid].i[15]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m01700s (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m01700_s08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const u32x *words_buf_r, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32 w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = pws[gid].i[ 4]; + w[ 5] = pws[gid].i[ 5]; + w[ 6] = pws[gid].i[ 6]; + w[ 7] = pws[gid].i[ 7]; + w[ 8] = 0; + w[ 9] = 0; + w[10] = 0; + w[11] = 0; + w[12] = 0; + w[13] = 0; + w[14] = 0; + w[15] = pws[gid].i[15]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m01700s (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m01700_s16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const u32x *words_buf_r, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32 w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = pws[gid].i[ 4]; + w[ 5] = pws[gid].i[ 5]; + w[ 6] = pws[gid].i[ 6]; + w[ 7] = pws[gid].i[ 7]; + w[ 8] = pws[gid].i[ 8]; + w[ 9] = pws[gid].i[ 9]; + w[10] = pws[gid].i[10]; + w[11] = pws[gid].i[11]; + w[12] = pws[gid].i[12]; + w[13] = pws[gid].i[13]; + w[14] = pws[gid].i[14]; + w[15] = pws[gid].i[15]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m01700s (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} diff --git a/nv/m01710_a0.cu b/nv/m01710_a0.cu new file mode 100644 index 0000000000..6c01148b88 --- /dev/null +++ b/nv/m01710_a0.cu @@ -0,0 +1,583 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _SHA512_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW2 +#define VECT_SIZE1 +#endif + +#define DGST_R0 14 +#define DGST_R1 15 +#define DGST_R2 6 +#define DGST_R3 7 + +#include "include/kernel_functions.c" +#include "types_nv.c" +#include "common_nv.c" +#include "include/rp_gpu.h" +#include "rp_nv.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +__device__ __constant__ gpu_rule_t c_rules[1024]; + +__device__ __constant__ u64 k_sha512[80] = +{ + SHA512C00, SHA512C01, SHA512C02, SHA512C03, + SHA512C04, SHA512C05, SHA512C06, SHA512C07, + SHA512C08, SHA512C09, SHA512C0a, SHA512C0b, + SHA512C0c, SHA512C0d, SHA512C0e, SHA512C0f, + SHA512C10, SHA512C11, SHA512C12, SHA512C13, + SHA512C14, SHA512C15, SHA512C16, SHA512C17, + SHA512C18, SHA512C19, SHA512C1a, SHA512C1b, + SHA512C1c, SHA512C1d, SHA512C1e, SHA512C1f, + SHA512C20, SHA512C21, SHA512C22, SHA512C23, + SHA512C24, SHA512C25, SHA512C26, SHA512C27, + SHA512C28, SHA512C29, SHA512C2a, SHA512C2b, + SHA512C2c, SHA512C2d, SHA512C2e, SHA512C2f, + SHA512C30, SHA512C31, SHA512C32, SHA512C33, + SHA512C34, SHA512C35, SHA512C36, SHA512C37, + SHA512C38, SHA512C39, SHA512C3a, SHA512C3b, + SHA512C3c, SHA512C3d, SHA512C3e, SHA512C3f, + SHA512C40, SHA512C41, SHA512C42, SHA512C43, + SHA512C44, SHA512C45, SHA512C46, SHA512C47, + SHA512C48, SHA512C49, SHA512C4a, SHA512C4b, + SHA512C4c, SHA512C4d, SHA512C4e, SHA512C4f, +}; + +__device__ static void sha512_transform (const u32x w0[4], const u32x w1[4], const u32x w2[4], const u32x w3[4], u64x digest[8]) +{ + u64x w0_t = hl32_to_64 (w0[0], w0[1]); + u64x w1_t = hl32_to_64 (w0[2], w0[3]); + u64x w2_t = hl32_to_64 (w1[0], w1[1]); + u64x w3_t = hl32_to_64 (w1[2], w1[3]); + u64x w4_t = hl32_to_64 (w2[0], w2[1]); + u64x w5_t = hl32_to_64 (w2[2], w2[3]); + u64x w6_t = hl32_to_64 (w3[0], w3[1]); + u64x w7_t = 0; + u64x w8_t = 0; + u64x w9_t = 0; + u64x wa_t = 0; + u64x wb_t = 0; + u64x wc_t = 0; + u64x wd_t = 0; + u64x we_t = 0; + u64x wf_t = hl32_to_64 (w3[2], w3[3]); + + u64x a = digest[0]; + u64x b = digest[1]; + u64x c = digest[2]; + u64x d = digest[3]; + u64x e = digest[4]; + u64x f = digest[5]; + u64x g = digest[6]; + u64x h = digest[7]; + + #define ROUND_EXPAND() \ + { \ + w0_t = SHA512_EXPAND (we_t, w9_t, w1_t, w0_t); \ + w1_t = SHA512_EXPAND (wf_t, wa_t, w2_t, w1_t); \ + w2_t = SHA512_EXPAND (w0_t, wb_t, w3_t, w2_t); \ + w3_t = SHA512_EXPAND (w1_t, wc_t, w4_t, w3_t); \ + w4_t = SHA512_EXPAND (w2_t, wd_t, w5_t, w4_t); \ + w5_t = SHA512_EXPAND (w3_t, we_t, w6_t, w5_t); \ + w6_t = SHA512_EXPAND (w4_t, wf_t, w7_t, w6_t); \ + w7_t = SHA512_EXPAND (w5_t, w0_t, w8_t, w7_t); \ + w8_t = SHA512_EXPAND (w6_t, w1_t, w9_t, w8_t); \ + w9_t = SHA512_EXPAND (w7_t, w2_t, wa_t, w9_t); \ + wa_t = SHA512_EXPAND (w8_t, w3_t, wb_t, wa_t); \ + wb_t = SHA512_EXPAND (w9_t, w4_t, wc_t, wb_t); \ + wc_t = SHA512_EXPAND (wa_t, w5_t, wd_t, wc_t); \ + wd_t = SHA512_EXPAND (wb_t, w6_t, we_t, wd_t); \ + we_t = SHA512_EXPAND (wc_t, w7_t, wf_t, we_t); \ + wf_t = SHA512_EXPAND (wd_t, w8_t, w0_t, wf_t); \ + } + + #define ROUND_STEP(i) \ + { \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, a, b, c, d, e, f, g, h, w0_t, k_sha512[i + 0]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, h, a, b, c, d, e, f, g, w1_t, k_sha512[i + 1]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, g, h, a, b, c, d, e, f, w2_t, k_sha512[i + 2]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, f, g, h, a, b, c, d, e, w3_t, k_sha512[i + 3]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, e, f, g, h, a, b, c, d, w4_t, k_sha512[i + 4]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, d, e, f, g, h, a, b, c, w5_t, k_sha512[i + 5]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, c, d, e, f, g, h, a, b, w6_t, k_sha512[i + 6]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, b, c, d, e, f, g, h, a, w7_t, k_sha512[i + 7]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, a, b, c, d, e, f, g, h, w8_t, k_sha512[i + 8]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, h, a, b, c, d, e, f, g, w9_t, k_sha512[i + 9]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, g, h, a, b, c, d, e, f, wa_t, k_sha512[i + 10]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, f, g, h, a, b, c, d, e, wb_t, k_sha512[i + 11]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, e, f, g, h, a, b, c, d, wc_t, k_sha512[i + 12]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, d, e, f, g, h, a, b, c, wd_t, k_sha512[i + 13]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, c, d, e, f, g, h, a, b, we_t, k_sha512[i + 14]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, b, c, d, e, f, g, h, a, wf_t, k_sha512[i + 15]); \ + } + + ROUND_STEP (0); + + for (int i = 16; i < 80; i += 16) + { + ROUND_EXPAND (); ROUND_STEP (i); + } + + /* rev + digest[0] += a; + digest[1] += b; + digest[2] += c; + digest[3] += d; + digest[4] += e; + digest[5] += f; + digest[6] += g; + digest[7] += h; + */ + + digest[0] = a; + digest[1] = b; + digest[2] = c; + digest[3] = d; + digest[4] = e; + digest[5] = f; + digest[6] = g; + digest[7] = h; +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m01710_m04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + u32x pw_buf1[4]; + + pw_buf1[0] = pws[gid].i[ 4]; + pw_buf1[1] = pws[gid].i[ 5]; + pw_buf1[2] = pws[gid].i[ 6]; + pw_buf1[3] = pws[gid].i[ 7]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[7]; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + + w0[0] = pw_buf0[0]; + w0[1] = pw_buf0[1]; + w0[2] = pw_buf0[2]; + w0[3] = pw_buf0[3]; + + u32x w1[4]; + + w1[0] = pw_buf1[0]; + w1[1] = pw_buf1[1]; + w1[2] = pw_buf1[2]; + w1[3] = pw_buf1[3]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 out_len = apply_rules (c_rules[il_pos].cmds, w0, w1, pw_len); + + /** + * append salt + */ + + u32 s0[4]; + + s0[0] = salt_buf0[0]; + s0[1] = salt_buf0[1]; + s0[2] = salt_buf0[2]; + s0[3] = salt_buf0[3]; + + u32 s1[4]; + + s1[0] = salt_buf1[0]; + s1[1] = salt_buf1[1]; + s1[2] = salt_buf1[2]; + s1[3] = salt_buf1[3]; + + u32 s2[4]; + + s2[0] = 0; + s2[1] = 0; + s2[2] = 0; + s2[3] = 0; + + u32 s3[4]; + + s3[0] = 0; + s3[1] = 0; + s3[2] = 0; + s3[3] = 0; + + switch_buffer_by_offset (s0, s1, s2, s3, out_len); + + const u32 out_salt_len = out_len + salt_len; + + w0[0] |= s0[0]; + w0[1] |= s0[1]; + w0[2] |= s0[2]; + w0[3] |= s0[3]; + + w1[0] |= s1[0]; + w1[1] |= s1[1]; + w1[2] |= s1[2]; + w1[3] |= s1[3]; + + w2[0] |= s2[0]; + w2[1] |= s2[1]; + w2[2] |= s2[2]; + w2[3] |= s2[3]; + + w3[0] |= s3[0]; + w3[1] |= s3[1]; + w3[2] |= s3[2]; + w3[3] |= s3[3]; + + append_0x80_4 (w0, w1, w2, w3, out_salt_len); + + /** + * sha512 + */ + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + w0_t[0] = swap_workaround (w0[0]); + w0_t[1] = swap_workaround (w0[1]); + w0_t[2] = swap_workaround (w0[2]); + w0_t[3] = swap_workaround (w0[3]); + w1_t[0] = swap_workaround (w1[0]); + w1_t[1] = swap_workaround (w1[1]); + w1_t[2] = swap_workaround (w1[2]); + w1_t[3] = swap_workaround (w1[3]); + w2_t[0] = swap_workaround (w2[0]); + w2_t[1] = swap_workaround (w2[1]); + w2_t[2] = swap_workaround (w2[2]); + w2_t[3] = swap_workaround (w2[3]); + w3_t[0] = swap_workaround (w3[0]); + w3_t[1] = swap_workaround (w3[1]); + w3_t[2] = 0; + w3_t[3] = out_salt_len * 8; + + u64x digest[8]; + + digest[0] = SHA512M_A; + digest[1] = SHA512M_B; + digest[2] = SHA512M_C; + digest[3] = SHA512M_D; + digest[4] = SHA512M_E; + digest[5] = SHA512M_F; + digest[6] = SHA512M_G; + digest[7] = SHA512M_H; + + sha512_transform (w0_t, w1_t, w2_t, w3_t, digest); + + + const u32x r0 = l32_from_64 (digest[7]); + const u32x r1 = h32_from_64 (digest[7]); + const u32x r2 = l32_from_64 (digest[3]); + const u32x r3 = h32_from_64 (digest[3]); + + #include VECT_COMPARE_M + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m01710_m08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m01710_m16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m01710_s04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + u32x pw_buf1[4]; + + pw_buf1[0] = pws[gid].i[ 4]; + pw_buf1[1] = pws[gid].i[ 5]; + pw_buf1[2] = pws[gid].i[ 6]; + pw_buf1[3] = pws[gid].i[ 7]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[7]; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + + w0[0] = pw_buf0[0]; + w0[1] = pw_buf0[1]; + w0[2] = pw_buf0[2]; + w0[3] = pw_buf0[3]; + + u32x w1[4]; + + w1[0] = pw_buf1[0]; + w1[1] = pw_buf1[1]; + w1[2] = pw_buf1[2]; + w1[3] = pw_buf1[3]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 out_len = apply_rules (c_rules[il_pos].cmds, w0, w1, pw_len); + + /** + * append salt + */ + + u32 s0[4]; + + s0[0] = salt_buf0[0]; + s0[1] = salt_buf0[1]; + s0[2] = salt_buf0[2]; + s0[3] = salt_buf0[3]; + + u32 s1[4]; + + s1[0] = salt_buf1[0]; + s1[1] = salt_buf1[1]; + s1[2] = salt_buf1[2]; + s1[3] = salt_buf1[3]; + + u32 s2[4]; + + s2[0] = 0; + s2[1] = 0; + s2[2] = 0; + s2[3] = 0; + + u32 s3[4]; + + s3[0] = 0; + s3[1] = 0; + s3[2] = 0; + s3[3] = 0; + + switch_buffer_by_offset (s0, s1, s2, s3, out_len); + + const u32 out_salt_len = out_len + salt_len; + + w0[0] |= s0[0]; + w0[1] |= s0[1]; + w0[2] |= s0[2]; + w0[3] |= s0[3]; + + w1[0] |= s1[0]; + w1[1] |= s1[1]; + w1[2] |= s1[2]; + w1[3] |= s1[3]; + + w2[0] |= s2[0]; + w2[1] |= s2[1]; + w2[2] |= s2[2]; + w2[3] |= s2[3]; + + w3[0] |= s3[0]; + w3[1] |= s3[1]; + w3[2] |= s3[2]; + w3[3] |= s3[3]; + + append_0x80_4 (w0, w1, w2, w3, out_salt_len); + + /** + * sha512 + */ + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + w0_t[0] = swap_workaround (w0[0]); + w0_t[1] = swap_workaround (w0[1]); + w0_t[2] = swap_workaround (w0[2]); + w0_t[3] = swap_workaround (w0[3]); + w1_t[0] = swap_workaround (w1[0]); + w1_t[1] = swap_workaround (w1[1]); + w1_t[2] = swap_workaround (w1[2]); + w1_t[3] = swap_workaround (w1[3]); + w2_t[0] = swap_workaround (w2[0]); + w2_t[1] = swap_workaround (w2[1]); + w2_t[2] = swap_workaround (w2[2]); + w2_t[3] = swap_workaround (w2[3]); + w3_t[0] = swap_workaround (w3[0]); + w3_t[1] = swap_workaround (w3[1]); + w3_t[2] = 0; + w3_t[3] = out_salt_len * 8; + + u64x digest[8]; + + digest[0] = SHA512M_A; + digest[1] = SHA512M_B; + digest[2] = SHA512M_C; + digest[3] = SHA512M_D; + digest[4] = SHA512M_E; + digest[5] = SHA512M_F; + digest[6] = SHA512M_G; + digest[7] = SHA512M_H; + + sha512_transform (w0_t, w1_t, w2_t, w3_t, digest); + + + const u32x r0 = l32_from_64 (digest[7]); + const u32x r1 = h32_from_64 (digest[7]); + const u32x r2 = l32_from_64 (digest[3]); + const u32x r3 = h32_from_64 (digest[3]); + + #include VECT_COMPARE_S + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m01710_s08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m01710_s16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/nv/m01710_a1.cu b/nv/m01710_a1.cu new file mode 100644 index 0000000000..1713fe4224 --- /dev/null +++ b/nv/m01710_a1.cu @@ -0,0 +1,637 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _SHA512_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW2 +#define VECT_SIZE1 +#endif + +#define DGST_R0 14 +#define DGST_R1 15 +#define DGST_R2 6 +#define DGST_R3 7 + +#include "include/kernel_functions.c" +#include "types_nv.c" +#include "common_nv.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +__device__ __constant__ comb_t c_combs[1024]; + +__device__ __constant__ u64 k_sha512[80] = +{ + SHA512C00, SHA512C01, SHA512C02, SHA512C03, + SHA512C04, SHA512C05, SHA512C06, SHA512C07, + SHA512C08, SHA512C09, SHA512C0a, SHA512C0b, + SHA512C0c, SHA512C0d, SHA512C0e, SHA512C0f, + SHA512C10, SHA512C11, SHA512C12, SHA512C13, + SHA512C14, SHA512C15, SHA512C16, SHA512C17, + SHA512C18, SHA512C19, SHA512C1a, SHA512C1b, + SHA512C1c, SHA512C1d, SHA512C1e, SHA512C1f, + SHA512C20, SHA512C21, SHA512C22, SHA512C23, + SHA512C24, SHA512C25, SHA512C26, SHA512C27, + SHA512C28, SHA512C29, SHA512C2a, SHA512C2b, + SHA512C2c, SHA512C2d, SHA512C2e, SHA512C2f, + SHA512C30, SHA512C31, SHA512C32, SHA512C33, + SHA512C34, SHA512C35, SHA512C36, SHA512C37, + SHA512C38, SHA512C39, SHA512C3a, SHA512C3b, + SHA512C3c, SHA512C3d, SHA512C3e, SHA512C3f, + SHA512C40, SHA512C41, SHA512C42, SHA512C43, + SHA512C44, SHA512C45, SHA512C46, SHA512C47, + SHA512C48, SHA512C49, SHA512C4a, SHA512C4b, + SHA512C4c, SHA512C4d, SHA512C4e, SHA512C4f, +}; + +__device__ static void sha512_transform (const u32x w0[4], const u32x w1[4], const u32x w2[4], const u32x w3[4], u64x digest[8]) +{ + u64x w0_t = hl32_to_64 (w0[0], w0[1]); + u64x w1_t = hl32_to_64 (w0[2], w0[3]); + u64x w2_t = hl32_to_64 (w1[0], w1[1]); + u64x w3_t = hl32_to_64 (w1[2], w1[3]); + u64x w4_t = hl32_to_64 (w2[0], w2[1]); + u64x w5_t = hl32_to_64 (w2[2], w2[3]); + u64x w6_t = hl32_to_64 (w3[0], w3[1]); + u64x w7_t = 0; + u64x w8_t = 0; + u64x w9_t = 0; + u64x wa_t = 0; + u64x wb_t = 0; + u64x wc_t = 0; + u64x wd_t = 0; + u64x we_t = 0; + u64x wf_t = hl32_to_64 (w3[2], w3[3]); + + u64x a = digest[0]; + u64x b = digest[1]; + u64x c = digest[2]; + u64x d = digest[3]; + u64x e = digest[4]; + u64x f = digest[5]; + u64x g = digest[6]; + u64x h = digest[7]; + + #define ROUND_EXPAND() \ + { \ + w0_t = SHA512_EXPAND (we_t, w9_t, w1_t, w0_t); \ + w1_t = SHA512_EXPAND (wf_t, wa_t, w2_t, w1_t); \ + w2_t = SHA512_EXPAND (w0_t, wb_t, w3_t, w2_t); \ + w3_t = SHA512_EXPAND (w1_t, wc_t, w4_t, w3_t); \ + w4_t = SHA512_EXPAND (w2_t, wd_t, w5_t, w4_t); \ + w5_t = SHA512_EXPAND (w3_t, we_t, w6_t, w5_t); \ + w6_t = SHA512_EXPAND (w4_t, wf_t, w7_t, w6_t); \ + w7_t = SHA512_EXPAND (w5_t, w0_t, w8_t, w7_t); \ + w8_t = SHA512_EXPAND (w6_t, w1_t, w9_t, w8_t); \ + w9_t = SHA512_EXPAND (w7_t, w2_t, wa_t, w9_t); \ + wa_t = SHA512_EXPAND (w8_t, w3_t, wb_t, wa_t); \ + wb_t = SHA512_EXPAND (w9_t, w4_t, wc_t, wb_t); \ + wc_t = SHA512_EXPAND (wa_t, w5_t, wd_t, wc_t); \ + wd_t = SHA512_EXPAND (wb_t, w6_t, we_t, wd_t); \ + we_t = SHA512_EXPAND (wc_t, w7_t, wf_t, we_t); \ + wf_t = SHA512_EXPAND (wd_t, w8_t, w0_t, wf_t); \ + } + + #define ROUND_STEP(i) \ + { \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, a, b, c, d, e, f, g, h, w0_t, k_sha512[i + 0]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, h, a, b, c, d, e, f, g, w1_t, k_sha512[i + 1]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, g, h, a, b, c, d, e, f, w2_t, k_sha512[i + 2]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, f, g, h, a, b, c, d, e, w3_t, k_sha512[i + 3]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, e, f, g, h, a, b, c, d, w4_t, k_sha512[i + 4]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, d, e, f, g, h, a, b, c, w5_t, k_sha512[i + 5]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, c, d, e, f, g, h, a, b, w6_t, k_sha512[i + 6]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, b, c, d, e, f, g, h, a, w7_t, k_sha512[i + 7]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, a, b, c, d, e, f, g, h, w8_t, k_sha512[i + 8]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, h, a, b, c, d, e, f, g, w9_t, k_sha512[i + 9]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, g, h, a, b, c, d, e, f, wa_t, k_sha512[i + 10]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, f, g, h, a, b, c, d, e, wb_t, k_sha512[i + 11]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, e, f, g, h, a, b, c, d, wc_t, k_sha512[i + 12]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, d, e, f, g, h, a, b, c, wd_t, k_sha512[i + 13]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, c, d, e, f, g, h, a, b, we_t, k_sha512[i + 14]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, b, c, d, e, f, g, h, a, wf_t, k_sha512[i + 15]); \ + } + + ROUND_STEP (0); + + for (int i = 16; i < 80; i += 16) + { + ROUND_EXPAND (); ROUND_STEP (i); + } + + /* rev + digest[0] += a; + digest[1] += b; + digest[2] += c; + digest[3] += d; + digest[4] += e; + digest[5] += f; + digest[6] += g; + digest[7] += h; + */ + + digest[0] = a; + digest[1] = b; + digest[2] = c; + digest[3] = d; + digest[4] = e; + digest[5] = f; + digest[6] = g; + digest[7] = h; +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m01710_m04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, c_combs[0].pw_len); + } + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[7]; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = c_combs[il_pos].pw_len; + + const u32 pw_len = pw_l_len + pw_r_len; + + u32 wordr0[4]; + + wordr0[0] = c_combs[il_pos].i[0]; + wordr0[1] = c_combs[il_pos].i[1]; + wordr0[2] = c_combs[il_pos].i[2]; + wordr0[3] = c_combs[il_pos].i[3]; + + u32 wordr1[4]; + + wordr1[0] = c_combs[il_pos].i[4]; + wordr1[1] = c_combs[il_pos].i[5]; + wordr1[2] = c_combs[il_pos].i[6]; + wordr1[3] = c_combs[il_pos].i[7]; + + u32 wordr2[4]; + + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + + u32 wordr3[4]; + + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + /** + * append salt + */ + + u32 s0[4]; + + s0[0] = salt_buf0[0]; + s0[1] = salt_buf0[1]; + s0[2] = salt_buf0[2]; + s0[3] = salt_buf0[3]; + + u32 s1[4]; + + s1[0] = salt_buf1[0]; + s1[1] = salt_buf1[1]; + s1[2] = salt_buf1[2]; + s1[3] = salt_buf1[3]; + + u32 s2[4]; + + s2[0] = 0; + s2[1] = 0; + s2[2] = 0; + s2[3] = 0; + + u32 s3[4]; + + s3[0] = 0; + s3[1] = 0; + s3[2] = 0; + s3[3] = 0; + + switch_buffer_by_offset (s0, s1, s2, s3, pw_len); + + const u32 pw_salt_len = pw_len + salt_len; + + u32x w0[4]; + u32x w1[4]; + u32x w2[4]; + u32x w3[4]; + + w0[0] = wordl0[0] | wordr0[0] | s0[0]; + w0[1] = wordl0[1] | wordr0[1] | s0[1]; + w0[2] = wordl0[2] | wordr0[2] | s0[2]; + w0[3] = wordl0[3] | wordr0[3] | s0[3]; + w1[0] = wordl1[0] | wordr1[0] | s1[0]; + w1[1] = wordl1[1] | wordr1[1] | s1[1]; + w1[2] = wordl1[2] | wordr1[2] | s1[2]; + w1[3] = wordl1[3] | wordr1[3] | s1[3]; + w2[0] = wordl2[0] | wordr2[0] | s2[0]; + w2[1] = wordl2[1] | wordr2[1] | s2[1]; + w2[2] = wordl2[2] | wordr2[2] | s2[2]; + w2[3] = wordl2[3] | wordr2[3] | s2[3]; + w3[0] = wordl3[0] | wordr3[0] | s3[0]; + w3[1] = wordl3[1] | wordr3[1] | s3[1]; + w3[2] = wordl3[2] | wordr3[2] | s3[2]; + w3[3] = wordl3[3] | wordr3[3] | s3[3]; + + append_0x80_4 (w0, w1, w2, w3, pw_salt_len); + + /** + * sha512 + */ + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + w0_t[0] = swap_workaround (w0[0]); + w0_t[1] = swap_workaround (w0[1]); + w0_t[2] = swap_workaround (w0[2]); + w0_t[3] = swap_workaround (w0[3]); + w1_t[0] = swap_workaround (w1[0]); + w1_t[1] = swap_workaround (w1[1]); + w1_t[2] = swap_workaround (w1[2]); + w1_t[3] = swap_workaround (w1[3]); + w2_t[0] = swap_workaround (w2[0]); + w2_t[1] = swap_workaround (w2[1]); + w2_t[2] = swap_workaround (w2[2]); + w2_t[3] = swap_workaround (w2[3]); + w3_t[0] = swap_workaround (w3[0]); + w3_t[1] = swap_workaround (w3[1]); + w3_t[2] = 0; + w3_t[3] = pw_salt_len * 8; + + u64x digest[8]; + + digest[0] = SHA512M_A; + digest[1] = SHA512M_B; + digest[2] = SHA512M_C; + digest[3] = SHA512M_D; + digest[4] = SHA512M_E; + digest[5] = SHA512M_F; + digest[6] = SHA512M_G; + digest[7] = SHA512M_H; + + sha512_transform (w0_t, w1_t, w2_t, w3_t, digest); + + + const u32x r0 = l32_from_64 (digest[7]); + const u32x r1 = h32_from_64 (digest[7]); + const u32x r2 = l32_from_64 (digest[3]); + const u32x r3 = h32_from_64 (digest[3]); + + #include VECT_COMPARE_M + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m01710_m08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m01710_m16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m01710_s04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, c_combs[0].pw_len); + } + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[7]; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = c_combs[il_pos].pw_len; + + const u32 pw_len = pw_l_len + pw_r_len; + + u32 wordr0[4]; + + wordr0[0] = c_combs[il_pos].i[0]; + wordr0[1] = c_combs[il_pos].i[1]; + wordr0[2] = c_combs[il_pos].i[2]; + wordr0[3] = c_combs[il_pos].i[3]; + + u32 wordr1[4]; + + wordr1[0] = c_combs[il_pos].i[4]; + wordr1[1] = c_combs[il_pos].i[5]; + wordr1[2] = c_combs[il_pos].i[6]; + wordr1[3] = c_combs[il_pos].i[7]; + + u32 wordr2[4]; + + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + + u32 wordr3[4]; + + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + /** + * append salt + */ + + u32 s0[4]; + + s0[0] = salt_buf0[0]; + s0[1] = salt_buf0[1]; + s0[2] = salt_buf0[2]; + s0[3] = salt_buf0[3]; + + u32 s1[4]; + + s1[0] = salt_buf1[0]; + s1[1] = salt_buf1[1]; + s1[2] = salt_buf1[2]; + s1[3] = salt_buf1[3]; + + u32 s2[4]; + + s2[0] = 0; + s2[1] = 0; + s2[2] = 0; + s2[3] = 0; + + u32 s3[4]; + + s3[0] = 0; + s3[1] = 0; + s3[2] = 0; + s3[3] = 0; + + switch_buffer_by_offset (s0, s1, s2, s3, pw_len); + + const u32 pw_salt_len = pw_len + salt_len; + + u32x w0[4]; + u32x w1[4]; + u32x w2[4]; + u32x w3[4]; + + w0[0] = wordl0[0] | wordr0[0] | s0[0]; + w0[1] = wordl0[1] | wordr0[1] | s0[1]; + w0[2] = wordl0[2] | wordr0[2] | s0[2]; + w0[3] = wordl0[3] | wordr0[3] | s0[3]; + w1[0] = wordl1[0] | wordr1[0] | s1[0]; + w1[1] = wordl1[1] | wordr1[1] | s1[1]; + w1[2] = wordl1[2] | wordr1[2] | s1[2]; + w1[3] = wordl1[3] | wordr1[3] | s1[3]; + w2[0] = wordl2[0] | wordr2[0] | s2[0]; + w2[1] = wordl2[1] | wordr2[1] | s2[1]; + w2[2] = wordl2[2] | wordr2[2] | s2[2]; + w2[3] = wordl2[3] | wordr2[3] | s2[3]; + w3[0] = wordl3[0] | wordr3[0] | s3[0]; + w3[1] = wordl3[1] | wordr3[1] | s3[1]; + w3[2] = wordl3[2] | wordr3[2] | s3[2]; + w3[3] = wordl3[3] | wordr3[3] | s3[3]; + + append_0x80_4 (w0, w1, w2, w3, pw_salt_len); + + /** + * sha512 + */ + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + w0_t[0] = swap_workaround (w0[0]); + w0_t[1] = swap_workaround (w0[1]); + w0_t[2] = swap_workaround (w0[2]); + w0_t[3] = swap_workaround (w0[3]); + w1_t[0] = swap_workaround (w1[0]); + w1_t[1] = swap_workaround (w1[1]); + w1_t[2] = swap_workaround (w1[2]); + w1_t[3] = swap_workaround (w1[3]); + w2_t[0] = swap_workaround (w2[0]); + w2_t[1] = swap_workaround (w2[1]); + w2_t[2] = swap_workaround (w2[2]); + w2_t[3] = swap_workaround (w2[3]); + w3_t[0] = swap_workaround (w3[0]); + w3_t[1] = swap_workaround (w3[1]); + w3_t[2] = 0; + w3_t[3] = pw_salt_len * 8; + + u64x digest[8]; + + digest[0] = SHA512M_A; + digest[1] = SHA512M_B; + digest[2] = SHA512M_C; + digest[3] = SHA512M_D; + digest[4] = SHA512M_E; + digest[5] = SHA512M_F; + digest[6] = SHA512M_G; + digest[7] = SHA512M_H; + + sha512_transform (w0_t, w1_t, w2_t, w3_t, digest); + + + const u32x r0 = l32_from_64 (digest[7]); + const u32x r1 = h32_from_64 (digest[7]); + const u32x r2 = l32_from_64 (digest[3]); + const u32x r3 = h32_from_64 (digest[3]); + + #include VECT_COMPARE_S + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m01710_s08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m01710_s16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/nv/m01710_a3.cu b/nv/m01710_a3.cu new file mode 100644 index 0000000000..e995495f34 --- /dev/null +++ b/nv/m01710_a3.cu @@ -0,0 +1,597 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _SHA512_ +#define _SCALAR_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW2 +#define VECT_SIZE1 +#endif + +#define DGST_R0 14 +#define DGST_R1 15 +#define DGST_R2 6 +#define DGST_R3 7 + +#include "include/kernel_functions.c" +#include "types_nv.c" +#include "common_nv.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4_warp.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4_warp.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4_warp.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4_warp.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4_warp.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4_warp.c" +#endif + +__device__ __constant__ u32x c_bfs[1024]; + +__device__ __constant__ u64 k_sha512[80] = +{ + SHA512C00, SHA512C01, SHA512C02, SHA512C03, + SHA512C04, SHA512C05, SHA512C06, SHA512C07, + SHA512C08, SHA512C09, SHA512C0a, SHA512C0b, + SHA512C0c, SHA512C0d, SHA512C0e, SHA512C0f, + SHA512C10, SHA512C11, SHA512C12, SHA512C13, + SHA512C14, SHA512C15, SHA512C16, SHA512C17, + SHA512C18, SHA512C19, SHA512C1a, SHA512C1b, + SHA512C1c, SHA512C1d, SHA512C1e, SHA512C1f, + SHA512C20, SHA512C21, SHA512C22, SHA512C23, + SHA512C24, SHA512C25, SHA512C26, SHA512C27, + SHA512C28, SHA512C29, SHA512C2a, SHA512C2b, + SHA512C2c, SHA512C2d, SHA512C2e, SHA512C2f, + SHA512C30, SHA512C31, SHA512C32, SHA512C33, + SHA512C34, SHA512C35, SHA512C36, SHA512C37, + SHA512C38, SHA512C39, SHA512C3a, SHA512C3b, + SHA512C3c, SHA512C3d, SHA512C3e, SHA512C3f, + SHA512C40, SHA512C41, SHA512C42, SHA512C43, + SHA512C44, SHA512C45, SHA512C46, SHA512C47, + SHA512C48, SHA512C49, SHA512C4a, SHA512C4b, + SHA512C4c, SHA512C4d, SHA512C4e, SHA512C4f, +}; + +__device__ static void sha512_transform (const u32x w0[4], const u32x w1[4], const u32x w2[4], const u32x w3[4], u64x digest[8]) +{ + u64x w0_t = hl32_to_64 (w0[0], w0[1]); + u64x w1_t = hl32_to_64 (w0[2], w0[3]); + u64x w2_t = hl32_to_64 (w1[0], w1[1]); + u64x w3_t = hl32_to_64 (w1[2], w1[3]); + u64x w4_t = hl32_to_64 (w2[0], w2[1]); + u64x w5_t = hl32_to_64 (w2[2], w2[3]); + u64x w6_t = hl32_to_64 (w3[0], w3[1]); + u64x w7_t = 0; + u64x w8_t = 0; + u64x w9_t = 0; + u64x wa_t = 0; + u64x wb_t = 0; + u64x wc_t = 0; + u64x wd_t = 0; + u64x we_t = 0; + u64x wf_t = hl32_to_64 (w3[2], w3[3]); + + u64x a = digest[0]; + u64x b = digest[1]; + u64x c = digest[2]; + u64x d = digest[3]; + u64x e = digest[4]; + u64x f = digest[5]; + u64x g = digest[6]; + u64x h = digest[7]; + + #define ROUND_EXPAND() \ + { \ + w0_t = SHA512_EXPAND (we_t, w9_t, w1_t, w0_t); \ + w1_t = SHA512_EXPAND (wf_t, wa_t, w2_t, w1_t); \ + w2_t = SHA512_EXPAND (w0_t, wb_t, w3_t, w2_t); \ + w3_t = SHA512_EXPAND (w1_t, wc_t, w4_t, w3_t); \ + w4_t = SHA512_EXPAND (w2_t, wd_t, w5_t, w4_t); \ + w5_t = SHA512_EXPAND (w3_t, we_t, w6_t, w5_t); \ + w6_t = SHA512_EXPAND (w4_t, wf_t, w7_t, w6_t); \ + w7_t = SHA512_EXPAND (w5_t, w0_t, w8_t, w7_t); \ + w8_t = SHA512_EXPAND (w6_t, w1_t, w9_t, w8_t); \ + w9_t = SHA512_EXPAND (w7_t, w2_t, wa_t, w9_t); \ + wa_t = SHA512_EXPAND (w8_t, w3_t, wb_t, wa_t); \ + wb_t = SHA512_EXPAND (w9_t, w4_t, wc_t, wb_t); \ + wc_t = SHA512_EXPAND (wa_t, w5_t, wd_t, wc_t); \ + wd_t = SHA512_EXPAND (wb_t, w6_t, we_t, wd_t); \ + we_t = SHA512_EXPAND (wc_t, w7_t, wf_t, we_t); \ + wf_t = SHA512_EXPAND (wd_t, w8_t, w0_t, wf_t); \ + } + + #define ROUND_STEP(i) \ + { \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, a, b, c, d, e, f, g, h, w0_t, k_sha512[i + 0]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, h, a, b, c, d, e, f, g, w1_t, k_sha512[i + 1]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, g, h, a, b, c, d, e, f, w2_t, k_sha512[i + 2]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, f, g, h, a, b, c, d, e, w3_t, k_sha512[i + 3]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, e, f, g, h, a, b, c, d, w4_t, k_sha512[i + 4]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, d, e, f, g, h, a, b, c, w5_t, k_sha512[i + 5]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, c, d, e, f, g, h, a, b, w6_t, k_sha512[i + 6]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, b, c, d, e, f, g, h, a, w7_t, k_sha512[i + 7]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, a, b, c, d, e, f, g, h, w8_t, k_sha512[i + 8]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, h, a, b, c, d, e, f, g, w9_t, k_sha512[i + 9]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, g, h, a, b, c, d, e, f, wa_t, k_sha512[i + 10]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, f, g, h, a, b, c, d, e, wb_t, k_sha512[i + 11]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, e, f, g, h, a, b, c, d, wc_t, k_sha512[i + 12]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, d, e, f, g, h, a, b, c, wd_t, k_sha512[i + 13]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, c, d, e, f, g, h, a, b, we_t, k_sha512[i + 14]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, b, c, d, e, f, g, h, a, wf_t, k_sha512[i + 15]); \ + } + + ROUND_STEP (0); + + for (int i = 16; i < 80; i += 16) + { + ROUND_EXPAND (); ROUND_STEP (i); + } + + /* rev + digest[0] += a; + digest[1] += b; + digest[2] += c; + digest[3] += d; + digest[4] += e; + digest[5] += f; + digest[6] += g; + digest[7] += h; + */ + + digest[0] = a; + digest[1] = b; + digest[2] = c; + digest[3] = d; + digest[4] = e; + digest[5] = f; + digest[6] = g; + digest[7] = h; +} + +__device__ static void m01710m (u32 w[16], const u32 pw_len, const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const u32x *words_buf_r, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset) +{ + /** + * modifier + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + const u32 lid = threadIdx.x; + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[ 1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[ 2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[ 3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[ 4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[ 5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[ 6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[ 7]; + + u32 salt_buf2[4]; + + salt_buf2[0] = salt_bufs[salt_pos].salt_buf[ 8]; + salt_buf2[1] = 0; + salt_buf2[2] = 0; + salt_buf2[3] = 0; + + u32 salt_buf3[4]; + + salt_buf3[0] = 0; + salt_buf3[1] = 0; + salt_buf3[2] = 0; + salt_buf3[3] = 0; + + switch_buffer_by_offset (salt_buf0, salt_buf1, salt_buf2, salt_buf3, pw_len); + + w[ 0] |= swap_workaround (salt_buf0[0]); + w[ 1] |= swap_workaround (salt_buf0[1]); + w[ 2] |= swap_workaround (salt_buf0[2]); + w[ 3] |= swap_workaround (salt_buf0[3]); + w[ 4] |= swap_workaround (salt_buf1[0]); + w[ 5] |= swap_workaround (salt_buf1[1]); + w[ 6] |= swap_workaround (salt_buf1[2]); + w[ 7] |= swap_workaround (salt_buf1[3]); + w[ 8] |= swap_workaround (salt_buf2[0]); + w[ 9] |= swap_workaround (salt_buf2[1]); + w[10] |= swap_workaround (salt_buf2[2]); + w[11] |= swap_workaround (salt_buf2[3]); + w[12] |= swap_workaround (salt_buf3[0]); + w[13] |= swap_workaround (salt_buf3[1]); + w[14] |= swap_workaround (salt_buf3[2]); + w[15] |= swap_workaround (salt_buf3[3]); + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + const u32 pw_salt_len = pw_len + salt_len; + + w[15] = pw_salt_len * 8; + + /** + * loop + */ + + const u32 bf_loops = ceil ((float) bfs_cnt / VECT_DIV); + + u32x w0l = w[0]; + + for (u32 il_pos = 0; il_pos < bf_loops; il_pos++) + { + const u32x w0r = c_bfs[il_pos]; + + const u32x w0 = w0l | w0r; + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + w0_t[0] = w0; + w0_t[1] = w[ 1]; + w0_t[2] = w[ 2]; + w0_t[3] = w[ 3]; + w1_t[0] = w[ 4]; + w1_t[1] = w[ 5]; + w1_t[2] = w[ 6]; + w1_t[3] = w[ 7]; + w2_t[0] = w[ 8]; + w2_t[1] = w[ 9]; + w2_t[2] = w[10]; + w2_t[3] = w[11]; + w3_t[0] = w[12]; + w3_t[1] = w[13]; + w3_t[2] = w[14]; + w3_t[3] = w[15]; + + u64x digest[8]; + + digest[0] = SHA512M_A; + digest[1] = SHA512M_B; + digest[2] = SHA512M_C; + digest[3] = SHA512M_D; + digest[4] = SHA512M_E; + digest[5] = SHA512M_F; + digest[6] = SHA512M_G; + digest[7] = SHA512M_H; + + sha512_transform (w0_t, w1_t, w2_t, w3_t, digest); + + + const u32x r0 = l32_from_64 (digest[7]); + const u32x r1 = h32_from_64 (digest[7]); + const u32x r2 = l32_from_64 (digest[3]); + const u32x r3 = h32_from_64 (digest[3]); + + #include VECT_COMPARE_M + } +} + +__device__ static void m01710s (u32 w[16], const u32 pw_len, const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const u32x *words_buf_r, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset) +{ + /** + * modifier + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + const u32 lid = threadIdx.x; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * loop + */ + + const u32 bf_loops = ceil ((float) bfs_cnt / VECT_DIV); + + u32x w0l = w[0]; + + for (u32 il_pos = 0; il_pos < bf_loops; il_pos++) + { + const u32x w0r = c_bfs[il_pos]; + + const u32x w0 = w0l | w0r; + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + w0_t[0] = w0; + w0_t[1] = w[ 1]; + w0_t[2] = w[ 2]; + w0_t[3] = w[ 3]; + w1_t[0] = w[ 4]; + w1_t[1] = w[ 5]; + w1_t[2] = w[ 6]; + w1_t[3] = w[ 7]; + w2_t[0] = w[ 8]; + w2_t[1] = w[ 9]; + w2_t[2] = w[10]; + w2_t[3] = w[11]; + w3_t[0] = w[12]; + w3_t[1] = w[13]; + w3_t[2] = w[14]; + w3_t[3] = w[15]; + + u64x digest[8]; + + digest[0] = SHA512M_A; + digest[1] = SHA512M_B; + digest[2] = SHA512M_C; + digest[3] = SHA512M_D; + digest[4] = SHA512M_E; + digest[5] = SHA512M_F; + digest[6] = SHA512M_G; + digest[7] = SHA512M_H; + + sha512_transform (w0_t, w1_t, w2_t, w3_t, digest); + + + const u32x r0 = l32_from_64 (digest[7]); + const u32x r1 = h32_from_64 (digest[7]); + const u32x r2 = l32_from_64 (digest[3]); + const u32x r3 = h32_from_64 (digest[3]); + + #include VECT_COMPARE_S + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m01710_m04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const u32x *words_buf_r, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32 w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = 0; + w[ 5] = 0; + w[ 6] = 0; + w[ 7] = 0; + w[ 8] = 0; + w[ 9] = 0; + w[10] = 0; + w[11] = 0; + w[12] = 0; + w[13] = 0; + w[14] = 0; + w[15] = pws[gid].i[15]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m01710m (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m01710_m08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const u32x *words_buf_r, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32 w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = pws[gid].i[ 4]; + w[ 5] = pws[gid].i[ 5]; + w[ 6] = pws[gid].i[ 6]; + w[ 7] = pws[gid].i[ 7]; + w[ 8] = 0; + w[ 9] = 0; + w[10] = 0; + w[11] = 0; + w[12] = 0; + w[13] = 0; + w[14] = 0; + w[15] = pws[gid].i[15]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m01710m (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m01710_m16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const u32x *words_buf_r, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32 w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = pws[gid].i[ 4]; + w[ 5] = pws[gid].i[ 5]; + w[ 6] = pws[gid].i[ 6]; + w[ 7] = pws[gid].i[ 7]; + w[ 8] = pws[gid].i[ 8]; + w[ 9] = pws[gid].i[ 9]; + w[10] = pws[gid].i[10]; + w[11] = pws[gid].i[11]; + w[12] = pws[gid].i[12]; + w[13] = pws[gid].i[13]; + w[14] = pws[gid].i[14]; + w[15] = pws[gid].i[15]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m01710m (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m01710_s04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const u32x *words_buf_r, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32 w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = 0; + w[ 5] = 0; + w[ 6] = 0; + w[ 7] = 0; + w[ 8] = 0; + w[ 9] = 0; + w[10] = 0; + w[11] = 0; + w[12] = 0; + w[13] = 0; + w[14] = 0; + w[15] = pws[gid].i[15]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m01710s (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m01710_s08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const u32x *words_buf_r, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32 w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = pws[gid].i[ 4]; + w[ 5] = pws[gid].i[ 5]; + w[ 6] = pws[gid].i[ 6]; + w[ 7] = pws[gid].i[ 7]; + w[ 8] = 0; + w[ 9] = 0; + w[10] = 0; + w[11] = 0; + w[12] = 0; + w[13] = 0; + w[14] = 0; + w[15] = pws[gid].i[15]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m01710s (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m01710_s16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const u32x *words_buf_r, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32 w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = pws[gid].i[ 4]; + w[ 5] = pws[gid].i[ 5]; + w[ 6] = pws[gid].i[ 6]; + w[ 7] = pws[gid].i[ 7]; + w[ 8] = pws[gid].i[ 8]; + w[ 9] = pws[gid].i[ 9]; + w[10] = pws[gid].i[10]; + w[11] = pws[gid].i[11]; + w[12] = pws[gid].i[12]; + w[13] = pws[gid].i[13]; + w[14] = pws[gid].i[14]; + w[15] = pws[gid].i[15]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m01710s (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} diff --git a/nv/m01720_a0.cu b/nv/m01720_a0.cu new file mode 100644 index 0000000000..cb26aac8ba --- /dev/null +++ b/nv/m01720_a0.cu @@ -0,0 +1,505 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _SHA512_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW2 +#define VECT_SIZE1 +#endif + +#define DGST_R0 14 +#define DGST_R1 15 +#define DGST_R2 6 +#define DGST_R3 7 + +#include "include/kernel_functions.c" +#include "types_nv.c" +#include "common_nv.c" +#include "include/rp_gpu.h" +#include "rp_nv.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +__device__ __constant__ gpu_rule_t c_rules[1024]; + +__device__ __constant__ u64 k_sha512[80] = +{ + SHA512C00, SHA512C01, SHA512C02, SHA512C03, + SHA512C04, SHA512C05, SHA512C06, SHA512C07, + SHA512C08, SHA512C09, SHA512C0a, SHA512C0b, + SHA512C0c, SHA512C0d, SHA512C0e, SHA512C0f, + SHA512C10, SHA512C11, SHA512C12, SHA512C13, + SHA512C14, SHA512C15, SHA512C16, SHA512C17, + SHA512C18, SHA512C19, SHA512C1a, SHA512C1b, + SHA512C1c, SHA512C1d, SHA512C1e, SHA512C1f, + SHA512C20, SHA512C21, SHA512C22, SHA512C23, + SHA512C24, SHA512C25, SHA512C26, SHA512C27, + SHA512C28, SHA512C29, SHA512C2a, SHA512C2b, + SHA512C2c, SHA512C2d, SHA512C2e, SHA512C2f, + SHA512C30, SHA512C31, SHA512C32, SHA512C33, + SHA512C34, SHA512C35, SHA512C36, SHA512C37, + SHA512C38, SHA512C39, SHA512C3a, SHA512C3b, + SHA512C3c, SHA512C3d, SHA512C3e, SHA512C3f, + SHA512C40, SHA512C41, SHA512C42, SHA512C43, + SHA512C44, SHA512C45, SHA512C46, SHA512C47, + SHA512C48, SHA512C49, SHA512C4a, SHA512C4b, + SHA512C4c, SHA512C4d, SHA512C4e, SHA512C4f, +}; + +__device__ static void sha512_transform (const u32x w0[4], const u32x w1[4], const u32x w2[4], const u32x w3[4], u64x digest[8]) +{ + u64x w0_t = hl32_to_64 (w0[0], w0[1]); + u64x w1_t = hl32_to_64 (w0[2], w0[3]); + u64x w2_t = hl32_to_64 (w1[0], w1[1]); + u64x w3_t = hl32_to_64 (w1[2], w1[3]); + u64x w4_t = hl32_to_64 (w2[0], w2[1]); + u64x w5_t = hl32_to_64 (w2[2], w2[3]); + u64x w6_t = hl32_to_64 (w3[0], w3[1]); + u64x w7_t = 0; + u64x w8_t = 0; + u64x w9_t = 0; + u64x wa_t = 0; + u64x wb_t = 0; + u64x wc_t = 0; + u64x wd_t = 0; + u64x we_t = 0; + u64x wf_t = hl32_to_64 (w3[2], w3[3]); + + u64x a = digest[0]; + u64x b = digest[1]; + u64x c = digest[2]; + u64x d = digest[3]; + u64x e = digest[4]; + u64x f = digest[5]; + u64x g = digest[6]; + u64x h = digest[7]; + + #define ROUND_EXPAND() \ + { \ + w0_t = SHA512_EXPAND (we_t, w9_t, w1_t, w0_t); \ + w1_t = SHA512_EXPAND (wf_t, wa_t, w2_t, w1_t); \ + w2_t = SHA512_EXPAND (w0_t, wb_t, w3_t, w2_t); \ + w3_t = SHA512_EXPAND (w1_t, wc_t, w4_t, w3_t); \ + w4_t = SHA512_EXPAND (w2_t, wd_t, w5_t, w4_t); \ + w5_t = SHA512_EXPAND (w3_t, we_t, w6_t, w5_t); \ + w6_t = SHA512_EXPAND (w4_t, wf_t, w7_t, w6_t); \ + w7_t = SHA512_EXPAND (w5_t, w0_t, w8_t, w7_t); \ + w8_t = SHA512_EXPAND (w6_t, w1_t, w9_t, w8_t); \ + w9_t = SHA512_EXPAND (w7_t, w2_t, wa_t, w9_t); \ + wa_t = SHA512_EXPAND (w8_t, w3_t, wb_t, wa_t); \ + wb_t = SHA512_EXPAND (w9_t, w4_t, wc_t, wb_t); \ + wc_t = SHA512_EXPAND (wa_t, w5_t, wd_t, wc_t); \ + wd_t = SHA512_EXPAND (wb_t, w6_t, we_t, wd_t); \ + we_t = SHA512_EXPAND (wc_t, w7_t, wf_t, we_t); \ + wf_t = SHA512_EXPAND (wd_t, w8_t, w0_t, wf_t); \ + } + + #define ROUND_STEP(i) \ + { \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, a, b, c, d, e, f, g, h, w0_t, k_sha512[i + 0]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, h, a, b, c, d, e, f, g, w1_t, k_sha512[i + 1]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, g, h, a, b, c, d, e, f, w2_t, k_sha512[i + 2]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, f, g, h, a, b, c, d, e, w3_t, k_sha512[i + 3]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, e, f, g, h, a, b, c, d, w4_t, k_sha512[i + 4]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, d, e, f, g, h, a, b, c, w5_t, k_sha512[i + 5]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, c, d, e, f, g, h, a, b, w6_t, k_sha512[i + 6]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, b, c, d, e, f, g, h, a, w7_t, k_sha512[i + 7]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, a, b, c, d, e, f, g, h, w8_t, k_sha512[i + 8]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, h, a, b, c, d, e, f, g, w9_t, k_sha512[i + 9]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, g, h, a, b, c, d, e, f, wa_t, k_sha512[i + 10]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, f, g, h, a, b, c, d, e, wb_t, k_sha512[i + 11]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, e, f, g, h, a, b, c, d, wc_t, k_sha512[i + 12]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, d, e, f, g, h, a, b, c, wd_t, k_sha512[i + 13]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, c, d, e, f, g, h, a, b, we_t, k_sha512[i + 14]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, b, c, d, e, f, g, h, a, wf_t, k_sha512[i + 15]); \ + } + + ROUND_STEP (0); + + for (int i = 16; i < 80; i += 16) + { + ROUND_EXPAND (); ROUND_STEP (i); + } + + /* rev + digest[0] += a; + digest[1] += b; + digest[2] += c; + digest[3] += d; + digest[4] += e; + digest[5] += f; + digest[6] += g; + digest[7] += h; + */ + + digest[0] = a; + digest[1] = b; + digest[2] = c; + digest[3] = d; + digest[4] = e; + digest[5] = f; + digest[6] = g; + digest[7] = h; +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m01720_m04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + u32x pw_buf1[4]; + + pw_buf1[0] = pws[gid].i[ 4]; + pw_buf1[1] = pws[gid].i[ 5]; + pw_buf1[2] = pws[gid].i[ 6]; + pw_buf1[3] = pws[gid].i[ 7]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[7]; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + + w0[0] = pw_buf0[0]; + w0[1] = pw_buf0[1]; + w0[2] = pw_buf0[2]; + w0[3] = pw_buf0[3]; + + u32x w1[4]; + + w1[0] = pw_buf1[0]; + w1[1] = pw_buf1[1]; + w1[2] = pw_buf1[2]; + w1[3] = pw_buf1[3]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 out_len = apply_rules (c_rules[il_pos].cmds, w0, w1, pw_len); + + /** + * prepend salt + */ + + const u32 out_salt_len = out_len + salt_len; + + switch_buffer_by_offset (w0, w1, w2, w3, salt_len); + + w0[0] |= salt_buf0[0]; + w0[1] |= salt_buf0[1]; + w0[2] |= salt_buf0[2]; + w0[3] |= salt_buf0[3]; + w1[0] |= salt_buf1[0]; + w1[1] |= salt_buf1[1]; + w1[2] |= salt_buf1[2]; + w1[3] |= salt_buf1[3]; + + append_0x80_4 (w0, w1, w2, w3, out_salt_len); + + /** + * sha512 + */ + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + w0_t[0] = swap_workaround (w0[0]); + w0_t[1] = swap_workaround (w0[1]); + w0_t[2] = swap_workaround (w0[2]); + w0_t[3] = swap_workaround (w0[3]); + w1_t[0] = swap_workaround (w1[0]); + w1_t[1] = swap_workaround (w1[1]); + w1_t[2] = swap_workaround (w1[2]); + w1_t[3] = swap_workaround (w1[3]); + w2_t[0] = swap_workaround (w2[0]); + w2_t[1] = swap_workaround (w2[1]); + w2_t[2] = swap_workaround (w2[2]); + w2_t[3] = swap_workaround (w2[3]); + w3_t[0] = swap_workaround (w3[0]); + w3_t[1] = swap_workaround (w3[1]); + w3_t[2] = 0; + w3_t[3] = out_salt_len * 8; + + u64x digest[8]; + + digest[0] = SHA512M_A; + digest[1] = SHA512M_B; + digest[2] = SHA512M_C; + digest[3] = SHA512M_D; + digest[4] = SHA512M_E; + digest[5] = SHA512M_F; + digest[6] = SHA512M_G; + digest[7] = SHA512M_H; + + sha512_transform (w0_t, w1_t, w2_t, w3_t, digest); + + + const u32x r0 = l32_from_64 (digest[7]); + const u32x r1 = h32_from_64 (digest[7]); + const u32x r2 = l32_from_64 (digest[3]); + const u32x r3 = h32_from_64 (digest[3]); + + #include VECT_COMPARE_M + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m01720_m08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m01720_m16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m01720_s04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + u32x pw_buf1[4]; + + pw_buf1[0] = pws[gid].i[ 4]; + pw_buf1[1] = pws[gid].i[ 5]; + pw_buf1[2] = pws[gid].i[ 6]; + pw_buf1[3] = pws[gid].i[ 7]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[7]; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + + w0[0] = pw_buf0[0]; + w0[1] = pw_buf0[1]; + w0[2] = pw_buf0[2]; + w0[3] = pw_buf0[3]; + + u32x w1[4]; + + w1[0] = pw_buf1[0]; + w1[1] = pw_buf1[1]; + w1[2] = pw_buf1[2]; + w1[3] = pw_buf1[3]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 out_len = apply_rules (c_rules[il_pos].cmds, w0, w1, pw_len); + + /** + * prepend salt + */ + + const u32 out_salt_len = out_len + salt_len; + + switch_buffer_by_offset (w0, w1, w2, w3, salt_len); + + w0[0] |= salt_buf0[0]; + w0[1] |= salt_buf0[1]; + w0[2] |= salt_buf0[2]; + w0[3] |= salt_buf0[3]; + w1[0] |= salt_buf1[0]; + w1[1] |= salt_buf1[1]; + w1[2] |= salt_buf1[2]; + w1[3] |= salt_buf1[3]; + + append_0x80_4 (w0, w1, w2, w3, out_salt_len); + + /** + * sha512 + */ + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + w0_t[0] = swap_workaround (w0[0]); + w0_t[1] = swap_workaround (w0[1]); + w0_t[2] = swap_workaround (w0[2]); + w0_t[3] = swap_workaround (w0[3]); + w1_t[0] = swap_workaround (w1[0]); + w1_t[1] = swap_workaround (w1[1]); + w1_t[2] = swap_workaround (w1[2]); + w1_t[3] = swap_workaround (w1[3]); + w2_t[0] = swap_workaround (w2[0]); + w2_t[1] = swap_workaround (w2[1]); + w2_t[2] = swap_workaround (w2[2]); + w2_t[3] = swap_workaround (w2[3]); + w3_t[0] = swap_workaround (w3[0]); + w3_t[1] = swap_workaround (w3[1]); + w3_t[2] = 0; + w3_t[3] = out_salt_len * 8; + + u64x digest[8]; + + digest[0] = SHA512M_A; + digest[1] = SHA512M_B; + digest[2] = SHA512M_C; + digest[3] = SHA512M_D; + digest[4] = SHA512M_E; + digest[5] = SHA512M_F; + digest[6] = SHA512M_G; + digest[7] = SHA512M_H; + + sha512_transform (w0_t, w1_t, w2_t, w3_t, digest); + + + const u32x r0 = l32_from_64 (digest[7]); + const u32x r1 = h32_from_64 (digest[7]); + const u32x r2 = l32_from_64 (digest[3]); + const u32x r3 = h32_from_64 (digest[3]); + + #include VECT_COMPARE_S + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m01720_s08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m01720_s16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/nv/m01720_a1.cu b/nv/m01720_a1.cu new file mode 100644 index 0000000000..d6bc884399 --- /dev/null +++ b/nv/m01720_a1.cu @@ -0,0 +1,587 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _SHA512_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW2 +#define VECT_SIZE1 +#endif + +#define DGST_R0 14 +#define DGST_R1 15 +#define DGST_R2 6 +#define DGST_R3 7 + +#include "include/kernel_functions.c" +#include "types_nv.c" +#include "common_nv.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +__device__ __constant__ comb_t c_combs[1024]; + +__device__ __constant__ u64 k_sha512[80] = +{ + SHA512C00, SHA512C01, SHA512C02, SHA512C03, + SHA512C04, SHA512C05, SHA512C06, SHA512C07, + SHA512C08, SHA512C09, SHA512C0a, SHA512C0b, + SHA512C0c, SHA512C0d, SHA512C0e, SHA512C0f, + SHA512C10, SHA512C11, SHA512C12, SHA512C13, + SHA512C14, SHA512C15, SHA512C16, SHA512C17, + SHA512C18, SHA512C19, SHA512C1a, SHA512C1b, + SHA512C1c, SHA512C1d, SHA512C1e, SHA512C1f, + SHA512C20, SHA512C21, SHA512C22, SHA512C23, + SHA512C24, SHA512C25, SHA512C26, SHA512C27, + SHA512C28, SHA512C29, SHA512C2a, SHA512C2b, + SHA512C2c, SHA512C2d, SHA512C2e, SHA512C2f, + SHA512C30, SHA512C31, SHA512C32, SHA512C33, + SHA512C34, SHA512C35, SHA512C36, SHA512C37, + SHA512C38, SHA512C39, SHA512C3a, SHA512C3b, + SHA512C3c, SHA512C3d, SHA512C3e, SHA512C3f, + SHA512C40, SHA512C41, SHA512C42, SHA512C43, + SHA512C44, SHA512C45, SHA512C46, SHA512C47, + SHA512C48, SHA512C49, SHA512C4a, SHA512C4b, + SHA512C4c, SHA512C4d, SHA512C4e, SHA512C4f, +}; + +__device__ static void sha512_transform (const u32x w0[4], const u32x w1[4], const u32x w2[4], const u32x w3[4], u64x digest[8]) +{ + u64x w0_t = hl32_to_64 (w0[0], w0[1]); + u64x w1_t = hl32_to_64 (w0[2], w0[3]); + u64x w2_t = hl32_to_64 (w1[0], w1[1]); + u64x w3_t = hl32_to_64 (w1[2], w1[3]); + u64x w4_t = hl32_to_64 (w2[0], w2[1]); + u64x w5_t = hl32_to_64 (w2[2], w2[3]); + u64x w6_t = hl32_to_64 (w3[0], w3[1]); + u64x w7_t = 0; + u64x w8_t = 0; + u64x w9_t = 0; + u64x wa_t = 0; + u64x wb_t = 0; + u64x wc_t = 0; + u64x wd_t = 0; + u64x we_t = 0; + u64x wf_t = hl32_to_64 (w3[2], w3[3]); + + u64x a = digest[0]; + u64x b = digest[1]; + u64x c = digest[2]; + u64x d = digest[3]; + u64x e = digest[4]; + u64x f = digest[5]; + u64x g = digest[6]; + u64x h = digest[7]; + + #define ROUND_EXPAND() \ + { \ + w0_t = SHA512_EXPAND (we_t, w9_t, w1_t, w0_t); \ + w1_t = SHA512_EXPAND (wf_t, wa_t, w2_t, w1_t); \ + w2_t = SHA512_EXPAND (w0_t, wb_t, w3_t, w2_t); \ + w3_t = SHA512_EXPAND (w1_t, wc_t, w4_t, w3_t); \ + w4_t = SHA512_EXPAND (w2_t, wd_t, w5_t, w4_t); \ + w5_t = SHA512_EXPAND (w3_t, we_t, w6_t, w5_t); \ + w6_t = SHA512_EXPAND (w4_t, wf_t, w7_t, w6_t); \ + w7_t = SHA512_EXPAND (w5_t, w0_t, w8_t, w7_t); \ + w8_t = SHA512_EXPAND (w6_t, w1_t, w9_t, w8_t); \ + w9_t = SHA512_EXPAND (w7_t, w2_t, wa_t, w9_t); \ + wa_t = SHA512_EXPAND (w8_t, w3_t, wb_t, wa_t); \ + wb_t = SHA512_EXPAND (w9_t, w4_t, wc_t, wb_t); \ + wc_t = SHA512_EXPAND (wa_t, w5_t, wd_t, wc_t); \ + wd_t = SHA512_EXPAND (wb_t, w6_t, we_t, wd_t); \ + we_t = SHA512_EXPAND (wc_t, w7_t, wf_t, we_t); \ + wf_t = SHA512_EXPAND (wd_t, w8_t, w0_t, wf_t); \ + } + + #define ROUND_STEP(i) \ + { \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, a, b, c, d, e, f, g, h, w0_t, k_sha512[i + 0]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, h, a, b, c, d, e, f, g, w1_t, k_sha512[i + 1]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, g, h, a, b, c, d, e, f, w2_t, k_sha512[i + 2]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, f, g, h, a, b, c, d, e, w3_t, k_sha512[i + 3]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, e, f, g, h, a, b, c, d, w4_t, k_sha512[i + 4]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, d, e, f, g, h, a, b, c, w5_t, k_sha512[i + 5]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, c, d, e, f, g, h, a, b, w6_t, k_sha512[i + 6]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, b, c, d, e, f, g, h, a, w7_t, k_sha512[i + 7]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, a, b, c, d, e, f, g, h, w8_t, k_sha512[i + 8]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, h, a, b, c, d, e, f, g, w9_t, k_sha512[i + 9]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, g, h, a, b, c, d, e, f, wa_t, k_sha512[i + 10]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, f, g, h, a, b, c, d, e, wb_t, k_sha512[i + 11]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, e, f, g, h, a, b, c, d, wc_t, k_sha512[i + 12]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, d, e, f, g, h, a, b, c, wd_t, k_sha512[i + 13]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, c, d, e, f, g, h, a, b, we_t, k_sha512[i + 14]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, b, c, d, e, f, g, h, a, wf_t, k_sha512[i + 15]); \ + } + + ROUND_STEP (0); + + for (int i = 16; i < 80; i += 16) + { + ROUND_EXPAND (); ROUND_STEP (i); + } + + /* rev + digest[0] += a; + digest[1] += b; + digest[2] += c; + digest[3] += d; + digest[4] += e; + digest[5] += f; + digest[6] += g; + digest[7] += h; + */ + + digest[0] = a; + digest[1] = b; + digest[2] = c; + digest[3] = d; + digest[4] = e; + digest[5] = f; + digest[6] = g; + digest[7] = h; +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m01720_m04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, c_combs[0].pw_len); + } + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[7]; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = c_combs[il_pos].pw_len; + + const u32 pw_len = pw_l_len + pw_r_len; + + u32 wordr0[4]; + u32 wordr1[4]; + u32 wordr2[4]; + u32 wordr3[4]; + + wordr0[0] = c_combs[il_pos].i[0]; + wordr0[1] = c_combs[il_pos].i[1]; + wordr0[2] = c_combs[il_pos].i[2]; + wordr0[3] = c_combs[il_pos].i[3]; + wordr1[0] = c_combs[il_pos].i[4]; + wordr1[1] = c_combs[il_pos].i[5]; + wordr1[2] = c_combs[il_pos].i[6]; + wordr1[3] = c_combs[il_pos].i[7]; + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + u32x w0[4]; + u32x w1[4]; + u32x w2[4]; + u32x w3[4]; + + w0[0] = wordl0[0] | wordr0[0]; + w0[1] = wordl0[1] | wordr0[1]; + w0[2] = wordl0[2] | wordr0[2]; + w0[3] = wordl0[3] | wordr0[3]; + w1[0] = wordl1[0] | wordr1[0]; + w1[1] = wordl1[1] | wordr1[1]; + w1[2] = wordl1[2] | wordr1[2]; + w1[3] = wordl1[3] | wordr1[3]; + w2[0] = wordl2[0] | wordr2[0]; + w2[1] = wordl2[1] | wordr2[1]; + w2[2] = wordl2[2] | wordr2[2]; + w2[3] = wordl2[3] | wordr2[3]; + w3[0] = wordl3[0] | wordr3[0]; + w3[1] = wordl3[1] | wordr3[1]; + w3[2] = wordl3[2] | wordr3[2]; + w3[3] = wordl3[3] | wordr3[3]; + + /** + * prepend salt + */ + + const u32 pw_salt_len = pw_len + salt_len; + + switch_buffer_by_offset (w0, w1, w2, w3, salt_len); + + w0[0] |= salt_buf0[0]; + w0[1] |= salt_buf0[1]; + w0[2] |= salt_buf0[2]; + w0[3] |= salt_buf0[3]; + w1[0] |= salt_buf1[0]; + w1[1] |= salt_buf1[1]; + w1[2] |= salt_buf1[2]; + w1[3] |= salt_buf1[3]; + + append_0x80_4 (w0, w1, w2, w3, pw_salt_len); + + /** + * sha512 + */ + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + w0_t[0] = swap_workaround (w0[0]); + w0_t[1] = swap_workaround (w0[1]); + w0_t[2] = swap_workaround (w0[2]); + w0_t[3] = swap_workaround (w0[3]); + w1_t[0] = swap_workaround (w1[0]); + w1_t[1] = swap_workaround (w1[1]); + w1_t[2] = swap_workaround (w1[2]); + w1_t[3] = swap_workaround (w1[3]); + w2_t[0] = swap_workaround (w2[0]); + w2_t[1] = swap_workaround (w2[1]); + w2_t[2] = swap_workaround (w2[2]); + w2_t[3] = swap_workaround (w2[3]); + w3_t[0] = swap_workaround (w3[0]); + w3_t[1] = swap_workaround (w3[1]); + w3_t[2] = 0; + w3_t[3] = pw_salt_len * 8; + + u64x digest[8]; + + digest[0] = SHA512M_A; + digest[1] = SHA512M_B; + digest[2] = SHA512M_C; + digest[3] = SHA512M_D; + digest[4] = SHA512M_E; + digest[5] = SHA512M_F; + digest[6] = SHA512M_G; + digest[7] = SHA512M_H; + + sha512_transform (w0_t, w1_t, w2_t, w3_t, digest); + + + const u32x r0 = l32_from_64 (digest[7]); + const u32x r1 = h32_from_64 (digest[7]); + const u32x r2 = l32_from_64 (digest[3]); + const u32x r3 = h32_from_64 (digest[3]); + + #include VECT_COMPARE_M + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m01720_m08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m01720_m16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m01720_s04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, c_combs[0].pw_len); + } + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[7]; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = c_combs[il_pos].pw_len; + + const u32 pw_len = pw_l_len + pw_r_len; + + u32 wordr0[4]; + u32 wordr1[4]; + u32 wordr2[4]; + u32 wordr3[4]; + + wordr0[0] = c_combs[il_pos].i[0]; + wordr0[1] = c_combs[il_pos].i[1]; + wordr0[2] = c_combs[il_pos].i[2]; + wordr0[3] = c_combs[il_pos].i[3]; + wordr1[0] = c_combs[il_pos].i[4]; + wordr1[1] = c_combs[il_pos].i[5]; + wordr1[2] = c_combs[il_pos].i[6]; + wordr1[3] = c_combs[il_pos].i[7]; + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + u32x w0[4]; + u32x w1[4]; + u32x w2[4]; + u32x w3[4]; + + w0[0] = wordl0[0] | wordr0[0]; + w0[1] = wordl0[1] | wordr0[1]; + w0[2] = wordl0[2] | wordr0[2]; + w0[3] = wordl0[3] | wordr0[3]; + w1[0] = wordl1[0] | wordr1[0]; + w1[1] = wordl1[1] | wordr1[1]; + w1[2] = wordl1[2] | wordr1[2]; + w1[3] = wordl1[3] | wordr1[3]; + w2[0] = wordl2[0] | wordr2[0]; + w2[1] = wordl2[1] | wordr2[1]; + w2[2] = wordl2[2] | wordr2[2]; + w2[3] = wordl2[3] | wordr2[3]; + w3[0] = wordl3[0] | wordr3[0]; + w3[1] = wordl3[1] | wordr3[1]; + w3[2] = wordl3[2] | wordr3[2]; + w3[3] = wordl3[3] | wordr3[3]; + + /** + * prepend salt + */ + + const u32 pw_salt_len = pw_len + salt_len; + + switch_buffer_by_offset (w0, w1, w2, w3, salt_len); + + w0[0] |= salt_buf0[0]; + w0[1] |= salt_buf0[1]; + w0[2] |= salt_buf0[2]; + w0[3] |= salt_buf0[3]; + w1[0] |= salt_buf1[0]; + w1[1] |= salt_buf1[1]; + w1[2] |= salt_buf1[2]; + w1[3] |= salt_buf1[3]; + + append_0x80_4 (w0, w1, w2, w3, pw_salt_len); + + /** + * sha512 + */ + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + w0_t[0] = swap_workaround (w0[0]); + w0_t[1] = swap_workaround (w0[1]); + w0_t[2] = swap_workaround (w0[2]); + w0_t[3] = swap_workaround (w0[3]); + w1_t[0] = swap_workaround (w1[0]); + w1_t[1] = swap_workaround (w1[1]); + w1_t[2] = swap_workaround (w1[2]); + w1_t[3] = swap_workaround (w1[3]); + w2_t[0] = swap_workaround (w2[0]); + w2_t[1] = swap_workaround (w2[1]); + w2_t[2] = swap_workaround (w2[2]); + w2_t[3] = swap_workaround (w2[3]); + w3_t[0] = swap_workaround (w3[0]); + w3_t[1] = swap_workaround (w3[1]); + w3_t[2] = 0; + w3_t[3] = pw_salt_len * 8; + + u64x digest[8]; + + digest[0] = SHA512M_A; + digest[1] = SHA512M_B; + digest[2] = SHA512M_C; + digest[3] = SHA512M_D; + digest[4] = SHA512M_E; + digest[5] = SHA512M_F; + digest[6] = SHA512M_G; + digest[7] = SHA512M_H; + + sha512_transform (w0_t, w1_t, w2_t, w3_t, digest); + + + const u32x r0 = l32_from_64 (digest[7]); + const u32x r1 = h32_from_64 (digest[7]); + const u32x r2 = l32_from_64 (digest[3]); + const u32x r3 = h32_from_64 (digest[3]); + + #include VECT_COMPARE_S + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m01720_s08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m01720_s16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/nv/m01720_a3.cu b/nv/m01720_a3.cu new file mode 100644 index 0000000000..55b879bca8 --- /dev/null +++ b/nv/m01720_a3.cu @@ -0,0 +1,749 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _SHA512_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW2 +#define VECT_SIZE1 +#endif + +#define DGST_R0 14 +#define DGST_R1 15 +#define DGST_R2 6 +#define DGST_R3 7 + +#include "include/kernel_functions.c" +#include "types_nv.c" +#include "common_nv.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +__device__ __constant__ bf_t c_bfs[1024]; + +__device__ __constant__ u64 k_sha512[80] = +{ + SHA512C00, SHA512C01, SHA512C02, SHA512C03, + SHA512C04, SHA512C05, SHA512C06, SHA512C07, + SHA512C08, SHA512C09, SHA512C0a, SHA512C0b, + SHA512C0c, SHA512C0d, SHA512C0e, SHA512C0f, + SHA512C10, SHA512C11, SHA512C12, SHA512C13, + SHA512C14, SHA512C15, SHA512C16, SHA512C17, + SHA512C18, SHA512C19, SHA512C1a, SHA512C1b, + SHA512C1c, SHA512C1d, SHA512C1e, SHA512C1f, + SHA512C20, SHA512C21, SHA512C22, SHA512C23, + SHA512C24, SHA512C25, SHA512C26, SHA512C27, + SHA512C28, SHA512C29, SHA512C2a, SHA512C2b, + SHA512C2c, SHA512C2d, SHA512C2e, SHA512C2f, + SHA512C30, SHA512C31, SHA512C32, SHA512C33, + SHA512C34, SHA512C35, SHA512C36, SHA512C37, + SHA512C38, SHA512C39, SHA512C3a, SHA512C3b, + SHA512C3c, SHA512C3d, SHA512C3e, SHA512C3f, + SHA512C40, SHA512C41, SHA512C42, SHA512C43, + SHA512C44, SHA512C45, SHA512C46, SHA512C47, + SHA512C48, SHA512C49, SHA512C4a, SHA512C4b, + SHA512C4c, SHA512C4d, SHA512C4e, SHA512C4f, +}; + +__device__ static void sha512_transform (const u32x w0[4], const u32x w1[4], const u32x w2[4], const u32x w3[4], u64x digest[8]) +{ + u64x w0_t = hl32_to_64 (w0[0], w0[1]); + u64x w1_t = hl32_to_64 (w0[2], w0[3]); + u64x w2_t = hl32_to_64 (w1[0], w1[1]); + u64x w3_t = hl32_to_64 (w1[2], w1[3]); + u64x w4_t = hl32_to_64 (w2[0], w2[1]); + u64x w5_t = hl32_to_64 (w2[2], w2[3]); + u64x w6_t = hl32_to_64 (w3[0], w3[1]); + u64x w7_t = 0; + u64x w8_t = 0; + u64x w9_t = 0; + u64x wa_t = 0; + u64x wb_t = 0; + u64x wc_t = 0; + u64x wd_t = 0; + u64x we_t = 0; + u64x wf_t = hl32_to_64 (w3[2], w3[3]); + + u64x a = digest[0]; + u64x b = digest[1]; + u64x c = digest[2]; + u64x d = digest[3]; + u64x e = digest[4]; + u64x f = digest[5]; + u64x g = digest[6]; + u64x h = digest[7]; + + #define ROUND_EXPAND() \ + { \ + w0_t = SHA512_EXPAND (we_t, w9_t, w1_t, w0_t); \ + w1_t = SHA512_EXPAND (wf_t, wa_t, w2_t, w1_t); \ + w2_t = SHA512_EXPAND (w0_t, wb_t, w3_t, w2_t); \ + w3_t = SHA512_EXPAND (w1_t, wc_t, w4_t, w3_t); \ + w4_t = SHA512_EXPAND (w2_t, wd_t, w5_t, w4_t); \ + w5_t = SHA512_EXPAND (w3_t, we_t, w6_t, w5_t); \ + w6_t = SHA512_EXPAND (w4_t, wf_t, w7_t, w6_t); \ + w7_t = SHA512_EXPAND (w5_t, w0_t, w8_t, w7_t); \ + w8_t = SHA512_EXPAND (w6_t, w1_t, w9_t, w8_t); \ + w9_t = SHA512_EXPAND (w7_t, w2_t, wa_t, w9_t); \ + wa_t = SHA512_EXPAND (w8_t, w3_t, wb_t, wa_t); \ + wb_t = SHA512_EXPAND (w9_t, w4_t, wc_t, wb_t); \ + wc_t = SHA512_EXPAND (wa_t, w5_t, wd_t, wc_t); \ + wd_t = SHA512_EXPAND (wb_t, w6_t, we_t, wd_t); \ + we_t = SHA512_EXPAND (wc_t, w7_t, wf_t, we_t); \ + wf_t = SHA512_EXPAND (wd_t, w8_t, w0_t, wf_t); \ + } + + #define ROUND_STEP(i) \ + { \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, a, b, c, d, e, f, g, h, w0_t, k_sha512[i + 0]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, h, a, b, c, d, e, f, g, w1_t, k_sha512[i + 1]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, g, h, a, b, c, d, e, f, w2_t, k_sha512[i + 2]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, f, g, h, a, b, c, d, e, w3_t, k_sha512[i + 3]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, e, f, g, h, a, b, c, d, w4_t, k_sha512[i + 4]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, d, e, f, g, h, a, b, c, w5_t, k_sha512[i + 5]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, c, d, e, f, g, h, a, b, w6_t, k_sha512[i + 6]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, b, c, d, e, f, g, h, a, w7_t, k_sha512[i + 7]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, a, b, c, d, e, f, g, h, w8_t, k_sha512[i + 8]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, h, a, b, c, d, e, f, g, w9_t, k_sha512[i + 9]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, g, h, a, b, c, d, e, f, wa_t, k_sha512[i + 10]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, f, g, h, a, b, c, d, e, wb_t, k_sha512[i + 11]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, e, f, g, h, a, b, c, d, wc_t, k_sha512[i + 12]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, d, e, f, g, h, a, b, c, wd_t, k_sha512[i + 13]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, c, d, e, f, g, h, a, b, we_t, k_sha512[i + 14]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, b, c, d, e, f, g, h, a, wf_t, k_sha512[i + 15]); \ + } + + ROUND_STEP (0); + + for (int i = 16; i < 80; i += 16) + { + ROUND_EXPAND (); ROUND_STEP (i); + } + + /* rev + digest[0] += a; + digest[1] += b; + digest[2] += c; + digest[3] += d; + digest[4] += e; + digest[5] += f; + digest[6] += g; + digest[7] += h; + */ + + digest[0] = a; + digest[1] = b; + digest[2] = c; + digest[3] = d; + digest[4] = e; + digest[5] = f; + digest[6] = g; + digest[7] = h; +} + +__device__ static void m01720m (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], const u32 pw_len, const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset) +{ + /** + * modifier + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + const u32 lid = threadIdx.x; + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[ 1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[ 2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[ 3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[ 4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[ 5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[ 6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[ 7]; + + u32 salt_buf2[4]; + + salt_buf2[0] = 0; + salt_buf2[1] = 0; + salt_buf2[2] = 0; + salt_buf2[3] = 0; + + u32 salt_buf3[4]; + + salt_buf3[0] = 0; + salt_buf3[1] = 0; + salt_buf3[2] = 0; + salt_buf3[3] = 0; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + const u32 pw_salt_len = pw_len + salt_len; + + /** + * loop + */ + + u32x w0l = w0[0]; + + for (u32 il_pos = 0; il_pos < bfs_cnt; il_pos++) + { + const u32 w0r = c_bfs[il_pos].i; + + w0[0] = w0l | w0r; + + /** + * prepend salt + */ + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + w0_t[0] = swap_workaround (w0[0]); + w0_t[1] = swap_workaround (w0[1]); + w0_t[2] = swap_workaround (w0[2]); + w0_t[3] = swap_workaround (w0[3]); + w1_t[0] = swap_workaround (w1[0]); + w1_t[1] = swap_workaround (w1[1]); + w1_t[2] = swap_workaround (w1[2]); + w1_t[3] = swap_workaround (w1[3]); + w2_t[0] = swap_workaround (w2[0]); + w2_t[1] = swap_workaround (w2[1]); + w2_t[2] = swap_workaround (w2[2]); + w2_t[3] = swap_workaround (w2[3]); + w3_t[0] = swap_workaround (w3[0]); + w3_t[1] = swap_workaround (w3[1]); + w3_t[2] = swap_workaround (w3[2]); + w3_t[3] = swap_workaround (w3[3]); + + switch_buffer_by_offset (w0_t, w1_t, w2_t, w3_t, salt_len); + + w0_t[0] |= salt_buf0[0]; + w0_t[1] |= salt_buf0[1]; + w0_t[2] |= salt_buf0[2]; + w0_t[3] |= salt_buf0[3]; + w1_t[0] |= salt_buf1[0]; + w1_t[1] |= salt_buf1[1]; + w1_t[2] |= salt_buf1[2]; + w1_t[3] |= salt_buf1[3]; + w2_t[0] |= salt_buf2[0]; + w2_t[1] |= salt_buf2[1]; + w2_t[2] |= salt_buf2[2]; + w2_t[3] |= salt_buf2[3]; + w3_t[0] |= salt_buf3[0]; + w3_t[1] |= salt_buf3[1]; + w3_t[2] = 0; + w3_t[3] = pw_salt_len * 8; + + /** + * sha512 + */ + + w0_t[0] = swap_workaround (w0_t[0]); + w0_t[1] = swap_workaround (w0_t[1]); + w0_t[2] = swap_workaround (w0_t[2]); + w0_t[3] = swap_workaround (w0_t[3]); + w1_t[0] = swap_workaround (w1_t[0]); + w1_t[1] = swap_workaround (w1_t[1]); + w1_t[2] = swap_workaround (w1_t[2]); + w1_t[3] = swap_workaround (w1_t[3]); + w2_t[0] = swap_workaround (w2_t[0]); + w2_t[1] = swap_workaround (w2_t[1]); + w2_t[2] = swap_workaround (w2_t[2]); + w2_t[3] = swap_workaround (w2_t[3]); + w3_t[0] = swap_workaround (w3_t[0]); + w3_t[1] = swap_workaround (w3_t[1]); + //w3_t[2] = swap_workaround (w3_t[2]); + //w3_t[3] = swap_workaround (w3_t[3]); + + u64x digest[8]; + + digest[0] = SHA512M_A; + digest[1] = SHA512M_B; + digest[2] = SHA512M_C; + digest[3] = SHA512M_D; + digest[4] = SHA512M_E; + digest[5] = SHA512M_F; + digest[6] = SHA512M_G; + digest[7] = SHA512M_H; + + sha512_transform (w0_t, w1_t, w2_t, w3_t, digest); + + + const u32x r0 = l32_from_64 (digest[7]); + const u32x r1 = h32_from_64 (digest[7]); + const u32x r2 = l32_from_64 (digest[3]); + const u32x r3 = h32_from_64 (digest[3]); + + #include VECT_COMPARE_M + } +} + +__device__ static void m01720s (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], const u32 pw_len, const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset) +{ + /** + * modifier + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + const u32 lid = threadIdx.x; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[ 1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[ 2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[ 3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[ 4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[ 5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[ 6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[ 7]; + + u32 salt_buf2[4]; + + salt_buf2[0] = 0; + salt_buf2[1] = 0; + salt_buf2[2] = 0; + salt_buf2[3] = 0; + + u32 salt_buf3[4]; + + salt_buf3[0] = 0; + salt_buf3[1] = 0; + salt_buf3[2] = 0; + salt_buf3[3] = 0; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + const u32 pw_salt_len = pw_len + salt_len; + + /** + * loop + */ + + u32x w0l = w0[0]; + + for (u32 il_pos = 0; il_pos < bfs_cnt; il_pos++) + { + const u32 w0r = c_bfs[il_pos].i; + + w0[0] = w0l | w0r; + + /** + * prepend salt + */ + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + w0_t[0] = swap_workaround (w0[0]); + w0_t[1] = swap_workaround (w0[1]); + w0_t[2] = swap_workaround (w0[2]); + w0_t[3] = swap_workaround (w0[3]); + w1_t[0] = swap_workaround (w1[0]); + w1_t[1] = swap_workaround (w1[1]); + w1_t[2] = swap_workaround (w1[2]); + w1_t[3] = swap_workaround (w1[3]); + w2_t[0] = swap_workaround (w2[0]); + w2_t[1] = swap_workaround (w2[1]); + w2_t[2] = swap_workaround (w2[2]); + w2_t[3] = swap_workaround (w2[3]); + w3_t[0] = swap_workaround (w3[0]); + w3_t[1] = swap_workaround (w3[1]); + w3_t[2] = swap_workaround (w3[2]); + w3_t[3] = swap_workaround (w3[3]); + + switch_buffer_by_offset (w0_t, w1_t, w2_t, w3_t, salt_len); + + w0_t[0] |= salt_buf0[0]; + w0_t[1] |= salt_buf0[1]; + w0_t[2] |= salt_buf0[2]; + w0_t[3] |= salt_buf0[3]; + w1_t[0] |= salt_buf1[0]; + w1_t[1] |= salt_buf1[1]; + w1_t[2] |= salt_buf1[2]; + w1_t[3] |= salt_buf1[3]; + w2_t[0] |= salt_buf2[0]; + w2_t[1] |= salt_buf2[1]; + w2_t[2] |= salt_buf2[2]; + w2_t[3] |= salt_buf2[3]; + w3_t[0] |= salt_buf3[0]; + w3_t[1] |= salt_buf3[1]; + w3_t[2] = 0; + w3_t[3] = pw_salt_len * 8; + + /** + * sha512 + */ + + w0_t[0] = swap_workaround (w0_t[0]); + w0_t[1] = swap_workaround (w0_t[1]); + w0_t[2] = swap_workaround (w0_t[2]); + w0_t[3] = swap_workaround (w0_t[3]); + w1_t[0] = swap_workaround (w1_t[0]); + w1_t[1] = swap_workaround (w1_t[1]); + w1_t[2] = swap_workaround (w1_t[2]); + w1_t[3] = swap_workaround (w1_t[3]); + w2_t[0] = swap_workaround (w2_t[0]); + w2_t[1] = swap_workaround (w2_t[1]); + w2_t[2] = swap_workaround (w2_t[2]); + w2_t[3] = swap_workaround (w2_t[3]); + w3_t[0] = swap_workaround (w3_t[0]); + w3_t[1] = swap_workaround (w3_t[1]); + //w3_t[2] = swap_workaround (w3_t[2]); + //w3_t[3] = swap_workaround (w3_t[3]); + + u64x digest[8]; + + digest[0] = SHA512M_A; + digest[1] = SHA512M_B; + digest[2] = SHA512M_C; + digest[3] = SHA512M_D; + digest[4] = SHA512M_E; + digest[5] = SHA512M_F; + digest[6] = SHA512M_G; + digest[7] = SHA512M_H; + + sha512_transform (w0_t, w1_t, w2_t, w3_t, digest); + + + const u32x r0 = l32_from_64 (digest[7]); + const u32x r1 = h32_from_64 (digest[7]); + const u32x r2 = l32_from_64 (digest[3]); + const u32x r3 = h32_from_64 (digest[3]); + + #include VECT_COMPARE_S + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m01720_m04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m01720m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m01720_m08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m01720m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m01720_m16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = pws[gid].i[ 8]; + w2[1] = pws[gid].i[ 9]; + w2[2] = pws[gid].i[10]; + w2[3] = pws[gid].i[11]; + + u32x w3[4]; + + w3[0] = pws[gid].i[12]; + w3[1] = pws[gid].i[13]; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m01720m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m01720_s04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m01720s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m01720_s08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m01720s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m01720_s16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = pws[gid].i[ 8]; + w2[1] = pws[gid].i[ 9]; + w2[2] = pws[gid].i[10]; + w2[3] = pws[gid].i[11]; + + u32x w3[4]; + + w3[0] = pws[gid].i[12]; + w3[1] = pws[gid].i[13]; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m01720s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} diff --git a/nv/m01730_a0.cu b/nv/m01730_a0.cu new file mode 100644 index 0000000000..3f7b9a9d1f --- /dev/null +++ b/nv/m01730_a0.cu @@ -0,0 +1,583 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _SHA512_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW2 +#define VECT_SIZE1 +#endif + +#define DGST_R0 14 +#define DGST_R1 15 +#define DGST_R2 6 +#define DGST_R3 7 + +#include "include/kernel_functions.c" +#include "types_nv.c" +#include "common_nv.c" +#include "include/rp_gpu.h" +#include "rp_nv.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +__device__ __constant__ gpu_rule_t c_rules[1024]; + +__device__ __constant__ u64 k_sha512[80] = +{ + SHA512C00, SHA512C01, SHA512C02, SHA512C03, + SHA512C04, SHA512C05, SHA512C06, SHA512C07, + SHA512C08, SHA512C09, SHA512C0a, SHA512C0b, + SHA512C0c, SHA512C0d, SHA512C0e, SHA512C0f, + SHA512C10, SHA512C11, SHA512C12, SHA512C13, + SHA512C14, SHA512C15, SHA512C16, SHA512C17, + SHA512C18, SHA512C19, SHA512C1a, SHA512C1b, + SHA512C1c, SHA512C1d, SHA512C1e, SHA512C1f, + SHA512C20, SHA512C21, SHA512C22, SHA512C23, + SHA512C24, SHA512C25, SHA512C26, SHA512C27, + SHA512C28, SHA512C29, SHA512C2a, SHA512C2b, + SHA512C2c, SHA512C2d, SHA512C2e, SHA512C2f, + SHA512C30, SHA512C31, SHA512C32, SHA512C33, + SHA512C34, SHA512C35, SHA512C36, SHA512C37, + SHA512C38, SHA512C39, SHA512C3a, SHA512C3b, + SHA512C3c, SHA512C3d, SHA512C3e, SHA512C3f, + SHA512C40, SHA512C41, SHA512C42, SHA512C43, + SHA512C44, SHA512C45, SHA512C46, SHA512C47, + SHA512C48, SHA512C49, SHA512C4a, SHA512C4b, + SHA512C4c, SHA512C4d, SHA512C4e, SHA512C4f, +}; + +__device__ static void sha512_transform (const u32x w0[4], const u32x w1[4], const u32x w2[4], const u32x w3[4], u64x digest[8]) +{ + u64x w0_t = hl32_to_64 (w0[0], w0[1]); + u64x w1_t = hl32_to_64 (w0[2], w0[3]); + u64x w2_t = hl32_to_64 (w1[0], w1[1]); + u64x w3_t = hl32_to_64 (w1[2], w1[3]); + u64x w4_t = hl32_to_64 (w2[0], w2[1]); + u64x w5_t = hl32_to_64 (w2[2], w2[3]); + u64x w6_t = hl32_to_64 (w3[0], w3[1]); + u64x w7_t = 0; + u64x w8_t = 0; + u64x w9_t = 0; + u64x wa_t = 0; + u64x wb_t = 0; + u64x wc_t = 0; + u64x wd_t = 0; + u64x we_t = 0; + u64x wf_t = hl32_to_64 (w3[2], w3[3]); + + u64x a = digest[0]; + u64x b = digest[1]; + u64x c = digest[2]; + u64x d = digest[3]; + u64x e = digest[4]; + u64x f = digest[5]; + u64x g = digest[6]; + u64x h = digest[7]; + + #define ROUND_EXPAND() \ + { \ + w0_t = SHA512_EXPAND (we_t, w9_t, w1_t, w0_t); \ + w1_t = SHA512_EXPAND (wf_t, wa_t, w2_t, w1_t); \ + w2_t = SHA512_EXPAND (w0_t, wb_t, w3_t, w2_t); \ + w3_t = SHA512_EXPAND (w1_t, wc_t, w4_t, w3_t); \ + w4_t = SHA512_EXPAND (w2_t, wd_t, w5_t, w4_t); \ + w5_t = SHA512_EXPAND (w3_t, we_t, w6_t, w5_t); \ + w6_t = SHA512_EXPAND (w4_t, wf_t, w7_t, w6_t); \ + w7_t = SHA512_EXPAND (w5_t, w0_t, w8_t, w7_t); \ + w8_t = SHA512_EXPAND (w6_t, w1_t, w9_t, w8_t); \ + w9_t = SHA512_EXPAND (w7_t, w2_t, wa_t, w9_t); \ + wa_t = SHA512_EXPAND (w8_t, w3_t, wb_t, wa_t); \ + wb_t = SHA512_EXPAND (w9_t, w4_t, wc_t, wb_t); \ + wc_t = SHA512_EXPAND (wa_t, w5_t, wd_t, wc_t); \ + wd_t = SHA512_EXPAND (wb_t, w6_t, we_t, wd_t); \ + we_t = SHA512_EXPAND (wc_t, w7_t, wf_t, we_t); \ + wf_t = SHA512_EXPAND (wd_t, w8_t, w0_t, wf_t); \ + } + + #define ROUND_STEP(i) \ + { \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, a, b, c, d, e, f, g, h, w0_t, k_sha512[i + 0]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, h, a, b, c, d, e, f, g, w1_t, k_sha512[i + 1]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, g, h, a, b, c, d, e, f, w2_t, k_sha512[i + 2]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, f, g, h, a, b, c, d, e, w3_t, k_sha512[i + 3]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, e, f, g, h, a, b, c, d, w4_t, k_sha512[i + 4]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, d, e, f, g, h, a, b, c, w5_t, k_sha512[i + 5]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, c, d, e, f, g, h, a, b, w6_t, k_sha512[i + 6]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, b, c, d, e, f, g, h, a, w7_t, k_sha512[i + 7]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, a, b, c, d, e, f, g, h, w8_t, k_sha512[i + 8]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, h, a, b, c, d, e, f, g, w9_t, k_sha512[i + 9]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, g, h, a, b, c, d, e, f, wa_t, k_sha512[i + 10]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, f, g, h, a, b, c, d, e, wb_t, k_sha512[i + 11]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, e, f, g, h, a, b, c, d, wc_t, k_sha512[i + 12]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, d, e, f, g, h, a, b, c, wd_t, k_sha512[i + 13]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, c, d, e, f, g, h, a, b, we_t, k_sha512[i + 14]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, b, c, d, e, f, g, h, a, wf_t, k_sha512[i + 15]); \ + } + + ROUND_STEP (0); + + for (int i = 16; i < 80; i += 16) + { + ROUND_EXPAND (); ROUND_STEP (i); + } + + /* rev + digest[0] += a; + digest[1] += b; + digest[2] += c; + digest[3] += d; + digest[4] += e; + digest[5] += f; + digest[6] += g; + digest[7] += h; + */ + + digest[0] = a; + digest[1] = b; + digest[2] = c; + digest[3] = d; + digest[4] = e; + digest[5] = f; + digest[6] = g; + digest[7] = h; +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m01730_m04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + u32x pw_buf1[4]; + + pw_buf1[0] = pws[gid].i[ 4]; + pw_buf1[1] = pws[gid].i[ 5]; + pw_buf1[2] = pws[gid].i[ 6]; + pw_buf1[3] = pws[gid].i[ 7]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[7]; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + + w0[0] = pw_buf0[0]; + w0[1] = pw_buf0[1]; + w0[2] = pw_buf0[2]; + w0[3] = pw_buf0[3]; + + u32x w1[4]; + + w1[0] = pw_buf1[0]; + w1[1] = pw_buf1[1]; + w1[2] = pw_buf1[2]; + w1[3] = pw_buf1[3]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 out_len = apply_rules (c_rules[il_pos].cmds, w0, w1, pw_len); + + /** + * append salt + */ + + u32 s0[4]; + + s0[0] = salt_buf0[0]; + s0[1] = salt_buf0[1]; + s0[2] = salt_buf0[2]; + s0[3] = salt_buf0[3]; + + u32 s1[4]; + + s1[0] = salt_buf1[0]; + s1[1] = salt_buf1[1]; + s1[2] = salt_buf1[2]; + s1[3] = salt_buf1[3]; + + u32 s2[4]; + + s2[0] = 0; + s2[1] = 0; + s2[2] = 0; + s2[3] = 0; + + u32 s3[4]; + + s3[0] = 0; + s3[1] = 0; + s3[2] = 0; + s3[3] = 0; + + switch_buffer_by_offset (s0, s1, s2, s3, (out_len * 2)); + + const u32 out_salt_len = (out_len * 2) + salt_len; + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + make_unicode (w0, w0_t, w1_t); + make_unicode (w1, w2_t, w3_t); + + w0_t[0] |= s0[0]; + w0_t[1] |= s0[1]; + w0_t[2] |= s0[2]; + w0_t[3] |= s0[3]; + w1_t[0] |= s1[0]; + w1_t[1] |= s1[1]; + w1_t[2] |= s1[2]; + w1_t[3] |= s1[3]; + w2_t[0] |= s2[0]; + w2_t[1] |= s2[1]; + w2_t[2] |= s2[2]; + w2_t[3] |= s2[3]; + w3_t[0] |= s3[0]; + w3_t[1] |= s3[1]; + w3_t[2] |= s3[2]; + w3_t[3] |= s3[3]; + + append_0x80_4 (w0_t, w1_t, w2_t, w3_t, out_salt_len); + + /** + * sha512 + */ + + w0_t[0] = swap_workaround (w0_t[0]); + w0_t[1] = swap_workaround (w0_t[1]); + w0_t[2] = swap_workaround (w0_t[2]); + w0_t[3] = swap_workaround (w0_t[3]); + w1_t[0] = swap_workaround (w1_t[0]); + w1_t[1] = swap_workaround (w1_t[1]); + w1_t[2] = swap_workaround (w1_t[2]); + w1_t[3] = swap_workaround (w1_t[3]); + w2_t[0] = swap_workaround (w2_t[0]); + w2_t[1] = swap_workaround (w2_t[1]); + w2_t[2] = swap_workaround (w2_t[2]); + w2_t[3] = swap_workaround (w2_t[3]); + w3_t[0] = swap_workaround (w3_t[0]); + w3_t[1] = swap_workaround (w3_t[1]); + w3_t[2] = 0; + w3_t[3] = out_salt_len * 8; + + u64x digest[8]; + + digest[0] = SHA512M_A; + digest[1] = SHA512M_B; + digest[2] = SHA512M_C; + digest[3] = SHA512M_D; + digest[4] = SHA512M_E; + digest[5] = SHA512M_F; + digest[6] = SHA512M_G; + digest[7] = SHA512M_H; + + sha512_transform (w0_t, w1_t, w2_t, w3_t, digest); + + + const u32x r0 = l32_from_64 (digest[7]); + const u32x r1 = h32_from_64 (digest[7]); + const u32x r2 = l32_from_64 (digest[3]); + const u32x r3 = h32_from_64 (digest[3]); + + #include VECT_COMPARE_M + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m01730_m08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m01730_m16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m01730_s04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + u32x pw_buf1[4]; + + pw_buf1[0] = pws[gid].i[ 4]; + pw_buf1[1] = pws[gid].i[ 5]; + pw_buf1[2] = pws[gid].i[ 6]; + pw_buf1[3] = pws[gid].i[ 7]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[7]; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + + w0[0] = pw_buf0[0]; + w0[1] = pw_buf0[1]; + w0[2] = pw_buf0[2]; + w0[3] = pw_buf0[3]; + + u32x w1[4]; + + w1[0] = pw_buf1[0]; + w1[1] = pw_buf1[1]; + w1[2] = pw_buf1[2]; + w1[3] = pw_buf1[3]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 out_len = apply_rules (c_rules[il_pos].cmds, w0, w1, pw_len); + + /** + * append salt + */ + + u32 s0[4]; + + s0[0] = salt_buf0[0]; + s0[1] = salt_buf0[1]; + s0[2] = salt_buf0[2]; + s0[3] = salt_buf0[3]; + + u32 s1[4]; + + s1[0] = salt_buf1[0]; + s1[1] = salt_buf1[1]; + s1[2] = salt_buf1[2]; + s1[3] = salt_buf1[3]; + + u32 s2[4]; + + s2[0] = 0; + s2[1] = 0; + s2[2] = 0; + s2[3] = 0; + + u32 s3[4]; + + s3[0] = 0; + s3[1] = 0; + s3[2] = 0; + s3[3] = 0; + + switch_buffer_by_offset (s0, s1, s2, s3, (out_len * 2)); + + const u32 out_salt_len = (out_len * 2) + salt_len; + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + make_unicode (w0, w0_t, w1_t); + make_unicode (w1, w2_t, w3_t); + + w0_t[0] |= s0[0]; + w0_t[1] |= s0[1]; + w0_t[2] |= s0[2]; + w0_t[3] |= s0[3]; + w1_t[0] |= s1[0]; + w1_t[1] |= s1[1]; + w1_t[2] |= s1[2]; + w1_t[3] |= s1[3]; + w2_t[0] |= s2[0]; + w2_t[1] |= s2[1]; + w2_t[2] |= s2[2]; + w2_t[3] |= s2[3]; + w3_t[0] |= s3[0]; + w3_t[1] |= s3[1]; + w3_t[2] |= s3[2]; + w3_t[3] |= s3[3]; + + append_0x80_4 (w0_t, w1_t, w2_t, w3_t, out_salt_len); + + /** + * sha512 + */ + + w0_t[0] = swap_workaround (w0_t[0]); + w0_t[1] = swap_workaround (w0_t[1]); + w0_t[2] = swap_workaround (w0_t[2]); + w0_t[3] = swap_workaround (w0_t[3]); + w1_t[0] = swap_workaround (w1_t[0]); + w1_t[1] = swap_workaround (w1_t[1]); + w1_t[2] = swap_workaround (w1_t[2]); + w1_t[3] = swap_workaround (w1_t[3]); + w2_t[0] = swap_workaround (w2_t[0]); + w2_t[1] = swap_workaround (w2_t[1]); + w2_t[2] = swap_workaround (w2_t[2]); + w2_t[3] = swap_workaround (w2_t[3]); + w3_t[0] = swap_workaround (w3_t[0]); + w3_t[1] = swap_workaround (w3_t[1]); + w3_t[2] = 0; + w3_t[3] = out_salt_len * 8; + + u64x digest[8]; + + digest[0] = SHA512M_A; + digest[1] = SHA512M_B; + digest[2] = SHA512M_C; + digest[3] = SHA512M_D; + digest[4] = SHA512M_E; + digest[5] = SHA512M_F; + digest[6] = SHA512M_G; + digest[7] = SHA512M_H; + + sha512_transform (w0_t, w1_t, w2_t, w3_t, digest); + + + const u32x r0 = l32_from_64 (digest[7]); + const u32x r1 = h32_from_64 (digest[7]); + const u32x r2 = l32_from_64 (digest[3]); + const u32x r3 = h32_from_64 (digest[3]); + + #include VECT_COMPARE_S + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m01730_s08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m01730_s16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/nv/m01730_a1.cu b/nv/m01730_a1.cu new file mode 100644 index 0000000000..4c3e3003c2 --- /dev/null +++ b/nv/m01730_a1.cu @@ -0,0 +1,665 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _SHA512_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW2 +#define VECT_SIZE1 +#endif + +#define DGST_R0 14 +#define DGST_R1 15 +#define DGST_R2 6 +#define DGST_R3 7 + +#include "include/kernel_functions.c" +#include "types_nv.c" +#include "common_nv.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +__device__ __constant__ comb_t c_combs[1024]; + +__device__ __constant__ u64 k_sha512[80] = +{ + SHA512C00, SHA512C01, SHA512C02, SHA512C03, + SHA512C04, SHA512C05, SHA512C06, SHA512C07, + SHA512C08, SHA512C09, SHA512C0a, SHA512C0b, + SHA512C0c, SHA512C0d, SHA512C0e, SHA512C0f, + SHA512C10, SHA512C11, SHA512C12, SHA512C13, + SHA512C14, SHA512C15, SHA512C16, SHA512C17, + SHA512C18, SHA512C19, SHA512C1a, SHA512C1b, + SHA512C1c, SHA512C1d, SHA512C1e, SHA512C1f, + SHA512C20, SHA512C21, SHA512C22, SHA512C23, + SHA512C24, SHA512C25, SHA512C26, SHA512C27, + SHA512C28, SHA512C29, SHA512C2a, SHA512C2b, + SHA512C2c, SHA512C2d, SHA512C2e, SHA512C2f, + SHA512C30, SHA512C31, SHA512C32, SHA512C33, + SHA512C34, SHA512C35, SHA512C36, SHA512C37, + SHA512C38, SHA512C39, SHA512C3a, SHA512C3b, + SHA512C3c, SHA512C3d, SHA512C3e, SHA512C3f, + SHA512C40, SHA512C41, SHA512C42, SHA512C43, + SHA512C44, SHA512C45, SHA512C46, SHA512C47, + SHA512C48, SHA512C49, SHA512C4a, SHA512C4b, + SHA512C4c, SHA512C4d, SHA512C4e, SHA512C4f, +}; + +__device__ static void sha512_transform (const u32x w0[4], const u32x w1[4], const u32x w2[4], const u32x w3[4], u64x digest[8]) +{ + u64x w0_t = hl32_to_64 (w0[0], w0[1]); + u64x w1_t = hl32_to_64 (w0[2], w0[3]); + u64x w2_t = hl32_to_64 (w1[0], w1[1]); + u64x w3_t = hl32_to_64 (w1[2], w1[3]); + u64x w4_t = hl32_to_64 (w2[0], w2[1]); + u64x w5_t = hl32_to_64 (w2[2], w2[3]); + u64x w6_t = hl32_to_64 (w3[0], w3[1]); + u64x w7_t = 0; + u64x w8_t = 0; + u64x w9_t = 0; + u64x wa_t = 0; + u64x wb_t = 0; + u64x wc_t = 0; + u64x wd_t = 0; + u64x we_t = 0; + u64x wf_t = hl32_to_64 (w3[2], w3[3]); + + u64x a = digest[0]; + u64x b = digest[1]; + u64x c = digest[2]; + u64x d = digest[3]; + u64x e = digest[4]; + u64x f = digest[5]; + u64x g = digest[6]; + u64x h = digest[7]; + + #define ROUND_EXPAND() \ + { \ + w0_t = SHA512_EXPAND (we_t, w9_t, w1_t, w0_t); \ + w1_t = SHA512_EXPAND (wf_t, wa_t, w2_t, w1_t); \ + w2_t = SHA512_EXPAND (w0_t, wb_t, w3_t, w2_t); \ + w3_t = SHA512_EXPAND (w1_t, wc_t, w4_t, w3_t); \ + w4_t = SHA512_EXPAND (w2_t, wd_t, w5_t, w4_t); \ + w5_t = SHA512_EXPAND (w3_t, we_t, w6_t, w5_t); \ + w6_t = SHA512_EXPAND (w4_t, wf_t, w7_t, w6_t); \ + w7_t = SHA512_EXPAND (w5_t, w0_t, w8_t, w7_t); \ + w8_t = SHA512_EXPAND (w6_t, w1_t, w9_t, w8_t); \ + w9_t = SHA512_EXPAND (w7_t, w2_t, wa_t, w9_t); \ + wa_t = SHA512_EXPAND (w8_t, w3_t, wb_t, wa_t); \ + wb_t = SHA512_EXPAND (w9_t, w4_t, wc_t, wb_t); \ + wc_t = SHA512_EXPAND (wa_t, w5_t, wd_t, wc_t); \ + wd_t = SHA512_EXPAND (wb_t, w6_t, we_t, wd_t); \ + we_t = SHA512_EXPAND (wc_t, w7_t, wf_t, we_t); \ + wf_t = SHA512_EXPAND (wd_t, w8_t, w0_t, wf_t); \ + } + + #define ROUND_STEP(i) \ + { \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, a, b, c, d, e, f, g, h, w0_t, k_sha512[i + 0]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, h, a, b, c, d, e, f, g, w1_t, k_sha512[i + 1]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, g, h, a, b, c, d, e, f, w2_t, k_sha512[i + 2]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, f, g, h, a, b, c, d, e, w3_t, k_sha512[i + 3]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, e, f, g, h, a, b, c, d, w4_t, k_sha512[i + 4]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, d, e, f, g, h, a, b, c, w5_t, k_sha512[i + 5]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, c, d, e, f, g, h, a, b, w6_t, k_sha512[i + 6]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, b, c, d, e, f, g, h, a, w7_t, k_sha512[i + 7]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, a, b, c, d, e, f, g, h, w8_t, k_sha512[i + 8]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, h, a, b, c, d, e, f, g, w9_t, k_sha512[i + 9]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, g, h, a, b, c, d, e, f, wa_t, k_sha512[i + 10]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, f, g, h, a, b, c, d, e, wb_t, k_sha512[i + 11]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, e, f, g, h, a, b, c, d, wc_t, k_sha512[i + 12]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, d, e, f, g, h, a, b, c, wd_t, k_sha512[i + 13]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, c, d, e, f, g, h, a, b, we_t, k_sha512[i + 14]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, b, c, d, e, f, g, h, a, wf_t, k_sha512[i + 15]); \ + } + + ROUND_STEP (0); + + for (int i = 16; i < 80; i += 16) + { + ROUND_EXPAND (); ROUND_STEP (i); + } + + /* rev + digest[0] += a; + digest[1] += b; + digest[2] += c; + digest[3] += d; + digest[4] += e; + digest[5] += f; + digest[6] += g; + digest[7] += h; + */ + + digest[0] = a; + digest[1] = b; + digest[2] = c; + digest[3] = d; + digest[4] = e; + digest[5] = f; + digest[6] = g; + digest[7] = h; +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m01730_m04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, c_combs[0].pw_len); + } + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[7]; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = c_combs[il_pos].pw_len; + + const u32 pw_len = pw_l_len + pw_r_len; + + u32 wordr0[4]; + u32 wordr1[4]; + u32 wordr2[4]; + u32 wordr3[4]; + + wordr0[0] = c_combs[il_pos].i[0]; + wordr0[1] = c_combs[il_pos].i[1]; + wordr0[2] = c_combs[il_pos].i[2]; + wordr0[3] = c_combs[il_pos].i[3]; + wordr1[0] = c_combs[il_pos].i[4]; + wordr1[1] = c_combs[il_pos].i[5]; + wordr1[2] = c_combs[il_pos].i[6]; + wordr1[3] = c_combs[il_pos].i[7]; + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + u32x w0[4]; + u32x w1[4]; + u32x w2[4]; + u32x w3[4]; + + w0[0] = wordl0[0] | wordr0[0]; + w0[1] = wordl0[1] | wordr0[1]; + w0[2] = wordl0[2] | wordr0[2]; + w0[3] = wordl0[3] | wordr0[3]; + w1[0] = wordl1[0] | wordr1[0]; + w1[1] = wordl1[1] | wordr1[1]; + w1[2] = wordl1[2] | wordr1[2]; + w1[3] = wordl1[3] | wordr1[3]; + w2[0] = wordl2[0] | wordr2[0]; + w2[1] = wordl2[1] | wordr2[1]; + w2[2] = wordl2[2] | wordr2[2]; + w2[3] = wordl2[3] | wordr2[3]; + w3[0] = wordl3[0] | wordr3[0]; + w3[1] = wordl3[1] | wordr3[1]; + w3[2] = wordl3[2] | wordr3[2]; + w3[3] = wordl3[3] | wordr3[3]; + + /** + * append salt + */ + + u32 s0[4]; + + s0[0] = salt_buf0[0]; + s0[1] = salt_buf0[1]; + s0[2] = salt_buf0[2]; + s0[3] = salt_buf0[3]; + + u32 s1[4]; + + s1[0] = salt_buf1[0]; + s1[1] = salt_buf1[1]; + s1[2] = salt_buf1[2]; + s1[3] = salt_buf1[3]; + + u32 s2[4]; + + s2[0] = 0; + s2[1] = 0; + s2[2] = 0; + s2[3] = 0; + + u32 s3[4]; + + s3[0] = 0; + s3[1] = 0; + s3[2] = 0; + s3[3] = 0; + + switch_buffer_by_offset (s0, s1, s2, s3, (pw_len * 2)); + + const u32 pw_salt_len = (pw_len * 2) + salt_len; + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + make_unicode (w0, w0_t, w1_t); + make_unicode (w1, w2_t, w3_t); + + w0_t[0] |= s0[0]; + w0_t[1] |= s0[1]; + w0_t[2] |= s0[2]; + w0_t[3] |= s0[3]; + w1_t[0] |= s1[0]; + w1_t[1] |= s1[1]; + w1_t[2] |= s1[2]; + w1_t[3] |= s1[3]; + w2_t[0] |= s2[0]; + w2_t[1] |= s2[1]; + w2_t[2] |= s2[2]; + w2_t[3] |= s2[3]; + w3_t[0] |= s3[0]; + w3_t[1] |= s3[1]; + w3_t[2] |= s3[2]; + w3_t[3] |= s3[3]; + + append_0x80_4 (w0_t, w1_t, w2_t, w3_t, pw_salt_len); + + /** + * sha512 + */ + + w0_t[0] = swap_workaround (w0_t[0]); + w0_t[1] = swap_workaround (w0_t[1]); + w0_t[2] = swap_workaround (w0_t[2]); + w0_t[3] = swap_workaround (w0_t[3]); + w1_t[0] = swap_workaround (w1_t[0]); + w1_t[1] = swap_workaround (w1_t[1]); + w1_t[2] = swap_workaround (w1_t[2]); + w1_t[3] = swap_workaround (w1_t[3]); + w2_t[0] = swap_workaround (w2_t[0]); + w2_t[1] = swap_workaround (w2_t[1]); + w2_t[2] = swap_workaround (w2_t[2]); + w2_t[3] = swap_workaround (w2_t[3]); + w3_t[0] = swap_workaround (w3_t[0]); + w3_t[1] = swap_workaround (w3_t[1]); + w3_t[2] = 0; + w3_t[3] = pw_salt_len * 8; + + u64x digest[8]; + + digest[0] = SHA512M_A; + digest[1] = SHA512M_B; + digest[2] = SHA512M_C; + digest[3] = SHA512M_D; + digest[4] = SHA512M_E; + digest[5] = SHA512M_F; + digest[6] = SHA512M_G; + digest[7] = SHA512M_H; + + sha512_transform (w0_t, w1_t, w2_t, w3_t, digest); + + + const u32x r0 = l32_from_64 (digest[7]); + const u32x r1 = h32_from_64 (digest[7]); + const u32x r2 = l32_from_64 (digest[3]); + const u32x r3 = h32_from_64 (digest[3]); + + #include VECT_COMPARE_M + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m01730_m08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m01730_m16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m01730_s04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, c_combs[0].pw_len); + } + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[7]; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = c_combs[il_pos].pw_len; + + const u32 pw_len = pw_l_len + pw_r_len; + + u32 wordr0[4]; + u32 wordr1[4]; + u32 wordr2[4]; + u32 wordr3[4]; + + wordr0[0] = c_combs[il_pos].i[0]; + wordr0[1] = c_combs[il_pos].i[1]; + wordr0[2] = c_combs[il_pos].i[2]; + wordr0[3] = c_combs[il_pos].i[3]; + wordr1[0] = c_combs[il_pos].i[4]; + wordr1[1] = c_combs[il_pos].i[5]; + wordr1[2] = c_combs[il_pos].i[6]; + wordr1[3] = c_combs[il_pos].i[7]; + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + u32x w0[4]; + u32x w1[4]; + u32x w2[4]; + u32x w3[4]; + + w0[0] = wordl0[0] | wordr0[0]; + w0[1] = wordl0[1] | wordr0[1]; + w0[2] = wordl0[2] | wordr0[2]; + w0[3] = wordl0[3] | wordr0[3]; + w1[0] = wordl1[0] | wordr1[0]; + w1[1] = wordl1[1] | wordr1[1]; + w1[2] = wordl1[2] | wordr1[2]; + w1[3] = wordl1[3] | wordr1[3]; + w2[0] = wordl2[0] | wordr2[0]; + w2[1] = wordl2[1] | wordr2[1]; + w2[2] = wordl2[2] | wordr2[2]; + w2[3] = wordl2[3] | wordr2[3]; + w3[0] = wordl3[0] | wordr3[0]; + w3[1] = wordl3[1] | wordr3[1]; + w3[2] = wordl3[2] | wordr3[2]; + w3[3] = wordl3[3] | wordr3[3]; + + /** + * append salt + */ + + u32 s0[4]; + + s0[0] = salt_buf0[0]; + s0[1] = salt_buf0[1]; + s0[2] = salt_buf0[2]; + s0[3] = salt_buf0[3]; + + u32 s1[4]; + + s1[0] = salt_buf1[0]; + s1[1] = salt_buf1[1]; + s1[2] = salt_buf1[2]; + s1[3] = salt_buf1[3]; + + u32 s2[4]; + + s2[0] = 0; + s2[1] = 0; + s2[2] = 0; + s2[3] = 0; + + u32 s3[4]; + + s3[0] = 0; + s3[1] = 0; + s3[2] = 0; + s3[3] = 0; + + switch_buffer_by_offset (s0, s1, s2, s3, (pw_len * 2)); + + const u32 pw_salt_len = (pw_len * 2) + salt_len; + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + make_unicode (w0, w0_t, w1_t); + make_unicode (w1, w2_t, w3_t); + + w0_t[0] |= s0[0]; + w0_t[1] |= s0[1]; + w0_t[2] |= s0[2]; + w0_t[3] |= s0[3]; + w1_t[0] |= s1[0]; + w1_t[1] |= s1[1]; + w1_t[2] |= s1[2]; + w1_t[3] |= s1[3]; + w2_t[0] |= s2[0]; + w2_t[1] |= s2[1]; + w2_t[2] |= s2[2]; + w2_t[3] |= s2[3]; + w3_t[0] |= s3[0]; + w3_t[1] |= s3[1]; + w3_t[2] |= s3[2]; + w3_t[3] |= s3[3]; + + append_0x80_4 (w0_t, w1_t, w2_t, w3_t, pw_salt_len); + + /** + * sha512 + */ + + w0_t[0] = swap_workaround (w0_t[0]); + w0_t[1] = swap_workaround (w0_t[1]); + w0_t[2] = swap_workaround (w0_t[2]); + w0_t[3] = swap_workaround (w0_t[3]); + w1_t[0] = swap_workaround (w1_t[0]); + w1_t[1] = swap_workaround (w1_t[1]); + w1_t[2] = swap_workaround (w1_t[2]); + w1_t[3] = swap_workaround (w1_t[3]); + w2_t[0] = swap_workaround (w2_t[0]); + w2_t[1] = swap_workaround (w2_t[1]); + w2_t[2] = swap_workaround (w2_t[2]); + w2_t[3] = swap_workaround (w2_t[3]); + w3_t[0] = swap_workaround (w3_t[0]); + w3_t[1] = swap_workaround (w3_t[1]); + w3_t[2] = 0; + w3_t[3] = pw_salt_len * 8; + + u64x digest[8]; + + digest[0] = SHA512M_A; + digest[1] = SHA512M_B; + digest[2] = SHA512M_C; + digest[3] = SHA512M_D; + digest[4] = SHA512M_E; + digest[5] = SHA512M_F; + digest[6] = SHA512M_G; + digest[7] = SHA512M_H; + + sha512_transform (w0_t, w1_t, w2_t, w3_t, digest); + + + const u32x r0 = l32_from_64 (digest[7]); + const u32x r1 = h32_from_64 (digest[7]); + const u32x r2 = l32_from_64 (digest[3]); + const u32x r3 = h32_from_64 (digest[3]); + + #include VECT_COMPARE_S + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m01730_s08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m01730_s16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/nv/m01730_a3.cu b/nv/m01730_a3.cu new file mode 100644 index 0000000000..9ee9b334a9 --- /dev/null +++ b/nv/m01730_a3.cu @@ -0,0 +1,598 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _SHA512_ +#define _SCALAR_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW2 +#define VECT_SIZE1 +#endif + +#define DGST_R0 14 +#define DGST_R1 15 +#define DGST_R2 6 +#define DGST_R3 7 + +#include "include/kernel_functions.c" +#include "types_nv.c" +#include "common_nv.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4_warp.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4_warp.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4_warp.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4_warp.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4_warp.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4_warp.c" +#endif + +__device__ __constant__ u32x c_bfs[1024]; + +__device__ __constant__ u64 k_sha512[80] = +{ + SHA512C00, SHA512C01, SHA512C02, SHA512C03, + SHA512C04, SHA512C05, SHA512C06, SHA512C07, + SHA512C08, SHA512C09, SHA512C0a, SHA512C0b, + SHA512C0c, SHA512C0d, SHA512C0e, SHA512C0f, + SHA512C10, SHA512C11, SHA512C12, SHA512C13, + SHA512C14, SHA512C15, SHA512C16, SHA512C17, + SHA512C18, SHA512C19, SHA512C1a, SHA512C1b, + SHA512C1c, SHA512C1d, SHA512C1e, SHA512C1f, + SHA512C20, SHA512C21, SHA512C22, SHA512C23, + SHA512C24, SHA512C25, SHA512C26, SHA512C27, + SHA512C28, SHA512C29, SHA512C2a, SHA512C2b, + SHA512C2c, SHA512C2d, SHA512C2e, SHA512C2f, + SHA512C30, SHA512C31, SHA512C32, SHA512C33, + SHA512C34, SHA512C35, SHA512C36, SHA512C37, + SHA512C38, SHA512C39, SHA512C3a, SHA512C3b, + SHA512C3c, SHA512C3d, SHA512C3e, SHA512C3f, + SHA512C40, SHA512C41, SHA512C42, SHA512C43, + SHA512C44, SHA512C45, SHA512C46, SHA512C47, + SHA512C48, SHA512C49, SHA512C4a, SHA512C4b, + SHA512C4c, SHA512C4d, SHA512C4e, SHA512C4f, +}; + +__device__ static void sha512_transform (const u32x w0[4], const u32x w1[4], const u32x w2[4], const u32x w3[4], u64x digest[8]) +{ + u64x w0_t = hl32_to_64 (w0[0], w0[1]); + u64x w1_t = hl32_to_64 (w0[2], w0[3]); + u64x w2_t = hl32_to_64 (w1[0], w1[1]); + u64x w3_t = hl32_to_64 (w1[2], w1[3]); + u64x w4_t = hl32_to_64 (w2[0], w2[1]); + u64x w5_t = hl32_to_64 (w2[2], w2[3]); + u64x w6_t = hl32_to_64 (w3[0], w3[1]); + u64x w7_t = 0; + u64x w8_t = 0; + u64x w9_t = 0; + u64x wa_t = 0; + u64x wb_t = 0; + u64x wc_t = 0; + u64x wd_t = 0; + u64x we_t = 0; + u64x wf_t = hl32_to_64 (w3[2], w3[3]); + + u64x a = digest[0]; + u64x b = digest[1]; + u64x c = digest[2]; + u64x d = digest[3]; + u64x e = digest[4]; + u64x f = digest[5]; + u64x g = digest[6]; + u64x h = digest[7]; + + #define ROUND_EXPAND() \ + { \ + w0_t = SHA512_EXPAND (we_t, w9_t, w1_t, w0_t); \ + w1_t = SHA512_EXPAND (wf_t, wa_t, w2_t, w1_t); \ + w2_t = SHA512_EXPAND (w0_t, wb_t, w3_t, w2_t); \ + w3_t = SHA512_EXPAND (w1_t, wc_t, w4_t, w3_t); \ + w4_t = SHA512_EXPAND (w2_t, wd_t, w5_t, w4_t); \ + w5_t = SHA512_EXPAND (w3_t, we_t, w6_t, w5_t); \ + w6_t = SHA512_EXPAND (w4_t, wf_t, w7_t, w6_t); \ + w7_t = SHA512_EXPAND (w5_t, w0_t, w8_t, w7_t); \ + w8_t = SHA512_EXPAND (w6_t, w1_t, w9_t, w8_t); \ + w9_t = SHA512_EXPAND (w7_t, w2_t, wa_t, w9_t); \ + wa_t = SHA512_EXPAND (w8_t, w3_t, wb_t, wa_t); \ + wb_t = SHA512_EXPAND (w9_t, w4_t, wc_t, wb_t); \ + wc_t = SHA512_EXPAND (wa_t, w5_t, wd_t, wc_t); \ + wd_t = SHA512_EXPAND (wb_t, w6_t, we_t, wd_t); \ + we_t = SHA512_EXPAND (wc_t, w7_t, wf_t, we_t); \ + wf_t = SHA512_EXPAND (wd_t, w8_t, w0_t, wf_t); \ + } + + #define ROUND_STEP(i) \ + { \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, a, b, c, d, e, f, g, h, w0_t, k_sha512[i + 0]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, h, a, b, c, d, e, f, g, w1_t, k_sha512[i + 1]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, g, h, a, b, c, d, e, f, w2_t, k_sha512[i + 2]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, f, g, h, a, b, c, d, e, w3_t, k_sha512[i + 3]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, e, f, g, h, a, b, c, d, w4_t, k_sha512[i + 4]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, d, e, f, g, h, a, b, c, w5_t, k_sha512[i + 5]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, c, d, e, f, g, h, a, b, w6_t, k_sha512[i + 6]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, b, c, d, e, f, g, h, a, w7_t, k_sha512[i + 7]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, a, b, c, d, e, f, g, h, w8_t, k_sha512[i + 8]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, h, a, b, c, d, e, f, g, w9_t, k_sha512[i + 9]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, g, h, a, b, c, d, e, f, wa_t, k_sha512[i + 10]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, f, g, h, a, b, c, d, e, wb_t, k_sha512[i + 11]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, e, f, g, h, a, b, c, d, wc_t, k_sha512[i + 12]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, d, e, f, g, h, a, b, c, wd_t, k_sha512[i + 13]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, c, d, e, f, g, h, a, b, we_t, k_sha512[i + 14]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, b, c, d, e, f, g, h, a, wf_t, k_sha512[i + 15]); \ + } + + ROUND_STEP (0); + + for (int i = 16; i < 80; i += 16) + { + ROUND_EXPAND (); ROUND_STEP (i); + } + + /* rev + digest[0] += a; + digest[1] += b; + digest[2] += c; + digest[3] += d; + digest[4] += e; + digest[5] += f; + digest[6] += g; + digest[7] += h; + */ + + digest[0] = a; + digest[1] = b; + digest[2] = c; + digest[3] = d; + digest[4] = e; + digest[5] = f; + digest[6] = g; + digest[7] = h; +} + +__device__ static void m01730m (u32 w[16], const u32 pw_len, const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const u32x *words_buf_r, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset) +{ + /** + * modifier + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + const u32 lid = threadIdx.x; + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[ 1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[ 2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[ 3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[ 4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[ 5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[ 6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[ 7]; + + u32 salt_buf2[4]; + + salt_buf2[0] = salt_bufs[salt_pos].salt_buf[ 8]; + salt_buf2[1] = 0; + salt_buf2[2] = 0; + salt_buf2[3] = 0; + + u32 salt_buf3[4]; + + salt_buf3[0] = 0; + salt_buf3[1] = 0; + salt_buf3[2] = 0; + salt_buf3[3] = 0; + + switch_buffer_by_offset (salt_buf0, salt_buf1, salt_buf2, salt_buf3, pw_len); + + w[ 0] |= swap_workaround (salt_buf0[0]); + w[ 1] |= swap_workaround (salt_buf0[1]); + w[ 2] |= swap_workaround (salt_buf0[2]); + w[ 3] |= swap_workaround (salt_buf0[3]); + w[ 4] |= swap_workaround (salt_buf1[0]); + w[ 5] |= swap_workaround (salt_buf1[1]); + w[ 6] |= swap_workaround (salt_buf1[2]); + w[ 7] |= swap_workaround (salt_buf1[3]); + w[ 8] |= swap_workaround (salt_buf2[0]); + w[ 9] |= swap_workaround (salt_buf2[1]); + w[10] |= swap_workaround (salt_buf2[2]); + w[11] |= swap_workaround (salt_buf2[3]); + w[12] |= swap_workaround (salt_buf3[0]); + w[13] |= swap_workaround (salt_buf3[1]); + w[14] |= swap_workaround (salt_buf3[2]); + w[15] |= swap_workaround (salt_buf3[3]); + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + const u32 pw_salt_len = pw_len + salt_len; + + w[15] = pw_salt_len * 8; + + /** + * loop + */ + + const u32 bf_loops = ceil ((float) bfs_cnt / VECT_DIV); + + u32x w0l = w[0]; + + for (u32 il_pos = 0; il_pos < bf_loops; il_pos++) + { + const u32x w0r = c_bfs[il_pos]; + + const u32x w0 = w0l | w0r; + + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + w0_t[0] = w0; + w0_t[1] = w[ 1]; + w0_t[2] = w[ 2]; + w0_t[3] = w[ 3]; + w1_t[0] = w[ 4]; + w1_t[1] = w[ 5]; + w1_t[2] = w[ 6]; + w1_t[3] = w[ 7]; + w2_t[0] = w[ 8]; + w2_t[1] = w[ 9]; + w2_t[2] = w[10]; + w2_t[3] = w[11]; + w3_t[0] = w[12]; + w3_t[1] = w[13]; + w3_t[2] = w[14]; + w3_t[3] = w[15]; + + u64x digest[8]; + + digest[0] = SHA512M_A; + digest[1] = SHA512M_B; + digest[2] = SHA512M_C; + digest[3] = SHA512M_D; + digest[4] = SHA512M_E; + digest[5] = SHA512M_F; + digest[6] = SHA512M_G; + digest[7] = SHA512M_H; + + sha512_transform (w0_t, w1_t, w2_t, w3_t, digest); + + + const u32x r0 = l32_from_64 (digest[7]); + const u32x r1 = h32_from_64 (digest[7]); + const u32x r2 = l32_from_64 (digest[3]); + const u32x r3 = h32_from_64 (digest[3]); + + #include VECT_COMPARE_M + } +} + +__device__ static void m01730s (u32 w[16], const u32 pw_len, const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const u32x *words_buf_r, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset) +{ + /** + * modifier + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + const u32 lid = threadIdx.x; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * loop + */ + + const u32 bf_loops = ceil ((float) bfs_cnt / VECT_DIV); + + u32x w0l = w[0]; + + for (u32 il_pos = 0; il_pos < bf_loops; il_pos++) + { + const u32x w0r = c_bfs[il_pos]; + + const u32x w0 = w0l | w0r; + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + w0_t[0] = w0; + w0_t[1] = w[ 1]; + w0_t[2] = w[ 2]; + w0_t[3] = w[ 3]; + w1_t[0] = w[ 4]; + w1_t[1] = w[ 5]; + w1_t[2] = w[ 6]; + w1_t[3] = w[ 7]; + w2_t[0] = w[ 8]; + w2_t[1] = w[ 9]; + w2_t[2] = w[10]; + w2_t[3] = w[11]; + w3_t[0] = w[12]; + w3_t[1] = w[13]; + w3_t[2] = w[14]; + w3_t[3] = w[15]; + + u64x digest[8]; + + digest[0] = SHA512M_A; + digest[1] = SHA512M_B; + digest[2] = SHA512M_C; + digest[3] = SHA512M_D; + digest[4] = SHA512M_E; + digest[5] = SHA512M_F; + digest[6] = SHA512M_G; + digest[7] = SHA512M_H; + + sha512_transform (w0_t, w1_t, w2_t, w3_t, digest); + + + const u32x r0 = l32_from_64 (digest[7]); + const u32x r1 = h32_from_64 (digest[7]); + const u32x r2 = l32_from_64 (digest[3]); + const u32x r3 = h32_from_64 (digest[3]); + + #include VECT_COMPARE_S + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m01730_m04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const u32x *words_buf_r, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32 w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = 0; + w[ 5] = 0; + w[ 6] = 0; + w[ 7] = 0; + w[ 8] = 0; + w[ 9] = 0; + w[10] = 0; + w[11] = 0; + w[12] = 0; + w[13] = 0; + w[14] = 0; + w[15] = pws[gid].i[15]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m01730m (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m01730_m08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const u32x *words_buf_r, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32 w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = pws[gid].i[ 4]; + w[ 5] = pws[gid].i[ 5]; + w[ 6] = pws[gid].i[ 6]; + w[ 7] = pws[gid].i[ 7]; + w[ 8] = 0; + w[ 9] = 0; + w[10] = 0; + w[11] = 0; + w[12] = 0; + w[13] = 0; + w[14] = 0; + w[15] = pws[gid].i[15]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m01730m (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m01730_m16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const u32x *words_buf_r, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32 w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = pws[gid].i[ 4]; + w[ 5] = pws[gid].i[ 5]; + w[ 6] = pws[gid].i[ 6]; + w[ 7] = pws[gid].i[ 7]; + w[ 8] = pws[gid].i[ 8]; + w[ 9] = pws[gid].i[ 9]; + w[10] = pws[gid].i[10]; + w[11] = pws[gid].i[11]; + w[12] = pws[gid].i[12]; + w[13] = pws[gid].i[13]; + w[14] = pws[gid].i[14]; + w[15] = pws[gid].i[15]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m01730m (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m01730_s04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const u32x *words_buf_r, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32 w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = 0; + w[ 5] = 0; + w[ 6] = 0; + w[ 7] = 0; + w[ 8] = 0; + w[ 9] = 0; + w[10] = 0; + w[11] = 0; + w[12] = 0; + w[13] = 0; + w[14] = 0; + w[15] = pws[gid].i[15]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m01730s (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m01730_s08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const u32x *words_buf_r, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32 w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = pws[gid].i[ 4]; + w[ 5] = pws[gid].i[ 5]; + w[ 6] = pws[gid].i[ 6]; + w[ 7] = pws[gid].i[ 7]; + w[ 8] = 0; + w[ 9] = 0; + w[10] = 0; + w[11] = 0; + w[12] = 0; + w[13] = 0; + w[14] = 0; + w[15] = pws[gid].i[15]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m01730s (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m01730_s16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const u32x *words_buf_r, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32 w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = pws[gid].i[ 4]; + w[ 5] = pws[gid].i[ 5]; + w[ 6] = pws[gid].i[ 6]; + w[ 7] = pws[gid].i[ 7]; + w[ 8] = pws[gid].i[ 8]; + w[ 9] = pws[gid].i[ 9]; + w[10] = pws[gid].i[10]; + w[11] = pws[gid].i[11]; + w[12] = pws[gid].i[12]; + w[13] = pws[gid].i[13]; + w[14] = pws[gid].i[14]; + w[15] = pws[gid].i[15]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m01730s (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} diff --git a/nv/m01740_a0.cu b/nv/m01740_a0.cu new file mode 100644 index 0000000000..796101826a --- /dev/null +++ b/nv/m01740_a0.cu @@ -0,0 +1,499 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _SHA512_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW2 +#define VECT_SIZE1 +#endif + +#define DGST_R0 14 +#define DGST_R1 15 +#define DGST_R2 6 +#define DGST_R3 7 + +#include "include/kernel_functions.c" +#include "types_nv.c" +#include "common_nv.c" +#include "include/rp_gpu.h" +#include "rp_nv.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +__device__ __constant__ gpu_rule_t c_rules[1024]; + +__device__ __constant__ u64 k_sha512[80] = +{ + SHA512C00, SHA512C01, SHA512C02, SHA512C03, + SHA512C04, SHA512C05, SHA512C06, SHA512C07, + SHA512C08, SHA512C09, SHA512C0a, SHA512C0b, + SHA512C0c, SHA512C0d, SHA512C0e, SHA512C0f, + SHA512C10, SHA512C11, SHA512C12, SHA512C13, + SHA512C14, SHA512C15, SHA512C16, SHA512C17, + SHA512C18, SHA512C19, SHA512C1a, SHA512C1b, + SHA512C1c, SHA512C1d, SHA512C1e, SHA512C1f, + SHA512C20, SHA512C21, SHA512C22, SHA512C23, + SHA512C24, SHA512C25, SHA512C26, SHA512C27, + SHA512C28, SHA512C29, SHA512C2a, SHA512C2b, + SHA512C2c, SHA512C2d, SHA512C2e, SHA512C2f, + SHA512C30, SHA512C31, SHA512C32, SHA512C33, + SHA512C34, SHA512C35, SHA512C36, SHA512C37, + SHA512C38, SHA512C39, SHA512C3a, SHA512C3b, + SHA512C3c, SHA512C3d, SHA512C3e, SHA512C3f, + SHA512C40, SHA512C41, SHA512C42, SHA512C43, + SHA512C44, SHA512C45, SHA512C46, SHA512C47, + SHA512C48, SHA512C49, SHA512C4a, SHA512C4b, + SHA512C4c, SHA512C4d, SHA512C4e, SHA512C4f, +}; + +__device__ static void sha512_transform (const u32x w0[4], const u32x w1[4], const u32x w2[4], const u32x w3[4], u64x digest[8]) +{ + u64x w0_t = hl32_to_64 (w0[0], w0[1]); + u64x w1_t = hl32_to_64 (w0[2], w0[3]); + u64x w2_t = hl32_to_64 (w1[0], w1[1]); + u64x w3_t = hl32_to_64 (w1[2], w1[3]); + u64x w4_t = hl32_to_64 (w2[0], w2[1]); + u64x w5_t = hl32_to_64 (w2[2], w2[3]); + u64x w6_t = hl32_to_64 (w3[0], w3[1]); + u64x w7_t = 0; + u64x w8_t = 0; + u64x w9_t = 0; + u64x wa_t = 0; + u64x wb_t = 0; + u64x wc_t = 0; + u64x wd_t = 0; + u64x we_t = 0; + u64x wf_t = hl32_to_64 (w3[2], w3[3]); + + u64x a = digest[0]; + u64x b = digest[1]; + u64x c = digest[2]; + u64x d = digest[3]; + u64x e = digest[4]; + u64x f = digest[5]; + u64x g = digest[6]; + u64x h = digest[7]; + + #define ROUND_EXPAND() \ + { \ + w0_t = SHA512_EXPAND (we_t, w9_t, w1_t, w0_t); \ + w1_t = SHA512_EXPAND (wf_t, wa_t, w2_t, w1_t); \ + w2_t = SHA512_EXPAND (w0_t, wb_t, w3_t, w2_t); \ + w3_t = SHA512_EXPAND (w1_t, wc_t, w4_t, w3_t); \ + w4_t = SHA512_EXPAND (w2_t, wd_t, w5_t, w4_t); \ + w5_t = SHA512_EXPAND (w3_t, we_t, w6_t, w5_t); \ + w6_t = SHA512_EXPAND (w4_t, wf_t, w7_t, w6_t); \ + w7_t = SHA512_EXPAND (w5_t, w0_t, w8_t, w7_t); \ + w8_t = SHA512_EXPAND (w6_t, w1_t, w9_t, w8_t); \ + w9_t = SHA512_EXPAND (w7_t, w2_t, wa_t, w9_t); \ + wa_t = SHA512_EXPAND (w8_t, w3_t, wb_t, wa_t); \ + wb_t = SHA512_EXPAND (w9_t, w4_t, wc_t, wb_t); \ + wc_t = SHA512_EXPAND (wa_t, w5_t, wd_t, wc_t); \ + wd_t = SHA512_EXPAND (wb_t, w6_t, we_t, wd_t); \ + we_t = SHA512_EXPAND (wc_t, w7_t, wf_t, we_t); \ + wf_t = SHA512_EXPAND (wd_t, w8_t, w0_t, wf_t); \ + } + + #define ROUND_STEP(i) \ + { \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, a, b, c, d, e, f, g, h, w0_t, k_sha512[i + 0]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, h, a, b, c, d, e, f, g, w1_t, k_sha512[i + 1]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, g, h, a, b, c, d, e, f, w2_t, k_sha512[i + 2]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, f, g, h, a, b, c, d, e, w3_t, k_sha512[i + 3]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, e, f, g, h, a, b, c, d, w4_t, k_sha512[i + 4]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, d, e, f, g, h, a, b, c, w5_t, k_sha512[i + 5]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, c, d, e, f, g, h, a, b, w6_t, k_sha512[i + 6]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, b, c, d, e, f, g, h, a, w7_t, k_sha512[i + 7]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, a, b, c, d, e, f, g, h, w8_t, k_sha512[i + 8]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, h, a, b, c, d, e, f, g, w9_t, k_sha512[i + 9]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, g, h, a, b, c, d, e, f, wa_t, k_sha512[i + 10]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, f, g, h, a, b, c, d, e, wb_t, k_sha512[i + 11]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, e, f, g, h, a, b, c, d, wc_t, k_sha512[i + 12]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, d, e, f, g, h, a, b, c, wd_t, k_sha512[i + 13]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, c, d, e, f, g, h, a, b, we_t, k_sha512[i + 14]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, b, c, d, e, f, g, h, a, wf_t, k_sha512[i + 15]); \ + } + + ROUND_STEP (0); + + for (int i = 16; i < 80; i += 16) + { + ROUND_EXPAND (); ROUND_STEP (i); + } + + /* rev + digest[0] += a; + digest[1] += b; + digest[2] += c; + digest[3] += d; + digest[4] += e; + digest[5] += f; + digest[6] += g; + digest[7] += h; + */ + + digest[0] = a; + digest[1] = b; + digest[2] = c; + digest[3] = d; + digest[4] = e; + digest[5] = f; + digest[6] = g; + digest[7] = h; +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m01740_m04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + u32x pw_buf1[4]; + + pw_buf1[0] = pws[gid].i[ 4]; + pw_buf1[1] = pws[gid].i[ 5]; + pw_buf1[2] = pws[gid].i[ 6]; + pw_buf1[3] = pws[gid].i[ 7]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[7]; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + u32x w1[4]; + u32x w2[4]; + u32x w3[4]; + + w0[0] = pw_buf0[0]; + w0[1] = pw_buf0[1]; + w0[2] = pw_buf0[2]; + w0[3] = pw_buf0[3]; + w1[0] = pw_buf1[0]; + w1[1] = pw_buf1[1]; + w1[2] = pw_buf1[2]; + w1[3] = pw_buf1[3]; + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 out_len = apply_rules (c_rules[il_pos].cmds, w0, w1, pw_len); + + /** + * prepend salt + */ + + const u32 out_salt_len = (out_len * 2) + salt_len; + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + make_unicode (w0, w0_t, w1_t); + make_unicode (w1, w2_t, w3_t); + + switch_buffer_by_offset (w0_t, w1_t, w2_t, w3_t, salt_len); + + w0_t[0] |= salt_buf0[0]; + w0_t[1] |= salt_buf0[1]; + w0_t[2] |= salt_buf0[2]; + w0_t[3] |= salt_buf0[3]; + w1_t[0] |= salt_buf1[0]; + w1_t[1] |= salt_buf1[1]; + w1_t[2] |= salt_buf1[2]; + w1_t[3] |= salt_buf1[3]; + + append_0x80_4 (w0_t, w1_t, w2_t, w3_t, out_salt_len); + + /** + * sha512 + */ + + w0_t[0] = swap_workaround (w0_t[0]); + w0_t[1] = swap_workaround (w0_t[1]); + w0_t[2] = swap_workaround (w0_t[2]); + w0_t[3] = swap_workaround (w0_t[3]); + w1_t[0] = swap_workaround (w1_t[0]); + w1_t[1] = swap_workaround (w1_t[1]); + w1_t[2] = swap_workaround (w1_t[2]); + w1_t[3] = swap_workaround (w1_t[3]); + w2_t[0] = swap_workaround (w2_t[0]); + w2_t[1] = swap_workaround (w2_t[1]); + w2_t[2] = swap_workaround (w2_t[2]); + w2_t[3] = swap_workaround (w2_t[3]); + w3_t[0] = swap_workaround (w3_t[0]); + w3_t[1] = swap_workaround (w3_t[1]); + w3_t[2] = 0; + w3_t[3] = out_salt_len * 8; + + u64x digest[8]; + + digest[0] = SHA512M_A; + digest[1] = SHA512M_B; + digest[2] = SHA512M_C; + digest[3] = SHA512M_D; + digest[4] = SHA512M_E; + digest[5] = SHA512M_F; + digest[6] = SHA512M_G; + digest[7] = SHA512M_H; + + sha512_transform (w0_t, w1_t, w2_t, w3_t, digest); + + + const u32x r0 = l32_from_64 (digest[7]); + const u32x r1 = h32_from_64 (digest[7]); + const u32x r2 = l32_from_64 (digest[3]); + const u32x r3 = h32_from_64 (digest[3]); + + #include VECT_COMPARE_M + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m01740_m08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m01740_m16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m01740_s04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + u32x pw_buf1[4]; + + pw_buf1[0] = pws[gid].i[ 4]; + pw_buf1[1] = pws[gid].i[ 5]; + pw_buf1[2] = pws[gid].i[ 6]; + pw_buf1[3] = pws[gid].i[ 7]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[7]; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + u32x w1[4]; + u32x w2[4]; + u32x w3[4]; + + w0[0] = pw_buf0[0]; + w0[1] = pw_buf0[1]; + w0[2] = pw_buf0[2]; + w0[3] = pw_buf0[3]; + w1[0] = pw_buf1[0]; + w1[1] = pw_buf1[1]; + w1[2] = pw_buf1[2]; + w1[3] = pw_buf1[3]; + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 out_len = apply_rules (c_rules[il_pos].cmds, w0, w1, pw_len); + + /** + * prepend salt + */ + + const u32 out_salt_len = (out_len * 2) + salt_len; + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + make_unicode (w0, w0_t, w1_t); + make_unicode (w1, w2_t, w3_t); + + switch_buffer_by_offset (w0_t, w1_t, w2_t, w3_t, salt_len); + + w0_t[0] |= salt_buf0[0]; + w0_t[1] |= salt_buf0[1]; + w0_t[2] |= salt_buf0[2]; + w0_t[3] |= salt_buf0[3]; + w1_t[0] |= salt_buf1[0]; + w1_t[1] |= salt_buf1[1]; + w1_t[2] |= salt_buf1[2]; + w1_t[3] |= salt_buf1[3]; + + append_0x80_4 (w0_t, w1_t, w2_t, w3_t, out_salt_len); + + /** + * sha512 + */ + + w0_t[0] = swap_workaround (w0_t[0]); + w0_t[1] = swap_workaround (w0_t[1]); + w0_t[2] = swap_workaround (w0_t[2]); + w0_t[3] = swap_workaround (w0_t[3]); + w1_t[0] = swap_workaround (w1_t[0]); + w1_t[1] = swap_workaround (w1_t[1]); + w1_t[2] = swap_workaround (w1_t[2]); + w1_t[3] = swap_workaround (w1_t[3]); + w2_t[0] = swap_workaround (w2_t[0]); + w2_t[1] = swap_workaround (w2_t[1]); + w2_t[2] = swap_workaround (w2_t[2]); + w2_t[3] = swap_workaround (w2_t[3]); + w3_t[0] = swap_workaround (w3_t[0]); + w3_t[1] = swap_workaround (w3_t[1]); + w3_t[2] = 0; + w3_t[3] = out_salt_len * 8; + + u64x digest[8]; + + digest[0] = SHA512M_A; + digest[1] = SHA512M_B; + digest[2] = SHA512M_C; + digest[3] = SHA512M_D; + digest[4] = SHA512M_E; + digest[5] = SHA512M_F; + digest[6] = SHA512M_G; + digest[7] = SHA512M_H; + + sha512_transform (w0_t, w1_t, w2_t, w3_t, digest); + + + const u32x r0 = l32_from_64 (digest[7]); + const u32x r1 = h32_from_64 (digest[7]); + const u32x r2 = l32_from_64 (digest[3]); + const u32x r3 = h32_from_64 (digest[3]); + + #include VECT_COMPARE_S + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m01740_s08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m01740_s16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/nv/m01740_a1.cu b/nv/m01740_a1.cu new file mode 100644 index 0000000000..6b7ac88caa --- /dev/null +++ b/nv/m01740_a1.cu @@ -0,0 +1,593 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _SHA512_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW2 +#define VECT_SIZE1 +#endif + +#define DGST_R0 14 +#define DGST_R1 15 +#define DGST_R2 6 +#define DGST_R3 7 + +#include "include/kernel_functions.c" +#include "types_nv.c" +#include "common_nv.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +__device__ __constant__ comb_t c_combs[1024]; + +__device__ __constant__ u64 k_sha512[80] = +{ + SHA512C00, SHA512C01, SHA512C02, SHA512C03, + SHA512C04, SHA512C05, SHA512C06, SHA512C07, + SHA512C08, SHA512C09, SHA512C0a, SHA512C0b, + SHA512C0c, SHA512C0d, SHA512C0e, SHA512C0f, + SHA512C10, SHA512C11, SHA512C12, SHA512C13, + SHA512C14, SHA512C15, SHA512C16, SHA512C17, + SHA512C18, SHA512C19, SHA512C1a, SHA512C1b, + SHA512C1c, SHA512C1d, SHA512C1e, SHA512C1f, + SHA512C20, SHA512C21, SHA512C22, SHA512C23, + SHA512C24, SHA512C25, SHA512C26, SHA512C27, + SHA512C28, SHA512C29, SHA512C2a, SHA512C2b, + SHA512C2c, SHA512C2d, SHA512C2e, SHA512C2f, + SHA512C30, SHA512C31, SHA512C32, SHA512C33, + SHA512C34, SHA512C35, SHA512C36, SHA512C37, + SHA512C38, SHA512C39, SHA512C3a, SHA512C3b, + SHA512C3c, SHA512C3d, SHA512C3e, SHA512C3f, + SHA512C40, SHA512C41, SHA512C42, SHA512C43, + SHA512C44, SHA512C45, SHA512C46, SHA512C47, + SHA512C48, SHA512C49, SHA512C4a, SHA512C4b, + SHA512C4c, SHA512C4d, SHA512C4e, SHA512C4f, +}; + +__device__ static void sha512_transform (const u32x w0[4], const u32x w1[4], const u32x w2[4], const u32x w3[4], u64x digest[8]) +{ + u64x w0_t = hl32_to_64 (w0[0], w0[1]); + u64x w1_t = hl32_to_64 (w0[2], w0[3]); + u64x w2_t = hl32_to_64 (w1[0], w1[1]); + u64x w3_t = hl32_to_64 (w1[2], w1[3]); + u64x w4_t = hl32_to_64 (w2[0], w2[1]); + u64x w5_t = hl32_to_64 (w2[2], w2[3]); + u64x w6_t = hl32_to_64 (w3[0], w3[1]); + u64x w7_t = 0; + u64x w8_t = 0; + u64x w9_t = 0; + u64x wa_t = 0; + u64x wb_t = 0; + u64x wc_t = 0; + u64x wd_t = 0; + u64x we_t = 0; + u64x wf_t = hl32_to_64 (w3[2], w3[3]); + + u64x a = digest[0]; + u64x b = digest[1]; + u64x c = digest[2]; + u64x d = digest[3]; + u64x e = digest[4]; + u64x f = digest[5]; + u64x g = digest[6]; + u64x h = digest[7]; + + #define ROUND_EXPAND() \ + { \ + w0_t = SHA512_EXPAND (we_t, w9_t, w1_t, w0_t); \ + w1_t = SHA512_EXPAND (wf_t, wa_t, w2_t, w1_t); \ + w2_t = SHA512_EXPAND (w0_t, wb_t, w3_t, w2_t); \ + w3_t = SHA512_EXPAND (w1_t, wc_t, w4_t, w3_t); \ + w4_t = SHA512_EXPAND (w2_t, wd_t, w5_t, w4_t); \ + w5_t = SHA512_EXPAND (w3_t, we_t, w6_t, w5_t); \ + w6_t = SHA512_EXPAND (w4_t, wf_t, w7_t, w6_t); \ + w7_t = SHA512_EXPAND (w5_t, w0_t, w8_t, w7_t); \ + w8_t = SHA512_EXPAND (w6_t, w1_t, w9_t, w8_t); \ + w9_t = SHA512_EXPAND (w7_t, w2_t, wa_t, w9_t); \ + wa_t = SHA512_EXPAND (w8_t, w3_t, wb_t, wa_t); \ + wb_t = SHA512_EXPAND (w9_t, w4_t, wc_t, wb_t); \ + wc_t = SHA512_EXPAND (wa_t, w5_t, wd_t, wc_t); \ + wd_t = SHA512_EXPAND (wb_t, w6_t, we_t, wd_t); \ + we_t = SHA512_EXPAND (wc_t, w7_t, wf_t, we_t); \ + wf_t = SHA512_EXPAND (wd_t, w8_t, w0_t, wf_t); \ + } + + #define ROUND_STEP(i) \ + { \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, a, b, c, d, e, f, g, h, w0_t, k_sha512[i + 0]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, h, a, b, c, d, e, f, g, w1_t, k_sha512[i + 1]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, g, h, a, b, c, d, e, f, w2_t, k_sha512[i + 2]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, f, g, h, a, b, c, d, e, w3_t, k_sha512[i + 3]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, e, f, g, h, a, b, c, d, w4_t, k_sha512[i + 4]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, d, e, f, g, h, a, b, c, w5_t, k_sha512[i + 5]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, c, d, e, f, g, h, a, b, w6_t, k_sha512[i + 6]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, b, c, d, e, f, g, h, a, w7_t, k_sha512[i + 7]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, a, b, c, d, e, f, g, h, w8_t, k_sha512[i + 8]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, h, a, b, c, d, e, f, g, w9_t, k_sha512[i + 9]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, g, h, a, b, c, d, e, f, wa_t, k_sha512[i + 10]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, f, g, h, a, b, c, d, e, wb_t, k_sha512[i + 11]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, e, f, g, h, a, b, c, d, wc_t, k_sha512[i + 12]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, d, e, f, g, h, a, b, c, wd_t, k_sha512[i + 13]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, c, d, e, f, g, h, a, b, we_t, k_sha512[i + 14]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, b, c, d, e, f, g, h, a, wf_t, k_sha512[i + 15]); \ + } + + ROUND_STEP (0); + + for (int i = 16; i < 80; i += 16) + { + ROUND_EXPAND (); ROUND_STEP (i); + } + + /* rev + digest[0] += a; + digest[1] += b; + digest[2] += c; + digest[3] += d; + digest[4] += e; + digest[5] += f; + digest[6] += g; + digest[7] += h; + */ + + digest[0] = a; + digest[1] = b; + digest[2] = c; + digest[3] = d; + digest[4] = e; + digest[5] = f; + digest[6] = g; + digest[7] = h; +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m01740_m04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, c_combs[0].pw_len); + } + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[7]; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = c_combs[il_pos].pw_len; + + const u32 pw_len = pw_l_len + pw_r_len; + + u32 wordr0[4]; + u32 wordr1[4]; + u32 wordr2[4]; + u32 wordr3[4]; + + wordr0[0] = c_combs[il_pos].i[0]; + wordr0[1] = c_combs[il_pos].i[1]; + wordr0[2] = c_combs[il_pos].i[2]; + wordr0[3] = c_combs[il_pos].i[3]; + wordr1[0] = c_combs[il_pos].i[4]; + wordr1[1] = c_combs[il_pos].i[5]; + wordr1[2] = c_combs[il_pos].i[6]; + wordr1[3] = c_combs[il_pos].i[7]; + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + u32x w0[4]; + u32x w1[4]; + u32x w2[4]; + u32x w3[4]; + + w0[0] = wordl0[0] | wordr0[0]; + w0[1] = wordl0[1] | wordr0[1]; + w0[2] = wordl0[2] | wordr0[2]; + w0[3] = wordl0[3] | wordr0[3]; + w1[0] = wordl1[0] | wordr1[0]; + w1[1] = wordl1[1] | wordr1[1]; + w1[2] = wordl1[2] | wordr1[2]; + w1[3] = wordl1[3] | wordr1[3]; + w2[0] = wordl2[0] | wordr2[0]; + w2[1] = wordl2[1] | wordr2[1]; + w2[2] = wordl2[2] | wordr2[2]; + w2[3] = wordl2[3] | wordr2[3]; + w3[0] = wordl3[0] | wordr3[0]; + w3[1] = wordl3[1] | wordr3[1]; + w3[2] = wordl3[2] | wordr3[2]; + w3[3] = wordl3[3] | wordr3[3]; + + /** + * prepend salt + */ + + const u32 pw_salt_len = (pw_len * 2) + salt_len; + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + make_unicode (w0, w0_t, w1_t); + make_unicode (w1, w2_t, w3_t); + + switch_buffer_by_offset (w0_t, w1_t, w2_t, w3_t, salt_len); + + w0_t[0] |= salt_buf0[0]; + w0_t[1] |= salt_buf0[1]; + w0_t[2] |= salt_buf0[2]; + w0_t[3] |= salt_buf0[3]; + w1_t[0] |= salt_buf1[0]; + w1_t[1] |= salt_buf1[1]; + w1_t[2] |= salt_buf1[2]; + w1_t[3] |= salt_buf1[3]; + + append_0x80_4 (w0_t, w1_t, w2_t, w3_t, pw_salt_len); + + /** + * sha512 + */ + + w0_t[0] = swap_workaround (w0_t[0]); + w0_t[1] = swap_workaround (w0_t[1]); + w0_t[2] = swap_workaround (w0_t[2]); + w0_t[3] = swap_workaround (w0_t[3]); + w1_t[0] = swap_workaround (w1_t[0]); + w1_t[1] = swap_workaround (w1_t[1]); + w1_t[2] = swap_workaround (w1_t[2]); + w1_t[3] = swap_workaround (w1_t[3]); + w2_t[0] = swap_workaround (w2_t[0]); + w2_t[1] = swap_workaround (w2_t[1]); + w2_t[2] = swap_workaround (w2_t[2]); + w2_t[3] = swap_workaround (w2_t[3]); + w3_t[0] = swap_workaround (w3_t[0]); + w3_t[1] = swap_workaround (w3_t[1]); + w3_t[2] = 0; + w3_t[3] = pw_salt_len * 8; + + u64x digest[8]; + + digest[0] = SHA512M_A; + digest[1] = SHA512M_B; + digest[2] = SHA512M_C; + digest[3] = SHA512M_D; + digest[4] = SHA512M_E; + digest[5] = SHA512M_F; + digest[6] = SHA512M_G; + digest[7] = SHA512M_H; + + sha512_transform (w0_t, w1_t, w2_t, w3_t, digest); + + + const u32x r0 = l32_from_64 (digest[7]); + const u32x r1 = h32_from_64 (digest[7]); + const u32x r2 = l32_from_64 (digest[3]); + const u32x r3 = h32_from_64 (digest[3]); + + #include VECT_COMPARE_M + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m01740_m08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m01740_m16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m01740_s04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, c_combs[0].pw_len); + } + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[7]; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = c_combs[il_pos].pw_len; + + const u32 pw_len = pw_l_len + pw_r_len; + + u32 wordr0[4]; + u32 wordr1[4]; + u32 wordr2[4]; + u32 wordr3[4]; + + wordr0[0] = c_combs[il_pos].i[0]; + wordr0[1] = c_combs[il_pos].i[1]; + wordr0[2] = c_combs[il_pos].i[2]; + wordr0[3] = c_combs[il_pos].i[3]; + wordr1[0] = c_combs[il_pos].i[4]; + wordr1[1] = c_combs[il_pos].i[5]; + wordr1[2] = c_combs[il_pos].i[6]; + wordr1[3] = c_combs[il_pos].i[7]; + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + u32x w0[4]; + u32x w1[4]; + u32x w2[4]; + u32x w3[4]; + + w0[0] = wordl0[0] | wordr0[0]; + w0[1] = wordl0[1] | wordr0[1]; + w0[2] = wordl0[2] | wordr0[2]; + w0[3] = wordl0[3] | wordr0[3]; + w1[0] = wordl1[0] | wordr1[0]; + w1[1] = wordl1[1] | wordr1[1]; + w1[2] = wordl1[2] | wordr1[2]; + w1[3] = wordl1[3] | wordr1[3]; + w2[0] = wordl2[0] | wordr2[0]; + w2[1] = wordl2[1] | wordr2[1]; + w2[2] = wordl2[2] | wordr2[2]; + w2[3] = wordl2[3] | wordr2[3]; + w3[0] = wordl3[0] | wordr3[0]; + w3[1] = wordl3[1] | wordr3[1]; + w3[2] = wordl3[2] | wordr3[2]; + w3[3] = wordl3[3] | wordr3[3]; + + /** + * prepend salt + */ + + const u32 pw_salt_len = (pw_len * 2) + salt_len; + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + make_unicode (w0, w0_t, w1_t); + make_unicode (w1, w2_t, w3_t); + + switch_buffer_by_offset (w0_t, w1_t, w2_t, w3_t, salt_len); + + w0_t[0] |= salt_buf0[0]; + w0_t[1] |= salt_buf0[1]; + w0_t[2] |= salt_buf0[2]; + w0_t[3] |= salt_buf0[3]; + w1_t[0] |= salt_buf1[0]; + w1_t[1] |= salt_buf1[1]; + w1_t[2] |= salt_buf1[2]; + w1_t[3] |= salt_buf1[3]; + + append_0x80_4 (w0_t, w1_t, w2_t, w3_t, pw_salt_len); + + /** + * sha512 + */ + + w0_t[0] = swap_workaround (w0_t[0]); + w0_t[1] = swap_workaround (w0_t[1]); + w0_t[2] = swap_workaround (w0_t[2]); + w0_t[3] = swap_workaround (w0_t[3]); + w1_t[0] = swap_workaround (w1_t[0]); + w1_t[1] = swap_workaround (w1_t[1]); + w1_t[2] = swap_workaround (w1_t[2]); + w1_t[3] = swap_workaround (w1_t[3]); + w2_t[0] = swap_workaround (w2_t[0]); + w2_t[1] = swap_workaround (w2_t[1]); + w2_t[2] = swap_workaround (w2_t[2]); + w2_t[3] = swap_workaround (w2_t[3]); + w3_t[0] = swap_workaround (w3_t[0]); + w3_t[1] = swap_workaround (w3_t[1]); + w3_t[2] = 0; + w3_t[3] = pw_salt_len * 8; + + u64x digest[8]; + + digest[0] = SHA512M_A; + digest[1] = SHA512M_B; + digest[2] = SHA512M_C; + digest[3] = SHA512M_D; + digest[4] = SHA512M_E; + digest[5] = SHA512M_F; + digest[6] = SHA512M_G; + digest[7] = SHA512M_H; + + sha512_transform (w0_t, w1_t, w2_t, w3_t, digest); + + + const u32x r0 = l32_from_64 (digest[7]); + const u32x r1 = h32_from_64 (digest[7]); + const u32x r2 = l32_from_64 (digest[3]); + const u32x r3 = h32_from_64 (digest[3]); + + #include VECT_COMPARE_S + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m01740_s08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m01740_s16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/nv/m01740_a3.cu b/nv/m01740_a3.cu new file mode 100644 index 0000000000..a7d084ba67 --- /dev/null +++ b/nv/m01740_a3.cu @@ -0,0 +1,749 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _SHA512_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW2 +#define VECT_SIZE1 +#endif + +#define DGST_R0 14 +#define DGST_R1 15 +#define DGST_R2 6 +#define DGST_R3 7 + +#include "include/kernel_functions.c" +#include "types_nv.c" +#include "common_nv.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +__device__ __constant__ bf_t c_bfs[1024]; + +__device__ __constant__ u64 k_sha512[80] = +{ + SHA512C00, SHA512C01, SHA512C02, SHA512C03, + SHA512C04, SHA512C05, SHA512C06, SHA512C07, + SHA512C08, SHA512C09, SHA512C0a, SHA512C0b, + SHA512C0c, SHA512C0d, SHA512C0e, SHA512C0f, + SHA512C10, SHA512C11, SHA512C12, SHA512C13, + SHA512C14, SHA512C15, SHA512C16, SHA512C17, + SHA512C18, SHA512C19, SHA512C1a, SHA512C1b, + SHA512C1c, SHA512C1d, SHA512C1e, SHA512C1f, + SHA512C20, SHA512C21, SHA512C22, SHA512C23, + SHA512C24, SHA512C25, SHA512C26, SHA512C27, + SHA512C28, SHA512C29, SHA512C2a, SHA512C2b, + SHA512C2c, SHA512C2d, SHA512C2e, SHA512C2f, + SHA512C30, SHA512C31, SHA512C32, SHA512C33, + SHA512C34, SHA512C35, SHA512C36, SHA512C37, + SHA512C38, SHA512C39, SHA512C3a, SHA512C3b, + SHA512C3c, SHA512C3d, SHA512C3e, SHA512C3f, + SHA512C40, SHA512C41, SHA512C42, SHA512C43, + SHA512C44, SHA512C45, SHA512C46, SHA512C47, + SHA512C48, SHA512C49, SHA512C4a, SHA512C4b, + SHA512C4c, SHA512C4d, SHA512C4e, SHA512C4f, +}; + +__device__ static void sha512_transform (const u32x w0[4], const u32x w1[4], const u32x w2[4], const u32x w3[4], u64x digest[8]) +{ + u64x w0_t = hl32_to_64 (w0[0], w0[1]); + u64x w1_t = hl32_to_64 (w0[2], w0[3]); + u64x w2_t = hl32_to_64 (w1[0], w1[1]); + u64x w3_t = hl32_to_64 (w1[2], w1[3]); + u64x w4_t = hl32_to_64 (w2[0], w2[1]); + u64x w5_t = hl32_to_64 (w2[2], w2[3]); + u64x w6_t = hl32_to_64 (w3[0], w3[1]); + u64x w7_t = 0; + u64x w8_t = 0; + u64x w9_t = 0; + u64x wa_t = 0; + u64x wb_t = 0; + u64x wc_t = 0; + u64x wd_t = 0; + u64x we_t = 0; + u64x wf_t = hl32_to_64 (w3[2], w3[3]); + + u64x a = digest[0]; + u64x b = digest[1]; + u64x c = digest[2]; + u64x d = digest[3]; + u64x e = digest[4]; + u64x f = digest[5]; + u64x g = digest[6]; + u64x h = digest[7]; + + #define ROUND_EXPAND() \ + { \ + w0_t = SHA512_EXPAND (we_t, w9_t, w1_t, w0_t); \ + w1_t = SHA512_EXPAND (wf_t, wa_t, w2_t, w1_t); \ + w2_t = SHA512_EXPAND (w0_t, wb_t, w3_t, w2_t); \ + w3_t = SHA512_EXPAND (w1_t, wc_t, w4_t, w3_t); \ + w4_t = SHA512_EXPAND (w2_t, wd_t, w5_t, w4_t); \ + w5_t = SHA512_EXPAND (w3_t, we_t, w6_t, w5_t); \ + w6_t = SHA512_EXPAND (w4_t, wf_t, w7_t, w6_t); \ + w7_t = SHA512_EXPAND (w5_t, w0_t, w8_t, w7_t); \ + w8_t = SHA512_EXPAND (w6_t, w1_t, w9_t, w8_t); \ + w9_t = SHA512_EXPAND (w7_t, w2_t, wa_t, w9_t); \ + wa_t = SHA512_EXPAND (w8_t, w3_t, wb_t, wa_t); \ + wb_t = SHA512_EXPAND (w9_t, w4_t, wc_t, wb_t); \ + wc_t = SHA512_EXPAND (wa_t, w5_t, wd_t, wc_t); \ + wd_t = SHA512_EXPAND (wb_t, w6_t, we_t, wd_t); \ + we_t = SHA512_EXPAND (wc_t, w7_t, wf_t, we_t); \ + wf_t = SHA512_EXPAND (wd_t, w8_t, w0_t, wf_t); \ + } + + #define ROUND_STEP(i) \ + { \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, a, b, c, d, e, f, g, h, w0_t, k_sha512[i + 0]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, h, a, b, c, d, e, f, g, w1_t, k_sha512[i + 1]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, g, h, a, b, c, d, e, f, w2_t, k_sha512[i + 2]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, f, g, h, a, b, c, d, e, w3_t, k_sha512[i + 3]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, e, f, g, h, a, b, c, d, w4_t, k_sha512[i + 4]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, d, e, f, g, h, a, b, c, w5_t, k_sha512[i + 5]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, c, d, e, f, g, h, a, b, w6_t, k_sha512[i + 6]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, b, c, d, e, f, g, h, a, w7_t, k_sha512[i + 7]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, a, b, c, d, e, f, g, h, w8_t, k_sha512[i + 8]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, h, a, b, c, d, e, f, g, w9_t, k_sha512[i + 9]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, g, h, a, b, c, d, e, f, wa_t, k_sha512[i + 10]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, f, g, h, a, b, c, d, e, wb_t, k_sha512[i + 11]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, e, f, g, h, a, b, c, d, wc_t, k_sha512[i + 12]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, d, e, f, g, h, a, b, c, wd_t, k_sha512[i + 13]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, c, d, e, f, g, h, a, b, we_t, k_sha512[i + 14]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, b, c, d, e, f, g, h, a, wf_t, k_sha512[i + 15]); \ + } + + ROUND_STEP (0); + + for (int i = 16; i < 80; i += 16) + { + ROUND_EXPAND (); ROUND_STEP (i); + } + + /* rev + digest[0] += a; + digest[1] += b; + digest[2] += c; + digest[3] += d; + digest[4] += e; + digest[5] += f; + digest[6] += g; + digest[7] += h; + */ + + digest[0] = a; + digest[1] = b; + digest[2] = c; + digest[3] = d; + digest[4] = e; + digest[5] = f; + digest[6] = g; + digest[7] = h; +} + +__device__ static void m01740m (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], const u32 pw_len, const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset) +{ + /** + * modifier + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + const u32 lid = threadIdx.x; + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[ 1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[ 2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[ 3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[ 4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[ 5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[ 6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[ 7]; + + u32 salt_buf2[4]; + + salt_buf2[0] = 0; + salt_buf2[1] = 0; + salt_buf2[2] = 0; + salt_buf2[3] = 0; + + u32 salt_buf3[4]; + + salt_buf3[0] = 0; + salt_buf3[1] = 0; + salt_buf3[2] = 0; + salt_buf3[3] = 0; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + const u32 pw_salt_len = pw_len + salt_len; + + /** + * loop + */ + + u32x w0l = w0[0]; + + for (u32 il_pos = 0; il_pos < bfs_cnt; il_pos++) + { + const u32 w0r = c_bfs[il_pos].i; + + w0[0] = w0l | w0r; + + /** + * prepend salt + */ + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + w0_t[0] = swap_workaround (w0[0]); + w0_t[1] = swap_workaround (w0[1]); + w0_t[2] = swap_workaround (w0[2]); + w0_t[3] = swap_workaround (w0[3]); + w1_t[0] = swap_workaround (w1[0]); + w1_t[1] = swap_workaround (w1[1]); + w1_t[2] = swap_workaround (w1[2]); + w1_t[3] = swap_workaround (w1[3]); + w2_t[0] = swap_workaround (w2[0]); + w2_t[1] = swap_workaround (w2[1]); + w2_t[2] = swap_workaround (w2[2]); + w2_t[3] = swap_workaround (w2[3]); + w3_t[0] = swap_workaround (w3[0]); + w3_t[1] = swap_workaround (w3[1]); + w3_t[2] = swap_workaround (w3[2]); + w3_t[3] = swap_workaround (w3[3]); + + switch_buffer_by_offset (w0_t, w1_t, w2_t, w3_t, salt_len); + + w0_t[0] |= salt_buf0[0]; + w0_t[1] |= salt_buf0[1]; + w0_t[2] |= salt_buf0[2]; + w0_t[3] |= salt_buf0[3]; + w1_t[0] |= salt_buf1[0]; + w1_t[1] |= salt_buf1[1]; + w1_t[2] |= salt_buf1[2]; + w1_t[3] |= salt_buf1[3]; + w2_t[0] |= salt_buf2[0]; + w2_t[1] |= salt_buf2[1]; + w2_t[2] |= salt_buf2[2]; + w2_t[3] |= salt_buf2[3]; + w3_t[0] |= salt_buf3[0]; + w3_t[1] |= salt_buf3[1]; + w3_t[2] = 0; + w3_t[3] = pw_salt_len * 8; + + /** + * sha512 + */ + + w0_t[0] = swap_workaround (w0_t[0]); + w0_t[1] = swap_workaround (w0_t[1]); + w0_t[2] = swap_workaround (w0_t[2]); + w0_t[3] = swap_workaround (w0_t[3]); + w1_t[0] = swap_workaround (w1_t[0]); + w1_t[1] = swap_workaround (w1_t[1]); + w1_t[2] = swap_workaround (w1_t[2]); + w1_t[3] = swap_workaround (w1_t[3]); + w2_t[0] = swap_workaround (w2_t[0]); + w2_t[1] = swap_workaround (w2_t[1]); + w2_t[2] = swap_workaround (w2_t[2]); + w2_t[3] = swap_workaround (w2_t[3]); + w3_t[0] = swap_workaround (w3_t[0]); + w3_t[1] = swap_workaround (w3_t[1]); + //w3_t[2] = swap_workaround (w3_t[2]); + //w3_t[3] = swap_workaround (w3_t[3]); + + u64x digest[8]; + + digest[0] = SHA512M_A; + digest[1] = SHA512M_B; + digest[2] = SHA512M_C; + digest[3] = SHA512M_D; + digest[4] = SHA512M_E; + digest[5] = SHA512M_F; + digest[6] = SHA512M_G; + digest[7] = SHA512M_H; + + sha512_transform (w0_t, w1_t, w2_t, w3_t, digest); + + + const u32x r0 = l32_from_64 (digest[7]); + const u32x r1 = h32_from_64 (digest[7]); + const u32x r2 = l32_from_64 (digest[3]); + const u32x r3 = h32_from_64 (digest[3]); + + #include VECT_COMPARE_M + } +} + +__device__ static void m01740s (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], const u32 pw_len, const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset) +{ + /** + * modifier + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + const u32 lid = threadIdx.x; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[ 1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[ 2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[ 3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[ 4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[ 5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[ 6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[ 7]; + + u32 salt_buf2[4]; + + salt_buf2[0] = 0; + salt_buf2[1] = 0; + salt_buf2[2] = 0; + salt_buf2[3] = 0; + + u32 salt_buf3[4]; + + salt_buf3[0] = 0; + salt_buf3[1] = 0; + salt_buf3[2] = 0; + salt_buf3[3] = 0; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + const u32 pw_salt_len = pw_len + salt_len; + + /** + * loop + */ + + u32x w0l = w0[0]; + + for (u32 il_pos = 0; il_pos < bfs_cnt; il_pos++) + { + const u32 w0r = c_bfs[il_pos].i; + + w0[0] = w0l | w0r; + + /** + * prepend salt + */ + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + w0_t[0] = swap_workaround (w0[0]); + w0_t[1] = swap_workaround (w0[1]); + w0_t[2] = swap_workaround (w0[2]); + w0_t[3] = swap_workaround (w0[3]); + w1_t[0] = swap_workaround (w1[0]); + w1_t[1] = swap_workaround (w1[1]); + w1_t[2] = swap_workaround (w1[2]); + w1_t[3] = swap_workaround (w1[3]); + w2_t[0] = swap_workaround (w2[0]); + w2_t[1] = swap_workaround (w2[1]); + w2_t[2] = swap_workaround (w2[2]); + w2_t[3] = swap_workaround (w2[3]); + w3_t[0] = swap_workaround (w3[0]); + w3_t[1] = swap_workaround (w3[1]); + w3_t[2] = swap_workaround (w3[2]); + w3_t[3] = swap_workaround (w3[3]); + + switch_buffer_by_offset (w0_t, w1_t, w2_t, w3_t, salt_len); + + w0_t[0] |= salt_buf0[0]; + w0_t[1] |= salt_buf0[1]; + w0_t[2] |= salt_buf0[2]; + w0_t[3] |= salt_buf0[3]; + w1_t[0] |= salt_buf1[0]; + w1_t[1] |= salt_buf1[1]; + w1_t[2] |= salt_buf1[2]; + w1_t[3] |= salt_buf1[3]; + w2_t[0] |= salt_buf2[0]; + w2_t[1] |= salt_buf2[1]; + w2_t[2] |= salt_buf2[2]; + w2_t[3] |= salt_buf2[3]; + w3_t[0] |= salt_buf3[0]; + w3_t[1] |= salt_buf3[1]; + w3_t[2] = 0; + w3_t[3] = pw_salt_len * 8; + + /** + * sha512 + */ + + w0_t[0] = swap_workaround (w0_t[0]); + w0_t[1] = swap_workaround (w0_t[1]); + w0_t[2] = swap_workaround (w0_t[2]); + w0_t[3] = swap_workaround (w0_t[3]); + w1_t[0] = swap_workaround (w1_t[0]); + w1_t[1] = swap_workaround (w1_t[1]); + w1_t[2] = swap_workaround (w1_t[2]); + w1_t[3] = swap_workaround (w1_t[3]); + w2_t[0] = swap_workaround (w2_t[0]); + w2_t[1] = swap_workaround (w2_t[1]); + w2_t[2] = swap_workaround (w2_t[2]); + w2_t[3] = swap_workaround (w2_t[3]); + w3_t[0] = swap_workaround (w3_t[0]); + w3_t[1] = swap_workaround (w3_t[1]); + //w3_t[2] = swap_workaround (w3_t[2]); + //w3_t[3] = swap_workaround (w3_t[3]); + + u64x digest[8]; + + digest[0] = SHA512M_A; + digest[1] = SHA512M_B; + digest[2] = SHA512M_C; + digest[3] = SHA512M_D; + digest[4] = SHA512M_E; + digest[5] = SHA512M_F; + digest[6] = SHA512M_G; + digest[7] = SHA512M_H; + + sha512_transform (w0_t, w1_t, w2_t, w3_t, digest); + + + const u32x r0 = l32_from_64 (digest[7]); + const u32x r1 = h32_from_64 (digest[7]); + const u32x r2 = l32_from_64 (digest[3]); + const u32x r3 = h32_from_64 (digest[3]); + + #include VECT_COMPARE_S + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m01740_m04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m01740m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m01740_m08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m01740m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m01740_m16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = pws[gid].i[ 8]; + w2[1] = pws[gid].i[ 9]; + w2[2] = pws[gid].i[10]; + w2[3] = pws[gid].i[11]; + + u32x w3[4]; + + w3[0] = pws[gid].i[12]; + w3[1] = pws[gid].i[13]; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m01740m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m01740_s04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m01740s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m01740_s08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m01740s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m01740_s16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = pws[gid].i[ 8]; + w2[1] = pws[gid].i[ 9]; + w2[2] = pws[gid].i[10]; + w2[3] = pws[gid].i[11]; + + u32x w3[4]; + + w3[0] = pws[gid].i[12]; + w3[1] = pws[gid].i[13]; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m01740s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} diff --git a/nv/m01750_a0.cu b/nv/m01750_a0.cu new file mode 100644 index 0000000000..5e0f2ef55d --- /dev/null +++ b/nv/m01750_a0.cu @@ -0,0 +1,622 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _SHA512_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW2 +#define VECT_SIZE1 +#endif + +#define DGST_R0 14 +#define DGST_R1 15 +#define DGST_R2 6 +#define DGST_R3 7 + +#include "include/kernel_functions.c" +#include "types_nv.c" +#include "common_nv.c" +#include "include/rp_gpu.h" +#include "rp_nv.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +__device__ __constant__ gpu_rule_t c_rules[1024]; + +__device__ __constant__ u64 k_sha512[80] = +{ + SHA512C00, SHA512C01, SHA512C02, SHA512C03, + SHA512C04, SHA512C05, SHA512C06, SHA512C07, + SHA512C08, SHA512C09, SHA512C0a, SHA512C0b, + SHA512C0c, SHA512C0d, SHA512C0e, SHA512C0f, + SHA512C10, SHA512C11, SHA512C12, SHA512C13, + SHA512C14, SHA512C15, SHA512C16, SHA512C17, + SHA512C18, SHA512C19, SHA512C1a, SHA512C1b, + SHA512C1c, SHA512C1d, SHA512C1e, SHA512C1f, + SHA512C20, SHA512C21, SHA512C22, SHA512C23, + SHA512C24, SHA512C25, SHA512C26, SHA512C27, + SHA512C28, SHA512C29, SHA512C2a, SHA512C2b, + SHA512C2c, SHA512C2d, SHA512C2e, SHA512C2f, + SHA512C30, SHA512C31, SHA512C32, SHA512C33, + SHA512C34, SHA512C35, SHA512C36, SHA512C37, + SHA512C38, SHA512C39, SHA512C3a, SHA512C3b, + SHA512C3c, SHA512C3d, SHA512C3e, SHA512C3f, + SHA512C40, SHA512C41, SHA512C42, SHA512C43, + SHA512C44, SHA512C45, SHA512C46, SHA512C47, + SHA512C48, SHA512C49, SHA512C4a, SHA512C4b, + SHA512C4c, SHA512C4d, SHA512C4e, SHA512C4f, +}; + +__device__ static void sha512_transform (const u64x w0[4], const u64x w1[4], const u64x w2[4], const u64x w3[4], u64x digest[8]) +{ + u64x w0_t = w0[0]; + u64x w1_t = w0[1]; + u64x w2_t = w0[2]; + u64x w3_t = w0[3]; + u64x w4_t = w1[0]; + u64x w5_t = w1[1]; + u64x w6_t = w1[2]; + u64x w7_t = w1[3]; + u64x w8_t = w2[0]; + u64x w9_t = w2[1]; + u64x wa_t = w2[2]; + u64x wb_t = w2[3]; + u64x wc_t = w3[0]; + u64x wd_t = w3[1]; + u64x we_t = w3[2]; + u64x wf_t = w3[3]; + + u64x a = digest[0]; + u64x b = digest[1]; + u64x c = digest[2]; + u64x d = digest[3]; + u64x e = digest[4]; + u64x f = digest[5]; + u64x g = digest[6]; + u64x h = digest[7]; + + #define ROUND_EXPAND() \ + { \ + w0_t = SHA512_EXPAND (we_t, w9_t, w1_t, w0_t); \ + w1_t = SHA512_EXPAND (wf_t, wa_t, w2_t, w1_t); \ + w2_t = SHA512_EXPAND (w0_t, wb_t, w3_t, w2_t); \ + w3_t = SHA512_EXPAND (w1_t, wc_t, w4_t, w3_t); \ + w4_t = SHA512_EXPAND (w2_t, wd_t, w5_t, w4_t); \ + w5_t = SHA512_EXPAND (w3_t, we_t, w6_t, w5_t); \ + w6_t = SHA512_EXPAND (w4_t, wf_t, w7_t, w6_t); \ + w7_t = SHA512_EXPAND (w5_t, w0_t, w8_t, w7_t); \ + w8_t = SHA512_EXPAND (w6_t, w1_t, w9_t, w8_t); \ + w9_t = SHA512_EXPAND (w7_t, w2_t, wa_t, w9_t); \ + wa_t = SHA512_EXPAND (w8_t, w3_t, wb_t, wa_t); \ + wb_t = SHA512_EXPAND (w9_t, w4_t, wc_t, wb_t); \ + wc_t = SHA512_EXPAND (wa_t, w5_t, wd_t, wc_t); \ + wd_t = SHA512_EXPAND (wb_t, w6_t, we_t, wd_t); \ + we_t = SHA512_EXPAND (wc_t, w7_t, wf_t, we_t); \ + wf_t = SHA512_EXPAND (wd_t, w8_t, w0_t, wf_t); \ + } + + #define ROUND_STEP(i) \ + { \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, a, b, c, d, e, f, g, h, w0_t, k_sha512[i + 0]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, h, a, b, c, d, e, f, g, w1_t, k_sha512[i + 1]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, g, h, a, b, c, d, e, f, w2_t, k_sha512[i + 2]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, f, g, h, a, b, c, d, e, w3_t, k_sha512[i + 3]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, e, f, g, h, a, b, c, d, w4_t, k_sha512[i + 4]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, d, e, f, g, h, a, b, c, w5_t, k_sha512[i + 5]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, c, d, e, f, g, h, a, b, w6_t, k_sha512[i + 6]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, b, c, d, e, f, g, h, a, w7_t, k_sha512[i + 7]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, a, b, c, d, e, f, g, h, w8_t, k_sha512[i + 8]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, h, a, b, c, d, e, f, g, w9_t, k_sha512[i + 9]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, g, h, a, b, c, d, e, f, wa_t, k_sha512[i + 10]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, f, g, h, a, b, c, d, e, wb_t, k_sha512[i + 11]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, e, f, g, h, a, b, c, d, wc_t, k_sha512[i + 12]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, d, e, f, g, h, a, b, c, wd_t, k_sha512[i + 13]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, c, d, e, f, g, h, a, b, we_t, k_sha512[i + 14]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, b, c, d, e, f, g, h, a, wf_t, k_sha512[i + 15]); \ + } + + ROUND_STEP (0); + + for (int i = 16; i < 80; i += 16) + { + ROUND_EXPAND (); ROUND_STEP (i); + } + + digest[0] += a; + digest[1] += b; + digest[2] += c; + digest[3] += d; + digest[4] += e; + digest[5] += f; + digest[6] += g; + digest[7] += h; +} + +__device__ static void hmac_sha512_pad (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], u64x ipad[8], u64x opad[8]) +{ + u64x w0_t[4]; + u64x w1_t[4]; + u64x w2_t[4]; + u64x w3_t[4]; + + w0_t[0] = hl32_to_64 (w0[0], w0[1]) ^ 0x3636363636363636; + w0_t[1] = hl32_to_64 (w0[2], w0[3]) ^ 0x3636363636363636; + w0_t[2] = hl32_to_64 (w1[0], w1[1]) ^ 0x3636363636363636; + w0_t[3] = hl32_to_64 (w1[2], w1[3]) ^ 0x3636363636363636; + w1_t[0] = hl32_to_64 (w2[0], w2[1]) ^ 0x3636363636363636; + w1_t[1] = hl32_to_64 (w2[2], w2[3]) ^ 0x3636363636363636; + w1_t[2] = hl32_to_64 (w3[0], w3[1]) ^ 0x3636363636363636; + w1_t[3] = hl32_to_64 (w3[2], w3[3]) ^ 0x3636363636363636; + w2_t[0] = 0 ^ 0x3636363636363636; + w2_t[1] = 0 ^ 0x3636363636363636; + w2_t[2] = 0 ^ 0x3636363636363636; + w2_t[3] = 0 ^ 0x3636363636363636; + w3_t[0] = 0 ^ 0x3636363636363636; + w3_t[1] = 0 ^ 0x3636363636363636; + w3_t[2] = 0 ^ 0x3636363636363636; + w3_t[3] = 0 ^ 0x3636363636363636; + + ipad[0] = SHA512M_A; + ipad[1] = SHA512M_B; + ipad[2] = SHA512M_C; + ipad[3] = SHA512M_D; + ipad[4] = SHA512M_E; + ipad[5] = SHA512M_F; + ipad[6] = SHA512M_G; + ipad[7] = SHA512M_H; + + sha512_transform (w0_t, w1_t, w2_t, w3_t, ipad); + + w0_t[0] = hl32_to_64 (w0[0], w0[1]) ^ 0x5c5c5c5c5c5c5c5c; + w0_t[1] = hl32_to_64 (w0[2], w0[3]) ^ 0x5c5c5c5c5c5c5c5c; + w0_t[2] = hl32_to_64 (w1[0], w1[1]) ^ 0x5c5c5c5c5c5c5c5c; + w0_t[3] = hl32_to_64 (w1[2], w1[3]) ^ 0x5c5c5c5c5c5c5c5c; + w1_t[0] = hl32_to_64 (w2[0], w2[1]) ^ 0x5c5c5c5c5c5c5c5c; + w1_t[1] = hl32_to_64 (w2[2], w2[3]) ^ 0x5c5c5c5c5c5c5c5c; + w1_t[2] = hl32_to_64 (w3[0], w3[1]) ^ 0x5c5c5c5c5c5c5c5c; + w1_t[3] = hl32_to_64 (w3[2], w3[3]) ^ 0x5c5c5c5c5c5c5c5c; + w2_t[0] = 0 ^ 0x5c5c5c5c5c5c5c5c; + w2_t[1] = 0 ^ 0x5c5c5c5c5c5c5c5c; + w2_t[2] = 0 ^ 0x5c5c5c5c5c5c5c5c; + w2_t[3] = 0 ^ 0x5c5c5c5c5c5c5c5c; + w3_t[0] = 0 ^ 0x5c5c5c5c5c5c5c5c; + w3_t[1] = 0 ^ 0x5c5c5c5c5c5c5c5c; + w3_t[2] = 0 ^ 0x5c5c5c5c5c5c5c5c; + w3_t[3] = 0 ^ 0x5c5c5c5c5c5c5c5c; + + opad[0] = SHA512M_A; + opad[1] = SHA512M_B; + opad[2] = SHA512M_C; + opad[3] = SHA512M_D; + opad[4] = SHA512M_E; + opad[5] = SHA512M_F; + opad[6] = SHA512M_G; + opad[7] = SHA512M_H; + + sha512_transform (w0_t, w1_t, w2_t, w3_t, opad); +} + +__device__ static void hmac_sha512_run (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], u64x ipad[8], u64x opad[8], u64x digest[8]) +{ + u64x w0_t[4]; + u64x w1_t[4]; + u64x w2_t[4]; + u64x w3_t[4]; + + w0_t[0] = hl32_to_64 (w0[0], w0[1]); + w0_t[1] = hl32_to_64 (w0[2], w0[3]); + w0_t[2] = hl32_to_64 (w1[0], w1[1]); + w0_t[3] = hl32_to_64 (w1[2], w1[3]); + w1_t[0] = hl32_to_64 (w2[0], w2[1]); + w1_t[1] = hl32_to_64 (w2[2], w2[3]); + w1_t[2] = hl32_to_64 (w3[0], w3[1]); + w1_t[3] = 0; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = hl32_to_64 (w3[2], w3[3]); + + digest[0] = ipad[0]; + digest[1] = ipad[1]; + digest[2] = ipad[2]; + digest[3] = ipad[3]; + digest[4] = ipad[4]; + digest[5] = ipad[5]; + digest[6] = ipad[6]; + digest[7] = ipad[7]; + + sha512_transform (w0_t, w1_t, w2_t, w3_t, digest); + + w0_t[0] = digest[0]; + w0_t[1] = digest[1]; + w0_t[2] = digest[2]; + w0_t[3] = digest[3]; + w1_t[0] = digest[4]; + w1_t[1] = digest[5]; + w1_t[2] = digest[6]; + w1_t[3] = digest[7]; + w2_t[0] = 0x8000000000000000; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = (128 + 64) * 8; + + digest[0] = opad[0]; + digest[1] = opad[1]; + digest[2] = opad[2]; + digest[3] = opad[3]; + digest[4] = opad[4]; + digest[5] = opad[5]; + digest[6] = opad[6]; + digest[7] = opad[7]; + + sha512_transform (w0_t, w1_t, w2_t, w3_t, digest); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m01750_m04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + u32x pw_buf1[4]; + + pw_buf1[0] = pws[gid].i[ 4]; + pw_buf1[1] = pws[gid].i[ 5]; + pw_buf1[2] = pws[gid].i[ 6]; + pw_buf1[3] = pws[gid].i[ 7]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[ 1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[ 2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[ 3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[ 4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[ 5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[ 6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[ 7]; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + + w0[0] = pw_buf0[0]; + w0[1] = pw_buf0[1]; + w0[2] = pw_buf0[2]; + w0[3] = pw_buf0[3]; + + u32x w1[4]; + + w1[0] = pw_buf1[0]; + w1[1] = pw_buf1[1]; + w1[2] = pw_buf1[2]; + w1[3] = pw_buf1[3]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 out_len = apply_rules (c_rules[il_pos].cmds, w0, w1, pw_len); + + /** + * pads + */ + + u32x w0_t[4]; + + w0_t[0] = swap_workaround (w0[0]); + w0_t[1] = swap_workaround (w0[1]); + w0_t[2] = swap_workaround (w0[2]); + w0_t[3] = swap_workaround (w0[3]); + + u32x w1_t[4]; + + w1_t[0] = swap_workaround (w1[0]); + w1_t[1] = swap_workaround (w1[1]); + w1_t[2] = swap_workaround (w1[2]); + w1_t[3] = swap_workaround (w1[3]); + + u32x w2_t[4]; + + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + + u32x w3_t[4]; + + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = 0; + + u64x ipad[8]; + u64x opad[8]; + + hmac_sha512_pad (w0_t, w1_t, w2_t, w3_t, ipad, opad); + + w0_t[0] = swap_workaround (salt_buf0[0]); + w0_t[1] = swap_workaround (salt_buf0[1]); + w0_t[2] = swap_workaround (salt_buf0[2]); + w0_t[3] = swap_workaround (salt_buf0[3]); + w1_t[0] = swap_workaround (salt_buf1[0]); + w1_t[1] = swap_workaround (salt_buf1[1]); + w1_t[2] = swap_workaround (salt_buf1[2]); + w1_t[3] = swap_workaround (salt_buf1[3]); + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = (128 + salt_len) * 8; + + u64x digest[8]; + + hmac_sha512_run (w0_t, w1_t, w2_t, w3_t, ipad, opad, digest); + + + const u32x r0 = l32_from_64 (digest[7]); + const u32x r1 = h32_from_64 (digest[7]); + const u32x r2 = l32_from_64 (digest[3]); + const u32x r3 = h32_from_64 (digest[3]); + + #include VECT_COMPARE_M + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m01750_m08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m01750_m16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m01750_s04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + u32x pw_buf1[4]; + + pw_buf1[0] = pws[gid].i[ 4]; + pw_buf1[1] = pws[gid].i[ 5]; + pw_buf1[2] = pws[gid].i[ 6]; + pw_buf1[3] = pws[gid].i[ 7]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[ 1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[ 2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[ 3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[ 4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[ 5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[ 6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[ 7]; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + + w0[0] = pw_buf0[0]; + w0[1] = pw_buf0[1]; + w0[2] = pw_buf0[2]; + w0[3] = pw_buf0[3]; + + u32x w1[4]; + + w1[0] = pw_buf1[0]; + w1[1] = pw_buf1[1]; + w1[2] = pw_buf1[2]; + w1[3] = pw_buf1[3]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 out_len = apply_rules (c_rules[il_pos].cmds, w0, w1, pw_len); + + /** + * pads + */ + + u32x w0_t[4]; + + w0_t[0] = swap_workaround (w0[0]); + w0_t[1] = swap_workaround (w0[1]); + w0_t[2] = swap_workaround (w0[2]); + w0_t[3] = swap_workaround (w0[3]); + + u32x w1_t[4]; + + w1_t[0] = swap_workaround (w1[0]); + w1_t[1] = swap_workaround (w1[1]); + w1_t[2] = swap_workaround (w1[2]); + w1_t[3] = swap_workaround (w1[3]); + + u32x w2_t[4]; + + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + + u32x w3_t[4]; + + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = 0; + + u64x ipad[8]; + u64x opad[8]; + + hmac_sha512_pad (w0_t, w1_t, w2_t, w3_t, ipad, opad); + + w0_t[0] = swap_workaround (salt_buf0[0]); + w0_t[1] = swap_workaround (salt_buf0[1]); + w0_t[2] = swap_workaround (salt_buf0[2]); + w0_t[3] = swap_workaround (salt_buf0[3]); + w1_t[0] = swap_workaround (salt_buf1[0]); + w1_t[1] = swap_workaround (salt_buf1[1]); + w1_t[2] = swap_workaround (salt_buf1[2]); + w1_t[3] = swap_workaround (salt_buf1[3]); + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = (128 + salt_len) * 8; + + u64x digest[8]; + + hmac_sha512_run (w0_t, w1_t, w2_t, w3_t, ipad, opad, digest); + + + const u32x r0 = l32_from_64 (digest[7]); + const u32x r1 = h32_from_64 (digest[7]); + const u32x r2 = l32_from_64 (digest[3]); + const u32x r3 = h32_from_64 (digest[3]); + + #include VECT_COMPARE_S + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m01750_s08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m01750_s16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/nv/m01750_a1.cu b/nv/m01750_a1.cu new file mode 100644 index 0000000000..ac4b85aa7d --- /dev/null +++ b/nv/m01750_a1.cu @@ -0,0 +1,728 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _SHA512_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW2 +#define VECT_SIZE1 +#endif + +#define DGST_R0 14 +#define DGST_R1 15 +#define DGST_R2 6 +#define DGST_R3 7 + +#include "include/kernel_functions.c" +#include "types_nv.c" +#include "common_nv.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +__device__ __constant__ comb_t c_combs[1024]; + +__device__ __constant__ u64 k_sha512[80] = +{ + SHA512C00, SHA512C01, SHA512C02, SHA512C03, + SHA512C04, SHA512C05, SHA512C06, SHA512C07, + SHA512C08, SHA512C09, SHA512C0a, SHA512C0b, + SHA512C0c, SHA512C0d, SHA512C0e, SHA512C0f, + SHA512C10, SHA512C11, SHA512C12, SHA512C13, + SHA512C14, SHA512C15, SHA512C16, SHA512C17, + SHA512C18, SHA512C19, SHA512C1a, SHA512C1b, + SHA512C1c, SHA512C1d, SHA512C1e, SHA512C1f, + SHA512C20, SHA512C21, SHA512C22, SHA512C23, + SHA512C24, SHA512C25, SHA512C26, SHA512C27, + SHA512C28, SHA512C29, SHA512C2a, SHA512C2b, + SHA512C2c, SHA512C2d, SHA512C2e, SHA512C2f, + SHA512C30, SHA512C31, SHA512C32, SHA512C33, + SHA512C34, SHA512C35, SHA512C36, SHA512C37, + SHA512C38, SHA512C39, SHA512C3a, SHA512C3b, + SHA512C3c, SHA512C3d, SHA512C3e, SHA512C3f, + SHA512C40, SHA512C41, SHA512C42, SHA512C43, + SHA512C44, SHA512C45, SHA512C46, SHA512C47, + SHA512C48, SHA512C49, SHA512C4a, SHA512C4b, + SHA512C4c, SHA512C4d, SHA512C4e, SHA512C4f, +}; + +__device__ static void sha512_transform (const u64x w0[4], const u64x w1[4], const u64x w2[4], const u64x w3[4], u64x digest[8]) +{ + u64x w0_t = w0[0]; + u64x w1_t = w0[1]; + u64x w2_t = w0[2]; + u64x w3_t = w0[3]; + u64x w4_t = w1[0]; + u64x w5_t = w1[1]; + u64x w6_t = w1[2]; + u64x w7_t = w1[3]; + u64x w8_t = w2[0]; + u64x w9_t = w2[1]; + u64x wa_t = w2[2]; + u64x wb_t = w2[3]; + u64x wc_t = w3[0]; + u64x wd_t = w3[1]; + u64x we_t = w3[2]; + u64x wf_t = w3[3]; + + u64x a = digest[0]; + u64x b = digest[1]; + u64x c = digest[2]; + u64x d = digest[3]; + u64x e = digest[4]; + u64x f = digest[5]; + u64x g = digest[6]; + u64x h = digest[7]; + + #define ROUND_EXPAND() \ + { \ + w0_t = SHA512_EXPAND (we_t, w9_t, w1_t, w0_t); \ + w1_t = SHA512_EXPAND (wf_t, wa_t, w2_t, w1_t); \ + w2_t = SHA512_EXPAND (w0_t, wb_t, w3_t, w2_t); \ + w3_t = SHA512_EXPAND (w1_t, wc_t, w4_t, w3_t); \ + w4_t = SHA512_EXPAND (w2_t, wd_t, w5_t, w4_t); \ + w5_t = SHA512_EXPAND (w3_t, we_t, w6_t, w5_t); \ + w6_t = SHA512_EXPAND (w4_t, wf_t, w7_t, w6_t); \ + w7_t = SHA512_EXPAND (w5_t, w0_t, w8_t, w7_t); \ + w8_t = SHA512_EXPAND (w6_t, w1_t, w9_t, w8_t); \ + w9_t = SHA512_EXPAND (w7_t, w2_t, wa_t, w9_t); \ + wa_t = SHA512_EXPAND (w8_t, w3_t, wb_t, wa_t); \ + wb_t = SHA512_EXPAND (w9_t, w4_t, wc_t, wb_t); \ + wc_t = SHA512_EXPAND (wa_t, w5_t, wd_t, wc_t); \ + wd_t = SHA512_EXPAND (wb_t, w6_t, we_t, wd_t); \ + we_t = SHA512_EXPAND (wc_t, w7_t, wf_t, we_t); \ + wf_t = SHA512_EXPAND (wd_t, w8_t, w0_t, wf_t); \ + } + + #define ROUND_STEP(i) \ + { \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, a, b, c, d, e, f, g, h, w0_t, k_sha512[i + 0]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, h, a, b, c, d, e, f, g, w1_t, k_sha512[i + 1]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, g, h, a, b, c, d, e, f, w2_t, k_sha512[i + 2]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, f, g, h, a, b, c, d, e, w3_t, k_sha512[i + 3]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, e, f, g, h, a, b, c, d, w4_t, k_sha512[i + 4]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, d, e, f, g, h, a, b, c, w5_t, k_sha512[i + 5]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, c, d, e, f, g, h, a, b, w6_t, k_sha512[i + 6]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, b, c, d, e, f, g, h, a, w7_t, k_sha512[i + 7]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, a, b, c, d, e, f, g, h, w8_t, k_sha512[i + 8]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, h, a, b, c, d, e, f, g, w9_t, k_sha512[i + 9]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, g, h, a, b, c, d, e, f, wa_t, k_sha512[i + 10]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, f, g, h, a, b, c, d, e, wb_t, k_sha512[i + 11]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, e, f, g, h, a, b, c, d, wc_t, k_sha512[i + 12]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, d, e, f, g, h, a, b, c, wd_t, k_sha512[i + 13]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, c, d, e, f, g, h, a, b, we_t, k_sha512[i + 14]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, b, c, d, e, f, g, h, a, wf_t, k_sha512[i + 15]); \ + } + + ROUND_STEP (0); + + for (int i = 16; i < 80; i += 16) + { + ROUND_EXPAND (); ROUND_STEP (i); + } + + digest[0] += a; + digest[1] += b; + digest[2] += c; + digest[3] += d; + digest[4] += e; + digest[5] += f; + digest[6] += g; + digest[7] += h; +} + +__device__ static void hmac_sha512_pad (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], u64x ipad[8], u64x opad[8]) +{ + u64x w0_t[4]; + u64x w1_t[4]; + u64x w2_t[4]; + u64x w3_t[4]; + + w0_t[0] = hl32_to_64 (w0[0], w0[1]) ^ 0x3636363636363636; + w0_t[1] = hl32_to_64 (w0[2], w0[3]) ^ 0x3636363636363636; + w0_t[2] = hl32_to_64 (w1[0], w1[1]) ^ 0x3636363636363636; + w0_t[3] = hl32_to_64 (w1[2], w1[3]) ^ 0x3636363636363636; + w1_t[0] = hl32_to_64 (w2[0], w2[1]) ^ 0x3636363636363636; + w1_t[1] = hl32_to_64 (w2[2], w2[3]) ^ 0x3636363636363636; + w1_t[2] = hl32_to_64 (w3[0], w3[1]) ^ 0x3636363636363636; + w1_t[3] = hl32_to_64 (w3[2], w3[3]) ^ 0x3636363636363636; + w2_t[0] = 0 ^ 0x3636363636363636; + w2_t[1] = 0 ^ 0x3636363636363636; + w2_t[2] = 0 ^ 0x3636363636363636; + w2_t[3] = 0 ^ 0x3636363636363636; + w3_t[0] = 0 ^ 0x3636363636363636; + w3_t[1] = 0 ^ 0x3636363636363636; + w3_t[2] = 0 ^ 0x3636363636363636; + w3_t[3] = 0 ^ 0x3636363636363636; + + ipad[0] = SHA512M_A; + ipad[1] = SHA512M_B; + ipad[2] = SHA512M_C; + ipad[3] = SHA512M_D; + ipad[4] = SHA512M_E; + ipad[5] = SHA512M_F; + ipad[6] = SHA512M_G; + ipad[7] = SHA512M_H; + + sha512_transform (w0_t, w1_t, w2_t, w3_t, ipad); + + w0_t[0] = hl32_to_64 (w0[0], w0[1]) ^ 0x5c5c5c5c5c5c5c5c; + w0_t[1] = hl32_to_64 (w0[2], w0[3]) ^ 0x5c5c5c5c5c5c5c5c; + w0_t[2] = hl32_to_64 (w1[0], w1[1]) ^ 0x5c5c5c5c5c5c5c5c; + w0_t[3] = hl32_to_64 (w1[2], w1[3]) ^ 0x5c5c5c5c5c5c5c5c; + w1_t[0] = hl32_to_64 (w2[0], w2[1]) ^ 0x5c5c5c5c5c5c5c5c; + w1_t[1] = hl32_to_64 (w2[2], w2[3]) ^ 0x5c5c5c5c5c5c5c5c; + w1_t[2] = hl32_to_64 (w3[0], w3[1]) ^ 0x5c5c5c5c5c5c5c5c; + w1_t[3] = hl32_to_64 (w3[2], w3[3]) ^ 0x5c5c5c5c5c5c5c5c; + w2_t[0] = 0 ^ 0x5c5c5c5c5c5c5c5c; + w2_t[1] = 0 ^ 0x5c5c5c5c5c5c5c5c; + w2_t[2] = 0 ^ 0x5c5c5c5c5c5c5c5c; + w2_t[3] = 0 ^ 0x5c5c5c5c5c5c5c5c; + w3_t[0] = 0 ^ 0x5c5c5c5c5c5c5c5c; + w3_t[1] = 0 ^ 0x5c5c5c5c5c5c5c5c; + w3_t[2] = 0 ^ 0x5c5c5c5c5c5c5c5c; + w3_t[3] = 0 ^ 0x5c5c5c5c5c5c5c5c; + + opad[0] = SHA512M_A; + opad[1] = SHA512M_B; + opad[2] = SHA512M_C; + opad[3] = SHA512M_D; + opad[4] = SHA512M_E; + opad[5] = SHA512M_F; + opad[6] = SHA512M_G; + opad[7] = SHA512M_H; + + sha512_transform (w0_t, w1_t, w2_t, w3_t, opad); +} + +__device__ static void hmac_sha512_run (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], u64x ipad[8], u64x opad[8], u64x digest[8]) +{ + u64x w0_t[4]; + u64x w1_t[4]; + u64x w2_t[4]; + u64x w3_t[4]; + + w0_t[0] = hl32_to_64 (w0[0], w0[1]); + w0_t[1] = hl32_to_64 (w0[2], w0[3]); + w0_t[2] = hl32_to_64 (w1[0], w1[1]); + w0_t[3] = hl32_to_64 (w1[2], w1[3]); + w1_t[0] = hl32_to_64 (w2[0], w2[1]); + w1_t[1] = hl32_to_64 (w2[2], w2[3]); + w1_t[2] = hl32_to_64 (w3[0], w3[1]); + w1_t[3] = 0; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = hl32_to_64 (w3[2], w3[3]); + + digest[0] = ipad[0]; + digest[1] = ipad[1]; + digest[2] = ipad[2]; + digest[3] = ipad[3]; + digest[4] = ipad[4]; + digest[5] = ipad[5]; + digest[6] = ipad[6]; + digest[7] = ipad[7]; + + sha512_transform (w0_t, w1_t, w2_t, w3_t, digest); + + w0_t[0] = digest[0]; + w0_t[1] = digest[1]; + w0_t[2] = digest[2]; + w0_t[3] = digest[3]; + w1_t[0] = digest[4]; + w1_t[1] = digest[5]; + w1_t[2] = digest[6]; + w1_t[3] = digest[7]; + w2_t[0] = 0x8000000000000000; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = (128 + 64) * 8; + + digest[0] = opad[0]; + digest[1] = opad[1]; + digest[2] = opad[2]; + digest[3] = opad[3]; + digest[4] = opad[4]; + digest[5] = opad[5]; + digest[6] = opad[6]; + digest[7] = opad[7]; + + sha512_transform (w0_t, w1_t, w2_t, w3_t, digest); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m01750_m04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, c_combs[0].pw_len); + } + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[ 1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[ 2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[ 3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[ 4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[ 5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[ 6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[ 7]; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = c_combs[il_pos].pw_len; + + const u32 pw_len = pw_l_len + pw_r_len; + + u32 wordr0[4]; + + wordr0[0] = c_combs[il_pos].i[0]; + wordr0[1] = c_combs[il_pos].i[1]; + wordr0[2] = c_combs[il_pos].i[2]; + wordr0[3] = c_combs[il_pos].i[3]; + + u32 wordr1[4]; + + wordr1[0] = c_combs[il_pos].i[4]; + wordr1[1] = c_combs[il_pos].i[5]; + wordr1[2] = c_combs[il_pos].i[6]; + wordr1[3] = c_combs[il_pos].i[7]; + + u32 wordr2[4]; + + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + + u32 wordr3[4]; + + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + u32x w0[4]; + + w0[0] = wordl0[0] | wordr0[0]; + w0[1] = wordl0[1] | wordr0[1]; + w0[2] = wordl0[2] | wordr0[2]; + w0[3] = wordl0[3] | wordr0[3]; + + u32x w1[4]; + + w1[0] = wordl1[0] | wordr1[0]; + w1[1] = wordl1[1] | wordr1[1]; + w1[2] = wordl1[2] | wordr1[2]; + w1[3] = wordl1[3] | wordr1[3]; + + u32x w2[4]; + + w2[0] = wordl2[0] | wordr2[0]; + w2[1] = wordl2[1] | wordr2[1]; + w2[2] = wordl2[2] | wordr2[2]; + w2[3] = wordl2[3] | wordr2[3]; + + u32x w3[4]; + + w3[0] = wordl3[0] | wordr3[0]; + w3[1] = wordl3[1] | wordr3[1]; + w3[2] = wordl3[2] | wordr3[2]; + w3[3] = wordl3[3] | wordr3[3]; + + /** + * pads + */ + + u32x w0_t[4]; + + w0_t[0] = swap_workaround (w0[0]); + w0_t[1] = swap_workaround (w0[1]); + w0_t[2] = swap_workaround (w0[2]); + w0_t[3] = swap_workaround (w0[3]); + + u32x w1_t[4]; + + w1_t[0] = swap_workaround (w1[0]); + w1_t[1] = swap_workaround (w1[1]); + w1_t[2] = swap_workaround (w1[2]); + w1_t[3] = swap_workaround (w1[3]); + + u32x w2_t[4]; + + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + + u32x w3_t[4]; + + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = 0; + + u64x ipad[8]; + u64x opad[8]; + + hmac_sha512_pad (w0_t, w1_t, w2_t, w3_t, ipad, opad); + + w0_t[0] = swap_workaround (salt_buf0[0]); + w0_t[1] = swap_workaround (salt_buf0[1]); + w0_t[2] = swap_workaround (salt_buf0[2]); + w0_t[3] = swap_workaround (salt_buf0[3]); + w1_t[0] = swap_workaround (salt_buf1[0]); + w1_t[1] = swap_workaround (salt_buf1[1]); + w1_t[2] = swap_workaround (salt_buf1[2]); + w1_t[3] = swap_workaround (salt_buf1[3]); + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = (128 + salt_len) * 8; + + u64x digest[8]; + + hmac_sha512_run (w0_t, w1_t, w2_t, w3_t, ipad, opad, digest); + + + const u32x r0 = l32_from_64 (digest[7]); + const u32x r1 = h32_from_64 (digest[7]); + const u32x r2 = l32_from_64 (digest[3]); + const u32x r3 = h32_from_64 (digest[3]); + + #include VECT_COMPARE_M + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m01750_m08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m01750_m16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m01750_s04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, c_combs[0].pw_len); + } + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[ 1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[ 2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[ 3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[ 4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[ 5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[ 6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[ 7]; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = c_combs[il_pos].pw_len; + + const u32 pw_len = pw_l_len + pw_r_len; + + u32 wordr0[4]; + + wordr0[0] = c_combs[il_pos].i[0]; + wordr0[1] = c_combs[il_pos].i[1]; + wordr0[2] = c_combs[il_pos].i[2]; + wordr0[3] = c_combs[il_pos].i[3]; + + u32 wordr1[4]; + + wordr1[0] = c_combs[il_pos].i[4]; + wordr1[1] = c_combs[il_pos].i[5]; + wordr1[2] = c_combs[il_pos].i[6]; + wordr1[3] = c_combs[il_pos].i[7]; + + u32 wordr2[4]; + + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + + u32 wordr3[4]; + + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + u32x w0[4]; + + w0[0] = wordl0[0] | wordr0[0]; + w0[1] = wordl0[1] | wordr0[1]; + w0[2] = wordl0[2] | wordr0[2]; + w0[3] = wordl0[3] | wordr0[3]; + + u32x w1[4]; + + w1[0] = wordl1[0] | wordr1[0]; + w1[1] = wordl1[1] | wordr1[1]; + w1[2] = wordl1[2] | wordr1[2]; + w1[3] = wordl1[3] | wordr1[3]; + + u32x w2[4]; + + w2[0] = wordl2[0] | wordr2[0]; + w2[1] = wordl2[1] | wordr2[1]; + w2[2] = wordl2[2] | wordr2[2]; + w2[3] = wordl2[3] | wordr2[3]; + + u32x w3[4]; + + w3[0] = wordl3[0] | wordr3[0]; + w3[1] = wordl3[1] | wordr3[1]; + w3[2] = wordl3[2] | wordr3[2]; + w3[3] = wordl3[3] | wordr3[3]; + + /** + * pads + */ + + u32x w0_t[4]; + + w0_t[0] = swap_workaround (w0[0]); + w0_t[1] = swap_workaround (w0[1]); + w0_t[2] = swap_workaround (w0[2]); + w0_t[3] = swap_workaround (w0[3]); + + u32x w1_t[4]; + + w1_t[0] = swap_workaround (w1[0]); + w1_t[1] = swap_workaround (w1[1]); + w1_t[2] = swap_workaround (w1[2]); + w1_t[3] = swap_workaround (w1[3]); + + u32x w2_t[4]; + + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + + u32x w3_t[4]; + + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = 0; + + u64x ipad[8]; + u64x opad[8]; + + hmac_sha512_pad (w0_t, w1_t, w2_t, w3_t, ipad, opad); + + w0_t[0] = swap_workaround (salt_buf0[0]); + w0_t[1] = swap_workaround (salt_buf0[1]); + w0_t[2] = swap_workaround (salt_buf0[2]); + w0_t[3] = swap_workaround (salt_buf0[3]); + w1_t[0] = swap_workaround (salt_buf1[0]); + w1_t[1] = swap_workaround (salt_buf1[1]); + w1_t[2] = swap_workaround (salt_buf1[2]); + w1_t[3] = swap_workaround (salt_buf1[3]); + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = (128 + salt_len) * 8; + + u64x digest[8]; + + hmac_sha512_run (w0_t, w1_t, w2_t, w3_t, ipad, opad, digest); + + + const u32x r0 = l32_from_64 (digest[7]); + const u32x r1 = h32_from_64 (digest[7]); + const u32x r2 = l32_from_64 (digest[3]); + const u32x r3 = h32_from_64 (digest[3]); + + #include VECT_COMPARE_S + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m01750_s08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m01750_s16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/nv/m01750_a3.cu b/nv/m01750_a3.cu new file mode 100644 index 0000000000..8209bef7ab --- /dev/null +++ b/nv/m01750_a3.cu @@ -0,0 +1,792 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _SHA512_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW2 +#define VECT_SIZE1 +#endif + +#define DGST_R0 14 +#define DGST_R1 15 +#define DGST_R2 6 +#define DGST_R3 7 + +#include "include/kernel_functions.c" +#include "types_nv.c" +#include "common_nv.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +__device__ __constant__ bf_t c_bfs[1024]; + +__device__ __constant__ u64 k_sha512[80] = +{ + SHA512C00, SHA512C01, SHA512C02, SHA512C03, + SHA512C04, SHA512C05, SHA512C06, SHA512C07, + SHA512C08, SHA512C09, SHA512C0a, SHA512C0b, + SHA512C0c, SHA512C0d, SHA512C0e, SHA512C0f, + SHA512C10, SHA512C11, SHA512C12, SHA512C13, + SHA512C14, SHA512C15, SHA512C16, SHA512C17, + SHA512C18, SHA512C19, SHA512C1a, SHA512C1b, + SHA512C1c, SHA512C1d, SHA512C1e, SHA512C1f, + SHA512C20, SHA512C21, SHA512C22, SHA512C23, + SHA512C24, SHA512C25, SHA512C26, SHA512C27, + SHA512C28, SHA512C29, SHA512C2a, SHA512C2b, + SHA512C2c, SHA512C2d, SHA512C2e, SHA512C2f, + SHA512C30, SHA512C31, SHA512C32, SHA512C33, + SHA512C34, SHA512C35, SHA512C36, SHA512C37, + SHA512C38, SHA512C39, SHA512C3a, SHA512C3b, + SHA512C3c, SHA512C3d, SHA512C3e, SHA512C3f, + SHA512C40, SHA512C41, SHA512C42, SHA512C43, + SHA512C44, SHA512C45, SHA512C46, SHA512C47, + SHA512C48, SHA512C49, SHA512C4a, SHA512C4b, + SHA512C4c, SHA512C4d, SHA512C4e, SHA512C4f, +}; + +__device__ static void sha512_transform (const u64x w0[4], const u64x w1[4], const u64x w2[4], const u64x w3[4], u64x digest[8]) +{ + u64x w0_t = w0[0]; + u64x w1_t = w0[1]; + u64x w2_t = w0[2]; + u64x w3_t = w0[3]; + u64x w4_t = w1[0]; + u64x w5_t = w1[1]; + u64x w6_t = w1[2]; + u64x w7_t = w1[3]; + u64x w8_t = w2[0]; + u64x w9_t = w2[1]; + u64x wa_t = w2[2]; + u64x wb_t = w2[3]; + u64x wc_t = w3[0]; + u64x wd_t = w3[1]; + u64x we_t = w3[2]; + u64x wf_t = w3[3]; + + u64x a = digest[0]; + u64x b = digest[1]; + u64x c = digest[2]; + u64x d = digest[3]; + u64x e = digest[4]; + u64x f = digest[5]; + u64x g = digest[6]; + u64x h = digest[7]; + + #define ROUND_EXPAND() \ + { \ + w0_t = SHA512_EXPAND (we_t, w9_t, w1_t, w0_t); \ + w1_t = SHA512_EXPAND (wf_t, wa_t, w2_t, w1_t); \ + w2_t = SHA512_EXPAND (w0_t, wb_t, w3_t, w2_t); \ + w3_t = SHA512_EXPAND (w1_t, wc_t, w4_t, w3_t); \ + w4_t = SHA512_EXPAND (w2_t, wd_t, w5_t, w4_t); \ + w5_t = SHA512_EXPAND (w3_t, we_t, w6_t, w5_t); \ + w6_t = SHA512_EXPAND (w4_t, wf_t, w7_t, w6_t); \ + w7_t = SHA512_EXPAND (w5_t, w0_t, w8_t, w7_t); \ + w8_t = SHA512_EXPAND (w6_t, w1_t, w9_t, w8_t); \ + w9_t = SHA512_EXPAND (w7_t, w2_t, wa_t, w9_t); \ + wa_t = SHA512_EXPAND (w8_t, w3_t, wb_t, wa_t); \ + wb_t = SHA512_EXPAND (w9_t, w4_t, wc_t, wb_t); \ + wc_t = SHA512_EXPAND (wa_t, w5_t, wd_t, wc_t); \ + wd_t = SHA512_EXPAND (wb_t, w6_t, we_t, wd_t); \ + we_t = SHA512_EXPAND (wc_t, w7_t, wf_t, we_t); \ + wf_t = SHA512_EXPAND (wd_t, w8_t, w0_t, wf_t); \ + } + + #define ROUND_STEP(i) \ + { \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, a, b, c, d, e, f, g, h, w0_t, k_sha512[i + 0]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, h, a, b, c, d, e, f, g, w1_t, k_sha512[i + 1]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, g, h, a, b, c, d, e, f, w2_t, k_sha512[i + 2]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, f, g, h, a, b, c, d, e, w3_t, k_sha512[i + 3]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, e, f, g, h, a, b, c, d, w4_t, k_sha512[i + 4]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, d, e, f, g, h, a, b, c, w5_t, k_sha512[i + 5]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, c, d, e, f, g, h, a, b, w6_t, k_sha512[i + 6]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, b, c, d, e, f, g, h, a, w7_t, k_sha512[i + 7]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, a, b, c, d, e, f, g, h, w8_t, k_sha512[i + 8]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, h, a, b, c, d, e, f, g, w9_t, k_sha512[i + 9]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, g, h, a, b, c, d, e, f, wa_t, k_sha512[i + 10]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, f, g, h, a, b, c, d, e, wb_t, k_sha512[i + 11]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, e, f, g, h, a, b, c, d, wc_t, k_sha512[i + 12]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, d, e, f, g, h, a, b, c, wd_t, k_sha512[i + 13]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, c, d, e, f, g, h, a, b, we_t, k_sha512[i + 14]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, b, c, d, e, f, g, h, a, wf_t, k_sha512[i + 15]); \ + } + + ROUND_STEP (0); + + for (int i = 16; i < 80; i += 16) + { + ROUND_EXPAND (); ROUND_STEP (i); + } + + digest[0] += a; + digest[1] += b; + digest[2] += c; + digest[3] += d; + digest[4] += e; + digest[5] += f; + digest[6] += g; + digest[7] += h; +} + +__device__ static void hmac_sha512_pad (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], u64x ipad[8], u64x opad[8]) +{ + u64x w0_t[4]; + u64x w1_t[4]; + u64x w2_t[4]; + u64x w3_t[4]; + + w0_t[0] = hl32_to_64 (w0[0], w0[1]) ^ 0x3636363636363636; + w0_t[1] = hl32_to_64 (w0[2], w0[3]) ^ 0x3636363636363636; + w0_t[2] = hl32_to_64 (w1[0], w1[1]) ^ 0x3636363636363636; + w0_t[3] = hl32_to_64 (w1[2], w1[3]) ^ 0x3636363636363636; + w1_t[0] = hl32_to_64 (w2[0], w2[1]) ^ 0x3636363636363636; + w1_t[1] = hl32_to_64 (w2[2], w2[3]) ^ 0x3636363636363636; + w1_t[2] = hl32_to_64 (w3[0], w3[1]) ^ 0x3636363636363636; + w1_t[3] = hl32_to_64 (w3[2], w3[3]) ^ 0x3636363636363636; + w2_t[0] = 0x3636363636363636; + w2_t[1] = 0x3636363636363636; + w2_t[2] = 0x3636363636363636; + w2_t[3] = 0x3636363636363636; + w3_t[0] = 0x3636363636363636; + w3_t[1] = 0x3636363636363636; + w3_t[2] = 0x3636363636363636; + w3_t[3] = 0x3636363636363636; + + ipad[0] = SHA512M_A; + ipad[1] = SHA512M_B; + ipad[2] = SHA512M_C; + ipad[3] = SHA512M_D; + ipad[4] = SHA512M_E; + ipad[5] = SHA512M_F; + ipad[6] = SHA512M_G; + ipad[7] = SHA512M_H; + + sha512_transform (w0_t, w1_t, w2_t, w3_t, ipad); + + w0_t[0] = hl32_to_64 (w0[0], w0[1]) ^ 0x5c5c5c5c5c5c5c5c; + w0_t[1] = hl32_to_64 (w0[2], w0[3]) ^ 0x5c5c5c5c5c5c5c5c; + w0_t[2] = hl32_to_64 (w1[0], w1[1]) ^ 0x5c5c5c5c5c5c5c5c; + w0_t[3] = hl32_to_64 (w1[2], w1[3]) ^ 0x5c5c5c5c5c5c5c5c; + w1_t[0] = hl32_to_64 (w2[0], w2[1]) ^ 0x5c5c5c5c5c5c5c5c; + w1_t[1] = hl32_to_64 (w2[2], w2[3]) ^ 0x5c5c5c5c5c5c5c5c; + w1_t[2] = hl32_to_64 (w3[0], w3[1]) ^ 0x5c5c5c5c5c5c5c5c; + w1_t[3] = hl32_to_64 (w3[2], w3[3]) ^ 0x5c5c5c5c5c5c5c5c; + w2_t[0] = 0x5c5c5c5c5c5c5c5c; + w2_t[1] = 0x5c5c5c5c5c5c5c5c; + w2_t[2] = 0x5c5c5c5c5c5c5c5c; + w2_t[3] = 0x5c5c5c5c5c5c5c5c; + w3_t[0] = 0x5c5c5c5c5c5c5c5c; + w3_t[1] = 0x5c5c5c5c5c5c5c5c; + w3_t[2] = 0x5c5c5c5c5c5c5c5c; + w3_t[3] = 0x5c5c5c5c5c5c5c5c; + + opad[0] = SHA512M_A; + opad[1] = SHA512M_B; + opad[2] = SHA512M_C; + opad[3] = SHA512M_D; + opad[4] = SHA512M_E; + opad[5] = SHA512M_F; + opad[6] = SHA512M_G; + opad[7] = SHA512M_H; + + sha512_transform (w0_t, w1_t, w2_t, w3_t, opad); +} + +__device__ static void hmac_sha512_run (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], u64x ipad[8], u64x opad[8], u64x digest[8]) +{ + u64x w0_t[4]; + u64x w1_t[4]; + u64x w2_t[4]; + u64x w3_t[4]; + + w0_t[0] = hl32_to_64 (w0[0], w0[1]); + w0_t[1] = hl32_to_64 (w0[2], w0[3]); + w0_t[2] = hl32_to_64 (w1[0], w1[1]); + w0_t[3] = hl32_to_64 (w1[2], w1[3]); + w1_t[0] = hl32_to_64 (w2[0], w2[1]); + w1_t[1] = hl32_to_64 (w2[2], w2[3]); + w1_t[2] = hl32_to_64 (w3[0], w3[1]); + w1_t[3] = 0; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = hl32_to_64 (w3[2], w3[3]); + + digest[0] = ipad[0]; + digest[1] = ipad[1]; + digest[2] = ipad[2]; + digest[3] = ipad[3]; + digest[4] = ipad[4]; + digest[5] = ipad[5]; + digest[6] = ipad[6]; + digest[7] = ipad[7]; + + sha512_transform (w0_t, w1_t, w2_t, w3_t, digest); + + w0_t[0] = digest[0]; + w0_t[1] = digest[1]; + w0_t[2] = digest[2]; + w0_t[3] = digest[3]; + w1_t[0] = digest[4]; + w1_t[1] = digest[5]; + w1_t[2] = digest[6]; + w1_t[3] = digest[7]; + w2_t[0] = 0x8000000000000000; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = (128 + 64) * 8; + + digest[0] = opad[0]; + digest[1] = opad[1]; + digest[2] = opad[2]; + digest[3] = opad[3]; + digest[4] = opad[4]; + digest[5] = opad[5]; + digest[6] = opad[6]; + digest[7] = opad[7]; + + sha512_transform (w0_t, w1_t, w2_t, w3_t, digest); +} + +__device__ static void m01750m (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], const u32 pw_len, const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset) +{ + /** + * modifier + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + const u32 lid = threadIdx.x; + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[ 1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[ 2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[ 3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[ 4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[ 5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[ 6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[ 7]; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + /** + * loop + */ + + u32x w0l = w0[0]; + + for (u32 il_pos = 0; il_pos < bfs_cnt; il_pos++) + { + const u32 w0r = c_bfs[il_pos].i; + + w0[0] = w0l | w0r; + + /** + * pads + */ + + u32x w0_t[4]; + + w0_t[0] = w0[0]; + w0_t[1] = w0[1]; + w0_t[2] = w0[2]; + w0_t[3] = w0[3]; + + u32x w1_t[4]; + + w1_t[0] = w1[0]; + w1_t[1] = w1[1]; + w1_t[2] = w1[2]; + w1_t[3] = w1[3]; + + u32x w2_t[4]; + + w2_t[0] = w2[0]; + w2_t[1] = w2[1]; + w2_t[2] = w2[2]; + w2_t[3] = w2[3]; + + u32x w3_t[4]; + + w3_t[0] = w3[0]; + w3_t[1] = w3[1]; + w3_t[2] = 0; + w3_t[3] = 0; + + u64x ipad[8]; + u64x opad[8]; + + hmac_sha512_pad (w0_t, w1_t, w2_t, w3_t, ipad, opad); + + w0_t[0] = swap_workaround (salt_buf0[0]); + w0_t[1] = swap_workaround (salt_buf0[1]); + w0_t[2] = swap_workaround (salt_buf0[2]); + w0_t[3] = swap_workaround (salt_buf0[3]); + w1_t[0] = swap_workaround (salt_buf1[0]); + w1_t[1] = swap_workaround (salt_buf1[1]); + w1_t[2] = swap_workaround (salt_buf1[2]); + w1_t[3] = swap_workaround (salt_buf1[3]); + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = (128 + salt_len) * 8; + + u64x digest[8]; + + hmac_sha512_run (w0_t, w1_t, w2_t, w3_t, ipad, opad, digest); + + + const u32x r0 = l32_from_64 (digest[7]); + const u32x r1 = h32_from_64 (digest[7]); + const u32x r2 = l32_from_64 (digest[3]); + const u32x r3 = h32_from_64 (digest[3]); + + #include VECT_COMPARE_M + } +} + +__device__ static void m01750s (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], const u32 pw_len, const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset) +{ + /** + * modifier + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + const u32 lid = threadIdx.x; + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[ 1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[ 2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[ 3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[ 4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[ 5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[ 6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[ 7]; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * loop + */ + + u32x w0l = w0[0]; + + for (u32 il_pos = 0; il_pos < bfs_cnt; il_pos++) + { + const u32 w0r = c_bfs[il_pos].i; + + w0[0] = w0l | w0r; + + /** + * pads + */ + + u32x w0_t[4]; + + w0_t[0] = w0[0]; + w0_t[1] = w0[1]; + w0_t[2] = w0[2]; + w0_t[3] = w0[3]; + + u32x w1_t[4]; + + w1_t[0] = w1[0]; + w1_t[1] = w1[1]; + w1_t[2] = w1[2]; + w1_t[3] = w1[3]; + + u32x w2_t[4]; + + w2_t[0] = w2[0]; + w2_t[1] = w2[1]; + w2_t[2] = w2[2]; + w2_t[3] = w2[3]; + + u32x w3_t[4]; + + w3_t[0] = w3[0]; + w3_t[1] = w3[1]; + w3_t[2] = 0; + w3_t[3] = 0; + + u64x ipad[8]; + u64x opad[8]; + + hmac_sha512_pad (w0_t, w1_t, w2_t, w3_t, ipad, opad); + + w0_t[0] = swap_workaround (salt_buf0[0]); + w0_t[1] = swap_workaround (salt_buf0[1]); + w0_t[2] = swap_workaround (salt_buf0[2]); + w0_t[3] = swap_workaround (salt_buf0[3]); + w1_t[0] = swap_workaround (salt_buf1[0]); + w1_t[1] = swap_workaround (salt_buf1[1]); + w1_t[2] = swap_workaround (salt_buf1[2]); + w1_t[3] = swap_workaround (salt_buf1[3]); + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = (128 + salt_len) * 8; + + u64x digest[8]; + + hmac_sha512_run (w0_t, w1_t, w2_t, w3_t, ipad, opad, digest); + + + const u32x r0 = l32_from_64 (digest[7]); + const u32x r1 = h32_from_64 (digest[7]); + const u32x r2 = l32_from_64 (digest[3]); + const u32x r3 = h32_from_64 (digest[3]); + + #include VECT_COMPARE_S + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m01750_m04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m01750m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m01750_m08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m01750m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m01750_m16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = pws[gid].i[ 8]; + w2[1] = pws[gid].i[ 9]; + w2[2] = pws[gid].i[10]; + w2[3] = pws[gid].i[11]; + + u32x w3[4]; + + w3[0] = pws[gid].i[12]; + w3[1] = pws[gid].i[13]; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m01750m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m01750_s04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m01750s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m01750_s08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m01750s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m01750_s16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = pws[gid].i[ 8]; + w2[1] = pws[gid].i[ 9]; + w2[2] = pws[gid].i[10]; + w2[3] = pws[gid].i[11]; + + u32x w3[4]; + + w3[0] = pws[gid].i[12]; + w3[1] = pws[gid].i[13]; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m01750s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} diff --git a/nv/m01760_a0.cu b/nv/m01760_a0.cu new file mode 100644 index 0000000000..f67085dd9f --- /dev/null +++ b/nv/m01760_a0.cu @@ -0,0 +1,622 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _SHA512_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW2 +#define VECT_SIZE1 +#endif + +#define DGST_R0 14 +#define DGST_R1 15 +#define DGST_R2 6 +#define DGST_R3 7 + +#include "include/kernel_functions.c" +#include "types_nv.c" +#include "common_nv.c" +#include "include/rp_gpu.h" +#include "rp_nv.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +__device__ __constant__ gpu_rule_t c_rules[1024]; + +__device__ __constant__ u64 k_sha512[80] = +{ + SHA512C00, SHA512C01, SHA512C02, SHA512C03, + SHA512C04, SHA512C05, SHA512C06, SHA512C07, + SHA512C08, SHA512C09, SHA512C0a, SHA512C0b, + SHA512C0c, SHA512C0d, SHA512C0e, SHA512C0f, + SHA512C10, SHA512C11, SHA512C12, SHA512C13, + SHA512C14, SHA512C15, SHA512C16, SHA512C17, + SHA512C18, SHA512C19, SHA512C1a, SHA512C1b, + SHA512C1c, SHA512C1d, SHA512C1e, SHA512C1f, + SHA512C20, SHA512C21, SHA512C22, SHA512C23, + SHA512C24, SHA512C25, SHA512C26, SHA512C27, + SHA512C28, SHA512C29, SHA512C2a, SHA512C2b, + SHA512C2c, SHA512C2d, SHA512C2e, SHA512C2f, + SHA512C30, SHA512C31, SHA512C32, SHA512C33, + SHA512C34, SHA512C35, SHA512C36, SHA512C37, + SHA512C38, SHA512C39, SHA512C3a, SHA512C3b, + SHA512C3c, SHA512C3d, SHA512C3e, SHA512C3f, + SHA512C40, SHA512C41, SHA512C42, SHA512C43, + SHA512C44, SHA512C45, SHA512C46, SHA512C47, + SHA512C48, SHA512C49, SHA512C4a, SHA512C4b, + SHA512C4c, SHA512C4d, SHA512C4e, SHA512C4f, +}; + +__device__ static void sha512_transform (const u64x w0[4], const u64x w1[4], const u64x w2[4], const u64x w3[4], u64x digest[8]) +{ + u64x w0_t = w0[0]; + u64x w1_t = w0[1]; + u64x w2_t = w0[2]; + u64x w3_t = w0[3]; + u64x w4_t = w1[0]; + u64x w5_t = w1[1]; + u64x w6_t = w1[2]; + u64x w7_t = w1[3]; + u64x w8_t = w2[0]; + u64x w9_t = w2[1]; + u64x wa_t = w2[2]; + u64x wb_t = w2[3]; + u64x wc_t = w3[0]; + u64x wd_t = w3[1]; + u64x we_t = w3[2]; + u64x wf_t = w3[3]; + + u64x a = digest[0]; + u64x b = digest[1]; + u64x c = digest[2]; + u64x d = digest[3]; + u64x e = digest[4]; + u64x f = digest[5]; + u64x g = digest[6]; + u64x h = digest[7]; + + #define ROUND_EXPAND() \ + { \ + w0_t = SHA512_EXPAND (we_t, w9_t, w1_t, w0_t); \ + w1_t = SHA512_EXPAND (wf_t, wa_t, w2_t, w1_t); \ + w2_t = SHA512_EXPAND (w0_t, wb_t, w3_t, w2_t); \ + w3_t = SHA512_EXPAND (w1_t, wc_t, w4_t, w3_t); \ + w4_t = SHA512_EXPAND (w2_t, wd_t, w5_t, w4_t); \ + w5_t = SHA512_EXPAND (w3_t, we_t, w6_t, w5_t); \ + w6_t = SHA512_EXPAND (w4_t, wf_t, w7_t, w6_t); \ + w7_t = SHA512_EXPAND (w5_t, w0_t, w8_t, w7_t); \ + w8_t = SHA512_EXPAND (w6_t, w1_t, w9_t, w8_t); \ + w9_t = SHA512_EXPAND (w7_t, w2_t, wa_t, w9_t); \ + wa_t = SHA512_EXPAND (w8_t, w3_t, wb_t, wa_t); \ + wb_t = SHA512_EXPAND (w9_t, w4_t, wc_t, wb_t); \ + wc_t = SHA512_EXPAND (wa_t, w5_t, wd_t, wc_t); \ + wd_t = SHA512_EXPAND (wb_t, w6_t, we_t, wd_t); \ + we_t = SHA512_EXPAND (wc_t, w7_t, wf_t, we_t); \ + wf_t = SHA512_EXPAND (wd_t, w8_t, w0_t, wf_t); \ + } + + #define ROUND_STEP(i) \ + { \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, a, b, c, d, e, f, g, h, w0_t, k_sha512[i + 0]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, h, a, b, c, d, e, f, g, w1_t, k_sha512[i + 1]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, g, h, a, b, c, d, e, f, w2_t, k_sha512[i + 2]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, f, g, h, a, b, c, d, e, w3_t, k_sha512[i + 3]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, e, f, g, h, a, b, c, d, w4_t, k_sha512[i + 4]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, d, e, f, g, h, a, b, c, w5_t, k_sha512[i + 5]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, c, d, e, f, g, h, a, b, w6_t, k_sha512[i + 6]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, b, c, d, e, f, g, h, a, w7_t, k_sha512[i + 7]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, a, b, c, d, e, f, g, h, w8_t, k_sha512[i + 8]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, h, a, b, c, d, e, f, g, w9_t, k_sha512[i + 9]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, g, h, a, b, c, d, e, f, wa_t, k_sha512[i + 10]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, f, g, h, a, b, c, d, e, wb_t, k_sha512[i + 11]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, e, f, g, h, a, b, c, d, wc_t, k_sha512[i + 12]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, d, e, f, g, h, a, b, c, wd_t, k_sha512[i + 13]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, c, d, e, f, g, h, a, b, we_t, k_sha512[i + 14]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, b, c, d, e, f, g, h, a, wf_t, k_sha512[i + 15]); \ + } + + ROUND_STEP (0); + + for (int i = 16; i < 80; i += 16) + { + ROUND_EXPAND (); ROUND_STEP (i); + } + + digest[0] += a; + digest[1] += b; + digest[2] += c; + digest[3] += d; + digest[4] += e; + digest[5] += f; + digest[6] += g; + digest[7] += h; +} + +__device__ static void hmac_sha512_pad (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], u64x ipad[8], u64x opad[8]) +{ + u64x w0_t[4]; + u64x w1_t[4]; + u64x w2_t[4]; + u64x w3_t[4]; + + w0_t[0] = hl32_to_64 (w0[0], w0[1]) ^ 0x3636363636363636; + w0_t[1] = hl32_to_64 (w0[2], w0[3]) ^ 0x3636363636363636; + w0_t[2] = hl32_to_64 (w1[0], w1[1]) ^ 0x3636363636363636; + w0_t[3] = hl32_to_64 (w1[2], w1[3]) ^ 0x3636363636363636; + w1_t[0] = hl32_to_64 (w2[0], w2[1]) ^ 0x3636363636363636; + w1_t[1] = hl32_to_64 (w2[2], w2[3]) ^ 0x3636363636363636; + w1_t[2] = hl32_to_64 (w3[0], w3[1]) ^ 0x3636363636363636; + w1_t[3] = hl32_to_64 (w3[2], w3[3]) ^ 0x3636363636363636; + w2_t[0] = 0 ^ 0x3636363636363636; + w2_t[1] = 0 ^ 0x3636363636363636; + w2_t[2] = 0 ^ 0x3636363636363636; + w2_t[3] = 0 ^ 0x3636363636363636; + w3_t[0] = 0 ^ 0x3636363636363636; + w3_t[1] = 0 ^ 0x3636363636363636; + w3_t[2] = 0 ^ 0x3636363636363636; + w3_t[3] = 0 ^ 0x3636363636363636; + + ipad[0] = SHA512M_A; + ipad[1] = SHA512M_B; + ipad[2] = SHA512M_C; + ipad[3] = SHA512M_D; + ipad[4] = SHA512M_E; + ipad[5] = SHA512M_F; + ipad[6] = SHA512M_G; + ipad[7] = SHA512M_H; + + sha512_transform (w0_t, w1_t, w2_t, w3_t, ipad); + + w0_t[0] = hl32_to_64 (w0[0], w0[1]) ^ 0x5c5c5c5c5c5c5c5c; + w0_t[1] = hl32_to_64 (w0[2], w0[3]) ^ 0x5c5c5c5c5c5c5c5c; + w0_t[2] = hl32_to_64 (w1[0], w1[1]) ^ 0x5c5c5c5c5c5c5c5c; + w0_t[3] = hl32_to_64 (w1[2], w1[3]) ^ 0x5c5c5c5c5c5c5c5c; + w1_t[0] = hl32_to_64 (w2[0], w2[1]) ^ 0x5c5c5c5c5c5c5c5c; + w1_t[1] = hl32_to_64 (w2[2], w2[3]) ^ 0x5c5c5c5c5c5c5c5c; + w1_t[2] = hl32_to_64 (w3[0], w3[1]) ^ 0x5c5c5c5c5c5c5c5c; + w1_t[3] = hl32_to_64 (w3[2], w3[3]) ^ 0x5c5c5c5c5c5c5c5c; + w2_t[0] = 0 ^ 0x5c5c5c5c5c5c5c5c; + w2_t[1] = 0 ^ 0x5c5c5c5c5c5c5c5c; + w2_t[2] = 0 ^ 0x5c5c5c5c5c5c5c5c; + w2_t[3] = 0 ^ 0x5c5c5c5c5c5c5c5c; + w3_t[0] = 0 ^ 0x5c5c5c5c5c5c5c5c; + w3_t[1] = 0 ^ 0x5c5c5c5c5c5c5c5c; + w3_t[2] = 0 ^ 0x5c5c5c5c5c5c5c5c; + w3_t[3] = 0 ^ 0x5c5c5c5c5c5c5c5c; + + opad[0] = SHA512M_A; + opad[1] = SHA512M_B; + opad[2] = SHA512M_C; + opad[3] = SHA512M_D; + opad[4] = SHA512M_E; + opad[5] = SHA512M_F; + opad[6] = SHA512M_G; + opad[7] = SHA512M_H; + + sha512_transform (w0_t, w1_t, w2_t, w3_t, opad); +} + +__device__ static void hmac_sha512_run (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], u64x ipad[8], u64x opad[8], u64x digest[8]) +{ + u64x w0_t[4]; + u64x w1_t[4]; + u64x w2_t[4]; + u64x w3_t[4]; + + w0_t[0] = hl32_to_64 (w0[0], w0[1]); + w0_t[1] = hl32_to_64 (w0[2], w0[3]); + w0_t[2] = hl32_to_64 (w1[0], w1[1]); + w0_t[3] = hl32_to_64 (w1[2], w1[3]); + w1_t[0] = hl32_to_64 (w2[0], w2[1]); + w1_t[1] = hl32_to_64 (w2[2], w2[3]); + w1_t[2] = hl32_to_64 (w3[0], w3[1]); + w1_t[3] = 0; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = hl32_to_64 (w3[2], w3[3]); + + digest[0] = ipad[0]; + digest[1] = ipad[1]; + digest[2] = ipad[2]; + digest[3] = ipad[3]; + digest[4] = ipad[4]; + digest[5] = ipad[5]; + digest[6] = ipad[6]; + digest[7] = ipad[7]; + + sha512_transform (w0_t, w1_t, w2_t, w3_t, digest); + + w0_t[0] = digest[0]; + w0_t[1] = digest[1]; + w0_t[2] = digest[2]; + w0_t[3] = digest[3]; + w1_t[0] = digest[4]; + w1_t[1] = digest[5]; + w1_t[2] = digest[6]; + w1_t[3] = digest[7]; + w2_t[0] = 0x8000000000000000; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = (128 + 64) * 8; + + digest[0] = opad[0]; + digest[1] = opad[1]; + digest[2] = opad[2]; + digest[3] = opad[3]; + digest[4] = opad[4]; + digest[5] = opad[5]; + digest[6] = opad[6]; + digest[7] = opad[7]; + + sha512_transform (w0_t, w1_t, w2_t, w3_t, digest); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m01760_m04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + u32x pw_buf1[4]; + + pw_buf1[0] = pws[gid].i[ 4]; + pw_buf1[1] = pws[gid].i[ 5]; + pw_buf1[2] = pws[gid].i[ 6]; + pw_buf1[3] = pws[gid].i[ 7]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[ 1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[ 2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[ 3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[ 4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[ 5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[ 6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[ 7]; + + /** + * pads + */ + + u32x w0_t[4]; + + w0_t[0] = swap_workaround (salt_buf0[0]); + w0_t[1] = swap_workaround (salt_buf0[1]); + w0_t[2] = swap_workaround (salt_buf0[2]); + w0_t[3] = swap_workaround (salt_buf0[3]); + + u32x w1_t[4]; + + w1_t[0] = swap_workaround (salt_buf1[0]); + w1_t[1] = swap_workaround (salt_buf1[1]); + w1_t[2] = swap_workaround (salt_buf1[2]); + w1_t[3] = swap_workaround (salt_buf1[3]); + + u32x w2_t[4]; + + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + + u32x w3_t[4]; + + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = 0; + + u64x ipad[8]; + u64x opad[8]; + + hmac_sha512_pad (w0_t, w1_t, w2_t, w3_t, ipad, opad); + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + + w0[0] = pw_buf0[0]; + w0[1] = pw_buf0[1]; + w0[2] = pw_buf0[2]; + w0[3] = pw_buf0[3]; + + u32x w1[4]; + + w1[0] = pw_buf1[0]; + w1[1] = pw_buf1[1]; + w1[2] = pw_buf1[2]; + w1[3] = pw_buf1[3]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 out_len = apply_rules (c_rules[il_pos].cmds, w0, w1, pw_len); + + append_0x80_2 (w0, w1, out_len); + + w0_t[0] = swap_workaround (w0[0]); + w0_t[1] = swap_workaround (w0[1]); + w0_t[2] = swap_workaround (w0[2]); + w0_t[3] = swap_workaround (w0[3]); + w1_t[0] = swap_workaround (w1[0]); + w1_t[1] = swap_workaround (w1[1]); + w1_t[2] = swap_workaround (w1[2]); + w1_t[3] = swap_workaround (w1[3]); + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = (128 + out_len) * 8; + + u64x digest[8]; + + hmac_sha512_run (w0_t, w1_t, w2_t, w3_t, ipad, opad, digest); + + + const u32x r0 = l32_from_64 (digest[7]); + const u32x r1 = h32_from_64 (digest[7]); + const u32x r2 = l32_from_64 (digest[3]); + const u32x r3 = h32_from_64 (digest[3]); + + #include VECT_COMPARE_M + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m01760_m08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m01760_m16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m01760_s04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + u32x pw_buf1[4]; + + pw_buf1[0] = pws[gid].i[ 4]; + pw_buf1[1] = pws[gid].i[ 5]; + pw_buf1[2] = pws[gid].i[ 6]; + pw_buf1[3] = pws[gid].i[ 7]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[ 1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[ 2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[ 3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[ 4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[ 5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[ 6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[ 7]; + + /** + * pads + */ + + u32x w0_t[4]; + + w0_t[0] = swap_workaround (salt_buf0[0]); + w0_t[1] = swap_workaround (salt_buf0[1]); + w0_t[2] = swap_workaround (salt_buf0[2]); + w0_t[3] = swap_workaround (salt_buf0[3]); + + u32x w1_t[4]; + + w1_t[0] = swap_workaround (salt_buf1[0]); + w1_t[1] = swap_workaround (salt_buf1[1]); + w1_t[2] = swap_workaround (salt_buf1[2]); + w1_t[3] = swap_workaround (salt_buf1[3]); + + u32x w2_t[4]; + + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + + u32x w3_t[4]; + + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = 0; + + u64x ipad[8]; + u64x opad[8]; + + hmac_sha512_pad (w0_t, w1_t, w2_t, w3_t, ipad, opad); + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + + w0[0] = pw_buf0[0]; + w0[1] = pw_buf0[1]; + w0[2] = pw_buf0[2]; + w0[3] = pw_buf0[3]; + + u32x w1[4]; + + w1[0] = pw_buf1[0]; + w1[1] = pw_buf1[1]; + w1[2] = pw_buf1[2]; + w1[3] = pw_buf1[3]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 out_len = apply_rules (c_rules[il_pos].cmds, w0, w1, pw_len); + + append_0x80_2 (w0, w1, out_len); + + w0_t[0] = swap_workaround (w0[0]); + w0_t[1] = swap_workaround (w0[1]); + w0_t[2] = swap_workaround (w0[2]); + w0_t[3] = swap_workaround (w0[3]); + w1_t[0] = swap_workaround (w1[0]); + w1_t[1] = swap_workaround (w1[1]); + w1_t[2] = swap_workaround (w1[2]); + w1_t[3] = swap_workaround (w1[3]); + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = (128 + out_len) * 8; + + u64x digest[8]; + + hmac_sha512_run (w0_t, w1_t, w2_t, w3_t, ipad, opad, digest); + + + const u32x r0 = l32_from_64 (digest[7]); + const u32x r1 = h32_from_64 (digest[7]); + const u32x r2 = l32_from_64 (digest[3]); + const u32x r3 = h32_from_64 (digest[3]); + + #include VECT_COMPARE_S + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m01760_s08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m01760_s16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/nv/m01760_a1.cu b/nv/m01760_a1.cu new file mode 100644 index 0000000000..36763c67e3 --- /dev/null +++ b/nv/m01760_a1.cu @@ -0,0 +1,728 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _SHA512_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW2 +#define VECT_SIZE1 +#endif + +#define DGST_R0 14 +#define DGST_R1 15 +#define DGST_R2 6 +#define DGST_R3 7 + +#include "include/kernel_functions.c" +#include "types_nv.c" +#include "common_nv.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +__device__ __constant__ comb_t c_combs[1024]; + +__device__ __constant__ u64 k_sha512[80] = +{ + SHA512C00, SHA512C01, SHA512C02, SHA512C03, + SHA512C04, SHA512C05, SHA512C06, SHA512C07, + SHA512C08, SHA512C09, SHA512C0a, SHA512C0b, + SHA512C0c, SHA512C0d, SHA512C0e, SHA512C0f, + SHA512C10, SHA512C11, SHA512C12, SHA512C13, + SHA512C14, SHA512C15, SHA512C16, SHA512C17, + SHA512C18, SHA512C19, SHA512C1a, SHA512C1b, + SHA512C1c, SHA512C1d, SHA512C1e, SHA512C1f, + SHA512C20, SHA512C21, SHA512C22, SHA512C23, + SHA512C24, SHA512C25, SHA512C26, SHA512C27, + SHA512C28, SHA512C29, SHA512C2a, SHA512C2b, + SHA512C2c, SHA512C2d, SHA512C2e, SHA512C2f, + SHA512C30, SHA512C31, SHA512C32, SHA512C33, + SHA512C34, SHA512C35, SHA512C36, SHA512C37, + SHA512C38, SHA512C39, SHA512C3a, SHA512C3b, + SHA512C3c, SHA512C3d, SHA512C3e, SHA512C3f, + SHA512C40, SHA512C41, SHA512C42, SHA512C43, + SHA512C44, SHA512C45, SHA512C46, SHA512C47, + SHA512C48, SHA512C49, SHA512C4a, SHA512C4b, + SHA512C4c, SHA512C4d, SHA512C4e, SHA512C4f, +}; + +__device__ static void sha512_transform (const u64x w0[4], const u64x w1[4], const u64x w2[4], const u64x w3[4], u64x digest[8]) +{ + u64x w0_t = w0[0]; + u64x w1_t = w0[1]; + u64x w2_t = w0[2]; + u64x w3_t = w0[3]; + u64x w4_t = w1[0]; + u64x w5_t = w1[1]; + u64x w6_t = w1[2]; + u64x w7_t = w1[3]; + u64x w8_t = w2[0]; + u64x w9_t = w2[1]; + u64x wa_t = w2[2]; + u64x wb_t = w2[3]; + u64x wc_t = w3[0]; + u64x wd_t = w3[1]; + u64x we_t = w3[2]; + u64x wf_t = w3[3]; + + u64x a = digest[0]; + u64x b = digest[1]; + u64x c = digest[2]; + u64x d = digest[3]; + u64x e = digest[4]; + u64x f = digest[5]; + u64x g = digest[6]; + u64x h = digest[7]; + + #define ROUND_EXPAND() \ + { \ + w0_t = SHA512_EXPAND (we_t, w9_t, w1_t, w0_t); \ + w1_t = SHA512_EXPAND (wf_t, wa_t, w2_t, w1_t); \ + w2_t = SHA512_EXPAND (w0_t, wb_t, w3_t, w2_t); \ + w3_t = SHA512_EXPAND (w1_t, wc_t, w4_t, w3_t); \ + w4_t = SHA512_EXPAND (w2_t, wd_t, w5_t, w4_t); \ + w5_t = SHA512_EXPAND (w3_t, we_t, w6_t, w5_t); \ + w6_t = SHA512_EXPAND (w4_t, wf_t, w7_t, w6_t); \ + w7_t = SHA512_EXPAND (w5_t, w0_t, w8_t, w7_t); \ + w8_t = SHA512_EXPAND (w6_t, w1_t, w9_t, w8_t); \ + w9_t = SHA512_EXPAND (w7_t, w2_t, wa_t, w9_t); \ + wa_t = SHA512_EXPAND (w8_t, w3_t, wb_t, wa_t); \ + wb_t = SHA512_EXPAND (w9_t, w4_t, wc_t, wb_t); \ + wc_t = SHA512_EXPAND (wa_t, w5_t, wd_t, wc_t); \ + wd_t = SHA512_EXPAND (wb_t, w6_t, we_t, wd_t); \ + we_t = SHA512_EXPAND (wc_t, w7_t, wf_t, we_t); \ + wf_t = SHA512_EXPAND (wd_t, w8_t, w0_t, wf_t); \ + } + + #define ROUND_STEP(i) \ + { \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, a, b, c, d, e, f, g, h, w0_t, k_sha512[i + 0]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, h, a, b, c, d, e, f, g, w1_t, k_sha512[i + 1]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, g, h, a, b, c, d, e, f, w2_t, k_sha512[i + 2]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, f, g, h, a, b, c, d, e, w3_t, k_sha512[i + 3]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, e, f, g, h, a, b, c, d, w4_t, k_sha512[i + 4]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, d, e, f, g, h, a, b, c, w5_t, k_sha512[i + 5]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, c, d, e, f, g, h, a, b, w6_t, k_sha512[i + 6]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, b, c, d, e, f, g, h, a, w7_t, k_sha512[i + 7]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, a, b, c, d, e, f, g, h, w8_t, k_sha512[i + 8]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, h, a, b, c, d, e, f, g, w9_t, k_sha512[i + 9]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, g, h, a, b, c, d, e, f, wa_t, k_sha512[i + 10]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, f, g, h, a, b, c, d, e, wb_t, k_sha512[i + 11]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, e, f, g, h, a, b, c, d, wc_t, k_sha512[i + 12]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, d, e, f, g, h, a, b, c, wd_t, k_sha512[i + 13]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, c, d, e, f, g, h, a, b, we_t, k_sha512[i + 14]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, b, c, d, e, f, g, h, a, wf_t, k_sha512[i + 15]); \ + } + + ROUND_STEP (0); + + for (int i = 16; i < 80; i += 16) + { + ROUND_EXPAND (); ROUND_STEP (i); + } + + digest[0] += a; + digest[1] += b; + digest[2] += c; + digest[3] += d; + digest[4] += e; + digest[5] += f; + digest[6] += g; + digest[7] += h; +} + +__device__ static void hmac_sha512_pad (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], u64x ipad[8], u64x opad[8]) +{ + u64x w0_t[4]; + u64x w1_t[4]; + u64x w2_t[4]; + u64x w3_t[4]; + + w0_t[0] = hl32_to_64 (w0[0], w0[1]) ^ 0x3636363636363636; + w0_t[1] = hl32_to_64 (w0[2], w0[3]) ^ 0x3636363636363636; + w0_t[2] = hl32_to_64 (w1[0], w1[1]) ^ 0x3636363636363636; + w0_t[3] = hl32_to_64 (w1[2], w1[3]) ^ 0x3636363636363636; + w1_t[0] = hl32_to_64 (w2[0], w2[1]) ^ 0x3636363636363636; + w1_t[1] = hl32_to_64 (w2[2], w2[3]) ^ 0x3636363636363636; + w1_t[2] = hl32_to_64 (w3[0], w3[1]) ^ 0x3636363636363636; + w1_t[3] = hl32_to_64 (w3[2], w3[3]) ^ 0x3636363636363636; + w2_t[0] = 0 ^ 0x3636363636363636; + w2_t[1] = 0 ^ 0x3636363636363636; + w2_t[2] = 0 ^ 0x3636363636363636; + w2_t[3] = 0 ^ 0x3636363636363636; + w3_t[0] = 0 ^ 0x3636363636363636; + w3_t[1] = 0 ^ 0x3636363636363636; + w3_t[2] = 0 ^ 0x3636363636363636; + w3_t[3] = 0 ^ 0x3636363636363636; + + ipad[0] = SHA512M_A; + ipad[1] = SHA512M_B; + ipad[2] = SHA512M_C; + ipad[3] = SHA512M_D; + ipad[4] = SHA512M_E; + ipad[5] = SHA512M_F; + ipad[6] = SHA512M_G; + ipad[7] = SHA512M_H; + + sha512_transform (w0_t, w1_t, w2_t, w3_t, ipad); + + w0_t[0] = hl32_to_64 (w0[0], w0[1]) ^ 0x5c5c5c5c5c5c5c5c; + w0_t[1] = hl32_to_64 (w0[2], w0[3]) ^ 0x5c5c5c5c5c5c5c5c; + w0_t[2] = hl32_to_64 (w1[0], w1[1]) ^ 0x5c5c5c5c5c5c5c5c; + w0_t[3] = hl32_to_64 (w1[2], w1[3]) ^ 0x5c5c5c5c5c5c5c5c; + w1_t[0] = hl32_to_64 (w2[0], w2[1]) ^ 0x5c5c5c5c5c5c5c5c; + w1_t[1] = hl32_to_64 (w2[2], w2[3]) ^ 0x5c5c5c5c5c5c5c5c; + w1_t[2] = hl32_to_64 (w3[0], w3[1]) ^ 0x5c5c5c5c5c5c5c5c; + w1_t[3] = hl32_to_64 (w3[2], w3[3]) ^ 0x5c5c5c5c5c5c5c5c; + w2_t[0] = 0 ^ 0x5c5c5c5c5c5c5c5c; + w2_t[1] = 0 ^ 0x5c5c5c5c5c5c5c5c; + w2_t[2] = 0 ^ 0x5c5c5c5c5c5c5c5c; + w2_t[3] = 0 ^ 0x5c5c5c5c5c5c5c5c; + w3_t[0] = 0 ^ 0x5c5c5c5c5c5c5c5c; + w3_t[1] = 0 ^ 0x5c5c5c5c5c5c5c5c; + w3_t[2] = 0 ^ 0x5c5c5c5c5c5c5c5c; + w3_t[3] = 0 ^ 0x5c5c5c5c5c5c5c5c; + + opad[0] = SHA512M_A; + opad[1] = SHA512M_B; + opad[2] = SHA512M_C; + opad[3] = SHA512M_D; + opad[4] = SHA512M_E; + opad[5] = SHA512M_F; + opad[6] = SHA512M_G; + opad[7] = SHA512M_H; + + sha512_transform (w0_t, w1_t, w2_t, w3_t, opad); +} + +__device__ static void hmac_sha512_run (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], u64x ipad[8], u64x opad[8], u64x digest[8]) +{ + u64x w0_t[4]; + u64x w1_t[4]; + u64x w2_t[4]; + u64x w3_t[4]; + + w0_t[0] = hl32_to_64 (w0[0], w0[1]); + w0_t[1] = hl32_to_64 (w0[2], w0[3]); + w0_t[2] = hl32_to_64 (w1[0], w1[1]); + w0_t[3] = hl32_to_64 (w1[2], w1[3]); + w1_t[0] = hl32_to_64 (w2[0], w2[1]); + w1_t[1] = hl32_to_64 (w2[2], w2[3]); + w1_t[2] = hl32_to_64 (w3[0], w3[1]); + w1_t[3] = 0; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = hl32_to_64 (w3[2], w3[3]); + + digest[0] = ipad[0]; + digest[1] = ipad[1]; + digest[2] = ipad[2]; + digest[3] = ipad[3]; + digest[4] = ipad[4]; + digest[5] = ipad[5]; + digest[6] = ipad[6]; + digest[7] = ipad[7]; + + sha512_transform (w0_t, w1_t, w2_t, w3_t, digest); + + w0_t[0] = digest[0]; + w0_t[1] = digest[1]; + w0_t[2] = digest[2]; + w0_t[3] = digest[3]; + w1_t[0] = digest[4]; + w1_t[1] = digest[5]; + w1_t[2] = digest[6]; + w1_t[3] = digest[7]; + w2_t[0] = 0x8000000000000000; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = (128 + 64) * 8; + + digest[0] = opad[0]; + digest[1] = opad[1]; + digest[2] = opad[2]; + digest[3] = opad[3]; + digest[4] = opad[4]; + digest[5] = opad[5]; + digest[6] = opad[6]; + digest[7] = opad[7]; + + sha512_transform (w0_t, w1_t, w2_t, w3_t, digest); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m01760_m04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, c_combs[0].pw_len); + } + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[ 1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[ 2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[ 3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[ 4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[ 5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[ 6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[ 7]; + + /** + * pads + */ + + u32x w0_t[4]; + + w0_t[0] = swap_workaround (salt_buf0[0]); + w0_t[1] = swap_workaround (salt_buf0[1]); + w0_t[2] = swap_workaround (salt_buf0[2]); + w0_t[3] = swap_workaround (salt_buf0[3]); + + u32x w1_t[4]; + + w1_t[0] = swap_workaround (salt_buf1[0]); + w1_t[1] = swap_workaround (salt_buf1[1]); + w1_t[2] = swap_workaround (salt_buf1[2]); + w1_t[3] = swap_workaround (salt_buf1[3]); + + u32x w2_t[4]; + + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + + u32x w3_t[4]; + + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = 0; + + u64x ipad[8]; + u64x opad[8]; + + hmac_sha512_pad (w0_t, w1_t, w2_t, w3_t, ipad, opad); + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = c_combs[il_pos].pw_len; + + const u32 pw_len = pw_l_len + pw_r_len; + + u32 wordr0[4]; + + wordr0[0] = c_combs[il_pos].i[0]; + wordr0[1] = c_combs[il_pos].i[1]; + wordr0[2] = c_combs[il_pos].i[2]; + wordr0[3] = c_combs[il_pos].i[3]; + + u32 wordr1[4]; + + wordr1[0] = c_combs[il_pos].i[4]; + wordr1[1] = c_combs[il_pos].i[5]; + wordr1[2] = c_combs[il_pos].i[6]; + wordr1[3] = c_combs[il_pos].i[7]; + + u32 wordr2[4]; + + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + + u32 wordr3[4]; + + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + u32x w0[4]; + + w0[0] = wordl0[0] | wordr0[0]; + w0[1] = wordl0[1] | wordr0[1]; + w0[2] = wordl0[2] | wordr0[2]; + w0[3] = wordl0[3] | wordr0[3]; + + u32x w1[4]; + + w1[0] = wordl1[0] | wordr1[0]; + w1[1] = wordl1[1] | wordr1[1]; + w1[2] = wordl1[2] | wordr1[2]; + w1[3] = wordl1[3] | wordr1[3]; + + u32x w2[4]; + + w2[0] = wordl2[0] | wordr2[0]; + w2[1] = wordl2[1] | wordr2[1]; + w2[2] = wordl2[2] | wordr2[2]; + w2[3] = wordl2[3] | wordr2[3]; + + u32x w3[4]; + + w3[0] = wordl3[0] | wordr3[0]; + w3[1] = wordl3[1] | wordr3[1]; + w3[2] = 0; + w3[3] = 0; + + append_0x80_4 (w0, w1, w2, w3, pw_len); + + w0_t[0] = swap_workaround (w0[0]); + w0_t[1] = swap_workaround (w0[1]); + w0_t[2] = swap_workaround (w0[2]); + w0_t[3] = swap_workaround (w0[3]); + w1_t[0] = swap_workaround (w1[0]); + w1_t[1] = swap_workaround (w1[1]); + w1_t[2] = swap_workaround (w1[2]); + w1_t[3] = swap_workaround (w1[3]); + w2_t[0] = swap_workaround (w2[0]); + w2_t[1] = swap_workaround (w2[1]); + w2_t[2] = swap_workaround (w2[2]); + w2_t[3] = swap_workaround (w2[3]); + w3_t[0] = swap_workaround (w3[0]); + w3_t[1] = swap_workaround (w3[1]); + w3_t[2] = 0; + w3_t[3] = (128 + pw_len) * 8; + + u64x digest[8]; + + hmac_sha512_run (w0_t, w1_t, w2_t, w3_t, ipad, opad, digest); + + + const u32x r0 = l32_from_64 (digest[7]); + const u32x r1 = h32_from_64 (digest[7]); + const u32x r2 = l32_from_64 (digest[3]); + const u32x r3 = h32_from_64 (digest[3]); + + #include VECT_COMPARE_M + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m01760_m08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m01760_m16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m01760_s04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, c_combs[0].pw_len); + } + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[ 1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[ 2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[ 3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[ 4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[ 5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[ 6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[ 7]; + + /** + * pads + */ + + u32x w0_t[4]; + + w0_t[0] = swap_workaround (salt_buf0[0]); + w0_t[1] = swap_workaround (salt_buf0[1]); + w0_t[2] = swap_workaround (salt_buf0[2]); + w0_t[3] = swap_workaround (salt_buf0[3]); + + u32x w1_t[4]; + + w1_t[0] = swap_workaround (salt_buf1[0]); + w1_t[1] = swap_workaround (salt_buf1[1]); + w1_t[2] = swap_workaround (salt_buf1[2]); + w1_t[3] = swap_workaround (salt_buf1[3]); + + u32x w2_t[4]; + + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + + u32x w3_t[4]; + + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = 0; + + u64x ipad[8]; + u64x opad[8]; + + hmac_sha512_pad (w0_t, w1_t, w2_t, w3_t, ipad, opad); + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = c_combs[il_pos].pw_len; + + const u32 pw_len = pw_l_len + pw_r_len; + + u32 wordr0[4]; + + wordr0[0] = c_combs[il_pos].i[0]; + wordr0[1] = c_combs[il_pos].i[1]; + wordr0[2] = c_combs[il_pos].i[2]; + wordr0[3] = c_combs[il_pos].i[3]; + + u32 wordr1[4]; + + wordr1[0] = c_combs[il_pos].i[4]; + wordr1[1] = c_combs[il_pos].i[5]; + wordr1[2] = c_combs[il_pos].i[6]; + wordr1[3] = c_combs[il_pos].i[7]; + + u32 wordr2[4]; + + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + + u32 wordr3[4]; + + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + u32x w0[4]; + + w0[0] = wordl0[0] | wordr0[0]; + w0[1] = wordl0[1] | wordr0[1]; + w0[2] = wordl0[2] | wordr0[2]; + w0[3] = wordl0[3] | wordr0[3]; + + u32x w1[4]; + + w1[0] = wordl1[0] | wordr1[0]; + w1[1] = wordl1[1] | wordr1[1]; + w1[2] = wordl1[2] | wordr1[2]; + w1[3] = wordl1[3] | wordr1[3]; + + u32x w2[4]; + + w2[0] = wordl2[0] | wordr2[0]; + w2[1] = wordl2[1] | wordr2[1]; + w2[2] = wordl2[2] | wordr2[2]; + w2[3] = wordl2[3] | wordr2[3]; + + u32x w3[4]; + + w3[0] = wordl3[0] | wordr3[0]; + w3[1] = wordl3[1] | wordr3[1]; + w3[2] = 0; + w3[3] = 0; + + append_0x80_4 (w0, w1, w2, w3, pw_len); + + w0_t[0] = swap_workaround (w0[0]); + w0_t[1] = swap_workaround (w0[1]); + w0_t[2] = swap_workaround (w0[2]); + w0_t[3] = swap_workaround (w0[3]); + w1_t[0] = swap_workaround (w1[0]); + w1_t[1] = swap_workaround (w1[1]); + w1_t[2] = swap_workaround (w1[2]); + w1_t[3] = swap_workaround (w1[3]); + w2_t[0] = swap_workaround (w2[0]); + w2_t[1] = swap_workaround (w2[1]); + w2_t[2] = swap_workaround (w2[2]); + w2_t[3] = swap_workaround (w2[3]); + w3_t[0] = swap_workaround (w3[0]); + w3_t[1] = swap_workaround (w3[1]); + w3_t[2] = 0; + w3_t[3] = (128 + pw_len) * 8; + + u64x digest[8]; + + hmac_sha512_run (w0_t, w1_t, w2_t, w3_t, ipad, opad, digest); + + + const u32x r0 = l32_from_64 (digest[7]); + const u32x r1 = h32_from_64 (digest[7]); + const u32x r2 = l32_from_64 (digest[3]); + const u32x r3 = h32_from_64 (digest[3]); + + #include VECT_COMPARE_S + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m01760_s08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m01760_s16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/nv/m01760_a3.cu b/nv/m01760_a3.cu new file mode 100644 index 0000000000..f5fe33acaa --- /dev/null +++ b/nv/m01760_a3.cu @@ -0,0 +1,788 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _SHA512_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW2 +#define VECT_SIZE1 +#endif + +#define DGST_R0 14 +#define DGST_R1 15 +#define DGST_R2 6 +#define DGST_R3 7 + +#include "include/kernel_functions.c" +#include "types_nv.c" +#include "common_nv.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +__device__ __constant__ bf_t c_bfs[1024]; + +__device__ __constant__ u64 k_sha512[80] = +{ + SHA512C00, SHA512C01, SHA512C02, SHA512C03, + SHA512C04, SHA512C05, SHA512C06, SHA512C07, + SHA512C08, SHA512C09, SHA512C0a, SHA512C0b, + SHA512C0c, SHA512C0d, SHA512C0e, SHA512C0f, + SHA512C10, SHA512C11, SHA512C12, SHA512C13, + SHA512C14, SHA512C15, SHA512C16, SHA512C17, + SHA512C18, SHA512C19, SHA512C1a, SHA512C1b, + SHA512C1c, SHA512C1d, SHA512C1e, SHA512C1f, + SHA512C20, SHA512C21, SHA512C22, SHA512C23, + SHA512C24, SHA512C25, SHA512C26, SHA512C27, + SHA512C28, SHA512C29, SHA512C2a, SHA512C2b, + SHA512C2c, SHA512C2d, SHA512C2e, SHA512C2f, + SHA512C30, SHA512C31, SHA512C32, SHA512C33, + SHA512C34, SHA512C35, SHA512C36, SHA512C37, + SHA512C38, SHA512C39, SHA512C3a, SHA512C3b, + SHA512C3c, SHA512C3d, SHA512C3e, SHA512C3f, + SHA512C40, SHA512C41, SHA512C42, SHA512C43, + SHA512C44, SHA512C45, SHA512C46, SHA512C47, + SHA512C48, SHA512C49, SHA512C4a, SHA512C4b, + SHA512C4c, SHA512C4d, SHA512C4e, SHA512C4f, +}; + +__device__ static void sha512_transform (const u64x w0[4], const u64x w1[4], const u64x w2[4], const u64x w3[4], u64x digest[8]) +{ + u64x w0_t = w0[0]; + u64x w1_t = w0[1]; + u64x w2_t = w0[2]; + u64x w3_t = w0[3]; + u64x w4_t = w1[0]; + u64x w5_t = w1[1]; + u64x w6_t = w1[2]; + u64x w7_t = w1[3]; + u64x w8_t = w2[0]; + u64x w9_t = w2[1]; + u64x wa_t = w2[2]; + u64x wb_t = w2[3]; + u64x wc_t = w3[0]; + u64x wd_t = w3[1]; + u64x we_t = w3[2]; + u64x wf_t = w3[3]; + + u64x a = digest[0]; + u64x b = digest[1]; + u64x c = digest[2]; + u64x d = digest[3]; + u64x e = digest[4]; + u64x f = digest[5]; + u64x g = digest[6]; + u64x h = digest[7]; + + #define ROUND_EXPAND() \ + { \ + w0_t = SHA512_EXPAND (we_t, w9_t, w1_t, w0_t); \ + w1_t = SHA512_EXPAND (wf_t, wa_t, w2_t, w1_t); \ + w2_t = SHA512_EXPAND (w0_t, wb_t, w3_t, w2_t); \ + w3_t = SHA512_EXPAND (w1_t, wc_t, w4_t, w3_t); \ + w4_t = SHA512_EXPAND (w2_t, wd_t, w5_t, w4_t); \ + w5_t = SHA512_EXPAND (w3_t, we_t, w6_t, w5_t); \ + w6_t = SHA512_EXPAND (w4_t, wf_t, w7_t, w6_t); \ + w7_t = SHA512_EXPAND (w5_t, w0_t, w8_t, w7_t); \ + w8_t = SHA512_EXPAND (w6_t, w1_t, w9_t, w8_t); \ + w9_t = SHA512_EXPAND (w7_t, w2_t, wa_t, w9_t); \ + wa_t = SHA512_EXPAND (w8_t, w3_t, wb_t, wa_t); \ + wb_t = SHA512_EXPAND (w9_t, w4_t, wc_t, wb_t); \ + wc_t = SHA512_EXPAND (wa_t, w5_t, wd_t, wc_t); \ + wd_t = SHA512_EXPAND (wb_t, w6_t, we_t, wd_t); \ + we_t = SHA512_EXPAND (wc_t, w7_t, wf_t, we_t); \ + wf_t = SHA512_EXPAND (wd_t, w8_t, w0_t, wf_t); \ + } + + #define ROUND_STEP(i) \ + { \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, a, b, c, d, e, f, g, h, w0_t, k_sha512[i + 0]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, h, a, b, c, d, e, f, g, w1_t, k_sha512[i + 1]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, g, h, a, b, c, d, e, f, w2_t, k_sha512[i + 2]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, f, g, h, a, b, c, d, e, w3_t, k_sha512[i + 3]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, e, f, g, h, a, b, c, d, w4_t, k_sha512[i + 4]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, d, e, f, g, h, a, b, c, w5_t, k_sha512[i + 5]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, c, d, e, f, g, h, a, b, w6_t, k_sha512[i + 6]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, b, c, d, e, f, g, h, a, w7_t, k_sha512[i + 7]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, a, b, c, d, e, f, g, h, w8_t, k_sha512[i + 8]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, h, a, b, c, d, e, f, g, w9_t, k_sha512[i + 9]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, g, h, a, b, c, d, e, f, wa_t, k_sha512[i + 10]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, f, g, h, a, b, c, d, e, wb_t, k_sha512[i + 11]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, e, f, g, h, a, b, c, d, wc_t, k_sha512[i + 12]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, d, e, f, g, h, a, b, c, wd_t, k_sha512[i + 13]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, c, d, e, f, g, h, a, b, we_t, k_sha512[i + 14]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, b, c, d, e, f, g, h, a, wf_t, k_sha512[i + 15]); \ + } + + ROUND_STEP (0); + + for (int i = 16; i < 80; i += 16) + { + ROUND_EXPAND (); ROUND_STEP (i); + } + + digest[0] += a; + digest[1] += b; + digest[2] += c; + digest[3] += d; + digest[4] += e; + digest[5] += f; + digest[6] += g; + digest[7] += h; +} + +__device__ static void hmac_sha512_pad (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], u64x ipad[8], u64x opad[8]) +{ + u64x w0_t[4]; + u64x w1_t[4]; + u64x w2_t[4]; + u64x w3_t[4]; + + w0_t[0] = hl32_to_64 (w0[0], w0[1]) ^ 0x3636363636363636; + w0_t[1] = hl32_to_64 (w0[2], w0[3]) ^ 0x3636363636363636; + w0_t[2] = hl32_to_64 (w1[0], w1[1]) ^ 0x3636363636363636; + w0_t[3] = hl32_to_64 (w1[2], w1[3]) ^ 0x3636363636363636; + w1_t[0] = hl32_to_64 (w2[0], w2[1]) ^ 0x3636363636363636; + w1_t[1] = hl32_to_64 (w2[2], w2[3]) ^ 0x3636363636363636; + w1_t[2] = hl32_to_64 (w3[0], w3[1]) ^ 0x3636363636363636; + w1_t[3] = hl32_to_64 (w3[2], w3[3]) ^ 0x3636363636363636; + w2_t[0] = 0 ^ 0x3636363636363636; + w2_t[1] = 0 ^ 0x3636363636363636; + w2_t[2] = 0 ^ 0x3636363636363636; + w2_t[3] = 0 ^ 0x3636363636363636; + w3_t[0] = 0 ^ 0x3636363636363636; + w3_t[1] = 0 ^ 0x3636363636363636; + w3_t[2] = 0 ^ 0x3636363636363636; + w3_t[3] = 0 ^ 0x3636363636363636; + + ipad[0] = SHA512M_A; + ipad[1] = SHA512M_B; + ipad[2] = SHA512M_C; + ipad[3] = SHA512M_D; + ipad[4] = SHA512M_E; + ipad[5] = SHA512M_F; + ipad[6] = SHA512M_G; + ipad[7] = SHA512M_H; + + sha512_transform (w0_t, w1_t, w2_t, w3_t, ipad); + + w0_t[0] = hl32_to_64 (w0[0], w0[1]) ^ 0x5c5c5c5c5c5c5c5c; + w0_t[1] = hl32_to_64 (w0[2], w0[3]) ^ 0x5c5c5c5c5c5c5c5c; + w0_t[2] = hl32_to_64 (w1[0], w1[1]) ^ 0x5c5c5c5c5c5c5c5c; + w0_t[3] = hl32_to_64 (w1[2], w1[3]) ^ 0x5c5c5c5c5c5c5c5c; + w1_t[0] = hl32_to_64 (w2[0], w2[1]) ^ 0x5c5c5c5c5c5c5c5c; + w1_t[1] = hl32_to_64 (w2[2], w2[3]) ^ 0x5c5c5c5c5c5c5c5c; + w1_t[2] = hl32_to_64 (w3[0], w3[1]) ^ 0x5c5c5c5c5c5c5c5c; + w1_t[3] = hl32_to_64 (w3[2], w3[3]) ^ 0x5c5c5c5c5c5c5c5c; + w2_t[0] = 0 ^ 0x5c5c5c5c5c5c5c5c; + w2_t[1] = 0 ^ 0x5c5c5c5c5c5c5c5c; + w2_t[2] = 0 ^ 0x5c5c5c5c5c5c5c5c; + w2_t[3] = 0 ^ 0x5c5c5c5c5c5c5c5c; + w3_t[0] = 0 ^ 0x5c5c5c5c5c5c5c5c; + w3_t[1] = 0 ^ 0x5c5c5c5c5c5c5c5c; + w3_t[2] = 0 ^ 0x5c5c5c5c5c5c5c5c; + w3_t[3] = 0 ^ 0x5c5c5c5c5c5c5c5c; + + opad[0] = SHA512M_A; + opad[1] = SHA512M_B; + opad[2] = SHA512M_C; + opad[3] = SHA512M_D; + opad[4] = SHA512M_E; + opad[5] = SHA512M_F; + opad[6] = SHA512M_G; + opad[7] = SHA512M_H; + + sha512_transform (w0_t, w1_t, w2_t, w3_t, opad); +} + +__device__ static void hmac_sha512_run (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], u64x ipad[8], u64x opad[8], u64x digest[8]) +{ + u64x w0_t[4]; + u64x w1_t[4]; + u64x w2_t[4]; + u64x w3_t[4]; + + w0_t[0] = hl32_to_64 (w0[0], w0[1]); + w0_t[1] = hl32_to_64 (w0[2], w0[3]); + w0_t[2] = hl32_to_64 (w1[0], w1[1]); + w0_t[3] = hl32_to_64 (w1[2], w1[3]); + w1_t[0] = hl32_to_64 (w2[0], w2[1]); + w1_t[1] = hl32_to_64 (w2[2], w2[3]); + w1_t[2] = hl32_to_64 (w3[0], w3[1]); + w1_t[3] = 0; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = hl32_to_64 (w3[2], w3[3]); + + digest[0] = ipad[0]; + digest[1] = ipad[1]; + digest[2] = ipad[2]; + digest[3] = ipad[3]; + digest[4] = ipad[4]; + digest[5] = ipad[5]; + digest[6] = ipad[6]; + digest[7] = ipad[7]; + + sha512_transform (w0_t, w1_t, w2_t, w3_t, digest); + + w0_t[0] = digest[0]; + w0_t[1] = digest[1]; + w0_t[2] = digest[2]; + w0_t[3] = digest[3]; + w1_t[0] = digest[4]; + w1_t[1] = digest[5]; + w1_t[2] = digest[6]; + w1_t[3] = digest[7]; + w2_t[0] = 0x8000000000000000; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = (128 + 64) * 8; + + digest[0] = opad[0]; + digest[1] = opad[1]; + digest[2] = opad[2]; + digest[3] = opad[3]; + digest[4] = opad[4]; + digest[5] = opad[5]; + digest[6] = opad[6]; + digest[7] = opad[7]; + + sha512_transform (w0_t, w1_t, w2_t, w3_t, digest); +} + +__device__ static void m01760m (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], const u32 pw_len, const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset) +{ + /** + * modifier + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + const u32 lid = threadIdx.x; + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[ 1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[ 2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[ 3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[ 4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[ 5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[ 6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[ 7]; + + /** + * pads + */ + + u32x w0_t[4]; + + w0_t[0] = swap_workaround (salt_buf0[0]); + w0_t[1] = swap_workaround (salt_buf0[1]); + w0_t[2] = swap_workaround (salt_buf0[2]); + w0_t[3] = swap_workaround (salt_buf0[3]); + + u32x w1_t[4]; + + w1_t[0] = swap_workaround (salt_buf1[0]); + w1_t[1] = swap_workaround (salt_buf1[1]); + w1_t[2] = swap_workaround (salt_buf1[2]); + w1_t[3] = swap_workaround (salt_buf1[3]); + + u32x w2_t[4]; + + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + + u32x w3_t[4]; + + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = 0; + + u64x ipad[8]; + u64x opad[8]; + + hmac_sha512_pad (w0_t, w1_t, w2_t, w3_t, ipad, opad); + + /** + * loop + */ + + u32x w0l = w0[0]; + + for (u32 il_pos = 0; il_pos < bfs_cnt; il_pos++) + { + const u32 w0r = c_bfs[il_pos].i; + + w0[0] = w0l | w0r; + + w0_t[0] = w0[0]; + w0_t[1] = w0[1]; + w0_t[2] = w0[2]; + w0_t[3] = w0[3]; + w1_t[0] = w1[0]; + w1_t[1] = w1[1]; + w1_t[2] = w1[2]; + w1_t[3] = w1[3]; + w2_t[0] = w2[0]; + w2_t[1] = w2[1]; + w2_t[2] = w2[2]; + w2_t[3] = w2[3]; + w3_t[0] = w3[0]; + w3_t[1] = w3[1]; + w3_t[2] = 0; + w3_t[3] = (128 + pw_len) * 8; + + u64x digest[8]; + + hmac_sha512_run (w0_t, w1_t, w2_t, w3_t, ipad, opad, digest); + + + const u32x r0 = l32_from_64 (digest[7]); + const u32x r1 = h32_from_64 (digest[7]); + const u32x r2 = l32_from_64 (digest[3]); + const u32x r3 = h32_from_64 (digest[3]); + + #include VECT_COMPARE_M + } +} + +__device__ static void m01760s (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], const u32 pw_len, const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset) +{ + /** + * modifier + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + const u32 lid = threadIdx.x; + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[ 1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[ 2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[ 3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[ 4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[ 5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[ 6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[ 7]; + + /** + * pads + */ + + u32x w0_t[4]; + + w0_t[0] = swap_workaround (salt_buf0[0]); + w0_t[1] = swap_workaround (salt_buf0[1]); + w0_t[2] = swap_workaround (salt_buf0[2]); + w0_t[3] = swap_workaround (salt_buf0[3]); + + u32x w1_t[4]; + + w1_t[0] = swap_workaround (salt_buf1[0]); + w1_t[1] = swap_workaround (salt_buf1[1]); + w1_t[2] = swap_workaround (salt_buf1[2]); + w1_t[3] = swap_workaround (salt_buf1[3]); + + u32x w2_t[4]; + + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + + u32x w3_t[4]; + + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = 0; + + u64x ipad[8]; + u64x opad[8]; + + hmac_sha512_pad (w0_t, w1_t, w2_t, w3_t, ipad, opad); + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * loop + */ + + u32x w0l = w0[0]; + + for (u32 il_pos = 0; il_pos < bfs_cnt; il_pos++) + { + const u32 w0r = c_bfs[il_pos].i; + + w0[0] = w0l | w0r; + + w0_t[0] = w0[0]; + w0_t[1] = w0[1]; + w0_t[2] = w0[2]; + w0_t[3] = w0[3]; + w1_t[0] = w1[0]; + w1_t[1] = w1[1]; + w1_t[2] = w1[2]; + w1_t[3] = w1[3]; + w2_t[0] = w2[0]; + w2_t[1] = w2[1]; + w2_t[2] = w2[2]; + w2_t[3] = w2[3]; + w3_t[0] = w3[0]; + w3_t[1] = w3[1]; + w3_t[2] = 0; + w3_t[3] = (128 + pw_len) * 8; + + u64x digest[8]; + + hmac_sha512_run (w0_t, w1_t, w2_t, w3_t, ipad, opad, digest); + + + const u32x r0 = l32_from_64 (digest[7]); + const u32x r1 = h32_from_64 (digest[7]); + const u32x r2 = l32_from_64 (digest[3]); + const u32x r3 = h32_from_64 (digest[3]); + + #include VECT_COMPARE_S + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m01760_m04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m01760m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m01760_m08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m01760m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m01760_m16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = pws[gid].i[ 8]; + w2[1] = pws[gid].i[ 9]; + w2[2] = pws[gid].i[10]; + w2[3] = pws[gid].i[11]; + + u32x w3[4]; + + w3[0] = pws[gid].i[12]; + w3[1] = pws[gid].i[13]; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m01760m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m01760_s04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m01760s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m01760_s08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m01760s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m01760_s16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = pws[gid].i[ 8]; + w2[1] = pws[gid].i[ 9]; + w2[2] = pws[gid].i[10]; + w2[3] = pws[gid].i[11]; + + u32x w3[4]; + + w3[0] = pws[gid].i[12]; + w3[1] = pws[gid].i[13]; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m01760s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} diff --git a/nv/m01800.cu b/nv/m01800.cu new file mode 100644 index 0000000000..d1eb230829 --- /dev/null +++ b/nv/m01800.cu @@ -0,0 +1,566 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _SHA512_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW2 +#define VECT_SIZE1 +#endif + +#define DGST_R0 0 +#define DGST_R1 1 +#define DGST_R2 2 +#define DGST_R3 3 + +#include "include/kernel_functions.c" +#include "types_nv.c" +#include "common_nv.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#define PUTCHAR64_BE(a,p,c) ((u8 *)(a))[(p) ^ 7] = (u8) (c) +#define GETCHAR64_BE(a,p) ((u8 *)(a))[(p) ^ 7] + +typedef struct +{ + u64x state[8]; + u64x buf[16]; + int len; + +} sha512_ctx_t; + +__device__ __constant__ u64 k_sha512[80] = +{ + SHA512C00, SHA512C01, SHA512C02, SHA512C03, + SHA512C04, SHA512C05, SHA512C06, SHA512C07, + SHA512C08, SHA512C09, SHA512C0a, SHA512C0b, + SHA512C0c, SHA512C0d, SHA512C0e, SHA512C0f, + SHA512C10, SHA512C11, SHA512C12, SHA512C13, + SHA512C14, SHA512C15, SHA512C16, SHA512C17, + SHA512C18, SHA512C19, SHA512C1a, SHA512C1b, + SHA512C1c, SHA512C1d, SHA512C1e, SHA512C1f, + SHA512C20, SHA512C21, SHA512C22, SHA512C23, + SHA512C24, SHA512C25, SHA512C26, SHA512C27, + SHA512C28, SHA512C29, SHA512C2a, SHA512C2b, + SHA512C2c, SHA512C2d, SHA512C2e, SHA512C2f, + SHA512C30, SHA512C31, SHA512C32, SHA512C33, + SHA512C34, SHA512C35, SHA512C36, SHA512C37, + SHA512C38, SHA512C39, SHA512C3a, SHA512C3b, + SHA512C3c, SHA512C3d, SHA512C3e, SHA512C3f, + SHA512C40, SHA512C41, SHA512C42, SHA512C43, + SHA512C44, SHA512C45, SHA512C46, SHA512C47, + SHA512C48, SHA512C49, SHA512C4a, SHA512C4b, + SHA512C4c, SHA512C4d, SHA512C4e, SHA512C4f, +}; + +__device__ static void sha512_transform (const u64x w[16], u64x digest[8]) +{ + u64x w0_t = w[ 0]; + u64x w1_t = w[ 1]; + u64x w2_t = w[ 2]; + u64x w3_t = w[ 3]; + u64x w4_t = w[ 4]; + u64x w5_t = w[ 5]; + u64x w6_t = w[ 6]; + u64x w7_t = w[ 7]; + u64x w8_t = w[ 8]; + u64x w9_t = w[ 9]; + u64x wa_t = w[10]; + u64x wb_t = w[11]; + u64x wc_t = w[12]; + u64x wd_t = w[13]; + u64x we_t = w[14]; + u64x wf_t = w[15]; + + u64x a = digest[0]; + u64x b = digest[1]; + u64x c = digest[2]; + u64x d = digest[3]; + u64x e = digest[4]; + u64x f = digest[5]; + u64x g = digest[6]; + u64x h = digest[7]; + + #define ROUND_EXPAND() \ + { \ + w0_t = SHA512_EXPAND (we_t, w9_t, w1_t, w0_t); \ + w1_t = SHA512_EXPAND (wf_t, wa_t, w2_t, w1_t); \ + w2_t = SHA512_EXPAND (w0_t, wb_t, w3_t, w2_t); \ + w3_t = SHA512_EXPAND (w1_t, wc_t, w4_t, w3_t); \ + w4_t = SHA512_EXPAND (w2_t, wd_t, w5_t, w4_t); \ + w5_t = SHA512_EXPAND (w3_t, we_t, w6_t, w5_t); \ + w6_t = SHA512_EXPAND (w4_t, wf_t, w7_t, w6_t); \ + w7_t = SHA512_EXPAND (w5_t, w0_t, w8_t, w7_t); \ + w8_t = SHA512_EXPAND (w6_t, w1_t, w9_t, w8_t); \ + w9_t = SHA512_EXPAND (w7_t, w2_t, wa_t, w9_t); \ + wa_t = SHA512_EXPAND (w8_t, w3_t, wb_t, wa_t); \ + wb_t = SHA512_EXPAND (w9_t, w4_t, wc_t, wb_t); \ + wc_t = SHA512_EXPAND (wa_t, w5_t, wd_t, wc_t); \ + wd_t = SHA512_EXPAND (wb_t, w6_t, we_t, wd_t); \ + we_t = SHA512_EXPAND (wc_t, w7_t, wf_t, we_t); \ + wf_t = SHA512_EXPAND (wd_t, w8_t, w0_t, wf_t); \ + } + + #define ROUND_STEP(i) \ + { \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, a, b, c, d, e, f, g, h, w0_t, k_sha512[i + 0]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, h, a, b, c, d, e, f, g, w1_t, k_sha512[i + 1]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, g, h, a, b, c, d, e, f, w2_t, k_sha512[i + 2]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, f, g, h, a, b, c, d, e, w3_t, k_sha512[i + 3]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, e, f, g, h, a, b, c, d, w4_t, k_sha512[i + 4]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, d, e, f, g, h, a, b, c, w5_t, k_sha512[i + 5]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, c, d, e, f, g, h, a, b, w6_t, k_sha512[i + 6]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, b, c, d, e, f, g, h, a, w7_t, k_sha512[i + 7]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, a, b, c, d, e, f, g, h, w8_t, k_sha512[i + 8]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, h, a, b, c, d, e, f, g, w9_t, k_sha512[i + 9]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, g, h, a, b, c, d, e, f, wa_t, k_sha512[i + 10]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, f, g, h, a, b, c, d, e, wb_t, k_sha512[i + 11]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, e, f, g, h, a, b, c, d, wc_t, k_sha512[i + 12]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, d, e, f, g, h, a, b, c, wd_t, k_sha512[i + 13]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, c, d, e, f, g, h, a, b, we_t, k_sha512[i + 14]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, b, c, d, e, f, g, h, a, wf_t, k_sha512[i + 15]); \ + } + + ROUND_STEP (0); + + for (int i = 16; i < 80; i += 16) + { + ROUND_EXPAND (); ROUND_STEP (i); + } + + digest[0] += a; + digest[1] += b; + digest[2] += c; + digest[3] += d; + digest[4] += e; + digest[5] += f; + digest[6] += g; + digest[7] += h; +} + +__device__ static void sha512_init (sha512_ctx_t *sha512_ctx) +{ + sha512_ctx->state[0] = SHA512M_A; + sha512_ctx->state[1] = SHA512M_B; + sha512_ctx->state[2] = SHA512M_C; + sha512_ctx->state[3] = SHA512M_D; + sha512_ctx->state[4] = SHA512M_E; + sha512_ctx->state[5] = SHA512M_F; + sha512_ctx->state[6] = SHA512M_G; + sha512_ctx->state[7] = SHA512M_H; + + sha512_ctx->len = 0; +} + +__device__ static void sha512_update (sha512_ctx_t *sha512_ctx, const u64x *buf, int len) +{ + int pos = sha512_ctx->len & 0x7f; + + sha512_ctx->len += len; + + if ((pos + len) < 128) + { + for (int i = 0; i < len; i++) + { + PUTCHAR64_BE (sha512_ctx->buf, pos++, GETCHAR64_BE (buf, i)); + } + + return; + } + + int cnt = 128 - pos; + + for (int i = 0; i < cnt; i++) + { + PUTCHAR64_BE (sha512_ctx->buf, pos++, GETCHAR64_BE (buf, i)); + } + + sha512_transform (sha512_ctx->buf, sha512_ctx->state); + + len -= cnt; + + for (int i = 0; i < len; i++) + { + PUTCHAR64_BE (sha512_ctx->buf, i, GETCHAR64_BE (buf, cnt + i)); + } +} + +__device__ static void sha512_final (sha512_ctx_t *sha512_ctx) +{ + int pos = sha512_ctx->len & 0x7f; + + for (int i = pos; i < 128; i++) + { + PUTCHAR64_BE (sha512_ctx->buf, i, 0); + } + + PUTCHAR64_BE (sha512_ctx->buf, pos, 0x80); + + if (pos >= 112) + { + sha512_transform (sha512_ctx->buf, sha512_ctx->state); + + sha512_ctx->buf[ 0] = 0; + sha512_ctx->buf[ 1] = 0; + sha512_ctx->buf[ 2] = 0; + sha512_ctx->buf[ 3] = 0; + sha512_ctx->buf[ 4] = 0; + sha512_ctx->buf[ 5] = 0; + sha512_ctx->buf[ 6] = 0; + sha512_ctx->buf[ 7] = 0; + sha512_ctx->buf[ 8] = 0; + sha512_ctx->buf[ 9] = 0; + sha512_ctx->buf[10] = 0; + sha512_ctx->buf[11] = 0; + sha512_ctx->buf[12] = 0; + sha512_ctx->buf[13] = 0; + sha512_ctx->buf[14] = 0; + sha512_ctx->buf[15] = 0; + } + + sha512_ctx->buf[15] = sha512_ctx->len * 8; + + sha512_transform (sha512_ctx->buf, sha512_ctx->state); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m01800_init (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, sha512crypt_tmp_t *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[0]; + w0[1] = pws[gid].i[1]; + w0[2] = pws[gid].i[2]; + w0[3] = pws[gid].i[3]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * salt + */ + + u32 salt_buf[4]; + + salt_buf[0] = salt_bufs[salt_pos].salt_buf[0]; + salt_buf[1] = salt_bufs[salt_pos].salt_buf[1]; + salt_buf[2] = salt_bufs[salt_pos].salt_buf[2]; + salt_buf[3] = salt_bufs[salt_pos].salt_buf[3]; + + u32 salt_len = salt_bufs[salt_pos].salt_len; + + /** + * buffers + */ + + u64x pw[2]; + + pw[0] = swap_workaround (hl32_to_64 (w0[1], w0[0])); + pw[1] = swap_workaround (hl32_to_64 (w0[3], w0[2])); + + u64x salt[2]; + + salt[0] = swap_workaround (hl32_to_64 (salt_buf[1], salt_buf[0])); + salt[1] = swap_workaround (hl32_to_64 (salt_buf[3], salt_buf[2])); + + /** + * begin + */ + + sha512_ctx_t sha512_ctx; + + sha512_init (&sha512_ctx); + + sha512_update (&sha512_ctx, pw, pw_len); + sha512_update (&sha512_ctx, salt, salt_len); + sha512_update (&sha512_ctx, pw, pw_len); + + sha512_final (&sha512_ctx); + + u64x tmp[8]; + + tmp[0] = sha512_ctx.state[0]; + tmp[1] = sha512_ctx.state[1]; + tmp[2] = sha512_ctx.state[2]; + tmp[3] = sha512_ctx.state[3]; + tmp[4] = sha512_ctx.state[4]; + tmp[5] = sha512_ctx.state[5]; + tmp[6] = sha512_ctx.state[6]; + tmp[7] = sha512_ctx.state[7]; + + sha512_init (&sha512_ctx); + + sha512_update (&sha512_ctx, pw, pw_len); + sha512_update (&sha512_ctx, salt, salt_len); + sha512_update (&sha512_ctx, tmp, pw_len); + + for (u32 j = pw_len; j; j >>= 1) + { + if (j & 1) + { + sha512_update (&sha512_ctx, tmp, 64); + } + else + { + sha512_update (&sha512_ctx, pw, pw_len); + } + } + + sha512_final (&sha512_ctx); + + tmps[gid].l_alt_result[0] = sha512_ctx.state[0]; + tmps[gid].l_alt_result[1] = sha512_ctx.state[1]; + tmps[gid].l_alt_result[2] = sha512_ctx.state[2]; + tmps[gid].l_alt_result[3] = sha512_ctx.state[3]; + tmps[gid].l_alt_result[4] = sha512_ctx.state[4]; + tmps[gid].l_alt_result[5] = sha512_ctx.state[5]; + tmps[gid].l_alt_result[6] = sha512_ctx.state[6]; + tmps[gid].l_alt_result[7] = sha512_ctx.state[7]; + + // p_bytes + + sha512_init (&sha512_ctx); + + for (u32 j = 0; j < pw_len; j++) + { + sha512_update (&sha512_ctx, pw, pw_len); + } + + sha512_final (&sha512_ctx); + + tmps[gid].l_p_bytes[0] = sha512_ctx.state[0]; + tmps[gid].l_p_bytes[1] = sha512_ctx.state[1]; + + // s_bytes + + sha512_init (&sha512_ctx); + + for (u32 j = 0; j < 16 + ((tmps[gid].l_alt_result[0] >> 56) & 0xff); j++) + { + sha512_update (&sha512_ctx, salt, salt_len); + } + + sha512_final (&sha512_ctx); + + tmps[gid].l_s_bytes[0] = sha512_ctx.state[0]; + tmps[gid].l_s_bytes[1] = sha512_ctx.state[1]; +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m01800_loop (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, sha512crypt_tmp_t *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + + u64x l_p_bytes0[2]; + + l_p_bytes0[0] = tmps[gid].l_p_bytes[0]; + l_p_bytes0[1] = tmps[gid].l_p_bytes[1]; + + const u32 pw_len = pws[gid].pw_len; + + u64x l_s_bytes0[2]; + + l_s_bytes0[0] = tmps[gid].l_s_bytes[0]; + l_s_bytes0[1] = tmps[gid].l_s_bytes[1]; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + u32 wpc_len[8]; + + wpc_len[0] = 64 + 0 + 0 + pw_len; + wpc_len[1] = pw_len + 0 + 0 + 64; + wpc_len[2] = 64 + salt_len + 0 + pw_len; + wpc_len[3] = pw_len + salt_len + 0 + 64; + wpc_len[4] = 64 + 0 + pw_len + pw_len; + wpc_len[5] = pw_len + 0 + pw_len + 64; + wpc_len[6] = 64 + salt_len + pw_len + pw_len; + wpc_len[7] = pw_len + salt_len + pw_len + 64; + + u64 wpc[8][16] = { 0 }; + + for (u32 i = 0; i < 8; i++) + { + u32 block_len = 0; + + if (i & 1) + { + for (u32 j = 0; j < pw_len; j++) + { + PUTCHAR64_BE (wpc[i], block_len++, GETCHAR64_BE (l_p_bytes0, j)); + } + } + else + { + block_len += 64; + } + + if (i & 2) + { + for (u32 j = 0; j < salt_len; j++) + { + PUTCHAR64_BE (wpc[i], block_len++, GETCHAR64_BE (l_s_bytes0, j)); + } + } + + if (i & 4) + { + for (u32 j = 0; j < pw_len; j++) + { + PUTCHAR64_BE (wpc[i], block_len++, GETCHAR64_BE (l_p_bytes0, j)); + } + } + + if (i & 1) + { + block_len += 64; + } + else + { + for (u32 j = 0; j < pw_len; j++) + { + PUTCHAR64_BE (wpc[i], block_len++, GETCHAR64_BE (l_p_bytes0, j)); + } + } + + PUTCHAR64_BE (wpc[i], block_len, 0x80); + + wpc[i][15] = block_len * 8; + } + + /** + * base + */ + + u64x l_alt_result[8]; + + l_alt_result[0] = tmps[gid].l_alt_result[0]; + l_alt_result[1] = tmps[gid].l_alt_result[1]; + l_alt_result[2] = tmps[gid].l_alt_result[2]; + l_alt_result[3] = tmps[gid].l_alt_result[3]; + l_alt_result[4] = tmps[gid].l_alt_result[4]; + l_alt_result[5] = tmps[gid].l_alt_result[5]; + l_alt_result[6] = tmps[gid].l_alt_result[6]; + l_alt_result[7] = tmps[gid].l_alt_result[7]; + + + /* Repeatedly run the collected hash value through SHA512 to burn + CPU cycles. */ + + for (u32 i = 0, j = loop_pos; i < loop_cnt; i++, j++) + { + const u32 j1 = (j & 1) ? 1 : 0; + const u32 j3 = (j % 3) ? 2 : 0; + const u32 j7 = (j % 7) ? 4 : 0; + + const u32 pc = j1 + j3 + j7; + + u64 block[16]; + + block[ 0] = wpc[pc][ 0]; + block[ 1] = wpc[pc][ 1]; + block[ 2] = wpc[pc][ 2]; + block[ 3] = wpc[pc][ 3]; + block[ 4] = wpc[pc][ 4]; + block[ 5] = wpc[pc][ 5]; + block[ 6] = wpc[pc][ 6]; + block[ 7] = wpc[pc][ 7]; + block[ 8] = wpc[pc][ 8]; + block[ 9] = wpc[pc][ 9]; + block[10] = wpc[pc][10]; + block[11] = wpc[pc][11]; + block[12] = wpc[pc][12]; + block[13] = wpc[pc][13]; + block[14] = wpc[pc][14]; + block[15] = wpc[pc][15]; + + if (j1) + { + const u32 block_len = wpc_len[pc]; + + #pragma unroll 64 + for (u32 k = 0, p = block_len - 64; k < 64; k++, p++) + { + PUTCHAR64_BE (block, p, GETCHAR64_BE (l_alt_result, k)); + } + } + else + { + block[0] = l_alt_result[0]; + block[1] = l_alt_result[1]; + block[2] = l_alt_result[2]; + block[3] = l_alt_result[3]; + block[4] = l_alt_result[4]; + block[5] = l_alt_result[5]; + block[6] = l_alt_result[6]; + block[7] = l_alt_result[7]; + } + + l_alt_result[0] = SHA512M_A; + l_alt_result[1] = SHA512M_B; + l_alt_result[2] = SHA512M_C; + l_alt_result[3] = SHA512M_D; + l_alt_result[4] = SHA512M_E; + l_alt_result[5] = SHA512M_F; + l_alt_result[6] = SHA512M_G; + l_alt_result[7] = SHA512M_H; + + sha512_transform (block, l_alt_result); + } + + tmps[gid].l_alt_result[0] = l_alt_result[0]; + tmps[gid].l_alt_result[1] = l_alt_result[1]; + tmps[gid].l_alt_result[2] = l_alt_result[2]; + tmps[gid].l_alt_result[3] = l_alt_result[3]; + tmps[gid].l_alt_result[4] = l_alt_result[4]; + tmps[gid].l_alt_result[5] = l_alt_result[5]; + tmps[gid].l_alt_result[6] = l_alt_result[6]; + tmps[gid].l_alt_result[7] = l_alt_result[7]; +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m01800_comp (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, sha512crypt_tmp_t *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + const u32 lid = threadIdx.x; + + const u64x a = swap_workaround (tmps[gid].l_alt_result[0]); + const u64x b = swap_workaround (tmps[gid].l_alt_result[1]); + + const u32x r0 = l32_from_64 (a); + const u32x r1 = h32_from_64 (a); + const u32x r2 = l32_from_64 (b); + const u32x r3 = h32_from_64 (b); + + #define il_pos 0 + + #include VECT_COMPARE_M +} diff --git a/nv/m02100.cu b/nv/m02100.cu new file mode 100644 index 0000000000..8540592846 --- /dev/null +++ b/nv/m02100.cu @@ -0,0 +1,629 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _DCC2_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW2 +#define VECT_SIZE1 +#endif + +#define DGST_R0 0 +#define DGST_R1 1 +#define DGST_R2 2 +#define DGST_R3 3 + +#include "include/kernel_functions.c" +#include "types_nv.c" +#include "common_nv.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +__device__ static void md4_transform (const u32x w0[4], const u32x w1[4], const u32x w2[4], const u32x w3[4], u32x digest[4]) +{ + u32x a = digest[0]; + u32x b = digest[1]; + u32x c = digest[2]; + u32x d = digest[3]; + + MD4_STEP (MD4_Fo, a, b, c, d, w0[0], MD4C00, MD4S00); + MD4_STEP (MD4_Fo, d, a, b, c, w0[1], MD4C00, MD4S01); + MD4_STEP (MD4_Fo, c, d, a, b, w0[2], MD4C00, MD4S02); + MD4_STEP (MD4_Fo, b, c, d, a, w0[3], MD4C00, MD4S03); + MD4_STEP (MD4_Fo, a, b, c, d, w1[0], MD4C00, MD4S00); + MD4_STEP (MD4_Fo, d, a, b, c, w1[1], MD4C00, MD4S01); + MD4_STEP (MD4_Fo, c, d, a, b, w1[2], MD4C00, MD4S02); + MD4_STEP (MD4_Fo, b, c, d, a, w1[3], MD4C00, MD4S03); + MD4_STEP (MD4_Fo, a, b, c, d, w2[0], MD4C00, MD4S00); + MD4_STEP (MD4_Fo, d, a, b, c, w2[1], MD4C00, MD4S01); + MD4_STEP (MD4_Fo, c, d, a, b, w2[2], MD4C00, MD4S02); + MD4_STEP (MD4_Fo, b, c, d, a, w2[3], MD4C00, MD4S03); + MD4_STEP (MD4_Fo, a, b, c, d, w3[0], MD4C00, MD4S00); + MD4_STEP (MD4_Fo, d, a, b, c, w3[1], MD4C00, MD4S01); + MD4_STEP (MD4_Fo, c, d, a, b, w3[2], MD4C00, MD4S02); + MD4_STEP (MD4_Fo, b, c, d, a, w3[3], MD4C00, MD4S03); + + MD4_STEP (MD4_Go, a, b, c, d, w0[0], MD4C01, MD4S10); + MD4_STEP (MD4_Go, d, a, b, c, w1[0], MD4C01, MD4S11); + MD4_STEP (MD4_Go, c, d, a, b, w2[0], MD4C01, MD4S12); + MD4_STEP (MD4_Go, b, c, d, a, w3[0], MD4C01, MD4S13); + MD4_STEP (MD4_Go, a, b, c, d, w0[1], MD4C01, MD4S10); + MD4_STEP (MD4_Go, d, a, b, c, w1[1], MD4C01, MD4S11); + MD4_STEP (MD4_Go, c, d, a, b, w2[1], MD4C01, MD4S12); + MD4_STEP (MD4_Go, b, c, d, a, w3[1], MD4C01, MD4S13); + MD4_STEP (MD4_Go, a, b, c, d, w0[2], MD4C01, MD4S10); + MD4_STEP (MD4_Go, d, a, b, c, w1[2], MD4C01, MD4S11); + MD4_STEP (MD4_Go, c, d, a, b, w2[2], MD4C01, MD4S12); + MD4_STEP (MD4_Go, b, c, d, a, w3[2], MD4C01, MD4S13); + MD4_STEP (MD4_Go, a, b, c, d, w0[3], MD4C01, MD4S10); + MD4_STEP (MD4_Go, d, a, b, c, w1[3], MD4C01, MD4S11); + MD4_STEP (MD4_Go, c, d, a, b, w2[3], MD4C01, MD4S12); + MD4_STEP (MD4_Go, b, c, d, a, w3[3], MD4C01, MD4S13); + + MD4_STEP (MD4_H , a, b, c, d, w0[0], MD4C02, MD4S20); + MD4_STEP (MD4_H , d, a, b, c, w2[0], MD4C02, MD4S21); + MD4_STEP (MD4_H , c, d, a, b, w1[0], MD4C02, MD4S22); + MD4_STEP (MD4_H , b, c, d, a, w3[0], MD4C02, MD4S23); + MD4_STEP (MD4_H , a, b, c, d, w0[2], MD4C02, MD4S20); + MD4_STEP (MD4_H , d, a, b, c, w2[2], MD4C02, MD4S21); + MD4_STEP (MD4_H , c, d, a, b, w1[2], MD4C02, MD4S22); + MD4_STEP (MD4_H , b, c, d, a, w3[2], MD4C02, MD4S23); + MD4_STEP (MD4_H , a, b, c, d, w0[1], MD4C02, MD4S20); + MD4_STEP (MD4_H , d, a, b, c, w2[1], MD4C02, MD4S21); + MD4_STEP (MD4_H , c, d, a, b, w1[1], MD4C02, MD4S22); + MD4_STEP (MD4_H , b, c, d, a, w3[1], MD4C02, MD4S23); + MD4_STEP (MD4_H , a, b, c, d, w0[3], MD4C02, MD4S20); + MD4_STEP (MD4_H , d, a, b, c, w2[3], MD4C02, MD4S21); + MD4_STEP (MD4_H , c, d, a, b, w1[3], MD4C02, MD4S22); + MD4_STEP (MD4_H , b, c, d, a, w3[3], MD4C02, MD4S23); + + digest[0] += a; + digest[1] += b; + digest[2] += c; + digest[3] += d; +} + +__device__ static void sha1_transform (const u32x w0[4], const u32x w1[4], const u32x w2[4], const u32x w3[4], u32x digest[5]) +{ + u32x A = digest[0]; + u32x B = digest[1]; + u32x C = digest[2]; + u32x D = digest[3]; + u32x E = digest[4]; + + u32x w0_t = w0[0]; + u32x w1_t = w0[1]; + u32x w2_t = w0[2]; + u32x w3_t = w0[3]; + u32x w4_t = w1[0]; + u32x w5_t = w1[1]; + u32x w6_t = w1[2]; + u32x w7_t = w1[3]; + u32x w8_t = w2[0]; + u32x w9_t = w2[1]; + u32x wa_t = w2[2]; + u32x wb_t = w2[3]; + u32x wc_t = w3[0]; + u32x wd_t = w3[1]; + u32x we_t = w3[2]; + u32x wf_t = w3[3]; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, A, B, C, D, E, w0_t); + SHA1_STEP (SHA1_F0o, E, A, B, C, D, w1_t); + SHA1_STEP (SHA1_F0o, D, E, A, B, C, w2_t); + SHA1_STEP (SHA1_F0o, C, D, E, A, B, w3_t); + SHA1_STEP (SHA1_F0o, B, C, D, E, A, w4_t); + SHA1_STEP (SHA1_F0o, A, B, C, D, E, w5_t); + SHA1_STEP (SHA1_F0o, E, A, B, C, D, w6_t); + SHA1_STEP (SHA1_F0o, D, E, A, B, C, w7_t); + SHA1_STEP (SHA1_F0o, C, D, E, A, B, w8_t); + SHA1_STEP (SHA1_F0o, B, C, D, E, A, w9_t); + SHA1_STEP (SHA1_F0o, A, B, C, D, E, wa_t); + SHA1_STEP (SHA1_F0o, E, A, B, C, D, wb_t); + SHA1_STEP (SHA1_F0o, D, E, A, B, C, wc_t); + SHA1_STEP (SHA1_F0o, C, D, E, A, B, wd_t); + SHA1_STEP (SHA1_F0o, B, C, D, E, A, we_t); + SHA1_STEP (SHA1_F0o, A, B, C, D, E, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F0o, E, A, B, C, D, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F0o, D, E, A, B, C, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F0o, C, D, E, A, B, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F0o, B, C, D, E, A, w3_t); + + #undef K + #define K SHA1C01 + + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w7_t); + + #undef K + #define K SHA1C02 + + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, wb_t); + + #undef K + #define K SHA1C03 + + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, wf_t); + + digest[0] += A; + digest[1] += B; + digest[2] += C; + digest[3] += D; + digest[4] += E; +} + +__device__ static void hmac_sha1_pad (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], u32x ipad[5], u32x opad[5]) +{ + w0[0] = w0[0] ^ 0x36363636; + w0[1] = w0[1] ^ 0x36363636; + w0[2] = w0[2] ^ 0x36363636; + w0[3] = w0[3] ^ 0x36363636; + w1[0] = w1[0] ^ 0x36363636; + w1[1] = w1[1] ^ 0x36363636; + w1[2] = w1[2] ^ 0x36363636; + w1[3] = w1[3] ^ 0x36363636; + w2[0] = w2[0] ^ 0x36363636; + w2[1] = w2[1] ^ 0x36363636; + w2[2] = w2[2] ^ 0x36363636; + w2[3] = w2[3] ^ 0x36363636; + w3[0] = w3[0] ^ 0x36363636; + w3[1] = w3[1] ^ 0x36363636; + w3[2] = w3[2] ^ 0x36363636; + w3[3] = w3[3] ^ 0x36363636; + + ipad[0] = SHA1M_A; + ipad[1] = SHA1M_B; + ipad[2] = SHA1M_C; + ipad[3] = SHA1M_D; + ipad[4] = SHA1M_E; + + sha1_transform (w0, w1, w2, w3, ipad); + + w0[0] = w0[0] ^ 0x6a6a6a6a; + w0[1] = w0[1] ^ 0x6a6a6a6a; + w0[2] = w0[2] ^ 0x6a6a6a6a; + w0[3] = w0[3] ^ 0x6a6a6a6a; + w1[0] = w1[0] ^ 0x6a6a6a6a; + w1[1] = w1[1] ^ 0x6a6a6a6a; + w1[2] = w1[2] ^ 0x6a6a6a6a; + w1[3] = w1[3] ^ 0x6a6a6a6a; + w2[0] = w2[0] ^ 0x6a6a6a6a; + w2[1] = w2[1] ^ 0x6a6a6a6a; + w2[2] = w2[2] ^ 0x6a6a6a6a; + w2[3] = w2[3] ^ 0x6a6a6a6a; + w3[0] = w3[0] ^ 0x6a6a6a6a; + w3[1] = w3[1] ^ 0x6a6a6a6a; + w3[2] = w3[2] ^ 0x6a6a6a6a; + w3[3] = w3[3] ^ 0x6a6a6a6a; + + opad[0] = SHA1M_A; + opad[1] = SHA1M_B; + opad[2] = SHA1M_C; + opad[3] = SHA1M_D; + opad[4] = SHA1M_E; + + sha1_transform (w0, w1, w2, w3, opad); +} + +__device__ static void hmac_sha1_run (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], u32x ipad[5], u32x opad[5], u32x digest[5]) +{ + digest[0] = ipad[0]; + digest[1] = ipad[1]; + digest[2] = ipad[2]; + digest[3] = ipad[3]; + digest[4] = ipad[4]; + + sha1_transform (w0, w1, w2, w3, digest); + + w0[0] = digest[0]; + w0[1] = digest[1]; + w0[2] = digest[2]; + w0[3] = digest[3]; + w1[0] = digest[4]; + w1[1] = 0x80000000; + w1[2] = 0; + w1[3] = 0; + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = (64 + 20) * 8; + + digest[0] = opad[0]; + digest[1] = opad[1]; + digest[2] = opad[2]; + digest[3] = opad[3]; + digest[4] = opad[4]; + + sha1_transform (w0, w1, w2, w3, digest); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m02100_init (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, dcc2_tmp_t *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * salt + */ + + u32 salt_len = salt_bufs[salt_pos].salt_len; + + u32 salt_buf0[4]; + u32 salt_buf1[4]; + u32 salt_buf2[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[3]; + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[7]; + salt_buf2[0] = salt_bufs[salt_pos].salt_buf[8]; + salt_buf2[1] = salt_bufs[salt_pos].salt_buf[9]; + salt_buf2[2] = 0; + salt_buf2[3] = 0; + + /** + * generate dcc + */ + + append_0x80_1 (w0, pw_len); + + make_unicode (w0, w0, w1); + + w3[2] = pw_len * 2 * 8; + + u32x digest_md4[4]; + + digest_md4[0] = MD4M_A; + digest_md4[1] = MD4M_B; + digest_md4[2] = MD4M_C; + digest_md4[3] = MD4M_D; + + md4_transform (w0, w1, w2, w3, digest_md4); + + w0[0] = digest_md4[0]; + w0[1] = digest_md4[1]; + w0[2] = digest_md4[2]; + w0[3] = digest_md4[3]; + w1[0] = salt_buf0[0]; + w1[1] = salt_buf0[1]; + w1[2] = salt_buf0[2]; + w1[3] = salt_buf0[3]; + w2[0] = salt_buf1[0]; + w2[1] = salt_buf1[1]; + w2[2] = salt_buf1[2]; + w2[3] = salt_buf1[3]; + w3[0] = salt_buf2[0]; + w3[1] = salt_buf2[1]; + w3[2] = (16 + salt_len) * 8; + w3[3] = 0; + + append_0x80_4 (w0, w1, w2, w3, 16 + salt_len); + + digest_md4[0] = MD4M_A; + digest_md4[1] = MD4M_B; + digest_md4[2] = MD4M_C; + digest_md4[3] = MD4M_D; + + md4_transform (w0, w1, w2, w3, digest_md4); + + /** + * pads + */ + + w0[0] = swap_workaround (digest_md4[0]); + w0[1] = swap_workaround (digest_md4[1]); + w0[2] = swap_workaround (digest_md4[2]); + w0[3] = swap_workaround (digest_md4[3]); + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + u32x ipad[5]; + u32x opad[5]; + + hmac_sha1_pad (w0, w1, w2, w3, ipad, opad); + + tmps[gid].ipad[0] = ipad[0]; + tmps[gid].ipad[1] = ipad[1]; + tmps[gid].ipad[2] = ipad[2]; + tmps[gid].ipad[3] = ipad[3]; + tmps[gid].ipad[4] = ipad[4]; + + tmps[gid].opad[0] = opad[0]; + tmps[gid].opad[1] = opad[1]; + tmps[gid].opad[2] = opad[2]; + tmps[gid].opad[3] = opad[3]; + tmps[gid].opad[4] = opad[4]; + + /** + * hmac1 + */ + + w0[0] = salt_buf0[0]; + w0[1] = salt_buf0[1]; + w0[2] = salt_buf0[2]; + w0[3] = salt_buf0[3]; + w1[0] = salt_buf1[0]; + w1[1] = salt_buf1[1]; + w1[2] = salt_buf1[2]; + w1[3] = salt_buf1[3]; + w2[0] = salt_buf2[0]; + w2[1] = salt_buf2[1]; + w2[2] = 0; + w2[3] = 0; + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = (64 + salt_len + 4) * 8; + + append_0x01_4 (w0, w1, w2, w3, salt_len + 3); + append_0x80_4 (w0, w1, w2, w3, salt_len + 4); + + w0[0] = swap_workaround (w0[0]); + w0[1] = swap_workaround (w0[1]); + w0[2] = swap_workaround (w0[2]); + w0[3] = swap_workaround (w0[3]); + w1[0] = swap_workaround (w1[0]); + w1[1] = swap_workaround (w1[1]); + w1[2] = swap_workaround (w1[2]); + w1[3] = swap_workaround (w1[3]); + w2[0] = swap_workaround (w2[0]); + w2[1] = swap_workaround (w2[1]); + w2[2] = swap_workaround (w2[2]); + w2[3] = swap_workaround (w2[3]); + w3[0] = swap_workaround (w3[0]); + w3[1] = swap_workaround (w3[1]); + + u32x digest[5]; + + hmac_sha1_run (w0, w1, w2, w3, ipad, opad, digest); + + tmps[gid].dgst[0] = digest[0]; + tmps[gid].dgst[1] = digest[1]; + tmps[gid].dgst[2] = digest[2]; + tmps[gid].dgst[3] = digest[3]; + tmps[gid].dgst[4] = digest[4]; + + tmps[gid].out[0] = digest[0]; + tmps[gid].out[1] = digest[1]; + tmps[gid].out[2] = digest[2]; + tmps[gid].out[3] = digest[3]; +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m02100_loop (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, dcc2_tmp_t *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x ipad[5]; + u32x opad[5]; + + ipad[0] = tmps[gid].ipad[0]; + ipad[1] = tmps[gid].ipad[1]; + ipad[2] = tmps[gid].ipad[2]; + ipad[3] = tmps[gid].ipad[3]; + ipad[4] = tmps[gid].ipad[4]; + + opad[0] = tmps[gid].opad[0]; + opad[1] = tmps[gid].opad[1]; + opad[2] = tmps[gid].opad[2]; + opad[3] = tmps[gid].opad[3]; + opad[4] = tmps[gid].opad[4]; + + /** + * iter1 + */ + + u32x dgst[5]; + u32x out[4]; + + dgst[0] = tmps[gid].dgst[0]; + dgst[1] = tmps[gid].dgst[1]; + dgst[2] = tmps[gid].dgst[2]; + dgst[3] = tmps[gid].dgst[3]; + dgst[4] = tmps[gid].dgst[4]; + + out[0] = tmps[gid].out[0]; + out[1] = tmps[gid].out[1]; + out[2] = tmps[gid].out[2]; + out[3] = tmps[gid].out[3]; + + for (u32 i = 0; i < loop_cnt; i++) + { + u32x w0[4]; + u32x w1[4]; + u32x w2[4]; + u32x w3[4]; + + w0[0] = dgst[0]; + w0[1] = dgst[1]; + w0[2] = dgst[2]; + w0[3] = dgst[3]; + w1[0] = dgst[4]; + w1[1] = 0x80000000; + w1[2] = 0; + w1[3] = 0; + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = (64 + 20) * 8; + + hmac_sha1_run (w0, w1, w2, w3, ipad, opad, dgst); + + out[0] ^= dgst[0]; + out[1] ^= dgst[1]; + out[2] ^= dgst[2]; + out[3] ^= dgst[3]; + } + + tmps[gid].dgst[0] = dgst[0]; + tmps[gid].dgst[1] = dgst[1]; + tmps[gid].dgst[2] = dgst[2]; + tmps[gid].dgst[3] = dgst[3]; + tmps[gid].dgst[4] = dgst[4]; + + tmps[gid].out[0] = out[0]; + tmps[gid].out[1] = out[1]; + tmps[gid].out[2] = out[2]; + tmps[gid].out[3] = out[3]; +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m02100_comp (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, dcc2_tmp_t *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + const u32 lid = threadIdx.x; + + const u32x r0 = tmps[gid].out[DGST_R0]; + const u32x r1 = tmps[gid].out[DGST_R1]; + const u32x r2 = tmps[gid].out[DGST_R2]; + const u32x r3 = tmps[gid].out[DGST_R3]; + + #define il_pos 0 + + #include VECT_COMPARE_M +} diff --git a/nv/m02400_a0.cu b/nv/m02400_a0.cu new file mode 100644 index 0000000000..838cfeb191 --- /dev/null +++ b/nv/m02400_a0.cu @@ -0,0 +1,388 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _MD5_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW2 +#define VECT_SIZE1 +#endif + +#define DGST_R0 0 +#define DGST_R1 3 +#define DGST_R2 2 +#define DGST_R3 1 + +#include "include/kernel_functions.c" +#include "types_nv.c" +#include "common_nv.c" +#include "include/rp_gpu.h" +#include "rp_nv.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +__device__ __constant__ gpu_rule_t c_rules[1024]; + +extern "C" __global__ void __launch_bounds__ (256, 1) m02400_m04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + + w0[0] = pw_buf0[0]; + w0[1] = pw_buf0[1]; + w0[2] = pw_buf0[2]; + w0[3] = pw_buf0[3]; + + u32x w1[4]; + + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 out_len = apply_rules (c_rules[il_pos].cmds, w0, w1, pw_len); + + truncate_block (w0, out_len); + + w1[0] = 0x80; + w3[2] = 16 * 8; + + u32x tmp2; + + u32x a = MD5M_A; + u32x b = MD5M_B; + u32x c = MD5M_C; + u32x d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H1, a, b, c, d, w1[1], MD5C20, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w2[0], MD5C21, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w2[3], MD5C22, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w3[2], MD5C23, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w0[1], MD5C24, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w1[0], MD5C25, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w1[3], MD5C26, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w2[2], MD5C27, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w3[1], MD5C28, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w0[0], MD5C29, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w0[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w1[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w2[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w3[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w3[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w0[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1[0], MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w2[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2[1], MD5C3f, MD5S33); + + a &= 0x00ffffff; + d &= 0x00ffffff; + c &= 0x00ffffff; + b &= 0x00ffffff; + + const u32x r0 = a; + const u32x r1 = d; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_M + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m02400_m08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m02400_m16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m02400_s04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + + w0[0] = pw_buf0[0]; + w0[1] = pw_buf0[1]; + w0[2] = pw_buf0[2]; + w0[3] = pw_buf0[3]; + + u32x w1[4]; + + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 out_len = apply_rules (c_rules[il_pos].cmds, w0, w1, pw_len); + + truncate_block (w0, out_len); + + w1[0] = 0x80; + w3[2] = 16 * 8; + + u32x tmp2; + + u32x a = MD5M_A; + u32x b = MD5M_B; + u32x c = MD5M_C; + u32x d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H1, a, b, c, d, w1[1], MD5C20, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w2[0], MD5C21, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w2[3], MD5C22, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w3[2], MD5C23, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w0[1], MD5C24, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w1[0], MD5C25, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w1[3], MD5C26, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w2[2], MD5C27, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w3[1], MD5C28, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w0[0], MD5C29, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w0[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w1[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w2[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w3[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w3[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w0[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1[0], MD5C3c, MD5S30); + + bool q_cond = ((a & 0x00ffffff) != search[0]); + + if (q_cond) continue; + + MD5_STEP (MD5_I , d, a, b, c, w2[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2[1], MD5C3f, MD5S33); + + a &= 0x00ffffff; + d &= 0x00ffffff; + c &= 0x00ffffff; + b &= 0x00ffffff; + + const u32x r0 = a; + const u32x r1 = d; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_S + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m02400_s08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m02400_s16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/nv/m02400_a1.cu b/nv/m02400_a1.cu new file mode 100644 index 0000000000..e48a2e54ea --- /dev/null +++ b/nv/m02400_a1.cu @@ -0,0 +1,508 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _MD5_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW2 +#define VECT_SIZE4 +#endif + +#define DGST_R0 0 +#define DGST_R1 3 +#define DGST_R2 2 +#define DGST_R3 1 + +#include "include/kernel_functions.c" +#include "types_nv.c" +#include "common_nv.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +__device__ __constant__ comb_t c_combs[1024]; + +extern "C" __global__ void __launch_bounds__ (256, 1) m02400_m04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, c_combs[0].pw_len); + } + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = c_combs[il_pos].pw_len; + + const u32 pw_len = pw_l_len + pw_r_len; + + u32 wordr0[4]; + + wordr0[0] = c_combs[il_pos].i[0]; + wordr0[1] = c_combs[il_pos].i[1]; + wordr0[2] = c_combs[il_pos].i[2]; + wordr0[3] = c_combs[il_pos].i[3]; + + u32 wordr1[4]; + + wordr1[0] = c_combs[il_pos].i[4]; + wordr1[1] = c_combs[il_pos].i[5]; + wordr1[2] = c_combs[il_pos].i[6]; + wordr1[3] = c_combs[il_pos].i[7]; + + u32 wordr2[4]; + + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + + u32 wordr3[4]; + + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + u32x w0[4]; + + w0[0] = wordl0[0] | wordr0[0]; + w0[1] = wordl0[1] | wordr0[1]; + w0[2] = wordl0[2] | wordr0[2]; + w0[3] = wordl0[3] | wordr0[3]; + + u32x w1[4]; + + w1[0] = wordl1[0] | wordr1[0]; + w1[1] = wordl1[1] | wordr1[1]; + w1[2] = wordl1[2] | wordr1[2]; + w1[3] = wordl1[3] | wordr1[3]; + + u32x w2[4]; + + w2[0] = wordl2[0] | wordr2[0]; + w2[1] = wordl2[1] | wordr2[1]; + w2[2] = wordl2[2] | wordr2[2]; + w2[3] = wordl2[3] | wordr2[3]; + + u32x w3[4]; + + w3[0] = wordl3[0] | wordr3[0]; + w3[1] = wordl3[1] | wordr3[1]; + w3[2] = 0; + w3[3] = 0; + + truncate_block (w0, pw_len); + + w1[0] = 0x80; + w3[2] = 16 * 8; + + u32x tmp2; + + u32x a = MD5M_A; + u32x b = MD5M_B; + u32x c = MD5M_C; + u32x d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H1, a, b, c, d, w1[1], MD5C20, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w2[0], MD5C21, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w2[3], MD5C22, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w3[2], MD5C23, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w0[1], MD5C24, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w1[0], MD5C25, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w1[3], MD5C26, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w2[2], MD5C27, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w3[1], MD5C28, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w0[0], MD5C29, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w0[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w1[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w2[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w3[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w3[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w0[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1[0], MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w2[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2[1], MD5C3f, MD5S33); + + a &= 0x00ffffff; + d &= 0x00ffffff; + c &= 0x00ffffff; + b &= 0x00ffffff; + + const u32x r0 = a; + const u32x r1 = d; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_M + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m02400_m08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m02400_m16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m02400_s04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, c_combs[0].pw_len); + } + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = c_combs[il_pos].pw_len; + + const u32 pw_len = pw_l_len + pw_r_len; + + u32 wordr0[4]; + + wordr0[0] = c_combs[il_pos].i[0]; + wordr0[1] = c_combs[il_pos].i[1]; + wordr0[2] = c_combs[il_pos].i[2]; + wordr0[3] = c_combs[il_pos].i[3]; + + u32 wordr1[4]; + + wordr1[0] = c_combs[il_pos].i[4]; + wordr1[1] = c_combs[il_pos].i[5]; + wordr1[2] = c_combs[il_pos].i[6]; + wordr1[3] = c_combs[il_pos].i[7]; + + u32 wordr2[4]; + + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + + u32 wordr3[4]; + + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + u32x w0[4]; + + w0[0] = wordl0[0] | wordr0[0]; + w0[1] = wordl0[1] | wordr0[1]; + w0[2] = wordl0[2] | wordr0[2]; + w0[3] = wordl0[3] | wordr0[3]; + + u32x w1[4]; + + w1[0] = wordl1[0] | wordr1[0]; + w1[1] = wordl1[1] | wordr1[1]; + w1[2] = wordl1[2] | wordr1[2]; + w1[3] = wordl1[3] | wordr1[3]; + + u32x w2[4]; + + w2[0] = wordl2[0] | wordr2[0]; + w2[1] = wordl2[1] | wordr2[1]; + w2[2] = wordl2[2] | wordr2[2]; + w2[3] = wordl2[3] | wordr2[3]; + + u32x w3[4]; + + w3[0] = wordl3[0] | wordr3[0]; + w3[1] = wordl3[1] | wordr3[1]; + w3[2] = 0; + w3[3] = 0; + + truncate_block (w0, pw_len); + + w1[0] = 0x80; + w3[2] = 16 * 8; + + u32x tmp2; + + u32x a = MD5M_A; + u32x b = MD5M_B; + u32x c = MD5M_C; + u32x d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H1, a, b, c, d, w1[1], MD5C20, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w2[0], MD5C21, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w2[3], MD5C22, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w3[2], MD5C23, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w0[1], MD5C24, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w1[0], MD5C25, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w1[3], MD5C26, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w2[2], MD5C27, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w3[1], MD5C28, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w0[0], MD5C29, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w0[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w1[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w2[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w3[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w3[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w0[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1[0], MD5C3c, MD5S30); + + bool q_cond = ((a & 0x00ffffff) != search[0]); + + if (q_cond) continue; + + MD5_STEP (MD5_I , d, a, b, c, w2[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2[1], MD5C3f, MD5S33); + + a &= 0x00ffffff; + d &= 0x00ffffff; + c &= 0x00ffffff; + b &= 0x00ffffff; + + const u32x r0 = a; + const u32x r1 = d; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_S + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m02400_s08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m02400_s16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/nv/m02400_a3.cu b/nv/m02400_a3.cu new file mode 100644 index 0000000000..e46fd840ea --- /dev/null +++ b/nv/m02400_a3.cu @@ -0,0 +1,535 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _MD5_ +#define _SCALAR_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW2 +#define VECT_SIZE4 +#endif + +#define DGST_R0 0 +#define DGST_R1 3 +#define DGST_R2 2 +#define DGST_R3 1 + +#include "include/kernel_functions.c" +#include "types_nv.c" +#include "common_nv.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4_warp.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4_warp.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4_warp.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4_warp.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4_warp.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4_warp.c" +#endif + +__device__ __constant__ u32x c_bfs[1024]; + +__device__ static void m02400m (u32 w[16], const u32 pw_len, const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const u32x *words_buf_r, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset) +{ + /** + * modifier + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + const u32 lid = threadIdx.x; + + /** + * algorithm specific + */ + + w[ 4] = 0x80; + w[14] = 16 * 8; + + /** + * base + */ + + const u32 F_w0c00 = 0 + MD5C00; + const u32 F_w1c01 = w[ 1] + MD5C01; + const u32 F_w2c02 = w[ 2] + MD5C02; + const u32 F_w3c03 = w[ 3] + MD5C03; + const u32 F_w4c04 = w[ 4] + MD5C04; + const u32 F_w5c05 = w[ 5] + MD5C05; + const u32 F_w6c06 = w[ 6] + MD5C06; + const u32 F_w7c07 = w[ 7] + MD5C07; + const u32 F_w8c08 = w[ 8] + MD5C08; + const u32 F_w9c09 = w[ 9] + MD5C09; + const u32 F_wac0a = w[10] + MD5C0a; + const u32 F_wbc0b = w[11] + MD5C0b; + const u32 F_wcc0c = w[12] + MD5C0c; + const u32 F_wdc0d = w[13] + MD5C0d; + const u32 F_wec0e = w[14] + MD5C0e; + const u32 F_wfc0f = w[15] + MD5C0f; + + const u32 G_w1c10 = w[ 1] + MD5C10; + const u32 G_w6c11 = w[ 6] + MD5C11; + const u32 G_wbc12 = w[11] + MD5C12; + const u32 G_w0c13 = 0 + MD5C13; + const u32 G_w5c14 = w[ 5] + MD5C14; + const u32 G_wac15 = w[10] + MD5C15; + const u32 G_wfc16 = w[15] + MD5C16; + const u32 G_w4c17 = w[ 4] + MD5C17; + const u32 G_w9c18 = w[ 9] + MD5C18; + const u32 G_wec19 = w[14] + MD5C19; + const u32 G_w3c1a = w[ 3] + MD5C1a; + const u32 G_w8c1b = w[ 8] + MD5C1b; + const u32 G_wdc1c = w[13] + MD5C1c; + const u32 G_w2c1d = w[ 2] + MD5C1d; + const u32 G_w7c1e = w[ 7] + MD5C1e; + const u32 G_wcc1f = w[12] + MD5C1f; + + const u32 H_w5c20 = w[ 5] + MD5C20; + const u32 H_w8c21 = w[ 8] + MD5C21; + const u32 H_wbc22 = w[11] + MD5C22; + const u32 H_wec23 = w[14] + MD5C23; + const u32 H_w1c24 = w[ 1] + MD5C24; + const u32 H_w4c25 = w[ 4] + MD5C25; + const u32 H_w7c26 = w[ 7] + MD5C26; + const u32 H_wac27 = w[10] + MD5C27; + const u32 H_wdc28 = w[13] + MD5C28; + const u32 H_w0c29 = 0 + MD5C29; + const u32 H_w3c2a = w[ 3] + MD5C2a; + const u32 H_w6c2b = w[ 6] + MD5C2b; + const u32 H_w9c2c = w[ 9] + MD5C2c; + const u32 H_wcc2d = w[12] + MD5C2d; + const u32 H_wfc2e = w[15] + MD5C2e; + const u32 H_w2c2f = w[ 2] + MD5C2f; + + const u32 I_w0c30 = 0 + MD5C30; + const u32 I_w7c31 = w[ 7] + MD5C31; + const u32 I_wec32 = w[14] + MD5C32; + const u32 I_w5c33 = w[ 5] + MD5C33; + const u32 I_wcc34 = w[12] + MD5C34; + const u32 I_w3c35 = w[ 3] + MD5C35; + const u32 I_wac36 = w[10] + MD5C36; + const u32 I_w1c37 = w[ 1] + MD5C37; + const u32 I_w8c38 = w[ 8] + MD5C38; + const u32 I_wfc39 = w[15] + MD5C39; + const u32 I_w6c3a = w[ 6] + MD5C3a; + const u32 I_wdc3b = w[13] + MD5C3b; + const u32 I_w4c3c = w[ 4] + MD5C3c; + const u32 I_wbc3d = w[11] + MD5C3d; + const u32 I_w2c3e = w[ 2] + MD5C3e; + const u32 I_w9c3f = w[ 9] + MD5C3f; + + /** + * loop + */ + + const u32 bf_loops = ceil ((float) bfs_cnt / VECT_DIV); + + u32x w0l = w[0]; + + for (u32 il_pos = 0; il_pos < bf_loops; il_pos++) + { + const u32x w0r = c_bfs[il_pos]; + + const u32x w0 = w0l | w0r; + + u32x tmp2; + + u32x a = MD5M_A; + u32x b = MD5M_B; + u32x c = MD5M_C; + u32x d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0, F_w0c00, MD5S00); + MD5_STEP0(MD5_Fo, d, a, b, c, F_w1c01, MD5S01); + MD5_STEP0(MD5_Fo, c, d, a, b, F_w2c02, MD5S02); + MD5_STEP0(MD5_Fo, b, c, d, a, F_w3c03, MD5S03); + MD5_STEP0(MD5_Fo, a, b, c, d, F_w4c04, MD5S00); + MD5_STEP0(MD5_Fo, d, a, b, c, F_w5c05, MD5S01); + MD5_STEP0(MD5_Fo, c, d, a, b, F_w6c06, MD5S02); + MD5_STEP0(MD5_Fo, b, c, d, a, F_w7c07, MD5S03); + MD5_STEP0(MD5_Fo, a, b, c, d, F_w8c08, MD5S00); + MD5_STEP0(MD5_Fo, d, a, b, c, F_w9c09, MD5S01); + MD5_STEP0(MD5_Fo, c, d, a, b, F_wac0a, MD5S02); + MD5_STEP0(MD5_Fo, b, c, d, a, F_wbc0b, MD5S03); + MD5_STEP0(MD5_Fo, a, b, c, d, F_wcc0c, MD5S00); + MD5_STEP0(MD5_Fo, d, a, b, c, F_wdc0d, MD5S01); + MD5_STEP0(MD5_Fo, c, d, a, b, F_wec0e, MD5S02); + MD5_STEP0(MD5_Fo, b, c, d, a, F_wfc0f, MD5S03); + + MD5_STEP0(MD5_Go, a, b, c, d, G_w1c10, MD5S10); + MD5_STEP0(MD5_Go, d, a, b, c, G_w6c11, MD5S11); + MD5_STEP0(MD5_Go, c, d, a, b, G_wbc12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0, G_w0c13, MD5S13); + MD5_STEP0(MD5_Go, a, b, c, d, G_w5c14, MD5S10); + MD5_STEP0(MD5_Go, d, a, b, c, G_wac15, MD5S11); + MD5_STEP0(MD5_Go, c, d, a, b, G_wfc16, MD5S12); + MD5_STEP0(MD5_Go, b, c, d, a, G_w4c17, MD5S13); + MD5_STEP0(MD5_Go, a, b, c, d, G_w9c18, MD5S10); + MD5_STEP0(MD5_Go, d, a, b, c, G_wec19, MD5S11); + MD5_STEP0(MD5_Go, c, d, a, b, G_w3c1a, MD5S12); + MD5_STEP0(MD5_Go, b, c, d, a, G_w8c1b, MD5S13); + MD5_STEP0(MD5_Go, a, b, c, d, G_wdc1c, MD5S10); + MD5_STEP0(MD5_Go, d, a, b, c, G_w2c1d, MD5S11); + MD5_STEP0(MD5_Go, c, d, a, b, G_w7c1e, MD5S12); + MD5_STEP0(MD5_Go, b, c, d, a, G_wcc1f, MD5S13); + + MD5_STEP0(MD5_H1, a, b, c, d, H_w5c20, MD5S20); + MD5_STEP0(MD5_H2, d, a, b, c, H_w8c21, MD5S21); + MD5_STEP0(MD5_H1, c, d, a, b, H_wbc22, MD5S22); + MD5_STEP0(MD5_H2, b, c, d, a, H_wec23, MD5S23); + MD5_STEP0(MD5_H1, a, b, c, d, H_w1c24, MD5S20); + MD5_STEP0(MD5_H2, d, a, b, c, H_w4c25, MD5S21); + MD5_STEP0(MD5_H1, c, d, a, b, H_w7c26, MD5S22); + MD5_STEP0(MD5_H2, b, c, d, a, H_wac27, MD5S23); + MD5_STEP0(MD5_H1, a, b, c, d, H_wdc28, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w0, H_w0c29, MD5S21); + MD5_STEP0(MD5_H1, c, d, a, b, H_w3c2a, MD5S22); + MD5_STEP0(MD5_H2, b, c, d, a, H_w6c2b, MD5S23); + MD5_STEP0(MD5_H1, a, b, c, d, H_w9c2c, MD5S20); + MD5_STEP0(MD5_H2, d, a, b, c, H_wcc2d, MD5S21); + MD5_STEP0(MD5_H1, c, d, a, b, H_wfc2e, MD5S22); + MD5_STEP0(MD5_H2, b, c, d, a, H_w2c2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0, I_w0c30, MD5S30); + MD5_STEP0(MD5_I , d, a, b, c, I_w7c31, MD5S31); + MD5_STEP0(MD5_I , c, d, a, b, I_wec32, MD5S32); + MD5_STEP0(MD5_I , b, c, d, a, I_w5c33, MD5S33); + MD5_STEP0(MD5_I , a, b, c, d, I_wcc34, MD5S30); + MD5_STEP0(MD5_I , d, a, b, c, I_w3c35, MD5S31); + MD5_STEP0(MD5_I , c, d, a, b, I_wac36, MD5S32); + MD5_STEP0(MD5_I , b, c, d, a, I_w1c37, MD5S33); + MD5_STEP0(MD5_I , a, b, c, d, I_w8c38, MD5S30); + MD5_STEP0(MD5_I , d, a, b, c, I_wfc39, MD5S31); + MD5_STEP0(MD5_I , c, d, a, b, I_w6c3a, MD5S32); + MD5_STEP0(MD5_I , b, c, d, a, I_wdc3b, MD5S33); + MD5_STEP0(MD5_I , a, b, c, d, I_w4c3c, MD5S30); + MD5_STEP0(MD5_I , d, a, b, c, I_wbc3d, MD5S31); + MD5_STEP0(MD5_I , c, d, a, b, I_w2c3e, MD5S32); + MD5_STEP0(MD5_I , b, c, d, a, I_w9c3f, MD5S33); + + a &= 0x00ffffff; + d &= 0x00ffffff; + c &= 0x00ffffff; + b &= 0x00ffffff; + + const u32x r0 = a; + const u32x r1 = d; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_M + } +} + +__device__ static void m02400s (u32 w[16], const u32 pw_len, const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const u32x *words_buf_r, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset) +{ + /** + * modifier + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + const u32 lid = threadIdx.x; + + /** + * algorithm specific + */ + + w[ 4] = 0x80; + w[14] = 16 * 8; + + /** + * base + */ + + const u32 F_w0c00 = 0 + MD5C00; + const u32 F_w1c01 = w[ 1] + MD5C01; + const u32 F_w2c02 = w[ 2] + MD5C02; + const u32 F_w3c03 = w[ 3] + MD5C03; + const u32 F_w4c04 = w[ 4] + MD5C04; + const u32 F_w5c05 = w[ 5] + MD5C05; + const u32 F_w6c06 = w[ 6] + MD5C06; + const u32 F_w7c07 = w[ 7] + MD5C07; + const u32 F_w8c08 = w[ 8] + MD5C08; + const u32 F_w9c09 = w[ 9] + MD5C09; + const u32 F_wac0a = w[10] + MD5C0a; + const u32 F_wbc0b = w[11] + MD5C0b; + const u32 F_wcc0c = w[12] + MD5C0c; + const u32 F_wdc0d = w[13] + MD5C0d; + const u32 F_wec0e = w[14] + MD5C0e; + const u32 F_wfc0f = w[15] + MD5C0f; + + const u32 G_w1c10 = w[ 1] + MD5C10; + const u32 G_w6c11 = w[ 6] + MD5C11; + const u32 G_wbc12 = w[11] + MD5C12; + const u32 G_w0c13 = 0 + MD5C13; + const u32 G_w5c14 = w[ 5] + MD5C14; + const u32 G_wac15 = w[10] + MD5C15; + const u32 G_wfc16 = w[15] + MD5C16; + const u32 G_w4c17 = w[ 4] + MD5C17; + const u32 G_w9c18 = w[ 9] + MD5C18; + const u32 G_wec19 = w[14] + MD5C19; + const u32 G_w3c1a = w[ 3] + MD5C1a; + const u32 G_w8c1b = w[ 8] + MD5C1b; + const u32 G_wdc1c = w[13] + MD5C1c; + const u32 G_w2c1d = w[ 2] + MD5C1d; + const u32 G_w7c1e = w[ 7] + MD5C1e; + const u32 G_wcc1f = w[12] + MD5C1f; + + const u32 H_w5c20 = w[ 5] + MD5C20; + const u32 H_w8c21 = w[ 8] + MD5C21; + const u32 H_wbc22 = w[11] + MD5C22; + const u32 H_wec23 = w[14] + MD5C23; + const u32 H_w1c24 = w[ 1] + MD5C24; + const u32 H_w4c25 = w[ 4] + MD5C25; + const u32 H_w7c26 = w[ 7] + MD5C26; + const u32 H_wac27 = w[10] + MD5C27; + const u32 H_wdc28 = w[13] + MD5C28; + const u32 H_w0c29 = 0 + MD5C29; + const u32 H_w3c2a = w[ 3] + MD5C2a; + const u32 H_w6c2b = w[ 6] + MD5C2b; + const u32 H_w9c2c = w[ 9] + MD5C2c; + const u32 H_wcc2d = w[12] + MD5C2d; + const u32 H_wfc2e = w[15] + MD5C2e; + const u32 H_w2c2f = w[ 2] + MD5C2f; + + const u32 I_w0c30 = 0 + MD5C30; + const u32 I_w7c31 = w[ 7] + MD5C31; + const u32 I_wec32 = w[14] + MD5C32; + const u32 I_w5c33 = w[ 5] + MD5C33; + const u32 I_wcc34 = w[12] + MD5C34; + const u32 I_w3c35 = w[ 3] + MD5C35; + const u32 I_wac36 = w[10] + MD5C36; + const u32 I_w1c37 = w[ 1] + MD5C37; + const u32 I_w8c38 = w[ 8] + MD5C38; + const u32 I_wfc39 = w[15] + MD5C39; + const u32 I_w6c3a = w[ 6] + MD5C3a; + const u32 I_wdc3b = w[13] + MD5C3b; + const u32 I_w4c3c = w[ 4] + MD5C3c; + const u32 I_wbc3d = w[11] + MD5C3d; + const u32 I_w2c3e = w[ 2] + MD5C3e; + const u32 I_w9c3f = w[ 9] + MD5C3f; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * loop + */ + + const u32 bf_loops = ceil ((float) bfs_cnt / VECT_DIV); + + u32x w0l = w[0]; + + for (u32 il_pos = 0; il_pos < bf_loops; il_pos++) + { + const u32x w0r = c_bfs[il_pos]; + + const u32x w0 = w0l | w0r; + + u32x tmp2; + + u32x a = MD5M_A; + u32x b = MD5M_B; + u32x c = MD5M_C; + u32x d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0, F_w0c00, MD5S00); + MD5_STEP0(MD5_Fo, d, a, b, c, F_w1c01, MD5S01); + MD5_STEP0(MD5_Fo, c, d, a, b, F_w2c02, MD5S02); + MD5_STEP0(MD5_Fo, b, c, d, a, F_w3c03, MD5S03); + MD5_STEP0(MD5_Fo, a, b, c, d, F_w4c04, MD5S00); + MD5_STEP0(MD5_Fo, d, a, b, c, F_w5c05, MD5S01); + MD5_STEP0(MD5_Fo, c, d, a, b, F_w6c06, MD5S02); + MD5_STEP0(MD5_Fo, b, c, d, a, F_w7c07, MD5S03); + MD5_STEP0(MD5_Fo, a, b, c, d, F_w8c08, MD5S00); + MD5_STEP0(MD5_Fo, d, a, b, c, F_w9c09, MD5S01); + MD5_STEP0(MD5_Fo, c, d, a, b, F_wac0a, MD5S02); + MD5_STEP0(MD5_Fo, b, c, d, a, F_wbc0b, MD5S03); + MD5_STEP0(MD5_Fo, a, b, c, d, F_wcc0c, MD5S00); + MD5_STEP0(MD5_Fo, d, a, b, c, F_wdc0d, MD5S01); + MD5_STEP0(MD5_Fo, c, d, a, b, F_wec0e, MD5S02); + MD5_STEP0(MD5_Fo, b, c, d, a, F_wfc0f, MD5S03); + + MD5_STEP0(MD5_Go, a, b, c, d, G_w1c10, MD5S10); + MD5_STEP0(MD5_Go, d, a, b, c, G_w6c11, MD5S11); + MD5_STEP0(MD5_Go, c, d, a, b, G_wbc12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0, G_w0c13, MD5S13); + MD5_STEP0(MD5_Go, a, b, c, d, G_w5c14, MD5S10); + MD5_STEP0(MD5_Go, d, a, b, c, G_wac15, MD5S11); + MD5_STEP0(MD5_Go, c, d, a, b, G_wfc16, MD5S12); + MD5_STEP0(MD5_Go, b, c, d, a, G_w4c17, MD5S13); + MD5_STEP0(MD5_Go, a, b, c, d, G_w9c18, MD5S10); + MD5_STEP0(MD5_Go, d, a, b, c, G_wec19, MD5S11); + MD5_STEP0(MD5_Go, c, d, a, b, G_w3c1a, MD5S12); + MD5_STEP0(MD5_Go, b, c, d, a, G_w8c1b, MD5S13); + MD5_STEP0(MD5_Go, a, b, c, d, G_wdc1c, MD5S10); + MD5_STEP0(MD5_Go, d, a, b, c, G_w2c1d, MD5S11); + MD5_STEP0(MD5_Go, c, d, a, b, G_w7c1e, MD5S12); + MD5_STEP0(MD5_Go, b, c, d, a, G_wcc1f, MD5S13); + + MD5_STEP0(MD5_H1, a, b, c, d, H_w5c20, MD5S20); + MD5_STEP0(MD5_H2, d, a, b, c, H_w8c21, MD5S21); + MD5_STEP0(MD5_H1, c, d, a, b, H_wbc22, MD5S22); + MD5_STEP0(MD5_H2, b, c, d, a, H_wec23, MD5S23); + MD5_STEP0(MD5_H1, a, b, c, d, H_w1c24, MD5S20); + MD5_STEP0(MD5_H2, d, a, b, c, H_w4c25, MD5S21); + MD5_STEP0(MD5_H1, c, d, a, b, H_w7c26, MD5S22); + MD5_STEP0(MD5_H2, b, c, d, a, H_wac27, MD5S23); + MD5_STEP0(MD5_H1, a, b, c, d, H_wdc28, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w0, H_w0c29, MD5S21); + MD5_STEP0(MD5_H1, c, d, a, b, H_w3c2a, MD5S22); + MD5_STEP0(MD5_H2, b, c, d, a, H_w6c2b, MD5S23); + MD5_STEP0(MD5_H1, a, b, c, d, H_w9c2c, MD5S20); + MD5_STEP0(MD5_H2, d, a, b, c, H_wcc2d, MD5S21); + MD5_STEP0(MD5_H1, c, d, a, b, H_wfc2e, MD5S22); + MD5_STEP0(MD5_H2, b, c, d, a, H_w2c2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0, I_w0c30, MD5S30); + MD5_STEP0(MD5_I , d, a, b, c, I_w7c31, MD5S31); + MD5_STEP0(MD5_I , c, d, a, b, I_wec32, MD5S32); + MD5_STEP0(MD5_I , b, c, d, a, I_w5c33, MD5S33); + MD5_STEP0(MD5_I , a, b, c, d, I_wcc34, MD5S30); + MD5_STEP0(MD5_I , d, a, b, c, I_w3c35, MD5S31); + MD5_STEP0(MD5_I , c, d, a, b, I_wac36, MD5S32); + MD5_STEP0(MD5_I , b, c, d, a, I_w1c37, MD5S33); + MD5_STEP0(MD5_I , a, b, c, d, I_w8c38, MD5S30); + MD5_STEP0(MD5_I , d, a, b, c, I_wfc39, MD5S31); + MD5_STEP0(MD5_I , c, d, a, b, I_w6c3a, MD5S32); + MD5_STEP0(MD5_I , b, c, d, a, I_wdc3b, MD5S33); + MD5_STEP0(MD5_I , a, b, c, d, I_w4c3c, MD5S30); + + bool q_cond = ((a & 0x00ffffff) != search[0]); + + if (q_cond) continue; + + MD5_STEP0(MD5_I , d, a, b, c, I_wbc3d, MD5S31); + MD5_STEP0(MD5_I , c, d, a, b, I_w2c3e, MD5S32); + MD5_STEP0(MD5_I , b, c, d, a, I_w9c3f, MD5S33); + + a &= 0x00ffffff; + d &= 0x00ffffff; + c &= 0x00ffffff; + b &= 0x00ffffff; + + const u32x r0 = a; + const u32x r1 = d; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_S + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m02400_m04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const u32x *words_buf_r, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32 w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = 0; + w[ 5] = 0; + w[ 6] = 0; + w[ 7] = 0; + w[ 8] = 0; + w[ 9] = 0; + w[10] = 0; + w[11] = 0; + w[12] = 0; + w[13] = 0; + w[14] = 0; + w[15] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m02400m (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m02400_m08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const u32x *words_buf_r, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m02400_m16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const u32x *words_buf_r, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m02400_s04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const u32x *words_buf_r, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32 w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = 0; + w[ 5] = 0; + w[ 6] = 0; + w[ 7] = 0; + w[ 8] = 0; + w[ 9] = 0; + w[10] = 0; + w[11] = 0; + w[12] = 0; + w[13] = 0; + w[14] = 0; + w[15] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m02400s (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m02400_s08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const u32x *words_buf_r, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m02400_s16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const u32x *words_buf_r, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/nv/m02410_a0.cu b/nv/m02410_a0.cu new file mode 100644 index 0000000000..2034d73ccd --- /dev/null +++ b/nv/m02410_a0.cu @@ -0,0 +1,496 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _MD5_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW2 +#define VECT_SIZE1 +#endif + +#define DGST_R0 0 +#define DGST_R1 3 +#define DGST_R2 2 +#define DGST_R3 1 + +#include "include/kernel_functions.c" +#include "types_nv.c" +#include "common_nv.c" +#include "include/rp_gpu.h" +#include "rp_nv.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +__device__ __constant__ gpu_rule_t c_rules[1024]; + +extern "C" __global__ void __launch_bounds__ (256, 1) m02410_m04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[0]; + salt_buf0[1] = 0; + salt_buf0[2] = 0; + salt_buf0[3] = 0; + + const u32 salt_len = (salt_bufs[salt_pos].salt_len < 4) ? salt_bufs[salt_pos].salt_len : 4; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + + w0[0] = pw_buf0[0]; + w0[1] = pw_buf0[1]; + w0[2] = pw_buf0[2]; + w0[3] = pw_buf0[3]; + + u32x w1[4]; + + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 out_len = apply_rules (c_rules[il_pos].cmds, w0, w1, pw_len); + + /** + * append salt + */ + + u32 s0[4]; + + s0[0] = salt_buf0[0]; + s0[1] = salt_buf0[1]; + s0[2] = salt_buf0[2]; + s0[3] = salt_buf0[3]; + + u32 s1[4]; + + s1[0] = 0; + s1[1] = 0; + s1[2] = 0; + s1[3] = 0; + + u32 s2[4]; + + s2[0] = 0; + s2[1] = 0; + s2[2] = 0; + s2[3] = 0; + + u32 s3[4]; + + s3[0] = 0; + s3[1] = 0; + s3[2] = 0; + s3[3] = 0; + + switch_buffer_by_offset (s0, s1, s2, s3, out_len); + + w0[0] |= s0[0]; + w0[1] |= s0[1]; + w0[2] |= s0[2]; + w0[3] |= s0[3]; + + const u32 pw_salt_len = out_len + salt_len; + + truncate_block (w0, pw_salt_len); + + w1[0] = 0x80; + w3[2] = 16 * 8; + + u32x tmp2; + + u32x a = MD5M_A; + u32x b = MD5M_B; + u32x c = MD5M_C; + u32x d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H1, a, b, c, d, w1[1], MD5C20, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w2[0], MD5C21, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w2[3], MD5C22, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w3[2], MD5C23, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w0[1], MD5C24, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w1[0], MD5C25, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w1[3], MD5C26, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w2[2], MD5C27, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w3[1], MD5C28, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w0[0], MD5C29, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w0[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w1[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w2[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w3[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w3[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w0[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1[0], MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w2[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2[1], MD5C3f, MD5S33); + + a &= 0x00ffffff; + d &= 0x00ffffff; + c &= 0x00ffffff; + b &= 0x00ffffff; + + const u32x r0 = a; + const u32x r1 = d; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_M + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m02410_m08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m02410_m16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m02410_s04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[0]; + salt_buf0[1] = 0; + salt_buf0[2] = 0; + salt_buf0[3] = 0; + + const u32 salt_len = (salt_bufs[salt_pos].salt_len < 4) ? salt_bufs[salt_pos].salt_len : 4; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + + w0[0] = pw_buf0[0]; + w0[1] = pw_buf0[1]; + w0[2] = pw_buf0[2]; + w0[3] = pw_buf0[3]; + + u32x w1[4]; + + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 out_len = apply_rules (c_rules[il_pos].cmds, w0, w1, pw_len); + + /** + * append salt + */ + + u32 s0[4]; + + s0[0] = salt_buf0[0]; + s0[1] = salt_buf0[1]; + s0[2] = salt_buf0[2]; + s0[3] = salt_buf0[3]; + + u32 s1[4]; + + s1[0] = 0; + s1[1] = 0; + s1[2] = 0; + s1[3] = 0; + + u32 s2[4]; + + s2[0] = 0; + s2[1] = 0; + s2[2] = 0; + s2[3] = 0; + + u32 s3[4]; + + s3[0] = 0; + s3[1] = 0; + s3[2] = 0; + s3[3] = 0; + + switch_buffer_by_offset (s0, s1, s2, s3, out_len); + + w0[0] |= s0[0]; + w0[1] |= s0[1]; + w0[2] |= s0[2]; + w0[3] |= s0[3]; + + const u32 pw_salt_len = out_len + salt_len; + + truncate_block (w0, pw_salt_len); + + w1[0] = 0x80; + w3[2] = 16 * 8; + + u32x tmp2; + + u32x a = MD5M_A; + u32x b = MD5M_B; + u32x c = MD5M_C; + u32x d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H1, a, b, c, d, w1[1], MD5C20, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w2[0], MD5C21, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w2[3], MD5C22, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w3[2], MD5C23, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w0[1], MD5C24, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w1[0], MD5C25, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w1[3], MD5C26, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w2[2], MD5C27, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w3[1], MD5C28, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w0[0], MD5C29, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w0[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w1[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w2[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w3[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w3[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w0[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1[0], MD5C3c, MD5S30); + + bool q_cond = ((a & 0x00ffffff) != search[0]); + + if (q_cond) continue; + + MD5_STEP (MD5_I , d, a, b, c, w2[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2[1], MD5C3f, MD5S33); + + a &= 0x00ffffff; + d &= 0x00ffffff; + c &= 0x00ffffff; + b &= 0x00ffffff; + + const u32x r0 = a; + const u32x r1 = d; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_S + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m02410_s08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m02410_s16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/nv/m02410_a1.cu b/nv/m02410_a1.cu new file mode 100644 index 0000000000..3a069c9cb7 --- /dev/null +++ b/nv/m02410_a1.cu @@ -0,0 +1,606 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _MD5_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW2 +#define VECT_SIZE4 +#endif + +#define DGST_R0 0 +#define DGST_R1 3 +#define DGST_R2 2 +#define DGST_R3 1 + +#include "include/kernel_functions.c" +#include "types_nv.c" +#include "common_nv.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +__device__ __constant__ comb_t c_combs[1024]; + +extern "C" __global__ void __launch_bounds__ (256, 1) m02410_m04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, c_combs[0].pw_len); + } + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[0]; + salt_buf0[1] = 0; + salt_buf0[2] = 0; + salt_buf0[3] = 0; + + const u32 salt_len = (salt_bufs[salt_pos].salt_len < 4) ? salt_bufs[salt_pos].salt_len : 4; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = c_combs[il_pos].pw_len; + + const u32 pw_len = pw_l_len + pw_r_len; + + u32 wordr0[4]; + + wordr0[0] = c_combs[il_pos].i[0]; + wordr0[1] = c_combs[il_pos].i[1]; + wordr0[2] = c_combs[il_pos].i[2]; + wordr0[3] = c_combs[il_pos].i[3]; + + u32 wordr1[4]; + + wordr1[0] = c_combs[il_pos].i[4]; + wordr1[1] = c_combs[il_pos].i[5]; + wordr1[2] = c_combs[il_pos].i[6]; + wordr1[3] = c_combs[il_pos].i[7]; + + u32 wordr2[4]; + + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + + u32 wordr3[4]; + + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + /** + * append salt + */ + + u32 s0[4]; + + s0[0] = salt_buf0[0]; + s0[1] = salt_buf0[1]; + s0[2] = salt_buf0[2]; + s0[3] = salt_buf0[3]; + + u32 s1[4]; + + s1[0] = 0; + s1[1] = 0; + s1[2] = 0; + s1[3] = 0; + + u32 s2[4]; + + s2[0] = 0; + s2[1] = 0; + s2[2] = 0; + s2[3] = 0; + + u32 s3[4]; + + s3[0] = 0; + s3[1] = 0; + s3[2] = 0; + s3[3] = 0; + + switch_buffer_by_offset (s0, s1, s2, s3, pw_len); + + const u32 pw_salt_len = pw_len + salt_len; + + u32x w0[4]; + + w0[0] = wordl0[0] | wordr0[0] | s0[0]; + w0[1] = wordl0[1] | wordr0[1] | s0[1]; + w0[2] = wordl0[2] | wordr0[2] | s0[2]; + w0[3] = wordl0[3] | wordr0[3] | s0[3]; + + u32x w1[4]; + + w1[0] = wordl1[0] | wordr1[0]; + w1[1] = wordl1[1] | wordr1[1]; + w1[2] = wordl1[2] | wordr1[2]; + w1[3] = wordl1[3] | wordr1[3]; + + u32x w2[4]; + + w2[0] = wordl2[0] | wordr2[0]; + w2[1] = wordl2[1] | wordr2[1]; + w2[2] = wordl2[2] | wordr2[2]; + w2[3] = wordl2[3] | wordr2[3]; + + u32x w3[4]; + + w3[0] = wordl3[0] | wordr3[0]; + w3[1] = wordl3[1] | wordr3[1]; + w3[2] = 0; + w3[3] = 0; + + truncate_block (w0, pw_salt_len); + + w1[0] = 0x80; + w3[2] = 16 * 8; + + u32x tmp2; + + u32x a = MD5M_A; + u32x b = MD5M_B; + u32x c = MD5M_C; + u32x d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H1, a, b, c, d, w1[1], MD5C20, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w2[0], MD5C21, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w2[3], MD5C22, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w3[2], MD5C23, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w0[1], MD5C24, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w1[0], MD5C25, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w1[3], MD5C26, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w2[2], MD5C27, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w3[1], MD5C28, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w0[0], MD5C29, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w0[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w1[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w2[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w3[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w3[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w0[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1[0], MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w2[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2[1], MD5C3f, MD5S33); + + a &= 0x00ffffff; + d &= 0x00ffffff; + c &= 0x00ffffff; + b &= 0x00ffffff; + + const u32x r0 = a; + const u32x r1 = d; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_M + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m02410_m08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m02410_m16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m02410_s04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, c_combs[0].pw_len); + } + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[0]; + salt_buf0[1] = 0; + salt_buf0[2] = 0; + salt_buf0[3] = 0; + + const u32 salt_len = (salt_bufs[salt_pos].salt_len < 4) ? salt_bufs[salt_pos].salt_len : 4; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = c_combs[il_pos].pw_len; + + const u32 pw_len = pw_l_len + pw_r_len; + + u32 wordr0[4]; + + wordr0[0] = c_combs[il_pos].i[0]; + wordr0[1] = c_combs[il_pos].i[1]; + wordr0[2] = c_combs[il_pos].i[2]; + wordr0[3] = c_combs[il_pos].i[3]; + + u32 wordr1[4]; + + wordr1[0] = c_combs[il_pos].i[4]; + wordr1[1] = c_combs[il_pos].i[5]; + wordr1[2] = c_combs[il_pos].i[6]; + wordr1[3] = c_combs[il_pos].i[7]; + + u32 wordr2[4]; + + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + + u32 wordr3[4]; + + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + /** + * append salt + */ + + u32 s0[4]; + + s0[0] = salt_buf0[0]; + s0[1] = salt_buf0[1]; + s0[2] = salt_buf0[2]; + s0[3] = salt_buf0[3]; + + u32 s1[4]; + + s1[0] = 0; + s1[1] = 0; + s1[2] = 0; + s1[3] = 0; + + u32 s2[4]; + + s2[0] = 0; + s2[1] = 0; + s2[2] = 0; + s2[3] = 0; + + u32 s3[4]; + + s3[0] = 0; + s3[1] = 0; + s3[2] = 0; + s3[3] = 0; + + switch_buffer_by_offset (s0, s1, s2, s3, pw_len); + + const u32 pw_salt_len = pw_len + salt_len; + + u32x w0[4]; + + w0[0] = wordl0[0] | wordr0[0] | s0[0]; + w0[1] = wordl0[1] | wordr0[1] | s0[1]; + w0[2] = wordl0[2] | wordr0[2] | s0[2]; + w0[3] = wordl0[3] | wordr0[3] | s0[3]; + + u32x w1[4]; + + w1[0] = wordl1[0] | wordr1[0]; + w1[1] = wordl1[1] | wordr1[1]; + w1[2] = wordl1[2] | wordr1[2]; + w1[3] = wordl1[3] | wordr1[3]; + + u32x w2[4]; + + w2[0] = wordl2[0] | wordr2[0]; + w2[1] = wordl2[1] | wordr2[1]; + w2[2] = wordl2[2] | wordr2[2]; + w2[3] = wordl2[3] | wordr2[3]; + + u32x w3[4]; + + w3[0] = wordl3[0] | wordr3[0]; + w3[1] = wordl3[1] | wordr3[1]; + w3[2] = 0; + w3[3] = 0; + + truncate_block (w0, pw_salt_len); + + w1[0] = 0x80; + w3[2] = 16 * 8; + + u32x tmp2; + + u32x a = MD5M_A; + u32x b = MD5M_B; + u32x c = MD5M_C; + u32x d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H1, a, b, c, d, w1[1], MD5C20, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w2[0], MD5C21, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w2[3], MD5C22, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w3[2], MD5C23, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w0[1], MD5C24, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w1[0], MD5C25, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w1[3], MD5C26, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w2[2], MD5C27, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w3[1], MD5C28, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w0[0], MD5C29, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w0[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w1[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w2[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w3[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w3[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w0[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1[0], MD5C3c, MD5S30); + + bool q_cond = ((a & 0x00ffffff) != search[0]); + + if (q_cond) continue; + + MD5_STEP (MD5_I , d, a, b, c, w2[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2[1], MD5C3f, MD5S33); + + a &= 0x00ffffff; + d &= 0x00ffffff; + c &= 0x00ffffff; + b &= 0x00ffffff; + + const u32x r0 = a; + const u32x r1 = d; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_S + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m02410_s08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m02410_s16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/nv/m02410_a3.cu b/nv/m02410_a3.cu new file mode 100644 index 0000000000..cf038e6b03 --- /dev/null +++ b/nv/m02410_a3.cu @@ -0,0 +1,625 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _MD5_ +#define _SCALAR_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW2 +#define VECT_SIZE4 +#endif + +#define DGST_R0 0 +#define DGST_R1 3 +#define DGST_R2 2 +#define DGST_R3 1 + +#include "include/kernel_functions.c" +#include "types_nv.c" +#include "common_nv.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4_warp.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4_warp.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4_warp.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4_warp.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4_warp.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4_warp.c" +#endif + +__device__ __constant__ u32x c_bfs[1024]; + +__device__ static void m02410m (u32 w[16], const u32 pw_len, const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const u32x *words_buf_r, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset) +{ + /** + * modifier + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + const u32 lid = threadIdx.x; + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; + salt_buf0[1] = 0; + salt_buf0[2] = 0; + salt_buf0[3] = 0; + + u32 salt_buf1[4]; + + salt_buf1[0] = 0; + salt_buf1[1] = 0; + salt_buf1[2] = 0; + salt_buf1[3] = 0; + + u32 salt_buf2[4]; + + salt_buf2[0] = 0; + salt_buf2[1] = 0; + salt_buf2[2] = 0; + salt_buf2[3] = 0; + + u32 salt_buf3[4]; + + salt_buf3[0] = 0; + salt_buf3[1] = 0; + salt_buf3[2] = 0; + salt_buf3[3] = 0; + + switch_buffer_by_offset (salt_buf0, salt_buf1, salt_buf2, salt_buf3, pw_len); + + w[0] |= salt_buf0[0]; + w[1] |= salt_buf0[1]; + w[2] |= salt_buf0[2]; + w[3] |= salt_buf0[3]; + + const u32 salt_len = (salt_bufs[salt_pos].salt_len < 4) ? salt_bufs[salt_pos].salt_len : 4; + + const u32 pw_salt_len = pw_len + salt_len; + + truncate_block (w, pw_salt_len); + + /** + * algorithm specific + */ + + w[ 4] = 0x80; + w[14] = 16 * 8; + + /** + * base + */ + + const u32 F_w0c00 = 0 + MD5C00; + const u32 F_w1c01 = w[ 1] + MD5C01; + const u32 F_w2c02 = w[ 2] + MD5C02; + const u32 F_w3c03 = w[ 3] + MD5C03; + const u32 F_w4c04 = w[ 4] + MD5C04; + const u32 F_w5c05 = w[ 5] + MD5C05; + const u32 F_w6c06 = w[ 6] + MD5C06; + const u32 F_w7c07 = w[ 7] + MD5C07; + const u32 F_w8c08 = w[ 8] + MD5C08; + const u32 F_w9c09 = w[ 9] + MD5C09; + const u32 F_wac0a = w[10] + MD5C0a; + const u32 F_wbc0b = w[11] + MD5C0b; + const u32 F_wcc0c = w[12] + MD5C0c; + const u32 F_wdc0d = w[13] + MD5C0d; + const u32 F_wec0e = w[14] + MD5C0e; + const u32 F_wfc0f = w[15] + MD5C0f; + + const u32 G_w1c10 = w[ 1] + MD5C10; + const u32 G_w6c11 = w[ 6] + MD5C11; + const u32 G_wbc12 = w[11] + MD5C12; + const u32 G_w0c13 = 0 + MD5C13; + const u32 G_w5c14 = w[ 5] + MD5C14; + const u32 G_wac15 = w[10] + MD5C15; + const u32 G_wfc16 = w[15] + MD5C16; + const u32 G_w4c17 = w[ 4] + MD5C17; + const u32 G_w9c18 = w[ 9] + MD5C18; + const u32 G_wec19 = w[14] + MD5C19; + const u32 G_w3c1a = w[ 3] + MD5C1a; + const u32 G_w8c1b = w[ 8] + MD5C1b; + const u32 G_wdc1c = w[13] + MD5C1c; + const u32 G_w2c1d = w[ 2] + MD5C1d; + const u32 G_w7c1e = w[ 7] + MD5C1e; + const u32 G_wcc1f = w[12] + MD5C1f; + + const u32 H_w5c20 = w[ 5] + MD5C20; + const u32 H_w8c21 = w[ 8] + MD5C21; + const u32 H_wbc22 = w[11] + MD5C22; + const u32 H_wec23 = w[14] + MD5C23; + const u32 H_w1c24 = w[ 1] + MD5C24; + const u32 H_w4c25 = w[ 4] + MD5C25; + const u32 H_w7c26 = w[ 7] + MD5C26; + const u32 H_wac27 = w[10] + MD5C27; + const u32 H_wdc28 = w[13] + MD5C28; + const u32 H_w0c29 = 0 + MD5C29; + const u32 H_w3c2a = w[ 3] + MD5C2a; + const u32 H_w6c2b = w[ 6] + MD5C2b; + const u32 H_w9c2c = w[ 9] + MD5C2c; + const u32 H_wcc2d = w[12] + MD5C2d; + const u32 H_wfc2e = w[15] + MD5C2e; + const u32 H_w2c2f = w[ 2] + MD5C2f; + + const u32 I_w0c30 = 0 + MD5C30; + const u32 I_w7c31 = w[ 7] + MD5C31; + const u32 I_wec32 = w[14] + MD5C32; + const u32 I_w5c33 = w[ 5] + MD5C33; + const u32 I_wcc34 = w[12] + MD5C34; + const u32 I_w3c35 = w[ 3] + MD5C35; + const u32 I_wac36 = w[10] + MD5C36; + const u32 I_w1c37 = w[ 1] + MD5C37; + const u32 I_w8c38 = w[ 8] + MD5C38; + const u32 I_wfc39 = w[15] + MD5C39; + const u32 I_w6c3a = w[ 6] + MD5C3a; + const u32 I_wdc3b = w[13] + MD5C3b; + const u32 I_w4c3c = w[ 4] + MD5C3c; + const u32 I_wbc3d = w[11] + MD5C3d; + const u32 I_w2c3e = w[ 2] + MD5C3e; + const u32 I_w9c3f = w[ 9] + MD5C3f; + + /** + * loop + */ + + const u32 bf_loops = ceil ((float) bfs_cnt / VECT_DIV); + + u32x w0l = w[0]; + + for (u32 il_pos = 0; il_pos < bf_loops; il_pos++) + { + const u32x w0r = c_bfs[il_pos]; + + const u32x w0 = w0l | w0r; + + u32x tmp2; + + u32x a = MD5M_A; + u32x b = MD5M_B; + u32x c = MD5M_C; + u32x d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0, F_w0c00, MD5S00); + MD5_STEP0(MD5_Fo, d, a, b, c, F_w1c01, MD5S01); + MD5_STEP0(MD5_Fo, c, d, a, b, F_w2c02, MD5S02); + MD5_STEP0(MD5_Fo, b, c, d, a, F_w3c03, MD5S03); + MD5_STEP0(MD5_Fo, a, b, c, d, F_w4c04, MD5S00); + MD5_STEP0(MD5_Fo, d, a, b, c, F_w5c05, MD5S01); + MD5_STEP0(MD5_Fo, c, d, a, b, F_w6c06, MD5S02); + MD5_STEP0(MD5_Fo, b, c, d, a, F_w7c07, MD5S03); + MD5_STEP0(MD5_Fo, a, b, c, d, F_w8c08, MD5S00); + MD5_STEP0(MD5_Fo, d, a, b, c, F_w9c09, MD5S01); + MD5_STEP0(MD5_Fo, c, d, a, b, F_wac0a, MD5S02); + MD5_STEP0(MD5_Fo, b, c, d, a, F_wbc0b, MD5S03); + MD5_STEP0(MD5_Fo, a, b, c, d, F_wcc0c, MD5S00); + MD5_STEP0(MD5_Fo, d, a, b, c, F_wdc0d, MD5S01); + MD5_STEP0(MD5_Fo, c, d, a, b, F_wec0e, MD5S02); + MD5_STEP0(MD5_Fo, b, c, d, a, F_wfc0f, MD5S03); + + MD5_STEP0(MD5_Go, a, b, c, d, G_w1c10, MD5S10); + MD5_STEP0(MD5_Go, d, a, b, c, G_w6c11, MD5S11); + MD5_STEP0(MD5_Go, c, d, a, b, G_wbc12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0, G_w0c13, MD5S13); + MD5_STEP0(MD5_Go, a, b, c, d, G_w5c14, MD5S10); + MD5_STEP0(MD5_Go, d, a, b, c, G_wac15, MD5S11); + MD5_STEP0(MD5_Go, c, d, a, b, G_wfc16, MD5S12); + MD5_STEP0(MD5_Go, b, c, d, a, G_w4c17, MD5S13); + MD5_STEP0(MD5_Go, a, b, c, d, G_w9c18, MD5S10); + MD5_STEP0(MD5_Go, d, a, b, c, G_wec19, MD5S11); + MD5_STEP0(MD5_Go, c, d, a, b, G_w3c1a, MD5S12); + MD5_STEP0(MD5_Go, b, c, d, a, G_w8c1b, MD5S13); + MD5_STEP0(MD5_Go, a, b, c, d, G_wdc1c, MD5S10); + MD5_STEP0(MD5_Go, d, a, b, c, G_w2c1d, MD5S11); + MD5_STEP0(MD5_Go, c, d, a, b, G_w7c1e, MD5S12); + MD5_STEP0(MD5_Go, b, c, d, a, G_wcc1f, MD5S13); + + MD5_STEP0(MD5_H1, a, b, c, d, H_w5c20, MD5S20); + MD5_STEP0(MD5_H2, d, a, b, c, H_w8c21, MD5S21); + MD5_STEP0(MD5_H1, c, d, a, b, H_wbc22, MD5S22); + MD5_STEP0(MD5_H2, b, c, d, a, H_wec23, MD5S23); + MD5_STEP0(MD5_H1, a, b, c, d, H_w1c24, MD5S20); + MD5_STEP0(MD5_H2, d, a, b, c, H_w4c25, MD5S21); + MD5_STEP0(MD5_H1, c, d, a, b, H_w7c26, MD5S22); + MD5_STEP0(MD5_H2, b, c, d, a, H_wac27, MD5S23); + MD5_STEP0(MD5_H1, a, b, c, d, H_wdc28, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w0, H_w0c29, MD5S21); + MD5_STEP0(MD5_H1, c, d, a, b, H_w3c2a, MD5S22); + MD5_STEP0(MD5_H2, b, c, d, a, H_w6c2b, MD5S23); + MD5_STEP0(MD5_H1, a, b, c, d, H_w9c2c, MD5S20); + MD5_STEP0(MD5_H2, d, a, b, c, H_wcc2d, MD5S21); + MD5_STEP0(MD5_H1, c, d, a, b, H_wfc2e, MD5S22); + MD5_STEP0(MD5_H2, b, c, d, a, H_w2c2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0, I_w0c30, MD5S30); + MD5_STEP0(MD5_I , d, a, b, c, I_w7c31, MD5S31); + MD5_STEP0(MD5_I , c, d, a, b, I_wec32, MD5S32); + MD5_STEP0(MD5_I , b, c, d, a, I_w5c33, MD5S33); + MD5_STEP0(MD5_I , a, b, c, d, I_wcc34, MD5S30); + MD5_STEP0(MD5_I , d, a, b, c, I_w3c35, MD5S31); + MD5_STEP0(MD5_I , c, d, a, b, I_wac36, MD5S32); + MD5_STEP0(MD5_I , b, c, d, a, I_w1c37, MD5S33); + MD5_STEP0(MD5_I , a, b, c, d, I_w8c38, MD5S30); + MD5_STEP0(MD5_I , d, a, b, c, I_wfc39, MD5S31); + MD5_STEP0(MD5_I , c, d, a, b, I_w6c3a, MD5S32); + MD5_STEP0(MD5_I , b, c, d, a, I_wdc3b, MD5S33); + MD5_STEP0(MD5_I , a, b, c, d, I_w4c3c, MD5S30); + MD5_STEP0(MD5_I , d, a, b, c, I_wbc3d, MD5S31); + MD5_STEP0(MD5_I , c, d, a, b, I_w2c3e, MD5S32); + MD5_STEP0(MD5_I , b, c, d, a, I_w9c3f, MD5S33); + + a &= 0x00ffffff; + d &= 0x00ffffff; + c &= 0x00ffffff; + b &= 0x00ffffff; + + const u32x r0 = a; + const u32x r1 = d; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_M + } +} + +__device__ static void m02410s (u32 w[16], const u32 pw_len, const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const u32x *words_buf_r, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset) +{ + /** + * modifier + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + const u32 lid = threadIdx.x; + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; + salt_buf0[1] = 0; + salt_buf0[2] = 0; + salt_buf0[3] = 0; + + u32 salt_buf1[4]; + + salt_buf1[0] = 0; + salt_buf1[1] = 0; + salt_buf1[2] = 0; + salt_buf1[3] = 0; + + u32 salt_buf2[4]; + + salt_buf2[0] = 0; + salt_buf2[1] = 0; + salt_buf2[2] = 0; + salt_buf2[3] = 0; + + u32 salt_buf3[4]; + + salt_buf3[0] = 0; + salt_buf3[1] = 0; + salt_buf3[2] = 0; + salt_buf3[3] = 0; + + switch_buffer_by_offset (salt_buf0, salt_buf1, salt_buf2, salt_buf3, pw_len); + + w[0] |= salt_buf0[0]; + w[1] |= salt_buf0[1]; + w[2] |= salt_buf0[2]; + w[3] |= salt_buf0[3]; + + const u32 salt_len = (salt_bufs[salt_pos].salt_len < 4) ? salt_bufs[salt_pos].salt_len : 4; + + const u32 pw_salt_len = pw_len + salt_len; + + truncate_block (w, pw_salt_len); + + /** + * algorithm specific + */ + + w[ 4] = 0x80; + w[14] = 16 * 8; + + /** + * base + */ + + const u32 F_w0c00 = 0 + MD5C00; + const u32 F_w1c01 = w[ 1] + MD5C01; + const u32 F_w2c02 = w[ 2] + MD5C02; + const u32 F_w3c03 = w[ 3] + MD5C03; + const u32 F_w4c04 = w[ 4] + MD5C04; + const u32 F_w5c05 = w[ 5] + MD5C05; + const u32 F_w6c06 = w[ 6] + MD5C06; + const u32 F_w7c07 = w[ 7] + MD5C07; + const u32 F_w8c08 = w[ 8] + MD5C08; + const u32 F_w9c09 = w[ 9] + MD5C09; + const u32 F_wac0a = w[10] + MD5C0a; + const u32 F_wbc0b = w[11] + MD5C0b; + const u32 F_wcc0c = w[12] + MD5C0c; + const u32 F_wdc0d = w[13] + MD5C0d; + const u32 F_wec0e = w[14] + MD5C0e; + const u32 F_wfc0f = w[15] + MD5C0f; + + const u32 G_w1c10 = w[ 1] + MD5C10; + const u32 G_w6c11 = w[ 6] + MD5C11; + const u32 G_wbc12 = w[11] + MD5C12; + const u32 G_w0c13 = 0 + MD5C13; + const u32 G_w5c14 = w[ 5] + MD5C14; + const u32 G_wac15 = w[10] + MD5C15; + const u32 G_wfc16 = w[15] + MD5C16; + const u32 G_w4c17 = w[ 4] + MD5C17; + const u32 G_w9c18 = w[ 9] + MD5C18; + const u32 G_wec19 = w[14] + MD5C19; + const u32 G_w3c1a = w[ 3] + MD5C1a; + const u32 G_w8c1b = w[ 8] + MD5C1b; + const u32 G_wdc1c = w[13] + MD5C1c; + const u32 G_w2c1d = w[ 2] + MD5C1d; + const u32 G_w7c1e = w[ 7] + MD5C1e; + const u32 G_wcc1f = w[12] + MD5C1f; + + const u32 H_w5c20 = w[ 5] + MD5C20; + const u32 H_w8c21 = w[ 8] + MD5C21; + const u32 H_wbc22 = w[11] + MD5C22; + const u32 H_wec23 = w[14] + MD5C23; + const u32 H_w1c24 = w[ 1] + MD5C24; + const u32 H_w4c25 = w[ 4] + MD5C25; + const u32 H_w7c26 = w[ 7] + MD5C26; + const u32 H_wac27 = w[10] + MD5C27; + const u32 H_wdc28 = w[13] + MD5C28; + const u32 H_w0c29 = 0 + MD5C29; + const u32 H_w3c2a = w[ 3] + MD5C2a; + const u32 H_w6c2b = w[ 6] + MD5C2b; + const u32 H_w9c2c = w[ 9] + MD5C2c; + const u32 H_wcc2d = w[12] + MD5C2d; + const u32 H_wfc2e = w[15] + MD5C2e; + const u32 H_w2c2f = w[ 2] + MD5C2f; + + const u32 I_w0c30 = 0 + MD5C30; + const u32 I_w7c31 = w[ 7] + MD5C31; + const u32 I_wec32 = w[14] + MD5C32; + const u32 I_w5c33 = w[ 5] + MD5C33; + const u32 I_wcc34 = w[12] + MD5C34; + const u32 I_w3c35 = w[ 3] + MD5C35; + const u32 I_wac36 = w[10] + MD5C36; + const u32 I_w1c37 = w[ 1] + MD5C37; + const u32 I_w8c38 = w[ 8] + MD5C38; + const u32 I_wfc39 = w[15] + MD5C39; + const u32 I_w6c3a = w[ 6] + MD5C3a; + const u32 I_wdc3b = w[13] + MD5C3b; + const u32 I_w4c3c = w[ 4] + MD5C3c; + const u32 I_wbc3d = w[11] + MD5C3d; + const u32 I_w2c3e = w[ 2] + MD5C3e; + const u32 I_w9c3f = w[ 9] + MD5C3f; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * loop + */ + + const u32 bf_loops = ceil ((float) bfs_cnt / VECT_DIV); + + u32x w0l = w[0]; + + for (u32 il_pos = 0; il_pos < bf_loops; il_pos++) + { + const u32x w0r = c_bfs[il_pos]; + + const u32x w0 = w0l | w0r; + + u32x tmp2; + + u32x a = MD5M_A; + u32x b = MD5M_B; + u32x c = MD5M_C; + u32x d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0, F_w0c00, MD5S00); + MD5_STEP0(MD5_Fo, d, a, b, c, F_w1c01, MD5S01); + MD5_STEP0(MD5_Fo, c, d, a, b, F_w2c02, MD5S02); + MD5_STEP0(MD5_Fo, b, c, d, a, F_w3c03, MD5S03); + MD5_STEP0(MD5_Fo, a, b, c, d, F_w4c04, MD5S00); + MD5_STEP0(MD5_Fo, d, a, b, c, F_w5c05, MD5S01); + MD5_STEP0(MD5_Fo, c, d, a, b, F_w6c06, MD5S02); + MD5_STEP0(MD5_Fo, b, c, d, a, F_w7c07, MD5S03); + MD5_STEP0(MD5_Fo, a, b, c, d, F_w8c08, MD5S00); + MD5_STEP0(MD5_Fo, d, a, b, c, F_w9c09, MD5S01); + MD5_STEP0(MD5_Fo, c, d, a, b, F_wac0a, MD5S02); + MD5_STEP0(MD5_Fo, b, c, d, a, F_wbc0b, MD5S03); + MD5_STEP0(MD5_Fo, a, b, c, d, F_wcc0c, MD5S00); + MD5_STEP0(MD5_Fo, d, a, b, c, F_wdc0d, MD5S01); + MD5_STEP0(MD5_Fo, c, d, a, b, F_wec0e, MD5S02); + MD5_STEP0(MD5_Fo, b, c, d, a, F_wfc0f, MD5S03); + + MD5_STEP0(MD5_Go, a, b, c, d, G_w1c10, MD5S10); + MD5_STEP0(MD5_Go, d, a, b, c, G_w6c11, MD5S11); + MD5_STEP0(MD5_Go, c, d, a, b, G_wbc12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0, G_w0c13, MD5S13); + MD5_STEP0(MD5_Go, a, b, c, d, G_w5c14, MD5S10); + MD5_STEP0(MD5_Go, d, a, b, c, G_wac15, MD5S11); + MD5_STEP0(MD5_Go, c, d, a, b, G_wfc16, MD5S12); + MD5_STEP0(MD5_Go, b, c, d, a, G_w4c17, MD5S13); + MD5_STEP0(MD5_Go, a, b, c, d, G_w9c18, MD5S10); + MD5_STEP0(MD5_Go, d, a, b, c, G_wec19, MD5S11); + MD5_STEP0(MD5_Go, c, d, a, b, G_w3c1a, MD5S12); + MD5_STEP0(MD5_Go, b, c, d, a, G_w8c1b, MD5S13); + MD5_STEP0(MD5_Go, a, b, c, d, G_wdc1c, MD5S10); + MD5_STEP0(MD5_Go, d, a, b, c, G_w2c1d, MD5S11); + MD5_STEP0(MD5_Go, c, d, a, b, G_w7c1e, MD5S12); + MD5_STEP0(MD5_Go, b, c, d, a, G_wcc1f, MD5S13); + + MD5_STEP0(MD5_H1, a, b, c, d, H_w5c20, MD5S20); + MD5_STEP0(MD5_H2, d, a, b, c, H_w8c21, MD5S21); + MD5_STEP0(MD5_H1, c, d, a, b, H_wbc22, MD5S22); + MD5_STEP0(MD5_H2, b, c, d, a, H_wec23, MD5S23); + MD5_STEP0(MD5_H1, a, b, c, d, H_w1c24, MD5S20); + MD5_STEP0(MD5_H2, d, a, b, c, H_w4c25, MD5S21); + MD5_STEP0(MD5_H1, c, d, a, b, H_w7c26, MD5S22); + MD5_STEP0(MD5_H2, b, c, d, a, H_wac27, MD5S23); + MD5_STEP0(MD5_H1, a, b, c, d, H_wdc28, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w0, H_w0c29, MD5S21); + MD5_STEP0(MD5_H1, c, d, a, b, H_w3c2a, MD5S22); + MD5_STEP0(MD5_H2, b, c, d, a, H_w6c2b, MD5S23); + MD5_STEP0(MD5_H1, a, b, c, d, H_w9c2c, MD5S20); + MD5_STEP0(MD5_H2, d, a, b, c, H_wcc2d, MD5S21); + MD5_STEP0(MD5_H1, c, d, a, b, H_wfc2e, MD5S22); + MD5_STEP0(MD5_H2, b, c, d, a, H_w2c2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0, I_w0c30, MD5S30); + MD5_STEP0(MD5_I , d, a, b, c, I_w7c31, MD5S31); + MD5_STEP0(MD5_I , c, d, a, b, I_wec32, MD5S32); + MD5_STEP0(MD5_I , b, c, d, a, I_w5c33, MD5S33); + MD5_STEP0(MD5_I , a, b, c, d, I_wcc34, MD5S30); + MD5_STEP0(MD5_I , d, a, b, c, I_w3c35, MD5S31); + MD5_STEP0(MD5_I , c, d, a, b, I_wac36, MD5S32); + MD5_STEP0(MD5_I , b, c, d, a, I_w1c37, MD5S33); + MD5_STEP0(MD5_I , a, b, c, d, I_w8c38, MD5S30); + MD5_STEP0(MD5_I , d, a, b, c, I_wfc39, MD5S31); + MD5_STEP0(MD5_I , c, d, a, b, I_w6c3a, MD5S32); + MD5_STEP0(MD5_I , b, c, d, a, I_wdc3b, MD5S33); + MD5_STEP0(MD5_I , a, b, c, d, I_w4c3c, MD5S30); + + bool q_cond = ((a & 0x00ffffff) != search[0]); + + if (q_cond) continue; + + MD5_STEP0(MD5_I , d, a, b, c, I_wbc3d, MD5S31); + MD5_STEP0(MD5_I , c, d, a, b, I_w2c3e, MD5S32); + MD5_STEP0(MD5_I , b, c, d, a, I_w9c3f, MD5S33); + + a &= 0x00ffffff; + d &= 0x00ffffff; + c &= 0x00ffffff; + b &= 0x00ffffff; + + const u32x r0 = a; + const u32x r1 = d; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_S + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m02410_m04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const u32x *words_buf_r, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32 w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = 0; + w[ 5] = 0; + w[ 6] = 0; + w[ 7] = 0; + w[ 8] = 0; + w[ 9] = 0; + w[10] = 0; + w[11] = 0; + w[12] = 0; + w[13] = 0; + w[14] = 0; + w[15] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m02410m (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m02410_m08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const u32x *words_buf_r, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m02410_m16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const u32x *words_buf_r, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m02410_s04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const u32x *words_buf_r, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32 w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = 0; + w[ 5] = 0; + w[ 6] = 0; + w[ 7] = 0; + w[ 8] = 0; + w[ 9] = 0; + w[10] = 0; + w[11] = 0; + w[12] = 0; + w[13] = 0; + w[14] = 0; + w[15] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m02410s (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m02410_s08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const u32x *words_buf_r, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m02410_s16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const u32x *words_buf_r, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/nv/m02500.cu b/nv/m02500.cu new file mode 100644 index 0000000000..c74aa25489 --- /dev/null +++ b/nv/m02500.cu @@ -0,0 +1,920 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _WPA_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW2 +#define VECT_SIZE1 +#endif + +#define DGST_R0 0 +#define DGST_R1 1 +#define DGST_R2 2 +#define DGST_R3 3 + +#include "include/kernel_functions.c" +#include "types_nv.c" +#include "common_nv.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +__device__ static void md5_transform (const u32x w0[4], const u32x w1[4], const u32x w2[4], const u32x w3[4], u32x digest[4]) +{ + u32x a = digest[0]; + u32x b = digest[1]; + u32x c = digest[2]; + u32x d = digest[3]; + + u32x w0_t = w0[0]; + u32x w1_t = w0[1]; + u32x w2_t = w0[2]; + u32x w3_t = w0[3]; + u32x w4_t = w1[0]; + u32x w5_t = w1[1]; + u32x w6_t = w1[2]; + u32x w7_t = w1[3]; + u32x w8_t = w2[0]; + u32x w9_t = w2[1]; + u32x wa_t = w2[2]; + u32x wb_t = w2[3]; + u32x wc_t = w3[0]; + u32x wd_t = w3[1]; + u32x we_t = w3[2]; + u32x wf_t = w3[3]; + + u32x tmp2; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t, MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t, MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t, MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t, MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w4_t, MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w5_t, MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w6_t, MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w7_t, MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w8_t, MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w9_t, MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, wa_t, MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, wb_t, MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, wc_t, MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, wd_t, MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, we_t, MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, wf_t, MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w1_t, MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w6_t, MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, wb_t, MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t, MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w5_t, MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, wa_t, MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, wf_t, MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w4_t, MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w9_t, MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, we_t, MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t, MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w8_t, MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, wd_t, MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t, MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w7_t, MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, wc_t, MD5C1f, MD5S13); + + MD5_STEP (MD5_H1, a, b, c, d, w5_t, MD5C20, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w8_t, MD5C21, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, wb_t, MD5C22, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, we_t, MD5C23, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w1_t, MD5C24, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w4_t, MD5C25, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w7_t, MD5C26, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, wa_t, MD5C27, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, wd_t, MD5C28, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w0_t, MD5C29, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w3_t, MD5C2a, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w6_t, MD5C2b, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w9_t, MD5C2c, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, wc_t, MD5C2d, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, wf_t, MD5C2e, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w2_t, MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t, MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w7_t, MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, we_t, MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w5_t, MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, wc_t, MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t, MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, wa_t, MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t, MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w8_t, MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, wf_t, MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w6_t, MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, wd_t, MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w4_t, MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, wb_t, MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t, MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w9_t, MD5C3f, MD5S33); + + digest[0] += a; + digest[1] += b; + digest[2] += c; + digest[3] += d; +} + +__device__ static void hmac_md5_pad (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], u32x ipad[4], u32x opad[4]) +{ + w0[0] = w0[0] ^ 0x36363636; + w0[1] = w0[1] ^ 0x36363636; + w0[2] = w0[2] ^ 0x36363636; + w0[3] = w0[3] ^ 0x36363636; + w1[0] = w1[0] ^ 0x36363636; + w1[1] = w1[1] ^ 0x36363636; + w1[2] = w1[2] ^ 0x36363636; + w1[3] = w1[3] ^ 0x36363636; + w2[0] = w2[0] ^ 0x36363636; + w2[1] = w2[1] ^ 0x36363636; + w2[2] = w2[2] ^ 0x36363636; + w2[3] = w2[3] ^ 0x36363636; + w3[0] = w3[0] ^ 0x36363636; + w3[1] = w3[1] ^ 0x36363636; + w3[2] = w3[2] ^ 0x36363636; + w3[3] = w3[3] ^ 0x36363636; + + ipad[0] = MD5M_A; + ipad[1] = MD5M_B; + ipad[2] = MD5M_C; + ipad[3] = MD5M_D; + + md5_transform (w0, w1, w2, w3, ipad); + + w0[0] = w0[0] ^ 0x6a6a6a6a; + w0[1] = w0[1] ^ 0x6a6a6a6a; + w0[2] = w0[2] ^ 0x6a6a6a6a; + w0[3] = w0[3] ^ 0x6a6a6a6a; + w1[0] = w1[0] ^ 0x6a6a6a6a; + w1[1] = w1[1] ^ 0x6a6a6a6a; + w1[2] = w1[2] ^ 0x6a6a6a6a; + w1[3] = w1[3] ^ 0x6a6a6a6a; + w2[0] = w2[0] ^ 0x6a6a6a6a; + w2[1] = w2[1] ^ 0x6a6a6a6a; + w2[2] = w2[2] ^ 0x6a6a6a6a; + w2[3] = w2[3] ^ 0x6a6a6a6a; + w3[0] = w3[0] ^ 0x6a6a6a6a; + w3[1] = w3[1] ^ 0x6a6a6a6a; + w3[2] = w3[2] ^ 0x6a6a6a6a; + w3[3] = w3[3] ^ 0x6a6a6a6a; + + opad[0] = MD5M_A; + opad[1] = MD5M_B; + opad[2] = MD5M_C; + opad[3] = MD5M_D; + + md5_transform (w0, w1, w2, w3, opad); +} + +__device__ static void hmac_md5_run (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], u32x ipad[4], u32x opad[4], u32x digest[4]) +{ + digest[0] = ipad[0]; + digest[1] = ipad[1]; + digest[2] = ipad[2]; + digest[3] = ipad[3]; + + md5_transform (w0, w1, w2, w3, digest); + + w0[0] = digest[0]; + w0[1] = digest[1]; + w0[2] = digest[2]; + w0[3] = digest[3]; + w1[0] = 0x80; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + w3[0] = 0; + w3[1] = 0; + w3[2] = (64 + 16) * 8; + w3[3] = 0; + + digest[0] = opad[0]; + digest[1] = opad[1]; + digest[2] = opad[2]; + digest[3] = opad[3]; + + md5_transform (w0, w1, w2, w3, digest); +} + +__device__ static void sha1_transform (const u32x w0[4], const u32x w1[4], const u32x w2[4], const u32x w3[4], u32x digest[5]) +{ + u32x A = digest[0]; + u32x B = digest[1]; + u32x C = digest[2]; + u32x D = digest[3]; + u32x E = digest[4]; + + u32x w0_t = w0[0]; + u32x w1_t = w0[1]; + u32x w2_t = w0[2]; + u32x w3_t = w0[3]; + u32x w4_t = w1[0]; + u32x w5_t = w1[1]; + u32x w6_t = w1[2]; + u32x w7_t = w1[3]; + u32x w8_t = w2[0]; + u32x w9_t = w2[1]; + u32x wa_t = w2[2]; + u32x wb_t = w2[3]; + u32x wc_t = w3[0]; + u32x wd_t = w3[1]; + u32x we_t = w3[2]; + u32x wf_t = w3[3]; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, A, B, C, D, E, w0_t); + SHA1_STEP (SHA1_F0o, E, A, B, C, D, w1_t); + SHA1_STEP (SHA1_F0o, D, E, A, B, C, w2_t); + SHA1_STEP (SHA1_F0o, C, D, E, A, B, w3_t); + SHA1_STEP (SHA1_F0o, B, C, D, E, A, w4_t); + SHA1_STEP (SHA1_F0o, A, B, C, D, E, w5_t); + SHA1_STEP (SHA1_F0o, E, A, B, C, D, w6_t); + SHA1_STEP (SHA1_F0o, D, E, A, B, C, w7_t); + SHA1_STEP (SHA1_F0o, C, D, E, A, B, w8_t); + SHA1_STEP (SHA1_F0o, B, C, D, E, A, w9_t); + SHA1_STEP (SHA1_F0o, A, B, C, D, E, wa_t); + SHA1_STEP (SHA1_F0o, E, A, B, C, D, wb_t); + SHA1_STEP (SHA1_F0o, D, E, A, B, C, wc_t); + SHA1_STEP (SHA1_F0o, C, D, E, A, B, wd_t); + SHA1_STEP (SHA1_F0o, B, C, D, E, A, we_t); + SHA1_STEP (SHA1_F0o, A, B, C, D, E, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F0o, E, A, B, C, D, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F0o, D, E, A, B, C, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F0o, C, D, E, A, B, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F0o, B, C, D, E, A, w3_t); + + #undef K + #define K SHA1C01 + + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w7_t); + + #undef K + #define K SHA1C02 + + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, wb_t); + + #undef K + #define K SHA1C03 + + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, wf_t); + + digest[0] += A; + digest[1] += B; + digest[2] += C; + digest[3] += D; + digest[4] += E; +} + +__device__ static void hmac_sha1_pad (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], u32x ipad[5], u32x opad[5]) +{ + w0[0] = w0[0] ^ 0x36363636; + w0[1] = w0[1] ^ 0x36363636; + w0[2] = w0[2] ^ 0x36363636; + w0[3] = w0[3] ^ 0x36363636; + w1[0] = w1[0] ^ 0x36363636; + w1[1] = w1[1] ^ 0x36363636; + w1[2] = w1[2] ^ 0x36363636; + w1[3] = w1[3] ^ 0x36363636; + w2[0] = w2[0] ^ 0x36363636; + w2[1] = w2[1] ^ 0x36363636; + w2[2] = w2[2] ^ 0x36363636; + w2[3] = w2[3] ^ 0x36363636; + w3[0] = w3[0] ^ 0x36363636; + w3[1] = w3[1] ^ 0x36363636; + w3[2] = w3[2] ^ 0x36363636; + w3[3] = w3[3] ^ 0x36363636; + + ipad[0] = SHA1M_A; + ipad[1] = SHA1M_B; + ipad[2] = SHA1M_C; + ipad[3] = SHA1M_D; + ipad[4] = SHA1M_E; + + sha1_transform (w0, w1, w2, w3, ipad); + + w0[0] = w0[0] ^ 0x6a6a6a6a; + w0[1] = w0[1] ^ 0x6a6a6a6a; + w0[2] = w0[2] ^ 0x6a6a6a6a; + w0[3] = w0[3] ^ 0x6a6a6a6a; + w1[0] = w1[0] ^ 0x6a6a6a6a; + w1[1] = w1[1] ^ 0x6a6a6a6a; + w1[2] = w1[2] ^ 0x6a6a6a6a; + w1[3] = w1[3] ^ 0x6a6a6a6a; + w2[0] = w2[0] ^ 0x6a6a6a6a; + w2[1] = w2[1] ^ 0x6a6a6a6a; + w2[2] = w2[2] ^ 0x6a6a6a6a; + w2[3] = w2[3] ^ 0x6a6a6a6a; + w3[0] = w3[0] ^ 0x6a6a6a6a; + w3[1] = w3[1] ^ 0x6a6a6a6a; + w3[2] = w3[2] ^ 0x6a6a6a6a; + w3[3] = w3[3] ^ 0x6a6a6a6a; + + opad[0] = SHA1M_A; + opad[1] = SHA1M_B; + opad[2] = SHA1M_C; + opad[3] = SHA1M_D; + opad[4] = SHA1M_E; + + sha1_transform (w0, w1, w2, w3, opad); +} + +__device__ static void hmac_sha1_run (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], u32x ipad[5], u32x opad[5], u32x digest[5]) +{ + digest[0] = ipad[0]; + digest[1] = ipad[1]; + digest[2] = ipad[2]; + digest[3] = ipad[3]; + digest[4] = ipad[4]; + + sha1_transform (w0, w1, w2, w3, digest); + + w0[0] = digest[0]; + w0[1] = digest[1]; + w0[2] = digest[2]; + w0[3] = digest[3]; + w1[0] = digest[4]; + w1[1] = 0x80000000; + w1[2] = 0; + w1[3] = 0; + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = (64 + 20) * 8; + + digest[0] = opad[0]; + digest[1] = opad[1]; + digest[2] = opad[2]; + digest[3] = opad[3]; + digest[4] = opad[4]; + + sha1_transform (w0, w1, w2, w3, digest); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m02500_init (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, wpa_tmp_t *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const wpa_t *wpa_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = pws[gid].i[ 8]; + w2[1] = pws[gid].i[ 9]; + w2[2] = pws[gid].i[10]; + w2[3] = pws[gid].i[11]; + + u32x w3[4]; + + w3[0] = pws[gid].i[12]; + w3[1] = pws[gid].i[13]; + w3[2] = pws[gid].i[14]; + w3[3] = pws[gid].i[15]; + + /** + * salt + */ + + u32 salt_len = salt_bufs[salt_pos].salt_len; + + u32 salt_buf0[4]; + u32 salt_buf1[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[3]; + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[7]; + + /** + * pads + */ + + w0[0] = swap_workaround (w0[0]); + w0[1] = swap_workaround (w0[1]); + w0[2] = swap_workaround (w0[2]); + w0[3] = swap_workaround (w0[3]); + w1[0] = swap_workaround (w1[0]); + w1[1] = swap_workaround (w1[1]); + w1[2] = swap_workaround (w1[2]); + w1[3] = swap_workaround (w1[3]); + w2[0] = swap_workaround (w2[0]); + w2[1] = swap_workaround (w2[1]); + w2[2] = swap_workaround (w2[2]); + w2[3] = swap_workaround (w2[3]); + w3[0] = swap_workaround (w3[0]); + w3[1] = swap_workaround (w3[1]); + w3[2] = swap_workaround (w3[2]); + w3[3] = swap_workaround (w3[3]); + + u32x ipad[5]; + u32x opad[5]; + + hmac_sha1_pad (w0, w1, w2, w3, ipad, opad); + + tmps[gid].ipad[0] = ipad[0]; + tmps[gid].ipad[1] = ipad[1]; + tmps[gid].ipad[2] = ipad[2]; + tmps[gid].ipad[3] = ipad[3]; + tmps[gid].ipad[4] = ipad[4]; + + tmps[gid].opad[0] = opad[0]; + tmps[gid].opad[1] = opad[1]; + tmps[gid].opad[2] = opad[2]; + tmps[gid].opad[3] = opad[3]; + tmps[gid].opad[4] = opad[4]; + + for (u32 i = 0, j = 1; i < 8; i += 5, j += 1) + { + w0[0] = salt_buf0[0]; + w0[1] = salt_buf0[1]; + w0[2] = salt_buf0[2]; + w0[3] = salt_buf0[3]; + w1[0] = salt_buf1[0]; + w1[1] = salt_buf1[1]; + w1[2] = salt_buf1[2]; + w1[3] = salt_buf1[3]; + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + if (j == 1) + append_0x01_3 (w0, w1, w2, salt_len + 3); + else + append_0x02_3 (w0, w1, w2, salt_len + 3); + + append_0x80_3 (w0, w1, w2, salt_len + 4); + + w0[0] = swap_workaround (w0[0]); + w0[1] = swap_workaround (w0[1]); + w0[2] = swap_workaround (w0[2]); + w0[3] = swap_workaround (w0[3]); + w1[0] = swap_workaround (w1[0]); + w1[1] = swap_workaround (w1[1]); + w1[2] = swap_workaround (w1[2]); + w1[3] = swap_workaround (w1[3]); + w2[0] = swap_workaround (w2[0]); + w2[1] = swap_workaround (w2[1]); + w2[2] = 0; + w2[3] = 0; + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = (64 + salt_len + 4) * 8; + + u32x dgst[5]; + + hmac_sha1_run (w0, w1, w2, w3, ipad, opad, dgst); + + tmps[gid].dgst[i + 0] = dgst[0]; + tmps[gid].dgst[i + 1] = dgst[1]; + tmps[gid].dgst[i + 2] = dgst[2]; + tmps[gid].dgst[i + 3] = dgst[3]; + tmps[gid].dgst[i + 4] = dgst[4]; + + tmps[gid].out[i + 0] = dgst[0]; + tmps[gid].out[i + 1] = dgst[1]; + tmps[gid].out[i + 2] = dgst[2]; + tmps[gid].out[i + 3] = dgst[3]; + tmps[gid].out[i + 4] = dgst[4]; + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m02500_loop (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, wpa_tmp_t *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const wpa_t *wpa_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x ipad[5]; + u32x opad[5]; + + ipad[0] = tmps[gid].ipad[0]; + ipad[1] = tmps[gid].ipad[1]; + ipad[2] = tmps[gid].ipad[2]; + ipad[3] = tmps[gid].ipad[3]; + ipad[4] = tmps[gid].ipad[4]; + + opad[0] = tmps[gid].opad[0]; + opad[1] = tmps[gid].opad[1]; + opad[2] = tmps[gid].opad[2]; + opad[3] = tmps[gid].opad[3]; + opad[4] = tmps[gid].opad[4]; + + for (u32 i = 0; i < 8; i += 5) + { + u32x dgst[5]; + u32x out[5]; + + dgst[0] = tmps[gid].dgst[i + 0]; + dgst[1] = tmps[gid].dgst[i + 1]; + dgst[2] = tmps[gid].dgst[i + 2]; + dgst[3] = tmps[gid].dgst[i + 3]; + dgst[4] = tmps[gid].dgst[i + 4]; + + out[0] = tmps[gid].out[i + 0]; + out[1] = tmps[gid].out[i + 1]; + out[2] = tmps[gid].out[i + 2]; + out[3] = tmps[gid].out[i + 3]; + out[4] = tmps[gid].out[i + 4]; + + for (u32 j = 0; j < loop_cnt; j++) + { + u32x w0[4]; + u32x w1[4]; + u32x w2[4]; + u32x w3[4]; + + w0[0] = dgst[0]; + w0[1] = dgst[1]; + w0[2] = dgst[2]; + w0[3] = dgst[3]; + w1[0] = dgst[4]; + w1[1] = 0x80000000; + w1[2] = 0; + w1[3] = 0; + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = (64 + 20) * 8; + + hmac_sha1_run (w0, w1, w2, w3, ipad, opad, dgst); + + out[0] ^= dgst[0]; + out[1] ^= dgst[1]; + out[2] ^= dgst[2]; + out[3] ^= dgst[3]; + out[4] ^= dgst[4]; + } + + tmps[gid].dgst[i + 0] = dgst[0]; + tmps[gid].dgst[i + 1] = dgst[1]; + tmps[gid].dgst[i + 2] = dgst[2]; + tmps[gid].dgst[i + 3] = dgst[3]; + tmps[gid].dgst[i + 4] = dgst[4]; + + tmps[gid].out[i + 0] = out[0]; + tmps[gid].out[i + 1] = out[1]; + tmps[gid].out[i + 2] = out[2]; + tmps[gid].out[i + 3] = out[3]; + tmps[gid].out[i + 4] = out[4]; + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m02500_comp (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, wpa_tmp_t *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const wpa_t *wpa_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + const u32 lid = threadIdx.x; + + u32x w0[4]; + u32x w1[4]; + u32x w2[4]; + u32x w3[4]; + + w0[0] = tmps[gid].out[0]; + w0[1] = tmps[gid].out[1]; + w0[2] = tmps[gid].out[2]; + w0[3] = tmps[gid].out[3]; + w1[0] = tmps[gid].out[4]; + w1[1] = tmps[gid].out[5]; + w1[2] = tmps[gid].out[6]; + w1[3] = tmps[gid].out[7]; + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + u32x ipad[5]; + u32x opad[5]; + + hmac_sha1_pad (w0, w1, w2, w3, ipad, opad); + + w0[0] = wpa_bufs[salt_pos].pke[ 0]; + w0[1] = wpa_bufs[salt_pos].pke[ 1]; + w0[2] = wpa_bufs[salt_pos].pke[ 2]; + w0[3] = wpa_bufs[salt_pos].pke[ 3]; + w1[0] = wpa_bufs[salt_pos].pke[ 4]; + w1[1] = wpa_bufs[salt_pos].pke[ 5]; + w1[2] = wpa_bufs[salt_pos].pke[ 6]; + w1[3] = wpa_bufs[salt_pos].pke[ 7]; + w2[0] = wpa_bufs[salt_pos].pke[ 8]; + w2[1] = wpa_bufs[salt_pos].pke[ 9]; + w2[2] = wpa_bufs[salt_pos].pke[10]; + w2[3] = wpa_bufs[salt_pos].pke[11]; + w3[0] = wpa_bufs[salt_pos].pke[12]; + w3[1] = wpa_bufs[salt_pos].pke[13]; + w3[2] = wpa_bufs[salt_pos].pke[14]; + w3[3] = wpa_bufs[salt_pos].pke[15]; + + sha1_transform (w0, w1, w2, w3, ipad); + + w0[0] = wpa_bufs[salt_pos].pke[16]; + w0[1] = wpa_bufs[salt_pos].pke[17]; + w0[2] = wpa_bufs[salt_pos].pke[18]; + w0[3] = wpa_bufs[salt_pos].pke[19]; + w1[0] = wpa_bufs[salt_pos].pke[20]; + w1[1] = wpa_bufs[salt_pos].pke[21]; + w1[2] = wpa_bufs[salt_pos].pke[22]; + w1[3] = wpa_bufs[salt_pos].pke[23]; + w2[0] = wpa_bufs[salt_pos].pke[24]; + w2[1] = 0x80000000; + w2[2] = 0; + w2[3] = 0; + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = (64 + 100) * 8; + + u32x digest[5]; + + hmac_sha1_run (w0, w1, w2, w3, ipad, opad, digest); + + { + w0[0] = swap_workaround (digest[0]); + w0[1] = swap_workaround (digest[1]); + w0[2] = swap_workaround (digest[2]); + w0[3] = swap_workaround (digest[3]); + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + hmac_md5_pad (w0, w1, w2, w3, ipad, opad); + + int eapol_size = wpa_bufs[salt_pos].eapol_size; + + int eapol_left; + int eapol_off; + + for (eapol_left = eapol_size, eapol_off = 0; eapol_left >= 56; eapol_left -= 64, eapol_off += 16) + { + w0[0] = wpa_bufs[salt_pos].eapol[eapol_off + 0]; + w0[1] = wpa_bufs[salt_pos].eapol[eapol_off + 1]; + w0[2] = wpa_bufs[salt_pos].eapol[eapol_off + 2]; + w0[3] = wpa_bufs[salt_pos].eapol[eapol_off + 3]; + w1[0] = wpa_bufs[salt_pos].eapol[eapol_off + 4]; + w1[1] = wpa_bufs[salt_pos].eapol[eapol_off + 5]; + w1[2] = wpa_bufs[salt_pos].eapol[eapol_off + 6]; + w1[3] = wpa_bufs[salt_pos].eapol[eapol_off + 7]; + w2[0] = wpa_bufs[salt_pos].eapol[eapol_off + 8]; + w2[1] = wpa_bufs[salt_pos].eapol[eapol_off + 9]; + w2[2] = wpa_bufs[salt_pos].eapol[eapol_off + 10]; + w2[3] = wpa_bufs[salt_pos].eapol[eapol_off + 11]; + w3[0] = wpa_bufs[salt_pos].eapol[eapol_off + 12]; + w3[1] = wpa_bufs[salt_pos].eapol[eapol_off + 13]; + w3[2] = wpa_bufs[salt_pos].eapol[eapol_off + 14]; + w3[3] = wpa_bufs[salt_pos].eapol[eapol_off + 15]; + + md5_transform (w0, w1, w2, w3, ipad); + } + + w0[0] = wpa_bufs[salt_pos].eapol[eapol_off + 0]; + w0[1] = wpa_bufs[salt_pos].eapol[eapol_off + 1]; + w0[2] = wpa_bufs[salt_pos].eapol[eapol_off + 2]; + w0[3] = wpa_bufs[salt_pos].eapol[eapol_off + 3]; + w1[0] = wpa_bufs[salt_pos].eapol[eapol_off + 4]; + w1[1] = wpa_bufs[salt_pos].eapol[eapol_off + 5]; + w1[2] = wpa_bufs[salt_pos].eapol[eapol_off + 6]; + w1[3] = wpa_bufs[salt_pos].eapol[eapol_off + 7]; + w2[0] = wpa_bufs[salt_pos].eapol[eapol_off + 8]; + w2[1] = wpa_bufs[salt_pos].eapol[eapol_off + 9]; + w2[2] = wpa_bufs[salt_pos].eapol[eapol_off + 10]; + w2[3] = wpa_bufs[salt_pos].eapol[eapol_off + 11]; + w3[0] = wpa_bufs[salt_pos].eapol[eapol_off + 12]; + w3[1] = wpa_bufs[salt_pos].eapol[eapol_off + 13]; + w3[2] = (64 + eapol_size) * 8; + w3[3] = 0; + + u32x digest1[4]; + + hmac_md5_run (w0, w1, w2, w3, ipad, opad, digest1); + + /** + * base + */ + + #define il_pos 0 + + const u32x r0 = digest1[DGST_R0]; + const u32x r1 = digest1[DGST_R1]; + const u32x r2 = digest1[DGST_R2]; + const u32x r3 = digest1[DGST_R3]; + + #include VECT_COMPARE_M + } + + { + w0[0] = digest[0]; + w0[1] = digest[1]; + w0[2] = digest[2]; + w0[3] = digest[3]; + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + hmac_sha1_pad (w0, w1, w2, w3, ipad, opad); + + int eapol_size = wpa_bufs[salt_pos].eapol_size; + + int eapol_left; + int eapol_off; + + for (eapol_left = eapol_size, eapol_off = 0; eapol_left >= 56; eapol_left -= 64, eapol_off += 16) + { + w0[0] = wpa_bufs[salt_pos].eapol[eapol_off + 0]; + w0[1] = wpa_bufs[salt_pos].eapol[eapol_off + 1]; + w0[2] = wpa_bufs[salt_pos].eapol[eapol_off + 2]; + w0[3] = wpa_bufs[salt_pos].eapol[eapol_off + 3]; + w1[0] = wpa_bufs[salt_pos].eapol[eapol_off + 4]; + w1[1] = wpa_bufs[salt_pos].eapol[eapol_off + 5]; + w1[2] = wpa_bufs[salt_pos].eapol[eapol_off + 6]; + w1[3] = wpa_bufs[salt_pos].eapol[eapol_off + 7]; + w2[0] = wpa_bufs[salt_pos].eapol[eapol_off + 8]; + w2[1] = wpa_bufs[salt_pos].eapol[eapol_off + 9]; + w2[2] = wpa_bufs[salt_pos].eapol[eapol_off + 10]; + w2[3] = wpa_bufs[salt_pos].eapol[eapol_off + 11]; + w3[0] = wpa_bufs[salt_pos].eapol[eapol_off + 12]; + w3[1] = wpa_bufs[salt_pos].eapol[eapol_off + 13]; + w3[2] = wpa_bufs[salt_pos].eapol[eapol_off + 14]; + w3[3] = wpa_bufs[salt_pos].eapol[eapol_off + 15]; + + sha1_transform (w0, w1, w2, w3, ipad); + } + + w0[0] = wpa_bufs[salt_pos].eapol[eapol_off + 0]; + w0[1] = wpa_bufs[salt_pos].eapol[eapol_off + 1]; + w0[2] = wpa_bufs[salt_pos].eapol[eapol_off + 2]; + w0[3] = wpa_bufs[salt_pos].eapol[eapol_off + 3]; + w1[0] = wpa_bufs[salt_pos].eapol[eapol_off + 4]; + w1[1] = wpa_bufs[salt_pos].eapol[eapol_off + 5]; + w1[2] = wpa_bufs[salt_pos].eapol[eapol_off + 6]; + w1[3] = wpa_bufs[salt_pos].eapol[eapol_off + 7]; + w2[0] = wpa_bufs[salt_pos].eapol[eapol_off + 8]; + w2[1] = wpa_bufs[salt_pos].eapol[eapol_off + 9]; + w2[2] = wpa_bufs[salt_pos].eapol[eapol_off + 10]; + w2[3] = wpa_bufs[salt_pos].eapol[eapol_off + 11]; + w3[0] = wpa_bufs[salt_pos].eapol[eapol_off + 12]; + w3[1] = wpa_bufs[salt_pos].eapol[eapol_off + 13]; + w3[2] = 0; + w3[3] = (64 + eapol_size) * 8; + + u32x digest2[5]; + + hmac_sha1_run (w0, w1, w2, w3, ipad, opad, digest2); + + /** + * base + */ + + #define il_pos 0 + + const u32x r0 = digest2[DGST_R0]; + const u32x r1 = digest2[DGST_R1]; + const u32x r2 = digest2[DGST_R2]; + const u32x r3 = digest2[DGST_R3]; + + #include VECT_COMPARE_M + } +} diff --git a/nv/m02610_a0.cu b/nv/m02610_a0.cu new file mode 100644 index 0000000000..0bf029dae0 --- /dev/null +++ b/nv/m02610_a0.cu @@ -0,0 +1,657 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _MD5_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW2 +#define VECT_SIZE1 +#endif + +#define DGST_R0 0 +#define DGST_R1 3 +#define DGST_R2 2 +#define DGST_R3 1 + +#include "include/kernel_functions.c" +#include "types_nv.c" +#include "common_nv.c" +#include "include/rp_gpu.h" +#include "rp_nv.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +__device__ __constant__ gpu_rule_t c_rules[1024]; + +#ifdef VECT_SIZE1 +#define uint_to_hex_lower8(i) l_bin2asc[(i)] +#endif + +#ifdef VECT_SIZE2 +#define uint_to_hex_lower8(i) u32x (l_bin2asc[(i).x], l_bin2asc[(i).y]) +#endif + +#ifdef VECT_SIZE4 +#define uint_to_hex_lower8(i) u32x (l_bin2asc[(i).x], l_bin2asc[(i).y], l_bin2asc[(i).z], l_bin2asc[(i).w]) +#endif + +__device__ __constant__ char c_bin2asc[16] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' }; + +__device__ __shared__ short l_bin2asc[256]; + +extern "C" __global__ void __launch_bounds__ (256, 1) m02610_m04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + u32x pw_buf1[4]; + + pw_buf1[0] = pws[gid].i[ 4]; + pw_buf1[1] = pws[gid].i[ 5]; + pw_buf1[2] = pws[gid].i[ 6]; + pw_buf1[3] = pws[gid].i[ 7]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * salt + */ + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + u32 s[8]; + + s[0] = salt_bufs[salt_pos].salt_buf[0]; + s[1] = salt_bufs[salt_pos].salt_buf[1]; + s[2] = salt_bufs[salt_pos].salt_buf[2]; + s[3] = salt_bufs[salt_pos].salt_buf[3]; + s[4] = salt_bufs[salt_pos].salt_buf[4]; + s[5] = salt_bufs[salt_pos].salt_buf[5]; + s[6] = (32 + salt_len) * 8; + s[7] = 0; + + /** + * bin2asc table + */ + + l_bin2asc[lid] = c_bin2asc[(lid >> 0) & 15] << 8 + | c_bin2asc[(lid >> 4) & 15] << 0; + + __syncthreads (); + + if (gid >= gid_max) return; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + + w0[0] = pw_buf0[0]; + w0[1] = pw_buf0[1]; + w0[2] = pw_buf0[2]; + w0[3] = pw_buf0[3]; + + u32x w1[4]; + + w1[0] = pw_buf1[0]; + w1[1] = pw_buf1[1]; + w1[2] = pw_buf1[2]; + w1[3] = pw_buf1[3]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 out_len = apply_rules (c_rules[il_pos].cmds, w0, w1, pw_len); + + append_0x80_2 (w0, w1, out_len); + + w3[2] = out_len * 8; + + u32x a = MD5M_A; + u32x b = MD5M_B; + u32x c = MD5M_C; + u32x d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H , a, b, c, d, w1[1], MD5C20, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w2[0], MD5C21, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w2[3], MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w3[2], MD5C23, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w0[1], MD5C24, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w1[0], MD5C25, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w1[3], MD5C26, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w2[2], MD5C27, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w3[1], MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w0[0], MD5C29, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w0[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w1[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w2[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w3[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w3[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w0[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1[0], MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w2[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2[1], MD5C3f, MD5S33); + + a += MD5M_A; + b += MD5M_B; + c += MD5M_C; + d += MD5M_D; + + const u32x w0_t = uint_to_hex_lower8 ((a >> 0) & 255) << 0 + | uint_to_hex_lower8 ((a >> 8) & 255) << 16; + const u32x w1_t = uint_to_hex_lower8 ((a >> 16) & 255) << 0 + | uint_to_hex_lower8 ((a >> 24) & 255) << 16; + const u32x w2_t = uint_to_hex_lower8 ((b >> 0) & 255) << 0 + | uint_to_hex_lower8 ((b >> 8) & 255) << 16; + const u32x w3_t = uint_to_hex_lower8 ((b >> 16) & 255) << 0 + | uint_to_hex_lower8 ((b >> 24) & 255) << 16; + const u32x w4_t = uint_to_hex_lower8 ((c >> 0) & 255) << 0 + | uint_to_hex_lower8 ((c >> 8) & 255) << 16; + const u32x w5_t = uint_to_hex_lower8 ((c >> 16) & 255) << 0 + | uint_to_hex_lower8 ((c >> 24) & 255) << 16; + const u32x w6_t = uint_to_hex_lower8 ((d >> 0) & 255) << 0 + | uint_to_hex_lower8 ((d >> 8) & 255) << 16; + const u32x w7_t = uint_to_hex_lower8 ((d >> 16) & 255) << 0 + | uint_to_hex_lower8 ((d >> 24) & 255) << 16; + + const u32 w8_t = s[0]; + const u32 w9_t = s[1]; + const u32 wa_t = s[2]; + const u32 wb_t = s[3]; + const u32 wc_t = s[4]; + const u32 wd_t = s[5]; + const u32 we_t = s[6]; + const u32 wf_t = s[7]; + + a = MD5M_A; + b = MD5M_B; + c = MD5M_C; + d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t, MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t, MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t, MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t, MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w4_t, MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w5_t, MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w6_t, MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w7_t, MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w8_t, MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w9_t, MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, wa_t, MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, wb_t, MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, wc_t, MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, wd_t, MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, we_t, MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, wf_t, MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w1_t, MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w6_t, MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, wb_t, MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t, MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w5_t, MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, wa_t, MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, wf_t, MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w4_t, MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w9_t, MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, we_t, MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t, MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w8_t, MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, wd_t, MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t, MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w7_t, MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, wc_t, MD5C1f, MD5S13); + + MD5_STEP (MD5_H , a, b, c, d, w5_t, MD5C20, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w8_t, MD5C21, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, wb_t, MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, we_t, MD5C23, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w1_t, MD5C24, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w4_t, MD5C25, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w7_t, MD5C26, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, wa_t, MD5C27, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, wd_t, MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w0_t, MD5C29, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w3_t, MD5C2a, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w6_t, MD5C2b, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w9_t, MD5C2c, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, wc_t, MD5C2d, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, wf_t, MD5C2e, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w2_t, MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t, MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w7_t, MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, we_t, MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w5_t, MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, wc_t, MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t, MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, wa_t, MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t, MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w8_t, MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, wf_t, MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w6_t, MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, wd_t, MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w4_t, MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, wb_t, MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t, MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w9_t, MD5C3f, MD5S33); + + const u32x r0 = a; + const u32x r1 = d; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_M + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m02610_m08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m02610_m16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m02610_s04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + u32x pw_buf1[4]; + + pw_buf1[0] = pws[gid].i[ 4]; + pw_buf1[1] = pws[gid].i[ 5]; + pw_buf1[2] = pws[gid].i[ 6]; + pw_buf1[3] = pws[gid].i[ 7]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * salt + */ + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + u32 s[8]; + + s[0] = salt_bufs[salt_pos].salt_buf[0]; + s[1] = salt_bufs[salt_pos].salt_buf[1]; + s[2] = salt_bufs[salt_pos].salt_buf[2]; + s[3] = salt_bufs[salt_pos].salt_buf[3]; + s[4] = salt_bufs[salt_pos].salt_buf[4]; + s[5] = salt_bufs[salt_pos].salt_buf[5]; + s[6] = (32 + salt_len) * 8; + s[7] = 0; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * bin2asc table + */ + + l_bin2asc[lid] = c_bin2asc[(lid >> 0) & 15] << 8 + | c_bin2asc[(lid >> 4) & 15] << 0; + + __syncthreads (); + + if (gid >= gid_max) return; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + + w0[0] = pw_buf0[0]; + w0[1] = pw_buf0[1]; + w0[2] = pw_buf0[2]; + w0[3] = pw_buf0[3]; + + u32x w1[4]; + + w1[0] = pw_buf1[0]; + w1[1] = pw_buf1[1]; + w1[2] = pw_buf1[2]; + w1[3] = pw_buf1[3]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 out_len = apply_rules (c_rules[il_pos].cmds, w0, w1, pw_len); + + append_0x80_2 (w0, w1, out_len); + + w3[2] = out_len * 8; + + u32x a = MD5M_A; + u32x b = MD5M_B; + u32x c = MD5M_C; + u32x d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H , a, b, c, d, w1[1], MD5C20, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w2[0], MD5C21, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w2[3], MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w3[2], MD5C23, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w0[1], MD5C24, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w1[0], MD5C25, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w1[3], MD5C26, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w2[2], MD5C27, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w3[1], MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w0[0], MD5C29, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w0[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w1[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w2[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w3[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w3[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w0[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1[0], MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w2[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2[1], MD5C3f, MD5S33); + + a += MD5M_A; + b += MD5M_B; + c += MD5M_C; + d += MD5M_D; + + const u32x w0_t = uint_to_hex_lower8 ((a >> 0) & 255) << 0 + | uint_to_hex_lower8 ((a >> 8) & 255) << 16; + const u32x w1_t = uint_to_hex_lower8 ((a >> 16) & 255) << 0 + | uint_to_hex_lower8 ((a >> 24) & 255) << 16; + const u32x w2_t = uint_to_hex_lower8 ((b >> 0) & 255) << 0 + | uint_to_hex_lower8 ((b >> 8) & 255) << 16; + const u32x w3_t = uint_to_hex_lower8 ((b >> 16) & 255) << 0 + | uint_to_hex_lower8 ((b >> 24) & 255) << 16; + const u32x w4_t = uint_to_hex_lower8 ((c >> 0) & 255) << 0 + | uint_to_hex_lower8 ((c >> 8) & 255) << 16; + const u32x w5_t = uint_to_hex_lower8 ((c >> 16) & 255) << 0 + | uint_to_hex_lower8 ((c >> 24) & 255) << 16; + const u32x w6_t = uint_to_hex_lower8 ((d >> 0) & 255) << 0 + | uint_to_hex_lower8 ((d >> 8) & 255) << 16; + const u32x w7_t = uint_to_hex_lower8 ((d >> 16) & 255) << 0 + | uint_to_hex_lower8 ((d >> 24) & 255) << 16; + + const u32 w8_t = s[0]; + const u32 w9_t = s[1]; + const u32 wa_t = s[2]; + const u32 wb_t = s[3]; + const u32 wc_t = s[4]; + const u32 wd_t = s[5]; + const u32 we_t = s[6]; + const u32 wf_t = s[7]; + + a = MD5M_A; + b = MD5M_B; + c = MD5M_C; + d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t, MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t, MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t, MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t, MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w4_t, MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w5_t, MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w6_t, MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w7_t, MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w8_t, MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w9_t, MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, wa_t, MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, wb_t, MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, wc_t, MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, wd_t, MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, we_t, MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, wf_t, MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w1_t, MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w6_t, MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, wb_t, MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t, MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w5_t, MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, wa_t, MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, wf_t, MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w4_t, MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w9_t, MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, we_t, MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t, MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w8_t, MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, wd_t, MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t, MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w7_t, MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, wc_t, MD5C1f, MD5S13); + + MD5_STEP (MD5_H , a, b, c, d, w5_t, MD5C20, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w8_t, MD5C21, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, wb_t, MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, we_t, MD5C23, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w1_t, MD5C24, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w4_t, MD5C25, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w7_t, MD5C26, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, wa_t, MD5C27, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, wd_t, MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w0_t, MD5C29, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w3_t, MD5C2a, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w6_t, MD5C2b, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w9_t, MD5C2c, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, wc_t, MD5C2d, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, wf_t, MD5C2e, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w2_t, MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t, MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w7_t, MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, we_t, MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w5_t, MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, wc_t, MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t, MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, wa_t, MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t, MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w8_t, MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, wf_t, MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w6_t, MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, wd_t, MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w4_t, MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, wb_t, MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t, MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w9_t, MD5C3f, MD5S33); + + const u32x r0 = a; + const u32x r1 = d; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_S + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m02610_s08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m02610_s16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/nv/m02610_a1.cu b/nv/m02610_a1.cu new file mode 100644 index 0000000000..c13d3c79ae --- /dev/null +++ b/nv/m02610_a1.cu @@ -0,0 +1,759 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _MD5_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW2 +#define VECT_SIZE4 +#endif + +#define DGST_R0 0 +#define DGST_R1 3 +#define DGST_R2 2 +#define DGST_R3 1 + +#include "include/kernel_functions.c" +#include "types_nv.c" +#include "common_nv.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +__device__ __constant__ comb_t c_combs[1024]; + +#ifdef VECT_SIZE1 +#define uint_to_hex_lower8(i) l_bin2asc[(i)] +#endif + +#ifdef VECT_SIZE2 +#define uint_to_hex_lower8(i) u32x (l_bin2asc[(i).x], l_bin2asc[(i).y]) +#endif + +#ifdef VECT_SIZE4 +#define uint_to_hex_lower8(i) u32x (l_bin2asc[(i).x], l_bin2asc[(i).y], l_bin2asc[(i).z], l_bin2asc[(i).w]) +#endif + +__device__ __constant__ char c_bin2asc[16] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' }; + +__device__ __shared__ short l_bin2asc[256]; + +extern "C" __global__ void __launch_bounds__ (256, 1) m02610_m04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + append_0x80_2 (wordl0, wordl1, pw_l_len); + + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, c_combs[0].pw_len); + } + + /** + * salt + */ + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + u32 s[8]; + + s[0] = salt_bufs[salt_pos].salt_buf[0]; + s[1] = salt_bufs[salt_pos].salt_buf[1]; + s[2] = salt_bufs[salt_pos].salt_buf[2]; + s[3] = salt_bufs[salt_pos].salt_buf[3]; + s[4] = salt_bufs[salt_pos].salt_buf[4]; + s[5] = salt_bufs[salt_pos].salt_buf[5]; + s[6] = (32 + salt_len) * 8; + s[7] = 0; + + /** + * bin2asc table + */ + + l_bin2asc[lid] = c_bin2asc[(lid >> 0) & 15] << 8 + | c_bin2asc[(lid >> 4) & 15] << 0; + + __syncthreads (); + + if (gid >= gid_max) return; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = c_combs[il_pos].pw_len; + + const u32 pw_len = pw_l_len + pw_r_len; + + u32 wordr0[4]; + + wordr0[0] = c_combs[il_pos].i[0]; + wordr0[1] = c_combs[il_pos].i[1]; + wordr0[2] = c_combs[il_pos].i[2]; + wordr0[3] = c_combs[il_pos].i[3]; + + u32 wordr1[4]; + + wordr1[0] = c_combs[il_pos].i[4]; + wordr1[1] = c_combs[il_pos].i[5]; + wordr1[2] = c_combs[il_pos].i[6]; + wordr1[3] = c_combs[il_pos].i[7]; + + u32 wordr2[4]; + + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + + u32 wordr3[4]; + + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + u32x w0[4]; + + w0[0] = wordl0[0] | wordr0[0]; + w0[1] = wordl0[1] | wordr0[1]; + w0[2] = wordl0[2] | wordr0[2]; + w0[3] = wordl0[3] | wordr0[3]; + + u32x w1[4]; + + w1[0] = wordl1[0] | wordr1[0]; + w1[1] = wordl1[1] | wordr1[1]; + w1[2] = wordl1[2] | wordr1[2]; + w1[3] = wordl1[3] | wordr1[3]; + + u32x w2[4]; + + w2[0] = wordl2[0] | wordr2[0]; + w2[1] = wordl2[1] | wordr2[1]; + w2[2] = wordl2[2] | wordr2[2]; + w2[3] = wordl2[3] | wordr2[3]; + + u32x w3[4]; + + w3[0] = wordl3[0] | wordr3[0]; + w3[1] = wordl3[1] | wordr3[1]; + w3[2] = pw_len * 8; + w3[3] = 0; + + u32x a = MD5M_A; + u32x b = MD5M_B; + u32x c = MD5M_C; + u32x d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H , a, b, c, d, w1[1], MD5C20, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w2[0], MD5C21, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w2[3], MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w3[2], MD5C23, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w0[1], MD5C24, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w1[0], MD5C25, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w1[3], MD5C26, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w2[2], MD5C27, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w3[1], MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w0[0], MD5C29, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w0[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w1[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w2[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w3[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w3[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w0[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1[0], MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w2[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2[1], MD5C3f, MD5S33); + + a += MD5M_A; + b += MD5M_B; + c += MD5M_C; + d += MD5M_D; + + const u32x w0_t = uint_to_hex_lower8 ((a >> 0) & 255) << 0 + | uint_to_hex_lower8 ((a >> 8) & 255) << 16; + const u32x w1_t = uint_to_hex_lower8 ((a >> 16) & 255) << 0 + | uint_to_hex_lower8 ((a >> 24) & 255) << 16; + const u32x w2_t = uint_to_hex_lower8 ((b >> 0) & 255) << 0 + | uint_to_hex_lower8 ((b >> 8) & 255) << 16; + const u32x w3_t = uint_to_hex_lower8 ((b >> 16) & 255) << 0 + | uint_to_hex_lower8 ((b >> 24) & 255) << 16; + const u32x w4_t = uint_to_hex_lower8 ((c >> 0) & 255) << 0 + | uint_to_hex_lower8 ((c >> 8) & 255) << 16; + const u32x w5_t = uint_to_hex_lower8 ((c >> 16) & 255) << 0 + | uint_to_hex_lower8 ((c >> 24) & 255) << 16; + const u32x w6_t = uint_to_hex_lower8 ((d >> 0) & 255) << 0 + | uint_to_hex_lower8 ((d >> 8) & 255) << 16; + const u32x w7_t = uint_to_hex_lower8 ((d >> 16) & 255) << 0 + | uint_to_hex_lower8 ((d >> 24) & 255) << 16; + + const u32 w8_t = s[0]; + const u32 w9_t = s[1]; + const u32 wa_t = s[2]; + const u32 wb_t = s[3]; + const u32 wc_t = s[4]; + const u32 wd_t = s[5]; + const u32 we_t = s[6]; + const u32 wf_t = s[7]; + + a = MD5M_A; + b = MD5M_B; + c = MD5M_C; + d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t, MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t, MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t, MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t, MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w4_t, MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w5_t, MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w6_t, MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w7_t, MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w8_t, MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w9_t, MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, wa_t, MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, wb_t, MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, wc_t, MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, wd_t, MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, we_t, MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, wf_t, MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w1_t, MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w6_t, MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, wb_t, MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t, MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w5_t, MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, wa_t, MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, wf_t, MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w4_t, MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w9_t, MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, we_t, MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t, MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w8_t, MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, wd_t, MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t, MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w7_t, MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, wc_t, MD5C1f, MD5S13); + + MD5_STEP (MD5_H , a, b, c, d, w5_t, MD5C20, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w8_t, MD5C21, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, wb_t, MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, we_t, MD5C23, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w1_t, MD5C24, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w4_t, MD5C25, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w7_t, MD5C26, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, wa_t, MD5C27, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, wd_t, MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w0_t, MD5C29, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w3_t, MD5C2a, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w6_t, MD5C2b, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w9_t, MD5C2c, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, wc_t, MD5C2d, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, wf_t, MD5C2e, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w2_t, MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t, MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w7_t, MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, we_t, MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w5_t, MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, wc_t, MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t, MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, wa_t, MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t, MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w8_t, MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, wf_t, MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w6_t, MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, wd_t, MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w4_t, MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, wb_t, MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t, MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w9_t, MD5C3f, MD5S33); + + const u32x r0 = a; + const u32x r1 = d; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_M + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m02610_m08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m02610_m16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m02610_s04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + append_0x80_2 (wordl0, wordl1, pw_l_len); + + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, c_combs[0].pw_len); + } + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * salt + */ + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + u32 s[8]; + + s[0] = salt_bufs[salt_pos].salt_buf[0]; + s[1] = salt_bufs[salt_pos].salt_buf[1]; + s[2] = salt_bufs[salt_pos].salt_buf[2]; + s[3] = salt_bufs[salt_pos].salt_buf[3]; + s[4] = salt_bufs[salt_pos].salt_buf[4]; + s[5] = salt_bufs[salt_pos].salt_buf[5]; + s[6] = (32 + salt_len) * 8; + s[7] = 0; + + /** + * bin2asc table + */ + + l_bin2asc[lid] = c_bin2asc[(lid >> 0) & 15] << 8 + | c_bin2asc[(lid >> 4) & 15] << 0; + + __syncthreads (); + + if (gid >= gid_max) return; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = c_combs[il_pos].pw_len; + + const u32 pw_len = pw_l_len + pw_r_len; + + u32 wordr0[4]; + + wordr0[0] = c_combs[il_pos].i[0]; + wordr0[1] = c_combs[il_pos].i[1]; + wordr0[2] = c_combs[il_pos].i[2]; + wordr0[3] = c_combs[il_pos].i[3]; + + u32 wordr1[4]; + + wordr1[0] = c_combs[il_pos].i[4]; + wordr1[1] = c_combs[il_pos].i[5]; + wordr1[2] = c_combs[il_pos].i[6]; + wordr1[3] = c_combs[il_pos].i[7]; + + u32 wordr2[4]; + + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + + u32 wordr3[4]; + + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + u32x w0[4]; + + w0[0] = wordl0[0] | wordr0[0]; + w0[1] = wordl0[1] | wordr0[1]; + w0[2] = wordl0[2] | wordr0[2]; + w0[3] = wordl0[3] | wordr0[3]; + + u32x w1[4]; + + w1[0] = wordl1[0] | wordr1[0]; + w1[1] = wordl1[1] | wordr1[1]; + w1[2] = wordl1[2] | wordr1[2]; + w1[3] = wordl1[3] | wordr1[3]; + + u32x w2[4]; + + w2[0] = wordl2[0] | wordr2[0]; + w2[1] = wordl2[1] | wordr2[1]; + w2[2] = wordl2[2] | wordr2[2]; + w2[3] = wordl2[3] | wordr2[3]; + + u32x w3[4]; + + w3[0] = wordl3[0] | wordr3[0]; + w3[1] = wordl3[1] | wordr3[1]; + w3[2] = pw_len * 8; + w3[3] = 0; + + u32x a = MD5M_A; + u32x b = MD5M_B; + u32x c = MD5M_C; + u32x d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H , a, b, c, d, w1[1], MD5C20, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w2[0], MD5C21, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w2[3], MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w3[2], MD5C23, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w0[1], MD5C24, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w1[0], MD5C25, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w1[3], MD5C26, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w2[2], MD5C27, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w3[1], MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w0[0], MD5C29, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w0[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w1[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w2[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w3[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w3[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w0[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1[0], MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w2[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2[1], MD5C3f, MD5S33); + + a += MD5M_A; + b += MD5M_B; + c += MD5M_C; + d += MD5M_D; + + const u32x w0_t = uint_to_hex_lower8 ((a >> 0) & 255) << 0 + | uint_to_hex_lower8 ((a >> 8) & 255) << 16; + const u32x w1_t = uint_to_hex_lower8 ((a >> 16) & 255) << 0 + | uint_to_hex_lower8 ((a >> 24) & 255) << 16; + const u32x w2_t = uint_to_hex_lower8 ((b >> 0) & 255) << 0 + | uint_to_hex_lower8 ((b >> 8) & 255) << 16; + const u32x w3_t = uint_to_hex_lower8 ((b >> 16) & 255) << 0 + | uint_to_hex_lower8 ((b >> 24) & 255) << 16; + const u32x w4_t = uint_to_hex_lower8 ((c >> 0) & 255) << 0 + | uint_to_hex_lower8 ((c >> 8) & 255) << 16; + const u32x w5_t = uint_to_hex_lower8 ((c >> 16) & 255) << 0 + | uint_to_hex_lower8 ((c >> 24) & 255) << 16; + const u32x w6_t = uint_to_hex_lower8 ((d >> 0) & 255) << 0 + | uint_to_hex_lower8 ((d >> 8) & 255) << 16; + const u32x w7_t = uint_to_hex_lower8 ((d >> 16) & 255) << 0 + | uint_to_hex_lower8 ((d >> 24) & 255) << 16; + + const u32 w8_t = s[0]; + const u32 w9_t = s[1]; + const u32 wa_t = s[2]; + const u32 wb_t = s[3]; + const u32 wc_t = s[4]; + const u32 wd_t = s[5]; + const u32 we_t = s[6]; + const u32 wf_t = s[7]; + + a = MD5M_A; + b = MD5M_B; + c = MD5M_C; + d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t, MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t, MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t, MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t, MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w4_t, MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w5_t, MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w6_t, MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w7_t, MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w8_t, MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w9_t, MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, wa_t, MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, wb_t, MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, wc_t, MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, wd_t, MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, we_t, MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, wf_t, MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w1_t, MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w6_t, MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, wb_t, MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t, MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w5_t, MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, wa_t, MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, wf_t, MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w4_t, MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w9_t, MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, we_t, MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t, MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w8_t, MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, wd_t, MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t, MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w7_t, MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, wc_t, MD5C1f, MD5S13); + + MD5_STEP (MD5_H , a, b, c, d, w5_t, MD5C20, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w8_t, MD5C21, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, wb_t, MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, we_t, MD5C23, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w1_t, MD5C24, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w4_t, MD5C25, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w7_t, MD5C26, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, wa_t, MD5C27, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, wd_t, MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w0_t, MD5C29, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w3_t, MD5C2a, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w6_t, MD5C2b, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w9_t, MD5C2c, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, wc_t, MD5C2d, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, wf_t, MD5C2e, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w2_t, MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t, MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w7_t, MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, we_t, MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w5_t, MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, wc_t, MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t, MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, wa_t, MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t, MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w8_t, MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, wf_t, MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w6_t, MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, wd_t, MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w4_t, MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, wb_t, MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t, MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w9_t, MD5C3f, MD5S33); + + const u32x r0 = a; + const u32x r1 = d; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_S + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m02610_s08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m02610_s16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/nv/m02610_a3.cu b/nv/m02610_a3.cu new file mode 100644 index 0000000000..43932d076d --- /dev/null +++ b/nv/m02610_a3.cu @@ -0,0 +1,861 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _MD5_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW2 +#define VECT_SIZE4 +#endif + +#define DGST_R0 0 +#define DGST_R1 3 +#define DGST_R2 2 +#define DGST_R3 1 + +#include "include/kernel_functions.c" +#include "types_nv.c" +#include "common_nv.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +__device__ __constant__ bf_t c_bfs[1024]; + +#ifdef VECT_SIZE1 +#define uint_to_hex_lower8(i) l_bin2asc[(i)] +#endif + +#ifdef VECT_SIZE2 +#define uint_to_hex_lower8(i) u32x (l_bin2asc[(i).x], l_bin2asc[(i).y]) +#endif + +#ifdef VECT_SIZE4 +#define uint_to_hex_lower8(i) u32x (l_bin2asc[(i).x], l_bin2asc[(i).y], l_bin2asc[(i).z], l_bin2asc[(i).w]) +#endif + +__device__ __constant__ char c_bin2asc[16] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' }; + +__device__ __shared__ short l_bin2asc[256]; + +__device__ static void m02610m (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], const u32 pw_len, const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset) +{ + /** + * modifier + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + const u32 lid = threadIdx.x; + + /** + * salt + */ + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + u32 s[8]; + + s[0] = salt_bufs[salt_pos].salt_buf[0]; + s[1] = salt_bufs[salt_pos].salt_buf[1]; + s[2] = salt_bufs[salt_pos].salt_buf[2]; + s[3] = salt_bufs[salt_pos].salt_buf[3]; + s[4] = salt_bufs[salt_pos].salt_buf[4]; + s[5] = salt_bufs[salt_pos].salt_buf[5]; + s[6] = (32 + salt_len) * 8; + s[7] = 0; + + /** + * loop + */ + + u32x w0l = w0[0]; + + for (u32 il_pos = 0; il_pos < bfs_cnt; il_pos++) + { + const u32 w0r = c_bfs[il_pos].i; + + w0[0] = w0l | w0r; + + u32x a = MD5M_A; + u32x b = MD5M_B; + u32x c = MD5M_C; + u32x d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H , a, b, c, d, w1[1], MD5C20, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w2[0], MD5C21, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w2[3], MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w3[2], MD5C23, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w0[1], MD5C24, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w1[0], MD5C25, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w1[3], MD5C26, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w2[2], MD5C27, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w3[1], MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w0[0], MD5C29, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w0[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w1[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w2[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w3[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w3[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w0[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1[0], MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w2[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2[1], MD5C3f, MD5S33); + + a += MD5M_A; + b += MD5M_B; + c += MD5M_C; + d += MD5M_D; + + const u32x w0_t = uint_to_hex_lower8 ((a >> 0) & 255) << 0 + | uint_to_hex_lower8 ((a >> 8) & 255) << 16; + const u32x w1_t = uint_to_hex_lower8 ((a >> 16) & 255) << 0 + | uint_to_hex_lower8 ((a >> 24) & 255) << 16; + const u32x w2_t = uint_to_hex_lower8 ((b >> 0) & 255) << 0 + | uint_to_hex_lower8 ((b >> 8) & 255) << 16; + const u32x w3_t = uint_to_hex_lower8 ((b >> 16) & 255) << 0 + | uint_to_hex_lower8 ((b >> 24) & 255) << 16; + const u32x w4_t = uint_to_hex_lower8 ((c >> 0) & 255) << 0 + | uint_to_hex_lower8 ((c >> 8) & 255) << 16; + const u32x w5_t = uint_to_hex_lower8 ((c >> 16) & 255) << 0 + | uint_to_hex_lower8 ((c >> 24) & 255) << 16; + const u32x w6_t = uint_to_hex_lower8 ((d >> 0) & 255) << 0 + | uint_to_hex_lower8 ((d >> 8) & 255) << 16; + const u32x w7_t = uint_to_hex_lower8 ((d >> 16) & 255) << 0 + | uint_to_hex_lower8 ((d >> 24) & 255) << 16; + + const u32 w8_t = s[0]; + const u32 w9_t = s[1]; + const u32 wa_t = s[2]; + const u32 wb_t = s[3]; + const u32 wc_t = s[4]; + const u32 wd_t = s[5]; + const u32 we_t = s[6]; + const u32 wf_t = s[7]; + + a = MD5M_A; + b = MD5M_B; + c = MD5M_C; + d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t, MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t, MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t, MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t, MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w4_t, MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w5_t, MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w6_t, MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w7_t, MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w8_t, MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w9_t, MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, wa_t, MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, wb_t, MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, wc_t, MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, wd_t, MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, we_t, MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, wf_t, MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w1_t, MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w6_t, MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, wb_t, MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t, MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w5_t, MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, wa_t, MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, wf_t, MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w4_t, MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w9_t, MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, we_t, MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t, MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w8_t, MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, wd_t, MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t, MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w7_t, MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, wc_t, MD5C1f, MD5S13); + + MD5_STEP (MD5_H , a, b, c, d, w5_t, MD5C20, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w8_t, MD5C21, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, wb_t, MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, we_t, MD5C23, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w1_t, MD5C24, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w4_t, MD5C25, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w7_t, MD5C26, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, wa_t, MD5C27, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, wd_t, MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w0_t, MD5C29, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w3_t, MD5C2a, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w6_t, MD5C2b, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w9_t, MD5C2c, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, wc_t, MD5C2d, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, wf_t, MD5C2e, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w2_t, MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t, MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w7_t, MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, we_t, MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w5_t, MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, wc_t, MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t, MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, wa_t, MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t, MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w8_t, MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, wf_t, MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w6_t, MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, wd_t, MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w4_t, MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, wb_t, MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t, MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w9_t, MD5C3f, MD5S33); + + const u32x r0 = a; + const u32x r1 = d; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_M + } +} + +__device__ static void m02610s (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], const u32 pw_len, const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset) +{ + /** + * modifier + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + const u32 lid = threadIdx.x; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * salt + */ + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + u32 s[8]; + + s[0] = salt_bufs[salt_pos].salt_buf[0]; + s[1] = salt_bufs[salt_pos].salt_buf[1]; + s[2] = salt_bufs[salt_pos].salt_buf[2]; + s[3] = salt_bufs[salt_pos].salt_buf[3]; + s[4] = salt_bufs[salt_pos].salt_buf[4]; + s[5] = salt_bufs[salt_pos].salt_buf[5]; + s[6] = (32 + salt_len) * 8; + s[7] = 0; + + /** + * loop + */ + + u32x w0l = w0[0]; + + for (u32 il_pos = 0; il_pos < bfs_cnt; il_pos++) + { + const u32 w0r = c_bfs[il_pos].i; + + w0[0] = w0l | w0r; + + u32x a = MD5M_A; + u32x b = MD5M_B; + u32x c = MD5M_C; + u32x d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H , a, b, c, d, w1[1], MD5C20, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w2[0], MD5C21, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w2[3], MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w3[2], MD5C23, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w0[1], MD5C24, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w1[0], MD5C25, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w1[3], MD5C26, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w2[2], MD5C27, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w3[1], MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w0[0], MD5C29, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w0[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w1[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w2[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w3[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w3[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w0[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1[0], MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w2[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2[1], MD5C3f, MD5S33); + + a += MD5M_A; + b += MD5M_B; + c += MD5M_C; + d += MD5M_D; + + const u32x w0_t = uint_to_hex_lower8 ((a >> 0) & 255) << 0 + | uint_to_hex_lower8 ((a >> 8) & 255) << 16; + const u32x w1_t = uint_to_hex_lower8 ((a >> 16) & 255) << 0 + | uint_to_hex_lower8 ((a >> 24) & 255) << 16; + const u32x w2_t = uint_to_hex_lower8 ((b >> 0) & 255) << 0 + | uint_to_hex_lower8 ((b >> 8) & 255) << 16; + const u32x w3_t = uint_to_hex_lower8 ((b >> 16) & 255) << 0 + | uint_to_hex_lower8 ((b >> 24) & 255) << 16; + const u32x w4_t = uint_to_hex_lower8 ((c >> 0) & 255) << 0 + | uint_to_hex_lower8 ((c >> 8) & 255) << 16; + const u32x w5_t = uint_to_hex_lower8 ((c >> 16) & 255) << 0 + | uint_to_hex_lower8 ((c >> 24) & 255) << 16; + const u32x w6_t = uint_to_hex_lower8 ((d >> 0) & 255) << 0 + | uint_to_hex_lower8 ((d >> 8) & 255) << 16; + const u32x w7_t = uint_to_hex_lower8 ((d >> 16) & 255) << 0 + | uint_to_hex_lower8 ((d >> 24) & 255) << 16; + + const u32 w8_t = s[0]; + const u32 w9_t = s[1]; + const u32 wa_t = s[2]; + const u32 wb_t = s[3]; + const u32 wc_t = s[4]; + const u32 wd_t = s[5]; + const u32 we_t = s[6]; + const u32 wf_t = s[7]; + + a = MD5M_A; + b = MD5M_B; + c = MD5M_C; + d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t, MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t, MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t, MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t, MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w4_t, MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w5_t, MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w6_t, MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w7_t, MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w8_t, MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w9_t, MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, wa_t, MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, wb_t, MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, wc_t, MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, wd_t, MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, we_t, MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, wf_t, MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w1_t, MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w6_t, MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, wb_t, MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t, MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w5_t, MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, wa_t, MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, wf_t, MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w4_t, MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w9_t, MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, we_t, MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t, MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w8_t, MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, wd_t, MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t, MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w7_t, MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, wc_t, MD5C1f, MD5S13); + + MD5_STEP (MD5_H , a, b, c, d, w5_t, MD5C20, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w8_t, MD5C21, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, wb_t, MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, we_t, MD5C23, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w1_t, MD5C24, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w4_t, MD5C25, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w7_t, MD5C26, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, wa_t, MD5C27, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, wd_t, MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w0_t, MD5C29, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w3_t, MD5C2a, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w6_t, MD5C2b, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w9_t, MD5C2c, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, wc_t, MD5C2d, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, wf_t, MD5C2e, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w2_t, MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t, MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w7_t, MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, we_t, MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w5_t, MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, wc_t, MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t, MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, wa_t, MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t, MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w8_t, MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, wf_t, MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w6_t, MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, wd_t, MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w4_t, MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, wb_t, MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t, MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w9_t, MD5C3f, MD5S33); + + const u32x r0 = a; + const u32x r1 = d; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_S + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m02610_m04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + const u32 lid = threadIdx.x; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = pws[gid].i[14]; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * bin2asc table + */ + + l_bin2asc[lid] = c_bin2asc[(lid >> 0) & 15] << 8 + | c_bin2asc[(lid >> 4) & 15] << 0; + + __syncthreads (); + + if (gid >= gid_max) return; + + /** + * main + */ + + m02610m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m02610_m08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + const u32 lid = threadIdx.x; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = pws[gid].i[14]; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * bin2asc table + */ + + l_bin2asc[lid] = c_bin2asc[(lid >> 0) & 15] << 8 + | c_bin2asc[(lid >> 4) & 15] << 0; + + __syncthreads (); + + if (gid >= gid_max) return; + + /** + * main + */ + + m02610m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m02610_m16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + const u32 lid = threadIdx.x; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = pws[gid].i[ 8]; + w2[1] = pws[gid].i[ 9]; + w2[2] = pws[gid].i[10]; + w2[3] = pws[gid].i[11]; + + u32x w3[4]; + + w3[0] = pws[gid].i[12]; + w3[1] = pws[gid].i[13]; + w3[2] = pws[gid].i[14]; + w3[3] = pws[gid].i[15]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * bin2asc table + */ + + l_bin2asc[lid] = c_bin2asc[(lid >> 0) & 15] << 8 + | c_bin2asc[(lid >> 4) & 15] << 0; + + __syncthreads (); + + if (gid >= gid_max) return; + + /** + * main + */ + + m02610m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m02610_s04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + const u32 lid = threadIdx.x; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = pws[gid].i[14]; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * bin2asc table + */ + + l_bin2asc[lid] = c_bin2asc[(lid >> 0) & 15] << 8 + | c_bin2asc[(lid >> 4) & 15] << 0; + + __syncthreads (); + + if (gid >= gid_max) return; + + /** + * main + */ + + m02610s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m02610_s08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + const u32 lid = threadIdx.x; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = pws[gid].i[14]; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * bin2asc table + */ + + l_bin2asc[lid] = c_bin2asc[(lid >> 0) & 15] << 8 + | c_bin2asc[(lid >> 4) & 15] << 0; + + __syncthreads (); + + if (gid >= gid_max) return; + + /** + * main + */ + + m02610s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m02610_s16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + const u32 lid = threadIdx.x; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = pws[gid].i[ 8]; + w2[1] = pws[gid].i[ 9]; + w2[2] = pws[gid].i[10]; + w2[3] = pws[gid].i[11]; + + u32x w3[4]; + + w3[0] = pws[gid].i[12]; + w3[1] = pws[gid].i[13]; + w3[2] = pws[gid].i[14]; + w3[3] = pws[gid].i[15]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * bin2asc table + */ + + l_bin2asc[lid] = c_bin2asc[(lid >> 0) & 15] << 8 + | c_bin2asc[(lid >> 4) & 15] << 0; + + __syncthreads (); + + if (gid >= gid_max) return; + + /** + * main + */ + + m02610s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} diff --git a/nv/m02710_a0.cu b/nv/m02710_a0.cu new file mode 100644 index 0000000000..2a33a0a9f1 --- /dev/null +++ b/nv/m02710_a0.cu @@ -0,0 +1,830 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _MD5_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW2 +#define VECT_SIZE1 +#endif + +#define DGST_R0 0 +#define DGST_R1 3 +#define DGST_R2 2 +#define DGST_R3 1 + +#include "include/kernel_functions.c" +#include "types_nv.c" +#include "common_nv.c" +#include "include/rp_gpu.h" +#include "rp_nv.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +__device__ __constant__ gpu_rule_t c_rules[1024]; + +#ifdef VECT_SIZE1 +#define uint_to_hex_lower8(i) l_bin2asc[(i)] +#endif + +#ifdef VECT_SIZE2 +#define uint_to_hex_lower8(i) u32x (l_bin2asc[(i).x], l_bin2asc[(i).y]) +#endif + +#ifdef VECT_SIZE4 +#define uint_to_hex_lower8(i) u32x (l_bin2asc[(i).x], l_bin2asc[(i).y], l_bin2asc[(i).z], l_bin2asc[(i).w]) +#endif + +__device__ __constant__ char c_bin2asc[16] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' }; + +__device__ __shared__ short l_bin2asc[256]; + +extern "C" __global__ void __launch_bounds__ (256, 1) m02710_m04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + u32x pw_buf1[4]; + + pw_buf1[0] = pws[gid].i[ 4]; + pw_buf1[1] = pws[gid].i[ 5]; + pw_buf1[2] = pws[gid].i[ 6]; + pw_buf1[3] = pws[gid].i[ 7]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * salt + */ + + u32 s[8]; + + s[0] = salt_bufs[salt_pos].salt_buf[0]; + s[1] = salt_bufs[salt_pos].salt_buf[1]; + s[2] = salt_bufs[salt_pos].salt_buf[2]; + s[3] = salt_bufs[salt_pos].salt_buf[3]; + s[4] = salt_bufs[salt_pos].salt_buf[4]; + s[5] = salt_bufs[salt_pos].salt_buf[5]; + s[6] = salt_bufs[salt_pos].salt_buf[6]; + s[7] = salt_bufs[salt_pos].salt_buf[7]; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + const u32 r_14 = (32 + salt_len) * 8; + + /** + * bin2asc table + */ + + l_bin2asc[lid] = c_bin2asc[(lid >> 0) & 15] << 8 + | c_bin2asc[(lid >> 4) & 15] << 0; + + __syncthreads (); + + if (gid >= gid_max) return; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + + w0[0] = pw_buf0[0]; + w0[1] = pw_buf0[1]; + w0[2] = pw_buf0[2]; + w0[3] = pw_buf0[3]; + + u32x w1[4]; + + w1[0] = pw_buf1[0]; + w1[1] = pw_buf1[1]; + w1[2] = pw_buf1[2]; + w1[3] = pw_buf1[3]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 out_len = apply_rules (c_rules[il_pos].cmds, w0, w1, pw_len); + + append_0x80_2 (w0, w1, out_len); + + w3[2] = out_len * 8; + + u32x a = MD5M_A; + u32x b = MD5M_B; + u32x c = MD5M_C; + u32x d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H , a, b, c, d, w1[1], MD5C20, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w2[0], MD5C21, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w2[3], MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w3[2], MD5C23, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w0[1], MD5C24, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w1[0], MD5C25, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w1[3], MD5C26, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w2[2], MD5C27, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w3[1], MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w0[0], MD5C29, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w0[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w1[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w2[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w3[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w3[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w0[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1[0], MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w2[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2[1], MD5C3f, MD5S33); + + a += MD5M_A; + b += MD5M_B; + c += MD5M_C; + d += MD5M_D; + + const u32x w0_t = uint_to_hex_lower8 ((a >> 0) & 255) << 0 + | uint_to_hex_lower8 ((a >> 8) & 255) << 16; + const u32x w1_t = uint_to_hex_lower8 ((a >> 16) & 255) << 0 + | uint_to_hex_lower8 ((a >> 24) & 255) << 16; + const u32x w2_t = uint_to_hex_lower8 ((b >> 0) & 255) << 0 + | uint_to_hex_lower8 ((b >> 8) & 255) << 16; + const u32x w3_t = uint_to_hex_lower8 ((b >> 16) & 255) << 0 + | uint_to_hex_lower8 ((b >> 24) & 255) << 16; + const u32x w4_t = uint_to_hex_lower8 ((c >> 0) & 255) << 0 + | uint_to_hex_lower8 ((c >> 8) & 255) << 16; + const u32x w5_t = uint_to_hex_lower8 ((c >> 16) & 255) << 0 + | uint_to_hex_lower8 ((c >> 24) & 255) << 16; + const u32x w6_t = uint_to_hex_lower8 ((d >> 0) & 255) << 0 + | uint_to_hex_lower8 ((d >> 8) & 255) << 16; + const u32x w7_t = uint_to_hex_lower8 ((d >> 16) & 255) << 0 + | uint_to_hex_lower8 ((d >> 24) & 255) << 16; + + const u32 w8_t = s[0]; + const u32 w9_t = s[1]; + const u32 wa_t = s[2]; + const u32 wb_t = s[3]; + const u32 wc_t = s[4]; + const u32 wd_t = s[5]; + const u32 we_t = s[6]; + const u32 wf_t = s[7]; + + a = MD5M_A; + b = MD5M_B; + c = MD5M_C; + d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t, MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t, MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t, MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t, MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w4_t, MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w5_t, MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w6_t, MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w7_t, MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w8_t, MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w9_t, MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, wa_t, MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, wb_t, MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, wc_t, MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, wd_t, MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, we_t, MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, wf_t, MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w1_t, MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w6_t, MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, wb_t, MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t, MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w5_t, MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, wa_t, MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, wf_t, MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w4_t, MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w9_t, MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, we_t, MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t, MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w8_t, MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, wd_t, MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t, MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w7_t, MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, wc_t, MD5C1f, MD5S13); + + MD5_STEP (MD5_H , a, b, c, d, w5_t, MD5C20, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w8_t, MD5C21, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, wb_t, MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, we_t, MD5C23, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w1_t, MD5C24, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w4_t, MD5C25, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w7_t, MD5C26, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, wa_t, MD5C27, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, wd_t, MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w0_t, MD5C29, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w3_t, MD5C2a, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w6_t, MD5C2b, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w9_t, MD5C2c, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, wc_t, MD5C2d, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, wf_t, MD5C2e, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w2_t, MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t, MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w7_t, MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, we_t, MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w5_t, MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, wc_t, MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t, MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, wa_t, MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t, MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w8_t, MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, wf_t, MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w6_t, MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, wd_t, MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w4_t, MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, wb_t, MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t, MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w9_t, MD5C3f, MD5S33); + + const u32x r_a = a + MD5M_A; + const u32x r_b = b + MD5M_B; + const u32x r_c = c + MD5M_C; + const u32x r_d = d + MD5M_D; + + a = r_a; + b = r_b; + c = r_c; + d = r_d; + + MD5_STEP0(MD5_Fo, a, b, c, d, MD5C00, MD5S00); + MD5_STEP0(MD5_Fo, d, a, b, c, MD5C01, MD5S01); + MD5_STEP0(MD5_Fo, c, d, a, b, MD5C02, MD5S02); + MD5_STEP0(MD5_Fo, b, c, d, a, MD5C03, MD5S03); + MD5_STEP0(MD5_Fo, a, b, c, d, MD5C04, MD5S00); + MD5_STEP0(MD5_Fo, d, a, b, c, MD5C05, MD5S01); + MD5_STEP0(MD5_Fo, c, d, a, b, MD5C06, MD5S02); + MD5_STEP0(MD5_Fo, b, c, d, a, MD5C07, MD5S03); + MD5_STEP0(MD5_Fo, a, b, c, d, MD5C08, MD5S00); + MD5_STEP0(MD5_Fo, d, a, b, c, MD5C09, MD5S01); + MD5_STEP0(MD5_Fo, c, d, a, b, MD5C0a, MD5S02); + MD5_STEP0(MD5_Fo, b, c, d, a, MD5C0b, MD5S03); + MD5_STEP0(MD5_Fo, a, b, c, d, MD5C0c, MD5S00); + MD5_STEP0(MD5_Fo, d, a, b, c, MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, r_14, MD5C0e, MD5S02); + MD5_STEP0(MD5_Fo, b, c, d, a, MD5C0f, MD5S03); + + MD5_STEP0(MD5_Go, a, b, c, d, MD5C10, MD5S10); + MD5_STEP0(MD5_Go, d, a, b, c, MD5C11, MD5S11); + MD5_STEP0(MD5_Go, c, d, a, b, MD5C12, MD5S12); + MD5_STEP0(MD5_Go, b, c, d, a, MD5C13, MD5S13); + MD5_STEP0(MD5_Go, a, b, c, d, MD5C14, MD5S10); + MD5_STEP0(MD5_Go, d, a, b, c, MD5C15, MD5S11); + MD5_STEP0(MD5_Go, c, d, a, b, MD5C16, MD5S12); + MD5_STEP0(MD5_Go, b, c, d, a, MD5C17, MD5S13); + MD5_STEP0(MD5_Go, a, b, c, d, MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, r_14, MD5C19, MD5S11); + MD5_STEP0(MD5_Go, c, d, a, b, MD5C1a, MD5S12); + MD5_STEP0(MD5_Go, b, c, d, a, MD5C1b, MD5S13); + MD5_STEP0(MD5_Go, a, b, c, d, MD5C1c, MD5S10); + MD5_STEP0(MD5_Go, d, a, b, c, MD5C1d, MD5S11); + MD5_STEP0(MD5_Go, c, d, a, b, MD5C1e, MD5S12); + MD5_STEP0(MD5_Go, b, c, d, a, MD5C1f, MD5S13); + + MD5_STEP0(MD5_H , a, b, c, d, MD5C20, MD5S20); + MD5_STEP0(MD5_H , d, a, b, c, MD5C21, MD5S21); + MD5_STEP0(MD5_H , c, d, a, b, MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, r_14, MD5C23, MD5S23); + MD5_STEP0(MD5_H , a, b, c, d, MD5C24, MD5S20); + MD5_STEP0(MD5_H , d, a, b, c, MD5C25, MD5S21); + MD5_STEP0(MD5_H , c, d, a, b, MD5C26, MD5S22); + MD5_STEP0(MD5_H , b, c, d, a, MD5C27, MD5S23); + MD5_STEP0(MD5_H , a, b, c, d, MD5C28, MD5S20); + MD5_STEP0(MD5_H , d, a, b, c, MD5C29, MD5S21); + MD5_STEP0(MD5_H , c, d, a, b, MD5C2a, MD5S22); + MD5_STEP0(MD5_H , b, c, d, a, MD5C2b, MD5S23); + MD5_STEP0(MD5_H , a, b, c, d, MD5C2c, MD5S20); + MD5_STEP0(MD5_H , d, a, b, c, MD5C2d, MD5S21); + MD5_STEP0(MD5_H , c, d, a, b, MD5C2e, MD5S22); + MD5_STEP0(MD5_H , b, c, d, a, MD5C2f, MD5S23); + + MD5_STEP0(MD5_I , a, b, c, d, MD5C30, MD5S30); + MD5_STEP0(MD5_I , d, a, b, c, MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, r_14, MD5C32, MD5S32); + MD5_STEP0(MD5_I , b, c, d, a, MD5C33, MD5S33); + MD5_STEP0(MD5_I , a, b, c, d, MD5C34, MD5S30); + MD5_STEP0(MD5_I , d, a, b, c, MD5C35, MD5S31); + MD5_STEP0(MD5_I , c, d, a, b, MD5C36, MD5S32); + MD5_STEP0(MD5_I , b, c, d, a, MD5C37, MD5S33); + MD5_STEP0(MD5_I , a, b, c, d, MD5C38, MD5S30); + MD5_STEP0(MD5_I , d, a, b, c, MD5C39, MD5S31); + MD5_STEP0(MD5_I , c, d, a, b, MD5C3a, MD5S32); + MD5_STEP0(MD5_I , b, c, d, a, MD5C3b, MD5S33); + MD5_STEP0(MD5_I , a, b, c, d, MD5C3c, MD5S30); + MD5_STEP0(MD5_I , d, a, b, c, MD5C3d, MD5S31); + MD5_STEP0(MD5_I , c, d, a, b, MD5C3e, MD5S32); + MD5_STEP0(MD5_I , b, c, d, a, MD5C3f, MD5S33); + + a += r_a; + b += r_b; + c += r_c; + d += r_d; + + const u32x r0 = a; + const u32x r1 = d; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_M + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m02710_m08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m02710_m16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m02710_s04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + u32x pw_buf1[4]; + + pw_buf1[0] = pws[gid].i[ 4]; + pw_buf1[1] = pws[gid].i[ 5]; + pw_buf1[2] = pws[gid].i[ 6]; + pw_buf1[3] = pws[gid].i[ 7]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * salt + */ + + u32 s[8]; + + s[0] = salt_bufs[salt_pos].salt_buf[0]; + s[1] = salt_bufs[salt_pos].salt_buf[1]; + s[2] = salt_bufs[salt_pos].salt_buf[2]; + s[3] = salt_bufs[salt_pos].salt_buf[3]; + s[4] = salt_bufs[salt_pos].salt_buf[4]; + s[5] = salt_bufs[salt_pos].salt_buf[5]; + s[6] = salt_bufs[salt_pos].salt_buf[6]; + s[7] = salt_bufs[salt_pos].salt_buf[7]; + + u32 salt_len = salt_bufs[salt_pos].salt_len; + + const u32 r_14 = (32 + salt_len) * 8; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * bin2asc table + */ + + l_bin2asc[lid] = c_bin2asc[(lid >> 0) & 15] << 8 + | c_bin2asc[(lid >> 4) & 15] << 0; + + __syncthreads (); + + if (gid >= gid_max) return; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + + w0[0] = pw_buf0[0]; + w0[1] = pw_buf0[1]; + w0[2] = pw_buf0[2]; + w0[3] = pw_buf0[3]; + + u32x w1[4]; + + w1[0] = pw_buf1[0]; + w1[1] = pw_buf1[1]; + w1[2] = pw_buf1[2]; + w1[3] = pw_buf1[3]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 out_len = apply_rules (c_rules[il_pos].cmds, w0, w1, pw_len); + + append_0x80_2 (w0, w1, out_len); + + w3[2] = out_len * 8; + + u32x a = MD5M_A; + u32x b = MD5M_B; + u32x c = MD5M_C; + u32x d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H , a, b, c, d, w1[1], MD5C20, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w2[0], MD5C21, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w2[3], MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w3[2], MD5C23, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w0[1], MD5C24, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w1[0], MD5C25, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w1[3], MD5C26, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w2[2], MD5C27, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w3[1], MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w0[0], MD5C29, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w0[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w1[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w2[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w3[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w3[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w0[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1[0], MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w2[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2[1], MD5C3f, MD5S33); + + a += MD5M_A; + b += MD5M_B; + c += MD5M_C; + d += MD5M_D; + + const u32x w0_t = uint_to_hex_lower8 ((a >> 0) & 255) << 0 + | uint_to_hex_lower8 ((a >> 8) & 255) << 16; + const u32x w1_t = uint_to_hex_lower8 ((a >> 16) & 255) << 0 + | uint_to_hex_lower8 ((a >> 24) & 255) << 16; + const u32x w2_t = uint_to_hex_lower8 ((b >> 0) & 255) << 0 + | uint_to_hex_lower8 ((b >> 8) & 255) << 16; + const u32x w3_t = uint_to_hex_lower8 ((b >> 16) & 255) << 0 + | uint_to_hex_lower8 ((b >> 24) & 255) << 16; + const u32x w4_t = uint_to_hex_lower8 ((c >> 0) & 255) << 0 + | uint_to_hex_lower8 ((c >> 8) & 255) << 16; + const u32x w5_t = uint_to_hex_lower8 ((c >> 16) & 255) << 0 + | uint_to_hex_lower8 ((c >> 24) & 255) << 16; + const u32x w6_t = uint_to_hex_lower8 ((d >> 0) & 255) << 0 + | uint_to_hex_lower8 ((d >> 8) & 255) << 16; + const u32x w7_t = uint_to_hex_lower8 ((d >> 16) & 255) << 0 + | uint_to_hex_lower8 ((d >> 24) & 255) << 16; + + const u32 w8_t = s[0]; + const u32 w9_t = s[1]; + const u32 wa_t = s[2]; + const u32 wb_t = s[3]; + const u32 wc_t = s[4]; + const u32 wd_t = s[5]; + const u32 we_t = s[6]; + const u32 wf_t = s[7]; + + a = MD5M_A; + b = MD5M_B; + c = MD5M_C; + d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t, MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t, MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t, MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t, MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w4_t, MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w5_t, MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w6_t, MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w7_t, MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w8_t, MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w9_t, MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, wa_t, MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, wb_t, MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, wc_t, MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, wd_t, MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, we_t, MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, wf_t, MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w1_t, MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w6_t, MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, wb_t, MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t, MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w5_t, MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, wa_t, MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, wf_t, MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w4_t, MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w9_t, MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, we_t, MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t, MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w8_t, MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, wd_t, MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t, MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w7_t, MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, wc_t, MD5C1f, MD5S13); + + MD5_STEP (MD5_H , a, b, c, d, w5_t, MD5C20, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w8_t, MD5C21, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, wb_t, MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, we_t, MD5C23, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w1_t, MD5C24, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w4_t, MD5C25, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w7_t, MD5C26, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, wa_t, MD5C27, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, wd_t, MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w0_t, MD5C29, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w3_t, MD5C2a, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w6_t, MD5C2b, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w9_t, MD5C2c, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, wc_t, MD5C2d, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, wf_t, MD5C2e, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w2_t, MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t, MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w7_t, MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, we_t, MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w5_t, MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, wc_t, MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t, MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, wa_t, MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t, MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w8_t, MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, wf_t, MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w6_t, MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, wd_t, MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w4_t, MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, wb_t, MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t, MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w9_t, MD5C3f, MD5S33); + + const u32x r_a = a + MD5M_A; + const u32x r_b = b + MD5M_B; + const u32x r_c = c + MD5M_C; + const u32x r_d = d + MD5M_D; + + a = r_a; + b = r_b; + c = r_c; + d = r_d; + + MD5_STEP0(MD5_Fo, a, b, c, d, MD5C00, MD5S00); + MD5_STEP0(MD5_Fo, d, a, b, c, MD5C01, MD5S01); + MD5_STEP0(MD5_Fo, c, d, a, b, MD5C02, MD5S02); + MD5_STEP0(MD5_Fo, b, c, d, a, MD5C03, MD5S03); + MD5_STEP0(MD5_Fo, a, b, c, d, MD5C04, MD5S00); + MD5_STEP0(MD5_Fo, d, a, b, c, MD5C05, MD5S01); + MD5_STEP0(MD5_Fo, c, d, a, b, MD5C06, MD5S02); + MD5_STEP0(MD5_Fo, b, c, d, a, MD5C07, MD5S03); + MD5_STEP0(MD5_Fo, a, b, c, d, MD5C08, MD5S00); + MD5_STEP0(MD5_Fo, d, a, b, c, MD5C09, MD5S01); + MD5_STEP0(MD5_Fo, c, d, a, b, MD5C0a, MD5S02); + MD5_STEP0(MD5_Fo, b, c, d, a, MD5C0b, MD5S03); + MD5_STEP0(MD5_Fo, a, b, c, d, MD5C0c, MD5S00); + MD5_STEP0(MD5_Fo, d, a, b, c, MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, r_14, MD5C0e, MD5S02); + MD5_STEP0(MD5_Fo, b, c, d, a, MD5C0f, MD5S03); + + MD5_STEP0(MD5_Go, a, b, c, d, MD5C10, MD5S10); + MD5_STEP0(MD5_Go, d, a, b, c, MD5C11, MD5S11); + MD5_STEP0(MD5_Go, c, d, a, b, MD5C12, MD5S12); + MD5_STEP0(MD5_Go, b, c, d, a, MD5C13, MD5S13); + MD5_STEP0(MD5_Go, a, b, c, d, MD5C14, MD5S10); + MD5_STEP0(MD5_Go, d, a, b, c, MD5C15, MD5S11); + MD5_STEP0(MD5_Go, c, d, a, b, MD5C16, MD5S12); + MD5_STEP0(MD5_Go, b, c, d, a, MD5C17, MD5S13); + MD5_STEP0(MD5_Go, a, b, c, d, MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, r_14, MD5C19, MD5S11); + MD5_STEP0(MD5_Go, c, d, a, b, MD5C1a, MD5S12); + MD5_STEP0(MD5_Go, b, c, d, a, MD5C1b, MD5S13); + MD5_STEP0(MD5_Go, a, b, c, d, MD5C1c, MD5S10); + MD5_STEP0(MD5_Go, d, a, b, c, MD5C1d, MD5S11); + MD5_STEP0(MD5_Go, c, d, a, b, MD5C1e, MD5S12); + MD5_STEP0(MD5_Go, b, c, d, a, MD5C1f, MD5S13); + + MD5_STEP0(MD5_H , a, b, c, d, MD5C20, MD5S20); + MD5_STEP0(MD5_H , d, a, b, c, MD5C21, MD5S21); + MD5_STEP0(MD5_H , c, d, a, b, MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, r_14, MD5C23, MD5S23); + MD5_STEP0(MD5_H , a, b, c, d, MD5C24, MD5S20); + MD5_STEP0(MD5_H , d, a, b, c, MD5C25, MD5S21); + MD5_STEP0(MD5_H , c, d, a, b, MD5C26, MD5S22); + MD5_STEP0(MD5_H , b, c, d, a, MD5C27, MD5S23); + MD5_STEP0(MD5_H , a, b, c, d, MD5C28, MD5S20); + MD5_STEP0(MD5_H , d, a, b, c, MD5C29, MD5S21); + MD5_STEP0(MD5_H , c, d, a, b, MD5C2a, MD5S22); + MD5_STEP0(MD5_H , b, c, d, a, MD5C2b, MD5S23); + MD5_STEP0(MD5_H , a, b, c, d, MD5C2c, MD5S20); + MD5_STEP0(MD5_H , d, a, b, c, MD5C2d, MD5S21); + MD5_STEP0(MD5_H , c, d, a, b, MD5C2e, MD5S22); + MD5_STEP0(MD5_H , b, c, d, a, MD5C2f, MD5S23); + + MD5_STEP0(MD5_I , a, b, c, d, MD5C30, MD5S30); + MD5_STEP0(MD5_I , d, a, b, c, MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, r_14, MD5C32, MD5S32); + MD5_STEP0(MD5_I , b, c, d, a, MD5C33, MD5S33); + MD5_STEP0(MD5_I , a, b, c, d, MD5C34, MD5S30); + MD5_STEP0(MD5_I , d, a, b, c, MD5C35, MD5S31); + MD5_STEP0(MD5_I , c, d, a, b, MD5C36, MD5S32); + MD5_STEP0(MD5_I , b, c, d, a, MD5C37, MD5S33); + MD5_STEP0(MD5_I , a, b, c, d, MD5C38, MD5S30); + MD5_STEP0(MD5_I , d, a, b, c, MD5C39, MD5S31); + MD5_STEP0(MD5_I , c, d, a, b, MD5C3a, MD5S32); + MD5_STEP0(MD5_I , b, c, d, a, MD5C3b, MD5S33); + MD5_STEP0(MD5_I , a, b, c, d, MD5C3c, MD5S30); + + if ((a + r_a) != search[0]) continue; + + MD5_STEP0(MD5_I , d, a, b, c, MD5C3d, MD5S31); + MD5_STEP0(MD5_I , c, d, a, b, MD5C3e, MD5S32); + MD5_STEP0(MD5_I , b, c, d, a, MD5C3f, MD5S33); + + a += r_a; + b += r_b; + c += r_c; + d += r_d; + + const u32x r0 = a; + const u32x r1 = d; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_S + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m02710_s08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m02710_s16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/nv/m02710_a1.cu b/nv/m02710_a1.cu new file mode 100644 index 0000000000..20125607d0 --- /dev/null +++ b/nv/m02710_a1.cu @@ -0,0 +1,932 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _MD5_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW2 +#define VECT_SIZE4 +#endif + +#define DGST_R0 0 +#define DGST_R1 3 +#define DGST_R2 2 +#define DGST_R3 1 + +#include "include/kernel_functions.c" +#include "types_nv.c" +#include "common_nv.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +__device__ __constant__ comb_t c_combs[1024]; + +#ifdef VECT_SIZE1 +#define uint_to_hex_lower8(i) l_bin2asc[(i)] +#endif + +#ifdef VECT_SIZE2 +#define uint_to_hex_lower8(i) u32x (l_bin2asc[(i).x], l_bin2asc[(i).y]) +#endif + +#ifdef VECT_SIZE4 +#define uint_to_hex_lower8(i) u32x (l_bin2asc[(i).x], l_bin2asc[(i).y], l_bin2asc[(i).z], l_bin2asc[(i).w]) +#endif + +__device__ __constant__ char c_bin2asc[16] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' }; + +__device__ __shared__ short l_bin2asc[256]; + +extern "C" __global__ void __launch_bounds__ (256, 1) m02710_m04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + append_0x80_2 (wordl0, wordl1, pw_l_len); + + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, c_combs[0].pw_len); + } + + /** + * salt + */ + + u32 s[8]; + + s[0] = salt_bufs[salt_pos].salt_buf[0]; + s[1] = salt_bufs[salt_pos].salt_buf[1]; + s[2] = salt_bufs[salt_pos].salt_buf[2]; + s[3] = salt_bufs[salt_pos].salt_buf[3]; + s[4] = salt_bufs[salt_pos].salt_buf[4]; + s[5] = salt_bufs[salt_pos].salt_buf[5]; + s[6] = salt_bufs[salt_pos].salt_buf[6]; + s[7] = salt_bufs[salt_pos].salt_buf[7]; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + const u32 r_14 = (32 + salt_len) * 8; + + /** + * bin2asc table + */ + + l_bin2asc[lid] = c_bin2asc[(lid >> 0) & 15] << 8 + | c_bin2asc[(lid >> 4) & 15] << 0; + + __syncthreads (); + + if (gid >= gid_max) return; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = c_combs[il_pos].pw_len; + + const u32 pw_len = pw_l_len + pw_r_len; + + u32 wordr0[4]; + + wordr0[0] = c_combs[il_pos].i[0]; + wordr0[1] = c_combs[il_pos].i[1]; + wordr0[2] = c_combs[il_pos].i[2]; + wordr0[3] = c_combs[il_pos].i[3]; + + u32 wordr1[4]; + + wordr1[0] = c_combs[il_pos].i[4]; + wordr1[1] = c_combs[il_pos].i[5]; + wordr1[2] = c_combs[il_pos].i[6]; + wordr1[3] = c_combs[il_pos].i[7]; + + u32 wordr2[4]; + + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + + u32 wordr3[4]; + + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + u32x w0[4]; + + w0[0] = wordl0[0] | wordr0[0]; + w0[1] = wordl0[1] | wordr0[1]; + w0[2] = wordl0[2] | wordr0[2]; + w0[3] = wordl0[3] | wordr0[3]; + + u32x w1[4]; + + w1[0] = wordl1[0] | wordr1[0]; + w1[1] = wordl1[1] | wordr1[1]; + w1[2] = wordl1[2] | wordr1[2]; + w1[3] = wordl1[3] | wordr1[3]; + + u32x w2[4]; + + w2[0] = wordl2[0] | wordr2[0]; + w2[1] = wordl2[1] | wordr2[1]; + w2[2] = wordl2[2] | wordr2[2]; + w2[3] = wordl2[3] | wordr2[3]; + + u32x w3[4]; + + w3[0] = wordl3[0] | wordr3[0]; + w3[1] = wordl3[1] | wordr3[1]; + w3[2] = pw_len * 8; + w3[3] = 0; + + u32x a = MD5M_A; + u32x b = MD5M_B; + u32x c = MD5M_C; + u32x d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H , a, b, c, d, w1[1], MD5C20, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w2[0], MD5C21, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w2[3], MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w3[2], MD5C23, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w0[1], MD5C24, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w1[0], MD5C25, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w1[3], MD5C26, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w2[2], MD5C27, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w3[1], MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w0[0], MD5C29, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w0[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w1[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w2[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w3[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w3[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w0[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1[0], MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w2[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2[1], MD5C3f, MD5S33); + + a += MD5M_A; + b += MD5M_B; + c += MD5M_C; + d += MD5M_D; + + const u32x w0_t = uint_to_hex_lower8 ((a >> 0) & 255) << 0 + | uint_to_hex_lower8 ((a >> 8) & 255) << 16; + const u32x w1_t = uint_to_hex_lower8 ((a >> 16) & 255) << 0 + | uint_to_hex_lower8 ((a >> 24) & 255) << 16; + const u32x w2_t = uint_to_hex_lower8 ((b >> 0) & 255) << 0 + | uint_to_hex_lower8 ((b >> 8) & 255) << 16; + const u32x w3_t = uint_to_hex_lower8 ((b >> 16) & 255) << 0 + | uint_to_hex_lower8 ((b >> 24) & 255) << 16; + const u32x w4_t = uint_to_hex_lower8 ((c >> 0) & 255) << 0 + | uint_to_hex_lower8 ((c >> 8) & 255) << 16; + const u32x w5_t = uint_to_hex_lower8 ((c >> 16) & 255) << 0 + | uint_to_hex_lower8 ((c >> 24) & 255) << 16; + const u32x w6_t = uint_to_hex_lower8 ((d >> 0) & 255) << 0 + | uint_to_hex_lower8 ((d >> 8) & 255) << 16; + const u32x w7_t = uint_to_hex_lower8 ((d >> 16) & 255) << 0 + | uint_to_hex_lower8 ((d >> 24) & 255) << 16; + + const u32 w8_t = s[0]; + const u32 w9_t = s[1]; + const u32 wa_t = s[2]; + const u32 wb_t = s[3]; + const u32 wc_t = s[4]; + const u32 wd_t = s[5]; + const u32 we_t = s[6]; + const u32 wf_t = s[7]; + + a = MD5M_A; + b = MD5M_B; + c = MD5M_C; + d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t, MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t, MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t, MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t, MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w4_t, MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w5_t, MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w6_t, MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w7_t, MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w8_t, MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w9_t, MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, wa_t, MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, wb_t, MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, wc_t, MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, wd_t, MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, we_t, MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, wf_t, MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w1_t, MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w6_t, MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, wb_t, MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t, MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w5_t, MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, wa_t, MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, wf_t, MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w4_t, MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w9_t, MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, we_t, MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t, MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w8_t, MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, wd_t, MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t, MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w7_t, MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, wc_t, MD5C1f, MD5S13); + + MD5_STEP (MD5_H , a, b, c, d, w5_t, MD5C20, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w8_t, MD5C21, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, wb_t, MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, we_t, MD5C23, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w1_t, MD5C24, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w4_t, MD5C25, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w7_t, MD5C26, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, wa_t, MD5C27, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, wd_t, MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w0_t, MD5C29, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w3_t, MD5C2a, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w6_t, MD5C2b, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w9_t, MD5C2c, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, wc_t, MD5C2d, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, wf_t, MD5C2e, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w2_t, MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t, MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w7_t, MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, we_t, MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w5_t, MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, wc_t, MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t, MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, wa_t, MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t, MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w8_t, MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, wf_t, MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w6_t, MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, wd_t, MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w4_t, MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, wb_t, MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t, MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w9_t, MD5C3f, MD5S33); + + const u32x r_a = a + MD5M_A; + const u32x r_b = b + MD5M_B; + const u32x r_c = c + MD5M_C; + const u32x r_d = d + MD5M_D; + + a = r_a; + b = r_b; + c = r_c; + d = r_d; + + MD5_STEP0(MD5_Fo, a, b, c, d, MD5C00, MD5S00); + MD5_STEP0(MD5_Fo, d, a, b, c, MD5C01, MD5S01); + MD5_STEP0(MD5_Fo, c, d, a, b, MD5C02, MD5S02); + MD5_STEP0(MD5_Fo, b, c, d, a, MD5C03, MD5S03); + MD5_STEP0(MD5_Fo, a, b, c, d, MD5C04, MD5S00); + MD5_STEP0(MD5_Fo, d, a, b, c, MD5C05, MD5S01); + MD5_STEP0(MD5_Fo, c, d, a, b, MD5C06, MD5S02); + MD5_STEP0(MD5_Fo, b, c, d, a, MD5C07, MD5S03); + MD5_STEP0(MD5_Fo, a, b, c, d, MD5C08, MD5S00); + MD5_STEP0(MD5_Fo, d, a, b, c, MD5C09, MD5S01); + MD5_STEP0(MD5_Fo, c, d, a, b, MD5C0a, MD5S02); + MD5_STEP0(MD5_Fo, b, c, d, a, MD5C0b, MD5S03); + MD5_STEP0(MD5_Fo, a, b, c, d, MD5C0c, MD5S00); + MD5_STEP0(MD5_Fo, d, a, b, c, MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, r_14, MD5C0e, MD5S02); + MD5_STEP0(MD5_Fo, b, c, d, a, MD5C0f, MD5S03); + + MD5_STEP0(MD5_Go, a, b, c, d, MD5C10, MD5S10); + MD5_STEP0(MD5_Go, d, a, b, c, MD5C11, MD5S11); + MD5_STEP0(MD5_Go, c, d, a, b, MD5C12, MD5S12); + MD5_STEP0(MD5_Go, b, c, d, a, MD5C13, MD5S13); + MD5_STEP0(MD5_Go, a, b, c, d, MD5C14, MD5S10); + MD5_STEP0(MD5_Go, d, a, b, c, MD5C15, MD5S11); + MD5_STEP0(MD5_Go, c, d, a, b, MD5C16, MD5S12); + MD5_STEP0(MD5_Go, b, c, d, a, MD5C17, MD5S13); + MD5_STEP0(MD5_Go, a, b, c, d, MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, r_14, MD5C19, MD5S11); + MD5_STEP0(MD5_Go, c, d, a, b, MD5C1a, MD5S12); + MD5_STEP0(MD5_Go, b, c, d, a, MD5C1b, MD5S13); + MD5_STEP0(MD5_Go, a, b, c, d, MD5C1c, MD5S10); + MD5_STEP0(MD5_Go, d, a, b, c, MD5C1d, MD5S11); + MD5_STEP0(MD5_Go, c, d, a, b, MD5C1e, MD5S12); + MD5_STEP0(MD5_Go, b, c, d, a, MD5C1f, MD5S13); + + MD5_STEP0(MD5_H , a, b, c, d, MD5C20, MD5S20); + MD5_STEP0(MD5_H , d, a, b, c, MD5C21, MD5S21); + MD5_STEP0(MD5_H , c, d, a, b, MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, r_14, MD5C23, MD5S23); + MD5_STEP0(MD5_H , a, b, c, d, MD5C24, MD5S20); + MD5_STEP0(MD5_H , d, a, b, c, MD5C25, MD5S21); + MD5_STEP0(MD5_H , c, d, a, b, MD5C26, MD5S22); + MD5_STEP0(MD5_H , b, c, d, a, MD5C27, MD5S23); + MD5_STEP0(MD5_H , a, b, c, d, MD5C28, MD5S20); + MD5_STEP0(MD5_H , d, a, b, c, MD5C29, MD5S21); + MD5_STEP0(MD5_H , c, d, a, b, MD5C2a, MD5S22); + MD5_STEP0(MD5_H , b, c, d, a, MD5C2b, MD5S23); + MD5_STEP0(MD5_H , a, b, c, d, MD5C2c, MD5S20); + MD5_STEP0(MD5_H , d, a, b, c, MD5C2d, MD5S21); + MD5_STEP0(MD5_H , c, d, a, b, MD5C2e, MD5S22); + MD5_STEP0(MD5_H , b, c, d, a, MD5C2f, MD5S23); + + MD5_STEP0(MD5_I , a, b, c, d, MD5C30, MD5S30); + MD5_STEP0(MD5_I , d, a, b, c, MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, r_14, MD5C32, MD5S32); + MD5_STEP0(MD5_I , b, c, d, a, MD5C33, MD5S33); + MD5_STEP0(MD5_I , a, b, c, d, MD5C34, MD5S30); + MD5_STEP0(MD5_I , d, a, b, c, MD5C35, MD5S31); + MD5_STEP0(MD5_I , c, d, a, b, MD5C36, MD5S32); + MD5_STEP0(MD5_I , b, c, d, a, MD5C37, MD5S33); + MD5_STEP0(MD5_I , a, b, c, d, MD5C38, MD5S30); + MD5_STEP0(MD5_I , d, a, b, c, MD5C39, MD5S31); + MD5_STEP0(MD5_I , c, d, a, b, MD5C3a, MD5S32); + MD5_STEP0(MD5_I , b, c, d, a, MD5C3b, MD5S33); + MD5_STEP0(MD5_I , a, b, c, d, MD5C3c, MD5S30); + MD5_STEP0(MD5_I , d, a, b, c, MD5C3d, MD5S31); + MD5_STEP0(MD5_I , c, d, a, b, MD5C3e, MD5S32); + MD5_STEP0(MD5_I , b, c, d, a, MD5C3f, MD5S33); + + a += r_a; + b += r_b; + c += r_c; + d += r_d; + + const u32x r0 = a; + const u32x r1 = d; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_M + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m02710_m08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m02710_m16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m02710_s04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + append_0x80_2 (wordl0, wordl1, pw_l_len); + + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, c_combs[0].pw_len); + } + + /** + * salt + */ + + u32 s[8]; + + s[0] = salt_bufs[salt_pos].salt_buf[0]; + s[1] = salt_bufs[salt_pos].salt_buf[1]; + s[2] = salt_bufs[salt_pos].salt_buf[2]; + s[3] = salt_bufs[salt_pos].salt_buf[3]; + s[4] = salt_bufs[salt_pos].salt_buf[4]; + s[5] = salt_bufs[salt_pos].salt_buf[5]; + s[6] = salt_bufs[salt_pos].salt_buf[6]; + s[7] = salt_bufs[salt_pos].salt_buf[7]; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + const u32 r_14 = (32 + salt_len) * 8; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * bin2asc table + */ + + l_bin2asc[lid] = c_bin2asc[(lid >> 0) & 15] << 8 + | c_bin2asc[(lid >> 4) & 15] << 0; + + __syncthreads (); + + if (gid >= gid_max) return; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = c_combs[il_pos].pw_len; + + const u32 pw_len = pw_l_len + pw_r_len; + + u32 wordr0[4]; + + wordr0[0] = c_combs[il_pos].i[0]; + wordr0[1] = c_combs[il_pos].i[1]; + wordr0[2] = c_combs[il_pos].i[2]; + wordr0[3] = c_combs[il_pos].i[3]; + + u32 wordr1[4]; + + wordr1[0] = c_combs[il_pos].i[4]; + wordr1[1] = c_combs[il_pos].i[5]; + wordr1[2] = c_combs[il_pos].i[6]; + wordr1[3] = c_combs[il_pos].i[7]; + + u32 wordr2[4]; + + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + + u32 wordr3[4]; + + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + u32x w0[4]; + + w0[0] = wordl0[0] | wordr0[0]; + w0[1] = wordl0[1] | wordr0[1]; + w0[2] = wordl0[2] | wordr0[2]; + w0[3] = wordl0[3] | wordr0[3]; + + u32x w1[4]; + + w1[0] = wordl1[0] | wordr1[0]; + w1[1] = wordl1[1] | wordr1[1]; + w1[2] = wordl1[2] | wordr1[2]; + w1[3] = wordl1[3] | wordr1[3]; + + u32x w2[4]; + + w2[0] = wordl2[0] | wordr2[0]; + w2[1] = wordl2[1] | wordr2[1]; + w2[2] = wordl2[2] | wordr2[2]; + w2[3] = wordl2[3] | wordr2[3]; + + u32x w3[4]; + + w3[0] = wordl3[0] | wordr3[0]; + w3[1] = wordl3[1] | wordr3[1]; + w3[2] = pw_len * 8; + w3[3] = 0; + + u32x a = MD5M_A; + u32x b = MD5M_B; + u32x c = MD5M_C; + u32x d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H , a, b, c, d, w1[1], MD5C20, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w2[0], MD5C21, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w2[3], MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w3[2], MD5C23, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w0[1], MD5C24, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w1[0], MD5C25, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w1[3], MD5C26, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w2[2], MD5C27, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w3[1], MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w0[0], MD5C29, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w0[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w1[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w2[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w3[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w3[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w0[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1[0], MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w2[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2[1], MD5C3f, MD5S33); + + a += MD5M_A; + b += MD5M_B; + c += MD5M_C; + d += MD5M_D; + + const u32x w0_t = uint_to_hex_lower8 ((a >> 0) & 255) << 0 + | uint_to_hex_lower8 ((a >> 8) & 255) << 16; + const u32x w1_t = uint_to_hex_lower8 ((a >> 16) & 255) << 0 + | uint_to_hex_lower8 ((a >> 24) & 255) << 16; + const u32x w2_t = uint_to_hex_lower8 ((b >> 0) & 255) << 0 + | uint_to_hex_lower8 ((b >> 8) & 255) << 16; + const u32x w3_t = uint_to_hex_lower8 ((b >> 16) & 255) << 0 + | uint_to_hex_lower8 ((b >> 24) & 255) << 16; + const u32x w4_t = uint_to_hex_lower8 ((c >> 0) & 255) << 0 + | uint_to_hex_lower8 ((c >> 8) & 255) << 16; + const u32x w5_t = uint_to_hex_lower8 ((c >> 16) & 255) << 0 + | uint_to_hex_lower8 ((c >> 24) & 255) << 16; + const u32x w6_t = uint_to_hex_lower8 ((d >> 0) & 255) << 0 + | uint_to_hex_lower8 ((d >> 8) & 255) << 16; + const u32x w7_t = uint_to_hex_lower8 ((d >> 16) & 255) << 0 + | uint_to_hex_lower8 ((d >> 24) & 255) << 16; + + const u32 w8_t = s[0]; + const u32 w9_t = s[1]; + const u32 wa_t = s[2]; + const u32 wb_t = s[3]; + const u32 wc_t = s[4]; + const u32 wd_t = s[5]; + const u32 we_t = s[6]; + const u32 wf_t = s[7]; + + a = MD5M_A; + b = MD5M_B; + c = MD5M_C; + d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t, MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t, MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t, MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t, MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w4_t, MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w5_t, MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w6_t, MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w7_t, MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w8_t, MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w9_t, MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, wa_t, MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, wb_t, MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, wc_t, MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, wd_t, MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, we_t, MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, wf_t, MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w1_t, MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w6_t, MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, wb_t, MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t, MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w5_t, MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, wa_t, MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, wf_t, MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w4_t, MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w9_t, MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, we_t, MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t, MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w8_t, MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, wd_t, MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t, MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w7_t, MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, wc_t, MD5C1f, MD5S13); + + MD5_STEP (MD5_H , a, b, c, d, w5_t, MD5C20, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w8_t, MD5C21, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, wb_t, MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, we_t, MD5C23, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w1_t, MD5C24, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w4_t, MD5C25, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w7_t, MD5C26, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, wa_t, MD5C27, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, wd_t, MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w0_t, MD5C29, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w3_t, MD5C2a, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w6_t, MD5C2b, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w9_t, MD5C2c, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, wc_t, MD5C2d, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, wf_t, MD5C2e, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w2_t, MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t, MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w7_t, MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, we_t, MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w5_t, MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, wc_t, MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t, MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, wa_t, MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t, MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w8_t, MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, wf_t, MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w6_t, MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, wd_t, MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w4_t, MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, wb_t, MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t, MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w9_t, MD5C3f, MD5S33); + + const u32x r_a = a + MD5M_A; + const u32x r_b = b + MD5M_B; + const u32x r_c = c + MD5M_C; + const u32x r_d = d + MD5M_D; + + a = r_a; + b = r_b; + c = r_c; + d = r_d; + + MD5_STEP0(MD5_Fo, a, b, c, d, MD5C00, MD5S00); + MD5_STEP0(MD5_Fo, d, a, b, c, MD5C01, MD5S01); + MD5_STEP0(MD5_Fo, c, d, a, b, MD5C02, MD5S02); + MD5_STEP0(MD5_Fo, b, c, d, a, MD5C03, MD5S03); + MD5_STEP0(MD5_Fo, a, b, c, d, MD5C04, MD5S00); + MD5_STEP0(MD5_Fo, d, a, b, c, MD5C05, MD5S01); + MD5_STEP0(MD5_Fo, c, d, a, b, MD5C06, MD5S02); + MD5_STEP0(MD5_Fo, b, c, d, a, MD5C07, MD5S03); + MD5_STEP0(MD5_Fo, a, b, c, d, MD5C08, MD5S00); + MD5_STEP0(MD5_Fo, d, a, b, c, MD5C09, MD5S01); + MD5_STEP0(MD5_Fo, c, d, a, b, MD5C0a, MD5S02); + MD5_STEP0(MD5_Fo, b, c, d, a, MD5C0b, MD5S03); + MD5_STEP0(MD5_Fo, a, b, c, d, MD5C0c, MD5S00); + MD5_STEP0(MD5_Fo, d, a, b, c, MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, r_14, MD5C0e, MD5S02); + MD5_STEP0(MD5_Fo, b, c, d, a, MD5C0f, MD5S03); + + MD5_STEP0(MD5_Go, a, b, c, d, MD5C10, MD5S10); + MD5_STEP0(MD5_Go, d, a, b, c, MD5C11, MD5S11); + MD5_STEP0(MD5_Go, c, d, a, b, MD5C12, MD5S12); + MD5_STEP0(MD5_Go, b, c, d, a, MD5C13, MD5S13); + MD5_STEP0(MD5_Go, a, b, c, d, MD5C14, MD5S10); + MD5_STEP0(MD5_Go, d, a, b, c, MD5C15, MD5S11); + MD5_STEP0(MD5_Go, c, d, a, b, MD5C16, MD5S12); + MD5_STEP0(MD5_Go, b, c, d, a, MD5C17, MD5S13); + MD5_STEP0(MD5_Go, a, b, c, d, MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, r_14, MD5C19, MD5S11); + MD5_STEP0(MD5_Go, c, d, a, b, MD5C1a, MD5S12); + MD5_STEP0(MD5_Go, b, c, d, a, MD5C1b, MD5S13); + MD5_STEP0(MD5_Go, a, b, c, d, MD5C1c, MD5S10); + MD5_STEP0(MD5_Go, d, a, b, c, MD5C1d, MD5S11); + MD5_STEP0(MD5_Go, c, d, a, b, MD5C1e, MD5S12); + MD5_STEP0(MD5_Go, b, c, d, a, MD5C1f, MD5S13); + + MD5_STEP0(MD5_H , a, b, c, d, MD5C20, MD5S20); + MD5_STEP0(MD5_H , d, a, b, c, MD5C21, MD5S21); + MD5_STEP0(MD5_H , c, d, a, b, MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, r_14, MD5C23, MD5S23); + MD5_STEP0(MD5_H , a, b, c, d, MD5C24, MD5S20); + MD5_STEP0(MD5_H , d, a, b, c, MD5C25, MD5S21); + MD5_STEP0(MD5_H , c, d, a, b, MD5C26, MD5S22); + MD5_STEP0(MD5_H , b, c, d, a, MD5C27, MD5S23); + MD5_STEP0(MD5_H , a, b, c, d, MD5C28, MD5S20); + MD5_STEP0(MD5_H , d, a, b, c, MD5C29, MD5S21); + MD5_STEP0(MD5_H , c, d, a, b, MD5C2a, MD5S22); + MD5_STEP0(MD5_H , b, c, d, a, MD5C2b, MD5S23); + MD5_STEP0(MD5_H , a, b, c, d, MD5C2c, MD5S20); + MD5_STEP0(MD5_H , d, a, b, c, MD5C2d, MD5S21); + MD5_STEP0(MD5_H , c, d, a, b, MD5C2e, MD5S22); + MD5_STEP0(MD5_H , b, c, d, a, MD5C2f, MD5S23); + + MD5_STEP0(MD5_I , a, b, c, d, MD5C30, MD5S30); + MD5_STEP0(MD5_I , d, a, b, c, MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, r_14, MD5C32, MD5S32); + MD5_STEP0(MD5_I , b, c, d, a, MD5C33, MD5S33); + MD5_STEP0(MD5_I , a, b, c, d, MD5C34, MD5S30); + MD5_STEP0(MD5_I , d, a, b, c, MD5C35, MD5S31); + MD5_STEP0(MD5_I , c, d, a, b, MD5C36, MD5S32); + MD5_STEP0(MD5_I , b, c, d, a, MD5C37, MD5S33); + MD5_STEP0(MD5_I , a, b, c, d, MD5C38, MD5S30); + MD5_STEP0(MD5_I , d, a, b, c, MD5C39, MD5S31); + MD5_STEP0(MD5_I , c, d, a, b, MD5C3a, MD5S32); + MD5_STEP0(MD5_I , b, c, d, a, MD5C3b, MD5S33); + MD5_STEP0(MD5_I , a, b, c, d, MD5C3c, MD5S30); + + if ((a + r_a) != search[0]) continue; + + MD5_STEP0(MD5_I , d, a, b, c, MD5C3d, MD5S31); + MD5_STEP0(MD5_I , c, d, a, b, MD5C3e, MD5S32); + MD5_STEP0(MD5_I , b, c, d, a, MD5C3f, MD5S33); + + a += r_a; + b += r_b; + c += r_c; + d += r_d; + + const u32x r0 = a; + const u32x r1 = d; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_S + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m02710_s08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m02710_s16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/nv/m02710_a3.cu b/nv/m02710_a3.cu new file mode 100644 index 0000000000..6c33c2a19c --- /dev/null +++ b/nv/m02710_a3.cu @@ -0,0 +1,1034 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _MD5_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW2 +#define VECT_SIZE4 +#endif + +#define DGST_R0 0 +#define DGST_R1 3 +#define DGST_R2 2 +#define DGST_R3 1 + +#include "include/kernel_functions.c" +#include "types_nv.c" +#include "common_nv.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +__device__ __constant__ bf_t c_bfs[1024]; + +#ifdef VECT_SIZE1 +#define uint_to_hex_lower8(i) l_bin2asc[(i)] +#endif + +#ifdef VECT_SIZE2 +#define uint_to_hex_lower8(i) u32x (l_bin2asc[(i).x], l_bin2asc[(i).y]) +#endif + +#ifdef VECT_SIZE4 +#define uint_to_hex_lower8(i) u32x (l_bin2asc[(i).x], l_bin2asc[(i).y], l_bin2asc[(i).z], l_bin2asc[(i).w]) +#endif + +__device__ __constant__ char c_bin2asc[16] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' }; + +__device__ __shared__ short l_bin2asc[256]; + +__device__ static void m02710m (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], const u32 pw_len, const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset) +{ + /** + * modifier + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + const u32 lid = threadIdx.x; + + /** + * salt + */ + + u32 s[8]; + + s[0] = salt_bufs[salt_pos].salt_buf[0]; + s[1] = salt_bufs[salt_pos].salt_buf[1]; + s[2] = salt_bufs[salt_pos].salt_buf[2]; + s[3] = salt_bufs[salt_pos].salt_buf[3]; + s[4] = salt_bufs[salt_pos].salt_buf[4]; + s[5] = salt_bufs[salt_pos].salt_buf[5]; + s[6] = salt_bufs[salt_pos].salt_buf[6]; + s[7] = salt_bufs[salt_pos].salt_buf[7]; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + const u32 r_14 = (32 + salt_len) * 8; + + /** + * loop + */ + + u32x w0l = w0[0]; + + for (u32 il_pos = 0; il_pos < bfs_cnt; il_pos++) + { + const u32 w0r = c_bfs[il_pos].i; + + w0[0] = w0l | w0r; + + u32x a = MD5M_A; + u32x b = MD5M_B; + u32x c = MD5M_C; + u32x d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H , a, b, c, d, w1[1], MD5C20, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w2[0], MD5C21, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w2[3], MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w3[2], MD5C23, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w0[1], MD5C24, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w1[0], MD5C25, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w1[3], MD5C26, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w2[2], MD5C27, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w3[1], MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w0[0], MD5C29, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w0[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w1[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w2[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w3[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w3[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w0[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1[0], MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w2[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2[1], MD5C3f, MD5S33); + + a += MD5M_A; + b += MD5M_B; + c += MD5M_C; + d += MD5M_D; + + const u32x w0_t = uint_to_hex_lower8 ((a >> 0) & 255) << 0 + | uint_to_hex_lower8 ((a >> 8) & 255) << 16; + const u32x w1_t = uint_to_hex_lower8 ((a >> 16) & 255) << 0 + | uint_to_hex_lower8 ((a >> 24) & 255) << 16; + const u32x w2_t = uint_to_hex_lower8 ((b >> 0) & 255) << 0 + | uint_to_hex_lower8 ((b >> 8) & 255) << 16; + const u32x w3_t = uint_to_hex_lower8 ((b >> 16) & 255) << 0 + | uint_to_hex_lower8 ((b >> 24) & 255) << 16; + const u32x w4_t = uint_to_hex_lower8 ((c >> 0) & 255) << 0 + | uint_to_hex_lower8 ((c >> 8) & 255) << 16; + const u32x w5_t = uint_to_hex_lower8 ((c >> 16) & 255) << 0 + | uint_to_hex_lower8 ((c >> 24) & 255) << 16; + const u32x w6_t = uint_to_hex_lower8 ((d >> 0) & 255) << 0 + | uint_to_hex_lower8 ((d >> 8) & 255) << 16; + const u32x w7_t = uint_to_hex_lower8 ((d >> 16) & 255) << 0 + | uint_to_hex_lower8 ((d >> 24) & 255) << 16; + + const u32 w8_t = s[0]; + const u32 w9_t = s[1]; + const u32 wa_t = s[2]; + const u32 wb_t = s[3]; + const u32 wc_t = s[4]; + const u32 wd_t = s[5]; + const u32 we_t = s[6]; + const u32 wf_t = s[7]; + + a = MD5M_A; + b = MD5M_B; + c = MD5M_C; + d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t, MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t, MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t, MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t, MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w4_t, MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w5_t, MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w6_t, MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w7_t, MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w8_t, MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w9_t, MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, wa_t, MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, wb_t, MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, wc_t, MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, wd_t, MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, we_t, MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, wf_t, MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w1_t, MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w6_t, MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, wb_t, MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t, MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w5_t, MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, wa_t, MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, wf_t, MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w4_t, MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w9_t, MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, we_t, MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t, MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w8_t, MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, wd_t, MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t, MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w7_t, MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, wc_t, MD5C1f, MD5S13); + + MD5_STEP (MD5_H , a, b, c, d, w5_t, MD5C20, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w8_t, MD5C21, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, wb_t, MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, we_t, MD5C23, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w1_t, MD5C24, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w4_t, MD5C25, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w7_t, MD5C26, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, wa_t, MD5C27, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, wd_t, MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w0_t, MD5C29, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w3_t, MD5C2a, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w6_t, MD5C2b, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w9_t, MD5C2c, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, wc_t, MD5C2d, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, wf_t, MD5C2e, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w2_t, MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t, MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w7_t, MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, we_t, MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w5_t, MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, wc_t, MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t, MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, wa_t, MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t, MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w8_t, MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, wf_t, MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w6_t, MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, wd_t, MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w4_t, MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, wb_t, MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t, MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w9_t, MD5C3f, MD5S33); + + const u32x r_a = a + MD5M_A; + const u32x r_b = b + MD5M_B; + const u32x r_c = c + MD5M_C; + const u32x r_d = d + MD5M_D; + + a = r_a; + b = r_b; + c = r_c; + d = r_d; + + MD5_STEP0(MD5_Fo, a, b, c, d, MD5C00, MD5S00); + MD5_STEP0(MD5_Fo, d, a, b, c, MD5C01, MD5S01); + MD5_STEP0(MD5_Fo, c, d, a, b, MD5C02, MD5S02); + MD5_STEP0(MD5_Fo, b, c, d, a, MD5C03, MD5S03); + MD5_STEP0(MD5_Fo, a, b, c, d, MD5C04, MD5S00); + MD5_STEP0(MD5_Fo, d, a, b, c, MD5C05, MD5S01); + MD5_STEP0(MD5_Fo, c, d, a, b, MD5C06, MD5S02); + MD5_STEP0(MD5_Fo, b, c, d, a, MD5C07, MD5S03); + MD5_STEP0(MD5_Fo, a, b, c, d, MD5C08, MD5S00); + MD5_STEP0(MD5_Fo, d, a, b, c, MD5C09, MD5S01); + MD5_STEP0(MD5_Fo, c, d, a, b, MD5C0a, MD5S02); + MD5_STEP0(MD5_Fo, b, c, d, a, MD5C0b, MD5S03); + MD5_STEP0(MD5_Fo, a, b, c, d, MD5C0c, MD5S00); + MD5_STEP0(MD5_Fo, d, a, b, c, MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, r_14, MD5C0e, MD5S02); + MD5_STEP0(MD5_Fo, b, c, d, a, MD5C0f, MD5S03); + + MD5_STEP0(MD5_Go, a, b, c, d, MD5C10, MD5S10); + MD5_STEP0(MD5_Go, d, a, b, c, MD5C11, MD5S11); + MD5_STEP0(MD5_Go, c, d, a, b, MD5C12, MD5S12); + MD5_STEP0(MD5_Go, b, c, d, a, MD5C13, MD5S13); + MD5_STEP0(MD5_Go, a, b, c, d, MD5C14, MD5S10); + MD5_STEP0(MD5_Go, d, a, b, c, MD5C15, MD5S11); + MD5_STEP0(MD5_Go, c, d, a, b, MD5C16, MD5S12); + MD5_STEP0(MD5_Go, b, c, d, a, MD5C17, MD5S13); + MD5_STEP0(MD5_Go, a, b, c, d, MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, r_14, MD5C19, MD5S11); + MD5_STEP0(MD5_Go, c, d, a, b, MD5C1a, MD5S12); + MD5_STEP0(MD5_Go, b, c, d, a, MD5C1b, MD5S13); + MD5_STEP0(MD5_Go, a, b, c, d, MD5C1c, MD5S10); + MD5_STEP0(MD5_Go, d, a, b, c, MD5C1d, MD5S11); + MD5_STEP0(MD5_Go, c, d, a, b, MD5C1e, MD5S12); + MD5_STEP0(MD5_Go, b, c, d, a, MD5C1f, MD5S13); + + MD5_STEP0(MD5_H , a, b, c, d, MD5C20, MD5S20); + MD5_STEP0(MD5_H , d, a, b, c, MD5C21, MD5S21); + MD5_STEP0(MD5_H , c, d, a, b, MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, r_14, MD5C23, MD5S23); + MD5_STEP0(MD5_H , a, b, c, d, MD5C24, MD5S20); + MD5_STEP0(MD5_H , d, a, b, c, MD5C25, MD5S21); + MD5_STEP0(MD5_H , c, d, a, b, MD5C26, MD5S22); + MD5_STEP0(MD5_H , b, c, d, a, MD5C27, MD5S23); + MD5_STEP0(MD5_H , a, b, c, d, MD5C28, MD5S20); + MD5_STEP0(MD5_H , d, a, b, c, MD5C29, MD5S21); + MD5_STEP0(MD5_H , c, d, a, b, MD5C2a, MD5S22); + MD5_STEP0(MD5_H , b, c, d, a, MD5C2b, MD5S23); + MD5_STEP0(MD5_H , a, b, c, d, MD5C2c, MD5S20); + MD5_STEP0(MD5_H , d, a, b, c, MD5C2d, MD5S21); + MD5_STEP0(MD5_H , c, d, a, b, MD5C2e, MD5S22); + MD5_STEP0(MD5_H , b, c, d, a, MD5C2f, MD5S23); + + MD5_STEP0(MD5_I , a, b, c, d, MD5C30, MD5S30); + MD5_STEP0(MD5_I , d, a, b, c, MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, r_14, MD5C32, MD5S32); + MD5_STEP0(MD5_I , b, c, d, a, MD5C33, MD5S33); + MD5_STEP0(MD5_I , a, b, c, d, MD5C34, MD5S30); + MD5_STEP0(MD5_I , d, a, b, c, MD5C35, MD5S31); + MD5_STEP0(MD5_I , c, d, a, b, MD5C36, MD5S32); + MD5_STEP0(MD5_I , b, c, d, a, MD5C37, MD5S33); + MD5_STEP0(MD5_I , a, b, c, d, MD5C38, MD5S30); + MD5_STEP0(MD5_I , d, a, b, c, MD5C39, MD5S31); + MD5_STEP0(MD5_I , c, d, a, b, MD5C3a, MD5S32); + MD5_STEP0(MD5_I , b, c, d, a, MD5C3b, MD5S33); + MD5_STEP0(MD5_I , a, b, c, d, MD5C3c, MD5S30); + MD5_STEP0(MD5_I , d, a, b, c, MD5C3d, MD5S31); + MD5_STEP0(MD5_I , c, d, a, b, MD5C3e, MD5S32); + MD5_STEP0(MD5_I , b, c, d, a, MD5C3f, MD5S33); + + a += r_a; + b += r_b; + c += r_c; + d += r_d; + + const u32x r0 = a; + const u32x r1 = d; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_M + } +} + +__device__ static void m02710s (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], const u32 pw_len, const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset) +{ + /** + * modifier + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + const u32 lid = threadIdx.x; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * salt + */ + + u32 s[8]; + + s[0] = salt_bufs[salt_pos].salt_buf[0]; + s[1] = salt_bufs[salt_pos].salt_buf[1]; + s[2] = salt_bufs[salt_pos].salt_buf[2]; + s[3] = salt_bufs[salt_pos].salt_buf[3]; + s[4] = salt_bufs[salt_pos].salt_buf[4]; + s[5] = salt_bufs[salt_pos].salt_buf[5]; + s[6] = salt_bufs[salt_pos].salt_buf[6]; + s[7] = salt_bufs[salt_pos].salt_buf[7]; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + const u32 r_14 = (32 + salt_len) * 8; + + /** + * loop + */ + + u32x w0l = w0[0]; + + for (u32 il_pos = 0; il_pos < bfs_cnt; il_pos++) + { + const u32 w0r = c_bfs[il_pos].i; + + w0[0] = w0l | w0r; + + u32x a = MD5M_A; + u32x b = MD5M_B; + u32x c = MD5M_C; + u32x d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H , a, b, c, d, w1[1], MD5C20, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w2[0], MD5C21, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w2[3], MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w3[2], MD5C23, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w0[1], MD5C24, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w1[0], MD5C25, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w1[3], MD5C26, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w2[2], MD5C27, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w3[1], MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w0[0], MD5C29, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w0[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w1[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w2[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w3[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w3[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w0[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1[0], MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w2[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2[1], MD5C3f, MD5S33); + + a += MD5M_A; + b += MD5M_B; + c += MD5M_C; + d += MD5M_D; + + const u32x w0_t = uint_to_hex_lower8 ((a >> 0) & 255) << 0 + | uint_to_hex_lower8 ((a >> 8) & 255) << 16; + const u32x w1_t = uint_to_hex_lower8 ((a >> 16) & 255) << 0 + | uint_to_hex_lower8 ((a >> 24) & 255) << 16; + const u32x w2_t = uint_to_hex_lower8 ((b >> 0) & 255) << 0 + | uint_to_hex_lower8 ((b >> 8) & 255) << 16; + const u32x w3_t = uint_to_hex_lower8 ((b >> 16) & 255) << 0 + | uint_to_hex_lower8 ((b >> 24) & 255) << 16; + const u32x w4_t = uint_to_hex_lower8 ((c >> 0) & 255) << 0 + | uint_to_hex_lower8 ((c >> 8) & 255) << 16; + const u32x w5_t = uint_to_hex_lower8 ((c >> 16) & 255) << 0 + | uint_to_hex_lower8 ((c >> 24) & 255) << 16; + const u32x w6_t = uint_to_hex_lower8 ((d >> 0) & 255) << 0 + | uint_to_hex_lower8 ((d >> 8) & 255) << 16; + const u32x w7_t = uint_to_hex_lower8 ((d >> 16) & 255) << 0 + | uint_to_hex_lower8 ((d >> 24) & 255) << 16; + + const u32 w8_t = s[0]; + const u32 w9_t = s[1]; + const u32 wa_t = s[2]; + const u32 wb_t = s[3]; + const u32 wc_t = s[4]; + const u32 wd_t = s[5]; + const u32 we_t = s[6]; + const u32 wf_t = s[7]; + + a = MD5M_A; + b = MD5M_B; + c = MD5M_C; + d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t, MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t, MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t, MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t, MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w4_t, MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w5_t, MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w6_t, MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w7_t, MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w8_t, MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w9_t, MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, wa_t, MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, wb_t, MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, wc_t, MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, wd_t, MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, we_t, MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, wf_t, MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w1_t, MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w6_t, MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, wb_t, MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t, MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w5_t, MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, wa_t, MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, wf_t, MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w4_t, MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w9_t, MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, we_t, MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t, MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w8_t, MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, wd_t, MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t, MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w7_t, MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, wc_t, MD5C1f, MD5S13); + + MD5_STEP (MD5_H , a, b, c, d, w5_t, MD5C20, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w8_t, MD5C21, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, wb_t, MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, we_t, MD5C23, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w1_t, MD5C24, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w4_t, MD5C25, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w7_t, MD5C26, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, wa_t, MD5C27, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, wd_t, MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w0_t, MD5C29, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w3_t, MD5C2a, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w6_t, MD5C2b, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w9_t, MD5C2c, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, wc_t, MD5C2d, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, wf_t, MD5C2e, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w2_t, MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t, MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w7_t, MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, we_t, MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w5_t, MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, wc_t, MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t, MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, wa_t, MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t, MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w8_t, MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, wf_t, MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w6_t, MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, wd_t, MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w4_t, MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, wb_t, MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t, MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w9_t, MD5C3f, MD5S33); + + const u32x r_a = a + MD5M_A; + const u32x r_b = b + MD5M_B; + const u32x r_c = c + MD5M_C; + const u32x r_d = d + MD5M_D; + + a = r_a; + b = r_b; + c = r_c; + d = r_d; + + MD5_STEP0(MD5_Fo, a, b, c, d, MD5C00, MD5S00); + MD5_STEP0(MD5_Fo, d, a, b, c, MD5C01, MD5S01); + MD5_STEP0(MD5_Fo, c, d, a, b, MD5C02, MD5S02); + MD5_STEP0(MD5_Fo, b, c, d, a, MD5C03, MD5S03); + MD5_STEP0(MD5_Fo, a, b, c, d, MD5C04, MD5S00); + MD5_STEP0(MD5_Fo, d, a, b, c, MD5C05, MD5S01); + MD5_STEP0(MD5_Fo, c, d, a, b, MD5C06, MD5S02); + MD5_STEP0(MD5_Fo, b, c, d, a, MD5C07, MD5S03); + MD5_STEP0(MD5_Fo, a, b, c, d, MD5C08, MD5S00); + MD5_STEP0(MD5_Fo, d, a, b, c, MD5C09, MD5S01); + MD5_STEP0(MD5_Fo, c, d, a, b, MD5C0a, MD5S02); + MD5_STEP0(MD5_Fo, b, c, d, a, MD5C0b, MD5S03); + MD5_STEP0(MD5_Fo, a, b, c, d, MD5C0c, MD5S00); + MD5_STEP0(MD5_Fo, d, a, b, c, MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, r_14, MD5C0e, MD5S02); + MD5_STEP0(MD5_Fo, b, c, d, a, MD5C0f, MD5S03); + + MD5_STEP0(MD5_Go, a, b, c, d, MD5C10, MD5S10); + MD5_STEP0(MD5_Go, d, a, b, c, MD5C11, MD5S11); + MD5_STEP0(MD5_Go, c, d, a, b, MD5C12, MD5S12); + MD5_STEP0(MD5_Go, b, c, d, a, MD5C13, MD5S13); + MD5_STEP0(MD5_Go, a, b, c, d, MD5C14, MD5S10); + MD5_STEP0(MD5_Go, d, a, b, c, MD5C15, MD5S11); + MD5_STEP0(MD5_Go, c, d, a, b, MD5C16, MD5S12); + MD5_STEP0(MD5_Go, b, c, d, a, MD5C17, MD5S13); + MD5_STEP0(MD5_Go, a, b, c, d, MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, r_14, MD5C19, MD5S11); + MD5_STEP0(MD5_Go, c, d, a, b, MD5C1a, MD5S12); + MD5_STEP0(MD5_Go, b, c, d, a, MD5C1b, MD5S13); + MD5_STEP0(MD5_Go, a, b, c, d, MD5C1c, MD5S10); + MD5_STEP0(MD5_Go, d, a, b, c, MD5C1d, MD5S11); + MD5_STEP0(MD5_Go, c, d, a, b, MD5C1e, MD5S12); + MD5_STEP0(MD5_Go, b, c, d, a, MD5C1f, MD5S13); + + MD5_STEP0(MD5_H , a, b, c, d, MD5C20, MD5S20); + MD5_STEP0(MD5_H , d, a, b, c, MD5C21, MD5S21); + MD5_STEP0(MD5_H , c, d, a, b, MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, r_14, MD5C23, MD5S23); + MD5_STEP0(MD5_H , a, b, c, d, MD5C24, MD5S20); + MD5_STEP0(MD5_H , d, a, b, c, MD5C25, MD5S21); + MD5_STEP0(MD5_H , c, d, a, b, MD5C26, MD5S22); + MD5_STEP0(MD5_H , b, c, d, a, MD5C27, MD5S23); + MD5_STEP0(MD5_H , a, b, c, d, MD5C28, MD5S20); + MD5_STEP0(MD5_H , d, a, b, c, MD5C29, MD5S21); + MD5_STEP0(MD5_H , c, d, a, b, MD5C2a, MD5S22); + MD5_STEP0(MD5_H , b, c, d, a, MD5C2b, MD5S23); + MD5_STEP0(MD5_H , a, b, c, d, MD5C2c, MD5S20); + MD5_STEP0(MD5_H , d, a, b, c, MD5C2d, MD5S21); + MD5_STEP0(MD5_H , c, d, a, b, MD5C2e, MD5S22); + MD5_STEP0(MD5_H , b, c, d, a, MD5C2f, MD5S23); + + MD5_STEP0(MD5_I , a, b, c, d, MD5C30, MD5S30); + MD5_STEP0(MD5_I , d, a, b, c, MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, r_14, MD5C32, MD5S32); + MD5_STEP0(MD5_I , b, c, d, a, MD5C33, MD5S33); + MD5_STEP0(MD5_I , a, b, c, d, MD5C34, MD5S30); + MD5_STEP0(MD5_I , d, a, b, c, MD5C35, MD5S31); + MD5_STEP0(MD5_I , c, d, a, b, MD5C36, MD5S32); + MD5_STEP0(MD5_I , b, c, d, a, MD5C37, MD5S33); + MD5_STEP0(MD5_I , a, b, c, d, MD5C38, MD5S30); + MD5_STEP0(MD5_I , d, a, b, c, MD5C39, MD5S31); + MD5_STEP0(MD5_I , c, d, a, b, MD5C3a, MD5S32); + MD5_STEP0(MD5_I , b, c, d, a, MD5C3b, MD5S33); + MD5_STEP0(MD5_I , a, b, c, d, MD5C3c, MD5S30); + + if ((a + r_a) != search[0]) continue; + + MD5_STEP0(MD5_I , d, a, b, c, MD5C3d, MD5S31); + MD5_STEP0(MD5_I , c, d, a, b, MD5C3e, MD5S32); + MD5_STEP0(MD5_I , b, c, d, a, MD5C3f, MD5S33); + + a += r_a; + b += r_b; + c += r_c; + d += r_d; + + const u32x r0 = a; + const u32x r1 = d; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_S + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m02710_m04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + const u32 lid = threadIdx.x; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = pws[gid].i[14]; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * bin2asc table + */ + + l_bin2asc[lid] = c_bin2asc[(lid >> 0) & 15] << 8 + | c_bin2asc[(lid >> 4) & 15] << 0; + + __syncthreads (); + + if (gid >= gid_max) return; + + /** + * main + */ + + m02710m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m02710_m08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + const u32 lid = threadIdx.x; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = pws[gid].i[14]; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * bin2asc table + */ + + l_bin2asc[lid] = c_bin2asc[(lid >> 0) & 15] << 8 + | c_bin2asc[(lid >> 4) & 15] << 0; + + __syncthreads (); + + if (gid >= gid_max) return; + + /** + * main + */ + + m02710m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m02710_m16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + const u32 lid = threadIdx.x; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = pws[gid].i[ 8]; + w2[1] = pws[gid].i[ 9]; + w2[2] = pws[gid].i[10]; + w2[3] = pws[gid].i[11]; + + u32x w3[4]; + + w3[0] = pws[gid].i[12]; + w3[1] = pws[gid].i[13]; + w3[2] = pws[gid].i[14]; + w3[3] = pws[gid].i[15]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * bin2asc table + */ + + l_bin2asc[lid] = c_bin2asc[(lid >> 0) & 15] << 8 + | c_bin2asc[(lid >> 4) & 15] << 0; + + __syncthreads (); + + if (gid >= gid_max) return; + + /** + * main + */ + + m02710m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m02710_s04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + const u32 lid = threadIdx.x; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = pws[gid].i[14]; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * bin2asc table + */ + + l_bin2asc[lid] = c_bin2asc[(lid >> 0) & 15] << 8 + | c_bin2asc[(lid >> 4) & 15] << 0; + + __syncthreads (); + + if (gid >= gid_max) return; + + /** + * main + */ + + m02710s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m02710_s08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + const u32 lid = threadIdx.x; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = pws[gid].i[14]; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * bin2asc table + */ + + l_bin2asc[lid] = c_bin2asc[(lid >> 0) & 15] << 8 + | c_bin2asc[(lid >> 4) & 15] << 0; + + __syncthreads (); + + if (gid >= gid_max) return; + + /** + * main + */ + + m02710s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m02710_s16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + const u32 lid = threadIdx.x; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = pws[gid].i[ 8]; + w2[1] = pws[gid].i[ 9]; + w2[2] = pws[gid].i[10]; + w2[3] = pws[gid].i[11]; + + u32x w3[4]; + + w3[0] = pws[gid].i[12]; + w3[1] = pws[gid].i[13]; + w3[2] = pws[gid].i[14]; + w3[3] = pws[gid].i[15]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * bin2asc table + */ + + l_bin2asc[lid] = c_bin2asc[(lid >> 0) & 15] << 8 + | c_bin2asc[(lid >> 4) & 15] << 0; + + __syncthreads (); + + if (gid >= gid_max) return; + + /** + * main + */ + + m02710s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} diff --git a/nv/m02810_a0.cu b/nv/m02810_a0.cu new file mode 100644 index 0000000000..8b15c33ee1 --- /dev/null +++ b/nv/m02810_a0.cu @@ -0,0 +1,832 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _MD5_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW2 +#define VECT_SIZE1 +#endif + +#define DGST_R0 0 +#define DGST_R1 3 +#define DGST_R2 2 +#define DGST_R3 1 + +#include "include/kernel_functions.c" +#include "types_nv.c" +#include "common_nv.c" +#include "include/rp_gpu.h" +#include "rp_nv.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +__device__ __constant__ gpu_rule_t c_rules[1024]; + +#ifdef VECT_SIZE1 +#define uint_to_hex_lower8(i) l_bin2asc[(i)] +#endif + +#ifdef VECT_SIZE2 +#define uint_to_hex_lower8(i) u32x (l_bin2asc[(i).x], l_bin2asc[(i).y]) +#endif + +#ifdef VECT_SIZE4 +#define uint_to_hex_lower8(i) u32x (l_bin2asc[(i).x], l_bin2asc[(i).y], l_bin2asc[(i).z], l_bin2asc[(i).w]) +#endif + +__device__ __constant__ char c_bin2asc[16] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' }; + +__device__ __shared__ short l_bin2asc[256]; + +extern "C" __global__ void __launch_bounds__ (256, 1) m02810_m04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + u32x pw_buf1[4]; + + pw_buf1[0] = pws[gid].i[ 4]; + pw_buf1[1] = pws[gid].i[ 5]; + pw_buf1[2] = pws[gid].i[ 6]; + pw_buf1[3] = pws[gid].i[ 7]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * salt + */ + + u32 s[8]; + + s[0] = salt_bufs[salt_pos].salt_buf_pc[0]; + s[1] = salt_bufs[salt_pos].salt_buf_pc[1]; + s[2] = salt_bufs[salt_pos].salt_buf_pc[2]; + s[3] = salt_bufs[salt_pos].salt_buf_pc[3]; + s[4] = salt_bufs[salt_pos].salt_buf_pc[4]; + s[5] = salt_bufs[salt_pos].salt_buf_pc[5]; + s[6] = salt_bufs[salt_pos].salt_buf_pc[6]; + s[7] = salt_bufs[salt_pos].salt_buf_pc[7]; + + const u32 r_00 = 0x80; + const u32 r_14 = 64 * 8; + + /** + * bin2asc table + */ + + l_bin2asc[lid] = c_bin2asc[(lid >> 0) & 15] << 8 + | c_bin2asc[(lid >> 4) & 15] << 0; + + __syncthreads (); + + if (gid >= gid_max) return; + + /** + * loop + */ + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + + w0[0] = pw_buf0[0]; + w0[1] = pw_buf0[1]; + w0[2] = pw_buf0[2]; + w0[3] = pw_buf0[3]; + + u32x w1[4]; + + w1[0] = pw_buf1[0]; + w1[1] = pw_buf1[1]; + w1[2] = pw_buf1[2]; + w1[3] = pw_buf1[3]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 out_len = apply_rules (c_rules[il_pos].cmds, w0, w1, pw_len); + + append_0x80_2 (w0, w1, out_len); + + w3[2] = out_len * 8; + + u32x a = MD5M_A; + u32x b = MD5M_B; + u32x c = MD5M_C; + u32x d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H , a, b, c, d, w1[1], MD5C20, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w2[0], MD5C21, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w2[3], MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w3[2], MD5C23, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w0[1], MD5C24, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w1[0], MD5C25, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w1[3], MD5C26, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w2[2], MD5C27, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w3[1], MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w0[0], MD5C29, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w0[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w1[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w2[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w3[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w3[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w0[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1[0], MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w2[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2[1], MD5C3f, MD5S33); + + a += MD5M_A; + b += MD5M_B; + c += MD5M_C; + d += MD5M_D; + + const u32 w0_t = s[0]; + const u32 w1_t = s[1]; + const u32 w2_t = s[2]; + const u32 w3_t = s[3]; + const u32 w4_t = s[4]; + const u32 w5_t = s[5]; + const u32 w6_t = s[6]; + const u32 w7_t = s[7]; + + const u32x w8_t = uint_to_hex_lower8 ((a >> 0) & 255) << 0 + | uint_to_hex_lower8 ((a >> 8) & 255) << 16; + const u32x w9_t = uint_to_hex_lower8 ((a >> 16) & 255) << 0 + | uint_to_hex_lower8 ((a >> 24) & 255) << 16; + const u32x wa_t = uint_to_hex_lower8 ((b >> 0) & 255) << 0 + | uint_to_hex_lower8 ((b >> 8) & 255) << 16; + const u32x wb_t = uint_to_hex_lower8 ((b >> 16) & 255) << 0 + | uint_to_hex_lower8 ((b >> 24) & 255) << 16; + const u32x wc_t = uint_to_hex_lower8 ((c >> 0) & 255) << 0 + | uint_to_hex_lower8 ((c >> 8) & 255) << 16; + const u32x wd_t = uint_to_hex_lower8 ((c >> 16) & 255) << 0 + | uint_to_hex_lower8 ((c >> 24) & 255) << 16; + const u32x we_t = uint_to_hex_lower8 ((d >> 0) & 255) << 0 + | uint_to_hex_lower8 ((d >> 8) & 255) << 16; + const u32x wf_t = uint_to_hex_lower8 ((d >> 16) & 255) << 0 + | uint_to_hex_lower8 ((d >> 24) & 255) << 16; + + a = MD5M_A; + b = MD5M_B; + c = MD5M_C; + d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t, MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t, MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t, MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t, MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w4_t, MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w5_t, MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w6_t, MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w7_t, MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w8_t, MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w9_t, MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, wa_t, MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, wb_t, MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, wc_t, MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, wd_t, MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, we_t, MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, wf_t, MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w1_t, MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w6_t, MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, wb_t, MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t, MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w5_t, MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, wa_t, MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, wf_t, MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w4_t, MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w9_t, MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, we_t, MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t, MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w8_t, MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, wd_t, MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t, MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w7_t, MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, wc_t, MD5C1f, MD5S13); + + MD5_STEP (MD5_H , a, b, c, d, w5_t, MD5C20, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w8_t, MD5C21, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, wb_t, MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, we_t, MD5C23, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w1_t, MD5C24, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w4_t, MD5C25, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w7_t, MD5C26, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, wa_t, MD5C27, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, wd_t, MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w0_t, MD5C29, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w3_t, MD5C2a, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w6_t, MD5C2b, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w9_t, MD5C2c, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, wc_t, MD5C2d, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, wf_t, MD5C2e, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w2_t, MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t, MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w7_t, MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, we_t, MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w5_t, MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, wc_t, MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t, MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, wa_t, MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t, MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w8_t, MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, wf_t, MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w6_t, MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, wd_t, MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w4_t, MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, wb_t, MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t, MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w9_t, MD5C3f, MD5S33); + + const u32x r_a = a + MD5M_A; + const u32x r_b = b + MD5M_B; + const u32x r_c = c + MD5M_C; + const u32x r_d = d + MD5M_D; + + a = r_a; + b = r_b; + c = r_c; + d = r_d; + + MD5_STEP (MD5_Fo, a, b, c, d, r_00, MD5C00, MD5S00); + MD5_STEP0(MD5_Fo, d, a, b, c, MD5C01, MD5S01); + MD5_STEP0(MD5_Fo, c, d, a, b, MD5C02, MD5S02); + MD5_STEP0(MD5_Fo, b, c, d, a, MD5C03, MD5S03); + MD5_STEP0(MD5_Fo, a, b, c, d, MD5C04, MD5S00); + MD5_STEP0(MD5_Fo, d, a, b, c, MD5C05, MD5S01); + MD5_STEP0(MD5_Fo, c, d, a, b, MD5C06, MD5S02); + MD5_STEP0(MD5_Fo, b, c, d, a, MD5C07, MD5S03); + MD5_STEP0(MD5_Fo, a, b, c, d, MD5C08, MD5S00); + MD5_STEP0(MD5_Fo, d, a, b, c, MD5C09, MD5S01); + MD5_STEP0(MD5_Fo, c, d, a, b, MD5C0a, MD5S02); + MD5_STEP0(MD5_Fo, b, c, d, a, MD5C0b, MD5S03); + MD5_STEP0(MD5_Fo, a, b, c, d, MD5C0c, MD5S00); + MD5_STEP0(MD5_Fo, d, a, b, c, MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, r_14, MD5C0e, MD5S02); + MD5_STEP0(MD5_Fo, b, c, d, a, MD5C0f, MD5S03); + + MD5_STEP0(MD5_Go, a, b, c, d, MD5C10, MD5S10); + MD5_STEP0(MD5_Go, d, a, b, c, MD5C11, MD5S11); + MD5_STEP0(MD5_Go, c, d, a, b, MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, r_00, MD5C13, MD5S13); + MD5_STEP0(MD5_Go, a, b, c, d, MD5C14, MD5S10); + MD5_STEP0(MD5_Go, d, a, b, c, MD5C15, MD5S11); + MD5_STEP0(MD5_Go, c, d, a, b, MD5C16, MD5S12); + MD5_STEP0(MD5_Go, b, c, d, a, MD5C17, MD5S13); + MD5_STEP0(MD5_Go, a, b, c, d, MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, r_14, MD5C19, MD5S11); + MD5_STEP0(MD5_Go, c, d, a, b, MD5C1a, MD5S12); + MD5_STEP0(MD5_Go, b, c, d, a, MD5C1b, MD5S13); + MD5_STEP0(MD5_Go, a, b, c, d, MD5C1c, MD5S10); + MD5_STEP0(MD5_Go, d, a, b, c, MD5C1d, MD5S11); + MD5_STEP0(MD5_Go, c, d, a, b, MD5C1e, MD5S12); + MD5_STEP0(MD5_Go, b, c, d, a, MD5C1f, MD5S13); + + MD5_STEP0(MD5_H , a, b, c, d, MD5C20, MD5S20); + MD5_STEP0(MD5_H , d, a, b, c, MD5C21, MD5S21); + MD5_STEP0(MD5_H , c, d, a, b, MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, r_14, MD5C23, MD5S23); + MD5_STEP0(MD5_H , a, b, c, d, MD5C24, MD5S20); + MD5_STEP0(MD5_H , d, a, b, c, MD5C25, MD5S21); + MD5_STEP0(MD5_H , c, d, a, b, MD5C26, MD5S22); + MD5_STEP0(MD5_H , b, c, d, a, MD5C27, MD5S23); + MD5_STEP0(MD5_H , a, b, c, d, MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, r_00, MD5C29, MD5S21); + MD5_STEP0(MD5_H , c, d, a, b, MD5C2a, MD5S22); + MD5_STEP0(MD5_H , b, c, d, a, MD5C2b, MD5S23); + MD5_STEP0(MD5_H , a, b, c, d, MD5C2c, MD5S20); + MD5_STEP0(MD5_H , d, a, b, c, MD5C2d, MD5S21); + MD5_STEP0(MD5_H , c, d, a, b, MD5C2e, MD5S22); + MD5_STEP0(MD5_H , b, c, d, a, MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, r_00, MD5C30, MD5S30); + MD5_STEP0(MD5_I , d, a, b, c, MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, r_14, MD5C32, MD5S32); + MD5_STEP0(MD5_I , b, c, d, a, MD5C33, MD5S33); + MD5_STEP0(MD5_I , a, b, c, d, MD5C34, MD5S30); + MD5_STEP0(MD5_I , d, a, b, c, MD5C35, MD5S31); + MD5_STEP0(MD5_I , c, d, a, b, MD5C36, MD5S32); + MD5_STEP0(MD5_I , b, c, d, a, MD5C37, MD5S33); + MD5_STEP0(MD5_I , a, b, c, d, MD5C38, MD5S30); + MD5_STEP0(MD5_I , d, a, b, c, MD5C39, MD5S31); + MD5_STEP0(MD5_I , c, d, a, b, MD5C3a, MD5S32); + MD5_STEP0(MD5_I , b, c, d, a, MD5C3b, MD5S33); + MD5_STEP0(MD5_I , a, b, c, d, MD5C3c, MD5S30); + MD5_STEP0(MD5_I , d, a, b, c, MD5C3d, MD5S31); + MD5_STEP0(MD5_I , c, d, a, b, MD5C3e, MD5S32); + MD5_STEP0(MD5_I , b, c, d, a, MD5C3f, MD5S33); + + a += r_a; + b += r_b; + c += r_c; + d += r_d; + + const u32x r0 = a; + const u32x r1 = d; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_M + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m02810_m08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m02810_m16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m02810_s04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + u32x pw_buf1[4]; + + pw_buf1[0] = pws[gid].i[ 4]; + pw_buf1[1] = pws[gid].i[ 5]; + pw_buf1[2] = pws[gid].i[ 6]; + pw_buf1[3] = pws[gid].i[ 7]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * salt + */ + + u32 s[8]; + + s[0] = salt_bufs[salt_pos].salt_buf_pc[0]; + s[1] = salt_bufs[salt_pos].salt_buf_pc[1]; + s[2] = salt_bufs[salt_pos].salt_buf_pc[2]; + s[3] = salt_bufs[salt_pos].salt_buf_pc[3]; + s[4] = salt_bufs[salt_pos].salt_buf_pc[4]; + s[5] = salt_bufs[salt_pos].salt_buf_pc[5]; + s[6] = salt_bufs[salt_pos].salt_buf_pc[6]; + s[7] = salt_bufs[salt_pos].salt_buf_pc[7]; + + const u32 r_00 = 0x80; + const u32 r_14 = 64 * 8; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * bin2asc table + */ + + l_bin2asc[lid] = c_bin2asc[(lid >> 0) & 15] << 8 + | c_bin2asc[(lid >> 4) & 15] << 0; + + __syncthreads (); + + if (gid >= gid_max) return; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + + w0[0] = pw_buf0[0]; + w0[1] = pw_buf0[1]; + w0[2] = pw_buf0[2]; + w0[3] = pw_buf0[3]; + + u32x w1[4]; + + w1[0] = pw_buf1[0]; + w1[1] = pw_buf1[1]; + w1[2] = pw_buf1[2]; + w1[3] = pw_buf1[3]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 out_len = apply_rules (c_rules[il_pos].cmds, w0, w1, pw_len); + + append_0x80_2 (w0, w1, out_len); + + w3[2] = out_len * 8; + + u32x a = MD5M_A; + u32x b = MD5M_B; + u32x c = MD5M_C; + u32x d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H , a, b, c, d, w1[1], MD5C20, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w2[0], MD5C21, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w2[3], MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w3[2], MD5C23, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w0[1], MD5C24, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w1[0], MD5C25, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w1[3], MD5C26, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w2[2], MD5C27, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w3[1], MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w0[0], MD5C29, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w0[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w1[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w2[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w3[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w3[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w0[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1[0], MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w2[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2[1], MD5C3f, MD5S33); + + a += MD5M_A; + b += MD5M_B; + c += MD5M_C; + d += MD5M_D; + + const u32 w0_t = s[0]; + const u32 w1_t = s[1]; + const u32 w2_t = s[2]; + const u32 w3_t = s[3]; + const u32 w4_t = s[4]; + const u32 w5_t = s[5]; + const u32 w6_t = s[6]; + const u32 w7_t = s[7]; + + const u32x w8_t = uint_to_hex_lower8 ((a >> 0) & 255) << 0 + | uint_to_hex_lower8 ((a >> 8) & 255) << 16; + const u32x w9_t = uint_to_hex_lower8 ((a >> 16) & 255) << 0 + | uint_to_hex_lower8 ((a >> 24) & 255) << 16; + const u32x wa_t = uint_to_hex_lower8 ((b >> 0) & 255) << 0 + | uint_to_hex_lower8 ((b >> 8) & 255) << 16; + const u32x wb_t = uint_to_hex_lower8 ((b >> 16) & 255) << 0 + | uint_to_hex_lower8 ((b >> 24) & 255) << 16; + const u32x wc_t = uint_to_hex_lower8 ((c >> 0) & 255) << 0 + | uint_to_hex_lower8 ((c >> 8) & 255) << 16; + const u32x wd_t = uint_to_hex_lower8 ((c >> 16) & 255) << 0 + | uint_to_hex_lower8 ((c >> 24) & 255) << 16; + const u32x we_t = uint_to_hex_lower8 ((d >> 0) & 255) << 0 + | uint_to_hex_lower8 ((d >> 8) & 255) << 16; + const u32x wf_t = uint_to_hex_lower8 ((d >> 16) & 255) << 0 + | uint_to_hex_lower8 ((d >> 24) & 255) << 16; + + a = MD5M_A; + b = MD5M_B; + c = MD5M_C; + d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t, MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t, MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t, MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t, MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w4_t, MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w5_t, MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w6_t, MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w7_t, MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w8_t, MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w9_t, MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, wa_t, MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, wb_t, MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, wc_t, MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, wd_t, MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, we_t, MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, wf_t, MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w1_t, MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w6_t, MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, wb_t, MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t, MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w5_t, MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, wa_t, MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, wf_t, MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w4_t, MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w9_t, MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, we_t, MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t, MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w8_t, MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, wd_t, MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t, MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w7_t, MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, wc_t, MD5C1f, MD5S13); + + MD5_STEP (MD5_H , a, b, c, d, w5_t, MD5C20, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w8_t, MD5C21, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, wb_t, MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, we_t, MD5C23, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w1_t, MD5C24, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w4_t, MD5C25, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w7_t, MD5C26, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, wa_t, MD5C27, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, wd_t, MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w0_t, MD5C29, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w3_t, MD5C2a, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w6_t, MD5C2b, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w9_t, MD5C2c, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, wc_t, MD5C2d, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, wf_t, MD5C2e, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w2_t, MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t, MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w7_t, MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, we_t, MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w5_t, MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, wc_t, MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t, MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, wa_t, MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t, MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w8_t, MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, wf_t, MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w6_t, MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, wd_t, MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w4_t, MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, wb_t, MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t, MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w9_t, MD5C3f, MD5S33); + + const u32x r_a = a + MD5M_A; + const u32x r_b = b + MD5M_B; + const u32x r_c = c + MD5M_C; + const u32x r_d = d + MD5M_D; + + a = r_a; + b = r_b; + c = r_c; + d = r_d; + + MD5_STEP (MD5_Fo, a, b, c, d, r_00, MD5C00, MD5S00); + MD5_STEP0(MD5_Fo, d, a, b, c, MD5C01, MD5S01); + MD5_STEP0(MD5_Fo, c, d, a, b, MD5C02, MD5S02); + MD5_STEP0(MD5_Fo, b, c, d, a, MD5C03, MD5S03); + MD5_STEP0(MD5_Fo, a, b, c, d, MD5C04, MD5S00); + MD5_STEP0(MD5_Fo, d, a, b, c, MD5C05, MD5S01); + MD5_STEP0(MD5_Fo, c, d, a, b, MD5C06, MD5S02); + MD5_STEP0(MD5_Fo, b, c, d, a, MD5C07, MD5S03); + MD5_STEP0(MD5_Fo, a, b, c, d, MD5C08, MD5S00); + MD5_STEP0(MD5_Fo, d, a, b, c, MD5C09, MD5S01); + MD5_STEP0(MD5_Fo, c, d, a, b, MD5C0a, MD5S02); + MD5_STEP0(MD5_Fo, b, c, d, a, MD5C0b, MD5S03); + MD5_STEP0(MD5_Fo, a, b, c, d, MD5C0c, MD5S00); + MD5_STEP0(MD5_Fo, d, a, b, c, MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, r_14, MD5C0e, MD5S02); + MD5_STEP0(MD5_Fo, b, c, d, a, MD5C0f, MD5S03); + + MD5_STEP0(MD5_Go, a, b, c, d, MD5C10, MD5S10); + MD5_STEP0(MD5_Go, d, a, b, c, MD5C11, MD5S11); + MD5_STEP0(MD5_Go, c, d, a, b, MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, r_00, MD5C13, MD5S13); + MD5_STEP0(MD5_Go, a, b, c, d, MD5C14, MD5S10); + MD5_STEP0(MD5_Go, d, a, b, c, MD5C15, MD5S11); + MD5_STEP0(MD5_Go, c, d, a, b, MD5C16, MD5S12); + MD5_STEP0(MD5_Go, b, c, d, a, MD5C17, MD5S13); + MD5_STEP0(MD5_Go, a, b, c, d, MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, r_14, MD5C19, MD5S11); + MD5_STEP0(MD5_Go, c, d, a, b, MD5C1a, MD5S12); + MD5_STEP0(MD5_Go, b, c, d, a, MD5C1b, MD5S13); + MD5_STEP0(MD5_Go, a, b, c, d, MD5C1c, MD5S10); + MD5_STEP0(MD5_Go, d, a, b, c, MD5C1d, MD5S11); + MD5_STEP0(MD5_Go, c, d, a, b, MD5C1e, MD5S12); + MD5_STEP0(MD5_Go, b, c, d, a, MD5C1f, MD5S13); + + MD5_STEP0(MD5_H , a, b, c, d, MD5C20, MD5S20); + MD5_STEP0(MD5_H , d, a, b, c, MD5C21, MD5S21); + MD5_STEP0(MD5_H , c, d, a, b, MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, r_14, MD5C23, MD5S23); + MD5_STEP0(MD5_H , a, b, c, d, MD5C24, MD5S20); + MD5_STEP0(MD5_H , d, a, b, c, MD5C25, MD5S21); + MD5_STEP0(MD5_H , c, d, a, b, MD5C26, MD5S22); + MD5_STEP0(MD5_H , b, c, d, a, MD5C27, MD5S23); + MD5_STEP0(MD5_H , a, b, c, d, MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, r_00, MD5C29, MD5S21); + MD5_STEP0(MD5_H , c, d, a, b, MD5C2a, MD5S22); + MD5_STEP0(MD5_H , b, c, d, a, MD5C2b, MD5S23); + MD5_STEP0(MD5_H , a, b, c, d, MD5C2c, MD5S20); + MD5_STEP0(MD5_H , d, a, b, c, MD5C2d, MD5S21); + MD5_STEP0(MD5_H , c, d, a, b, MD5C2e, MD5S22); + MD5_STEP0(MD5_H , b, c, d, a, MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, r_00, MD5C30, MD5S30); + MD5_STEP0(MD5_I , d, a, b, c, MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, r_14, MD5C32, MD5S32); + MD5_STEP0(MD5_I , b, c, d, a, MD5C33, MD5S33); + MD5_STEP0(MD5_I , a, b, c, d, MD5C34, MD5S30); + MD5_STEP0(MD5_I , d, a, b, c, MD5C35, MD5S31); + MD5_STEP0(MD5_I , c, d, a, b, MD5C36, MD5S32); + MD5_STEP0(MD5_I , b, c, d, a, MD5C37, MD5S33); + MD5_STEP0(MD5_I , a, b, c, d, MD5C38, MD5S30); + MD5_STEP0(MD5_I , d, a, b, c, MD5C39, MD5S31); + MD5_STEP0(MD5_I , c, d, a, b, MD5C3a, MD5S32); + MD5_STEP0(MD5_I , b, c, d, a, MD5C3b, MD5S33); + MD5_STEP0(MD5_I , a, b, c, d, MD5C3c, MD5S30); + + if ((a + r_a) != search[0]) continue; + + MD5_STEP0(MD5_I , d, a, b, c, MD5C3d, MD5S31); + MD5_STEP0(MD5_I , c, d, a, b, MD5C3e, MD5S32); + MD5_STEP0(MD5_I , b, c, d, a, MD5C3f, MD5S33); + + a += r_a; + b += r_b; + c += r_c; + d += r_d; + + const u32x r0 = a; + const u32x r1 = d; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_S + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m02810_s08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m02810_s16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/nv/m02810_a1.cu b/nv/m02810_a1.cu new file mode 100644 index 0000000000..fe4767e871 --- /dev/null +++ b/nv/m02810_a1.cu @@ -0,0 +1,930 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _MD5_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW2 +#define VECT_SIZE4 +#endif + +#define DGST_R0 0 +#define DGST_R1 3 +#define DGST_R2 2 +#define DGST_R3 1 + +#include "include/kernel_functions.c" +#include "types_nv.c" +#include "common_nv.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +__device__ __constant__ comb_t c_combs[1024]; + +#ifdef VECT_SIZE1 +#define uint_to_hex_lower8(i) l_bin2asc[(i)] +#endif + +#ifdef VECT_SIZE2 +#define uint_to_hex_lower8(i) u32x (l_bin2asc[(i).x], l_bin2asc[(i).y]) +#endif + +#ifdef VECT_SIZE4 +#define uint_to_hex_lower8(i) u32x (l_bin2asc[(i).x], l_bin2asc[(i).y], l_bin2asc[(i).z], l_bin2asc[(i).w]) +#endif + +__device__ __constant__ char c_bin2asc[16] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' }; + +__device__ __shared__ short l_bin2asc[256]; + +extern "C" __global__ void __launch_bounds__ (256, 1) m02810_m04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + append_0x80_2 (wordl0, wordl1, pw_l_len); + + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, c_combs[0].pw_len); + } + + /** + * salt + */ + + u32 s[8]; + + s[0] = salt_bufs[salt_pos].salt_buf_pc[0]; + s[1] = salt_bufs[salt_pos].salt_buf_pc[1]; + s[2] = salt_bufs[salt_pos].salt_buf_pc[2]; + s[3] = salt_bufs[salt_pos].salt_buf_pc[3]; + s[4] = salt_bufs[salt_pos].salt_buf_pc[4]; + s[5] = salt_bufs[salt_pos].salt_buf_pc[5]; + s[6] = salt_bufs[salt_pos].salt_buf_pc[6]; + s[7] = salt_bufs[salt_pos].salt_buf_pc[7]; + + const u32 r_00 = 0x80; + const u32 r_14 = 64 * 8; + + /** + * bin2asc table + */ + + l_bin2asc[lid] = c_bin2asc[(lid >> 0) & 15] << 8 + | c_bin2asc[(lid >> 4) & 15] << 0; + + __syncthreads (); + + if (gid >= gid_max) return; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = c_combs[il_pos].pw_len; + + const u32 pw_len = pw_l_len + pw_r_len; + + u32 wordr0[4]; + + wordr0[0] = c_combs[il_pos].i[0]; + wordr0[1] = c_combs[il_pos].i[1]; + wordr0[2] = c_combs[il_pos].i[2]; + wordr0[3] = c_combs[il_pos].i[3]; + + u32 wordr1[4]; + + wordr1[0] = c_combs[il_pos].i[4]; + wordr1[1] = c_combs[il_pos].i[5]; + wordr1[2] = c_combs[il_pos].i[6]; + wordr1[3] = c_combs[il_pos].i[7]; + + u32 wordr2[4]; + + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + + u32 wordr3[4]; + + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + u32x w0[4]; + + w0[0] = wordl0[0] | wordr0[0]; + w0[1] = wordl0[1] | wordr0[1]; + w0[2] = wordl0[2] | wordr0[2]; + w0[3] = wordl0[3] | wordr0[3]; + + u32x w1[4]; + + w1[0] = wordl1[0] | wordr1[0]; + w1[1] = wordl1[1] | wordr1[1]; + w1[2] = wordl1[2] | wordr1[2]; + w1[3] = wordl1[3] | wordr1[3]; + + u32x w2[4]; + + w2[0] = wordl2[0] | wordr2[0]; + w2[1] = wordl2[1] | wordr2[1]; + w2[2] = wordl2[2] | wordr2[2]; + w2[3] = wordl2[3] | wordr2[3]; + + u32x w3[4]; + + w3[0] = wordl3[0] | wordr3[0]; + w3[1] = wordl3[1] | wordr3[1]; + w3[2] = pw_len * 8; + w3[3] = 0; + + u32x a = MD5M_A; + u32x b = MD5M_B; + u32x c = MD5M_C; + u32x d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H , a, b, c, d, w1[1], MD5C20, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w2[0], MD5C21, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w2[3], MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w3[2], MD5C23, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w0[1], MD5C24, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w1[0], MD5C25, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w1[3], MD5C26, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w2[2], MD5C27, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w3[1], MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w0[0], MD5C29, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w0[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w1[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w2[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w3[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w3[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w0[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1[0], MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w2[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2[1], MD5C3f, MD5S33); + + a += MD5M_A; + b += MD5M_B; + c += MD5M_C; + d += MD5M_D; + + const u32 w0_t = s[0]; + const u32 w1_t = s[1]; + const u32 w2_t = s[2]; + const u32 w3_t = s[3]; + const u32 w4_t = s[4]; + const u32 w5_t = s[5]; + const u32 w6_t = s[6]; + const u32 w7_t = s[7]; + + const u32x w8_t = uint_to_hex_lower8 ((a >> 0) & 255) << 0 + | uint_to_hex_lower8 ((a >> 8) & 255) << 16; + const u32x w9_t = uint_to_hex_lower8 ((a >> 16) & 255) << 0 + | uint_to_hex_lower8 ((a >> 24) & 255) << 16; + const u32x wa_t = uint_to_hex_lower8 ((b >> 0) & 255) << 0 + | uint_to_hex_lower8 ((b >> 8) & 255) << 16; + const u32x wb_t = uint_to_hex_lower8 ((b >> 16) & 255) << 0 + | uint_to_hex_lower8 ((b >> 24) & 255) << 16; + const u32x wc_t = uint_to_hex_lower8 ((c >> 0) & 255) << 0 + | uint_to_hex_lower8 ((c >> 8) & 255) << 16; + const u32x wd_t = uint_to_hex_lower8 ((c >> 16) & 255) << 0 + | uint_to_hex_lower8 ((c >> 24) & 255) << 16; + const u32x we_t = uint_to_hex_lower8 ((d >> 0) & 255) << 0 + | uint_to_hex_lower8 ((d >> 8) & 255) << 16; + const u32x wf_t = uint_to_hex_lower8 ((d >> 16) & 255) << 0 + | uint_to_hex_lower8 ((d >> 24) & 255) << 16; + + a = MD5M_A; + b = MD5M_B; + c = MD5M_C; + d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t, MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t, MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t, MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t, MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w4_t, MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w5_t, MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w6_t, MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w7_t, MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w8_t, MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w9_t, MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, wa_t, MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, wb_t, MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, wc_t, MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, wd_t, MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, we_t, MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, wf_t, MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w1_t, MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w6_t, MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, wb_t, MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t, MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w5_t, MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, wa_t, MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, wf_t, MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w4_t, MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w9_t, MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, we_t, MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t, MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w8_t, MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, wd_t, MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t, MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w7_t, MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, wc_t, MD5C1f, MD5S13); + + MD5_STEP (MD5_H , a, b, c, d, w5_t, MD5C20, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w8_t, MD5C21, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, wb_t, MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, we_t, MD5C23, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w1_t, MD5C24, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w4_t, MD5C25, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w7_t, MD5C26, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, wa_t, MD5C27, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, wd_t, MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w0_t, MD5C29, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w3_t, MD5C2a, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w6_t, MD5C2b, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w9_t, MD5C2c, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, wc_t, MD5C2d, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, wf_t, MD5C2e, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w2_t, MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t, MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w7_t, MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, we_t, MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w5_t, MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, wc_t, MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t, MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, wa_t, MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t, MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w8_t, MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, wf_t, MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w6_t, MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, wd_t, MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w4_t, MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, wb_t, MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t, MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w9_t, MD5C3f, MD5S33); + + const u32x r_a = a + MD5M_A; + const u32x r_b = b + MD5M_B; + const u32x r_c = c + MD5M_C; + const u32x r_d = d + MD5M_D; + + a = r_a; + b = r_b; + c = r_c; + d = r_d; + + MD5_STEP (MD5_Fo, a, b, c, d, r_00, MD5C00, MD5S00); + MD5_STEP0(MD5_Fo, d, a, b, c, MD5C01, MD5S01); + MD5_STEP0(MD5_Fo, c, d, a, b, MD5C02, MD5S02); + MD5_STEP0(MD5_Fo, b, c, d, a, MD5C03, MD5S03); + MD5_STEP0(MD5_Fo, a, b, c, d, MD5C04, MD5S00); + MD5_STEP0(MD5_Fo, d, a, b, c, MD5C05, MD5S01); + MD5_STEP0(MD5_Fo, c, d, a, b, MD5C06, MD5S02); + MD5_STEP0(MD5_Fo, b, c, d, a, MD5C07, MD5S03); + MD5_STEP0(MD5_Fo, a, b, c, d, MD5C08, MD5S00); + MD5_STEP0(MD5_Fo, d, a, b, c, MD5C09, MD5S01); + MD5_STEP0(MD5_Fo, c, d, a, b, MD5C0a, MD5S02); + MD5_STEP0(MD5_Fo, b, c, d, a, MD5C0b, MD5S03); + MD5_STEP0(MD5_Fo, a, b, c, d, MD5C0c, MD5S00); + MD5_STEP0(MD5_Fo, d, a, b, c, MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, r_14, MD5C0e, MD5S02); + MD5_STEP0(MD5_Fo, b, c, d, a, MD5C0f, MD5S03); + + MD5_STEP0(MD5_Go, a, b, c, d, MD5C10, MD5S10); + MD5_STEP0(MD5_Go, d, a, b, c, MD5C11, MD5S11); + MD5_STEP0(MD5_Go, c, d, a, b, MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, r_00, MD5C13, MD5S13); + MD5_STEP0(MD5_Go, a, b, c, d, MD5C14, MD5S10); + MD5_STEP0(MD5_Go, d, a, b, c, MD5C15, MD5S11); + MD5_STEP0(MD5_Go, c, d, a, b, MD5C16, MD5S12); + MD5_STEP0(MD5_Go, b, c, d, a, MD5C17, MD5S13); + MD5_STEP0(MD5_Go, a, b, c, d, MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, r_14, MD5C19, MD5S11); + MD5_STEP0(MD5_Go, c, d, a, b, MD5C1a, MD5S12); + MD5_STEP0(MD5_Go, b, c, d, a, MD5C1b, MD5S13); + MD5_STEP0(MD5_Go, a, b, c, d, MD5C1c, MD5S10); + MD5_STEP0(MD5_Go, d, a, b, c, MD5C1d, MD5S11); + MD5_STEP0(MD5_Go, c, d, a, b, MD5C1e, MD5S12); + MD5_STEP0(MD5_Go, b, c, d, a, MD5C1f, MD5S13); + + MD5_STEP0(MD5_H , a, b, c, d, MD5C20, MD5S20); + MD5_STEP0(MD5_H , d, a, b, c, MD5C21, MD5S21); + MD5_STEP0(MD5_H , c, d, a, b, MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, r_14, MD5C23, MD5S23); + MD5_STEP0(MD5_H , a, b, c, d, MD5C24, MD5S20); + MD5_STEP0(MD5_H , d, a, b, c, MD5C25, MD5S21); + MD5_STEP0(MD5_H , c, d, a, b, MD5C26, MD5S22); + MD5_STEP0(MD5_H , b, c, d, a, MD5C27, MD5S23); + MD5_STEP0(MD5_H , a, b, c, d, MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, r_00, MD5C29, MD5S21); + MD5_STEP0(MD5_H , c, d, a, b, MD5C2a, MD5S22); + MD5_STEP0(MD5_H , b, c, d, a, MD5C2b, MD5S23); + MD5_STEP0(MD5_H , a, b, c, d, MD5C2c, MD5S20); + MD5_STEP0(MD5_H , d, a, b, c, MD5C2d, MD5S21); + MD5_STEP0(MD5_H , c, d, a, b, MD5C2e, MD5S22); + MD5_STEP0(MD5_H , b, c, d, a, MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, r_00, MD5C30, MD5S30); + MD5_STEP0(MD5_I , d, a, b, c, MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, r_14, MD5C32, MD5S32); + MD5_STEP0(MD5_I , b, c, d, a, MD5C33, MD5S33); + MD5_STEP0(MD5_I , a, b, c, d, MD5C34, MD5S30); + MD5_STEP0(MD5_I , d, a, b, c, MD5C35, MD5S31); + MD5_STEP0(MD5_I , c, d, a, b, MD5C36, MD5S32); + MD5_STEP0(MD5_I , b, c, d, a, MD5C37, MD5S33); + MD5_STEP0(MD5_I , a, b, c, d, MD5C38, MD5S30); + MD5_STEP0(MD5_I , d, a, b, c, MD5C39, MD5S31); + MD5_STEP0(MD5_I , c, d, a, b, MD5C3a, MD5S32); + MD5_STEP0(MD5_I , b, c, d, a, MD5C3b, MD5S33); + MD5_STEP0(MD5_I , a, b, c, d, MD5C3c, MD5S30); + MD5_STEP0(MD5_I , d, a, b, c, MD5C3d, MD5S31); + MD5_STEP0(MD5_I , c, d, a, b, MD5C3e, MD5S32); + MD5_STEP0(MD5_I , b, c, d, a, MD5C3f, MD5S33); + + a += r_a; + b += r_b; + c += r_c; + d += r_d; + + const u32x r0 = a; + const u32x r1 = d; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_M + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m02810_m08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m02810_m16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m02810_s04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + append_0x80_2 (wordl0, wordl1, pw_l_len); + + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, c_combs[0].pw_len); + } + + /** + * salt + */ + + u32 s[8]; + + s[0] = salt_bufs[salt_pos].salt_buf_pc[0]; + s[1] = salt_bufs[salt_pos].salt_buf_pc[1]; + s[2] = salt_bufs[salt_pos].salt_buf_pc[2]; + s[3] = salt_bufs[salt_pos].salt_buf_pc[3]; + s[4] = salt_bufs[salt_pos].salt_buf_pc[4]; + s[5] = salt_bufs[salt_pos].salt_buf_pc[5]; + s[6] = salt_bufs[salt_pos].salt_buf_pc[6]; + s[7] = salt_bufs[salt_pos].salt_buf_pc[7]; + + const u32 r_00 = 0x80; + const u32 r_14 = 64 * 8; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * bin2asc table + */ + + l_bin2asc[lid] = c_bin2asc[(lid >> 0) & 15] << 8 + | c_bin2asc[(lid >> 4) & 15] << 0; + + __syncthreads (); + + if (gid >= gid_max) return; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = c_combs[il_pos].pw_len; + + const u32 pw_len = pw_l_len + pw_r_len; + + u32 wordr0[4]; + + wordr0[0] = c_combs[il_pos].i[0]; + wordr0[1] = c_combs[il_pos].i[1]; + wordr0[2] = c_combs[il_pos].i[2]; + wordr0[3] = c_combs[il_pos].i[3]; + + u32 wordr1[4]; + + wordr1[0] = c_combs[il_pos].i[4]; + wordr1[1] = c_combs[il_pos].i[5]; + wordr1[2] = c_combs[il_pos].i[6]; + wordr1[3] = c_combs[il_pos].i[7]; + + u32 wordr2[4]; + + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + + u32 wordr3[4]; + + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + u32x w0[4]; + + w0[0] = wordl0[0] | wordr0[0]; + w0[1] = wordl0[1] | wordr0[1]; + w0[2] = wordl0[2] | wordr0[2]; + w0[3] = wordl0[3] | wordr0[3]; + + u32x w1[4]; + + w1[0] = wordl1[0] | wordr1[0]; + w1[1] = wordl1[1] | wordr1[1]; + w1[2] = wordl1[2] | wordr1[2]; + w1[3] = wordl1[3] | wordr1[3]; + + u32x w2[4]; + + w2[0] = wordl2[0] | wordr2[0]; + w2[1] = wordl2[1] | wordr2[1]; + w2[2] = wordl2[2] | wordr2[2]; + w2[3] = wordl2[3] | wordr2[3]; + + u32x w3[4]; + + w3[0] = wordl3[0] | wordr3[0]; + w3[1] = wordl3[1] | wordr3[1]; + w3[2] = pw_len * 8; + w3[3] = 0; + + u32x a = MD5M_A; + u32x b = MD5M_B; + u32x c = MD5M_C; + u32x d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H , a, b, c, d, w1[1], MD5C20, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w2[0], MD5C21, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w2[3], MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w3[2], MD5C23, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w0[1], MD5C24, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w1[0], MD5C25, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w1[3], MD5C26, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w2[2], MD5C27, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w3[1], MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w0[0], MD5C29, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w0[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w1[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w2[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w3[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w3[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w0[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1[0], MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w2[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2[1], MD5C3f, MD5S33); + + a += MD5M_A; + b += MD5M_B; + c += MD5M_C; + d += MD5M_D; + + const u32 w0_t = s[0]; + const u32 w1_t = s[1]; + const u32 w2_t = s[2]; + const u32 w3_t = s[3]; + const u32 w4_t = s[4]; + const u32 w5_t = s[5]; + const u32 w6_t = s[6]; + const u32 w7_t = s[7]; + + const u32x w8_t = uint_to_hex_lower8 ((a >> 0) & 255) << 0 + | uint_to_hex_lower8 ((a >> 8) & 255) << 16; + const u32x w9_t = uint_to_hex_lower8 ((a >> 16) & 255) << 0 + | uint_to_hex_lower8 ((a >> 24) & 255) << 16; + const u32x wa_t = uint_to_hex_lower8 ((b >> 0) & 255) << 0 + | uint_to_hex_lower8 ((b >> 8) & 255) << 16; + const u32x wb_t = uint_to_hex_lower8 ((b >> 16) & 255) << 0 + | uint_to_hex_lower8 ((b >> 24) & 255) << 16; + const u32x wc_t = uint_to_hex_lower8 ((c >> 0) & 255) << 0 + | uint_to_hex_lower8 ((c >> 8) & 255) << 16; + const u32x wd_t = uint_to_hex_lower8 ((c >> 16) & 255) << 0 + | uint_to_hex_lower8 ((c >> 24) & 255) << 16; + const u32x we_t = uint_to_hex_lower8 ((d >> 0) & 255) << 0 + | uint_to_hex_lower8 ((d >> 8) & 255) << 16; + const u32x wf_t = uint_to_hex_lower8 ((d >> 16) & 255) << 0 + | uint_to_hex_lower8 ((d >> 24) & 255) << 16; + + a = MD5M_A; + b = MD5M_B; + c = MD5M_C; + d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t, MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t, MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t, MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t, MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w4_t, MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w5_t, MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w6_t, MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w7_t, MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w8_t, MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w9_t, MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, wa_t, MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, wb_t, MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, wc_t, MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, wd_t, MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, we_t, MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, wf_t, MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w1_t, MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w6_t, MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, wb_t, MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t, MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w5_t, MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, wa_t, MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, wf_t, MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w4_t, MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w9_t, MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, we_t, MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t, MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w8_t, MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, wd_t, MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t, MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w7_t, MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, wc_t, MD5C1f, MD5S13); + + MD5_STEP (MD5_H , a, b, c, d, w5_t, MD5C20, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w8_t, MD5C21, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, wb_t, MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, we_t, MD5C23, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w1_t, MD5C24, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w4_t, MD5C25, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w7_t, MD5C26, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, wa_t, MD5C27, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, wd_t, MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w0_t, MD5C29, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w3_t, MD5C2a, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w6_t, MD5C2b, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w9_t, MD5C2c, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, wc_t, MD5C2d, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, wf_t, MD5C2e, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w2_t, MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t, MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w7_t, MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, we_t, MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w5_t, MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, wc_t, MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t, MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, wa_t, MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t, MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w8_t, MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, wf_t, MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w6_t, MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, wd_t, MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w4_t, MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, wb_t, MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t, MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w9_t, MD5C3f, MD5S33); + + const u32x r_a = a + MD5M_A; + const u32x r_b = b + MD5M_B; + const u32x r_c = c + MD5M_C; + const u32x r_d = d + MD5M_D; + + a = r_a; + b = r_b; + c = r_c; + d = r_d; + + MD5_STEP (MD5_Fo, a, b, c, d, r_00, MD5C00, MD5S00); + MD5_STEP0(MD5_Fo, d, a, b, c, MD5C01, MD5S01); + MD5_STEP0(MD5_Fo, c, d, a, b, MD5C02, MD5S02); + MD5_STEP0(MD5_Fo, b, c, d, a, MD5C03, MD5S03); + MD5_STEP0(MD5_Fo, a, b, c, d, MD5C04, MD5S00); + MD5_STEP0(MD5_Fo, d, a, b, c, MD5C05, MD5S01); + MD5_STEP0(MD5_Fo, c, d, a, b, MD5C06, MD5S02); + MD5_STEP0(MD5_Fo, b, c, d, a, MD5C07, MD5S03); + MD5_STEP0(MD5_Fo, a, b, c, d, MD5C08, MD5S00); + MD5_STEP0(MD5_Fo, d, a, b, c, MD5C09, MD5S01); + MD5_STEP0(MD5_Fo, c, d, a, b, MD5C0a, MD5S02); + MD5_STEP0(MD5_Fo, b, c, d, a, MD5C0b, MD5S03); + MD5_STEP0(MD5_Fo, a, b, c, d, MD5C0c, MD5S00); + MD5_STEP0(MD5_Fo, d, a, b, c, MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, r_14, MD5C0e, MD5S02); + MD5_STEP0(MD5_Fo, b, c, d, a, MD5C0f, MD5S03); + + MD5_STEP0(MD5_Go, a, b, c, d, MD5C10, MD5S10); + MD5_STEP0(MD5_Go, d, a, b, c, MD5C11, MD5S11); + MD5_STEP0(MD5_Go, c, d, a, b, MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, r_00, MD5C13, MD5S13); + MD5_STEP0(MD5_Go, a, b, c, d, MD5C14, MD5S10); + MD5_STEP0(MD5_Go, d, a, b, c, MD5C15, MD5S11); + MD5_STEP0(MD5_Go, c, d, a, b, MD5C16, MD5S12); + MD5_STEP0(MD5_Go, b, c, d, a, MD5C17, MD5S13); + MD5_STEP0(MD5_Go, a, b, c, d, MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, r_14, MD5C19, MD5S11); + MD5_STEP0(MD5_Go, c, d, a, b, MD5C1a, MD5S12); + MD5_STEP0(MD5_Go, b, c, d, a, MD5C1b, MD5S13); + MD5_STEP0(MD5_Go, a, b, c, d, MD5C1c, MD5S10); + MD5_STEP0(MD5_Go, d, a, b, c, MD5C1d, MD5S11); + MD5_STEP0(MD5_Go, c, d, a, b, MD5C1e, MD5S12); + MD5_STEP0(MD5_Go, b, c, d, a, MD5C1f, MD5S13); + + MD5_STEP0(MD5_H , a, b, c, d, MD5C20, MD5S20); + MD5_STEP0(MD5_H , d, a, b, c, MD5C21, MD5S21); + MD5_STEP0(MD5_H , c, d, a, b, MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, r_14, MD5C23, MD5S23); + MD5_STEP0(MD5_H , a, b, c, d, MD5C24, MD5S20); + MD5_STEP0(MD5_H , d, a, b, c, MD5C25, MD5S21); + MD5_STEP0(MD5_H , c, d, a, b, MD5C26, MD5S22); + MD5_STEP0(MD5_H , b, c, d, a, MD5C27, MD5S23); + MD5_STEP0(MD5_H , a, b, c, d, MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, r_00, MD5C29, MD5S21); + MD5_STEP0(MD5_H , c, d, a, b, MD5C2a, MD5S22); + MD5_STEP0(MD5_H , b, c, d, a, MD5C2b, MD5S23); + MD5_STEP0(MD5_H , a, b, c, d, MD5C2c, MD5S20); + MD5_STEP0(MD5_H , d, a, b, c, MD5C2d, MD5S21); + MD5_STEP0(MD5_H , c, d, a, b, MD5C2e, MD5S22); + MD5_STEP0(MD5_H , b, c, d, a, MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, r_00, MD5C30, MD5S30); + MD5_STEP0(MD5_I , d, a, b, c, MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, r_14, MD5C32, MD5S32); + MD5_STEP0(MD5_I , b, c, d, a, MD5C33, MD5S33); + MD5_STEP0(MD5_I , a, b, c, d, MD5C34, MD5S30); + MD5_STEP0(MD5_I , d, a, b, c, MD5C35, MD5S31); + MD5_STEP0(MD5_I , c, d, a, b, MD5C36, MD5S32); + MD5_STEP0(MD5_I , b, c, d, a, MD5C37, MD5S33); + MD5_STEP0(MD5_I , a, b, c, d, MD5C38, MD5S30); + MD5_STEP0(MD5_I , d, a, b, c, MD5C39, MD5S31); + MD5_STEP0(MD5_I , c, d, a, b, MD5C3a, MD5S32); + MD5_STEP0(MD5_I , b, c, d, a, MD5C3b, MD5S33); + MD5_STEP0(MD5_I , a, b, c, d, MD5C3c, MD5S30); + + if ((a + r_a) != search[0]) continue; + + MD5_STEP0(MD5_I , d, a, b, c, MD5C3d, MD5S31); + MD5_STEP0(MD5_I , c, d, a, b, MD5C3e, MD5S32); + MD5_STEP0(MD5_I , b, c, d, a, MD5C3f, MD5S33); + + a += r_a; + b += r_b; + c += r_c; + d += r_d; + + const u32x r0 = a; + const u32x r1 = d; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_S + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m02810_s08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m02810_s16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/nv/m02810_a3.cu b/nv/m02810_a3.cu new file mode 100644 index 0000000000..4f84ce678a --- /dev/null +++ b/nv/m02810_a3.cu @@ -0,0 +1,1032 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _MD5_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW2 +#define VECT_SIZE4 +#endif + +#define DGST_R0 0 +#define DGST_R1 3 +#define DGST_R2 2 +#define DGST_R3 1 + +#include "include/kernel_functions.c" +#include "types_nv.c" +#include "common_nv.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +__device__ __constant__ bf_t c_bfs[1024]; + +#ifdef VECT_SIZE1 +#define uint_to_hex_lower8(i) l_bin2asc[(i)] +#endif + +#ifdef VECT_SIZE2 +#define uint_to_hex_lower8(i) u32x (l_bin2asc[(i).x], l_bin2asc[(i).y]) +#endif + +#ifdef VECT_SIZE4 +#define uint_to_hex_lower8(i) u32x (l_bin2asc[(i).x], l_bin2asc[(i).y], l_bin2asc[(i).z], l_bin2asc[(i).w]) +#endif + +__device__ __constant__ char c_bin2asc[16] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' }; + +__device__ __shared__ short l_bin2asc[256]; + +__device__ static void m02810m (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], const u32 pw_len, const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset) +{ + /** + * modifier + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + const u32 lid = threadIdx.x; + + /** + * salt + */ + + u32 s[8]; + + s[0] = salt_bufs[salt_pos].salt_buf_pc[0]; + s[1] = salt_bufs[salt_pos].salt_buf_pc[1]; + s[2] = salt_bufs[salt_pos].salt_buf_pc[2]; + s[3] = salt_bufs[salt_pos].salt_buf_pc[3]; + s[4] = salt_bufs[salt_pos].salt_buf_pc[4]; + s[5] = salt_bufs[salt_pos].salt_buf_pc[5]; + s[6] = salt_bufs[salt_pos].salt_buf_pc[6]; + s[7] = salt_bufs[salt_pos].salt_buf_pc[7]; + + const u32 r_00 = 0x80; + const u32 r_14 = 64 * 8; + + /** + * loop + */ + + u32x w0l = w0[0]; + + for (u32 il_pos = 0; il_pos < bfs_cnt; il_pos++) + { + const u32 w0r = c_bfs[il_pos].i; + + w0[0] = w0l | w0r; + + u32x a = MD5M_A; + u32x b = MD5M_B; + u32x c = MD5M_C; + u32x d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H , a, b, c, d, w1[1], MD5C20, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w2[0], MD5C21, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w2[3], MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w3[2], MD5C23, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w0[1], MD5C24, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w1[0], MD5C25, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w1[3], MD5C26, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w2[2], MD5C27, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w3[1], MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w0[0], MD5C29, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w0[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w1[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w2[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w3[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w3[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w0[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1[0], MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w2[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2[1], MD5C3f, MD5S33); + + a += MD5M_A; + b += MD5M_B; + c += MD5M_C; + d += MD5M_D; + + const u32 w0_t = s[0]; + const u32 w1_t = s[1]; + const u32 w2_t = s[2]; + const u32 w3_t = s[3]; + const u32 w4_t = s[4]; + const u32 w5_t = s[5]; + const u32 w6_t = s[6]; + const u32 w7_t = s[7]; + + const u32x w8_t = uint_to_hex_lower8 ((a >> 0) & 255) << 0 + | uint_to_hex_lower8 ((a >> 8) & 255) << 16; + const u32x w9_t = uint_to_hex_lower8 ((a >> 16) & 255) << 0 + | uint_to_hex_lower8 ((a >> 24) & 255) << 16; + const u32x wa_t = uint_to_hex_lower8 ((b >> 0) & 255) << 0 + | uint_to_hex_lower8 ((b >> 8) & 255) << 16; + const u32x wb_t = uint_to_hex_lower8 ((b >> 16) & 255) << 0 + | uint_to_hex_lower8 ((b >> 24) & 255) << 16; + const u32x wc_t = uint_to_hex_lower8 ((c >> 0) & 255) << 0 + | uint_to_hex_lower8 ((c >> 8) & 255) << 16; + const u32x wd_t = uint_to_hex_lower8 ((c >> 16) & 255) << 0 + | uint_to_hex_lower8 ((c >> 24) & 255) << 16; + const u32x we_t = uint_to_hex_lower8 ((d >> 0) & 255) << 0 + | uint_to_hex_lower8 ((d >> 8) & 255) << 16; + const u32x wf_t = uint_to_hex_lower8 ((d >> 16) & 255) << 0 + | uint_to_hex_lower8 ((d >> 24) & 255) << 16; + + a = MD5M_A; + b = MD5M_B; + c = MD5M_C; + d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t, MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t, MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t, MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t, MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w4_t, MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w5_t, MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w6_t, MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w7_t, MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w8_t, MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w9_t, MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, wa_t, MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, wb_t, MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, wc_t, MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, wd_t, MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, we_t, MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, wf_t, MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w1_t, MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w6_t, MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, wb_t, MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t, MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w5_t, MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, wa_t, MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, wf_t, MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w4_t, MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w9_t, MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, we_t, MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t, MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w8_t, MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, wd_t, MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t, MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w7_t, MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, wc_t, MD5C1f, MD5S13); + + MD5_STEP (MD5_H , a, b, c, d, w5_t, MD5C20, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w8_t, MD5C21, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, wb_t, MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, we_t, MD5C23, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w1_t, MD5C24, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w4_t, MD5C25, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w7_t, MD5C26, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, wa_t, MD5C27, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, wd_t, MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w0_t, MD5C29, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w3_t, MD5C2a, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w6_t, MD5C2b, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w9_t, MD5C2c, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, wc_t, MD5C2d, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, wf_t, MD5C2e, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w2_t, MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t, MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w7_t, MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, we_t, MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w5_t, MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, wc_t, MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t, MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, wa_t, MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t, MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w8_t, MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, wf_t, MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w6_t, MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, wd_t, MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w4_t, MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, wb_t, MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t, MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w9_t, MD5C3f, MD5S33); + + const u32x r_a = a + MD5M_A; + const u32x r_b = b + MD5M_B; + const u32x r_c = c + MD5M_C; + const u32x r_d = d + MD5M_D; + + a = r_a; + b = r_b; + c = r_c; + d = r_d; + + MD5_STEP (MD5_Fo, a, b, c, d, r_00, MD5C00, MD5S00); + MD5_STEP0(MD5_Fo, d, a, b, c, MD5C01, MD5S01); + MD5_STEP0(MD5_Fo, c, d, a, b, MD5C02, MD5S02); + MD5_STEP0(MD5_Fo, b, c, d, a, MD5C03, MD5S03); + MD5_STEP0(MD5_Fo, a, b, c, d, MD5C04, MD5S00); + MD5_STEP0(MD5_Fo, d, a, b, c, MD5C05, MD5S01); + MD5_STEP0(MD5_Fo, c, d, a, b, MD5C06, MD5S02); + MD5_STEP0(MD5_Fo, b, c, d, a, MD5C07, MD5S03); + MD5_STEP0(MD5_Fo, a, b, c, d, MD5C08, MD5S00); + MD5_STEP0(MD5_Fo, d, a, b, c, MD5C09, MD5S01); + MD5_STEP0(MD5_Fo, c, d, a, b, MD5C0a, MD5S02); + MD5_STEP0(MD5_Fo, b, c, d, a, MD5C0b, MD5S03); + MD5_STEP0(MD5_Fo, a, b, c, d, MD5C0c, MD5S00); + MD5_STEP0(MD5_Fo, d, a, b, c, MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, r_14, MD5C0e, MD5S02); + MD5_STEP0(MD5_Fo, b, c, d, a, MD5C0f, MD5S03); + + MD5_STEP0(MD5_Go, a, b, c, d, MD5C10, MD5S10); + MD5_STEP0(MD5_Go, d, a, b, c, MD5C11, MD5S11); + MD5_STEP0(MD5_Go, c, d, a, b, MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, r_00, MD5C13, MD5S13); + MD5_STEP0(MD5_Go, a, b, c, d, MD5C14, MD5S10); + MD5_STEP0(MD5_Go, d, a, b, c, MD5C15, MD5S11); + MD5_STEP0(MD5_Go, c, d, a, b, MD5C16, MD5S12); + MD5_STEP0(MD5_Go, b, c, d, a, MD5C17, MD5S13); + MD5_STEP0(MD5_Go, a, b, c, d, MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, r_14, MD5C19, MD5S11); + MD5_STEP0(MD5_Go, c, d, a, b, MD5C1a, MD5S12); + MD5_STEP0(MD5_Go, b, c, d, a, MD5C1b, MD5S13); + MD5_STEP0(MD5_Go, a, b, c, d, MD5C1c, MD5S10); + MD5_STEP0(MD5_Go, d, a, b, c, MD5C1d, MD5S11); + MD5_STEP0(MD5_Go, c, d, a, b, MD5C1e, MD5S12); + MD5_STEP0(MD5_Go, b, c, d, a, MD5C1f, MD5S13); + + MD5_STEP0(MD5_H , a, b, c, d, MD5C20, MD5S20); + MD5_STEP0(MD5_H , d, a, b, c, MD5C21, MD5S21); + MD5_STEP0(MD5_H , c, d, a, b, MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, r_14, MD5C23, MD5S23); + MD5_STEP0(MD5_H , a, b, c, d, MD5C24, MD5S20); + MD5_STEP0(MD5_H , d, a, b, c, MD5C25, MD5S21); + MD5_STEP0(MD5_H , c, d, a, b, MD5C26, MD5S22); + MD5_STEP0(MD5_H , b, c, d, a, MD5C27, MD5S23); + MD5_STEP0(MD5_H , a, b, c, d, MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, r_00, MD5C29, MD5S21); + MD5_STEP0(MD5_H , c, d, a, b, MD5C2a, MD5S22); + MD5_STEP0(MD5_H , b, c, d, a, MD5C2b, MD5S23); + MD5_STEP0(MD5_H , a, b, c, d, MD5C2c, MD5S20); + MD5_STEP0(MD5_H , d, a, b, c, MD5C2d, MD5S21); + MD5_STEP0(MD5_H , c, d, a, b, MD5C2e, MD5S22); + MD5_STEP0(MD5_H , b, c, d, a, MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, r_00, MD5C30, MD5S30); + MD5_STEP0(MD5_I , d, a, b, c, MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, r_14, MD5C32, MD5S32); + MD5_STEP0(MD5_I , b, c, d, a, MD5C33, MD5S33); + MD5_STEP0(MD5_I , a, b, c, d, MD5C34, MD5S30); + MD5_STEP0(MD5_I , d, a, b, c, MD5C35, MD5S31); + MD5_STEP0(MD5_I , c, d, a, b, MD5C36, MD5S32); + MD5_STEP0(MD5_I , b, c, d, a, MD5C37, MD5S33); + MD5_STEP0(MD5_I , a, b, c, d, MD5C38, MD5S30); + MD5_STEP0(MD5_I , d, a, b, c, MD5C39, MD5S31); + MD5_STEP0(MD5_I , c, d, a, b, MD5C3a, MD5S32); + MD5_STEP0(MD5_I , b, c, d, a, MD5C3b, MD5S33); + MD5_STEP0(MD5_I , a, b, c, d, MD5C3c, MD5S30); + MD5_STEP0(MD5_I , d, a, b, c, MD5C3d, MD5S31); + MD5_STEP0(MD5_I , c, d, a, b, MD5C3e, MD5S32); + MD5_STEP0(MD5_I , b, c, d, a, MD5C3f, MD5S33); + + a += r_a; + b += r_b; + c += r_c; + d += r_d; + + const u32x r0 = a; + const u32x r1 = d; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_M + } +} + +__device__ static void m02810s (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], const u32 pw_len, const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset) +{ + /** + * modifier + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + const u32 lid = threadIdx.x; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * salt + */ + + u32 s[8]; + + s[0] = salt_bufs[salt_pos].salt_buf_pc[0]; + s[1] = salt_bufs[salt_pos].salt_buf_pc[1]; + s[2] = salt_bufs[salt_pos].salt_buf_pc[2]; + s[3] = salt_bufs[salt_pos].salt_buf_pc[3]; + s[4] = salt_bufs[salt_pos].salt_buf_pc[4]; + s[5] = salt_bufs[salt_pos].salt_buf_pc[5]; + s[6] = salt_bufs[salt_pos].salt_buf_pc[6]; + s[7] = salt_bufs[salt_pos].salt_buf_pc[7]; + + const u32 r_00 = 0x80; + const u32 r_14 = 64 * 8; + + /** + * loop + */ + + u32x w0l = w0[0]; + + for (u32 il_pos = 0; il_pos < bfs_cnt; il_pos++) + { + const u32 w0r = c_bfs[il_pos].i; + + w0[0] = w0l | w0r; + + u32x a = MD5M_A; + u32x b = MD5M_B; + u32x c = MD5M_C; + u32x d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H , a, b, c, d, w1[1], MD5C20, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w2[0], MD5C21, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w2[3], MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w3[2], MD5C23, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w0[1], MD5C24, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w1[0], MD5C25, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w1[3], MD5C26, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w2[2], MD5C27, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w3[1], MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w0[0], MD5C29, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w0[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w1[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w2[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w3[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w3[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w0[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1[0], MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w2[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2[1], MD5C3f, MD5S33); + + a += MD5M_A; + b += MD5M_B; + c += MD5M_C; + d += MD5M_D; + + const u32 w0_t = s[0]; + const u32 w1_t = s[1]; + const u32 w2_t = s[2]; + const u32 w3_t = s[3]; + const u32 w4_t = s[4]; + const u32 w5_t = s[5]; + const u32 w6_t = s[6]; + const u32 w7_t = s[7]; + + const u32x w8_t = uint_to_hex_lower8 ((a >> 0) & 255) << 0 + | uint_to_hex_lower8 ((a >> 8) & 255) << 16; + const u32x w9_t = uint_to_hex_lower8 ((a >> 16) & 255) << 0 + | uint_to_hex_lower8 ((a >> 24) & 255) << 16; + const u32x wa_t = uint_to_hex_lower8 ((b >> 0) & 255) << 0 + | uint_to_hex_lower8 ((b >> 8) & 255) << 16; + const u32x wb_t = uint_to_hex_lower8 ((b >> 16) & 255) << 0 + | uint_to_hex_lower8 ((b >> 24) & 255) << 16; + const u32x wc_t = uint_to_hex_lower8 ((c >> 0) & 255) << 0 + | uint_to_hex_lower8 ((c >> 8) & 255) << 16; + const u32x wd_t = uint_to_hex_lower8 ((c >> 16) & 255) << 0 + | uint_to_hex_lower8 ((c >> 24) & 255) << 16; + const u32x we_t = uint_to_hex_lower8 ((d >> 0) & 255) << 0 + | uint_to_hex_lower8 ((d >> 8) & 255) << 16; + const u32x wf_t = uint_to_hex_lower8 ((d >> 16) & 255) << 0 + | uint_to_hex_lower8 ((d >> 24) & 255) << 16; + + a = MD5M_A; + b = MD5M_B; + c = MD5M_C; + d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t, MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t, MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t, MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t, MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w4_t, MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w5_t, MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w6_t, MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w7_t, MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w8_t, MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w9_t, MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, wa_t, MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, wb_t, MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, wc_t, MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, wd_t, MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, we_t, MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, wf_t, MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w1_t, MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w6_t, MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, wb_t, MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t, MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w5_t, MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, wa_t, MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, wf_t, MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w4_t, MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w9_t, MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, we_t, MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t, MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w8_t, MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, wd_t, MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t, MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w7_t, MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, wc_t, MD5C1f, MD5S13); + + MD5_STEP (MD5_H , a, b, c, d, w5_t, MD5C20, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w8_t, MD5C21, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, wb_t, MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, we_t, MD5C23, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w1_t, MD5C24, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w4_t, MD5C25, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w7_t, MD5C26, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, wa_t, MD5C27, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, wd_t, MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w0_t, MD5C29, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w3_t, MD5C2a, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w6_t, MD5C2b, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w9_t, MD5C2c, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, wc_t, MD5C2d, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, wf_t, MD5C2e, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w2_t, MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t, MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w7_t, MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, we_t, MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w5_t, MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, wc_t, MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t, MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, wa_t, MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t, MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w8_t, MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, wf_t, MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w6_t, MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, wd_t, MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w4_t, MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, wb_t, MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t, MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w9_t, MD5C3f, MD5S33); + + const u32x r_a = a + MD5M_A; + const u32x r_b = b + MD5M_B; + const u32x r_c = c + MD5M_C; + const u32x r_d = d + MD5M_D; + + a = r_a; + b = r_b; + c = r_c; + d = r_d; + + MD5_STEP (MD5_Fo, a, b, c, d, r_00, MD5C00, MD5S00); + MD5_STEP0(MD5_Fo, d, a, b, c, MD5C01, MD5S01); + MD5_STEP0(MD5_Fo, c, d, a, b, MD5C02, MD5S02); + MD5_STEP0(MD5_Fo, b, c, d, a, MD5C03, MD5S03); + MD5_STEP0(MD5_Fo, a, b, c, d, MD5C04, MD5S00); + MD5_STEP0(MD5_Fo, d, a, b, c, MD5C05, MD5S01); + MD5_STEP0(MD5_Fo, c, d, a, b, MD5C06, MD5S02); + MD5_STEP0(MD5_Fo, b, c, d, a, MD5C07, MD5S03); + MD5_STEP0(MD5_Fo, a, b, c, d, MD5C08, MD5S00); + MD5_STEP0(MD5_Fo, d, a, b, c, MD5C09, MD5S01); + MD5_STEP0(MD5_Fo, c, d, a, b, MD5C0a, MD5S02); + MD5_STEP0(MD5_Fo, b, c, d, a, MD5C0b, MD5S03); + MD5_STEP0(MD5_Fo, a, b, c, d, MD5C0c, MD5S00); + MD5_STEP0(MD5_Fo, d, a, b, c, MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, r_14, MD5C0e, MD5S02); + MD5_STEP0(MD5_Fo, b, c, d, a, MD5C0f, MD5S03); + + MD5_STEP0(MD5_Go, a, b, c, d, MD5C10, MD5S10); + MD5_STEP0(MD5_Go, d, a, b, c, MD5C11, MD5S11); + MD5_STEP0(MD5_Go, c, d, a, b, MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, r_00, MD5C13, MD5S13); + MD5_STEP0(MD5_Go, a, b, c, d, MD5C14, MD5S10); + MD5_STEP0(MD5_Go, d, a, b, c, MD5C15, MD5S11); + MD5_STEP0(MD5_Go, c, d, a, b, MD5C16, MD5S12); + MD5_STEP0(MD5_Go, b, c, d, a, MD5C17, MD5S13); + MD5_STEP0(MD5_Go, a, b, c, d, MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, r_14, MD5C19, MD5S11); + MD5_STEP0(MD5_Go, c, d, a, b, MD5C1a, MD5S12); + MD5_STEP0(MD5_Go, b, c, d, a, MD5C1b, MD5S13); + MD5_STEP0(MD5_Go, a, b, c, d, MD5C1c, MD5S10); + MD5_STEP0(MD5_Go, d, a, b, c, MD5C1d, MD5S11); + MD5_STEP0(MD5_Go, c, d, a, b, MD5C1e, MD5S12); + MD5_STEP0(MD5_Go, b, c, d, a, MD5C1f, MD5S13); + + MD5_STEP0(MD5_H , a, b, c, d, MD5C20, MD5S20); + MD5_STEP0(MD5_H , d, a, b, c, MD5C21, MD5S21); + MD5_STEP0(MD5_H , c, d, a, b, MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, r_14, MD5C23, MD5S23); + MD5_STEP0(MD5_H , a, b, c, d, MD5C24, MD5S20); + MD5_STEP0(MD5_H , d, a, b, c, MD5C25, MD5S21); + MD5_STEP0(MD5_H , c, d, a, b, MD5C26, MD5S22); + MD5_STEP0(MD5_H , b, c, d, a, MD5C27, MD5S23); + MD5_STEP0(MD5_H , a, b, c, d, MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, r_00, MD5C29, MD5S21); + MD5_STEP0(MD5_H , c, d, a, b, MD5C2a, MD5S22); + MD5_STEP0(MD5_H , b, c, d, a, MD5C2b, MD5S23); + MD5_STEP0(MD5_H , a, b, c, d, MD5C2c, MD5S20); + MD5_STEP0(MD5_H , d, a, b, c, MD5C2d, MD5S21); + MD5_STEP0(MD5_H , c, d, a, b, MD5C2e, MD5S22); + MD5_STEP0(MD5_H , b, c, d, a, MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, r_00, MD5C30, MD5S30); + MD5_STEP0(MD5_I , d, a, b, c, MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, r_14, MD5C32, MD5S32); + MD5_STEP0(MD5_I , b, c, d, a, MD5C33, MD5S33); + MD5_STEP0(MD5_I , a, b, c, d, MD5C34, MD5S30); + MD5_STEP0(MD5_I , d, a, b, c, MD5C35, MD5S31); + MD5_STEP0(MD5_I , c, d, a, b, MD5C36, MD5S32); + MD5_STEP0(MD5_I , b, c, d, a, MD5C37, MD5S33); + MD5_STEP0(MD5_I , a, b, c, d, MD5C38, MD5S30); + MD5_STEP0(MD5_I , d, a, b, c, MD5C39, MD5S31); + MD5_STEP0(MD5_I , c, d, a, b, MD5C3a, MD5S32); + MD5_STEP0(MD5_I , b, c, d, a, MD5C3b, MD5S33); + MD5_STEP0(MD5_I , a, b, c, d, MD5C3c, MD5S30); + + if ((a + r_a) != search[0]) continue; + + MD5_STEP0(MD5_I , d, a, b, c, MD5C3d, MD5S31); + MD5_STEP0(MD5_I , c, d, a, b, MD5C3e, MD5S32); + MD5_STEP0(MD5_I , b, c, d, a, MD5C3f, MD5S33); + + a += r_a; + b += r_b; + c += r_c; + d += r_d; + + const u32x r0 = a; + const u32x r1 = d; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_S + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m02810_m04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + const u32 lid = threadIdx.x; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = pws[gid].i[14]; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * bin2asc table + */ + + l_bin2asc[lid] = c_bin2asc[(lid >> 0) & 15] << 8 + | c_bin2asc[(lid >> 4) & 15] << 0; + + __syncthreads (); + + if (gid >= gid_max) return; + + /** + * main + */ + + m02810m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m02810_m08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + const u32 lid = threadIdx.x; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = pws[gid].i[14]; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * bin2asc table + */ + + l_bin2asc[lid] = c_bin2asc[(lid >> 0) & 15] << 8 + | c_bin2asc[(lid >> 4) & 15] << 0; + + __syncthreads (); + + if (gid >= gid_max) return; + + /** + * main + */ + + m02810m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m02810_m16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + const u32 lid = threadIdx.x; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = pws[gid].i[ 8]; + w2[1] = pws[gid].i[ 9]; + w2[2] = pws[gid].i[10]; + w2[3] = pws[gid].i[11]; + + u32x w3[4]; + + w3[0] = pws[gid].i[12]; + w3[1] = pws[gid].i[13]; + w3[2] = pws[gid].i[14]; + w3[3] = pws[gid].i[15]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * bin2asc table + */ + + l_bin2asc[lid] = c_bin2asc[(lid >> 0) & 15] << 8 + | c_bin2asc[(lid >> 4) & 15] << 0; + + __syncthreads (); + + if (gid >= gid_max) return; + + /** + * main + */ + + m02810m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m02810_s04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + const u32 lid = threadIdx.x; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = pws[gid].i[14]; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * bin2asc table + */ + + l_bin2asc[lid] = c_bin2asc[(lid >> 0) & 15] << 8 + | c_bin2asc[(lid >> 4) & 15] << 0; + + __syncthreads (); + + if (gid >= gid_max) return; + + /** + * main + */ + + m02810s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m02810_s08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + const u32 lid = threadIdx.x; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = pws[gid].i[14]; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * bin2asc table + */ + + l_bin2asc[lid] = c_bin2asc[(lid >> 0) & 15] << 8 + | c_bin2asc[(lid >> 4) & 15] << 0; + + __syncthreads (); + + if (gid >= gid_max) return; + + /** + * main + */ + + m02810s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m02810_s16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + const u32 lid = threadIdx.x; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = pws[gid].i[ 8]; + w2[1] = pws[gid].i[ 9]; + w2[2] = pws[gid].i[10]; + w2[3] = pws[gid].i[11]; + + u32x w3[4]; + + w3[0] = pws[gid].i[12]; + w3[1] = pws[gid].i[13]; + w3[2] = pws[gid].i[14]; + w3[3] = pws[gid].i[15]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * bin2asc table + */ + + l_bin2asc[lid] = c_bin2asc[(lid >> 0) & 15] << 8 + | c_bin2asc[(lid >> 4) & 15] << 0; + + __syncthreads (); + + if (gid >= gid_max) return; + + /** + * main + */ + + m02810s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} diff --git a/nv/m03000_a0.cu b/nv/m03000_a0.cu new file mode 100644 index 0000000000..53fb28d474 --- /dev/null +++ b/nv/m03000_a0.cu @@ -0,0 +1,796 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _DES_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW2 +#define VECT_SIZE1 +#endif + +#define DGST_R0 0 +#define DGST_R1 1 +#define DGST_R2 2 +#define DGST_R3 3 + +#include "include/kernel_functions.c" +#include "types_nv.c" +#include "common_nv.c" +#include "include/rp_gpu.h" +#include "rp_nv.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#define PERM_OP(a,b,tt,n,m) \ +{ \ + tt = a >> n; \ + tt = tt ^ b; \ + tt = tt & m; \ + b = b ^ tt; \ + tt = tt << n; \ + a = a ^ tt; \ +} + +#define HPERM_OP(a,tt,n,m) \ +{ \ + tt = a << (16 + n); \ + tt = tt ^ a; \ + tt = tt & m; \ + a = a ^ tt; \ + tt = tt >> (16 + n); \ + a = a ^ tt; \ +} + +__device__ __constant__ u32 c_SPtrans[8][64] = +{ + /* nibble 0 */ + 0x02080800, 0x00080000, 0x02000002, 0x02080802, + 0x02000000, 0x00080802, 0x00080002, 0x02000002, + 0x00080802, 0x02080800, 0x02080000, 0x00000802, + 0x02000802, 0x02000000, 0x00000000, 0x00080002, + 0x00080000, 0x00000002, 0x02000800, 0x00080800, + 0x02080802, 0x02080000, 0x00000802, 0x02000800, + 0x00000002, 0x00000800, 0x00080800, 0x02080002, + 0x00000800, 0x02000802, 0x02080002, 0x00000000, + 0x00000000, 0x02080802, 0x02000800, 0x00080002, + 0x02080800, 0x00080000, 0x00000802, 0x02000800, + 0x02080002, 0x00000800, 0x00080800, 0x02000002, + 0x00080802, 0x00000002, 0x02000002, 0x02080000, + 0x02080802, 0x00080800, 0x02080000, 0x02000802, + 0x02000000, 0x00000802, 0x00080002, 0x00000000, + 0x00080000, 0x02000000, 0x02000802, 0x02080800, + 0x00000002, 0x02080002, 0x00000800, 0x00080802, + /* nibble 1 */ + 0x40108010, 0x00000000, 0x00108000, 0x40100000, + 0x40000010, 0x00008010, 0x40008000, 0x00108000, + 0x00008000, 0x40100010, 0x00000010, 0x40008000, + 0x00100010, 0x40108000, 0x40100000, 0x00000010, + 0x00100000, 0x40008010, 0x40100010, 0x00008000, + 0x00108010, 0x40000000, 0x00000000, 0x00100010, + 0x40008010, 0x00108010, 0x40108000, 0x40000010, + 0x40000000, 0x00100000, 0x00008010, 0x40108010, + 0x00100010, 0x40108000, 0x40008000, 0x00108010, + 0x40108010, 0x00100010, 0x40000010, 0x00000000, + 0x40000000, 0x00008010, 0x00100000, 0x40100010, + 0x00008000, 0x40000000, 0x00108010, 0x40008010, + 0x40108000, 0x00008000, 0x00000000, 0x40000010, + 0x00000010, 0x40108010, 0x00108000, 0x40100000, + 0x40100010, 0x00100000, 0x00008010, 0x40008000, + 0x40008010, 0x00000010, 0x40100000, 0x00108000, + /* nibble 2 */ + 0x04000001, 0x04040100, 0x00000100, 0x04000101, + 0x00040001, 0x04000000, 0x04000101, 0x00040100, + 0x04000100, 0x00040000, 0x04040000, 0x00000001, + 0x04040101, 0x00000101, 0x00000001, 0x04040001, + 0x00000000, 0x00040001, 0x04040100, 0x00000100, + 0x00000101, 0x04040101, 0x00040000, 0x04000001, + 0x04040001, 0x04000100, 0x00040101, 0x04040000, + 0x00040100, 0x00000000, 0x04000000, 0x00040101, + 0x04040100, 0x00000100, 0x00000001, 0x00040000, + 0x00000101, 0x00040001, 0x04040000, 0x04000101, + 0x00000000, 0x04040100, 0x00040100, 0x04040001, + 0x00040001, 0x04000000, 0x04040101, 0x00000001, + 0x00040101, 0x04000001, 0x04000000, 0x04040101, + 0x00040000, 0x04000100, 0x04000101, 0x00040100, + 0x04000100, 0x00000000, 0x04040001, 0x00000101, + 0x04000001, 0x00040101, 0x00000100, 0x04040000, + /* nibble 3 */ + 0x00401008, 0x10001000, 0x00000008, 0x10401008, + 0x00000000, 0x10400000, 0x10001008, 0x00400008, + 0x10401000, 0x10000008, 0x10000000, 0x00001008, + 0x10000008, 0x00401008, 0x00400000, 0x10000000, + 0x10400008, 0x00401000, 0x00001000, 0x00000008, + 0x00401000, 0x10001008, 0x10400000, 0x00001000, + 0x00001008, 0x00000000, 0x00400008, 0x10401000, + 0x10001000, 0x10400008, 0x10401008, 0x00400000, + 0x10400008, 0x00001008, 0x00400000, 0x10000008, + 0x00401000, 0x10001000, 0x00000008, 0x10400000, + 0x10001008, 0x00000000, 0x00001000, 0x00400008, + 0x00000000, 0x10400008, 0x10401000, 0x00001000, + 0x10000000, 0x10401008, 0x00401008, 0x00400000, + 0x10401008, 0x00000008, 0x10001000, 0x00401008, + 0x00400008, 0x00401000, 0x10400000, 0x10001008, + 0x00001008, 0x10000000, 0x10000008, 0x10401000, + /* nibble 4 */ + 0x08000000, 0x00010000, 0x00000400, 0x08010420, + 0x08010020, 0x08000400, 0x00010420, 0x08010000, + 0x00010000, 0x00000020, 0x08000020, 0x00010400, + 0x08000420, 0x08010020, 0x08010400, 0x00000000, + 0x00010400, 0x08000000, 0x00010020, 0x00000420, + 0x08000400, 0x00010420, 0x00000000, 0x08000020, + 0x00000020, 0x08000420, 0x08010420, 0x00010020, + 0x08010000, 0x00000400, 0x00000420, 0x08010400, + 0x08010400, 0x08000420, 0x00010020, 0x08010000, + 0x00010000, 0x00000020, 0x08000020, 0x08000400, + 0x08000000, 0x00010400, 0x08010420, 0x00000000, + 0x00010420, 0x08000000, 0x00000400, 0x00010020, + 0x08000420, 0x00000400, 0x00000000, 0x08010420, + 0x08010020, 0x08010400, 0x00000420, 0x00010000, + 0x00010400, 0x08010020, 0x08000400, 0x00000420, + 0x00000020, 0x00010420, 0x08010000, 0x08000020, + /* nibble 5 */ + 0x80000040, 0x00200040, 0x00000000, 0x80202000, + 0x00200040, 0x00002000, 0x80002040, 0x00200000, + 0x00002040, 0x80202040, 0x00202000, 0x80000000, + 0x80002000, 0x80000040, 0x80200000, 0x00202040, + 0x00200000, 0x80002040, 0x80200040, 0x00000000, + 0x00002000, 0x00000040, 0x80202000, 0x80200040, + 0x80202040, 0x80200000, 0x80000000, 0x00002040, + 0x00000040, 0x00202000, 0x00202040, 0x80002000, + 0x00002040, 0x80000000, 0x80002000, 0x00202040, + 0x80202000, 0x00200040, 0x00000000, 0x80002000, + 0x80000000, 0x00002000, 0x80200040, 0x00200000, + 0x00200040, 0x80202040, 0x00202000, 0x00000040, + 0x80202040, 0x00202000, 0x00200000, 0x80002040, + 0x80000040, 0x80200000, 0x00202040, 0x00000000, + 0x00002000, 0x80000040, 0x80002040, 0x80202000, + 0x80200000, 0x00002040, 0x00000040, 0x80200040, + /* nibble 6 */ + 0x00004000, 0x00000200, 0x01000200, 0x01000004, + 0x01004204, 0x00004004, 0x00004200, 0x00000000, + 0x01000000, 0x01000204, 0x00000204, 0x01004000, + 0x00000004, 0x01004200, 0x01004000, 0x00000204, + 0x01000204, 0x00004000, 0x00004004, 0x01004204, + 0x00000000, 0x01000200, 0x01000004, 0x00004200, + 0x01004004, 0x00004204, 0x01004200, 0x00000004, + 0x00004204, 0x01004004, 0x00000200, 0x01000000, + 0x00004204, 0x01004000, 0x01004004, 0x00000204, + 0x00004000, 0x00000200, 0x01000000, 0x01004004, + 0x01000204, 0x00004204, 0x00004200, 0x00000000, + 0x00000200, 0x01000004, 0x00000004, 0x01000200, + 0x00000000, 0x01000204, 0x01000200, 0x00004200, + 0x00000204, 0x00004000, 0x01004204, 0x01000000, + 0x01004200, 0x00000004, 0x00004004, 0x01004204, + 0x01000004, 0x01004200, 0x01004000, 0x00004004, + /* nibble 7 */ + 0x20800080, 0x20820000, 0x00020080, 0x00000000, + 0x20020000, 0x00800080, 0x20800000, 0x20820080, + 0x00000080, 0x20000000, 0x00820000, 0x00020080, + 0x00820080, 0x20020080, 0x20000080, 0x20800000, + 0x00020000, 0x00820080, 0x00800080, 0x20020000, + 0x20820080, 0x20000080, 0x00000000, 0x00820000, + 0x20000000, 0x00800000, 0x20020080, 0x20800080, + 0x00800000, 0x00020000, 0x20820000, 0x00000080, + 0x00800000, 0x00020000, 0x20000080, 0x20820080, + 0x00020080, 0x20000000, 0x00000000, 0x00820000, + 0x20800080, 0x20020080, 0x20020000, 0x00800080, + 0x20820000, 0x00000080, 0x00800080, 0x20020000, + 0x20820080, 0x00800000, 0x20800000, 0x20000080, + 0x00820000, 0x00020080, 0x20020080, 0x20800000, + 0x00000080, 0x20820000, 0x00820080, 0x00000000, + 0x20000000, 0x20800080, 0x00020000, 0x00820080, +}; + +__device__ __constant__ u32 c_skb[8][64] = +{ + /* for C bits (numbered as per FIPS 46) 1 2 3 4 5 6 */ + 0x00000000, 0x00000010, 0x20000000, 0x20000010, + 0x00010000, 0x00010010, 0x20010000, 0x20010010, + 0x00000800, 0x00000810, 0x20000800, 0x20000810, + 0x00010800, 0x00010810, 0x20010800, 0x20010810, + 0x00000020, 0x00000030, 0x20000020, 0x20000030, + 0x00010020, 0x00010030, 0x20010020, 0x20010030, + 0x00000820, 0x00000830, 0x20000820, 0x20000830, + 0x00010820, 0x00010830, 0x20010820, 0x20010830, + 0x00080000, 0x00080010, 0x20080000, 0x20080010, + 0x00090000, 0x00090010, 0x20090000, 0x20090010, + 0x00080800, 0x00080810, 0x20080800, 0x20080810, + 0x00090800, 0x00090810, 0x20090800, 0x20090810, + 0x00080020, 0x00080030, 0x20080020, 0x20080030, + 0x00090020, 0x00090030, 0x20090020, 0x20090030, + 0x00080820, 0x00080830, 0x20080820, 0x20080830, + 0x00090820, 0x00090830, 0x20090820, 0x20090830, + /* for C bits (numbered as per FIPS 46) 7 8 10 11 12 13 */ + 0x00000000, 0x02000000, 0x00002000, 0x02002000, + 0x00200000, 0x02200000, 0x00202000, 0x02202000, + 0x00000004, 0x02000004, 0x00002004, 0x02002004, + 0x00200004, 0x02200004, 0x00202004, 0x02202004, + 0x00000400, 0x02000400, 0x00002400, 0x02002400, + 0x00200400, 0x02200400, 0x00202400, 0x02202400, + 0x00000404, 0x02000404, 0x00002404, 0x02002404, + 0x00200404, 0x02200404, 0x00202404, 0x02202404, + 0x10000000, 0x12000000, 0x10002000, 0x12002000, + 0x10200000, 0x12200000, 0x10202000, 0x12202000, + 0x10000004, 0x12000004, 0x10002004, 0x12002004, + 0x10200004, 0x12200004, 0x10202004, 0x12202004, + 0x10000400, 0x12000400, 0x10002400, 0x12002400, + 0x10200400, 0x12200400, 0x10202400, 0x12202400, + 0x10000404, 0x12000404, 0x10002404, 0x12002404, + 0x10200404, 0x12200404, 0x10202404, 0x12202404, + /* for C bits (numbered as per FIPS 46) 14 15 16 17 19 20 */ + 0x00000000, 0x00000001, 0x00040000, 0x00040001, + 0x01000000, 0x01000001, 0x01040000, 0x01040001, + 0x00000002, 0x00000003, 0x00040002, 0x00040003, + 0x01000002, 0x01000003, 0x01040002, 0x01040003, + 0x00000200, 0x00000201, 0x00040200, 0x00040201, + 0x01000200, 0x01000201, 0x01040200, 0x01040201, + 0x00000202, 0x00000203, 0x00040202, 0x00040203, + 0x01000202, 0x01000203, 0x01040202, 0x01040203, + 0x08000000, 0x08000001, 0x08040000, 0x08040001, + 0x09000000, 0x09000001, 0x09040000, 0x09040001, + 0x08000002, 0x08000003, 0x08040002, 0x08040003, + 0x09000002, 0x09000003, 0x09040002, 0x09040003, + 0x08000200, 0x08000201, 0x08040200, 0x08040201, + 0x09000200, 0x09000201, 0x09040200, 0x09040201, + 0x08000202, 0x08000203, 0x08040202, 0x08040203, + 0x09000202, 0x09000203, 0x09040202, 0x09040203, + /* for C bits (numbered as per FIPS 46) 21 23 24 26 27 28 */ + 0x00000000, 0x00100000, 0x00000100, 0x00100100, + 0x00000008, 0x00100008, 0x00000108, 0x00100108, + 0x00001000, 0x00101000, 0x00001100, 0x00101100, + 0x00001008, 0x00101008, 0x00001108, 0x00101108, + 0x04000000, 0x04100000, 0x04000100, 0x04100100, + 0x04000008, 0x04100008, 0x04000108, 0x04100108, + 0x04001000, 0x04101000, 0x04001100, 0x04101100, + 0x04001008, 0x04101008, 0x04001108, 0x04101108, + 0x00020000, 0x00120000, 0x00020100, 0x00120100, + 0x00020008, 0x00120008, 0x00020108, 0x00120108, + 0x00021000, 0x00121000, 0x00021100, 0x00121100, + 0x00021008, 0x00121008, 0x00021108, 0x00121108, + 0x04020000, 0x04120000, 0x04020100, 0x04120100, + 0x04020008, 0x04120008, 0x04020108, 0x04120108, + 0x04021000, 0x04121000, 0x04021100, 0x04121100, + 0x04021008, 0x04121008, 0x04021108, 0x04121108, + /* for D bits (numbered as per FIPS 46) 1 2 3 4 5 6 */ + 0x00000000, 0x10000000, 0x00010000, 0x10010000, + 0x00000004, 0x10000004, 0x00010004, 0x10010004, + 0x20000000, 0x30000000, 0x20010000, 0x30010000, + 0x20000004, 0x30000004, 0x20010004, 0x30010004, + 0x00100000, 0x10100000, 0x00110000, 0x10110000, + 0x00100004, 0x10100004, 0x00110004, 0x10110004, + 0x20100000, 0x30100000, 0x20110000, 0x30110000, + 0x20100004, 0x30100004, 0x20110004, 0x30110004, + 0x00001000, 0x10001000, 0x00011000, 0x10011000, + 0x00001004, 0x10001004, 0x00011004, 0x10011004, + 0x20001000, 0x30001000, 0x20011000, 0x30011000, + 0x20001004, 0x30001004, 0x20011004, 0x30011004, + 0x00101000, 0x10101000, 0x00111000, 0x10111000, + 0x00101004, 0x10101004, 0x00111004, 0x10111004, + 0x20101000, 0x30101000, 0x20111000, 0x30111000, + 0x20101004, 0x30101004, 0x20111004, 0x30111004, + /* for D bits (numbered as per FIPS 46) 8 9 11 12 13 14 */ + 0x00000000, 0x08000000, 0x00000008, 0x08000008, + 0x00000400, 0x08000400, 0x00000408, 0x08000408, + 0x00020000, 0x08020000, 0x00020008, 0x08020008, + 0x00020400, 0x08020400, 0x00020408, 0x08020408, + 0x00000001, 0x08000001, 0x00000009, 0x08000009, + 0x00000401, 0x08000401, 0x00000409, 0x08000409, + 0x00020001, 0x08020001, 0x00020009, 0x08020009, + 0x00020401, 0x08020401, 0x00020409, 0x08020409, + 0x02000000, 0x0A000000, 0x02000008, 0x0A000008, + 0x02000400, 0x0A000400, 0x02000408, 0x0A000408, + 0x02020000, 0x0A020000, 0x02020008, 0x0A020008, + 0x02020400, 0x0A020400, 0x02020408, 0x0A020408, + 0x02000001, 0x0A000001, 0x02000009, 0x0A000009, + 0x02000401, 0x0A000401, 0x02000409, 0x0A000409, + 0x02020001, 0x0A020001, 0x02020009, 0x0A020009, + 0x02020401, 0x0A020401, 0x02020409, 0x0A020409, + /* for D bits (numbered as per FIPS 46) 16 17 18 19 20 21 */ + 0x00000000, 0x00000100, 0x00080000, 0x00080100, + 0x01000000, 0x01000100, 0x01080000, 0x01080100, + 0x00000010, 0x00000110, 0x00080010, 0x00080110, + 0x01000010, 0x01000110, 0x01080010, 0x01080110, + 0x00200000, 0x00200100, 0x00280000, 0x00280100, + 0x01200000, 0x01200100, 0x01280000, 0x01280100, + 0x00200010, 0x00200110, 0x00280010, 0x00280110, + 0x01200010, 0x01200110, 0x01280010, 0x01280110, + 0x00000200, 0x00000300, 0x00080200, 0x00080300, + 0x01000200, 0x01000300, 0x01080200, 0x01080300, + 0x00000210, 0x00000310, 0x00080210, 0x00080310, + 0x01000210, 0x01000310, 0x01080210, 0x01080310, + 0x00200200, 0x00200300, 0x00280200, 0x00280300, + 0x01200200, 0x01200300, 0x01280200, 0x01280300, + 0x00200210, 0x00200310, 0x00280210, 0x00280310, + 0x01200210, 0x01200310, 0x01280210, 0x01280310, + /* for D bits (numbered as per FIPS 46) 22 23 24 25 27 28 */ + 0x00000000, 0x04000000, 0x00040000, 0x04040000, + 0x00000002, 0x04000002, 0x00040002, 0x04040002, + 0x00002000, 0x04002000, 0x00042000, 0x04042000, + 0x00002002, 0x04002002, 0x00042002, 0x04042002, + 0x00000020, 0x04000020, 0x00040020, 0x04040020, + 0x00000022, 0x04000022, 0x00040022, 0x04040022, + 0x00002020, 0x04002020, 0x00042020, 0x04042020, + 0x00002022, 0x04002022, 0x00042022, 0x04042022, + 0x00000800, 0x04000800, 0x00040800, 0x04040800, + 0x00000802, 0x04000802, 0x00040802, 0x04040802, + 0x00002800, 0x04002800, 0x00042800, 0x04042800, + 0x00002802, 0x04002802, 0x00042802, 0x04042802, + 0x00000820, 0x04000820, 0x00040820, 0x04040820, + 0x00000822, 0x04000822, 0x00040822, 0x04040822, + 0x00002820, 0x04002820, 0x00042820, 0x04042820, + 0x00002822, 0x04002822, 0x00042822, 0x04042822 +}; + +#define LM_IV_0_IP_RR3 0x2400b807 +#define LM_IV_1_IP_RR3 0xaa190747 + +#ifdef VECT_SIZE1 +#define BOX(i,n,S) u32x ((S)[(n)][(i)]) +#endif + +#ifdef VECT_SIZE2 +#define BOX(i,n,S) u32x ((S)[(n)][(i).x], (S)[(n)][(i).y]) +#endif + +__device__ static void _des_crypt_encrypt (u32x iv[2], u32x data[2], u32x Kc[16], u32x Kd[16], u32 s_SPtrans[8][64]) +{ + asm (".reg .u8 c0, c1, c2, c3, c4, c5, c6, c7;"); + + u32x tt; + + u32x r = data[0]; + u32x l = data[1]; + + for (int i = 0; i < 16; i++) + { + u32x u = Kc[i] ^ r; + u32x t = Kd[i] ^ rotl32 (r, 28u); + + u = (u >> 2) & 0x3f3f3f3f; + t = (t >> 2) & 0x3f3f3f3f; + + u32 u0, u1, u2, u3; + u32 t0, t1, t2, t3; + + asm + ( + "mov.b32 {c0, c1, c2, c3}, %8;" + "mov.b32 {c4, c5, c6, c7}, %9;" + "cvt.u32.u8 %0, c0;" + "cvt.u32.u8 %1, c1;" + "cvt.u32.u8 %2, c2;" + "cvt.u32.u8 %3, c3;" + "cvt.u32.u8 %4, c4;" + "cvt.u32.u8 %5, c5;" + "cvt.u32.u8 %6, c6;" + "cvt.u32.u8 %7, c7;" + + : "=r"(u0), "=r"(u1), "=r"(u2), "=r"(u3), + "=r"(t0), "=r"(t1), "=r"(t2), "=r"(t3) + : "r"(u), + "r"(t) + ); + + l ^= BOX (u0, 0, s_SPtrans) + | BOX (u1, 2, s_SPtrans) + | BOX (u2, 4, s_SPtrans) + | BOX (u3, 6, s_SPtrans) + | BOX (t0, 1, s_SPtrans) + | BOX (t1, 3, s_SPtrans) + | BOX (t2, 5, s_SPtrans) + | BOX (t3, 7, s_SPtrans); + + tt = l; + l = r; + r = tt; + } + + iv[0] = rotl32 (l, 29); + iv[1] = rotl32 (r, 29); +} + +__device__ static void _des_crypt_keysetup (u32x c, u32x d, u32x Kc[16], u32x Kd[16], u32 s_skb[8][64]) +{ + u32x tt; + + PERM_OP (d, c, tt, 4, 0x0f0f0f0f); + HPERM_OP (c, tt, 2, 0xcccc0000); + HPERM_OP (d, tt, 2, 0xcccc0000); + PERM_OP (d, c, tt, 1, 0x55555555); + PERM_OP (c, d, tt, 8, 0x00ff00ff); + PERM_OP (d, c, tt, 1, 0x55555555); + + d = ((d & 0x000000ff) << 16) + | ((d & 0x0000ff00) << 0) + | ((d & 0x00ff0000) >> 16) + | ((c & 0xf0000000) >> 4); + + c = c & 0x0fffffff; + + for (u32 i = 0; i < 16; i++) + { + if ((i < 2) || (i == 8) || (i == 15)) + { + c = ((c >> 1) | (c << 27)); + d = ((d >> 1) | (d << 27)); + } + else + { + c = ((c >> 2) | (c << 26)); + d = ((d >> 2) | (d << 26)); + } + + c = c & 0x0fffffff; + d = d & 0x0fffffff; + + const u32x c00 = (c >> 0) & 0x0000003f; + const u32x c06 = (c >> 6) & 0x00383003; + const u32x c07 = (c >> 7) & 0x0000003c; + const u32x c13 = (c >> 13) & 0x0000060f; + const u32x c20 = (c >> 20) & 0x00000001; + + u32x s = BOX (((c00 >> 0) & 0xff), 0, s_skb) + | BOX (((c06 >> 0) & 0xff) + |((c07 >> 0) & 0xff), 1, s_skb) + | BOX (((c13 >> 0) & 0xff) + |((c06 >> 8) & 0xff), 2, s_skb) + | BOX (((c20 >> 0) & 0xff) + |((c13 >> 8) & 0xff) + |((c06 >> 16) & 0xff), 3, s_skb); + + const u32x d00 = (d >> 0) & 0x00003c3f; + const u32x d07 = (d >> 7) & 0x00003f03; + const u32x d21 = (d >> 21) & 0x0000000f; + const u32x d22 = (d >> 22) & 0x00000030; + + u32x t = BOX (((d00 >> 0) & 0xff), 4, s_skb) + | BOX (((d07 >> 0) & 0xff) + |((d00 >> 8) & 0xff), 5, s_skb) + | BOX (((d07 >> 8) & 0xff), 6, s_skb) + | BOX (((d21 >> 0) & 0xff) + |((d22 >> 0) & 0xff), 7, s_skb); + + #if __CUDA_ARCH__ >= 200 + Kc[i] = __byte_perm (s, t, 0x5410); + Kd[i] = __byte_perm (s, t, 0x7632); + #else + Kc[i] = ((t << 16) | (s & 0x0000ffff)); + Kd[i] = ((s >> 16) | (t & 0xffff0000)); + #endif + + Kc[i] = rotl32 (Kc[i], 2u); + Kd[i] = rotl32 (Kd[i], 2u); + } +} + +__device__ static void transform_netntlmv1_key (const u32x w0, const u32x w1, u32x out[2]) +{ + u32x t[8]; + + t[0] = (w0 >> 0) & 0xff; + t[1] = (w0 >> 8) & 0xff; + t[2] = (w0 >> 16) & 0xff; + t[3] = (w0 >> 24) & 0xff; + t[4] = (w1 >> 0) & 0xff; + t[5] = (w1 >> 8) & 0xff; + t[6] = (w1 >> 16) & 0xff; + t[7] = (w1 >> 24) & 0xff; + + u32x k[8]; + + k[0] = (t[0] >> 0); + k[1] = (t[0] << 7) | (t[1] >> 1); + k[2] = (t[1] << 6) | (t[2] >> 2); + k[3] = (t[2] << 5) | (t[3] >> 3); + k[4] = (t[3] << 4) | (t[4] >> 4); + k[5] = (t[4] << 3) | (t[5] >> 5); + k[6] = (t[5] << 2) | (t[6] >> 6); + k[7] = (t[6] << 1); + + out[0] = ((k[0] & 0xff) << 0) + | ((k[1] & 0xff) << 8) + | ((k[2] & 0xff) << 16) + | ((k[3] & 0xff) << 24); + + out[1] = ((k[4] & 0xff) << 0) + | ((k[5] & 0xff) << 8) + | ((k[6] & 0xff) << 16) + | ((k[7] & 0xff) << 24); +} + +__device__ __constant__ gpu_rule_t c_rules[1024]; + +extern "C" __global__ void __launch_bounds__ (256, 1) m03000_m04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + u32x pw_buf[4]; + + pw_buf[0] = pws[gid].i[ 0]; + pw_buf[1] = pws[gid].i[ 1]; + pw_buf[2] = 0; + pw_buf[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * sbox, kbox + */ + + __shared__ u32 s_SPtrans[8][64]; + __shared__ u32 s_skb[8][64]; + + if (lid < 64) + { + s_SPtrans[0][lid] = c_SPtrans[0][lid]; + s_SPtrans[1][lid] = c_SPtrans[1][lid]; + s_SPtrans[2][lid] = c_SPtrans[2][lid]; + s_SPtrans[3][lid] = c_SPtrans[3][lid]; + s_SPtrans[4][lid] = c_SPtrans[4][lid]; + s_SPtrans[5][lid] = c_SPtrans[5][lid]; + s_SPtrans[6][lid] = c_SPtrans[6][lid]; + s_SPtrans[7][lid] = c_SPtrans[7][lid]; + + s_skb[0][lid] = c_skb[0][lid]; + s_skb[1][lid] = c_skb[1][lid]; + s_skb[2][lid] = c_skb[2][lid]; + s_skb[3][lid] = c_skb[3][lid]; + s_skb[4][lid] = c_skb[4][lid]; + s_skb[5][lid] = c_skb[5][lid]; + s_skb[6][lid] = c_skb[6][lid]; + s_skb[7][lid] = c_skb[7][lid]; + } + + __syncthreads (); + + if (gid >= gid_max) return; + + /** + * main + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + + w0[0] = pw_buf[0]; + w0[1] = pw_buf[1]; + w0[2] = pw_buf[2]; + w0[3] = pw_buf[3]; + + u32x w1[4]; + + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + u32 out_len = apply_rules (c_rules[il_pos].cmds, w0, w1, pw_len); + + out_len = (out_len >= 7) ? 7 : out_len; + + u32x key[2]; + + transform_netntlmv1_key (w0[0], w0[1], key); + + const u32x c = key[0]; + const u32x d = key[1]; + + u32x Kc[16]; + u32x Kd[16]; + + _des_crypt_keysetup (c, d, Kc, Kd, s_skb); + + u32x data[2]; + + data[0] = LM_IV_0_IP_RR3; + data[1] = LM_IV_1_IP_RR3; + + u32x iv[2]; + + _des_crypt_encrypt (iv, data, Kc, Kd, s_SPtrans); + + const u32x r0 = iv[0]; + const u32x r1 = iv[1]; + const u32x r2 = 0; + const u32x r3 = 0; + + #include VECT_COMPARE_M + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m03000_m08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m03000_m16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m03000_s04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + u32x pw_buf[4]; + + pw_buf[0] = pws[gid].i[ 0]; + pw_buf[1] = pws[gid].i[ 1]; + pw_buf[2] = 0; + pw_buf[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * sbox, kbox + */ + + __shared__ u32 s_SPtrans[8][64]; + __shared__ u32 s_skb[8][64]; + + if (lid < 64) + { + s_SPtrans[0][lid] = c_SPtrans[0][lid]; + s_SPtrans[1][lid] = c_SPtrans[1][lid]; + s_SPtrans[2][lid] = c_SPtrans[2][lid]; + s_SPtrans[3][lid] = c_SPtrans[3][lid]; + s_SPtrans[4][lid] = c_SPtrans[4][lid]; + s_SPtrans[5][lid] = c_SPtrans[5][lid]; + s_SPtrans[6][lid] = c_SPtrans[6][lid]; + s_SPtrans[7][lid] = c_SPtrans[7][lid]; + + s_skb[0][lid] = c_skb[0][lid]; + s_skb[1][lid] = c_skb[1][lid]; + s_skb[2][lid] = c_skb[2][lid]; + s_skb[3][lid] = c_skb[3][lid]; + s_skb[4][lid] = c_skb[4][lid]; + s_skb[5][lid] = c_skb[5][lid]; + s_skb[6][lid] = c_skb[6][lid]; + s_skb[7][lid] = c_skb[7][lid]; + } + + __syncthreads (); + + if (gid >= gid_max) return; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * main + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + + w0[0] = pw_buf[0]; + w0[1] = pw_buf[1]; + w0[2] = pw_buf[2]; + w0[3] = pw_buf[3]; + + u32x w1[4]; + + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + u32 out_len = apply_rules (c_rules[il_pos].cmds, w0, w1, pw_len); + + out_len = (out_len >= 7) ? 7 : out_len; + + u32x key[2]; + + transform_netntlmv1_key (w0[0], w0[1], key); + + const u32x c = key[0]; + const u32x d = key[1]; + + u32x Kc[16]; + u32x Kd[16]; + + _des_crypt_keysetup (c, d, Kc, Kd, s_skb); + + u32x data[2]; + + data[0] = LM_IV_0_IP_RR3; + data[1] = LM_IV_1_IP_RR3; + + u32x iv[2]; + + _des_crypt_encrypt (iv, data, Kc, Kd, s_SPtrans); + + const u32x r0 = iv[0]; + const u32x r1 = iv[1]; + const u32x r2 = 0; + const u32x r3 = 0; + + #include VECT_COMPARE_S + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m03000_s08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m03000_s16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/nv/m03000_a1.cu b/nv/m03000_a1.cu new file mode 100644 index 0000000000..0e36da9251 --- /dev/null +++ b/nv/m03000_a1.cu @@ -0,0 +1,918 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _DES_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW2 +#define VECT_SIZE1 +#endif + +#define DGST_R0 0 +#define DGST_R1 1 +#define DGST_R2 2 +#define DGST_R3 3 + +#include "include/kernel_functions.c" +#include "types_nv.c" +#include "common_nv.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#define PERM_OP(a,b,tt,n,m) \ +{ \ + tt = a >> n; \ + tt = tt ^ b; \ + tt = tt & m; \ + b = b ^ tt; \ + tt = tt << n; \ + a = a ^ tt; \ +} + +#define HPERM_OP(a,tt,n,m) \ +{ \ + tt = a << (16 + n); \ + tt = tt ^ a; \ + tt = tt & m; \ + a = a ^ tt; \ + tt = tt >> (16 + n); \ + a = a ^ tt; \ +} + +__device__ __constant__ u32 c_SPtrans[8][64] = +{ + /* nibble 0 */ + 0x02080800, 0x00080000, 0x02000002, 0x02080802, + 0x02000000, 0x00080802, 0x00080002, 0x02000002, + 0x00080802, 0x02080800, 0x02080000, 0x00000802, + 0x02000802, 0x02000000, 0x00000000, 0x00080002, + 0x00080000, 0x00000002, 0x02000800, 0x00080800, + 0x02080802, 0x02080000, 0x00000802, 0x02000800, + 0x00000002, 0x00000800, 0x00080800, 0x02080002, + 0x00000800, 0x02000802, 0x02080002, 0x00000000, + 0x00000000, 0x02080802, 0x02000800, 0x00080002, + 0x02080800, 0x00080000, 0x00000802, 0x02000800, + 0x02080002, 0x00000800, 0x00080800, 0x02000002, + 0x00080802, 0x00000002, 0x02000002, 0x02080000, + 0x02080802, 0x00080800, 0x02080000, 0x02000802, + 0x02000000, 0x00000802, 0x00080002, 0x00000000, + 0x00080000, 0x02000000, 0x02000802, 0x02080800, + 0x00000002, 0x02080002, 0x00000800, 0x00080802, + /* nibble 1 */ + 0x40108010, 0x00000000, 0x00108000, 0x40100000, + 0x40000010, 0x00008010, 0x40008000, 0x00108000, + 0x00008000, 0x40100010, 0x00000010, 0x40008000, + 0x00100010, 0x40108000, 0x40100000, 0x00000010, + 0x00100000, 0x40008010, 0x40100010, 0x00008000, + 0x00108010, 0x40000000, 0x00000000, 0x00100010, + 0x40008010, 0x00108010, 0x40108000, 0x40000010, + 0x40000000, 0x00100000, 0x00008010, 0x40108010, + 0x00100010, 0x40108000, 0x40008000, 0x00108010, + 0x40108010, 0x00100010, 0x40000010, 0x00000000, + 0x40000000, 0x00008010, 0x00100000, 0x40100010, + 0x00008000, 0x40000000, 0x00108010, 0x40008010, + 0x40108000, 0x00008000, 0x00000000, 0x40000010, + 0x00000010, 0x40108010, 0x00108000, 0x40100000, + 0x40100010, 0x00100000, 0x00008010, 0x40008000, + 0x40008010, 0x00000010, 0x40100000, 0x00108000, + /* nibble 2 */ + 0x04000001, 0x04040100, 0x00000100, 0x04000101, + 0x00040001, 0x04000000, 0x04000101, 0x00040100, + 0x04000100, 0x00040000, 0x04040000, 0x00000001, + 0x04040101, 0x00000101, 0x00000001, 0x04040001, + 0x00000000, 0x00040001, 0x04040100, 0x00000100, + 0x00000101, 0x04040101, 0x00040000, 0x04000001, + 0x04040001, 0x04000100, 0x00040101, 0x04040000, + 0x00040100, 0x00000000, 0x04000000, 0x00040101, + 0x04040100, 0x00000100, 0x00000001, 0x00040000, + 0x00000101, 0x00040001, 0x04040000, 0x04000101, + 0x00000000, 0x04040100, 0x00040100, 0x04040001, + 0x00040001, 0x04000000, 0x04040101, 0x00000001, + 0x00040101, 0x04000001, 0x04000000, 0x04040101, + 0x00040000, 0x04000100, 0x04000101, 0x00040100, + 0x04000100, 0x00000000, 0x04040001, 0x00000101, + 0x04000001, 0x00040101, 0x00000100, 0x04040000, + /* nibble 3 */ + 0x00401008, 0x10001000, 0x00000008, 0x10401008, + 0x00000000, 0x10400000, 0x10001008, 0x00400008, + 0x10401000, 0x10000008, 0x10000000, 0x00001008, + 0x10000008, 0x00401008, 0x00400000, 0x10000000, + 0x10400008, 0x00401000, 0x00001000, 0x00000008, + 0x00401000, 0x10001008, 0x10400000, 0x00001000, + 0x00001008, 0x00000000, 0x00400008, 0x10401000, + 0x10001000, 0x10400008, 0x10401008, 0x00400000, + 0x10400008, 0x00001008, 0x00400000, 0x10000008, + 0x00401000, 0x10001000, 0x00000008, 0x10400000, + 0x10001008, 0x00000000, 0x00001000, 0x00400008, + 0x00000000, 0x10400008, 0x10401000, 0x00001000, + 0x10000000, 0x10401008, 0x00401008, 0x00400000, + 0x10401008, 0x00000008, 0x10001000, 0x00401008, + 0x00400008, 0x00401000, 0x10400000, 0x10001008, + 0x00001008, 0x10000000, 0x10000008, 0x10401000, + /* nibble 4 */ + 0x08000000, 0x00010000, 0x00000400, 0x08010420, + 0x08010020, 0x08000400, 0x00010420, 0x08010000, + 0x00010000, 0x00000020, 0x08000020, 0x00010400, + 0x08000420, 0x08010020, 0x08010400, 0x00000000, + 0x00010400, 0x08000000, 0x00010020, 0x00000420, + 0x08000400, 0x00010420, 0x00000000, 0x08000020, + 0x00000020, 0x08000420, 0x08010420, 0x00010020, + 0x08010000, 0x00000400, 0x00000420, 0x08010400, + 0x08010400, 0x08000420, 0x00010020, 0x08010000, + 0x00010000, 0x00000020, 0x08000020, 0x08000400, + 0x08000000, 0x00010400, 0x08010420, 0x00000000, + 0x00010420, 0x08000000, 0x00000400, 0x00010020, + 0x08000420, 0x00000400, 0x00000000, 0x08010420, + 0x08010020, 0x08010400, 0x00000420, 0x00010000, + 0x00010400, 0x08010020, 0x08000400, 0x00000420, + 0x00000020, 0x00010420, 0x08010000, 0x08000020, + /* nibble 5 */ + 0x80000040, 0x00200040, 0x00000000, 0x80202000, + 0x00200040, 0x00002000, 0x80002040, 0x00200000, + 0x00002040, 0x80202040, 0x00202000, 0x80000000, + 0x80002000, 0x80000040, 0x80200000, 0x00202040, + 0x00200000, 0x80002040, 0x80200040, 0x00000000, + 0x00002000, 0x00000040, 0x80202000, 0x80200040, + 0x80202040, 0x80200000, 0x80000000, 0x00002040, + 0x00000040, 0x00202000, 0x00202040, 0x80002000, + 0x00002040, 0x80000000, 0x80002000, 0x00202040, + 0x80202000, 0x00200040, 0x00000000, 0x80002000, + 0x80000000, 0x00002000, 0x80200040, 0x00200000, + 0x00200040, 0x80202040, 0x00202000, 0x00000040, + 0x80202040, 0x00202000, 0x00200000, 0x80002040, + 0x80000040, 0x80200000, 0x00202040, 0x00000000, + 0x00002000, 0x80000040, 0x80002040, 0x80202000, + 0x80200000, 0x00002040, 0x00000040, 0x80200040, + /* nibble 6 */ + 0x00004000, 0x00000200, 0x01000200, 0x01000004, + 0x01004204, 0x00004004, 0x00004200, 0x00000000, + 0x01000000, 0x01000204, 0x00000204, 0x01004000, + 0x00000004, 0x01004200, 0x01004000, 0x00000204, + 0x01000204, 0x00004000, 0x00004004, 0x01004204, + 0x00000000, 0x01000200, 0x01000004, 0x00004200, + 0x01004004, 0x00004204, 0x01004200, 0x00000004, + 0x00004204, 0x01004004, 0x00000200, 0x01000000, + 0x00004204, 0x01004000, 0x01004004, 0x00000204, + 0x00004000, 0x00000200, 0x01000000, 0x01004004, + 0x01000204, 0x00004204, 0x00004200, 0x00000000, + 0x00000200, 0x01000004, 0x00000004, 0x01000200, + 0x00000000, 0x01000204, 0x01000200, 0x00004200, + 0x00000204, 0x00004000, 0x01004204, 0x01000000, + 0x01004200, 0x00000004, 0x00004004, 0x01004204, + 0x01000004, 0x01004200, 0x01004000, 0x00004004, + /* nibble 7 */ + 0x20800080, 0x20820000, 0x00020080, 0x00000000, + 0x20020000, 0x00800080, 0x20800000, 0x20820080, + 0x00000080, 0x20000000, 0x00820000, 0x00020080, + 0x00820080, 0x20020080, 0x20000080, 0x20800000, + 0x00020000, 0x00820080, 0x00800080, 0x20020000, + 0x20820080, 0x20000080, 0x00000000, 0x00820000, + 0x20000000, 0x00800000, 0x20020080, 0x20800080, + 0x00800000, 0x00020000, 0x20820000, 0x00000080, + 0x00800000, 0x00020000, 0x20000080, 0x20820080, + 0x00020080, 0x20000000, 0x00000000, 0x00820000, + 0x20800080, 0x20020080, 0x20020000, 0x00800080, + 0x20820000, 0x00000080, 0x00800080, 0x20020000, + 0x20820080, 0x00800000, 0x20800000, 0x20000080, + 0x00820000, 0x00020080, 0x20020080, 0x20800000, + 0x00000080, 0x20820000, 0x00820080, 0x00000000, + 0x20000000, 0x20800080, 0x00020000, 0x00820080, +}; + +__device__ __constant__ u32 c_skb[8][64] = +{ + /* for C bits (numbered as per FIPS 46) 1 2 3 4 5 6 */ + 0x00000000, 0x00000010, 0x20000000, 0x20000010, + 0x00010000, 0x00010010, 0x20010000, 0x20010010, + 0x00000800, 0x00000810, 0x20000800, 0x20000810, + 0x00010800, 0x00010810, 0x20010800, 0x20010810, + 0x00000020, 0x00000030, 0x20000020, 0x20000030, + 0x00010020, 0x00010030, 0x20010020, 0x20010030, + 0x00000820, 0x00000830, 0x20000820, 0x20000830, + 0x00010820, 0x00010830, 0x20010820, 0x20010830, + 0x00080000, 0x00080010, 0x20080000, 0x20080010, + 0x00090000, 0x00090010, 0x20090000, 0x20090010, + 0x00080800, 0x00080810, 0x20080800, 0x20080810, + 0x00090800, 0x00090810, 0x20090800, 0x20090810, + 0x00080020, 0x00080030, 0x20080020, 0x20080030, + 0x00090020, 0x00090030, 0x20090020, 0x20090030, + 0x00080820, 0x00080830, 0x20080820, 0x20080830, + 0x00090820, 0x00090830, 0x20090820, 0x20090830, + /* for C bits (numbered as per FIPS 46) 7 8 10 11 12 13 */ + 0x00000000, 0x02000000, 0x00002000, 0x02002000, + 0x00200000, 0x02200000, 0x00202000, 0x02202000, + 0x00000004, 0x02000004, 0x00002004, 0x02002004, + 0x00200004, 0x02200004, 0x00202004, 0x02202004, + 0x00000400, 0x02000400, 0x00002400, 0x02002400, + 0x00200400, 0x02200400, 0x00202400, 0x02202400, + 0x00000404, 0x02000404, 0x00002404, 0x02002404, + 0x00200404, 0x02200404, 0x00202404, 0x02202404, + 0x10000000, 0x12000000, 0x10002000, 0x12002000, + 0x10200000, 0x12200000, 0x10202000, 0x12202000, + 0x10000004, 0x12000004, 0x10002004, 0x12002004, + 0x10200004, 0x12200004, 0x10202004, 0x12202004, + 0x10000400, 0x12000400, 0x10002400, 0x12002400, + 0x10200400, 0x12200400, 0x10202400, 0x12202400, + 0x10000404, 0x12000404, 0x10002404, 0x12002404, + 0x10200404, 0x12200404, 0x10202404, 0x12202404, + /* for C bits (numbered as per FIPS 46) 14 15 16 17 19 20 */ + 0x00000000, 0x00000001, 0x00040000, 0x00040001, + 0x01000000, 0x01000001, 0x01040000, 0x01040001, + 0x00000002, 0x00000003, 0x00040002, 0x00040003, + 0x01000002, 0x01000003, 0x01040002, 0x01040003, + 0x00000200, 0x00000201, 0x00040200, 0x00040201, + 0x01000200, 0x01000201, 0x01040200, 0x01040201, + 0x00000202, 0x00000203, 0x00040202, 0x00040203, + 0x01000202, 0x01000203, 0x01040202, 0x01040203, + 0x08000000, 0x08000001, 0x08040000, 0x08040001, + 0x09000000, 0x09000001, 0x09040000, 0x09040001, + 0x08000002, 0x08000003, 0x08040002, 0x08040003, + 0x09000002, 0x09000003, 0x09040002, 0x09040003, + 0x08000200, 0x08000201, 0x08040200, 0x08040201, + 0x09000200, 0x09000201, 0x09040200, 0x09040201, + 0x08000202, 0x08000203, 0x08040202, 0x08040203, + 0x09000202, 0x09000203, 0x09040202, 0x09040203, + /* for C bits (numbered as per FIPS 46) 21 23 24 26 27 28 */ + 0x00000000, 0x00100000, 0x00000100, 0x00100100, + 0x00000008, 0x00100008, 0x00000108, 0x00100108, + 0x00001000, 0x00101000, 0x00001100, 0x00101100, + 0x00001008, 0x00101008, 0x00001108, 0x00101108, + 0x04000000, 0x04100000, 0x04000100, 0x04100100, + 0x04000008, 0x04100008, 0x04000108, 0x04100108, + 0x04001000, 0x04101000, 0x04001100, 0x04101100, + 0x04001008, 0x04101008, 0x04001108, 0x04101108, + 0x00020000, 0x00120000, 0x00020100, 0x00120100, + 0x00020008, 0x00120008, 0x00020108, 0x00120108, + 0x00021000, 0x00121000, 0x00021100, 0x00121100, + 0x00021008, 0x00121008, 0x00021108, 0x00121108, + 0x04020000, 0x04120000, 0x04020100, 0x04120100, + 0x04020008, 0x04120008, 0x04020108, 0x04120108, + 0x04021000, 0x04121000, 0x04021100, 0x04121100, + 0x04021008, 0x04121008, 0x04021108, 0x04121108, + /* for D bits (numbered as per FIPS 46) 1 2 3 4 5 6 */ + 0x00000000, 0x10000000, 0x00010000, 0x10010000, + 0x00000004, 0x10000004, 0x00010004, 0x10010004, + 0x20000000, 0x30000000, 0x20010000, 0x30010000, + 0x20000004, 0x30000004, 0x20010004, 0x30010004, + 0x00100000, 0x10100000, 0x00110000, 0x10110000, + 0x00100004, 0x10100004, 0x00110004, 0x10110004, + 0x20100000, 0x30100000, 0x20110000, 0x30110000, + 0x20100004, 0x30100004, 0x20110004, 0x30110004, + 0x00001000, 0x10001000, 0x00011000, 0x10011000, + 0x00001004, 0x10001004, 0x00011004, 0x10011004, + 0x20001000, 0x30001000, 0x20011000, 0x30011000, + 0x20001004, 0x30001004, 0x20011004, 0x30011004, + 0x00101000, 0x10101000, 0x00111000, 0x10111000, + 0x00101004, 0x10101004, 0x00111004, 0x10111004, + 0x20101000, 0x30101000, 0x20111000, 0x30111000, + 0x20101004, 0x30101004, 0x20111004, 0x30111004, + /* for D bits (numbered as per FIPS 46) 8 9 11 12 13 14 */ + 0x00000000, 0x08000000, 0x00000008, 0x08000008, + 0x00000400, 0x08000400, 0x00000408, 0x08000408, + 0x00020000, 0x08020000, 0x00020008, 0x08020008, + 0x00020400, 0x08020400, 0x00020408, 0x08020408, + 0x00000001, 0x08000001, 0x00000009, 0x08000009, + 0x00000401, 0x08000401, 0x00000409, 0x08000409, + 0x00020001, 0x08020001, 0x00020009, 0x08020009, + 0x00020401, 0x08020401, 0x00020409, 0x08020409, + 0x02000000, 0x0A000000, 0x02000008, 0x0A000008, + 0x02000400, 0x0A000400, 0x02000408, 0x0A000408, + 0x02020000, 0x0A020000, 0x02020008, 0x0A020008, + 0x02020400, 0x0A020400, 0x02020408, 0x0A020408, + 0x02000001, 0x0A000001, 0x02000009, 0x0A000009, + 0x02000401, 0x0A000401, 0x02000409, 0x0A000409, + 0x02020001, 0x0A020001, 0x02020009, 0x0A020009, + 0x02020401, 0x0A020401, 0x02020409, 0x0A020409, + /* for D bits (numbered as per FIPS 46) 16 17 18 19 20 21 */ + 0x00000000, 0x00000100, 0x00080000, 0x00080100, + 0x01000000, 0x01000100, 0x01080000, 0x01080100, + 0x00000010, 0x00000110, 0x00080010, 0x00080110, + 0x01000010, 0x01000110, 0x01080010, 0x01080110, + 0x00200000, 0x00200100, 0x00280000, 0x00280100, + 0x01200000, 0x01200100, 0x01280000, 0x01280100, + 0x00200010, 0x00200110, 0x00280010, 0x00280110, + 0x01200010, 0x01200110, 0x01280010, 0x01280110, + 0x00000200, 0x00000300, 0x00080200, 0x00080300, + 0x01000200, 0x01000300, 0x01080200, 0x01080300, + 0x00000210, 0x00000310, 0x00080210, 0x00080310, + 0x01000210, 0x01000310, 0x01080210, 0x01080310, + 0x00200200, 0x00200300, 0x00280200, 0x00280300, + 0x01200200, 0x01200300, 0x01280200, 0x01280300, + 0x00200210, 0x00200310, 0x00280210, 0x00280310, + 0x01200210, 0x01200310, 0x01280210, 0x01280310, + /* for D bits (numbered as per FIPS 46) 22 23 24 25 27 28 */ + 0x00000000, 0x04000000, 0x00040000, 0x04040000, + 0x00000002, 0x04000002, 0x00040002, 0x04040002, + 0x00002000, 0x04002000, 0x00042000, 0x04042000, + 0x00002002, 0x04002002, 0x00042002, 0x04042002, + 0x00000020, 0x04000020, 0x00040020, 0x04040020, + 0x00000022, 0x04000022, 0x00040022, 0x04040022, + 0x00002020, 0x04002020, 0x00042020, 0x04042020, + 0x00002022, 0x04002022, 0x00042022, 0x04042022, + 0x00000800, 0x04000800, 0x00040800, 0x04040800, + 0x00000802, 0x04000802, 0x00040802, 0x04040802, + 0x00002800, 0x04002800, 0x00042800, 0x04042800, + 0x00002802, 0x04002802, 0x00042802, 0x04042802, + 0x00000820, 0x04000820, 0x00040820, 0x04040820, + 0x00000822, 0x04000822, 0x00040822, 0x04040822, + 0x00002820, 0x04002820, 0x00042820, 0x04042820, + 0x00002822, 0x04002822, 0x00042822, 0x04042822 +}; + +#define LM_IV_0_IP_RR3 0x2400b807 +#define LM_IV_1_IP_RR3 0xaa190747 + +#ifdef VECT_SIZE1 +#define BOX(i,n,S) u32x ((S)[(n)][(i)]) +#endif + +#ifdef VECT_SIZE2 +#define BOX(i,n,S) u32x ((S)[(n)][(i).x], (S)[(n)][(i).y]) +#endif + +__device__ static void _des_crypt_encrypt (u32x iv[2], u32x data[2], u32x Kc[16], u32x Kd[16], u32 s_SPtrans[8][64]) +{ + asm (".reg .u8 c0, c1, c2, c3, c4, c5, c6, c7;"); + + u32x tt; + + u32x r = data[0]; + u32x l = data[1]; + + for (int i = 0; i < 16; i++) + { + u32x u = Kc[i] ^ r; + u32x t = Kd[i] ^ rotl32 (r, 28u); + + u = (u >> 2) & 0x3f3f3f3f; + t = (t >> 2) & 0x3f3f3f3f; + + u32 u0, u1, u2, u3; + u32 t0, t1, t2, t3; + + asm + ( + "mov.b32 {c0, c1, c2, c3}, %8;" + "mov.b32 {c4, c5, c6, c7}, %9;" + "cvt.u32.u8 %0, c0;" + "cvt.u32.u8 %1, c1;" + "cvt.u32.u8 %2, c2;" + "cvt.u32.u8 %3, c3;" + "cvt.u32.u8 %4, c4;" + "cvt.u32.u8 %5, c5;" + "cvt.u32.u8 %6, c6;" + "cvt.u32.u8 %7, c7;" + + : "=r"(u0), "=r"(u1), "=r"(u2), "=r"(u3), + "=r"(t0), "=r"(t1), "=r"(t2), "=r"(t3) + : "r"(u), + "r"(t) + ); + + l ^= BOX (u0, 0, s_SPtrans) + | BOX (u1, 2, s_SPtrans) + | BOX (u2, 4, s_SPtrans) + | BOX (u3, 6, s_SPtrans) + | BOX (t0, 1, s_SPtrans) + | BOX (t1, 3, s_SPtrans) + | BOX (t2, 5, s_SPtrans) + | BOX (t3, 7, s_SPtrans); + + tt = l; + l = r; + r = tt; + } + + iv[0] = rotl32 (l, 29); + iv[1] = rotl32 (r, 29); +} + +__device__ static void _des_crypt_keysetup (u32x c, u32x d, u32x Kc[16], u32x Kd[16], u32 s_skb[8][64]) +{ + u32x tt; + + PERM_OP (d, c, tt, 4, 0x0f0f0f0f); + HPERM_OP (c, tt, 2, 0xcccc0000); + HPERM_OP (d, tt, 2, 0xcccc0000); + PERM_OP (d, c, tt, 1, 0x55555555); + PERM_OP (c, d, tt, 8, 0x00ff00ff); + PERM_OP (d, c, tt, 1, 0x55555555); + + d = ((d & 0x000000ff) << 16) + | ((d & 0x0000ff00) << 0) + | ((d & 0x00ff0000) >> 16) + | ((c & 0xf0000000) >> 4); + + c = c & 0x0fffffff; + + for (u32 i = 0; i < 16; i++) + { + if ((i < 2) || (i == 8) || (i == 15)) + { + c = ((c >> 1) | (c << 27)); + d = ((d >> 1) | (d << 27)); + } + else + { + c = ((c >> 2) | (c << 26)); + d = ((d >> 2) | (d << 26)); + } + + c = c & 0x0fffffff; + d = d & 0x0fffffff; + + const u32x c00 = (c >> 0) & 0x0000003f; + const u32x c06 = (c >> 6) & 0x00383003; + const u32x c07 = (c >> 7) & 0x0000003c; + const u32x c13 = (c >> 13) & 0x0000060f; + const u32x c20 = (c >> 20) & 0x00000001; + + u32x s = BOX (((c00 >> 0) & 0xff), 0, s_skb) + | BOX (((c06 >> 0) & 0xff) + |((c07 >> 0) & 0xff), 1, s_skb) + | BOX (((c13 >> 0) & 0xff) + |((c06 >> 8) & 0xff), 2, s_skb) + | BOX (((c20 >> 0) & 0xff) + |((c13 >> 8) & 0xff) + |((c06 >> 16) & 0xff), 3, s_skb); + + const u32x d00 = (d >> 0) & 0x00003c3f; + const u32x d07 = (d >> 7) & 0x00003f03; + const u32x d21 = (d >> 21) & 0x0000000f; + const u32x d22 = (d >> 22) & 0x00000030; + + u32x t = BOX (((d00 >> 0) & 0xff), 4, s_skb) + | BOX (((d07 >> 0) & 0xff) + |((d00 >> 8) & 0xff), 5, s_skb) + | BOX (((d07 >> 8) & 0xff), 6, s_skb) + | BOX (((d21 >> 0) & 0xff) + |((d22 >> 0) & 0xff), 7, s_skb); + + #if __CUDA_ARCH__ >= 200 + Kc[i] = __byte_perm (s, t, 0x5410); + Kd[i] = __byte_perm (s, t, 0x7632); + #else + Kc[i] = ((t << 16) | (s & 0x0000ffff)); + Kd[i] = ((s >> 16) | (t & 0xffff0000)); + #endif + + Kc[i] = rotl32 (Kc[i], 2u); + Kd[i] = rotl32 (Kd[i], 2u); + } +} + +__device__ static void transform_netntlmv1_key (const u32x w0, const u32x w1, u32x out[2]) +{ + u32x t[8]; + + t[0] = (w0 >> 0) & 0xff; + t[1] = (w0 >> 8) & 0xff; + t[2] = (w0 >> 16) & 0xff; + t[3] = (w0 >> 24) & 0xff; + t[4] = (w1 >> 0) & 0xff; + t[5] = (w1 >> 8) & 0xff; + t[6] = (w1 >> 16) & 0xff; + t[7] = (w1 >> 24) & 0xff; + + u32x k[8]; + + k[0] = (t[0] >> 0); + k[1] = (t[0] << 7) | (t[1] >> 1); + k[2] = (t[1] << 6) | (t[2] >> 2); + k[3] = (t[2] << 5) | (t[3] >> 3); + k[4] = (t[3] << 4) | (t[4] >> 4); + k[5] = (t[4] << 3) | (t[5] >> 5); + k[6] = (t[5] << 2) | (t[6] >> 6); + k[7] = (t[6] << 1); + + out[0] = ((k[0] & 0xff) << 0) + | ((k[1] & 0xff) << 8) + | ((k[2] & 0xff) << 16) + | ((k[3] & 0xff) << 24); + + out[1] = ((k[4] & 0xff) << 0) + | ((k[5] & 0xff) << 8) + | ((k[6] & 0xff) << 16) + | ((k[7] & 0xff) << 24); +} + +__device__ __constant__ comb_t c_combs[1024]; + +extern "C" __global__ void __launch_bounds__ (256, 1) m03000_m04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = 0; + wordl0[3] = 0; + + u32x wordl1[4]; + + wordl1[0] = 0; + wordl1[1] = 0; + wordl1[2] = 0; + wordl1[3] = 0; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, c_combs[0].pw_len); + } + + /** + * sbox, kbox + */ + + __shared__ u32 s_SPtrans[8][64]; + + __shared__ u32 s_skb[8][64]; + + if (lid < 64) + { + s_SPtrans[0][lid] = c_SPtrans[0][lid]; + s_SPtrans[1][lid] = c_SPtrans[1][lid]; + s_SPtrans[2][lid] = c_SPtrans[2][lid]; + s_SPtrans[3][lid] = c_SPtrans[3][lid]; + s_SPtrans[4][lid] = c_SPtrans[4][lid]; + s_SPtrans[5][lid] = c_SPtrans[5][lid]; + s_SPtrans[6][lid] = c_SPtrans[6][lid]; + s_SPtrans[7][lid] = c_SPtrans[7][lid]; + + s_skb[0][lid] = c_skb[0][lid]; + s_skb[1][lid] = c_skb[1][lid]; + s_skb[2][lid] = c_skb[2][lid]; + s_skb[3][lid] = c_skb[3][lid]; + s_skb[4][lid] = c_skb[4][lid]; + s_skb[5][lid] = c_skb[5][lid]; + s_skb[6][lid] = c_skb[6][lid]; + s_skb[7][lid] = c_skb[7][lid]; + } + + __syncthreads (); + + if (gid >= gid_max) return; + + /** + * main + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = c_combs[il_pos].pw_len; + + u32 pw_len = pw_l_len + pw_r_len; + + pw_len = (pw_len >= 7) ? 7 : pw_len; + + u32 wordr0[4]; + + wordr0[0] = c_combs[il_pos].i[0]; + wordr0[1] = c_combs[il_pos].i[1]; + wordr0[2] = 0; + wordr0[3] = 0; + + u32 wordr1[4]; + + wordr1[0] = 0; + wordr1[1] = 0; + wordr1[2] = 0; + wordr1[3] = 0; + + u32 wordr2[4]; + + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + + u32 wordr3[4]; + + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + u32x w0[4]; + + w0[0] = wordl0[0] | wordr0[0]; + w0[1] = wordl0[1] | wordr0[1]; + w0[2] = 0; + w0[3] = 0; + + u32x w1[4]; + + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + u32x key[2]; + + transform_netntlmv1_key (w0[0], w0[1], key); + + const u32x c = key[0]; + const u32x d = key[1]; + + u32x Kc[16]; + u32x Kd[16]; + + _des_crypt_keysetup (c, d, Kc, Kd, s_skb); + + u32x data[2]; + + data[0] = LM_IV_0_IP_RR3; + data[1] = LM_IV_1_IP_RR3; + + u32x iv[2]; + + _des_crypt_encrypt (iv, data, Kc, Kd, s_SPtrans); + + const u32x r0 = iv[0]; + const u32x r1 = iv[1]; + const u32x r2 = 0; + const u32x r3 = 0; + + #include VECT_COMPARE_M + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m03000_m08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m03000_m16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m03000_s04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = 0; + wordl0[3] = 0; + + u32x wordl1[4]; + + wordl1[0] = 0; + wordl1[1] = 0; + wordl1[2] = 0; + wordl1[3] = 0; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, c_combs[0].pw_len); + } + + /** + * sbox, kbox + */ + + __shared__ u32 s_SPtrans[8][64]; + + __shared__ u32 s_skb[8][64]; + + if (lid < 64) + { + s_SPtrans[0][lid] = c_SPtrans[0][lid]; + s_SPtrans[1][lid] = c_SPtrans[1][lid]; + s_SPtrans[2][lid] = c_SPtrans[2][lid]; + s_SPtrans[3][lid] = c_SPtrans[3][lid]; + s_SPtrans[4][lid] = c_SPtrans[4][lid]; + s_SPtrans[5][lid] = c_SPtrans[5][lid]; + s_SPtrans[6][lid] = c_SPtrans[6][lid]; + s_SPtrans[7][lid] = c_SPtrans[7][lid]; + + s_skb[0][lid] = c_skb[0][lid]; + s_skb[1][lid] = c_skb[1][lid]; + s_skb[2][lid] = c_skb[2][lid]; + s_skb[3][lid] = c_skb[3][lid]; + s_skb[4][lid] = c_skb[4][lid]; + s_skb[5][lid] = c_skb[5][lid]; + s_skb[6][lid] = c_skb[6][lid]; + s_skb[7][lid] = c_skb[7][lid]; + } + + __syncthreads (); + + if (gid >= gid_max) return; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * main + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = c_combs[il_pos].pw_len; + + u32 pw_len = pw_l_len + pw_r_len; + + pw_len = (pw_len >= 7) ? 7 : pw_len; + + u32 wordr0[4]; + + wordr0[0] = c_combs[il_pos].i[0]; + wordr0[1] = c_combs[il_pos].i[1]; + wordr0[2] = 0; + wordr0[3] = 0; + + u32 wordr1[4]; + + wordr1[0] = 0; + wordr1[1] = 0; + wordr1[2] = 0; + wordr1[3] = 0; + + u32 wordr2[4]; + + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + + u32 wordr3[4]; + + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + u32x w0[4]; + + w0[0] = wordl0[0] | wordr0[0]; + w0[1] = wordl0[1] | wordr0[1]; + w0[2] = 0; + w0[3] = 0; + + u32x w1[4]; + + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + u32x key[2]; + + transform_netntlmv1_key (w0[0], w0[1], key); + + const u32x c = key[0]; + const u32x d = key[1]; + + u32x Kc[16]; + u32x Kd[16]; + + _des_crypt_keysetup (c, d, Kc, Kd, s_skb); + + u32x data[2]; + + data[0] = LM_IV_0_IP_RR3; + data[1] = LM_IV_1_IP_RR3; + + u32x iv[2]; + + _des_crypt_encrypt (iv, data, Kc, Kd, s_SPtrans); + + const u32x r0 = iv[0]; + const u32x r1 = iv[1]; + const u32x r2 = 0; + const u32x r3 = 0; + + #include VECT_COMPARE_S + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m03000_s08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m03000_s16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/nv/m03000_a3.cu b/nv/m03000_a3.cu new file mode 100644 index 0000000000..9d6d9d98b8 --- /dev/null +++ b/nv/m03000_a3.cu @@ -0,0 +1,1997 @@ +/** + * Author......: Jens Steube + * License.....: MIT + * NOTE........: sboxes for maxwell were taken from DeepLearningJohnDoe, license below + * : sboxes for others were takes fron JtR, license below + */ + +#define _DES_ +#define _SCALAR_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW2 +#define VECT_SIZE1 +#endif + +#define DGST_R0 0 +#define DGST_R1 1 +#define DGST_R2 2 +#define DGST_R3 3 + +#include "include/kernel_functions.c" +#include "types_nv.c" +#include "common_nv.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4_warp_bs.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4_warp_bs.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4_warp_bs.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4_warp_bs.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4_warp_bs.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4_warp_bs.c" +#endif + +#define KXX_DECL + +__device__ __constant__ u32x c_bfs[1024]; +__device__ __constant__ bs_word_t c_tm[32]; +__device__ __shared__ u32 s_S[64]; + +#if __CUDA_ARCH__ >= 500 + +// +// Bitslice DES S-boxes with LOP3.LUT instructions +// For NVIDIA Maxwell architecture and CUDA 7.5 RC +// by DeepLearningJohnDoe, version 0.1.6, 2015/07/19 +// +// Gate counts: 25 24 25 18 25 24 24 23 +// Average: 23.5 +// Depth: 8 7 7 6 8 10 10 8 +// Average: 8 +// +// Note that same S-box function with a lower gate count isn't necessarily faster. +// +// These Boolean expressions corresponding to DES S-boxes were +// discovered by +// +// This file itself is Copyright (c) 2015 by +// Redistribution and use in source and binary forms, with or without +// modification, are permitted. +// +// The underlying mathematical formulas are NOT copyrighted. +// + +#define LUT(a,b,c,d,e) u32 a; asm ("lop3.b32 %0, %1, %2, %3, "#e";" : "=r"(a): "r"(b), "r"(c), "r"(d)); + +__device__ static void s1 (const u32 a1, const u32 a2, const u32 a3, const u32 a4, const u32 a5, const u32 a6, u32 *out1, u32 *out2, u32 *out3, u32 *out4) +{ + LUT(xAA55AA5500550055, a1, a4, a6, 0xC1) + LUT(xA55AA55AF0F5F0F5, a3, a6, xAA55AA5500550055, 0x9E) + LUT(x5F5F5F5FA5A5A5A5, a1, a3, a6, 0xD6) + LUT(xF5A0F5A0A55AA55A, a4, xAA55AA5500550055, x5F5F5F5FA5A5A5A5, 0x56) + LUT(x947A947AD1E7D1E7, a2, xA55AA55AF0F5F0F5, xF5A0F5A0A55AA55A, 0x6C) + LUT(x5FFF5FFFFFFAFFFA, a6, xAA55AA5500550055, x5F5F5F5FA5A5A5A5, 0x7B) + LUT(xB96CB96C69936993, a2, xF5A0F5A0A55AA55A, x5FFF5FFFFFFAFFFA, 0xD6) + LUT(x3, a5, x947A947AD1E7D1E7, xB96CB96C69936993, 0x6A) + LUT(x55EE55EE55EE55EE, a1, a2, a4, 0x7A) + LUT(x084C084CB77BB77B, a2, a6, xF5A0F5A0A55AA55A, 0xC9) + LUT(x9C329C32E295E295, x947A947AD1E7D1E7, x55EE55EE55EE55EE, x084C084CB77BB77B, 0x72) + LUT(xA51EA51E50E050E0, a3, a6, x55EE55EE55EE55EE, 0x29) + LUT(x4AD34AD3BE3CBE3C, a2, x947A947AD1E7D1E7, xA51EA51E50E050E0, 0x95) + LUT(x2, a5, x9C329C32E295E295, x4AD34AD3BE3CBE3C, 0xC6) + LUT(xD955D95595D195D1, a1, a2, x9C329C32E295E295, 0xD2) + LUT(x8058805811621162, x947A947AD1E7D1E7, x55EE55EE55EE55EE, x084C084CB77BB77B, 0x90) + LUT(x7D0F7D0FC4B3C4B3, xA51EA51E50E050E0, xD955D95595D195D1, x8058805811621162, 0x76) + LUT(x0805080500010001, a3, xAA55AA5500550055, xD955D95595D195D1, 0x80) + LUT(x4A964A96962D962D, xB96CB96C69936993, x4AD34AD3BE3CBE3C, x0805080500010001, 0xA6) + LUT(x4, a5, x7D0F7D0FC4B3C4B3, x4A964A96962D962D, 0xA6) + LUT(x148014807B087B08, a1, xAA55AA5500550055, x947A947AD1E7D1E7, 0x21) + LUT(x94D894D86B686B68, xA55AA55AF0F5F0F5, x8058805811621162, x148014807B087B08, 0x6A) + LUT(x5555555540044004, a1, a6, x084C084CB77BB77B, 0x70) + LUT(xAFB4AFB4BF5BBF5B, x5F5F5F5FA5A5A5A5, xA51EA51E50E050E0, x5555555540044004, 0x97) + LUT(x1, a5, x94D894D86B686B68, xAFB4AFB4BF5BBF5B, 0x6C) + + *out1 ^= x1; + *out2 ^= x2; + *out3 ^= x3; + *out4 ^= x4; +} + +__device__ static void s2 (const u32 a1, const u32 a2, const u32 a3, const u32 a4, const u32 a5, const u32 a6, u32 *out1, u32 *out2, u32 *out3, u32 *out4) +{ + LUT(xEEEEEEEE99999999, a1, a2, a6, 0x97) + LUT(xFFFFEEEE66666666, a5, a6, xEEEEEEEE99999999, 0x67) + LUT(x5555FFFFFFFF0000, a1, a5, a6, 0x76) + LUT(x6666DDDD5555AAAA, a2, xFFFFEEEE66666666, x5555FFFFFFFF0000, 0x69) + LUT(x6969D3D35353ACAC, a3, xFFFFEEEE66666666, x6666DDDD5555AAAA, 0x6A) + LUT(xCFCF3030CFCF3030, a2, a3, a5, 0x65) + LUT(xE4E4EEEE9999F0F0, a3, xEEEEEEEE99999999, x5555FFFFFFFF0000, 0x8D) + LUT(xE5E5BABACDCDB0B0, a1, xCFCF3030CFCF3030, xE4E4EEEE9999F0F0, 0xCA) + LUT(x3, a4, x6969D3D35353ACAC, xE5E5BABACDCDB0B0, 0xC6) + LUT(x3333CCCC00000000, a2, a5, a6, 0x14) + LUT(xCCCCDDDDFFFF0F0F, a5, xE4E4EEEE9999F0F0, x3333CCCC00000000, 0xB5) + LUT(x00000101F0F0F0F0, a3, a6, xFFFFEEEE66666666, 0x1C) + LUT(x9A9A64646A6A9595, a1, xCFCF3030CFCF3030, x00000101F0F0F0F0, 0x96) + LUT(x2, a4, xCCCCDDDDFFFF0F0F, x9A9A64646A6A9595, 0x6A) + LUT(x3333BBBB3333FFFF, a1, a2, x6666DDDD5555AAAA, 0xDE) + LUT(x1414141441410000, a1, a3, xE4E4EEEE9999F0F0, 0x90) + LUT(x7F7FF3F3F5F53939, x6969D3D35353ACAC, x9A9A64646A6A9595, x3333BBBB3333FFFF, 0x79) + LUT(x9494E3E34B4B3939, a5, x1414141441410000, x7F7FF3F3F5F53939, 0x29) + LUT(x1, a4, x3333BBBB3333FFFF, x9494E3E34B4B3939, 0xA6) + LUT(xB1B1BBBBCCCCA5A5, a1, a1, xE4E4EEEE9999F0F0, 0x4A) + LUT(xFFFFECECEEEEDDDD, a2, x3333CCCC00000000, x9A9A64646A6A9595, 0xEF) + LUT(xB1B1A9A9DCDC8787, xE5E5BABACDCDB0B0, xB1B1BBBBCCCCA5A5, xFFFFECECEEEEDDDD, 0x8D) + LUT(xFFFFCCCCEEEE4444, a2, a5, xFFFFEEEE66666666, 0x2B) + LUT(x4, a4, xB1B1A9A9DCDC8787, xFFFFCCCCEEEE4444, 0x6C) + + *out1 ^= x1; + *out2 ^= x2; + *out3 ^= x3; + *out4 ^= x4; +} + +__device__ static void s3 (const u32 a1, const u32 a2, const u32 a3, const u32 a4, const u32 a5, const u32 a6, u32 *out1, u32 *out2, u32 *out3, u32 *out4) +{ + LUT(xA50FA50FA50FA50F, a1, a3, a4, 0xC9) + LUT(xF0F00F0FF0F0F0F0, a3, a5, a6, 0x4B) + LUT(xAF0FA0AAAF0FAF0F, a1, xA50FA50FA50FA50F, xF0F00F0FF0F0F0F0, 0x4D) + LUT(x5AA5A55A5AA55AA5, a1, a4, xF0F00F0FF0F0F0F0, 0x69) + LUT(xAA005FFFAA005FFF, a3, a5, xA50FA50FA50FA50F, 0xD6) + LUT(x5AA5A55A0F5AFAA5, a6, x5AA5A55A5AA55AA5, xAA005FFFAA005FFF, 0x9C) + LUT(x1, a2, xAF0FA0AAAF0FAF0F, x5AA5A55A0F5AFAA5, 0xA6) + LUT(xAA55AA5500AA00AA, a1, a4, a6, 0x49) + LUT(xFAFAA50FFAFAA50F, a1, a5, xA50FA50FA50FA50F, 0x9B) + LUT(x50AF0F5AFA50A5A5, a1, xAA55AA5500AA00AA, xFAFAA50FFAFAA50F, 0x66) + LUT(xAFAFAFAFFAFAFAFA, a1, a3, a6, 0x6F) + LUT(xAFAFFFFFFFFAFAFF, a4, x50AF0F5AFA50A5A5, xAFAFAFAFFAFAFAFA, 0xEB) + LUT(x4, a2, x50AF0F5AFA50A5A5, xAFAFFFFFFFFAFAFF, 0x6C) + LUT(x500F500F500F500F, a1, a3, a4, 0x98) + LUT(xF0505A0505A5050F, x5AA5A55A0F5AFAA5, xAA55AA5500AA00AA, xAFAFAFAFFAFAFAFA, 0x1D) + LUT(xF0505A05AA55AAFF, a6, x500F500F500F500F, xF0505A0505A5050F, 0x9A) + LUT(xFF005F55FF005F55, a1, a4, xAA005FFFAA005FFF, 0xB2) + LUT(xA55F5AF0A55F5AF0, a5, xA50FA50FA50FA50F, x5AA5A55A5AA55AA5, 0x3D) + LUT(x5A5F05A5A55F5AF0, a6, xFF005F55FF005F55, xA55F5AF0A55F5AF0, 0xA6) + LUT(x3, a2, xF0505A05AA55AAFF, x5A5F05A5A55F5AF0, 0xA6) + LUT(x0F0F0F0FA5A5A5A5, a1, a3, a6, 0xC6) + LUT(x5FFFFF5FFFA0FFA0, x5AA5A55A5AA55AA5, xAFAFAFAFFAFAFAFA, x0F0F0F0FA5A5A5A5, 0xDB) + LUT(xF5555AF500A05FFF, a5, xFAFAA50FFAFAA50F, xF0505A0505A5050F, 0xB9) + LUT(x05A5AAF55AFA55A5, xF0505A05AA55AAFF, x0F0F0F0FA5A5A5A5, xF5555AF500A05FFF, 0x9B) + LUT(x2, a2, x5FFFFF5FFFA0FFA0, x05A5AAF55AFA55A5, 0xA6) + + *out1 ^= x1; + *out2 ^= x2; + *out3 ^= x3; + *out4 ^= x4; +} + +__device__ static void s4 (const u32 a1, const u32 a2, const u32 a3, const u32 a4, const u32 a5, const u32 a6, u32 *out1, u32 *out2, u32 *out3, u32 *out4) +{ + LUT(x55F055F055F055F0, a1, a3, a4, 0x72) + LUT(xA500F5F0A500F5F0, a3, a5, x55F055F055F055F0, 0xAD) + LUT(xF50AF50AF50AF50A, a1, a3, a4, 0x59) + LUT(xF5FA0FFFF5FA0FFF, a3, a5, xF50AF50AF50AF50A, 0xE7) + LUT(x61C8F93C61C8F93C, a2, xA500F5F0A500F5F0, xF5FA0FFFF5FA0FFF, 0xC6) + LUT(x9999666699996666, a1, a2, a5, 0x69) + LUT(x22C022C022C022C0, a2, a4, x55F055F055F055F0, 0x18) + LUT(xB35C94A6B35C94A6, xF5FA0FFFF5FA0FFF, x9999666699996666, x22C022C022C022C0, 0x63) + LUT(x4, a6, x61C8F93C61C8F93C, xB35C94A6B35C94A6, 0x6A) + LUT(x4848484848484848, a1, a2, a3, 0x12) + LUT(x55500AAA55500AAA, a1, a5, xF5FA0FFFF5FA0FFF, 0x28) + LUT(x3C90B3D63C90B3D6, x61C8F93C61C8F93C, x4848484848484848, x55500AAA55500AAA, 0x1E) + LUT(x8484333384843333, a1, x9999666699996666, x4848484848484848, 0x14) + LUT(x4452F1AC4452F1AC, xF50AF50AF50AF50A, xF5FA0FFFF5FA0FFF, xB35C94A6B35C94A6, 0x78) + LUT(x9586CA379586CA37, x55500AAA55500AAA, x8484333384843333, x4452F1AC4452F1AC, 0xD6) + LUT(x2, a6, x3C90B3D63C90B3D6, x9586CA379586CA37, 0x6A) + LUT(x1, a6, x3C90B3D63C90B3D6, x9586CA379586CA37, 0xA9) + LUT(x3, a6, x61C8F93C61C8F93C, xB35C94A6B35C94A6, 0x56) + + *out1 ^= x1; + *out2 ^= x2; + *out3 ^= x3; + *out4 ^= x4; +} + +__device__ static void s5 (const u32 a1, const u32 a2, const u32 a3, const u32 a4, const u32 a5, const u32 a6, u32 *out1, u32 *out2, u32 *out3, u32 *out4) +{ + LUT(xA0A0A0A0FFFFFFFF, a1, a3, a6, 0xAB) + LUT(xFFFF00005555FFFF, a1, a5, a6, 0xB9) + LUT(xB3B320207777FFFF, a2, xA0A0A0A0FFFFFFFF, xFFFF00005555FFFF, 0xE8) + LUT(x50505A5A5A5A5050, a1, a3, xFFFF00005555FFFF, 0x34) + LUT(xA2A2FFFF2222FFFF, a1, a5, xB3B320207777FFFF, 0xCE) + LUT(x2E2E6969A4A46363, a2, x50505A5A5A5A5050, xA2A2FFFF2222FFFF, 0x29) + LUT(x3, a4, xB3B320207777FFFF, x2E2E6969A4A46363, 0xA6) + LUT(xA5A50A0AA5A50A0A, a1, a3, a5, 0x49) + LUT(x969639396969C6C6, a2, a6, xA5A50A0AA5A50A0A, 0x96) + LUT(x1B1B1B1B1B1B1B1B, a1, a2, a3, 0xCA) + LUT(xBFBFBFBFF6F6F9F9, a3, xA0A0A0A0FFFFFFFF, x969639396969C6C6, 0x7E) + LUT(x5B5BA4A4B8B81D1D, xFFFF00005555FFFF, x1B1B1B1B1B1B1B1B, xBFBFBFBFF6F6F9F9, 0x96) + LUT(x2, a4, x969639396969C6C6, x5B5BA4A4B8B81D1D, 0xCA) + LUT(x5555BBBBFFFF5555, a1, a2, xFFFF00005555FFFF, 0xE5) + LUT(x6D6D9C9C95956969, x50505A5A5A5A5050, xA2A2FFFF2222FFFF, x969639396969C6C6, 0x97) + LUT(x1A1A67676A6AB4B4, xA5A50A0AA5A50A0A, x5555BBBBFFFF5555, x6D6D9C9C95956969, 0x47) + LUT(xA0A0FFFFAAAA0000, a3, xFFFF00005555FFFF, xA5A50A0AA5A50A0A, 0x3B) + LUT(x36369C9CC1C1D6D6, x969639396969C6C6, x6D6D9C9C95956969, xA0A0FFFFAAAA0000, 0xD9) + LUT(x1, a4, x1A1A67676A6AB4B4, x36369C9CC1C1D6D6, 0xCA) + LUT(x5555F0F0F5F55555, a1, a3, xFFFF00005555FFFF, 0xB1) + LUT(x79790202DCDC0808, xA2A2FFFF2222FFFF, xA5A50A0AA5A50A0A, x969639396969C6C6, 0x47) + LUT(x6C6CF2F229295D5D, xBFBFBFBFF6F6F9F9, x5555F0F0F5F55555, x79790202DCDC0808, 0x6E) + LUT(xA3A3505010101A1A, a2, xA2A2FFFF2222FFFF, x36369C9CC1C1D6D6, 0x94) + LUT(x7676C7C74F4FC7C7, a1, x2E2E6969A4A46363, xA3A3505010101A1A, 0xD9) + LUT(x4, a4, x6C6CF2F229295D5D, x7676C7C74F4FC7C7, 0xC6) + + *out1 ^= x1; + *out2 ^= x2; + *out3 ^= x3; + *out4 ^= x4; +} + +__device__ static void s6 (const u32 a1, const u32 a2, const u32 a3, const u32 a4, const u32 a5, const u32 a6, u32 *out1, u32 *out2, u32 *out3, u32 *out4) +{ + LUT(x5050F5F55050F5F5, a1, a3, a5, 0xB2) + LUT(x6363C6C66363C6C6, a1, a2, x5050F5F55050F5F5, 0x66) + LUT(xAAAA5555AAAA5555, a1, a1, a5, 0xA9) + LUT(x3A3A65653A3A6565, a3, x6363C6C66363C6C6, xAAAA5555AAAA5555, 0xA9) + LUT(x5963A3C65963A3C6, a4, x6363C6C66363C6C6, x3A3A65653A3A6565, 0xC6) + LUT(xE7E76565E7E76565, a5, x6363C6C66363C6C6, x3A3A65653A3A6565, 0xAD) + LUT(x455D45DF455D45DF, a1, a4, xE7E76565E7E76565, 0xE4) + LUT(x4, a6, x5963A3C65963A3C6, x455D45DF455D45DF, 0x6C) + LUT(x1101220211012202, a2, xAAAA5555AAAA5555, x5963A3C65963A3C6, 0x20) + LUT(xF00F0FF0F00F0FF0, a3, a4, a5, 0x69) + LUT(x16E94A9716E94A97, xE7E76565E7E76565, x1101220211012202, xF00F0FF0F00F0FF0, 0x9E) + LUT(x2992922929929229, a1, a2, xF00F0FF0F00F0FF0, 0x49) + LUT(xAFAF9823AFAF9823, a5, x5050F5F55050F5F5, x2992922929929229, 0x93) + LUT(x3, a6, x16E94A9716E94A97, xAFAF9823AFAF9823, 0x6C) + LUT(x4801810248018102, a4, x5963A3C65963A3C6, x1101220211012202, 0xA4) + LUT(x5EE8FFFD5EE8FFFD, a5, x16E94A9716E94A97, x4801810248018102, 0x76) + LUT(xF0FF00FFF0FF00FF, a3, a4, a5, 0xCD) + LUT(x942D9A67942D9A67, x3A3A65653A3A6565, x5EE8FFFD5EE8FFFD, xF0FF00FFF0FF00FF, 0x86) + LUT(x1, a6, x5EE8FFFD5EE8FFFD, x942D9A67942D9A67, 0xA6) + LUT(x6A40D4ED6F4DD4EE, a2, x4, xAFAF9823AFAF9823, 0x2D) + LUT(x6CA89C7869A49C79, x1101220211012202, x16E94A9716E94A97, x6A40D4ED6F4DD4EE, 0x26) + LUT(xD6DE73F9D6DE73F9, a3, x6363C6C66363C6C6, x455D45DF455D45DF, 0x6B) + LUT(x925E63E1965A63E1, x3A3A65653A3A6565, x6CA89C7869A49C79, xD6DE73F9D6DE73F9, 0xA2) + LUT(x2, a6, x6CA89C7869A49C79, x925E63E1965A63E1, 0xCA) + + + *out1 ^= x1; + *out2 ^= x2; + *out3 ^= x3; + *out4 ^= x4; +} + +__device__ static void s7 (const u32 a1, const u32 a2, const u32 a3, const u32 a4, const u32 a5, const u32 a6, u32 *out1, u32 *out2, u32 *out3, u32 *out4) +{ + LUT(x88AA88AA88AA88AA, a1, a2, a4, 0x0B) + LUT(xAAAAFF00AAAAFF00, a1, a4, a5, 0x27) + LUT(xADAFF8A5ADAFF8A5, a3, x88AA88AA88AA88AA, xAAAAFF00AAAAFF00, 0x9E) + LUT(x0A0AF5F50A0AF5F5, a1, a3, a5, 0xA6) + LUT(x6B69C5DC6B69C5DC, a2, xADAFF8A5ADAFF8A5, x0A0AF5F50A0AF5F5, 0x6B) + LUT(x1C69B2DC1C69B2DC, a4, x88AA88AA88AA88AA, x6B69C5DC6B69C5DC, 0xA9) + LUT(x1, a6, xADAFF8A5ADAFF8A5, x1C69B2DC1C69B2DC, 0x6A) + LUT(x9C9C9C9C9C9C9C9C, a1, a2, a3, 0x63) + LUT(xE6E63BFDE6E63BFD, a2, xAAAAFF00AAAAFF00, x0A0AF5F50A0AF5F5, 0xE7) + LUT(x6385639E6385639E, a4, x9C9C9C9C9C9C9C9C, xE6E63BFDE6E63BFD, 0x93) + LUT(x5959C4CE5959C4CE, a2, x6B69C5DC6B69C5DC, xE6E63BFDE6E63BFD, 0x5D) + LUT(x5B53F53B5B53F53B, a4, x0A0AF5F50A0AF5F5, x5959C4CE5959C4CE, 0x6E) + LUT(x3, a6, x6385639E6385639E, x5B53F53B5B53F53B, 0xC6) + LUT(xFAF505FAFAF505FA, a3, a4, x0A0AF5F50A0AF5F5, 0x6D) + LUT(x6A65956A6A65956A, a3, x9C9C9C9C9C9C9C9C, xFAF505FAFAF505FA, 0xA6) + LUT(x8888CCCC8888CCCC, a1, a2, a5, 0x23) + LUT(x94E97A9494E97A94, x1C69B2DC1C69B2DC, x6A65956A6A65956A, x8888CCCC8888CCCC, 0x72) + LUT(x4, a6, x6A65956A6A65956A, x94E97A9494E97A94, 0xAC) + LUT(xA050A050A050A050, a1, a3, a4, 0x21) + LUT(xC1B87A2BC1B87A2B, xAAAAFF00AAAAFF00, x5B53F53B5B53F53B, x94E97A9494E97A94, 0xA4) + LUT(xE96016B7E96016B7, x8888CCCC8888CCCC, xA050A050A050A050, xC1B87A2BC1B87A2B, 0x96) + LUT(xE3CF1FD5E3CF1FD5, x88AA88AA88AA88AA, x6A65956A6A65956A, xE96016B7E96016B7, 0x3E) + LUT(x6776675B6776675B, xADAFF8A5ADAFF8A5, x94E97A9494E97A94, xE3CF1FD5E3CF1FD5, 0x6B) + LUT(x2, a6, xE96016B7E96016B7, x6776675B6776675B, 0xC6) + + + *out1 ^= x1; + *out2 ^= x2; + *out3 ^= x3; + *out4 ^= x4; +} + +__device__ static void s8 (const u32 a1, const u32 a2, const u32 a3, const u32 a4, const u32 a5, const u32 a6, u32 *out1, u32 *out2, u32 *out3, u32 *out4) +{ + LUT(xEEEE3333EEEE3333, a1, a2, a5, 0x9D) + LUT(xBBBBBBBBBBBBBBBB, a1, a1, a2, 0x83) + LUT(xDDDDAAAADDDDAAAA, a1, a2, a5, 0x5B) + LUT(x29295A5A29295A5A, a3, xBBBBBBBBBBBBBBBB, xDDDDAAAADDDDAAAA, 0x85) + LUT(xC729695AC729695A, a4, xEEEE3333EEEE3333, x29295A5A29295A5A, 0xA6) + LUT(x3BF77B7B3BF77B7B, a2, a5, xC729695AC729695A, 0xF9) + LUT(x2900FF002900FF00, a4, a5, x29295A5A29295A5A, 0x0E) + LUT(x56B3803F56B3803F, xBBBBBBBBBBBBBBBB, x3BF77B7B3BF77B7B, x2900FF002900FF00, 0x61) + LUT(x4, a6, xC729695AC729695A, x56B3803F56B3803F, 0x6C) + LUT(xFBFBFBFBFBFBFBFB, a1, a2, a3, 0xDF) + LUT(x3012B7B73012B7B7, a2, a5, xC729695AC729695A, 0xD4) + LUT(x34E9B34C34E9B34C, a4, xFBFBFBFBFBFBFBFB, x3012B7B73012B7B7, 0x69) + LUT(xBFEAEBBEBFEAEBBE, a1, x29295A5A29295A5A, x34E9B34C34E9B34C, 0x6F) + LUT(xFFAEAFFEFFAEAFFE, a3, xBBBBBBBBBBBBBBBB, xBFEAEBBEBFEAEBBE, 0xB9) + LUT(x2, a6, x34E9B34C34E9B34C, xFFAEAFFEFFAEAFFE, 0xC6) + LUT(xCFDE88BBCFDE88BB, a2, xDDDDAAAADDDDAAAA, x34E9B34C34E9B34C, 0x5C) + LUT(x3055574530555745, a1, xC729695AC729695A, xCFDE88BBCFDE88BB, 0x71) + LUT(x99DDEEEE99DDEEEE, a4, xBBBBBBBBBBBBBBBB, xDDDDAAAADDDDAAAA, 0xB9) + LUT(x693CD926693CD926, x3BF77B7B3BF77B7B, x34E9B34C34E9B34C, x99DDEEEE99DDEEEE, 0x69) + LUT(x3, a6, x3055574530555745, x693CD926693CD926, 0x6A) + LUT(x9955EE559955EE55, a1, a4, x99DDEEEE99DDEEEE, 0xE2) + LUT(x9D48FA949D48FA94, x3BF77B7B3BF77B7B, xBFEAEBBEBFEAEBBE, x9955EE559955EE55, 0x9C) + LUT(x1, a6, xC729695AC729695A, x9D48FA949D48FA94, 0x39) + + + *out1 ^= x1; + *out2 ^= x2; + *out3 ^= x3; + *out4 ^= x4; +} + +#else + +/* + * Bitslice DES S-boxes for x86 with MMX/SSE2/AVX and for typical RISC + * architectures. These use AND, OR, XOR, NOT, and AND-NOT gates. + * + * Gate counts: 49 44 46 33 48 46 46 41 + * Average: 44.125 + * + * Several same-gate-count expressions for each S-box are included (for use on + * different CPUs/GPUs). + * + * These Boolean expressions corresponding to DES S-boxes have been generated + * by Roman Rusakov for use in Openwall's + * John the Ripper password cracker: http://www.openwall.com/john/ + * Being mathematical formulas, they are not copyrighted and are free for reuse + * by anyone. + * + * This file (a specific representation of the S-box expressions, surrounding + * logic) is Copyright (c) 2011 by Solar Designer . + * Redistribution and use in source and binary forms, with or without + * modification, are permitted. (This is a heavily cut-down "BSD license".) + * + * The effort has been sponsored by Rapid7: http://www.rapid7.com + */ + +__device__ static void s1 (const u32 a1, const u32 a2, const u32 a3, const u32 a4, const u32 a5, const u32 a6, u32 *out1, u32 *out2, u32 *out3, u32 *out4) +{ + u32 x55005500, x5A0F5A0F, x3333FFFF, x66666666, x22226666, x2D2D6969, + x25202160; + u32 x00FFFF00, x33CCCC33, x4803120C, x2222FFFF, x6A21EDF3, x4A01CC93; + u32 x5555FFFF, x7F75FFFF, x00D20096, x7FA7FF69; + u32 x0A0A0000, x0AD80096, x00999900, x0AD99996; + u32 x22332233, x257AA5F0, x054885C0, xFAB77A3F, x2221EDF3, xD89697CC; + u32 x05B77AC0, x05F77AD6, x36C48529, x6391D07C, xBB0747B0; + u32 x4C460000, x4EDF9996, x2D4E49EA, xBBFFFFB0, x96B1B65A; + u32 x5AFF5AFF, x52B11215, x4201C010, x10B0D205; + u32 x00, x01, x10, x11, x20, x21, x30, x31; + + x55005500 = a1 & ~a5; + x5A0F5A0F = a4 ^ x55005500; + x3333FFFF = a3 | a6; + x66666666 = a1 ^ a3; + x22226666 = x3333FFFF & x66666666; + x2D2D6969 = a4 ^ x22226666; + x25202160 = x2D2D6969 & ~x5A0F5A0F; + + x00FFFF00 = a5 ^ a6; + x33CCCC33 = a3 ^ x00FFFF00; + x4803120C = x5A0F5A0F & ~x33CCCC33; + x2222FFFF = a6 | x22226666; + x6A21EDF3 = x4803120C ^ x2222FFFF; + x4A01CC93 = x6A21EDF3 & ~x25202160; + + x5555FFFF = a1 | a6; + x7F75FFFF = x6A21EDF3 | x5555FFFF; + x00D20096 = a5 & ~x2D2D6969; + x7FA7FF69 = x7F75FFFF ^ x00D20096; + + x0A0A0000 = a4 & ~x5555FFFF; + x0AD80096 = x00D20096 ^ x0A0A0000; + x00999900 = x00FFFF00 & ~x66666666; + x0AD99996 = x0AD80096 | x00999900; + + x22332233 = a3 & ~x55005500; + x257AA5F0 = x5A0F5A0F ^ x7F75FFFF; + x054885C0 = x257AA5F0 & ~x22332233; + xFAB77A3F = ~x054885C0; + x2221EDF3 = x3333FFFF & x6A21EDF3; + xD89697CC = xFAB77A3F ^ x2221EDF3; + x20 = x7FA7FF69 & ~a2; + x21 = x20 ^ xD89697CC; + *out3 ^= x21; + + x05B77AC0 = x00FFFF00 ^ x054885C0; + x05F77AD6 = x00D20096 | x05B77AC0; + x36C48529 = x3333FFFF ^ x05F77AD6; + x6391D07C = a1 ^ x36C48529; + xBB0747B0 = xD89697CC ^ x6391D07C; + x00 = x25202160 | a2; + x01 = x00 ^ xBB0747B0; + *out1 ^= x01; + + x4C460000 = x3333FFFF ^ x7F75FFFF; + x4EDF9996 = x0AD99996 | x4C460000; + x2D4E49EA = x6391D07C ^ x4EDF9996; + xBBFFFFB0 = x00FFFF00 | xBB0747B0; + x96B1B65A = x2D4E49EA ^ xBBFFFFB0; + x10 = x4A01CC93 | a2; + x11 = x10 ^ x96B1B65A; + *out2 ^= x11; + + x5AFF5AFF = a5 | x5A0F5A0F; + x52B11215 = x5AFF5AFF & ~x2D4E49EA; + x4201C010 = x4A01CC93 & x6391D07C; + x10B0D205 = x52B11215 ^ x4201C010; + x30 = x10B0D205 | a2; + x31 = x30 ^ x0AD99996; + *out4 ^= x31; +} + +__device__ static void s2 (const u32 a1, const u32 a2, const u32 a3, const u32 a4, const u32 a5, const u32 a6, u32 *out1, u32 *out2, u32 *out3, u32 *out4) +{ + u32 x33CC33CC; + u32 x55550000, x00AA00FF, x33BB33FF; + u32 x33CC0000, x11441144, x11BB11BB, x003311BB; + u32 x00000F0F, x336600FF, x332200FF, x332200F0; + u32 x0302000F, xAAAAAAAA, xA9A8AAA5, x33CCCC33, x33CCC030, x9A646A95; + u32 x00333303, x118822B8, xA8208805, x3CC3C33C, x94E34B39; + u32 x0331330C, x3FF3F33C, xA9DF596A, xA9DF5F6F, x962CAC53; + u32 xA9466A6A, x3DA52153, x29850143, x33C0330C, x1A45324F; + u32 x0A451047, xBBDFDD7B, xB19ACD3C; + u32 x00, x01, x10, x11, x20, x21, x30, x31; + + x33CC33CC = a2 ^ a5; + + x55550000 = a1 & ~a6; + x00AA00FF = a5 & ~x55550000; + x33BB33FF = a2 | x00AA00FF; + + x33CC0000 = x33CC33CC & ~a6; + x11441144 = a1 & x33CC33CC; + x11BB11BB = a5 ^ x11441144; + x003311BB = x11BB11BB & ~x33CC0000; + + x00000F0F = a3 & a6; + x336600FF = x00AA00FF ^ x33CC0000; + x332200FF = x33BB33FF & x336600FF; + x332200F0 = x332200FF & ~x00000F0F; + + x0302000F = a3 & x332200FF; + xAAAAAAAA = ~a1; + xA9A8AAA5 = x0302000F ^ xAAAAAAAA; + x33CCCC33 = a6 ^ x33CC33CC; + x33CCC030 = x33CCCC33 & ~x00000F0F; + x9A646A95 = xA9A8AAA5 ^ x33CCC030; + x10 = a4 & ~x332200F0; + x11 = x10 ^ x9A646A95; + *out2 ^= x11; + + x00333303 = a2 & ~x33CCC030; + x118822B8 = x11BB11BB ^ x00333303; + xA8208805 = xA9A8AAA5 & ~x118822B8; + x3CC3C33C = a3 ^ x33CCCC33; + x94E34B39 = xA8208805 ^ x3CC3C33C; + x00 = x33BB33FF & ~a4; + x01 = x00 ^ x94E34B39; + *out1 ^= x01; + + x0331330C = x0302000F ^ x00333303; + x3FF3F33C = x3CC3C33C | x0331330C; + xA9DF596A = x33BB33FF ^ x9A646A95; + xA9DF5F6F = x00000F0F | xA9DF596A; + x962CAC53 = x3FF3F33C ^ xA9DF5F6F; + + xA9466A6A = x332200FF ^ x9A646A95; + x3DA52153 = x94E34B39 ^ xA9466A6A; + x29850143 = xA9DF5F6F & x3DA52153; + x33C0330C = x33CC33CC & x3FF3F33C; + x1A45324F = x29850143 ^ x33C0330C; + x20 = x1A45324F | a4; + x21 = x20 ^ x962CAC53; + *out3 ^= x21; + + x0A451047 = x1A45324F & ~x118822B8; + xBBDFDD7B = x33CCCC33 | xA9DF596A; + xB19ACD3C = x0A451047 ^ xBBDFDD7B; + x30 = x003311BB | a4; + x31 = x30 ^ xB19ACD3C; + *out4 ^= x31; +} + +__device__ static void s3 (const u32 a1, const u32 a2, const u32 a3, const u32 a4, const u32 a5, const u32 a6, u32 *out1, u32 *out2, u32 *out3, u32 *out4) +{ + u32 x44444444, x0F0FF0F0, x4F4FF4F4, x00FFFF00, x00AAAA00, x4FE55EF4; + u32 x3C3CC3C3, x3C3C0000, x7373F4F4, x0C840A00; + u32 x00005EF4, x00FF5EFF, x00555455, x3C699796; + u32 x000FF000, x55AA55AA, x26D9A15E, x2FDFAF5F, x2FD00F5F; + u32 x55AAFFAA, x28410014, x000000FF, x000000CC, x284100D8; + u32 x204100D0, x3C3CC3FF, x1C3CC32F, x4969967A; + u32 x4CC44CC4, x40C040C0, xC3C33C3C, x9669C396, xD6A98356; + u32 xD6E9C3D6, x4CEEEEC4, x9A072D12, x001A000B, x9A1F2D1B; + u32 x00, x01, x10, x11, x20, x21, x30, x31; + + x44444444 = a1 & ~a2; + x0F0FF0F0 = a3 ^ a6; + x4F4FF4F4 = x44444444 | x0F0FF0F0; + x00FFFF00 = a4 ^ a6; + x00AAAA00 = x00FFFF00 & ~a1; + x4FE55EF4 = x4F4FF4F4 ^ x00AAAA00; + + x3C3CC3C3 = a2 ^ x0F0FF0F0; + x3C3C0000 = x3C3CC3C3 & ~a6; + x7373F4F4 = x4F4FF4F4 ^ x3C3C0000; + x0C840A00 = x4FE55EF4 & ~x7373F4F4; + + x00005EF4 = a6 & x4FE55EF4; + x00FF5EFF = a4 | x00005EF4; + x00555455 = a1 & x00FF5EFF; + x3C699796 = x3C3CC3C3 ^ x00555455; + x30 = x4FE55EF4 & ~a5; + x31 = x30 ^ x3C699796; + *out4 ^= x31; + + x000FF000 = x0F0FF0F0 & x00FFFF00; + x55AA55AA = a1 ^ a4; + x26D9A15E = x7373F4F4 ^ x55AA55AA; + x2FDFAF5F = a3 | x26D9A15E; + x2FD00F5F = x2FDFAF5F & ~x000FF000; + + x55AAFFAA = x00AAAA00 | x55AA55AA; + x28410014 = x3C699796 & ~x55AAFFAA; + x000000FF = a4 & a6; + x000000CC = x000000FF & ~a2; + x284100D8 = x28410014 ^ x000000CC; + + x204100D0 = x7373F4F4 & x284100D8; + x3C3CC3FF = x3C3CC3C3 | x000000FF; + x1C3CC32F = x3C3CC3FF & ~x204100D0; + x4969967A = a1 ^ x1C3CC32F; + x10 = x2FD00F5F & a5; + x11 = x10 ^ x4969967A; + *out2 ^= x11; + + x4CC44CC4 = x4FE55EF4 & ~a2; + x40C040C0 = x4CC44CC4 & ~a3; + xC3C33C3C = ~x3C3CC3C3; + x9669C396 = x55AAFFAA ^ xC3C33C3C; + xD6A98356 = x40C040C0 ^ x9669C396; + x00 = a5 & ~x0C840A00; + x01 = x00 ^ xD6A98356; + *out1 ^= x01; + + xD6E9C3D6 = x40C040C0 | x9669C396; + x4CEEEEC4 = x00AAAA00 | x4CC44CC4; + x9A072D12 = xD6E9C3D6 ^ x4CEEEEC4; + x001A000B = a4 & ~x4FE55EF4; + x9A1F2D1B = x9A072D12 | x001A000B; + x20 = a5 & ~x284100D8; + x21 = x20 ^ x9A1F2D1B; + *out3 ^= x21; +} + +__device__ static void s4 (const u32 a1, const u32 a2, const u32 a3, const u32 a4, const u32 a5, const u32 a6, u32 *out1, u32 *out2, u32 *out3, u32 *out4) +{ + u32 x5A5A5A5A, x0F0FF0F0; + u32 x33FF33FF, x33FFCC00, x0C0030F0, x0C0CC0C0, x0CF3C03F, x5EFBDA7F, + x52FBCA0F, x61C8F93C; + u32 x00C0C03C, x0F0F30C0, x3B92A366, x30908326, x3C90B3D6; + u32 x33CC33CC, x0C0CFFFF, x379E5C99, x04124C11, x56E9861E, xA91679E1; + u32 x9586CA37, x8402C833, x84C2C83F, xB35C94A6; + u32 x00, x01, x10, x11, x20, x21, x30, x31; + + x5A5A5A5A = a1 ^ a3; + x0F0FF0F0 = a3 ^ a5; + x33FF33FF = a2 | a4; + x33FFCC00 = a5 ^ x33FF33FF; + x0C0030F0 = x0F0FF0F0 & ~x33FFCC00; + x0C0CC0C0 = x0F0FF0F0 & ~a2; + x0CF3C03F = a4 ^ x0C0CC0C0; + x5EFBDA7F = x5A5A5A5A | x0CF3C03F; + x52FBCA0F = x5EFBDA7F & ~x0C0030F0; + x61C8F93C = a2 ^ x52FBCA0F; + + x00C0C03C = x0CF3C03F & x61C8F93C; + x0F0F30C0 = x0F0FF0F0 & ~x00C0C03C; + x3B92A366 = x5A5A5A5A ^ x61C8F93C; + x30908326 = x3B92A366 & ~x0F0F30C0; + x3C90B3D6 = x0C0030F0 ^ x30908326; + + x33CC33CC = a2 ^ a4; + x0C0CFFFF = a5 | x0C0CC0C0; + x379E5C99 = x3B92A366 ^ x0C0CFFFF; + x04124C11 = x379E5C99 & ~x33CC33CC; + x56E9861E = x52FBCA0F ^ x04124C11; + x00 = a6 & ~x3C90B3D6; + x01 = x00 ^ x56E9861E; + *out1 ^= x01; + + xA91679E1 = ~x56E9861E; + x10 = x3C90B3D6 & ~a6; + x11 = x10 ^ xA91679E1; + *out2 ^= x11; + + x9586CA37 = x3C90B3D6 ^ xA91679E1; + x8402C833 = x9586CA37 & ~x33CC33CC; + x84C2C83F = x00C0C03C | x8402C833; + xB35C94A6 = x379E5C99 ^ x84C2C83F; + x20 = x61C8F93C | a6; + x21 = x20 ^ xB35C94A6; + *out3 ^= x21; + + x30 = a6 & x61C8F93C; + x31 = x30 ^ xB35C94A6; + *out4 ^= x31; +} + +__device__ static void s5 (const u32 a1, const u32 a2, const u32 a3, const u32 a4, const u32 a5, const u32 a6, u32 *out1, u32 *out2, u32 *out3, u32 *out4) +{ + u32 x77777777, x77770000, x22225555, x11116666, x1F1F6F6F; + u32 x70700000, x43433333, x00430033, x55557777, x55167744, x5A19784B; + u32 x5A1987B4, x7A3BD7F5, x003B00F5, x221955A0, x05050707, x271C52A7; + u32 x2A2A82A0, x6969B193, x1FE06F90, x16804E00, xE97FB1FF; + u32 x43403302, x35CAED30, x37DEFFB7, x349ECCB5, x0B01234A; + u32 x101884B4, x0FF8EB24, x41413333, x4FF9FB37, x4FC2FBC2; + u32 x22222222, x16BCEE97, x0F080B04, x19B4E593; + u32 x5C5C5C5C, x4448184C, x2DDABE71, x6992A63D; + u32 x00, x01, x10, x11, x20, x21, x30, x31; + + x77777777 = a1 | a3; + x77770000 = x77777777 & ~a6; + x22225555 = a1 ^ x77770000; + x11116666 = a3 ^ x22225555; + x1F1F6F6F = a4 | x11116666; + + x70700000 = x77770000 & ~a4; + x43433333 = a3 ^ x70700000; + x00430033 = a5 & x43433333; + x55557777 = a1 | x11116666; + x55167744 = x00430033 ^ x55557777; + x5A19784B = a4 ^ x55167744; + + x5A1987B4 = a6 ^ x5A19784B; + x7A3BD7F5 = x22225555 | x5A1987B4; + x003B00F5 = a5 & x7A3BD7F5; + x221955A0 = x22225555 ^ x003B00F5; + x05050707 = a4 & x55557777; + x271C52A7 = x221955A0 ^ x05050707; + + x2A2A82A0 = x7A3BD7F5 & ~a1; + x6969B193 = x43433333 ^ x2A2A82A0; + x1FE06F90 = a5 ^ x1F1F6F6F; + x16804E00 = x1FE06F90 & ~x6969B193; + xE97FB1FF = ~x16804E00; + x20 = xE97FB1FF & ~a2; + x21 = x20 ^ x5A19784B; + *out3 ^= x21; + + x43403302 = x43433333 & ~x003B00F5; + x35CAED30 = x2A2A82A0 ^ x1FE06F90; + x37DEFFB7 = x271C52A7 | x35CAED30; + x349ECCB5 = x37DEFFB7 & ~x43403302; + x0B01234A = x1F1F6F6F & ~x349ECCB5; + + x101884B4 = x5A1987B4 & x349ECCB5; + x0FF8EB24 = x1FE06F90 ^ x101884B4; + x41413333 = x43433333 & x55557777; + x4FF9FB37 = x0FF8EB24 | x41413333; + x4FC2FBC2 = x003B00F5 ^ x4FF9FB37; + x30 = x4FC2FBC2 & a2; + x31 = x30 ^ x271C52A7; + *out4 ^= x31; + + x22222222 = a1 ^ x77777777; + x16BCEE97 = x349ECCB5 ^ x22222222; + x0F080B04 = a4 & x0FF8EB24; + x19B4E593 = x16BCEE97 ^ x0F080B04; + x00 = x0B01234A | a2; + x01 = x00 ^ x19B4E593; + *out1 ^= x01; + + x5C5C5C5C = x1F1F6F6F ^ x43433333; + x4448184C = x5C5C5C5C & ~x19B4E593; + x2DDABE71 = x22225555 ^ x0FF8EB24; + x6992A63D = x4448184C ^ x2DDABE71; + x10 = x1F1F6F6F & a2; + x11 = x10 ^ x6992A63D; + *out2 ^= x11; +} + +__device__ static void s6 (const u32 a1, const u32 a2, const u32 a3, const u32 a4, const u32 a5, const u32 a6, u32 *out1, u32 *out2, u32 *out3, u32 *out4) +{ + u32 x33CC33CC; + u32 x3333FFFF, x11115555, x22DD6699, x22DD9966, x00220099; + u32 x00551144, x33662277, x5A5A5A5A, x7B7E7A7F, x59A31CE6; + u32 x09030C06, x09030000, x336622FF, x3A6522FF; + u32 x484D494C, x0000B6B3, x0F0FB9BC, x00FC00F9, x0FFFB9FD; + u32 x5DF75DF7, x116600F7, x1E69B94B, x1668B94B; + u32 x7B7B7B7B, x411E5984, x1FFFFDFD, x5EE1A479; + u32 x3CB4DFD2, x004B002D, xB7B2B6B3, xCCC9CDC8, xCC82CDE5; + u32 x0055EEBB, x5A5AECE9, x0050ECA9, xC5CAC1CE, xC59A2D67; + u32 x00, x01, x10, x11, x20, x21, x30, x31; + + x33CC33CC = a2 ^ a5; + + x3333FFFF = a2 | a6; + x11115555 = a1 & x3333FFFF; + x22DD6699 = x33CC33CC ^ x11115555; + x22DD9966 = a6 ^ x22DD6699; + x00220099 = a5 & ~x22DD9966; + + x00551144 = a1 & x22DD9966; + x33662277 = a2 ^ x00551144; + x5A5A5A5A = a1 ^ a3; + x7B7E7A7F = x33662277 | x5A5A5A5A; + x59A31CE6 = x22DD6699 ^ x7B7E7A7F; + + x09030C06 = a3 & x59A31CE6; + x09030000 = x09030C06 & ~a6; + x336622FF = x00220099 | x33662277; + x3A6522FF = x09030000 ^ x336622FF; + x30 = x3A6522FF & a4; + x31 = x30 ^ x59A31CE6; + *out4 ^= x31; + + x484D494C = a2 ^ x7B7E7A7F; + x0000B6B3 = a6 & ~x484D494C; + x0F0FB9BC = a3 ^ x0000B6B3; + x00FC00F9 = a5 & ~x09030C06; + x0FFFB9FD = x0F0FB9BC | x00FC00F9; + + x5DF75DF7 = a1 | x59A31CE6; + x116600F7 = x336622FF & x5DF75DF7; + x1E69B94B = x0F0FB9BC ^ x116600F7; + x1668B94B = x1E69B94B & ~x09030000; + x20 = x00220099 | a4; + x21 = x20 ^ x1668B94B; + *out3 ^= x21; + + x7B7B7B7B = a2 | x5A5A5A5A; + x411E5984 = x3A6522FF ^ x7B7B7B7B; + x1FFFFDFD = x11115555 | x0FFFB9FD; + x5EE1A479 = x411E5984 ^ x1FFFFDFD; + + x3CB4DFD2 = x22DD6699 ^ x1E69B94B; + x004B002D = a5 & ~x3CB4DFD2; + xB7B2B6B3 = ~x484D494C; + xCCC9CDC8 = x7B7B7B7B ^ xB7B2B6B3; + xCC82CDE5 = x004B002D ^ xCCC9CDC8; + x10 = xCC82CDE5 & ~a4; + x11 = x10 ^ x5EE1A479; + *out2 ^= x11; + + x0055EEBB = a6 ^ x00551144; + x5A5AECE9 = a1 ^ x0F0FB9BC; + x0050ECA9 = x0055EEBB & x5A5AECE9; + xC5CAC1CE = x09030C06 ^ xCCC9CDC8; + xC59A2D67 = x0050ECA9 ^ xC5CAC1CE; + x00 = x0FFFB9FD & ~a4; + x01 = x00 ^ xC59A2D67; + *out1 ^= x01; +} + +__device__ static void s7 (const u32 a1, const u32 a2, const u32 a3, const u32 a4, const u32 a5, const u32 a6, u32 *out1, u32 *out2, u32 *out3, u32 *out4) +{ + u32 x0FF00FF0, x3CC33CC3, x00003CC3, x0F000F00, x5A555A55, x00001841; + u32 x00000F00, x33333C33, x7B777E77, x0FF0F00F, x74878E78; + u32 x003C003C, x5A7D5A7D, x333300F0, x694E5A8D; + u32 x0FF0CCCC, x000F0303, x5A505854, x33CC000F, x699C585B; + u32 x7F878F78, x21101013, x7F979F7B, x30030CC0, x4F9493BB; + u32 x6F9CDBFB, x0000DBFB, x00005151, x26DAC936, x26DA9867; + u32 x27DA9877, x27DA438C, x2625C9C9, x27FFCBCD; + u32 x27FF1036, x27FF103E, xB06B6C44, x97947C7A; + u32 x00, x01, x10, x11, x20, x21, x30, x31; + + x0FF00FF0 = a4 ^ a5; + x3CC33CC3 = a3 ^ x0FF00FF0; + x00003CC3 = a6 & x3CC33CC3; + x0F000F00 = a4 & x0FF00FF0; + x5A555A55 = a2 ^ x0F000F00; + x00001841 = x00003CC3 & x5A555A55; + + x00000F00 = a6 & x0F000F00; + x33333C33 = a3 ^ x00000F00; + x7B777E77 = x5A555A55 | x33333C33; + x0FF0F00F = a6 ^ x0FF00FF0; + x74878E78 = x7B777E77 ^ x0FF0F00F; + x30 = a1 & ~x00001841; + x31 = x30 ^ x74878E78; + *out4 ^= x31; + + x003C003C = a5 & ~x3CC33CC3; + x5A7D5A7D = x5A555A55 | x003C003C; + x333300F0 = x00003CC3 ^ x33333C33; + x694E5A8D = x5A7D5A7D ^ x333300F0; + + x0FF0CCCC = x00003CC3 ^ x0FF0F00F; + x000F0303 = a4 & ~x0FF0CCCC; + x5A505854 = x5A555A55 & ~x000F0303; + x33CC000F = a5 ^ x333300F0; + x699C585B = x5A505854 ^ x33CC000F; + + x7F878F78 = x0F000F00 | x74878E78; + x21101013 = a3 & x699C585B; + x7F979F7B = x7F878F78 | x21101013; + x30030CC0 = x3CC33CC3 & ~x0FF0F00F; + x4F9493BB = x7F979F7B ^ x30030CC0; + x00 = x4F9493BB & ~a1; + x01 = x00 ^ x694E5A8D; + *out1 ^= x01; + + x6F9CDBFB = x699C585B | x4F9493BB; + x0000DBFB = a6 & x6F9CDBFB; + x00005151 = a2 & x0000DBFB; + x26DAC936 = x694E5A8D ^ x4F9493BB; + x26DA9867 = x00005151 ^ x26DAC936; + + x27DA9877 = x21101013 | x26DA9867; + x27DA438C = x0000DBFB ^ x27DA9877; + x2625C9C9 = a5 ^ x26DAC936; + x27FFCBCD = x27DA438C | x2625C9C9; + x20 = x27FFCBCD & a1; + x21 = x20 ^ x699C585B; + *out3 ^= x21; + + x27FF1036 = x0000DBFB ^ x27FFCBCD; + x27FF103E = x003C003C | x27FF1036; + xB06B6C44 = ~x4F9493BB; + x97947C7A = x27FF103E ^ xB06B6C44; + x10 = x97947C7A & ~a1; + x11 = x10 ^ x26DA9867; + *out2 ^= x11; +} + +__device__ static void s8 (const u32 a1, const u32 a2, const u32 a3, const u32 a4, const u32 a5, const u32 a6, u32 *out1, u32 *out2, u32 *out3, u32 *out4) +{ + u32 x0C0C0C0C, x0000F0F0, x00FFF00F, x00555005, x00515001; + u32 x33000330, x77555775, x30303030, x3030CFCF, x30104745, x30555745; + u32 xFF000FF0, xCF1048B5, x080A080A, xC71A40BF, xCB164CB3; + u32 x9E4319E6, x000019E6, xF429738C, xF4296A6A, xC729695A; + u32 xC47C3D2F, xF77F3F3F, x9E43E619, x693CD926; + u32 xF719A695, xF4FF73FF, x03E6D56A, x56B3803F; + u32 xF700A600, x61008000, x03B7856B, x62B7056B; + u32 x00, x01, x10, x11, x20, x21, x30, x31; + + x0C0C0C0C = a3 & ~a2; + x0000F0F0 = a5 & ~a3; + x00FFF00F = a4 ^ x0000F0F0; + x00555005 = a1 & x00FFF00F; + x00515001 = x00555005 & ~x0C0C0C0C; + + x33000330 = a2 & ~x00FFF00F; + x77555775 = a1 | x33000330; + x30303030 = a2 & ~a3; + x3030CFCF = a5 ^ x30303030; + x30104745 = x77555775 & x3030CFCF; + x30555745 = x00555005 | x30104745; + + xFF000FF0 = ~x00FFF00F; + xCF1048B5 = x30104745 ^ xFF000FF0; + x080A080A = a3 & ~x77555775; + xC71A40BF = xCF1048B5 ^ x080A080A; + xCB164CB3 = x0C0C0C0C ^ xC71A40BF; + x10 = x00515001 | a6; + x11 = x10 ^ xCB164CB3; + *out2 ^= x11; + + x9E4319E6 = a1 ^ xCB164CB3; + x000019E6 = a5 & x9E4319E6; + xF429738C = a2 ^ xC71A40BF; + xF4296A6A = x000019E6 ^ xF429738C; + xC729695A = x33000330 ^ xF4296A6A; + + xC47C3D2F = x30555745 ^ xF4296A6A; + xF77F3F3F = a2 | xC47C3D2F; + x9E43E619 = a5 ^ x9E4319E6; + x693CD926 = xF77F3F3F ^ x9E43E619; + x20 = x30555745 & a6; + x21 = x20 ^ x693CD926; + *out3 ^= x21; + + xF719A695 = x3030CFCF ^ xC729695A; + xF4FF73FF = a4 | xF429738C; + x03E6D56A = xF719A695 ^ xF4FF73FF; + x56B3803F = a1 ^ x03E6D56A; + x30 = x56B3803F & a6; + x31 = x30 ^ xC729695A; + *out4 ^= x31; + + xF700A600 = xF719A695 & ~a4; + x61008000 = x693CD926 & xF700A600; + x03B7856B = x00515001 ^ x03E6D56A; + x62B7056B = x61008000 ^ x03B7856B; + x00 = x62B7056B | a6; + x01 = x00 ^ xC729695A; + *out1 ^= x01; +} + +#endif + +#define KEYSET00 { k00 = K08; k01 = K44; k02 = K29; k03 = K52; k04 = K42; k05 = K14; k06 = K28; k07 = K49; k08 = K01; k09 = K07; k10 = K16; k11 = K36; k12 = K02; k13 = K30; k14 = K22; k15 = K21; k16 = K38; k17 = K50; k18 = K51; k19 = K00; k20 = K31; k21 = K23; k22 = K15; k23 = K35; k24 = K19; k25 = K24; k26 = K34; k27 = K47; k28 = K32; k29 = K03; k30 = K41; k31 = K26; k32 = K04; k33 = K46; k34 = K20; k35 = K25; k36 = K53; k37 = K18; k38 = K33; k39 = K55; k40 = K13; k41 = K17; k42 = K39; k43 = K12; k44 = K11; k45 = K54; k46 = K48; k47 = K27; } +#define KEYSET10 { k00 = K49; k01 = K28; k02 = K45; k03 = K36; k04 = K01; k05 = K30; k06 = K44; k07 = K08; k08 = K42; k09 = K23; k10 = K00; k11 = K52; k12 = K43; k13 = K14; k14 = K38; k15 = K37; k16 = K22; k17 = K09; k18 = K35; k19 = K16; k20 = K15; k21 = K07; k22 = K31; k23 = K51; k24 = K03; k25 = K40; k26 = K46; k27 = K04; k28 = K20; k29 = K19; k30 = K53; k31 = K10; k32 = K47; k33 = K34; k34 = K32; k35 = K13; k36 = K41; k37 = K06; k38 = K17; k39 = K12; k40 = K25; k41 = K33; k42 = K27; k43 = K55; k44 = K54; k45 = K11; k46 = K05; k47 = K39; } +#define KEYSET01 { k00 = K01; k01 = K37; k02 = K22; k03 = K45; k04 = K35; k05 = K07; k06 = K21; k07 = K42; k08 = K51; k09 = K00; k10 = K09; k11 = K29; k12 = K52; k13 = K23; k14 = K15; k15 = K14; k16 = K31; k17 = K43; k18 = K44; k19 = K50; k20 = K49; k21 = K16; k22 = K08; k23 = K28; k24 = K12; k25 = K17; k26 = K27; k27 = K40; k28 = K25; k29 = K55; k30 = K34; k31 = K19; k32 = K24; k33 = K39; k34 = K13; k35 = K18; k36 = K46; k37 = K11; k38 = K26; k39 = K48; k40 = K06; k41 = K10; k42 = K32; k43 = K05; k44 = K04; k45 = K47; k46 = K41; k47 = K20; } +#define KEYSET11 { k00 = K35; k01 = K14; k02 = K31; k03 = K22; k04 = K44; k05 = K16; k06 = K30; k07 = K51; k08 = K28; k09 = K09; k10 = K43; k11 = K38; k12 = K29; k13 = K00; k14 = K49; k15 = K23; k16 = K08; k17 = K52; k18 = K21; k19 = K02; k20 = K01; k21 = K50; k22 = K42; k23 = K37; k24 = K48; k25 = K26; k26 = K32; k27 = K17; k28 = K06; k29 = K05; k30 = K39; k31 = K55; k32 = K33; k33 = K20; k34 = K18; k35 = K54; k36 = K27; k37 = K47; k38 = K03; k39 = K53; k40 = K11; k41 = K19; k42 = K13; k43 = K41; k44 = K40; k45 = K24; k46 = K46; k47 = K25; } +#define KEYSET02 { k00 = K44; k01 = K23; k02 = K08; k03 = K31; k04 = K21; k05 = K50; k06 = K07; k07 = K28; k08 = K37; k09 = K43; k10 = K52; k11 = K15; k12 = K38; k13 = K09; k14 = K01; k15 = K00; k16 = K42; k17 = K29; k18 = K30; k19 = K36; k20 = K35; k21 = K02; k22 = K51; k23 = K14; k24 = K53; k25 = K03; k26 = K13; k27 = K26; k28 = K11; k29 = K41; k30 = K20; k31 = K05; k32 = K10; k33 = K25; k34 = K54; k35 = K04; k36 = K32; k37 = K24; k38 = K12; k39 = K34; k40 = K47; k41 = K55; k42 = K18; k43 = K46; k44 = K17; k45 = K33; k46 = K27; k47 = K06; } +#define KEYSET12 { k00 = K21; k01 = K00; k02 = K42; k03 = K08; k04 = K30; k05 = K02; k06 = K16; k07 = K37; k08 = K14; k09 = K52; k10 = K29; k11 = K49; k12 = K15; k13 = K43; k14 = K35; k15 = K09; k16 = K51; k17 = K38; k18 = K07; k19 = K45; k20 = K44; k21 = K36; k22 = K28; k23 = K23; k24 = K34; k25 = K12; k26 = K18; k27 = K03; k28 = K47; k29 = K46; k30 = K25; k31 = K41; k32 = K19; k33 = K06; k34 = K04; k35 = K40; k36 = K13; k37 = K33; k38 = K48; k39 = K39; k40 = K24; k41 = K05; k42 = K54; k43 = K27; k44 = K26; k45 = K10; k46 = K32; k47 = K11; } +#define KEYSET03 { k00 = K30; k01 = K09; k02 = K51; k03 = K42; k04 = K07; k05 = K36; k06 = K50; k07 = K14; k08 = K23; k09 = K29; k10 = K38; k11 = K01; k12 = K49; k13 = K52; k14 = K44; k15 = K43; k16 = K28; k17 = K15; k18 = K16; k19 = K22; k20 = K21; k21 = K45; k22 = K37; k23 = K00; k24 = K39; k25 = K48; k26 = K54; k27 = K12; k28 = K24; k29 = K27; k30 = K06; k31 = K46; k32 = K55; k33 = K11; k34 = K40; k35 = K17; k36 = K18; k37 = K10; k38 = K53; k39 = K20; k40 = K33; k41 = K41; k42 = K04; k43 = K32; k44 = K03; k45 = K19; k46 = K13; k47 = K47; } +#define KEYSET13 { k00 = K07; k01 = K43; k02 = K28; k03 = K51; k04 = K16; k05 = K45; k06 = K02; k07 = K23; k08 = K00; k09 = K38; k10 = K15; k11 = K35; k12 = K01; k13 = K29; k14 = K21; k15 = K52; k16 = K37; k17 = K49; k18 = K50; k19 = K31; k20 = K30; k21 = K22; k22 = K14; k23 = K09; k24 = K20; k25 = K53; k26 = K04; k27 = K48; k28 = K33; k29 = K32; k30 = K11; k31 = K27; k32 = K05; k33 = K47; k34 = K17; k35 = K26; k36 = K54; k37 = K19; k38 = K34; k39 = K25; k40 = K10; k41 = K46; k42 = K40; k43 = K13; k44 = K12; k45 = K55; k46 = K18; k47 = K24; } +#define KEYSET04 { k00 = K16; k01 = K52; k02 = K37; k03 = K28; k04 = K50; k05 = K22; k06 = K36; k07 = K00; k08 = K09; k09 = K15; k10 = K49; k11 = K44; k12 = K35; k13 = K38; k14 = K30; k15 = K29; k16 = K14; k17 = K01; k18 = K02; k19 = K08; k20 = K07; k21 = K31; k22 = K23; k23 = K43; k24 = K25; k25 = K34; k26 = K40; k27 = K53; k28 = K10; k29 = K13; k30 = K47; k31 = K32; k32 = K41; k33 = K24; k34 = K26; k35 = K03; k36 = K04; k37 = K55; k38 = K39; k39 = K06; k40 = K19; k41 = K27; k42 = K17; k43 = K18; k44 = K48; k45 = K05; k46 = K54; k47 = K33; } +#define KEYSET14 { k00 = K50; k01 = K29; k02 = K14; k03 = K37; k04 = K02; k05 = K31; k06 = K45; k07 = K09; k08 = K43; k09 = K49; k10 = K01; k11 = K21; k12 = K44; k13 = K15; k14 = K07; k15 = K38; k16 = K23; k17 = K35; k18 = K36; k19 = K42; k20 = K16; k21 = K08; k22 = K00; k23 = K52; k24 = K06; k25 = K39; k26 = K17; k27 = K34; k28 = K19; k29 = K18; k30 = K24; k31 = K13; k32 = K46; k33 = K33; k34 = K03; k35 = K12; k36 = K40; k37 = K05; k38 = K20; k39 = K11; k40 = K55; k41 = K32; k42 = K26; k43 = K54; k44 = K53; k45 = K41; k46 = K04; k47 = K10; } +#define KEYSET05 { k00 = K02; k01 = K38; k02 = K23; k03 = K14; k04 = K36; k05 = K08; k06 = K22; k07 = K43; k08 = K52; k09 = K01; k10 = K35; k11 = K30; k12 = K21; k13 = K49; k14 = K16; k15 = K15; k16 = K00; k17 = K44; k18 = K45; k19 = K51; k20 = K50; k21 = K42; k22 = K09; k23 = K29; k24 = K11; k25 = K20; k26 = K26; k27 = K39; k28 = K55; k29 = K54; k30 = K33; k31 = K18; k32 = K27; k33 = K10; k34 = K12; k35 = K48; k36 = K17; k37 = K41; k38 = K25; k39 = K47; k40 = K05; k41 = K13; k42 = K03; k43 = K04; k44 = K34; k45 = K46; k46 = K40; k47 = K19; } +#define KEYSET15 { k00 = K36; k01 = K15; k02 = K00; k03 = K23; k04 = K45; k05 = K42; k06 = K31; k07 = K52; k08 = K29; k09 = K35; k10 = K44; k11 = K07; k12 = K30; k13 = K01; k14 = K50; k15 = K49; k16 = K09; k17 = K21; k18 = K22; k19 = K28; k20 = K02; k21 = K51; k22 = K43; k23 = K38; k24 = K47; k25 = K25; k26 = K03; k27 = K20; k28 = K05; k29 = K04; k30 = K10; k31 = K54; k32 = K32; k33 = K19; k34 = K48; k35 = K53; k36 = K26; k37 = K46; k38 = K06; k39 = K24; k40 = K41; k41 = K18; k42 = K12; k43 = K40; k44 = K39; k45 = K27; k46 = K17; k47 = K55; } +#define KEYSET06 { k00 = K45; k01 = K49; k02 = K09; k03 = K00; k04 = K22; k05 = K51; k06 = K08; k07 = K29; k08 = K38; k09 = K44; k10 = K21; k11 = K16; k12 = K07; k13 = K35; k14 = K02; k15 = K01; k16 = K43; k17 = K30; k18 = K31; k19 = K37; k20 = K36; k21 = K28; k22 = K52; k23 = K15; k24 = K24; k25 = K06; k26 = K12; k27 = K25; k28 = K41; k29 = K40; k30 = K19; k31 = K04; k32 = K13; k33 = K55; k34 = K53; k35 = K34; k36 = K03; k37 = K27; k38 = K11; k39 = K33; k40 = K46; k41 = K54; k42 = K48; k43 = K17; k44 = K20; k45 = K32; k46 = K26; k47 = K05; } +#define KEYSET16 { k00 = K22; k01 = K01; k02 = K43; k03 = K09; k04 = K31; k05 = K28; k06 = K42; k07 = K38; k08 = K15; k09 = K21; k10 = K30; k11 = K50; k12 = K16; k13 = K44; k14 = K36; k15 = K35; k16 = K52; k17 = K07; k18 = K08; k19 = K14; k20 = K45; k21 = K37; k22 = K29; k23 = K49; k24 = K33; k25 = K11; k26 = K48; k27 = K06; k28 = K46; k29 = K17; k30 = K55; k31 = K40; k32 = K18; k33 = K05; k34 = K34; k35 = K39; k36 = K12; k37 = K32; k38 = K47; k39 = K10; k40 = K27; k41 = K04; k42 = K53; k43 = K26; k44 = K25; k45 = K13; k46 = K03; k47 = K41; } +#define KEYSET07 { k00 = K31; k01 = K35; k02 = K52; k03 = K43; k04 = K08; k05 = K37; k06 = K51; k07 = K15; k08 = K49; k09 = K30; k10 = K07; k11 = K02; k12 = K50; k13 = K21; k14 = K45; k15 = K44; k16 = K29; k17 = K16; k18 = K42; k19 = K23; k20 = K22; k21 = K14; k22 = K38; k23 = K01; k24 = K10; k25 = K47; k26 = K53; k27 = K11; k28 = K27; k29 = K26; k30 = K05; k31 = K17; k32 = K54; k33 = K41; k34 = K39; k35 = K20; k36 = K48; k37 = K13; k38 = K24; k39 = K19; k40 = K32; k41 = K40; k42 = K34; k43 = K03; k44 = K06; k45 = K18; k46 = K12; k47 = K46; } +#define KEYSET17 { k00 = K15; k01 = K51; k02 = K36; k03 = K02; k04 = K49; k05 = K21; k06 = K35; k07 = K31; k08 = K08; k09 = K14; k10 = K23; k11 = K43; k12 = K09; k13 = K37; k14 = K29; k15 = K28; k16 = K45; k17 = K00; k18 = K01; k19 = K07; k20 = K38; k21 = K30; k22 = K22; k23 = K42; k24 = K26; k25 = K04; k26 = K41; k27 = K54; k28 = K39; k29 = K10; k30 = K48; k31 = K33; k32 = K11; k33 = K53; k34 = K27; k35 = K32; k36 = K05; k37 = K25; k38 = K40; k39 = K03; k40 = K20; k41 = K24; k42 = K46; k43 = K19; k44 = K18; k45 = K06; k46 = K55; k47 = K34; } + +__device__ static void DES (const u32 K00, const u32 K01, const u32 K02, const u32 K03, const u32 K04, const u32 K05, const u32 K06, const u32 K07, const u32 K08, const u32 K09, const u32 K10, const u32 K11, const u32 K12, const u32 K13, const u32 K14, const u32 K15, const u32 K16, const u32 K17, const u32 K18, const u32 K19, const u32 K20, const u32 K21, const u32 K22, const u32 K23, const u32 K24, const u32 K25, const u32 K26, const u32 K27, const u32 K28, const u32 K29, const u32 K30, const u32 K31, const u32 K32, const u32 K33, const u32 K34, const u32 K35, const u32 K36, const u32 K37, const u32 K38, const u32 K39, const u32 K40, const u32 K41, const u32 K42, const u32 K43, const u32 K44, const u32 K45, const u32 K46, const u32 K47, const u32 K48, const u32 K49, const u32 K50, const u32 K51, const u32 K52, const u32 K53, const u32 K54, const u32 K55, u32 &D00, u32 &D01, u32 &D02, u32 &D03, u32 &D04, u32 &D05, u32 &D06, u32 &D07, u32 &D08, u32 &D09, u32 &D10, u32 &D11, u32 &D12, u32 &D13, u32 &D14, u32 &D15, u32 &D16, u32 &D17, u32 &D18, u32 &D19, u32 &D20, u32 &D21, u32 &D22, u32 &D23, u32 &D24, u32 &D25, u32 &D26, u32 &D27, u32 &D28, u32 &D29, u32 &D30, u32 &D31, u32 &D32, u32 &D33, u32 &D34, u32 &D35, u32 &D36, u32 &D37, u32 &D38, u32 &D39, u32 &D40, u32 &D41, u32 &D42, u32 &D43, u32 &D44, u32 &D45, u32 &D46, u32 &D47, u32 &D48, u32 &D49, u32 &D50, u32 &D51, u32 &D52, u32 &D53, u32 &D54, u32 &D55, u32 &D56, u32 &D57, u32 &D58, u32 &D59, u32 &D60, u32 &D61, u32 &D62, u32 &D63) +{ + KXX_DECL u32 k00, k01, k02, k03, k04, k05; + KXX_DECL u32 k06, k07, k08, k09, k10, k11; + KXX_DECL u32 k12, k13, k14, k15, k16, k17; + KXX_DECL u32 k18, k19, k20, k21, k22, k23; + KXX_DECL u32 k24, k25, k26, k27, k28, k29; + KXX_DECL u32 k30, k31, k32, k33, k34, k35; + KXX_DECL u32 k36, k37, k38, k39, k40, k41; + KXX_DECL u32 k42, k43, k44, k45, k46, k47; + + // this is essential + + #if __CUDA_ARCH__ >= 500 + #pragma unroll 1 + #else + #pragma unroll + #endif + + for (u32 i = 0; i < 2; i++) + { + if (i) KEYSET10 else KEYSET00 + + s1(D63 ^ k00, D32 ^ k01, D33 ^ k02, D34 ^ k03, D35 ^ k04, D36 ^ k05, &D08, &D16, &D22, &D30); + s2(D35 ^ k06, D36 ^ k07, D37 ^ k08, D38 ^ k09, D39 ^ k10, D40 ^ k11, &D12, &D27, &D01, &D17); + s3(D39 ^ k12, D40 ^ k13, D41 ^ k14, D42 ^ k15, D43 ^ k16, D44 ^ k17, &D23, &D15, &D29, &D05); + s4(D43 ^ k18, D44 ^ k19, D45 ^ k20, D46 ^ k21, D47 ^ k22, D48 ^ k23, &D25, &D19, &D09, &D00); + s5(D47 ^ k24, D48 ^ k25, D49 ^ k26, D50 ^ k27, D51 ^ k28, D52 ^ k29, &D07, &D13, &D24, &D02); + s6(D51 ^ k30, D52 ^ k31, D53 ^ k32, D54 ^ k33, D55 ^ k34, D56 ^ k35, &D03, &D28, &D10, &D18); + s7(D55 ^ k36, D56 ^ k37, D57 ^ k38, D58 ^ k39, D59 ^ k40, D60 ^ k41, &D31, &D11, &D21, &D06); + s8(D59 ^ k42, D60 ^ k43, D61 ^ k44, D62 ^ k45, D63 ^ k46, D32 ^ k47, &D04, &D26, &D14, &D20); + + if (i) KEYSET11 else KEYSET01 + + s1(D31 ^ k00, D00 ^ k01, D01 ^ k02, D02 ^ k03, D03 ^ k04, D04 ^ k05, &D40, &D48, &D54, &D62); + s2(D03 ^ k06, D04 ^ k07, D05 ^ k08, D06 ^ k09, D07 ^ k10, D08 ^ k11, &D44, &D59, &D33, &D49); + s3(D07 ^ k12, D08 ^ k13, D09 ^ k14, D10 ^ k15, D11 ^ k16, D12 ^ k17, &D55, &D47, &D61, &D37); + s4(D11 ^ k18, D12 ^ k19, D13 ^ k20, D14 ^ k21, D15 ^ k22, D16 ^ k23, &D57, &D51, &D41, &D32); + s5(D15 ^ k24, D16 ^ k25, D17 ^ k26, D18 ^ k27, D19 ^ k28, D20 ^ k29, &D39, &D45, &D56, &D34); + s6(D19 ^ k30, D20 ^ k31, D21 ^ k32, D22 ^ k33, D23 ^ k34, D24 ^ k35, &D35, &D60, &D42, &D50); + s7(D23 ^ k36, D24 ^ k37, D25 ^ k38, D26 ^ k39, D27 ^ k40, D28 ^ k41, &D63, &D43, &D53, &D38); + s8(D27 ^ k42, D28 ^ k43, D29 ^ k44, D30 ^ k45, D31 ^ k46, D00 ^ k47, &D36, &D58, &D46, &D52); + + if (i) KEYSET12 else KEYSET02 + + s1(D63 ^ k00, D32 ^ k01, D33 ^ k02, D34 ^ k03, D35 ^ k04, D36 ^ k05, &D08, &D16, &D22, &D30); + s2(D35 ^ k06, D36 ^ k07, D37 ^ k08, D38 ^ k09, D39 ^ k10, D40 ^ k11, &D12, &D27, &D01, &D17); + s3(D39 ^ k12, D40 ^ k13, D41 ^ k14, D42 ^ k15, D43 ^ k16, D44 ^ k17, &D23, &D15, &D29, &D05); + s4(D43 ^ k18, D44 ^ k19, D45 ^ k20, D46 ^ k21, D47 ^ k22, D48 ^ k23, &D25, &D19, &D09, &D00); + s5(D47 ^ k24, D48 ^ k25, D49 ^ k26, D50 ^ k27, D51 ^ k28, D52 ^ k29, &D07, &D13, &D24, &D02); + s6(D51 ^ k30, D52 ^ k31, D53 ^ k32, D54 ^ k33, D55 ^ k34, D56 ^ k35, &D03, &D28, &D10, &D18); + s7(D55 ^ k36, D56 ^ k37, D57 ^ k38, D58 ^ k39, D59 ^ k40, D60 ^ k41, &D31, &D11, &D21, &D06); + s8(D59 ^ k42, D60 ^ k43, D61 ^ k44, D62 ^ k45, D63 ^ k46, D32 ^ k47, &D04, &D26, &D14, &D20); + + if (i) KEYSET13 else KEYSET03 + + s1(D31 ^ k00, D00 ^ k01, D01 ^ k02, D02 ^ k03, D03 ^ k04, D04 ^ k05, &D40, &D48, &D54, &D62); + s2(D03 ^ k06, D04 ^ k07, D05 ^ k08, D06 ^ k09, D07 ^ k10, D08 ^ k11, &D44, &D59, &D33, &D49); + s3(D07 ^ k12, D08 ^ k13, D09 ^ k14, D10 ^ k15, D11 ^ k16, D12 ^ k17, &D55, &D47, &D61, &D37); + s4(D11 ^ k18, D12 ^ k19, D13 ^ k20, D14 ^ k21, D15 ^ k22, D16 ^ k23, &D57, &D51, &D41, &D32); + s5(D15 ^ k24, D16 ^ k25, D17 ^ k26, D18 ^ k27, D19 ^ k28, D20 ^ k29, &D39, &D45, &D56, &D34); + s6(D19 ^ k30, D20 ^ k31, D21 ^ k32, D22 ^ k33, D23 ^ k34, D24 ^ k35, &D35, &D60, &D42, &D50); + s7(D23 ^ k36, D24 ^ k37, D25 ^ k38, D26 ^ k39, D27 ^ k40, D28 ^ k41, &D63, &D43, &D53, &D38); + s8(D27 ^ k42, D28 ^ k43, D29 ^ k44, D30 ^ k45, D31 ^ k46, D00 ^ k47, &D36, &D58, &D46, &D52); + + if (i) KEYSET14 else KEYSET04 + + s1(D63 ^ k00, D32 ^ k01, D33 ^ k02, D34 ^ k03, D35 ^ k04, D36 ^ k05, &D08, &D16, &D22, &D30); + s2(D35 ^ k06, D36 ^ k07, D37 ^ k08, D38 ^ k09, D39 ^ k10, D40 ^ k11, &D12, &D27, &D01, &D17); + s3(D39 ^ k12, D40 ^ k13, D41 ^ k14, D42 ^ k15, D43 ^ k16, D44 ^ k17, &D23, &D15, &D29, &D05); + s4(D43 ^ k18, D44 ^ k19, D45 ^ k20, D46 ^ k21, D47 ^ k22, D48 ^ k23, &D25, &D19, &D09, &D00); + s5(D47 ^ k24, D48 ^ k25, D49 ^ k26, D50 ^ k27, D51 ^ k28, D52 ^ k29, &D07, &D13, &D24, &D02); + s6(D51 ^ k30, D52 ^ k31, D53 ^ k32, D54 ^ k33, D55 ^ k34, D56 ^ k35, &D03, &D28, &D10, &D18); + s7(D55 ^ k36, D56 ^ k37, D57 ^ k38, D58 ^ k39, D59 ^ k40, D60 ^ k41, &D31, &D11, &D21, &D06); + s8(D59 ^ k42, D60 ^ k43, D61 ^ k44, D62 ^ k45, D63 ^ k46, D32 ^ k47, &D04, &D26, &D14, &D20); + + if (i) KEYSET15 else KEYSET05 + + s1(D31 ^ k00, D00 ^ k01, D01 ^ k02, D02 ^ k03, D03 ^ k04, D04 ^ k05, &D40, &D48, &D54, &D62); + s2(D03 ^ k06, D04 ^ k07, D05 ^ k08, D06 ^ k09, D07 ^ k10, D08 ^ k11, &D44, &D59, &D33, &D49); + s3(D07 ^ k12, D08 ^ k13, D09 ^ k14, D10 ^ k15, D11 ^ k16, D12 ^ k17, &D55, &D47, &D61, &D37); + s4(D11 ^ k18, D12 ^ k19, D13 ^ k20, D14 ^ k21, D15 ^ k22, D16 ^ k23, &D57, &D51, &D41, &D32); + s5(D15 ^ k24, D16 ^ k25, D17 ^ k26, D18 ^ k27, D19 ^ k28, D20 ^ k29, &D39, &D45, &D56, &D34); + s6(D19 ^ k30, D20 ^ k31, D21 ^ k32, D22 ^ k33, D23 ^ k34, D24 ^ k35, &D35, &D60, &D42, &D50); + s7(D23 ^ k36, D24 ^ k37, D25 ^ k38, D26 ^ k39, D27 ^ k40, D28 ^ k41, &D63, &D43, &D53, &D38); + s8(D27 ^ k42, D28 ^ k43, D29 ^ k44, D30 ^ k45, D31 ^ k46, D00 ^ k47, &D36, &D58, &D46, &D52); + + if (i) KEYSET16 else KEYSET06 + + s1(D63 ^ k00, D32 ^ k01, D33 ^ k02, D34 ^ k03, D35 ^ k04, D36 ^ k05, &D08, &D16, &D22, &D30); + s2(D35 ^ k06, D36 ^ k07, D37 ^ k08, D38 ^ k09, D39 ^ k10, D40 ^ k11, &D12, &D27, &D01, &D17); + s3(D39 ^ k12, D40 ^ k13, D41 ^ k14, D42 ^ k15, D43 ^ k16, D44 ^ k17, &D23, &D15, &D29, &D05); + s4(D43 ^ k18, D44 ^ k19, D45 ^ k20, D46 ^ k21, D47 ^ k22, D48 ^ k23, &D25, &D19, &D09, &D00); + s5(D47 ^ k24, D48 ^ k25, D49 ^ k26, D50 ^ k27, D51 ^ k28, D52 ^ k29, &D07, &D13, &D24, &D02); + s6(D51 ^ k30, D52 ^ k31, D53 ^ k32, D54 ^ k33, D55 ^ k34, D56 ^ k35, &D03, &D28, &D10, &D18); + s7(D55 ^ k36, D56 ^ k37, D57 ^ k38, D58 ^ k39, D59 ^ k40, D60 ^ k41, &D31, &D11, &D21, &D06); + s8(D59 ^ k42, D60 ^ k43, D61 ^ k44, D62 ^ k45, D63 ^ k46, D32 ^ k47, &D04, &D26, &D14, &D20); + + if (i) KEYSET17 else KEYSET07 + + s1(D31 ^ k00, D00 ^ k01, D01 ^ k02, D02 ^ k03, D03 ^ k04, D04 ^ k05, &D40, &D48, &D54, &D62); + s2(D03 ^ k06, D04 ^ k07, D05 ^ k08, D06 ^ k09, D07 ^ k10, D08 ^ k11, &D44, &D59, &D33, &D49); + s3(D07 ^ k12, D08 ^ k13, D09 ^ k14, D10 ^ k15, D11 ^ k16, D12 ^ k17, &D55, &D47, &D61, &D37); + s4(D11 ^ k18, D12 ^ k19, D13 ^ k20, D14 ^ k21, D15 ^ k22, D16 ^ k23, &D57, &D51, &D41, &D32); + s5(D15 ^ k24, D16 ^ k25, D17 ^ k26, D18 ^ k27, D19 ^ k28, D20 ^ k29, &D39, &D45, &D56, &D34); + s6(D19 ^ k30, D20 ^ k31, D21 ^ k32, D22 ^ k33, D23 ^ k34, D24 ^ k35, &D35, &D60, &D42, &D50); + s7(D23 ^ k36, D24 ^ k37, D25 ^ k38, D26 ^ k39, D27 ^ k40, D28 ^ k41, &D63, &D43, &D53, &D38); + s8(D27 ^ k42, D28 ^ k43, D29 ^ k44, D30 ^ k45, D31 ^ k46, D00 ^ k47, &D36, &D58, &D46, &D52); + } +} + +__device__ static void transpose32c (u32 data[32]) +{ + #define swap(x,y,j,m) \ + t = ((x) ^ ((y) >> (j))) & (m); \ + (x) = (x) ^ t; \ + (y) = (y) ^ (t << (j)); + + u32 t; + + swap (data[ 0], data[16], 16, 0x0000ffff); + swap (data[ 1], data[17], 16, 0x0000ffff); + swap (data[ 2], data[18], 16, 0x0000ffff); + swap (data[ 3], data[19], 16, 0x0000ffff); + swap (data[ 4], data[20], 16, 0x0000ffff); + swap (data[ 5], data[21], 16, 0x0000ffff); + swap (data[ 6], data[22], 16, 0x0000ffff); + swap (data[ 7], data[23], 16, 0x0000ffff); + swap (data[ 8], data[24], 16, 0x0000ffff); + swap (data[ 9], data[25], 16, 0x0000ffff); + swap (data[10], data[26], 16, 0x0000ffff); + swap (data[11], data[27], 16, 0x0000ffff); + swap (data[12], data[28], 16, 0x0000ffff); + swap (data[13], data[29], 16, 0x0000ffff); + swap (data[14], data[30], 16, 0x0000ffff); + swap (data[15], data[31], 16, 0x0000ffff); + swap (data[ 0], data[ 8], 8, 0x00ff00ff); + swap (data[ 1], data[ 9], 8, 0x00ff00ff); + swap (data[ 2], data[10], 8, 0x00ff00ff); + swap (data[ 3], data[11], 8, 0x00ff00ff); + swap (data[ 4], data[12], 8, 0x00ff00ff); + swap (data[ 5], data[13], 8, 0x00ff00ff); + swap (data[ 6], data[14], 8, 0x00ff00ff); + swap (data[ 7], data[15], 8, 0x00ff00ff); + swap (data[ 0], data[ 4], 4, 0x0f0f0f0f); + swap (data[ 1], data[ 5], 4, 0x0f0f0f0f); + swap (data[ 2], data[ 6], 4, 0x0f0f0f0f); + swap (data[ 3], data[ 7], 4, 0x0f0f0f0f); + swap (data[ 0], data[ 2], 2, 0x33333333); + swap (data[ 1], data[ 3], 2, 0x33333333); + swap (data[ 0], data[ 1], 1, 0x55555555); + swap (data[ 2], data[ 3], 1, 0x55555555); + swap (data[ 4], data[ 6], 2, 0x33333333); + swap (data[ 5], data[ 7], 2, 0x33333333); + swap (data[ 4], data[ 5], 1, 0x55555555); + swap (data[ 6], data[ 7], 1, 0x55555555); + swap (data[ 8], data[12], 4, 0x0f0f0f0f); + swap (data[ 9], data[13], 4, 0x0f0f0f0f); + swap (data[10], data[14], 4, 0x0f0f0f0f); + swap (data[11], data[15], 4, 0x0f0f0f0f); + swap (data[ 8], data[10], 2, 0x33333333); + swap (data[ 9], data[11], 2, 0x33333333); + swap (data[ 8], data[ 9], 1, 0x55555555); + swap (data[10], data[11], 1, 0x55555555); + swap (data[12], data[14], 2, 0x33333333); + swap (data[13], data[15], 2, 0x33333333); + swap (data[12], data[13], 1, 0x55555555); + swap (data[14], data[15], 1, 0x55555555); + swap (data[16], data[24], 8, 0x00ff00ff); + swap (data[17], data[25], 8, 0x00ff00ff); + swap (data[18], data[26], 8, 0x00ff00ff); + swap (data[19], data[27], 8, 0x00ff00ff); + swap (data[20], data[28], 8, 0x00ff00ff); + swap (data[21], data[29], 8, 0x00ff00ff); + swap (data[22], data[30], 8, 0x00ff00ff); + swap (data[23], data[31], 8, 0x00ff00ff); + swap (data[16], data[20], 4, 0x0f0f0f0f); + swap (data[17], data[21], 4, 0x0f0f0f0f); + swap (data[18], data[22], 4, 0x0f0f0f0f); + swap (data[19], data[23], 4, 0x0f0f0f0f); + swap (data[16], data[18], 2, 0x33333333); + swap (data[17], data[19], 2, 0x33333333); + swap (data[16], data[17], 1, 0x55555555); + swap (data[18], data[19], 1, 0x55555555); + swap (data[20], data[22], 2, 0x33333333); + swap (data[21], data[23], 2, 0x33333333); + swap (data[20], data[21], 1, 0x55555555); + swap (data[22], data[23], 1, 0x55555555); + swap (data[24], data[28], 4, 0x0f0f0f0f); + swap (data[25], data[29], 4, 0x0f0f0f0f); + swap (data[26], data[30], 4, 0x0f0f0f0f); + swap (data[27], data[31], 4, 0x0f0f0f0f); + swap (data[24], data[26], 2, 0x33333333); + swap (data[25], data[27], 2, 0x33333333); + swap (data[24], data[25], 1, 0x55555555); + swap (data[26], data[27], 1, 0x55555555); + swap (data[28], data[30], 2, 0x33333333); + swap (data[29], data[31], 2, 0x33333333); + swap (data[28], data[29], 1, 0x55555555); + swap (data[30], data[31], 1, 0x55555555); +} + +__device__ static void m03000m (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const u32x *words_buf_r, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset) +{ + + /** + * modifier + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + const u32 lid = threadIdx.x; + + /** + * keys + */ + + const u32 w0s = pws[gid].i[0]; + const u32 w1s = pws[gid].i[1]; + + const u32 K00 = -((w0s >> ( 0 + 7)) & 1); + const u32 K01 = -((w0s >> ( 0 + 6)) & 1); + const u32 K02 = -((w0s >> ( 0 + 5)) & 1); + const u32 K03 = -((w0s >> ( 0 + 4)) & 1); + const u32 K04 = -((w0s >> ( 0 + 3)) & 1); + const u32 K05 = -((w0s >> ( 0 + 2)) & 1); + const u32 K06 = -((w0s >> ( 0 + 1)) & 1); + const u32 K07 = -((w0s >> ( 0 + 0)) & 1); + const u32 K08 = -((w0s >> ( 8 + 7)) & 1); + const u32 K09 = -((w0s >> ( 8 + 6)) & 1); + const u32 K10 = -((w0s >> ( 8 + 5)) & 1); + const u32 K11 = -((w0s >> ( 8 + 4)) & 1); + const u32 K12 = -((w0s >> ( 8 + 3)) & 1); + const u32 K13 = -((w0s >> ( 8 + 2)) & 1); + const u32 K14 = -((w0s >> ( 8 + 1)) & 1); + const u32 K15 = -((w0s >> ( 8 + 0)) & 1); + const u32 K16 = -((w0s >> (16 + 7)) & 1); + const u32 K17 = -((w0s >> (16 + 6)) & 1); + const u32 K18 = -((w0s >> (16 + 5)) & 1); + const u32 K19 = -((w0s >> (16 + 4)) & 1); + const u32 K20 = -((w0s >> (16 + 3)) & 1); + const u32 K21 = -((w0s >> (16 + 2)) & 1); + const u32 K22 = -((w0s >> (16 + 1)) & 1); + const u32 K23 = -((w0s >> (16 + 0)) & 1); + const u32 K24 = -((w0s >> (24 + 7)) & 1); + const u32 K25 = -((w0s >> (24 + 6)) & 1); + const u32 K26 = -((w0s >> (24 + 5)) & 1); + const u32 K27 = -((w0s >> (24 + 4)) & 1); + const u32 K28 = -((w0s >> (24 + 3)) & 1); + const u32 K29 = -((w0s >> (24 + 2)) & 1); + const u32 K30 = -((w0s >> (24 + 1)) & 1); + const u32 K31 = -((w0s >> (24 + 0)) & 1); + const u32 K32 = -((w1s >> ( 0 + 7)) & 1); + const u32 K33 = -((w1s >> ( 0 + 6)) & 1); + const u32 K34 = -((w1s >> ( 0 + 5)) & 1); + const u32 K35 = -((w1s >> ( 0 + 4)) & 1); + const u32 K36 = -((w1s >> ( 0 + 3)) & 1); + const u32 K37 = -((w1s >> ( 0 + 2)) & 1); + const u32 K38 = -((w1s >> ( 0 + 1)) & 1); + const u32 K39 = -((w1s >> ( 0 + 0)) & 1); + const u32 K40 = -((w1s >> ( 8 + 7)) & 1); + const u32 K41 = -((w1s >> ( 8 + 6)) & 1); + const u32 K42 = -((w1s >> ( 8 + 5)) & 1); + const u32 K43 = -((w1s >> ( 8 + 4)) & 1); + const u32 K44 = -((w1s >> ( 8 + 3)) & 1); + const u32 K45 = -((w1s >> ( 8 + 2)) & 1); + const u32 K46 = -((w1s >> ( 8 + 1)) & 1); + const u32 K47 = -((w1s >> ( 8 + 0)) & 1); + const u32 K48 = -((w1s >> (16 + 7)) & 1); + const u32 K49 = -((w1s >> (16 + 6)) & 1); + const u32 K50 = -((w1s >> (16 + 5)) & 1); + const u32 K51 = -((w1s >> (16 + 4)) & 1); + const u32 K52 = -((w1s >> (16 + 3)) & 1); + const u32 K53 = -((w1s >> (16 + 2)) & 1); + const u32 K54 = -((w1s >> (16 + 1)) & 1); + const u32 K55 = -((w1s >> (16 + 0)) & 1); + + /** + * loop + */ + + const u32 bf_loops = bfs_cnt; + + for (u32 il_pos = 0, pc_pos = 0; il_pos < bf_loops; il_pos += 32, pc_pos++) + { + u32 k00 = K00; + u32 k01 = K01; + u32 k02 = K02; + u32 k03 = K03; + u32 k04 = K04; + u32 k05 = K05; + u32 k06 = K06; + u32 k07 = K07; + u32 k08 = K08; + u32 k09 = K09; + u32 k10 = K10; + u32 k11 = K11; + u32 k12 = K12; + u32 k13 = K13; + u32 k14 = K14; + u32 k15 = K15; + u32 k16 = K16; + u32 k17 = K17; + u32 k18 = K18; + u32 k19 = K19; + u32 k20 = K20; + u32 k21 = K21; + u32 k22 = K22; + u32 k23 = K23; + u32 k24 = K24; + u32 k25 = K25; + u32 k26 = K26; + u32 k27 = K27; + u32 k28 = K28; + u32 k29 = K29; + u32 k30 = K30; + u32 k31 = K31; + + k00 |= c_tm[pc_pos].b[ 0]; + k01 |= c_tm[pc_pos].b[ 1]; + k02 |= c_tm[pc_pos].b[ 2]; + k03 |= c_tm[pc_pos].b[ 3]; + k04 |= c_tm[pc_pos].b[ 4]; + k05 |= c_tm[pc_pos].b[ 5]; + k06 |= c_tm[pc_pos].b[ 6]; + k07 |= c_tm[pc_pos].b[ 7]; + k08 |= c_tm[pc_pos].b[ 8]; + k09 |= c_tm[pc_pos].b[ 9]; + k10 |= c_tm[pc_pos].b[10]; + k11 |= c_tm[pc_pos].b[11]; + k12 |= c_tm[pc_pos].b[12]; + k13 |= c_tm[pc_pos].b[13]; + k14 |= c_tm[pc_pos].b[14]; + k15 |= c_tm[pc_pos].b[15]; + k16 |= c_tm[pc_pos].b[16]; + k17 |= c_tm[pc_pos].b[17]; + k18 |= c_tm[pc_pos].b[18]; + k19 |= c_tm[pc_pos].b[19]; + k20 |= c_tm[pc_pos].b[20]; + k21 |= c_tm[pc_pos].b[21]; + k22 |= c_tm[pc_pos].b[22]; + k23 |= c_tm[pc_pos].b[23]; + k24 |= c_tm[pc_pos].b[24]; + k25 |= c_tm[pc_pos].b[25]; + k26 |= c_tm[pc_pos].b[26]; + k27 |= c_tm[pc_pos].b[27]; + k28 |= c_tm[pc_pos].b[28]; + k29 |= c_tm[pc_pos].b[29]; + k30 |= c_tm[pc_pos].b[30]; + k31 |= c_tm[pc_pos].b[31]; + + u32 D00 = 0; + u32 D01 = 0; + u32 D02 = 0; + u32 D03 = 0xffffffff; + u32 D04 = 0; + u32 D05 = 0xffffffff; + u32 D06 = 0xffffffff; + u32 D07 = 0xffffffff; + u32 D08 = 0; + u32 D09 = 0; + u32 D10 = 0; + u32 D11 = 0; + u32 D12 = 0; + u32 D13 = 0xffffffff; + u32 D14 = 0; + u32 D15 = 0; + u32 D16 = 0xffffffff; + u32 D17 = 0xffffffff; + u32 D18 = 0; + u32 D19 = 0; + u32 D20 = 0; + u32 D21 = 0; + u32 D22 = 0xffffffff; + u32 D23 = 0; + u32 D24 = 0xffffffff; + u32 D25 = 0; + u32 D26 = 0xffffffff; + u32 D27 = 0; + u32 D28 = 0xffffffff; + u32 D29 = 0xffffffff; + u32 D30 = 0xffffffff; + u32 D31 = 0xffffffff; + u32 D32 = 0; + u32 D33 = 0; + u32 D34 = 0; + u32 D35 = 0; + u32 D36 = 0; + u32 D37 = 0; + u32 D38 = 0; + u32 D39 = 0; + u32 D40 = 0xffffffff; + u32 D41 = 0xffffffff; + u32 D42 = 0xffffffff; + u32 D43 = 0; + u32 D44 = 0xffffffff; + u32 D45 = 0; + u32 D46 = 0; + u32 D47 = 0; + u32 D48 = 0; + u32 D49 = 0; + u32 D50 = 0; + u32 D51 = 0; + u32 D52 = 0; + u32 D53 = 0; + u32 D54 = 0; + u32 D55 = 0xffffffff; + u32 D56 = 0; + u32 D57 = 0; + u32 D58 = 0xffffffff; + u32 D59 = 0; + u32 D60 = 0; + u32 D61 = 0xffffffff; + u32 D62 = 0xffffffff; + u32 D63 = 0xffffffff; + + DES + ( + k00, k01, k02, k03, k04, k05, k06, + k07, k08, k09, k10, k11, k12, k13, + k14, k15, k16, k17, k18, k19, k20, + k21, k22, k23, k24, k25, k26, k27, + k28, k29, k30, k31, K32, K33, K34, + K35, K36, K37, K38, K39, K40, K41, + K42, K43, K44, K45, K46, K47, K48, + K49, K50, K51, K52, K53, K54, K55, + D00, D01, D02, D03, D04, D05, D06, D07, + D08, D09, D10, D11, D12, D13, D14, D15, + D16, D17, D18, D19, D20, D21, D22, D23, + D24, D25, D26, D27, D28, D29, D30, D31, + D32, D33, D34, D35, D36, D37, D38, D39, + D40, D41, D42, D43, D44, D45, D46, D47, + D48, D49, D50, D51, D52, D53, D54, D55, + D56, D57, D58, D59, D60, D61, D62, D63 + ); + + u32 out[64]; + + out[ 0] = D00; + out[ 1] = D01; + out[ 2] = D02; + out[ 3] = D03; + out[ 4] = D04; + out[ 5] = D05; + out[ 6] = D06; + out[ 7] = D07; + out[ 8] = D08; + out[ 9] = D09; + out[10] = D10; + out[11] = D11; + out[12] = D12; + out[13] = D13; + out[14] = D14; + out[15] = D15; + out[16] = D16; + out[17] = D17; + out[18] = D18; + out[19] = D19; + out[20] = D20; + out[21] = D21; + out[22] = D22; + out[23] = D23; + out[24] = D24; + out[25] = D25; + out[26] = D26; + out[27] = D27; + out[28] = D28; + out[29] = D29; + out[30] = D30; + out[31] = D31; + out[32] = D32; + out[33] = D33; + out[34] = D34; + out[35] = D35; + out[36] = D36; + out[37] = D37; + out[38] = D38; + out[39] = D39; + out[40] = D40; + out[41] = D41; + out[42] = D42; + out[43] = D43; + out[44] = D44; + out[45] = D45; + out[46] = D46; + out[47] = D47; + out[48] = D48; + out[49] = D49; + out[50] = D50; + out[51] = D51; + out[52] = D52; + out[53] = D53; + out[54] = D54; + out[55] = D55; + out[56] = D56; + out[57] = D57; + out[58] = D58; + out[59] = D59; + out[60] = D60; + out[61] = D61; + out[62] = D62; + out[63] = D63; + + if (digests_cnt < 16) + { + for (u32 d = 0; d < digests_cnt; d++) + { + const u32 final_hash_pos = digests_offset + d; + + if (hashes_shown[final_hash_pos]) continue; + + u32 search[2]; + + search[0] = digests_buf[final_hash_pos].digest_buf[DGST_R0]; + search[1] = digests_buf[final_hash_pos].digest_buf[DGST_R1]; + + u32 tmpResult = 0; + + #pragma unroll + for (int i = 0; i < 32; i++) + { + const u32 b0 = -((search[0] >> i) & 1); + const u32 b1 = -((search[1] >> i) & 1); + + tmpResult |= out[ 0 + i] ^ b0; + tmpResult |= out[32 + i] ^ b1; + } + + if (tmpResult == 0xffffffff) continue; + + const u32 slice = 31 - __clz (~tmpResult); + + const u32x r0 = search[0]; + const u32x r1 = search[1]; + const u32x r2 = 0; + const u32x r3 = 0; + + #include VECT_COMPARE_M + } + } + else + { + u32 out0[32]; + u32 out1[32]; + + #pragma unroll + for (int i = 0; i < 32; i++) + { + out0[i] = out[ 0 + 31 - i]; + out1[i] = out[32 + 31 - i]; + } + + transpose32c (out0); + transpose32c (out1); + + #pragma unroll + for (int slice = 0; slice < 32; slice++) + { + const u32x r0 = out0[31 - slice]; + const u32x r1 = out1[31 - slice]; + const u32x r2 = 0; + const u32x r3 = 0; + + #include VECT_COMPARE_M + } + } + } +} + +__device__ static void m03000s (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const u32x *words_buf_r, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset) +{ + /** + * modifier + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + const u32 lid = threadIdx.x; + + /** + * digest + */ + + #define S00 s_S[ 0] + #define S01 s_S[ 1] + #define S02 s_S[ 2] + #define S03 s_S[ 3] + #define S04 s_S[ 4] + #define S05 s_S[ 5] + #define S06 s_S[ 6] + #define S07 s_S[ 7] + #define S08 s_S[ 8] + #define S09 s_S[ 9] + #define S10 s_S[10] + #define S11 s_S[11] + #define S12 s_S[12] + #define S13 s_S[13] + #define S14 s_S[14] + #define S15 s_S[15] + #define S16 s_S[16] + #define S17 s_S[17] + #define S18 s_S[18] + #define S19 s_S[19] + #define S20 s_S[20] + #define S21 s_S[21] + #define S22 s_S[22] + #define S23 s_S[23] + #define S24 s_S[24] + #define S25 s_S[25] + #define S26 s_S[26] + #define S27 s_S[27] + #define S28 s_S[28] + #define S29 s_S[29] + #define S30 s_S[30] + #define S31 s_S[31] + #define S32 s_S[32] + #define S33 s_S[33] + #define S34 s_S[34] + #define S35 s_S[35] + #define S36 s_S[36] + #define S37 s_S[37] + #define S38 s_S[38] + #define S39 s_S[39] + #define S40 s_S[40] + #define S41 s_S[41] + #define S42 s_S[42] + #define S43 s_S[43] + #define S44 s_S[44] + #define S45 s_S[45] + #define S46 s_S[46] + #define S47 s_S[47] + #define S48 s_S[48] + #define S49 s_S[49] + #define S50 s_S[50] + #define S51 s_S[51] + #define S52 s_S[52] + #define S53 s_S[53] + #define S54 s_S[54] + #define S55 s_S[55] + #define S56 s_S[56] + #define S57 s_S[57] + #define S58 s_S[58] + #define S59 s_S[59] + #define S60 s_S[60] + #define S61 s_S[61] + #define S62 s_S[62] + #define S63 s_S[63] + + /** + * keys + */ + + const u32 w0s = pws[gid].i[0]; + const u32 w1s = pws[gid].i[1]; + + const u32 K00 = -((w0s >> ( 0 + 7)) & 1); + const u32 K01 = -((w0s >> ( 0 + 6)) & 1); + const u32 K02 = -((w0s >> ( 0 + 5)) & 1); + const u32 K03 = -((w0s >> ( 0 + 4)) & 1); + const u32 K04 = -((w0s >> ( 0 + 3)) & 1); + const u32 K05 = -((w0s >> ( 0 + 2)) & 1); + const u32 K06 = -((w0s >> ( 0 + 1)) & 1); + const u32 K07 = -((w0s >> ( 0 + 0)) & 1); + const u32 K08 = -((w0s >> ( 8 + 7)) & 1); + const u32 K09 = -((w0s >> ( 8 + 6)) & 1); + const u32 K10 = -((w0s >> ( 8 + 5)) & 1); + const u32 K11 = -((w0s >> ( 8 + 4)) & 1); + const u32 K12 = -((w0s >> ( 8 + 3)) & 1); + const u32 K13 = -((w0s >> ( 8 + 2)) & 1); + const u32 K14 = -((w0s >> ( 8 + 1)) & 1); + const u32 K15 = -((w0s >> ( 8 + 0)) & 1); + const u32 K16 = -((w0s >> (16 + 7)) & 1); + const u32 K17 = -((w0s >> (16 + 6)) & 1); + const u32 K18 = -((w0s >> (16 + 5)) & 1); + const u32 K19 = -((w0s >> (16 + 4)) & 1); + const u32 K20 = -((w0s >> (16 + 3)) & 1); + const u32 K21 = -((w0s >> (16 + 2)) & 1); + const u32 K22 = -((w0s >> (16 + 1)) & 1); + const u32 K23 = -((w0s >> (16 + 0)) & 1); + const u32 K24 = -((w0s >> (24 + 7)) & 1); + const u32 K25 = -((w0s >> (24 + 6)) & 1); + const u32 K26 = -((w0s >> (24 + 5)) & 1); + const u32 K27 = -((w0s >> (24 + 4)) & 1); + const u32 K28 = -((w0s >> (24 + 3)) & 1); + const u32 K29 = -((w0s >> (24 + 2)) & 1); + const u32 K30 = -((w0s >> (24 + 1)) & 1); + const u32 K31 = -((w0s >> (24 + 0)) & 1); + const u32 K32 = -((w1s >> ( 0 + 7)) & 1); + const u32 K33 = -((w1s >> ( 0 + 6)) & 1); + const u32 K34 = -((w1s >> ( 0 + 5)) & 1); + const u32 K35 = -((w1s >> ( 0 + 4)) & 1); + const u32 K36 = -((w1s >> ( 0 + 3)) & 1); + const u32 K37 = -((w1s >> ( 0 + 2)) & 1); + const u32 K38 = -((w1s >> ( 0 + 1)) & 1); + const u32 K39 = -((w1s >> ( 0 + 0)) & 1); + const u32 K40 = -((w1s >> ( 8 + 7)) & 1); + const u32 K41 = -((w1s >> ( 8 + 6)) & 1); + const u32 K42 = -((w1s >> ( 8 + 5)) & 1); + const u32 K43 = -((w1s >> ( 8 + 4)) & 1); + const u32 K44 = -((w1s >> ( 8 + 3)) & 1); + const u32 K45 = -((w1s >> ( 8 + 2)) & 1); + const u32 K46 = -((w1s >> ( 8 + 1)) & 1); + const u32 K47 = -((w1s >> ( 8 + 0)) & 1); + const u32 K48 = -((w1s >> (16 + 7)) & 1); + const u32 K49 = -((w1s >> (16 + 6)) & 1); + const u32 K50 = -((w1s >> (16 + 5)) & 1); + const u32 K51 = -((w1s >> (16 + 4)) & 1); + const u32 K52 = -((w1s >> (16 + 3)) & 1); + const u32 K53 = -((w1s >> (16 + 2)) & 1); + const u32 K54 = -((w1s >> (16 + 1)) & 1); + const u32 K55 = -((w1s >> (16 + 0)) & 1); + + /** + * loop + */ + + const u32 bf_loops = bfs_cnt; + + for (u32 il_pos = 0, pc_pos = 0; il_pos < bf_loops; il_pos += 32, pc_pos++) + { + u32 k00 = K00; + u32 k01 = K01; + u32 k02 = K02; + u32 k03 = K03; + u32 k04 = K04; + u32 k05 = K05; + u32 k06 = K06; + u32 k07 = K07; + u32 k08 = K08; + u32 k09 = K09; + u32 k10 = K10; + u32 k11 = K11; + u32 k12 = K12; + u32 k13 = K13; + u32 k14 = K14; + u32 k15 = K15; + u32 k16 = K16; + u32 k17 = K17; + u32 k18 = K18; + u32 k19 = K19; + u32 k20 = K20; + u32 k21 = K21; + u32 k22 = K22; + u32 k23 = K23; + u32 k24 = K24; + u32 k25 = K25; + u32 k26 = K26; + u32 k27 = K27; + u32 k28 = K28; + u32 k29 = K29; + u32 k30 = K30; + u32 k31 = K31; + + k00 |= c_tm[pc_pos].b[ 0]; + k01 |= c_tm[pc_pos].b[ 1]; + k02 |= c_tm[pc_pos].b[ 2]; + k03 |= c_tm[pc_pos].b[ 3]; + k04 |= c_tm[pc_pos].b[ 4]; + k05 |= c_tm[pc_pos].b[ 5]; + k06 |= c_tm[pc_pos].b[ 6]; + k07 |= c_tm[pc_pos].b[ 7]; + k08 |= c_tm[pc_pos].b[ 8]; + k09 |= c_tm[pc_pos].b[ 9]; + k10 |= c_tm[pc_pos].b[10]; + k11 |= c_tm[pc_pos].b[11]; + k12 |= c_tm[pc_pos].b[12]; + k13 |= c_tm[pc_pos].b[13]; + k14 |= c_tm[pc_pos].b[14]; + k15 |= c_tm[pc_pos].b[15]; + k16 |= c_tm[pc_pos].b[16]; + k17 |= c_tm[pc_pos].b[17]; + k18 |= c_tm[pc_pos].b[18]; + k19 |= c_tm[pc_pos].b[19]; + k20 |= c_tm[pc_pos].b[20]; + k21 |= c_tm[pc_pos].b[21]; + k22 |= c_tm[pc_pos].b[22]; + k23 |= c_tm[pc_pos].b[23]; + k24 |= c_tm[pc_pos].b[24]; + k25 |= c_tm[pc_pos].b[25]; + k26 |= c_tm[pc_pos].b[26]; + k27 |= c_tm[pc_pos].b[27]; + k28 |= c_tm[pc_pos].b[28]; + k29 |= c_tm[pc_pos].b[29]; + k30 |= c_tm[pc_pos].b[30]; + k31 |= c_tm[pc_pos].b[31]; + + u32 D00 = 0; + u32 D01 = 0; + u32 D02 = 0; + u32 D03 = 0xffffffff; + u32 D04 = 0; + u32 D05 = 0xffffffff; + u32 D06 = 0xffffffff; + u32 D07 = 0xffffffff; + u32 D08 = 0; + u32 D09 = 0; + u32 D10 = 0; + u32 D11 = 0; + u32 D12 = 0; + u32 D13 = 0xffffffff; + u32 D14 = 0; + u32 D15 = 0; + u32 D16 = 0xffffffff; + u32 D17 = 0xffffffff; + u32 D18 = 0; + u32 D19 = 0; + u32 D20 = 0; + u32 D21 = 0; + u32 D22 = 0xffffffff; + u32 D23 = 0; + u32 D24 = 0xffffffff; + u32 D25 = 0; + u32 D26 = 0xffffffff; + u32 D27 = 0; + u32 D28 = 0xffffffff; + u32 D29 = 0xffffffff; + u32 D30 = 0xffffffff; + u32 D31 = 0xffffffff; + u32 D32 = 0; + u32 D33 = 0; + u32 D34 = 0; + u32 D35 = 0; + u32 D36 = 0; + u32 D37 = 0; + u32 D38 = 0; + u32 D39 = 0; + u32 D40 = 0xffffffff; + u32 D41 = 0xffffffff; + u32 D42 = 0xffffffff; + u32 D43 = 0; + u32 D44 = 0xffffffff; + u32 D45 = 0; + u32 D46 = 0; + u32 D47 = 0; + u32 D48 = 0; + u32 D49 = 0; + u32 D50 = 0; + u32 D51 = 0; + u32 D52 = 0; + u32 D53 = 0; + u32 D54 = 0; + u32 D55 = 0xffffffff; + u32 D56 = 0; + u32 D57 = 0; + u32 D58 = 0xffffffff; + u32 D59 = 0; + u32 D60 = 0; + u32 D61 = 0xffffffff; + u32 D62 = 0xffffffff; + u32 D63 = 0xffffffff; + + DES + ( + k00, k01, k02, k03, k04, k05, k06, + k07, k08, k09, k10, k11, k12, k13, + k14, k15, k16, k17, k18, k19, k20, + k21, k22, k23, k24, k25, k26, k27, + k28, k29, k30, k31, K32, K33, K34, + K35, K36, K37, K38, K39, K40, K41, + K42, K43, K44, K45, K46, K47, K48, + K49, K50, K51, K52, K53, K54, K55, + D00, D01, D02, D03, D04, D05, D06, D07, + D08, D09, D10, D11, D12, D13, D14, D15, + D16, D17, D18, D19, D20, D21, D22, D23, + D24, D25, D26, D27, D28, D29, D30, D31, + D32, D33, D34, D35, D36, D37, D38, D39, + D40, D41, D42, D43, D44, D45, D46, D47, + D48, D49, D50, D51, D52, D53, D54, D55, + D56, D57, D58, D59, D60, D61, D62, D63 + ); + + u32 tmpResult = 0; + + tmpResult |= D00 ^ S00; + tmpResult |= D01 ^ S01; + tmpResult |= D02 ^ S02; + tmpResult |= D03 ^ S03; + tmpResult |= D04 ^ S04; + tmpResult |= D05 ^ S05; + tmpResult |= D06 ^ S06; + tmpResult |= D07 ^ S07; + tmpResult |= D08 ^ S08; + tmpResult |= D09 ^ S09; + tmpResult |= D10 ^ S10; + tmpResult |= D11 ^ S11; + tmpResult |= D12 ^ S12; + tmpResult |= D13 ^ S13; + tmpResult |= D14 ^ S14; + tmpResult |= D15 ^ S15; + + if (tmpResult == 0xffffffff) continue; + + tmpResult |= D16 ^ S16; + tmpResult |= D17 ^ S17; + tmpResult |= D18 ^ S18; + tmpResult |= D19 ^ S19; + tmpResult |= D20 ^ S20; + tmpResult |= D21 ^ S21; + tmpResult |= D22 ^ S22; + tmpResult |= D23 ^ S23; + tmpResult |= D24 ^ S24; + tmpResult |= D25 ^ S25; + tmpResult |= D26 ^ S26; + tmpResult |= D27 ^ S27; + tmpResult |= D28 ^ S28; + tmpResult |= D29 ^ S29; + tmpResult |= D30 ^ S30; + tmpResult |= D31 ^ S31; + + if (tmpResult == 0xffffffff) continue; + + tmpResult |= D32 ^ S32; + tmpResult |= D33 ^ S33; + tmpResult |= D34 ^ S34; + tmpResult |= D35 ^ S35; + tmpResult |= D36 ^ S36; + tmpResult |= D37 ^ S37; + tmpResult |= D38 ^ S38; + tmpResult |= D39 ^ S39; + tmpResult |= D40 ^ S40; + tmpResult |= D41 ^ S41; + tmpResult |= D42 ^ S42; + tmpResult |= D43 ^ S43; + tmpResult |= D44 ^ S44; + tmpResult |= D45 ^ S45; + tmpResult |= D46 ^ S46; + tmpResult |= D47 ^ S47; + + if (tmpResult == 0xffffffff) continue; + + tmpResult |= D48 ^ S48; + tmpResult |= D49 ^ S49; + tmpResult |= D50 ^ S50; + tmpResult |= D51 ^ S51; + tmpResult |= D52 ^ S52; + tmpResult |= D53 ^ S53; + tmpResult |= D54 ^ S54; + tmpResult |= D55 ^ S55; + tmpResult |= D56 ^ S56; + tmpResult |= D57 ^ S57; + tmpResult |= D58 ^ S58; + tmpResult |= D59 ^ S59; + tmpResult |= D60 ^ S60; + tmpResult |= D61 ^ S61; + tmpResult |= D62 ^ S62; + tmpResult |= D63 ^ S63; + + if (tmpResult == 0xffffffff) continue; + + const u32 slice = 31 - __clz (~tmpResult); + + #include VECT_COMPARE_S + } +} + +extern "C" __global__ void __launch_bounds__ (64, 1) m03000_tb (pw_t *pws) +{ + // not used here, inlined code +} + +extern "C" __global__ void __launch_bounds__ (32, 1) m03000_tm (const u32 *d_bfs, bs_word_t *d_tbs) +{ + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + const u32 block = gid / 32; + const u32 slice = gid % 32; + + const u32 w0 = c_bfs[gid]; + + #pragma unroll + for (int i = 0; i < 32; i += 8) + { + atomicOr (&d_tbs[block].b[i + 0], (((w0 >> (i + 7)) & 1) << slice)); + atomicOr (&d_tbs[block].b[i + 1], (((w0 >> (i + 6)) & 1) << slice)); + atomicOr (&d_tbs[block].b[i + 2], (((w0 >> (i + 5)) & 1) << slice)); + atomicOr (&d_tbs[block].b[i + 3], (((w0 >> (i + 4)) & 1) << slice)); + atomicOr (&d_tbs[block].b[i + 4], (((w0 >> (i + 3)) & 1) << slice)); + atomicOr (&d_tbs[block].b[i + 5], (((w0 >> (i + 2)) & 1) << slice)); + atomicOr (&d_tbs[block].b[i + 6], (((w0 >> (i + 1)) & 1) << slice)); + atomicOr (&d_tbs[block].b[i + 7], (((w0 >> (i + 0)) & 1) << slice)); + } +} + +extern "C" __global__ void __launch_bounds__ (64, 1) m03000_m04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const u32x *words_buf_r, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + const u32 lid = threadIdx.x; + + const u32 s0 = digests_buf[digests_offset].digest_buf[0]; + const u32 s1 = digests_buf[digests_offset].digest_buf[1]; + + if (lid < 32) + { + s_S[lid] = -((s0 >> lid - 0) & 1); + } + else if (lid < 64) + { + s_S[lid] = -((s1 >> lid - 32) & 1); + } + + __syncthreads (); + + if (gid >= gid_max) return; + + /** + * main + */ + + m03000m (pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (64, 1) m03000_m08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const u32x *words_buf_r, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (64, 1) m03000_m16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const u32x *words_buf_r, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (64, 1) m03000_s04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const u32x *words_buf_r, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + const u32 lid = threadIdx.x; + + const u32 s0 = digests_buf[digests_offset].digest_buf[0]; + const u32 s1 = digests_buf[digests_offset].digest_buf[1]; + + if (lid < 32) + { + s_S[lid] = -((s0 >> lid - 0) & 1); + } + else if (lid < 64) + { + s_S[lid] = -((s1 >> lid - 32) & 1); + } + + __syncthreads (); + + if (gid >= gid_max) return; + + /** + * main + */ + + m03000s (pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (64, 1) m03000_s08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const u32x *words_buf_r, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (64, 1) m03000_s16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const u32x *words_buf_r, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/nv/m03100_a0.cu b/nv/m03100_a0.cu new file mode 100644 index 0000000000..a1fd073ed0 --- /dev/null +++ b/nv/m03100_a0.cu @@ -0,0 +1,1063 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _DES_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW2 +#define VECT_SIZE1 +#endif + +#define DGST_R0 0 +#define DGST_R1 1 +#define DGST_R2 2 +#define DGST_R3 3 + +#include "include/kernel_functions.c" +#include "types_nv.c" +#include "common_nv.c" +#include "include/rp_gpu.h" +#include "rp_nv.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#define PERM_OP(a,b,tt,n,m) \ +{ \ + tt = a >> n; \ + tt = tt ^ b; \ + tt = tt & m; \ + b = b ^ tt; \ + tt = tt << n; \ + a = a ^ tt; \ +} + +#define HPERM_OP(a,tt,n,m) \ +{ \ + tt = a << (16 + n); \ + tt = tt ^ a; \ + tt = tt & m; \ + a = a ^ tt; \ + tt = tt >> (16 + n); \ + a = a ^ tt; \ +} + +#define IP(l,r,tt) \ +{ \ + PERM_OP (r, l, tt, 4, 0x0f0f0f0f); \ + PERM_OP (l, r, tt, 16, 0x0000ffff); \ + PERM_OP (r, l, tt, 2, 0x33333333); \ + PERM_OP (l, r, tt, 8, 0x00ff00ff); \ + PERM_OP (r, l, tt, 1, 0x55555555); \ +} + +#define FP(l,r,tt) \ +{ \ + PERM_OP (l, r, tt, 1, 0x55555555); \ + PERM_OP (r, l, tt, 8, 0x00ff00ff); \ + PERM_OP (l, r, tt, 2, 0x33333333); \ + PERM_OP (r, l, tt, 16, 0x0000ffff); \ + PERM_OP (l, r, tt, 4, 0x0f0f0f0f); \ +} + +__device__ __constant__ u32 c_SPtrans[8][64] = +{ + /* nibble 0 */ + 0x02080800, 0x00080000, 0x02000002, 0x02080802, + 0x02000000, 0x00080802, 0x00080002, 0x02000002, + 0x00080802, 0x02080800, 0x02080000, 0x00000802, + 0x02000802, 0x02000000, 0x00000000, 0x00080002, + 0x00080000, 0x00000002, 0x02000800, 0x00080800, + 0x02080802, 0x02080000, 0x00000802, 0x02000800, + 0x00000002, 0x00000800, 0x00080800, 0x02080002, + 0x00000800, 0x02000802, 0x02080002, 0x00000000, + 0x00000000, 0x02080802, 0x02000800, 0x00080002, + 0x02080800, 0x00080000, 0x00000802, 0x02000800, + 0x02080002, 0x00000800, 0x00080800, 0x02000002, + 0x00080802, 0x00000002, 0x02000002, 0x02080000, + 0x02080802, 0x00080800, 0x02080000, 0x02000802, + 0x02000000, 0x00000802, 0x00080002, 0x00000000, + 0x00080000, 0x02000000, 0x02000802, 0x02080800, + 0x00000002, 0x02080002, 0x00000800, 0x00080802, + /* nibble 1 */ + 0x40108010, 0x00000000, 0x00108000, 0x40100000, + 0x40000010, 0x00008010, 0x40008000, 0x00108000, + 0x00008000, 0x40100010, 0x00000010, 0x40008000, + 0x00100010, 0x40108000, 0x40100000, 0x00000010, + 0x00100000, 0x40008010, 0x40100010, 0x00008000, + 0x00108010, 0x40000000, 0x00000000, 0x00100010, + 0x40008010, 0x00108010, 0x40108000, 0x40000010, + 0x40000000, 0x00100000, 0x00008010, 0x40108010, + 0x00100010, 0x40108000, 0x40008000, 0x00108010, + 0x40108010, 0x00100010, 0x40000010, 0x00000000, + 0x40000000, 0x00008010, 0x00100000, 0x40100010, + 0x00008000, 0x40000000, 0x00108010, 0x40008010, + 0x40108000, 0x00008000, 0x00000000, 0x40000010, + 0x00000010, 0x40108010, 0x00108000, 0x40100000, + 0x40100010, 0x00100000, 0x00008010, 0x40008000, + 0x40008010, 0x00000010, 0x40100000, 0x00108000, + /* nibble 2 */ + 0x04000001, 0x04040100, 0x00000100, 0x04000101, + 0x00040001, 0x04000000, 0x04000101, 0x00040100, + 0x04000100, 0x00040000, 0x04040000, 0x00000001, + 0x04040101, 0x00000101, 0x00000001, 0x04040001, + 0x00000000, 0x00040001, 0x04040100, 0x00000100, + 0x00000101, 0x04040101, 0x00040000, 0x04000001, + 0x04040001, 0x04000100, 0x00040101, 0x04040000, + 0x00040100, 0x00000000, 0x04000000, 0x00040101, + 0x04040100, 0x00000100, 0x00000001, 0x00040000, + 0x00000101, 0x00040001, 0x04040000, 0x04000101, + 0x00000000, 0x04040100, 0x00040100, 0x04040001, + 0x00040001, 0x04000000, 0x04040101, 0x00000001, + 0x00040101, 0x04000001, 0x04000000, 0x04040101, + 0x00040000, 0x04000100, 0x04000101, 0x00040100, + 0x04000100, 0x00000000, 0x04040001, 0x00000101, + 0x04000001, 0x00040101, 0x00000100, 0x04040000, + /* nibble 3 */ + 0x00401008, 0x10001000, 0x00000008, 0x10401008, + 0x00000000, 0x10400000, 0x10001008, 0x00400008, + 0x10401000, 0x10000008, 0x10000000, 0x00001008, + 0x10000008, 0x00401008, 0x00400000, 0x10000000, + 0x10400008, 0x00401000, 0x00001000, 0x00000008, + 0x00401000, 0x10001008, 0x10400000, 0x00001000, + 0x00001008, 0x00000000, 0x00400008, 0x10401000, + 0x10001000, 0x10400008, 0x10401008, 0x00400000, + 0x10400008, 0x00001008, 0x00400000, 0x10000008, + 0x00401000, 0x10001000, 0x00000008, 0x10400000, + 0x10001008, 0x00000000, 0x00001000, 0x00400008, + 0x00000000, 0x10400008, 0x10401000, 0x00001000, + 0x10000000, 0x10401008, 0x00401008, 0x00400000, + 0x10401008, 0x00000008, 0x10001000, 0x00401008, + 0x00400008, 0x00401000, 0x10400000, 0x10001008, + 0x00001008, 0x10000000, 0x10000008, 0x10401000, + /* nibble 4 */ + 0x08000000, 0x00010000, 0x00000400, 0x08010420, + 0x08010020, 0x08000400, 0x00010420, 0x08010000, + 0x00010000, 0x00000020, 0x08000020, 0x00010400, + 0x08000420, 0x08010020, 0x08010400, 0x00000000, + 0x00010400, 0x08000000, 0x00010020, 0x00000420, + 0x08000400, 0x00010420, 0x00000000, 0x08000020, + 0x00000020, 0x08000420, 0x08010420, 0x00010020, + 0x08010000, 0x00000400, 0x00000420, 0x08010400, + 0x08010400, 0x08000420, 0x00010020, 0x08010000, + 0x00010000, 0x00000020, 0x08000020, 0x08000400, + 0x08000000, 0x00010400, 0x08010420, 0x00000000, + 0x00010420, 0x08000000, 0x00000400, 0x00010020, + 0x08000420, 0x00000400, 0x00000000, 0x08010420, + 0x08010020, 0x08010400, 0x00000420, 0x00010000, + 0x00010400, 0x08010020, 0x08000400, 0x00000420, + 0x00000020, 0x00010420, 0x08010000, 0x08000020, + /* nibble 5 */ + 0x80000040, 0x00200040, 0x00000000, 0x80202000, + 0x00200040, 0x00002000, 0x80002040, 0x00200000, + 0x00002040, 0x80202040, 0x00202000, 0x80000000, + 0x80002000, 0x80000040, 0x80200000, 0x00202040, + 0x00200000, 0x80002040, 0x80200040, 0x00000000, + 0x00002000, 0x00000040, 0x80202000, 0x80200040, + 0x80202040, 0x80200000, 0x80000000, 0x00002040, + 0x00000040, 0x00202000, 0x00202040, 0x80002000, + 0x00002040, 0x80000000, 0x80002000, 0x00202040, + 0x80202000, 0x00200040, 0x00000000, 0x80002000, + 0x80000000, 0x00002000, 0x80200040, 0x00200000, + 0x00200040, 0x80202040, 0x00202000, 0x00000040, + 0x80202040, 0x00202000, 0x00200000, 0x80002040, + 0x80000040, 0x80200000, 0x00202040, 0x00000000, + 0x00002000, 0x80000040, 0x80002040, 0x80202000, + 0x80200000, 0x00002040, 0x00000040, 0x80200040, + /* nibble 6 */ + 0x00004000, 0x00000200, 0x01000200, 0x01000004, + 0x01004204, 0x00004004, 0x00004200, 0x00000000, + 0x01000000, 0x01000204, 0x00000204, 0x01004000, + 0x00000004, 0x01004200, 0x01004000, 0x00000204, + 0x01000204, 0x00004000, 0x00004004, 0x01004204, + 0x00000000, 0x01000200, 0x01000004, 0x00004200, + 0x01004004, 0x00004204, 0x01004200, 0x00000004, + 0x00004204, 0x01004004, 0x00000200, 0x01000000, + 0x00004204, 0x01004000, 0x01004004, 0x00000204, + 0x00004000, 0x00000200, 0x01000000, 0x01004004, + 0x01000204, 0x00004204, 0x00004200, 0x00000000, + 0x00000200, 0x01000004, 0x00000004, 0x01000200, + 0x00000000, 0x01000204, 0x01000200, 0x00004200, + 0x00000204, 0x00004000, 0x01004204, 0x01000000, + 0x01004200, 0x00000004, 0x00004004, 0x01004204, + 0x01000004, 0x01004200, 0x01004000, 0x00004004, + /* nibble 7 */ + 0x20800080, 0x20820000, 0x00020080, 0x00000000, + 0x20020000, 0x00800080, 0x20800000, 0x20820080, + 0x00000080, 0x20000000, 0x00820000, 0x00020080, + 0x00820080, 0x20020080, 0x20000080, 0x20800000, + 0x00020000, 0x00820080, 0x00800080, 0x20020000, + 0x20820080, 0x20000080, 0x00000000, 0x00820000, + 0x20000000, 0x00800000, 0x20020080, 0x20800080, + 0x00800000, 0x00020000, 0x20820000, 0x00000080, + 0x00800000, 0x00020000, 0x20000080, 0x20820080, + 0x00020080, 0x20000000, 0x00000000, 0x00820000, + 0x20800080, 0x20020080, 0x20020000, 0x00800080, + 0x20820000, 0x00000080, 0x00800080, 0x20020000, + 0x20820080, 0x00800000, 0x20800000, 0x20000080, + 0x00820000, 0x00020080, 0x20020080, 0x20800000, + 0x00000080, 0x20820000, 0x00820080, 0x00000000, + 0x20000000, 0x20800080, 0x00020000, 0x00820080, +}; + +__device__ __constant__ u32 c_skb[8][64] = +{ + /* for C bits (numbered as per FIPS 46) 1 2 3 4 5 6 */ + 0x00000000, 0x00000010, 0x20000000, 0x20000010, + 0x00010000, 0x00010010, 0x20010000, 0x20010010, + 0x00000800, 0x00000810, 0x20000800, 0x20000810, + 0x00010800, 0x00010810, 0x20010800, 0x20010810, + 0x00000020, 0x00000030, 0x20000020, 0x20000030, + 0x00010020, 0x00010030, 0x20010020, 0x20010030, + 0x00000820, 0x00000830, 0x20000820, 0x20000830, + 0x00010820, 0x00010830, 0x20010820, 0x20010830, + 0x00080000, 0x00080010, 0x20080000, 0x20080010, + 0x00090000, 0x00090010, 0x20090000, 0x20090010, + 0x00080800, 0x00080810, 0x20080800, 0x20080810, + 0x00090800, 0x00090810, 0x20090800, 0x20090810, + 0x00080020, 0x00080030, 0x20080020, 0x20080030, + 0x00090020, 0x00090030, 0x20090020, 0x20090030, + 0x00080820, 0x00080830, 0x20080820, 0x20080830, + 0x00090820, 0x00090830, 0x20090820, 0x20090830, + /* for C bits (numbered as per FIPS 46) 7 8 10 11 12 13 */ + 0x00000000, 0x02000000, 0x00002000, 0x02002000, + 0x00200000, 0x02200000, 0x00202000, 0x02202000, + 0x00000004, 0x02000004, 0x00002004, 0x02002004, + 0x00200004, 0x02200004, 0x00202004, 0x02202004, + 0x00000400, 0x02000400, 0x00002400, 0x02002400, + 0x00200400, 0x02200400, 0x00202400, 0x02202400, + 0x00000404, 0x02000404, 0x00002404, 0x02002404, + 0x00200404, 0x02200404, 0x00202404, 0x02202404, + 0x10000000, 0x12000000, 0x10002000, 0x12002000, + 0x10200000, 0x12200000, 0x10202000, 0x12202000, + 0x10000004, 0x12000004, 0x10002004, 0x12002004, + 0x10200004, 0x12200004, 0x10202004, 0x12202004, + 0x10000400, 0x12000400, 0x10002400, 0x12002400, + 0x10200400, 0x12200400, 0x10202400, 0x12202400, + 0x10000404, 0x12000404, 0x10002404, 0x12002404, + 0x10200404, 0x12200404, 0x10202404, 0x12202404, + /* for C bits (numbered as per FIPS 46) 14 15 16 17 19 20 */ + 0x00000000, 0x00000001, 0x00040000, 0x00040001, + 0x01000000, 0x01000001, 0x01040000, 0x01040001, + 0x00000002, 0x00000003, 0x00040002, 0x00040003, + 0x01000002, 0x01000003, 0x01040002, 0x01040003, + 0x00000200, 0x00000201, 0x00040200, 0x00040201, + 0x01000200, 0x01000201, 0x01040200, 0x01040201, + 0x00000202, 0x00000203, 0x00040202, 0x00040203, + 0x01000202, 0x01000203, 0x01040202, 0x01040203, + 0x08000000, 0x08000001, 0x08040000, 0x08040001, + 0x09000000, 0x09000001, 0x09040000, 0x09040001, + 0x08000002, 0x08000003, 0x08040002, 0x08040003, + 0x09000002, 0x09000003, 0x09040002, 0x09040003, + 0x08000200, 0x08000201, 0x08040200, 0x08040201, + 0x09000200, 0x09000201, 0x09040200, 0x09040201, + 0x08000202, 0x08000203, 0x08040202, 0x08040203, + 0x09000202, 0x09000203, 0x09040202, 0x09040203, + /* for C bits (numbered as per FIPS 46) 21 23 24 26 27 28 */ + 0x00000000, 0x00100000, 0x00000100, 0x00100100, + 0x00000008, 0x00100008, 0x00000108, 0x00100108, + 0x00001000, 0x00101000, 0x00001100, 0x00101100, + 0x00001008, 0x00101008, 0x00001108, 0x00101108, + 0x04000000, 0x04100000, 0x04000100, 0x04100100, + 0x04000008, 0x04100008, 0x04000108, 0x04100108, + 0x04001000, 0x04101000, 0x04001100, 0x04101100, + 0x04001008, 0x04101008, 0x04001108, 0x04101108, + 0x00020000, 0x00120000, 0x00020100, 0x00120100, + 0x00020008, 0x00120008, 0x00020108, 0x00120108, + 0x00021000, 0x00121000, 0x00021100, 0x00121100, + 0x00021008, 0x00121008, 0x00021108, 0x00121108, + 0x04020000, 0x04120000, 0x04020100, 0x04120100, + 0x04020008, 0x04120008, 0x04020108, 0x04120108, + 0x04021000, 0x04121000, 0x04021100, 0x04121100, + 0x04021008, 0x04121008, 0x04021108, 0x04121108, + /* for D bits (numbered as per FIPS 46) 1 2 3 4 5 6 */ + 0x00000000, 0x10000000, 0x00010000, 0x10010000, + 0x00000004, 0x10000004, 0x00010004, 0x10010004, + 0x20000000, 0x30000000, 0x20010000, 0x30010000, + 0x20000004, 0x30000004, 0x20010004, 0x30010004, + 0x00100000, 0x10100000, 0x00110000, 0x10110000, + 0x00100004, 0x10100004, 0x00110004, 0x10110004, + 0x20100000, 0x30100000, 0x20110000, 0x30110000, + 0x20100004, 0x30100004, 0x20110004, 0x30110004, + 0x00001000, 0x10001000, 0x00011000, 0x10011000, + 0x00001004, 0x10001004, 0x00011004, 0x10011004, + 0x20001000, 0x30001000, 0x20011000, 0x30011000, + 0x20001004, 0x30001004, 0x20011004, 0x30011004, + 0x00101000, 0x10101000, 0x00111000, 0x10111000, + 0x00101004, 0x10101004, 0x00111004, 0x10111004, + 0x20101000, 0x30101000, 0x20111000, 0x30111000, + 0x20101004, 0x30101004, 0x20111004, 0x30111004, + /* for D bits (numbered as per FIPS 46) 8 9 11 12 13 14 */ + 0x00000000, 0x08000000, 0x00000008, 0x08000008, + 0x00000400, 0x08000400, 0x00000408, 0x08000408, + 0x00020000, 0x08020000, 0x00020008, 0x08020008, + 0x00020400, 0x08020400, 0x00020408, 0x08020408, + 0x00000001, 0x08000001, 0x00000009, 0x08000009, + 0x00000401, 0x08000401, 0x00000409, 0x08000409, + 0x00020001, 0x08020001, 0x00020009, 0x08020009, + 0x00020401, 0x08020401, 0x00020409, 0x08020409, + 0x02000000, 0x0A000000, 0x02000008, 0x0A000008, + 0x02000400, 0x0A000400, 0x02000408, 0x0A000408, + 0x02020000, 0x0A020000, 0x02020008, 0x0A020008, + 0x02020400, 0x0A020400, 0x02020408, 0x0A020408, + 0x02000001, 0x0A000001, 0x02000009, 0x0A000009, + 0x02000401, 0x0A000401, 0x02000409, 0x0A000409, + 0x02020001, 0x0A020001, 0x02020009, 0x0A020009, + 0x02020401, 0x0A020401, 0x02020409, 0x0A020409, + /* for D bits (numbered as per FIPS 46) 16 17 18 19 20 21 */ + 0x00000000, 0x00000100, 0x00080000, 0x00080100, + 0x01000000, 0x01000100, 0x01080000, 0x01080100, + 0x00000010, 0x00000110, 0x00080010, 0x00080110, + 0x01000010, 0x01000110, 0x01080010, 0x01080110, + 0x00200000, 0x00200100, 0x00280000, 0x00280100, + 0x01200000, 0x01200100, 0x01280000, 0x01280100, + 0x00200010, 0x00200110, 0x00280010, 0x00280110, + 0x01200010, 0x01200110, 0x01280010, 0x01280110, + 0x00000200, 0x00000300, 0x00080200, 0x00080300, + 0x01000200, 0x01000300, 0x01080200, 0x01080300, + 0x00000210, 0x00000310, 0x00080210, 0x00080310, + 0x01000210, 0x01000310, 0x01080210, 0x01080310, + 0x00200200, 0x00200300, 0x00280200, 0x00280300, + 0x01200200, 0x01200300, 0x01280200, 0x01280300, + 0x00200210, 0x00200310, 0x00280210, 0x00280310, + 0x01200210, 0x01200310, 0x01280210, 0x01280310, + /* for D bits (numbered as per FIPS 46) 22 23 24 25 27 28 */ + 0x00000000, 0x04000000, 0x00040000, 0x04040000, + 0x00000002, 0x04000002, 0x00040002, 0x04040002, + 0x00002000, 0x04002000, 0x00042000, 0x04042000, + 0x00002002, 0x04002002, 0x00042002, 0x04042002, + 0x00000020, 0x04000020, 0x00040020, 0x04040020, + 0x00000022, 0x04000022, 0x00040022, 0x04040022, + 0x00002020, 0x04002020, 0x00042020, 0x04042020, + 0x00002022, 0x04002022, 0x00042022, 0x04042022, + 0x00000800, 0x04000800, 0x00040800, 0x04040800, + 0x00000802, 0x04000802, 0x00040802, 0x04040802, + 0x00002800, 0x04002800, 0x00042800, 0x04042800, + 0x00002802, 0x04002802, 0x00042802, 0x04042802, + 0x00000820, 0x04000820, 0x00040820, 0x04040820, + 0x00000822, 0x04000822, 0x00040822, 0x04040822, + 0x00002820, 0x04002820, 0x00042820, 0x04042820, + 0x00002822, 0x04002822, 0x00042822, 0x04042822 +}; + +#ifdef VECT_SIZE1 +#define BOX(i,n,S) u32x ((S)[(n)][(i)]) +#endif + +#ifdef VECT_SIZE2 +#define BOX(i,n,S) u32x ((S)[(n)][(i).x], (S)[(n)][(i).y]) +#endif + +__device__ static void _des_crypt_encrypt (u32x iv[2], u32x data[2], u32x Kc[16], u32x Kd[16], u32 s_SPtrans[8][64]) +{ + u32x tt; + + u32x r = data[0]; + u32x l = data[1]; + + IP (r, l, tt); + + r = rotl32 (r, 3u); + l = rotl32 (l, 3u); + + #pragma unroll 16 + for (int i = 0; i < 16; i++) + { + u32x u = Kc[i] ^ r; + u32x t = Kd[i] ^ rotl32 (r, 28u); + + l ^= BOX (((u >> 2) & 0x3f), 0, s_SPtrans) + | BOX (((u >> 10) & 0x3f), 2, s_SPtrans) + | BOX (((u >> 18) & 0x3f), 4, s_SPtrans) + | BOX (((u >> 26) & 0x3f), 6, s_SPtrans) + | BOX (((t >> 2) & 0x3f), 1, s_SPtrans) + | BOX (((t >> 10) & 0x3f), 3, s_SPtrans) + | BOX (((t >> 18) & 0x3f), 5, s_SPtrans) + | BOX (((t >> 26) & 0x3f), 7, s_SPtrans); + + tt = l; + l = r; + r = tt; + } + + l = rotl32 (l, 29u); + r = rotl32 (r, 29u); + + FP (r, l, tt); + + iv[0] = l; + iv[1] = r; +} + +__device__ static void _des_crypt_keysetup (u32x c, u32x d, u32x Kc[16], u32x Kd[16], u32 s_skb[8][64]) +{ + u32x tt; + + PERM_OP (d, c, tt, 4, 0x0f0f0f0f); + HPERM_OP (c, tt, 2, 0xcccc0000); + HPERM_OP (d, tt, 2, 0xcccc0000); + PERM_OP (d, c, tt, 1, 0x55555555); + PERM_OP (c, d, tt, 8, 0x00ff00ff); + PERM_OP (d, c, tt, 1, 0x55555555); + + d = ((d & 0x000000ff) << 16) + | ((d & 0x0000ff00) << 0) + | ((d & 0x00ff0000) >> 16) + | ((c & 0xf0000000) >> 4); + + c = c & 0x0fffffff; + + #pragma unroll 16 + for (int i = 0; i < 16; i++) + { + const u32 shifts3s0[16] = { 1, 1, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 1 }; + const u32 shifts3s1[16] = { 27, 27, 26, 26, 26, 26, 26, 26, 27, 26, 26, 26, 26, 26, 26, 27 }; + + c = c >> shifts3s0[i] | c << shifts3s1[i]; + d = d >> shifts3s0[i] | d << shifts3s1[i]; + + c = c & 0x0fffffff; + d = d & 0x0fffffff; + + u32x s = BOX ((( c >> 0) & 0x3f), 0, s_skb) + | BOX ((((c >> 6) & 0x03) + | ((c >> 7) & 0x3c)), 1, s_skb) + | BOX ((((c >> 13) & 0x0f) + | ((c >> 14) & 0x30)), 2, s_skb) + | BOX ((((c >> 20) & 0x01) + | ((c >> 21) & 0x06) + | ((c >> 22) & 0x38)), 3, s_skb); + + u32x t = BOX ((( d >> 0) & 0x3f), 4, s_skb) + | BOX ((((d >> 7) & 0x03) + | ((d >> 8) & 0x3c)), 5, s_skb) + | BOX ((((d >> 15) & 0x3f)), 6, s_skb) + | BOX ((((d >> 21) & 0x0f) + | ((d >> 22) & 0x30)), 7, s_skb); + + #if __CUDA_ARCH__ >= 200 + Kc[i] = __byte_perm (s, t, 0x5410); + Kd[i] = __byte_perm (s, t, 0x7632); + #else + Kc[i] = ((t << 16) | (s & 0x0000ffff)); + Kd[i] = ((s >> 16) | (t & 0xffff0000)); + #endif + + Kc[i] = rotl32 (Kc[i], 2u); + Kd[i] = rotl32 (Kd[i], 2u); + } +} + +__device__ __constant__ gpu_rule_t c_rules[1024]; + +extern "C" __global__ void __launch_bounds__ (256, 1) m03100_m04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + u32x pw_buf1[4]; + + pw_buf1[0] = pws[gid].i[ 4]; + pw_buf1[1] = pws[gid].i[ 5]; + pw_buf1[2] = pws[gid].i[ 6]; + pw_buf1[3] = pws[gid].i[ 7]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * sbox, kbox + */ + + __shared__ u32 s_SPtrans[8][64]; + __shared__ u32 s_skb[8][64]; + + if (lid < 64) + { + s_SPtrans[0][lid] = c_SPtrans[0][lid]; + s_SPtrans[1][lid] = c_SPtrans[1][lid]; + s_SPtrans[2][lid] = c_SPtrans[2][lid]; + s_SPtrans[3][lid] = c_SPtrans[3][lid]; + s_SPtrans[4][lid] = c_SPtrans[4][lid]; + s_SPtrans[5][lid] = c_SPtrans[5][lid]; + s_SPtrans[6][lid] = c_SPtrans[6][lid]; + s_SPtrans[7][lid] = c_SPtrans[7][lid]; + + s_skb[0][lid] = c_skb[0][lid]; + s_skb[1][lid] = c_skb[1][lid]; + s_skb[2][lid] = c_skb[2][lid]; + s_skb[3][lid] = c_skb[3][lid]; + s_skb[4][lid] = c_skb[4][lid]; + s_skb[5][lid] = c_skb[5][lid]; + s_skb[6][lid] = c_skb[6][lid]; + s_skb[7][lid] = c_skb[7][lid]; + } + + __syncthreads (); + + if (gid >= gid_max) return; + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[7]; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + + w0[0] = pw_buf0[0]; + w0[1] = pw_buf0[1]; + w0[2] = pw_buf0[2]; + w0[3] = pw_buf0[3]; + + u32x w1[4]; + + w1[0] = pw_buf1[0]; + w1[1] = pw_buf1[1]; + w1[2] = pw_buf1[2]; + w1[3] = pw_buf1[3]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 out_len = apply_rules (c_rules[il_pos].cmds, w0, w1, pw_len); + + const u32 salt_word_len = (salt_len + out_len) * 2; + + /** + * prepend salt + */ + + u32x w0_t[4]; + + w0_t[0] = w0[0]; + w0_t[1] = w0[1]; + w0_t[2] = w0[2]; + w0_t[3] = w0[3]; + + u32x w1_t[4]; + + w1_t[0] = w1[0]; + w1_t[1] = w1[1]; + w1_t[2] = w1[2]; + w1_t[3] = w1[3]; + + u32x w2_t[4]; + + w2_t[0] = w2[0]; + w2_t[1] = w2[1]; + w2_t[2] = w2[2]; + w2_t[3] = w2[3]; + + u32x w3_t[4]; + + w3_t[0] = w3[0]; + w3_t[1] = w3[1]; + w3_t[2] = w3[2]; + w3_t[3] = w3[3]; + + switch_buffer_by_offset (w0_t, w1_t, w2_t, w3_t, salt_len); + + w0_t[0] |= salt_buf0[0]; + w0_t[1] |= salt_buf0[1]; + w0_t[2] |= salt_buf0[2]; + w0_t[3] |= salt_buf0[3]; + w1_t[0] |= salt_buf1[0]; + w1_t[1] |= salt_buf1[1]; + w1_t[2] |= salt_buf1[2]; + w1_t[3] |= salt_buf1[3]; + + u32x dst[16]; + + dst[ 0] = w0_t[0]; + dst[ 1] = w0_t[1]; + dst[ 2] = w0_t[2]; + dst[ 3] = w0_t[3]; + dst[ 4] = w1_t[0]; + dst[ 5] = w1_t[1]; + dst[ 6] = w1_t[2]; + dst[ 7] = w1_t[3]; + dst[ 8] = w2_t[0]; + dst[ 9] = w2_t[1]; + dst[10] = w2_t[2]; + dst[11] = w2_t[3]; + dst[12] = 0; + dst[13] = 0; + dst[14] = 0; + dst[15] = 0; + + /** + * precompute key1 since key is static: 0x0123456789abcdef + * plus LEFT_ROTATE by 2 + */ + + u32x Kc[16]; + + Kc[ 0] = 0x64649040; + Kc[ 1] = 0x14909858; + Kc[ 2] = 0xc4b44888; + Kc[ 3] = 0x9094e438; + Kc[ 4] = 0xd8a004f0; + Kc[ 5] = 0xa8f02810; + Kc[ 6] = 0xc84048d8; + Kc[ 7] = 0x68d804a8; + Kc[ 8] = 0x0490e40c; + Kc[ 9] = 0xac183024; + Kc[10] = 0x24c07c10; + Kc[11] = 0x8c88c038; + Kc[12] = 0xc048c824; + Kc[13] = 0x4c0470a8; + Kc[14] = 0x584020b4; + Kc[15] = 0x00742c4c; + + u32x Kd[16]; + + Kd[ 0] = 0xa42ce40c; + Kd[ 1] = 0x64689858; + Kd[ 2] = 0x484050b8; + Kd[ 3] = 0xe8184814; + Kd[ 4] = 0x405cc070; + Kd[ 5] = 0xa010784c; + Kd[ 6] = 0x6074a800; + Kd[ 7] = 0x80701c1c; + Kd[ 8] = 0x9cd49430; + Kd[ 9] = 0x4c8ce078; + Kd[10] = 0x5c18c088; + Kd[11] = 0x28a8a4c8; + Kd[12] = 0x3c180838; + Kd[13] = 0xb0b86c20; + Kd[14] = 0xac84a094; + Kd[15] = 0x4ce0c0c4; + + /** + * key1 (generate key) + */ + + u32x iv[2]; + + iv[0] = 0; + iv[1] = 0; + + for (u32 j = 0, k = 0; j < salt_word_len; j += 8, k++) + { + u32x data[2]; + + data[0] = ((dst[k] << 16) & 0xff000000) | ((dst[k] << 8) & 0x0000ff00); + data[1] = ((dst[k] >> 0) & 0xff000000) | ((dst[k] >> 8) & 0x0000ff00); + + data[0] ^= iv[0]; + data[1] ^= iv[1]; + + _des_crypt_encrypt (iv, data, Kc, Kd, s_SPtrans); + } + + /** + * key2 (generate hash) + */ + + _des_crypt_keysetup (iv[0], iv[1], Kc, Kd, s_skb); + + iv[0] = 0; + iv[1] = 0; + + for (u32 j = 0, k = 0; j < salt_word_len; j += 8, k++) + { + u32x data[2]; + + data[0] = ((dst[k] << 16) & 0xff000000) | ((dst[k] << 8) & 0x0000ff00); + data[1] = ((dst[k] >> 0) & 0xff000000) | ((dst[k] >> 8) & 0x0000ff00); + + data[0] ^= iv[0]; + data[1] ^= iv[1]; + + _des_crypt_encrypt (iv, data, Kc, Kd, s_SPtrans); + } + + /** + * cmp + */ + + const u32x r0 = iv[0]; + const u32x r1 = iv[1]; + const u32x r2 = 0; + const u32x r3 = 0; + + #include VECT_COMPARE_M + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m03100_m08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m03100_m16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m03100_s04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + u32x pw_buf1[4]; + + pw_buf1[0] = pws[gid].i[ 4]; + pw_buf1[1] = pws[gid].i[ 5]; + pw_buf1[2] = pws[gid].i[ 6]; + pw_buf1[3] = pws[gid].i[ 7]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * sbox, kbox + */ + + __shared__ u32 s_SPtrans[8][64]; + __shared__ u32 s_skb[8][64]; + + if (lid < 64) + { + s_SPtrans[0][lid] = c_SPtrans[0][lid]; + s_SPtrans[1][lid] = c_SPtrans[1][lid]; + s_SPtrans[2][lid] = c_SPtrans[2][lid]; + s_SPtrans[3][lid] = c_SPtrans[3][lid]; + s_SPtrans[4][lid] = c_SPtrans[4][lid]; + s_SPtrans[5][lid] = c_SPtrans[5][lid]; + s_SPtrans[6][lid] = c_SPtrans[6][lid]; + s_SPtrans[7][lid] = c_SPtrans[7][lid]; + + s_skb[0][lid] = c_skb[0][lid]; + s_skb[1][lid] = c_skb[1][lid]; + s_skb[2][lid] = c_skb[2][lid]; + s_skb[3][lid] = c_skb[3][lid]; + s_skb[4][lid] = c_skb[4][lid]; + s_skb[5][lid] = c_skb[5][lid]; + s_skb[6][lid] = c_skb[6][lid]; + s_skb[7][lid] = c_skb[7][lid]; + } + + __syncthreads (); + + if (gid >= gid_max) return; + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[7]; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + + w0[0] = pw_buf0[0]; + w0[1] = pw_buf0[1]; + w0[2] = pw_buf0[2]; + w0[3] = pw_buf0[3]; + + u32x w1[4]; + + w1[0] = pw_buf1[0]; + w1[1] = pw_buf1[1]; + w1[2] = pw_buf1[2]; + w1[3] = pw_buf1[3]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 out_len = apply_rules (c_rules[il_pos].cmds, w0, w1, pw_len); + + const u32 salt_word_len = (salt_len + out_len) * 2; + + /** + * prepend salt + */ + + u32x w0_t[4]; + + w0_t[0] = w0[0]; + w0_t[1] = w0[1]; + w0_t[2] = w0[2]; + w0_t[3] = w0[3]; + + u32x w1_t[4]; + + w1_t[0] = w1[0]; + w1_t[1] = w1[1]; + w1_t[2] = w1[2]; + w1_t[3] = w1[3]; + + u32x w2_t[4]; + + w2_t[0] = w2[0]; + w2_t[1] = w2[1]; + w2_t[2] = w2[2]; + w2_t[3] = w2[3]; + + u32x w3_t[4]; + + w3_t[0] = w3[0]; + w3_t[1] = w3[1]; + w3_t[2] = w3[2]; + w3_t[3] = w3[3]; + + switch_buffer_by_offset (w0_t, w1_t, w2_t, w3_t, salt_len); + + w0_t[0] |= salt_buf0[0]; + w0_t[1] |= salt_buf0[1]; + w0_t[2] |= salt_buf0[2]; + w0_t[3] |= salt_buf0[3]; + w1_t[0] |= salt_buf1[0]; + w1_t[1] |= salt_buf1[1]; + w1_t[2] |= salt_buf1[2]; + w1_t[3] |= salt_buf1[3]; + + u32x dst[16]; + + dst[ 0] = w0_t[0]; + dst[ 1] = w0_t[1]; + dst[ 2] = w0_t[2]; + dst[ 3] = w0_t[3]; + dst[ 4] = w1_t[0]; + dst[ 5] = w1_t[1]; + dst[ 6] = w1_t[2]; + dst[ 7] = w1_t[3]; + dst[ 8] = w2_t[0]; + dst[ 9] = w2_t[1]; + dst[10] = w2_t[2]; + dst[11] = w2_t[3]; + dst[12] = 0; + dst[13] = 0; + dst[14] = 0; + dst[15] = 0; + + /** + * precompute key1 since key is static: 0x0123456789abcdef + * plus LEFT_ROTATE by 2 + */ + + u32x Kc[16]; + + Kc[ 0] = 0x64649040; + Kc[ 1] = 0x14909858; + Kc[ 2] = 0xc4b44888; + Kc[ 3] = 0x9094e438; + Kc[ 4] = 0xd8a004f0; + Kc[ 5] = 0xa8f02810; + Kc[ 6] = 0xc84048d8; + Kc[ 7] = 0x68d804a8; + Kc[ 8] = 0x0490e40c; + Kc[ 9] = 0xac183024; + Kc[10] = 0x24c07c10; + Kc[11] = 0x8c88c038; + Kc[12] = 0xc048c824; + Kc[13] = 0x4c0470a8; + Kc[14] = 0x584020b4; + Kc[15] = 0x00742c4c; + + u32x Kd[16]; + + Kd[ 0] = 0xa42ce40c; + Kd[ 1] = 0x64689858; + Kd[ 2] = 0x484050b8; + Kd[ 3] = 0xe8184814; + Kd[ 4] = 0x405cc070; + Kd[ 5] = 0xa010784c; + Kd[ 6] = 0x6074a800; + Kd[ 7] = 0x80701c1c; + Kd[ 8] = 0x9cd49430; + Kd[ 9] = 0x4c8ce078; + Kd[10] = 0x5c18c088; + Kd[11] = 0x28a8a4c8; + Kd[12] = 0x3c180838; + Kd[13] = 0xb0b86c20; + Kd[14] = 0xac84a094; + Kd[15] = 0x4ce0c0c4; + + /** + * key1 (generate key) + */ + + u32x iv[2]; + + iv[0] = 0; + iv[1] = 0; + + for (u32 j = 0, k = 0; j < salt_word_len; j += 8, k++) + { + u32x data[2]; + + data[0] = ((dst[k] << 16) & 0xff000000) | ((dst[k] << 8) & 0x0000ff00); + data[1] = ((dst[k] >> 0) & 0xff000000) | ((dst[k] >> 8) & 0x0000ff00); + + data[0] ^= iv[0]; + data[1] ^= iv[1]; + + _des_crypt_encrypt (iv, data, Kc, Kd, s_SPtrans); + } + + /** + * key2 (generate hash) + */ + + _des_crypt_keysetup (iv[0], iv[1], Kc, Kd, s_skb); + + iv[0] = 0; + iv[1] = 0; + + for (u32 j = 0, k = 0; j < salt_word_len; j += 8, k++) + { + u32x data[2]; + + data[0] = ((dst[k] << 16) & 0xff000000) | ((dst[k] << 8) & 0x0000ff00); + data[1] = ((dst[k] >> 0) & 0xff000000) | ((dst[k] >> 8) & 0x0000ff00); + + data[0] ^= iv[0]; + data[1] ^= iv[1]; + + _des_crypt_encrypt (iv, data, Kc, Kd, s_SPtrans); + } + + /** + * cmp + */ + + const u32x r0 = iv[0]; + const u32x r1 = iv[1]; + const u32x r2 = 0; + const u32x r3 = 0; + + #include VECT_COMPARE_S + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m03100_s08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m03100_s16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/nv/m03100_a1.cu b/nv/m03100_a1.cu new file mode 100644 index 0000000000..b2149d71d6 --- /dev/null +++ b/nv/m03100_a1.cu @@ -0,0 +1,1159 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _DES_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW2 +#define VECT_SIZE1 +#endif + +#define DGST_R0 0 +#define DGST_R1 1 +#define DGST_R2 2 +#define DGST_R3 3 + +#include "include/kernel_functions.c" +#include "types_nv.c" +#include "common_nv.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#define PERM_OP(a,b,tt,n,m) \ +{ \ + tt = a >> n; \ + tt = tt ^ b; \ + tt = tt & m; \ + b = b ^ tt; \ + tt = tt << n; \ + a = a ^ tt; \ +} + +#define HPERM_OP(a,tt,n,m) \ +{ \ + tt = a << (16 + n); \ + tt = tt ^ a; \ + tt = tt & m; \ + a = a ^ tt; \ + tt = tt >> (16 + n); \ + a = a ^ tt; \ +} + +#define IP(l,r,tt) \ +{ \ + PERM_OP (r, l, tt, 4, 0x0f0f0f0f); \ + PERM_OP (l, r, tt, 16, 0x0000ffff); \ + PERM_OP (r, l, tt, 2, 0x33333333); \ + PERM_OP (l, r, tt, 8, 0x00ff00ff); \ + PERM_OP (r, l, tt, 1, 0x55555555); \ +} + +#define FP(l,r,tt) \ +{ \ + PERM_OP (l, r, tt, 1, 0x55555555); \ + PERM_OP (r, l, tt, 8, 0x00ff00ff); \ + PERM_OP (l, r, tt, 2, 0x33333333); \ + PERM_OP (r, l, tt, 16, 0x0000ffff); \ + PERM_OP (l, r, tt, 4, 0x0f0f0f0f); \ +} + +__device__ __constant__ u32 c_SPtrans[8][64] = +{ + /* nibble 0 */ + 0x02080800, 0x00080000, 0x02000002, 0x02080802, + 0x02000000, 0x00080802, 0x00080002, 0x02000002, + 0x00080802, 0x02080800, 0x02080000, 0x00000802, + 0x02000802, 0x02000000, 0x00000000, 0x00080002, + 0x00080000, 0x00000002, 0x02000800, 0x00080800, + 0x02080802, 0x02080000, 0x00000802, 0x02000800, + 0x00000002, 0x00000800, 0x00080800, 0x02080002, + 0x00000800, 0x02000802, 0x02080002, 0x00000000, + 0x00000000, 0x02080802, 0x02000800, 0x00080002, + 0x02080800, 0x00080000, 0x00000802, 0x02000800, + 0x02080002, 0x00000800, 0x00080800, 0x02000002, + 0x00080802, 0x00000002, 0x02000002, 0x02080000, + 0x02080802, 0x00080800, 0x02080000, 0x02000802, + 0x02000000, 0x00000802, 0x00080002, 0x00000000, + 0x00080000, 0x02000000, 0x02000802, 0x02080800, + 0x00000002, 0x02080002, 0x00000800, 0x00080802, + /* nibble 1 */ + 0x40108010, 0x00000000, 0x00108000, 0x40100000, + 0x40000010, 0x00008010, 0x40008000, 0x00108000, + 0x00008000, 0x40100010, 0x00000010, 0x40008000, + 0x00100010, 0x40108000, 0x40100000, 0x00000010, + 0x00100000, 0x40008010, 0x40100010, 0x00008000, + 0x00108010, 0x40000000, 0x00000000, 0x00100010, + 0x40008010, 0x00108010, 0x40108000, 0x40000010, + 0x40000000, 0x00100000, 0x00008010, 0x40108010, + 0x00100010, 0x40108000, 0x40008000, 0x00108010, + 0x40108010, 0x00100010, 0x40000010, 0x00000000, + 0x40000000, 0x00008010, 0x00100000, 0x40100010, + 0x00008000, 0x40000000, 0x00108010, 0x40008010, + 0x40108000, 0x00008000, 0x00000000, 0x40000010, + 0x00000010, 0x40108010, 0x00108000, 0x40100000, + 0x40100010, 0x00100000, 0x00008010, 0x40008000, + 0x40008010, 0x00000010, 0x40100000, 0x00108000, + /* nibble 2 */ + 0x04000001, 0x04040100, 0x00000100, 0x04000101, + 0x00040001, 0x04000000, 0x04000101, 0x00040100, + 0x04000100, 0x00040000, 0x04040000, 0x00000001, + 0x04040101, 0x00000101, 0x00000001, 0x04040001, + 0x00000000, 0x00040001, 0x04040100, 0x00000100, + 0x00000101, 0x04040101, 0x00040000, 0x04000001, + 0x04040001, 0x04000100, 0x00040101, 0x04040000, + 0x00040100, 0x00000000, 0x04000000, 0x00040101, + 0x04040100, 0x00000100, 0x00000001, 0x00040000, + 0x00000101, 0x00040001, 0x04040000, 0x04000101, + 0x00000000, 0x04040100, 0x00040100, 0x04040001, + 0x00040001, 0x04000000, 0x04040101, 0x00000001, + 0x00040101, 0x04000001, 0x04000000, 0x04040101, + 0x00040000, 0x04000100, 0x04000101, 0x00040100, + 0x04000100, 0x00000000, 0x04040001, 0x00000101, + 0x04000001, 0x00040101, 0x00000100, 0x04040000, + /* nibble 3 */ + 0x00401008, 0x10001000, 0x00000008, 0x10401008, + 0x00000000, 0x10400000, 0x10001008, 0x00400008, + 0x10401000, 0x10000008, 0x10000000, 0x00001008, + 0x10000008, 0x00401008, 0x00400000, 0x10000000, + 0x10400008, 0x00401000, 0x00001000, 0x00000008, + 0x00401000, 0x10001008, 0x10400000, 0x00001000, + 0x00001008, 0x00000000, 0x00400008, 0x10401000, + 0x10001000, 0x10400008, 0x10401008, 0x00400000, + 0x10400008, 0x00001008, 0x00400000, 0x10000008, + 0x00401000, 0x10001000, 0x00000008, 0x10400000, + 0x10001008, 0x00000000, 0x00001000, 0x00400008, + 0x00000000, 0x10400008, 0x10401000, 0x00001000, + 0x10000000, 0x10401008, 0x00401008, 0x00400000, + 0x10401008, 0x00000008, 0x10001000, 0x00401008, + 0x00400008, 0x00401000, 0x10400000, 0x10001008, + 0x00001008, 0x10000000, 0x10000008, 0x10401000, + /* nibble 4 */ + 0x08000000, 0x00010000, 0x00000400, 0x08010420, + 0x08010020, 0x08000400, 0x00010420, 0x08010000, + 0x00010000, 0x00000020, 0x08000020, 0x00010400, + 0x08000420, 0x08010020, 0x08010400, 0x00000000, + 0x00010400, 0x08000000, 0x00010020, 0x00000420, + 0x08000400, 0x00010420, 0x00000000, 0x08000020, + 0x00000020, 0x08000420, 0x08010420, 0x00010020, + 0x08010000, 0x00000400, 0x00000420, 0x08010400, + 0x08010400, 0x08000420, 0x00010020, 0x08010000, + 0x00010000, 0x00000020, 0x08000020, 0x08000400, + 0x08000000, 0x00010400, 0x08010420, 0x00000000, + 0x00010420, 0x08000000, 0x00000400, 0x00010020, + 0x08000420, 0x00000400, 0x00000000, 0x08010420, + 0x08010020, 0x08010400, 0x00000420, 0x00010000, + 0x00010400, 0x08010020, 0x08000400, 0x00000420, + 0x00000020, 0x00010420, 0x08010000, 0x08000020, + /* nibble 5 */ + 0x80000040, 0x00200040, 0x00000000, 0x80202000, + 0x00200040, 0x00002000, 0x80002040, 0x00200000, + 0x00002040, 0x80202040, 0x00202000, 0x80000000, + 0x80002000, 0x80000040, 0x80200000, 0x00202040, + 0x00200000, 0x80002040, 0x80200040, 0x00000000, + 0x00002000, 0x00000040, 0x80202000, 0x80200040, + 0x80202040, 0x80200000, 0x80000000, 0x00002040, + 0x00000040, 0x00202000, 0x00202040, 0x80002000, + 0x00002040, 0x80000000, 0x80002000, 0x00202040, + 0x80202000, 0x00200040, 0x00000000, 0x80002000, + 0x80000000, 0x00002000, 0x80200040, 0x00200000, + 0x00200040, 0x80202040, 0x00202000, 0x00000040, + 0x80202040, 0x00202000, 0x00200000, 0x80002040, + 0x80000040, 0x80200000, 0x00202040, 0x00000000, + 0x00002000, 0x80000040, 0x80002040, 0x80202000, + 0x80200000, 0x00002040, 0x00000040, 0x80200040, + /* nibble 6 */ + 0x00004000, 0x00000200, 0x01000200, 0x01000004, + 0x01004204, 0x00004004, 0x00004200, 0x00000000, + 0x01000000, 0x01000204, 0x00000204, 0x01004000, + 0x00000004, 0x01004200, 0x01004000, 0x00000204, + 0x01000204, 0x00004000, 0x00004004, 0x01004204, + 0x00000000, 0x01000200, 0x01000004, 0x00004200, + 0x01004004, 0x00004204, 0x01004200, 0x00000004, + 0x00004204, 0x01004004, 0x00000200, 0x01000000, + 0x00004204, 0x01004000, 0x01004004, 0x00000204, + 0x00004000, 0x00000200, 0x01000000, 0x01004004, + 0x01000204, 0x00004204, 0x00004200, 0x00000000, + 0x00000200, 0x01000004, 0x00000004, 0x01000200, + 0x00000000, 0x01000204, 0x01000200, 0x00004200, + 0x00000204, 0x00004000, 0x01004204, 0x01000000, + 0x01004200, 0x00000004, 0x00004004, 0x01004204, + 0x01000004, 0x01004200, 0x01004000, 0x00004004, + /* nibble 7 */ + 0x20800080, 0x20820000, 0x00020080, 0x00000000, + 0x20020000, 0x00800080, 0x20800000, 0x20820080, + 0x00000080, 0x20000000, 0x00820000, 0x00020080, + 0x00820080, 0x20020080, 0x20000080, 0x20800000, + 0x00020000, 0x00820080, 0x00800080, 0x20020000, + 0x20820080, 0x20000080, 0x00000000, 0x00820000, + 0x20000000, 0x00800000, 0x20020080, 0x20800080, + 0x00800000, 0x00020000, 0x20820000, 0x00000080, + 0x00800000, 0x00020000, 0x20000080, 0x20820080, + 0x00020080, 0x20000000, 0x00000000, 0x00820000, + 0x20800080, 0x20020080, 0x20020000, 0x00800080, + 0x20820000, 0x00000080, 0x00800080, 0x20020000, + 0x20820080, 0x00800000, 0x20800000, 0x20000080, + 0x00820000, 0x00020080, 0x20020080, 0x20800000, + 0x00000080, 0x20820000, 0x00820080, 0x00000000, + 0x20000000, 0x20800080, 0x00020000, 0x00820080, +}; + +__device__ __constant__ u32 c_skb[8][64] = +{ + /* for C bits (numbered as per FIPS 46) 1 2 3 4 5 6 */ + 0x00000000, 0x00000010, 0x20000000, 0x20000010, + 0x00010000, 0x00010010, 0x20010000, 0x20010010, + 0x00000800, 0x00000810, 0x20000800, 0x20000810, + 0x00010800, 0x00010810, 0x20010800, 0x20010810, + 0x00000020, 0x00000030, 0x20000020, 0x20000030, + 0x00010020, 0x00010030, 0x20010020, 0x20010030, + 0x00000820, 0x00000830, 0x20000820, 0x20000830, + 0x00010820, 0x00010830, 0x20010820, 0x20010830, + 0x00080000, 0x00080010, 0x20080000, 0x20080010, + 0x00090000, 0x00090010, 0x20090000, 0x20090010, + 0x00080800, 0x00080810, 0x20080800, 0x20080810, + 0x00090800, 0x00090810, 0x20090800, 0x20090810, + 0x00080020, 0x00080030, 0x20080020, 0x20080030, + 0x00090020, 0x00090030, 0x20090020, 0x20090030, + 0x00080820, 0x00080830, 0x20080820, 0x20080830, + 0x00090820, 0x00090830, 0x20090820, 0x20090830, + /* for C bits (numbered as per FIPS 46) 7 8 10 11 12 13 */ + 0x00000000, 0x02000000, 0x00002000, 0x02002000, + 0x00200000, 0x02200000, 0x00202000, 0x02202000, + 0x00000004, 0x02000004, 0x00002004, 0x02002004, + 0x00200004, 0x02200004, 0x00202004, 0x02202004, + 0x00000400, 0x02000400, 0x00002400, 0x02002400, + 0x00200400, 0x02200400, 0x00202400, 0x02202400, + 0x00000404, 0x02000404, 0x00002404, 0x02002404, + 0x00200404, 0x02200404, 0x00202404, 0x02202404, + 0x10000000, 0x12000000, 0x10002000, 0x12002000, + 0x10200000, 0x12200000, 0x10202000, 0x12202000, + 0x10000004, 0x12000004, 0x10002004, 0x12002004, + 0x10200004, 0x12200004, 0x10202004, 0x12202004, + 0x10000400, 0x12000400, 0x10002400, 0x12002400, + 0x10200400, 0x12200400, 0x10202400, 0x12202400, + 0x10000404, 0x12000404, 0x10002404, 0x12002404, + 0x10200404, 0x12200404, 0x10202404, 0x12202404, + /* for C bits (numbered as per FIPS 46) 14 15 16 17 19 20 */ + 0x00000000, 0x00000001, 0x00040000, 0x00040001, + 0x01000000, 0x01000001, 0x01040000, 0x01040001, + 0x00000002, 0x00000003, 0x00040002, 0x00040003, + 0x01000002, 0x01000003, 0x01040002, 0x01040003, + 0x00000200, 0x00000201, 0x00040200, 0x00040201, + 0x01000200, 0x01000201, 0x01040200, 0x01040201, + 0x00000202, 0x00000203, 0x00040202, 0x00040203, + 0x01000202, 0x01000203, 0x01040202, 0x01040203, + 0x08000000, 0x08000001, 0x08040000, 0x08040001, + 0x09000000, 0x09000001, 0x09040000, 0x09040001, + 0x08000002, 0x08000003, 0x08040002, 0x08040003, + 0x09000002, 0x09000003, 0x09040002, 0x09040003, + 0x08000200, 0x08000201, 0x08040200, 0x08040201, + 0x09000200, 0x09000201, 0x09040200, 0x09040201, + 0x08000202, 0x08000203, 0x08040202, 0x08040203, + 0x09000202, 0x09000203, 0x09040202, 0x09040203, + /* for C bits (numbered as per FIPS 46) 21 23 24 26 27 28 */ + 0x00000000, 0x00100000, 0x00000100, 0x00100100, + 0x00000008, 0x00100008, 0x00000108, 0x00100108, + 0x00001000, 0x00101000, 0x00001100, 0x00101100, + 0x00001008, 0x00101008, 0x00001108, 0x00101108, + 0x04000000, 0x04100000, 0x04000100, 0x04100100, + 0x04000008, 0x04100008, 0x04000108, 0x04100108, + 0x04001000, 0x04101000, 0x04001100, 0x04101100, + 0x04001008, 0x04101008, 0x04001108, 0x04101108, + 0x00020000, 0x00120000, 0x00020100, 0x00120100, + 0x00020008, 0x00120008, 0x00020108, 0x00120108, + 0x00021000, 0x00121000, 0x00021100, 0x00121100, + 0x00021008, 0x00121008, 0x00021108, 0x00121108, + 0x04020000, 0x04120000, 0x04020100, 0x04120100, + 0x04020008, 0x04120008, 0x04020108, 0x04120108, + 0x04021000, 0x04121000, 0x04021100, 0x04121100, + 0x04021008, 0x04121008, 0x04021108, 0x04121108, + /* for D bits (numbered as per FIPS 46) 1 2 3 4 5 6 */ + 0x00000000, 0x10000000, 0x00010000, 0x10010000, + 0x00000004, 0x10000004, 0x00010004, 0x10010004, + 0x20000000, 0x30000000, 0x20010000, 0x30010000, + 0x20000004, 0x30000004, 0x20010004, 0x30010004, + 0x00100000, 0x10100000, 0x00110000, 0x10110000, + 0x00100004, 0x10100004, 0x00110004, 0x10110004, + 0x20100000, 0x30100000, 0x20110000, 0x30110000, + 0x20100004, 0x30100004, 0x20110004, 0x30110004, + 0x00001000, 0x10001000, 0x00011000, 0x10011000, + 0x00001004, 0x10001004, 0x00011004, 0x10011004, + 0x20001000, 0x30001000, 0x20011000, 0x30011000, + 0x20001004, 0x30001004, 0x20011004, 0x30011004, + 0x00101000, 0x10101000, 0x00111000, 0x10111000, + 0x00101004, 0x10101004, 0x00111004, 0x10111004, + 0x20101000, 0x30101000, 0x20111000, 0x30111000, + 0x20101004, 0x30101004, 0x20111004, 0x30111004, + /* for D bits (numbered as per FIPS 46) 8 9 11 12 13 14 */ + 0x00000000, 0x08000000, 0x00000008, 0x08000008, + 0x00000400, 0x08000400, 0x00000408, 0x08000408, + 0x00020000, 0x08020000, 0x00020008, 0x08020008, + 0x00020400, 0x08020400, 0x00020408, 0x08020408, + 0x00000001, 0x08000001, 0x00000009, 0x08000009, + 0x00000401, 0x08000401, 0x00000409, 0x08000409, + 0x00020001, 0x08020001, 0x00020009, 0x08020009, + 0x00020401, 0x08020401, 0x00020409, 0x08020409, + 0x02000000, 0x0A000000, 0x02000008, 0x0A000008, + 0x02000400, 0x0A000400, 0x02000408, 0x0A000408, + 0x02020000, 0x0A020000, 0x02020008, 0x0A020008, + 0x02020400, 0x0A020400, 0x02020408, 0x0A020408, + 0x02000001, 0x0A000001, 0x02000009, 0x0A000009, + 0x02000401, 0x0A000401, 0x02000409, 0x0A000409, + 0x02020001, 0x0A020001, 0x02020009, 0x0A020009, + 0x02020401, 0x0A020401, 0x02020409, 0x0A020409, + /* for D bits (numbered as per FIPS 46) 16 17 18 19 20 21 */ + 0x00000000, 0x00000100, 0x00080000, 0x00080100, + 0x01000000, 0x01000100, 0x01080000, 0x01080100, + 0x00000010, 0x00000110, 0x00080010, 0x00080110, + 0x01000010, 0x01000110, 0x01080010, 0x01080110, + 0x00200000, 0x00200100, 0x00280000, 0x00280100, + 0x01200000, 0x01200100, 0x01280000, 0x01280100, + 0x00200010, 0x00200110, 0x00280010, 0x00280110, + 0x01200010, 0x01200110, 0x01280010, 0x01280110, + 0x00000200, 0x00000300, 0x00080200, 0x00080300, + 0x01000200, 0x01000300, 0x01080200, 0x01080300, + 0x00000210, 0x00000310, 0x00080210, 0x00080310, + 0x01000210, 0x01000310, 0x01080210, 0x01080310, + 0x00200200, 0x00200300, 0x00280200, 0x00280300, + 0x01200200, 0x01200300, 0x01280200, 0x01280300, + 0x00200210, 0x00200310, 0x00280210, 0x00280310, + 0x01200210, 0x01200310, 0x01280210, 0x01280310, + /* for D bits (numbered as per FIPS 46) 22 23 24 25 27 28 */ + 0x00000000, 0x04000000, 0x00040000, 0x04040000, + 0x00000002, 0x04000002, 0x00040002, 0x04040002, + 0x00002000, 0x04002000, 0x00042000, 0x04042000, + 0x00002002, 0x04002002, 0x00042002, 0x04042002, + 0x00000020, 0x04000020, 0x00040020, 0x04040020, + 0x00000022, 0x04000022, 0x00040022, 0x04040022, + 0x00002020, 0x04002020, 0x00042020, 0x04042020, + 0x00002022, 0x04002022, 0x00042022, 0x04042022, + 0x00000800, 0x04000800, 0x00040800, 0x04040800, + 0x00000802, 0x04000802, 0x00040802, 0x04040802, + 0x00002800, 0x04002800, 0x00042800, 0x04042800, + 0x00002802, 0x04002802, 0x00042802, 0x04042802, + 0x00000820, 0x04000820, 0x00040820, 0x04040820, + 0x00000822, 0x04000822, 0x00040822, 0x04040822, + 0x00002820, 0x04002820, 0x00042820, 0x04042820, + 0x00002822, 0x04002822, 0x00042822, 0x04042822 +}; + +#ifdef VECT_SIZE1 +#define BOX(i,n,S) u32x ((S)[(n)][(i)]) +#endif + +#ifdef VECT_SIZE2 +#define BOX(i,n,S) u32x ((S)[(n)][(i).x], (S)[(n)][(i).y]) +#endif + +__device__ static void _des_crypt_encrypt (u32x iv[2], u32x data[2], u32x Kc[16], u32x Kd[16], u32 s_SPtrans[8][64]) +{ + u32x tt; + + u32x r = data[0]; + u32x l = data[1]; + + IP (r, l, tt); + + r = rotl32 (r, 3u); + l = rotl32 (l, 3u); + + #pragma unroll 16 + for (int i = 0; i < 16; i++) + { + u32x u = Kc[i] ^ r; + u32x t = Kd[i] ^ rotl32 (r, 28u); + + l ^= BOX (((u >> 2) & 0x3f), 0, s_SPtrans) + | BOX (((u >> 10) & 0x3f), 2, s_SPtrans) + | BOX (((u >> 18) & 0x3f), 4, s_SPtrans) + | BOX (((u >> 26) & 0x3f), 6, s_SPtrans) + | BOX (((t >> 2) & 0x3f), 1, s_SPtrans) + | BOX (((t >> 10) & 0x3f), 3, s_SPtrans) + | BOX (((t >> 18) & 0x3f), 5, s_SPtrans) + | BOX (((t >> 26) & 0x3f), 7, s_SPtrans); + + tt = l; + l = r; + r = tt; + } + + l = rotl32 (l, 29u); + r = rotl32 (r, 29u); + + FP (r, l, tt); + + iv[0] = l; + iv[1] = r; +} + +__device__ static void _des_crypt_keysetup (u32x c, u32x d, u32x Kc[16], u32x Kd[16], u32 s_skb[8][64]) +{ + u32x tt; + + PERM_OP (d, c, tt, 4, 0x0f0f0f0f); + HPERM_OP (c, tt, 2, 0xcccc0000); + HPERM_OP (d, tt, 2, 0xcccc0000); + PERM_OP (d, c, tt, 1, 0x55555555); + PERM_OP (c, d, tt, 8, 0x00ff00ff); + PERM_OP (d, c, tt, 1, 0x55555555); + + d = ((d & 0x000000ff) << 16) + | ((d & 0x0000ff00) << 0) + | ((d & 0x00ff0000) >> 16) + | ((c & 0xf0000000) >> 4); + + c = c & 0x0fffffff; + + #pragma unroll 16 + for (int i = 0; i < 16; i++) + { + const u32 shifts3s0[16] = { 1, 1, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 1 }; + const u32 shifts3s1[16] = { 27, 27, 26, 26, 26, 26, 26, 26, 27, 26, 26, 26, 26, 26, 26, 27 }; + + c = c >> shifts3s0[i] | c << shifts3s1[i]; + d = d >> shifts3s0[i] | d << shifts3s1[i]; + + c = c & 0x0fffffff; + d = d & 0x0fffffff; + + u32x s = BOX ((( c >> 0) & 0x3f), 0, s_skb) + | BOX ((((c >> 6) & 0x03) + | ((c >> 7) & 0x3c)), 1, s_skb) + | BOX ((((c >> 13) & 0x0f) + | ((c >> 14) & 0x30)), 2, s_skb) + | BOX ((((c >> 20) & 0x01) + | ((c >> 21) & 0x06) + | ((c >> 22) & 0x38)), 3, s_skb); + + u32x t = BOX ((( d >> 0) & 0x3f), 4, s_skb) + | BOX ((((d >> 7) & 0x03) + | ((d >> 8) & 0x3c)), 5, s_skb) + | BOX ((((d >> 15) & 0x3f)), 6, s_skb) + | BOX ((((d >> 21) & 0x0f) + | ((d >> 22) & 0x30)), 7, s_skb); + + #if __CUDA_ARCH__ >= 200 + Kc[i] = __byte_perm (s, t, 0x5410); + Kd[i] = __byte_perm (s, t, 0x7632); + #else + Kc[i] = ((t << 16) | (s & 0x0000ffff)); + Kd[i] = ((s >> 16) | (t & 0xffff0000)); + #endif + + Kc[i] = rotl32 (Kc[i], 2u); + Kd[i] = rotl32 (Kd[i], 2u); + } +} + +__device__ __constant__ comb_t c_combs[1024]; + +extern "C" __global__ void __launch_bounds__ (256, 1) m03100_m04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, c_combs[0].pw_len); + } + + /** + * sbox, kbox + */ + + __shared__ u32 s_SPtrans[8][64]; + + __shared__ u32 s_skb[8][64]; + + if (lid < 64) + { + s_SPtrans[0][lid] = c_SPtrans[0][lid]; + s_SPtrans[1][lid] = c_SPtrans[1][lid]; + s_SPtrans[2][lid] = c_SPtrans[2][lid]; + s_SPtrans[3][lid] = c_SPtrans[3][lid]; + s_SPtrans[4][lid] = c_SPtrans[4][lid]; + s_SPtrans[5][lid] = c_SPtrans[5][lid]; + s_SPtrans[6][lid] = c_SPtrans[6][lid]; + s_SPtrans[7][lid] = c_SPtrans[7][lid]; + + s_skb[0][lid] = c_skb[0][lid]; + s_skb[1][lid] = c_skb[1][lid]; + s_skb[2][lid] = c_skb[2][lid]; + s_skb[3][lid] = c_skb[3][lid]; + s_skb[4][lid] = c_skb[4][lid]; + s_skb[5][lid] = c_skb[5][lid]; + s_skb[6][lid] = c_skb[6][lid]; + s_skb[7][lid] = c_skb[7][lid]; + } + + __syncthreads (); + + if (gid >= gid_max) return; + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[7]; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = c_combs[il_pos].pw_len; + + const u32 pw_len = pw_l_len + pw_r_len; + + const u32 salt_word_len = (salt_len + pw_len) * 2; + + u32 wordr0[4]; + + wordr0[0] = c_combs[il_pos].i[0]; + wordr0[1] = c_combs[il_pos].i[1]; + wordr0[2] = c_combs[il_pos].i[2]; + wordr0[3] = c_combs[il_pos].i[3]; + + u32 wordr1[4]; + + wordr1[0] = c_combs[il_pos].i[4]; + wordr1[1] = c_combs[il_pos].i[5]; + wordr1[2] = c_combs[il_pos].i[6]; + wordr1[3] = c_combs[il_pos].i[7]; + + u32 wordr2[4]; + + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + + u32 wordr3[4]; + + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + u32x w0[4]; + + w0[0] = wordl0[0] | wordr0[0]; + w0[1] = wordl0[1] | wordr0[1]; + w0[2] = wordl0[2] | wordr0[2]; + w0[3] = wordl0[3] | wordr0[3]; + + u32x w1[4]; + + w1[0] = wordl1[0] | wordr1[0]; + w1[1] = wordl1[1] | wordr1[1]; + w1[2] = wordl1[2] | wordr1[2]; + w1[3] = wordl1[3] | wordr1[3]; + + u32x w2[4]; + + w2[0] = wordl2[0] | wordr2[0]; + w2[1] = wordl2[1] | wordr2[1]; + w2[2] = wordl2[2] | wordr2[2]; + w2[3] = wordl2[3] | wordr2[3]; + + u32x w3[4]; + + w3[0] = wordl3[0] | wordr3[0]; + w3[1] = wordl3[1] | wordr3[1]; + w3[2] = wordl3[2] | wordr3[2]; + w3[3] = wordl3[3] | wordr3[3]; + + /** + * prepend salt + */ + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + w0_t[0] = w0[0]; + w0_t[1] = w0[1]; + w0_t[2] = w0[2]; + w0_t[3] = w0[3]; + w1_t[0] = w1[0]; + w1_t[1] = w1[1]; + w1_t[2] = w1[2]; + w1_t[3] = w1[3]; + w2_t[0] = w2[0]; + w2_t[1] = w2[1]; + w2_t[2] = w2[2]; + w2_t[3] = w2[3]; + w3_t[0] = w3[0]; + w3_t[1] = w3[1]; + w3_t[2] = w3[2]; + w3_t[3] = w3[3]; + + switch_buffer_by_offset (w0_t, w1_t, w2_t, w3_t, salt_len); + + w0_t[0] |= salt_buf0[0]; + w0_t[1] |= salt_buf0[1]; + w0_t[2] |= salt_buf0[2]; + w0_t[3] |= salt_buf0[3]; + w1_t[0] |= salt_buf1[0]; + w1_t[1] |= salt_buf1[1]; + w1_t[2] |= salt_buf1[2]; + w1_t[3] |= salt_buf1[3]; + + u32x dst[16]; + + dst[ 0] = w0_t[0]; + dst[ 1] = w0_t[1]; + dst[ 2] = w0_t[2]; + dst[ 3] = w0_t[3]; + dst[ 4] = w1_t[0]; + dst[ 5] = w1_t[1]; + dst[ 6] = w1_t[2]; + dst[ 7] = w1_t[3]; + dst[ 8] = w2_t[0]; + dst[ 9] = w2_t[1]; + dst[10] = w2_t[2]; + dst[11] = w2_t[3]; + dst[12] = 0; + dst[13] = 0; + dst[14] = 0; + dst[15] = 0; + + /** + * precompute key1 since key is static: 0x0123456789abcdef + * plus LEFT_ROTATE by 2 + */ + + u32x Kc[16]; + + Kc[ 0] = 0x64649040; + Kc[ 1] = 0x14909858; + Kc[ 2] = 0xc4b44888; + Kc[ 3] = 0x9094e438; + Kc[ 4] = 0xd8a004f0; + Kc[ 5] = 0xa8f02810; + Kc[ 6] = 0xc84048d8; + Kc[ 7] = 0x68d804a8; + Kc[ 8] = 0x0490e40c; + Kc[ 9] = 0xac183024; + Kc[10] = 0x24c07c10; + Kc[11] = 0x8c88c038; + Kc[12] = 0xc048c824; + Kc[13] = 0x4c0470a8; + Kc[14] = 0x584020b4; + Kc[15] = 0x00742c4c; + + u32x Kd[16]; + + Kd[ 0] = 0xa42ce40c; + Kd[ 1] = 0x64689858; + Kd[ 2] = 0x484050b8; + Kd[ 3] = 0xe8184814; + Kd[ 4] = 0x405cc070; + Kd[ 5] = 0xa010784c; + Kd[ 6] = 0x6074a800; + Kd[ 7] = 0x80701c1c; + Kd[ 8] = 0x9cd49430; + Kd[ 9] = 0x4c8ce078; + Kd[10] = 0x5c18c088; + Kd[11] = 0x28a8a4c8; + Kd[12] = 0x3c180838; + Kd[13] = 0xb0b86c20; + Kd[14] = 0xac84a094; + Kd[15] = 0x4ce0c0c4; + + /** + * key1 (generate key) + */ + + u32x iv[2]; + + iv[0] = 0; + iv[1] = 0; + + for (u32 j = 0, k = 0; j < salt_word_len; j += 8, k++) + { + u32x data[2]; + + data[0] = ((dst[k] << 16) & 0xff000000) | ((dst[k] << 8) & 0x0000ff00); + data[1] = ((dst[k] >> 0) & 0xff000000) | ((dst[k] >> 8) & 0x0000ff00); + + data[0] ^= iv[0]; + data[1] ^= iv[1]; + + _des_crypt_encrypt (iv, data, Kc, Kd, s_SPtrans); + } + + /** + * key2 (generate hash) + */ + + _des_crypt_keysetup (iv[0], iv[1], Kc, Kd, s_skb); + + iv[0] = 0; + iv[1] = 0; + + for (u32 j = 0, k = 0; j < salt_word_len; j += 8, k++) + { + u32x data[2]; + + data[0] = ((dst[k] << 16) & 0xff000000) | ((dst[k] << 8) & 0x0000ff00); + data[1] = ((dst[k] >> 0) & 0xff000000) | ((dst[k] >> 8) & 0x0000ff00); + + data[0] ^= iv[0]; + data[1] ^= iv[1]; + + _des_crypt_encrypt (iv, data, Kc, Kd, s_SPtrans); + } + + /** + * cmp + */ + + const u32x r0 = iv[0]; + const u32x r1 = iv[1]; + const u32x r2 = 0; + const u32x r3 = 0; + + #include VECT_COMPARE_M + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m03100_m08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m03100_m16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m03100_s04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, c_combs[0].pw_len); + } + + /** + * sbox, kbox + */ + + __shared__ u32 s_SPtrans[8][64]; + + __shared__ u32 s_skb[8][64]; + + if (lid < 64) + { + s_SPtrans[0][lid] = c_SPtrans[0][lid]; + s_SPtrans[1][lid] = c_SPtrans[1][lid]; + s_SPtrans[2][lid] = c_SPtrans[2][lid]; + s_SPtrans[3][lid] = c_SPtrans[3][lid]; + s_SPtrans[4][lid] = c_SPtrans[4][lid]; + s_SPtrans[5][lid] = c_SPtrans[5][lid]; + s_SPtrans[6][lid] = c_SPtrans[6][lid]; + s_SPtrans[7][lid] = c_SPtrans[7][lid]; + + s_skb[0][lid] = c_skb[0][lid]; + s_skb[1][lid] = c_skb[1][lid]; + s_skb[2][lid] = c_skb[2][lid]; + s_skb[3][lid] = c_skb[3][lid]; + s_skb[4][lid] = c_skb[4][lid]; + s_skb[5][lid] = c_skb[5][lid]; + s_skb[6][lid] = c_skb[6][lid]; + s_skb[7][lid] = c_skb[7][lid]; + } + + __syncthreads (); + + if (gid >= gid_max) return; + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[7]; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = c_combs[il_pos].pw_len; + + const u32 pw_len = pw_l_len + pw_r_len; + + const u32 salt_word_len = (salt_len + pw_len) * 2; + + u32 wordr0[4]; + + wordr0[0] = c_combs[il_pos].i[0]; + wordr0[1] = c_combs[il_pos].i[1]; + wordr0[2] = c_combs[il_pos].i[2]; + wordr0[3] = c_combs[il_pos].i[3]; + + u32 wordr1[4]; + + wordr1[0] = c_combs[il_pos].i[4]; + wordr1[1] = c_combs[il_pos].i[5]; + wordr1[2] = c_combs[il_pos].i[6]; + wordr1[3] = c_combs[il_pos].i[7]; + + u32 wordr2[4]; + + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + + u32 wordr3[4]; + + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + u32x w0[4]; + + w0[0] = wordl0[0] | wordr0[0]; + w0[1] = wordl0[1] | wordr0[1]; + w0[2] = wordl0[2] | wordr0[2]; + w0[3] = wordl0[3] | wordr0[3]; + + u32x w1[4]; + + w1[0] = wordl1[0] | wordr1[0]; + w1[1] = wordl1[1] | wordr1[1]; + w1[2] = wordl1[2] | wordr1[2]; + w1[3] = wordl1[3] | wordr1[3]; + + u32x w2[4]; + + w2[0] = wordl2[0] | wordr2[0]; + w2[1] = wordl2[1] | wordr2[1]; + w2[2] = wordl2[2] | wordr2[2]; + w2[3] = wordl2[3] | wordr2[3]; + + u32x w3[4]; + + w3[0] = wordl3[0] | wordr3[0]; + w3[1] = wordl3[1] | wordr3[1]; + w3[2] = wordl3[2] | wordr3[2]; + w3[3] = wordl3[3] | wordr3[3]; + + /** + * prepend salt + */ + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + w0_t[0] = w0[0]; + w0_t[1] = w0[1]; + w0_t[2] = w0[2]; + w0_t[3] = w0[3]; + w1_t[0] = w1[0]; + w1_t[1] = w1[1]; + w1_t[2] = w1[2]; + w1_t[3] = w1[3]; + w2_t[0] = w2[0]; + w2_t[1] = w2[1]; + w2_t[2] = w2[2]; + w2_t[3] = w2[3]; + w3_t[0] = w3[0]; + w3_t[1] = w3[1]; + w3_t[2] = w3[2]; + w3_t[3] = w3[3]; + + switch_buffer_by_offset (w0_t, w1_t, w2_t, w3_t, salt_len); + + w0_t[0] |= salt_buf0[0]; + w0_t[1] |= salt_buf0[1]; + w0_t[2] |= salt_buf0[2]; + w0_t[3] |= salt_buf0[3]; + w1_t[0] |= salt_buf1[0]; + w1_t[1] |= salt_buf1[1]; + w1_t[2] |= salt_buf1[2]; + w1_t[3] |= salt_buf1[3]; + + u32x dst[16]; + + dst[ 0] = w0_t[0]; + dst[ 1] = w0_t[1]; + dst[ 2] = w0_t[2]; + dst[ 3] = w0_t[3]; + dst[ 4] = w1_t[0]; + dst[ 5] = w1_t[1]; + dst[ 6] = w1_t[2]; + dst[ 7] = w1_t[3]; + dst[ 8] = w2_t[0]; + dst[ 9] = w2_t[1]; + dst[10] = w2_t[2]; + dst[11] = w2_t[3]; + dst[12] = 0; + dst[13] = 0; + dst[14] = 0; + dst[15] = 0; + + /** + * precompute key1 since key is static: 0x0123456789abcdef + * plus LEFT_ROTATE by 2 + */ + + u32x Kc[16]; + + Kc[ 0] = 0x64649040; + Kc[ 1] = 0x14909858; + Kc[ 2] = 0xc4b44888; + Kc[ 3] = 0x9094e438; + Kc[ 4] = 0xd8a004f0; + Kc[ 5] = 0xa8f02810; + Kc[ 6] = 0xc84048d8; + Kc[ 7] = 0x68d804a8; + Kc[ 8] = 0x0490e40c; + Kc[ 9] = 0xac183024; + Kc[10] = 0x24c07c10; + Kc[11] = 0x8c88c038; + Kc[12] = 0xc048c824; + Kc[13] = 0x4c0470a8; + Kc[14] = 0x584020b4; + Kc[15] = 0x00742c4c; + + u32x Kd[16]; + + Kd[ 0] = 0xa42ce40c; + Kd[ 1] = 0x64689858; + Kd[ 2] = 0x484050b8; + Kd[ 3] = 0xe8184814; + Kd[ 4] = 0x405cc070; + Kd[ 5] = 0xa010784c; + Kd[ 6] = 0x6074a800; + Kd[ 7] = 0x80701c1c; + Kd[ 8] = 0x9cd49430; + Kd[ 9] = 0x4c8ce078; + Kd[10] = 0x5c18c088; + Kd[11] = 0x28a8a4c8; + Kd[12] = 0x3c180838; + Kd[13] = 0xb0b86c20; + Kd[14] = 0xac84a094; + Kd[15] = 0x4ce0c0c4; + + /** + * key1 (generate key) + */ + + u32x iv[2]; + + iv[0] = 0; + iv[1] = 0; + + for (u32 j = 0, k = 0; j < salt_word_len; j += 8, k++) + { + u32x data[2]; + + data[0] = ((dst[k] << 16) & 0xff000000) | ((dst[k] << 8) & 0x0000ff00); + data[1] = ((dst[k] >> 0) & 0xff000000) | ((dst[k] >> 8) & 0x0000ff00); + + data[0] ^= iv[0]; + data[1] ^= iv[1]; + + _des_crypt_encrypt (iv, data, Kc, Kd, s_SPtrans); + } + + /** + * key2 (generate hash) + */ + + _des_crypt_keysetup (iv[0], iv[1], Kc, Kd, s_skb); + + iv[0] = 0; + iv[1] = 0; + + for (u32 j = 0, k = 0; j < salt_word_len; j += 8, k++) + { + u32x data[2]; + + data[0] = ((dst[k] << 16) & 0xff000000) | ((dst[k] << 8) & 0x0000ff00); + data[1] = ((dst[k] >> 0) & 0xff000000) | ((dst[k] >> 8) & 0x0000ff00); + + data[0] ^= iv[0]; + data[1] ^= iv[1]; + + _des_crypt_encrypt (iv, data, Kc, Kd, s_SPtrans); + } + + /** + * cmp + */ + + const u32x r0 = iv[0]; + const u32x r1 = iv[1]; + const u32x r2 = 0; + const u32x r3 = 0; + + #include VECT_COMPARE_S + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m03100_s08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m03100_s16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/nv/m03100_a3.cu b/nv/m03100_a3.cu new file mode 100644 index 0000000000..1efe7a930c --- /dev/null +++ b/nv/m03100_a3.cu @@ -0,0 +1,1363 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _DES_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW2 +#define VECT_SIZE1 +#endif + +#define DGST_R0 0 +#define DGST_R1 1 +#define DGST_R2 2 +#define DGST_R3 3 + +#include "include/kernel_functions.c" +#include "types_nv.c" +#include "common_nv.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#define PERM_OP(a,b,tt,n,m) \ +{ \ + tt = a >> n; \ + tt = tt ^ b; \ + tt = tt & m; \ + b = b ^ tt; \ + tt = tt << n; \ + a = a ^ tt; \ +} + +#define HPERM_OP(a,tt,n,m) \ +{ \ + tt = a << (16 + n); \ + tt = tt ^ a; \ + tt = tt & m; \ + a = a ^ tt; \ + tt = tt >> (16 + n); \ + a = a ^ tt; \ +} + +#define IP(l,r,tt) \ +{ \ + PERM_OP (r, l, tt, 4, 0x0f0f0f0f); \ + PERM_OP (l, r, tt, 16, 0x0000ffff); \ + PERM_OP (r, l, tt, 2, 0x33333333); \ + PERM_OP (l, r, tt, 8, 0x00ff00ff); \ + PERM_OP (r, l, tt, 1, 0x55555555); \ +} + +#define FP(l,r,tt) \ +{ \ + PERM_OP (l, r, tt, 1, 0x55555555); \ + PERM_OP (r, l, tt, 8, 0x00ff00ff); \ + PERM_OP (l, r, tt, 2, 0x33333333); \ + PERM_OP (r, l, tt, 16, 0x0000ffff); \ + PERM_OP (l, r, tt, 4, 0x0f0f0f0f); \ +} + +__device__ __constant__ u32 c_SPtrans[8][64] = +{ + /* nibble 0 */ + 0x02080800, 0x00080000, 0x02000002, 0x02080802, + 0x02000000, 0x00080802, 0x00080002, 0x02000002, + 0x00080802, 0x02080800, 0x02080000, 0x00000802, + 0x02000802, 0x02000000, 0x00000000, 0x00080002, + 0x00080000, 0x00000002, 0x02000800, 0x00080800, + 0x02080802, 0x02080000, 0x00000802, 0x02000800, + 0x00000002, 0x00000800, 0x00080800, 0x02080002, + 0x00000800, 0x02000802, 0x02080002, 0x00000000, + 0x00000000, 0x02080802, 0x02000800, 0x00080002, + 0x02080800, 0x00080000, 0x00000802, 0x02000800, + 0x02080002, 0x00000800, 0x00080800, 0x02000002, + 0x00080802, 0x00000002, 0x02000002, 0x02080000, + 0x02080802, 0x00080800, 0x02080000, 0x02000802, + 0x02000000, 0x00000802, 0x00080002, 0x00000000, + 0x00080000, 0x02000000, 0x02000802, 0x02080800, + 0x00000002, 0x02080002, 0x00000800, 0x00080802, + /* nibble 1 */ + 0x40108010, 0x00000000, 0x00108000, 0x40100000, + 0x40000010, 0x00008010, 0x40008000, 0x00108000, + 0x00008000, 0x40100010, 0x00000010, 0x40008000, + 0x00100010, 0x40108000, 0x40100000, 0x00000010, + 0x00100000, 0x40008010, 0x40100010, 0x00008000, + 0x00108010, 0x40000000, 0x00000000, 0x00100010, + 0x40008010, 0x00108010, 0x40108000, 0x40000010, + 0x40000000, 0x00100000, 0x00008010, 0x40108010, + 0x00100010, 0x40108000, 0x40008000, 0x00108010, + 0x40108010, 0x00100010, 0x40000010, 0x00000000, + 0x40000000, 0x00008010, 0x00100000, 0x40100010, + 0x00008000, 0x40000000, 0x00108010, 0x40008010, + 0x40108000, 0x00008000, 0x00000000, 0x40000010, + 0x00000010, 0x40108010, 0x00108000, 0x40100000, + 0x40100010, 0x00100000, 0x00008010, 0x40008000, + 0x40008010, 0x00000010, 0x40100000, 0x00108000, + /* nibble 2 */ + 0x04000001, 0x04040100, 0x00000100, 0x04000101, + 0x00040001, 0x04000000, 0x04000101, 0x00040100, + 0x04000100, 0x00040000, 0x04040000, 0x00000001, + 0x04040101, 0x00000101, 0x00000001, 0x04040001, + 0x00000000, 0x00040001, 0x04040100, 0x00000100, + 0x00000101, 0x04040101, 0x00040000, 0x04000001, + 0x04040001, 0x04000100, 0x00040101, 0x04040000, + 0x00040100, 0x00000000, 0x04000000, 0x00040101, + 0x04040100, 0x00000100, 0x00000001, 0x00040000, + 0x00000101, 0x00040001, 0x04040000, 0x04000101, + 0x00000000, 0x04040100, 0x00040100, 0x04040001, + 0x00040001, 0x04000000, 0x04040101, 0x00000001, + 0x00040101, 0x04000001, 0x04000000, 0x04040101, + 0x00040000, 0x04000100, 0x04000101, 0x00040100, + 0x04000100, 0x00000000, 0x04040001, 0x00000101, + 0x04000001, 0x00040101, 0x00000100, 0x04040000, + /* nibble 3 */ + 0x00401008, 0x10001000, 0x00000008, 0x10401008, + 0x00000000, 0x10400000, 0x10001008, 0x00400008, + 0x10401000, 0x10000008, 0x10000000, 0x00001008, + 0x10000008, 0x00401008, 0x00400000, 0x10000000, + 0x10400008, 0x00401000, 0x00001000, 0x00000008, + 0x00401000, 0x10001008, 0x10400000, 0x00001000, + 0x00001008, 0x00000000, 0x00400008, 0x10401000, + 0x10001000, 0x10400008, 0x10401008, 0x00400000, + 0x10400008, 0x00001008, 0x00400000, 0x10000008, + 0x00401000, 0x10001000, 0x00000008, 0x10400000, + 0x10001008, 0x00000000, 0x00001000, 0x00400008, + 0x00000000, 0x10400008, 0x10401000, 0x00001000, + 0x10000000, 0x10401008, 0x00401008, 0x00400000, + 0x10401008, 0x00000008, 0x10001000, 0x00401008, + 0x00400008, 0x00401000, 0x10400000, 0x10001008, + 0x00001008, 0x10000000, 0x10000008, 0x10401000, + /* nibble 4 */ + 0x08000000, 0x00010000, 0x00000400, 0x08010420, + 0x08010020, 0x08000400, 0x00010420, 0x08010000, + 0x00010000, 0x00000020, 0x08000020, 0x00010400, + 0x08000420, 0x08010020, 0x08010400, 0x00000000, + 0x00010400, 0x08000000, 0x00010020, 0x00000420, + 0x08000400, 0x00010420, 0x00000000, 0x08000020, + 0x00000020, 0x08000420, 0x08010420, 0x00010020, + 0x08010000, 0x00000400, 0x00000420, 0x08010400, + 0x08010400, 0x08000420, 0x00010020, 0x08010000, + 0x00010000, 0x00000020, 0x08000020, 0x08000400, + 0x08000000, 0x00010400, 0x08010420, 0x00000000, + 0x00010420, 0x08000000, 0x00000400, 0x00010020, + 0x08000420, 0x00000400, 0x00000000, 0x08010420, + 0x08010020, 0x08010400, 0x00000420, 0x00010000, + 0x00010400, 0x08010020, 0x08000400, 0x00000420, + 0x00000020, 0x00010420, 0x08010000, 0x08000020, + /* nibble 5 */ + 0x80000040, 0x00200040, 0x00000000, 0x80202000, + 0x00200040, 0x00002000, 0x80002040, 0x00200000, + 0x00002040, 0x80202040, 0x00202000, 0x80000000, + 0x80002000, 0x80000040, 0x80200000, 0x00202040, + 0x00200000, 0x80002040, 0x80200040, 0x00000000, + 0x00002000, 0x00000040, 0x80202000, 0x80200040, + 0x80202040, 0x80200000, 0x80000000, 0x00002040, + 0x00000040, 0x00202000, 0x00202040, 0x80002000, + 0x00002040, 0x80000000, 0x80002000, 0x00202040, + 0x80202000, 0x00200040, 0x00000000, 0x80002000, + 0x80000000, 0x00002000, 0x80200040, 0x00200000, + 0x00200040, 0x80202040, 0x00202000, 0x00000040, + 0x80202040, 0x00202000, 0x00200000, 0x80002040, + 0x80000040, 0x80200000, 0x00202040, 0x00000000, + 0x00002000, 0x80000040, 0x80002040, 0x80202000, + 0x80200000, 0x00002040, 0x00000040, 0x80200040, + /* nibble 6 */ + 0x00004000, 0x00000200, 0x01000200, 0x01000004, + 0x01004204, 0x00004004, 0x00004200, 0x00000000, + 0x01000000, 0x01000204, 0x00000204, 0x01004000, + 0x00000004, 0x01004200, 0x01004000, 0x00000204, + 0x01000204, 0x00004000, 0x00004004, 0x01004204, + 0x00000000, 0x01000200, 0x01000004, 0x00004200, + 0x01004004, 0x00004204, 0x01004200, 0x00000004, + 0x00004204, 0x01004004, 0x00000200, 0x01000000, + 0x00004204, 0x01004000, 0x01004004, 0x00000204, + 0x00004000, 0x00000200, 0x01000000, 0x01004004, + 0x01000204, 0x00004204, 0x00004200, 0x00000000, + 0x00000200, 0x01000004, 0x00000004, 0x01000200, + 0x00000000, 0x01000204, 0x01000200, 0x00004200, + 0x00000204, 0x00004000, 0x01004204, 0x01000000, + 0x01004200, 0x00000004, 0x00004004, 0x01004204, + 0x01000004, 0x01004200, 0x01004000, 0x00004004, + /* nibble 7 */ + 0x20800080, 0x20820000, 0x00020080, 0x00000000, + 0x20020000, 0x00800080, 0x20800000, 0x20820080, + 0x00000080, 0x20000000, 0x00820000, 0x00020080, + 0x00820080, 0x20020080, 0x20000080, 0x20800000, + 0x00020000, 0x00820080, 0x00800080, 0x20020000, + 0x20820080, 0x20000080, 0x00000000, 0x00820000, + 0x20000000, 0x00800000, 0x20020080, 0x20800080, + 0x00800000, 0x00020000, 0x20820000, 0x00000080, + 0x00800000, 0x00020000, 0x20000080, 0x20820080, + 0x00020080, 0x20000000, 0x00000000, 0x00820000, + 0x20800080, 0x20020080, 0x20020000, 0x00800080, + 0x20820000, 0x00000080, 0x00800080, 0x20020000, + 0x20820080, 0x00800000, 0x20800000, 0x20000080, + 0x00820000, 0x00020080, 0x20020080, 0x20800000, + 0x00000080, 0x20820000, 0x00820080, 0x00000000, + 0x20000000, 0x20800080, 0x00020000, 0x00820080, +}; + +__device__ __constant__ u32 c_skb[8][64] = +{ + /* for C bits (numbered as per FIPS 46) 1 2 3 4 5 6 */ + 0x00000000, 0x00000010, 0x20000000, 0x20000010, + 0x00010000, 0x00010010, 0x20010000, 0x20010010, + 0x00000800, 0x00000810, 0x20000800, 0x20000810, + 0x00010800, 0x00010810, 0x20010800, 0x20010810, + 0x00000020, 0x00000030, 0x20000020, 0x20000030, + 0x00010020, 0x00010030, 0x20010020, 0x20010030, + 0x00000820, 0x00000830, 0x20000820, 0x20000830, + 0x00010820, 0x00010830, 0x20010820, 0x20010830, + 0x00080000, 0x00080010, 0x20080000, 0x20080010, + 0x00090000, 0x00090010, 0x20090000, 0x20090010, + 0x00080800, 0x00080810, 0x20080800, 0x20080810, + 0x00090800, 0x00090810, 0x20090800, 0x20090810, + 0x00080020, 0x00080030, 0x20080020, 0x20080030, + 0x00090020, 0x00090030, 0x20090020, 0x20090030, + 0x00080820, 0x00080830, 0x20080820, 0x20080830, + 0x00090820, 0x00090830, 0x20090820, 0x20090830, + /* for C bits (numbered as per FIPS 46) 7 8 10 11 12 13 */ + 0x00000000, 0x02000000, 0x00002000, 0x02002000, + 0x00200000, 0x02200000, 0x00202000, 0x02202000, + 0x00000004, 0x02000004, 0x00002004, 0x02002004, + 0x00200004, 0x02200004, 0x00202004, 0x02202004, + 0x00000400, 0x02000400, 0x00002400, 0x02002400, + 0x00200400, 0x02200400, 0x00202400, 0x02202400, + 0x00000404, 0x02000404, 0x00002404, 0x02002404, + 0x00200404, 0x02200404, 0x00202404, 0x02202404, + 0x10000000, 0x12000000, 0x10002000, 0x12002000, + 0x10200000, 0x12200000, 0x10202000, 0x12202000, + 0x10000004, 0x12000004, 0x10002004, 0x12002004, + 0x10200004, 0x12200004, 0x10202004, 0x12202004, + 0x10000400, 0x12000400, 0x10002400, 0x12002400, + 0x10200400, 0x12200400, 0x10202400, 0x12202400, + 0x10000404, 0x12000404, 0x10002404, 0x12002404, + 0x10200404, 0x12200404, 0x10202404, 0x12202404, + /* for C bits (numbered as per FIPS 46) 14 15 16 17 19 20 */ + 0x00000000, 0x00000001, 0x00040000, 0x00040001, + 0x01000000, 0x01000001, 0x01040000, 0x01040001, + 0x00000002, 0x00000003, 0x00040002, 0x00040003, + 0x01000002, 0x01000003, 0x01040002, 0x01040003, + 0x00000200, 0x00000201, 0x00040200, 0x00040201, + 0x01000200, 0x01000201, 0x01040200, 0x01040201, + 0x00000202, 0x00000203, 0x00040202, 0x00040203, + 0x01000202, 0x01000203, 0x01040202, 0x01040203, + 0x08000000, 0x08000001, 0x08040000, 0x08040001, + 0x09000000, 0x09000001, 0x09040000, 0x09040001, + 0x08000002, 0x08000003, 0x08040002, 0x08040003, + 0x09000002, 0x09000003, 0x09040002, 0x09040003, + 0x08000200, 0x08000201, 0x08040200, 0x08040201, + 0x09000200, 0x09000201, 0x09040200, 0x09040201, + 0x08000202, 0x08000203, 0x08040202, 0x08040203, + 0x09000202, 0x09000203, 0x09040202, 0x09040203, + /* for C bits (numbered as per FIPS 46) 21 23 24 26 27 28 */ + 0x00000000, 0x00100000, 0x00000100, 0x00100100, + 0x00000008, 0x00100008, 0x00000108, 0x00100108, + 0x00001000, 0x00101000, 0x00001100, 0x00101100, + 0x00001008, 0x00101008, 0x00001108, 0x00101108, + 0x04000000, 0x04100000, 0x04000100, 0x04100100, + 0x04000008, 0x04100008, 0x04000108, 0x04100108, + 0x04001000, 0x04101000, 0x04001100, 0x04101100, + 0x04001008, 0x04101008, 0x04001108, 0x04101108, + 0x00020000, 0x00120000, 0x00020100, 0x00120100, + 0x00020008, 0x00120008, 0x00020108, 0x00120108, + 0x00021000, 0x00121000, 0x00021100, 0x00121100, + 0x00021008, 0x00121008, 0x00021108, 0x00121108, + 0x04020000, 0x04120000, 0x04020100, 0x04120100, + 0x04020008, 0x04120008, 0x04020108, 0x04120108, + 0x04021000, 0x04121000, 0x04021100, 0x04121100, + 0x04021008, 0x04121008, 0x04021108, 0x04121108, + /* for D bits (numbered as per FIPS 46) 1 2 3 4 5 6 */ + 0x00000000, 0x10000000, 0x00010000, 0x10010000, + 0x00000004, 0x10000004, 0x00010004, 0x10010004, + 0x20000000, 0x30000000, 0x20010000, 0x30010000, + 0x20000004, 0x30000004, 0x20010004, 0x30010004, + 0x00100000, 0x10100000, 0x00110000, 0x10110000, + 0x00100004, 0x10100004, 0x00110004, 0x10110004, + 0x20100000, 0x30100000, 0x20110000, 0x30110000, + 0x20100004, 0x30100004, 0x20110004, 0x30110004, + 0x00001000, 0x10001000, 0x00011000, 0x10011000, + 0x00001004, 0x10001004, 0x00011004, 0x10011004, + 0x20001000, 0x30001000, 0x20011000, 0x30011000, + 0x20001004, 0x30001004, 0x20011004, 0x30011004, + 0x00101000, 0x10101000, 0x00111000, 0x10111000, + 0x00101004, 0x10101004, 0x00111004, 0x10111004, + 0x20101000, 0x30101000, 0x20111000, 0x30111000, + 0x20101004, 0x30101004, 0x20111004, 0x30111004, + /* for D bits (numbered as per FIPS 46) 8 9 11 12 13 14 */ + 0x00000000, 0x08000000, 0x00000008, 0x08000008, + 0x00000400, 0x08000400, 0x00000408, 0x08000408, + 0x00020000, 0x08020000, 0x00020008, 0x08020008, + 0x00020400, 0x08020400, 0x00020408, 0x08020408, + 0x00000001, 0x08000001, 0x00000009, 0x08000009, + 0x00000401, 0x08000401, 0x00000409, 0x08000409, + 0x00020001, 0x08020001, 0x00020009, 0x08020009, + 0x00020401, 0x08020401, 0x00020409, 0x08020409, + 0x02000000, 0x0A000000, 0x02000008, 0x0A000008, + 0x02000400, 0x0A000400, 0x02000408, 0x0A000408, + 0x02020000, 0x0A020000, 0x02020008, 0x0A020008, + 0x02020400, 0x0A020400, 0x02020408, 0x0A020408, + 0x02000001, 0x0A000001, 0x02000009, 0x0A000009, + 0x02000401, 0x0A000401, 0x02000409, 0x0A000409, + 0x02020001, 0x0A020001, 0x02020009, 0x0A020009, + 0x02020401, 0x0A020401, 0x02020409, 0x0A020409, + /* for D bits (numbered as per FIPS 46) 16 17 18 19 20 21 */ + 0x00000000, 0x00000100, 0x00080000, 0x00080100, + 0x01000000, 0x01000100, 0x01080000, 0x01080100, + 0x00000010, 0x00000110, 0x00080010, 0x00080110, + 0x01000010, 0x01000110, 0x01080010, 0x01080110, + 0x00200000, 0x00200100, 0x00280000, 0x00280100, + 0x01200000, 0x01200100, 0x01280000, 0x01280100, + 0x00200010, 0x00200110, 0x00280010, 0x00280110, + 0x01200010, 0x01200110, 0x01280010, 0x01280110, + 0x00000200, 0x00000300, 0x00080200, 0x00080300, + 0x01000200, 0x01000300, 0x01080200, 0x01080300, + 0x00000210, 0x00000310, 0x00080210, 0x00080310, + 0x01000210, 0x01000310, 0x01080210, 0x01080310, + 0x00200200, 0x00200300, 0x00280200, 0x00280300, + 0x01200200, 0x01200300, 0x01280200, 0x01280300, + 0x00200210, 0x00200310, 0x00280210, 0x00280310, + 0x01200210, 0x01200310, 0x01280210, 0x01280310, + /* for D bits (numbered as per FIPS 46) 22 23 24 25 27 28 */ + 0x00000000, 0x04000000, 0x00040000, 0x04040000, + 0x00000002, 0x04000002, 0x00040002, 0x04040002, + 0x00002000, 0x04002000, 0x00042000, 0x04042000, + 0x00002002, 0x04002002, 0x00042002, 0x04042002, + 0x00000020, 0x04000020, 0x00040020, 0x04040020, + 0x00000022, 0x04000022, 0x00040022, 0x04040022, + 0x00002020, 0x04002020, 0x00042020, 0x04042020, + 0x00002022, 0x04002022, 0x00042022, 0x04042022, + 0x00000800, 0x04000800, 0x00040800, 0x04040800, + 0x00000802, 0x04000802, 0x00040802, 0x04040802, + 0x00002800, 0x04002800, 0x00042800, 0x04042800, + 0x00002802, 0x04002802, 0x00042802, 0x04042802, + 0x00000820, 0x04000820, 0x00040820, 0x04040820, + 0x00000822, 0x04000822, 0x00040822, 0x04040822, + 0x00002820, 0x04002820, 0x00042820, 0x04042820, + 0x00002822, 0x04002822, 0x00042822, 0x04042822 +}; + +#ifdef VECT_SIZE1 +#define BOX(i,n,S) u32x ((S)[(n)][(i)]) +#endif + +#ifdef VECT_SIZE2 +#define BOX(i,n,S) u32x ((S)[(n)][(i).x], (S)[(n)][(i).y]) +#endif + +__device__ static void _des_crypt_encrypt (u32x iv[2], u32x data[2], u32x Kc[16], u32x Kd[16], u32 s_SPtrans[8][64]) +{ + u32x tt; + + u32x r = data[0]; + u32x l = data[1]; + + IP (r, l, tt); + + r = rotl32 (r, 3u); + l = rotl32 (l, 3u); + + #pragma unroll 16 + for (int i = 0; i < 16; i++) + { + u32x u = Kc[i] ^ r; + u32x t = Kd[i] ^ rotl32 (r, 28u); + + l ^= BOX (((u >> 2) & 0x3f), 0, s_SPtrans) + | BOX (((u >> 10) & 0x3f), 2, s_SPtrans) + | BOX (((u >> 18) & 0x3f), 4, s_SPtrans) + | BOX (((u >> 26) & 0x3f), 6, s_SPtrans) + | BOX (((t >> 2) & 0x3f), 1, s_SPtrans) + | BOX (((t >> 10) & 0x3f), 3, s_SPtrans) + | BOX (((t >> 18) & 0x3f), 5, s_SPtrans) + | BOX (((t >> 26) & 0x3f), 7, s_SPtrans); + + tt = l; + l = r; + r = tt; + } + + l = rotl32 (l, 29u); + r = rotl32 (r, 29u); + + FP (r, l, tt); + + iv[0] = l; + iv[1] = r; +} + +__device__ static void _des_crypt_keysetup (u32x c, u32x d, u32x Kc[16], u32x Kd[16], u32 s_skb[8][64]) +{ + u32x tt; + + PERM_OP (d, c, tt, 4, 0x0f0f0f0f); + HPERM_OP (c, tt, 2, 0xcccc0000); + HPERM_OP (d, tt, 2, 0xcccc0000); + PERM_OP (d, c, tt, 1, 0x55555555); + PERM_OP (c, d, tt, 8, 0x00ff00ff); + PERM_OP (d, c, tt, 1, 0x55555555); + + d = ((d & 0x000000ff) << 16) + | ((d & 0x0000ff00) << 0) + | ((d & 0x00ff0000) >> 16) + | ((c & 0xf0000000) >> 4); + + c = c & 0x0fffffff; + + #pragma unroll 16 + for (u32 i = 0; i < 16; i++) + { + const u32 shifts3s0[16] = { 1, 1, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 1 }; + const u32 shifts3s1[16] = { 27, 27, 26, 26, 26, 26, 26, 26, 27, 26, 26, 26, 26, 26, 26, 27 }; + + c = c >> shifts3s0[i] | c << shifts3s1[i]; + d = d >> shifts3s0[i] | d << shifts3s1[i]; + + c = c & 0x0fffffff; + d = d & 0x0fffffff; + + u32x s = BOX ((( c >> 0) & 0x3f), 0, s_skb) + | BOX ((((c >> 6) & 0x03) + | ((c >> 7) & 0x3c)), 1, s_skb) + | BOX ((((c >> 13) & 0x0f) + | ((c >> 14) & 0x30)), 2, s_skb) + | BOX ((((c >> 20) & 0x01) + | ((c >> 21) & 0x06) + | ((c >> 22) & 0x38)), 3, s_skb); + + u32x t = BOX ((( d >> 0) & 0x3f), 4, s_skb) + | BOX ((((d >> 7) & 0x03) + | ((d >> 8) & 0x3c)), 5, s_skb) + | BOX ((((d >> 15) & 0x3f)), 6, s_skb) + | BOX ((((d >> 21) & 0x0f) + | ((d >> 22) & 0x30)), 7, s_skb); + + #if __CUDA_ARCH__ >= 200 + Kc[i] = __byte_perm (s, t, 0x5410); + Kd[i] = __byte_perm (s, t, 0x7632); + #else + Kc[i] = ((t << 16) | (s & 0x0000ffff)); + Kd[i] = ((s >> 16) | (t & 0xffff0000)); + #endif + + Kc[i] = rotl32 (Kc[i], 2u); + Kd[i] = rotl32 (Kd[i], 2u); + } +} + +__shared__ u32 s_SPtrans[8][64]; + +__shared__ u32 s_skb[8][64]; + +__device__ __constant__ bf_t c_bfs[1024]; + +__device__ static void m03100m (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], const u32 pw_len, const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset) +{ + /** + * modifier + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + const u32 lid = threadIdx.x; + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[7]; + + u32 salt_buf2[4]; + + salt_buf2[0] = 0; + salt_buf2[1] = 0; + salt_buf2[2] = 0; + salt_buf2[3] = 0; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + /** + * loop + */ + + u32x w0l = w0[0]; + + const u32 salt_word_len = (salt_len + pw_len) * 2; + + for (u32 il_pos = 0; il_pos < bfs_cnt; il_pos++) + { + const u32 w0r = c_bfs[il_pos].i; + + w0[0] = w0l | w0r; + + /** + * prepend salt + */ + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + w0_t[0] = w0[0]; + w0_t[1] = w0[1]; + w0_t[2] = w0[2]; + w0_t[3] = w0[3]; + w1_t[0] = w1[0]; + w1_t[1] = w1[1]; + w1_t[2] = w1[2]; + w1_t[3] = w1[3]; + w2_t[0] = w2[0]; + w2_t[1] = w2[1]; + w2_t[2] = w2[2]; + w2_t[3] = w2[3]; + w3_t[0] = w3[0]; + w3_t[1] = w3[1]; + w3_t[2] = w3[2]; + w3_t[3] = w3[3]; + + switch_buffer_by_offset (w0_t, w1_t, w2_t, w3_t, salt_len); + + w0_t[0] |= salt_buf0[0]; + w0_t[1] |= salt_buf0[1]; + w0_t[2] |= salt_buf0[2]; + w0_t[3] |= salt_buf0[3]; + w1_t[0] |= salt_buf1[0]; + w1_t[1] |= salt_buf1[1]; + w1_t[2] |= salt_buf1[2]; + w1_t[3] |= salt_buf1[3]; + w2_t[0] |= salt_buf2[0]; + w2_t[1] |= salt_buf2[1]; + w2_t[2] |= salt_buf2[2]; + w2_t[3] |= salt_buf2[3]; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = 0; + + u32x dst[16]; + + dst[ 0] = w0_t[0]; + dst[ 1] = w0_t[1]; + dst[ 2] = w0_t[2]; + dst[ 3] = w0_t[3]; + dst[ 4] = w1_t[0]; + dst[ 5] = w1_t[1]; + dst[ 6] = w1_t[2]; + dst[ 7] = w1_t[3]; + dst[ 8] = w2_t[0]; + dst[ 9] = w2_t[1]; + dst[10] = w2_t[2]; + dst[11] = w2_t[3]; + dst[12] = w3_t[0]; + dst[13] = w3_t[1]; + dst[14] = w3_t[2]; + dst[15] = w3_t[3]; + + /** + * precompute key1 since key is static: 0x0123456789abcdef + * plus LEFT_ROTATE by 2 + */ + + u32x Kc[16]; + + Kc[ 0] = 0x64649040; + Kc[ 1] = 0x14909858; + Kc[ 2] = 0xc4b44888; + Kc[ 3] = 0x9094e438; + Kc[ 4] = 0xd8a004f0; + Kc[ 5] = 0xa8f02810; + Kc[ 6] = 0xc84048d8; + Kc[ 7] = 0x68d804a8; + Kc[ 8] = 0x0490e40c; + Kc[ 9] = 0xac183024; + Kc[10] = 0x24c07c10; + Kc[11] = 0x8c88c038; + Kc[12] = 0xc048c824; + Kc[13] = 0x4c0470a8; + Kc[14] = 0x584020b4; + Kc[15] = 0x00742c4c; + + u32x Kd[16]; + + Kd[ 0] = 0xa42ce40c; + Kd[ 1] = 0x64689858; + Kd[ 2] = 0x484050b8; + Kd[ 3] = 0xe8184814; + Kd[ 4] = 0x405cc070; + Kd[ 5] = 0xa010784c; + Kd[ 6] = 0x6074a800; + Kd[ 7] = 0x80701c1c; + Kd[ 8] = 0x9cd49430; + Kd[ 9] = 0x4c8ce078; + Kd[10] = 0x5c18c088; + Kd[11] = 0x28a8a4c8; + Kd[12] = 0x3c180838; + Kd[13] = 0xb0b86c20; + Kd[14] = 0xac84a094; + Kd[15] = 0x4ce0c0c4; + + /** + * key1 (generate key) + */ + + u32x iv[2]; + + iv[0] = 0; + iv[1] = 0; + + for (u32 j = 0, k = 0; j < salt_word_len; j += 8, k++) + { + u32x data[2]; + + data[0] = ((dst[k] << 16) & 0xff000000) | ((dst[k] << 8) & 0x0000ff00); + data[1] = ((dst[k] >> 0) & 0xff000000) | ((dst[k] >> 8) & 0x0000ff00); + + data[0] ^= iv[0]; + data[1] ^= iv[1]; + + _des_crypt_encrypt (iv, data, Kc, Kd, s_SPtrans); + } + + /** + * key2 (generate hash) + */ + + _des_crypt_keysetup (iv[0], iv[1], Kc, Kd, s_skb); + + iv[0] = 0; + iv[1] = 0; + + for (u32 j = 0, k = 0; j < salt_word_len; j += 8, k++) + { + u32x data[2]; + + data[0] = ((dst[k] << 16) & 0xff000000) | ((dst[k] << 8) & 0x0000ff00); + data[1] = ((dst[k] >> 0) & 0xff000000) | ((dst[k] >> 8) & 0x0000ff00); + + data[0] ^= iv[0]; + data[1] ^= iv[1]; + + _des_crypt_encrypt (iv, data, Kc, Kd, s_SPtrans); + } + + /** + * cmp + */ + + const u32x r0 = iv[0]; + const u32x r1 = iv[1]; + const u32x r2 = 0; + const u32x r3 = 0; + + #include VECT_COMPARE_M + } +} + +__device__ static void m03100s (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], const u32 pw_len, const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset) +{ + /** + * modifier + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + const u32 lid = threadIdx.x; + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[7]; + + u32 salt_buf2[4]; + + salt_buf2[0] = 0; + salt_buf2[1] = 0; + salt_buf2[2] = 0; + salt_buf2[3] = 0; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * loop + */ + + u32x w0l = w0[0]; + + const u32 salt_word_len = (salt_len + pw_len) * 2; + + for (u32 il_pos = 0; il_pos < bfs_cnt; il_pos++) + { + const u32 w0r = c_bfs[il_pos].i; + + w0[0] = w0l | w0r; + + /** + * prepend salt + */ + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + w0_t[0] = w0[0]; + w0_t[1] = w0[1]; + w0_t[2] = w0[2]; + w0_t[3] = w0[3]; + w1_t[0] = w1[0]; + w1_t[1] = w1[1]; + w1_t[2] = w1[2]; + w1_t[3] = w1[3]; + w2_t[0] = w2[0]; + w2_t[1] = w2[1]; + w2_t[2] = w2[2]; + w2_t[3] = w2[3]; + w3_t[0] = w3[0]; + w3_t[1] = w3[1]; + w3_t[2] = w3[2]; + w3_t[3] = w3[3]; + + switch_buffer_by_offset (w0_t, w1_t, w2_t, w3_t, salt_len); + + w0_t[0] |= salt_buf0[0]; + w0_t[1] |= salt_buf0[1]; + w0_t[2] |= salt_buf0[2]; + w0_t[3] |= salt_buf0[3]; + w1_t[0] |= salt_buf1[0]; + w1_t[1] |= salt_buf1[1]; + w1_t[2] |= salt_buf1[2]; + w1_t[3] |= salt_buf1[3]; + w2_t[0] |= salt_buf2[0]; + w2_t[1] |= salt_buf2[1]; + w2_t[2] |= salt_buf2[2]; + w2_t[3] |= salt_buf2[3]; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = 0; + + u32x dst[16]; + + dst[ 0] = w0_t[0]; + dst[ 1] = w0_t[1]; + dst[ 2] = w0_t[2]; + dst[ 3] = w0_t[3]; + dst[ 4] = w1_t[0]; + dst[ 5] = w1_t[1]; + dst[ 6] = w1_t[2]; + dst[ 7] = w1_t[3]; + dst[ 8] = w2_t[0]; + dst[ 9] = w2_t[1]; + dst[10] = w2_t[2]; + dst[11] = w2_t[3]; + dst[12] = w3_t[0]; + dst[13] = w3_t[1]; + dst[14] = w3_t[2]; + dst[15] = w3_t[3]; + + /** + * precompute key1 since key is static: 0x0123456789abcdef + * plus LEFT_ROTATE by 2 + */ + + u32x Kc[16]; + + Kc[ 0] = 0x64649040; + Kc[ 1] = 0x14909858; + Kc[ 2] = 0xc4b44888; + Kc[ 3] = 0x9094e438; + Kc[ 4] = 0xd8a004f0; + Kc[ 5] = 0xa8f02810; + Kc[ 6] = 0xc84048d8; + Kc[ 7] = 0x68d804a8; + Kc[ 8] = 0x0490e40c; + Kc[ 9] = 0xac183024; + Kc[10] = 0x24c07c10; + Kc[11] = 0x8c88c038; + Kc[12] = 0xc048c824; + Kc[13] = 0x4c0470a8; + Kc[14] = 0x584020b4; + Kc[15] = 0x00742c4c; + + u32x Kd[16]; + + Kd[ 0] = 0xa42ce40c; + Kd[ 1] = 0x64689858; + Kd[ 2] = 0x484050b8; + Kd[ 3] = 0xe8184814; + Kd[ 4] = 0x405cc070; + Kd[ 5] = 0xa010784c; + Kd[ 6] = 0x6074a800; + Kd[ 7] = 0x80701c1c; + Kd[ 8] = 0x9cd49430; + Kd[ 9] = 0x4c8ce078; + Kd[10] = 0x5c18c088; + Kd[11] = 0x28a8a4c8; + Kd[12] = 0x3c180838; + Kd[13] = 0xb0b86c20; + Kd[14] = 0xac84a094; + Kd[15] = 0x4ce0c0c4; + + /** + * key1 (generate key) + */ + + u32x iv[2]; + + iv[0] = 0; + iv[1] = 0; + + for (u32 j = 0, k = 0; j < salt_word_len; j += 8, k++) + { + u32x data[2]; + + data[0] = ((dst[k] << 16) & 0xff000000) | ((dst[k] << 8) & 0x0000ff00); + data[1] = ((dst[k] >> 0) & 0xff000000) | ((dst[k] >> 8) & 0x0000ff00); + + data[0] ^= iv[0]; + data[1] ^= iv[1]; + + _des_crypt_encrypt (iv, data, Kc, Kd, s_SPtrans); + } + + /** + * key2 (generate hash) + */ + + _des_crypt_keysetup (iv[0], iv[1], Kc, Kd, s_skb); + + iv[0] = 0; + iv[1] = 0; + + for (u32 j = 0, k = 0; j < salt_word_len; j += 8, k++) + { + u32x data[2]; + + data[0] = ((dst[k] << 16) & 0xff000000) | ((dst[k] << 8) & 0x0000ff00); + data[1] = ((dst[k] >> 0) & 0xff000000) | ((dst[k] >> 8) & 0x0000ff00); + + data[0] ^= iv[0]; + data[1] ^= iv[1]; + + _des_crypt_encrypt (iv, data, Kc, Kd, s_SPtrans); + } + + /** + * cmp + */ + + const u32x r0 = iv[0]; + const u32x r1 = iv[1]; + const u32x r2 = 0; + const u32x r3 = 0; + + #include VECT_COMPARE_S + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m03100_m04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + const u32 lid = threadIdx.x; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * sbox, kbox + */ + + if (lid < 64) + { + s_SPtrans[0][lid] = c_SPtrans[0][lid]; + s_SPtrans[1][lid] = c_SPtrans[1][lid]; + s_SPtrans[2][lid] = c_SPtrans[2][lid]; + s_SPtrans[3][lid] = c_SPtrans[3][lid]; + s_SPtrans[4][lid] = c_SPtrans[4][lid]; + s_SPtrans[5][lid] = c_SPtrans[5][lid]; + s_SPtrans[6][lid] = c_SPtrans[6][lid]; + s_SPtrans[7][lid] = c_SPtrans[7][lid]; + + s_skb[0][lid] = c_skb[0][lid]; + s_skb[1][lid] = c_skb[1][lid]; + s_skb[2][lid] = c_skb[2][lid]; + s_skb[3][lid] = c_skb[3][lid]; + s_skb[4][lid] = c_skb[4][lid]; + s_skb[5][lid] = c_skb[5][lid]; + s_skb[6][lid] = c_skb[6][lid]; + s_skb[7][lid] = c_skb[7][lid]; + } + + __syncthreads (); + + if (gid >= gid_max) return; + + /** + * main + */ + + m03100m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m03100_m08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + const u32 lid = threadIdx.x; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * sbox, kbox + */ + + if (lid < 64) + { + s_SPtrans[0][lid] = c_SPtrans[0][lid]; + s_SPtrans[1][lid] = c_SPtrans[1][lid]; + s_SPtrans[2][lid] = c_SPtrans[2][lid]; + s_SPtrans[3][lid] = c_SPtrans[3][lid]; + s_SPtrans[4][lid] = c_SPtrans[4][lid]; + s_SPtrans[5][lid] = c_SPtrans[5][lid]; + s_SPtrans[6][lid] = c_SPtrans[6][lid]; + s_SPtrans[7][lid] = c_SPtrans[7][lid]; + + s_skb[0][lid] = c_skb[0][lid]; + s_skb[1][lid] = c_skb[1][lid]; + s_skb[2][lid] = c_skb[2][lid]; + s_skb[3][lid] = c_skb[3][lid]; + s_skb[4][lid] = c_skb[4][lid]; + s_skb[5][lid] = c_skb[5][lid]; + s_skb[6][lid] = c_skb[6][lid]; + s_skb[7][lid] = c_skb[7][lid]; + } + + __syncthreads (); + + if (gid >= gid_max) return; + + /** + * main + */ + + m03100m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m03100_m16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + const u32 lid = threadIdx.x; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = pws[gid].i[ 8]; + w2[1] = pws[gid].i[ 9]; + w2[2] = pws[gid].i[10]; + w2[3] = pws[gid].i[11]; + + u32x w3[4]; + + w3[0] = pws[gid].i[12]; + w3[1] = pws[gid].i[13]; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * sbox, kbox + */ + + if (lid < 64) + { + s_SPtrans[0][lid] = c_SPtrans[0][lid]; + s_SPtrans[1][lid] = c_SPtrans[1][lid]; + s_SPtrans[2][lid] = c_SPtrans[2][lid]; + s_SPtrans[3][lid] = c_SPtrans[3][lid]; + s_SPtrans[4][lid] = c_SPtrans[4][lid]; + s_SPtrans[5][lid] = c_SPtrans[5][lid]; + s_SPtrans[6][lid] = c_SPtrans[6][lid]; + s_SPtrans[7][lid] = c_SPtrans[7][lid]; + + s_skb[0][lid] = c_skb[0][lid]; + s_skb[1][lid] = c_skb[1][lid]; + s_skb[2][lid] = c_skb[2][lid]; + s_skb[3][lid] = c_skb[3][lid]; + s_skb[4][lid] = c_skb[4][lid]; + s_skb[5][lid] = c_skb[5][lid]; + s_skb[6][lid] = c_skb[6][lid]; + s_skb[7][lid] = c_skb[7][lid]; + } + + __syncthreads (); + + if (gid >= gid_max) return; + + /** + * main + */ + + m03100m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m03100_s04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + const u32 lid = threadIdx.x; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * sbox, kbox + */ + + if (lid < 64) + { + s_SPtrans[0][lid] = c_SPtrans[0][lid]; + s_SPtrans[1][lid] = c_SPtrans[1][lid]; + s_SPtrans[2][lid] = c_SPtrans[2][lid]; + s_SPtrans[3][lid] = c_SPtrans[3][lid]; + s_SPtrans[4][lid] = c_SPtrans[4][lid]; + s_SPtrans[5][lid] = c_SPtrans[5][lid]; + s_SPtrans[6][lid] = c_SPtrans[6][lid]; + s_SPtrans[7][lid] = c_SPtrans[7][lid]; + + s_skb[0][lid] = c_skb[0][lid]; + s_skb[1][lid] = c_skb[1][lid]; + s_skb[2][lid] = c_skb[2][lid]; + s_skb[3][lid] = c_skb[3][lid]; + s_skb[4][lid] = c_skb[4][lid]; + s_skb[5][lid] = c_skb[5][lid]; + s_skb[6][lid] = c_skb[6][lid]; + s_skb[7][lid] = c_skb[7][lid]; + } + + __syncthreads (); + + if (gid >= gid_max) return; + + /** + * main + */ + + m03100s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m03100_s08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + const u32 lid = threadIdx.x; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * sbox, kbox + */ + + if (lid < 64) + { + s_SPtrans[0][lid] = c_SPtrans[0][lid]; + s_SPtrans[1][lid] = c_SPtrans[1][lid]; + s_SPtrans[2][lid] = c_SPtrans[2][lid]; + s_SPtrans[3][lid] = c_SPtrans[3][lid]; + s_SPtrans[4][lid] = c_SPtrans[4][lid]; + s_SPtrans[5][lid] = c_SPtrans[5][lid]; + s_SPtrans[6][lid] = c_SPtrans[6][lid]; + s_SPtrans[7][lid] = c_SPtrans[7][lid]; + + s_skb[0][lid] = c_skb[0][lid]; + s_skb[1][lid] = c_skb[1][lid]; + s_skb[2][lid] = c_skb[2][lid]; + s_skb[3][lid] = c_skb[3][lid]; + s_skb[4][lid] = c_skb[4][lid]; + s_skb[5][lid] = c_skb[5][lid]; + s_skb[6][lid] = c_skb[6][lid]; + s_skb[7][lid] = c_skb[7][lid]; + } + + __syncthreads (); + + if (gid >= gid_max) return; + + /** + * main + */ + + m03100s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m03100_s16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + const u32 lid = threadIdx.x; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = pws[gid].i[ 8]; + w2[1] = pws[gid].i[ 9]; + w2[2] = pws[gid].i[10]; + w2[3] = pws[gid].i[11]; + + u32x w3[4]; + + w3[0] = pws[gid].i[12]; + w3[1] = pws[gid].i[13]; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * sbox, kbox + */ + + if (lid < 64) + { + s_SPtrans[0][lid] = c_SPtrans[0][lid]; + s_SPtrans[1][lid] = c_SPtrans[1][lid]; + s_SPtrans[2][lid] = c_SPtrans[2][lid]; + s_SPtrans[3][lid] = c_SPtrans[3][lid]; + s_SPtrans[4][lid] = c_SPtrans[4][lid]; + s_SPtrans[5][lid] = c_SPtrans[5][lid]; + s_SPtrans[6][lid] = c_SPtrans[6][lid]; + s_SPtrans[7][lid] = c_SPtrans[7][lid]; + + s_skb[0][lid] = c_skb[0][lid]; + s_skb[1][lid] = c_skb[1][lid]; + s_skb[2][lid] = c_skb[2][lid]; + s_skb[3][lid] = c_skb[3][lid]; + s_skb[4][lid] = c_skb[4][lid]; + s_skb[5][lid] = c_skb[5][lid]; + s_skb[6][lid] = c_skb[6][lid]; + s_skb[7][lid] = c_skb[7][lid]; + } + + __syncthreads (); + + if (gid >= gid_max) return; + + /** + * main + */ + + m03100s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} diff --git a/nv/m03200.cu b/nv/m03200.cu new file mode 100644 index 0000000000..3a4e02d01b --- /dev/null +++ b/nv/m03200.cu @@ -0,0 +1,895 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _BCRYPT_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW2 +#define VECT_SIZE1 +#endif + +#define DGST_R0 0 +#define DGST_R1 1 +#define DGST_R2 2 +#define DGST_R3 3 + +#include "include/kernel_functions.c" +#include "types_nv.c" +#include "common_nv.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +// http://www.schneier.com/code/constants.txt + +__device__ __constant__ u32 c_sbox0[256] = +{ + 0xd1310ba6, 0x98dfb5ac, 0x2ffd72db, 0xd01adfb7, + 0xb8e1afed, 0x6a267e96, 0xba7c9045, 0xf12c7f99, + 0x24a19947, 0xb3916cf7, 0x0801f2e2, 0x858efc16, + 0x636920d8, 0x71574e69, 0xa458fea3, 0xf4933d7e, + 0x0d95748f, 0x728eb658, 0x718bcd58, 0x82154aee, + 0x7b54a41d, 0xc25a59b5, 0x9c30d539, 0x2af26013, + 0xc5d1b023, 0x286085f0, 0xca417918, 0xb8db38ef, + 0x8e79dcb0, 0x603a180e, 0x6c9e0e8b, 0xb01e8a3e, + 0xd71577c1, 0xbd314b27, 0x78af2fda, 0x55605c60, + 0xe65525f3, 0xaa55ab94, 0x57489862, 0x63e81440, + 0x55ca396a, 0x2aab10b6, 0xb4cc5c34, 0x1141e8ce, + 0xa15486af, 0x7c72e993, 0xb3ee1411, 0x636fbc2a, + 0x2ba9c55d, 0x741831f6, 0xce5c3e16, 0x9b87931e, + 0xafd6ba33, 0x6c24cf5c, 0x7a325381, 0x28958677, + 0x3b8f4898, 0x6b4bb9af, 0xc4bfe81b, 0x66282193, + 0x61d809cc, 0xfb21a991, 0x487cac60, 0x5dec8032, + 0xef845d5d, 0xe98575b1, 0xdc262302, 0xeb651b88, + 0x23893e81, 0xd396acc5, 0x0f6d6ff3, 0x83f44239, + 0x2e0b4482, 0xa4842004, 0x69c8f04a, 0x9e1f9b5e, + 0x21c66842, 0xf6e96c9a, 0x670c9c61, 0xabd388f0, + 0x6a51a0d2, 0xd8542f68, 0x960fa728, 0xab5133a3, + 0x6eef0b6c, 0x137a3be4, 0xba3bf050, 0x7efb2a98, + 0xa1f1651d, 0x39af0176, 0x66ca593e, 0x82430e88, + 0x8cee8619, 0x456f9fb4, 0x7d84a5c3, 0x3b8b5ebe, + 0xe06f75d8, 0x85c12073, 0x401a449f, 0x56c16aa6, + 0x4ed3aa62, 0x363f7706, 0x1bfedf72, 0x429b023d, + 0x37d0d724, 0xd00a1248, 0xdb0fead3, 0x49f1c09b, + 0x075372c9, 0x80991b7b, 0x25d479d8, 0xf6e8def7, + 0xe3fe501a, 0xb6794c3b, 0x976ce0bd, 0x04c006ba, + 0xc1a94fb6, 0x409f60c4, 0x5e5c9ec2, 0x196a2463, + 0x68fb6faf, 0x3e6c53b5, 0x1339b2eb, 0x3b52ec6f, + 0x6dfc511f, 0x9b30952c, 0xcc814544, 0xaf5ebd09, + 0xbee3d004, 0xde334afd, 0x660f2807, 0x192e4bb3, + 0xc0cba857, 0x45c8740f, 0xd20b5f39, 0xb9d3fbdb, + 0x5579c0bd, 0x1a60320a, 0xd6a100c6, 0x402c7279, + 0x679f25fe, 0xfb1fa3cc, 0x8ea5e9f8, 0xdb3222f8, + 0x3c7516df, 0xfd616b15, 0x2f501ec8, 0xad0552ab, + 0x323db5fa, 0xfd238760, 0x53317b48, 0x3e00df82, + 0x9e5c57bb, 0xca6f8ca0, 0x1a87562e, 0xdf1769db, + 0xd542a8f6, 0x287effc3, 0xac6732c6, 0x8c4f5573, + 0x695b27b0, 0xbbca58c8, 0xe1ffa35d, 0xb8f011a0, + 0x10fa3d98, 0xfd2183b8, 0x4afcb56c, 0x2dd1d35b, + 0x9a53e479, 0xb6f84565, 0xd28e49bc, 0x4bfb9790, + 0xe1ddf2da, 0xa4cb7e33, 0x62fb1341, 0xcee4c6e8, + 0xef20cada, 0x36774c01, 0xd07e9efe, 0x2bf11fb4, + 0x95dbda4d, 0xae909198, 0xeaad8e71, 0x6b93d5a0, + 0xd08ed1d0, 0xafc725e0, 0x8e3c5b2f, 0x8e7594b7, + 0x8ff6e2fb, 0xf2122b64, 0x8888b812, 0x900df01c, + 0x4fad5ea0, 0x688fc31c, 0xd1cff191, 0xb3a8c1ad, + 0x2f2f2218, 0xbe0e1777, 0xea752dfe, 0x8b021fa1, + 0xe5a0cc0f, 0xb56f74e8, 0x18acf3d6, 0xce89e299, + 0xb4a84fe0, 0xfd13e0b7, 0x7cc43b81, 0xd2ada8d9, + 0x165fa266, 0x80957705, 0x93cc7314, 0x211a1477, + 0xe6ad2065, 0x77b5fa86, 0xc75442f5, 0xfb9d35cf, + 0xebcdaf0c, 0x7b3e89a0, 0xd6411bd3, 0xae1e7e49, + 0x00250e2d, 0x2071b35e, 0x226800bb, 0x57b8e0af, + 0x2464369b, 0xf009b91e, 0x5563911d, 0x59dfa6aa, + 0x78c14389, 0xd95a537f, 0x207d5ba2, 0x02e5b9c5, + 0x83260376, 0x6295cfa9, 0x11c81968, 0x4e734a41, + 0xb3472dca, 0x7b14a94a, 0x1b510052, 0x9a532915, + 0xd60f573f, 0xbc9bc6e4, 0x2b60a476, 0x81e67400, + 0x08ba6fb5, 0x571be91f, 0xf296ec6b, 0x2a0dd915, + 0xb6636521, 0xe7b9f9b6, 0xff34052e, 0xc5855664, + 0x53b02d5d, 0xa99f8fa1, 0x08ba4799, 0x6e85076a +}; + +__device__ __constant__ u32 c_sbox1[256] = +{ + 0x4b7a70e9, 0xb5b32944, 0xdb75092e, 0xc4192623, + 0xad6ea6b0, 0x49a7df7d, 0x9cee60b8, 0x8fedb266, + 0xecaa8c71, 0x699a17ff, 0x5664526c, 0xc2b19ee1, + 0x193602a5, 0x75094c29, 0xa0591340, 0xe4183a3e, + 0x3f54989a, 0x5b429d65, 0x6b8fe4d6, 0x99f73fd6, + 0xa1d29c07, 0xefe830f5, 0x4d2d38e6, 0xf0255dc1, + 0x4cdd2086, 0x8470eb26, 0x6382e9c6, 0x021ecc5e, + 0x09686b3f, 0x3ebaefc9, 0x3c971814, 0x6b6a70a1, + 0x687f3584, 0x52a0e286, 0xb79c5305, 0xaa500737, + 0x3e07841c, 0x7fdeae5c, 0x8e7d44ec, 0x5716f2b8, + 0xb03ada37, 0xf0500c0d, 0xf01c1f04, 0x0200b3ff, + 0xae0cf51a, 0x3cb574b2, 0x25837a58, 0xdc0921bd, + 0xd19113f9, 0x7ca92ff6, 0x94324773, 0x22f54701, + 0x3ae5e581, 0x37c2dadc, 0xc8b57634, 0x9af3dda7, + 0xa9446146, 0x0fd0030e, 0xecc8c73e, 0xa4751e41, + 0xe238cd99, 0x3bea0e2f, 0x3280bba1, 0x183eb331, + 0x4e548b38, 0x4f6db908, 0x6f420d03, 0xf60a04bf, + 0x2cb81290, 0x24977c79, 0x5679b072, 0xbcaf89af, + 0xde9a771f, 0xd9930810, 0xb38bae12, 0xdccf3f2e, + 0x5512721f, 0x2e6b7124, 0x501adde6, 0x9f84cd87, + 0x7a584718, 0x7408da17, 0xbc9f9abc, 0xe94b7d8c, + 0xec7aec3a, 0xdb851dfa, 0x63094366, 0xc464c3d2, + 0xef1c1847, 0x3215d908, 0xdd433b37, 0x24c2ba16, + 0x12a14d43, 0x2a65c451, 0x50940002, 0x133ae4dd, + 0x71dff89e, 0x10314e55, 0x81ac77d6, 0x5f11199b, + 0x043556f1, 0xd7a3c76b, 0x3c11183b, 0x5924a509, + 0xf28fe6ed, 0x97f1fbfa, 0x9ebabf2c, 0x1e153c6e, + 0x86e34570, 0xeae96fb1, 0x860e5e0a, 0x5a3e2ab3, + 0x771fe71c, 0x4e3d06fa, 0x2965dcb9, 0x99e71d0f, + 0x803e89d6, 0x5266c825, 0x2e4cc978, 0x9c10b36a, + 0xc6150eba, 0x94e2ea78, 0xa5fc3c53, 0x1e0a2df4, + 0xf2f74ea7, 0x361d2b3d, 0x1939260f, 0x19c27960, + 0x5223a708, 0xf71312b6, 0xebadfe6e, 0xeac31f66, + 0xe3bc4595, 0xa67bc883, 0xb17f37d1, 0x018cff28, + 0xc332ddef, 0xbe6c5aa5, 0x65582185, 0x68ab9802, + 0xeecea50f, 0xdb2f953b, 0x2aef7dad, 0x5b6e2f84, + 0x1521b628, 0x29076170, 0xecdd4775, 0x619f1510, + 0x13cca830, 0xeb61bd96, 0x0334fe1e, 0xaa0363cf, + 0xb5735c90, 0x4c70a239, 0xd59e9e0b, 0xcbaade14, + 0xeecc86bc, 0x60622ca7, 0x9cab5cab, 0xb2f3846e, + 0x648b1eaf, 0x19bdf0ca, 0xa02369b9, 0x655abb50, + 0x40685a32, 0x3c2ab4b3, 0x319ee9d5, 0xc021b8f7, + 0x9b540b19, 0x875fa099, 0x95f7997e, 0x623d7da8, + 0xf837889a, 0x97e32d77, 0x11ed935f, 0x16681281, + 0x0e358829, 0xc7e61fd6, 0x96dedfa1, 0x7858ba99, + 0x57f584a5, 0x1b227263, 0x9b83c3ff, 0x1ac24696, + 0xcdb30aeb, 0x532e3054, 0x8fd948e4, 0x6dbc3128, + 0x58ebf2ef, 0x34c6ffea, 0xfe28ed61, 0xee7c3c73, + 0x5d4a14d9, 0xe864b7e3, 0x42105d14, 0x203e13e0, + 0x45eee2b6, 0xa3aaabea, 0xdb6c4f15, 0xfacb4fd0, + 0xc742f442, 0xef6abbb5, 0x654f3b1d, 0x41cd2105, + 0xd81e799e, 0x86854dc7, 0xe44b476a, 0x3d816250, + 0xcf62a1f2, 0x5b8d2646, 0xfc8883a0, 0xc1c7b6a3, + 0x7f1524c3, 0x69cb7492, 0x47848a0b, 0x5692b285, + 0x095bbf00, 0xad19489d, 0x1462b174, 0x23820e00, + 0x58428d2a, 0x0c55f5ea, 0x1dadf43e, 0x233f7061, + 0x3372f092, 0x8d937e41, 0xd65fecf1, 0x6c223bdb, + 0x7cde3759, 0xcbee7460, 0x4085f2a7, 0xce77326e, + 0xa6078084, 0x19f8509e, 0xe8efd855, 0x61d99735, + 0xa969a7aa, 0xc50c06c2, 0x5a04abfc, 0x800bcadc, + 0x9e447a2e, 0xc3453484, 0xfdd56705, 0x0e1e9ec9, + 0xdb73dbd3, 0x105588cd, 0x675fda79, 0xe3674340, + 0xc5c43465, 0x713e38d8, 0x3d28f89e, 0xf16dff20, + 0x153e21e7, 0x8fb03d4a, 0xe6e39f2b, 0xdb83adf7 +}; + +__device__ __constant__ u32 c_sbox2[256] = +{ + 0xe93d5a68, 0x948140f7, 0xf64c261c, 0x94692934, + 0x411520f7, 0x7602d4f7, 0xbcf46b2e, 0xd4a20068, + 0xd4082471, 0x3320f46a, 0x43b7d4b7, 0x500061af, + 0x1e39f62e, 0x97244546, 0x14214f74, 0xbf8b8840, + 0x4d95fc1d, 0x96b591af, 0x70f4ddd3, 0x66a02f45, + 0xbfbc09ec, 0x03bd9785, 0x7fac6dd0, 0x31cb8504, + 0x96eb27b3, 0x55fd3941, 0xda2547e6, 0xabca0a9a, + 0x28507825, 0x530429f4, 0x0a2c86da, 0xe9b66dfb, + 0x68dc1462, 0xd7486900, 0x680ec0a4, 0x27a18dee, + 0x4f3ffea2, 0xe887ad8c, 0xb58ce006, 0x7af4d6b6, + 0xaace1e7c, 0xd3375fec, 0xce78a399, 0x406b2a42, + 0x20fe9e35, 0xd9f385b9, 0xee39d7ab, 0x3b124e8b, + 0x1dc9faf7, 0x4b6d1856, 0x26a36631, 0xeae397b2, + 0x3a6efa74, 0xdd5b4332, 0x6841e7f7, 0xca7820fb, + 0xfb0af54e, 0xd8feb397, 0x454056ac, 0xba489527, + 0x55533a3a, 0x20838d87, 0xfe6ba9b7, 0xd096954b, + 0x55a867bc, 0xa1159a58, 0xcca92963, 0x99e1db33, + 0xa62a4a56, 0x3f3125f9, 0x5ef47e1c, 0x9029317c, + 0xfdf8e802, 0x04272f70, 0x80bb155c, 0x05282ce3, + 0x95c11548, 0xe4c66d22, 0x48c1133f, 0xc70f86dc, + 0x07f9c9ee, 0x41041f0f, 0x404779a4, 0x5d886e17, + 0x325f51eb, 0xd59bc0d1, 0xf2bcc18f, 0x41113564, + 0x257b7834, 0x602a9c60, 0xdff8e8a3, 0x1f636c1b, + 0x0e12b4c2, 0x02e1329e, 0xaf664fd1, 0xcad18115, + 0x6b2395e0, 0x333e92e1, 0x3b240b62, 0xeebeb922, + 0x85b2a20e, 0xe6ba0d99, 0xde720c8c, 0x2da2f728, + 0xd0127845, 0x95b794fd, 0x647d0862, 0xe7ccf5f0, + 0x5449a36f, 0x877d48fa, 0xc39dfd27, 0xf33e8d1e, + 0x0a476341, 0x992eff74, 0x3a6f6eab, 0xf4f8fd37, + 0xa812dc60, 0xa1ebddf8, 0x991be14c, 0xdb6e6b0d, + 0xc67b5510, 0x6d672c37, 0x2765d43b, 0xdcd0e804, + 0xf1290dc7, 0xcc00ffa3, 0xb5390f92, 0x690fed0b, + 0x667b9ffb, 0xcedb7d9c, 0xa091cf0b, 0xd9155ea3, + 0xbb132f88, 0x515bad24, 0x7b9479bf, 0x763bd6eb, + 0x37392eb3, 0xcc115979, 0x8026e297, 0xf42e312d, + 0x6842ada7, 0xc66a2b3b, 0x12754ccc, 0x782ef11c, + 0x6a124237, 0xb79251e7, 0x06a1bbe6, 0x4bfb6350, + 0x1a6b1018, 0x11caedfa, 0x3d25bdd8, 0xe2e1c3c9, + 0x44421659, 0x0a121386, 0xd90cec6e, 0xd5abea2a, + 0x64af674e, 0xda86a85f, 0xbebfe988, 0x64e4c3fe, + 0x9dbc8057, 0xf0f7c086, 0x60787bf8, 0x6003604d, + 0xd1fd8346, 0xf6381fb0, 0x7745ae04, 0xd736fccc, + 0x83426b33, 0xf01eab71, 0xb0804187, 0x3c005e5f, + 0x77a057be, 0xbde8ae24, 0x55464299, 0xbf582e61, + 0x4e58f48f, 0xf2ddfda2, 0xf474ef38, 0x8789bdc2, + 0x5366f9c3, 0xc8b38e74, 0xb475f255, 0x46fcd9b9, + 0x7aeb2661, 0x8b1ddf84, 0x846a0e79, 0x915f95e2, + 0x466e598e, 0x20b45770, 0x8cd55591, 0xc902de4c, + 0xb90bace1, 0xbb8205d0, 0x11a86248, 0x7574a99e, + 0xb77f19b6, 0xe0a9dc09, 0x662d09a1, 0xc4324633, + 0xe85a1f02, 0x09f0be8c, 0x4a99a025, 0x1d6efe10, + 0x1ab93d1d, 0x0ba5a4df, 0xa186f20f, 0x2868f169, + 0xdcb7da83, 0x573906fe, 0xa1e2ce9b, 0x4fcd7f52, + 0x50115e01, 0xa70683fa, 0xa002b5c4, 0x0de6d027, + 0x9af88c27, 0x773f8641, 0xc3604c06, 0x61a806b5, + 0xf0177a28, 0xc0f586e0, 0x006058aa, 0x30dc7d62, + 0x11e69ed7, 0x2338ea63, 0x53c2dd94, 0xc2c21634, + 0xbbcbee56, 0x90bcb6de, 0xebfc7da1, 0xce591d76, + 0x6f05e409, 0x4b7c0188, 0x39720a3d, 0x7c927c24, + 0x86e3725f, 0x724d9db9, 0x1ac15bb4, 0xd39eb8fc, + 0xed545578, 0x08fca5b5, 0xd83d7cd3, 0x4dad0fc4, + 0x1e50ef5e, 0xb161e6f8, 0xa28514d9, 0x6c51133c, + 0x6fd5c7e7, 0x56e14ec4, 0x362abfce, 0xddc6c837, + 0xd79a3234, 0x92638212, 0x670efa8e, 0x406000e0 +}; + +__device__ __constant__ u32 c_sbox3[256] = +{ + 0x3a39ce37, 0xd3faf5cf, 0xabc27737, 0x5ac52d1b, + 0x5cb0679e, 0x4fa33742, 0xd3822740, 0x99bc9bbe, + 0xd5118e9d, 0xbf0f7315, 0xd62d1c7e, 0xc700c47b, + 0xb78c1b6b, 0x21a19045, 0xb26eb1be, 0x6a366eb4, + 0x5748ab2f, 0xbc946e79, 0xc6a376d2, 0x6549c2c8, + 0x530ff8ee, 0x468dde7d, 0xd5730a1d, 0x4cd04dc6, + 0x2939bbdb, 0xa9ba4650, 0xac9526e8, 0xbe5ee304, + 0xa1fad5f0, 0x6a2d519a, 0x63ef8ce2, 0x9a86ee22, + 0xc089c2b8, 0x43242ef6, 0xa51e03aa, 0x9cf2d0a4, + 0x83c061ba, 0x9be96a4d, 0x8fe51550, 0xba645bd6, + 0x2826a2f9, 0xa73a3ae1, 0x4ba99586, 0xef5562e9, + 0xc72fefd3, 0xf752f7da, 0x3f046f69, 0x77fa0a59, + 0x80e4a915, 0x87b08601, 0x9b09e6ad, 0x3b3ee593, + 0xe990fd5a, 0x9e34d797, 0x2cf0b7d9, 0x022b8b51, + 0x96d5ac3a, 0x017da67d, 0xd1cf3ed6, 0x7c7d2d28, + 0x1f9f25cf, 0xadf2b89b, 0x5ad6b472, 0x5a88f54c, + 0xe029ac71, 0xe019a5e6, 0x47b0acfd, 0xed93fa9b, + 0xe8d3c48d, 0x283b57cc, 0xf8d56629, 0x79132e28, + 0x785f0191, 0xed756055, 0xf7960e44, 0xe3d35e8c, + 0x15056dd4, 0x88f46dba, 0x03a16125, 0x0564f0bd, + 0xc3eb9e15, 0x3c9057a2, 0x97271aec, 0xa93a072a, + 0x1b3f6d9b, 0x1e6321f5, 0xf59c66fb, 0x26dcf319, + 0x7533d928, 0xb155fdf5, 0x03563482, 0x8aba3cbb, + 0x28517711, 0xc20ad9f8, 0xabcc5167, 0xccad925f, + 0x4de81751, 0x3830dc8e, 0x379d5862, 0x9320f991, + 0xea7a90c2, 0xfb3e7bce, 0x5121ce64, 0x774fbe32, + 0xa8b6e37e, 0xc3293d46, 0x48de5369, 0x6413e680, + 0xa2ae0810, 0xdd6db224, 0x69852dfd, 0x09072166, + 0xb39a460a, 0x6445c0dd, 0x586cdecf, 0x1c20c8ae, + 0x5bbef7dd, 0x1b588d40, 0xccd2017f, 0x6bb4e3bb, + 0xdda26a7e, 0x3a59ff45, 0x3e350a44, 0xbcb4cdd5, + 0x72eacea8, 0xfa6484bb, 0x8d6612ae, 0xbf3c6f47, + 0xd29be463, 0x542f5d9e, 0xaec2771b, 0xf64e6370, + 0x740e0d8d, 0xe75b1357, 0xf8721671, 0xaf537d5d, + 0x4040cb08, 0x4eb4e2cc, 0x34d2466a, 0x0115af84, + 0xe1b00428, 0x95983a1d, 0x06b89fb4, 0xce6ea048, + 0x6f3f3b82, 0x3520ab82, 0x011a1d4b, 0x277227f8, + 0x611560b1, 0xe7933fdc, 0xbb3a792b, 0x344525bd, + 0xa08839e1, 0x51ce794b, 0x2f32c9b7, 0xa01fbac9, + 0xe01cc87e, 0xbcc7d1f6, 0xcf0111c3, 0xa1e8aac7, + 0x1a908749, 0xd44fbd9a, 0xd0dadecb, 0xd50ada38, + 0x0339c32a, 0xc6913667, 0x8df9317c, 0xe0b12b4f, + 0xf79e59b7, 0x43f5bb3a, 0xf2d519ff, 0x27d9459c, + 0xbf97222c, 0x15e6fc2a, 0x0f91fc71, 0x9b941525, + 0xfae59361, 0xceb69ceb, 0xc2a86459, 0x12baa8d1, + 0xb6c1075e, 0xe3056a0c, 0x10d25065, 0xcb03a442, + 0xe0ec6e0e, 0x1698db3b, 0x4c98a0be, 0x3278e964, + 0x9f1f9532, 0xe0d392df, 0xd3a0342b, 0x8971f21e, + 0x1b0a7441, 0x4ba3348c, 0xc5be7120, 0xc37632d8, + 0xdf359f8d, 0x9b992f2e, 0xe60b6f47, 0x0fe3f11d, + 0xe54cda54, 0x1edad891, 0xce6279cf, 0xcd3e7e6f, + 0x1618b166, 0xfd2c1d05, 0x848fd2c5, 0xf6fb2299, + 0xf523f357, 0xa6327623, 0x93a83531, 0x56cccd02, + 0xacf08162, 0x5a75ebb5, 0x6e163697, 0x88d273cc, + 0xde966292, 0x81b949d0, 0x4c50901b, 0x71c65614, + 0xe6c6c7bd, 0x327a140a, 0x45e1d006, 0xc3f27b9a, + 0xc9aa53fd, 0x62a80f00, 0xbb25bfe2, 0x35bdd2f6, + 0x71126905, 0xb2040222, 0xb6cbcf7c, 0xcd769c2b, + 0x53113ec0, 0x1640e3d3, 0x38abbd60, 0x2547adf0, + 0xba38209c, 0xf746ce76, 0x77afa1c5, 0x20756060, + 0x85cbfe4e, 0x8ae88dd8, 0x7aaaf9b0, 0x4cf9aa7e, + 0x1948c25c, 0x02fb8a8c, 0x01c36ae4, 0xd6ebe1f9, + 0x90d4f869, 0xa65cdea0, 0x3f09252d, 0xc208e69f, + 0xb74e6132, 0xce77e25b, 0x578fdfe3, 0x3ac372e6 +}; + +__device__ __constant__ u32 c_pbox[18] = +{ + 0x243f6a88, 0x85a308d3, 0x13198a2e, 0x03707344, + 0xa4093822, 0x299f31d0, 0x082efa98, 0xec4e6c89, + 0x452821e6, 0x38d01377, 0xbe5466cf, 0x34e90c6c, + 0xc0ac29b7, 0xc97c50dd, 0x3f84d5b5, 0xb5470917, + 0x9216d5d9, 0x8979fb1b +}; + +#define BF_ROUND(L,R,N) \ +{ \ + u32x tmp; \ + \ + tmp = S0[((L) >> 24) & 0xff]; \ + tmp += S1[((L) >> 16) & 0xff]; \ + tmp ^= S2[((L) >> 8) & 0xff]; \ + tmp += S3[((L) >> 0) & 0xff]; \ + \ + (R) ^= tmp ^ P[(N)]; \ +} + +#define BF_ENCRYPT(L,R) \ +{ \ + L ^= P[0]; \ + BF_ROUND (L, R, 1); \ + BF_ROUND (R, L, 2); \ + BF_ROUND (L, R, 3); \ + BF_ROUND (R, L, 4); \ + BF_ROUND (L, R, 5); \ + BF_ROUND (R, L, 6); \ + BF_ROUND (L, R, 7); \ + BF_ROUND (R, L, 8); \ + BF_ROUND (L, R, 9); \ + BF_ROUND (R, L, 10); \ + BF_ROUND (L, R, 11); \ + BF_ROUND (R, L, 12); \ + BF_ROUND (L, R, 13); \ + BF_ROUND (R, L, 14); \ + BF_ROUND (L, R, 15); \ + BF_ROUND (R, L, 16); \ + tmp = R; \ + R = L; \ + L = tmp ^ P[17]; \ +} + +__device__ static void expand_key (u32x E[34], const u32x W[16], const u32 len) +{ + u8 *E_cur = (u8 *) E; + u8 *E_stop = E_cur + 72; + + while (E_cur < E_stop) + { + u8 *W_cur = (u8 *) W; + u8 *W_stop = W_cur + len; + + while (W_cur < W_stop) + { + *E_cur++ = *W_cur++; + } + + *E_cur++ = 0; + } +} + +extern "C" __global__ void __launch_bounds__ (8, 1) m03200_init (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, bcrypt_tmp_t *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + const u32 lid = threadIdx.x; + + const u32 pw_len = pws[gid].pw_len; + + u32x w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = pws[gid].i[ 4]; + w[ 5] = pws[gid].i[ 5]; + w[ 6] = pws[gid].i[ 6]; + w[ 7] = pws[gid].i[ 7]; + w[ 8] = pws[gid].i[ 8]; + w[ 9] = pws[gid].i[ 9]; + w[10] = pws[gid].i[10]; + w[11] = pws[gid].i[11]; + w[12] = pws[gid].i[12]; + w[13] = pws[gid].i[13]; + w[14] = pws[gid].i[14]; + w[15] = pws[gid].i[15]; + + u32x E[34]; + + expand_key (E, w, pw_len); + + E[ 0] = swap_workaround (E[ 0]); + E[ 1] = swap_workaround (E[ 1]); + E[ 2] = swap_workaround (E[ 2]); + E[ 3] = swap_workaround (E[ 3]); + E[ 4] = swap_workaround (E[ 4]); + E[ 5] = swap_workaround (E[ 5]); + E[ 6] = swap_workaround (E[ 6]); + E[ 7] = swap_workaround (E[ 7]); + E[ 8] = swap_workaround (E[ 8]); + E[ 9] = swap_workaround (E[ 9]); + E[10] = swap_workaround (E[10]); + E[11] = swap_workaround (E[11]); + E[12] = swap_workaround (E[12]); + E[13] = swap_workaround (E[13]); + E[14] = swap_workaround (E[14]); + E[15] = swap_workaround (E[15]); + E[16] = swap_workaround (E[16]); + E[17] = swap_workaround (E[17]); + + /** + * salt + */ + + u32 salt_buf[4]; + + salt_buf[0] = salt_bufs[salt_pos].salt_buf[0]; + salt_buf[1] = salt_bufs[salt_pos].salt_buf[1]; + salt_buf[2] = salt_bufs[salt_pos].salt_buf[2]; + salt_buf[3] = salt_bufs[salt_pos].salt_buf[3]; + + /** + * do the key setup + */ + + __shared__ u32x S0_all[8][256]; + __shared__ u32x S1_all[8][256]; + __shared__ u32x S2_all[8][256]; + __shared__ u32x S3_all[8][256]; + + u32x *S0 = S0_all[lid]; + u32x *S1 = S1_all[lid]; + u32x *S2 = S2_all[lid]; + u32x *S3 = S3_all[lid]; + + // initstate + + u32x P[18]; + + for (u32 i = 0; i < 18; i++) + { + P[i] = c_pbox[i]; + } + + for (u32 i = 0; i < 256; i++) + { + S0[i] = c_sbox0[i]; + S1[i] = c_sbox1[i]; + S2[i] = c_sbox2[i]; + S3[i] = c_sbox3[i]; + } + + // expandstate + + for (u32 i = 0; i < 18; i++) + { + P[i] ^= E[i]; + } + + u32 tmp; + + u32 L0 = 0; + u32 R0 = 0; + + for (u32 i = 0; i < 18; i += 2) + { + L0 ^= salt_buf[(i & 2) + 0]; + R0 ^= salt_buf[(i & 2) + 1]; + + BF_ENCRYPT (L0, R0); + + P[i + 0] = L0; + P[i + 1] = R0; + } + + for (u32 i = 0; i < 256; i += 4) + { + L0 ^= salt_buf[2]; + R0 ^= salt_buf[3]; + + BF_ENCRYPT (L0, R0); + + S0[i + 0] = L0; + S0[i + 1] = R0; + + L0 ^= salt_buf[0]; + R0 ^= salt_buf[1]; + + BF_ENCRYPT (L0, R0); + + S0[i + 2] = L0; + S0[i + 3] = R0; + } + + for (u32 i = 0; i < 256; i += 4) + { + L0 ^= salt_buf[2]; + R0 ^= salt_buf[3]; + + BF_ENCRYPT (L0, R0); + + S1[i + 0] = L0; + S1[i + 1] = R0; + + L0 ^= salt_buf[0]; + R0 ^= salt_buf[1]; + + BF_ENCRYPT (L0, R0); + + S1[i + 2] = L0; + S1[i + 3] = R0; + } + + for (u32 i = 0; i < 256; i += 4) + { + L0 ^= salt_buf[2]; + R0 ^= salt_buf[3]; + + BF_ENCRYPT (L0, R0); + + S2[i + 0] = L0; + S2[i + 1] = R0; + + L0 ^= salt_buf[0]; + R0 ^= salt_buf[1]; + + BF_ENCRYPT (L0, R0); + + S2[i + 2] = L0; + S2[i + 3] = R0; + } + + for (u32 i = 0; i < 256; i += 4) + { + L0 ^= salt_buf[2]; + R0 ^= salt_buf[3]; + + BF_ENCRYPT (L0, R0); + + S3[i + 0] = L0; + S3[i + 1] = R0; + + L0 ^= salt_buf[0]; + R0 ^= salt_buf[1]; + + BF_ENCRYPT (L0, R0); + + S3[i + 2] = L0; + S3[i + 3] = R0; + } + + // store + + for (u32 i = 0; i < 18; i++) + { + tmps[gid].P[i] = P[i]; + } + + for (u32 i = 0; i < 256; i++) + { + tmps[gid].S0[i] = S0[i]; + tmps[gid].S1[i] = S1[i]; + tmps[gid].S2[i] = S2[i]; + tmps[gid].S3[i] = S3[i]; + } +} + +extern "C" __global__ void __launch_bounds__ (8, 1) m03200_loop (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, bcrypt_tmp_t *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + const u32 lid = threadIdx.x; + + const u32 pw_len = pws[gid].pw_len; + + u32x w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = pws[gid].i[ 4]; + w[ 5] = pws[gid].i[ 5]; + w[ 6] = pws[gid].i[ 6]; + w[ 7] = pws[gid].i[ 7]; + w[ 8] = pws[gid].i[ 8]; + w[ 9] = pws[gid].i[ 9]; + w[10] = pws[gid].i[10]; + w[11] = pws[gid].i[11]; + w[12] = pws[gid].i[12]; + w[13] = pws[gid].i[13]; + w[14] = pws[gid].i[14]; + w[15] = pws[gid].i[15]; + + u32x E[34]; + + expand_key (E, w, pw_len); + + E[ 0] = swap_workaround (E[ 0]); + E[ 1] = swap_workaround (E[ 1]); + E[ 2] = swap_workaround (E[ 2]); + E[ 3] = swap_workaround (E[ 3]); + E[ 4] = swap_workaround (E[ 4]); + E[ 5] = swap_workaround (E[ 5]); + E[ 6] = swap_workaround (E[ 6]); + E[ 7] = swap_workaround (E[ 7]); + E[ 8] = swap_workaround (E[ 8]); + E[ 9] = swap_workaround (E[ 9]); + E[10] = swap_workaround (E[10]); + E[11] = swap_workaround (E[11]); + E[12] = swap_workaround (E[12]); + E[13] = swap_workaround (E[13]); + E[14] = swap_workaround (E[14]); + E[15] = swap_workaround (E[15]); + E[16] = swap_workaround (E[16]); + E[17] = swap_workaround (E[17]); + + // load + + u32x P[18]; + + for (u32 i = 0; i < 18; i++) + { + P[i] = tmps[gid].P[i]; + } + + __shared__ u32x S0_all[8][256]; + __shared__ u32x S1_all[8][256]; + __shared__ u32x S2_all[8][256]; + __shared__ u32x S3_all[8][256]; + + u32x *S0 = S0_all[lid]; + u32x *S1 = S1_all[lid]; + u32x *S2 = S2_all[lid]; + u32x *S3 = S3_all[lid]; + + for (u32 i = 0; i < 256; i++) + { + S0[i] = tmps[gid].S0[i]; + S1[i] = tmps[gid].S1[i]; + S2[i] = tmps[gid].S2[i]; + S3[i] = tmps[gid].S3[i]; + } + + /** + * salt + */ + + u32 salt_buf[4]; + + salt_buf[0] = salt_bufs[salt_pos].salt_buf[0]; + salt_buf[1] = salt_bufs[salt_pos].salt_buf[1]; + salt_buf[2] = salt_bufs[salt_pos].salt_buf[2]; + salt_buf[3] = salt_bufs[salt_pos].salt_buf[3]; + + /** + * main loop + */ + + u32 tmp; + + u32 L0; + u32 R0; + + for (u32 i = 0; i < loop_cnt; i++) + { + for (u32 i = 0; i < 18; i++) + { + P[i] ^= E[i]; + } + + L0 = 0; + R0 = 0; + + for (u32 i = 0; i < 9; i++) + { + BF_ENCRYPT (L0, R0); + + P[i * 2 + 0] = L0; + P[i * 2 + 1] = R0; + } + + for (u32 i = 0; i < 256; i += 2) + { + BF_ENCRYPT (L0, R0); + + S0[i + 0] = L0; + S0[i + 1] = R0; + } + + for (u32 i = 0; i < 256; i += 2) + { + BF_ENCRYPT (L0, R0); + + S1[i + 0] = L0; + S1[i + 1] = R0; + } + + for (u32 i = 0; i < 256; i += 2) + { + BF_ENCRYPT (L0, R0); + + S2[i + 0] = L0; + S2[i + 1] = R0; + } + + for (u32 i = 0; i < 256; i += 2) + { + BF_ENCRYPT (L0, R0); + + S3[i + 0] = L0; + S3[i + 1] = R0; + } + + P[ 0] ^= salt_buf[0]; + P[ 1] ^= salt_buf[1]; + P[ 2] ^= salt_buf[2]; + P[ 3] ^= salt_buf[3]; + P[ 4] ^= salt_buf[0]; + P[ 5] ^= salt_buf[1]; + P[ 6] ^= salt_buf[2]; + P[ 7] ^= salt_buf[3]; + P[ 8] ^= salt_buf[0]; + P[ 9] ^= salt_buf[1]; + P[10] ^= salt_buf[2]; + P[11] ^= salt_buf[3]; + P[12] ^= salt_buf[0]; + P[13] ^= salt_buf[1]; + P[14] ^= salt_buf[2]; + P[15] ^= salt_buf[3]; + P[16] ^= salt_buf[0]; + P[17] ^= salt_buf[1]; + + L0 = 0; + R0 = 0; + + for (u32 i = 0; i < 9; i++) + { + BF_ENCRYPT (L0, R0); + + P[i * 2+ 0] = L0; + P[i * 2+ 1] = R0; + } + + for (u32 i = 0; i < 256; i += 2) + { + BF_ENCRYPT (L0, R0); + + S0[i + 0] = L0; + S0[i + 1] = R0; + } + + for (u32 i = 0; i < 256; i += 2) + { + BF_ENCRYPT (L0, R0); + + S1[i + 0] = L0; + S1[i + 1] = R0; + } + + for (u32 i = 0; i < 256; i += 2) + { + BF_ENCRYPT (L0, R0); + + S2[i + 0] = L0; + S2[i + 1] = R0; + } + + for (u32 i = 0; i < 256; i += 2) + { + BF_ENCRYPT (L0, R0); + + S3[i + 0] = L0; + S3[i + 1] = R0; + } + } + + // store + + for (u32 i = 0; i < 18; i++) + { + tmps[gid].P[i] = P[i]; + } + + for (u32 i = 0; i < 256; i++) + { + tmps[gid].S0[i] = S0[i]; + tmps[gid].S1[i] = S1[i]; + tmps[gid].S2[i] = S2[i]; + tmps[gid].S3[i] = S3[i]; + } +} + +extern "C" __global__ void __launch_bounds__ (8, 1) m03200_comp (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, bcrypt_tmp_t *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + const u32 lid = threadIdx.x; + + // load + + u32x P[18]; + + for (u32 i = 0; i < 18; i++) + { + P[i] = tmps[gid].P[i]; + } + + __shared__ u32x S0_all[8][256]; + __shared__ u32x S1_all[8][256]; + __shared__ u32x S2_all[8][256]; + __shared__ u32x S3_all[8][256]; + + u32x *S0 = S0_all[lid]; + u32x *S1 = S1_all[lid]; + u32x *S2 = S2_all[lid]; + u32x *S3 = S3_all[lid]; + + for (u32 i = 0; i < 256; i++) + { + S0[i] = tmps[gid].S0[i]; + S1[i] = tmps[gid].S1[i]; + S2[i] = tmps[gid].S2[i]; + S3[i] = tmps[gid].S3[i]; + } + + /** + * main + */ + + u32 tmp; + + u32 L0; + u32 R0; + + L0 = BCRYPTM_0; + R0 = BCRYPTM_1; + + for (u32 i = 0; i < 64; i++) + { + BF_ENCRYPT (L0, R0); + } + + const u32x r0 = L0; + const u32x r1 = R0; + + L0 = BCRYPTM_2; + R0 = BCRYPTM_3; + + for (u32 i = 0; i < 64; i++) + { + BF_ENCRYPT (L0, R0); + } + + const u32x r2 = L0; + const u32x r3 = R0; + + /* + e = L0; + f = R0; + + f &= ~0xff; // its just 23 not 24 ! + */ + + #define il_pos 0 + + #include VECT_COMPARE_M +} diff --git a/nv/m03710_a0.cu b/nv/m03710_a0.cu new file mode 100644 index 0000000000..b0a7ffb9ab --- /dev/null +++ b/nv/m03710_a0.cu @@ -0,0 +1,766 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _MD5_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW2 +#define VECT_SIZE1 +#endif + +#define DGST_R0 0 +#define DGST_R1 3 +#define DGST_R2 2 +#define DGST_R3 1 + +#include "include/kernel_functions.c" +#include "types_nv.c" +#include "common_nv.c" +#include "include/rp_gpu.h" +#include "rp_nv.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +#ifdef VECT_SIZE1 +#define uint_to_hex_lower8(i) l_bin2asc[(i)] +#endif + +#ifdef VECT_SIZE2 +#define uint_to_hex_lower8(i) u32x (l_bin2asc[(i).x], l_bin2asc[(i).y]) +#endif + +#ifdef VECT_SIZE4 +#define uint_to_hex_lower8(i) u32x (l_bin2asc[(i).x], l_bin2asc[(i).y], l_bin2asc[(i).z], l_bin2asc[(i).w]) +#endif + +__device__ __constant__ char c_bin2asc[16] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' }; + +__device__ __shared__ short l_bin2asc[256]; + +__device__ __constant__ gpu_rule_t c_rules[1024]; + +extern "C" __global__ void __launch_bounds__ (256, 1) m03710_m04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + u32x pw_buf1[4]; + + pw_buf1[0] = pws[gid].i[ 4]; + pw_buf1[1] = pws[gid].i[ 5]; + pw_buf1[2] = pws[gid].i[ 6]; + pw_buf1[3] = pws[gid].i[ 7]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[ 1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[ 2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[ 3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[ 4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[ 5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[ 6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[ 7]; + + u32 salt_buf2[4]; + + salt_buf2[0] = 0; + salt_buf2[1] = 0; + salt_buf2[2] = 0; + salt_buf2[3] = 0; + + u32 salt_buf3[4]; + + salt_buf3[0] = 0; + salt_buf3[1] = 0; + salt_buf3[2] = 0; + salt_buf3[3] = 0; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + const u32 pw_salt_len = 32 + salt_len; + + /** + * bin2asc table + */ + + l_bin2asc[lid] = c_bin2asc[(lid >> 0) & 15] << 8 + | c_bin2asc[(lid >> 4) & 15] << 0; + + __syncthreads (); + + + if (gid >= gid_max) return; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + + w0[0] = pw_buf0[0]; + w0[1] = pw_buf0[1]; + w0[2] = pw_buf0[2]; + w0[3] = pw_buf0[3]; + + u32x w1[4]; + + w1[0] = pw_buf1[0]; + w1[1] = pw_buf1[1]; + w1[2] = pw_buf1[2]; + w1[3] = pw_buf1[3]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 out_len = apply_rules (c_rules[il_pos].cmds, w0, w1, pw_len); + + append_0x80_2 (w0, w1, out_len); + + w3[2] = out_len * 8; + + u32x a = MD5M_A; + u32x b = MD5M_B; + u32x c = MD5M_C; + u32x d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H , a, b, c, d, w1[1], MD5C20, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w2[0], MD5C21, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w2[3], MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w3[2], MD5C23, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w0[1], MD5C24, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w1[0], MD5C25, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w1[3], MD5C26, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w2[2], MD5C27, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w3[1], MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w0[0], MD5C29, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w0[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w1[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w2[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w3[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w3[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w0[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1[0], MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w2[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2[1], MD5C3f, MD5S33); + + a += MD5M_A; + b += MD5M_B; + c += MD5M_C; + d += MD5M_D; + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + w0_t[0] = uint_to_hex_lower8 ((a >> 0) & 255) << 0 + | uint_to_hex_lower8 ((a >> 8) & 255) << 16; + w0_t[1] = uint_to_hex_lower8 ((a >> 16) & 255) << 0 + | uint_to_hex_lower8 ((a >> 24) & 255) << 16; + w0_t[2] = uint_to_hex_lower8 ((b >> 0) & 255) << 0 + | uint_to_hex_lower8 ((b >> 8) & 255) << 16; + w0_t[3] = uint_to_hex_lower8 ((b >> 16) & 255) << 0 + | uint_to_hex_lower8 ((b >> 24) & 255) << 16; + w1_t[0] = uint_to_hex_lower8 ((c >> 0) & 255) << 0 + | uint_to_hex_lower8 ((c >> 8) & 255) << 16; + w1_t[1] = uint_to_hex_lower8 ((c >> 16) & 255) << 0 + | uint_to_hex_lower8 ((c >> 24) & 255) << 16; + w1_t[2] = uint_to_hex_lower8 ((d >> 0) & 255) << 0 + | uint_to_hex_lower8 ((d >> 8) & 255) << 16; + w1_t[3] = uint_to_hex_lower8 ((d >> 16) & 255) << 0 + | uint_to_hex_lower8 ((d >> 24) & 255) << 16; + + w2_t[0] = 0x00000080; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = 0; + + /** + * prepend salt + */ + + switch_buffer_by_offset (w0_t, w1_t, w2_t, w3_t, salt_len); + + w3_t[2] = pw_salt_len * 8; + + w0_t[0] |= salt_buf0[0]; + w0_t[1] |= salt_buf0[1]; + w0_t[2] |= salt_buf0[2]; + w0_t[3] |= salt_buf0[3]; + w1_t[0] |= salt_buf1[0]; + w1_t[1] |= salt_buf1[1]; + w1_t[2] |= salt_buf1[2]; + w1_t[3] |= salt_buf1[3]; + w2_t[0] |= salt_buf2[0]; + w2_t[1] |= salt_buf2[1]; + w2_t[2] |= salt_buf2[2]; + w2_t[3] |= salt_buf2[3]; + w3_t[0] |= salt_buf3[0]; + w3_t[1] |= salt_buf3[1]; + w3_t[2] |= salt_buf3[2]; + w3_t[3] |= salt_buf3[3]; + + /** + * md5 + */ + + a = MD5M_A; + b = MD5M_B; + c = MD5M_C; + d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0_t[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0_t[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0_t[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1_t[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1_t[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1_t[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2_t[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2_t[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2_t[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3_t[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3_t[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3_t[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0_t[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1_t[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2_t[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1_t[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1_t[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2_t[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3_t[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0_t[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2_t[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3_t[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0_t[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1_t[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3_t[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H , a, b, c, d, w1_t[1], MD5C20, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w2_t[0], MD5C21, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w2_t[3], MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w3_t[2], MD5C23, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w0_t[1], MD5C24, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w1_t[0], MD5C25, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w1_t[3], MD5C26, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w2_t[2], MD5C27, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w3_t[1], MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w0_t[0], MD5C29, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w0_t[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w1_t[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w2_t[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w3_t[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w3_t[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w0_t[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1_t[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3_t[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3_t[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0_t[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0_t[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2_t[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1_t[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3_t[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1_t[0], MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w2_t[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0_t[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2_t[1], MD5C3f, MD5S33); + + const u32x r0 = a; + const u32x r1 = d; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_M + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m03710_m08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m03710_m16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m03710_s04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + u32x pw_buf1[4]; + + pw_buf1[0] = pws[gid].i[ 4]; + pw_buf1[1] = pws[gid].i[ 5]; + pw_buf1[2] = pws[gid].i[ 6]; + pw_buf1[3] = pws[gid].i[ 7]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[ 1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[ 2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[ 3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[ 4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[ 5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[ 6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[ 7]; + + u32 salt_buf2[4]; + + salt_buf2[0] = 0; + salt_buf2[1] = 0; + salt_buf2[2] = 0; + salt_buf2[3] = 0; + + u32 salt_buf3[4]; + + salt_buf3[0] = 0; + salt_buf3[1] = 0; + salt_buf3[2] = 0; + salt_buf3[3] = 0; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + const u32 pw_salt_len = 32 + salt_len; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * bin2asc table + */ + + l_bin2asc[lid] = c_bin2asc[(lid >> 0) & 15] << 8 + | c_bin2asc[(lid >> 4) & 15] << 0; + + __syncthreads (); + + if (gid >= gid_max) return; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + + w0[0] = pw_buf0[0]; + w0[1] = pw_buf0[1]; + w0[2] = pw_buf0[2]; + w0[3] = pw_buf0[3]; + + u32x w1[4]; + + w1[0] = pw_buf1[0]; + w1[1] = pw_buf1[1]; + w1[2] = pw_buf1[2]; + w1[3] = pw_buf1[3]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 out_len = apply_rules (c_rules[il_pos].cmds, w0, w1, pw_len); + + append_0x80_2 (w0, w1, out_len); + + w3[2] = out_len * 8; + + u32x a = MD5M_A; + u32x b = MD5M_B; + u32x c = MD5M_C; + u32x d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H , a, b, c, d, w1[1], MD5C20, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w2[0], MD5C21, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w2[3], MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w3[2], MD5C23, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w0[1], MD5C24, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w1[0], MD5C25, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w1[3], MD5C26, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w2[2], MD5C27, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w3[1], MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w0[0], MD5C29, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w0[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w1[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w2[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w3[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w3[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w0[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1[0], MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w2[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2[1], MD5C3f, MD5S33); + + a += MD5M_A; + b += MD5M_B; + c += MD5M_C; + d += MD5M_D; + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + w0_t[0] = uint_to_hex_lower8 ((a >> 0) & 255) << 0 + | uint_to_hex_lower8 ((a >> 8) & 255) << 16; + w0_t[1] = uint_to_hex_lower8 ((a >> 16) & 255) << 0 + | uint_to_hex_lower8 ((a >> 24) & 255) << 16; + w0_t[2] = uint_to_hex_lower8 ((b >> 0) & 255) << 0 + | uint_to_hex_lower8 ((b >> 8) & 255) << 16; + w0_t[3] = uint_to_hex_lower8 ((b >> 16) & 255) << 0 + | uint_to_hex_lower8 ((b >> 24) & 255) << 16; + w1_t[0] = uint_to_hex_lower8 ((c >> 0) & 255) << 0 + | uint_to_hex_lower8 ((c >> 8) & 255) << 16; + w1_t[1] = uint_to_hex_lower8 ((c >> 16) & 255) << 0 + | uint_to_hex_lower8 ((c >> 24) & 255) << 16; + w1_t[2] = uint_to_hex_lower8 ((d >> 0) & 255) << 0 + | uint_to_hex_lower8 ((d >> 8) & 255) << 16; + w1_t[3] = uint_to_hex_lower8 ((d >> 16) & 255) << 0 + | uint_to_hex_lower8 ((d >> 24) & 255) << 16; + + w2_t[0] = 0x00000080; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = 0; + + /** + * prepend salt + */ + + switch_buffer_by_offset (w0_t, w1_t, w2_t, w3_t, salt_len); + + w3_t[2] = pw_salt_len * 8; + + w0_t[0] |= salt_buf0[0]; + w0_t[1] |= salt_buf0[1]; + w0_t[2] |= salt_buf0[2]; + w0_t[3] |= salt_buf0[3]; + w1_t[0] |= salt_buf1[0]; + w1_t[1] |= salt_buf1[1]; + w1_t[2] |= salt_buf1[2]; + w1_t[3] |= salt_buf1[3]; + w2_t[0] |= salt_buf2[0]; + w2_t[1] |= salt_buf2[1]; + w2_t[2] |= salt_buf2[2]; + w2_t[3] |= salt_buf2[3]; + w3_t[0] |= salt_buf3[0]; + w3_t[1] |= salt_buf3[1]; + w3_t[2] |= salt_buf3[2]; + w3_t[3] |= salt_buf3[3]; + + /** + * md5 + */ + + a = MD5M_A; + b = MD5M_B; + c = MD5M_C; + d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0_t[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0_t[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0_t[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1_t[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1_t[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1_t[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2_t[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2_t[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2_t[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3_t[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3_t[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3_t[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0_t[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1_t[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2_t[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1_t[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1_t[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2_t[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3_t[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0_t[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2_t[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3_t[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0_t[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1_t[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3_t[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H , a, b, c, d, w1_t[1], MD5C20, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w2_t[0], MD5C21, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w2_t[3], MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w3_t[2], MD5C23, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w0_t[1], MD5C24, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w1_t[0], MD5C25, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w1_t[3], MD5C26, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w2_t[2], MD5C27, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w3_t[1], MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w0_t[0], MD5C29, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w0_t[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w1_t[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w2_t[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w3_t[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w3_t[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w0_t[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1_t[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3_t[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3_t[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0_t[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0_t[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2_t[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1_t[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3_t[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1_t[0], MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w2_t[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0_t[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2_t[1], MD5C3f, MD5S33); + + const u32x r0 = a; + const u32x r1 = d; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_S + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m03710_s08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m03710_s16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/nv/m03710_a1.cu b/nv/m03710_a1.cu new file mode 100644 index 0000000000..1fd46c6413 --- /dev/null +++ b/nv/m03710_a1.cu @@ -0,0 +1,867 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _MD5_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW2 +#define VECT_SIZE4 +#endif + +#define DGST_R0 0 +#define DGST_R1 3 +#define DGST_R2 2 +#define DGST_R3 1 + +#include "include/kernel_functions.c" +#include "types_nv.c" +#include "common_nv.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +#ifdef VECT_SIZE1 +#define uint_to_hex_lower8(i) l_bin2asc[(i)] +#endif + +#ifdef VECT_SIZE2 +#define uint_to_hex_lower8(i) u32x (l_bin2asc[(i).x], l_bin2asc[(i).y]) +#endif + +#ifdef VECT_SIZE4 +#define uint_to_hex_lower8(i) u32x (l_bin2asc[(i).x], l_bin2asc[(i).y], l_bin2asc[(i).z], l_bin2asc[(i).w]) +#endif + +__device__ __constant__ char c_bin2asc[16] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' }; + +__device__ __shared__ short l_bin2asc[256]; + +__device__ __constant__ comb_t c_combs[1024]; + +extern "C" __global__ void __launch_bounds__ (256, 1) m03710_m04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + append_0x80_2 (wordl0, wordl1, pw_l_len); + + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, c_combs[0].pw_len); + } + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[ 1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[ 2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[ 3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[ 4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[ 5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[ 6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[ 7]; + + u32 salt_buf2[4]; + + salt_buf2[0] = 0; + salt_buf2[1] = 0; + salt_buf2[2] = 0; + salt_buf2[3] = 0; + + u32 salt_buf3[4]; + + salt_buf3[0] = 0; + salt_buf3[1] = 0; + salt_buf3[2] = 0; + salt_buf3[3] = 0; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + const u32 pw_salt_len = 32 + salt_len; + + /** + * bin2asc table + */ + + l_bin2asc[lid] = c_bin2asc[(lid >> 0) & 15] << 8 + | c_bin2asc[(lid >> 4) & 15] << 0; + + __syncthreads (); + + if (gid >= gid_max) return; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = c_combs[il_pos].pw_len; + + const u32 pw_len = pw_l_len + pw_r_len; + + u32 wordr0[4]; + + wordr0[0] = c_combs[il_pos].i[0]; + wordr0[1] = c_combs[il_pos].i[1]; + wordr0[2] = c_combs[il_pos].i[2]; + wordr0[3] = c_combs[il_pos].i[3]; + + u32 wordr1[4]; + + wordr1[0] = c_combs[il_pos].i[4]; + wordr1[1] = c_combs[il_pos].i[5]; + wordr1[2] = c_combs[il_pos].i[6]; + wordr1[3] = c_combs[il_pos].i[7]; + + u32 wordr2[4]; + + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + + u32 wordr3[4]; + + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + u32x w0[4]; + + w0[0] = wordl0[0] | wordr0[0]; + w0[1] = wordl0[1] | wordr0[1]; + w0[2] = wordl0[2] | wordr0[2]; + w0[3] = wordl0[3] | wordr0[3]; + + u32x w1[4]; + + w1[0] = wordl1[0] | wordr1[0]; + w1[1] = wordl1[1] | wordr1[1]; + w1[2] = wordl1[2] | wordr1[2]; + w1[3] = wordl1[3] | wordr1[3]; + + u32x w2[4]; + + w2[0] = wordl2[0] | wordr2[0]; + w2[1] = wordl2[1] | wordr2[1]; + w2[2] = wordl2[2] | wordr2[2]; + w2[3] = wordl2[3] | wordr2[3]; + + u32x w3[4]; + + w3[0] = wordl3[0] | wordr3[0]; + w3[1] = wordl3[1] | wordr3[1]; + w3[2] = pw_len * 8; + w3[3] = 0; + + u32x a = MD5M_A; + u32x b = MD5M_B; + u32x c = MD5M_C; + u32x d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H , a, b, c, d, w1[1], MD5C20, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w2[0], MD5C21, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w2[3], MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w3[2], MD5C23, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w0[1], MD5C24, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w1[0], MD5C25, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w1[3], MD5C26, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w2[2], MD5C27, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w3[1], MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w0[0], MD5C29, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w0[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w1[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w2[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w3[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w3[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w0[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1[0], MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w2[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2[1], MD5C3f, MD5S33); + + a += MD5M_A; + b += MD5M_B; + c += MD5M_C; + d += MD5M_D; + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + w0_t[0] = uint_to_hex_lower8 ((a >> 0) & 255) << 0 + | uint_to_hex_lower8 ((a >> 8) & 255) << 16; + w0_t[1] = uint_to_hex_lower8 ((a >> 16) & 255) << 0 + | uint_to_hex_lower8 ((a >> 24) & 255) << 16; + w0_t[2] = uint_to_hex_lower8 ((b >> 0) & 255) << 0 + | uint_to_hex_lower8 ((b >> 8) & 255) << 16; + w0_t[3] = uint_to_hex_lower8 ((b >> 16) & 255) << 0 + | uint_to_hex_lower8 ((b >> 24) & 255) << 16; + w1_t[0] = uint_to_hex_lower8 ((c >> 0) & 255) << 0 + | uint_to_hex_lower8 ((c >> 8) & 255) << 16; + w1_t[1] = uint_to_hex_lower8 ((c >> 16) & 255) << 0 + | uint_to_hex_lower8 ((c >> 24) & 255) << 16; + w1_t[2] = uint_to_hex_lower8 ((d >> 0) & 255) << 0 + | uint_to_hex_lower8 ((d >> 8) & 255) << 16; + w1_t[3] = uint_to_hex_lower8 ((d >> 16) & 255) << 0 + | uint_to_hex_lower8 ((d >> 24) & 255) << 16; + + w2_t[0] = 0x00000080; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = 0; + + /** + * prepend salt + */ + + switch_buffer_by_offset (w0_t, w1_t, w2_t, w3_t, salt_len); + + w3_t[2] = pw_salt_len * 8; + + w0_t[0] |= salt_buf0[0]; + w0_t[1] |= salt_buf0[1]; + w0_t[2] |= salt_buf0[2]; + w0_t[3] |= salt_buf0[3]; + w1_t[0] |= salt_buf1[0]; + w1_t[1] |= salt_buf1[1]; + w1_t[2] |= salt_buf1[2]; + w1_t[3] |= salt_buf1[3]; + w2_t[0] |= salt_buf2[0]; + w2_t[1] |= salt_buf2[1]; + w2_t[2] |= salt_buf2[2]; + w2_t[3] |= salt_buf2[3]; + w3_t[0] |= salt_buf3[0]; + w3_t[1] |= salt_buf3[1]; + w3_t[2] |= salt_buf3[2]; + w3_t[3] |= salt_buf3[3]; + + /** + * md5 + */ + + a = MD5M_A; + b = MD5M_B; + c = MD5M_C; + d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0_t[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0_t[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0_t[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1_t[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1_t[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1_t[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2_t[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2_t[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2_t[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3_t[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3_t[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3_t[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0_t[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1_t[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2_t[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1_t[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1_t[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2_t[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3_t[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0_t[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2_t[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3_t[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0_t[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1_t[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3_t[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H , a, b, c, d, w1_t[1], MD5C20, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w2_t[0], MD5C21, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w2_t[3], MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w3_t[2], MD5C23, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w0_t[1], MD5C24, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w1_t[0], MD5C25, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w1_t[3], MD5C26, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w2_t[2], MD5C27, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w3_t[1], MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w0_t[0], MD5C29, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w0_t[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w1_t[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w2_t[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w3_t[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w3_t[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w0_t[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1_t[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3_t[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3_t[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0_t[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0_t[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2_t[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1_t[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3_t[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1_t[0], MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w2_t[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0_t[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2_t[1], MD5C3f, MD5S33); + + const u32x r0 = a; + const u32x r1 = d; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_M + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m03710_m08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m03710_m16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m03710_s04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + append_0x80_2 (wordl0, wordl1, pw_l_len); + + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, c_combs[0].pw_len); + } + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[ 1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[ 2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[ 3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[ 4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[ 5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[ 6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[ 7]; + + u32 salt_buf2[4]; + + salt_buf2[0] = 0; + salt_buf2[1] = 0; + salt_buf2[2] = 0; + salt_buf2[3] = 0; + + u32 salt_buf3[4]; + + salt_buf3[0] = 0; + salt_buf3[1] = 0; + salt_buf3[2] = 0; + salt_buf3[3] = 0; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + const u32 pw_salt_len = 32 + salt_len; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * bin2asc table + */ + + l_bin2asc[lid] = c_bin2asc[(lid >> 0) & 15] << 8 + | c_bin2asc[(lid >> 4) & 15] << 0; + + __syncthreads (); + + if (gid >= gid_max) return; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = c_combs[il_pos].pw_len; + + const u32 pw_len = pw_l_len + pw_r_len; + + u32 wordr0[4]; + + wordr0[0] = c_combs[il_pos].i[0]; + wordr0[1] = c_combs[il_pos].i[1]; + wordr0[2] = c_combs[il_pos].i[2]; + wordr0[3] = c_combs[il_pos].i[3]; + + u32 wordr1[4]; + + wordr1[0] = c_combs[il_pos].i[4]; + wordr1[1] = c_combs[il_pos].i[5]; + wordr1[2] = c_combs[il_pos].i[6]; + wordr1[3] = c_combs[il_pos].i[7]; + + u32 wordr2[4]; + + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + + u32 wordr3[4]; + + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + u32x w0[4]; + + w0[0] = wordl0[0] | wordr0[0]; + w0[1] = wordl0[1] | wordr0[1]; + w0[2] = wordl0[2] | wordr0[2]; + w0[3] = wordl0[3] | wordr0[3]; + + u32x w1[4]; + + w1[0] = wordl1[0] | wordr1[0]; + w1[1] = wordl1[1] | wordr1[1]; + w1[2] = wordl1[2] | wordr1[2]; + w1[3] = wordl1[3] | wordr1[3]; + + u32x w2[4]; + + w2[0] = wordl2[0] | wordr2[0]; + w2[1] = wordl2[1] | wordr2[1]; + w2[2] = wordl2[2] | wordr2[2]; + w2[3] = wordl2[3] | wordr2[3]; + + u32x w3[4]; + + w3[0] = wordl3[0] | wordr3[0]; + w3[1] = wordl3[1] | wordr3[1]; + w3[2] = pw_len * 8; + w3[3] = 0; + + u32x a = MD5M_A; + u32x b = MD5M_B; + u32x c = MD5M_C; + u32x d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H , a, b, c, d, w1[1], MD5C20, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w2[0], MD5C21, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w2[3], MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w3[2], MD5C23, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w0[1], MD5C24, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w1[0], MD5C25, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w1[3], MD5C26, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w2[2], MD5C27, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w3[1], MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w0[0], MD5C29, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w0[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w1[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w2[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w3[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w3[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w0[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1[0], MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w2[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2[1], MD5C3f, MD5S33); + + a += MD5M_A; + b += MD5M_B; + c += MD5M_C; + d += MD5M_D; + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + w0_t[0] = uint_to_hex_lower8 ((a >> 0) & 255) << 0 + | uint_to_hex_lower8 ((a >> 8) & 255) << 16; + w0_t[1] = uint_to_hex_lower8 ((a >> 16) & 255) << 0 + | uint_to_hex_lower8 ((a >> 24) & 255) << 16; + w0_t[2] = uint_to_hex_lower8 ((b >> 0) & 255) << 0 + | uint_to_hex_lower8 ((b >> 8) & 255) << 16; + w0_t[3] = uint_to_hex_lower8 ((b >> 16) & 255) << 0 + | uint_to_hex_lower8 ((b >> 24) & 255) << 16; + w1_t[0] = uint_to_hex_lower8 ((c >> 0) & 255) << 0 + | uint_to_hex_lower8 ((c >> 8) & 255) << 16; + w1_t[1] = uint_to_hex_lower8 ((c >> 16) & 255) << 0 + | uint_to_hex_lower8 ((c >> 24) & 255) << 16; + w1_t[2] = uint_to_hex_lower8 ((d >> 0) & 255) << 0 + | uint_to_hex_lower8 ((d >> 8) & 255) << 16; + w1_t[3] = uint_to_hex_lower8 ((d >> 16) & 255) << 0 + | uint_to_hex_lower8 ((d >> 24) & 255) << 16; + + w2_t[0] = 0x00000080; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = 0; + + /** + * prepend salt + */ + + switch_buffer_by_offset (w0_t, w1_t, w2_t, w3_t, salt_len); + + w3_t[2] = pw_salt_len * 8; + + w0_t[0] |= salt_buf0[0]; + w0_t[1] |= salt_buf0[1]; + w0_t[2] |= salt_buf0[2]; + w0_t[3] |= salt_buf0[3]; + w1_t[0] |= salt_buf1[0]; + w1_t[1] |= salt_buf1[1]; + w1_t[2] |= salt_buf1[2]; + w1_t[3] |= salt_buf1[3]; + w2_t[0] |= salt_buf2[0]; + w2_t[1] |= salt_buf2[1]; + w2_t[2] |= salt_buf2[2]; + w2_t[3] |= salt_buf2[3]; + w3_t[0] |= salt_buf3[0]; + w3_t[1] |= salt_buf3[1]; + w3_t[2] |= salt_buf3[2]; + w3_t[3] |= salt_buf3[3]; + + /** + * md5 + */ + + a = MD5M_A; + b = MD5M_B; + c = MD5M_C; + d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0_t[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0_t[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0_t[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1_t[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1_t[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1_t[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2_t[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2_t[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2_t[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3_t[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3_t[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3_t[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0_t[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1_t[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2_t[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1_t[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1_t[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2_t[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3_t[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0_t[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2_t[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3_t[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0_t[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1_t[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3_t[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H , a, b, c, d, w1_t[1], MD5C20, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w2_t[0], MD5C21, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w2_t[3], MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w3_t[2], MD5C23, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w0_t[1], MD5C24, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w1_t[0], MD5C25, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w1_t[3], MD5C26, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w2_t[2], MD5C27, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w3_t[1], MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w0_t[0], MD5C29, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w0_t[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w1_t[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w2_t[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w3_t[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w3_t[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w0_t[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1_t[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3_t[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3_t[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0_t[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0_t[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2_t[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1_t[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3_t[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1_t[0], MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w2_t[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0_t[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2_t[1], MD5C3f, MD5S33); + + const u32x r0 = a; + const u32x r1 = d; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_S + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m03710_s08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m03710_s16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/nv/m03710_a3.cu b/nv/m03710_a3.cu new file mode 100644 index 0000000000..d6a7eaa699 --- /dev/null +++ b/nv/m03710_a3.cu @@ -0,0 +1,999 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _MD5_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW2 +#define VECT_SIZE4 +#endif + +#define DGST_R0 0 +#define DGST_R1 3 +#define DGST_R2 2 +#define DGST_R3 1 + +#include "include/kernel_functions.c" +#include "types_nv.c" +#include "common_nv.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +#ifdef VECT_SIZE1 +#define uint_to_hex_lower8(i) l_bin2asc[(i)] +#endif + +#ifdef VECT_SIZE2 +#define uint_to_hex_lower8(i) u32x (l_bin2asc[(i).x], l_bin2asc[(i).y]) +#endif + +#ifdef VECT_SIZE4 +#define uint_to_hex_lower8(i) u32x (l_bin2asc[(i).x], l_bin2asc[(i).y], l_bin2asc[(i).z], l_bin2asc[(i).w]) +#endif + +__device__ __constant__ char c_bin2asc[16] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' }; + +__device__ __shared__ short l_bin2asc[256]; + +__device__ __constant__ bf_t c_bfs[1024]; + +__device__ static void m03710m (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], const u32 pw_len, const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset) +{ + /** + * modifier + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + const u32 lid = threadIdx.x; + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[ 1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[ 2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[ 3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[ 4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[ 5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[ 6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[ 7]; + + u32 salt_buf2[4]; + + salt_buf2[0] = 0; + salt_buf2[1] = 0; + salt_buf2[2] = 0; + salt_buf2[3] = 0; + + u32 salt_buf3[4]; + + salt_buf3[0] = 0; + salt_buf3[1] = 0; + salt_buf3[2] = 0; + salt_buf3[3] = 0; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + const u32 pw_salt_len = 32 + salt_len; + + /** + * loop + */ + + u32x w0l = w0[0]; + + for (u32 il_pos = 0; il_pos < bfs_cnt; il_pos++) + { + const u32 w0r = c_bfs[il_pos].i; + + w0[0] = w0l | w0r; + + u32x a = MD5M_A; + u32x b = MD5M_B; + u32x c = MD5M_C; + u32x d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H , a, b, c, d, w1[1], MD5C20, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w2[0], MD5C21, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w2[3], MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w3[2], MD5C23, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w0[1], MD5C24, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w1[0], MD5C25, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w1[3], MD5C26, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w2[2], MD5C27, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w3[1], MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w0[0], MD5C29, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w0[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w1[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w2[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w3[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w3[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w0[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1[0], MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w2[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2[1], MD5C3f, MD5S33); + + a += MD5M_A; + b += MD5M_B; + c += MD5M_C; + d += MD5M_D; + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + w0_t[0] = uint_to_hex_lower8 ((a >> 0) & 255) << 0 + | uint_to_hex_lower8 ((a >> 8) & 255) << 16; + w0_t[1] = uint_to_hex_lower8 ((a >> 16) & 255) << 0 + | uint_to_hex_lower8 ((a >> 24) & 255) << 16; + w0_t[2] = uint_to_hex_lower8 ((b >> 0) & 255) << 0 + | uint_to_hex_lower8 ((b >> 8) & 255) << 16; + w0_t[3] = uint_to_hex_lower8 ((b >> 16) & 255) << 0 + | uint_to_hex_lower8 ((b >> 24) & 255) << 16; + w1_t[0] = uint_to_hex_lower8 ((c >> 0) & 255) << 0 + | uint_to_hex_lower8 ((c >> 8) & 255) << 16; + w1_t[1] = uint_to_hex_lower8 ((c >> 16) & 255) << 0 + | uint_to_hex_lower8 ((c >> 24) & 255) << 16; + w1_t[2] = uint_to_hex_lower8 ((d >> 0) & 255) << 0 + | uint_to_hex_lower8 ((d >> 8) & 255) << 16; + w1_t[3] = uint_to_hex_lower8 ((d >> 16) & 255) << 0 + | uint_to_hex_lower8 ((d >> 24) & 255) << 16; + + w2_t[0] = 0x00000080; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = 0; + + /** + * prepend salt + */ + + switch_buffer_by_offset (w0_t, w1_t, w2_t, w3_t, salt_len); + + w3_t[2] = pw_salt_len * 8; + + w0_t[0] |= salt_buf0[0]; + w0_t[1] |= salt_buf0[1]; + w0_t[2] |= salt_buf0[2]; + w0_t[3] |= salt_buf0[3]; + w1_t[0] |= salt_buf1[0]; + w1_t[1] |= salt_buf1[1]; + w1_t[2] |= salt_buf1[2]; + w1_t[3] |= salt_buf1[3]; + w2_t[0] |= salt_buf2[0]; + w2_t[1] |= salt_buf2[1]; + w2_t[2] |= salt_buf2[2]; + w2_t[3] |= salt_buf2[3]; + w3_t[0] |= salt_buf3[0]; + w3_t[1] |= salt_buf3[1]; + w3_t[2] |= salt_buf3[2]; + w3_t[3] |= salt_buf3[3]; + + /** + * md5 + */ + + a = MD5M_A; + b = MD5M_B; + c = MD5M_C; + d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0_t[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0_t[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0_t[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1_t[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1_t[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1_t[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2_t[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2_t[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2_t[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3_t[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3_t[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3_t[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0_t[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1_t[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2_t[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1_t[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1_t[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2_t[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3_t[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0_t[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2_t[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3_t[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0_t[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1_t[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3_t[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H , a, b, c, d, w1_t[1], MD5C20, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w2_t[0], MD5C21, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w2_t[3], MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w3_t[2], MD5C23, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w0_t[1], MD5C24, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w1_t[0], MD5C25, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w1_t[3], MD5C26, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w2_t[2], MD5C27, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w3_t[1], MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w0_t[0], MD5C29, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w0_t[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w1_t[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w2_t[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w3_t[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w3_t[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w0_t[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1_t[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3_t[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3_t[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0_t[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0_t[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2_t[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1_t[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3_t[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1_t[0], MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w2_t[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0_t[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2_t[1], MD5C3f, MD5S33); + + const u32x r0 = a; + const u32x r1 = d; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_M + } +} + +__device__ static void m03710s (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], const u32 pw_len, const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset) +{ + /** + * modifier + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + const u32 lid = threadIdx.x; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[ 1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[ 2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[ 3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[ 4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[ 5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[ 6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[ 7]; + + u32 salt_buf2[4]; + + salt_buf2[0] = 0; + salt_buf2[1] = 0; + salt_buf2[2] = 0; + salt_buf2[3] = 0; + + u32 salt_buf3[4]; + + salt_buf3[0] = 0; + salt_buf3[1] = 0; + salt_buf3[2] = 0; + salt_buf3[3] = 0; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + const u32 pw_salt_len = 32 + salt_len; + + /** + * loop + */ + + u32x w0l = w0[0]; + + for (u32 il_pos = 0; il_pos < bfs_cnt; il_pos++) + { + const u32 w0r = c_bfs[il_pos].i; + + w0[0] = w0l | w0r; + + u32x a = MD5M_A; + u32x b = MD5M_B; + u32x c = MD5M_C; + u32x d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H , a, b, c, d, w1[1], MD5C20, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w2[0], MD5C21, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w2[3], MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w3[2], MD5C23, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w0[1], MD5C24, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w1[0], MD5C25, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w1[3], MD5C26, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w2[2], MD5C27, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w3[1], MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w0[0], MD5C29, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w0[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w1[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w2[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w3[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w3[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w0[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1[0], MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w2[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2[1], MD5C3f, MD5S33); + + a += MD5M_A; + b += MD5M_B; + c += MD5M_C; + d += MD5M_D; + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + w0_t[0] = uint_to_hex_lower8 ((a >> 0) & 255) << 0 + | uint_to_hex_lower8 ((a >> 8) & 255) << 16; + w0_t[1] = uint_to_hex_lower8 ((a >> 16) & 255) << 0 + | uint_to_hex_lower8 ((a >> 24) & 255) << 16; + w0_t[2] = uint_to_hex_lower8 ((b >> 0) & 255) << 0 + | uint_to_hex_lower8 ((b >> 8) & 255) << 16; + w0_t[3] = uint_to_hex_lower8 ((b >> 16) & 255) << 0 + | uint_to_hex_lower8 ((b >> 24) & 255) << 16; + w1_t[0] = uint_to_hex_lower8 ((c >> 0) & 255) << 0 + | uint_to_hex_lower8 ((c >> 8) & 255) << 16; + w1_t[1] = uint_to_hex_lower8 ((c >> 16) & 255) << 0 + | uint_to_hex_lower8 ((c >> 24) & 255) << 16; + w1_t[2] = uint_to_hex_lower8 ((d >> 0) & 255) << 0 + | uint_to_hex_lower8 ((d >> 8) & 255) << 16; + w1_t[3] = uint_to_hex_lower8 ((d >> 16) & 255) << 0 + | uint_to_hex_lower8 ((d >> 24) & 255) << 16; + + w2_t[0] = 0x00000080; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = 0; + + /** + * prepend salt + */ + + switch_buffer_by_offset (w0_t, w1_t, w2_t, w3_t, salt_len); + + w3_t[2] = pw_salt_len * 8; + + w0_t[0] |= salt_buf0[0]; + w0_t[1] |= salt_buf0[1]; + w0_t[2] |= salt_buf0[2]; + w0_t[3] |= salt_buf0[3]; + w1_t[0] |= salt_buf1[0]; + w1_t[1] |= salt_buf1[1]; + w1_t[2] |= salt_buf1[2]; + w1_t[3] |= salt_buf1[3]; + w2_t[0] |= salt_buf2[0]; + w2_t[1] |= salt_buf2[1]; + w2_t[2] |= salt_buf2[2]; + w2_t[3] |= salt_buf2[3]; + w3_t[0] |= salt_buf3[0]; + w3_t[1] |= salt_buf3[1]; + w3_t[2] |= salt_buf3[2]; + w3_t[3] |= salt_buf3[3]; + + /** + * md5 + */ + + a = MD5M_A; + b = MD5M_B; + c = MD5M_C; + d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0_t[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0_t[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0_t[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1_t[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1_t[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1_t[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2_t[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2_t[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2_t[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3_t[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3_t[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3_t[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0_t[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1_t[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2_t[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1_t[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1_t[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2_t[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3_t[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0_t[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2_t[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3_t[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0_t[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1_t[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3_t[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H , a, b, c, d, w1_t[1], MD5C20, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w2_t[0], MD5C21, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w2_t[3], MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w3_t[2], MD5C23, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w0_t[1], MD5C24, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w1_t[0], MD5C25, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w1_t[3], MD5C26, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w2_t[2], MD5C27, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w3_t[1], MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w0_t[0], MD5C29, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w0_t[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w1_t[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w2_t[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w3_t[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w3_t[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w0_t[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1_t[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3_t[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3_t[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0_t[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0_t[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2_t[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1_t[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3_t[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1_t[0], MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w2_t[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0_t[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2_t[1], MD5C3f, MD5S33); + + const u32x r0 = a; + const u32x r1 = d; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_S + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m03710_m04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = pws[gid].i[14]; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * bin2asc table + */ + + l_bin2asc[lid] = c_bin2asc[(lid >> 0) & 15] << 8 + | c_bin2asc[(lid >> 4) & 15] << 0; + + __syncthreads (); + + if (gid >= gid_max) return; + + /** + * main + */ + + m03710m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m03710_m08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = pws[gid].i[14]; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * bin2asc table + */ + + l_bin2asc[lid] = c_bin2asc[(lid >> 0) & 15] << 8 + | c_bin2asc[(lid >> 4) & 15] << 0; + + __syncthreads (); + + if (gid >= gid_max) return; + + /** + * main + */ + + m03710m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m03710_m16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = pws[gid].i[ 8]; + w2[1] = pws[gid].i[ 9]; + w2[2] = pws[gid].i[10]; + w2[3] = pws[gid].i[11]; + + u32x w3[4]; + + w3[0] = pws[gid].i[12]; + w3[1] = pws[gid].i[13]; + w3[2] = pws[gid].i[14]; + w3[3] = pws[gid].i[15]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * bin2asc table + */ + + l_bin2asc[lid] = c_bin2asc[(lid >> 0) & 15] << 8 + | c_bin2asc[(lid >> 4) & 15] << 0; + + __syncthreads (); + + if (gid >= gid_max) return; + + /** + * main + */ + + m03710m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m03710_s04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = pws[gid].i[14]; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * bin2asc table + */ + + l_bin2asc[lid] = c_bin2asc[(lid >> 0) & 15] << 8 + | c_bin2asc[(lid >> 4) & 15] << 0; + + __syncthreads (); + + if (gid >= gid_max) return; + + /** + * main + */ + + m03710s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m03710_s08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = pws[gid].i[14]; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * bin2asc table + */ + + l_bin2asc[lid] = c_bin2asc[(lid >> 0) & 15] << 8 + | c_bin2asc[(lid >> 4) & 15] << 0; + + __syncthreads (); + + if (gid >= gid_max) return; + + /** + * main + */ + + m03710s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m03710_s16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = pws[gid].i[ 8]; + w2[1] = pws[gid].i[ 9]; + w2[2] = pws[gid].i[10]; + w2[3] = pws[gid].i[11]; + + u32x w3[4]; + + w3[0] = pws[gid].i[12]; + w3[1] = pws[gid].i[13]; + w3[2] = pws[gid].i[14]; + w3[3] = pws[gid].i[15]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * bin2asc table + */ + + l_bin2asc[lid] = c_bin2asc[(lid >> 0) & 15] << 8 + | c_bin2asc[(lid >> 4) & 15] << 0; + + __syncthreads (); + + if (gid >= gid_max) return; + + /** + * main + */ + + m03710s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} diff --git a/nv/m03800_a0.cu b/nv/m03800_a0.cu new file mode 100644 index 0000000000..c2f7758145 --- /dev/null +++ b/nv/m03800_a0.cu @@ -0,0 +1,668 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _MD5_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW2 +#define VECT_SIZE1 +#endif + +#define DGST_R0 0 +#define DGST_R1 3 +#define DGST_R2 2 +#define DGST_R3 1 + +#include "include/kernel_functions.c" +#include "types_nv.c" +#include "common_nv.c" +#include "include/rp_gpu.h" +#include "rp_nv.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +__device__ __constant__ gpu_rule_t c_rules[1024]; + +extern "C" __global__ void __launch_bounds__ (256, 1) m03800_m04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + u32x pw_buf1[4]; + + pw_buf1[0] = pws[gid].i[ 4]; + pw_buf1[1] = pws[gid].i[ 5]; + pw_buf1[2] = pws[gid].i[ 6]; + pw_buf1[3] = pws[gid].i[ 7]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[ 1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[ 2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[ 3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[ 4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[ 5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[ 6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[ 7]; + + u32 salt_buf2[4]; + + salt_buf2[0] = 0; + salt_buf2[1] = 0; + salt_buf2[2] = 0; + salt_buf2[3] = 0; + + u32 salt_buf3[4]; + + salt_buf3[0] = 0; + salt_buf3[1] = 0; + salt_buf3[2] = 0; + salt_buf3[3] = 0; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + + w0[0] = pw_buf0[0]; + w0[1] = pw_buf0[1]; + w0[2] = pw_buf0[2]; + w0[3] = pw_buf0[3]; + + u32x w1[4]; + + w1[0] = pw_buf1[0]; + w1[1] = pw_buf1[1]; + w1[2] = pw_buf1[2]; + w1[3] = pw_buf1[3]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 out_len = apply_rules (c_rules[il_pos].cmds, w0, w1, pw_len); + + u32x w0_t[4]; + + w0_t[0] = w0[0]; + w0_t[1] = w0[1]; + w0_t[2] = w0[2]; + w0_t[3] = w0[3]; + + u32x w1_t[4]; + + w1_t[0] = w1[0]; + w1_t[1] = w1[1]; + w1_t[2] = w1[2]; + w1_t[3] = w1[3]; + + u32x w2_t[4]; + + w2_t[0] = w2[0]; + w2_t[1] = w2[1]; + w2_t[2] = w2[2]; + w2_t[3] = w2[3]; + + u32x w3_t[4]; + + w3_t[0] = w3[0]; + w3_t[1] = w3[1]; + w3_t[2] = w3[2]; + w3_t[3] = w3[3]; + + + /** + * prepend salt + */ + + switch_buffer_by_offset (w0_t, w1_t, w2_t, w3_t, salt_len); + + w0_t[0] |= salt_buf0[0]; + w0_t[1] |= salt_buf0[1]; + w0_t[2] |= salt_buf0[2]; + w0_t[3] |= salt_buf0[3]; + w1_t[0] |= salt_buf1[0]; + w1_t[1] |= salt_buf1[1]; + w1_t[2] |= salt_buf1[2]; + w1_t[3] |= salt_buf1[3]; + w2_t[0] |= salt_buf2[0]; + w2_t[1] |= salt_buf2[1]; + w2_t[2] |= salt_buf2[2]; + w2_t[3] |= salt_buf2[3]; + w3_t[0] |= salt_buf3[0]; + w3_t[1] |= salt_buf3[1]; + w3_t[2] |= salt_buf3[2]; + w3_t[3] |= salt_buf3[3]; + + /** + * append salt + */ + + u32 s0[4]; + + s0[0] = salt_buf0[0]; + s0[1] = salt_buf0[1]; + s0[2] = salt_buf0[2]; + s0[3] = salt_buf0[3]; + + u32 s1[4]; + + s1[0] = salt_buf1[0]; + s1[1] = salt_buf1[1]; + s1[2] = salt_buf1[2]; + s1[3] = salt_buf1[3]; + + u32 s2[4]; + + s2[0] = 0; + s2[1] = 0; + s2[2] = 0; + s2[3] = 0; + + u32 s3[4]; + + s3[0] = 0; + s3[1] = 0; + s3[2] = 0; + s3[3] = 0; + + switch_buffer_by_offset (s0, s1, s2, s3, salt_len + out_len); + + w0_t[0] |= s0[0]; + w0_t[1] |= s0[1]; + w0_t[2] |= s0[2]; + w0_t[3] |= s0[3]; + w1_t[0] |= s1[0]; + w1_t[1] |= s1[1]; + w1_t[2] |= s1[2]; + w1_t[3] |= s1[3]; + w2_t[0] |= s2[0]; + w2_t[1] |= s2[1]; + w2_t[2] |= s2[2]; + w2_t[3] |= s2[3]; + w3_t[0] |= s3[0]; + w3_t[1] |= s3[1]; + w3_t[2] |= s3[2]; + w3_t[3] |= s3[3]; + + const u32 pw_salt_len = salt_len + out_len + salt_len; + + append_0x80_4 (w0_t, w1_t, w2_t, w3_t, pw_salt_len); + + w3_t[2] = pw_salt_len * 8; + + /** + * md5 + */ + + u32x a = MD5M_A; + u32x b = MD5M_B; + u32x c = MD5M_C; + u32x d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0_t[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0_t[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0_t[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1_t[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1_t[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1_t[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2_t[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2_t[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2_t[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3_t[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3_t[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3_t[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0_t[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1_t[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2_t[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1_t[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1_t[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2_t[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3_t[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0_t[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2_t[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3_t[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0_t[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1_t[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3_t[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H , a, b, c, d, w1_t[1], MD5C20, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w2_t[0], MD5C21, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w2_t[3], MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w3_t[2], MD5C23, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w0_t[1], MD5C24, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w1_t[0], MD5C25, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w1_t[3], MD5C26, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w2_t[2], MD5C27, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w3_t[1], MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w0_t[0], MD5C29, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w0_t[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w1_t[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w2_t[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w3_t[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w3_t[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w0_t[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1_t[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3_t[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3_t[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0_t[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0_t[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2_t[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1_t[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3_t[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1_t[0], MD5C3c, MD5S30); + + MD5_STEP (MD5_I , d, a, b, c, w2_t[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0_t[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2_t[1], MD5C3f, MD5S33); + + const u32x r0 = a; + const u32x r1 = d; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_M + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m03800_m08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m03800_m16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m03800_s04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + u32x pw_buf1[4]; + + pw_buf1[0] = pws[gid].i[ 4]; + pw_buf1[1] = pws[gid].i[ 5]; + pw_buf1[2] = pws[gid].i[ 6]; + pw_buf1[3] = pws[gid].i[ 7]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[ 1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[ 2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[ 3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[ 4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[ 5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[ 6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[ 7]; + + u32 salt_buf2[4]; + + salt_buf2[0] = 0; + salt_buf2[1] = 0; + salt_buf2[2] = 0; + salt_buf2[3] = 0; + + u32 salt_buf3[4]; + + salt_buf3[0] = 0; + salt_buf3[1] = 0; + salt_buf3[2] = 0; + salt_buf3[3] = 0; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + + w0[0] = pw_buf0[0]; + w0[1] = pw_buf0[1]; + w0[2] = pw_buf0[2]; + w0[3] = pw_buf0[3]; + + u32x w1[4]; + + w1[0] = pw_buf1[0]; + w1[1] = pw_buf1[1]; + w1[2] = pw_buf1[2]; + w1[3] = pw_buf1[3]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 out_len = apply_rules (c_rules[il_pos].cmds, w0, w1, pw_len); + + u32x w0_t[4]; + + w0_t[0] = w0[0]; + w0_t[1] = w0[1]; + w0_t[2] = w0[2]; + w0_t[3] = w0[3]; + + u32x w1_t[4]; + + w1_t[0] = w1[0]; + w1_t[1] = w1[1]; + w1_t[2] = w1[2]; + w1_t[3] = w1[3]; + + u32x w2_t[4]; + + w2_t[0] = w2[0]; + w2_t[1] = w2[1]; + w2_t[2] = w2[2]; + w2_t[3] = w2[3]; + + u32x w3_t[4]; + + w3_t[0] = w3[0]; + w3_t[1] = w3[1]; + w3_t[2] = w3[2]; + w3_t[3] = w3[3]; + + + /** + * prepend salt + */ + + switch_buffer_by_offset (w0_t, w1_t, w2_t, w3_t, salt_len); + + w0_t[0] |= salt_buf0[0]; + w0_t[1] |= salt_buf0[1]; + w0_t[2] |= salt_buf0[2]; + w0_t[3] |= salt_buf0[3]; + w1_t[0] |= salt_buf1[0]; + w1_t[1] |= salt_buf1[1]; + w1_t[2] |= salt_buf1[2]; + w1_t[3] |= salt_buf1[3]; + w2_t[0] |= salt_buf2[0]; + w2_t[1] |= salt_buf2[1]; + w2_t[2] |= salt_buf2[2]; + w2_t[3] |= salt_buf2[3]; + w3_t[0] |= salt_buf3[0]; + w3_t[1] |= salt_buf3[1]; + w3_t[2] |= salt_buf3[2]; + w3_t[3] |= salt_buf3[3]; + + /** + * append salt + */ + + u32 s0[4]; + + s0[0] = salt_buf0[0]; + s0[1] = salt_buf0[1]; + s0[2] = salt_buf0[2]; + s0[3] = salt_buf0[3]; + + u32 s1[4]; + + s1[0] = salt_buf1[0]; + s1[1] = salt_buf1[1]; + s1[2] = salt_buf1[2]; + s1[3] = salt_buf1[3]; + + u32 s2[4]; + + s2[0] = 0; + s2[1] = 0; + s2[2] = 0; + s2[3] = 0; + + u32 s3[4]; + + s3[0] = 0; + s3[1] = 0; + s3[2] = 0; + s3[3] = 0; + + switch_buffer_by_offset (s0, s1, s2, s3, salt_len + out_len); + + w0_t[0] |= s0[0]; + w0_t[1] |= s0[1]; + w0_t[2] |= s0[2]; + w0_t[3] |= s0[3]; + w1_t[0] |= s1[0]; + w1_t[1] |= s1[1]; + w1_t[2] |= s1[2]; + w1_t[3] |= s1[3]; + w2_t[0] |= s2[0]; + w2_t[1] |= s2[1]; + w2_t[2] |= s2[2]; + w2_t[3] |= s2[3]; + w3_t[0] |= s3[0]; + w3_t[1] |= s3[1]; + w3_t[2] |= s3[2]; + w3_t[3] |= s3[3]; + + const u32 pw_salt_len = salt_len + out_len + salt_len; + + append_0x80_4 (w0_t, w1_t, w2_t, w3_t, pw_salt_len); + + w3_t[2] = pw_salt_len * 8; + + /** + * md5 + */ + + u32x a = MD5M_A; + u32x b = MD5M_B; + u32x c = MD5M_C; + u32x d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0_t[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0_t[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0_t[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1_t[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1_t[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1_t[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2_t[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2_t[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2_t[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3_t[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3_t[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3_t[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0_t[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1_t[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2_t[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1_t[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1_t[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2_t[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3_t[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0_t[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2_t[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3_t[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0_t[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1_t[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3_t[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H , a, b, c, d, w1_t[1], MD5C20, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w2_t[0], MD5C21, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w2_t[3], MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w3_t[2], MD5C23, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w0_t[1], MD5C24, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w1_t[0], MD5C25, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w1_t[3], MD5C26, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w2_t[2], MD5C27, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w3_t[1], MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w0_t[0], MD5C29, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w0_t[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w1_t[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w2_t[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w3_t[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w3_t[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w0_t[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1_t[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3_t[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3_t[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0_t[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0_t[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2_t[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1_t[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3_t[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1_t[0], MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w2_t[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0_t[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2_t[1], MD5C3f, MD5S33); + + const u32x r0 = a; + const u32x r1 = d; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_S + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m03800_s08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m03800_s16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/nv/m03800_a1.cu b/nv/m03800_a1.cu new file mode 100644 index 0000000000..28fe339791 --- /dev/null +++ b/nv/m03800_a1.cu @@ -0,0 +1,772 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _MD5_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW2 +#define VECT_SIZE4 +#endif + +#define DGST_R0 0 +#define DGST_R1 3 +#define DGST_R2 2 +#define DGST_R3 1 + +#include "include/kernel_functions.c" +#include "types_nv.c" +#include "common_nv.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +__device__ __constant__ comb_t c_combs[1024]; + +extern "C" __global__ void __launch_bounds__ (256, 1) m03800_m04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, c_combs[0].pw_len); + } + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[ 1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[ 2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[ 3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[ 4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[ 5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[ 6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[ 7]; + + u32 salt_buf2[4]; + + salt_buf2[0] = 0; + salt_buf2[1] = 0; + salt_buf2[2] = 0; + salt_buf2[3] = 0; + + u32 salt_buf3[4]; + + salt_buf3[0] = 0; + salt_buf3[1] = 0; + salt_buf3[2] = 0; + salt_buf3[3] = 0; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = c_combs[il_pos].pw_len; + + const u32 pw_len = pw_l_len + pw_r_len; + + u32 wordr0[4]; + + wordr0[0] = c_combs[il_pos].i[0]; + wordr0[1] = c_combs[il_pos].i[1]; + wordr0[2] = c_combs[il_pos].i[2]; + wordr0[3] = c_combs[il_pos].i[3]; + + u32 wordr1[4]; + + wordr1[0] = c_combs[il_pos].i[4]; + wordr1[1] = c_combs[il_pos].i[5]; + wordr1[2] = c_combs[il_pos].i[6]; + wordr1[3] = c_combs[il_pos].i[7]; + + u32 wordr2[4]; + + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + + u32 wordr3[4]; + + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + u32x w0[4]; + + w0[0] = wordl0[0] | wordr0[0]; + w0[1] = wordl0[1] | wordr0[1]; + w0[2] = wordl0[2] | wordr0[2]; + w0[3] = wordl0[3] | wordr0[3]; + + u32x w1[4]; + + w1[0] = wordl1[0] | wordr1[0]; + w1[1] = wordl1[1] | wordr1[1]; + w1[2] = wordl1[2] | wordr1[2]; + w1[3] = wordl1[3] | wordr1[3]; + + u32x w2[4]; + + w2[0] = wordl2[0] | wordr2[0]; + w2[1] = wordl2[1] | wordr2[1]; + w2[2] = wordl2[2] | wordr2[2]; + w2[3] = wordl2[3] | wordr2[3]; + + u32x w3[4]; + + w3[0] = wordl3[0] | wordr3[0]; + w3[1] = wordl3[1] | wordr3[1]; + w3[2] = 0; + w3[3] = 0; + + /** + * prepend salt + */ + + u32x w0_t[4]; + + w0_t[0] = w0[0]; + w0_t[1] = w0[1]; + w0_t[2] = w0[2]; + w0_t[3] = w0[3]; + + u32x w1_t[4]; + + w1_t[0] = w1[0]; + w1_t[1] = w1[1]; + w1_t[2] = w1[2]; + w1_t[3] = w1[3]; + + u32x w2_t[4]; + + w2_t[0] = w2[0]; + w2_t[1] = w2[1]; + w2_t[2] = w2[2]; + w2_t[3] = w2[3]; + + u32x w3_t[4]; + + w3_t[0] = w3[0]; + w3_t[1] = w3[1]; + w3_t[2] = w3[2]; + w3_t[3] = w3[3]; + + switch_buffer_by_offset (w0_t, w1_t, w2_t, w3_t, salt_len); + + w0_t[0] |= salt_buf0[0]; + w0_t[1] |= salt_buf0[1]; + w0_t[2] |= salt_buf0[2]; + w0_t[3] |= salt_buf0[3]; + w1_t[0] |= salt_buf1[0]; + w1_t[1] |= salt_buf1[1]; + w1_t[2] |= salt_buf1[2]; + w1_t[3] |= salt_buf1[3]; + w2_t[0] |= salt_buf2[0]; + w2_t[1] |= salt_buf2[1]; + w2_t[2] |= salt_buf2[2]; + w2_t[3] |= salt_buf2[3]; + w3_t[0] |= salt_buf3[0]; + w3_t[1] |= salt_buf3[1]; + w3_t[2] |= salt_buf3[2]; + w3_t[3] |= salt_buf3[3]; + + /** + * append salt + */ + + u32 s0[4]; + + s0[0] = salt_buf0[0]; + s0[1] = salt_buf0[1]; + s0[2] = salt_buf0[2]; + s0[3] = salt_buf0[3]; + + u32 s1[4]; + + s1[0] = salt_buf1[0]; + s1[1] = salt_buf1[1]; + s1[2] = salt_buf1[2]; + s1[3] = salt_buf1[3]; + + u32 s2[4]; + + s2[0] = 0; + s2[1] = 0; + s2[2] = 0; + s2[3] = 0; + + u32 s3[4]; + + s3[0] = 0; + s3[1] = 0; + s3[2] = 0; + s3[3] = 0; + + switch_buffer_by_offset (s0, s1, s2, s3, salt_len + pw_len); + + w0_t[0] |= s0[0]; + w0_t[1] |= s0[1]; + w0_t[2] |= s0[2]; + w0_t[3] |= s0[3]; + w1_t[0] |= s1[0]; + w1_t[1] |= s1[1]; + w1_t[2] |= s1[2]; + w1_t[3] |= s1[3]; + w2_t[0] |= s2[0]; + w2_t[1] |= s2[1]; + w2_t[2] |= s2[2]; + w2_t[3] |= s2[3]; + w3_t[0] |= s3[0]; + w3_t[1] |= s3[1]; + w3_t[2] |= s3[2]; + w3_t[3] |= s3[3]; + + const u32 pw_salt_len = salt_len + pw_len + salt_len; + + append_0x80_4 (w0_t, w1_t, w2_t, w3_t, pw_salt_len); + + w3_t[2] = pw_salt_len * 8; + + /** + * md5 + */ + + u32x a = MD5M_A; + u32x b = MD5M_B; + u32x c = MD5M_C; + u32x d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0_t[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0_t[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0_t[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1_t[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1_t[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1_t[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2_t[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2_t[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2_t[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3_t[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3_t[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3_t[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0_t[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1_t[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2_t[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1_t[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1_t[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2_t[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3_t[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0_t[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2_t[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3_t[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0_t[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1_t[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3_t[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H , a, b, c, d, w1_t[1], MD5C20, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w2_t[0], MD5C21, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w2_t[3], MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w3_t[2], MD5C23, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w0_t[1], MD5C24, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w1_t[0], MD5C25, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w1_t[3], MD5C26, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w2_t[2], MD5C27, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w3_t[1], MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w0_t[0], MD5C29, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w0_t[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w1_t[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w2_t[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w3_t[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w3_t[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w0_t[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1_t[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3_t[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3_t[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0_t[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0_t[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2_t[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1_t[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3_t[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1_t[0], MD5C3c, MD5S30); + + MD5_STEP (MD5_I , d, a, b, c, w2_t[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0_t[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2_t[1], MD5C3f, MD5S33); + + const u32x r0 = a; + const u32x r1 = d; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_M + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m03800_m08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m03800_m16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m03800_s04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, c_combs[0].pw_len); + } + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[ 1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[ 2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[ 3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[ 4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[ 5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[ 6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[ 7]; + + u32 salt_buf2[4]; + + salt_buf2[0] = 0; + salt_buf2[1] = 0; + salt_buf2[2] = 0; + salt_buf2[3] = 0; + + u32 salt_buf3[4]; + + salt_buf3[0] = 0; + salt_buf3[1] = 0; + salt_buf3[2] = 0; + salt_buf3[3] = 0; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = c_combs[il_pos].pw_len; + + const u32 pw_len = pw_l_len + pw_r_len; + + u32 wordr0[4]; + + wordr0[0] = c_combs[il_pos].i[0]; + wordr0[1] = c_combs[il_pos].i[1]; + wordr0[2] = c_combs[il_pos].i[2]; + wordr0[3] = c_combs[il_pos].i[3]; + + u32 wordr1[4]; + + wordr1[0] = c_combs[il_pos].i[4]; + wordr1[1] = c_combs[il_pos].i[5]; + wordr1[2] = c_combs[il_pos].i[6]; + wordr1[3] = c_combs[il_pos].i[7]; + + u32 wordr2[4]; + + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + + u32 wordr3[4]; + + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + u32x w0[4]; + + w0[0] = wordl0[0] | wordr0[0]; + w0[1] = wordl0[1] | wordr0[1]; + w0[2] = wordl0[2] | wordr0[2]; + w0[3] = wordl0[3] | wordr0[3]; + + u32x w1[4]; + + w1[0] = wordl1[0] | wordr1[0]; + w1[1] = wordl1[1] | wordr1[1]; + w1[2] = wordl1[2] | wordr1[2]; + w1[3] = wordl1[3] | wordr1[3]; + + u32x w2[4]; + + w2[0] = wordl2[0] | wordr2[0]; + w2[1] = wordl2[1] | wordr2[1]; + w2[2] = wordl2[2] | wordr2[2]; + w2[3] = wordl2[3] | wordr2[3]; + + u32x w3[4]; + + w3[0] = wordl3[0] | wordr3[0]; + w3[1] = wordl3[1] | wordr3[1]; + w3[2] = 0; + w3[3] = 0; + + /** + * prepend salt + */ + + u32x w0_t[4]; + + w0_t[0] = w0[0]; + w0_t[1] = w0[1]; + w0_t[2] = w0[2]; + w0_t[3] = w0[3]; + + u32x w1_t[4]; + + w1_t[0] = w1[0]; + w1_t[1] = w1[1]; + w1_t[2] = w1[2]; + w1_t[3] = w1[3]; + + u32x w2_t[4]; + + w2_t[0] = w2[0]; + w2_t[1] = w2[1]; + w2_t[2] = w2[2]; + w2_t[3] = w2[3]; + + u32x w3_t[4]; + + w3_t[0] = w3[0]; + w3_t[1] = w3[1]; + w3_t[2] = w3[2]; + w3_t[3] = w3[3]; + + switch_buffer_by_offset (w0_t, w1_t, w2_t, w3_t, salt_len); + + w0_t[0] |= salt_buf0[0]; + w0_t[1] |= salt_buf0[1]; + w0_t[2] |= salt_buf0[2]; + w0_t[3] |= salt_buf0[3]; + w1_t[0] |= salt_buf1[0]; + w1_t[1] |= salt_buf1[1]; + w1_t[2] |= salt_buf1[2]; + w1_t[3] |= salt_buf1[3]; + w2_t[0] |= salt_buf2[0]; + w2_t[1] |= salt_buf2[1]; + w2_t[2] |= salt_buf2[2]; + w2_t[3] |= salt_buf2[3]; + w3_t[0] |= salt_buf3[0]; + w3_t[1] |= salt_buf3[1]; + w3_t[2] |= salt_buf3[2]; + w3_t[3] |= salt_buf3[3]; + + /** + * append salt + */ + + u32 s0[4]; + + s0[0] = salt_buf0[0]; + s0[1] = salt_buf0[1]; + s0[2] = salt_buf0[2]; + s0[3] = salt_buf0[3]; + + u32 s1[4]; + + s1[0] = salt_buf1[0]; + s1[1] = salt_buf1[1]; + s1[2] = salt_buf1[2]; + s1[3] = salt_buf1[3]; + + u32 s2[4]; + + s2[0] = 0; + s2[1] = 0; + s2[2] = 0; + s2[3] = 0; + + u32 s3[4]; + + s3[0] = 0; + s3[1] = 0; + s3[2] = 0; + s3[3] = 0; + + switch_buffer_by_offset (s0, s1, s2, s3, salt_len + pw_len); + + w0_t[0] |= s0[0]; + w0_t[1] |= s0[1]; + w0_t[2] |= s0[2]; + w0_t[3] |= s0[3]; + w1_t[0] |= s1[0]; + w1_t[1] |= s1[1]; + w1_t[2] |= s1[2]; + w1_t[3] |= s1[3]; + w2_t[0] |= s2[0]; + w2_t[1] |= s2[1]; + w2_t[2] |= s2[2]; + w2_t[3] |= s2[3]; + w3_t[0] |= s3[0]; + w3_t[1] |= s3[1]; + w3_t[2] |= s3[2]; + w3_t[3] |= s3[3]; + + const u32 pw_salt_len = salt_len + pw_len + salt_len; + + append_0x80_4 (w0_t, w1_t, w2_t, w3_t, pw_salt_len); + + w3_t[2] = pw_salt_len * 8; + + /** + * md5 + */ + + u32x a = MD5M_A; + u32x b = MD5M_B; + u32x c = MD5M_C; + u32x d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0_t[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0_t[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0_t[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1_t[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1_t[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1_t[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2_t[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2_t[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2_t[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3_t[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3_t[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3_t[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0_t[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1_t[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2_t[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1_t[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1_t[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2_t[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3_t[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0_t[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2_t[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3_t[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0_t[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1_t[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3_t[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H , a, b, c, d, w1_t[1], MD5C20, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w2_t[0], MD5C21, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w2_t[3], MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w3_t[2], MD5C23, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w0_t[1], MD5C24, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w1_t[0], MD5C25, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w1_t[3], MD5C26, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w2_t[2], MD5C27, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w3_t[1], MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w0_t[0], MD5C29, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w0_t[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w1_t[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w2_t[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w3_t[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w3_t[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w0_t[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1_t[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3_t[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3_t[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0_t[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0_t[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2_t[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1_t[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3_t[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1_t[0], MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w2_t[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0_t[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2_t[1], MD5C3f, MD5S33); + + const u32x r0 = a; + const u32x r1 = d; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_S + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m03800_s08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m03800_s16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/nv/m03800_a3.cu b/nv/m03800_a3.cu new file mode 100644 index 0000000000..dd6f336166 --- /dev/null +++ b/nv/m03800_a3.cu @@ -0,0 +1,842 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _MD5_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW2 +#define VECT_SIZE4 +#endif + +#define DGST_R0 0 +#define DGST_R1 3 +#define DGST_R2 2 +#define DGST_R3 1 + +#include "include/kernel_functions.c" +#include "types_nv.c" +#include "common_nv.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +__device__ __constant__ bf_t c_bfs[1024]; + +__device__ static void m03800m (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], const u32 pw_len, const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset) +{ + /** + * modifier + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + const u32 lid = threadIdx.x; + + /** + * digest + */ + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[ 1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[ 2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[ 3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[ 4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[ 5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[ 6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[ 7]; + + u32 salt_buf2[4]; + + salt_buf2[0] = 0; + salt_buf2[1] = 0; + salt_buf2[2] = 0; + salt_buf2[3] = 0; + + u32 salt_buf3[4]; + + salt_buf3[0] = 0; + salt_buf3[1] = 0; + salt_buf3[2] = 0; + salt_buf3[3] = 0; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + const u32 pw_salt_len = salt_len + pw_len + salt_len; + + /** + * loop + */ + + u32x w0l = w0[0]; + + for (u32 il_pos = 0; il_pos < bfs_cnt; il_pos++) + { + const u32 w0r = c_bfs[il_pos].i; + + w0[0] = w0l | w0r; + + u32x w0_t[4]; + + w0_t[0] = w0[0]; + w0_t[1] = w0[1]; + w0_t[2] = w0[2]; + w0_t[3] = w0[3]; + + u32x w1_t[4]; + + w1_t[0] = w1[0]; + w1_t[1] = w1[1]; + w1_t[2] = w1[2]; + w1_t[3] = w1[3]; + + u32x w2_t[4]; + + w2_t[0] = w2[0]; + w2_t[1] = w2[1]; + w2_t[2] = w2[2]; + w2_t[3] = w2[3]; + + u32x w3_t[4]; + + w3_t[0] = w3[0]; + w3_t[1] = w3[1]; + w3_t[2] = w3[2]; + w3_t[3] = w3[3]; + + + /** + * prepend salt + */ + + switch_buffer_by_offset (w0_t, w1_t, w2_t, w3_t, salt_len); + + w0_t[0] |= salt_buf0[0]; + w0_t[1] |= salt_buf0[1]; + w0_t[2] |= salt_buf0[2]; + w0_t[3] |= salt_buf0[3]; + w1_t[0] |= salt_buf1[0]; + w1_t[1] |= salt_buf1[1]; + w1_t[2] |= salt_buf1[2]; + w1_t[3] |= salt_buf1[3]; + w2_t[0] |= salt_buf2[0]; + w2_t[1] |= salt_buf2[1]; + w2_t[2] |= salt_buf2[2]; + w2_t[3] |= salt_buf2[3]; + w3_t[0] |= salt_buf3[0]; + w3_t[1] |= salt_buf3[1]; + w3_t[2] |= salt_buf3[2]; + w3_t[3] |= salt_buf3[3]; + + /** + * append salt + */ + + u32 s0[4]; + + s0[0] = salt_buf0[0]; + s0[1] = salt_buf0[1]; + s0[2] = salt_buf0[2]; + s0[3] = salt_buf0[3]; + + u32 s1[4]; + + s1[0] = salt_buf1[0]; + s1[1] = salt_buf1[1]; + s1[2] = salt_buf1[2]; + s1[3] = salt_buf1[3]; + + u32 s2[4]; + + s2[0] = 0; + s2[1] = 0; + s2[2] = 0; + s2[3] = 0; + + u32 s3[4]; + + s3[0] = 0; + s3[1] = 0; + s3[2] = 0; + s3[3] = 0; + + switch_buffer_by_offset (s0, s1, s2, s3, salt_len + pw_len); + + w0_t[0] |= s0[0]; + w0_t[1] |= s0[1]; + w0_t[2] |= s0[2]; + w0_t[3] |= s0[3]; + w1_t[0] |= s1[0]; + w1_t[1] |= s1[1]; + w1_t[2] |= s1[2]; + w1_t[3] |= s1[3]; + w2_t[0] |= s2[0]; + w2_t[1] |= s2[1]; + w2_t[2] |= s2[2]; + w2_t[3] |= s2[3]; + w3_t[0] |= s3[0]; + w3_t[1] |= s3[1]; + w3_t[2] |= s3[2]; + w3_t[3] |= s3[3]; + + append_0x80_4 (w0_t, w1_t, w2_t, w3_t, pw_salt_len); + + w3_t[2] = pw_salt_len * 8; + + /** + * md5 + */ + + u32x a = MD5M_A; + u32x b = MD5M_B; + u32x c = MD5M_C; + u32x d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0_t[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0_t[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0_t[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1_t[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1_t[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1_t[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2_t[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2_t[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2_t[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3_t[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3_t[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3_t[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0_t[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1_t[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2_t[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1_t[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1_t[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2_t[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3_t[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0_t[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2_t[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3_t[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0_t[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1_t[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3_t[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H , a, b, c, d, w1_t[1], MD5C20, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w2_t[0], MD5C21, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w2_t[3], MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w3_t[2], MD5C23, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w0_t[1], MD5C24, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w1_t[0], MD5C25, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w1_t[3], MD5C26, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w2_t[2], MD5C27, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w3_t[1], MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w0_t[0], MD5C29, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w0_t[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w1_t[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w2_t[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w3_t[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w3_t[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w0_t[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1_t[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3_t[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3_t[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0_t[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0_t[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2_t[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1_t[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3_t[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1_t[0], MD5C3c, MD5S30); + + MD5_STEP (MD5_I , d, a, b, c, w2_t[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0_t[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2_t[1], MD5C3f, MD5S33); + + const u32x r0 = a; + const u32x r1 = d; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_M + } +} + +__device__ static void m03800s (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], const u32 pw_len, const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset) +{ + /** + * modifier + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + const u32 lid = threadIdx.x; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[ 1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[ 2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[ 3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[ 4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[ 5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[ 6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[ 7]; + + u32 salt_buf2[4]; + + salt_buf2[0] = 0; + salt_buf2[1] = 0; + salt_buf2[2] = 0; + salt_buf2[3] = 0; + + u32 salt_buf3[4]; + + salt_buf3[0] = 0; + salt_buf3[1] = 0; + salt_buf3[2] = 0; + salt_buf3[3] = 0; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + const u32 pw_salt_len = salt_len + pw_len + salt_len; + + /** + * loop + */ + + u32x w0l = w0[0]; + + for (u32 il_pos = 0; il_pos < bfs_cnt; il_pos++) + { + const u32 w0r = c_bfs[il_pos].i; + + w0[0] = w0l | w0r; + + u32x w0_t[4]; + + w0_t[0] = w0[0]; + w0_t[1] = w0[1]; + w0_t[2] = w0[2]; + w0_t[3] = w0[3]; + + u32x w1_t[4]; + + w1_t[0] = w1[0]; + w1_t[1] = w1[1]; + w1_t[2] = w1[2]; + w1_t[3] = w1[3]; + + u32x w2_t[4]; + + w2_t[0] = w2[0]; + w2_t[1] = w2[1]; + w2_t[2] = w2[2]; + w2_t[3] = w2[3]; + + u32x w3_t[4]; + + w3_t[0] = w3[0]; + w3_t[1] = w3[1]; + w3_t[2] = w3[2]; + w3_t[3] = w3[3]; + + + /** + * prepend salt + */ + + switch_buffer_by_offset (w0_t, w1_t, w2_t, w3_t, salt_len); + + w0_t[0] |= salt_buf0[0]; + w0_t[1] |= salt_buf0[1]; + w0_t[2] |= salt_buf0[2]; + w0_t[3] |= salt_buf0[3]; + w1_t[0] |= salt_buf1[0]; + w1_t[1] |= salt_buf1[1]; + w1_t[2] |= salt_buf1[2]; + w1_t[3] |= salt_buf1[3]; + w2_t[0] |= salt_buf2[0]; + w2_t[1] |= salt_buf2[1]; + w2_t[2] |= salt_buf2[2]; + w2_t[3] |= salt_buf2[3]; + w3_t[0] |= salt_buf3[0]; + w3_t[1] |= salt_buf3[1]; + w3_t[2] |= salt_buf3[2]; + w3_t[3] |= salt_buf3[3]; + + /** + * append salt + */ + + u32 s0[4]; + + s0[0] = salt_buf0[0]; + s0[1] = salt_buf0[1]; + s0[2] = salt_buf0[2]; + s0[3] = salt_buf0[3]; + + u32 s1[4]; + + s1[0] = salt_buf1[0]; + s1[1] = salt_buf1[1]; + s1[2] = salt_buf1[2]; + s1[3] = salt_buf1[3]; + + u32 s2[4]; + + s2[0] = 0; + s2[1] = 0; + s2[2] = 0; + s2[3] = 0; + + u32 s3[4]; + + s3[0] = 0; + s3[1] = 0; + s3[2] = 0; + s3[3] = 0; + + switch_buffer_by_offset (s0, s1, s2, s3, salt_len + pw_len); + + w0_t[0] |= s0[0]; + w0_t[1] |= s0[1]; + w0_t[2] |= s0[2]; + w0_t[3] |= s0[3]; + w1_t[0] |= s1[0]; + w1_t[1] |= s1[1]; + w1_t[2] |= s1[2]; + w1_t[3] |= s1[3]; + w2_t[0] |= s2[0]; + w2_t[1] |= s2[1]; + w2_t[2] |= s2[2]; + w2_t[3] |= s2[3]; + w3_t[0] |= s3[0]; + w3_t[1] |= s3[1]; + w3_t[2] |= s3[2]; + w3_t[3] |= s3[3]; + + append_0x80_4 (w0_t, w1_t, w2_t, w3_t, pw_salt_len); + + w3_t[2] = pw_salt_len * 8; + + /** + * md5 + */ + + u32x a = MD5M_A; + u32x b = MD5M_B; + u32x c = MD5M_C; + u32x d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0_t[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0_t[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0_t[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1_t[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1_t[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1_t[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2_t[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2_t[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2_t[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3_t[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3_t[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3_t[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0_t[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1_t[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2_t[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1_t[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1_t[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2_t[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3_t[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0_t[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2_t[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3_t[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0_t[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1_t[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3_t[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H , a, b, c, d, w1_t[1], MD5C20, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w2_t[0], MD5C21, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w2_t[3], MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w3_t[2], MD5C23, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w0_t[1], MD5C24, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w1_t[0], MD5C25, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w1_t[3], MD5C26, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w2_t[2], MD5C27, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w3_t[1], MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w0_t[0], MD5C29, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w0_t[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w1_t[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w2_t[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w3_t[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w3_t[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w0_t[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1_t[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3_t[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3_t[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0_t[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0_t[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2_t[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1_t[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3_t[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1_t[0], MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w2_t[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0_t[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2_t[1], MD5C3f, MD5S33); + + const u32x r0 = a; + const u32x r1 = d; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_S + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m03800_m04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = pws[gid].i[14]; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m03800m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m03800_m08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = pws[gid].i[14]; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m03800m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m03800_m16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = pws[gid].i[ 8]; + w2[1] = pws[gid].i[ 9]; + w2[2] = pws[gid].i[10]; + w2[3] = pws[gid].i[11]; + + u32x w3[4]; + + w3[0] = pws[gid].i[12]; + w3[1] = pws[gid].i[13]; + w3[2] = pws[gid].i[14]; + w3[3] = pws[gid].i[15]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m03800m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m03800_s04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = pws[gid].i[14]; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m03800s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m03800_s08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = pws[gid].i[14]; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m03800s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m03800_s16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = pws[gid].i[ 8]; + w2[1] = pws[gid].i[ 9]; + w2[2] = pws[gid].i[10]; + w2[3] = pws[gid].i[11]; + + u32x w3[4]; + + w3[0] = pws[gid].i[12]; + w3[1] = pws[gid].i[13]; + w3[2] = pws[gid].i[14]; + w3[3] = pws[gid].i[15]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m03800s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} diff --git a/nv/m04310_a0.cu b/nv/m04310_a0.cu new file mode 100644 index 0000000000..6e27434fbc --- /dev/null +++ b/nv/m04310_a0.cu @@ -0,0 +1,657 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _MD5_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW2 +#define VECT_SIZE1 +#endif + +#define DGST_R0 0 +#define DGST_R1 3 +#define DGST_R2 2 +#define DGST_R3 1 + +#include "include/kernel_functions.c" +#include "types_nv.c" +#include "common_nv.c" +#include "include/rp_gpu.h" +#include "rp_nv.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +__device__ __constant__ gpu_rule_t c_rules[1024]; + +#ifdef VECT_SIZE1 +#define uint_to_hex_lower8(i) l_bin2asc[(i)] +#endif + +#ifdef VECT_SIZE2 +#define uint_to_hex_lower8(i) u32x (l_bin2asc[(i).x], l_bin2asc[(i).y]) +#endif + +#ifdef VECT_SIZE4 +#define uint_to_hex_lower8(i) u32x (l_bin2asc[(i).x], l_bin2asc[(i).y], l_bin2asc[(i).z], l_bin2asc[(i).w]) +#endif + +__device__ __constant__ char c_bin2asc[16] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' }; + +__device__ __shared__ short l_bin2asc[256]; + +extern "C" __global__ void __launch_bounds__ (256, 1) m04310_m04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + u32x pw_buf1[4]; + + pw_buf1[0] = pws[gid].i[ 4]; + pw_buf1[1] = pws[gid].i[ 5]; + pw_buf1[2] = pws[gid].i[ 6]; + pw_buf1[3] = pws[gid].i[ 7]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * salt + */ + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + u32 s[8]; + + s[0] = salt_bufs[salt_pos].salt_buf[0]; + s[1] = salt_bufs[salt_pos].salt_buf[1]; + s[2] = salt_bufs[salt_pos].salt_buf[2]; + s[3] = salt_bufs[salt_pos].salt_buf[3]; + s[4] = salt_bufs[salt_pos].salt_buf[4]; + s[5] = salt_bufs[salt_pos].salt_buf[5]; + s[6] = (32 + salt_len) * 8; + s[7] = 0; + + /** + * bin2asc table + */ + + l_bin2asc[lid] = c_bin2asc[(lid >> 0) & 15] << 8 + | c_bin2asc[(lid >> 4) & 15] << 0; + + __syncthreads (); + + if (gid >= gid_max) return; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + + w0[0] = pw_buf0[0]; + w0[1] = pw_buf0[1]; + w0[2] = pw_buf0[2]; + w0[3] = pw_buf0[3]; + + u32x w1[4]; + + w1[0] = pw_buf1[0]; + w1[1] = pw_buf1[1]; + w1[2] = pw_buf1[2]; + w1[3] = pw_buf1[3]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 out_len = apply_rules (c_rules[il_pos].cmds, w0, w1, pw_len); + + append_0x80_2 (w0, w1, out_len); + + w3[2] = out_len * 8; + + u32x a = MD5M_A; + u32x b = MD5M_B; + u32x c = MD5M_C; + u32x d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H , a, b, c, d, w1[1], MD5C20, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w2[0], MD5C21, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w2[3], MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w3[2], MD5C23, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w0[1], MD5C24, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w1[0], MD5C25, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w1[3], MD5C26, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w2[2], MD5C27, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w3[1], MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w0[0], MD5C29, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w0[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w1[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w2[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w3[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w3[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w0[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1[0], MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w2[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2[1], MD5C3f, MD5S33); + + a += MD5M_A; + b += MD5M_B; + c += MD5M_C; + d += MD5M_D; + + const u32x w0_t = uint_to_hex_lower8 ((a >> 0) & 255) << 0 + | uint_to_hex_lower8 ((a >> 8) & 255) << 16; + const u32x w1_t = uint_to_hex_lower8 ((a >> 16) & 255) << 0 + | uint_to_hex_lower8 ((a >> 24) & 255) << 16; + const u32x w2_t = uint_to_hex_lower8 ((b >> 0) & 255) << 0 + | uint_to_hex_lower8 ((b >> 8) & 255) << 16; + const u32x w3_t = uint_to_hex_lower8 ((b >> 16) & 255) << 0 + | uint_to_hex_lower8 ((b >> 24) & 255) << 16; + const u32x w4_t = uint_to_hex_lower8 ((c >> 0) & 255) << 0 + | uint_to_hex_lower8 ((c >> 8) & 255) << 16; + const u32x w5_t = uint_to_hex_lower8 ((c >> 16) & 255) << 0 + | uint_to_hex_lower8 ((c >> 24) & 255) << 16; + const u32x w6_t = uint_to_hex_lower8 ((d >> 0) & 255) << 0 + | uint_to_hex_lower8 ((d >> 8) & 255) << 16; + const u32x w7_t = uint_to_hex_lower8 ((d >> 16) & 255) << 0 + | uint_to_hex_lower8 ((d >> 24) & 255) << 16; + + const u32 w8_t = s[0]; + const u32 w9_t = s[1]; + const u32 wa_t = s[2]; + const u32 wb_t = s[3]; + const u32 wc_t = s[4]; + const u32 wd_t = s[5]; + const u32 we_t = s[6]; + const u32 wf_t = s[7]; + + a = MD5M_A; + b = MD5M_B; + c = MD5M_C; + d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t, MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t, MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t, MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t, MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w4_t, MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w5_t, MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w6_t, MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w7_t, MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w8_t, MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w9_t, MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, wa_t, MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, wb_t, MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, wc_t, MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, wd_t, MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, we_t, MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, wf_t, MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w1_t, MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w6_t, MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, wb_t, MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t, MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w5_t, MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, wa_t, MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, wf_t, MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w4_t, MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w9_t, MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, we_t, MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t, MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w8_t, MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, wd_t, MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t, MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w7_t, MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, wc_t, MD5C1f, MD5S13); + + MD5_STEP (MD5_H , a, b, c, d, w5_t, MD5C20, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w8_t, MD5C21, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, wb_t, MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, we_t, MD5C23, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w1_t, MD5C24, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w4_t, MD5C25, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w7_t, MD5C26, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, wa_t, MD5C27, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, wd_t, MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w0_t, MD5C29, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w3_t, MD5C2a, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w6_t, MD5C2b, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w9_t, MD5C2c, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, wc_t, MD5C2d, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, wf_t, MD5C2e, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w2_t, MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t, MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w7_t, MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, we_t, MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w5_t, MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, wc_t, MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t, MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, wa_t, MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t, MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w8_t, MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, wf_t, MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w6_t, MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, wd_t, MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w4_t, MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, wb_t, MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t, MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w9_t, MD5C3f, MD5S33); + + const u32x r0 = a; + const u32x r1 = d; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_M + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m04310_m08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m04310_m16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m04310_s04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + u32x pw_buf1[4]; + + pw_buf1[0] = pws[gid].i[ 4]; + pw_buf1[1] = pws[gid].i[ 5]; + pw_buf1[2] = pws[gid].i[ 6]; + pw_buf1[3] = pws[gid].i[ 7]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * salt + */ + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + u32 s[8]; + + s[0] = salt_bufs[salt_pos].salt_buf[0]; + s[1] = salt_bufs[salt_pos].salt_buf[1]; + s[2] = salt_bufs[salt_pos].salt_buf[2]; + s[3] = salt_bufs[salt_pos].salt_buf[3]; + s[4] = salt_bufs[salt_pos].salt_buf[4]; + s[5] = salt_bufs[salt_pos].salt_buf[5]; + s[6] = (32 + salt_len) * 8; + s[7] = 0; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * bin2asc table + */ + + l_bin2asc[lid] = c_bin2asc[(lid >> 0) & 15] << 8 + | c_bin2asc[(lid >> 4) & 15] << 0; + + __syncthreads (); + + if (gid >= gid_max) return; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + + w0[0] = pw_buf0[0]; + w0[1] = pw_buf0[1]; + w0[2] = pw_buf0[2]; + w0[3] = pw_buf0[3]; + + u32x w1[4]; + + w1[0] = pw_buf1[0]; + w1[1] = pw_buf1[1]; + w1[2] = pw_buf1[2]; + w1[3] = pw_buf1[3]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 out_len = apply_rules (c_rules[il_pos].cmds, w0, w1, pw_len); + + append_0x80_2 (w0, w1, out_len); + + w3[2] = out_len * 8; + + u32x a = MD5M_A; + u32x b = MD5M_B; + u32x c = MD5M_C; + u32x d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H , a, b, c, d, w1[1], MD5C20, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w2[0], MD5C21, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w2[3], MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w3[2], MD5C23, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w0[1], MD5C24, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w1[0], MD5C25, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w1[3], MD5C26, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w2[2], MD5C27, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w3[1], MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w0[0], MD5C29, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w0[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w1[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w2[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w3[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w3[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w0[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1[0], MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w2[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2[1], MD5C3f, MD5S33); + + a += MD5M_A; + b += MD5M_B; + c += MD5M_C; + d += MD5M_D; + + const u32x w0_t = uint_to_hex_lower8 ((a >> 0) & 255) << 0 + | uint_to_hex_lower8 ((a >> 8) & 255) << 16; + const u32x w1_t = uint_to_hex_lower8 ((a >> 16) & 255) << 0 + | uint_to_hex_lower8 ((a >> 24) & 255) << 16; + const u32x w2_t = uint_to_hex_lower8 ((b >> 0) & 255) << 0 + | uint_to_hex_lower8 ((b >> 8) & 255) << 16; + const u32x w3_t = uint_to_hex_lower8 ((b >> 16) & 255) << 0 + | uint_to_hex_lower8 ((b >> 24) & 255) << 16; + const u32x w4_t = uint_to_hex_lower8 ((c >> 0) & 255) << 0 + | uint_to_hex_lower8 ((c >> 8) & 255) << 16; + const u32x w5_t = uint_to_hex_lower8 ((c >> 16) & 255) << 0 + | uint_to_hex_lower8 ((c >> 24) & 255) << 16; + const u32x w6_t = uint_to_hex_lower8 ((d >> 0) & 255) << 0 + | uint_to_hex_lower8 ((d >> 8) & 255) << 16; + const u32x w7_t = uint_to_hex_lower8 ((d >> 16) & 255) << 0 + | uint_to_hex_lower8 ((d >> 24) & 255) << 16; + + const u32 w8_t = s[0]; + const u32 w9_t = s[1]; + const u32 wa_t = s[2]; + const u32 wb_t = s[3]; + const u32 wc_t = s[4]; + const u32 wd_t = s[5]; + const u32 we_t = s[6]; + const u32 wf_t = s[7]; + + a = MD5M_A; + b = MD5M_B; + c = MD5M_C; + d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t, MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t, MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t, MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t, MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w4_t, MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w5_t, MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w6_t, MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w7_t, MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w8_t, MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w9_t, MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, wa_t, MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, wb_t, MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, wc_t, MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, wd_t, MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, we_t, MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, wf_t, MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w1_t, MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w6_t, MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, wb_t, MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t, MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w5_t, MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, wa_t, MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, wf_t, MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w4_t, MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w9_t, MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, we_t, MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t, MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w8_t, MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, wd_t, MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t, MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w7_t, MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, wc_t, MD5C1f, MD5S13); + + MD5_STEP (MD5_H , a, b, c, d, w5_t, MD5C20, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w8_t, MD5C21, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, wb_t, MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, we_t, MD5C23, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w1_t, MD5C24, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w4_t, MD5C25, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w7_t, MD5C26, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, wa_t, MD5C27, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, wd_t, MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w0_t, MD5C29, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w3_t, MD5C2a, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w6_t, MD5C2b, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w9_t, MD5C2c, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, wc_t, MD5C2d, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, wf_t, MD5C2e, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w2_t, MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t, MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w7_t, MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, we_t, MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w5_t, MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, wc_t, MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t, MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, wa_t, MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t, MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w8_t, MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, wf_t, MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w6_t, MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, wd_t, MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w4_t, MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, wb_t, MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t, MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w9_t, MD5C3f, MD5S33); + + const u32x r0 = a; + const u32x r1 = d; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_S + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m04310_s08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m04310_s16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/nv/m04310_a1.cu b/nv/m04310_a1.cu new file mode 100644 index 0000000000..6d369aa7a1 --- /dev/null +++ b/nv/m04310_a1.cu @@ -0,0 +1,759 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _MD5_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW2 +#define VECT_SIZE4 +#endif + +#define DGST_R0 0 +#define DGST_R1 3 +#define DGST_R2 2 +#define DGST_R3 1 + +#include "include/kernel_functions.c" +#include "types_nv.c" +#include "common_nv.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +__device__ __constant__ comb_t c_combs[1024]; + +#ifdef VECT_SIZE1 +#define uint_to_hex_lower8(i) l_bin2asc[(i)] +#endif + +#ifdef VECT_SIZE2 +#define uint_to_hex_lower8(i) u32x (l_bin2asc[(i).x], l_bin2asc[(i).y]) +#endif + +#ifdef VECT_SIZE4 +#define uint_to_hex_lower8(i) u32x (l_bin2asc[(i).x], l_bin2asc[(i).y], l_bin2asc[(i).z], l_bin2asc[(i).w]) +#endif + +__device__ __constant__ char c_bin2asc[16] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' }; + +__device__ __shared__ short l_bin2asc[256]; + +extern "C" __global__ void __launch_bounds__ (256, 1) m04310_m04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + append_0x80_2 (wordl0, wordl1, pw_l_len); + + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, c_combs[0].pw_len); + } + + /** + * salt + */ + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + u32 s[8]; + + s[0] = salt_bufs[salt_pos].salt_buf[0]; + s[1] = salt_bufs[salt_pos].salt_buf[1]; + s[2] = salt_bufs[salt_pos].salt_buf[2]; + s[3] = salt_bufs[salt_pos].salt_buf[3]; + s[4] = salt_bufs[salt_pos].salt_buf[4]; + s[5] = salt_bufs[salt_pos].salt_buf[5]; + s[6] = (32 + salt_len) * 8; + s[7] = 0; + + /** + * bin2asc table + */ + + l_bin2asc[lid] = c_bin2asc[(lid >> 0) & 15] << 8 + | c_bin2asc[(lid >> 4) & 15] << 0; + + __syncthreads (); + + if (gid >= gid_max) return; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = c_combs[il_pos].pw_len; + + const u32 pw_len = pw_l_len + pw_r_len; + + u32 wordr0[4]; + + wordr0[0] = c_combs[il_pos].i[0]; + wordr0[1] = c_combs[il_pos].i[1]; + wordr0[2] = c_combs[il_pos].i[2]; + wordr0[3] = c_combs[il_pos].i[3]; + + u32 wordr1[4]; + + wordr1[0] = c_combs[il_pos].i[4]; + wordr1[1] = c_combs[il_pos].i[5]; + wordr1[2] = c_combs[il_pos].i[6]; + wordr1[3] = c_combs[il_pos].i[7]; + + u32 wordr2[4]; + + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + + u32 wordr3[4]; + + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + u32x w0[4]; + + w0[0] = wordl0[0] | wordr0[0]; + w0[1] = wordl0[1] | wordr0[1]; + w0[2] = wordl0[2] | wordr0[2]; + w0[3] = wordl0[3] | wordr0[3]; + + u32x w1[4]; + + w1[0] = wordl1[0] | wordr1[0]; + w1[1] = wordl1[1] | wordr1[1]; + w1[2] = wordl1[2] | wordr1[2]; + w1[3] = wordl1[3] | wordr1[3]; + + u32x w2[4]; + + w2[0] = wordl2[0] | wordr2[0]; + w2[1] = wordl2[1] | wordr2[1]; + w2[2] = wordl2[2] | wordr2[2]; + w2[3] = wordl2[3] | wordr2[3]; + + u32x w3[4]; + + w3[0] = wordl3[0] | wordr3[0]; + w3[1] = wordl3[1] | wordr3[1]; + w3[2] = pw_len * 8; + w3[3] = 0; + + u32x a = MD5M_A; + u32x b = MD5M_B; + u32x c = MD5M_C; + u32x d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H , a, b, c, d, w1[1], MD5C20, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w2[0], MD5C21, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w2[3], MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w3[2], MD5C23, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w0[1], MD5C24, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w1[0], MD5C25, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w1[3], MD5C26, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w2[2], MD5C27, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w3[1], MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w0[0], MD5C29, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w0[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w1[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w2[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w3[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w3[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w0[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1[0], MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w2[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2[1], MD5C3f, MD5S33); + + a += MD5M_A; + b += MD5M_B; + c += MD5M_C; + d += MD5M_D; + + const u32x w0_t = uint_to_hex_lower8 ((a >> 0) & 255) << 0 + | uint_to_hex_lower8 ((a >> 8) & 255) << 16; + const u32x w1_t = uint_to_hex_lower8 ((a >> 16) & 255) << 0 + | uint_to_hex_lower8 ((a >> 24) & 255) << 16; + const u32x w2_t = uint_to_hex_lower8 ((b >> 0) & 255) << 0 + | uint_to_hex_lower8 ((b >> 8) & 255) << 16; + const u32x w3_t = uint_to_hex_lower8 ((b >> 16) & 255) << 0 + | uint_to_hex_lower8 ((b >> 24) & 255) << 16; + const u32x w4_t = uint_to_hex_lower8 ((c >> 0) & 255) << 0 + | uint_to_hex_lower8 ((c >> 8) & 255) << 16; + const u32x w5_t = uint_to_hex_lower8 ((c >> 16) & 255) << 0 + | uint_to_hex_lower8 ((c >> 24) & 255) << 16; + const u32x w6_t = uint_to_hex_lower8 ((d >> 0) & 255) << 0 + | uint_to_hex_lower8 ((d >> 8) & 255) << 16; + const u32x w7_t = uint_to_hex_lower8 ((d >> 16) & 255) << 0 + | uint_to_hex_lower8 ((d >> 24) & 255) << 16; + + const u32 w8_t = s[0]; + const u32 w9_t = s[1]; + const u32 wa_t = s[2]; + const u32 wb_t = s[3]; + const u32 wc_t = s[4]; + const u32 wd_t = s[5]; + const u32 we_t = s[6]; + const u32 wf_t = s[7]; + + a = MD5M_A; + b = MD5M_B; + c = MD5M_C; + d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t, MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t, MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t, MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t, MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w4_t, MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w5_t, MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w6_t, MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w7_t, MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w8_t, MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w9_t, MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, wa_t, MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, wb_t, MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, wc_t, MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, wd_t, MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, we_t, MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, wf_t, MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w1_t, MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w6_t, MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, wb_t, MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t, MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w5_t, MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, wa_t, MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, wf_t, MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w4_t, MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w9_t, MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, we_t, MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t, MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w8_t, MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, wd_t, MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t, MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w7_t, MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, wc_t, MD5C1f, MD5S13); + + MD5_STEP (MD5_H , a, b, c, d, w5_t, MD5C20, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w8_t, MD5C21, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, wb_t, MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, we_t, MD5C23, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w1_t, MD5C24, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w4_t, MD5C25, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w7_t, MD5C26, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, wa_t, MD5C27, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, wd_t, MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w0_t, MD5C29, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w3_t, MD5C2a, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w6_t, MD5C2b, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w9_t, MD5C2c, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, wc_t, MD5C2d, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, wf_t, MD5C2e, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w2_t, MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t, MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w7_t, MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, we_t, MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w5_t, MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, wc_t, MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t, MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, wa_t, MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t, MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w8_t, MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, wf_t, MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w6_t, MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, wd_t, MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w4_t, MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, wb_t, MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t, MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w9_t, MD5C3f, MD5S33); + + const u32x r0 = a; + const u32x r1 = d; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_M + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m04310_m08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m04310_m16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m04310_s04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + append_0x80_2 (wordl0, wordl1, pw_l_len); + + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, c_combs[0].pw_len); + } + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * salt + */ + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + u32 s[8]; + + s[0] = salt_bufs[salt_pos].salt_buf[0]; + s[1] = salt_bufs[salt_pos].salt_buf[1]; + s[2] = salt_bufs[salt_pos].salt_buf[2]; + s[3] = salt_bufs[salt_pos].salt_buf[3]; + s[4] = salt_bufs[salt_pos].salt_buf[4]; + s[5] = salt_bufs[salt_pos].salt_buf[5]; + s[6] = (32 + salt_len) * 8; + s[7] = 0; + + /** + * bin2asc table + */ + + l_bin2asc[lid] = c_bin2asc[(lid >> 0) & 15] << 8 + | c_bin2asc[(lid >> 4) & 15] << 0; + + __syncthreads (); + + if (gid >= gid_max) return; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = c_combs[il_pos].pw_len; + + const u32 pw_len = pw_l_len + pw_r_len; + + u32 wordr0[4]; + + wordr0[0] = c_combs[il_pos].i[0]; + wordr0[1] = c_combs[il_pos].i[1]; + wordr0[2] = c_combs[il_pos].i[2]; + wordr0[3] = c_combs[il_pos].i[3]; + + u32 wordr1[4]; + + wordr1[0] = c_combs[il_pos].i[4]; + wordr1[1] = c_combs[il_pos].i[5]; + wordr1[2] = c_combs[il_pos].i[6]; + wordr1[3] = c_combs[il_pos].i[7]; + + u32 wordr2[4]; + + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + + u32 wordr3[4]; + + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + u32x w0[4]; + + w0[0] = wordl0[0] | wordr0[0]; + w0[1] = wordl0[1] | wordr0[1]; + w0[2] = wordl0[2] | wordr0[2]; + w0[3] = wordl0[3] | wordr0[3]; + + u32x w1[4]; + + w1[0] = wordl1[0] | wordr1[0]; + w1[1] = wordl1[1] | wordr1[1]; + w1[2] = wordl1[2] | wordr1[2]; + w1[3] = wordl1[3] | wordr1[3]; + + u32x w2[4]; + + w2[0] = wordl2[0] | wordr2[0]; + w2[1] = wordl2[1] | wordr2[1]; + w2[2] = wordl2[2] | wordr2[2]; + w2[3] = wordl2[3] | wordr2[3]; + + u32x w3[4]; + + w3[0] = wordl3[0] | wordr3[0]; + w3[1] = wordl3[1] | wordr3[1]; + w3[2] = pw_len * 8; + w3[3] = 0; + + u32x a = MD5M_A; + u32x b = MD5M_B; + u32x c = MD5M_C; + u32x d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H , a, b, c, d, w1[1], MD5C20, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w2[0], MD5C21, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w2[3], MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w3[2], MD5C23, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w0[1], MD5C24, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w1[0], MD5C25, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w1[3], MD5C26, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w2[2], MD5C27, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w3[1], MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w0[0], MD5C29, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w0[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w1[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w2[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w3[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w3[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w0[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1[0], MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w2[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2[1], MD5C3f, MD5S33); + + a += MD5M_A; + b += MD5M_B; + c += MD5M_C; + d += MD5M_D; + + const u32x w0_t = uint_to_hex_lower8 ((a >> 0) & 255) << 0 + | uint_to_hex_lower8 ((a >> 8) & 255) << 16; + const u32x w1_t = uint_to_hex_lower8 ((a >> 16) & 255) << 0 + | uint_to_hex_lower8 ((a >> 24) & 255) << 16; + const u32x w2_t = uint_to_hex_lower8 ((b >> 0) & 255) << 0 + | uint_to_hex_lower8 ((b >> 8) & 255) << 16; + const u32x w3_t = uint_to_hex_lower8 ((b >> 16) & 255) << 0 + | uint_to_hex_lower8 ((b >> 24) & 255) << 16; + const u32x w4_t = uint_to_hex_lower8 ((c >> 0) & 255) << 0 + | uint_to_hex_lower8 ((c >> 8) & 255) << 16; + const u32x w5_t = uint_to_hex_lower8 ((c >> 16) & 255) << 0 + | uint_to_hex_lower8 ((c >> 24) & 255) << 16; + const u32x w6_t = uint_to_hex_lower8 ((d >> 0) & 255) << 0 + | uint_to_hex_lower8 ((d >> 8) & 255) << 16; + const u32x w7_t = uint_to_hex_lower8 ((d >> 16) & 255) << 0 + | uint_to_hex_lower8 ((d >> 24) & 255) << 16; + + const u32 w8_t = s[0]; + const u32 w9_t = s[1]; + const u32 wa_t = s[2]; + const u32 wb_t = s[3]; + const u32 wc_t = s[4]; + const u32 wd_t = s[5]; + const u32 we_t = s[6]; + const u32 wf_t = s[7]; + + a = MD5M_A; + b = MD5M_B; + c = MD5M_C; + d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t, MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t, MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t, MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t, MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w4_t, MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w5_t, MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w6_t, MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w7_t, MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w8_t, MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w9_t, MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, wa_t, MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, wb_t, MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, wc_t, MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, wd_t, MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, we_t, MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, wf_t, MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w1_t, MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w6_t, MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, wb_t, MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t, MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w5_t, MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, wa_t, MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, wf_t, MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w4_t, MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w9_t, MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, we_t, MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t, MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w8_t, MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, wd_t, MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t, MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w7_t, MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, wc_t, MD5C1f, MD5S13); + + MD5_STEP (MD5_H , a, b, c, d, w5_t, MD5C20, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w8_t, MD5C21, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, wb_t, MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, we_t, MD5C23, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w1_t, MD5C24, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w4_t, MD5C25, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w7_t, MD5C26, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, wa_t, MD5C27, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, wd_t, MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w0_t, MD5C29, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w3_t, MD5C2a, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w6_t, MD5C2b, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w9_t, MD5C2c, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, wc_t, MD5C2d, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, wf_t, MD5C2e, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w2_t, MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t, MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w7_t, MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, we_t, MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w5_t, MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, wc_t, MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t, MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, wa_t, MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t, MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w8_t, MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, wf_t, MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w6_t, MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, wd_t, MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w4_t, MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, wb_t, MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t, MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w9_t, MD5C3f, MD5S33); + + const u32x r0 = a; + const u32x r1 = d; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_S + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m04310_s08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m04310_s16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/nv/m04310_a3.cu b/nv/m04310_a3.cu new file mode 100644 index 0000000000..31e3e48100 --- /dev/null +++ b/nv/m04310_a3.cu @@ -0,0 +1,861 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _MD5_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW2 +#define VECT_SIZE4 +#endif + +#define DGST_R0 0 +#define DGST_R1 3 +#define DGST_R2 2 +#define DGST_R3 1 + +#include "include/kernel_functions.c" +#include "types_nv.c" +#include "common_nv.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +__device__ __constant__ bf_t c_bfs[1024]; + +#ifdef VECT_SIZE1 +#define uint_to_hex_lower8(i) l_bin2asc[(i)] +#endif + +#ifdef VECT_SIZE2 +#define uint_to_hex_lower8(i) u32x (l_bin2asc[(i).x], l_bin2asc[(i).y]) +#endif + +#ifdef VECT_SIZE4 +#define uint_to_hex_lower8(i) u32x (l_bin2asc[(i).x], l_bin2asc[(i).y], l_bin2asc[(i).z], l_bin2asc[(i).w]) +#endif + +__device__ __constant__ char c_bin2asc[16] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' }; + +__device__ __shared__ short l_bin2asc[256]; + +__device__ static void m04310m (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], const u32 pw_len, const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset) +{ + /** + * modifier + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + const u32 lid = threadIdx.x; + + /** + * salt + */ + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + u32 s[8]; + + s[0] = salt_bufs[salt_pos].salt_buf[0]; + s[1] = salt_bufs[salt_pos].salt_buf[1]; + s[2] = salt_bufs[salt_pos].salt_buf[2]; + s[3] = salt_bufs[salt_pos].salt_buf[3]; + s[4] = salt_bufs[salt_pos].salt_buf[4]; + s[5] = salt_bufs[salt_pos].salt_buf[5]; + s[6] = (32 + salt_len) * 8; + s[7] = 0; + + /** + * loop + */ + + u32x w0l = w0[0]; + + for (u32 il_pos = 0; il_pos < bfs_cnt; il_pos++) + { + const u32 w0r = c_bfs[il_pos].i; + + w0[0] = w0l | w0r; + + u32x a = MD5M_A; + u32x b = MD5M_B; + u32x c = MD5M_C; + u32x d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H , a, b, c, d, w1[1], MD5C20, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w2[0], MD5C21, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w2[3], MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w3[2], MD5C23, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w0[1], MD5C24, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w1[0], MD5C25, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w1[3], MD5C26, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w2[2], MD5C27, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w3[1], MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w0[0], MD5C29, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w0[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w1[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w2[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w3[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w3[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w0[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1[0], MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w2[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2[1], MD5C3f, MD5S33); + + a += MD5M_A; + b += MD5M_B; + c += MD5M_C; + d += MD5M_D; + + const u32x w0_t = uint_to_hex_lower8 ((a >> 0) & 255) << 0 + | uint_to_hex_lower8 ((a >> 8) & 255) << 16; + const u32x w1_t = uint_to_hex_lower8 ((a >> 16) & 255) << 0 + | uint_to_hex_lower8 ((a >> 24) & 255) << 16; + const u32x w2_t = uint_to_hex_lower8 ((b >> 0) & 255) << 0 + | uint_to_hex_lower8 ((b >> 8) & 255) << 16; + const u32x w3_t = uint_to_hex_lower8 ((b >> 16) & 255) << 0 + | uint_to_hex_lower8 ((b >> 24) & 255) << 16; + const u32x w4_t = uint_to_hex_lower8 ((c >> 0) & 255) << 0 + | uint_to_hex_lower8 ((c >> 8) & 255) << 16; + const u32x w5_t = uint_to_hex_lower8 ((c >> 16) & 255) << 0 + | uint_to_hex_lower8 ((c >> 24) & 255) << 16; + const u32x w6_t = uint_to_hex_lower8 ((d >> 0) & 255) << 0 + | uint_to_hex_lower8 ((d >> 8) & 255) << 16; + const u32x w7_t = uint_to_hex_lower8 ((d >> 16) & 255) << 0 + | uint_to_hex_lower8 ((d >> 24) & 255) << 16; + + const u32 w8_t = s[0]; + const u32 w9_t = s[1]; + const u32 wa_t = s[2]; + const u32 wb_t = s[3]; + const u32 wc_t = s[4]; + const u32 wd_t = s[5]; + const u32 we_t = s[6]; + const u32 wf_t = s[7]; + + a = MD5M_A; + b = MD5M_B; + c = MD5M_C; + d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t, MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t, MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t, MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t, MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w4_t, MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w5_t, MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w6_t, MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w7_t, MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w8_t, MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w9_t, MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, wa_t, MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, wb_t, MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, wc_t, MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, wd_t, MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, we_t, MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, wf_t, MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w1_t, MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w6_t, MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, wb_t, MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t, MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w5_t, MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, wa_t, MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, wf_t, MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w4_t, MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w9_t, MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, we_t, MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t, MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w8_t, MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, wd_t, MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t, MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w7_t, MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, wc_t, MD5C1f, MD5S13); + + MD5_STEP (MD5_H , a, b, c, d, w5_t, MD5C20, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w8_t, MD5C21, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, wb_t, MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, we_t, MD5C23, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w1_t, MD5C24, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w4_t, MD5C25, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w7_t, MD5C26, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, wa_t, MD5C27, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, wd_t, MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w0_t, MD5C29, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w3_t, MD5C2a, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w6_t, MD5C2b, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w9_t, MD5C2c, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, wc_t, MD5C2d, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, wf_t, MD5C2e, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w2_t, MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t, MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w7_t, MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, we_t, MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w5_t, MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, wc_t, MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t, MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, wa_t, MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t, MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w8_t, MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, wf_t, MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w6_t, MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, wd_t, MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w4_t, MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, wb_t, MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t, MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w9_t, MD5C3f, MD5S33); + + const u32x r0 = a; + const u32x r1 = d; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_M + } +} + +__device__ static void m04310s (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], const u32 pw_len, const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset) +{ + /** + * modifier + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + const u32 lid = threadIdx.x; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * salt + */ + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + u32 s[8]; + + s[0] = salt_bufs[salt_pos].salt_buf[0]; + s[1] = salt_bufs[salt_pos].salt_buf[1]; + s[2] = salt_bufs[salt_pos].salt_buf[2]; + s[3] = salt_bufs[salt_pos].salt_buf[3]; + s[4] = salt_bufs[salt_pos].salt_buf[4]; + s[5] = salt_bufs[salt_pos].salt_buf[5]; + s[6] = (32 + salt_len) * 8; + s[7] = 0; + + /** + * loop + */ + + u32x w0l = w0[0]; + + for (u32 il_pos = 0; il_pos < bfs_cnt; il_pos++) + { + const u32 w0r = c_bfs[il_pos].i; + + w0[0] = w0l | w0r; + + u32x a = MD5M_A; + u32x b = MD5M_B; + u32x c = MD5M_C; + u32x d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H , a, b, c, d, w1[1], MD5C20, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w2[0], MD5C21, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w2[3], MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w3[2], MD5C23, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w0[1], MD5C24, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w1[0], MD5C25, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w1[3], MD5C26, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w2[2], MD5C27, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w3[1], MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w0[0], MD5C29, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w0[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w1[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w2[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w3[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w3[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w0[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1[0], MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w2[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2[1], MD5C3f, MD5S33); + + a += MD5M_A; + b += MD5M_B; + c += MD5M_C; + d += MD5M_D; + + const u32x w0_t = uint_to_hex_lower8 ((a >> 0) & 255) << 0 + | uint_to_hex_lower8 ((a >> 8) & 255) << 16; + const u32x w1_t = uint_to_hex_lower8 ((a >> 16) & 255) << 0 + | uint_to_hex_lower8 ((a >> 24) & 255) << 16; + const u32x w2_t = uint_to_hex_lower8 ((b >> 0) & 255) << 0 + | uint_to_hex_lower8 ((b >> 8) & 255) << 16; + const u32x w3_t = uint_to_hex_lower8 ((b >> 16) & 255) << 0 + | uint_to_hex_lower8 ((b >> 24) & 255) << 16; + const u32x w4_t = uint_to_hex_lower8 ((c >> 0) & 255) << 0 + | uint_to_hex_lower8 ((c >> 8) & 255) << 16; + const u32x w5_t = uint_to_hex_lower8 ((c >> 16) & 255) << 0 + | uint_to_hex_lower8 ((c >> 24) & 255) << 16; + const u32x w6_t = uint_to_hex_lower8 ((d >> 0) & 255) << 0 + | uint_to_hex_lower8 ((d >> 8) & 255) << 16; + const u32x w7_t = uint_to_hex_lower8 ((d >> 16) & 255) << 0 + | uint_to_hex_lower8 ((d >> 24) & 255) << 16; + + const u32 w8_t = s[0]; + const u32 w9_t = s[1]; + const u32 wa_t = s[2]; + const u32 wb_t = s[3]; + const u32 wc_t = s[4]; + const u32 wd_t = s[5]; + const u32 we_t = s[6]; + const u32 wf_t = s[7]; + + a = MD5M_A; + b = MD5M_B; + c = MD5M_C; + d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t, MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t, MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t, MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t, MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w4_t, MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w5_t, MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w6_t, MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w7_t, MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w8_t, MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w9_t, MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, wa_t, MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, wb_t, MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, wc_t, MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, wd_t, MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, we_t, MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, wf_t, MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w1_t, MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w6_t, MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, wb_t, MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t, MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w5_t, MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, wa_t, MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, wf_t, MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w4_t, MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w9_t, MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, we_t, MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t, MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w8_t, MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, wd_t, MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t, MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w7_t, MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, wc_t, MD5C1f, MD5S13); + + MD5_STEP (MD5_H , a, b, c, d, w5_t, MD5C20, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w8_t, MD5C21, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, wb_t, MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, we_t, MD5C23, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w1_t, MD5C24, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w4_t, MD5C25, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w7_t, MD5C26, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, wa_t, MD5C27, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, wd_t, MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w0_t, MD5C29, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w3_t, MD5C2a, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w6_t, MD5C2b, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w9_t, MD5C2c, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, wc_t, MD5C2d, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, wf_t, MD5C2e, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w2_t, MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t, MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w7_t, MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, we_t, MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w5_t, MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, wc_t, MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t, MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, wa_t, MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t, MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w8_t, MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, wf_t, MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w6_t, MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, wd_t, MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w4_t, MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, wb_t, MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t, MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w9_t, MD5C3f, MD5S33); + + const u32x r0 = a; + const u32x r1 = d; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_S + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m04310_m04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + const u32 lid = threadIdx.x; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = pws[gid].i[14]; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * bin2asc table + */ + + l_bin2asc[lid] = c_bin2asc[(lid >> 0) & 15] << 8 + | c_bin2asc[(lid >> 4) & 15] << 0; + + __syncthreads (); + + if (gid >= gid_max) return; + + /** + * main + */ + + m04310m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m04310_m08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + const u32 lid = threadIdx.x; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = pws[gid].i[14]; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * bin2asc table + */ + + l_bin2asc[lid] = c_bin2asc[(lid >> 0) & 15] << 8 + | c_bin2asc[(lid >> 4) & 15] << 0; + + __syncthreads (); + + if (gid >= gid_max) return; + + /** + * main + */ + + m04310m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m04310_m16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + const u32 lid = threadIdx.x; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = pws[gid].i[ 8]; + w2[1] = pws[gid].i[ 9]; + w2[2] = pws[gid].i[10]; + w2[3] = pws[gid].i[11]; + + u32x w3[4]; + + w3[0] = pws[gid].i[12]; + w3[1] = pws[gid].i[13]; + w3[2] = pws[gid].i[14]; + w3[3] = pws[gid].i[15]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * bin2asc table + */ + + l_bin2asc[lid] = c_bin2asc[(lid >> 0) & 15] << 8 + | c_bin2asc[(lid >> 4) & 15] << 0; + + __syncthreads (); + + if (gid >= gid_max) return; + + /** + * main + */ + + m04310m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m04310_s04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + const u32 lid = threadIdx.x; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = pws[gid].i[14]; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * bin2asc table + */ + + l_bin2asc[lid] = c_bin2asc[(lid >> 0) & 15] << 8 + | c_bin2asc[(lid >> 4) & 15] << 0; + + __syncthreads (); + + if (gid >= gid_max) return; + + /** + * main + */ + + m04310s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m04310_s08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + const u32 lid = threadIdx.x; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = pws[gid].i[14]; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * bin2asc table + */ + + l_bin2asc[lid] = c_bin2asc[(lid >> 0) & 15] << 8 + | c_bin2asc[(lid >> 4) & 15] << 0; + + __syncthreads (); + + if (gid >= gid_max) return; + + /** + * main + */ + + m04310s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m04310_s16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + const u32 lid = threadIdx.x; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = pws[gid].i[ 8]; + w2[1] = pws[gid].i[ 9]; + w2[2] = pws[gid].i[10]; + w2[3] = pws[gid].i[11]; + + u32x w3[4]; + + w3[0] = pws[gid].i[12]; + w3[1] = pws[gid].i[13]; + w3[2] = pws[gid].i[14]; + w3[3] = pws[gid].i[15]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * bin2asc table + */ + + l_bin2asc[lid] = c_bin2asc[(lid >> 0) & 15] << 8 + | c_bin2asc[(lid >> 4) & 15] << 0; + + __syncthreads (); + + if (gid >= gid_max) return; + + /** + * main + */ + + m04310s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} diff --git a/nv/m04400_a0.cu b/nv/m04400_a0.cu new file mode 100644 index 0000000000..87e4f765d0 --- /dev/null +++ b/nv/m04400_a0.cu @@ -0,0 +1,733 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _MD5_SHA1_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW2 +#define VECT_SIZE1 +#endif + +#define DGST_R0 0 +#define DGST_R1 3 +#define DGST_R2 2 +#define DGST_R3 1 + +#include "include/kernel_functions.c" +#include "types_nv.c" +#include "common_nv.c" +#include "include/rp_gpu.h" +#include "rp_nv.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +#ifdef VECT_SIZE1 +#define uint_to_hex_lower8(i) l_bin2asc[(i)] +#endif + +#ifdef VECT_SIZE2 +#define uint_to_hex_lower8(i) u32x (l_bin2asc[(i).x], l_bin2asc[(i).y]) +#endif + +#ifdef VECT_SIZE4 +#define uint_to_hex_lower8(i) u32x (l_bin2asc[(i).x], l_bin2asc[(i).y], l_bin2asc[(i).z], l_bin2asc[(i).w]) +#endif + +__device__ __constant__ char c_bin2asc[16] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' }; + +__device__ __shared__ short l_bin2asc[256]; + +__device__ __constant__ gpu_rule_t c_rules[1024]; + +extern "C" __global__ void __launch_bounds__ (256, 1) m04400_m04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + u32x pw_buf1[4]; + + pw_buf1[0] = pws[gid].i[ 4]; + pw_buf1[1] = pws[gid].i[ 5]; + pw_buf1[2] = pws[gid].i[ 6]; + pw_buf1[3] = pws[gid].i[ 7]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * bin2asc table + */ + + l_bin2asc[lid] = c_bin2asc[(lid >> 0) & 15] << 8 + | c_bin2asc[(lid >> 4) & 15] << 0; + + __syncthreads (); + + if (gid >= gid_max) return; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + + w0[0] = pw_buf0[0]; + w0[1] = pw_buf0[1]; + w0[2] = pw_buf0[2]; + w0[3] = pw_buf0[3]; + + u32x w1[4]; + + w1[0] = pw_buf1[0]; + w1[1] = pw_buf1[1]; + w1[2] = pw_buf1[2]; + w1[3] = pw_buf1[3]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 out_len = apply_rules (c_rules[il_pos].cmds, w0, w1, pw_len); + + append_0x80_2 (w0, w1, out_len); + + /** + * sha1 + */ + + u32x w0_t = swap_workaround (w0[0]); + u32x w1_t = swap_workaround (w0[1]); + u32x w2_t = swap_workaround (w0[2]); + u32x w3_t = swap_workaround (w0[3]); + u32x w4_t = swap_workaround (w1[0]); + u32x w5_t = swap_workaround (w1[1]); + u32x w6_t = swap_workaround (w1[2]); + u32x w7_t = swap_workaround (w1[3]); + u32x w8_t = swap_workaround (w2[0]); + u32x w9_t = swap_workaround (w2[1]); + u32x wa_t = swap_workaround (w2[2]); + u32x wb_t = swap_workaround (w2[3]); + u32x wc_t = swap_workaround (w3[0]); + u32x wd_t = swap_workaround (w3[1]); + u32x we_t = 0; + u32x wf_t = out_len * 8; + + u32x a = SHA1M_A; + u32x b = SHA1M_B; + u32x c = SHA1M_C; + u32x d = SHA1M_D; + u32x e = SHA1M_E; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w0_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w1_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w2_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w3_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w4_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w5_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w6_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w7_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w8_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w9_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wa_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, wb_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, wc_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, wd_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, we_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F0o, e, a, b, c, d, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F0o, d, e, a, b, c, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F0o, c, d, e, a, b, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F0o, b, c, d, e, a, w3_t); + + #undef K + #define K SHA1C01 + + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w7_t); + + #undef K + #define K SHA1C02 + + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wb_t); + + #undef K + #define K SHA1C03 + + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wf_t); + + a += SHA1M_A; + b += SHA1M_B; + c += SHA1M_C; + d += SHA1M_D; + e += SHA1M_E; + + /** + * md5 + */ + + w0_t = uint_to_hex_lower8 ((a >> 24) & 255) << 0 + | uint_to_hex_lower8 ((a >> 16) & 255) << 16; + w1_t = uint_to_hex_lower8 ((a >> 8) & 255) << 0 + | uint_to_hex_lower8 ((a >> 0) & 255) << 16; + w2_t = uint_to_hex_lower8 ((b >> 24) & 255) << 0 + | uint_to_hex_lower8 ((b >> 16) & 255) << 16; + w3_t = uint_to_hex_lower8 ((b >> 8) & 255) << 0 + | uint_to_hex_lower8 ((b >> 0) & 255) << 16; + w4_t = uint_to_hex_lower8 ((c >> 24) & 255) << 0 + | uint_to_hex_lower8 ((c >> 16) & 255) << 16; + w5_t = uint_to_hex_lower8 ((c >> 8) & 255) << 0 + | uint_to_hex_lower8 ((c >> 0) & 255) << 16; + w6_t = uint_to_hex_lower8 ((d >> 24) & 255) << 0 + | uint_to_hex_lower8 ((d >> 16) & 255) << 16; + w7_t = uint_to_hex_lower8 ((d >> 8) & 255) << 0 + | uint_to_hex_lower8 ((d >> 0) & 255) << 16; + w8_t = uint_to_hex_lower8 ((e >> 24) & 255) << 0 + | uint_to_hex_lower8 ((e >> 16) & 255) << 16; + w9_t = uint_to_hex_lower8 ((e >> 8) & 255) << 0 + | uint_to_hex_lower8 ((e >> 0) & 255) << 16; + + wa_t = 0x80; + wb_t = 0; + wc_t = 0; + wd_t = 0; + we_t = 40 * 8; + wf_t = 0; + + a = MD5M_A; + b = MD5M_B; + c = MD5M_C; + d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t, MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t, MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t, MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t, MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w4_t, MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w5_t, MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w6_t, MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w7_t, MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w8_t, MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w9_t, MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, wa_t, MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, wb_t, MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, wc_t, MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, wd_t, MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, we_t, MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, wf_t, MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w1_t, MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w6_t, MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, wb_t, MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t, MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w5_t, MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, wa_t, MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, wf_t, MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w4_t, MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w9_t, MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, we_t, MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t, MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w8_t, MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, wd_t, MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t, MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w7_t, MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, wc_t, MD5C1f, MD5S13); + + MD5_STEP (MD5_H , a, b, c, d, w5_t, MD5C20, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w8_t, MD5C21, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, wb_t, MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, we_t, MD5C23, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w1_t, MD5C24, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w4_t, MD5C25, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w7_t, MD5C26, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, wa_t, MD5C27, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, wd_t, MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w0_t, MD5C29, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w3_t, MD5C2a, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w6_t, MD5C2b, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w9_t, MD5C2c, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, wc_t, MD5C2d, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, wf_t, MD5C2e, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w2_t, MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t, MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w7_t, MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, we_t, MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w5_t, MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, wc_t, MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t, MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, wa_t, MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t, MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w8_t, MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, wf_t, MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w6_t, MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, wd_t, MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w4_t, MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, wb_t, MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t, MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w9_t, MD5C3f, MD5S33); + + const u32x r0 = a; + const u32x r1 = d; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_M + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m04400_m08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m04400_m16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m04400_s04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + u32x pw_buf1[4]; + + pw_buf1[0] = pws[gid].i[ 4]; + pw_buf1[1] = pws[gid].i[ 5]; + pw_buf1[2] = pws[gid].i[ 6]; + pw_buf1[3] = pws[gid].i[ 7]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * bin2asc table + */ + + l_bin2asc[lid] = c_bin2asc[(lid >> 0) & 15] << 8 + | c_bin2asc[(lid >> 4) & 15] << 0; + + __syncthreads (); + + if (gid >= gid_max) return; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + + w0[0] = pw_buf0[0]; + w0[1] = pw_buf0[1]; + w0[2] = pw_buf0[2]; + w0[3] = pw_buf0[3]; + + u32x w1[4]; + + w1[0] = pw_buf1[0]; + w1[1] = pw_buf1[1]; + w1[2] = pw_buf1[2]; + w1[3] = pw_buf1[3]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 out_len = apply_rules (c_rules[il_pos].cmds, w0, w1, pw_len); + + append_0x80_2 (w0, w1, out_len); + + /** + * sha1 + */ + + u32x w0_t = swap_workaround (w0[0]); + u32x w1_t = swap_workaround (w0[1]); + u32x w2_t = swap_workaround (w0[2]); + u32x w3_t = swap_workaround (w0[3]); + u32x w4_t = swap_workaround (w1[0]); + u32x w5_t = swap_workaround (w1[1]); + u32x w6_t = swap_workaround (w1[2]); + u32x w7_t = swap_workaround (w1[3]); + u32x w8_t = swap_workaround (w2[0]); + u32x w9_t = swap_workaround (w2[1]); + u32x wa_t = swap_workaround (w2[2]); + u32x wb_t = swap_workaround (w2[3]); + u32x wc_t = swap_workaround (w3[0]); + u32x wd_t = swap_workaround (w3[1]); + u32x we_t = 0; + u32x wf_t = out_len * 8; + + u32x a = SHA1M_A; + u32x b = SHA1M_B; + u32x c = SHA1M_C; + u32x d = SHA1M_D; + u32x e = SHA1M_E; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w0_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w1_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w2_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w3_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w4_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w5_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w6_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w7_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w8_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w9_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wa_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, wb_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, wc_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, wd_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, we_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F0o, e, a, b, c, d, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F0o, d, e, a, b, c, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F0o, c, d, e, a, b, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F0o, b, c, d, e, a, w3_t); + + #undef K + #define K SHA1C01 + + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w7_t); + + #undef K + #define K SHA1C02 + + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wb_t); + + #undef K + #define K SHA1C03 + + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wf_t); + + a += SHA1M_A; + b += SHA1M_B; + c += SHA1M_C; + d += SHA1M_D; + e += SHA1M_E; + + /** + * md5 + */ + + w0_t = uint_to_hex_lower8 ((a >> 24) & 255) << 0 + | uint_to_hex_lower8 ((a >> 16) & 255) << 16; + w1_t = uint_to_hex_lower8 ((a >> 8) & 255) << 0 + | uint_to_hex_lower8 ((a >> 0) & 255) << 16; + w2_t = uint_to_hex_lower8 ((b >> 24) & 255) << 0 + | uint_to_hex_lower8 ((b >> 16) & 255) << 16; + w3_t = uint_to_hex_lower8 ((b >> 8) & 255) << 0 + | uint_to_hex_lower8 ((b >> 0) & 255) << 16; + w4_t = uint_to_hex_lower8 ((c >> 24) & 255) << 0 + | uint_to_hex_lower8 ((c >> 16) & 255) << 16; + w5_t = uint_to_hex_lower8 ((c >> 8) & 255) << 0 + | uint_to_hex_lower8 ((c >> 0) & 255) << 16; + w6_t = uint_to_hex_lower8 ((d >> 24) & 255) << 0 + | uint_to_hex_lower8 ((d >> 16) & 255) << 16; + w7_t = uint_to_hex_lower8 ((d >> 8) & 255) << 0 + | uint_to_hex_lower8 ((d >> 0) & 255) << 16; + w8_t = uint_to_hex_lower8 ((e >> 24) & 255) << 0 + | uint_to_hex_lower8 ((e >> 16) & 255) << 16; + w9_t = uint_to_hex_lower8 ((e >> 8) & 255) << 0 + | uint_to_hex_lower8 ((e >> 0) & 255) << 16; + + wa_t = 0x80; + wb_t = 0; + wc_t = 0; + wd_t = 0; + we_t = 40 * 8; + wf_t = 0; + + a = MD5M_A; + b = MD5M_B; + c = MD5M_C; + d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t, MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t, MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t, MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t, MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w4_t, MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w5_t, MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w6_t, MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w7_t, MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w8_t, MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w9_t, MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, wa_t, MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, wb_t, MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, wc_t, MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, wd_t, MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, we_t, MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, wf_t, MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w1_t, MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w6_t, MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, wb_t, MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t, MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w5_t, MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, wa_t, MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, wf_t, MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w4_t, MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w9_t, MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, we_t, MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t, MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w8_t, MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, wd_t, MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t, MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w7_t, MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, wc_t, MD5C1f, MD5S13); + + MD5_STEP (MD5_H , a, b, c, d, w5_t, MD5C20, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w8_t, MD5C21, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, wb_t, MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, we_t, MD5C23, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w1_t, MD5C24, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w4_t, MD5C25, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w7_t, MD5C26, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, wa_t, MD5C27, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, wd_t, MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w0_t, MD5C29, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w3_t, MD5C2a, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w6_t, MD5C2b, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w9_t, MD5C2c, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, wc_t, MD5C2d, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, wf_t, MD5C2e, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w2_t, MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t, MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w7_t, MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, we_t, MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w5_t, MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, wc_t, MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t, MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, wa_t, MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t, MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w8_t, MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, wf_t, MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w6_t, MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, wd_t, MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w4_t, MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, wb_t, MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t, MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w9_t, MD5C3f, MD5S33); + + const u32x r0 = a; + const u32x r1 = d; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_S + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m04400_s08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m04400_s16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/nv/m04400_a1.cu b/nv/m04400_a1.cu new file mode 100644 index 0000000000..d766a92011 --- /dev/null +++ b/nv/m04400_a1.cu @@ -0,0 +1,843 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _MD5_SHA1_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW2 +#define VECT_SIZE1 +#endif + +#define DGST_R0 0 +#define DGST_R1 3 +#define DGST_R2 2 +#define DGST_R3 1 + +#include "include/kernel_functions.c" +#include "types_nv.c" +#include "common_nv.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +#ifdef VECT_SIZE1 +#define uint_to_hex_lower8(i) l_bin2asc[(i)] +#endif + +#ifdef VECT_SIZE2 +#define uint_to_hex_lower8(i) u32x (l_bin2asc[(i).x], l_bin2asc[(i).y]) +#endif + +#ifdef VECT_SIZE4 +#define uint_to_hex_lower8(i) u32x (l_bin2asc[(i).x], l_bin2asc[(i).y], l_bin2asc[(i).z], l_bin2asc[(i).w]) +#endif + +__device__ __constant__ char c_bin2asc[16] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' }; + +__device__ __shared__ short l_bin2asc[256]; + +__device__ __constant__ comb_t c_combs[1024]; + +extern "C" __global__ void __launch_bounds__ (256, 1) m04400_m04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + append_0x80_2 (wordl0, wordl1, pw_l_len); + + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, c_combs[0].pw_len); + } + + /** + * bin2asc table + */ + + l_bin2asc[lid] = c_bin2asc[(lid >> 0) & 15] << 8 + | c_bin2asc[(lid >> 4) & 15] << 0; + + __syncthreads (); + + if (gid >= gid_max) return; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = c_combs[il_pos].pw_len; + + const u32 pw_len = pw_l_len + pw_r_len; + + u32 wordr0[4]; + + wordr0[0] = c_combs[il_pos].i[0]; + wordr0[1] = c_combs[il_pos].i[1]; + wordr0[2] = c_combs[il_pos].i[2]; + wordr0[3] = c_combs[il_pos].i[3]; + + u32 wordr1[4]; + + wordr1[0] = c_combs[il_pos].i[4]; + wordr1[1] = c_combs[il_pos].i[5]; + wordr1[2] = c_combs[il_pos].i[6]; + wordr1[3] = c_combs[il_pos].i[7]; + + u32 wordr2[4]; + + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + + u32 wordr3[4]; + + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + append_0x80_2 (wordr0, wordr1, pw_r_len); + + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + u32x w0[4]; + + w0[0] = wordl0[0] | wordr0[0]; + w0[1] = wordl0[1] | wordr0[1]; + w0[2] = wordl0[2] | wordr0[2]; + w0[3] = wordl0[3] | wordr0[3]; + + u32x w1[4]; + + w1[0] = wordl1[0] | wordr1[0]; + w1[1] = wordl1[1] | wordr1[1]; + w1[2] = wordl1[2] | wordr1[2]; + w1[3] = wordl1[3] | wordr1[3]; + + u32x w2[4]; + + w2[0] = wordl2[0] | wordr2[0]; + w2[1] = wordl2[1] | wordr2[1]; + w2[2] = wordl2[2] | wordr2[2]; + w2[3] = wordl2[3] | wordr2[3]; + + u32x w3[4]; + + w3[0] = wordl3[0] | wordr3[0]; + w3[1] = wordl3[1] | wordr3[1]; + w3[2] = 0; + w3[3] = 0; + + /** + * sha1 + */ + + u32x w0_t = swap_workaround (w0[0]); + u32x w1_t = swap_workaround (w0[1]); + u32x w2_t = swap_workaround (w0[2]); + u32x w3_t = swap_workaround (w0[3]); + u32x w4_t = swap_workaround (w1[0]); + u32x w5_t = swap_workaround (w1[1]); + u32x w6_t = swap_workaround (w1[2]); + u32x w7_t = swap_workaround (w1[3]); + u32x w8_t = swap_workaround (w2[0]); + u32x w9_t = swap_workaround (w2[1]); + u32x wa_t = swap_workaround (w2[2]); + u32x wb_t = swap_workaround (w2[3]); + u32x wc_t = swap_workaround (w3[0]); + u32x wd_t = swap_workaround (w3[1]); + u32x we_t = 0; + u32x wf_t = pw_len * 8; + + u32x a = SHA1M_A; + u32x b = SHA1M_B; + u32x c = SHA1M_C; + u32x d = SHA1M_D; + u32x e = SHA1M_E; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w0_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w1_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w2_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w3_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w4_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w5_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w6_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w7_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w8_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w9_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wa_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, wb_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, wc_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, wd_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, we_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F0o, e, a, b, c, d, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F0o, d, e, a, b, c, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F0o, c, d, e, a, b, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F0o, b, c, d, e, a, w3_t); + + #undef K + #define K SHA1C01 + + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w7_t); + + #undef K + #define K SHA1C02 + + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wb_t); + + #undef K + #define K SHA1C03 + + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wf_t); + + a += SHA1M_A; + b += SHA1M_B; + c += SHA1M_C; + d += SHA1M_D; + e += SHA1M_E; + + /** + * md5 + */ + + w0_t = uint_to_hex_lower8 ((a >> 24) & 255) << 0 + | uint_to_hex_lower8 ((a >> 16) & 255) << 16; + w1_t = uint_to_hex_lower8 ((a >> 8) & 255) << 0 + | uint_to_hex_lower8 ((a >> 0) & 255) << 16; + w2_t = uint_to_hex_lower8 ((b >> 24) & 255) << 0 + | uint_to_hex_lower8 ((b >> 16) & 255) << 16; + w3_t = uint_to_hex_lower8 ((b >> 8) & 255) << 0 + | uint_to_hex_lower8 ((b >> 0) & 255) << 16; + w4_t = uint_to_hex_lower8 ((c >> 24) & 255) << 0 + | uint_to_hex_lower8 ((c >> 16) & 255) << 16; + w5_t = uint_to_hex_lower8 ((c >> 8) & 255) << 0 + | uint_to_hex_lower8 ((c >> 0) & 255) << 16; + w6_t = uint_to_hex_lower8 ((d >> 24) & 255) << 0 + | uint_to_hex_lower8 ((d >> 16) & 255) << 16; + w7_t = uint_to_hex_lower8 ((d >> 8) & 255) << 0 + | uint_to_hex_lower8 ((d >> 0) & 255) << 16; + w8_t = uint_to_hex_lower8 ((e >> 24) & 255) << 0 + | uint_to_hex_lower8 ((e >> 16) & 255) << 16; + w9_t = uint_to_hex_lower8 ((e >> 8) & 255) << 0 + | uint_to_hex_lower8 ((e >> 0) & 255) << 16; + + wa_t = 0x80; + wb_t = 0; + wc_t = 0; + wd_t = 0; + we_t = 40 * 8; + wf_t = 0; + + a = MD5M_A; + b = MD5M_B; + c = MD5M_C; + d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t, MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t, MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t, MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t, MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w4_t, MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w5_t, MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w6_t, MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w7_t, MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w8_t, MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w9_t, MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, wa_t, MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, wb_t, MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, wc_t, MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, wd_t, MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, we_t, MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, wf_t, MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w1_t, MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w6_t, MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, wb_t, MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t, MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w5_t, MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, wa_t, MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, wf_t, MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w4_t, MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w9_t, MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, we_t, MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t, MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w8_t, MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, wd_t, MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t, MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w7_t, MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, wc_t, MD5C1f, MD5S13); + + MD5_STEP (MD5_H , a, b, c, d, w5_t, MD5C20, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w8_t, MD5C21, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, wb_t, MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, we_t, MD5C23, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w1_t, MD5C24, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w4_t, MD5C25, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w7_t, MD5C26, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, wa_t, MD5C27, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, wd_t, MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w0_t, MD5C29, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w3_t, MD5C2a, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w6_t, MD5C2b, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w9_t, MD5C2c, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, wc_t, MD5C2d, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, wf_t, MD5C2e, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w2_t, MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t, MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w7_t, MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, we_t, MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w5_t, MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, wc_t, MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t, MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, wa_t, MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t, MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w8_t, MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, wf_t, MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w6_t, MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, wd_t, MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w4_t, MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, wb_t, MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t, MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w9_t, MD5C3f, MD5S33); + + const u32x r0 = a; + const u32x r1 = d; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_M + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m04400_m08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m04400_m16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m04400_s04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + append_0x80_2 (wordl0, wordl1, pw_l_len); + + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, c_combs[0].pw_len); + } + + /** + * bin2asc table + */ + + l_bin2asc[lid] = c_bin2asc[(lid >> 0) & 15] << 8 + | c_bin2asc[(lid >> 4) & 15] << 0; + + __syncthreads (); + + if (gid >= gid_max) return; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = c_combs[il_pos].pw_len; + + const u32 pw_len = pw_l_len + pw_r_len; + + u32 wordr0[4]; + + wordr0[0] = c_combs[il_pos].i[0]; + wordr0[1] = c_combs[il_pos].i[1]; + wordr0[2] = c_combs[il_pos].i[2]; + wordr0[3] = c_combs[il_pos].i[3]; + + u32 wordr1[4]; + + wordr1[0] = c_combs[il_pos].i[4]; + wordr1[1] = c_combs[il_pos].i[5]; + wordr1[2] = c_combs[il_pos].i[6]; + wordr1[3] = c_combs[il_pos].i[7]; + + u32 wordr2[4]; + + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + + u32 wordr3[4]; + + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + append_0x80_2 (wordr0, wordr1, pw_r_len); + + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + u32x w0[4]; + + w0[0] = wordl0[0] | wordr0[0]; + w0[1] = wordl0[1] | wordr0[1]; + w0[2] = wordl0[2] | wordr0[2]; + w0[3] = wordl0[3] | wordr0[3]; + + u32x w1[4]; + + w1[0] = wordl1[0] | wordr1[0]; + w1[1] = wordl1[1] | wordr1[1]; + w1[2] = wordl1[2] | wordr1[2]; + w1[3] = wordl1[3] | wordr1[3]; + + u32x w2[4]; + + w2[0] = wordl2[0] | wordr2[0]; + w2[1] = wordl2[1] | wordr2[1]; + w2[2] = wordl2[2] | wordr2[2]; + w2[3] = wordl2[3] | wordr2[3]; + + u32x w3[4]; + + w3[0] = wordl3[0] | wordr3[0]; + w3[1] = wordl3[1] | wordr3[1]; + w3[2] = 0; + w3[3] = 0; + + /** + * sha1 + */ + + u32x w0_t = swap_workaround (w0[0]); + u32x w1_t = swap_workaround (w0[1]); + u32x w2_t = swap_workaround (w0[2]); + u32x w3_t = swap_workaround (w0[3]); + u32x w4_t = swap_workaround (w1[0]); + u32x w5_t = swap_workaround (w1[1]); + u32x w6_t = swap_workaround (w1[2]); + u32x w7_t = swap_workaround (w1[3]); + u32x w8_t = swap_workaround (w2[0]); + u32x w9_t = swap_workaround (w2[1]); + u32x wa_t = swap_workaround (w2[2]); + u32x wb_t = swap_workaround (w2[3]); + u32x wc_t = swap_workaround (w3[0]); + u32x wd_t = swap_workaround (w3[1]); + u32x we_t = 0; + u32x wf_t = pw_len * 8; + + u32x a = SHA1M_A; + u32x b = SHA1M_B; + u32x c = SHA1M_C; + u32x d = SHA1M_D; + u32x e = SHA1M_E; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w0_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w1_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w2_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w3_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w4_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w5_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w6_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w7_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w8_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w9_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wa_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, wb_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, wc_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, wd_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, we_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F0o, e, a, b, c, d, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F0o, d, e, a, b, c, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F0o, c, d, e, a, b, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F0o, b, c, d, e, a, w3_t); + + #undef K + #define K SHA1C01 + + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w7_t); + + #undef K + #define K SHA1C02 + + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wb_t); + + #undef K + #define K SHA1C03 + + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wf_t); + + a += SHA1M_A; + b += SHA1M_B; + c += SHA1M_C; + d += SHA1M_D; + e += SHA1M_E; + + /** + * md5 + */ + + w0_t = uint_to_hex_lower8 ((a >> 24) & 255) << 0 + | uint_to_hex_lower8 ((a >> 16) & 255) << 16; + w1_t = uint_to_hex_lower8 ((a >> 8) & 255) << 0 + | uint_to_hex_lower8 ((a >> 0) & 255) << 16; + w2_t = uint_to_hex_lower8 ((b >> 24) & 255) << 0 + | uint_to_hex_lower8 ((b >> 16) & 255) << 16; + w3_t = uint_to_hex_lower8 ((b >> 8) & 255) << 0 + | uint_to_hex_lower8 ((b >> 0) & 255) << 16; + w4_t = uint_to_hex_lower8 ((c >> 24) & 255) << 0 + | uint_to_hex_lower8 ((c >> 16) & 255) << 16; + w5_t = uint_to_hex_lower8 ((c >> 8) & 255) << 0 + | uint_to_hex_lower8 ((c >> 0) & 255) << 16; + w6_t = uint_to_hex_lower8 ((d >> 24) & 255) << 0 + | uint_to_hex_lower8 ((d >> 16) & 255) << 16; + w7_t = uint_to_hex_lower8 ((d >> 8) & 255) << 0 + | uint_to_hex_lower8 ((d >> 0) & 255) << 16; + w8_t = uint_to_hex_lower8 ((e >> 24) & 255) << 0 + | uint_to_hex_lower8 ((e >> 16) & 255) << 16; + w9_t = uint_to_hex_lower8 ((e >> 8) & 255) << 0 + | uint_to_hex_lower8 ((e >> 0) & 255) << 16; + + wa_t = 0x80; + wb_t = 0; + wc_t = 0; + wd_t = 0; + we_t = 40 * 8; + wf_t = 0; + + a = MD5M_A; + b = MD5M_B; + c = MD5M_C; + d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t, MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t, MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t, MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t, MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w4_t, MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w5_t, MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w6_t, MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w7_t, MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w8_t, MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w9_t, MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, wa_t, MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, wb_t, MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, wc_t, MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, wd_t, MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, we_t, MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, wf_t, MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w1_t, MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w6_t, MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, wb_t, MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t, MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w5_t, MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, wa_t, MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, wf_t, MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w4_t, MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w9_t, MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, we_t, MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t, MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w8_t, MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, wd_t, MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t, MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w7_t, MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, wc_t, MD5C1f, MD5S13); + + MD5_STEP (MD5_H , a, b, c, d, w5_t, MD5C20, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w8_t, MD5C21, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, wb_t, MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, we_t, MD5C23, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w1_t, MD5C24, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w4_t, MD5C25, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w7_t, MD5C26, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, wa_t, MD5C27, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, wd_t, MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w0_t, MD5C29, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w3_t, MD5C2a, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w6_t, MD5C2b, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w9_t, MD5C2c, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, wc_t, MD5C2d, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, wf_t, MD5C2e, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w2_t, MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t, MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w7_t, MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, we_t, MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w5_t, MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, wc_t, MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t, MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, wa_t, MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t, MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w8_t, MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, wf_t, MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w6_t, MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, wd_t, MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w4_t, MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, wb_t, MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t, MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w9_t, MD5C3f, MD5S33); + + const u32x r0 = a; + const u32x r1 = d; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_S + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m04400_s08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m04400_s16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/nv/m04400_a3.cu b/nv/m04400_a3.cu new file mode 100644 index 0000000000..167a8057d4 --- /dev/null +++ b/nv/m04400_a3.cu @@ -0,0 +1,972 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _MD5_SHA1_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW2 +#define VECT_SIZE1 +#endif + +#define DGST_R0 0 +#define DGST_R1 3 +#define DGST_R2 2 +#define DGST_R3 1 + +#include "include/kernel_functions.c" +#include "types_nv.c" +#include "common_nv.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +#ifdef VECT_SIZE1 +#define uint_to_hex_lower8(i) l_bin2asc[(i)] +#endif + +#ifdef VECT_SIZE2 +#define uint_to_hex_lower8(i) u32x (l_bin2asc[(i).x], l_bin2asc[(i).y]) +#endif + +#ifdef VECT_SIZE4 +#define uint_to_hex_lower8(i) u32x (l_bin2asc[(i).x], l_bin2asc[(i).y], l_bin2asc[(i).z], l_bin2asc[(i).w]) +#endif + +__device__ __constant__ char c_bin2asc[16] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' }; + +__device__ __shared__ short l_bin2asc[256]; + +__device__ __constant__ bf_t c_bfs[1024]; + +__device__ static void m04400m (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], const u32 pw_len, const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset) +{ + /** + * modifier + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + const u32 lid = threadIdx.x; + + /** + * loop + */ + + u32x w0l = w0[0]; + + for (u32 il_pos = 0; il_pos < bfs_cnt; il_pos++) + { + const u32 w0r = c_bfs[il_pos].i; + + w0[0] = w0l | w0r; + + /** + * sha1 + */ + + u32x w0_t = w0[0]; + u32x w1_t = w0[1]; + u32x w2_t = w0[2]; + u32x w3_t = w0[3]; + u32x w4_t = w1[0]; + u32x w5_t = w1[1]; + u32x w6_t = w1[2]; + u32x w7_t = w1[3]; + u32x w8_t = w2[0]; + u32x w9_t = w2[1]; + u32x wa_t = w2[2]; + u32x wb_t = w2[3]; + u32x wc_t = w3[0]; + u32x wd_t = w3[1]; + u32x we_t = 0; + u32x wf_t = pw_len * 8; + + u32x a = SHA1M_A; + u32x b = SHA1M_B; + u32x c = SHA1M_C; + u32x d = SHA1M_D; + u32x e = SHA1M_E; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w0_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w1_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w2_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w3_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w4_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w5_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w6_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w7_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w8_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w9_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wa_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, wb_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, wc_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, wd_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, we_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F0o, e, a, b, c, d, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F0o, d, e, a, b, c, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F0o, c, d, e, a, b, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F0o, b, c, d, e, a, w3_t); + + #undef K + #define K SHA1C01 + + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w7_t); + + #undef K + #define K SHA1C02 + + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wb_t); + + #undef K + #define K SHA1C03 + + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wf_t); + + a += SHA1M_A; + b += SHA1M_B; + c += SHA1M_C; + d += SHA1M_D; + e += SHA1M_E; + + /** + * md5 + */ + + w0_t = uint_to_hex_lower8 ((a >> 24) & 255) << 0 + | uint_to_hex_lower8 ((a >> 16) & 255) << 16; + w1_t = uint_to_hex_lower8 ((a >> 8) & 255) << 0 + | uint_to_hex_lower8 ((a >> 0) & 255) << 16; + w2_t = uint_to_hex_lower8 ((b >> 24) & 255) << 0 + | uint_to_hex_lower8 ((b >> 16) & 255) << 16; + w3_t = uint_to_hex_lower8 ((b >> 8) & 255) << 0 + | uint_to_hex_lower8 ((b >> 0) & 255) << 16; + w4_t = uint_to_hex_lower8 ((c >> 24) & 255) << 0 + | uint_to_hex_lower8 ((c >> 16) & 255) << 16; + w5_t = uint_to_hex_lower8 ((c >> 8) & 255) << 0 + | uint_to_hex_lower8 ((c >> 0) & 255) << 16; + w6_t = uint_to_hex_lower8 ((d >> 24) & 255) << 0 + | uint_to_hex_lower8 ((d >> 16) & 255) << 16; + w7_t = uint_to_hex_lower8 ((d >> 8) & 255) << 0 + | uint_to_hex_lower8 ((d >> 0) & 255) << 16; + w8_t = uint_to_hex_lower8 ((e >> 24) & 255) << 0 + | uint_to_hex_lower8 ((e >> 16) & 255) << 16; + w9_t = uint_to_hex_lower8 ((e >> 8) & 255) << 0 + | uint_to_hex_lower8 ((e >> 0) & 255) << 16; + + wa_t = 0x80; + wb_t = 0; + wc_t = 0; + wd_t = 0; + we_t = 40 * 8; + wf_t = 0; + + a = MD5M_A; + b = MD5M_B; + c = MD5M_C; + d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t, MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t, MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t, MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t, MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w4_t, MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w5_t, MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w6_t, MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w7_t, MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w8_t, MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w9_t, MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, wa_t, MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, wb_t, MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, wc_t, MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, wd_t, MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, we_t, MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, wf_t, MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w1_t, MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w6_t, MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, wb_t, MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t, MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w5_t, MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, wa_t, MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, wf_t, MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w4_t, MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w9_t, MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, we_t, MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t, MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w8_t, MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, wd_t, MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t, MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w7_t, MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, wc_t, MD5C1f, MD5S13); + + MD5_STEP (MD5_H , a, b, c, d, w5_t, MD5C20, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w8_t, MD5C21, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, wb_t, MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, we_t, MD5C23, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w1_t, MD5C24, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w4_t, MD5C25, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w7_t, MD5C26, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, wa_t, MD5C27, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, wd_t, MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w0_t, MD5C29, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w3_t, MD5C2a, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w6_t, MD5C2b, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w9_t, MD5C2c, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, wc_t, MD5C2d, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, wf_t, MD5C2e, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w2_t, MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t, MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w7_t, MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, we_t, MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w5_t, MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, wc_t, MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t, MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, wa_t, MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t, MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w8_t, MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, wf_t, MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w6_t, MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, wd_t, MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w4_t, MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, wb_t, MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t, MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w9_t, MD5C3f, MD5S33); + + const u32x r0 = a; + const u32x r1 = d; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_M + } +} + +__device__ static void m04400s (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], const u32 pw_len, const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset) +{ + /** + * modifier + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + const u32 lid = threadIdx.x; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * loop + */ + + u32x w0l = w0[0]; + + for (u32 il_pos = 0; il_pos < bfs_cnt; il_pos++) + { + const u32 w0r = c_bfs[il_pos].i; + + w0[0] = w0l | w0r; + + /** + * sha1 + */ + + u32x w0_t = w0[0]; + u32x w1_t = w0[1]; + u32x w2_t = w0[2]; + u32x w3_t = w0[3]; + u32x w4_t = w1[0]; + u32x w5_t = w1[1]; + u32x w6_t = w1[2]; + u32x w7_t = w1[3]; + u32x w8_t = w2[0]; + u32x w9_t = w2[1]; + u32x wa_t = w2[2]; + u32x wb_t = w2[3]; + u32x wc_t = w3[0]; + u32x wd_t = w3[1]; + u32x we_t = 0; + u32x wf_t = pw_len * 8; + + u32x a = SHA1M_A; + u32x b = SHA1M_B; + u32x c = SHA1M_C; + u32x d = SHA1M_D; + u32x e = SHA1M_E; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w0_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w1_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w2_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w3_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w4_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w5_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w6_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w7_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w8_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w9_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wa_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, wb_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, wc_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, wd_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, we_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F0o, e, a, b, c, d, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F0o, d, e, a, b, c, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F0o, c, d, e, a, b, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F0o, b, c, d, e, a, w3_t); + + #undef K + #define K SHA1C01 + + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w7_t); + + #undef K + #define K SHA1C02 + + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wb_t); + + #undef K + #define K SHA1C03 + + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wf_t); + + a += SHA1M_A; + b += SHA1M_B; + c += SHA1M_C; + d += SHA1M_D; + e += SHA1M_E; + + /** + * md5 + */ + + w0_t = uint_to_hex_lower8 ((a >> 24) & 255) << 0 + | uint_to_hex_lower8 ((a >> 16) & 255) << 16; + w1_t = uint_to_hex_lower8 ((a >> 8) & 255) << 0 + | uint_to_hex_lower8 ((a >> 0) & 255) << 16; + w2_t = uint_to_hex_lower8 ((b >> 24) & 255) << 0 + | uint_to_hex_lower8 ((b >> 16) & 255) << 16; + w3_t = uint_to_hex_lower8 ((b >> 8) & 255) << 0 + | uint_to_hex_lower8 ((b >> 0) & 255) << 16; + w4_t = uint_to_hex_lower8 ((c >> 24) & 255) << 0 + | uint_to_hex_lower8 ((c >> 16) & 255) << 16; + w5_t = uint_to_hex_lower8 ((c >> 8) & 255) << 0 + | uint_to_hex_lower8 ((c >> 0) & 255) << 16; + w6_t = uint_to_hex_lower8 ((d >> 24) & 255) << 0 + | uint_to_hex_lower8 ((d >> 16) & 255) << 16; + w7_t = uint_to_hex_lower8 ((d >> 8) & 255) << 0 + | uint_to_hex_lower8 ((d >> 0) & 255) << 16; + w8_t = uint_to_hex_lower8 ((e >> 24) & 255) << 0 + | uint_to_hex_lower8 ((e >> 16) & 255) << 16; + w9_t = uint_to_hex_lower8 ((e >> 8) & 255) << 0 + | uint_to_hex_lower8 ((e >> 0) & 255) << 16; + + wa_t = 0x80; + wb_t = 0; + wc_t = 0; + wd_t = 0; + we_t = 40 * 8; + wf_t = 0; + + a = MD5M_A; + b = MD5M_B; + c = MD5M_C; + d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t, MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t, MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t, MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t, MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w4_t, MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w5_t, MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w6_t, MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w7_t, MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w8_t, MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w9_t, MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, wa_t, MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, wb_t, MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, wc_t, MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, wd_t, MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, we_t, MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, wf_t, MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w1_t, MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w6_t, MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, wb_t, MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t, MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w5_t, MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, wa_t, MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, wf_t, MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w4_t, MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w9_t, MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, we_t, MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t, MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w8_t, MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, wd_t, MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t, MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w7_t, MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, wc_t, MD5C1f, MD5S13); + + MD5_STEP (MD5_H , a, b, c, d, w5_t, MD5C20, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w8_t, MD5C21, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, wb_t, MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, we_t, MD5C23, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w1_t, MD5C24, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w4_t, MD5C25, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w7_t, MD5C26, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, wa_t, MD5C27, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, wd_t, MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w0_t, MD5C29, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w3_t, MD5C2a, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w6_t, MD5C2b, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w9_t, MD5C2c, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, wc_t, MD5C2d, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, wf_t, MD5C2e, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w2_t, MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t, MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w7_t, MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, we_t, MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w5_t, MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, wc_t, MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t, MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, wa_t, MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t, MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w8_t, MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, wf_t, MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w6_t, MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, wd_t, MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w4_t, MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, wb_t, MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t, MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w9_t, MD5C3f, MD5S33); + + const u32x r0 = a; + const u32x r1 = d; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_S + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m04400_m04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = pws[gid].i[15]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * bin2asc table + */ + + l_bin2asc[lid] = c_bin2asc[(lid >> 0) & 15] << 8 + | c_bin2asc[(lid >> 4) & 15] << 0; + + __syncthreads (); + + if (gid >= gid_max) return; + + /** + * main + */ + + m04400m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m04400_m08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = pws[gid].i[15]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * bin2asc table + */ + + l_bin2asc[lid] = c_bin2asc[(lid >> 0) & 15] << 8 + | c_bin2asc[(lid >> 4) & 15] << 0; + + __syncthreads (); + + if (gid >= gid_max) return; + + /** + * main + */ + + m04400m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m04400_m16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = pws[gid].i[ 8]; + w2[1] = pws[gid].i[ 9]; + w2[2] = pws[gid].i[10]; + w2[3] = pws[gid].i[11]; + + u32x w3[4]; + + w3[0] = pws[gid].i[12]; + w3[1] = pws[gid].i[13]; + w3[2] = pws[gid].i[14]; + w3[3] = pws[gid].i[15]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * bin2asc table + */ + + l_bin2asc[lid] = c_bin2asc[(lid >> 0) & 15] << 8 + | c_bin2asc[(lid >> 4) & 15] << 0; + + __syncthreads (); + + if (gid >= gid_max) return; + + /** + * main + */ + + m04400m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m04400_s04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = pws[gid].i[15]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * bin2asc table + */ + + l_bin2asc[lid] = c_bin2asc[(lid >> 0) & 15] << 8 + | c_bin2asc[(lid >> 4) & 15] << 0; + + __syncthreads (); + + if (gid >= gid_max) return; + + /** + * main + */ + + m04400s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m04400_s08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = pws[gid].i[15]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * bin2asc table + */ + + l_bin2asc[lid] = c_bin2asc[(lid >> 0) & 15] << 8 + | c_bin2asc[(lid >> 4) & 15] << 0; + + __syncthreads (); + + if (gid >= gid_max) return; + + /** + * main + */ + + m04400s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m04400_s16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = pws[gid].i[ 8]; + w2[1] = pws[gid].i[ 9]; + w2[2] = pws[gid].i[10]; + w2[3] = pws[gid].i[11]; + + u32x w3[4]; + + w3[0] = pws[gid].i[12]; + w3[1] = pws[gid].i[13]; + w3[2] = pws[gid].i[14]; + w3[3] = pws[gid].i[15]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * bin2asc table + */ + + l_bin2asc[lid] = c_bin2asc[(lid >> 0) & 15] << 8 + | c_bin2asc[(lid >> 4) & 15] << 0; + + __syncthreads (); + + if (gid >= gid_max) return; + + /** + * main + */ + + m04400s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} diff --git a/nv/m04500_a0.cu b/nv/m04500_a0.cu new file mode 100644 index 0000000000..290f0d82e8 --- /dev/null +++ b/nv/m04500_a0.cu @@ -0,0 +1,801 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _SHA1_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW2 +#define VECT_SIZE1 +#endif + +#define DGST_R0 3 +#define DGST_R1 4 +#define DGST_R2 2 +#define DGST_R3 1 + +#include "include/kernel_functions.c" +#include "types_nv.c" +#include "common_nv.c" +#include "include/rp_gpu.h" +#include "rp_nv.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +#ifdef VECT_SIZE1 +#define uint_to_hex_lower8_le(i) l_bin2asc[(i)] +#endif + +#ifdef VECT_SIZE2 +#define uint_to_hex_lower8_le(i) u32x (l_bin2asc[(i).x], l_bin2asc[(i).y]) +#endif + +#ifdef VECT_SIZE4 +#define uint_to_hex_lower8_le(i) u32x (l_bin2asc[(i).x], l_bin2asc[(i).y], l_bin2asc[(i).z], l_bin2asc[(i).w]) +#endif + +__device__ __constant__ char c_bin2asc[16] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' }; + +__device__ __shared__ short l_bin2asc[256]; + +__device__ __constant__ gpu_rule_t c_rules[1024]; + +extern "C" __global__ void __launch_bounds__ (256, 1) m04500_m04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + u32x pw_buf1[4]; + + pw_buf1[0] = pws[gid].i[ 4]; + pw_buf1[1] = pws[gid].i[ 5]; + pw_buf1[2] = pws[gid].i[ 6]; + pw_buf1[3] = pws[gid].i[ 7]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * bin2asc table + */ + + l_bin2asc[lid] = c_bin2asc[(lid >> 0) & 15] << 0 + | c_bin2asc[(lid >> 4) & 15] << 8; + + __syncthreads (); + + if (gid >= gid_max) return; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + + w0[0] = pw_buf0[0]; + w0[1] = pw_buf0[1]; + w0[2] = pw_buf0[2]; + w0[3] = pw_buf0[3]; + + u32x w1[4]; + + w1[0] = pw_buf1[0]; + w1[1] = pw_buf1[1]; + w1[2] = pw_buf1[2]; + w1[3] = pw_buf1[3]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 out_len = apply_rules (c_rules[il_pos].cmds, w0, w1, pw_len); + + append_0x80_2 (w0, w1, out_len); + + /** + * sha1 + */ + + u32x w0_t = swap_workaround (w0[0]); + u32x w1_t = swap_workaround (w0[1]); + u32x w2_t = swap_workaround (w0[2]); + u32x w3_t = swap_workaround (w0[3]); + u32x w4_t = swap_workaround (w1[0]); + u32x w5_t = swap_workaround (w1[1]); + u32x w6_t = swap_workaround (w1[2]); + u32x w7_t = swap_workaround (w1[3]); + u32x w8_t = swap_workaround (w2[0]); + u32x w9_t = swap_workaround (w2[1]); + u32x wa_t = swap_workaround (w2[2]); + u32x wb_t = swap_workaround (w2[3]); + u32x wc_t = swap_workaround (w3[0]); + u32x wd_t = swap_workaround (w3[1]); + u32x we_t = 0; + u32x wf_t = out_len * 8; + + u32x a = SHA1M_A; + u32x b = SHA1M_B; + u32x c = SHA1M_C; + u32x d = SHA1M_D; + u32x e = SHA1M_E; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w0_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w1_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w2_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w3_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w4_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w5_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w6_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w7_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w8_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w9_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wa_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, wb_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, wc_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, wd_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, we_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F0o, e, a, b, c, d, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F0o, d, e, a, b, c, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F0o, c, d, e, a, b, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F0o, b, c, d, e, a, w3_t); + + #undef K + #define K SHA1C01 + + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w7_t); + + #undef K + #define K SHA1C02 + + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wb_t); + + #undef K + #define K SHA1C03 + + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wf_t); + + a += SHA1M_A; + b += SHA1M_B; + c += SHA1M_C; + d += SHA1M_D; + e += SHA1M_E; + + /** + * 2nd SHA1 + */ + + w0_t = uint_to_hex_lower8_le ((a >> 16) & 255) << 0 + | uint_to_hex_lower8_le ((a >> 24) & 255) << 16; + w1_t = uint_to_hex_lower8_le ((a >> 0) & 255) << 0 + | uint_to_hex_lower8_le ((a >> 8) & 255) << 16; + w2_t = uint_to_hex_lower8_le ((b >> 16) & 255) << 0 + | uint_to_hex_lower8_le ((b >> 24) & 255) << 16; + w3_t = uint_to_hex_lower8_le ((b >> 0) & 255) << 0 + | uint_to_hex_lower8_le ((b >> 8) & 255) << 16; + w4_t = uint_to_hex_lower8_le ((c >> 16) & 255) << 0 + | uint_to_hex_lower8_le ((c >> 24) & 255) << 16; + w5_t = uint_to_hex_lower8_le ((c >> 0) & 255) << 0 + | uint_to_hex_lower8_le ((c >> 8) & 255) << 16; + w6_t = uint_to_hex_lower8_le ((d >> 16) & 255) << 0 + | uint_to_hex_lower8_le ((d >> 24) & 255) << 16; + w7_t = uint_to_hex_lower8_le ((d >> 0) & 255) << 0 + | uint_to_hex_lower8_le ((d >> 8) & 255) << 16; + w8_t = uint_to_hex_lower8_le ((e >> 16) & 255) << 0 + | uint_to_hex_lower8_le ((e >> 24) & 255) << 16; + w9_t = uint_to_hex_lower8_le ((e >> 0) & 255) << 0 + | uint_to_hex_lower8_le ((e >> 8) & 255) << 16; + + wa_t = 0x80000000; + wb_t = 0; + wc_t = 0; + wd_t = 0; + we_t = 0; + wf_t = 40 * 8; + + a = SHA1M_A; + b = SHA1M_B; + c = SHA1M_C; + d = SHA1M_D; + e = SHA1M_E; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w0_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w1_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w2_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w3_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w4_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w5_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w6_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w7_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w8_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w9_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wa_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, wb_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, wc_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, wd_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, we_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F0o, e, a, b, c, d, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F0o, d, e, a, b, c, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F0o, c, d, e, a, b, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F0o, b, c, d, e, a, w3_t); + + #undef K + #define K SHA1C01 + + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w7_t); + + #undef K + #define K SHA1C02 + + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wb_t); + + #undef K + #define K SHA1C03 + + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wb_t); + + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wf_t); + + const u32x r0 = d; + const u32x r1 = e; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_M + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m04500_m08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m04500_m16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m04500_s04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + u32x pw_buf1[4]; + + pw_buf1[0] = pws[gid].i[ 4]; + pw_buf1[1] = pws[gid].i[ 5]; + pw_buf1[2] = pws[gid].i[ 6]; + pw_buf1[3] = pws[gid].i[ 7]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * bin2asc table + */ + + l_bin2asc[lid] = c_bin2asc[(lid >> 0) & 15] << 0 + | c_bin2asc[(lid >> 4) & 15] << 8; + + __syncthreads (); + + if (gid >= gid_max) return; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * reverse + */ + + const u32 e_rev = rotl32 (search[1], 2u); + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + + w0[0] = pw_buf0[0]; + w0[1] = pw_buf0[1]; + w0[2] = pw_buf0[2]; + w0[3] = pw_buf0[3]; + + u32x w1[4]; + + w1[0] = pw_buf1[0]; + w1[1] = pw_buf1[1]; + w1[2] = pw_buf1[2]; + w1[3] = pw_buf1[3]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 out_len = apply_rules (c_rules[il_pos].cmds, w0, w1, pw_len); + + append_0x80_2 (w0, w1, out_len); + + /** + * sha1 + */ + + u32x w0_t = swap_workaround (w0[0]); + u32x w1_t = swap_workaround (w0[1]); + u32x w2_t = swap_workaround (w0[2]); + u32x w3_t = swap_workaround (w0[3]); + u32x w4_t = swap_workaround (w1[0]); + u32x w5_t = swap_workaround (w1[1]); + u32x w6_t = swap_workaround (w1[2]); + u32x w7_t = swap_workaround (w1[3]); + u32x w8_t = swap_workaround (w2[0]); + u32x w9_t = swap_workaround (w2[1]); + u32x wa_t = swap_workaround (w2[2]); + u32x wb_t = swap_workaround (w2[3]); + u32x wc_t = swap_workaround (w3[0]); + u32x wd_t = swap_workaround (w3[1]); + u32x we_t = 0; + u32x wf_t = out_len * 8; + + u32x a = SHA1M_A; + u32x b = SHA1M_B; + u32x c = SHA1M_C; + u32x d = SHA1M_D; + u32x e = SHA1M_E; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w0_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w1_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w2_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w3_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w4_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w5_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w6_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w7_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w8_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w9_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wa_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, wb_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, wc_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, wd_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, we_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F0o, e, a, b, c, d, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F0o, d, e, a, b, c, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F0o, c, d, e, a, b, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F0o, b, c, d, e, a, w3_t); + + #undef K + #define K SHA1C01 + + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w7_t); + + #undef K + #define K SHA1C02 + + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wb_t); + + #undef K + #define K SHA1C03 + + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wf_t); + + a += SHA1M_A; + b += SHA1M_B; + c += SHA1M_C; + d += SHA1M_D; + e += SHA1M_E; + + /** + * 2nd SHA1 + */ + + w0_t = uint_to_hex_lower8_le ((a >> 16) & 255) << 0 + | uint_to_hex_lower8_le ((a >> 24) & 255) << 16; + w1_t = uint_to_hex_lower8_le ((a >> 0) & 255) << 0 + | uint_to_hex_lower8_le ((a >> 8) & 255) << 16; + w2_t = uint_to_hex_lower8_le ((b >> 16) & 255) << 0 + | uint_to_hex_lower8_le ((b >> 24) & 255) << 16; + w3_t = uint_to_hex_lower8_le ((b >> 0) & 255) << 0 + | uint_to_hex_lower8_le ((b >> 8) & 255) << 16; + w4_t = uint_to_hex_lower8_le ((c >> 16) & 255) << 0 + | uint_to_hex_lower8_le ((c >> 24) & 255) << 16; + w5_t = uint_to_hex_lower8_le ((c >> 0) & 255) << 0 + | uint_to_hex_lower8_le ((c >> 8) & 255) << 16; + w6_t = uint_to_hex_lower8_le ((d >> 16) & 255) << 0 + | uint_to_hex_lower8_le ((d >> 24) & 255) << 16; + w7_t = uint_to_hex_lower8_le ((d >> 0) & 255) << 0 + | uint_to_hex_lower8_le ((d >> 8) & 255) << 16; + w8_t = uint_to_hex_lower8_le ((e >> 16) & 255) << 0 + | uint_to_hex_lower8_le ((e >> 24) & 255) << 16; + w9_t = uint_to_hex_lower8_le ((e >> 0) & 255) << 0 + | uint_to_hex_lower8_le ((e >> 8) & 255) << 16; + + wa_t = 0x80000000; + wb_t = 0; + wc_t = 0; + wd_t = 0; + we_t = 0; + wf_t = 40 * 8; + + a = SHA1M_A; + b = SHA1M_B; + c = SHA1M_C; + d = SHA1M_D; + e = SHA1M_E; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w0_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w1_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w2_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w3_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w4_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w5_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w6_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w7_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w8_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w9_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wa_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, wb_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, wc_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, wd_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, we_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F0o, e, a, b, c, d, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F0o, d, e, a, b, c, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F0o, c, d, e, a, b, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F0o, b, c, d, e, a, w3_t); + + #undef K + #define K SHA1C01 + + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w7_t); + + #undef K + #define K SHA1C02 + + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wb_t); + + #undef K + #define K SHA1C03 + + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wb_t); + + if (e != e_rev) continue; + + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wf_t); + + const u32x r0 = d; + const u32x r1 = e; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_S + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m04500_s08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m04500_s16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/nv/m04500_a1.cu b/nv/m04500_a1.cu new file mode 100644 index 0000000000..24efd79081 --- /dev/null +++ b/nv/m04500_a1.cu @@ -0,0 +1,910 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _SHA1_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW2 +#define VECT_SIZE1 +#endif + +#define DGST_R0 3 +#define DGST_R1 4 +#define DGST_R2 2 +#define DGST_R3 1 + +#include "include/kernel_functions.c" +#include "types_nv.c" +#include "common_nv.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +#ifdef VECT_SIZE1 +#define uint_to_hex_lower8_le(i) l_bin2asc[(i)] +#endif + +#ifdef VECT_SIZE2 +#define uint_to_hex_lower8_le(i) u32x (l_bin2asc[(i).x], l_bin2asc[(i).y]) +#endif + +#ifdef VECT_SIZE4 +#define uint_to_hex_lower8_le(i) u32x (l_bin2asc[(i).x], l_bin2asc[(i).y], l_bin2asc[(i).z], l_bin2asc[(i).w]) +#endif + +__device__ __constant__ char c_bin2asc[16] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' }; + +__device__ __shared__ short l_bin2asc[256]; + +__device__ __constant__ comb_t c_combs[1024]; + +extern "C" __global__ void __launch_bounds__ (256, 1) m04500_m04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + append_0x80_2 (wordl0, wordl1, pw_l_len); + + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, c_combs[0].pw_len); + } + + /** + * bin2asc table + */ + + l_bin2asc[lid] = c_bin2asc[(lid >> 0) & 15] << 0 + | c_bin2asc[(lid >> 4) & 15] << 8; + + __syncthreads (); + + if (gid >= gid_max) return; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = c_combs[il_pos].pw_len; + + const u32 pw_len = pw_l_len + pw_r_len; + + u32 wordr0[4]; + + wordr0[0] = c_combs[il_pos].i[0]; + wordr0[1] = c_combs[il_pos].i[1]; + wordr0[2] = c_combs[il_pos].i[2]; + wordr0[3] = c_combs[il_pos].i[3]; + + u32 wordr1[4]; + + wordr1[0] = c_combs[il_pos].i[4]; + wordr1[1] = c_combs[il_pos].i[5]; + wordr1[2] = c_combs[il_pos].i[6]; + wordr1[3] = c_combs[il_pos].i[7]; + + u32 wordr2[4]; + + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + + u32 wordr3[4]; + + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + append_0x80_2 (wordr0, wordr1, pw_r_len); + + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + u32x w0[4]; + + w0[0] = wordl0[0] | wordr0[0]; + w0[1] = wordl0[1] | wordr0[1]; + w0[2] = wordl0[2] | wordr0[2]; + w0[3] = wordl0[3] | wordr0[3]; + + u32x w1[4]; + + w1[0] = wordl1[0] | wordr1[0]; + w1[1] = wordl1[1] | wordr1[1]; + w1[2] = wordl1[2] | wordr1[2]; + w1[3] = wordl1[3] | wordr1[3]; + + u32x w2[4]; + + w2[0] = wordl2[0] | wordr2[0]; + w2[1] = wordl2[1] | wordr2[1]; + w2[2] = wordl2[2] | wordr2[2]; + w2[3] = wordl2[3] | wordr2[3]; + + u32x w3[4]; + + w3[0] = wordl3[0] | wordr3[0]; + w3[1] = wordl3[1] | wordr3[1]; + w3[2] = 0; + w3[3] = 0; + + /** + * sha1 + */ + + u32x w0_t = swap_workaround (w0[0]); + u32x w1_t = swap_workaround (w0[1]); + u32x w2_t = swap_workaround (w0[2]); + u32x w3_t = swap_workaround (w0[3]); + u32x w4_t = swap_workaround (w1[0]); + u32x w5_t = swap_workaround (w1[1]); + u32x w6_t = swap_workaround (w1[2]); + u32x w7_t = swap_workaround (w1[3]); + u32x w8_t = swap_workaround (w2[0]); + u32x w9_t = swap_workaround (w2[1]); + u32x wa_t = swap_workaround (w2[2]); + u32x wb_t = swap_workaround (w2[3]); + u32x wc_t = swap_workaround (w3[0]); + u32x wd_t = swap_workaround (w3[1]); + u32x we_t = 0; + u32x wf_t = pw_len * 8; + + u32x a = SHA1M_A; + u32x b = SHA1M_B; + u32x c = SHA1M_C; + u32x d = SHA1M_D; + u32x e = SHA1M_E; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w0_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w1_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w2_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w3_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w4_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w5_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w6_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w7_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w8_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w9_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wa_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, wb_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, wc_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, wd_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, we_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F0o, e, a, b, c, d, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F0o, d, e, a, b, c, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F0o, c, d, e, a, b, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F0o, b, c, d, e, a, w3_t); + + #undef K + #define K SHA1C01 + + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w7_t); + + #undef K + #define K SHA1C02 + + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wb_t); + + #undef K + #define K SHA1C03 + + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wf_t); + + a += SHA1M_A; + b += SHA1M_B; + c += SHA1M_C; + d += SHA1M_D; + e += SHA1M_E; + + /** + * 2nd SHA1 + */ + + w0_t = uint_to_hex_lower8_le ((a >> 16) & 255) << 0 + | uint_to_hex_lower8_le ((a >> 24) & 255) << 16; + w1_t = uint_to_hex_lower8_le ((a >> 0) & 255) << 0 + | uint_to_hex_lower8_le ((a >> 8) & 255) << 16; + w2_t = uint_to_hex_lower8_le ((b >> 16) & 255) << 0 + | uint_to_hex_lower8_le ((b >> 24) & 255) << 16; + w3_t = uint_to_hex_lower8_le ((b >> 0) & 255) << 0 + | uint_to_hex_lower8_le ((b >> 8) & 255) << 16; + w4_t = uint_to_hex_lower8_le ((c >> 16) & 255) << 0 + | uint_to_hex_lower8_le ((c >> 24) & 255) << 16; + w5_t = uint_to_hex_lower8_le ((c >> 0) & 255) << 0 + | uint_to_hex_lower8_le ((c >> 8) & 255) << 16; + w6_t = uint_to_hex_lower8_le ((d >> 16) & 255) << 0 + | uint_to_hex_lower8_le ((d >> 24) & 255) << 16; + w7_t = uint_to_hex_lower8_le ((d >> 0) & 255) << 0 + | uint_to_hex_lower8_le ((d >> 8) & 255) << 16; + w8_t = uint_to_hex_lower8_le ((e >> 16) & 255) << 0 + | uint_to_hex_lower8_le ((e >> 24) & 255) << 16; + w9_t = uint_to_hex_lower8_le ((e >> 0) & 255) << 0 + | uint_to_hex_lower8_le ((e >> 8) & 255) << 16; + + wa_t = 0x80000000; + wb_t = 0; + wc_t = 0; + wd_t = 0; + we_t = 0; + wf_t = 40 * 8; + + a = SHA1M_A; + b = SHA1M_B; + c = SHA1M_C; + d = SHA1M_D; + e = SHA1M_E; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w0_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w1_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w2_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w3_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w4_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w5_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w6_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w7_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w8_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w9_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wa_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, wb_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, wc_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, wd_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, we_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F0o, e, a, b, c, d, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F0o, d, e, a, b, c, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F0o, c, d, e, a, b, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F0o, b, c, d, e, a, w3_t); + + #undef K + #define K SHA1C01 + + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w7_t); + + #undef K + #define K SHA1C02 + + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wb_t); + + #undef K + #define K SHA1C03 + + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wf_t); + + const u32x r0 = d; + const u32x r1 = e; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_M + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m04500_m08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m04500_m16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m04500_s04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + append_0x80_2 (wordl0, wordl1, pw_l_len); + + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, c_combs[0].pw_len); + } + + /** + * bin2asc table + */ + + l_bin2asc[lid] = c_bin2asc[(lid >> 0) & 15] << 0 + | c_bin2asc[(lid >> 4) & 15] << 8; + + __syncthreads (); + + if (gid >= gid_max) return; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * reverse + */ + + const u32 e_rev = rotl32 (search[1], 2u); + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = c_combs[il_pos].pw_len; + + const u32 pw_len = pw_l_len + pw_r_len; + + u32 wordr0[4]; + + wordr0[0] = c_combs[il_pos].i[0]; + wordr0[1] = c_combs[il_pos].i[1]; + wordr0[2] = c_combs[il_pos].i[2]; + wordr0[3] = c_combs[il_pos].i[3]; + + u32 wordr1[4]; + + wordr1[0] = c_combs[il_pos].i[4]; + wordr1[1] = c_combs[il_pos].i[5]; + wordr1[2] = c_combs[il_pos].i[6]; + wordr1[3] = c_combs[il_pos].i[7]; + + u32 wordr2[4]; + + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + + u32 wordr3[4]; + + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + append_0x80_2 (wordr0, wordr1, pw_r_len); + + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + u32x w0[4]; + + w0[0] = wordl0[0] | wordr0[0]; + w0[1] = wordl0[1] | wordr0[1]; + w0[2] = wordl0[2] | wordr0[2]; + w0[3] = wordl0[3] | wordr0[3]; + + u32x w1[4]; + + w1[0] = wordl1[0] | wordr1[0]; + w1[1] = wordl1[1] | wordr1[1]; + w1[2] = wordl1[2] | wordr1[2]; + w1[3] = wordl1[3] | wordr1[3]; + + u32x w2[4]; + + w2[0] = wordl2[0] | wordr2[0]; + w2[1] = wordl2[1] | wordr2[1]; + w2[2] = wordl2[2] | wordr2[2]; + w2[3] = wordl2[3] | wordr2[3]; + + u32x w3[4]; + + w3[0] = wordl3[0] | wordr3[0]; + w3[1] = wordl3[1] | wordr3[1]; + w3[2] = 0; + w3[3] = 0; + + /** + * sha1 + */ + + u32x w0_t = swap_workaround (w0[0]); + u32x w1_t = swap_workaround (w0[1]); + u32x w2_t = swap_workaround (w0[2]); + u32x w3_t = swap_workaround (w0[3]); + u32x w4_t = swap_workaround (w1[0]); + u32x w5_t = swap_workaround (w1[1]); + u32x w6_t = swap_workaround (w1[2]); + u32x w7_t = swap_workaround (w1[3]); + u32x w8_t = swap_workaround (w2[0]); + u32x w9_t = swap_workaround (w2[1]); + u32x wa_t = swap_workaround (w2[2]); + u32x wb_t = swap_workaround (w2[3]); + u32x wc_t = swap_workaround (w3[0]); + u32x wd_t = swap_workaround (w3[1]); + u32x we_t = 0; + u32x wf_t = pw_len * 8; + + u32x a = SHA1M_A; + u32x b = SHA1M_B; + u32x c = SHA1M_C; + u32x d = SHA1M_D; + u32x e = SHA1M_E; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w0_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w1_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w2_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w3_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w4_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w5_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w6_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w7_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w8_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w9_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wa_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, wb_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, wc_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, wd_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, we_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F0o, e, a, b, c, d, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F0o, d, e, a, b, c, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F0o, c, d, e, a, b, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F0o, b, c, d, e, a, w3_t); + + #undef K + #define K SHA1C01 + + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w7_t); + + #undef K + #define K SHA1C02 + + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wb_t); + + #undef K + #define K SHA1C03 + + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wf_t); + + a += SHA1M_A; + b += SHA1M_B; + c += SHA1M_C; + d += SHA1M_D; + e += SHA1M_E; + + /** + * 2nd SHA1 + */ + + w0_t = uint_to_hex_lower8_le ((a >> 16) & 255) << 0 + | uint_to_hex_lower8_le ((a >> 24) & 255) << 16; + w1_t = uint_to_hex_lower8_le ((a >> 0) & 255) << 0 + | uint_to_hex_lower8_le ((a >> 8) & 255) << 16; + w2_t = uint_to_hex_lower8_le ((b >> 16) & 255) << 0 + | uint_to_hex_lower8_le ((b >> 24) & 255) << 16; + w3_t = uint_to_hex_lower8_le ((b >> 0) & 255) << 0 + | uint_to_hex_lower8_le ((b >> 8) & 255) << 16; + w4_t = uint_to_hex_lower8_le ((c >> 16) & 255) << 0 + | uint_to_hex_lower8_le ((c >> 24) & 255) << 16; + w5_t = uint_to_hex_lower8_le ((c >> 0) & 255) << 0 + | uint_to_hex_lower8_le ((c >> 8) & 255) << 16; + w6_t = uint_to_hex_lower8_le ((d >> 16) & 255) << 0 + | uint_to_hex_lower8_le ((d >> 24) & 255) << 16; + w7_t = uint_to_hex_lower8_le ((d >> 0) & 255) << 0 + | uint_to_hex_lower8_le ((d >> 8) & 255) << 16; + w8_t = uint_to_hex_lower8_le ((e >> 16) & 255) << 0 + | uint_to_hex_lower8_le ((e >> 24) & 255) << 16; + w9_t = uint_to_hex_lower8_le ((e >> 0) & 255) << 0 + | uint_to_hex_lower8_le ((e >> 8) & 255) << 16; + + wa_t = 0x80000000; + wb_t = 0; + wc_t = 0; + wd_t = 0; + we_t = 0; + wf_t = 40 * 8; + + a = SHA1M_A; + b = SHA1M_B; + c = SHA1M_C; + d = SHA1M_D; + e = SHA1M_E; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w0_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w1_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w2_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w3_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w4_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w5_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w6_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w7_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w8_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w9_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wa_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, wb_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, wc_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, wd_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, we_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F0o, e, a, b, c, d, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F0o, d, e, a, b, c, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F0o, c, d, e, a, b, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F0o, b, c, d, e, a, w3_t); + + #undef K + #define K SHA1C01 + + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w7_t); + + #undef K + #define K SHA1C02 + + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wb_t); + + #undef K + #define K SHA1C03 + + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wb_t); + + if (e != e_rev) continue; + + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wf_t); + + const u32x r0 = d; + const u32x r1 = e; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_S + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m04500_s08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m04500_s16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/nv/m04500_a3.cu b/nv/m04500_a3.cu new file mode 100644 index 0000000000..0bf6062ea5 --- /dev/null +++ b/nv/m04500_a3.cu @@ -0,0 +1,1039 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _SHA1_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW2 +#define VECT_SIZE1 +#endif + +#define DGST_R0 3 +#define DGST_R1 4 +#define DGST_R2 2 +#define DGST_R3 1 + +#include "include/kernel_functions.c" +#include "types_nv.c" +#include "common_nv.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +#ifdef VECT_SIZE1 +#define uint_to_hex_lower8_le(i) l_bin2asc[(i)] +#endif + +#ifdef VECT_SIZE2 +#define uint_to_hex_lower8_le(i) u32x (l_bin2asc[(i).x], l_bin2asc[(i).y]) +#endif + +#ifdef VECT_SIZE4 +#define uint_to_hex_lower8_le(i) u32x (l_bin2asc[(i).x], l_bin2asc[(i).y], l_bin2asc[(i).z], l_bin2asc[(i).w]) +#endif + +__device__ __constant__ char c_bin2asc[16] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' }; + +__device__ __shared__ short l_bin2asc[256]; + +__device__ __constant__ bf_t c_bfs[1024]; + +__device__ static void m04500m (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], const u32 pw_len, const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset) +{ + /** + * modifier + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + const u32 lid = threadIdx.x; + + /** + * loop + */ + + u32x w0l = w0[0]; + + for (u32 il_pos = 0; il_pos < bfs_cnt; il_pos++) + { + const u32 w0r = c_bfs[il_pos].i; + + w0[0] = w0l | w0r; + + /** + * sha1 + */ + + u32x w0_t = w0[0]; + u32x w1_t = w0[1]; + u32x w2_t = w0[2]; + u32x w3_t = w0[3]; + u32x w4_t = w1[0]; + u32x w5_t = w1[1]; + u32x w6_t = w1[2]; + u32x w7_t = w1[3]; + u32x w8_t = w2[0]; + u32x w9_t = w2[1]; + u32x wa_t = w2[2]; + u32x wb_t = w2[3]; + u32x wc_t = w3[0]; + u32x wd_t = w3[1]; + u32x we_t = 0; + u32x wf_t = pw_len * 8; + + u32x a = SHA1M_A; + u32x b = SHA1M_B; + u32x c = SHA1M_C; + u32x d = SHA1M_D; + u32x e = SHA1M_E; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w0_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w1_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w2_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w3_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w4_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w5_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w6_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w7_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w8_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w9_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wa_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, wb_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, wc_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, wd_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, we_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F0o, e, a, b, c, d, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F0o, d, e, a, b, c, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F0o, c, d, e, a, b, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F0o, b, c, d, e, a, w3_t); + + #undef K + #define K SHA1C01 + + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w7_t); + + #undef K + #define K SHA1C02 + + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wb_t); + + #undef K + #define K SHA1C03 + + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wf_t); + + a += SHA1M_A; + b += SHA1M_B; + c += SHA1M_C; + d += SHA1M_D; + e += SHA1M_E; + + /** + * 2nd SHA1 + */ + + w0_t = uint_to_hex_lower8_le ((a >> 16) & 255) << 0 + | uint_to_hex_lower8_le ((a >> 24) & 255) << 16; + w1_t = uint_to_hex_lower8_le ((a >> 0) & 255) << 0 + | uint_to_hex_lower8_le ((a >> 8) & 255) << 16; + w2_t = uint_to_hex_lower8_le ((b >> 16) & 255) << 0 + | uint_to_hex_lower8_le ((b >> 24) & 255) << 16; + w3_t = uint_to_hex_lower8_le ((b >> 0) & 255) << 0 + | uint_to_hex_lower8_le ((b >> 8) & 255) << 16; + w4_t = uint_to_hex_lower8_le ((c >> 16) & 255) << 0 + | uint_to_hex_lower8_le ((c >> 24) & 255) << 16; + w5_t = uint_to_hex_lower8_le ((c >> 0) & 255) << 0 + | uint_to_hex_lower8_le ((c >> 8) & 255) << 16; + w6_t = uint_to_hex_lower8_le ((d >> 16) & 255) << 0 + | uint_to_hex_lower8_le ((d >> 24) & 255) << 16; + w7_t = uint_to_hex_lower8_le ((d >> 0) & 255) << 0 + | uint_to_hex_lower8_le ((d >> 8) & 255) << 16; + w8_t = uint_to_hex_lower8_le ((e >> 16) & 255) << 0 + | uint_to_hex_lower8_le ((e >> 24) & 255) << 16; + w9_t = uint_to_hex_lower8_le ((e >> 0) & 255) << 0 + | uint_to_hex_lower8_le ((e >> 8) & 255) << 16; + + wa_t = 0x80000000; + wb_t = 0; + wc_t = 0; + wd_t = 0; + we_t = 0; + wf_t = 40 * 8; + + a = SHA1M_A; + b = SHA1M_B; + c = SHA1M_C; + d = SHA1M_D; + e = SHA1M_E; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w0_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w1_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w2_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w3_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w4_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w5_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w6_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w7_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w8_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w9_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wa_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, wb_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, wc_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, wd_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, we_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F0o, e, a, b, c, d, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F0o, d, e, a, b, c, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F0o, c, d, e, a, b, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F0o, b, c, d, e, a, w3_t); + + #undef K + #define K SHA1C01 + + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w7_t); + + #undef K + #define K SHA1C02 + + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wb_t); + + #undef K + #define K SHA1C03 + + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wf_t); + + const u32x r0 = d; + const u32x r1 = e; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_M + } +} + +__device__ static void m04500s (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], const u32 pw_len, const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset) +{ + /** + * modifier + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + const u32 lid = threadIdx.x; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * reverse + */ + + const u32 e_rev = rotl32 (search[1], 2u); + + /** + * loop + */ + + u32x w0l = w0[0]; + + for (u32 il_pos = 0; il_pos < bfs_cnt; il_pos++) + { + const u32 w0r = c_bfs[il_pos].i; + + w0[0] = w0l | w0r; + + /** + * sha1 + */ + + u32x w0_t = w0[0]; + u32x w1_t = w0[1]; + u32x w2_t = w0[2]; + u32x w3_t = w0[3]; + u32x w4_t = w1[0]; + u32x w5_t = w1[1]; + u32x w6_t = w1[2]; + u32x w7_t = w1[3]; + u32x w8_t = w2[0]; + u32x w9_t = w2[1]; + u32x wa_t = w2[2]; + u32x wb_t = w2[3]; + u32x wc_t = w3[0]; + u32x wd_t = w3[1]; + u32x we_t = 0; + u32x wf_t = pw_len * 8; + + u32x a = SHA1M_A; + u32x b = SHA1M_B; + u32x c = SHA1M_C; + u32x d = SHA1M_D; + u32x e = SHA1M_E; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w0_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w1_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w2_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w3_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w4_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w5_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w6_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w7_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w8_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w9_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wa_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, wb_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, wc_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, wd_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, we_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F0o, e, a, b, c, d, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F0o, d, e, a, b, c, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F0o, c, d, e, a, b, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F0o, b, c, d, e, a, w3_t); + + #undef K + #define K SHA1C01 + + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w7_t); + + #undef K + #define K SHA1C02 + + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wb_t); + + #undef K + #define K SHA1C03 + + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wf_t); + + a += SHA1M_A; + b += SHA1M_B; + c += SHA1M_C; + d += SHA1M_D; + e += SHA1M_E; + + /** + * 2nd SHA1 + */ + + w0_t = uint_to_hex_lower8_le ((a >> 16) & 255) << 0 + | uint_to_hex_lower8_le ((a >> 24) & 255) << 16; + w1_t = uint_to_hex_lower8_le ((a >> 0) & 255) << 0 + | uint_to_hex_lower8_le ((a >> 8) & 255) << 16; + w2_t = uint_to_hex_lower8_le ((b >> 16) & 255) << 0 + | uint_to_hex_lower8_le ((b >> 24) & 255) << 16; + w3_t = uint_to_hex_lower8_le ((b >> 0) & 255) << 0 + | uint_to_hex_lower8_le ((b >> 8) & 255) << 16; + w4_t = uint_to_hex_lower8_le ((c >> 16) & 255) << 0 + | uint_to_hex_lower8_le ((c >> 24) & 255) << 16; + w5_t = uint_to_hex_lower8_le ((c >> 0) & 255) << 0 + | uint_to_hex_lower8_le ((c >> 8) & 255) << 16; + w6_t = uint_to_hex_lower8_le ((d >> 16) & 255) << 0 + | uint_to_hex_lower8_le ((d >> 24) & 255) << 16; + w7_t = uint_to_hex_lower8_le ((d >> 0) & 255) << 0 + | uint_to_hex_lower8_le ((d >> 8) & 255) << 16; + w8_t = uint_to_hex_lower8_le ((e >> 16) & 255) << 0 + | uint_to_hex_lower8_le ((e >> 24) & 255) << 16; + w9_t = uint_to_hex_lower8_le ((e >> 0) & 255) << 0 + | uint_to_hex_lower8_le ((e >> 8) & 255) << 16; + + wa_t = 0x80000000; + wb_t = 0; + wc_t = 0; + wd_t = 0; + we_t = 0; + wf_t = 40 * 8; + + a = SHA1M_A; + b = SHA1M_B; + c = SHA1M_C; + d = SHA1M_D; + e = SHA1M_E; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w0_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w1_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w2_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w3_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w4_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w5_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w6_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w7_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w8_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w9_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wa_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, wb_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, wc_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, wd_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, we_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F0o, e, a, b, c, d, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F0o, d, e, a, b, c, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F0o, c, d, e, a, b, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F0o, b, c, d, e, a, w3_t); + + #undef K + #define K SHA1C01 + + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w7_t); + + #undef K + #define K SHA1C02 + + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wb_t); + + #undef K + #define K SHA1C03 + + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wb_t); + + if (e != e_rev) continue; + + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wf_t); + + const u32x r0 = d; + const u32x r1 = e; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_S + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m04500_m04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = pws[gid].i[15]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * bin2asc table + */ + + l_bin2asc[lid] = c_bin2asc[(lid >> 0) & 15] << 0 + | c_bin2asc[(lid >> 4) & 15] << 8; + + __syncthreads (); + + if (gid >= gid_max) return; + + /** + * main + */ + + m04500m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m04500_m08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = pws[gid].i[15]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * bin2asc table + */ + + l_bin2asc[lid] = c_bin2asc[(lid >> 0) & 15] << 0 + | c_bin2asc[(lid >> 4) & 15] << 8; + + __syncthreads (); + + if (gid >= gid_max) return; + + /** + * main + */ + + m04500m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m04500_m16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = pws[gid].i[ 8]; + w2[1] = pws[gid].i[ 9]; + w2[2] = pws[gid].i[10]; + w2[3] = pws[gid].i[11]; + + u32x w3[4]; + + w3[0] = pws[gid].i[12]; + w3[1] = pws[gid].i[13]; + w3[2] = pws[gid].i[14]; + w3[3] = pws[gid].i[15]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * bin2asc table + */ + + l_bin2asc[lid] = c_bin2asc[(lid >> 0) & 15] << 0 + | c_bin2asc[(lid >> 4) & 15] << 8; + + __syncthreads (); + + if (gid >= gid_max) return; + + /** + * main + */ + + m04500m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m04500_s04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = pws[gid].i[15]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * bin2asc table + */ + + l_bin2asc[lid] = c_bin2asc[(lid >> 0) & 15] << 0 + | c_bin2asc[(lid >> 4) & 15] << 8; + + __syncthreads (); + + if (gid >= gid_max) return; + + /** + * main + */ + + m04500s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m04500_s08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = pws[gid].i[15]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * bin2asc table + */ + + l_bin2asc[lid] = c_bin2asc[(lid >> 0) & 15] << 0 + | c_bin2asc[(lid >> 4) & 15] << 8; + + __syncthreads (); + + if (gid >= gid_max) return; + + /** + * main + */ + + m04500s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m04500_s16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = pws[gid].i[ 8]; + w2[1] = pws[gid].i[ 9]; + w2[2] = pws[gid].i[10]; + w2[3] = pws[gid].i[11]; + + u32x w3[4]; + + w3[0] = pws[gid].i[12]; + w3[1] = pws[gid].i[13]; + w3[2] = pws[gid].i[14]; + w3[3] = pws[gid].i[15]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * bin2asc table + */ + + l_bin2asc[lid] = c_bin2asc[(lid >> 0) & 15] << 0 + | c_bin2asc[(lid >> 4) & 15] << 8; + + __syncthreads (); + + if (gid >= gid_max) return; + + /** + * main + */ + + m04500s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} diff --git a/nv/m04700_a0.cu b/nv/m04700_a0.cu new file mode 100644 index 0000000000..bc901a1733 --- /dev/null +++ b/nv/m04700_a0.cu @@ -0,0 +1,707 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _SHA1_MD5_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW2 +#define VECT_SIZE1 +#endif + +#define DGST_R0 3 +#define DGST_R1 4 +#define DGST_R2 2 +#define DGST_R3 1 + +#include "include/kernel_functions.c" +#undef _MD5_ +#include "types_nv.c" +#include "common_nv.c" +#include "include/rp_gpu.h" +#include "rp_nv.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +#ifdef VECT_SIZE1 +#define uint_to_hex_lower8_le(i) l_bin2asc[(i)] +#endif + +#ifdef VECT_SIZE2 +#define uint_to_hex_lower8_le(i) u32x (l_bin2asc[(i).x], l_bin2asc[(i).y]) +#endif + +#ifdef VECT_SIZE4 +#define uint_to_hex_lower8_le(i) u32x (l_bin2asc[(i).x], l_bin2asc[(i).y], l_bin2asc[(i).z], l_bin2asc[(i).w]) +#endif + +__device__ __constant__ char c_bin2asc[16] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' }; + +__device__ __shared__ short l_bin2asc[256]; + +__device__ __constant__ gpu_rule_t c_rules[1024]; + +extern "C" __global__ void __launch_bounds__ (256, 1) m04700_m04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + u32x pw_buf1[4]; + + pw_buf1[0] = pws[gid].i[ 4]; + pw_buf1[1] = pws[gid].i[ 5]; + pw_buf1[2] = pws[gid].i[ 6]; + pw_buf1[3] = pws[gid].i[ 7]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * bin2asc table + */ + + l_bin2asc[lid] = c_bin2asc[(lid >> 0) & 15] << 0 + | c_bin2asc[(lid >> 4) & 15] << 8; + + __syncthreads (); + + if (gid >= gid_max) return; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + + w0[0] = pw_buf0[0]; + w0[1] = pw_buf0[1]; + w0[2] = pw_buf0[2]; + w0[3] = pw_buf0[3]; + + u32x w1[4]; + + w1[0] = pw_buf1[0]; + w1[1] = pw_buf1[1]; + w1[2] = pw_buf1[2]; + w1[3] = pw_buf1[3]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = pw_len * 8; + w3[3] = 0; + + const u32 out_len = apply_rules (c_rules[il_pos].cmds, w0, w1, pw_len); + + append_0x80_2 (w0, w1, out_len); + + /** + * md5 + */ + + u32x a = MD5M_A; + u32x b = MD5M_B; + u32x c = MD5M_C; + u32x d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H , a, b, c, d, w1[1], MD5C20, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w2[0], MD5C21, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w2[3], MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w3[2], MD5C23, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w0[1], MD5C24, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w1[0], MD5C25, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w1[3], MD5C26, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w2[2], MD5C27, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w3[1], MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w0[0], MD5C29, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w0[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w1[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w2[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w3[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w3[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w0[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1[0], MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w2[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2[1], MD5C3f, MD5S33); + + a += MD5M_A; + b += MD5M_B; + c += MD5M_C; + d += MD5M_D; + + /* + * sha1 + */ + + u32x w0_t = uint_to_hex_lower8_le ((a >> 8) & 255) << 0 + | uint_to_hex_lower8_le ((a >> 0) & 255) << 16; + u32x w1_t = uint_to_hex_lower8_le ((a >> 24) & 255) << 0 + | uint_to_hex_lower8_le ((a >> 16) & 255) << 16; + u32x w2_t = uint_to_hex_lower8_le ((b >> 8) & 255) << 0 + | uint_to_hex_lower8_le ((b >> 0) & 255) << 16; + u32x w3_t = uint_to_hex_lower8_le ((b >> 24) & 255) << 0 + | uint_to_hex_lower8_le ((b >> 16) & 255) << 16; + u32x w4_t = uint_to_hex_lower8_le ((c >> 8) & 255) << 0 + | uint_to_hex_lower8_le ((c >> 0) & 255) << 16; + u32x w5_t = uint_to_hex_lower8_le ((c >> 24) & 255) << 0 + | uint_to_hex_lower8_le ((c >> 16) & 255) << 16; + u32x w6_t = uint_to_hex_lower8_le ((d >> 8) & 255) << 0 + | uint_to_hex_lower8_le ((d >> 0) & 255) << 16; + u32x w7_t = uint_to_hex_lower8_le ((d >> 24) & 255) << 0 + | uint_to_hex_lower8_le ((d >> 16) & 255) << 16; + + u32x w8_t = 0x80000000; + u32x w9_t = 0; + u32x wa_t = 0; + u32x wb_t = 0; + u32x wc_t = 0; + u32x wd_t = 0; + u32x we_t = 0; + u32x wf_t = 32 * 8; + + u32x e; + + a = SHA1M_A; + b = SHA1M_B; + c = SHA1M_C; + d = SHA1M_D; + e = SHA1M_E; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w0_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w1_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w2_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w3_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w4_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w5_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w6_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w7_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w8_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w9_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wa_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, wb_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, wc_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, wd_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, we_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F0o, e, a, b, c, d, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F0o, d, e, a, b, c, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F0o, c, d, e, a, b, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F0o, b, c, d, e, a, w3_t); + + #undef K + #define K SHA1C01 + + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w7_t); + + #undef K + #define K SHA1C02 + + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wb_t); + + #undef K + #define K SHA1C03 + + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wf_t); + + const u32x r0 = d; + const u32x r1 = e; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_M + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m04700_m08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m04700_m16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m04700_s04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + u32x pw_buf1[4]; + + pw_buf1[0] = pws[gid].i[ 4]; + pw_buf1[1] = pws[gid].i[ 5]; + pw_buf1[2] = pws[gid].i[ 6]; + pw_buf1[3] = pws[gid].i[ 7]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * bin2asc table + */ + + l_bin2asc[lid] = c_bin2asc[(lid >> 0) & 15] << 0 + | c_bin2asc[(lid >> 4) & 15] << 8; + + __syncthreads (); + + if (gid >= gid_max) return; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * reverse + */ + + const u32 e_rev = rotl32 (search[1], 2u); + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + + w0[0] = pw_buf0[0]; + w0[1] = pw_buf0[1]; + w0[2] = pw_buf0[2]; + w0[3] = pw_buf0[3]; + + u32x w1[4]; + + w1[0] = pw_buf1[0]; + w1[1] = pw_buf1[1]; + w1[2] = pw_buf1[2]; + w1[3] = pw_buf1[3]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = pw_len * 8; + w3[3] = 0; + + const u32 out_len = apply_rules (c_rules[il_pos].cmds, w0, w1, pw_len); + + append_0x80_2 (w0, w1, out_len); + + /** + * md5 + */ + + u32x a = MD5M_A; + u32x b = MD5M_B; + u32x c = MD5M_C; + u32x d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H , a, b, c, d, w1[1], MD5C20, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w2[0], MD5C21, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w2[3], MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w3[2], MD5C23, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w0[1], MD5C24, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w1[0], MD5C25, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w1[3], MD5C26, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w2[2], MD5C27, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w3[1], MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w0[0], MD5C29, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w0[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w1[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w2[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w3[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w3[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w0[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1[0], MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w2[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2[1], MD5C3f, MD5S33); + + a += MD5M_A; + b += MD5M_B; + c += MD5M_C; + d += MD5M_D; + + /* + * sha1 + */ + + u32x w0_t = uint_to_hex_lower8_le ((a >> 8) & 255) << 0 + | uint_to_hex_lower8_le ((a >> 0) & 255) << 16; + u32x w1_t = uint_to_hex_lower8_le ((a >> 24) & 255) << 0 + | uint_to_hex_lower8_le ((a >> 16) & 255) << 16; + u32x w2_t = uint_to_hex_lower8_le ((b >> 8) & 255) << 0 + | uint_to_hex_lower8_le ((b >> 0) & 255) << 16; + u32x w3_t = uint_to_hex_lower8_le ((b >> 24) & 255) << 0 + | uint_to_hex_lower8_le ((b >> 16) & 255) << 16; + u32x w4_t = uint_to_hex_lower8_le ((c >> 8) & 255) << 0 + | uint_to_hex_lower8_le ((c >> 0) & 255) << 16; + u32x w5_t = uint_to_hex_lower8_le ((c >> 24) & 255) << 0 + | uint_to_hex_lower8_le ((c >> 16) & 255) << 16; + u32x w6_t = uint_to_hex_lower8_le ((d >> 8) & 255) << 0 + | uint_to_hex_lower8_le ((d >> 0) & 255) << 16; + u32x w7_t = uint_to_hex_lower8_le ((d >> 24) & 255) << 0 + | uint_to_hex_lower8_le ((d >> 16) & 255) << 16; + + u32x w8_t = 0x80000000; + u32x w9_t = 0; + u32x wa_t = 0; + u32x wb_t = 0; + u32x wc_t = 0; + u32x wd_t = 0; + u32x we_t = 0; + u32x wf_t = 32 * 8; + + u32x e; + + a = SHA1M_A; + b = SHA1M_B; + c = SHA1M_C; + d = SHA1M_D; + e = SHA1M_E; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w0_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w1_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w2_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w3_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w4_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w5_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w6_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w7_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w8_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w9_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wa_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, wb_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, wc_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, wd_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, we_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F0o, e, a, b, c, d, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F0o, d, e, a, b, c, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F0o, c, d, e, a, b, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F0o, b, c, d, e, a, w3_t); + + #undef K + #define K SHA1C01 + + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w7_t); + + #undef K + #define K SHA1C02 + + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wb_t); + + #undef K + #define K SHA1C03 + + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wb_t); + + if (e != e_rev) continue; + + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wf_t); + + const u32x r0 = d; + const u32x r1 = e; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_S + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m04700_s08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m04700_s16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/nv/m04700_a1.cu b/nv/m04700_a1.cu new file mode 100644 index 0000000000..5894c98375 --- /dev/null +++ b/nv/m04700_a1.cu @@ -0,0 +1,817 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _SHA1_MD5_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW2 +#define VECT_SIZE1 +#endif + +#define DGST_R0 3 +#define DGST_R1 4 +#define DGST_R2 2 +#define DGST_R3 1 + +#include "include/kernel_functions.c" +#undef _MD5_ +#include "types_nv.c" +#include "common_nv.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +#ifdef VECT_SIZE1 +#define uint_to_hex_lower8_le(i) l_bin2asc[(i)] +#endif + +#ifdef VECT_SIZE2 +#define uint_to_hex_lower8_le(i) u32x (l_bin2asc[(i).x], l_bin2asc[(i).y]) +#endif + +#ifdef VECT_SIZE4 +#define uint_to_hex_lower8_le(i) u32x (l_bin2asc[(i).x], l_bin2asc[(i).y], l_bin2asc[(i).z], l_bin2asc[(i).w]) +#endif + +__device__ __constant__ char c_bin2asc[16] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' }; + +__device__ __shared__ short l_bin2asc[256]; + +__device__ __constant__ comb_t c_combs[1024]; + +extern "C" __global__ void __launch_bounds__ (256, 1) m04700_m04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + append_0x80_2 (wordl0, wordl1, pw_l_len); + + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, c_combs[0].pw_len); + } + + /** + * bin2asc table + */ + + l_bin2asc[lid] = c_bin2asc[(lid >> 0) & 15] << 0 + | c_bin2asc[(lid >> 4) & 15] << 8; + + __syncthreads (); + + if (gid >= gid_max) return; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = c_combs[il_pos].pw_len; + + const u32 pw_len = pw_l_len + pw_r_len; + + u32 wordr0[4]; + + wordr0[0] = c_combs[il_pos].i[0]; + wordr0[1] = c_combs[il_pos].i[1]; + wordr0[2] = c_combs[il_pos].i[2]; + wordr0[3] = c_combs[il_pos].i[3]; + + u32 wordr1[4]; + + wordr1[0] = c_combs[il_pos].i[4]; + wordr1[1] = c_combs[il_pos].i[5]; + wordr1[2] = c_combs[il_pos].i[6]; + wordr1[3] = c_combs[il_pos].i[7]; + + u32 wordr2[4]; + + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + + u32 wordr3[4]; + + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + append_0x80_2 (wordr0, wordr1, pw_r_len); + + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + u32x w0[4]; + + w0[0] = wordl0[0] | wordr0[0]; + w0[1] = wordl0[1] | wordr0[1]; + w0[2] = wordl0[2] | wordr0[2]; + w0[3] = wordl0[3] | wordr0[3]; + + u32x w1[4]; + + w1[0] = wordl1[0] | wordr1[0]; + w1[1] = wordl1[1] | wordr1[1]; + w1[2] = wordl1[2] | wordr1[2]; + w1[3] = wordl1[3] | wordr1[3]; + + u32x w2[4]; + + w2[0] = wordl2[0] | wordr2[0]; + w2[1] = wordl2[1] | wordr2[1]; + w2[2] = wordl2[2] | wordr2[2]; + w2[3] = wordl2[3] | wordr2[3]; + + u32x w3[4]; + + w3[0] = wordl3[0] | wordr3[0]; + w3[1] = wordl3[1] | wordr3[1]; + w3[2] = pw_len * 8; + w3[3] = 0; + + /** + * md5 + */ + + u32x a = MD5M_A; + u32x b = MD5M_B; + u32x c = MD5M_C; + u32x d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H , a, b, c, d, w1[1], MD5C20, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w2[0], MD5C21, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w2[3], MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w3[2], MD5C23, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w0[1], MD5C24, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w1[0], MD5C25, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w1[3], MD5C26, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w2[2], MD5C27, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w3[1], MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w0[0], MD5C29, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w0[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w1[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w2[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w3[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w3[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w0[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1[0], MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w2[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2[1], MD5C3f, MD5S33); + + a += MD5M_A; + b += MD5M_B; + c += MD5M_C; + d += MD5M_D; + + /* + * sha1 + */ + + u32x w0_t = uint_to_hex_lower8_le ((a >> 8) & 255) << 0 + | uint_to_hex_lower8_le ((a >> 0) & 255) << 16; + u32x w1_t = uint_to_hex_lower8_le ((a >> 24) & 255) << 0 + | uint_to_hex_lower8_le ((a >> 16) & 255) << 16; + u32x w2_t = uint_to_hex_lower8_le ((b >> 8) & 255) << 0 + | uint_to_hex_lower8_le ((b >> 0) & 255) << 16; + u32x w3_t = uint_to_hex_lower8_le ((b >> 24) & 255) << 0 + | uint_to_hex_lower8_le ((b >> 16) & 255) << 16; + u32x w4_t = uint_to_hex_lower8_le ((c >> 8) & 255) << 0 + | uint_to_hex_lower8_le ((c >> 0) & 255) << 16; + u32x w5_t = uint_to_hex_lower8_le ((c >> 24) & 255) << 0 + | uint_to_hex_lower8_le ((c >> 16) & 255) << 16; + u32x w6_t = uint_to_hex_lower8_le ((d >> 8) & 255) << 0 + | uint_to_hex_lower8_le ((d >> 0) & 255) << 16; + u32x w7_t = uint_to_hex_lower8_le ((d >> 24) & 255) << 0 + | uint_to_hex_lower8_le ((d >> 16) & 255) << 16; + + u32x w8_t = 0x80000000; + u32x w9_t = 0; + u32x wa_t = 0; + u32x wb_t = 0; + u32x wc_t = 0; + u32x wd_t = 0; + u32x we_t = 0; + u32x wf_t = 32 * 8; + + u32x e; + + a = SHA1M_A; + b = SHA1M_B; + c = SHA1M_C; + d = SHA1M_D; + e = SHA1M_E; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w0_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w1_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w2_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w3_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w4_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w5_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w6_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w7_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w8_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w9_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wa_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, wb_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, wc_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, wd_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, we_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F0o, e, a, b, c, d, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F0o, d, e, a, b, c, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F0o, c, d, e, a, b, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F0o, b, c, d, e, a, w3_t); + + #undef K + #define K SHA1C01 + + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w7_t); + + #undef K + #define K SHA1C02 + + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wb_t); + + #undef K + #define K SHA1C03 + + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wf_t); + + const u32x r0 = d; + const u32x r1 = e; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_M + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m04700_m08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m04700_m16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m04700_s04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + append_0x80_2 (wordl0, wordl1, pw_l_len); + + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, c_combs[0].pw_len); + } + + /** + * bin2asc table + */ + + l_bin2asc[lid] = c_bin2asc[(lid >> 0) & 15] << 0 + | c_bin2asc[(lid >> 4) & 15] << 8; + + __syncthreads (); + + if (gid >= gid_max) return; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * reverse + */ + + const u32 e_rev = rotl32 (search[1], 2u); + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = c_combs[il_pos].pw_len; + + const u32 pw_len = pw_l_len + pw_r_len; + + u32 wordr0[4]; + + wordr0[0] = c_combs[il_pos].i[0]; + wordr0[1] = c_combs[il_pos].i[1]; + wordr0[2] = c_combs[il_pos].i[2]; + wordr0[3] = c_combs[il_pos].i[3]; + + u32 wordr1[4]; + + wordr1[0] = c_combs[il_pos].i[4]; + wordr1[1] = c_combs[il_pos].i[5]; + wordr1[2] = c_combs[il_pos].i[6]; + wordr1[3] = c_combs[il_pos].i[7]; + + u32 wordr2[4]; + + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + + u32 wordr3[4]; + + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + append_0x80_2 (wordr0, wordr1, pw_r_len); + + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + u32x w0[4]; + + w0[0] = wordl0[0] | wordr0[0]; + w0[1] = wordl0[1] | wordr0[1]; + w0[2] = wordl0[2] | wordr0[2]; + w0[3] = wordl0[3] | wordr0[3]; + + u32x w1[4]; + + w1[0] = wordl1[0] | wordr1[0]; + w1[1] = wordl1[1] | wordr1[1]; + w1[2] = wordl1[2] | wordr1[2]; + w1[3] = wordl1[3] | wordr1[3]; + + u32x w2[4]; + + w2[0] = wordl2[0] | wordr2[0]; + w2[1] = wordl2[1] | wordr2[1]; + w2[2] = wordl2[2] | wordr2[2]; + w2[3] = wordl2[3] | wordr2[3]; + + u32x w3[4]; + + w3[0] = wordl3[0] | wordr3[0]; + w3[1] = wordl3[1] | wordr3[1]; + w3[2] = pw_len * 8; + w3[3] = 0; + + /** + * md5 + */ + + u32x a = MD5M_A; + u32x b = MD5M_B; + u32x c = MD5M_C; + u32x d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H , a, b, c, d, w1[1], MD5C20, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w2[0], MD5C21, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w2[3], MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w3[2], MD5C23, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w0[1], MD5C24, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w1[0], MD5C25, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w1[3], MD5C26, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w2[2], MD5C27, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w3[1], MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w0[0], MD5C29, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w0[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w1[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w2[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w3[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w3[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w0[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1[0], MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w2[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2[1], MD5C3f, MD5S33); + + a += MD5M_A; + b += MD5M_B; + c += MD5M_C; + d += MD5M_D; + + /* + * sha1 + */ + + u32x w0_t = uint_to_hex_lower8_le ((a >> 8) & 255) << 0 + | uint_to_hex_lower8_le ((a >> 0) & 255) << 16; + u32x w1_t = uint_to_hex_lower8_le ((a >> 24) & 255) << 0 + | uint_to_hex_lower8_le ((a >> 16) & 255) << 16; + u32x w2_t = uint_to_hex_lower8_le ((b >> 8) & 255) << 0 + | uint_to_hex_lower8_le ((b >> 0) & 255) << 16; + u32x w3_t = uint_to_hex_lower8_le ((b >> 24) & 255) << 0 + | uint_to_hex_lower8_le ((b >> 16) & 255) << 16; + u32x w4_t = uint_to_hex_lower8_le ((c >> 8) & 255) << 0 + | uint_to_hex_lower8_le ((c >> 0) & 255) << 16; + u32x w5_t = uint_to_hex_lower8_le ((c >> 24) & 255) << 0 + | uint_to_hex_lower8_le ((c >> 16) & 255) << 16; + u32x w6_t = uint_to_hex_lower8_le ((d >> 8) & 255) << 0 + | uint_to_hex_lower8_le ((d >> 0) & 255) << 16; + u32x w7_t = uint_to_hex_lower8_le ((d >> 24) & 255) << 0 + | uint_to_hex_lower8_le ((d >> 16) & 255) << 16; + + u32x w8_t = 0x80000000; + u32x w9_t = 0; + u32x wa_t = 0; + u32x wb_t = 0; + u32x wc_t = 0; + u32x wd_t = 0; + u32x we_t = 0; + u32x wf_t = 32 * 8; + + u32x e; + + a = SHA1M_A; + b = SHA1M_B; + c = SHA1M_C; + d = SHA1M_D; + e = SHA1M_E; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w0_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w1_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w2_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w3_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w4_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w5_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w6_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w7_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w8_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w9_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wa_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, wb_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, wc_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, wd_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, we_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F0o, e, a, b, c, d, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F0o, d, e, a, b, c, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F0o, c, d, e, a, b, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F0o, b, c, d, e, a, w3_t); + + #undef K + #define K SHA1C01 + + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w7_t); + + #undef K + #define K SHA1C02 + + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wb_t); + + #undef K + #define K SHA1C03 + + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wb_t); + + if (e != e_rev) continue; + + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wf_t); + + const u32x r0 = d; + const u32x r1 = e; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_S + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m04700_s08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m04700_s16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/nv/m04700_a3.cu b/nv/m04700_a3.cu new file mode 100644 index 0000000000..6cc4d1ac08 --- /dev/null +++ b/nv/m04700_a3.cu @@ -0,0 +1,946 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _SHA1_MD5_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW2 +#define VECT_SIZE1 +#endif + +#define DGST_R0 3 +#define DGST_R1 4 +#define DGST_R2 2 +#define DGST_R3 1 + +#include "include/kernel_functions.c" +#undef _MD5_ +#include "types_nv.c" +#include "common_nv.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +#ifdef VECT_SIZE1 +#define uint_to_hex_lower8_le(i) l_bin2asc[(i)] +#endif + +#ifdef VECT_SIZE2 +#define uint_to_hex_lower8_le(i) u32x (l_bin2asc[(i).x], l_bin2asc[(i).y]) +#endif + +#ifdef VECT_SIZE4 +#define uint_to_hex_lower8_le(i) u32x (l_bin2asc[(i).x], l_bin2asc[(i).y], l_bin2asc[(i).z], l_bin2asc[(i).w]) +#endif + +__device__ __constant__ char c_bin2asc[16] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' }; + +__device__ __shared__ short l_bin2asc[256]; + +__device__ __constant__ bf_t c_bfs[1024]; + +__device__ static void m04700m (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], const u32 pw_len, const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset) +{ + /** + * modifier + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + const u32 lid = threadIdx.x; + + /** + * loop + */ + + u32x w0l = w0[0]; + + for (u32 il_pos = 0; il_pos < bfs_cnt; il_pos++) + { + const u32 w0r = c_bfs[il_pos].i; + + w0[0] = w0l | w0r; + + /** + * md5 + */ + + u32x a = MD5M_A; + u32x b = MD5M_B; + u32x c = MD5M_C; + u32x d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H , a, b, c, d, w1[1], MD5C20, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w2[0], MD5C21, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w2[3], MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w3[2], MD5C23, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w0[1], MD5C24, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w1[0], MD5C25, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w1[3], MD5C26, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w2[2], MD5C27, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w3[1], MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w0[0], MD5C29, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w0[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w1[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w2[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w3[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w3[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w0[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1[0], MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w2[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2[1], MD5C3f, MD5S33); + + a += MD5M_A; + b += MD5M_B; + c += MD5M_C; + d += MD5M_D; + + /* + * sha1 + */ + + u32x w0_t = uint_to_hex_lower8_le ((a >> 8) & 255) << 0 + | uint_to_hex_lower8_le ((a >> 0) & 255) << 16; + u32x w1_t = uint_to_hex_lower8_le ((a >> 24) & 255) << 0 + | uint_to_hex_lower8_le ((a >> 16) & 255) << 16; + u32x w2_t = uint_to_hex_lower8_le ((b >> 8) & 255) << 0 + | uint_to_hex_lower8_le ((b >> 0) & 255) << 16; + u32x w3_t = uint_to_hex_lower8_le ((b >> 24) & 255) << 0 + | uint_to_hex_lower8_le ((b >> 16) & 255) << 16; + u32x w4_t = uint_to_hex_lower8_le ((c >> 8) & 255) << 0 + | uint_to_hex_lower8_le ((c >> 0) & 255) << 16; + u32x w5_t = uint_to_hex_lower8_le ((c >> 24) & 255) << 0 + | uint_to_hex_lower8_le ((c >> 16) & 255) << 16; + u32x w6_t = uint_to_hex_lower8_le ((d >> 8) & 255) << 0 + | uint_to_hex_lower8_le ((d >> 0) & 255) << 16; + u32x w7_t = uint_to_hex_lower8_le ((d >> 24) & 255) << 0 + | uint_to_hex_lower8_le ((d >> 16) & 255) << 16; + + u32x w8_t = 0x80000000; + u32x w9_t = 0; + u32x wa_t = 0; + u32x wb_t = 0; + u32x wc_t = 0; + u32x wd_t = 0; + u32x we_t = 0; + u32x wf_t = 32 * 8; + + u32x e; + + a = SHA1M_A; + b = SHA1M_B; + c = SHA1M_C; + d = SHA1M_D; + e = SHA1M_E; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w0_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w1_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w2_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w3_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w4_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w5_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w6_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w7_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w8_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w9_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wa_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, wb_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, wc_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, wd_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, we_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F0o, e, a, b, c, d, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F0o, d, e, a, b, c, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F0o, c, d, e, a, b, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F0o, b, c, d, e, a, w3_t); + + #undef K + #define K SHA1C01 + + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w7_t); + + #undef K + #define K SHA1C02 + + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wb_t); + + #undef K + #define K SHA1C03 + + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wf_t); + + const u32x r0 = d; + const u32x r1 = e; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_M + } +} + +__device__ static void m04700s (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], const u32 pw_len, const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset) +{ + /** + * modifier + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + const u32 lid = threadIdx.x; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * reverse + */ + + const u32 e_rev = rotl32 (search[1], 2u); + + /** + * loop + */ + + u32x w0l = w0[0]; + + for (u32 il_pos = 0; il_pos < bfs_cnt; il_pos++) + { + const u32 w0r = c_bfs[il_pos].i; + + w0[0] = w0l | w0r; + + /** + * md5 + */ + + u32x a = MD5M_A; + u32x b = MD5M_B; + u32x c = MD5M_C; + u32x d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H , a, b, c, d, w1[1], MD5C20, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w2[0], MD5C21, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w2[3], MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w3[2], MD5C23, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w0[1], MD5C24, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w1[0], MD5C25, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w1[3], MD5C26, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w2[2], MD5C27, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w3[1], MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w0[0], MD5C29, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w0[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w1[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w2[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w3[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w3[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w0[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1[0], MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w2[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2[1], MD5C3f, MD5S33); + + a += MD5M_A; + b += MD5M_B; + c += MD5M_C; + d += MD5M_D; + + /* + * sha1 + */ + + u32x w0_t = uint_to_hex_lower8_le ((a >> 8) & 255) << 0 + | uint_to_hex_lower8_le ((a >> 0) & 255) << 16; + u32x w1_t = uint_to_hex_lower8_le ((a >> 24) & 255) << 0 + | uint_to_hex_lower8_le ((a >> 16) & 255) << 16; + u32x w2_t = uint_to_hex_lower8_le ((b >> 8) & 255) << 0 + | uint_to_hex_lower8_le ((b >> 0) & 255) << 16; + u32x w3_t = uint_to_hex_lower8_le ((b >> 24) & 255) << 0 + | uint_to_hex_lower8_le ((b >> 16) & 255) << 16; + u32x w4_t = uint_to_hex_lower8_le ((c >> 8) & 255) << 0 + | uint_to_hex_lower8_le ((c >> 0) & 255) << 16; + u32x w5_t = uint_to_hex_lower8_le ((c >> 24) & 255) << 0 + | uint_to_hex_lower8_le ((c >> 16) & 255) << 16; + u32x w6_t = uint_to_hex_lower8_le ((d >> 8) & 255) << 0 + | uint_to_hex_lower8_le ((d >> 0) & 255) << 16; + u32x w7_t = uint_to_hex_lower8_le ((d >> 24) & 255) << 0 + | uint_to_hex_lower8_le ((d >> 16) & 255) << 16; + + u32x w8_t = 0x80000000; + u32x w9_t = 0; + u32x wa_t = 0; + u32x wb_t = 0; + u32x wc_t = 0; + u32x wd_t = 0; + u32x we_t = 0; + u32x wf_t = 32 * 8; + + u32x e; + + a = SHA1M_A; + b = SHA1M_B; + c = SHA1M_C; + d = SHA1M_D; + e = SHA1M_E; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w0_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w1_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w2_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w3_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w4_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w5_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w6_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w7_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w8_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w9_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wa_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, wb_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, wc_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, wd_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, we_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F0o, e, a, b, c, d, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F0o, d, e, a, b, c, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F0o, c, d, e, a, b, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F0o, b, c, d, e, a, w3_t); + + #undef K + #define K SHA1C01 + + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w7_t); + + #undef K + #define K SHA1C02 + + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wb_t); + + #undef K + #define K SHA1C03 + + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wb_t); + + if (e != e_rev) continue; + + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wf_t); + + const u32x r0 = d; + const u32x r1 = e; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_S + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m04700_m04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = pws[gid].i[14]; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * bin2asc table + */ + + l_bin2asc[lid] = c_bin2asc[(lid >> 0) & 15] << 0 + | c_bin2asc[(lid >> 4) & 15] << 8; + + __syncthreads (); + + if (gid >= gid_max) return; + + /** + * main + */ + + m04700m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m04700_m08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = pws[gid].i[14]; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * bin2asc table + */ + + l_bin2asc[lid] = c_bin2asc[(lid >> 0) & 15] << 0 + | c_bin2asc[(lid >> 4) & 15] << 8; + + __syncthreads (); + + if (gid >= gid_max) return; + + /** + * main + */ + + m04700m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m04700_m16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = pws[gid].i[ 8]; + w2[1] = pws[gid].i[ 9]; + w2[2] = pws[gid].i[10]; + w2[3] = pws[gid].i[11]; + + u32x w3[4]; + + w3[0] = pws[gid].i[12]; + w3[1] = pws[gid].i[13]; + w3[2] = pws[gid].i[14]; + w3[3] = pws[gid].i[15]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * bin2asc table + */ + + l_bin2asc[lid] = c_bin2asc[(lid >> 0) & 15] << 0 + | c_bin2asc[(lid >> 4) & 15] << 8; + + __syncthreads (); + + if (gid >= gid_max) return; + + /** + * main + */ + + m04700m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m04700_s04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = pws[gid].i[14]; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * bin2asc table + */ + + l_bin2asc[lid] = c_bin2asc[(lid >> 0) & 15] << 0 + | c_bin2asc[(lid >> 4) & 15] << 8; + + __syncthreads (); + + if (gid >= gid_max) return; + + /** + * main + */ + + m04700s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m04700_s08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = pws[gid].i[14]; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * bin2asc table + */ + + l_bin2asc[lid] = c_bin2asc[(lid >> 0) & 15] << 0 + | c_bin2asc[(lid >> 4) & 15] << 8; + + __syncthreads (); + + if (gid >= gid_max) return; + + /** + * main + */ + + m04700s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m04700_s16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = pws[gid].i[ 8]; + w2[1] = pws[gid].i[ 9]; + w2[2] = pws[gid].i[10]; + w2[3] = pws[gid].i[11]; + + u32x w3[4]; + + w3[0] = pws[gid].i[12]; + w3[1] = pws[gid].i[13]; + w3[2] = pws[gid].i[14]; + w3[3] = pws[gid].i[15]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * bin2asc table + */ + + l_bin2asc[lid] = c_bin2asc[(lid >> 0) & 15] << 0 + | c_bin2asc[(lid >> 4) & 15] << 8; + + __syncthreads (); + + if (gid >= gid_max) return; + + /** + * main + */ + + m04700s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} diff --git a/nv/m04800_a0.cu b/nv/m04800_a0.cu new file mode 100644 index 0000000000..bae6df9be8 --- /dev/null +++ b/nv/m04800_a0.cu @@ -0,0 +1,546 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _MD5_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW2 +#define VECT_SIZE1 +#endif + +#define DGST_R0 0 +#define DGST_R1 3 +#define DGST_R2 2 +#define DGST_R3 1 + +#include "include/kernel_functions.c" +#include "types_nv.c" +#include "common_nv.c" +#include "include/rp_gpu.h" +#include "rp_nv.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +__device__ __constant__ gpu_rule_t c_rules[1024]; + +extern "C" __global__ void __launch_bounds__ (256, 1) m04800_m04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + u32x pw_buf1[4]; + + pw_buf1[0] = pws[gid].i[ 4]; + pw_buf1[1] = pws[gid].i[ 5]; + pw_buf1[2] = pws[gid].i[ 6]; + pw_buf1[3] = pws[gid].i[ 7]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * salt + */ + + u32 salt_buf[5]; + + salt_buf[0] = salt_bufs[salt_pos].salt_buf[0]; + salt_buf[1] = salt_bufs[salt_pos].salt_buf[1]; + salt_buf[2] = salt_bufs[salt_pos].salt_buf[2]; + salt_buf[3] = salt_bufs[salt_pos].salt_buf[3]; + salt_buf[4] = salt_bufs[salt_pos].salt_buf[4]; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + + w0[0] = pw_buf0[0]; + w0[1] = pw_buf0[1]; + w0[2] = pw_buf0[2]; + w0[3] = pw_buf0[3]; + + u32x w1[4]; + + w1[0] = pw_buf1[0]; + w1[1] = pw_buf1[1]; + w1[2] = pw_buf1[2]; + w1[3] = pw_buf1[3]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 out_len = apply_rules (c_rules[il_pos].cmds, w0, w1, pw_len); + + u32 pw_salt_len = out_len + salt_len; + + /** + * append salt + */ + + u32 s0[4]; + + s0[0] = salt_buf[0]; + s0[1] = salt_buf[1]; + s0[2] = salt_buf[2]; + s0[3] = salt_buf[3]; + + u32 s1[4]; + + s1[0] = 0x80; + s1[1] = 0; + s1[2] = 0; + s1[3] = 0; + + u32 s2[4]; + + s2[0] = 0; + s2[1] = 0; + s2[2] = 0; + s2[3] = 0; + + u32 s3[4]; + + s3[0] = 0; + s3[1] = 0; + s3[2] = 0; + s3[3] = 0; + + switch_buffer_by_offset (s0, s1, s2, s3, out_len); + + w0[0] |= s0[0]; + w0[1] |= s0[1]; + w0[2] |= s0[2]; + w0[3] |= s0[3]; + + w1[0] |= s1[0]; + w1[1] |= s1[1]; + w1[2] |= s1[2]; + w1[3] |= s1[3]; + + w2[0] |= s2[0]; + w2[1] |= s2[1]; + w2[2] |= s2[2]; + w2[3] |= s2[3]; + + w3[0] |= s3[0]; + w3[1] |= s3[1]; + w3[2] = 0; + w3[3] = 0; + + /* + * add id byte + */ + + switch_buffer_by_offset (w0, w1, w2, w3, 1); + + w0[0] |= salt_buf[4]; + + w3[2] = pw_salt_len * 8; + + /** + * md5 + */ + + u32x a = MD5M_A; + u32x b = MD5M_B; + u32x c = MD5M_C; + u32x d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H , a, b, c, d, w1[1], MD5C20, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w2[0], MD5C21, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w2[3], MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w3[2], MD5C23, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w0[1], MD5C24, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w1[0], MD5C25, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w1[3], MD5C26, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w2[2], MD5C27, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w3[1], MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w0[0], MD5C29, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w0[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w1[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w2[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w3[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w3[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w0[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1[0], MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w2[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2[1], MD5C3f, MD5S33); + + const u32x r0 = a; + const u32x r1 = d; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_M + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m04800_m08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m04800_m16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m04800_s04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + u32x pw_buf1[4]; + + pw_buf1[0] = pws[gid].i[ 4]; + pw_buf1[1] = pws[gid].i[ 5]; + pw_buf1[2] = pws[gid].i[ 6]; + pw_buf1[3] = pws[gid].i[ 7]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * salt + */ + + u32 salt_buf[5]; + + salt_buf[0] = salt_bufs[salt_pos].salt_buf[0]; + salt_buf[1] = salt_bufs[salt_pos].salt_buf[1]; + salt_buf[2] = salt_bufs[salt_pos].salt_buf[2]; + salt_buf[3] = salt_bufs[salt_pos].salt_buf[3]; + salt_buf[4] = salt_bufs[salt_pos].salt_buf[4]; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + + w0[0] = pw_buf0[0]; + w0[1] = pw_buf0[1]; + w0[2] = pw_buf0[2]; + w0[3] = pw_buf0[3]; + + u32x w1[4]; + + w1[0] = pw_buf1[0]; + w1[1] = pw_buf1[1]; + w1[2] = pw_buf1[2]; + w1[3] = pw_buf1[3]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 out_len = apply_rules (c_rules[il_pos].cmds, w0, w1, pw_len); + + u32 pw_salt_len = out_len + salt_len; + + /** + * append salt + */ + + u32 s0[4]; + + s0[0] = salt_buf[0]; + s0[1] = salt_buf[1]; + s0[2] = salt_buf[2]; + s0[3] = salt_buf[3]; + + u32 s1[4]; + + s1[0] = 0x80; + s1[1] = 0; + s1[2] = 0; + s1[3] = 0; + + u32 s2[4]; + + s2[0] = 0; + s2[1] = 0; + s2[2] = 0; + s2[3] = 0; + + u32 s3[4]; + + s3[0] = 0; + s3[1] = 0; + s3[2] = 0; + s3[3] = 0; + + switch_buffer_by_offset (s0, s1, s2, s3, out_len); + + w0[0] |= s0[0]; + w0[1] |= s0[1]; + w0[2] |= s0[2]; + w0[3] |= s0[3]; + + w1[0] |= s1[0]; + w1[1] |= s1[1]; + w1[2] |= s1[2]; + w1[3] |= s1[3]; + + w2[0] |= s2[0]; + w2[1] |= s2[1]; + w2[2] |= s2[2]; + w2[3] |= s2[3]; + + w3[0] |= s3[0]; + w3[1] |= s3[1]; + w3[2] = 0; + w3[3] = 0; + + /* + * add id byte + */ + + switch_buffer_by_offset (w0, w1, w2, w3, 1); + + w0[0] |= salt_buf[4]; + + w3[2] = pw_salt_len * 8; + + /** + * md5 + */ + + u32x a = MD5M_A; + u32x b = MD5M_B; + u32x c = MD5M_C; + u32x d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H , a, b, c, d, w1[1], MD5C20, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w2[0], MD5C21, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w2[3], MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w3[2], MD5C23, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w0[1], MD5C24, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w1[0], MD5C25, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w1[3], MD5C26, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w2[2], MD5C27, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w3[1], MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w0[0], MD5C29, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w0[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w1[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w2[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w3[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w3[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w0[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1[0], MD5C3c, MD5S30); + + bool q_cond = (search[0] != a); + + if (q_cond) continue; + + MD5_STEP (MD5_I , d, a, b, c, w2[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2[1], MD5C3f, MD5S33); + + const u32x r0 = a; + const u32x r1 = d; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_S + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m04800_s08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m04800_s16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/nv/m04800_a1.cu b/nv/m04800_a1.cu new file mode 100644 index 0000000000..429c2e5afe --- /dev/null +++ b/nv/m04800_a1.cu @@ -0,0 +1,642 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _MD5_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW2 +#define VECT_SIZE4 +#endif + +#define DGST_R0 0 +#define DGST_R1 3 +#define DGST_R2 2 +#define DGST_R3 1 + +#include "include/kernel_functions.c" +#include "types_nv.c" +#include "common_nv.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +__device__ __constant__ comb_t c_combs[1024]; + +extern "C" __global__ void __launch_bounds__ (256, 1) m04800_m04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, c_combs[0].pw_len); + } + + /** + * salt + */ + + u32 salt_buf[5]; + + salt_buf[0] = salt_bufs[salt_pos].salt_buf[0]; + salt_buf[1] = salt_bufs[salt_pos].salt_buf[1]; + salt_buf[2] = salt_bufs[salt_pos].salt_buf[2]; + salt_buf[3] = salt_bufs[salt_pos].salt_buf[3]; + salt_buf[4] = salt_bufs[salt_pos].salt_buf[4]; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = c_combs[il_pos].pw_len; + + const u32 pw_len = pw_l_len + pw_r_len; + + u32 wordr0[4]; + + wordr0[0] = c_combs[il_pos].i[0]; + wordr0[1] = c_combs[il_pos].i[1]; + wordr0[2] = c_combs[il_pos].i[2]; + wordr0[3] = c_combs[il_pos].i[3]; + + u32 wordr1[4]; + + wordr1[0] = c_combs[il_pos].i[4]; + wordr1[1] = c_combs[il_pos].i[5]; + wordr1[2] = c_combs[il_pos].i[6]; + wordr1[3] = c_combs[il_pos].i[7]; + + u32 wordr2[4]; + + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + + u32 wordr3[4]; + + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + u32x w0[4]; + + w0[0] = wordl0[0] | wordr0[0]; + w0[1] = wordl0[1] | wordr0[1]; + w0[2] = wordl0[2] | wordr0[2]; + w0[3] = wordl0[3] | wordr0[3]; + + u32x w1[4]; + + w1[0] = wordl1[0] | wordr1[0]; + w1[1] = wordl1[1] | wordr1[1]; + w1[2] = wordl1[2] | wordr1[2]; + w1[3] = wordl1[3] | wordr1[3]; + + u32x w2[4]; + + w2[0] = wordl2[0] | wordr2[0]; + w2[1] = wordl2[1] | wordr2[1]; + w2[2] = wordl2[2] | wordr2[2]; + w2[3] = wordl2[3] | wordr2[3]; + + u32x w3[4]; + + w3[0] = wordl3[0] | wordr3[0]; + w3[1] = wordl3[1] | wordr3[1]; + w3[2] = wordl3[2] | wordr3[2]; + w3[3] = wordl3[3] | wordr3[3]; + + /* + * add id byte + */ + + switch_buffer_by_offset (w0, w1, w2, w3, 1); + + w0[0] |= salt_buf[4]; + + /** + * append salt + */ + + u32 s0[4]; + + s0[0] = salt_buf[0]; + s0[1] = salt_buf[1]; + s0[2] = salt_buf[2]; + s0[3] = salt_buf[3]; + + u32 s1[4]; + + s1[0] = 0x80; + s1[1] = 0; + s1[2] = 0; + s1[3] = 0; + + u32 s2[4]; + + s2[0] = 0; + s2[1] = 0; + s2[2] = 0; + s2[3] = 0; + + u32 s3[4]; + + s3[0] = 0; + s3[1] = 0; + s3[2] = 0; + s3[3] = 0; + + switch_buffer_by_offset (s0, s1, s2, s3, 1 + pw_len); + + const u32 pw_salt_len = pw_len + salt_len; + + w0[0] |= s0[0]; + w0[1] |= s0[1]; + w0[2] |= s0[2]; + w0[3] |= s0[3]; + w1[0] |= s1[0]; + w1[1] |= s1[1]; + w1[2] |= s1[2]; + w1[3] |= s1[3]; + w2[0] |= s2[0]; + w2[1] |= s2[1]; + w2[2] |= s2[2]; + w2[3] |= s2[3]; + w3[0] |= s3[0]; + w3[1] |= s3[1]; + w3[2] = pw_salt_len * 8; + w3[3] = 0; + + /** + * md5 + */ + + u32x a = MD5M_A; + u32x b = MD5M_B; + u32x c = MD5M_C; + u32x d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H , a, b, c, d, w1[1], MD5C20, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w2[0], MD5C21, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w2[3], MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w3[2], MD5C23, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w0[1], MD5C24, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w1[0], MD5C25, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w1[3], MD5C26, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w2[2], MD5C27, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w3[1], MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w0[0], MD5C29, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w0[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w1[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w2[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w3[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w3[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w0[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1[0], MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w2[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2[1], MD5C3f, MD5S33); + + const u32x r0 = a; + const u32x r1 = d; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_M + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m04800_m08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m04800_m16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m04800_s04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, c_combs[0].pw_len); + } + + /** + * salt + */ + + u32 salt_buf[5]; + + salt_buf[0] = salt_bufs[salt_pos].salt_buf[0]; + salt_buf[1] = salt_bufs[salt_pos].salt_buf[1]; + salt_buf[2] = salt_bufs[salt_pos].salt_buf[2]; + salt_buf[3] = salt_bufs[salt_pos].salt_buf[3]; + salt_buf[4] = salt_bufs[salt_pos].salt_buf[4]; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = c_combs[il_pos].pw_len; + + const u32 pw_len = pw_l_len + pw_r_len; + + u32 wordr0[4]; + + wordr0[0] = c_combs[il_pos].i[0]; + wordr0[1] = c_combs[il_pos].i[1]; + wordr0[2] = c_combs[il_pos].i[2]; + wordr0[3] = c_combs[il_pos].i[3]; + + u32 wordr1[4]; + + wordr1[0] = c_combs[il_pos].i[4]; + wordr1[1] = c_combs[il_pos].i[5]; + wordr1[2] = c_combs[il_pos].i[6]; + wordr1[3] = c_combs[il_pos].i[7]; + + u32 wordr2[4]; + + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + + u32 wordr3[4]; + + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + u32x w0[4]; + + w0[0] = wordl0[0] | wordr0[0]; + w0[1] = wordl0[1] | wordr0[1]; + w0[2] = wordl0[2] | wordr0[2]; + w0[3] = wordl0[3] | wordr0[3]; + + u32x w1[4]; + + w1[0] = wordl1[0] | wordr1[0]; + w1[1] = wordl1[1] | wordr1[1]; + w1[2] = wordl1[2] | wordr1[2]; + w1[3] = wordl1[3] | wordr1[3]; + + u32x w2[4]; + + w2[0] = wordl2[0] | wordr2[0]; + w2[1] = wordl2[1] | wordr2[1]; + w2[2] = wordl2[2] | wordr2[2]; + w2[3] = wordl2[3] | wordr2[3]; + + u32x w3[4]; + + w3[0] = wordl3[0] | wordr3[0]; + w3[1] = wordl3[1] | wordr3[1]; + w3[2] = wordl3[2] | wordr3[2]; + w3[3] = wordl3[3] | wordr3[3]; + + /* + * add id byte + */ + + switch_buffer_by_offset (w0, w1, w2, w3, 1); + + w0[0] |= salt_buf[4]; + + /** + * append salt + */ + + u32 s0[4]; + + s0[0] = salt_buf[0]; + s0[1] = salt_buf[1]; + s0[2] = salt_buf[2]; + s0[3] = salt_buf[3]; + + u32 s1[4]; + + s1[0] = 0x80; + s1[1] = 0; + s1[2] = 0; + s1[3] = 0; + + u32 s2[4]; + + s2[0] = 0; + s2[1] = 0; + s2[2] = 0; + s2[3] = 0; + + u32 s3[4]; + + s3[0] = 0; + s3[1] = 0; + s3[2] = 0; + s3[3] = 0; + + switch_buffer_by_offset (s0, s1, s2, s3, 1 + pw_len); + + const u32 pw_salt_len = pw_len + salt_len; + + w0[0] |= s0[0]; + w0[1] |= s0[1]; + w0[2] |= s0[2]; + w0[3] |= s0[3]; + w1[0] |= s1[0]; + w1[1] |= s1[1]; + w1[2] |= s1[2]; + w1[3] |= s1[3]; + w2[0] |= s2[0]; + w2[1] |= s2[1]; + w2[2] |= s2[2]; + w2[3] |= s2[3]; + w3[0] |= s3[0]; + w3[1] |= s3[1]; + w3[2] = pw_salt_len * 8; + w3[3] = 0; + + /** + * md5 + */ + + u32x a = MD5M_A; + u32x b = MD5M_B; + u32x c = MD5M_C; + u32x d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H , a, b, c, d, w1[1], MD5C20, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w2[0], MD5C21, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w2[3], MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w3[2], MD5C23, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w0[1], MD5C24, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w1[0], MD5C25, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w1[3], MD5C26, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w2[2], MD5C27, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w3[1], MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w0[0], MD5C29, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w0[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w1[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w2[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w3[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w3[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w0[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1[0], MD5C3c, MD5S30); + + bool q_cond = (search[0] != a); + + if (q_cond) continue; + + MD5_STEP (MD5_I , d, a, b, c, w2[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2[1], MD5C3f, MD5S33); + + const u32x r0 = a; + const u32x r1 = d; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_S + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m04800_s08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m04800_s16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/nv/m04800_a3.cu b/nv/m04800_a3.cu new file mode 100644 index 0000000000..f900b387fe --- /dev/null +++ b/nv/m04800_a3.cu @@ -0,0 +1,773 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _MD5_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW2 +#define VECT_SIZE4 +#endif + +#define DGST_R0 0 +#define DGST_R1 3 +#define DGST_R2 2 +#define DGST_R3 1 + +#include "include/kernel_functions.c" +#include "types_nv.c" +#include "common_nv.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +__device__ __constant__ bf_t c_bfs[1024]; + +__device__ static void m04800m (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], const u32 pw_len, const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset) +{ + /** + * modifier + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + const u32 lid = threadIdx.x; + + /** + * salt + */ + + u32 salt_buf[5]; + + salt_buf[0] = salt_bufs[salt_pos].salt_buf[0]; + salt_buf[1] = salt_bufs[salt_pos].salt_buf[1]; + salt_buf[2] = salt_bufs[salt_pos].salt_buf[2]; + salt_buf[3] = salt_bufs[salt_pos].salt_buf[3]; + salt_buf[4] = salt_bufs[salt_pos].salt_buf[4]; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + const u32 pw_salt_len = pw_len + salt_len; + + u32 s0[4]; + + s0[0] = salt_buf[0]; + s0[1] = salt_buf[1]; + s0[2] = salt_buf[2]; + s0[3] = salt_buf[3]; + + u32 s1[4]; + + s1[0] = 0x80; + s1[1] = 0; + s1[2] = 0; + s1[3] = 0; + + u32 s2[4]; + + s2[0] = 0; + s2[1] = 0; + s2[2] = 0; + s2[3] = 0; + + u32 s3[4]; + + s3[0] = 0; + s3[1] = 0; + s3[2] = 0; + s3[3] = 0; + + // move w by 1 + + u32x w0_t[4]; + + w0_t[0] = w0[0]; + w0_t[1] = w0[1]; + w0_t[2] = w0[2]; + w0_t[3] = w0[3]; + + u32x w1_t[4]; + + w1_t[0] = w1[0]; + w1_t[1] = w1[1]; + w1_t[2] = w1[2]; + w1_t[3] = w1[3]; + + u32x w2_t[4]; + + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + + u32x w3_t[4]; + + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = 0; + + switch_buffer_by_offset (w0_t, w1_t, w2_t, w3_t, 1); + + switch_buffer_by_offset (s0, s1, s2, s3, 1 + pw_len); + + w0_t[0] |= s0[0]; + w0_t[1] |= s0[1]; + w0_t[2] |= s0[2]; + w0_t[3] |= s0[3]; + + w1_t[0] |= s1[0]; + w1_t[1] |= s1[1]; + w1_t[2] |= s1[2]; + w1_t[3] |= s1[3]; + + w2_t[0] |= s2[0]; + w2_t[1] |= s2[1]; + w2_t[2] |= s2[2]; + w2_t[3] |= s2[3]; + + w3_t[0] |= s3[0]; + w3_t[1] |= s3[1]; + w3_t[2] = pw_salt_len * 8; + w3_t[3] = 0; + + /** + * add id byte + */ + + w0_t[0] |= salt_buf[4]; + + /** + * loop + */ + + u32x w0l = w0_t[0]; + u32x w1l = w0_t[1]; + + for (u32 il_pos = 0; il_pos < bfs_cnt; il_pos++) + { + const u32 w0r = c_bfs[il_pos].i; + + w0_t[0] = w0l | (w0r << 8); + w0_t[1] = w1l | (w0r >> 24); + + /** + * md5 + */ + + u32x a = MD5M_A; + u32x b = MD5M_B; + u32x c = MD5M_C; + u32x d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0_t[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0_t[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0_t[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1_t[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1_t[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1_t[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2_t[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2_t[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2_t[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3_t[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3_t[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3_t[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0_t[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1_t[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2_t[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1_t[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1_t[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2_t[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3_t[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0_t[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2_t[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3_t[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0_t[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1_t[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3_t[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H , a, b, c, d, w1_t[1], MD5C20, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w2_t[0], MD5C21, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w2_t[3], MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w3_t[2], MD5C23, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w0_t[1], MD5C24, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w1_t[0], MD5C25, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w1_t[3], MD5C26, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w2_t[2], MD5C27, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w3_t[1], MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w0_t[0], MD5C29, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w0_t[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w1_t[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w2_t[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w3_t[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w3_t[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w0_t[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1_t[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3_t[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3_t[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0_t[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0_t[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2_t[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1_t[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3_t[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1_t[0], MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w2_t[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0_t[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2_t[1], MD5C3f, MD5S33); + + const u32x r0 = a; + const u32x r1 = d; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_M + } +} + +__device__ static void m04800s (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], const u32 pw_len, const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset) +{ + /** + * modifier + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + const u32 lid = threadIdx.x; + + /** + * salt + */ + + u32 salt_buf[5]; + + salt_buf[0] = salt_bufs[salt_pos].salt_buf[0]; + salt_buf[1] = salt_bufs[salt_pos].salt_buf[1]; + salt_buf[2] = salt_bufs[salt_pos].salt_buf[2]; + salt_buf[3] = salt_bufs[salt_pos].salt_buf[3]; + salt_buf[4] = salt_bufs[salt_pos].salt_buf[4]; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + const u32 pw_salt_len = pw_len + salt_len; + + u32 s0[4]; + + s0[0] = salt_buf[0]; + s0[1] = salt_buf[1]; + s0[2] = salt_buf[2]; + s0[3] = salt_buf[3]; + + u32 s1[4]; + + s1[0] = 0x80; + s1[1] = 0; + s1[2] = 0; + s1[3] = 0; + + u32 s2[4]; + + s2[0] = 0; + s2[1] = 0; + s2[2] = 0; + s2[3] = 0; + + u32 s3[4]; + + s3[0] = 0; + s3[1] = 0; + s3[2] = 0; + s3[3] = 0; + + // move w by 1 + + u32x w0_t[4]; + + w0_t[0] = w0[0]; + w0_t[1] = w0[1]; + w0_t[2] = w0[2]; + w0_t[3] = w0[3]; + + u32x w1_t[4]; + + w1_t[0] = w1[0]; + w1_t[1] = w1[1]; + w1_t[2] = w1[2]; + w1_t[3] = w1[3]; + + u32x w2_t[4]; + + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + + u32x w3_t[4]; + + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = 0; + + switch_buffer_by_offset (w0_t, w1_t, w2_t, w3_t, 1); + + switch_buffer_by_offset (s0, s1, s2, s3, 1 + pw_len); + + w0_t[0] |= s0[0]; + w0_t[1] |= s0[1]; + w0_t[2] |= s0[2]; + w0_t[3] |= s0[3]; + + w1_t[0] |= s1[0]; + w1_t[1] |= s1[1]; + w1_t[2] |= s1[2]; + w1_t[3] |= s1[3]; + + w2_t[0] |= s2[0]; + w2_t[1] |= s2[1]; + w2_t[2] |= s2[2]; + w2_t[3] |= s2[3]; + + w3_t[0] |= s3[0]; + w3_t[1] |= s3[1]; + w3_t[2] = pw_salt_len * 8; + w3_t[3] = 0; + + /** + * add id byte + */ + + w0_t[0] |= salt_buf[4]; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * loop + */ + + u32x w0l = w0_t[0]; + u32x w1l = w0_t[1]; + + for (u32 il_pos = 0; il_pos < bfs_cnt; il_pos++) + { + const u32 w0r = c_bfs[il_pos].i; + + w0_t[0] = w0l | (w0r << 8); + w0_t[1] = w1l | (w0r >> 24); + + /** + * md5 + */ + + u32x a = MD5M_A; + u32x b = MD5M_B; + u32x c = MD5M_C; + u32x d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0_t[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0_t[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0_t[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1_t[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1_t[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1_t[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2_t[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2_t[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2_t[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3_t[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3_t[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3_t[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0_t[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1_t[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2_t[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1_t[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1_t[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2_t[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3_t[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0_t[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2_t[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3_t[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0_t[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1_t[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3_t[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H , a, b, c, d, w1_t[1], MD5C20, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w2_t[0], MD5C21, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w2_t[3], MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w3_t[2], MD5C23, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w0_t[1], MD5C24, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w1_t[0], MD5C25, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w1_t[3], MD5C26, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w2_t[2], MD5C27, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w3_t[1], MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w0_t[0], MD5C29, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w0_t[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w1_t[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w2_t[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w3_t[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w3_t[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w0_t[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1_t[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3_t[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3_t[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0_t[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0_t[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2_t[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1_t[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3_t[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1_t[0], MD5C3c, MD5S30); + + bool q_cond = (search[0] != a); + + if (q_cond) continue; + + MD5_STEP (MD5_I , d, a, b, c, w2_t[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0_t[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2_t[1], MD5C3f, MD5S33); + + const u32x r0 = a; + const u32x r1 = d; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_S + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m04800_m04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m04800m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m04800_m08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m04800m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m04800_m16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = pws[gid].i[ 8]; + w2[1] = pws[gid].i[ 9]; + w2[2] = pws[gid].i[10]; + w2[3] = pws[gid].i[11]; + + u32x w3[4]; + + w3[0] = pws[gid].i[12]; + w3[1] = pws[gid].i[13]; + w3[2] = pws[gid].i[14]; + w3[3] = pws[gid].i[15]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m04800m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m04800_s04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m04800s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m04800_s08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m04800s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m04800_s16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = pws[gid].i[ 8]; + w2[1] = pws[gid].i[ 9]; + w2[2] = pws[gid].i[10]; + w2[3] = pws[gid].i[11]; + + u32x w3[4]; + + w3[0] = pws[gid].i[12]; + w3[1] = pws[gid].i[13]; + w3[2] = pws[gid].i[14]; + w3[3] = pws[gid].i[15]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m04800s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} diff --git a/nv/m04900_a0.cu b/nv/m04900_a0.cu new file mode 100644 index 0000000000..2a160eafe3 --- /dev/null +++ b/nv/m04900_a0.cu @@ -0,0 +1,701 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _SHA1_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW2 +#define VECT_SIZE1 +#endif + +#define DGST_R0 3 +#define DGST_R1 4 +#define DGST_R2 2 +#define DGST_R3 1 + +#include "include/kernel_functions.c" +#include "types_nv.c" +#include "common_nv.c" +#include "include/rp_gpu.h" +#include "rp_nv.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +__device__ __constant__ gpu_rule_t c_rules[1024]; + +extern "C" __global__ void __launch_bounds__ (256, 1) m04900_m04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + u32x pw_buf1[4]; + + pw_buf1[0] = pws[gid].i[ 4]; + pw_buf1[1] = pws[gid].i[ 5]; + pw_buf1[2] = pws[gid].i[ 6]; + pw_buf1[3] = pws[gid].i[ 7]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[ 1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[ 2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[ 3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[ 4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[ 5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[ 6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[ 7]; + + u32 salt_buf2[4]; + + salt_buf2[0] = 0; + salt_buf2[1] = 0; + salt_buf2[2] = 0; + salt_buf2[3] = 0; + + u32 salt_buf3[4]; + + salt_buf3[0] = 0; + salt_buf3[1] = 0; + salt_buf3[2] = 0; + salt_buf3[3] = 0; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0_t[4]; + + w0_t[0] = pw_buf0[0]; + w0_t[1] = pw_buf0[1]; + w0_t[2] = pw_buf0[2]; + w0_t[3] = pw_buf0[3]; + + u32x w1_t[4]; + + w1_t[0] = pw_buf1[0]; + w1_t[1] = pw_buf1[1]; + w1_t[2] = pw_buf1[2]; + w1_t[3] = pw_buf1[3]; + + u32x w2_t[4]; + + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + + u32x w3_t[4]; + + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = 0; + + const u32 out_len = apply_rules (c_rules[il_pos].cmds, w0_t, w1_t, pw_len); + + /** + * prepend salt + */ + + switch_buffer_by_offset (w0_t, w1_t, w2_t, w3_t, salt_len); + + w0_t[0] |= salt_buf0[0]; + w0_t[1] |= salt_buf0[1]; + w0_t[2] |= salt_buf0[2]; + w0_t[3] |= salt_buf0[3]; + w1_t[0] |= salt_buf1[0]; + w1_t[1] |= salt_buf1[1]; + w1_t[2] |= salt_buf1[2]; + w1_t[3] |= salt_buf1[3]; + w2_t[0] |= salt_buf2[0]; + w2_t[1] |= salt_buf2[1]; + w2_t[2] |= salt_buf2[2]; + w2_t[3] |= salt_buf2[3]; + w3_t[0] |= salt_buf3[0]; + w3_t[1] |= salt_buf3[1]; + w3_t[2] |= salt_buf3[2]; + w3_t[3] |= salt_buf3[3]; + + /** + * append salt + */ + + u32 s0[4]; + + s0[0] = salt_buf0[0]; + s0[1] = salt_buf0[1]; + s0[2] = salt_buf0[2]; + s0[3] = salt_buf0[3]; + + u32 s1[4]; + + s1[0] = salt_buf1[0]; + s1[1] = salt_buf1[1]; + s1[2] = salt_buf1[2]; + s1[3] = salt_buf1[3]; + + u32 s2[4]; + + s2[0] = 0; + s2[1] = 0; + s2[2] = 0; + s2[3] = 0; + + u32 s3[4]; + + s3[0] = 0; + s3[1] = 0; + s3[2] = 0; + s3[3] = 0; + + switch_buffer_by_offset (s0, s1, s2, s3, salt_len + out_len); + + w0_t[0] |= s0[0]; + w0_t[1] |= s0[1]; + w0_t[2] |= s0[2]; + w0_t[3] |= s0[3]; + w1_t[0] |= s1[0]; + w1_t[1] |= s1[1]; + w1_t[2] |= s1[2]; + w1_t[3] |= s1[3]; + w2_t[0] |= s2[0]; + w2_t[1] |= s2[1]; + w2_t[2] |= s2[2]; + w2_t[3] |= s2[3]; + w3_t[0] |= s3[0]; + w3_t[1] |= s3[1]; + w3_t[2] |= s3[2]; + w3_t[3] |= s3[3]; + + const u32 pw_salt_len = salt_len + out_len + salt_len; + + append_0x80_4 (w0_t, w1_t, w2_t, w3_t, pw_salt_len); + + u32x w0 = swap_workaround (w0_t[0]); + u32x w1 = swap_workaround (w0_t[1]); + u32x w2 = swap_workaround (w0_t[2]); + u32x w3 = swap_workaround (w0_t[3]); + u32x w4 = swap_workaround (w1_t[0]); + u32x w5 = swap_workaround (w1_t[1]); + u32x w6 = swap_workaround (w1_t[2]); + u32x w7 = swap_workaround (w1_t[3]); + u32x w8 = swap_workaround (w2_t[0]); + u32x w9 = swap_workaround (w2_t[1]); + u32x wa = swap_workaround (w2_t[2]); + u32x wb = swap_workaround (w2_t[3]); + u32x wc = swap_workaround (w3_t[0]); + u32x wd = swap_workaround (w3_t[1]); + u32x we = 0; + u32x wf = pw_salt_len * 8; + + /** + * sha1 + */ + + u32x a = SHA1M_A; + u32x b = SHA1M_B; + u32x c = SHA1M_C; + u32x d = SHA1M_D; + u32x e = SHA1M_E; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w0); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w1); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w2); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w3); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w4); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w5); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w6); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w7); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w8); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w9); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wa); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, wb); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, wc); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, wd); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, we); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wf); + w0 = rotl32 ((wd ^ w8 ^ w2 ^ w0), 1u); SHA1_STEP (SHA1_F0o, e, a, b, c, d, w0); + w1 = rotl32 ((we ^ w9 ^ w3 ^ w1), 1u); SHA1_STEP (SHA1_F0o, d, e, a, b, c, w1); + w2 = rotl32 ((wf ^ wa ^ w4 ^ w2), 1u); SHA1_STEP (SHA1_F0o, c, d, e, a, b, w2); + w3 = rotl32 ((w0 ^ wb ^ w5 ^ w3), 1u); SHA1_STEP (SHA1_F0o, b, c, d, e, a, w3); + + #undef K + #define K SHA1C01 + + w4 = rotl32 ((w1 ^ wc ^ w6 ^ w4), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w4); + w5 = rotl32 ((w2 ^ wd ^ w7 ^ w5), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w5); + w6 = rotl32 ((w3 ^ we ^ w8 ^ w6), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w6); + w7 = rotl32 ((w4 ^ wf ^ w9 ^ w7), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w7); + w8 = rotl32 ((w5 ^ w0 ^ wa ^ w8), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w8); + w9 = rotl32 ((w6 ^ w1 ^ wb ^ w9), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w9); + wa = rotl32 ((w7 ^ w2 ^ wc ^ wa), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wa); + wb = rotl32 ((w8 ^ w3 ^ wd ^ wb), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wb); + wc = rotl32 ((w9 ^ w4 ^ we ^ wc), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wc); + wd = rotl32 ((wa ^ w5 ^ wf ^ wd), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wd); + we = rotl32 ((wb ^ w6 ^ w0 ^ we), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, we); + wf = rotl32 ((wc ^ w7 ^ w1 ^ wf), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wf); + w0 = rotl32 ((wd ^ w8 ^ w2 ^ w0), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w0); + w1 = rotl32 ((we ^ w9 ^ w3 ^ w1), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1); + w2 = rotl32 ((wf ^ wa ^ w4 ^ w2), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w2); + w3 = rotl32 ((w0 ^ wb ^ w5 ^ w3), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w3); + w4 = rotl32 ((w1 ^ wc ^ w6 ^ w4), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w4); + w5 = rotl32 ((w2 ^ wd ^ w7 ^ w5), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w5); + w6 = rotl32 ((w3 ^ we ^ w8 ^ w6), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w6); + w7 = rotl32 ((w4 ^ wf ^ w9 ^ w7), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w7); + + #undef K + #define K SHA1C02 + + w8 = rotl32 ((w5 ^ w0 ^ wa ^ w8), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w8); + w9 = rotl32 ((w6 ^ w1 ^ wb ^ w9), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w9); + wa = rotl32 ((w7 ^ w2 ^ wc ^ wa), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wa); + wb = rotl32 ((w8 ^ w3 ^ wd ^ wb), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wb); + wc = rotl32 ((w9 ^ w4 ^ we ^ wc), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wc); + wd = rotl32 ((wa ^ w5 ^ wf ^ wd), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, wd); + we = rotl32 ((wb ^ w6 ^ w0 ^ we), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, we); + wf = rotl32 ((wc ^ w7 ^ w1 ^ wf), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wf); + w0 = rotl32 ((wd ^ w8 ^ w2 ^ w0), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w0); + w1 = rotl32 ((we ^ w9 ^ w3 ^ w1), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w1); + w2 = rotl32 ((wf ^ wa ^ w4 ^ w2), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w2); + w3 = rotl32 ((w0 ^ wb ^ w5 ^ w3), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w3); + w4 = rotl32 ((w1 ^ wc ^ w6 ^ w4), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w4); + w5 = rotl32 ((w2 ^ wd ^ w7 ^ w5), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w5); + w6 = rotl32 ((w3 ^ we ^ w8 ^ w6), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w6); + w7 = rotl32 ((w4 ^ wf ^ w9 ^ w7), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w7); + w8 = rotl32 ((w5 ^ w0 ^ wa ^ w8), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w8); + w9 = rotl32 ((w6 ^ w1 ^ wb ^ w9), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w9); + wa = rotl32 ((w7 ^ w2 ^ wc ^ wa), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wa); + wb = rotl32 ((w8 ^ w3 ^ wd ^ wb), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wb); + + #undef K + #define K SHA1C03 + + wc = rotl32 ((w9 ^ w4 ^ we ^ wc), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wc); + wd = rotl32 ((wa ^ w5 ^ wf ^ wd), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wd); + we = rotl32 ((wb ^ w6 ^ w0 ^ we), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, we); + wf = rotl32 ((wc ^ w7 ^ w1 ^ wf), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wf); + w0 = rotl32 ((wd ^ w8 ^ w2 ^ w0), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w0); + w1 = rotl32 ((we ^ w9 ^ w3 ^ w1), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w1); + w2 = rotl32 ((wf ^ wa ^ w4 ^ w2), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w2); + w3 = rotl32 ((w0 ^ wb ^ w5 ^ w3), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w3); + w4 = rotl32 ((w1 ^ wc ^ w6 ^ w4), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w4); + w5 = rotl32 ((w2 ^ wd ^ w7 ^ w5), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w5); + w6 = rotl32 ((w3 ^ we ^ w8 ^ w6), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w6); + w7 = rotl32 ((w4 ^ wf ^ w9 ^ w7), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w7); + w8 = rotl32 ((w5 ^ w0 ^ wa ^ w8), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w8); + w9 = rotl32 ((w6 ^ w1 ^ wb ^ w9), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w9); + wa = rotl32 ((w7 ^ w2 ^ wc ^ wa), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wa); + wb = rotl32 ((w8 ^ w3 ^ wd ^ wb), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wb); + wc = rotl32 ((w9 ^ w4 ^ we ^ wc), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wc); + wd = rotl32 ((wa ^ w5 ^ wf ^ wd), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wd); + we = rotl32 ((wb ^ w6 ^ w0 ^ we), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, we); + wf = rotl32 ((wc ^ w7 ^ w1 ^ wf), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wf); + + const u32x r0 = d; + const u32x r1 = e; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_M + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m04900_m08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m04900_m16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m04900_s04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + u32x pw_buf1[4]; + + pw_buf1[0] = pws[gid].i[ 4]; + pw_buf1[1] = pws[gid].i[ 5]; + pw_buf1[2] = pws[gid].i[ 6]; + pw_buf1[3] = pws[gid].i[ 7]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[ 1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[ 2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[ 3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[ 4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[ 5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[ 6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[ 7]; + + u32 salt_buf2[4]; + + salt_buf2[0] = 0; + salt_buf2[1] = 0; + salt_buf2[2] = 0; + salt_buf2[3] = 0; + + u32 salt_buf3[4]; + + salt_buf3[0] = 0; + salt_buf3[1] = 0; + salt_buf3[2] = 0; + salt_buf3[3] = 0; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * reverse + */ + + const u32 e_rev = rotl32 (search[1], 2u); + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0_t[4]; + + w0_t[0] = pw_buf0[0]; + w0_t[1] = pw_buf0[1]; + w0_t[2] = pw_buf0[2]; + w0_t[3] = pw_buf0[3]; + + u32x w1_t[4]; + + w1_t[0] = pw_buf1[0]; + w1_t[1] = pw_buf1[1]; + w1_t[2] = pw_buf1[2]; + w1_t[3] = pw_buf1[3]; + + u32x w2_t[4]; + + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + + u32x w3_t[4]; + + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = 0; + + const u32 out_len = apply_rules (c_rules[il_pos].cmds, w0_t, w1_t, pw_len); + + /** + * prepend salt + */ + + switch_buffer_by_offset (w0_t, w1_t, w2_t, w3_t, salt_len); + + w0_t[0] |= salt_buf0[0]; + w0_t[1] |= salt_buf0[1]; + w0_t[2] |= salt_buf0[2]; + w0_t[3] |= salt_buf0[3]; + w1_t[0] |= salt_buf1[0]; + w1_t[1] |= salt_buf1[1]; + w1_t[2] |= salt_buf1[2]; + w1_t[3] |= salt_buf1[3]; + w2_t[0] |= salt_buf2[0]; + w2_t[1] |= salt_buf2[1]; + w2_t[2] |= salt_buf2[2]; + w2_t[3] |= salt_buf2[3]; + w3_t[0] |= salt_buf3[0]; + w3_t[1] |= salt_buf3[1]; + w3_t[2] |= salt_buf3[2]; + w3_t[3] |= salt_buf3[3]; + + /** + * append salt + */ + + u32 s0[4]; + + s0[0] = salt_buf0[0]; + s0[1] = salt_buf0[1]; + s0[2] = salt_buf0[2]; + s0[3] = salt_buf0[3]; + + u32 s1[4]; + + s1[0] = salt_buf1[0]; + s1[1] = salt_buf1[1]; + s1[2] = salt_buf1[2]; + s1[3] = salt_buf1[3]; + + u32 s2[4]; + + s2[0] = 0; + s2[1] = 0; + s2[2] = 0; + s2[3] = 0; + + u32 s3[4]; + + s3[0] = 0; + s3[1] = 0; + s3[2] = 0; + s3[3] = 0; + + switch_buffer_by_offset (s0, s1, s2, s3, salt_len + out_len); + + w0_t[0] |= s0[0]; + w0_t[1] |= s0[1]; + w0_t[2] |= s0[2]; + w0_t[3] |= s0[3]; + w1_t[0] |= s1[0]; + w1_t[1] |= s1[1]; + w1_t[2] |= s1[2]; + w1_t[3] |= s1[3]; + w2_t[0] |= s2[0]; + w2_t[1] |= s2[1]; + w2_t[2] |= s2[2]; + w2_t[3] |= s2[3]; + w3_t[0] |= s3[0]; + w3_t[1] |= s3[1]; + w3_t[2] |= s3[2]; + w3_t[3] |= s3[3]; + + const u32 pw_salt_len = salt_len + out_len + salt_len; + + append_0x80_4 (w0_t, w1_t, w2_t, w3_t, pw_salt_len); + + u32x w0 = swap_workaround (w0_t[0]); + u32x w1 = swap_workaround (w0_t[1]); + u32x w2 = swap_workaround (w0_t[2]); + u32x w3 = swap_workaround (w0_t[3]); + u32x w4 = swap_workaround (w1_t[0]); + u32x w5 = swap_workaround (w1_t[1]); + u32x w6 = swap_workaround (w1_t[2]); + u32x w7 = swap_workaround (w1_t[3]); + u32x w8 = swap_workaround (w2_t[0]); + u32x w9 = swap_workaround (w2_t[1]); + u32x wa = swap_workaround (w2_t[2]); + u32x wb = swap_workaround (w2_t[3]); + u32x wc = swap_workaround (w3_t[0]); + u32x wd = swap_workaround (w3_t[1]); + u32x we = 0; + u32x wf = pw_salt_len * 8; + + /** + * sha1 + */ + + u32x a = SHA1M_A; + u32x b = SHA1M_B; + u32x c = SHA1M_C; + u32x d = SHA1M_D; + u32x e = SHA1M_E; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w0); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w1); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w2); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w3); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w4); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w5); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w6); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w7); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w8); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w9); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wa); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, wb); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, wc); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, wd); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, we); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wf); + w0 = rotl32 ((wd ^ w8 ^ w2 ^ w0), 1u); SHA1_STEP (SHA1_F0o, e, a, b, c, d, w0); + w1 = rotl32 ((we ^ w9 ^ w3 ^ w1), 1u); SHA1_STEP (SHA1_F0o, d, e, a, b, c, w1); + w2 = rotl32 ((wf ^ wa ^ w4 ^ w2), 1u); SHA1_STEP (SHA1_F0o, c, d, e, a, b, w2); + w3 = rotl32 ((w0 ^ wb ^ w5 ^ w3), 1u); SHA1_STEP (SHA1_F0o, b, c, d, e, a, w3); + + #undef K + #define K SHA1C01 + + w4 = rotl32 ((w1 ^ wc ^ w6 ^ w4), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w4); + w5 = rotl32 ((w2 ^ wd ^ w7 ^ w5), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w5); + w6 = rotl32 ((w3 ^ we ^ w8 ^ w6), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w6); + w7 = rotl32 ((w4 ^ wf ^ w9 ^ w7), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w7); + w8 = rotl32 ((w5 ^ w0 ^ wa ^ w8), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w8); + w9 = rotl32 ((w6 ^ w1 ^ wb ^ w9), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w9); + wa = rotl32 ((w7 ^ w2 ^ wc ^ wa), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wa); + wb = rotl32 ((w8 ^ w3 ^ wd ^ wb), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wb); + wc = rotl32 ((w9 ^ w4 ^ we ^ wc), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wc); + wd = rotl32 ((wa ^ w5 ^ wf ^ wd), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wd); + we = rotl32 ((wb ^ w6 ^ w0 ^ we), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, we); + wf = rotl32 ((wc ^ w7 ^ w1 ^ wf), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wf); + w0 = rotl32 ((wd ^ w8 ^ w2 ^ w0), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w0); + w1 = rotl32 ((we ^ w9 ^ w3 ^ w1), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1); + w2 = rotl32 ((wf ^ wa ^ w4 ^ w2), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w2); + w3 = rotl32 ((w0 ^ wb ^ w5 ^ w3), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w3); + w4 = rotl32 ((w1 ^ wc ^ w6 ^ w4), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w4); + w5 = rotl32 ((w2 ^ wd ^ w7 ^ w5), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w5); + w6 = rotl32 ((w3 ^ we ^ w8 ^ w6), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w6); + w7 = rotl32 ((w4 ^ wf ^ w9 ^ w7), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w7); + + #undef K + #define K SHA1C02 + + w8 = rotl32 ((w5 ^ w0 ^ wa ^ w8), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w8); + w9 = rotl32 ((w6 ^ w1 ^ wb ^ w9), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w9); + wa = rotl32 ((w7 ^ w2 ^ wc ^ wa), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wa); + wb = rotl32 ((w8 ^ w3 ^ wd ^ wb), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wb); + wc = rotl32 ((w9 ^ w4 ^ we ^ wc), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wc); + wd = rotl32 ((wa ^ w5 ^ wf ^ wd), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, wd); + we = rotl32 ((wb ^ w6 ^ w0 ^ we), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, we); + wf = rotl32 ((wc ^ w7 ^ w1 ^ wf), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wf); + w0 = rotl32 ((wd ^ w8 ^ w2 ^ w0), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w0); + w1 = rotl32 ((we ^ w9 ^ w3 ^ w1), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w1); + w2 = rotl32 ((wf ^ wa ^ w4 ^ w2), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w2); + w3 = rotl32 ((w0 ^ wb ^ w5 ^ w3), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w3); + w4 = rotl32 ((w1 ^ wc ^ w6 ^ w4), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w4); + w5 = rotl32 ((w2 ^ wd ^ w7 ^ w5), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w5); + w6 = rotl32 ((w3 ^ we ^ w8 ^ w6), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w6); + w7 = rotl32 ((w4 ^ wf ^ w9 ^ w7), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w7); + w8 = rotl32 ((w5 ^ w0 ^ wa ^ w8), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w8); + w9 = rotl32 ((w6 ^ w1 ^ wb ^ w9), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w9); + wa = rotl32 ((w7 ^ w2 ^ wc ^ wa), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wa); + wb = rotl32 ((w8 ^ w3 ^ wd ^ wb), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wb); + + #undef K + #define K SHA1C03 + + wc = rotl32 ((w9 ^ w4 ^ we ^ wc), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wc); + wd = rotl32 ((wa ^ w5 ^ wf ^ wd), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wd); + we = rotl32 ((wb ^ w6 ^ w0 ^ we), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, we); + wf = rotl32 ((wc ^ w7 ^ w1 ^ wf), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wf); + w0 = rotl32 ((wd ^ w8 ^ w2 ^ w0), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w0); + w1 = rotl32 ((we ^ w9 ^ w3 ^ w1), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w1); + w2 = rotl32 ((wf ^ wa ^ w4 ^ w2), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w2); + w3 = rotl32 ((w0 ^ wb ^ w5 ^ w3), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w3); + w4 = rotl32 ((w1 ^ wc ^ w6 ^ w4), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w4); + w5 = rotl32 ((w2 ^ wd ^ w7 ^ w5), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w5); + w6 = rotl32 ((w3 ^ we ^ w8 ^ w6), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w6); + w7 = rotl32 ((w4 ^ wf ^ w9 ^ w7), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w7); + w8 = rotl32 ((w5 ^ w0 ^ wa ^ w8), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w8); + w9 = rotl32 ((w6 ^ w1 ^ wb ^ w9), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w9); + wa = rotl32 ((w7 ^ w2 ^ wc ^ wa), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wa); + wb = rotl32 ((w8 ^ w3 ^ wd ^ wb), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wb); + + if (e != e_rev) continue; + + wc = rotl32 ((w9 ^ w4 ^ we ^ wc), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wc); + wd = rotl32 ((wa ^ w5 ^ wf ^ wd), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wd); + we = rotl32 ((wb ^ w6 ^ w0 ^ we), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, we); + wf = rotl32 ((wc ^ w7 ^ w1 ^ wf), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wf); + + const u32x r0 = d; + const u32x r1 = e; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_S + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m04900_s08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m04900_s16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/nv/m04900_a1.cu b/nv/m04900_a1.cu new file mode 100644 index 0000000000..74f6ae14de --- /dev/null +++ b/nv/m04900_a1.cu @@ -0,0 +1,812 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _SHA1_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW2 +#define VECT_SIZE4 +#endif + +#define DGST_R0 3 +#define DGST_R1 4 +#define DGST_R2 2 +#define DGST_R3 1 + +#include "include/kernel_functions.c" +#include "types_nv.c" +#include "common_nv.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +__device__ __constant__ comb_t c_combs[1024]; + +extern "C" __global__ void __launch_bounds__ (256, 1) m04900_m04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, c_combs[0].pw_len); + } + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[ 1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[ 2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[ 3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[ 4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[ 5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[ 6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[ 7]; + + u32 salt_buf2[4]; + + salt_buf2[0] = 0; + salt_buf2[1] = 0; + salt_buf2[2] = 0; + salt_buf2[3] = 0; + + u32 salt_buf3[4]; + + salt_buf3[0] = 0; + salt_buf3[1] = 0; + salt_buf3[2] = 0; + salt_buf3[3] = 0; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = c_combs[il_pos].pw_len; + + const u32 pw_len = pw_l_len + pw_r_len; + + u32 wordr0[4]; + + wordr0[0] = c_combs[il_pos].i[0]; + wordr0[1] = c_combs[il_pos].i[1]; + wordr0[2] = c_combs[il_pos].i[2]; + wordr0[3] = c_combs[il_pos].i[3]; + + u32 wordr1[4]; + + wordr1[0] = c_combs[il_pos].i[4]; + wordr1[1] = c_combs[il_pos].i[5]; + wordr1[2] = c_combs[il_pos].i[6]; + wordr1[3] = c_combs[il_pos].i[7]; + + u32 wordr2[4]; + + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + + u32 wordr3[4]; + + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + u32x w0_t[4]; + + w0_t[0] = wordl0[0] | wordr0[0]; + w0_t[1] = wordl0[1] | wordr0[1]; + w0_t[2] = wordl0[2] | wordr0[2]; + w0_t[3] = wordl0[3] | wordr0[3]; + + u32x w1_t[4]; + + w1_t[0] = wordl1[0] | wordr1[0]; + w1_t[1] = wordl1[1] | wordr1[1]; + w1_t[2] = wordl1[2] | wordr1[2]; + w1_t[3] = wordl1[3] | wordr1[3]; + + u32x w2_t[4]; + + w2_t[0] = wordl2[0] | wordr2[0]; + w2_t[1] = wordl2[1] | wordr2[1]; + w2_t[2] = wordl2[2] | wordr2[2]; + w2_t[3] = wordl2[3] | wordr2[3]; + + u32x w3_t[4]; + + w3_t[0] = wordl3[0] | wordr3[0]; + w3_t[1] = wordl3[1] | wordr3[1]; + w3_t[2] = 0; + w3_t[3] = 0; + + /** + * prepend salt + */ + + switch_buffer_by_offset (w0_t, w1_t, w2_t, w3_t, salt_len); + + w0_t[0] |= salt_buf0[0]; + w0_t[1] |= salt_buf0[1]; + w0_t[2] |= salt_buf0[2]; + w0_t[3] |= salt_buf0[3]; + w1_t[0] |= salt_buf1[0]; + w1_t[1] |= salt_buf1[1]; + w1_t[2] |= salt_buf1[2]; + w1_t[3] |= salt_buf1[3]; + w2_t[0] |= salt_buf2[0]; + w2_t[1] |= salt_buf2[1]; + w2_t[2] |= salt_buf2[2]; + w2_t[3] |= salt_buf2[3]; + w3_t[0] |= salt_buf3[0]; + w3_t[1] |= salt_buf3[1]; + w3_t[2] |= salt_buf3[2]; + w3_t[3] |= salt_buf3[3]; + + /** + * append salt + */ + + u32 s0[4]; + + s0[0] = salt_buf0[0]; + s0[1] = salt_buf0[1]; + s0[2] = salt_buf0[2]; + s0[3] = salt_buf0[3]; + + u32 s1[4]; + + s1[0] = salt_buf1[0]; + s1[1] = salt_buf1[1]; + s1[2] = salt_buf1[2]; + s1[3] = salt_buf1[3]; + + u32 s2[4]; + + s2[0] = 0; + s2[1] = 0; + s2[2] = 0; + s2[3] = 0; + + u32 s3[4]; + + s3[0] = 0; + s3[1] = 0; + s3[2] = 0; + s3[3] = 0; + + switch_buffer_by_offset (s0, s1, s2, s3, salt_len + pw_len); + + w0_t[0] |= s0[0]; + w0_t[1] |= s0[1]; + w0_t[2] |= s0[2]; + w0_t[3] |= s0[3]; + w1_t[0] |= s1[0]; + w1_t[1] |= s1[1]; + w1_t[2] |= s1[2]; + w1_t[3] |= s1[3]; + w2_t[0] |= s2[0]; + w2_t[1] |= s2[1]; + w2_t[2] |= s2[2]; + w2_t[3] |= s2[3]; + w3_t[0] |= s3[0]; + w3_t[1] |= s3[1]; + w3_t[2] |= s3[2]; + w3_t[3] |= s3[3]; + + const u32 pw_salt_len = salt_len + pw_len + salt_len; + + append_0x80_4 (w0_t, w1_t, w2_t, w3_t, pw_salt_len); + + u32x w0 = swap_workaround (w0_t[0]); + u32x w1 = swap_workaround (w0_t[1]); + u32x w2 = swap_workaround (w0_t[2]); + u32x w3 = swap_workaround (w0_t[3]); + u32x w4 = swap_workaround (w1_t[0]); + u32x w5 = swap_workaround (w1_t[1]); + u32x w6 = swap_workaround (w1_t[2]); + u32x w7 = swap_workaround (w1_t[3]); + u32x w8 = swap_workaround (w2_t[0]); + u32x w9 = swap_workaround (w2_t[1]); + u32x wa = swap_workaround (w2_t[2]); + u32x wb = swap_workaround (w2_t[3]); + u32x wc = swap_workaround (w3_t[0]); + u32x wd = swap_workaround (w3_t[1]); + u32x we = 0; + u32x wf = pw_salt_len * 8; + + /** + * sha1 + */ + + u32x a = SHA1M_A; + u32x b = SHA1M_B; + u32x c = SHA1M_C; + u32x d = SHA1M_D; + u32x e = SHA1M_E; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w0); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w1); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w2); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w3); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w4); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w5); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w6); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w7); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w8); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w9); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wa); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, wb); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, wc); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, wd); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, we); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wf); + w0 = rotl32 ((wd ^ w8 ^ w2 ^ w0), 1u); SHA1_STEP (SHA1_F0o, e, a, b, c, d, w0); + w1 = rotl32 ((we ^ w9 ^ w3 ^ w1), 1u); SHA1_STEP (SHA1_F0o, d, e, a, b, c, w1); + w2 = rotl32 ((wf ^ wa ^ w4 ^ w2), 1u); SHA1_STEP (SHA1_F0o, c, d, e, a, b, w2); + w3 = rotl32 ((w0 ^ wb ^ w5 ^ w3), 1u); SHA1_STEP (SHA1_F0o, b, c, d, e, a, w3); + + #undef K + #define K SHA1C01 + + w4 = rotl32 ((w1 ^ wc ^ w6 ^ w4), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w4); + w5 = rotl32 ((w2 ^ wd ^ w7 ^ w5), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w5); + w6 = rotl32 ((w3 ^ we ^ w8 ^ w6), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w6); + w7 = rotl32 ((w4 ^ wf ^ w9 ^ w7), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w7); + w8 = rotl32 ((w5 ^ w0 ^ wa ^ w8), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w8); + w9 = rotl32 ((w6 ^ w1 ^ wb ^ w9), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w9); + wa = rotl32 ((w7 ^ w2 ^ wc ^ wa), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wa); + wb = rotl32 ((w8 ^ w3 ^ wd ^ wb), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wb); + wc = rotl32 ((w9 ^ w4 ^ we ^ wc), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wc); + wd = rotl32 ((wa ^ w5 ^ wf ^ wd), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wd); + we = rotl32 ((wb ^ w6 ^ w0 ^ we), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, we); + wf = rotl32 ((wc ^ w7 ^ w1 ^ wf), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wf); + w0 = rotl32 ((wd ^ w8 ^ w2 ^ w0), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w0); + w1 = rotl32 ((we ^ w9 ^ w3 ^ w1), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1); + w2 = rotl32 ((wf ^ wa ^ w4 ^ w2), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w2); + w3 = rotl32 ((w0 ^ wb ^ w5 ^ w3), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w3); + w4 = rotl32 ((w1 ^ wc ^ w6 ^ w4), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w4); + w5 = rotl32 ((w2 ^ wd ^ w7 ^ w5), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w5); + w6 = rotl32 ((w3 ^ we ^ w8 ^ w6), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w6); + w7 = rotl32 ((w4 ^ wf ^ w9 ^ w7), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w7); + + #undef K + #define K SHA1C02 + + w8 = rotl32 ((w5 ^ w0 ^ wa ^ w8), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w8); + w9 = rotl32 ((w6 ^ w1 ^ wb ^ w9), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w9); + wa = rotl32 ((w7 ^ w2 ^ wc ^ wa), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wa); + wb = rotl32 ((w8 ^ w3 ^ wd ^ wb), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wb); + wc = rotl32 ((w9 ^ w4 ^ we ^ wc), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wc); + wd = rotl32 ((wa ^ w5 ^ wf ^ wd), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, wd); + we = rotl32 ((wb ^ w6 ^ w0 ^ we), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, we); + wf = rotl32 ((wc ^ w7 ^ w1 ^ wf), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wf); + w0 = rotl32 ((wd ^ w8 ^ w2 ^ w0), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w0); + w1 = rotl32 ((we ^ w9 ^ w3 ^ w1), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w1); + w2 = rotl32 ((wf ^ wa ^ w4 ^ w2), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w2); + w3 = rotl32 ((w0 ^ wb ^ w5 ^ w3), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w3); + w4 = rotl32 ((w1 ^ wc ^ w6 ^ w4), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w4); + w5 = rotl32 ((w2 ^ wd ^ w7 ^ w5), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w5); + w6 = rotl32 ((w3 ^ we ^ w8 ^ w6), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w6); + w7 = rotl32 ((w4 ^ wf ^ w9 ^ w7), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w7); + w8 = rotl32 ((w5 ^ w0 ^ wa ^ w8), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w8); + w9 = rotl32 ((w6 ^ w1 ^ wb ^ w9), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w9); + wa = rotl32 ((w7 ^ w2 ^ wc ^ wa), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wa); + wb = rotl32 ((w8 ^ w3 ^ wd ^ wb), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wb); + + #undef K + #define K SHA1C03 + + wc = rotl32 ((w9 ^ w4 ^ we ^ wc), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wc); + wd = rotl32 ((wa ^ w5 ^ wf ^ wd), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wd); + we = rotl32 ((wb ^ w6 ^ w0 ^ we), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, we); + wf = rotl32 ((wc ^ w7 ^ w1 ^ wf), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wf); + w0 = rotl32 ((wd ^ w8 ^ w2 ^ w0), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w0); + w1 = rotl32 ((we ^ w9 ^ w3 ^ w1), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w1); + w2 = rotl32 ((wf ^ wa ^ w4 ^ w2), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w2); + w3 = rotl32 ((w0 ^ wb ^ w5 ^ w3), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w3); + w4 = rotl32 ((w1 ^ wc ^ w6 ^ w4), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w4); + w5 = rotl32 ((w2 ^ wd ^ w7 ^ w5), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w5); + w6 = rotl32 ((w3 ^ we ^ w8 ^ w6), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w6); + w7 = rotl32 ((w4 ^ wf ^ w9 ^ w7), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w7); + w8 = rotl32 ((w5 ^ w0 ^ wa ^ w8), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w8); + w9 = rotl32 ((w6 ^ w1 ^ wb ^ w9), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w9); + wa = rotl32 ((w7 ^ w2 ^ wc ^ wa), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wa); + wb = rotl32 ((w8 ^ w3 ^ wd ^ wb), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wb); + wc = rotl32 ((w9 ^ w4 ^ we ^ wc), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wc); + wd = rotl32 ((wa ^ w5 ^ wf ^ wd), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wd); + we = rotl32 ((wb ^ w6 ^ w0 ^ we), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, we); + wf = rotl32 ((wc ^ w7 ^ w1 ^ wf), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wf); + + const u32x r0 = d; + const u32x r1 = e; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_M + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m04900_m08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m04900_m16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m04900_s04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, c_combs[0].pw_len); + } + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[ 1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[ 2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[ 3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[ 4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[ 5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[ 6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[ 7]; + + u32 salt_buf2[4]; + + salt_buf2[0] = 0; + salt_buf2[1] = 0; + salt_buf2[2] = 0; + salt_buf2[3] = 0; + + u32 salt_buf3[4]; + + salt_buf3[0] = 0; + salt_buf3[1] = 0; + salt_buf3[2] = 0; + salt_buf3[3] = 0; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * reverse + */ + + const u32 e_rev = rotl32 (search[1], 2u); + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = c_combs[il_pos].pw_len; + + const u32 pw_len = pw_l_len + pw_r_len; + + u32 wordr0[4]; + + wordr0[0] = c_combs[il_pos].i[0]; + wordr0[1] = c_combs[il_pos].i[1]; + wordr0[2] = c_combs[il_pos].i[2]; + wordr0[3] = c_combs[il_pos].i[3]; + + u32 wordr1[4]; + + wordr1[0] = c_combs[il_pos].i[4]; + wordr1[1] = c_combs[il_pos].i[5]; + wordr1[2] = c_combs[il_pos].i[6]; + wordr1[3] = c_combs[il_pos].i[7]; + + u32 wordr2[4]; + + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + + u32 wordr3[4]; + + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + u32x w0_t[4]; + + w0_t[0] = wordl0[0] | wordr0[0]; + w0_t[1] = wordl0[1] | wordr0[1]; + w0_t[2] = wordl0[2] | wordr0[2]; + w0_t[3] = wordl0[3] | wordr0[3]; + + u32x w1_t[4]; + + w1_t[0] = wordl1[0] | wordr1[0]; + w1_t[1] = wordl1[1] | wordr1[1]; + w1_t[2] = wordl1[2] | wordr1[2]; + w1_t[3] = wordl1[3] | wordr1[3]; + + u32x w2_t[4]; + + w2_t[0] = wordl2[0] | wordr2[0]; + w2_t[1] = wordl2[1] | wordr2[1]; + w2_t[2] = wordl2[2] | wordr2[2]; + w2_t[3] = wordl2[3] | wordr2[3]; + + u32x w3_t[4]; + + w3_t[0] = wordl3[0] | wordr3[0]; + w3_t[1] = wordl3[1] | wordr3[1]; + w3_t[2] = 0; + w3_t[3] = 0; + + /** + * prepend salt + */ + + switch_buffer_by_offset (w0_t, w1_t, w2_t, w3_t, salt_len); + + w0_t[0] |= salt_buf0[0]; + w0_t[1] |= salt_buf0[1]; + w0_t[2] |= salt_buf0[2]; + w0_t[3] |= salt_buf0[3]; + w1_t[0] |= salt_buf1[0]; + w1_t[1] |= salt_buf1[1]; + w1_t[2] |= salt_buf1[2]; + w1_t[3] |= salt_buf1[3]; + w2_t[0] |= salt_buf2[0]; + w2_t[1] |= salt_buf2[1]; + w2_t[2] |= salt_buf2[2]; + w2_t[3] |= salt_buf2[3]; + w3_t[0] |= salt_buf3[0]; + w3_t[1] |= salt_buf3[1]; + w3_t[2] |= salt_buf3[2]; + w3_t[3] |= salt_buf3[3]; + + /** + * append salt + */ + + u32 s0[4]; + + s0[0] = salt_buf0[0]; + s0[1] = salt_buf0[1]; + s0[2] = salt_buf0[2]; + s0[3] = salt_buf0[3]; + + u32 s1[4]; + + s1[0] = salt_buf1[0]; + s1[1] = salt_buf1[1]; + s1[2] = salt_buf1[2]; + s1[3] = salt_buf1[3]; + + u32 s2[4]; + + s2[0] = 0; + s2[1] = 0; + s2[2] = 0; + s2[3] = 0; + + u32 s3[4]; + + s3[0] = 0; + s3[1] = 0; + s3[2] = 0; + s3[3] = 0; + + switch_buffer_by_offset (s0, s1, s2, s3, salt_len + pw_len); + + w0_t[0] |= s0[0]; + w0_t[1] |= s0[1]; + w0_t[2] |= s0[2]; + w0_t[3] |= s0[3]; + w1_t[0] |= s1[0]; + w1_t[1] |= s1[1]; + w1_t[2] |= s1[2]; + w1_t[3] |= s1[3]; + w2_t[0] |= s2[0]; + w2_t[1] |= s2[1]; + w2_t[2] |= s2[2]; + w2_t[3] |= s2[3]; + w3_t[0] |= s3[0]; + w3_t[1] |= s3[1]; + w3_t[2] |= s3[2]; + w3_t[3] |= s3[3]; + + const u32 pw_salt_len = salt_len + pw_len + salt_len; + + append_0x80_4 (w0_t, w1_t, w2_t, w3_t, pw_salt_len); + + u32x w0 = swap_workaround (w0_t[0]); + u32x w1 = swap_workaround (w0_t[1]); + u32x w2 = swap_workaround (w0_t[2]); + u32x w3 = swap_workaround (w0_t[3]); + u32x w4 = swap_workaround (w1_t[0]); + u32x w5 = swap_workaround (w1_t[1]); + u32x w6 = swap_workaround (w1_t[2]); + u32x w7 = swap_workaround (w1_t[3]); + u32x w8 = swap_workaround (w2_t[0]); + u32x w9 = swap_workaround (w2_t[1]); + u32x wa = swap_workaround (w2_t[2]); + u32x wb = swap_workaround (w2_t[3]); + u32x wc = swap_workaround (w3_t[0]); + u32x wd = swap_workaround (w3_t[1]); + u32x we = 0; + u32x wf = pw_salt_len * 8; + + /** + * sha1 + */ + + u32x a = SHA1M_A; + u32x b = SHA1M_B; + u32x c = SHA1M_C; + u32x d = SHA1M_D; + u32x e = SHA1M_E; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w0); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w1); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w2); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w3); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w4); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w5); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w6); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w7); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w8); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w9); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wa); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, wb); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, wc); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, wd); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, we); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wf); + w0 = rotl32 ((wd ^ w8 ^ w2 ^ w0), 1u); SHA1_STEP (SHA1_F0o, e, a, b, c, d, w0); + w1 = rotl32 ((we ^ w9 ^ w3 ^ w1), 1u); SHA1_STEP (SHA1_F0o, d, e, a, b, c, w1); + w2 = rotl32 ((wf ^ wa ^ w4 ^ w2), 1u); SHA1_STEP (SHA1_F0o, c, d, e, a, b, w2); + w3 = rotl32 ((w0 ^ wb ^ w5 ^ w3), 1u); SHA1_STEP (SHA1_F0o, b, c, d, e, a, w3); + + #undef K + #define K SHA1C01 + + w4 = rotl32 ((w1 ^ wc ^ w6 ^ w4), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w4); + w5 = rotl32 ((w2 ^ wd ^ w7 ^ w5), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w5); + w6 = rotl32 ((w3 ^ we ^ w8 ^ w6), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w6); + w7 = rotl32 ((w4 ^ wf ^ w9 ^ w7), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w7); + w8 = rotl32 ((w5 ^ w0 ^ wa ^ w8), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w8); + w9 = rotl32 ((w6 ^ w1 ^ wb ^ w9), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w9); + wa = rotl32 ((w7 ^ w2 ^ wc ^ wa), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wa); + wb = rotl32 ((w8 ^ w3 ^ wd ^ wb), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wb); + wc = rotl32 ((w9 ^ w4 ^ we ^ wc), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wc); + wd = rotl32 ((wa ^ w5 ^ wf ^ wd), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wd); + we = rotl32 ((wb ^ w6 ^ w0 ^ we), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, we); + wf = rotl32 ((wc ^ w7 ^ w1 ^ wf), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wf); + w0 = rotl32 ((wd ^ w8 ^ w2 ^ w0), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w0); + w1 = rotl32 ((we ^ w9 ^ w3 ^ w1), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1); + w2 = rotl32 ((wf ^ wa ^ w4 ^ w2), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w2); + w3 = rotl32 ((w0 ^ wb ^ w5 ^ w3), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w3); + w4 = rotl32 ((w1 ^ wc ^ w6 ^ w4), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w4); + w5 = rotl32 ((w2 ^ wd ^ w7 ^ w5), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w5); + w6 = rotl32 ((w3 ^ we ^ w8 ^ w6), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w6); + w7 = rotl32 ((w4 ^ wf ^ w9 ^ w7), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w7); + + #undef K + #define K SHA1C02 + + w8 = rotl32 ((w5 ^ w0 ^ wa ^ w8), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w8); + w9 = rotl32 ((w6 ^ w1 ^ wb ^ w9), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w9); + wa = rotl32 ((w7 ^ w2 ^ wc ^ wa), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wa); + wb = rotl32 ((w8 ^ w3 ^ wd ^ wb), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wb); + wc = rotl32 ((w9 ^ w4 ^ we ^ wc), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wc); + wd = rotl32 ((wa ^ w5 ^ wf ^ wd), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, wd); + we = rotl32 ((wb ^ w6 ^ w0 ^ we), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, we); + wf = rotl32 ((wc ^ w7 ^ w1 ^ wf), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wf); + w0 = rotl32 ((wd ^ w8 ^ w2 ^ w0), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w0); + w1 = rotl32 ((we ^ w9 ^ w3 ^ w1), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w1); + w2 = rotl32 ((wf ^ wa ^ w4 ^ w2), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w2); + w3 = rotl32 ((w0 ^ wb ^ w5 ^ w3), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w3); + w4 = rotl32 ((w1 ^ wc ^ w6 ^ w4), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w4); + w5 = rotl32 ((w2 ^ wd ^ w7 ^ w5), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w5); + w6 = rotl32 ((w3 ^ we ^ w8 ^ w6), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w6); + w7 = rotl32 ((w4 ^ wf ^ w9 ^ w7), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w7); + w8 = rotl32 ((w5 ^ w0 ^ wa ^ w8), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w8); + w9 = rotl32 ((w6 ^ w1 ^ wb ^ w9), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w9); + wa = rotl32 ((w7 ^ w2 ^ wc ^ wa), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wa); + wb = rotl32 ((w8 ^ w3 ^ wd ^ wb), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wb); + + #undef K + #define K SHA1C03 + + wc = rotl32 ((w9 ^ w4 ^ we ^ wc), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wc); + wd = rotl32 ((wa ^ w5 ^ wf ^ wd), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wd); + we = rotl32 ((wb ^ w6 ^ w0 ^ we), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, we); + wf = rotl32 ((wc ^ w7 ^ w1 ^ wf), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wf); + w0 = rotl32 ((wd ^ w8 ^ w2 ^ w0), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w0); + w1 = rotl32 ((we ^ w9 ^ w3 ^ w1), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w1); + w2 = rotl32 ((wf ^ wa ^ w4 ^ w2), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w2); + w3 = rotl32 ((w0 ^ wb ^ w5 ^ w3), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w3); + w4 = rotl32 ((w1 ^ wc ^ w6 ^ w4), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w4); + w5 = rotl32 ((w2 ^ wd ^ w7 ^ w5), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w5); + w6 = rotl32 ((w3 ^ we ^ w8 ^ w6), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w6); + w7 = rotl32 ((w4 ^ wf ^ w9 ^ w7), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w7); + w8 = rotl32 ((w5 ^ w0 ^ wa ^ w8), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w8); + w9 = rotl32 ((w6 ^ w1 ^ wb ^ w9), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w9); + wa = rotl32 ((w7 ^ w2 ^ wc ^ wa), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wa); + wb = rotl32 ((w8 ^ w3 ^ wd ^ wb), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wb); + + if (e != e_rev) continue; + + wc = rotl32 ((w9 ^ w4 ^ we ^ wc), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wc); + wd = rotl32 ((wa ^ w5 ^ wf ^ wd), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wd); + we = rotl32 ((wb ^ w6 ^ w0 ^ we), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, we); + wf = rotl32 ((wc ^ w7 ^ w1 ^ wf), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wf); + + const u32x r0 = d; + const u32x r1 = e; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_S + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m04900_s08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m04900_s16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/nv/m04900_a3.cu b/nv/m04900_a3.cu new file mode 100644 index 0000000000..14fd0adede --- /dev/null +++ b/nv/m04900_a3.cu @@ -0,0 +1,936 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _SHA1_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW2 +#define VECT_SIZE4 +#endif + +#define DGST_R0 3 +#define DGST_R1 4 +#define DGST_R2 2 +#define DGST_R3 1 + +#include "include/kernel_functions.c" +#include "types_nv.c" +#include "common_nv.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +__device__ __constant__ bf_t c_bfs[1024]; + +__device__ static void m04900m (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], const u32 pw_len, const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset) +{ + /** + * modifier + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + const u32 lid = threadIdx.x; + + /** + * salt + */ + + u32 salt_buf0_t[4]; + + salt_buf0_t[0] = salt_bufs[salt_pos].salt_buf[0]; + salt_buf0_t[1] = salt_bufs[salt_pos].salt_buf[1]; + salt_buf0_t[2] = salt_bufs[salt_pos].salt_buf[2]; + salt_buf0_t[3] = salt_bufs[salt_pos].salt_buf[3]; + + u32 salt_buf1_t[4]; + + salt_buf1_t[0] = salt_bufs[salt_pos].salt_buf[4]; + salt_buf1_t[1] = salt_bufs[salt_pos].salt_buf[5]; + salt_buf1_t[2] = salt_bufs[salt_pos].salt_buf[6]; + salt_buf1_t[3] = salt_bufs[salt_pos].salt_buf[7]; + + u32 salt_buf2_t[4]; + + salt_buf2_t[0] = 0; + salt_buf2_t[1] = 0; + salt_buf2_t[2] = 0; + salt_buf2_t[3] = 0; + + u32 salt_buf3_t[4]; + + salt_buf3_t[0] = 0; + salt_buf3_t[1] = 0; + salt_buf3_t[2] = 0; + salt_buf3_t[3] = 0; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + const u32 pw_salt_len = salt_len + pw_len + salt_len; + + // first we need to switch the right-hand salt to the correct position (2nd salt) + + switch_buffer_by_offset (salt_buf0_t, salt_buf1_t, salt_buf2_t, salt_buf3_t, salt_len + pw_len); + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[7]; + + u32 salt_buf2[4]; + + salt_buf2[0] = 0; + salt_buf2[1] = 0; + salt_buf2[2] = 0; + salt_buf2[3] = 0; + + u32 salt_buf3[4]; + + salt_buf3[0] = 0; + salt_buf3[1] = 0; + salt_buf3[2] = 0; + salt_buf3[3] = 0; + + // concatenate the 1st and 2nd instance of the salt + + salt_buf0[0] |= salt_buf0_t[0]; + salt_buf0[1] |= salt_buf0_t[1]; + salt_buf0[2] |= salt_buf0_t[2]; + salt_buf0[3] |= salt_buf0_t[3]; + + salt_buf1[0] |= salt_buf1_t[0]; + salt_buf1[1] |= salt_buf1_t[1]; + salt_buf1[2] |= salt_buf1_t[2]; + salt_buf1[3] |= salt_buf1_t[3]; + + salt_buf2[0] |= salt_buf2_t[0]; + salt_buf2[1] |= salt_buf2_t[1]; + salt_buf2[2] |= salt_buf2_t[2]; + salt_buf2[3] |= salt_buf2_t[3]; + + salt_buf3[0] |= salt_buf3_t[0]; + salt_buf3[1] |= salt_buf3_t[1]; + salt_buf3[2] |= salt_buf3_t[2]; + salt_buf3[3] |= salt_buf3_t[3]; + + append_0x80_4 (salt_buf0, salt_buf1, salt_buf2, salt_buf3, pw_salt_len); + + /** + * loop + */ + + u32x w0l = w0[0]; + + for (u32 il_pos = 0; il_pos < bfs_cnt; il_pos++) + { + const u32 w0r = c_bfs[il_pos].i; + + w0[0] = w0l | w0r; + + u32x w0_t[4]; + + w0_t[0] = w0[0]; + w0_t[1] = w0[1]; + w0_t[2] = w0[2]; + w0_t[3] = w0[3]; + + u32x w1_t[4]; + + w1_t[0] = w1[0]; + w1_t[1] = w1[1]; + w1_t[2] = w1[2]; + w1_t[3] = w1[3]; + + u32x w2_t[4]; + + w2_t[0] = w2[0]; + w2_t[1] = w2[1]; + w2_t[2] = w2[2]; + w2_t[3] = w2[3]; + + u32x w3_t[4]; + + w3_t[0] = w3[0]; + w3_t[1] = w3[1]; + w3_t[2] = w3[2]; + w3_t[3] = w3[3]; + + /** + * put the password after the first salt but before the second salt + */ + + switch_buffer_by_offset (w0_t, w1_t, w2_t, w3_t, salt_len); + + w0_t[0] |= salt_buf0[0]; + w0_t[1] |= salt_buf0[1]; + w0_t[2] |= salt_buf0[2]; + w0_t[3] |= salt_buf0[3]; + w1_t[0] |= salt_buf1[0]; + w1_t[1] |= salt_buf1[1]; + w1_t[2] |= salt_buf1[2]; + w1_t[3] |= salt_buf1[3]; + w2_t[0] |= salt_buf2[0]; + w2_t[1] |= salt_buf2[1]; + w2_t[2] |= salt_buf2[2]; + w2_t[3] |= salt_buf2[3]; + w3_t[0] |= salt_buf3[0]; + w3_t[1] |= salt_buf3[1]; + w3_t[2] |= salt_buf3[2]; + + u32x w0 = swap_workaround (w0_t[0]); + u32x w1 = swap_workaround (w0_t[1]); + u32x w2 = swap_workaround (w0_t[2]); + u32x w3 = swap_workaround (w0_t[3]); + u32x w4 = swap_workaround (w1_t[0]); + u32x w5 = swap_workaround (w1_t[1]); + u32x w6 = swap_workaround (w1_t[2]); + u32x w7 = swap_workaround (w1_t[3]); + u32x w8 = swap_workaround (w2_t[0]); + u32x w9 = swap_workaround (w2_t[1]); + u32x wa = swap_workaround (w2_t[2]); + u32x wb = swap_workaround (w2_t[3]); + u32x wc = swap_workaround (w3_t[0]); + u32x wd = swap_workaround (w3_t[1]); + u32x we = swap_workaround (w3_t[2]); + u32x wf = pw_salt_len * 8; + + /** + * sha1 + */ + + u32x a = SHA1M_A; + u32x b = SHA1M_B; + u32x c = SHA1M_C; + u32x d = SHA1M_D; + u32x e = SHA1M_E; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w0); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w1); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w2); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w3); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w4); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w5); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w6); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w7); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w8); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w9); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wa); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, wb); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, wc); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, wd); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, we); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wf); + w0 = rotl32 ((wd ^ w8 ^ w2 ^ w0), 1u); SHA1_STEP (SHA1_F0o, e, a, b, c, d, w0); + w1 = rotl32 ((we ^ w9 ^ w3 ^ w1), 1u); SHA1_STEP (SHA1_F0o, d, e, a, b, c, w1); + w2 = rotl32 ((wf ^ wa ^ w4 ^ w2), 1u); SHA1_STEP (SHA1_F0o, c, d, e, a, b, w2); + w3 = rotl32 ((w0 ^ wb ^ w5 ^ w3), 1u); SHA1_STEP (SHA1_F0o, b, c, d, e, a, w3); + + #undef K + #define K SHA1C01 + + w4 = rotl32 ((w1 ^ wc ^ w6 ^ w4), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w4); + w5 = rotl32 ((w2 ^ wd ^ w7 ^ w5), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w5); + w6 = rotl32 ((w3 ^ we ^ w8 ^ w6), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w6); + w7 = rotl32 ((w4 ^ wf ^ w9 ^ w7), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w7); + w8 = rotl32 ((w5 ^ w0 ^ wa ^ w8), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w8); + w9 = rotl32 ((w6 ^ w1 ^ wb ^ w9), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w9); + wa = rotl32 ((w7 ^ w2 ^ wc ^ wa), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wa); + wb = rotl32 ((w8 ^ w3 ^ wd ^ wb), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wb); + wc = rotl32 ((w9 ^ w4 ^ we ^ wc), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wc); + wd = rotl32 ((wa ^ w5 ^ wf ^ wd), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wd); + we = rotl32 ((wb ^ w6 ^ w0 ^ we), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, we); + wf = rotl32 ((wc ^ w7 ^ w1 ^ wf), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wf); + w0 = rotl32 ((wd ^ w8 ^ w2 ^ w0), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w0); + w1 = rotl32 ((we ^ w9 ^ w3 ^ w1), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1); + w2 = rotl32 ((wf ^ wa ^ w4 ^ w2), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w2); + w3 = rotl32 ((w0 ^ wb ^ w5 ^ w3), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w3); + w4 = rotl32 ((w1 ^ wc ^ w6 ^ w4), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w4); + w5 = rotl32 ((w2 ^ wd ^ w7 ^ w5), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w5); + w6 = rotl32 ((w3 ^ we ^ w8 ^ w6), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w6); + w7 = rotl32 ((w4 ^ wf ^ w9 ^ w7), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w7); + + #undef K + #define K SHA1C02 + + w8 = rotl32 ((w5 ^ w0 ^ wa ^ w8), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w8); + w9 = rotl32 ((w6 ^ w1 ^ wb ^ w9), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w9); + wa = rotl32 ((w7 ^ w2 ^ wc ^ wa), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wa); + wb = rotl32 ((w8 ^ w3 ^ wd ^ wb), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wb); + wc = rotl32 ((w9 ^ w4 ^ we ^ wc), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wc); + wd = rotl32 ((wa ^ w5 ^ wf ^ wd), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, wd); + we = rotl32 ((wb ^ w6 ^ w0 ^ we), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, we); + wf = rotl32 ((wc ^ w7 ^ w1 ^ wf), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wf); + w0 = rotl32 ((wd ^ w8 ^ w2 ^ w0), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w0); + w1 = rotl32 ((we ^ w9 ^ w3 ^ w1), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w1); + w2 = rotl32 ((wf ^ wa ^ w4 ^ w2), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w2); + w3 = rotl32 ((w0 ^ wb ^ w5 ^ w3), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w3); + w4 = rotl32 ((w1 ^ wc ^ w6 ^ w4), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w4); + w5 = rotl32 ((w2 ^ wd ^ w7 ^ w5), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w5); + w6 = rotl32 ((w3 ^ we ^ w8 ^ w6), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w6); + w7 = rotl32 ((w4 ^ wf ^ w9 ^ w7), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w7); + w8 = rotl32 ((w5 ^ w0 ^ wa ^ w8), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w8); + w9 = rotl32 ((w6 ^ w1 ^ wb ^ w9), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w9); + wa = rotl32 ((w7 ^ w2 ^ wc ^ wa), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wa); + wb = rotl32 ((w8 ^ w3 ^ wd ^ wb), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wb); + + #undef K + #define K SHA1C03 + + wc = rotl32 ((w9 ^ w4 ^ we ^ wc), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wc); + wd = rotl32 ((wa ^ w5 ^ wf ^ wd), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wd); + we = rotl32 ((wb ^ w6 ^ w0 ^ we), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, we); + wf = rotl32 ((wc ^ w7 ^ w1 ^ wf), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wf); + w0 = rotl32 ((wd ^ w8 ^ w2 ^ w0), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w0); + w1 = rotl32 ((we ^ w9 ^ w3 ^ w1), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w1); + w2 = rotl32 ((wf ^ wa ^ w4 ^ w2), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w2); + w3 = rotl32 ((w0 ^ wb ^ w5 ^ w3), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w3); + w4 = rotl32 ((w1 ^ wc ^ w6 ^ w4), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w4); + w5 = rotl32 ((w2 ^ wd ^ w7 ^ w5), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w5); + w6 = rotl32 ((w3 ^ we ^ w8 ^ w6), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w6); + w7 = rotl32 ((w4 ^ wf ^ w9 ^ w7), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w7); + w8 = rotl32 ((w5 ^ w0 ^ wa ^ w8), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w8); + w9 = rotl32 ((w6 ^ w1 ^ wb ^ w9), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w9); + wa = rotl32 ((w7 ^ w2 ^ wc ^ wa), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wa); + wb = rotl32 ((w8 ^ w3 ^ wd ^ wb), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wb); + wc = rotl32 ((w9 ^ w4 ^ we ^ wc), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wc); + wd = rotl32 ((wa ^ w5 ^ wf ^ wd), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wd); + we = rotl32 ((wb ^ w6 ^ w0 ^ we), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, we); + wf = rotl32 ((wc ^ w7 ^ w1 ^ wf), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wf); + + const u32x r0 = d; + const u32x r1 = e; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_M + } +} + +__device__ static void m04900s (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], const u32 pw_len, const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset) +{ + /** + * modifier + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + const u32 lid = threadIdx.x; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * reverse + */ + + const u32 e_rev = rotl32 (search[1], 2u); + + /** + * salt + */ + + u32 salt_buf0_t[4]; + + salt_buf0_t[0] = salt_bufs[salt_pos].salt_buf[0]; + salt_buf0_t[1] = salt_bufs[salt_pos].salt_buf[1]; + salt_buf0_t[2] = salt_bufs[salt_pos].salt_buf[2]; + salt_buf0_t[3] = salt_bufs[salt_pos].salt_buf[3]; + + u32 salt_buf1_t[4]; + + salt_buf1_t[0] = salt_bufs[salt_pos].salt_buf[4]; + salt_buf1_t[1] = salt_bufs[salt_pos].salt_buf[5]; + salt_buf1_t[2] = salt_bufs[salt_pos].salt_buf[6]; + salt_buf1_t[3] = salt_bufs[salt_pos].salt_buf[7]; + + u32 salt_buf2_t[4]; + + salt_buf2_t[0] = 0; + salt_buf2_t[1] = 0; + salt_buf2_t[2] = 0; + salt_buf2_t[3] = 0; + + u32 salt_buf3_t[4]; + + salt_buf3_t[0] = 0; + salt_buf3_t[1] = 0; + salt_buf3_t[2] = 0; + salt_buf3_t[3] = 0; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + const u32 pw_salt_len = salt_len + pw_len + salt_len; + + // first we need to switch the right-hand salt to the correct position (2nd salt) + + switch_buffer_by_offset (salt_buf0_t, salt_buf1_t, salt_buf2_t, salt_buf3_t, salt_len + pw_len); + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[7]; + + u32 salt_buf2[4]; + + salt_buf2[0] = 0; + salt_buf2[1] = 0; + salt_buf2[2] = 0; + salt_buf2[3] = 0; + + u32 salt_buf3[4]; + + salt_buf3[0] = 0; + salt_buf3[1] = 0; + salt_buf3[2] = 0; + salt_buf3[3] = 0; + + // concatenate the 1st and 2nd instance of the salt + + salt_buf0[0] |= salt_buf0_t[0]; + salt_buf0[1] |= salt_buf0_t[1]; + salt_buf0[2] |= salt_buf0_t[2]; + salt_buf0[3] |= salt_buf0_t[3]; + + salt_buf1[0] |= salt_buf1_t[0]; + salt_buf1[1] |= salt_buf1_t[1]; + salt_buf1[2] |= salt_buf1_t[2]; + salt_buf1[3] |= salt_buf1_t[3]; + + salt_buf2[0] |= salt_buf2_t[0]; + salt_buf2[1] |= salt_buf2_t[1]; + salt_buf2[2] |= salt_buf2_t[2]; + salt_buf2[3] |= salt_buf2_t[3]; + + salt_buf3[0] |= salt_buf3_t[0]; + salt_buf3[1] |= salt_buf3_t[1]; + salt_buf3[2] |= salt_buf3_t[2]; + salt_buf3[3] |= salt_buf3_t[3]; + + append_0x80_4 (salt_buf0, salt_buf1, salt_buf2, salt_buf3, pw_salt_len); + + /** + * loop + */ + + u32x w0l = w0[0]; + + for (u32 il_pos = 0; il_pos < bfs_cnt; il_pos++) + { + const u32 w0r = c_bfs[il_pos].i; + + w0[0] = w0l | w0r; + + u32x w0_t[4]; + + w0_t[0] = w0[0]; + w0_t[1] = w0[1]; + w0_t[2] = w0[2]; + w0_t[3] = w0[3]; + + u32x w1_t[4]; + + w1_t[0] = w1[0]; + w1_t[1] = w1[1]; + w1_t[2] = w1[2]; + w1_t[3] = w1[3]; + + u32x w2_t[4]; + + w2_t[0] = w2[0]; + w2_t[1] = w2[1]; + w2_t[2] = w2[2]; + w2_t[3] = w2[3]; + + u32x w3_t[4]; + + w3_t[0] = w3[0]; + w3_t[1] = w3[1]; + w3_t[2] = w3[2]; + w3_t[3] = w3[3]; + + /** + * put the password after the first salt but before the second salt + */ + + switch_buffer_by_offset (w0_t, w1_t, w2_t, w3_t, salt_len); + + w0_t[0] |= salt_buf0[0]; + w0_t[1] |= salt_buf0[1]; + w0_t[2] |= salt_buf0[2]; + w0_t[3] |= salt_buf0[3]; + w1_t[0] |= salt_buf1[0]; + w1_t[1] |= salt_buf1[1]; + w1_t[2] |= salt_buf1[2]; + w1_t[3] |= salt_buf1[3]; + w2_t[0] |= salt_buf2[0]; + w2_t[1] |= salt_buf2[1]; + w2_t[2] |= salt_buf2[2]; + w2_t[3] |= salt_buf2[3]; + w3_t[0] |= salt_buf3[0]; + w3_t[1] |= salt_buf3[1]; + w3_t[2] |= salt_buf3[2]; + + u32x w0 = swap_workaround (w0_t[0]); + u32x w1 = swap_workaround (w0_t[1]); + u32x w2 = swap_workaround (w0_t[2]); + u32x w3 = swap_workaround (w0_t[3]); + u32x w4 = swap_workaround (w1_t[0]); + u32x w5 = swap_workaround (w1_t[1]); + u32x w6 = swap_workaround (w1_t[2]); + u32x w7 = swap_workaround (w1_t[3]); + u32x w8 = swap_workaround (w2_t[0]); + u32x w9 = swap_workaround (w2_t[1]); + u32x wa = swap_workaround (w2_t[2]); + u32x wb = swap_workaround (w2_t[3]); + u32x wc = swap_workaround (w3_t[0]); + u32x wd = swap_workaround (w3_t[1]); + u32x we = swap_workaround (w3_t[2]); + u32x wf = pw_salt_len * 8; + + /** + * sha1 + */ + + u32x a = SHA1M_A; + u32x b = SHA1M_B; + u32x c = SHA1M_C; + u32x d = SHA1M_D; + u32x e = SHA1M_E; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w0); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w1); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w2); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w3); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w4); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w5); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w6); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w7); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w8); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w9); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wa); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, wb); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, wc); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, wd); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, we); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wf); + w0 = rotl32 ((wd ^ w8 ^ w2 ^ w0), 1u); SHA1_STEP (SHA1_F0o, e, a, b, c, d, w0); + w1 = rotl32 ((we ^ w9 ^ w3 ^ w1), 1u); SHA1_STEP (SHA1_F0o, d, e, a, b, c, w1); + w2 = rotl32 ((wf ^ wa ^ w4 ^ w2), 1u); SHA1_STEP (SHA1_F0o, c, d, e, a, b, w2); + w3 = rotl32 ((w0 ^ wb ^ w5 ^ w3), 1u); SHA1_STEP (SHA1_F0o, b, c, d, e, a, w3); + + #undef K + #define K SHA1C01 + + w4 = rotl32 ((w1 ^ wc ^ w6 ^ w4), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w4); + w5 = rotl32 ((w2 ^ wd ^ w7 ^ w5), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w5); + w6 = rotl32 ((w3 ^ we ^ w8 ^ w6), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w6); + w7 = rotl32 ((w4 ^ wf ^ w9 ^ w7), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w7); + w8 = rotl32 ((w5 ^ w0 ^ wa ^ w8), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w8); + w9 = rotl32 ((w6 ^ w1 ^ wb ^ w9), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w9); + wa = rotl32 ((w7 ^ w2 ^ wc ^ wa), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wa); + wb = rotl32 ((w8 ^ w3 ^ wd ^ wb), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wb); + wc = rotl32 ((w9 ^ w4 ^ we ^ wc), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wc); + wd = rotl32 ((wa ^ w5 ^ wf ^ wd), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wd); + we = rotl32 ((wb ^ w6 ^ w0 ^ we), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, we); + wf = rotl32 ((wc ^ w7 ^ w1 ^ wf), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wf); + w0 = rotl32 ((wd ^ w8 ^ w2 ^ w0), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w0); + w1 = rotl32 ((we ^ w9 ^ w3 ^ w1), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1); + w2 = rotl32 ((wf ^ wa ^ w4 ^ w2), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w2); + w3 = rotl32 ((w0 ^ wb ^ w5 ^ w3), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w3); + w4 = rotl32 ((w1 ^ wc ^ w6 ^ w4), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w4); + w5 = rotl32 ((w2 ^ wd ^ w7 ^ w5), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w5); + w6 = rotl32 ((w3 ^ we ^ w8 ^ w6), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w6); + w7 = rotl32 ((w4 ^ wf ^ w9 ^ w7), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w7); + + #undef K + #define K SHA1C02 + + w8 = rotl32 ((w5 ^ w0 ^ wa ^ w8), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w8); + w9 = rotl32 ((w6 ^ w1 ^ wb ^ w9), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w9); + wa = rotl32 ((w7 ^ w2 ^ wc ^ wa), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wa); + wb = rotl32 ((w8 ^ w3 ^ wd ^ wb), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wb); + wc = rotl32 ((w9 ^ w4 ^ we ^ wc), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wc); + wd = rotl32 ((wa ^ w5 ^ wf ^ wd), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, wd); + we = rotl32 ((wb ^ w6 ^ w0 ^ we), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, we); + wf = rotl32 ((wc ^ w7 ^ w1 ^ wf), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wf); + w0 = rotl32 ((wd ^ w8 ^ w2 ^ w0), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w0); + w1 = rotl32 ((we ^ w9 ^ w3 ^ w1), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w1); + w2 = rotl32 ((wf ^ wa ^ w4 ^ w2), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w2); + w3 = rotl32 ((w0 ^ wb ^ w5 ^ w3), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w3); + w4 = rotl32 ((w1 ^ wc ^ w6 ^ w4), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w4); + w5 = rotl32 ((w2 ^ wd ^ w7 ^ w5), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w5); + w6 = rotl32 ((w3 ^ we ^ w8 ^ w6), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w6); + w7 = rotl32 ((w4 ^ wf ^ w9 ^ w7), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w7); + w8 = rotl32 ((w5 ^ w0 ^ wa ^ w8), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w8); + w9 = rotl32 ((w6 ^ w1 ^ wb ^ w9), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w9); + wa = rotl32 ((w7 ^ w2 ^ wc ^ wa), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wa); + wb = rotl32 ((w8 ^ w3 ^ wd ^ wb), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wb); + + #undef K + #define K SHA1C03 + + wc = rotl32 ((w9 ^ w4 ^ we ^ wc), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wc); + wd = rotl32 ((wa ^ w5 ^ wf ^ wd), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wd); + we = rotl32 ((wb ^ w6 ^ w0 ^ we), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, we); + wf = rotl32 ((wc ^ w7 ^ w1 ^ wf), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wf); + w0 = rotl32 ((wd ^ w8 ^ w2 ^ w0), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w0); + w1 = rotl32 ((we ^ w9 ^ w3 ^ w1), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w1); + w2 = rotl32 ((wf ^ wa ^ w4 ^ w2), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w2); + w3 = rotl32 ((w0 ^ wb ^ w5 ^ w3), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w3); + w4 = rotl32 ((w1 ^ wc ^ w6 ^ w4), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w4); + w5 = rotl32 ((w2 ^ wd ^ w7 ^ w5), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w5); + w6 = rotl32 ((w3 ^ we ^ w8 ^ w6), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w6); + w7 = rotl32 ((w4 ^ wf ^ w9 ^ w7), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w7); + w8 = rotl32 ((w5 ^ w0 ^ wa ^ w8), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w8); + w9 = rotl32 ((w6 ^ w1 ^ wb ^ w9), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w9); + wa = rotl32 ((w7 ^ w2 ^ wc ^ wa), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wa); + wb = rotl32 ((w8 ^ w3 ^ wd ^ wb), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wb); + + if (e != e_rev) continue; + + wc = rotl32 ((w9 ^ w4 ^ we ^ wc), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wc); + wd = rotl32 ((wa ^ w5 ^ wf ^ wd), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wd); + we = rotl32 ((wb ^ w6 ^ w0 ^ we), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, we); + wf = rotl32 ((wc ^ w7 ^ w1 ^ wf), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wf); + + const u32x r0 = d; + const u32x r1 = e; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_S + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m04900_m04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = pws[gid].i[14]; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m04900m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m04900_m08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = pws[gid].i[14]; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m04900m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m04900_m16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = pws[gid].i[ 8]; + w2[1] = pws[gid].i[ 9]; + w2[2] = pws[gid].i[10]; + w2[3] = pws[gid].i[11]; + + u32x w3[4]; + + w3[0] = pws[gid].i[12]; + w3[1] = pws[gid].i[13]; + w3[2] = pws[gid].i[14]; + w3[3] = pws[gid].i[15]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m04900m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m04900_s04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = pws[gid].i[14]; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m04900s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m04900_s08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = pws[gid].i[14]; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m04900s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m04900_s16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = pws[gid].i[ 8]; + w2[1] = pws[gid].i[ 9]; + w2[2] = pws[gid].i[10]; + w2[3] = pws[gid].i[11]; + + u32x w3[4]; + + w3[0] = pws[gid].i[12]; + w3[1] = pws[gid].i[13]; + w3[2] = pws[gid].i[14]; + w3[3] = pws[gid].i[15]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m04900s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} diff --git a/nv/m05000_a0.cu b/nv/m05000_a0.cu new file mode 100644 index 0000000000..42309933b8 --- /dev/null +++ b/nv/m05000_a0.cu @@ -0,0 +1,528 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _KECCAK_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW2 +#define VECT_SIZE1 +#endif + +#define DGST_R0 2 +#define DGST_R1 3 +#define DGST_R2 4 +#define DGST_R3 5 + +#include "include/kernel_functions.c" +#include "types_nv.c" +#include "common_nv.c" +#include "include/rp_gpu.h" +#include "rp_nv.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +/** + * constants + */ + +#ifndef KECCAK_ROUNDS +#define KECCAK_ROUNDS 24 +#endif + +#define Theta1(s) (st[0 + s] ^ st[5 + s] ^ st[10 + s] ^ st[15 + s] ^ st[20 + s]) + +#define Theta2(s) \ +{ \ + st[ 0 + s] ^= t; \ + st[ 5 + s] ^= t; \ + st[10 + s] ^= t; \ + st[15 + s] ^= t; \ + st[20 + s] ^= t; \ +} + +#define Rho_Pi(s) \ +{ \ + u32 j = keccakf_piln[s]; \ + u32 k = keccakf_rotc[s]; \ + bc0 = st[j]; \ + st[j] = rotl64 (t, k); \ + t = bc0; \ +} + +#define Chi(s) \ +{ \ + bc0 = st[0 + s]; \ + bc1 = st[1 + s]; \ + bc2 = st[2 + s]; \ + bc3 = st[3 + s]; \ + bc4 = st[4 + s]; \ + st[0 + s] ^= ~bc1 & bc2; \ + st[1 + s] ^= ~bc2 & bc3; \ + st[2 + s] ^= ~bc3 & bc4; \ + st[3 + s] ^= ~bc4 & bc0; \ + st[4 + s] ^= ~bc0 & bc1; \ +} + +__device__ __constant__ gpu_rule_t c_rules[1024]; + +extern "C" __global__ void __launch_bounds__ (256, 1) m05000_m04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + /** + * constants + */ + + const u64 keccakf_rndc[24] = + { + 0x0000000000000001, 0x0000000000008082, 0x800000000000808a, + 0x8000000080008000, 0x000000000000808b, 0x0000000080000001, + 0x8000000080008081, 0x8000000000008009, 0x000000000000008a, + 0x0000000000000088, 0x0000000080008009, 0x000000008000000a, + 0x000000008000808b, 0x800000000000008b, 0x8000000000008089, + 0x8000000000008003, 0x8000000000008002, 0x8000000000000080, + 0x000000000000800a, 0x800000008000000a, 0x8000000080008081, + 0x8000000000008080, 0x0000000080000001, 0x8000000080008008 + }; + + const u32 keccakf_rotc[24] = + { + 1, 3, 6, 10, 15, 21, 28, 36, 45, 55, 2, 14, + 27, 41, 56, 8, 25, 43, 62, 18, 39, 61, 20, 44 + }; + + const u32 keccakf_piln[24] = + { + 10, 7, 11, 17, 18, 3, 5, 16, 8, 21, 24, 4, + 15, 23, 19, 13, 12, 2, 20, 14, 22, 9, 6, 1 + }; + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + u32x pw_buf1[4]; + + pw_buf1[0] = pws[gid].i[ 4]; + pw_buf1[1] = pws[gid].i[ 5]; + pw_buf1[2] = pws[gid].i[ 6]; + pw_buf1[3] = pws[gid].i[ 7]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * 0x80 keccak, very special + */ + + const u32 mdlen = salt_bufs[salt_pos].keccak_mdlen; + + const u32 rsiz = 200 - (2 * mdlen); + + const u32 add80w = (rsiz - 1) / 8; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + + w0[0] = pw_buf0[0]; + w0[1] = pw_buf0[1]; + w0[2] = pw_buf0[2]; + w0[3] = pw_buf0[3]; + + u32x w1[4]; + + w1[0] = pw_buf1[0]; + w1[1] = pw_buf1[1]; + w1[2] = pw_buf1[2]; + w1[3] = pw_buf1[3]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 out_len = apply_rules (c_rules[il_pos].cmds, w0, w1, pw_len); + + append_0x01_2 (w0, w1, out_len); + + u64x st[25]; + + st[ 0] = (u64x) (w0[0]) | (u64x) (w0[1]) << 32; + st[ 1] = (u64x) (w0[2]) | (u64x) (w0[3]) << 32; + st[ 2] = (u64x) (w1[0]) | (u64x) (w1[1]) << 32; + st[ 3] = (u64x) (w1[2]) | (u64x) (w1[3]) << 32; + st[ 4] = 0; + st[ 5] = 0; + st[ 6] = 0; + st[ 7] = 0; + st[ 8] = 0; + st[ 9] = 0; + st[10] = 0; + st[11] = 0; + st[12] = 0; + st[13] = 0; + st[14] = 0; + st[15] = 0; + st[16] = 0; + st[17] = 0; + st[18] = 0; + st[19] = 0; + st[20] = 0; + st[21] = 0; + st[22] = 0; + st[23] = 0; + st[24] = 0; + + st[add80w] |= 0x8000000000000000; + + int round; + + for (round = 0; round < KECCAK_ROUNDS; round++) + { + // Theta + + u64x bc0 = Theta1 (0); + u64x bc1 = Theta1 (1); + u64x bc2 = Theta1 (2); + u64x bc3 = Theta1 (3); + u64x bc4 = Theta1 (4); + + u64x t; + + t = bc4 ^ rotl64 (bc1, 1); Theta2 (0); + t = bc0 ^ rotl64 (bc2, 1); Theta2 (1); + t = bc1 ^ rotl64 (bc3, 1); Theta2 (2); + t = bc2 ^ rotl64 (bc4, 1); Theta2 (3); + t = bc3 ^ rotl64 (bc0, 1); Theta2 (4); + + // Rho Pi + + t = st[1]; + + Rho_Pi (0); + Rho_Pi (1); + Rho_Pi (2); + Rho_Pi (3); + Rho_Pi (4); + Rho_Pi (5); + Rho_Pi (6); + Rho_Pi (7); + Rho_Pi (8); + Rho_Pi (9); + Rho_Pi (10); + Rho_Pi (11); + Rho_Pi (12); + Rho_Pi (13); + Rho_Pi (14); + Rho_Pi (15); + Rho_Pi (16); + Rho_Pi (17); + Rho_Pi (18); + Rho_Pi (19); + Rho_Pi (20); + Rho_Pi (21); + Rho_Pi (22); + Rho_Pi (23); + + // Chi + + Chi (0); + Chi (5); + Chi (10); + Chi (15); + Chi (20); + + // Iota + + st[0] ^= keccakf_rndc[round]; + } + + const u32x r0 = l32_from_64 (st[1]); + const u32x r1 = h32_from_64 (st[1]); + const u32x r2 = l32_from_64 (st[2]); + const u32x r3 = h32_from_64 (st[2]); + + #include VECT_COMPARE_M + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m05000_m08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m05000_m16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m05000_s04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * constants + */ + + const u64 keccakf_rndc[24] = + { + 0x0000000000000001, 0x0000000000008082, 0x800000000000808a, + 0x8000000080008000, 0x000000000000808b, 0x0000000080000001, + 0x8000000080008081, 0x8000000000008009, 0x000000000000008a, + 0x0000000000000088, 0x0000000080008009, 0x000000008000000a, + 0x000000008000808b, 0x800000000000008b, 0x8000000000008089, + 0x8000000000008003, 0x8000000000008002, 0x8000000000000080, + 0x000000000000800a, 0x800000008000000a, 0x8000000080008081, + 0x8000000000008080, 0x0000000080000001, 0x8000000080008008 + }; + + const u32 keccakf_rotc[24] = + { + 1, 3, 6, 10, 15, 21, 28, 36, 45, 55, 2, 14, + 27, 41, 56, 8, 25, 43, 62, 18, 39, 61, 20, 44 + }; + + const u32 keccakf_piln[24] = + { + 10, 7, 11, 17, 18, 3, 5, 16, 8, 21, 24, 4, + 15, 23, 19, 13, 12, 2, 20, 14, 22, 9, 6, 1 + }; + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + u32x pw_buf1[4]; + + pw_buf1[0] = pws[gid].i[ 4]; + pw_buf1[1] = pws[gid].i[ 5]; + pw_buf1[2] = pws[gid].i[ 6]; + pw_buf1[3] = pws[gid].i[ 7]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * 0x80 keccak, very special + */ + + const u32 mdlen = salt_bufs[salt_pos].keccak_mdlen; + + const u32 rsiz = 200 - (2 * mdlen); + + const u32 add80w = (rsiz - 1) / 8; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + + w0[0] = pw_buf0[0]; + w0[1] = pw_buf0[1]; + w0[2] = pw_buf0[2]; + w0[3] = pw_buf0[3]; + + u32x w1[4]; + + w1[0] = pw_buf1[0]; + w1[1] = pw_buf1[1]; + w1[2] = pw_buf1[2]; + w1[3] = pw_buf1[3]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 out_len = apply_rules (c_rules[il_pos].cmds, w0, w1, pw_len); + + append_0x01_2 (w0, w1, out_len); + + u64x st[25]; + + st[ 0] = (u64x) (w0[0]) | (u64x) (w0[1]) << 32; + st[ 1] = (u64x) (w0[2]) | (u64x) (w0[3]) << 32; + st[ 2] = (u64x) (w1[0]) | (u64x) (w1[1]) << 32; + st[ 3] = (u64x) (w1[2]) | (u64x) (w1[3]) << 32; + st[ 4] = 0; + st[ 5] = 0; + st[ 6] = 0; + st[ 7] = 0; + st[ 8] = 0; + st[ 9] = 0; + st[10] = 0; + st[11] = 0; + st[12] = 0; + st[13] = 0; + st[14] = 0; + st[15] = 0; + st[16] = 0; + st[17] = 0; + st[18] = 0; + st[19] = 0; + st[20] = 0; + st[21] = 0; + st[22] = 0; + st[23] = 0; + st[24] = 0; + + st[add80w] |= 0x8000000000000000; + + int round; + + for (round = 0; round < KECCAK_ROUNDS; round++) + { + // Theta + + u64x bc0 = Theta1 (0); + u64x bc1 = Theta1 (1); + u64x bc2 = Theta1 (2); + u64x bc3 = Theta1 (3); + u64x bc4 = Theta1 (4); + + u64x t; + + t = bc4 ^ rotl64 (bc1, 1); Theta2 (0); + t = bc0 ^ rotl64 (bc2, 1); Theta2 (1); + t = bc1 ^ rotl64 (bc3, 1); Theta2 (2); + t = bc2 ^ rotl64 (bc4, 1); Theta2 (3); + t = bc3 ^ rotl64 (bc0, 1); Theta2 (4); + + // Rho Pi + + t = st[1]; + + Rho_Pi (0); + Rho_Pi (1); + Rho_Pi (2); + Rho_Pi (3); + Rho_Pi (4); + Rho_Pi (5); + Rho_Pi (6); + Rho_Pi (7); + Rho_Pi (8); + Rho_Pi (9); + Rho_Pi (10); + Rho_Pi (11); + Rho_Pi (12); + Rho_Pi (13); + Rho_Pi (14); + Rho_Pi (15); + Rho_Pi (16); + Rho_Pi (17); + Rho_Pi (18); + Rho_Pi (19); + Rho_Pi (20); + Rho_Pi (21); + Rho_Pi (22); + Rho_Pi (23); + + // Chi + + Chi (0); + Chi (5); + Chi (10); + Chi (15); + Chi (20); + + // Iota + + st[0] ^= keccakf_rndc[round]; + } + + const u32x r0 = l32_from_64 (st[1]); + const u32x r1 = h32_from_64 (st[1]); + const u32x r2 = l32_from_64 (st[2]); + const u32x r3 = h32_from_64 (st[2]); + + #include VECT_COMPARE_S + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m05000_s08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m05000_s16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/nv/m05000_a1.cu b/nv/m05000_a1.cu new file mode 100644 index 0000000000..77c5bc7b10 --- /dev/null +++ b/nv/m05000_a1.cu @@ -0,0 +1,634 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _KECCAK_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW2 +#define VECT_SIZE1 +#endif + +#define DGST_R0 2 +#define DGST_R1 3 +#define DGST_R2 4 +#define DGST_R3 5 + +#include "include/kernel_functions.c" +#include "types_nv.c" +#include "common_nv.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifndef KECCAK_ROUNDS +#define KECCAK_ROUNDS 24 +#endif + +#define Theta1(s) (st[0 + s] ^ st[5 + s] ^ st[10 + s] ^ st[15 + s] ^ st[20 + s]) + +#define Theta2(s) \ +{ \ + st[ 0 + s] ^= t; \ + st[ 5 + s] ^= t; \ + st[10 + s] ^= t; \ + st[15 + s] ^= t; \ + st[20 + s] ^= t; \ +} + +#define Rho_Pi(s) \ +{ \ + u32 j = keccakf_piln[s]; \ + u32 k = keccakf_rotc[s]; \ + bc0 = st[j]; \ + st[j] = rotl64 (t, k); \ + t = bc0; \ +} + +#define Chi(s) \ +{ \ + bc0 = st[0 + s]; \ + bc1 = st[1 + s]; \ + bc2 = st[2 + s]; \ + bc3 = st[3 + s]; \ + bc4 = st[4 + s]; \ + st[0 + s] ^= ~bc1 & bc2; \ + st[1 + s] ^= ~bc2 & bc3; \ + st[2 + s] ^= ~bc3 & bc4; \ + st[3 + s] ^= ~bc4 & bc0; \ + st[4 + s] ^= ~bc0 & bc1; \ +} + +__device__ __constant__ comb_t c_combs[1024]; + +extern "C" __global__ void __launch_bounds__ (256, 1) m05000_m04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + /** + * constants + */ + + const u64 keccakf_rndc[24] = + { + 0x0000000000000001, 0x0000000000008082, 0x800000000000808a, + 0x8000000080008000, 0x000000000000808b, 0x0000000080000001, + 0x8000000080008081, 0x8000000000008009, 0x000000000000008a, + 0x0000000000000088, 0x0000000080008009, 0x000000008000000a, + 0x000000008000808b, 0x800000000000008b, 0x8000000000008089, + 0x8000000000008003, 0x8000000000008002, 0x8000000000000080, + 0x000000000000800a, 0x800000008000000a, 0x8000000080008081, + 0x8000000000008080, 0x0000000080000001, 0x8000000080008008 + }; + + const u32 keccakf_rotc[24] = + { + 1, 3, 6, 10, 15, 21, 28, 36, 45, 55, 2, 14, + 27, 41, 56, 8, 25, 43, 62, 18, 39, 61, 20, 44 + }; + + const u32 keccakf_piln[24] = + { + 10, 7, 11, 17, 18, 3, 5, 16, 8, 21, 24, 4, + 15, 23, 19, 13, 12, 2, 20, 14, 22, 9, 6, 1 + }; + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + append_0x01_2 (wordl0, wordl1, pw_l_len); + + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, c_combs[0].pw_len); + } + + /** + * 0x80 keccak, very special + */ + + const u32 mdlen = salt_bufs[salt_pos].keccak_mdlen; + + const u32 rsiz = 200 - (2 * mdlen); + + const u32 add80w = (rsiz - 1) / 8; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = c_combs[il_pos].pw_len; + + const u32 pw_len = pw_l_len + pw_r_len; + + u32 wordr0[4]; + + wordr0[0] = c_combs[il_pos].i[0]; + wordr0[1] = c_combs[il_pos].i[1]; + wordr0[2] = c_combs[il_pos].i[2]; + wordr0[3] = c_combs[il_pos].i[3]; + + u32 wordr1[4]; + + wordr1[0] = c_combs[il_pos].i[4]; + wordr1[1] = c_combs[il_pos].i[5]; + wordr1[2] = c_combs[il_pos].i[6]; + wordr1[3] = c_combs[il_pos].i[7]; + + u32 wordr2[4]; + + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + + u32 wordr3[4]; + + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + append_0x01_2 (wordr0, wordr1, pw_r_len); + + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + u32x w0[4]; + + w0[0] = wordl0[0] | wordr0[0]; + w0[1] = wordl0[1] | wordr0[1]; + w0[2] = wordl0[2] | wordr0[2]; + w0[3] = wordl0[3] | wordr0[3]; + + u32x w1[4]; + + w1[0] = wordl1[0] | wordr1[0]; + w1[1] = wordl1[1] | wordr1[1]; + w1[2] = wordl1[2] | wordr1[2]; + w1[3] = wordl1[3] | wordr1[3]; + + u32x w2[4]; + + w2[0] = wordl2[0] | wordr2[0]; + w2[1] = wordl2[1] | wordr2[1]; + w2[2] = wordl2[2] | wordr2[2]; + w2[3] = wordl2[3] | wordr2[3]; + + u32x w3[4]; + + w3[0] = wordl3[0] | wordr3[0]; + w3[1] = wordl3[1] | wordr3[1]; + w3[2] = pw_len * 8; + w3[3] = 0; + + u64x st[25]; + + st[ 0] = (u64x) (w0[0]) | (u64x) (w0[1]) << 32; + st[ 1] = (u64x) (w0[2]) | (u64x) (w0[3]) << 32; + st[ 2] = (u64x) (w1[0]) | (u64x) (w1[1]) << 32; + st[ 3] = (u64x) (w1[2]) | (u64x) (w1[3]) << 32; + st[ 4] = 0; + st[ 5] = 0; + st[ 6] = 0; + st[ 7] = 0; + st[ 8] = 0; + st[ 9] = 0; + st[10] = 0; + st[11] = 0; + st[12] = 0; + st[13] = 0; + st[14] = 0; + st[15] = 0; + st[16] = 0; + st[17] = 0; + st[18] = 0; + st[19] = 0; + st[20] = 0; + st[21] = 0; + st[22] = 0; + st[23] = 0; + st[24] = 0; + + st[add80w] |= 0x8000000000000000; + + int round; + + for (round = 0; round < KECCAK_ROUNDS; round++) + { + // Theta + + u64x bc0 = Theta1 (0); + u64x bc1 = Theta1 (1); + u64x bc2 = Theta1 (2); + u64x bc3 = Theta1 (3); + u64x bc4 = Theta1 (4); + + u64x t; + + t = bc4 ^ rotl64 (bc1, 1); Theta2 (0); + t = bc0 ^ rotl64 (bc2, 1); Theta2 (1); + t = bc1 ^ rotl64 (bc3, 1); Theta2 (2); + t = bc2 ^ rotl64 (bc4, 1); Theta2 (3); + t = bc3 ^ rotl64 (bc0, 1); Theta2 (4); + + // Rho Pi + + t = st[1]; + + Rho_Pi (0); + Rho_Pi (1); + Rho_Pi (2); + Rho_Pi (3); + Rho_Pi (4); + Rho_Pi (5); + Rho_Pi (6); + Rho_Pi (7); + Rho_Pi (8); + Rho_Pi (9); + Rho_Pi (10); + Rho_Pi (11); + Rho_Pi (12); + Rho_Pi (13); + Rho_Pi (14); + Rho_Pi (15); + Rho_Pi (16); + Rho_Pi (17); + Rho_Pi (18); + Rho_Pi (19); + Rho_Pi (20); + Rho_Pi (21); + Rho_Pi (22); + Rho_Pi (23); + + // Chi + + Chi (0); + Chi (5); + Chi (10); + Chi (15); + Chi (20); + + // Iota + + st[0] ^= keccakf_rndc[round]; + } + + const u32x r0 = l32_from_64 (st[1]); + const u32x r1 = h32_from_64 (st[1]); + const u32x r2 = l32_from_64 (st[2]); + const u32x r3 = h32_from_64 (st[2]); + + #include VECT_COMPARE_M + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m05000_m08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m05000_m16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m05000_s04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * constants + */ + + const u64 keccakf_rndc[24] = + { + 0x0000000000000001, 0x0000000000008082, 0x800000000000808a, + 0x8000000080008000, 0x000000000000808b, 0x0000000080000001, + 0x8000000080008081, 0x8000000000008009, 0x000000000000008a, + 0x0000000000000088, 0x0000000080008009, 0x000000008000000a, + 0x000000008000808b, 0x800000000000008b, 0x8000000000008089, + 0x8000000000008003, 0x8000000000008002, 0x8000000000000080, + 0x000000000000800a, 0x800000008000000a, 0x8000000080008081, + 0x8000000000008080, 0x0000000080000001, 0x8000000080008008 + }; + + const u32 keccakf_rotc[24] = + { + 1, 3, 6, 10, 15, 21, 28, 36, 45, 55, 2, 14, + 27, 41, 56, 8, 25, 43, 62, 18, 39, 61, 20, 44 + }; + + const u32 keccakf_piln[24] = + { + 10, 7, 11, 17, 18, 3, 5, 16, 8, 21, 24, 4, + 15, 23, 19, 13, 12, 2, 20, 14, 22, 9, 6, 1 + }; + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + append_0x01_2 (wordl0, wordl1, pw_l_len); + + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, c_combs[0].pw_len); + } + + /** + * 0x80 keccak, very special + */ + + const u32 mdlen = salt_bufs[salt_pos].keccak_mdlen; + + const u32 rsiz = 200 - (2 * mdlen); + + const u32 add80w = (rsiz - 1) / 8; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = c_combs[il_pos].pw_len; + + const u32 pw_len = pw_l_len + pw_r_len; + + u32 wordr0[4]; + + wordr0[0] = c_combs[il_pos].i[0]; + wordr0[1] = c_combs[il_pos].i[1]; + wordr0[2] = c_combs[il_pos].i[2]; + wordr0[3] = c_combs[il_pos].i[3]; + + u32 wordr1[4]; + + wordr1[0] = c_combs[il_pos].i[4]; + wordr1[1] = c_combs[il_pos].i[5]; + wordr1[2] = c_combs[il_pos].i[6]; + wordr1[3] = c_combs[il_pos].i[7]; + + u32 wordr2[4]; + + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + + u32 wordr3[4]; + + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + append_0x01_2 (wordr0, wordr1, pw_r_len); + + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + u32x w0[4]; + + w0[0] = wordl0[0] | wordr0[0]; + w0[1] = wordl0[1] | wordr0[1]; + w0[2] = wordl0[2] | wordr0[2]; + w0[3] = wordl0[3] | wordr0[3]; + + u32x w1[4]; + + w1[0] = wordl1[0] | wordr1[0]; + w1[1] = wordl1[1] | wordr1[1]; + w1[2] = wordl1[2] | wordr1[2]; + w1[3] = wordl1[3] | wordr1[3]; + + u32x w2[4]; + + w2[0] = wordl2[0] | wordr2[0]; + w2[1] = wordl2[1] | wordr2[1]; + w2[2] = wordl2[2] | wordr2[2]; + w2[3] = wordl2[3] | wordr2[3]; + + u32x w3[4]; + + w3[0] = wordl3[0] | wordr3[0]; + w3[1] = wordl3[1] | wordr3[1]; + w3[2] = pw_len * 8; + w3[3] = 0; + + u64x st[25]; + + st[ 0] = (u64x) (w0[0]) | (u64x) (w0[1]) << 32; + st[ 1] = (u64x) (w0[2]) | (u64x) (w0[3]) << 32; + st[ 2] = (u64x) (w1[0]) | (u64x) (w1[1]) << 32; + st[ 3] = (u64x) (w1[2]) | (u64x) (w1[3]) << 32; + st[ 4] = 0; + st[ 5] = 0; + st[ 6] = 0; + st[ 7] = 0; + st[ 8] = 0; + st[ 9] = 0; + st[10] = 0; + st[11] = 0; + st[12] = 0; + st[13] = 0; + st[14] = 0; + st[15] = 0; + st[16] = 0; + st[17] = 0; + st[18] = 0; + st[19] = 0; + st[20] = 0; + st[21] = 0; + st[22] = 0; + st[23] = 0; + st[24] = 0; + + st[add80w] |= 0x8000000000000000; + + int round; + + for (round = 0; round < KECCAK_ROUNDS; round++) + { + // Theta + + u64x bc0 = Theta1 (0); + u64x bc1 = Theta1 (1); + u64x bc2 = Theta1 (2); + u64x bc3 = Theta1 (3); + u64x bc4 = Theta1 (4); + + u64x t; + + t = bc4 ^ rotl64 (bc1, 1); Theta2 (0); + t = bc0 ^ rotl64 (bc2, 1); Theta2 (1); + t = bc1 ^ rotl64 (bc3, 1); Theta2 (2); + t = bc2 ^ rotl64 (bc4, 1); Theta2 (3); + t = bc3 ^ rotl64 (bc0, 1); Theta2 (4); + + // Rho Pi + + t = st[1]; + + Rho_Pi (0); + Rho_Pi (1); + Rho_Pi (2); + Rho_Pi (3); + Rho_Pi (4); + Rho_Pi (5); + Rho_Pi (6); + Rho_Pi (7); + Rho_Pi (8); + Rho_Pi (9); + Rho_Pi (10); + Rho_Pi (11); + Rho_Pi (12); + Rho_Pi (13); + Rho_Pi (14); + Rho_Pi (15); + Rho_Pi (16); + Rho_Pi (17); + Rho_Pi (18); + Rho_Pi (19); + Rho_Pi (20); + Rho_Pi (21); + Rho_Pi (22); + Rho_Pi (23); + + // Chi + + Chi (0); + Chi (5); + Chi (10); + Chi (15); + Chi (20); + + // Iota + + st[0] ^= keccakf_rndc[round]; + } + + const u32x r0 = l32_from_64 (st[1]); + const u32x r1 = h32_from_64 (st[1]); + const u32x r2 = l32_from_64 (st[2]); + const u32x r3 = h32_from_64 (st[2]); + + #include VECT_COMPARE_S + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m05000_s08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m05000_s16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/nv/m05000_a3.cu b/nv/m05000_a3.cu new file mode 100644 index 0000000000..956c424ef6 --- /dev/null +++ b/nv/m05000_a3.cu @@ -0,0 +1,695 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _KECCAK_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW2 +#define VECT_SIZE1 +#endif + +#define DGST_R0 2 +#define DGST_R1 3 +#define DGST_R2 4 +#define DGST_R3 5 + +#include "include/kernel_functions.c" +#include "types_nv.c" +#include "common_nv.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +#ifndef KECCAK_ROUNDS +#define KECCAK_ROUNDS 24 +#endif + +#define Theta1(s) (st[0 + s] ^ st[5 + s] ^ st[10 + s] ^ st[15 + s] ^ st[20 + s]) + +#define Theta2(s) \ +{ \ + st[ 0 + s] ^= t; \ + st[ 5 + s] ^= t; \ + st[10 + s] ^= t; \ + st[15 + s] ^= t; \ + st[20 + s] ^= t; \ +} + +#define Rho_Pi(s) \ +{ \ + u32 j = keccakf_piln[s]; \ + u32 k = keccakf_rotc[s]; \ + bc0 = st[j]; \ + st[j] = rotl64 (t, k); \ + t = bc0; \ +} + +#define Chi(s) \ +{ \ + bc0 = st[0 + s]; \ + bc1 = st[1 + s]; \ + bc2 = st[2 + s]; \ + bc3 = st[3 + s]; \ + bc4 = st[4 + s]; \ + st[0 + s] ^= ~bc1 & bc2; \ + st[1 + s] ^= ~bc2 & bc3; \ + st[2 + s] ^= ~bc3 & bc4; \ + st[3 + s] ^= ~bc4 & bc0; \ + st[4 + s] ^= ~bc0 & bc1; \ +} + +__device__ __constant__ bf_t c_bfs[1024]; + +__device__ static void m05000m (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], const u32 pw_len, const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset) +{ + /** + * modifier + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + const u32 lid = threadIdx.x; + + /** + * constants + */ + + const u64 keccakf_rndc[24] = + { + 0x0000000000000001, 0x0000000000008082, 0x800000000000808a, + 0x8000000080008000, 0x000000000000808b, 0x0000000080000001, + 0x8000000080008081, 0x8000000000008009, 0x000000000000008a, + 0x0000000000000088, 0x0000000080008009, 0x000000008000000a, + 0x000000008000808b, 0x800000000000008b, 0x8000000000008089, + 0x8000000000008003, 0x8000000000008002, 0x8000000000000080, + 0x000000000000800a, 0x800000008000000a, 0x8000000080008081, + 0x8000000000008080, 0x0000000080000001, 0x8000000080008008 + }; + + const u32 keccakf_rotc[24] = + { + 1, 3, 6, 10, 15, 21, 28, 36, 45, 55, 2, 14, + 27, 41, 56, 8, 25, 43, 62, 18, 39, 61, 20, 44 + }; + + const u32 keccakf_piln[24] = + { + 10, 7, 11, 17, 18, 3, 5, 16, 8, 21, 24, 4, + 15, 23, 19, 13, 12, 2, 20, 14, 22, 9, 6, 1 + }; + + /** + * 0x80 keccak, very special + */ + + const u32 mdlen = salt_bufs[salt_pos].keccak_mdlen; + + const u32 rsiz = 200 - (2 * mdlen); + + const u32 add80w = (rsiz - 1) / 8; + + /** + * loop + */ + + u32x w0l = w0[0]; + + for (u32 il_pos = 0; il_pos < bfs_cnt; il_pos++) + { + const u32 w0r = c_bfs[il_pos].i; + + w0[0] = w0l | w0r; + + u64x st[25]; + + st[ 0] = (u64x) (w0[0]) | (u64x) (w0[1]) << 32; + st[ 1] = (u64x) (w0[2]) | (u64x) (w0[3]) << 32; + st[ 2] = (u64x) (w1[0]) | (u64x) (w1[1]) << 32; + st[ 3] = (u64x) (w1[2]) | (u64x) (w1[3]) << 32; + st[ 4] = (u64x) (w2[0]) | (u64x) (w2[1]) << 32; + st[ 5] = (u64x) (w2[2]) | (u64x) (w2[3]) << 32; + st[ 6] = (u64x) (w3[0]) | (u64x) (w3[1]) << 32; + st[ 7] = (u64x) (w3[2]) | (u64x) (w3[3]) << 32; + st[ 8] = 0; + st[ 9] = 0; + st[10] = 0; + st[11] = 0; + st[12] = 0; + st[13] = 0; + st[14] = 0; + st[15] = 0; + st[16] = 0; + st[17] = 0; + st[18] = 0; + st[19] = 0; + st[20] = 0; + st[21] = 0; + st[22] = 0; + st[23] = 0; + st[24] = 0; + + st[add80w] |= 0x8000000000000000; + + int round; + + for (round = 0; round < KECCAK_ROUNDS; round++) + { + // Theta + + u64x bc0 = Theta1 (0); + u64x bc1 = Theta1 (1); + u64x bc2 = Theta1 (2); + u64x bc3 = Theta1 (3); + u64x bc4 = Theta1 (4); + + u64x t; + + t = bc4 ^ rotl64 (bc1, 1); Theta2 (0); + t = bc0 ^ rotl64 (bc2, 1); Theta2 (1); + t = bc1 ^ rotl64 (bc3, 1); Theta2 (2); + t = bc2 ^ rotl64 (bc4, 1); Theta2 (3); + t = bc3 ^ rotl64 (bc0, 1); Theta2 (4); + + // Rho Pi + + t = st[1]; + + Rho_Pi (0); + Rho_Pi (1); + Rho_Pi (2); + Rho_Pi (3); + Rho_Pi (4); + Rho_Pi (5); + Rho_Pi (6); + Rho_Pi (7); + Rho_Pi (8); + Rho_Pi (9); + Rho_Pi (10); + Rho_Pi (11); + Rho_Pi (12); + Rho_Pi (13); + Rho_Pi (14); + Rho_Pi (15); + Rho_Pi (16); + Rho_Pi (17); + Rho_Pi (18); + Rho_Pi (19); + Rho_Pi (20); + Rho_Pi (21); + Rho_Pi (22); + Rho_Pi (23); + + // Chi + + Chi (0); + Chi (5); + Chi (10); + Chi (15); + Chi (20); + + // Iota + + st[0] ^= keccakf_rndc[round]; + } + + const u32x r0 = l32_from_64 (st[1]); + const u32x r1 = h32_from_64 (st[1]); + const u32x r2 = l32_from_64 (st[2]); + const u32x r3 = h32_from_64 (st[2]); + + #include VECT_COMPARE_M + } +} + +__device__ static void m05000s (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], const u32 pw_len, const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset) +{ + /** + * modifier + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + const u32 lid = threadIdx.x; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * constants + */ + + const u64 keccakf_rndc[24] = + { + 0x0000000000000001, 0x0000000000008082, 0x800000000000808a, + 0x8000000080008000, 0x000000000000808b, 0x0000000080000001, + 0x8000000080008081, 0x8000000000008009, 0x000000000000008a, + 0x0000000000000088, 0x0000000080008009, 0x000000008000000a, + 0x000000008000808b, 0x800000000000008b, 0x8000000000008089, + 0x8000000000008003, 0x8000000000008002, 0x8000000000000080, + 0x000000000000800a, 0x800000008000000a, 0x8000000080008081, + 0x8000000000008080, 0x0000000080000001, 0x8000000080008008 + }; + + const u32 keccakf_rotc[24] = + { + 1, 3, 6, 10, 15, 21, 28, 36, 45, 55, 2, 14, + 27, 41, 56, 8, 25, 43, 62, 18, 39, 61, 20, 44 + }; + + const u32 keccakf_piln[24] = + { + 10, 7, 11, 17, 18, 3, 5, 16, 8, 21, 24, 4, + 15, 23, 19, 13, 12, 2, 20, 14, 22, 9, 6, 1 + }; + + /** + * 0x80 keccak, very special + */ + + const u32 mdlen = salt_bufs[salt_pos].keccak_mdlen; + + const u32 rsiz = 200 - (2 * mdlen); + + const u32 add80w = (rsiz - 1) / 8; + + /** + * loop + */ + + u32x w0l = w0[0]; + + for (u32 il_pos = 0; il_pos < bfs_cnt; il_pos++) + { + const u32 w0r = c_bfs[il_pos].i; + + w0[0] = w0l | w0r; + + u64x st[25]; + + st[ 0] = (u64x) (w0[0]) | (u64x) (w0[1]) << 32; + st[ 1] = (u64x) (w0[2]) | (u64x) (w0[3]) << 32; + st[ 2] = (u64x) (w1[0]) | (u64x) (w1[1]) << 32; + st[ 3] = (u64x) (w1[2]) | (u64x) (w1[3]) << 32; + st[ 4] = (u64x) (w2[0]) | (u64x) (w2[1]) << 32; + st[ 5] = (u64x) (w2[2]) | (u64x) (w2[3]) << 32; + st[ 6] = (u64x) (w3[0]) | (u64x) (w3[1]) << 32; + st[ 7] = (u64x) (w3[2]) | (u64x) (w3[3]) << 32; + st[ 8] = 0; + st[ 9] = 0; + st[10] = 0; + st[11] = 0; + st[12] = 0; + st[13] = 0; + st[14] = 0; + st[15] = 0; + st[16] = 0; + st[17] = 0; + st[18] = 0; + st[19] = 0; + st[20] = 0; + st[21] = 0; + st[22] = 0; + st[23] = 0; + st[24] = 0; + + st[add80w] |= 0x8000000000000000; + + int round; + + for (round = 0; round < KECCAK_ROUNDS; round++) + { + // Theta + + u64x bc0 = Theta1 (0); + u64x bc1 = Theta1 (1); + u64x bc2 = Theta1 (2); + u64x bc3 = Theta1 (3); + u64x bc4 = Theta1 (4); + + u64x t; + + t = bc4 ^ rotl64 (bc1, 1); Theta2 (0); + t = bc0 ^ rotl64 (bc2, 1); Theta2 (1); + t = bc1 ^ rotl64 (bc3, 1); Theta2 (2); + t = bc2 ^ rotl64 (bc4, 1); Theta2 (3); + t = bc3 ^ rotl64 (bc0, 1); Theta2 (4); + + // Rho Pi + + t = st[1]; + + Rho_Pi (0); + Rho_Pi (1); + Rho_Pi (2); + Rho_Pi (3); + Rho_Pi (4); + Rho_Pi (5); + Rho_Pi (6); + Rho_Pi (7); + Rho_Pi (8); + Rho_Pi (9); + Rho_Pi (10); + Rho_Pi (11); + Rho_Pi (12); + Rho_Pi (13); + Rho_Pi (14); + Rho_Pi (15); + Rho_Pi (16); + Rho_Pi (17); + Rho_Pi (18); + Rho_Pi (19); + Rho_Pi (20); + Rho_Pi (21); + Rho_Pi (22); + Rho_Pi (23); + + // Chi + + Chi (0); + Chi (5); + Chi (10); + Chi (15); + Chi (20); + + // Iota + + st[0] ^= keccakf_rndc[round]; + } + + const u32x r0 = l32_from_64 (st[1]); + const u32x r1 = h32_from_64 (st[1]); + const u32x r2 = l32_from_64 (st[2]); + const u32x r3 = h32_from_64 (st[2]); + + #include VECT_COMPARE_S + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m05000_m04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m05000m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m05000_m08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m05000m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m05000_m16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = pws[gid].i[ 8]; + w2[1] = pws[gid].i[ 9]; + w2[2] = pws[gid].i[10]; + w2[3] = pws[gid].i[11]; + + u32x w3[4]; + + w3[0] = pws[gid].i[12]; + w3[1] = pws[gid].i[13]; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m05000m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m05000_s04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m05000s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m05000_s08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m05000s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m05000_s16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = pws[gid].i[ 8]; + w2[1] = pws[gid].i[ 9]; + w2[2] = pws[gid].i[10]; + w2[3] = pws[gid].i[11]; + + u32x w3[4]; + + w3[0] = pws[gid].i[12]; + w3[1] = pws[gid].i[13]; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m05000s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} diff --git a/nv/m05100_a0.cu b/nv/m05100_a0.cu new file mode 100644 index 0000000000..4cf8eb18ec --- /dev/null +++ b/nv/m05100_a0.cu @@ -0,0 +1,431 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _MD5H_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW2 +#define VECT_SIZE1 +#endif + +#define DGST_R0 0 +#define DGST_R1 1 +#define DGST_R2 2 +#define DGST_R3 3 + +#include "include/kernel_functions.c" +#include "types_nv.c" +#include "common_nv.c" +#include "include/rp_gpu.h" +#include "rp_nv.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +__device__ __constant__ gpu_rule_t c_rules[1024]; + +extern "C" __global__ void __launch_bounds__ (256, 1) m05100_m04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + u32x pw_buf1[4]; + + pw_buf1[0] = pws[gid].i[ 4]; + pw_buf1[1] = pws[gid].i[ 5]; + pw_buf1[2] = pws[gid].i[ 6]; + pw_buf1[3] = pws[gid].i[ 7]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + + w0[0] = pw_buf0[0]; + w0[1] = pw_buf0[1]; + w0[2] = pw_buf0[2]; + w0[3] = pw_buf0[3]; + + u32x w1[4]; + + w1[0] = pw_buf1[0]; + w1[1] = pw_buf1[1]; + w1[2] = pw_buf1[2]; + w1[3] = pw_buf1[3]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 out_len = apply_rules (c_rules[il_pos].cmds, w0, w1, pw_len); + + append_0x80_2 (w0, w1, out_len); + + w3[2] = out_len * 8; + + u32x a = MD5M_A; + u32x b = MD5M_B; + u32x c = MD5M_C; + u32x d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H , a, b, c, d, w1[1], MD5C20, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w2[0], MD5C21, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w2[3], MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w3[2], MD5C23, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w0[1], MD5C24, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w1[0], MD5C25, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w1[3], MD5C26, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w2[2], MD5C27, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w3[1], MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w0[0], MD5C29, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w0[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w1[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w2[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w3[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w3[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w0[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1[0], MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w2[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2[1], MD5C3f, MD5S33); + + a += MD5M_A; + b += MD5M_B; + c += MD5M_C; + d += MD5M_D; + + { + const u32x r0 = a; + const u32x r1 = b; + const u32x r2 = 0; + const u32x r3 = 0; + + #include VECT_COMPARE_M + } + + { + const u32x r0 = b; + const u32x r1 = c; + const u32x r2 = 0; + const u32x r3 = 0; + + #include VECT_COMPARE_M + } + + { + const u32x r0 = c; + const u32x r1 = d; + const u32x r2 = 0; + const u32x r3 = 0; + + #include VECT_COMPARE_M + } + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m05100_m08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m05100_m16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m05100_s04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + u32x pw_buf1[4]; + + pw_buf1[0] = pws[gid].i[ 4]; + pw_buf1[1] = pws[gid].i[ 5]; + pw_buf1[2] = pws[gid].i[ 6]; + pw_buf1[3] = pws[gid].i[ 7]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + + w0[0] = pw_buf0[0]; + w0[1] = pw_buf0[1]; + w0[2] = pw_buf0[2]; + w0[3] = pw_buf0[3]; + + u32x w1[4]; + + w1[0] = pw_buf1[0]; + w1[1] = pw_buf1[1]; + w1[2] = pw_buf1[2]; + w1[3] = pw_buf1[3]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 out_len = apply_rules (c_rules[il_pos].cmds, w0, w1, pw_len); + + append_0x80_2 (w0, w1, out_len); + + w3[2] = out_len * 8; + + u32x a = MD5M_A; + u32x b = MD5M_B; + u32x c = MD5M_C; + u32x d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H , a, b, c, d, w1[1], MD5C20, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w2[0], MD5C21, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w2[3], MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w3[2], MD5C23, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w0[1], MD5C24, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w1[0], MD5C25, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w1[3], MD5C26, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w2[2], MD5C27, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w3[1], MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w0[0], MD5C29, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w0[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w1[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w2[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w3[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w3[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w0[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1[0], MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w2[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2[1], MD5C3f, MD5S33); + + a += MD5M_A; + b += MD5M_B; + c += MD5M_C; + d += MD5M_D; + + { + const u32x r0 = a; + const u32x r1 = b; + const u32x r2 = 0; + const u32x r3 = 0; + + #include VECT_COMPARE_M + } + + { + const u32x r0 = b; + const u32x r1 = c; + const u32x r2 = 0; + const u32x r3 = 0; + + #include VECT_COMPARE_M + } + + { + const u32x r0 = c; + const u32x r1 = d; + const u32x r2 = 0; + const u32x r3 = 0; + + #include VECT_COMPARE_M + } + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m05100_s08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m05100_s16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/nv/m05100_a1.cu b/nv/m05100_a1.cu new file mode 100644 index 0000000000..51af13a759 --- /dev/null +++ b/nv/m05100_a1.cu @@ -0,0 +1,533 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _MD5H_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW2 +#define VECT_SIZE4 +#endif + +#define DGST_R0 0 +#define DGST_R1 1 +#define DGST_R2 2 +#define DGST_R3 3 + +#include "include/kernel_functions.c" +#include "types_nv.c" +#include "common_nv.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +__device__ __constant__ comb_t c_combs[1024]; + +extern "C" __global__ void __launch_bounds__ (256, 1) m05100_m04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + append_0x80_2 (wordl0, wordl1, pw_l_len); + + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, c_combs[0].pw_len); + } + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = c_combs[il_pos].pw_len; + + const u32 pw_len = pw_l_len + pw_r_len; + + u32 wordr0[4]; + + wordr0[0] = c_combs[il_pos].i[0]; + wordr0[1] = c_combs[il_pos].i[1]; + wordr0[2] = c_combs[il_pos].i[2]; + wordr0[3] = c_combs[il_pos].i[3]; + + u32 wordr1[4]; + + wordr1[0] = c_combs[il_pos].i[4]; + wordr1[1] = c_combs[il_pos].i[5]; + wordr1[2] = c_combs[il_pos].i[6]; + wordr1[3] = c_combs[il_pos].i[7]; + + u32 wordr2[4]; + + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + + u32 wordr3[4]; + + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + u32x w0[4]; + + w0[0] = wordl0[0] | wordr0[0]; + w0[1] = wordl0[1] | wordr0[1]; + w0[2] = wordl0[2] | wordr0[2]; + w0[3] = wordl0[3] | wordr0[3]; + + u32x w1[4]; + + w1[0] = wordl1[0] | wordr1[0]; + w1[1] = wordl1[1] | wordr1[1]; + w1[2] = wordl1[2] | wordr1[2]; + w1[3] = wordl1[3] | wordr1[3]; + + u32x w2[4]; + + w2[0] = wordl2[0] | wordr2[0]; + w2[1] = wordl2[1] | wordr2[1]; + w2[2] = wordl2[2] | wordr2[2]; + w2[3] = wordl2[3] | wordr2[3]; + + u32x w3[4]; + + w3[0] = wordl3[0] | wordr3[0]; + w3[1] = wordl3[1] | wordr3[1]; + w3[2] = pw_len * 8; + w3[3] = 0; + + u32x a = MD5M_A; + u32x b = MD5M_B; + u32x c = MD5M_C; + u32x d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H , a, b, c, d, w1[1], MD5C20, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w2[0], MD5C21, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w2[3], MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w3[2], MD5C23, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w0[1], MD5C24, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w1[0], MD5C25, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w1[3], MD5C26, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w2[2], MD5C27, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w3[1], MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w0[0], MD5C29, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w0[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w1[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w2[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w3[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w3[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w0[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1[0], MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w2[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2[1], MD5C3f, MD5S33); + + a += MD5M_A; + b += MD5M_B; + c += MD5M_C; + d += MD5M_D; + + { + const u32x r0 = a; + const u32x r1 = b; + const u32x r2 = 0; + const u32x r3 = 0; + + #include VECT_COMPARE_M + } + + { + const u32x r0 = b; + const u32x r1 = c; + const u32x r2 = 0; + const u32x r3 = 0; + + #include VECT_COMPARE_M + } + + { + const u32x r0 = c; + const u32x r1 = d; + const u32x r2 = 0; + const u32x r3 = 0; + + #include VECT_COMPARE_M + } + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m05100_m08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m05100_m16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m05100_s04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + append_0x80_2 (wordl0, wordl1, pw_l_len); + + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, c_combs[0].pw_len); + } + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = c_combs[il_pos].pw_len; + + const u32 pw_len = pw_l_len + pw_r_len; + + u32 wordr0[4]; + + wordr0[0] = c_combs[il_pos].i[0]; + wordr0[1] = c_combs[il_pos].i[1]; + wordr0[2] = c_combs[il_pos].i[2]; + wordr0[3] = c_combs[il_pos].i[3]; + + u32 wordr1[4]; + + wordr1[0] = c_combs[il_pos].i[4]; + wordr1[1] = c_combs[il_pos].i[5]; + wordr1[2] = c_combs[il_pos].i[6]; + wordr1[3] = c_combs[il_pos].i[7]; + + u32 wordr2[4]; + + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + + u32 wordr3[4]; + + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + u32x w0[4]; + + w0[0] = wordl0[0] | wordr0[0]; + w0[1] = wordl0[1] | wordr0[1]; + w0[2] = wordl0[2] | wordr0[2]; + w0[3] = wordl0[3] | wordr0[3]; + + u32x w1[4]; + + w1[0] = wordl1[0] | wordr1[0]; + w1[1] = wordl1[1] | wordr1[1]; + w1[2] = wordl1[2] | wordr1[2]; + w1[3] = wordl1[3] | wordr1[3]; + + u32x w2[4]; + + w2[0] = wordl2[0] | wordr2[0]; + w2[1] = wordl2[1] | wordr2[1]; + w2[2] = wordl2[2] | wordr2[2]; + w2[3] = wordl2[3] | wordr2[3]; + + u32x w3[4]; + + w3[0] = wordl3[0] | wordr3[0]; + w3[1] = wordl3[1] | wordr3[1]; + w3[2] = pw_len * 8; + w3[3] = 0; + + u32x a = MD5M_A; + u32x b = MD5M_B; + u32x c = MD5M_C; + u32x d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H , a, b, c, d, w1[1], MD5C20, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w2[0], MD5C21, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w2[3], MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w3[2], MD5C23, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w0[1], MD5C24, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w1[0], MD5C25, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w1[3], MD5C26, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w2[2], MD5C27, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w3[1], MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w0[0], MD5C29, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w0[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w1[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w2[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w3[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w3[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w0[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1[0], MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w2[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2[1], MD5C3f, MD5S33); + + a += MD5M_A; + b += MD5M_B; + c += MD5M_C; + d += MD5M_D; + + { + const u32x r0 = a; + const u32x r1 = b; + const u32x r2 = 0; + const u32x r3 = 0; + + #include VECT_COMPARE_M + } + + { + const u32x r0 = b; + const u32x r1 = c; + const u32x r2 = 0; + const u32x r3 = 0; + + #include VECT_COMPARE_M + } + + { + const u32x r0 = c; + const u32x r1 = d; + const u32x r2 = 0; + const u32x r3 = 0; + + #include VECT_COMPARE_M + } + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m05100_s08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m05100_s16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/nv/m05100_a3.cu b/nv/m05100_a3.cu new file mode 100644 index 0000000000..2edec9f04a --- /dev/null +++ b/nv/m05100_a3.cu @@ -0,0 +1,605 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _MD5H_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW2 +#define VECT_SIZE4 +#endif + +#define DGST_R0 0 +#define DGST_R1 1 +#define DGST_R2 2 +#define DGST_R3 3 + +#include "include/kernel_functions.c" +#include "types_nv.c" +#include "common_nv.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +__device__ __constant__ bf_t c_bfs[1024]; + +__device__ static void m05100m (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], const u32 pw_len, const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset) +{ + /** + * modifier + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + const u32 lid = threadIdx.x; + + /** + * base + */ + + w3[2] = pw_len * 8; + + /** + * loop + */ + + u32x w0l = w0[0]; + + for (u32 il_pos = 0; il_pos < bfs_cnt; il_pos++) + { + const u32 w0r = c_bfs[il_pos].i; + + w0[0] = w0l | w0r; + + u32x a = MD5M_A; + u32x b = MD5M_B; + u32x c = MD5M_C; + u32x d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H , a, b, c, d, w1[1], MD5C20, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w2[0], MD5C21, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w2[3], MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w3[2], MD5C23, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w0[1], MD5C24, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w1[0], MD5C25, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w1[3], MD5C26, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w2[2], MD5C27, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w3[1], MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w0[0], MD5C29, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w0[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w1[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w2[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w3[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w3[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w0[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1[0], MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w2[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2[1], MD5C3f, MD5S33); + + a += MD5M_A; + b += MD5M_B; + c += MD5M_C; + d += MD5M_D; + + { + const u32x r0 = a; + const u32x r1 = b; + const u32x r2 = 0; + const u32x r3 = 0; + + #include VECT_COMPARE_M + } + + { + const u32x r0 = b; + const u32x r1 = c; + const u32x r2 = 0; + const u32x r3 = 0; + + #include VECT_COMPARE_M + } + + { + const u32x r0 = c; + const u32x r1 = d; + const u32x r2 = 0; + const u32x r3 = 0; + + #include VECT_COMPARE_M + } + } +} + +__device__ static void m05100s (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], const u32 pw_len, const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset) +{ + /** + * modifier + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + const u32 lid = threadIdx.x; + + /** + * base + */ + + w3[2] = pw_len * 8; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * loop + */ + + u32x w0l = w0[0]; + + for (u32 il_pos = 0; il_pos < bfs_cnt; il_pos++) + { + const u32 w0r = c_bfs[il_pos].i; + + w0[0] = w0l | w0r; + + u32x a = MD5M_A; + u32x b = MD5M_B; + u32x c = MD5M_C; + u32x d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H , a, b, c, d, w1[1], MD5C20, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w2[0], MD5C21, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w2[3], MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w3[2], MD5C23, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w0[1], MD5C24, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w1[0], MD5C25, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w1[3], MD5C26, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w2[2], MD5C27, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w3[1], MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w0[0], MD5C29, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w0[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w1[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w2[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w3[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w3[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w0[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1[0], MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w2[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2[1], MD5C3f, MD5S33); + + a += MD5M_A; + b += MD5M_B; + c += MD5M_C; + d += MD5M_D; + + { + const u32x r0 = a; + const u32x r1 = b; + const u32x r2 = 0; + const u32x r3 = 0; + + #include VECT_COMPARE_M + } + + { + const u32x r0 = b; + const u32x r1 = c; + const u32x r2 = 0; + const u32x r3 = 0; + + #include VECT_COMPARE_M + } + + { + const u32x r0 = c; + const u32x r1 = d; + const u32x r2 = 0; + const u32x r3 = 0; + + #include VECT_COMPARE_M + } + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m05100_m04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m05100m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m05100_m08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m05100m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m05100_m16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = pws[gid].i[ 8]; + w2[1] = pws[gid].i[ 9]; + w2[2] = pws[gid].i[10]; + w2[3] = pws[gid].i[11]; + + u32x w3[4]; + + w3[0] = pws[gid].i[12]; + w3[1] = pws[gid].i[13]; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m05100m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m05100_s04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m05100s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m05100_s08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m05100s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m05100_s16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = pws[gid].i[ 8]; + w2[1] = pws[gid].i[ 9]; + w2[2] = pws[gid].i[10]; + w2[3] = pws[gid].i[11]; + + u32x w3[4]; + + w3[0] = pws[gid].i[12]; + w3[1] = pws[gid].i[13]; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m05100s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} diff --git a/nv/m05200.cu b/nv/m05200.cu new file mode 100644 index 0000000000..393884622c --- /dev/null +++ b/nv/m05200.cu @@ -0,0 +1,387 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _SHA256_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW2 +#define VECT_SIZE1 +#endif + +#define DGST_R0 0 +#define DGST_R1 1 +#define DGST_R2 2 +#define DGST_R3 3 + +#include "include/kernel_functions.c" +#include "types_nv.c" +#include "common_nv.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +__device__ static void sha256_64 (const u32x w0[4], const u32x w1[4], const u32x w2[4], const u32x w3[4], u32x digest[8]) +{ + u32x w0_t = w0[0]; + u32x w1_t = w0[1]; + u32x w2_t = w0[2]; + u32x w3_t = w0[3]; + u32x w4_t = w1[0]; + u32x w5_t = w1[1]; + u32x w6_t = w1[2]; + u32x w7_t = w1[3]; + u32x w8_t = w2[0]; + u32x w9_t = w2[1]; + u32x wa_t = w2[2]; + u32x wb_t = w2[3]; + u32x wc_t = w3[0]; + u32x wd_t = w3[1]; + u32x we_t = w3[2]; + u32x wf_t = w3[3]; + + u32x a = digest[0]; + u32x b = digest[1]; + u32x c = digest[2]; + u32x d = digest[3]; + u32x e = digest[4]; + u32x f = digest[5]; + u32x g = digest[6]; + u32x h = digest[7]; + + SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C00); + SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C01); + SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C02); + SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C03); + SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C04); + SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C05); + SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C06); + SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C07); + SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C08); + SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C09); + SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C0a); + SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C0b); + SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C0c); + SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C0d); + SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C0e); + SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C0f); + w0_t = SHA256_S1(we_t) + w9_t + SHA256_S0(w1_t) + w0_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C10); + w1_t = SHA256_S1(wf_t) + wa_t + SHA256_S0(w2_t) + w1_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C11); + w2_t = SHA256_S1(w0_t) + wb_t + SHA256_S0(w3_t) + w2_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C12); + w3_t = SHA256_S1(w1_t) + wc_t + SHA256_S0(w4_t) + w3_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C13); + w4_t = SHA256_S1(w2_t) + wd_t + SHA256_S0(w5_t) + w4_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C14); + w5_t = SHA256_S1(w3_t) + we_t + SHA256_S0(w6_t) + w5_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C15); + w6_t = SHA256_S1(w4_t) + wf_t + SHA256_S0(w7_t) + w6_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C16); + w7_t = SHA256_S1(w5_t) + w0_t + SHA256_S0(w8_t) + w7_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C17); + w8_t = SHA256_S1(w6_t) + w1_t + SHA256_S0(w9_t) + w8_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C18); + w9_t = SHA256_S1(w7_t) + w2_t + SHA256_S0(wa_t) + w9_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C19); + wa_t = SHA256_S1(w8_t) + w3_t + SHA256_S0(wb_t) + wa_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C1a); + wb_t = SHA256_S1(w9_t) + w4_t + SHA256_S0(wc_t) + wb_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C1b); + wc_t = SHA256_S1(wa_t) + w5_t + SHA256_S0(wd_t) + wc_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C1c); + wd_t = SHA256_S1(wb_t) + w6_t + SHA256_S0(we_t) + wd_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C1d); + we_t = SHA256_S1(wc_t) + w7_t + SHA256_S0(wf_t) + we_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C1e); + wf_t = SHA256_S1(wd_t) + w8_t + SHA256_S0(w0_t) + wf_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C1f); + w0_t = SHA256_S1(we_t) + w9_t + SHA256_S0(w1_t) + w0_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C20); + w1_t = SHA256_S1(wf_t) + wa_t + SHA256_S0(w2_t) + w1_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C21); + w2_t = SHA256_S1(w0_t) + wb_t + SHA256_S0(w3_t) + w2_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C22); + w3_t = SHA256_S1(w1_t) + wc_t + SHA256_S0(w4_t) + w3_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C23); + w4_t = SHA256_S1(w2_t) + wd_t + SHA256_S0(w5_t) + w4_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C24); + w5_t = SHA256_S1(w3_t) + we_t + SHA256_S0(w6_t) + w5_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C25); + w6_t = SHA256_S1(w4_t) + wf_t + SHA256_S0(w7_t) + w6_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C26); + w7_t = SHA256_S1(w5_t) + w0_t + SHA256_S0(w8_t) + w7_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C27); + w8_t = SHA256_S1(w6_t) + w1_t + SHA256_S0(w9_t) + w8_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C28); + w9_t = SHA256_S1(w7_t) + w2_t + SHA256_S0(wa_t) + w9_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C29); + wa_t = SHA256_S1(w8_t) + w3_t + SHA256_S0(wb_t) + wa_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C2a); + wb_t = SHA256_S1(w9_t) + w4_t + SHA256_S0(wc_t) + wb_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C2b); + wc_t = SHA256_S1(wa_t) + w5_t + SHA256_S0(wd_t) + wc_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C2c); + wd_t = SHA256_S1(wb_t) + w6_t + SHA256_S0(we_t) + wd_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C2d); + we_t = SHA256_S1(wc_t) + w7_t + SHA256_S0(wf_t) + we_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C2e); + wf_t = SHA256_S1(wd_t) + w8_t + SHA256_S0(w0_t) + wf_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C2f); + w0_t = SHA256_S1(we_t) + w9_t + SHA256_S0(w1_t) + w0_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C30); + w1_t = SHA256_S1(wf_t) + wa_t + SHA256_S0(w2_t) + w1_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C31); + w2_t = SHA256_S1(w0_t) + wb_t + SHA256_S0(w3_t) + w2_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C32); + w3_t = SHA256_S1(w1_t) + wc_t + SHA256_S0(w4_t) + w3_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C33); + w4_t = SHA256_S1(w2_t) + wd_t + SHA256_S0(w5_t) + w4_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C34); + w5_t = SHA256_S1(w3_t) + we_t + SHA256_S0(w6_t) + w5_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C35); + w6_t = SHA256_S1(w4_t) + wf_t + SHA256_S0(w7_t) + w6_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C36); + w7_t = SHA256_S1(w5_t) + w0_t + SHA256_S0(w8_t) + w7_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C37); + w8_t = SHA256_S1(w6_t) + w1_t + SHA256_S0(w9_t) + w8_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C38); + w9_t = SHA256_S1(w7_t) + w2_t + SHA256_S0(wa_t) + w9_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C39); + wa_t = SHA256_S1(w8_t) + w3_t + SHA256_S0(wb_t) + wa_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C3a); + wb_t = SHA256_S1(w9_t) + w4_t + SHA256_S0(wc_t) + wb_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C3b); + wc_t = SHA256_S1(wa_t) + w5_t + SHA256_S0(wd_t) + wc_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C3c); + wd_t = SHA256_S1(wb_t) + w6_t + SHA256_S0(we_t) + wd_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C3d); + we_t = SHA256_S1(wc_t) + w7_t + SHA256_S0(wf_t) + we_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C3e); + wf_t = SHA256_S1(wd_t) + w8_t + SHA256_S0(w0_t) + wf_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C3f); + + digest[0] += a; + digest[1] += b; + digest[2] += c; + digest[3] += d; + digest[4] += e; + digest[5] += f; + digest[6] += g; + digest[7] += h; +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m05200_init (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, pwsafe3_tmp_t *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = 0; + w1[3] = 0; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[7]; + + u32 salt_buf2[4]; + + salt_buf2[0] = 0; + salt_buf2[1] = 0; + salt_buf2[2] = 0; + salt_buf2[3] = 0; + + u32 salt_buf3[4]; + + salt_buf3[0] = 0; + salt_buf3[1] = 0; + salt_buf3[2] = 0; + salt_buf3[3] = 0; + + u32 salt_len = salt_bufs[salt_pos].salt_len; + + switch_buffer_by_offset (salt_buf0, salt_buf1, salt_buf2, salt_buf3, pw_len); + + w0[0] |= salt_buf0[0]; + w0[1] |= salt_buf0[1]; + w0[2] |= salt_buf0[2]; + w0[3] |= salt_buf0[3]; + + w1[0] |= salt_buf1[0]; + w1[1] |= salt_buf1[1]; + w1[2] |= salt_buf1[2]; + w1[3] |= salt_buf1[3]; + + w2[0] |= salt_buf2[0]; + w2[1] |= salt_buf2[1]; + w2[2] |= salt_buf2[2]; + w2[3] |= salt_buf2[3]; + + w3[0] |= salt_buf3[0]; + w3[1] |= salt_buf3[1]; + w3[2] |= salt_buf3[2]; + w3[3] |= salt_buf3[3]; + + const u32 block_len = pw_len + salt_len; + + append_0x80_4 (w0, w1, w2, w3, block_len); + + /** + * init + */ + + w0[0] = swap_workaround (w0[0]); + w0[1] = swap_workaround (w0[1]); + w0[2] = swap_workaround (w0[2]); + w0[3] = swap_workaround (w0[3]); + + w1[0] = swap_workaround (w1[0]); + w1[1] = swap_workaround (w1[1]); + w1[2] = swap_workaround (w1[2]); + w1[3] = swap_workaround (w1[3]); + + w2[0] = swap_workaround (w2[0]); + w2[1] = swap_workaround (w2[1]); + w2[2] = swap_workaround (w2[2]); + w2[3] = swap_workaround (w2[3]); + + w3[0] = swap_workaround (w3[0]); + w3[1] = swap_workaround (w3[1]); + w3[2] = 0; + w3[3] = block_len * 8; + + /** + * main + */ + + u32x digest[8]; + + digest[0] = SHA256M_A; + digest[1] = SHA256M_B; + digest[2] = SHA256M_C; + digest[3] = SHA256M_D; + digest[4] = SHA256M_E; + digest[5] = SHA256M_F; + digest[6] = SHA256M_G; + digest[7] = SHA256M_H; + + sha256_64 (w0, w1, w2, w3, digest); + + tmps[gid].digest_buf[0] = digest[0]; + tmps[gid].digest_buf[1] = digest[1]; + tmps[gid].digest_buf[2] = digest[2]; + tmps[gid].digest_buf[3] = digest[3]; + tmps[gid].digest_buf[4] = digest[4]; + tmps[gid].digest_buf[5] = digest[5]; + tmps[gid].digest_buf[6] = digest[6]; + tmps[gid].digest_buf[7] = digest[7]; +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m05200_loop (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, pwsafe3_tmp_t *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x digest[8]; + + digest[0] = tmps[gid].digest_buf[0]; + digest[1] = tmps[gid].digest_buf[1]; + digest[2] = tmps[gid].digest_buf[2]; + digest[3] = tmps[gid].digest_buf[3]; + digest[4] = tmps[gid].digest_buf[4]; + digest[5] = tmps[gid].digest_buf[5]; + digest[6] = tmps[gid].digest_buf[6]; + digest[7] = tmps[gid].digest_buf[7]; + + for (u32 i = 0; i < loop_cnt; i++) + { + u32x w0[4]; + + w0[0] = digest[0]; + w0[1] = digest[1]; + w0[2] = digest[2]; + w0[3] = digest[3]; + + u32x w1[4]; + + w1[0] = digest[4]; + w1[1] = digest[5]; + w1[2] = digest[6]; + w1[3] = digest[7]; + + u32x w2[4]; + + w2[0] = 0x80000000; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 32 * 8; + + digest[0] = SHA256M_A; + digest[1] = SHA256M_B; + digest[2] = SHA256M_C; + digest[3] = SHA256M_D; + digest[4] = SHA256M_E; + digest[5] = SHA256M_F; + digest[6] = SHA256M_G; + digest[7] = SHA256M_H; + + sha256_64 (w0, w1, w2, w3, digest); + } + + tmps[gid].digest_buf[0] = digest[0]; + tmps[gid].digest_buf[1] = digest[1]; + tmps[gid].digest_buf[2] = digest[2]; + tmps[gid].digest_buf[3] = digest[3]; + tmps[gid].digest_buf[4] = digest[4]; + tmps[gid].digest_buf[5] = digest[5]; + tmps[gid].digest_buf[6] = digest[6]; + tmps[gid].digest_buf[7] = digest[7]; +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m05200_comp (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, pwsafe3_tmp_t *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + const u32 lid = threadIdx.x; + + /** + * digest + */ + + const u32x r0 = tmps[gid].digest_buf[DGST_R0]; + const u32x r1 = tmps[gid].digest_buf[DGST_R1]; + const u32x r2 = tmps[gid].digest_buf[DGST_R2]; + const u32x r3 = tmps[gid].digest_buf[DGST_R3]; + + #define il_pos 0 + + #include VECT_COMPARE_M +} diff --git a/nv/m05300_a0.cu b/nv/m05300_a0.cu new file mode 100644 index 0000000000..e5fe2287b2 --- /dev/null +++ b/nv/m05300_a0.cu @@ -0,0 +1,748 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _MD5_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW2 +#define VECT_SIZE1 +#endif + +#define DGST_R0 0 +#define DGST_R1 3 +#define DGST_R2 2 +#define DGST_R3 1 + +#include "include/kernel_functions.c" +#include "types_nv.c" +#include "common_nv.c" +#include "include/rp_gpu.h" +#include "rp_nv.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +__device__ static void md5_transform (const u32x w0[4], const u32x w1[4], const u32x w2[4], const u32x w3[4], u32x digest[4]) +{ + u32x a = digest[0]; + u32x b = digest[1]; + u32x c = digest[2]; + u32x d = digest[3]; + + u32x w0_t = w0[0]; + u32x w1_t = w0[1]; + u32x w2_t = w0[2]; + u32x w3_t = w0[3]; + u32x w4_t = w1[0]; + u32x w5_t = w1[1]; + u32x w6_t = w1[2]; + u32x w7_t = w1[3]; + u32x w8_t = w2[0]; + u32x w9_t = w2[1]; + u32x wa_t = w2[2]; + u32x wb_t = w2[3]; + u32x wc_t = w3[0]; + u32x wd_t = w3[1]; + u32x we_t = w3[2]; + u32x wf_t = w3[3]; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t, MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t, MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t, MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t, MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w4_t, MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w5_t, MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w6_t, MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w7_t, MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w8_t, MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w9_t, MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, wa_t, MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, wb_t, MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, wc_t, MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, wd_t, MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, we_t, MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, wf_t, MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w1_t, MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w6_t, MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, wb_t, MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t, MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w5_t, MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, wa_t, MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, wf_t, MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w4_t, MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w9_t, MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, we_t, MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t, MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w8_t, MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, wd_t, MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t, MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w7_t, MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, wc_t, MD5C1f, MD5S13); + + MD5_STEP (MD5_H , a, b, c, d, w5_t, MD5C20, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w8_t, MD5C21, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, wb_t, MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, we_t, MD5C23, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w1_t, MD5C24, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w4_t, MD5C25, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w7_t, MD5C26, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, wa_t, MD5C27, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, wd_t, MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w0_t, MD5C29, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w3_t, MD5C2a, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w6_t, MD5C2b, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w9_t, MD5C2c, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, wc_t, MD5C2d, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, wf_t, MD5C2e, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w2_t, MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t, MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w7_t, MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, we_t, MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w5_t, MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, wc_t, MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t, MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, wa_t, MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t, MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w8_t, MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, wf_t, MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w6_t, MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, wd_t, MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w4_t, MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, wb_t, MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t, MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w9_t, MD5C3f, MD5S33); + + digest[0] += a; + digest[1] += b; + digest[2] += c; + digest[3] += d; +} + +__device__ static void hmac_md5_pad (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], u32x ipad[4], u32x opad[4]) +{ + w0[0] = w0[0] ^ 0x36363636; + w0[1] = w0[1] ^ 0x36363636; + w0[2] = w0[2] ^ 0x36363636; + w0[3] = w0[3] ^ 0x36363636; + w1[0] = w1[0] ^ 0x36363636; + w1[1] = w1[1] ^ 0x36363636; + w1[2] = w1[2] ^ 0x36363636; + w1[3] = w1[3] ^ 0x36363636; + w2[0] = w2[0] ^ 0x36363636; + w2[1] = w2[1] ^ 0x36363636; + w2[2] = w2[2] ^ 0x36363636; + w2[3] = w2[3] ^ 0x36363636; + w3[0] = w3[0] ^ 0x36363636; + w3[1] = w3[1] ^ 0x36363636; + w3[2] = w3[2] ^ 0x36363636; + w3[3] = w3[3] ^ 0x36363636; + + ipad[0] = MD5M_A; + ipad[1] = MD5M_B; + ipad[2] = MD5M_C; + ipad[3] = MD5M_D; + + md5_transform (w0, w1, w2, w3, ipad); + + w0[0] = w0[0] ^ 0x6a6a6a6a; + w0[1] = w0[1] ^ 0x6a6a6a6a; + w0[2] = w0[2] ^ 0x6a6a6a6a; + w0[3] = w0[3] ^ 0x6a6a6a6a; + w1[0] = w1[0] ^ 0x6a6a6a6a; + w1[1] = w1[1] ^ 0x6a6a6a6a; + w1[2] = w1[2] ^ 0x6a6a6a6a; + w1[3] = w1[3] ^ 0x6a6a6a6a; + w2[0] = w2[0] ^ 0x6a6a6a6a; + w2[1] = w2[1] ^ 0x6a6a6a6a; + w2[2] = w2[2] ^ 0x6a6a6a6a; + w2[3] = w2[3] ^ 0x6a6a6a6a; + w3[0] = w3[0] ^ 0x6a6a6a6a; + w3[1] = w3[1] ^ 0x6a6a6a6a; + w3[2] = w3[2] ^ 0x6a6a6a6a; + w3[3] = w3[3] ^ 0x6a6a6a6a; + + opad[0] = MD5M_A; + opad[1] = MD5M_B; + opad[2] = MD5M_C; + opad[3] = MD5M_D; + + md5_transform (w0, w1, w2, w3, opad); +} + +__device__ static void hmac_md5_run (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], u32x ipad[4], u32x opad[4], u32x digest[4]) +{ + digest[0] = ipad[0]; + digest[1] = ipad[1]; + digest[2] = ipad[2]; + digest[3] = ipad[3]; + + md5_transform (w0, w1, w2, w3, digest); + + w0[0] = digest[0]; + w0[1] = digest[1]; + w0[2] = digest[2]; + w0[3] = digest[3]; + w1[0] = 0x80; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + w3[0] = 0; + w3[1] = 0; + w3[2] = (64 + 16) * 8; + w3[3] = 0; + + digest[0] = opad[0]; + digest[1] = opad[1]; + digest[2] = opad[2]; + digest[3] = opad[3]; + + md5_transform (w0, w1, w2, w3, digest); +} + +__device__ __constant__ gpu_rule_t c_rules[1024]; + +extern "C" __global__ void __launch_bounds__ (256, 1) m05300_m04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const ikepsk_t *ikepsk_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + u32x pw_buf1[4]; + + pw_buf1[0] = pws[gid].i[ 4]; + pw_buf1[1] = pws[gid].i[ 5]; + pw_buf1[2] = pws[gid].i[ 6]; + pw_buf1[3] = pws[gid].i[ 7]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * salt + */ + + const u32 nr_len = ikepsk_bufs[salt_pos].nr_len; + const u32 msg_len = ikepsk_bufs[salt_pos].msg_len; + + u32 salt_buf0[4]; + + salt_buf0[0] = ikepsk_bufs[salt_pos].nr_buf[ 0]; + salt_buf0[1] = ikepsk_bufs[salt_pos].nr_buf[ 1]; + salt_buf0[2] = ikepsk_bufs[salt_pos].nr_buf[ 2]; + salt_buf0[3] = ikepsk_bufs[salt_pos].nr_buf[ 3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = ikepsk_bufs[salt_pos].nr_buf[ 4]; + salt_buf1[1] = ikepsk_bufs[salt_pos].nr_buf[ 5]; + salt_buf1[2] = ikepsk_bufs[salt_pos].nr_buf[ 6]; + salt_buf1[3] = ikepsk_bufs[salt_pos].nr_buf[ 7]; + + u32 salt_buf2[4]; + + salt_buf2[0] = ikepsk_bufs[salt_pos].nr_buf[ 8]; + salt_buf2[1] = ikepsk_bufs[salt_pos].nr_buf[ 9]; + salt_buf2[2] = ikepsk_bufs[salt_pos].nr_buf[10]; + salt_buf2[3] = ikepsk_bufs[salt_pos].nr_buf[11]; + + u32 salt_buf3[4]; + + salt_buf3[0] = ikepsk_bufs[salt_pos].nr_buf[12]; + salt_buf3[1] = ikepsk_bufs[salt_pos].nr_buf[13]; + salt_buf3[2] = 0; + salt_buf3[3] = 0; + + /** + * s_msg + */ + + __shared__ u32 s_msg_buf[128]; + + if (lid < 128) + { + s_msg_buf[lid] = ikepsk_bufs[salt_pos].msg_buf[lid]; + } + + __syncthreads (); + + if (gid >= gid_max) return; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + + w0[0] = pw_buf0[0]; + w0[1] = pw_buf0[1]; + w0[2] = pw_buf0[2]; + w0[3] = pw_buf0[3]; + + u32x w1[4]; + + w1[0] = pw_buf1[0]; + w1[1] = pw_buf1[1]; + w1[2] = pw_buf1[2]; + w1[3] = pw_buf1[3]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 out_len = apply_rules (c_rules[il_pos].cmds, w0, w1, pw_len); + + /** + * pads + */ + + u32x w0_t[4]; + + w0_t[0] = w0[0]; + w0_t[1] = w0[1]; + w0_t[2] = w0[2]; + w0_t[3] = w0[3]; + + u32x w1_t[4]; + + w1_t[0] = w1[0]; + w1_t[1] = w1[1]; + w1_t[2] = w1[2]; + w1_t[3] = w1[3]; + + u32x w2_t[4]; + + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + + u32x w3_t[4]; + + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = 0; + + u32x ipad[4]; + u32x opad[4]; + + hmac_md5_pad (w0_t, w1_t, w2_t, w3_t, ipad, opad); + + w0_t[0] = salt_buf0[0]; + w0_t[1] = salt_buf0[1]; + w0_t[2] = salt_buf0[2]; + w0_t[3] = salt_buf0[3]; + w1_t[0] = salt_buf1[0]; + w1_t[1] = salt_buf1[1]; + w1_t[2] = salt_buf1[2]; + w1_t[3] = salt_buf1[3]; + w2_t[0] = salt_buf2[0]; + w2_t[1] = salt_buf2[1]; + w2_t[2] = salt_buf2[2]; + w2_t[3] = salt_buf2[3]; + w3_t[0] = salt_buf3[0]; + w3_t[1] = salt_buf3[1]; + w3_t[2] = (64 + nr_len) * 8; + w3_t[3] = 0; + + u32x digest[4]; + + hmac_md5_run (w0_t, w1_t, w2_t, w3_t, ipad, opad, digest); + + w0_t[0] = digest[0]; + w0_t[1] = digest[1]; + w0_t[2] = digest[2]; + w0_t[3] = digest[3]; + w1_t[0] = 0; + w1_t[1] = 0; + w1_t[2] = 0; + w1_t[3] = 0; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = 0; + + hmac_md5_pad (w0_t, w1_t, w2_t, w3_t, ipad, opad); + + int left; + int off; + + for (left = ikepsk_bufs[salt_pos].msg_len, off = 0; left >= 56; left -= 64, off += 16) + { + w0_t[0] = s_msg_buf[off + 0]; + w0_t[1] = s_msg_buf[off + 1]; + w0_t[2] = s_msg_buf[off + 2]; + w0_t[3] = s_msg_buf[off + 3]; + w1_t[0] = s_msg_buf[off + 4]; + w1_t[1] = s_msg_buf[off + 5]; + w1_t[2] = s_msg_buf[off + 6]; + w1_t[3] = s_msg_buf[off + 7]; + w2_t[0] = s_msg_buf[off + 8]; + w2_t[1] = s_msg_buf[off + 9]; + w2_t[2] = s_msg_buf[off + 10]; + w2_t[3] = s_msg_buf[off + 11]; + w3_t[0] = s_msg_buf[off + 12]; + w3_t[1] = s_msg_buf[off + 13]; + w3_t[2] = s_msg_buf[off + 14]; + w3_t[3] = s_msg_buf[off + 15]; + + md5_transform (w0_t, w1_t, w2_t, w3_t, ipad); + } + + w0_t[0] = s_msg_buf[off + 0]; + w0_t[1] = s_msg_buf[off + 1]; + w0_t[2] = s_msg_buf[off + 2]; + w0_t[3] = s_msg_buf[off + 3]; + w1_t[0] = s_msg_buf[off + 4]; + w1_t[1] = s_msg_buf[off + 5]; + w1_t[2] = s_msg_buf[off + 6]; + w1_t[3] = s_msg_buf[off + 7]; + w2_t[0] = s_msg_buf[off + 8]; + w2_t[1] = s_msg_buf[off + 9]; + w2_t[2] = s_msg_buf[off + 10]; + w2_t[3] = s_msg_buf[off + 11]; + w3_t[0] = s_msg_buf[off + 12]; + w3_t[1] = s_msg_buf[off + 13]; + w3_t[2] = (64 + msg_len) * 8; + w3_t[3] = 0; + + hmac_md5_run (w0_t, w1_t, w2_t, w3_t, ipad, opad, digest); + + const u32x r0 = digest[0]; + const u32x r1 = digest[3]; + const u32x r2 = digest[2]; + const u32x r3 = digest[1]; + + #include VECT_COMPARE_M + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m05300_m08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const ikepsk_t *ikepsk_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m05300_m16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const ikepsk_t *ikepsk_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m05300_s04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const ikepsk_t *ikepsk_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + u32x pw_buf1[4]; + + pw_buf1[0] = pws[gid].i[ 4]; + pw_buf1[1] = pws[gid].i[ 5]; + pw_buf1[2] = pws[gid].i[ 6]; + pw_buf1[3] = pws[gid].i[ 7]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * salt + */ + + const u32 nr_len = ikepsk_bufs[salt_pos].nr_len; + const u32 msg_len = ikepsk_bufs[salt_pos].msg_len; + + u32 salt_buf0[4]; + + salt_buf0[0] = ikepsk_bufs[salt_pos].nr_buf[ 0]; + salt_buf0[1] = ikepsk_bufs[salt_pos].nr_buf[ 1]; + salt_buf0[2] = ikepsk_bufs[salt_pos].nr_buf[ 2]; + salt_buf0[3] = ikepsk_bufs[salt_pos].nr_buf[ 3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = ikepsk_bufs[salt_pos].nr_buf[ 4]; + salt_buf1[1] = ikepsk_bufs[salt_pos].nr_buf[ 5]; + salt_buf1[2] = ikepsk_bufs[salt_pos].nr_buf[ 6]; + salt_buf1[3] = ikepsk_bufs[salt_pos].nr_buf[ 7]; + + u32 salt_buf2[4]; + + salt_buf2[0] = ikepsk_bufs[salt_pos].nr_buf[ 8]; + salt_buf2[1] = ikepsk_bufs[salt_pos].nr_buf[ 9]; + salt_buf2[2] = ikepsk_bufs[salt_pos].nr_buf[10]; + salt_buf2[3] = ikepsk_bufs[salt_pos].nr_buf[11]; + + u32 salt_buf3[4]; + + salt_buf3[0] = ikepsk_bufs[salt_pos].nr_buf[12]; + salt_buf3[1] = ikepsk_bufs[salt_pos].nr_buf[13]; + salt_buf3[2] = 0; + salt_buf3[3] = 0; + + /** + * s_msg + */ + + __shared__ u32 s_msg_buf[128]; + + if (lid < 128) + { + s_msg_buf[lid] = ikepsk_bufs[salt_pos].msg_buf[lid]; + } + + __syncthreads (); + + if (gid >= gid_max) return; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + + w0[0] = pw_buf0[0]; + w0[1] = pw_buf0[1]; + w0[2] = pw_buf0[2]; + w0[3] = pw_buf0[3]; + + u32x w1[4]; + + w1[0] = pw_buf1[0]; + w1[1] = pw_buf1[1]; + w1[2] = pw_buf1[2]; + w1[3] = pw_buf1[3]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 out_len = apply_rules (c_rules[il_pos].cmds, w0, w1, pw_len); + + /** + * pads + */ + + u32x w0_t[4]; + + w0_t[0] = w0[0]; + w0_t[1] = w0[1]; + w0_t[2] = w0[2]; + w0_t[3] = w0[3]; + + u32x w1_t[4]; + + w1_t[0] = w1[0]; + w1_t[1] = w1[1]; + w1_t[2] = w1[2]; + w1_t[3] = w1[3]; + + u32x w2_t[4]; + + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + + u32x w3_t[4]; + + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = 0; + + u32x ipad[4]; + u32x opad[4]; + + hmac_md5_pad (w0_t, w1_t, w2_t, w3_t, ipad, opad); + + w0_t[0] = salt_buf0[0]; + w0_t[1] = salt_buf0[1]; + w0_t[2] = salt_buf0[2]; + w0_t[3] = salt_buf0[3]; + w1_t[0] = salt_buf1[0]; + w1_t[1] = salt_buf1[1]; + w1_t[2] = salt_buf1[2]; + w1_t[3] = salt_buf1[3]; + w2_t[0] = salt_buf2[0]; + w2_t[1] = salt_buf2[1]; + w2_t[2] = salt_buf2[2]; + w2_t[3] = salt_buf2[3]; + w3_t[0] = salt_buf3[0]; + w3_t[1] = salt_buf3[1]; + w3_t[2] = (64 + nr_len) * 8; + w3_t[3] = 0; + + u32x digest[4]; + + hmac_md5_run (w0_t, w1_t, w2_t, w3_t, ipad, opad, digest); + + w0_t[0] = digest[0]; + w0_t[1] = digest[1]; + w0_t[2] = digest[2]; + w0_t[3] = digest[3]; + w1_t[0] = 0; + w1_t[1] = 0; + w1_t[2] = 0; + w1_t[3] = 0; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = 0; + + hmac_md5_pad (w0_t, w1_t, w2_t, w3_t, ipad, opad); + + int left; + int off; + + for (left = ikepsk_bufs[salt_pos].msg_len, off = 0; left >= 56; left -= 64, off += 16) + { + w0_t[0] = s_msg_buf[off + 0]; + w0_t[1] = s_msg_buf[off + 1]; + w0_t[2] = s_msg_buf[off + 2]; + w0_t[3] = s_msg_buf[off + 3]; + w1_t[0] = s_msg_buf[off + 4]; + w1_t[1] = s_msg_buf[off + 5]; + w1_t[2] = s_msg_buf[off + 6]; + w1_t[3] = s_msg_buf[off + 7]; + w2_t[0] = s_msg_buf[off + 8]; + w2_t[1] = s_msg_buf[off + 9]; + w2_t[2] = s_msg_buf[off + 10]; + w2_t[3] = s_msg_buf[off + 11]; + w3_t[0] = s_msg_buf[off + 12]; + w3_t[1] = s_msg_buf[off + 13]; + w3_t[2] = s_msg_buf[off + 14]; + w3_t[3] = s_msg_buf[off + 15]; + + md5_transform (w0_t, w1_t, w2_t, w3_t, ipad); + } + + w0_t[0] = s_msg_buf[off + 0]; + w0_t[1] = s_msg_buf[off + 1]; + w0_t[2] = s_msg_buf[off + 2]; + w0_t[3] = s_msg_buf[off + 3]; + w1_t[0] = s_msg_buf[off + 4]; + w1_t[1] = s_msg_buf[off + 5]; + w1_t[2] = s_msg_buf[off + 6]; + w1_t[3] = s_msg_buf[off + 7]; + w2_t[0] = s_msg_buf[off + 8]; + w2_t[1] = s_msg_buf[off + 9]; + w2_t[2] = s_msg_buf[off + 10]; + w2_t[3] = s_msg_buf[off + 11]; + w3_t[0] = s_msg_buf[off + 12]; + w3_t[1] = s_msg_buf[off + 13]; + w3_t[2] = (64 + msg_len) * 8; + w3_t[3] = 0; + + hmac_md5_run (w0_t, w1_t, w2_t, w3_t, ipad, opad, digest); + + const u32x r0 = digest[0]; + const u32x r1 = digest[3]; + const u32x r2 = digest[2]; + const u32x r3 = digest[1]; + + #include VECT_COMPARE_S + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m05300_s08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const ikepsk_t *ikepsk_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m05300_s16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const ikepsk_t *ikepsk_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/nv/m05300_a1.cu b/nv/m05300_a1.cu new file mode 100644 index 0000000000..57c011f814 --- /dev/null +++ b/nv/m05300_a1.cu @@ -0,0 +1,854 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _MD5_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW2 +#define VECT_SIZE1 +#endif + +#define DGST_R0 0 +#define DGST_R1 3 +#define DGST_R2 2 +#define DGST_R3 1 + +#include "include/kernel_functions.c" +#include "types_nv.c" +#include "common_nv.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +__device__ static void md5_transform (const u32x w0[4], const u32x w1[4], const u32x w2[4], const u32x w3[4], u32x digest[4]) +{ + u32x a = digest[0]; + u32x b = digest[1]; + u32x c = digest[2]; + u32x d = digest[3]; + + u32x w0_t = w0[0]; + u32x w1_t = w0[1]; + u32x w2_t = w0[2]; + u32x w3_t = w0[3]; + u32x w4_t = w1[0]; + u32x w5_t = w1[1]; + u32x w6_t = w1[2]; + u32x w7_t = w1[3]; + u32x w8_t = w2[0]; + u32x w9_t = w2[1]; + u32x wa_t = w2[2]; + u32x wb_t = w2[3]; + u32x wc_t = w3[0]; + u32x wd_t = w3[1]; + u32x we_t = w3[2]; + u32x wf_t = w3[3]; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t, MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t, MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t, MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t, MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w4_t, MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w5_t, MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w6_t, MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w7_t, MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w8_t, MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w9_t, MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, wa_t, MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, wb_t, MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, wc_t, MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, wd_t, MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, we_t, MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, wf_t, MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w1_t, MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w6_t, MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, wb_t, MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t, MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w5_t, MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, wa_t, MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, wf_t, MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w4_t, MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w9_t, MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, we_t, MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t, MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w8_t, MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, wd_t, MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t, MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w7_t, MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, wc_t, MD5C1f, MD5S13); + + MD5_STEP (MD5_H , a, b, c, d, w5_t, MD5C20, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w8_t, MD5C21, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, wb_t, MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, we_t, MD5C23, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w1_t, MD5C24, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w4_t, MD5C25, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w7_t, MD5C26, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, wa_t, MD5C27, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, wd_t, MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w0_t, MD5C29, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w3_t, MD5C2a, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w6_t, MD5C2b, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w9_t, MD5C2c, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, wc_t, MD5C2d, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, wf_t, MD5C2e, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w2_t, MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t, MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w7_t, MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, we_t, MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w5_t, MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, wc_t, MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t, MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, wa_t, MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t, MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w8_t, MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, wf_t, MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w6_t, MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, wd_t, MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w4_t, MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, wb_t, MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t, MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w9_t, MD5C3f, MD5S33); + + digest[0] += a; + digest[1] += b; + digest[2] += c; + digest[3] += d; +} + +__device__ static void hmac_md5_pad (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], u32x ipad[4], u32x opad[4]) +{ + w0[0] = w0[0] ^ 0x36363636; + w0[1] = w0[1] ^ 0x36363636; + w0[2] = w0[2] ^ 0x36363636; + w0[3] = w0[3] ^ 0x36363636; + w1[0] = w1[0] ^ 0x36363636; + w1[1] = w1[1] ^ 0x36363636; + w1[2] = w1[2] ^ 0x36363636; + w1[3] = w1[3] ^ 0x36363636; + w2[0] = w2[0] ^ 0x36363636; + w2[1] = w2[1] ^ 0x36363636; + w2[2] = w2[2] ^ 0x36363636; + w2[3] = w2[3] ^ 0x36363636; + w3[0] = w3[0] ^ 0x36363636; + w3[1] = w3[1] ^ 0x36363636; + w3[2] = w3[2] ^ 0x36363636; + w3[3] = w3[3] ^ 0x36363636; + + ipad[0] = MD5M_A; + ipad[1] = MD5M_B; + ipad[2] = MD5M_C; + ipad[3] = MD5M_D; + + md5_transform (w0, w1, w2, w3, ipad); + + w0[0] = w0[0] ^ 0x6a6a6a6a; + w0[1] = w0[1] ^ 0x6a6a6a6a; + w0[2] = w0[2] ^ 0x6a6a6a6a; + w0[3] = w0[3] ^ 0x6a6a6a6a; + w1[0] = w1[0] ^ 0x6a6a6a6a; + w1[1] = w1[1] ^ 0x6a6a6a6a; + w1[2] = w1[2] ^ 0x6a6a6a6a; + w1[3] = w1[3] ^ 0x6a6a6a6a; + w2[0] = w2[0] ^ 0x6a6a6a6a; + w2[1] = w2[1] ^ 0x6a6a6a6a; + w2[2] = w2[2] ^ 0x6a6a6a6a; + w2[3] = w2[3] ^ 0x6a6a6a6a; + w3[0] = w3[0] ^ 0x6a6a6a6a; + w3[1] = w3[1] ^ 0x6a6a6a6a; + w3[2] = w3[2] ^ 0x6a6a6a6a; + w3[3] = w3[3] ^ 0x6a6a6a6a; + + opad[0] = MD5M_A; + opad[1] = MD5M_B; + opad[2] = MD5M_C; + opad[3] = MD5M_D; + + md5_transform (w0, w1, w2, w3, opad); +} + +__device__ static void hmac_md5_run (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], u32x ipad[4], u32x opad[4], u32x digest[4]) +{ + digest[0] = ipad[0]; + digest[1] = ipad[1]; + digest[2] = ipad[2]; + digest[3] = ipad[3]; + + md5_transform (w0, w1, w2, w3, digest); + + w0[0] = digest[0]; + w0[1] = digest[1]; + w0[2] = digest[2]; + w0[3] = digest[3]; + w1[0] = 0x80; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + w3[0] = 0; + w3[1] = 0; + w3[2] = (64 + 16) * 8; + w3[3] = 0; + + digest[0] = opad[0]; + digest[1] = opad[1]; + digest[2] = opad[2]; + digest[3] = opad[3]; + + md5_transform (w0, w1, w2, w3, digest); +} + +__device__ __constant__ comb_t c_combs[1024]; + +extern "C" __global__ void __launch_bounds__ (256, 1) m05300_m04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const ikepsk_t *ikepsk_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, c_combs[0].pw_len); + } + + /** + * salt + */ + + const u32 nr_len = ikepsk_bufs[salt_pos].nr_len; + const u32 msg_len = ikepsk_bufs[salt_pos].msg_len; + + u32 salt_buf0[4]; + + salt_buf0[0] = ikepsk_bufs[salt_pos].nr_buf[ 0]; + salt_buf0[1] = ikepsk_bufs[salt_pos].nr_buf[ 1]; + salt_buf0[2] = ikepsk_bufs[salt_pos].nr_buf[ 2]; + salt_buf0[3] = ikepsk_bufs[salt_pos].nr_buf[ 3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = ikepsk_bufs[salt_pos].nr_buf[ 4]; + salt_buf1[1] = ikepsk_bufs[salt_pos].nr_buf[ 5]; + salt_buf1[2] = ikepsk_bufs[salt_pos].nr_buf[ 6]; + salt_buf1[3] = ikepsk_bufs[salt_pos].nr_buf[ 7]; + + u32 salt_buf2[4]; + + salt_buf2[0] = ikepsk_bufs[salt_pos].nr_buf[ 8]; + salt_buf2[1] = ikepsk_bufs[salt_pos].nr_buf[ 9]; + salt_buf2[2] = ikepsk_bufs[salt_pos].nr_buf[10]; + salt_buf2[3] = ikepsk_bufs[salt_pos].nr_buf[11]; + + u32 salt_buf3[4]; + + salt_buf3[0] = ikepsk_bufs[salt_pos].nr_buf[12]; + salt_buf3[1] = ikepsk_bufs[salt_pos].nr_buf[13]; + salt_buf3[2] = 0; + salt_buf3[3] = 0; + + /** + * s_msg + */ + + __shared__ u32 s_msg_buf[128]; + + if (lid < 128) + { + s_msg_buf[lid] = ikepsk_bufs[salt_pos].msg_buf[lid]; + } + + __syncthreads (); + + if (gid >= gid_max) return; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = c_combs[il_pos].pw_len; + + const u32 pw_len = pw_l_len + pw_r_len; + + u32 wordr0[4]; + + wordr0[0] = c_combs[il_pos].i[0]; + wordr0[1] = c_combs[il_pos].i[1]; + wordr0[2] = c_combs[il_pos].i[2]; + wordr0[3] = c_combs[il_pos].i[3]; + + u32 wordr1[4]; + + wordr1[0] = c_combs[il_pos].i[4]; + wordr1[1] = c_combs[il_pos].i[5]; + wordr1[2] = c_combs[il_pos].i[6]; + wordr1[3] = c_combs[il_pos].i[7]; + + u32 wordr2[4]; + + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + + u32 wordr3[4]; + + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + u32x w0[4]; + + w0[0] = wordl0[0] | wordr0[0]; + w0[1] = wordl0[1] | wordr0[1]; + w0[2] = wordl0[2] | wordr0[2]; + w0[3] = wordl0[3] | wordr0[3]; + + u32x w1[4]; + + w1[0] = wordl1[0] | wordr1[0]; + w1[1] = wordl1[1] | wordr1[1]; + w1[2] = wordl1[2] | wordr1[2]; + w1[3] = wordl1[3] | wordr1[3]; + + u32x w2[4]; + + w2[0] = wordl2[0] | wordr2[0]; + w2[1] = wordl2[1] | wordr2[1]; + w2[2] = wordl2[2] | wordr2[2]; + w2[3] = wordl2[3] | wordr2[3]; + + u32x w3[4]; + + w3[0] = wordl3[0] | wordr3[0]; + w3[1] = wordl3[1] | wordr3[1]; + w3[2] = wordl3[2] | wordr3[2]; + w3[3] = wordl3[3] | wordr3[3]; + + /** + * pads + */ + + u32x w0_t[4]; + + w0_t[0] = w0[0]; + w0_t[1] = w0[1]; + w0_t[2] = w0[2]; + w0_t[3] = w0[3]; + + u32x w1_t[4]; + + w1_t[0] = w1[0]; + w1_t[1] = w1[1]; + w1_t[2] = w1[2]; + w1_t[3] = w1[3]; + + u32x w2_t[4]; + + w2_t[0] = w2[0]; + w2_t[1] = w2[1]; + w2_t[2] = w2[2]; + w2_t[3] = w2[3]; + + u32x w3_t[4]; + + w3_t[0] = w3[0]; + w3_t[1] = w3[1]; + w3_t[2] = w3[2]; + w3_t[3] = w3[3]; + + u32x ipad[4]; + u32x opad[4]; + + hmac_md5_pad (w0_t, w1_t, w2_t, w3_t, ipad, opad); + + w0_t[0] = salt_buf0[0]; + w0_t[1] = salt_buf0[1]; + w0_t[2] = salt_buf0[2]; + w0_t[3] = salt_buf0[3]; + w1_t[0] = salt_buf1[0]; + w1_t[1] = salt_buf1[1]; + w1_t[2] = salt_buf1[2]; + w1_t[3] = salt_buf1[3]; + w2_t[0] = salt_buf2[0]; + w2_t[1] = salt_buf2[1]; + w2_t[2] = salt_buf2[2]; + w2_t[3] = salt_buf2[3]; + w3_t[0] = salt_buf3[0]; + w3_t[1] = salt_buf3[1]; + w3_t[2] = (64 + nr_len) * 8; + w3_t[3] = 0; + + u32x digest[4]; + + hmac_md5_run (w0_t, w1_t, w2_t, w3_t, ipad, opad, digest); + + w0_t[0] = digest[0]; + w0_t[1] = digest[1]; + w0_t[2] = digest[2]; + w0_t[3] = digest[3]; + w1_t[0] = 0; + w1_t[1] = 0; + w1_t[2] = 0; + w1_t[3] = 0; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = 0; + + hmac_md5_pad (w0_t, w1_t, w2_t, w3_t, ipad, opad); + + int left; + int off; + + for (left = ikepsk_bufs[salt_pos].msg_len, off = 0; left >= 56; left -= 64, off += 16) + { + w0_t[0] = s_msg_buf[off + 0]; + w0_t[1] = s_msg_buf[off + 1]; + w0_t[2] = s_msg_buf[off + 2]; + w0_t[3] = s_msg_buf[off + 3]; + w1_t[0] = s_msg_buf[off + 4]; + w1_t[1] = s_msg_buf[off + 5]; + w1_t[2] = s_msg_buf[off + 6]; + w1_t[3] = s_msg_buf[off + 7]; + w2_t[0] = s_msg_buf[off + 8]; + w2_t[1] = s_msg_buf[off + 9]; + w2_t[2] = s_msg_buf[off + 10]; + w2_t[3] = s_msg_buf[off + 11]; + w3_t[0] = s_msg_buf[off + 12]; + w3_t[1] = s_msg_buf[off + 13]; + w3_t[2] = s_msg_buf[off + 14]; + w3_t[3] = s_msg_buf[off + 15]; + + md5_transform (w0_t, w1_t, w2_t, w3_t, ipad); + } + + w0_t[0] = s_msg_buf[off + 0]; + w0_t[1] = s_msg_buf[off + 1]; + w0_t[2] = s_msg_buf[off + 2]; + w0_t[3] = s_msg_buf[off + 3]; + w1_t[0] = s_msg_buf[off + 4]; + w1_t[1] = s_msg_buf[off + 5]; + w1_t[2] = s_msg_buf[off + 6]; + w1_t[3] = s_msg_buf[off + 7]; + w2_t[0] = s_msg_buf[off + 8]; + w2_t[1] = s_msg_buf[off + 9]; + w2_t[2] = s_msg_buf[off + 10]; + w2_t[3] = s_msg_buf[off + 11]; + w3_t[0] = s_msg_buf[off + 12]; + w3_t[1] = s_msg_buf[off + 13]; + w3_t[2] = (64 + msg_len) * 8; + w3_t[3] = 0; + + hmac_md5_run (w0_t, w1_t, w2_t, w3_t, ipad, opad, digest); + + const u32x r0 = digest[0]; + const u32x r1 = digest[3]; + const u32x r2 = digest[2]; + const u32x r3 = digest[1]; + + #include VECT_COMPARE_M + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m05300_m08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const ikepsk_t *ikepsk_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m05300_m16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const ikepsk_t *ikepsk_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m05300_s04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const ikepsk_t *ikepsk_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, c_combs[0].pw_len); + } + + /** + * salt + */ + + const u32 nr_len = ikepsk_bufs[salt_pos].nr_len; + const u32 msg_len = ikepsk_bufs[salt_pos].msg_len; + + u32 salt_buf0[4]; + + salt_buf0[0] = ikepsk_bufs[salt_pos].nr_buf[ 0]; + salt_buf0[1] = ikepsk_bufs[salt_pos].nr_buf[ 1]; + salt_buf0[2] = ikepsk_bufs[salt_pos].nr_buf[ 2]; + salt_buf0[3] = ikepsk_bufs[salt_pos].nr_buf[ 3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = ikepsk_bufs[salt_pos].nr_buf[ 4]; + salt_buf1[1] = ikepsk_bufs[salt_pos].nr_buf[ 5]; + salt_buf1[2] = ikepsk_bufs[salt_pos].nr_buf[ 6]; + salt_buf1[3] = ikepsk_bufs[salt_pos].nr_buf[ 7]; + + u32 salt_buf2[4]; + + salt_buf2[0] = ikepsk_bufs[salt_pos].nr_buf[ 8]; + salt_buf2[1] = ikepsk_bufs[salt_pos].nr_buf[ 9]; + salt_buf2[2] = ikepsk_bufs[salt_pos].nr_buf[10]; + salt_buf2[3] = ikepsk_bufs[salt_pos].nr_buf[11]; + + u32 salt_buf3[4]; + + salt_buf3[0] = ikepsk_bufs[salt_pos].nr_buf[12]; + salt_buf3[1] = ikepsk_bufs[salt_pos].nr_buf[13]; + salt_buf3[2] = 0; + salt_buf3[3] = 0; + + /** + * s_msg + */ + + __shared__ u32 s_msg_buf[128]; + + if (lid < 128) + { + s_msg_buf[lid] = ikepsk_bufs[salt_pos].msg_buf[lid]; + } + + __syncthreads (); + + if (gid >= gid_max) return; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = c_combs[il_pos].pw_len; + + const u32 pw_len = pw_l_len + pw_r_len; + + u32 wordr0[4]; + + wordr0[0] = c_combs[il_pos].i[0]; + wordr0[1] = c_combs[il_pos].i[1]; + wordr0[2] = c_combs[il_pos].i[2]; + wordr0[3] = c_combs[il_pos].i[3]; + + u32 wordr1[4]; + + wordr1[0] = c_combs[il_pos].i[4]; + wordr1[1] = c_combs[il_pos].i[5]; + wordr1[2] = c_combs[il_pos].i[6]; + wordr1[3] = c_combs[il_pos].i[7]; + + u32 wordr2[4]; + + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + + u32 wordr3[4]; + + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + u32x w0[4]; + + w0[0] = wordl0[0] | wordr0[0]; + w0[1] = wordl0[1] | wordr0[1]; + w0[2] = wordl0[2] | wordr0[2]; + w0[3] = wordl0[3] | wordr0[3]; + + u32x w1[4]; + + w1[0] = wordl1[0] | wordr1[0]; + w1[1] = wordl1[1] | wordr1[1]; + w1[2] = wordl1[2] | wordr1[2]; + w1[3] = wordl1[3] | wordr1[3]; + + u32x w2[4]; + + w2[0] = wordl2[0] | wordr2[0]; + w2[1] = wordl2[1] | wordr2[1]; + w2[2] = wordl2[2] | wordr2[2]; + w2[3] = wordl2[3] | wordr2[3]; + + u32x w3[4]; + + w3[0] = wordl3[0] | wordr3[0]; + w3[1] = wordl3[1] | wordr3[1]; + w3[2] = wordl3[2] | wordr3[2]; + w3[3] = wordl3[3] | wordr3[3]; + + /** + * pads + */ + + u32x w0_t[4]; + + w0_t[0] = w0[0]; + w0_t[1] = w0[1]; + w0_t[2] = w0[2]; + w0_t[3] = w0[3]; + + u32x w1_t[4]; + + w1_t[0] = w1[0]; + w1_t[1] = w1[1]; + w1_t[2] = w1[2]; + w1_t[3] = w1[3]; + + u32x w2_t[4]; + + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + + u32x w3_t[4]; + + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = 0; + + u32x ipad[4]; + u32x opad[4]; + + hmac_md5_pad (w0_t, w1_t, w2_t, w3_t, ipad, opad); + + w0_t[0] = salt_buf0[0]; + w0_t[1] = salt_buf0[1]; + w0_t[2] = salt_buf0[2]; + w0_t[3] = salt_buf0[3]; + w1_t[0] = salt_buf1[0]; + w1_t[1] = salt_buf1[1]; + w1_t[2] = salt_buf1[2]; + w1_t[3] = salt_buf1[3]; + w2_t[0] = salt_buf2[0]; + w2_t[1] = salt_buf2[1]; + w2_t[2] = salt_buf2[2]; + w2_t[3] = salt_buf2[3]; + w3_t[0] = salt_buf3[0]; + w3_t[1] = salt_buf3[1]; + w3_t[2] = (64 + nr_len) * 8; + w3_t[3] = 0; + + u32x digest[4]; + + hmac_md5_run (w0_t, w1_t, w2_t, w3_t, ipad, opad, digest); + + w0_t[0] = digest[0]; + w0_t[1] = digest[1]; + w0_t[2] = digest[2]; + w0_t[3] = digest[3]; + w1_t[0] = 0; + w1_t[1] = 0; + w1_t[2] = 0; + w1_t[3] = 0; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = 0; + + hmac_md5_pad (w0_t, w1_t, w2_t, w3_t, ipad, opad); + + int left; + int off; + + for (left = ikepsk_bufs[salt_pos].msg_len, off = 0; left >= 56; left -= 64, off += 16) + { + w0_t[0] = s_msg_buf[off + 0]; + w0_t[1] = s_msg_buf[off + 1]; + w0_t[2] = s_msg_buf[off + 2]; + w0_t[3] = s_msg_buf[off + 3]; + w1_t[0] = s_msg_buf[off + 4]; + w1_t[1] = s_msg_buf[off + 5]; + w1_t[2] = s_msg_buf[off + 6]; + w1_t[3] = s_msg_buf[off + 7]; + w2_t[0] = s_msg_buf[off + 8]; + w2_t[1] = s_msg_buf[off + 9]; + w2_t[2] = s_msg_buf[off + 10]; + w2_t[3] = s_msg_buf[off + 11]; + w3_t[0] = s_msg_buf[off + 12]; + w3_t[1] = s_msg_buf[off + 13]; + w3_t[2] = s_msg_buf[off + 14]; + w3_t[3] = s_msg_buf[off + 15]; + + md5_transform (w0_t, w1_t, w2_t, w3_t, ipad); + } + + w0_t[0] = s_msg_buf[off + 0]; + w0_t[1] = s_msg_buf[off + 1]; + w0_t[2] = s_msg_buf[off + 2]; + w0_t[3] = s_msg_buf[off + 3]; + w1_t[0] = s_msg_buf[off + 4]; + w1_t[1] = s_msg_buf[off + 5]; + w1_t[2] = s_msg_buf[off + 6]; + w1_t[3] = s_msg_buf[off + 7]; + w2_t[0] = s_msg_buf[off + 8]; + w2_t[1] = s_msg_buf[off + 9]; + w2_t[2] = s_msg_buf[off + 10]; + w2_t[3] = s_msg_buf[off + 11]; + w3_t[0] = s_msg_buf[off + 12]; + w3_t[1] = s_msg_buf[off + 13]; + w3_t[2] = (64 + msg_len) * 8; + w3_t[3] = 0; + + hmac_md5_run (w0_t, w1_t, w2_t, w3_t, ipad, opad, digest); + + const u32x r0 = digest[0]; + const u32x r1 = digest[3]; + const u32x r2 = digest[2]; + const u32x r3 = digest[1]; + + #include VECT_COMPARE_S + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m05300_s08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const ikepsk_t *ikepsk_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m05300_s16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const ikepsk_t *ikepsk_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/nv/m05300_a3.cu b/nv/m05300_a3.cu new file mode 100644 index 0000000000..2e3fc2e357 --- /dev/null +++ b/nv/m05300_a3.cu @@ -0,0 +1,976 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _MD5_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW2 +#define VECT_SIZE1 +#endif + +#define DGST_R0 0 +#define DGST_R1 3 +#define DGST_R2 2 +#define DGST_R3 1 + +#include "include/kernel_functions.c" +#include "types_nv.c" +#include "common_nv.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +__device__ static void md5_transform (const u32x w0[4], const u32x w1[4], const u32x w2[4], const u32x w3[4], u32x digest[4]) +{ + u32x a = digest[0]; + u32x b = digest[1]; + u32x c = digest[2]; + u32x d = digest[3]; + + u32x w0_t = w0[0]; + u32x w1_t = w0[1]; + u32x w2_t = w0[2]; + u32x w3_t = w0[3]; + u32x w4_t = w1[0]; + u32x w5_t = w1[1]; + u32x w6_t = w1[2]; + u32x w7_t = w1[3]; + u32x w8_t = w2[0]; + u32x w9_t = w2[1]; + u32x wa_t = w2[2]; + u32x wb_t = w2[3]; + u32x wc_t = w3[0]; + u32x wd_t = w3[1]; + u32x we_t = w3[2]; + u32x wf_t = w3[3]; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t, MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t, MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t, MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t, MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w4_t, MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w5_t, MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w6_t, MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w7_t, MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w8_t, MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w9_t, MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, wa_t, MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, wb_t, MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, wc_t, MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, wd_t, MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, we_t, MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, wf_t, MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w1_t, MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w6_t, MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, wb_t, MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t, MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w5_t, MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, wa_t, MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, wf_t, MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w4_t, MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w9_t, MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, we_t, MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t, MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w8_t, MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, wd_t, MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t, MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w7_t, MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, wc_t, MD5C1f, MD5S13); + + MD5_STEP (MD5_H , a, b, c, d, w5_t, MD5C20, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w8_t, MD5C21, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, wb_t, MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, we_t, MD5C23, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w1_t, MD5C24, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w4_t, MD5C25, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w7_t, MD5C26, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, wa_t, MD5C27, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, wd_t, MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w0_t, MD5C29, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w3_t, MD5C2a, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w6_t, MD5C2b, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w9_t, MD5C2c, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, wc_t, MD5C2d, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, wf_t, MD5C2e, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w2_t, MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t, MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w7_t, MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, we_t, MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w5_t, MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, wc_t, MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t, MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, wa_t, MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t, MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w8_t, MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, wf_t, MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w6_t, MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, wd_t, MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w4_t, MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, wb_t, MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t, MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w9_t, MD5C3f, MD5S33); + + digest[0] += a; + digest[1] += b; + digest[2] += c; + digest[3] += d; +} + +__device__ static void hmac_md5_pad (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], u32x ipad[4], u32x opad[4]) +{ + w0[0] = w0[0] ^ 0x36363636; + w0[1] = w0[1] ^ 0x36363636; + w0[2] = w0[2] ^ 0x36363636; + w0[3] = w0[3] ^ 0x36363636; + w1[0] = w1[0] ^ 0x36363636; + w1[1] = w1[1] ^ 0x36363636; + w1[2] = w1[2] ^ 0x36363636; + w1[3] = w1[3] ^ 0x36363636; + w2[0] = w2[0] ^ 0x36363636; + w2[1] = w2[1] ^ 0x36363636; + w2[2] = w2[2] ^ 0x36363636; + w2[3] = w2[3] ^ 0x36363636; + w3[0] = w3[0] ^ 0x36363636; + w3[1] = w3[1] ^ 0x36363636; + w3[2] = w3[2] ^ 0x36363636; + w3[3] = w3[3] ^ 0x36363636; + + ipad[0] = MD5M_A; + ipad[1] = MD5M_B; + ipad[2] = MD5M_C; + ipad[3] = MD5M_D; + + md5_transform (w0, w1, w2, w3, ipad); + + w0[0] = w0[0] ^ 0x6a6a6a6a; + w0[1] = w0[1] ^ 0x6a6a6a6a; + w0[2] = w0[2] ^ 0x6a6a6a6a; + w0[3] = w0[3] ^ 0x6a6a6a6a; + w1[0] = w1[0] ^ 0x6a6a6a6a; + w1[1] = w1[1] ^ 0x6a6a6a6a; + w1[2] = w1[2] ^ 0x6a6a6a6a; + w1[3] = w1[3] ^ 0x6a6a6a6a; + w2[0] = w2[0] ^ 0x6a6a6a6a; + w2[1] = w2[1] ^ 0x6a6a6a6a; + w2[2] = w2[2] ^ 0x6a6a6a6a; + w2[3] = w2[3] ^ 0x6a6a6a6a; + w3[0] = w3[0] ^ 0x6a6a6a6a; + w3[1] = w3[1] ^ 0x6a6a6a6a; + w3[2] = w3[2] ^ 0x6a6a6a6a; + w3[3] = w3[3] ^ 0x6a6a6a6a; + + opad[0] = MD5M_A; + opad[1] = MD5M_B; + opad[2] = MD5M_C; + opad[3] = MD5M_D; + + md5_transform (w0, w1, w2, w3, opad); +} + +__device__ static void hmac_md5_run (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], u32x ipad[4], u32x opad[4], u32x digest[4]) +{ + digest[0] = ipad[0]; + digest[1] = ipad[1]; + digest[2] = ipad[2]; + digest[3] = ipad[3]; + + md5_transform (w0, w1, w2, w3, digest); + + w0[0] = digest[0]; + w0[1] = digest[1]; + w0[2] = digest[2]; + w0[3] = digest[3]; + w1[0] = 0x80; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + w3[0] = 0; + w3[1] = 0; + w3[2] = (64 + 16) * 8; + w3[3] = 0; + + digest[0] = opad[0]; + digest[1] = opad[1]; + digest[2] = opad[2]; + digest[3] = opad[3]; + + md5_transform (w0, w1, w2, w3, digest); +} + +__device__ __constant__ bf_t c_bfs[1024]; + +__device__ static void m05300m (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], const u32 pw_len, const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const ikepsk_t *ikepsk_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, u32 s_msg_buf[128]) +{ + /** + * modifier + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + const u32 lid = threadIdx.x; + + /** + * salt + */ + + const u32 nr_len = ikepsk_bufs[salt_pos].nr_len; + const u32 msg_len = ikepsk_bufs[salt_pos].msg_len; + + u32 salt_buf0[4]; + + salt_buf0[0] = ikepsk_bufs[salt_pos].nr_buf[ 0]; + salt_buf0[1] = ikepsk_bufs[salt_pos].nr_buf[ 1]; + salt_buf0[2] = ikepsk_bufs[salt_pos].nr_buf[ 2]; + salt_buf0[3] = ikepsk_bufs[salt_pos].nr_buf[ 3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = ikepsk_bufs[salt_pos].nr_buf[ 4]; + salt_buf1[1] = ikepsk_bufs[salt_pos].nr_buf[ 5]; + salt_buf1[2] = ikepsk_bufs[salt_pos].nr_buf[ 6]; + salt_buf1[3] = ikepsk_bufs[salt_pos].nr_buf[ 7]; + + u32 salt_buf2[4]; + + salt_buf2[0] = ikepsk_bufs[salt_pos].nr_buf[ 8]; + salt_buf2[1] = ikepsk_bufs[salt_pos].nr_buf[ 9]; + salt_buf2[2] = ikepsk_bufs[salt_pos].nr_buf[10]; + salt_buf2[3] = ikepsk_bufs[salt_pos].nr_buf[11]; + + u32 salt_buf3[4]; + + salt_buf3[0] = ikepsk_bufs[salt_pos].nr_buf[12]; + salt_buf3[1] = ikepsk_bufs[salt_pos].nr_buf[13]; + salt_buf3[2] = 0; + salt_buf3[3] = 0; + + /** + * loop + */ + + u32x w0l = w0[0]; + + for (u32 il_pos = 0; il_pos < bfs_cnt; il_pos++) + { + const u32 w0r = c_bfs[il_pos].i; + + w0[0] = w0l | w0r; + + /** + * pads + */ + + u32x w0_t[4]; + + w0_t[0] = w0[0]; + w0_t[1] = w0[1]; + w0_t[2] = w0[2]; + w0_t[3] = w0[3]; + + u32x w1_t[4]; + + w1_t[0] = w1[0]; + w1_t[1] = w1[1]; + w1_t[2] = w1[2]; + w1_t[3] = w1[3]; + + u32x w2_t[4]; + + w2_t[0] = w2[0]; + w2_t[1] = w2[1]; + w2_t[2] = w2[2]; + w2_t[3] = w2[3]; + + u32x w3_t[4]; + + w3_t[0] = w3[0]; + w3_t[1] = w3[1]; + w3_t[2] = w3[2]; + w3_t[3] = w3[3]; + + u32x ipad[4]; + u32x opad[4]; + + hmac_md5_pad (w0_t, w1_t, w2_t, w3_t, ipad, opad); + + w0_t[0] = salt_buf0[0]; + w0_t[1] = salt_buf0[1]; + w0_t[2] = salt_buf0[2]; + w0_t[3] = salt_buf0[3]; + w1_t[0] = salt_buf1[0]; + w1_t[1] = salt_buf1[1]; + w1_t[2] = salt_buf1[2]; + w1_t[3] = salt_buf1[3]; + w2_t[0] = salt_buf2[0]; + w2_t[1] = salt_buf2[1]; + w2_t[2] = salt_buf2[2]; + w2_t[3] = salt_buf2[3]; + w3_t[0] = salt_buf3[0]; + w3_t[1] = salt_buf3[1]; + w3_t[2] = (64 + nr_len) * 8; + w3_t[3] = 0; + + u32x digest[4]; + + hmac_md5_run (w0_t, w1_t, w2_t, w3_t, ipad, opad, digest); + + w0_t[0] = digest[0]; + w0_t[1] = digest[1]; + w0_t[2] = digest[2]; + w0_t[3] = digest[3]; + w1_t[0] = 0; + w1_t[1] = 0; + w1_t[2] = 0; + w1_t[3] = 0; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = 0; + + hmac_md5_pad (w0_t, w1_t, w2_t, w3_t, ipad, opad); + + int left; + int off; + + for (left = ikepsk_bufs[salt_pos].msg_len, off = 0; left >= 56; left -= 64, off += 16) + { + w0_t[0] = s_msg_buf[off + 0]; + w0_t[1] = s_msg_buf[off + 1]; + w0_t[2] = s_msg_buf[off + 2]; + w0_t[3] = s_msg_buf[off + 3]; + w1_t[0] = s_msg_buf[off + 4]; + w1_t[1] = s_msg_buf[off + 5]; + w1_t[2] = s_msg_buf[off + 6]; + w1_t[3] = s_msg_buf[off + 7]; + w2_t[0] = s_msg_buf[off + 8]; + w2_t[1] = s_msg_buf[off + 9]; + w2_t[2] = s_msg_buf[off + 10]; + w2_t[3] = s_msg_buf[off + 11]; + w3_t[0] = s_msg_buf[off + 12]; + w3_t[1] = s_msg_buf[off + 13]; + w3_t[2] = s_msg_buf[off + 14]; + w3_t[3] = s_msg_buf[off + 15]; + + md5_transform (w0_t, w1_t, w2_t, w3_t, ipad); + } + + w0_t[0] = s_msg_buf[off + 0]; + w0_t[1] = s_msg_buf[off + 1]; + w0_t[2] = s_msg_buf[off + 2]; + w0_t[3] = s_msg_buf[off + 3]; + w1_t[0] = s_msg_buf[off + 4]; + w1_t[1] = s_msg_buf[off + 5]; + w1_t[2] = s_msg_buf[off + 6]; + w1_t[3] = s_msg_buf[off + 7]; + w2_t[0] = s_msg_buf[off + 8]; + w2_t[1] = s_msg_buf[off + 9]; + w2_t[2] = s_msg_buf[off + 10]; + w2_t[3] = s_msg_buf[off + 11]; + w3_t[0] = s_msg_buf[off + 12]; + w3_t[1] = s_msg_buf[off + 13]; + w3_t[2] = (64 + msg_len) * 8; + w3_t[3] = 0; + + hmac_md5_run (w0_t, w1_t, w2_t, w3_t, ipad, opad, digest); + + const u32x r0 = digest[0]; + const u32x r1 = digest[3]; + const u32x r2 = digest[2]; + const u32x r3 = digest[1]; + + #include VECT_COMPARE_M + } +} + +__device__ static void m05300s (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], const u32 pw_len, const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const ikepsk_t *ikepsk_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, u32 s_msg_buf[128]) +{ + /** + * modifier + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + const u32 lid = threadIdx.x; + + /** + * salt + */ + + const u32 nr_len = ikepsk_bufs[salt_pos].nr_len; + const u32 msg_len = ikepsk_bufs[salt_pos].msg_len; + + u32 salt_buf0[4]; + + salt_buf0[0] = ikepsk_bufs[salt_pos].nr_buf[ 0]; + salt_buf0[1] = ikepsk_bufs[salt_pos].nr_buf[ 1]; + salt_buf0[2] = ikepsk_bufs[salt_pos].nr_buf[ 2]; + salt_buf0[3] = ikepsk_bufs[salt_pos].nr_buf[ 3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = ikepsk_bufs[salt_pos].nr_buf[ 4]; + salt_buf1[1] = ikepsk_bufs[salt_pos].nr_buf[ 5]; + salt_buf1[2] = ikepsk_bufs[salt_pos].nr_buf[ 6]; + salt_buf1[3] = ikepsk_bufs[salt_pos].nr_buf[ 7]; + + u32 salt_buf2[4]; + + salt_buf2[0] = ikepsk_bufs[salt_pos].nr_buf[ 8]; + salt_buf2[1] = ikepsk_bufs[salt_pos].nr_buf[ 9]; + salt_buf2[2] = ikepsk_bufs[salt_pos].nr_buf[10]; + salt_buf2[3] = ikepsk_bufs[salt_pos].nr_buf[11]; + + u32 salt_buf3[4]; + + salt_buf3[0] = ikepsk_bufs[salt_pos].nr_buf[12]; + salt_buf3[1] = ikepsk_bufs[salt_pos].nr_buf[13]; + salt_buf3[2] = 0; + salt_buf3[3] = 0; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * loop + */ + + u32x w0l = w0[0]; + + for (u32 il_pos = 0; il_pos < bfs_cnt; il_pos++) + { + const u32 w0r = c_bfs[il_pos].i; + + w0[0] = w0l | w0r; + + /** + * pads + */ + + u32x w0_t[4]; + + w0_t[0] = w0[0]; + w0_t[1] = w0[1]; + w0_t[2] = w0[2]; + w0_t[3] = w0[3]; + + u32x w1_t[4]; + + w1_t[0] = w1[0]; + w1_t[1] = w1[1]; + w1_t[2] = w1[2]; + w1_t[3] = w1[3]; + + u32x w2_t[4]; + + w2_t[0] = w2[0]; + w2_t[1] = w2[1]; + w2_t[2] = w2[2]; + w2_t[3] = w2[3]; + + u32x w3_t[4]; + + w3_t[0] = w3[0]; + w3_t[1] = w3[1]; + w3_t[2] = w3[2]; + w3_t[3] = w3[3]; + + u32x ipad[4]; + u32x opad[4]; + + hmac_md5_pad (w0_t, w1_t, w2_t, w3_t, ipad, opad); + + w0_t[0] = salt_buf0[0]; + w0_t[1] = salt_buf0[1]; + w0_t[2] = salt_buf0[2]; + w0_t[3] = salt_buf0[3]; + w1_t[0] = salt_buf1[0]; + w1_t[1] = salt_buf1[1]; + w1_t[2] = salt_buf1[2]; + w1_t[3] = salt_buf1[3]; + w2_t[0] = salt_buf2[0]; + w2_t[1] = salt_buf2[1]; + w2_t[2] = salt_buf2[2]; + w2_t[3] = salt_buf2[3]; + w3_t[0] = salt_buf3[0]; + w3_t[1] = salt_buf3[1]; + w3_t[2] = (64 + nr_len) * 8; + w3_t[3] = 0; + + u32x digest[4]; + + hmac_md5_run (w0_t, w1_t, w2_t, w3_t, ipad, opad, digest); + + w0_t[0] = digest[0]; + w0_t[1] = digest[1]; + w0_t[2] = digest[2]; + w0_t[3] = digest[3]; + w1_t[0] = 0; + w1_t[1] = 0; + w1_t[2] = 0; + w1_t[3] = 0; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = 0; + + hmac_md5_pad (w0_t, w1_t, w2_t, w3_t, ipad, opad); + + int left; + int off; + + for (left = ikepsk_bufs[salt_pos].msg_len, off = 0; left >= 56; left -= 64, off += 16) + { + w0_t[0] = s_msg_buf[off + 0]; + w0_t[1] = s_msg_buf[off + 1]; + w0_t[2] = s_msg_buf[off + 2]; + w0_t[3] = s_msg_buf[off + 3]; + w1_t[0] = s_msg_buf[off + 4]; + w1_t[1] = s_msg_buf[off + 5]; + w1_t[2] = s_msg_buf[off + 6]; + w1_t[3] = s_msg_buf[off + 7]; + w2_t[0] = s_msg_buf[off + 8]; + w2_t[1] = s_msg_buf[off + 9]; + w2_t[2] = s_msg_buf[off + 10]; + w2_t[3] = s_msg_buf[off + 11]; + w3_t[0] = s_msg_buf[off + 12]; + w3_t[1] = s_msg_buf[off + 13]; + w3_t[2] = s_msg_buf[off + 14]; + w3_t[3] = s_msg_buf[off + 15]; + + md5_transform (w0_t, w1_t, w2_t, w3_t, ipad); + } + + w0_t[0] = s_msg_buf[off + 0]; + w0_t[1] = s_msg_buf[off + 1]; + w0_t[2] = s_msg_buf[off + 2]; + w0_t[3] = s_msg_buf[off + 3]; + w1_t[0] = s_msg_buf[off + 4]; + w1_t[1] = s_msg_buf[off + 5]; + w1_t[2] = s_msg_buf[off + 6]; + w1_t[3] = s_msg_buf[off + 7]; + w2_t[0] = s_msg_buf[off + 8]; + w2_t[1] = s_msg_buf[off + 9]; + w2_t[2] = s_msg_buf[off + 10]; + w2_t[3] = s_msg_buf[off + 11]; + w3_t[0] = s_msg_buf[off + 12]; + w3_t[1] = s_msg_buf[off + 13]; + w3_t[2] = (64 + msg_len) * 8; + w3_t[3] = 0; + + hmac_md5_run (w0_t, w1_t, w2_t, w3_t, ipad, opad, digest); + + const u32x r0 = digest[0]; + const u32x r1 = digest[3]; + const u32x r2 = digest[2]; + const u32x r3 = digest[1]; + + #include VECT_COMPARE_S + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m05300_m04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const ikepsk_t *ikepsk_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + const u32 lid = threadIdx.x; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * s_msg + */ + + __shared__ u32 s_msg_buf[128]; + + if (lid < 128) + { + s_msg_buf[lid] = ikepsk_bufs[salt_pos].msg_buf[lid]; + } + + __syncthreads (); + + if (gid >= gid_max) return; + + /** + * main + */ + + m05300m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, ikepsk_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset, s_msg_buf); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m05300_m08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const ikepsk_t *ikepsk_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + const u32 lid = threadIdx.x; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * s_msg + */ + + __shared__ u32 s_msg_buf[128]; + + if (lid < 128) + { + s_msg_buf[lid] = ikepsk_bufs[salt_pos].msg_buf[lid]; + } + + __syncthreads (); + + if (gid >= gid_max) return; + + /** + * main + */ + + m05300m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, ikepsk_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset, s_msg_buf); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m05300_m16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const ikepsk_t *ikepsk_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + const u32 lid = threadIdx.x; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = pws[gid].i[ 8]; + w2[1] = pws[gid].i[ 9]; + w2[2] = pws[gid].i[10]; + w2[3] = pws[gid].i[11]; + + u32x w3[4]; + + w3[0] = pws[gid].i[12]; + w3[1] = pws[gid].i[13]; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * s_msg + */ + + __shared__ u32 s_msg_buf[128]; + + if (lid < 128) + { + s_msg_buf[lid] = ikepsk_bufs[salt_pos].msg_buf[lid]; + } + + __syncthreads (); + + if (gid >= gid_max) return; + + /** + * main + */ + + m05300m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, ikepsk_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset, s_msg_buf); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m05300_s04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const ikepsk_t *ikepsk_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + const u32 lid = threadIdx.x; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * s_msg + */ + + __shared__ u32 s_msg_buf[128]; + + if (lid < 128) + { + s_msg_buf[lid] = ikepsk_bufs[salt_pos].msg_buf[lid]; + } + + __syncthreads (); + + if (gid >= gid_max) return; + + /** + * main + */ + + m05300s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, ikepsk_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset, s_msg_buf); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m05300_s08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const ikepsk_t *ikepsk_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + const u32 lid = threadIdx.x; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * s_msg + */ + + __shared__ u32 s_msg_buf[128]; + + if (lid < 128) + { + s_msg_buf[lid] = ikepsk_bufs[salt_pos].msg_buf[lid]; + } + + __syncthreads (); + + if (gid >= gid_max) return; + + /** + * main + */ + + m05300s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, ikepsk_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset, s_msg_buf); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m05300_s16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const ikepsk_t *ikepsk_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + const u32 lid = threadIdx.x; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = pws[gid].i[ 8]; + w2[1] = pws[gid].i[ 9]; + w2[2] = pws[gid].i[10]; + w2[3] = pws[gid].i[11]; + + u32x w3[4]; + + w3[0] = pws[gid].i[12]; + w3[1] = pws[gid].i[13]; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * s_msg + */ + + __shared__ u32 s_msg_buf[128]; + + if (lid < 128) + { + s_msg_buf[lid] = ikepsk_bufs[salt_pos].msg_buf[lid]; + } + + __syncthreads (); + + if (gid >= gid_max) return; + + /** + * main + */ + + m05300s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, ikepsk_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset, s_msg_buf); +} diff --git a/nv/m05400_a0.cu b/nv/m05400_a0.cu new file mode 100644 index 0000000000..40528fc3f6 --- /dev/null +++ b/nv/m05400_a0.cu @@ -0,0 +1,782 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _SHA1_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW2 +#define VECT_SIZE1 +#endif + +#define DGST_R0 3 +#define DGST_R1 4 +#define DGST_R2 2 +#define DGST_R3 1 + +#include "include/kernel_functions.c" +#include "types_nv.c" +#include "common_nv.c" +#include "include/rp_gpu.h" +#include "rp_nv.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +__device__ static void sha1_transform (const u32x w0[4], const u32x w1[4], const u32x w2[4], const u32x w3[4], u32x digest[5]) +{ + u32x A = digest[0]; + u32x B = digest[1]; + u32x C = digest[2]; + u32x D = digest[3]; + u32x E = digest[4]; + + u32x w0_t = w0[0]; + u32x w1_t = w0[1]; + u32x w2_t = w0[2]; + u32x w3_t = w0[3]; + u32x w4_t = w1[0]; + u32x w5_t = w1[1]; + u32x w6_t = w1[2]; + u32x w7_t = w1[3]; + u32x w8_t = w2[0]; + u32x w9_t = w2[1]; + u32x wa_t = w2[2]; + u32x wb_t = w2[3]; + u32x wc_t = w3[0]; + u32x wd_t = w3[1]; + u32x we_t = w3[2]; + u32x wf_t = w3[3]; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, A, B, C, D, E, w0_t); + SHA1_STEP (SHA1_F0o, E, A, B, C, D, w1_t); + SHA1_STEP (SHA1_F0o, D, E, A, B, C, w2_t); + SHA1_STEP (SHA1_F0o, C, D, E, A, B, w3_t); + SHA1_STEP (SHA1_F0o, B, C, D, E, A, w4_t); + SHA1_STEP (SHA1_F0o, A, B, C, D, E, w5_t); + SHA1_STEP (SHA1_F0o, E, A, B, C, D, w6_t); + SHA1_STEP (SHA1_F0o, D, E, A, B, C, w7_t); + SHA1_STEP (SHA1_F0o, C, D, E, A, B, w8_t); + SHA1_STEP (SHA1_F0o, B, C, D, E, A, w9_t); + SHA1_STEP (SHA1_F0o, A, B, C, D, E, wa_t); + SHA1_STEP (SHA1_F0o, E, A, B, C, D, wb_t); + SHA1_STEP (SHA1_F0o, D, E, A, B, C, wc_t); + SHA1_STEP (SHA1_F0o, C, D, E, A, B, wd_t); + SHA1_STEP (SHA1_F0o, B, C, D, E, A, we_t); + SHA1_STEP (SHA1_F0o, A, B, C, D, E, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F0o, E, A, B, C, D, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F0o, D, E, A, B, C, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F0o, C, D, E, A, B, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F0o, B, C, D, E, A, w3_t); + + #undef K + #define K SHA1C01 + + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w7_t); + + #undef K + #define K SHA1C02 + + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, wb_t); + + #undef K + #define K SHA1C03 + + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, wf_t); + + digest[0] += A; + digest[1] += B; + digest[2] += C; + digest[3] += D; + digest[4] += E; +} + +__device__ static void hmac_sha1_pad (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], u32x ipad[5], u32x opad[5]) +{ + w0[0] = w0[0] ^ 0x36363636; + w0[1] = w0[1] ^ 0x36363636; + w0[2] = w0[2] ^ 0x36363636; + w0[3] = w0[3] ^ 0x36363636; + w1[0] = w1[0] ^ 0x36363636; + w1[1] = w1[1] ^ 0x36363636; + w1[2] = w1[2] ^ 0x36363636; + w1[3] = w1[3] ^ 0x36363636; + w2[0] = w2[0] ^ 0x36363636; + w2[1] = w2[1] ^ 0x36363636; + w2[2] = w2[2] ^ 0x36363636; + w2[3] = w2[3] ^ 0x36363636; + w3[0] = w3[0] ^ 0x36363636; + w3[1] = w3[1] ^ 0x36363636; + w3[2] = w3[2] ^ 0x36363636; + w3[3] = w3[3] ^ 0x36363636; + + ipad[0] = SHA1M_A; + ipad[1] = SHA1M_B; + ipad[2] = SHA1M_C; + ipad[3] = SHA1M_D; + ipad[4] = SHA1M_E; + + sha1_transform (w0, w1, w2, w3, ipad); + + w0[0] = w0[0] ^ 0x6a6a6a6a; + w0[1] = w0[1] ^ 0x6a6a6a6a; + w0[2] = w0[2] ^ 0x6a6a6a6a; + w0[3] = w0[3] ^ 0x6a6a6a6a; + w1[0] = w1[0] ^ 0x6a6a6a6a; + w1[1] = w1[1] ^ 0x6a6a6a6a; + w1[2] = w1[2] ^ 0x6a6a6a6a; + w1[3] = w1[3] ^ 0x6a6a6a6a; + w2[0] = w2[0] ^ 0x6a6a6a6a; + w2[1] = w2[1] ^ 0x6a6a6a6a; + w2[2] = w2[2] ^ 0x6a6a6a6a; + w2[3] = w2[3] ^ 0x6a6a6a6a; + w3[0] = w3[0] ^ 0x6a6a6a6a; + w3[1] = w3[1] ^ 0x6a6a6a6a; + w3[2] = w3[2] ^ 0x6a6a6a6a; + w3[3] = w3[3] ^ 0x6a6a6a6a; + + opad[0] = SHA1M_A; + opad[1] = SHA1M_B; + opad[2] = SHA1M_C; + opad[3] = SHA1M_D; + opad[4] = SHA1M_E; + + sha1_transform (w0, w1, w2, w3, opad); +} + +__device__ static void hmac_sha1_run (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], u32x ipad[5], u32x opad[5], u32x digest[5]) +{ + digest[0] = ipad[0]; + digest[1] = ipad[1]; + digest[2] = ipad[2]; + digest[3] = ipad[3]; + digest[4] = ipad[4]; + + sha1_transform (w0, w1, w2, w3, digest); + + w0[0] = digest[0]; + w0[1] = digest[1]; + w0[2] = digest[2]; + w0[3] = digest[3]; + w1[0] = digest[4]; + w1[1] = 0x80000000; + w1[2] = 0; + w1[3] = 0; + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = (64 + 20) * 8; + + digest[0] = opad[0]; + digest[1] = opad[1]; + digest[2] = opad[2]; + digest[3] = opad[3]; + digest[4] = opad[4]; + + sha1_transform (w0, w1, w2, w3, digest); +} + +__device__ __constant__ gpu_rule_t c_rules[1024]; + +extern "C" __global__ void __launch_bounds__ (256, 1) m05400_m04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const ikepsk_t *ikepsk_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + u32x pw_buf1[4]; + + pw_buf1[0] = pws[gid].i[ 4]; + pw_buf1[1] = pws[gid].i[ 5]; + pw_buf1[2] = pws[gid].i[ 6]; + pw_buf1[3] = pws[gid].i[ 7]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * salt + */ + + const u32 nr_len = ikepsk_bufs[salt_pos].nr_len; + const u32 msg_len = ikepsk_bufs[salt_pos].msg_len; + + u32 salt_buf0[4]; + + salt_buf0[0] = swap_workaround (ikepsk_bufs[salt_pos].nr_buf[ 0]); + salt_buf0[1] = swap_workaround (ikepsk_bufs[salt_pos].nr_buf[ 1]); + salt_buf0[2] = swap_workaround (ikepsk_bufs[salt_pos].nr_buf[ 2]); + salt_buf0[3] = swap_workaround (ikepsk_bufs[salt_pos].nr_buf[ 3]); + + u32 salt_buf1[4]; + + salt_buf1[0] = swap_workaround (ikepsk_bufs[salt_pos].nr_buf[ 4]); + salt_buf1[1] = swap_workaround (ikepsk_bufs[salt_pos].nr_buf[ 5]); + salt_buf1[2] = swap_workaround (ikepsk_bufs[salt_pos].nr_buf[ 6]); + salt_buf1[3] = swap_workaround (ikepsk_bufs[salt_pos].nr_buf[ 7]); + + u32 salt_buf2[4]; + + salt_buf2[0] = swap_workaround (ikepsk_bufs[salt_pos].nr_buf[ 8]); + salt_buf2[1] = swap_workaround (ikepsk_bufs[salt_pos].nr_buf[ 9]); + salt_buf2[2] = swap_workaround (ikepsk_bufs[salt_pos].nr_buf[10]); + salt_buf2[3] = swap_workaround (ikepsk_bufs[salt_pos].nr_buf[11]); + + u32 salt_buf3[4]; + + salt_buf3[0] = swap_workaround (ikepsk_bufs[salt_pos].nr_buf[12]); + salt_buf3[1] = swap_workaround (ikepsk_bufs[salt_pos].nr_buf[13]); + salt_buf3[2] = 0; + salt_buf3[3] = 0; + + /** + * s_msg + */ + + __shared__ u32 s_msg_buf[128]; + + if (lid < 128) + { + s_msg_buf[lid] = swap_workaround (ikepsk_bufs[salt_pos].msg_buf[lid]); + } + + __syncthreads (); + + if (gid >= gid_max) return; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + + w0[0] = pw_buf0[0]; + w0[1] = pw_buf0[1]; + w0[2] = pw_buf0[2]; + w0[3] = pw_buf0[3]; + + u32x w1[4]; + + w1[0] = pw_buf1[0]; + w1[1] = pw_buf1[1]; + w1[2] = pw_buf1[2]; + w1[3] = pw_buf1[3]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 out_len = apply_rules (c_rules[il_pos].cmds, w0, w1, pw_len); + + /** + * pads + */ + + u32x w0_t[4]; + + w0_t[0] = swap_workaround (w0[0]); + w0_t[1] = swap_workaround (w0[1]); + w0_t[2] = swap_workaround (w0[2]); + w0_t[3] = swap_workaround (w0[3]); + + u32x w1_t[4]; + + w1_t[0] = swap_workaround (w1[0]); + w1_t[1] = swap_workaround (w1[1]); + w1_t[2] = swap_workaround (w1[2]); + w1_t[3] = swap_workaround (w1[3]); + + u32x w2_t[4]; + + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + + u32x w3_t[4]; + + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = 0; + + u32x ipad[5]; + u32x opad[5]; + + hmac_sha1_pad (w0_t, w1_t, w2_t, w3_t, ipad, opad); + + w0_t[0] = salt_buf0[0]; + w0_t[1] = salt_buf0[1]; + w0_t[2] = salt_buf0[2]; + w0_t[3] = salt_buf0[3]; + w1_t[0] = salt_buf1[0]; + w1_t[1] = salt_buf1[1]; + w1_t[2] = salt_buf1[2]; + w1_t[3] = salt_buf1[3]; + w2_t[0] = salt_buf2[0]; + w2_t[1] = salt_buf2[1]; + w2_t[2] = salt_buf2[2]; + w2_t[3] = salt_buf2[3]; + w3_t[0] = salt_buf3[0]; + w3_t[1] = salt_buf3[1]; + w3_t[2] = 0; + w3_t[3] = (64 + nr_len) * 8; + + u32x digest[5]; + + hmac_sha1_run (w0_t, w1_t, w2_t, w3_t, ipad, opad, digest); + + w0_t[0] = digest[0]; + w0_t[1] = digest[1]; + w0_t[2] = digest[2]; + w0_t[3] = digest[3]; + w1_t[0] = digest[4]; + w1_t[1] = 0; + w1_t[2] = 0; + w1_t[3] = 0; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = 0; + + hmac_sha1_pad (w0_t, w1_t, w2_t, w3_t, ipad, opad); + + int left; + int off; + + for (left = ikepsk_bufs[salt_pos].msg_len, off = 0; left >= 56; left -= 64, off += 16) + { + w0_t[0] = s_msg_buf[off + 0]; + w0_t[1] = s_msg_buf[off + 1]; + w0_t[2] = s_msg_buf[off + 2]; + w0_t[3] = s_msg_buf[off + 3]; + w1_t[0] = s_msg_buf[off + 4]; + w1_t[1] = s_msg_buf[off + 5]; + w1_t[2] = s_msg_buf[off + 6]; + w1_t[3] = s_msg_buf[off + 7]; + w2_t[0] = s_msg_buf[off + 8]; + w2_t[1] = s_msg_buf[off + 9]; + w2_t[2] = s_msg_buf[off + 10]; + w2_t[3] = s_msg_buf[off + 11]; + w3_t[0] = s_msg_buf[off + 12]; + w3_t[1] = s_msg_buf[off + 13]; + w3_t[2] = s_msg_buf[off + 14]; + w3_t[3] = s_msg_buf[off + 15]; + + sha1_transform (w0_t, w1_t, w2_t, w3_t, ipad); + } + + w0_t[0] = s_msg_buf[off + 0]; + w0_t[1] = s_msg_buf[off + 1]; + w0_t[2] = s_msg_buf[off + 2]; + w0_t[3] = s_msg_buf[off + 3]; + w1_t[0] = s_msg_buf[off + 4]; + w1_t[1] = s_msg_buf[off + 5]; + w1_t[2] = s_msg_buf[off + 6]; + w1_t[3] = s_msg_buf[off + 7]; + w2_t[0] = s_msg_buf[off + 8]; + w2_t[1] = s_msg_buf[off + 9]; + w2_t[2] = s_msg_buf[off + 10]; + w2_t[3] = s_msg_buf[off + 11]; + w3_t[0] = s_msg_buf[off + 12]; + w3_t[1] = s_msg_buf[off + 13]; + w3_t[2] = 0; + w3_t[3] = (64 + msg_len) * 8; + + hmac_sha1_run (w0_t, w1_t, w2_t, w3_t, ipad, opad, digest); + + const u32x r0 = digest[3]; + const u32x r1 = digest[4]; + const u32x r2 = digest[2]; + const u32x r3 = digest[1]; + + #include VECT_COMPARE_M + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m05400_m08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const ikepsk_t *ikepsk_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m05400_m16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const ikepsk_t *ikepsk_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m05400_s04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const ikepsk_t *ikepsk_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + u32x pw_buf1[4]; + + pw_buf1[0] = pws[gid].i[ 4]; + pw_buf1[1] = pws[gid].i[ 5]; + pw_buf1[2] = pws[gid].i[ 6]; + pw_buf1[3] = pws[gid].i[ 7]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * salt + */ + + const u32 nr_len = ikepsk_bufs[salt_pos].nr_len; + const u32 msg_len = ikepsk_bufs[salt_pos].msg_len; + + u32 salt_buf0[4]; + + salt_buf0[0] = swap_workaround (ikepsk_bufs[salt_pos].nr_buf[ 0]); + salt_buf0[1] = swap_workaround (ikepsk_bufs[salt_pos].nr_buf[ 1]); + salt_buf0[2] = swap_workaround (ikepsk_bufs[salt_pos].nr_buf[ 2]); + salt_buf0[3] = swap_workaround (ikepsk_bufs[salt_pos].nr_buf[ 3]); + + u32 salt_buf1[4]; + + salt_buf1[0] = swap_workaround (ikepsk_bufs[salt_pos].nr_buf[ 4]); + salt_buf1[1] = swap_workaround (ikepsk_bufs[salt_pos].nr_buf[ 5]); + salt_buf1[2] = swap_workaround (ikepsk_bufs[salt_pos].nr_buf[ 6]); + salt_buf1[3] = swap_workaround (ikepsk_bufs[salt_pos].nr_buf[ 7]); + + u32 salt_buf2[4]; + + salt_buf2[0] = swap_workaround (ikepsk_bufs[salt_pos].nr_buf[ 8]); + salt_buf2[1] = swap_workaround (ikepsk_bufs[salt_pos].nr_buf[ 9]); + salt_buf2[2] = swap_workaround (ikepsk_bufs[salt_pos].nr_buf[10]); + salt_buf2[3] = swap_workaround (ikepsk_bufs[salt_pos].nr_buf[11]); + + u32 salt_buf3[4]; + + salt_buf3[0] = swap_workaround (ikepsk_bufs[salt_pos].nr_buf[12]); + salt_buf3[1] = swap_workaround (ikepsk_bufs[salt_pos].nr_buf[13]); + salt_buf3[2] = 0; + salt_buf3[3] = 0; + + /** + * s_msg + */ + + __shared__ u32 s_msg_buf[128]; + + if (lid < 128) + { + s_msg_buf[lid] = swap_workaround (ikepsk_bufs[salt_pos].msg_buf[lid]); + } + + __syncthreads (); + + if (gid >= gid_max) return; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + + w0[0] = pw_buf0[0]; + w0[1] = pw_buf0[1]; + w0[2] = pw_buf0[2]; + w0[3] = pw_buf0[3]; + + u32x w1[4]; + + w1[0] = pw_buf1[0]; + w1[1] = pw_buf1[1]; + w1[2] = pw_buf1[2]; + w1[3] = pw_buf1[3]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 out_len = apply_rules (c_rules[il_pos].cmds, w0, w1, pw_len); + + /** + * pads + */ + + u32x w0_t[4]; + + w0_t[0] = swap_workaround (w0[0]); + w0_t[1] = swap_workaround (w0[1]); + w0_t[2] = swap_workaround (w0[2]); + w0_t[3] = swap_workaround (w0[3]); + + u32x w1_t[4]; + + w1_t[0] = swap_workaround (w1[0]); + w1_t[1] = swap_workaround (w1[1]); + w1_t[2] = swap_workaround (w1[2]); + w1_t[3] = swap_workaround (w1[3]); + + u32x w2_t[4]; + + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + + u32x w3_t[4]; + + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = 0; + + u32x ipad[5]; + u32x opad[5]; + + hmac_sha1_pad (w0_t, w1_t, w2_t, w3_t, ipad, opad); + + w0_t[0] = salt_buf0[0]; + w0_t[1] = salt_buf0[1]; + w0_t[2] = salt_buf0[2]; + w0_t[3] = salt_buf0[3]; + w1_t[0] = salt_buf1[0]; + w1_t[1] = salt_buf1[1]; + w1_t[2] = salt_buf1[2]; + w1_t[3] = salt_buf1[3]; + w2_t[0] = salt_buf2[0]; + w2_t[1] = salt_buf2[1]; + w2_t[2] = salt_buf2[2]; + w2_t[3] = salt_buf2[3]; + w3_t[0] = salt_buf3[0]; + w3_t[1] = salt_buf3[1]; + w3_t[2] = 0; + w3_t[3] = (64 + nr_len) * 8; + + u32x digest[5]; + + hmac_sha1_run (w0_t, w1_t, w2_t, w3_t, ipad, opad, digest); + + w0_t[0] = digest[0]; + w0_t[1] = digest[1]; + w0_t[2] = digest[2]; + w0_t[3] = digest[3]; + w1_t[0] = digest[4]; + w1_t[1] = 0; + w1_t[2] = 0; + w1_t[3] = 0; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = 0; + + hmac_sha1_pad (w0_t, w1_t, w2_t, w3_t, ipad, opad); + + int left; + int off; + + for (left = ikepsk_bufs[salt_pos].msg_len, off = 0; left >= 56; left -= 64, off += 16) + { + w0_t[0] = s_msg_buf[off + 0]; + w0_t[1] = s_msg_buf[off + 1]; + w0_t[2] = s_msg_buf[off + 2]; + w0_t[3] = s_msg_buf[off + 3]; + w1_t[0] = s_msg_buf[off + 4]; + w1_t[1] = s_msg_buf[off + 5]; + w1_t[2] = s_msg_buf[off + 6]; + w1_t[3] = s_msg_buf[off + 7]; + w2_t[0] = s_msg_buf[off + 8]; + w2_t[1] = s_msg_buf[off + 9]; + w2_t[2] = s_msg_buf[off + 10]; + w2_t[3] = s_msg_buf[off + 11]; + w3_t[0] = s_msg_buf[off + 12]; + w3_t[1] = s_msg_buf[off + 13]; + w3_t[2] = s_msg_buf[off + 14]; + w3_t[3] = s_msg_buf[off + 15]; + + sha1_transform (w0_t, w1_t, w2_t, w3_t, ipad); + } + + w0_t[0] = s_msg_buf[off + 0]; + w0_t[1] = s_msg_buf[off + 1]; + w0_t[2] = s_msg_buf[off + 2]; + w0_t[3] = s_msg_buf[off + 3]; + w1_t[0] = s_msg_buf[off + 4]; + w1_t[1] = s_msg_buf[off + 5]; + w1_t[2] = s_msg_buf[off + 6]; + w1_t[3] = s_msg_buf[off + 7]; + w2_t[0] = s_msg_buf[off + 8]; + w2_t[1] = s_msg_buf[off + 9]; + w2_t[2] = s_msg_buf[off + 10]; + w2_t[3] = s_msg_buf[off + 11]; + w3_t[0] = s_msg_buf[off + 12]; + w3_t[1] = s_msg_buf[off + 13]; + w3_t[2] = 0; + w3_t[3] = (64 + msg_len) * 8; + + hmac_sha1_run (w0_t, w1_t, w2_t, w3_t, ipad, opad, digest); + + const u32x r0 = digest[3]; + const u32x r1 = digest[4]; + const u32x r2 = digest[2]; + const u32x r3 = digest[1]; + + #include VECT_COMPARE_S + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m05400_s08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const ikepsk_t *ikepsk_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m05400_s16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const ikepsk_t *ikepsk_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/nv/m05400_a1.cu b/nv/m05400_a1.cu new file mode 100644 index 0000000000..81a70c79f6 --- /dev/null +++ b/nv/m05400_a1.cu @@ -0,0 +1,888 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _SHA1_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW2 +#define VECT_SIZE1 +#endif + +#define DGST_R0 3 +#define DGST_R1 4 +#define DGST_R2 2 +#define DGST_R3 1 + +#include "include/kernel_functions.c" +#include "types_nv.c" +#include "common_nv.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +__device__ static void sha1_transform (const u32x w0[4], const u32x w1[4], const u32x w2[4], const u32x w3[4], u32x digest[5]) +{ + u32x A = digest[0]; + u32x B = digest[1]; + u32x C = digest[2]; + u32x D = digest[3]; + u32x E = digest[4]; + + u32x w0_t = w0[0]; + u32x w1_t = w0[1]; + u32x w2_t = w0[2]; + u32x w3_t = w0[3]; + u32x w4_t = w1[0]; + u32x w5_t = w1[1]; + u32x w6_t = w1[2]; + u32x w7_t = w1[3]; + u32x w8_t = w2[0]; + u32x w9_t = w2[1]; + u32x wa_t = w2[2]; + u32x wb_t = w2[3]; + u32x wc_t = w3[0]; + u32x wd_t = w3[1]; + u32x we_t = w3[2]; + u32x wf_t = w3[3]; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, A, B, C, D, E, w0_t); + SHA1_STEP (SHA1_F0o, E, A, B, C, D, w1_t); + SHA1_STEP (SHA1_F0o, D, E, A, B, C, w2_t); + SHA1_STEP (SHA1_F0o, C, D, E, A, B, w3_t); + SHA1_STEP (SHA1_F0o, B, C, D, E, A, w4_t); + SHA1_STEP (SHA1_F0o, A, B, C, D, E, w5_t); + SHA1_STEP (SHA1_F0o, E, A, B, C, D, w6_t); + SHA1_STEP (SHA1_F0o, D, E, A, B, C, w7_t); + SHA1_STEP (SHA1_F0o, C, D, E, A, B, w8_t); + SHA1_STEP (SHA1_F0o, B, C, D, E, A, w9_t); + SHA1_STEP (SHA1_F0o, A, B, C, D, E, wa_t); + SHA1_STEP (SHA1_F0o, E, A, B, C, D, wb_t); + SHA1_STEP (SHA1_F0o, D, E, A, B, C, wc_t); + SHA1_STEP (SHA1_F0o, C, D, E, A, B, wd_t); + SHA1_STEP (SHA1_F0o, B, C, D, E, A, we_t); + SHA1_STEP (SHA1_F0o, A, B, C, D, E, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F0o, E, A, B, C, D, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F0o, D, E, A, B, C, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F0o, C, D, E, A, B, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F0o, B, C, D, E, A, w3_t); + + #undef K + #define K SHA1C01 + + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w7_t); + + #undef K + #define K SHA1C02 + + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, wb_t); + + #undef K + #define K SHA1C03 + + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, wf_t); + + digest[0] += A; + digest[1] += B; + digest[2] += C; + digest[3] += D; + digest[4] += E; +} + +__device__ static void hmac_sha1_pad (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], u32x ipad[5], u32x opad[5]) +{ + w0[0] = w0[0] ^ 0x36363636; + w0[1] = w0[1] ^ 0x36363636; + w0[2] = w0[2] ^ 0x36363636; + w0[3] = w0[3] ^ 0x36363636; + w1[0] = w1[0] ^ 0x36363636; + w1[1] = w1[1] ^ 0x36363636; + w1[2] = w1[2] ^ 0x36363636; + w1[3] = w1[3] ^ 0x36363636; + w2[0] = w2[0] ^ 0x36363636; + w2[1] = w2[1] ^ 0x36363636; + w2[2] = w2[2] ^ 0x36363636; + w2[3] = w2[3] ^ 0x36363636; + w3[0] = w3[0] ^ 0x36363636; + w3[1] = w3[1] ^ 0x36363636; + w3[2] = w3[2] ^ 0x36363636; + w3[3] = w3[3] ^ 0x36363636; + + ipad[0] = SHA1M_A; + ipad[1] = SHA1M_B; + ipad[2] = SHA1M_C; + ipad[3] = SHA1M_D; + ipad[4] = SHA1M_E; + + sha1_transform (w0, w1, w2, w3, ipad); + + w0[0] = w0[0] ^ 0x6a6a6a6a; + w0[1] = w0[1] ^ 0x6a6a6a6a; + w0[2] = w0[2] ^ 0x6a6a6a6a; + w0[3] = w0[3] ^ 0x6a6a6a6a; + w1[0] = w1[0] ^ 0x6a6a6a6a; + w1[1] = w1[1] ^ 0x6a6a6a6a; + w1[2] = w1[2] ^ 0x6a6a6a6a; + w1[3] = w1[3] ^ 0x6a6a6a6a; + w2[0] = w2[0] ^ 0x6a6a6a6a; + w2[1] = w2[1] ^ 0x6a6a6a6a; + w2[2] = w2[2] ^ 0x6a6a6a6a; + w2[3] = w2[3] ^ 0x6a6a6a6a; + w3[0] = w3[0] ^ 0x6a6a6a6a; + w3[1] = w3[1] ^ 0x6a6a6a6a; + w3[2] = w3[2] ^ 0x6a6a6a6a; + w3[3] = w3[3] ^ 0x6a6a6a6a; + + opad[0] = SHA1M_A; + opad[1] = SHA1M_B; + opad[2] = SHA1M_C; + opad[3] = SHA1M_D; + opad[4] = SHA1M_E; + + sha1_transform (w0, w1, w2, w3, opad); +} + +__device__ static void hmac_sha1_run (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], u32x ipad[5], u32x opad[5], u32x digest[5]) +{ + digest[0] = ipad[0]; + digest[1] = ipad[1]; + digest[2] = ipad[2]; + digest[3] = ipad[3]; + digest[4] = ipad[4]; + + sha1_transform (w0, w1, w2, w3, digest); + + w0[0] = digest[0]; + w0[1] = digest[1]; + w0[2] = digest[2]; + w0[3] = digest[3]; + w1[0] = digest[4]; + w1[1] = 0x80000000; + w1[2] = 0; + w1[3] = 0; + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = (64 + 20) * 8; + + digest[0] = opad[0]; + digest[1] = opad[1]; + digest[2] = opad[2]; + digest[3] = opad[3]; + digest[4] = opad[4]; + + sha1_transform (w0, w1, w2, w3, digest); +} + +__device__ __constant__ comb_t c_combs[1024]; + +extern "C" __global__ void __launch_bounds__ (256, 1) m05400_m04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const ikepsk_t *ikepsk_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, c_combs[0].pw_len); + } + + /** + * salt + */ + + const u32 nr_len = ikepsk_bufs[salt_pos].nr_len; + const u32 msg_len = ikepsk_bufs[salt_pos].msg_len; + + u32 salt_buf0[4]; + + salt_buf0[0] = swap_workaround (ikepsk_bufs[salt_pos].nr_buf[ 0]); + salt_buf0[1] = swap_workaround (ikepsk_bufs[salt_pos].nr_buf[ 1]); + salt_buf0[2] = swap_workaround (ikepsk_bufs[salt_pos].nr_buf[ 2]); + salt_buf0[3] = swap_workaround (ikepsk_bufs[salt_pos].nr_buf[ 3]); + + u32 salt_buf1[4]; + + salt_buf1[0] = swap_workaround (ikepsk_bufs[salt_pos].nr_buf[ 4]); + salt_buf1[1] = swap_workaround (ikepsk_bufs[salt_pos].nr_buf[ 5]); + salt_buf1[2] = swap_workaround (ikepsk_bufs[salt_pos].nr_buf[ 6]); + salt_buf1[3] = swap_workaround (ikepsk_bufs[salt_pos].nr_buf[ 7]); + + u32 salt_buf2[4]; + + salt_buf2[0] = swap_workaround (ikepsk_bufs[salt_pos].nr_buf[ 8]); + salt_buf2[1] = swap_workaround (ikepsk_bufs[salt_pos].nr_buf[ 9]); + salt_buf2[2] = swap_workaround (ikepsk_bufs[salt_pos].nr_buf[10]); + salt_buf2[3] = swap_workaround (ikepsk_bufs[salt_pos].nr_buf[11]); + + u32 salt_buf3[4]; + + salt_buf3[0] = swap_workaround (ikepsk_bufs[salt_pos].nr_buf[12]); + salt_buf3[1] = swap_workaround (ikepsk_bufs[salt_pos].nr_buf[13]); + salt_buf3[2] = 0; + salt_buf3[3] = 0; + + /** + * s_msg + */ + + __shared__ u32 s_msg_buf[128]; + + if (lid < 128) + { + s_msg_buf[lid] = swap_workaround (ikepsk_bufs[salt_pos].msg_buf[lid]); + } + + __syncthreads (); + + if (gid >= gid_max) return; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = c_combs[il_pos].pw_len; + + const u32 pw_len = pw_l_len + pw_r_len; + + u32 wordr0[4]; + + wordr0[0] = c_combs[il_pos].i[0]; + wordr0[1] = c_combs[il_pos].i[1]; + wordr0[2] = c_combs[il_pos].i[2]; + wordr0[3] = c_combs[il_pos].i[3]; + + u32 wordr1[4]; + + wordr1[0] = c_combs[il_pos].i[4]; + wordr1[1] = c_combs[il_pos].i[5]; + wordr1[2] = c_combs[il_pos].i[6]; + wordr1[3] = c_combs[il_pos].i[7]; + + u32 wordr2[4]; + + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + + u32 wordr3[4]; + + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + u32x w0[4]; + + w0[0] = wordl0[0] | wordr0[0]; + w0[1] = wordl0[1] | wordr0[1]; + w0[2] = wordl0[2] | wordr0[2]; + w0[3] = wordl0[3] | wordr0[3]; + + u32x w1[4]; + + w1[0] = wordl1[0] | wordr1[0]; + w1[1] = wordl1[1] | wordr1[1]; + w1[2] = wordl1[2] | wordr1[2]; + w1[3] = wordl1[3] | wordr1[3]; + + u32x w2[4]; + + w2[0] = wordl2[0] | wordr2[0]; + w2[1] = wordl2[1] | wordr2[1]; + w2[2] = wordl2[2] | wordr2[2]; + w2[3] = wordl2[3] | wordr2[3]; + + u32x w3[4]; + + w3[0] = wordl3[0] | wordr3[0]; + w3[1] = wordl3[1] | wordr3[1]; + w3[2] = wordl3[2] | wordr3[2]; + w3[3] = wordl3[3] | wordr3[3]; + + /** + * pads + */ + + u32x w0_t[4]; + + w0_t[0] = swap_workaround (w0[0]); + w0_t[1] = swap_workaround (w0[1]); + w0_t[2] = swap_workaround (w0[2]); + w0_t[3] = swap_workaround (w0[3]); + + u32x w1_t[4]; + + w1_t[0] = swap_workaround (w1[0]); + w1_t[1] = swap_workaround (w1[1]); + w1_t[2] = swap_workaround (w1[2]); + w1_t[3] = swap_workaround (w1[3]); + + u32x w2_t[4]; + + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + + u32x w3_t[4]; + + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = 0; + + u32x ipad[5]; + u32x opad[5]; + + hmac_sha1_pad (w0_t, w1_t, w2_t, w3_t, ipad, opad); + + w0_t[0] = salt_buf0[0]; + w0_t[1] = salt_buf0[1]; + w0_t[2] = salt_buf0[2]; + w0_t[3] = salt_buf0[3]; + w1_t[0] = salt_buf1[0]; + w1_t[1] = salt_buf1[1]; + w1_t[2] = salt_buf1[2]; + w1_t[3] = salt_buf1[3]; + w2_t[0] = salt_buf2[0]; + w2_t[1] = salt_buf2[1]; + w2_t[2] = salt_buf2[2]; + w2_t[3] = salt_buf2[3]; + w3_t[0] = salt_buf3[0]; + w3_t[1] = salt_buf3[1]; + w3_t[2] = 0; + w3_t[3] = (64 + nr_len) * 8; + + u32x digest[5]; + + hmac_sha1_run (w0_t, w1_t, w2_t, w3_t, ipad, opad, digest); + + w0_t[0] = digest[0]; + w0_t[1] = digest[1]; + w0_t[2] = digest[2]; + w0_t[3] = digest[3]; + w1_t[0] = digest[4]; + w1_t[1] = 0; + w1_t[2] = 0; + w1_t[3] = 0; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = 0; + + hmac_sha1_pad (w0_t, w1_t, w2_t, w3_t, ipad, opad); + + int left; + int off; + + for (left = ikepsk_bufs[salt_pos].msg_len, off = 0; left >= 56; left -= 64, off += 16) + { + w0_t[0] = s_msg_buf[off + 0]; + w0_t[1] = s_msg_buf[off + 1]; + w0_t[2] = s_msg_buf[off + 2]; + w0_t[3] = s_msg_buf[off + 3]; + w1_t[0] = s_msg_buf[off + 4]; + w1_t[1] = s_msg_buf[off + 5]; + w1_t[2] = s_msg_buf[off + 6]; + w1_t[3] = s_msg_buf[off + 7]; + w2_t[0] = s_msg_buf[off + 8]; + w2_t[1] = s_msg_buf[off + 9]; + w2_t[2] = s_msg_buf[off + 10]; + w2_t[3] = s_msg_buf[off + 11]; + w3_t[0] = s_msg_buf[off + 12]; + w3_t[1] = s_msg_buf[off + 13]; + w3_t[2] = s_msg_buf[off + 14]; + w3_t[3] = s_msg_buf[off + 15]; + + sha1_transform (w0_t, w1_t, w2_t, w3_t, ipad); + } + + w0_t[0] = s_msg_buf[off + 0]; + w0_t[1] = s_msg_buf[off + 1]; + w0_t[2] = s_msg_buf[off + 2]; + w0_t[3] = s_msg_buf[off + 3]; + w1_t[0] = s_msg_buf[off + 4]; + w1_t[1] = s_msg_buf[off + 5]; + w1_t[2] = s_msg_buf[off + 6]; + w1_t[3] = s_msg_buf[off + 7]; + w2_t[0] = s_msg_buf[off + 8]; + w2_t[1] = s_msg_buf[off + 9]; + w2_t[2] = s_msg_buf[off + 10]; + w2_t[3] = s_msg_buf[off + 11]; + w3_t[0] = s_msg_buf[off + 12]; + w3_t[1] = s_msg_buf[off + 13]; + w3_t[2] = 0; + w3_t[3] = (64 + msg_len) * 8; + + hmac_sha1_run (w0_t, w1_t, w2_t, w3_t, ipad, opad, digest); + + const u32x r0 = digest[3]; + const u32x r1 = digest[4]; + const u32x r2 = digest[2]; + const u32x r3 = digest[1]; + + #include VECT_COMPARE_M + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m05400_m08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const ikepsk_t *ikepsk_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m05400_m16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const ikepsk_t *ikepsk_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m05400_s04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const ikepsk_t *ikepsk_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, c_combs[0].pw_len); + } + + /** + * salt + */ + + const u32 nr_len = ikepsk_bufs[salt_pos].nr_len; + const u32 msg_len = ikepsk_bufs[salt_pos].msg_len; + + u32 salt_buf0[4]; + + salt_buf0[0] = swap_workaround (ikepsk_bufs[salt_pos].nr_buf[ 0]); + salt_buf0[1] = swap_workaround (ikepsk_bufs[salt_pos].nr_buf[ 1]); + salt_buf0[2] = swap_workaround (ikepsk_bufs[salt_pos].nr_buf[ 2]); + salt_buf0[3] = swap_workaround (ikepsk_bufs[salt_pos].nr_buf[ 3]); + + u32 salt_buf1[4]; + + salt_buf1[0] = swap_workaround (ikepsk_bufs[salt_pos].nr_buf[ 4]); + salt_buf1[1] = swap_workaround (ikepsk_bufs[salt_pos].nr_buf[ 5]); + salt_buf1[2] = swap_workaround (ikepsk_bufs[salt_pos].nr_buf[ 6]); + salt_buf1[3] = swap_workaround (ikepsk_bufs[salt_pos].nr_buf[ 7]); + + u32 salt_buf2[4]; + + salt_buf2[0] = swap_workaround (ikepsk_bufs[salt_pos].nr_buf[ 8]); + salt_buf2[1] = swap_workaround (ikepsk_bufs[salt_pos].nr_buf[ 9]); + salt_buf2[2] = swap_workaround (ikepsk_bufs[salt_pos].nr_buf[10]); + salt_buf2[3] = swap_workaround (ikepsk_bufs[salt_pos].nr_buf[11]); + + u32 salt_buf3[4]; + + salt_buf3[0] = swap_workaround (ikepsk_bufs[salt_pos].nr_buf[12]); + salt_buf3[1] = swap_workaround (ikepsk_bufs[salt_pos].nr_buf[13]); + salt_buf3[2] = 0; + salt_buf3[3] = 0; + + /** + * s_msg + */ + + __shared__ u32 s_msg_buf[128]; + + if (lid < 128) + { + s_msg_buf[lid] = swap_workaround (ikepsk_bufs[salt_pos].msg_buf[lid]); + } + + __syncthreads (); + + if (gid >= gid_max) return; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = c_combs[il_pos].pw_len; + + const u32 pw_len = pw_l_len + pw_r_len; + + u32 wordr0[4]; + + wordr0[0] = c_combs[il_pos].i[0]; + wordr0[1] = c_combs[il_pos].i[1]; + wordr0[2] = c_combs[il_pos].i[2]; + wordr0[3] = c_combs[il_pos].i[3]; + + u32 wordr1[4]; + + wordr1[0] = c_combs[il_pos].i[4]; + wordr1[1] = c_combs[il_pos].i[5]; + wordr1[2] = c_combs[il_pos].i[6]; + wordr1[3] = c_combs[il_pos].i[7]; + + u32 wordr2[4]; + + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + + u32 wordr3[4]; + + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + u32x w0[4]; + + w0[0] = wordl0[0] | wordr0[0]; + w0[1] = wordl0[1] | wordr0[1]; + w0[2] = wordl0[2] | wordr0[2]; + w0[3] = wordl0[3] | wordr0[3]; + + u32x w1[4]; + + w1[0] = wordl1[0] | wordr1[0]; + w1[1] = wordl1[1] | wordr1[1]; + w1[2] = wordl1[2] | wordr1[2]; + w1[3] = wordl1[3] | wordr1[3]; + + u32x w2[4]; + + w2[0] = wordl2[0] | wordr2[0]; + w2[1] = wordl2[1] | wordr2[1]; + w2[2] = wordl2[2] | wordr2[2]; + w2[3] = wordl2[3] | wordr2[3]; + + u32x w3[4]; + + w3[0] = wordl3[0] | wordr3[0]; + w3[1] = wordl3[1] | wordr3[1]; + w3[2] = wordl3[2] | wordr3[2]; + w3[3] = wordl3[3] | wordr3[3]; + + /** + * pads + */ + + u32x w0_t[4]; + + w0_t[0] = swap_workaround (w0[0]); + w0_t[1] = swap_workaround (w0[1]); + w0_t[2] = swap_workaround (w0[2]); + w0_t[3] = swap_workaround (w0[3]); + + u32x w1_t[4]; + + w1_t[0] = swap_workaround (w1[0]); + w1_t[1] = swap_workaround (w1[1]); + w1_t[2] = swap_workaround (w1[2]); + w1_t[3] = swap_workaround (w1[3]); + + u32x w2_t[4]; + + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + + u32x w3_t[4]; + + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = 0; + + u32x ipad[5]; + u32x opad[5]; + + hmac_sha1_pad (w0_t, w1_t, w2_t, w3_t, ipad, opad); + + w0_t[0] = salt_buf0[0]; + w0_t[1] = salt_buf0[1]; + w0_t[2] = salt_buf0[2]; + w0_t[3] = salt_buf0[3]; + w1_t[0] = salt_buf1[0]; + w1_t[1] = salt_buf1[1]; + w1_t[2] = salt_buf1[2]; + w1_t[3] = salt_buf1[3]; + w2_t[0] = salt_buf2[0]; + w2_t[1] = salt_buf2[1]; + w2_t[2] = salt_buf2[2]; + w2_t[3] = salt_buf2[3]; + w3_t[0] = salt_buf3[0]; + w3_t[1] = salt_buf3[1]; + w3_t[2] = 0; + w3_t[3] = (64 + nr_len) * 8; + + u32x digest[5]; + + hmac_sha1_run (w0_t, w1_t, w2_t, w3_t, ipad, opad, digest); + + w0_t[0] = digest[0]; + w0_t[1] = digest[1]; + w0_t[2] = digest[2]; + w0_t[3] = digest[3]; + w1_t[0] = digest[4]; + w1_t[1] = 0; + w1_t[2] = 0; + w1_t[3] = 0; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = 0; + + hmac_sha1_pad (w0_t, w1_t, w2_t, w3_t, ipad, opad); + + int left; + int off; + + for (left = ikepsk_bufs[salt_pos].msg_len, off = 0; left >= 56; left -= 64, off += 16) + { + w0_t[0] = s_msg_buf[off + 0]; + w0_t[1] = s_msg_buf[off + 1]; + w0_t[2] = s_msg_buf[off + 2]; + w0_t[3] = s_msg_buf[off + 3]; + w1_t[0] = s_msg_buf[off + 4]; + w1_t[1] = s_msg_buf[off + 5]; + w1_t[2] = s_msg_buf[off + 6]; + w1_t[3] = s_msg_buf[off + 7]; + w2_t[0] = s_msg_buf[off + 8]; + w2_t[1] = s_msg_buf[off + 9]; + w2_t[2] = s_msg_buf[off + 10]; + w2_t[3] = s_msg_buf[off + 11]; + w3_t[0] = s_msg_buf[off + 12]; + w3_t[1] = s_msg_buf[off + 13]; + w3_t[2] = s_msg_buf[off + 14]; + w3_t[3] = s_msg_buf[off + 15]; + + sha1_transform (w0_t, w1_t, w2_t, w3_t, ipad); + } + + w0_t[0] = s_msg_buf[off + 0]; + w0_t[1] = s_msg_buf[off + 1]; + w0_t[2] = s_msg_buf[off + 2]; + w0_t[3] = s_msg_buf[off + 3]; + w1_t[0] = s_msg_buf[off + 4]; + w1_t[1] = s_msg_buf[off + 5]; + w1_t[2] = s_msg_buf[off + 6]; + w1_t[3] = s_msg_buf[off + 7]; + w2_t[0] = s_msg_buf[off + 8]; + w2_t[1] = s_msg_buf[off + 9]; + w2_t[2] = s_msg_buf[off + 10]; + w2_t[3] = s_msg_buf[off + 11]; + w3_t[0] = s_msg_buf[off + 12]; + w3_t[1] = s_msg_buf[off + 13]; + w3_t[2] = 0; + w3_t[3] = (64 + msg_len) * 8; + + hmac_sha1_run (w0_t, w1_t, w2_t, w3_t, ipad, opad, digest); + + const u32x r0 = digest[3]; + const u32x r1 = digest[4]; + const u32x r2 = digest[2]; + const u32x r3 = digest[1]; + + #include VECT_COMPARE_S + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m05400_s08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const ikepsk_t *ikepsk_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m05400_s16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const ikepsk_t *ikepsk_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/nv/m05400_a3.cu b/nv/m05400_a3.cu new file mode 100644 index 0000000000..ea9ada9e79 --- /dev/null +++ b/nv/m05400_a3.cu @@ -0,0 +1,1010 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _SHA1_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW2 +#define VECT_SIZE1 +#endif + +#define DGST_R0 3 +#define DGST_R1 4 +#define DGST_R2 2 +#define DGST_R3 1 + +#include "include/kernel_functions.c" +#include "types_nv.c" +#include "common_nv.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +__device__ static void sha1_transform (const u32x w0[4], const u32x w1[4], const u32x w2[4], const u32x w3[4], u32x digest[5]) +{ + u32x A = digest[0]; + u32x B = digest[1]; + u32x C = digest[2]; + u32x D = digest[3]; + u32x E = digest[4]; + + u32x w0_t = w0[0]; + u32x w1_t = w0[1]; + u32x w2_t = w0[2]; + u32x w3_t = w0[3]; + u32x w4_t = w1[0]; + u32x w5_t = w1[1]; + u32x w6_t = w1[2]; + u32x w7_t = w1[3]; + u32x w8_t = w2[0]; + u32x w9_t = w2[1]; + u32x wa_t = w2[2]; + u32x wb_t = w2[3]; + u32x wc_t = w3[0]; + u32x wd_t = w3[1]; + u32x we_t = w3[2]; + u32x wf_t = w3[3]; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, A, B, C, D, E, w0_t); + SHA1_STEP (SHA1_F0o, E, A, B, C, D, w1_t); + SHA1_STEP (SHA1_F0o, D, E, A, B, C, w2_t); + SHA1_STEP (SHA1_F0o, C, D, E, A, B, w3_t); + SHA1_STEP (SHA1_F0o, B, C, D, E, A, w4_t); + SHA1_STEP (SHA1_F0o, A, B, C, D, E, w5_t); + SHA1_STEP (SHA1_F0o, E, A, B, C, D, w6_t); + SHA1_STEP (SHA1_F0o, D, E, A, B, C, w7_t); + SHA1_STEP (SHA1_F0o, C, D, E, A, B, w8_t); + SHA1_STEP (SHA1_F0o, B, C, D, E, A, w9_t); + SHA1_STEP (SHA1_F0o, A, B, C, D, E, wa_t); + SHA1_STEP (SHA1_F0o, E, A, B, C, D, wb_t); + SHA1_STEP (SHA1_F0o, D, E, A, B, C, wc_t); + SHA1_STEP (SHA1_F0o, C, D, E, A, B, wd_t); + SHA1_STEP (SHA1_F0o, B, C, D, E, A, we_t); + SHA1_STEP (SHA1_F0o, A, B, C, D, E, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F0o, E, A, B, C, D, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F0o, D, E, A, B, C, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F0o, C, D, E, A, B, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F0o, B, C, D, E, A, w3_t); + + #undef K + #define K SHA1C01 + + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w7_t); + + #undef K + #define K SHA1C02 + + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, wb_t); + + #undef K + #define K SHA1C03 + + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, wf_t); + + digest[0] += A; + digest[1] += B; + digest[2] += C; + digest[3] += D; + digest[4] += E; +} + +__device__ static void hmac_sha1_pad (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], u32x ipad[5], u32x opad[5]) +{ + w0[0] = w0[0] ^ 0x36363636; + w0[1] = w0[1] ^ 0x36363636; + w0[2] = w0[2] ^ 0x36363636; + w0[3] = w0[3] ^ 0x36363636; + w1[0] = w1[0] ^ 0x36363636; + w1[1] = w1[1] ^ 0x36363636; + w1[2] = w1[2] ^ 0x36363636; + w1[3] = w1[3] ^ 0x36363636; + w2[0] = w2[0] ^ 0x36363636; + w2[1] = w2[1] ^ 0x36363636; + w2[2] = w2[2] ^ 0x36363636; + w2[3] = w2[3] ^ 0x36363636; + w3[0] = w3[0] ^ 0x36363636; + w3[1] = w3[1] ^ 0x36363636; + w3[2] = w3[2] ^ 0x36363636; + w3[3] = w3[3] ^ 0x36363636; + + ipad[0] = SHA1M_A; + ipad[1] = SHA1M_B; + ipad[2] = SHA1M_C; + ipad[3] = SHA1M_D; + ipad[4] = SHA1M_E; + + sha1_transform (w0, w1, w2, w3, ipad); + + w0[0] = w0[0] ^ 0x6a6a6a6a; + w0[1] = w0[1] ^ 0x6a6a6a6a; + w0[2] = w0[2] ^ 0x6a6a6a6a; + w0[3] = w0[3] ^ 0x6a6a6a6a; + w1[0] = w1[0] ^ 0x6a6a6a6a; + w1[1] = w1[1] ^ 0x6a6a6a6a; + w1[2] = w1[2] ^ 0x6a6a6a6a; + w1[3] = w1[3] ^ 0x6a6a6a6a; + w2[0] = w2[0] ^ 0x6a6a6a6a; + w2[1] = w2[1] ^ 0x6a6a6a6a; + w2[2] = w2[2] ^ 0x6a6a6a6a; + w2[3] = w2[3] ^ 0x6a6a6a6a; + w3[0] = w3[0] ^ 0x6a6a6a6a; + w3[1] = w3[1] ^ 0x6a6a6a6a; + w3[2] = w3[2] ^ 0x6a6a6a6a; + w3[3] = w3[3] ^ 0x6a6a6a6a; + + opad[0] = SHA1M_A; + opad[1] = SHA1M_B; + opad[2] = SHA1M_C; + opad[3] = SHA1M_D; + opad[4] = SHA1M_E; + + sha1_transform (w0, w1, w2, w3, opad); +} + +__device__ static void hmac_sha1_run (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], u32x ipad[5], u32x opad[5], u32x digest[5]) +{ + digest[0] = ipad[0]; + digest[1] = ipad[1]; + digest[2] = ipad[2]; + digest[3] = ipad[3]; + digest[4] = ipad[4]; + + sha1_transform (w0, w1, w2, w3, digest); + + w0[0] = digest[0]; + w0[1] = digest[1]; + w0[2] = digest[2]; + w0[3] = digest[3]; + w1[0] = digest[4]; + w1[1] = 0x80000000; + w1[2] = 0; + w1[3] = 0; + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = (64 + 20) * 8; + + digest[0] = opad[0]; + digest[1] = opad[1]; + digest[2] = opad[2]; + digest[3] = opad[3]; + digest[4] = opad[4]; + + sha1_transform (w0, w1, w2, w3, digest); +} + +__device__ __constant__ bf_t c_bfs[1024]; + +__device__ static void m05400m (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], const u32 pw_len, const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const ikepsk_t *ikepsk_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, u32 s_msg_buf[128]) +{ + /** + * modifier + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + const u32 lid = threadIdx.x; + + /** + * salt + */ + + const u32 nr_len = ikepsk_bufs[salt_pos].nr_len; + const u32 msg_len = ikepsk_bufs[salt_pos].msg_len; + + u32 salt_buf0[4]; + + salt_buf0[0] = swap_workaround (ikepsk_bufs[salt_pos].nr_buf[ 0]); + salt_buf0[1] = swap_workaround (ikepsk_bufs[salt_pos].nr_buf[ 1]); + salt_buf0[2] = swap_workaround (ikepsk_bufs[salt_pos].nr_buf[ 2]); + salt_buf0[3] = swap_workaround (ikepsk_bufs[salt_pos].nr_buf[ 3]); + + u32 salt_buf1[4]; + + salt_buf1[0] = swap_workaround (ikepsk_bufs[salt_pos].nr_buf[ 4]); + salt_buf1[1] = swap_workaround (ikepsk_bufs[salt_pos].nr_buf[ 5]); + salt_buf1[2] = swap_workaround (ikepsk_bufs[salt_pos].nr_buf[ 6]); + salt_buf1[3] = swap_workaround (ikepsk_bufs[salt_pos].nr_buf[ 7]); + + u32 salt_buf2[4]; + + salt_buf2[0] = swap_workaround (ikepsk_bufs[salt_pos].nr_buf[ 8]); + salt_buf2[1] = swap_workaround (ikepsk_bufs[salt_pos].nr_buf[ 9]); + salt_buf2[2] = swap_workaround (ikepsk_bufs[salt_pos].nr_buf[10]); + salt_buf2[3] = swap_workaround (ikepsk_bufs[salt_pos].nr_buf[11]); + + u32 salt_buf3[4]; + + salt_buf3[0] = swap_workaround (ikepsk_bufs[salt_pos].nr_buf[12]); + salt_buf3[1] = swap_workaround (ikepsk_bufs[salt_pos].nr_buf[13]); + salt_buf3[2] = 0; + salt_buf3[3] = 0; + + /** + * loop + */ + + u32x w0l = w0[0]; + + for (u32 il_pos = 0; il_pos < bfs_cnt; il_pos++) + { + const u32 w0r = c_bfs[il_pos].i; + + w0[0] = w0l | w0r; + + /** + * pads + */ + + u32x w0_t[4]; + + w0_t[0] = w0[0]; + w0_t[1] = w0[1]; + w0_t[2] = w0[2]; + w0_t[3] = w0[3]; + + u32x w1_t[4]; + + w1_t[0] = w1[0]; + w1_t[1] = w1[1]; + w1_t[2] = w1[2]; + w1_t[3] = w1[3]; + + u32x w2_t[4]; + + w2_t[0] = w2[0]; + w2_t[1] = w2[1]; + w2_t[2] = w2[2]; + w2_t[3] = w2[3]; + + u32x w3_t[4]; + + w3_t[0] = w3[0]; + w3_t[1] = w3[1]; + w3_t[2] = 0; + w3_t[3] = 0; + + u32x ipad[5]; + u32x opad[5]; + + hmac_sha1_pad (w0_t, w1_t, w2_t, w3_t, ipad, opad); + + w0_t[0] = salt_buf0[0]; + w0_t[1] = salt_buf0[1]; + w0_t[2] = salt_buf0[2]; + w0_t[3] = salt_buf0[3]; + w1_t[0] = salt_buf1[0]; + w1_t[1] = salt_buf1[1]; + w1_t[2] = salt_buf1[2]; + w1_t[3] = salt_buf1[3]; + w2_t[0] = salt_buf2[0]; + w2_t[1] = salt_buf2[1]; + w2_t[2] = salt_buf2[2]; + w2_t[3] = salt_buf2[3]; + w3_t[0] = salt_buf3[0]; + w3_t[1] = salt_buf3[1]; + w3_t[2] = 0; + w3_t[3] = (64 + nr_len) * 8; + + u32x digest[5]; + + hmac_sha1_run (w0_t, w1_t, w2_t, w3_t, ipad, opad, digest); + + w0_t[0] = digest[0]; + w0_t[1] = digest[1]; + w0_t[2] = digest[2]; + w0_t[3] = digest[3]; + w1_t[0] = digest[4]; + w1_t[1] = 0; + w1_t[2] = 0; + w1_t[3] = 0; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = 0; + + hmac_sha1_pad (w0_t, w1_t, w2_t, w3_t, ipad, opad); + + int left; + int off; + + for (left = ikepsk_bufs[salt_pos].msg_len, off = 0; left >= 56; left -= 64, off += 16) + { + w0_t[0] = s_msg_buf[off + 0]; + w0_t[1] = s_msg_buf[off + 1]; + w0_t[2] = s_msg_buf[off + 2]; + w0_t[3] = s_msg_buf[off + 3]; + w1_t[0] = s_msg_buf[off + 4]; + w1_t[1] = s_msg_buf[off + 5]; + w1_t[2] = s_msg_buf[off + 6]; + w1_t[3] = s_msg_buf[off + 7]; + w2_t[0] = s_msg_buf[off + 8]; + w2_t[1] = s_msg_buf[off + 9]; + w2_t[2] = s_msg_buf[off + 10]; + w2_t[3] = s_msg_buf[off + 11]; + w3_t[0] = s_msg_buf[off + 12]; + w3_t[1] = s_msg_buf[off + 13]; + w3_t[2] = s_msg_buf[off + 14]; + w3_t[3] = s_msg_buf[off + 15]; + + sha1_transform (w0_t, w1_t, w2_t, w3_t, ipad); + } + + w0_t[0] = s_msg_buf[off + 0]; + w0_t[1] = s_msg_buf[off + 1]; + w0_t[2] = s_msg_buf[off + 2]; + w0_t[3] = s_msg_buf[off + 3]; + w1_t[0] = s_msg_buf[off + 4]; + w1_t[1] = s_msg_buf[off + 5]; + w1_t[2] = s_msg_buf[off + 6]; + w1_t[3] = s_msg_buf[off + 7]; + w2_t[0] = s_msg_buf[off + 8]; + w2_t[1] = s_msg_buf[off + 9]; + w2_t[2] = s_msg_buf[off + 10]; + w2_t[3] = s_msg_buf[off + 11]; + w3_t[0] = s_msg_buf[off + 12]; + w3_t[1] = s_msg_buf[off + 13]; + w3_t[2] = 0; + w3_t[3] = (64 + msg_len) * 8; + + hmac_sha1_run (w0_t, w1_t, w2_t, w3_t, ipad, opad, digest); + + const u32x r0 = digest[3]; + const u32x r1 = digest[4]; + const u32x r2 = digest[2]; + const u32x r3 = digest[1]; + + #include VECT_COMPARE_M + } +} + +__device__ static void m05400s (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], const u32 pw_len, const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const ikepsk_t *ikepsk_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, u32 s_msg_buf[128]) +{ + /** + * modifier + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + const u32 lid = threadIdx.x; + + /** + * salt + */ + + const u32 nr_len = ikepsk_bufs[salt_pos].nr_len; + const u32 msg_len = ikepsk_bufs[salt_pos].msg_len; + + u32 salt_buf0[4]; + + salt_buf0[0] = swap_workaround (ikepsk_bufs[salt_pos].nr_buf[ 0]); + salt_buf0[1] = swap_workaround (ikepsk_bufs[salt_pos].nr_buf[ 1]); + salt_buf0[2] = swap_workaround (ikepsk_bufs[salt_pos].nr_buf[ 2]); + salt_buf0[3] = swap_workaround (ikepsk_bufs[salt_pos].nr_buf[ 3]); + + u32 salt_buf1[4]; + + salt_buf1[0] = swap_workaround (ikepsk_bufs[salt_pos].nr_buf[ 4]); + salt_buf1[1] = swap_workaround (ikepsk_bufs[salt_pos].nr_buf[ 5]); + salt_buf1[2] = swap_workaround (ikepsk_bufs[salt_pos].nr_buf[ 6]); + salt_buf1[3] = swap_workaround (ikepsk_bufs[salt_pos].nr_buf[ 7]); + + u32 salt_buf2[4]; + + salt_buf2[0] = swap_workaround (ikepsk_bufs[salt_pos].nr_buf[ 8]); + salt_buf2[1] = swap_workaround (ikepsk_bufs[salt_pos].nr_buf[ 9]); + salt_buf2[2] = swap_workaround (ikepsk_bufs[salt_pos].nr_buf[10]); + salt_buf2[3] = swap_workaround (ikepsk_bufs[salt_pos].nr_buf[11]); + + u32 salt_buf3[4]; + + salt_buf3[0] = swap_workaround (ikepsk_bufs[salt_pos].nr_buf[12]); + salt_buf3[1] = swap_workaround (ikepsk_bufs[salt_pos].nr_buf[13]); + salt_buf3[2] = 0; + salt_buf3[3] = 0; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * loop + */ + + u32x w0l = w0[0]; + + for (u32 il_pos = 0; il_pos < bfs_cnt; il_pos++) + { + const u32 w0r = c_bfs[il_pos].i; + + w0[0] = w0l | w0r; + + /** + * pads + */ + + u32x w0_t[4]; + + w0_t[0] = w0[0]; + w0_t[1] = w0[1]; + w0_t[2] = w0[2]; + w0_t[3] = w0[3]; + + u32x w1_t[4]; + + w1_t[0] = w1[0]; + w1_t[1] = w1[1]; + w1_t[2] = w1[2]; + w1_t[3] = w1[3]; + + u32x w2_t[4]; + + w2_t[0] = w2[0]; + w2_t[1] = w2[1]; + w2_t[2] = w2[2]; + w2_t[3] = w2[3]; + + u32x w3_t[4]; + + w3_t[0] = w3[0]; + w3_t[1] = w3[1]; + w3_t[2] = 0; + w3_t[3] = 0; + + u32x ipad[5]; + u32x opad[5]; + + hmac_sha1_pad (w0_t, w1_t, w2_t, w3_t, ipad, opad); + + w0_t[0] = salt_buf0[0]; + w0_t[1] = salt_buf0[1]; + w0_t[2] = salt_buf0[2]; + w0_t[3] = salt_buf0[3]; + w1_t[0] = salt_buf1[0]; + w1_t[1] = salt_buf1[1]; + w1_t[2] = salt_buf1[2]; + w1_t[3] = salt_buf1[3]; + w2_t[0] = salt_buf2[0]; + w2_t[1] = salt_buf2[1]; + w2_t[2] = salt_buf2[2]; + w2_t[3] = salt_buf2[3]; + w3_t[0] = salt_buf3[0]; + w3_t[1] = salt_buf3[1]; + w3_t[2] = 0; + w3_t[3] = (64 + nr_len) * 8; + + u32x digest[5]; + + hmac_sha1_run (w0_t, w1_t, w2_t, w3_t, ipad, opad, digest); + + w0_t[0] = digest[0]; + w0_t[1] = digest[1]; + w0_t[2] = digest[2]; + w0_t[3] = digest[3]; + w1_t[0] = digest[4]; + w1_t[1] = 0; + w1_t[2] = 0; + w1_t[3] = 0; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = 0; + + hmac_sha1_pad (w0_t, w1_t, w2_t, w3_t, ipad, opad); + + int left; + int off; + + for (left = ikepsk_bufs[salt_pos].msg_len, off = 0; left >= 56; left -= 64, off += 16) + { + w0_t[0] = s_msg_buf[off + 0]; + w0_t[1] = s_msg_buf[off + 1]; + w0_t[2] = s_msg_buf[off + 2]; + w0_t[3] = s_msg_buf[off + 3]; + w1_t[0] = s_msg_buf[off + 4]; + w1_t[1] = s_msg_buf[off + 5]; + w1_t[2] = s_msg_buf[off + 6]; + w1_t[3] = s_msg_buf[off + 7]; + w2_t[0] = s_msg_buf[off + 8]; + w2_t[1] = s_msg_buf[off + 9]; + w2_t[2] = s_msg_buf[off + 10]; + w2_t[3] = s_msg_buf[off + 11]; + w3_t[0] = s_msg_buf[off + 12]; + w3_t[1] = s_msg_buf[off + 13]; + w3_t[2] = s_msg_buf[off + 14]; + w3_t[3] = s_msg_buf[off + 15]; + + sha1_transform (w0_t, w1_t, w2_t, w3_t, ipad); + } + + w0_t[0] = s_msg_buf[off + 0]; + w0_t[1] = s_msg_buf[off + 1]; + w0_t[2] = s_msg_buf[off + 2]; + w0_t[3] = s_msg_buf[off + 3]; + w1_t[0] = s_msg_buf[off + 4]; + w1_t[1] = s_msg_buf[off + 5]; + w1_t[2] = s_msg_buf[off + 6]; + w1_t[3] = s_msg_buf[off + 7]; + w2_t[0] = s_msg_buf[off + 8]; + w2_t[1] = s_msg_buf[off + 9]; + w2_t[2] = s_msg_buf[off + 10]; + w2_t[3] = s_msg_buf[off + 11]; + w3_t[0] = s_msg_buf[off + 12]; + w3_t[1] = s_msg_buf[off + 13]; + w3_t[2] = 0; + w3_t[3] = (64 + msg_len) * 8; + + hmac_sha1_run (w0_t, w1_t, w2_t, w3_t, ipad, opad, digest); + + const u32x r0 = digest[3]; + const u32x r1 = digest[4]; + const u32x r2 = digest[2]; + const u32x r3 = digest[1]; + + #include VECT_COMPARE_S + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m05400_m04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const ikepsk_t *ikepsk_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + const u32 lid = threadIdx.x; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * s_msg + */ + + __shared__ u32 s_msg_buf[128]; + + if (lid < 128) + { + s_msg_buf[lid] = swap_workaround (ikepsk_bufs[salt_pos].msg_buf[lid]); + } + + __syncthreads (); + + if (gid >= gid_max) return; + + /** + * main + */ + + m05400m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, ikepsk_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset, s_msg_buf); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m05400_m08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const ikepsk_t *ikepsk_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + const u32 lid = threadIdx.x; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * s_msg + */ + + __shared__ u32 s_msg_buf[128]; + + if (lid < 128) + { + s_msg_buf[lid] = swap_workaround (ikepsk_bufs[salt_pos].msg_buf[lid]); + } + + __syncthreads (); + + if (gid >= gid_max) return; + + /** + * main + */ + + m05400m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, ikepsk_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset, s_msg_buf); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m05400_m16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const ikepsk_t *ikepsk_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + const u32 lid = threadIdx.x; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = pws[gid].i[ 8]; + w2[1] = pws[gid].i[ 9]; + w2[2] = pws[gid].i[10]; + w2[3] = pws[gid].i[11]; + + u32x w3[4]; + + w3[0] = pws[gid].i[12]; + w3[1] = pws[gid].i[13]; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * s_msg + */ + + __shared__ u32 s_msg_buf[128]; + + if (lid < 128) + { + s_msg_buf[lid] = swap_workaround (ikepsk_bufs[salt_pos].msg_buf[lid]); + } + + __syncthreads (); + + if (gid >= gid_max) return; + + /** + * main + */ + + m05400m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, ikepsk_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset, s_msg_buf); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m05400_s04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const ikepsk_t *ikepsk_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + const u32 lid = threadIdx.x; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * s_msg + */ + + __shared__ u32 s_msg_buf[128]; + + if (lid < 128) + { + s_msg_buf[lid] = swap_workaround (ikepsk_bufs[salt_pos].msg_buf[lid]); + } + + __syncthreads (); + + if (gid >= gid_max) return; + + /** + * main + */ + + m05400s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, ikepsk_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset, s_msg_buf); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m05400_s08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const ikepsk_t *ikepsk_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + const u32 lid = threadIdx.x; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * s_msg + */ + + __shared__ u32 s_msg_buf[128]; + + if (lid < 128) + { + s_msg_buf[lid] = swap_workaround (ikepsk_bufs[salt_pos].msg_buf[lid]); + } + + __syncthreads (); + + if (gid >= gid_max) return; + + /** + * main + */ + + m05400s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, ikepsk_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset, s_msg_buf); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m05400_s16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const ikepsk_t *ikepsk_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + const u32 lid = threadIdx.x; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = pws[gid].i[ 8]; + w2[1] = pws[gid].i[ 9]; + w2[2] = pws[gid].i[10]; + w2[3] = pws[gid].i[11]; + + u32x w3[4]; + + w3[0] = pws[gid].i[12]; + w3[1] = pws[gid].i[13]; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * s_msg + */ + + __shared__ u32 s_msg_buf[128]; + + if (lid < 128) + { + s_msg_buf[lid] = swap_workaround (ikepsk_bufs[salt_pos].msg_buf[lid]); + } + + __syncthreads (); + + if (gid >= gid_max) return; + + /** + * main + */ + + m05400s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, ikepsk_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset, s_msg_buf); +} diff --git a/nv/m05500_a0.cu b/nv/m05500_a0.cu new file mode 100644 index 0000000000..0c8302abea --- /dev/null +++ b/nv/m05500_a0.cu @@ -0,0 +1,959 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _MD4_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW2 +#define VECT_SIZE1 +#endif + +#define DGST_R0 0 +#define DGST_R1 1 +#define DGST_R2 2 +#define DGST_R3 3 + +#include "include/kernel_functions.c" +#include "types_nv.c" +#include "common_nv.c" +#include "include/rp_gpu.h" +#include "rp_nv.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#define PERM_OP(a,b,tt,n,m) \ +{ \ + tt = a >> n; \ + tt = tt ^ b; \ + tt = tt & m; \ + b = b ^ tt; \ + tt = tt << n; \ + a = a ^ tt; \ +} + +#define HPERM_OP(a,tt,n,m) \ +{ \ + tt = a << (16 + n); \ + tt = tt ^ a; \ + tt = tt & m; \ + a = a ^ tt; \ + tt = tt >> (16 + n); \ + a = a ^ tt; \ +} + +__device__ __constant__ u32 c_SPtrans[8][64] = +{ + /* nibble 0 */ + 0x02080800, 0x00080000, 0x02000002, 0x02080802, + 0x02000000, 0x00080802, 0x00080002, 0x02000002, + 0x00080802, 0x02080800, 0x02080000, 0x00000802, + 0x02000802, 0x02000000, 0x00000000, 0x00080002, + 0x00080000, 0x00000002, 0x02000800, 0x00080800, + 0x02080802, 0x02080000, 0x00000802, 0x02000800, + 0x00000002, 0x00000800, 0x00080800, 0x02080002, + 0x00000800, 0x02000802, 0x02080002, 0x00000000, + 0x00000000, 0x02080802, 0x02000800, 0x00080002, + 0x02080800, 0x00080000, 0x00000802, 0x02000800, + 0x02080002, 0x00000800, 0x00080800, 0x02000002, + 0x00080802, 0x00000002, 0x02000002, 0x02080000, + 0x02080802, 0x00080800, 0x02080000, 0x02000802, + 0x02000000, 0x00000802, 0x00080002, 0x00000000, + 0x00080000, 0x02000000, 0x02000802, 0x02080800, + 0x00000002, 0x02080002, 0x00000800, 0x00080802, + /* nibble 1 */ + 0x40108010, 0x00000000, 0x00108000, 0x40100000, + 0x40000010, 0x00008010, 0x40008000, 0x00108000, + 0x00008000, 0x40100010, 0x00000010, 0x40008000, + 0x00100010, 0x40108000, 0x40100000, 0x00000010, + 0x00100000, 0x40008010, 0x40100010, 0x00008000, + 0x00108010, 0x40000000, 0x00000000, 0x00100010, + 0x40008010, 0x00108010, 0x40108000, 0x40000010, + 0x40000000, 0x00100000, 0x00008010, 0x40108010, + 0x00100010, 0x40108000, 0x40008000, 0x00108010, + 0x40108010, 0x00100010, 0x40000010, 0x00000000, + 0x40000000, 0x00008010, 0x00100000, 0x40100010, + 0x00008000, 0x40000000, 0x00108010, 0x40008010, + 0x40108000, 0x00008000, 0x00000000, 0x40000010, + 0x00000010, 0x40108010, 0x00108000, 0x40100000, + 0x40100010, 0x00100000, 0x00008010, 0x40008000, + 0x40008010, 0x00000010, 0x40100000, 0x00108000, + /* nibble 2 */ + 0x04000001, 0x04040100, 0x00000100, 0x04000101, + 0x00040001, 0x04000000, 0x04000101, 0x00040100, + 0x04000100, 0x00040000, 0x04040000, 0x00000001, + 0x04040101, 0x00000101, 0x00000001, 0x04040001, + 0x00000000, 0x00040001, 0x04040100, 0x00000100, + 0x00000101, 0x04040101, 0x00040000, 0x04000001, + 0x04040001, 0x04000100, 0x00040101, 0x04040000, + 0x00040100, 0x00000000, 0x04000000, 0x00040101, + 0x04040100, 0x00000100, 0x00000001, 0x00040000, + 0x00000101, 0x00040001, 0x04040000, 0x04000101, + 0x00000000, 0x04040100, 0x00040100, 0x04040001, + 0x00040001, 0x04000000, 0x04040101, 0x00000001, + 0x00040101, 0x04000001, 0x04000000, 0x04040101, + 0x00040000, 0x04000100, 0x04000101, 0x00040100, + 0x04000100, 0x00000000, 0x04040001, 0x00000101, + 0x04000001, 0x00040101, 0x00000100, 0x04040000, + /* nibble 3 */ + 0x00401008, 0x10001000, 0x00000008, 0x10401008, + 0x00000000, 0x10400000, 0x10001008, 0x00400008, + 0x10401000, 0x10000008, 0x10000000, 0x00001008, + 0x10000008, 0x00401008, 0x00400000, 0x10000000, + 0x10400008, 0x00401000, 0x00001000, 0x00000008, + 0x00401000, 0x10001008, 0x10400000, 0x00001000, + 0x00001008, 0x00000000, 0x00400008, 0x10401000, + 0x10001000, 0x10400008, 0x10401008, 0x00400000, + 0x10400008, 0x00001008, 0x00400000, 0x10000008, + 0x00401000, 0x10001000, 0x00000008, 0x10400000, + 0x10001008, 0x00000000, 0x00001000, 0x00400008, + 0x00000000, 0x10400008, 0x10401000, 0x00001000, + 0x10000000, 0x10401008, 0x00401008, 0x00400000, + 0x10401008, 0x00000008, 0x10001000, 0x00401008, + 0x00400008, 0x00401000, 0x10400000, 0x10001008, + 0x00001008, 0x10000000, 0x10000008, 0x10401000, + /* nibble 4 */ + 0x08000000, 0x00010000, 0x00000400, 0x08010420, + 0x08010020, 0x08000400, 0x00010420, 0x08010000, + 0x00010000, 0x00000020, 0x08000020, 0x00010400, + 0x08000420, 0x08010020, 0x08010400, 0x00000000, + 0x00010400, 0x08000000, 0x00010020, 0x00000420, + 0x08000400, 0x00010420, 0x00000000, 0x08000020, + 0x00000020, 0x08000420, 0x08010420, 0x00010020, + 0x08010000, 0x00000400, 0x00000420, 0x08010400, + 0x08010400, 0x08000420, 0x00010020, 0x08010000, + 0x00010000, 0x00000020, 0x08000020, 0x08000400, + 0x08000000, 0x00010400, 0x08010420, 0x00000000, + 0x00010420, 0x08000000, 0x00000400, 0x00010020, + 0x08000420, 0x00000400, 0x00000000, 0x08010420, + 0x08010020, 0x08010400, 0x00000420, 0x00010000, + 0x00010400, 0x08010020, 0x08000400, 0x00000420, + 0x00000020, 0x00010420, 0x08010000, 0x08000020, + /* nibble 5 */ + 0x80000040, 0x00200040, 0x00000000, 0x80202000, + 0x00200040, 0x00002000, 0x80002040, 0x00200000, + 0x00002040, 0x80202040, 0x00202000, 0x80000000, + 0x80002000, 0x80000040, 0x80200000, 0x00202040, + 0x00200000, 0x80002040, 0x80200040, 0x00000000, + 0x00002000, 0x00000040, 0x80202000, 0x80200040, + 0x80202040, 0x80200000, 0x80000000, 0x00002040, + 0x00000040, 0x00202000, 0x00202040, 0x80002000, + 0x00002040, 0x80000000, 0x80002000, 0x00202040, + 0x80202000, 0x00200040, 0x00000000, 0x80002000, + 0x80000000, 0x00002000, 0x80200040, 0x00200000, + 0x00200040, 0x80202040, 0x00202000, 0x00000040, + 0x80202040, 0x00202000, 0x00200000, 0x80002040, + 0x80000040, 0x80200000, 0x00202040, 0x00000000, + 0x00002000, 0x80000040, 0x80002040, 0x80202000, + 0x80200000, 0x00002040, 0x00000040, 0x80200040, + /* nibble 6 */ + 0x00004000, 0x00000200, 0x01000200, 0x01000004, + 0x01004204, 0x00004004, 0x00004200, 0x00000000, + 0x01000000, 0x01000204, 0x00000204, 0x01004000, + 0x00000004, 0x01004200, 0x01004000, 0x00000204, + 0x01000204, 0x00004000, 0x00004004, 0x01004204, + 0x00000000, 0x01000200, 0x01000004, 0x00004200, + 0x01004004, 0x00004204, 0x01004200, 0x00000004, + 0x00004204, 0x01004004, 0x00000200, 0x01000000, + 0x00004204, 0x01004000, 0x01004004, 0x00000204, + 0x00004000, 0x00000200, 0x01000000, 0x01004004, + 0x01000204, 0x00004204, 0x00004200, 0x00000000, + 0x00000200, 0x01000004, 0x00000004, 0x01000200, + 0x00000000, 0x01000204, 0x01000200, 0x00004200, + 0x00000204, 0x00004000, 0x01004204, 0x01000000, + 0x01004200, 0x00000004, 0x00004004, 0x01004204, + 0x01000004, 0x01004200, 0x01004000, 0x00004004, + /* nibble 7 */ + 0x20800080, 0x20820000, 0x00020080, 0x00000000, + 0x20020000, 0x00800080, 0x20800000, 0x20820080, + 0x00000080, 0x20000000, 0x00820000, 0x00020080, + 0x00820080, 0x20020080, 0x20000080, 0x20800000, + 0x00020000, 0x00820080, 0x00800080, 0x20020000, + 0x20820080, 0x20000080, 0x00000000, 0x00820000, + 0x20000000, 0x00800000, 0x20020080, 0x20800080, + 0x00800000, 0x00020000, 0x20820000, 0x00000080, + 0x00800000, 0x00020000, 0x20000080, 0x20820080, + 0x00020080, 0x20000000, 0x00000000, 0x00820000, + 0x20800080, 0x20020080, 0x20020000, 0x00800080, + 0x20820000, 0x00000080, 0x00800080, 0x20020000, + 0x20820080, 0x00800000, 0x20800000, 0x20000080, + 0x00820000, 0x00020080, 0x20020080, 0x20800000, + 0x00000080, 0x20820000, 0x00820080, 0x00000000, + 0x20000000, 0x20800080, 0x00020000, 0x00820080, +}; + +__device__ __constant__ u32 c_skb[8][64] = +{ + /* for C bits (numbered as per FIPS 46) 1 2 3 4 5 6 */ + 0x00000000, 0x00000010, 0x20000000, 0x20000010, + 0x00010000, 0x00010010, 0x20010000, 0x20010010, + 0x00000800, 0x00000810, 0x20000800, 0x20000810, + 0x00010800, 0x00010810, 0x20010800, 0x20010810, + 0x00000020, 0x00000030, 0x20000020, 0x20000030, + 0x00010020, 0x00010030, 0x20010020, 0x20010030, + 0x00000820, 0x00000830, 0x20000820, 0x20000830, + 0x00010820, 0x00010830, 0x20010820, 0x20010830, + 0x00080000, 0x00080010, 0x20080000, 0x20080010, + 0x00090000, 0x00090010, 0x20090000, 0x20090010, + 0x00080800, 0x00080810, 0x20080800, 0x20080810, + 0x00090800, 0x00090810, 0x20090800, 0x20090810, + 0x00080020, 0x00080030, 0x20080020, 0x20080030, + 0x00090020, 0x00090030, 0x20090020, 0x20090030, + 0x00080820, 0x00080830, 0x20080820, 0x20080830, + 0x00090820, 0x00090830, 0x20090820, 0x20090830, + /* for C bits (numbered as per FIPS 46) 7 8 10 11 12 13 */ + 0x00000000, 0x02000000, 0x00002000, 0x02002000, + 0x00200000, 0x02200000, 0x00202000, 0x02202000, + 0x00000004, 0x02000004, 0x00002004, 0x02002004, + 0x00200004, 0x02200004, 0x00202004, 0x02202004, + 0x00000400, 0x02000400, 0x00002400, 0x02002400, + 0x00200400, 0x02200400, 0x00202400, 0x02202400, + 0x00000404, 0x02000404, 0x00002404, 0x02002404, + 0x00200404, 0x02200404, 0x00202404, 0x02202404, + 0x10000000, 0x12000000, 0x10002000, 0x12002000, + 0x10200000, 0x12200000, 0x10202000, 0x12202000, + 0x10000004, 0x12000004, 0x10002004, 0x12002004, + 0x10200004, 0x12200004, 0x10202004, 0x12202004, + 0x10000400, 0x12000400, 0x10002400, 0x12002400, + 0x10200400, 0x12200400, 0x10202400, 0x12202400, + 0x10000404, 0x12000404, 0x10002404, 0x12002404, + 0x10200404, 0x12200404, 0x10202404, 0x12202404, + /* for C bits (numbered as per FIPS 46) 14 15 16 17 19 20 */ + 0x00000000, 0x00000001, 0x00040000, 0x00040001, + 0x01000000, 0x01000001, 0x01040000, 0x01040001, + 0x00000002, 0x00000003, 0x00040002, 0x00040003, + 0x01000002, 0x01000003, 0x01040002, 0x01040003, + 0x00000200, 0x00000201, 0x00040200, 0x00040201, + 0x01000200, 0x01000201, 0x01040200, 0x01040201, + 0x00000202, 0x00000203, 0x00040202, 0x00040203, + 0x01000202, 0x01000203, 0x01040202, 0x01040203, + 0x08000000, 0x08000001, 0x08040000, 0x08040001, + 0x09000000, 0x09000001, 0x09040000, 0x09040001, + 0x08000002, 0x08000003, 0x08040002, 0x08040003, + 0x09000002, 0x09000003, 0x09040002, 0x09040003, + 0x08000200, 0x08000201, 0x08040200, 0x08040201, + 0x09000200, 0x09000201, 0x09040200, 0x09040201, + 0x08000202, 0x08000203, 0x08040202, 0x08040203, + 0x09000202, 0x09000203, 0x09040202, 0x09040203, + /* for C bits (numbered as per FIPS 46) 21 23 24 26 27 28 */ + 0x00000000, 0x00100000, 0x00000100, 0x00100100, + 0x00000008, 0x00100008, 0x00000108, 0x00100108, + 0x00001000, 0x00101000, 0x00001100, 0x00101100, + 0x00001008, 0x00101008, 0x00001108, 0x00101108, + 0x04000000, 0x04100000, 0x04000100, 0x04100100, + 0x04000008, 0x04100008, 0x04000108, 0x04100108, + 0x04001000, 0x04101000, 0x04001100, 0x04101100, + 0x04001008, 0x04101008, 0x04001108, 0x04101108, + 0x00020000, 0x00120000, 0x00020100, 0x00120100, + 0x00020008, 0x00120008, 0x00020108, 0x00120108, + 0x00021000, 0x00121000, 0x00021100, 0x00121100, + 0x00021008, 0x00121008, 0x00021108, 0x00121108, + 0x04020000, 0x04120000, 0x04020100, 0x04120100, + 0x04020008, 0x04120008, 0x04020108, 0x04120108, + 0x04021000, 0x04121000, 0x04021100, 0x04121100, + 0x04021008, 0x04121008, 0x04021108, 0x04121108, + /* for D bits (numbered as per FIPS 46) 1 2 3 4 5 6 */ + 0x00000000, 0x10000000, 0x00010000, 0x10010000, + 0x00000004, 0x10000004, 0x00010004, 0x10010004, + 0x20000000, 0x30000000, 0x20010000, 0x30010000, + 0x20000004, 0x30000004, 0x20010004, 0x30010004, + 0x00100000, 0x10100000, 0x00110000, 0x10110000, + 0x00100004, 0x10100004, 0x00110004, 0x10110004, + 0x20100000, 0x30100000, 0x20110000, 0x30110000, + 0x20100004, 0x30100004, 0x20110004, 0x30110004, + 0x00001000, 0x10001000, 0x00011000, 0x10011000, + 0x00001004, 0x10001004, 0x00011004, 0x10011004, + 0x20001000, 0x30001000, 0x20011000, 0x30011000, + 0x20001004, 0x30001004, 0x20011004, 0x30011004, + 0x00101000, 0x10101000, 0x00111000, 0x10111000, + 0x00101004, 0x10101004, 0x00111004, 0x10111004, + 0x20101000, 0x30101000, 0x20111000, 0x30111000, + 0x20101004, 0x30101004, 0x20111004, 0x30111004, + /* for D bits (numbered as per FIPS 46) 8 9 11 12 13 14 */ + 0x00000000, 0x08000000, 0x00000008, 0x08000008, + 0x00000400, 0x08000400, 0x00000408, 0x08000408, + 0x00020000, 0x08020000, 0x00020008, 0x08020008, + 0x00020400, 0x08020400, 0x00020408, 0x08020408, + 0x00000001, 0x08000001, 0x00000009, 0x08000009, + 0x00000401, 0x08000401, 0x00000409, 0x08000409, + 0x00020001, 0x08020001, 0x00020009, 0x08020009, + 0x00020401, 0x08020401, 0x00020409, 0x08020409, + 0x02000000, 0x0A000000, 0x02000008, 0x0A000008, + 0x02000400, 0x0A000400, 0x02000408, 0x0A000408, + 0x02020000, 0x0A020000, 0x02020008, 0x0A020008, + 0x02020400, 0x0A020400, 0x02020408, 0x0A020408, + 0x02000001, 0x0A000001, 0x02000009, 0x0A000009, + 0x02000401, 0x0A000401, 0x02000409, 0x0A000409, + 0x02020001, 0x0A020001, 0x02020009, 0x0A020009, + 0x02020401, 0x0A020401, 0x02020409, 0x0A020409, + /* for D bits (numbered as per FIPS 46) 16 17 18 19 20 21 */ + 0x00000000, 0x00000100, 0x00080000, 0x00080100, + 0x01000000, 0x01000100, 0x01080000, 0x01080100, + 0x00000010, 0x00000110, 0x00080010, 0x00080110, + 0x01000010, 0x01000110, 0x01080010, 0x01080110, + 0x00200000, 0x00200100, 0x00280000, 0x00280100, + 0x01200000, 0x01200100, 0x01280000, 0x01280100, + 0x00200010, 0x00200110, 0x00280010, 0x00280110, + 0x01200010, 0x01200110, 0x01280010, 0x01280110, + 0x00000200, 0x00000300, 0x00080200, 0x00080300, + 0x01000200, 0x01000300, 0x01080200, 0x01080300, + 0x00000210, 0x00000310, 0x00080210, 0x00080310, + 0x01000210, 0x01000310, 0x01080210, 0x01080310, + 0x00200200, 0x00200300, 0x00280200, 0x00280300, + 0x01200200, 0x01200300, 0x01280200, 0x01280300, + 0x00200210, 0x00200310, 0x00280210, 0x00280310, + 0x01200210, 0x01200310, 0x01280210, 0x01280310, + /* for D bits (numbered as per FIPS 46) 22 23 24 25 27 28 */ + 0x00000000, 0x04000000, 0x00040000, 0x04040000, + 0x00000002, 0x04000002, 0x00040002, 0x04040002, + 0x00002000, 0x04002000, 0x00042000, 0x04042000, + 0x00002002, 0x04002002, 0x00042002, 0x04042002, + 0x00000020, 0x04000020, 0x00040020, 0x04040020, + 0x00000022, 0x04000022, 0x00040022, 0x04040022, + 0x00002020, 0x04002020, 0x00042020, 0x04042020, + 0x00002022, 0x04002022, 0x00042022, 0x04042022, + 0x00000800, 0x04000800, 0x00040800, 0x04040800, + 0x00000802, 0x04000802, 0x00040802, 0x04040802, + 0x00002800, 0x04002800, 0x00042800, 0x04042800, + 0x00002802, 0x04002802, 0x00042802, 0x04042802, + 0x00000820, 0x04000820, 0x00040820, 0x04040820, + 0x00000822, 0x04000822, 0x00040822, 0x04040822, + 0x00002820, 0x04002820, 0x00042820, 0x04042820, + 0x00002822, 0x04002822, 0x00042822, 0x04042822 +}; + +#ifdef VECT_SIZE1 +#define BOX(i,n,S) u32x ((S)[(n)][(i)]) +#endif + +#ifdef VECT_SIZE2 +#define BOX(i,n,S) u32x ((S)[(n)][(i).x], (S)[(n)][(i).y]) +#endif + +__device__ static void _des_crypt_encrypt (u32x iv[2], u32x data[2], u32x Kc[16], u32x Kd[16], u32 s_SPtrans[8][64]) +{ + u32x tt; + + u32x r = data[0]; + u32x l = data[1]; + + #pragma unroll 16 + for (u32 i = 0; i < 16; i++) + { + u32x u = Kc[i] ^ r; + u32x t = Kd[i] ^ rotl32 (r, 28u); + + l ^= BOX (((u >> 2) & 0x3f), 0, s_SPtrans) + | BOX (((u >> 10) & 0x3f), 2, s_SPtrans) + | BOX (((u >> 18) & 0x3f), 4, s_SPtrans) + | BOX (((u >> 26) & 0x3f), 6, s_SPtrans) + | BOX (((t >> 2) & 0x3f), 1, s_SPtrans) + | BOX (((t >> 10) & 0x3f), 3, s_SPtrans) + | BOX (((t >> 18) & 0x3f), 5, s_SPtrans) + | BOX (((t >> 26) & 0x3f), 7, s_SPtrans); + + tt = l; + l = r; + r = tt; + } + + iv[0] = l; + iv[1] = r; +} + +__device__ static void _des_crypt_keysetup (u32x c, u32x d, u32x Kc[16], u32x Kd[16], u32 s_skb[8][64]) +{ + u32x tt; + + PERM_OP (d, c, tt, 4, 0x0f0f0f0f); + HPERM_OP (c, tt, 2, 0xcccc0000); + HPERM_OP (d, tt, 2, 0xcccc0000); + PERM_OP (d, c, tt, 1, 0x55555555); + PERM_OP (c, d, tt, 8, 0x00ff00ff); + PERM_OP (d, c, tt, 1, 0x55555555); + + d = ((d & 0x000000ff) << 16) + | ((d & 0x0000ff00) << 0) + | ((d & 0x00ff0000) >> 16) + | ((c & 0xf0000000) >> 4); + + c = c & 0x0fffffff; + + #pragma unroll 16 + for (u32 i = 0; i < 16; i++) + { + const u32 shifts3s0[16] = { 1, 1, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 1 }; + const u32 shifts3s1[16] = { 27, 27, 26, 26, 26, 26, 26, 26, 27, 26, 26, 26, 26, 26, 26, 27 }; + + c = c >> shifts3s0[i] | c << shifts3s1[i]; + d = d >> shifts3s0[i] | d << shifts3s1[i]; + + c = c & 0x0fffffff; + d = d & 0x0fffffff; + + u32x s = BOX ((( c >> 0) & 0x3f), 0, s_skb) + | BOX ((((c >> 6) & 0x03) + | ((c >> 7) & 0x3c)), 1, s_skb) + | BOX ((((c >> 13) & 0x0f) + | ((c >> 14) & 0x30)), 2, s_skb) + | BOX ((((c >> 20) & 0x01) + | ((c >> 21) & 0x06) + | ((c >> 22) & 0x38)), 3, s_skb); + + u32x t = BOX ((( d >> 0) & 0x3f), 4, s_skb) + | BOX ((((d >> 7) & 0x03) + | ((d >> 8) & 0x3c)), 5, s_skb) + | BOX ((((d >> 15) & 0x3f)), 6, s_skb) + | BOX ((((d >> 21) & 0x0f) + | ((d >> 22) & 0x30)), 7, s_skb); + + #if __CUDA_ARCH__ >= 200 + Kc[i] = __byte_perm (s, t, 0x5410); + Kd[i] = __byte_perm (s, t, 0x7632); + #else + Kc[i] = ((t << 16) | (s & 0x0000ffff)); + Kd[i] = ((s >> 16) | (t & 0xffff0000)); + #endif + + Kc[i] = rotl32 (Kc[i], 2u); + Kd[i] = rotl32 (Kd[i], 2u); + } +} + +__device__ static void transform_netntlmv1_key (const u32x w0, const u32x w1, u32x out[2]) +{ + u32x t[8]; + + t[0] = (w0 >> 0) & 0xff; + t[1] = (w0 >> 8) & 0xff; + t[2] = (w0 >> 16) & 0xff; + t[3] = (w0 >> 24) & 0xff; + t[4] = (w1 >> 0) & 0xff; + t[5] = (w1 >> 8) & 0xff; + t[6] = (w1 >> 16) & 0xff; + t[7] = (w1 >> 24) & 0xff; + + u32x k[8]; + + k[0] = (t[0] >> 0); + k[1] = (t[0] << 7) | (t[1] >> 1); + k[2] = (t[1] << 6) | (t[2] >> 2); + k[3] = (t[2] << 5) | (t[3] >> 3); + k[4] = (t[3] << 4) | (t[4] >> 4); + k[5] = (t[4] << 3) | (t[5] >> 5); + k[6] = (t[5] << 2) | (t[6] >> 6); + k[7] = (t[6] << 1); + + out[0] = ((k[0] & 0xff) << 0) + | ((k[1] & 0xff) << 8) + | ((k[2] & 0xff) << 16) + | ((k[3] & 0xff) << 24); + + out[1] = ((k[4] & 0xff) << 0) + | ((k[5] & 0xff) << 8) + | ((k[6] & 0xff) << 16) + | ((k[7] & 0xff) << 24); +} + +__device__ __constant__ gpu_rule_t c_rules[1024]; + +extern "C" __global__ void __launch_bounds__ (256, 1) m05500_m04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + u32x pw_buf1[4]; + + pw_buf1[0] = pws[gid].i[ 4]; + pw_buf1[1] = pws[gid].i[ 5]; + pw_buf1[2] = pws[gid].i[ 6]; + pw_buf1[3] = pws[gid].i[ 7]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * sbox, kbox + */ + + __shared__ u32 s_SPtrans[8][64]; + __shared__ u32 s_skb[8][64]; + + if (lid < 64) + { + s_SPtrans[0][lid] = c_SPtrans[0][lid]; + s_SPtrans[1][lid] = c_SPtrans[1][lid]; + s_SPtrans[2][lid] = c_SPtrans[2][lid]; + s_SPtrans[3][lid] = c_SPtrans[3][lid]; + s_SPtrans[4][lid] = c_SPtrans[4][lid]; + s_SPtrans[5][lid] = c_SPtrans[5][lid]; + s_SPtrans[6][lid] = c_SPtrans[6][lid]; + s_SPtrans[7][lid] = c_SPtrans[7][lid]; + + s_skb[0][lid] = c_skb[0][lid]; + s_skb[1][lid] = c_skb[1][lid]; + s_skb[2][lid] = c_skb[2][lid]; + s_skb[3][lid] = c_skb[3][lid]; + s_skb[4][lid] = c_skb[4][lid]; + s_skb[5][lid] = c_skb[5][lid]; + s_skb[6][lid] = c_skb[6][lid]; + s_skb[7][lid] = c_skb[7][lid]; + } + + __syncthreads (); + + if (gid >= gid_max) return; + + /** + * salt + */ + + const u32 s0 = salt_bufs[salt_pos].salt_buf[0]; + const u32 s1 = salt_bufs[salt_pos].salt_buf[1]; + const u32 s2 = salt_bufs[salt_pos].salt_buf[2]; + + u32x data[2]; + + data[0] = s0; + data[1] = s1; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + + w0[0] = pw_buf0[0]; + w0[1] = pw_buf0[1]; + w0[2] = pw_buf0[2]; + w0[3] = pw_buf0[3]; + + u32x w1[4]; + + w1[0] = pw_buf1[0]; + w1[1] = pw_buf1[1]; + w1[2] = pw_buf1[2]; + w1[3] = pw_buf1[3]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 out_len = apply_rules (c_rules[il_pos].cmds, w0, w1, pw_len); + + append_0x80_2 (w0, w1, out_len); + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + make_unicode (w0, w0_t, w1_t); + make_unicode (w1, w2_t, w3_t); + + w3_t[2] = out_len * 8 * 2; + + u32x a = MD4M_A; + u32x b = MD4M_B; + u32x c = MD4M_C; + u32x d = MD4M_D; + + MD4_STEP (MD4_Fo, a, b, c, d, w0_t[0], MD4C00, MD4S00); + MD4_STEP (MD4_Fo, d, a, b, c, w0_t[1], MD4C00, MD4S01); + MD4_STEP (MD4_Fo, c, d, a, b, w0_t[2], MD4C00, MD4S02); + MD4_STEP (MD4_Fo, b, c, d, a, w0_t[3], MD4C00, MD4S03); + MD4_STEP (MD4_Fo, a, b, c, d, w1_t[0], MD4C00, MD4S00); + MD4_STEP (MD4_Fo, d, a, b, c, w1_t[1], MD4C00, MD4S01); + MD4_STEP (MD4_Fo, c, d, a, b, w1_t[2], MD4C00, MD4S02); + MD4_STEP (MD4_Fo, b, c, d, a, w1_t[3], MD4C00, MD4S03); + MD4_STEP (MD4_Fo, a, b, c, d, w2_t[0], MD4C00, MD4S00); + MD4_STEP (MD4_Fo, d, a, b, c, w2_t[1], MD4C00, MD4S01); + MD4_STEP (MD4_Fo, c, d, a, b, w2_t[2], MD4C00, MD4S02); + MD4_STEP (MD4_Fo, b, c, d, a, w2_t[3], MD4C00, MD4S03); + MD4_STEP (MD4_Fo, a, b, c, d, w3_t[0], MD4C00, MD4S00); + MD4_STEP (MD4_Fo, d, a, b, c, w3_t[1], MD4C00, MD4S01); + MD4_STEP (MD4_Fo, c, d, a, b, w3_t[2], MD4C00, MD4S02); + MD4_STEP (MD4_Fo, b, c, d, a, w3_t[3], MD4C00, MD4S03); + + MD4_STEP (MD4_Go, a, b, c, d, w0_t[0], MD4C01, MD4S10); + MD4_STEP (MD4_Go, d, a, b, c, w1_t[0], MD4C01, MD4S11); + MD4_STEP (MD4_Go, c, d, a, b, w2_t[0], MD4C01, MD4S12); + MD4_STEP (MD4_Go, b, c, d, a, w3_t[0], MD4C01, MD4S13); + MD4_STEP (MD4_Go, a, b, c, d, w0_t[1], MD4C01, MD4S10); + MD4_STEP (MD4_Go, d, a, b, c, w1_t[1], MD4C01, MD4S11); + MD4_STEP (MD4_Go, c, d, a, b, w2_t[1], MD4C01, MD4S12); + MD4_STEP (MD4_Go, b, c, d, a, w3_t[1], MD4C01, MD4S13); + MD4_STEP (MD4_Go, a, b, c, d, w0_t[2], MD4C01, MD4S10); + MD4_STEP (MD4_Go, d, a, b, c, w1_t[2], MD4C01, MD4S11); + MD4_STEP (MD4_Go, c, d, a, b, w2_t[2], MD4C01, MD4S12); + MD4_STEP (MD4_Go, b, c, d, a, w3_t[2], MD4C01, MD4S13); + MD4_STEP (MD4_Go, a, b, c, d, w0_t[3], MD4C01, MD4S10); + MD4_STEP (MD4_Go, d, a, b, c, w1_t[3], MD4C01, MD4S11); + MD4_STEP (MD4_Go, c, d, a, b, w2_t[3], MD4C01, MD4S12); + MD4_STEP (MD4_Go, b, c, d, a, w3_t[3], MD4C01, MD4S13); + + MD4_STEP (MD4_H , a, b, c, d, w0_t[0], MD4C02, MD4S20); + MD4_STEP (MD4_H , d, a, b, c, w2_t[0], MD4C02, MD4S21); + MD4_STEP (MD4_H , c, d, a, b, w1_t[0], MD4C02, MD4S22); + MD4_STEP (MD4_H , b, c, d, a, w3_t[0], MD4C02, MD4S23); + MD4_STEP (MD4_H , a, b, c, d, w0_t[2], MD4C02, MD4S20); + MD4_STEP (MD4_H , d, a, b, c, w2_t[2], MD4C02, MD4S21); + MD4_STEP (MD4_H , c, d, a, b, w1_t[2], MD4C02, MD4S22); + MD4_STEP (MD4_H , b, c, d, a, w3_t[2], MD4C02, MD4S23); + MD4_STEP (MD4_H , a, b, c, d, w0_t[1], MD4C02, MD4S20); + MD4_STEP (MD4_H , d, a, b, c, w2_t[1], MD4C02, MD4S21); + MD4_STEP (MD4_H , c, d, a, b, w1_t[1], MD4C02, MD4S22); + MD4_STEP (MD4_H , b, c, d, a, w3_t[1], MD4C02, MD4S23); + MD4_STEP (MD4_H , a, b, c, d, w0_t[3], MD4C02, MD4S20); + MD4_STEP (MD4_H , d, a, b, c, w2_t[3], MD4C02, MD4S21); + + if (s2 != ((d + MD4M_D) >> 16)) continue; + + MD4_STEP (MD4_H , c, d, a, b, w1_t[3], MD4C02, MD4S22); + MD4_STEP (MD4_H , b, c, d, a, w3_t[3], MD4C02, MD4S23); + + a += MD4M_A; + b += MD4M_B; + c += MD4M_C; + d += MD4M_D; + + /** + * DES1 + */ + + u32x key[2]; + + transform_netntlmv1_key (a, b, key); + + u32x Kc[16]; + u32x Kd[16]; + + _des_crypt_keysetup (key[0], key[1], Kc, Kd, s_skb); + + u32x iv1[2]; + + _des_crypt_encrypt (iv1, data, Kc, Kd, s_SPtrans); + + /** + * DES2 + */ + + transform_netntlmv1_key (((b >> 24) | (c << 8)), ((c >> 24) | (d << 8)), key); + + _des_crypt_keysetup (key[0], key[1], Kc, Kd, s_skb); + + u32x iv2[2]; + + _des_crypt_encrypt (iv2, data, Kc, Kd, s_SPtrans); + + /** + * compare + */ + + const u32x r0 = iv1[0]; + const u32x r1 = iv1[1]; + const u32x r2 = iv2[0]; + const u32x r3 = iv2[1]; + + #include VECT_COMPARE_M + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m05500_m08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m05500_m16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m05500_s04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + u32x pw_buf1[4]; + + pw_buf1[0] = pws[gid].i[ 4]; + pw_buf1[1] = pws[gid].i[ 5]; + pw_buf1[2] = pws[gid].i[ 6]; + pw_buf1[3] = pws[gid].i[ 7]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * sbox, kbox + */ + + __shared__ u32 s_SPtrans[8][64]; + __shared__ u32 s_skb[8][64]; + + if (lid < 64) + { + s_SPtrans[0][lid] = c_SPtrans[0][lid]; + s_SPtrans[1][lid] = c_SPtrans[1][lid]; + s_SPtrans[2][lid] = c_SPtrans[2][lid]; + s_SPtrans[3][lid] = c_SPtrans[3][lid]; + s_SPtrans[4][lid] = c_SPtrans[4][lid]; + s_SPtrans[5][lid] = c_SPtrans[5][lid]; + s_SPtrans[6][lid] = c_SPtrans[6][lid]; + s_SPtrans[7][lid] = c_SPtrans[7][lid]; + + s_skb[0][lid] = c_skb[0][lid]; + s_skb[1][lid] = c_skb[1][lid]; + s_skb[2][lid] = c_skb[2][lid]; + s_skb[3][lid] = c_skb[3][lid]; + s_skb[4][lid] = c_skb[4][lid]; + s_skb[5][lid] = c_skb[5][lid]; + s_skb[6][lid] = c_skb[6][lid]; + s_skb[7][lid] = c_skb[7][lid]; + } + + __syncthreads (); + + if (gid >= gid_max) return; + + /** + * salt + */ + + const u32 s0 = salt_bufs[salt_pos].salt_buf[0]; + const u32 s1 = salt_bufs[salt_pos].salt_buf[1]; + const u32 s2 = salt_bufs[salt_pos].salt_buf[2]; + + u32x data[2]; + + data[0] = s0; + data[1] = s1; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + + w0[0] = pw_buf0[0]; + w0[1] = pw_buf0[1]; + w0[2] = pw_buf0[2]; + w0[3] = pw_buf0[3]; + + u32x w1[4]; + + w1[0] = pw_buf1[0]; + w1[1] = pw_buf1[1]; + w1[2] = pw_buf1[2]; + w1[3] = pw_buf1[3]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 out_len = apply_rules (c_rules[il_pos].cmds, w0, w1, pw_len); + + append_0x80_2 (w0, w1, out_len); + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + make_unicode (w0, w0_t, w1_t); + make_unicode (w1, w2_t, w3_t); + + w3_t[2] = out_len * 8 * 2; + + u32x a = MD4M_A; + u32x b = MD4M_B; + u32x c = MD4M_C; + u32x d = MD4M_D; + + MD4_STEP (MD4_Fo, a, b, c, d, w0_t[0], MD4C00, MD4S00); + MD4_STEP (MD4_Fo, d, a, b, c, w0_t[1], MD4C00, MD4S01); + MD4_STEP (MD4_Fo, c, d, a, b, w0_t[2], MD4C00, MD4S02); + MD4_STEP (MD4_Fo, b, c, d, a, w0_t[3], MD4C00, MD4S03); + MD4_STEP (MD4_Fo, a, b, c, d, w1_t[0], MD4C00, MD4S00); + MD4_STEP (MD4_Fo, d, a, b, c, w1_t[1], MD4C00, MD4S01); + MD4_STEP (MD4_Fo, c, d, a, b, w1_t[2], MD4C00, MD4S02); + MD4_STEP (MD4_Fo, b, c, d, a, w1_t[3], MD4C00, MD4S03); + MD4_STEP (MD4_Fo, a, b, c, d, w2_t[0], MD4C00, MD4S00); + MD4_STEP (MD4_Fo, d, a, b, c, w2_t[1], MD4C00, MD4S01); + MD4_STEP (MD4_Fo, c, d, a, b, w2_t[2], MD4C00, MD4S02); + MD4_STEP (MD4_Fo, b, c, d, a, w2_t[3], MD4C00, MD4S03); + MD4_STEP (MD4_Fo, a, b, c, d, w3_t[0], MD4C00, MD4S00); + MD4_STEP (MD4_Fo, d, a, b, c, w3_t[1], MD4C00, MD4S01); + MD4_STEP (MD4_Fo, c, d, a, b, w3_t[2], MD4C00, MD4S02); + MD4_STEP (MD4_Fo, b, c, d, a, w3_t[3], MD4C00, MD4S03); + + MD4_STEP (MD4_Go, a, b, c, d, w0_t[0], MD4C01, MD4S10); + MD4_STEP (MD4_Go, d, a, b, c, w1_t[0], MD4C01, MD4S11); + MD4_STEP (MD4_Go, c, d, a, b, w2_t[0], MD4C01, MD4S12); + MD4_STEP (MD4_Go, b, c, d, a, w3_t[0], MD4C01, MD4S13); + MD4_STEP (MD4_Go, a, b, c, d, w0_t[1], MD4C01, MD4S10); + MD4_STEP (MD4_Go, d, a, b, c, w1_t[1], MD4C01, MD4S11); + MD4_STEP (MD4_Go, c, d, a, b, w2_t[1], MD4C01, MD4S12); + MD4_STEP (MD4_Go, b, c, d, a, w3_t[1], MD4C01, MD4S13); + MD4_STEP (MD4_Go, a, b, c, d, w0_t[2], MD4C01, MD4S10); + MD4_STEP (MD4_Go, d, a, b, c, w1_t[2], MD4C01, MD4S11); + MD4_STEP (MD4_Go, c, d, a, b, w2_t[2], MD4C01, MD4S12); + MD4_STEP (MD4_Go, b, c, d, a, w3_t[2], MD4C01, MD4S13); + MD4_STEP (MD4_Go, a, b, c, d, w0_t[3], MD4C01, MD4S10); + MD4_STEP (MD4_Go, d, a, b, c, w1_t[3], MD4C01, MD4S11); + MD4_STEP (MD4_Go, c, d, a, b, w2_t[3], MD4C01, MD4S12); + MD4_STEP (MD4_Go, b, c, d, a, w3_t[3], MD4C01, MD4S13); + + MD4_STEP (MD4_H , a, b, c, d, w0_t[0], MD4C02, MD4S20); + MD4_STEP (MD4_H , d, a, b, c, w2_t[0], MD4C02, MD4S21); + MD4_STEP (MD4_H , c, d, a, b, w1_t[0], MD4C02, MD4S22); + MD4_STEP (MD4_H , b, c, d, a, w3_t[0], MD4C02, MD4S23); + MD4_STEP (MD4_H , a, b, c, d, w0_t[2], MD4C02, MD4S20); + MD4_STEP (MD4_H , d, a, b, c, w2_t[2], MD4C02, MD4S21); + MD4_STEP (MD4_H , c, d, a, b, w1_t[2], MD4C02, MD4S22); + MD4_STEP (MD4_H , b, c, d, a, w3_t[2], MD4C02, MD4S23); + MD4_STEP (MD4_H , a, b, c, d, w0_t[1], MD4C02, MD4S20); + MD4_STEP (MD4_H , d, a, b, c, w2_t[1], MD4C02, MD4S21); + MD4_STEP (MD4_H , c, d, a, b, w1_t[1], MD4C02, MD4S22); + MD4_STEP (MD4_H , b, c, d, a, w3_t[1], MD4C02, MD4S23); + MD4_STEP (MD4_H , a, b, c, d, w0_t[3], MD4C02, MD4S20); + MD4_STEP (MD4_H , d, a, b, c, w2_t[3], MD4C02, MD4S21); + + if (s2 != ((d + MD4M_D) >> 16)) continue; + + MD4_STEP (MD4_H , c, d, a, b, w1_t[3], MD4C02, MD4S22); + MD4_STEP (MD4_H , b, c, d, a, w3_t[3], MD4C02, MD4S23); + + a += MD4M_A; + b += MD4M_B; + c += MD4M_C; + d += MD4M_D; + + /** + * DES1 + */ + + u32x key[2]; + + transform_netntlmv1_key (a, b, key); + + u32x Kc[16]; + u32x Kd[16]; + + _des_crypt_keysetup (key[0], key[1], Kc, Kd, s_skb); + + u32x iv1[2]; + + _des_crypt_encrypt (iv1, data, Kc, Kd, s_SPtrans); + + /** + * DES2 + */ + + transform_netntlmv1_key (((b >> 24) | (c << 8)), ((c >> 24) | (d << 8)), key); + + _des_crypt_keysetup (key[0], key[1], Kc, Kd, s_skb); + + u32x iv2[2]; + + _des_crypt_encrypt (iv2, data, Kc, Kd, s_SPtrans); + + /** + * compare + */ + + const u32x r0 = iv1[0]; + const u32x r1 = iv1[1]; + const u32x r2 = iv2[0]; + const u32x r3 = iv2[1]; + + #include VECT_COMPARE_S + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m05500_s08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m05500_s16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/nv/m05500_a1.cu b/nv/m05500_a1.cu new file mode 100644 index 0000000000..a913468cf2 --- /dev/null +++ b/nv/m05500_a1.cu @@ -0,0 +1,1065 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _MD4_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW2 +#define VECT_SIZE1 +#endif + +#define DGST_R0 0 +#define DGST_R1 1 +#define DGST_R2 2 +#define DGST_R3 3 + +#include "include/kernel_functions.c" +#include "types_nv.c" +#include "common_nv.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#define PERM_OP(a,b,tt,n,m) \ +{ \ + tt = a >> n; \ + tt = tt ^ b; \ + tt = tt & m; \ + b = b ^ tt; \ + tt = tt << n; \ + a = a ^ tt; \ +} + +#define HPERM_OP(a,tt,n,m) \ +{ \ + tt = a << (16 + n); \ + tt = tt ^ a; \ + tt = tt & m; \ + a = a ^ tt; \ + tt = tt >> (16 + n); \ + a = a ^ tt; \ +} + +__device__ __constant__ u32 c_SPtrans[8][64] = +{ + /* nibble 0 */ + 0x02080800, 0x00080000, 0x02000002, 0x02080802, + 0x02000000, 0x00080802, 0x00080002, 0x02000002, + 0x00080802, 0x02080800, 0x02080000, 0x00000802, + 0x02000802, 0x02000000, 0x00000000, 0x00080002, + 0x00080000, 0x00000002, 0x02000800, 0x00080800, + 0x02080802, 0x02080000, 0x00000802, 0x02000800, + 0x00000002, 0x00000800, 0x00080800, 0x02080002, + 0x00000800, 0x02000802, 0x02080002, 0x00000000, + 0x00000000, 0x02080802, 0x02000800, 0x00080002, + 0x02080800, 0x00080000, 0x00000802, 0x02000800, + 0x02080002, 0x00000800, 0x00080800, 0x02000002, + 0x00080802, 0x00000002, 0x02000002, 0x02080000, + 0x02080802, 0x00080800, 0x02080000, 0x02000802, + 0x02000000, 0x00000802, 0x00080002, 0x00000000, + 0x00080000, 0x02000000, 0x02000802, 0x02080800, + 0x00000002, 0x02080002, 0x00000800, 0x00080802, + /* nibble 1 */ + 0x40108010, 0x00000000, 0x00108000, 0x40100000, + 0x40000010, 0x00008010, 0x40008000, 0x00108000, + 0x00008000, 0x40100010, 0x00000010, 0x40008000, + 0x00100010, 0x40108000, 0x40100000, 0x00000010, + 0x00100000, 0x40008010, 0x40100010, 0x00008000, + 0x00108010, 0x40000000, 0x00000000, 0x00100010, + 0x40008010, 0x00108010, 0x40108000, 0x40000010, + 0x40000000, 0x00100000, 0x00008010, 0x40108010, + 0x00100010, 0x40108000, 0x40008000, 0x00108010, + 0x40108010, 0x00100010, 0x40000010, 0x00000000, + 0x40000000, 0x00008010, 0x00100000, 0x40100010, + 0x00008000, 0x40000000, 0x00108010, 0x40008010, + 0x40108000, 0x00008000, 0x00000000, 0x40000010, + 0x00000010, 0x40108010, 0x00108000, 0x40100000, + 0x40100010, 0x00100000, 0x00008010, 0x40008000, + 0x40008010, 0x00000010, 0x40100000, 0x00108000, + /* nibble 2 */ + 0x04000001, 0x04040100, 0x00000100, 0x04000101, + 0x00040001, 0x04000000, 0x04000101, 0x00040100, + 0x04000100, 0x00040000, 0x04040000, 0x00000001, + 0x04040101, 0x00000101, 0x00000001, 0x04040001, + 0x00000000, 0x00040001, 0x04040100, 0x00000100, + 0x00000101, 0x04040101, 0x00040000, 0x04000001, + 0x04040001, 0x04000100, 0x00040101, 0x04040000, + 0x00040100, 0x00000000, 0x04000000, 0x00040101, + 0x04040100, 0x00000100, 0x00000001, 0x00040000, + 0x00000101, 0x00040001, 0x04040000, 0x04000101, + 0x00000000, 0x04040100, 0x00040100, 0x04040001, + 0x00040001, 0x04000000, 0x04040101, 0x00000001, + 0x00040101, 0x04000001, 0x04000000, 0x04040101, + 0x00040000, 0x04000100, 0x04000101, 0x00040100, + 0x04000100, 0x00000000, 0x04040001, 0x00000101, + 0x04000001, 0x00040101, 0x00000100, 0x04040000, + /* nibble 3 */ + 0x00401008, 0x10001000, 0x00000008, 0x10401008, + 0x00000000, 0x10400000, 0x10001008, 0x00400008, + 0x10401000, 0x10000008, 0x10000000, 0x00001008, + 0x10000008, 0x00401008, 0x00400000, 0x10000000, + 0x10400008, 0x00401000, 0x00001000, 0x00000008, + 0x00401000, 0x10001008, 0x10400000, 0x00001000, + 0x00001008, 0x00000000, 0x00400008, 0x10401000, + 0x10001000, 0x10400008, 0x10401008, 0x00400000, + 0x10400008, 0x00001008, 0x00400000, 0x10000008, + 0x00401000, 0x10001000, 0x00000008, 0x10400000, + 0x10001008, 0x00000000, 0x00001000, 0x00400008, + 0x00000000, 0x10400008, 0x10401000, 0x00001000, + 0x10000000, 0x10401008, 0x00401008, 0x00400000, + 0x10401008, 0x00000008, 0x10001000, 0x00401008, + 0x00400008, 0x00401000, 0x10400000, 0x10001008, + 0x00001008, 0x10000000, 0x10000008, 0x10401000, + /* nibble 4 */ + 0x08000000, 0x00010000, 0x00000400, 0x08010420, + 0x08010020, 0x08000400, 0x00010420, 0x08010000, + 0x00010000, 0x00000020, 0x08000020, 0x00010400, + 0x08000420, 0x08010020, 0x08010400, 0x00000000, + 0x00010400, 0x08000000, 0x00010020, 0x00000420, + 0x08000400, 0x00010420, 0x00000000, 0x08000020, + 0x00000020, 0x08000420, 0x08010420, 0x00010020, + 0x08010000, 0x00000400, 0x00000420, 0x08010400, + 0x08010400, 0x08000420, 0x00010020, 0x08010000, + 0x00010000, 0x00000020, 0x08000020, 0x08000400, + 0x08000000, 0x00010400, 0x08010420, 0x00000000, + 0x00010420, 0x08000000, 0x00000400, 0x00010020, + 0x08000420, 0x00000400, 0x00000000, 0x08010420, + 0x08010020, 0x08010400, 0x00000420, 0x00010000, + 0x00010400, 0x08010020, 0x08000400, 0x00000420, + 0x00000020, 0x00010420, 0x08010000, 0x08000020, + /* nibble 5 */ + 0x80000040, 0x00200040, 0x00000000, 0x80202000, + 0x00200040, 0x00002000, 0x80002040, 0x00200000, + 0x00002040, 0x80202040, 0x00202000, 0x80000000, + 0x80002000, 0x80000040, 0x80200000, 0x00202040, + 0x00200000, 0x80002040, 0x80200040, 0x00000000, + 0x00002000, 0x00000040, 0x80202000, 0x80200040, + 0x80202040, 0x80200000, 0x80000000, 0x00002040, + 0x00000040, 0x00202000, 0x00202040, 0x80002000, + 0x00002040, 0x80000000, 0x80002000, 0x00202040, + 0x80202000, 0x00200040, 0x00000000, 0x80002000, + 0x80000000, 0x00002000, 0x80200040, 0x00200000, + 0x00200040, 0x80202040, 0x00202000, 0x00000040, + 0x80202040, 0x00202000, 0x00200000, 0x80002040, + 0x80000040, 0x80200000, 0x00202040, 0x00000000, + 0x00002000, 0x80000040, 0x80002040, 0x80202000, + 0x80200000, 0x00002040, 0x00000040, 0x80200040, + /* nibble 6 */ + 0x00004000, 0x00000200, 0x01000200, 0x01000004, + 0x01004204, 0x00004004, 0x00004200, 0x00000000, + 0x01000000, 0x01000204, 0x00000204, 0x01004000, + 0x00000004, 0x01004200, 0x01004000, 0x00000204, + 0x01000204, 0x00004000, 0x00004004, 0x01004204, + 0x00000000, 0x01000200, 0x01000004, 0x00004200, + 0x01004004, 0x00004204, 0x01004200, 0x00000004, + 0x00004204, 0x01004004, 0x00000200, 0x01000000, + 0x00004204, 0x01004000, 0x01004004, 0x00000204, + 0x00004000, 0x00000200, 0x01000000, 0x01004004, + 0x01000204, 0x00004204, 0x00004200, 0x00000000, + 0x00000200, 0x01000004, 0x00000004, 0x01000200, + 0x00000000, 0x01000204, 0x01000200, 0x00004200, + 0x00000204, 0x00004000, 0x01004204, 0x01000000, + 0x01004200, 0x00000004, 0x00004004, 0x01004204, + 0x01000004, 0x01004200, 0x01004000, 0x00004004, + /* nibble 7 */ + 0x20800080, 0x20820000, 0x00020080, 0x00000000, + 0x20020000, 0x00800080, 0x20800000, 0x20820080, + 0x00000080, 0x20000000, 0x00820000, 0x00020080, + 0x00820080, 0x20020080, 0x20000080, 0x20800000, + 0x00020000, 0x00820080, 0x00800080, 0x20020000, + 0x20820080, 0x20000080, 0x00000000, 0x00820000, + 0x20000000, 0x00800000, 0x20020080, 0x20800080, + 0x00800000, 0x00020000, 0x20820000, 0x00000080, + 0x00800000, 0x00020000, 0x20000080, 0x20820080, + 0x00020080, 0x20000000, 0x00000000, 0x00820000, + 0x20800080, 0x20020080, 0x20020000, 0x00800080, + 0x20820000, 0x00000080, 0x00800080, 0x20020000, + 0x20820080, 0x00800000, 0x20800000, 0x20000080, + 0x00820000, 0x00020080, 0x20020080, 0x20800000, + 0x00000080, 0x20820000, 0x00820080, 0x00000000, + 0x20000000, 0x20800080, 0x00020000, 0x00820080, +}; + +__device__ __constant__ u32 c_skb[8][64] = +{ + /* for C bits (numbered as per FIPS 46) 1 2 3 4 5 6 */ + 0x00000000, 0x00000010, 0x20000000, 0x20000010, + 0x00010000, 0x00010010, 0x20010000, 0x20010010, + 0x00000800, 0x00000810, 0x20000800, 0x20000810, + 0x00010800, 0x00010810, 0x20010800, 0x20010810, + 0x00000020, 0x00000030, 0x20000020, 0x20000030, + 0x00010020, 0x00010030, 0x20010020, 0x20010030, + 0x00000820, 0x00000830, 0x20000820, 0x20000830, + 0x00010820, 0x00010830, 0x20010820, 0x20010830, + 0x00080000, 0x00080010, 0x20080000, 0x20080010, + 0x00090000, 0x00090010, 0x20090000, 0x20090010, + 0x00080800, 0x00080810, 0x20080800, 0x20080810, + 0x00090800, 0x00090810, 0x20090800, 0x20090810, + 0x00080020, 0x00080030, 0x20080020, 0x20080030, + 0x00090020, 0x00090030, 0x20090020, 0x20090030, + 0x00080820, 0x00080830, 0x20080820, 0x20080830, + 0x00090820, 0x00090830, 0x20090820, 0x20090830, + /* for C bits (numbered as per FIPS 46) 7 8 10 11 12 13 */ + 0x00000000, 0x02000000, 0x00002000, 0x02002000, + 0x00200000, 0x02200000, 0x00202000, 0x02202000, + 0x00000004, 0x02000004, 0x00002004, 0x02002004, + 0x00200004, 0x02200004, 0x00202004, 0x02202004, + 0x00000400, 0x02000400, 0x00002400, 0x02002400, + 0x00200400, 0x02200400, 0x00202400, 0x02202400, + 0x00000404, 0x02000404, 0x00002404, 0x02002404, + 0x00200404, 0x02200404, 0x00202404, 0x02202404, + 0x10000000, 0x12000000, 0x10002000, 0x12002000, + 0x10200000, 0x12200000, 0x10202000, 0x12202000, + 0x10000004, 0x12000004, 0x10002004, 0x12002004, + 0x10200004, 0x12200004, 0x10202004, 0x12202004, + 0x10000400, 0x12000400, 0x10002400, 0x12002400, + 0x10200400, 0x12200400, 0x10202400, 0x12202400, + 0x10000404, 0x12000404, 0x10002404, 0x12002404, + 0x10200404, 0x12200404, 0x10202404, 0x12202404, + /* for C bits (numbered as per FIPS 46) 14 15 16 17 19 20 */ + 0x00000000, 0x00000001, 0x00040000, 0x00040001, + 0x01000000, 0x01000001, 0x01040000, 0x01040001, + 0x00000002, 0x00000003, 0x00040002, 0x00040003, + 0x01000002, 0x01000003, 0x01040002, 0x01040003, + 0x00000200, 0x00000201, 0x00040200, 0x00040201, + 0x01000200, 0x01000201, 0x01040200, 0x01040201, + 0x00000202, 0x00000203, 0x00040202, 0x00040203, + 0x01000202, 0x01000203, 0x01040202, 0x01040203, + 0x08000000, 0x08000001, 0x08040000, 0x08040001, + 0x09000000, 0x09000001, 0x09040000, 0x09040001, + 0x08000002, 0x08000003, 0x08040002, 0x08040003, + 0x09000002, 0x09000003, 0x09040002, 0x09040003, + 0x08000200, 0x08000201, 0x08040200, 0x08040201, + 0x09000200, 0x09000201, 0x09040200, 0x09040201, + 0x08000202, 0x08000203, 0x08040202, 0x08040203, + 0x09000202, 0x09000203, 0x09040202, 0x09040203, + /* for C bits (numbered as per FIPS 46) 21 23 24 26 27 28 */ + 0x00000000, 0x00100000, 0x00000100, 0x00100100, + 0x00000008, 0x00100008, 0x00000108, 0x00100108, + 0x00001000, 0x00101000, 0x00001100, 0x00101100, + 0x00001008, 0x00101008, 0x00001108, 0x00101108, + 0x04000000, 0x04100000, 0x04000100, 0x04100100, + 0x04000008, 0x04100008, 0x04000108, 0x04100108, + 0x04001000, 0x04101000, 0x04001100, 0x04101100, + 0x04001008, 0x04101008, 0x04001108, 0x04101108, + 0x00020000, 0x00120000, 0x00020100, 0x00120100, + 0x00020008, 0x00120008, 0x00020108, 0x00120108, + 0x00021000, 0x00121000, 0x00021100, 0x00121100, + 0x00021008, 0x00121008, 0x00021108, 0x00121108, + 0x04020000, 0x04120000, 0x04020100, 0x04120100, + 0x04020008, 0x04120008, 0x04020108, 0x04120108, + 0x04021000, 0x04121000, 0x04021100, 0x04121100, + 0x04021008, 0x04121008, 0x04021108, 0x04121108, + /* for D bits (numbered as per FIPS 46) 1 2 3 4 5 6 */ + 0x00000000, 0x10000000, 0x00010000, 0x10010000, + 0x00000004, 0x10000004, 0x00010004, 0x10010004, + 0x20000000, 0x30000000, 0x20010000, 0x30010000, + 0x20000004, 0x30000004, 0x20010004, 0x30010004, + 0x00100000, 0x10100000, 0x00110000, 0x10110000, + 0x00100004, 0x10100004, 0x00110004, 0x10110004, + 0x20100000, 0x30100000, 0x20110000, 0x30110000, + 0x20100004, 0x30100004, 0x20110004, 0x30110004, + 0x00001000, 0x10001000, 0x00011000, 0x10011000, + 0x00001004, 0x10001004, 0x00011004, 0x10011004, + 0x20001000, 0x30001000, 0x20011000, 0x30011000, + 0x20001004, 0x30001004, 0x20011004, 0x30011004, + 0x00101000, 0x10101000, 0x00111000, 0x10111000, + 0x00101004, 0x10101004, 0x00111004, 0x10111004, + 0x20101000, 0x30101000, 0x20111000, 0x30111000, + 0x20101004, 0x30101004, 0x20111004, 0x30111004, + /* for D bits (numbered as per FIPS 46) 8 9 11 12 13 14 */ + 0x00000000, 0x08000000, 0x00000008, 0x08000008, + 0x00000400, 0x08000400, 0x00000408, 0x08000408, + 0x00020000, 0x08020000, 0x00020008, 0x08020008, + 0x00020400, 0x08020400, 0x00020408, 0x08020408, + 0x00000001, 0x08000001, 0x00000009, 0x08000009, + 0x00000401, 0x08000401, 0x00000409, 0x08000409, + 0x00020001, 0x08020001, 0x00020009, 0x08020009, + 0x00020401, 0x08020401, 0x00020409, 0x08020409, + 0x02000000, 0x0A000000, 0x02000008, 0x0A000008, + 0x02000400, 0x0A000400, 0x02000408, 0x0A000408, + 0x02020000, 0x0A020000, 0x02020008, 0x0A020008, + 0x02020400, 0x0A020400, 0x02020408, 0x0A020408, + 0x02000001, 0x0A000001, 0x02000009, 0x0A000009, + 0x02000401, 0x0A000401, 0x02000409, 0x0A000409, + 0x02020001, 0x0A020001, 0x02020009, 0x0A020009, + 0x02020401, 0x0A020401, 0x02020409, 0x0A020409, + /* for D bits (numbered as per FIPS 46) 16 17 18 19 20 21 */ + 0x00000000, 0x00000100, 0x00080000, 0x00080100, + 0x01000000, 0x01000100, 0x01080000, 0x01080100, + 0x00000010, 0x00000110, 0x00080010, 0x00080110, + 0x01000010, 0x01000110, 0x01080010, 0x01080110, + 0x00200000, 0x00200100, 0x00280000, 0x00280100, + 0x01200000, 0x01200100, 0x01280000, 0x01280100, + 0x00200010, 0x00200110, 0x00280010, 0x00280110, + 0x01200010, 0x01200110, 0x01280010, 0x01280110, + 0x00000200, 0x00000300, 0x00080200, 0x00080300, + 0x01000200, 0x01000300, 0x01080200, 0x01080300, + 0x00000210, 0x00000310, 0x00080210, 0x00080310, + 0x01000210, 0x01000310, 0x01080210, 0x01080310, + 0x00200200, 0x00200300, 0x00280200, 0x00280300, + 0x01200200, 0x01200300, 0x01280200, 0x01280300, + 0x00200210, 0x00200310, 0x00280210, 0x00280310, + 0x01200210, 0x01200310, 0x01280210, 0x01280310, + /* for D bits (numbered as per FIPS 46) 22 23 24 25 27 28 */ + 0x00000000, 0x04000000, 0x00040000, 0x04040000, + 0x00000002, 0x04000002, 0x00040002, 0x04040002, + 0x00002000, 0x04002000, 0x00042000, 0x04042000, + 0x00002002, 0x04002002, 0x00042002, 0x04042002, + 0x00000020, 0x04000020, 0x00040020, 0x04040020, + 0x00000022, 0x04000022, 0x00040022, 0x04040022, + 0x00002020, 0x04002020, 0x00042020, 0x04042020, + 0x00002022, 0x04002022, 0x00042022, 0x04042022, + 0x00000800, 0x04000800, 0x00040800, 0x04040800, + 0x00000802, 0x04000802, 0x00040802, 0x04040802, + 0x00002800, 0x04002800, 0x00042800, 0x04042800, + 0x00002802, 0x04002802, 0x00042802, 0x04042802, + 0x00000820, 0x04000820, 0x00040820, 0x04040820, + 0x00000822, 0x04000822, 0x00040822, 0x04040822, + 0x00002820, 0x04002820, 0x00042820, 0x04042820, + 0x00002822, 0x04002822, 0x00042822, 0x04042822 +}; + +#ifdef VECT_SIZE1 +#define BOX(i,n,S) u32x ((S)[(n)][(i)]) +#endif + +#ifdef VECT_SIZE2 +#define BOX(i,n,S) u32x ((S)[(n)][(i).x], (S)[(n)][(i).y]) +#endif + +__device__ static void _des_crypt_encrypt (u32x iv[2], u32x data[2], u32x Kc[16], u32x Kd[16], u32 s_SPtrans[8][64]) +{ + u32x tt; + + u32x r = data[0]; + u32x l = data[1]; + + #pragma unroll 16 + for (u32 i = 0; i < 16; i++) + { + u32x u = Kc[i] ^ r; + u32x t = Kd[i] ^ rotl32 (r, 28u); + + l ^= BOX (((u >> 2) & 0x3f), 0, s_SPtrans) + | BOX (((u >> 10) & 0x3f), 2, s_SPtrans) + | BOX (((u >> 18) & 0x3f), 4, s_SPtrans) + | BOX (((u >> 26) & 0x3f), 6, s_SPtrans) + | BOX (((t >> 2) & 0x3f), 1, s_SPtrans) + | BOX (((t >> 10) & 0x3f), 3, s_SPtrans) + | BOX (((t >> 18) & 0x3f), 5, s_SPtrans) + | BOX (((t >> 26) & 0x3f), 7, s_SPtrans); + + tt = l; + l = r; + r = tt; + } + + iv[0] = l; + iv[1] = r; +} + +__device__ static void _des_crypt_keysetup (u32x c, u32x d, u32x Kc[16], u32x Kd[16], u32 s_skb[8][64]) +{ + u32x tt; + + PERM_OP (d, c, tt, 4, 0x0f0f0f0f); + HPERM_OP (c, tt, 2, 0xcccc0000); + HPERM_OP (d, tt, 2, 0xcccc0000); + PERM_OP (d, c, tt, 1, 0x55555555); + PERM_OP (c, d, tt, 8, 0x00ff00ff); + PERM_OP (d, c, tt, 1, 0x55555555); + + d = ((d & 0x000000ff) << 16) + | ((d & 0x0000ff00) << 0) + | ((d & 0x00ff0000) >> 16) + | ((c & 0xf0000000) >> 4); + + c = c & 0x0fffffff; + + #pragma unroll 16 + for (u32 i = 0; i < 16; i++) + { + const u32 shifts3s0[16] = { 1, 1, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 1 }; + const u32 shifts3s1[16] = { 27, 27, 26, 26, 26, 26, 26, 26, 27, 26, 26, 26, 26, 26, 26, 27 }; + + c = c >> shifts3s0[i] | c << shifts3s1[i]; + d = d >> shifts3s0[i] | d << shifts3s1[i]; + + c = c & 0x0fffffff; + d = d & 0x0fffffff; + + u32x s = BOX ((( c >> 0) & 0x3f), 0, s_skb) + | BOX ((((c >> 6) & 0x03) + | ((c >> 7) & 0x3c)), 1, s_skb) + | BOX ((((c >> 13) & 0x0f) + | ((c >> 14) & 0x30)), 2, s_skb) + | BOX ((((c >> 20) & 0x01) + | ((c >> 21) & 0x06) + | ((c >> 22) & 0x38)), 3, s_skb); + + u32x t = BOX ((( d >> 0) & 0x3f), 4, s_skb) + | BOX ((((d >> 7) & 0x03) + | ((d >> 8) & 0x3c)), 5, s_skb) + | BOX ((((d >> 15) & 0x3f)), 6, s_skb) + | BOX ((((d >> 21) & 0x0f) + | ((d >> 22) & 0x30)), 7, s_skb); + + #if __CUDA_ARCH__ >= 200 + Kc[i] = __byte_perm (s, t, 0x5410); + Kd[i] = __byte_perm (s, t, 0x7632); + #else + Kc[i] = ((t << 16) | (s & 0x0000ffff)); + Kd[i] = ((s >> 16) | (t & 0xffff0000)); + #endif + + Kc[i] = rotl32 (Kc[i], 2u); + Kd[i] = rotl32 (Kd[i], 2u); + } +} + +__device__ static void transform_netntlmv1_key (const u32x w0, const u32x w1, u32x out[2]) +{ + u32x t[8]; + + t[0] = (w0 >> 0) & 0xff; + t[1] = (w0 >> 8) & 0xff; + t[2] = (w0 >> 16) & 0xff; + t[3] = (w0 >> 24) & 0xff; + t[4] = (w1 >> 0) & 0xff; + t[5] = (w1 >> 8) & 0xff; + t[6] = (w1 >> 16) & 0xff; + t[7] = (w1 >> 24) & 0xff; + + u32x k[8]; + + k[0] = (t[0] >> 0); + k[1] = (t[0] << 7) | (t[1] >> 1); + k[2] = (t[1] << 6) | (t[2] >> 2); + k[3] = (t[2] << 5) | (t[3] >> 3); + k[4] = (t[3] << 4) | (t[4] >> 4); + k[5] = (t[4] << 3) | (t[5] >> 5); + k[6] = (t[5] << 2) | (t[6] >> 6); + k[7] = (t[6] << 1); + + out[0] = ((k[0] & 0xff) << 0) + | ((k[1] & 0xff) << 8) + | ((k[2] & 0xff) << 16) + | ((k[3] & 0xff) << 24); + + out[1] = ((k[4] & 0xff) << 0) + | ((k[5] & 0xff) << 8) + | ((k[6] & 0xff) << 16) + | ((k[7] & 0xff) << 24); +} + +__device__ __constant__ comb_t c_combs[1024]; + +extern "C" __global__ void __launch_bounds__ (256, 1) m05500_m04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + append_0x80_2 (wordl0, wordl1, pw_l_len); + + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, c_combs[0].pw_len); + } + + /** + * sbox, kbox + */ + + __shared__ u32 s_SPtrans[8][64]; + __shared__ u32 s_skb[8][64]; + + if (lid < 64) + { + s_SPtrans[0][lid] = c_SPtrans[0][lid]; + s_SPtrans[1][lid] = c_SPtrans[1][lid]; + s_SPtrans[2][lid] = c_SPtrans[2][lid]; + s_SPtrans[3][lid] = c_SPtrans[3][lid]; + s_SPtrans[4][lid] = c_SPtrans[4][lid]; + s_SPtrans[5][lid] = c_SPtrans[5][lid]; + s_SPtrans[6][lid] = c_SPtrans[6][lid]; + s_SPtrans[7][lid] = c_SPtrans[7][lid]; + + s_skb[0][lid] = c_skb[0][lid]; + s_skb[1][lid] = c_skb[1][lid]; + s_skb[2][lid] = c_skb[2][lid]; + s_skb[3][lid] = c_skb[3][lid]; + s_skb[4][lid] = c_skb[4][lid]; + s_skb[5][lid] = c_skb[5][lid]; + s_skb[6][lid] = c_skb[6][lid]; + s_skb[7][lid] = c_skb[7][lid]; + } + + __syncthreads (); + + if (gid >= gid_max) return; + + /** + * salt + */ + + const u32 s0 = salt_bufs[salt_pos].salt_buf[0]; + const u32 s1 = salt_bufs[salt_pos].salt_buf[1]; + const u32 s2 = salt_bufs[salt_pos].salt_buf[2]; + + u32x data[2]; + + data[0] = s0; + data[1] = s1; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = c_combs[il_pos].pw_len; + + const u32 pw_len = pw_l_len + pw_r_len; + + u32 wordr0[4]; + + wordr0[0] = c_combs[il_pos].i[0]; + wordr0[1] = c_combs[il_pos].i[1]; + wordr0[2] = c_combs[il_pos].i[2]; + wordr0[3] = c_combs[il_pos].i[3]; + + u32 wordr1[4]; + + wordr1[0] = c_combs[il_pos].i[4]; + wordr1[1] = c_combs[il_pos].i[5]; + wordr1[2] = c_combs[il_pos].i[6]; + wordr1[3] = c_combs[il_pos].i[7]; + + u32 wordr2[4]; + + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + + u32 wordr3[4]; + + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + u32x w0[4]; + + w0[0] = wordl0[0] | wordr0[0]; + w0[1] = wordl0[1] | wordr0[1]; + w0[2] = wordl0[2] | wordr0[2]; + w0[3] = wordl0[3] | wordr0[3]; + + u32x w1[4]; + + w1[0] = wordl1[0] | wordr1[0]; + w1[1] = wordl1[1] | wordr1[1]; + w1[2] = wordl1[2] | wordr1[2]; + w1[3] = wordl1[3] | wordr1[3]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + make_unicode (w0, w0_t, w1_t); + make_unicode (w1, w2_t, w3_t); + + w3_t[2] = pw_len * 8 * 2; + + u32x a = MD4M_A; + u32x b = MD4M_B; + u32x c = MD4M_C; + u32x d = MD4M_D; + + MD4_STEP (MD4_Fo, a, b, c, d, w0_t[0], MD4C00, MD4S00); + MD4_STEP (MD4_Fo, d, a, b, c, w0_t[1], MD4C00, MD4S01); + MD4_STEP (MD4_Fo, c, d, a, b, w0_t[2], MD4C00, MD4S02); + MD4_STEP (MD4_Fo, b, c, d, a, w0_t[3], MD4C00, MD4S03); + MD4_STEP (MD4_Fo, a, b, c, d, w1_t[0], MD4C00, MD4S00); + MD4_STEP (MD4_Fo, d, a, b, c, w1_t[1], MD4C00, MD4S01); + MD4_STEP (MD4_Fo, c, d, a, b, w1_t[2], MD4C00, MD4S02); + MD4_STEP (MD4_Fo, b, c, d, a, w1_t[3], MD4C00, MD4S03); + MD4_STEP (MD4_Fo, a, b, c, d, w2_t[0], MD4C00, MD4S00); + MD4_STEP (MD4_Fo, d, a, b, c, w2_t[1], MD4C00, MD4S01); + MD4_STEP (MD4_Fo, c, d, a, b, w2_t[2], MD4C00, MD4S02); + MD4_STEP (MD4_Fo, b, c, d, a, w2_t[3], MD4C00, MD4S03); + MD4_STEP (MD4_Fo, a, b, c, d, w3_t[0], MD4C00, MD4S00); + MD4_STEP (MD4_Fo, d, a, b, c, w3_t[1], MD4C00, MD4S01); + MD4_STEP (MD4_Fo, c, d, a, b, w3_t[2], MD4C00, MD4S02); + MD4_STEP (MD4_Fo, b, c, d, a, w3_t[3], MD4C00, MD4S03); + + MD4_STEP (MD4_Go, a, b, c, d, w0_t[0], MD4C01, MD4S10); + MD4_STEP (MD4_Go, d, a, b, c, w1_t[0], MD4C01, MD4S11); + MD4_STEP (MD4_Go, c, d, a, b, w2_t[0], MD4C01, MD4S12); + MD4_STEP (MD4_Go, b, c, d, a, w3_t[0], MD4C01, MD4S13); + MD4_STEP (MD4_Go, a, b, c, d, w0_t[1], MD4C01, MD4S10); + MD4_STEP (MD4_Go, d, a, b, c, w1_t[1], MD4C01, MD4S11); + MD4_STEP (MD4_Go, c, d, a, b, w2_t[1], MD4C01, MD4S12); + MD4_STEP (MD4_Go, b, c, d, a, w3_t[1], MD4C01, MD4S13); + MD4_STEP (MD4_Go, a, b, c, d, w0_t[2], MD4C01, MD4S10); + MD4_STEP (MD4_Go, d, a, b, c, w1_t[2], MD4C01, MD4S11); + MD4_STEP (MD4_Go, c, d, a, b, w2_t[2], MD4C01, MD4S12); + MD4_STEP (MD4_Go, b, c, d, a, w3_t[2], MD4C01, MD4S13); + MD4_STEP (MD4_Go, a, b, c, d, w0_t[3], MD4C01, MD4S10); + MD4_STEP (MD4_Go, d, a, b, c, w1_t[3], MD4C01, MD4S11); + MD4_STEP (MD4_Go, c, d, a, b, w2_t[3], MD4C01, MD4S12); + MD4_STEP (MD4_Go, b, c, d, a, w3_t[3], MD4C01, MD4S13); + + MD4_STEP (MD4_H , a, b, c, d, w0_t[0], MD4C02, MD4S20); + MD4_STEP (MD4_H , d, a, b, c, w2_t[0], MD4C02, MD4S21); + MD4_STEP (MD4_H , c, d, a, b, w1_t[0], MD4C02, MD4S22); + MD4_STEP (MD4_H , b, c, d, a, w3_t[0], MD4C02, MD4S23); + MD4_STEP (MD4_H , a, b, c, d, w0_t[2], MD4C02, MD4S20); + MD4_STEP (MD4_H , d, a, b, c, w2_t[2], MD4C02, MD4S21); + MD4_STEP (MD4_H , c, d, a, b, w1_t[2], MD4C02, MD4S22); + MD4_STEP (MD4_H , b, c, d, a, w3_t[2], MD4C02, MD4S23); + MD4_STEP (MD4_H , a, b, c, d, w0_t[1], MD4C02, MD4S20); + MD4_STEP (MD4_H , d, a, b, c, w2_t[1], MD4C02, MD4S21); + MD4_STEP (MD4_H , c, d, a, b, w1_t[1], MD4C02, MD4S22); + MD4_STEP (MD4_H , b, c, d, a, w3_t[1], MD4C02, MD4S23); + MD4_STEP (MD4_H , a, b, c, d, w0_t[3], MD4C02, MD4S20); + MD4_STEP (MD4_H , d, a, b, c, w2_t[3], MD4C02, MD4S21); + + if (s2 != ((d + MD4M_D) >> 16)) continue; + + MD4_STEP (MD4_H , c, d, a, b, w1_t[3], MD4C02, MD4S22); + MD4_STEP (MD4_H , b, c, d, a, w3_t[3], MD4C02, MD4S23); + + a += MD4M_A; + b += MD4M_B; + c += MD4M_C; + d += MD4M_D; + + /** + * DES1 + */ + + u32x key[2]; + + transform_netntlmv1_key (a, b, key); + + u32x Kc[16]; + u32x Kd[16]; + + _des_crypt_keysetup (key[0], key[1], Kc, Kd, s_skb); + + u32x iv1[2]; + + _des_crypt_encrypt (iv1, data, Kc, Kd, s_SPtrans); + + /** + * DES2 + */ + + transform_netntlmv1_key (((b >> 24) | (c << 8)), ((c >> 24) | (d << 8)), key); + + _des_crypt_keysetup (key[0], key[1], Kc, Kd, s_skb); + + u32x iv2[2]; + + _des_crypt_encrypt (iv2, data, Kc, Kd, s_SPtrans); + + /** + * compare + */ + + const u32x r0 = iv1[0]; + const u32x r1 = iv1[1]; + const u32x r2 = iv2[0]; + const u32x r3 = iv2[1]; + + #include VECT_COMPARE_M + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m05500_m08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m05500_m16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m05500_s04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + append_0x80_2 (wordl0, wordl1, pw_l_len); + + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, c_combs[0].pw_len); + } + + /** + * sbox, kbox + */ + + __shared__ u32 s_SPtrans[8][64]; + __shared__ u32 s_skb[8][64]; + + if (lid < 64) + { + s_SPtrans[0][lid] = c_SPtrans[0][lid]; + s_SPtrans[1][lid] = c_SPtrans[1][lid]; + s_SPtrans[2][lid] = c_SPtrans[2][lid]; + s_SPtrans[3][lid] = c_SPtrans[3][lid]; + s_SPtrans[4][lid] = c_SPtrans[4][lid]; + s_SPtrans[5][lid] = c_SPtrans[5][lid]; + s_SPtrans[6][lid] = c_SPtrans[6][lid]; + s_SPtrans[7][lid] = c_SPtrans[7][lid]; + + s_skb[0][lid] = c_skb[0][lid]; + s_skb[1][lid] = c_skb[1][lid]; + s_skb[2][lid] = c_skb[2][lid]; + s_skb[3][lid] = c_skb[3][lid]; + s_skb[4][lid] = c_skb[4][lid]; + s_skb[5][lid] = c_skb[5][lid]; + s_skb[6][lid] = c_skb[6][lid]; + s_skb[7][lid] = c_skb[7][lid]; + } + + __syncthreads (); + + if (gid >= gid_max) return; + + /** + * salt + */ + + const u32 s0 = salt_bufs[salt_pos].salt_buf[0]; + const u32 s1 = salt_bufs[salt_pos].salt_buf[1]; + const u32 s2 = salt_bufs[salt_pos].salt_buf[2]; + + u32x data[2]; + + data[0] = s0; + data[1] = s1; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = c_combs[il_pos].pw_len; + + const u32 pw_len = pw_l_len + pw_r_len; + + u32 wordr0[4]; + + wordr0[0] = c_combs[il_pos].i[0]; + wordr0[1] = c_combs[il_pos].i[1]; + wordr0[2] = c_combs[il_pos].i[2]; + wordr0[3] = c_combs[il_pos].i[3]; + + u32 wordr1[4]; + + wordr1[0] = c_combs[il_pos].i[4]; + wordr1[1] = c_combs[il_pos].i[5]; + wordr1[2] = c_combs[il_pos].i[6]; + wordr1[3] = c_combs[il_pos].i[7]; + + u32 wordr2[4]; + + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + + u32 wordr3[4]; + + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + u32x w0[4]; + + w0[0] = wordl0[0] | wordr0[0]; + w0[1] = wordl0[1] | wordr0[1]; + w0[2] = wordl0[2] | wordr0[2]; + w0[3] = wordl0[3] | wordr0[3]; + + u32x w1[4]; + + w1[0] = wordl1[0] | wordr1[0]; + w1[1] = wordl1[1] | wordr1[1]; + w1[2] = wordl1[2] | wordr1[2]; + w1[3] = wordl1[3] | wordr1[3]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + make_unicode (w0, w0_t, w1_t); + make_unicode (w1, w2_t, w3_t); + + w3_t[2] = pw_len * 8 * 2; + + u32x a = MD4M_A; + u32x b = MD4M_B; + u32x c = MD4M_C; + u32x d = MD4M_D; + + MD4_STEP (MD4_Fo, a, b, c, d, w0_t[0], MD4C00, MD4S00); + MD4_STEP (MD4_Fo, d, a, b, c, w0_t[1], MD4C00, MD4S01); + MD4_STEP (MD4_Fo, c, d, a, b, w0_t[2], MD4C00, MD4S02); + MD4_STEP (MD4_Fo, b, c, d, a, w0_t[3], MD4C00, MD4S03); + MD4_STEP (MD4_Fo, a, b, c, d, w1_t[0], MD4C00, MD4S00); + MD4_STEP (MD4_Fo, d, a, b, c, w1_t[1], MD4C00, MD4S01); + MD4_STEP (MD4_Fo, c, d, a, b, w1_t[2], MD4C00, MD4S02); + MD4_STEP (MD4_Fo, b, c, d, a, w1_t[3], MD4C00, MD4S03); + MD4_STEP (MD4_Fo, a, b, c, d, w2_t[0], MD4C00, MD4S00); + MD4_STEP (MD4_Fo, d, a, b, c, w2_t[1], MD4C00, MD4S01); + MD4_STEP (MD4_Fo, c, d, a, b, w2_t[2], MD4C00, MD4S02); + MD4_STEP (MD4_Fo, b, c, d, a, w2_t[3], MD4C00, MD4S03); + MD4_STEP (MD4_Fo, a, b, c, d, w3_t[0], MD4C00, MD4S00); + MD4_STEP (MD4_Fo, d, a, b, c, w3_t[1], MD4C00, MD4S01); + MD4_STEP (MD4_Fo, c, d, a, b, w3_t[2], MD4C00, MD4S02); + MD4_STEP (MD4_Fo, b, c, d, a, w3_t[3], MD4C00, MD4S03); + + MD4_STEP (MD4_Go, a, b, c, d, w0_t[0], MD4C01, MD4S10); + MD4_STEP (MD4_Go, d, a, b, c, w1_t[0], MD4C01, MD4S11); + MD4_STEP (MD4_Go, c, d, a, b, w2_t[0], MD4C01, MD4S12); + MD4_STEP (MD4_Go, b, c, d, a, w3_t[0], MD4C01, MD4S13); + MD4_STEP (MD4_Go, a, b, c, d, w0_t[1], MD4C01, MD4S10); + MD4_STEP (MD4_Go, d, a, b, c, w1_t[1], MD4C01, MD4S11); + MD4_STEP (MD4_Go, c, d, a, b, w2_t[1], MD4C01, MD4S12); + MD4_STEP (MD4_Go, b, c, d, a, w3_t[1], MD4C01, MD4S13); + MD4_STEP (MD4_Go, a, b, c, d, w0_t[2], MD4C01, MD4S10); + MD4_STEP (MD4_Go, d, a, b, c, w1_t[2], MD4C01, MD4S11); + MD4_STEP (MD4_Go, c, d, a, b, w2_t[2], MD4C01, MD4S12); + MD4_STEP (MD4_Go, b, c, d, a, w3_t[2], MD4C01, MD4S13); + MD4_STEP (MD4_Go, a, b, c, d, w0_t[3], MD4C01, MD4S10); + MD4_STEP (MD4_Go, d, a, b, c, w1_t[3], MD4C01, MD4S11); + MD4_STEP (MD4_Go, c, d, a, b, w2_t[3], MD4C01, MD4S12); + MD4_STEP (MD4_Go, b, c, d, a, w3_t[3], MD4C01, MD4S13); + + MD4_STEP (MD4_H , a, b, c, d, w0_t[0], MD4C02, MD4S20); + MD4_STEP (MD4_H , d, a, b, c, w2_t[0], MD4C02, MD4S21); + MD4_STEP (MD4_H , c, d, a, b, w1_t[0], MD4C02, MD4S22); + MD4_STEP (MD4_H , b, c, d, a, w3_t[0], MD4C02, MD4S23); + MD4_STEP (MD4_H , a, b, c, d, w0_t[2], MD4C02, MD4S20); + MD4_STEP (MD4_H , d, a, b, c, w2_t[2], MD4C02, MD4S21); + MD4_STEP (MD4_H , c, d, a, b, w1_t[2], MD4C02, MD4S22); + MD4_STEP (MD4_H , b, c, d, a, w3_t[2], MD4C02, MD4S23); + MD4_STEP (MD4_H , a, b, c, d, w0_t[1], MD4C02, MD4S20); + MD4_STEP (MD4_H , d, a, b, c, w2_t[1], MD4C02, MD4S21); + MD4_STEP (MD4_H , c, d, a, b, w1_t[1], MD4C02, MD4S22); + MD4_STEP (MD4_H , b, c, d, a, w3_t[1], MD4C02, MD4S23); + MD4_STEP (MD4_H , a, b, c, d, w0_t[3], MD4C02, MD4S20); + MD4_STEP (MD4_H , d, a, b, c, w2_t[3], MD4C02, MD4S21); + + if (s2 != ((d + MD4M_D) >> 16)) continue; + + MD4_STEP (MD4_H , c, d, a, b, w1_t[3], MD4C02, MD4S22); + MD4_STEP (MD4_H , b, c, d, a, w3_t[3], MD4C02, MD4S23); + + a += MD4M_A; + b += MD4M_B; + c += MD4M_C; + d += MD4M_D; + + /** + * DES1 + */ + + u32x key[2]; + + transform_netntlmv1_key (a, b, key); + + u32x Kc[16]; + u32x Kd[16]; + + _des_crypt_keysetup (key[0], key[1], Kc, Kd, s_skb); + + u32x iv1[2]; + + _des_crypt_encrypt (iv1, data, Kc, Kd, s_SPtrans); + + /** + * DES2 + */ + + transform_netntlmv1_key (((b >> 24) | (c << 8)), ((c >> 24) | (d << 8)), key); + + _des_crypt_keysetup (key[0], key[1], Kc, Kd, s_skb); + + u32x iv2[2]; + + _des_crypt_encrypt (iv2, data, Kc, Kd, s_SPtrans); + + /** + * compare + */ + + const u32x r0 = iv1[0]; + const u32x r1 = iv1[1]; + const u32x r2 = iv2[0]; + const u32x r3 = iv2[1]; + + #include VECT_COMPARE_S + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m05500_s08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m05500_s16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/nv/m05500_a3.cu b/nv/m05500_a3.cu new file mode 100644 index 0000000000..529014397d --- /dev/null +++ b/nv/m05500_a3.cu @@ -0,0 +1,1077 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _MD4_ +#define _SCALAR_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW2 +#define VECT_SIZE1 +#endif + +#define DGST_R0 0 +#define DGST_R1 1 +#define DGST_R2 2 +#define DGST_R3 3 + +#include "include/kernel_functions.c" +#include "types_nv.c" +#include "common_nv.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4_warp.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4_warp.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4_warp.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4_warp.c" +#endif + +#define PERM_OP(a,b,tt,n,m) \ +{ \ + tt = a >> n; \ + tt = tt ^ b; \ + tt = tt & m; \ + b = b ^ tt; \ + tt = tt << n; \ + a = a ^ tt; \ +} + +#define HPERM_OP(a,tt,n,m) \ +{ \ + tt = a << (16 + n); \ + tt = tt ^ a; \ + tt = tt & m; \ + a = a ^ tt; \ + tt = tt >> (16 + n); \ + a = a ^ tt; \ +} + +__device__ __constant__ u32 c_SPtrans[8][64] = +{ + /* nibble 0 */ + 0x02080800, 0x00080000, 0x02000002, 0x02080802, + 0x02000000, 0x00080802, 0x00080002, 0x02000002, + 0x00080802, 0x02080800, 0x02080000, 0x00000802, + 0x02000802, 0x02000000, 0x00000000, 0x00080002, + 0x00080000, 0x00000002, 0x02000800, 0x00080800, + 0x02080802, 0x02080000, 0x00000802, 0x02000800, + 0x00000002, 0x00000800, 0x00080800, 0x02080002, + 0x00000800, 0x02000802, 0x02080002, 0x00000000, + 0x00000000, 0x02080802, 0x02000800, 0x00080002, + 0x02080800, 0x00080000, 0x00000802, 0x02000800, + 0x02080002, 0x00000800, 0x00080800, 0x02000002, + 0x00080802, 0x00000002, 0x02000002, 0x02080000, + 0x02080802, 0x00080800, 0x02080000, 0x02000802, + 0x02000000, 0x00000802, 0x00080002, 0x00000000, + 0x00080000, 0x02000000, 0x02000802, 0x02080800, + 0x00000002, 0x02080002, 0x00000800, 0x00080802, + /* nibble 1 */ + 0x40108010, 0x00000000, 0x00108000, 0x40100000, + 0x40000010, 0x00008010, 0x40008000, 0x00108000, + 0x00008000, 0x40100010, 0x00000010, 0x40008000, + 0x00100010, 0x40108000, 0x40100000, 0x00000010, + 0x00100000, 0x40008010, 0x40100010, 0x00008000, + 0x00108010, 0x40000000, 0x00000000, 0x00100010, + 0x40008010, 0x00108010, 0x40108000, 0x40000010, + 0x40000000, 0x00100000, 0x00008010, 0x40108010, + 0x00100010, 0x40108000, 0x40008000, 0x00108010, + 0x40108010, 0x00100010, 0x40000010, 0x00000000, + 0x40000000, 0x00008010, 0x00100000, 0x40100010, + 0x00008000, 0x40000000, 0x00108010, 0x40008010, + 0x40108000, 0x00008000, 0x00000000, 0x40000010, + 0x00000010, 0x40108010, 0x00108000, 0x40100000, + 0x40100010, 0x00100000, 0x00008010, 0x40008000, + 0x40008010, 0x00000010, 0x40100000, 0x00108000, + /* nibble 2 */ + 0x04000001, 0x04040100, 0x00000100, 0x04000101, + 0x00040001, 0x04000000, 0x04000101, 0x00040100, + 0x04000100, 0x00040000, 0x04040000, 0x00000001, + 0x04040101, 0x00000101, 0x00000001, 0x04040001, + 0x00000000, 0x00040001, 0x04040100, 0x00000100, + 0x00000101, 0x04040101, 0x00040000, 0x04000001, + 0x04040001, 0x04000100, 0x00040101, 0x04040000, + 0x00040100, 0x00000000, 0x04000000, 0x00040101, + 0x04040100, 0x00000100, 0x00000001, 0x00040000, + 0x00000101, 0x00040001, 0x04040000, 0x04000101, + 0x00000000, 0x04040100, 0x00040100, 0x04040001, + 0x00040001, 0x04000000, 0x04040101, 0x00000001, + 0x00040101, 0x04000001, 0x04000000, 0x04040101, + 0x00040000, 0x04000100, 0x04000101, 0x00040100, + 0x04000100, 0x00000000, 0x04040001, 0x00000101, + 0x04000001, 0x00040101, 0x00000100, 0x04040000, + /* nibble 3 */ + 0x00401008, 0x10001000, 0x00000008, 0x10401008, + 0x00000000, 0x10400000, 0x10001008, 0x00400008, + 0x10401000, 0x10000008, 0x10000000, 0x00001008, + 0x10000008, 0x00401008, 0x00400000, 0x10000000, + 0x10400008, 0x00401000, 0x00001000, 0x00000008, + 0x00401000, 0x10001008, 0x10400000, 0x00001000, + 0x00001008, 0x00000000, 0x00400008, 0x10401000, + 0x10001000, 0x10400008, 0x10401008, 0x00400000, + 0x10400008, 0x00001008, 0x00400000, 0x10000008, + 0x00401000, 0x10001000, 0x00000008, 0x10400000, + 0x10001008, 0x00000000, 0x00001000, 0x00400008, + 0x00000000, 0x10400008, 0x10401000, 0x00001000, + 0x10000000, 0x10401008, 0x00401008, 0x00400000, + 0x10401008, 0x00000008, 0x10001000, 0x00401008, + 0x00400008, 0x00401000, 0x10400000, 0x10001008, + 0x00001008, 0x10000000, 0x10000008, 0x10401000, + /* nibble 4 */ + 0x08000000, 0x00010000, 0x00000400, 0x08010420, + 0x08010020, 0x08000400, 0x00010420, 0x08010000, + 0x00010000, 0x00000020, 0x08000020, 0x00010400, + 0x08000420, 0x08010020, 0x08010400, 0x00000000, + 0x00010400, 0x08000000, 0x00010020, 0x00000420, + 0x08000400, 0x00010420, 0x00000000, 0x08000020, + 0x00000020, 0x08000420, 0x08010420, 0x00010020, + 0x08010000, 0x00000400, 0x00000420, 0x08010400, + 0x08010400, 0x08000420, 0x00010020, 0x08010000, + 0x00010000, 0x00000020, 0x08000020, 0x08000400, + 0x08000000, 0x00010400, 0x08010420, 0x00000000, + 0x00010420, 0x08000000, 0x00000400, 0x00010020, + 0x08000420, 0x00000400, 0x00000000, 0x08010420, + 0x08010020, 0x08010400, 0x00000420, 0x00010000, + 0x00010400, 0x08010020, 0x08000400, 0x00000420, + 0x00000020, 0x00010420, 0x08010000, 0x08000020, + /* nibble 5 */ + 0x80000040, 0x00200040, 0x00000000, 0x80202000, + 0x00200040, 0x00002000, 0x80002040, 0x00200000, + 0x00002040, 0x80202040, 0x00202000, 0x80000000, + 0x80002000, 0x80000040, 0x80200000, 0x00202040, + 0x00200000, 0x80002040, 0x80200040, 0x00000000, + 0x00002000, 0x00000040, 0x80202000, 0x80200040, + 0x80202040, 0x80200000, 0x80000000, 0x00002040, + 0x00000040, 0x00202000, 0x00202040, 0x80002000, + 0x00002040, 0x80000000, 0x80002000, 0x00202040, + 0x80202000, 0x00200040, 0x00000000, 0x80002000, + 0x80000000, 0x00002000, 0x80200040, 0x00200000, + 0x00200040, 0x80202040, 0x00202000, 0x00000040, + 0x80202040, 0x00202000, 0x00200000, 0x80002040, + 0x80000040, 0x80200000, 0x00202040, 0x00000000, + 0x00002000, 0x80000040, 0x80002040, 0x80202000, + 0x80200000, 0x00002040, 0x00000040, 0x80200040, + /* nibble 6 */ + 0x00004000, 0x00000200, 0x01000200, 0x01000004, + 0x01004204, 0x00004004, 0x00004200, 0x00000000, + 0x01000000, 0x01000204, 0x00000204, 0x01004000, + 0x00000004, 0x01004200, 0x01004000, 0x00000204, + 0x01000204, 0x00004000, 0x00004004, 0x01004204, + 0x00000000, 0x01000200, 0x01000004, 0x00004200, + 0x01004004, 0x00004204, 0x01004200, 0x00000004, + 0x00004204, 0x01004004, 0x00000200, 0x01000000, + 0x00004204, 0x01004000, 0x01004004, 0x00000204, + 0x00004000, 0x00000200, 0x01000000, 0x01004004, + 0x01000204, 0x00004204, 0x00004200, 0x00000000, + 0x00000200, 0x01000004, 0x00000004, 0x01000200, + 0x00000000, 0x01000204, 0x01000200, 0x00004200, + 0x00000204, 0x00004000, 0x01004204, 0x01000000, + 0x01004200, 0x00000004, 0x00004004, 0x01004204, + 0x01000004, 0x01004200, 0x01004000, 0x00004004, + /* nibble 7 */ + 0x20800080, 0x20820000, 0x00020080, 0x00000000, + 0x20020000, 0x00800080, 0x20800000, 0x20820080, + 0x00000080, 0x20000000, 0x00820000, 0x00020080, + 0x00820080, 0x20020080, 0x20000080, 0x20800000, + 0x00020000, 0x00820080, 0x00800080, 0x20020000, + 0x20820080, 0x20000080, 0x00000000, 0x00820000, + 0x20000000, 0x00800000, 0x20020080, 0x20800080, + 0x00800000, 0x00020000, 0x20820000, 0x00000080, + 0x00800000, 0x00020000, 0x20000080, 0x20820080, + 0x00020080, 0x20000000, 0x00000000, 0x00820000, + 0x20800080, 0x20020080, 0x20020000, 0x00800080, + 0x20820000, 0x00000080, 0x00800080, 0x20020000, + 0x20820080, 0x00800000, 0x20800000, 0x20000080, + 0x00820000, 0x00020080, 0x20020080, 0x20800000, + 0x00000080, 0x20820000, 0x00820080, 0x00000000, + 0x20000000, 0x20800080, 0x00020000, 0x00820080, +}; + +__device__ __constant__ u32 c_skb[8][64] = +{ + /* for C bits (numbered as per FIPS 46) 1 2 3 4 5 6 */ + 0x00000000, 0x00000010, 0x20000000, 0x20000010, + 0x00010000, 0x00010010, 0x20010000, 0x20010010, + 0x00000800, 0x00000810, 0x20000800, 0x20000810, + 0x00010800, 0x00010810, 0x20010800, 0x20010810, + 0x00000020, 0x00000030, 0x20000020, 0x20000030, + 0x00010020, 0x00010030, 0x20010020, 0x20010030, + 0x00000820, 0x00000830, 0x20000820, 0x20000830, + 0x00010820, 0x00010830, 0x20010820, 0x20010830, + 0x00080000, 0x00080010, 0x20080000, 0x20080010, + 0x00090000, 0x00090010, 0x20090000, 0x20090010, + 0x00080800, 0x00080810, 0x20080800, 0x20080810, + 0x00090800, 0x00090810, 0x20090800, 0x20090810, + 0x00080020, 0x00080030, 0x20080020, 0x20080030, + 0x00090020, 0x00090030, 0x20090020, 0x20090030, + 0x00080820, 0x00080830, 0x20080820, 0x20080830, + 0x00090820, 0x00090830, 0x20090820, 0x20090830, + /* for C bits (numbered as per FIPS 46) 7 8 10 11 12 13 */ + 0x00000000, 0x02000000, 0x00002000, 0x02002000, + 0x00200000, 0x02200000, 0x00202000, 0x02202000, + 0x00000004, 0x02000004, 0x00002004, 0x02002004, + 0x00200004, 0x02200004, 0x00202004, 0x02202004, + 0x00000400, 0x02000400, 0x00002400, 0x02002400, + 0x00200400, 0x02200400, 0x00202400, 0x02202400, + 0x00000404, 0x02000404, 0x00002404, 0x02002404, + 0x00200404, 0x02200404, 0x00202404, 0x02202404, + 0x10000000, 0x12000000, 0x10002000, 0x12002000, + 0x10200000, 0x12200000, 0x10202000, 0x12202000, + 0x10000004, 0x12000004, 0x10002004, 0x12002004, + 0x10200004, 0x12200004, 0x10202004, 0x12202004, + 0x10000400, 0x12000400, 0x10002400, 0x12002400, + 0x10200400, 0x12200400, 0x10202400, 0x12202400, + 0x10000404, 0x12000404, 0x10002404, 0x12002404, + 0x10200404, 0x12200404, 0x10202404, 0x12202404, + /* for C bits (numbered as per FIPS 46) 14 15 16 17 19 20 */ + 0x00000000, 0x00000001, 0x00040000, 0x00040001, + 0x01000000, 0x01000001, 0x01040000, 0x01040001, + 0x00000002, 0x00000003, 0x00040002, 0x00040003, + 0x01000002, 0x01000003, 0x01040002, 0x01040003, + 0x00000200, 0x00000201, 0x00040200, 0x00040201, + 0x01000200, 0x01000201, 0x01040200, 0x01040201, + 0x00000202, 0x00000203, 0x00040202, 0x00040203, + 0x01000202, 0x01000203, 0x01040202, 0x01040203, + 0x08000000, 0x08000001, 0x08040000, 0x08040001, + 0x09000000, 0x09000001, 0x09040000, 0x09040001, + 0x08000002, 0x08000003, 0x08040002, 0x08040003, + 0x09000002, 0x09000003, 0x09040002, 0x09040003, + 0x08000200, 0x08000201, 0x08040200, 0x08040201, + 0x09000200, 0x09000201, 0x09040200, 0x09040201, + 0x08000202, 0x08000203, 0x08040202, 0x08040203, + 0x09000202, 0x09000203, 0x09040202, 0x09040203, + /* for C bits (numbered as per FIPS 46) 21 23 24 26 27 28 */ + 0x00000000, 0x00100000, 0x00000100, 0x00100100, + 0x00000008, 0x00100008, 0x00000108, 0x00100108, + 0x00001000, 0x00101000, 0x00001100, 0x00101100, + 0x00001008, 0x00101008, 0x00001108, 0x00101108, + 0x04000000, 0x04100000, 0x04000100, 0x04100100, + 0x04000008, 0x04100008, 0x04000108, 0x04100108, + 0x04001000, 0x04101000, 0x04001100, 0x04101100, + 0x04001008, 0x04101008, 0x04001108, 0x04101108, + 0x00020000, 0x00120000, 0x00020100, 0x00120100, + 0x00020008, 0x00120008, 0x00020108, 0x00120108, + 0x00021000, 0x00121000, 0x00021100, 0x00121100, + 0x00021008, 0x00121008, 0x00021108, 0x00121108, + 0x04020000, 0x04120000, 0x04020100, 0x04120100, + 0x04020008, 0x04120008, 0x04020108, 0x04120108, + 0x04021000, 0x04121000, 0x04021100, 0x04121100, + 0x04021008, 0x04121008, 0x04021108, 0x04121108, + /* for D bits (numbered as per FIPS 46) 1 2 3 4 5 6 */ + 0x00000000, 0x10000000, 0x00010000, 0x10010000, + 0x00000004, 0x10000004, 0x00010004, 0x10010004, + 0x20000000, 0x30000000, 0x20010000, 0x30010000, + 0x20000004, 0x30000004, 0x20010004, 0x30010004, + 0x00100000, 0x10100000, 0x00110000, 0x10110000, + 0x00100004, 0x10100004, 0x00110004, 0x10110004, + 0x20100000, 0x30100000, 0x20110000, 0x30110000, + 0x20100004, 0x30100004, 0x20110004, 0x30110004, + 0x00001000, 0x10001000, 0x00011000, 0x10011000, + 0x00001004, 0x10001004, 0x00011004, 0x10011004, + 0x20001000, 0x30001000, 0x20011000, 0x30011000, + 0x20001004, 0x30001004, 0x20011004, 0x30011004, + 0x00101000, 0x10101000, 0x00111000, 0x10111000, + 0x00101004, 0x10101004, 0x00111004, 0x10111004, + 0x20101000, 0x30101000, 0x20111000, 0x30111000, + 0x20101004, 0x30101004, 0x20111004, 0x30111004, + /* for D bits (numbered as per FIPS 46) 8 9 11 12 13 14 */ + 0x00000000, 0x08000000, 0x00000008, 0x08000008, + 0x00000400, 0x08000400, 0x00000408, 0x08000408, + 0x00020000, 0x08020000, 0x00020008, 0x08020008, + 0x00020400, 0x08020400, 0x00020408, 0x08020408, + 0x00000001, 0x08000001, 0x00000009, 0x08000009, + 0x00000401, 0x08000401, 0x00000409, 0x08000409, + 0x00020001, 0x08020001, 0x00020009, 0x08020009, + 0x00020401, 0x08020401, 0x00020409, 0x08020409, + 0x02000000, 0x0A000000, 0x02000008, 0x0A000008, + 0x02000400, 0x0A000400, 0x02000408, 0x0A000408, + 0x02020000, 0x0A020000, 0x02020008, 0x0A020008, + 0x02020400, 0x0A020400, 0x02020408, 0x0A020408, + 0x02000001, 0x0A000001, 0x02000009, 0x0A000009, + 0x02000401, 0x0A000401, 0x02000409, 0x0A000409, + 0x02020001, 0x0A020001, 0x02020009, 0x0A020009, + 0x02020401, 0x0A020401, 0x02020409, 0x0A020409, + /* for D bits (numbered as per FIPS 46) 16 17 18 19 20 21 */ + 0x00000000, 0x00000100, 0x00080000, 0x00080100, + 0x01000000, 0x01000100, 0x01080000, 0x01080100, + 0x00000010, 0x00000110, 0x00080010, 0x00080110, + 0x01000010, 0x01000110, 0x01080010, 0x01080110, + 0x00200000, 0x00200100, 0x00280000, 0x00280100, + 0x01200000, 0x01200100, 0x01280000, 0x01280100, + 0x00200010, 0x00200110, 0x00280010, 0x00280110, + 0x01200010, 0x01200110, 0x01280010, 0x01280110, + 0x00000200, 0x00000300, 0x00080200, 0x00080300, + 0x01000200, 0x01000300, 0x01080200, 0x01080300, + 0x00000210, 0x00000310, 0x00080210, 0x00080310, + 0x01000210, 0x01000310, 0x01080210, 0x01080310, + 0x00200200, 0x00200300, 0x00280200, 0x00280300, + 0x01200200, 0x01200300, 0x01280200, 0x01280300, + 0x00200210, 0x00200310, 0x00280210, 0x00280310, + 0x01200210, 0x01200310, 0x01280210, 0x01280310, + /* for D bits (numbered as per FIPS 46) 22 23 24 25 27 28 */ + 0x00000000, 0x04000000, 0x00040000, 0x04040000, + 0x00000002, 0x04000002, 0x00040002, 0x04040002, + 0x00002000, 0x04002000, 0x00042000, 0x04042000, + 0x00002002, 0x04002002, 0x00042002, 0x04042002, + 0x00000020, 0x04000020, 0x00040020, 0x04040020, + 0x00000022, 0x04000022, 0x00040022, 0x04040022, + 0x00002020, 0x04002020, 0x00042020, 0x04042020, + 0x00002022, 0x04002022, 0x00042022, 0x04042022, + 0x00000800, 0x04000800, 0x00040800, 0x04040800, + 0x00000802, 0x04000802, 0x00040802, 0x04040802, + 0x00002800, 0x04002800, 0x00042800, 0x04042800, + 0x00002802, 0x04002802, 0x00042802, 0x04042802, + 0x00000820, 0x04000820, 0x00040820, 0x04040820, + 0x00000822, 0x04000822, 0x00040822, 0x04040822, + 0x00002820, 0x04002820, 0x00042820, 0x04042820, + 0x00002822, 0x04002822, 0x00042822, 0x04042822 +}; + +#ifdef VECT_SIZE1 +#define BOX(i,n,S) u32x ((S)[(n)][(i)]) +#endif + +#ifdef VECT_SIZE2 +#define BOX(i,n,S) u32x ((S)[(n)][(i).x], (S)[(n)][(i).y]) +#endif + +__device__ static void _des_crypt_encrypt (u32x iv[2], u32x data[2], u32x Kc[16], u32x Kd[16], u32 s_SPtrans[8][64]) +{ + u32x tt; + + u32x r = data[0]; + u32x l = data[1]; + + #pragma unroll 16 + for (u32 i = 0; i < 16; i++) + { + u32x u = Kc[i] ^ r; + u32x t = Kd[i] ^ rotl32 (r, 28u); + + l ^= BOX (((u >> 2) & 0x3f), 0, s_SPtrans) + | BOX (((u >> 10) & 0x3f), 2, s_SPtrans) + | BOX (((u >> 18) & 0x3f), 4, s_SPtrans) + | BOX (((u >> 26) & 0x3f), 6, s_SPtrans) + | BOX (((t >> 2) & 0x3f), 1, s_SPtrans) + | BOX (((t >> 10) & 0x3f), 3, s_SPtrans) + | BOX (((t >> 18) & 0x3f), 5, s_SPtrans) + | BOX (((t >> 26) & 0x3f), 7, s_SPtrans); + + tt = l; + l = r; + r = tt; + } + + iv[0] = l; + iv[1] = r; +} + +__device__ static void _des_crypt_keysetup (u32x c, u32x d, u32x Kc[16], u32x Kd[16], u32 s_skb[8][64]) +{ + u32x tt; + + PERM_OP (d, c, tt, 4, 0x0f0f0f0f); + HPERM_OP (c, tt, 2, 0xcccc0000); + HPERM_OP (d, tt, 2, 0xcccc0000); + PERM_OP (d, c, tt, 1, 0x55555555); + PERM_OP (c, d, tt, 8, 0x00ff00ff); + PERM_OP (d, c, tt, 1, 0x55555555); + + d = ((d & 0x000000ff) << 16) + | ((d & 0x0000ff00) << 0) + | ((d & 0x00ff0000) >> 16) + | ((c & 0xf0000000) >> 4); + + c = c & 0x0fffffff; + + #pragma unroll 16 + for (u32 i = 0; i < 16; i++) + { + const u32 shifts3s0[16] = { 1, 1, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 1 }; + const u32 shifts3s1[16] = { 27, 27, 26, 26, 26, 26, 26, 26, 27, 26, 26, 26, 26, 26, 26, 27 }; + + c = c >> shifts3s0[i] | c << shifts3s1[i]; + d = d >> shifts3s0[i] | d << shifts3s1[i]; + + c = c & 0x0fffffff; + d = d & 0x0fffffff; + + u32x s = BOX ((( c >> 0) & 0x3f), 0, s_skb) + | BOX ((((c >> 6) & 0x03) + | ((c >> 7) & 0x3c)), 1, s_skb) + | BOX ((((c >> 13) & 0x0f) + | ((c >> 14) & 0x30)), 2, s_skb) + | BOX ((((c >> 20) & 0x01) + | ((c >> 21) & 0x06) + | ((c >> 22) & 0x38)), 3, s_skb); + + u32x t = BOX ((( d >> 0) & 0x3f), 4, s_skb) + | BOX ((((d >> 7) & 0x03) + | ((d >> 8) & 0x3c)), 5, s_skb) + | BOX ((((d >> 15) & 0x3f)), 6, s_skb) + | BOX ((((d >> 21) & 0x0f) + | ((d >> 22) & 0x30)), 7, s_skb); + + #if __CUDA_ARCH__ >= 200 + Kc[i] = __byte_perm (s, t, 0x5410); + Kd[i] = __byte_perm (s, t, 0x7632); + #else + Kc[i] = ((t << 16) | (s & 0x0000ffff)); + Kd[i] = ((s >> 16) | (t & 0xffff0000)); + #endif + + Kc[i] = rotl32 (Kc[i], 2u); + Kd[i] = rotl32 (Kd[i], 2u); + } +} + +__device__ static void transform_netntlmv1_key (const u32x w0, const u32x w1, u32x out[2]) +{ + u32x t[8]; + + t[0] = (w0 >> 0) & 0xff; + t[1] = (w0 >> 8) & 0xff; + t[2] = (w0 >> 16) & 0xff; + t[3] = (w0 >> 24) & 0xff; + t[4] = (w1 >> 0) & 0xff; + t[5] = (w1 >> 8) & 0xff; + t[6] = (w1 >> 16) & 0xff; + t[7] = (w1 >> 24) & 0xff; + + u32x k[8]; + + k[0] = (t[0] >> 0); + k[1] = (t[0] << 7) | (t[1] >> 1); + k[2] = (t[1] << 6) | (t[2] >> 2); + k[3] = (t[2] << 5) | (t[3] >> 3); + k[4] = (t[3] << 4) | (t[4] >> 4); + k[5] = (t[4] << 3) | (t[5] >> 5); + k[6] = (t[5] << 2) | (t[6] >> 6); + k[7] = (t[6] << 1); + + out[0] = ((k[0] & 0xff) << 0) + | ((k[1] & 0xff) << 8) + | ((k[2] & 0xff) << 16) + | ((k[3] & 0xff) << 24); + + out[1] = ((k[4] & 0xff) << 0) + | ((k[5] & 0xff) << 8) + | ((k[6] & 0xff) << 16) + | ((k[7] & 0xff) << 24); +} + +__device__ __shared__ u32 s_skb[8][64]; +__device__ __shared__ u32 s_SPtrans[8][64]; + +__device__ __constant__ u32x c_bfs[1024]; + +__device__ static void m05500m (u32 w[16], const u32 pw_len, const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const u32x *words_buf_r, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset) +{ + /** + * modifier + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + const u32 lid = threadIdx.x; + + /** + * salt + */ + + const u32 s0 = salt_bufs[salt_pos].salt_buf[0]; + const u32 s1 = salt_bufs[salt_pos].salt_buf[1]; + const u32 s2 = salt_bufs[salt_pos].salt_buf[2]; + + u32x data[2]; + + data[0] = s0; + data[1] = s1; + + /** + * loop + */ + + const u32 bf_loops = ceil ((float) bfs_cnt / VECT_DIV); + + u32x w0l = w[0]; + + for (u32 il_pos = 0; il_pos < bf_loops; il_pos++) + { + const u32x w0r = c_bfs[il_pos]; + + const u32x w0 = w0l | w0r; + + u32x a = MD4M_A; + u32x b = MD4M_B; + u32x c = MD4M_C; + u32x d = MD4M_D; + + #define w0_t w0 + #define w1_t w[ 1] + #define w2_t w[ 2] + #define w3_t w[ 3] + #define w4_t w[ 4] + #define w5_t w[ 5] + #define w6_t w[ 6] + #define w7_t w[ 7] + #define w8_t w[ 8] + #define w9_t w[ 9] + #define wa_t w[10] + #define wb_t w[11] + #define wc_t w[12] + #define wd_t w[13] + #define we_t w[14] + #define wf_t w[15] + + MD4_STEP (MD4_Fo, a, b, c, d, w0_t, MD4C00, MD4S00); + MD4_STEP (MD4_Fo, d, a, b, c, w1_t, MD4C00, MD4S01); + MD4_STEP (MD4_Fo, c, d, a, b, w2_t, MD4C00, MD4S02); + MD4_STEP (MD4_Fo, b, c, d, a, w3_t, MD4C00, MD4S03); + MD4_STEP (MD4_Fo, a, b, c, d, w4_t, MD4C00, MD4S00); + MD4_STEP (MD4_Fo, d, a, b, c, w5_t, MD4C00, MD4S01); + MD4_STEP (MD4_Fo, c, d, a, b, w6_t, MD4C00, MD4S02); + MD4_STEP (MD4_Fo, b, c, d, a, w7_t, MD4C00, MD4S03); + MD4_STEP (MD4_Fo, a, b, c, d, w8_t, MD4C00, MD4S00); + MD4_STEP (MD4_Fo, d, a, b, c, w9_t, MD4C00, MD4S01); + MD4_STEP (MD4_Fo, c, d, a, b, wa_t, MD4C00, MD4S02); + MD4_STEP (MD4_Fo, b, c, d, a, wb_t, MD4C00, MD4S03); + MD4_STEP (MD4_Fo, a, b, c, d, wc_t, MD4C00, MD4S00); + MD4_STEP (MD4_Fo, d, a, b, c, wd_t, MD4C00, MD4S01); + MD4_STEP (MD4_Fo, c, d, a, b, we_t, MD4C00, MD4S02); + MD4_STEP (MD4_Fo, b, c, d, a, wf_t, MD4C00, MD4S03); + + MD4_STEP (MD4_Go, a, b, c, d, w0_t, MD4C01, MD4S10); + MD4_STEP (MD4_Go, d, a, b, c, w4_t, MD4C01, MD4S11); + MD4_STEP (MD4_Go, c, d, a, b, w8_t, MD4C01, MD4S12); + MD4_STEP (MD4_Go, b, c, d, a, wc_t, MD4C01, MD4S13); + MD4_STEP (MD4_Go, a, b, c, d, w1_t, MD4C01, MD4S10); + MD4_STEP (MD4_Go, d, a, b, c, w5_t, MD4C01, MD4S11); + MD4_STEP (MD4_Go, c, d, a, b, w9_t, MD4C01, MD4S12); + MD4_STEP (MD4_Go, b, c, d, a, wd_t, MD4C01, MD4S13); + MD4_STEP (MD4_Go, a, b, c, d, w2_t, MD4C01, MD4S10); + MD4_STEP (MD4_Go, d, a, b, c, w6_t, MD4C01, MD4S11); + MD4_STEP (MD4_Go, c, d, a, b, wa_t, MD4C01, MD4S12); + MD4_STEP (MD4_Go, b, c, d, a, we_t, MD4C01, MD4S13); + MD4_STEP (MD4_Go, a, b, c, d, w3_t, MD4C01, MD4S10); + MD4_STEP (MD4_Go, d, a, b, c, w7_t, MD4C01, MD4S11); + MD4_STEP (MD4_Go, c, d, a, b, wb_t, MD4C01, MD4S12); + MD4_STEP (MD4_Go, b, c, d, a, wf_t, MD4C01, MD4S13); + + MD4_STEP (MD4_H , a, b, c, d, w0_t, MD4C02, MD4S20); + MD4_STEP (MD4_H , d, a, b, c, w8_t, MD4C02, MD4S21); + MD4_STEP (MD4_H , c, d, a, b, w4_t, MD4C02, MD4S22); + MD4_STEP (MD4_H , b, c, d, a, wc_t, MD4C02, MD4S23); + MD4_STEP (MD4_H , a, b, c, d, w2_t, MD4C02, MD4S20); + MD4_STEP (MD4_H , d, a, b, c, wa_t, MD4C02, MD4S21); + MD4_STEP (MD4_H , c, d, a, b, w6_t, MD4C02, MD4S22); + MD4_STEP (MD4_H , b, c, d, a, we_t, MD4C02, MD4S23); + MD4_STEP (MD4_H , a, b, c, d, w1_t, MD4C02, MD4S20); + MD4_STEP (MD4_H , d, a, b, c, w9_t, MD4C02, MD4S21); + MD4_STEP (MD4_H , c, d, a, b, w5_t, MD4C02, MD4S22); + MD4_STEP (MD4_H , b, c, d, a, wd_t, MD4C02, MD4S23); + MD4_STEP (MD4_H , a, b, c, d, w3_t, MD4C02, MD4S20); + MD4_STEP (MD4_H , d, a, b, c, wb_t, MD4C02, MD4S21); + + if (s2 != ((d + MD4M_D) >> 16)) continue; + + MD4_STEP (MD4_H , c, d, a, b, w7_t, MD4C02, MD4S22); + MD4_STEP (MD4_H , b, c, d, a, wf_t, MD4C02, MD4S23); + + a += MD4M_A; + b += MD4M_B; + c += MD4M_C; + d += MD4M_D; + + /** + * DES1 + */ + + u32x key[2]; + + transform_netntlmv1_key (a, b, key); + + u32x Kc[16]; + u32x Kd[16]; + + _des_crypt_keysetup (key[0], key[1], Kc, Kd, s_skb); + + u32x iv1[2]; + + _des_crypt_encrypt (iv1, data, Kc, Kd, s_SPtrans); + + /** + * DES2 + */ + + transform_netntlmv1_key (((b >> 24) | (c << 8)), ((c >> 24) | (d << 8)), key); + + _des_crypt_keysetup (key[0], key[1], Kc, Kd, s_skb); + + u32x iv2[2]; + + _des_crypt_encrypt (iv2, data, Kc, Kd, s_SPtrans); + + /** + * compare + */ + + const u32x r0 = iv1[0]; + const u32x r1 = iv1[1]; + const u32x r2 = iv2[0]; + const u32x r3 = iv2[1]; + + #include VECT_COMPARE_M + } +} + +__device__ static void m05500s (u32 w[16], const u32 pw_len, const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const u32x *words_buf_r, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset) +{ + /** + * modifier + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + const u32 lid = threadIdx.x; + + /** + * salt + */ + + const u32 s0 = salt_bufs[salt_pos].salt_buf[0]; + const u32 s1 = salt_bufs[salt_pos].salt_buf[1]; + const u32 s2 = salt_bufs[salt_pos].salt_buf[2]; + + u32x data[2]; + + data[0] = s0; + data[1] = s1; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * loop + */ + + const u32 bf_loops = ceil ((float) bfs_cnt / VECT_DIV); + + u32x w0l = w[0]; + + for (u32 il_pos = 0; il_pos < bf_loops; il_pos++) + { + const u32x w0r = c_bfs[il_pos]; + + const u32x w0 = w0l | w0r; + + u32x a = MD4M_A; + u32x b = MD4M_B; + u32x c = MD4M_C; + u32x d = MD4M_D; + + #define w0_t w0 + #define w1_t w[ 1] + #define w2_t w[ 2] + #define w3_t w[ 3] + #define w4_t w[ 4] + #define w5_t w[ 5] + #define w6_t w[ 6] + #define w7_t w[ 7] + #define w8_t w[ 8] + #define w9_t w[ 9] + #define wa_t w[10] + #define wb_t w[11] + #define wc_t w[12] + #define wd_t w[13] + #define we_t w[14] + #define wf_t w[15] + + MD4_STEP (MD4_Fo, a, b, c, d, w0_t, MD4C00, MD4S00); + MD4_STEP (MD4_Fo, d, a, b, c, w1_t, MD4C00, MD4S01); + MD4_STEP (MD4_Fo, c, d, a, b, w2_t, MD4C00, MD4S02); + MD4_STEP (MD4_Fo, b, c, d, a, w3_t, MD4C00, MD4S03); + MD4_STEP (MD4_Fo, a, b, c, d, w4_t, MD4C00, MD4S00); + MD4_STEP (MD4_Fo, d, a, b, c, w5_t, MD4C00, MD4S01); + MD4_STEP (MD4_Fo, c, d, a, b, w6_t, MD4C00, MD4S02); + MD4_STEP (MD4_Fo, b, c, d, a, w7_t, MD4C00, MD4S03); + MD4_STEP (MD4_Fo, a, b, c, d, w8_t, MD4C00, MD4S00); + MD4_STEP (MD4_Fo, d, a, b, c, w9_t, MD4C00, MD4S01); + MD4_STEP (MD4_Fo, c, d, a, b, wa_t, MD4C00, MD4S02); + MD4_STEP (MD4_Fo, b, c, d, a, wb_t, MD4C00, MD4S03); + MD4_STEP (MD4_Fo, a, b, c, d, wc_t, MD4C00, MD4S00); + MD4_STEP (MD4_Fo, d, a, b, c, wd_t, MD4C00, MD4S01); + MD4_STEP (MD4_Fo, c, d, a, b, we_t, MD4C00, MD4S02); + MD4_STEP (MD4_Fo, b, c, d, a, wf_t, MD4C00, MD4S03); + + MD4_STEP (MD4_Go, a, b, c, d, w0_t, MD4C01, MD4S10); + MD4_STEP (MD4_Go, d, a, b, c, w4_t, MD4C01, MD4S11); + MD4_STEP (MD4_Go, c, d, a, b, w8_t, MD4C01, MD4S12); + MD4_STEP (MD4_Go, b, c, d, a, wc_t, MD4C01, MD4S13); + MD4_STEP (MD4_Go, a, b, c, d, w1_t, MD4C01, MD4S10); + MD4_STEP (MD4_Go, d, a, b, c, w5_t, MD4C01, MD4S11); + MD4_STEP (MD4_Go, c, d, a, b, w9_t, MD4C01, MD4S12); + MD4_STEP (MD4_Go, b, c, d, a, wd_t, MD4C01, MD4S13); + MD4_STEP (MD4_Go, a, b, c, d, w2_t, MD4C01, MD4S10); + MD4_STEP (MD4_Go, d, a, b, c, w6_t, MD4C01, MD4S11); + MD4_STEP (MD4_Go, c, d, a, b, wa_t, MD4C01, MD4S12); + MD4_STEP (MD4_Go, b, c, d, a, we_t, MD4C01, MD4S13); + MD4_STEP (MD4_Go, a, b, c, d, w3_t, MD4C01, MD4S10); + MD4_STEP (MD4_Go, d, a, b, c, w7_t, MD4C01, MD4S11); + MD4_STEP (MD4_Go, c, d, a, b, wb_t, MD4C01, MD4S12); + MD4_STEP (MD4_Go, b, c, d, a, wf_t, MD4C01, MD4S13); + + MD4_STEP (MD4_H , a, b, c, d, w0_t, MD4C02, MD4S20); + MD4_STEP (MD4_H , d, a, b, c, w8_t, MD4C02, MD4S21); + MD4_STEP (MD4_H , c, d, a, b, w4_t, MD4C02, MD4S22); + MD4_STEP (MD4_H , b, c, d, a, wc_t, MD4C02, MD4S23); + MD4_STEP (MD4_H , a, b, c, d, w2_t, MD4C02, MD4S20); + MD4_STEP (MD4_H , d, a, b, c, wa_t, MD4C02, MD4S21); + MD4_STEP (MD4_H , c, d, a, b, w6_t, MD4C02, MD4S22); + MD4_STEP (MD4_H , b, c, d, a, we_t, MD4C02, MD4S23); + MD4_STEP (MD4_H , a, b, c, d, w1_t, MD4C02, MD4S20); + MD4_STEP (MD4_H , d, a, b, c, w9_t, MD4C02, MD4S21); + MD4_STEP (MD4_H , c, d, a, b, w5_t, MD4C02, MD4S22); + MD4_STEP (MD4_H , b, c, d, a, wd_t, MD4C02, MD4S23); + MD4_STEP (MD4_H , a, b, c, d, w3_t, MD4C02, MD4S20); + MD4_STEP (MD4_H , d, a, b, c, wb_t, MD4C02, MD4S21); + + if (s2 != ((d + MD4M_D) >> 16)) continue; + + MD4_STEP (MD4_H , c, d, a, b, w7_t, MD4C02, MD4S22); + MD4_STEP (MD4_H , b, c, d, a, wf_t, MD4C02, MD4S23); + + a += MD4M_A; + b += MD4M_B; + c += MD4M_C; + d += MD4M_D; + + /** + * DES1 + */ + + u32x key[2]; + + transform_netntlmv1_key (a, b, key); + + u32x Kc[16]; + u32x Kd[16]; + + _des_crypt_keysetup (key[0], key[1], Kc, Kd, s_skb); + + u32x iv1[2]; + + _des_crypt_encrypt (iv1, data, Kc, Kd, s_SPtrans); + + /** + * DES2 + */ + + transform_netntlmv1_key (((b >> 24) | (c << 8)), ((c >> 24) | (d << 8)), key); + + _des_crypt_keysetup (key[0], key[1], Kc, Kd, s_skb); + + u32x iv2[2]; + + _des_crypt_encrypt (iv2, data, Kc, Kd, s_SPtrans); + + /** + * compare + */ + + const u32x r0 = iv1[0]; + const u32x r1 = iv1[1]; + const u32x r2 = iv2[0]; + const u32x r3 = iv2[1]; + + #include VECT_COMPARE_S + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m05500_m04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const u32x *words_buf_r, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + const u32 lid = threadIdx.x; + + u32 w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = 0; + w[ 5] = 0; + w[ 6] = 0; + w[ 7] = 0; + w[ 8] = 0; + w[ 9] = 0; + w[10] = 0; + w[11] = 0; + w[12] = 0; + w[13] = 0; + w[14] = pws[gid].i[14]; + w[15] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * sbox, kbox + */ + + if (lid < 64) + { + s_skb[0][lid] = c_skb[0][lid]; + s_skb[1][lid] = c_skb[1][lid]; + s_skb[2][lid] = c_skb[2][lid]; + s_skb[3][lid] = c_skb[3][lid]; + s_skb[4][lid] = c_skb[4][lid]; + s_skb[5][lid] = c_skb[5][lid]; + s_skb[6][lid] = c_skb[6][lid]; + s_skb[7][lid] = c_skb[7][lid]; + + s_SPtrans[0][lid] = c_SPtrans[0][lid]; + s_SPtrans[1][lid] = c_SPtrans[1][lid]; + s_SPtrans[2][lid] = c_SPtrans[2][lid]; + s_SPtrans[3][lid] = c_SPtrans[3][lid]; + s_SPtrans[4][lid] = c_SPtrans[4][lid]; + s_SPtrans[5][lid] = c_SPtrans[5][lid]; + s_SPtrans[6][lid] = c_SPtrans[6][lid]; + s_SPtrans[7][lid] = c_SPtrans[7][lid]; + } + + __syncthreads (); + + if (gid >= gid_max) return; + + /** + * main + */ + + m05500m (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m05500_m08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const u32x *words_buf_r, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + const u32 lid = threadIdx.x; + + u32 w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = pws[gid].i[ 4]; + w[ 5] = pws[gid].i[ 5]; + w[ 6] = pws[gid].i[ 6]; + w[ 7] = pws[gid].i[ 7]; + w[ 8] = 0; + w[ 9] = 0; + w[10] = 0; + w[11] = 0; + w[12] = 0; + w[13] = 0; + w[14] = pws[gid].i[14]; + w[15] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * sbox, kbox + */ + + if (lid < 64) + { + s_skb[0][lid] = c_skb[0][lid]; + s_skb[1][lid] = c_skb[1][lid]; + s_skb[2][lid] = c_skb[2][lid]; + s_skb[3][lid] = c_skb[3][lid]; + s_skb[4][lid] = c_skb[4][lid]; + s_skb[5][lid] = c_skb[5][lid]; + s_skb[6][lid] = c_skb[6][lid]; + s_skb[7][lid] = c_skb[7][lid]; + + s_SPtrans[0][lid] = c_SPtrans[0][lid]; + s_SPtrans[1][lid] = c_SPtrans[1][lid]; + s_SPtrans[2][lid] = c_SPtrans[2][lid]; + s_SPtrans[3][lid] = c_SPtrans[3][lid]; + s_SPtrans[4][lid] = c_SPtrans[4][lid]; + s_SPtrans[5][lid] = c_SPtrans[5][lid]; + s_SPtrans[6][lid] = c_SPtrans[6][lid]; + s_SPtrans[7][lid] = c_SPtrans[7][lid]; + } + + __syncthreads (); + + if (gid >= gid_max) return; + + /** + * main + */ + + m05500m (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m05500_m16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const u32x *words_buf_r, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m05500_s04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const u32x *words_buf_r, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + const u32 lid = threadIdx.x; + + u32 w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = 0; + w[ 5] = 0; + w[ 6] = 0; + w[ 7] = 0; + w[ 8] = 0; + w[ 9] = 0; + w[10] = 0; + w[11] = 0; + w[12] = 0; + w[13] = 0; + w[14] = pws[gid].i[14]; + w[15] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * sbox, kbox + */ + + if (lid < 64) + { + s_skb[0][lid] = c_skb[0][lid]; + s_skb[1][lid] = c_skb[1][lid]; + s_skb[2][lid] = c_skb[2][lid]; + s_skb[3][lid] = c_skb[3][lid]; + s_skb[4][lid] = c_skb[4][lid]; + s_skb[5][lid] = c_skb[5][lid]; + s_skb[6][lid] = c_skb[6][lid]; + s_skb[7][lid] = c_skb[7][lid]; + + s_SPtrans[0][lid] = c_SPtrans[0][lid]; + s_SPtrans[1][lid] = c_SPtrans[1][lid]; + s_SPtrans[2][lid] = c_SPtrans[2][lid]; + s_SPtrans[3][lid] = c_SPtrans[3][lid]; + s_SPtrans[4][lid] = c_SPtrans[4][lid]; + s_SPtrans[5][lid] = c_SPtrans[5][lid]; + s_SPtrans[6][lid] = c_SPtrans[6][lid]; + s_SPtrans[7][lid] = c_SPtrans[7][lid]; + } + + __syncthreads (); + + if (gid >= gid_max) return; + + /** + * main + */ + + m05500s (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m05500_s08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const u32x *words_buf_r, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + const u32 lid = threadIdx.x; + + u32 w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = pws[gid].i[ 4]; + w[ 5] = pws[gid].i[ 5]; + w[ 6] = pws[gid].i[ 6]; + w[ 7] = pws[gid].i[ 7]; + w[ 8] = 0; + w[ 9] = 0; + w[10] = 0; + w[11] = 0; + w[12] = 0; + w[13] = 0; + w[14] = pws[gid].i[14]; + w[15] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * sbox, kbox + */ + + if (lid < 64) + { + s_skb[0][lid] = c_skb[0][lid]; + s_skb[1][lid] = c_skb[1][lid]; + s_skb[2][lid] = c_skb[2][lid]; + s_skb[3][lid] = c_skb[3][lid]; + s_skb[4][lid] = c_skb[4][lid]; + s_skb[5][lid] = c_skb[5][lid]; + s_skb[6][lid] = c_skb[6][lid]; + s_skb[7][lid] = c_skb[7][lid]; + + s_SPtrans[0][lid] = c_SPtrans[0][lid]; + s_SPtrans[1][lid] = c_SPtrans[1][lid]; + s_SPtrans[2][lid] = c_SPtrans[2][lid]; + s_SPtrans[3][lid] = c_SPtrans[3][lid]; + s_SPtrans[4][lid] = c_SPtrans[4][lid]; + s_SPtrans[5][lid] = c_SPtrans[5][lid]; + s_SPtrans[6][lid] = c_SPtrans[6][lid]; + s_SPtrans[7][lid] = c_SPtrans[7][lid]; + } + + __syncthreads (); + + if (gid >= gid_max) return; + + /** + * main + */ + + m05500s (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m05500_s16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const u32x *words_buf_r, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/nv/m05600_a0.cu b/nv/m05600_a0.cu new file mode 100644 index 0000000000..eb1291b04c --- /dev/null +++ b/nv/m05600_a0.cu @@ -0,0 +1,844 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _NETNTLMV2_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW2 +#define VECT_SIZE1 +#endif + +#define DGST_R0 0 +#define DGST_R1 3 +#define DGST_R2 2 +#define DGST_R3 1 + +#include "include/kernel_functions.c" +#include "types_nv.c" +#include "common_nv.c" +#include "include/rp_gpu.h" +#include "rp_nv.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +__device__ static void md4_transform (const u32x w0[4], const u32x w1[4], const u32x w2[4], const u32x w3[4], u32x digest[4]) +{ + u32x a = digest[0]; + u32x b = digest[1]; + u32x c = digest[2]; + u32x d = digest[3]; + + u32x w0_t = w0[0]; + u32x w1_t = w0[1]; + u32x w2_t = w0[2]; + u32x w3_t = w0[3]; + u32x w4_t = w1[0]; + u32x w5_t = w1[1]; + u32x w6_t = w1[2]; + u32x w7_t = w1[3]; + u32x w8_t = w2[0]; + u32x w9_t = w2[1]; + u32x wa_t = w2[2]; + u32x wb_t = w2[3]; + u32x wc_t = w3[0]; + u32x wd_t = w3[1]; + u32x we_t = w3[2]; + u32x wf_t = w3[3]; + + MD4_STEP (MD4_Fo, a, b, c, d, w0_t, MD4C00, MD4S00); + MD4_STEP (MD4_Fo, d, a, b, c, w1_t, MD4C00, MD4S01); + MD4_STEP (MD4_Fo, c, d, a, b, w2_t, MD4C00, MD4S02); + MD4_STEP (MD4_Fo, b, c, d, a, w3_t, MD4C00, MD4S03); + MD4_STEP (MD4_Fo, a, b, c, d, w4_t, MD4C00, MD4S00); + MD4_STEP (MD4_Fo, d, a, b, c, w5_t, MD4C00, MD4S01); + MD4_STEP (MD4_Fo, c, d, a, b, w6_t, MD4C00, MD4S02); + MD4_STEP (MD4_Fo, b, c, d, a, w7_t, MD4C00, MD4S03); + MD4_STEP (MD4_Fo, a, b, c, d, w8_t, MD4C00, MD4S00); + MD4_STEP (MD4_Fo, d, a, b, c, w9_t, MD4C00, MD4S01); + MD4_STEP (MD4_Fo, c, d, a, b, wa_t, MD4C00, MD4S02); + MD4_STEP (MD4_Fo, b, c, d, a, wb_t, MD4C00, MD4S03); + MD4_STEP (MD4_Fo, a, b, c, d, wc_t, MD4C00, MD4S00); + MD4_STEP (MD4_Fo, d, a, b, c, wd_t, MD4C00, MD4S01); + MD4_STEP (MD4_Fo, c, d, a, b, we_t, MD4C00, MD4S02); + MD4_STEP (MD4_Fo, b, c, d, a, wf_t, MD4C00, MD4S03); + + MD4_STEP (MD4_Go, a, b, c, d, w0_t, MD4C01, MD4S10); + MD4_STEP (MD4_Go, d, a, b, c, w4_t, MD4C01, MD4S11); + MD4_STEP (MD4_Go, c, d, a, b, w8_t, MD4C01, MD4S12); + MD4_STEP (MD4_Go, b, c, d, a, wc_t, MD4C01, MD4S13); + MD4_STEP (MD4_Go, a, b, c, d, w1_t, MD4C01, MD4S10); + MD4_STEP (MD4_Go, d, a, b, c, w5_t, MD4C01, MD4S11); + MD4_STEP (MD4_Go, c, d, a, b, w9_t, MD4C01, MD4S12); + MD4_STEP (MD4_Go, b, c, d, a, wd_t, MD4C01, MD4S13); + MD4_STEP (MD4_Go, a, b, c, d, w2_t, MD4C01, MD4S10); + MD4_STEP (MD4_Go, d, a, b, c, w6_t, MD4C01, MD4S11); + MD4_STEP (MD4_Go, c, d, a, b, wa_t, MD4C01, MD4S12); + MD4_STEP (MD4_Go, b, c, d, a, we_t, MD4C01, MD4S13); + MD4_STEP (MD4_Go, a, b, c, d, w3_t, MD4C01, MD4S10); + MD4_STEP (MD4_Go, d, a, b, c, w7_t, MD4C01, MD4S11); + MD4_STEP (MD4_Go, c, d, a, b, wb_t, MD4C01, MD4S12); + MD4_STEP (MD4_Go, b, c, d, a, wf_t, MD4C01, MD4S13); + + MD4_STEP (MD4_H , a, b, c, d, w0_t, MD4C02, MD4S20); + MD4_STEP (MD4_H , d, a, b, c, w8_t, MD4C02, MD4S21); + MD4_STEP (MD4_H , c, d, a, b, w4_t, MD4C02, MD4S22); + MD4_STEP (MD4_H , b, c, d, a, wc_t, MD4C02, MD4S23); + MD4_STEP (MD4_H , a, b, c, d, w2_t, MD4C02, MD4S20); + MD4_STEP (MD4_H , d, a, b, c, wa_t, MD4C02, MD4S21); + MD4_STEP (MD4_H , c, d, a, b, w6_t, MD4C02, MD4S22); + MD4_STEP (MD4_H , b, c, d, a, we_t, MD4C02, MD4S23); + MD4_STEP (MD4_H , a, b, c, d, w1_t, MD4C02, MD4S20); + MD4_STEP (MD4_H , d, a, b, c, w9_t, MD4C02, MD4S21); + MD4_STEP (MD4_H , c, d, a, b, w5_t, MD4C02, MD4S22); + MD4_STEP (MD4_H , b, c, d, a, wd_t, MD4C02, MD4S23); + MD4_STEP (MD4_H , a, b, c, d, w3_t, MD4C02, MD4S20); + MD4_STEP (MD4_H , d, a, b, c, wb_t, MD4C02, MD4S21); + MD4_STEP (MD4_H , c, d, a, b, w7_t, MD4C02, MD4S22); + MD4_STEP (MD4_H , b, c, d, a, wf_t, MD4C02, MD4S23); + + digest[0] += a; + digest[1] += b; + digest[2] += c; + digest[3] += d; +} + +__device__ static void md5_transform (const u32x w0[4], const u32x w1[4], const u32x w2[4], const u32x w3[4], u32x digest[4]) +{ + u32x a = digest[0]; + u32x b = digest[1]; + u32x c = digest[2]; + u32x d = digest[3]; + + u32x w0_t = w0[0]; + u32x w1_t = w0[1]; + u32x w2_t = w0[2]; + u32x w3_t = w0[3]; + u32x w4_t = w1[0]; + u32x w5_t = w1[1]; + u32x w6_t = w1[2]; + u32x w7_t = w1[3]; + u32x w8_t = w2[0]; + u32x w9_t = w2[1]; + u32x wa_t = w2[2]; + u32x wb_t = w2[3]; + u32x wc_t = w3[0]; + u32x wd_t = w3[1]; + u32x we_t = w3[2]; + u32x wf_t = w3[3]; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t, MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t, MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t, MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t, MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w4_t, MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w5_t, MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w6_t, MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w7_t, MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w8_t, MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w9_t, MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, wa_t, MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, wb_t, MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, wc_t, MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, wd_t, MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, we_t, MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, wf_t, MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w1_t, MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w6_t, MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, wb_t, MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t, MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w5_t, MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, wa_t, MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, wf_t, MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w4_t, MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w9_t, MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, we_t, MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t, MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w8_t, MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, wd_t, MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t, MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w7_t, MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, wc_t, MD5C1f, MD5S13); + + MD5_STEP (MD5_H , a, b, c, d, w5_t, MD5C20, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w8_t, MD5C21, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, wb_t, MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, we_t, MD5C23, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w1_t, MD5C24, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w4_t, MD5C25, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w7_t, MD5C26, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, wa_t, MD5C27, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, wd_t, MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w0_t, MD5C29, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w3_t, MD5C2a, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w6_t, MD5C2b, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w9_t, MD5C2c, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, wc_t, MD5C2d, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, wf_t, MD5C2e, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w2_t, MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t, MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w7_t, MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, we_t, MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w5_t, MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, wc_t, MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t, MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, wa_t, MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t, MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w8_t, MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, wf_t, MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w6_t, MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, wd_t, MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w4_t, MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, wb_t, MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t, MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w9_t, MD5C3f, MD5S33); + + digest[0] += a; + digest[1] += b; + digest[2] += c; + digest[3] += d; +} + +__device__ static void hmac_md5_pad (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], u32x ipad[4], u32x opad[4]) +{ + w0[0] = w0[0] ^ 0x36363636; + w0[1] = w0[1] ^ 0x36363636; + w0[2] = w0[2] ^ 0x36363636; + w0[3] = w0[3] ^ 0x36363636; + w1[0] = w1[0] ^ 0x36363636; + w1[1] = w1[1] ^ 0x36363636; + w1[2] = w1[2] ^ 0x36363636; + w1[3] = w1[3] ^ 0x36363636; + w2[0] = w2[0] ^ 0x36363636; + w2[1] = w2[1] ^ 0x36363636; + w2[2] = w2[2] ^ 0x36363636; + w2[3] = w2[3] ^ 0x36363636; + w3[0] = w3[0] ^ 0x36363636; + w3[1] = w3[1] ^ 0x36363636; + w3[2] = w3[2] ^ 0x36363636; + w3[3] = w3[3] ^ 0x36363636; + + ipad[0] = MD5M_A; + ipad[1] = MD5M_B; + ipad[2] = MD5M_C; + ipad[3] = MD5M_D; + + md5_transform (w0, w1, w2, w3, ipad); + + w0[0] = w0[0] ^ 0x6a6a6a6a; + w0[1] = w0[1] ^ 0x6a6a6a6a; + w0[2] = w0[2] ^ 0x6a6a6a6a; + w0[3] = w0[3] ^ 0x6a6a6a6a; + w1[0] = w1[0] ^ 0x6a6a6a6a; + w1[1] = w1[1] ^ 0x6a6a6a6a; + w1[2] = w1[2] ^ 0x6a6a6a6a; + w1[3] = w1[3] ^ 0x6a6a6a6a; + w2[0] = w2[0] ^ 0x6a6a6a6a; + w2[1] = w2[1] ^ 0x6a6a6a6a; + w2[2] = w2[2] ^ 0x6a6a6a6a; + w2[3] = w2[3] ^ 0x6a6a6a6a; + w3[0] = w3[0] ^ 0x6a6a6a6a; + w3[1] = w3[1] ^ 0x6a6a6a6a; + w3[2] = w3[2] ^ 0x6a6a6a6a; + w3[3] = w3[3] ^ 0x6a6a6a6a; + + opad[0] = MD5M_A; + opad[1] = MD5M_B; + opad[2] = MD5M_C; + opad[3] = MD5M_D; + + md5_transform (w0, w1, w2, w3, opad); +} + +__device__ static void hmac_md5_run (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], u32x ipad[4], u32x opad[4], u32x digest[4]) +{ + digest[0] = ipad[0]; + digest[1] = ipad[1]; + digest[2] = ipad[2]; + digest[3] = ipad[3]; + + md5_transform (w0, w1, w2, w3, digest); + + w0[0] = digest[0]; + w0[1] = digest[1]; + w0[2] = digest[2]; + w0[3] = digest[3]; + w1[0] = 0x80; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + w3[0] = 0; + w3[1] = 0; + w3[2] = (64 + 16) * 8; + w3[3] = 0; + + digest[0] = opad[0]; + digest[1] = opad[1]; + digest[2] = opad[2]; + digest[3] = opad[3]; + + md5_transform (w0, w1, w2, w3, digest); +} + +__device__ __constant__ gpu_rule_t c_rules[1024]; + +extern "C" __global__ void __launch_bounds__ (256, 1) m05600_m04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const netntlm_t *netntlm_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + u32x pw_buf1[4]; + + pw_buf1[0] = pws[gid].i[ 4]; + pw_buf1[1] = pws[gid].i[ 5]; + pw_buf1[2] = pws[gid].i[ 6]; + pw_buf1[3] = pws[gid].i[ 7]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * salt + */ + + __shared__ u32 s_userdomain_buf[64]; + __shared__ u32 s_chall_buf[256]; + + const u32 userdomain_len = netntlm_bufs[salt_pos].user_len + + netntlm_bufs[salt_pos].domain_len; + + const u32 chall_len = netntlm_bufs[salt_pos].srvchall_len + + netntlm_bufs[salt_pos].clichall_len; + + if (lid < 64) + { + s_userdomain_buf[lid] = netntlm_bufs[salt_pos].userdomain_buf[lid]; + } + + s_chall_buf[lid] = netntlm_bufs[salt_pos].chall_buf[lid]; + + __syncthreads (); + + if (gid >= gid_max) return; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + + w0[0] = pw_buf0[0]; + w0[1] = pw_buf0[1]; + w0[2] = pw_buf0[2]; + w0[3] = pw_buf0[3]; + + u32x w1[4]; + + w1[0] = pw_buf1[0]; + w1[1] = pw_buf1[1]; + w1[2] = pw_buf1[2]; + w1[3] = pw_buf1[3]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 out_len = apply_rules (c_rules[il_pos].cmds, w0, w1, pw_len); + + append_0x80_2 (w0, w1, out_len); + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + make_unicode (w0, w0_t, w1_t); + make_unicode (w1, w2_t, w3_t); + + w3_t[2] = out_len * 8 * 2; + + u32x digest[4]; + + digest[0] = MD4M_A; + digest[1] = MD4M_B; + digest[2] = MD4M_C; + digest[3] = MD4M_D; + + md4_transform (w0_t, w1_t, w2_t, w3_t, digest); + + w0_t[0] = digest[0]; + w0_t[1] = digest[1]; + w0_t[2] = digest[2]; + w0_t[3] = digest[3]; + w1_t[0] = 0; + w1_t[1] = 0; + w1_t[2] = 0; + w1_t[3] = 0; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = 0; + + digest[0] = MD5M_A; + digest[1] = MD5M_B; + digest[2] = MD5M_C; + digest[3] = MD5M_D; + + u32x ipad[4]; + u32x opad[4]; + + hmac_md5_pad (w0_t, w1_t, w2_t, w3_t, ipad, opad); + + int left; + int off; + + for (left = userdomain_len, off = 0; left >= 56; left -= 64, off += 16) + { + w0_t[0] = s_userdomain_buf[off + 0]; + w0_t[1] = s_userdomain_buf[off + 1]; + w0_t[2] = s_userdomain_buf[off + 2]; + w0_t[3] = s_userdomain_buf[off + 3]; + w1_t[0] = s_userdomain_buf[off + 4]; + w1_t[1] = s_userdomain_buf[off + 5]; + w1_t[2] = s_userdomain_buf[off + 6]; + w1_t[3] = s_userdomain_buf[off + 7]; + w2_t[0] = s_userdomain_buf[off + 8]; + w2_t[1] = s_userdomain_buf[off + 9]; + w2_t[2] = s_userdomain_buf[off + 10]; + w2_t[3] = s_userdomain_buf[off + 11]; + w3_t[0] = s_userdomain_buf[off + 12]; + w3_t[1] = s_userdomain_buf[off + 13]; + w3_t[2] = s_userdomain_buf[off + 14]; + w3_t[3] = s_userdomain_buf[off + 15]; + + md5_transform (w0_t, w1_t, w2_t, w3_t, ipad); + } + + w0_t[0] = s_userdomain_buf[off + 0]; + w0_t[1] = s_userdomain_buf[off + 1]; + w0_t[2] = s_userdomain_buf[off + 2]; + w0_t[3] = s_userdomain_buf[off + 3]; + w1_t[0] = s_userdomain_buf[off + 4]; + w1_t[1] = s_userdomain_buf[off + 5]; + w1_t[2] = s_userdomain_buf[off + 6]; + w1_t[3] = s_userdomain_buf[off + 7]; + w2_t[0] = s_userdomain_buf[off + 8]; + w2_t[1] = s_userdomain_buf[off + 9]; + w2_t[2] = s_userdomain_buf[off + 10]; + w2_t[3] = s_userdomain_buf[off + 11]; + w3_t[0] = s_userdomain_buf[off + 12]; + w3_t[1] = s_userdomain_buf[off + 13]; + w3_t[2] = (64 + userdomain_len) * 8; + w3_t[3] = 0; + + hmac_md5_run (w0_t, w1_t, w2_t, w3_t, ipad, opad, digest); + + w0_t[0] = digest[0]; + w0_t[1] = digest[1]; + w0_t[2] = digest[2]; + w0_t[3] = digest[3]; + w1_t[0] = 0; + w1_t[1] = 0; + w1_t[2] = 0; + w1_t[3] = 0; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = 0; + + digest[0] = MD5M_A; + digest[1] = MD5M_B; + digest[2] = MD5M_C; + digest[3] = MD5M_D; + + hmac_md5_pad (w0_t, w1_t, w2_t, w3_t, ipad, opad); + + for (left = chall_len, off = 0; left >= 56; left -= 64, off += 16) + { + w0_t[0] = s_chall_buf[off + 0]; + w0_t[1] = s_chall_buf[off + 1]; + w0_t[2] = s_chall_buf[off + 2]; + w0_t[3] = s_chall_buf[off + 3]; + w1_t[0] = s_chall_buf[off + 4]; + w1_t[1] = s_chall_buf[off + 5]; + w1_t[2] = s_chall_buf[off + 6]; + w1_t[3] = s_chall_buf[off + 7]; + w2_t[0] = s_chall_buf[off + 8]; + w2_t[1] = s_chall_buf[off + 9]; + w2_t[2] = s_chall_buf[off + 10]; + w2_t[3] = s_chall_buf[off + 11]; + w3_t[0] = s_chall_buf[off + 12]; + w3_t[1] = s_chall_buf[off + 13]; + w3_t[2] = s_chall_buf[off + 14]; + w3_t[3] = s_chall_buf[off + 15]; + + md5_transform (w0_t, w1_t, w2_t, w3_t, ipad); + } + + w0_t[0] = s_chall_buf[off + 0]; + w0_t[1] = s_chall_buf[off + 1]; + w0_t[2] = s_chall_buf[off + 2]; + w0_t[3] = s_chall_buf[off + 3]; + w1_t[0] = s_chall_buf[off + 4]; + w1_t[1] = s_chall_buf[off + 5]; + w1_t[2] = s_chall_buf[off + 6]; + w1_t[3] = s_chall_buf[off + 7]; + w2_t[0] = s_chall_buf[off + 8]; + w2_t[1] = s_chall_buf[off + 9]; + w2_t[2] = s_chall_buf[off + 10]; + w2_t[3] = s_chall_buf[off + 11]; + w3_t[0] = s_chall_buf[off + 12]; + w3_t[1] = s_chall_buf[off + 13]; + w3_t[2] = (64 + chall_len) * 8; + w3_t[3] = 0; + + hmac_md5_run (w0_t, w1_t, w2_t, w3_t, ipad, opad, digest); + + const u32x r0 = digest[0]; + const u32x r1 = digest[3]; + const u32x r2 = digest[2]; + const u32x r3 = digest[1]; + + #include VECT_COMPARE_M + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m05600_m08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const netntlm_t *netntlm_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m05600_m16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const netntlm_t *netntlm_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m05600_s04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const netntlm_t *netntlm_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + u32x pw_buf1[4]; + + pw_buf1[0] = pws[gid].i[ 4]; + pw_buf1[1] = pws[gid].i[ 5]; + pw_buf1[2] = pws[gid].i[ 6]; + pw_buf1[3] = pws[gid].i[ 7]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * salt + */ + + __shared__ u32 s_userdomain_buf[64]; + __shared__ u32 s_chall_buf[256]; + + const u32 userdomain_len = netntlm_bufs[salt_pos].user_len + + netntlm_bufs[salt_pos].domain_len; + + const u32 chall_len = netntlm_bufs[salt_pos].srvchall_len + + netntlm_bufs[salt_pos].clichall_len; + + if (lid < 64) + { + s_userdomain_buf[lid] = netntlm_bufs[salt_pos].userdomain_buf[lid]; + } + + s_chall_buf[lid] = netntlm_bufs[salt_pos].chall_buf[lid]; + + __syncthreads (); + + if (gid >= gid_max) return; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + + w0[0] = pw_buf0[0]; + w0[1] = pw_buf0[1]; + w0[2] = pw_buf0[2]; + w0[3] = pw_buf0[3]; + + u32x w1[4]; + + w1[0] = pw_buf1[0]; + w1[1] = pw_buf1[1]; + w1[2] = pw_buf1[2]; + w1[3] = pw_buf1[3]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 out_len = apply_rules (c_rules[il_pos].cmds, w0, w1, pw_len); + + append_0x80_2 (w0, w1, out_len); + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + make_unicode (w0, w0_t, w1_t); + make_unicode (w1, w2_t, w3_t); + + w3_t[2] = out_len * 8 * 2; + + u32x digest[4]; + + digest[0] = MD4M_A; + digest[1] = MD4M_B; + digest[2] = MD4M_C; + digest[3] = MD4M_D; + + md4_transform (w0_t, w1_t, w2_t, w3_t, digest); + + w0_t[0] = digest[0]; + w0_t[1] = digest[1]; + w0_t[2] = digest[2]; + w0_t[3] = digest[3]; + w1_t[0] = 0; + w1_t[1] = 0; + w1_t[2] = 0; + w1_t[3] = 0; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = 0; + + digest[0] = MD5M_A; + digest[1] = MD5M_B; + digest[2] = MD5M_C; + digest[3] = MD5M_D; + + u32x ipad[4]; + u32x opad[4]; + + hmac_md5_pad (w0_t, w1_t, w2_t, w3_t, ipad, opad); + + int left; + int off; + + for (left = userdomain_len, off = 0; left >= 56; left -= 64, off += 16) + { + w0_t[0] = s_userdomain_buf[off + 0]; + w0_t[1] = s_userdomain_buf[off + 1]; + w0_t[2] = s_userdomain_buf[off + 2]; + w0_t[3] = s_userdomain_buf[off + 3]; + w1_t[0] = s_userdomain_buf[off + 4]; + w1_t[1] = s_userdomain_buf[off + 5]; + w1_t[2] = s_userdomain_buf[off + 6]; + w1_t[3] = s_userdomain_buf[off + 7]; + w2_t[0] = s_userdomain_buf[off + 8]; + w2_t[1] = s_userdomain_buf[off + 9]; + w2_t[2] = s_userdomain_buf[off + 10]; + w2_t[3] = s_userdomain_buf[off + 11]; + w3_t[0] = s_userdomain_buf[off + 12]; + w3_t[1] = s_userdomain_buf[off + 13]; + w3_t[2] = s_userdomain_buf[off + 14]; + w3_t[3] = s_userdomain_buf[off + 15]; + + md5_transform (w0_t, w1_t, w2_t, w3_t, ipad); + } + + w0_t[0] = s_userdomain_buf[off + 0]; + w0_t[1] = s_userdomain_buf[off + 1]; + w0_t[2] = s_userdomain_buf[off + 2]; + w0_t[3] = s_userdomain_buf[off + 3]; + w1_t[0] = s_userdomain_buf[off + 4]; + w1_t[1] = s_userdomain_buf[off + 5]; + w1_t[2] = s_userdomain_buf[off + 6]; + w1_t[3] = s_userdomain_buf[off + 7]; + w2_t[0] = s_userdomain_buf[off + 8]; + w2_t[1] = s_userdomain_buf[off + 9]; + w2_t[2] = s_userdomain_buf[off + 10]; + w2_t[3] = s_userdomain_buf[off + 11]; + w3_t[0] = s_userdomain_buf[off + 12]; + w3_t[1] = s_userdomain_buf[off + 13]; + w3_t[2] = (64 + userdomain_len) * 8; + w3_t[3] = 0; + + hmac_md5_run (w0_t, w1_t, w2_t, w3_t, ipad, opad, digest); + + w0_t[0] = digest[0]; + w0_t[1] = digest[1]; + w0_t[2] = digest[2]; + w0_t[3] = digest[3]; + w1_t[0] = 0; + w1_t[1] = 0; + w1_t[2] = 0; + w1_t[3] = 0; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = 0; + + digest[0] = MD5M_A; + digest[1] = MD5M_B; + digest[2] = MD5M_C; + digest[3] = MD5M_D; + + hmac_md5_pad (w0_t, w1_t, w2_t, w3_t, ipad, opad); + + for (left = chall_len, off = 0; left >= 56; left -= 64, off += 16) + { + w0_t[0] = s_chall_buf[off + 0]; + w0_t[1] = s_chall_buf[off + 1]; + w0_t[2] = s_chall_buf[off + 2]; + w0_t[3] = s_chall_buf[off + 3]; + w1_t[0] = s_chall_buf[off + 4]; + w1_t[1] = s_chall_buf[off + 5]; + w1_t[2] = s_chall_buf[off + 6]; + w1_t[3] = s_chall_buf[off + 7]; + w2_t[0] = s_chall_buf[off + 8]; + w2_t[1] = s_chall_buf[off + 9]; + w2_t[2] = s_chall_buf[off + 10]; + w2_t[3] = s_chall_buf[off + 11]; + w3_t[0] = s_chall_buf[off + 12]; + w3_t[1] = s_chall_buf[off + 13]; + w3_t[2] = s_chall_buf[off + 14]; + w3_t[3] = s_chall_buf[off + 15]; + + md5_transform (w0_t, w1_t, w2_t, w3_t, ipad); + } + + w0_t[0] = s_chall_buf[off + 0]; + w0_t[1] = s_chall_buf[off + 1]; + w0_t[2] = s_chall_buf[off + 2]; + w0_t[3] = s_chall_buf[off + 3]; + w1_t[0] = s_chall_buf[off + 4]; + w1_t[1] = s_chall_buf[off + 5]; + w1_t[2] = s_chall_buf[off + 6]; + w1_t[3] = s_chall_buf[off + 7]; + w2_t[0] = s_chall_buf[off + 8]; + w2_t[1] = s_chall_buf[off + 9]; + w2_t[2] = s_chall_buf[off + 10]; + w2_t[3] = s_chall_buf[off + 11]; + w3_t[0] = s_chall_buf[off + 12]; + w3_t[1] = s_chall_buf[off + 13]; + w3_t[2] = (64 + chall_len) * 8; + w3_t[3] = 0; + + hmac_md5_run (w0_t, w1_t, w2_t, w3_t, ipad, opad, digest); + + const u32x r0 = digest[0]; + const u32x r1 = digest[3]; + const u32x r2 = digest[2]; + const u32x r3 = digest[1]; + + #include VECT_COMPARE_S + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m05600_s08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const netntlm_t *netntlm_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m05600_s16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const netntlm_t *netntlm_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/nv/m05600_a1.cu b/nv/m05600_a1.cu new file mode 100644 index 0000000000..d031a271fc --- /dev/null +++ b/nv/m05600_a1.cu @@ -0,0 +1,950 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _NETNTLMV2_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW2 +#define VECT_SIZE1 +#endif + +#define DGST_R0 0 +#define DGST_R1 3 +#define DGST_R2 2 +#define DGST_R3 1 + +#include "include/kernel_functions.c" +#include "types_nv.c" +#include "common_nv.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +__device__ static void md4_transform (const u32x w0[4], const u32x w1[4], const u32x w2[4], const u32x w3[4], u32x digest[4]) +{ + u32x a = digest[0]; + u32x b = digest[1]; + u32x c = digest[2]; + u32x d = digest[3]; + + u32x w0_t = w0[0]; + u32x w1_t = w0[1]; + u32x w2_t = w0[2]; + u32x w3_t = w0[3]; + u32x w4_t = w1[0]; + u32x w5_t = w1[1]; + u32x w6_t = w1[2]; + u32x w7_t = w1[3]; + u32x w8_t = w2[0]; + u32x w9_t = w2[1]; + u32x wa_t = w2[2]; + u32x wb_t = w2[3]; + u32x wc_t = w3[0]; + u32x wd_t = w3[1]; + u32x we_t = w3[2]; + u32x wf_t = w3[3]; + + MD4_STEP (MD4_Fo, a, b, c, d, w0_t, MD4C00, MD4S00); + MD4_STEP (MD4_Fo, d, a, b, c, w1_t, MD4C00, MD4S01); + MD4_STEP (MD4_Fo, c, d, a, b, w2_t, MD4C00, MD4S02); + MD4_STEP (MD4_Fo, b, c, d, a, w3_t, MD4C00, MD4S03); + MD4_STEP (MD4_Fo, a, b, c, d, w4_t, MD4C00, MD4S00); + MD4_STEP (MD4_Fo, d, a, b, c, w5_t, MD4C00, MD4S01); + MD4_STEP (MD4_Fo, c, d, a, b, w6_t, MD4C00, MD4S02); + MD4_STEP (MD4_Fo, b, c, d, a, w7_t, MD4C00, MD4S03); + MD4_STEP (MD4_Fo, a, b, c, d, w8_t, MD4C00, MD4S00); + MD4_STEP (MD4_Fo, d, a, b, c, w9_t, MD4C00, MD4S01); + MD4_STEP (MD4_Fo, c, d, a, b, wa_t, MD4C00, MD4S02); + MD4_STEP (MD4_Fo, b, c, d, a, wb_t, MD4C00, MD4S03); + MD4_STEP (MD4_Fo, a, b, c, d, wc_t, MD4C00, MD4S00); + MD4_STEP (MD4_Fo, d, a, b, c, wd_t, MD4C00, MD4S01); + MD4_STEP (MD4_Fo, c, d, a, b, we_t, MD4C00, MD4S02); + MD4_STEP (MD4_Fo, b, c, d, a, wf_t, MD4C00, MD4S03); + + MD4_STEP (MD4_Go, a, b, c, d, w0_t, MD4C01, MD4S10); + MD4_STEP (MD4_Go, d, a, b, c, w4_t, MD4C01, MD4S11); + MD4_STEP (MD4_Go, c, d, a, b, w8_t, MD4C01, MD4S12); + MD4_STEP (MD4_Go, b, c, d, a, wc_t, MD4C01, MD4S13); + MD4_STEP (MD4_Go, a, b, c, d, w1_t, MD4C01, MD4S10); + MD4_STEP (MD4_Go, d, a, b, c, w5_t, MD4C01, MD4S11); + MD4_STEP (MD4_Go, c, d, a, b, w9_t, MD4C01, MD4S12); + MD4_STEP (MD4_Go, b, c, d, a, wd_t, MD4C01, MD4S13); + MD4_STEP (MD4_Go, a, b, c, d, w2_t, MD4C01, MD4S10); + MD4_STEP (MD4_Go, d, a, b, c, w6_t, MD4C01, MD4S11); + MD4_STEP (MD4_Go, c, d, a, b, wa_t, MD4C01, MD4S12); + MD4_STEP (MD4_Go, b, c, d, a, we_t, MD4C01, MD4S13); + MD4_STEP (MD4_Go, a, b, c, d, w3_t, MD4C01, MD4S10); + MD4_STEP (MD4_Go, d, a, b, c, w7_t, MD4C01, MD4S11); + MD4_STEP (MD4_Go, c, d, a, b, wb_t, MD4C01, MD4S12); + MD4_STEP (MD4_Go, b, c, d, a, wf_t, MD4C01, MD4S13); + + MD4_STEP (MD4_H , a, b, c, d, w0_t, MD4C02, MD4S20); + MD4_STEP (MD4_H , d, a, b, c, w8_t, MD4C02, MD4S21); + MD4_STEP (MD4_H , c, d, a, b, w4_t, MD4C02, MD4S22); + MD4_STEP (MD4_H , b, c, d, a, wc_t, MD4C02, MD4S23); + MD4_STEP (MD4_H , a, b, c, d, w2_t, MD4C02, MD4S20); + MD4_STEP (MD4_H , d, a, b, c, wa_t, MD4C02, MD4S21); + MD4_STEP (MD4_H , c, d, a, b, w6_t, MD4C02, MD4S22); + MD4_STEP (MD4_H , b, c, d, a, we_t, MD4C02, MD4S23); + MD4_STEP (MD4_H , a, b, c, d, w1_t, MD4C02, MD4S20); + MD4_STEP (MD4_H , d, a, b, c, w9_t, MD4C02, MD4S21); + MD4_STEP (MD4_H , c, d, a, b, w5_t, MD4C02, MD4S22); + MD4_STEP (MD4_H , b, c, d, a, wd_t, MD4C02, MD4S23); + MD4_STEP (MD4_H , a, b, c, d, w3_t, MD4C02, MD4S20); + MD4_STEP (MD4_H , d, a, b, c, wb_t, MD4C02, MD4S21); + MD4_STEP (MD4_H , c, d, a, b, w7_t, MD4C02, MD4S22); + MD4_STEP (MD4_H , b, c, d, a, wf_t, MD4C02, MD4S23); + + digest[0] += a; + digest[1] += b; + digest[2] += c; + digest[3] += d; +} + +__device__ static void md5_transform (const u32x w0[4], const u32x w1[4], const u32x w2[4], const u32x w3[4], u32x digest[4]) +{ + u32x a = digest[0]; + u32x b = digest[1]; + u32x c = digest[2]; + u32x d = digest[3]; + + u32x w0_t = w0[0]; + u32x w1_t = w0[1]; + u32x w2_t = w0[2]; + u32x w3_t = w0[3]; + u32x w4_t = w1[0]; + u32x w5_t = w1[1]; + u32x w6_t = w1[2]; + u32x w7_t = w1[3]; + u32x w8_t = w2[0]; + u32x w9_t = w2[1]; + u32x wa_t = w2[2]; + u32x wb_t = w2[3]; + u32x wc_t = w3[0]; + u32x wd_t = w3[1]; + u32x we_t = w3[2]; + u32x wf_t = w3[3]; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t, MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t, MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t, MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t, MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w4_t, MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w5_t, MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w6_t, MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w7_t, MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w8_t, MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w9_t, MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, wa_t, MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, wb_t, MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, wc_t, MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, wd_t, MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, we_t, MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, wf_t, MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w1_t, MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w6_t, MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, wb_t, MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t, MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w5_t, MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, wa_t, MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, wf_t, MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w4_t, MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w9_t, MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, we_t, MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t, MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w8_t, MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, wd_t, MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t, MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w7_t, MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, wc_t, MD5C1f, MD5S13); + + MD5_STEP (MD5_H , a, b, c, d, w5_t, MD5C20, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w8_t, MD5C21, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, wb_t, MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, we_t, MD5C23, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w1_t, MD5C24, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w4_t, MD5C25, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w7_t, MD5C26, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, wa_t, MD5C27, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, wd_t, MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w0_t, MD5C29, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w3_t, MD5C2a, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w6_t, MD5C2b, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w9_t, MD5C2c, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, wc_t, MD5C2d, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, wf_t, MD5C2e, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w2_t, MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t, MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w7_t, MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, we_t, MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w5_t, MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, wc_t, MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t, MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, wa_t, MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t, MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w8_t, MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, wf_t, MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w6_t, MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, wd_t, MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w4_t, MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, wb_t, MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t, MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w9_t, MD5C3f, MD5S33); + + digest[0] += a; + digest[1] += b; + digest[2] += c; + digest[3] += d; +} + +__device__ static void hmac_md5_pad (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], u32x ipad[4], u32x opad[4]) +{ + w0[0] = w0[0] ^ 0x36363636; + w0[1] = w0[1] ^ 0x36363636; + w0[2] = w0[2] ^ 0x36363636; + w0[3] = w0[3] ^ 0x36363636; + w1[0] = w1[0] ^ 0x36363636; + w1[1] = w1[1] ^ 0x36363636; + w1[2] = w1[2] ^ 0x36363636; + w1[3] = w1[3] ^ 0x36363636; + w2[0] = w2[0] ^ 0x36363636; + w2[1] = w2[1] ^ 0x36363636; + w2[2] = w2[2] ^ 0x36363636; + w2[3] = w2[3] ^ 0x36363636; + w3[0] = w3[0] ^ 0x36363636; + w3[1] = w3[1] ^ 0x36363636; + w3[2] = w3[2] ^ 0x36363636; + w3[3] = w3[3] ^ 0x36363636; + + ipad[0] = MD5M_A; + ipad[1] = MD5M_B; + ipad[2] = MD5M_C; + ipad[3] = MD5M_D; + + md5_transform (w0, w1, w2, w3, ipad); + + w0[0] = w0[0] ^ 0x6a6a6a6a; + w0[1] = w0[1] ^ 0x6a6a6a6a; + w0[2] = w0[2] ^ 0x6a6a6a6a; + w0[3] = w0[3] ^ 0x6a6a6a6a; + w1[0] = w1[0] ^ 0x6a6a6a6a; + w1[1] = w1[1] ^ 0x6a6a6a6a; + w1[2] = w1[2] ^ 0x6a6a6a6a; + w1[3] = w1[3] ^ 0x6a6a6a6a; + w2[0] = w2[0] ^ 0x6a6a6a6a; + w2[1] = w2[1] ^ 0x6a6a6a6a; + w2[2] = w2[2] ^ 0x6a6a6a6a; + w2[3] = w2[3] ^ 0x6a6a6a6a; + w3[0] = w3[0] ^ 0x6a6a6a6a; + w3[1] = w3[1] ^ 0x6a6a6a6a; + w3[2] = w3[2] ^ 0x6a6a6a6a; + w3[3] = w3[3] ^ 0x6a6a6a6a; + + opad[0] = MD5M_A; + opad[1] = MD5M_B; + opad[2] = MD5M_C; + opad[3] = MD5M_D; + + md5_transform (w0, w1, w2, w3, opad); +} + +__device__ static void hmac_md5_run (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], u32x ipad[4], u32x opad[4], u32x digest[4]) +{ + digest[0] = ipad[0]; + digest[1] = ipad[1]; + digest[2] = ipad[2]; + digest[3] = ipad[3]; + + md5_transform (w0, w1, w2, w3, digest); + + w0[0] = digest[0]; + w0[1] = digest[1]; + w0[2] = digest[2]; + w0[3] = digest[3]; + w1[0] = 0x80; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + w3[0] = 0; + w3[1] = 0; + w3[2] = (64 + 16) * 8; + w3[3] = 0; + + digest[0] = opad[0]; + digest[1] = opad[1]; + digest[2] = opad[2]; + digest[3] = opad[3]; + + md5_transform (w0, w1, w2, w3, digest); +} + +__device__ __constant__ comb_t c_combs[1024]; + +extern "C" __global__ void __launch_bounds__ (256, 1) m05600_m04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const netntlm_t *netntlm_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + append_0x80_2 (wordl0, wordl1, pw_l_len); + + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, c_combs[0].pw_len); + } + + /** + * salt + */ + + __shared__ u32 s_userdomain_buf[64]; + __shared__ u32 s_chall_buf[256]; + + const u32 userdomain_len = netntlm_bufs[salt_pos].user_len + + netntlm_bufs[salt_pos].domain_len; + + const u32 chall_len = netntlm_bufs[salt_pos].srvchall_len + + netntlm_bufs[salt_pos].clichall_len; + + if (lid < 64) + { + s_userdomain_buf[lid] = netntlm_bufs[salt_pos].userdomain_buf[lid]; + } + + s_chall_buf[lid] = netntlm_bufs[salt_pos].chall_buf[lid]; + + __syncthreads (); + + if (gid >= gid_max) return; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = c_combs[il_pos].pw_len; + + const u32 pw_len = pw_l_len + pw_r_len; + + u32 wordr0[4]; + + wordr0[0] = c_combs[il_pos].i[0]; + wordr0[1] = c_combs[il_pos].i[1]; + wordr0[2] = c_combs[il_pos].i[2]; + wordr0[3] = c_combs[il_pos].i[3]; + + u32 wordr1[4]; + + wordr1[0] = c_combs[il_pos].i[4]; + wordr1[1] = c_combs[il_pos].i[5]; + wordr1[2] = c_combs[il_pos].i[6]; + wordr1[3] = c_combs[il_pos].i[7]; + + u32 wordr2[4]; + + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + + u32 wordr3[4]; + + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + u32x w0[4]; + + w0[0] = wordl0[0] | wordr0[0]; + w0[1] = wordl0[1] | wordr0[1]; + w0[2] = wordl0[2] | wordr0[2]; + w0[3] = wordl0[3] | wordr0[3]; + + u32x w1[4]; + + w1[0] = wordl1[0] | wordr1[0]; + w1[1] = wordl1[1] | wordr1[1]; + w1[2] = wordl1[2] | wordr1[2]; + w1[3] = wordl1[3] | wordr1[3]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + make_unicode (w0, w0_t, w1_t); + make_unicode (w1, w2_t, w3_t); + + w3_t[2] = pw_len * 8 * 2; + + u32x digest[4]; + + digest[0] = MD4M_A; + digest[1] = MD4M_B; + digest[2] = MD4M_C; + digest[3] = MD4M_D; + + md4_transform (w0_t, w1_t, w2_t, w3_t, digest); + + w0_t[0] = digest[0]; + w0_t[1] = digest[1]; + w0_t[2] = digest[2]; + w0_t[3] = digest[3]; + w1_t[0] = 0; + w1_t[1] = 0; + w1_t[2] = 0; + w1_t[3] = 0; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = 0; + + digest[0] = MD5M_A; + digest[1] = MD5M_B; + digest[2] = MD5M_C; + digest[3] = MD5M_D; + + u32x ipad[4]; + u32x opad[4]; + + hmac_md5_pad (w0_t, w1_t, w2_t, w3_t, ipad, opad); + + int left; + int off; + + for (left = userdomain_len, off = 0; left >= 56; left -= 64, off += 16) + { + w0_t[0] = s_userdomain_buf[off + 0]; + w0_t[1] = s_userdomain_buf[off + 1]; + w0_t[2] = s_userdomain_buf[off + 2]; + w0_t[3] = s_userdomain_buf[off + 3]; + w1_t[0] = s_userdomain_buf[off + 4]; + w1_t[1] = s_userdomain_buf[off + 5]; + w1_t[2] = s_userdomain_buf[off + 6]; + w1_t[3] = s_userdomain_buf[off + 7]; + w2_t[0] = s_userdomain_buf[off + 8]; + w2_t[1] = s_userdomain_buf[off + 9]; + w2_t[2] = s_userdomain_buf[off + 10]; + w2_t[3] = s_userdomain_buf[off + 11]; + w3_t[0] = s_userdomain_buf[off + 12]; + w3_t[1] = s_userdomain_buf[off + 13]; + w3_t[2] = s_userdomain_buf[off + 14]; + w3_t[3] = s_userdomain_buf[off + 15]; + + md5_transform (w0_t, w1_t, w2_t, w3_t, ipad); + } + + w0_t[0] = s_userdomain_buf[off + 0]; + w0_t[1] = s_userdomain_buf[off + 1]; + w0_t[2] = s_userdomain_buf[off + 2]; + w0_t[3] = s_userdomain_buf[off + 3]; + w1_t[0] = s_userdomain_buf[off + 4]; + w1_t[1] = s_userdomain_buf[off + 5]; + w1_t[2] = s_userdomain_buf[off + 6]; + w1_t[3] = s_userdomain_buf[off + 7]; + w2_t[0] = s_userdomain_buf[off + 8]; + w2_t[1] = s_userdomain_buf[off + 9]; + w2_t[2] = s_userdomain_buf[off + 10]; + w2_t[3] = s_userdomain_buf[off + 11]; + w3_t[0] = s_userdomain_buf[off + 12]; + w3_t[1] = s_userdomain_buf[off + 13]; + w3_t[2] = (64 + userdomain_len) * 8; + w3_t[3] = 0; + + hmac_md5_run (w0_t, w1_t, w2_t, w3_t, ipad, opad, digest); + + w0_t[0] = digest[0]; + w0_t[1] = digest[1]; + w0_t[2] = digest[2]; + w0_t[3] = digest[3]; + w1_t[0] = 0; + w1_t[1] = 0; + w1_t[2] = 0; + w1_t[3] = 0; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = 0; + + digest[0] = MD5M_A; + digest[1] = MD5M_B; + digest[2] = MD5M_C; + digest[3] = MD5M_D; + + hmac_md5_pad (w0_t, w1_t, w2_t, w3_t, ipad, opad); + + for (left = chall_len, off = 0; left >= 56; left -= 64, off += 16) + { + w0_t[0] = s_chall_buf[off + 0]; + w0_t[1] = s_chall_buf[off + 1]; + w0_t[2] = s_chall_buf[off + 2]; + w0_t[3] = s_chall_buf[off + 3]; + w1_t[0] = s_chall_buf[off + 4]; + w1_t[1] = s_chall_buf[off + 5]; + w1_t[2] = s_chall_buf[off + 6]; + w1_t[3] = s_chall_buf[off + 7]; + w2_t[0] = s_chall_buf[off + 8]; + w2_t[1] = s_chall_buf[off + 9]; + w2_t[2] = s_chall_buf[off + 10]; + w2_t[3] = s_chall_buf[off + 11]; + w3_t[0] = s_chall_buf[off + 12]; + w3_t[1] = s_chall_buf[off + 13]; + w3_t[2] = s_chall_buf[off + 14]; + w3_t[3] = s_chall_buf[off + 15]; + + md5_transform (w0_t, w1_t, w2_t, w3_t, ipad); + } + + w0_t[0] = s_chall_buf[off + 0]; + w0_t[1] = s_chall_buf[off + 1]; + w0_t[2] = s_chall_buf[off + 2]; + w0_t[3] = s_chall_buf[off + 3]; + w1_t[0] = s_chall_buf[off + 4]; + w1_t[1] = s_chall_buf[off + 5]; + w1_t[2] = s_chall_buf[off + 6]; + w1_t[3] = s_chall_buf[off + 7]; + w2_t[0] = s_chall_buf[off + 8]; + w2_t[1] = s_chall_buf[off + 9]; + w2_t[2] = s_chall_buf[off + 10]; + w2_t[3] = s_chall_buf[off + 11]; + w3_t[0] = s_chall_buf[off + 12]; + w3_t[1] = s_chall_buf[off + 13]; + w3_t[2] = (64 + chall_len) * 8; + w3_t[3] = 0; + + hmac_md5_run (w0_t, w1_t, w2_t, w3_t, ipad, opad, digest); + + const u32x r0 = digest[0]; + const u32x r1 = digest[3]; + const u32x r2 = digest[2]; + const u32x r3 = digest[1]; + + #include VECT_COMPARE_M + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m05600_m08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const netntlm_t *netntlm_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m05600_m16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const netntlm_t *netntlm_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m05600_s04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const netntlm_t *netntlm_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + append_0x80_2 (wordl0, wordl1, pw_l_len); + + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, c_combs[0].pw_len); + } + + /** + * salt + */ + + __shared__ u32 s_userdomain_buf[64]; + __shared__ u32 s_chall_buf[256]; + + const u32 userdomain_len = netntlm_bufs[salt_pos].user_len + + netntlm_bufs[salt_pos].domain_len; + + const u32 chall_len = netntlm_bufs[salt_pos].srvchall_len + + netntlm_bufs[salt_pos].clichall_len; + + if (lid < 64) + { + s_userdomain_buf[lid] = netntlm_bufs[salt_pos].userdomain_buf[lid]; + } + + s_chall_buf[lid] = netntlm_bufs[salt_pos].chall_buf[lid]; + + __syncthreads (); + + if (gid >= gid_max) return; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = c_combs[il_pos].pw_len; + + const u32 pw_len = pw_l_len + pw_r_len; + + u32 wordr0[4]; + + wordr0[0] = c_combs[il_pos].i[0]; + wordr0[1] = c_combs[il_pos].i[1]; + wordr0[2] = c_combs[il_pos].i[2]; + wordr0[3] = c_combs[il_pos].i[3]; + + u32 wordr1[4]; + + wordr1[0] = c_combs[il_pos].i[4]; + wordr1[1] = c_combs[il_pos].i[5]; + wordr1[2] = c_combs[il_pos].i[6]; + wordr1[3] = c_combs[il_pos].i[7]; + + u32 wordr2[4]; + + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + + u32 wordr3[4]; + + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + u32x w0[4]; + + w0[0] = wordl0[0] | wordr0[0]; + w0[1] = wordl0[1] | wordr0[1]; + w0[2] = wordl0[2] | wordr0[2]; + w0[3] = wordl0[3] | wordr0[3]; + + u32x w1[4]; + + w1[0] = wordl1[0] | wordr1[0]; + w1[1] = wordl1[1] | wordr1[1]; + w1[2] = wordl1[2] | wordr1[2]; + w1[3] = wordl1[3] | wordr1[3]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + make_unicode (w0, w0_t, w1_t); + make_unicode (w1, w2_t, w3_t); + + w3_t[2] = pw_len * 8 * 2; + + u32x digest[4]; + + digest[0] = MD4M_A; + digest[1] = MD4M_B; + digest[2] = MD4M_C; + digest[3] = MD4M_D; + + md4_transform (w0_t, w1_t, w2_t, w3_t, digest); + + w0_t[0] = digest[0]; + w0_t[1] = digest[1]; + w0_t[2] = digest[2]; + w0_t[3] = digest[3]; + w1_t[0] = 0; + w1_t[1] = 0; + w1_t[2] = 0; + w1_t[3] = 0; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = 0; + + digest[0] = MD5M_A; + digest[1] = MD5M_B; + digest[2] = MD5M_C; + digest[3] = MD5M_D; + + u32x ipad[4]; + u32x opad[4]; + + hmac_md5_pad (w0_t, w1_t, w2_t, w3_t, ipad, opad); + + int left; + int off; + + for (left = userdomain_len, off = 0; left >= 56; left -= 64, off += 16) + { + w0_t[0] = s_userdomain_buf[off + 0]; + w0_t[1] = s_userdomain_buf[off + 1]; + w0_t[2] = s_userdomain_buf[off + 2]; + w0_t[3] = s_userdomain_buf[off + 3]; + w1_t[0] = s_userdomain_buf[off + 4]; + w1_t[1] = s_userdomain_buf[off + 5]; + w1_t[2] = s_userdomain_buf[off + 6]; + w1_t[3] = s_userdomain_buf[off + 7]; + w2_t[0] = s_userdomain_buf[off + 8]; + w2_t[1] = s_userdomain_buf[off + 9]; + w2_t[2] = s_userdomain_buf[off + 10]; + w2_t[3] = s_userdomain_buf[off + 11]; + w3_t[0] = s_userdomain_buf[off + 12]; + w3_t[1] = s_userdomain_buf[off + 13]; + w3_t[2] = s_userdomain_buf[off + 14]; + w3_t[3] = s_userdomain_buf[off + 15]; + + md5_transform (w0_t, w1_t, w2_t, w3_t, ipad); + } + + w0_t[0] = s_userdomain_buf[off + 0]; + w0_t[1] = s_userdomain_buf[off + 1]; + w0_t[2] = s_userdomain_buf[off + 2]; + w0_t[3] = s_userdomain_buf[off + 3]; + w1_t[0] = s_userdomain_buf[off + 4]; + w1_t[1] = s_userdomain_buf[off + 5]; + w1_t[2] = s_userdomain_buf[off + 6]; + w1_t[3] = s_userdomain_buf[off + 7]; + w2_t[0] = s_userdomain_buf[off + 8]; + w2_t[1] = s_userdomain_buf[off + 9]; + w2_t[2] = s_userdomain_buf[off + 10]; + w2_t[3] = s_userdomain_buf[off + 11]; + w3_t[0] = s_userdomain_buf[off + 12]; + w3_t[1] = s_userdomain_buf[off + 13]; + w3_t[2] = (64 + userdomain_len) * 8; + w3_t[3] = 0; + + hmac_md5_run (w0_t, w1_t, w2_t, w3_t, ipad, opad, digest); + + w0_t[0] = digest[0]; + w0_t[1] = digest[1]; + w0_t[2] = digest[2]; + w0_t[3] = digest[3]; + w1_t[0] = 0; + w1_t[1] = 0; + w1_t[2] = 0; + w1_t[3] = 0; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = 0; + + digest[0] = MD5M_A; + digest[1] = MD5M_B; + digest[2] = MD5M_C; + digest[3] = MD5M_D; + + hmac_md5_pad (w0_t, w1_t, w2_t, w3_t, ipad, opad); + + for (left = chall_len, off = 0; left >= 56; left -= 64, off += 16) + { + w0_t[0] = s_chall_buf[off + 0]; + w0_t[1] = s_chall_buf[off + 1]; + w0_t[2] = s_chall_buf[off + 2]; + w0_t[3] = s_chall_buf[off + 3]; + w1_t[0] = s_chall_buf[off + 4]; + w1_t[1] = s_chall_buf[off + 5]; + w1_t[2] = s_chall_buf[off + 6]; + w1_t[3] = s_chall_buf[off + 7]; + w2_t[0] = s_chall_buf[off + 8]; + w2_t[1] = s_chall_buf[off + 9]; + w2_t[2] = s_chall_buf[off + 10]; + w2_t[3] = s_chall_buf[off + 11]; + w3_t[0] = s_chall_buf[off + 12]; + w3_t[1] = s_chall_buf[off + 13]; + w3_t[2] = s_chall_buf[off + 14]; + w3_t[3] = s_chall_buf[off + 15]; + + md5_transform (w0_t, w1_t, w2_t, w3_t, ipad); + } + + w0_t[0] = s_chall_buf[off + 0]; + w0_t[1] = s_chall_buf[off + 1]; + w0_t[2] = s_chall_buf[off + 2]; + w0_t[3] = s_chall_buf[off + 3]; + w1_t[0] = s_chall_buf[off + 4]; + w1_t[1] = s_chall_buf[off + 5]; + w1_t[2] = s_chall_buf[off + 6]; + w1_t[3] = s_chall_buf[off + 7]; + w2_t[0] = s_chall_buf[off + 8]; + w2_t[1] = s_chall_buf[off + 9]; + w2_t[2] = s_chall_buf[off + 10]; + w2_t[3] = s_chall_buf[off + 11]; + w3_t[0] = s_chall_buf[off + 12]; + w3_t[1] = s_chall_buf[off + 13]; + w3_t[2] = (64 + chall_len) * 8; + w3_t[3] = 0; + + hmac_md5_run (w0_t, w1_t, w2_t, w3_t, ipad, opad, digest); + + const u32x r0 = digest[0]; + const u32x r1 = digest[3]; + const u32x r2 = digest[2]; + const u32x r3 = digest[1]; + + #include VECT_COMPARE_S + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m05600_s08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const netntlm_t *netntlm_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m05600_s16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const netntlm_t *netntlm_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/nv/m05600_a3.cu b/nv/m05600_a3.cu new file mode 100644 index 0000000000..1a1e2e3e97 --- /dev/null +++ b/nv/m05600_a3.cu @@ -0,0 +1,958 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _NETNTLMV2_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW2 +#define VECT_SIZE1 +#endif + +#define DGST_R0 0 +#define DGST_R1 3 +#define DGST_R2 2 +#define DGST_R3 1 + +#include "include/kernel_functions.c" +#include "types_nv.c" +#include "common_nv.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +__device__ static void md4_transform (const u32x w0[4], const u32x w1[4], const u32x w2[4], const u32x w3[4], u32x digest[4]) +{ + u32x a = digest[0]; + u32x b = digest[1]; + u32x c = digest[2]; + u32x d = digest[3]; + + u32x w0_t = w0[0]; + u32x w1_t = w0[1]; + u32x w2_t = w0[2]; + u32x w3_t = w0[3]; + u32x w4_t = w1[0]; + u32x w5_t = w1[1]; + u32x w6_t = w1[2]; + u32x w7_t = w1[3]; + u32x w8_t = w2[0]; + u32x w9_t = w2[1]; + u32x wa_t = w2[2]; + u32x wb_t = w2[3]; + u32x wc_t = w3[0]; + u32x wd_t = w3[1]; + u32x we_t = w3[2]; + u32x wf_t = w3[3]; + + MD4_STEP (MD4_Fo, a, b, c, d, w0_t, MD4C00, MD4S00); + MD4_STEP (MD4_Fo, d, a, b, c, w1_t, MD4C00, MD4S01); + MD4_STEP (MD4_Fo, c, d, a, b, w2_t, MD4C00, MD4S02); + MD4_STEP (MD4_Fo, b, c, d, a, w3_t, MD4C00, MD4S03); + MD4_STEP (MD4_Fo, a, b, c, d, w4_t, MD4C00, MD4S00); + MD4_STEP (MD4_Fo, d, a, b, c, w5_t, MD4C00, MD4S01); + MD4_STEP (MD4_Fo, c, d, a, b, w6_t, MD4C00, MD4S02); + MD4_STEP (MD4_Fo, b, c, d, a, w7_t, MD4C00, MD4S03); + MD4_STEP (MD4_Fo, a, b, c, d, w8_t, MD4C00, MD4S00); + MD4_STEP (MD4_Fo, d, a, b, c, w9_t, MD4C00, MD4S01); + MD4_STEP (MD4_Fo, c, d, a, b, wa_t, MD4C00, MD4S02); + MD4_STEP (MD4_Fo, b, c, d, a, wb_t, MD4C00, MD4S03); + MD4_STEP (MD4_Fo, a, b, c, d, wc_t, MD4C00, MD4S00); + MD4_STEP (MD4_Fo, d, a, b, c, wd_t, MD4C00, MD4S01); + MD4_STEP (MD4_Fo, c, d, a, b, we_t, MD4C00, MD4S02); + MD4_STEP (MD4_Fo, b, c, d, a, wf_t, MD4C00, MD4S03); + + MD4_STEP (MD4_Go, a, b, c, d, w0_t, MD4C01, MD4S10); + MD4_STEP (MD4_Go, d, a, b, c, w4_t, MD4C01, MD4S11); + MD4_STEP (MD4_Go, c, d, a, b, w8_t, MD4C01, MD4S12); + MD4_STEP (MD4_Go, b, c, d, a, wc_t, MD4C01, MD4S13); + MD4_STEP (MD4_Go, a, b, c, d, w1_t, MD4C01, MD4S10); + MD4_STEP (MD4_Go, d, a, b, c, w5_t, MD4C01, MD4S11); + MD4_STEP (MD4_Go, c, d, a, b, w9_t, MD4C01, MD4S12); + MD4_STEP (MD4_Go, b, c, d, a, wd_t, MD4C01, MD4S13); + MD4_STEP (MD4_Go, a, b, c, d, w2_t, MD4C01, MD4S10); + MD4_STEP (MD4_Go, d, a, b, c, w6_t, MD4C01, MD4S11); + MD4_STEP (MD4_Go, c, d, a, b, wa_t, MD4C01, MD4S12); + MD4_STEP (MD4_Go, b, c, d, a, we_t, MD4C01, MD4S13); + MD4_STEP (MD4_Go, a, b, c, d, w3_t, MD4C01, MD4S10); + MD4_STEP (MD4_Go, d, a, b, c, w7_t, MD4C01, MD4S11); + MD4_STEP (MD4_Go, c, d, a, b, wb_t, MD4C01, MD4S12); + MD4_STEP (MD4_Go, b, c, d, a, wf_t, MD4C01, MD4S13); + + MD4_STEP (MD4_H , a, b, c, d, w0_t, MD4C02, MD4S20); + MD4_STEP (MD4_H , d, a, b, c, w8_t, MD4C02, MD4S21); + MD4_STEP (MD4_H , c, d, a, b, w4_t, MD4C02, MD4S22); + MD4_STEP (MD4_H , b, c, d, a, wc_t, MD4C02, MD4S23); + MD4_STEP (MD4_H , a, b, c, d, w2_t, MD4C02, MD4S20); + MD4_STEP (MD4_H , d, a, b, c, wa_t, MD4C02, MD4S21); + MD4_STEP (MD4_H , c, d, a, b, w6_t, MD4C02, MD4S22); + MD4_STEP (MD4_H , b, c, d, a, we_t, MD4C02, MD4S23); + MD4_STEP (MD4_H , a, b, c, d, w1_t, MD4C02, MD4S20); + MD4_STEP (MD4_H , d, a, b, c, w9_t, MD4C02, MD4S21); + MD4_STEP (MD4_H , c, d, a, b, w5_t, MD4C02, MD4S22); + MD4_STEP (MD4_H , b, c, d, a, wd_t, MD4C02, MD4S23); + MD4_STEP (MD4_H , a, b, c, d, w3_t, MD4C02, MD4S20); + MD4_STEP (MD4_H , d, a, b, c, wb_t, MD4C02, MD4S21); + MD4_STEP (MD4_H , c, d, a, b, w7_t, MD4C02, MD4S22); + MD4_STEP (MD4_H , b, c, d, a, wf_t, MD4C02, MD4S23); + + digest[0] += a; + digest[1] += b; + digest[2] += c; + digest[3] += d; +} + +__device__ static void md5_transform (const u32x w0[4], const u32x w1[4], const u32x w2[4], const u32x w3[4], u32x digest[4]) +{ + u32x a = digest[0]; + u32x b = digest[1]; + u32x c = digest[2]; + u32x d = digest[3]; + + u32x w0_t = w0[0]; + u32x w1_t = w0[1]; + u32x w2_t = w0[2]; + u32x w3_t = w0[3]; + u32x w4_t = w1[0]; + u32x w5_t = w1[1]; + u32x w6_t = w1[2]; + u32x w7_t = w1[3]; + u32x w8_t = w2[0]; + u32x w9_t = w2[1]; + u32x wa_t = w2[2]; + u32x wb_t = w2[3]; + u32x wc_t = w3[0]; + u32x wd_t = w3[1]; + u32x we_t = w3[2]; + u32x wf_t = w3[3]; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t, MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t, MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t, MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t, MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w4_t, MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w5_t, MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w6_t, MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w7_t, MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w8_t, MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w9_t, MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, wa_t, MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, wb_t, MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, wc_t, MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, wd_t, MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, we_t, MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, wf_t, MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w1_t, MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w6_t, MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, wb_t, MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t, MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w5_t, MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, wa_t, MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, wf_t, MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w4_t, MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w9_t, MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, we_t, MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t, MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w8_t, MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, wd_t, MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t, MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w7_t, MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, wc_t, MD5C1f, MD5S13); + + MD5_STEP (MD5_H , a, b, c, d, w5_t, MD5C20, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w8_t, MD5C21, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, wb_t, MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, we_t, MD5C23, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w1_t, MD5C24, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w4_t, MD5C25, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w7_t, MD5C26, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, wa_t, MD5C27, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, wd_t, MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w0_t, MD5C29, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w3_t, MD5C2a, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w6_t, MD5C2b, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w9_t, MD5C2c, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, wc_t, MD5C2d, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, wf_t, MD5C2e, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w2_t, MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t, MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w7_t, MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, we_t, MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w5_t, MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, wc_t, MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t, MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, wa_t, MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t, MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w8_t, MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, wf_t, MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w6_t, MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, wd_t, MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w4_t, MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, wb_t, MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t, MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w9_t, MD5C3f, MD5S33); + + digest[0] += a; + digest[1] += b; + digest[2] += c; + digest[3] += d; +} + +__device__ static void hmac_md5_pad (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], u32x ipad[4], u32x opad[4]) +{ + w0[0] = w0[0] ^ 0x36363636; + w0[1] = w0[1] ^ 0x36363636; + w0[2] = w0[2] ^ 0x36363636; + w0[3] = w0[3] ^ 0x36363636; + w1[0] = w1[0] ^ 0x36363636; + w1[1] = w1[1] ^ 0x36363636; + w1[2] = w1[2] ^ 0x36363636; + w1[3] = w1[3] ^ 0x36363636; + w2[0] = w2[0] ^ 0x36363636; + w2[1] = w2[1] ^ 0x36363636; + w2[2] = w2[2] ^ 0x36363636; + w2[3] = w2[3] ^ 0x36363636; + w3[0] = w3[0] ^ 0x36363636; + w3[1] = w3[1] ^ 0x36363636; + w3[2] = w3[2] ^ 0x36363636; + w3[3] = w3[3] ^ 0x36363636; + + ipad[0] = MD5M_A; + ipad[1] = MD5M_B; + ipad[2] = MD5M_C; + ipad[3] = MD5M_D; + + md5_transform (w0, w1, w2, w3, ipad); + + w0[0] = w0[0] ^ 0x6a6a6a6a; + w0[1] = w0[1] ^ 0x6a6a6a6a; + w0[2] = w0[2] ^ 0x6a6a6a6a; + w0[3] = w0[3] ^ 0x6a6a6a6a; + w1[0] = w1[0] ^ 0x6a6a6a6a; + w1[1] = w1[1] ^ 0x6a6a6a6a; + w1[2] = w1[2] ^ 0x6a6a6a6a; + w1[3] = w1[3] ^ 0x6a6a6a6a; + w2[0] = w2[0] ^ 0x6a6a6a6a; + w2[1] = w2[1] ^ 0x6a6a6a6a; + w2[2] = w2[2] ^ 0x6a6a6a6a; + w2[3] = w2[3] ^ 0x6a6a6a6a; + w3[0] = w3[0] ^ 0x6a6a6a6a; + w3[1] = w3[1] ^ 0x6a6a6a6a; + w3[2] = w3[2] ^ 0x6a6a6a6a; + w3[3] = w3[3] ^ 0x6a6a6a6a; + + opad[0] = MD5M_A; + opad[1] = MD5M_B; + opad[2] = MD5M_C; + opad[3] = MD5M_D; + + md5_transform (w0, w1, w2, w3, opad); +} + +__device__ static void hmac_md5_run (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], u32x ipad[4], u32x opad[4], u32x digest[4]) +{ + digest[0] = ipad[0]; + digest[1] = ipad[1]; + digest[2] = ipad[2]; + digest[3] = ipad[3]; + + md5_transform (w0, w1, w2, w3, digest); + + w0[0] = digest[0]; + w0[1] = digest[1]; + w0[2] = digest[2]; + w0[3] = digest[3]; + w1[0] = 0x80; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + w3[0] = 0; + w3[1] = 0; + w3[2] = (64 + 16) * 8; + w3[3] = 0; + + digest[0] = opad[0]; + digest[1] = opad[1]; + digest[2] = opad[2]; + digest[3] = opad[3]; + + md5_transform (w0, w1, w2, w3, digest); +} + +__device__ __constant__ bf_t c_bfs[1024]; + +__device__ static void m05600m (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], const u32 pw_len, const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const netntlm_t *netntlm_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, u32 s_userdomain_buf[64], u32 s_chall_buf[256]) +{ + /** + * modifier + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + const u32 lid = threadIdx.x; + + /** + * prepare + */ + + const u32 userdomain_len = netntlm_bufs[salt_pos].user_len + + netntlm_bufs[salt_pos].domain_len; + + const u32 chall_len = netntlm_bufs[salt_pos].srvchall_len + + netntlm_bufs[salt_pos].clichall_len; + + /** + * loop + */ + + u32x w0l = w0[0]; + + for (u32 il_pos = 0; il_pos < bfs_cnt; il_pos++) + { + const u32 w0r = c_bfs[il_pos].i; + + w0[0] = w0l | w0r; + + u32x digest[4]; + + digest[0] = MD4M_A; + digest[1] = MD4M_B; + digest[2] = MD4M_C; + digest[3] = MD4M_D; + + md4_transform (w0, w1, w2, w3, digest); + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + w0_t[0] = digest[0]; + w0_t[1] = digest[1]; + w0_t[2] = digest[2]; + w0_t[3] = digest[3]; + w1_t[0] = 0; + w1_t[1] = 0; + w1_t[2] = 0; + w1_t[3] = 0; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = 0; + + digest[0] = MD5M_A; + digest[1] = MD5M_B; + digest[2] = MD5M_C; + digest[3] = MD5M_D; + + u32x ipad[4]; + u32x opad[4]; + + hmac_md5_pad (w0_t, w1_t, w2_t, w3_t, ipad, opad); + + int left; + int off; + + for (left = userdomain_len, off = 0; left >= 56; left -= 64, off += 16) + { + w0_t[0] = s_userdomain_buf[off + 0]; + w0_t[1] = s_userdomain_buf[off + 1]; + w0_t[2] = s_userdomain_buf[off + 2]; + w0_t[3] = s_userdomain_buf[off + 3]; + w1_t[0] = s_userdomain_buf[off + 4]; + w1_t[1] = s_userdomain_buf[off + 5]; + w1_t[2] = s_userdomain_buf[off + 6]; + w1_t[3] = s_userdomain_buf[off + 7]; + w2_t[0] = s_userdomain_buf[off + 8]; + w2_t[1] = s_userdomain_buf[off + 9]; + w2_t[2] = s_userdomain_buf[off + 10]; + w2_t[3] = s_userdomain_buf[off + 11]; + w3_t[0] = s_userdomain_buf[off + 12]; + w3_t[1] = s_userdomain_buf[off + 13]; + w3_t[2] = s_userdomain_buf[off + 14]; + w3_t[3] = s_userdomain_buf[off + 15]; + + md5_transform (w0_t, w1_t, w2_t, w3_t, ipad); + } + + w0_t[0] = s_userdomain_buf[off + 0]; + w0_t[1] = s_userdomain_buf[off + 1]; + w0_t[2] = s_userdomain_buf[off + 2]; + w0_t[3] = s_userdomain_buf[off + 3]; + w1_t[0] = s_userdomain_buf[off + 4]; + w1_t[1] = s_userdomain_buf[off + 5]; + w1_t[2] = s_userdomain_buf[off + 6]; + w1_t[3] = s_userdomain_buf[off + 7]; + w2_t[0] = s_userdomain_buf[off + 8]; + w2_t[1] = s_userdomain_buf[off + 9]; + w2_t[2] = s_userdomain_buf[off + 10]; + w2_t[3] = s_userdomain_buf[off + 11]; + w3_t[0] = s_userdomain_buf[off + 12]; + w3_t[1] = s_userdomain_buf[off + 13]; + w3_t[2] = (64 + userdomain_len) * 8; + w3_t[3] = 0; + + hmac_md5_run (w0_t, w1_t, w2_t, w3_t, ipad, opad, digest); + + w0_t[0] = digest[0]; + w0_t[1] = digest[1]; + w0_t[2] = digest[2]; + w0_t[3] = digest[3]; + w1_t[0] = 0; + w1_t[1] = 0; + w1_t[2] = 0; + w1_t[3] = 0; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = 0; + + digest[0] = MD5M_A; + digest[1] = MD5M_B; + digest[2] = MD5M_C; + digest[3] = MD5M_D; + + hmac_md5_pad (w0_t, w1_t, w2_t, w3_t, ipad, opad); + + for (left = chall_len, off = 0; left >= 56; left -= 64, off += 16) + { + w0_t[0] = s_chall_buf[off + 0]; + w0_t[1] = s_chall_buf[off + 1]; + w0_t[2] = s_chall_buf[off + 2]; + w0_t[3] = s_chall_buf[off + 3]; + w1_t[0] = s_chall_buf[off + 4]; + w1_t[1] = s_chall_buf[off + 5]; + w1_t[2] = s_chall_buf[off + 6]; + w1_t[3] = s_chall_buf[off + 7]; + w2_t[0] = s_chall_buf[off + 8]; + w2_t[1] = s_chall_buf[off + 9]; + w2_t[2] = s_chall_buf[off + 10]; + w2_t[3] = s_chall_buf[off + 11]; + w3_t[0] = s_chall_buf[off + 12]; + w3_t[1] = s_chall_buf[off + 13]; + w3_t[2] = s_chall_buf[off + 14]; + w3_t[3] = s_chall_buf[off + 15]; + + md5_transform (w0_t, w1_t, w2_t, w3_t, ipad); + } + + w0_t[0] = s_chall_buf[off + 0]; + w0_t[1] = s_chall_buf[off + 1]; + w0_t[2] = s_chall_buf[off + 2]; + w0_t[3] = s_chall_buf[off + 3]; + w1_t[0] = s_chall_buf[off + 4]; + w1_t[1] = s_chall_buf[off + 5]; + w1_t[2] = s_chall_buf[off + 6]; + w1_t[3] = s_chall_buf[off + 7]; + w2_t[0] = s_chall_buf[off + 8]; + w2_t[1] = s_chall_buf[off + 9]; + w2_t[2] = s_chall_buf[off + 10]; + w2_t[3] = s_chall_buf[off + 11]; + w3_t[0] = s_chall_buf[off + 12]; + w3_t[1] = s_chall_buf[off + 13]; + w3_t[2] = (64 + chall_len) * 8; + w3_t[3] = 0; + + hmac_md5_run (w0_t, w1_t, w2_t, w3_t, ipad, opad, digest); + + const u32x r0 = digest[0]; + const u32x r1 = digest[3]; + const u32x r2 = digest[2]; + const u32x r3 = digest[1]; + + #include VECT_COMPARE_M + } +} + +__device__ static void m05600s (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], const u32 pw_len, const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const netntlm_t *netntlm_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, u32 s_userdomain_buf[64], u32 s_chall_buf[256]) +{ + /** + * modifier + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + const u32 lid = threadIdx.x; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * prepare + */ + + const u32 userdomain_len = netntlm_bufs[salt_pos].user_len + + netntlm_bufs[salt_pos].domain_len; + + const u32 chall_len = netntlm_bufs[salt_pos].srvchall_len + + netntlm_bufs[salt_pos].clichall_len; + + /** + * loop + */ + + u32x w0l = w0[0]; + + for (u32 il_pos = 0; il_pos < bfs_cnt; il_pos++) + { + const u32 w0r = c_bfs[il_pos].i; + + w0[0] = w0l | w0r; + + u32x digest[4]; + + digest[0] = MD4M_A; + digest[1] = MD4M_B; + digest[2] = MD4M_C; + digest[3] = MD4M_D; + + md4_transform (w0, w1, w2, w3, digest); + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + w0_t[0] = digest[0]; + w0_t[1] = digest[1]; + w0_t[2] = digest[2]; + w0_t[3] = digest[3]; + w1_t[0] = 0; + w1_t[1] = 0; + w1_t[2] = 0; + w1_t[3] = 0; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = 0; + + digest[0] = MD5M_A; + digest[1] = MD5M_B; + digest[2] = MD5M_C; + digest[3] = MD5M_D; + + u32x ipad[4]; + u32x opad[4]; + + hmac_md5_pad (w0_t, w1_t, w2_t, w3_t, ipad, opad); + + int left; + int off; + + for (left = userdomain_len, off = 0; left >= 56; left -= 64, off += 16) + { + w0_t[0] = s_userdomain_buf[off + 0]; + w0_t[1] = s_userdomain_buf[off + 1]; + w0_t[2] = s_userdomain_buf[off + 2]; + w0_t[3] = s_userdomain_buf[off + 3]; + w1_t[0] = s_userdomain_buf[off + 4]; + w1_t[1] = s_userdomain_buf[off + 5]; + w1_t[2] = s_userdomain_buf[off + 6]; + w1_t[3] = s_userdomain_buf[off + 7]; + w2_t[0] = s_userdomain_buf[off + 8]; + w2_t[1] = s_userdomain_buf[off + 9]; + w2_t[2] = s_userdomain_buf[off + 10]; + w2_t[3] = s_userdomain_buf[off + 11]; + w3_t[0] = s_userdomain_buf[off + 12]; + w3_t[1] = s_userdomain_buf[off + 13]; + w3_t[2] = s_userdomain_buf[off + 14]; + w3_t[3] = s_userdomain_buf[off + 15]; + + md5_transform (w0_t, w1_t, w2_t, w3_t, ipad); + } + + w0_t[0] = s_userdomain_buf[off + 0]; + w0_t[1] = s_userdomain_buf[off + 1]; + w0_t[2] = s_userdomain_buf[off + 2]; + w0_t[3] = s_userdomain_buf[off + 3]; + w1_t[0] = s_userdomain_buf[off + 4]; + w1_t[1] = s_userdomain_buf[off + 5]; + w1_t[2] = s_userdomain_buf[off + 6]; + w1_t[3] = s_userdomain_buf[off + 7]; + w2_t[0] = s_userdomain_buf[off + 8]; + w2_t[1] = s_userdomain_buf[off + 9]; + w2_t[2] = s_userdomain_buf[off + 10]; + w2_t[3] = s_userdomain_buf[off + 11]; + w3_t[0] = s_userdomain_buf[off + 12]; + w3_t[1] = s_userdomain_buf[off + 13]; + w3_t[2] = (64 + userdomain_len) * 8; + w3_t[3] = 0; + + hmac_md5_run (w0_t, w1_t, w2_t, w3_t, ipad, opad, digest); + + w0_t[0] = digest[0]; + w0_t[1] = digest[1]; + w0_t[2] = digest[2]; + w0_t[3] = digest[3]; + w1_t[0] = 0; + w1_t[1] = 0; + w1_t[2] = 0; + w1_t[3] = 0; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = 0; + + digest[0] = MD5M_A; + digest[1] = MD5M_B; + digest[2] = MD5M_C; + digest[3] = MD5M_D; + + hmac_md5_pad (w0_t, w1_t, w2_t, w3_t, ipad, opad); + + for (left = chall_len, off = 0; left >= 56; left -= 64, off += 16) + { + w0_t[0] = s_chall_buf[off + 0]; + w0_t[1] = s_chall_buf[off + 1]; + w0_t[2] = s_chall_buf[off + 2]; + w0_t[3] = s_chall_buf[off + 3]; + w1_t[0] = s_chall_buf[off + 4]; + w1_t[1] = s_chall_buf[off + 5]; + w1_t[2] = s_chall_buf[off + 6]; + w1_t[3] = s_chall_buf[off + 7]; + w2_t[0] = s_chall_buf[off + 8]; + w2_t[1] = s_chall_buf[off + 9]; + w2_t[2] = s_chall_buf[off + 10]; + w2_t[3] = s_chall_buf[off + 11]; + w3_t[0] = s_chall_buf[off + 12]; + w3_t[1] = s_chall_buf[off + 13]; + w3_t[2] = s_chall_buf[off + 14]; + w3_t[3] = s_chall_buf[off + 15]; + + md5_transform (w0_t, w1_t, w2_t, w3_t, ipad); + } + + w0_t[0] = s_chall_buf[off + 0]; + w0_t[1] = s_chall_buf[off + 1]; + w0_t[2] = s_chall_buf[off + 2]; + w0_t[3] = s_chall_buf[off + 3]; + w1_t[0] = s_chall_buf[off + 4]; + w1_t[1] = s_chall_buf[off + 5]; + w1_t[2] = s_chall_buf[off + 6]; + w1_t[3] = s_chall_buf[off + 7]; + w2_t[0] = s_chall_buf[off + 8]; + w2_t[1] = s_chall_buf[off + 9]; + w2_t[2] = s_chall_buf[off + 10]; + w2_t[3] = s_chall_buf[off + 11]; + w3_t[0] = s_chall_buf[off + 12]; + w3_t[1] = s_chall_buf[off + 13]; + w3_t[2] = (64 + chall_len) * 8; + w3_t[3] = 0; + + hmac_md5_run (w0_t, w1_t, w2_t, w3_t, ipad, opad, digest); + + const u32x r0 = digest[0]; + const u32x r1 = digest[3]; + const u32x r2 = digest[2]; + const u32x r3 = digest[1]; + + #include VECT_COMPARE_S + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m05600_m04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const netntlm_t *netntlm_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + const u32 lid = threadIdx.x; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = pws[gid].i[14]; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * salt + */ + + __shared__ u32 s_userdomain_buf[64]; + __shared__ u32 s_chall_buf[256]; + + if (lid < 64) + { + s_userdomain_buf[lid] = netntlm_bufs[salt_pos].userdomain_buf[lid]; + } + + s_chall_buf[lid] = netntlm_bufs[salt_pos].chall_buf[lid]; + + __syncthreads (); + + if (gid >= gid_max) return; + + /** + * main + */ + + m05600m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, netntlm_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset, s_userdomain_buf, s_chall_buf); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m05600_m08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const netntlm_t *netntlm_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + const u32 lid = threadIdx.x; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = pws[gid].i[14]; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * salt + */ + + __shared__ u32 s_userdomain_buf[64]; + __shared__ u32 s_chall_buf[256]; + + if (lid < 64) + { + s_userdomain_buf[lid] = netntlm_bufs[salt_pos].userdomain_buf[lid]; + } + + s_chall_buf[lid] = netntlm_bufs[salt_pos].chall_buf[lid]; + + __syncthreads (); + + if (gid >= gid_max) return; + + /** + * main + */ + + m05600m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, netntlm_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset, s_userdomain_buf, s_chall_buf); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m05600_m16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const netntlm_t *netntlm_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m05600_s04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const netntlm_t *netntlm_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + const u32 lid = threadIdx.x; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = pws[gid].i[14]; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * salt + */ + + __shared__ u32 s_userdomain_buf[64]; + __shared__ u32 s_chall_buf[256]; + + if (lid < 64) + { + s_userdomain_buf[lid] = netntlm_bufs[salt_pos].userdomain_buf[lid]; + } + + s_chall_buf[lid] = netntlm_bufs[salt_pos].chall_buf[lid]; + + __syncthreads (); + + if (gid >= gid_max) return; + + /** + * main + */ + + m05600s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, netntlm_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset, s_userdomain_buf, s_chall_buf); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m05600_s08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const netntlm_t *netntlm_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + const u32 lid = threadIdx.x; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = pws[gid].i[14]; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * salt + */ + + __shared__ u32 s_userdomain_buf[64]; + __shared__ u32 s_chall_buf[256]; + + if (lid < 64) + { + s_userdomain_buf[lid] = netntlm_bufs[salt_pos].userdomain_buf[lid]; + } + + s_chall_buf[lid] = netntlm_bufs[salt_pos].chall_buf[lid]; + + __syncthreads (); + + if (gid >= gid_max) return; + + /** + * main + */ + + m05600s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, netntlm_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset, s_userdomain_buf, s_chall_buf); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m05600_s16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const netntlm_t *netntlm_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/nv/m05800.cu b/nv/m05800.cu new file mode 100644 index 0000000000..d2a0371ea7 --- /dev/null +++ b/nv/m05800.cu @@ -0,0 +1,729 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _SHA1_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW2 +#define VECT_SIZE1 +#endif + +#define DGST_R0 0 +#define DGST_R1 1 +#define DGST_R2 2 +#define DGST_R3 3 + +#include "include/kernel_functions.c" +#include "types_nv.c" +#include "common_nv.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +typedef struct +{ + u32 dec; + u32 len; + +} entry_t; + +__device__ __constant__ entry_t pc[1024] = +{ + 0x00000030, 1, 0x00000031, 1, 0x00000032, 1, 0x00000033, 1, 0x00000034, 1, 0x00000035, 1, 0x00000036, 1, 0x00000037, 1, + 0x00000038, 1, 0x00000039, 1, 0x00003031, 2, 0x00003131, 2, 0x00003231, 2, 0x00003331, 2, 0x00003431, 2, 0x00003531, 2, + 0x00003631, 2, 0x00003731, 2, 0x00003831, 2, 0x00003931, 2, 0x00003032, 2, 0x00003132, 2, 0x00003232, 2, 0x00003332, 2, + 0x00003432, 2, 0x00003532, 2, 0x00003632, 2, 0x00003732, 2, 0x00003832, 2, 0x00003932, 2, 0x00003033, 2, 0x00003133, 2, + 0x00003233, 2, 0x00003333, 2, 0x00003433, 2, 0x00003533, 2, 0x00003633, 2, 0x00003733, 2, 0x00003833, 2, 0x00003933, 2, + 0x00003034, 2, 0x00003134, 2, 0x00003234, 2, 0x00003334, 2, 0x00003434, 2, 0x00003534, 2, 0x00003634, 2, 0x00003734, 2, + 0x00003834, 2, 0x00003934, 2, 0x00003035, 2, 0x00003135, 2, 0x00003235, 2, 0x00003335, 2, 0x00003435, 2, 0x00003535, 2, + 0x00003635, 2, 0x00003735, 2, 0x00003835, 2, 0x00003935, 2, 0x00003036, 2, 0x00003136, 2, 0x00003236, 2, 0x00003336, 2, + 0x00003436, 2, 0x00003536, 2, 0x00003636, 2, 0x00003736, 2, 0x00003836, 2, 0x00003936, 2, 0x00003037, 2, 0x00003137, 2, + 0x00003237, 2, 0x00003337, 2, 0x00003437, 2, 0x00003537, 2, 0x00003637, 2, 0x00003737, 2, 0x00003837, 2, 0x00003937, 2, + 0x00003038, 2, 0x00003138, 2, 0x00003238, 2, 0x00003338, 2, 0x00003438, 2, 0x00003538, 2, 0x00003638, 2, 0x00003738, 2, + 0x00003838, 2, 0x00003938, 2, 0x00003039, 2, 0x00003139, 2, 0x00003239, 2, 0x00003339, 2, 0x00003439, 2, 0x00003539, 2, + 0x00003639, 2, 0x00003739, 2, 0x00003839, 2, 0x00003939, 2, 0x00303031, 3, 0x00313031, 3, 0x00323031, 3, 0x00333031, 3, + 0x00343031, 3, 0x00353031, 3, 0x00363031, 3, 0x00373031, 3, 0x00383031, 3, 0x00393031, 3, 0x00303131, 3, 0x00313131, 3, + 0x00323131, 3, 0x00333131, 3, 0x00343131, 3, 0x00353131, 3, 0x00363131, 3, 0x00373131, 3, 0x00383131, 3, 0x00393131, 3, + 0x00303231, 3, 0x00313231, 3, 0x00323231, 3, 0x00333231, 3, 0x00343231, 3, 0x00353231, 3, 0x00363231, 3, 0x00373231, 3, + 0x00383231, 3, 0x00393231, 3, 0x00303331, 3, 0x00313331, 3, 0x00323331, 3, 0x00333331, 3, 0x00343331, 3, 0x00353331, 3, + 0x00363331, 3, 0x00373331, 3, 0x00383331, 3, 0x00393331, 3, 0x00303431, 3, 0x00313431, 3, 0x00323431, 3, 0x00333431, 3, + 0x00343431, 3, 0x00353431, 3, 0x00363431, 3, 0x00373431, 3, 0x00383431, 3, 0x00393431, 3, 0x00303531, 3, 0x00313531, 3, + 0x00323531, 3, 0x00333531, 3, 0x00343531, 3, 0x00353531, 3, 0x00363531, 3, 0x00373531, 3, 0x00383531, 3, 0x00393531, 3, + 0x00303631, 3, 0x00313631, 3, 0x00323631, 3, 0x00333631, 3, 0x00343631, 3, 0x00353631, 3, 0x00363631, 3, 0x00373631, 3, + 0x00383631, 3, 0x00393631, 3, 0x00303731, 3, 0x00313731, 3, 0x00323731, 3, 0x00333731, 3, 0x00343731, 3, 0x00353731, 3, + 0x00363731, 3, 0x00373731, 3, 0x00383731, 3, 0x00393731, 3, 0x00303831, 3, 0x00313831, 3, 0x00323831, 3, 0x00333831, 3, + 0x00343831, 3, 0x00353831, 3, 0x00363831, 3, 0x00373831, 3, 0x00383831, 3, 0x00393831, 3, 0x00303931, 3, 0x00313931, 3, + 0x00323931, 3, 0x00333931, 3, 0x00343931, 3, 0x00353931, 3, 0x00363931, 3, 0x00373931, 3, 0x00383931, 3, 0x00393931, 3, + 0x00303032, 3, 0x00313032, 3, 0x00323032, 3, 0x00333032, 3, 0x00343032, 3, 0x00353032, 3, 0x00363032, 3, 0x00373032, 3, + 0x00383032, 3, 0x00393032, 3, 0x00303132, 3, 0x00313132, 3, 0x00323132, 3, 0x00333132, 3, 0x00343132, 3, 0x00353132, 3, + 0x00363132, 3, 0x00373132, 3, 0x00383132, 3, 0x00393132, 3, 0x00303232, 3, 0x00313232, 3, 0x00323232, 3, 0x00333232, 3, + 0x00343232, 3, 0x00353232, 3, 0x00363232, 3, 0x00373232, 3, 0x00383232, 3, 0x00393232, 3, 0x00303332, 3, 0x00313332, 3, + 0x00323332, 3, 0x00333332, 3, 0x00343332, 3, 0x00353332, 3, 0x00363332, 3, 0x00373332, 3, 0x00383332, 3, 0x00393332, 3, + 0x00303432, 3, 0x00313432, 3, 0x00323432, 3, 0x00333432, 3, 0x00343432, 3, 0x00353432, 3, 0x00363432, 3, 0x00373432, 3, + 0x00383432, 3, 0x00393432, 3, 0x00303532, 3, 0x00313532, 3, 0x00323532, 3, 0x00333532, 3, 0x00343532, 3, 0x00353532, 3, + 0x00363532, 3, 0x00373532, 3, 0x00383532, 3, 0x00393532, 3, 0x00303632, 3, 0x00313632, 3, 0x00323632, 3, 0x00333632, 3, + 0x00343632, 3, 0x00353632, 3, 0x00363632, 3, 0x00373632, 3, 0x00383632, 3, 0x00393632, 3, 0x00303732, 3, 0x00313732, 3, + 0x00323732, 3, 0x00333732, 3, 0x00343732, 3, 0x00353732, 3, 0x00363732, 3, 0x00373732, 3, 0x00383732, 3, 0x00393732, 3, + 0x00303832, 3, 0x00313832, 3, 0x00323832, 3, 0x00333832, 3, 0x00343832, 3, 0x00353832, 3, 0x00363832, 3, 0x00373832, 3, + 0x00383832, 3, 0x00393832, 3, 0x00303932, 3, 0x00313932, 3, 0x00323932, 3, 0x00333932, 3, 0x00343932, 3, 0x00353932, 3, + 0x00363932, 3, 0x00373932, 3, 0x00383932, 3, 0x00393932, 3, 0x00303033, 3, 0x00313033, 3, 0x00323033, 3, 0x00333033, 3, + 0x00343033, 3, 0x00353033, 3, 0x00363033, 3, 0x00373033, 3, 0x00383033, 3, 0x00393033, 3, 0x00303133, 3, 0x00313133, 3, + 0x00323133, 3, 0x00333133, 3, 0x00343133, 3, 0x00353133, 3, 0x00363133, 3, 0x00373133, 3, 0x00383133, 3, 0x00393133, 3, + 0x00303233, 3, 0x00313233, 3, 0x00323233, 3, 0x00333233, 3, 0x00343233, 3, 0x00353233, 3, 0x00363233, 3, 0x00373233, 3, + 0x00383233, 3, 0x00393233, 3, 0x00303333, 3, 0x00313333, 3, 0x00323333, 3, 0x00333333, 3, 0x00343333, 3, 0x00353333, 3, + 0x00363333, 3, 0x00373333, 3, 0x00383333, 3, 0x00393333, 3, 0x00303433, 3, 0x00313433, 3, 0x00323433, 3, 0x00333433, 3, + 0x00343433, 3, 0x00353433, 3, 0x00363433, 3, 0x00373433, 3, 0x00383433, 3, 0x00393433, 3, 0x00303533, 3, 0x00313533, 3, + 0x00323533, 3, 0x00333533, 3, 0x00343533, 3, 0x00353533, 3, 0x00363533, 3, 0x00373533, 3, 0x00383533, 3, 0x00393533, 3, + 0x00303633, 3, 0x00313633, 3, 0x00323633, 3, 0x00333633, 3, 0x00343633, 3, 0x00353633, 3, 0x00363633, 3, 0x00373633, 3, + 0x00383633, 3, 0x00393633, 3, 0x00303733, 3, 0x00313733, 3, 0x00323733, 3, 0x00333733, 3, 0x00343733, 3, 0x00353733, 3, + 0x00363733, 3, 0x00373733, 3, 0x00383733, 3, 0x00393733, 3, 0x00303833, 3, 0x00313833, 3, 0x00323833, 3, 0x00333833, 3, + 0x00343833, 3, 0x00353833, 3, 0x00363833, 3, 0x00373833, 3, 0x00383833, 3, 0x00393833, 3, 0x00303933, 3, 0x00313933, 3, + 0x00323933, 3, 0x00333933, 3, 0x00343933, 3, 0x00353933, 3, 0x00363933, 3, 0x00373933, 3, 0x00383933, 3, 0x00393933, 3, + 0x00303034, 3, 0x00313034, 3, 0x00323034, 3, 0x00333034, 3, 0x00343034, 3, 0x00353034, 3, 0x00363034, 3, 0x00373034, 3, + 0x00383034, 3, 0x00393034, 3, 0x00303134, 3, 0x00313134, 3, 0x00323134, 3, 0x00333134, 3, 0x00343134, 3, 0x00353134, 3, + 0x00363134, 3, 0x00373134, 3, 0x00383134, 3, 0x00393134, 3, 0x00303234, 3, 0x00313234, 3, 0x00323234, 3, 0x00333234, 3, + 0x00343234, 3, 0x00353234, 3, 0x00363234, 3, 0x00373234, 3, 0x00383234, 3, 0x00393234, 3, 0x00303334, 3, 0x00313334, 3, + 0x00323334, 3, 0x00333334, 3, 0x00343334, 3, 0x00353334, 3, 0x00363334, 3, 0x00373334, 3, 0x00383334, 3, 0x00393334, 3, + 0x00303434, 3, 0x00313434, 3, 0x00323434, 3, 0x00333434, 3, 0x00343434, 3, 0x00353434, 3, 0x00363434, 3, 0x00373434, 3, + 0x00383434, 3, 0x00393434, 3, 0x00303534, 3, 0x00313534, 3, 0x00323534, 3, 0x00333534, 3, 0x00343534, 3, 0x00353534, 3, + 0x00363534, 3, 0x00373534, 3, 0x00383534, 3, 0x00393534, 3, 0x00303634, 3, 0x00313634, 3, 0x00323634, 3, 0x00333634, 3, + 0x00343634, 3, 0x00353634, 3, 0x00363634, 3, 0x00373634, 3, 0x00383634, 3, 0x00393634, 3, 0x00303734, 3, 0x00313734, 3, + 0x00323734, 3, 0x00333734, 3, 0x00343734, 3, 0x00353734, 3, 0x00363734, 3, 0x00373734, 3, 0x00383734, 3, 0x00393734, 3, + 0x00303834, 3, 0x00313834, 3, 0x00323834, 3, 0x00333834, 3, 0x00343834, 3, 0x00353834, 3, 0x00363834, 3, 0x00373834, 3, + 0x00383834, 3, 0x00393834, 3, 0x00303934, 3, 0x00313934, 3, 0x00323934, 3, 0x00333934, 3, 0x00343934, 3, 0x00353934, 3, + 0x00363934, 3, 0x00373934, 3, 0x00383934, 3, 0x00393934, 3, 0x00303035, 3, 0x00313035, 3, 0x00323035, 3, 0x00333035, 3, + 0x00343035, 3, 0x00353035, 3, 0x00363035, 3, 0x00373035, 3, 0x00383035, 3, 0x00393035, 3, 0x00303135, 3, 0x00313135, 3, + 0x00323135, 3, 0x00333135, 3, 0x00343135, 3, 0x00353135, 3, 0x00363135, 3, 0x00373135, 3, 0x00383135, 3, 0x00393135, 3, + 0x00303235, 3, 0x00313235, 3, 0x00323235, 3, 0x00333235, 3, 0x00343235, 3, 0x00353235, 3, 0x00363235, 3, 0x00373235, 3, + 0x00383235, 3, 0x00393235, 3, 0x00303335, 3, 0x00313335, 3, 0x00323335, 3, 0x00333335, 3, 0x00343335, 3, 0x00353335, 3, + 0x00363335, 3, 0x00373335, 3, 0x00383335, 3, 0x00393335, 3, 0x00303435, 3, 0x00313435, 3, 0x00323435, 3, 0x00333435, 3, + 0x00343435, 3, 0x00353435, 3, 0x00363435, 3, 0x00373435, 3, 0x00383435, 3, 0x00393435, 3, 0x00303535, 3, 0x00313535, 3, + 0x00323535, 3, 0x00333535, 3, 0x00343535, 3, 0x00353535, 3, 0x00363535, 3, 0x00373535, 3, 0x00383535, 3, 0x00393535, 3, + 0x00303635, 3, 0x00313635, 3, 0x00323635, 3, 0x00333635, 3, 0x00343635, 3, 0x00353635, 3, 0x00363635, 3, 0x00373635, 3, + 0x00383635, 3, 0x00393635, 3, 0x00303735, 3, 0x00313735, 3, 0x00323735, 3, 0x00333735, 3, 0x00343735, 3, 0x00353735, 3, + 0x00363735, 3, 0x00373735, 3, 0x00383735, 3, 0x00393735, 3, 0x00303835, 3, 0x00313835, 3, 0x00323835, 3, 0x00333835, 3, + 0x00343835, 3, 0x00353835, 3, 0x00363835, 3, 0x00373835, 3, 0x00383835, 3, 0x00393835, 3, 0x00303935, 3, 0x00313935, 3, + 0x00323935, 3, 0x00333935, 3, 0x00343935, 3, 0x00353935, 3, 0x00363935, 3, 0x00373935, 3, 0x00383935, 3, 0x00393935, 3, + 0x00303036, 3, 0x00313036, 3, 0x00323036, 3, 0x00333036, 3, 0x00343036, 3, 0x00353036, 3, 0x00363036, 3, 0x00373036, 3, + 0x00383036, 3, 0x00393036, 3, 0x00303136, 3, 0x00313136, 3, 0x00323136, 3, 0x00333136, 3, 0x00343136, 3, 0x00353136, 3, + 0x00363136, 3, 0x00373136, 3, 0x00383136, 3, 0x00393136, 3, 0x00303236, 3, 0x00313236, 3, 0x00323236, 3, 0x00333236, 3, + 0x00343236, 3, 0x00353236, 3, 0x00363236, 3, 0x00373236, 3, 0x00383236, 3, 0x00393236, 3, 0x00303336, 3, 0x00313336, 3, + 0x00323336, 3, 0x00333336, 3, 0x00343336, 3, 0x00353336, 3, 0x00363336, 3, 0x00373336, 3, 0x00383336, 3, 0x00393336, 3, + 0x00303436, 3, 0x00313436, 3, 0x00323436, 3, 0x00333436, 3, 0x00343436, 3, 0x00353436, 3, 0x00363436, 3, 0x00373436, 3, + 0x00383436, 3, 0x00393436, 3, 0x00303536, 3, 0x00313536, 3, 0x00323536, 3, 0x00333536, 3, 0x00343536, 3, 0x00353536, 3, + 0x00363536, 3, 0x00373536, 3, 0x00383536, 3, 0x00393536, 3, 0x00303636, 3, 0x00313636, 3, 0x00323636, 3, 0x00333636, 3, + 0x00343636, 3, 0x00353636, 3, 0x00363636, 3, 0x00373636, 3, 0x00383636, 3, 0x00393636, 3, 0x00303736, 3, 0x00313736, 3, + 0x00323736, 3, 0x00333736, 3, 0x00343736, 3, 0x00353736, 3, 0x00363736, 3, 0x00373736, 3, 0x00383736, 3, 0x00393736, 3, + 0x00303836, 3, 0x00313836, 3, 0x00323836, 3, 0x00333836, 3, 0x00343836, 3, 0x00353836, 3, 0x00363836, 3, 0x00373836, 3, + 0x00383836, 3, 0x00393836, 3, 0x00303936, 3, 0x00313936, 3, 0x00323936, 3, 0x00333936, 3, 0x00343936, 3, 0x00353936, 3, + 0x00363936, 3, 0x00373936, 3, 0x00383936, 3, 0x00393936, 3, 0x00303037, 3, 0x00313037, 3, 0x00323037, 3, 0x00333037, 3, + 0x00343037, 3, 0x00353037, 3, 0x00363037, 3, 0x00373037, 3, 0x00383037, 3, 0x00393037, 3, 0x00303137, 3, 0x00313137, 3, + 0x00323137, 3, 0x00333137, 3, 0x00343137, 3, 0x00353137, 3, 0x00363137, 3, 0x00373137, 3, 0x00383137, 3, 0x00393137, 3, + 0x00303237, 3, 0x00313237, 3, 0x00323237, 3, 0x00333237, 3, 0x00343237, 3, 0x00353237, 3, 0x00363237, 3, 0x00373237, 3, + 0x00383237, 3, 0x00393237, 3, 0x00303337, 3, 0x00313337, 3, 0x00323337, 3, 0x00333337, 3, 0x00343337, 3, 0x00353337, 3, + 0x00363337, 3, 0x00373337, 3, 0x00383337, 3, 0x00393337, 3, 0x00303437, 3, 0x00313437, 3, 0x00323437, 3, 0x00333437, 3, + 0x00343437, 3, 0x00353437, 3, 0x00363437, 3, 0x00373437, 3, 0x00383437, 3, 0x00393437, 3, 0x00303537, 3, 0x00313537, 3, + 0x00323537, 3, 0x00333537, 3, 0x00343537, 3, 0x00353537, 3, 0x00363537, 3, 0x00373537, 3, 0x00383537, 3, 0x00393537, 3, + 0x00303637, 3, 0x00313637, 3, 0x00323637, 3, 0x00333637, 3, 0x00343637, 3, 0x00353637, 3, 0x00363637, 3, 0x00373637, 3, + 0x00383637, 3, 0x00393637, 3, 0x00303737, 3, 0x00313737, 3, 0x00323737, 3, 0x00333737, 3, 0x00343737, 3, 0x00353737, 3, + 0x00363737, 3, 0x00373737, 3, 0x00383737, 3, 0x00393737, 3, 0x00303837, 3, 0x00313837, 3, 0x00323837, 3, 0x00333837, 3, + 0x00343837, 3, 0x00353837, 3, 0x00363837, 3, 0x00373837, 3, 0x00383837, 3, 0x00393837, 3, 0x00303937, 3, 0x00313937, 3, + 0x00323937, 3, 0x00333937, 3, 0x00343937, 3, 0x00353937, 3, 0x00363937, 3, 0x00373937, 3, 0x00383937, 3, 0x00393937, 3, + 0x00303038, 3, 0x00313038, 3, 0x00323038, 3, 0x00333038, 3, 0x00343038, 3, 0x00353038, 3, 0x00363038, 3, 0x00373038, 3, + 0x00383038, 3, 0x00393038, 3, 0x00303138, 3, 0x00313138, 3, 0x00323138, 3, 0x00333138, 3, 0x00343138, 3, 0x00353138, 3, + 0x00363138, 3, 0x00373138, 3, 0x00383138, 3, 0x00393138, 3, 0x00303238, 3, 0x00313238, 3, 0x00323238, 3, 0x00333238, 3, + 0x00343238, 3, 0x00353238, 3, 0x00363238, 3, 0x00373238, 3, 0x00383238, 3, 0x00393238, 3, 0x00303338, 3, 0x00313338, 3, + 0x00323338, 3, 0x00333338, 3, 0x00343338, 3, 0x00353338, 3, 0x00363338, 3, 0x00373338, 3, 0x00383338, 3, 0x00393338, 3, + 0x00303438, 3, 0x00313438, 3, 0x00323438, 3, 0x00333438, 3, 0x00343438, 3, 0x00353438, 3, 0x00363438, 3, 0x00373438, 3, + 0x00383438, 3, 0x00393438, 3, 0x00303538, 3, 0x00313538, 3, 0x00323538, 3, 0x00333538, 3, 0x00343538, 3, 0x00353538, 3, + 0x00363538, 3, 0x00373538, 3, 0x00383538, 3, 0x00393538, 3, 0x00303638, 3, 0x00313638, 3, 0x00323638, 3, 0x00333638, 3, + 0x00343638, 3, 0x00353638, 3, 0x00363638, 3, 0x00373638, 3, 0x00383638, 3, 0x00393638, 3, 0x00303738, 3, 0x00313738, 3, + 0x00323738, 3, 0x00333738, 3, 0x00343738, 3, 0x00353738, 3, 0x00363738, 3, 0x00373738, 3, 0x00383738, 3, 0x00393738, 3, + 0x00303838, 3, 0x00313838, 3, 0x00323838, 3, 0x00333838, 3, 0x00343838, 3, 0x00353838, 3, 0x00363838, 3, 0x00373838, 3, + 0x00383838, 3, 0x00393838, 3, 0x00303938, 3, 0x00313938, 3, 0x00323938, 3, 0x00333938, 3, 0x00343938, 3, 0x00353938, 3, + 0x00363938, 3, 0x00373938, 3, 0x00383938, 3, 0x00393938, 3, 0x00303039, 3, 0x00313039, 3, 0x00323039, 3, 0x00333039, 3, + 0x00343039, 3, 0x00353039, 3, 0x00363039, 3, 0x00373039, 3, 0x00383039, 3, 0x00393039, 3, 0x00303139, 3, 0x00313139, 3, + 0x00323139, 3, 0x00333139, 3, 0x00343139, 3, 0x00353139, 3, 0x00363139, 3, 0x00373139, 3, 0x00383139, 3, 0x00393139, 3, + 0x00303239, 3, 0x00313239, 3, 0x00323239, 3, 0x00333239, 3, 0x00343239, 3, 0x00353239, 3, 0x00363239, 3, 0x00373239, 3, + 0x00383239, 3, 0x00393239, 3, 0x00303339, 3, 0x00313339, 3, 0x00323339, 3, 0x00333339, 3, 0x00343339, 3, 0x00353339, 3, + 0x00363339, 3, 0x00373339, 3, 0x00383339, 3, 0x00393339, 3, 0x00303439, 3, 0x00313439, 3, 0x00323439, 3, 0x00333439, 3, + 0x00343439, 3, 0x00353439, 3, 0x00363439, 3, 0x00373439, 3, 0x00383439, 3, 0x00393439, 3, 0x00303539, 3, 0x00313539, 3, + 0x00323539, 3, 0x00333539, 3, 0x00343539, 3, 0x00353539, 3, 0x00363539, 3, 0x00373539, 3, 0x00383539, 3, 0x00393539, 3, + 0x00303639, 3, 0x00313639, 3, 0x00323639, 3, 0x00333639, 3, 0x00343639, 3, 0x00353639, 3, 0x00363639, 3, 0x00373639, 3, + 0x00383639, 3, 0x00393639, 3, 0x00303739, 3, 0x00313739, 3, 0x00323739, 3, 0x00333739, 3, 0x00343739, 3, 0x00353739, 3, + 0x00363739, 3, 0x00373739, 3, 0x00383739, 3, 0x00393739, 3, 0x00303839, 3, 0x00313839, 3, 0x00323839, 3, 0x00333839, 3, + 0x00343839, 3, 0x00353839, 3, 0x00363839, 3, 0x00373839, 3, 0x00383839, 3, 0x00393839, 3, 0x00303939, 3, 0x00313939, 3, + 0x00323939, 3, 0x00333939, 3, 0x00343939, 3, 0x00353939, 3, 0x00363939, 3, 0x00373939, 3, 0x00383939, 3, 0x00393939, 3, + 0x30303031, 4, 0x31303031, 4, 0x32303031, 4, 0x33303031, 4, 0x34303031, 4, 0x35303031, 4, 0x36303031, 4, 0x37303031, 4, + 0x38303031, 4, 0x39303031, 4, 0x30313031, 4, 0x31313031, 4, 0x32313031, 4, 0x33313031, 4, 0x34313031, 4, 0x35313031, 4, + 0x36313031, 4, 0x37313031, 4, 0x38313031, 4, 0x39313031, 4, 0x30323031, 4, 0x31323031, 4, 0x32323031, 4, 0x33323031, 4, +}; + +__device__ static void append_word (u32x w0[4], u32x w1[4], const u32x append[4], const u32 offset) +{ + switch (offset) + { + case 1: + w0[0] = w0[0] | append[0] << 8; + w0[1] = append[0] >> 24 | append[1] << 8; + w0[2] = append[1] >> 24 | append[2] << 8; + w0[3] = append[2] >> 24 | append[3] << 8; + break; + + case 2: + w0[0] = w0[0] | append[0] << 16; + w0[1] = append[0] >> 16 | append[1] << 16; + w0[2] = append[1] >> 16 | append[2] << 16; + w0[3] = append[2] >> 16 | append[3] << 16; + break; + + case 3: + w0[0] = w0[0] | append[0] << 24; + w0[1] = append[0] >> 8 | append[1] << 24; + w0[2] = append[1] >> 8 | append[2] << 24; + w0[3] = append[2] >> 8 | append[3] << 24; + break; + + case 4: + w0[1] = append[0]; + w0[2] = append[1]; + w0[3] = append[2]; + w1[0] = append[3]; + break; + } +} + +__device__ static void append_salt (u32x w0[4], u32x w1[4], u32x w2[4], const u32 append[5], const u32 offset) +{ + switch (offset) + { + case 2: + w0[0] = w0[0] | append[0] << 16; + w0[1] = append[0] >> 16 | append[1] << 16; + w0[2] = append[1] >> 16 | append[2] << 16; + w0[3] = append[2] >> 16 | append[3] << 16; + w1[0] = append[3] >> 16 | append[4] << 16; + w1[1] = append[4] >> 16; + break; + + case 3: + w0[0] = w0[0] | append[0] << 24; + w0[1] = append[0] >> 8 | append[1] << 24; + w0[2] = append[1] >> 8 | append[2] << 24; + w0[3] = append[2] >> 8 | append[3] << 24; + w1[0] = append[3] >> 8 | append[4] << 24; + w1[1] = append[4] >> 8; + break; + + case 4: + w0[1] = append[0]; + w0[2] = append[1]; + w0[3] = append[2]; + w1[0] = append[3]; + w1[1] = append[4]; + break; + + case 5: + w0[1] = w0[1] | append[0] << 8; + w0[2] = append[0] >> 24 | append[1] << 8; + w0[3] = append[1] >> 24 | append[2] << 8; + w1[0] = append[2] >> 24 | append[3] << 8; + w1[1] = append[3] >> 24 | append[4] << 8; + w1[2] = append[4] >> 24; + break; + + case 6: + w0[1] = w0[1] | append[0] << 16; + w0[2] = append[0] >> 16 | append[1] << 16; + w0[3] = append[1] >> 16 | append[2] << 16; + w1[0] = append[2] >> 16 | append[3] << 16; + w1[1] = append[3] >> 16 | append[4] << 16; + w1[2] = append[4] >> 16; + break; + + case 7: + w0[1] = w0[1] | append[0] << 24; + w0[2] = append[0] >> 8 | append[1] << 24; + w0[3] = append[1] >> 8 | append[2] << 24; + w1[0] = append[2] >> 8 | append[3] << 24; + w1[1] = append[3] >> 8 | append[4] << 24; + w1[2] = append[4] >> 8; + break; + + case 8: + w0[2] = append[0]; + w0[3] = append[1]; + w1[0] = append[2]; + w1[1] = append[3]; + w1[2] = append[4]; + break; + + case 9: + w0[2] = w0[2] | append[0] << 8; + w0[3] = append[0] >> 24 | append[1] << 8; + w1[0] = append[1] >> 24 | append[2] << 8; + w1[1] = append[2] >> 24 | append[3] << 8; + w1[2] = append[3] >> 24 | append[4] << 8; + w1[3] = append[4] >> 24; + break; + + case 10: + w0[2] = w0[2] | append[0] << 16; + w0[3] = append[0] >> 16 | append[1] << 16; + w1[0] = append[1] >> 16 | append[2] << 16; + w1[1] = append[2] >> 16 | append[3] << 16; + w1[2] = append[3] >> 16 | append[4] << 16; + w1[3] = append[4] >> 16; + break; + + case 11: + w0[2] = w0[2] | append[0] << 24; + w0[3] = append[0] >> 8 | append[1] << 24; + w1[0] = append[1] >> 8 | append[2] << 24; + w1[1] = append[2] >> 8 | append[3] << 24; + w1[2] = append[3] >> 8 | append[4] << 24; + w1[3] = append[4] >> 8; + break; + + case 12: + w0[3] = append[0]; + w1[0] = append[1]; + w1[1] = append[2]; + w1[2] = append[3]; + w1[3] = append[4]; + break; + + case 13: + w0[3] = w0[3] | append[0] << 8; + w1[0] = append[0] >> 24 | append[1] << 8; + w1[1] = append[1] >> 24 | append[2] << 8; + w1[2] = append[2] >> 24 | append[3] << 8; + w1[3] = append[3] >> 24 | append[4] << 8; + w2[0] = append[4] >> 24; + break; + + case 14: + w0[3] = w0[3] | append[0] << 16; + w1[0] = append[0] >> 16 | append[1] << 16; + w1[1] = append[1] >> 16 | append[2] << 16; + w1[2] = append[2] >> 16 | append[3] << 16; + w1[3] = append[3] >> 16 | append[4] << 16; + w2[0] = append[4] >> 16; + break; + + case 15: + w0[3] = w0[3] | append[0] << 24; + w1[0] = append[0] >> 8 | append[1] << 24; + w1[1] = append[1] >> 8 | append[2] << 24; + w1[2] = append[2] >> 8 | append[3] << 24; + w1[3] = append[3] >> 8 | append[4] << 24; + w2[0] = append[4] >> 8; + break; + + case 16: + w1[0] = append[0]; + w1[1] = append[1]; + w1[2] = append[2]; + w1[3] = append[3]; + w2[0] = append[4]; + break; + + case 17: + w1[0] = w1[0] | append[0] << 8; + w1[1] = append[0] >> 24 | append[1] << 8; + w1[2] = append[1] >> 24 | append[2] << 8; + w1[3] = append[2] >> 24 | append[3] << 8; + w2[0] = append[3] >> 24 | append[4] << 8; + w2[1] = append[4] >> 24; + break; + + case 18: + w1[0] = w1[0] | append[0] << 16; + w1[1] = append[0] >> 16 | append[1] << 16; + w1[2] = append[1] >> 16 | append[2] << 16; + w1[3] = append[2] >> 16 | append[3] << 16; + w2[0] = append[3] >> 16 | append[4] << 16; + w2[1] = append[4] >> 16; + break; + + case 19: + w1[0] = w1[0] | append[0] << 24; + w1[1] = append[0] >> 8 | append[1] << 24; + w1[2] = append[1] >> 8 | append[2] << 24; + w1[3] = append[2] >> 8 | append[3] << 24; + w2[0] = append[3] >> 8 | append[4] << 24; + w2[1] = append[4] >> 8; + break; + } +} + +__device__ static void sha1_transform (const u32x w0[4], const u32x w1[4], const u32x w2[4], const u32x w3[4], u32x digest[5]) +{ + u32x A = digest[0]; + u32x B = digest[1]; + u32x C = digest[2]; + u32x D = digest[3]; + u32x E = digest[4]; + + u32x w0_t = w0[0]; + u32x w1_t = w0[1]; + u32x w2_t = w0[2]; + u32x w3_t = w0[3]; + u32x w4_t = w1[0]; + u32x w5_t = w1[1]; + u32x w6_t = w1[2]; + u32x w7_t = w1[3]; + u32x w8_t = w2[0]; + u32x w9_t = w2[1]; + u32x wa_t = w2[2]; + u32x wb_t = w2[3]; + u32x wc_t = w3[0]; + u32x wd_t = w3[1]; + u32x we_t = w3[2]; + u32x wf_t = w3[3]; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, A, B, C, D, E, w0_t); + SHA1_STEP (SHA1_F0o, E, A, B, C, D, w1_t); + SHA1_STEP (SHA1_F0o, D, E, A, B, C, w2_t); + SHA1_STEP (SHA1_F0o, C, D, E, A, B, w3_t); + SHA1_STEP (SHA1_F0o, B, C, D, E, A, w4_t); + SHA1_STEP (SHA1_F0o, A, B, C, D, E, w5_t); + SHA1_STEP (SHA1_F0o, E, A, B, C, D, w6_t); + SHA1_STEP (SHA1_F0o, D, E, A, B, C, w7_t); + SHA1_STEP (SHA1_F0o, C, D, E, A, B, w8_t); + SHA1_STEP (SHA1_F0o, B, C, D, E, A, w9_t); + SHA1_STEP (SHA1_F0o, A, B, C, D, E, wa_t); + SHA1_STEP (SHA1_F0o, E, A, B, C, D, wb_t); + SHA1_STEP (SHA1_F0o, D, E, A, B, C, wc_t); + SHA1_STEP (SHA1_F0o, C, D, E, A, B, wd_t); + SHA1_STEP (SHA1_F0o, B, C, D, E, A, we_t); + SHA1_STEP (SHA1_F0o, A, B, C, D, E, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F0o, E, A, B, C, D, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F0o, D, E, A, B, C, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F0o, C, D, E, A, B, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F0o, B, C, D, E, A, w3_t); + + #undef K + #define K SHA1C01 + + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w7_t); + + #undef K + #define K SHA1C02 + + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, wb_t); + + #undef K + #define K SHA1C03 + + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, wf_t); + + digest[0] += A; + digest[1] += B; + digest[2] += C; + digest[3] += D; + digest[4] += E; +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m05800_init (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, androidpin_tmp_t *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x word_buf[4]; + + word_buf[0] = pws[gid].i[ 0]; + word_buf[1] = pws[gid].i[ 1]; + word_buf[2] = pws[gid].i[ 2]; + word_buf[3] = pws[gid].i[ 3]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * salt + */ + + u32 salt_len = salt_bufs[salt_pos].salt_len; + + u32 salt_buf[5]; + + salt_buf[0] = salt_bufs[salt_pos].salt_buf[0]; + salt_buf[1] = salt_bufs[salt_pos].salt_buf[1]; + salt_buf[2] = salt_bufs[salt_pos].salt_buf[2]; + salt_buf[3] = salt_bufs[salt_pos].salt_buf[3]; + salt_buf[4] = salt_bufs[salt_pos].salt_buf[4]; + + /** + * init + */ + + const u32 pc_len = 1; + const u32 pc_dec = 0x30; + + u32x data0[4] = { 0, 0, 0, 0 }; + u32x data1[4] = { 0, 0, 0, 0 }; + u32x data2[4] = { 0, 0, 0, 0 }; + + data0[0] = pc_dec; + + append_word (data0, data1, word_buf, pc_len); + + append_salt (data0, data1, data2, salt_buf, pc_len + pw_len); + + u32x w0[4]; + u32x w1[4]; + u32x w2[4]; + u32x w3[4]; + + w0[0] = swap_workaround (data0[0]); + w0[1] = swap_workaround (data0[1]); + w0[2] = swap_workaround (data0[2]); + w0[3] = swap_workaround (data0[3]); + w1[0] = swap_workaround (data1[0]); + w1[1] = swap_workaround (data1[1]); + w1[2] = swap_workaround (data1[2]); + w1[3] = swap_workaround (data1[3]); + w2[0] = swap_workaround (data2[0]); + w2[1] = swap_workaround (data2[1]); + w2[2] = 0; + w2[3] = 0; + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = (pc_len + pw_len + salt_len) * 8; + + u32x digest[5]; + + digest[0] = SHA1M_A; + digest[1] = SHA1M_B; + digest[2] = SHA1M_C; + digest[3] = SHA1M_D; + digest[4] = SHA1M_E; + + sha1_transform (w0, w1, w2, w3, digest); + + tmps[gid].digest_buf[0] = digest[0]; + tmps[gid].digest_buf[1] = digest[1]; + tmps[gid].digest_buf[2] = digest[2]; + tmps[gid].digest_buf[3] = digest[3]; + tmps[gid].digest_buf[4] = digest[4]; +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m05800_loop (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, androidpin_tmp_t *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + u32x word_buf[4]; + + word_buf[0] = pws[gid].i[ 0]; + word_buf[1] = pws[gid].i[ 1]; + word_buf[2] = pws[gid].i[ 2]; + word_buf[3] = pws[gid].i[ 3]; + + const u32 pw_len = pws[gid].pw_len; + + u32x digest[5]; + + digest[0] = tmps[gid].digest_buf[0]; + digest[1] = tmps[gid].digest_buf[1]; + digest[2] = tmps[gid].digest_buf[2]; + digest[3] = tmps[gid].digest_buf[3]; + digest[4] = tmps[gid].digest_buf[4]; + + /** + * cache precomputed conversion table in shared memory + */ + + const u32 lid = threadIdx.x; + + __shared__ entry_t s_pc[1024]; + + const u32 lid4 = lid * 4; + + s_pc[lid4 + 0] = pc[lid4 + 0]; + s_pc[lid4 + 1] = pc[lid4 + 1]; + s_pc[lid4 + 2] = pc[lid4 + 2]; + s_pc[lid4 + 3] = pc[lid4 + 3]; + + __syncthreads (); + + if (gid >= gid_max) return; + + /** + * salt + */ + + u32 salt_len = salt_bufs[salt_pos].salt_len; + + u32 salt_buf[5]; + + salt_buf[0] = salt_bufs[salt_pos].salt_buf[0]; + salt_buf[1] = salt_bufs[salt_pos].salt_buf[1]; + salt_buf[2] = salt_bufs[salt_pos].salt_buf[2]; + salt_buf[3] = salt_bufs[salt_pos].salt_buf[3]; + salt_buf[4] = salt_bufs[salt_pos].salt_buf[4]; + + /** + * loop + */ + + for (u32 i = 0, j = loop_pos + 1; i < loop_cnt; i++, j++) + { + const u32 pc_len = s_pc[j].len; + const u32 pc_dec = s_pc[j].dec; + + u32x data0[4] = { 0, 0, 0, 0 }; + u32x data1[4] = { 0, 0, 0, 0 }; + u32x data2[4] = { 0, 0, 0, 0 }; + + data0[0] = pc_dec; + + append_word (data0, data1, word_buf, pc_len); + + append_salt (data0, data1, data2, salt_buf, pc_len + pw_len); + + u32x w0[4]; + u32x w1[4]; + u32x w2[4]; + u32x w3[4]; + + w0[0] = digest[0]; + w0[1] = digest[1]; + w0[2] = digest[2]; + w0[3] = digest[3]; + w1[0] = digest[4]; + w1[1] = swap_workaround (data0[0]); + w1[2] = swap_workaround (data0[1]); + w1[3] = swap_workaround (data0[2]); + w2[0] = swap_workaround (data0[3]); + w2[1] = swap_workaround (data1[0]); + w2[2] = swap_workaround (data1[1]); + w2[3] = swap_workaround (data1[2]); + w3[0] = swap_workaround (data1[3]); + w3[1] = swap_workaround (data2[0]); + w3[2] = 0; + w3[3] = (20 + pc_len + pw_len + salt_len) * 8; + + digest[0] = SHA1M_A; + digest[1] = SHA1M_B; + digest[2] = SHA1M_C; + digest[3] = SHA1M_D; + digest[4] = SHA1M_E; + + sha1_transform (w0, w1, w2, w3, digest); + } + + tmps[gid].digest_buf[0] = digest[0]; + tmps[gid].digest_buf[1] = digest[1]; + tmps[gid].digest_buf[2] = digest[2]; + tmps[gid].digest_buf[3] = digest[3]; + tmps[gid].digest_buf[4] = digest[4]; +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m05800_comp (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, androidpin_tmp_t *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + const u32 lid = threadIdx.x; + + /** + * digest + */ + + const u32x r0 = tmps[gid].digest_buf[DGST_R0]; + const u32x r1 = tmps[gid].digest_buf[DGST_R1]; + const u32x r2 = tmps[gid].digest_buf[DGST_R2]; + const u32x r3 = tmps[gid].digest_buf[DGST_R3]; + + #define il_pos 0 + + #include VECT_COMPARE_M +} diff --git a/nv/m06000_a0.cu b/nv/m06000_a0.cu new file mode 100644 index 0000000000..1fe235e395 --- /dev/null +++ b/nv/m06000_a0.cu @@ -0,0 +1,482 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _RIPEMD160_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW2 +#define VECT_SIZE1 +#endif + +#define DGST_R0 0 +#define DGST_R1 1 +#define DGST_R2 2 +#define DGST_R3 3 + +#include "include/kernel_functions.c" +#include "types_nv.c" +#include "common_nv.c" +#include "include/rp_gpu.h" +#include "rp_nv.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +__device__ static void ripemd160_transform (const u32x w[16], u32x dgst[5]) +{ + u32x a1 = dgst[0]; + u32x b1 = dgst[1]; + u32x c1 = dgst[2]; + u32x d1 = dgst[3]; + u32x e1 = dgst[4]; + + RIPEMD160_STEP (RIPEMD160_F , a1, b1, c1, d1, e1, w[ 0], RIPEMD160C00, RIPEMD160S00); + RIPEMD160_STEP (RIPEMD160_F , e1, a1, b1, c1, d1, w[ 1], RIPEMD160C00, RIPEMD160S01); + RIPEMD160_STEP (RIPEMD160_F , d1, e1, a1, b1, c1, w[ 2], RIPEMD160C00, RIPEMD160S02); + RIPEMD160_STEP (RIPEMD160_F , c1, d1, e1, a1, b1, w[ 3], RIPEMD160C00, RIPEMD160S03); + RIPEMD160_STEP (RIPEMD160_F , b1, c1, d1, e1, a1, w[ 4], RIPEMD160C00, RIPEMD160S04); + RIPEMD160_STEP (RIPEMD160_F , a1, b1, c1, d1, e1, w[ 5], RIPEMD160C00, RIPEMD160S05); + RIPEMD160_STEP (RIPEMD160_F , e1, a1, b1, c1, d1, w[ 6], RIPEMD160C00, RIPEMD160S06); + RIPEMD160_STEP (RIPEMD160_F , d1, e1, a1, b1, c1, w[ 7], RIPEMD160C00, RIPEMD160S07); + RIPEMD160_STEP (RIPEMD160_F , c1, d1, e1, a1, b1, w[ 8], RIPEMD160C00, RIPEMD160S08); + RIPEMD160_STEP (RIPEMD160_F , b1, c1, d1, e1, a1, w[ 9], RIPEMD160C00, RIPEMD160S09); + RIPEMD160_STEP (RIPEMD160_F , a1, b1, c1, d1, e1, w[10], RIPEMD160C00, RIPEMD160S0A); + RIPEMD160_STEP (RIPEMD160_F , e1, a1, b1, c1, d1, w[11], RIPEMD160C00, RIPEMD160S0B); + RIPEMD160_STEP (RIPEMD160_F , d1, e1, a1, b1, c1, w[12], RIPEMD160C00, RIPEMD160S0C); + RIPEMD160_STEP (RIPEMD160_F , c1, d1, e1, a1, b1, w[13], RIPEMD160C00, RIPEMD160S0D); + RIPEMD160_STEP (RIPEMD160_F , b1, c1, d1, e1, a1, w[14], RIPEMD160C00, RIPEMD160S0E); + RIPEMD160_STEP (RIPEMD160_F , a1, b1, c1, d1, e1, w[15], RIPEMD160C00, RIPEMD160S0F); + + RIPEMD160_STEP (RIPEMD160_Go, e1, a1, b1, c1, d1, w[ 7], RIPEMD160C10, RIPEMD160S10); + RIPEMD160_STEP (RIPEMD160_Go, d1, e1, a1, b1, c1, w[ 4], RIPEMD160C10, RIPEMD160S11); + RIPEMD160_STEP (RIPEMD160_Go, c1, d1, e1, a1, b1, w[13], RIPEMD160C10, RIPEMD160S12); + RIPEMD160_STEP (RIPEMD160_Go, b1, c1, d1, e1, a1, w[ 1], RIPEMD160C10, RIPEMD160S13); + RIPEMD160_STEP (RIPEMD160_Go, a1, b1, c1, d1, e1, w[10], RIPEMD160C10, RIPEMD160S14); + RIPEMD160_STEP (RIPEMD160_Go, e1, a1, b1, c1, d1, w[ 6], RIPEMD160C10, RIPEMD160S15); + RIPEMD160_STEP (RIPEMD160_Go, d1, e1, a1, b1, c1, w[15], RIPEMD160C10, RIPEMD160S16); + RIPEMD160_STEP (RIPEMD160_Go, c1, d1, e1, a1, b1, w[ 3], RIPEMD160C10, RIPEMD160S17); + RIPEMD160_STEP (RIPEMD160_Go, b1, c1, d1, e1, a1, w[12], RIPEMD160C10, RIPEMD160S18); + RIPEMD160_STEP (RIPEMD160_Go, a1, b1, c1, d1, e1, w[ 0], RIPEMD160C10, RIPEMD160S19); + RIPEMD160_STEP (RIPEMD160_Go, e1, a1, b1, c1, d1, w[ 9], RIPEMD160C10, RIPEMD160S1A); + RIPEMD160_STEP (RIPEMD160_Go, d1, e1, a1, b1, c1, w[ 5], RIPEMD160C10, RIPEMD160S1B); + RIPEMD160_STEP (RIPEMD160_Go, c1, d1, e1, a1, b1, w[ 2], RIPEMD160C10, RIPEMD160S1C); + RIPEMD160_STEP (RIPEMD160_Go, b1, c1, d1, e1, a1, w[14], RIPEMD160C10, RIPEMD160S1D); + RIPEMD160_STEP (RIPEMD160_Go, a1, b1, c1, d1, e1, w[11], RIPEMD160C10, RIPEMD160S1E); + RIPEMD160_STEP (RIPEMD160_Go, e1, a1, b1, c1, d1, w[ 8], RIPEMD160C10, RIPEMD160S1F); + + RIPEMD160_STEP (RIPEMD160_H , d1, e1, a1, b1, c1, w[ 3], RIPEMD160C20, RIPEMD160S20); + RIPEMD160_STEP (RIPEMD160_H , c1, d1, e1, a1, b1, w[10], RIPEMD160C20, RIPEMD160S21); + RIPEMD160_STEP (RIPEMD160_H , b1, c1, d1, e1, a1, w[14], RIPEMD160C20, RIPEMD160S22); + RIPEMD160_STEP (RIPEMD160_H , a1, b1, c1, d1, e1, w[ 4], RIPEMD160C20, RIPEMD160S23); + RIPEMD160_STEP (RIPEMD160_H , e1, a1, b1, c1, d1, w[ 9], RIPEMD160C20, RIPEMD160S24); + RIPEMD160_STEP (RIPEMD160_H , d1, e1, a1, b1, c1, w[15], RIPEMD160C20, RIPEMD160S25); + RIPEMD160_STEP (RIPEMD160_H , c1, d1, e1, a1, b1, w[ 8], RIPEMD160C20, RIPEMD160S26); + RIPEMD160_STEP (RIPEMD160_H , b1, c1, d1, e1, a1, w[ 1], RIPEMD160C20, RIPEMD160S27); + RIPEMD160_STEP (RIPEMD160_H , a1, b1, c1, d1, e1, w[ 2], RIPEMD160C20, RIPEMD160S28); + RIPEMD160_STEP (RIPEMD160_H , e1, a1, b1, c1, d1, w[ 7], RIPEMD160C20, RIPEMD160S29); + RIPEMD160_STEP (RIPEMD160_H , d1, e1, a1, b1, c1, w[ 0], RIPEMD160C20, RIPEMD160S2A); + RIPEMD160_STEP (RIPEMD160_H , c1, d1, e1, a1, b1, w[ 6], RIPEMD160C20, RIPEMD160S2B); + RIPEMD160_STEP (RIPEMD160_H , b1, c1, d1, e1, a1, w[13], RIPEMD160C20, RIPEMD160S2C); + RIPEMD160_STEP (RIPEMD160_H , a1, b1, c1, d1, e1, w[11], RIPEMD160C20, RIPEMD160S2D); + RIPEMD160_STEP (RIPEMD160_H , e1, a1, b1, c1, d1, w[ 5], RIPEMD160C20, RIPEMD160S2E); + RIPEMD160_STEP (RIPEMD160_H , d1, e1, a1, b1, c1, w[12], RIPEMD160C20, RIPEMD160S2F); + + RIPEMD160_STEP (RIPEMD160_Io, c1, d1, e1, a1, b1, w[ 1], RIPEMD160C30, RIPEMD160S30); + RIPEMD160_STEP (RIPEMD160_Io, b1, c1, d1, e1, a1, w[ 9], RIPEMD160C30, RIPEMD160S31); + RIPEMD160_STEP (RIPEMD160_Io, a1, b1, c1, d1, e1, w[11], RIPEMD160C30, RIPEMD160S32); + RIPEMD160_STEP (RIPEMD160_Io, e1, a1, b1, c1, d1, w[10], RIPEMD160C30, RIPEMD160S33); + RIPEMD160_STEP (RIPEMD160_Io, d1, e1, a1, b1, c1, w[ 0], RIPEMD160C30, RIPEMD160S34); + RIPEMD160_STEP (RIPEMD160_Io, c1, d1, e1, a1, b1, w[ 8], RIPEMD160C30, RIPEMD160S35); + RIPEMD160_STEP (RIPEMD160_Io, b1, c1, d1, e1, a1, w[12], RIPEMD160C30, RIPEMD160S36); + RIPEMD160_STEP (RIPEMD160_Io, a1, b1, c1, d1, e1, w[ 4], RIPEMD160C30, RIPEMD160S37); + RIPEMD160_STEP (RIPEMD160_Io, e1, a1, b1, c1, d1, w[13], RIPEMD160C30, RIPEMD160S38); + RIPEMD160_STEP (RIPEMD160_Io, d1, e1, a1, b1, c1, w[ 3], RIPEMD160C30, RIPEMD160S39); + RIPEMD160_STEP (RIPEMD160_Io, c1, d1, e1, a1, b1, w[ 7], RIPEMD160C30, RIPEMD160S3A); + RIPEMD160_STEP (RIPEMD160_Io, b1, c1, d1, e1, a1, w[15], RIPEMD160C30, RIPEMD160S3B); + RIPEMD160_STEP (RIPEMD160_Io, a1, b1, c1, d1, e1, w[14], RIPEMD160C30, RIPEMD160S3C); + RIPEMD160_STEP (RIPEMD160_Io, e1, a1, b1, c1, d1, w[ 5], RIPEMD160C30, RIPEMD160S3D); + RIPEMD160_STEP (RIPEMD160_Io, d1, e1, a1, b1, c1, w[ 6], RIPEMD160C30, RIPEMD160S3E); + RIPEMD160_STEP (RIPEMD160_Io, c1, d1, e1, a1, b1, w[ 2], RIPEMD160C30, RIPEMD160S3F); + + RIPEMD160_STEP (RIPEMD160_J , b1, c1, d1, e1, a1, w[ 4], RIPEMD160C40, RIPEMD160S40); + RIPEMD160_STEP (RIPEMD160_J , a1, b1, c1, d1, e1, w[ 0], RIPEMD160C40, RIPEMD160S41); + RIPEMD160_STEP (RIPEMD160_J , e1, a1, b1, c1, d1, w[ 5], RIPEMD160C40, RIPEMD160S42); + RIPEMD160_STEP (RIPEMD160_J , d1, e1, a1, b1, c1, w[ 9], RIPEMD160C40, RIPEMD160S43); + RIPEMD160_STEP (RIPEMD160_J , c1, d1, e1, a1, b1, w[ 7], RIPEMD160C40, RIPEMD160S44); + RIPEMD160_STEP (RIPEMD160_J , b1, c1, d1, e1, a1, w[12], RIPEMD160C40, RIPEMD160S45); + RIPEMD160_STEP (RIPEMD160_J , a1, b1, c1, d1, e1, w[ 2], RIPEMD160C40, RIPEMD160S46); + RIPEMD160_STEP (RIPEMD160_J , e1, a1, b1, c1, d1, w[10], RIPEMD160C40, RIPEMD160S47); + RIPEMD160_STEP (RIPEMD160_J , d1, e1, a1, b1, c1, w[14], RIPEMD160C40, RIPEMD160S48); + RIPEMD160_STEP (RIPEMD160_J , c1, d1, e1, a1, b1, w[ 1], RIPEMD160C40, RIPEMD160S49); + RIPEMD160_STEP (RIPEMD160_J , b1, c1, d1, e1, a1, w[ 3], RIPEMD160C40, RIPEMD160S4A); + RIPEMD160_STEP (RIPEMD160_J , a1, b1, c1, d1, e1, w[ 8], RIPEMD160C40, RIPEMD160S4B); + RIPEMD160_STEP (RIPEMD160_J , e1, a1, b1, c1, d1, w[11], RIPEMD160C40, RIPEMD160S4C); + RIPEMD160_STEP (RIPEMD160_J , d1, e1, a1, b1, c1, w[ 6], RIPEMD160C40, RIPEMD160S4D); + RIPEMD160_STEP (RIPEMD160_J , c1, d1, e1, a1, b1, w[15], RIPEMD160C40, RIPEMD160S4E); + RIPEMD160_STEP (RIPEMD160_J , b1, c1, d1, e1, a1, w[13], RIPEMD160C40, RIPEMD160S4F); + + u32x a2 = dgst[0]; + u32x b2 = dgst[1]; + u32x c2 = dgst[2]; + u32x d2 = dgst[3]; + u32x e2 = dgst[4]; + + //RIPEMD160_STEP_WORKAROUND_BUG (RIPEMD160_J , a2, b2, c2, d2, e2, w[ 5], RIPEMD160C50, RIPEMD160S50); + RIPEMD160_STEP (RIPEMD160_J , a2, b2, c2, d2, e2, w[ 5], RIPEMD160C50, RIPEMD160S50); + RIPEMD160_STEP (RIPEMD160_J , e2, a2, b2, c2, d2, w[14], RIPEMD160C50, RIPEMD160S51); + RIPEMD160_STEP (RIPEMD160_J , d2, e2, a2, b2, c2, w[ 7], RIPEMD160C50, RIPEMD160S52); + RIPEMD160_STEP (RIPEMD160_J , c2, d2, e2, a2, b2, w[ 0], RIPEMD160C50, RIPEMD160S53); + RIPEMD160_STEP (RIPEMD160_J , b2, c2, d2, e2, a2, w[ 9], RIPEMD160C50, RIPEMD160S54); + RIPEMD160_STEP (RIPEMD160_J , a2, b2, c2, d2, e2, w[ 2], RIPEMD160C50, RIPEMD160S55); + RIPEMD160_STEP (RIPEMD160_J , e2, a2, b2, c2, d2, w[11], RIPEMD160C50, RIPEMD160S56); + RIPEMD160_STEP (RIPEMD160_J , d2, e2, a2, b2, c2, w[ 4], RIPEMD160C50, RIPEMD160S57); + RIPEMD160_STEP (RIPEMD160_J , c2, d2, e2, a2, b2, w[13], RIPEMD160C50, RIPEMD160S58); + RIPEMD160_STEP (RIPEMD160_J , b2, c2, d2, e2, a2, w[ 6], RIPEMD160C50, RIPEMD160S59); + RIPEMD160_STEP (RIPEMD160_J , a2, b2, c2, d2, e2, w[15], RIPEMD160C50, RIPEMD160S5A); + RIPEMD160_STEP (RIPEMD160_J , e2, a2, b2, c2, d2, w[ 8], RIPEMD160C50, RIPEMD160S5B); + RIPEMD160_STEP (RIPEMD160_J , d2, e2, a2, b2, c2, w[ 1], RIPEMD160C50, RIPEMD160S5C); + RIPEMD160_STEP (RIPEMD160_J , c2, d2, e2, a2, b2, w[10], RIPEMD160C50, RIPEMD160S5D); + RIPEMD160_STEP (RIPEMD160_J , b2, c2, d2, e2, a2, w[ 3], RIPEMD160C50, RIPEMD160S5E); + RIPEMD160_STEP (RIPEMD160_J , a2, b2, c2, d2, e2, w[12], RIPEMD160C50, RIPEMD160S5F); + + RIPEMD160_STEP (RIPEMD160_Io, e2, a2, b2, c2, d2, w[ 6], RIPEMD160C60, RIPEMD160S60); + RIPEMD160_STEP (RIPEMD160_Io, d2, e2, a2, b2, c2, w[11], RIPEMD160C60, RIPEMD160S61); + RIPEMD160_STEP (RIPEMD160_Io, c2, d2, e2, a2, b2, w[ 3], RIPEMD160C60, RIPEMD160S62); + RIPEMD160_STEP (RIPEMD160_Io, b2, c2, d2, e2, a2, w[ 7], RIPEMD160C60, RIPEMD160S63); + RIPEMD160_STEP (RIPEMD160_Io, a2, b2, c2, d2, e2, w[ 0], RIPEMD160C60, RIPEMD160S64); + RIPEMD160_STEP (RIPEMD160_Io, e2, a2, b2, c2, d2, w[13], RIPEMD160C60, RIPEMD160S65); + RIPEMD160_STEP (RIPEMD160_Io, d2, e2, a2, b2, c2, w[ 5], RIPEMD160C60, RIPEMD160S66); + RIPEMD160_STEP (RIPEMD160_Io, c2, d2, e2, a2, b2, w[10], RIPEMD160C60, RIPEMD160S67); + RIPEMD160_STEP (RIPEMD160_Io, b2, c2, d2, e2, a2, w[14], RIPEMD160C60, RIPEMD160S68); + RIPEMD160_STEP (RIPEMD160_Io, a2, b2, c2, d2, e2, w[15], RIPEMD160C60, RIPEMD160S69); + RIPEMD160_STEP (RIPEMD160_Io, e2, a2, b2, c2, d2, w[ 8], RIPEMD160C60, RIPEMD160S6A); + RIPEMD160_STEP (RIPEMD160_Io, d2, e2, a2, b2, c2, w[12], RIPEMD160C60, RIPEMD160S6B); + RIPEMD160_STEP (RIPEMD160_Io, c2, d2, e2, a2, b2, w[ 4], RIPEMD160C60, RIPEMD160S6C); + RIPEMD160_STEP (RIPEMD160_Io, b2, c2, d2, e2, a2, w[ 9], RIPEMD160C60, RIPEMD160S6D); + RIPEMD160_STEP (RIPEMD160_Io, a2, b2, c2, d2, e2, w[ 1], RIPEMD160C60, RIPEMD160S6E); + RIPEMD160_STEP (RIPEMD160_Io, e2, a2, b2, c2, d2, w[ 2], RIPEMD160C60, RIPEMD160S6F); + + RIPEMD160_STEP (RIPEMD160_H , d2, e2, a2, b2, c2, w[15], RIPEMD160C70, RIPEMD160S70); + RIPEMD160_STEP (RIPEMD160_H , c2, d2, e2, a2, b2, w[ 5], RIPEMD160C70, RIPEMD160S71); + RIPEMD160_STEP (RIPEMD160_H , b2, c2, d2, e2, a2, w[ 1], RIPEMD160C70, RIPEMD160S72); + RIPEMD160_STEP (RIPEMD160_H , a2, b2, c2, d2, e2, w[ 3], RIPEMD160C70, RIPEMD160S73); + RIPEMD160_STEP (RIPEMD160_H , e2, a2, b2, c2, d2, w[ 7], RIPEMD160C70, RIPEMD160S74); + RIPEMD160_STEP (RIPEMD160_H , d2, e2, a2, b2, c2, w[14], RIPEMD160C70, RIPEMD160S75); + RIPEMD160_STEP (RIPEMD160_H , c2, d2, e2, a2, b2, w[ 6], RIPEMD160C70, RIPEMD160S76); + RIPEMD160_STEP (RIPEMD160_H , b2, c2, d2, e2, a2, w[ 9], RIPEMD160C70, RIPEMD160S77); + RIPEMD160_STEP (RIPEMD160_H , a2, b2, c2, d2, e2, w[11], RIPEMD160C70, RIPEMD160S78); + RIPEMD160_STEP (RIPEMD160_H , e2, a2, b2, c2, d2, w[ 8], RIPEMD160C70, RIPEMD160S79); + RIPEMD160_STEP (RIPEMD160_H , d2, e2, a2, b2, c2, w[12], RIPEMD160C70, RIPEMD160S7A); + RIPEMD160_STEP (RIPEMD160_H , c2, d2, e2, a2, b2, w[ 2], RIPEMD160C70, RIPEMD160S7B); + RIPEMD160_STEP (RIPEMD160_H , b2, c2, d2, e2, a2, w[10], RIPEMD160C70, RIPEMD160S7C); + RIPEMD160_STEP (RIPEMD160_H , a2, b2, c2, d2, e2, w[ 0], RIPEMD160C70, RIPEMD160S7D); + RIPEMD160_STEP (RIPEMD160_H , e2, a2, b2, c2, d2, w[ 4], RIPEMD160C70, RIPEMD160S7E); + RIPEMD160_STEP (RIPEMD160_H , d2, e2, a2, b2, c2, w[13], RIPEMD160C70, RIPEMD160S7F); + + RIPEMD160_STEP (RIPEMD160_Go, c2, d2, e2, a2, b2, w[ 8], RIPEMD160C80, RIPEMD160S80); + RIPEMD160_STEP (RIPEMD160_Go, b2, c2, d2, e2, a2, w[ 6], RIPEMD160C80, RIPEMD160S81); + RIPEMD160_STEP (RIPEMD160_Go, a2, b2, c2, d2, e2, w[ 4], RIPEMD160C80, RIPEMD160S82); + RIPEMD160_STEP (RIPEMD160_Go, e2, a2, b2, c2, d2, w[ 1], RIPEMD160C80, RIPEMD160S83); + RIPEMD160_STEP (RIPEMD160_Go, d2, e2, a2, b2, c2, w[ 3], RIPEMD160C80, RIPEMD160S84); + RIPEMD160_STEP (RIPEMD160_Go, c2, d2, e2, a2, b2, w[11], RIPEMD160C80, RIPEMD160S85); + RIPEMD160_STEP (RIPEMD160_Go, b2, c2, d2, e2, a2, w[15], RIPEMD160C80, RIPEMD160S86); + RIPEMD160_STEP (RIPEMD160_Go, a2, b2, c2, d2, e2, w[ 0], RIPEMD160C80, RIPEMD160S87); + RIPEMD160_STEP (RIPEMD160_Go, e2, a2, b2, c2, d2, w[ 5], RIPEMD160C80, RIPEMD160S88); + RIPEMD160_STEP (RIPEMD160_Go, d2, e2, a2, b2, c2, w[12], RIPEMD160C80, RIPEMD160S89); + RIPEMD160_STEP (RIPEMD160_Go, c2, d2, e2, a2, b2, w[ 2], RIPEMD160C80, RIPEMD160S8A); + RIPEMD160_STEP (RIPEMD160_Go, b2, c2, d2, e2, a2, w[13], RIPEMD160C80, RIPEMD160S8B); + RIPEMD160_STEP (RIPEMD160_Go, a2, b2, c2, d2, e2, w[ 9], RIPEMD160C80, RIPEMD160S8C); + RIPEMD160_STEP (RIPEMD160_Go, e2, a2, b2, c2, d2, w[ 7], RIPEMD160C80, RIPEMD160S8D); + RIPEMD160_STEP (RIPEMD160_Go, d2, e2, a2, b2, c2, w[10], RIPEMD160C80, RIPEMD160S8E); + RIPEMD160_STEP (RIPEMD160_Go, c2, d2, e2, a2, b2, w[14], RIPEMD160C80, RIPEMD160S8F); + + RIPEMD160_STEP (RIPEMD160_F , b2, c2, d2, e2, a2, w[12], RIPEMD160C90, RIPEMD160S90); + RIPEMD160_STEP (RIPEMD160_F , a2, b2, c2, d2, e2, w[15], RIPEMD160C90, RIPEMD160S91); + RIPEMD160_STEP (RIPEMD160_F , e2, a2, b2, c2, d2, w[10], RIPEMD160C90, RIPEMD160S92); + RIPEMD160_STEP (RIPEMD160_F , d2, e2, a2, b2, c2, w[ 4], RIPEMD160C90, RIPEMD160S93); + RIPEMD160_STEP (RIPEMD160_F , c2, d2, e2, a2, b2, w[ 1], RIPEMD160C90, RIPEMD160S94); + RIPEMD160_STEP (RIPEMD160_F , b2, c2, d2, e2, a2, w[ 5], RIPEMD160C90, RIPEMD160S95); + RIPEMD160_STEP (RIPEMD160_F , a2, b2, c2, d2, e2, w[ 8], RIPEMD160C90, RIPEMD160S96); + RIPEMD160_STEP (RIPEMD160_F , e2, a2, b2, c2, d2, w[ 7], RIPEMD160C90, RIPEMD160S97); + RIPEMD160_STEP (RIPEMD160_F , d2, e2, a2, b2, c2, w[ 6], RIPEMD160C90, RIPEMD160S98); + RIPEMD160_STEP (RIPEMD160_F , c2, d2, e2, a2, b2, w[ 2], RIPEMD160C90, RIPEMD160S99); + RIPEMD160_STEP (RIPEMD160_F , b2, c2, d2, e2, a2, w[13], RIPEMD160C90, RIPEMD160S9A); + RIPEMD160_STEP (RIPEMD160_F , a2, b2, c2, d2, e2, w[14], RIPEMD160C90, RIPEMD160S9B); + RIPEMD160_STEP (RIPEMD160_F , e2, a2, b2, c2, d2, w[ 0], RIPEMD160C90, RIPEMD160S9C); + RIPEMD160_STEP (RIPEMD160_F , d2, e2, a2, b2, c2, w[ 3], RIPEMD160C90, RIPEMD160S9D); + RIPEMD160_STEP (RIPEMD160_F , c2, d2, e2, a2, b2, w[ 9], RIPEMD160C90, RIPEMD160S9E); + RIPEMD160_STEP (RIPEMD160_F , b2, c2, d2, e2, a2, w[11], RIPEMD160C90, RIPEMD160S9F); + + const u32x a = dgst[1] + c1 + d2; + const u32x b = dgst[2] + d1 + e2; + const u32x c = dgst[3] + e1 + a2; + const u32x d = dgst[4] + a1 + b2; + const u32x e = dgst[0] + b1 + c2; + + dgst[0] = a; + dgst[1] = b; + dgst[2] = c; + dgst[3] = d; + dgst[4] = e; +} + +__device__ __constant__ gpu_rule_t c_rules[1024]; + +extern "C" __global__ void __launch_bounds__ (256, 1) m06000_m04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + u32x pw_buf1[4]; + + pw_buf1[0] = pws[gid].i[ 4]; + pw_buf1[1] = pws[gid].i[ 5]; + pw_buf1[2] = pws[gid].i[ 6]; + pw_buf1[3] = pws[gid].i[ 7]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + + w0[0] = pw_buf0[0]; + w0[1] = pw_buf0[1]; + w0[2] = pw_buf0[2]; + w0[3] = pw_buf0[3]; + + u32x w1[4]; + + w1[0] = pw_buf1[0]; + w1[1] = pw_buf1[1]; + w1[2] = pw_buf1[2]; + w1[3] = pw_buf1[3]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 out_len = apply_rules (c_rules[il_pos].cmds, w0, w1, pw_len); + + append_0x80_2 (w0, w1, out_len); + + u32x wl[16]; + + wl[ 0] = w0[0]; + wl[ 1] = w0[1]; + wl[ 2] = w0[2]; + wl[ 3] = w0[3]; + wl[ 4] = w1[0]; + wl[ 5] = w1[1]; + wl[ 6] = w1[2]; + wl[ 7] = w1[3]; + wl[ 8] = 0; + wl[ 9] = 0; + wl[10] = 0; + wl[11] = 0; + wl[12] = 0; + wl[13] = 0; + wl[14] = out_len * 8; + wl[15] = 0; + + u32x dgst[5]; + + dgst[0] = RIPEMD160M_A; + dgst[1] = RIPEMD160M_B; + dgst[2] = RIPEMD160M_C; + dgst[3] = RIPEMD160M_D; + dgst[4] = RIPEMD160M_E; + + ripemd160_transform (wl, dgst); + + const u32x r0 = dgst[0]; + const u32x r1 = dgst[1]; + const u32x r2 = dgst[2]; + const u32x r3 = dgst[3]; + + #include VECT_COMPARE_M + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m06000_m08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m06000_m16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m06000_s04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + u32x pw_buf1[4]; + + pw_buf1[0] = pws[gid].i[ 4]; + pw_buf1[1] = pws[gid].i[ 5]; + pw_buf1[2] = pws[gid].i[ 6]; + pw_buf1[3] = pws[gid].i[ 7]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + + w0[0] = pw_buf0[0]; + w0[1] = pw_buf0[1]; + w0[2] = pw_buf0[2]; + w0[3] = pw_buf0[3]; + + u32x w1[4]; + + w1[0] = pw_buf1[0]; + w1[1] = pw_buf1[1]; + w1[2] = pw_buf1[2]; + w1[3] = pw_buf1[3]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 out_len = apply_rules (c_rules[il_pos].cmds, w0, w1, pw_len); + + append_0x80_2 (w0, w1, out_len); + + u32x wl[16]; + + wl[ 0] = w0[0]; + wl[ 1] = w0[1]; + wl[ 2] = w0[2]; + wl[ 3] = w0[3]; + wl[ 4] = w1[0]; + wl[ 5] = w1[1]; + wl[ 6] = w1[2]; + wl[ 7] = w1[3]; + wl[ 8] = 0; + wl[ 9] = 0; + wl[10] = 0; + wl[11] = 0; + wl[12] = 0; + wl[13] = 0; + wl[14] = out_len * 8; + wl[15] = 0; + + u32x dgst[5]; + + dgst[0] = RIPEMD160M_A; + dgst[1] = RIPEMD160M_B; + dgst[2] = RIPEMD160M_C; + dgst[3] = RIPEMD160M_D; + dgst[4] = RIPEMD160M_E; + + ripemd160_transform (wl, dgst); + + const u32x r0 = dgst[0]; + const u32x r1 = dgst[1]; + const u32x r2 = dgst[2]; + const u32x r3 = dgst[3]; + + #include VECT_COMPARE_S + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m06000_s08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m06000_s16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/nv/m06000_a1.cu b/nv/m06000_a1.cu new file mode 100644 index 0000000000..44e5c4bd6a --- /dev/null +++ b/nv/m06000_a1.cu @@ -0,0 +1,588 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _RIPEMD160_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW2 +#define VECT_SIZE1 +#endif + +#define DGST_R0 0 +#define DGST_R1 1 +#define DGST_R2 2 +#define DGST_R3 3 + +#include "include/kernel_functions.c" +#include "types_nv.c" +#include "common_nv.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +__device__ static void ripemd160_transform (const u32x w[16], u32x dgst[5]) +{ + u32x a1 = dgst[0]; + u32x b1 = dgst[1]; + u32x c1 = dgst[2]; + u32x d1 = dgst[3]; + u32x e1 = dgst[4]; + + RIPEMD160_STEP (RIPEMD160_F , a1, b1, c1, d1, e1, w[ 0], RIPEMD160C00, RIPEMD160S00); + RIPEMD160_STEP (RIPEMD160_F , e1, a1, b1, c1, d1, w[ 1], RIPEMD160C00, RIPEMD160S01); + RIPEMD160_STEP (RIPEMD160_F , d1, e1, a1, b1, c1, w[ 2], RIPEMD160C00, RIPEMD160S02); + RIPEMD160_STEP (RIPEMD160_F , c1, d1, e1, a1, b1, w[ 3], RIPEMD160C00, RIPEMD160S03); + RIPEMD160_STEP (RIPEMD160_F , b1, c1, d1, e1, a1, w[ 4], RIPEMD160C00, RIPEMD160S04); + RIPEMD160_STEP (RIPEMD160_F , a1, b1, c1, d1, e1, w[ 5], RIPEMD160C00, RIPEMD160S05); + RIPEMD160_STEP (RIPEMD160_F , e1, a1, b1, c1, d1, w[ 6], RIPEMD160C00, RIPEMD160S06); + RIPEMD160_STEP (RIPEMD160_F , d1, e1, a1, b1, c1, w[ 7], RIPEMD160C00, RIPEMD160S07); + RIPEMD160_STEP (RIPEMD160_F , c1, d1, e1, a1, b1, w[ 8], RIPEMD160C00, RIPEMD160S08); + RIPEMD160_STEP (RIPEMD160_F , b1, c1, d1, e1, a1, w[ 9], RIPEMD160C00, RIPEMD160S09); + RIPEMD160_STEP (RIPEMD160_F , a1, b1, c1, d1, e1, w[10], RIPEMD160C00, RIPEMD160S0A); + RIPEMD160_STEP (RIPEMD160_F , e1, a1, b1, c1, d1, w[11], RIPEMD160C00, RIPEMD160S0B); + RIPEMD160_STEP (RIPEMD160_F , d1, e1, a1, b1, c1, w[12], RIPEMD160C00, RIPEMD160S0C); + RIPEMD160_STEP (RIPEMD160_F , c1, d1, e1, a1, b1, w[13], RIPEMD160C00, RIPEMD160S0D); + RIPEMD160_STEP (RIPEMD160_F , b1, c1, d1, e1, a1, w[14], RIPEMD160C00, RIPEMD160S0E); + RIPEMD160_STEP (RIPEMD160_F , a1, b1, c1, d1, e1, w[15], RIPEMD160C00, RIPEMD160S0F); + + RIPEMD160_STEP (RIPEMD160_Go, e1, a1, b1, c1, d1, w[ 7], RIPEMD160C10, RIPEMD160S10); + RIPEMD160_STEP (RIPEMD160_Go, d1, e1, a1, b1, c1, w[ 4], RIPEMD160C10, RIPEMD160S11); + RIPEMD160_STEP (RIPEMD160_Go, c1, d1, e1, a1, b1, w[13], RIPEMD160C10, RIPEMD160S12); + RIPEMD160_STEP (RIPEMD160_Go, b1, c1, d1, e1, a1, w[ 1], RIPEMD160C10, RIPEMD160S13); + RIPEMD160_STEP (RIPEMD160_Go, a1, b1, c1, d1, e1, w[10], RIPEMD160C10, RIPEMD160S14); + RIPEMD160_STEP (RIPEMD160_Go, e1, a1, b1, c1, d1, w[ 6], RIPEMD160C10, RIPEMD160S15); + RIPEMD160_STEP (RIPEMD160_Go, d1, e1, a1, b1, c1, w[15], RIPEMD160C10, RIPEMD160S16); + RIPEMD160_STEP (RIPEMD160_Go, c1, d1, e1, a1, b1, w[ 3], RIPEMD160C10, RIPEMD160S17); + RIPEMD160_STEP (RIPEMD160_Go, b1, c1, d1, e1, a1, w[12], RIPEMD160C10, RIPEMD160S18); + RIPEMD160_STEP (RIPEMD160_Go, a1, b1, c1, d1, e1, w[ 0], RIPEMD160C10, RIPEMD160S19); + RIPEMD160_STEP (RIPEMD160_Go, e1, a1, b1, c1, d1, w[ 9], RIPEMD160C10, RIPEMD160S1A); + RIPEMD160_STEP (RIPEMD160_Go, d1, e1, a1, b1, c1, w[ 5], RIPEMD160C10, RIPEMD160S1B); + RIPEMD160_STEP (RIPEMD160_Go, c1, d1, e1, a1, b1, w[ 2], RIPEMD160C10, RIPEMD160S1C); + RIPEMD160_STEP (RIPEMD160_Go, b1, c1, d1, e1, a1, w[14], RIPEMD160C10, RIPEMD160S1D); + RIPEMD160_STEP (RIPEMD160_Go, a1, b1, c1, d1, e1, w[11], RIPEMD160C10, RIPEMD160S1E); + RIPEMD160_STEP (RIPEMD160_Go, e1, a1, b1, c1, d1, w[ 8], RIPEMD160C10, RIPEMD160S1F); + + RIPEMD160_STEP (RIPEMD160_H , d1, e1, a1, b1, c1, w[ 3], RIPEMD160C20, RIPEMD160S20); + RIPEMD160_STEP (RIPEMD160_H , c1, d1, e1, a1, b1, w[10], RIPEMD160C20, RIPEMD160S21); + RIPEMD160_STEP (RIPEMD160_H , b1, c1, d1, e1, a1, w[14], RIPEMD160C20, RIPEMD160S22); + RIPEMD160_STEP (RIPEMD160_H , a1, b1, c1, d1, e1, w[ 4], RIPEMD160C20, RIPEMD160S23); + RIPEMD160_STEP (RIPEMD160_H , e1, a1, b1, c1, d1, w[ 9], RIPEMD160C20, RIPEMD160S24); + RIPEMD160_STEP (RIPEMD160_H , d1, e1, a1, b1, c1, w[15], RIPEMD160C20, RIPEMD160S25); + RIPEMD160_STEP (RIPEMD160_H , c1, d1, e1, a1, b1, w[ 8], RIPEMD160C20, RIPEMD160S26); + RIPEMD160_STEP (RIPEMD160_H , b1, c1, d1, e1, a1, w[ 1], RIPEMD160C20, RIPEMD160S27); + RIPEMD160_STEP (RIPEMD160_H , a1, b1, c1, d1, e1, w[ 2], RIPEMD160C20, RIPEMD160S28); + RIPEMD160_STEP (RIPEMD160_H , e1, a1, b1, c1, d1, w[ 7], RIPEMD160C20, RIPEMD160S29); + RIPEMD160_STEP (RIPEMD160_H , d1, e1, a1, b1, c1, w[ 0], RIPEMD160C20, RIPEMD160S2A); + RIPEMD160_STEP (RIPEMD160_H , c1, d1, e1, a1, b1, w[ 6], RIPEMD160C20, RIPEMD160S2B); + RIPEMD160_STEP (RIPEMD160_H , b1, c1, d1, e1, a1, w[13], RIPEMD160C20, RIPEMD160S2C); + RIPEMD160_STEP (RIPEMD160_H , a1, b1, c1, d1, e1, w[11], RIPEMD160C20, RIPEMD160S2D); + RIPEMD160_STEP (RIPEMD160_H , e1, a1, b1, c1, d1, w[ 5], RIPEMD160C20, RIPEMD160S2E); + RIPEMD160_STEP (RIPEMD160_H , d1, e1, a1, b1, c1, w[12], RIPEMD160C20, RIPEMD160S2F); + + RIPEMD160_STEP (RIPEMD160_Io, c1, d1, e1, a1, b1, w[ 1], RIPEMD160C30, RIPEMD160S30); + RIPEMD160_STEP (RIPEMD160_Io, b1, c1, d1, e1, a1, w[ 9], RIPEMD160C30, RIPEMD160S31); + RIPEMD160_STEP (RIPEMD160_Io, a1, b1, c1, d1, e1, w[11], RIPEMD160C30, RIPEMD160S32); + RIPEMD160_STEP (RIPEMD160_Io, e1, a1, b1, c1, d1, w[10], RIPEMD160C30, RIPEMD160S33); + RIPEMD160_STEP (RIPEMD160_Io, d1, e1, a1, b1, c1, w[ 0], RIPEMD160C30, RIPEMD160S34); + RIPEMD160_STEP (RIPEMD160_Io, c1, d1, e1, a1, b1, w[ 8], RIPEMD160C30, RIPEMD160S35); + RIPEMD160_STEP (RIPEMD160_Io, b1, c1, d1, e1, a1, w[12], RIPEMD160C30, RIPEMD160S36); + RIPEMD160_STEP (RIPEMD160_Io, a1, b1, c1, d1, e1, w[ 4], RIPEMD160C30, RIPEMD160S37); + RIPEMD160_STEP (RIPEMD160_Io, e1, a1, b1, c1, d1, w[13], RIPEMD160C30, RIPEMD160S38); + RIPEMD160_STEP (RIPEMD160_Io, d1, e1, a1, b1, c1, w[ 3], RIPEMD160C30, RIPEMD160S39); + RIPEMD160_STEP (RIPEMD160_Io, c1, d1, e1, a1, b1, w[ 7], RIPEMD160C30, RIPEMD160S3A); + RIPEMD160_STEP (RIPEMD160_Io, b1, c1, d1, e1, a1, w[15], RIPEMD160C30, RIPEMD160S3B); + RIPEMD160_STEP (RIPEMD160_Io, a1, b1, c1, d1, e1, w[14], RIPEMD160C30, RIPEMD160S3C); + RIPEMD160_STEP (RIPEMD160_Io, e1, a1, b1, c1, d1, w[ 5], RIPEMD160C30, RIPEMD160S3D); + RIPEMD160_STEP (RIPEMD160_Io, d1, e1, a1, b1, c1, w[ 6], RIPEMD160C30, RIPEMD160S3E); + RIPEMD160_STEP (RIPEMD160_Io, c1, d1, e1, a1, b1, w[ 2], RIPEMD160C30, RIPEMD160S3F); + + RIPEMD160_STEP (RIPEMD160_J , b1, c1, d1, e1, a1, w[ 4], RIPEMD160C40, RIPEMD160S40); + RIPEMD160_STEP (RIPEMD160_J , a1, b1, c1, d1, e1, w[ 0], RIPEMD160C40, RIPEMD160S41); + RIPEMD160_STEP (RIPEMD160_J , e1, a1, b1, c1, d1, w[ 5], RIPEMD160C40, RIPEMD160S42); + RIPEMD160_STEP (RIPEMD160_J , d1, e1, a1, b1, c1, w[ 9], RIPEMD160C40, RIPEMD160S43); + RIPEMD160_STEP (RIPEMD160_J , c1, d1, e1, a1, b1, w[ 7], RIPEMD160C40, RIPEMD160S44); + RIPEMD160_STEP (RIPEMD160_J , b1, c1, d1, e1, a1, w[12], RIPEMD160C40, RIPEMD160S45); + RIPEMD160_STEP (RIPEMD160_J , a1, b1, c1, d1, e1, w[ 2], RIPEMD160C40, RIPEMD160S46); + RIPEMD160_STEP (RIPEMD160_J , e1, a1, b1, c1, d1, w[10], RIPEMD160C40, RIPEMD160S47); + RIPEMD160_STEP (RIPEMD160_J , d1, e1, a1, b1, c1, w[14], RIPEMD160C40, RIPEMD160S48); + RIPEMD160_STEP (RIPEMD160_J , c1, d1, e1, a1, b1, w[ 1], RIPEMD160C40, RIPEMD160S49); + RIPEMD160_STEP (RIPEMD160_J , b1, c1, d1, e1, a1, w[ 3], RIPEMD160C40, RIPEMD160S4A); + RIPEMD160_STEP (RIPEMD160_J , a1, b1, c1, d1, e1, w[ 8], RIPEMD160C40, RIPEMD160S4B); + RIPEMD160_STEP (RIPEMD160_J , e1, a1, b1, c1, d1, w[11], RIPEMD160C40, RIPEMD160S4C); + RIPEMD160_STEP (RIPEMD160_J , d1, e1, a1, b1, c1, w[ 6], RIPEMD160C40, RIPEMD160S4D); + RIPEMD160_STEP (RIPEMD160_J , c1, d1, e1, a1, b1, w[15], RIPEMD160C40, RIPEMD160S4E); + RIPEMD160_STEP (RIPEMD160_J , b1, c1, d1, e1, a1, w[13], RIPEMD160C40, RIPEMD160S4F); + + u32x a2 = dgst[0]; + u32x b2 = dgst[1]; + u32x c2 = dgst[2]; + u32x d2 = dgst[3]; + u32x e2 = dgst[4]; + + //RIPEMD160_STEP_WORKAROUND_BUG (RIPEMD160_J , a2, b2, c2, d2, e2, w[ 5], RIPEMD160C50, RIPEMD160S50); + RIPEMD160_STEP (RIPEMD160_J , a2, b2, c2, d2, e2, w[ 5], RIPEMD160C50, RIPEMD160S50); + RIPEMD160_STEP (RIPEMD160_J , e2, a2, b2, c2, d2, w[14], RIPEMD160C50, RIPEMD160S51); + RIPEMD160_STEP (RIPEMD160_J , d2, e2, a2, b2, c2, w[ 7], RIPEMD160C50, RIPEMD160S52); + RIPEMD160_STEP (RIPEMD160_J , c2, d2, e2, a2, b2, w[ 0], RIPEMD160C50, RIPEMD160S53); + RIPEMD160_STEP (RIPEMD160_J , b2, c2, d2, e2, a2, w[ 9], RIPEMD160C50, RIPEMD160S54); + RIPEMD160_STEP (RIPEMD160_J , a2, b2, c2, d2, e2, w[ 2], RIPEMD160C50, RIPEMD160S55); + RIPEMD160_STEP (RIPEMD160_J , e2, a2, b2, c2, d2, w[11], RIPEMD160C50, RIPEMD160S56); + RIPEMD160_STEP (RIPEMD160_J , d2, e2, a2, b2, c2, w[ 4], RIPEMD160C50, RIPEMD160S57); + RIPEMD160_STEP (RIPEMD160_J , c2, d2, e2, a2, b2, w[13], RIPEMD160C50, RIPEMD160S58); + RIPEMD160_STEP (RIPEMD160_J , b2, c2, d2, e2, a2, w[ 6], RIPEMD160C50, RIPEMD160S59); + RIPEMD160_STEP (RIPEMD160_J , a2, b2, c2, d2, e2, w[15], RIPEMD160C50, RIPEMD160S5A); + RIPEMD160_STEP (RIPEMD160_J , e2, a2, b2, c2, d2, w[ 8], RIPEMD160C50, RIPEMD160S5B); + RIPEMD160_STEP (RIPEMD160_J , d2, e2, a2, b2, c2, w[ 1], RIPEMD160C50, RIPEMD160S5C); + RIPEMD160_STEP (RIPEMD160_J , c2, d2, e2, a2, b2, w[10], RIPEMD160C50, RIPEMD160S5D); + RIPEMD160_STEP (RIPEMD160_J , b2, c2, d2, e2, a2, w[ 3], RIPEMD160C50, RIPEMD160S5E); + RIPEMD160_STEP (RIPEMD160_J , a2, b2, c2, d2, e2, w[12], RIPEMD160C50, RIPEMD160S5F); + + RIPEMD160_STEP (RIPEMD160_Io, e2, a2, b2, c2, d2, w[ 6], RIPEMD160C60, RIPEMD160S60); + RIPEMD160_STEP (RIPEMD160_Io, d2, e2, a2, b2, c2, w[11], RIPEMD160C60, RIPEMD160S61); + RIPEMD160_STEP (RIPEMD160_Io, c2, d2, e2, a2, b2, w[ 3], RIPEMD160C60, RIPEMD160S62); + RIPEMD160_STEP (RIPEMD160_Io, b2, c2, d2, e2, a2, w[ 7], RIPEMD160C60, RIPEMD160S63); + RIPEMD160_STEP (RIPEMD160_Io, a2, b2, c2, d2, e2, w[ 0], RIPEMD160C60, RIPEMD160S64); + RIPEMD160_STEP (RIPEMD160_Io, e2, a2, b2, c2, d2, w[13], RIPEMD160C60, RIPEMD160S65); + RIPEMD160_STEP (RIPEMD160_Io, d2, e2, a2, b2, c2, w[ 5], RIPEMD160C60, RIPEMD160S66); + RIPEMD160_STEP (RIPEMD160_Io, c2, d2, e2, a2, b2, w[10], RIPEMD160C60, RIPEMD160S67); + RIPEMD160_STEP (RIPEMD160_Io, b2, c2, d2, e2, a2, w[14], RIPEMD160C60, RIPEMD160S68); + RIPEMD160_STEP (RIPEMD160_Io, a2, b2, c2, d2, e2, w[15], RIPEMD160C60, RIPEMD160S69); + RIPEMD160_STEP (RIPEMD160_Io, e2, a2, b2, c2, d2, w[ 8], RIPEMD160C60, RIPEMD160S6A); + RIPEMD160_STEP (RIPEMD160_Io, d2, e2, a2, b2, c2, w[12], RIPEMD160C60, RIPEMD160S6B); + RIPEMD160_STEP (RIPEMD160_Io, c2, d2, e2, a2, b2, w[ 4], RIPEMD160C60, RIPEMD160S6C); + RIPEMD160_STEP (RIPEMD160_Io, b2, c2, d2, e2, a2, w[ 9], RIPEMD160C60, RIPEMD160S6D); + RIPEMD160_STEP (RIPEMD160_Io, a2, b2, c2, d2, e2, w[ 1], RIPEMD160C60, RIPEMD160S6E); + RIPEMD160_STEP (RIPEMD160_Io, e2, a2, b2, c2, d2, w[ 2], RIPEMD160C60, RIPEMD160S6F); + + RIPEMD160_STEP (RIPEMD160_H , d2, e2, a2, b2, c2, w[15], RIPEMD160C70, RIPEMD160S70); + RIPEMD160_STEP (RIPEMD160_H , c2, d2, e2, a2, b2, w[ 5], RIPEMD160C70, RIPEMD160S71); + RIPEMD160_STEP (RIPEMD160_H , b2, c2, d2, e2, a2, w[ 1], RIPEMD160C70, RIPEMD160S72); + RIPEMD160_STEP (RIPEMD160_H , a2, b2, c2, d2, e2, w[ 3], RIPEMD160C70, RIPEMD160S73); + RIPEMD160_STEP (RIPEMD160_H , e2, a2, b2, c2, d2, w[ 7], RIPEMD160C70, RIPEMD160S74); + RIPEMD160_STEP (RIPEMD160_H , d2, e2, a2, b2, c2, w[14], RIPEMD160C70, RIPEMD160S75); + RIPEMD160_STEP (RIPEMD160_H , c2, d2, e2, a2, b2, w[ 6], RIPEMD160C70, RIPEMD160S76); + RIPEMD160_STEP (RIPEMD160_H , b2, c2, d2, e2, a2, w[ 9], RIPEMD160C70, RIPEMD160S77); + RIPEMD160_STEP (RIPEMD160_H , a2, b2, c2, d2, e2, w[11], RIPEMD160C70, RIPEMD160S78); + RIPEMD160_STEP (RIPEMD160_H , e2, a2, b2, c2, d2, w[ 8], RIPEMD160C70, RIPEMD160S79); + RIPEMD160_STEP (RIPEMD160_H , d2, e2, a2, b2, c2, w[12], RIPEMD160C70, RIPEMD160S7A); + RIPEMD160_STEP (RIPEMD160_H , c2, d2, e2, a2, b2, w[ 2], RIPEMD160C70, RIPEMD160S7B); + RIPEMD160_STEP (RIPEMD160_H , b2, c2, d2, e2, a2, w[10], RIPEMD160C70, RIPEMD160S7C); + RIPEMD160_STEP (RIPEMD160_H , a2, b2, c2, d2, e2, w[ 0], RIPEMD160C70, RIPEMD160S7D); + RIPEMD160_STEP (RIPEMD160_H , e2, a2, b2, c2, d2, w[ 4], RIPEMD160C70, RIPEMD160S7E); + RIPEMD160_STEP (RIPEMD160_H , d2, e2, a2, b2, c2, w[13], RIPEMD160C70, RIPEMD160S7F); + + RIPEMD160_STEP (RIPEMD160_Go, c2, d2, e2, a2, b2, w[ 8], RIPEMD160C80, RIPEMD160S80); + RIPEMD160_STEP (RIPEMD160_Go, b2, c2, d2, e2, a2, w[ 6], RIPEMD160C80, RIPEMD160S81); + RIPEMD160_STEP (RIPEMD160_Go, a2, b2, c2, d2, e2, w[ 4], RIPEMD160C80, RIPEMD160S82); + RIPEMD160_STEP (RIPEMD160_Go, e2, a2, b2, c2, d2, w[ 1], RIPEMD160C80, RIPEMD160S83); + RIPEMD160_STEP (RIPEMD160_Go, d2, e2, a2, b2, c2, w[ 3], RIPEMD160C80, RIPEMD160S84); + RIPEMD160_STEP (RIPEMD160_Go, c2, d2, e2, a2, b2, w[11], RIPEMD160C80, RIPEMD160S85); + RIPEMD160_STEP (RIPEMD160_Go, b2, c2, d2, e2, a2, w[15], RIPEMD160C80, RIPEMD160S86); + RIPEMD160_STEP (RIPEMD160_Go, a2, b2, c2, d2, e2, w[ 0], RIPEMD160C80, RIPEMD160S87); + RIPEMD160_STEP (RIPEMD160_Go, e2, a2, b2, c2, d2, w[ 5], RIPEMD160C80, RIPEMD160S88); + RIPEMD160_STEP (RIPEMD160_Go, d2, e2, a2, b2, c2, w[12], RIPEMD160C80, RIPEMD160S89); + RIPEMD160_STEP (RIPEMD160_Go, c2, d2, e2, a2, b2, w[ 2], RIPEMD160C80, RIPEMD160S8A); + RIPEMD160_STEP (RIPEMD160_Go, b2, c2, d2, e2, a2, w[13], RIPEMD160C80, RIPEMD160S8B); + RIPEMD160_STEP (RIPEMD160_Go, a2, b2, c2, d2, e2, w[ 9], RIPEMD160C80, RIPEMD160S8C); + RIPEMD160_STEP (RIPEMD160_Go, e2, a2, b2, c2, d2, w[ 7], RIPEMD160C80, RIPEMD160S8D); + RIPEMD160_STEP (RIPEMD160_Go, d2, e2, a2, b2, c2, w[10], RIPEMD160C80, RIPEMD160S8E); + RIPEMD160_STEP (RIPEMD160_Go, c2, d2, e2, a2, b2, w[14], RIPEMD160C80, RIPEMD160S8F); + + RIPEMD160_STEP (RIPEMD160_F , b2, c2, d2, e2, a2, w[12], RIPEMD160C90, RIPEMD160S90); + RIPEMD160_STEP (RIPEMD160_F , a2, b2, c2, d2, e2, w[15], RIPEMD160C90, RIPEMD160S91); + RIPEMD160_STEP (RIPEMD160_F , e2, a2, b2, c2, d2, w[10], RIPEMD160C90, RIPEMD160S92); + RIPEMD160_STEP (RIPEMD160_F , d2, e2, a2, b2, c2, w[ 4], RIPEMD160C90, RIPEMD160S93); + RIPEMD160_STEP (RIPEMD160_F , c2, d2, e2, a2, b2, w[ 1], RIPEMD160C90, RIPEMD160S94); + RIPEMD160_STEP (RIPEMD160_F , b2, c2, d2, e2, a2, w[ 5], RIPEMD160C90, RIPEMD160S95); + RIPEMD160_STEP (RIPEMD160_F , a2, b2, c2, d2, e2, w[ 8], RIPEMD160C90, RIPEMD160S96); + RIPEMD160_STEP (RIPEMD160_F , e2, a2, b2, c2, d2, w[ 7], RIPEMD160C90, RIPEMD160S97); + RIPEMD160_STEP (RIPEMD160_F , d2, e2, a2, b2, c2, w[ 6], RIPEMD160C90, RIPEMD160S98); + RIPEMD160_STEP (RIPEMD160_F , c2, d2, e2, a2, b2, w[ 2], RIPEMD160C90, RIPEMD160S99); + RIPEMD160_STEP (RIPEMD160_F , b2, c2, d2, e2, a2, w[13], RIPEMD160C90, RIPEMD160S9A); + RIPEMD160_STEP (RIPEMD160_F , a2, b2, c2, d2, e2, w[14], RIPEMD160C90, RIPEMD160S9B); + RIPEMD160_STEP (RIPEMD160_F , e2, a2, b2, c2, d2, w[ 0], RIPEMD160C90, RIPEMD160S9C); + RIPEMD160_STEP (RIPEMD160_F , d2, e2, a2, b2, c2, w[ 3], RIPEMD160C90, RIPEMD160S9D); + RIPEMD160_STEP (RIPEMD160_F , c2, d2, e2, a2, b2, w[ 9], RIPEMD160C90, RIPEMD160S9E); + RIPEMD160_STEP (RIPEMD160_F , b2, c2, d2, e2, a2, w[11], RIPEMD160C90, RIPEMD160S9F); + + const u32x a = dgst[1] + c1 + d2; + const u32x b = dgst[2] + d1 + e2; + const u32x c = dgst[3] + e1 + a2; + const u32x d = dgst[4] + a1 + b2; + const u32x e = dgst[0] + b1 + c2; + + dgst[0] = a; + dgst[1] = b; + dgst[2] = c; + dgst[3] = d; + dgst[4] = e; +} + +__device__ __constant__ comb_t c_combs[1024]; + +extern "C" __global__ void __launch_bounds__ (256, 1) m06000_m04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + append_0x80_2 (wordl0, wordl1, pw_l_len); + + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, c_combs[0].pw_len); + } + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = c_combs[il_pos].pw_len; + + const u32 pw_len = pw_l_len + pw_r_len; + + u32 wordr0[4]; + + wordr0[0] = c_combs[il_pos].i[0]; + wordr0[1] = c_combs[il_pos].i[1]; + wordr0[2] = c_combs[il_pos].i[2]; + wordr0[3] = c_combs[il_pos].i[3]; + + u32 wordr1[4]; + + wordr1[0] = c_combs[il_pos].i[4]; + wordr1[1] = c_combs[il_pos].i[5]; + wordr1[2] = c_combs[il_pos].i[6]; + wordr1[3] = c_combs[il_pos].i[7]; + + u32 wordr2[4]; + + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + + u32 wordr3[4]; + + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + u32x w0[4]; + + w0[0] = wordl0[0] | wordr0[0]; + w0[1] = wordl0[1] | wordr0[1]; + w0[2] = wordl0[2] | wordr0[2]; + w0[3] = wordl0[3] | wordr0[3]; + + u32x w1[4]; + + w1[0] = wordl1[0] | wordr1[0]; + w1[1] = wordl1[1] | wordr1[1]; + w1[2] = wordl1[2] | wordr1[2]; + w1[3] = wordl1[3] | wordr1[3]; + + u32x w2[4]; + + w2[0] = wordl2[0] | wordr2[0]; + w2[1] = wordl2[1] | wordr2[1]; + w2[2] = wordl2[2] | wordr2[2]; + w2[3] = wordl2[3] | wordr2[3]; + + u32x w3[4]; + + w3[0] = wordl3[0] | wordr3[0]; + w3[1] = wordl3[1] | wordr3[1]; + w3[2] = pw_len * 8; + w3[3] = 0; + + u32x wl[16]; + + wl[ 0] = w0[0]; + wl[ 1] = w0[1]; + wl[ 2] = w0[2]; + wl[ 3] = w0[3]; + wl[ 4] = w1[0]; + wl[ 5] = w1[1]; + wl[ 6] = w1[2]; + wl[ 7] = w1[3]; + wl[ 8] = 0; + wl[ 9] = 0; + wl[10] = 0; + wl[11] = 0; + wl[12] = 0; + wl[13] = 0; + wl[14] = pw_len * 8; + wl[15] = 0; + + u32x dgst[5]; + + dgst[0] = RIPEMD160M_A; + dgst[1] = RIPEMD160M_B; + dgst[2] = RIPEMD160M_C; + dgst[3] = RIPEMD160M_D; + dgst[4] = RIPEMD160M_E; + + ripemd160_transform (wl, dgst); + + const u32x r0 = dgst[0]; + const u32x r1 = dgst[1]; + const u32x r2 = dgst[2]; + const u32x r3 = dgst[3]; + + #include VECT_COMPARE_M + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m06000_m08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m06000_m16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m06000_s04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + append_0x80_2 (wordl0, wordl1, pw_l_len); + + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, c_combs[0].pw_len); + } + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = c_combs[il_pos].pw_len; + + const u32 pw_len = pw_l_len + pw_r_len; + + u32 wordr0[4]; + + wordr0[0] = c_combs[il_pos].i[0]; + wordr0[1] = c_combs[il_pos].i[1]; + wordr0[2] = c_combs[il_pos].i[2]; + wordr0[3] = c_combs[il_pos].i[3]; + + u32 wordr1[4]; + + wordr1[0] = c_combs[il_pos].i[4]; + wordr1[1] = c_combs[il_pos].i[5]; + wordr1[2] = c_combs[il_pos].i[6]; + wordr1[3] = c_combs[il_pos].i[7]; + + u32 wordr2[4]; + + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + + u32 wordr3[4]; + + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + u32x w0[4]; + + w0[0] = wordl0[0] | wordr0[0]; + w0[1] = wordl0[1] | wordr0[1]; + w0[2] = wordl0[2] | wordr0[2]; + w0[3] = wordl0[3] | wordr0[3]; + + u32x w1[4]; + + w1[0] = wordl1[0] | wordr1[0]; + w1[1] = wordl1[1] | wordr1[1]; + w1[2] = wordl1[2] | wordr1[2]; + w1[3] = wordl1[3] | wordr1[3]; + + u32x w2[4]; + + w2[0] = wordl2[0] | wordr2[0]; + w2[1] = wordl2[1] | wordr2[1]; + w2[2] = wordl2[2] | wordr2[2]; + w2[3] = wordl2[3] | wordr2[3]; + + u32x w3[4]; + + w3[0] = wordl3[0] | wordr3[0]; + w3[1] = wordl3[1] | wordr3[1]; + w3[2] = pw_len * 8; + w3[3] = 0; + + u32x wl[16]; + + wl[ 0] = w0[0]; + wl[ 1] = w0[1]; + wl[ 2] = w0[2]; + wl[ 3] = w0[3]; + wl[ 4] = w1[0]; + wl[ 5] = w1[1]; + wl[ 6] = w1[2]; + wl[ 7] = w1[3]; + wl[ 8] = 0; + wl[ 9] = 0; + wl[10] = 0; + wl[11] = 0; + wl[12] = 0; + wl[13] = 0; + wl[14] = pw_len * 8; + wl[15] = 0; + + u32x dgst[5]; + + dgst[0] = RIPEMD160M_A; + dgst[1] = RIPEMD160M_B; + dgst[2] = RIPEMD160M_C; + dgst[3] = RIPEMD160M_D; + dgst[4] = RIPEMD160M_E; + + ripemd160_transform (wl, dgst); + + const u32x r0 = dgst[0]; + const u32x r1 = dgst[1]; + const u32x r2 = dgst[2]; + const u32x r3 = dgst[3]; + + #include VECT_COMPARE_S + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m06000_s08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m06000_s16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/nv/m06000_a3.cu b/nv/m06000_a3.cu new file mode 100644 index 0000000000..66fb938123 --- /dev/null +++ b/nv/m06000_a3.cu @@ -0,0 +1,660 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _RIPEMD160_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW2 +#define VECT_SIZE1 +#endif + +#define DGST_R0 0 +#define DGST_R1 1 +#define DGST_R2 2 +#define DGST_R3 3 + +#include "include/kernel_functions.c" +#include "types_nv.c" +#include "common_nv.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +__device__ static void ripemd160_transform (const u32x w[16], u32x dgst[5]) +{ + u32x a1 = dgst[0]; + u32x b1 = dgst[1]; + u32x c1 = dgst[2]; + u32x d1 = dgst[3]; + u32x e1 = dgst[4]; + + RIPEMD160_STEP (RIPEMD160_F , a1, b1, c1, d1, e1, w[ 0], RIPEMD160C00, RIPEMD160S00); + RIPEMD160_STEP (RIPEMD160_F , e1, a1, b1, c1, d1, w[ 1], RIPEMD160C00, RIPEMD160S01); + RIPEMD160_STEP (RIPEMD160_F , d1, e1, a1, b1, c1, w[ 2], RIPEMD160C00, RIPEMD160S02); + RIPEMD160_STEP (RIPEMD160_F , c1, d1, e1, a1, b1, w[ 3], RIPEMD160C00, RIPEMD160S03); + RIPEMD160_STEP (RIPEMD160_F , b1, c1, d1, e1, a1, w[ 4], RIPEMD160C00, RIPEMD160S04); + RIPEMD160_STEP (RIPEMD160_F , a1, b1, c1, d1, e1, w[ 5], RIPEMD160C00, RIPEMD160S05); + RIPEMD160_STEP (RIPEMD160_F , e1, a1, b1, c1, d1, w[ 6], RIPEMD160C00, RIPEMD160S06); + RIPEMD160_STEP (RIPEMD160_F , d1, e1, a1, b1, c1, w[ 7], RIPEMD160C00, RIPEMD160S07); + RIPEMD160_STEP (RIPEMD160_F , c1, d1, e1, a1, b1, w[ 8], RIPEMD160C00, RIPEMD160S08); + RIPEMD160_STEP (RIPEMD160_F , b1, c1, d1, e1, a1, w[ 9], RIPEMD160C00, RIPEMD160S09); + RIPEMD160_STEP (RIPEMD160_F , a1, b1, c1, d1, e1, w[10], RIPEMD160C00, RIPEMD160S0A); + RIPEMD160_STEP (RIPEMD160_F , e1, a1, b1, c1, d1, w[11], RIPEMD160C00, RIPEMD160S0B); + RIPEMD160_STEP (RIPEMD160_F , d1, e1, a1, b1, c1, w[12], RIPEMD160C00, RIPEMD160S0C); + RIPEMD160_STEP (RIPEMD160_F , c1, d1, e1, a1, b1, w[13], RIPEMD160C00, RIPEMD160S0D); + RIPEMD160_STEP (RIPEMD160_F , b1, c1, d1, e1, a1, w[14], RIPEMD160C00, RIPEMD160S0E); + RIPEMD160_STEP (RIPEMD160_F , a1, b1, c1, d1, e1, w[15], RIPEMD160C00, RIPEMD160S0F); + + RIPEMD160_STEP (RIPEMD160_Go, e1, a1, b1, c1, d1, w[ 7], RIPEMD160C10, RIPEMD160S10); + RIPEMD160_STEP (RIPEMD160_Go, d1, e1, a1, b1, c1, w[ 4], RIPEMD160C10, RIPEMD160S11); + RIPEMD160_STEP (RIPEMD160_Go, c1, d1, e1, a1, b1, w[13], RIPEMD160C10, RIPEMD160S12); + RIPEMD160_STEP (RIPEMD160_Go, b1, c1, d1, e1, a1, w[ 1], RIPEMD160C10, RIPEMD160S13); + RIPEMD160_STEP (RIPEMD160_Go, a1, b1, c1, d1, e1, w[10], RIPEMD160C10, RIPEMD160S14); + RIPEMD160_STEP (RIPEMD160_Go, e1, a1, b1, c1, d1, w[ 6], RIPEMD160C10, RIPEMD160S15); + RIPEMD160_STEP (RIPEMD160_Go, d1, e1, a1, b1, c1, w[15], RIPEMD160C10, RIPEMD160S16); + RIPEMD160_STEP (RIPEMD160_Go, c1, d1, e1, a1, b1, w[ 3], RIPEMD160C10, RIPEMD160S17); + RIPEMD160_STEP (RIPEMD160_Go, b1, c1, d1, e1, a1, w[12], RIPEMD160C10, RIPEMD160S18); + RIPEMD160_STEP (RIPEMD160_Go, a1, b1, c1, d1, e1, w[ 0], RIPEMD160C10, RIPEMD160S19); + RIPEMD160_STEP (RIPEMD160_Go, e1, a1, b1, c1, d1, w[ 9], RIPEMD160C10, RIPEMD160S1A); + RIPEMD160_STEP (RIPEMD160_Go, d1, e1, a1, b1, c1, w[ 5], RIPEMD160C10, RIPEMD160S1B); + RIPEMD160_STEP (RIPEMD160_Go, c1, d1, e1, a1, b1, w[ 2], RIPEMD160C10, RIPEMD160S1C); + RIPEMD160_STEP (RIPEMD160_Go, b1, c1, d1, e1, a1, w[14], RIPEMD160C10, RIPEMD160S1D); + RIPEMD160_STEP (RIPEMD160_Go, a1, b1, c1, d1, e1, w[11], RIPEMD160C10, RIPEMD160S1E); + RIPEMD160_STEP (RIPEMD160_Go, e1, a1, b1, c1, d1, w[ 8], RIPEMD160C10, RIPEMD160S1F); + + RIPEMD160_STEP (RIPEMD160_H , d1, e1, a1, b1, c1, w[ 3], RIPEMD160C20, RIPEMD160S20); + RIPEMD160_STEP (RIPEMD160_H , c1, d1, e1, a1, b1, w[10], RIPEMD160C20, RIPEMD160S21); + RIPEMD160_STEP (RIPEMD160_H , b1, c1, d1, e1, a1, w[14], RIPEMD160C20, RIPEMD160S22); + RIPEMD160_STEP (RIPEMD160_H , a1, b1, c1, d1, e1, w[ 4], RIPEMD160C20, RIPEMD160S23); + RIPEMD160_STEP (RIPEMD160_H , e1, a1, b1, c1, d1, w[ 9], RIPEMD160C20, RIPEMD160S24); + RIPEMD160_STEP (RIPEMD160_H , d1, e1, a1, b1, c1, w[15], RIPEMD160C20, RIPEMD160S25); + RIPEMD160_STEP (RIPEMD160_H , c1, d1, e1, a1, b1, w[ 8], RIPEMD160C20, RIPEMD160S26); + RIPEMD160_STEP (RIPEMD160_H , b1, c1, d1, e1, a1, w[ 1], RIPEMD160C20, RIPEMD160S27); + RIPEMD160_STEP (RIPEMD160_H , a1, b1, c1, d1, e1, w[ 2], RIPEMD160C20, RIPEMD160S28); + RIPEMD160_STEP (RIPEMD160_H , e1, a1, b1, c1, d1, w[ 7], RIPEMD160C20, RIPEMD160S29); + RIPEMD160_STEP (RIPEMD160_H , d1, e1, a1, b1, c1, w[ 0], RIPEMD160C20, RIPEMD160S2A); + RIPEMD160_STEP (RIPEMD160_H , c1, d1, e1, a1, b1, w[ 6], RIPEMD160C20, RIPEMD160S2B); + RIPEMD160_STEP (RIPEMD160_H , b1, c1, d1, e1, a1, w[13], RIPEMD160C20, RIPEMD160S2C); + RIPEMD160_STEP (RIPEMD160_H , a1, b1, c1, d1, e1, w[11], RIPEMD160C20, RIPEMD160S2D); + RIPEMD160_STEP (RIPEMD160_H , e1, a1, b1, c1, d1, w[ 5], RIPEMD160C20, RIPEMD160S2E); + RIPEMD160_STEP (RIPEMD160_H , d1, e1, a1, b1, c1, w[12], RIPEMD160C20, RIPEMD160S2F); + + RIPEMD160_STEP (RIPEMD160_Io, c1, d1, e1, a1, b1, w[ 1], RIPEMD160C30, RIPEMD160S30); + RIPEMD160_STEP (RIPEMD160_Io, b1, c1, d1, e1, a1, w[ 9], RIPEMD160C30, RIPEMD160S31); + RIPEMD160_STEP (RIPEMD160_Io, a1, b1, c1, d1, e1, w[11], RIPEMD160C30, RIPEMD160S32); + RIPEMD160_STEP (RIPEMD160_Io, e1, a1, b1, c1, d1, w[10], RIPEMD160C30, RIPEMD160S33); + RIPEMD160_STEP (RIPEMD160_Io, d1, e1, a1, b1, c1, w[ 0], RIPEMD160C30, RIPEMD160S34); + RIPEMD160_STEP (RIPEMD160_Io, c1, d1, e1, a1, b1, w[ 8], RIPEMD160C30, RIPEMD160S35); + RIPEMD160_STEP (RIPEMD160_Io, b1, c1, d1, e1, a1, w[12], RIPEMD160C30, RIPEMD160S36); + RIPEMD160_STEP (RIPEMD160_Io, a1, b1, c1, d1, e1, w[ 4], RIPEMD160C30, RIPEMD160S37); + RIPEMD160_STEP (RIPEMD160_Io, e1, a1, b1, c1, d1, w[13], RIPEMD160C30, RIPEMD160S38); + RIPEMD160_STEP (RIPEMD160_Io, d1, e1, a1, b1, c1, w[ 3], RIPEMD160C30, RIPEMD160S39); + RIPEMD160_STEP (RIPEMD160_Io, c1, d1, e1, a1, b1, w[ 7], RIPEMD160C30, RIPEMD160S3A); + RIPEMD160_STEP (RIPEMD160_Io, b1, c1, d1, e1, a1, w[15], RIPEMD160C30, RIPEMD160S3B); + RIPEMD160_STEP (RIPEMD160_Io, a1, b1, c1, d1, e1, w[14], RIPEMD160C30, RIPEMD160S3C); + RIPEMD160_STEP (RIPEMD160_Io, e1, a1, b1, c1, d1, w[ 5], RIPEMD160C30, RIPEMD160S3D); + RIPEMD160_STEP (RIPEMD160_Io, d1, e1, a1, b1, c1, w[ 6], RIPEMD160C30, RIPEMD160S3E); + RIPEMD160_STEP (RIPEMD160_Io, c1, d1, e1, a1, b1, w[ 2], RIPEMD160C30, RIPEMD160S3F); + + RIPEMD160_STEP (RIPEMD160_J , b1, c1, d1, e1, a1, w[ 4], RIPEMD160C40, RIPEMD160S40); + RIPEMD160_STEP (RIPEMD160_J , a1, b1, c1, d1, e1, w[ 0], RIPEMD160C40, RIPEMD160S41); + RIPEMD160_STEP (RIPEMD160_J , e1, a1, b1, c1, d1, w[ 5], RIPEMD160C40, RIPEMD160S42); + RIPEMD160_STEP (RIPEMD160_J , d1, e1, a1, b1, c1, w[ 9], RIPEMD160C40, RIPEMD160S43); + RIPEMD160_STEP (RIPEMD160_J , c1, d1, e1, a1, b1, w[ 7], RIPEMD160C40, RIPEMD160S44); + RIPEMD160_STEP (RIPEMD160_J , b1, c1, d1, e1, a1, w[12], RIPEMD160C40, RIPEMD160S45); + RIPEMD160_STEP (RIPEMD160_J , a1, b1, c1, d1, e1, w[ 2], RIPEMD160C40, RIPEMD160S46); + RIPEMD160_STEP (RIPEMD160_J , e1, a1, b1, c1, d1, w[10], RIPEMD160C40, RIPEMD160S47); + RIPEMD160_STEP (RIPEMD160_J , d1, e1, a1, b1, c1, w[14], RIPEMD160C40, RIPEMD160S48); + RIPEMD160_STEP (RIPEMD160_J , c1, d1, e1, a1, b1, w[ 1], RIPEMD160C40, RIPEMD160S49); + RIPEMD160_STEP (RIPEMD160_J , b1, c1, d1, e1, a1, w[ 3], RIPEMD160C40, RIPEMD160S4A); + RIPEMD160_STEP (RIPEMD160_J , a1, b1, c1, d1, e1, w[ 8], RIPEMD160C40, RIPEMD160S4B); + RIPEMD160_STEP (RIPEMD160_J , e1, a1, b1, c1, d1, w[11], RIPEMD160C40, RIPEMD160S4C); + RIPEMD160_STEP (RIPEMD160_J , d1, e1, a1, b1, c1, w[ 6], RIPEMD160C40, RIPEMD160S4D); + RIPEMD160_STEP (RIPEMD160_J , c1, d1, e1, a1, b1, w[15], RIPEMD160C40, RIPEMD160S4E); + RIPEMD160_STEP (RIPEMD160_J , b1, c1, d1, e1, a1, w[13], RIPEMD160C40, RIPEMD160S4F); + + u32x a2 = dgst[0]; + u32x b2 = dgst[1]; + u32x c2 = dgst[2]; + u32x d2 = dgst[3]; + u32x e2 = dgst[4]; + + //RIPEMD160_STEP_WORKAROUND_BUG (RIPEMD160_J , a2, b2, c2, d2, e2, w[ 5], RIPEMD160C50, RIPEMD160S50); + RIPEMD160_STEP (RIPEMD160_J , a2, b2, c2, d2, e2, w[ 5], RIPEMD160C50, RIPEMD160S50); + RIPEMD160_STEP (RIPEMD160_J , e2, a2, b2, c2, d2, w[14], RIPEMD160C50, RIPEMD160S51); + RIPEMD160_STEP (RIPEMD160_J , d2, e2, a2, b2, c2, w[ 7], RIPEMD160C50, RIPEMD160S52); + RIPEMD160_STEP (RIPEMD160_J , c2, d2, e2, a2, b2, w[ 0], RIPEMD160C50, RIPEMD160S53); + RIPEMD160_STEP (RIPEMD160_J , b2, c2, d2, e2, a2, w[ 9], RIPEMD160C50, RIPEMD160S54); + RIPEMD160_STEP (RIPEMD160_J , a2, b2, c2, d2, e2, w[ 2], RIPEMD160C50, RIPEMD160S55); + RIPEMD160_STEP (RIPEMD160_J , e2, a2, b2, c2, d2, w[11], RIPEMD160C50, RIPEMD160S56); + RIPEMD160_STEP (RIPEMD160_J , d2, e2, a2, b2, c2, w[ 4], RIPEMD160C50, RIPEMD160S57); + RIPEMD160_STEP (RIPEMD160_J , c2, d2, e2, a2, b2, w[13], RIPEMD160C50, RIPEMD160S58); + RIPEMD160_STEP (RIPEMD160_J , b2, c2, d2, e2, a2, w[ 6], RIPEMD160C50, RIPEMD160S59); + RIPEMD160_STEP (RIPEMD160_J , a2, b2, c2, d2, e2, w[15], RIPEMD160C50, RIPEMD160S5A); + RIPEMD160_STEP (RIPEMD160_J , e2, a2, b2, c2, d2, w[ 8], RIPEMD160C50, RIPEMD160S5B); + RIPEMD160_STEP (RIPEMD160_J , d2, e2, a2, b2, c2, w[ 1], RIPEMD160C50, RIPEMD160S5C); + RIPEMD160_STEP (RIPEMD160_J , c2, d2, e2, a2, b2, w[10], RIPEMD160C50, RIPEMD160S5D); + RIPEMD160_STEP (RIPEMD160_J , b2, c2, d2, e2, a2, w[ 3], RIPEMD160C50, RIPEMD160S5E); + RIPEMD160_STEP (RIPEMD160_J , a2, b2, c2, d2, e2, w[12], RIPEMD160C50, RIPEMD160S5F); + + RIPEMD160_STEP (RIPEMD160_Io, e2, a2, b2, c2, d2, w[ 6], RIPEMD160C60, RIPEMD160S60); + RIPEMD160_STEP (RIPEMD160_Io, d2, e2, a2, b2, c2, w[11], RIPEMD160C60, RIPEMD160S61); + RIPEMD160_STEP (RIPEMD160_Io, c2, d2, e2, a2, b2, w[ 3], RIPEMD160C60, RIPEMD160S62); + RIPEMD160_STEP (RIPEMD160_Io, b2, c2, d2, e2, a2, w[ 7], RIPEMD160C60, RIPEMD160S63); + RIPEMD160_STEP (RIPEMD160_Io, a2, b2, c2, d2, e2, w[ 0], RIPEMD160C60, RIPEMD160S64); + RIPEMD160_STEP (RIPEMD160_Io, e2, a2, b2, c2, d2, w[13], RIPEMD160C60, RIPEMD160S65); + RIPEMD160_STEP (RIPEMD160_Io, d2, e2, a2, b2, c2, w[ 5], RIPEMD160C60, RIPEMD160S66); + RIPEMD160_STEP (RIPEMD160_Io, c2, d2, e2, a2, b2, w[10], RIPEMD160C60, RIPEMD160S67); + RIPEMD160_STEP (RIPEMD160_Io, b2, c2, d2, e2, a2, w[14], RIPEMD160C60, RIPEMD160S68); + RIPEMD160_STEP (RIPEMD160_Io, a2, b2, c2, d2, e2, w[15], RIPEMD160C60, RIPEMD160S69); + RIPEMD160_STEP (RIPEMD160_Io, e2, a2, b2, c2, d2, w[ 8], RIPEMD160C60, RIPEMD160S6A); + RIPEMD160_STEP (RIPEMD160_Io, d2, e2, a2, b2, c2, w[12], RIPEMD160C60, RIPEMD160S6B); + RIPEMD160_STEP (RIPEMD160_Io, c2, d2, e2, a2, b2, w[ 4], RIPEMD160C60, RIPEMD160S6C); + RIPEMD160_STEP (RIPEMD160_Io, b2, c2, d2, e2, a2, w[ 9], RIPEMD160C60, RIPEMD160S6D); + RIPEMD160_STEP (RIPEMD160_Io, a2, b2, c2, d2, e2, w[ 1], RIPEMD160C60, RIPEMD160S6E); + RIPEMD160_STEP (RIPEMD160_Io, e2, a2, b2, c2, d2, w[ 2], RIPEMD160C60, RIPEMD160S6F); + + RIPEMD160_STEP (RIPEMD160_H , d2, e2, a2, b2, c2, w[15], RIPEMD160C70, RIPEMD160S70); + RIPEMD160_STEP (RIPEMD160_H , c2, d2, e2, a2, b2, w[ 5], RIPEMD160C70, RIPEMD160S71); + RIPEMD160_STEP (RIPEMD160_H , b2, c2, d2, e2, a2, w[ 1], RIPEMD160C70, RIPEMD160S72); + RIPEMD160_STEP (RIPEMD160_H , a2, b2, c2, d2, e2, w[ 3], RIPEMD160C70, RIPEMD160S73); + RIPEMD160_STEP (RIPEMD160_H , e2, a2, b2, c2, d2, w[ 7], RIPEMD160C70, RIPEMD160S74); + RIPEMD160_STEP (RIPEMD160_H , d2, e2, a2, b2, c2, w[14], RIPEMD160C70, RIPEMD160S75); + RIPEMD160_STEP (RIPEMD160_H , c2, d2, e2, a2, b2, w[ 6], RIPEMD160C70, RIPEMD160S76); + RIPEMD160_STEP (RIPEMD160_H , b2, c2, d2, e2, a2, w[ 9], RIPEMD160C70, RIPEMD160S77); + RIPEMD160_STEP (RIPEMD160_H , a2, b2, c2, d2, e2, w[11], RIPEMD160C70, RIPEMD160S78); + RIPEMD160_STEP (RIPEMD160_H , e2, a2, b2, c2, d2, w[ 8], RIPEMD160C70, RIPEMD160S79); + RIPEMD160_STEP (RIPEMD160_H , d2, e2, a2, b2, c2, w[12], RIPEMD160C70, RIPEMD160S7A); + RIPEMD160_STEP (RIPEMD160_H , c2, d2, e2, a2, b2, w[ 2], RIPEMD160C70, RIPEMD160S7B); + RIPEMD160_STEP (RIPEMD160_H , b2, c2, d2, e2, a2, w[10], RIPEMD160C70, RIPEMD160S7C); + RIPEMD160_STEP (RIPEMD160_H , a2, b2, c2, d2, e2, w[ 0], RIPEMD160C70, RIPEMD160S7D); + RIPEMD160_STEP (RIPEMD160_H , e2, a2, b2, c2, d2, w[ 4], RIPEMD160C70, RIPEMD160S7E); + RIPEMD160_STEP (RIPEMD160_H , d2, e2, a2, b2, c2, w[13], RIPEMD160C70, RIPEMD160S7F); + + RIPEMD160_STEP (RIPEMD160_Go, c2, d2, e2, a2, b2, w[ 8], RIPEMD160C80, RIPEMD160S80); + RIPEMD160_STEP (RIPEMD160_Go, b2, c2, d2, e2, a2, w[ 6], RIPEMD160C80, RIPEMD160S81); + RIPEMD160_STEP (RIPEMD160_Go, a2, b2, c2, d2, e2, w[ 4], RIPEMD160C80, RIPEMD160S82); + RIPEMD160_STEP (RIPEMD160_Go, e2, a2, b2, c2, d2, w[ 1], RIPEMD160C80, RIPEMD160S83); + RIPEMD160_STEP (RIPEMD160_Go, d2, e2, a2, b2, c2, w[ 3], RIPEMD160C80, RIPEMD160S84); + RIPEMD160_STEP (RIPEMD160_Go, c2, d2, e2, a2, b2, w[11], RIPEMD160C80, RIPEMD160S85); + RIPEMD160_STEP (RIPEMD160_Go, b2, c2, d2, e2, a2, w[15], RIPEMD160C80, RIPEMD160S86); + RIPEMD160_STEP (RIPEMD160_Go, a2, b2, c2, d2, e2, w[ 0], RIPEMD160C80, RIPEMD160S87); + RIPEMD160_STEP (RIPEMD160_Go, e2, a2, b2, c2, d2, w[ 5], RIPEMD160C80, RIPEMD160S88); + RIPEMD160_STEP (RIPEMD160_Go, d2, e2, a2, b2, c2, w[12], RIPEMD160C80, RIPEMD160S89); + RIPEMD160_STEP (RIPEMD160_Go, c2, d2, e2, a2, b2, w[ 2], RIPEMD160C80, RIPEMD160S8A); + RIPEMD160_STEP (RIPEMD160_Go, b2, c2, d2, e2, a2, w[13], RIPEMD160C80, RIPEMD160S8B); + RIPEMD160_STEP (RIPEMD160_Go, a2, b2, c2, d2, e2, w[ 9], RIPEMD160C80, RIPEMD160S8C); + RIPEMD160_STEP (RIPEMD160_Go, e2, a2, b2, c2, d2, w[ 7], RIPEMD160C80, RIPEMD160S8D); + RIPEMD160_STEP (RIPEMD160_Go, d2, e2, a2, b2, c2, w[10], RIPEMD160C80, RIPEMD160S8E); + RIPEMD160_STEP (RIPEMD160_Go, c2, d2, e2, a2, b2, w[14], RIPEMD160C80, RIPEMD160S8F); + + RIPEMD160_STEP (RIPEMD160_F , b2, c2, d2, e2, a2, w[12], RIPEMD160C90, RIPEMD160S90); + RIPEMD160_STEP (RIPEMD160_F , a2, b2, c2, d2, e2, w[15], RIPEMD160C90, RIPEMD160S91); + RIPEMD160_STEP (RIPEMD160_F , e2, a2, b2, c2, d2, w[10], RIPEMD160C90, RIPEMD160S92); + RIPEMD160_STEP (RIPEMD160_F , d2, e2, a2, b2, c2, w[ 4], RIPEMD160C90, RIPEMD160S93); + RIPEMD160_STEP (RIPEMD160_F , c2, d2, e2, a2, b2, w[ 1], RIPEMD160C90, RIPEMD160S94); + RIPEMD160_STEP (RIPEMD160_F , b2, c2, d2, e2, a2, w[ 5], RIPEMD160C90, RIPEMD160S95); + RIPEMD160_STEP (RIPEMD160_F , a2, b2, c2, d2, e2, w[ 8], RIPEMD160C90, RIPEMD160S96); + RIPEMD160_STEP (RIPEMD160_F , e2, a2, b2, c2, d2, w[ 7], RIPEMD160C90, RIPEMD160S97); + RIPEMD160_STEP (RIPEMD160_F , d2, e2, a2, b2, c2, w[ 6], RIPEMD160C90, RIPEMD160S98); + RIPEMD160_STEP (RIPEMD160_F , c2, d2, e2, a2, b2, w[ 2], RIPEMD160C90, RIPEMD160S99); + RIPEMD160_STEP (RIPEMD160_F , b2, c2, d2, e2, a2, w[13], RIPEMD160C90, RIPEMD160S9A); + RIPEMD160_STEP (RIPEMD160_F , a2, b2, c2, d2, e2, w[14], RIPEMD160C90, RIPEMD160S9B); + RIPEMD160_STEP (RIPEMD160_F , e2, a2, b2, c2, d2, w[ 0], RIPEMD160C90, RIPEMD160S9C); + RIPEMD160_STEP (RIPEMD160_F , d2, e2, a2, b2, c2, w[ 3], RIPEMD160C90, RIPEMD160S9D); + RIPEMD160_STEP (RIPEMD160_F , c2, d2, e2, a2, b2, w[ 9], RIPEMD160C90, RIPEMD160S9E); + RIPEMD160_STEP (RIPEMD160_F , b2, c2, d2, e2, a2, w[11], RIPEMD160C90, RIPEMD160S9F); + + const u32x a = dgst[1] + c1 + d2; + const u32x b = dgst[2] + d1 + e2; + const u32x c = dgst[3] + e1 + a2; + const u32x d = dgst[4] + a1 + b2; + const u32x e = dgst[0] + b1 + c2; + + dgst[0] = a; + dgst[1] = b; + dgst[2] = c; + dgst[3] = d; + dgst[4] = e; +} + +__device__ __constant__ bf_t c_bfs[1024]; + +__device__ static void m06000m (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], const u32 pw_len, const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset) +{ + /** + * modifier + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 w14 = pw_len * 8; + + /** + * loop + */ + + u32x w0l = w0[0]; + + for (u32 il_pos = 0; il_pos < bfs_cnt; il_pos++) + { + const u32 w0r = c_bfs[il_pos].i; + + w0[0] = w0l | w0r; + + u32x wl[16]; + + wl[ 0] = w0[0]; + wl[ 1] = w0[1]; + wl[ 2] = w0[2]; + wl[ 3] = w0[3]; + wl[ 4] = w1[0]; + wl[ 5] = w1[1]; + wl[ 6] = w1[2]; + wl[ 7] = w1[3]; + wl[ 8] = w2[0]; + wl[ 9] = w2[1]; + wl[10] = w2[2]; + wl[11] = w2[3]; + wl[12] = w3[0]; + wl[13] = w3[1]; + wl[14] = w14; + wl[15] = 0; + + u32x dgst[5]; + + dgst[0] = RIPEMD160M_A; + dgst[1] = RIPEMD160M_B; + dgst[2] = RIPEMD160M_C; + dgst[3] = RIPEMD160M_D; + dgst[4] = RIPEMD160M_E; + + ripemd160_transform (wl, dgst); + + const u32x r0 = dgst[0]; + const u32x r1 = dgst[1]; + const u32x r2 = dgst[2]; + const u32x r3 = dgst[3]; + + #include VECT_COMPARE_M + } +} + +__device__ static void m06000s (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], const u32 pw_len, const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset) +{ + /** + * modifier + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 w14 = pw_len * 8; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * loop + */ + + u32x w0l = w0[0]; + + for (u32 il_pos = 0; il_pos < bfs_cnt; il_pos++) + { + const u32 w0r = c_bfs[il_pos].i; + + w0[0] = w0l | w0r; + + u32x wl[16]; + + wl[ 0] = w0[0]; + wl[ 1] = w0[1]; + wl[ 2] = w0[2]; + wl[ 3] = w0[3]; + wl[ 4] = w1[0]; + wl[ 5] = w1[1]; + wl[ 6] = w1[2]; + wl[ 7] = w1[3]; + wl[ 8] = w2[0]; + wl[ 9] = w2[1]; + wl[10] = w2[2]; + wl[11] = w2[3]; + wl[12] = w3[0]; + wl[13] = w3[1]; + wl[14] = w14; + wl[15] = 0; + + u32x dgst[5]; + + dgst[0] = RIPEMD160M_A; + dgst[1] = RIPEMD160M_B; + dgst[2] = RIPEMD160M_C; + dgst[3] = RIPEMD160M_D; + dgst[4] = RIPEMD160M_E; + + ripemd160_transform (wl, dgst); + + const u32x r0 = dgst[0]; + const u32x r1 = dgst[1]; + const u32x r2 = dgst[2]; + const u32x r3 = dgst[3]; + + #include VECT_COMPARE_S + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m06000_m04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m06000m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m06000_m08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m06000m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m06000_m16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = pws[gid].i[ 8]; + w2[1] = pws[gid].i[ 9]; + w2[2] = pws[gid].i[10]; + w2[3] = pws[gid].i[11]; + + u32x w3[4]; + + w3[0] = pws[gid].i[12]; + w3[1] = pws[gid].i[13]; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m06000m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m06000_s04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m06000s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m06000_s08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m06000s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m06000_s16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = pws[gid].i[ 8]; + w2[1] = pws[gid].i[ 9]; + w2[2] = pws[gid].i[10]; + w2[3] = pws[gid].i[11]; + + u32x w3[4]; + + w3[0] = pws[gid].i[12]; + w3[1] = pws[gid].i[13]; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m06000s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} diff --git a/nv/m06100_a0.cu b/nv/m06100_a0.cu new file mode 100644 index 0000000000..36a16b25c1 --- /dev/null +++ b/nv/m06100_a0.cu @@ -0,0 +1,1619 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _WHIRLPOOL_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW2 +#define VECT_SIZE1 +#endif + +#define DGST_R0 0 +#define DGST_R1 1 +#define DGST_R2 2 +#define DGST_R3 3 + +#include "include/kernel_functions.c" +#include "types_nv.c" +#include "common_nv.c" +#include "include/rp_gpu.h" +#include "rp_nv.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#define R 10 + +#ifdef VECT_SIZE1 +#define BOX(S,n,i) u32x ((S)[(n)][(i)]) +#endif + +#ifdef VECT_SIZE2 +#define BOX(S,n,i) u32x ((S)[(n)][(i).x], (S)[(n)][(i).y]) +#endif + +__device__ static u32 Ch[8][256] = +{ + { + 0x18186018, 0x23238c23, 0xc6c63fc6, 0xe8e887e8, + 0x87872687, 0xb8b8dab8, 0x01010401, 0x4f4f214f, + 0x3636d836, 0xa6a6a2a6, 0xd2d26fd2, 0xf5f5f3f5, + 0x7979f979, 0x6f6fa16f, 0x91917e91, 0x52525552, + 0x60609d60, 0xbcbccabc, 0x9b9b569b, 0x8e8e028e, + 0xa3a3b6a3, 0x0c0c300c, 0x7b7bf17b, 0x3535d435, + 0x1d1d741d, 0xe0e0a7e0, 0xd7d77bd7, 0xc2c22fc2, + 0x2e2eb82e, 0x4b4b314b, 0xfefedffe, 0x57574157, + 0x15155415, 0x7777c177, 0x3737dc37, 0xe5e5b3e5, + 0x9f9f469f, 0xf0f0e7f0, 0x4a4a354a, 0xdada4fda, + 0x58587d58, 0xc9c903c9, 0x2929a429, 0x0a0a280a, + 0xb1b1feb1, 0xa0a0baa0, 0x6b6bb16b, 0x85852e85, + 0xbdbdcebd, 0x5d5d695d, 0x10104010, 0xf4f4f7f4, + 0xcbcb0bcb, 0x3e3ef83e, 0x05051405, 0x67678167, + 0xe4e4b7e4, 0x27279c27, 0x41411941, 0x8b8b168b, + 0xa7a7a6a7, 0x7d7de97d, 0x95956e95, 0xd8d847d8, + 0xfbfbcbfb, 0xeeee9fee, 0x7c7ced7c, 0x66668566, + 0xdddd53dd, 0x17175c17, 0x47470147, 0x9e9e429e, + 0xcaca0fca, 0x2d2db42d, 0xbfbfc6bf, 0x07071c07, + 0xadad8ead, 0x5a5a755a, 0x83833683, 0x3333cc33, + 0x63639163, 0x02020802, 0xaaaa92aa, 0x7171d971, + 0xc8c807c8, 0x19196419, 0x49493949, 0xd9d943d9, + 0xf2f2eff2, 0xe3e3abe3, 0x5b5b715b, 0x88881a88, + 0x9a9a529a, 0x26269826, 0x3232c832, 0xb0b0fab0, + 0xe9e983e9, 0x0f0f3c0f, 0xd5d573d5, 0x80803a80, + 0xbebec2be, 0xcdcd13cd, 0x3434d034, 0x48483d48, + 0xffffdbff, 0x7a7af57a, 0x90907a90, 0x5f5f615f, + 0x20208020, 0x6868bd68, 0x1a1a681a, 0xaeae82ae, + 0xb4b4eab4, 0x54544d54, 0x93937693, 0x22228822, + 0x64648d64, 0xf1f1e3f1, 0x7373d173, 0x12124812, + 0x40401d40, 0x08082008, 0xc3c32bc3, 0xecec97ec, + 0xdbdb4bdb, 0xa1a1bea1, 0x8d8d0e8d, 0x3d3df43d, + 0x97976697, 0x00000000, 0xcfcf1bcf, 0x2b2bac2b, + 0x7676c576, 0x82823282, 0xd6d67fd6, 0x1b1b6c1b, + 0xb5b5eeb5, 0xafaf86af, 0x6a6ab56a, 0x50505d50, + 0x45450945, 0xf3f3ebf3, 0x3030c030, 0xefef9bef, + 0x3f3ffc3f, 0x55554955, 0xa2a2b2a2, 0xeaea8fea, + 0x65658965, 0xbabad2ba, 0x2f2fbc2f, 0xc0c027c0, + 0xdede5fde, 0x1c1c701c, 0xfdfdd3fd, 0x4d4d294d, + 0x92927292, 0x7575c975, 0x06061806, 0x8a8a128a, + 0xb2b2f2b2, 0xe6e6bfe6, 0x0e0e380e, 0x1f1f7c1f, + 0x62629562, 0xd4d477d4, 0xa8a89aa8, 0x96966296, + 0xf9f9c3f9, 0xc5c533c5, 0x25259425, 0x59597959, + 0x84842a84, 0x7272d572, 0x3939e439, 0x4c4c2d4c, + 0x5e5e655e, 0x7878fd78, 0x3838e038, 0x8c8c0a8c, + 0xd1d163d1, 0xa5a5aea5, 0xe2e2afe2, 0x61619961, + 0xb3b3f6b3, 0x21218421, 0x9c9c4a9c, 0x1e1e781e, + 0x43431143, 0xc7c73bc7, 0xfcfcd7fc, 0x04041004, + 0x51515951, 0x99995e99, 0x6d6da96d, 0x0d0d340d, + 0xfafacffa, 0xdfdf5bdf, 0x7e7ee57e, 0x24249024, + 0x3b3bec3b, 0xabab96ab, 0xcece1fce, 0x11114411, + 0x8f8f068f, 0x4e4e254e, 0xb7b7e6b7, 0xebeb8beb, + 0x3c3cf03c, 0x81813e81, 0x94946a94, 0xf7f7fbf7, + 0xb9b9deb9, 0x13134c13, 0x2c2cb02c, 0xd3d36bd3, + 0xe7e7bbe7, 0x6e6ea56e, 0xc4c437c4, 0x03030c03, + 0x56564556, 0x44440d44, 0x7f7fe17f, 0xa9a99ea9, + 0x2a2aa82a, 0xbbbbd6bb, 0xc1c123c1, 0x53535153, + 0xdcdc57dc, 0x0b0b2c0b, 0x9d9d4e9d, 0x6c6cad6c, + 0x3131c431, 0x7474cd74, 0xf6f6fff6, 0x46460546, + 0xacac8aac, 0x89891e89, 0x14145014, 0xe1e1a3e1, + 0x16165816, 0x3a3ae83a, 0x6969b969, 0x09092409, + 0x7070dd70, 0xb6b6e2b6, 0xd0d067d0, 0xeded93ed, + 0xcccc17cc, 0x42421542, 0x98985a98, 0xa4a4aaa4, + 0x2828a028, 0x5c5c6d5c, 0xf8f8c7f8, 0x86862286, + }, + { + 0xd8181860, 0x2623238c, 0xb8c6c63f, 0xfbe8e887, + 0xcb878726, 0x11b8b8da, 0x09010104, 0x0d4f4f21, + 0x9b3636d8, 0xffa6a6a2, 0x0cd2d26f, 0x0ef5f5f3, + 0x967979f9, 0x306f6fa1, 0x6d91917e, 0xf8525255, + 0x4760609d, 0x35bcbcca, 0x379b9b56, 0x8a8e8e02, + 0xd2a3a3b6, 0x6c0c0c30, 0x847b7bf1, 0x803535d4, + 0xf51d1d74, 0xb3e0e0a7, 0x21d7d77b, 0x9cc2c22f, + 0x432e2eb8, 0x294b4b31, 0x5dfefedf, 0xd5575741, + 0xbd151554, 0xe87777c1, 0x923737dc, 0x9ee5e5b3, + 0x139f9f46, 0x23f0f0e7, 0x204a4a35, 0x44dada4f, + 0xa258587d, 0xcfc9c903, 0x7c2929a4, 0x5a0a0a28, + 0x50b1b1fe, 0xc9a0a0ba, 0x146b6bb1, 0xd985852e, + 0x3cbdbdce, 0x8f5d5d69, 0x90101040, 0x07f4f4f7, + 0xddcbcb0b, 0xd33e3ef8, 0x2d050514, 0x78676781, + 0x97e4e4b7, 0x0227279c, 0x73414119, 0xa78b8b16, + 0xf6a7a7a6, 0xb27d7de9, 0x4995956e, 0x56d8d847, + 0x70fbfbcb, 0xcdeeee9f, 0xbb7c7ced, 0x71666685, + 0x7bdddd53, 0xaf17175c, 0x45474701, 0x1a9e9e42, + 0xd4caca0f, 0x582d2db4, 0x2ebfbfc6, 0x3f07071c, + 0xacadad8e, 0xb05a5a75, 0xef838336, 0xb63333cc, + 0x5c636391, 0x12020208, 0x93aaaa92, 0xde7171d9, + 0xc6c8c807, 0xd1191964, 0x3b494939, 0x5fd9d943, + 0x31f2f2ef, 0xa8e3e3ab, 0xb95b5b71, 0xbc88881a, + 0x3e9a9a52, 0x0b262698, 0xbf3232c8, 0x59b0b0fa, + 0xf2e9e983, 0x770f0f3c, 0x33d5d573, 0xf480803a, + 0x27bebec2, 0xebcdcd13, 0x893434d0, 0x3248483d, + 0x54ffffdb, 0x8d7a7af5, 0x6490907a, 0x9d5f5f61, + 0x3d202080, 0x0f6868bd, 0xca1a1a68, 0xb7aeae82, + 0x7db4b4ea, 0xce54544d, 0x7f939376, 0x2f222288, + 0x6364648d, 0x2af1f1e3, 0xcc7373d1, 0x82121248, + 0x7a40401d, 0x48080820, 0x95c3c32b, 0xdfecec97, + 0x4ddbdb4b, 0xc0a1a1be, 0x918d8d0e, 0xc83d3df4, + 0x5b979766, 0x00000000, 0xf9cfcf1b, 0x6e2b2bac, + 0xe17676c5, 0xe6828232, 0x28d6d67f, 0xc31b1b6c, + 0x74b5b5ee, 0xbeafaf86, 0x1d6a6ab5, 0xea50505d, + 0x57454509, 0x38f3f3eb, 0xad3030c0, 0xc4efef9b, + 0xda3f3ffc, 0xc7555549, 0xdba2a2b2, 0xe9eaea8f, + 0x6a656589, 0x03babad2, 0x4a2f2fbc, 0x8ec0c027, + 0x60dede5f, 0xfc1c1c70, 0x46fdfdd3, 0x1f4d4d29, + 0x76929272, 0xfa7575c9, 0x36060618, 0xae8a8a12, + 0x4bb2b2f2, 0x85e6e6bf, 0x7e0e0e38, 0xe71f1f7c, + 0x55626295, 0x3ad4d477, 0x81a8a89a, 0x52969662, + 0x62f9f9c3, 0xa3c5c533, 0x10252594, 0xab595979, + 0xd084842a, 0xc57272d5, 0xec3939e4, 0x164c4c2d, + 0x945e5e65, 0x9f7878fd, 0xe53838e0, 0x988c8c0a, + 0x17d1d163, 0xe4a5a5ae, 0xa1e2e2af, 0x4e616199, + 0x42b3b3f6, 0x34212184, 0x089c9c4a, 0xee1e1e78, + 0x61434311, 0xb1c7c73b, 0x4ffcfcd7, 0x24040410, + 0xe3515159, 0x2599995e, 0x226d6da9, 0x650d0d34, + 0x79fafacf, 0x69dfdf5b, 0xa97e7ee5, 0x19242490, + 0xfe3b3bec, 0x9aabab96, 0xf0cece1f, 0x99111144, + 0x838f8f06, 0x044e4e25, 0x66b7b7e6, 0xe0ebeb8b, + 0xc13c3cf0, 0xfd81813e, 0x4094946a, 0x1cf7f7fb, + 0x18b9b9de, 0x8b13134c, 0x512c2cb0, 0x05d3d36b, + 0x8ce7e7bb, 0x396e6ea5, 0xaac4c437, 0x1b03030c, + 0xdc565645, 0x5e44440d, 0xa07f7fe1, 0x88a9a99e, + 0x672a2aa8, 0x0abbbbd6, 0x87c1c123, 0xf1535351, + 0x72dcdc57, 0x530b0b2c, 0x019d9d4e, 0x2b6c6cad, + 0xa43131c4, 0xf37474cd, 0x15f6f6ff, 0x4c464605, + 0xa5acac8a, 0xb589891e, 0xb4141450, 0xbae1e1a3, + 0xa6161658, 0xf73a3ae8, 0x066969b9, 0x41090924, + 0xd77070dd, 0x6fb6b6e2, 0x1ed0d067, 0xd6eded93, + 0xe2cccc17, 0x68424215, 0x2c98985a, 0xeda4a4aa, + 0x752828a0, 0x865c5c6d, 0x6bf8f8c7, 0xc2868622, + }, + { + 0x30d81818, 0x46262323, 0x91b8c6c6, 0xcdfbe8e8, + 0x13cb8787, 0x6d11b8b8, 0x02090101, 0x9e0d4f4f, + 0x6c9b3636, 0x51ffa6a6, 0xb90cd2d2, 0xf70ef5f5, + 0xf2967979, 0xde306f6f, 0x3f6d9191, 0xa4f85252, + 0xc0476060, 0x6535bcbc, 0x2b379b9b, 0x018a8e8e, + 0x5bd2a3a3, 0x186c0c0c, 0xf6847b7b, 0x6a803535, + 0x3af51d1d, 0xddb3e0e0, 0xb321d7d7, 0x999cc2c2, + 0x5c432e2e, 0x96294b4b, 0xe15dfefe, 0xaed55757, + 0x2abd1515, 0xeee87777, 0x6e923737, 0xd79ee5e5, + 0x23139f9f, 0xfd23f0f0, 0x94204a4a, 0xa944dada, + 0xb0a25858, 0x8fcfc9c9, 0x527c2929, 0x145a0a0a, + 0x7f50b1b1, 0x5dc9a0a0, 0xd6146b6b, 0x17d98585, + 0x673cbdbd, 0xba8f5d5d, 0x20901010, 0xf507f4f4, + 0x8bddcbcb, 0x7cd33e3e, 0x0a2d0505, 0xce786767, + 0xd597e4e4, 0x4e022727, 0x82734141, 0x0ba78b8b, + 0x53f6a7a7, 0xfab27d7d, 0x37499595, 0xad56d8d8, + 0xeb70fbfb, 0xc1cdeeee, 0xf8bb7c7c, 0xcc716666, + 0xa77bdddd, 0x2eaf1717, 0x8e454747, 0x211a9e9e, + 0x89d4caca, 0x5a582d2d, 0x632ebfbf, 0x0e3f0707, + 0x47acadad, 0xb4b05a5a, 0x1bef8383, 0x66b63333, + 0xc65c6363, 0x04120202, 0x4993aaaa, 0xe2de7171, + 0x8dc6c8c8, 0x32d11919, 0x923b4949, 0xaf5fd9d9, + 0xf931f2f2, 0xdba8e3e3, 0xb6b95b5b, 0x0dbc8888, + 0x293e9a9a, 0x4c0b2626, 0x64bf3232, 0x7d59b0b0, + 0xcff2e9e9, 0x1e770f0f, 0xb733d5d5, 0x1df48080, + 0x6127bebe, 0x87ebcdcd, 0x68893434, 0x90324848, + 0xe354ffff, 0xf48d7a7a, 0x3d649090, 0xbe9d5f5f, + 0x403d2020, 0xd00f6868, 0x34ca1a1a, 0x41b7aeae, + 0x757db4b4, 0xa8ce5454, 0x3b7f9393, 0x442f2222, + 0xc8636464, 0xff2af1f1, 0xe6cc7373, 0x24821212, + 0x807a4040, 0x10480808, 0x9b95c3c3, 0xc5dfecec, + 0xab4ddbdb, 0x5fc0a1a1, 0x07918d8d, 0x7ac83d3d, + 0x335b9797, 0x00000000, 0x83f9cfcf, 0x566e2b2b, + 0xece17676, 0x19e68282, 0xb128d6d6, 0x36c31b1b, + 0x7774b5b5, 0x43beafaf, 0xd41d6a6a, 0xa0ea5050, + 0x8a574545, 0xfb38f3f3, 0x60ad3030, 0xc3c4efef, + 0x7eda3f3f, 0xaac75555, 0x59dba2a2, 0xc9e9eaea, + 0xca6a6565, 0x6903baba, 0x5e4a2f2f, 0x9d8ec0c0, + 0xa160dede, 0x38fc1c1c, 0xe746fdfd, 0x9a1f4d4d, + 0x39769292, 0xeafa7575, 0x0c360606, 0x09ae8a8a, + 0x794bb2b2, 0xd185e6e6, 0x1c7e0e0e, 0x3ee71f1f, + 0xc4556262, 0xb53ad4d4, 0x4d81a8a8, 0x31529696, + 0xef62f9f9, 0x97a3c5c5, 0x4a102525, 0xb2ab5959, + 0x15d08484, 0xe4c57272, 0x72ec3939, 0x98164c4c, + 0xbc945e5e, 0xf09f7878, 0x70e53838, 0x05988c8c, + 0xbf17d1d1, 0x57e4a5a5, 0xd9a1e2e2, 0xc24e6161, + 0x7b42b3b3, 0x42342121, 0x25089c9c, 0x3cee1e1e, + 0x86614343, 0x93b1c7c7, 0xe54ffcfc, 0x08240404, + 0xa2e35151, 0x2f259999, 0xda226d6d, 0x1a650d0d, + 0xe979fafa, 0xa369dfdf, 0xfca97e7e, 0x48192424, + 0x76fe3b3b, 0x4b9aabab, 0x81f0cece, 0x22991111, + 0x03838f8f, 0x9c044e4e, 0x7366b7b7, 0xcbe0ebeb, + 0x78c13c3c, 0x1ffd8181, 0x35409494, 0xf31cf7f7, + 0x6f18b9b9, 0x268b1313, 0x58512c2c, 0xbb05d3d3, + 0xd38ce7e7, 0xdc396e6e, 0x95aac4c4, 0x061b0303, + 0xacdc5656, 0x885e4444, 0xfea07f7f, 0x4f88a9a9, + 0x54672a2a, 0x6b0abbbb, 0x9f87c1c1, 0xa6f15353, + 0xa572dcdc, 0x16530b0b, 0x27019d9d, 0xd82b6c6c, + 0x62a43131, 0xe8f37474, 0xf115f6f6, 0x8c4c4646, + 0x45a5acac, 0x0fb58989, 0x28b41414, 0xdfbae1e1, + 0x2ca61616, 0x74f73a3a, 0xd2066969, 0x12410909, + 0xe0d77070, 0x716fb6b6, 0xbd1ed0d0, 0xc7d6eded, + 0x85e2cccc, 0x84684242, 0x2d2c9898, 0x55eda4a4, + 0x50752828, 0xb8865c5c, 0xed6bf8f8, 0x11c28686, + }, + { + 0x7830d818, 0xaf462623, 0xf991b8c6, 0x6fcdfbe8, + 0xa113cb87, 0x626d11b8, 0x05020901, 0x6e9e0d4f, + 0xee6c9b36, 0x0451ffa6, 0xbdb90cd2, 0x06f70ef5, + 0x80f29679, 0xcede306f, 0xef3f6d91, 0x07a4f852, + 0xfdc04760, 0x766535bc, 0xcd2b379b, 0x8c018a8e, + 0x155bd2a3, 0x3c186c0c, 0x8af6847b, 0xe16a8035, + 0x693af51d, 0x47ddb3e0, 0xacb321d7, 0xed999cc2, + 0x965c432e, 0x7a96294b, 0x21e15dfe, 0x16aed557, + 0x412abd15, 0xb6eee877, 0xeb6e9237, 0x56d79ee5, + 0xd923139f, 0x17fd23f0, 0x7f94204a, 0x95a944da, + 0x25b0a258, 0xca8fcfc9, 0x8d527c29, 0x22145a0a, + 0x4f7f50b1, 0x1a5dc9a0, 0xdad6146b, 0xab17d985, + 0x73673cbd, 0x34ba8f5d, 0x50209010, 0x03f507f4, + 0xc08bddcb, 0xc67cd33e, 0x110a2d05, 0xe6ce7867, + 0x53d597e4, 0xbb4e0227, 0x58827341, 0x9d0ba78b, + 0x0153f6a7, 0x94fab27d, 0xfb374995, 0x9fad56d8, + 0x30eb70fb, 0x71c1cdee, 0x91f8bb7c, 0xe3cc7166, + 0x8ea77bdd, 0x4b2eaf17, 0x468e4547, 0xdc211a9e, + 0xc589d4ca, 0x995a582d, 0x79632ebf, 0x1b0e3f07, + 0x2347acad, 0x2fb4b05a, 0xb51bef83, 0xff66b633, + 0xf2c65c63, 0x0a041202, 0x384993aa, 0xa8e2de71, + 0xcf8dc6c8, 0x7d32d119, 0x70923b49, 0x9aaf5fd9, + 0x1df931f2, 0x48dba8e3, 0x2ab6b95b, 0x920dbc88, + 0xc8293e9a, 0xbe4c0b26, 0xfa64bf32, 0x4a7d59b0, + 0x6acff2e9, 0x331e770f, 0xa6b733d5, 0xba1df480, + 0x7c6127be, 0xde87ebcd, 0xe4688934, 0x75903248, + 0x24e354ff, 0x8ff48d7a, 0xea3d6490, 0x3ebe9d5f, + 0xa0403d20, 0xd5d00f68, 0x7234ca1a, 0x2c41b7ae, + 0x5e757db4, 0x19a8ce54, 0xe53b7f93, 0xaa442f22, + 0xe9c86364, 0x12ff2af1, 0xa2e6cc73, 0x5a248212, + 0x5d807a40, 0x28104808, 0xe89b95c3, 0x7bc5dfec, + 0x90ab4ddb, 0x1f5fc0a1, 0x8307918d, 0xc97ac83d, + 0xf1335b97, 0x00000000, 0xd483f9cf, 0x87566e2b, + 0xb3ece176, 0xb019e682, 0xa9b128d6, 0x7736c31b, + 0x5b7774b5, 0x2943beaf, 0xdfd41d6a, 0x0da0ea50, + 0x4c8a5745, 0x18fb38f3, 0xf060ad30, 0x74c3c4ef, + 0xc37eda3f, 0x1caac755, 0x1059dba2, 0x65c9e9ea, + 0xecca6a65, 0x686903ba, 0x935e4a2f, 0xe79d8ec0, + 0x81a160de, 0x6c38fc1c, 0x2ee746fd, 0x649a1f4d, + 0xe0397692, 0xbceafa75, 0x1e0c3606, 0x9809ae8a, + 0x40794bb2, 0x59d185e6, 0x361c7e0e, 0x633ee71f, + 0xf7c45562, 0xa3b53ad4, 0x324d81a8, 0xf4315296, + 0x3aef62f9, 0xf697a3c5, 0xb14a1025, 0x20b2ab59, + 0xae15d084, 0xa7e4c572, 0xdd72ec39, 0x6198164c, + 0x3bbc945e, 0x85f09f78, 0xd870e538, 0x8605988c, + 0xb2bf17d1, 0x0b57e4a5, 0x4dd9a1e2, 0xf8c24e61, + 0x457b42b3, 0xa5423421, 0xd625089c, 0x663cee1e, + 0x52866143, 0xfc93b1c7, 0x2be54ffc, 0x14082404, + 0x08a2e351, 0xc72f2599, 0xc4da226d, 0x391a650d, + 0x35e979fa, 0x84a369df, 0x9bfca97e, 0xb4481924, + 0xd776fe3b, 0x3d4b9aab, 0xd181f0ce, 0x55229911, + 0x8903838f, 0x6b9c044e, 0x517366b7, 0x60cbe0eb, + 0xcc78c13c, 0xbf1ffd81, 0xfe354094, 0x0cf31cf7, + 0x676f18b9, 0x5f268b13, 0x9c58512c, 0xb8bb05d3, + 0x5cd38ce7, 0xcbdc396e, 0xf395aac4, 0x0f061b03, + 0x13acdc56, 0x49885e44, 0x9efea07f, 0x374f88a9, + 0x8254672a, 0x6d6b0abb, 0xe29f87c1, 0x02a6f153, + 0x8ba572dc, 0x2716530b, 0xd327019d, 0xc1d82b6c, + 0xf562a431, 0xb9e8f374, 0x09f115f6, 0x438c4c46, + 0x2645a5ac, 0x970fb589, 0x4428b414, 0x42dfbae1, + 0x4e2ca616, 0xd274f73a, 0xd0d20669, 0x2d124109, + 0xade0d770, 0x54716fb6, 0xb7bd1ed0, 0x7ec7d6ed, + 0xdb85e2cc, 0x57846842, 0xc22d2c98, 0x0e55eda4, + 0x88507528, 0x31b8865c, 0x3fed6bf8, 0xa411c286, + }, + { + 0xc07830d8, 0x05af4626, 0x7ef991b8, 0x136fcdfb, + 0x4ca113cb, 0xa9626d11, 0x08050209, 0x426e9e0d, + 0xadee6c9b, 0x590451ff, 0xdebdb90c, 0xfb06f70e, + 0xef80f296, 0x5fcede30, 0xfcef3f6d, 0xaa07a4f8, + 0x27fdc047, 0x89766535, 0xaccd2b37, 0x048c018a, + 0x71155bd2, 0x603c186c, 0xff8af684, 0xb5e16a80, + 0xe8693af5, 0x5347ddb3, 0xf6acb321, 0x5eed999c, + 0x6d965c43, 0x627a9629, 0xa321e15d, 0x8216aed5, + 0xa8412abd, 0x9fb6eee8, 0xa5eb6e92, 0x7b56d79e, + 0x8cd92313, 0xd317fd23, 0x6a7f9420, 0x9e95a944, + 0xfa25b0a2, 0x06ca8fcf, 0x558d527c, 0x5022145a, + 0xe14f7f50, 0x691a5dc9, 0x7fdad614, 0x5cab17d9, + 0x8173673c, 0xd234ba8f, 0x80502090, 0xf303f507, + 0x16c08bdd, 0xedc67cd3, 0x28110a2d, 0x1fe6ce78, + 0x7353d597, 0x25bb4e02, 0x32588273, 0x2c9d0ba7, + 0x510153f6, 0xcf94fab2, 0xdcfb3749, 0x8e9fad56, + 0x8b30eb70, 0x2371c1cd, 0xc791f8bb, 0x17e3cc71, + 0xa68ea77b, 0xb84b2eaf, 0x02468e45, 0x84dc211a, + 0x1ec589d4, 0x75995a58, 0x9179632e, 0x381b0e3f, + 0x012347ac, 0xea2fb4b0, 0x6cb51bef, 0x85ff66b6, + 0x3ff2c65c, 0x100a0412, 0x39384993, 0xafa8e2de, + 0x0ecf8dc6, 0xc87d32d1, 0x7270923b, 0x869aaf5f, + 0xc31df931, 0x4b48dba8, 0xe22ab6b9, 0x34920dbc, + 0xa4c8293e, 0x2dbe4c0b, 0x8dfa64bf, 0xe94a7d59, + 0x1b6acff2, 0x78331e77, 0xe6a6b733, 0x74ba1df4, + 0x997c6127, 0x26de87eb, 0xbde46889, 0x7a759032, + 0xab24e354, 0xf78ff48d, 0xf4ea3d64, 0xc23ebe9d, + 0x1da0403d, 0x67d5d00f, 0xd07234ca, 0x192c41b7, + 0xc95e757d, 0x9a19a8ce, 0xece53b7f, 0x0daa442f, + 0x07e9c863, 0xdb12ff2a, 0xbfa2e6cc, 0x905a2482, + 0x3a5d807a, 0x40281048, 0x56e89b95, 0x337bc5df, + 0x9690ab4d, 0x611f5fc0, 0x1c830791, 0xf5c97ac8, + 0xccf1335b, 0x00000000, 0x36d483f9, 0x4587566e, + 0x97b3ece1, 0x64b019e6, 0xfea9b128, 0xd87736c3, + 0xc15b7774, 0x112943be, 0x77dfd41d, 0xba0da0ea, + 0x124c8a57, 0xcb18fb38, 0x9df060ad, 0x2b74c3c4, + 0xe5c37eda, 0x921caac7, 0x791059db, 0x0365c9e9, + 0x0fecca6a, 0xb9686903, 0x65935e4a, 0x4ee79d8e, + 0xbe81a160, 0xe06c38fc, 0xbb2ee746, 0x52649a1f, + 0xe4e03976, 0x8fbceafa, 0x301e0c36, 0x249809ae, + 0xf940794b, 0x6359d185, 0x70361c7e, 0xf8633ee7, + 0x37f7c455, 0xeea3b53a, 0x29324d81, 0xc4f43152, + 0x9b3aef62, 0x66f697a3, 0x35b14a10, 0xf220b2ab, + 0x54ae15d0, 0xb7a7e4c5, 0xd5dd72ec, 0x5a619816, + 0xca3bbc94, 0xe785f09f, 0xddd870e5, 0x14860598, + 0xc6b2bf17, 0x410b57e4, 0x434dd9a1, 0x2ff8c24e, + 0xf1457b42, 0x15a54234, 0x94d62508, 0xf0663cee, + 0x22528661, 0x76fc93b1, 0xb32be54f, 0x20140824, + 0xb208a2e3, 0xbcc72f25, 0x4fc4da22, 0x68391a65, + 0x8335e979, 0xb684a369, 0xd79bfca9, 0x3db44819, + 0xc5d776fe, 0x313d4b9a, 0x3ed181f0, 0x88552299, + 0x0c890383, 0x4a6b9c04, 0xd1517366, 0x0b60cbe0, + 0xfdcc78c1, 0x7cbf1ffd, 0xd4fe3540, 0xeb0cf31c, + 0xa1676f18, 0x985f268b, 0x7d9c5851, 0xd6b8bb05, + 0x6b5cd38c, 0x57cbdc39, 0x6ef395aa, 0x180f061b, + 0x8a13acdc, 0x1a49885e, 0xdf9efea0, 0x21374f88, + 0x4d825467, 0xb16d6b0a, 0x46e29f87, 0xa202a6f1, + 0xae8ba572, 0x58271653, 0x9cd32701, 0x47c1d82b, + 0x95f562a4, 0x87b9e8f3, 0xe309f115, 0x0a438c4c, + 0x092645a5, 0x3c970fb5, 0xa04428b4, 0x5b42dfba, + 0xb04e2ca6, 0xcdd274f7, 0x6fd0d206, 0x482d1241, + 0xa7ade0d7, 0xd954716f, 0xceb7bd1e, 0x3b7ec7d6, + 0x2edb85e2, 0x2a578468, 0xb4c22d2c, 0x490e55ed, + 0x5d885075, 0xda31b886, 0x933fed6b, 0x44a411c2, + }, + { + 0x18c07830, 0x2305af46, 0xc67ef991, 0xe8136fcd, + 0x874ca113, 0xb8a9626d, 0x01080502, 0x4f426e9e, + 0x36adee6c, 0xa6590451, 0xd2debdb9, 0xf5fb06f7, + 0x79ef80f2, 0x6f5fcede, 0x91fcef3f, 0x52aa07a4, + 0x6027fdc0, 0xbc897665, 0x9baccd2b, 0x8e048c01, + 0xa371155b, 0x0c603c18, 0x7bff8af6, 0x35b5e16a, + 0x1de8693a, 0xe05347dd, 0xd7f6acb3, 0xc25eed99, + 0x2e6d965c, 0x4b627a96, 0xfea321e1, 0x578216ae, + 0x15a8412a, 0x779fb6ee, 0x37a5eb6e, 0xe57b56d7, + 0x9f8cd923, 0xf0d317fd, 0x4a6a7f94, 0xda9e95a9, + 0x58fa25b0, 0xc906ca8f, 0x29558d52, 0x0a502214, + 0xb1e14f7f, 0xa0691a5d, 0x6b7fdad6, 0x855cab17, + 0xbd817367, 0x5dd234ba, 0x10805020, 0xf4f303f5, + 0xcb16c08b, 0x3eedc67c, 0x0528110a, 0x671fe6ce, + 0xe47353d5, 0x2725bb4e, 0x41325882, 0x8b2c9d0b, + 0xa7510153, 0x7dcf94fa, 0x95dcfb37, 0xd88e9fad, + 0xfb8b30eb, 0xee2371c1, 0x7cc791f8, 0x6617e3cc, + 0xdda68ea7, 0x17b84b2e, 0x4702468e, 0x9e84dc21, + 0xca1ec589, 0x2d75995a, 0xbf917963, 0x07381b0e, + 0xad012347, 0x5aea2fb4, 0x836cb51b, 0x3385ff66, + 0x633ff2c6, 0x02100a04, 0xaa393849, 0x71afa8e2, + 0xc80ecf8d, 0x19c87d32, 0x49727092, 0xd9869aaf, + 0xf2c31df9, 0xe34b48db, 0x5be22ab6, 0x8834920d, + 0x9aa4c829, 0x262dbe4c, 0x328dfa64, 0xb0e94a7d, + 0xe91b6acf, 0x0f78331e, 0xd5e6a6b7, 0x8074ba1d, + 0xbe997c61, 0xcd26de87, 0x34bde468, 0x487a7590, + 0xffab24e3, 0x7af78ff4, 0x90f4ea3d, 0x5fc23ebe, + 0x201da040, 0x6867d5d0, 0x1ad07234, 0xae192c41, + 0xb4c95e75, 0x549a19a8, 0x93ece53b, 0x220daa44, + 0x6407e9c8, 0xf1db12ff, 0x73bfa2e6, 0x12905a24, + 0x403a5d80, 0x08402810, 0xc356e89b, 0xec337bc5, + 0xdb9690ab, 0xa1611f5f, 0x8d1c8307, 0x3df5c97a, + 0x97ccf133, 0x00000000, 0xcf36d483, 0x2b458756, + 0x7697b3ec, 0x8264b019, 0xd6fea9b1, 0x1bd87736, + 0xb5c15b77, 0xaf112943, 0x6a77dfd4, 0x50ba0da0, + 0x45124c8a, 0xf3cb18fb, 0x309df060, 0xef2b74c3, + 0x3fe5c37e, 0x55921caa, 0xa2791059, 0xea0365c9, + 0x650fecca, 0xbab96869, 0x2f65935e, 0xc04ee79d, + 0xdebe81a1, 0x1ce06c38, 0xfdbb2ee7, 0x4d52649a, + 0x92e4e039, 0x758fbcea, 0x06301e0c, 0x8a249809, + 0xb2f94079, 0xe66359d1, 0x0e70361c, 0x1ff8633e, + 0x6237f7c4, 0xd4eea3b5, 0xa829324d, 0x96c4f431, + 0xf99b3aef, 0xc566f697, 0x2535b14a, 0x59f220b2, + 0x8454ae15, 0x72b7a7e4, 0x39d5dd72, 0x4c5a6198, + 0x5eca3bbc, 0x78e785f0, 0x38ddd870, 0x8c148605, + 0xd1c6b2bf, 0xa5410b57, 0xe2434dd9, 0x612ff8c2, + 0xb3f1457b, 0x2115a542, 0x9c94d625, 0x1ef0663c, + 0x43225286, 0xc776fc93, 0xfcb32be5, 0x04201408, + 0x51b208a2, 0x99bcc72f, 0x6d4fc4da, 0x0d68391a, + 0xfa8335e9, 0xdfb684a3, 0x7ed79bfc, 0x243db448, + 0x3bc5d776, 0xab313d4b, 0xce3ed181, 0x11885522, + 0x8f0c8903, 0x4e4a6b9c, 0xb7d15173, 0xeb0b60cb, + 0x3cfdcc78, 0x817cbf1f, 0x94d4fe35, 0xf7eb0cf3, + 0xb9a1676f, 0x13985f26, 0x2c7d9c58, 0xd3d6b8bb, + 0xe76b5cd3, 0x6e57cbdc, 0xc46ef395, 0x03180f06, + 0x568a13ac, 0x441a4988, 0x7fdf9efe, 0xa921374f, + 0x2a4d8254, 0xbbb16d6b, 0xc146e29f, 0x53a202a6, + 0xdcae8ba5, 0x0b582716, 0x9d9cd327, 0x6c47c1d8, + 0x3195f562, 0x7487b9e8, 0xf6e309f1, 0x460a438c, + 0xac092645, 0x893c970f, 0x14a04428, 0xe15b42df, + 0x16b04e2c, 0x3acdd274, 0x696fd0d2, 0x09482d12, + 0x70a7ade0, 0xb6d95471, 0xd0ceb7bd, 0xed3b7ec7, + 0xcc2edb85, 0x422a5784, 0x98b4c22d, 0xa4490e55, + 0x285d8850, 0x5cda31b8, 0xf8933fed, 0x8644a411, + }, + { + 0x6018c078, 0x8c2305af, 0x3fc67ef9, 0x87e8136f, + 0x26874ca1, 0xdab8a962, 0x04010805, 0x214f426e, + 0xd836adee, 0xa2a65904, 0x6fd2debd, 0xf3f5fb06, + 0xf979ef80, 0xa16f5fce, 0x7e91fcef, 0x5552aa07, + 0x9d6027fd, 0xcabc8976, 0x569baccd, 0x028e048c, + 0xb6a37115, 0x300c603c, 0xf17bff8a, 0xd435b5e1, + 0x741de869, 0xa7e05347, 0x7bd7f6ac, 0x2fc25eed, + 0xb82e6d96, 0x314b627a, 0xdffea321, 0x41578216, + 0x5415a841, 0xc1779fb6, 0xdc37a5eb, 0xb3e57b56, + 0x469f8cd9, 0xe7f0d317, 0x354a6a7f, 0x4fda9e95, + 0x7d58fa25, 0x03c906ca, 0xa429558d, 0x280a5022, + 0xfeb1e14f, 0xbaa0691a, 0xb16b7fda, 0x2e855cab, + 0xcebd8173, 0x695dd234, 0x40108050, 0xf7f4f303, + 0x0bcb16c0, 0xf83eedc6, 0x14052811, 0x81671fe6, + 0xb7e47353, 0x9c2725bb, 0x19413258, 0x168b2c9d, + 0xa6a75101, 0xe97dcf94, 0x6e95dcfb, 0x47d88e9f, + 0xcbfb8b30, 0x9fee2371, 0xed7cc791, 0x856617e3, + 0x53dda68e, 0x5c17b84b, 0x01470246, 0x429e84dc, + 0x0fca1ec5, 0xb42d7599, 0xc6bf9179, 0x1c07381b, + 0x8ead0123, 0x755aea2f, 0x36836cb5, 0xcc3385ff, + 0x91633ff2, 0x0802100a, 0x92aa3938, 0xd971afa8, + 0x07c80ecf, 0x6419c87d, 0x39497270, 0x43d9869a, + 0xeff2c31d, 0xabe34b48, 0x715be22a, 0x1a883492, + 0x529aa4c8, 0x98262dbe, 0xc8328dfa, 0xfab0e94a, + 0x83e91b6a, 0x3c0f7833, 0x73d5e6a6, 0x3a8074ba, + 0xc2be997c, 0x13cd26de, 0xd034bde4, 0x3d487a75, + 0xdbffab24, 0xf57af78f, 0x7a90f4ea, 0x615fc23e, + 0x80201da0, 0xbd6867d5, 0x681ad072, 0x82ae192c, + 0xeab4c95e, 0x4d549a19, 0x7693ece5, 0x88220daa, + 0x8d6407e9, 0xe3f1db12, 0xd173bfa2, 0x4812905a, + 0x1d403a5d, 0x20084028, 0x2bc356e8, 0x97ec337b, + 0x4bdb9690, 0xbea1611f, 0x0e8d1c83, 0xf43df5c9, + 0x6697ccf1, 0x00000000, 0x1bcf36d4, 0xac2b4587, + 0xc57697b3, 0x328264b0, 0x7fd6fea9, 0x6c1bd877, + 0xeeb5c15b, 0x86af1129, 0xb56a77df, 0x5d50ba0d, + 0x0945124c, 0xebf3cb18, 0xc0309df0, 0x9bef2b74, + 0xfc3fe5c3, 0x4955921c, 0xb2a27910, 0x8fea0365, + 0x89650fec, 0xd2bab968, 0xbc2f6593, 0x27c04ee7, + 0x5fdebe81, 0x701ce06c, 0xd3fdbb2e, 0x294d5264, + 0x7292e4e0, 0xc9758fbc, 0x1806301e, 0x128a2498, + 0xf2b2f940, 0xbfe66359, 0x380e7036, 0x7c1ff863, + 0x956237f7, 0x77d4eea3, 0x9aa82932, 0x6296c4f4, + 0xc3f99b3a, 0x33c566f6, 0x942535b1, 0x7959f220, + 0x2a8454ae, 0xd572b7a7, 0xe439d5dd, 0x2d4c5a61, + 0x655eca3b, 0xfd78e785, 0xe038ddd8, 0x0a8c1486, + 0x63d1c6b2, 0xaea5410b, 0xafe2434d, 0x99612ff8, + 0xf6b3f145, 0x842115a5, 0x4a9c94d6, 0x781ef066, + 0x11432252, 0x3bc776fc, 0xd7fcb32b, 0x10042014, + 0x5951b208, 0x5e99bcc7, 0xa96d4fc4, 0x340d6839, + 0xcffa8335, 0x5bdfb684, 0xe57ed79b, 0x90243db4, + 0xec3bc5d7, 0x96ab313d, 0x1fce3ed1, 0x44118855, + 0x068f0c89, 0x254e4a6b, 0xe6b7d151, 0x8beb0b60, + 0xf03cfdcc, 0x3e817cbf, 0x6a94d4fe, 0xfbf7eb0c, + 0xdeb9a167, 0x4c13985f, 0xb02c7d9c, 0x6bd3d6b8, + 0xbbe76b5c, 0xa56e57cb, 0x37c46ef3, 0x0c03180f, + 0x45568a13, 0x0d441a49, 0xe17fdf9e, 0x9ea92137, + 0xa82a4d82, 0xd6bbb16d, 0x23c146e2, 0x5153a202, + 0x57dcae8b, 0x2c0b5827, 0x4e9d9cd3, 0xad6c47c1, + 0xc43195f5, 0xcd7487b9, 0xfff6e309, 0x05460a43, + 0x8aac0926, 0x1e893c97, 0x5014a044, 0xa3e15b42, + 0x5816b04e, 0xe83acdd2, 0xb9696fd0, 0x2409482d, + 0xdd70a7ad, 0xe2b6d954, 0x67d0ceb7, 0x93ed3b7e, + 0x17cc2edb, 0x15422a57, 0x5a98b4c2, 0xaaa4490e, + 0xa0285d88, 0x6d5cda31, 0xc7f8933f, 0x228644a4, + }, + { + 0x186018c0, 0x238c2305, 0xc63fc67e, 0xe887e813, + 0x8726874c, 0xb8dab8a9, 0x01040108, 0x4f214f42, + 0x36d836ad, 0xa6a2a659, 0xd26fd2de, 0xf5f3f5fb, + 0x79f979ef, 0x6fa16f5f, 0x917e91fc, 0x525552aa, + 0x609d6027, 0xbccabc89, 0x9b569bac, 0x8e028e04, + 0xa3b6a371, 0x0c300c60, 0x7bf17bff, 0x35d435b5, + 0x1d741de8, 0xe0a7e053, 0xd77bd7f6, 0xc22fc25e, + 0x2eb82e6d, 0x4b314b62, 0xfedffea3, 0x57415782, + 0x155415a8, 0x77c1779f, 0x37dc37a5, 0xe5b3e57b, + 0x9f469f8c, 0xf0e7f0d3, 0x4a354a6a, 0xda4fda9e, + 0x587d58fa, 0xc903c906, 0x29a42955, 0x0a280a50, + 0xb1feb1e1, 0xa0baa069, 0x6bb16b7f, 0x852e855c, + 0xbdcebd81, 0x5d695dd2, 0x10401080, 0xf4f7f4f3, + 0xcb0bcb16, 0x3ef83eed, 0x05140528, 0x6781671f, + 0xe4b7e473, 0x279c2725, 0x41194132, 0x8b168b2c, + 0xa7a6a751, 0x7de97dcf, 0x956e95dc, 0xd847d88e, + 0xfbcbfb8b, 0xee9fee23, 0x7ced7cc7, 0x66856617, + 0xdd53dda6, 0x175c17b8, 0x47014702, 0x9e429e84, + 0xca0fca1e, 0x2db42d75, 0xbfc6bf91, 0x071c0738, + 0xad8ead01, 0x5a755aea, 0x8336836c, 0x33cc3385, + 0x6391633f, 0x02080210, 0xaa92aa39, 0x71d971af, + 0xc807c80e, 0x196419c8, 0x49394972, 0xd943d986, + 0xf2eff2c3, 0xe3abe34b, 0x5b715be2, 0x881a8834, + 0x9a529aa4, 0x2698262d, 0x32c8328d, 0xb0fab0e9, + 0xe983e91b, 0x0f3c0f78, 0xd573d5e6, 0x803a8074, + 0xbec2be99, 0xcd13cd26, 0x34d034bd, 0x483d487a, + 0xffdbffab, 0x7af57af7, 0x907a90f4, 0x5f615fc2, + 0x2080201d, 0x68bd6867, 0x1a681ad0, 0xae82ae19, + 0xb4eab4c9, 0x544d549a, 0x937693ec, 0x2288220d, + 0x648d6407, 0xf1e3f1db, 0x73d173bf, 0x12481290, + 0x401d403a, 0x08200840, 0xc32bc356, 0xec97ec33, + 0xdb4bdb96, 0xa1bea161, 0x8d0e8d1c, 0x3df43df5, + 0x976697cc, 0x00000000, 0xcf1bcf36, 0x2bac2b45, + 0x76c57697, 0x82328264, 0xd67fd6fe, 0x1b6c1bd8, + 0xb5eeb5c1, 0xaf86af11, 0x6ab56a77, 0x505d50ba, + 0x45094512, 0xf3ebf3cb, 0x30c0309d, 0xef9bef2b, + 0x3ffc3fe5, 0x55495592, 0xa2b2a279, 0xea8fea03, + 0x6589650f, 0xbad2bab9, 0x2fbc2f65, 0xc027c04e, + 0xde5fdebe, 0x1c701ce0, 0xfdd3fdbb, 0x4d294d52, + 0x927292e4, 0x75c9758f, 0x06180630, 0x8a128a24, + 0xb2f2b2f9, 0xe6bfe663, 0x0e380e70, 0x1f7c1ff8, + 0x62956237, 0xd477d4ee, 0xa89aa829, 0x966296c4, + 0xf9c3f99b, 0xc533c566, 0x25942535, 0x597959f2, + 0x842a8454, 0x72d572b7, 0x39e439d5, 0x4c2d4c5a, + 0x5e655eca, 0x78fd78e7, 0x38e038dd, 0x8c0a8c14, + 0xd163d1c6, 0xa5aea541, 0xe2afe243, 0x6199612f, + 0xb3f6b3f1, 0x21842115, 0x9c4a9c94, 0x1e781ef0, + 0x43114322, 0xc73bc776, 0xfcd7fcb3, 0x04100420, + 0x515951b2, 0x995e99bc, 0x6da96d4f, 0x0d340d68, + 0xfacffa83, 0xdf5bdfb6, 0x7ee57ed7, 0x2490243d, + 0x3bec3bc5, 0xab96ab31, 0xce1fce3e, 0x11441188, + 0x8f068f0c, 0x4e254e4a, 0xb7e6b7d1, 0xeb8beb0b, + 0x3cf03cfd, 0x813e817c, 0x946a94d4, 0xf7fbf7eb, + 0xb9deb9a1, 0x134c1398, 0x2cb02c7d, 0xd36bd3d6, + 0xe7bbe76b, 0x6ea56e57, 0xc437c46e, 0x030c0318, + 0x5645568a, 0x440d441a, 0x7fe17fdf, 0xa99ea921, + 0x2aa82a4d, 0xbbd6bbb1, 0xc123c146, 0x535153a2, + 0xdc57dcae, 0x0b2c0b58, 0x9d4e9d9c, 0x6cad6c47, + 0x31c43195, 0x74cd7487, 0xf6fff6e3, 0x4605460a, + 0xac8aac09, 0x891e893c, 0x145014a0, 0xe1a3e15b, + 0x165816b0, 0x3ae83acd, 0x69b9696f, 0x09240948, + 0x70dd70a7, 0xb6e2b6d9, 0xd067d0ce, 0xed93ed3b, + 0xcc17cc2e, 0x4215422a, 0x985a98b4, 0xa4aaa449, + 0x28a0285d, 0x5c6d5cda, 0xf8c7f893, 0x86228644, + } +}; + +__device__ static u32 Cl[8][256] = +{ + { + 0xc07830d8, 0x05af4626, 0x7ef991b8, 0x136fcdfb, + 0x4ca113cb, 0xa9626d11, 0x08050209, 0x426e9e0d, + 0xadee6c9b, 0x590451ff, 0xdebdb90c, 0xfb06f70e, + 0xef80f296, 0x5fcede30, 0xfcef3f6d, 0xaa07a4f8, + 0x27fdc047, 0x89766535, 0xaccd2b37, 0x048c018a, + 0x71155bd2, 0x603c186c, 0xff8af684, 0xb5e16a80, + 0xe8693af5, 0x5347ddb3, 0xf6acb321, 0x5eed999c, + 0x6d965c43, 0x627a9629, 0xa321e15d, 0x8216aed5, + 0xa8412abd, 0x9fb6eee8, 0xa5eb6e92, 0x7b56d79e, + 0x8cd92313, 0xd317fd23, 0x6a7f9420, 0x9e95a944, + 0xfa25b0a2, 0x06ca8fcf, 0x558d527c, 0x5022145a, + 0xe14f7f50, 0x691a5dc9, 0x7fdad614, 0x5cab17d9, + 0x8173673c, 0xd234ba8f, 0x80502090, 0xf303f507, + 0x16c08bdd, 0xedc67cd3, 0x28110a2d, 0x1fe6ce78, + 0x7353d597, 0x25bb4e02, 0x32588273, 0x2c9d0ba7, + 0x510153f6, 0xcf94fab2, 0xdcfb3749, 0x8e9fad56, + 0x8b30eb70, 0x2371c1cd, 0xc791f8bb, 0x17e3cc71, + 0xa68ea77b, 0xb84b2eaf, 0x02468e45, 0x84dc211a, + 0x1ec589d4, 0x75995a58, 0x9179632e, 0x381b0e3f, + 0x012347ac, 0xea2fb4b0, 0x6cb51bef, 0x85ff66b6, + 0x3ff2c65c, 0x100a0412, 0x39384993, 0xafa8e2de, + 0x0ecf8dc6, 0xc87d32d1, 0x7270923b, 0x869aaf5f, + 0xc31df931, 0x4b48dba8, 0xe22ab6b9, 0x34920dbc, + 0xa4c8293e, 0x2dbe4c0b, 0x8dfa64bf, 0xe94a7d59, + 0x1b6acff2, 0x78331e77, 0xe6a6b733, 0x74ba1df4, + 0x997c6127, 0x26de87eb, 0xbde46889, 0x7a759032, + 0xab24e354, 0xf78ff48d, 0xf4ea3d64, 0xc23ebe9d, + 0x1da0403d, 0x67d5d00f, 0xd07234ca, 0x192c41b7, + 0xc95e757d, 0x9a19a8ce, 0xece53b7f, 0x0daa442f, + 0x07e9c863, 0xdb12ff2a, 0xbfa2e6cc, 0x905a2482, + 0x3a5d807a, 0x40281048, 0x56e89b95, 0x337bc5df, + 0x9690ab4d, 0x611f5fc0, 0x1c830791, 0xf5c97ac8, + 0xccf1335b, 0x00000000, 0x36d483f9, 0x4587566e, + 0x97b3ece1, 0x64b019e6, 0xfea9b128, 0xd87736c3, + 0xc15b7774, 0x112943be, 0x77dfd41d, 0xba0da0ea, + 0x124c8a57, 0xcb18fb38, 0x9df060ad, 0x2b74c3c4, + 0xe5c37eda, 0x921caac7, 0x791059db, 0x0365c9e9, + 0x0fecca6a, 0xb9686903, 0x65935e4a, 0x4ee79d8e, + 0xbe81a160, 0xe06c38fc, 0xbb2ee746, 0x52649a1f, + 0xe4e03976, 0x8fbceafa, 0x301e0c36, 0x249809ae, + 0xf940794b, 0x6359d185, 0x70361c7e, 0xf8633ee7, + 0x37f7c455, 0xeea3b53a, 0x29324d81, 0xc4f43152, + 0x9b3aef62, 0x66f697a3, 0x35b14a10, 0xf220b2ab, + 0x54ae15d0, 0xb7a7e4c5, 0xd5dd72ec, 0x5a619816, + 0xca3bbc94, 0xe785f09f, 0xddd870e5, 0x14860598, + 0xc6b2bf17, 0x410b57e4, 0x434dd9a1, 0x2ff8c24e, + 0xf1457b42, 0x15a54234, 0x94d62508, 0xf0663cee, + 0x22528661, 0x76fc93b1, 0xb32be54f, 0x20140824, + 0xb208a2e3, 0xbcc72f25, 0x4fc4da22, 0x68391a65, + 0x8335e979, 0xb684a369, 0xd79bfca9, 0x3db44819, + 0xc5d776fe, 0x313d4b9a, 0x3ed181f0, 0x88552299, + 0x0c890383, 0x4a6b9c04, 0xd1517366, 0x0b60cbe0, + 0xfdcc78c1, 0x7cbf1ffd, 0xd4fe3540, 0xeb0cf31c, + 0xa1676f18, 0x985f268b, 0x7d9c5851, 0xd6b8bb05, + 0x6b5cd38c, 0x57cbdc39, 0x6ef395aa, 0x180f061b, + 0x8a13acdc, 0x1a49885e, 0xdf9efea0, 0x21374f88, + 0x4d825467, 0xb16d6b0a, 0x46e29f87, 0xa202a6f1, + 0xae8ba572, 0x58271653, 0x9cd32701, 0x47c1d82b, + 0x95f562a4, 0x87b9e8f3, 0xe309f115, 0x0a438c4c, + 0x092645a5, 0x3c970fb5, 0xa04428b4, 0x5b42dfba, + 0xb04e2ca6, 0xcdd274f7, 0x6fd0d206, 0x482d1241, + 0xa7ade0d7, 0xd954716f, 0xceb7bd1e, 0x3b7ec7d6, + 0x2edb85e2, 0x2a578468, 0xb4c22d2c, 0x490e55ed, + 0x5d885075, 0xda31b886, 0x933fed6b, 0x44a411c2, + }, + { + 0x18c07830, 0x2305af46, 0xc67ef991, 0xe8136fcd, + 0x874ca113, 0xb8a9626d, 0x01080502, 0x4f426e9e, + 0x36adee6c, 0xa6590451, 0xd2debdb9, 0xf5fb06f7, + 0x79ef80f2, 0x6f5fcede, 0x91fcef3f, 0x52aa07a4, + 0x6027fdc0, 0xbc897665, 0x9baccd2b, 0x8e048c01, + 0xa371155b, 0x0c603c18, 0x7bff8af6, 0x35b5e16a, + 0x1de8693a, 0xe05347dd, 0xd7f6acb3, 0xc25eed99, + 0x2e6d965c, 0x4b627a96, 0xfea321e1, 0x578216ae, + 0x15a8412a, 0x779fb6ee, 0x37a5eb6e, 0xe57b56d7, + 0x9f8cd923, 0xf0d317fd, 0x4a6a7f94, 0xda9e95a9, + 0x58fa25b0, 0xc906ca8f, 0x29558d52, 0x0a502214, + 0xb1e14f7f, 0xa0691a5d, 0x6b7fdad6, 0x855cab17, + 0xbd817367, 0x5dd234ba, 0x10805020, 0xf4f303f5, + 0xcb16c08b, 0x3eedc67c, 0x0528110a, 0x671fe6ce, + 0xe47353d5, 0x2725bb4e, 0x41325882, 0x8b2c9d0b, + 0xa7510153, 0x7dcf94fa, 0x95dcfb37, 0xd88e9fad, + 0xfb8b30eb, 0xee2371c1, 0x7cc791f8, 0x6617e3cc, + 0xdda68ea7, 0x17b84b2e, 0x4702468e, 0x9e84dc21, + 0xca1ec589, 0x2d75995a, 0xbf917963, 0x07381b0e, + 0xad012347, 0x5aea2fb4, 0x836cb51b, 0x3385ff66, + 0x633ff2c6, 0x02100a04, 0xaa393849, 0x71afa8e2, + 0xc80ecf8d, 0x19c87d32, 0x49727092, 0xd9869aaf, + 0xf2c31df9, 0xe34b48db, 0x5be22ab6, 0x8834920d, + 0x9aa4c829, 0x262dbe4c, 0x328dfa64, 0xb0e94a7d, + 0xe91b6acf, 0x0f78331e, 0xd5e6a6b7, 0x8074ba1d, + 0xbe997c61, 0xcd26de87, 0x34bde468, 0x487a7590, + 0xffab24e3, 0x7af78ff4, 0x90f4ea3d, 0x5fc23ebe, + 0x201da040, 0x6867d5d0, 0x1ad07234, 0xae192c41, + 0xb4c95e75, 0x549a19a8, 0x93ece53b, 0x220daa44, + 0x6407e9c8, 0xf1db12ff, 0x73bfa2e6, 0x12905a24, + 0x403a5d80, 0x08402810, 0xc356e89b, 0xec337bc5, + 0xdb9690ab, 0xa1611f5f, 0x8d1c8307, 0x3df5c97a, + 0x97ccf133, 0x00000000, 0xcf36d483, 0x2b458756, + 0x7697b3ec, 0x8264b019, 0xd6fea9b1, 0x1bd87736, + 0xb5c15b77, 0xaf112943, 0x6a77dfd4, 0x50ba0da0, + 0x45124c8a, 0xf3cb18fb, 0x309df060, 0xef2b74c3, + 0x3fe5c37e, 0x55921caa, 0xa2791059, 0xea0365c9, + 0x650fecca, 0xbab96869, 0x2f65935e, 0xc04ee79d, + 0xdebe81a1, 0x1ce06c38, 0xfdbb2ee7, 0x4d52649a, + 0x92e4e039, 0x758fbcea, 0x06301e0c, 0x8a249809, + 0xb2f94079, 0xe66359d1, 0x0e70361c, 0x1ff8633e, + 0x6237f7c4, 0xd4eea3b5, 0xa829324d, 0x96c4f431, + 0xf99b3aef, 0xc566f697, 0x2535b14a, 0x59f220b2, + 0x8454ae15, 0x72b7a7e4, 0x39d5dd72, 0x4c5a6198, + 0x5eca3bbc, 0x78e785f0, 0x38ddd870, 0x8c148605, + 0xd1c6b2bf, 0xa5410b57, 0xe2434dd9, 0x612ff8c2, + 0xb3f1457b, 0x2115a542, 0x9c94d625, 0x1ef0663c, + 0x43225286, 0xc776fc93, 0xfcb32be5, 0x04201408, + 0x51b208a2, 0x99bcc72f, 0x6d4fc4da, 0x0d68391a, + 0xfa8335e9, 0xdfb684a3, 0x7ed79bfc, 0x243db448, + 0x3bc5d776, 0xab313d4b, 0xce3ed181, 0x11885522, + 0x8f0c8903, 0x4e4a6b9c, 0xb7d15173, 0xeb0b60cb, + 0x3cfdcc78, 0x817cbf1f, 0x94d4fe35, 0xf7eb0cf3, + 0xb9a1676f, 0x13985f26, 0x2c7d9c58, 0xd3d6b8bb, + 0xe76b5cd3, 0x6e57cbdc, 0xc46ef395, 0x03180f06, + 0x568a13ac, 0x441a4988, 0x7fdf9efe, 0xa921374f, + 0x2a4d8254, 0xbbb16d6b, 0xc146e29f, 0x53a202a6, + 0xdcae8ba5, 0x0b582716, 0x9d9cd327, 0x6c47c1d8, + 0x3195f562, 0x7487b9e8, 0xf6e309f1, 0x460a438c, + 0xac092645, 0x893c970f, 0x14a04428, 0xe15b42df, + 0x16b04e2c, 0x3acdd274, 0x696fd0d2, 0x09482d12, + 0x70a7ade0, 0xb6d95471, 0xd0ceb7bd, 0xed3b7ec7, + 0xcc2edb85, 0x422a5784, 0x98b4c22d, 0xa4490e55, + 0x285d8850, 0x5cda31b8, 0xf8933fed, 0x8644a411, + }, + { + 0x6018c078, 0x8c2305af, 0x3fc67ef9, 0x87e8136f, + 0x26874ca1, 0xdab8a962, 0x04010805, 0x214f426e, + 0xd836adee, 0xa2a65904, 0x6fd2debd, 0xf3f5fb06, + 0xf979ef80, 0xa16f5fce, 0x7e91fcef, 0x5552aa07, + 0x9d6027fd, 0xcabc8976, 0x569baccd, 0x028e048c, + 0xb6a37115, 0x300c603c, 0xf17bff8a, 0xd435b5e1, + 0x741de869, 0xa7e05347, 0x7bd7f6ac, 0x2fc25eed, + 0xb82e6d96, 0x314b627a, 0xdffea321, 0x41578216, + 0x5415a841, 0xc1779fb6, 0xdc37a5eb, 0xb3e57b56, + 0x469f8cd9, 0xe7f0d317, 0x354a6a7f, 0x4fda9e95, + 0x7d58fa25, 0x03c906ca, 0xa429558d, 0x280a5022, + 0xfeb1e14f, 0xbaa0691a, 0xb16b7fda, 0x2e855cab, + 0xcebd8173, 0x695dd234, 0x40108050, 0xf7f4f303, + 0x0bcb16c0, 0xf83eedc6, 0x14052811, 0x81671fe6, + 0xb7e47353, 0x9c2725bb, 0x19413258, 0x168b2c9d, + 0xa6a75101, 0xe97dcf94, 0x6e95dcfb, 0x47d88e9f, + 0xcbfb8b30, 0x9fee2371, 0xed7cc791, 0x856617e3, + 0x53dda68e, 0x5c17b84b, 0x01470246, 0x429e84dc, + 0x0fca1ec5, 0xb42d7599, 0xc6bf9179, 0x1c07381b, + 0x8ead0123, 0x755aea2f, 0x36836cb5, 0xcc3385ff, + 0x91633ff2, 0x0802100a, 0x92aa3938, 0xd971afa8, + 0x07c80ecf, 0x6419c87d, 0x39497270, 0x43d9869a, + 0xeff2c31d, 0xabe34b48, 0x715be22a, 0x1a883492, + 0x529aa4c8, 0x98262dbe, 0xc8328dfa, 0xfab0e94a, + 0x83e91b6a, 0x3c0f7833, 0x73d5e6a6, 0x3a8074ba, + 0xc2be997c, 0x13cd26de, 0xd034bde4, 0x3d487a75, + 0xdbffab24, 0xf57af78f, 0x7a90f4ea, 0x615fc23e, + 0x80201da0, 0xbd6867d5, 0x681ad072, 0x82ae192c, + 0xeab4c95e, 0x4d549a19, 0x7693ece5, 0x88220daa, + 0x8d6407e9, 0xe3f1db12, 0xd173bfa2, 0x4812905a, + 0x1d403a5d, 0x20084028, 0x2bc356e8, 0x97ec337b, + 0x4bdb9690, 0xbea1611f, 0x0e8d1c83, 0xf43df5c9, + 0x6697ccf1, 0x00000000, 0x1bcf36d4, 0xac2b4587, + 0xc57697b3, 0x328264b0, 0x7fd6fea9, 0x6c1bd877, + 0xeeb5c15b, 0x86af1129, 0xb56a77df, 0x5d50ba0d, + 0x0945124c, 0xebf3cb18, 0xc0309df0, 0x9bef2b74, + 0xfc3fe5c3, 0x4955921c, 0xb2a27910, 0x8fea0365, + 0x89650fec, 0xd2bab968, 0xbc2f6593, 0x27c04ee7, + 0x5fdebe81, 0x701ce06c, 0xd3fdbb2e, 0x294d5264, + 0x7292e4e0, 0xc9758fbc, 0x1806301e, 0x128a2498, + 0xf2b2f940, 0xbfe66359, 0x380e7036, 0x7c1ff863, + 0x956237f7, 0x77d4eea3, 0x9aa82932, 0x6296c4f4, + 0xc3f99b3a, 0x33c566f6, 0x942535b1, 0x7959f220, + 0x2a8454ae, 0xd572b7a7, 0xe439d5dd, 0x2d4c5a61, + 0x655eca3b, 0xfd78e785, 0xe038ddd8, 0x0a8c1486, + 0x63d1c6b2, 0xaea5410b, 0xafe2434d, 0x99612ff8, + 0xf6b3f145, 0x842115a5, 0x4a9c94d6, 0x781ef066, + 0x11432252, 0x3bc776fc, 0xd7fcb32b, 0x10042014, + 0x5951b208, 0x5e99bcc7, 0xa96d4fc4, 0x340d6839, + 0xcffa8335, 0x5bdfb684, 0xe57ed79b, 0x90243db4, + 0xec3bc5d7, 0x96ab313d, 0x1fce3ed1, 0x44118855, + 0x068f0c89, 0x254e4a6b, 0xe6b7d151, 0x8beb0b60, + 0xf03cfdcc, 0x3e817cbf, 0x6a94d4fe, 0xfbf7eb0c, + 0xdeb9a167, 0x4c13985f, 0xb02c7d9c, 0x6bd3d6b8, + 0xbbe76b5c, 0xa56e57cb, 0x37c46ef3, 0x0c03180f, + 0x45568a13, 0x0d441a49, 0xe17fdf9e, 0x9ea92137, + 0xa82a4d82, 0xd6bbb16d, 0x23c146e2, 0x5153a202, + 0x57dcae8b, 0x2c0b5827, 0x4e9d9cd3, 0xad6c47c1, + 0xc43195f5, 0xcd7487b9, 0xfff6e309, 0x05460a43, + 0x8aac0926, 0x1e893c97, 0x5014a044, 0xa3e15b42, + 0x5816b04e, 0xe83acdd2, 0xb9696fd0, 0x2409482d, + 0xdd70a7ad, 0xe2b6d954, 0x67d0ceb7, 0x93ed3b7e, + 0x17cc2edb, 0x15422a57, 0x5a98b4c2, 0xaaa4490e, + 0xa0285d88, 0x6d5cda31, 0xc7f8933f, 0x228644a4, + }, + { + 0x186018c0, 0x238c2305, 0xc63fc67e, 0xe887e813, + 0x8726874c, 0xb8dab8a9, 0x01040108, 0x4f214f42, + 0x36d836ad, 0xa6a2a659, 0xd26fd2de, 0xf5f3f5fb, + 0x79f979ef, 0x6fa16f5f, 0x917e91fc, 0x525552aa, + 0x609d6027, 0xbccabc89, 0x9b569bac, 0x8e028e04, + 0xa3b6a371, 0x0c300c60, 0x7bf17bff, 0x35d435b5, + 0x1d741de8, 0xe0a7e053, 0xd77bd7f6, 0xc22fc25e, + 0x2eb82e6d, 0x4b314b62, 0xfedffea3, 0x57415782, + 0x155415a8, 0x77c1779f, 0x37dc37a5, 0xe5b3e57b, + 0x9f469f8c, 0xf0e7f0d3, 0x4a354a6a, 0xda4fda9e, + 0x587d58fa, 0xc903c906, 0x29a42955, 0x0a280a50, + 0xb1feb1e1, 0xa0baa069, 0x6bb16b7f, 0x852e855c, + 0xbdcebd81, 0x5d695dd2, 0x10401080, 0xf4f7f4f3, + 0xcb0bcb16, 0x3ef83eed, 0x05140528, 0x6781671f, + 0xe4b7e473, 0x279c2725, 0x41194132, 0x8b168b2c, + 0xa7a6a751, 0x7de97dcf, 0x956e95dc, 0xd847d88e, + 0xfbcbfb8b, 0xee9fee23, 0x7ced7cc7, 0x66856617, + 0xdd53dda6, 0x175c17b8, 0x47014702, 0x9e429e84, + 0xca0fca1e, 0x2db42d75, 0xbfc6bf91, 0x071c0738, + 0xad8ead01, 0x5a755aea, 0x8336836c, 0x33cc3385, + 0x6391633f, 0x02080210, 0xaa92aa39, 0x71d971af, + 0xc807c80e, 0x196419c8, 0x49394972, 0xd943d986, + 0xf2eff2c3, 0xe3abe34b, 0x5b715be2, 0x881a8834, + 0x9a529aa4, 0x2698262d, 0x32c8328d, 0xb0fab0e9, + 0xe983e91b, 0x0f3c0f78, 0xd573d5e6, 0x803a8074, + 0xbec2be99, 0xcd13cd26, 0x34d034bd, 0x483d487a, + 0xffdbffab, 0x7af57af7, 0x907a90f4, 0x5f615fc2, + 0x2080201d, 0x68bd6867, 0x1a681ad0, 0xae82ae19, + 0xb4eab4c9, 0x544d549a, 0x937693ec, 0x2288220d, + 0x648d6407, 0xf1e3f1db, 0x73d173bf, 0x12481290, + 0x401d403a, 0x08200840, 0xc32bc356, 0xec97ec33, + 0xdb4bdb96, 0xa1bea161, 0x8d0e8d1c, 0x3df43df5, + 0x976697cc, 0x00000000, 0xcf1bcf36, 0x2bac2b45, + 0x76c57697, 0x82328264, 0xd67fd6fe, 0x1b6c1bd8, + 0xb5eeb5c1, 0xaf86af11, 0x6ab56a77, 0x505d50ba, + 0x45094512, 0xf3ebf3cb, 0x30c0309d, 0xef9bef2b, + 0x3ffc3fe5, 0x55495592, 0xa2b2a279, 0xea8fea03, + 0x6589650f, 0xbad2bab9, 0x2fbc2f65, 0xc027c04e, + 0xde5fdebe, 0x1c701ce0, 0xfdd3fdbb, 0x4d294d52, + 0x927292e4, 0x75c9758f, 0x06180630, 0x8a128a24, + 0xb2f2b2f9, 0xe6bfe663, 0x0e380e70, 0x1f7c1ff8, + 0x62956237, 0xd477d4ee, 0xa89aa829, 0x966296c4, + 0xf9c3f99b, 0xc533c566, 0x25942535, 0x597959f2, + 0x842a8454, 0x72d572b7, 0x39e439d5, 0x4c2d4c5a, + 0x5e655eca, 0x78fd78e7, 0x38e038dd, 0x8c0a8c14, + 0xd163d1c6, 0xa5aea541, 0xe2afe243, 0x6199612f, + 0xb3f6b3f1, 0x21842115, 0x9c4a9c94, 0x1e781ef0, + 0x43114322, 0xc73bc776, 0xfcd7fcb3, 0x04100420, + 0x515951b2, 0x995e99bc, 0x6da96d4f, 0x0d340d68, + 0xfacffa83, 0xdf5bdfb6, 0x7ee57ed7, 0x2490243d, + 0x3bec3bc5, 0xab96ab31, 0xce1fce3e, 0x11441188, + 0x8f068f0c, 0x4e254e4a, 0xb7e6b7d1, 0xeb8beb0b, + 0x3cf03cfd, 0x813e817c, 0x946a94d4, 0xf7fbf7eb, + 0xb9deb9a1, 0x134c1398, 0x2cb02c7d, 0xd36bd3d6, + 0xe7bbe76b, 0x6ea56e57, 0xc437c46e, 0x030c0318, + 0x5645568a, 0x440d441a, 0x7fe17fdf, 0xa99ea921, + 0x2aa82a4d, 0xbbd6bbb1, 0xc123c146, 0x535153a2, + 0xdc57dcae, 0x0b2c0b58, 0x9d4e9d9c, 0x6cad6c47, + 0x31c43195, 0x74cd7487, 0xf6fff6e3, 0x4605460a, + 0xac8aac09, 0x891e893c, 0x145014a0, 0xe1a3e15b, + 0x165816b0, 0x3ae83acd, 0x69b9696f, 0x09240948, + 0x70dd70a7, 0xb6e2b6d9, 0xd067d0ce, 0xed93ed3b, + 0xcc17cc2e, 0x4215422a, 0x985a98b4, 0xa4aaa449, + 0x28a0285d, 0x5c6d5cda, 0xf8c7f893, 0x86228644, + }, + { + 0x18186018, 0x23238c23, 0xc6c63fc6, 0xe8e887e8, + 0x87872687, 0xb8b8dab8, 0x01010401, 0x4f4f214f, + 0x3636d836, 0xa6a6a2a6, 0xd2d26fd2, 0xf5f5f3f5, + 0x7979f979, 0x6f6fa16f, 0x91917e91, 0x52525552, + 0x60609d60, 0xbcbccabc, 0x9b9b569b, 0x8e8e028e, + 0xa3a3b6a3, 0x0c0c300c, 0x7b7bf17b, 0x3535d435, + 0x1d1d741d, 0xe0e0a7e0, 0xd7d77bd7, 0xc2c22fc2, + 0x2e2eb82e, 0x4b4b314b, 0xfefedffe, 0x57574157, + 0x15155415, 0x7777c177, 0x3737dc37, 0xe5e5b3e5, + 0x9f9f469f, 0xf0f0e7f0, 0x4a4a354a, 0xdada4fda, + 0x58587d58, 0xc9c903c9, 0x2929a429, 0x0a0a280a, + 0xb1b1feb1, 0xa0a0baa0, 0x6b6bb16b, 0x85852e85, + 0xbdbdcebd, 0x5d5d695d, 0x10104010, 0xf4f4f7f4, + 0xcbcb0bcb, 0x3e3ef83e, 0x05051405, 0x67678167, + 0xe4e4b7e4, 0x27279c27, 0x41411941, 0x8b8b168b, + 0xa7a7a6a7, 0x7d7de97d, 0x95956e95, 0xd8d847d8, + 0xfbfbcbfb, 0xeeee9fee, 0x7c7ced7c, 0x66668566, + 0xdddd53dd, 0x17175c17, 0x47470147, 0x9e9e429e, + 0xcaca0fca, 0x2d2db42d, 0xbfbfc6bf, 0x07071c07, + 0xadad8ead, 0x5a5a755a, 0x83833683, 0x3333cc33, + 0x63639163, 0x02020802, 0xaaaa92aa, 0x7171d971, + 0xc8c807c8, 0x19196419, 0x49493949, 0xd9d943d9, + 0xf2f2eff2, 0xe3e3abe3, 0x5b5b715b, 0x88881a88, + 0x9a9a529a, 0x26269826, 0x3232c832, 0xb0b0fab0, + 0xe9e983e9, 0x0f0f3c0f, 0xd5d573d5, 0x80803a80, + 0xbebec2be, 0xcdcd13cd, 0x3434d034, 0x48483d48, + 0xffffdbff, 0x7a7af57a, 0x90907a90, 0x5f5f615f, + 0x20208020, 0x6868bd68, 0x1a1a681a, 0xaeae82ae, + 0xb4b4eab4, 0x54544d54, 0x93937693, 0x22228822, + 0x64648d64, 0xf1f1e3f1, 0x7373d173, 0x12124812, + 0x40401d40, 0x08082008, 0xc3c32bc3, 0xecec97ec, + 0xdbdb4bdb, 0xa1a1bea1, 0x8d8d0e8d, 0x3d3df43d, + 0x97976697, 0x00000000, 0xcfcf1bcf, 0x2b2bac2b, + 0x7676c576, 0x82823282, 0xd6d67fd6, 0x1b1b6c1b, + 0xb5b5eeb5, 0xafaf86af, 0x6a6ab56a, 0x50505d50, + 0x45450945, 0xf3f3ebf3, 0x3030c030, 0xefef9bef, + 0x3f3ffc3f, 0x55554955, 0xa2a2b2a2, 0xeaea8fea, + 0x65658965, 0xbabad2ba, 0x2f2fbc2f, 0xc0c027c0, + 0xdede5fde, 0x1c1c701c, 0xfdfdd3fd, 0x4d4d294d, + 0x92927292, 0x7575c975, 0x06061806, 0x8a8a128a, + 0xb2b2f2b2, 0xe6e6bfe6, 0x0e0e380e, 0x1f1f7c1f, + 0x62629562, 0xd4d477d4, 0xa8a89aa8, 0x96966296, + 0xf9f9c3f9, 0xc5c533c5, 0x25259425, 0x59597959, + 0x84842a84, 0x7272d572, 0x3939e439, 0x4c4c2d4c, + 0x5e5e655e, 0x7878fd78, 0x3838e038, 0x8c8c0a8c, + 0xd1d163d1, 0xa5a5aea5, 0xe2e2afe2, 0x61619961, + 0xb3b3f6b3, 0x21218421, 0x9c9c4a9c, 0x1e1e781e, + 0x43431143, 0xc7c73bc7, 0xfcfcd7fc, 0x04041004, + 0x51515951, 0x99995e99, 0x6d6da96d, 0x0d0d340d, + 0xfafacffa, 0xdfdf5bdf, 0x7e7ee57e, 0x24249024, + 0x3b3bec3b, 0xabab96ab, 0xcece1fce, 0x11114411, + 0x8f8f068f, 0x4e4e254e, 0xb7b7e6b7, 0xebeb8beb, + 0x3c3cf03c, 0x81813e81, 0x94946a94, 0xf7f7fbf7, + 0xb9b9deb9, 0x13134c13, 0x2c2cb02c, 0xd3d36bd3, + 0xe7e7bbe7, 0x6e6ea56e, 0xc4c437c4, 0x03030c03, + 0x56564556, 0x44440d44, 0x7f7fe17f, 0xa9a99ea9, + 0x2a2aa82a, 0xbbbbd6bb, 0xc1c123c1, 0x53535153, + 0xdcdc57dc, 0x0b0b2c0b, 0x9d9d4e9d, 0x6c6cad6c, + 0x3131c431, 0x7474cd74, 0xf6f6fff6, 0x46460546, + 0xacac8aac, 0x89891e89, 0x14145014, 0xe1e1a3e1, + 0x16165816, 0x3a3ae83a, 0x6969b969, 0x09092409, + 0x7070dd70, 0xb6b6e2b6, 0xd0d067d0, 0xeded93ed, + 0xcccc17cc, 0x42421542, 0x98985a98, 0xa4a4aaa4, + 0x2828a028, 0x5c5c6d5c, 0xf8f8c7f8, 0x86862286, + }, + { + 0xd8181860, 0x2623238c, 0xb8c6c63f, 0xfbe8e887, + 0xcb878726, 0x11b8b8da, 0x09010104, 0x0d4f4f21, + 0x9b3636d8, 0xffa6a6a2, 0x0cd2d26f, 0x0ef5f5f3, + 0x967979f9, 0x306f6fa1, 0x6d91917e, 0xf8525255, + 0x4760609d, 0x35bcbcca, 0x379b9b56, 0x8a8e8e02, + 0xd2a3a3b6, 0x6c0c0c30, 0x847b7bf1, 0x803535d4, + 0xf51d1d74, 0xb3e0e0a7, 0x21d7d77b, 0x9cc2c22f, + 0x432e2eb8, 0x294b4b31, 0x5dfefedf, 0xd5575741, + 0xbd151554, 0xe87777c1, 0x923737dc, 0x9ee5e5b3, + 0x139f9f46, 0x23f0f0e7, 0x204a4a35, 0x44dada4f, + 0xa258587d, 0xcfc9c903, 0x7c2929a4, 0x5a0a0a28, + 0x50b1b1fe, 0xc9a0a0ba, 0x146b6bb1, 0xd985852e, + 0x3cbdbdce, 0x8f5d5d69, 0x90101040, 0x07f4f4f7, + 0xddcbcb0b, 0xd33e3ef8, 0x2d050514, 0x78676781, + 0x97e4e4b7, 0x0227279c, 0x73414119, 0xa78b8b16, + 0xf6a7a7a6, 0xb27d7de9, 0x4995956e, 0x56d8d847, + 0x70fbfbcb, 0xcdeeee9f, 0xbb7c7ced, 0x71666685, + 0x7bdddd53, 0xaf17175c, 0x45474701, 0x1a9e9e42, + 0xd4caca0f, 0x582d2db4, 0x2ebfbfc6, 0x3f07071c, + 0xacadad8e, 0xb05a5a75, 0xef838336, 0xb63333cc, + 0x5c636391, 0x12020208, 0x93aaaa92, 0xde7171d9, + 0xc6c8c807, 0xd1191964, 0x3b494939, 0x5fd9d943, + 0x31f2f2ef, 0xa8e3e3ab, 0xb95b5b71, 0xbc88881a, + 0x3e9a9a52, 0x0b262698, 0xbf3232c8, 0x59b0b0fa, + 0xf2e9e983, 0x770f0f3c, 0x33d5d573, 0xf480803a, + 0x27bebec2, 0xebcdcd13, 0x893434d0, 0x3248483d, + 0x54ffffdb, 0x8d7a7af5, 0x6490907a, 0x9d5f5f61, + 0x3d202080, 0x0f6868bd, 0xca1a1a68, 0xb7aeae82, + 0x7db4b4ea, 0xce54544d, 0x7f939376, 0x2f222288, + 0x6364648d, 0x2af1f1e3, 0xcc7373d1, 0x82121248, + 0x7a40401d, 0x48080820, 0x95c3c32b, 0xdfecec97, + 0x4ddbdb4b, 0xc0a1a1be, 0x918d8d0e, 0xc83d3df4, + 0x5b979766, 0x00000000, 0xf9cfcf1b, 0x6e2b2bac, + 0xe17676c5, 0xe6828232, 0x28d6d67f, 0xc31b1b6c, + 0x74b5b5ee, 0xbeafaf86, 0x1d6a6ab5, 0xea50505d, + 0x57454509, 0x38f3f3eb, 0xad3030c0, 0xc4efef9b, + 0xda3f3ffc, 0xc7555549, 0xdba2a2b2, 0xe9eaea8f, + 0x6a656589, 0x03babad2, 0x4a2f2fbc, 0x8ec0c027, + 0x60dede5f, 0xfc1c1c70, 0x46fdfdd3, 0x1f4d4d29, + 0x76929272, 0xfa7575c9, 0x36060618, 0xae8a8a12, + 0x4bb2b2f2, 0x85e6e6bf, 0x7e0e0e38, 0xe71f1f7c, + 0x55626295, 0x3ad4d477, 0x81a8a89a, 0x52969662, + 0x62f9f9c3, 0xa3c5c533, 0x10252594, 0xab595979, + 0xd084842a, 0xc57272d5, 0xec3939e4, 0x164c4c2d, + 0x945e5e65, 0x9f7878fd, 0xe53838e0, 0x988c8c0a, + 0x17d1d163, 0xe4a5a5ae, 0xa1e2e2af, 0x4e616199, + 0x42b3b3f6, 0x34212184, 0x089c9c4a, 0xee1e1e78, + 0x61434311, 0xb1c7c73b, 0x4ffcfcd7, 0x24040410, + 0xe3515159, 0x2599995e, 0x226d6da9, 0x650d0d34, + 0x79fafacf, 0x69dfdf5b, 0xa97e7ee5, 0x19242490, + 0xfe3b3bec, 0x9aabab96, 0xf0cece1f, 0x99111144, + 0x838f8f06, 0x044e4e25, 0x66b7b7e6, 0xe0ebeb8b, + 0xc13c3cf0, 0xfd81813e, 0x4094946a, 0x1cf7f7fb, + 0x18b9b9de, 0x8b13134c, 0x512c2cb0, 0x05d3d36b, + 0x8ce7e7bb, 0x396e6ea5, 0xaac4c437, 0x1b03030c, + 0xdc565645, 0x5e44440d, 0xa07f7fe1, 0x88a9a99e, + 0x672a2aa8, 0x0abbbbd6, 0x87c1c123, 0xf1535351, + 0x72dcdc57, 0x530b0b2c, 0x019d9d4e, 0x2b6c6cad, + 0xa43131c4, 0xf37474cd, 0x15f6f6ff, 0x4c464605, + 0xa5acac8a, 0xb589891e, 0xb4141450, 0xbae1e1a3, + 0xa6161658, 0xf73a3ae8, 0x066969b9, 0x41090924, + 0xd77070dd, 0x6fb6b6e2, 0x1ed0d067, 0xd6eded93, + 0xe2cccc17, 0x68424215, 0x2c98985a, 0xeda4a4aa, + 0x752828a0, 0x865c5c6d, 0x6bf8f8c7, 0xc2868622, + }, + { + 0x30d81818, 0x46262323, 0x91b8c6c6, 0xcdfbe8e8, + 0x13cb8787, 0x6d11b8b8, 0x02090101, 0x9e0d4f4f, + 0x6c9b3636, 0x51ffa6a6, 0xb90cd2d2, 0xf70ef5f5, + 0xf2967979, 0xde306f6f, 0x3f6d9191, 0xa4f85252, + 0xc0476060, 0x6535bcbc, 0x2b379b9b, 0x018a8e8e, + 0x5bd2a3a3, 0x186c0c0c, 0xf6847b7b, 0x6a803535, + 0x3af51d1d, 0xddb3e0e0, 0xb321d7d7, 0x999cc2c2, + 0x5c432e2e, 0x96294b4b, 0xe15dfefe, 0xaed55757, + 0x2abd1515, 0xeee87777, 0x6e923737, 0xd79ee5e5, + 0x23139f9f, 0xfd23f0f0, 0x94204a4a, 0xa944dada, + 0xb0a25858, 0x8fcfc9c9, 0x527c2929, 0x145a0a0a, + 0x7f50b1b1, 0x5dc9a0a0, 0xd6146b6b, 0x17d98585, + 0x673cbdbd, 0xba8f5d5d, 0x20901010, 0xf507f4f4, + 0x8bddcbcb, 0x7cd33e3e, 0x0a2d0505, 0xce786767, + 0xd597e4e4, 0x4e022727, 0x82734141, 0x0ba78b8b, + 0x53f6a7a7, 0xfab27d7d, 0x37499595, 0xad56d8d8, + 0xeb70fbfb, 0xc1cdeeee, 0xf8bb7c7c, 0xcc716666, + 0xa77bdddd, 0x2eaf1717, 0x8e454747, 0x211a9e9e, + 0x89d4caca, 0x5a582d2d, 0x632ebfbf, 0x0e3f0707, + 0x47acadad, 0xb4b05a5a, 0x1bef8383, 0x66b63333, + 0xc65c6363, 0x04120202, 0x4993aaaa, 0xe2de7171, + 0x8dc6c8c8, 0x32d11919, 0x923b4949, 0xaf5fd9d9, + 0xf931f2f2, 0xdba8e3e3, 0xb6b95b5b, 0x0dbc8888, + 0x293e9a9a, 0x4c0b2626, 0x64bf3232, 0x7d59b0b0, + 0xcff2e9e9, 0x1e770f0f, 0xb733d5d5, 0x1df48080, + 0x6127bebe, 0x87ebcdcd, 0x68893434, 0x90324848, + 0xe354ffff, 0xf48d7a7a, 0x3d649090, 0xbe9d5f5f, + 0x403d2020, 0xd00f6868, 0x34ca1a1a, 0x41b7aeae, + 0x757db4b4, 0xa8ce5454, 0x3b7f9393, 0x442f2222, + 0xc8636464, 0xff2af1f1, 0xe6cc7373, 0x24821212, + 0x807a4040, 0x10480808, 0x9b95c3c3, 0xc5dfecec, + 0xab4ddbdb, 0x5fc0a1a1, 0x07918d8d, 0x7ac83d3d, + 0x335b9797, 0x00000000, 0x83f9cfcf, 0x566e2b2b, + 0xece17676, 0x19e68282, 0xb128d6d6, 0x36c31b1b, + 0x7774b5b5, 0x43beafaf, 0xd41d6a6a, 0xa0ea5050, + 0x8a574545, 0xfb38f3f3, 0x60ad3030, 0xc3c4efef, + 0x7eda3f3f, 0xaac75555, 0x59dba2a2, 0xc9e9eaea, + 0xca6a6565, 0x6903baba, 0x5e4a2f2f, 0x9d8ec0c0, + 0xa160dede, 0x38fc1c1c, 0xe746fdfd, 0x9a1f4d4d, + 0x39769292, 0xeafa7575, 0x0c360606, 0x09ae8a8a, + 0x794bb2b2, 0xd185e6e6, 0x1c7e0e0e, 0x3ee71f1f, + 0xc4556262, 0xb53ad4d4, 0x4d81a8a8, 0x31529696, + 0xef62f9f9, 0x97a3c5c5, 0x4a102525, 0xb2ab5959, + 0x15d08484, 0xe4c57272, 0x72ec3939, 0x98164c4c, + 0xbc945e5e, 0xf09f7878, 0x70e53838, 0x05988c8c, + 0xbf17d1d1, 0x57e4a5a5, 0xd9a1e2e2, 0xc24e6161, + 0x7b42b3b3, 0x42342121, 0x25089c9c, 0x3cee1e1e, + 0x86614343, 0x93b1c7c7, 0xe54ffcfc, 0x08240404, + 0xa2e35151, 0x2f259999, 0xda226d6d, 0x1a650d0d, + 0xe979fafa, 0xa369dfdf, 0xfca97e7e, 0x48192424, + 0x76fe3b3b, 0x4b9aabab, 0x81f0cece, 0x22991111, + 0x03838f8f, 0x9c044e4e, 0x7366b7b7, 0xcbe0ebeb, + 0x78c13c3c, 0x1ffd8181, 0x35409494, 0xf31cf7f7, + 0x6f18b9b9, 0x268b1313, 0x58512c2c, 0xbb05d3d3, + 0xd38ce7e7, 0xdc396e6e, 0x95aac4c4, 0x061b0303, + 0xacdc5656, 0x885e4444, 0xfea07f7f, 0x4f88a9a9, + 0x54672a2a, 0x6b0abbbb, 0x9f87c1c1, 0xa6f15353, + 0xa572dcdc, 0x16530b0b, 0x27019d9d, 0xd82b6c6c, + 0x62a43131, 0xe8f37474, 0xf115f6f6, 0x8c4c4646, + 0x45a5acac, 0x0fb58989, 0x28b41414, 0xdfbae1e1, + 0x2ca61616, 0x74f73a3a, 0xd2066969, 0x12410909, + 0xe0d77070, 0x716fb6b6, 0xbd1ed0d0, 0xc7d6eded, + 0x85e2cccc, 0x84684242, 0x2d2c9898, 0x55eda4a4, + 0x50752828, 0xb8865c5c, 0xed6bf8f8, 0x11c28686, + }, + { + 0x7830d818, 0xaf462623, 0xf991b8c6, 0x6fcdfbe8, + 0xa113cb87, 0x626d11b8, 0x05020901, 0x6e9e0d4f, + 0xee6c9b36, 0x0451ffa6, 0xbdb90cd2, 0x06f70ef5, + 0x80f29679, 0xcede306f, 0xef3f6d91, 0x07a4f852, + 0xfdc04760, 0x766535bc, 0xcd2b379b, 0x8c018a8e, + 0x155bd2a3, 0x3c186c0c, 0x8af6847b, 0xe16a8035, + 0x693af51d, 0x47ddb3e0, 0xacb321d7, 0xed999cc2, + 0x965c432e, 0x7a96294b, 0x21e15dfe, 0x16aed557, + 0x412abd15, 0xb6eee877, 0xeb6e9237, 0x56d79ee5, + 0xd923139f, 0x17fd23f0, 0x7f94204a, 0x95a944da, + 0x25b0a258, 0xca8fcfc9, 0x8d527c29, 0x22145a0a, + 0x4f7f50b1, 0x1a5dc9a0, 0xdad6146b, 0xab17d985, + 0x73673cbd, 0x34ba8f5d, 0x50209010, 0x03f507f4, + 0xc08bddcb, 0xc67cd33e, 0x110a2d05, 0xe6ce7867, + 0x53d597e4, 0xbb4e0227, 0x58827341, 0x9d0ba78b, + 0x0153f6a7, 0x94fab27d, 0xfb374995, 0x9fad56d8, + 0x30eb70fb, 0x71c1cdee, 0x91f8bb7c, 0xe3cc7166, + 0x8ea77bdd, 0x4b2eaf17, 0x468e4547, 0xdc211a9e, + 0xc589d4ca, 0x995a582d, 0x79632ebf, 0x1b0e3f07, + 0x2347acad, 0x2fb4b05a, 0xb51bef83, 0xff66b633, + 0xf2c65c63, 0x0a041202, 0x384993aa, 0xa8e2de71, + 0xcf8dc6c8, 0x7d32d119, 0x70923b49, 0x9aaf5fd9, + 0x1df931f2, 0x48dba8e3, 0x2ab6b95b, 0x920dbc88, + 0xc8293e9a, 0xbe4c0b26, 0xfa64bf32, 0x4a7d59b0, + 0x6acff2e9, 0x331e770f, 0xa6b733d5, 0xba1df480, + 0x7c6127be, 0xde87ebcd, 0xe4688934, 0x75903248, + 0x24e354ff, 0x8ff48d7a, 0xea3d6490, 0x3ebe9d5f, + 0xa0403d20, 0xd5d00f68, 0x7234ca1a, 0x2c41b7ae, + 0x5e757db4, 0x19a8ce54, 0xe53b7f93, 0xaa442f22, + 0xe9c86364, 0x12ff2af1, 0xa2e6cc73, 0x5a248212, + 0x5d807a40, 0x28104808, 0xe89b95c3, 0x7bc5dfec, + 0x90ab4ddb, 0x1f5fc0a1, 0x8307918d, 0xc97ac83d, + 0xf1335b97, 0x00000000, 0xd483f9cf, 0x87566e2b, + 0xb3ece176, 0xb019e682, 0xa9b128d6, 0x7736c31b, + 0x5b7774b5, 0x2943beaf, 0xdfd41d6a, 0x0da0ea50, + 0x4c8a5745, 0x18fb38f3, 0xf060ad30, 0x74c3c4ef, + 0xc37eda3f, 0x1caac755, 0x1059dba2, 0x65c9e9ea, + 0xecca6a65, 0x686903ba, 0x935e4a2f, 0xe79d8ec0, + 0x81a160de, 0x6c38fc1c, 0x2ee746fd, 0x649a1f4d, + 0xe0397692, 0xbceafa75, 0x1e0c3606, 0x9809ae8a, + 0x40794bb2, 0x59d185e6, 0x361c7e0e, 0x633ee71f, + 0xf7c45562, 0xa3b53ad4, 0x324d81a8, 0xf4315296, + 0x3aef62f9, 0xf697a3c5, 0xb14a1025, 0x20b2ab59, + 0xae15d084, 0xa7e4c572, 0xdd72ec39, 0x6198164c, + 0x3bbc945e, 0x85f09f78, 0xd870e538, 0x8605988c, + 0xb2bf17d1, 0x0b57e4a5, 0x4dd9a1e2, 0xf8c24e61, + 0x457b42b3, 0xa5423421, 0xd625089c, 0x663cee1e, + 0x52866143, 0xfc93b1c7, 0x2be54ffc, 0x14082404, + 0x08a2e351, 0xc72f2599, 0xc4da226d, 0x391a650d, + 0x35e979fa, 0x84a369df, 0x9bfca97e, 0xb4481924, + 0xd776fe3b, 0x3d4b9aab, 0xd181f0ce, 0x55229911, + 0x8903838f, 0x6b9c044e, 0x517366b7, 0x60cbe0eb, + 0xcc78c13c, 0xbf1ffd81, 0xfe354094, 0x0cf31cf7, + 0x676f18b9, 0x5f268b13, 0x9c58512c, 0xb8bb05d3, + 0x5cd38ce7, 0xcbdc396e, 0xf395aac4, 0x0f061b03, + 0x13acdc56, 0x49885e44, 0x9efea07f, 0x374f88a9, + 0x8254672a, 0x6d6b0abb, 0xe29f87c1, 0x02a6f153, + 0x8ba572dc, 0x2716530b, 0xd327019d, 0xc1d82b6c, + 0xf562a431, 0xb9e8f374, 0x09f115f6, 0x438c4c46, + 0x2645a5ac, 0x970fb589, 0x4428b414, 0x42dfbae1, + 0x4e2ca616, 0xd274f73a, 0xd0d20669, 0x2d124109, + 0xade0d770, 0x54716fb6, 0xb7bd1ed0, 0x7ec7d6ed, + 0xdb85e2cc, 0x57846842, 0xc22d2c98, 0x0e55eda4, + 0x88507528, 0x31b8865c, 0x3fed6bf8, 0xa411c286, + }, +}; + +__device__ __constant__ u32 rch[R + 1] = +{ + 0x00000000, + 0x1823c6e8, + 0x36a6d2f5, + 0x60bc9b8e, + 0x1de0d7c2, + 0x157737e5, + 0x58c9290a, + 0xbd5d10f4, + 0xe427418b, + 0xfbee7c66, + 0xca2dbf07, +}; + +__device__ __constant__ u32 rcl[R + 1] = +{ + 0x00000000, + 0x87b8014f, + 0x796f9152, + 0xa30c7b35, + 0x2e4bfe57, + 0x9ff04ada, + 0xb1a06b85, + 0xcb3e0567, + 0xa77d95d8, + 0xdd17479e, + 0xad5a8333, +}; + +__device__ static void whirlpool_transform (const u32x w[16], u32x dgst[16], u32 s_Ch[8][256], u32 s_Cl[8][256]) +{ + u32x Kh[8]; + u32x Kl[8]; + + Kh[0] = 0x300beec0; + Kl[0] = 0xaf902967; + Kh[1] = 0x28282828; + Kl[1] = 0x28282828; + Kh[2] = 0x28282828; + Kl[2] = 0x28282828; + Kh[3] = 0x28282828; + Kl[3] = 0x28282828; + Kh[4] = 0x28282828; + Kl[4] = 0x28282828; + Kh[5] = 0x28282828; + Kl[5] = 0x28282828; + Kh[6] = 0x28282828; + Kl[6] = 0x28282828; + Kh[7] = 0x28282828; + Kl[7] = 0x28282828; + + u32x stateh[8]; + u32x statel[8]; + + stateh[0] = w[ 0]; + statel[0] = w[ 1]; + stateh[1] = w[ 2]; + statel[1] = w[ 3]; + stateh[2] = w[ 4]; + statel[2] = w[ 5]; + stateh[3] = w[ 6]; + statel[3] = w[ 7]; + stateh[4] = w[ 8]; + statel[4] = w[ 9]; + stateh[5] = w[10]; + statel[5] = w[11]; + stateh[6] = w[12]; + statel[6] = w[13]; + stateh[7] = w[14]; + statel[7] = w[15]; + + u32x Lh[8]; + u32x Ll[8]; + + #pragma unroll + for (int i = 0; i < 8; i++) + { + const u32x Lp0 = stateh[(i + 8) & 7] >> 24; + const u32x Lp1 = stateh[(i + 7) & 7] >> 16; + const u32x Lp2 = stateh[(i + 6) & 7] >> 8; + const u32x Lp3 = stateh[(i + 5) & 7] >> 0; + const u32x Lp4 = statel[(i + 4) & 7] >> 24; + const u32x Lp5 = statel[(i + 3) & 7] >> 16; + const u32x Lp6 = statel[(i + 2) & 7] >> 8; + const u32x Lp7 = statel[(i + 1) & 7] >> 0; + + Lh[i] = BOX (s_Ch, 0, Lp0 & 0xff) + ^ BOX (s_Ch, 1, Lp1 & 0xff) + ^ BOX (s_Ch, 2, Lp2 & 0xff) + ^ BOX (s_Ch, 3, Lp3 & 0xff) + ^ BOX (s_Ch, 4, Lp4 & 0xff) + ^ BOX (s_Ch, 5, Lp5 & 0xff) + ^ BOX (s_Ch, 6, Lp6 & 0xff) + ^ BOX (s_Ch, 7, Lp7 & 0xff); + + Ll[i] = BOX (s_Cl, 0, Lp0 & 0xff) + ^ BOX (s_Cl, 1, Lp1 & 0xff) + ^ BOX (s_Cl, 2, Lp2 & 0xff) + ^ BOX (s_Cl, 3, Lp3 & 0xff) + ^ BOX (s_Cl, 4, Lp4 & 0xff) + ^ BOX (s_Cl, 5, Lp5 & 0xff) + ^ BOX (s_Cl, 6, Lp6 & 0xff) + ^ BOX (s_Cl, 7, Lp7 & 0xff); + } + + stateh[0] = Lh[0] ^ Kh[0]; + statel[0] = Ll[0] ^ Kl[0]; + stateh[1] = Lh[1] ^ Kh[1]; + statel[1] = Ll[1] ^ Kl[1]; + stateh[2] = Lh[2] ^ Kh[2]; + statel[2] = Ll[2] ^ Kl[2]; + stateh[3] = Lh[3] ^ Kh[3]; + statel[3] = Ll[3] ^ Kl[3]; + stateh[4] = Lh[4] ^ Kh[4]; + statel[4] = Ll[4] ^ Kl[4]; + stateh[5] = Lh[5] ^ Kh[5]; + statel[5] = Ll[5] ^ Kl[5]; + stateh[6] = Lh[6] ^ Kh[6]; + statel[6] = Ll[6] ^ Kl[6]; + stateh[7] = Lh[7] ^ Kh[7]; + statel[7] = Ll[7] ^ Kl[7]; + + for (int r = 2; r <= R; r++) + { + u32x Lh[8]; + u32x Ll[8]; + + #pragma unroll + for (int i = 0; i < 8; i++) + { + const u32x Lp0 = Kh[(i + 8) & 7] >> 24; + const u32x Lp1 = Kh[(i + 7) & 7] >> 16; + const u32x Lp2 = Kh[(i + 6) & 7] >> 8; + const u32x Lp3 = Kh[(i + 5) & 7] >> 0; + const u32x Lp4 = Kl[(i + 4) & 7] >> 24; + const u32x Lp5 = Kl[(i + 3) & 7] >> 16; + const u32x Lp6 = Kl[(i + 2) & 7] >> 8; + const u32x Lp7 = Kl[(i + 1) & 7] >> 0; + + Lh[i] = BOX (s_Ch, 0, Lp0 & 0xff) + ^ BOX (s_Ch, 1, Lp1 & 0xff) + ^ BOX (s_Ch, 2, Lp2 & 0xff) + ^ BOX (s_Ch, 3, Lp3 & 0xff) + ^ BOX (s_Ch, 4, Lp4 & 0xff) + ^ BOX (s_Ch, 5, Lp5 & 0xff) + ^ BOX (s_Ch, 6, Lp6 & 0xff) + ^ BOX (s_Ch, 7, Lp7 & 0xff); + + Ll[i] = BOX (s_Cl, 0, Lp0 & 0xff) + ^ BOX (s_Cl, 1, Lp1 & 0xff) + ^ BOX (s_Cl, 2, Lp2 & 0xff) + ^ BOX (s_Cl, 3, Lp3 & 0xff) + ^ BOX (s_Cl, 4, Lp4 & 0xff) + ^ BOX (s_Cl, 5, Lp5 & 0xff) + ^ BOX (s_Cl, 6, Lp6 & 0xff) + ^ BOX (s_Cl, 7, Lp7 & 0xff); + } + + Kh[0] = Lh[0] ^ rch[r]; + Kl[0] = Ll[0] ^ rcl[r]; + Kh[1] = Lh[1]; + Kl[1] = Ll[1]; + Kh[2] = Lh[2]; + Kl[2] = Ll[2]; + Kh[3] = Lh[3]; + Kl[3] = Ll[3]; + Kh[4] = Lh[4]; + Kl[4] = Ll[4]; + Kh[5] = Lh[5]; + Kl[5] = Ll[5]; + Kh[6] = Lh[6]; + Kl[6] = Ll[6]; + Kh[7] = Lh[7]; + Kl[7] = Ll[7]; + + #pragma unroll 8 + for (int i = 0; i < 8; i++) + { + const u32x Lp0 = stateh[(i + 8) & 7] >> 24; + const u32x Lp1 = stateh[(i + 7) & 7] >> 16; + const u32x Lp2 = stateh[(i + 6) & 7] >> 8; + const u32x Lp3 = stateh[(i + 5) & 7] >> 0; + const u32x Lp4 = statel[(i + 4) & 7] >> 24; + const u32x Lp5 = statel[(i + 3) & 7] >> 16; + const u32x Lp6 = statel[(i + 2) & 7] >> 8; + const u32x Lp7 = statel[(i + 1) & 7] >> 0; + + Lh[i] = BOX (s_Ch, 0, Lp0 & 0xff) + ^ BOX (s_Ch, 1, Lp1 & 0xff) + ^ BOX (s_Ch, 2, Lp2 & 0xff) + ^ BOX (s_Ch, 3, Lp3 & 0xff) + ^ BOX (s_Ch, 4, Lp4 & 0xff) + ^ BOX (s_Ch, 5, Lp5 & 0xff) + ^ BOX (s_Ch, 6, Lp6 & 0xff) + ^ BOX (s_Ch, 7, Lp7 & 0xff); + + Ll[i] = BOX (s_Cl, 0, Lp0 & 0xff) + ^ BOX (s_Cl, 1, Lp1 & 0xff) + ^ BOX (s_Cl, 2, Lp2 & 0xff) + ^ BOX (s_Cl, 3, Lp3 & 0xff) + ^ BOX (s_Cl, 4, Lp4 & 0xff) + ^ BOX (s_Cl, 5, Lp5 & 0xff) + ^ BOX (s_Cl, 6, Lp6 & 0xff) + ^ BOX (s_Cl, 7, Lp7 & 0xff); + } + + stateh[0] = Lh[0] ^ Kh[0]; + statel[0] = Ll[0] ^ Kl[0]; + stateh[1] = Lh[1] ^ Kh[1]; + statel[1] = Ll[1] ^ Kl[1]; + stateh[2] = Lh[2] ^ Kh[2]; + statel[2] = Ll[2] ^ Kl[2]; + stateh[3] = Lh[3] ^ Kh[3]; + statel[3] = Ll[3] ^ Kl[3]; + stateh[4] = Lh[4] ^ Kh[4]; + statel[4] = Ll[4] ^ Kl[4]; + stateh[5] = Lh[5] ^ Kh[5]; + statel[5] = Ll[5] ^ Kl[5]; + stateh[6] = Lh[6] ^ Kh[6]; + statel[6] = Ll[6] ^ Kl[6]; + stateh[7] = Lh[7] ^ Kh[7]; + statel[7] = Ll[7] ^ Kl[7]; + } + + dgst[ 0] = stateh[0] ^ w[ 0]; + dgst[ 1] = statel[0] ^ w[ 1]; + dgst[ 2] = stateh[1] ^ w[ 2]; + dgst[ 3] = statel[1] ^ w[ 3]; + dgst[ 4] = stateh[2] ^ w[ 4]; + dgst[ 5] = statel[2] ^ w[ 5]; + dgst[ 6] = stateh[3] ^ w[ 6]; + dgst[ 7] = statel[3] ^ w[ 7]; + dgst[ 8] = stateh[4] ^ w[ 8]; + dgst[ 9] = statel[4] ^ w[ 9]; + dgst[10] = stateh[5] ^ w[10]; + dgst[11] = statel[5] ^ w[11]; + dgst[12] = stateh[6] ^ w[12]; + dgst[13] = statel[6] ^ w[13]; + dgst[14] = stateh[7] ^ w[14]; + dgst[15] = statel[7] ^ w[15]; +} + +__device__ __constant__ gpu_rule_t c_rules[1024]; + +extern "C" __global__ void __launch_bounds__ (256, 1) m06100_m04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + u32x pw_buf1[4]; + + pw_buf1[0] = pws[gid].i[ 4]; + pw_buf1[1] = pws[gid].i[ 5]; + pw_buf1[2] = pws[gid].i[ 6]; + pw_buf1[3] = pws[gid].i[ 7]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * modifier + */ + + __shared__ u32 s_Ch[8][256]; + __shared__ u32 s_Cl[8][256]; + + for (u32 i = 0; i < 8; i++) + { + s_Ch[i][lid] = Ch[i][lid]; + s_Cl[i][lid] = Cl[i][lid]; + } + + __syncthreads (); + + if (gid >= gid_max) return; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + + w0[0] = pw_buf0[0]; + w0[1] = pw_buf0[1]; + w0[2] = pw_buf0[2]; + w0[3] = pw_buf0[3]; + + u32x w1[4]; + + w1[0] = pw_buf1[0]; + w1[1] = pw_buf1[1]; + w1[2] = pw_buf1[2]; + w1[3] = pw_buf1[3]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 out_len = apply_rules (c_rules[il_pos].cmds, w0, w1, pw_len); + + append_0x80_2 (w0, w1, out_len); + + u32x wl[16]; + + wl[ 0] = swap_workaround (w0[0]); + wl[ 1] = swap_workaround (w0[1]); + wl[ 2] = swap_workaround (w0[2]); + wl[ 3] = swap_workaround (w0[3]); + wl[ 4] = swap_workaround (w1[0]); + wl[ 5] = swap_workaround (w1[1]); + wl[ 6] = swap_workaround (w1[2]); + wl[ 7] = swap_workaround (w1[3]); + wl[ 8] = 0; + wl[ 9] = 0; + wl[10] = 0; + wl[11] = 0; + wl[12] = 0; + wl[13] = 0; + wl[14] = 0; + wl[15] = out_len * 8; + + u32x dgst[16]; + + whirlpool_transform (wl, dgst, s_Ch, s_Cl); + + const u32x r0 = dgst[0]; + const u32x r1 = dgst[1]; + const u32x r2 = dgst[2]; + const u32x r3 = dgst[3]; + + #include VECT_COMPARE_M + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m06100_m08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m06100_m16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m06100_s04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + u32x pw_buf1[4]; + + pw_buf1[0] = pws[gid].i[ 4]; + pw_buf1[1] = pws[gid].i[ 5]; + pw_buf1[2] = pws[gid].i[ 6]; + pw_buf1[3] = pws[gid].i[ 7]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * modifier + */ + + __shared__ u32 s_Ch[8][256]; + __shared__ u32 s_Cl[8][256]; + + for (u32 i = 0; i < 8; i++) + { + s_Ch[i][lid] = Ch[i][lid]; + s_Cl[i][lid] = Cl[i][lid]; + } + + __syncthreads (); + + if (gid >= gid_max) return; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + + w0[0] = pw_buf0[0]; + w0[1] = pw_buf0[1]; + w0[2] = pw_buf0[2]; + w0[3] = pw_buf0[3]; + + u32x w1[4]; + + w1[0] = pw_buf1[0]; + w1[1] = pw_buf1[1]; + w1[2] = pw_buf1[2]; + w1[3] = pw_buf1[3]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 out_len = apply_rules (c_rules[il_pos].cmds, w0, w1, pw_len); + + append_0x80_2 (w0, w1, out_len); + + u32x wl[16]; + + wl[ 0] = swap_workaround (w0[0]); + wl[ 1] = swap_workaround (w0[1]); + wl[ 2] = swap_workaround (w0[2]); + wl[ 3] = swap_workaround (w0[3]); + wl[ 4] = swap_workaround (w1[0]); + wl[ 5] = swap_workaround (w1[1]); + wl[ 6] = swap_workaround (w1[2]); + wl[ 7] = swap_workaround (w1[3]); + wl[ 8] = 0; + wl[ 9] = 0; + wl[10] = 0; + wl[11] = 0; + wl[12] = 0; + wl[13] = 0; + wl[14] = 0; + wl[15] = out_len * 8; + + u32x dgst[16]; + + whirlpool_transform (wl, dgst, s_Ch, s_Cl); + + const u32x r0 = dgst[0]; + const u32x r1 = dgst[1]; + const u32x r2 = dgst[2]; + const u32x r3 = dgst[3]; + + #include VECT_COMPARE_S + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m06100_s08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m06100_s16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/nv/m06100_a1.cu b/nv/m06100_a1.cu new file mode 100644 index 0000000000..a058d58a68 --- /dev/null +++ b/nv/m06100_a1.cu @@ -0,0 +1,1725 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _WHIRLPOOL_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW2 +#define VECT_SIZE1 +#endif + +#define DGST_R0 0 +#define DGST_R1 1 +#define DGST_R2 2 +#define DGST_R3 3 + +#include "include/kernel_functions.c" +#include "types_nv.c" +#include "common_nv.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#define R 10 + +#ifdef VECT_SIZE1 +#define BOX(S,n,i) u32x ((S)[(n)][(i)]) +#endif + +#ifdef VECT_SIZE2 +#define BOX(S,n,i) u32x ((S)[(n)][(i).x], (S)[(n)][(i).y]) +#endif + +__device__ __constant__ u32 Ch[8][256] = +{ + { + 0x18186018, 0x23238c23, 0xc6c63fc6, 0xe8e887e8, + 0x87872687, 0xb8b8dab8, 0x01010401, 0x4f4f214f, + 0x3636d836, 0xa6a6a2a6, 0xd2d26fd2, 0xf5f5f3f5, + 0x7979f979, 0x6f6fa16f, 0x91917e91, 0x52525552, + 0x60609d60, 0xbcbccabc, 0x9b9b569b, 0x8e8e028e, + 0xa3a3b6a3, 0x0c0c300c, 0x7b7bf17b, 0x3535d435, + 0x1d1d741d, 0xe0e0a7e0, 0xd7d77bd7, 0xc2c22fc2, + 0x2e2eb82e, 0x4b4b314b, 0xfefedffe, 0x57574157, + 0x15155415, 0x7777c177, 0x3737dc37, 0xe5e5b3e5, + 0x9f9f469f, 0xf0f0e7f0, 0x4a4a354a, 0xdada4fda, + 0x58587d58, 0xc9c903c9, 0x2929a429, 0x0a0a280a, + 0xb1b1feb1, 0xa0a0baa0, 0x6b6bb16b, 0x85852e85, + 0xbdbdcebd, 0x5d5d695d, 0x10104010, 0xf4f4f7f4, + 0xcbcb0bcb, 0x3e3ef83e, 0x05051405, 0x67678167, + 0xe4e4b7e4, 0x27279c27, 0x41411941, 0x8b8b168b, + 0xa7a7a6a7, 0x7d7de97d, 0x95956e95, 0xd8d847d8, + 0xfbfbcbfb, 0xeeee9fee, 0x7c7ced7c, 0x66668566, + 0xdddd53dd, 0x17175c17, 0x47470147, 0x9e9e429e, + 0xcaca0fca, 0x2d2db42d, 0xbfbfc6bf, 0x07071c07, + 0xadad8ead, 0x5a5a755a, 0x83833683, 0x3333cc33, + 0x63639163, 0x02020802, 0xaaaa92aa, 0x7171d971, + 0xc8c807c8, 0x19196419, 0x49493949, 0xd9d943d9, + 0xf2f2eff2, 0xe3e3abe3, 0x5b5b715b, 0x88881a88, + 0x9a9a529a, 0x26269826, 0x3232c832, 0xb0b0fab0, + 0xe9e983e9, 0x0f0f3c0f, 0xd5d573d5, 0x80803a80, + 0xbebec2be, 0xcdcd13cd, 0x3434d034, 0x48483d48, + 0xffffdbff, 0x7a7af57a, 0x90907a90, 0x5f5f615f, + 0x20208020, 0x6868bd68, 0x1a1a681a, 0xaeae82ae, + 0xb4b4eab4, 0x54544d54, 0x93937693, 0x22228822, + 0x64648d64, 0xf1f1e3f1, 0x7373d173, 0x12124812, + 0x40401d40, 0x08082008, 0xc3c32bc3, 0xecec97ec, + 0xdbdb4bdb, 0xa1a1bea1, 0x8d8d0e8d, 0x3d3df43d, + 0x97976697, 0x00000000, 0xcfcf1bcf, 0x2b2bac2b, + 0x7676c576, 0x82823282, 0xd6d67fd6, 0x1b1b6c1b, + 0xb5b5eeb5, 0xafaf86af, 0x6a6ab56a, 0x50505d50, + 0x45450945, 0xf3f3ebf3, 0x3030c030, 0xefef9bef, + 0x3f3ffc3f, 0x55554955, 0xa2a2b2a2, 0xeaea8fea, + 0x65658965, 0xbabad2ba, 0x2f2fbc2f, 0xc0c027c0, + 0xdede5fde, 0x1c1c701c, 0xfdfdd3fd, 0x4d4d294d, + 0x92927292, 0x7575c975, 0x06061806, 0x8a8a128a, + 0xb2b2f2b2, 0xe6e6bfe6, 0x0e0e380e, 0x1f1f7c1f, + 0x62629562, 0xd4d477d4, 0xa8a89aa8, 0x96966296, + 0xf9f9c3f9, 0xc5c533c5, 0x25259425, 0x59597959, + 0x84842a84, 0x7272d572, 0x3939e439, 0x4c4c2d4c, + 0x5e5e655e, 0x7878fd78, 0x3838e038, 0x8c8c0a8c, + 0xd1d163d1, 0xa5a5aea5, 0xe2e2afe2, 0x61619961, + 0xb3b3f6b3, 0x21218421, 0x9c9c4a9c, 0x1e1e781e, + 0x43431143, 0xc7c73bc7, 0xfcfcd7fc, 0x04041004, + 0x51515951, 0x99995e99, 0x6d6da96d, 0x0d0d340d, + 0xfafacffa, 0xdfdf5bdf, 0x7e7ee57e, 0x24249024, + 0x3b3bec3b, 0xabab96ab, 0xcece1fce, 0x11114411, + 0x8f8f068f, 0x4e4e254e, 0xb7b7e6b7, 0xebeb8beb, + 0x3c3cf03c, 0x81813e81, 0x94946a94, 0xf7f7fbf7, + 0xb9b9deb9, 0x13134c13, 0x2c2cb02c, 0xd3d36bd3, + 0xe7e7bbe7, 0x6e6ea56e, 0xc4c437c4, 0x03030c03, + 0x56564556, 0x44440d44, 0x7f7fe17f, 0xa9a99ea9, + 0x2a2aa82a, 0xbbbbd6bb, 0xc1c123c1, 0x53535153, + 0xdcdc57dc, 0x0b0b2c0b, 0x9d9d4e9d, 0x6c6cad6c, + 0x3131c431, 0x7474cd74, 0xf6f6fff6, 0x46460546, + 0xacac8aac, 0x89891e89, 0x14145014, 0xe1e1a3e1, + 0x16165816, 0x3a3ae83a, 0x6969b969, 0x09092409, + 0x7070dd70, 0xb6b6e2b6, 0xd0d067d0, 0xeded93ed, + 0xcccc17cc, 0x42421542, 0x98985a98, 0xa4a4aaa4, + 0x2828a028, 0x5c5c6d5c, 0xf8f8c7f8, 0x86862286, + }, + { + 0xd8181860, 0x2623238c, 0xb8c6c63f, 0xfbe8e887, + 0xcb878726, 0x11b8b8da, 0x09010104, 0x0d4f4f21, + 0x9b3636d8, 0xffa6a6a2, 0x0cd2d26f, 0x0ef5f5f3, + 0x967979f9, 0x306f6fa1, 0x6d91917e, 0xf8525255, + 0x4760609d, 0x35bcbcca, 0x379b9b56, 0x8a8e8e02, + 0xd2a3a3b6, 0x6c0c0c30, 0x847b7bf1, 0x803535d4, + 0xf51d1d74, 0xb3e0e0a7, 0x21d7d77b, 0x9cc2c22f, + 0x432e2eb8, 0x294b4b31, 0x5dfefedf, 0xd5575741, + 0xbd151554, 0xe87777c1, 0x923737dc, 0x9ee5e5b3, + 0x139f9f46, 0x23f0f0e7, 0x204a4a35, 0x44dada4f, + 0xa258587d, 0xcfc9c903, 0x7c2929a4, 0x5a0a0a28, + 0x50b1b1fe, 0xc9a0a0ba, 0x146b6bb1, 0xd985852e, + 0x3cbdbdce, 0x8f5d5d69, 0x90101040, 0x07f4f4f7, + 0xddcbcb0b, 0xd33e3ef8, 0x2d050514, 0x78676781, + 0x97e4e4b7, 0x0227279c, 0x73414119, 0xa78b8b16, + 0xf6a7a7a6, 0xb27d7de9, 0x4995956e, 0x56d8d847, + 0x70fbfbcb, 0xcdeeee9f, 0xbb7c7ced, 0x71666685, + 0x7bdddd53, 0xaf17175c, 0x45474701, 0x1a9e9e42, + 0xd4caca0f, 0x582d2db4, 0x2ebfbfc6, 0x3f07071c, + 0xacadad8e, 0xb05a5a75, 0xef838336, 0xb63333cc, + 0x5c636391, 0x12020208, 0x93aaaa92, 0xde7171d9, + 0xc6c8c807, 0xd1191964, 0x3b494939, 0x5fd9d943, + 0x31f2f2ef, 0xa8e3e3ab, 0xb95b5b71, 0xbc88881a, + 0x3e9a9a52, 0x0b262698, 0xbf3232c8, 0x59b0b0fa, + 0xf2e9e983, 0x770f0f3c, 0x33d5d573, 0xf480803a, + 0x27bebec2, 0xebcdcd13, 0x893434d0, 0x3248483d, + 0x54ffffdb, 0x8d7a7af5, 0x6490907a, 0x9d5f5f61, + 0x3d202080, 0x0f6868bd, 0xca1a1a68, 0xb7aeae82, + 0x7db4b4ea, 0xce54544d, 0x7f939376, 0x2f222288, + 0x6364648d, 0x2af1f1e3, 0xcc7373d1, 0x82121248, + 0x7a40401d, 0x48080820, 0x95c3c32b, 0xdfecec97, + 0x4ddbdb4b, 0xc0a1a1be, 0x918d8d0e, 0xc83d3df4, + 0x5b979766, 0x00000000, 0xf9cfcf1b, 0x6e2b2bac, + 0xe17676c5, 0xe6828232, 0x28d6d67f, 0xc31b1b6c, + 0x74b5b5ee, 0xbeafaf86, 0x1d6a6ab5, 0xea50505d, + 0x57454509, 0x38f3f3eb, 0xad3030c0, 0xc4efef9b, + 0xda3f3ffc, 0xc7555549, 0xdba2a2b2, 0xe9eaea8f, + 0x6a656589, 0x03babad2, 0x4a2f2fbc, 0x8ec0c027, + 0x60dede5f, 0xfc1c1c70, 0x46fdfdd3, 0x1f4d4d29, + 0x76929272, 0xfa7575c9, 0x36060618, 0xae8a8a12, + 0x4bb2b2f2, 0x85e6e6bf, 0x7e0e0e38, 0xe71f1f7c, + 0x55626295, 0x3ad4d477, 0x81a8a89a, 0x52969662, + 0x62f9f9c3, 0xa3c5c533, 0x10252594, 0xab595979, + 0xd084842a, 0xc57272d5, 0xec3939e4, 0x164c4c2d, + 0x945e5e65, 0x9f7878fd, 0xe53838e0, 0x988c8c0a, + 0x17d1d163, 0xe4a5a5ae, 0xa1e2e2af, 0x4e616199, + 0x42b3b3f6, 0x34212184, 0x089c9c4a, 0xee1e1e78, + 0x61434311, 0xb1c7c73b, 0x4ffcfcd7, 0x24040410, + 0xe3515159, 0x2599995e, 0x226d6da9, 0x650d0d34, + 0x79fafacf, 0x69dfdf5b, 0xa97e7ee5, 0x19242490, + 0xfe3b3bec, 0x9aabab96, 0xf0cece1f, 0x99111144, + 0x838f8f06, 0x044e4e25, 0x66b7b7e6, 0xe0ebeb8b, + 0xc13c3cf0, 0xfd81813e, 0x4094946a, 0x1cf7f7fb, + 0x18b9b9de, 0x8b13134c, 0x512c2cb0, 0x05d3d36b, + 0x8ce7e7bb, 0x396e6ea5, 0xaac4c437, 0x1b03030c, + 0xdc565645, 0x5e44440d, 0xa07f7fe1, 0x88a9a99e, + 0x672a2aa8, 0x0abbbbd6, 0x87c1c123, 0xf1535351, + 0x72dcdc57, 0x530b0b2c, 0x019d9d4e, 0x2b6c6cad, + 0xa43131c4, 0xf37474cd, 0x15f6f6ff, 0x4c464605, + 0xa5acac8a, 0xb589891e, 0xb4141450, 0xbae1e1a3, + 0xa6161658, 0xf73a3ae8, 0x066969b9, 0x41090924, + 0xd77070dd, 0x6fb6b6e2, 0x1ed0d067, 0xd6eded93, + 0xe2cccc17, 0x68424215, 0x2c98985a, 0xeda4a4aa, + 0x752828a0, 0x865c5c6d, 0x6bf8f8c7, 0xc2868622, + }, + { + 0x30d81818, 0x46262323, 0x91b8c6c6, 0xcdfbe8e8, + 0x13cb8787, 0x6d11b8b8, 0x02090101, 0x9e0d4f4f, + 0x6c9b3636, 0x51ffa6a6, 0xb90cd2d2, 0xf70ef5f5, + 0xf2967979, 0xde306f6f, 0x3f6d9191, 0xa4f85252, + 0xc0476060, 0x6535bcbc, 0x2b379b9b, 0x018a8e8e, + 0x5bd2a3a3, 0x186c0c0c, 0xf6847b7b, 0x6a803535, + 0x3af51d1d, 0xddb3e0e0, 0xb321d7d7, 0x999cc2c2, + 0x5c432e2e, 0x96294b4b, 0xe15dfefe, 0xaed55757, + 0x2abd1515, 0xeee87777, 0x6e923737, 0xd79ee5e5, + 0x23139f9f, 0xfd23f0f0, 0x94204a4a, 0xa944dada, + 0xb0a25858, 0x8fcfc9c9, 0x527c2929, 0x145a0a0a, + 0x7f50b1b1, 0x5dc9a0a0, 0xd6146b6b, 0x17d98585, + 0x673cbdbd, 0xba8f5d5d, 0x20901010, 0xf507f4f4, + 0x8bddcbcb, 0x7cd33e3e, 0x0a2d0505, 0xce786767, + 0xd597e4e4, 0x4e022727, 0x82734141, 0x0ba78b8b, + 0x53f6a7a7, 0xfab27d7d, 0x37499595, 0xad56d8d8, + 0xeb70fbfb, 0xc1cdeeee, 0xf8bb7c7c, 0xcc716666, + 0xa77bdddd, 0x2eaf1717, 0x8e454747, 0x211a9e9e, + 0x89d4caca, 0x5a582d2d, 0x632ebfbf, 0x0e3f0707, + 0x47acadad, 0xb4b05a5a, 0x1bef8383, 0x66b63333, + 0xc65c6363, 0x04120202, 0x4993aaaa, 0xe2de7171, + 0x8dc6c8c8, 0x32d11919, 0x923b4949, 0xaf5fd9d9, + 0xf931f2f2, 0xdba8e3e3, 0xb6b95b5b, 0x0dbc8888, + 0x293e9a9a, 0x4c0b2626, 0x64bf3232, 0x7d59b0b0, + 0xcff2e9e9, 0x1e770f0f, 0xb733d5d5, 0x1df48080, + 0x6127bebe, 0x87ebcdcd, 0x68893434, 0x90324848, + 0xe354ffff, 0xf48d7a7a, 0x3d649090, 0xbe9d5f5f, + 0x403d2020, 0xd00f6868, 0x34ca1a1a, 0x41b7aeae, + 0x757db4b4, 0xa8ce5454, 0x3b7f9393, 0x442f2222, + 0xc8636464, 0xff2af1f1, 0xe6cc7373, 0x24821212, + 0x807a4040, 0x10480808, 0x9b95c3c3, 0xc5dfecec, + 0xab4ddbdb, 0x5fc0a1a1, 0x07918d8d, 0x7ac83d3d, + 0x335b9797, 0x00000000, 0x83f9cfcf, 0x566e2b2b, + 0xece17676, 0x19e68282, 0xb128d6d6, 0x36c31b1b, + 0x7774b5b5, 0x43beafaf, 0xd41d6a6a, 0xa0ea5050, + 0x8a574545, 0xfb38f3f3, 0x60ad3030, 0xc3c4efef, + 0x7eda3f3f, 0xaac75555, 0x59dba2a2, 0xc9e9eaea, + 0xca6a6565, 0x6903baba, 0x5e4a2f2f, 0x9d8ec0c0, + 0xa160dede, 0x38fc1c1c, 0xe746fdfd, 0x9a1f4d4d, + 0x39769292, 0xeafa7575, 0x0c360606, 0x09ae8a8a, + 0x794bb2b2, 0xd185e6e6, 0x1c7e0e0e, 0x3ee71f1f, + 0xc4556262, 0xb53ad4d4, 0x4d81a8a8, 0x31529696, + 0xef62f9f9, 0x97a3c5c5, 0x4a102525, 0xb2ab5959, + 0x15d08484, 0xe4c57272, 0x72ec3939, 0x98164c4c, + 0xbc945e5e, 0xf09f7878, 0x70e53838, 0x05988c8c, + 0xbf17d1d1, 0x57e4a5a5, 0xd9a1e2e2, 0xc24e6161, + 0x7b42b3b3, 0x42342121, 0x25089c9c, 0x3cee1e1e, + 0x86614343, 0x93b1c7c7, 0xe54ffcfc, 0x08240404, + 0xa2e35151, 0x2f259999, 0xda226d6d, 0x1a650d0d, + 0xe979fafa, 0xa369dfdf, 0xfca97e7e, 0x48192424, + 0x76fe3b3b, 0x4b9aabab, 0x81f0cece, 0x22991111, + 0x03838f8f, 0x9c044e4e, 0x7366b7b7, 0xcbe0ebeb, + 0x78c13c3c, 0x1ffd8181, 0x35409494, 0xf31cf7f7, + 0x6f18b9b9, 0x268b1313, 0x58512c2c, 0xbb05d3d3, + 0xd38ce7e7, 0xdc396e6e, 0x95aac4c4, 0x061b0303, + 0xacdc5656, 0x885e4444, 0xfea07f7f, 0x4f88a9a9, + 0x54672a2a, 0x6b0abbbb, 0x9f87c1c1, 0xa6f15353, + 0xa572dcdc, 0x16530b0b, 0x27019d9d, 0xd82b6c6c, + 0x62a43131, 0xe8f37474, 0xf115f6f6, 0x8c4c4646, + 0x45a5acac, 0x0fb58989, 0x28b41414, 0xdfbae1e1, + 0x2ca61616, 0x74f73a3a, 0xd2066969, 0x12410909, + 0xe0d77070, 0x716fb6b6, 0xbd1ed0d0, 0xc7d6eded, + 0x85e2cccc, 0x84684242, 0x2d2c9898, 0x55eda4a4, + 0x50752828, 0xb8865c5c, 0xed6bf8f8, 0x11c28686, + }, + { + 0x7830d818, 0xaf462623, 0xf991b8c6, 0x6fcdfbe8, + 0xa113cb87, 0x626d11b8, 0x05020901, 0x6e9e0d4f, + 0xee6c9b36, 0x0451ffa6, 0xbdb90cd2, 0x06f70ef5, + 0x80f29679, 0xcede306f, 0xef3f6d91, 0x07a4f852, + 0xfdc04760, 0x766535bc, 0xcd2b379b, 0x8c018a8e, + 0x155bd2a3, 0x3c186c0c, 0x8af6847b, 0xe16a8035, + 0x693af51d, 0x47ddb3e0, 0xacb321d7, 0xed999cc2, + 0x965c432e, 0x7a96294b, 0x21e15dfe, 0x16aed557, + 0x412abd15, 0xb6eee877, 0xeb6e9237, 0x56d79ee5, + 0xd923139f, 0x17fd23f0, 0x7f94204a, 0x95a944da, + 0x25b0a258, 0xca8fcfc9, 0x8d527c29, 0x22145a0a, + 0x4f7f50b1, 0x1a5dc9a0, 0xdad6146b, 0xab17d985, + 0x73673cbd, 0x34ba8f5d, 0x50209010, 0x03f507f4, + 0xc08bddcb, 0xc67cd33e, 0x110a2d05, 0xe6ce7867, + 0x53d597e4, 0xbb4e0227, 0x58827341, 0x9d0ba78b, + 0x0153f6a7, 0x94fab27d, 0xfb374995, 0x9fad56d8, + 0x30eb70fb, 0x71c1cdee, 0x91f8bb7c, 0xe3cc7166, + 0x8ea77bdd, 0x4b2eaf17, 0x468e4547, 0xdc211a9e, + 0xc589d4ca, 0x995a582d, 0x79632ebf, 0x1b0e3f07, + 0x2347acad, 0x2fb4b05a, 0xb51bef83, 0xff66b633, + 0xf2c65c63, 0x0a041202, 0x384993aa, 0xa8e2de71, + 0xcf8dc6c8, 0x7d32d119, 0x70923b49, 0x9aaf5fd9, + 0x1df931f2, 0x48dba8e3, 0x2ab6b95b, 0x920dbc88, + 0xc8293e9a, 0xbe4c0b26, 0xfa64bf32, 0x4a7d59b0, + 0x6acff2e9, 0x331e770f, 0xa6b733d5, 0xba1df480, + 0x7c6127be, 0xde87ebcd, 0xe4688934, 0x75903248, + 0x24e354ff, 0x8ff48d7a, 0xea3d6490, 0x3ebe9d5f, + 0xa0403d20, 0xd5d00f68, 0x7234ca1a, 0x2c41b7ae, + 0x5e757db4, 0x19a8ce54, 0xe53b7f93, 0xaa442f22, + 0xe9c86364, 0x12ff2af1, 0xa2e6cc73, 0x5a248212, + 0x5d807a40, 0x28104808, 0xe89b95c3, 0x7bc5dfec, + 0x90ab4ddb, 0x1f5fc0a1, 0x8307918d, 0xc97ac83d, + 0xf1335b97, 0x00000000, 0xd483f9cf, 0x87566e2b, + 0xb3ece176, 0xb019e682, 0xa9b128d6, 0x7736c31b, + 0x5b7774b5, 0x2943beaf, 0xdfd41d6a, 0x0da0ea50, + 0x4c8a5745, 0x18fb38f3, 0xf060ad30, 0x74c3c4ef, + 0xc37eda3f, 0x1caac755, 0x1059dba2, 0x65c9e9ea, + 0xecca6a65, 0x686903ba, 0x935e4a2f, 0xe79d8ec0, + 0x81a160de, 0x6c38fc1c, 0x2ee746fd, 0x649a1f4d, + 0xe0397692, 0xbceafa75, 0x1e0c3606, 0x9809ae8a, + 0x40794bb2, 0x59d185e6, 0x361c7e0e, 0x633ee71f, + 0xf7c45562, 0xa3b53ad4, 0x324d81a8, 0xf4315296, + 0x3aef62f9, 0xf697a3c5, 0xb14a1025, 0x20b2ab59, + 0xae15d084, 0xa7e4c572, 0xdd72ec39, 0x6198164c, + 0x3bbc945e, 0x85f09f78, 0xd870e538, 0x8605988c, + 0xb2bf17d1, 0x0b57e4a5, 0x4dd9a1e2, 0xf8c24e61, + 0x457b42b3, 0xa5423421, 0xd625089c, 0x663cee1e, + 0x52866143, 0xfc93b1c7, 0x2be54ffc, 0x14082404, + 0x08a2e351, 0xc72f2599, 0xc4da226d, 0x391a650d, + 0x35e979fa, 0x84a369df, 0x9bfca97e, 0xb4481924, + 0xd776fe3b, 0x3d4b9aab, 0xd181f0ce, 0x55229911, + 0x8903838f, 0x6b9c044e, 0x517366b7, 0x60cbe0eb, + 0xcc78c13c, 0xbf1ffd81, 0xfe354094, 0x0cf31cf7, + 0x676f18b9, 0x5f268b13, 0x9c58512c, 0xb8bb05d3, + 0x5cd38ce7, 0xcbdc396e, 0xf395aac4, 0x0f061b03, + 0x13acdc56, 0x49885e44, 0x9efea07f, 0x374f88a9, + 0x8254672a, 0x6d6b0abb, 0xe29f87c1, 0x02a6f153, + 0x8ba572dc, 0x2716530b, 0xd327019d, 0xc1d82b6c, + 0xf562a431, 0xb9e8f374, 0x09f115f6, 0x438c4c46, + 0x2645a5ac, 0x970fb589, 0x4428b414, 0x42dfbae1, + 0x4e2ca616, 0xd274f73a, 0xd0d20669, 0x2d124109, + 0xade0d770, 0x54716fb6, 0xb7bd1ed0, 0x7ec7d6ed, + 0xdb85e2cc, 0x57846842, 0xc22d2c98, 0x0e55eda4, + 0x88507528, 0x31b8865c, 0x3fed6bf8, 0xa411c286, + }, + { + 0xc07830d8, 0x05af4626, 0x7ef991b8, 0x136fcdfb, + 0x4ca113cb, 0xa9626d11, 0x08050209, 0x426e9e0d, + 0xadee6c9b, 0x590451ff, 0xdebdb90c, 0xfb06f70e, + 0xef80f296, 0x5fcede30, 0xfcef3f6d, 0xaa07a4f8, + 0x27fdc047, 0x89766535, 0xaccd2b37, 0x048c018a, + 0x71155bd2, 0x603c186c, 0xff8af684, 0xb5e16a80, + 0xe8693af5, 0x5347ddb3, 0xf6acb321, 0x5eed999c, + 0x6d965c43, 0x627a9629, 0xa321e15d, 0x8216aed5, + 0xa8412abd, 0x9fb6eee8, 0xa5eb6e92, 0x7b56d79e, + 0x8cd92313, 0xd317fd23, 0x6a7f9420, 0x9e95a944, + 0xfa25b0a2, 0x06ca8fcf, 0x558d527c, 0x5022145a, + 0xe14f7f50, 0x691a5dc9, 0x7fdad614, 0x5cab17d9, + 0x8173673c, 0xd234ba8f, 0x80502090, 0xf303f507, + 0x16c08bdd, 0xedc67cd3, 0x28110a2d, 0x1fe6ce78, + 0x7353d597, 0x25bb4e02, 0x32588273, 0x2c9d0ba7, + 0x510153f6, 0xcf94fab2, 0xdcfb3749, 0x8e9fad56, + 0x8b30eb70, 0x2371c1cd, 0xc791f8bb, 0x17e3cc71, + 0xa68ea77b, 0xb84b2eaf, 0x02468e45, 0x84dc211a, + 0x1ec589d4, 0x75995a58, 0x9179632e, 0x381b0e3f, + 0x012347ac, 0xea2fb4b0, 0x6cb51bef, 0x85ff66b6, + 0x3ff2c65c, 0x100a0412, 0x39384993, 0xafa8e2de, + 0x0ecf8dc6, 0xc87d32d1, 0x7270923b, 0x869aaf5f, + 0xc31df931, 0x4b48dba8, 0xe22ab6b9, 0x34920dbc, + 0xa4c8293e, 0x2dbe4c0b, 0x8dfa64bf, 0xe94a7d59, + 0x1b6acff2, 0x78331e77, 0xe6a6b733, 0x74ba1df4, + 0x997c6127, 0x26de87eb, 0xbde46889, 0x7a759032, + 0xab24e354, 0xf78ff48d, 0xf4ea3d64, 0xc23ebe9d, + 0x1da0403d, 0x67d5d00f, 0xd07234ca, 0x192c41b7, + 0xc95e757d, 0x9a19a8ce, 0xece53b7f, 0x0daa442f, + 0x07e9c863, 0xdb12ff2a, 0xbfa2e6cc, 0x905a2482, + 0x3a5d807a, 0x40281048, 0x56e89b95, 0x337bc5df, + 0x9690ab4d, 0x611f5fc0, 0x1c830791, 0xf5c97ac8, + 0xccf1335b, 0x00000000, 0x36d483f9, 0x4587566e, + 0x97b3ece1, 0x64b019e6, 0xfea9b128, 0xd87736c3, + 0xc15b7774, 0x112943be, 0x77dfd41d, 0xba0da0ea, + 0x124c8a57, 0xcb18fb38, 0x9df060ad, 0x2b74c3c4, + 0xe5c37eda, 0x921caac7, 0x791059db, 0x0365c9e9, + 0x0fecca6a, 0xb9686903, 0x65935e4a, 0x4ee79d8e, + 0xbe81a160, 0xe06c38fc, 0xbb2ee746, 0x52649a1f, + 0xe4e03976, 0x8fbceafa, 0x301e0c36, 0x249809ae, + 0xf940794b, 0x6359d185, 0x70361c7e, 0xf8633ee7, + 0x37f7c455, 0xeea3b53a, 0x29324d81, 0xc4f43152, + 0x9b3aef62, 0x66f697a3, 0x35b14a10, 0xf220b2ab, + 0x54ae15d0, 0xb7a7e4c5, 0xd5dd72ec, 0x5a619816, + 0xca3bbc94, 0xe785f09f, 0xddd870e5, 0x14860598, + 0xc6b2bf17, 0x410b57e4, 0x434dd9a1, 0x2ff8c24e, + 0xf1457b42, 0x15a54234, 0x94d62508, 0xf0663cee, + 0x22528661, 0x76fc93b1, 0xb32be54f, 0x20140824, + 0xb208a2e3, 0xbcc72f25, 0x4fc4da22, 0x68391a65, + 0x8335e979, 0xb684a369, 0xd79bfca9, 0x3db44819, + 0xc5d776fe, 0x313d4b9a, 0x3ed181f0, 0x88552299, + 0x0c890383, 0x4a6b9c04, 0xd1517366, 0x0b60cbe0, + 0xfdcc78c1, 0x7cbf1ffd, 0xd4fe3540, 0xeb0cf31c, + 0xa1676f18, 0x985f268b, 0x7d9c5851, 0xd6b8bb05, + 0x6b5cd38c, 0x57cbdc39, 0x6ef395aa, 0x180f061b, + 0x8a13acdc, 0x1a49885e, 0xdf9efea0, 0x21374f88, + 0x4d825467, 0xb16d6b0a, 0x46e29f87, 0xa202a6f1, + 0xae8ba572, 0x58271653, 0x9cd32701, 0x47c1d82b, + 0x95f562a4, 0x87b9e8f3, 0xe309f115, 0x0a438c4c, + 0x092645a5, 0x3c970fb5, 0xa04428b4, 0x5b42dfba, + 0xb04e2ca6, 0xcdd274f7, 0x6fd0d206, 0x482d1241, + 0xa7ade0d7, 0xd954716f, 0xceb7bd1e, 0x3b7ec7d6, + 0x2edb85e2, 0x2a578468, 0xb4c22d2c, 0x490e55ed, + 0x5d885075, 0xda31b886, 0x933fed6b, 0x44a411c2, + }, + { + 0x18c07830, 0x2305af46, 0xc67ef991, 0xe8136fcd, + 0x874ca113, 0xb8a9626d, 0x01080502, 0x4f426e9e, + 0x36adee6c, 0xa6590451, 0xd2debdb9, 0xf5fb06f7, + 0x79ef80f2, 0x6f5fcede, 0x91fcef3f, 0x52aa07a4, + 0x6027fdc0, 0xbc897665, 0x9baccd2b, 0x8e048c01, + 0xa371155b, 0x0c603c18, 0x7bff8af6, 0x35b5e16a, + 0x1de8693a, 0xe05347dd, 0xd7f6acb3, 0xc25eed99, + 0x2e6d965c, 0x4b627a96, 0xfea321e1, 0x578216ae, + 0x15a8412a, 0x779fb6ee, 0x37a5eb6e, 0xe57b56d7, + 0x9f8cd923, 0xf0d317fd, 0x4a6a7f94, 0xda9e95a9, + 0x58fa25b0, 0xc906ca8f, 0x29558d52, 0x0a502214, + 0xb1e14f7f, 0xa0691a5d, 0x6b7fdad6, 0x855cab17, + 0xbd817367, 0x5dd234ba, 0x10805020, 0xf4f303f5, + 0xcb16c08b, 0x3eedc67c, 0x0528110a, 0x671fe6ce, + 0xe47353d5, 0x2725bb4e, 0x41325882, 0x8b2c9d0b, + 0xa7510153, 0x7dcf94fa, 0x95dcfb37, 0xd88e9fad, + 0xfb8b30eb, 0xee2371c1, 0x7cc791f8, 0x6617e3cc, + 0xdda68ea7, 0x17b84b2e, 0x4702468e, 0x9e84dc21, + 0xca1ec589, 0x2d75995a, 0xbf917963, 0x07381b0e, + 0xad012347, 0x5aea2fb4, 0x836cb51b, 0x3385ff66, + 0x633ff2c6, 0x02100a04, 0xaa393849, 0x71afa8e2, + 0xc80ecf8d, 0x19c87d32, 0x49727092, 0xd9869aaf, + 0xf2c31df9, 0xe34b48db, 0x5be22ab6, 0x8834920d, + 0x9aa4c829, 0x262dbe4c, 0x328dfa64, 0xb0e94a7d, + 0xe91b6acf, 0x0f78331e, 0xd5e6a6b7, 0x8074ba1d, + 0xbe997c61, 0xcd26de87, 0x34bde468, 0x487a7590, + 0xffab24e3, 0x7af78ff4, 0x90f4ea3d, 0x5fc23ebe, + 0x201da040, 0x6867d5d0, 0x1ad07234, 0xae192c41, + 0xb4c95e75, 0x549a19a8, 0x93ece53b, 0x220daa44, + 0x6407e9c8, 0xf1db12ff, 0x73bfa2e6, 0x12905a24, + 0x403a5d80, 0x08402810, 0xc356e89b, 0xec337bc5, + 0xdb9690ab, 0xa1611f5f, 0x8d1c8307, 0x3df5c97a, + 0x97ccf133, 0x00000000, 0xcf36d483, 0x2b458756, + 0x7697b3ec, 0x8264b019, 0xd6fea9b1, 0x1bd87736, + 0xb5c15b77, 0xaf112943, 0x6a77dfd4, 0x50ba0da0, + 0x45124c8a, 0xf3cb18fb, 0x309df060, 0xef2b74c3, + 0x3fe5c37e, 0x55921caa, 0xa2791059, 0xea0365c9, + 0x650fecca, 0xbab96869, 0x2f65935e, 0xc04ee79d, + 0xdebe81a1, 0x1ce06c38, 0xfdbb2ee7, 0x4d52649a, + 0x92e4e039, 0x758fbcea, 0x06301e0c, 0x8a249809, + 0xb2f94079, 0xe66359d1, 0x0e70361c, 0x1ff8633e, + 0x6237f7c4, 0xd4eea3b5, 0xa829324d, 0x96c4f431, + 0xf99b3aef, 0xc566f697, 0x2535b14a, 0x59f220b2, + 0x8454ae15, 0x72b7a7e4, 0x39d5dd72, 0x4c5a6198, + 0x5eca3bbc, 0x78e785f0, 0x38ddd870, 0x8c148605, + 0xd1c6b2bf, 0xa5410b57, 0xe2434dd9, 0x612ff8c2, + 0xb3f1457b, 0x2115a542, 0x9c94d625, 0x1ef0663c, + 0x43225286, 0xc776fc93, 0xfcb32be5, 0x04201408, + 0x51b208a2, 0x99bcc72f, 0x6d4fc4da, 0x0d68391a, + 0xfa8335e9, 0xdfb684a3, 0x7ed79bfc, 0x243db448, + 0x3bc5d776, 0xab313d4b, 0xce3ed181, 0x11885522, + 0x8f0c8903, 0x4e4a6b9c, 0xb7d15173, 0xeb0b60cb, + 0x3cfdcc78, 0x817cbf1f, 0x94d4fe35, 0xf7eb0cf3, + 0xb9a1676f, 0x13985f26, 0x2c7d9c58, 0xd3d6b8bb, + 0xe76b5cd3, 0x6e57cbdc, 0xc46ef395, 0x03180f06, + 0x568a13ac, 0x441a4988, 0x7fdf9efe, 0xa921374f, + 0x2a4d8254, 0xbbb16d6b, 0xc146e29f, 0x53a202a6, + 0xdcae8ba5, 0x0b582716, 0x9d9cd327, 0x6c47c1d8, + 0x3195f562, 0x7487b9e8, 0xf6e309f1, 0x460a438c, + 0xac092645, 0x893c970f, 0x14a04428, 0xe15b42df, + 0x16b04e2c, 0x3acdd274, 0x696fd0d2, 0x09482d12, + 0x70a7ade0, 0xb6d95471, 0xd0ceb7bd, 0xed3b7ec7, + 0xcc2edb85, 0x422a5784, 0x98b4c22d, 0xa4490e55, + 0x285d8850, 0x5cda31b8, 0xf8933fed, 0x8644a411, + }, + { + 0x6018c078, 0x8c2305af, 0x3fc67ef9, 0x87e8136f, + 0x26874ca1, 0xdab8a962, 0x04010805, 0x214f426e, + 0xd836adee, 0xa2a65904, 0x6fd2debd, 0xf3f5fb06, + 0xf979ef80, 0xa16f5fce, 0x7e91fcef, 0x5552aa07, + 0x9d6027fd, 0xcabc8976, 0x569baccd, 0x028e048c, + 0xb6a37115, 0x300c603c, 0xf17bff8a, 0xd435b5e1, + 0x741de869, 0xa7e05347, 0x7bd7f6ac, 0x2fc25eed, + 0xb82e6d96, 0x314b627a, 0xdffea321, 0x41578216, + 0x5415a841, 0xc1779fb6, 0xdc37a5eb, 0xb3e57b56, + 0x469f8cd9, 0xe7f0d317, 0x354a6a7f, 0x4fda9e95, + 0x7d58fa25, 0x03c906ca, 0xa429558d, 0x280a5022, + 0xfeb1e14f, 0xbaa0691a, 0xb16b7fda, 0x2e855cab, + 0xcebd8173, 0x695dd234, 0x40108050, 0xf7f4f303, + 0x0bcb16c0, 0xf83eedc6, 0x14052811, 0x81671fe6, + 0xb7e47353, 0x9c2725bb, 0x19413258, 0x168b2c9d, + 0xa6a75101, 0xe97dcf94, 0x6e95dcfb, 0x47d88e9f, + 0xcbfb8b30, 0x9fee2371, 0xed7cc791, 0x856617e3, + 0x53dda68e, 0x5c17b84b, 0x01470246, 0x429e84dc, + 0x0fca1ec5, 0xb42d7599, 0xc6bf9179, 0x1c07381b, + 0x8ead0123, 0x755aea2f, 0x36836cb5, 0xcc3385ff, + 0x91633ff2, 0x0802100a, 0x92aa3938, 0xd971afa8, + 0x07c80ecf, 0x6419c87d, 0x39497270, 0x43d9869a, + 0xeff2c31d, 0xabe34b48, 0x715be22a, 0x1a883492, + 0x529aa4c8, 0x98262dbe, 0xc8328dfa, 0xfab0e94a, + 0x83e91b6a, 0x3c0f7833, 0x73d5e6a6, 0x3a8074ba, + 0xc2be997c, 0x13cd26de, 0xd034bde4, 0x3d487a75, + 0xdbffab24, 0xf57af78f, 0x7a90f4ea, 0x615fc23e, + 0x80201da0, 0xbd6867d5, 0x681ad072, 0x82ae192c, + 0xeab4c95e, 0x4d549a19, 0x7693ece5, 0x88220daa, + 0x8d6407e9, 0xe3f1db12, 0xd173bfa2, 0x4812905a, + 0x1d403a5d, 0x20084028, 0x2bc356e8, 0x97ec337b, + 0x4bdb9690, 0xbea1611f, 0x0e8d1c83, 0xf43df5c9, + 0x6697ccf1, 0x00000000, 0x1bcf36d4, 0xac2b4587, + 0xc57697b3, 0x328264b0, 0x7fd6fea9, 0x6c1bd877, + 0xeeb5c15b, 0x86af1129, 0xb56a77df, 0x5d50ba0d, + 0x0945124c, 0xebf3cb18, 0xc0309df0, 0x9bef2b74, + 0xfc3fe5c3, 0x4955921c, 0xb2a27910, 0x8fea0365, + 0x89650fec, 0xd2bab968, 0xbc2f6593, 0x27c04ee7, + 0x5fdebe81, 0x701ce06c, 0xd3fdbb2e, 0x294d5264, + 0x7292e4e0, 0xc9758fbc, 0x1806301e, 0x128a2498, + 0xf2b2f940, 0xbfe66359, 0x380e7036, 0x7c1ff863, + 0x956237f7, 0x77d4eea3, 0x9aa82932, 0x6296c4f4, + 0xc3f99b3a, 0x33c566f6, 0x942535b1, 0x7959f220, + 0x2a8454ae, 0xd572b7a7, 0xe439d5dd, 0x2d4c5a61, + 0x655eca3b, 0xfd78e785, 0xe038ddd8, 0x0a8c1486, + 0x63d1c6b2, 0xaea5410b, 0xafe2434d, 0x99612ff8, + 0xf6b3f145, 0x842115a5, 0x4a9c94d6, 0x781ef066, + 0x11432252, 0x3bc776fc, 0xd7fcb32b, 0x10042014, + 0x5951b208, 0x5e99bcc7, 0xa96d4fc4, 0x340d6839, + 0xcffa8335, 0x5bdfb684, 0xe57ed79b, 0x90243db4, + 0xec3bc5d7, 0x96ab313d, 0x1fce3ed1, 0x44118855, + 0x068f0c89, 0x254e4a6b, 0xe6b7d151, 0x8beb0b60, + 0xf03cfdcc, 0x3e817cbf, 0x6a94d4fe, 0xfbf7eb0c, + 0xdeb9a167, 0x4c13985f, 0xb02c7d9c, 0x6bd3d6b8, + 0xbbe76b5c, 0xa56e57cb, 0x37c46ef3, 0x0c03180f, + 0x45568a13, 0x0d441a49, 0xe17fdf9e, 0x9ea92137, + 0xa82a4d82, 0xd6bbb16d, 0x23c146e2, 0x5153a202, + 0x57dcae8b, 0x2c0b5827, 0x4e9d9cd3, 0xad6c47c1, + 0xc43195f5, 0xcd7487b9, 0xfff6e309, 0x05460a43, + 0x8aac0926, 0x1e893c97, 0x5014a044, 0xa3e15b42, + 0x5816b04e, 0xe83acdd2, 0xb9696fd0, 0x2409482d, + 0xdd70a7ad, 0xe2b6d954, 0x67d0ceb7, 0x93ed3b7e, + 0x17cc2edb, 0x15422a57, 0x5a98b4c2, 0xaaa4490e, + 0xa0285d88, 0x6d5cda31, 0xc7f8933f, 0x228644a4, + }, + { + 0x186018c0, 0x238c2305, 0xc63fc67e, 0xe887e813, + 0x8726874c, 0xb8dab8a9, 0x01040108, 0x4f214f42, + 0x36d836ad, 0xa6a2a659, 0xd26fd2de, 0xf5f3f5fb, + 0x79f979ef, 0x6fa16f5f, 0x917e91fc, 0x525552aa, + 0x609d6027, 0xbccabc89, 0x9b569bac, 0x8e028e04, + 0xa3b6a371, 0x0c300c60, 0x7bf17bff, 0x35d435b5, + 0x1d741de8, 0xe0a7e053, 0xd77bd7f6, 0xc22fc25e, + 0x2eb82e6d, 0x4b314b62, 0xfedffea3, 0x57415782, + 0x155415a8, 0x77c1779f, 0x37dc37a5, 0xe5b3e57b, + 0x9f469f8c, 0xf0e7f0d3, 0x4a354a6a, 0xda4fda9e, + 0x587d58fa, 0xc903c906, 0x29a42955, 0x0a280a50, + 0xb1feb1e1, 0xa0baa069, 0x6bb16b7f, 0x852e855c, + 0xbdcebd81, 0x5d695dd2, 0x10401080, 0xf4f7f4f3, + 0xcb0bcb16, 0x3ef83eed, 0x05140528, 0x6781671f, + 0xe4b7e473, 0x279c2725, 0x41194132, 0x8b168b2c, + 0xa7a6a751, 0x7de97dcf, 0x956e95dc, 0xd847d88e, + 0xfbcbfb8b, 0xee9fee23, 0x7ced7cc7, 0x66856617, + 0xdd53dda6, 0x175c17b8, 0x47014702, 0x9e429e84, + 0xca0fca1e, 0x2db42d75, 0xbfc6bf91, 0x071c0738, + 0xad8ead01, 0x5a755aea, 0x8336836c, 0x33cc3385, + 0x6391633f, 0x02080210, 0xaa92aa39, 0x71d971af, + 0xc807c80e, 0x196419c8, 0x49394972, 0xd943d986, + 0xf2eff2c3, 0xe3abe34b, 0x5b715be2, 0x881a8834, + 0x9a529aa4, 0x2698262d, 0x32c8328d, 0xb0fab0e9, + 0xe983e91b, 0x0f3c0f78, 0xd573d5e6, 0x803a8074, + 0xbec2be99, 0xcd13cd26, 0x34d034bd, 0x483d487a, + 0xffdbffab, 0x7af57af7, 0x907a90f4, 0x5f615fc2, + 0x2080201d, 0x68bd6867, 0x1a681ad0, 0xae82ae19, + 0xb4eab4c9, 0x544d549a, 0x937693ec, 0x2288220d, + 0x648d6407, 0xf1e3f1db, 0x73d173bf, 0x12481290, + 0x401d403a, 0x08200840, 0xc32bc356, 0xec97ec33, + 0xdb4bdb96, 0xa1bea161, 0x8d0e8d1c, 0x3df43df5, + 0x976697cc, 0x00000000, 0xcf1bcf36, 0x2bac2b45, + 0x76c57697, 0x82328264, 0xd67fd6fe, 0x1b6c1bd8, + 0xb5eeb5c1, 0xaf86af11, 0x6ab56a77, 0x505d50ba, + 0x45094512, 0xf3ebf3cb, 0x30c0309d, 0xef9bef2b, + 0x3ffc3fe5, 0x55495592, 0xa2b2a279, 0xea8fea03, + 0x6589650f, 0xbad2bab9, 0x2fbc2f65, 0xc027c04e, + 0xde5fdebe, 0x1c701ce0, 0xfdd3fdbb, 0x4d294d52, + 0x927292e4, 0x75c9758f, 0x06180630, 0x8a128a24, + 0xb2f2b2f9, 0xe6bfe663, 0x0e380e70, 0x1f7c1ff8, + 0x62956237, 0xd477d4ee, 0xa89aa829, 0x966296c4, + 0xf9c3f99b, 0xc533c566, 0x25942535, 0x597959f2, + 0x842a8454, 0x72d572b7, 0x39e439d5, 0x4c2d4c5a, + 0x5e655eca, 0x78fd78e7, 0x38e038dd, 0x8c0a8c14, + 0xd163d1c6, 0xa5aea541, 0xe2afe243, 0x6199612f, + 0xb3f6b3f1, 0x21842115, 0x9c4a9c94, 0x1e781ef0, + 0x43114322, 0xc73bc776, 0xfcd7fcb3, 0x04100420, + 0x515951b2, 0x995e99bc, 0x6da96d4f, 0x0d340d68, + 0xfacffa83, 0xdf5bdfb6, 0x7ee57ed7, 0x2490243d, + 0x3bec3bc5, 0xab96ab31, 0xce1fce3e, 0x11441188, + 0x8f068f0c, 0x4e254e4a, 0xb7e6b7d1, 0xeb8beb0b, + 0x3cf03cfd, 0x813e817c, 0x946a94d4, 0xf7fbf7eb, + 0xb9deb9a1, 0x134c1398, 0x2cb02c7d, 0xd36bd3d6, + 0xe7bbe76b, 0x6ea56e57, 0xc437c46e, 0x030c0318, + 0x5645568a, 0x440d441a, 0x7fe17fdf, 0xa99ea921, + 0x2aa82a4d, 0xbbd6bbb1, 0xc123c146, 0x535153a2, + 0xdc57dcae, 0x0b2c0b58, 0x9d4e9d9c, 0x6cad6c47, + 0x31c43195, 0x74cd7487, 0xf6fff6e3, 0x4605460a, + 0xac8aac09, 0x891e893c, 0x145014a0, 0xe1a3e15b, + 0x165816b0, 0x3ae83acd, 0x69b9696f, 0x09240948, + 0x70dd70a7, 0xb6e2b6d9, 0xd067d0ce, 0xed93ed3b, + 0xcc17cc2e, 0x4215422a, 0x985a98b4, 0xa4aaa449, + 0x28a0285d, 0x5c6d5cda, 0xf8c7f893, 0x86228644, + } +}; + +__device__ __constant__ u32 Cl[8][256] = +{ + { + 0xc07830d8, 0x05af4626, 0x7ef991b8, 0x136fcdfb, + 0x4ca113cb, 0xa9626d11, 0x08050209, 0x426e9e0d, + 0xadee6c9b, 0x590451ff, 0xdebdb90c, 0xfb06f70e, + 0xef80f296, 0x5fcede30, 0xfcef3f6d, 0xaa07a4f8, + 0x27fdc047, 0x89766535, 0xaccd2b37, 0x048c018a, + 0x71155bd2, 0x603c186c, 0xff8af684, 0xb5e16a80, + 0xe8693af5, 0x5347ddb3, 0xf6acb321, 0x5eed999c, + 0x6d965c43, 0x627a9629, 0xa321e15d, 0x8216aed5, + 0xa8412abd, 0x9fb6eee8, 0xa5eb6e92, 0x7b56d79e, + 0x8cd92313, 0xd317fd23, 0x6a7f9420, 0x9e95a944, + 0xfa25b0a2, 0x06ca8fcf, 0x558d527c, 0x5022145a, + 0xe14f7f50, 0x691a5dc9, 0x7fdad614, 0x5cab17d9, + 0x8173673c, 0xd234ba8f, 0x80502090, 0xf303f507, + 0x16c08bdd, 0xedc67cd3, 0x28110a2d, 0x1fe6ce78, + 0x7353d597, 0x25bb4e02, 0x32588273, 0x2c9d0ba7, + 0x510153f6, 0xcf94fab2, 0xdcfb3749, 0x8e9fad56, + 0x8b30eb70, 0x2371c1cd, 0xc791f8bb, 0x17e3cc71, + 0xa68ea77b, 0xb84b2eaf, 0x02468e45, 0x84dc211a, + 0x1ec589d4, 0x75995a58, 0x9179632e, 0x381b0e3f, + 0x012347ac, 0xea2fb4b0, 0x6cb51bef, 0x85ff66b6, + 0x3ff2c65c, 0x100a0412, 0x39384993, 0xafa8e2de, + 0x0ecf8dc6, 0xc87d32d1, 0x7270923b, 0x869aaf5f, + 0xc31df931, 0x4b48dba8, 0xe22ab6b9, 0x34920dbc, + 0xa4c8293e, 0x2dbe4c0b, 0x8dfa64bf, 0xe94a7d59, + 0x1b6acff2, 0x78331e77, 0xe6a6b733, 0x74ba1df4, + 0x997c6127, 0x26de87eb, 0xbde46889, 0x7a759032, + 0xab24e354, 0xf78ff48d, 0xf4ea3d64, 0xc23ebe9d, + 0x1da0403d, 0x67d5d00f, 0xd07234ca, 0x192c41b7, + 0xc95e757d, 0x9a19a8ce, 0xece53b7f, 0x0daa442f, + 0x07e9c863, 0xdb12ff2a, 0xbfa2e6cc, 0x905a2482, + 0x3a5d807a, 0x40281048, 0x56e89b95, 0x337bc5df, + 0x9690ab4d, 0x611f5fc0, 0x1c830791, 0xf5c97ac8, + 0xccf1335b, 0x00000000, 0x36d483f9, 0x4587566e, + 0x97b3ece1, 0x64b019e6, 0xfea9b128, 0xd87736c3, + 0xc15b7774, 0x112943be, 0x77dfd41d, 0xba0da0ea, + 0x124c8a57, 0xcb18fb38, 0x9df060ad, 0x2b74c3c4, + 0xe5c37eda, 0x921caac7, 0x791059db, 0x0365c9e9, + 0x0fecca6a, 0xb9686903, 0x65935e4a, 0x4ee79d8e, + 0xbe81a160, 0xe06c38fc, 0xbb2ee746, 0x52649a1f, + 0xe4e03976, 0x8fbceafa, 0x301e0c36, 0x249809ae, + 0xf940794b, 0x6359d185, 0x70361c7e, 0xf8633ee7, + 0x37f7c455, 0xeea3b53a, 0x29324d81, 0xc4f43152, + 0x9b3aef62, 0x66f697a3, 0x35b14a10, 0xf220b2ab, + 0x54ae15d0, 0xb7a7e4c5, 0xd5dd72ec, 0x5a619816, + 0xca3bbc94, 0xe785f09f, 0xddd870e5, 0x14860598, + 0xc6b2bf17, 0x410b57e4, 0x434dd9a1, 0x2ff8c24e, + 0xf1457b42, 0x15a54234, 0x94d62508, 0xf0663cee, + 0x22528661, 0x76fc93b1, 0xb32be54f, 0x20140824, + 0xb208a2e3, 0xbcc72f25, 0x4fc4da22, 0x68391a65, + 0x8335e979, 0xb684a369, 0xd79bfca9, 0x3db44819, + 0xc5d776fe, 0x313d4b9a, 0x3ed181f0, 0x88552299, + 0x0c890383, 0x4a6b9c04, 0xd1517366, 0x0b60cbe0, + 0xfdcc78c1, 0x7cbf1ffd, 0xd4fe3540, 0xeb0cf31c, + 0xa1676f18, 0x985f268b, 0x7d9c5851, 0xd6b8bb05, + 0x6b5cd38c, 0x57cbdc39, 0x6ef395aa, 0x180f061b, + 0x8a13acdc, 0x1a49885e, 0xdf9efea0, 0x21374f88, + 0x4d825467, 0xb16d6b0a, 0x46e29f87, 0xa202a6f1, + 0xae8ba572, 0x58271653, 0x9cd32701, 0x47c1d82b, + 0x95f562a4, 0x87b9e8f3, 0xe309f115, 0x0a438c4c, + 0x092645a5, 0x3c970fb5, 0xa04428b4, 0x5b42dfba, + 0xb04e2ca6, 0xcdd274f7, 0x6fd0d206, 0x482d1241, + 0xa7ade0d7, 0xd954716f, 0xceb7bd1e, 0x3b7ec7d6, + 0x2edb85e2, 0x2a578468, 0xb4c22d2c, 0x490e55ed, + 0x5d885075, 0xda31b886, 0x933fed6b, 0x44a411c2, + }, + { + 0x18c07830, 0x2305af46, 0xc67ef991, 0xe8136fcd, + 0x874ca113, 0xb8a9626d, 0x01080502, 0x4f426e9e, + 0x36adee6c, 0xa6590451, 0xd2debdb9, 0xf5fb06f7, + 0x79ef80f2, 0x6f5fcede, 0x91fcef3f, 0x52aa07a4, + 0x6027fdc0, 0xbc897665, 0x9baccd2b, 0x8e048c01, + 0xa371155b, 0x0c603c18, 0x7bff8af6, 0x35b5e16a, + 0x1de8693a, 0xe05347dd, 0xd7f6acb3, 0xc25eed99, + 0x2e6d965c, 0x4b627a96, 0xfea321e1, 0x578216ae, + 0x15a8412a, 0x779fb6ee, 0x37a5eb6e, 0xe57b56d7, + 0x9f8cd923, 0xf0d317fd, 0x4a6a7f94, 0xda9e95a9, + 0x58fa25b0, 0xc906ca8f, 0x29558d52, 0x0a502214, + 0xb1e14f7f, 0xa0691a5d, 0x6b7fdad6, 0x855cab17, + 0xbd817367, 0x5dd234ba, 0x10805020, 0xf4f303f5, + 0xcb16c08b, 0x3eedc67c, 0x0528110a, 0x671fe6ce, + 0xe47353d5, 0x2725bb4e, 0x41325882, 0x8b2c9d0b, + 0xa7510153, 0x7dcf94fa, 0x95dcfb37, 0xd88e9fad, + 0xfb8b30eb, 0xee2371c1, 0x7cc791f8, 0x6617e3cc, + 0xdda68ea7, 0x17b84b2e, 0x4702468e, 0x9e84dc21, + 0xca1ec589, 0x2d75995a, 0xbf917963, 0x07381b0e, + 0xad012347, 0x5aea2fb4, 0x836cb51b, 0x3385ff66, + 0x633ff2c6, 0x02100a04, 0xaa393849, 0x71afa8e2, + 0xc80ecf8d, 0x19c87d32, 0x49727092, 0xd9869aaf, + 0xf2c31df9, 0xe34b48db, 0x5be22ab6, 0x8834920d, + 0x9aa4c829, 0x262dbe4c, 0x328dfa64, 0xb0e94a7d, + 0xe91b6acf, 0x0f78331e, 0xd5e6a6b7, 0x8074ba1d, + 0xbe997c61, 0xcd26de87, 0x34bde468, 0x487a7590, + 0xffab24e3, 0x7af78ff4, 0x90f4ea3d, 0x5fc23ebe, + 0x201da040, 0x6867d5d0, 0x1ad07234, 0xae192c41, + 0xb4c95e75, 0x549a19a8, 0x93ece53b, 0x220daa44, + 0x6407e9c8, 0xf1db12ff, 0x73bfa2e6, 0x12905a24, + 0x403a5d80, 0x08402810, 0xc356e89b, 0xec337bc5, + 0xdb9690ab, 0xa1611f5f, 0x8d1c8307, 0x3df5c97a, + 0x97ccf133, 0x00000000, 0xcf36d483, 0x2b458756, + 0x7697b3ec, 0x8264b019, 0xd6fea9b1, 0x1bd87736, + 0xb5c15b77, 0xaf112943, 0x6a77dfd4, 0x50ba0da0, + 0x45124c8a, 0xf3cb18fb, 0x309df060, 0xef2b74c3, + 0x3fe5c37e, 0x55921caa, 0xa2791059, 0xea0365c9, + 0x650fecca, 0xbab96869, 0x2f65935e, 0xc04ee79d, + 0xdebe81a1, 0x1ce06c38, 0xfdbb2ee7, 0x4d52649a, + 0x92e4e039, 0x758fbcea, 0x06301e0c, 0x8a249809, + 0xb2f94079, 0xe66359d1, 0x0e70361c, 0x1ff8633e, + 0x6237f7c4, 0xd4eea3b5, 0xa829324d, 0x96c4f431, + 0xf99b3aef, 0xc566f697, 0x2535b14a, 0x59f220b2, + 0x8454ae15, 0x72b7a7e4, 0x39d5dd72, 0x4c5a6198, + 0x5eca3bbc, 0x78e785f0, 0x38ddd870, 0x8c148605, + 0xd1c6b2bf, 0xa5410b57, 0xe2434dd9, 0x612ff8c2, + 0xb3f1457b, 0x2115a542, 0x9c94d625, 0x1ef0663c, + 0x43225286, 0xc776fc93, 0xfcb32be5, 0x04201408, + 0x51b208a2, 0x99bcc72f, 0x6d4fc4da, 0x0d68391a, + 0xfa8335e9, 0xdfb684a3, 0x7ed79bfc, 0x243db448, + 0x3bc5d776, 0xab313d4b, 0xce3ed181, 0x11885522, + 0x8f0c8903, 0x4e4a6b9c, 0xb7d15173, 0xeb0b60cb, + 0x3cfdcc78, 0x817cbf1f, 0x94d4fe35, 0xf7eb0cf3, + 0xb9a1676f, 0x13985f26, 0x2c7d9c58, 0xd3d6b8bb, + 0xe76b5cd3, 0x6e57cbdc, 0xc46ef395, 0x03180f06, + 0x568a13ac, 0x441a4988, 0x7fdf9efe, 0xa921374f, + 0x2a4d8254, 0xbbb16d6b, 0xc146e29f, 0x53a202a6, + 0xdcae8ba5, 0x0b582716, 0x9d9cd327, 0x6c47c1d8, + 0x3195f562, 0x7487b9e8, 0xf6e309f1, 0x460a438c, + 0xac092645, 0x893c970f, 0x14a04428, 0xe15b42df, + 0x16b04e2c, 0x3acdd274, 0x696fd0d2, 0x09482d12, + 0x70a7ade0, 0xb6d95471, 0xd0ceb7bd, 0xed3b7ec7, + 0xcc2edb85, 0x422a5784, 0x98b4c22d, 0xa4490e55, + 0x285d8850, 0x5cda31b8, 0xf8933fed, 0x8644a411, + }, + { + 0x6018c078, 0x8c2305af, 0x3fc67ef9, 0x87e8136f, + 0x26874ca1, 0xdab8a962, 0x04010805, 0x214f426e, + 0xd836adee, 0xa2a65904, 0x6fd2debd, 0xf3f5fb06, + 0xf979ef80, 0xa16f5fce, 0x7e91fcef, 0x5552aa07, + 0x9d6027fd, 0xcabc8976, 0x569baccd, 0x028e048c, + 0xb6a37115, 0x300c603c, 0xf17bff8a, 0xd435b5e1, + 0x741de869, 0xa7e05347, 0x7bd7f6ac, 0x2fc25eed, + 0xb82e6d96, 0x314b627a, 0xdffea321, 0x41578216, + 0x5415a841, 0xc1779fb6, 0xdc37a5eb, 0xb3e57b56, + 0x469f8cd9, 0xe7f0d317, 0x354a6a7f, 0x4fda9e95, + 0x7d58fa25, 0x03c906ca, 0xa429558d, 0x280a5022, + 0xfeb1e14f, 0xbaa0691a, 0xb16b7fda, 0x2e855cab, + 0xcebd8173, 0x695dd234, 0x40108050, 0xf7f4f303, + 0x0bcb16c0, 0xf83eedc6, 0x14052811, 0x81671fe6, + 0xb7e47353, 0x9c2725bb, 0x19413258, 0x168b2c9d, + 0xa6a75101, 0xe97dcf94, 0x6e95dcfb, 0x47d88e9f, + 0xcbfb8b30, 0x9fee2371, 0xed7cc791, 0x856617e3, + 0x53dda68e, 0x5c17b84b, 0x01470246, 0x429e84dc, + 0x0fca1ec5, 0xb42d7599, 0xc6bf9179, 0x1c07381b, + 0x8ead0123, 0x755aea2f, 0x36836cb5, 0xcc3385ff, + 0x91633ff2, 0x0802100a, 0x92aa3938, 0xd971afa8, + 0x07c80ecf, 0x6419c87d, 0x39497270, 0x43d9869a, + 0xeff2c31d, 0xabe34b48, 0x715be22a, 0x1a883492, + 0x529aa4c8, 0x98262dbe, 0xc8328dfa, 0xfab0e94a, + 0x83e91b6a, 0x3c0f7833, 0x73d5e6a6, 0x3a8074ba, + 0xc2be997c, 0x13cd26de, 0xd034bde4, 0x3d487a75, + 0xdbffab24, 0xf57af78f, 0x7a90f4ea, 0x615fc23e, + 0x80201da0, 0xbd6867d5, 0x681ad072, 0x82ae192c, + 0xeab4c95e, 0x4d549a19, 0x7693ece5, 0x88220daa, + 0x8d6407e9, 0xe3f1db12, 0xd173bfa2, 0x4812905a, + 0x1d403a5d, 0x20084028, 0x2bc356e8, 0x97ec337b, + 0x4bdb9690, 0xbea1611f, 0x0e8d1c83, 0xf43df5c9, + 0x6697ccf1, 0x00000000, 0x1bcf36d4, 0xac2b4587, + 0xc57697b3, 0x328264b0, 0x7fd6fea9, 0x6c1bd877, + 0xeeb5c15b, 0x86af1129, 0xb56a77df, 0x5d50ba0d, + 0x0945124c, 0xebf3cb18, 0xc0309df0, 0x9bef2b74, + 0xfc3fe5c3, 0x4955921c, 0xb2a27910, 0x8fea0365, + 0x89650fec, 0xd2bab968, 0xbc2f6593, 0x27c04ee7, + 0x5fdebe81, 0x701ce06c, 0xd3fdbb2e, 0x294d5264, + 0x7292e4e0, 0xc9758fbc, 0x1806301e, 0x128a2498, + 0xf2b2f940, 0xbfe66359, 0x380e7036, 0x7c1ff863, + 0x956237f7, 0x77d4eea3, 0x9aa82932, 0x6296c4f4, + 0xc3f99b3a, 0x33c566f6, 0x942535b1, 0x7959f220, + 0x2a8454ae, 0xd572b7a7, 0xe439d5dd, 0x2d4c5a61, + 0x655eca3b, 0xfd78e785, 0xe038ddd8, 0x0a8c1486, + 0x63d1c6b2, 0xaea5410b, 0xafe2434d, 0x99612ff8, + 0xf6b3f145, 0x842115a5, 0x4a9c94d6, 0x781ef066, + 0x11432252, 0x3bc776fc, 0xd7fcb32b, 0x10042014, + 0x5951b208, 0x5e99bcc7, 0xa96d4fc4, 0x340d6839, + 0xcffa8335, 0x5bdfb684, 0xe57ed79b, 0x90243db4, + 0xec3bc5d7, 0x96ab313d, 0x1fce3ed1, 0x44118855, + 0x068f0c89, 0x254e4a6b, 0xe6b7d151, 0x8beb0b60, + 0xf03cfdcc, 0x3e817cbf, 0x6a94d4fe, 0xfbf7eb0c, + 0xdeb9a167, 0x4c13985f, 0xb02c7d9c, 0x6bd3d6b8, + 0xbbe76b5c, 0xa56e57cb, 0x37c46ef3, 0x0c03180f, + 0x45568a13, 0x0d441a49, 0xe17fdf9e, 0x9ea92137, + 0xa82a4d82, 0xd6bbb16d, 0x23c146e2, 0x5153a202, + 0x57dcae8b, 0x2c0b5827, 0x4e9d9cd3, 0xad6c47c1, + 0xc43195f5, 0xcd7487b9, 0xfff6e309, 0x05460a43, + 0x8aac0926, 0x1e893c97, 0x5014a044, 0xa3e15b42, + 0x5816b04e, 0xe83acdd2, 0xb9696fd0, 0x2409482d, + 0xdd70a7ad, 0xe2b6d954, 0x67d0ceb7, 0x93ed3b7e, + 0x17cc2edb, 0x15422a57, 0x5a98b4c2, 0xaaa4490e, + 0xa0285d88, 0x6d5cda31, 0xc7f8933f, 0x228644a4, + }, + { + 0x186018c0, 0x238c2305, 0xc63fc67e, 0xe887e813, + 0x8726874c, 0xb8dab8a9, 0x01040108, 0x4f214f42, + 0x36d836ad, 0xa6a2a659, 0xd26fd2de, 0xf5f3f5fb, + 0x79f979ef, 0x6fa16f5f, 0x917e91fc, 0x525552aa, + 0x609d6027, 0xbccabc89, 0x9b569bac, 0x8e028e04, + 0xa3b6a371, 0x0c300c60, 0x7bf17bff, 0x35d435b5, + 0x1d741de8, 0xe0a7e053, 0xd77bd7f6, 0xc22fc25e, + 0x2eb82e6d, 0x4b314b62, 0xfedffea3, 0x57415782, + 0x155415a8, 0x77c1779f, 0x37dc37a5, 0xe5b3e57b, + 0x9f469f8c, 0xf0e7f0d3, 0x4a354a6a, 0xda4fda9e, + 0x587d58fa, 0xc903c906, 0x29a42955, 0x0a280a50, + 0xb1feb1e1, 0xa0baa069, 0x6bb16b7f, 0x852e855c, + 0xbdcebd81, 0x5d695dd2, 0x10401080, 0xf4f7f4f3, + 0xcb0bcb16, 0x3ef83eed, 0x05140528, 0x6781671f, + 0xe4b7e473, 0x279c2725, 0x41194132, 0x8b168b2c, + 0xa7a6a751, 0x7de97dcf, 0x956e95dc, 0xd847d88e, + 0xfbcbfb8b, 0xee9fee23, 0x7ced7cc7, 0x66856617, + 0xdd53dda6, 0x175c17b8, 0x47014702, 0x9e429e84, + 0xca0fca1e, 0x2db42d75, 0xbfc6bf91, 0x071c0738, + 0xad8ead01, 0x5a755aea, 0x8336836c, 0x33cc3385, + 0x6391633f, 0x02080210, 0xaa92aa39, 0x71d971af, + 0xc807c80e, 0x196419c8, 0x49394972, 0xd943d986, + 0xf2eff2c3, 0xe3abe34b, 0x5b715be2, 0x881a8834, + 0x9a529aa4, 0x2698262d, 0x32c8328d, 0xb0fab0e9, + 0xe983e91b, 0x0f3c0f78, 0xd573d5e6, 0x803a8074, + 0xbec2be99, 0xcd13cd26, 0x34d034bd, 0x483d487a, + 0xffdbffab, 0x7af57af7, 0x907a90f4, 0x5f615fc2, + 0x2080201d, 0x68bd6867, 0x1a681ad0, 0xae82ae19, + 0xb4eab4c9, 0x544d549a, 0x937693ec, 0x2288220d, + 0x648d6407, 0xf1e3f1db, 0x73d173bf, 0x12481290, + 0x401d403a, 0x08200840, 0xc32bc356, 0xec97ec33, + 0xdb4bdb96, 0xa1bea161, 0x8d0e8d1c, 0x3df43df5, + 0x976697cc, 0x00000000, 0xcf1bcf36, 0x2bac2b45, + 0x76c57697, 0x82328264, 0xd67fd6fe, 0x1b6c1bd8, + 0xb5eeb5c1, 0xaf86af11, 0x6ab56a77, 0x505d50ba, + 0x45094512, 0xf3ebf3cb, 0x30c0309d, 0xef9bef2b, + 0x3ffc3fe5, 0x55495592, 0xa2b2a279, 0xea8fea03, + 0x6589650f, 0xbad2bab9, 0x2fbc2f65, 0xc027c04e, + 0xde5fdebe, 0x1c701ce0, 0xfdd3fdbb, 0x4d294d52, + 0x927292e4, 0x75c9758f, 0x06180630, 0x8a128a24, + 0xb2f2b2f9, 0xe6bfe663, 0x0e380e70, 0x1f7c1ff8, + 0x62956237, 0xd477d4ee, 0xa89aa829, 0x966296c4, + 0xf9c3f99b, 0xc533c566, 0x25942535, 0x597959f2, + 0x842a8454, 0x72d572b7, 0x39e439d5, 0x4c2d4c5a, + 0x5e655eca, 0x78fd78e7, 0x38e038dd, 0x8c0a8c14, + 0xd163d1c6, 0xa5aea541, 0xe2afe243, 0x6199612f, + 0xb3f6b3f1, 0x21842115, 0x9c4a9c94, 0x1e781ef0, + 0x43114322, 0xc73bc776, 0xfcd7fcb3, 0x04100420, + 0x515951b2, 0x995e99bc, 0x6da96d4f, 0x0d340d68, + 0xfacffa83, 0xdf5bdfb6, 0x7ee57ed7, 0x2490243d, + 0x3bec3bc5, 0xab96ab31, 0xce1fce3e, 0x11441188, + 0x8f068f0c, 0x4e254e4a, 0xb7e6b7d1, 0xeb8beb0b, + 0x3cf03cfd, 0x813e817c, 0x946a94d4, 0xf7fbf7eb, + 0xb9deb9a1, 0x134c1398, 0x2cb02c7d, 0xd36bd3d6, + 0xe7bbe76b, 0x6ea56e57, 0xc437c46e, 0x030c0318, + 0x5645568a, 0x440d441a, 0x7fe17fdf, 0xa99ea921, + 0x2aa82a4d, 0xbbd6bbb1, 0xc123c146, 0x535153a2, + 0xdc57dcae, 0x0b2c0b58, 0x9d4e9d9c, 0x6cad6c47, + 0x31c43195, 0x74cd7487, 0xf6fff6e3, 0x4605460a, + 0xac8aac09, 0x891e893c, 0x145014a0, 0xe1a3e15b, + 0x165816b0, 0x3ae83acd, 0x69b9696f, 0x09240948, + 0x70dd70a7, 0xb6e2b6d9, 0xd067d0ce, 0xed93ed3b, + 0xcc17cc2e, 0x4215422a, 0x985a98b4, 0xa4aaa449, + 0x28a0285d, 0x5c6d5cda, 0xf8c7f893, 0x86228644, + }, + { + 0x18186018, 0x23238c23, 0xc6c63fc6, 0xe8e887e8, + 0x87872687, 0xb8b8dab8, 0x01010401, 0x4f4f214f, + 0x3636d836, 0xa6a6a2a6, 0xd2d26fd2, 0xf5f5f3f5, + 0x7979f979, 0x6f6fa16f, 0x91917e91, 0x52525552, + 0x60609d60, 0xbcbccabc, 0x9b9b569b, 0x8e8e028e, + 0xa3a3b6a3, 0x0c0c300c, 0x7b7bf17b, 0x3535d435, + 0x1d1d741d, 0xe0e0a7e0, 0xd7d77bd7, 0xc2c22fc2, + 0x2e2eb82e, 0x4b4b314b, 0xfefedffe, 0x57574157, + 0x15155415, 0x7777c177, 0x3737dc37, 0xe5e5b3e5, + 0x9f9f469f, 0xf0f0e7f0, 0x4a4a354a, 0xdada4fda, + 0x58587d58, 0xc9c903c9, 0x2929a429, 0x0a0a280a, + 0xb1b1feb1, 0xa0a0baa0, 0x6b6bb16b, 0x85852e85, + 0xbdbdcebd, 0x5d5d695d, 0x10104010, 0xf4f4f7f4, + 0xcbcb0bcb, 0x3e3ef83e, 0x05051405, 0x67678167, + 0xe4e4b7e4, 0x27279c27, 0x41411941, 0x8b8b168b, + 0xa7a7a6a7, 0x7d7de97d, 0x95956e95, 0xd8d847d8, + 0xfbfbcbfb, 0xeeee9fee, 0x7c7ced7c, 0x66668566, + 0xdddd53dd, 0x17175c17, 0x47470147, 0x9e9e429e, + 0xcaca0fca, 0x2d2db42d, 0xbfbfc6bf, 0x07071c07, + 0xadad8ead, 0x5a5a755a, 0x83833683, 0x3333cc33, + 0x63639163, 0x02020802, 0xaaaa92aa, 0x7171d971, + 0xc8c807c8, 0x19196419, 0x49493949, 0xd9d943d9, + 0xf2f2eff2, 0xe3e3abe3, 0x5b5b715b, 0x88881a88, + 0x9a9a529a, 0x26269826, 0x3232c832, 0xb0b0fab0, + 0xe9e983e9, 0x0f0f3c0f, 0xd5d573d5, 0x80803a80, + 0xbebec2be, 0xcdcd13cd, 0x3434d034, 0x48483d48, + 0xffffdbff, 0x7a7af57a, 0x90907a90, 0x5f5f615f, + 0x20208020, 0x6868bd68, 0x1a1a681a, 0xaeae82ae, + 0xb4b4eab4, 0x54544d54, 0x93937693, 0x22228822, + 0x64648d64, 0xf1f1e3f1, 0x7373d173, 0x12124812, + 0x40401d40, 0x08082008, 0xc3c32bc3, 0xecec97ec, + 0xdbdb4bdb, 0xa1a1bea1, 0x8d8d0e8d, 0x3d3df43d, + 0x97976697, 0x00000000, 0xcfcf1bcf, 0x2b2bac2b, + 0x7676c576, 0x82823282, 0xd6d67fd6, 0x1b1b6c1b, + 0xb5b5eeb5, 0xafaf86af, 0x6a6ab56a, 0x50505d50, + 0x45450945, 0xf3f3ebf3, 0x3030c030, 0xefef9bef, + 0x3f3ffc3f, 0x55554955, 0xa2a2b2a2, 0xeaea8fea, + 0x65658965, 0xbabad2ba, 0x2f2fbc2f, 0xc0c027c0, + 0xdede5fde, 0x1c1c701c, 0xfdfdd3fd, 0x4d4d294d, + 0x92927292, 0x7575c975, 0x06061806, 0x8a8a128a, + 0xb2b2f2b2, 0xe6e6bfe6, 0x0e0e380e, 0x1f1f7c1f, + 0x62629562, 0xd4d477d4, 0xa8a89aa8, 0x96966296, + 0xf9f9c3f9, 0xc5c533c5, 0x25259425, 0x59597959, + 0x84842a84, 0x7272d572, 0x3939e439, 0x4c4c2d4c, + 0x5e5e655e, 0x7878fd78, 0x3838e038, 0x8c8c0a8c, + 0xd1d163d1, 0xa5a5aea5, 0xe2e2afe2, 0x61619961, + 0xb3b3f6b3, 0x21218421, 0x9c9c4a9c, 0x1e1e781e, + 0x43431143, 0xc7c73bc7, 0xfcfcd7fc, 0x04041004, + 0x51515951, 0x99995e99, 0x6d6da96d, 0x0d0d340d, + 0xfafacffa, 0xdfdf5bdf, 0x7e7ee57e, 0x24249024, + 0x3b3bec3b, 0xabab96ab, 0xcece1fce, 0x11114411, + 0x8f8f068f, 0x4e4e254e, 0xb7b7e6b7, 0xebeb8beb, + 0x3c3cf03c, 0x81813e81, 0x94946a94, 0xf7f7fbf7, + 0xb9b9deb9, 0x13134c13, 0x2c2cb02c, 0xd3d36bd3, + 0xe7e7bbe7, 0x6e6ea56e, 0xc4c437c4, 0x03030c03, + 0x56564556, 0x44440d44, 0x7f7fe17f, 0xa9a99ea9, + 0x2a2aa82a, 0xbbbbd6bb, 0xc1c123c1, 0x53535153, + 0xdcdc57dc, 0x0b0b2c0b, 0x9d9d4e9d, 0x6c6cad6c, + 0x3131c431, 0x7474cd74, 0xf6f6fff6, 0x46460546, + 0xacac8aac, 0x89891e89, 0x14145014, 0xe1e1a3e1, + 0x16165816, 0x3a3ae83a, 0x6969b969, 0x09092409, + 0x7070dd70, 0xb6b6e2b6, 0xd0d067d0, 0xeded93ed, + 0xcccc17cc, 0x42421542, 0x98985a98, 0xa4a4aaa4, + 0x2828a028, 0x5c5c6d5c, 0xf8f8c7f8, 0x86862286, + }, + { + 0xd8181860, 0x2623238c, 0xb8c6c63f, 0xfbe8e887, + 0xcb878726, 0x11b8b8da, 0x09010104, 0x0d4f4f21, + 0x9b3636d8, 0xffa6a6a2, 0x0cd2d26f, 0x0ef5f5f3, + 0x967979f9, 0x306f6fa1, 0x6d91917e, 0xf8525255, + 0x4760609d, 0x35bcbcca, 0x379b9b56, 0x8a8e8e02, + 0xd2a3a3b6, 0x6c0c0c30, 0x847b7bf1, 0x803535d4, + 0xf51d1d74, 0xb3e0e0a7, 0x21d7d77b, 0x9cc2c22f, + 0x432e2eb8, 0x294b4b31, 0x5dfefedf, 0xd5575741, + 0xbd151554, 0xe87777c1, 0x923737dc, 0x9ee5e5b3, + 0x139f9f46, 0x23f0f0e7, 0x204a4a35, 0x44dada4f, + 0xa258587d, 0xcfc9c903, 0x7c2929a4, 0x5a0a0a28, + 0x50b1b1fe, 0xc9a0a0ba, 0x146b6bb1, 0xd985852e, + 0x3cbdbdce, 0x8f5d5d69, 0x90101040, 0x07f4f4f7, + 0xddcbcb0b, 0xd33e3ef8, 0x2d050514, 0x78676781, + 0x97e4e4b7, 0x0227279c, 0x73414119, 0xa78b8b16, + 0xf6a7a7a6, 0xb27d7de9, 0x4995956e, 0x56d8d847, + 0x70fbfbcb, 0xcdeeee9f, 0xbb7c7ced, 0x71666685, + 0x7bdddd53, 0xaf17175c, 0x45474701, 0x1a9e9e42, + 0xd4caca0f, 0x582d2db4, 0x2ebfbfc6, 0x3f07071c, + 0xacadad8e, 0xb05a5a75, 0xef838336, 0xb63333cc, + 0x5c636391, 0x12020208, 0x93aaaa92, 0xde7171d9, + 0xc6c8c807, 0xd1191964, 0x3b494939, 0x5fd9d943, + 0x31f2f2ef, 0xa8e3e3ab, 0xb95b5b71, 0xbc88881a, + 0x3e9a9a52, 0x0b262698, 0xbf3232c8, 0x59b0b0fa, + 0xf2e9e983, 0x770f0f3c, 0x33d5d573, 0xf480803a, + 0x27bebec2, 0xebcdcd13, 0x893434d0, 0x3248483d, + 0x54ffffdb, 0x8d7a7af5, 0x6490907a, 0x9d5f5f61, + 0x3d202080, 0x0f6868bd, 0xca1a1a68, 0xb7aeae82, + 0x7db4b4ea, 0xce54544d, 0x7f939376, 0x2f222288, + 0x6364648d, 0x2af1f1e3, 0xcc7373d1, 0x82121248, + 0x7a40401d, 0x48080820, 0x95c3c32b, 0xdfecec97, + 0x4ddbdb4b, 0xc0a1a1be, 0x918d8d0e, 0xc83d3df4, + 0x5b979766, 0x00000000, 0xf9cfcf1b, 0x6e2b2bac, + 0xe17676c5, 0xe6828232, 0x28d6d67f, 0xc31b1b6c, + 0x74b5b5ee, 0xbeafaf86, 0x1d6a6ab5, 0xea50505d, + 0x57454509, 0x38f3f3eb, 0xad3030c0, 0xc4efef9b, + 0xda3f3ffc, 0xc7555549, 0xdba2a2b2, 0xe9eaea8f, + 0x6a656589, 0x03babad2, 0x4a2f2fbc, 0x8ec0c027, + 0x60dede5f, 0xfc1c1c70, 0x46fdfdd3, 0x1f4d4d29, + 0x76929272, 0xfa7575c9, 0x36060618, 0xae8a8a12, + 0x4bb2b2f2, 0x85e6e6bf, 0x7e0e0e38, 0xe71f1f7c, + 0x55626295, 0x3ad4d477, 0x81a8a89a, 0x52969662, + 0x62f9f9c3, 0xa3c5c533, 0x10252594, 0xab595979, + 0xd084842a, 0xc57272d5, 0xec3939e4, 0x164c4c2d, + 0x945e5e65, 0x9f7878fd, 0xe53838e0, 0x988c8c0a, + 0x17d1d163, 0xe4a5a5ae, 0xa1e2e2af, 0x4e616199, + 0x42b3b3f6, 0x34212184, 0x089c9c4a, 0xee1e1e78, + 0x61434311, 0xb1c7c73b, 0x4ffcfcd7, 0x24040410, + 0xe3515159, 0x2599995e, 0x226d6da9, 0x650d0d34, + 0x79fafacf, 0x69dfdf5b, 0xa97e7ee5, 0x19242490, + 0xfe3b3bec, 0x9aabab96, 0xf0cece1f, 0x99111144, + 0x838f8f06, 0x044e4e25, 0x66b7b7e6, 0xe0ebeb8b, + 0xc13c3cf0, 0xfd81813e, 0x4094946a, 0x1cf7f7fb, + 0x18b9b9de, 0x8b13134c, 0x512c2cb0, 0x05d3d36b, + 0x8ce7e7bb, 0x396e6ea5, 0xaac4c437, 0x1b03030c, + 0xdc565645, 0x5e44440d, 0xa07f7fe1, 0x88a9a99e, + 0x672a2aa8, 0x0abbbbd6, 0x87c1c123, 0xf1535351, + 0x72dcdc57, 0x530b0b2c, 0x019d9d4e, 0x2b6c6cad, + 0xa43131c4, 0xf37474cd, 0x15f6f6ff, 0x4c464605, + 0xa5acac8a, 0xb589891e, 0xb4141450, 0xbae1e1a3, + 0xa6161658, 0xf73a3ae8, 0x066969b9, 0x41090924, + 0xd77070dd, 0x6fb6b6e2, 0x1ed0d067, 0xd6eded93, + 0xe2cccc17, 0x68424215, 0x2c98985a, 0xeda4a4aa, + 0x752828a0, 0x865c5c6d, 0x6bf8f8c7, 0xc2868622, + }, + { + 0x30d81818, 0x46262323, 0x91b8c6c6, 0xcdfbe8e8, + 0x13cb8787, 0x6d11b8b8, 0x02090101, 0x9e0d4f4f, + 0x6c9b3636, 0x51ffa6a6, 0xb90cd2d2, 0xf70ef5f5, + 0xf2967979, 0xde306f6f, 0x3f6d9191, 0xa4f85252, + 0xc0476060, 0x6535bcbc, 0x2b379b9b, 0x018a8e8e, + 0x5bd2a3a3, 0x186c0c0c, 0xf6847b7b, 0x6a803535, + 0x3af51d1d, 0xddb3e0e0, 0xb321d7d7, 0x999cc2c2, + 0x5c432e2e, 0x96294b4b, 0xe15dfefe, 0xaed55757, + 0x2abd1515, 0xeee87777, 0x6e923737, 0xd79ee5e5, + 0x23139f9f, 0xfd23f0f0, 0x94204a4a, 0xa944dada, + 0xb0a25858, 0x8fcfc9c9, 0x527c2929, 0x145a0a0a, + 0x7f50b1b1, 0x5dc9a0a0, 0xd6146b6b, 0x17d98585, + 0x673cbdbd, 0xba8f5d5d, 0x20901010, 0xf507f4f4, + 0x8bddcbcb, 0x7cd33e3e, 0x0a2d0505, 0xce786767, + 0xd597e4e4, 0x4e022727, 0x82734141, 0x0ba78b8b, + 0x53f6a7a7, 0xfab27d7d, 0x37499595, 0xad56d8d8, + 0xeb70fbfb, 0xc1cdeeee, 0xf8bb7c7c, 0xcc716666, + 0xa77bdddd, 0x2eaf1717, 0x8e454747, 0x211a9e9e, + 0x89d4caca, 0x5a582d2d, 0x632ebfbf, 0x0e3f0707, + 0x47acadad, 0xb4b05a5a, 0x1bef8383, 0x66b63333, + 0xc65c6363, 0x04120202, 0x4993aaaa, 0xe2de7171, + 0x8dc6c8c8, 0x32d11919, 0x923b4949, 0xaf5fd9d9, + 0xf931f2f2, 0xdba8e3e3, 0xb6b95b5b, 0x0dbc8888, + 0x293e9a9a, 0x4c0b2626, 0x64bf3232, 0x7d59b0b0, + 0xcff2e9e9, 0x1e770f0f, 0xb733d5d5, 0x1df48080, + 0x6127bebe, 0x87ebcdcd, 0x68893434, 0x90324848, + 0xe354ffff, 0xf48d7a7a, 0x3d649090, 0xbe9d5f5f, + 0x403d2020, 0xd00f6868, 0x34ca1a1a, 0x41b7aeae, + 0x757db4b4, 0xa8ce5454, 0x3b7f9393, 0x442f2222, + 0xc8636464, 0xff2af1f1, 0xe6cc7373, 0x24821212, + 0x807a4040, 0x10480808, 0x9b95c3c3, 0xc5dfecec, + 0xab4ddbdb, 0x5fc0a1a1, 0x07918d8d, 0x7ac83d3d, + 0x335b9797, 0x00000000, 0x83f9cfcf, 0x566e2b2b, + 0xece17676, 0x19e68282, 0xb128d6d6, 0x36c31b1b, + 0x7774b5b5, 0x43beafaf, 0xd41d6a6a, 0xa0ea5050, + 0x8a574545, 0xfb38f3f3, 0x60ad3030, 0xc3c4efef, + 0x7eda3f3f, 0xaac75555, 0x59dba2a2, 0xc9e9eaea, + 0xca6a6565, 0x6903baba, 0x5e4a2f2f, 0x9d8ec0c0, + 0xa160dede, 0x38fc1c1c, 0xe746fdfd, 0x9a1f4d4d, + 0x39769292, 0xeafa7575, 0x0c360606, 0x09ae8a8a, + 0x794bb2b2, 0xd185e6e6, 0x1c7e0e0e, 0x3ee71f1f, + 0xc4556262, 0xb53ad4d4, 0x4d81a8a8, 0x31529696, + 0xef62f9f9, 0x97a3c5c5, 0x4a102525, 0xb2ab5959, + 0x15d08484, 0xe4c57272, 0x72ec3939, 0x98164c4c, + 0xbc945e5e, 0xf09f7878, 0x70e53838, 0x05988c8c, + 0xbf17d1d1, 0x57e4a5a5, 0xd9a1e2e2, 0xc24e6161, + 0x7b42b3b3, 0x42342121, 0x25089c9c, 0x3cee1e1e, + 0x86614343, 0x93b1c7c7, 0xe54ffcfc, 0x08240404, + 0xa2e35151, 0x2f259999, 0xda226d6d, 0x1a650d0d, + 0xe979fafa, 0xa369dfdf, 0xfca97e7e, 0x48192424, + 0x76fe3b3b, 0x4b9aabab, 0x81f0cece, 0x22991111, + 0x03838f8f, 0x9c044e4e, 0x7366b7b7, 0xcbe0ebeb, + 0x78c13c3c, 0x1ffd8181, 0x35409494, 0xf31cf7f7, + 0x6f18b9b9, 0x268b1313, 0x58512c2c, 0xbb05d3d3, + 0xd38ce7e7, 0xdc396e6e, 0x95aac4c4, 0x061b0303, + 0xacdc5656, 0x885e4444, 0xfea07f7f, 0x4f88a9a9, + 0x54672a2a, 0x6b0abbbb, 0x9f87c1c1, 0xa6f15353, + 0xa572dcdc, 0x16530b0b, 0x27019d9d, 0xd82b6c6c, + 0x62a43131, 0xe8f37474, 0xf115f6f6, 0x8c4c4646, + 0x45a5acac, 0x0fb58989, 0x28b41414, 0xdfbae1e1, + 0x2ca61616, 0x74f73a3a, 0xd2066969, 0x12410909, + 0xe0d77070, 0x716fb6b6, 0xbd1ed0d0, 0xc7d6eded, + 0x85e2cccc, 0x84684242, 0x2d2c9898, 0x55eda4a4, + 0x50752828, 0xb8865c5c, 0xed6bf8f8, 0x11c28686, + }, + { + 0x7830d818, 0xaf462623, 0xf991b8c6, 0x6fcdfbe8, + 0xa113cb87, 0x626d11b8, 0x05020901, 0x6e9e0d4f, + 0xee6c9b36, 0x0451ffa6, 0xbdb90cd2, 0x06f70ef5, + 0x80f29679, 0xcede306f, 0xef3f6d91, 0x07a4f852, + 0xfdc04760, 0x766535bc, 0xcd2b379b, 0x8c018a8e, + 0x155bd2a3, 0x3c186c0c, 0x8af6847b, 0xe16a8035, + 0x693af51d, 0x47ddb3e0, 0xacb321d7, 0xed999cc2, + 0x965c432e, 0x7a96294b, 0x21e15dfe, 0x16aed557, + 0x412abd15, 0xb6eee877, 0xeb6e9237, 0x56d79ee5, + 0xd923139f, 0x17fd23f0, 0x7f94204a, 0x95a944da, + 0x25b0a258, 0xca8fcfc9, 0x8d527c29, 0x22145a0a, + 0x4f7f50b1, 0x1a5dc9a0, 0xdad6146b, 0xab17d985, + 0x73673cbd, 0x34ba8f5d, 0x50209010, 0x03f507f4, + 0xc08bddcb, 0xc67cd33e, 0x110a2d05, 0xe6ce7867, + 0x53d597e4, 0xbb4e0227, 0x58827341, 0x9d0ba78b, + 0x0153f6a7, 0x94fab27d, 0xfb374995, 0x9fad56d8, + 0x30eb70fb, 0x71c1cdee, 0x91f8bb7c, 0xe3cc7166, + 0x8ea77bdd, 0x4b2eaf17, 0x468e4547, 0xdc211a9e, + 0xc589d4ca, 0x995a582d, 0x79632ebf, 0x1b0e3f07, + 0x2347acad, 0x2fb4b05a, 0xb51bef83, 0xff66b633, + 0xf2c65c63, 0x0a041202, 0x384993aa, 0xa8e2de71, + 0xcf8dc6c8, 0x7d32d119, 0x70923b49, 0x9aaf5fd9, + 0x1df931f2, 0x48dba8e3, 0x2ab6b95b, 0x920dbc88, + 0xc8293e9a, 0xbe4c0b26, 0xfa64bf32, 0x4a7d59b0, + 0x6acff2e9, 0x331e770f, 0xa6b733d5, 0xba1df480, + 0x7c6127be, 0xde87ebcd, 0xe4688934, 0x75903248, + 0x24e354ff, 0x8ff48d7a, 0xea3d6490, 0x3ebe9d5f, + 0xa0403d20, 0xd5d00f68, 0x7234ca1a, 0x2c41b7ae, + 0x5e757db4, 0x19a8ce54, 0xe53b7f93, 0xaa442f22, + 0xe9c86364, 0x12ff2af1, 0xa2e6cc73, 0x5a248212, + 0x5d807a40, 0x28104808, 0xe89b95c3, 0x7bc5dfec, + 0x90ab4ddb, 0x1f5fc0a1, 0x8307918d, 0xc97ac83d, + 0xf1335b97, 0x00000000, 0xd483f9cf, 0x87566e2b, + 0xb3ece176, 0xb019e682, 0xa9b128d6, 0x7736c31b, + 0x5b7774b5, 0x2943beaf, 0xdfd41d6a, 0x0da0ea50, + 0x4c8a5745, 0x18fb38f3, 0xf060ad30, 0x74c3c4ef, + 0xc37eda3f, 0x1caac755, 0x1059dba2, 0x65c9e9ea, + 0xecca6a65, 0x686903ba, 0x935e4a2f, 0xe79d8ec0, + 0x81a160de, 0x6c38fc1c, 0x2ee746fd, 0x649a1f4d, + 0xe0397692, 0xbceafa75, 0x1e0c3606, 0x9809ae8a, + 0x40794bb2, 0x59d185e6, 0x361c7e0e, 0x633ee71f, + 0xf7c45562, 0xa3b53ad4, 0x324d81a8, 0xf4315296, + 0x3aef62f9, 0xf697a3c5, 0xb14a1025, 0x20b2ab59, + 0xae15d084, 0xa7e4c572, 0xdd72ec39, 0x6198164c, + 0x3bbc945e, 0x85f09f78, 0xd870e538, 0x8605988c, + 0xb2bf17d1, 0x0b57e4a5, 0x4dd9a1e2, 0xf8c24e61, + 0x457b42b3, 0xa5423421, 0xd625089c, 0x663cee1e, + 0x52866143, 0xfc93b1c7, 0x2be54ffc, 0x14082404, + 0x08a2e351, 0xc72f2599, 0xc4da226d, 0x391a650d, + 0x35e979fa, 0x84a369df, 0x9bfca97e, 0xb4481924, + 0xd776fe3b, 0x3d4b9aab, 0xd181f0ce, 0x55229911, + 0x8903838f, 0x6b9c044e, 0x517366b7, 0x60cbe0eb, + 0xcc78c13c, 0xbf1ffd81, 0xfe354094, 0x0cf31cf7, + 0x676f18b9, 0x5f268b13, 0x9c58512c, 0xb8bb05d3, + 0x5cd38ce7, 0xcbdc396e, 0xf395aac4, 0x0f061b03, + 0x13acdc56, 0x49885e44, 0x9efea07f, 0x374f88a9, + 0x8254672a, 0x6d6b0abb, 0xe29f87c1, 0x02a6f153, + 0x8ba572dc, 0x2716530b, 0xd327019d, 0xc1d82b6c, + 0xf562a431, 0xb9e8f374, 0x09f115f6, 0x438c4c46, + 0x2645a5ac, 0x970fb589, 0x4428b414, 0x42dfbae1, + 0x4e2ca616, 0xd274f73a, 0xd0d20669, 0x2d124109, + 0xade0d770, 0x54716fb6, 0xb7bd1ed0, 0x7ec7d6ed, + 0xdb85e2cc, 0x57846842, 0xc22d2c98, 0x0e55eda4, + 0x88507528, 0x31b8865c, 0x3fed6bf8, 0xa411c286, + }, +}; + +__device__ __constant__ u32 rch[R + 1] = +{ + 0x00000000, + 0x1823c6e8, + 0x36a6d2f5, + 0x60bc9b8e, + 0x1de0d7c2, + 0x157737e5, + 0x58c9290a, + 0xbd5d10f4, + 0xe427418b, + 0xfbee7c66, + 0xca2dbf07, +}; + +__device__ __constant__ u32 rcl[R + 1] = +{ + 0x00000000, + 0x87b8014f, + 0x796f9152, + 0xa30c7b35, + 0x2e4bfe57, + 0x9ff04ada, + 0xb1a06b85, + 0xcb3e0567, + 0xa77d95d8, + 0xdd17479e, + 0xad5a8333, +}; + +__device__ static void whirlpool_transform (const u32x w[16], u32x dgst[16], u32 s_Ch[8][256], u32 s_Cl[8][256]) +{ + u32x Kh[8]; + u32x Kl[8]; + + Kh[0] = 0x300beec0; + Kl[0] = 0xaf902967; + Kh[1] = 0x28282828; + Kl[1] = 0x28282828; + Kh[2] = 0x28282828; + Kl[2] = 0x28282828; + Kh[3] = 0x28282828; + Kl[3] = 0x28282828; + Kh[4] = 0x28282828; + Kl[4] = 0x28282828; + Kh[5] = 0x28282828; + Kl[5] = 0x28282828; + Kh[6] = 0x28282828; + Kl[6] = 0x28282828; + Kh[7] = 0x28282828; + Kl[7] = 0x28282828; + + u32x stateh[8]; + u32x statel[8]; + + stateh[0] = w[ 0]; + statel[0] = w[ 1]; + stateh[1] = w[ 2]; + statel[1] = w[ 3]; + stateh[2] = w[ 4]; + statel[2] = w[ 5]; + stateh[3] = w[ 6]; + statel[3] = w[ 7]; + stateh[4] = w[ 8]; + statel[4] = w[ 9]; + stateh[5] = w[10]; + statel[5] = w[11]; + stateh[6] = w[12]; + statel[6] = w[13]; + stateh[7] = w[14]; + statel[7] = w[15]; + + u32x Lh[8]; + u32x Ll[8]; + + #pragma unroll + for (int i = 0; i < 8; i++) + { + const u32x Lp0 = stateh[(i + 8) & 7] >> 24; + const u32x Lp1 = stateh[(i + 7) & 7] >> 16; + const u32x Lp2 = stateh[(i + 6) & 7] >> 8; + const u32x Lp3 = stateh[(i + 5) & 7] >> 0; + const u32x Lp4 = statel[(i + 4) & 7] >> 24; + const u32x Lp5 = statel[(i + 3) & 7] >> 16; + const u32x Lp6 = statel[(i + 2) & 7] >> 8; + const u32x Lp7 = statel[(i + 1) & 7] >> 0; + + Lh[i] = BOX (s_Ch, 0, Lp0 & 0xff) + ^ BOX (s_Ch, 1, Lp1 & 0xff) + ^ BOX (s_Ch, 2, Lp2 & 0xff) + ^ BOX (s_Ch, 3, Lp3 & 0xff) + ^ BOX (s_Ch, 4, Lp4 & 0xff) + ^ BOX (s_Ch, 5, Lp5 & 0xff) + ^ BOX (s_Ch, 6, Lp6 & 0xff) + ^ BOX (s_Ch, 7, Lp7 & 0xff); + + Ll[i] = BOX (s_Cl, 0, Lp0 & 0xff) + ^ BOX (s_Cl, 1, Lp1 & 0xff) + ^ BOX (s_Cl, 2, Lp2 & 0xff) + ^ BOX (s_Cl, 3, Lp3 & 0xff) + ^ BOX (s_Cl, 4, Lp4 & 0xff) + ^ BOX (s_Cl, 5, Lp5 & 0xff) + ^ BOX (s_Cl, 6, Lp6 & 0xff) + ^ BOX (s_Cl, 7, Lp7 & 0xff); + } + + stateh[0] = Lh[0] ^ Kh[0]; + statel[0] = Ll[0] ^ Kl[0]; + stateh[1] = Lh[1] ^ Kh[1]; + statel[1] = Ll[1] ^ Kl[1]; + stateh[2] = Lh[2] ^ Kh[2]; + statel[2] = Ll[2] ^ Kl[2]; + stateh[3] = Lh[3] ^ Kh[3]; + statel[3] = Ll[3] ^ Kl[3]; + stateh[4] = Lh[4] ^ Kh[4]; + statel[4] = Ll[4] ^ Kl[4]; + stateh[5] = Lh[5] ^ Kh[5]; + statel[5] = Ll[5] ^ Kl[5]; + stateh[6] = Lh[6] ^ Kh[6]; + statel[6] = Ll[6] ^ Kl[6]; + stateh[7] = Lh[7] ^ Kh[7]; + statel[7] = Ll[7] ^ Kl[7]; + + for (int r = 2; r <= R; r++) + { + u32x Lh[8]; + u32x Ll[8]; + + #pragma unroll + for (int i = 0; i < 8; i++) + { + const u32x Lp0 = Kh[(i + 8) & 7] >> 24; + const u32x Lp1 = Kh[(i + 7) & 7] >> 16; + const u32x Lp2 = Kh[(i + 6) & 7] >> 8; + const u32x Lp3 = Kh[(i + 5) & 7] >> 0; + const u32x Lp4 = Kl[(i + 4) & 7] >> 24; + const u32x Lp5 = Kl[(i + 3) & 7] >> 16; + const u32x Lp6 = Kl[(i + 2) & 7] >> 8; + const u32x Lp7 = Kl[(i + 1) & 7] >> 0; + + Lh[i] = BOX (s_Ch, 0, Lp0 & 0xff) + ^ BOX (s_Ch, 1, Lp1 & 0xff) + ^ BOX (s_Ch, 2, Lp2 & 0xff) + ^ BOX (s_Ch, 3, Lp3 & 0xff) + ^ BOX (s_Ch, 4, Lp4 & 0xff) + ^ BOX (s_Ch, 5, Lp5 & 0xff) + ^ BOX (s_Ch, 6, Lp6 & 0xff) + ^ BOX (s_Ch, 7, Lp7 & 0xff); + + Ll[i] = BOX (s_Cl, 0, Lp0 & 0xff) + ^ BOX (s_Cl, 1, Lp1 & 0xff) + ^ BOX (s_Cl, 2, Lp2 & 0xff) + ^ BOX (s_Cl, 3, Lp3 & 0xff) + ^ BOX (s_Cl, 4, Lp4 & 0xff) + ^ BOX (s_Cl, 5, Lp5 & 0xff) + ^ BOX (s_Cl, 6, Lp6 & 0xff) + ^ BOX (s_Cl, 7, Lp7 & 0xff); + } + + Kh[0] = Lh[0] ^ rch[r]; + Kl[0] = Ll[0] ^ rcl[r]; + Kh[1] = Lh[1]; + Kl[1] = Ll[1]; + Kh[2] = Lh[2]; + Kl[2] = Ll[2]; + Kh[3] = Lh[3]; + Kl[3] = Ll[3]; + Kh[4] = Lh[4]; + Kl[4] = Ll[4]; + Kh[5] = Lh[5]; + Kl[5] = Ll[5]; + Kh[6] = Lh[6]; + Kl[6] = Ll[6]; + Kh[7] = Lh[7]; + Kl[7] = Ll[7]; + + #pragma unroll 8 + for (int i = 0; i < 8; i++) + { + const u32x Lp0 = stateh[(i + 8) & 7] >> 24; + const u32x Lp1 = stateh[(i + 7) & 7] >> 16; + const u32x Lp2 = stateh[(i + 6) & 7] >> 8; + const u32x Lp3 = stateh[(i + 5) & 7] >> 0; + const u32x Lp4 = statel[(i + 4) & 7] >> 24; + const u32x Lp5 = statel[(i + 3) & 7] >> 16; + const u32x Lp6 = statel[(i + 2) & 7] >> 8; + const u32x Lp7 = statel[(i + 1) & 7] >> 0; + + Lh[i] = BOX (s_Ch, 0, Lp0 & 0xff) + ^ BOX (s_Ch, 1, Lp1 & 0xff) + ^ BOX (s_Ch, 2, Lp2 & 0xff) + ^ BOX (s_Ch, 3, Lp3 & 0xff) + ^ BOX (s_Ch, 4, Lp4 & 0xff) + ^ BOX (s_Ch, 5, Lp5 & 0xff) + ^ BOX (s_Ch, 6, Lp6 & 0xff) + ^ BOX (s_Ch, 7, Lp7 & 0xff); + + Ll[i] = BOX (s_Cl, 0, Lp0 & 0xff) + ^ BOX (s_Cl, 1, Lp1 & 0xff) + ^ BOX (s_Cl, 2, Lp2 & 0xff) + ^ BOX (s_Cl, 3, Lp3 & 0xff) + ^ BOX (s_Cl, 4, Lp4 & 0xff) + ^ BOX (s_Cl, 5, Lp5 & 0xff) + ^ BOX (s_Cl, 6, Lp6 & 0xff) + ^ BOX (s_Cl, 7, Lp7 & 0xff); + } + + stateh[0] = Lh[0] ^ Kh[0]; + statel[0] = Ll[0] ^ Kl[0]; + stateh[1] = Lh[1] ^ Kh[1]; + statel[1] = Ll[1] ^ Kl[1]; + stateh[2] = Lh[2] ^ Kh[2]; + statel[2] = Ll[2] ^ Kl[2]; + stateh[3] = Lh[3] ^ Kh[3]; + statel[3] = Ll[3] ^ Kl[3]; + stateh[4] = Lh[4] ^ Kh[4]; + statel[4] = Ll[4] ^ Kl[4]; + stateh[5] = Lh[5] ^ Kh[5]; + statel[5] = Ll[5] ^ Kl[5]; + stateh[6] = Lh[6] ^ Kh[6]; + statel[6] = Ll[6] ^ Kl[6]; + stateh[7] = Lh[7] ^ Kh[7]; + statel[7] = Ll[7] ^ Kl[7]; + } + + dgst[ 0] = stateh[0] ^ w[ 0]; + dgst[ 1] = statel[0] ^ w[ 1]; + dgst[ 2] = stateh[1] ^ w[ 2]; + dgst[ 3] = statel[1] ^ w[ 3]; + dgst[ 4] = stateh[2] ^ w[ 4]; + dgst[ 5] = statel[2] ^ w[ 5]; + dgst[ 6] = stateh[3] ^ w[ 6]; + dgst[ 7] = statel[3] ^ w[ 7]; + dgst[ 8] = stateh[4] ^ w[ 8]; + dgst[ 9] = statel[4] ^ w[ 9]; + dgst[10] = stateh[5] ^ w[10]; + dgst[11] = statel[5] ^ w[11]; + dgst[12] = stateh[6] ^ w[12]; + dgst[13] = statel[6] ^ w[13]; + dgst[14] = stateh[7] ^ w[14]; + dgst[15] = statel[7] ^ w[15]; +} + +__device__ __constant__ comb_t c_combs[1024]; + +extern "C" __global__ void __launch_bounds__ (256, 1) m06100_m04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + append_0x80_2 (wordl0, wordl1, pw_l_len); + + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, c_combs[0].pw_len); + } + + /** + * modifier + */ + + __shared__ u32 s_Ch[8][256]; + __shared__ u32 s_Cl[8][256]; + + for (u32 i = 0; i < 8; i++) + { + s_Ch[i][lid] = Ch[i][lid]; + s_Cl[i][lid] = Cl[i][lid]; + } + + __syncthreads (); + + if (gid >= gid_max) return; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = c_combs[il_pos].pw_len; + + const u32 pw_len = pw_l_len + pw_r_len; + + u32 wordr0[4]; + + wordr0[0] = c_combs[il_pos].i[0]; + wordr0[1] = c_combs[il_pos].i[1]; + wordr0[2] = c_combs[il_pos].i[2]; + wordr0[3] = c_combs[il_pos].i[3]; + + u32 wordr1[4]; + + wordr1[0] = c_combs[il_pos].i[4]; + wordr1[1] = c_combs[il_pos].i[5]; + wordr1[2] = c_combs[il_pos].i[6]; + wordr1[3] = c_combs[il_pos].i[7]; + + u32 wordr2[4]; + + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + + u32 wordr3[4]; + + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + u32x w0[4]; + + w0[0] = wordl0[0] | wordr0[0]; + w0[1] = wordl0[1] | wordr0[1]; + w0[2] = wordl0[2] | wordr0[2]; + w0[3] = wordl0[3] | wordr0[3]; + + u32x w1[4]; + + w1[0] = wordl1[0] | wordr1[0]; + w1[1] = wordl1[1] | wordr1[1]; + w1[2] = wordl1[2] | wordr1[2]; + w1[3] = wordl1[3] | wordr1[3]; + + u32x w2[4]; + + w2[0] = wordl2[0] | wordr2[0]; + w2[1] = wordl2[1] | wordr2[1]; + w2[2] = wordl2[2] | wordr2[2]; + w2[3] = wordl2[3] | wordr2[3]; + + u32x w3[4]; + + w3[0] = wordl3[0] | wordr3[0]; + w3[1] = wordl3[1] | wordr3[1]; + w3[2] = 0; + w3[3] = 0; + + u32x wl[16]; + + wl[ 0] = swap_workaround (w0[0]); + wl[ 1] = swap_workaround (w0[1]); + wl[ 2] = swap_workaround (w0[2]); + wl[ 3] = swap_workaround (w0[3]); + wl[ 4] = swap_workaround (w1[0]); + wl[ 5] = swap_workaround (w1[1]); + wl[ 6] = swap_workaround (w1[2]); + wl[ 7] = swap_workaround (w1[3]); + wl[ 8] = 0; + wl[ 9] = 0; + wl[10] = 0; + wl[11] = 0; + wl[12] = 0; + wl[13] = 0; + wl[14] = 0; + wl[15] = pw_len * 8; + + u32x dgst[16]; + + whirlpool_transform (wl, dgst, s_Ch, s_Cl); + + const u32x r0 = dgst[0]; + const u32x r1 = dgst[1]; + const u32x r2 = dgst[2]; + const u32x r3 = dgst[3]; + + #include VECT_COMPARE_M + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m06100_m08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m06100_m16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m06100_s04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + append_0x80_2 (wordl0, wordl1, pw_l_len); + + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, c_combs[0].pw_len); + } + + /** + * modifier + */ + + __shared__ u32 s_Ch[8][256]; + __shared__ u32 s_Cl[8][256]; + + for (u32 i = 0; i < 8; i++) + { + s_Ch[i][lid] = Ch[i][lid]; + s_Cl[i][lid] = Cl[i][lid]; + } + + __syncthreads (); + + if (gid >= gid_max) return; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = c_combs[il_pos].pw_len; + + const u32 pw_len = pw_l_len + pw_r_len; + + u32 wordr0[4]; + + wordr0[0] = c_combs[il_pos].i[0]; + wordr0[1] = c_combs[il_pos].i[1]; + wordr0[2] = c_combs[il_pos].i[2]; + wordr0[3] = c_combs[il_pos].i[3]; + + u32 wordr1[4]; + + wordr1[0] = c_combs[il_pos].i[4]; + wordr1[1] = c_combs[il_pos].i[5]; + wordr1[2] = c_combs[il_pos].i[6]; + wordr1[3] = c_combs[il_pos].i[7]; + + u32 wordr2[4]; + + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + + u32 wordr3[4]; + + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + u32x w0[4]; + + w0[0] = wordl0[0] | wordr0[0]; + w0[1] = wordl0[1] | wordr0[1]; + w0[2] = wordl0[2] | wordr0[2]; + w0[3] = wordl0[3] | wordr0[3]; + + u32x w1[4]; + + w1[0] = wordl1[0] | wordr1[0]; + w1[1] = wordl1[1] | wordr1[1]; + w1[2] = wordl1[2] | wordr1[2]; + w1[3] = wordl1[3] | wordr1[3]; + + u32x w2[4]; + + w2[0] = wordl2[0] | wordr2[0]; + w2[1] = wordl2[1] | wordr2[1]; + w2[2] = wordl2[2] | wordr2[2]; + w2[3] = wordl2[3] | wordr2[3]; + + u32x w3[4]; + + w3[0] = wordl3[0] | wordr3[0]; + w3[1] = wordl3[1] | wordr3[1]; + w3[2] = 0; + w3[3] = 0; + + u32x wl[16]; + + wl[ 0] = swap_workaround (w0[0]); + wl[ 1] = swap_workaround (w0[1]); + wl[ 2] = swap_workaround (w0[2]); + wl[ 3] = swap_workaround (w0[3]); + wl[ 4] = swap_workaround (w1[0]); + wl[ 5] = swap_workaround (w1[1]); + wl[ 6] = swap_workaround (w1[2]); + wl[ 7] = swap_workaround (w1[3]); + wl[ 8] = 0; + wl[ 9] = 0; + wl[10] = 0; + wl[11] = 0; + wl[12] = 0; + wl[13] = 0; + wl[14] = 0; + wl[15] = pw_len * 8; + + u32x dgst[16]; + + whirlpool_transform (wl, dgst, s_Ch, s_Cl); + + const u32x r0 = dgst[0]; + const u32x r1 = dgst[1]; + const u32x r2 = dgst[2]; + const u32x r3 = dgst[3]; + + #include VECT_COMPARE_S + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m06100_s08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m06100_s16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/nv/m06100_a3.cu b/nv/m06100_a3.cu new file mode 100644 index 0000000000..495f7d040e --- /dev/null +++ b/nv/m06100_a3.cu @@ -0,0 +1,1836 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _WHIRLPOOL_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW2 +#define VECT_SIZE1 +#endif + +#define DGST_R0 0 +#define DGST_R1 1 +#define DGST_R2 2 +#define DGST_R3 3 + +#include "include/kernel_functions.c" +#include "types_nv.c" +#include "common_nv.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#define R 10 + +#ifdef VECT_SIZE1 +#define BOX(S,n,i) u32x ((S)[(n)][(i)]) +#endif + +#ifdef VECT_SIZE2 +#define BOX(S,n,i) u32x ((S)[(n)][(i).x], (S)[(n)][(i).y]) +#endif + +__device__ __constant__ u32 Ch[8][256] = +{ + { + 0x18186018, 0x23238c23, 0xc6c63fc6, 0xe8e887e8, + 0x87872687, 0xb8b8dab8, 0x01010401, 0x4f4f214f, + 0x3636d836, 0xa6a6a2a6, 0xd2d26fd2, 0xf5f5f3f5, + 0x7979f979, 0x6f6fa16f, 0x91917e91, 0x52525552, + 0x60609d60, 0xbcbccabc, 0x9b9b569b, 0x8e8e028e, + 0xa3a3b6a3, 0x0c0c300c, 0x7b7bf17b, 0x3535d435, + 0x1d1d741d, 0xe0e0a7e0, 0xd7d77bd7, 0xc2c22fc2, + 0x2e2eb82e, 0x4b4b314b, 0xfefedffe, 0x57574157, + 0x15155415, 0x7777c177, 0x3737dc37, 0xe5e5b3e5, + 0x9f9f469f, 0xf0f0e7f0, 0x4a4a354a, 0xdada4fda, + 0x58587d58, 0xc9c903c9, 0x2929a429, 0x0a0a280a, + 0xb1b1feb1, 0xa0a0baa0, 0x6b6bb16b, 0x85852e85, + 0xbdbdcebd, 0x5d5d695d, 0x10104010, 0xf4f4f7f4, + 0xcbcb0bcb, 0x3e3ef83e, 0x05051405, 0x67678167, + 0xe4e4b7e4, 0x27279c27, 0x41411941, 0x8b8b168b, + 0xa7a7a6a7, 0x7d7de97d, 0x95956e95, 0xd8d847d8, + 0xfbfbcbfb, 0xeeee9fee, 0x7c7ced7c, 0x66668566, + 0xdddd53dd, 0x17175c17, 0x47470147, 0x9e9e429e, + 0xcaca0fca, 0x2d2db42d, 0xbfbfc6bf, 0x07071c07, + 0xadad8ead, 0x5a5a755a, 0x83833683, 0x3333cc33, + 0x63639163, 0x02020802, 0xaaaa92aa, 0x7171d971, + 0xc8c807c8, 0x19196419, 0x49493949, 0xd9d943d9, + 0xf2f2eff2, 0xe3e3abe3, 0x5b5b715b, 0x88881a88, + 0x9a9a529a, 0x26269826, 0x3232c832, 0xb0b0fab0, + 0xe9e983e9, 0x0f0f3c0f, 0xd5d573d5, 0x80803a80, + 0xbebec2be, 0xcdcd13cd, 0x3434d034, 0x48483d48, + 0xffffdbff, 0x7a7af57a, 0x90907a90, 0x5f5f615f, + 0x20208020, 0x6868bd68, 0x1a1a681a, 0xaeae82ae, + 0xb4b4eab4, 0x54544d54, 0x93937693, 0x22228822, + 0x64648d64, 0xf1f1e3f1, 0x7373d173, 0x12124812, + 0x40401d40, 0x08082008, 0xc3c32bc3, 0xecec97ec, + 0xdbdb4bdb, 0xa1a1bea1, 0x8d8d0e8d, 0x3d3df43d, + 0x97976697, 0x00000000, 0xcfcf1bcf, 0x2b2bac2b, + 0x7676c576, 0x82823282, 0xd6d67fd6, 0x1b1b6c1b, + 0xb5b5eeb5, 0xafaf86af, 0x6a6ab56a, 0x50505d50, + 0x45450945, 0xf3f3ebf3, 0x3030c030, 0xefef9bef, + 0x3f3ffc3f, 0x55554955, 0xa2a2b2a2, 0xeaea8fea, + 0x65658965, 0xbabad2ba, 0x2f2fbc2f, 0xc0c027c0, + 0xdede5fde, 0x1c1c701c, 0xfdfdd3fd, 0x4d4d294d, + 0x92927292, 0x7575c975, 0x06061806, 0x8a8a128a, + 0xb2b2f2b2, 0xe6e6bfe6, 0x0e0e380e, 0x1f1f7c1f, + 0x62629562, 0xd4d477d4, 0xa8a89aa8, 0x96966296, + 0xf9f9c3f9, 0xc5c533c5, 0x25259425, 0x59597959, + 0x84842a84, 0x7272d572, 0x3939e439, 0x4c4c2d4c, + 0x5e5e655e, 0x7878fd78, 0x3838e038, 0x8c8c0a8c, + 0xd1d163d1, 0xa5a5aea5, 0xe2e2afe2, 0x61619961, + 0xb3b3f6b3, 0x21218421, 0x9c9c4a9c, 0x1e1e781e, + 0x43431143, 0xc7c73bc7, 0xfcfcd7fc, 0x04041004, + 0x51515951, 0x99995e99, 0x6d6da96d, 0x0d0d340d, + 0xfafacffa, 0xdfdf5bdf, 0x7e7ee57e, 0x24249024, + 0x3b3bec3b, 0xabab96ab, 0xcece1fce, 0x11114411, + 0x8f8f068f, 0x4e4e254e, 0xb7b7e6b7, 0xebeb8beb, + 0x3c3cf03c, 0x81813e81, 0x94946a94, 0xf7f7fbf7, + 0xb9b9deb9, 0x13134c13, 0x2c2cb02c, 0xd3d36bd3, + 0xe7e7bbe7, 0x6e6ea56e, 0xc4c437c4, 0x03030c03, + 0x56564556, 0x44440d44, 0x7f7fe17f, 0xa9a99ea9, + 0x2a2aa82a, 0xbbbbd6bb, 0xc1c123c1, 0x53535153, + 0xdcdc57dc, 0x0b0b2c0b, 0x9d9d4e9d, 0x6c6cad6c, + 0x3131c431, 0x7474cd74, 0xf6f6fff6, 0x46460546, + 0xacac8aac, 0x89891e89, 0x14145014, 0xe1e1a3e1, + 0x16165816, 0x3a3ae83a, 0x6969b969, 0x09092409, + 0x7070dd70, 0xb6b6e2b6, 0xd0d067d0, 0xeded93ed, + 0xcccc17cc, 0x42421542, 0x98985a98, 0xa4a4aaa4, + 0x2828a028, 0x5c5c6d5c, 0xf8f8c7f8, 0x86862286, + }, + { + 0xd8181860, 0x2623238c, 0xb8c6c63f, 0xfbe8e887, + 0xcb878726, 0x11b8b8da, 0x09010104, 0x0d4f4f21, + 0x9b3636d8, 0xffa6a6a2, 0x0cd2d26f, 0x0ef5f5f3, + 0x967979f9, 0x306f6fa1, 0x6d91917e, 0xf8525255, + 0x4760609d, 0x35bcbcca, 0x379b9b56, 0x8a8e8e02, + 0xd2a3a3b6, 0x6c0c0c30, 0x847b7bf1, 0x803535d4, + 0xf51d1d74, 0xb3e0e0a7, 0x21d7d77b, 0x9cc2c22f, + 0x432e2eb8, 0x294b4b31, 0x5dfefedf, 0xd5575741, + 0xbd151554, 0xe87777c1, 0x923737dc, 0x9ee5e5b3, + 0x139f9f46, 0x23f0f0e7, 0x204a4a35, 0x44dada4f, + 0xa258587d, 0xcfc9c903, 0x7c2929a4, 0x5a0a0a28, + 0x50b1b1fe, 0xc9a0a0ba, 0x146b6bb1, 0xd985852e, + 0x3cbdbdce, 0x8f5d5d69, 0x90101040, 0x07f4f4f7, + 0xddcbcb0b, 0xd33e3ef8, 0x2d050514, 0x78676781, + 0x97e4e4b7, 0x0227279c, 0x73414119, 0xa78b8b16, + 0xf6a7a7a6, 0xb27d7de9, 0x4995956e, 0x56d8d847, + 0x70fbfbcb, 0xcdeeee9f, 0xbb7c7ced, 0x71666685, + 0x7bdddd53, 0xaf17175c, 0x45474701, 0x1a9e9e42, + 0xd4caca0f, 0x582d2db4, 0x2ebfbfc6, 0x3f07071c, + 0xacadad8e, 0xb05a5a75, 0xef838336, 0xb63333cc, + 0x5c636391, 0x12020208, 0x93aaaa92, 0xde7171d9, + 0xc6c8c807, 0xd1191964, 0x3b494939, 0x5fd9d943, + 0x31f2f2ef, 0xa8e3e3ab, 0xb95b5b71, 0xbc88881a, + 0x3e9a9a52, 0x0b262698, 0xbf3232c8, 0x59b0b0fa, + 0xf2e9e983, 0x770f0f3c, 0x33d5d573, 0xf480803a, + 0x27bebec2, 0xebcdcd13, 0x893434d0, 0x3248483d, + 0x54ffffdb, 0x8d7a7af5, 0x6490907a, 0x9d5f5f61, + 0x3d202080, 0x0f6868bd, 0xca1a1a68, 0xb7aeae82, + 0x7db4b4ea, 0xce54544d, 0x7f939376, 0x2f222288, + 0x6364648d, 0x2af1f1e3, 0xcc7373d1, 0x82121248, + 0x7a40401d, 0x48080820, 0x95c3c32b, 0xdfecec97, + 0x4ddbdb4b, 0xc0a1a1be, 0x918d8d0e, 0xc83d3df4, + 0x5b979766, 0x00000000, 0xf9cfcf1b, 0x6e2b2bac, + 0xe17676c5, 0xe6828232, 0x28d6d67f, 0xc31b1b6c, + 0x74b5b5ee, 0xbeafaf86, 0x1d6a6ab5, 0xea50505d, + 0x57454509, 0x38f3f3eb, 0xad3030c0, 0xc4efef9b, + 0xda3f3ffc, 0xc7555549, 0xdba2a2b2, 0xe9eaea8f, + 0x6a656589, 0x03babad2, 0x4a2f2fbc, 0x8ec0c027, + 0x60dede5f, 0xfc1c1c70, 0x46fdfdd3, 0x1f4d4d29, + 0x76929272, 0xfa7575c9, 0x36060618, 0xae8a8a12, + 0x4bb2b2f2, 0x85e6e6bf, 0x7e0e0e38, 0xe71f1f7c, + 0x55626295, 0x3ad4d477, 0x81a8a89a, 0x52969662, + 0x62f9f9c3, 0xa3c5c533, 0x10252594, 0xab595979, + 0xd084842a, 0xc57272d5, 0xec3939e4, 0x164c4c2d, + 0x945e5e65, 0x9f7878fd, 0xe53838e0, 0x988c8c0a, + 0x17d1d163, 0xe4a5a5ae, 0xa1e2e2af, 0x4e616199, + 0x42b3b3f6, 0x34212184, 0x089c9c4a, 0xee1e1e78, + 0x61434311, 0xb1c7c73b, 0x4ffcfcd7, 0x24040410, + 0xe3515159, 0x2599995e, 0x226d6da9, 0x650d0d34, + 0x79fafacf, 0x69dfdf5b, 0xa97e7ee5, 0x19242490, + 0xfe3b3bec, 0x9aabab96, 0xf0cece1f, 0x99111144, + 0x838f8f06, 0x044e4e25, 0x66b7b7e6, 0xe0ebeb8b, + 0xc13c3cf0, 0xfd81813e, 0x4094946a, 0x1cf7f7fb, + 0x18b9b9de, 0x8b13134c, 0x512c2cb0, 0x05d3d36b, + 0x8ce7e7bb, 0x396e6ea5, 0xaac4c437, 0x1b03030c, + 0xdc565645, 0x5e44440d, 0xa07f7fe1, 0x88a9a99e, + 0x672a2aa8, 0x0abbbbd6, 0x87c1c123, 0xf1535351, + 0x72dcdc57, 0x530b0b2c, 0x019d9d4e, 0x2b6c6cad, + 0xa43131c4, 0xf37474cd, 0x15f6f6ff, 0x4c464605, + 0xa5acac8a, 0xb589891e, 0xb4141450, 0xbae1e1a3, + 0xa6161658, 0xf73a3ae8, 0x066969b9, 0x41090924, + 0xd77070dd, 0x6fb6b6e2, 0x1ed0d067, 0xd6eded93, + 0xe2cccc17, 0x68424215, 0x2c98985a, 0xeda4a4aa, + 0x752828a0, 0x865c5c6d, 0x6bf8f8c7, 0xc2868622, + }, + { + 0x30d81818, 0x46262323, 0x91b8c6c6, 0xcdfbe8e8, + 0x13cb8787, 0x6d11b8b8, 0x02090101, 0x9e0d4f4f, + 0x6c9b3636, 0x51ffa6a6, 0xb90cd2d2, 0xf70ef5f5, + 0xf2967979, 0xde306f6f, 0x3f6d9191, 0xa4f85252, + 0xc0476060, 0x6535bcbc, 0x2b379b9b, 0x018a8e8e, + 0x5bd2a3a3, 0x186c0c0c, 0xf6847b7b, 0x6a803535, + 0x3af51d1d, 0xddb3e0e0, 0xb321d7d7, 0x999cc2c2, + 0x5c432e2e, 0x96294b4b, 0xe15dfefe, 0xaed55757, + 0x2abd1515, 0xeee87777, 0x6e923737, 0xd79ee5e5, + 0x23139f9f, 0xfd23f0f0, 0x94204a4a, 0xa944dada, + 0xb0a25858, 0x8fcfc9c9, 0x527c2929, 0x145a0a0a, + 0x7f50b1b1, 0x5dc9a0a0, 0xd6146b6b, 0x17d98585, + 0x673cbdbd, 0xba8f5d5d, 0x20901010, 0xf507f4f4, + 0x8bddcbcb, 0x7cd33e3e, 0x0a2d0505, 0xce786767, + 0xd597e4e4, 0x4e022727, 0x82734141, 0x0ba78b8b, + 0x53f6a7a7, 0xfab27d7d, 0x37499595, 0xad56d8d8, + 0xeb70fbfb, 0xc1cdeeee, 0xf8bb7c7c, 0xcc716666, + 0xa77bdddd, 0x2eaf1717, 0x8e454747, 0x211a9e9e, + 0x89d4caca, 0x5a582d2d, 0x632ebfbf, 0x0e3f0707, + 0x47acadad, 0xb4b05a5a, 0x1bef8383, 0x66b63333, + 0xc65c6363, 0x04120202, 0x4993aaaa, 0xe2de7171, + 0x8dc6c8c8, 0x32d11919, 0x923b4949, 0xaf5fd9d9, + 0xf931f2f2, 0xdba8e3e3, 0xb6b95b5b, 0x0dbc8888, + 0x293e9a9a, 0x4c0b2626, 0x64bf3232, 0x7d59b0b0, + 0xcff2e9e9, 0x1e770f0f, 0xb733d5d5, 0x1df48080, + 0x6127bebe, 0x87ebcdcd, 0x68893434, 0x90324848, + 0xe354ffff, 0xf48d7a7a, 0x3d649090, 0xbe9d5f5f, + 0x403d2020, 0xd00f6868, 0x34ca1a1a, 0x41b7aeae, + 0x757db4b4, 0xa8ce5454, 0x3b7f9393, 0x442f2222, + 0xc8636464, 0xff2af1f1, 0xe6cc7373, 0x24821212, + 0x807a4040, 0x10480808, 0x9b95c3c3, 0xc5dfecec, + 0xab4ddbdb, 0x5fc0a1a1, 0x07918d8d, 0x7ac83d3d, + 0x335b9797, 0x00000000, 0x83f9cfcf, 0x566e2b2b, + 0xece17676, 0x19e68282, 0xb128d6d6, 0x36c31b1b, + 0x7774b5b5, 0x43beafaf, 0xd41d6a6a, 0xa0ea5050, + 0x8a574545, 0xfb38f3f3, 0x60ad3030, 0xc3c4efef, + 0x7eda3f3f, 0xaac75555, 0x59dba2a2, 0xc9e9eaea, + 0xca6a6565, 0x6903baba, 0x5e4a2f2f, 0x9d8ec0c0, + 0xa160dede, 0x38fc1c1c, 0xe746fdfd, 0x9a1f4d4d, + 0x39769292, 0xeafa7575, 0x0c360606, 0x09ae8a8a, + 0x794bb2b2, 0xd185e6e6, 0x1c7e0e0e, 0x3ee71f1f, + 0xc4556262, 0xb53ad4d4, 0x4d81a8a8, 0x31529696, + 0xef62f9f9, 0x97a3c5c5, 0x4a102525, 0xb2ab5959, + 0x15d08484, 0xe4c57272, 0x72ec3939, 0x98164c4c, + 0xbc945e5e, 0xf09f7878, 0x70e53838, 0x05988c8c, + 0xbf17d1d1, 0x57e4a5a5, 0xd9a1e2e2, 0xc24e6161, + 0x7b42b3b3, 0x42342121, 0x25089c9c, 0x3cee1e1e, + 0x86614343, 0x93b1c7c7, 0xe54ffcfc, 0x08240404, + 0xa2e35151, 0x2f259999, 0xda226d6d, 0x1a650d0d, + 0xe979fafa, 0xa369dfdf, 0xfca97e7e, 0x48192424, + 0x76fe3b3b, 0x4b9aabab, 0x81f0cece, 0x22991111, + 0x03838f8f, 0x9c044e4e, 0x7366b7b7, 0xcbe0ebeb, + 0x78c13c3c, 0x1ffd8181, 0x35409494, 0xf31cf7f7, + 0x6f18b9b9, 0x268b1313, 0x58512c2c, 0xbb05d3d3, + 0xd38ce7e7, 0xdc396e6e, 0x95aac4c4, 0x061b0303, + 0xacdc5656, 0x885e4444, 0xfea07f7f, 0x4f88a9a9, + 0x54672a2a, 0x6b0abbbb, 0x9f87c1c1, 0xa6f15353, + 0xa572dcdc, 0x16530b0b, 0x27019d9d, 0xd82b6c6c, + 0x62a43131, 0xe8f37474, 0xf115f6f6, 0x8c4c4646, + 0x45a5acac, 0x0fb58989, 0x28b41414, 0xdfbae1e1, + 0x2ca61616, 0x74f73a3a, 0xd2066969, 0x12410909, + 0xe0d77070, 0x716fb6b6, 0xbd1ed0d0, 0xc7d6eded, + 0x85e2cccc, 0x84684242, 0x2d2c9898, 0x55eda4a4, + 0x50752828, 0xb8865c5c, 0xed6bf8f8, 0x11c28686, + }, + { + 0x7830d818, 0xaf462623, 0xf991b8c6, 0x6fcdfbe8, + 0xa113cb87, 0x626d11b8, 0x05020901, 0x6e9e0d4f, + 0xee6c9b36, 0x0451ffa6, 0xbdb90cd2, 0x06f70ef5, + 0x80f29679, 0xcede306f, 0xef3f6d91, 0x07a4f852, + 0xfdc04760, 0x766535bc, 0xcd2b379b, 0x8c018a8e, + 0x155bd2a3, 0x3c186c0c, 0x8af6847b, 0xe16a8035, + 0x693af51d, 0x47ddb3e0, 0xacb321d7, 0xed999cc2, + 0x965c432e, 0x7a96294b, 0x21e15dfe, 0x16aed557, + 0x412abd15, 0xb6eee877, 0xeb6e9237, 0x56d79ee5, + 0xd923139f, 0x17fd23f0, 0x7f94204a, 0x95a944da, + 0x25b0a258, 0xca8fcfc9, 0x8d527c29, 0x22145a0a, + 0x4f7f50b1, 0x1a5dc9a0, 0xdad6146b, 0xab17d985, + 0x73673cbd, 0x34ba8f5d, 0x50209010, 0x03f507f4, + 0xc08bddcb, 0xc67cd33e, 0x110a2d05, 0xe6ce7867, + 0x53d597e4, 0xbb4e0227, 0x58827341, 0x9d0ba78b, + 0x0153f6a7, 0x94fab27d, 0xfb374995, 0x9fad56d8, + 0x30eb70fb, 0x71c1cdee, 0x91f8bb7c, 0xe3cc7166, + 0x8ea77bdd, 0x4b2eaf17, 0x468e4547, 0xdc211a9e, + 0xc589d4ca, 0x995a582d, 0x79632ebf, 0x1b0e3f07, + 0x2347acad, 0x2fb4b05a, 0xb51bef83, 0xff66b633, + 0xf2c65c63, 0x0a041202, 0x384993aa, 0xa8e2de71, + 0xcf8dc6c8, 0x7d32d119, 0x70923b49, 0x9aaf5fd9, + 0x1df931f2, 0x48dba8e3, 0x2ab6b95b, 0x920dbc88, + 0xc8293e9a, 0xbe4c0b26, 0xfa64bf32, 0x4a7d59b0, + 0x6acff2e9, 0x331e770f, 0xa6b733d5, 0xba1df480, + 0x7c6127be, 0xde87ebcd, 0xe4688934, 0x75903248, + 0x24e354ff, 0x8ff48d7a, 0xea3d6490, 0x3ebe9d5f, + 0xa0403d20, 0xd5d00f68, 0x7234ca1a, 0x2c41b7ae, + 0x5e757db4, 0x19a8ce54, 0xe53b7f93, 0xaa442f22, + 0xe9c86364, 0x12ff2af1, 0xa2e6cc73, 0x5a248212, + 0x5d807a40, 0x28104808, 0xe89b95c3, 0x7bc5dfec, + 0x90ab4ddb, 0x1f5fc0a1, 0x8307918d, 0xc97ac83d, + 0xf1335b97, 0x00000000, 0xd483f9cf, 0x87566e2b, + 0xb3ece176, 0xb019e682, 0xa9b128d6, 0x7736c31b, + 0x5b7774b5, 0x2943beaf, 0xdfd41d6a, 0x0da0ea50, + 0x4c8a5745, 0x18fb38f3, 0xf060ad30, 0x74c3c4ef, + 0xc37eda3f, 0x1caac755, 0x1059dba2, 0x65c9e9ea, + 0xecca6a65, 0x686903ba, 0x935e4a2f, 0xe79d8ec0, + 0x81a160de, 0x6c38fc1c, 0x2ee746fd, 0x649a1f4d, + 0xe0397692, 0xbceafa75, 0x1e0c3606, 0x9809ae8a, + 0x40794bb2, 0x59d185e6, 0x361c7e0e, 0x633ee71f, + 0xf7c45562, 0xa3b53ad4, 0x324d81a8, 0xf4315296, + 0x3aef62f9, 0xf697a3c5, 0xb14a1025, 0x20b2ab59, + 0xae15d084, 0xa7e4c572, 0xdd72ec39, 0x6198164c, + 0x3bbc945e, 0x85f09f78, 0xd870e538, 0x8605988c, + 0xb2bf17d1, 0x0b57e4a5, 0x4dd9a1e2, 0xf8c24e61, + 0x457b42b3, 0xa5423421, 0xd625089c, 0x663cee1e, + 0x52866143, 0xfc93b1c7, 0x2be54ffc, 0x14082404, + 0x08a2e351, 0xc72f2599, 0xc4da226d, 0x391a650d, + 0x35e979fa, 0x84a369df, 0x9bfca97e, 0xb4481924, + 0xd776fe3b, 0x3d4b9aab, 0xd181f0ce, 0x55229911, + 0x8903838f, 0x6b9c044e, 0x517366b7, 0x60cbe0eb, + 0xcc78c13c, 0xbf1ffd81, 0xfe354094, 0x0cf31cf7, + 0x676f18b9, 0x5f268b13, 0x9c58512c, 0xb8bb05d3, + 0x5cd38ce7, 0xcbdc396e, 0xf395aac4, 0x0f061b03, + 0x13acdc56, 0x49885e44, 0x9efea07f, 0x374f88a9, + 0x8254672a, 0x6d6b0abb, 0xe29f87c1, 0x02a6f153, + 0x8ba572dc, 0x2716530b, 0xd327019d, 0xc1d82b6c, + 0xf562a431, 0xb9e8f374, 0x09f115f6, 0x438c4c46, + 0x2645a5ac, 0x970fb589, 0x4428b414, 0x42dfbae1, + 0x4e2ca616, 0xd274f73a, 0xd0d20669, 0x2d124109, + 0xade0d770, 0x54716fb6, 0xb7bd1ed0, 0x7ec7d6ed, + 0xdb85e2cc, 0x57846842, 0xc22d2c98, 0x0e55eda4, + 0x88507528, 0x31b8865c, 0x3fed6bf8, 0xa411c286, + }, + { + 0xc07830d8, 0x05af4626, 0x7ef991b8, 0x136fcdfb, + 0x4ca113cb, 0xa9626d11, 0x08050209, 0x426e9e0d, + 0xadee6c9b, 0x590451ff, 0xdebdb90c, 0xfb06f70e, + 0xef80f296, 0x5fcede30, 0xfcef3f6d, 0xaa07a4f8, + 0x27fdc047, 0x89766535, 0xaccd2b37, 0x048c018a, + 0x71155bd2, 0x603c186c, 0xff8af684, 0xb5e16a80, + 0xe8693af5, 0x5347ddb3, 0xf6acb321, 0x5eed999c, + 0x6d965c43, 0x627a9629, 0xa321e15d, 0x8216aed5, + 0xa8412abd, 0x9fb6eee8, 0xa5eb6e92, 0x7b56d79e, + 0x8cd92313, 0xd317fd23, 0x6a7f9420, 0x9e95a944, + 0xfa25b0a2, 0x06ca8fcf, 0x558d527c, 0x5022145a, + 0xe14f7f50, 0x691a5dc9, 0x7fdad614, 0x5cab17d9, + 0x8173673c, 0xd234ba8f, 0x80502090, 0xf303f507, + 0x16c08bdd, 0xedc67cd3, 0x28110a2d, 0x1fe6ce78, + 0x7353d597, 0x25bb4e02, 0x32588273, 0x2c9d0ba7, + 0x510153f6, 0xcf94fab2, 0xdcfb3749, 0x8e9fad56, + 0x8b30eb70, 0x2371c1cd, 0xc791f8bb, 0x17e3cc71, + 0xa68ea77b, 0xb84b2eaf, 0x02468e45, 0x84dc211a, + 0x1ec589d4, 0x75995a58, 0x9179632e, 0x381b0e3f, + 0x012347ac, 0xea2fb4b0, 0x6cb51bef, 0x85ff66b6, + 0x3ff2c65c, 0x100a0412, 0x39384993, 0xafa8e2de, + 0x0ecf8dc6, 0xc87d32d1, 0x7270923b, 0x869aaf5f, + 0xc31df931, 0x4b48dba8, 0xe22ab6b9, 0x34920dbc, + 0xa4c8293e, 0x2dbe4c0b, 0x8dfa64bf, 0xe94a7d59, + 0x1b6acff2, 0x78331e77, 0xe6a6b733, 0x74ba1df4, + 0x997c6127, 0x26de87eb, 0xbde46889, 0x7a759032, + 0xab24e354, 0xf78ff48d, 0xf4ea3d64, 0xc23ebe9d, + 0x1da0403d, 0x67d5d00f, 0xd07234ca, 0x192c41b7, + 0xc95e757d, 0x9a19a8ce, 0xece53b7f, 0x0daa442f, + 0x07e9c863, 0xdb12ff2a, 0xbfa2e6cc, 0x905a2482, + 0x3a5d807a, 0x40281048, 0x56e89b95, 0x337bc5df, + 0x9690ab4d, 0x611f5fc0, 0x1c830791, 0xf5c97ac8, + 0xccf1335b, 0x00000000, 0x36d483f9, 0x4587566e, + 0x97b3ece1, 0x64b019e6, 0xfea9b128, 0xd87736c3, + 0xc15b7774, 0x112943be, 0x77dfd41d, 0xba0da0ea, + 0x124c8a57, 0xcb18fb38, 0x9df060ad, 0x2b74c3c4, + 0xe5c37eda, 0x921caac7, 0x791059db, 0x0365c9e9, + 0x0fecca6a, 0xb9686903, 0x65935e4a, 0x4ee79d8e, + 0xbe81a160, 0xe06c38fc, 0xbb2ee746, 0x52649a1f, + 0xe4e03976, 0x8fbceafa, 0x301e0c36, 0x249809ae, + 0xf940794b, 0x6359d185, 0x70361c7e, 0xf8633ee7, + 0x37f7c455, 0xeea3b53a, 0x29324d81, 0xc4f43152, + 0x9b3aef62, 0x66f697a3, 0x35b14a10, 0xf220b2ab, + 0x54ae15d0, 0xb7a7e4c5, 0xd5dd72ec, 0x5a619816, + 0xca3bbc94, 0xe785f09f, 0xddd870e5, 0x14860598, + 0xc6b2bf17, 0x410b57e4, 0x434dd9a1, 0x2ff8c24e, + 0xf1457b42, 0x15a54234, 0x94d62508, 0xf0663cee, + 0x22528661, 0x76fc93b1, 0xb32be54f, 0x20140824, + 0xb208a2e3, 0xbcc72f25, 0x4fc4da22, 0x68391a65, + 0x8335e979, 0xb684a369, 0xd79bfca9, 0x3db44819, + 0xc5d776fe, 0x313d4b9a, 0x3ed181f0, 0x88552299, + 0x0c890383, 0x4a6b9c04, 0xd1517366, 0x0b60cbe0, + 0xfdcc78c1, 0x7cbf1ffd, 0xd4fe3540, 0xeb0cf31c, + 0xa1676f18, 0x985f268b, 0x7d9c5851, 0xd6b8bb05, + 0x6b5cd38c, 0x57cbdc39, 0x6ef395aa, 0x180f061b, + 0x8a13acdc, 0x1a49885e, 0xdf9efea0, 0x21374f88, + 0x4d825467, 0xb16d6b0a, 0x46e29f87, 0xa202a6f1, + 0xae8ba572, 0x58271653, 0x9cd32701, 0x47c1d82b, + 0x95f562a4, 0x87b9e8f3, 0xe309f115, 0x0a438c4c, + 0x092645a5, 0x3c970fb5, 0xa04428b4, 0x5b42dfba, + 0xb04e2ca6, 0xcdd274f7, 0x6fd0d206, 0x482d1241, + 0xa7ade0d7, 0xd954716f, 0xceb7bd1e, 0x3b7ec7d6, + 0x2edb85e2, 0x2a578468, 0xb4c22d2c, 0x490e55ed, + 0x5d885075, 0xda31b886, 0x933fed6b, 0x44a411c2, + }, + { + 0x18c07830, 0x2305af46, 0xc67ef991, 0xe8136fcd, + 0x874ca113, 0xb8a9626d, 0x01080502, 0x4f426e9e, + 0x36adee6c, 0xa6590451, 0xd2debdb9, 0xf5fb06f7, + 0x79ef80f2, 0x6f5fcede, 0x91fcef3f, 0x52aa07a4, + 0x6027fdc0, 0xbc897665, 0x9baccd2b, 0x8e048c01, + 0xa371155b, 0x0c603c18, 0x7bff8af6, 0x35b5e16a, + 0x1de8693a, 0xe05347dd, 0xd7f6acb3, 0xc25eed99, + 0x2e6d965c, 0x4b627a96, 0xfea321e1, 0x578216ae, + 0x15a8412a, 0x779fb6ee, 0x37a5eb6e, 0xe57b56d7, + 0x9f8cd923, 0xf0d317fd, 0x4a6a7f94, 0xda9e95a9, + 0x58fa25b0, 0xc906ca8f, 0x29558d52, 0x0a502214, + 0xb1e14f7f, 0xa0691a5d, 0x6b7fdad6, 0x855cab17, + 0xbd817367, 0x5dd234ba, 0x10805020, 0xf4f303f5, + 0xcb16c08b, 0x3eedc67c, 0x0528110a, 0x671fe6ce, + 0xe47353d5, 0x2725bb4e, 0x41325882, 0x8b2c9d0b, + 0xa7510153, 0x7dcf94fa, 0x95dcfb37, 0xd88e9fad, + 0xfb8b30eb, 0xee2371c1, 0x7cc791f8, 0x6617e3cc, + 0xdda68ea7, 0x17b84b2e, 0x4702468e, 0x9e84dc21, + 0xca1ec589, 0x2d75995a, 0xbf917963, 0x07381b0e, + 0xad012347, 0x5aea2fb4, 0x836cb51b, 0x3385ff66, + 0x633ff2c6, 0x02100a04, 0xaa393849, 0x71afa8e2, + 0xc80ecf8d, 0x19c87d32, 0x49727092, 0xd9869aaf, + 0xf2c31df9, 0xe34b48db, 0x5be22ab6, 0x8834920d, + 0x9aa4c829, 0x262dbe4c, 0x328dfa64, 0xb0e94a7d, + 0xe91b6acf, 0x0f78331e, 0xd5e6a6b7, 0x8074ba1d, + 0xbe997c61, 0xcd26de87, 0x34bde468, 0x487a7590, + 0xffab24e3, 0x7af78ff4, 0x90f4ea3d, 0x5fc23ebe, + 0x201da040, 0x6867d5d0, 0x1ad07234, 0xae192c41, + 0xb4c95e75, 0x549a19a8, 0x93ece53b, 0x220daa44, + 0x6407e9c8, 0xf1db12ff, 0x73bfa2e6, 0x12905a24, + 0x403a5d80, 0x08402810, 0xc356e89b, 0xec337bc5, + 0xdb9690ab, 0xa1611f5f, 0x8d1c8307, 0x3df5c97a, + 0x97ccf133, 0x00000000, 0xcf36d483, 0x2b458756, + 0x7697b3ec, 0x8264b019, 0xd6fea9b1, 0x1bd87736, + 0xb5c15b77, 0xaf112943, 0x6a77dfd4, 0x50ba0da0, + 0x45124c8a, 0xf3cb18fb, 0x309df060, 0xef2b74c3, + 0x3fe5c37e, 0x55921caa, 0xa2791059, 0xea0365c9, + 0x650fecca, 0xbab96869, 0x2f65935e, 0xc04ee79d, + 0xdebe81a1, 0x1ce06c38, 0xfdbb2ee7, 0x4d52649a, + 0x92e4e039, 0x758fbcea, 0x06301e0c, 0x8a249809, + 0xb2f94079, 0xe66359d1, 0x0e70361c, 0x1ff8633e, + 0x6237f7c4, 0xd4eea3b5, 0xa829324d, 0x96c4f431, + 0xf99b3aef, 0xc566f697, 0x2535b14a, 0x59f220b2, + 0x8454ae15, 0x72b7a7e4, 0x39d5dd72, 0x4c5a6198, + 0x5eca3bbc, 0x78e785f0, 0x38ddd870, 0x8c148605, + 0xd1c6b2bf, 0xa5410b57, 0xe2434dd9, 0x612ff8c2, + 0xb3f1457b, 0x2115a542, 0x9c94d625, 0x1ef0663c, + 0x43225286, 0xc776fc93, 0xfcb32be5, 0x04201408, + 0x51b208a2, 0x99bcc72f, 0x6d4fc4da, 0x0d68391a, + 0xfa8335e9, 0xdfb684a3, 0x7ed79bfc, 0x243db448, + 0x3bc5d776, 0xab313d4b, 0xce3ed181, 0x11885522, + 0x8f0c8903, 0x4e4a6b9c, 0xb7d15173, 0xeb0b60cb, + 0x3cfdcc78, 0x817cbf1f, 0x94d4fe35, 0xf7eb0cf3, + 0xb9a1676f, 0x13985f26, 0x2c7d9c58, 0xd3d6b8bb, + 0xe76b5cd3, 0x6e57cbdc, 0xc46ef395, 0x03180f06, + 0x568a13ac, 0x441a4988, 0x7fdf9efe, 0xa921374f, + 0x2a4d8254, 0xbbb16d6b, 0xc146e29f, 0x53a202a6, + 0xdcae8ba5, 0x0b582716, 0x9d9cd327, 0x6c47c1d8, + 0x3195f562, 0x7487b9e8, 0xf6e309f1, 0x460a438c, + 0xac092645, 0x893c970f, 0x14a04428, 0xe15b42df, + 0x16b04e2c, 0x3acdd274, 0x696fd0d2, 0x09482d12, + 0x70a7ade0, 0xb6d95471, 0xd0ceb7bd, 0xed3b7ec7, + 0xcc2edb85, 0x422a5784, 0x98b4c22d, 0xa4490e55, + 0x285d8850, 0x5cda31b8, 0xf8933fed, 0x8644a411, + }, + { + 0x6018c078, 0x8c2305af, 0x3fc67ef9, 0x87e8136f, + 0x26874ca1, 0xdab8a962, 0x04010805, 0x214f426e, + 0xd836adee, 0xa2a65904, 0x6fd2debd, 0xf3f5fb06, + 0xf979ef80, 0xa16f5fce, 0x7e91fcef, 0x5552aa07, + 0x9d6027fd, 0xcabc8976, 0x569baccd, 0x028e048c, + 0xb6a37115, 0x300c603c, 0xf17bff8a, 0xd435b5e1, + 0x741de869, 0xa7e05347, 0x7bd7f6ac, 0x2fc25eed, + 0xb82e6d96, 0x314b627a, 0xdffea321, 0x41578216, + 0x5415a841, 0xc1779fb6, 0xdc37a5eb, 0xb3e57b56, + 0x469f8cd9, 0xe7f0d317, 0x354a6a7f, 0x4fda9e95, + 0x7d58fa25, 0x03c906ca, 0xa429558d, 0x280a5022, + 0xfeb1e14f, 0xbaa0691a, 0xb16b7fda, 0x2e855cab, + 0xcebd8173, 0x695dd234, 0x40108050, 0xf7f4f303, + 0x0bcb16c0, 0xf83eedc6, 0x14052811, 0x81671fe6, + 0xb7e47353, 0x9c2725bb, 0x19413258, 0x168b2c9d, + 0xa6a75101, 0xe97dcf94, 0x6e95dcfb, 0x47d88e9f, + 0xcbfb8b30, 0x9fee2371, 0xed7cc791, 0x856617e3, + 0x53dda68e, 0x5c17b84b, 0x01470246, 0x429e84dc, + 0x0fca1ec5, 0xb42d7599, 0xc6bf9179, 0x1c07381b, + 0x8ead0123, 0x755aea2f, 0x36836cb5, 0xcc3385ff, + 0x91633ff2, 0x0802100a, 0x92aa3938, 0xd971afa8, + 0x07c80ecf, 0x6419c87d, 0x39497270, 0x43d9869a, + 0xeff2c31d, 0xabe34b48, 0x715be22a, 0x1a883492, + 0x529aa4c8, 0x98262dbe, 0xc8328dfa, 0xfab0e94a, + 0x83e91b6a, 0x3c0f7833, 0x73d5e6a6, 0x3a8074ba, + 0xc2be997c, 0x13cd26de, 0xd034bde4, 0x3d487a75, + 0xdbffab24, 0xf57af78f, 0x7a90f4ea, 0x615fc23e, + 0x80201da0, 0xbd6867d5, 0x681ad072, 0x82ae192c, + 0xeab4c95e, 0x4d549a19, 0x7693ece5, 0x88220daa, + 0x8d6407e9, 0xe3f1db12, 0xd173bfa2, 0x4812905a, + 0x1d403a5d, 0x20084028, 0x2bc356e8, 0x97ec337b, + 0x4bdb9690, 0xbea1611f, 0x0e8d1c83, 0xf43df5c9, + 0x6697ccf1, 0x00000000, 0x1bcf36d4, 0xac2b4587, + 0xc57697b3, 0x328264b0, 0x7fd6fea9, 0x6c1bd877, + 0xeeb5c15b, 0x86af1129, 0xb56a77df, 0x5d50ba0d, + 0x0945124c, 0xebf3cb18, 0xc0309df0, 0x9bef2b74, + 0xfc3fe5c3, 0x4955921c, 0xb2a27910, 0x8fea0365, + 0x89650fec, 0xd2bab968, 0xbc2f6593, 0x27c04ee7, + 0x5fdebe81, 0x701ce06c, 0xd3fdbb2e, 0x294d5264, + 0x7292e4e0, 0xc9758fbc, 0x1806301e, 0x128a2498, + 0xf2b2f940, 0xbfe66359, 0x380e7036, 0x7c1ff863, + 0x956237f7, 0x77d4eea3, 0x9aa82932, 0x6296c4f4, + 0xc3f99b3a, 0x33c566f6, 0x942535b1, 0x7959f220, + 0x2a8454ae, 0xd572b7a7, 0xe439d5dd, 0x2d4c5a61, + 0x655eca3b, 0xfd78e785, 0xe038ddd8, 0x0a8c1486, + 0x63d1c6b2, 0xaea5410b, 0xafe2434d, 0x99612ff8, + 0xf6b3f145, 0x842115a5, 0x4a9c94d6, 0x781ef066, + 0x11432252, 0x3bc776fc, 0xd7fcb32b, 0x10042014, + 0x5951b208, 0x5e99bcc7, 0xa96d4fc4, 0x340d6839, + 0xcffa8335, 0x5bdfb684, 0xe57ed79b, 0x90243db4, + 0xec3bc5d7, 0x96ab313d, 0x1fce3ed1, 0x44118855, + 0x068f0c89, 0x254e4a6b, 0xe6b7d151, 0x8beb0b60, + 0xf03cfdcc, 0x3e817cbf, 0x6a94d4fe, 0xfbf7eb0c, + 0xdeb9a167, 0x4c13985f, 0xb02c7d9c, 0x6bd3d6b8, + 0xbbe76b5c, 0xa56e57cb, 0x37c46ef3, 0x0c03180f, + 0x45568a13, 0x0d441a49, 0xe17fdf9e, 0x9ea92137, + 0xa82a4d82, 0xd6bbb16d, 0x23c146e2, 0x5153a202, + 0x57dcae8b, 0x2c0b5827, 0x4e9d9cd3, 0xad6c47c1, + 0xc43195f5, 0xcd7487b9, 0xfff6e309, 0x05460a43, + 0x8aac0926, 0x1e893c97, 0x5014a044, 0xa3e15b42, + 0x5816b04e, 0xe83acdd2, 0xb9696fd0, 0x2409482d, + 0xdd70a7ad, 0xe2b6d954, 0x67d0ceb7, 0x93ed3b7e, + 0x17cc2edb, 0x15422a57, 0x5a98b4c2, 0xaaa4490e, + 0xa0285d88, 0x6d5cda31, 0xc7f8933f, 0x228644a4, + }, + { + 0x186018c0, 0x238c2305, 0xc63fc67e, 0xe887e813, + 0x8726874c, 0xb8dab8a9, 0x01040108, 0x4f214f42, + 0x36d836ad, 0xa6a2a659, 0xd26fd2de, 0xf5f3f5fb, + 0x79f979ef, 0x6fa16f5f, 0x917e91fc, 0x525552aa, + 0x609d6027, 0xbccabc89, 0x9b569bac, 0x8e028e04, + 0xa3b6a371, 0x0c300c60, 0x7bf17bff, 0x35d435b5, + 0x1d741de8, 0xe0a7e053, 0xd77bd7f6, 0xc22fc25e, + 0x2eb82e6d, 0x4b314b62, 0xfedffea3, 0x57415782, + 0x155415a8, 0x77c1779f, 0x37dc37a5, 0xe5b3e57b, + 0x9f469f8c, 0xf0e7f0d3, 0x4a354a6a, 0xda4fda9e, + 0x587d58fa, 0xc903c906, 0x29a42955, 0x0a280a50, + 0xb1feb1e1, 0xa0baa069, 0x6bb16b7f, 0x852e855c, + 0xbdcebd81, 0x5d695dd2, 0x10401080, 0xf4f7f4f3, + 0xcb0bcb16, 0x3ef83eed, 0x05140528, 0x6781671f, + 0xe4b7e473, 0x279c2725, 0x41194132, 0x8b168b2c, + 0xa7a6a751, 0x7de97dcf, 0x956e95dc, 0xd847d88e, + 0xfbcbfb8b, 0xee9fee23, 0x7ced7cc7, 0x66856617, + 0xdd53dda6, 0x175c17b8, 0x47014702, 0x9e429e84, + 0xca0fca1e, 0x2db42d75, 0xbfc6bf91, 0x071c0738, + 0xad8ead01, 0x5a755aea, 0x8336836c, 0x33cc3385, + 0x6391633f, 0x02080210, 0xaa92aa39, 0x71d971af, + 0xc807c80e, 0x196419c8, 0x49394972, 0xd943d986, + 0xf2eff2c3, 0xe3abe34b, 0x5b715be2, 0x881a8834, + 0x9a529aa4, 0x2698262d, 0x32c8328d, 0xb0fab0e9, + 0xe983e91b, 0x0f3c0f78, 0xd573d5e6, 0x803a8074, + 0xbec2be99, 0xcd13cd26, 0x34d034bd, 0x483d487a, + 0xffdbffab, 0x7af57af7, 0x907a90f4, 0x5f615fc2, + 0x2080201d, 0x68bd6867, 0x1a681ad0, 0xae82ae19, + 0xb4eab4c9, 0x544d549a, 0x937693ec, 0x2288220d, + 0x648d6407, 0xf1e3f1db, 0x73d173bf, 0x12481290, + 0x401d403a, 0x08200840, 0xc32bc356, 0xec97ec33, + 0xdb4bdb96, 0xa1bea161, 0x8d0e8d1c, 0x3df43df5, + 0x976697cc, 0x00000000, 0xcf1bcf36, 0x2bac2b45, + 0x76c57697, 0x82328264, 0xd67fd6fe, 0x1b6c1bd8, + 0xb5eeb5c1, 0xaf86af11, 0x6ab56a77, 0x505d50ba, + 0x45094512, 0xf3ebf3cb, 0x30c0309d, 0xef9bef2b, + 0x3ffc3fe5, 0x55495592, 0xa2b2a279, 0xea8fea03, + 0x6589650f, 0xbad2bab9, 0x2fbc2f65, 0xc027c04e, + 0xde5fdebe, 0x1c701ce0, 0xfdd3fdbb, 0x4d294d52, + 0x927292e4, 0x75c9758f, 0x06180630, 0x8a128a24, + 0xb2f2b2f9, 0xe6bfe663, 0x0e380e70, 0x1f7c1ff8, + 0x62956237, 0xd477d4ee, 0xa89aa829, 0x966296c4, + 0xf9c3f99b, 0xc533c566, 0x25942535, 0x597959f2, + 0x842a8454, 0x72d572b7, 0x39e439d5, 0x4c2d4c5a, + 0x5e655eca, 0x78fd78e7, 0x38e038dd, 0x8c0a8c14, + 0xd163d1c6, 0xa5aea541, 0xe2afe243, 0x6199612f, + 0xb3f6b3f1, 0x21842115, 0x9c4a9c94, 0x1e781ef0, + 0x43114322, 0xc73bc776, 0xfcd7fcb3, 0x04100420, + 0x515951b2, 0x995e99bc, 0x6da96d4f, 0x0d340d68, + 0xfacffa83, 0xdf5bdfb6, 0x7ee57ed7, 0x2490243d, + 0x3bec3bc5, 0xab96ab31, 0xce1fce3e, 0x11441188, + 0x8f068f0c, 0x4e254e4a, 0xb7e6b7d1, 0xeb8beb0b, + 0x3cf03cfd, 0x813e817c, 0x946a94d4, 0xf7fbf7eb, + 0xb9deb9a1, 0x134c1398, 0x2cb02c7d, 0xd36bd3d6, + 0xe7bbe76b, 0x6ea56e57, 0xc437c46e, 0x030c0318, + 0x5645568a, 0x440d441a, 0x7fe17fdf, 0xa99ea921, + 0x2aa82a4d, 0xbbd6bbb1, 0xc123c146, 0x535153a2, + 0xdc57dcae, 0x0b2c0b58, 0x9d4e9d9c, 0x6cad6c47, + 0x31c43195, 0x74cd7487, 0xf6fff6e3, 0x4605460a, + 0xac8aac09, 0x891e893c, 0x145014a0, 0xe1a3e15b, + 0x165816b0, 0x3ae83acd, 0x69b9696f, 0x09240948, + 0x70dd70a7, 0xb6e2b6d9, 0xd067d0ce, 0xed93ed3b, + 0xcc17cc2e, 0x4215422a, 0x985a98b4, 0xa4aaa449, + 0x28a0285d, 0x5c6d5cda, 0xf8c7f893, 0x86228644, + } +}; + +__device__ __constant__ u32 Cl[8][256] = +{ + { + 0xc07830d8, 0x05af4626, 0x7ef991b8, 0x136fcdfb, + 0x4ca113cb, 0xa9626d11, 0x08050209, 0x426e9e0d, + 0xadee6c9b, 0x590451ff, 0xdebdb90c, 0xfb06f70e, + 0xef80f296, 0x5fcede30, 0xfcef3f6d, 0xaa07a4f8, + 0x27fdc047, 0x89766535, 0xaccd2b37, 0x048c018a, + 0x71155bd2, 0x603c186c, 0xff8af684, 0xb5e16a80, + 0xe8693af5, 0x5347ddb3, 0xf6acb321, 0x5eed999c, + 0x6d965c43, 0x627a9629, 0xa321e15d, 0x8216aed5, + 0xa8412abd, 0x9fb6eee8, 0xa5eb6e92, 0x7b56d79e, + 0x8cd92313, 0xd317fd23, 0x6a7f9420, 0x9e95a944, + 0xfa25b0a2, 0x06ca8fcf, 0x558d527c, 0x5022145a, + 0xe14f7f50, 0x691a5dc9, 0x7fdad614, 0x5cab17d9, + 0x8173673c, 0xd234ba8f, 0x80502090, 0xf303f507, + 0x16c08bdd, 0xedc67cd3, 0x28110a2d, 0x1fe6ce78, + 0x7353d597, 0x25bb4e02, 0x32588273, 0x2c9d0ba7, + 0x510153f6, 0xcf94fab2, 0xdcfb3749, 0x8e9fad56, + 0x8b30eb70, 0x2371c1cd, 0xc791f8bb, 0x17e3cc71, + 0xa68ea77b, 0xb84b2eaf, 0x02468e45, 0x84dc211a, + 0x1ec589d4, 0x75995a58, 0x9179632e, 0x381b0e3f, + 0x012347ac, 0xea2fb4b0, 0x6cb51bef, 0x85ff66b6, + 0x3ff2c65c, 0x100a0412, 0x39384993, 0xafa8e2de, + 0x0ecf8dc6, 0xc87d32d1, 0x7270923b, 0x869aaf5f, + 0xc31df931, 0x4b48dba8, 0xe22ab6b9, 0x34920dbc, + 0xa4c8293e, 0x2dbe4c0b, 0x8dfa64bf, 0xe94a7d59, + 0x1b6acff2, 0x78331e77, 0xe6a6b733, 0x74ba1df4, + 0x997c6127, 0x26de87eb, 0xbde46889, 0x7a759032, + 0xab24e354, 0xf78ff48d, 0xf4ea3d64, 0xc23ebe9d, + 0x1da0403d, 0x67d5d00f, 0xd07234ca, 0x192c41b7, + 0xc95e757d, 0x9a19a8ce, 0xece53b7f, 0x0daa442f, + 0x07e9c863, 0xdb12ff2a, 0xbfa2e6cc, 0x905a2482, + 0x3a5d807a, 0x40281048, 0x56e89b95, 0x337bc5df, + 0x9690ab4d, 0x611f5fc0, 0x1c830791, 0xf5c97ac8, + 0xccf1335b, 0x00000000, 0x36d483f9, 0x4587566e, + 0x97b3ece1, 0x64b019e6, 0xfea9b128, 0xd87736c3, + 0xc15b7774, 0x112943be, 0x77dfd41d, 0xba0da0ea, + 0x124c8a57, 0xcb18fb38, 0x9df060ad, 0x2b74c3c4, + 0xe5c37eda, 0x921caac7, 0x791059db, 0x0365c9e9, + 0x0fecca6a, 0xb9686903, 0x65935e4a, 0x4ee79d8e, + 0xbe81a160, 0xe06c38fc, 0xbb2ee746, 0x52649a1f, + 0xe4e03976, 0x8fbceafa, 0x301e0c36, 0x249809ae, + 0xf940794b, 0x6359d185, 0x70361c7e, 0xf8633ee7, + 0x37f7c455, 0xeea3b53a, 0x29324d81, 0xc4f43152, + 0x9b3aef62, 0x66f697a3, 0x35b14a10, 0xf220b2ab, + 0x54ae15d0, 0xb7a7e4c5, 0xd5dd72ec, 0x5a619816, + 0xca3bbc94, 0xe785f09f, 0xddd870e5, 0x14860598, + 0xc6b2bf17, 0x410b57e4, 0x434dd9a1, 0x2ff8c24e, + 0xf1457b42, 0x15a54234, 0x94d62508, 0xf0663cee, + 0x22528661, 0x76fc93b1, 0xb32be54f, 0x20140824, + 0xb208a2e3, 0xbcc72f25, 0x4fc4da22, 0x68391a65, + 0x8335e979, 0xb684a369, 0xd79bfca9, 0x3db44819, + 0xc5d776fe, 0x313d4b9a, 0x3ed181f0, 0x88552299, + 0x0c890383, 0x4a6b9c04, 0xd1517366, 0x0b60cbe0, + 0xfdcc78c1, 0x7cbf1ffd, 0xd4fe3540, 0xeb0cf31c, + 0xa1676f18, 0x985f268b, 0x7d9c5851, 0xd6b8bb05, + 0x6b5cd38c, 0x57cbdc39, 0x6ef395aa, 0x180f061b, + 0x8a13acdc, 0x1a49885e, 0xdf9efea0, 0x21374f88, + 0x4d825467, 0xb16d6b0a, 0x46e29f87, 0xa202a6f1, + 0xae8ba572, 0x58271653, 0x9cd32701, 0x47c1d82b, + 0x95f562a4, 0x87b9e8f3, 0xe309f115, 0x0a438c4c, + 0x092645a5, 0x3c970fb5, 0xa04428b4, 0x5b42dfba, + 0xb04e2ca6, 0xcdd274f7, 0x6fd0d206, 0x482d1241, + 0xa7ade0d7, 0xd954716f, 0xceb7bd1e, 0x3b7ec7d6, + 0x2edb85e2, 0x2a578468, 0xb4c22d2c, 0x490e55ed, + 0x5d885075, 0xda31b886, 0x933fed6b, 0x44a411c2, + }, + { + 0x18c07830, 0x2305af46, 0xc67ef991, 0xe8136fcd, + 0x874ca113, 0xb8a9626d, 0x01080502, 0x4f426e9e, + 0x36adee6c, 0xa6590451, 0xd2debdb9, 0xf5fb06f7, + 0x79ef80f2, 0x6f5fcede, 0x91fcef3f, 0x52aa07a4, + 0x6027fdc0, 0xbc897665, 0x9baccd2b, 0x8e048c01, + 0xa371155b, 0x0c603c18, 0x7bff8af6, 0x35b5e16a, + 0x1de8693a, 0xe05347dd, 0xd7f6acb3, 0xc25eed99, + 0x2e6d965c, 0x4b627a96, 0xfea321e1, 0x578216ae, + 0x15a8412a, 0x779fb6ee, 0x37a5eb6e, 0xe57b56d7, + 0x9f8cd923, 0xf0d317fd, 0x4a6a7f94, 0xda9e95a9, + 0x58fa25b0, 0xc906ca8f, 0x29558d52, 0x0a502214, + 0xb1e14f7f, 0xa0691a5d, 0x6b7fdad6, 0x855cab17, + 0xbd817367, 0x5dd234ba, 0x10805020, 0xf4f303f5, + 0xcb16c08b, 0x3eedc67c, 0x0528110a, 0x671fe6ce, + 0xe47353d5, 0x2725bb4e, 0x41325882, 0x8b2c9d0b, + 0xa7510153, 0x7dcf94fa, 0x95dcfb37, 0xd88e9fad, + 0xfb8b30eb, 0xee2371c1, 0x7cc791f8, 0x6617e3cc, + 0xdda68ea7, 0x17b84b2e, 0x4702468e, 0x9e84dc21, + 0xca1ec589, 0x2d75995a, 0xbf917963, 0x07381b0e, + 0xad012347, 0x5aea2fb4, 0x836cb51b, 0x3385ff66, + 0x633ff2c6, 0x02100a04, 0xaa393849, 0x71afa8e2, + 0xc80ecf8d, 0x19c87d32, 0x49727092, 0xd9869aaf, + 0xf2c31df9, 0xe34b48db, 0x5be22ab6, 0x8834920d, + 0x9aa4c829, 0x262dbe4c, 0x328dfa64, 0xb0e94a7d, + 0xe91b6acf, 0x0f78331e, 0xd5e6a6b7, 0x8074ba1d, + 0xbe997c61, 0xcd26de87, 0x34bde468, 0x487a7590, + 0xffab24e3, 0x7af78ff4, 0x90f4ea3d, 0x5fc23ebe, + 0x201da040, 0x6867d5d0, 0x1ad07234, 0xae192c41, + 0xb4c95e75, 0x549a19a8, 0x93ece53b, 0x220daa44, + 0x6407e9c8, 0xf1db12ff, 0x73bfa2e6, 0x12905a24, + 0x403a5d80, 0x08402810, 0xc356e89b, 0xec337bc5, + 0xdb9690ab, 0xa1611f5f, 0x8d1c8307, 0x3df5c97a, + 0x97ccf133, 0x00000000, 0xcf36d483, 0x2b458756, + 0x7697b3ec, 0x8264b019, 0xd6fea9b1, 0x1bd87736, + 0xb5c15b77, 0xaf112943, 0x6a77dfd4, 0x50ba0da0, + 0x45124c8a, 0xf3cb18fb, 0x309df060, 0xef2b74c3, + 0x3fe5c37e, 0x55921caa, 0xa2791059, 0xea0365c9, + 0x650fecca, 0xbab96869, 0x2f65935e, 0xc04ee79d, + 0xdebe81a1, 0x1ce06c38, 0xfdbb2ee7, 0x4d52649a, + 0x92e4e039, 0x758fbcea, 0x06301e0c, 0x8a249809, + 0xb2f94079, 0xe66359d1, 0x0e70361c, 0x1ff8633e, + 0x6237f7c4, 0xd4eea3b5, 0xa829324d, 0x96c4f431, + 0xf99b3aef, 0xc566f697, 0x2535b14a, 0x59f220b2, + 0x8454ae15, 0x72b7a7e4, 0x39d5dd72, 0x4c5a6198, + 0x5eca3bbc, 0x78e785f0, 0x38ddd870, 0x8c148605, + 0xd1c6b2bf, 0xa5410b57, 0xe2434dd9, 0x612ff8c2, + 0xb3f1457b, 0x2115a542, 0x9c94d625, 0x1ef0663c, + 0x43225286, 0xc776fc93, 0xfcb32be5, 0x04201408, + 0x51b208a2, 0x99bcc72f, 0x6d4fc4da, 0x0d68391a, + 0xfa8335e9, 0xdfb684a3, 0x7ed79bfc, 0x243db448, + 0x3bc5d776, 0xab313d4b, 0xce3ed181, 0x11885522, + 0x8f0c8903, 0x4e4a6b9c, 0xb7d15173, 0xeb0b60cb, + 0x3cfdcc78, 0x817cbf1f, 0x94d4fe35, 0xf7eb0cf3, + 0xb9a1676f, 0x13985f26, 0x2c7d9c58, 0xd3d6b8bb, + 0xe76b5cd3, 0x6e57cbdc, 0xc46ef395, 0x03180f06, + 0x568a13ac, 0x441a4988, 0x7fdf9efe, 0xa921374f, + 0x2a4d8254, 0xbbb16d6b, 0xc146e29f, 0x53a202a6, + 0xdcae8ba5, 0x0b582716, 0x9d9cd327, 0x6c47c1d8, + 0x3195f562, 0x7487b9e8, 0xf6e309f1, 0x460a438c, + 0xac092645, 0x893c970f, 0x14a04428, 0xe15b42df, + 0x16b04e2c, 0x3acdd274, 0x696fd0d2, 0x09482d12, + 0x70a7ade0, 0xb6d95471, 0xd0ceb7bd, 0xed3b7ec7, + 0xcc2edb85, 0x422a5784, 0x98b4c22d, 0xa4490e55, + 0x285d8850, 0x5cda31b8, 0xf8933fed, 0x8644a411, + }, + { + 0x6018c078, 0x8c2305af, 0x3fc67ef9, 0x87e8136f, + 0x26874ca1, 0xdab8a962, 0x04010805, 0x214f426e, + 0xd836adee, 0xa2a65904, 0x6fd2debd, 0xf3f5fb06, + 0xf979ef80, 0xa16f5fce, 0x7e91fcef, 0x5552aa07, + 0x9d6027fd, 0xcabc8976, 0x569baccd, 0x028e048c, + 0xb6a37115, 0x300c603c, 0xf17bff8a, 0xd435b5e1, + 0x741de869, 0xa7e05347, 0x7bd7f6ac, 0x2fc25eed, + 0xb82e6d96, 0x314b627a, 0xdffea321, 0x41578216, + 0x5415a841, 0xc1779fb6, 0xdc37a5eb, 0xb3e57b56, + 0x469f8cd9, 0xe7f0d317, 0x354a6a7f, 0x4fda9e95, + 0x7d58fa25, 0x03c906ca, 0xa429558d, 0x280a5022, + 0xfeb1e14f, 0xbaa0691a, 0xb16b7fda, 0x2e855cab, + 0xcebd8173, 0x695dd234, 0x40108050, 0xf7f4f303, + 0x0bcb16c0, 0xf83eedc6, 0x14052811, 0x81671fe6, + 0xb7e47353, 0x9c2725bb, 0x19413258, 0x168b2c9d, + 0xa6a75101, 0xe97dcf94, 0x6e95dcfb, 0x47d88e9f, + 0xcbfb8b30, 0x9fee2371, 0xed7cc791, 0x856617e3, + 0x53dda68e, 0x5c17b84b, 0x01470246, 0x429e84dc, + 0x0fca1ec5, 0xb42d7599, 0xc6bf9179, 0x1c07381b, + 0x8ead0123, 0x755aea2f, 0x36836cb5, 0xcc3385ff, + 0x91633ff2, 0x0802100a, 0x92aa3938, 0xd971afa8, + 0x07c80ecf, 0x6419c87d, 0x39497270, 0x43d9869a, + 0xeff2c31d, 0xabe34b48, 0x715be22a, 0x1a883492, + 0x529aa4c8, 0x98262dbe, 0xc8328dfa, 0xfab0e94a, + 0x83e91b6a, 0x3c0f7833, 0x73d5e6a6, 0x3a8074ba, + 0xc2be997c, 0x13cd26de, 0xd034bde4, 0x3d487a75, + 0xdbffab24, 0xf57af78f, 0x7a90f4ea, 0x615fc23e, + 0x80201da0, 0xbd6867d5, 0x681ad072, 0x82ae192c, + 0xeab4c95e, 0x4d549a19, 0x7693ece5, 0x88220daa, + 0x8d6407e9, 0xe3f1db12, 0xd173bfa2, 0x4812905a, + 0x1d403a5d, 0x20084028, 0x2bc356e8, 0x97ec337b, + 0x4bdb9690, 0xbea1611f, 0x0e8d1c83, 0xf43df5c9, + 0x6697ccf1, 0x00000000, 0x1bcf36d4, 0xac2b4587, + 0xc57697b3, 0x328264b0, 0x7fd6fea9, 0x6c1bd877, + 0xeeb5c15b, 0x86af1129, 0xb56a77df, 0x5d50ba0d, + 0x0945124c, 0xebf3cb18, 0xc0309df0, 0x9bef2b74, + 0xfc3fe5c3, 0x4955921c, 0xb2a27910, 0x8fea0365, + 0x89650fec, 0xd2bab968, 0xbc2f6593, 0x27c04ee7, + 0x5fdebe81, 0x701ce06c, 0xd3fdbb2e, 0x294d5264, + 0x7292e4e0, 0xc9758fbc, 0x1806301e, 0x128a2498, + 0xf2b2f940, 0xbfe66359, 0x380e7036, 0x7c1ff863, + 0x956237f7, 0x77d4eea3, 0x9aa82932, 0x6296c4f4, + 0xc3f99b3a, 0x33c566f6, 0x942535b1, 0x7959f220, + 0x2a8454ae, 0xd572b7a7, 0xe439d5dd, 0x2d4c5a61, + 0x655eca3b, 0xfd78e785, 0xe038ddd8, 0x0a8c1486, + 0x63d1c6b2, 0xaea5410b, 0xafe2434d, 0x99612ff8, + 0xf6b3f145, 0x842115a5, 0x4a9c94d6, 0x781ef066, + 0x11432252, 0x3bc776fc, 0xd7fcb32b, 0x10042014, + 0x5951b208, 0x5e99bcc7, 0xa96d4fc4, 0x340d6839, + 0xcffa8335, 0x5bdfb684, 0xe57ed79b, 0x90243db4, + 0xec3bc5d7, 0x96ab313d, 0x1fce3ed1, 0x44118855, + 0x068f0c89, 0x254e4a6b, 0xe6b7d151, 0x8beb0b60, + 0xf03cfdcc, 0x3e817cbf, 0x6a94d4fe, 0xfbf7eb0c, + 0xdeb9a167, 0x4c13985f, 0xb02c7d9c, 0x6bd3d6b8, + 0xbbe76b5c, 0xa56e57cb, 0x37c46ef3, 0x0c03180f, + 0x45568a13, 0x0d441a49, 0xe17fdf9e, 0x9ea92137, + 0xa82a4d82, 0xd6bbb16d, 0x23c146e2, 0x5153a202, + 0x57dcae8b, 0x2c0b5827, 0x4e9d9cd3, 0xad6c47c1, + 0xc43195f5, 0xcd7487b9, 0xfff6e309, 0x05460a43, + 0x8aac0926, 0x1e893c97, 0x5014a044, 0xa3e15b42, + 0x5816b04e, 0xe83acdd2, 0xb9696fd0, 0x2409482d, + 0xdd70a7ad, 0xe2b6d954, 0x67d0ceb7, 0x93ed3b7e, + 0x17cc2edb, 0x15422a57, 0x5a98b4c2, 0xaaa4490e, + 0xa0285d88, 0x6d5cda31, 0xc7f8933f, 0x228644a4, + }, + { + 0x186018c0, 0x238c2305, 0xc63fc67e, 0xe887e813, + 0x8726874c, 0xb8dab8a9, 0x01040108, 0x4f214f42, + 0x36d836ad, 0xa6a2a659, 0xd26fd2de, 0xf5f3f5fb, + 0x79f979ef, 0x6fa16f5f, 0x917e91fc, 0x525552aa, + 0x609d6027, 0xbccabc89, 0x9b569bac, 0x8e028e04, + 0xa3b6a371, 0x0c300c60, 0x7bf17bff, 0x35d435b5, + 0x1d741de8, 0xe0a7e053, 0xd77bd7f6, 0xc22fc25e, + 0x2eb82e6d, 0x4b314b62, 0xfedffea3, 0x57415782, + 0x155415a8, 0x77c1779f, 0x37dc37a5, 0xe5b3e57b, + 0x9f469f8c, 0xf0e7f0d3, 0x4a354a6a, 0xda4fda9e, + 0x587d58fa, 0xc903c906, 0x29a42955, 0x0a280a50, + 0xb1feb1e1, 0xa0baa069, 0x6bb16b7f, 0x852e855c, + 0xbdcebd81, 0x5d695dd2, 0x10401080, 0xf4f7f4f3, + 0xcb0bcb16, 0x3ef83eed, 0x05140528, 0x6781671f, + 0xe4b7e473, 0x279c2725, 0x41194132, 0x8b168b2c, + 0xa7a6a751, 0x7de97dcf, 0x956e95dc, 0xd847d88e, + 0xfbcbfb8b, 0xee9fee23, 0x7ced7cc7, 0x66856617, + 0xdd53dda6, 0x175c17b8, 0x47014702, 0x9e429e84, + 0xca0fca1e, 0x2db42d75, 0xbfc6bf91, 0x071c0738, + 0xad8ead01, 0x5a755aea, 0x8336836c, 0x33cc3385, + 0x6391633f, 0x02080210, 0xaa92aa39, 0x71d971af, + 0xc807c80e, 0x196419c8, 0x49394972, 0xd943d986, + 0xf2eff2c3, 0xe3abe34b, 0x5b715be2, 0x881a8834, + 0x9a529aa4, 0x2698262d, 0x32c8328d, 0xb0fab0e9, + 0xe983e91b, 0x0f3c0f78, 0xd573d5e6, 0x803a8074, + 0xbec2be99, 0xcd13cd26, 0x34d034bd, 0x483d487a, + 0xffdbffab, 0x7af57af7, 0x907a90f4, 0x5f615fc2, + 0x2080201d, 0x68bd6867, 0x1a681ad0, 0xae82ae19, + 0xb4eab4c9, 0x544d549a, 0x937693ec, 0x2288220d, + 0x648d6407, 0xf1e3f1db, 0x73d173bf, 0x12481290, + 0x401d403a, 0x08200840, 0xc32bc356, 0xec97ec33, + 0xdb4bdb96, 0xa1bea161, 0x8d0e8d1c, 0x3df43df5, + 0x976697cc, 0x00000000, 0xcf1bcf36, 0x2bac2b45, + 0x76c57697, 0x82328264, 0xd67fd6fe, 0x1b6c1bd8, + 0xb5eeb5c1, 0xaf86af11, 0x6ab56a77, 0x505d50ba, + 0x45094512, 0xf3ebf3cb, 0x30c0309d, 0xef9bef2b, + 0x3ffc3fe5, 0x55495592, 0xa2b2a279, 0xea8fea03, + 0x6589650f, 0xbad2bab9, 0x2fbc2f65, 0xc027c04e, + 0xde5fdebe, 0x1c701ce0, 0xfdd3fdbb, 0x4d294d52, + 0x927292e4, 0x75c9758f, 0x06180630, 0x8a128a24, + 0xb2f2b2f9, 0xe6bfe663, 0x0e380e70, 0x1f7c1ff8, + 0x62956237, 0xd477d4ee, 0xa89aa829, 0x966296c4, + 0xf9c3f99b, 0xc533c566, 0x25942535, 0x597959f2, + 0x842a8454, 0x72d572b7, 0x39e439d5, 0x4c2d4c5a, + 0x5e655eca, 0x78fd78e7, 0x38e038dd, 0x8c0a8c14, + 0xd163d1c6, 0xa5aea541, 0xe2afe243, 0x6199612f, + 0xb3f6b3f1, 0x21842115, 0x9c4a9c94, 0x1e781ef0, + 0x43114322, 0xc73bc776, 0xfcd7fcb3, 0x04100420, + 0x515951b2, 0x995e99bc, 0x6da96d4f, 0x0d340d68, + 0xfacffa83, 0xdf5bdfb6, 0x7ee57ed7, 0x2490243d, + 0x3bec3bc5, 0xab96ab31, 0xce1fce3e, 0x11441188, + 0x8f068f0c, 0x4e254e4a, 0xb7e6b7d1, 0xeb8beb0b, + 0x3cf03cfd, 0x813e817c, 0x946a94d4, 0xf7fbf7eb, + 0xb9deb9a1, 0x134c1398, 0x2cb02c7d, 0xd36bd3d6, + 0xe7bbe76b, 0x6ea56e57, 0xc437c46e, 0x030c0318, + 0x5645568a, 0x440d441a, 0x7fe17fdf, 0xa99ea921, + 0x2aa82a4d, 0xbbd6bbb1, 0xc123c146, 0x535153a2, + 0xdc57dcae, 0x0b2c0b58, 0x9d4e9d9c, 0x6cad6c47, + 0x31c43195, 0x74cd7487, 0xf6fff6e3, 0x4605460a, + 0xac8aac09, 0x891e893c, 0x145014a0, 0xe1a3e15b, + 0x165816b0, 0x3ae83acd, 0x69b9696f, 0x09240948, + 0x70dd70a7, 0xb6e2b6d9, 0xd067d0ce, 0xed93ed3b, + 0xcc17cc2e, 0x4215422a, 0x985a98b4, 0xa4aaa449, + 0x28a0285d, 0x5c6d5cda, 0xf8c7f893, 0x86228644, + }, + { + 0x18186018, 0x23238c23, 0xc6c63fc6, 0xe8e887e8, + 0x87872687, 0xb8b8dab8, 0x01010401, 0x4f4f214f, + 0x3636d836, 0xa6a6a2a6, 0xd2d26fd2, 0xf5f5f3f5, + 0x7979f979, 0x6f6fa16f, 0x91917e91, 0x52525552, + 0x60609d60, 0xbcbccabc, 0x9b9b569b, 0x8e8e028e, + 0xa3a3b6a3, 0x0c0c300c, 0x7b7bf17b, 0x3535d435, + 0x1d1d741d, 0xe0e0a7e0, 0xd7d77bd7, 0xc2c22fc2, + 0x2e2eb82e, 0x4b4b314b, 0xfefedffe, 0x57574157, + 0x15155415, 0x7777c177, 0x3737dc37, 0xe5e5b3e5, + 0x9f9f469f, 0xf0f0e7f0, 0x4a4a354a, 0xdada4fda, + 0x58587d58, 0xc9c903c9, 0x2929a429, 0x0a0a280a, + 0xb1b1feb1, 0xa0a0baa0, 0x6b6bb16b, 0x85852e85, + 0xbdbdcebd, 0x5d5d695d, 0x10104010, 0xf4f4f7f4, + 0xcbcb0bcb, 0x3e3ef83e, 0x05051405, 0x67678167, + 0xe4e4b7e4, 0x27279c27, 0x41411941, 0x8b8b168b, + 0xa7a7a6a7, 0x7d7de97d, 0x95956e95, 0xd8d847d8, + 0xfbfbcbfb, 0xeeee9fee, 0x7c7ced7c, 0x66668566, + 0xdddd53dd, 0x17175c17, 0x47470147, 0x9e9e429e, + 0xcaca0fca, 0x2d2db42d, 0xbfbfc6bf, 0x07071c07, + 0xadad8ead, 0x5a5a755a, 0x83833683, 0x3333cc33, + 0x63639163, 0x02020802, 0xaaaa92aa, 0x7171d971, + 0xc8c807c8, 0x19196419, 0x49493949, 0xd9d943d9, + 0xf2f2eff2, 0xe3e3abe3, 0x5b5b715b, 0x88881a88, + 0x9a9a529a, 0x26269826, 0x3232c832, 0xb0b0fab0, + 0xe9e983e9, 0x0f0f3c0f, 0xd5d573d5, 0x80803a80, + 0xbebec2be, 0xcdcd13cd, 0x3434d034, 0x48483d48, + 0xffffdbff, 0x7a7af57a, 0x90907a90, 0x5f5f615f, + 0x20208020, 0x6868bd68, 0x1a1a681a, 0xaeae82ae, + 0xb4b4eab4, 0x54544d54, 0x93937693, 0x22228822, + 0x64648d64, 0xf1f1e3f1, 0x7373d173, 0x12124812, + 0x40401d40, 0x08082008, 0xc3c32bc3, 0xecec97ec, + 0xdbdb4bdb, 0xa1a1bea1, 0x8d8d0e8d, 0x3d3df43d, + 0x97976697, 0x00000000, 0xcfcf1bcf, 0x2b2bac2b, + 0x7676c576, 0x82823282, 0xd6d67fd6, 0x1b1b6c1b, + 0xb5b5eeb5, 0xafaf86af, 0x6a6ab56a, 0x50505d50, + 0x45450945, 0xf3f3ebf3, 0x3030c030, 0xefef9bef, + 0x3f3ffc3f, 0x55554955, 0xa2a2b2a2, 0xeaea8fea, + 0x65658965, 0xbabad2ba, 0x2f2fbc2f, 0xc0c027c0, + 0xdede5fde, 0x1c1c701c, 0xfdfdd3fd, 0x4d4d294d, + 0x92927292, 0x7575c975, 0x06061806, 0x8a8a128a, + 0xb2b2f2b2, 0xe6e6bfe6, 0x0e0e380e, 0x1f1f7c1f, + 0x62629562, 0xd4d477d4, 0xa8a89aa8, 0x96966296, + 0xf9f9c3f9, 0xc5c533c5, 0x25259425, 0x59597959, + 0x84842a84, 0x7272d572, 0x3939e439, 0x4c4c2d4c, + 0x5e5e655e, 0x7878fd78, 0x3838e038, 0x8c8c0a8c, + 0xd1d163d1, 0xa5a5aea5, 0xe2e2afe2, 0x61619961, + 0xb3b3f6b3, 0x21218421, 0x9c9c4a9c, 0x1e1e781e, + 0x43431143, 0xc7c73bc7, 0xfcfcd7fc, 0x04041004, + 0x51515951, 0x99995e99, 0x6d6da96d, 0x0d0d340d, + 0xfafacffa, 0xdfdf5bdf, 0x7e7ee57e, 0x24249024, + 0x3b3bec3b, 0xabab96ab, 0xcece1fce, 0x11114411, + 0x8f8f068f, 0x4e4e254e, 0xb7b7e6b7, 0xebeb8beb, + 0x3c3cf03c, 0x81813e81, 0x94946a94, 0xf7f7fbf7, + 0xb9b9deb9, 0x13134c13, 0x2c2cb02c, 0xd3d36bd3, + 0xe7e7bbe7, 0x6e6ea56e, 0xc4c437c4, 0x03030c03, + 0x56564556, 0x44440d44, 0x7f7fe17f, 0xa9a99ea9, + 0x2a2aa82a, 0xbbbbd6bb, 0xc1c123c1, 0x53535153, + 0xdcdc57dc, 0x0b0b2c0b, 0x9d9d4e9d, 0x6c6cad6c, + 0x3131c431, 0x7474cd74, 0xf6f6fff6, 0x46460546, + 0xacac8aac, 0x89891e89, 0x14145014, 0xe1e1a3e1, + 0x16165816, 0x3a3ae83a, 0x6969b969, 0x09092409, + 0x7070dd70, 0xb6b6e2b6, 0xd0d067d0, 0xeded93ed, + 0xcccc17cc, 0x42421542, 0x98985a98, 0xa4a4aaa4, + 0x2828a028, 0x5c5c6d5c, 0xf8f8c7f8, 0x86862286, + }, + { + 0xd8181860, 0x2623238c, 0xb8c6c63f, 0xfbe8e887, + 0xcb878726, 0x11b8b8da, 0x09010104, 0x0d4f4f21, + 0x9b3636d8, 0xffa6a6a2, 0x0cd2d26f, 0x0ef5f5f3, + 0x967979f9, 0x306f6fa1, 0x6d91917e, 0xf8525255, + 0x4760609d, 0x35bcbcca, 0x379b9b56, 0x8a8e8e02, + 0xd2a3a3b6, 0x6c0c0c30, 0x847b7bf1, 0x803535d4, + 0xf51d1d74, 0xb3e0e0a7, 0x21d7d77b, 0x9cc2c22f, + 0x432e2eb8, 0x294b4b31, 0x5dfefedf, 0xd5575741, + 0xbd151554, 0xe87777c1, 0x923737dc, 0x9ee5e5b3, + 0x139f9f46, 0x23f0f0e7, 0x204a4a35, 0x44dada4f, + 0xa258587d, 0xcfc9c903, 0x7c2929a4, 0x5a0a0a28, + 0x50b1b1fe, 0xc9a0a0ba, 0x146b6bb1, 0xd985852e, + 0x3cbdbdce, 0x8f5d5d69, 0x90101040, 0x07f4f4f7, + 0xddcbcb0b, 0xd33e3ef8, 0x2d050514, 0x78676781, + 0x97e4e4b7, 0x0227279c, 0x73414119, 0xa78b8b16, + 0xf6a7a7a6, 0xb27d7de9, 0x4995956e, 0x56d8d847, + 0x70fbfbcb, 0xcdeeee9f, 0xbb7c7ced, 0x71666685, + 0x7bdddd53, 0xaf17175c, 0x45474701, 0x1a9e9e42, + 0xd4caca0f, 0x582d2db4, 0x2ebfbfc6, 0x3f07071c, + 0xacadad8e, 0xb05a5a75, 0xef838336, 0xb63333cc, + 0x5c636391, 0x12020208, 0x93aaaa92, 0xde7171d9, + 0xc6c8c807, 0xd1191964, 0x3b494939, 0x5fd9d943, + 0x31f2f2ef, 0xa8e3e3ab, 0xb95b5b71, 0xbc88881a, + 0x3e9a9a52, 0x0b262698, 0xbf3232c8, 0x59b0b0fa, + 0xf2e9e983, 0x770f0f3c, 0x33d5d573, 0xf480803a, + 0x27bebec2, 0xebcdcd13, 0x893434d0, 0x3248483d, + 0x54ffffdb, 0x8d7a7af5, 0x6490907a, 0x9d5f5f61, + 0x3d202080, 0x0f6868bd, 0xca1a1a68, 0xb7aeae82, + 0x7db4b4ea, 0xce54544d, 0x7f939376, 0x2f222288, + 0x6364648d, 0x2af1f1e3, 0xcc7373d1, 0x82121248, + 0x7a40401d, 0x48080820, 0x95c3c32b, 0xdfecec97, + 0x4ddbdb4b, 0xc0a1a1be, 0x918d8d0e, 0xc83d3df4, + 0x5b979766, 0x00000000, 0xf9cfcf1b, 0x6e2b2bac, + 0xe17676c5, 0xe6828232, 0x28d6d67f, 0xc31b1b6c, + 0x74b5b5ee, 0xbeafaf86, 0x1d6a6ab5, 0xea50505d, + 0x57454509, 0x38f3f3eb, 0xad3030c0, 0xc4efef9b, + 0xda3f3ffc, 0xc7555549, 0xdba2a2b2, 0xe9eaea8f, + 0x6a656589, 0x03babad2, 0x4a2f2fbc, 0x8ec0c027, + 0x60dede5f, 0xfc1c1c70, 0x46fdfdd3, 0x1f4d4d29, + 0x76929272, 0xfa7575c9, 0x36060618, 0xae8a8a12, + 0x4bb2b2f2, 0x85e6e6bf, 0x7e0e0e38, 0xe71f1f7c, + 0x55626295, 0x3ad4d477, 0x81a8a89a, 0x52969662, + 0x62f9f9c3, 0xa3c5c533, 0x10252594, 0xab595979, + 0xd084842a, 0xc57272d5, 0xec3939e4, 0x164c4c2d, + 0x945e5e65, 0x9f7878fd, 0xe53838e0, 0x988c8c0a, + 0x17d1d163, 0xe4a5a5ae, 0xa1e2e2af, 0x4e616199, + 0x42b3b3f6, 0x34212184, 0x089c9c4a, 0xee1e1e78, + 0x61434311, 0xb1c7c73b, 0x4ffcfcd7, 0x24040410, + 0xe3515159, 0x2599995e, 0x226d6da9, 0x650d0d34, + 0x79fafacf, 0x69dfdf5b, 0xa97e7ee5, 0x19242490, + 0xfe3b3bec, 0x9aabab96, 0xf0cece1f, 0x99111144, + 0x838f8f06, 0x044e4e25, 0x66b7b7e6, 0xe0ebeb8b, + 0xc13c3cf0, 0xfd81813e, 0x4094946a, 0x1cf7f7fb, + 0x18b9b9de, 0x8b13134c, 0x512c2cb0, 0x05d3d36b, + 0x8ce7e7bb, 0x396e6ea5, 0xaac4c437, 0x1b03030c, + 0xdc565645, 0x5e44440d, 0xa07f7fe1, 0x88a9a99e, + 0x672a2aa8, 0x0abbbbd6, 0x87c1c123, 0xf1535351, + 0x72dcdc57, 0x530b0b2c, 0x019d9d4e, 0x2b6c6cad, + 0xa43131c4, 0xf37474cd, 0x15f6f6ff, 0x4c464605, + 0xa5acac8a, 0xb589891e, 0xb4141450, 0xbae1e1a3, + 0xa6161658, 0xf73a3ae8, 0x066969b9, 0x41090924, + 0xd77070dd, 0x6fb6b6e2, 0x1ed0d067, 0xd6eded93, + 0xe2cccc17, 0x68424215, 0x2c98985a, 0xeda4a4aa, + 0x752828a0, 0x865c5c6d, 0x6bf8f8c7, 0xc2868622, + }, + { + 0x30d81818, 0x46262323, 0x91b8c6c6, 0xcdfbe8e8, + 0x13cb8787, 0x6d11b8b8, 0x02090101, 0x9e0d4f4f, + 0x6c9b3636, 0x51ffa6a6, 0xb90cd2d2, 0xf70ef5f5, + 0xf2967979, 0xde306f6f, 0x3f6d9191, 0xa4f85252, + 0xc0476060, 0x6535bcbc, 0x2b379b9b, 0x018a8e8e, + 0x5bd2a3a3, 0x186c0c0c, 0xf6847b7b, 0x6a803535, + 0x3af51d1d, 0xddb3e0e0, 0xb321d7d7, 0x999cc2c2, + 0x5c432e2e, 0x96294b4b, 0xe15dfefe, 0xaed55757, + 0x2abd1515, 0xeee87777, 0x6e923737, 0xd79ee5e5, + 0x23139f9f, 0xfd23f0f0, 0x94204a4a, 0xa944dada, + 0xb0a25858, 0x8fcfc9c9, 0x527c2929, 0x145a0a0a, + 0x7f50b1b1, 0x5dc9a0a0, 0xd6146b6b, 0x17d98585, + 0x673cbdbd, 0xba8f5d5d, 0x20901010, 0xf507f4f4, + 0x8bddcbcb, 0x7cd33e3e, 0x0a2d0505, 0xce786767, + 0xd597e4e4, 0x4e022727, 0x82734141, 0x0ba78b8b, + 0x53f6a7a7, 0xfab27d7d, 0x37499595, 0xad56d8d8, + 0xeb70fbfb, 0xc1cdeeee, 0xf8bb7c7c, 0xcc716666, + 0xa77bdddd, 0x2eaf1717, 0x8e454747, 0x211a9e9e, + 0x89d4caca, 0x5a582d2d, 0x632ebfbf, 0x0e3f0707, + 0x47acadad, 0xb4b05a5a, 0x1bef8383, 0x66b63333, + 0xc65c6363, 0x04120202, 0x4993aaaa, 0xe2de7171, + 0x8dc6c8c8, 0x32d11919, 0x923b4949, 0xaf5fd9d9, + 0xf931f2f2, 0xdba8e3e3, 0xb6b95b5b, 0x0dbc8888, + 0x293e9a9a, 0x4c0b2626, 0x64bf3232, 0x7d59b0b0, + 0xcff2e9e9, 0x1e770f0f, 0xb733d5d5, 0x1df48080, + 0x6127bebe, 0x87ebcdcd, 0x68893434, 0x90324848, + 0xe354ffff, 0xf48d7a7a, 0x3d649090, 0xbe9d5f5f, + 0x403d2020, 0xd00f6868, 0x34ca1a1a, 0x41b7aeae, + 0x757db4b4, 0xa8ce5454, 0x3b7f9393, 0x442f2222, + 0xc8636464, 0xff2af1f1, 0xe6cc7373, 0x24821212, + 0x807a4040, 0x10480808, 0x9b95c3c3, 0xc5dfecec, + 0xab4ddbdb, 0x5fc0a1a1, 0x07918d8d, 0x7ac83d3d, + 0x335b9797, 0x00000000, 0x83f9cfcf, 0x566e2b2b, + 0xece17676, 0x19e68282, 0xb128d6d6, 0x36c31b1b, + 0x7774b5b5, 0x43beafaf, 0xd41d6a6a, 0xa0ea5050, + 0x8a574545, 0xfb38f3f3, 0x60ad3030, 0xc3c4efef, + 0x7eda3f3f, 0xaac75555, 0x59dba2a2, 0xc9e9eaea, + 0xca6a6565, 0x6903baba, 0x5e4a2f2f, 0x9d8ec0c0, + 0xa160dede, 0x38fc1c1c, 0xe746fdfd, 0x9a1f4d4d, + 0x39769292, 0xeafa7575, 0x0c360606, 0x09ae8a8a, + 0x794bb2b2, 0xd185e6e6, 0x1c7e0e0e, 0x3ee71f1f, + 0xc4556262, 0xb53ad4d4, 0x4d81a8a8, 0x31529696, + 0xef62f9f9, 0x97a3c5c5, 0x4a102525, 0xb2ab5959, + 0x15d08484, 0xe4c57272, 0x72ec3939, 0x98164c4c, + 0xbc945e5e, 0xf09f7878, 0x70e53838, 0x05988c8c, + 0xbf17d1d1, 0x57e4a5a5, 0xd9a1e2e2, 0xc24e6161, + 0x7b42b3b3, 0x42342121, 0x25089c9c, 0x3cee1e1e, + 0x86614343, 0x93b1c7c7, 0xe54ffcfc, 0x08240404, + 0xa2e35151, 0x2f259999, 0xda226d6d, 0x1a650d0d, + 0xe979fafa, 0xa369dfdf, 0xfca97e7e, 0x48192424, + 0x76fe3b3b, 0x4b9aabab, 0x81f0cece, 0x22991111, + 0x03838f8f, 0x9c044e4e, 0x7366b7b7, 0xcbe0ebeb, + 0x78c13c3c, 0x1ffd8181, 0x35409494, 0xf31cf7f7, + 0x6f18b9b9, 0x268b1313, 0x58512c2c, 0xbb05d3d3, + 0xd38ce7e7, 0xdc396e6e, 0x95aac4c4, 0x061b0303, + 0xacdc5656, 0x885e4444, 0xfea07f7f, 0x4f88a9a9, + 0x54672a2a, 0x6b0abbbb, 0x9f87c1c1, 0xa6f15353, + 0xa572dcdc, 0x16530b0b, 0x27019d9d, 0xd82b6c6c, + 0x62a43131, 0xe8f37474, 0xf115f6f6, 0x8c4c4646, + 0x45a5acac, 0x0fb58989, 0x28b41414, 0xdfbae1e1, + 0x2ca61616, 0x74f73a3a, 0xd2066969, 0x12410909, + 0xe0d77070, 0x716fb6b6, 0xbd1ed0d0, 0xc7d6eded, + 0x85e2cccc, 0x84684242, 0x2d2c9898, 0x55eda4a4, + 0x50752828, 0xb8865c5c, 0xed6bf8f8, 0x11c28686, + }, + { + 0x7830d818, 0xaf462623, 0xf991b8c6, 0x6fcdfbe8, + 0xa113cb87, 0x626d11b8, 0x05020901, 0x6e9e0d4f, + 0xee6c9b36, 0x0451ffa6, 0xbdb90cd2, 0x06f70ef5, + 0x80f29679, 0xcede306f, 0xef3f6d91, 0x07a4f852, + 0xfdc04760, 0x766535bc, 0xcd2b379b, 0x8c018a8e, + 0x155bd2a3, 0x3c186c0c, 0x8af6847b, 0xe16a8035, + 0x693af51d, 0x47ddb3e0, 0xacb321d7, 0xed999cc2, + 0x965c432e, 0x7a96294b, 0x21e15dfe, 0x16aed557, + 0x412abd15, 0xb6eee877, 0xeb6e9237, 0x56d79ee5, + 0xd923139f, 0x17fd23f0, 0x7f94204a, 0x95a944da, + 0x25b0a258, 0xca8fcfc9, 0x8d527c29, 0x22145a0a, + 0x4f7f50b1, 0x1a5dc9a0, 0xdad6146b, 0xab17d985, + 0x73673cbd, 0x34ba8f5d, 0x50209010, 0x03f507f4, + 0xc08bddcb, 0xc67cd33e, 0x110a2d05, 0xe6ce7867, + 0x53d597e4, 0xbb4e0227, 0x58827341, 0x9d0ba78b, + 0x0153f6a7, 0x94fab27d, 0xfb374995, 0x9fad56d8, + 0x30eb70fb, 0x71c1cdee, 0x91f8bb7c, 0xe3cc7166, + 0x8ea77bdd, 0x4b2eaf17, 0x468e4547, 0xdc211a9e, + 0xc589d4ca, 0x995a582d, 0x79632ebf, 0x1b0e3f07, + 0x2347acad, 0x2fb4b05a, 0xb51bef83, 0xff66b633, + 0xf2c65c63, 0x0a041202, 0x384993aa, 0xa8e2de71, + 0xcf8dc6c8, 0x7d32d119, 0x70923b49, 0x9aaf5fd9, + 0x1df931f2, 0x48dba8e3, 0x2ab6b95b, 0x920dbc88, + 0xc8293e9a, 0xbe4c0b26, 0xfa64bf32, 0x4a7d59b0, + 0x6acff2e9, 0x331e770f, 0xa6b733d5, 0xba1df480, + 0x7c6127be, 0xde87ebcd, 0xe4688934, 0x75903248, + 0x24e354ff, 0x8ff48d7a, 0xea3d6490, 0x3ebe9d5f, + 0xa0403d20, 0xd5d00f68, 0x7234ca1a, 0x2c41b7ae, + 0x5e757db4, 0x19a8ce54, 0xe53b7f93, 0xaa442f22, + 0xe9c86364, 0x12ff2af1, 0xa2e6cc73, 0x5a248212, + 0x5d807a40, 0x28104808, 0xe89b95c3, 0x7bc5dfec, + 0x90ab4ddb, 0x1f5fc0a1, 0x8307918d, 0xc97ac83d, + 0xf1335b97, 0x00000000, 0xd483f9cf, 0x87566e2b, + 0xb3ece176, 0xb019e682, 0xa9b128d6, 0x7736c31b, + 0x5b7774b5, 0x2943beaf, 0xdfd41d6a, 0x0da0ea50, + 0x4c8a5745, 0x18fb38f3, 0xf060ad30, 0x74c3c4ef, + 0xc37eda3f, 0x1caac755, 0x1059dba2, 0x65c9e9ea, + 0xecca6a65, 0x686903ba, 0x935e4a2f, 0xe79d8ec0, + 0x81a160de, 0x6c38fc1c, 0x2ee746fd, 0x649a1f4d, + 0xe0397692, 0xbceafa75, 0x1e0c3606, 0x9809ae8a, + 0x40794bb2, 0x59d185e6, 0x361c7e0e, 0x633ee71f, + 0xf7c45562, 0xa3b53ad4, 0x324d81a8, 0xf4315296, + 0x3aef62f9, 0xf697a3c5, 0xb14a1025, 0x20b2ab59, + 0xae15d084, 0xa7e4c572, 0xdd72ec39, 0x6198164c, + 0x3bbc945e, 0x85f09f78, 0xd870e538, 0x8605988c, + 0xb2bf17d1, 0x0b57e4a5, 0x4dd9a1e2, 0xf8c24e61, + 0x457b42b3, 0xa5423421, 0xd625089c, 0x663cee1e, + 0x52866143, 0xfc93b1c7, 0x2be54ffc, 0x14082404, + 0x08a2e351, 0xc72f2599, 0xc4da226d, 0x391a650d, + 0x35e979fa, 0x84a369df, 0x9bfca97e, 0xb4481924, + 0xd776fe3b, 0x3d4b9aab, 0xd181f0ce, 0x55229911, + 0x8903838f, 0x6b9c044e, 0x517366b7, 0x60cbe0eb, + 0xcc78c13c, 0xbf1ffd81, 0xfe354094, 0x0cf31cf7, + 0x676f18b9, 0x5f268b13, 0x9c58512c, 0xb8bb05d3, + 0x5cd38ce7, 0xcbdc396e, 0xf395aac4, 0x0f061b03, + 0x13acdc56, 0x49885e44, 0x9efea07f, 0x374f88a9, + 0x8254672a, 0x6d6b0abb, 0xe29f87c1, 0x02a6f153, + 0x8ba572dc, 0x2716530b, 0xd327019d, 0xc1d82b6c, + 0xf562a431, 0xb9e8f374, 0x09f115f6, 0x438c4c46, + 0x2645a5ac, 0x970fb589, 0x4428b414, 0x42dfbae1, + 0x4e2ca616, 0xd274f73a, 0xd0d20669, 0x2d124109, + 0xade0d770, 0x54716fb6, 0xb7bd1ed0, 0x7ec7d6ed, + 0xdb85e2cc, 0x57846842, 0xc22d2c98, 0x0e55eda4, + 0x88507528, 0x31b8865c, 0x3fed6bf8, 0xa411c286, + }, +}; + +__device__ __constant__ u32 rch[R + 1] = +{ + 0x00000000, + 0x1823c6e8, + 0x36a6d2f5, + 0x60bc9b8e, + 0x1de0d7c2, + 0x157737e5, + 0x58c9290a, + 0xbd5d10f4, + 0xe427418b, + 0xfbee7c66, + 0xca2dbf07, +}; + +__device__ __constant__ u32 rcl[R + 1] = +{ + 0x00000000, + 0x87b8014f, + 0x796f9152, + 0xa30c7b35, + 0x2e4bfe57, + 0x9ff04ada, + 0xb1a06b85, + 0xcb3e0567, + 0xa77d95d8, + 0xdd17479e, + 0xad5a8333, +}; + +__device__ static void whirlpool_transform (const u32x w[16], u32x dgst[16], u32 s_Ch[8][256], u32 s_Cl[8][256]) +{ + u32x Kh[8]; + u32x Kl[8]; + + Kh[0] = 0x300beec0; + Kl[0] = 0xaf902967; + Kh[1] = 0x28282828; + Kl[1] = 0x28282828; + Kh[2] = 0x28282828; + Kl[2] = 0x28282828; + Kh[3] = 0x28282828; + Kl[3] = 0x28282828; + Kh[4] = 0x28282828; + Kl[4] = 0x28282828; + Kh[5] = 0x28282828; + Kl[5] = 0x28282828; + Kh[6] = 0x28282828; + Kl[6] = 0x28282828; + Kh[7] = 0x28282828; + Kl[7] = 0x28282828; + + u32x stateh[8]; + u32x statel[8]; + + stateh[0] = w[ 0]; + statel[0] = w[ 1]; + stateh[1] = w[ 2]; + statel[1] = w[ 3]; + stateh[2] = w[ 4]; + statel[2] = w[ 5]; + stateh[3] = w[ 6]; + statel[3] = w[ 7]; + stateh[4] = w[ 8]; + statel[4] = w[ 9]; + stateh[5] = w[10]; + statel[5] = w[11]; + stateh[6] = w[12]; + statel[6] = w[13]; + stateh[7] = w[14]; + statel[7] = w[15]; + + u32x Lh[8]; + u32x Ll[8]; + + #pragma unroll + for (int i = 0; i < 8; i++) + { + const u32x Lp0 = stateh[(i + 8) & 7] >> 24; + const u32x Lp1 = stateh[(i + 7) & 7] >> 16; + const u32x Lp2 = stateh[(i + 6) & 7] >> 8; + const u32x Lp3 = stateh[(i + 5) & 7] >> 0; + const u32x Lp4 = statel[(i + 4) & 7] >> 24; + const u32x Lp5 = statel[(i + 3) & 7] >> 16; + const u32x Lp6 = statel[(i + 2) & 7] >> 8; + const u32x Lp7 = statel[(i + 1) & 7] >> 0; + + Lh[i] = BOX (s_Ch, 0, Lp0 & 0xff) + ^ BOX (s_Ch, 1, Lp1 & 0xff) + ^ BOX (s_Ch, 2, Lp2 & 0xff) + ^ BOX (s_Ch, 3, Lp3 & 0xff) + ^ BOX (s_Ch, 4, Lp4 & 0xff) + ^ BOX (s_Ch, 5, Lp5 & 0xff) + ^ BOX (s_Ch, 6, Lp6 & 0xff) + ^ BOX (s_Ch, 7, Lp7 & 0xff); + + Ll[i] = BOX (s_Cl, 0, Lp0 & 0xff) + ^ BOX (s_Cl, 1, Lp1 & 0xff) + ^ BOX (s_Cl, 2, Lp2 & 0xff) + ^ BOX (s_Cl, 3, Lp3 & 0xff) + ^ BOX (s_Cl, 4, Lp4 & 0xff) + ^ BOX (s_Cl, 5, Lp5 & 0xff) + ^ BOX (s_Cl, 6, Lp6 & 0xff) + ^ BOX (s_Cl, 7, Lp7 & 0xff); + } + + stateh[0] = Lh[0] ^ Kh[0]; + statel[0] = Ll[0] ^ Kl[0]; + stateh[1] = Lh[1] ^ Kh[1]; + statel[1] = Ll[1] ^ Kl[1]; + stateh[2] = Lh[2] ^ Kh[2]; + statel[2] = Ll[2] ^ Kl[2]; + stateh[3] = Lh[3] ^ Kh[3]; + statel[3] = Ll[3] ^ Kl[3]; + stateh[4] = Lh[4] ^ Kh[4]; + statel[4] = Ll[4] ^ Kl[4]; + stateh[5] = Lh[5] ^ Kh[5]; + statel[5] = Ll[5] ^ Kl[5]; + stateh[6] = Lh[6] ^ Kh[6]; + statel[6] = Ll[6] ^ Kl[6]; + stateh[7] = Lh[7] ^ Kh[7]; + statel[7] = Ll[7] ^ Kl[7]; + + for (int r = 2; r <= R; r++) + { + u32x Lh[8]; + u32x Ll[8]; + + #pragma unroll + for (int i = 0; i < 8; i++) + { + const u32x Lp0 = Kh[(i + 8) & 7] >> 24; + const u32x Lp1 = Kh[(i + 7) & 7] >> 16; + const u32x Lp2 = Kh[(i + 6) & 7] >> 8; + const u32x Lp3 = Kh[(i + 5) & 7] >> 0; + const u32x Lp4 = Kl[(i + 4) & 7] >> 24; + const u32x Lp5 = Kl[(i + 3) & 7] >> 16; + const u32x Lp6 = Kl[(i + 2) & 7] >> 8; + const u32x Lp7 = Kl[(i + 1) & 7] >> 0; + + Lh[i] = BOX (s_Ch, 0, Lp0 & 0xff) + ^ BOX (s_Ch, 1, Lp1 & 0xff) + ^ BOX (s_Ch, 2, Lp2 & 0xff) + ^ BOX (s_Ch, 3, Lp3 & 0xff) + ^ BOX (s_Ch, 4, Lp4 & 0xff) + ^ BOX (s_Ch, 5, Lp5 & 0xff) + ^ BOX (s_Ch, 6, Lp6 & 0xff) + ^ BOX (s_Ch, 7, Lp7 & 0xff); + + Ll[i] = BOX (s_Cl, 0, Lp0 & 0xff) + ^ BOX (s_Cl, 1, Lp1 & 0xff) + ^ BOX (s_Cl, 2, Lp2 & 0xff) + ^ BOX (s_Cl, 3, Lp3 & 0xff) + ^ BOX (s_Cl, 4, Lp4 & 0xff) + ^ BOX (s_Cl, 5, Lp5 & 0xff) + ^ BOX (s_Cl, 6, Lp6 & 0xff) + ^ BOX (s_Cl, 7, Lp7 & 0xff); + } + + Kh[0] = Lh[0] ^ rch[r]; + Kl[0] = Ll[0] ^ rcl[r]; + Kh[1] = Lh[1]; + Kl[1] = Ll[1]; + Kh[2] = Lh[2]; + Kl[2] = Ll[2]; + Kh[3] = Lh[3]; + Kl[3] = Ll[3]; + Kh[4] = Lh[4]; + Kl[4] = Ll[4]; + Kh[5] = Lh[5]; + Kl[5] = Ll[5]; + Kh[6] = Lh[6]; + Kl[6] = Ll[6]; + Kh[7] = Lh[7]; + Kl[7] = Ll[7]; + + #pragma unroll 8 + for (int i = 0; i < 8; i++) + { + const u32x Lp0 = stateh[(i + 8) & 7] >> 24; + const u32x Lp1 = stateh[(i + 7) & 7] >> 16; + const u32x Lp2 = stateh[(i + 6) & 7] >> 8; + const u32x Lp3 = stateh[(i + 5) & 7] >> 0; + const u32x Lp4 = statel[(i + 4) & 7] >> 24; + const u32x Lp5 = statel[(i + 3) & 7] >> 16; + const u32x Lp6 = statel[(i + 2) & 7] >> 8; + const u32x Lp7 = statel[(i + 1) & 7] >> 0; + + Lh[i] = BOX (s_Ch, 0, Lp0 & 0xff) + ^ BOX (s_Ch, 1, Lp1 & 0xff) + ^ BOX (s_Ch, 2, Lp2 & 0xff) + ^ BOX (s_Ch, 3, Lp3 & 0xff) + ^ BOX (s_Ch, 4, Lp4 & 0xff) + ^ BOX (s_Ch, 5, Lp5 & 0xff) + ^ BOX (s_Ch, 6, Lp6 & 0xff) + ^ BOX (s_Ch, 7, Lp7 & 0xff); + + Ll[i] = BOX (s_Cl, 0, Lp0 & 0xff) + ^ BOX (s_Cl, 1, Lp1 & 0xff) + ^ BOX (s_Cl, 2, Lp2 & 0xff) + ^ BOX (s_Cl, 3, Lp3 & 0xff) + ^ BOX (s_Cl, 4, Lp4 & 0xff) + ^ BOX (s_Cl, 5, Lp5 & 0xff) + ^ BOX (s_Cl, 6, Lp6 & 0xff) + ^ BOX (s_Cl, 7, Lp7 & 0xff); + } + + stateh[0] = Lh[0] ^ Kh[0]; + statel[0] = Ll[0] ^ Kl[0]; + stateh[1] = Lh[1] ^ Kh[1]; + statel[1] = Ll[1] ^ Kl[1]; + stateh[2] = Lh[2] ^ Kh[2]; + statel[2] = Ll[2] ^ Kl[2]; + stateh[3] = Lh[3] ^ Kh[3]; + statel[3] = Ll[3] ^ Kl[3]; + stateh[4] = Lh[4] ^ Kh[4]; + statel[4] = Ll[4] ^ Kl[4]; + stateh[5] = Lh[5] ^ Kh[5]; + statel[5] = Ll[5] ^ Kl[5]; + stateh[6] = Lh[6] ^ Kh[6]; + statel[6] = Ll[6] ^ Kl[6]; + stateh[7] = Lh[7] ^ Kh[7]; + statel[7] = Ll[7] ^ Kl[7]; + } + + dgst[ 0] = stateh[0] ^ w[ 0]; + dgst[ 1] = statel[0] ^ w[ 1]; + dgst[ 2] = stateh[1] ^ w[ 2]; + dgst[ 3] = statel[1] ^ w[ 3]; + dgst[ 4] = stateh[2] ^ w[ 4]; + dgst[ 5] = statel[2] ^ w[ 5]; + dgst[ 6] = stateh[3] ^ w[ 6]; + dgst[ 7] = statel[3] ^ w[ 7]; + dgst[ 8] = stateh[4] ^ w[ 8]; + dgst[ 9] = statel[4] ^ w[ 9]; + dgst[10] = stateh[5] ^ w[10]; + dgst[11] = statel[5] ^ w[11]; + dgst[12] = stateh[6] ^ w[12]; + dgst[13] = statel[6] ^ w[13]; + dgst[14] = stateh[7] ^ w[14]; + dgst[15] = statel[7] ^ w[15]; +} + +__device__ __constant__ bf_t c_bfs[1024]; + +__device__ __shared__ u32 s_Ch[8][256]; +__device__ __shared__ u32 s_Cl[8][256]; + +__device__ static void m06100m (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], const u32 pw_len, const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset) +{ + /** + * modifier + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + const u32 lid = threadIdx.x; + + /** + * loop + */ + + u32x w0l = w0[0]; + + for (u32 il_pos = 0; il_pos < bfs_cnt; il_pos++) + { + const u32 w0r = c_bfs[il_pos].i; + + w0[0] = w0l | w0r; + + u32x wl[16]; + + wl[ 0] = w0[0]; + wl[ 1] = w0[1]; + wl[ 2] = w0[2]; + wl[ 3] = w0[3]; + wl[ 4] = w1[0]; + wl[ 5] = w1[1]; + wl[ 6] = w1[2]; + wl[ 7] = w1[3]; + wl[ 8] = w2[0]; + wl[ 9] = w2[1]; + wl[10] = w2[2]; + wl[11] = w2[3]; + wl[12] = w3[0]; + wl[13] = w3[1]; + wl[14] = 0; + wl[15] = pw_len * 8; + + u32x dgst[16]; + + whirlpool_transform (wl, dgst, s_Ch, s_Cl); + + const u32x r0 = dgst[0]; + const u32x r1 = dgst[1]; + const u32x r2 = dgst[2]; + const u32x r3 = dgst[3]; + + #include VECT_COMPARE_M + } +} + +__device__ static void m06100s (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], const u32 pw_len, const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset) +{ + /** + * modifier + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + const u32 lid = threadIdx.x; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * loop + */ + + u32x w0l = w0[0]; + + for (u32 il_pos = 0; il_pos < bfs_cnt; il_pos++) + { + const u32 w0r = c_bfs[il_pos].i; + + w0[0] = w0l | w0r; + + u32x wl[16]; + + wl[ 0] = w0[0]; + wl[ 1] = w0[1]; + wl[ 2] = w0[2]; + wl[ 3] = w0[3]; + wl[ 4] = w1[0]; + wl[ 5] = w1[1]; + wl[ 6] = w1[2]; + wl[ 7] = w1[3]; + wl[ 8] = w2[0]; + wl[ 9] = w2[1]; + wl[10] = w2[2]; + wl[11] = w2[3]; + wl[12] = w3[0]; + wl[13] = w3[1]; + wl[14] = 0; + wl[15] = pw_len * 8; + + u32x dgst[16]; + + whirlpool_transform (wl, dgst, s_Ch, s_Cl); + + const u32x r0 = dgst[0]; + const u32x r1 = dgst[1]; + const u32x r2 = dgst[2]; + const u32x r3 = dgst[3]; + + #include VECT_COMPARE_S + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m06100_m04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + const u32 lid = threadIdx.x; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * modifier + */ + + for (u32 i = 0; i < 8; i++) + { + s_Ch[i][lid] = Ch[i][lid]; + s_Cl[i][lid] = Cl[i][lid]; + } + + __syncthreads (); + + if (gid >= gid_max) return; + + /** + * main + */ + + m06100m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m06100_m08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + const u32 lid = threadIdx.x; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * modifier + */ + + for (u32 i = 0; i < 8; i++) + { + s_Ch[i][lid] = Ch[i][lid]; + s_Cl[i][lid] = Cl[i][lid]; + } + + __syncthreads (); + + if (gid >= gid_max) return; + + /** + * main + */ + + m06100m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m06100_m16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + const u32 lid = threadIdx.x; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = pws[gid].i[ 8]; + w2[1] = pws[gid].i[ 9]; + w2[2] = pws[gid].i[10]; + w2[3] = pws[gid].i[11]; + + u32x w3[4]; + + w3[0] = pws[gid].i[12]; + w3[1] = pws[gid].i[13]; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * modifier + */ + + for (u32 i = 0; i < 8; i++) + { + s_Ch[i][lid] = Ch[i][lid]; + s_Cl[i][lid] = Cl[i][lid]; + } + + __syncthreads (); + + if (gid >= gid_max) return; + + /** + * main + */ + + m06100m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m06100_s04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + const u32 lid = threadIdx.x; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * modifier + */ + + for (u32 i = 0; i < 8; i++) + { + s_Ch[i][lid] = Ch[i][lid]; + s_Cl[i][lid] = Cl[i][lid]; + } + + __syncthreads (); + + if (gid >= gid_max) return; + + /** + * main + */ + + m06100s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m06100_s08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + const u32 lid = threadIdx.x; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * modifier + */ + + for (u32 i = 0; i < 8; i++) + { + s_Ch[i][lid] = Ch[i][lid]; + s_Cl[i][lid] = Cl[i][lid]; + } + + __syncthreads (); + + if (gid >= gid_max) return; + + /** + * main + */ + + m06100s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m06100_s16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + const u32 lid = threadIdx.x; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = pws[gid].i[ 8]; + w2[1] = pws[gid].i[ 9]; + w2[2] = pws[gid].i[10]; + w2[3] = pws[gid].i[11]; + + u32x w3[4]; + + w3[0] = pws[gid].i[12]; + w3[1] = pws[gid].i[13]; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * modifier + */ + + for (u32 i = 0; i < 8; i++) + { + s_Ch[i][lid] = Ch[i][lid]; + s_Cl[i][lid] = Cl[i][lid]; + } + + __syncthreads (); + + if (gid >= gid_max) return; + + /** + * main + */ + + m06100s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} diff --git a/nv/m06211.cu b/nv/m06211.cu new file mode 100644 index 0000000000..493353291f --- /dev/null +++ b/nv/m06211.cu @@ -0,0 +1,717 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _RIPEMD160_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW2 +#define VECT_SIZE1 +#endif + +#define DGST_R0 0 +#define DGST_R1 1 +#define DGST_R2 2 +#define DGST_R3 3 + +#include "include/kernel_functions.c" +#include "types_nv.c" +#include "common_nv.c" + +#include "gpu_aes256_nv.c" +#include "gpu_twofish256_nv.c" +#include "gpu_serpent256_nv.c" + +__device__ static void ripemd160_transform (const u32x w[16], u32x dgst[5]) +{ + u32x a1 = dgst[0]; + u32x b1 = dgst[1]; + u32x c1 = dgst[2]; + u32x d1 = dgst[3]; + u32x e1 = dgst[4]; + + RIPEMD160_STEP (RIPEMD160_F , a1, b1, c1, d1, e1, w[ 0], RIPEMD160C00, RIPEMD160S00); + RIPEMD160_STEP (RIPEMD160_F , e1, a1, b1, c1, d1, w[ 1], RIPEMD160C00, RIPEMD160S01); + RIPEMD160_STEP (RIPEMD160_F , d1, e1, a1, b1, c1, w[ 2], RIPEMD160C00, RIPEMD160S02); + RIPEMD160_STEP (RIPEMD160_F , c1, d1, e1, a1, b1, w[ 3], RIPEMD160C00, RIPEMD160S03); + RIPEMD160_STEP (RIPEMD160_F , b1, c1, d1, e1, a1, w[ 4], RIPEMD160C00, RIPEMD160S04); + RIPEMD160_STEP (RIPEMD160_F , a1, b1, c1, d1, e1, w[ 5], RIPEMD160C00, RIPEMD160S05); + RIPEMD160_STEP (RIPEMD160_F , e1, a1, b1, c1, d1, w[ 6], RIPEMD160C00, RIPEMD160S06); + RIPEMD160_STEP (RIPEMD160_F , d1, e1, a1, b1, c1, w[ 7], RIPEMD160C00, RIPEMD160S07); + RIPEMD160_STEP (RIPEMD160_F , c1, d1, e1, a1, b1, w[ 8], RIPEMD160C00, RIPEMD160S08); + RIPEMD160_STEP (RIPEMD160_F , b1, c1, d1, e1, a1, w[ 9], RIPEMD160C00, RIPEMD160S09); + RIPEMD160_STEP (RIPEMD160_F , a1, b1, c1, d1, e1, w[10], RIPEMD160C00, RIPEMD160S0A); + RIPEMD160_STEP (RIPEMD160_F , e1, a1, b1, c1, d1, w[11], RIPEMD160C00, RIPEMD160S0B); + RIPEMD160_STEP (RIPEMD160_F , d1, e1, a1, b1, c1, w[12], RIPEMD160C00, RIPEMD160S0C); + RIPEMD160_STEP (RIPEMD160_F , c1, d1, e1, a1, b1, w[13], RIPEMD160C00, RIPEMD160S0D); + RIPEMD160_STEP (RIPEMD160_F , b1, c1, d1, e1, a1, w[14], RIPEMD160C00, RIPEMD160S0E); + RIPEMD160_STEP (RIPEMD160_F , a1, b1, c1, d1, e1, w[15], RIPEMD160C00, RIPEMD160S0F); + + RIPEMD160_STEP (RIPEMD160_Go, e1, a1, b1, c1, d1, w[ 7], RIPEMD160C10, RIPEMD160S10); + RIPEMD160_STEP (RIPEMD160_Go, d1, e1, a1, b1, c1, w[ 4], RIPEMD160C10, RIPEMD160S11); + RIPEMD160_STEP (RIPEMD160_Go, c1, d1, e1, a1, b1, w[13], RIPEMD160C10, RIPEMD160S12); + RIPEMD160_STEP (RIPEMD160_Go, b1, c1, d1, e1, a1, w[ 1], RIPEMD160C10, RIPEMD160S13); + RIPEMD160_STEP (RIPEMD160_Go, a1, b1, c1, d1, e1, w[10], RIPEMD160C10, RIPEMD160S14); + RIPEMD160_STEP (RIPEMD160_Go, e1, a1, b1, c1, d1, w[ 6], RIPEMD160C10, RIPEMD160S15); + RIPEMD160_STEP (RIPEMD160_Go, d1, e1, a1, b1, c1, w[15], RIPEMD160C10, RIPEMD160S16); + RIPEMD160_STEP (RIPEMD160_Go, c1, d1, e1, a1, b1, w[ 3], RIPEMD160C10, RIPEMD160S17); + RIPEMD160_STEP (RIPEMD160_Go, b1, c1, d1, e1, a1, w[12], RIPEMD160C10, RIPEMD160S18); + RIPEMD160_STEP (RIPEMD160_Go, a1, b1, c1, d1, e1, w[ 0], RIPEMD160C10, RIPEMD160S19); + RIPEMD160_STEP (RIPEMD160_Go, e1, a1, b1, c1, d1, w[ 9], RIPEMD160C10, RIPEMD160S1A); + RIPEMD160_STEP (RIPEMD160_Go, d1, e1, a1, b1, c1, w[ 5], RIPEMD160C10, RIPEMD160S1B); + RIPEMD160_STEP (RIPEMD160_Go, c1, d1, e1, a1, b1, w[ 2], RIPEMD160C10, RIPEMD160S1C); + RIPEMD160_STEP (RIPEMD160_Go, b1, c1, d1, e1, a1, w[14], RIPEMD160C10, RIPEMD160S1D); + RIPEMD160_STEP (RIPEMD160_Go, a1, b1, c1, d1, e1, w[11], RIPEMD160C10, RIPEMD160S1E); + RIPEMD160_STEP (RIPEMD160_Go, e1, a1, b1, c1, d1, w[ 8], RIPEMD160C10, RIPEMD160S1F); + + RIPEMD160_STEP (RIPEMD160_H , d1, e1, a1, b1, c1, w[ 3], RIPEMD160C20, RIPEMD160S20); + RIPEMD160_STEP (RIPEMD160_H , c1, d1, e1, a1, b1, w[10], RIPEMD160C20, RIPEMD160S21); + RIPEMD160_STEP (RIPEMD160_H , b1, c1, d1, e1, a1, w[14], RIPEMD160C20, RIPEMD160S22); + RIPEMD160_STEP (RIPEMD160_H , a1, b1, c1, d1, e1, w[ 4], RIPEMD160C20, RIPEMD160S23); + RIPEMD160_STEP (RIPEMD160_H , e1, a1, b1, c1, d1, w[ 9], RIPEMD160C20, RIPEMD160S24); + RIPEMD160_STEP (RIPEMD160_H , d1, e1, a1, b1, c1, w[15], RIPEMD160C20, RIPEMD160S25); + RIPEMD160_STEP (RIPEMD160_H , c1, d1, e1, a1, b1, w[ 8], RIPEMD160C20, RIPEMD160S26); + RIPEMD160_STEP (RIPEMD160_H , b1, c1, d1, e1, a1, w[ 1], RIPEMD160C20, RIPEMD160S27); + RIPEMD160_STEP (RIPEMD160_H , a1, b1, c1, d1, e1, w[ 2], RIPEMD160C20, RIPEMD160S28); + RIPEMD160_STEP (RIPEMD160_H , e1, a1, b1, c1, d1, w[ 7], RIPEMD160C20, RIPEMD160S29); + RIPEMD160_STEP (RIPEMD160_H , d1, e1, a1, b1, c1, w[ 0], RIPEMD160C20, RIPEMD160S2A); + RIPEMD160_STEP (RIPEMD160_H , c1, d1, e1, a1, b1, w[ 6], RIPEMD160C20, RIPEMD160S2B); + RIPEMD160_STEP (RIPEMD160_H , b1, c1, d1, e1, a1, w[13], RIPEMD160C20, RIPEMD160S2C); + RIPEMD160_STEP (RIPEMD160_H , a1, b1, c1, d1, e1, w[11], RIPEMD160C20, RIPEMD160S2D); + RIPEMD160_STEP (RIPEMD160_H , e1, a1, b1, c1, d1, w[ 5], RIPEMD160C20, RIPEMD160S2E); + RIPEMD160_STEP (RIPEMD160_H , d1, e1, a1, b1, c1, w[12], RIPEMD160C20, RIPEMD160S2F); + + RIPEMD160_STEP (RIPEMD160_Io, c1, d1, e1, a1, b1, w[ 1], RIPEMD160C30, RIPEMD160S30); + RIPEMD160_STEP (RIPEMD160_Io, b1, c1, d1, e1, a1, w[ 9], RIPEMD160C30, RIPEMD160S31); + RIPEMD160_STEP (RIPEMD160_Io, a1, b1, c1, d1, e1, w[11], RIPEMD160C30, RIPEMD160S32); + RIPEMD160_STEP (RIPEMD160_Io, e1, a1, b1, c1, d1, w[10], RIPEMD160C30, RIPEMD160S33); + RIPEMD160_STEP (RIPEMD160_Io, d1, e1, a1, b1, c1, w[ 0], RIPEMD160C30, RIPEMD160S34); + RIPEMD160_STEP (RIPEMD160_Io, c1, d1, e1, a1, b1, w[ 8], RIPEMD160C30, RIPEMD160S35); + RIPEMD160_STEP (RIPEMD160_Io, b1, c1, d1, e1, a1, w[12], RIPEMD160C30, RIPEMD160S36); + RIPEMD160_STEP (RIPEMD160_Io, a1, b1, c1, d1, e1, w[ 4], RIPEMD160C30, RIPEMD160S37); + RIPEMD160_STEP (RIPEMD160_Io, e1, a1, b1, c1, d1, w[13], RIPEMD160C30, RIPEMD160S38); + RIPEMD160_STEP (RIPEMD160_Io, d1, e1, a1, b1, c1, w[ 3], RIPEMD160C30, RIPEMD160S39); + RIPEMD160_STEP (RIPEMD160_Io, c1, d1, e1, a1, b1, w[ 7], RIPEMD160C30, RIPEMD160S3A); + RIPEMD160_STEP (RIPEMD160_Io, b1, c1, d1, e1, a1, w[15], RIPEMD160C30, RIPEMD160S3B); + RIPEMD160_STEP (RIPEMD160_Io, a1, b1, c1, d1, e1, w[14], RIPEMD160C30, RIPEMD160S3C); + RIPEMD160_STEP (RIPEMD160_Io, e1, a1, b1, c1, d1, w[ 5], RIPEMD160C30, RIPEMD160S3D); + RIPEMD160_STEP (RIPEMD160_Io, d1, e1, a1, b1, c1, w[ 6], RIPEMD160C30, RIPEMD160S3E); + RIPEMD160_STEP (RIPEMD160_Io, c1, d1, e1, a1, b1, w[ 2], RIPEMD160C30, RIPEMD160S3F); + + RIPEMD160_STEP (RIPEMD160_J , b1, c1, d1, e1, a1, w[ 4], RIPEMD160C40, RIPEMD160S40); + RIPEMD160_STEP (RIPEMD160_J , a1, b1, c1, d1, e1, w[ 0], RIPEMD160C40, RIPEMD160S41); + RIPEMD160_STEP (RIPEMD160_J , e1, a1, b1, c1, d1, w[ 5], RIPEMD160C40, RIPEMD160S42); + RIPEMD160_STEP (RIPEMD160_J , d1, e1, a1, b1, c1, w[ 9], RIPEMD160C40, RIPEMD160S43); + RIPEMD160_STEP (RIPEMD160_J , c1, d1, e1, a1, b1, w[ 7], RIPEMD160C40, RIPEMD160S44); + RIPEMD160_STEP (RIPEMD160_J , b1, c1, d1, e1, a1, w[12], RIPEMD160C40, RIPEMD160S45); + RIPEMD160_STEP (RIPEMD160_J , a1, b1, c1, d1, e1, w[ 2], RIPEMD160C40, RIPEMD160S46); + RIPEMD160_STEP (RIPEMD160_J , e1, a1, b1, c1, d1, w[10], RIPEMD160C40, RIPEMD160S47); + RIPEMD160_STEP (RIPEMD160_J , d1, e1, a1, b1, c1, w[14], RIPEMD160C40, RIPEMD160S48); + RIPEMD160_STEP (RIPEMD160_J , c1, d1, e1, a1, b1, w[ 1], RIPEMD160C40, RIPEMD160S49); + RIPEMD160_STEP (RIPEMD160_J , b1, c1, d1, e1, a1, w[ 3], RIPEMD160C40, RIPEMD160S4A); + RIPEMD160_STEP (RIPEMD160_J , a1, b1, c1, d1, e1, w[ 8], RIPEMD160C40, RIPEMD160S4B); + RIPEMD160_STEP (RIPEMD160_J , e1, a1, b1, c1, d1, w[11], RIPEMD160C40, RIPEMD160S4C); + RIPEMD160_STEP (RIPEMD160_J , d1, e1, a1, b1, c1, w[ 6], RIPEMD160C40, RIPEMD160S4D); + RIPEMD160_STEP (RIPEMD160_J , c1, d1, e1, a1, b1, w[15], RIPEMD160C40, RIPEMD160S4E); + RIPEMD160_STEP (RIPEMD160_J , b1, c1, d1, e1, a1, w[13], RIPEMD160C40, RIPEMD160S4F); + + u32x a2 = dgst[0]; + u32x b2 = dgst[1]; + u32x c2 = dgst[2]; + u32x d2 = dgst[3]; + u32x e2 = dgst[4]; + + //RIPEMD160_STEP_WORKAROUND_BUG (RIPEMD160_J , a2, b2, c2, d2, e2, w[ 5], RIPEMD160C50, RIPEMD160S50); + RIPEMD160_STEP (RIPEMD160_J , a2, b2, c2, d2, e2, w[ 5], RIPEMD160C50, RIPEMD160S50); + RIPEMD160_STEP (RIPEMD160_J , e2, a2, b2, c2, d2, w[14], RIPEMD160C50, RIPEMD160S51); + RIPEMD160_STEP (RIPEMD160_J , d2, e2, a2, b2, c2, w[ 7], RIPEMD160C50, RIPEMD160S52); + RIPEMD160_STEP (RIPEMD160_J , c2, d2, e2, a2, b2, w[ 0], RIPEMD160C50, RIPEMD160S53); + RIPEMD160_STEP (RIPEMD160_J , b2, c2, d2, e2, a2, w[ 9], RIPEMD160C50, RIPEMD160S54); + RIPEMD160_STEP (RIPEMD160_J , a2, b2, c2, d2, e2, w[ 2], RIPEMD160C50, RIPEMD160S55); + RIPEMD160_STEP (RIPEMD160_J , e2, a2, b2, c2, d2, w[11], RIPEMD160C50, RIPEMD160S56); + RIPEMD160_STEP (RIPEMD160_J , d2, e2, a2, b2, c2, w[ 4], RIPEMD160C50, RIPEMD160S57); + RIPEMD160_STEP (RIPEMD160_J , c2, d2, e2, a2, b2, w[13], RIPEMD160C50, RIPEMD160S58); + RIPEMD160_STEP (RIPEMD160_J , b2, c2, d2, e2, a2, w[ 6], RIPEMD160C50, RIPEMD160S59); + RIPEMD160_STEP (RIPEMD160_J , a2, b2, c2, d2, e2, w[15], RIPEMD160C50, RIPEMD160S5A); + RIPEMD160_STEP (RIPEMD160_J , e2, a2, b2, c2, d2, w[ 8], RIPEMD160C50, RIPEMD160S5B); + RIPEMD160_STEP (RIPEMD160_J , d2, e2, a2, b2, c2, w[ 1], RIPEMD160C50, RIPEMD160S5C); + RIPEMD160_STEP (RIPEMD160_J , c2, d2, e2, a2, b2, w[10], RIPEMD160C50, RIPEMD160S5D); + RIPEMD160_STEP (RIPEMD160_J , b2, c2, d2, e2, a2, w[ 3], RIPEMD160C50, RIPEMD160S5E); + RIPEMD160_STEP (RIPEMD160_J , a2, b2, c2, d2, e2, w[12], RIPEMD160C50, RIPEMD160S5F); + + RIPEMD160_STEP (RIPEMD160_Io, e2, a2, b2, c2, d2, w[ 6], RIPEMD160C60, RIPEMD160S60); + RIPEMD160_STEP (RIPEMD160_Io, d2, e2, a2, b2, c2, w[11], RIPEMD160C60, RIPEMD160S61); + RIPEMD160_STEP (RIPEMD160_Io, c2, d2, e2, a2, b2, w[ 3], RIPEMD160C60, RIPEMD160S62); + RIPEMD160_STEP (RIPEMD160_Io, b2, c2, d2, e2, a2, w[ 7], RIPEMD160C60, RIPEMD160S63); + RIPEMD160_STEP (RIPEMD160_Io, a2, b2, c2, d2, e2, w[ 0], RIPEMD160C60, RIPEMD160S64); + RIPEMD160_STEP (RIPEMD160_Io, e2, a2, b2, c2, d2, w[13], RIPEMD160C60, RIPEMD160S65); + RIPEMD160_STEP (RIPEMD160_Io, d2, e2, a2, b2, c2, w[ 5], RIPEMD160C60, RIPEMD160S66); + RIPEMD160_STEP (RIPEMD160_Io, c2, d2, e2, a2, b2, w[10], RIPEMD160C60, RIPEMD160S67); + RIPEMD160_STEP (RIPEMD160_Io, b2, c2, d2, e2, a2, w[14], RIPEMD160C60, RIPEMD160S68); + RIPEMD160_STEP (RIPEMD160_Io, a2, b2, c2, d2, e2, w[15], RIPEMD160C60, RIPEMD160S69); + RIPEMD160_STEP (RIPEMD160_Io, e2, a2, b2, c2, d2, w[ 8], RIPEMD160C60, RIPEMD160S6A); + RIPEMD160_STEP (RIPEMD160_Io, d2, e2, a2, b2, c2, w[12], RIPEMD160C60, RIPEMD160S6B); + RIPEMD160_STEP (RIPEMD160_Io, c2, d2, e2, a2, b2, w[ 4], RIPEMD160C60, RIPEMD160S6C); + RIPEMD160_STEP (RIPEMD160_Io, b2, c2, d2, e2, a2, w[ 9], RIPEMD160C60, RIPEMD160S6D); + RIPEMD160_STEP (RIPEMD160_Io, a2, b2, c2, d2, e2, w[ 1], RIPEMD160C60, RIPEMD160S6E); + RIPEMD160_STEP (RIPEMD160_Io, e2, a2, b2, c2, d2, w[ 2], RIPEMD160C60, RIPEMD160S6F); + + RIPEMD160_STEP (RIPEMD160_H , d2, e2, a2, b2, c2, w[15], RIPEMD160C70, RIPEMD160S70); + RIPEMD160_STEP (RIPEMD160_H , c2, d2, e2, a2, b2, w[ 5], RIPEMD160C70, RIPEMD160S71); + RIPEMD160_STEP (RIPEMD160_H , b2, c2, d2, e2, a2, w[ 1], RIPEMD160C70, RIPEMD160S72); + RIPEMD160_STEP (RIPEMD160_H , a2, b2, c2, d2, e2, w[ 3], RIPEMD160C70, RIPEMD160S73); + RIPEMD160_STEP (RIPEMD160_H , e2, a2, b2, c2, d2, w[ 7], RIPEMD160C70, RIPEMD160S74); + RIPEMD160_STEP (RIPEMD160_H , d2, e2, a2, b2, c2, w[14], RIPEMD160C70, RIPEMD160S75); + RIPEMD160_STEP (RIPEMD160_H , c2, d2, e2, a2, b2, w[ 6], RIPEMD160C70, RIPEMD160S76); + RIPEMD160_STEP (RIPEMD160_H , b2, c2, d2, e2, a2, w[ 9], RIPEMD160C70, RIPEMD160S77); + RIPEMD160_STEP (RIPEMD160_H , a2, b2, c2, d2, e2, w[11], RIPEMD160C70, RIPEMD160S78); + RIPEMD160_STEP (RIPEMD160_H , e2, a2, b2, c2, d2, w[ 8], RIPEMD160C70, RIPEMD160S79); + RIPEMD160_STEP (RIPEMD160_H , d2, e2, a2, b2, c2, w[12], RIPEMD160C70, RIPEMD160S7A); + RIPEMD160_STEP (RIPEMD160_H , c2, d2, e2, a2, b2, w[ 2], RIPEMD160C70, RIPEMD160S7B); + RIPEMD160_STEP (RIPEMD160_H , b2, c2, d2, e2, a2, w[10], RIPEMD160C70, RIPEMD160S7C); + RIPEMD160_STEP (RIPEMD160_H , a2, b2, c2, d2, e2, w[ 0], RIPEMD160C70, RIPEMD160S7D); + RIPEMD160_STEP (RIPEMD160_H , e2, a2, b2, c2, d2, w[ 4], RIPEMD160C70, RIPEMD160S7E); + RIPEMD160_STEP (RIPEMD160_H , d2, e2, a2, b2, c2, w[13], RIPEMD160C70, RIPEMD160S7F); + + RIPEMD160_STEP (RIPEMD160_Go, c2, d2, e2, a2, b2, w[ 8], RIPEMD160C80, RIPEMD160S80); + RIPEMD160_STEP (RIPEMD160_Go, b2, c2, d2, e2, a2, w[ 6], RIPEMD160C80, RIPEMD160S81); + RIPEMD160_STEP (RIPEMD160_Go, a2, b2, c2, d2, e2, w[ 4], RIPEMD160C80, RIPEMD160S82); + RIPEMD160_STEP (RIPEMD160_Go, e2, a2, b2, c2, d2, w[ 1], RIPEMD160C80, RIPEMD160S83); + RIPEMD160_STEP (RIPEMD160_Go, d2, e2, a2, b2, c2, w[ 3], RIPEMD160C80, RIPEMD160S84); + RIPEMD160_STEP (RIPEMD160_Go, c2, d2, e2, a2, b2, w[11], RIPEMD160C80, RIPEMD160S85); + RIPEMD160_STEP (RIPEMD160_Go, b2, c2, d2, e2, a2, w[15], RIPEMD160C80, RIPEMD160S86); + RIPEMD160_STEP (RIPEMD160_Go, a2, b2, c2, d2, e2, w[ 0], RIPEMD160C80, RIPEMD160S87); + RIPEMD160_STEP (RIPEMD160_Go, e2, a2, b2, c2, d2, w[ 5], RIPEMD160C80, RIPEMD160S88); + RIPEMD160_STEP (RIPEMD160_Go, d2, e2, a2, b2, c2, w[12], RIPEMD160C80, RIPEMD160S89); + RIPEMD160_STEP (RIPEMD160_Go, c2, d2, e2, a2, b2, w[ 2], RIPEMD160C80, RIPEMD160S8A); + RIPEMD160_STEP (RIPEMD160_Go, b2, c2, d2, e2, a2, w[13], RIPEMD160C80, RIPEMD160S8B); + RIPEMD160_STEP (RIPEMD160_Go, a2, b2, c2, d2, e2, w[ 9], RIPEMD160C80, RIPEMD160S8C); + RIPEMD160_STEP (RIPEMD160_Go, e2, a2, b2, c2, d2, w[ 7], RIPEMD160C80, RIPEMD160S8D); + RIPEMD160_STEP (RIPEMD160_Go, d2, e2, a2, b2, c2, w[10], RIPEMD160C80, RIPEMD160S8E); + RIPEMD160_STEP (RIPEMD160_Go, c2, d2, e2, a2, b2, w[14], RIPEMD160C80, RIPEMD160S8F); + + RIPEMD160_STEP (RIPEMD160_F , b2, c2, d2, e2, a2, w[12], RIPEMD160C90, RIPEMD160S90); + RIPEMD160_STEP (RIPEMD160_F , a2, b2, c2, d2, e2, w[15], RIPEMD160C90, RIPEMD160S91); + RIPEMD160_STEP (RIPEMD160_F , e2, a2, b2, c2, d2, w[10], RIPEMD160C90, RIPEMD160S92); + RIPEMD160_STEP (RIPEMD160_F , d2, e2, a2, b2, c2, w[ 4], RIPEMD160C90, RIPEMD160S93); + RIPEMD160_STEP (RIPEMD160_F , c2, d2, e2, a2, b2, w[ 1], RIPEMD160C90, RIPEMD160S94); + RIPEMD160_STEP (RIPEMD160_F , b2, c2, d2, e2, a2, w[ 5], RIPEMD160C90, RIPEMD160S95); + RIPEMD160_STEP (RIPEMD160_F , a2, b2, c2, d2, e2, w[ 8], RIPEMD160C90, RIPEMD160S96); + RIPEMD160_STEP (RIPEMD160_F , e2, a2, b2, c2, d2, w[ 7], RIPEMD160C90, RIPEMD160S97); + RIPEMD160_STEP (RIPEMD160_F , d2, e2, a2, b2, c2, w[ 6], RIPEMD160C90, RIPEMD160S98); + RIPEMD160_STEP (RIPEMD160_F , c2, d2, e2, a2, b2, w[ 2], RIPEMD160C90, RIPEMD160S99); + RIPEMD160_STEP (RIPEMD160_F , b2, c2, d2, e2, a2, w[13], RIPEMD160C90, RIPEMD160S9A); + RIPEMD160_STEP (RIPEMD160_F , a2, b2, c2, d2, e2, w[14], RIPEMD160C90, RIPEMD160S9B); + RIPEMD160_STEP (RIPEMD160_F , e2, a2, b2, c2, d2, w[ 0], RIPEMD160C90, RIPEMD160S9C); + RIPEMD160_STEP (RIPEMD160_F , d2, e2, a2, b2, c2, w[ 3], RIPEMD160C90, RIPEMD160S9D); + RIPEMD160_STEP (RIPEMD160_F , c2, d2, e2, a2, b2, w[ 9], RIPEMD160C90, RIPEMD160S9E); + RIPEMD160_STEP (RIPEMD160_F , b2, c2, d2, e2, a2, w[11], RIPEMD160C90, RIPEMD160S9F); + + const u32x a = dgst[1] + c1 + d2; + const u32x b = dgst[2] + d1 + e2; + const u32x c = dgst[3] + e1 + a2; + const u32x d = dgst[4] + a1 + b2; + const u32x e = dgst[0] + b1 + c2; + + dgst[0] = a; + dgst[1] = b; + dgst[2] = c; + dgst[3] = d; + dgst[4] = e; +} + +__device__ static void hmac_run2 (const u32x w1[16], const u32x w2[16], const u32x ipad[5], const u32x opad[5], u32x dgst[5]) +{ + dgst[0] = ipad[0]; + dgst[1] = ipad[1]; + dgst[2] = ipad[2]; + dgst[3] = ipad[3]; + dgst[4] = ipad[4]; + + ripemd160_transform (w1, dgst); + ripemd160_transform (w2, dgst); + + u32x w[16]; + + w[ 0] = dgst[0]; + w[ 1] = dgst[1]; + w[ 2] = dgst[2]; + w[ 3] = dgst[3]; + w[ 4] = dgst[4]; + w[ 5] = 0x80; + w[ 6] = 0; + w[ 7] = 0; + w[ 8] = 0; + w[ 9] = 0; + w[10] = 0; + w[11] = 0; + w[12] = 0; + w[13] = 0; + w[14] = (64 + 20) * 8; + w[15] = 0; + + dgst[0] = opad[0]; + dgst[1] = opad[1]; + dgst[2] = opad[2]; + dgst[3] = opad[3]; + dgst[4] = opad[4]; + + ripemd160_transform (w, dgst); +} + +__device__ static void hmac_run (u32x w[16], const u32x ipad[5], const u32x opad[5], u32x dgst[5]) +{ + dgst[0] = ipad[0]; + dgst[1] = ipad[1]; + dgst[2] = ipad[2]; + dgst[3] = ipad[3]; + dgst[4] = ipad[4]; + + ripemd160_transform (w, dgst); + + w[ 0] = dgst[0]; + w[ 1] = dgst[1]; + w[ 2] = dgst[2]; + w[ 3] = dgst[3]; + w[ 4] = dgst[4]; + w[ 5] = 0x80; + w[ 6] = 0; + w[ 7] = 0; + w[ 8] = 0; + w[ 9] = 0; + w[10] = 0; + w[11] = 0; + w[12] = 0; + w[13] = 0; + w[14] = (64 + 20) * 8; + w[15] = 0; + + dgst[0] = opad[0]; + dgst[1] = opad[1]; + dgst[2] = opad[2]; + dgst[3] = opad[3]; + dgst[4] = opad[4]; + + ripemd160_transform (w, dgst); +} + +__device__ static void hmac_init (u32x w[16], u32x ipad[5], u32x opad[5]) +{ + w[ 0] ^= 0x36363636; + w[ 1] ^= 0x36363636; + w[ 2] ^= 0x36363636; + w[ 3] ^= 0x36363636; + w[ 4] ^= 0x36363636; + w[ 5] ^= 0x36363636; + w[ 6] ^= 0x36363636; + w[ 7] ^= 0x36363636; + w[ 8] ^= 0x36363636; + w[ 9] ^= 0x36363636; + w[10] ^= 0x36363636; + w[11] ^= 0x36363636; + w[12] ^= 0x36363636; + w[13] ^= 0x36363636; + w[14] ^= 0x36363636; + w[15] ^= 0x36363636; + + ipad[0] = RIPEMD160M_A; + ipad[1] = RIPEMD160M_B; + ipad[2] = RIPEMD160M_C; + ipad[3] = RIPEMD160M_D; + ipad[4] = RIPEMD160M_E; + + ripemd160_transform (w, ipad); + + w[ 0] ^= 0x6a6a6a6a; + w[ 1] ^= 0x6a6a6a6a; + w[ 2] ^= 0x6a6a6a6a; + w[ 3] ^= 0x6a6a6a6a; + w[ 4] ^= 0x6a6a6a6a; + w[ 5] ^= 0x6a6a6a6a; + w[ 6] ^= 0x6a6a6a6a; + w[ 7] ^= 0x6a6a6a6a; + w[ 8] ^= 0x6a6a6a6a; + w[ 9] ^= 0x6a6a6a6a; + w[10] ^= 0x6a6a6a6a; + w[11] ^= 0x6a6a6a6a; + w[12] ^= 0x6a6a6a6a; + w[13] ^= 0x6a6a6a6a; + w[14] ^= 0x6a6a6a6a; + w[15] ^= 0x6a6a6a6a; + + opad[0] = RIPEMD160M_A; + opad[1] = RIPEMD160M_B; + opad[2] = RIPEMD160M_C; + opad[3] = RIPEMD160M_D; + opad[4] = RIPEMD160M_E; + + ripemd160_transform (w, opad); +} + +__device__ static u32 u8add (const u32 a, const u32 b) +{ + const u32 a1 = (a >> 0) & 0xff; + const u32 a2 = (a >> 8) & 0xff; + const u32 a3 = (a >> 16) & 0xff; + const u32 a4 = (a >> 24) & 0xff; + + const u32 b1 = (b >> 0) & 0xff; + const u32 b2 = (b >> 8) & 0xff; + const u32 b3 = (b >> 16) & 0xff; + const u32 b4 = (b >> 24) & 0xff; + + const u32 r1 = (a1 + b1) & 0xff; + const u32 r2 = (a2 + b2) & 0xff; + const u32 r3 = (a3 + b3) & 0xff; + const u32 r4 = (a4 + b4) & 0xff; + + const u32 r = r1 << 0 + | r2 << 8 + | r3 << 16 + | r4 << 24; + + return r; +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m06211_init (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, tc_tmp_t *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const tc_t *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = pws[gid].i[ 8]; + w2[1] = pws[gid].i[ 9]; + w2[2] = pws[gid].i[10]; + w2[3] = pws[gid].i[11]; + + u32x w3[4]; + + w3[0] = pws[gid].i[12]; + w3[1] = pws[gid].i[13]; + w3[2] = pws[gid].i[14]; + w3[3] = pws[gid].i[15]; + + /** + * keyfile + */ + + w0[0] = u8add (w0[0], esalt_bufs[salt_pos].keyfile_buf[ 0]); + w0[1] = u8add (w0[1], esalt_bufs[salt_pos].keyfile_buf[ 1]); + w0[2] = u8add (w0[2], esalt_bufs[salt_pos].keyfile_buf[ 2]); + w0[3] = u8add (w0[3], esalt_bufs[salt_pos].keyfile_buf[ 3]); + w1[0] = u8add (w1[0], esalt_bufs[salt_pos].keyfile_buf[ 4]); + w1[1] = u8add (w1[1], esalt_bufs[salt_pos].keyfile_buf[ 5]); + w1[2] = u8add (w1[2], esalt_bufs[salt_pos].keyfile_buf[ 6]); + w1[3] = u8add (w1[3], esalt_bufs[salt_pos].keyfile_buf[ 7]); + w2[0] = u8add (w2[0], esalt_bufs[salt_pos].keyfile_buf[ 8]); + w2[1] = u8add (w2[1], esalt_bufs[salt_pos].keyfile_buf[ 9]); + w2[2] = u8add (w2[2], esalt_bufs[salt_pos].keyfile_buf[10]); + w2[3] = u8add (w2[3], esalt_bufs[salt_pos].keyfile_buf[11]); + w3[0] = u8add (w3[0], esalt_bufs[salt_pos].keyfile_buf[12]); + w3[1] = u8add (w3[1], esalt_bufs[salt_pos].keyfile_buf[13]); + w3[2] = u8add (w3[2], esalt_bufs[salt_pos].keyfile_buf[14]); + w3[3] = u8add (w3[3], esalt_bufs[salt_pos].keyfile_buf[15]); + + /** + * salt + */ + + u32x salt_buf1[16]; + + salt_buf1[ 0] = esalt_bufs[salt_pos].salt_buf[ 0]; + salt_buf1[ 1] = esalt_bufs[salt_pos].salt_buf[ 1]; + salt_buf1[ 2] = esalt_bufs[salt_pos].salt_buf[ 2]; + salt_buf1[ 3] = esalt_bufs[salt_pos].salt_buf[ 3]; + salt_buf1[ 4] = esalt_bufs[salt_pos].salt_buf[ 4]; + salt_buf1[ 5] = esalt_bufs[salt_pos].salt_buf[ 5]; + salt_buf1[ 6] = esalt_bufs[salt_pos].salt_buf[ 6]; + salt_buf1[ 7] = esalt_bufs[salt_pos].salt_buf[ 7]; + salt_buf1[ 8] = esalt_bufs[salt_pos].salt_buf[ 8]; + salt_buf1[ 9] = esalt_bufs[salt_pos].salt_buf[ 9]; + salt_buf1[10] = esalt_bufs[salt_pos].salt_buf[10]; + salt_buf1[11] = esalt_bufs[salt_pos].salt_buf[11]; + salt_buf1[12] = esalt_bufs[salt_pos].salt_buf[12]; + salt_buf1[13] = esalt_bufs[salt_pos].salt_buf[13]; + salt_buf1[14] = esalt_bufs[salt_pos].salt_buf[14]; + salt_buf1[15] = esalt_bufs[salt_pos].salt_buf[15]; + + u32x salt_buf2[16]; + + salt_buf2[ 0] = 0; + salt_buf2[ 1] = 0x80; + salt_buf2[ 2] = 0; + salt_buf2[ 3] = 0; + salt_buf2[ 4] = 0; + salt_buf2[ 5] = 0; + salt_buf2[ 6] = 0; + salt_buf2[ 7] = 0; + salt_buf2[ 8] = 0; + salt_buf2[ 9] = 0; + salt_buf2[10] = 0; + salt_buf2[11] = 0; + salt_buf2[12] = 0; + salt_buf2[13] = 0; + salt_buf2[14] = (64 + 64 + 4) * 8; + salt_buf2[15] = 0; + + const u32 truecrypt_mdlen = salt_bufs[0].truecrypt_mdlen; + + u32x w[16]; + + w[ 0] = w0[0]; + w[ 1] = w0[1]; + w[ 2] = w0[2]; + w[ 3] = w0[3]; + w[ 4] = w1[0]; + w[ 5] = w1[1]; + w[ 6] = w1[2]; + w[ 7] = w1[3]; + w[ 8] = w2[0]; + w[ 9] = w2[1]; + w[10] = w2[2]; + w[11] = w2[3]; + w[12] = w3[0]; + w[13] = w3[1]; + w[14] = w3[2]; + w[15] = w3[3]; + + u32x ipad[5]; + u32x opad[5]; + + hmac_init (w, ipad, opad); + + tmps[gid].ipad[0] = ipad[0]; + tmps[gid].ipad[1] = ipad[1]; + tmps[gid].ipad[2] = ipad[2]; + tmps[gid].ipad[3] = ipad[3]; + tmps[gid].ipad[4] = ipad[4]; + + tmps[gid].opad[0] = opad[0]; + tmps[gid].opad[1] = opad[1]; + tmps[gid].opad[2] = opad[2]; + tmps[gid].opad[3] = opad[3]; + tmps[gid].opad[4] = opad[4]; + + for (u32 i = 0, j = 1; i < (truecrypt_mdlen / 8 / 4); i += 5, j += 1) + { + salt_buf2[0] = swap_workaround (j); + + u32x dgst[5]; + + hmac_run2 (salt_buf1, salt_buf2, ipad, opad, dgst); + + tmps[gid].dgst[i + 0] = dgst[0]; + tmps[gid].dgst[i + 1] = dgst[1]; + tmps[gid].dgst[i + 2] = dgst[2]; + tmps[gid].dgst[i + 3] = dgst[3]; + tmps[gid].dgst[i + 4] = dgst[4]; + + tmps[gid].out[i + 0] = dgst[0]; + tmps[gid].out[i + 1] = dgst[1]; + tmps[gid].out[i + 2] = dgst[2]; + tmps[gid].out[i + 3] = dgst[3]; + tmps[gid].out[i + 4] = dgst[4]; + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m06211_loop (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, tc_tmp_t *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const tc_t *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + const u32 truecrypt_mdlen = salt_bufs[0].truecrypt_mdlen; + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x ipad[5]; + u32x opad[5]; + + ipad[0] = tmps[gid].ipad[0]; + ipad[1] = tmps[gid].ipad[1]; + ipad[2] = tmps[gid].ipad[2]; + ipad[3] = tmps[gid].ipad[3]; + ipad[4] = tmps[gid].ipad[4]; + + opad[0] = tmps[gid].opad[0]; + opad[1] = tmps[gid].opad[1]; + opad[2] = tmps[gid].opad[2]; + opad[3] = tmps[gid].opad[3]; + opad[4] = tmps[gid].opad[4]; + + for (u32 i = 0; i < (truecrypt_mdlen / 8 / 4); i += 5) + { + u32x dgst[5]; + u32x out[5]; + + dgst[0] = tmps[gid].dgst[i + 0]; + dgst[1] = tmps[gid].dgst[i + 1]; + dgst[2] = tmps[gid].dgst[i + 2]; + dgst[3] = tmps[gid].dgst[i + 3]; + dgst[4] = tmps[gid].dgst[i + 4]; + + out[0] = tmps[gid].out[i + 0]; + out[1] = tmps[gid].out[i + 1]; + out[2] = tmps[gid].out[i + 2]; + out[3] = tmps[gid].out[i + 3]; + out[4] = tmps[gid].out[i + 4]; + + for (u32 j = 0; j < loop_cnt; j++) + { + u32x w[16]; + + w[ 0] = dgst[0]; + w[ 1] = dgst[1]; + w[ 2] = dgst[2]; + w[ 3] = dgst[3]; + w[ 4] = dgst[4]; + w[ 5] = 0x80; + w[ 6] = 0; + w[ 7] = 0; + w[ 8] = 0; + w[ 9] = 0; + w[10] = 0; + w[11] = 0; + w[12] = 0; + w[13] = 0; + w[14] = (64 + 20) * 8; + w[15] = 0; + + hmac_run (w, ipad, opad, dgst); + + out[0] ^= dgst[0]; + out[1] ^= dgst[1]; + out[2] ^= dgst[2]; + out[3] ^= dgst[3]; + out[4] ^= dgst[4]; + } + + tmps[gid].dgst[i + 0] = dgst[0]; + tmps[gid].dgst[i + 1] = dgst[1]; + tmps[gid].dgst[i + 2] = dgst[2]; + tmps[gid].dgst[i + 3] = dgst[3]; + tmps[gid].dgst[i + 4] = dgst[4]; + + tmps[gid].out[i + 0] = out[0]; + tmps[gid].out[i + 1] = out[1]; + tmps[gid].out[i + 2] = out[2]; + tmps[gid].out[i + 3] = out[3]; + tmps[gid].out[i + 4] = out[4]; + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m06211_comp (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, tc_tmp_t *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const tc_t *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + const u32 lid = threadIdx.x; + + if (gid >= gid_max) return; + + u32 ukey1[8]; + + ukey1[0] = tmps[gid].out[ 0]; + ukey1[1] = tmps[gid].out[ 1]; + ukey1[2] = tmps[gid].out[ 2]; + ukey1[3] = tmps[gid].out[ 3]; + ukey1[4] = tmps[gid].out[ 4]; + ukey1[5] = tmps[gid].out[ 5]; + ukey1[6] = tmps[gid].out[ 6]; + ukey1[7] = tmps[gid].out[ 7]; + + u32 ukey2[8]; + + ukey2[0] = tmps[gid].out[ 8]; + ukey2[1] = tmps[gid].out[ 9]; + ukey2[2] = tmps[gid].out[10]; + ukey2[3] = tmps[gid].out[11]; + ukey2[4] = tmps[gid].out[12]; + ukey2[5] = tmps[gid].out[13]; + ukey2[6] = tmps[gid].out[14]; + ukey2[7] = tmps[gid].out[15]; + + u32 data[4]; + + data[0] = esalt_bufs[0].data_buf[0]; + data[1] = esalt_bufs[0].data_buf[1]; + data[2] = esalt_bufs[0].data_buf[2]; + data[3] = esalt_bufs[0].data_buf[3]; + + u32 tmp[4]; + + { + tmp[0] = data[0]; + tmp[1] = data[1]; + tmp[2] = data[2]; + tmp[3] = data[3]; + + aes256_decrypt_xts (ukey1, ukey2, tmp, tmp); + + if (((tmp[0] == 0x45555254) && (tmp[3] == 0)) || ((tmp[0] == 0x45555254) && ((tmp[1] >> 16) <= 5))) + { + mark_hash_s0 (plains_buf, hashes_shown, 0, gid, 0); + + d_return_buf[lid] = 1; + } + } + + { + tmp[0] = data[0]; + tmp[1] = data[1]; + tmp[2] = data[2]; + tmp[3] = data[3]; + + serpent256_decrypt_xts (ukey1, ukey2, tmp, tmp); + + if (((tmp[0] == 0x45555254) && (tmp[3] == 0)) || ((tmp[0] == 0x45555254) && ((tmp[1] >> 16) <= 5))) + { + mark_hash_s0 (plains_buf, hashes_shown, 0, gid, 0); + + d_return_buf[lid] = 1; + } + } + + { + tmp[0] = data[0]; + tmp[1] = data[1]; + tmp[2] = data[2]; + tmp[3] = data[3]; + + twofish256_decrypt_xts (ukey1, ukey2, tmp, tmp); + + if (((tmp[0] == 0x45555254) && (tmp[3] == 0)) || ((tmp[0] == 0x45555254) && ((tmp[1] >> 16) <= 5))) + { + mark_hash_s0 (plains_buf, hashes_shown, 0, gid, 0); + + d_return_buf[lid] = 1; + } + } +} diff --git a/nv/m06212.cu b/nv/m06212.cu new file mode 100644 index 0000000000..48f6eb5f1a --- /dev/null +++ b/nv/m06212.cu @@ -0,0 +1,790 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _RIPEMD160_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW2 +#define VECT_SIZE1 +#endif + +#define DGST_R0 0 +#define DGST_R1 1 +#define DGST_R2 2 +#define DGST_R3 3 + +#include "include/kernel_functions.c" +#include "types_nv.c" +#include "common_nv.c" + +#include "gpu_aes256_nv.c" +#include "gpu_twofish256_nv.c" +#include "gpu_serpent256_nv.c" + +__device__ static void ripemd160_transform (const u32x w[16], u32x dgst[5]) +{ + u32x a1 = dgst[0]; + u32x b1 = dgst[1]; + u32x c1 = dgst[2]; + u32x d1 = dgst[3]; + u32x e1 = dgst[4]; + + RIPEMD160_STEP (RIPEMD160_F , a1, b1, c1, d1, e1, w[ 0], RIPEMD160C00, RIPEMD160S00); + RIPEMD160_STEP (RIPEMD160_F , e1, a1, b1, c1, d1, w[ 1], RIPEMD160C00, RIPEMD160S01); + RIPEMD160_STEP (RIPEMD160_F , d1, e1, a1, b1, c1, w[ 2], RIPEMD160C00, RIPEMD160S02); + RIPEMD160_STEP (RIPEMD160_F , c1, d1, e1, a1, b1, w[ 3], RIPEMD160C00, RIPEMD160S03); + RIPEMD160_STEP (RIPEMD160_F , b1, c1, d1, e1, a1, w[ 4], RIPEMD160C00, RIPEMD160S04); + RIPEMD160_STEP (RIPEMD160_F , a1, b1, c1, d1, e1, w[ 5], RIPEMD160C00, RIPEMD160S05); + RIPEMD160_STEP (RIPEMD160_F , e1, a1, b1, c1, d1, w[ 6], RIPEMD160C00, RIPEMD160S06); + RIPEMD160_STEP (RIPEMD160_F , d1, e1, a1, b1, c1, w[ 7], RIPEMD160C00, RIPEMD160S07); + RIPEMD160_STEP (RIPEMD160_F , c1, d1, e1, a1, b1, w[ 8], RIPEMD160C00, RIPEMD160S08); + RIPEMD160_STEP (RIPEMD160_F , b1, c1, d1, e1, a1, w[ 9], RIPEMD160C00, RIPEMD160S09); + RIPEMD160_STEP (RIPEMD160_F , a1, b1, c1, d1, e1, w[10], RIPEMD160C00, RIPEMD160S0A); + RIPEMD160_STEP (RIPEMD160_F , e1, a1, b1, c1, d1, w[11], RIPEMD160C00, RIPEMD160S0B); + RIPEMD160_STEP (RIPEMD160_F , d1, e1, a1, b1, c1, w[12], RIPEMD160C00, RIPEMD160S0C); + RIPEMD160_STEP (RIPEMD160_F , c1, d1, e1, a1, b1, w[13], RIPEMD160C00, RIPEMD160S0D); + RIPEMD160_STEP (RIPEMD160_F , b1, c1, d1, e1, a1, w[14], RIPEMD160C00, RIPEMD160S0E); + RIPEMD160_STEP (RIPEMD160_F , a1, b1, c1, d1, e1, w[15], RIPEMD160C00, RIPEMD160S0F); + + RIPEMD160_STEP (RIPEMD160_Go, e1, a1, b1, c1, d1, w[ 7], RIPEMD160C10, RIPEMD160S10); + RIPEMD160_STEP (RIPEMD160_Go, d1, e1, a1, b1, c1, w[ 4], RIPEMD160C10, RIPEMD160S11); + RIPEMD160_STEP (RIPEMD160_Go, c1, d1, e1, a1, b1, w[13], RIPEMD160C10, RIPEMD160S12); + RIPEMD160_STEP (RIPEMD160_Go, b1, c1, d1, e1, a1, w[ 1], RIPEMD160C10, RIPEMD160S13); + RIPEMD160_STEP (RIPEMD160_Go, a1, b1, c1, d1, e1, w[10], RIPEMD160C10, RIPEMD160S14); + RIPEMD160_STEP (RIPEMD160_Go, e1, a1, b1, c1, d1, w[ 6], RIPEMD160C10, RIPEMD160S15); + RIPEMD160_STEP (RIPEMD160_Go, d1, e1, a1, b1, c1, w[15], RIPEMD160C10, RIPEMD160S16); + RIPEMD160_STEP (RIPEMD160_Go, c1, d1, e1, a1, b1, w[ 3], RIPEMD160C10, RIPEMD160S17); + RIPEMD160_STEP (RIPEMD160_Go, b1, c1, d1, e1, a1, w[12], RIPEMD160C10, RIPEMD160S18); + RIPEMD160_STEP (RIPEMD160_Go, a1, b1, c1, d1, e1, w[ 0], RIPEMD160C10, RIPEMD160S19); + RIPEMD160_STEP (RIPEMD160_Go, e1, a1, b1, c1, d1, w[ 9], RIPEMD160C10, RIPEMD160S1A); + RIPEMD160_STEP (RIPEMD160_Go, d1, e1, a1, b1, c1, w[ 5], RIPEMD160C10, RIPEMD160S1B); + RIPEMD160_STEP (RIPEMD160_Go, c1, d1, e1, a1, b1, w[ 2], RIPEMD160C10, RIPEMD160S1C); + RIPEMD160_STEP (RIPEMD160_Go, b1, c1, d1, e1, a1, w[14], RIPEMD160C10, RIPEMD160S1D); + RIPEMD160_STEP (RIPEMD160_Go, a1, b1, c1, d1, e1, w[11], RIPEMD160C10, RIPEMD160S1E); + RIPEMD160_STEP (RIPEMD160_Go, e1, a1, b1, c1, d1, w[ 8], RIPEMD160C10, RIPEMD160S1F); + + RIPEMD160_STEP (RIPEMD160_H , d1, e1, a1, b1, c1, w[ 3], RIPEMD160C20, RIPEMD160S20); + RIPEMD160_STEP (RIPEMD160_H , c1, d1, e1, a1, b1, w[10], RIPEMD160C20, RIPEMD160S21); + RIPEMD160_STEP (RIPEMD160_H , b1, c1, d1, e1, a1, w[14], RIPEMD160C20, RIPEMD160S22); + RIPEMD160_STEP (RIPEMD160_H , a1, b1, c1, d1, e1, w[ 4], RIPEMD160C20, RIPEMD160S23); + RIPEMD160_STEP (RIPEMD160_H , e1, a1, b1, c1, d1, w[ 9], RIPEMD160C20, RIPEMD160S24); + RIPEMD160_STEP (RIPEMD160_H , d1, e1, a1, b1, c1, w[15], RIPEMD160C20, RIPEMD160S25); + RIPEMD160_STEP (RIPEMD160_H , c1, d1, e1, a1, b1, w[ 8], RIPEMD160C20, RIPEMD160S26); + RIPEMD160_STEP (RIPEMD160_H , b1, c1, d1, e1, a1, w[ 1], RIPEMD160C20, RIPEMD160S27); + RIPEMD160_STEP (RIPEMD160_H , a1, b1, c1, d1, e1, w[ 2], RIPEMD160C20, RIPEMD160S28); + RIPEMD160_STEP (RIPEMD160_H , e1, a1, b1, c1, d1, w[ 7], RIPEMD160C20, RIPEMD160S29); + RIPEMD160_STEP (RIPEMD160_H , d1, e1, a1, b1, c1, w[ 0], RIPEMD160C20, RIPEMD160S2A); + RIPEMD160_STEP (RIPEMD160_H , c1, d1, e1, a1, b1, w[ 6], RIPEMD160C20, RIPEMD160S2B); + RIPEMD160_STEP (RIPEMD160_H , b1, c1, d1, e1, a1, w[13], RIPEMD160C20, RIPEMD160S2C); + RIPEMD160_STEP (RIPEMD160_H , a1, b1, c1, d1, e1, w[11], RIPEMD160C20, RIPEMD160S2D); + RIPEMD160_STEP (RIPEMD160_H , e1, a1, b1, c1, d1, w[ 5], RIPEMD160C20, RIPEMD160S2E); + RIPEMD160_STEP (RIPEMD160_H , d1, e1, a1, b1, c1, w[12], RIPEMD160C20, RIPEMD160S2F); + + RIPEMD160_STEP (RIPEMD160_Io, c1, d1, e1, a1, b1, w[ 1], RIPEMD160C30, RIPEMD160S30); + RIPEMD160_STEP (RIPEMD160_Io, b1, c1, d1, e1, a1, w[ 9], RIPEMD160C30, RIPEMD160S31); + RIPEMD160_STEP (RIPEMD160_Io, a1, b1, c1, d1, e1, w[11], RIPEMD160C30, RIPEMD160S32); + RIPEMD160_STEP (RIPEMD160_Io, e1, a1, b1, c1, d1, w[10], RIPEMD160C30, RIPEMD160S33); + RIPEMD160_STEP (RIPEMD160_Io, d1, e1, a1, b1, c1, w[ 0], RIPEMD160C30, RIPEMD160S34); + RIPEMD160_STEP (RIPEMD160_Io, c1, d1, e1, a1, b1, w[ 8], RIPEMD160C30, RIPEMD160S35); + RIPEMD160_STEP (RIPEMD160_Io, b1, c1, d1, e1, a1, w[12], RIPEMD160C30, RIPEMD160S36); + RIPEMD160_STEP (RIPEMD160_Io, a1, b1, c1, d1, e1, w[ 4], RIPEMD160C30, RIPEMD160S37); + RIPEMD160_STEP (RIPEMD160_Io, e1, a1, b1, c1, d1, w[13], RIPEMD160C30, RIPEMD160S38); + RIPEMD160_STEP (RIPEMD160_Io, d1, e1, a1, b1, c1, w[ 3], RIPEMD160C30, RIPEMD160S39); + RIPEMD160_STEP (RIPEMD160_Io, c1, d1, e1, a1, b1, w[ 7], RIPEMD160C30, RIPEMD160S3A); + RIPEMD160_STEP (RIPEMD160_Io, b1, c1, d1, e1, a1, w[15], RIPEMD160C30, RIPEMD160S3B); + RIPEMD160_STEP (RIPEMD160_Io, a1, b1, c1, d1, e1, w[14], RIPEMD160C30, RIPEMD160S3C); + RIPEMD160_STEP (RIPEMD160_Io, e1, a1, b1, c1, d1, w[ 5], RIPEMD160C30, RIPEMD160S3D); + RIPEMD160_STEP (RIPEMD160_Io, d1, e1, a1, b1, c1, w[ 6], RIPEMD160C30, RIPEMD160S3E); + RIPEMD160_STEP (RIPEMD160_Io, c1, d1, e1, a1, b1, w[ 2], RIPEMD160C30, RIPEMD160S3F); + + RIPEMD160_STEP (RIPEMD160_J , b1, c1, d1, e1, a1, w[ 4], RIPEMD160C40, RIPEMD160S40); + RIPEMD160_STEP (RIPEMD160_J , a1, b1, c1, d1, e1, w[ 0], RIPEMD160C40, RIPEMD160S41); + RIPEMD160_STEP (RIPEMD160_J , e1, a1, b1, c1, d1, w[ 5], RIPEMD160C40, RIPEMD160S42); + RIPEMD160_STEP (RIPEMD160_J , d1, e1, a1, b1, c1, w[ 9], RIPEMD160C40, RIPEMD160S43); + RIPEMD160_STEP (RIPEMD160_J , c1, d1, e1, a1, b1, w[ 7], RIPEMD160C40, RIPEMD160S44); + RIPEMD160_STEP (RIPEMD160_J , b1, c1, d1, e1, a1, w[12], RIPEMD160C40, RIPEMD160S45); + RIPEMD160_STEP (RIPEMD160_J , a1, b1, c1, d1, e1, w[ 2], RIPEMD160C40, RIPEMD160S46); + RIPEMD160_STEP (RIPEMD160_J , e1, a1, b1, c1, d1, w[10], RIPEMD160C40, RIPEMD160S47); + RIPEMD160_STEP (RIPEMD160_J , d1, e1, a1, b1, c1, w[14], RIPEMD160C40, RIPEMD160S48); + RIPEMD160_STEP (RIPEMD160_J , c1, d1, e1, a1, b1, w[ 1], RIPEMD160C40, RIPEMD160S49); + RIPEMD160_STEP (RIPEMD160_J , b1, c1, d1, e1, a1, w[ 3], RIPEMD160C40, RIPEMD160S4A); + RIPEMD160_STEP (RIPEMD160_J , a1, b1, c1, d1, e1, w[ 8], RIPEMD160C40, RIPEMD160S4B); + RIPEMD160_STEP (RIPEMD160_J , e1, a1, b1, c1, d1, w[11], RIPEMD160C40, RIPEMD160S4C); + RIPEMD160_STEP (RIPEMD160_J , d1, e1, a1, b1, c1, w[ 6], RIPEMD160C40, RIPEMD160S4D); + RIPEMD160_STEP (RIPEMD160_J , c1, d1, e1, a1, b1, w[15], RIPEMD160C40, RIPEMD160S4E); + RIPEMD160_STEP (RIPEMD160_J , b1, c1, d1, e1, a1, w[13], RIPEMD160C40, RIPEMD160S4F); + + u32x a2 = dgst[0]; + u32x b2 = dgst[1]; + u32x c2 = dgst[2]; + u32x d2 = dgst[3]; + u32x e2 = dgst[4]; + + //RIPEMD160_STEP_WORKAROUND_BUG (RIPEMD160_J , a2, b2, c2, d2, e2, w[ 5], RIPEMD160C50, RIPEMD160S50); + RIPEMD160_STEP (RIPEMD160_J , a2, b2, c2, d2, e2, w[ 5], RIPEMD160C50, RIPEMD160S50); + RIPEMD160_STEP (RIPEMD160_J , e2, a2, b2, c2, d2, w[14], RIPEMD160C50, RIPEMD160S51); + RIPEMD160_STEP (RIPEMD160_J , d2, e2, a2, b2, c2, w[ 7], RIPEMD160C50, RIPEMD160S52); + RIPEMD160_STEP (RIPEMD160_J , c2, d2, e2, a2, b2, w[ 0], RIPEMD160C50, RIPEMD160S53); + RIPEMD160_STEP (RIPEMD160_J , b2, c2, d2, e2, a2, w[ 9], RIPEMD160C50, RIPEMD160S54); + RIPEMD160_STEP (RIPEMD160_J , a2, b2, c2, d2, e2, w[ 2], RIPEMD160C50, RIPEMD160S55); + RIPEMD160_STEP (RIPEMD160_J , e2, a2, b2, c2, d2, w[11], RIPEMD160C50, RIPEMD160S56); + RIPEMD160_STEP (RIPEMD160_J , d2, e2, a2, b2, c2, w[ 4], RIPEMD160C50, RIPEMD160S57); + RIPEMD160_STEP (RIPEMD160_J , c2, d2, e2, a2, b2, w[13], RIPEMD160C50, RIPEMD160S58); + RIPEMD160_STEP (RIPEMD160_J , b2, c2, d2, e2, a2, w[ 6], RIPEMD160C50, RIPEMD160S59); + RIPEMD160_STEP (RIPEMD160_J , a2, b2, c2, d2, e2, w[15], RIPEMD160C50, RIPEMD160S5A); + RIPEMD160_STEP (RIPEMD160_J , e2, a2, b2, c2, d2, w[ 8], RIPEMD160C50, RIPEMD160S5B); + RIPEMD160_STEP (RIPEMD160_J , d2, e2, a2, b2, c2, w[ 1], RIPEMD160C50, RIPEMD160S5C); + RIPEMD160_STEP (RIPEMD160_J , c2, d2, e2, a2, b2, w[10], RIPEMD160C50, RIPEMD160S5D); + RIPEMD160_STEP (RIPEMD160_J , b2, c2, d2, e2, a2, w[ 3], RIPEMD160C50, RIPEMD160S5E); + RIPEMD160_STEP (RIPEMD160_J , a2, b2, c2, d2, e2, w[12], RIPEMD160C50, RIPEMD160S5F); + + RIPEMD160_STEP (RIPEMD160_Io, e2, a2, b2, c2, d2, w[ 6], RIPEMD160C60, RIPEMD160S60); + RIPEMD160_STEP (RIPEMD160_Io, d2, e2, a2, b2, c2, w[11], RIPEMD160C60, RIPEMD160S61); + RIPEMD160_STEP (RIPEMD160_Io, c2, d2, e2, a2, b2, w[ 3], RIPEMD160C60, RIPEMD160S62); + RIPEMD160_STEP (RIPEMD160_Io, b2, c2, d2, e2, a2, w[ 7], RIPEMD160C60, RIPEMD160S63); + RIPEMD160_STEP (RIPEMD160_Io, a2, b2, c2, d2, e2, w[ 0], RIPEMD160C60, RIPEMD160S64); + RIPEMD160_STEP (RIPEMD160_Io, e2, a2, b2, c2, d2, w[13], RIPEMD160C60, RIPEMD160S65); + RIPEMD160_STEP (RIPEMD160_Io, d2, e2, a2, b2, c2, w[ 5], RIPEMD160C60, RIPEMD160S66); + RIPEMD160_STEP (RIPEMD160_Io, c2, d2, e2, a2, b2, w[10], RIPEMD160C60, RIPEMD160S67); + RIPEMD160_STEP (RIPEMD160_Io, b2, c2, d2, e2, a2, w[14], RIPEMD160C60, RIPEMD160S68); + RIPEMD160_STEP (RIPEMD160_Io, a2, b2, c2, d2, e2, w[15], RIPEMD160C60, RIPEMD160S69); + RIPEMD160_STEP (RIPEMD160_Io, e2, a2, b2, c2, d2, w[ 8], RIPEMD160C60, RIPEMD160S6A); + RIPEMD160_STEP (RIPEMD160_Io, d2, e2, a2, b2, c2, w[12], RIPEMD160C60, RIPEMD160S6B); + RIPEMD160_STEP (RIPEMD160_Io, c2, d2, e2, a2, b2, w[ 4], RIPEMD160C60, RIPEMD160S6C); + RIPEMD160_STEP (RIPEMD160_Io, b2, c2, d2, e2, a2, w[ 9], RIPEMD160C60, RIPEMD160S6D); + RIPEMD160_STEP (RIPEMD160_Io, a2, b2, c2, d2, e2, w[ 1], RIPEMD160C60, RIPEMD160S6E); + RIPEMD160_STEP (RIPEMD160_Io, e2, a2, b2, c2, d2, w[ 2], RIPEMD160C60, RIPEMD160S6F); + + RIPEMD160_STEP (RIPEMD160_H , d2, e2, a2, b2, c2, w[15], RIPEMD160C70, RIPEMD160S70); + RIPEMD160_STEP (RIPEMD160_H , c2, d2, e2, a2, b2, w[ 5], RIPEMD160C70, RIPEMD160S71); + RIPEMD160_STEP (RIPEMD160_H , b2, c2, d2, e2, a2, w[ 1], RIPEMD160C70, RIPEMD160S72); + RIPEMD160_STEP (RIPEMD160_H , a2, b2, c2, d2, e2, w[ 3], RIPEMD160C70, RIPEMD160S73); + RIPEMD160_STEP (RIPEMD160_H , e2, a2, b2, c2, d2, w[ 7], RIPEMD160C70, RIPEMD160S74); + RIPEMD160_STEP (RIPEMD160_H , d2, e2, a2, b2, c2, w[14], RIPEMD160C70, RIPEMD160S75); + RIPEMD160_STEP (RIPEMD160_H , c2, d2, e2, a2, b2, w[ 6], RIPEMD160C70, RIPEMD160S76); + RIPEMD160_STEP (RIPEMD160_H , b2, c2, d2, e2, a2, w[ 9], RIPEMD160C70, RIPEMD160S77); + RIPEMD160_STEP (RIPEMD160_H , a2, b2, c2, d2, e2, w[11], RIPEMD160C70, RIPEMD160S78); + RIPEMD160_STEP (RIPEMD160_H , e2, a2, b2, c2, d2, w[ 8], RIPEMD160C70, RIPEMD160S79); + RIPEMD160_STEP (RIPEMD160_H , d2, e2, a2, b2, c2, w[12], RIPEMD160C70, RIPEMD160S7A); + RIPEMD160_STEP (RIPEMD160_H , c2, d2, e2, a2, b2, w[ 2], RIPEMD160C70, RIPEMD160S7B); + RIPEMD160_STEP (RIPEMD160_H , b2, c2, d2, e2, a2, w[10], RIPEMD160C70, RIPEMD160S7C); + RIPEMD160_STEP (RIPEMD160_H , a2, b2, c2, d2, e2, w[ 0], RIPEMD160C70, RIPEMD160S7D); + RIPEMD160_STEP (RIPEMD160_H , e2, a2, b2, c2, d2, w[ 4], RIPEMD160C70, RIPEMD160S7E); + RIPEMD160_STEP (RIPEMD160_H , d2, e2, a2, b2, c2, w[13], RIPEMD160C70, RIPEMD160S7F); + + RIPEMD160_STEP (RIPEMD160_Go, c2, d2, e2, a2, b2, w[ 8], RIPEMD160C80, RIPEMD160S80); + RIPEMD160_STEP (RIPEMD160_Go, b2, c2, d2, e2, a2, w[ 6], RIPEMD160C80, RIPEMD160S81); + RIPEMD160_STEP (RIPEMD160_Go, a2, b2, c2, d2, e2, w[ 4], RIPEMD160C80, RIPEMD160S82); + RIPEMD160_STEP (RIPEMD160_Go, e2, a2, b2, c2, d2, w[ 1], RIPEMD160C80, RIPEMD160S83); + RIPEMD160_STEP (RIPEMD160_Go, d2, e2, a2, b2, c2, w[ 3], RIPEMD160C80, RIPEMD160S84); + RIPEMD160_STEP (RIPEMD160_Go, c2, d2, e2, a2, b2, w[11], RIPEMD160C80, RIPEMD160S85); + RIPEMD160_STEP (RIPEMD160_Go, b2, c2, d2, e2, a2, w[15], RIPEMD160C80, RIPEMD160S86); + RIPEMD160_STEP (RIPEMD160_Go, a2, b2, c2, d2, e2, w[ 0], RIPEMD160C80, RIPEMD160S87); + RIPEMD160_STEP (RIPEMD160_Go, e2, a2, b2, c2, d2, w[ 5], RIPEMD160C80, RIPEMD160S88); + RIPEMD160_STEP (RIPEMD160_Go, d2, e2, a2, b2, c2, w[12], RIPEMD160C80, RIPEMD160S89); + RIPEMD160_STEP (RIPEMD160_Go, c2, d2, e2, a2, b2, w[ 2], RIPEMD160C80, RIPEMD160S8A); + RIPEMD160_STEP (RIPEMD160_Go, b2, c2, d2, e2, a2, w[13], RIPEMD160C80, RIPEMD160S8B); + RIPEMD160_STEP (RIPEMD160_Go, a2, b2, c2, d2, e2, w[ 9], RIPEMD160C80, RIPEMD160S8C); + RIPEMD160_STEP (RIPEMD160_Go, e2, a2, b2, c2, d2, w[ 7], RIPEMD160C80, RIPEMD160S8D); + RIPEMD160_STEP (RIPEMD160_Go, d2, e2, a2, b2, c2, w[10], RIPEMD160C80, RIPEMD160S8E); + RIPEMD160_STEP (RIPEMD160_Go, c2, d2, e2, a2, b2, w[14], RIPEMD160C80, RIPEMD160S8F); + + RIPEMD160_STEP (RIPEMD160_F , b2, c2, d2, e2, a2, w[12], RIPEMD160C90, RIPEMD160S90); + RIPEMD160_STEP (RIPEMD160_F , a2, b2, c2, d2, e2, w[15], RIPEMD160C90, RIPEMD160S91); + RIPEMD160_STEP (RIPEMD160_F , e2, a2, b2, c2, d2, w[10], RIPEMD160C90, RIPEMD160S92); + RIPEMD160_STEP (RIPEMD160_F , d2, e2, a2, b2, c2, w[ 4], RIPEMD160C90, RIPEMD160S93); + RIPEMD160_STEP (RIPEMD160_F , c2, d2, e2, a2, b2, w[ 1], RIPEMD160C90, RIPEMD160S94); + RIPEMD160_STEP (RIPEMD160_F , b2, c2, d2, e2, a2, w[ 5], RIPEMD160C90, RIPEMD160S95); + RIPEMD160_STEP (RIPEMD160_F , a2, b2, c2, d2, e2, w[ 8], RIPEMD160C90, RIPEMD160S96); + RIPEMD160_STEP (RIPEMD160_F , e2, a2, b2, c2, d2, w[ 7], RIPEMD160C90, RIPEMD160S97); + RIPEMD160_STEP (RIPEMD160_F , d2, e2, a2, b2, c2, w[ 6], RIPEMD160C90, RIPEMD160S98); + RIPEMD160_STEP (RIPEMD160_F , c2, d2, e2, a2, b2, w[ 2], RIPEMD160C90, RIPEMD160S99); + RIPEMD160_STEP (RIPEMD160_F , b2, c2, d2, e2, a2, w[13], RIPEMD160C90, RIPEMD160S9A); + RIPEMD160_STEP (RIPEMD160_F , a2, b2, c2, d2, e2, w[14], RIPEMD160C90, RIPEMD160S9B); + RIPEMD160_STEP (RIPEMD160_F , e2, a2, b2, c2, d2, w[ 0], RIPEMD160C90, RIPEMD160S9C); + RIPEMD160_STEP (RIPEMD160_F , d2, e2, a2, b2, c2, w[ 3], RIPEMD160C90, RIPEMD160S9D); + RIPEMD160_STEP (RIPEMD160_F , c2, d2, e2, a2, b2, w[ 9], RIPEMD160C90, RIPEMD160S9E); + RIPEMD160_STEP (RIPEMD160_F , b2, c2, d2, e2, a2, w[11], RIPEMD160C90, RIPEMD160S9F); + + const u32x a = dgst[1] + c1 + d2; + const u32x b = dgst[2] + d1 + e2; + const u32x c = dgst[3] + e1 + a2; + const u32x d = dgst[4] + a1 + b2; + const u32x e = dgst[0] + b1 + c2; + + dgst[0] = a; + dgst[1] = b; + dgst[2] = c; + dgst[3] = d; + dgst[4] = e; +} + +__device__ static void hmac_run2 (const u32x w1[16], const u32x w2[16], const u32x ipad[5], const u32x opad[5], u32x dgst[5]) +{ + dgst[0] = ipad[0]; + dgst[1] = ipad[1]; + dgst[2] = ipad[2]; + dgst[3] = ipad[3]; + dgst[4] = ipad[4]; + + ripemd160_transform (w1, dgst); + ripemd160_transform (w2, dgst); + + u32x w[16]; + + w[ 0] = dgst[0]; + w[ 1] = dgst[1]; + w[ 2] = dgst[2]; + w[ 3] = dgst[3]; + w[ 4] = dgst[4]; + w[ 5] = 0x80; + w[ 6] = 0; + w[ 7] = 0; + w[ 8] = 0; + w[ 9] = 0; + w[10] = 0; + w[11] = 0; + w[12] = 0; + w[13] = 0; + w[14] = (64 + 20) * 8; + w[15] = 0; + + dgst[0] = opad[0]; + dgst[1] = opad[1]; + dgst[2] = opad[2]; + dgst[3] = opad[3]; + dgst[4] = opad[4]; + + ripemd160_transform (w, dgst); +} + +__device__ static void hmac_run (u32x w[16], const u32x ipad[5], const u32x opad[5], u32x dgst[5]) +{ + dgst[0] = ipad[0]; + dgst[1] = ipad[1]; + dgst[2] = ipad[2]; + dgst[3] = ipad[3]; + dgst[4] = ipad[4]; + + ripemd160_transform (w, dgst); + + w[ 0] = dgst[0]; + w[ 1] = dgst[1]; + w[ 2] = dgst[2]; + w[ 3] = dgst[3]; + w[ 4] = dgst[4]; + w[ 5] = 0x80; + w[ 6] = 0; + w[ 7] = 0; + w[ 8] = 0; + w[ 9] = 0; + w[10] = 0; + w[11] = 0; + w[12] = 0; + w[13] = 0; + w[14] = (64 + 20) * 8; + w[15] = 0; + + dgst[0] = opad[0]; + dgst[1] = opad[1]; + dgst[2] = opad[2]; + dgst[3] = opad[3]; + dgst[4] = opad[4]; + + ripemd160_transform (w, dgst); +} + +__device__ static void hmac_init (u32x w[16], u32x ipad[5], u32x opad[5]) +{ + w[ 0] ^= 0x36363636; + w[ 1] ^= 0x36363636; + w[ 2] ^= 0x36363636; + w[ 3] ^= 0x36363636; + w[ 4] ^= 0x36363636; + w[ 5] ^= 0x36363636; + w[ 6] ^= 0x36363636; + w[ 7] ^= 0x36363636; + w[ 8] ^= 0x36363636; + w[ 9] ^= 0x36363636; + w[10] ^= 0x36363636; + w[11] ^= 0x36363636; + w[12] ^= 0x36363636; + w[13] ^= 0x36363636; + w[14] ^= 0x36363636; + w[15] ^= 0x36363636; + + ipad[0] = RIPEMD160M_A; + ipad[1] = RIPEMD160M_B; + ipad[2] = RIPEMD160M_C; + ipad[3] = RIPEMD160M_D; + ipad[4] = RIPEMD160M_E; + + ripemd160_transform (w, ipad); + + w[ 0] ^= 0x6a6a6a6a; + w[ 1] ^= 0x6a6a6a6a; + w[ 2] ^= 0x6a6a6a6a; + w[ 3] ^= 0x6a6a6a6a; + w[ 4] ^= 0x6a6a6a6a; + w[ 5] ^= 0x6a6a6a6a; + w[ 6] ^= 0x6a6a6a6a; + w[ 7] ^= 0x6a6a6a6a; + w[ 8] ^= 0x6a6a6a6a; + w[ 9] ^= 0x6a6a6a6a; + w[10] ^= 0x6a6a6a6a; + w[11] ^= 0x6a6a6a6a; + w[12] ^= 0x6a6a6a6a; + w[13] ^= 0x6a6a6a6a; + w[14] ^= 0x6a6a6a6a; + w[15] ^= 0x6a6a6a6a; + + opad[0] = RIPEMD160M_A; + opad[1] = RIPEMD160M_B; + opad[2] = RIPEMD160M_C; + opad[3] = RIPEMD160M_D; + opad[4] = RIPEMD160M_E; + + ripemd160_transform (w, opad); +} + +__device__ static u32 u8add (const u32 a, const u32 b) +{ + const u32 a1 = (a >> 0) & 0xff; + const u32 a2 = (a >> 8) & 0xff; + const u32 a3 = (a >> 16) & 0xff; + const u32 a4 = (a >> 24) & 0xff; + + const u32 b1 = (b >> 0) & 0xff; + const u32 b2 = (b >> 8) & 0xff; + const u32 b3 = (b >> 16) & 0xff; + const u32 b4 = (b >> 24) & 0xff; + + const u32 r1 = (a1 + b1) & 0xff; + const u32 r2 = (a2 + b2) & 0xff; + const u32 r3 = (a3 + b3) & 0xff; + const u32 r4 = (a4 + b4) & 0xff; + + const u32 r = r1 << 0 + | r2 << 8 + | r3 << 16 + | r4 << 24; + + return r; +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m06212_init (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, tc_tmp_t *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const tc_t *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = pws[gid].i[ 8]; + w2[1] = pws[gid].i[ 9]; + w2[2] = pws[gid].i[10]; + w2[3] = pws[gid].i[11]; + + u32x w3[4]; + + w3[0] = pws[gid].i[12]; + w3[1] = pws[gid].i[13]; + w3[2] = pws[gid].i[14]; + w3[3] = pws[gid].i[15]; + + /** + * keyfile + */ + + w0[0] = u8add (w0[0], esalt_bufs[salt_pos].keyfile_buf[ 0]); + w0[1] = u8add (w0[1], esalt_bufs[salt_pos].keyfile_buf[ 1]); + w0[2] = u8add (w0[2], esalt_bufs[salt_pos].keyfile_buf[ 2]); + w0[3] = u8add (w0[3], esalt_bufs[salt_pos].keyfile_buf[ 3]); + w1[0] = u8add (w1[0], esalt_bufs[salt_pos].keyfile_buf[ 4]); + w1[1] = u8add (w1[1], esalt_bufs[salt_pos].keyfile_buf[ 5]); + w1[2] = u8add (w1[2], esalt_bufs[salt_pos].keyfile_buf[ 6]); + w1[3] = u8add (w1[3], esalt_bufs[salt_pos].keyfile_buf[ 7]); + w2[0] = u8add (w2[0], esalt_bufs[salt_pos].keyfile_buf[ 8]); + w2[1] = u8add (w2[1], esalt_bufs[salt_pos].keyfile_buf[ 9]); + w2[2] = u8add (w2[2], esalt_bufs[salt_pos].keyfile_buf[10]); + w2[3] = u8add (w2[3], esalt_bufs[salt_pos].keyfile_buf[11]); + w3[0] = u8add (w3[0], esalt_bufs[salt_pos].keyfile_buf[12]); + w3[1] = u8add (w3[1], esalt_bufs[salt_pos].keyfile_buf[13]); + w3[2] = u8add (w3[2], esalt_bufs[salt_pos].keyfile_buf[14]); + w3[3] = u8add (w3[3], esalt_bufs[salt_pos].keyfile_buf[15]); + + /** + * salt + */ + + u32x salt_buf1[16]; + + salt_buf1[ 0] = esalt_bufs[salt_pos].salt_buf[ 0]; + salt_buf1[ 1] = esalt_bufs[salt_pos].salt_buf[ 1]; + salt_buf1[ 2] = esalt_bufs[salt_pos].salt_buf[ 2]; + salt_buf1[ 3] = esalt_bufs[salt_pos].salt_buf[ 3]; + salt_buf1[ 4] = esalt_bufs[salt_pos].salt_buf[ 4]; + salt_buf1[ 5] = esalt_bufs[salt_pos].salt_buf[ 5]; + salt_buf1[ 6] = esalt_bufs[salt_pos].salt_buf[ 6]; + salt_buf1[ 7] = esalt_bufs[salt_pos].salt_buf[ 7]; + salt_buf1[ 8] = esalt_bufs[salt_pos].salt_buf[ 8]; + salt_buf1[ 9] = esalt_bufs[salt_pos].salt_buf[ 9]; + salt_buf1[10] = esalt_bufs[salt_pos].salt_buf[10]; + salt_buf1[11] = esalt_bufs[salt_pos].salt_buf[11]; + salt_buf1[12] = esalt_bufs[salt_pos].salt_buf[12]; + salt_buf1[13] = esalt_bufs[salt_pos].salt_buf[13]; + salt_buf1[14] = esalt_bufs[salt_pos].salt_buf[14]; + salt_buf1[15] = esalt_bufs[salt_pos].salt_buf[15]; + + u32x salt_buf2[16]; + + salt_buf2[ 0] = 0; + salt_buf2[ 1] = 0x80; + salt_buf2[ 2] = 0; + salt_buf2[ 3] = 0; + salt_buf2[ 4] = 0; + salt_buf2[ 5] = 0; + salt_buf2[ 6] = 0; + salt_buf2[ 7] = 0; + salt_buf2[ 8] = 0; + salt_buf2[ 9] = 0; + salt_buf2[10] = 0; + salt_buf2[11] = 0; + salt_buf2[12] = 0; + salt_buf2[13] = 0; + salt_buf2[14] = (64 + 64 + 4) * 8; + salt_buf2[15] = 0; + + const u32 truecrypt_mdlen = salt_bufs[0].truecrypt_mdlen; + + u32x w[16]; + + w[ 0] = w0[0]; + w[ 1] = w0[1]; + w[ 2] = w0[2]; + w[ 3] = w0[3]; + w[ 4] = w1[0]; + w[ 5] = w1[1]; + w[ 6] = w1[2]; + w[ 7] = w1[3]; + w[ 8] = w2[0]; + w[ 9] = w2[1]; + w[10] = w2[2]; + w[11] = w2[3]; + w[12] = w3[0]; + w[13] = w3[1]; + w[14] = w3[2]; + w[15] = w3[3]; + + u32x ipad[5]; + u32x opad[5]; + + hmac_init (w, ipad, opad); + + tmps[gid].ipad[0] = ipad[0]; + tmps[gid].ipad[1] = ipad[1]; + tmps[gid].ipad[2] = ipad[2]; + tmps[gid].ipad[3] = ipad[3]; + tmps[gid].ipad[4] = ipad[4]; + + tmps[gid].opad[0] = opad[0]; + tmps[gid].opad[1] = opad[1]; + tmps[gid].opad[2] = opad[2]; + tmps[gid].opad[3] = opad[3]; + tmps[gid].opad[4] = opad[4]; + + for (u32 i = 0, j = 1; i < (truecrypt_mdlen / 8 / 4); i += 5, j += 1) + { + salt_buf2[0] = swap_workaround (j); + + u32x dgst[5]; + + hmac_run2 (salt_buf1, salt_buf2, ipad, opad, dgst); + + tmps[gid].dgst[i + 0] = dgst[0]; + tmps[gid].dgst[i + 1] = dgst[1]; + tmps[gid].dgst[i + 2] = dgst[2]; + tmps[gid].dgst[i + 3] = dgst[3]; + tmps[gid].dgst[i + 4] = dgst[4]; + + tmps[gid].out[i + 0] = dgst[0]; + tmps[gid].out[i + 1] = dgst[1]; + tmps[gid].out[i + 2] = dgst[2]; + tmps[gid].out[i + 3] = dgst[3]; + tmps[gid].out[i + 4] = dgst[4]; + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m06212_loop (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, tc_tmp_t *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const tc_t *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + const u32 truecrypt_mdlen = salt_bufs[0].truecrypt_mdlen; + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x ipad[5]; + u32x opad[5]; + + ipad[0] = tmps[gid].ipad[0]; + ipad[1] = tmps[gid].ipad[1]; + ipad[2] = tmps[gid].ipad[2]; + ipad[3] = tmps[gid].ipad[3]; + ipad[4] = tmps[gid].ipad[4]; + + opad[0] = tmps[gid].opad[0]; + opad[1] = tmps[gid].opad[1]; + opad[2] = tmps[gid].opad[2]; + opad[3] = tmps[gid].opad[3]; + opad[4] = tmps[gid].opad[4]; + + for (u32 i = 0; i < (truecrypt_mdlen / 8 / 4); i += 5) + { + u32x dgst[5]; + u32x out[5]; + + dgst[0] = tmps[gid].dgst[i + 0]; + dgst[1] = tmps[gid].dgst[i + 1]; + dgst[2] = tmps[gid].dgst[i + 2]; + dgst[3] = tmps[gid].dgst[i + 3]; + dgst[4] = tmps[gid].dgst[i + 4]; + + out[0] = tmps[gid].out[i + 0]; + out[1] = tmps[gid].out[i + 1]; + out[2] = tmps[gid].out[i + 2]; + out[3] = tmps[gid].out[i + 3]; + out[4] = tmps[gid].out[i + 4]; + + for (u32 j = 0; j < loop_cnt; j++) + { + u32x w[16]; + + w[ 0] = dgst[0]; + w[ 1] = dgst[1]; + w[ 2] = dgst[2]; + w[ 3] = dgst[3]; + w[ 4] = dgst[4]; + w[ 5] = 0x80; + w[ 6] = 0; + w[ 7] = 0; + w[ 8] = 0; + w[ 9] = 0; + w[10] = 0; + w[11] = 0; + w[12] = 0; + w[13] = 0; + w[14] = (64 + 20) * 8; + w[15] = 0; + + hmac_run (w, ipad, opad, dgst); + + out[0] ^= dgst[0]; + out[1] ^= dgst[1]; + out[2] ^= dgst[2]; + out[3] ^= dgst[3]; + out[4] ^= dgst[4]; + } + + tmps[gid].dgst[i + 0] = dgst[0]; + tmps[gid].dgst[i + 1] = dgst[1]; + tmps[gid].dgst[i + 2] = dgst[2]; + tmps[gid].dgst[i + 3] = dgst[3]; + tmps[gid].dgst[i + 4] = dgst[4]; + + tmps[gid].out[i + 0] = out[0]; + tmps[gid].out[i + 1] = out[1]; + tmps[gid].out[i + 2] = out[2]; + tmps[gid].out[i + 3] = out[3]; + tmps[gid].out[i + 4] = out[4]; + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m06212_comp (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, tc_tmp_t *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const tc_t *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + const u32 lid = threadIdx.x; + + if (gid >= gid_max) return; + + u32 ukey1[8]; + + ukey1[0] = tmps[gid].out[ 0]; + ukey1[1] = tmps[gid].out[ 1]; + ukey1[2] = tmps[gid].out[ 2]; + ukey1[3] = tmps[gid].out[ 3]; + ukey1[4] = tmps[gid].out[ 4]; + ukey1[5] = tmps[gid].out[ 5]; + ukey1[6] = tmps[gid].out[ 6]; + ukey1[7] = tmps[gid].out[ 7]; + + u32 ukey2[8]; + + ukey2[0] = tmps[gid].out[ 8]; + ukey2[1] = tmps[gid].out[ 9]; + ukey2[2] = tmps[gid].out[10]; + ukey2[3] = tmps[gid].out[11]; + ukey2[4] = tmps[gid].out[12]; + ukey2[5] = tmps[gid].out[13]; + ukey2[6] = tmps[gid].out[14]; + ukey2[7] = tmps[gid].out[15]; + + u32 data[4]; + + data[0] = esalt_bufs[0].data_buf[0]; + data[1] = esalt_bufs[0].data_buf[1]; + data[2] = esalt_bufs[0].data_buf[2]; + data[3] = esalt_bufs[0].data_buf[3]; + + u32 tmp[4]; + + { + tmp[0] = data[0]; + tmp[1] = data[1]; + tmp[2] = data[2]; + tmp[3] = data[3]; + + aes256_decrypt_xts (ukey1, ukey2, tmp, tmp); + + if (((tmp[0] == 0x45555254) && (tmp[3] == 0)) || ((tmp[0] == 0x45555254) && ((tmp[1] >> 16) <= 5))) + { + mark_hash_s0 (plains_buf, hashes_shown, 0, gid, 0); + + d_return_buf[lid] = 1; + } + } + + { + tmp[0] = data[0]; + tmp[1] = data[1]; + tmp[2] = data[2]; + tmp[3] = data[3]; + + serpent256_decrypt_xts (ukey1, ukey2, tmp, tmp); + + if (((tmp[0] == 0x45555254) && (tmp[3] == 0)) || ((tmp[0] == 0x45555254) && ((tmp[1] >> 16) <= 5))) + { + mark_hash_s0 (plains_buf, hashes_shown, 0, gid, 0); + + d_return_buf[lid] = 1; + } + } + + { + tmp[0] = data[0]; + tmp[1] = data[1]; + tmp[2] = data[2]; + tmp[3] = data[3]; + + twofish256_decrypt_xts (ukey1, ukey2, tmp, tmp); + + if (((tmp[0] == 0x45555254) && (tmp[3] == 0)) || ((tmp[0] == 0x45555254) && ((tmp[1] >> 16) <= 5))) + { + mark_hash_s0 (plains_buf, hashes_shown, 0, gid, 0); + + d_return_buf[lid] = 1; + } + } + + u32 ukey3[8]; + + ukey3[0] = tmps[gid].out[16]; + ukey3[1] = tmps[gid].out[17]; + ukey3[2] = tmps[gid].out[18]; + ukey3[3] = tmps[gid].out[19]; + ukey3[4] = tmps[gid].out[20]; + ukey3[5] = tmps[gid].out[21]; + ukey3[6] = tmps[gid].out[22]; + ukey3[7] = tmps[gid].out[23]; + + u32 ukey4[8]; + + ukey4[0] = tmps[gid].out[24]; + ukey4[1] = tmps[gid].out[25]; + ukey4[2] = tmps[gid].out[26]; + ukey4[3] = tmps[gid].out[27]; + ukey4[4] = tmps[gid].out[28]; + ukey4[5] = tmps[gid].out[29]; + ukey4[6] = tmps[gid].out[30]; + ukey4[7] = tmps[gid].out[31]; + + { + tmp[0] = data[0]; + tmp[1] = data[1]; + tmp[2] = data[2]; + tmp[3] = data[3]; + + aes256_decrypt_xts (ukey2, ukey4, tmp, tmp); + twofish256_decrypt_xts (ukey1, ukey3, tmp, tmp); + + if (((tmp[0] == 0x45555254) && (tmp[3] == 0)) || ((tmp[0] == 0x45555254) && ((tmp[1] >> 16) <= 5))) + { + mark_hash_s0 (plains_buf, hashes_shown, 0, gid, 0); + + d_return_buf[lid] = 1; + } + } + + { + tmp[0] = data[0]; + tmp[1] = data[1]; + tmp[2] = data[2]; + tmp[3] = data[3]; + + serpent256_decrypt_xts (ukey2, ukey4, tmp, tmp); + aes256_decrypt_xts (ukey1, ukey3, tmp, tmp); + + if (((tmp[0] == 0x45555254) && (tmp[3] == 0)) || ((tmp[0] == 0x45555254) && ((tmp[1] >> 16) <= 5))) + { + mark_hash_s0 (plains_buf, hashes_shown, 0, gid, 0); + + d_return_buf[lid] = 1; + } + } + + { + tmp[0] = data[0]; + tmp[1] = data[1]; + tmp[2] = data[2]; + tmp[3] = data[3]; + + twofish256_decrypt_xts (ukey2, ukey4, tmp, tmp); + serpent256_decrypt_xts (ukey1, ukey3, tmp, tmp); + + if (((tmp[0] == 0x45555254) && (tmp[3] == 0)) || ((tmp[0] == 0x45555254) && ((tmp[1] >> 16) <= 5))) + { + mark_hash_s0 (plains_buf, hashes_shown, 0, gid, 0); + + d_return_buf[lid] = 1; + } + } +} diff --git a/nv/m06213.cu b/nv/m06213.cu new file mode 100644 index 0000000000..c31f9e24cd --- /dev/null +++ b/nv/m06213.cu @@ -0,0 +1,848 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _RIPEMD160_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW2 +#define VECT_SIZE1 +#endif + +#define DGST_R0 0 +#define DGST_R1 1 +#define DGST_R2 2 +#define DGST_R3 3 + +#include "include/kernel_functions.c" +#include "types_nv.c" +#include "common_nv.c" + +#include "gpu_aes256_nv.c" +#include "gpu_twofish256_nv.c" +#include "gpu_serpent256_nv.c" + +__device__ static void ripemd160_transform (const u32x w[16], u32x dgst[5]) +{ + u32x a1 = dgst[0]; + u32x b1 = dgst[1]; + u32x c1 = dgst[2]; + u32x d1 = dgst[3]; + u32x e1 = dgst[4]; + + RIPEMD160_STEP (RIPEMD160_F , a1, b1, c1, d1, e1, w[ 0], RIPEMD160C00, RIPEMD160S00); + RIPEMD160_STEP (RIPEMD160_F , e1, a1, b1, c1, d1, w[ 1], RIPEMD160C00, RIPEMD160S01); + RIPEMD160_STEP (RIPEMD160_F , d1, e1, a1, b1, c1, w[ 2], RIPEMD160C00, RIPEMD160S02); + RIPEMD160_STEP (RIPEMD160_F , c1, d1, e1, a1, b1, w[ 3], RIPEMD160C00, RIPEMD160S03); + RIPEMD160_STEP (RIPEMD160_F , b1, c1, d1, e1, a1, w[ 4], RIPEMD160C00, RIPEMD160S04); + RIPEMD160_STEP (RIPEMD160_F , a1, b1, c1, d1, e1, w[ 5], RIPEMD160C00, RIPEMD160S05); + RIPEMD160_STEP (RIPEMD160_F , e1, a1, b1, c1, d1, w[ 6], RIPEMD160C00, RIPEMD160S06); + RIPEMD160_STEP (RIPEMD160_F , d1, e1, a1, b1, c1, w[ 7], RIPEMD160C00, RIPEMD160S07); + RIPEMD160_STEP (RIPEMD160_F , c1, d1, e1, a1, b1, w[ 8], RIPEMD160C00, RIPEMD160S08); + RIPEMD160_STEP (RIPEMD160_F , b1, c1, d1, e1, a1, w[ 9], RIPEMD160C00, RIPEMD160S09); + RIPEMD160_STEP (RIPEMD160_F , a1, b1, c1, d1, e1, w[10], RIPEMD160C00, RIPEMD160S0A); + RIPEMD160_STEP (RIPEMD160_F , e1, a1, b1, c1, d1, w[11], RIPEMD160C00, RIPEMD160S0B); + RIPEMD160_STEP (RIPEMD160_F , d1, e1, a1, b1, c1, w[12], RIPEMD160C00, RIPEMD160S0C); + RIPEMD160_STEP (RIPEMD160_F , c1, d1, e1, a1, b1, w[13], RIPEMD160C00, RIPEMD160S0D); + RIPEMD160_STEP (RIPEMD160_F , b1, c1, d1, e1, a1, w[14], RIPEMD160C00, RIPEMD160S0E); + RIPEMD160_STEP (RIPEMD160_F , a1, b1, c1, d1, e1, w[15], RIPEMD160C00, RIPEMD160S0F); + + RIPEMD160_STEP (RIPEMD160_Go, e1, a1, b1, c1, d1, w[ 7], RIPEMD160C10, RIPEMD160S10); + RIPEMD160_STEP (RIPEMD160_Go, d1, e1, a1, b1, c1, w[ 4], RIPEMD160C10, RIPEMD160S11); + RIPEMD160_STEP (RIPEMD160_Go, c1, d1, e1, a1, b1, w[13], RIPEMD160C10, RIPEMD160S12); + RIPEMD160_STEP (RIPEMD160_Go, b1, c1, d1, e1, a1, w[ 1], RIPEMD160C10, RIPEMD160S13); + RIPEMD160_STEP (RIPEMD160_Go, a1, b1, c1, d1, e1, w[10], RIPEMD160C10, RIPEMD160S14); + RIPEMD160_STEP (RIPEMD160_Go, e1, a1, b1, c1, d1, w[ 6], RIPEMD160C10, RIPEMD160S15); + RIPEMD160_STEP (RIPEMD160_Go, d1, e1, a1, b1, c1, w[15], RIPEMD160C10, RIPEMD160S16); + RIPEMD160_STEP (RIPEMD160_Go, c1, d1, e1, a1, b1, w[ 3], RIPEMD160C10, RIPEMD160S17); + RIPEMD160_STEP (RIPEMD160_Go, b1, c1, d1, e1, a1, w[12], RIPEMD160C10, RIPEMD160S18); + RIPEMD160_STEP (RIPEMD160_Go, a1, b1, c1, d1, e1, w[ 0], RIPEMD160C10, RIPEMD160S19); + RIPEMD160_STEP (RIPEMD160_Go, e1, a1, b1, c1, d1, w[ 9], RIPEMD160C10, RIPEMD160S1A); + RIPEMD160_STEP (RIPEMD160_Go, d1, e1, a1, b1, c1, w[ 5], RIPEMD160C10, RIPEMD160S1B); + RIPEMD160_STEP (RIPEMD160_Go, c1, d1, e1, a1, b1, w[ 2], RIPEMD160C10, RIPEMD160S1C); + RIPEMD160_STEP (RIPEMD160_Go, b1, c1, d1, e1, a1, w[14], RIPEMD160C10, RIPEMD160S1D); + RIPEMD160_STEP (RIPEMD160_Go, a1, b1, c1, d1, e1, w[11], RIPEMD160C10, RIPEMD160S1E); + RIPEMD160_STEP (RIPEMD160_Go, e1, a1, b1, c1, d1, w[ 8], RIPEMD160C10, RIPEMD160S1F); + + RIPEMD160_STEP (RIPEMD160_H , d1, e1, a1, b1, c1, w[ 3], RIPEMD160C20, RIPEMD160S20); + RIPEMD160_STEP (RIPEMD160_H , c1, d1, e1, a1, b1, w[10], RIPEMD160C20, RIPEMD160S21); + RIPEMD160_STEP (RIPEMD160_H , b1, c1, d1, e1, a1, w[14], RIPEMD160C20, RIPEMD160S22); + RIPEMD160_STEP (RIPEMD160_H , a1, b1, c1, d1, e1, w[ 4], RIPEMD160C20, RIPEMD160S23); + RIPEMD160_STEP (RIPEMD160_H , e1, a1, b1, c1, d1, w[ 9], RIPEMD160C20, RIPEMD160S24); + RIPEMD160_STEP (RIPEMD160_H , d1, e1, a1, b1, c1, w[15], RIPEMD160C20, RIPEMD160S25); + RIPEMD160_STEP (RIPEMD160_H , c1, d1, e1, a1, b1, w[ 8], RIPEMD160C20, RIPEMD160S26); + RIPEMD160_STEP (RIPEMD160_H , b1, c1, d1, e1, a1, w[ 1], RIPEMD160C20, RIPEMD160S27); + RIPEMD160_STEP (RIPEMD160_H , a1, b1, c1, d1, e1, w[ 2], RIPEMD160C20, RIPEMD160S28); + RIPEMD160_STEP (RIPEMD160_H , e1, a1, b1, c1, d1, w[ 7], RIPEMD160C20, RIPEMD160S29); + RIPEMD160_STEP (RIPEMD160_H , d1, e1, a1, b1, c1, w[ 0], RIPEMD160C20, RIPEMD160S2A); + RIPEMD160_STEP (RIPEMD160_H , c1, d1, e1, a1, b1, w[ 6], RIPEMD160C20, RIPEMD160S2B); + RIPEMD160_STEP (RIPEMD160_H , b1, c1, d1, e1, a1, w[13], RIPEMD160C20, RIPEMD160S2C); + RIPEMD160_STEP (RIPEMD160_H , a1, b1, c1, d1, e1, w[11], RIPEMD160C20, RIPEMD160S2D); + RIPEMD160_STEP (RIPEMD160_H , e1, a1, b1, c1, d1, w[ 5], RIPEMD160C20, RIPEMD160S2E); + RIPEMD160_STEP (RIPEMD160_H , d1, e1, a1, b1, c1, w[12], RIPEMD160C20, RIPEMD160S2F); + + RIPEMD160_STEP (RIPEMD160_Io, c1, d1, e1, a1, b1, w[ 1], RIPEMD160C30, RIPEMD160S30); + RIPEMD160_STEP (RIPEMD160_Io, b1, c1, d1, e1, a1, w[ 9], RIPEMD160C30, RIPEMD160S31); + RIPEMD160_STEP (RIPEMD160_Io, a1, b1, c1, d1, e1, w[11], RIPEMD160C30, RIPEMD160S32); + RIPEMD160_STEP (RIPEMD160_Io, e1, a1, b1, c1, d1, w[10], RIPEMD160C30, RIPEMD160S33); + RIPEMD160_STEP (RIPEMD160_Io, d1, e1, a1, b1, c1, w[ 0], RIPEMD160C30, RIPEMD160S34); + RIPEMD160_STEP (RIPEMD160_Io, c1, d1, e1, a1, b1, w[ 8], RIPEMD160C30, RIPEMD160S35); + RIPEMD160_STEP (RIPEMD160_Io, b1, c1, d1, e1, a1, w[12], RIPEMD160C30, RIPEMD160S36); + RIPEMD160_STEP (RIPEMD160_Io, a1, b1, c1, d1, e1, w[ 4], RIPEMD160C30, RIPEMD160S37); + RIPEMD160_STEP (RIPEMD160_Io, e1, a1, b1, c1, d1, w[13], RIPEMD160C30, RIPEMD160S38); + RIPEMD160_STEP (RIPEMD160_Io, d1, e1, a1, b1, c1, w[ 3], RIPEMD160C30, RIPEMD160S39); + RIPEMD160_STEP (RIPEMD160_Io, c1, d1, e1, a1, b1, w[ 7], RIPEMD160C30, RIPEMD160S3A); + RIPEMD160_STEP (RIPEMD160_Io, b1, c1, d1, e1, a1, w[15], RIPEMD160C30, RIPEMD160S3B); + RIPEMD160_STEP (RIPEMD160_Io, a1, b1, c1, d1, e1, w[14], RIPEMD160C30, RIPEMD160S3C); + RIPEMD160_STEP (RIPEMD160_Io, e1, a1, b1, c1, d1, w[ 5], RIPEMD160C30, RIPEMD160S3D); + RIPEMD160_STEP (RIPEMD160_Io, d1, e1, a1, b1, c1, w[ 6], RIPEMD160C30, RIPEMD160S3E); + RIPEMD160_STEP (RIPEMD160_Io, c1, d1, e1, a1, b1, w[ 2], RIPEMD160C30, RIPEMD160S3F); + + RIPEMD160_STEP (RIPEMD160_J , b1, c1, d1, e1, a1, w[ 4], RIPEMD160C40, RIPEMD160S40); + RIPEMD160_STEP (RIPEMD160_J , a1, b1, c1, d1, e1, w[ 0], RIPEMD160C40, RIPEMD160S41); + RIPEMD160_STEP (RIPEMD160_J , e1, a1, b1, c1, d1, w[ 5], RIPEMD160C40, RIPEMD160S42); + RIPEMD160_STEP (RIPEMD160_J , d1, e1, a1, b1, c1, w[ 9], RIPEMD160C40, RIPEMD160S43); + RIPEMD160_STEP (RIPEMD160_J , c1, d1, e1, a1, b1, w[ 7], RIPEMD160C40, RIPEMD160S44); + RIPEMD160_STEP (RIPEMD160_J , b1, c1, d1, e1, a1, w[12], RIPEMD160C40, RIPEMD160S45); + RIPEMD160_STEP (RIPEMD160_J , a1, b1, c1, d1, e1, w[ 2], RIPEMD160C40, RIPEMD160S46); + RIPEMD160_STEP (RIPEMD160_J , e1, a1, b1, c1, d1, w[10], RIPEMD160C40, RIPEMD160S47); + RIPEMD160_STEP (RIPEMD160_J , d1, e1, a1, b1, c1, w[14], RIPEMD160C40, RIPEMD160S48); + RIPEMD160_STEP (RIPEMD160_J , c1, d1, e1, a1, b1, w[ 1], RIPEMD160C40, RIPEMD160S49); + RIPEMD160_STEP (RIPEMD160_J , b1, c1, d1, e1, a1, w[ 3], RIPEMD160C40, RIPEMD160S4A); + RIPEMD160_STEP (RIPEMD160_J , a1, b1, c1, d1, e1, w[ 8], RIPEMD160C40, RIPEMD160S4B); + RIPEMD160_STEP (RIPEMD160_J , e1, a1, b1, c1, d1, w[11], RIPEMD160C40, RIPEMD160S4C); + RIPEMD160_STEP (RIPEMD160_J , d1, e1, a1, b1, c1, w[ 6], RIPEMD160C40, RIPEMD160S4D); + RIPEMD160_STEP (RIPEMD160_J , c1, d1, e1, a1, b1, w[15], RIPEMD160C40, RIPEMD160S4E); + RIPEMD160_STEP (RIPEMD160_J , b1, c1, d1, e1, a1, w[13], RIPEMD160C40, RIPEMD160S4F); + + u32x a2 = dgst[0]; + u32x b2 = dgst[1]; + u32x c2 = dgst[2]; + u32x d2 = dgst[3]; + u32x e2 = dgst[4]; + + //RIPEMD160_STEP_WORKAROUND_BUG (RIPEMD160_J , a2, b2, c2, d2, e2, w[ 5], RIPEMD160C50, RIPEMD160S50); + RIPEMD160_STEP (RIPEMD160_J , a2, b2, c2, d2, e2, w[ 5], RIPEMD160C50, RIPEMD160S50); + RIPEMD160_STEP (RIPEMD160_J , e2, a2, b2, c2, d2, w[14], RIPEMD160C50, RIPEMD160S51); + RIPEMD160_STEP (RIPEMD160_J , d2, e2, a2, b2, c2, w[ 7], RIPEMD160C50, RIPEMD160S52); + RIPEMD160_STEP (RIPEMD160_J , c2, d2, e2, a2, b2, w[ 0], RIPEMD160C50, RIPEMD160S53); + RIPEMD160_STEP (RIPEMD160_J , b2, c2, d2, e2, a2, w[ 9], RIPEMD160C50, RIPEMD160S54); + RIPEMD160_STEP (RIPEMD160_J , a2, b2, c2, d2, e2, w[ 2], RIPEMD160C50, RIPEMD160S55); + RIPEMD160_STEP (RIPEMD160_J , e2, a2, b2, c2, d2, w[11], RIPEMD160C50, RIPEMD160S56); + RIPEMD160_STEP (RIPEMD160_J , d2, e2, a2, b2, c2, w[ 4], RIPEMD160C50, RIPEMD160S57); + RIPEMD160_STEP (RIPEMD160_J , c2, d2, e2, a2, b2, w[13], RIPEMD160C50, RIPEMD160S58); + RIPEMD160_STEP (RIPEMD160_J , b2, c2, d2, e2, a2, w[ 6], RIPEMD160C50, RIPEMD160S59); + RIPEMD160_STEP (RIPEMD160_J , a2, b2, c2, d2, e2, w[15], RIPEMD160C50, RIPEMD160S5A); + RIPEMD160_STEP (RIPEMD160_J , e2, a2, b2, c2, d2, w[ 8], RIPEMD160C50, RIPEMD160S5B); + RIPEMD160_STEP (RIPEMD160_J , d2, e2, a2, b2, c2, w[ 1], RIPEMD160C50, RIPEMD160S5C); + RIPEMD160_STEP (RIPEMD160_J , c2, d2, e2, a2, b2, w[10], RIPEMD160C50, RIPEMD160S5D); + RIPEMD160_STEP (RIPEMD160_J , b2, c2, d2, e2, a2, w[ 3], RIPEMD160C50, RIPEMD160S5E); + RIPEMD160_STEP (RIPEMD160_J , a2, b2, c2, d2, e2, w[12], RIPEMD160C50, RIPEMD160S5F); + + RIPEMD160_STEP (RIPEMD160_Io, e2, a2, b2, c2, d2, w[ 6], RIPEMD160C60, RIPEMD160S60); + RIPEMD160_STEP (RIPEMD160_Io, d2, e2, a2, b2, c2, w[11], RIPEMD160C60, RIPEMD160S61); + RIPEMD160_STEP (RIPEMD160_Io, c2, d2, e2, a2, b2, w[ 3], RIPEMD160C60, RIPEMD160S62); + RIPEMD160_STEP (RIPEMD160_Io, b2, c2, d2, e2, a2, w[ 7], RIPEMD160C60, RIPEMD160S63); + RIPEMD160_STEP (RIPEMD160_Io, a2, b2, c2, d2, e2, w[ 0], RIPEMD160C60, RIPEMD160S64); + RIPEMD160_STEP (RIPEMD160_Io, e2, a2, b2, c2, d2, w[13], RIPEMD160C60, RIPEMD160S65); + RIPEMD160_STEP (RIPEMD160_Io, d2, e2, a2, b2, c2, w[ 5], RIPEMD160C60, RIPEMD160S66); + RIPEMD160_STEP (RIPEMD160_Io, c2, d2, e2, a2, b2, w[10], RIPEMD160C60, RIPEMD160S67); + RIPEMD160_STEP (RIPEMD160_Io, b2, c2, d2, e2, a2, w[14], RIPEMD160C60, RIPEMD160S68); + RIPEMD160_STEP (RIPEMD160_Io, a2, b2, c2, d2, e2, w[15], RIPEMD160C60, RIPEMD160S69); + RIPEMD160_STEP (RIPEMD160_Io, e2, a2, b2, c2, d2, w[ 8], RIPEMD160C60, RIPEMD160S6A); + RIPEMD160_STEP (RIPEMD160_Io, d2, e2, a2, b2, c2, w[12], RIPEMD160C60, RIPEMD160S6B); + RIPEMD160_STEP (RIPEMD160_Io, c2, d2, e2, a2, b2, w[ 4], RIPEMD160C60, RIPEMD160S6C); + RIPEMD160_STEP (RIPEMD160_Io, b2, c2, d2, e2, a2, w[ 9], RIPEMD160C60, RIPEMD160S6D); + RIPEMD160_STEP (RIPEMD160_Io, a2, b2, c2, d2, e2, w[ 1], RIPEMD160C60, RIPEMD160S6E); + RIPEMD160_STEP (RIPEMD160_Io, e2, a2, b2, c2, d2, w[ 2], RIPEMD160C60, RIPEMD160S6F); + + RIPEMD160_STEP (RIPEMD160_H , d2, e2, a2, b2, c2, w[15], RIPEMD160C70, RIPEMD160S70); + RIPEMD160_STEP (RIPEMD160_H , c2, d2, e2, a2, b2, w[ 5], RIPEMD160C70, RIPEMD160S71); + RIPEMD160_STEP (RIPEMD160_H , b2, c2, d2, e2, a2, w[ 1], RIPEMD160C70, RIPEMD160S72); + RIPEMD160_STEP (RIPEMD160_H , a2, b2, c2, d2, e2, w[ 3], RIPEMD160C70, RIPEMD160S73); + RIPEMD160_STEP (RIPEMD160_H , e2, a2, b2, c2, d2, w[ 7], RIPEMD160C70, RIPEMD160S74); + RIPEMD160_STEP (RIPEMD160_H , d2, e2, a2, b2, c2, w[14], RIPEMD160C70, RIPEMD160S75); + RIPEMD160_STEP (RIPEMD160_H , c2, d2, e2, a2, b2, w[ 6], RIPEMD160C70, RIPEMD160S76); + RIPEMD160_STEP (RIPEMD160_H , b2, c2, d2, e2, a2, w[ 9], RIPEMD160C70, RIPEMD160S77); + RIPEMD160_STEP (RIPEMD160_H , a2, b2, c2, d2, e2, w[11], RIPEMD160C70, RIPEMD160S78); + RIPEMD160_STEP (RIPEMD160_H , e2, a2, b2, c2, d2, w[ 8], RIPEMD160C70, RIPEMD160S79); + RIPEMD160_STEP (RIPEMD160_H , d2, e2, a2, b2, c2, w[12], RIPEMD160C70, RIPEMD160S7A); + RIPEMD160_STEP (RIPEMD160_H , c2, d2, e2, a2, b2, w[ 2], RIPEMD160C70, RIPEMD160S7B); + RIPEMD160_STEP (RIPEMD160_H , b2, c2, d2, e2, a2, w[10], RIPEMD160C70, RIPEMD160S7C); + RIPEMD160_STEP (RIPEMD160_H , a2, b2, c2, d2, e2, w[ 0], RIPEMD160C70, RIPEMD160S7D); + RIPEMD160_STEP (RIPEMD160_H , e2, a2, b2, c2, d2, w[ 4], RIPEMD160C70, RIPEMD160S7E); + RIPEMD160_STEP (RIPEMD160_H , d2, e2, a2, b2, c2, w[13], RIPEMD160C70, RIPEMD160S7F); + + RIPEMD160_STEP (RIPEMD160_Go, c2, d2, e2, a2, b2, w[ 8], RIPEMD160C80, RIPEMD160S80); + RIPEMD160_STEP (RIPEMD160_Go, b2, c2, d2, e2, a2, w[ 6], RIPEMD160C80, RIPEMD160S81); + RIPEMD160_STEP (RIPEMD160_Go, a2, b2, c2, d2, e2, w[ 4], RIPEMD160C80, RIPEMD160S82); + RIPEMD160_STEP (RIPEMD160_Go, e2, a2, b2, c2, d2, w[ 1], RIPEMD160C80, RIPEMD160S83); + RIPEMD160_STEP (RIPEMD160_Go, d2, e2, a2, b2, c2, w[ 3], RIPEMD160C80, RIPEMD160S84); + RIPEMD160_STEP (RIPEMD160_Go, c2, d2, e2, a2, b2, w[11], RIPEMD160C80, RIPEMD160S85); + RIPEMD160_STEP (RIPEMD160_Go, b2, c2, d2, e2, a2, w[15], RIPEMD160C80, RIPEMD160S86); + RIPEMD160_STEP (RIPEMD160_Go, a2, b2, c2, d2, e2, w[ 0], RIPEMD160C80, RIPEMD160S87); + RIPEMD160_STEP (RIPEMD160_Go, e2, a2, b2, c2, d2, w[ 5], RIPEMD160C80, RIPEMD160S88); + RIPEMD160_STEP (RIPEMD160_Go, d2, e2, a2, b2, c2, w[12], RIPEMD160C80, RIPEMD160S89); + RIPEMD160_STEP (RIPEMD160_Go, c2, d2, e2, a2, b2, w[ 2], RIPEMD160C80, RIPEMD160S8A); + RIPEMD160_STEP (RIPEMD160_Go, b2, c2, d2, e2, a2, w[13], RIPEMD160C80, RIPEMD160S8B); + RIPEMD160_STEP (RIPEMD160_Go, a2, b2, c2, d2, e2, w[ 9], RIPEMD160C80, RIPEMD160S8C); + RIPEMD160_STEP (RIPEMD160_Go, e2, a2, b2, c2, d2, w[ 7], RIPEMD160C80, RIPEMD160S8D); + RIPEMD160_STEP (RIPEMD160_Go, d2, e2, a2, b2, c2, w[10], RIPEMD160C80, RIPEMD160S8E); + RIPEMD160_STEP (RIPEMD160_Go, c2, d2, e2, a2, b2, w[14], RIPEMD160C80, RIPEMD160S8F); + + RIPEMD160_STEP (RIPEMD160_F , b2, c2, d2, e2, a2, w[12], RIPEMD160C90, RIPEMD160S90); + RIPEMD160_STEP (RIPEMD160_F , a2, b2, c2, d2, e2, w[15], RIPEMD160C90, RIPEMD160S91); + RIPEMD160_STEP (RIPEMD160_F , e2, a2, b2, c2, d2, w[10], RIPEMD160C90, RIPEMD160S92); + RIPEMD160_STEP (RIPEMD160_F , d2, e2, a2, b2, c2, w[ 4], RIPEMD160C90, RIPEMD160S93); + RIPEMD160_STEP (RIPEMD160_F , c2, d2, e2, a2, b2, w[ 1], RIPEMD160C90, RIPEMD160S94); + RIPEMD160_STEP (RIPEMD160_F , b2, c2, d2, e2, a2, w[ 5], RIPEMD160C90, RIPEMD160S95); + RIPEMD160_STEP (RIPEMD160_F , a2, b2, c2, d2, e2, w[ 8], RIPEMD160C90, RIPEMD160S96); + RIPEMD160_STEP (RIPEMD160_F , e2, a2, b2, c2, d2, w[ 7], RIPEMD160C90, RIPEMD160S97); + RIPEMD160_STEP (RIPEMD160_F , d2, e2, a2, b2, c2, w[ 6], RIPEMD160C90, RIPEMD160S98); + RIPEMD160_STEP (RIPEMD160_F , c2, d2, e2, a2, b2, w[ 2], RIPEMD160C90, RIPEMD160S99); + RIPEMD160_STEP (RIPEMD160_F , b2, c2, d2, e2, a2, w[13], RIPEMD160C90, RIPEMD160S9A); + RIPEMD160_STEP (RIPEMD160_F , a2, b2, c2, d2, e2, w[14], RIPEMD160C90, RIPEMD160S9B); + RIPEMD160_STEP (RIPEMD160_F , e2, a2, b2, c2, d2, w[ 0], RIPEMD160C90, RIPEMD160S9C); + RIPEMD160_STEP (RIPEMD160_F , d2, e2, a2, b2, c2, w[ 3], RIPEMD160C90, RIPEMD160S9D); + RIPEMD160_STEP (RIPEMD160_F , c2, d2, e2, a2, b2, w[ 9], RIPEMD160C90, RIPEMD160S9E); + RIPEMD160_STEP (RIPEMD160_F , b2, c2, d2, e2, a2, w[11], RIPEMD160C90, RIPEMD160S9F); + + const u32x a = dgst[1] + c1 + d2; + const u32x b = dgst[2] + d1 + e2; + const u32x c = dgst[3] + e1 + a2; + const u32x d = dgst[4] + a1 + b2; + const u32x e = dgst[0] + b1 + c2; + + dgst[0] = a; + dgst[1] = b; + dgst[2] = c; + dgst[3] = d; + dgst[4] = e; +} + +__device__ static void hmac_run2 (const u32x w1[16], const u32x w2[16], const u32x ipad[5], const u32x opad[5], u32x dgst[5]) +{ + dgst[0] = ipad[0]; + dgst[1] = ipad[1]; + dgst[2] = ipad[2]; + dgst[3] = ipad[3]; + dgst[4] = ipad[4]; + + ripemd160_transform (w1, dgst); + ripemd160_transform (w2, dgst); + + u32x w[16]; + + w[ 0] = dgst[0]; + w[ 1] = dgst[1]; + w[ 2] = dgst[2]; + w[ 3] = dgst[3]; + w[ 4] = dgst[4]; + w[ 5] = 0x80; + w[ 6] = 0; + w[ 7] = 0; + w[ 8] = 0; + w[ 9] = 0; + w[10] = 0; + w[11] = 0; + w[12] = 0; + w[13] = 0; + w[14] = (64 + 20) * 8; + w[15] = 0; + + dgst[0] = opad[0]; + dgst[1] = opad[1]; + dgst[2] = opad[2]; + dgst[3] = opad[3]; + dgst[4] = opad[4]; + + ripemd160_transform (w, dgst); +} + +__device__ static void hmac_run (u32x w[16], const u32x ipad[5], const u32x opad[5], u32x dgst[5]) +{ + dgst[0] = ipad[0]; + dgst[1] = ipad[1]; + dgst[2] = ipad[2]; + dgst[3] = ipad[3]; + dgst[4] = ipad[4]; + + ripemd160_transform (w, dgst); + + w[ 0] = dgst[0]; + w[ 1] = dgst[1]; + w[ 2] = dgst[2]; + w[ 3] = dgst[3]; + w[ 4] = dgst[4]; + w[ 5] = 0x80; + w[ 6] = 0; + w[ 7] = 0; + w[ 8] = 0; + w[ 9] = 0; + w[10] = 0; + w[11] = 0; + w[12] = 0; + w[13] = 0; + w[14] = (64 + 20) * 8; + w[15] = 0; + + dgst[0] = opad[0]; + dgst[1] = opad[1]; + dgst[2] = opad[2]; + dgst[3] = opad[3]; + dgst[4] = opad[4]; + + ripemd160_transform (w, dgst); +} + +__device__ static void hmac_init (u32x w[16], u32x ipad[5], u32x opad[5]) +{ + w[ 0] ^= 0x36363636; + w[ 1] ^= 0x36363636; + w[ 2] ^= 0x36363636; + w[ 3] ^= 0x36363636; + w[ 4] ^= 0x36363636; + w[ 5] ^= 0x36363636; + w[ 6] ^= 0x36363636; + w[ 7] ^= 0x36363636; + w[ 8] ^= 0x36363636; + w[ 9] ^= 0x36363636; + w[10] ^= 0x36363636; + w[11] ^= 0x36363636; + w[12] ^= 0x36363636; + w[13] ^= 0x36363636; + w[14] ^= 0x36363636; + w[15] ^= 0x36363636; + + ipad[0] = RIPEMD160M_A; + ipad[1] = RIPEMD160M_B; + ipad[2] = RIPEMD160M_C; + ipad[3] = RIPEMD160M_D; + ipad[4] = RIPEMD160M_E; + + ripemd160_transform (w, ipad); + + w[ 0] ^= 0x6a6a6a6a; + w[ 1] ^= 0x6a6a6a6a; + w[ 2] ^= 0x6a6a6a6a; + w[ 3] ^= 0x6a6a6a6a; + w[ 4] ^= 0x6a6a6a6a; + w[ 5] ^= 0x6a6a6a6a; + w[ 6] ^= 0x6a6a6a6a; + w[ 7] ^= 0x6a6a6a6a; + w[ 8] ^= 0x6a6a6a6a; + w[ 9] ^= 0x6a6a6a6a; + w[10] ^= 0x6a6a6a6a; + w[11] ^= 0x6a6a6a6a; + w[12] ^= 0x6a6a6a6a; + w[13] ^= 0x6a6a6a6a; + w[14] ^= 0x6a6a6a6a; + w[15] ^= 0x6a6a6a6a; + + opad[0] = RIPEMD160M_A; + opad[1] = RIPEMD160M_B; + opad[2] = RIPEMD160M_C; + opad[3] = RIPEMD160M_D; + opad[4] = RIPEMD160M_E; + + ripemd160_transform (w, opad); +} + +__device__ static u32 u8add (const u32 a, const u32 b) +{ + const u32 a1 = (a >> 0) & 0xff; + const u32 a2 = (a >> 8) & 0xff; + const u32 a3 = (a >> 16) & 0xff; + const u32 a4 = (a >> 24) & 0xff; + + const u32 b1 = (b >> 0) & 0xff; + const u32 b2 = (b >> 8) & 0xff; + const u32 b3 = (b >> 16) & 0xff; + const u32 b4 = (b >> 24) & 0xff; + + const u32 r1 = (a1 + b1) & 0xff; + const u32 r2 = (a2 + b2) & 0xff; + const u32 r3 = (a3 + b3) & 0xff; + const u32 r4 = (a4 + b4) & 0xff; + + const u32 r = r1 << 0 + | r2 << 8 + | r3 << 16 + | r4 << 24; + + return r; +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m06213_init (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, tc_tmp_t *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const tc_t *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = pws[gid].i[ 8]; + w2[1] = pws[gid].i[ 9]; + w2[2] = pws[gid].i[10]; + w2[3] = pws[gid].i[11]; + + u32x w3[4]; + + w3[0] = pws[gid].i[12]; + w3[1] = pws[gid].i[13]; + w3[2] = pws[gid].i[14]; + w3[3] = pws[gid].i[15]; + + /** + * keyfile + */ + + w0[0] = u8add (w0[0], esalt_bufs[salt_pos].keyfile_buf[ 0]); + w0[1] = u8add (w0[1], esalt_bufs[salt_pos].keyfile_buf[ 1]); + w0[2] = u8add (w0[2], esalt_bufs[salt_pos].keyfile_buf[ 2]); + w0[3] = u8add (w0[3], esalt_bufs[salt_pos].keyfile_buf[ 3]); + w1[0] = u8add (w1[0], esalt_bufs[salt_pos].keyfile_buf[ 4]); + w1[1] = u8add (w1[1], esalt_bufs[salt_pos].keyfile_buf[ 5]); + w1[2] = u8add (w1[2], esalt_bufs[salt_pos].keyfile_buf[ 6]); + w1[3] = u8add (w1[3], esalt_bufs[salt_pos].keyfile_buf[ 7]); + w2[0] = u8add (w2[0], esalt_bufs[salt_pos].keyfile_buf[ 8]); + w2[1] = u8add (w2[1], esalt_bufs[salt_pos].keyfile_buf[ 9]); + w2[2] = u8add (w2[2], esalt_bufs[salt_pos].keyfile_buf[10]); + w2[3] = u8add (w2[3], esalt_bufs[salt_pos].keyfile_buf[11]); + w3[0] = u8add (w3[0], esalt_bufs[salt_pos].keyfile_buf[12]); + w3[1] = u8add (w3[1], esalt_bufs[salt_pos].keyfile_buf[13]); + w3[2] = u8add (w3[2], esalt_bufs[salt_pos].keyfile_buf[14]); + w3[3] = u8add (w3[3], esalt_bufs[salt_pos].keyfile_buf[15]); + + /** + * salt + */ + + u32x salt_buf1[16]; + + salt_buf1[ 0] = esalt_bufs[salt_pos].salt_buf[ 0]; + salt_buf1[ 1] = esalt_bufs[salt_pos].salt_buf[ 1]; + salt_buf1[ 2] = esalt_bufs[salt_pos].salt_buf[ 2]; + salt_buf1[ 3] = esalt_bufs[salt_pos].salt_buf[ 3]; + salt_buf1[ 4] = esalt_bufs[salt_pos].salt_buf[ 4]; + salt_buf1[ 5] = esalt_bufs[salt_pos].salt_buf[ 5]; + salt_buf1[ 6] = esalt_bufs[salt_pos].salt_buf[ 6]; + salt_buf1[ 7] = esalt_bufs[salt_pos].salt_buf[ 7]; + salt_buf1[ 8] = esalt_bufs[salt_pos].salt_buf[ 8]; + salt_buf1[ 9] = esalt_bufs[salt_pos].salt_buf[ 9]; + salt_buf1[10] = esalt_bufs[salt_pos].salt_buf[10]; + salt_buf1[11] = esalt_bufs[salt_pos].salt_buf[11]; + salt_buf1[12] = esalt_bufs[salt_pos].salt_buf[12]; + salt_buf1[13] = esalt_bufs[salt_pos].salt_buf[13]; + salt_buf1[14] = esalt_bufs[salt_pos].salt_buf[14]; + salt_buf1[15] = esalt_bufs[salt_pos].salt_buf[15]; + + u32x salt_buf2[16]; + + salt_buf2[ 0] = 0; + salt_buf2[ 1] = 0x80; + salt_buf2[ 2] = 0; + salt_buf2[ 3] = 0; + salt_buf2[ 4] = 0; + salt_buf2[ 5] = 0; + salt_buf2[ 6] = 0; + salt_buf2[ 7] = 0; + salt_buf2[ 8] = 0; + salt_buf2[ 9] = 0; + salt_buf2[10] = 0; + salt_buf2[11] = 0; + salt_buf2[12] = 0; + salt_buf2[13] = 0; + salt_buf2[14] = (64 + 64 + 4) * 8; + salt_buf2[15] = 0; + + const u32 truecrypt_mdlen = salt_bufs[0].truecrypt_mdlen; + + u32x w[16]; + + w[ 0] = w0[0]; + w[ 1] = w0[1]; + w[ 2] = w0[2]; + w[ 3] = w0[3]; + w[ 4] = w1[0]; + w[ 5] = w1[1]; + w[ 6] = w1[2]; + w[ 7] = w1[3]; + w[ 8] = w2[0]; + w[ 9] = w2[1]; + w[10] = w2[2]; + w[11] = w2[3]; + w[12] = w3[0]; + w[13] = w3[1]; + w[14] = w3[2]; + w[15] = w3[3]; + + u32x ipad[5]; + u32x opad[5]; + + hmac_init (w, ipad, opad); + + tmps[gid].ipad[0] = ipad[0]; + tmps[gid].ipad[1] = ipad[1]; + tmps[gid].ipad[2] = ipad[2]; + tmps[gid].ipad[3] = ipad[3]; + tmps[gid].ipad[4] = ipad[4]; + + tmps[gid].opad[0] = opad[0]; + tmps[gid].opad[1] = opad[1]; + tmps[gid].opad[2] = opad[2]; + tmps[gid].opad[3] = opad[3]; + tmps[gid].opad[4] = opad[4]; + + for (u32 i = 0, j = 1; i < (truecrypt_mdlen / 8 / 4); i += 5, j += 1) + { + salt_buf2[0] = swap_workaround (j); + + u32x dgst[5]; + + hmac_run2 (salt_buf1, salt_buf2, ipad, opad, dgst); + + tmps[gid].dgst[i + 0] = dgst[0]; + tmps[gid].dgst[i + 1] = dgst[1]; + tmps[gid].dgst[i + 2] = dgst[2]; + tmps[gid].dgst[i + 3] = dgst[3]; + tmps[gid].dgst[i + 4] = dgst[4]; + + tmps[gid].out[i + 0] = dgst[0]; + tmps[gid].out[i + 1] = dgst[1]; + tmps[gid].out[i + 2] = dgst[2]; + tmps[gid].out[i + 3] = dgst[3]; + tmps[gid].out[i + 4] = dgst[4]; + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m06213_loop (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, tc_tmp_t *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const tc_t *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + const u32 truecrypt_mdlen = salt_bufs[0].truecrypt_mdlen; + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x ipad[5]; + u32x opad[5]; + + ipad[0] = tmps[gid].ipad[0]; + ipad[1] = tmps[gid].ipad[1]; + ipad[2] = tmps[gid].ipad[2]; + ipad[3] = tmps[gid].ipad[3]; + ipad[4] = tmps[gid].ipad[4]; + + opad[0] = tmps[gid].opad[0]; + opad[1] = tmps[gid].opad[1]; + opad[2] = tmps[gid].opad[2]; + opad[3] = tmps[gid].opad[3]; + opad[4] = tmps[gid].opad[4]; + + for (u32 i = 0; i < (truecrypt_mdlen / 8 / 4); i += 5) + { + u32x dgst[5]; + u32x out[5]; + + dgst[0] = tmps[gid].dgst[i + 0]; + dgst[1] = tmps[gid].dgst[i + 1]; + dgst[2] = tmps[gid].dgst[i + 2]; + dgst[3] = tmps[gid].dgst[i + 3]; + dgst[4] = tmps[gid].dgst[i + 4]; + + out[0] = tmps[gid].out[i + 0]; + out[1] = tmps[gid].out[i + 1]; + out[2] = tmps[gid].out[i + 2]; + out[3] = tmps[gid].out[i + 3]; + out[4] = tmps[gid].out[i + 4]; + + for (u32 j = 0; j < loop_cnt; j++) + { + u32x w[16]; + + w[ 0] = dgst[0]; + w[ 1] = dgst[1]; + w[ 2] = dgst[2]; + w[ 3] = dgst[3]; + w[ 4] = dgst[4]; + w[ 5] = 0x80; + w[ 6] = 0; + w[ 7] = 0; + w[ 8] = 0; + w[ 9] = 0; + w[10] = 0; + w[11] = 0; + w[12] = 0; + w[13] = 0; + w[14] = (64 + 20) * 8; + w[15] = 0; + + hmac_run (w, ipad, opad, dgst); + + out[0] ^= dgst[0]; + out[1] ^= dgst[1]; + out[2] ^= dgst[2]; + out[3] ^= dgst[3]; + out[4] ^= dgst[4]; + } + + tmps[gid].dgst[i + 0] = dgst[0]; + tmps[gid].dgst[i + 1] = dgst[1]; + tmps[gid].dgst[i + 2] = dgst[2]; + tmps[gid].dgst[i + 3] = dgst[3]; + tmps[gid].dgst[i + 4] = dgst[4]; + + tmps[gid].out[i + 0] = out[0]; + tmps[gid].out[i + 1] = out[1]; + tmps[gid].out[i + 2] = out[2]; + tmps[gid].out[i + 3] = out[3]; + tmps[gid].out[i + 4] = out[4]; + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m06213_comp (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, tc_tmp_t *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const tc_t *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + const u32 lid = threadIdx.x; + + if (gid >= gid_max) return; + + u32 ukey1[8]; + + ukey1[0] = tmps[gid].out[ 0]; + ukey1[1] = tmps[gid].out[ 1]; + ukey1[2] = tmps[gid].out[ 2]; + ukey1[3] = tmps[gid].out[ 3]; + ukey1[4] = tmps[gid].out[ 4]; + ukey1[5] = tmps[gid].out[ 5]; + ukey1[6] = tmps[gid].out[ 6]; + ukey1[7] = tmps[gid].out[ 7]; + + u32 ukey2[8]; + + ukey2[0] = tmps[gid].out[ 8]; + ukey2[1] = tmps[gid].out[ 9]; + ukey2[2] = tmps[gid].out[10]; + ukey2[3] = tmps[gid].out[11]; + ukey2[4] = tmps[gid].out[12]; + ukey2[5] = tmps[gid].out[13]; + ukey2[6] = tmps[gid].out[14]; + ukey2[7] = tmps[gid].out[15]; + + u32 data[4]; + + data[0] = esalt_bufs[0].data_buf[0]; + data[1] = esalt_bufs[0].data_buf[1]; + data[2] = esalt_bufs[0].data_buf[2]; + data[3] = esalt_bufs[0].data_buf[3]; + + u32 tmp[4]; + + { + tmp[0] = data[0]; + tmp[1] = data[1]; + tmp[2] = data[2]; + tmp[3] = data[3]; + + aes256_decrypt_xts (ukey1, ukey2, tmp, tmp); + + if (((tmp[0] == 0x45555254) && (tmp[3] == 0)) || ((tmp[0] == 0x45555254) && ((tmp[1] >> 16) <= 5))) + { + mark_hash_s0 (plains_buf, hashes_shown, 0, gid, 0); + + d_return_buf[lid] = 1; + } + } + + { + tmp[0] = data[0]; + tmp[1] = data[1]; + tmp[2] = data[2]; + tmp[3] = data[3]; + + serpent256_decrypt_xts (ukey1, ukey2, tmp, tmp); + + if (((tmp[0] == 0x45555254) && (tmp[3] == 0)) || ((tmp[0] == 0x45555254) && ((tmp[1] >> 16) <= 5))) + { + mark_hash_s0 (plains_buf, hashes_shown, 0, gid, 0); + + d_return_buf[lid] = 1; + } + } + + { + tmp[0] = data[0]; + tmp[1] = data[1]; + tmp[2] = data[2]; + tmp[3] = data[3]; + + twofish256_decrypt_xts (ukey1, ukey2, tmp, tmp); + + if (((tmp[0] == 0x45555254) && (tmp[3] == 0)) || ((tmp[0] == 0x45555254) && ((tmp[1] >> 16) <= 5))) + { + mark_hash_s0 (plains_buf, hashes_shown, 0, gid, 0); + + d_return_buf[lid] = 1; + } + } + + u32 ukey3[8]; + + ukey3[0] = tmps[gid].out[16]; + ukey3[1] = tmps[gid].out[17]; + ukey3[2] = tmps[gid].out[18]; + ukey3[3] = tmps[gid].out[19]; + ukey3[4] = tmps[gid].out[20]; + ukey3[5] = tmps[gid].out[21]; + ukey3[6] = tmps[gid].out[22]; + ukey3[7] = tmps[gid].out[23]; + + u32 ukey4[8]; + + ukey4[0] = tmps[gid].out[24]; + ukey4[1] = tmps[gid].out[25]; + ukey4[2] = tmps[gid].out[26]; + ukey4[3] = tmps[gid].out[27]; + ukey4[4] = tmps[gid].out[28]; + ukey4[5] = tmps[gid].out[29]; + ukey4[6] = tmps[gid].out[30]; + ukey4[7] = tmps[gid].out[31]; + + { + tmp[0] = data[0]; + tmp[1] = data[1]; + tmp[2] = data[2]; + tmp[3] = data[3]; + + aes256_decrypt_xts (ukey2, ukey4, tmp, tmp); + twofish256_decrypt_xts (ukey1, ukey3, tmp, tmp); + + if (((tmp[0] == 0x45555254) && (tmp[3] == 0)) || ((tmp[0] == 0x45555254) && ((tmp[1] >> 16) <= 5))) + { + mark_hash_s0 (plains_buf, hashes_shown, 0, gid, 0); + + d_return_buf[lid] = 1; + } + } + + { + tmp[0] = data[0]; + tmp[1] = data[1]; + tmp[2] = data[2]; + tmp[3] = data[3]; + + serpent256_decrypt_xts (ukey2, ukey4, tmp, tmp); + aes256_decrypt_xts (ukey1, ukey3, tmp, tmp); + + if (((tmp[0] == 0x45555254) && (tmp[3] == 0)) || ((tmp[0] == 0x45555254) && ((tmp[1] >> 16) <= 5))) + { + mark_hash_s0 (plains_buf, hashes_shown, 0, gid, 0); + + d_return_buf[lid] = 1; + } + } + + { + tmp[0] = data[0]; + tmp[1] = data[1]; + tmp[2] = data[2]; + tmp[3] = data[3]; + + twofish256_decrypt_xts (ukey2, ukey4, tmp, tmp); + serpent256_decrypt_xts (ukey1, ukey3, tmp, tmp); + + if (((tmp[0] == 0x45555254) && (tmp[3] == 0)) || ((tmp[0] == 0x45555254) && ((tmp[1] >> 16) <= 5))) + { + mark_hash_s0 (plains_buf, hashes_shown, 0, gid, 0); + + d_return_buf[lid] = 1; + } + } + + u32 ukey5[8]; + + ukey5[0] = tmps[gid].out[32]; + ukey5[1] = tmps[gid].out[33]; + ukey5[2] = tmps[gid].out[34]; + ukey5[3] = tmps[gid].out[35]; + ukey5[4] = tmps[gid].out[36]; + ukey5[5] = tmps[gid].out[37]; + ukey5[6] = tmps[gid].out[38]; + ukey5[7] = tmps[gid].out[39]; + + u32 ukey6[8]; + + ukey6[0] = tmps[gid].out[40]; + ukey6[1] = tmps[gid].out[41]; + ukey6[2] = tmps[gid].out[42]; + ukey6[3] = tmps[gid].out[43]; + ukey6[4] = tmps[gid].out[44]; + ukey6[5] = tmps[gid].out[45]; + ukey6[6] = tmps[gid].out[46]; + ukey6[7] = tmps[gid].out[47]; + + { + tmp[0] = data[0]; + tmp[1] = data[1]; + tmp[2] = data[2]; + tmp[3] = data[3]; + + aes256_decrypt_xts (ukey3, ukey6, tmp, tmp); + twofish256_decrypt_xts (ukey2, ukey5, tmp, tmp); + serpent256_decrypt_xts (ukey1, ukey4, tmp, tmp); + + if (((tmp[0] == 0x45555254) && (tmp[3] == 0)) || ((tmp[0] == 0x45555254) && ((tmp[1] >> 16) <= 5))) + { + mark_hash_s0 (plains_buf, hashes_shown, 0, gid, 0); + + d_return_buf[lid] = 1; + } + } + + { + tmp[0] = data[0]; + tmp[1] = data[1]; + tmp[2] = data[2]; + tmp[3] = data[3]; + + serpent256_decrypt_xts (ukey3, ukey6, tmp, tmp); + twofish256_decrypt_xts (ukey2, ukey5, tmp, tmp); + aes256_decrypt_xts (ukey1, ukey4, tmp, tmp); + + if (((tmp[0] == 0x45555254) && (tmp[3] == 0)) || ((tmp[0] == 0x45555254) && ((tmp[1] >> 16) <= 5))) + { + mark_hash_s0 (plains_buf, hashes_shown, 0, gid, 0); + + d_return_buf[lid] = 1; + } + } +} diff --git a/nv/m06221.cu b/nv/m06221.cu new file mode 100644 index 0000000000..6ae1c908a9 --- /dev/null +++ b/nv/m06221.cu @@ -0,0 +1,621 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _SHA512_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW2 +#define VECT_SIZE1 +#endif + +#define DGST_R0 0 +#define DGST_R1 1 +#define DGST_R2 2 +#define DGST_R3 3 + +#include "include/kernel_functions.c" +#include "types_nv.c" +#include "common_nv.c" + +#include "gpu_aes256_nv.c" +#include "gpu_twofish256_nv.c" +#include "gpu_serpent256_nv.c" + +__device__ __constant__ u64 k_sha512[80] = +{ + SHA512C00, SHA512C01, SHA512C02, SHA512C03, + SHA512C04, SHA512C05, SHA512C06, SHA512C07, + SHA512C08, SHA512C09, SHA512C0a, SHA512C0b, + SHA512C0c, SHA512C0d, SHA512C0e, SHA512C0f, + SHA512C10, SHA512C11, SHA512C12, SHA512C13, + SHA512C14, SHA512C15, SHA512C16, SHA512C17, + SHA512C18, SHA512C19, SHA512C1a, SHA512C1b, + SHA512C1c, SHA512C1d, SHA512C1e, SHA512C1f, + SHA512C20, SHA512C21, SHA512C22, SHA512C23, + SHA512C24, SHA512C25, SHA512C26, SHA512C27, + SHA512C28, SHA512C29, SHA512C2a, SHA512C2b, + SHA512C2c, SHA512C2d, SHA512C2e, SHA512C2f, + SHA512C30, SHA512C31, SHA512C32, SHA512C33, + SHA512C34, SHA512C35, SHA512C36, SHA512C37, + SHA512C38, SHA512C39, SHA512C3a, SHA512C3b, + SHA512C3c, SHA512C3d, SHA512C3e, SHA512C3f, + SHA512C40, SHA512C41, SHA512C42, SHA512C43, + SHA512C44, SHA512C45, SHA512C46, SHA512C47, + SHA512C48, SHA512C49, SHA512C4a, SHA512C4b, + SHA512C4c, SHA512C4d, SHA512C4e, SHA512C4f, +}; + +__device__ static void sha512_transform (const u64 w[16], u64 dgst[8]) +{ + u64 a = dgst[0]; + u64 b = dgst[1]; + u64 c = dgst[2]; + u64 d = dgst[3]; + u64 e = dgst[4]; + u64 f = dgst[5]; + u64 g = dgst[6]; + u64 h = dgst[7]; + + u64 w0_t = w[ 0]; + u64 w1_t = w[ 1]; + u64 w2_t = w[ 2]; + u64 w3_t = w[ 3]; + u64 w4_t = w[ 4]; + u64 w5_t = w[ 5]; + u64 w6_t = w[ 6]; + u64 w7_t = w[ 7]; + u64 w8_t = w[ 8]; + u64 w9_t = w[ 9]; + u64 wa_t = w[10]; + u64 wb_t = w[11]; + u64 wc_t = w[12]; + u64 wd_t = w[13]; + u64 we_t = w[14]; + u64 wf_t = w[15]; + + #define ROUND_EXPAND() \ + { \ + w0_t = SHA512_EXPAND (we_t, w9_t, w1_t, w0_t); \ + w1_t = SHA512_EXPAND (wf_t, wa_t, w2_t, w1_t); \ + w2_t = SHA512_EXPAND (w0_t, wb_t, w3_t, w2_t); \ + w3_t = SHA512_EXPAND (w1_t, wc_t, w4_t, w3_t); \ + w4_t = SHA512_EXPAND (w2_t, wd_t, w5_t, w4_t); \ + w5_t = SHA512_EXPAND (w3_t, we_t, w6_t, w5_t); \ + w6_t = SHA512_EXPAND (w4_t, wf_t, w7_t, w6_t); \ + w7_t = SHA512_EXPAND (w5_t, w0_t, w8_t, w7_t); \ + w8_t = SHA512_EXPAND (w6_t, w1_t, w9_t, w8_t); \ + w9_t = SHA512_EXPAND (w7_t, w2_t, wa_t, w9_t); \ + wa_t = SHA512_EXPAND (w8_t, w3_t, wb_t, wa_t); \ + wb_t = SHA512_EXPAND (w9_t, w4_t, wc_t, wb_t); \ + wc_t = SHA512_EXPAND (wa_t, w5_t, wd_t, wc_t); \ + wd_t = SHA512_EXPAND (wb_t, w6_t, we_t, wd_t); \ + we_t = SHA512_EXPAND (wc_t, w7_t, wf_t, we_t); \ + wf_t = SHA512_EXPAND (wd_t, w8_t, w0_t, wf_t); \ + } + + #define ROUND_STEP(i) \ + { \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, a, b, c, d, e, f, g, h, w0_t, k_sha512[i + 0]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, h, a, b, c, d, e, f, g, w1_t, k_sha512[i + 1]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, g, h, a, b, c, d, e, f, w2_t, k_sha512[i + 2]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, f, g, h, a, b, c, d, e, w3_t, k_sha512[i + 3]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, e, f, g, h, a, b, c, d, w4_t, k_sha512[i + 4]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, d, e, f, g, h, a, b, c, w5_t, k_sha512[i + 5]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, c, d, e, f, g, h, a, b, w6_t, k_sha512[i + 6]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, b, c, d, e, f, g, h, a, w7_t, k_sha512[i + 7]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, a, b, c, d, e, f, g, h, w8_t, k_sha512[i + 8]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, h, a, b, c, d, e, f, g, w9_t, k_sha512[i + 9]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, g, h, a, b, c, d, e, f, wa_t, k_sha512[i + 10]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, f, g, h, a, b, c, d, e, wb_t, k_sha512[i + 11]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, e, f, g, h, a, b, c, d, wc_t, k_sha512[i + 12]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, d, e, f, g, h, a, b, c, wd_t, k_sha512[i + 13]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, c, d, e, f, g, h, a, b, we_t, k_sha512[i + 14]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, b, c, d, e, f, g, h, a, wf_t, k_sha512[i + 15]); \ + } + + ROUND_STEP (0); + + for (int i = 16; i < 80; i += 16) + { + ROUND_EXPAND (); ROUND_STEP (i); + } + + dgst[0] += a; + dgst[1] += b; + dgst[2] += c; + dgst[3] += d; + dgst[4] += e; + dgst[5] += f; + dgst[6] += g; + dgst[7] += h; +} + +__device__ static void hmac_run (const u64 w1[16], const u64 ipad[8], const u64 opad[8], u64 dgst[8]) +{ + dgst[0] = ipad[0]; + dgst[1] = ipad[1]; + dgst[2] = ipad[2]; + dgst[3] = ipad[3]; + dgst[4] = ipad[4]; + dgst[5] = ipad[5]; + dgst[6] = ipad[6]; + dgst[7] = ipad[7]; + + sha512_transform (w1, dgst); + + u64 w[16]; + + w[ 0] = dgst[0]; + w[ 1] = dgst[1]; + w[ 2] = dgst[2]; + w[ 3] = dgst[3]; + w[ 4] = dgst[4]; + w[ 5] = dgst[5]; + w[ 6] = dgst[6]; + w[ 7] = dgst[7]; + w[ 8] = 0x8000000000000000; + w[ 9] = 0; + w[10] = 0; + w[11] = 0; + w[12] = 0; + w[13] = 0; + w[14] = 0; + w[15] = (128 + 64) * 8; + + dgst[0] = opad[0]; + dgst[1] = opad[1]; + dgst[2] = opad[2]; + dgst[3] = opad[3]; + dgst[4] = opad[4]; + dgst[5] = opad[5]; + dgst[6] = opad[6]; + dgst[7] = opad[7]; + + sha512_transform (w, dgst); +} + +__device__ static void hmac_init (u64 w[16], u64 ipad[8], u64 opad[8]) +{ + w[ 0] ^= 0x3636363636363636; + w[ 1] ^= 0x3636363636363636; + w[ 2] ^= 0x3636363636363636; + w[ 3] ^= 0x3636363636363636; + w[ 4] ^= 0x3636363636363636; + w[ 5] ^= 0x3636363636363636; + w[ 6] ^= 0x3636363636363636; + w[ 7] ^= 0x3636363636363636; + w[ 8] ^= 0x3636363636363636; + w[ 9] ^= 0x3636363636363636; + w[10] ^= 0x3636363636363636; + w[11] ^= 0x3636363636363636; + w[12] ^= 0x3636363636363636; + w[13] ^= 0x3636363636363636; + w[14] ^= 0x3636363636363636; + w[15] ^= 0x3636363636363636; + + ipad[0] = SHA512M_A; + ipad[1] = SHA512M_B; + ipad[2] = SHA512M_C; + ipad[3] = SHA512M_D; + ipad[4] = SHA512M_E; + ipad[5] = SHA512M_F; + ipad[6] = SHA512M_G; + ipad[7] = SHA512M_H; + + sha512_transform (w, ipad); + + w[ 0] ^= 0x6a6a6a6a6a6a6a6a; + w[ 1] ^= 0x6a6a6a6a6a6a6a6a; + w[ 2] ^= 0x6a6a6a6a6a6a6a6a; + w[ 3] ^= 0x6a6a6a6a6a6a6a6a; + w[ 4] ^= 0x6a6a6a6a6a6a6a6a; + w[ 5] ^= 0x6a6a6a6a6a6a6a6a; + w[ 6] ^= 0x6a6a6a6a6a6a6a6a; + w[ 7] ^= 0x6a6a6a6a6a6a6a6a; + w[ 8] ^= 0x6a6a6a6a6a6a6a6a; + w[ 9] ^= 0x6a6a6a6a6a6a6a6a; + w[10] ^= 0x6a6a6a6a6a6a6a6a; + w[11] ^= 0x6a6a6a6a6a6a6a6a; + w[12] ^= 0x6a6a6a6a6a6a6a6a; + w[13] ^= 0x6a6a6a6a6a6a6a6a; + w[14] ^= 0x6a6a6a6a6a6a6a6a; + w[15] ^= 0x6a6a6a6a6a6a6a6a; + + opad[0] = SHA512M_A; + opad[1] = SHA512M_B; + opad[2] = SHA512M_C; + opad[3] = SHA512M_D; + opad[4] = SHA512M_E; + opad[5] = SHA512M_F; + opad[6] = SHA512M_G; + opad[7] = SHA512M_H; + + sha512_transform (w, opad); +} + +__device__ static u32 u8add (const u32 a, const u32 b) +{ + const u32 a1 = (a >> 0) & 0xff; + const u32 a2 = (a >> 8) & 0xff; + const u32 a3 = (a >> 16) & 0xff; + const u32 a4 = (a >> 24) & 0xff; + + const u32 b1 = (b >> 0) & 0xff; + const u32 b2 = (b >> 8) & 0xff; + const u32 b3 = (b >> 16) & 0xff; + const u32 b4 = (b >> 24) & 0xff; + + const u32 r1 = (a1 + b1) & 0xff; + const u32 r2 = (a2 + b2) & 0xff; + const u32 r3 = (a3 + b3) & 0xff; + const u32 r4 = (a4 + b4) & 0xff; + + const u32 r = r1 << 0 + | r2 << 8 + | r3 << 16 + | r4 << 24; + + return r; +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m06221_init (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, tc64_tmp_t *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const tc_t *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = pws[gid].i[ 8]; + w2[1] = pws[gid].i[ 9]; + w2[2] = pws[gid].i[10]; + w2[3] = pws[gid].i[11]; + + u32x w3[4]; + + w3[0] = pws[gid].i[12]; + w3[1] = pws[gid].i[13]; + w3[2] = pws[gid].i[14]; + w3[3] = pws[gid].i[15]; + + /** + * keyfile + */ + + w0[0] = u8add (w0[0], esalt_bufs[salt_pos].keyfile_buf[ 0]); + w0[1] = u8add (w0[1], esalt_bufs[salt_pos].keyfile_buf[ 1]); + w0[2] = u8add (w0[2], esalt_bufs[salt_pos].keyfile_buf[ 2]); + w0[3] = u8add (w0[3], esalt_bufs[salt_pos].keyfile_buf[ 3]); + w1[0] = u8add (w1[0], esalt_bufs[salt_pos].keyfile_buf[ 4]); + w1[1] = u8add (w1[1], esalt_bufs[salt_pos].keyfile_buf[ 5]); + w1[2] = u8add (w1[2], esalt_bufs[salt_pos].keyfile_buf[ 6]); + w1[3] = u8add (w1[3], esalt_bufs[salt_pos].keyfile_buf[ 7]); + w2[0] = u8add (w2[0], esalt_bufs[salt_pos].keyfile_buf[ 8]); + w2[1] = u8add (w2[1], esalt_bufs[salt_pos].keyfile_buf[ 9]); + w2[2] = u8add (w2[2], esalt_bufs[salt_pos].keyfile_buf[10]); + w2[3] = u8add (w2[3], esalt_bufs[salt_pos].keyfile_buf[11]); + w3[0] = u8add (w3[0], esalt_bufs[salt_pos].keyfile_buf[12]); + w3[1] = u8add (w3[1], esalt_bufs[salt_pos].keyfile_buf[13]); + w3[2] = u8add (w3[2], esalt_bufs[salt_pos].keyfile_buf[14]); + w3[3] = u8add (w3[3], esalt_bufs[salt_pos].keyfile_buf[15]); + + /** + * salt + */ + + u64 salt_buf[16]; + + // swap fehlt + + salt_buf[ 0] = ((u64) swap_workaround (esalt_bufs[salt_pos].salt_buf[ 0])) << 32 | (u64) swap_workaround (esalt_bufs[salt_pos].salt_buf[ 1]); + salt_buf[ 1] = ((u64) swap_workaround (esalt_bufs[salt_pos].salt_buf[ 2])) << 32 | (u64) swap_workaround (esalt_bufs[salt_pos].salt_buf[ 3]); + salt_buf[ 2] = ((u64) swap_workaround (esalt_bufs[salt_pos].salt_buf[ 4])) << 32 | (u64) swap_workaround (esalt_bufs[salt_pos].salt_buf[ 5]); + salt_buf[ 3] = ((u64) swap_workaround (esalt_bufs[salt_pos].salt_buf[ 6])) << 32 | (u64) swap_workaround (esalt_bufs[salt_pos].salt_buf[ 7]); + salt_buf[ 4] = ((u64) swap_workaround (esalt_bufs[salt_pos].salt_buf[ 8])) << 32 | (u64) swap_workaround (esalt_bufs[salt_pos].salt_buf[ 9]); + salt_buf[ 5] = ((u64) swap_workaround (esalt_bufs[salt_pos].salt_buf[10])) << 32 | (u64) swap_workaround (esalt_bufs[salt_pos].salt_buf[11]); + salt_buf[ 6] = ((u64) swap_workaround (esalt_bufs[salt_pos].salt_buf[12])) << 32 | (u64) swap_workaround (esalt_bufs[salt_pos].salt_buf[13]); + salt_buf[ 7] = ((u64) swap_workaround (esalt_bufs[salt_pos].salt_buf[14])) << 32 | (u64) swap_workaround (esalt_bufs[salt_pos].salt_buf[15]); + salt_buf[ 8] = 0; + salt_buf[ 9] = 0; + salt_buf[10] = 0; + salt_buf[11] = 0; + salt_buf[12] = 0; + salt_buf[13] = 0; + salt_buf[14] = 0; + salt_buf[15] = (128 + 64 + 4) * 8; + + const u32 truecrypt_mdlen = salt_bufs[0].truecrypt_mdlen; + + u64 w[16]; + + w[ 0] = ((u64) swap_workaround (w0[0])) << 32 | (u64) swap_workaround (w0[1]); + w[ 1] = ((u64) swap_workaround (w0[2])) << 32 | (u64) swap_workaround (w0[3]); + w[ 2] = ((u64) swap_workaround (w1[0])) << 32 | (u64) swap_workaround (w1[1]); + w[ 3] = ((u64) swap_workaround (w1[2])) << 32 | (u64) swap_workaround (w1[3]); + w[ 4] = ((u64) swap_workaround (w2[0])) << 32 | (u64) swap_workaround (w2[1]); + w[ 5] = ((u64) swap_workaround (w2[2])) << 32 | (u64) swap_workaround (w2[3]); + w[ 6] = ((u64) swap_workaround (w3[0])) << 32 | (u64) swap_workaround (w3[1]); + w[ 7] = ((u64) swap_workaround (w3[2])) << 32 | (u64) swap_workaround (w3[3]); + w[ 8] = 0; + w[ 9] = 0; + w[10] = 0; + w[11] = 0; + w[12] = 0; + w[13] = 0; + w[14] = 0; + w[15] = 0; + + u64 ipad[8]; + u64 opad[8]; + + hmac_init (w, ipad, opad); + + tmps[gid].ipad[0] = ipad[0]; + tmps[gid].ipad[1] = ipad[1]; + tmps[gid].ipad[2] = ipad[2]; + tmps[gid].ipad[3] = ipad[3]; + tmps[gid].ipad[4] = ipad[4]; + tmps[gid].ipad[5] = ipad[5]; + tmps[gid].ipad[6] = ipad[6]; + tmps[gid].ipad[7] = ipad[7]; + + tmps[gid].opad[0] = opad[0]; + tmps[gid].opad[1] = opad[1]; + tmps[gid].opad[2] = opad[2]; + tmps[gid].opad[3] = opad[3]; + tmps[gid].opad[4] = opad[4]; + tmps[gid].opad[5] = opad[5]; + tmps[gid].opad[6] = opad[6]; + tmps[gid].opad[7] = opad[7]; + + for (u32 i = 0, j = 1; i < (truecrypt_mdlen / 8 / 8); i += 8, j += 1) + { + salt_buf[8] = (u64) j << 32 | (u64) 0x80000000; + + u64 dgst[8]; + + hmac_run (salt_buf, ipad, opad, dgst); + + tmps[gid].dgst[i + 0] = dgst[0]; + tmps[gid].dgst[i + 1] = dgst[1]; + tmps[gid].dgst[i + 2] = dgst[2]; + tmps[gid].dgst[i + 3] = dgst[3]; + tmps[gid].dgst[i + 4] = dgst[4]; + tmps[gid].dgst[i + 5] = dgst[5]; + tmps[gid].dgst[i + 6] = dgst[6]; + tmps[gid].dgst[i + 7] = dgst[7]; + + tmps[gid].out[i + 0] = dgst[0]; + tmps[gid].out[i + 1] = dgst[1]; + tmps[gid].out[i + 2] = dgst[2]; + tmps[gid].out[i + 3] = dgst[3]; + tmps[gid].out[i + 4] = dgst[4]; + tmps[gid].out[i + 5] = dgst[5]; + tmps[gid].out[i + 6] = dgst[6]; + tmps[gid].out[i + 7] = dgst[7]; + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m06221_loop (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, tc64_tmp_t *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const tc_t *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + const u32 truecrypt_mdlen = salt_bufs[0].truecrypt_mdlen; + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u64 ipad[8]; + + ipad[0] = tmps[gid].ipad[0]; + ipad[1] = tmps[gid].ipad[1]; + ipad[2] = tmps[gid].ipad[2]; + ipad[3] = tmps[gid].ipad[3]; + ipad[4] = tmps[gid].ipad[4]; + ipad[5] = tmps[gid].ipad[5]; + ipad[6] = tmps[gid].ipad[6]; + ipad[7] = tmps[gid].ipad[7]; + + u64 opad[8]; + + opad[0] = tmps[gid].opad[0]; + opad[1] = tmps[gid].opad[1]; + opad[2] = tmps[gid].opad[2]; + opad[3] = tmps[gid].opad[3]; + opad[4] = tmps[gid].opad[4]; + opad[5] = tmps[gid].opad[5]; + opad[6] = tmps[gid].opad[6]; + opad[7] = tmps[gid].opad[7]; + + for (u32 i = 0; i < (truecrypt_mdlen / 8 / 8); i += 8) + { + u64 dgst[8]; + + dgst[0] = tmps[gid].dgst[i + 0]; + dgst[1] = tmps[gid].dgst[i + 1]; + dgst[2] = tmps[gid].dgst[i + 2]; + dgst[3] = tmps[gid].dgst[i + 3]; + dgst[4] = tmps[gid].dgst[i + 4]; + dgst[5] = tmps[gid].dgst[i + 5]; + dgst[6] = tmps[gid].dgst[i + 6]; + dgst[7] = tmps[gid].dgst[i + 7]; + + u64 out[8]; + + out[0] = tmps[gid].out[i + 0]; + out[1] = tmps[gid].out[i + 1]; + out[2] = tmps[gid].out[i + 2]; + out[3] = tmps[gid].out[i + 3]; + out[4] = tmps[gid].out[i + 4]; + out[5] = tmps[gid].out[i + 5]; + out[6] = tmps[gid].out[i + 6]; + out[7] = tmps[gid].out[i + 7]; + + for (u32 j = 0; j < loop_cnt; j++) + { + u64 w[16]; + + w[ 0] = dgst[0]; + w[ 1] = dgst[1]; + w[ 2] = dgst[2]; + w[ 3] = dgst[3]; + w[ 4] = dgst[4]; + w[ 5] = dgst[5]; + w[ 6] = dgst[6]; + w[ 7] = dgst[7]; + w[ 8] = 0x8000000000000000; + w[ 9] = 0; + w[10] = 0; + w[11] = 0; + w[12] = 0; + w[13] = 0; + w[14] = 0; + w[15] = (128 + 64) * 8; + + hmac_run (w, ipad, opad, dgst); + + out[0] ^= dgst[0]; + out[1] ^= dgst[1]; + out[2] ^= dgst[2]; + out[3] ^= dgst[3]; + out[4] ^= dgst[4]; + out[5] ^= dgst[5]; + out[6] ^= dgst[6]; + out[7] ^= dgst[7]; + } + + tmps[gid].dgst[i + 0] = dgst[0]; + tmps[gid].dgst[i + 1] = dgst[1]; + tmps[gid].dgst[i + 2] = dgst[2]; + tmps[gid].dgst[i + 3] = dgst[3]; + tmps[gid].dgst[i + 4] = dgst[4]; + tmps[gid].dgst[i + 5] = dgst[5]; + tmps[gid].dgst[i + 6] = dgst[6]; + tmps[gid].dgst[i + 7] = dgst[7]; + + tmps[gid].out[i + 0] = out[0]; + tmps[gid].out[i + 1] = out[1]; + tmps[gid].out[i + 2] = out[2]; + tmps[gid].out[i + 3] = out[3]; + tmps[gid].out[i + 4] = out[4]; + tmps[gid].out[i + 5] = out[5]; + tmps[gid].out[i + 6] = out[6]; + tmps[gid].out[i + 7] = out[7]; + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m06221_comp (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, tc64_tmp_t *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const tc_t *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + const u32 lid = threadIdx.x; + + if (gid >= gid_max) return; + + u32 ukey1[8]; + + ukey1[0] = swap_workaround (h32_from_64 (tmps[gid].out[ 0])); + ukey1[1] = swap_workaround (l32_from_64 (tmps[gid].out[ 0])); + ukey1[2] = swap_workaround (h32_from_64 (tmps[gid].out[ 1])); + ukey1[3] = swap_workaround (l32_from_64 (tmps[gid].out[ 1])); + ukey1[4] = swap_workaround (h32_from_64 (tmps[gid].out[ 2])); + ukey1[5] = swap_workaround (l32_from_64 (tmps[gid].out[ 2])); + ukey1[6] = swap_workaround (h32_from_64 (tmps[gid].out[ 3])); + ukey1[7] = swap_workaround (l32_from_64 (tmps[gid].out[ 3])); + + u32 ukey2[8]; + + ukey2[0] = swap_workaround (h32_from_64 (tmps[gid].out[ 4])); + ukey2[1] = swap_workaround (l32_from_64 (tmps[gid].out[ 4])); + ukey2[2] = swap_workaround (h32_from_64 (tmps[gid].out[ 5])); + ukey2[3] = swap_workaround (l32_from_64 (tmps[gid].out[ 5])); + ukey2[4] = swap_workaround (h32_from_64 (tmps[gid].out[ 6])); + ukey2[5] = swap_workaround (l32_from_64 (tmps[gid].out[ 6])); + ukey2[6] = swap_workaround (h32_from_64 (tmps[gid].out[ 7])); + ukey2[7] = swap_workaround (l32_from_64 (tmps[gid].out[ 7])); + + u32 data[4]; + + data[0] = esalt_bufs[0].data_buf[0]; + data[1] = esalt_bufs[0].data_buf[1]; + data[2] = esalt_bufs[0].data_buf[2]; + data[3] = esalt_bufs[0].data_buf[3]; + + u32 tmp[4]; + + { + tmp[0] = data[0]; + tmp[1] = data[1]; + tmp[2] = data[2]; + tmp[3] = data[3]; + + aes256_decrypt_xts (ukey1, ukey2, tmp, tmp); + + if (((tmp[0] == 0x45555254) && (tmp[3] == 0)) || ((tmp[0] == 0x45555254) && ((tmp[1] >> 16) <= 5))) + { + mark_hash_s0 (plains_buf, hashes_shown, 0, gid, 0); + + d_return_buf[lid] = 1; + } + } + + { + tmp[0] = data[0]; + tmp[1] = data[1]; + tmp[2] = data[2]; + tmp[3] = data[3]; + + serpent256_decrypt_xts (ukey1, ukey2, tmp, tmp); + + if (((tmp[0] == 0x45555254) && (tmp[3] == 0)) || ((tmp[0] == 0x45555254) && ((tmp[1] >> 16) <= 5))) + { + mark_hash_s0 (plains_buf, hashes_shown, 0, gid, 0); + + d_return_buf[lid] = 1; + } + } + + { + tmp[0] = data[0]; + tmp[1] = data[1]; + tmp[2] = data[2]; + tmp[3] = data[3]; + + twofish256_decrypt_xts (ukey1, ukey2, tmp, tmp); + + if (((tmp[0] == 0x45555254) && (tmp[3] == 0)) || ((tmp[0] == 0x45555254) && ((tmp[1] >> 16) <= 5))) + { + mark_hash_s0 (plains_buf, hashes_shown, 0, gid, 0); + + d_return_buf[lid] = 1; + } + } +} diff --git a/nv/m06222.cu b/nv/m06222.cu new file mode 100644 index 0000000000..8daf916667 --- /dev/null +++ b/nv/m06222.cu @@ -0,0 +1,694 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _SHA512_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW2 +#define VECT_SIZE1 +#endif + +#define DGST_R0 0 +#define DGST_R1 1 +#define DGST_R2 2 +#define DGST_R3 3 + +#include "include/kernel_functions.c" +#include "types_nv.c" +#include "common_nv.c" + +#include "gpu_aes256_nv.c" +#include "gpu_twofish256_nv.c" +#include "gpu_serpent256_nv.c" + +__device__ __constant__ u64 k_sha512[80] = +{ + SHA512C00, SHA512C01, SHA512C02, SHA512C03, + SHA512C04, SHA512C05, SHA512C06, SHA512C07, + SHA512C08, SHA512C09, SHA512C0a, SHA512C0b, + SHA512C0c, SHA512C0d, SHA512C0e, SHA512C0f, + SHA512C10, SHA512C11, SHA512C12, SHA512C13, + SHA512C14, SHA512C15, SHA512C16, SHA512C17, + SHA512C18, SHA512C19, SHA512C1a, SHA512C1b, + SHA512C1c, SHA512C1d, SHA512C1e, SHA512C1f, + SHA512C20, SHA512C21, SHA512C22, SHA512C23, + SHA512C24, SHA512C25, SHA512C26, SHA512C27, + SHA512C28, SHA512C29, SHA512C2a, SHA512C2b, + SHA512C2c, SHA512C2d, SHA512C2e, SHA512C2f, + SHA512C30, SHA512C31, SHA512C32, SHA512C33, + SHA512C34, SHA512C35, SHA512C36, SHA512C37, + SHA512C38, SHA512C39, SHA512C3a, SHA512C3b, + SHA512C3c, SHA512C3d, SHA512C3e, SHA512C3f, + SHA512C40, SHA512C41, SHA512C42, SHA512C43, + SHA512C44, SHA512C45, SHA512C46, SHA512C47, + SHA512C48, SHA512C49, SHA512C4a, SHA512C4b, + SHA512C4c, SHA512C4d, SHA512C4e, SHA512C4f, +}; + +__device__ static void sha512_transform (const u64 w[16], u64 dgst[8]) +{ + u64 a = dgst[0]; + u64 b = dgst[1]; + u64 c = dgst[2]; + u64 d = dgst[3]; + u64 e = dgst[4]; + u64 f = dgst[5]; + u64 g = dgst[6]; + u64 h = dgst[7]; + + u64 w0_t = w[ 0]; + u64 w1_t = w[ 1]; + u64 w2_t = w[ 2]; + u64 w3_t = w[ 3]; + u64 w4_t = w[ 4]; + u64 w5_t = w[ 5]; + u64 w6_t = w[ 6]; + u64 w7_t = w[ 7]; + u64 w8_t = w[ 8]; + u64 w9_t = w[ 9]; + u64 wa_t = w[10]; + u64 wb_t = w[11]; + u64 wc_t = w[12]; + u64 wd_t = w[13]; + u64 we_t = w[14]; + u64 wf_t = w[15]; + + #define ROUND_EXPAND() \ + { \ + w0_t = SHA512_EXPAND (we_t, w9_t, w1_t, w0_t); \ + w1_t = SHA512_EXPAND (wf_t, wa_t, w2_t, w1_t); \ + w2_t = SHA512_EXPAND (w0_t, wb_t, w3_t, w2_t); \ + w3_t = SHA512_EXPAND (w1_t, wc_t, w4_t, w3_t); \ + w4_t = SHA512_EXPAND (w2_t, wd_t, w5_t, w4_t); \ + w5_t = SHA512_EXPAND (w3_t, we_t, w6_t, w5_t); \ + w6_t = SHA512_EXPAND (w4_t, wf_t, w7_t, w6_t); \ + w7_t = SHA512_EXPAND (w5_t, w0_t, w8_t, w7_t); \ + w8_t = SHA512_EXPAND (w6_t, w1_t, w9_t, w8_t); \ + w9_t = SHA512_EXPAND (w7_t, w2_t, wa_t, w9_t); \ + wa_t = SHA512_EXPAND (w8_t, w3_t, wb_t, wa_t); \ + wb_t = SHA512_EXPAND (w9_t, w4_t, wc_t, wb_t); \ + wc_t = SHA512_EXPAND (wa_t, w5_t, wd_t, wc_t); \ + wd_t = SHA512_EXPAND (wb_t, w6_t, we_t, wd_t); \ + we_t = SHA512_EXPAND (wc_t, w7_t, wf_t, we_t); \ + wf_t = SHA512_EXPAND (wd_t, w8_t, w0_t, wf_t); \ + } + + #define ROUND_STEP(i) \ + { \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, a, b, c, d, e, f, g, h, w0_t, k_sha512[i + 0]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, h, a, b, c, d, e, f, g, w1_t, k_sha512[i + 1]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, g, h, a, b, c, d, e, f, w2_t, k_sha512[i + 2]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, f, g, h, a, b, c, d, e, w3_t, k_sha512[i + 3]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, e, f, g, h, a, b, c, d, w4_t, k_sha512[i + 4]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, d, e, f, g, h, a, b, c, w5_t, k_sha512[i + 5]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, c, d, e, f, g, h, a, b, w6_t, k_sha512[i + 6]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, b, c, d, e, f, g, h, a, w7_t, k_sha512[i + 7]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, a, b, c, d, e, f, g, h, w8_t, k_sha512[i + 8]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, h, a, b, c, d, e, f, g, w9_t, k_sha512[i + 9]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, g, h, a, b, c, d, e, f, wa_t, k_sha512[i + 10]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, f, g, h, a, b, c, d, e, wb_t, k_sha512[i + 11]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, e, f, g, h, a, b, c, d, wc_t, k_sha512[i + 12]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, d, e, f, g, h, a, b, c, wd_t, k_sha512[i + 13]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, c, d, e, f, g, h, a, b, we_t, k_sha512[i + 14]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, b, c, d, e, f, g, h, a, wf_t, k_sha512[i + 15]); \ + } + + ROUND_STEP (0); + + for (int i = 16; i < 80; i += 16) + { + ROUND_EXPAND (); ROUND_STEP (i); + } + + dgst[0] += a; + dgst[1] += b; + dgst[2] += c; + dgst[3] += d; + dgst[4] += e; + dgst[5] += f; + dgst[6] += g; + dgst[7] += h; +} + +__device__ static void hmac_run (const u64 w1[16], const u64 ipad[8], const u64 opad[8], u64 dgst[8]) +{ + dgst[0] = ipad[0]; + dgst[1] = ipad[1]; + dgst[2] = ipad[2]; + dgst[3] = ipad[3]; + dgst[4] = ipad[4]; + dgst[5] = ipad[5]; + dgst[6] = ipad[6]; + dgst[7] = ipad[7]; + + sha512_transform (w1, dgst); + + u64 w[16]; + + w[ 0] = dgst[0]; + w[ 1] = dgst[1]; + w[ 2] = dgst[2]; + w[ 3] = dgst[3]; + w[ 4] = dgst[4]; + w[ 5] = dgst[5]; + w[ 6] = dgst[6]; + w[ 7] = dgst[7]; + w[ 8] = 0x8000000000000000; + w[ 9] = 0; + w[10] = 0; + w[11] = 0; + w[12] = 0; + w[13] = 0; + w[14] = 0; + w[15] = (128 + 64) * 8; + + dgst[0] = opad[0]; + dgst[1] = opad[1]; + dgst[2] = opad[2]; + dgst[3] = opad[3]; + dgst[4] = opad[4]; + dgst[5] = opad[5]; + dgst[6] = opad[6]; + dgst[7] = opad[7]; + + sha512_transform (w, dgst); +} + +__device__ static void hmac_init (u64 w[16], u64 ipad[8], u64 opad[8]) +{ + w[ 0] ^= 0x3636363636363636; + w[ 1] ^= 0x3636363636363636; + w[ 2] ^= 0x3636363636363636; + w[ 3] ^= 0x3636363636363636; + w[ 4] ^= 0x3636363636363636; + w[ 5] ^= 0x3636363636363636; + w[ 6] ^= 0x3636363636363636; + w[ 7] ^= 0x3636363636363636; + w[ 8] ^= 0x3636363636363636; + w[ 9] ^= 0x3636363636363636; + w[10] ^= 0x3636363636363636; + w[11] ^= 0x3636363636363636; + w[12] ^= 0x3636363636363636; + w[13] ^= 0x3636363636363636; + w[14] ^= 0x3636363636363636; + w[15] ^= 0x3636363636363636; + + ipad[0] = SHA512M_A; + ipad[1] = SHA512M_B; + ipad[2] = SHA512M_C; + ipad[3] = SHA512M_D; + ipad[4] = SHA512M_E; + ipad[5] = SHA512M_F; + ipad[6] = SHA512M_G; + ipad[7] = SHA512M_H; + + sha512_transform (w, ipad); + + w[ 0] ^= 0x6a6a6a6a6a6a6a6a; + w[ 1] ^= 0x6a6a6a6a6a6a6a6a; + w[ 2] ^= 0x6a6a6a6a6a6a6a6a; + w[ 3] ^= 0x6a6a6a6a6a6a6a6a; + w[ 4] ^= 0x6a6a6a6a6a6a6a6a; + w[ 5] ^= 0x6a6a6a6a6a6a6a6a; + w[ 6] ^= 0x6a6a6a6a6a6a6a6a; + w[ 7] ^= 0x6a6a6a6a6a6a6a6a; + w[ 8] ^= 0x6a6a6a6a6a6a6a6a; + w[ 9] ^= 0x6a6a6a6a6a6a6a6a; + w[10] ^= 0x6a6a6a6a6a6a6a6a; + w[11] ^= 0x6a6a6a6a6a6a6a6a; + w[12] ^= 0x6a6a6a6a6a6a6a6a; + w[13] ^= 0x6a6a6a6a6a6a6a6a; + w[14] ^= 0x6a6a6a6a6a6a6a6a; + w[15] ^= 0x6a6a6a6a6a6a6a6a; + + opad[0] = SHA512M_A; + opad[1] = SHA512M_B; + opad[2] = SHA512M_C; + opad[3] = SHA512M_D; + opad[4] = SHA512M_E; + opad[5] = SHA512M_F; + opad[6] = SHA512M_G; + opad[7] = SHA512M_H; + + sha512_transform (w, opad); +} + +__device__ static u32 u8add (const u32 a, const u32 b) +{ + const u32 a1 = (a >> 0) & 0xff; + const u32 a2 = (a >> 8) & 0xff; + const u32 a3 = (a >> 16) & 0xff; + const u32 a4 = (a >> 24) & 0xff; + + const u32 b1 = (b >> 0) & 0xff; + const u32 b2 = (b >> 8) & 0xff; + const u32 b3 = (b >> 16) & 0xff; + const u32 b4 = (b >> 24) & 0xff; + + const u32 r1 = (a1 + b1) & 0xff; + const u32 r2 = (a2 + b2) & 0xff; + const u32 r3 = (a3 + b3) & 0xff; + const u32 r4 = (a4 + b4) & 0xff; + + const u32 r = r1 << 0 + | r2 << 8 + | r3 << 16 + | r4 << 24; + + return r; +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m06222_init (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, tc64_tmp_t *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const tc_t *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = pws[gid].i[ 8]; + w2[1] = pws[gid].i[ 9]; + w2[2] = pws[gid].i[10]; + w2[3] = pws[gid].i[11]; + + u32x w3[4]; + + w3[0] = pws[gid].i[12]; + w3[1] = pws[gid].i[13]; + w3[2] = pws[gid].i[14]; + w3[3] = pws[gid].i[15]; + + /** + * keyfile + */ + + w0[0] = u8add (w0[0], esalt_bufs[salt_pos].keyfile_buf[ 0]); + w0[1] = u8add (w0[1], esalt_bufs[salt_pos].keyfile_buf[ 1]); + w0[2] = u8add (w0[2], esalt_bufs[salt_pos].keyfile_buf[ 2]); + w0[3] = u8add (w0[3], esalt_bufs[salt_pos].keyfile_buf[ 3]); + w1[0] = u8add (w1[0], esalt_bufs[salt_pos].keyfile_buf[ 4]); + w1[1] = u8add (w1[1], esalt_bufs[salt_pos].keyfile_buf[ 5]); + w1[2] = u8add (w1[2], esalt_bufs[salt_pos].keyfile_buf[ 6]); + w1[3] = u8add (w1[3], esalt_bufs[salt_pos].keyfile_buf[ 7]); + w2[0] = u8add (w2[0], esalt_bufs[salt_pos].keyfile_buf[ 8]); + w2[1] = u8add (w2[1], esalt_bufs[salt_pos].keyfile_buf[ 9]); + w2[2] = u8add (w2[2], esalt_bufs[salt_pos].keyfile_buf[10]); + w2[3] = u8add (w2[3], esalt_bufs[salt_pos].keyfile_buf[11]); + w3[0] = u8add (w3[0], esalt_bufs[salt_pos].keyfile_buf[12]); + w3[1] = u8add (w3[1], esalt_bufs[salt_pos].keyfile_buf[13]); + w3[2] = u8add (w3[2], esalt_bufs[salt_pos].keyfile_buf[14]); + w3[3] = u8add (w3[3], esalt_bufs[salt_pos].keyfile_buf[15]); + + /** + * salt + */ + + u64 salt_buf[16]; + + // swap fehlt + + salt_buf[ 0] = ((u64) swap_workaround (esalt_bufs[salt_pos].salt_buf[ 0])) << 32 | (u64) swap_workaround (esalt_bufs[salt_pos].salt_buf[ 1]); + salt_buf[ 1] = ((u64) swap_workaround (esalt_bufs[salt_pos].salt_buf[ 2])) << 32 | (u64) swap_workaround (esalt_bufs[salt_pos].salt_buf[ 3]); + salt_buf[ 2] = ((u64) swap_workaround (esalt_bufs[salt_pos].salt_buf[ 4])) << 32 | (u64) swap_workaround (esalt_bufs[salt_pos].salt_buf[ 5]); + salt_buf[ 3] = ((u64) swap_workaround (esalt_bufs[salt_pos].salt_buf[ 6])) << 32 | (u64) swap_workaround (esalt_bufs[salt_pos].salt_buf[ 7]); + salt_buf[ 4] = ((u64) swap_workaround (esalt_bufs[salt_pos].salt_buf[ 8])) << 32 | (u64) swap_workaround (esalt_bufs[salt_pos].salt_buf[ 9]); + salt_buf[ 5] = ((u64) swap_workaround (esalt_bufs[salt_pos].salt_buf[10])) << 32 | (u64) swap_workaround (esalt_bufs[salt_pos].salt_buf[11]); + salt_buf[ 6] = ((u64) swap_workaround (esalt_bufs[salt_pos].salt_buf[12])) << 32 | (u64) swap_workaround (esalt_bufs[salt_pos].salt_buf[13]); + salt_buf[ 7] = ((u64) swap_workaround (esalt_bufs[salt_pos].salt_buf[14])) << 32 | (u64) swap_workaround (esalt_bufs[salt_pos].salt_buf[15]); + salt_buf[ 8] = 0; + salt_buf[ 9] = 0; + salt_buf[10] = 0; + salt_buf[11] = 0; + salt_buf[12] = 0; + salt_buf[13] = 0; + salt_buf[14] = 0; + salt_buf[15] = (128 + 64 + 4) * 8; + + const u32 truecrypt_mdlen = salt_bufs[0].truecrypt_mdlen; + + u64 w[16]; + + w[ 0] = ((u64) swap_workaround (w0[0])) << 32 | (u64) swap_workaround (w0[1]); + w[ 1] = ((u64) swap_workaround (w0[2])) << 32 | (u64) swap_workaround (w0[3]); + w[ 2] = ((u64) swap_workaround (w1[0])) << 32 | (u64) swap_workaround (w1[1]); + w[ 3] = ((u64) swap_workaround (w1[2])) << 32 | (u64) swap_workaround (w1[3]); + w[ 4] = ((u64) swap_workaround (w2[0])) << 32 | (u64) swap_workaround (w2[1]); + w[ 5] = ((u64) swap_workaround (w2[2])) << 32 | (u64) swap_workaround (w2[3]); + w[ 6] = ((u64) swap_workaround (w3[0])) << 32 | (u64) swap_workaround (w3[1]); + w[ 7] = ((u64) swap_workaround (w3[2])) << 32 | (u64) swap_workaround (w3[3]); + w[ 8] = 0; + w[ 9] = 0; + w[10] = 0; + w[11] = 0; + w[12] = 0; + w[13] = 0; + w[14] = 0; + w[15] = 0; + + u64 ipad[8]; + u64 opad[8]; + + hmac_init (w, ipad, opad); + + tmps[gid].ipad[0] = ipad[0]; + tmps[gid].ipad[1] = ipad[1]; + tmps[gid].ipad[2] = ipad[2]; + tmps[gid].ipad[3] = ipad[3]; + tmps[gid].ipad[4] = ipad[4]; + tmps[gid].ipad[5] = ipad[5]; + tmps[gid].ipad[6] = ipad[6]; + tmps[gid].ipad[7] = ipad[7]; + + tmps[gid].opad[0] = opad[0]; + tmps[gid].opad[1] = opad[1]; + tmps[gid].opad[2] = opad[2]; + tmps[gid].opad[3] = opad[3]; + tmps[gid].opad[4] = opad[4]; + tmps[gid].opad[5] = opad[5]; + tmps[gid].opad[6] = opad[6]; + tmps[gid].opad[7] = opad[7]; + + for (u32 i = 0, j = 1; i < (truecrypt_mdlen / 8 / 8); i += 8, j += 1) + { + salt_buf[8] = (u64) j << 32 | (u64) 0x80000000; + + u64 dgst[8]; + + hmac_run (salt_buf, ipad, opad, dgst); + + tmps[gid].dgst[i + 0] = dgst[0]; + tmps[gid].dgst[i + 1] = dgst[1]; + tmps[gid].dgst[i + 2] = dgst[2]; + tmps[gid].dgst[i + 3] = dgst[3]; + tmps[gid].dgst[i + 4] = dgst[4]; + tmps[gid].dgst[i + 5] = dgst[5]; + tmps[gid].dgst[i + 6] = dgst[6]; + tmps[gid].dgst[i + 7] = dgst[7]; + + tmps[gid].out[i + 0] = dgst[0]; + tmps[gid].out[i + 1] = dgst[1]; + tmps[gid].out[i + 2] = dgst[2]; + tmps[gid].out[i + 3] = dgst[3]; + tmps[gid].out[i + 4] = dgst[4]; + tmps[gid].out[i + 5] = dgst[5]; + tmps[gid].out[i + 6] = dgst[6]; + tmps[gid].out[i + 7] = dgst[7]; + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m06222_loop (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, tc64_tmp_t *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const tc_t *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + const u32 truecrypt_mdlen = salt_bufs[0].truecrypt_mdlen; + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u64 ipad[8]; + + ipad[0] = tmps[gid].ipad[0]; + ipad[1] = tmps[gid].ipad[1]; + ipad[2] = tmps[gid].ipad[2]; + ipad[3] = tmps[gid].ipad[3]; + ipad[4] = tmps[gid].ipad[4]; + ipad[5] = tmps[gid].ipad[5]; + ipad[6] = tmps[gid].ipad[6]; + ipad[7] = tmps[gid].ipad[7]; + + u64 opad[8]; + + opad[0] = tmps[gid].opad[0]; + opad[1] = tmps[gid].opad[1]; + opad[2] = tmps[gid].opad[2]; + opad[3] = tmps[gid].opad[3]; + opad[4] = tmps[gid].opad[4]; + opad[5] = tmps[gid].opad[5]; + opad[6] = tmps[gid].opad[6]; + opad[7] = tmps[gid].opad[7]; + + for (u32 i = 0; i < (truecrypt_mdlen / 8 / 8); i += 8) + { + u64 dgst[8]; + + dgst[0] = tmps[gid].dgst[i + 0]; + dgst[1] = tmps[gid].dgst[i + 1]; + dgst[2] = tmps[gid].dgst[i + 2]; + dgst[3] = tmps[gid].dgst[i + 3]; + dgst[4] = tmps[gid].dgst[i + 4]; + dgst[5] = tmps[gid].dgst[i + 5]; + dgst[6] = tmps[gid].dgst[i + 6]; + dgst[7] = tmps[gid].dgst[i + 7]; + + u64 out[8]; + + out[0] = tmps[gid].out[i + 0]; + out[1] = tmps[gid].out[i + 1]; + out[2] = tmps[gid].out[i + 2]; + out[3] = tmps[gid].out[i + 3]; + out[4] = tmps[gid].out[i + 4]; + out[5] = tmps[gid].out[i + 5]; + out[6] = tmps[gid].out[i + 6]; + out[7] = tmps[gid].out[i + 7]; + + for (u32 j = 0; j < loop_cnt; j++) + { + u64 w[16]; + + w[ 0] = dgst[0]; + w[ 1] = dgst[1]; + w[ 2] = dgst[2]; + w[ 3] = dgst[3]; + w[ 4] = dgst[4]; + w[ 5] = dgst[5]; + w[ 6] = dgst[6]; + w[ 7] = dgst[7]; + w[ 8] = 0x8000000000000000; + w[ 9] = 0; + w[10] = 0; + w[11] = 0; + w[12] = 0; + w[13] = 0; + w[14] = 0; + w[15] = (128 + 64) * 8; + + hmac_run (w, ipad, opad, dgst); + + out[0] ^= dgst[0]; + out[1] ^= dgst[1]; + out[2] ^= dgst[2]; + out[3] ^= dgst[3]; + out[4] ^= dgst[4]; + out[5] ^= dgst[5]; + out[6] ^= dgst[6]; + out[7] ^= dgst[7]; + } + + tmps[gid].dgst[i + 0] = dgst[0]; + tmps[gid].dgst[i + 1] = dgst[1]; + tmps[gid].dgst[i + 2] = dgst[2]; + tmps[gid].dgst[i + 3] = dgst[3]; + tmps[gid].dgst[i + 4] = dgst[4]; + tmps[gid].dgst[i + 5] = dgst[5]; + tmps[gid].dgst[i + 6] = dgst[6]; + tmps[gid].dgst[i + 7] = dgst[7]; + + tmps[gid].out[i + 0] = out[0]; + tmps[gid].out[i + 1] = out[1]; + tmps[gid].out[i + 2] = out[2]; + tmps[gid].out[i + 3] = out[3]; + tmps[gid].out[i + 4] = out[4]; + tmps[gid].out[i + 5] = out[5]; + tmps[gid].out[i + 6] = out[6]; + tmps[gid].out[i + 7] = out[7]; + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m06222_comp (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, tc64_tmp_t *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const tc_t *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + const u32 lid = threadIdx.x; + + if (gid >= gid_max) return; + + u32 ukey1[8]; + + ukey1[0] = swap_workaround (h32_from_64 (tmps[gid].out[ 0])); + ukey1[1] = swap_workaround (l32_from_64 (tmps[gid].out[ 0])); + ukey1[2] = swap_workaround (h32_from_64 (tmps[gid].out[ 1])); + ukey1[3] = swap_workaround (l32_from_64 (tmps[gid].out[ 1])); + ukey1[4] = swap_workaround (h32_from_64 (tmps[gid].out[ 2])); + ukey1[5] = swap_workaround (l32_from_64 (tmps[gid].out[ 2])); + ukey1[6] = swap_workaround (h32_from_64 (tmps[gid].out[ 3])); + ukey1[7] = swap_workaround (l32_from_64 (tmps[gid].out[ 3])); + + u32 ukey2[8]; + + ukey2[0] = swap_workaround (h32_from_64 (tmps[gid].out[ 4])); + ukey2[1] = swap_workaround (l32_from_64 (tmps[gid].out[ 4])); + ukey2[2] = swap_workaround (h32_from_64 (tmps[gid].out[ 5])); + ukey2[3] = swap_workaround (l32_from_64 (tmps[gid].out[ 5])); + ukey2[4] = swap_workaround (h32_from_64 (tmps[gid].out[ 6])); + ukey2[5] = swap_workaround (l32_from_64 (tmps[gid].out[ 6])); + ukey2[6] = swap_workaround (h32_from_64 (tmps[gid].out[ 7])); + ukey2[7] = swap_workaround (l32_from_64 (tmps[gid].out[ 7])); + + u32 data[4]; + + data[0] = esalt_bufs[0].data_buf[0]; + data[1] = esalt_bufs[0].data_buf[1]; + data[2] = esalt_bufs[0].data_buf[2]; + data[3] = esalt_bufs[0].data_buf[3]; + + u32 tmp[4]; + + { + tmp[0] = data[0]; + tmp[1] = data[1]; + tmp[2] = data[2]; + tmp[3] = data[3]; + + aes256_decrypt_xts (ukey1, ukey2, tmp, tmp); + + if (((tmp[0] == 0x45555254) && (tmp[3] == 0)) || ((tmp[0] == 0x45555254) && ((tmp[1] >> 16) <= 5))) + { + mark_hash_s0 (plains_buf, hashes_shown, 0, gid, 0); + + d_return_buf[lid] = 1; + } + } + + { + tmp[0] = data[0]; + tmp[1] = data[1]; + tmp[2] = data[2]; + tmp[3] = data[3]; + + serpent256_decrypt_xts (ukey1, ukey2, tmp, tmp); + + if (((tmp[0] == 0x45555254) && (tmp[3] == 0)) || ((tmp[0] == 0x45555254) && ((tmp[1] >> 16) <= 5))) + { + mark_hash_s0 (plains_buf, hashes_shown, 0, gid, 0); + + d_return_buf[lid] = 1; + } + } + + { + tmp[0] = data[0]; + tmp[1] = data[1]; + tmp[2] = data[2]; + tmp[3] = data[3]; + + twofish256_decrypt_xts (ukey1, ukey2, tmp, tmp); + + if (((tmp[0] == 0x45555254) && (tmp[3] == 0)) || ((tmp[0] == 0x45555254) && ((tmp[1] >> 16) <= 5))) + { + mark_hash_s0 (plains_buf, hashes_shown, 0, gid, 0); + + d_return_buf[lid] = 1; + } + } + + u32 ukey3[8]; + + ukey3[0] = swap_workaround (h32_from_64 (tmps[gid].out[ 8])); + ukey3[1] = swap_workaround (l32_from_64 (tmps[gid].out[ 8])); + ukey3[2] = swap_workaround (h32_from_64 (tmps[gid].out[ 9])); + ukey3[3] = swap_workaround (l32_from_64 (tmps[gid].out[ 9])); + ukey3[4] = swap_workaround (h32_from_64 (tmps[gid].out[10])); + ukey3[5] = swap_workaround (l32_from_64 (tmps[gid].out[10])); + ukey3[6] = swap_workaround (h32_from_64 (tmps[gid].out[11])); + ukey3[7] = swap_workaround (l32_from_64 (tmps[gid].out[11])); + + u32 ukey4[8]; + + ukey4[0] = swap_workaround (h32_from_64 (tmps[gid].out[12])); + ukey4[1] = swap_workaround (l32_from_64 (tmps[gid].out[12])); + ukey4[2] = swap_workaround (h32_from_64 (tmps[gid].out[13])); + ukey4[3] = swap_workaround (l32_from_64 (tmps[gid].out[13])); + ukey4[4] = swap_workaround (h32_from_64 (tmps[gid].out[14])); + ukey4[5] = swap_workaround (l32_from_64 (tmps[gid].out[14])); + ukey4[6] = swap_workaround (h32_from_64 (tmps[gid].out[15])); + ukey4[7] = swap_workaround (l32_from_64 (tmps[gid].out[15])); + + { + tmp[0] = data[0]; + tmp[1] = data[1]; + tmp[2] = data[2]; + tmp[3] = data[3]; + + aes256_decrypt_xts (ukey2, ukey4, tmp, tmp); + twofish256_decrypt_xts (ukey1, ukey3, tmp, tmp); + + if (((tmp[0] == 0x45555254) && (tmp[3] == 0)) || ((tmp[0] == 0x45555254) && ((tmp[1] >> 16) <= 5))) + { + mark_hash_s0 (plains_buf, hashes_shown, 0, gid, 0); + + d_return_buf[lid] = 1; + } + } + + { + tmp[0] = data[0]; + tmp[1] = data[1]; + tmp[2] = data[2]; + tmp[3] = data[3]; + + serpent256_decrypt_xts (ukey2, ukey4, tmp, tmp); + aes256_decrypt_xts (ukey1, ukey3, tmp, tmp); + + if (((tmp[0] == 0x45555254) && (tmp[3] == 0)) || ((tmp[0] == 0x45555254) && ((tmp[1] >> 16) <= 5))) + { + mark_hash_s0 (plains_buf, hashes_shown, 0, gid, 0); + + d_return_buf[lid] = 1; + } + } + + { + tmp[0] = data[0]; + tmp[1] = data[1]; + tmp[2] = data[2]; + tmp[3] = data[3]; + + twofish256_decrypt_xts (ukey2, ukey4, tmp, tmp); + serpent256_decrypt_xts (ukey1, ukey3, tmp, tmp); + + if (((tmp[0] == 0x45555254) && (tmp[3] == 0)) || ((tmp[0] == 0x45555254) && ((tmp[1] >> 16) <= 5))) + { + mark_hash_s0 (plains_buf, hashes_shown, 0, gid, 0); + + d_return_buf[lid] = 1; + } + } +} diff --git a/nv/m06223.cu b/nv/m06223.cu new file mode 100644 index 0000000000..b2b9093ede --- /dev/null +++ b/nv/m06223.cu @@ -0,0 +1,752 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _SHA512_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW2 +#define VECT_SIZE1 +#endif + +#define DGST_R0 0 +#define DGST_R1 1 +#define DGST_R2 2 +#define DGST_R3 3 + +#include "include/kernel_functions.c" +#include "types_nv.c" +#include "common_nv.c" + +#include "gpu_aes256_nv.c" +#include "gpu_twofish256_nv.c" +#include "gpu_serpent256_nv.c" + +__device__ __constant__ u64 k_sha512[80] = +{ + SHA512C00, SHA512C01, SHA512C02, SHA512C03, + SHA512C04, SHA512C05, SHA512C06, SHA512C07, + SHA512C08, SHA512C09, SHA512C0a, SHA512C0b, + SHA512C0c, SHA512C0d, SHA512C0e, SHA512C0f, + SHA512C10, SHA512C11, SHA512C12, SHA512C13, + SHA512C14, SHA512C15, SHA512C16, SHA512C17, + SHA512C18, SHA512C19, SHA512C1a, SHA512C1b, + SHA512C1c, SHA512C1d, SHA512C1e, SHA512C1f, + SHA512C20, SHA512C21, SHA512C22, SHA512C23, + SHA512C24, SHA512C25, SHA512C26, SHA512C27, + SHA512C28, SHA512C29, SHA512C2a, SHA512C2b, + SHA512C2c, SHA512C2d, SHA512C2e, SHA512C2f, + SHA512C30, SHA512C31, SHA512C32, SHA512C33, + SHA512C34, SHA512C35, SHA512C36, SHA512C37, + SHA512C38, SHA512C39, SHA512C3a, SHA512C3b, + SHA512C3c, SHA512C3d, SHA512C3e, SHA512C3f, + SHA512C40, SHA512C41, SHA512C42, SHA512C43, + SHA512C44, SHA512C45, SHA512C46, SHA512C47, + SHA512C48, SHA512C49, SHA512C4a, SHA512C4b, + SHA512C4c, SHA512C4d, SHA512C4e, SHA512C4f, +}; + +__device__ static void sha512_transform (const u64 w[16], u64 dgst[8]) +{ + u64 a = dgst[0]; + u64 b = dgst[1]; + u64 c = dgst[2]; + u64 d = dgst[3]; + u64 e = dgst[4]; + u64 f = dgst[5]; + u64 g = dgst[6]; + u64 h = dgst[7]; + + u64 w0_t = w[ 0]; + u64 w1_t = w[ 1]; + u64 w2_t = w[ 2]; + u64 w3_t = w[ 3]; + u64 w4_t = w[ 4]; + u64 w5_t = w[ 5]; + u64 w6_t = w[ 6]; + u64 w7_t = w[ 7]; + u64 w8_t = w[ 8]; + u64 w9_t = w[ 9]; + u64 wa_t = w[10]; + u64 wb_t = w[11]; + u64 wc_t = w[12]; + u64 wd_t = w[13]; + u64 we_t = w[14]; + u64 wf_t = w[15]; + + #define ROUND_EXPAND() \ + { \ + w0_t = SHA512_EXPAND (we_t, w9_t, w1_t, w0_t); \ + w1_t = SHA512_EXPAND (wf_t, wa_t, w2_t, w1_t); \ + w2_t = SHA512_EXPAND (w0_t, wb_t, w3_t, w2_t); \ + w3_t = SHA512_EXPAND (w1_t, wc_t, w4_t, w3_t); \ + w4_t = SHA512_EXPAND (w2_t, wd_t, w5_t, w4_t); \ + w5_t = SHA512_EXPAND (w3_t, we_t, w6_t, w5_t); \ + w6_t = SHA512_EXPAND (w4_t, wf_t, w7_t, w6_t); \ + w7_t = SHA512_EXPAND (w5_t, w0_t, w8_t, w7_t); \ + w8_t = SHA512_EXPAND (w6_t, w1_t, w9_t, w8_t); \ + w9_t = SHA512_EXPAND (w7_t, w2_t, wa_t, w9_t); \ + wa_t = SHA512_EXPAND (w8_t, w3_t, wb_t, wa_t); \ + wb_t = SHA512_EXPAND (w9_t, w4_t, wc_t, wb_t); \ + wc_t = SHA512_EXPAND (wa_t, w5_t, wd_t, wc_t); \ + wd_t = SHA512_EXPAND (wb_t, w6_t, we_t, wd_t); \ + we_t = SHA512_EXPAND (wc_t, w7_t, wf_t, we_t); \ + wf_t = SHA512_EXPAND (wd_t, w8_t, w0_t, wf_t); \ + } + + #define ROUND_STEP(i) \ + { \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, a, b, c, d, e, f, g, h, w0_t, k_sha512[i + 0]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, h, a, b, c, d, e, f, g, w1_t, k_sha512[i + 1]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, g, h, a, b, c, d, e, f, w2_t, k_sha512[i + 2]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, f, g, h, a, b, c, d, e, w3_t, k_sha512[i + 3]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, e, f, g, h, a, b, c, d, w4_t, k_sha512[i + 4]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, d, e, f, g, h, a, b, c, w5_t, k_sha512[i + 5]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, c, d, e, f, g, h, a, b, w6_t, k_sha512[i + 6]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, b, c, d, e, f, g, h, a, w7_t, k_sha512[i + 7]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, a, b, c, d, e, f, g, h, w8_t, k_sha512[i + 8]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, h, a, b, c, d, e, f, g, w9_t, k_sha512[i + 9]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, g, h, a, b, c, d, e, f, wa_t, k_sha512[i + 10]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, f, g, h, a, b, c, d, e, wb_t, k_sha512[i + 11]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, e, f, g, h, a, b, c, d, wc_t, k_sha512[i + 12]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, d, e, f, g, h, a, b, c, wd_t, k_sha512[i + 13]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, c, d, e, f, g, h, a, b, we_t, k_sha512[i + 14]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, b, c, d, e, f, g, h, a, wf_t, k_sha512[i + 15]); \ + } + + ROUND_STEP (0); + + for (int i = 16; i < 80; i += 16) + { + ROUND_EXPAND (); ROUND_STEP (i); + } + + dgst[0] += a; + dgst[1] += b; + dgst[2] += c; + dgst[3] += d; + dgst[4] += e; + dgst[5] += f; + dgst[6] += g; + dgst[7] += h; +} + +__device__ static void hmac_run (const u64 w1[16], const u64 ipad[8], const u64 opad[8], u64 dgst[8]) +{ + dgst[0] = ipad[0]; + dgst[1] = ipad[1]; + dgst[2] = ipad[2]; + dgst[3] = ipad[3]; + dgst[4] = ipad[4]; + dgst[5] = ipad[5]; + dgst[6] = ipad[6]; + dgst[7] = ipad[7]; + + sha512_transform (w1, dgst); + + u64 w[16]; + + w[ 0] = dgst[0]; + w[ 1] = dgst[1]; + w[ 2] = dgst[2]; + w[ 3] = dgst[3]; + w[ 4] = dgst[4]; + w[ 5] = dgst[5]; + w[ 6] = dgst[6]; + w[ 7] = dgst[7]; + w[ 8] = 0x8000000000000000; + w[ 9] = 0; + w[10] = 0; + w[11] = 0; + w[12] = 0; + w[13] = 0; + w[14] = 0; + w[15] = (128 + 64) * 8; + + dgst[0] = opad[0]; + dgst[1] = opad[1]; + dgst[2] = opad[2]; + dgst[3] = opad[3]; + dgst[4] = opad[4]; + dgst[5] = opad[5]; + dgst[6] = opad[6]; + dgst[7] = opad[7]; + + sha512_transform (w, dgst); +} + +__device__ static void hmac_init (u64 w[16], u64 ipad[8], u64 opad[8]) +{ + w[ 0] ^= 0x3636363636363636; + w[ 1] ^= 0x3636363636363636; + w[ 2] ^= 0x3636363636363636; + w[ 3] ^= 0x3636363636363636; + w[ 4] ^= 0x3636363636363636; + w[ 5] ^= 0x3636363636363636; + w[ 6] ^= 0x3636363636363636; + w[ 7] ^= 0x3636363636363636; + w[ 8] ^= 0x3636363636363636; + w[ 9] ^= 0x3636363636363636; + w[10] ^= 0x3636363636363636; + w[11] ^= 0x3636363636363636; + w[12] ^= 0x3636363636363636; + w[13] ^= 0x3636363636363636; + w[14] ^= 0x3636363636363636; + w[15] ^= 0x3636363636363636; + + ipad[0] = SHA512M_A; + ipad[1] = SHA512M_B; + ipad[2] = SHA512M_C; + ipad[3] = SHA512M_D; + ipad[4] = SHA512M_E; + ipad[5] = SHA512M_F; + ipad[6] = SHA512M_G; + ipad[7] = SHA512M_H; + + sha512_transform (w, ipad); + + w[ 0] ^= 0x6a6a6a6a6a6a6a6a; + w[ 1] ^= 0x6a6a6a6a6a6a6a6a; + w[ 2] ^= 0x6a6a6a6a6a6a6a6a; + w[ 3] ^= 0x6a6a6a6a6a6a6a6a; + w[ 4] ^= 0x6a6a6a6a6a6a6a6a; + w[ 5] ^= 0x6a6a6a6a6a6a6a6a; + w[ 6] ^= 0x6a6a6a6a6a6a6a6a; + w[ 7] ^= 0x6a6a6a6a6a6a6a6a; + w[ 8] ^= 0x6a6a6a6a6a6a6a6a; + w[ 9] ^= 0x6a6a6a6a6a6a6a6a; + w[10] ^= 0x6a6a6a6a6a6a6a6a; + w[11] ^= 0x6a6a6a6a6a6a6a6a; + w[12] ^= 0x6a6a6a6a6a6a6a6a; + w[13] ^= 0x6a6a6a6a6a6a6a6a; + w[14] ^= 0x6a6a6a6a6a6a6a6a; + w[15] ^= 0x6a6a6a6a6a6a6a6a; + + opad[0] = SHA512M_A; + opad[1] = SHA512M_B; + opad[2] = SHA512M_C; + opad[3] = SHA512M_D; + opad[4] = SHA512M_E; + opad[5] = SHA512M_F; + opad[6] = SHA512M_G; + opad[7] = SHA512M_H; + + sha512_transform (w, opad); +} + +__device__ static u32 u8add (const u32 a, const u32 b) +{ + const u32 a1 = (a >> 0) & 0xff; + const u32 a2 = (a >> 8) & 0xff; + const u32 a3 = (a >> 16) & 0xff; + const u32 a4 = (a >> 24) & 0xff; + + const u32 b1 = (b >> 0) & 0xff; + const u32 b2 = (b >> 8) & 0xff; + const u32 b3 = (b >> 16) & 0xff; + const u32 b4 = (b >> 24) & 0xff; + + const u32 r1 = (a1 + b1) & 0xff; + const u32 r2 = (a2 + b2) & 0xff; + const u32 r3 = (a3 + b3) & 0xff; + const u32 r4 = (a4 + b4) & 0xff; + + const u32 r = r1 << 0 + | r2 << 8 + | r3 << 16 + | r4 << 24; + + return r; +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m06223_init (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, tc64_tmp_t *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const tc_t *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = pws[gid].i[ 8]; + w2[1] = pws[gid].i[ 9]; + w2[2] = pws[gid].i[10]; + w2[3] = pws[gid].i[11]; + + u32x w3[4]; + + w3[0] = pws[gid].i[12]; + w3[1] = pws[gid].i[13]; + w3[2] = pws[gid].i[14]; + w3[3] = pws[gid].i[15]; + + /** + * keyfile + */ + + w0[0] = u8add (w0[0], esalt_bufs[salt_pos].keyfile_buf[ 0]); + w0[1] = u8add (w0[1], esalt_bufs[salt_pos].keyfile_buf[ 1]); + w0[2] = u8add (w0[2], esalt_bufs[salt_pos].keyfile_buf[ 2]); + w0[3] = u8add (w0[3], esalt_bufs[salt_pos].keyfile_buf[ 3]); + w1[0] = u8add (w1[0], esalt_bufs[salt_pos].keyfile_buf[ 4]); + w1[1] = u8add (w1[1], esalt_bufs[salt_pos].keyfile_buf[ 5]); + w1[2] = u8add (w1[2], esalt_bufs[salt_pos].keyfile_buf[ 6]); + w1[3] = u8add (w1[3], esalt_bufs[salt_pos].keyfile_buf[ 7]); + w2[0] = u8add (w2[0], esalt_bufs[salt_pos].keyfile_buf[ 8]); + w2[1] = u8add (w2[1], esalt_bufs[salt_pos].keyfile_buf[ 9]); + w2[2] = u8add (w2[2], esalt_bufs[salt_pos].keyfile_buf[10]); + w2[3] = u8add (w2[3], esalt_bufs[salt_pos].keyfile_buf[11]); + w3[0] = u8add (w3[0], esalt_bufs[salt_pos].keyfile_buf[12]); + w3[1] = u8add (w3[1], esalt_bufs[salt_pos].keyfile_buf[13]); + w3[2] = u8add (w3[2], esalt_bufs[salt_pos].keyfile_buf[14]); + w3[3] = u8add (w3[3], esalt_bufs[salt_pos].keyfile_buf[15]); + + /** + * salt + */ + + u64 salt_buf[16]; + + // swap fehlt + + salt_buf[ 0] = ((u64) swap_workaround (esalt_bufs[salt_pos].salt_buf[ 0])) << 32 | (u64) swap_workaround (esalt_bufs[salt_pos].salt_buf[ 1]); + salt_buf[ 1] = ((u64) swap_workaround (esalt_bufs[salt_pos].salt_buf[ 2])) << 32 | (u64) swap_workaround (esalt_bufs[salt_pos].salt_buf[ 3]); + salt_buf[ 2] = ((u64) swap_workaround (esalt_bufs[salt_pos].salt_buf[ 4])) << 32 | (u64) swap_workaround (esalt_bufs[salt_pos].salt_buf[ 5]); + salt_buf[ 3] = ((u64) swap_workaround (esalt_bufs[salt_pos].salt_buf[ 6])) << 32 | (u64) swap_workaround (esalt_bufs[salt_pos].salt_buf[ 7]); + salt_buf[ 4] = ((u64) swap_workaround (esalt_bufs[salt_pos].salt_buf[ 8])) << 32 | (u64) swap_workaround (esalt_bufs[salt_pos].salt_buf[ 9]); + salt_buf[ 5] = ((u64) swap_workaround (esalt_bufs[salt_pos].salt_buf[10])) << 32 | (u64) swap_workaround (esalt_bufs[salt_pos].salt_buf[11]); + salt_buf[ 6] = ((u64) swap_workaround (esalt_bufs[salt_pos].salt_buf[12])) << 32 | (u64) swap_workaround (esalt_bufs[salt_pos].salt_buf[13]); + salt_buf[ 7] = ((u64) swap_workaround (esalt_bufs[salt_pos].salt_buf[14])) << 32 | (u64) swap_workaround (esalt_bufs[salt_pos].salt_buf[15]); + salt_buf[ 8] = 0; + salt_buf[ 9] = 0; + salt_buf[10] = 0; + salt_buf[11] = 0; + salt_buf[12] = 0; + salt_buf[13] = 0; + salt_buf[14] = 0; + salt_buf[15] = (128 + 64 + 4) * 8; + + const u32 truecrypt_mdlen = salt_bufs[0].truecrypt_mdlen; + + u64 w[16]; + + w[ 0] = ((u64) swap_workaround (w0[0])) << 32 | (u64) swap_workaround (w0[1]); + w[ 1] = ((u64) swap_workaround (w0[2])) << 32 | (u64) swap_workaround (w0[3]); + w[ 2] = ((u64) swap_workaround (w1[0])) << 32 | (u64) swap_workaround (w1[1]); + w[ 3] = ((u64) swap_workaround (w1[2])) << 32 | (u64) swap_workaround (w1[3]); + w[ 4] = ((u64) swap_workaround (w2[0])) << 32 | (u64) swap_workaround (w2[1]); + w[ 5] = ((u64) swap_workaround (w2[2])) << 32 | (u64) swap_workaround (w2[3]); + w[ 6] = ((u64) swap_workaround (w3[0])) << 32 | (u64) swap_workaround (w3[1]); + w[ 7] = ((u64) swap_workaround (w3[2])) << 32 | (u64) swap_workaround (w3[3]); + w[ 8] = 0; + w[ 9] = 0; + w[10] = 0; + w[11] = 0; + w[12] = 0; + w[13] = 0; + w[14] = 0; + w[15] = 0; + + u64 ipad[8]; + u64 opad[8]; + + hmac_init (w, ipad, opad); + + tmps[gid].ipad[0] = ipad[0]; + tmps[gid].ipad[1] = ipad[1]; + tmps[gid].ipad[2] = ipad[2]; + tmps[gid].ipad[3] = ipad[3]; + tmps[gid].ipad[4] = ipad[4]; + tmps[gid].ipad[5] = ipad[5]; + tmps[gid].ipad[6] = ipad[6]; + tmps[gid].ipad[7] = ipad[7]; + + tmps[gid].opad[0] = opad[0]; + tmps[gid].opad[1] = opad[1]; + tmps[gid].opad[2] = opad[2]; + tmps[gid].opad[3] = opad[3]; + tmps[gid].opad[4] = opad[4]; + tmps[gid].opad[5] = opad[5]; + tmps[gid].opad[6] = opad[6]; + tmps[gid].opad[7] = opad[7]; + + for (u32 i = 0, j = 1; i < (truecrypt_mdlen / 8 / 8); i += 8, j += 1) + { + salt_buf[8] = (u64) j << 32 | (u64) 0x80000000; + + u64 dgst[8]; + + hmac_run (salt_buf, ipad, opad, dgst); + + tmps[gid].dgst[i + 0] = dgst[0]; + tmps[gid].dgst[i + 1] = dgst[1]; + tmps[gid].dgst[i + 2] = dgst[2]; + tmps[gid].dgst[i + 3] = dgst[3]; + tmps[gid].dgst[i + 4] = dgst[4]; + tmps[gid].dgst[i + 5] = dgst[5]; + tmps[gid].dgst[i + 6] = dgst[6]; + tmps[gid].dgst[i + 7] = dgst[7]; + + tmps[gid].out[i + 0] = dgst[0]; + tmps[gid].out[i + 1] = dgst[1]; + tmps[gid].out[i + 2] = dgst[2]; + tmps[gid].out[i + 3] = dgst[3]; + tmps[gid].out[i + 4] = dgst[4]; + tmps[gid].out[i + 5] = dgst[5]; + tmps[gid].out[i + 6] = dgst[6]; + tmps[gid].out[i + 7] = dgst[7]; + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m06223_loop (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, tc64_tmp_t *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const tc_t *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + const u32 truecrypt_mdlen = salt_bufs[0].truecrypt_mdlen; + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u64 ipad[8]; + + ipad[0] = tmps[gid].ipad[0]; + ipad[1] = tmps[gid].ipad[1]; + ipad[2] = tmps[gid].ipad[2]; + ipad[3] = tmps[gid].ipad[3]; + ipad[4] = tmps[gid].ipad[4]; + ipad[5] = tmps[gid].ipad[5]; + ipad[6] = tmps[gid].ipad[6]; + ipad[7] = tmps[gid].ipad[7]; + + u64 opad[8]; + + opad[0] = tmps[gid].opad[0]; + opad[1] = tmps[gid].opad[1]; + opad[2] = tmps[gid].opad[2]; + opad[3] = tmps[gid].opad[3]; + opad[4] = tmps[gid].opad[4]; + opad[5] = tmps[gid].opad[5]; + opad[6] = tmps[gid].opad[6]; + opad[7] = tmps[gid].opad[7]; + + for (u32 i = 0; i < (truecrypt_mdlen / 8 / 8); i += 8) + { + u64 dgst[8]; + + dgst[0] = tmps[gid].dgst[i + 0]; + dgst[1] = tmps[gid].dgst[i + 1]; + dgst[2] = tmps[gid].dgst[i + 2]; + dgst[3] = tmps[gid].dgst[i + 3]; + dgst[4] = tmps[gid].dgst[i + 4]; + dgst[5] = tmps[gid].dgst[i + 5]; + dgst[6] = tmps[gid].dgst[i + 6]; + dgst[7] = tmps[gid].dgst[i + 7]; + + u64 out[8]; + + out[0] = tmps[gid].out[i + 0]; + out[1] = tmps[gid].out[i + 1]; + out[2] = tmps[gid].out[i + 2]; + out[3] = tmps[gid].out[i + 3]; + out[4] = tmps[gid].out[i + 4]; + out[5] = tmps[gid].out[i + 5]; + out[6] = tmps[gid].out[i + 6]; + out[7] = tmps[gid].out[i + 7]; + + for (u32 j = 0; j < loop_cnt; j++) + { + u64 w[16]; + + w[ 0] = dgst[0]; + w[ 1] = dgst[1]; + w[ 2] = dgst[2]; + w[ 3] = dgst[3]; + w[ 4] = dgst[4]; + w[ 5] = dgst[5]; + w[ 6] = dgst[6]; + w[ 7] = dgst[7]; + w[ 8] = 0x8000000000000000; + w[ 9] = 0; + w[10] = 0; + w[11] = 0; + w[12] = 0; + w[13] = 0; + w[14] = 0; + w[15] = (128 + 64) * 8; + + hmac_run (w, ipad, opad, dgst); + + out[0] ^= dgst[0]; + out[1] ^= dgst[1]; + out[2] ^= dgst[2]; + out[3] ^= dgst[3]; + out[4] ^= dgst[4]; + out[5] ^= dgst[5]; + out[6] ^= dgst[6]; + out[7] ^= dgst[7]; + } + + tmps[gid].dgst[i + 0] = dgst[0]; + tmps[gid].dgst[i + 1] = dgst[1]; + tmps[gid].dgst[i + 2] = dgst[2]; + tmps[gid].dgst[i + 3] = dgst[3]; + tmps[gid].dgst[i + 4] = dgst[4]; + tmps[gid].dgst[i + 5] = dgst[5]; + tmps[gid].dgst[i + 6] = dgst[6]; + tmps[gid].dgst[i + 7] = dgst[7]; + + tmps[gid].out[i + 0] = out[0]; + tmps[gid].out[i + 1] = out[1]; + tmps[gid].out[i + 2] = out[2]; + tmps[gid].out[i + 3] = out[3]; + tmps[gid].out[i + 4] = out[4]; + tmps[gid].out[i + 5] = out[5]; + tmps[gid].out[i + 6] = out[6]; + tmps[gid].out[i + 7] = out[7]; + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m06223_comp (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, tc64_tmp_t *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const tc_t *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + const u32 lid = threadIdx.x; + + if (gid >= gid_max) return; + + u32 ukey1[8]; + + ukey1[0] = swap_workaround (h32_from_64 (tmps[gid].out[ 0])); + ukey1[1] = swap_workaround (l32_from_64 (tmps[gid].out[ 0])); + ukey1[2] = swap_workaround (h32_from_64 (tmps[gid].out[ 1])); + ukey1[3] = swap_workaround (l32_from_64 (tmps[gid].out[ 1])); + ukey1[4] = swap_workaround (h32_from_64 (tmps[gid].out[ 2])); + ukey1[5] = swap_workaround (l32_from_64 (tmps[gid].out[ 2])); + ukey1[6] = swap_workaround (h32_from_64 (tmps[gid].out[ 3])); + ukey1[7] = swap_workaround (l32_from_64 (tmps[gid].out[ 3])); + + u32 ukey2[8]; + + ukey2[0] = swap_workaround (h32_from_64 (tmps[gid].out[ 4])); + ukey2[1] = swap_workaround (l32_from_64 (tmps[gid].out[ 4])); + ukey2[2] = swap_workaround (h32_from_64 (tmps[gid].out[ 5])); + ukey2[3] = swap_workaround (l32_from_64 (tmps[gid].out[ 5])); + ukey2[4] = swap_workaround (h32_from_64 (tmps[gid].out[ 6])); + ukey2[5] = swap_workaround (l32_from_64 (tmps[gid].out[ 6])); + ukey2[6] = swap_workaround (h32_from_64 (tmps[gid].out[ 7])); + ukey2[7] = swap_workaround (l32_from_64 (tmps[gid].out[ 7])); + + u32 data[4]; + + data[0] = esalt_bufs[0].data_buf[0]; + data[1] = esalt_bufs[0].data_buf[1]; + data[2] = esalt_bufs[0].data_buf[2]; + data[3] = esalt_bufs[0].data_buf[3]; + + u32 tmp[4]; + + { + tmp[0] = data[0]; + tmp[1] = data[1]; + tmp[2] = data[2]; + tmp[3] = data[3]; + + aes256_decrypt_xts (ukey1, ukey2, tmp, tmp); + + if (((tmp[0] == 0x45555254) && (tmp[3] == 0)) || ((tmp[0] == 0x45555254) && ((tmp[1] >> 16) <= 5))) + { + mark_hash_s0 (plains_buf, hashes_shown, 0, gid, 0); + + d_return_buf[lid] = 1; + } + } + + { + tmp[0] = data[0]; + tmp[1] = data[1]; + tmp[2] = data[2]; + tmp[3] = data[3]; + + serpent256_decrypt_xts (ukey1, ukey2, tmp, tmp); + + if (((tmp[0] == 0x45555254) && (tmp[3] == 0)) || ((tmp[0] == 0x45555254) && ((tmp[1] >> 16) <= 5))) + { + mark_hash_s0 (plains_buf, hashes_shown, 0, gid, 0); + + d_return_buf[lid] = 1; + } + } + + { + tmp[0] = data[0]; + tmp[1] = data[1]; + tmp[2] = data[2]; + tmp[3] = data[3]; + + twofish256_decrypt_xts (ukey1, ukey2, tmp, tmp); + + if (((tmp[0] == 0x45555254) && (tmp[3] == 0)) || ((tmp[0] == 0x45555254) && ((tmp[1] >> 16) <= 5))) + { + mark_hash_s0 (plains_buf, hashes_shown, 0, gid, 0); + + d_return_buf[lid] = 1; + } + } + + u32 ukey3[8]; + + ukey3[0] = swap_workaround (h32_from_64 (tmps[gid].out[ 8])); + ukey3[1] = swap_workaround (l32_from_64 (tmps[gid].out[ 8])); + ukey3[2] = swap_workaround (h32_from_64 (tmps[gid].out[ 9])); + ukey3[3] = swap_workaround (l32_from_64 (tmps[gid].out[ 9])); + ukey3[4] = swap_workaround (h32_from_64 (tmps[gid].out[10])); + ukey3[5] = swap_workaround (l32_from_64 (tmps[gid].out[10])); + ukey3[6] = swap_workaround (h32_from_64 (tmps[gid].out[11])); + ukey3[7] = swap_workaround (l32_from_64 (tmps[gid].out[11])); + + u32 ukey4[8]; + + ukey4[0] = swap_workaround (h32_from_64 (tmps[gid].out[12])); + ukey4[1] = swap_workaround (l32_from_64 (tmps[gid].out[12])); + ukey4[2] = swap_workaround (h32_from_64 (tmps[gid].out[13])); + ukey4[3] = swap_workaround (l32_from_64 (tmps[gid].out[13])); + ukey4[4] = swap_workaround (h32_from_64 (tmps[gid].out[14])); + ukey4[5] = swap_workaround (l32_from_64 (tmps[gid].out[14])); + ukey4[6] = swap_workaround (h32_from_64 (tmps[gid].out[15])); + ukey4[7] = swap_workaround (l32_from_64 (tmps[gid].out[15])); + + { + tmp[0] = data[0]; + tmp[1] = data[1]; + tmp[2] = data[2]; + tmp[3] = data[3]; + + aes256_decrypt_xts (ukey2, ukey4, tmp, tmp); + twofish256_decrypt_xts (ukey1, ukey3, tmp, tmp); + + if (((tmp[0] == 0x45555254) && (tmp[3] == 0)) || ((tmp[0] == 0x45555254) && ((tmp[1] >> 16) <= 5))) + { + mark_hash_s0 (plains_buf, hashes_shown, 0, gid, 0); + + d_return_buf[lid] = 1; + } + } + + { + tmp[0] = data[0]; + tmp[1] = data[1]; + tmp[2] = data[2]; + tmp[3] = data[3]; + + serpent256_decrypt_xts (ukey2, ukey4, tmp, tmp); + aes256_decrypt_xts (ukey1, ukey3, tmp, tmp); + + if (((tmp[0] == 0x45555254) && (tmp[3] == 0)) || ((tmp[0] == 0x45555254) && ((tmp[1] >> 16) <= 5))) + { + mark_hash_s0 (plains_buf, hashes_shown, 0, gid, 0); + + d_return_buf[lid] = 1; + } + } + + { + tmp[0] = data[0]; + tmp[1] = data[1]; + tmp[2] = data[2]; + tmp[3] = data[3]; + + twofish256_decrypt_xts (ukey2, ukey4, tmp, tmp); + serpent256_decrypt_xts (ukey1, ukey3, tmp, tmp); + + if (((tmp[0] == 0x45555254) && (tmp[3] == 0)) || ((tmp[0] == 0x45555254) && ((tmp[1] >> 16) <= 5))) + { + mark_hash_s0 (plains_buf, hashes_shown, 0, gid, 0); + + d_return_buf[lid] = 1; + } + } + + u32 ukey5[8]; + + ukey5[0] = swap_workaround (h32_from_64 (tmps[gid].out[16])); + ukey5[1] = swap_workaround (l32_from_64 (tmps[gid].out[16])); + ukey5[2] = swap_workaround (h32_from_64 (tmps[gid].out[17])); + ukey5[3] = swap_workaround (l32_from_64 (tmps[gid].out[17])); + ukey5[4] = swap_workaround (h32_from_64 (tmps[gid].out[18])); + ukey5[5] = swap_workaround (l32_from_64 (tmps[gid].out[18])); + ukey5[6] = swap_workaround (h32_from_64 (tmps[gid].out[19])); + ukey5[7] = swap_workaround (l32_from_64 (tmps[gid].out[19])); + + u32 ukey6[8]; + + ukey6[0] = swap_workaround (h32_from_64 (tmps[gid].out[20])); + ukey6[1] = swap_workaround (l32_from_64 (tmps[gid].out[20])); + ukey6[2] = swap_workaround (h32_from_64 (tmps[gid].out[21])); + ukey6[3] = swap_workaround (l32_from_64 (tmps[gid].out[21])); + ukey6[4] = swap_workaround (h32_from_64 (tmps[gid].out[22])); + ukey6[5] = swap_workaround (l32_from_64 (tmps[gid].out[22])); + ukey6[6] = swap_workaround (h32_from_64 (tmps[gid].out[23])); + ukey6[7] = swap_workaround (l32_from_64 (tmps[gid].out[23])); + + { + tmp[0] = data[0]; + tmp[1] = data[1]; + tmp[2] = data[2]; + tmp[3] = data[3]; + + aes256_decrypt_xts (ukey3, ukey6, tmp, tmp); + twofish256_decrypt_xts (ukey2, ukey5, tmp, tmp); + serpent256_decrypt_xts (ukey1, ukey4, tmp, tmp); + + if (((tmp[0] == 0x45555254) && (tmp[3] == 0)) || ((tmp[0] == 0x45555254) && ((tmp[1] >> 16) <= 5))) + { + mark_hash_s0 (plains_buf, hashes_shown, 0, gid, 0); + + d_return_buf[lid] = 1; + } + } + + { + tmp[0] = data[0]; + tmp[1] = data[1]; + tmp[2] = data[2]; + tmp[3] = data[3]; + + serpent256_decrypt_xts (ukey3, ukey6, tmp, tmp); + twofish256_decrypt_xts (ukey2, ukey5, tmp, tmp); + aes256_decrypt_xts (ukey1, ukey4, tmp, tmp); + + if (((tmp[0] == 0x45555254) && (tmp[3] == 0)) || ((tmp[0] == 0x45555254) && ((tmp[1] >> 16) <= 5))) + { + mark_hash_s0 (plains_buf, hashes_shown, 0, gid, 0); + + d_return_buf[lid] = 1; + } + } +} diff --git a/nv/m06231.cu b/nv/m06231.cu new file mode 100644 index 0000000000..ac27d12eb2 --- /dev/null +++ b/nv/m06231.cu @@ -0,0 +1,1990 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _WHIRLPOOL_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW2 +#define VECT_SIZE1 +#endif + +#define DGST_R0 0 +#define DGST_R1 1 +#define DGST_R2 2 +#define DGST_R3 3 + +#include "include/kernel_functions.c" +#include "types_nv.c" +#include "common_nv.c" + +#include "gpu_aes256_nv.c" +#include "gpu_twofish256_nv.c" +#include "gpu_serpent256_nv.c" + +#define R 10 + +#define BOX(S,n,i) (u32) ((S)[(n)][(i)]) + +__device__ __constant__ u32 Ch[8][256] = +{ + { + 0x18186018, 0x23238c23, 0xc6c63fc6, 0xe8e887e8, + 0x87872687, 0xb8b8dab8, 0x01010401, 0x4f4f214f, + 0x3636d836, 0xa6a6a2a6, 0xd2d26fd2, 0xf5f5f3f5, + 0x7979f979, 0x6f6fa16f, 0x91917e91, 0x52525552, + 0x60609d60, 0xbcbccabc, 0x9b9b569b, 0x8e8e028e, + 0xa3a3b6a3, 0x0c0c300c, 0x7b7bf17b, 0x3535d435, + 0x1d1d741d, 0xe0e0a7e0, 0xd7d77bd7, 0xc2c22fc2, + 0x2e2eb82e, 0x4b4b314b, 0xfefedffe, 0x57574157, + 0x15155415, 0x7777c177, 0x3737dc37, 0xe5e5b3e5, + 0x9f9f469f, 0xf0f0e7f0, 0x4a4a354a, 0xdada4fda, + 0x58587d58, 0xc9c903c9, 0x2929a429, 0x0a0a280a, + 0xb1b1feb1, 0xa0a0baa0, 0x6b6bb16b, 0x85852e85, + 0xbdbdcebd, 0x5d5d695d, 0x10104010, 0xf4f4f7f4, + 0xcbcb0bcb, 0x3e3ef83e, 0x05051405, 0x67678167, + 0xe4e4b7e4, 0x27279c27, 0x41411941, 0x8b8b168b, + 0xa7a7a6a7, 0x7d7de97d, 0x95956e95, 0xd8d847d8, + 0xfbfbcbfb, 0xeeee9fee, 0x7c7ced7c, 0x66668566, + 0xdddd53dd, 0x17175c17, 0x47470147, 0x9e9e429e, + 0xcaca0fca, 0x2d2db42d, 0xbfbfc6bf, 0x07071c07, + 0xadad8ead, 0x5a5a755a, 0x83833683, 0x3333cc33, + 0x63639163, 0x02020802, 0xaaaa92aa, 0x7171d971, + 0xc8c807c8, 0x19196419, 0x49493949, 0xd9d943d9, + 0xf2f2eff2, 0xe3e3abe3, 0x5b5b715b, 0x88881a88, + 0x9a9a529a, 0x26269826, 0x3232c832, 0xb0b0fab0, + 0xe9e983e9, 0x0f0f3c0f, 0xd5d573d5, 0x80803a80, + 0xbebec2be, 0xcdcd13cd, 0x3434d034, 0x48483d48, + 0xffffdbff, 0x7a7af57a, 0x90907a90, 0x5f5f615f, + 0x20208020, 0x6868bd68, 0x1a1a681a, 0xaeae82ae, + 0xb4b4eab4, 0x54544d54, 0x93937693, 0x22228822, + 0x64648d64, 0xf1f1e3f1, 0x7373d173, 0x12124812, + 0x40401d40, 0x08082008, 0xc3c32bc3, 0xecec97ec, + 0xdbdb4bdb, 0xa1a1bea1, 0x8d8d0e8d, 0x3d3df43d, + 0x97976697, 0x00000000, 0xcfcf1bcf, 0x2b2bac2b, + 0x7676c576, 0x82823282, 0xd6d67fd6, 0x1b1b6c1b, + 0xb5b5eeb5, 0xafaf86af, 0x6a6ab56a, 0x50505d50, + 0x45450945, 0xf3f3ebf3, 0x3030c030, 0xefef9bef, + 0x3f3ffc3f, 0x55554955, 0xa2a2b2a2, 0xeaea8fea, + 0x65658965, 0xbabad2ba, 0x2f2fbc2f, 0xc0c027c0, + 0xdede5fde, 0x1c1c701c, 0xfdfdd3fd, 0x4d4d294d, + 0x92927292, 0x7575c975, 0x06061806, 0x8a8a128a, + 0xb2b2f2b2, 0xe6e6bfe6, 0x0e0e380e, 0x1f1f7c1f, + 0x62629562, 0xd4d477d4, 0xa8a89aa8, 0x96966296, + 0xf9f9c3f9, 0xc5c533c5, 0x25259425, 0x59597959, + 0x84842a84, 0x7272d572, 0x3939e439, 0x4c4c2d4c, + 0x5e5e655e, 0x7878fd78, 0x3838e038, 0x8c8c0a8c, + 0xd1d163d1, 0xa5a5aea5, 0xe2e2afe2, 0x61619961, + 0xb3b3f6b3, 0x21218421, 0x9c9c4a9c, 0x1e1e781e, + 0x43431143, 0xc7c73bc7, 0xfcfcd7fc, 0x04041004, + 0x51515951, 0x99995e99, 0x6d6da96d, 0x0d0d340d, + 0xfafacffa, 0xdfdf5bdf, 0x7e7ee57e, 0x24249024, + 0x3b3bec3b, 0xabab96ab, 0xcece1fce, 0x11114411, + 0x8f8f068f, 0x4e4e254e, 0xb7b7e6b7, 0xebeb8beb, + 0x3c3cf03c, 0x81813e81, 0x94946a94, 0xf7f7fbf7, + 0xb9b9deb9, 0x13134c13, 0x2c2cb02c, 0xd3d36bd3, + 0xe7e7bbe7, 0x6e6ea56e, 0xc4c437c4, 0x03030c03, + 0x56564556, 0x44440d44, 0x7f7fe17f, 0xa9a99ea9, + 0x2a2aa82a, 0xbbbbd6bb, 0xc1c123c1, 0x53535153, + 0xdcdc57dc, 0x0b0b2c0b, 0x9d9d4e9d, 0x6c6cad6c, + 0x3131c431, 0x7474cd74, 0xf6f6fff6, 0x46460546, + 0xacac8aac, 0x89891e89, 0x14145014, 0xe1e1a3e1, + 0x16165816, 0x3a3ae83a, 0x6969b969, 0x09092409, + 0x7070dd70, 0xb6b6e2b6, 0xd0d067d0, 0xeded93ed, + 0xcccc17cc, 0x42421542, 0x98985a98, 0xa4a4aaa4, + 0x2828a028, 0x5c5c6d5c, 0xf8f8c7f8, 0x86862286, + }, + { + 0xd8181860, 0x2623238c, 0xb8c6c63f, 0xfbe8e887, + 0xcb878726, 0x11b8b8da, 0x09010104, 0x0d4f4f21, + 0x9b3636d8, 0xffa6a6a2, 0x0cd2d26f, 0x0ef5f5f3, + 0x967979f9, 0x306f6fa1, 0x6d91917e, 0xf8525255, + 0x4760609d, 0x35bcbcca, 0x379b9b56, 0x8a8e8e02, + 0xd2a3a3b6, 0x6c0c0c30, 0x847b7bf1, 0x803535d4, + 0xf51d1d74, 0xb3e0e0a7, 0x21d7d77b, 0x9cc2c22f, + 0x432e2eb8, 0x294b4b31, 0x5dfefedf, 0xd5575741, + 0xbd151554, 0xe87777c1, 0x923737dc, 0x9ee5e5b3, + 0x139f9f46, 0x23f0f0e7, 0x204a4a35, 0x44dada4f, + 0xa258587d, 0xcfc9c903, 0x7c2929a4, 0x5a0a0a28, + 0x50b1b1fe, 0xc9a0a0ba, 0x146b6bb1, 0xd985852e, + 0x3cbdbdce, 0x8f5d5d69, 0x90101040, 0x07f4f4f7, + 0xddcbcb0b, 0xd33e3ef8, 0x2d050514, 0x78676781, + 0x97e4e4b7, 0x0227279c, 0x73414119, 0xa78b8b16, + 0xf6a7a7a6, 0xb27d7de9, 0x4995956e, 0x56d8d847, + 0x70fbfbcb, 0xcdeeee9f, 0xbb7c7ced, 0x71666685, + 0x7bdddd53, 0xaf17175c, 0x45474701, 0x1a9e9e42, + 0xd4caca0f, 0x582d2db4, 0x2ebfbfc6, 0x3f07071c, + 0xacadad8e, 0xb05a5a75, 0xef838336, 0xb63333cc, + 0x5c636391, 0x12020208, 0x93aaaa92, 0xde7171d9, + 0xc6c8c807, 0xd1191964, 0x3b494939, 0x5fd9d943, + 0x31f2f2ef, 0xa8e3e3ab, 0xb95b5b71, 0xbc88881a, + 0x3e9a9a52, 0x0b262698, 0xbf3232c8, 0x59b0b0fa, + 0xf2e9e983, 0x770f0f3c, 0x33d5d573, 0xf480803a, + 0x27bebec2, 0xebcdcd13, 0x893434d0, 0x3248483d, + 0x54ffffdb, 0x8d7a7af5, 0x6490907a, 0x9d5f5f61, + 0x3d202080, 0x0f6868bd, 0xca1a1a68, 0xb7aeae82, + 0x7db4b4ea, 0xce54544d, 0x7f939376, 0x2f222288, + 0x6364648d, 0x2af1f1e3, 0xcc7373d1, 0x82121248, + 0x7a40401d, 0x48080820, 0x95c3c32b, 0xdfecec97, + 0x4ddbdb4b, 0xc0a1a1be, 0x918d8d0e, 0xc83d3df4, + 0x5b979766, 0x00000000, 0xf9cfcf1b, 0x6e2b2bac, + 0xe17676c5, 0xe6828232, 0x28d6d67f, 0xc31b1b6c, + 0x74b5b5ee, 0xbeafaf86, 0x1d6a6ab5, 0xea50505d, + 0x57454509, 0x38f3f3eb, 0xad3030c0, 0xc4efef9b, + 0xda3f3ffc, 0xc7555549, 0xdba2a2b2, 0xe9eaea8f, + 0x6a656589, 0x03babad2, 0x4a2f2fbc, 0x8ec0c027, + 0x60dede5f, 0xfc1c1c70, 0x46fdfdd3, 0x1f4d4d29, + 0x76929272, 0xfa7575c9, 0x36060618, 0xae8a8a12, + 0x4bb2b2f2, 0x85e6e6bf, 0x7e0e0e38, 0xe71f1f7c, + 0x55626295, 0x3ad4d477, 0x81a8a89a, 0x52969662, + 0x62f9f9c3, 0xa3c5c533, 0x10252594, 0xab595979, + 0xd084842a, 0xc57272d5, 0xec3939e4, 0x164c4c2d, + 0x945e5e65, 0x9f7878fd, 0xe53838e0, 0x988c8c0a, + 0x17d1d163, 0xe4a5a5ae, 0xa1e2e2af, 0x4e616199, + 0x42b3b3f6, 0x34212184, 0x089c9c4a, 0xee1e1e78, + 0x61434311, 0xb1c7c73b, 0x4ffcfcd7, 0x24040410, + 0xe3515159, 0x2599995e, 0x226d6da9, 0x650d0d34, + 0x79fafacf, 0x69dfdf5b, 0xa97e7ee5, 0x19242490, + 0xfe3b3bec, 0x9aabab96, 0xf0cece1f, 0x99111144, + 0x838f8f06, 0x044e4e25, 0x66b7b7e6, 0xe0ebeb8b, + 0xc13c3cf0, 0xfd81813e, 0x4094946a, 0x1cf7f7fb, + 0x18b9b9de, 0x8b13134c, 0x512c2cb0, 0x05d3d36b, + 0x8ce7e7bb, 0x396e6ea5, 0xaac4c437, 0x1b03030c, + 0xdc565645, 0x5e44440d, 0xa07f7fe1, 0x88a9a99e, + 0x672a2aa8, 0x0abbbbd6, 0x87c1c123, 0xf1535351, + 0x72dcdc57, 0x530b0b2c, 0x019d9d4e, 0x2b6c6cad, + 0xa43131c4, 0xf37474cd, 0x15f6f6ff, 0x4c464605, + 0xa5acac8a, 0xb589891e, 0xb4141450, 0xbae1e1a3, + 0xa6161658, 0xf73a3ae8, 0x066969b9, 0x41090924, + 0xd77070dd, 0x6fb6b6e2, 0x1ed0d067, 0xd6eded93, + 0xe2cccc17, 0x68424215, 0x2c98985a, 0xeda4a4aa, + 0x752828a0, 0x865c5c6d, 0x6bf8f8c7, 0xc2868622, + }, + { + 0x30d81818, 0x46262323, 0x91b8c6c6, 0xcdfbe8e8, + 0x13cb8787, 0x6d11b8b8, 0x02090101, 0x9e0d4f4f, + 0x6c9b3636, 0x51ffa6a6, 0xb90cd2d2, 0xf70ef5f5, + 0xf2967979, 0xde306f6f, 0x3f6d9191, 0xa4f85252, + 0xc0476060, 0x6535bcbc, 0x2b379b9b, 0x018a8e8e, + 0x5bd2a3a3, 0x186c0c0c, 0xf6847b7b, 0x6a803535, + 0x3af51d1d, 0xddb3e0e0, 0xb321d7d7, 0x999cc2c2, + 0x5c432e2e, 0x96294b4b, 0xe15dfefe, 0xaed55757, + 0x2abd1515, 0xeee87777, 0x6e923737, 0xd79ee5e5, + 0x23139f9f, 0xfd23f0f0, 0x94204a4a, 0xa944dada, + 0xb0a25858, 0x8fcfc9c9, 0x527c2929, 0x145a0a0a, + 0x7f50b1b1, 0x5dc9a0a0, 0xd6146b6b, 0x17d98585, + 0x673cbdbd, 0xba8f5d5d, 0x20901010, 0xf507f4f4, + 0x8bddcbcb, 0x7cd33e3e, 0x0a2d0505, 0xce786767, + 0xd597e4e4, 0x4e022727, 0x82734141, 0x0ba78b8b, + 0x53f6a7a7, 0xfab27d7d, 0x37499595, 0xad56d8d8, + 0xeb70fbfb, 0xc1cdeeee, 0xf8bb7c7c, 0xcc716666, + 0xa77bdddd, 0x2eaf1717, 0x8e454747, 0x211a9e9e, + 0x89d4caca, 0x5a582d2d, 0x632ebfbf, 0x0e3f0707, + 0x47acadad, 0xb4b05a5a, 0x1bef8383, 0x66b63333, + 0xc65c6363, 0x04120202, 0x4993aaaa, 0xe2de7171, + 0x8dc6c8c8, 0x32d11919, 0x923b4949, 0xaf5fd9d9, + 0xf931f2f2, 0xdba8e3e3, 0xb6b95b5b, 0x0dbc8888, + 0x293e9a9a, 0x4c0b2626, 0x64bf3232, 0x7d59b0b0, + 0xcff2e9e9, 0x1e770f0f, 0xb733d5d5, 0x1df48080, + 0x6127bebe, 0x87ebcdcd, 0x68893434, 0x90324848, + 0xe354ffff, 0xf48d7a7a, 0x3d649090, 0xbe9d5f5f, + 0x403d2020, 0xd00f6868, 0x34ca1a1a, 0x41b7aeae, + 0x757db4b4, 0xa8ce5454, 0x3b7f9393, 0x442f2222, + 0xc8636464, 0xff2af1f1, 0xe6cc7373, 0x24821212, + 0x807a4040, 0x10480808, 0x9b95c3c3, 0xc5dfecec, + 0xab4ddbdb, 0x5fc0a1a1, 0x07918d8d, 0x7ac83d3d, + 0x335b9797, 0x00000000, 0x83f9cfcf, 0x566e2b2b, + 0xece17676, 0x19e68282, 0xb128d6d6, 0x36c31b1b, + 0x7774b5b5, 0x43beafaf, 0xd41d6a6a, 0xa0ea5050, + 0x8a574545, 0xfb38f3f3, 0x60ad3030, 0xc3c4efef, + 0x7eda3f3f, 0xaac75555, 0x59dba2a2, 0xc9e9eaea, + 0xca6a6565, 0x6903baba, 0x5e4a2f2f, 0x9d8ec0c0, + 0xa160dede, 0x38fc1c1c, 0xe746fdfd, 0x9a1f4d4d, + 0x39769292, 0xeafa7575, 0x0c360606, 0x09ae8a8a, + 0x794bb2b2, 0xd185e6e6, 0x1c7e0e0e, 0x3ee71f1f, + 0xc4556262, 0xb53ad4d4, 0x4d81a8a8, 0x31529696, + 0xef62f9f9, 0x97a3c5c5, 0x4a102525, 0xb2ab5959, + 0x15d08484, 0xe4c57272, 0x72ec3939, 0x98164c4c, + 0xbc945e5e, 0xf09f7878, 0x70e53838, 0x05988c8c, + 0xbf17d1d1, 0x57e4a5a5, 0xd9a1e2e2, 0xc24e6161, + 0x7b42b3b3, 0x42342121, 0x25089c9c, 0x3cee1e1e, + 0x86614343, 0x93b1c7c7, 0xe54ffcfc, 0x08240404, + 0xa2e35151, 0x2f259999, 0xda226d6d, 0x1a650d0d, + 0xe979fafa, 0xa369dfdf, 0xfca97e7e, 0x48192424, + 0x76fe3b3b, 0x4b9aabab, 0x81f0cece, 0x22991111, + 0x03838f8f, 0x9c044e4e, 0x7366b7b7, 0xcbe0ebeb, + 0x78c13c3c, 0x1ffd8181, 0x35409494, 0xf31cf7f7, + 0x6f18b9b9, 0x268b1313, 0x58512c2c, 0xbb05d3d3, + 0xd38ce7e7, 0xdc396e6e, 0x95aac4c4, 0x061b0303, + 0xacdc5656, 0x885e4444, 0xfea07f7f, 0x4f88a9a9, + 0x54672a2a, 0x6b0abbbb, 0x9f87c1c1, 0xa6f15353, + 0xa572dcdc, 0x16530b0b, 0x27019d9d, 0xd82b6c6c, + 0x62a43131, 0xe8f37474, 0xf115f6f6, 0x8c4c4646, + 0x45a5acac, 0x0fb58989, 0x28b41414, 0xdfbae1e1, + 0x2ca61616, 0x74f73a3a, 0xd2066969, 0x12410909, + 0xe0d77070, 0x716fb6b6, 0xbd1ed0d0, 0xc7d6eded, + 0x85e2cccc, 0x84684242, 0x2d2c9898, 0x55eda4a4, + 0x50752828, 0xb8865c5c, 0xed6bf8f8, 0x11c28686, + }, + { + 0x7830d818, 0xaf462623, 0xf991b8c6, 0x6fcdfbe8, + 0xa113cb87, 0x626d11b8, 0x05020901, 0x6e9e0d4f, + 0xee6c9b36, 0x0451ffa6, 0xbdb90cd2, 0x06f70ef5, + 0x80f29679, 0xcede306f, 0xef3f6d91, 0x07a4f852, + 0xfdc04760, 0x766535bc, 0xcd2b379b, 0x8c018a8e, + 0x155bd2a3, 0x3c186c0c, 0x8af6847b, 0xe16a8035, + 0x693af51d, 0x47ddb3e0, 0xacb321d7, 0xed999cc2, + 0x965c432e, 0x7a96294b, 0x21e15dfe, 0x16aed557, + 0x412abd15, 0xb6eee877, 0xeb6e9237, 0x56d79ee5, + 0xd923139f, 0x17fd23f0, 0x7f94204a, 0x95a944da, + 0x25b0a258, 0xca8fcfc9, 0x8d527c29, 0x22145a0a, + 0x4f7f50b1, 0x1a5dc9a0, 0xdad6146b, 0xab17d985, + 0x73673cbd, 0x34ba8f5d, 0x50209010, 0x03f507f4, + 0xc08bddcb, 0xc67cd33e, 0x110a2d05, 0xe6ce7867, + 0x53d597e4, 0xbb4e0227, 0x58827341, 0x9d0ba78b, + 0x0153f6a7, 0x94fab27d, 0xfb374995, 0x9fad56d8, + 0x30eb70fb, 0x71c1cdee, 0x91f8bb7c, 0xe3cc7166, + 0x8ea77bdd, 0x4b2eaf17, 0x468e4547, 0xdc211a9e, + 0xc589d4ca, 0x995a582d, 0x79632ebf, 0x1b0e3f07, + 0x2347acad, 0x2fb4b05a, 0xb51bef83, 0xff66b633, + 0xf2c65c63, 0x0a041202, 0x384993aa, 0xa8e2de71, + 0xcf8dc6c8, 0x7d32d119, 0x70923b49, 0x9aaf5fd9, + 0x1df931f2, 0x48dba8e3, 0x2ab6b95b, 0x920dbc88, + 0xc8293e9a, 0xbe4c0b26, 0xfa64bf32, 0x4a7d59b0, + 0x6acff2e9, 0x331e770f, 0xa6b733d5, 0xba1df480, + 0x7c6127be, 0xde87ebcd, 0xe4688934, 0x75903248, + 0x24e354ff, 0x8ff48d7a, 0xea3d6490, 0x3ebe9d5f, + 0xa0403d20, 0xd5d00f68, 0x7234ca1a, 0x2c41b7ae, + 0x5e757db4, 0x19a8ce54, 0xe53b7f93, 0xaa442f22, + 0xe9c86364, 0x12ff2af1, 0xa2e6cc73, 0x5a248212, + 0x5d807a40, 0x28104808, 0xe89b95c3, 0x7bc5dfec, + 0x90ab4ddb, 0x1f5fc0a1, 0x8307918d, 0xc97ac83d, + 0xf1335b97, 0x00000000, 0xd483f9cf, 0x87566e2b, + 0xb3ece176, 0xb019e682, 0xa9b128d6, 0x7736c31b, + 0x5b7774b5, 0x2943beaf, 0xdfd41d6a, 0x0da0ea50, + 0x4c8a5745, 0x18fb38f3, 0xf060ad30, 0x74c3c4ef, + 0xc37eda3f, 0x1caac755, 0x1059dba2, 0x65c9e9ea, + 0xecca6a65, 0x686903ba, 0x935e4a2f, 0xe79d8ec0, + 0x81a160de, 0x6c38fc1c, 0x2ee746fd, 0x649a1f4d, + 0xe0397692, 0xbceafa75, 0x1e0c3606, 0x9809ae8a, + 0x40794bb2, 0x59d185e6, 0x361c7e0e, 0x633ee71f, + 0xf7c45562, 0xa3b53ad4, 0x324d81a8, 0xf4315296, + 0x3aef62f9, 0xf697a3c5, 0xb14a1025, 0x20b2ab59, + 0xae15d084, 0xa7e4c572, 0xdd72ec39, 0x6198164c, + 0x3bbc945e, 0x85f09f78, 0xd870e538, 0x8605988c, + 0xb2bf17d1, 0x0b57e4a5, 0x4dd9a1e2, 0xf8c24e61, + 0x457b42b3, 0xa5423421, 0xd625089c, 0x663cee1e, + 0x52866143, 0xfc93b1c7, 0x2be54ffc, 0x14082404, + 0x08a2e351, 0xc72f2599, 0xc4da226d, 0x391a650d, + 0x35e979fa, 0x84a369df, 0x9bfca97e, 0xb4481924, + 0xd776fe3b, 0x3d4b9aab, 0xd181f0ce, 0x55229911, + 0x8903838f, 0x6b9c044e, 0x517366b7, 0x60cbe0eb, + 0xcc78c13c, 0xbf1ffd81, 0xfe354094, 0x0cf31cf7, + 0x676f18b9, 0x5f268b13, 0x9c58512c, 0xb8bb05d3, + 0x5cd38ce7, 0xcbdc396e, 0xf395aac4, 0x0f061b03, + 0x13acdc56, 0x49885e44, 0x9efea07f, 0x374f88a9, + 0x8254672a, 0x6d6b0abb, 0xe29f87c1, 0x02a6f153, + 0x8ba572dc, 0x2716530b, 0xd327019d, 0xc1d82b6c, + 0xf562a431, 0xb9e8f374, 0x09f115f6, 0x438c4c46, + 0x2645a5ac, 0x970fb589, 0x4428b414, 0x42dfbae1, + 0x4e2ca616, 0xd274f73a, 0xd0d20669, 0x2d124109, + 0xade0d770, 0x54716fb6, 0xb7bd1ed0, 0x7ec7d6ed, + 0xdb85e2cc, 0x57846842, 0xc22d2c98, 0x0e55eda4, + 0x88507528, 0x31b8865c, 0x3fed6bf8, 0xa411c286, + }, + { + 0xc07830d8, 0x05af4626, 0x7ef991b8, 0x136fcdfb, + 0x4ca113cb, 0xa9626d11, 0x08050209, 0x426e9e0d, + 0xadee6c9b, 0x590451ff, 0xdebdb90c, 0xfb06f70e, + 0xef80f296, 0x5fcede30, 0xfcef3f6d, 0xaa07a4f8, + 0x27fdc047, 0x89766535, 0xaccd2b37, 0x048c018a, + 0x71155bd2, 0x603c186c, 0xff8af684, 0xb5e16a80, + 0xe8693af5, 0x5347ddb3, 0xf6acb321, 0x5eed999c, + 0x6d965c43, 0x627a9629, 0xa321e15d, 0x8216aed5, + 0xa8412abd, 0x9fb6eee8, 0xa5eb6e92, 0x7b56d79e, + 0x8cd92313, 0xd317fd23, 0x6a7f9420, 0x9e95a944, + 0xfa25b0a2, 0x06ca8fcf, 0x558d527c, 0x5022145a, + 0xe14f7f50, 0x691a5dc9, 0x7fdad614, 0x5cab17d9, + 0x8173673c, 0xd234ba8f, 0x80502090, 0xf303f507, + 0x16c08bdd, 0xedc67cd3, 0x28110a2d, 0x1fe6ce78, + 0x7353d597, 0x25bb4e02, 0x32588273, 0x2c9d0ba7, + 0x510153f6, 0xcf94fab2, 0xdcfb3749, 0x8e9fad56, + 0x8b30eb70, 0x2371c1cd, 0xc791f8bb, 0x17e3cc71, + 0xa68ea77b, 0xb84b2eaf, 0x02468e45, 0x84dc211a, + 0x1ec589d4, 0x75995a58, 0x9179632e, 0x381b0e3f, + 0x012347ac, 0xea2fb4b0, 0x6cb51bef, 0x85ff66b6, + 0x3ff2c65c, 0x100a0412, 0x39384993, 0xafa8e2de, + 0x0ecf8dc6, 0xc87d32d1, 0x7270923b, 0x869aaf5f, + 0xc31df931, 0x4b48dba8, 0xe22ab6b9, 0x34920dbc, + 0xa4c8293e, 0x2dbe4c0b, 0x8dfa64bf, 0xe94a7d59, + 0x1b6acff2, 0x78331e77, 0xe6a6b733, 0x74ba1df4, + 0x997c6127, 0x26de87eb, 0xbde46889, 0x7a759032, + 0xab24e354, 0xf78ff48d, 0xf4ea3d64, 0xc23ebe9d, + 0x1da0403d, 0x67d5d00f, 0xd07234ca, 0x192c41b7, + 0xc95e757d, 0x9a19a8ce, 0xece53b7f, 0x0daa442f, + 0x07e9c863, 0xdb12ff2a, 0xbfa2e6cc, 0x905a2482, + 0x3a5d807a, 0x40281048, 0x56e89b95, 0x337bc5df, + 0x9690ab4d, 0x611f5fc0, 0x1c830791, 0xf5c97ac8, + 0xccf1335b, 0x00000000, 0x36d483f9, 0x4587566e, + 0x97b3ece1, 0x64b019e6, 0xfea9b128, 0xd87736c3, + 0xc15b7774, 0x112943be, 0x77dfd41d, 0xba0da0ea, + 0x124c8a57, 0xcb18fb38, 0x9df060ad, 0x2b74c3c4, + 0xe5c37eda, 0x921caac7, 0x791059db, 0x0365c9e9, + 0x0fecca6a, 0xb9686903, 0x65935e4a, 0x4ee79d8e, + 0xbe81a160, 0xe06c38fc, 0xbb2ee746, 0x52649a1f, + 0xe4e03976, 0x8fbceafa, 0x301e0c36, 0x249809ae, + 0xf940794b, 0x6359d185, 0x70361c7e, 0xf8633ee7, + 0x37f7c455, 0xeea3b53a, 0x29324d81, 0xc4f43152, + 0x9b3aef62, 0x66f697a3, 0x35b14a10, 0xf220b2ab, + 0x54ae15d0, 0xb7a7e4c5, 0xd5dd72ec, 0x5a619816, + 0xca3bbc94, 0xe785f09f, 0xddd870e5, 0x14860598, + 0xc6b2bf17, 0x410b57e4, 0x434dd9a1, 0x2ff8c24e, + 0xf1457b42, 0x15a54234, 0x94d62508, 0xf0663cee, + 0x22528661, 0x76fc93b1, 0xb32be54f, 0x20140824, + 0xb208a2e3, 0xbcc72f25, 0x4fc4da22, 0x68391a65, + 0x8335e979, 0xb684a369, 0xd79bfca9, 0x3db44819, + 0xc5d776fe, 0x313d4b9a, 0x3ed181f0, 0x88552299, + 0x0c890383, 0x4a6b9c04, 0xd1517366, 0x0b60cbe0, + 0xfdcc78c1, 0x7cbf1ffd, 0xd4fe3540, 0xeb0cf31c, + 0xa1676f18, 0x985f268b, 0x7d9c5851, 0xd6b8bb05, + 0x6b5cd38c, 0x57cbdc39, 0x6ef395aa, 0x180f061b, + 0x8a13acdc, 0x1a49885e, 0xdf9efea0, 0x21374f88, + 0x4d825467, 0xb16d6b0a, 0x46e29f87, 0xa202a6f1, + 0xae8ba572, 0x58271653, 0x9cd32701, 0x47c1d82b, + 0x95f562a4, 0x87b9e8f3, 0xe309f115, 0x0a438c4c, + 0x092645a5, 0x3c970fb5, 0xa04428b4, 0x5b42dfba, + 0xb04e2ca6, 0xcdd274f7, 0x6fd0d206, 0x482d1241, + 0xa7ade0d7, 0xd954716f, 0xceb7bd1e, 0x3b7ec7d6, + 0x2edb85e2, 0x2a578468, 0xb4c22d2c, 0x490e55ed, + 0x5d885075, 0xda31b886, 0x933fed6b, 0x44a411c2, + }, + { + 0x18c07830, 0x2305af46, 0xc67ef991, 0xe8136fcd, + 0x874ca113, 0xb8a9626d, 0x01080502, 0x4f426e9e, + 0x36adee6c, 0xa6590451, 0xd2debdb9, 0xf5fb06f7, + 0x79ef80f2, 0x6f5fcede, 0x91fcef3f, 0x52aa07a4, + 0x6027fdc0, 0xbc897665, 0x9baccd2b, 0x8e048c01, + 0xa371155b, 0x0c603c18, 0x7bff8af6, 0x35b5e16a, + 0x1de8693a, 0xe05347dd, 0xd7f6acb3, 0xc25eed99, + 0x2e6d965c, 0x4b627a96, 0xfea321e1, 0x578216ae, + 0x15a8412a, 0x779fb6ee, 0x37a5eb6e, 0xe57b56d7, + 0x9f8cd923, 0xf0d317fd, 0x4a6a7f94, 0xda9e95a9, + 0x58fa25b0, 0xc906ca8f, 0x29558d52, 0x0a502214, + 0xb1e14f7f, 0xa0691a5d, 0x6b7fdad6, 0x855cab17, + 0xbd817367, 0x5dd234ba, 0x10805020, 0xf4f303f5, + 0xcb16c08b, 0x3eedc67c, 0x0528110a, 0x671fe6ce, + 0xe47353d5, 0x2725bb4e, 0x41325882, 0x8b2c9d0b, + 0xa7510153, 0x7dcf94fa, 0x95dcfb37, 0xd88e9fad, + 0xfb8b30eb, 0xee2371c1, 0x7cc791f8, 0x6617e3cc, + 0xdda68ea7, 0x17b84b2e, 0x4702468e, 0x9e84dc21, + 0xca1ec589, 0x2d75995a, 0xbf917963, 0x07381b0e, + 0xad012347, 0x5aea2fb4, 0x836cb51b, 0x3385ff66, + 0x633ff2c6, 0x02100a04, 0xaa393849, 0x71afa8e2, + 0xc80ecf8d, 0x19c87d32, 0x49727092, 0xd9869aaf, + 0xf2c31df9, 0xe34b48db, 0x5be22ab6, 0x8834920d, + 0x9aa4c829, 0x262dbe4c, 0x328dfa64, 0xb0e94a7d, + 0xe91b6acf, 0x0f78331e, 0xd5e6a6b7, 0x8074ba1d, + 0xbe997c61, 0xcd26de87, 0x34bde468, 0x487a7590, + 0xffab24e3, 0x7af78ff4, 0x90f4ea3d, 0x5fc23ebe, + 0x201da040, 0x6867d5d0, 0x1ad07234, 0xae192c41, + 0xb4c95e75, 0x549a19a8, 0x93ece53b, 0x220daa44, + 0x6407e9c8, 0xf1db12ff, 0x73bfa2e6, 0x12905a24, + 0x403a5d80, 0x08402810, 0xc356e89b, 0xec337bc5, + 0xdb9690ab, 0xa1611f5f, 0x8d1c8307, 0x3df5c97a, + 0x97ccf133, 0x00000000, 0xcf36d483, 0x2b458756, + 0x7697b3ec, 0x8264b019, 0xd6fea9b1, 0x1bd87736, + 0xb5c15b77, 0xaf112943, 0x6a77dfd4, 0x50ba0da0, + 0x45124c8a, 0xf3cb18fb, 0x309df060, 0xef2b74c3, + 0x3fe5c37e, 0x55921caa, 0xa2791059, 0xea0365c9, + 0x650fecca, 0xbab96869, 0x2f65935e, 0xc04ee79d, + 0xdebe81a1, 0x1ce06c38, 0xfdbb2ee7, 0x4d52649a, + 0x92e4e039, 0x758fbcea, 0x06301e0c, 0x8a249809, + 0xb2f94079, 0xe66359d1, 0x0e70361c, 0x1ff8633e, + 0x6237f7c4, 0xd4eea3b5, 0xa829324d, 0x96c4f431, + 0xf99b3aef, 0xc566f697, 0x2535b14a, 0x59f220b2, + 0x8454ae15, 0x72b7a7e4, 0x39d5dd72, 0x4c5a6198, + 0x5eca3bbc, 0x78e785f0, 0x38ddd870, 0x8c148605, + 0xd1c6b2bf, 0xa5410b57, 0xe2434dd9, 0x612ff8c2, + 0xb3f1457b, 0x2115a542, 0x9c94d625, 0x1ef0663c, + 0x43225286, 0xc776fc93, 0xfcb32be5, 0x04201408, + 0x51b208a2, 0x99bcc72f, 0x6d4fc4da, 0x0d68391a, + 0xfa8335e9, 0xdfb684a3, 0x7ed79bfc, 0x243db448, + 0x3bc5d776, 0xab313d4b, 0xce3ed181, 0x11885522, + 0x8f0c8903, 0x4e4a6b9c, 0xb7d15173, 0xeb0b60cb, + 0x3cfdcc78, 0x817cbf1f, 0x94d4fe35, 0xf7eb0cf3, + 0xb9a1676f, 0x13985f26, 0x2c7d9c58, 0xd3d6b8bb, + 0xe76b5cd3, 0x6e57cbdc, 0xc46ef395, 0x03180f06, + 0x568a13ac, 0x441a4988, 0x7fdf9efe, 0xa921374f, + 0x2a4d8254, 0xbbb16d6b, 0xc146e29f, 0x53a202a6, + 0xdcae8ba5, 0x0b582716, 0x9d9cd327, 0x6c47c1d8, + 0x3195f562, 0x7487b9e8, 0xf6e309f1, 0x460a438c, + 0xac092645, 0x893c970f, 0x14a04428, 0xe15b42df, + 0x16b04e2c, 0x3acdd274, 0x696fd0d2, 0x09482d12, + 0x70a7ade0, 0xb6d95471, 0xd0ceb7bd, 0xed3b7ec7, + 0xcc2edb85, 0x422a5784, 0x98b4c22d, 0xa4490e55, + 0x285d8850, 0x5cda31b8, 0xf8933fed, 0x8644a411, + }, + { + 0x6018c078, 0x8c2305af, 0x3fc67ef9, 0x87e8136f, + 0x26874ca1, 0xdab8a962, 0x04010805, 0x214f426e, + 0xd836adee, 0xa2a65904, 0x6fd2debd, 0xf3f5fb06, + 0xf979ef80, 0xa16f5fce, 0x7e91fcef, 0x5552aa07, + 0x9d6027fd, 0xcabc8976, 0x569baccd, 0x028e048c, + 0xb6a37115, 0x300c603c, 0xf17bff8a, 0xd435b5e1, + 0x741de869, 0xa7e05347, 0x7bd7f6ac, 0x2fc25eed, + 0xb82e6d96, 0x314b627a, 0xdffea321, 0x41578216, + 0x5415a841, 0xc1779fb6, 0xdc37a5eb, 0xb3e57b56, + 0x469f8cd9, 0xe7f0d317, 0x354a6a7f, 0x4fda9e95, + 0x7d58fa25, 0x03c906ca, 0xa429558d, 0x280a5022, + 0xfeb1e14f, 0xbaa0691a, 0xb16b7fda, 0x2e855cab, + 0xcebd8173, 0x695dd234, 0x40108050, 0xf7f4f303, + 0x0bcb16c0, 0xf83eedc6, 0x14052811, 0x81671fe6, + 0xb7e47353, 0x9c2725bb, 0x19413258, 0x168b2c9d, + 0xa6a75101, 0xe97dcf94, 0x6e95dcfb, 0x47d88e9f, + 0xcbfb8b30, 0x9fee2371, 0xed7cc791, 0x856617e3, + 0x53dda68e, 0x5c17b84b, 0x01470246, 0x429e84dc, + 0x0fca1ec5, 0xb42d7599, 0xc6bf9179, 0x1c07381b, + 0x8ead0123, 0x755aea2f, 0x36836cb5, 0xcc3385ff, + 0x91633ff2, 0x0802100a, 0x92aa3938, 0xd971afa8, + 0x07c80ecf, 0x6419c87d, 0x39497270, 0x43d9869a, + 0xeff2c31d, 0xabe34b48, 0x715be22a, 0x1a883492, + 0x529aa4c8, 0x98262dbe, 0xc8328dfa, 0xfab0e94a, + 0x83e91b6a, 0x3c0f7833, 0x73d5e6a6, 0x3a8074ba, + 0xc2be997c, 0x13cd26de, 0xd034bde4, 0x3d487a75, + 0xdbffab24, 0xf57af78f, 0x7a90f4ea, 0x615fc23e, + 0x80201da0, 0xbd6867d5, 0x681ad072, 0x82ae192c, + 0xeab4c95e, 0x4d549a19, 0x7693ece5, 0x88220daa, + 0x8d6407e9, 0xe3f1db12, 0xd173bfa2, 0x4812905a, + 0x1d403a5d, 0x20084028, 0x2bc356e8, 0x97ec337b, + 0x4bdb9690, 0xbea1611f, 0x0e8d1c83, 0xf43df5c9, + 0x6697ccf1, 0x00000000, 0x1bcf36d4, 0xac2b4587, + 0xc57697b3, 0x328264b0, 0x7fd6fea9, 0x6c1bd877, + 0xeeb5c15b, 0x86af1129, 0xb56a77df, 0x5d50ba0d, + 0x0945124c, 0xebf3cb18, 0xc0309df0, 0x9bef2b74, + 0xfc3fe5c3, 0x4955921c, 0xb2a27910, 0x8fea0365, + 0x89650fec, 0xd2bab968, 0xbc2f6593, 0x27c04ee7, + 0x5fdebe81, 0x701ce06c, 0xd3fdbb2e, 0x294d5264, + 0x7292e4e0, 0xc9758fbc, 0x1806301e, 0x128a2498, + 0xf2b2f940, 0xbfe66359, 0x380e7036, 0x7c1ff863, + 0x956237f7, 0x77d4eea3, 0x9aa82932, 0x6296c4f4, + 0xc3f99b3a, 0x33c566f6, 0x942535b1, 0x7959f220, + 0x2a8454ae, 0xd572b7a7, 0xe439d5dd, 0x2d4c5a61, + 0x655eca3b, 0xfd78e785, 0xe038ddd8, 0x0a8c1486, + 0x63d1c6b2, 0xaea5410b, 0xafe2434d, 0x99612ff8, + 0xf6b3f145, 0x842115a5, 0x4a9c94d6, 0x781ef066, + 0x11432252, 0x3bc776fc, 0xd7fcb32b, 0x10042014, + 0x5951b208, 0x5e99bcc7, 0xa96d4fc4, 0x340d6839, + 0xcffa8335, 0x5bdfb684, 0xe57ed79b, 0x90243db4, + 0xec3bc5d7, 0x96ab313d, 0x1fce3ed1, 0x44118855, + 0x068f0c89, 0x254e4a6b, 0xe6b7d151, 0x8beb0b60, + 0xf03cfdcc, 0x3e817cbf, 0x6a94d4fe, 0xfbf7eb0c, + 0xdeb9a167, 0x4c13985f, 0xb02c7d9c, 0x6bd3d6b8, + 0xbbe76b5c, 0xa56e57cb, 0x37c46ef3, 0x0c03180f, + 0x45568a13, 0x0d441a49, 0xe17fdf9e, 0x9ea92137, + 0xa82a4d82, 0xd6bbb16d, 0x23c146e2, 0x5153a202, + 0x57dcae8b, 0x2c0b5827, 0x4e9d9cd3, 0xad6c47c1, + 0xc43195f5, 0xcd7487b9, 0xfff6e309, 0x05460a43, + 0x8aac0926, 0x1e893c97, 0x5014a044, 0xa3e15b42, + 0x5816b04e, 0xe83acdd2, 0xb9696fd0, 0x2409482d, + 0xdd70a7ad, 0xe2b6d954, 0x67d0ceb7, 0x93ed3b7e, + 0x17cc2edb, 0x15422a57, 0x5a98b4c2, 0xaaa4490e, + 0xa0285d88, 0x6d5cda31, 0xc7f8933f, 0x228644a4, + }, + { + 0x186018c0, 0x238c2305, 0xc63fc67e, 0xe887e813, + 0x8726874c, 0xb8dab8a9, 0x01040108, 0x4f214f42, + 0x36d836ad, 0xa6a2a659, 0xd26fd2de, 0xf5f3f5fb, + 0x79f979ef, 0x6fa16f5f, 0x917e91fc, 0x525552aa, + 0x609d6027, 0xbccabc89, 0x9b569bac, 0x8e028e04, + 0xa3b6a371, 0x0c300c60, 0x7bf17bff, 0x35d435b5, + 0x1d741de8, 0xe0a7e053, 0xd77bd7f6, 0xc22fc25e, + 0x2eb82e6d, 0x4b314b62, 0xfedffea3, 0x57415782, + 0x155415a8, 0x77c1779f, 0x37dc37a5, 0xe5b3e57b, + 0x9f469f8c, 0xf0e7f0d3, 0x4a354a6a, 0xda4fda9e, + 0x587d58fa, 0xc903c906, 0x29a42955, 0x0a280a50, + 0xb1feb1e1, 0xa0baa069, 0x6bb16b7f, 0x852e855c, + 0xbdcebd81, 0x5d695dd2, 0x10401080, 0xf4f7f4f3, + 0xcb0bcb16, 0x3ef83eed, 0x05140528, 0x6781671f, + 0xe4b7e473, 0x279c2725, 0x41194132, 0x8b168b2c, + 0xa7a6a751, 0x7de97dcf, 0x956e95dc, 0xd847d88e, + 0xfbcbfb8b, 0xee9fee23, 0x7ced7cc7, 0x66856617, + 0xdd53dda6, 0x175c17b8, 0x47014702, 0x9e429e84, + 0xca0fca1e, 0x2db42d75, 0xbfc6bf91, 0x071c0738, + 0xad8ead01, 0x5a755aea, 0x8336836c, 0x33cc3385, + 0x6391633f, 0x02080210, 0xaa92aa39, 0x71d971af, + 0xc807c80e, 0x196419c8, 0x49394972, 0xd943d986, + 0xf2eff2c3, 0xe3abe34b, 0x5b715be2, 0x881a8834, + 0x9a529aa4, 0x2698262d, 0x32c8328d, 0xb0fab0e9, + 0xe983e91b, 0x0f3c0f78, 0xd573d5e6, 0x803a8074, + 0xbec2be99, 0xcd13cd26, 0x34d034bd, 0x483d487a, + 0xffdbffab, 0x7af57af7, 0x907a90f4, 0x5f615fc2, + 0x2080201d, 0x68bd6867, 0x1a681ad0, 0xae82ae19, + 0xb4eab4c9, 0x544d549a, 0x937693ec, 0x2288220d, + 0x648d6407, 0xf1e3f1db, 0x73d173bf, 0x12481290, + 0x401d403a, 0x08200840, 0xc32bc356, 0xec97ec33, + 0xdb4bdb96, 0xa1bea161, 0x8d0e8d1c, 0x3df43df5, + 0x976697cc, 0x00000000, 0xcf1bcf36, 0x2bac2b45, + 0x76c57697, 0x82328264, 0xd67fd6fe, 0x1b6c1bd8, + 0xb5eeb5c1, 0xaf86af11, 0x6ab56a77, 0x505d50ba, + 0x45094512, 0xf3ebf3cb, 0x30c0309d, 0xef9bef2b, + 0x3ffc3fe5, 0x55495592, 0xa2b2a279, 0xea8fea03, + 0x6589650f, 0xbad2bab9, 0x2fbc2f65, 0xc027c04e, + 0xde5fdebe, 0x1c701ce0, 0xfdd3fdbb, 0x4d294d52, + 0x927292e4, 0x75c9758f, 0x06180630, 0x8a128a24, + 0xb2f2b2f9, 0xe6bfe663, 0x0e380e70, 0x1f7c1ff8, + 0x62956237, 0xd477d4ee, 0xa89aa829, 0x966296c4, + 0xf9c3f99b, 0xc533c566, 0x25942535, 0x597959f2, + 0x842a8454, 0x72d572b7, 0x39e439d5, 0x4c2d4c5a, + 0x5e655eca, 0x78fd78e7, 0x38e038dd, 0x8c0a8c14, + 0xd163d1c6, 0xa5aea541, 0xe2afe243, 0x6199612f, + 0xb3f6b3f1, 0x21842115, 0x9c4a9c94, 0x1e781ef0, + 0x43114322, 0xc73bc776, 0xfcd7fcb3, 0x04100420, + 0x515951b2, 0x995e99bc, 0x6da96d4f, 0x0d340d68, + 0xfacffa83, 0xdf5bdfb6, 0x7ee57ed7, 0x2490243d, + 0x3bec3bc5, 0xab96ab31, 0xce1fce3e, 0x11441188, + 0x8f068f0c, 0x4e254e4a, 0xb7e6b7d1, 0xeb8beb0b, + 0x3cf03cfd, 0x813e817c, 0x946a94d4, 0xf7fbf7eb, + 0xb9deb9a1, 0x134c1398, 0x2cb02c7d, 0xd36bd3d6, + 0xe7bbe76b, 0x6ea56e57, 0xc437c46e, 0x030c0318, + 0x5645568a, 0x440d441a, 0x7fe17fdf, 0xa99ea921, + 0x2aa82a4d, 0xbbd6bbb1, 0xc123c146, 0x535153a2, + 0xdc57dcae, 0x0b2c0b58, 0x9d4e9d9c, 0x6cad6c47, + 0x31c43195, 0x74cd7487, 0xf6fff6e3, 0x4605460a, + 0xac8aac09, 0x891e893c, 0x145014a0, 0xe1a3e15b, + 0x165816b0, 0x3ae83acd, 0x69b9696f, 0x09240948, + 0x70dd70a7, 0xb6e2b6d9, 0xd067d0ce, 0xed93ed3b, + 0xcc17cc2e, 0x4215422a, 0x985a98b4, 0xa4aaa449, + 0x28a0285d, 0x5c6d5cda, 0xf8c7f893, 0x86228644, + } +}; + +__device__ __constant__ u32 Cl[8][256] = +{ + { + 0xc07830d8, 0x05af4626, 0x7ef991b8, 0x136fcdfb, + 0x4ca113cb, 0xa9626d11, 0x08050209, 0x426e9e0d, + 0xadee6c9b, 0x590451ff, 0xdebdb90c, 0xfb06f70e, + 0xef80f296, 0x5fcede30, 0xfcef3f6d, 0xaa07a4f8, + 0x27fdc047, 0x89766535, 0xaccd2b37, 0x048c018a, + 0x71155bd2, 0x603c186c, 0xff8af684, 0xb5e16a80, + 0xe8693af5, 0x5347ddb3, 0xf6acb321, 0x5eed999c, + 0x6d965c43, 0x627a9629, 0xa321e15d, 0x8216aed5, + 0xa8412abd, 0x9fb6eee8, 0xa5eb6e92, 0x7b56d79e, + 0x8cd92313, 0xd317fd23, 0x6a7f9420, 0x9e95a944, + 0xfa25b0a2, 0x06ca8fcf, 0x558d527c, 0x5022145a, + 0xe14f7f50, 0x691a5dc9, 0x7fdad614, 0x5cab17d9, + 0x8173673c, 0xd234ba8f, 0x80502090, 0xf303f507, + 0x16c08bdd, 0xedc67cd3, 0x28110a2d, 0x1fe6ce78, + 0x7353d597, 0x25bb4e02, 0x32588273, 0x2c9d0ba7, + 0x510153f6, 0xcf94fab2, 0xdcfb3749, 0x8e9fad56, + 0x8b30eb70, 0x2371c1cd, 0xc791f8bb, 0x17e3cc71, + 0xa68ea77b, 0xb84b2eaf, 0x02468e45, 0x84dc211a, + 0x1ec589d4, 0x75995a58, 0x9179632e, 0x381b0e3f, + 0x012347ac, 0xea2fb4b0, 0x6cb51bef, 0x85ff66b6, + 0x3ff2c65c, 0x100a0412, 0x39384993, 0xafa8e2de, + 0x0ecf8dc6, 0xc87d32d1, 0x7270923b, 0x869aaf5f, + 0xc31df931, 0x4b48dba8, 0xe22ab6b9, 0x34920dbc, + 0xa4c8293e, 0x2dbe4c0b, 0x8dfa64bf, 0xe94a7d59, + 0x1b6acff2, 0x78331e77, 0xe6a6b733, 0x74ba1df4, + 0x997c6127, 0x26de87eb, 0xbde46889, 0x7a759032, + 0xab24e354, 0xf78ff48d, 0xf4ea3d64, 0xc23ebe9d, + 0x1da0403d, 0x67d5d00f, 0xd07234ca, 0x192c41b7, + 0xc95e757d, 0x9a19a8ce, 0xece53b7f, 0x0daa442f, + 0x07e9c863, 0xdb12ff2a, 0xbfa2e6cc, 0x905a2482, + 0x3a5d807a, 0x40281048, 0x56e89b95, 0x337bc5df, + 0x9690ab4d, 0x611f5fc0, 0x1c830791, 0xf5c97ac8, + 0xccf1335b, 0x00000000, 0x36d483f9, 0x4587566e, + 0x97b3ece1, 0x64b019e6, 0xfea9b128, 0xd87736c3, + 0xc15b7774, 0x112943be, 0x77dfd41d, 0xba0da0ea, + 0x124c8a57, 0xcb18fb38, 0x9df060ad, 0x2b74c3c4, + 0xe5c37eda, 0x921caac7, 0x791059db, 0x0365c9e9, + 0x0fecca6a, 0xb9686903, 0x65935e4a, 0x4ee79d8e, + 0xbe81a160, 0xe06c38fc, 0xbb2ee746, 0x52649a1f, + 0xe4e03976, 0x8fbceafa, 0x301e0c36, 0x249809ae, + 0xf940794b, 0x6359d185, 0x70361c7e, 0xf8633ee7, + 0x37f7c455, 0xeea3b53a, 0x29324d81, 0xc4f43152, + 0x9b3aef62, 0x66f697a3, 0x35b14a10, 0xf220b2ab, + 0x54ae15d0, 0xb7a7e4c5, 0xd5dd72ec, 0x5a619816, + 0xca3bbc94, 0xe785f09f, 0xddd870e5, 0x14860598, + 0xc6b2bf17, 0x410b57e4, 0x434dd9a1, 0x2ff8c24e, + 0xf1457b42, 0x15a54234, 0x94d62508, 0xf0663cee, + 0x22528661, 0x76fc93b1, 0xb32be54f, 0x20140824, + 0xb208a2e3, 0xbcc72f25, 0x4fc4da22, 0x68391a65, + 0x8335e979, 0xb684a369, 0xd79bfca9, 0x3db44819, + 0xc5d776fe, 0x313d4b9a, 0x3ed181f0, 0x88552299, + 0x0c890383, 0x4a6b9c04, 0xd1517366, 0x0b60cbe0, + 0xfdcc78c1, 0x7cbf1ffd, 0xd4fe3540, 0xeb0cf31c, + 0xa1676f18, 0x985f268b, 0x7d9c5851, 0xd6b8bb05, + 0x6b5cd38c, 0x57cbdc39, 0x6ef395aa, 0x180f061b, + 0x8a13acdc, 0x1a49885e, 0xdf9efea0, 0x21374f88, + 0x4d825467, 0xb16d6b0a, 0x46e29f87, 0xa202a6f1, + 0xae8ba572, 0x58271653, 0x9cd32701, 0x47c1d82b, + 0x95f562a4, 0x87b9e8f3, 0xe309f115, 0x0a438c4c, + 0x092645a5, 0x3c970fb5, 0xa04428b4, 0x5b42dfba, + 0xb04e2ca6, 0xcdd274f7, 0x6fd0d206, 0x482d1241, + 0xa7ade0d7, 0xd954716f, 0xceb7bd1e, 0x3b7ec7d6, + 0x2edb85e2, 0x2a578468, 0xb4c22d2c, 0x490e55ed, + 0x5d885075, 0xda31b886, 0x933fed6b, 0x44a411c2, + }, + { + 0x18c07830, 0x2305af46, 0xc67ef991, 0xe8136fcd, + 0x874ca113, 0xb8a9626d, 0x01080502, 0x4f426e9e, + 0x36adee6c, 0xa6590451, 0xd2debdb9, 0xf5fb06f7, + 0x79ef80f2, 0x6f5fcede, 0x91fcef3f, 0x52aa07a4, + 0x6027fdc0, 0xbc897665, 0x9baccd2b, 0x8e048c01, + 0xa371155b, 0x0c603c18, 0x7bff8af6, 0x35b5e16a, + 0x1de8693a, 0xe05347dd, 0xd7f6acb3, 0xc25eed99, + 0x2e6d965c, 0x4b627a96, 0xfea321e1, 0x578216ae, + 0x15a8412a, 0x779fb6ee, 0x37a5eb6e, 0xe57b56d7, + 0x9f8cd923, 0xf0d317fd, 0x4a6a7f94, 0xda9e95a9, + 0x58fa25b0, 0xc906ca8f, 0x29558d52, 0x0a502214, + 0xb1e14f7f, 0xa0691a5d, 0x6b7fdad6, 0x855cab17, + 0xbd817367, 0x5dd234ba, 0x10805020, 0xf4f303f5, + 0xcb16c08b, 0x3eedc67c, 0x0528110a, 0x671fe6ce, + 0xe47353d5, 0x2725bb4e, 0x41325882, 0x8b2c9d0b, + 0xa7510153, 0x7dcf94fa, 0x95dcfb37, 0xd88e9fad, + 0xfb8b30eb, 0xee2371c1, 0x7cc791f8, 0x6617e3cc, + 0xdda68ea7, 0x17b84b2e, 0x4702468e, 0x9e84dc21, + 0xca1ec589, 0x2d75995a, 0xbf917963, 0x07381b0e, + 0xad012347, 0x5aea2fb4, 0x836cb51b, 0x3385ff66, + 0x633ff2c6, 0x02100a04, 0xaa393849, 0x71afa8e2, + 0xc80ecf8d, 0x19c87d32, 0x49727092, 0xd9869aaf, + 0xf2c31df9, 0xe34b48db, 0x5be22ab6, 0x8834920d, + 0x9aa4c829, 0x262dbe4c, 0x328dfa64, 0xb0e94a7d, + 0xe91b6acf, 0x0f78331e, 0xd5e6a6b7, 0x8074ba1d, + 0xbe997c61, 0xcd26de87, 0x34bde468, 0x487a7590, + 0xffab24e3, 0x7af78ff4, 0x90f4ea3d, 0x5fc23ebe, + 0x201da040, 0x6867d5d0, 0x1ad07234, 0xae192c41, + 0xb4c95e75, 0x549a19a8, 0x93ece53b, 0x220daa44, + 0x6407e9c8, 0xf1db12ff, 0x73bfa2e6, 0x12905a24, + 0x403a5d80, 0x08402810, 0xc356e89b, 0xec337bc5, + 0xdb9690ab, 0xa1611f5f, 0x8d1c8307, 0x3df5c97a, + 0x97ccf133, 0x00000000, 0xcf36d483, 0x2b458756, + 0x7697b3ec, 0x8264b019, 0xd6fea9b1, 0x1bd87736, + 0xb5c15b77, 0xaf112943, 0x6a77dfd4, 0x50ba0da0, + 0x45124c8a, 0xf3cb18fb, 0x309df060, 0xef2b74c3, + 0x3fe5c37e, 0x55921caa, 0xa2791059, 0xea0365c9, + 0x650fecca, 0xbab96869, 0x2f65935e, 0xc04ee79d, + 0xdebe81a1, 0x1ce06c38, 0xfdbb2ee7, 0x4d52649a, + 0x92e4e039, 0x758fbcea, 0x06301e0c, 0x8a249809, + 0xb2f94079, 0xe66359d1, 0x0e70361c, 0x1ff8633e, + 0x6237f7c4, 0xd4eea3b5, 0xa829324d, 0x96c4f431, + 0xf99b3aef, 0xc566f697, 0x2535b14a, 0x59f220b2, + 0x8454ae15, 0x72b7a7e4, 0x39d5dd72, 0x4c5a6198, + 0x5eca3bbc, 0x78e785f0, 0x38ddd870, 0x8c148605, + 0xd1c6b2bf, 0xa5410b57, 0xe2434dd9, 0x612ff8c2, + 0xb3f1457b, 0x2115a542, 0x9c94d625, 0x1ef0663c, + 0x43225286, 0xc776fc93, 0xfcb32be5, 0x04201408, + 0x51b208a2, 0x99bcc72f, 0x6d4fc4da, 0x0d68391a, + 0xfa8335e9, 0xdfb684a3, 0x7ed79bfc, 0x243db448, + 0x3bc5d776, 0xab313d4b, 0xce3ed181, 0x11885522, + 0x8f0c8903, 0x4e4a6b9c, 0xb7d15173, 0xeb0b60cb, + 0x3cfdcc78, 0x817cbf1f, 0x94d4fe35, 0xf7eb0cf3, + 0xb9a1676f, 0x13985f26, 0x2c7d9c58, 0xd3d6b8bb, + 0xe76b5cd3, 0x6e57cbdc, 0xc46ef395, 0x03180f06, + 0x568a13ac, 0x441a4988, 0x7fdf9efe, 0xa921374f, + 0x2a4d8254, 0xbbb16d6b, 0xc146e29f, 0x53a202a6, + 0xdcae8ba5, 0x0b582716, 0x9d9cd327, 0x6c47c1d8, + 0x3195f562, 0x7487b9e8, 0xf6e309f1, 0x460a438c, + 0xac092645, 0x893c970f, 0x14a04428, 0xe15b42df, + 0x16b04e2c, 0x3acdd274, 0x696fd0d2, 0x09482d12, + 0x70a7ade0, 0xb6d95471, 0xd0ceb7bd, 0xed3b7ec7, + 0xcc2edb85, 0x422a5784, 0x98b4c22d, 0xa4490e55, + 0x285d8850, 0x5cda31b8, 0xf8933fed, 0x8644a411, + }, + { + 0x6018c078, 0x8c2305af, 0x3fc67ef9, 0x87e8136f, + 0x26874ca1, 0xdab8a962, 0x04010805, 0x214f426e, + 0xd836adee, 0xa2a65904, 0x6fd2debd, 0xf3f5fb06, + 0xf979ef80, 0xa16f5fce, 0x7e91fcef, 0x5552aa07, + 0x9d6027fd, 0xcabc8976, 0x569baccd, 0x028e048c, + 0xb6a37115, 0x300c603c, 0xf17bff8a, 0xd435b5e1, + 0x741de869, 0xa7e05347, 0x7bd7f6ac, 0x2fc25eed, + 0xb82e6d96, 0x314b627a, 0xdffea321, 0x41578216, + 0x5415a841, 0xc1779fb6, 0xdc37a5eb, 0xb3e57b56, + 0x469f8cd9, 0xe7f0d317, 0x354a6a7f, 0x4fda9e95, + 0x7d58fa25, 0x03c906ca, 0xa429558d, 0x280a5022, + 0xfeb1e14f, 0xbaa0691a, 0xb16b7fda, 0x2e855cab, + 0xcebd8173, 0x695dd234, 0x40108050, 0xf7f4f303, + 0x0bcb16c0, 0xf83eedc6, 0x14052811, 0x81671fe6, + 0xb7e47353, 0x9c2725bb, 0x19413258, 0x168b2c9d, + 0xa6a75101, 0xe97dcf94, 0x6e95dcfb, 0x47d88e9f, + 0xcbfb8b30, 0x9fee2371, 0xed7cc791, 0x856617e3, + 0x53dda68e, 0x5c17b84b, 0x01470246, 0x429e84dc, + 0x0fca1ec5, 0xb42d7599, 0xc6bf9179, 0x1c07381b, + 0x8ead0123, 0x755aea2f, 0x36836cb5, 0xcc3385ff, + 0x91633ff2, 0x0802100a, 0x92aa3938, 0xd971afa8, + 0x07c80ecf, 0x6419c87d, 0x39497270, 0x43d9869a, + 0xeff2c31d, 0xabe34b48, 0x715be22a, 0x1a883492, + 0x529aa4c8, 0x98262dbe, 0xc8328dfa, 0xfab0e94a, + 0x83e91b6a, 0x3c0f7833, 0x73d5e6a6, 0x3a8074ba, + 0xc2be997c, 0x13cd26de, 0xd034bde4, 0x3d487a75, + 0xdbffab24, 0xf57af78f, 0x7a90f4ea, 0x615fc23e, + 0x80201da0, 0xbd6867d5, 0x681ad072, 0x82ae192c, + 0xeab4c95e, 0x4d549a19, 0x7693ece5, 0x88220daa, + 0x8d6407e9, 0xe3f1db12, 0xd173bfa2, 0x4812905a, + 0x1d403a5d, 0x20084028, 0x2bc356e8, 0x97ec337b, + 0x4bdb9690, 0xbea1611f, 0x0e8d1c83, 0xf43df5c9, + 0x6697ccf1, 0x00000000, 0x1bcf36d4, 0xac2b4587, + 0xc57697b3, 0x328264b0, 0x7fd6fea9, 0x6c1bd877, + 0xeeb5c15b, 0x86af1129, 0xb56a77df, 0x5d50ba0d, + 0x0945124c, 0xebf3cb18, 0xc0309df0, 0x9bef2b74, + 0xfc3fe5c3, 0x4955921c, 0xb2a27910, 0x8fea0365, + 0x89650fec, 0xd2bab968, 0xbc2f6593, 0x27c04ee7, + 0x5fdebe81, 0x701ce06c, 0xd3fdbb2e, 0x294d5264, + 0x7292e4e0, 0xc9758fbc, 0x1806301e, 0x128a2498, + 0xf2b2f940, 0xbfe66359, 0x380e7036, 0x7c1ff863, + 0x956237f7, 0x77d4eea3, 0x9aa82932, 0x6296c4f4, + 0xc3f99b3a, 0x33c566f6, 0x942535b1, 0x7959f220, + 0x2a8454ae, 0xd572b7a7, 0xe439d5dd, 0x2d4c5a61, + 0x655eca3b, 0xfd78e785, 0xe038ddd8, 0x0a8c1486, + 0x63d1c6b2, 0xaea5410b, 0xafe2434d, 0x99612ff8, + 0xf6b3f145, 0x842115a5, 0x4a9c94d6, 0x781ef066, + 0x11432252, 0x3bc776fc, 0xd7fcb32b, 0x10042014, + 0x5951b208, 0x5e99bcc7, 0xa96d4fc4, 0x340d6839, + 0xcffa8335, 0x5bdfb684, 0xe57ed79b, 0x90243db4, + 0xec3bc5d7, 0x96ab313d, 0x1fce3ed1, 0x44118855, + 0x068f0c89, 0x254e4a6b, 0xe6b7d151, 0x8beb0b60, + 0xf03cfdcc, 0x3e817cbf, 0x6a94d4fe, 0xfbf7eb0c, + 0xdeb9a167, 0x4c13985f, 0xb02c7d9c, 0x6bd3d6b8, + 0xbbe76b5c, 0xa56e57cb, 0x37c46ef3, 0x0c03180f, + 0x45568a13, 0x0d441a49, 0xe17fdf9e, 0x9ea92137, + 0xa82a4d82, 0xd6bbb16d, 0x23c146e2, 0x5153a202, + 0x57dcae8b, 0x2c0b5827, 0x4e9d9cd3, 0xad6c47c1, + 0xc43195f5, 0xcd7487b9, 0xfff6e309, 0x05460a43, + 0x8aac0926, 0x1e893c97, 0x5014a044, 0xa3e15b42, + 0x5816b04e, 0xe83acdd2, 0xb9696fd0, 0x2409482d, + 0xdd70a7ad, 0xe2b6d954, 0x67d0ceb7, 0x93ed3b7e, + 0x17cc2edb, 0x15422a57, 0x5a98b4c2, 0xaaa4490e, + 0xa0285d88, 0x6d5cda31, 0xc7f8933f, 0x228644a4, + }, + { + 0x186018c0, 0x238c2305, 0xc63fc67e, 0xe887e813, + 0x8726874c, 0xb8dab8a9, 0x01040108, 0x4f214f42, + 0x36d836ad, 0xa6a2a659, 0xd26fd2de, 0xf5f3f5fb, + 0x79f979ef, 0x6fa16f5f, 0x917e91fc, 0x525552aa, + 0x609d6027, 0xbccabc89, 0x9b569bac, 0x8e028e04, + 0xa3b6a371, 0x0c300c60, 0x7bf17bff, 0x35d435b5, + 0x1d741de8, 0xe0a7e053, 0xd77bd7f6, 0xc22fc25e, + 0x2eb82e6d, 0x4b314b62, 0xfedffea3, 0x57415782, + 0x155415a8, 0x77c1779f, 0x37dc37a5, 0xe5b3e57b, + 0x9f469f8c, 0xf0e7f0d3, 0x4a354a6a, 0xda4fda9e, + 0x587d58fa, 0xc903c906, 0x29a42955, 0x0a280a50, + 0xb1feb1e1, 0xa0baa069, 0x6bb16b7f, 0x852e855c, + 0xbdcebd81, 0x5d695dd2, 0x10401080, 0xf4f7f4f3, + 0xcb0bcb16, 0x3ef83eed, 0x05140528, 0x6781671f, + 0xe4b7e473, 0x279c2725, 0x41194132, 0x8b168b2c, + 0xa7a6a751, 0x7de97dcf, 0x956e95dc, 0xd847d88e, + 0xfbcbfb8b, 0xee9fee23, 0x7ced7cc7, 0x66856617, + 0xdd53dda6, 0x175c17b8, 0x47014702, 0x9e429e84, + 0xca0fca1e, 0x2db42d75, 0xbfc6bf91, 0x071c0738, + 0xad8ead01, 0x5a755aea, 0x8336836c, 0x33cc3385, + 0x6391633f, 0x02080210, 0xaa92aa39, 0x71d971af, + 0xc807c80e, 0x196419c8, 0x49394972, 0xd943d986, + 0xf2eff2c3, 0xe3abe34b, 0x5b715be2, 0x881a8834, + 0x9a529aa4, 0x2698262d, 0x32c8328d, 0xb0fab0e9, + 0xe983e91b, 0x0f3c0f78, 0xd573d5e6, 0x803a8074, + 0xbec2be99, 0xcd13cd26, 0x34d034bd, 0x483d487a, + 0xffdbffab, 0x7af57af7, 0x907a90f4, 0x5f615fc2, + 0x2080201d, 0x68bd6867, 0x1a681ad0, 0xae82ae19, + 0xb4eab4c9, 0x544d549a, 0x937693ec, 0x2288220d, + 0x648d6407, 0xf1e3f1db, 0x73d173bf, 0x12481290, + 0x401d403a, 0x08200840, 0xc32bc356, 0xec97ec33, + 0xdb4bdb96, 0xa1bea161, 0x8d0e8d1c, 0x3df43df5, + 0x976697cc, 0x00000000, 0xcf1bcf36, 0x2bac2b45, + 0x76c57697, 0x82328264, 0xd67fd6fe, 0x1b6c1bd8, + 0xb5eeb5c1, 0xaf86af11, 0x6ab56a77, 0x505d50ba, + 0x45094512, 0xf3ebf3cb, 0x30c0309d, 0xef9bef2b, + 0x3ffc3fe5, 0x55495592, 0xa2b2a279, 0xea8fea03, + 0x6589650f, 0xbad2bab9, 0x2fbc2f65, 0xc027c04e, + 0xde5fdebe, 0x1c701ce0, 0xfdd3fdbb, 0x4d294d52, + 0x927292e4, 0x75c9758f, 0x06180630, 0x8a128a24, + 0xb2f2b2f9, 0xe6bfe663, 0x0e380e70, 0x1f7c1ff8, + 0x62956237, 0xd477d4ee, 0xa89aa829, 0x966296c4, + 0xf9c3f99b, 0xc533c566, 0x25942535, 0x597959f2, + 0x842a8454, 0x72d572b7, 0x39e439d5, 0x4c2d4c5a, + 0x5e655eca, 0x78fd78e7, 0x38e038dd, 0x8c0a8c14, + 0xd163d1c6, 0xa5aea541, 0xe2afe243, 0x6199612f, + 0xb3f6b3f1, 0x21842115, 0x9c4a9c94, 0x1e781ef0, + 0x43114322, 0xc73bc776, 0xfcd7fcb3, 0x04100420, + 0x515951b2, 0x995e99bc, 0x6da96d4f, 0x0d340d68, + 0xfacffa83, 0xdf5bdfb6, 0x7ee57ed7, 0x2490243d, + 0x3bec3bc5, 0xab96ab31, 0xce1fce3e, 0x11441188, + 0x8f068f0c, 0x4e254e4a, 0xb7e6b7d1, 0xeb8beb0b, + 0x3cf03cfd, 0x813e817c, 0x946a94d4, 0xf7fbf7eb, + 0xb9deb9a1, 0x134c1398, 0x2cb02c7d, 0xd36bd3d6, + 0xe7bbe76b, 0x6ea56e57, 0xc437c46e, 0x030c0318, + 0x5645568a, 0x440d441a, 0x7fe17fdf, 0xa99ea921, + 0x2aa82a4d, 0xbbd6bbb1, 0xc123c146, 0x535153a2, + 0xdc57dcae, 0x0b2c0b58, 0x9d4e9d9c, 0x6cad6c47, + 0x31c43195, 0x74cd7487, 0xf6fff6e3, 0x4605460a, + 0xac8aac09, 0x891e893c, 0x145014a0, 0xe1a3e15b, + 0x165816b0, 0x3ae83acd, 0x69b9696f, 0x09240948, + 0x70dd70a7, 0xb6e2b6d9, 0xd067d0ce, 0xed93ed3b, + 0xcc17cc2e, 0x4215422a, 0x985a98b4, 0xa4aaa449, + 0x28a0285d, 0x5c6d5cda, 0xf8c7f893, 0x86228644, + }, + { + 0x18186018, 0x23238c23, 0xc6c63fc6, 0xe8e887e8, + 0x87872687, 0xb8b8dab8, 0x01010401, 0x4f4f214f, + 0x3636d836, 0xa6a6a2a6, 0xd2d26fd2, 0xf5f5f3f5, + 0x7979f979, 0x6f6fa16f, 0x91917e91, 0x52525552, + 0x60609d60, 0xbcbccabc, 0x9b9b569b, 0x8e8e028e, + 0xa3a3b6a3, 0x0c0c300c, 0x7b7bf17b, 0x3535d435, + 0x1d1d741d, 0xe0e0a7e0, 0xd7d77bd7, 0xc2c22fc2, + 0x2e2eb82e, 0x4b4b314b, 0xfefedffe, 0x57574157, + 0x15155415, 0x7777c177, 0x3737dc37, 0xe5e5b3e5, + 0x9f9f469f, 0xf0f0e7f0, 0x4a4a354a, 0xdada4fda, + 0x58587d58, 0xc9c903c9, 0x2929a429, 0x0a0a280a, + 0xb1b1feb1, 0xa0a0baa0, 0x6b6bb16b, 0x85852e85, + 0xbdbdcebd, 0x5d5d695d, 0x10104010, 0xf4f4f7f4, + 0xcbcb0bcb, 0x3e3ef83e, 0x05051405, 0x67678167, + 0xe4e4b7e4, 0x27279c27, 0x41411941, 0x8b8b168b, + 0xa7a7a6a7, 0x7d7de97d, 0x95956e95, 0xd8d847d8, + 0xfbfbcbfb, 0xeeee9fee, 0x7c7ced7c, 0x66668566, + 0xdddd53dd, 0x17175c17, 0x47470147, 0x9e9e429e, + 0xcaca0fca, 0x2d2db42d, 0xbfbfc6bf, 0x07071c07, + 0xadad8ead, 0x5a5a755a, 0x83833683, 0x3333cc33, + 0x63639163, 0x02020802, 0xaaaa92aa, 0x7171d971, + 0xc8c807c8, 0x19196419, 0x49493949, 0xd9d943d9, + 0xf2f2eff2, 0xe3e3abe3, 0x5b5b715b, 0x88881a88, + 0x9a9a529a, 0x26269826, 0x3232c832, 0xb0b0fab0, + 0xe9e983e9, 0x0f0f3c0f, 0xd5d573d5, 0x80803a80, + 0xbebec2be, 0xcdcd13cd, 0x3434d034, 0x48483d48, + 0xffffdbff, 0x7a7af57a, 0x90907a90, 0x5f5f615f, + 0x20208020, 0x6868bd68, 0x1a1a681a, 0xaeae82ae, + 0xb4b4eab4, 0x54544d54, 0x93937693, 0x22228822, + 0x64648d64, 0xf1f1e3f1, 0x7373d173, 0x12124812, + 0x40401d40, 0x08082008, 0xc3c32bc3, 0xecec97ec, + 0xdbdb4bdb, 0xa1a1bea1, 0x8d8d0e8d, 0x3d3df43d, + 0x97976697, 0x00000000, 0xcfcf1bcf, 0x2b2bac2b, + 0x7676c576, 0x82823282, 0xd6d67fd6, 0x1b1b6c1b, + 0xb5b5eeb5, 0xafaf86af, 0x6a6ab56a, 0x50505d50, + 0x45450945, 0xf3f3ebf3, 0x3030c030, 0xefef9bef, + 0x3f3ffc3f, 0x55554955, 0xa2a2b2a2, 0xeaea8fea, + 0x65658965, 0xbabad2ba, 0x2f2fbc2f, 0xc0c027c0, + 0xdede5fde, 0x1c1c701c, 0xfdfdd3fd, 0x4d4d294d, + 0x92927292, 0x7575c975, 0x06061806, 0x8a8a128a, + 0xb2b2f2b2, 0xe6e6bfe6, 0x0e0e380e, 0x1f1f7c1f, + 0x62629562, 0xd4d477d4, 0xa8a89aa8, 0x96966296, + 0xf9f9c3f9, 0xc5c533c5, 0x25259425, 0x59597959, + 0x84842a84, 0x7272d572, 0x3939e439, 0x4c4c2d4c, + 0x5e5e655e, 0x7878fd78, 0x3838e038, 0x8c8c0a8c, + 0xd1d163d1, 0xa5a5aea5, 0xe2e2afe2, 0x61619961, + 0xb3b3f6b3, 0x21218421, 0x9c9c4a9c, 0x1e1e781e, + 0x43431143, 0xc7c73bc7, 0xfcfcd7fc, 0x04041004, + 0x51515951, 0x99995e99, 0x6d6da96d, 0x0d0d340d, + 0xfafacffa, 0xdfdf5bdf, 0x7e7ee57e, 0x24249024, + 0x3b3bec3b, 0xabab96ab, 0xcece1fce, 0x11114411, + 0x8f8f068f, 0x4e4e254e, 0xb7b7e6b7, 0xebeb8beb, + 0x3c3cf03c, 0x81813e81, 0x94946a94, 0xf7f7fbf7, + 0xb9b9deb9, 0x13134c13, 0x2c2cb02c, 0xd3d36bd3, + 0xe7e7bbe7, 0x6e6ea56e, 0xc4c437c4, 0x03030c03, + 0x56564556, 0x44440d44, 0x7f7fe17f, 0xa9a99ea9, + 0x2a2aa82a, 0xbbbbd6bb, 0xc1c123c1, 0x53535153, + 0xdcdc57dc, 0x0b0b2c0b, 0x9d9d4e9d, 0x6c6cad6c, + 0x3131c431, 0x7474cd74, 0xf6f6fff6, 0x46460546, + 0xacac8aac, 0x89891e89, 0x14145014, 0xe1e1a3e1, + 0x16165816, 0x3a3ae83a, 0x6969b969, 0x09092409, + 0x7070dd70, 0xb6b6e2b6, 0xd0d067d0, 0xeded93ed, + 0xcccc17cc, 0x42421542, 0x98985a98, 0xa4a4aaa4, + 0x2828a028, 0x5c5c6d5c, 0xf8f8c7f8, 0x86862286, + }, + { + 0xd8181860, 0x2623238c, 0xb8c6c63f, 0xfbe8e887, + 0xcb878726, 0x11b8b8da, 0x09010104, 0x0d4f4f21, + 0x9b3636d8, 0xffa6a6a2, 0x0cd2d26f, 0x0ef5f5f3, + 0x967979f9, 0x306f6fa1, 0x6d91917e, 0xf8525255, + 0x4760609d, 0x35bcbcca, 0x379b9b56, 0x8a8e8e02, + 0xd2a3a3b6, 0x6c0c0c30, 0x847b7bf1, 0x803535d4, + 0xf51d1d74, 0xb3e0e0a7, 0x21d7d77b, 0x9cc2c22f, + 0x432e2eb8, 0x294b4b31, 0x5dfefedf, 0xd5575741, + 0xbd151554, 0xe87777c1, 0x923737dc, 0x9ee5e5b3, + 0x139f9f46, 0x23f0f0e7, 0x204a4a35, 0x44dada4f, + 0xa258587d, 0xcfc9c903, 0x7c2929a4, 0x5a0a0a28, + 0x50b1b1fe, 0xc9a0a0ba, 0x146b6bb1, 0xd985852e, + 0x3cbdbdce, 0x8f5d5d69, 0x90101040, 0x07f4f4f7, + 0xddcbcb0b, 0xd33e3ef8, 0x2d050514, 0x78676781, + 0x97e4e4b7, 0x0227279c, 0x73414119, 0xa78b8b16, + 0xf6a7a7a6, 0xb27d7de9, 0x4995956e, 0x56d8d847, + 0x70fbfbcb, 0xcdeeee9f, 0xbb7c7ced, 0x71666685, + 0x7bdddd53, 0xaf17175c, 0x45474701, 0x1a9e9e42, + 0xd4caca0f, 0x582d2db4, 0x2ebfbfc6, 0x3f07071c, + 0xacadad8e, 0xb05a5a75, 0xef838336, 0xb63333cc, + 0x5c636391, 0x12020208, 0x93aaaa92, 0xde7171d9, + 0xc6c8c807, 0xd1191964, 0x3b494939, 0x5fd9d943, + 0x31f2f2ef, 0xa8e3e3ab, 0xb95b5b71, 0xbc88881a, + 0x3e9a9a52, 0x0b262698, 0xbf3232c8, 0x59b0b0fa, + 0xf2e9e983, 0x770f0f3c, 0x33d5d573, 0xf480803a, + 0x27bebec2, 0xebcdcd13, 0x893434d0, 0x3248483d, + 0x54ffffdb, 0x8d7a7af5, 0x6490907a, 0x9d5f5f61, + 0x3d202080, 0x0f6868bd, 0xca1a1a68, 0xb7aeae82, + 0x7db4b4ea, 0xce54544d, 0x7f939376, 0x2f222288, + 0x6364648d, 0x2af1f1e3, 0xcc7373d1, 0x82121248, + 0x7a40401d, 0x48080820, 0x95c3c32b, 0xdfecec97, + 0x4ddbdb4b, 0xc0a1a1be, 0x918d8d0e, 0xc83d3df4, + 0x5b979766, 0x00000000, 0xf9cfcf1b, 0x6e2b2bac, + 0xe17676c5, 0xe6828232, 0x28d6d67f, 0xc31b1b6c, + 0x74b5b5ee, 0xbeafaf86, 0x1d6a6ab5, 0xea50505d, + 0x57454509, 0x38f3f3eb, 0xad3030c0, 0xc4efef9b, + 0xda3f3ffc, 0xc7555549, 0xdba2a2b2, 0xe9eaea8f, + 0x6a656589, 0x03babad2, 0x4a2f2fbc, 0x8ec0c027, + 0x60dede5f, 0xfc1c1c70, 0x46fdfdd3, 0x1f4d4d29, + 0x76929272, 0xfa7575c9, 0x36060618, 0xae8a8a12, + 0x4bb2b2f2, 0x85e6e6bf, 0x7e0e0e38, 0xe71f1f7c, + 0x55626295, 0x3ad4d477, 0x81a8a89a, 0x52969662, + 0x62f9f9c3, 0xa3c5c533, 0x10252594, 0xab595979, + 0xd084842a, 0xc57272d5, 0xec3939e4, 0x164c4c2d, + 0x945e5e65, 0x9f7878fd, 0xe53838e0, 0x988c8c0a, + 0x17d1d163, 0xe4a5a5ae, 0xa1e2e2af, 0x4e616199, + 0x42b3b3f6, 0x34212184, 0x089c9c4a, 0xee1e1e78, + 0x61434311, 0xb1c7c73b, 0x4ffcfcd7, 0x24040410, + 0xe3515159, 0x2599995e, 0x226d6da9, 0x650d0d34, + 0x79fafacf, 0x69dfdf5b, 0xa97e7ee5, 0x19242490, + 0xfe3b3bec, 0x9aabab96, 0xf0cece1f, 0x99111144, + 0x838f8f06, 0x044e4e25, 0x66b7b7e6, 0xe0ebeb8b, + 0xc13c3cf0, 0xfd81813e, 0x4094946a, 0x1cf7f7fb, + 0x18b9b9de, 0x8b13134c, 0x512c2cb0, 0x05d3d36b, + 0x8ce7e7bb, 0x396e6ea5, 0xaac4c437, 0x1b03030c, + 0xdc565645, 0x5e44440d, 0xa07f7fe1, 0x88a9a99e, + 0x672a2aa8, 0x0abbbbd6, 0x87c1c123, 0xf1535351, + 0x72dcdc57, 0x530b0b2c, 0x019d9d4e, 0x2b6c6cad, + 0xa43131c4, 0xf37474cd, 0x15f6f6ff, 0x4c464605, + 0xa5acac8a, 0xb589891e, 0xb4141450, 0xbae1e1a3, + 0xa6161658, 0xf73a3ae8, 0x066969b9, 0x41090924, + 0xd77070dd, 0x6fb6b6e2, 0x1ed0d067, 0xd6eded93, + 0xe2cccc17, 0x68424215, 0x2c98985a, 0xeda4a4aa, + 0x752828a0, 0x865c5c6d, 0x6bf8f8c7, 0xc2868622, + }, + { + 0x30d81818, 0x46262323, 0x91b8c6c6, 0xcdfbe8e8, + 0x13cb8787, 0x6d11b8b8, 0x02090101, 0x9e0d4f4f, + 0x6c9b3636, 0x51ffa6a6, 0xb90cd2d2, 0xf70ef5f5, + 0xf2967979, 0xde306f6f, 0x3f6d9191, 0xa4f85252, + 0xc0476060, 0x6535bcbc, 0x2b379b9b, 0x018a8e8e, + 0x5bd2a3a3, 0x186c0c0c, 0xf6847b7b, 0x6a803535, + 0x3af51d1d, 0xddb3e0e0, 0xb321d7d7, 0x999cc2c2, + 0x5c432e2e, 0x96294b4b, 0xe15dfefe, 0xaed55757, + 0x2abd1515, 0xeee87777, 0x6e923737, 0xd79ee5e5, + 0x23139f9f, 0xfd23f0f0, 0x94204a4a, 0xa944dada, + 0xb0a25858, 0x8fcfc9c9, 0x527c2929, 0x145a0a0a, + 0x7f50b1b1, 0x5dc9a0a0, 0xd6146b6b, 0x17d98585, + 0x673cbdbd, 0xba8f5d5d, 0x20901010, 0xf507f4f4, + 0x8bddcbcb, 0x7cd33e3e, 0x0a2d0505, 0xce786767, + 0xd597e4e4, 0x4e022727, 0x82734141, 0x0ba78b8b, + 0x53f6a7a7, 0xfab27d7d, 0x37499595, 0xad56d8d8, + 0xeb70fbfb, 0xc1cdeeee, 0xf8bb7c7c, 0xcc716666, + 0xa77bdddd, 0x2eaf1717, 0x8e454747, 0x211a9e9e, + 0x89d4caca, 0x5a582d2d, 0x632ebfbf, 0x0e3f0707, + 0x47acadad, 0xb4b05a5a, 0x1bef8383, 0x66b63333, + 0xc65c6363, 0x04120202, 0x4993aaaa, 0xe2de7171, + 0x8dc6c8c8, 0x32d11919, 0x923b4949, 0xaf5fd9d9, + 0xf931f2f2, 0xdba8e3e3, 0xb6b95b5b, 0x0dbc8888, + 0x293e9a9a, 0x4c0b2626, 0x64bf3232, 0x7d59b0b0, + 0xcff2e9e9, 0x1e770f0f, 0xb733d5d5, 0x1df48080, + 0x6127bebe, 0x87ebcdcd, 0x68893434, 0x90324848, + 0xe354ffff, 0xf48d7a7a, 0x3d649090, 0xbe9d5f5f, + 0x403d2020, 0xd00f6868, 0x34ca1a1a, 0x41b7aeae, + 0x757db4b4, 0xa8ce5454, 0x3b7f9393, 0x442f2222, + 0xc8636464, 0xff2af1f1, 0xe6cc7373, 0x24821212, + 0x807a4040, 0x10480808, 0x9b95c3c3, 0xc5dfecec, + 0xab4ddbdb, 0x5fc0a1a1, 0x07918d8d, 0x7ac83d3d, + 0x335b9797, 0x00000000, 0x83f9cfcf, 0x566e2b2b, + 0xece17676, 0x19e68282, 0xb128d6d6, 0x36c31b1b, + 0x7774b5b5, 0x43beafaf, 0xd41d6a6a, 0xa0ea5050, + 0x8a574545, 0xfb38f3f3, 0x60ad3030, 0xc3c4efef, + 0x7eda3f3f, 0xaac75555, 0x59dba2a2, 0xc9e9eaea, + 0xca6a6565, 0x6903baba, 0x5e4a2f2f, 0x9d8ec0c0, + 0xa160dede, 0x38fc1c1c, 0xe746fdfd, 0x9a1f4d4d, + 0x39769292, 0xeafa7575, 0x0c360606, 0x09ae8a8a, + 0x794bb2b2, 0xd185e6e6, 0x1c7e0e0e, 0x3ee71f1f, + 0xc4556262, 0xb53ad4d4, 0x4d81a8a8, 0x31529696, + 0xef62f9f9, 0x97a3c5c5, 0x4a102525, 0xb2ab5959, + 0x15d08484, 0xe4c57272, 0x72ec3939, 0x98164c4c, + 0xbc945e5e, 0xf09f7878, 0x70e53838, 0x05988c8c, + 0xbf17d1d1, 0x57e4a5a5, 0xd9a1e2e2, 0xc24e6161, + 0x7b42b3b3, 0x42342121, 0x25089c9c, 0x3cee1e1e, + 0x86614343, 0x93b1c7c7, 0xe54ffcfc, 0x08240404, + 0xa2e35151, 0x2f259999, 0xda226d6d, 0x1a650d0d, + 0xe979fafa, 0xa369dfdf, 0xfca97e7e, 0x48192424, + 0x76fe3b3b, 0x4b9aabab, 0x81f0cece, 0x22991111, + 0x03838f8f, 0x9c044e4e, 0x7366b7b7, 0xcbe0ebeb, + 0x78c13c3c, 0x1ffd8181, 0x35409494, 0xf31cf7f7, + 0x6f18b9b9, 0x268b1313, 0x58512c2c, 0xbb05d3d3, + 0xd38ce7e7, 0xdc396e6e, 0x95aac4c4, 0x061b0303, + 0xacdc5656, 0x885e4444, 0xfea07f7f, 0x4f88a9a9, + 0x54672a2a, 0x6b0abbbb, 0x9f87c1c1, 0xa6f15353, + 0xa572dcdc, 0x16530b0b, 0x27019d9d, 0xd82b6c6c, + 0x62a43131, 0xe8f37474, 0xf115f6f6, 0x8c4c4646, + 0x45a5acac, 0x0fb58989, 0x28b41414, 0xdfbae1e1, + 0x2ca61616, 0x74f73a3a, 0xd2066969, 0x12410909, + 0xe0d77070, 0x716fb6b6, 0xbd1ed0d0, 0xc7d6eded, + 0x85e2cccc, 0x84684242, 0x2d2c9898, 0x55eda4a4, + 0x50752828, 0xb8865c5c, 0xed6bf8f8, 0x11c28686, + }, + { + 0x7830d818, 0xaf462623, 0xf991b8c6, 0x6fcdfbe8, + 0xa113cb87, 0x626d11b8, 0x05020901, 0x6e9e0d4f, + 0xee6c9b36, 0x0451ffa6, 0xbdb90cd2, 0x06f70ef5, + 0x80f29679, 0xcede306f, 0xef3f6d91, 0x07a4f852, + 0xfdc04760, 0x766535bc, 0xcd2b379b, 0x8c018a8e, + 0x155bd2a3, 0x3c186c0c, 0x8af6847b, 0xe16a8035, + 0x693af51d, 0x47ddb3e0, 0xacb321d7, 0xed999cc2, + 0x965c432e, 0x7a96294b, 0x21e15dfe, 0x16aed557, + 0x412abd15, 0xb6eee877, 0xeb6e9237, 0x56d79ee5, + 0xd923139f, 0x17fd23f0, 0x7f94204a, 0x95a944da, + 0x25b0a258, 0xca8fcfc9, 0x8d527c29, 0x22145a0a, + 0x4f7f50b1, 0x1a5dc9a0, 0xdad6146b, 0xab17d985, + 0x73673cbd, 0x34ba8f5d, 0x50209010, 0x03f507f4, + 0xc08bddcb, 0xc67cd33e, 0x110a2d05, 0xe6ce7867, + 0x53d597e4, 0xbb4e0227, 0x58827341, 0x9d0ba78b, + 0x0153f6a7, 0x94fab27d, 0xfb374995, 0x9fad56d8, + 0x30eb70fb, 0x71c1cdee, 0x91f8bb7c, 0xe3cc7166, + 0x8ea77bdd, 0x4b2eaf17, 0x468e4547, 0xdc211a9e, + 0xc589d4ca, 0x995a582d, 0x79632ebf, 0x1b0e3f07, + 0x2347acad, 0x2fb4b05a, 0xb51bef83, 0xff66b633, + 0xf2c65c63, 0x0a041202, 0x384993aa, 0xa8e2de71, + 0xcf8dc6c8, 0x7d32d119, 0x70923b49, 0x9aaf5fd9, + 0x1df931f2, 0x48dba8e3, 0x2ab6b95b, 0x920dbc88, + 0xc8293e9a, 0xbe4c0b26, 0xfa64bf32, 0x4a7d59b0, + 0x6acff2e9, 0x331e770f, 0xa6b733d5, 0xba1df480, + 0x7c6127be, 0xde87ebcd, 0xe4688934, 0x75903248, + 0x24e354ff, 0x8ff48d7a, 0xea3d6490, 0x3ebe9d5f, + 0xa0403d20, 0xd5d00f68, 0x7234ca1a, 0x2c41b7ae, + 0x5e757db4, 0x19a8ce54, 0xe53b7f93, 0xaa442f22, + 0xe9c86364, 0x12ff2af1, 0xa2e6cc73, 0x5a248212, + 0x5d807a40, 0x28104808, 0xe89b95c3, 0x7bc5dfec, + 0x90ab4ddb, 0x1f5fc0a1, 0x8307918d, 0xc97ac83d, + 0xf1335b97, 0x00000000, 0xd483f9cf, 0x87566e2b, + 0xb3ece176, 0xb019e682, 0xa9b128d6, 0x7736c31b, + 0x5b7774b5, 0x2943beaf, 0xdfd41d6a, 0x0da0ea50, + 0x4c8a5745, 0x18fb38f3, 0xf060ad30, 0x74c3c4ef, + 0xc37eda3f, 0x1caac755, 0x1059dba2, 0x65c9e9ea, + 0xecca6a65, 0x686903ba, 0x935e4a2f, 0xe79d8ec0, + 0x81a160de, 0x6c38fc1c, 0x2ee746fd, 0x649a1f4d, + 0xe0397692, 0xbceafa75, 0x1e0c3606, 0x9809ae8a, + 0x40794bb2, 0x59d185e6, 0x361c7e0e, 0x633ee71f, + 0xf7c45562, 0xa3b53ad4, 0x324d81a8, 0xf4315296, + 0x3aef62f9, 0xf697a3c5, 0xb14a1025, 0x20b2ab59, + 0xae15d084, 0xa7e4c572, 0xdd72ec39, 0x6198164c, + 0x3bbc945e, 0x85f09f78, 0xd870e538, 0x8605988c, + 0xb2bf17d1, 0x0b57e4a5, 0x4dd9a1e2, 0xf8c24e61, + 0x457b42b3, 0xa5423421, 0xd625089c, 0x663cee1e, + 0x52866143, 0xfc93b1c7, 0x2be54ffc, 0x14082404, + 0x08a2e351, 0xc72f2599, 0xc4da226d, 0x391a650d, + 0x35e979fa, 0x84a369df, 0x9bfca97e, 0xb4481924, + 0xd776fe3b, 0x3d4b9aab, 0xd181f0ce, 0x55229911, + 0x8903838f, 0x6b9c044e, 0x517366b7, 0x60cbe0eb, + 0xcc78c13c, 0xbf1ffd81, 0xfe354094, 0x0cf31cf7, + 0x676f18b9, 0x5f268b13, 0x9c58512c, 0xb8bb05d3, + 0x5cd38ce7, 0xcbdc396e, 0xf395aac4, 0x0f061b03, + 0x13acdc56, 0x49885e44, 0x9efea07f, 0x374f88a9, + 0x8254672a, 0x6d6b0abb, 0xe29f87c1, 0x02a6f153, + 0x8ba572dc, 0x2716530b, 0xd327019d, 0xc1d82b6c, + 0xf562a431, 0xb9e8f374, 0x09f115f6, 0x438c4c46, + 0x2645a5ac, 0x970fb589, 0x4428b414, 0x42dfbae1, + 0x4e2ca616, 0xd274f73a, 0xd0d20669, 0x2d124109, + 0xade0d770, 0x54716fb6, 0xb7bd1ed0, 0x7ec7d6ed, + 0xdb85e2cc, 0x57846842, 0xc22d2c98, 0x0e55eda4, + 0x88507528, 0x31b8865c, 0x3fed6bf8, 0xa411c286, + }, +}; + +#ifdef VECT_SIZE1 +#define BOX(S,n,i) (u32) ((S)[(n)][(i)]) +#endif + +__device__ __constant__ u32 rch[R + 1] = +{ + 0x00000000, + 0x1823c6e8, + 0x36a6d2f5, + 0x60bc9b8e, + 0x1de0d7c2, + 0x157737e5, + 0x58c9290a, + 0xbd5d10f4, + 0xe427418b, + 0xfbee7c66, + 0xca2dbf07, +}; + +__device__ __constant__ u32 rcl[R + 1] = +{ + 0x00000000, + 0x87b8014f, + 0x796f9152, + 0xa30c7b35, + 0x2e4bfe57, + 0x9ff04ada, + 0xb1a06b85, + 0xcb3e0567, + 0xa77d95d8, + 0xdd17479e, + 0xad5a8333, +}; + +typedef unsigned char uchar; + +__device__ static void whirlpool_transform (const u32 w[16], u32 dgst[16], u32 s_Ch[8][256], u32 s_Cl[8][256]) +{ + u32 Kh[8]; + u32 Kl[8]; + + Kh[0] = dgst[ 0]; + Kl[0] = dgst[ 1]; + Kh[1] = dgst[ 2]; + Kl[1] = dgst[ 3]; + Kh[2] = dgst[ 4]; + Kl[2] = dgst[ 5]; + Kh[3] = dgst[ 6]; + Kl[3] = dgst[ 7]; + Kh[4] = dgst[ 8]; + Kl[4] = dgst[ 9]; + Kh[5] = dgst[10]; + Kl[5] = dgst[11]; + Kh[6] = dgst[12]; + Kl[6] = dgst[13]; + Kh[7] = dgst[14]; + Kl[7] = dgst[15]; + + u32 stateh[8]; + u32 statel[8]; + + stateh[0] = w[ 0] ^ Kh[0]; + statel[0] = w[ 1] ^ Kl[0]; + stateh[1] = w[ 2] ^ Kh[1]; + statel[1] = w[ 3] ^ Kl[1]; + stateh[2] = w[ 4] ^ Kh[2]; + statel[2] = w[ 5] ^ Kl[2]; + stateh[3] = w[ 6] ^ Kh[3]; + statel[3] = w[ 7] ^ Kl[3]; + stateh[4] = w[ 8] ^ Kh[4]; + statel[4] = w[ 9] ^ Kl[4]; + stateh[5] = w[10] ^ Kh[5]; + statel[5] = w[11] ^ Kl[5]; + stateh[6] = w[12] ^ Kh[6]; + statel[6] = w[13] ^ Kl[6]; + stateh[7] = w[14] ^ Kh[7]; + statel[7] = w[15] ^ Kl[7]; + + u32 r; + + for (r = 1; r <= R; r++) + { + u32 Lh[8]; + u32 Ll[8]; + + u32 i; + + #pragma unroll 8 + for (i = 0; i < 8; i++) + { + const u8 Lp0 = Kh[(i + 8) & 7] >> 24; + const u8 Lp1 = Kh[(i + 7) & 7] >> 16; + const u8 Lp2 = Kh[(i + 6) & 7] >> 8; + const u8 Lp3 = Kh[(i + 5) & 7] >> 0; + const u8 Lp4 = Kl[(i + 4) & 7] >> 24; + const u8 Lp5 = Kl[(i + 3) & 7] >> 16; + const u8 Lp6 = Kl[(i + 2) & 7] >> 8; + const u8 Lp7 = Kl[(i + 1) & 7] >> 0; + + Lh[i] = BOX (s_Ch, 0, Lp0 & 0xff) + ^ BOX (s_Ch, 1, Lp1 & 0xff) + ^ BOX (s_Ch, 2, Lp2 & 0xff) + ^ BOX (s_Ch, 3, Lp3 & 0xff) + ^ BOX (s_Ch, 4, Lp4 & 0xff) + ^ BOX (s_Ch, 5, Lp5 & 0xff) + ^ BOX (s_Ch, 6, Lp6 & 0xff) + ^ BOX (s_Ch, 7, Lp7 & 0xff); + + Ll[i] = BOX (s_Cl, 0, Lp0 & 0xff) + ^ BOX (s_Cl, 1, Lp1 & 0xff) + ^ BOX (s_Cl, 2, Lp2 & 0xff) + ^ BOX (s_Cl, 3, Lp3 & 0xff) + ^ BOX (s_Cl, 4, Lp4 & 0xff) + ^ BOX (s_Cl, 5, Lp5 & 0xff) + ^ BOX (s_Cl, 6, Lp6 & 0xff) + ^ BOX (s_Cl, 7, Lp7 & 0xff); + } + + Kh[0] = Lh[0] ^ rch[r]; + Kl[0] = Ll[0] ^ rcl[r]; + Kh[1] = Lh[1]; + Kl[1] = Ll[1]; + Kh[2] = Lh[2]; + Kl[2] = Ll[2]; + Kh[3] = Lh[3]; + Kl[3] = Ll[3]; + Kh[4] = Lh[4]; + Kl[4] = Ll[4]; + Kh[5] = Lh[5]; + Kl[5] = Ll[5]; + Kh[6] = Lh[6]; + Kl[6] = Ll[6]; + Kh[7] = Lh[7]; + Kl[7] = Ll[7]; + + #pragma unroll 8 + for (i = 0; i < 8; i++) + { + const u8 Lp0 = stateh[(i + 8) & 7] >> 24; + const u8 Lp1 = stateh[(i + 7) & 7] >> 16; + const u8 Lp2 = stateh[(i + 6) & 7] >> 8; + const u8 Lp3 = stateh[(i + 5) & 7] >> 0; + const u8 Lp4 = statel[(i + 4) & 7] >> 24; + const u8 Lp5 = statel[(i + 3) & 7] >> 16; + const u8 Lp6 = statel[(i + 2) & 7] >> 8; + const u8 Lp7 = statel[(i + 1) & 7] >> 0; + + Lh[i] = BOX (s_Ch, 0, Lp0 & 0xff) + ^ BOX (s_Ch, 1, Lp1 & 0xff) + ^ BOX (s_Ch, 2, Lp2 & 0xff) + ^ BOX (s_Ch, 3, Lp3 & 0xff) + ^ BOX (s_Ch, 4, Lp4 & 0xff) + ^ BOX (s_Ch, 5, Lp5 & 0xff) + ^ BOX (s_Ch, 6, Lp6 & 0xff) + ^ BOX (s_Ch, 7, Lp7 & 0xff); + + Ll[i] = BOX (s_Cl, 0, Lp0 & 0xff) + ^ BOX (s_Cl, 1, Lp1 & 0xff) + ^ BOX (s_Cl, 2, Lp2 & 0xff) + ^ BOX (s_Cl, 3, Lp3 & 0xff) + ^ BOX (s_Cl, 4, Lp4 & 0xff) + ^ BOX (s_Cl, 5, Lp5 & 0xff) + ^ BOX (s_Cl, 6, Lp6 & 0xff) + ^ BOX (s_Cl, 7, Lp7 & 0xff); + } + + stateh[0] = Lh[0] ^ Kh[0]; + statel[0] = Ll[0] ^ Kl[0]; + stateh[1] = Lh[1] ^ Kh[1]; + statel[1] = Ll[1] ^ Kl[1]; + stateh[2] = Lh[2] ^ Kh[2]; + statel[2] = Ll[2] ^ Kl[2]; + stateh[3] = Lh[3] ^ Kh[3]; + statel[3] = Ll[3] ^ Kl[3]; + stateh[4] = Lh[4] ^ Kh[4]; + statel[4] = Ll[4] ^ Kl[4]; + stateh[5] = Lh[5] ^ Kh[5]; + statel[5] = Ll[5] ^ Kl[5]; + stateh[6] = Lh[6] ^ Kh[6]; + statel[6] = Ll[6] ^ Kl[6]; + stateh[7] = Lh[7] ^ Kh[7]; + statel[7] = Ll[7] ^ Kl[7]; + } + + dgst[ 0] ^= stateh[0] ^ w[ 0]; + dgst[ 1] ^= statel[0] ^ w[ 1]; + dgst[ 2] ^= stateh[1] ^ w[ 2]; + dgst[ 3] ^= statel[1] ^ w[ 3]; + dgst[ 4] ^= stateh[2] ^ w[ 4]; + dgst[ 5] ^= statel[2] ^ w[ 5]; + dgst[ 6] ^= stateh[3] ^ w[ 6]; + dgst[ 7] ^= statel[3] ^ w[ 7]; + dgst[ 8] ^= stateh[4] ^ w[ 8]; + dgst[ 9] ^= statel[4] ^ w[ 9]; + dgst[10] ^= stateh[5] ^ w[10]; + dgst[11] ^= statel[5] ^ w[11]; + dgst[12] ^= stateh[6] ^ w[12]; + dgst[13] ^= statel[6] ^ w[13]; + dgst[14] ^= stateh[7] ^ w[14]; + dgst[15] ^= statel[7] ^ w[15]; +} + +__device__ static void hmac_run2 (const u32 w1[16], const u32 w2[16], const u32 ipad[16], const u32 opad[16], u32 dgst[16], u32 s_Ch[8][256], u32 s_Cl[8][256]) +{ + dgst[ 0] = ipad[ 0]; + dgst[ 1] = ipad[ 1]; + dgst[ 2] = ipad[ 2]; + dgst[ 3] = ipad[ 3]; + dgst[ 4] = ipad[ 4]; + dgst[ 5] = ipad[ 5]; + dgst[ 6] = ipad[ 6]; + dgst[ 7] = ipad[ 7]; + dgst[ 8] = ipad[ 8]; + dgst[ 9] = ipad[ 9]; + dgst[10] = ipad[10]; + dgst[11] = ipad[11]; + dgst[12] = ipad[12]; + dgst[13] = ipad[13]; + dgst[14] = ipad[14]; + dgst[15] = ipad[15]; + + whirlpool_transform (w1, dgst, s_Ch, s_Cl); + whirlpool_transform (w2, dgst, s_Ch, s_Cl); + + u32 w[16]; + + w[ 0] = dgst[ 0]; + w[ 1] = dgst[ 1]; + w[ 2] = dgst[ 2]; + w[ 3] = dgst[ 3]; + w[ 4] = dgst[ 4]; + w[ 5] = dgst[ 5]; + w[ 6] = dgst[ 6]; + w[ 7] = dgst[ 7]; + w[ 8] = dgst[ 8]; + w[ 9] = dgst[ 9]; + w[10] = dgst[10]; + w[11] = dgst[11]; + w[12] = dgst[12]; + w[13] = dgst[13]; + w[14] = dgst[14]; + w[15] = dgst[15]; + + dgst[ 0] = opad[ 0]; + dgst[ 1] = opad[ 1]; + dgst[ 2] = opad[ 2]; + dgst[ 3] = opad[ 3]; + dgst[ 4] = opad[ 4]; + dgst[ 5] = opad[ 5]; + dgst[ 6] = opad[ 6]; + dgst[ 7] = opad[ 7]; + dgst[ 8] = opad[ 8]; + dgst[ 9] = opad[ 9]; + dgst[10] = opad[10]; + dgst[11] = opad[11]; + dgst[12] = opad[12]; + dgst[13] = opad[13]; + dgst[14] = opad[14]; + dgst[15] = opad[15]; + + whirlpool_transform (w, dgst, s_Ch, s_Cl); + + w[ 0] = 0x80000000; + w[ 1] = 0; + w[ 2] = 0; + w[ 3] = 0; + w[ 4] = 0; + w[ 5] = 0; + w[ 6] = 0; + w[ 7] = 0; + w[ 8] = 0; + w[ 9] = 0; + w[10] = 0; + w[11] = 0; + w[12] = 0; + w[13] = 0; + w[14] = 0; + w[15] = (64 + 64) * 8; + + whirlpool_transform (w, dgst, s_Ch, s_Cl); +} + +__device__ static void hmac_init (u32 w[16], u32 ipad[16], u32 opad[16], u32 s_Ch[8][256], u32 s_Cl[8][256]) +{ + w[ 0] ^= 0x36363636; + w[ 1] ^= 0x36363636; + w[ 2] ^= 0x36363636; + w[ 3] ^= 0x36363636; + w[ 4] ^= 0x36363636; + w[ 5] ^= 0x36363636; + w[ 6] ^= 0x36363636; + w[ 7] ^= 0x36363636; + w[ 8] ^= 0x36363636; + w[ 9] ^= 0x36363636; + w[10] ^= 0x36363636; + w[11] ^= 0x36363636; + w[12] ^= 0x36363636; + w[13] ^= 0x36363636; + w[14] ^= 0x36363636; + w[15] ^= 0x36363636; + + ipad[ 0] = 0; + ipad[ 1] = 0; + ipad[ 2] = 0; + ipad[ 3] = 0; + ipad[ 4] = 0; + ipad[ 5] = 0; + ipad[ 6] = 0; + ipad[ 7] = 0; + ipad[ 8] = 0; + ipad[ 9] = 0; + ipad[10] = 0; + ipad[11] = 0; + ipad[12] = 0; + ipad[13] = 0; + ipad[14] = 0; + ipad[15] = 0; + + whirlpool_transform (w, ipad, s_Ch, s_Cl); + + w[ 0] ^= 0x6a6a6a6a; + w[ 1] ^= 0x6a6a6a6a; + w[ 2] ^= 0x6a6a6a6a; + w[ 3] ^= 0x6a6a6a6a; + w[ 4] ^= 0x6a6a6a6a; + w[ 5] ^= 0x6a6a6a6a; + w[ 6] ^= 0x6a6a6a6a; + w[ 7] ^= 0x6a6a6a6a; + w[ 8] ^= 0x6a6a6a6a; + w[ 9] ^= 0x6a6a6a6a; + w[10] ^= 0x6a6a6a6a; + w[11] ^= 0x6a6a6a6a; + w[12] ^= 0x6a6a6a6a; + w[13] ^= 0x6a6a6a6a; + w[14] ^= 0x6a6a6a6a; + w[15] ^= 0x6a6a6a6a; + + opad[ 0] = 0; + opad[ 1] = 0; + opad[ 2] = 0; + opad[ 3] = 0; + opad[ 4] = 0; + opad[ 5] = 0; + opad[ 6] = 0; + opad[ 7] = 0; + opad[ 8] = 0; + opad[ 9] = 0; + opad[10] = 0; + opad[11] = 0; + opad[12] = 0; + opad[13] = 0; + opad[14] = 0; + opad[15] = 0; + + whirlpool_transform (w, opad, s_Ch, s_Cl); +} + +__device__ static u32 u8add (const u32 a, const u32 b) +{ + const u32 a1 = (a >> 0) & 0xff; + const u32 a2 = (a >> 8) & 0xff; + const u32 a3 = (a >> 16) & 0xff; + const u32 a4 = (a >> 24) & 0xff; + + const u32 b1 = (b >> 0) & 0xff; + const u32 b2 = (b >> 8) & 0xff; + const u32 b3 = (b >> 16) & 0xff; + const u32 b4 = (b >> 24) & 0xff; + + const u32 r1 = (a1 + b1) & 0xff; + const u32 r2 = (a2 + b2) & 0xff; + const u32 r3 = (a3 + b3) & 0xff; + const u32 r4 = (a4 + b4) & 0xff; + + const u32 r = r1 << 0 + | r2 << 8 + | r3 << 16 + | r4 << 24; + + return r; +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m06231_init (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, tc_tmp_t *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const tc_t *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = pws[gid].i[ 8]; + w2[1] = pws[gid].i[ 9]; + w2[2] = pws[gid].i[10]; + w2[3] = pws[gid].i[11]; + + u32x w3[4]; + + w3[0] = pws[gid].i[12]; + w3[1] = pws[gid].i[13]; + w3[2] = pws[gid].i[14]; + w3[3] = pws[gid].i[15]; + + /** + * keyfile + */ + + w0[0] = u8add (w0[0], esalt_bufs[salt_pos].keyfile_buf[ 0]); + w0[1] = u8add (w0[1], esalt_bufs[salt_pos].keyfile_buf[ 1]); + w0[2] = u8add (w0[2], esalt_bufs[salt_pos].keyfile_buf[ 2]); + w0[3] = u8add (w0[3], esalt_bufs[salt_pos].keyfile_buf[ 3]); + w1[0] = u8add (w1[0], esalt_bufs[salt_pos].keyfile_buf[ 4]); + w1[1] = u8add (w1[1], esalt_bufs[salt_pos].keyfile_buf[ 5]); + w1[2] = u8add (w1[2], esalt_bufs[salt_pos].keyfile_buf[ 6]); + w1[3] = u8add (w1[3], esalt_bufs[salt_pos].keyfile_buf[ 7]); + w2[0] = u8add (w2[0], esalt_bufs[salt_pos].keyfile_buf[ 8]); + w2[1] = u8add (w2[1], esalt_bufs[salt_pos].keyfile_buf[ 9]); + w2[2] = u8add (w2[2], esalt_bufs[salt_pos].keyfile_buf[10]); + w2[3] = u8add (w2[3], esalt_bufs[salt_pos].keyfile_buf[11]); + w3[0] = u8add (w3[0], esalt_bufs[salt_pos].keyfile_buf[12]); + w3[1] = u8add (w3[1], esalt_bufs[salt_pos].keyfile_buf[13]); + w3[2] = u8add (w3[2], esalt_bufs[salt_pos].keyfile_buf[14]); + w3[3] = u8add (w3[3], esalt_bufs[salt_pos].keyfile_buf[15]); + + /** + * shared mem + */ + + __shared__ u32 s_Ch[8][256]; + __shared__ u32 s_Cl[8][256]; + + const u32 lid = threadIdx.x; + + #pragma unroll 8 + for (u32 i = 0; i < 8; i++) + { + s_Ch[i][lid] = Ch[i][lid]; + s_Cl[i][lid] = Cl[i][lid]; + } + + __syncthreads (); + + if (gid >= gid_max) return; + + /** + * salt + */ + + u32 salt_buf1[16]; + + salt_buf1[ 0] = swap_workaround (esalt_bufs[salt_pos].salt_buf[ 0]); + salt_buf1[ 1] = swap_workaround (esalt_bufs[salt_pos].salt_buf[ 1]); + salt_buf1[ 2] = swap_workaround (esalt_bufs[salt_pos].salt_buf[ 2]); + salt_buf1[ 3] = swap_workaround (esalt_bufs[salt_pos].salt_buf[ 3]); + salt_buf1[ 4] = swap_workaround (esalt_bufs[salt_pos].salt_buf[ 4]); + salt_buf1[ 5] = swap_workaround (esalt_bufs[salt_pos].salt_buf[ 5]); + salt_buf1[ 6] = swap_workaround (esalt_bufs[salt_pos].salt_buf[ 6]); + salt_buf1[ 7] = swap_workaround (esalt_bufs[salt_pos].salt_buf[ 7]); + salt_buf1[ 8] = swap_workaround (esalt_bufs[salt_pos].salt_buf[ 8]); + salt_buf1[ 9] = swap_workaround (esalt_bufs[salt_pos].salt_buf[ 9]); + salt_buf1[10] = swap_workaround (esalt_bufs[salt_pos].salt_buf[10]); + salt_buf1[11] = swap_workaround (esalt_bufs[salt_pos].salt_buf[11]); + salt_buf1[12] = swap_workaround (esalt_bufs[salt_pos].salt_buf[12]); + salt_buf1[13] = swap_workaround (esalt_bufs[salt_pos].salt_buf[13]); + salt_buf1[14] = swap_workaround (esalt_bufs[salt_pos].salt_buf[14]); + salt_buf1[15] = swap_workaround (esalt_bufs[salt_pos].salt_buf[15]); + + u32 salt_buf2[16]; + + salt_buf2[ 0] = 0; + salt_buf2[ 1] = 0x80000000; + salt_buf2[ 2] = 0; + salt_buf2[ 3] = 0; + salt_buf2[ 4] = 0; + salt_buf2[ 5] = 0; + salt_buf2[ 6] = 0; + salt_buf2[ 7] = 0; + salt_buf2[ 8] = 0; + salt_buf2[ 9] = 0; + salt_buf2[10] = 0; + salt_buf2[11] = 0; + salt_buf2[12] = 0; + salt_buf2[13] = 0; + salt_buf2[14] = 0; + salt_buf2[15] = (64 + 64 + 4) * 8; + + const u32 truecrypt_mdlen = salt_bufs[0].truecrypt_mdlen; + + u32 w[16]; + + w[ 0] = swap_workaround (w0[0]); + w[ 1] = swap_workaround (w0[1]); + w[ 2] = swap_workaround (w0[2]); + w[ 3] = swap_workaround (w0[3]); + w[ 4] = swap_workaround (w1[0]); + w[ 5] = swap_workaround (w1[1]); + w[ 6] = swap_workaround (w1[2]); + w[ 7] = swap_workaround (w1[3]); + w[ 8] = swap_workaround (w2[0]); + w[ 9] = swap_workaround (w2[1]); + w[10] = swap_workaround (w2[2]); + w[11] = swap_workaround (w2[3]); + w[12] = swap_workaround (w3[0]); + w[13] = swap_workaround (w3[1]); + w[14] = swap_workaround (w3[2]); + w[15] = swap_workaround (w3[3]); + + u32 ipad[16]; + u32 opad[16]; + + hmac_init (w, ipad, opad, s_Ch, s_Cl); + + tmps[gid].ipad[ 0] = ipad[ 0]; + tmps[gid].ipad[ 1] = ipad[ 1]; + tmps[gid].ipad[ 2] = ipad[ 2]; + tmps[gid].ipad[ 3] = ipad[ 3]; + tmps[gid].ipad[ 4] = ipad[ 4]; + tmps[gid].ipad[ 5] = ipad[ 5]; + tmps[gid].ipad[ 6] = ipad[ 6]; + tmps[gid].ipad[ 7] = ipad[ 7]; + tmps[gid].ipad[ 8] = ipad[ 8]; + tmps[gid].ipad[ 9] = ipad[ 9]; + tmps[gid].ipad[10] = ipad[10]; + tmps[gid].ipad[11] = ipad[11]; + tmps[gid].ipad[12] = ipad[12]; + tmps[gid].ipad[13] = ipad[13]; + tmps[gid].ipad[14] = ipad[14]; + tmps[gid].ipad[15] = ipad[15]; + + tmps[gid].opad[ 0] = opad[ 0]; + tmps[gid].opad[ 1] = opad[ 1]; + tmps[gid].opad[ 2] = opad[ 2]; + tmps[gid].opad[ 3] = opad[ 3]; + tmps[gid].opad[ 4] = opad[ 4]; + tmps[gid].opad[ 5] = opad[ 5]; + tmps[gid].opad[ 6] = opad[ 6]; + tmps[gid].opad[ 7] = opad[ 7]; + tmps[gid].opad[ 8] = opad[ 8]; + tmps[gid].opad[ 9] = opad[ 9]; + tmps[gid].opad[10] = opad[10]; + tmps[gid].opad[11] = opad[11]; + tmps[gid].opad[12] = opad[12]; + tmps[gid].opad[13] = opad[13]; + tmps[gid].opad[14] = opad[14]; + tmps[gid].opad[15] = opad[15]; + + for (u32 i = 0, j = 1; i < (truecrypt_mdlen / 8 / 4); i += 16, j += 1) + { + salt_buf2[0] = j; + + u32 dgst[16]; + + hmac_run2 (salt_buf1, salt_buf2, ipad, opad, dgst, s_Ch, s_Cl); + + tmps[gid].dgst[i + 0] = dgst[ 0]; + tmps[gid].dgst[i + 1] = dgst[ 1]; + tmps[gid].dgst[i + 2] = dgst[ 2]; + tmps[gid].dgst[i + 3] = dgst[ 3]; + tmps[gid].dgst[i + 4] = dgst[ 4]; + tmps[gid].dgst[i + 5] = dgst[ 5]; + tmps[gid].dgst[i + 6] = dgst[ 6]; + tmps[gid].dgst[i + 7] = dgst[ 7]; + tmps[gid].dgst[i + 8] = dgst[ 8]; + tmps[gid].dgst[i + 9] = dgst[ 9]; + tmps[gid].dgst[i + 10] = dgst[10]; + tmps[gid].dgst[i + 11] = dgst[11]; + tmps[gid].dgst[i + 12] = dgst[12]; + tmps[gid].dgst[i + 13] = dgst[13]; + tmps[gid].dgst[i + 14] = dgst[14]; + tmps[gid].dgst[i + 15] = dgst[15]; + + tmps[gid].out[i + 0] = dgst[ 0]; + tmps[gid].out[i + 1] = dgst[ 1]; + tmps[gid].out[i + 2] = dgst[ 2]; + tmps[gid].out[i + 3] = dgst[ 3]; + tmps[gid].out[i + 4] = dgst[ 4]; + tmps[gid].out[i + 5] = dgst[ 5]; + tmps[gid].out[i + 6] = dgst[ 6]; + tmps[gid].out[i + 7] = dgst[ 7]; + tmps[gid].out[i + 8] = dgst[ 8]; + tmps[gid].out[i + 9] = dgst[ 9]; + tmps[gid].out[i + 10] = dgst[10]; + tmps[gid].out[i + 11] = dgst[11]; + tmps[gid].out[i + 12] = dgst[12]; + tmps[gid].out[i + 13] = dgst[13]; + tmps[gid].out[i + 14] = dgst[14]; + tmps[gid].out[i + 15] = dgst[15]; + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m06231_loop (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, tc_tmp_t *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const tc_t *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + const u32 truecrypt_mdlen = salt_bufs[0].truecrypt_mdlen; + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + __shared__ u32 s_Ch[8][256]; + __shared__ u32 s_Cl[8][256]; + + const u32 lid = threadIdx.x; + + #pragma unroll 8 + for (u32 i = 0; i < 8; i++) + { + s_Ch[i][lid] = Ch[i][lid]; + s_Cl[i][lid] = Cl[i][lid]; + } + + __syncthreads (); + + if (gid >= gid_max) return; + + u32 ipad[16]; + + ipad[ 0] = tmps[gid].ipad[ 0]; + ipad[ 1] = tmps[gid].ipad[ 1], + ipad[ 2] = tmps[gid].ipad[ 2]; + ipad[ 3] = tmps[gid].ipad[ 3]; + ipad[ 4] = tmps[gid].ipad[ 4]; + ipad[ 5] = tmps[gid].ipad[ 5]; + ipad[ 6] = tmps[gid].ipad[ 6], + ipad[ 7] = tmps[gid].ipad[ 7]; + ipad[ 8] = tmps[gid].ipad[ 8]; + ipad[ 9] = tmps[gid].ipad[ 9]; + ipad[10] = tmps[gid].ipad[10]; + ipad[11] = tmps[gid].ipad[11], + ipad[12] = tmps[gid].ipad[12]; + ipad[13] = tmps[gid].ipad[13]; + ipad[14] = tmps[gid].ipad[14]; + ipad[15] = tmps[gid].ipad[15]; + + u32 opad[16]; + + opad[ 0] = tmps[gid].opad[ 0]; + opad[ 1] = tmps[gid].opad[ 1], + opad[ 2] = tmps[gid].opad[ 2]; + opad[ 3] = tmps[gid].opad[ 3]; + opad[ 4] = tmps[gid].opad[ 4]; + opad[ 5] = tmps[gid].opad[ 5]; + opad[ 6] = tmps[gid].opad[ 6], + opad[ 7] = tmps[gid].opad[ 7]; + opad[ 8] = tmps[gid].opad[ 8]; + opad[ 9] = tmps[gid].opad[ 9]; + opad[10] = tmps[gid].opad[10]; + opad[11] = tmps[gid].opad[11], + opad[12] = tmps[gid].opad[12]; + opad[13] = tmps[gid].opad[13]; + opad[14] = tmps[gid].opad[14]; + opad[15] = tmps[gid].opad[15]; + + for (u32 i = 0; i < (truecrypt_mdlen / 8 / 4); i += 16) + { + u32 dgst[16]; + + dgst[ 0] = tmps[gid].dgst[i + 0]; + dgst[ 1] = tmps[gid].dgst[i + 1]; + dgst[ 2] = tmps[gid].dgst[i + 2]; + dgst[ 3] = tmps[gid].dgst[i + 3]; + dgst[ 4] = tmps[gid].dgst[i + 4]; + dgst[ 5] = tmps[gid].dgst[i + 5]; + dgst[ 6] = tmps[gid].dgst[i + 6]; + dgst[ 7] = tmps[gid].dgst[i + 7]; + dgst[ 8] = tmps[gid].dgst[i + 8]; + dgst[ 9] = tmps[gid].dgst[i + 9]; + dgst[10] = tmps[gid].dgst[i + 10]; + dgst[11] = tmps[gid].dgst[i + 11]; + dgst[12] = tmps[gid].dgst[i + 12]; + dgst[13] = tmps[gid].dgst[i + 13]; + dgst[14] = tmps[gid].dgst[i + 14]; + dgst[15] = tmps[gid].dgst[i + 15]; + + u32 out[16]; + + out[ 0] = tmps[gid].out[i + 0]; + out[ 1] = tmps[gid].out[i + 1]; + out[ 2] = tmps[gid].out[i + 2]; + out[ 3] = tmps[gid].out[i + 3]; + out[ 4] = tmps[gid].out[i + 4]; + out[ 5] = tmps[gid].out[i + 5]; + out[ 6] = tmps[gid].out[i + 6]; + out[ 7] = tmps[gid].out[i + 7]; + out[ 8] = tmps[gid].out[i + 8]; + out[ 9] = tmps[gid].out[i + 9]; + out[10] = tmps[gid].out[i + 10]; + out[11] = tmps[gid].out[i + 11]; + out[12] = tmps[gid].out[i + 12]; + out[13] = tmps[gid].out[i + 13]; + out[14] = tmps[gid].out[i + 14]; + out[15] = tmps[gid].out[i + 15]; + + for (u32 j = 0; j < loop_cnt; j++) + { + u32 w1[16]; + + w1[ 0] = dgst[ 0]; + w1[ 1] = dgst[ 1]; + w1[ 2] = dgst[ 2]; + w1[ 3] = dgst[ 3]; + w1[ 4] = dgst[ 4]; + w1[ 5] = dgst[ 5]; + w1[ 6] = dgst[ 6]; + w1[ 7] = dgst[ 7]; + w1[ 8] = dgst[ 8]; + w1[ 9] = dgst[ 9]; + w1[10] = dgst[10]; + w1[11] = dgst[11]; + w1[12] = dgst[12]; + w1[13] = dgst[13]; + w1[14] = dgst[14]; + w1[15] = dgst[15]; + + u32 w2[16]; + + w2[ 0] = 0x80000000; + w2[ 1] = 0; + w2[ 2] = 0; + w2[ 3] = 0; + w2[ 4] = 0; + w2[ 5] = 0; + w2[ 6] = 0; + w2[ 7] = 0; + w2[ 8] = 0; + w2[ 9] = 0; + w2[10] = 0; + w2[11] = 0; + w2[12] = 0; + w2[13] = 0; + w2[14] = 0; + w2[15] = (64 + 64) * 8; + + hmac_run2 (w1, w2, ipad, opad, dgst, s_Ch, s_Cl); + + out[ 0] ^= dgst[ 0]; + out[ 1] ^= dgst[ 1]; + out[ 2] ^= dgst[ 2]; + out[ 3] ^= dgst[ 3]; + out[ 4] ^= dgst[ 4]; + out[ 5] ^= dgst[ 5]; + out[ 6] ^= dgst[ 6]; + out[ 7] ^= dgst[ 7]; + out[ 8] ^= dgst[ 8]; + out[ 9] ^= dgst[ 9]; + out[10] ^= dgst[10]; + out[11] ^= dgst[11]; + out[12] ^= dgst[12]; + out[13] ^= dgst[13]; + out[14] ^= dgst[14]; + out[15] ^= dgst[15]; + } + + tmps[gid].dgst[i + 0] = dgst[ 0]; + tmps[gid].dgst[i + 1] = dgst[ 1]; + tmps[gid].dgst[i + 2] = dgst[ 2]; + tmps[gid].dgst[i + 3] = dgst[ 3]; + tmps[gid].dgst[i + 4] = dgst[ 4]; + tmps[gid].dgst[i + 5] = dgst[ 5]; + tmps[gid].dgst[i + 6] = dgst[ 6]; + tmps[gid].dgst[i + 7] = dgst[ 7]; + tmps[gid].dgst[i + 8] = dgst[ 8]; + tmps[gid].dgst[i + 9] = dgst[ 9]; + tmps[gid].dgst[i + 10] = dgst[10]; + tmps[gid].dgst[i + 11] = dgst[11]; + tmps[gid].dgst[i + 12] = dgst[12]; + tmps[gid].dgst[i + 13] = dgst[13]; + tmps[gid].dgst[i + 14] = dgst[14]; + tmps[gid].dgst[i + 15] = dgst[15]; + + tmps[gid].out[i + 0] = out[ 0]; + tmps[gid].out[i + 1] = out[ 1]; + tmps[gid].out[i + 2] = out[ 2]; + tmps[gid].out[i + 3] = out[ 3]; + tmps[gid].out[i + 4] = out[ 4]; + tmps[gid].out[i + 5] = out[ 5]; + tmps[gid].out[i + 6] = out[ 6]; + tmps[gid].out[i + 7] = out[ 7]; + tmps[gid].out[i + 8] = out[ 8]; + tmps[gid].out[i + 9] = out[ 9]; + tmps[gid].out[i + 10] = out[10]; + tmps[gid].out[i + 11] = out[11]; + tmps[gid].out[i + 12] = out[12]; + tmps[gid].out[i + 13] = out[13]; + tmps[gid].out[i + 14] = out[14]; + tmps[gid].out[i + 15] = out[15]; + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m06231_comp (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, tc_tmp_t *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const tc_t *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + const u32 lid = threadIdx.x; + + if (gid >= gid_max) return; + + u32 ukey1[8]; + + ukey1[0] = swap_workaround (tmps[gid].out[ 0]); + ukey1[1] = swap_workaround (tmps[gid].out[ 1]); + ukey1[2] = swap_workaround (tmps[gid].out[ 2]); + ukey1[3] = swap_workaround (tmps[gid].out[ 3]); + ukey1[4] = swap_workaround (tmps[gid].out[ 4]); + ukey1[5] = swap_workaround (tmps[gid].out[ 5]); + ukey1[6] = swap_workaround (tmps[gid].out[ 6]); + ukey1[7] = swap_workaround (tmps[gid].out[ 7]); + + u32 ukey2[8]; + + ukey2[0] = swap_workaround (tmps[gid].out[ 8]); + ukey2[1] = swap_workaround (tmps[gid].out[ 9]); + ukey2[2] = swap_workaround (tmps[gid].out[10]); + ukey2[3] = swap_workaround (tmps[gid].out[11]); + ukey2[4] = swap_workaround (tmps[gid].out[12]); + ukey2[5] = swap_workaround (tmps[gid].out[13]); + ukey2[6] = swap_workaround (tmps[gid].out[14]); + ukey2[7] = swap_workaround (tmps[gid].out[15]); + + u32 data[4]; + + data[0] = esalt_bufs[0].data_buf[0]; + data[1] = esalt_bufs[0].data_buf[1]; + data[2] = esalt_bufs[0].data_buf[2]; + data[3] = esalt_bufs[0].data_buf[3]; + + u32 tmp[4]; + + { + tmp[0] = data[0]; + tmp[1] = data[1]; + tmp[2] = data[2]; + tmp[3] = data[3]; + + aes256_decrypt_xts (ukey1, ukey2, tmp, tmp); + + if (((tmp[0] == 0x45555254) && (tmp[3] == 0)) || ((tmp[0] == 0x45555254) && ((tmp[1] >> 16) <= 5))) + { + mark_hash_s0 (plains_buf, hashes_shown, 0, gid, 0); + + d_return_buf[lid] = 1; + } + } + + { + tmp[0] = data[0]; + tmp[1] = data[1]; + tmp[2] = data[2]; + tmp[3] = data[3]; + + serpent256_decrypt_xts (ukey1, ukey2, tmp, tmp); + + if (((tmp[0] == 0x45555254) && (tmp[3] == 0)) || ((tmp[0] == 0x45555254) && ((tmp[1] >> 16) <= 5))) + { + mark_hash_s0 (plains_buf, hashes_shown, 0, gid, 0); + + d_return_buf[lid] = 1; + } + } + + { + tmp[0] = data[0]; + tmp[1] = data[1]; + tmp[2] = data[2]; + tmp[3] = data[3]; + + twofish256_decrypt_xts (ukey1, ukey2, tmp, tmp); + + if (((tmp[0] == 0x45555254) && (tmp[3] == 0)) || ((tmp[0] == 0x45555254) && ((tmp[1] >> 16) <= 5))) + { + mark_hash_s0 (plains_buf, hashes_shown, 0, gid, 0); + + d_return_buf[lid] = 1; + } + } +} diff --git a/nv/m06232.cu b/nv/m06232.cu new file mode 100644 index 0000000000..10256eaf49 --- /dev/null +++ b/nv/m06232.cu @@ -0,0 +1,2063 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _WHIRLPOOL_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW2 +#define VECT_SIZE1 +#endif + +#define DGST_R0 0 +#define DGST_R1 1 +#define DGST_R2 2 +#define DGST_R3 3 + +#include "include/kernel_functions.c" +#include "types_nv.c" +#include "common_nv.c" + +#include "gpu_aes256_nv.c" +#include "gpu_twofish256_nv.c" +#include "gpu_serpent256_nv.c" + +#define R 10 + +#define BOX(S,n,i) (u32) ((S)[(n)][(i)]) + +__device__ __constant__ u32 Ch[8][256] = +{ + { + 0x18186018, 0x23238c23, 0xc6c63fc6, 0xe8e887e8, + 0x87872687, 0xb8b8dab8, 0x01010401, 0x4f4f214f, + 0x3636d836, 0xa6a6a2a6, 0xd2d26fd2, 0xf5f5f3f5, + 0x7979f979, 0x6f6fa16f, 0x91917e91, 0x52525552, + 0x60609d60, 0xbcbccabc, 0x9b9b569b, 0x8e8e028e, + 0xa3a3b6a3, 0x0c0c300c, 0x7b7bf17b, 0x3535d435, + 0x1d1d741d, 0xe0e0a7e0, 0xd7d77bd7, 0xc2c22fc2, + 0x2e2eb82e, 0x4b4b314b, 0xfefedffe, 0x57574157, + 0x15155415, 0x7777c177, 0x3737dc37, 0xe5e5b3e5, + 0x9f9f469f, 0xf0f0e7f0, 0x4a4a354a, 0xdada4fda, + 0x58587d58, 0xc9c903c9, 0x2929a429, 0x0a0a280a, + 0xb1b1feb1, 0xa0a0baa0, 0x6b6bb16b, 0x85852e85, + 0xbdbdcebd, 0x5d5d695d, 0x10104010, 0xf4f4f7f4, + 0xcbcb0bcb, 0x3e3ef83e, 0x05051405, 0x67678167, + 0xe4e4b7e4, 0x27279c27, 0x41411941, 0x8b8b168b, + 0xa7a7a6a7, 0x7d7de97d, 0x95956e95, 0xd8d847d8, + 0xfbfbcbfb, 0xeeee9fee, 0x7c7ced7c, 0x66668566, + 0xdddd53dd, 0x17175c17, 0x47470147, 0x9e9e429e, + 0xcaca0fca, 0x2d2db42d, 0xbfbfc6bf, 0x07071c07, + 0xadad8ead, 0x5a5a755a, 0x83833683, 0x3333cc33, + 0x63639163, 0x02020802, 0xaaaa92aa, 0x7171d971, + 0xc8c807c8, 0x19196419, 0x49493949, 0xd9d943d9, + 0xf2f2eff2, 0xe3e3abe3, 0x5b5b715b, 0x88881a88, + 0x9a9a529a, 0x26269826, 0x3232c832, 0xb0b0fab0, + 0xe9e983e9, 0x0f0f3c0f, 0xd5d573d5, 0x80803a80, + 0xbebec2be, 0xcdcd13cd, 0x3434d034, 0x48483d48, + 0xffffdbff, 0x7a7af57a, 0x90907a90, 0x5f5f615f, + 0x20208020, 0x6868bd68, 0x1a1a681a, 0xaeae82ae, + 0xb4b4eab4, 0x54544d54, 0x93937693, 0x22228822, + 0x64648d64, 0xf1f1e3f1, 0x7373d173, 0x12124812, + 0x40401d40, 0x08082008, 0xc3c32bc3, 0xecec97ec, + 0xdbdb4bdb, 0xa1a1bea1, 0x8d8d0e8d, 0x3d3df43d, + 0x97976697, 0x00000000, 0xcfcf1bcf, 0x2b2bac2b, + 0x7676c576, 0x82823282, 0xd6d67fd6, 0x1b1b6c1b, + 0xb5b5eeb5, 0xafaf86af, 0x6a6ab56a, 0x50505d50, + 0x45450945, 0xf3f3ebf3, 0x3030c030, 0xefef9bef, + 0x3f3ffc3f, 0x55554955, 0xa2a2b2a2, 0xeaea8fea, + 0x65658965, 0xbabad2ba, 0x2f2fbc2f, 0xc0c027c0, + 0xdede5fde, 0x1c1c701c, 0xfdfdd3fd, 0x4d4d294d, + 0x92927292, 0x7575c975, 0x06061806, 0x8a8a128a, + 0xb2b2f2b2, 0xe6e6bfe6, 0x0e0e380e, 0x1f1f7c1f, + 0x62629562, 0xd4d477d4, 0xa8a89aa8, 0x96966296, + 0xf9f9c3f9, 0xc5c533c5, 0x25259425, 0x59597959, + 0x84842a84, 0x7272d572, 0x3939e439, 0x4c4c2d4c, + 0x5e5e655e, 0x7878fd78, 0x3838e038, 0x8c8c0a8c, + 0xd1d163d1, 0xa5a5aea5, 0xe2e2afe2, 0x61619961, + 0xb3b3f6b3, 0x21218421, 0x9c9c4a9c, 0x1e1e781e, + 0x43431143, 0xc7c73bc7, 0xfcfcd7fc, 0x04041004, + 0x51515951, 0x99995e99, 0x6d6da96d, 0x0d0d340d, + 0xfafacffa, 0xdfdf5bdf, 0x7e7ee57e, 0x24249024, + 0x3b3bec3b, 0xabab96ab, 0xcece1fce, 0x11114411, + 0x8f8f068f, 0x4e4e254e, 0xb7b7e6b7, 0xebeb8beb, + 0x3c3cf03c, 0x81813e81, 0x94946a94, 0xf7f7fbf7, + 0xb9b9deb9, 0x13134c13, 0x2c2cb02c, 0xd3d36bd3, + 0xe7e7bbe7, 0x6e6ea56e, 0xc4c437c4, 0x03030c03, + 0x56564556, 0x44440d44, 0x7f7fe17f, 0xa9a99ea9, + 0x2a2aa82a, 0xbbbbd6bb, 0xc1c123c1, 0x53535153, + 0xdcdc57dc, 0x0b0b2c0b, 0x9d9d4e9d, 0x6c6cad6c, + 0x3131c431, 0x7474cd74, 0xf6f6fff6, 0x46460546, + 0xacac8aac, 0x89891e89, 0x14145014, 0xe1e1a3e1, + 0x16165816, 0x3a3ae83a, 0x6969b969, 0x09092409, + 0x7070dd70, 0xb6b6e2b6, 0xd0d067d0, 0xeded93ed, + 0xcccc17cc, 0x42421542, 0x98985a98, 0xa4a4aaa4, + 0x2828a028, 0x5c5c6d5c, 0xf8f8c7f8, 0x86862286, + }, + { + 0xd8181860, 0x2623238c, 0xb8c6c63f, 0xfbe8e887, + 0xcb878726, 0x11b8b8da, 0x09010104, 0x0d4f4f21, + 0x9b3636d8, 0xffa6a6a2, 0x0cd2d26f, 0x0ef5f5f3, + 0x967979f9, 0x306f6fa1, 0x6d91917e, 0xf8525255, + 0x4760609d, 0x35bcbcca, 0x379b9b56, 0x8a8e8e02, + 0xd2a3a3b6, 0x6c0c0c30, 0x847b7bf1, 0x803535d4, + 0xf51d1d74, 0xb3e0e0a7, 0x21d7d77b, 0x9cc2c22f, + 0x432e2eb8, 0x294b4b31, 0x5dfefedf, 0xd5575741, + 0xbd151554, 0xe87777c1, 0x923737dc, 0x9ee5e5b3, + 0x139f9f46, 0x23f0f0e7, 0x204a4a35, 0x44dada4f, + 0xa258587d, 0xcfc9c903, 0x7c2929a4, 0x5a0a0a28, + 0x50b1b1fe, 0xc9a0a0ba, 0x146b6bb1, 0xd985852e, + 0x3cbdbdce, 0x8f5d5d69, 0x90101040, 0x07f4f4f7, + 0xddcbcb0b, 0xd33e3ef8, 0x2d050514, 0x78676781, + 0x97e4e4b7, 0x0227279c, 0x73414119, 0xa78b8b16, + 0xf6a7a7a6, 0xb27d7de9, 0x4995956e, 0x56d8d847, + 0x70fbfbcb, 0xcdeeee9f, 0xbb7c7ced, 0x71666685, + 0x7bdddd53, 0xaf17175c, 0x45474701, 0x1a9e9e42, + 0xd4caca0f, 0x582d2db4, 0x2ebfbfc6, 0x3f07071c, + 0xacadad8e, 0xb05a5a75, 0xef838336, 0xb63333cc, + 0x5c636391, 0x12020208, 0x93aaaa92, 0xde7171d9, + 0xc6c8c807, 0xd1191964, 0x3b494939, 0x5fd9d943, + 0x31f2f2ef, 0xa8e3e3ab, 0xb95b5b71, 0xbc88881a, + 0x3e9a9a52, 0x0b262698, 0xbf3232c8, 0x59b0b0fa, + 0xf2e9e983, 0x770f0f3c, 0x33d5d573, 0xf480803a, + 0x27bebec2, 0xebcdcd13, 0x893434d0, 0x3248483d, + 0x54ffffdb, 0x8d7a7af5, 0x6490907a, 0x9d5f5f61, + 0x3d202080, 0x0f6868bd, 0xca1a1a68, 0xb7aeae82, + 0x7db4b4ea, 0xce54544d, 0x7f939376, 0x2f222288, + 0x6364648d, 0x2af1f1e3, 0xcc7373d1, 0x82121248, + 0x7a40401d, 0x48080820, 0x95c3c32b, 0xdfecec97, + 0x4ddbdb4b, 0xc0a1a1be, 0x918d8d0e, 0xc83d3df4, + 0x5b979766, 0x00000000, 0xf9cfcf1b, 0x6e2b2bac, + 0xe17676c5, 0xe6828232, 0x28d6d67f, 0xc31b1b6c, + 0x74b5b5ee, 0xbeafaf86, 0x1d6a6ab5, 0xea50505d, + 0x57454509, 0x38f3f3eb, 0xad3030c0, 0xc4efef9b, + 0xda3f3ffc, 0xc7555549, 0xdba2a2b2, 0xe9eaea8f, + 0x6a656589, 0x03babad2, 0x4a2f2fbc, 0x8ec0c027, + 0x60dede5f, 0xfc1c1c70, 0x46fdfdd3, 0x1f4d4d29, + 0x76929272, 0xfa7575c9, 0x36060618, 0xae8a8a12, + 0x4bb2b2f2, 0x85e6e6bf, 0x7e0e0e38, 0xe71f1f7c, + 0x55626295, 0x3ad4d477, 0x81a8a89a, 0x52969662, + 0x62f9f9c3, 0xa3c5c533, 0x10252594, 0xab595979, + 0xd084842a, 0xc57272d5, 0xec3939e4, 0x164c4c2d, + 0x945e5e65, 0x9f7878fd, 0xe53838e0, 0x988c8c0a, + 0x17d1d163, 0xe4a5a5ae, 0xa1e2e2af, 0x4e616199, + 0x42b3b3f6, 0x34212184, 0x089c9c4a, 0xee1e1e78, + 0x61434311, 0xb1c7c73b, 0x4ffcfcd7, 0x24040410, + 0xe3515159, 0x2599995e, 0x226d6da9, 0x650d0d34, + 0x79fafacf, 0x69dfdf5b, 0xa97e7ee5, 0x19242490, + 0xfe3b3bec, 0x9aabab96, 0xf0cece1f, 0x99111144, + 0x838f8f06, 0x044e4e25, 0x66b7b7e6, 0xe0ebeb8b, + 0xc13c3cf0, 0xfd81813e, 0x4094946a, 0x1cf7f7fb, + 0x18b9b9de, 0x8b13134c, 0x512c2cb0, 0x05d3d36b, + 0x8ce7e7bb, 0x396e6ea5, 0xaac4c437, 0x1b03030c, + 0xdc565645, 0x5e44440d, 0xa07f7fe1, 0x88a9a99e, + 0x672a2aa8, 0x0abbbbd6, 0x87c1c123, 0xf1535351, + 0x72dcdc57, 0x530b0b2c, 0x019d9d4e, 0x2b6c6cad, + 0xa43131c4, 0xf37474cd, 0x15f6f6ff, 0x4c464605, + 0xa5acac8a, 0xb589891e, 0xb4141450, 0xbae1e1a3, + 0xa6161658, 0xf73a3ae8, 0x066969b9, 0x41090924, + 0xd77070dd, 0x6fb6b6e2, 0x1ed0d067, 0xd6eded93, + 0xe2cccc17, 0x68424215, 0x2c98985a, 0xeda4a4aa, + 0x752828a0, 0x865c5c6d, 0x6bf8f8c7, 0xc2868622, + }, + { + 0x30d81818, 0x46262323, 0x91b8c6c6, 0xcdfbe8e8, + 0x13cb8787, 0x6d11b8b8, 0x02090101, 0x9e0d4f4f, + 0x6c9b3636, 0x51ffa6a6, 0xb90cd2d2, 0xf70ef5f5, + 0xf2967979, 0xde306f6f, 0x3f6d9191, 0xa4f85252, + 0xc0476060, 0x6535bcbc, 0x2b379b9b, 0x018a8e8e, + 0x5bd2a3a3, 0x186c0c0c, 0xf6847b7b, 0x6a803535, + 0x3af51d1d, 0xddb3e0e0, 0xb321d7d7, 0x999cc2c2, + 0x5c432e2e, 0x96294b4b, 0xe15dfefe, 0xaed55757, + 0x2abd1515, 0xeee87777, 0x6e923737, 0xd79ee5e5, + 0x23139f9f, 0xfd23f0f0, 0x94204a4a, 0xa944dada, + 0xb0a25858, 0x8fcfc9c9, 0x527c2929, 0x145a0a0a, + 0x7f50b1b1, 0x5dc9a0a0, 0xd6146b6b, 0x17d98585, + 0x673cbdbd, 0xba8f5d5d, 0x20901010, 0xf507f4f4, + 0x8bddcbcb, 0x7cd33e3e, 0x0a2d0505, 0xce786767, + 0xd597e4e4, 0x4e022727, 0x82734141, 0x0ba78b8b, + 0x53f6a7a7, 0xfab27d7d, 0x37499595, 0xad56d8d8, + 0xeb70fbfb, 0xc1cdeeee, 0xf8bb7c7c, 0xcc716666, + 0xa77bdddd, 0x2eaf1717, 0x8e454747, 0x211a9e9e, + 0x89d4caca, 0x5a582d2d, 0x632ebfbf, 0x0e3f0707, + 0x47acadad, 0xb4b05a5a, 0x1bef8383, 0x66b63333, + 0xc65c6363, 0x04120202, 0x4993aaaa, 0xe2de7171, + 0x8dc6c8c8, 0x32d11919, 0x923b4949, 0xaf5fd9d9, + 0xf931f2f2, 0xdba8e3e3, 0xb6b95b5b, 0x0dbc8888, + 0x293e9a9a, 0x4c0b2626, 0x64bf3232, 0x7d59b0b0, + 0xcff2e9e9, 0x1e770f0f, 0xb733d5d5, 0x1df48080, + 0x6127bebe, 0x87ebcdcd, 0x68893434, 0x90324848, + 0xe354ffff, 0xf48d7a7a, 0x3d649090, 0xbe9d5f5f, + 0x403d2020, 0xd00f6868, 0x34ca1a1a, 0x41b7aeae, + 0x757db4b4, 0xa8ce5454, 0x3b7f9393, 0x442f2222, + 0xc8636464, 0xff2af1f1, 0xe6cc7373, 0x24821212, + 0x807a4040, 0x10480808, 0x9b95c3c3, 0xc5dfecec, + 0xab4ddbdb, 0x5fc0a1a1, 0x07918d8d, 0x7ac83d3d, + 0x335b9797, 0x00000000, 0x83f9cfcf, 0x566e2b2b, + 0xece17676, 0x19e68282, 0xb128d6d6, 0x36c31b1b, + 0x7774b5b5, 0x43beafaf, 0xd41d6a6a, 0xa0ea5050, + 0x8a574545, 0xfb38f3f3, 0x60ad3030, 0xc3c4efef, + 0x7eda3f3f, 0xaac75555, 0x59dba2a2, 0xc9e9eaea, + 0xca6a6565, 0x6903baba, 0x5e4a2f2f, 0x9d8ec0c0, + 0xa160dede, 0x38fc1c1c, 0xe746fdfd, 0x9a1f4d4d, + 0x39769292, 0xeafa7575, 0x0c360606, 0x09ae8a8a, + 0x794bb2b2, 0xd185e6e6, 0x1c7e0e0e, 0x3ee71f1f, + 0xc4556262, 0xb53ad4d4, 0x4d81a8a8, 0x31529696, + 0xef62f9f9, 0x97a3c5c5, 0x4a102525, 0xb2ab5959, + 0x15d08484, 0xe4c57272, 0x72ec3939, 0x98164c4c, + 0xbc945e5e, 0xf09f7878, 0x70e53838, 0x05988c8c, + 0xbf17d1d1, 0x57e4a5a5, 0xd9a1e2e2, 0xc24e6161, + 0x7b42b3b3, 0x42342121, 0x25089c9c, 0x3cee1e1e, + 0x86614343, 0x93b1c7c7, 0xe54ffcfc, 0x08240404, + 0xa2e35151, 0x2f259999, 0xda226d6d, 0x1a650d0d, + 0xe979fafa, 0xa369dfdf, 0xfca97e7e, 0x48192424, + 0x76fe3b3b, 0x4b9aabab, 0x81f0cece, 0x22991111, + 0x03838f8f, 0x9c044e4e, 0x7366b7b7, 0xcbe0ebeb, + 0x78c13c3c, 0x1ffd8181, 0x35409494, 0xf31cf7f7, + 0x6f18b9b9, 0x268b1313, 0x58512c2c, 0xbb05d3d3, + 0xd38ce7e7, 0xdc396e6e, 0x95aac4c4, 0x061b0303, + 0xacdc5656, 0x885e4444, 0xfea07f7f, 0x4f88a9a9, + 0x54672a2a, 0x6b0abbbb, 0x9f87c1c1, 0xa6f15353, + 0xa572dcdc, 0x16530b0b, 0x27019d9d, 0xd82b6c6c, + 0x62a43131, 0xe8f37474, 0xf115f6f6, 0x8c4c4646, + 0x45a5acac, 0x0fb58989, 0x28b41414, 0xdfbae1e1, + 0x2ca61616, 0x74f73a3a, 0xd2066969, 0x12410909, + 0xe0d77070, 0x716fb6b6, 0xbd1ed0d0, 0xc7d6eded, + 0x85e2cccc, 0x84684242, 0x2d2c9898, 0x55eda4a4, + 0x50752828, 0xb8865c5c, 0xed6bf8f8, 0x11c28686, + }, + { + 0x7830d818, 0xaf462623, 0xf991b8c6, 0x6fcdfbe8, + 0xa113cb87, 0x626d11b8, 0x05020901, 0x6e9e0d4f, + 0xee6c9b36, 0x0451ffa6, 0xbdb90cd2, 0x06f70ef5, + 0x80f29679, 0xcede306f, 0xef3f6d91, 0x07a4f852, + 0xfdc04760, 0x766535bc, 0xcd2b379b, 0x8c018a8e, + 0x155bd2a3, 0x3c186c0c, 0x8af6847b, 0xe16a8035, + 0x693af51d, 0x47ddb3e0, 0xacb321d7, 0xed999cc2, + 0x965c432e, 0x7a96294b, 0x21e15dfe, 0x16aed557, + 0x412abd15, 0xb6eee877, 0xeb6e9237, 0x56d79ee5, + 0xd923139f, 0x17fd23f0, 0x7f94204a, 0x95a944da, + 0x25b0a258, 0xca8fcfc9, 0x8d527c29, 0x22145a0a, + 0x4f7f50b1, 0x1a5dc9a0, 0xdad6146b, 0xab17d985, + 0x73673cbd, 0x34ba8f5d, 0x50209010, 0x03f507f4, + 0xc08bddcb, 0xc67cd33e, 0x110a2d05, 0xe6ce7867, + 0x53d597e4, 0xbb4e0227, 0x58827341, 0x9d0ba78b, + 0x0153f6a7, 0x94fab27d, 0xfb374995, 0x9fad56d8, + 0x30eb70fb, 0x71c1cdee, 0x91f8bb7c, 0xe3cc7166, + 0x8ea77bdd, 0x4b2eaf17, 0x468e4547, 0xdc211a9e, + 0xc589d4ca, 0x995a582d, 0x79632ebf, 0x1b0e3f07, + 0x2347acad, 0x2fb4b05a, 0xb51bef83, 0xff66b633, + 0xf2c65c63, 0x0a041202, 0x384993aa, 0xa8e2de71, + 0xcf8dc6c8, 0x7d32d119, 0x70923b49, 0x9aaf5fd9, + 0x1df931f2, 0x48dba8e3, 0x2ab6b95b, 0x920dbc88, + 0xc8293e9a, 0xbe4c0b26, 0xfa64bf32, 0x4a7d59b0, + 0x6acff2e9, 0x331e770f, 0xa6b733d5, 0xba1df480, + 0x7c6127be, 0xde87ebcd, 0xe4688934, 0x75903248, + 0x24e354ff, 0x8ff48d7a, 0xea3d6490, 0x3ebe9d5f, + 0xa0403d20, 0xd5d00f68, 0x7234ca1a, 0x2c41b7ae, + 0x5e757db4, 0x19a8ce54, 0xe53b7f93, 0xaa442f22, + 0xe9c86364, 0x12ff2af1, 0xa2e6cc73, 0x5a248212, + 0x5d807a40, 0x28104808, 0xe89b95c3, 0x7bc5dfec, + 0x90ab4ddb, 0x1f5fc0a1, 0x8307918d, 0xc97ac83d, + 0xf1335b97, 0x00000000, 0xd483f9cf, 0x87566e2b, + 0xb3ece176, 0xb019e682, 0xa9b128d6, 0x7736c31b, + 0x5b7774b5, 0x2943beaf, 0xdfd41d6a, 0x0da0ea50, + 0x4c8a5745, 0x18fb38f3, 0xf060ad30, 0x74c3c4ef, + 0xc37eda3f, 0x1caac755, 0x1059dba2, 0x65c9e9ea, + 0xecca6a65, 0x686903ba, 0x935e4a2f, 0xe79d8ec0, + 0x81a160de, 0x6c38fc1c, 0x2ee746fd, 0x649a1f4d, + 0xe0397692, 0xbceafa75, 0x1e0c3606, 0x9809ae8a, + 0x40794bb2, 0x59d185e6, 0x361c7e0e, 0x633ee71f, + 0xf7c45562, 0xa3b53ad4, 0x324d81a8, 0xf4315296, + 0x3aef62f9, 0xf697a3c5, 0xb14a1025, 0x20b2ab59, + 0xae15d084, 0xa7e4c572, 0xdd72ec39, 0x6198164c, + 0x3bbc945e, 0x85f09f78, 0xd870e538, 0x8605988c, + 0xb2bf17d1, 0x0b57e4a5, 0x4dd9a1e2, 0xf8c24e61, + 0x457b42b3, 0xa5423421, 0xd625089c, 0x663cee1e, + 0x52866143, 0xfc93b1c7, 0x2be54ffc, 0x14082404, + 0x08a2e351, 0xc72f2599, 0xc4da226d, 0x391a650d, + 0x35e979fa, 0x84a369df, 0x9bfca97e, 0xb4481924, + 0xd776fe3b, 0x3d4b9aab, 0xd181f0ce, 0x55229911, + 0x8903838f, 0x6b9c044e, 0x517366b7, 0x60cbe0eb, + 0xcc78c13c, 0xbf1ffd81, 0xfe354094, 0x0cf31cf7, + 0x676f18b9, 0x5f268b13, 0x9c58512c, 0xb8bb05d3, + 0x5cd38ce7, 0xcbdc396e, 0xf395aac4, 0x0f061b03, + 0x13acdc56, 0x49885e44, 0x9efea07f, 0x374f88a9, + 0x8254672a, 0x6d6b0abb, 0xe29f87c1, 0x02a6f153, + 0x8ba572dc, 0x2716530b, 0xd327019d, 0xc1d82b6c, + 0xf562a431, 0xb9e8f374, 0x09f115f6, 0x438c4c46, + 0x2645a5ac, 0x970fb589, 0x4428b414, 0x42dfbae1, + 0x4e2ca616, 0xd274f73a, 0xd0d20669, 0x2d124109, + 0xade0d770, 0x54716fb6, 0xb7bd1ed0, 0x7ec7d6ed, + 0xdb85e2cc, 0x57846842, 0xc22d2c98, 0x0e55eda4, + 0x88507528, 0x31b8865c, 0x3fed6bf8, 0xa411c286, + }, + { + 0xc07830d8, 0x05af4626, 0x7ef991b8, 0x136fcdfb, + 0x4ca113cb, 0xa9626d11, 0x08050209, 0x426e9e0d, + 0xadee6c9b, 0x590451ff, 0xdebdb90c, 0xfb06f70e, + 0xef80f296, 0x5fcede30, 0xfcef3f6d, 0xaa07a4f8, + 0x27fdc047, 0x89766535, 0xaccd2b37, 0x048c018a, + 0x71155bd2, 0x603c186c, 0xff8af684, 0xb5e16a80, + 0xe8693af5, 0x5347ddb3, 0xf6acb321, 0x5eed999c, + 0x6d965c43, 0x627a9629, 0xa321e15d, 0x8216aed5, + 0xa8412abd, 0x9fb6eee8, 0xa5eb6e92, 0x7b56d79e, + 0x8cd92313, 0xd317fd23, 0x6a7f9420, 0x9e95a944, + 0xfa25b0a2, 0x06ca8fcf, 0x558d527c, 0x5022145a, + 0xe14f7f50, 0x691a5dc9, 0x7fdad614, 0x5cab17d9, + 0x8173673c, 0xd234ba8f, 0x80502090, 0xf303f507, + 0x16c08bdd, 0xedc67cd3, 0x28110a2d, 0x1fe6ce78, + 0x7353d597, 0x25bb4e02, 0x32588273, 0x2c9d0ba7, + 0x510153f6, 0xcf94fab2, 0xdcfb3749, 0x8e9fad56, + 0x8b30eb70, 0x2371c1cd, 0xc791f8bb, 0x17e3cc71, + 0xa68ea77b, 0xb84b2eaf, 0x02468e45, 0x84dc211a, + 0x1ec589d4, 0x75995a58, 0x9179632e, 0x381b0e3f, + 0x012347ac, 0xea2fb4b0, 0x6cb51bef, 0x85ff66b6, + 0x3ff2c65c, 0x100a0412, 0x39384993, 0xafa8e2de, + 0x0ecf8dc6, 0xc87d32d1, 0x7270923b, 0x869aaf5f, + 0xc31df931, 0x4b48dba8, 0xe22ab6b9, 0x34920dbc, + 0xa4c8293e, 0x2dbe4c0b, 0x8dfa64bf, 0xe94a7d59, + 0x1b6acff2, 0x78331e77, 0xe6a6b733, 0x74ba1df4, + 0x997c6127, 0x26de87eb, 0xbde46889, 0x7a759032, + 0xab24e354, 0xf78ff48d, 0xf4ea3d64, 0xc23ebe9d, + 0x1da0403d, 0x67d5d00f, 0xd07234ca, 0x192c41b7, + 0xc95e757d, 0x9a19a8ce, 0xece53b7f, 0x0daa442f, + 0x07e9c863, 0xdb12ff2a, 0xbfa2e6cc, 0x905a2482, + 0x3a5d807a, 0x40281048, 0x56e89b95, 0x337bc5df, + 0x9690ab4d, 0x611f5fc0, 0x1c830791, 0xf5c97ac8, + 0xccf1335b, 0x00000000, 0x36d483f9, 0x4587566e, + 0x97b3ece1, 0x64b019e6, 0xfea9b128, 0xd87736c3, + 0xc15b7774, 0x112943be, 0x77dfd41d, 0xba0da0ea, + 0x124c8a57, 0xcb18fb38, 0x9df060ad, 0x2b74c3c4, + 0xe5c37eda, 0x921caac7, 0x791059db, 0x0365c9e9, + 0x0fecca6a, 0xb9686903, 0x65935e4a, 0x4ee79d8e, + 0xbe81a160, 0xe06c38fc, 0xbb2ee746, 0x52649a1f, + 0xe4e03976, 0x8fbceafa, 0x301e0c36, 0x249809ae, + 0xf940794b, 0x6359d185, 0x70361c7e, 0xf8633ee7, + 0x37f7c455, 0xeea3b53a, 0x29324d81, 0xc4f43152, + 0x9b3aef62, 0x66f697a3, 0x35b14a10, 0xf220b2ab, + 0x54ae15d0, 0xb7a7e4c5, 0xd5dd72ec, 0x5a619816, + 0xca3bbc94, 0xe785f09f, 0xddd870e5, 0x14860598, + 0xc6b2bf17, 0x410b57e4, 0x434dd9a1, 0x2ff8c24e, + 0xf1457b42, 0x15a54234, 0x94d62508, 0xf0663cee, + 0x22528661, 0x76fc93b1, 0xb32be54f, 0x20140824, + 0xb208a2e3, 0xbcc72f25, 0x4fc4da22, 0x68391a65, + 0x8335e979, 0xb684a369, 0xd79bfca9, 0x3db44819, + 0xc5d776fe, 0x313d4b9a, 0x3ed181f0, 0x88552299, + 0x0c890383, 0x4a6b9c04, 0xd1517366, 0x0b60cbe0, + 0xfdcc78c1, 0x7cbf1ffd, 0xd4fe3540, 0xeb0cf31c, + 0xa1676f18, 0x985f268b, 0x7d9c5851, 0xd6b8bb05, + 0x6b5cd38c, 0x57cbdc39, 0x6ef395aa, 0x180f061b, + 0x8a13acdc, 0x1a49885e, 0xdf9efea0, 0x21374f88, + 0x4d825467, 0xb16d6b0a, 0x46e29f87, 0xa202a6f1, + 0xae8ba572, 0x58271653, 0x9cd32701, 0x47c1d82b, + 0x95f562a4, 0x87b9e8f3, 0xe309f115, 0x0a438c4c, + 0x092645a5, 0x3c970fb5, 0xa04428b4, 0x5b42dfba, + 0xb04e2ca6, 0xcdd274f7, 0x6fd0d206, 0x482d1241, + 0xa7ade0d7, 0xd954716f, 0xceb7bd1e, 0x3b7ec7d6, + 0x2edb85e2, 0x2a578468, 0xb4c22d2c, 0x490e55ed, + 0x5d885075, 0xda31b886, 0x933fed6b, 0x44a411c2, + }, + { + 0x18c07830, 0x2305af46, 0xc67ef991, 0xe8136fcd, + 0x874ca113, 0xb8a9626d, 0x01080502, 0x4f426e9e, + 0x36adee6c, 0xa6590451, 0xd2debdb9, 0xf5fb06f7, + 0x79ef80f2, 0x6f5fcede, 0x91fcef3f, 0x52aa07a4, + 0x6027fdc0, 0xbc897665, 0x9baccd2b, 0x8e048c01, + 0xa371155b, 0x0c603c18, 0x7bff8af6, 0x35b5e16a, + 0x1de8693a, 0xe05347dd, 0xd7f6acb3, 0xc25eed99, + 0x2e6d965c, 0x4b627a96, 0xfea321e1, 0x578216ae, + 0x15a8412a, 0x779fb6ee, 0x37a5eb6e, 0xe57b56d7, + 0x9f8cd923, 0xf0d317fd, 0x4a6a7f94, 0xda9e95a9, + 0x58fa25b0, 0xc906ca8f, 0x29558d52, 0x0a502214, + 0xb1e14f7f, 0xa0691a5d, 0x6b7fdad6, 0x855cab17, + 0xbd817367, 0x5dd234ba, 0x10805020, 0xf4f303f5, + 0xcb16c08b, 0x3eedc67c, 0x0528110a, 0x671fe6ce, + 0xe47353d5, 0x2725bb4e, 0x41325882, 0x8b2c9d0b, + 0xa7510153, 0x7dcf94fa, 0x95dcfb37, 0xd88e9fad, + 0xfb8b30eb, 0xee2371c1, 0x7cc791f8, 0x6617e3cc, + 0xdda68ea7, 0x17b84b2e, 0x4702468e, 0x9e84dc21, + 0xca1ec589, 0x2d75995a, 0xbf917963, 0x07381b0e, + 0xad012347, 0x5aea2fb4, 0x836cb51b, 0x3385ff66, + 0x633ff2c6, 0x02100a04, 0xaa393849, 0x71afa8e2, + 0xc80ecf8d, 0x19c87d32, 0x49727092, 0xd9869aaf, + 0xf2c31df9, 0xe34b48db, 0x5be22ab6, 0x8834920d, + 0x9aa4c829, 0x262dbe4c, 0x328dfa64, 0xb0e94a7d, + 0xe91b6acf, 0x0f78331e, 0xd5e6a6b7, 0x8074ba1d, + 0xbe997c61, 0xcd26de87, 0x34bde468, 0x487a7590, + 0xffab24e3, 0x7af78ff4, 0x90f4ea3d, 0x5fc23ebe, + 0x201da040, 0x6867d5d0, 0x1ad07234, 0xae192c41, + 0xb4c95e75, 0x549a19a8, 0x93ece53b, 0x220daa44, + 0x6407e9c8, 0xf1db12ff, 0x73bfa2e6, 0x12905a24, + 0x403a5d80, 0x08402810, 0xc356e89b, 0xec337bc5, + 0xdb9690ab, 0xa1611f5f, 0x8d1c8307, 0x3df5c97a, + 0x97ccf133, 0x00000000, 0xcf36d483, 0x2b458756, + 0x7697b3ec, 0x8264b019, 0xd6fea9b1, 0x1bd87736, + 0xb5c15b77, 0xaf112943, 0x6a77dfd4, 0x50ba0da0, + 0x45124c8a, 0xf3cb18fb, 0x309df060, 0xef2b74c3, + 0x3fe5c37e, 0x55921caa, 0xa2791059, 0xea0365c9, + 0x650fecca, 0xbab96869, 0x2f65935e, 0xc04ee79d, + 0xdebe81a1, 0x1ce06c38, 0xfdbb2ee7, 0x4d52649a, + 0x92e4e039, 0x758fbcea, 0x06301e0c, 0x8a249809, + 0xb2f94079, 0xe66359d1, 0x0e70361c, 0x1ff8633e, + 0x6237f7c4, 0xd4eea3b5, 0xa829324d, 0x96c4f431, + 0xf99b3aef, 0xc566f697, 0x2535b14a, 0x59f220b2, + 0x8454ae15, 0x72b7a7e4, 0x39d5dd72, 0x4c5a6198, + 0x5eca3bbc, 0x78e785f0, 0x38ddd870, 0x8c148605, + 0xd1c6b2bf, 0xa5410b57, 0xe2434dd9, 0x612ff8c2, + 0xb3f1457b, 0x2115a542, 0x9c94d625, 0x1ef0663c, + 0x43225286, 0xc776fc93, 0xfcb32be5, 0x04201408, + 0x51b208a2, 0x99bcc72f, 0x6d4fc4da, 0x0d68391a, + 0xfa8335e9, 0xdfb684a3, 0x7ed79bfc, 0x243db448, + 0x3bc5d776, 0xab313d4b, 0xce3ed181, 0x11885522, + 0x8f0c8903, 0x4e4a6b9c, 0xb7d15173, 0xeb0b60cb, + 0x3cfdcc78, 0x817cbf1f, 0x94d4fe35, 0xf7eb0cf3, + 0xb9a1676f, 0x13985f26, 0x2c7d9c58, 0xd3d6b8bb, + 0xe76b5cd3, 0x6e57cbdc, 0xc46ef395, 0x03180f06, + 0x568a13ac, 0x441a4988, 0x7fdf9efe, 0xa921374f, + 0x2a4d8254, 0xbbb16d6b, 0xc146e29f, 0x53a202a6, + 0xdcae8ba5, 0x0b582716, 0x9d9cd327, 0x6c47c1d8, + 0x3195f562, 0x7487b9e8, 0xf6e309f1, 0x460a438c, + 0xac092645, 0x893c970f, 0x14a04428, 0xe15b42df, + 0x16b04e2c, 0x3acdd274, 0x696fd0d2, 0x09482d12, + 0x70a7ade0, 0xb6d95471, 0xd0ceb7bd, 0xed3b7ec7, + 0xcc2edb85, 0x422a5784, 0x98b4c22d, 0xa4490e55, + 0x285d8850, 0x5cda31b8, 0xf8933fed, 0x8644a411, + }, + { + 0x6018c078, 0x8c2305af, 0x3fc67ef9, 0x87e8136f, + 0x26874ca1, 0xdab8a962, 0x04010805, 0x214f426e, + 0xd836adee, 0xa2a65904, 0x6fd2debd, 0xf3f5fb06, + 0xf979ef80, 0xa16f5fce, 0x7e91fcef, 0x5552aa07, + 0x9d6027fd, 0xcabc8976, 0x569baccd, 0x028e048c, + 0xb6a37115, 0x300c603c, 0xf17bff8a, 0xd435b5e1, + 0x741de869, 0xa7e05347, 0x7bd7f6ac, 0x2fc25eed, + 0xb82e6d96, 0x314b627a, 0xdffea321, 0x41578216, + 0x5415a841, 0xc1779fb6, 0xdc37a5eb, 0xb3e57b56, + 0x469f8cd9, 0xe7f0d317, 0x354a6a7f, 0x4fda9e95, + 0x7d58fa25, 0x03c906ca, 0xa429558d, 0x280a5022, + 0xfeb1e14f, 0xbaa0691a, 0xb16b7fda, 0x2e855cab, + 0xcebd8173, 0x695dd234, 0x40108050, 0xf7f4f303, + 0x0bcb16c0, 0xf83eedc6, 0x14052811, 0x81671fe6, + 0xb7e47353, 0x9c2725bb, 0x19413258, 0x168b2c9d, + 0xa6a75101, 0xe97dcf94, 0x6e95dcfb, 0x47d88e9f, + 0xcbfb8b30, 0x9fee2371, 0xed7cc791, 0x856617e3, + 0x53dda68e, 0x5c17b84b, 0x01470246, 0x429e84dc, + 0x0fca1ec5, 0xb42d7599, 0xc6bf9179, 0x1c07381b, + 0x8ead0123, 0x755aea2f, 0x36836cb5, 0xcc3385ff, + 0x91633ff2, 0x0802100a, 0x92aa3938, 0xd971afa8, + 0x07c80ecf, 0x6419c87d, 0x39497270, 0x43d9869a, + 0xeff2c31d, 0xabe34b48, 0x715be22a, 0x1a883492, + 0x529aa4c8, 0x98262dbe, 0xc8328dfa, 0xfab0e94a, + 0x83e91b6a, 0x3c0f7833, 0x73d5e6a6, 0x3a8074ba, + 0xc2be997c, 0x13cd26de, 0xd034bde4, 0x3d487a75, + 0xdbffab24, 0xf57af78f, 0x7a90f4ea, 0x615fc23e, + 0x80201da0, 0xbd6867d5, 0x681ad072, 0x82ae192c, + 0xeab4c95e, 0x4d549a19, 0x7693ece5, 0x88220daa, + 0x8d6407e9, 0xe3f1db12, 0xd173bfa2, 0x4812905a, + 0x1d403a5d, 0x20084028, 0x2bc356e8, 0x97ec337b, + 0x4bdb9690, 0xbea1611f, 0x0e8d1c83, 0xf43df5c9, + 0x6697ccf1, 0x00000000, 0x1bcf36d4, 0xac2b4587, + 0xc57697b3, 0x328264b0, 0x7fd6fea9, 0x6c1bd877, + 0xeeb5c15b, 0x86af1129, 0xb56a77df, 0x5d50ba0d, + 0x0945124c, 0xebf3cb18, 0xc0309df0, 0x9bef2b74, + 0xfc3fe5c3, 0x4955921c, 0xb2a27910, 0x8fea0365, + 0x89650fec, 0xd2bab968, 0xbc2f6593, 0x27c04ee7, + 0x5fdebe81, 0x701ce06c, 0xd3fdbb2e, 0x294d5264, + 0x7292e4e0, 0xc9758fbc, 0x1806301e, 0x128a2498, + 0xf2b2f940, 0xbfe66359, 0x380e7036, 0x7c1ff863, + 0x956237f7, 0x77d4eea3, 0x9aa82932, 0x6296c4f4, + 0xc3f99b3a, 0x33c566f6, 0x942535b1, 0x7959f220, + 0x2a8454ae, 0xd572b7a7, 0xe439d5dd, 0x2d4c5a61, + 0x655eca3b, 0xfd78e785, 0xe038ddd8, 0x0a8c1486, + 0x63d1c6b2, 0xaea5410b, 0xafe2434d, 0x99612ff8, + 0xf6b3f145, 0x842115a5, 0x4a9c94d6, 0x781ef066, + 0x11432252, 0x3bc776fc, 0xd7fcb32b, 0x10042014, + 0x5951b208, 0x5e99bcc7, 0xa96d4fc4, 0x340d6839, + 0xcffa8335, 0x5bdfb684, 0xe57ed79b, 0x90243db4, + 0xec3bc5d7, 0x96ab313d, 0x1fce3ed1, 0x44118855, + 0x068f0c89, 0x254e4a6b, 0xe6b7d151, 0x8beb0b60, + 0xf03cfdcc, 0x3e817cbf, 0x6a94d4fe, 0xfbf7eb0c, + 0xdeb9a167, 0x4c13985f, 0xb02c7d9c, 0x6bd3d6b8, + 0xbbe76b5c, 0xa56e57cb, 0x37c46ef3, 0x0c03180f, + 0x45568a13, 0x0d441a49, 0xe17fdf9e, 0x9ea92137, + 0xa82a4d82, 0xd6bbb16d, 0x23c146e2, 0x5153a202, + 0x57dcae8b, 0x2c0b5827, 0x4e9d9cd3, 0xad6c47c1, + 0xc43195f5, 0xcd7487b9, 0xfff6e309, 0x05460a43, + 0x8aac0926, 0x1e893c97, 0x5014a044, 0xa3e15b42, + 0x5816b04e, 0xe83acdd2, 0xb9696fd0, 0x2409482d, + 0xdd70a7ad, 0xe2b6d954, 0x67d0ceb7, 0x93ed3b7e, + 0x17cc2edb, 0x15422a57, 0x5a98b4c2, 0xaaa4490e, + 0xa0285d88, 0x6d5cda31, 0xc7f8933f, 0x228644a4, + }, + { + 0x186018c0, 0x238c2305, 0xc63fc67e, 0xe887e813, + 0x8726874c, 0xb8dab8a9, 0x01040108, 0x4f214f42, + 0x36d836ad, 0xa6a2a659, 0xd26fd2de, 0xf5f3f5fb, + 0x79f979ef, 0x6fa16f5f, 0x917e91fc, 0x525552aa, + 0x609d6027, 0xbccabc89, 0x9b569bac, 0x8e028e04, + 0xa3b6a371, 0x0c300c60, 0x7bf17bff, 0x35d435b5, + 0x1d741de8, 0xe0a7e053, 0xd77bd7f6, 0xc22fc25e, + 0x2eb82e6d, 0x4b314b62, 0xfedffea3, 0x57415782, + 0x155415a8, 0x77c1779f, 0x37dc37a5, 0xe5b3e57b, + 0x9f469f8c, 0xf0e7f0d3, 0x4a354a6a, 0xda4fda9e, + 0x587d58fa, 0xc903c906, 0x29a42955, 0x0a280a50, + 0xb1feb1e1, 0xa0baa069, 0x6bb16b7f, 0x852e855c, + 0xbdcebd81, 0x5d695dd2, 0x10401080, 0xf4f7f4f3, + 0xcb0bcb16, 0x3ef83eed, 0x05140528, 0x6781671f, + 0xe4b7e473, 0x279c2725, 0x41194132, 0x8b168b2c, + 0xa7a6a751, 0x7de97dcf, 0x956e95dc, 0xd847d88e, + 0xfbcbfb8b, 0xee9fee23, 0x7ced7cc7, 0x66856617, + 0xdd53dda6, 0x175c17b8, 0x47014702, 0x9e429e84, + 0xca0fca1e, 0x2db42d75, 0xbfc6bf91, 0x071c0738, + 0xad8ead01, 0x5a755aea, 0x8336836c, 0x33cc3385, + 0x6391633f, 0x02080210, 0xaa92aa39, 0x71d971af, + 0xc807c80e, 0x196419c8, 0x49394972, 0xd943d986, + 0xf2eff2c3, 0xe3abe34b, 0x5b715be2, 0x881a8834, + 0x9a529aa4, 0x2698262d, 0x32c8328d, 0xb0fab0e9, + 0xe983e91b, 0x0f3c0f78, 0xd573d5e6, 0x803a8074, + 0xbec2be99, 0xcd13cd26, 0x34d034bd, 0x483d487a, + 0xffdbffab, 0x7af57af7, 0x907a90f4, 0x5f615fc2, + 0x2080201d, 0x68bd6867, 0x1a681ad0, 0xae82ae19, + 0xb4eab4c9, 0x544d549a, 0x937693ec, 0x2288220d, + 0x648d6407, 0xf1e3f1db, 0x73d173bf, 0x12481290, + 0x401d403a, 0x08200840, 0xc32bc356, 0xec97ec33, + 0xdb4bdb96, 0xa1bea161, 0x8d0e8d1c, 0x3df43df5, + 0x976697cc, 0x00000000, 0xcf1bcf36, 0x2bac2b45, + 0x76c57697, 0x82328264, 0xd67fd6fe, 0x1b6c1bd8, + 0xb5eeb5c1, 0xaf86af11, 0x6ab56a77, 0x505d50ba, + 0x45094512, 0xf3ebf3cb, 0x30c0309d, 0xef9bef2b, + 0x3ffc3fe5, 0x55495592, 0xa2b2a279, 0xea8fea03, + 0x6589650f, 0xbad2bab9, 0x2fbc2f65, 0xc027c04e, + 0xde5fdebe, 0x1c701ce0, 0xfdd3fdbb, 0x4d294d52, + 0x927292e4, 0x75c9758f, 0x06180630, 0x8a128a24, + 0xb2f2b2f9, 0xe6bfe663, 0x0e380e70, 0x1f7c1ff8, + 0x62956237, 0xd477d4ee, 0xa89aa829, 0x966296c4, + 0xf9c3f99b, 0xc533c566, 0x25942535, 0x597959f2, + 0x842a8454, 0x72d572b7, 0x39e439d5, 0x4c2d4c5a, + 0x5e655eca, 0x78fd78e7, 0x38e038dd, 0x8c0a8c14, + 0xd163d1c6, 0xa5aea541, 0xe2afe243, 0x6199612f, + 0xb3f6b3f1, 0x21842115, 0x9c4a9c94, 0x1e781ef0, + 0x43114322, 0xc73bc776, 0xfcd7fcb3, 0x04100420, + 0x515951b2, 0x995e99bc, 0x6da96d4f, 0x0d340d68, + 0xfacffa83, 0xdf5bdfb6, 0x7ee57ed7, 0x2490243d, + 0x3bec3bc5, 0xab96ab31, 0xce1fce3e, 0x11441188, + 0x8f068f0c, 0x4e254e4a, 0xb7e6b7d1, 0xeb8beb0b, + 0x3cf03cfd, 0x813e817c, 0x946a94d4, 0xf7fbf7eb, + 0xb9deb9a1, 0x134c1398, 0x2cb02c7d, 0xd36bd3d6, + 0xe7bbe76b, 0x6ea56e57, 0xc437c46e, 0x030c0318, + 0x5645568a, 0x440d441a, 0x7fe17fdf, 0xa99ea921, + 0x2aa82a4d, 0xbbd6bbb1, 0xc123c146, 0x535153a2, + 0xdc57dcae, 0x0b2c0b58, 0x9d4e9d9c, 0x6cad6c47, + 0x31c43195, 0x74cd7487, 0xf6fff6e3, 0x4605460a, + 0xac8aac09, 0x891e893c, 0x145014a0, 0xe1a3e15b, + 0x165816b0, 0x3ae83acd, 0x69b9696f, 0x09240948, + 0x70dd70a7, 0xb6e2b6d9, 0xd067d0ce, 0xed93ed3b, + 0xcc17cc2e, 0x4215422a, 0x985a98b4, 0xa4aaa449, + 0x28a0285d, 0x5c6d5cda, 0xf8c7f893, 0x86228644, + } +}; + +__device__ __constant__ u32 Cl[8][256] = +{ + { + 0xc07830d8, 0x05af4626, 0x7ef991b8, 0x136fcdfb, + 0x4ca113cb, 0xa9626d11, 0x08050209, 0x426e9e0d, + 0xadee6c9b, 0x590451ff, 0xdebdb90c, 0xfb06f70e, + 0xef80f296, 0x5fcede30, 0xfcef3f6d, 0xaa07a4f8, + 0x27fdc047, 0x89766535, 0xaccd2b37, 0x048c018a, + 0x71155bd2, 0x603c186c, 0xff8af684, 0xb5e16a80, + 0xe8693af5, 0x5347ddb3, 0xf6acb321, 0x5eed999c, + 0x6d965c43, 0x627a9629, 0xa321e15d, 0x8216aed5, + 0xa8412abd, 0x9fb6eee8, 0xa5eb6e92, 0x7b56d79e, + 0x8cd92313, 0xd317fd23, 0x6a7f9420, 0x9e95a944, + 0xfa25b0a2, 0x06ca8fcf, 0x558d527c, 0x5022145a, + 0xe14f7f50, 0x691a5dc9, 0x7fdad614, 0x5cab17d9, + 0x8173673c, 0xd234ba8f, 0x80502090, 0xf303f507, + 0x16c08bdd, 0xedc67cd3, 0x28110a2d, 0x1fe6ce78, + 0x7353d597, 0x25bb4e02, 0x32588273, 0x2c9d0ba7, + 0x510153f6, 0xcf94fab2, 0xdcfb3749, 0x8e9fad56, + 0x8b30eb70, 0x2371c1cd, 0xc791f8bb, 0x17e3cc71, + 0xa68ea77b, 0xb84b2eaf, 0x02468e45, 0x84dc211a, + 0x1ec589d4, 0x75995a58, 0x9179632e, 0x381b0e3f, + 0x012347ac, 0xea2fb4b0, 0x6cb51bef, 0x85ff66b6, + 0x3ff2c65c, 0x100a0412, 0x39384993, 0xafa8e2de, + 0x0ecf8dc6, 0xc87d32d1, 0x7270923b, 0x869aaf5f, + 0xc31df931, 0x4b48dba8, 0xe22ab6b9, 0x34920dbc, + 0xa4c8293e, 0x2dbe4c0b, 0x8dfa64bf, 0xe94a7d59, + 0x1b6acff2, 0x78331e77, 0xe6a6b733, 0x74ba1df4, + 0x997c6127, 0x26de87eb, 0xbde46889, 0x7a759032, + 0xab24e354, 0xf78ff48d, 0xf4ea3d64, 0xc23ebe9d, + 0x1da0403d, 0x67d5d00f, 0xd07234ca, 0x192c41b7, + 0xc95e757d, 0x9a19a8ce, 0xece53b7f, 0x0daa442f, + 0x07e9c863, 0xdb12ff2a, 0xbfa2e6cc, 0x905a2482, + 0x3a5d807a, 0x40281048, 0x56e89b95, 0x337bc5df, + 0x9690ab4d, 0x611f5fc0, 0x1c830791, 0xf5c97ac8, + 0xccf1335b, 0x00000000, 0x36d483f9, 0x4587566e, + 0x97b3ece1, 0x64b019e6, 0xfea9b128, 0xd87736c3, + 0xc15b7774, 0x112943be, 0x77dfd41d, 0xba0da0ea, + 0x124c8a57, 0xcb18fb38, 0x9df060ad, 0x2b74c3c4, + 0xe5c37eda, 0x921caac7, 0x791059db, 0x0365c9e9, + 0x0fecca6a, 0xb9686903, 0x65935e4a, 0x4ee79d8e, + 0xbe81a160, 0xe06c38fc, 0xbb2ee746, 0x52649a1f, + 0xe4e03976, 0x8fbceafa, 0x301e0c36, 0x249809ae, + 0xf940794b, 0x6359d185, 0x70361c7e, 0xf8633ee7, + 0x37f7c455, 0xeea3b53a, 0x29324d81, 0xc4f43152, + 0x9b3aef62, 0x66f697a3, 0x35b14a10, 0xf220b2ab, + 0x54ae15d0, 0xb7a7e4c5, 0xd5dd72ec, 0x5a619816, + 0xca3bbc94, 0xe785f09f, 0xddd870e5, 0x14860598, + 0xc6b2bf17, 0x410b57e4, 0x434dd9a1, 0x2ff8c24e, + 0xf1457b42, 0x15a54234, 0x94d62508, 0xf0663cee, + 0x22528661, 0x76fc93b1, 0xb32be54f, 0x20140824, + 0xb208a2e3, 0xbcc72f25, 0x4fc4da22, 0x68391a65, + 0x8335e979, 0xb684a369, 0xd79bfca9, 0x3db44819, + 0xc5d776fe, 0x313d4b9a, 0x3ed181f0, 0x88552299, + 0x0c890383, 0x4a6b9c04, 0xd1517366, 0x0b60cbe0, + 0xfdcc78c1, 0x7cbf1ffd, 0xd4fe3540, 0xeb0cf31c, + 0xa1676f18, 0x985f268b, 0x7d9c5851, 0xd6b8bb05, + 0x6b5cd38c, 0x57cbdc39, 0x6ef395aa, 0x180f061b, + 0x8a13acdc, 0x1a49885e, 0xdf9efea0, 0x21374f88, + 0x4d825467, 0xb16d6b0a, 0x46e29f87, 0xa202a6f1, + 0xae8ba572, 0x58271653, 0x9cd32701, 0x47c1d82b, + 0x95f562a4, 0x87b9e8f3, 0xe309f115, 0x0a438c4c, + 0x092645a5, 0x3c970fb5, 0xa04428b4, 0x5b42dfba, + 0xb04e2ca6, 0xcdd274f7, 0x6fd0d206, 0x482d1241, + 0xa7ade0d7, 0xd954716f, 0xceb7bd1e, 0x3b7ec7d6, + 0x2edb85e2, 0x2a578468, 0xb4c22d2c, 0x490e55ed, + 0x5d885075, 0xda31b886, 0x933fed6b, 0x44a411c2, + }, + { + 0x18c07830, 0x2305af46, 0xc67ef991, 0xe8136fcd, + 0x874ca113, 0xb8a9626d, 0x01080502, 0x4f426e9e, + 0x36adee6c, 0xa6590451, 0xd2debdb9, 0xf5fb06f7, + 0x79ef80f2, 0x6f5fcede, 0x91fcef3f, 0x52aa07a4, + 0x6027fdc0, 0xbc897665, 0x9baccd2b, 0x8e048c01, + 0xa371155b, 0x0c603c18, 0x7bff8af6, 0x35b5e16a, + 0x1de8693a, 0xe05347dd, 0xd7f6acb3, 0xc25eed99, + 0x2e6d965c, 0x4b627a96, 0xfea321e1, 0x578216ae, + 0x15a8412a, 0x779fb6ee, 0x37a5eb6e, 0xe57b56d7, + 0x9f8cd923, 0xf0d317fd, 0x4a6a7f94, 0xda9e95a9, + 0x58fa25b0, 0xc906ca8f, 0x29558d52, 0x0a502214, + 0xb1e14f7f, 0xa0691a5d, 0x6b7fdad6, 0x855cab17, + 0xbd817367, 0x5dd234ba, 0x10805020, 0xf4f303f5, + 0xcb16c08b, 0x3eedc67c, 0x0528110a, 0x671fe6ce, + 0xe47353d5, 0x2725bb4e, 0x41325882, 0x8b2c9d0b, + 0xa7510153, 0x7dcf94fa, 0x95dcfb37, 0xd88e9fad, + 0xfb8b30eb, 0xee2371c1, 0x7cc791f8, 0x6617e3cc, + 0xdda68ea7, 0x17b84b2e, 0x4702468e, 0x9e84dc21, + 0xca1ec589, 0x2d75995a, 0xbf917963, 0x07381b0e, + 0xad012347, 0x5aea2fb4, 0x836cb51b, 0x3385ff66, + 0x633ff2c6, 0x02100a04, 0xaa393849, 0x71afa8e2, + 0xc80ecf8d, 0x19c87d32, 0x49727092, 0xd9869aaf, + 0xf2c31df9, 0xe34b48db, 0x5be22ab6, 0x8834920d, + 0x9aa4c829, 0x262dbe4c, 0x328dfa64, 0xb0e94a7d, + 0xe91b6acf, 0x0f78331e, 0xd5e6a6b7, 0x8074ba1d, + 0xbe997c61, 0xcd26de87, 0x34bde468, 0x487a7590, + 0xffab24e3, 0x7af78ff4, 0x90f4ea3d, 0x5fc23ebe, + 0x201da040, 0x6867d5d0, 0x1ad07234, 0xae192c41, + 0xb4c95e75, 0x549a19a8, 0x93ece53b, 0x220daa44, + 0x6407e9c8, 0xf1db12ff, 0x73bfa2e6, 0x12905a24, + 0x403a5d80, 0x08402810, 0xc356e89b, 0xec337bc5, + 0xdb9690ab, 0xa1611f5f, 0x8d1c8307, 0x3df5c97a, + 0x97ccf133, 0x00000000, 0xcf36d483, 0x2b458756, + 0x7697b3ec, 0x8264b019, 0xd6fea9b1, 0x1bd87736, + 0xb5c15b77, 0xaf112943, 0x6a77dfd4, 0x50ba0da0, + 0x45124c8a, 0xf3cb18fb, 0x309df060, 0xef2b74c3, + 0x3fe5c37e, 0x55921caa, 0xa2791059, 0xea0365c9, + 0x650fecca, 0xbab96869, 0x2f65935e, 0xc04ee79d, + 0xdebe81a1, 0x1ce06c38, 0xfdbb2ee7, 0x4d52649a, + 0x92e4e039, 0x758fbcea, 0x06301e0c, 0x8a249809, + 0xb2f94079, 0xe66359d1, 0x0e70361c, 0x1ff8633e, + 0x6237f7c4, 0xd4eea3b5, 0xa829324d, 0x96c4f431, + 0xf99b3aef, 0xc566f697, 0x2535b14a, 0x59f220b2, + 0x8454ae15, 0x72b7a7e4, 0x39d5dd72, 0x4c5a6198, + 0x5eca3bbc, 0x78e785f0, 0x38ddd870, 0x8c148605, + 0xd1c6b2bf, 0xa5410b57, 0xe2434dd9, 0x612ff8c2, + 0xb3f1457b, 0x2115a542, 0x9c94d625, 0x1ef0663c, + 0x43225286, 0xc776fc93, 0xfcb32be5, 0x04201408, + 0x51b208a2, 0x99bcc72f, 0x6d4fc4da, 0x0d68391a, + 0xfa8335e9, 0xdfb684a3, 0x7ed79bfc, 0x243db448, + 0x3bc5d776, 0xab313d4b, 0xce3ed181, 0x11885522, + 0x8f0c8903, 0x4e4a6b9c, 0xb7d15173, 0xeb0b60cb, + 0x3cfdcc78, 0x817cbf1f, 0x94d4fe35, 0xf7eb0cf3, + 0xb9a1676f, 0x13985f26, 0x2c7d9c58, 0xd3d6b8bb, + 0xe76b5cd3, 0x6e57cbdc, 0xc46ef395, 0x03180f06, + 0x568a13ac, 0x441a4988, 0x7fdf9efe, 0xa921374f, + 0x2a4d8254, 0xbbb16d6b, 0xc146e29f, 0x53a202a6, + 0xdcae8ba5, 0x0b582716, 0x9d9cd327, 0x6c47c1d8, + 0x3195f562, 0x7487b9e8, 0xf6e309f1, 0x460a438c, + 0xac092645, 0x893c970f, 0x14a04428, 0xe15b42df, + 0x16b04e2c, 0x3acdd274, 0x696fd0d2, 0x09482d12, + 0x70a7ade0, 0xb6d95471, 0xd0ceb7bd, 0xed3b7ec7, + 0xcc2edb85, 0x422a5784, 0x98b4c22d, 0xa4490e55, + 0x285d8850, 0x5cda31b8, 0xf8933fed, 0x8644a411, + }, + { + 0x6018c078, 0x8c2305af, 0x3fc67ef9, 0x87e8136f, + 0x26874ca1, 0xdab8a962, 0x04010805, 0x214f426e, + 0xd836adee, 0xa2a65904, 0x6fd2debd, 0xf3f5fb06, + 0xf979ef80, 0xa16f5fce, 0x7e91fcef, 0x5552aa07, + 0x9d6027fd, 0xcabc8976, 0x569baccd, 0x028e048c, + 0xb6a37115, 0x300c603c, 0xf17bff8a, 0xd435b5e1, + 0x741de869, 0xa7e05347, 0x7bd7f6ac, 0x2fc25eed, + 0xb82e6d96, 0x314b627a, 0xdffea321, 0x41578216, + 0x5415a841, 0xc1779fb6, 0xdc37a5eb, 0xb3e57b56, + 0x469f8cd9, 0xe7f0d317, 0x354a6a7f, 0x4fda9e95, + 0x7d58fa25, 0x03c906ca, 0xa429558d, 0x280a5022, + 0xfeb1e14f, 0xbaa0691a, 0xb16b7fda, 0x2e855cab, + 0xcebd8173, 0x695dd234, 0x40108050, 0xf7f4f303, + 0x0bcb16c0, 0xf83eedc6, 0x14052811, 0x81671fe6, + 0xb7e47353, 0x9c2725bb, 0x19413258, 0x168b2c9d, + 0xa6a75101, 0xe97dcf94, 0x6e95dcfb, 0x47d88e9f, + 0xcbfb8b30, 0x9fee2371, 0xed7cc791, 0x856617e3, + 0x53dda68e, 0x5c17b84b, 0x01470246, 0x429e84dc, + 0x0fca1ec5, 0xb42d7599, 0xc6bf9179, 0x1c07381b, + 0x8ead0123, 0x755aea2f, 0x36836cb5, 0xcc3385ff, + 0x91633ff2, 0x0802100a, 0x92aa3938, 0xd971afa8, + 0x07c80ecf, 0x6419c87d, 0x39497270, 0x43d9869a, + 0xeff2c31d, 0xabe34b48, 0x715be22a, 0x1a883492, + 0x529aa4c8, 0x98262dbe, 0xc8328dfa, 0xfab0e94a, + 0x83e91b6a, 0x3c0f7833, 0x73d5e6a6, 0x3a8074ba, + 0xc2be997c, 0x13cd26de, 0xd034bde4, 0x3d487a75, + 0xdbffab24, 0xf57af78f, 0x7a90f4ea, 0x615fc23e, + 0x80201da0, 0xbd6867d5, 0x681ad072, 0x82ae192c, + 0xeab4c95e, 0x4d549a19, 0x7693ece5, 0x88220daa, + 0x8d6407e9, 0xe3f1db12, 0xd173bfa2, 0x4812905a, + 0x1d403a5d, 0x20084028, 0x2bc356e8, 0x97ec337b, + 0x4bdb9690, 0xbea1611f, 0x0e8d1c83, 0xf43df5c9, + 0x6697ccf1, 0x00000000, 0x1bcf36d4, 0xac2b4587, + 0xc57697b3, 0x328264b0, 0x7fd6fea9, 0x6c1bd877, + 0xeeb5c15b, 0x86af1129, 0xb56a77df, 0x5d50ba0d, + 0x0945124c, 0xebf3cb18, 0xc0309df0, 0x9bef2b74, + 0xfc3fe5c3, 0x4955921c, 0xb2a27910, 0x8fea0365, + 0x89650fec, 0xd2bab968, 0xbc2f6593, 0x27c04ee7, + 0x5fdebe81, 0x701ce06c, 0xd3fdbb2e, 0x294d5264, + 0x7292e4e0, 0xc9758fbc, 0x1806301e, 0x128a2498, + 0xf2b2f940, 0xbfe66359, 0x380e7036, 0x7c1ff863, + 0x956237f7, 0x77d4eea3, 0x9aa82932, 0x6296c4f4, + 0xc3f99b3a, 0x33c566f6, 0x942535b1, 0x7959f220, + 0x2a8454ae, 0xd572b7a7, 0xe439d5dd, 0x2d4c5a61, + 0x655eca3b, 0xfd78e785, 0xe038ddd8, 0x0a8c1486, + 0x63d1c6b2, 0xaea5410b, 0xafe2434d, 0x99612ff8, + 0xf6b3f145, 0x842115a5, 0x4a9c94d6, 0x781ef066, + 0x11432252, 0x3bc776fc, 0xd7fcb32b, 0x10042014, + 0x5951b208, 0x5e99bcc7, 0xa96d4fc4, 0x340d6839, + 0xcffa8335, 0x5bdfb684, 0xe57ed79b, 0x90243db4, + 0xec3bc5d7, 0x96ab313d, 0x1fce3ed1, 0x44118855, + 0x068f0c89, 0x254e4a6b, 0xe6b7d151, 0x8beb0b60, + 0xf03cfdcc, 0x3e817cbf, 0x6a94d4fe, 0xfbf7eb0c, + 0xdeb9a167, 0x4c13985f, 0xb02c7d9c, 0x6bd3d6b8, + 0xbbe76b5c, 0xa56e57cb, 0x37c46ef3, 0x0c03180f, + 0x45568a13, 0x0d441a49, 0xe17fdf9e, 0x9ea92137, + 0xa82a4d82, 0xd6bbb16d, 0x23c146e2, 0x5153a202, + 0x57dcae8b, 0x2c0b5827, 0x4e9d9cd3, 0xad6c47c1, + 0xc43195f5, 0xcd7487b9, 0xfff6e309, 0x05460a43, + 0x8aac0926, 0x1e893c97, 0x5014a044, 0xa3e15b42, + 0x5816b04e, 0xe83acdd2, 0xb9696fd0, 0x2409482d, + 0xdd70a7ad, 0xe2b6d954, 0x67d0ceb7, 0x93ed3b7e, + 0x17cc2edb, 0x15422a57, 0x5a98b4c2, 0xaaa4490e, + 0xa0285d88, 0x6d5cda31, 0xc7f8933f, 0x228644a4, + }, + { + 0x186018c0, 0x238c2305, 0xc63fc67e, 0xe887e813, + 0x8726874c, 0xb8dab8a9, 0x01040108, 0x4f214f42, + 0x36d836ad, 0xa6a2a659, 0xd26fd2de, 0xf5f3f5fb, + 0x79f979ef, 0x6fa16f5f, 0x917e91fc, 0x525552aa, + 0x609d6027, 0xbccabc89, 0x9b569bac, 0x8e028e04, + 0xa3b6a371, 0x0c300c60, 0x7bf17bff, 0x35d435b5, + 0x1d741de8, 0xe0a7e053, 0xd77bd7f6, 0xc22fc25e, + 0x2eb82e6d, 0x4b314b62, 0xfedffea3, 0x57415782, + 0x155415a8, 0x77c1779f, 0x37dc37a5, 0xe5b3e57b, + 0x9f469f8c, 0xf0e7f0d3, 0x4a354a6a, 0xda4fda9e, + 0x587d58fa, 0xc903c906, 0x29a42955, 0x0a280a50, + 0xb1feb1e1, 0xa0baa069, 0x6bb16b7f, 0x852e855c, + 0xbdcebd81, 0x5d695dd2, 0x10401080, 0xf4f7f4f3, + 0xcb0bcb16, 0x3ef83eed, 0x05140528, 0x6781671f, + 0xe4b7e473, 0x279c2725, 0x41194132, 0x8b168b2c, + 0xa7a6a751, 0x7de97dcf, 0x956e95dc, 0xd847d88e, + 0xfbcbfb8b, 0xee9fee23, 0x7ced7cc7, 0x66856617, + 0xdd53dda6, 0x175c17b8, 0x47014702, 0x9e429e84, + 0xca0fca1e, 0x2db42d75, 0xbfc6bf91, 0x071c0738, + 0xad8ead01, 0x5a755aea, 0x8336836c, 0x33cc3385, + 0x6391633f, 0x02080210, 0xaa92aa39, 0x71d971af, + 0xc807c80e, 0x196419c8, 0x49394972, 0xd943d986, + 0xf2eff2c3, 0xe3abe34b, 0x5b715be2, 0x881a8834, + 0x9a529aa4, 0x2698262d, 0x32c8328d, 0xb0fab0e9, + 0xe983e91b, 0x0f3c0f78, 0xd573d5e6, 0x803a8074, + 0xbec2be99, 0xcd13cd26, 0x34d034bd, 0x483d487a, + 0xffdbffab, 0x7af57af7, 0x907a90f4, 0x5f615fc2, + 0x2080201d, 0x68bd6867, 0x1a681ad0, 0xae82ae19, + 0xb4eab4c9, 0x544d549a, 0x937693ec, 0x2288220d, + 0x648d6407, 0xf1e3f1db, 0x73d173bf, 0x12481290, + 0x401d403a, 0x08200840, 0xc32bc356, 0xec97ec33, + 0xdb4bdb96, 0xa1bea161, 0x8d0e8d1c, 0x3df43df5, + 0x976697cc, 0x00000000, 0xcf1bcf36, 0x2bac2b45, + 0x76c57697, 0x82328264, 0xd67fd6fe, 0x1b6c1bd8, + 0xb5eeb5c1, 0xaf86af11, 0x6ab56a77, 0x505d50ba, + 0x45094512, 0xf3ebf3cb, 0x30c0309d, 0xef9bef2b, + 0x3ffc3fe5, 0x55495592, 0xa2b2a279, 0xea8fea03, + 0x6589650f, 0xbad2bab9, 0x2fbc2f65, 0xc027c04e, + 0xde5fdebe, 0x1c701ce0, 0xfdd3fdbb, 0x4d294d52, + 0x927292e4, 0x75c9758f, 0x06180630, 0x8a128a24, + 0xb2f2b2f9, 0xe6bfe663, 0x0e380e70, 0x1f7c1ff8, + 0x62956237, 0xd477d4ee, 0xa89aa829, 0x966296c4, + 0xf9c3f99b, 0xc533c566, 0x25942535, 0x597959f2, + 0x842a8454, 0x72d572b7, 0x39e439d5, 0x4c2d4c5a, + 0x5e655eca, 0x78fd78e7, 0x38e038dd, 0x8c0a8c14, + 0xd163d1c6, 0xa5aea541, 0xe2afe243, 0x6199612f, + 0xb3f6b3f1, 0x21842115, 0x9c4a9c94, 0x1e781ef0, + 0x43114322, 0xc73bc776, 0xfcd7fcb3, 0x04100420, + 0x515951b2, 0x995e99bc, 0x6da96d4f, 0x0d340d68, + 0xfacffa83, 0xdf5bdfb6, 0x7ee57ed7, 0x2490243d, + 0x3bec3bc5, 0xab96ab31, 0xce1fce3e, 0x11441188, + 0x8f068f0c, 0x4e254e4a, 0xb7e6b7d1, 0xeb8beb0b, + 0x3cf03cfd, 0x813e817c, 0x946a94d4, 0xf7fbf7eb, + 0xb9deb9a1, 0x134c1398, 0x2cb02c7d, 0xd36bd3d6, + 0xe7bbe76b, 0x6ea56e57, 0xc437c46e, 0x030c0318, + 0x5645568a, 0x440d441a, 0x7fe17fdf, 0xa99ea921, + 0x2aa82a4d, 0xbbd6bbb1, 0xc123c146, 0x535153a2, + 0xdc57dcae, 0x0b2c0b58, 0x9d4e9d9c, 0x6cad6c47, + 0x31c43195, 0x74cd7487, 0xf6fff6e3, 0x4605460a, + 0xac8aac09, 0x891e893c, 0x145014a0, 0xe1a3e15b, + 0x165816b0, 0x3ae83acd, 0x69b9696f, 0x09240948, + 0x70dd70a7, 0xb6e2b6d9, 0xd067d0ce, 0xed93ed3b, + 0xcc17cc2e, 0x4215422a, 0x985a98b4, 0xa4aaa449, + 0x28a0285d, 0x5c6d5cda, 0xf8c7f893, 0x86228644, + }, + { + 0x18186018, 0x23238c23, 0xc6c63fc6, 0xe8e887e8, + 0x87872687, 0xb8b8dab8, 0x01010401, 0x4f4f214f, + 0x3636d836, 0xa6a6a2a6, 0xd2d26fd2, 0xf5f5f3f5, + 0x7979f979, 0x6f6fa16f, 0x91917e91, 0x52525552, + 0x60609d60, 0xbcbccabc, 0x9b9b569b, 0x8e8e028e, + 0xa3a3b6a3, 0x0c0c300c, 0x7b7bf17b, 0x3535d435, + 0x1d1d741d, 0xe0e0a7e0, 0xd7d77bd7, 0xc2c22fc2, + 0x2e2eb82e, 0x4b4b314b, 0xfefedffe, 0x57574157, + 0x15155415, 0x7777c177, 0x3737dc37, 0xe5e5b3e5, + 0x9f9f469f, 0xf0f0e7f0, 0x4a4a354a, 0xdada4fda, + 0x58587d58, 0xc9c903c9, 0x2929a429, 0x0a0a280a, + 0xb1b1feb1, 0xa0a0baa0, 0x6b6bb16b, 0x85852e85, + 0xbdbdcebd, 0x5d5d695d, 0x10104010, 0xf4f4f7f4, + 0xcbcb0bcb, 0x3e3ef83e, 0x05051405, 0x67678167, + 0xe4e4b7e4, 0x27279c27, 0x41411941, 0x8b8b168b, + 0xa7a7a6a7, 0x7d7de97d, 0x95956e95, 0xd8d847d8, + 0xfbfbcbfb, 0xeeee9fee, 0x7c7ced7c, 0x66668566, + 0xdddd53dd, 0x17175c17, 0x47470147, 0x9e9e429e, + 0xcaca0fca, 0x2d2db42d, 0xbfbfc6bf, 0x07071c07, + 0xadad8ead, 0x5a5a755a, 0x83833683, 0x3333cc33, + 0x63639163, 0x02020802, 0xaaaa92aa, 0x7171d971, + 0xc8c807c8, 0x19196419, 0x49493949, 0xd9d943d9, + 0xf2f2eff2, 0xe3e3abe3, 0x5b5b715b, 0x88881a88, + 0x9a9a529a, 0x26269826, 0x3232c832, 0xb0b0fab0, + 0xe9e983e9, 0x0f0f3c0f, 0xd5d573d5, 0x80803a80, + 0xbebec2be, 0xcdcd13cd, 0x3434d034, 0x48483d48, + 0xffffdbff, 0x7a7af57a, 0x90907a90, 0x5f5f615f, + 0x20208020, 0x6868bd68, 0x1a1a681a, 0xaeae82ae, + 0xb4b4eab4, 0x54544d54, 0x93937693, 0x22228822, + 0x64648d64, 0xf1f1e3f1, 0x7373d173, 0x12124812, + 0x40401d40, 0x08082008, 0xc3c32bc3, 0xecec97ec, + 0xdbdb4bdb, 0xa1a1bea1, 0x8d8d0e8d, 0x3d3df43d, + 0x97976697, 0x00000000, 0xcfcf1bcf, 0x2b2bac2b, + 0x7676c576, 0x82823282, 0xd6d67fd6, 0x1b1b6c1b, + 0xb5b5eeb5, 0xafaf86af, 0x6a6ab56a, 0x50505d50, + 0x45450945, 0xf3f3ebf3, 0x3030c030, 0xefef9bef, + 0x3f3ffc3f, 0x55554955, 0xa2a2b2a2, 0xeaea8fea, + 0x65658965, 0xbabad2ba, 0x2f2fbc2f, 0xc0c027c0, + 0xdede5fde, 0x1c1c701c, 0xfdfdd3fd, 0x4d4d294d, + 0x92927292, 0x7575c975, 0x06061806, 0x8a8a128a, + 0xb2b2f2b2, 0xe6e6bfe6, 0x0e0e380e, 0x1f1f7c1f, + 0x62629562, 0xd4d477d4, 0xa8a89aa8, 0x96966296, + 0xf9f9c3f9, 0xc5c533c5, 0x25259425, 0x59597959, + 0x84842a84, 0x7272d572, 0x3939e439, 0x4c4c2d4c, + 0x5e5e655e, 0x7878fd78, 0x3838e038, 0x8c8c0a8c, + 0xd1d163d1, 0xa5a5aea5, 0xe2e2afe2, 0x61619961, + 0xb3b3f6b3, 0x21218421, 0x9c9c4a9c, 0x1e1e781e, + 0x43431143, 0xc7c73bc7, 0xfcfcd7fc, 0x04041004, + 0x51515951, 0x99995e99, 0x6d6da96d, 0x0d0d340d, + 0xfafacffa, 0xdfdf5bdf, 0x7e7ee57e, 0x24249024, + 0x3b3bec3b, 0xabab96ab, 0xcece1fce, 0x11114411, + 0x8f8f068f, 0x4e4e254e, 0xb7b7e6b7, 0xebeb8beb, + 0x3c3cf03c, 0x81813e81, 0x94946a94, 0xf7f7fbf7, + 0xb9b9deb9, 0x13134c13, 0x2c2cb02c, 0xd3d36bd3, + 0xe7e7bbe7, 0x6e6ea56e, 0xc4c437c4, 0x03030c03, + 0x56564556, 0x44440d44, 0x7f7fe17f, 0xa9a99ea9, + 0x2a2aa82a, 0xbbbbd6bb, 0xc1c123c1, 0x53535153, + 0xdcdc57dc, 0x0b0b2c0b, 0x9d9d4e9d, 0x6c6cad6c, + 0x3131c431, 0x7474cd74, 0xf6f6fff6, 0x46460546, + 0xacac8aac, 0x89891e89, 0x14145014, 0xe1e1a3e1, + 0x16165816, 0x3a3ae83a, 0x6969b969, 0x09092409, + 0x7070dd70, 0xb6b6e2b6, 0xd0d067d0, 0xeded93ed, + 0xcccc17cc, 0x42421542, 0x98985a98, 0xa4a4aaa4, + 0x2828a028, 0x5c5c6d5c, 0xf8f8c7f8, 0x86862286, + }, + { + 0xd8181860, 0x2623238c, 0xb8c6c63f, 0xfbe8e887, + 0xcb878726, 0x11b8b8da, 0x09010104, 0x0d4f4f21, + 0x9b3636d8, 0xffa6a6a2, 0x0cd2d26f, 0x0ef5f5f3, + 0x967979f9, 0x306f6fa1, 0x6d91917e, 0xf8525255, + 0x4760609d, 0x35bcbcca, 0x379b9b56, 0x8a8e8e02, + 0xd2a3a3b6, 0x6c0c0c30, 0x847b7bf1, 0x803535d4, + 0xf51d1d74, 0xb3e0e0a7, 0x21d7d77b, 0x9cc2c22f, + 0x432e2eb8, 0x294b4b31, 0x5dfefedf, 0xd5575741, + 0xbd151554, 0xe87777c1, 0x923737dc, 0x9ee5e5b3, + 0x139f9f46, 0x23f0f0e7, 0x204a4a35, 0x44dada4f, + 0xa258587d, 0xcfc9c903, 0x7c2929a4, 0x5a0a0a28, + 0x50b1b1fe, 0xc9a0a0ba, 0x146b6bb1, 0xd985852e, + 0x3cbdbdce, 0x8f5d5d69, 0x90101040, 0x07f4f4f7, + 0xddcbcb0b, 0xd33e3ef8, 0x2d050514, 0x78676781, + 0x97e4e4b7, 0x0227279c, 0x73414119, 0xa78b8b16, + 0xf6a7a7a6, 0xb27d7de9, 0x4995956e, 0x56d8d847, + 0x70fbfbcb, 0xcdeeee9f, 0xbb7c7ced, 0x71666685, + 0x7bdddd53, 0xaf17175c, 0x45474701, 0x1a9e9e42, + 0xd4caca0f, 0x582d2db4, 0x2ebfbfc6, 0x3f07071c, + 0xacadad8e, 0xb05a5a75, 0xef838336, 0xb63333cc, + 0x5c636391, 0x12020208, 0x93aaaa92, 0xde7171d9, + 0xc6c8c807, 0xd1191964, 0x3b494939, 0x5fd9d943, + 0x31f2f2ef, 0xa8e3e3ab, 0xb95b5b71, 0xbc88881a, + 0x3e9a9a52, 0x0b262698, 0xbf3232c8, 0x59b0b0fa, + 0xf2e9e983, 0x770f0f3c, 0x33d5d573, 0xf480803a, + 0x27bebec2, 0xebcdcd13, 0x893434d0, 0x3248483d, + 0x54ffffdb, 0x8d7a7af5, 0x6490907a, 0x9d5f5f61, + 0x3d202080, 0x0f6868bd, 0xca1a1a68, 0xb7aeae82, + 0x7db4b4ea, 0xce54544d, 0x7f939376, 0x2f222288, + 0x6364648d, 0x2af1f1e3, 0xcc7373d1, 0x82121248, + 0x7a40401d, 0x48080820, 0x95c3c32b, 0xdfecec97, + 0x4ddbdb4b, 0xc0a1a1be, 0x918d8d0e, 0xc83d3df4, + 0x5b979766, 0x00000000, 0xf9cfcf1b, 0x6e2b2bac, + 0xe17676c5, 0xe6828232, 0x28d6d67f, 0xc31b1b6c, + 0x74b5b5ee, 0xbeafaf86, 0x1d6a6ab5, 0xea50505d, + 0x57454509, 0x38f3f3eb, 0xad3030c0, 0xc4efef9b, + 0xda3f3ffc, 0xc7555549, 0xdba2a2b2, 0xe9eaea8f, + 0x6a656589, 0x03babad2, 0x4a2f2fbc, 0x8ec0c027, + 0x60dede5f, 0xfc1c1c70, 0x46fdfdd3, 0x1f4d4d29, + 0x76929272, 0xfa7575c9, 0x36060618, 0xae8a8a12, + 0x4bb2b2f2, 0x85e6e6bf, 0x7e0e0e38, 0xe71f1f7c, + 0x55626295, 0x3ad4d477, 0x81a8a89a, 0x52969662, + 0x62f9f9c3, 0xa3c5c533, 0x10252594, 0xab595979, + 0xd084842a, 0xc57272d5, 0xec3939e4, 0x164c4c2d, + 0x945e5e65, 0x9f7878fd, 0xe53838e0, 0x988c8c0a, + 0x17d1d163, 0xe4a5a5ae, 0xa1e2e2af, 0x4e616199, + 0x42b3b3f6, 0x34212184, 0x089c9c4a, 0xee1e1e78, + 0x61434311, 0xb1c7c73b, 0x4ffcfcd7, 0x24040410, + 0xe3515159, 0x2599995e, 0x226d6da9, 0x650d0d34, + 0x79fafacf, 0x69dfdf5b, 0xa97e7ee5, 0x19242490, + 0xfe3b3bec, 0x9aabab96, 0xf0cece1f, 0x99111144, + 0x838f8f06, 0x044e4e25, 0x66b7b7e6, 0xe0ebeb8b, + 0xc13c3cf0, 0xfd81813e, 0x4094946a, 0x1cf7f7fb, + 0x18b9b9de, 0x8b13134c, 0x512c2cb0, 0x05d3d36b, + 0x8ce7e7bb, 0x396e6ea5, 0xaac4c437, 0x1b03030c, + 0xdc565645, 0x5e44440d, 0xa07f7fe1, 0x88a9a99e, + 0x672a2aa8, 0x0abbbbd6, 0x87c1c123, 0xf1535351, + 0x72dcdc57, 0x530b0b2c, 0x019d9d4e, 0x2b6c6cad, + 0xa43131c4, 0xf37474cd, 0x15f6f6ff, 0x4c464605, + 0xa5acac8a, 0xb589891e, 0xb4141450, 0xbae1e1a3, + 0xa6161658, 0xf73a3ae8, 0x066969b9, 0x41090924, + 0xd77070dd, 0x6fb6b6e2, 0x1ed0d067, 0xd6eded93, + 0xe2cccc17, 0x68424215, 0x2c98985a, 0xeda4a4aa, + 0x752828a0, 0x865c5c6d, 0x6bf8f8c7, 0xc2868622, + }, + { + 0x30d81818, 0x46262323, 0x91b8c6c6, 0xcdfbe8e8, + 0x13cb8787, 0x6d11b8b8, 0x02090101, 0x9e0d4f4f, + 0x6c9b3636, 0x51ffa6a6, 0xb90cd2d2, 0xf70ef5f5, + 0xf2967979, 0xde306f6f, 0x3f6d9191, 0xa4f85252, + 0xc0476060, 0x6535bcbc, 0x2b379b9b, 0x018a8e8e, + 0x5bd2a3a3, 0x186c0c0c, 0xf6847b7b, 0x6a803535, + 0x3af51d1d, 0xddb3e0e0, 0xb321d7d7, 0x999cc2c2, + 0x5c432e2e, 0x96294b4b, 0xe15dfefe, 0xaed55757, + 0x2abd1515, 0xeee87777, 0x6e923737, 0xd79ee5e5, + 0x23139f9f, 0xfd23f0f0, 0x94204a4a, 0xa944dada, + 0xb0a25858, 0x8fcfc9c9, 0x527c2929, 0x145a0a0a, + 0x7f50b1b1, 0x5dc9a0a0, 0xd6146b6b, 0x17d98585, + 0x673cbdbd, 0xba8f5d5d, 0x20901010, 0xf507f4f4, + 0x8bddcbcb, 0x7cd33e3e, 0x0a2d0505, 0xce786767, + 0xd597e4e4, 0x4e022727, 0x82734141, 0x0ba78b8b, + 0x53f6a7a7, 0xfab27d7d, 0x37499595, 0xad56d8d8, + 0xeb70fbfb, 0xc1cdeeee, 0xf8bb7c7c, 0xcc716666, + 0xa77bdddd, 0x2eaf1717, 0x8e454747, 0x211a9e9e, + 0x89d4caca, 0x5a582d2d, 0x632ebfbf, 0x0e3f0707, + 0x47acadad, 0xb4b05a5a, 0x1bef8383, 0x66b63333, + 0xc65c6363, 0x04120202, 0x4993aaaa, 0xe2de7171, + 0x8dc6c8c8, 0x32d11919, 0x923b4949, 0xaf5fd9d9, + 0xf931f2f2, 0xdba8e3e3, 0xb6b95b5b, 0x0dbc8888, + 0x293e9a9a, 0x4c0b2626, 0x64bf3232, 0x7d59b0b0, + 0xcff2e9e9, 0x1e770f0f, 0xb733d5d5, 0x1df48080, + 0x6127bebe, 0x87ebcdcd, 0x68893434, 0x90324848, + 0xe354ffff, 0xf48d7a7a, 0x3d649090, 0xbe9d5f5f, + 0x403d2020, 0xd00f6868, 0x34ca1a1a, 0x41b7aeae, + 0x757db4b4, 0xa8ce5454, 0x3b7f9393, 0x442f2222, + 0xc8636464, 0xff2af1f1, 0xe6cc7373, 0x24821212, + 0x807a4040, 0x10480808, 0x9b95c3c3, 0xc5dfecec, + 0xab4ddbdb, 0x5fc0a1a1, 0x07918d8d, 0x7ac83d3d, + 0x335b9797, 0x00000000, 0x83f9cfcf, 0x566e2b2b, + 0xece17676, 0x19e68282, 0xb128d6d6, 0x36c31b1b, + 0x7774b5b5, 0x43beafaf, 0xd41d6a6a, 0xa0ea5050, + 0x8a574545, 0xfb38f3f3, 0x60ad3030, 0xc3c4efef, + 0x7eda3f3f, 0xaac75555, 0x59dba2a2, 0xc9e9eaea, + 0xca6a6565, 0x6903baba, 0x5e4a2f2f, 0x9d8ec0c0, + 0xa160dede, 0x38fc1c1c, 0xe746fdfd, 0x9a1f4d4d, + 0x39769292, 0xeafa7575, 0x0c360606, 0x09ae8a8a, + 0x794bb2b2, 0xd185e6e6, 0x1c7e0e0e, 0x3ee71f1f, + 0xc4556262, 0xb53ad4d4, 0x4d81a8a8, 0x31529696, + 0xef62f9f9, 0x97a3c5c5, 0x4a102525, 0xb2ab5959, + 0x15d08484, 0xe4c57272, 0x72ec3939, 0x98164c4c, + 0xbc945e5e, 0xf09f7878, 0x70e53838, 0x05988c8c, + 0xbf17d1d1, 0x57e4a5a5, 0xd9a1e2e2, 0xc24e6161, + 0x7b42b3b3, 0x42342121, 0x25089c9c, 0x3cee1e1e, + 0x86614343, 0x93b1c7c7, 0xe54ffcfc, 0x08240404, + 0xa2e35151, 0x2f259999, 0xda226d6d, 0x1a650d0d, + 0xe979fafa, 0xa369dfdf, 0xfca97e7e, 0x48192424, + 0x76fe3b3b, 0x4b9aabab, 0x81f0cece, 0x22991111, + 0x03838f8f, 0x9c044e4e, 0x7366b7b7, 0xcbe0ebeb, + 0x78c13c3c, 0x1ffd8181, 0x35409494, 0xf31cf7f7, + 0x6f18b9b9, 0x268b1313, 0x58512c2c, 0xbb05d3d3, + 0xd38ce7e7, 0xdc396e6e, 0x95aac4c4, 0x061b0303, + 0xacdc5656, 0x885e4444, 0xfea07f7f, 0x4f88a9a9, + 0x54672a2a, 0x6b0abbbb, 0x9f87c1c1, 0xa6f15353, + 0xa572dcdc, 0x16530b0b, 0x27019d9d, 0xd82b6c6c, + 0x62a43131, 0xe8f37474, 0xf115f6f6, 0x8c4c4646, + 0x45a5acac, 0x0fb58989, 0x28b41414, 0xdfbae1e1, + 0x2ca61616, 0x74f73a3a, 0xd2066969, 0x12410909, + 0xe0d77070, 0x716fb6b6, 0xbd1ed0d0, 0xc7d6eded, + 0x85e2cccc, 0x84684242, 0x2d2c9898, 0x55eda4a4, + 0x50752828, 0xb8865c5c, 0xed6bf8f8, 0x11c28686, + }, + { + 0x7830d818, 0xaf462623, 0xf991b8c6, 0x6fcdfbe8, + 0xa113cb87, 0x626d11b8, 0x05020901, 0x6e9e0d4f, + 0xee6c9b36, 0x0451ffa6, 0xbdb90cd2, 0x06f70ef5, + 0x80f29679, 0xcede306f, 0xef3f6d91, 0x07a4f852, + 0xfdc04760, 0x766535bc, 0xcd2b379b, 0x8c018a8e, + 0x155bd2a3, 0x3c186c0c, 0x8af6847b, 0xe16a8035, + 0x693af51d, 0x47ddb3e0, 0xacb321d7, 0xed999cc2, + 0x965c432e, 0x7a96294b, 0x21e15dfe, 0x16aed557, + 0x412abd15, 0xb6eee877, 0xeb6e9237, 0x56d79ee5, + 0xd923139f, 0x17fd23f0, 0x7f94204a, 0x95a944da, + 0x25b0a258, 0xca8fcfc9, 0x8d527c29, 0x22145a0a, + 0x4f7f50b1, 0x1a5dc9a0, 0xdad6146b, 0xab17d985, + 0x73673cbd, 0x34ba8f5d, 0x50209010, 0x03f507f4, + 0xc08bddcb, 0xc67cd33e, 0x110a2d05, 0xe6ce7867, + 0x53d597e4, 0xbb4e0227, 0x58827341, 0x9d0ba78b, + 0x0153f6a7, 0x94fab27d, 0xfb374995, 0x9fad56d8, + 0x30eb70fb, 0x71c1cdee, 0x91f8bb7c, 0xe3cc7166, + 0x8ea77bdd, 0x4b2eaf17, 0x468e4547, 0xdc211a9e, + 0xc589d4ca, 0x995a582d, 0x79632ebf, 0x1b0e3f07, + 0x2347acad, 0x2fb4b05a, 0xb51bef83, 0xff66b633, + 0xf2c65c63, 0x0a041202, 0x384993aa, 0xa8e2de71, + 0xcf8dc6c8, 0x7d32d119, 0x70923b49, 0x9aaf5fd9, + 0x1df931f2, 0x48dba8e3, 0x2ab6b95b, 0x920dbc88, + 0xc8293e9a, 0xbe4c0b26, 0xfa64bf32, 0x4a7d59b0, + 0x6acff2e9, 0x331e770f, 0xa6b733d5, 0xba1df480, + 0x7c6127be, 0xde87ebcd, 0xe4688934, 0x75903248, + 0x24e354ff, 0x8ff48d7a, 0xea3d6490, 0x3ebe9d5f, + 0xa0403d20, 0xd5d00f68, 0x7234ca1a, 0x2c41b7ae, + 0x5e757db4, 0x19a8ce54, 0xe53b7f93, 0xaa442f22, + 0xe9c86364, 0x12ff2af1, 0xa2e6cc73, 0x5a248212, + 0x5d807a40, 0x28104808, 0xe89b95c3, 0x7bc5dfec, + 0x90ab4ddb, 0x1f5fc0a1, 0x8307918d, 0xc97ac83d, + 0xf1335b97, 0x00000000, 0xd483f9cf, 0x87566e2b, + 0xb3ece176, 0xb019e682, 0xa9b128d6, 0x7736c31b, + 0x5b7774b5, 0x2943beaf, 0xdfd41d6a, 0x0da0ea50, + 0x4c8a5745, 0x18fb38f3, 0xf060ad30, 0x74c3c4ef, + 0xc37eda3f, 0x1caac755, 0x1059dba2, 0x65c9e9ea, + 0xecca6a65, 0x686903ba, 0x935e4a2f, 0xe79d8ec0, + 0x81a160de, 0x6c38fc1c, 0x2ee746fd, 0x649a1f4d, + 0xe0397692, 0xbceafa75, 0x1e0c3606, 0x9809ae8a, + 0x40794bb2, 0x59d185e6, 0x361c7e0e, 0x633ee71f, + 0xf7c45562, 0xa3b53ad4, 0x324d81a8, 0xf4315296, + 0x3aef62f9, 0xf697a3c5, 0xb14a1025, 0x20b2ab59, + 0xae15d084, 0xa7e4c572, 0xdd72ec39, 0x6198164c, + 0x3bbc945e, 0x85f09f78, 0xd870e538, 0x8605988c, + 0xb2bf17d1, 0x0b57e4a5, 0x4dd9a1e2, 0xf8c24e61, + 0x457b42b3, 0xa5423421, 0xd625089c, 0x663cee1e, + 0x52866143, 0xfc93b1c7, 0x2be54ffc, 0x14082404, + 0x08a2e351, 0xc72f2599, 0xc4da226d, 0x391a650d, + 0x35e979fa, 0x84a369df, 0x9bfca97e, 0xb4481924, + 0xd776fe3b, 0x3d4b9aab, 0xd181f0ce, 0x55229911, + 0x8903838f, 0x6b9c044e, 0x517366b7, 0x60cbe0eb, + 0xcc78c13c, 0xbf1ffd81, 0xfe354094, 0x0cf31cf7, + 0x676f18b9, 0x5f268b13, 0x9c58512c, 0xb8bb05d3, + 0x5cd38ce7, 0xcbdc396e, 0xf395aac4, 0x0f061b03, + 0x13acdc56, 0x49885e44, 0x9efea07f, 0x374f88a9, + 0x8254672a, 0x6d6b0abb, 0xe29f87c1, 0x02a6f153, + 0x8ba572dc, 0x2716530b, 0xd327019d, 0xc1d82b6c, + 0xf562a431, 0xb9e8f374, 0x09f115f6, 0x438c4c46, + 0x2645a5ac, 0x970fb589, 0x4428b414, 0x42dfbae1, + 0x4e2ca616, 0xd274f73a, 0xd0d20669, 0x2d124109, + 0xade0d770, 0x54716fb6, 0xb7bd1ed0, 0x7ec7d6ed, + 0xdb85e2cc, 0x57846842, 0xc22d2c98, 0x0e55eda4, + 0x88507528, 0x31b8865c, 0x3fed6bf8, 0xa411c286, + }, +}; + +#ifdef VECT_SIZE1 +#define BOX(S,n,i) (u32) ((S)[(n)][(i)]) +#endif + +__device__ __constant__ u32 rch[R + 1] = +{ + 0x00000000, + 0x1823c6e8, + 0x36a6d2f5, + 0x60bc9b8e, + 0x1de0d7c2, + 0x157737e5, + 0x58c9290a, + 0xbd5d10f4, + 0xe427418b, + 0xfbee7c66, + 0xca2dbf07, +}; + +__device__ __constant__ u32 rcl[R + 1] = +{ + 0x00000000, + 0x87b8014f, + 0x796f9152, + 0xa30c7b35, + 0x2e4bfe57, + 0x9ff04ada, + 0xb1a06b85, + 0xcb3e0567, + 0xa77d95d8, + 0xdd17479e, + 0xad5a8333, +}; + +typedef unsigned char uchar; + +__device__ static void whirlpool_transform (const u32 w[16], u32 dgst[16], u32 s_Ch[8][256], u32 s_Cl[8][256]) +{ + u32 Kh[8]; + u32 Kl[8]; + + Kh[0] = dgst[ 0]; + Kl[0] = dgst[ 1]; + Kh[1] = dgst[ 2]; + Kl[1] = dgst[ 3]; + Kh[2] = dgst[ 4]; + Kl[2] = dgst[ 5]; + Kh[3] = dgst[ 6]; + Kl[3] = dgst[ 7]; + Kh[4] = dgst[ 8]; + Kl[4] = dgst[ 9]; + Kh[5] = dgst[10]; + Kl[5] = dgst[11]; + Kh[6] = dgst[12]; + Kl[6] = dgst[13]; + Kh[7] = dgst[14]; + Kl[7] = dgst[15]; + + u32 stateh[8]; + u32 statel[8]; + + stateh[0] = w[ 0] ^ Kh[0]; + statel[0] = w[ 1] ^ Kl[0]; + stateh[1] = w[ 2] ^ Kh[1]; + statel[1] = w[ 3] ^ Kl[1]; + stateh[2] = w[ 4] ^ Kh[2]; + statel[2] = w[ 5] ^ Kl[2]; + stateh[3] = w[ 6] ^ Kh[3]; + statel[3] = w[ 7] ^ Kl[3]; + stateh[4] = w[ 8] ^ Kh[4]; + statel[4] = w[ 9] ^ Kl[4]; + stateh[5] = w[10] ^ Kh[5]; + statel[5] = w[11] ^ Kl[5]; + stateh[6] = w[12] ^ Kh[6]; + statel[6] = w[13] ^ Kl[6]; + stateh[7] = w[14] ^ Kh[7]; + statel[7] = w[15] ^ Kl[7]; + + u32 r; + + for (r = 1; r <= R; r++) + { + u32 Lh[8]; + u32 Ll[8]; + + u32 i; + + #pragma unroll 8 + for (i = 0; i < 8; i++) + { + const u8 Lp0 = Kh[(i + 8) & 7] >> 24; + const u8 Lp1 = Kh[(i + 7) & 7] >> 16; + const u8 Lp2 = Kh[(i + 6) & 7] >> 8; + const u8 Lp3 = Kh[(i + 5) & 7] >> 0; + const u8 Lp4 = Kl[(i + 4) & 7] >> 24; + const u8 Lp5 = Kl[(i + 3) & 7] >> 16; + const u8 Lp6 = Kl[(i + 2) & 7] >> 8; + const u8 Lp7 = Kl[(i + 1) & 7] >> 0; + + Lh[i] = BOX (s_Ch, 0, Lp0 & 0xff) + ^ BOX (s_Ch, 1, Lp1 & 0xff) + ^ BOX (s_Ch, 2, Lp2 & 0xff) + ^ BOX (s_Ch, 3, Lp3 & 0xff) + ^ BOX (s_Ch, 4, Lp4 & 0xff) + ^ BOX (s_Ch, 5, Lp5 & 0xff) + ^ BOX (s_Ch, 6, Lp6 & 0xff) + ^ BOX (s_Ch, 7, Lp7 & 0xff); + + Ll[i] = BOX (s_Cl, 0, Lp0 & 0xff) + ^ BOX (s_Cl, 1, Lp1 & 0xff) + ^ BOX (s_Cl, 2, Lp2 & 0xff) + ^ BOX (s_Cl, 3, Lp3 & 0xff) + ^ BOX (s_Cl, 4, Lp4 & 0xff) + ^ BOX (s_Cl, 5, Lp5 & 0xff) + ^ BOX (s_Cl, 6, Lp6 & 0xff) + ^ BOX (s_Cl, 7, Lp7 & 0xff); + } + + Kh[0] = Lh[0] ^ rch[r]; + Kl[0] = Ll[0] ^ rcl[r]; + Kh[1] = Lh[1]; + Kl[1] = Ll[1]; + Kh[2] = Lh[2]; + Kl[2] = Ll[2]; + Kh[3] = Lh[3]; + Kl[3] = Ll[3]; + Kh[4] = Lh[4]; + Kl[4] = Ll[4]; + Kh[5] = Lh[5]; + Kl[5] = Ll[5]; + Kh[6] = Lh[6]; + Kl[6] = Ll[6]; + Kh[7] = Lh[7]; + Kl[7] = Ll[7]; + + #pragma unroll 8 + for (i = 0; i < 8; i++) + { + const u8 Lp0 = stateh[(i + 8) & 7] >> 24; + const u8 Lp1 = stateh[(i + 7) & 7] >> 16; + const u8 Lp2 = stateh[(i + 6) & 7] >> 8; + const u8 Lp3 = stateh[(i + 5) & 7] >> 0; + const u8 Lp4 = statel[(i + 4) & 7] >> 24; + const u8 Lp5 = statel[(i + 3) & 7] >> 16; + const u8 Lp6 = statel[(i + 2) & 7] >> 8; + const u8 Lp7 = statel[(i + 1) & 7] >> 0; + + Lh[i] = BOX (s_Ch, 0, Lp0 & 0xff) + ^ BOX (s_Ch, 1, Lp1 & 0xff) + ^ BOX (s_Ch, 2, Lp2 & 0xff) + ^ BOX (s_Ch, 3, Lp3 & 0xff) + ^ BOX (s_Ch, 4, Lp4 & 0xff) + ^ BOX (s_Ch, 5, Lp5 & 0xff) + ^ BOX (s_Ch, 6, Lp6 & 0xff) + ^ BOX (s_Ch, 7, Lp7 & 0xff); + + Ll[i] = BOX (s_Cl, 0, Lp0 & 0xff) + ^ BOX (s_Cl, 1, Lp1 & 0xff) + ^ BOX (s_Cl, 2, Lp2 & 0xff) + ^ BOX (s_Cl, 3, Lp3 & 0xff) + ^ BOX (s_Cl, 4, Lp4 & 0xff) + ^ BOX (s_Cl, 5, Lp5 & 0xff) + ^ BOX (s_Cl, 6, Lp6 & 0xff) + ^ BOX (s_Cl, 7, Lp7 & 0xff); + } + + stateh[0] = Lh[0] ^ Kh[0]; + statel[0] = Ll[0] ^ Kl[0]; + stateh[1] = Lh[1] ^ Kh[1]; + statel[1] = Ll[1] ^ Kl[1]; + stateh[2] = Lh[2] ^ Kh[2]; + statel[2] = Ll[2] ^ Kl[2]; + stateh[3] = Lh[3] ^ Kh[3]; + statel[3] = Ll[3] ^ Kl[3]; + stateh[4] = Lh[4] ^ Kh[4]; + statel[4] = Ll[4] ^ Kl[4]; + stateh[5] = Lh[5] ^ Kh[5]; + statel[5] = Ll[5] ^ Kl[5]; + stateh[6] = Lh[6] ^ Kh[6]; + statel[6] = Ll[6] ^ Kl[6]; + stateh[7] = Lh[7] ^ Kh[7]; + statel[7] = Ll[7] ^ Kl[7]; + } + + dgst[ 0] ^= stateh[0] ^ w[ 0]; + dgst[ 1] ^= statel[0] ^ w[ 1]; + dgst[ 2] ^= stateh[1] ^ w[ 2]; + dgst[ 3] ^= statel[1] ^ w[ 3]; + dgst[ 4] ^= stateh[2] ^ w[ 4]; + dgst[ 5] ^= statel[2] ^ w[ 5]; + dgst[ 6] ^= stateh[3] ^ w[ 6]; + dgst[ 7] ^= statel[3] ^ w[ 7]; + dgst[ 8] ^= stateh[4] ^ w[ 8]; + dgst[ 9] ^= statel[4] ^ w[ 9]; + dgst[10] ^= stateh[5] ^ w[10]; + dgst[11] ^= statel[5] ^ w[11]; + dgst[12] ^= stateh[6] ^ w[12]; + dgst[13] ^= statel[6] ^ w[13]; + dgst[14] ^= stateh[7] ^ w[14]; + dgst[15] ^= statel[7] ^ w[15]; +} + +__device__ static void hmac_run2 (const u32 w1[16], const u32 w2[16], const u32 ipad[16], const u32 opad[16], u32 dgst[16], u32 s_Ch[8][256], u32 s_Cl[8][256]) +{ + dgst[ 0] = ipad[ 0]; + dgst[ 1] = ipad[ 1]; + dgst[ 2] = ipad[ 2]; + dgst[ 3] = ipad[ 3]; + dgst[ 4] = ipad[ 4]; + dgst[ 5] = ipad[ 5]; + dgst[ 6] = ipad[ 6]; + dgst[ 7] = ipad[ 7]; + dgst[ 8] = ipad[ 8]; + dgst[ 9] = ipad[ 9]; + dgst[10] = ipad[10]; + dgst[11] = ipad[11]; + dgst[12] = ipad[12]; + dgst[13] = ipad[13]; + dgst[14] = ipad[14]; + dgst[15] = ipad[15]; + + whirlpool_transform (w1, dgst, s_Ch, s_Cl); + whirlpool_transform (w2, dgst, s_Ch, s_Cl); + + u32 w[16]; + + w[ 0] = dgst[ 0]; + w[ 1] = dgst[ 1]; + w[ 2] = dgst[ 2]; + w[ 3] = dgst[ 3]; + w[ 4] = dgst[ 4]; + w[ 5] = dgst[ 5]; + w[ 6] = dgst[ 6]; + w[ 7] = dgst[ 7]; + w[ 8] = dgst[ 8]; + w[ 9] = dgst[ 9]; + w[10] = dgst[10]; + w[11] = dgst[11]; + w[12] = dgst[12]; + w[13] = dgst[13]; + w[14] = dgst[14]; + w[15] = dgst[15]; + + dgst[ 0] = opad[ 0]; + dgst[ 1] = opad[ 1]; + dgst[ 2] = opad[ 2]; + dgst[ 3] = opad[ 3]; + dgst[ 4] = opad[ 4]; + dgst[ 5] = opad[ 5]; + dgst[ 6] = opad[ 6]; + dgst[ 7] = opad[ 7]; + dgst[ 8] = opad[ 8]; + dgst[ 9] = opad[ 9]; + dgst[10] = opad[10]; + dgst[11] = opad[11]; + dgst[12] = opad[12]; + dgst[13] = opad[13]; + dgst[14] = opad[14]; + dgst[15] = opad[15]; + + whirlpool_transform (w, dgst, s_Ch, s_Cl); + + w[ 0] = 0x80000000; + w[ 1] = 0; + w[ 2] = 0; + w[ 3] = 0; + w[ 4] = 0; + w[ 5] = 0; + w[ 6] = 0; + w[ 7] = 0; + w[ 8] = 0; + w[ 9] = 0; + w[10] = 0; + w[11] = 0; + w[12] = 0; + w[13] = 0; + w[14] = 0; + w[15] = (64 + 64) * 8; + + whirlpool_transform (w, dgst, s_Ch, s_Cl); +} + +__device__ static void hmac_init (u32 w[16], u32 ipad[16], u32 opad[16], u32 s_Ch[8][256], u32 s_Cl[8][256]) +{ + w[ 0] ^= 0x36363636; + w[ 1] ^= 0x36363636; + w[ 2] ^= 0x36363636; + w[ 3] ^= 0x36363636; + w[ 4] ^= 0x36363636; + w[ 5] ^= 0x36363636; + w[ 6] ^= 0x36363636; + w[ 7] ^= 0x36363636; + w[ 8] ^= 0x36363636; + w[ 9] ^= 0x36363636; + w[10] ^= 0x36363636; + w[11] ^= 0x36363636; + w[12] ^= 0x36363636; + w[13] ^= 0x36363636; + w[14] ^= 0x36363636; + w[15] ^= 0x36363636; + + ipad[ 0] = 0; + ipad[ 1] = 0; + ipad[ 2] = 0; + ipad[ 3] = 0; + ipad[ 4] = 0; + ipad[ 5] = 0; + ipad[ 6] = 0; + ipad[ 7] = 0; + ipad[ 8] = 0; + ipad[ 9] = 0; + ipad[10] = 0; + ipad[11] = 0; + ipad[12] = 0; + ipad[13] = 0; + ipad[14] = 0; + ipad[15] = 0; + + whirlpool_transform (w, ipad, s_Ch, s_Cl); + + w[ 0] ^= 0x6a6a6a6a; + w[ 1] ^= 0x6a6a6a6a; + w[ 2] ^= 0x6a6a6a6a; + w[ 3] ^= 0x6a6a6a6a; + w[ 4] ^= 0x6a6a6a6a; + w[ 5] ^= 0x6a6a6a6a; + w[ 6] ^= 0x6a6a6a6a; + w[ 7] ^= 0x6a6a6a6a; + w[ 8] ^= 0x6a6a6a6a; + w[ 9] ^= 0x6a6a6a6a; + w[10] ^= 0x6a6a6a6a; + w[11] ^= 0x6a6a6a6a; + w[12] ^= 0x6a6a6a6a; + w[13] ^= 0x6a6a6a6a; + w[14] ^= 0x6a6a6a6a; + w[15] ^= 0x6a6a6a6a; + + opad[ 0] = 0; + opad[ 1] = 0; + opad[ 2] = 0; + opad[ 3] = 0; + opad[ 4] = 0; + opad[ 5] = 0; + opad[ 6] = 0; + opad[ 7] = 0; + opad[ 8] = 0; + opad[ 9] = 0; + opad[10] = 0; + opad[11] = 0; + opad[12] = 0; + opad[13] = 0; + opad[14] = 0; + opad[15] = 0; + + whirlpool_transform (w, opad, s_Ch, s_Cl); +} + +__device__ static u32 u8add (const u32 a, const u32 b) +{ + const u32 a1 = (a >> 0) & 0xff; + const u32 a2 = (a >> 8) & 0xff; + const u32 a3 = (a >> 16) & 0xff; + const u32 a4 = (a >> 24) & 0xff; + + const u32 b1 = (b >> 0) & 0xff; + const u32 b2 = (b >> 8) & 0xff; + const u32 b3 = (b >> 16) & 0xff; + const u32 b4 = (b >> 24) & 0xff; + + const u32 r1 = (a1 + b1) & 0xff; + const u32 r2 = (a2 + b2) & 0xff; + const u32 r3 = (a3 + b3) & 0xff; + const u32 r4 = (a4 + b4) & 0xff; + + const u32 r = r1 << 0 + | r2 << 8 + | r3 << 16 + | r4 << 24; + + return r; +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m06232_init (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, tc_tmp_t *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const tc_t *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = pws[gid].i[ 8]; + w2[1] = pws[gid].i[ 9]; + w2[2] = pws[gid].i[10]; + w2[3] = pws[gid].i[11]; + + u32x w3[4]; + + w3[0] = pws[gid].i[12]; + w3[1] = pws[gid].i[13]; + w3[2] = pws[gid].i[14]; + w3[3] = pws[gid].i[15]; + + /** + * keyfile + */ + + w0[0] = u8add (w0[0], esalt_bufs[salt_pos].keyfile_buf[ 0]); + w0[1] = u8add (w0[1], esalt_bufs[salt_pos].keyfile_buf[ 1]); + w0[2] = u8add (w0[2], esalt_bufs[salt_pos].keyfile_buf[ 2]); + w0[3] = u8add (w0[3], esalt_bufs[salt_pos].keyfile_buf[ 3]); + w1[0] = u8add (w1[0], esalt_bufs[salt_pos].keyfile_buf[ 4]); + w1[1] = u8add (w1[1], esalt_bufs[salt_pos].keyfile_buf[ 5]); + w1[2] = u8add (w1[2], esalt_bufs[salt_pos].keyfile_buf[ 6]); + w1[3] = u8add (w1[3], esalt_bufs[salt_pos].keyfile_buf[ 7]); + w2[0] = u8add (w2[0], esalt_bufs[salt_pos].keyfile_buf[ 8]); + w2[1] = u8add (w2[1], esalt_bufs[salt_pos].keyfile_buf[ 9]); + w2[2] = u8add (w2[2], esalt_bufs[salt_pos].keyfile_buf[10]); + w2[3] = u8add (w2[3], esalt_bufs[salt_pos].keyfile_buf[11]); + w3[0] = u8add (w3[0], esalt_bufs[salt_pos].keyfile_buf[12]); + w3[1] = u8add (w3[1], esalt_bufs[salt_pos].keyfile_buf[13]); + w3[2] = u8add (w3[2], esalt_bufs[salt_pos].keyfile_buf[14]); + w3[3] = u8add (w3[3], esalt_bufs[salt_pos].keyfile_buf[15]); + + /** + * shared mem + */ + + __shared__ u32 s_Ch[8][256]; + __shared__ u32 s_Cl[8][256]; + + const u32 lid = threadIdx.x; + + #pragma unroll 8 + for (u32 i = 0; i < 8; i++) + { + s_Ch[i][lid] = Ch[i][lid]; + s_Cl[i][lid] = Cl[i][lid]; + } + + __syncthreads (); + + if (gid >= gid_max) return; + + /** + * salt + */ + + u32 salt_buf1[16]; + + salt_buf1[ 0] = swap_workaround (esalt_bufs[salt_pos].salt_buf[ 0]); + salt_buf1[ 1] = swap_workaround (esalt_bufs[salt_pos].salt_buf[ 1]); + salt_buf1[ 2] = swap_workaround (esalt_bufs[salt_pos].salt_buf[ 2]); + salt_buf1[ 3] = swap_workaround (esalt_bufs[salt_pos].salt_buf[ 3]); + salt_buf1[ 4] = swap_workaround (esalt_bufs[salt_pos].salt_buf[ 4]); + salt_buf1[ 5] = swap_workaround (esalt_bufs[salt_pos].salt_buf[ 5]); + salt_buf1[ 6] = swap_workaround (esalt_bufs[salt_pos].salt_buf[ 6]); + salt_buf1[ 7] = swap_workaround (esalt_bufs[salt_pos].salt_buf[ 7]); + salt_buf1[ 8] = swap_workaround (esalt_bufs[salt_pos].salt_buf[ 8]); + salt_buf1[ 9] = swap_workaround (esalt_bufs[salt_pos].salt_buf[ 9]); + salt_buf1[10] = swap_workaround (esalt_bufs[salt_pos].salt_buf[10]); + salt_buf1[11] = swap_workaround (esalt_bufs[salt_pos].salt_buf[11]); + salt_buf1[12] = swap_workaround (esalt_bufs[salt_pos].salt_buf[12]); + salt_buf1[13] = swap_workaround (esalt_bufs[salt_pos].salt_buf[13]); + salt_buf1[14] = swap_workaround (esalt_bufs[salt_pos].salt_buf[14]); + salt_buf1[15] = swap_workaround (esalt_bufs[salt_pos].salt_buf[15]); + + u32 salt_buf2[16]; + + salt_buf2[ 0] = 0; + salt_buf2[ 1] = 0x80000000; + salt_buf2[ 2] = 0; + salt_buf2[ 3] = 0; + salt_buf2[ 4] = 0; + salt_buf2[ 5] = 0; + salt_buf2[ 6] = 0; + salt_buf2[ 7] = 0; + salt_buf2[ 8] = 0; + salt_buf2[ 9] = 0; + salt_buf2[10] = 0; + salt_buf2[11] = 0; + salt_buf2[12] = 0; + salt_buf2[13] = 0; + salt_buf2[14] = 0; + salt_buf2[15] = (64 + 64 + 4) * 8; + + const u32 truecrypt_mdlen = salt_bufs[0].truecrypt_mdlen; + + u32 w[16]; + + w[ 0] = swap_workaround (w0[0]); + w[ 1] = swap_workaround (w0[1]); + w[ 2] = swap_workaround (w0[2]); + w[ 3] = swap_workaround (w0[3]); + w[ 4] = swap_workaround (w1[0]); + w[ 5] = swap_workaround (w1[1]); + w[ 6] = swap_workaround (w1[2]); + w[ 7] = swap_workaround (w1[3]); + w[ 8] = swap_workaround (w2[0]); + w[ 9] = swap_workaround (w2[1]); + w[10] = swap_workaround (w2[2]); + w[11] = swap_workaround (w2[3]); + w[12] = swap_workaround (w3[0]); + w[13] = swap_workaround (w3[1]); + w[14] = swap_workaround (w3[2]); + w[15] = swap_workaround (w3[3]); + + u32 ipad[16]; + u32 opad[16]; + + hmac_init (w, ipad, opad, s_Ch, s_Cl); + + tmps[gid].ipad[ 0] = ipad[ 0]; + tmps[gid].ipad[ 1] = ipad[ 1]; + tmps[gid].ipad[ 2] = ipad[ 2]; + tmps[gid].ipad[ 3] = ipad[ 3]; + tmps[gid].ipad[ 4] = ipad[ 4]; + tmps[gid].ipad[ 5] = ipad[ 5]; + tmps[gid].ipad[ 6] = ipad[ 6]; + tmps[gid].ipad[ 7] = ipad[ 7]; + tmps[gid].ipad[ 8] = ipad[ 8]; + tmps[gid].ipad[ 9] = ipad[ 9]; + tmps[gid].ipad[10] = ipad[10]; + tmps[gid].ipad[11] = ipad[11]; + tmps[gid].ipad[12] = ipad[12]; + tmps[gid].ipad[13] = ipad[13]; + tmps[gid].ipad[14] = ipad[14]; + tmps[gid].ipad[15] = ipad[15]; + + tmps[gid].opad[ 0] = opad[ 0]; + tmps[gid].opad[ 1] = opad[ 1]; + tmps[gid].opad[ 2] = opad[ 2]; + tmps[gid].opad[ 3] = opad[ 3]; + tmps[gid].opad[ 4] = opad[ 4]; + tmps[gid].opad[ 5] = opad[ 5]; + tmps[gid].opad[ 6] = opad[ 6]; + tmps[gid].opad[ 7] = opad[ 7]; + tmps[gid].opad[ 8] = opad[ 8]; + tmps[gid].opad[ 9] = opad[ 9]; + tmps[gid].opad[10] = opad[10]; + tmps[gid].opad[11] = opad[11]; + tmps[gid].opad[12] = opad[12]; + tmps[gid].opad[13] = opad[13]; + tmps[gid].opad[14] = opad[14]; + tmps[gid].opad[15] = opad[15]; + + for (u32 i = 0, j = 1; i < (truecrypt_mdlen / 8 / 4); i += 16, j += 1) + { + salt_buf2[0] = j; + + u32 dgst[16]; + + hmac_run2 (salt_buf1, salt_buf2, ipad, opad, dgst, s_Ch, s_Cl); + + tmps[gid].dgst[i + 0] = dgst[ 0]; + tmps[gid].dgst[i + 1] = dgst[ 1]; + tmps[gid].dgst[i + 2] = dgst[ 2]; + tmps[gid].dgst[i + 3] = dgst[ 3]; + tmps[gid].dgst[i + 4] = dgst[ 4]; + tmps[gid].dgst[i + 5] = dgst[ 5]; + tmps[gid].dgst[i + 6] = dgst[ 6]; + tmps[gid].dgst[i + 7] = dgst[ 7]; + tmps[gid].dgst[i + 8] = dgst[ 8]; + tmps[gid].dgst[i + 9] = dgst[ 9]; + tmps[gid].dgst[i + 10] = dgst[10]; + tmps[gid].dgst[i + 11] = dgst[11]; + tmps[gid].dgst[i + 12] = dgst[12]; + tmps[gid].dgst[i + 13] = dgst[13]; + tmps[gid].dgst[i + 14] = dgst[14]; + tmps[gid].dgst[i + 15] = dgst[15]; + + tmps[gid].out[i + 0] = dgst[ 0]; + tmps[gid].out[i + 1] = dgst[ 1]; + tmps[gid].out[i + 2] = dgst[ 2]; + tmps[gid].out[i + 3] = dgst[ 3]; + tmps[gid].out[i + 4] = dgst[ 4]; + tmps[gid].out[i + 5] = dgst[ 5]; + tmps[gid].out[i + 6] = dgst[ 6]; + tmps[gid].out[i + 7] = dgst[ 7]; + tmps[gid].out[i + 8] = dgst[ 8]; + tmps[gid].out[i + 9] = dgst[ 9]; + tmps[gid].out[i + 10] = dgst[10]; + tmps[gid].out[i + 11] = dgst[11]; + tmps[gid].out[i + 12] = dgst[12]; + tmps[gid].out[i + 13] = dgst[13]; + tmps[gid].out[i + 14] = dgst[14]; + tmps[gid].out[i + 15] = dgst[15]; + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m06232_loop (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, tc_tmp_t *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const tc_t *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + const u32 truecrypt_mdlen = salt_bufs[0].truecrypt_mdlen; + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + __shared__ u32 s_Ch[8][256]; + __shared__ u32 s_Cl[8][256]; + + const u32 lid = threadIdx.x; + + #pragma unroll 8 + for (u32 i = 0; i < 8; i++) + { + s_Ch[i][lid] = Ch[i][lid]; + s_Cl[i][lid] = Cl[i][lid]; + } + + __syncthreads (); + + if (gid >= gid_max) return; + + u32 ipad[16]; + + ipad[ 0] = tmps[gid].ipad[ 0]; + ipad[ 1] = tmps[gid].ipad[ 1], + ipad[ 2] = tmps[gid].ipad[ 2]; + ipad[ 3] = tmps[gid].ipad[ 3]; + ipad[ 4] = tmps[gid].ipad[ 4]; + ipad[ 5] = tmps[gid].ipad[ 5]; + ipad[ 6] = tmps[gid].ipad[ 6], + ipad[ 7] = tmps[gid].ipad[ 7]; + ipad[ 8] = tmps[gid].ipad[ 8]; + ipad[ 9] = tmps[gid].ipad[ 9]; + ipad[10] = tmps[gid].ipad[10]; + ipad[11] = tmps[gid].ipad[11], + ipad[12] = tmps[gid].ipad[12]; + ipad[13] = tmps[gid].ipad[13]; + ipad[14] = tmps[gid].ipad[14]; + ipad[15] = tmps[gid].ipad[15]; + + u32 opad[16]; + + opad[ 0] = tmps[gid].opad[ 0]; + opad[ 1] = tmps[gid].opad[ 1], + opad[ 2] = tmps[gid].opad[ 2]; + opad[ 3] = tmps[gid].opad[ 3]; + opad[ 4] = tmps[gid].opad[ 4]; + opad[ 5] = tmps[gid].opad[ 5]; + opad[ 6] = tmps[gid].opad[ 6], + opad[ 7] = tmps[gid].opad[ 7]; + opad[ 8] = tmps[gid].opad[ 8]; + opad[ 9] = tmps[gid].opad[ 9]; + opad[10] = tmps[gid].opad[10]; + opad[11] = tmps[gid].opad[11], + opad[12] = tmps[gid].opad[12]; + opad[13] = tmps[gid].opad[13]; + opad[14] = tmps[gid].opad[14]; + opad[15] = tmps[gid].opad[15]; + + for (u32 i = 0; i < (truecrypt_mdlen / 8 / 4); i += 16) + { + u32 dgst[16]; + + dgst[ 0] = tmps[gid].dgst[i + 0]; + dgst[ 1] = tmps[gid].dgst[i + 1]; + dgst[ 2] = tmps[gid].dgst[i + 2]; + dgst[ 3] = tmps[gid].dgst[i + 3]; + dgst[ 4] = tmps[gid].dgst[i + 4]; + dgst[ 5] = tmps[gid].dgst[i + 5]; + dgst[ 6] = tmps[gid].dgst[i + 6]; + dgst[ 7] = tmps[gid].dgst[i + 7]; + dgst[ 8] = tmps[gid].dgst[i + 8]; + dgst[ 9] = tmps[gid].dgst[i + 9]; + dgst[10] = tmps[gid].dgst[i + 10]; + dgst[11] = tmps[gid].dgst[i + 11]; + dgst[12] = tmps[gid].dgst[i + 12]; + dgst[13] = tmps[gid].dgst[i + 13]; + dgst[14] = tmps[gid].dgst[i + 14]; + dgst[15] = tmps[gid].dgst[i + 15]; + + u32 out[16]; + + out[ 0] = tmps[gid].out[i + 0]; + out[ 1] = tmps[gid].out[i + 1]; + out[ 2] = tmps[gid].out[i + 2]; + out[ 3] = tmps[gid].out[i + 3]; + out[ 4] = tmps[gid].out[i + 4]; + out[ 5] = tmps[gid].out[i + 5]; + out[ 6] = tmps[gid].out[i + 6]; + out[ 7] = tmps[gid].out[i + 7]; + out[ 8] = tmps[gid].out[i + 8]; + out[ 9] = tmps[gid].out[i + 9]; + out[10] = tmps[gid].out[i + 10]; + out[11] = tmps[gid].out[i + 11]; + out[12] = tmps[gid].out[i + 12]; + out[13] = tmps[gid].out[i + 13]; + out[14] = tmps[gid].out[i + 14]; + out[15] = tmps[gid].out[i + 15]; + + for (u32 j = 0; j < loop_cnt; j++) + { + u32 w1[16]; + + w1[ 0] = dgst[ 0]; + w1[ 1] = dgst[ 1]; + w1[ 2] = dgst[ 2]; + w1[ 3] = dgst[ 3]; + w1[ 4] = dgst[ 4]; + w1[ 5] = dgst[ 5]; + w1[ 6] = dgst[ 6]; + w1[ 7] = dgst[ 7]; + w1[ 8] = dgst[ 8]; + w1[ 9] = dgst[ 9]; + w1[10] = dgst[10]; + w1[11] = dgst[11]; + w1[12] = dgst[12]; + w1[13] = dgst[13]; + w1[14] = dgst[14]; + w1[15] = dgst[15]; + + u32 w2[16]; + + w2[ 0] = 0x80000000; + w2[ 1] = 0; + w2[ 2] = 0; + w2[ 3] = 0; + w2[ 4] = 0; + w2[ 5] = 0; + w2[ 6] = 0; + w2[ 7] = 0; + w2[ 8] = 0; + w2[ 9] = 0; + w2[10] = 0; + w2[11] = 0; + w2[12] = 0; + w2[13] = 0; + w2[14] = 0; + w2[15] = (64 + 64) * 8; + + hmac_run2 (w1, w2, ipad, opad, dgst, s_Ch, s_Cl); + + out[ 0] ^= dgst[ 0]; + out[ 1] ^= dgst[ 1]; + out[ 2] ^= dgst[ 2]; + out[ 3] ^= dgst[ 3]; + out[ 4] ^= dgst[ 4]; + out[ 5] ^= dgst[ 5]; + out[ 6] ^= dgst[ 6]; + out[ 7] ^= dgst[ 7]; + out[ 8] ^= dgst[ 8]; + out[ 9] ^= dgst[ 9]; + out[10] ^= dgst[10]; + out[11] ^= dgst[11]; + out[12] ^= dgst[12]; + out[13] ^= dgst[13]; + out[14] ^= dgst[14]; + out[15] ^= dgst[15]; + } + + tmps[gid].dgst[i + 0] = dgst[ 0]; + tmps[gid].dgst[i + 1] = dgst[ 1]; + tmps[gid].dgst[i + 2] = dgst[ 2]; + tmps[gid].dgst[i + 3] = dgst[ 3]; + tmps[gid].dgst[i + 4] = dgst[ 4]; + tmps[gid].dgst[i + 5] = dgst[ 5]; + tmps[gid].dgst[i + 6] = dgst[ 6]; + tmps[gid].dgst[i + 7] = dgst[ 7]; + tmps[gid].dgst[i + 8] = dgst[ 8]; + tmps[gid].dgst[i + 9] = dgst[ 9]; + tmps[gid].dgst[i + 10] = dgst[10]; + tmps[gid].dgst[i + 11] = dgst[11]; + tmps[gid].dgst[i + 12] = dgst[12]; + tmps[gid].dgst[i + 13] = dgst[13]; + tmps[gid].dgst[i + 14] = dgst[14]; + tmps[gid].dgst[i + 15] = dgst[15]; + + tmps[gid].out[i + 0] = out[ 0]; + tmps[gid].out[i + 1] = out[ 1]; + tmps[gid].out[i + 2] = out[ 2]; + tmps[gid].out[i + 3] = out[ 3]; + tmps[gid].out[i + 4] = out[ 4]; + tmps[gid].out[i + 5] = out[ 5]; + tmps[gid].out[i + 6] = out[ 6]; + tmps[gid].out[i + 7] = out[ 7]; + tmps[gid].out[i + 8] = out[ 8]; + tmps[gid].out[i + 9] = out[ 9]; + tmps[gid].out[i + 10] = out[10]; + tmps[gid].out[i + 11] = out[11]; + tmps[gid].out[i + 12] = out[12]; + tmps[gid].out[i + 13] = out[13]; + tmps[gid].out[i + 14] = out[14]; + tmps[gid].out[i + 15] = out[15]; + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m06232_comp (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, tc_tmp_t *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const tc_t *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + const u32 lid = threadIdx.x; + + if (gid >= gid_max) return; + + u32 ukey1[8]; + + ukey1[0] = swap_workaround (tmps[gid].out[ 0]); + ukey1[1] = swap_workaround (tmps[gid].out[ 1]); + ukey1[2] = swap_workaround (tmps[gid].out[ 2]); + ukey1[3] = swap_workaround (tmps[gid].out[ 3]); + ukey1[4] = swap_workaround (tmps[gid].out[ 4]); + ukey1[5] = swap_workaround (tmps[gid].out[ 5]); + ukey1[6] = swap_workaround (tmps[gid].out[ 6]); + ukey1[7] = swap_workaround (tmps[gid].out[ 7]); + + u32 ukey2[8]; + + ukey2[0] = swap_workaround (tmps[gid].out[ 8]); + ukey2[1] = swap_workaround (tmps[gid].out[ 9]); + ukey2[2] = swap_workaround (tmps[gid].out[10]); + ukey2[3] = swap_workaround (tmps[gid].out[11]); + ukey2[4] = swap_workaround (tmps[gid].out[12]); + ukey2[5] = swap_workaround (tmps[gid].out[13]); + ukey2[6] = swap_workaround (tmps[gid].out[14]); + ukey2[7] = swap_workaround (tmps[gid].out[15]); + + u32 data[4]; + + data[0] = esalt_bufs[0].data_buf[0]; + data[1] = esalt_bufs[0].data_buf[1]; + data[2] = esalt_bufs[0].data_buf[2]; + data[3] = esalt_bufs[0].data_buf[3]; + + u32 tmp[4]; + + { + tmp[0] = data[0]; + tmp[1] = data[1]; + tmp[2] = data[2]; + tmp[3] = data[3]; + + aes256_decrypt_xts (ukey1, ukey2, tmp, tmp); + + if (((tmp[0] == 0x45555254) && (tmp[3] == 0)) || ((tmp[0] == 0x45555254) && ((tmp[1] >> 16) <= 5))) + { + mark_hash_s0 (plains_buf, hashes_shown, 0, gid, 0); + + d_return_buf[lid] = 1; + } + } + + { + tmp[0] = data[0]; + tmp[1] = data[1]; + tmp[2] = data[2]; + tmp[3] = data[3]; + + serpent256_decrypt_xts (ukey1, ukey2, tmp, tmp); + + if (((tmp[0] == 0x45555254) && (tmp[3] == 0)) || ((tmp[0] == 0x45555254) && ((tmp[1] >> 16) <= 5))) + { + mark_hash_s0 (plains_buf, hashes_shown, 0, gid, 0); + + d_return_buf[lid] = 1; + } + } + + { + tmp[0] = data[0]; + tmp[1] = data[1]; + tmp[2] = data[2]; + tmp[3] = data[3]; + + twofish256_decrypt_xts (ukey1, ukey2, tmp, tmp); + + if (((tmp[0] == 0x45555254) && (tmp[3] == 0)) || ((tmp[0] == 0x45555254) && ((tmp[1] >> 16) <= 5))) + { + mark_hash_s0 (plains_buf, hashes_shown, 0, gid, 0); + + d_return_buf[lid] = 1; + } + } + + u32 ukey3[8]; + + ukey3[0] = swap_workaround (tmps[gid].out[16]); + ukey3[1] = swap_workaround (tmps[gid].out[17]); + ukey3[2] = swap_workaround (tmps[gid].out[18]); + ukey3[3] = swap_workaround (tmps[gid].out[19]); + ukey3[4] = swap_workaround (tmps[gid].out[20]); + ukey3[5] = swap_workaround (tmps[gid].out[21]); + ukey3[6] = swap_workaround (tmps[gid].out[22]); + ukey3[7] = swap_workaround (tmps[gid].out[23]); + + u32 ukey4[8]; + + ukey4[0] = swap_workaround (tmps[gid].out[24]); + ukey4[1] = swap_workaround (tmps[gid].out[25]); + ukey4[2] = swap_workaround (tmps[gid].out[26]); + ukey4[3] = swap_workaround (tmps[gid].out[27]); + ukey4[4] = swap_workaround (tmps[gid].out[28]); + ukey4[5] = swap_workaround (tmps[gid].out[29]); + ukey4[6] = swap_workaround (tmps[gid].out[30]); + ukey4[7] = swap_workaround (tmps[gid].out[31]); + + { + tmp[0] = data[0]; + tmp[1] = data[1]; + tmp[2] = data[2]; + tmp[3] = data[3]; + + aes256_decrypt_xts (ukey2, ukey4, tmp, tmp); + twofish256_decrypt_xts (ukey1, ukey3, tmp, tmp); + + if (((tmp[0] == 0x45555254) && (tmp[3] == 0)) || ((tmp[0] == 0x45555254) && ((tmp[1] >> 16) <= 5))) + { + mark_hash_s0 (plains_buf, hashes_shown, 0, gid, 0); + + d_return_buf[lid] = 1; + } + } + + { + tmp[0] = data[0]; + tmp[1] = data[1]; + tmp[2] = data[2]; + tmp[3] = data[3]; + + serpent256_decrypt_xts (ukey2, ukey4, tmp, tmp); + aes256_decrypt_xts (ukey1, ukey3, tmp, tmp); + + if (((tmp[0] == 0x45555254) && (tmp[3] == 0)) || ((tmp[0] == 0x45555254) && ((tmp[1] >> 16) <= 5))) + { + mark_hash_s0 (plains_buf, hashes_shown, 0, gid, 0); + + d_return_buf[lid] = 1; + } + } + + { + tmp[0] = data[0]; + tmp[1] = data[1]; + tmp[2] = data[2]; + tmp[3] = data[3]; + + twofish256_decrypt_xts (ukey2, ukey4, tmp, tmp); + serpent256_decrypt_xts (ukey1, ukey3, tmp, tmp); + + if (((tmp[0] == 0x45555254) && (tmp[3] == 0)) || ((tmp[0] == 0x45555254) && ((tmp[1] >> 16) <= 5))) + { + mark_hash_s0 (plains_buf, hashes_shown, 0, gid, 0); + + d_return_buf[lid] = 1; + } + } +} diff --git a/nv/m06233.cu b/nv/m06233.cu new file mode 100644 index 0000000000..9fb3349adf --- /dev/null +++ b/nv/m06233.cu @@ -0,0 +1,2121 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _WHIRLPOOL_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW2 +#define VECT_SIZE1 +#endif + +#define DGST_R0 0 +#define DGST_R1 1 +#define DGST_R2 2 +#define DGST_R3 3 + +#include "include/kernel_functions.c" +#include "types_nv.c" +#include "common_nv.c" + +#include "gpu_aes256_nv.c" +#include "gpu_twofish256_nv.c" +#include "gpu_serpent256_nv.c" + +#define R 10 + +#define BOX(S,n,i) (u32) ((S)[(n)][(i)]) + +__device__ __constant__ u32 Ch[8][256] = +{ + { + 0x18186018, 0x23238c23, 0xc6c63fc6, 0xe8e887e8, + 0x87872687, 0xb8b8dab8, 0x01010401, 0x4f4f214f, + 0x3636d836, 0xa6a6a2a6, 0xd2d26fd2, 0xf5f5f3f5, + 0x7979f979, 0x6f6fa16f, 0x91917e91, 0x52525552, + 0x60609d60, 0xbcbccabc, 0x9b9b569b, 0x8e8e028e, + 0xa3a3b6a3, 0x0c0c300c, 0x7b7bf17b, 0x3535d435, + 0x1d1d741d, 0xe0e0a7e0, 0xd7d77bd7, 0xc2c22fc2, + 0x2e2eb82e, 0x4b4b314b, 0xfefedffe, 0x57574157, + 0x15155415, 0x7777c177, 0x3737dc37, 0xe5e5b3e5, + 0x9f9f469f, 0xf0f0e7f0, 0x4a4a354a, 0xdada4fda, + 0x58587d58, 0xc9c903c9, 0x2929a429, 0x0a0a280a, + 0xb1b1feb1, 0xa0a0baa0, 0x6b6bb16b, 0x85852e85, + 0xbdbdcebd, 0x5d5d695d, 0x10104010, 0xf4f4f7f4, + 0xcbcb0bcb, 0x3e3ef83e, 0x05051405, 0x67678167, + 0xe4e4b7e4, 0x27279c27, 0x41411941, 0x8b8b168b, + 0xa7a7a6a7, 0x7d7de97d, 0x95956e95, 0xd8d847d8, + 0xfbfbcbfb, 0xeeee9fee, 0x7c7ced7c, 0x66668566, + 0xdddd53dd, 0x17175c17, 0x47470147, 0x9e9e429e, + 0xcaca0fca, 0x2d2db42d, 0xbfbfc6bf, 0x07071c07, + 0xadad8ead, 0x5a5a755a, 0x83833683, 0x3333cc33, + 0x63639163, 0x02020802, 0xaaaa92aa, 0x7171d971, + 0xc8c807c8, 0x19196419, 0x49493949, 0xd9d943d9, + 0xf2f2eff2, 0xe3e3abe3, 0x5b5b715b, 0x88881a88, + 0x9a9a529a, 0x26269826, 0x3232c832, 0xb0b0fab0, + 0xe9e983e9, 0x0f0f3c0f, 0xd5d573d5, 0x80803a80, + 0xbebec2be, 0xcdcd13cd, 0x3434d034, 0x48483d48, + 0xffffdbff, 0x7a7af57a, 0x90907a90, 0x5f5f615f, + 0x20208020, 0x6868bd68, 0x1a1a681a, 0xaeae82ae, + 0xb4b4eab4, 0x54544d54, 0x93937693, 0x22228822, + 0x64648d64, 0xf1f1e3f1, 0x7373d173, 0x12124812, + 0x40401d40, 0x08082008, 0xc3c32bc3, 0xecec97ec, + 0xdbdb4bdb, 0xa1a1bea1, 0x8d8d0e8d, 0x3d3df43d, + 0x97976697, 0x00000000, 0xcfcf1bcf, 0x2b2bac2b, + 0x7676c576, 0x82823282, 0xd6d67fd6, 0x1b1b6c1b, + 0xb5b5eeb5, 0xafaf86af, 0x6a6ab56a, 0x50505d50, + 0x45450945, 0xf3f3ebf3, 0x3030c030, 0xefef9bef, + 0x3f3ffc3f, 0x55554955, 0xa2a2b2a2, 0xeaea8fea, + 0x65658965, 0xbabad2ba, 0x2f2fbc2f, 0xc0c027c0, + 0xdede5fde, 0x1c1c701c, 0xfdfdd3fd, 0x4d4d294d, + 0x92927292, 0x7575c975, 0x06061806, 0x8a8a128a, + 0xb2b2f2b2, 0xe6e6bfe6, 0x0e0e380e, 0x1f1f7c1f, + 0x62629562, 0xd4d477d4, 0xa8a89aa8, 0x96966296, + 0xf9f9c3f9, 0xc5c533c5, 0x25259425, 0x59597959, + 0x84842a84, 0x7272d572, 0x3939e439, 0x4c4c2d4c, + 0x5e5e655e, 0x7878fd78, 0x3838e038, 0x8c8c0a8c, + 0xd1d163d1, 0xa5a5aea5, 0xe2e2afe2, 0x61619961, + 0xb3b3f6b3, 0x21218421, 0x9c9c4a9c, 0x1e1e781e, + 0x43431143, 0xc7c73bc7, 0xfcfcd7fc, 0x04041004, + 0x51515951, 0x99995e99, 0x6d6da96d, 0x0d0d340d, + 0xfafacffa, 0xdfdf5bdf, 0x7e7ee57e, 0x24249024, + 0x3b3bec3b, 0xabab96ab, 0xcece1fce, 0x11114411, + 0x8f8f068f, 0x4e4e254e, 0xb7b7e6b7, 0xebeb8beb, + 0x3c3cf03c, 0x81813e81, 0x94946a94, 0xf7f7fbf7, + 0xb9b9deb9, 0x13134c13, 0x2c2cb02c, 0xd3d36bd3, + 0xe7e7bbe7, 0x6e6ea56e, 0xc4c437c4, 0x03030c03, + 0x56564556, 0x44440d44, 0x7f7fe17f, 0xa9a99ea9, + 0x2a2aa82a, 0xbbbbd6bb, 0xc1c123c1, 0x53535153, + 0xdcdc57dc, 0x0b0b2c0b, 0x9d9d4e9d, 0x6c6cad6c, + 0x3131c431, 0x7474cd74, 0xf6f6fff6, 0x46460546, + 0xacac8aac, 0x89891e89, 0x14145014, 0xe1e1a3e1, + 0x16165816, 0x3a3ae83a, 0x6969b969, 0x09092409, + 0x7070dd70, 0xb6b6e2b6, 0xd0d067d0, 0xeded93ed, + 0xcccc17cc, 0x42421542, 0x98985a98, 0xa4a4aaa4, + 0x2828a028, 0x5c5c6d5c, 0xf8f8c7f8, 0x86862286, + }, + { + 0xd8181860, 0x2623238c, 0xb8c6c63f, 0xfbe8e887, + 0xcb878726, 0x11b8b8da, 0x09010104, 0x0d4f4f21, + 0x9b3636d8, 0xffa6a6a2, 0x0cd2d26f, 0x0ef5f5f3, + 0x967979f9, 0x306f6fa1, 0x6d91917e, 0xf8525255, + 0x4760609d, 0x35bcbcca, 0x379b9b56, 0x8a8e8e02, + 0xd2a3a3b6, 0x6c0c0c30, 0x847b7bf1, 0x803535d4, + 0xf51d1d74, 0xb3e0e0a7, 0x21d7d77b, 0x9cc2c22f, + 0x432e2eb8, 0x294b4b31, 0x5dfefedf, 0xd5575741, + 0xbd151554, 0xe87777c1, 0x923737dc, 0x9ee5e5b3, + 0x139f9f46, 0x23f0f0e7, 0x204a4a35, 0x44dada4f, + 0xa258587d, 0xcfc9c903, 0x7c2929a4, 0x5a0a0a28, + 0x50b1b1fe, 0xc9a0a0ba, 0x146b6bb1, 0xd985852e, + 0x3cbdbdce, 0x8f5d5d69, 0x90101040, 0x07f4f4f7, + 0xddcbcb0b, 0xd33e3ef8, 0x2d050514, 0x78676781, + 0x97e4e4b7, 0x0227279c, 0x73414119, 0xa78b8b16, + 0xf6a7a7a6, 0xb27d7de9, 0x4995956e, 0x56d8d847, + 0x70fbfbcb, 0xcdeeee9f, 0xbb7c7ced, 0x71666685, + 0x7bdddd53, 0xaf17175c, 0x45474701, 0x1a9e9e42, + 0xd4caca0f, 0x582d2db4, 0x2ebfbfc6, 0x3f07071c, + 0xacadad8e, 0xb05a5a75, 0xef838336, 0xb63333cc, + 0x5c636391, 0x12020208, 0x93aaaa92, 0xde7171d9, + 0xc6c8c807, 0xd1191964, 0x3b494939, 0x5fd9d943, + 0x31f2f2ef, 0xa8e3e3ab, 0xb95b5b71, 0xbc88881a, + 0x3e9a9a52, 0x0b262698, 0xbf3232c8, 0x59b0b0fa, + 0xf2e9e983, 0x770f0f3c, 0x33d5d573, 0xf480803a, + 0x27bebec2, 0xebcdcd13, 0x893434d0, 0x3248483d, + 0x54ffffdb, 0x8d7a7af5, 0x6490907a, 0x9d5f5f61, + 0x3d202080, 0x0f6868bd, 0xca1a1a68, 0xb7aeae82, + 0x7db4b4ea, 0xce54544d, 0x7f939376, 0x2f222288, + 0x6364648d, 0x2af1f1e3, 0xcc7373d1, 0x82121248, + 0x7a40401d, 0x48080820, 0x95c3c32b, 0xdfecec97, + 0x4ddbdb4b, 0xc0a1a1be, 0x918d8d0e, 0xc83d3df4, + 0x5b979766, 0x00000000, 0xf9cfcf1b, 0x6e2b2bac, + 0xe17676c5, 0xe6828232, 0x28d6d67f, 0xc31b1b6c, + 0x74b5b5ee, 0xbeafaf86, 0x1d6a6ab5, 0xea50505d, + 0x57454509, 0x38f3f3eb, 0xad3030c0, 0xc4efef9b, + 0xda3f3ffc, 0xc7555549, 0xdba2a2b2, 0xe9eaea8f, + 0x6a656589, 0x03babad2, 0x4a2f2fbc, 0x8ec0c027, + 0x60dede5f, 0xfc1c1c70, 0x46fdfdd3, 0x1f4d4d29, + 0x76929272, 0xfa7575c9, 0x36060618, 0xae8a8a12, + 0x4bb2b2f2, 0x85e6e6bf, 0x7e0e0e38, 0xe71f1f7c, + 0x55626295, 0x3ad4d477, 0x81a8a89a, 0x52969662, + 0x62f9f9c3, 0xa3c5c533, 0x10252594, 0xab595979, + 0xd084842a, 0xc57272d5, 0xec3939e4, 0x164c4c2d, + 0x945e5e65, 0x9f7878fd, 0xe53838e0, 0x988c8c0a, + 0x17d1d163, 0xe4a5a5ae, 0xa1e2e2af, 0x4e616199, + 0x42b3b3f6, 0x34212184, 0x089c9c4a, 0xee1e1e78, + 0x61434311, 0xb1c7c73b, 0x4ffcfcd7, 0x24040410, + 0xe3515159, 0x2599995e, 0x226d6da9, 0x650d0d34, + 0x79fafacf, 0x69dfdf5b, 0xa97e7ee5, 0x19242490, + 0xfe3b3bec, 0x9aabab96, 0xf0cece1f, 0x99111144, + 0x838f8f06, 0x044e4e25, 0x66b7b7e6, 0xe0ebeb8b, + 0xc13c3cf0, 0xfd81813e, 0x4094946a, 0x1cf7f7fb, + 0x18b9b9de, 0x8b13134c, 0x512c2cb0, 0x05d3d36b, + 0x8ce7e7bb, 0x396e6ea5, 0xaac4c437, 0x1b03030c, + 0xdc565645, 0x5e44440d, 0xa07f7fe1, 0x88a9a99e, + 0x672a2aa8, 0x0abbbbd6, 0x87c1c123, 0xf1535351, + 0x72dcdc57, 0x530b0b2c, 0x019d9d4e, 0x2b6c6cad, + 0xa43131c4, 0xf37474cd, 0x15f6f6ff, 0x4c464605, + 0xa5acac8a, 0xb589891e, 0xb4141450, 0xbae1e1a3, + 0xa6161658, 0xf73a3ae8, 0x066969b9, 0x41090924, + 0xd77070dd, 0x6fb6b6e2, 0x1ed0d067, 0xd6eded93, + 0xe2cccc17, 0x68424215, 0x2c98985a, 0xeda4a4aa, + 0x752828a0, 0x865c5c6d, 0x6bf8f8c7, 0xc2868622, + }, + { + 0x30d81818, 0x46262323, 0x91b8c6c6, 0xcdfbe8e8, + 0x13cb8787, 0x6d11b8b8, 0x02090101, 0x9e0d4f4f, + 0x6c9b3636, 0x51ffa6a6, 0xb90cd2d2, 0xf70ef5f5, + 0xf2967979, 0xde306f6f, 0x3f6d9191, 0xa4f85252, + 0xc0476060, 0x6535bcbc, 0x2b379b9b, 0x018a8e8e, + 0x5bd2a3a3, 0x186c0c0c, 0xf6847b7b, 0x6a803535, + 0x3af51d1d, 0xddb3e0e0, 0xb321d7d7, 0x999cc2c2, + 0x5c432e2e, 0x96294b4b, 0xe15dfefe, 0xaed55757, + 0x2abd1515, 0xeee87777, 0x6e923737, 0xd79ee5e5, + 0x23139f9f, 0xfd23f0f0, 0x94204a4a, 0xa944dada, + 0xb0a25858, 0x8fcfc9c9, 0x527c2929, 0x145a0a0a, + 0x7f50b1b1, 0x5dc9a0a0, 0xd6146b6b, 0x17d98585, + 0x673cbdbd, 0xba8f5d5d, 0x20901010, 0xf507f4f4, + 0x8bddcbcb, 0x7cd33e3e, 0x0a2d0505, 0xce786767, + 0xd597e4e4, 0x4e022727, 0x82734141, 0x0ba78b8b, + 0x53f6a7a7, 0xfab27d7d, 0x37499595, 0xad56d8d8, + 0xeb70fbfb, 0xc1cdeeee, 0xf8bb7c7c, 0xcc716666, + 0xa77bdddd, 0x2eaf1717, 0x8e454747, 0x211a9e9e, + 0x89d4caca, 0x5a582d2d, 0x632ebfbf, 0x0e3f0707, + 0x47acadad, 0xb4b05a5a, 0x1bef8383, 0x66b63333, + 0xc65c6363, 0x04120202, 0x4993aaaa, 0xe2de7171, + 0x8dc6c8c8, 0x32d11919, 0x923b4949, 0xaf5fd9d9, + 0xf931f2f2, 0xdba8e3e3, 0xb6b95b5b, 0x0dbc8888, + 0x293e9a9a, 0x4c0b2626, 0x64bf3232, 0x7d59b0b0, + 0xcff2e9e9, 0x1e770f0f, 0xb733d5d5, 0x1df48080, + 0x6127bebe, 0x87ebcdcd, 0x68893434, 0x90324848, + 0xe354ffff, 0xf48d7a7a, 0x3d649090, 0xbe9d5f5f, + 0x403d2020, 0xd00f6868, 0x34ca1a1a, 0x41b7aeae, + 0x757db4b4, 0xa8ce5454, 0x3b7f9393, 0x442f2222, + 0xc8636464, 0xff2af1f1, 0xe6cc7373, 0x24821212, + 0x807a4040, 0x10480808, 0x9b95c3c3, 0xc5dfecec, + 0xab4ddbdb, 0x5fc0a1a1, 0x07918d8d, 0x7ac83d3d, + 0x335b9797, 0x00000000, 0x83f9cfcf, 0x566e2b2b, + 0xece17676, 0x19e68282, 0xb128d6d6, 0x36c31b1b, + 0x7774b5b5, 0x43beafaf, 0xd41d6a6a, 0xa0ea5050, + 0x8a574545, 0xfb38f3f3, 0x60ad3030, 0xc3c4efef, + 0x7eda3f3f, 0xaac75555, 0x59dba2a2, 0xc9e9eaea, + 0xca6a6565, 0x6903baba, 0x5e4a2f2f, 0x9d8ec0c0, + 0xa160dede, 0x38fc1c1c, 0xe746fdfd, 0x9a1f4d4d, + 0x39769292, 0xeafa7575, 0x0c360606, 0x09ae8a8a, + 0x794bb2b2, 0xd185e6e6, 0x1c7e0e0e, 0x3ee71f1f, + 0xc4556262, 0xb53ad4d4, 0x4d81a8a8, 0x31529696, + 0xef62f9f9, 0x97a3c5c5, 0x4a102525, 0xb2ab5959, + 0x15d08484, 0xe4c57272, 0x72ec3939, 0x98164c4c, + 0xbc945e5e, 0xf09f7878, 0x70e53838, 0x05988c8c, + 0xbf17d1d1, 0x57e4a5a5, 0xd9a1e2e2, 0xc24e6161, + 0x7b42b3b3, 0x42342121, 0x25089c9c, 0x3cee1e1e, + 0x86614343, 0x93b1c7c7, 0xe54ffcfc, 0x08240404, + 0xa2e35151, 0x2f259999, 0xda226d6d, 0x1a650d0d, + 0xe979fafa, 0xa369dfdf, 0xfca97e7e, 0x48192424, + 0x76fe3b3b, 0x4b9aabab, 0x81f0cece, 0x22991111, + 0x03838f8f, 0x9c044e4e, 0x7366b7b7, 0xcbe0ebeb, + 0x78c13c3c, 0x1ffd8181, 0x35409494, 0xf31cf7f7, + 0x6f18b9b9, 0x268b1313, 0x58512c2c, 0xbb05d3d3, + 0xd38ce7e7, 0xdc396e6e, 0x95aac4c4, 0x061b0303, + 0xacdc5656, 0x885e4444, 0xfea07f7f, 0x4f88a9a9, + 0x54672a2a, 0x6b0abbbb, 0x9f87c1c1, 0xa6f15353, + 0xa572dcdc, 0x16530b0b, 0x27019d9d, 0xd82b6c6c, + 0x62a43131, 0xe8f37474, 0xf115f6f6, 0x8c4c4646, + 0x45a5acac, 0x0fb58989, 0x28b41414, 0xdfbae1e1, + 0x2ca61616, 0x74f73a3a, 0xd2066969, 0x12410909, + 0xe0d77070, 0x716fb6b6, 0xbd1ed0d0, 0xc7d6eded, + 0x85e2cccc, 0x84684242, 0x2d2c9898, 0x55eda4a4, + 0x50752828, 0xb8865c5c, 0xed6bf8f8, 0x11c28686, + }, + { + 0x7830d818, 0xaf462623, 0xf991b8c6, 0x6fcdfbe8, + 0xa113cb87, 0x626d11b8, 0x05020901, 0x6e9e0d4f, + 0xee6c9b36, 0x0451ffa6, 0xbdb90cd2, 0x06f70ef5, + 0x80f29679, 0xcede306f, 0xef3f6d91, 0x07a4f852, + 0xfdc04760, 0x766535bc, 0xcd2b379b, 0x8c018a8e, + 0x155bd2a3, 0x3c186c0c, 0x8af6847b, 0xe16a8035, + 0x693af51d, 0x47ddb3e0, 0xacb321d7, 0xed999cc2, + 0x965c432e, 0x7a96294b, 0x21e15dfe, 0x16aed557, + 0x412abd15, 0xb6eee877, 0xeb6e9237, 0x56d79ee5, + 0xd923139f, 0x17fd23f0, 0x7f94204a, 0x95a944da, + 0x25b0a258, 0xca8fcfc9, 0x8d527c29, 0x22145a0a, + 0x4f7f50b1, 0x1a5dc9a0, 0xdad6146b, 0xab17d985, + 0x73673cbd, 0x34ba8f5d, 0x50209010, 0x03f507f4, + 0xc08bddcb, 0xc67cd33e, 0x110a2d05, 0xe6ce7867, + 0x53d597e4, 0xbb4e0227, 0x58827341, 0x9d0ba78b, + 0x0153f6a7, 0x94fab27d, 0xfb374995, 0x9fad56d8, + 0x30eb70fb, 0x71c1cdee, 0x91f8bb7c, 0xe3cc7166, + 0x8ea77bdd, 0x4b2eaf17, 0x468e4547, 0xdc211a9e, + 0xc589d4ca, 0x995a582d, 0x79632ebf, 0x1b0e3f07, + 0x2347acad, 0x2fb4b05a, 0xb51bef83, 0xff66b633, + 0xf2c65c63, 0x0a041202, 0x384993aa, 0xa8e2de71, + 0xcf8dc6c8, 0x7d32d119, 0x70923b49, 0x9aaf5fd9, + 0x1df931f2, 0x48dba8e3, 0x2ab6b95b, 0x920dbc88, + 0xc8293e9a, 0xbe4c0b26, 0xfa64bf32, 0x4a7d59b0, + 0x6acff2e9, 0x331e770f, 0xa6b733d5, 0xba1df480, + 0x7c6127be, 0xde87ebcd, 0xe4688934, 0x75903248, + 0x24e354ff, 0x8ff48d7a, 0xea3d6490, 0x3ebe9d5f, + 0xa0403d20, 0xd5d00f68, 0x7234ca1a, 0x2c41b7ae, + 0x5e757db4, 0x19a8ce54, 0xe53b7f93, 0xaa442f22, + 0xe9c86364, 0x12ff2af1, 0xa2e6cc73, 0x5a248212, + 0x5d807a40, 0x28104808, 0xe89b95c3, 0x7bc5dfec, + 0x90ab4ddb, 0x1f5fc0a1, 0x8307918d, 0xc97ac83d, + 0xf1335b97, 0x00000000, 0xd483f9cf, 0x87566e2b, + 0xb3ece176, 0xb019e682, 0xa9b128d6, 0x7736c31b, + 0x5b7774b5, 0x2943beaf, 0xdfd41d6a, 0x0da0ea50, + 0x4c8a5745, 0x18fb38f3, 0xf060ad30, 0x74c3c4ef, + 0xc37eda3f, 0x1caac755, 0x1059dba2, 0x65c9e9ea, + 0xecca6a65, 0x686903ba, 0x935e4a2f, 0xe79d8ec0, + 0x81a160de, 0x6c38fc1c, 0x2ee746fd, 0x649a1f4d, + 0xe0397692, 0xbceafa75, 0x1e0c3606, 0x9809ae8a, + 0x40794bb2, 0x59d185e6, 0x361c7e0e, 0x633ee71f, + 0xf7c45562, 0xa3b53ad4, 0x324d81a8, 0xf4315296, + 0x3aef62f9, 0xf697a3c5, 0xb14a1025, 0x20b2ab59, + 0xae15d084, 0xa7e4c572, 0xdd72ec39, 0x6198164c, + 0x3bbc945e, 0x85f09f78, 0xd870e538, 0x8605988c, + 0xb2bf17d1, 0x0b57e4a5, 0x4dd9a1e2, 0xf8c24e61, + 0x457b42b3, 0xa5423421, 0xd625089c, 0x663cee1e, + 0x52866143, 0xfc93b1c7, 0x2be54ffc, 0x14082404, + 0x08a2e351, 0xc72f2599, 0xc4da226d, 0x391a650d, + 0x35e979fa, 0x84a369df, 0x9bfca97e, 0xb4481924, + 0xd776fe3b, 0x3d4b9aab, 0xd181f0ce, 0x55229911, + 0x8903838f, 0x6b9c044e, 0x517366b7, 0x60cbe0eb, + 0xcc78c13c, 0xbf1ffd81, 0xfe354094, 0x0cf31cf7, + 0x676f18b9, 0x5f268b13, 0x9c58512c, 0xb8bb05d3, + 0x5cd38ce7, 0xcbdc396e, 0xf395aac4, 0x0f061b03, + 0x13acdc56, 0x49885e44, 0x9efea07f, 0x374f88a9, + 0x8254672a, 0x6d6b0abb, 0xe29f87c1, 0x02a6f153, + 0x8ba572dc, 0x2716530b, 0xd327019d, 0xc1d82b6c, + 0xf562a431, 0xb9e8f374, 0x09f115f6, 0x438c4c46, + 0x2645a5ac, 0x970fb589, 0x4428b414, 0x42dfbae1, + 0x4e2ca616, 0xd274f73a, 0xd0d20669, 0x2d124109, + 0xade0d770, 0x54716fb6, 0xb7bd1ed0, 0x7ec7d6ed, + 0xdb85e2cc, 0x57846842, 0xc22d2c98, 0x0e55eda4, + 0x88507528, 0x31b8865c, 0x3fed6bf8, 0xa411c286, + }, + { + 0xc07830d8, 0x05af4626, 0x7ef991b8, 0x136fcdfb, + 0x4ca113cb, 0xa9626d11, 0x08050209, 0x426e9e0d, + 0xadee6c9b, 0x590451ff, 0xdebdb90c, 0xfb06f70e, + 0xef80f296, 0x5fcede30, 0xfcef3f6d, 0xaa07a4f8, + 0x27fdc047, 0x89766535, 0xaccd2b37, 0x048c018a, + 0x71155bd2, 0x603c186c, 0xff8af684, 0xb5e16a80, + 0xe8693af5, 0x5347ddb3, 0xf6acb321, 0x5eed999c, + 0x6d965c43, 0x627a9629, 0xa321e15d, 0x8216aed5, + 0xa8412abd, 0x9fb6eee8, 0xa5eb6e92, 0x7b56d79e, + 0x8cd92313, 0xd317fd23, 0x6a7f9420, 0x9e95a944, + 0xfa25b0a2, 0x06ca8fcf, 0x558d527c, 0x5022145a, + 0xe14f7f50, 0x691a5dc9, 0x7fdad614, 0x5cab17d9, + 0x8173673c, 0xd234ba8f, 0x80502090, 0xf303f507, + 0x16c08bdd, 0xedc67cd3, 0x28110a2d, 0x1fe6ce78, + 0x7353d597, 0x25bb4e02, 0x32588273, 0x2c9d0ba7, + 0x510153f6, 0xcf94fab2, 0xdcfb3749, 0x8e9fad56, + 0x8b30eb70, 0x2371c1cd, 0xc791f8bb, 0x17e3cc71, + 0xa68ea77b, 0xb84b2eaf, 0x02468e45, 0x84dc211a, + 0x1ec589d4, 0x75995a58, 0x9179632e, 0x381b0e3f, + 0x012347ac, 0xea2fb4b0, 0x6cb51bef, 0x85ff66b6, + 0x3ff2c65c, 0x100a0412, 0x39384993, 0xafa8e2de, + 0x0ecf8dc6, 0xc87d32d1, 0x7270923b, 0x869aaf5f, + 0xc31df931, 0x4b48dba8, 0xe22ab6b9, 0x34920dbc, + 0xa4c8293e, 0x2dbe4c0b, 0x8dfa64bf, 0xe94a7d59, + 0x1b6acff2, 0x78331e77, 0xe6a6b733, 0x74ba1df4, + 0x997c6127, 0x26de87eb, 0xbde46889, 0x7a759032, + 0xab24e354, 0xf78ff48d, 0xf4ea3d64, 0xc23ebe9d, + 0x1da0403d, 0x67d5d00f, 0xd07234ca, 0x192c41b7, + 0xc95e757d, 0x9a19a8ce, 0xece53b7f, 0x0daa442f, + 0x07e9c863, 0xdb12ff2a, 0xbfa2e6cc, 0x905a2482, + 0x3a5d807a, 0x40281048, 0x56e89b95, 0x337bc5df, + 0x9690ab4d, 0x611f5fc0, 0x1c830791, 0xf5c97ac8, + 0xccf1335b, 0x00000000, 0x36d483f9, 0x4587566e, + 0x97b3ece1, 0x64b019e6, 0xfea9b128, 0xd87736c3, + 0xc15b7774, 0x112943be, 0x77dfd41d, 0xba0da0ea, + 0x124c8a57, 0xcb18fb38, 0x9df060ad, 0x2b74c3c4, + 0xe5c37eda, 0x921caac7, 0x791059db, 0x0365c9e9, + 0x0fecca6a, 0xb9686903, 0x65935e4a, 0x4ee79d8e, + 0xbe81a160, 0xe06c38fc, 0xbb2ee746, 0x52649a1f, + 0xe4e03976, 0x8fbceafa, 0x301e0c36, 0x249809ae, + 0xf940794b, 0x6359d185, 0x70361c7e, 0xf8633ee7, + 0x37f7c455, 0xeea3b53a, 0x29324d81, 0xc4f43152, + 0x9b3aef62, 0x66f697a3, 0x35b14a10, 0xf220b2ab, + 0x54ae15d0, 0xb7a7e4c5, 0xd5dd72ec, 0x5a619816, + 0xca3bbc94, 0xe785f09f, 0xddd870e5, 0x14860598, + 0xc6b2bf17, 0x410b57e4, 0x434dd9a1, 0x2ff8c24e, + 0xf1457b42, 0x15a54234, 0x94d62508, 0xf0663cee, + 0x22528661, 0x76fc93b1, 0xb32be54f, 0x20140824, + 0xb208a2e3, 0xbcc72f25, 0x4fc4da22, 0x68391a65, + 0x8335e979, 0xb684a369, 0xd79bfca9, 0x3db44819, + 0xc5d776fe, 0x313d4b9a, 0x3ed181f0, 0x88552299, + 0x0c890383, 0x4a6b9c04, 0xd1517366, 0x0b60cbe0, + 0xfdcc78c1, 0x7cbf1ffd, 0xd4fe3540, 0xeb0cf31c, + 0xa1676f18, 0x985f268b, 0x7d9c5851, 0xd6b8bb05, + 0x6b5cd38c, 0x57cbdc39, 0x6ef395aa, 0x180f061b, + 0x8a13acdc, 0x1a49885e, 0xdf9efea0, 0x21374f88, + 0x4d825467, 0xb16d6b0a, 0x46e29f87, 0xa202a6f1, + 0xae8ba572, 0x58271653, 0x9cd32701, 0x47c1d82b, + 0x95f562a4, 0x87b9e8f3, 0xe309f115, 0x0a438c4c, + 0x092645a5, 0x3c970fb5, 0xa04428b4, 0x5b42dfba, + 0xb04e2ca6, 0xcdd274f7, 0x6fd0d206, 0x482d1241, + 0xa7ade0d7, 0xd954716f, 0xceb7bd1e, 0x3b7ec7d6, + 0x2edb85e2, 0x2a578468, 0xb4c22d2c, 0x490e55ed, + 0x5d885075, 0xda31b886, 0x933fed6b, 0x44a411c2, + }, + { + 0x18c07830, 0x2305af46, 0xc67ef991, 0xe8136fcd, + 0x874ca113, 0xb8a9626d, 0x01080502, 0x4f426e9e, + 0x36adee6c, 0xa6590451, 0xd2debdb9, 0xf5fb06f7, + 0x79ef80f2, 0x6f5fcede, 0x91fcef3f, 0x52aa07a4, + 0x6027fdc0, 0xbc897665, 0x9baccd2b, 0x8e048c01, + 0xa371155b, 0x0c603c18, 0x7bff8af6, 0x35b5e16a, + 0x1de8693a, 0xe05347dd, 0xd7f6acb3, 0xc25eed99, + 0x2e6d965c, 0x4b627a96, 0xfea321e1, 0x578216ae, + 0x15a8412a, 0x779fb6ee, 0x37a5eb6e, 0xe57b56d7, + 0x9f8cd923, 0xf0d317fd, 0x4a6a7f94, 0xda9e95a9, + 0x58fa25b0, 0xc906ca8f, 0x29558d52, 0x0a502214, + 0xb1e14f7f, 0xa0691a5d, 0x6b7fdad6, 0x855cab17, + 0xbd817367, 0x5dd234ba, 0x10805020, 0xf4f303f5, + 0xcb16c08b, 0x3eedc67c, 0x0528110a, 0x671fe6ce, + 0xe47353d5, 0x2725bb4e, 0x41325882, 0x8b2c9d0b, + 0xa7510153, 0x7dcf94fa, 0x95dcfb37, 0xd88e9fad, + 0xfb8b30eb, 0xee2371c1, 0x7cc791f8, 0x6617e3cc, + 0xdda68ea7, 0x17b84b2e, 0x4702468e, 0x9e84dc21, + 0xca1ec589, 0x2d75995a, 0xbf917963, 0x07381b0e, + 0xad012347, 0x5aea2fb4, 0x836cb51b, 0x3385ff66, + 0x633ff2c6, 0x02100a04, 0xaa393849, 0x71afa8e2, + 0xc80ecf8d, 0x19c87d32, 0x49727092, 0xd9869aaf, + 0xf2c31df9, 0xe34b48db, 0x5be22ab6, 0x8834920d, + 0x9aa4c829, 0x262dbe4c, 0x328dfa64, 0xb0e94a7d, + 0xe91b6acf, 0x0f78331e, 0xd5e6a6b7, 0x8074ba1d, + 0xbe997c61, 0xcd26de87, 0x34bde468, 0x487a7590, + 0xffab24e3, 0x7af78ff4, 0x90f4ea3d, 0x5fc23ebe, + 0x201da040, 0x6867d5d0, 0x1ad07234, 0xae192c41, + 0xb4c95e75, 0x549a19a8, 0x93ece53b, 0x220daa44, + 0x6407e9c8, 0xf1db12ff, 0x73bfa2e6, 0x12905a24, + 0x403a5d80, 0x08402810, 0xc356e89b, 0xec337bc5, + 0xdb9690ab, 0xa1611f5f, 0x8d1c8307, 0x3df5c97a, + 0x97ccf133, 0x00000000, 0xcf36d483, 0x2b458756, + 0x7697b3ec, 0x8264b019, 0xd6fea9b1, 0x1bd87736, + 0xb5c15b77, 0xaf112943, 0x6a77dfd4, 0x50ba0da0, + 0x45124c8a, 0xf3cb18fb, 0x309df060, 0xef2b74c3, + 0x3fe5c37e, 0x55921caa, 0xa2791059, 0xea0365c9, + 0x650fecca, 0xbab96869, 0x2f65935e, 0xc04ee79d, + 0xdebe81a1, 0x1ce06c38, 0xfdbb2ee7, 0x4d52649a, + 0x92e4e039, 0x758fbcea, 0x06301e0c, 0x8a249809, + 0xb2f94079, 0xe66359d1, 0x0e70361c, 0x1ff8633e, + 0x6237f7c4, 0xd4eea3b5, 0xa829324d, 0x96c4f431, + 0xf99b3aef, 0xc566f697, 0x2535b14a, 0x59f220b2, + 0x8454ae15, 0x72b7a7e4, 0x39d5dd72, 0x4c5a6198, + 0x5eca3bbc, 0x78e785f0, 0x38ddd870, 0x8c148605, + 0xd1c6b2bf, 0xa5410b57, 0xe2434dd9, 0x612ff8c2, + 0xb3f1457b, 0x2115a542, 0x9c94d625, 0x1ef0663c, + 0x43225286, 0xc776fc93, 0xfcb32be5, 0x04201408, + 0x51b208a2, 0x99bcc72f, 0x6d4fc4da, 0x0d68391a, + 0xfa8335e9, 0xdfb684a3, 0x7ed79bfc, 0x243db448, + 0x3bc5d776, 0xab313d4b, 0xce3ed181, 0x11885522, + 0x8f0c8903, 0x4e4a6b9c, 0xb7d15173, 0xeb0b60cb, + 0x3cfdcc78, 0x817cbf1f, 0x94d4fe35, 0xf7eb0cf3, + 0xb9a1676f, 0x13985f26, 0x2c7d9c58, 0xd3d6b8bb, + 0xe76b5cd3, 0x6e57cbdc, 0xc46ef395, 0x03180f06, + 0x568a13ac, 0x441a4988, 0x7fdf9efe, 0xa921374f, + 0x2a4d8254, 0xbbb16d6b, 0xc146e29f, 0x53a202a6, + 0xdcae8ba5, 0x0b582716, 0x9d9cd327, 0x6c47c1d8, + 0x3195f562, 0x7487b9e8, 0xf6e309f1, 0x460a438c, + 0xac092645, 0x893c970f, 0x14a04428, 0xe15b42df, + 0x16b04e2c, 0x3acdd274, 0x696fd0d2, 0x09482d12, + 0x70a7ade0, 0xb6d95471, 0xd0ceb7bd, 0xed3b7ec7, + 0xcc2edb85, 0x422a5784, 0x98b4c22d, 0xa4490e55, + 0x285d8850, 0x5cda31b8, 0xf8933fed, 0x8644a411, + }, + { + 0x6018c078, 0x8c2305af, 0x3fc67ef9, 0x87e8136f, + 0x26874ca1, 0xdab8a962, 0x04010805, 0x214f426e, + 0xd836adee, 0xa2a65904, 0x6fd2debd, 0xf3f5fb06, + 0xf979ef80, 0xa16f5fce, 0x7e91fcef, 0x5552aa07, + 0x9d6027fd, 0xcabc8976, 0x569baccd, 0x028e048c, + 0xb6a37115, 0x300c603c, 0xf17bff8a, 0xd435b5e1, + 0x741de869, 0xa7e05347, 0x7bd7f6ac, 0x2fc25eed, + 0xb82e6d96, 0x314b627a, 0xdffea321, 0x41578216, + 0x5415a841, 0xc1779fb6, 0xdc37a5eb, 0xb3e57b56, + 0x469f8cd9, 0xe7f0d317, 0x354a6a7f, 0x4fda9e95, + 0x7d58fa25, 0x03c906ca, 0xa429558d, 0x280a5022, + 0xfeb1e14f, 0xbaa0691a, 0xb16b7fda, 0x2e855cab, + 0xcebd8173, 0x695dd234, 0x40108050, 0xf7f4f303, + 0x0bcb16c0, 0xf83eedc6, 0x14052811, 0x81671fe6, + 0xb7e47353, 0x9c2725bb, 0x19413258, 0x168b2c9d, + 0xa6a75101, 0xe97dcf94, 0x6e95dcfb, 0x47d88e9f, + 0xcbfb8b30, 0x9fee2371, 0xed7cc791, 0x856617e3, + 0x53dda68e, 0x5c17b84b, 0x01470246, 0x429e84dc, + 0x0fca1ec5, 0xb42d7599, 0xc6bf9179, 0x1c07381b, + 0x8ead0123, 0x755aea2f, 0x36836cb5, 0xcc3385ff, + 0x91633ff2, 0x0802100a, 0x92aa3938, 0xd971afa8, + 0x07c80ecf, 0x6419c87d, 0x39497270, 0x43d9869a, + 0xeff2c31d, 0xabe34b48, 0x715be22a, 0x1a883492, + 0x529aa4c8, 0x98262dbe, 0xc8328dfa, 0xfab0e94a, + 0x83e91b6a, 0x3c0f7833, 0x73d5e6a6, 0x3a8074ba, + 0xc2be997c, 0x13cd26de, 0xd034bde4, 0x3d487a75, + 0xdbffab24, 0xf57af78f, 0x7a90f4ea, 0x615fc23e, + 0x80201da0, 0xbd6867d5, 0x681ad072, 0x82ae192c, + 0xeab4c95e, 0x4d549a19, 0x7693ece5, 0x88220daa, + 0x8d6407e9, 0xe3f1db12, 0xd173bfa2, 0x4812905a, + 0x1d403a5d, 0x20084028, 0x2bc356e8, 0x97ec337b, + 0x4bdb9690, 0xbea1611f, 0x0e8d1c83, 0xf43df5c9, + 0x6697ccf1, 0x00000000, 0x1bcf36d4, 0xac2b4587, + 0xc57697b3, 0x328264b0, 0x7fd6fea9, 0x6c1bd877, + 0xeeb5c15b, 0x86af1129, 0xb56a77df, 0x5d50ba0d, + 0x0945124c, 0xebf3cb18, 0xc0309df0, 0x9bef2b74, + 0xfc3fe5c3, 0x4955921c, 0xb2a27910, 0x8fea0365, + 0x89650fec, 0xd2bab968, 0xbc2f6593, 0x27c04ee7, + 0x5fdebe81, 0x701ce06c, 0xd3fdbb2e, 0x294d5264, + 0x7292e4e0, 0xc9758fbc, 0x1806301e, 0x128a2498, + 0xf2b2f940, 0xbfe66359, 0x380e7036, 0x7c1ff863, + 0x956237f7, 0x77d4eea3, 0x9aa82932, 0x6296c4f4, + 0xc3f99b3a, 0x33c566f6, 0x942535b1, 0x7959f220, + 0x2a8454ae, 0xd572b7a7, 0xe439d5dd, 0x2d4c5a61, + 0x655eca3b, 0xfd78e785, 0xe038ddd8, 0x0a8c1486, + 0x63d1c6b2, 0xaea5410b, 0xafe2434d, 0x99612ff8, + 0xf6b3f145, 0x842115a5, 0x4a9c94d6, 0x781ef066, + 0x11432252, 0x3bc776fc, 0xd7fcb32b, 0x10042014, + 0x5951b208, 0x5e99bcc7, 0xa96d4fc4, 0x340d6839, + 0xcffa8335, 0x5bdfb684, 0xe57ed79b, 0x90243db4, + 0xec3bc5d7, 0x96ab313d, 0x1fce3ed1, 0x44118855, + 0x068f0c89, 0x254e4a6b, 0xe6b7d151, 0x8beb0b60, + 0xf03cfdcc, 0x3e817cbf, 0x6a94d4fe, 0xfbf7eb0c, + 0xdeb9a167, 0x4c13985f, 0xb02c7d9c, 0x6bd3d6b8, + 0xbbe76b5c, 0xa56e57cb, 0x37c46ef3, 0x0c03180f, + 0x45568a13, 0x0d441a49, 0xe17fdf9e, 0x9ea92137, + 0xa82a4d82, 0xd6bbb16d, 0x23c146e2, 0x5153a202, + 0x57dcae8b, 0x2c0b5827, 0x4e9d9cd3, 0xad6c47c1, + 0xc43195f5, 0xcd7487b9, 0xfff6e309, 0x05460a43, + 0x8aac0926, 0x1e893c97, 0x5014a044, 0xa3e15b42, + 0x5816b04e, 0xe83acdd2, 0xb9696fd0, 0x2409482d, + 0xdd70a7ad, 0xe2b6d954, 0x67d0ceb7, 0x93ed3b7e, + 0x17cc2edb, 0x15422a57, 0x5a98b4c2, 0xaaa4490e, + 0xa0285d88, 0x6d5cda31, 0xc7f8933f, 0x228644a4, + }, + { + 0x186018c0, 0x238c2305, 0xc63fc67e, 0xe887e813, + 0x8726874c, 0xb8dab8a9, 0x01040108, 0x4f214f42, + 0x36d836ad, 0xa6a2a659, 0xd26fd2de, 0xf5f3f5fb, + 0x79f979ef, 0x6fa16f5f, 0x917e91fc, 0x525552aa, + 0x609d6027, 0xbccabc89, 0x9b569bac, 0x8e028e04, + 0xa3b6a371, 0x0c300c60, 0x7bf17bff, 0x35d435b5, + 0x1d741de8, 0xe0a7e053, 0xd77bd7f6, 0xc22fc25e, + 0x2eb82e6d, 0x4b314b62, 0xfedffea3, 0x57415782, + 0x155415a8, 0x77c1779f, 0x37dc37a5, 0xe5b3e57b, + 0x9f469f8c, 0xf0e7f0d3, 0x4a354a6a, 0xda4fda9e, + 0x587d58fa, 0xc903c906, 0x29a42955, 0x0a280a50, + 0xb1feb1e1, 0xa0baa069, 0x6bb16b7f, 0x852e855c, + 0xbdcebd81, 0x5d695dd2, 0x10401080, 0xf4f7f4f3, + 0xcb0bcb16, 0x3ef83eed, 0x05140528, 0x6781671f, + 0xe4b7e473, 0x279c2725, 0x41194132, 0x8b168b2c, + 0xa7a6a751, 0x7de97dcf, 0x956e95dc, 0xd847d88e, + 0xfbcbfb8b, 0xee9fee23, 0x7ced7cc7, 0x66856617, + 0xdd53dda6, 0x175c17b8, 0x47014702, 0x9e429e84, + 0xca0fca1e, 0x2db42d75, 0xbfc6bf91, 0x071c0738, + 0xad8ead01, 0x5a755aea, 0x8336836c, 0x33cc3385, + 0x6391633f, 0x02080210, 0xaa92aa39, 0x71d971af, + 0xc807c80e, 0x196419c8, 0x49394972, 0xd943d986, + 0xf2eff2c3, 0xe3abe34b, 0x5b715be2, 0x881a8834, + 0x9a529aa4, 0x2698262d, 0x32c8328d, 0xb0fab0e9, + 0xe983e91b, 0x0f3c0f78, 0xd573d5e6, 0x803a8074, + 0xbec2be99, 0xcd13cd26, 0x34d034bd, 0x483d487a, + 0xffdbffab, 0x7af57af7, 0x907a90f4, 0x5f615fc2, + 0x2080201d, 0x68bd6867, 0x1a681ad0, 0xae82ae19, + 0xb4eab4c9, 0x544d549a, 0x937693ec, 0x2288220d, + 0x648d6407, 0xf1e3f1db, 0x73d173bf, 0x12481290, + 0x401d403a, 0x08200840, 0xc32bc356, 0xec97ec33, + 0xdb4bdb96, 0xa1bea161, 0x8d0e8d1c, 0x3df43df5, + 0x976697cc, 0x00000000, 0xcf1bcf36, 0x2bac2b45, + 0x76c57697, 0x82328264, 0xd67fd6fe, 0x1b6c1bd8, + 0xb5eeb5c1, 0xaf86af11, 0x6ab56a77, 0x505d50ba, + 0x45094512, 0xf3ebf3cb, 0x30c0309d, 0xef9bef2b, + 0x3ffc3fe5, 0x55495592, 0xa2b2a279, 0xea8fea03, + 0x6589650f, 0xbad2bab9, 0x2fbc2f65, 0xc027c04e, + 0xde5fdebe, 0x1c701ce0, 0xfdd3fdbb, 0x4d294d52, + 0x927292e4, 0x75c9758f, 0x06180630, 0x8a128a24, + 0xb2f2b2f9, 0xe6bfe663, 0x0e380e70, 0x1f7c1ff8, + 0x62956237, 0xd477d4ee, 0xa89aa829, 0x966296c4, + 0xf9c3f99b, 0xc533c566, 0x25942535, 0x597959f2, + 0x842a8454, 0x72d572b7, 0x39e439d5, 0x4c2d4c5a, + 0x5e655eca, 0x78fd78e7, 0x38e038dd, 0x8c0a8c14, + 0xd163d1c6, 0xa5aea541, 0xe2afe243, 0x6199612f, + 0xb3f6b3f1, 0x21842115, 0x9c4a9c94, 0x1e781ef0, + 0x43114322, 0xc73bc776, 0xfcd7fcb3, 0x04100420, + 0x515951b2, 0x995e99bc, 0x6da96d4f, 0x0d340d68, + 0xfacffa83, 0xdf5bdfb6, 0x7ee57ed7, 0x2490243d, + 0x3bec3bc5, 0xab96ab31, 0xce1fce3e, 0x11441188, + 0x8f068f0c, 0x4e254e4a, 0xb7e6b7d1, 0xeb8beb0b, + 0x3cf03cfd, 0x813e817c, 0x946a94d4, 0xf7fbf7eb, + 0xb9deb9a1, 0x134c1398, 0x2cb02c7d, 0xd36bd3d6, + 0xe7bbe76b, 0x6ea56e57, 0xc437c46e, 0x030c0318, + 0x5645568a, 0x440d441a, 0x7fe17fdf, 0xa99ea921, + 0x2aa82a4d, 0xbbd6bbb1, 0xc123c146, 0x535153a2, + 0xdc57dcae, 0x0b2c0b58, 0x9d4e9d9c, 0x6cad6c47, + 0x31c43195, 0x74cd7487, 0xf6fff6e3, 0x4605460a, + 0xac8aac09, 0x891e893c, 0x145014a0, 0xe1a3e15b, + 0x165816b0, 0x3ae83acd, 0x69b9696f, 0x09240948, + 0x70dd70a7, 0xb6e2b6d9, 0xd067d0ce, 0xed93ed3b, + 0xcc17cc2e, 0x4215422a, 0x985a98b4, 0xa4aaa449, + 0x28a0285d, 0x5c6d5cda, 0xf8c7f893, 0x86228644, + } +}; + +__device__ __constant__ u32 Cl[8][256] = +{ + { + 0xc07830d8, 0x05af4626, 0x7ef991b8, 0x136fcdfb, + 0x4ca113cb, 0xa9626d11, 0x08050209, 0x426e9e0d, + 0xadee6c9b, 0x590451ff, 0xdebdb90c, 0xfb06f70e, + 0xef80f296, 0x5fcede30, 0xfcef3f6d, 0xaa07a4f8, + 0x27fdc047, 0x89766535, 0xaccd2b37, 0x048c018a, + 0x71155bd2, 0x603c186c, 0xff8af684, 0xb5e16a80, + 0xe8693af5, 0x5347ddb3, 0xf6acb321, 0x5eed999c, + 0x6d965c43, 0x627a9629, 0xa321e15d, 0x8216aed5, + 0xa8412abd, 0x9fb6eee8, 0xa5eb6e92, 0x7b56d79e, + 0x8cd92313, 0xd317fd23, 0x6a7f9420, 0x9e95a944, + 0xfa25b0a2, 0x06ca8fcf, 0x558d527c, 0x5022145a, + 0xe14f7f50, 0x691a5dc9, 0x7fdad614, 0x5cab17d9, + 0x8173673c, 0xd234ba8f, 0x80502090, 0xf303f507, + 0x16c08bdd, 0xedc67cd3, 0x28110a2d, 0x1fe6ce78, + 0x7353d597, 0x25bb4e02, 0x32588273, 0x2c9d0ba7, + 0x510153f6, 0xcf94fab2, 0xdcfb3749, 0x8e9fad56, + 0x8b30eb70, 0x2371c1cd, 0xc791f8bb, 0x17e3cc71, + 0xa68ea77b, 0xb84b2eaf, 0x02468e45, 0x84dc211a, + 0x1ec589d4, 0x75995a58, 0x9179632e, 0x381b0e3f, + 0x012347ac, 0xea2fb4b0, 0x6cb51bef, 0x85ff66b6, + 0x3ff2c65c, 0x100a0412, 0x39384993, 0xafa8e2de, + 0x0ecf8dc6, 0xc87d32d1, 0x7270923b, 0x869aaf5f, + 0xc31df931, 0x4b48dba8, 0xe22ab6b9, 0x34920dbc, + 0xa4c8293e, 0x2dbe4c0b, 0x8dfa64bf, 0xe94a7d59, + 0x1b6acff2, 0x78331e77, 0xe6a6b733, 0x74ba1df4, + 0x997c6127, 0x26de87eb, 0xbde46889, 0x7a759032, + 0xab24e354, 0xf78ff48d, 0xf4ea3d64, 0xc23ebe9d, + 0x1da0403d, 0x67d5d00f, 0xd07234ca, 0x192c41b7, + 0xc95e757d, 0x9a19a8ce, 0xece53b7f, 0x0daa442f, + 0x07e9c863, 0xdb12ff2a, 0xbfa2e6cc, 0x905a2482, + 0x3a5d807a, 0x40281048, 0x56e89b95, 0x337bc5df, + 0x9690ab4d, 0x611f5fc0, 0x1c830791, 0xf5c97ac8, + 0xccf1335b, 0x00000000, 0x36d483f9, 0x4587566e, + 0x97b3ece1, 0x64b019e6, 0xfea9b128, 0xd87736c3, + 0xc15b7774, 0x112943be, 0x77dfd41d, 0xba0da0ea, + 0x124c8a57, 0xcb18fb38, 0x9df060ad, 0x2b74c3c4, + 0xe5c37eda, 0x921caac7, 0x791059db, 0x0365c9e9, + 0x0fecca6a, 0xb9686903, 0x65935e4a, 0x4ee79d8e, + 0xbe81a160, 0xe06c38fc, 0xbb2ee746, 0x52649a1f, + 0xe4e03976, 0x8fbceafa, 0x301e0c36, 0x249809ae, + 0xf940794b, 0x6359d185, 0x70361c7e, 0xf8633ee7, + 0x37f7c455, 0xeea3b53a, 0x29324d81, 0xc4f43152, + 0x9b3aef62, 0x66f697a3, 0x35b14a10, 0xf220b2ab, + 0x54ae15d0, 0xb7a7e4c5, 0xd5dd72ec, 0x5a619816, + 0xca3bbc94, 0xe785f09f, 0xddd870e5, 0x14860598, + 0xc6b2bf17, 0x410b57e4, 0x434dd9a1, 0x2ff8c24e, + 0xf1457b42, 0x15a54234, 0x94d62508, 0xf0663cee, + 0x22528661, 0x76fc93b1, 0xb32be54f, 0x20140824, + 0xb208a2e3, 0xbcc72f25, 0x4fc4da22, 0x68391a65, + 0x8335e979, 0xb684a369, 0xd79bfca9, 0x3db44819, + 0xc5d776fe, 0x313d4b9a, 0x3ed181f0, 0x88552299, + 0x0c890383, 0x4a6b9c04, 0xd1517366, 0x0b60cbe0, + 0xfdcc78c1, 0x7cbf1ffd, 0xd4fe3540, 0xeb0cf31c, + 0xa1676f18, 0x985f268b, 0x7d9c5851, 0xd6b8bb05, + 0x6b5cd38c, 0x57cbdc39, 0x6ef395aa, 0x180f061b, + 0x8a13acdc, 0x1a49885e, 0xdf9efea0, 0x21374f88, + 0x4d825467, 0xb16d6b0a, 0x46e29f87, 0xa202a6f1, + 0xae8ba572, 0x58271653, 0x9cd32701, 0x47c1d82b, + 0x95f562a4, 0x87b9e8f3, 0xe309f115, 0x0a438c4c, + 0x092645a5, 0x3c970fb5, 0xa04428b4, 0x5b42dfba, + 0xb04e2ca6, 0xcdd274f7, 0x6fd0d206, 0x482d1241, + 0xa7ade0d7, 0xd954716f, 0xceb7bd1e, 0x3b7ec7d6, + 0x2edb85e2, 0x2a578468, 0xb4c22d2c, 0x490e55ed, + 0x5d885075, 0xda31b886, 0x933fed6b, 0x44a411c2, + }, + { + 0x18c07830, 0x2305af46, 0xc67ef991, 0xe8136fcd, + 0x874ca113, 0xb8a9626d, 0x01080502, 0x4f426e9e, + 0x36adee6c, 0xa6590451, 0xd2debdb9, 0xf5fb06f7, + 0x79ef80f2, 0x6f5fcede, 0x91fcef3f, 0x52aa07a4, + 0x6027fdc0, 0xbc897665, 0x9baccd2b, 0x8e048c01, + 0xa371155b, 0x0c603c18, 0x7bff8af6, 0x35b5e16a, + 0x1de8693a, 0xe05347dd, 0xd7f6acb3, 0xc25eed99, + 0x2e6d965c, 0x4b627a96, 0xfea321e1, 0x578216ae, + 0x15a8412a, 0x779fb6ee, 0x37a5eb6e, 0xe57b56d7, + 0x9f8cd923, 0xf0d317fd, 0x4a6a7f94, 0xda9e95a9, + 0x58fa25b0, 0xc906ca8f, 0x29558d52, 0x0a502214, + 0xb1e14f7f, 0xa0691a5d, 0x6b7fdad6, 0x855cab17, + 0xbd817367, 0x5dd234ba, 0x10805020, 0xf4f303f5, + 0xcb16c08b, 0x3eedc67c, 0x0528110a, 0x671fe6ce, + 0xe47353d5, 0x2725bb4e, 0x41325882, 0x8b2c9d0b, + 0xa7510153, 0x7dcf94fa, 0x95dcfb37, 0xd88e9fad, + 0xfb8b30eb, 0xee2371c1, 0x7cc791f8, 0x6617e3cc, + 0xdda68ea7, 0x17b84b2e, 0x4702468e, 0x9e84dc21, + 0xca1ec589, 0x2d75995a, 0xbf917963, 0x07381b0e, + 0xad012347, 0x5aea2fb4, 0x836cb51b, 0x3385ff66, + 0x633ff2c6, 0x02100a04, 0xaa393849, 0x71afa8e2, + 0xc80ecf8d, 0x19c87d32, 0x49727092, 0xd9869aaf, + 0xf2c31df9, 0xe34b48db, 0x5be22ab6, 0x8834920d, + 0x9aa4c829, 0x262dbe4c, 0x328dfa64, 0xb0e94a7d, + 0xe91b6acf, 0x0f78331e, 0xd5e6a6b7, 0x8074ba1d, + 0xbe997c61, 0xcd26de87, 0x34bde468, 0x487a7590, + 0xffab24e3, 0x7af78ff4, 0x90f4ea3d, 0x5fc23ebe, + 0x201da040, 0x6867d5d0, 0x1ad07234, 0xae192c41, + 0xb4c95e75, 0x549a19a8, 0x93ece53b, 0x220daa44, + 0x6407e9c8, 0xf1db12ff, 0x73bfa2e6, 0x12905a24, + 0x403a5d80, 0x08402810, 0xc356e89b, 0xec337bc5, + 0xdb9690ab, 0xa1611f5f, 0x8d1c8307, 0x3df5c97a, + 0x97ccf133, 0x00000000, 0xcf36d483, 0x2b458756, + 0x7697b3ec, 0x8264b019, 0xd6fea9b1, 0x1bd87736, + 0xb5c15b77, 0xaf112943, 0x6a77dfd4, 0x50ba0da0, + 0x45124c8a, 0xf3cb18fb, 0x309df060, 0xef2b74c3, + 0x3fe5c37e, 0x55921caa, 0xa2791059, 0xea0365c9, + 0x650fecca, 0xbab96869, 0x2f65935e, 0xc04ee79d, + 0xdebe81a1, 0x1ce06c38, 0xfdbb2ee7, 0x4d52649a, + 0x92e4e039, 0x758fbcea, 0x06301e0c, 0x8a249809, + 0xb2f94079, 0xe66359d1, 0x0e70361c, 0x1ff8633e, + 0x6237f7c4, 0xd4eea3b5, 0xa829324d, 0x96c4f431, + 0xf99b3aef, 0xc566f697, 0x2535b14a, 0x59f220b2, + 0x8454ae15, 0x72b7a7e4, 0x39d5dd72, 0x4c5a6198, + 0x5eca3bbc, 0x78e785f0, 0x38ddd870, 0x8c148605, + 0xd1c6b2bf, 0xa5410b57, 0xe2434dd9, 0x612ff8c2, + 0xb3f1457b, 0x2115a542, 0x9c94d625, 0x1ef0663c, + 0x43225286, 0xc776fc93, 0xfcb32be5, 0x04201408, + 0x51b208a2, 0x99bcc72f, 0x6d4fc4da, 0x0d68391a, + 0xfa8335e9, 0xdfb684a3, 0x7ed79bfc, 0x243db448, + 0x3bc5d776, 0xab313d4b, 0xce3ed181, 0x11885522, + 0x8f0c8903, 0x4e4a6b9c, 0xb7d15173, 0xeb0b60cb, + 0x3cfdcc78, 0x817cbf1f, 0x94d4fe35, 0xf7eb0cf3, + 0xb9a1676f, 0x13985f26, 0x2c7d9c58, 0xd3d6b8bb, + 0xe76b5cd3, 0x6e57cbdc, 0xc46ef395, 0x03180f06, + 0x568a13ac, 0x441a4988, 0x7fdf9efe, 0xa921374f, + 0x2a4d8254, 0xbbb16d6b, 0xc146e29f, 0x53a202a6, + 0xdcae8ba5, 0x0b582716, 0x9d9cd327, 0x6c47c1d8, + 0x3195f562, 0x7487b9e8, 0xf6e309f1, 0x460a438c, + 0xac092645, 0x893c970f, 0x14a04428, 0xe15b42df, + 0x16b04e2c, 0x3acdd274, 0x696fd0d2, 0x09482d12, + 0x70a7ade0, 0xb6d95471, 0xd0ceb7bd, 0xed3b7ec7, + 0xcc2edb85, 0x422a5784, 0x98b4c22d, 0xa4490e55, + 0x285d8850, 0x5cda31b8, 0xf8933fed, 0x8644a411, + }, + { + 0x6018c078, 0x8c2305af, 0x3fc67ef9, 0x87e8136f, + 0x26874ca1, 0xdab8a962, 0x04010805, 0x214f426e, + 0xd836adee, 0xa2a65904, 0x6fd2debd, 0xf3f5fb06, + 0xf979ef80, 0xa16f5fce, 0x7e91fcef, 0x5552aa07, + 0x9d6027fd, 0xcabc8976, 0x569baccd, 0x028e048c, + 0xb6a37115, 0x300c603c, 0xf17bff8a, 0xd435b5e1, + 0x741de869, 0xa7e05347, 0x7bd7f6ac, 0x2fc25eed, + 0xb82e6d96, 0x314b627a, 0xdffea321, 0x41578216, + 0x5415a841, 0xc1779fb6, 0xdc37a5eb, 0xb3e57b56, + 0x469f8cd9, 0xe7f0d317, 0x354a6a7f, 0x4fda9e95, + 0x7d58fa25, 0x03c906ca, 0xa429558d, 0x280a5022, + 0xfeb1e14f, 0xbaa0691a, 0xb16b7fda, 0x2e855cab, + 0xcebd8173, 0x695dd234, 0x40108050, 0xf7f4f303, + 0x0bcb16c0, 0xf83eedc6, 0x14052811, 0x81671fe6, + 0xb7e47353, 0x9c2725bb, 0x19413258, 0x168b2c9d, + 0xa6a75101, 0xe97dcf94, 0x6e95dcfb, 0x47d88e9f, + 0xcbfb8b30, 0x9fee2371, 0xed7cc791, 0x856617e3, + 0x53dda68e, 0x5c17b84b, 0x01470246, 0x429e84dc, + 0x0fca1ec5, 0xb42d7599, 0xc6bf9179, 0x1c07381b, + 0x8ead0123, 0x755aea2f, 0x36836cb5, 0xcc3385ff, + 0x91633ff2, 0x0802100a, 0x92aa3938, 0xd971afa8, + 0x07c80ecf, 0x6419c87d, 0x39497270, 0x43d9869a, + 0xeff2c31d, 0xabe34b48, 0x715be22a, 0x1a883492, + 0x529aa4c8, 0x98262dbe, 0xc8328dfa, 0xfab0e94a, + 0x83e91b6a, 0x3c0f7833, 0x73d5e6a6, 0x3a8074ba, + 0xc2be997c, 0x13cd26de, 0xd034bde4, 0x3d487a75, + 0xdbffab24, 0xf57af78f, 0x7a90f4ea, 0x615fc23e, + 0x80201da0, 0xbd6867d5, 0x681ad072, 0x82ae192c, + 0xeab4c95e, 0x4d549a19, 0x7693ece5, 0x88220daa, + 0x8d6407e9, 0xe3f1db12, 0xd173bfa2, 0x4812905a, + 0x1d403a5d, 0x20084028, 0x2bc356e8, 0x97ec337b, + 0x4bdb9690, 0xbea1611f, 0x0e8d1c83, 0xf43df5c9, + 0x6697ccf1, 0x00000000, 0x1bcf36d4, 0xac2b4587, + 0xc57697b3, 0x328264b0, 0x7fd6fea9, 0x6c1bd877, + 0xeeb5c15b, 0x86af1129, 0xb56a77df, 0x5d50ba0d, + 0x0945124c, 0xebf3cb18, 0xc0309df0, 0x9bef2b74, + 0xfc3fe5c3, 0x4955921c, 0xb2a27910, 0x8fea0365, + 0x89650fec, 0xd2bab968, 0xbc2f6593, 0x27c04ee7, + 0x5fdebe81, 0x701ce06c, 0xd3fdbb2e, 0x294d5264, + 0x7292e4e0, 0xc9758fbc, 0x1806301e, 0x128a2498, + 0xf2b2f940, 0xbfe66359, 0x380e7036, 0x7c1ff863, + 0x956237f7, 0x77d4eea3, 0x9aa82932, 0x6296c4f4, + 0xc3f99b3a, 0x33c566f6, 0x942535b1, 0x7959f220, + 0x2a8454ae, 0xd572b7a7, 0xe439d5dd, 0x2d4c5a61, + 0x655eca3b, 0xfd78e785, 0xe038ddd8, 0x0a8c1486, + 0x63d1c6b2, 0xaea5410b, 0xafe2434d, 0x99612ff8, + 0xf6b3f145, 0x842115a5, 0x4a9c94d6, 0x781ef066, + 0x11432252, 0x3bc776fc, 0xd7fcb32b, 0x10042014, + 0x5951b208, 0x5e99bcc7, 0xa96d4fc4, 0x340d6839, + 0xcffa8335, 0x5bdfb684, 0xe57ed79b, 0x90243db4, + 0xec3bc5d7, 0x96ab313d, 0x1fce3ed1, 0x44118855, + 0x068f0c89, 0x254e4a6b, 0xe6b7d151, 0x8beb0b60, + 0xf03cfdcc, 0x3e817cbf, 0x6a94d4fe, 0xfbf7eb0c, + 0xdeb9a167, 0x4c13985f, 0xb02c7d9c, 0x6bd3d6b8, + 0xbbe76b5c, 0xa56e57cb, 0x37c46ef3, 0x0c03180f, + 0x45568a13, 0x0d441a49, 0xe17fdf9e, 0x9ea92137, + 0xa82a4d82, 0xd6bbb16d, 0x23c146e2, 0x5153a202, + 0x57dcae8b, 0x2c0b5827, 0x4e9d9cd3, 0xad6c47c1, + 0xc43195f5, 0xcd7487b9, 0xfff6e309, 0x05460a43, + 0x8aac0926, 0x1e893c97, 0x5014a044, 0xa3e15b42, + 0x5816b04e, 0xe83acdd2, 0xb9696fd0, 0x2409482d, + 0xdd70a7ad, 0xe2b6d954, 0x67d0ceb7, 0x93ed3b7e, + 0x17cc2edb, 0x15422a57, 0x5a98b4c2, 0xaaa4490e, + 0xa0285d88, 0x6d5cda31, 0xc7f8933f, 0x228644a4, + }, + { + 0x186018c0, 0x238c2305, 0xc63fc67e, 0xe887e813, + 0x8726874c, 0xb8dab8a9, 0x01040108, 0x4f214f42, + 0x36d836ad, 0xa6a2a659, 0xd26fd2de, 0xf5f3f5fb, + 0x79f979ef, 0x6fa16f5f, 0x917e91fc, 0x525552aa, + 0x609d6027, 0xbccabc89, 0x9b569bac, 0x8e028e04, + 0xa3b6a371, 0x0c300c60, 0x7bf17bff, 0x35d435b5, + 0x1d741de8, 0xe0a7e053, 0xd77bd7f6, 0xc22fc25e, + 0x2eb82e6d, 0x4b314b62, 0xfedffea3, 0x57415782, + 0x155415a8, 0x77c1779f, 0x37dc37a5, 0xe5b3e57b, + 0x9f469f8c, 0xf0e7f0d3, 0x4a354a6a, 0xda4fda9e, + 0x587d58fa, 0xc903c906, 0x29a42955, 0x0a280a50, + 0xb1feb1e1, 0xa0baa069, 0x6bb16b7f, 0x852e855c, + 0xbdcebd81, 0x5d695dd2, 0x10401080, 0xf4f7f4f3, + 0xcb0bcb16, 0x3ef83eed, 0x05140528, 0x6781671f, + 0xe4b7e473, 0x279c2725, 0x41194132, 0x8b168b2c, + 0xa7a6a751, 0x7de97dcf, 0x956e95dc, 0xd847d88e, + 0xfbcbfb8b, 0xee9fee23, 0x7ced7cc7, 0x66856617, + 0xdd53dda6, 0x175c17b8, 0x47014702, 0x9e429e84, + 0xca0fca1e, 0x2db42d75, 0xbfc6bf91, 0x071c0738, + 0xad8ead01, 0x5a755aea, 0x8336836c, 0x33cc3385, + 0x6391633f, 0x02080210, 0xaa92aa39, 0x71d971af, + 0xc807c80e, 0x196419c8, 0x49394972, 0xd943d986, + 0xf2eff2c3, 0xe3abe34b, 0x5b715be2, 0x881a8834, + 0x9a529aa4, 0x2698262d, 0x32c8328d, 0xb0fab0e9, + 0xe983e91b, 0x0f3c0f78, 0xd573d5e6, 0x803a8074, + 0xbec2be99, 0xcd13cd26, 0x34d034bd, 0x483d487a, + 0xffdbffab, 0x7af57af7, 0x907a90f4, 0x5f615fc2, + 0x2080201d, 0x68bd6867, 0x1a681ad0, 0xae82ae19, + 0xb4eab4c9, 0x544d549a, 0x937693ec, 0x2288220d, + 0x648d6407, 0xf1e3f1db, 0x73d173bf, 0x12481290, + 0x401d403a, 0x08200840, 0xc32bc356, 0xec97ec33, + 0xdb4bdb96, 0xa1bea161, 0x8d0e8d1c, 0x3df43df5, + 0x976697cc, 0x00000000, 0xcf1bcf36, 0x2bac2b45, + 0x76c57697, 0x82328264, 0xd67fd6fe, 0x1b6c1bd8, + 0xb5eeb5c1, 0xaf86af11, 0x6ab56a77, 0x505d50ba, + 0x45094512, 0xf3ebf3cb, 0x30c0309d, 0xef9bef2b, + 0x3ffc3fe5, 0x55495592, 0xa2b2a279, 0xea8fea03, + 0x6589650f, 0xbad2bab9, 0x2fbc2f65, 0xc027c04e, + 0xde5fdebe, 0x1c701ce0, 0xfdd3fdbb, 0x4d294d52, + 0x927292e4, 0x75c9758f, 0x06180630, 0x8a128a24, + 0xb2f2b2f9, 0xe6bfe663, 0x0e380e70, 0x1f7c1ff8, + 0x62956237, 0xd477d4ee, 0xa89aa829, 0x966296c4, + 0xf9c3f99b, 0xc533c566, 0x25942535, 0x597959f2, + 0x842a8454, 0x72d572b7, 0x39e439d5, 0x4c2d4c5a, + 0x5e655eca, 0x78fd78e7, 0x38e038dd, 0x8c0a8c14, + 0xd163d1c6, 0xa5aea541, 0xe2afe243, 0x6199612f, + 0xb3f6b3f1, 0x21842115, 0x9c4a9c94, 0x1e781ef0, + 0x43114322, 0xc73bc776, 0xfcd7fcb3, 0x04100420, + 0x515951b2, 0x995e99bc, 0x6da96d4f, 0x0d340d68, + 0xfacffa83, 0xdf5bdfb6, 0x7ee57ed7, 0x2490243d, + 0x3bec3bc5, 0xab96ab31, 0xce1fce3e, 0x11441188, + 0x8f068f0c, 0x4e254e4a, 0xb7e6b7d1, 0xeb8beb0b, + 0x3cf03cfd, 0x813e817c, 0x946a94d4, 0xf7fbf7eb, + 0xb9deb9a1, 0x134c1398, 0x2cb02c7d, 0xd36bd3d6, + 0xe7bbe76b, 0x6ea56e57, 0xc437c46e, 0x030c0318, + 0x5645568a, 0x440d441a, 0x7fe17fdf, 0xa99ea921, + 0x2aa82a4d, 0xbbd6bbb1, 0xc123c146, 0x535153a2, + 0xdc57dcae, 0x0b2c0b58, 0x9d4e9d9c, 0x6cad6c47, + 0x31c43195, 0x74cd7487, 0xf6fff6e3, 0x4605460a, + 0xac8aac09, 0x891e893c, 0x145014a0, 0xe1a3e15b, + 0x165816b0, 0x3ae83acd, 0x69b9696f, 0x09240948, + 0x70dd70a7, 0xb6e2b6d9, 0xd067d0ce, 0xed93ed3b, + 0xcc17cc2e, 0x4215422a, 0x985a98b4, 0xa4aaa449, + 0x28a0285d, 0x5c6d5cda, 0xf8c7f893, 0x86228644, + }, + { + 0x18186018, 0x23238c23, 0xc6c63fc6, 0xe8e887e8, + 0x87872687, 0xb8b8dab8, 0x01010401, 0x4f4f214f, + 0x3636d836, 0xa6a6a2a6, 0xd2d26fd2, 0xf5f5f3f5, + 0x7979f979, 0x6f6fa16f, 0x91917e91, 0x52525552, + 0x60609d60, 0xbcbccabc, 0x9b9b569b, 0x8e8e028e, + 0xa3a3b6a3, 0x0c0c300c, 0x7b7bf17b, 0x3535d435, + 0x1d1d741d, 0xe0e0a7e0, 0xd7d77bd7, 0xc2c22fc2, + 0x2e2eb82e, 0x4b4b314b, 0xfefedffe, 0x57574157, + 0x15155415, 0x7777c177, 0x3737dc37, 0xe5e5b3e5, + 0x9f9f469f, 0xf0f0e7f0, 0x4a4a354a, 0xdada4fda, + 0x58587d58, 0xc9c903c9, 0x2929a429, 0x0a0a280a, + 0xb1b1feb1, 0xa0a0baa0, 0x6b6bb16b, 0x85852e85, + 0xbdbdcebd, 0x5d5d695d, 0x10104010, 0xf4f4f7f4, + 0xcbcb0bcb, 0x3e3ef83e, 0x05051405, 0x67678167, + 0xe4e4b7e4, 0x27279c27, 0x41411941, 0x8b8b168b, + 0xa7a7a6a7, 0x7d7de97d, 0x95956e95, 0xd8d847d8, + 0xfbfbcbfb, 0xeeee9fee, 0x7c7ced7c, 0x66668566, + 0xdddd53dd, 0x17175c17, 0x47470147, 0x9e9e429e, + 0xcaca0fca, 0x2d2db42d, 0xbfbfc6bf, 0x07071c07, + 0xadad8ead, 0x5a5a755a, 0x83833683, 0x3333cc33, + 0x63639163, 0x02020802, 0xaaaa92aa, 0x7171d971, + 0xc8c807c8, 0x19196419, 0x49493949, 0xd9d943d9, + 0xf2f2eff2, 0xe3e3abe3, 0x5b5b715b, 0x88881a88, + 0x9a9a529a, 0x26269826, 0x3232c832, 0xb0b0fab0, + 0xe9e983e9, 0x0f0f3c0f, 0xd5d573d5, 0x80803a80, + 0xbebec2be, 0xcdcd13cd, 0x3434d034, 0x48483d48, + 0xffffdbff, 0x7a7af57a, 0x90907a90, 0x5f5f615f, + 0x20208020, 0x6868bd68, 0x1a1a681a, 0xaeae82ae, + 0xb4b4eab4, 0x54544d54, 0x93937693, 0x22228822, + 0x64648d64, 0xf1f1e3f1, 0x7373d173, 0x12124812, + 0x40401d40, 0x08082008, 0xc3c32bc3, 0xecec97ec, + 0xdbdb4bdb, 0xa1a1bea1, 0x8d8d0e8d, 0x3d3df43d, + 0x97976697, 0x00000000, 0xcfcf1bcf, 0x2b2bac2b, + 0x7676c576, 0x82823282, 0xd6d67fd6, 0x1b1b6c1b, + 0xb5b5eeb5, 0xafaf86af, 0x6a6ab56a, 0x50505d50, + 0x45450945, 0xf3f3ebf3, 0x3030c030, 0xefef9bef, + 0x3f3ffc3f, 0x55554955, 0xa2a2b2a2, 0xeaea8fea, + 0x65658965, 0xbabad2ba, 0x2f2fbc2f, 0xc0c027c0, + 0xdede5fde, 0x1c1c701c, 0xfdfdd3fd, 0x4d4d294d, + 0x92927292, 0x7575c975, 0x06061806, 0x8a8a128a, + 0xb2b2f2b2, 0xe6e6bfe6, 0x0e0e380e, 0x1f1f7c1f, + 0x62629562, 0xd4d477d4, 0xa8a89aa8, 0x96966296, + 0xf9f9c3f9, 0xc5c533c5, 0x25259425, 0x59597959, + 0x84842a84, 0x7272d572, 0x3939e439, 0x4c4c2d4c, + 0x5e5e655e, 0x7878fd78, 0x3838e038, 0x8c8c0a8c, + 0xd1d163d1, 0xa5a5aea5, 0xe2e2afe2, 0x61619961, + 0xb3b3f6b3, 0x21218421, 0x9c9c4a9c, 0x1e1e781e, + 0x43431143, 0xc7c73bc7, 0xfcfcd7fc, 0x04041004, + 0x51515951, 0x99995e99, 0x6d6da96d, 0x0d0d340d, + 0xfafacffa, 0xdfdf5bdf, 0x7e7ee57e, 0x24249024, + 0x3b3bec3b, 0xabab96ab, 0xcece1fce, 0x11114411, + 0x8f8f068f, 0x4e4e254e, 0xb7b7e6b7, 0xebeb8beb, + 0x3c3cf03c, 0x81813e81, 0x94946a94, 0xf7f7fbf7, + 0xb9b9deb9, 0x13134c13, 0x2c2cb02c, 0xd3d36bd3, + 0xe7e7bbe7, 0x6e6ea56e, 0xc4c437c4, 0x03030c03, + 0x56564556, 0x44440d44, 0x7f7fe17f, 0xa9a99ea9, + 0x2a2aa82a, 0xbbbbd6bb, 0xc1c123c1, 0x53535153, + 0xdcdc57dc, 0x0b0b2c0b, 0x9d9d4e9d, 0x6c6cad6c, + 0x3131c431, 0x7474cd74, 0xf6f6fff6, 0x46460546, + 0xacac8aac, 0x89891e89, 0x14145014, 0xe1e1a3e1, + 0x16165816, 0x3a3ae83a, 0x6969b969, 0x09092409, + 0x7070dd70, 0xb6b6e2b6, 0xd0d067d0, 0xeded93ed, + 0xcccc17cc, 0x42421542, 0x98985a98, 0xa4a4aaa4, + 0x2828a028, 0x5c5c6d5c, 0xf8f8c7f8, 0x86862286, + }, + { + 0xd8181860, 0x2623238c, 0xb8c6c63f, 0xfbe8e887, + 0xcb878726, 0x11b8b8da, 0x09010104, 0x0d4f4f21, + 0x9b3636d8, 0xffa6a6a2, 0x0cd2d26f, 0x0ef5f5f3, + 0x967979f9, 0x306f6fa1, 0x6d91917e, 0xf8525255, + 0x4760609d, 0x35bcbcca, 0x379b9b56, 0x8a8e8e02, + 0xd2a3a3b6, 0x6c0c0c30, 0x847b7bf1, 0x803535d4, + 0xf51d1d74, 0xb3e0e0a7, 0x21d7d77b, 0x9cc2c22f, + 0x432e2eb8, 0x294b4b31, 0x5dfefedf, 0xd5575741, + 0xbd151554, 0xe87777c1, 0x923737dc, 0x9ee5e5b3, + 0x139f9f46, 0x23f0f0e7, 0x204a4a35, 0x44dada4f, + 0xa258587d, 0xcfc9c903, 0x7c2929a4, 0x5a0a0a28, + 0x50b1b1fe, 0xc9a0a0ba, 0x146b6bb1, 0xd985852e, + 0x3cbdbdce, 0x8f5d5d69, 0x90101040, 0x07f4f4f7, + 0xddcbcb0b, 0xd33e3ef8, 0x2d050514, 0x78676781, + 0x97e4e4b7, 0x0227279c, 0x73414119, 0xa78b8b16, + 0xf6a7a7a6, 0xb27d7de9, 0x4995956e, 0x56d8d847, + 0x70fbfbcb, 0xcdeeee9f, 0xbb7c7ced, 0x71666685, + 0x7bdddd53, 0xaf17175c, 0x45474701, 0x1a9e9e42, + 0xd4caca0f, 0x582d2db4, 0x2ebfbfc6, 0x3f07071c, + 0xacadad8e, 0xb05a5a75, 0xef838336, 0xb63333cc, + 0x5c636391, 0x12020208, 0x93aaaa92, 0xde7171d9, + 0xc6c8c807, 0xd1191964, 0x3b494939, 0x5fd9d943, + 0x31f2f2ef, 0xa8e3e3ab, 0xb95b5b71, 0xbc88881a, + 0x3e9a9a52, 0x0b262698, 0xbf3232c8, 0x59b0b0fa, + 0xf2e9e983, 0x770f0f3c, 0x33d5d573, 0xf480803a, + 0x27bebec2, 0xebcdcd13, 0x893434d0, 0x3248483d, + 0x54ffffdb, 0x8d7a7af5, 0x6490907a, 0x9d5f5f61, + 0x3d202080, 0x0f6868bd, 0xca1a1a68, 0xb7aeae82, + 0x7db4b4ea, 0xce54544d, 0x7f939376, 0x2f222288, + 0x6364648d, 0x2af1f1e3, 0xcc7373d1, 0x82121248, + 0x7a40401d, 0x48080820, 0x95c3c32b, 0xdfecec97, + 0x4ddbdb4b, 0xc0a1a1be, 0x918d8d0e, 0xc83d3df4, + 0x5b979766, 0x00000000, 0xf9cfcf1b, 0x6e2b2bac, + 0xe17676c5, 0xe6828232, 0x28d6d67f, 0xc31b1b6c, + 0x74b5b5ee, 0xbeafaf86, 0x1d6a6ab5, 0xea50505d, + 0x57454509, 0x38f3f3eb, 0xad3030c0, 0xc4efef9b, + 0xda3f3ffc, 0xc7555549, 0xdba2a2b2, 0xe9eaea8f, + 0x6a656589, 0x03babad2, 0x4a2f2fbc, 0x8ec0c027, + 0x60dede5f, 0xfc1c1c70, 0x46fdfdd3, 0x1f4d4d29, + 0x76929272, 0xfa7575c9, 0x36060618, 0xae8a8a12, + 0x4bb2b2f2, 0x85e6e6bf, 0x7e0e0e38, 0xe71f1f7c, + 0x55626295, 0x3ad4d477, 0x81a8a89a, 0x52969662, + 0x62f9f9c3, 0xa3c5c533, 0x10252594, 0xab595979, + 0xd084842a, 0xc57272d5, 0xec3939e4, 0x164c4c2d, + 0x945e5e65, 0x9f7878fd, 0xe53838e0, 0x988c8c0a, + 0x17d1d163, 0xe4a5a5ae, 0xa1e2e2af, 0x4e616199, + 0x42b3b3f6, 0x34212184, 0x089c9c4a, 0xee1e1e78, + 0x61434311, 0xb1c7c73b, 0x4ffcfcd7, 0x24040410, + 0xe3515159, 0x2599995e, 0x226d6da9, 0x650d0d34, + 0x79fafacf, 0x69dfdf5b, 0xa97e7ee5, 0x19242490, + 0xfe3b3bec, 0x9aabab96, 0xf0cece1f, 0x99111144, + 0x838f8f06, 0x044e4e25, 0x66b7b7e6, 0xe0ebeb8b, + 0xc13c3cf0, 0xfd81813e, 0x4094946a, 0x1cf7f7fb, + 0x18b9b9de, 0x8b13134c, 0x512c2cb0, 0x05d3d36b, + 0x8ce7e7bb, 0x396e6ea5, 0xaac4c437, 0x1b03030c, + 0xdc565645, 0x5e44440d, 0xa07f7fe1, 0x88a9a99e, + 0x672a2aa8, 0x0abbbbd6, 0x87c1c123, 0xf1535351, + 0x72dcdc57, 0x530b0b2c, 0x019d9d4e, 0x2b6c6cad, + 0xa43131c4, 0xf37474cd, 0x15f6f6ff, 0x4c464605, + 0xa5acac8a, 0xb589891e, 0xb4141450, 0xbae1e1a3, + 0xa6161658, 0xf73a3ae8, 0x066969b9, 0x41090924, + 0xd77070dd, 0x6fb6b6e2, 0x1ed0d067, 0xd6eded93, + 0xe2cccc17, 0x68424215, 0x2c98985a, 0xeda4a4aa, + 0x752828a0, 0x865c5c6d, 0x6bf8f8c7, 0xc2868622, + }, + { + 0x30d81818, 0x46262323, 0x91b8c6c6, 0xcdfbe8e8, + 0x13cb8787, 0x6d11b8b8, 0x02090101, 0x9e0d4f4f, + 0x6c9b3636, 0x51ffa6a6, 0xb90cd2d2, 0xf70ef5f5, + 0xf2967979, 0xde306f6f, 0x3f6d9191, 0xa4f85252, + 0xc0476060, 0x6535bcbc, 0x2b379b9b, 0x018a8e8e, + 0x5bd2a3a3, 0x186c0c0c, 0xf6847b7b, 0x6a803535, + 0x3af51d1d, 0xddb3e0e0, 0xb321d7d7, 0x999cc2c2, + 0x5c432e2e, 0x96294b4b, 0xe15dfefe, 0xaed55757, + 0x2abd1515, 0xeee87777, 0x6e923737, 0xd79ee5e5, + 0x23139f9f, 0xfd23f0f0, 0x94204a4a, 0xa944dada, + 0xb0a25858, 0x8fcfc9c9, 0x527c2929, 0x145a0a0a, + 0x7f50b1b1, 0x5dc9a0a0, 0xd6146b6b, 0x17d98585, + 0x673cbdbd, 0xba8f5d5d, 0x20901010, 0xf507f4f4, + 0x8bddcbcb, 0x7cd33e3e, 0x0a2d0505, 0xce786767, + 0xd597e4e4, 0x4e022727, 0x82734141, 0x0ba78b8b, + 0x53f6a7a7, 0xfab27d7d, 0x37499595, 0xad56d8d8, + 0xeb70fbfb, 0xc1cdeeee, 0xf8bb7c7c, 0xcc716666, + 0xa77bdddd, 0x2eaf1717, 0x8e454747, 0x211a9e9e, + 0x89d4caca, 0x5a582d2d, 0x632ebfbf, 0x0e3f0707, + 0x47acadad, 0xb4b05a5a, 0x1bef8383, 0x66b63333, + 0xc65c6363, 0x04120202, 0x4993aaaa, 0xe2de7171, + 0x8dc6c8c8, 0x32d11919, 0x923b4949, 0xaf5fd9d9, + 0xf931f2f2, 0xdba8e3e3, 0xb6b95b5b, 0x0dbc8888, + 0x293e9a9a, 0x4c0b2626, 0x64bf3232, 0x7d59b0b0, + 0xcff2e9e9, 0x1e770f0f, 0xb733d5d5, 0x1df48080, + 0x6127bebe, 0x87ebcdcd, 0x68893434, 0x90324848, + 0xe354ffff, 0xf48d7a7a, 0x3d649090, 0xbe9d5f5f, + 0x403d2020, 0xd00f6868, 0x34ca1a1a, 0x41b7aeae, + 0x757db4b4, 0xa8ce5454, 0x3b7f9393, 0x442f2222, + 0xc8636464, 0xff2af1f1, 0xe6cc7373, 0x24821212, + 0x807a4040, 0x10480808, 0x9b95c3c3, 0xc5dfecec, + 0xab4ddbdb, 0x5fc0a1a1, 0x07918d8d, 0x7ac83d3d, + 0x335b9797, 0x00000000, 0x83f9cfcf, 0x566e2b2b, + 0xece17676, 0x19e68282, 0xb128d6d6, 0x36c31b1b, + 0x7774b5b5, 0x43beafaf, 0xd41d6a6a, 0xa0ea5050, + 0x8a574545, 0xfb38f3f3, 0x60ad3030, 0xc3c4efef, + 0x7eda3f3f, 0xaac75555, 0x59dba2a2, 0xc9e9eaea, + 0xca6a6565, 0x6903baba, 0x5e4a2f2f, 0x9d8ec0c0, + 0xa160dede, 0x38fc1c1c, 0xe746fdfd, 0x9a1f4d4d, + 0x39769292, 0xeafa7575, 0x0c360606, 0x09ae8a8a, + 0x794bb2b2, 0xd185e6e6, 0x1c7e0e0e, 0x3ee71f1f, + 0xc4556262, 0xb53ad4d4, 0x4d81a8a8, 0x31529696, + 0xef62f9f9, 0x97a3c5c5, 0x4a102525, 0xb2ab5959, + 0x15d08484, 0xe4c57272, 0x72ec3939, 0x98164c4c, + 0xbc945e5e, 0xf09f7878, 0x70e53838, 0x05988c8c, + 0xbf17d1d1, 0x57e4a5a5, 0xd9a1e2e2, 0xc24e6161, + 0x7b42b3b3, 0x42342121, 0x25089c9c, 0x3cee1e1e, + 0x86614343, 0x93b1c7c7, 0xe54ffcfc, 0x08240404, + 0xa2e35151, 0x2f259999, 0xda226d6d, 0x1a650d0d, + 0xe979fafa, 0xa369dfdf, 0xfca97e7e, 0x48192424, + 0x76fe3b3b, 0x4b9aabab, 0x81f0cece, 0x22991111, + 0x03838f8f, 0x9c044e4e, 0x7366b7b7, 0xcbe0ebeb, + 0x78c13c3c, 0x1ffd8181, 0x35409494, 0xf31cf7f7, + 0x6f18b9b9, 0x268b1313, 0x58512c2c, 0xbb05d3d3, + 0xd38ce7e7, 0xdc396e6e, 0x95aac4c4, 0x061b0303, + 0xacdc5656, 0x885e4444, 0xfea07f7f, 0x4f88a9a9, + 0x54672a2a, 0x6b0abbbb, 0x9f87c1c1, 0xa6f15353, + 0xa572dcdc, 0x16530b0b, 0x27019d9d, 0xd82b6c6c, + 0x62a43131, 0xe8f37474, 0xf115f6f6, 0x8c4c4646, + 0x45a5acac, 0x0fb58989, 0x28b41414, 0xdfbae1e1, + 0x2ca61616, 0x74f73a3a, 0xd2066969, 0x12410909, + 0xe0d77070, 0x716fb6b6, 0xbd1ed0d0, 0xc7d6eded, + 0x85e2cccc, 0x84684242, 0x2d2c9898, 0x55eda4a4, + 0x50752828, 0xb8865c5c, 0xed6bf8f8, 0x11c28686, + }, + { + 0x7830d818, 0xaf462623, 0xf991b8c6, 0x6fcdfbe8, + 0xa113cb87, 0x626d11b8, 0x05020901, 0x6e9e0d4f, + 0xee6c9b36, 0x0451ffa6, 0xbdb90cd2, 0x06f70ef5, + 0x80f29679, 0xcede306f, 0xef3f6d91, 0x07a4f852, + 0xfdc04760, 0x766535bc, 0xcd2b379b, 0x8c018a8e, + 0x155bd2a3, 0x3c186c0c, 0x8af6847b, 0xe16a8035, + 0x693af51d, 0x47ddb3e0, 0xacb321d7, 0xed999cc2, + 0x965c432e, 0x7a96294b, 0x21e15dfe, 0x16aed557, + 0x412abd15, 0xb6eee877, 0xeb6e9237, 0x56d79ee5, + 0xd923139f, 0x17fd23f0, 0x7f94204a, 0x95a944da, + 0x25b0a258, 0xca8fcfc9, 0x8d527c29, 0x22145a0a, + 0x4f7f50b1, 0x1a5dc9a0, 0xdad6146b, 0xab17d985, + 0x73673cbd, 0x34ba8f5d, 0x50209010, 0x03f507f4, + 0xc08bddcb, 0xc67cd33e, 0x110a2d05, 0xe6ce7867, + 0x53d597e4, 0xbb4e0227, 0x58827341, 0x9d0ba78b, + 0x0153f6a7, 0x94fab27d, 0xfb374995, 0x9fad56d8, + 0x30eb70fb, 0x71c1cdee, 0x91f8bb7c, 0xe3cc7166, + 0x8ea77bdd, 0x4b2eaf17, 0x468e4547, 0xdc211a9e, + 0xc589d4ca, 0x995a582d, 0x79632ebf, 0x1b0e3f07, + 0x2347acad, 0x2fb4b05a, 0xb51bef83, 0xff66b633, + 0xf2c65c63, 0x0a041202, 0x384993aa, 0xa8e2de71, + 0xcf8dc6c8, 0x7d32d119, 0x70923b49, 0x9aaf5fd9, + 0x1df931f2, 0x48dba8e3, 0x2ab6b95b, 0x920dbc88, + 0xc8293e9a, 0xbe4c0b26, 0xfa64bf32, 0x4a7d59b0, + 0x6acff2e9, 0x331e770f, 0xa6b733d5, 0xba1df480, + 0x7c6127be, 0xde87ebcd, 0xe4688934, 0x75903248, + 0x24e354ff, 0x8ff48d7a, 0xea3d6490, 0x3ebe9d5f, + 0xa0403d20, 0xd5d00f68, 0x7234ca1a, 0x2c41b7ae, + 0x5e757db4, 0x19a8ce54, 0xe53b7f93, 0xaa442f22, + 0xe9c86364, 0x12ff2af1, 0xa2e6cc73, 0x5a248212, + 0x5d807a40, 0x28104808, 0xe89b95c3, 0x7bc5dfec, + 0x90ab4ddb, 0x1f5fc0a1, 0x8307918d, 0xc97ac83d, + 0xf1335b97, 0x00000000, 0xd483f9cf, 0x87566e2b, + 0xb3ece176, 0xb019e682, 0xa9b128d6, 0x7736c31b, + 0x5b7774b5, 0x2943beaf, 0xdfd41d6a, 0x0da0ea50, + 0x4c8a5745, 0x18fb38f3, 0xf060ad30, 0x74c3c4ef, + 0xc37eda3f, 0x1caac755, 0x1059dba2, 0x65c9e9ea, + 0xecca6a65, 0x686903ba, 0x935e4a2f, 0xe79d8ec0, + 0x81a160de, 0x6c38fc1c, 0x2ee746fd, 0x649a1f4d, + 0xe0397692, 0xbceafa75, 0x1e0c3606, 0x9809ae8a, + 0x40794bb2, 0x59d185e6, 0x361c7e0e, 0x633ee71f, + 0xf7c45562, 0xa3b53ad4, 0x324d81a8, 0xf4315296, + 0x3aef62f9, 0xf697a3c5, 0xb14a1025, 0x20b2ab59, + 0xae15d084, 0xa7e4c572, 0xdd72ec39, 0x6198164c, + 0x3bbc945e, 0x85f09f78, 0xd870e538, 0x8605988c, + 0xb2bf17d1, 0x0b57e4a5, 0x4dd9a1e2, 0xf8c24e61, + 0x457b42b3, 0xa5423421, 0xd625089c, 0x663cee1e, + 0x52866143, 0xfc93b1c7, 0x2be54ffc, 0x14082404, + 0x08a2e351, 0xc72f2599, 0xc4da226d, 0x391a650d, + 0x35e979fa, 0x84a369df, 0x9bfca97e, 0xb4481924, + 0xd776fe3b, 0x3d4b9aab, 0xd181f0ce, 0x55229911, + 0x8903838f, 0x6b9c044e, 0x517366b7, 0x60cbe0eb, + 0xcc78c13c, 0xbf1ffd81, 0xfe354094, 0x0cf31cf7, + 0x676f18b9, 0x5f268b13, 0x9c58512c, 0xb8bb05d3, + 0x5cd38ce7, 0xcbdc396e, 0xf395aac4, 0x0f061b03, + 0x13acdc56, 0x49885e44, 0x9efea07f, 0x374f88a9, + 0x8254672a, 0x6d6b0abb, 0xe29f87c1, 0x02a6f153, + 0x8ba572dc, 0x2716530b, 0xd327019d, 0xc1d82b6c, + 0xf562a431, 0xb9e8f374, 0x09f115f6, 0x438c4c46, + 0x2645a5ac, 0x970fb589, 0x4428b414, 0x42dfbae1, + 0x4e2ca616, 0xd274f73a, 0xd0d20669, 0x2d124109, + 0xade0d770, 0x54716fb6, 0xb7bd1ed0, 0x7ec7d6ed, + 0xdb85e2cc, 0x57846842, 0xc22d2c98, 0x0e55eda4, + 0x88507528, 0x31b8865c, 0x3fed6bf8, 0xa411c286, + }, +}; + +#ifdef VECT_SIZE1 +#define BOX(S,n,i) (u32) ((S)[(n)][(i)]) +#endif + +__device__ __constant__ u32 rch[R + 1] = +{ + 0x00000000, + 0x1823c6e8, + 0x36a6d2f5, + 0x60bc9b8e, + 0x1de0d7c2, + 0x157737e5, + 0x58c9290a, + 0xbd5d10f4, + 0xe427418b, + 0xfbee7c66, + 0xca2dbf07, +}; + +__device__ __constant__ u32 rcl[R + 1] = +{ + 0x00000000, + 0x87b8014f, + 0x796f9152, + 0xa30c7b35, + 0x2e4bfe57, + 0x9ff04ada, + 0xb1a06b85, + 0xcb3e0567, + 0xa77d95d8, + 0xdd17479e, + 0xad5a8333, +}; + +typedef unsigned char uchar; + +__device__ static void whirlpool_transform (const u32 w[16], u32 dgst[16], u32 s_Ch[8][256], u32 s_Cl[8][256]) +{ + u32 Kh[8]; + u32 Kl[8]; + + Kh[0] = dgst[ 0]; + Kl[0] = dgst[ 1]; + Kh[1] = dgst[ 2]; + Kl[1] = dgst[ 3]; + Kh[2] = dgst[ 4]; + Kl[2] = dgst[ 5]; + Kh[3] = dgst[ 6]; + Kl[3] = dgst[ 7]; + Kh[4] = dgst[ 8]; + Kl[4] = dgst[ 9]; + Kh[5] = dgst[10]; + Kl[5] = dgst[11]; + Kh[6] = dgst[12]; + Kl[6] = dgst[13]; + Kh[7] = dgst[14]; + Kl[7] = dgst[15]; + + u32 stateh[8]; + u32 statel[8]; + + stateh[0] = w[ 0] ^ Kh[0]; + statel[0] = w[ 1] ^ Kl[0]; + stateh[1] = w[ 2] ^ Kh[1]; + statel[1] = w[ 3] ^ Kl[1]; + stateh[2] = w[ 4] ^ Kh[2]; + statel[2] = w[ 5] ^ Kl[2]; + stateh[3] = w[ 6] ^ Kh[3]; + statel[3] = w[ 7] ^ Kl[3]; + stateh[4] = w[ 8] ^ Kh[4]; + statel[4] = w[ 9] ^ Kl[4]; + stateh[5] = w[10] ^ Kh[5]; + statel[5] = w[11] ^ Kl[5]; + stateh[6] = w[12] ^ Kh[6]; + statel[6] = w[13] ^ Kl[6]; + stateh[7] = w[14] ^ Kh[7]; + statel[7] = w[15] ^ Kl[7]; + + u32 r; + + for (r = 1; r <= R; r++) + { + u32 Lh[8]; + u32 Ll[8]; + + u32 i; + + #pragma unroll 8 + for (i = 0; i < 8; i++) + { + const u8 Lp0 = Kh[(i + 8) & 7] >> 24; + const u8 Lp1 = Kh[(i + 7) & 7] >> 16; + const u8 Lp2 = Kh[(i + 6) & 7] >> 8; + const u8 Lp3 = Kh[(i + 5) & 7] >> 0; + const u8 Lp4 = Kl[(i + 4) & 7] >> 24; + const u8 Lp5 = Kl[(i + 3) & 7] >> 16; + const u8 Lp6 = Kl[(i + 2) & 7] >> 8; + const u8 Lp7 = Kl[(i + 1) & 7] >> 0; + + Lh[i] = BOX (s_Ch, 0, Lp0 & 0xff) + ^ BOX (s_Ch, 1, Lp1 & 0xff) + ^ BOX (s_Ch, 2, Lp2 & 0xff) + ^ BOX (s_Ch, 3, Lp3 & 0xff) + ^ BOX (s_Ch, 4, Lp4 & 0xff) + ^ BOX (s_Ch, 5, Lp5 & 0xff) + ^ BOX (s_Ch, 6, Lp6 & 0xff) + ^ BOX (s_Ch, 7, Lp7 & 0xff); + + Ll[i] = BOX (s_Cl, 0, Lp0 & 0xff) + ^ BOX (s_Cl, 1, Lp1 & 0xff) + ^ BOX (s_Cl, 2, Lp2 & 0xff) + ^ BOX (s_Cl, 3, Lp3 & 0xff) + ^ BOX (s_Cl, 4, Lp4 & 0xff) + ^ BOX (s_Cl, 5, Lp5 & 0xff) + ^ BOX (s_Cl, 6, Lp6 & 0xff) + ^ BOX (s_Cl, 7, Lp7 & 0xff); + } + + Kh[0] = Lh[0] ^ rch[r]; + Kl[0] = Ll[0] ^ rcl[r]; + Kh[1] = Lh[1]; + Kl[1] = Ll[1]; + Kh[2] = Lh[2]; + Kl[2] = Ll[2]; + Kh[3] = Lh[3]; + Kl[3] = Ll[3]; + Kh[4] = Lh[4]; + Kl[4] = Ll[4]; + Kh[5] = Lh[5]; + Kl[5] = Ll[5]; + Kh[6] = Lh[6]; + Kl[6] = Ll[6]; + Kh[7] = Lh[7]; + Kl[7] = Ll[7]; + + #pragma unroll 8 + for (i = 0; i < 8; i++) + { + const u8 Lp0 = stateh[(i + 8) & 7] >> 24; + const u8 Lp1 = stateh[(i + 7) & 7] >> 16; + const u8 Lp2 = stateh[(i + 6) & 7] >> 8; + const u8 Lp3 = stateh[(i + 5) & 7] >> 0; + const u8 Lp4 = statel[(i + 4) & 7] >> 24; + const u8 Lp5 = statel[(i + 3) & 7] >> 16; + const u8 Lp6 = statel[(i + 2) & 7] >> 8; + const u8 Lp7 = statel[(i + 1) & 7] >> 0; + + Lh[i] = BOX (s_Ch, 0, Lp0 & 0xff) + ^ BOX (s_Ch, 1, Lp1 & 0xff) + ^ BOX (s_Ch, 2, Lp2 & 0xff) + ^ BOX (s_Ch, 3, Lp3 & 0xff) + ^ BOX (s_Ch, 4, Lp4 & 0xff) + ^ BOX (s_Ch, 5, Lp5 & 0xff) + ^ BOX (s_Ch, 6, Lp6 & 0xff) + ^ BOX (s_Ch, 7, Lp7 & 0xff); + + Ll[i] = BOX (s_Cl, 0, Lp0 & 0xff) + ^ BOX (s_Cl, 1, Lp1 & 0xff) + ^ BOX (s_Cl, 2, Lp2 & 0xff) + ^ BOX (s_Cl, 3, Lp3 & 0xff) + ^ BOX (s_Cl, 4, Lp4 & 0xff) + ^ BOX (s_Cl, 5, Lp5 & 0xff) + ^ BOX (s_Cl, 6, Lp6 & 0xff) + ^ BOX (s_Cl, 7, Lp7 & 0xff); + } + + stateh[0] = Lh[0] ^ Kh[0]; + statel[0] = Ll[0] ^ Kl[0]; + stateh[1] = Lh[1] ^ Kh[1]; + statel[1] = Ll[1] ^ Kl[1]; + stateh[2] = Lh[2] ^ Kh[2]; + statel[2] = Ll[2] ^ Kl[2]; + stateh[3] = Lh[3] ^ Kh[3]; + statel[3] = Ll[3] ^ Kl[3]; + stateh[4] = Lh[4] ^ Kh[4]; + statel[4] = Ll[4] ^ Kl[4]; + stateh[5] = Lh[5] ^ Kh[5]; + statel[5] = Ll[5] ^ Kl[5]; + stateh[6] = Lh[6] ^ Kh[6]; + statel[6] = Ll[6] ^ Kl[6]; + stateh[7] = Lh[7] ^ Kh[7]; + statel[7] = Ll[7] ^ Kl[7]; + } + + dgst[ 0] ^= stateh[0] ^ w[ 0]; + dgst[ 1] ^= statel[0] ^ w[ 1]; + dgst[ 2] ^= stateh[1] ^ w[ 2]; + dgst[ 3] ^= statel[1] ^ w[ 3]; + dgst[ 4] ^= stateh[2] ^ w[ 4]; + dgst[ 5] ^= statel[2] ^ w[ 5]; + dgst[ 6] ^= stateh[3] ^ w[ 6]; + dgst[ 7] ^= statel[3] ^ w[ 7]; + dgst[ 8] ^= stateh[4] ^ w[ 8]; + dgst[ 9] ^= statel[4] ^ w[ 9]; + dgst[10] ^= stateh[5] ^ w[10]; + dgst[11] ^= statel[5] ^ w[11]; + dgst[12] ^= stateh[6] ^ w[12]; + dgst[13] ^= statel[6] ^ w[13]; + dgst[14] ^= stateh[7] ^ w[14]; + dgst[15] ^= statel[7] ^ w[15]; +} + +__device__ static void hmac_run2 (const u32 w1[16], const u32 w2[16], const u32 ipad[16], const u32 opad[16], u32 dgst[16], u32 s_Ch[8][256], u32 s_Cl[8][256]) +{ + dgst[ 0] = ipad[ 0]; + dgst[ 1] = ipad[ 1]; + dgst[ 2] = ipad[ 2]; + dgst[ 3] = ipad[ 3]; + dgst[ 4] = ipad[ 4]; + dgst[ 5] = ipad[ 5]; + dgst[ 6] = ipad[ 6]; + dgst[ 7] = ipad[ 7]; + dgst[ 8] = ipad[ 8]; + dgst[ 9] = ipad[ 9]; + dgst[10] = ipad[10]; + dgst[11] = ipad[11]; + dgst[12] = ipad[12]; + dgst[13] = ipad[13]; + dgst[14] = ipad[14]; + dgst[15] = ipad[15]; + + whirlpool_transform (w1, dgst, s_Ch, s_Cl); + whirlpool_transform (w2, dgst, s_Ch, s_Cl); + + u32 w[16]; + + w[ 0] = dgst[ 0]; + w[ 1] = dgst[ 1]; + w[ 2] = dgst[ 2]; + w[ 3] = dgst[ 3]; + w[ 4] = dgst[ 4]; + w[ 5] = dgst[ 5]; + w[ 6] = dgst[ 6]; + w[ 7] = dgst[ 7]; + w[ 8] = dgst[ 8]; + w[ 9] = dgst[ 9]; + w[10] = dgst[10]; + w[11] = dgst[11]; + w[12] = dgst[12]; + w[13] = dgst[13]; + w[14] = dgst[14]; + w[15] = dgst[15]; + + dgst[ 0] = opad[ 0]; + dgst[ 1] = opad[ 1]; + dgst[ 2] = opad[ 2]; + dgst[ 3] = opad[ 3]; + dgst[ 4] = opad[ 4]; + dgst[ 5] = opad[ 5]; + dgst[ 6] = opad[ 6]; + dgst[ 7] = opad[ 7]; + dgst[ 8] = opad[ 8]; + dgst[ 9] = opad[ 9]; + dgst[10] = opad[10]; + dgst[11] = opad[11]; + dgst[12] = opad[12]; + dgst[13] = opad[13]; + dgst[14] = opad[14]; + dgst[15] = opad[15]; + + whirlpool_transform (w, dgst, s_Ch, s_Cl); + + w[ 0] = 0x80000000; + w[ 1] = 0; + w[ 2] = 0; + w[ 3] = 0; + w[ 4] = 0; + w[ 5] = 0; + w[ 6] = 0; + w[ 7] = 0; + w[ 8] = 0; + w[ 9] = 0; + w[10] = 0; + w[11] = 0; + w[12] = 0; + w[13] = 0; + w[14] = 0; + w[15] = (64 + 64) * 8; + + whirlpool_transform (w, dgst, s_Ch, s_Cl); +} + +__device__ static void hmac_init (u32 w[16], u32 ipad[16], u32 opad[16], u32 s_Ch[8][256], u32 s_Cl[8][256]) +{ + w[ 0] ^= 0x36363636; + w[ 1] ^= 0x36363636; + w[ 2] ^= 0x36363636; + w[ 3] ^= 0x36363636; + w[ 4] ^= 0x36363636; + w[ 5] ^= 0x36363636; + w[ 6] ^= 0x36363636; + w[ 7] ^= 0x36363636; + w[ 8] ^= 0x36363636; + w[ 9] ^= 0x36363636; + w[10] ^= 0x36363636; + w[11] ^= 0x36363636; + w[12] ^= 0x36363636; + w[13] ^= 0x36363636; + w[14] ^= 0x36363636; + w[15] ^= 0x36363636; + + ipad[ 0] = 0; + ipad[ 1] = 0; + ipad[ 2] = 0; + ipad[ 3] = 0; + ipad[ 4] = 0; + ipad[ 5] = 0; + ipad[ 6] = 0; + ipad[ 7] = 0; + ipad[ 8] = 0; + ipad[ 9] = 0; + ipad[10] = 0; + ipad[11] = 0; + ipad[12] = 0; + ipad[13] = 0; + ipad[14] = 0; + ipad[15] = 0; + + whirlpool_transform (w, ipad, s_Ch, s_Cl); + + w[ 0] ^= 0x6a6a6a6a; + w[ 1] ^= 0x6a6a6a6a; + w[ 2] ^= 0x6a6a6a6a; + w[ 3] ^= 0x6a6a6a6a; + w[ 4] ^= 0x6a6a6a6a; + w[ 5] ^= 0x6a6a6a6a; + w[ 6] ^= 0x6a6a6a6a; + w[ 7] ^= 0x6a6a6a6a; + w[ 8] ^= 0x6a6a6a6a; + w[ 9] ^= 0x6a6a6a6a; + w[10] ^= 0x6a6a6a6a; + w[11] ^= 0x6a6a6a6a; + w[12] ^= 0x6a6a6a6a; + w[13] ^= 0x6a6a6a6a; + w[14] ^= 0x6a6a6a6a; + w[15] ^= 0x6a6a6a6a; + + opad[ 0] = 0; + opad[ 1] = 0; + opad[ 2] = 0; + opad[ 3] = 0; + opad[ 4] = 0; + opad[ 5] = 0; + opad[ 6] = 0; + opad[ 7] = 0; + opad[ 8] = 0; + opad[ 9] = 0; + opad[10] = 0; + opad[11] = 0; + opad[12] = 0; + opad[13] = 0; + opad[14] = 0; + opad[15] = 0; + + whirlpool_transform (w, opad, s_Ch, s_Cl); +} + +__device__ static u32 u8add (const u32 a, const u32 b) +{ + const u32 a1 = (a >> 0) & 0xff; + const u32 a2 = (a >> 8) & 0xff; + const u32 a3 = (a >> 16) & 0xff; + const u32 a4 = (a >> 24) & 0xff; + + const u32 b1 = (b >> 0) & 0xff; + const u32 b2 = (b >> 8) & 0xff; + const u32 b3 = (b >> 16) & 0xff; + const u32 b4 = (b >> 24) & 0xff; + + const u32 r1 = (a1 + b1) & 0xff; + const u32 r2 = (a2 + b2) & 0xff; + const u32 r3 = (a3 + b3) & 0xff; + const u32 r4 = (a4 + b4) & 0xff; + + const u32 r = r1 << 0 + | r2 << 8 + | r3 << 16 + | r4 << 24; + + return r; +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m06233_init (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, tc_tmp_t *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const tc_t *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = pws[gid].i[ 8]; + w2[1] = pws[gid].i[ 9]; + w2[2] = pws[gid].i[10]; + w2[3] = pws[gid].i[11]; + + u32x w3[4]; + + w3[0] = pws[gid].i[12]; + w3[1] = pws[gid].i[13]; + w3[2] = pws[gid].i[14]; + w3[3] = pws[gid].i[15]; + + /** + * keyfile + */ + + w0[0] = u8add (w0[0], esalt_bufs[salt_pos].keyfile_buf[ 0]); + w0[1] = u8add (w0[1], esalt_bufs[salt_pos].keyfile_buf[ 1]); + w0[2] = u8add (w0[2], esalt_bufs[salt_pos].keyfile_buf[ 2]); + w0[3] = u8add (w0[3], esalt_bufs[salt_pos].keyfile_buf[ 3]); + w1[0] = u8add (w1[0], esalt_bufs[salt_pos].keyfile_buf[ 4]); + w1[1] = u8add (w1[1], esalt_bufs[salt_pos].keyfile_buf[ 5]); + w1[2] = u8add (w1[2], esalt_bufs[salt_pos].keyfile_buf[ 6]); + w1[3] = u8add (w1[3], esalt_bufs[salt_pos].keyfile_buf[ 7]); + w2[0] = u8add (w2[0], esalt_bufs[salt_pos].keyfile_buf[ 8]); + w2[1] = u8add (w2[1], esalt_bufs[salt_pos].keyfile_buf[ 9]); + w2[2] = u8add (w2[2], esalt_bufs[salt_pos].keyfile_buf[10]); + w2[3] = u8add (w2[3], esalt_bufs[salt_pos].keyfile_buf[11]); + w3[0] = u8add (w3[0], esalt_bufs[salt_pos].keyfile_buf[12]); + w3[1] = u8add (w3[1], esalt_bufs[salt_pos].keyfile_buf[13]); + w3[2] = u8add (w3[2], esalt_bufs[salt_pos].keyfile_buf[14]); + w3[3] = u8add (w3[3], esalt_bufs[salt_pos].keyfile_buf[15]); + + /** + * shared mem + */ + + __shared__ u32 s_Ch[8][256]; + __shared__ u32 s_Cl[8][256]; + + const u32 lid = threadIdx.x; + + #pragma unroll 8 + for (u32 i = 0; i < 8; i++) + { + s_Ch[i][lid] = Ch[i][lid]; + s_Cl[i][lid] = Cl[i][lid]; + } + + __syncthreads (); + + if (gid >= gid_max) return; + + /** + * salt + */ + + u32 salt_buf1[16]; + + salt_buf1[ 0] = swap_workaround (esalt_bufs[salt_pos].salt_buf[ 0]); + salt_buf1[ 1] = swap_workaround (esalt_bufs[salt_pos].salt_buf[ 1]); + salt_buf1[ 2] = swap_workaround (esalt_bufs[salt_pos].salt_buf[ 2]); + salt_buf1[ 3] = swap_workaround (esalt_bufs[salt_pos].salt_buf[ 3]); + salt_buf1[ 4] = swap_workaround (esalt_bufs[salt_pos].salt_buf[ 4]); + salt_buf1[ 5] = swap_workaround (esalt_bufs[salt_pos].salt_buf[ 5]); + salt_buf1[ 6] = swap_workaround (esalt_bufs[salt_pos].salt_buf[ 6]); + salt_buf1[ 7] = swap_workaround (esalt_bufs[salt_pos].salt_buf[ 7]); + salt_buf1[ 8] = swap_workaround (esalt_bufs[salt_pos].salt_buf[ 8]); + salt_buf1[ 9] = swap_workaround (esalt_bufs[salt_pos].salt_buf[ 9]); + salt_buf1[10] = swap_workaround (esalt_bufs[salt_pos].salt_buf[10]); + salt_buf1[11] = swap_workaround (esalt_bufs[salt_pos].salt_buf[11]); + salt_buf1[12] = swap_workaround (esalt_bufs[salt_pos].salt_buf[12]); + salt_buf1[13] = swap_workaround (esalt_bufs[salt_pos].salt_buf[13]); + salt_buf1[14] = swap_workaround (esalt_bufs[salt_pos].salt_buf[14]); + salt_buf1[15] = swap_workaround (esalt_bufs[salt_pos].salt_buf[15]); + + u32 salt_buf2[16]; + + salt_buf2[ 0] = 0; + salt_buf2[ 1] = 0x80000000; + salt_buf2[ 2] = 0; + salt_buf2[ 3] = 0; + salt_buf2[ 4] = 0; + salt_buf2[ 5] = 0; + salt_buf2[ 6] = 0; + salt_buf2[ 7] = 0; + salt_buf2[ 8] = 0; + salt_buf2[ 9] = 0; + salt_buf2[10] = 0; + salt_buf2[11] = 0; + salt_buf2[12] = 0; + salt_buf2[13] = 0; + salt_buf2[14] = 0; + salt_buf2[15] = (64 + 64 + 4) * 8; + + const u32 truecrypt_mdlen = salt_bufs[0].truecrypt_mdlen; + + u32 w[16]; + + w[ 0] = swap_workaround (w0[0]); + w[ 1] = swap_workaround (w0[1]); + w[ 2] = swap_workaround (w0[2]); + w[ 3] = swap_workaround (w0[3]); + w[ 4] = swap_workaround (w1[0]); + w[ 5] = swap_workaround (w1[1]); + w[ 6] = swap_workaround (w1[2]); + w[ 7] = swap_workaround (w1[3]); + w[ 8] = swap_workaround (w2[0]); + w[ 9] = swap_workaround (w2[1]); + w[10] = swap_workaround (w2[2]); + w[11] = swap_workaround (w2[3]); + w[12] = swap_workaround (w3[0]); + w[13] = swap_workaround (w3[1]); + w[14] = swap_workaround (w3[2]); + w[15] = swap_workaround (w3[3]); + + u32 ipad[16]; + u32 opad[16]; + + hmac_init (w, ipad, opad, s_Ch, s_Cl); + + tmps[gid].ipad[ 0] = ipad[ 0]; + tmps[gid].ipad[ 1] = ipad[ 1]; + tmps[gid].ipad[ 2] = ipad[ 2]; + tmps[gid].ipad[ 3] = ipad[ 3]; + tmps[gid].ipad[ 4] = ipad[ 4]; + tmps[gid].ipad[ 5] = ipad[ 5]; + tmps[gid].ipad[ 6] = ipad[ 6]; + tmps[gid].ipad[ 7] = ipad[ 7]; + tmps[gid].ipad[ 8] = ipad[ 8]; + tmps[gid].ipad[ 9] = ipad[ 9]; + tmps[gid].ipad[10] = ipad[10]; + tmps[gid].ipad[11] = ipad[11]; + tmps[gid].ipad[12] = ipad[12]; + tmps[gid].ipad[13] = ipad[13]; + tmps[gid].ipad[14] = ipad[14]; + tmps[gid].ipad[15] = ipad[15]; + + tmps[gid].opad[ 0] = opad[ 0]; + tmps[gid].opad[ 1] = opad[ 1]; + tmps[gid].opad[ 2] = opad[ 2]; + tmps[gid].opad[ 3] = opad[ 3]; + tmps[gid].opad[ 4] = opad[ 4]; + tmps[gid].opad[ 5] = opad[ 5]; + tmps[gid].opad[ 6] = opad[ 6]; + tmps[gid].opad[ 7] = opad[ 7]; + tmps[gid].opad[ 8] = opad[ 8]; + tmps[gid].opad[ 9] = opad[ 9]; + tmps[gid].opad[10] = opad[10]; + tmps[gid].opad[11] = opad[11]; + tmps[gid].opad[12] = opad[12]; + tmps[gid].opad[13] = opad[13]; + tmps[gid].opad[14] = opad[14]; + tmps[gid].opad[15] = opad[15]; + + for (u32 i = 0, j = 1; i < (truecrypt_mdlen / 8 / 4); i += 16, j += 1) + { + salt_buf2[0] = j; + + u32 dgst[16]; + + hmac_run2 (salt_buf1, salt_buf2, ipad, opad, dgst, s_Ch, s_Cl); + + tmps[gid].dgst[i + 0] = dgst[ 0]; + tmps[gid].dgst[i + 1] = dgst[ 1]; + tmps[gid].dgst[i + 2] = dgst[ 2]; + tmps[gid].dgst[i + 3] = dgst[ 3]; + tmps[gid].dgst[i + 4] = dgst[ 4]; + tmps[gid].dgst[i + 5] = dgst[ 5]; + tmps[gid].dgst[i + 6] = dgst[ 6]; + tmps[gid].dgst[i + 7] = dgst[ 7]; + tmps[gid].dgst[i + 8] = dgst[ 8]; + tmps[gid].dgst[i + 9] = dgst[ 9]; + tmps[gid].dgst[i + 10] = dgst[10]; + tmps[gid].dgst[i + 11] = dgst[11]; + tmps[gid].dgst[i + 12] = dgst[12]; + tmps[gid].dgst[i + 13] = dgst[13]; + tmps[gid].dgst[i + 14] = dgst[14]; + tmps[gid].dgst[i + 15] = dgst[15]; + + tmps[gid].out[i + 0] = dgst[ 0]; + tmps[gid].out[i + 1] = dgst[ 1]; + tmps[gid].out[i + 2] = dgst[ 2]; + tmps[gid].out[i + 3] = dgst[ 3]; + tmps[gid].out[i + 4] = dgst[ 4]; + tmps[gid].out[i + 5] = dgst[ 5]; + tmps[gid].out[i + 6] = dgst[ 6]; + tmps[gid].out[i + 7] = dgst[ 7]; + tmps[gid].out[i + 8] = dgst[ 8]; + tmps[gid].out[i + 9] = dgst[ 9]; + tmps[gid].out[i + 10] = dgst[10]; + tmps[gid].out[i + 11] = dgst[11]; + tmps[gid].out[i + 12] = dgst[12]; + tmps[gid].out[i + 13] = dgst[13]; + tmps[gid].out[i + 14] = dgst[14]; + tmps[gid].out[i + 15] = dgst[15]; + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m06233_loop (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, tc_tmp_t *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const tc_t *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + const u32 truecrypt_mdlen = salt_bufs[0].truecrypt_mdlen; + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + __shared__ u32 s_Ch[8][256]; + __shared__ u32 s_Cl[8][256]; + + const u32 lid = threadIdx.x; + + #pragma unroll 8 + for (u32 i = 0; i < 8; i++) + { + s_Ch[i][lid] = Ch[i][lid]; + s_Cl[i][lid] = Cl[i][lid]; + } + + __syncthreads (); + + if (gid >= gid_max) return; + + u32 ipad[16]; + + ipad[ 0] = tmps[gid].ipad[ 0]; + ipad[ 1] = tmps[gid].ipad[ 1], + ipad[ 2] = tmps[gid].ipad[ 2]; + ipad[ 3] = tmps[gid].ipad[ 3]; + ipad[ 4] = tmps[gid].ipad[ 4]; + ipad[ 5] = tmps[gid].ipad[ 5]; + ipad[ 6] = tmps[gid].ipad[ 6], + ipad[ 7] = tmps[gid].ipad[ 7]; + ipad[ 8] = tmps[gid].ipad[ 8]; + ipad[ 9] = tmps[gid].ipad[ 9]; + ipad[10] = tmps[gid].ipad[10]; + ipad[11] = tmps[gid].ipad[11], + ipad[12] = tmps[gid].ipad[12]; + ipad[13] = tmps[gid].ipad[13]; + ipad[14] = tmps[gid].ipad[14]; + ipad[15] = tmps[gid].ipad[15]; + + u32 opad[16]; + + opad[ 0] = tmps[gid].opad[ 0]; + opad[ 1] = tmps[gid].opad[ 1], + opad[ 2] = tmps[gid].opad[ 2]; + opad[ 3] = tmps[gid].opad[ 3]; + opad[ 4] = tmps[gid].opad[ 4]; + opad[ 5] = tmps[gid].opad[ 5]; + opad[ 6] = tmps[gid].opad[ 6], + opad[ 7] = tmps[gid].opad[ 7]; + opad[ 8] = tmps[gid].opad[ 8]; + opad[ 9] = tmps[gid].opad[ 9]; + opad[10] = tmps[gid].opad[10]; + opad[11] = tmps[gid].opad[11], + opad[12] = tmps[gid].opad[12]; + opad[13] = tmps[gid].opad[13]; + opad[14] = tmps[gid].opad[14]; + opad[15] = tmps[gid].opad[15]; + + for (u32 i = 0; i < (truecrypt_mdlen / 8 / 4); i += 16) + { + u32 dgst[16]; + + dgst[ 0] = tmps[gid].dgst[i + 0]; + dgst[ 1] = tmps[gid].dgst[i + 1]; + dgst[ 2] = tmps[gid].dgst[i + 2]; + dgst[ 3] = tmps[gid].dgst[i + 3]; + dgst[ 4] = tmps[gid].dgst[i + 4]; + dgst[ 5] = tmps[gid].dgst[i + 5]; + dgst[ 6] = tmps[gid].dgst[i + 6]; + dgst[ 7] = tmps[gid].dgst[i + 7]; + dgst[ 8] = tmps[gid].dgst[i + 8]; + dgst[ 9] = tmps[gid].dgst[i + 9]; + dgst[10] = tmps[gid].dgst[i + 10]; + dgst[11] = tmps[gid].dgst[i + 11]; + dgst[12] = tmps[gid].dgst[i + 12]; + dgst[13] = tmps[gid].dgst[i + 13]; + dgst[14] = tmps[gid].dgst[i + 14]; + dgst[15] = tmps[gid].dgst[i + 15]; + + u32 out[16]; + + out[ 0] = tmps[gid].out[i + 0]; + out[ 1] = tmps[gid].out[i + 1]; + out[ 2] = tmps[gid].out[i + 2]; + out[ 3] = tmps[gid].out[i + 3]; + out[ 4] = tmps[gid].out[i + 4]; + out[ 5] = tmps[gid].out[i + 5]; + out[ 6] = tmps[gid].out[i + 6]; + out[ 7] = tmps[gid].out[i + 7]; + out[ 8] = tmps[gid].out[i + 8]; + out[ 9] = tmps[gid].out[i + 9]; + out[10] = tmps[gid].out[i + 10]; + out[11] = tmps[gid].out[i + 11]; + out[12] = tmps[gid].out[i + 12]; + out[13] = tmps[gid].out[i + 13]; + out[14] = tmps[gid].out[i + 14]; + out[15] = tmps[gid].out[i + 15]; + + for (u32 j = 0; j < loop_cnt; j++) + { + u32 w1[16]; + + w1[ 0] = dgst[ 0]; + w1[ 1] = dgst[ 1]; + w1[ 2] = dgst[ 2]; + w1[ 3] = dgst[ 3]; + w1[ 4] = dgst[ 4]; + w1[ 5] = dgst[ 5]; + w1[ 6] = dgst[ 6]; + w1[ 7] = dgst[ 7]; + w1[ 8] = dgst[ 8]; + w1[ 9] = dgst[ 9]; + w1[10] = dgst[10]; + w1[11] = dgst[11]; + w1[12] = dgst[12]; + w1[13] = dgst[13]; + w1[14] = dgst[14]; + w1[15] = dgst[15]; + + u32 w2[16]; + + w2[ 0] = 0x80000000; + w2[ 1] = 0; + w2[ 2] = 0; + w2[ 3] = 0; + w2[ 4] = 0; + w2[ 5] = 0; + w2[ 6] = 0; + w2[ 7] = 0; + w2[ 8] = 0; + w2[ 9] = 0; + w2[10] = 0; + w2[11] = 0; + w2[12] = 0; + w2[13] = 0; + w2[14] = 0; + w2[15] = (64 + 64) * 8; + + hmac_run2 (w1, w2, ipad, opad, dgst, s_Ch, s_Cl); + + out[ 0] ^= dgst[ 0]; + out[ 1] ^= dgst[ 1]; + out[ 2] ^= dgst[ 2]; + out[ 3] ^= dgst[ 3]; + out[ 4] ^= dgst[ 4]; + out[ 5] ^= dgst[ 5]; + out[ 6] ^= dgst[ 6]; + out[ 7] ^= dgst[ 7]; + out[ 8] ^= dgst[ 8]; + out[ 9] ^= dgst[ 9]; + out[10] ^= dgst[10]; + out[11] ^= dgst[11]; + out[12] ^= dgst[12]; + out[13] ^= dgst[13]; + out[14] ^= dgst[14]; + out[15] ^= dgst[15]; + } + + tmps[gid].dgst[i + 0] = dgst[ 0]; + tmps[gid].dgst[i + 1] = dgst[ 1]; + tmps[gid].dgst[i + 2] = dgst[ 2]; + tmps[gid].dgst[i + 3] = dgst[ 3]; + tmps[gid].dgst[i + 4] = dgst[ 4]; + tmps[gid].dgst[i + 5] = dgst[ 5]; + tmps[gid].dgst[i + 6] = dgst[ 6]; + tmps[gid].dgst[i + 7] = dgst[ 7]; + tmps[gid].dgst[i + 8] = dgst[ 8]; + tmps[gid].dgst[i + 9] = dgst[ 9]; + tmps[gid].dgst[i + 10] = dgst[10]; + tmps[gid].dgst[i + 11] = dgst[11]; + tmps[gid].dgst[i + 12] = dgst[12]; + tmps[gid].dgst[i + 13] = dgst[13]; + tmps[gid].dgst[i + 14] = dgst[14]; + tmps[gid].dgst[i + 15] = dgst[15]; + + tmps[gid].out[i + 0] = out[ 0]; + tmps[gid].out[i + 1] = out[ 1]; + tmps[gid].out[i + 2] = out[ 2]; + tmps[gid].out[i + 3] = out[ 3]; + tmps[gid].out[i + 4] = out[ 4]; + tmps[gid].out[i + 5] = out[ 5]; + tmps[gid].out[i + 6] = out[ 6]; + tmps[gid].out[i + 7] = out[ 7]; + tmps[gid].out[i + 8] = out[ 8]; + tmps[gid].out[i + 9] = out[ 9]; + tmps[gid].out[i + 10] = out[10]; + tmps[gid].out[i + 11] = out[11]; + tmps[gid].out[i + 12] = out[12]; + tmps[gid].out[i + 13] = out[13]; + tmps[gid].out[i + 14] = out[14]; + tmps[gid].out[i + 15] = out[15]; + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m06233_comp (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, tc_tmp_t *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const tc_t *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + const u32 lid = threadIdx.x; + + if (gid >= gid_max) return; + + u32 ukey1[8]; + + ukey1[0] = swap_workaround (tmps[gid].out[ 0]); + ukey1[1] = swap_workaround (tmps[gid].out[ 1]); + ukey1[2] = swap_workaround (tmps[gid].out[ 2]); + ukey1[3] = swap_workaround (tmps[gid].out[ 3]); + ukey1[4] = swap_workaround (tmps[gid].out[ 4]); + ukey1[5] = swap_workaround (tmps[gid].out[ 5]); + ukey1[6] = swap_workaround (tmps[gid].out[ 6]); + ukey1[7] = swap_workaround (tmps[gid].out[ 7]); + + u32 ukey2[8]; + + ukey2[0] = swap_workaround (tmps[gid].out[ 8]); + ukey2[1] = swap_workaround (tmps[gid].out[ 9]); + ukey2[2] = swap_workaround (tmps[gid].out[10]); + ukey2[3] = swap_workaround (tmps[gid].out[11]); + ukey2[4] = swap_workaround (tmps[gid].out[12]); + ukey2[5] = swap_workaround (tmps[gid].out[13]); + ukey2[6] = swap_workaround (tmps[gid].out[14]); + ukey2[7] = swap_workaround (tmps[gid].out[15]); + + u32 data[4]; + + data[0] = esalt_bufs[0].data_buf[0]; + data[1] = esalt_bufs[0].data_buf[1]; + data[2] = esalt_bufs[0].data_buf[2]; + data[3] = esalt_bufs[0].data_buf[3]; + + u32 tmp[4]; + + { + tmp[0] = data[0]; + tmp[1] = data[1]; + tmp[2] = data[2]; + tmp[3] = data[3]; + + aes256_decrypt_xts (ukey1, ukey2, tmp, tmp); + + if (((tmp[0] == 0x45555254) && (tmp[3] == 0)) || ((tmp[0] == 0x45555254) && ((tmp[1] >> 16) <= 5))) + { + mark_hash_s0 (plains_buf, hashes_shown, 0, gid, 0); + + d_return_buf[lid] = 1; + } + } + + { + tmp[0] = data[0]; + tmp[1] = data[1]; + tmp[2] = data[2]; + tmp[3] = data[3]; + + serpent256_decrypt_xts (ukey1, ukey2, tmp, tmp); + + if (((tmp[0] == 0x45555254) && (tmp[3] == 0)) || ((tmp[0] == 0x45555254) && ((tmp[1] >> 16) <= 5))) + { + mark_hash_s0 (plains_buf, hashes_shown, 0, gid, 0); + + d_return_buf[lid] = 1; + } + } + + { + tmp[0] = data[0]; + tmp[1] = data[1]; + tmp[2] = data[2]; + tmp[3] = data[3]; + + twofish256_decrypt_xts (ukey1, ukey2, tmp, tmp); + + if (((tmp[0] == 0x45555254) && (tmp[3] == 0)) || ((tmp[0] == 0x45555254) && ((tmp[1] >> 16) <= 5))) + { + mark_hash_s0 (plains_buf, hashes_shown, 0, gid, 0); + + d_return_buf[lid] = 1; + } + } + + u32 ukey3[8]; + + ukey3[0] = swap_workaround (tmps[gid].out[16]); + ukey3[1] = swap_workaround (tmps[gid].out[17]); + ukey3[2] = swap_workaround (tmps[gid].out[18]); + ukey3[3] = swap_workaround (tmps[gid].out[19]); + ukey3[4] = swap_workaround (tmps[gid].out[20]); + ukey3[5] = swap_workaround (tmps[gid].out[21]); + ukey3[6] = swap_workaround (tmps[gid].out[22]); + ukey3[7] = swap_workaround (tmps[gid].out[23]); + + u32 ukey4[8]; + + ukey4[0] = swap_workaround (tmps[gid].out[24]); + ukey4[1] = swap_workaround (tmps[gid].out[25]); + ukey4[2] = swap_workaround (tmps[gid].out[26]); + ukey4[3] = swap_workaround (tmps[gid].out[27]); + ukey4[4] = swap_workaround (tmps[gid].out[28]); + ukey4[5] = swap_workaround (tmps[gid].out[29]); + ukey4[6] = swap_workaround (tmps[gid].out[30]); + ukey4[7] = swap_workaround (tmps[gid].out[31]); + + { + tmp[0] = data[0]; + tmp[1] = data[1]; + tmp[2] = data[2]; + tmp[3] = data[3]; + + aes256_decrypt_xts (ukey2, ukey4, tmp, tmp); + twofish256_decrypt_xts (ukey1, ukey3, tmp, tmp); + + if (((tmp[0] == 0x45555254) && (tmp[3] == 0)) || ((tmp[0] == 0x45555254) && ((tmp[1] >> 16) <= 5))) + { + mark_hash_s0 (plains_buf, hashes_shown, 0, gid, 0); + + d_return_buf[lid] = 1; + } + } + + { + tmp[0] = data[0]; + tmp[1] = data[1]; + tmp[2] = data[2]; + tmp[3] = data[3]; + + serpent256_decrypt_xts (ukey2, ukey4, tmp, tmp); + aes256_decrypt_xts (ukey1, ukey3, tmp, tmp); + + if (((tmp[0] == 0x45555254) && (tmp[3] == 0)) || ((tmp[0] == 0x45555254) && ((tmp[1] >> 16) <= 5))) + { + mark_hash_s0 (plains_buf, hashes_shown, 0, gid, 0); + + d_return_buf[lid] = 1; + } + } + + { + tmp[0] = data[0]; + tmp[1] = data[1]; + tmp[2] = data[2]; + tmp[3] = data[3]; + + twofish256_decrypt_xts (ukey2, ukey4, tmp, tmp); + serpent256_decrypt_xts (ukey1, ukey3, tmp, tmp); + + if (((tmp[0] == 0x45555254) && (tmp[3] == 0)) || ((tmp[0] == 0x45555254) && ((tmp[1] >> 16) <= 5))) + { + mark_hash_s0 (plains_buf, hashes_shown, 0, gid, 0); + + d_return_buf[lid] = 1; + } + } + + u32 ukey5[8]; + + ukey5[0] = swap_workaround (tmps[gid].out[32]); + ukey5[1] = swap_workaround (tmps[gid].out[33]); + ukey5[2] = swap_workaround (tmps[gid].out[34]); + ukey5[3] = swap_workaround (tmps[gid].out[35]); + ukey5[4] = swap_workaround (tmps[gid].out[36]); + ukey5[5] = swap_workaround (tmps[gid].out[37]); + ukey5[6] = swap_workaround (tmps[gid].out[38]); + ukey5[7] = swap_workaround (tmps[gid].out[39]); + + u32 ukey6[8]; + + ukey6[0] = swap_workaround (tmps[gid].out[40]); + ukey6[1] = swap_workaround (tmps[gid].out[41]); + ukey6[2] = swap_workaround (tmps[gid].out[42]); + ukey6[3] = swap_workaround (tmps[gid].out[43]); + ukey6[4] = swap_workaround (tmps[gid].out[44]); + ukey6[5] = swap_workaround (tmps[gid].out[45]); + ukey6[6] = swap_workaround (tmps[gid].out[46]); + ukey6[7] = swap_workaround (tmps[gid].out[47]); + + { + tmp[0] = data[0]; + tmp[1] = data[1]; + tmp[2] = data[2]; + tmp[3] = data[3]; + + aes256_decrypt_xts (ukey3, ukey6, tmp, tmp); + twofish256_decrypt_xts (ukey2, ukey5, tmp, tmp); + serpent256_decrypt_xts (ukey1, ukey4, tmp, tmp); + + if (((tmp[0] == 0x45555254) && (tmp[3] == 0)) || ((tmp[0] == 0x45555254) && ((tmp[1] >> 16) <= 5))) + { + mark_hash_s0 (plains_buf, hashes_shown, 0, gid, 0); + + d_return_buf[lid] = 1; + } + } + + { + tmp[0] = data[0]; + tmp[1] = data[1]; + tmp[2] = data[2]; + tmp[3] = data[3]; + + serpent256_decrypt_xts (ukey3, ukey6, tmp, tmp); + twofish256_decrypt_xts (ukey2, ukey5, tmp, tmp); + aes256_decrypt_xts (ukey1, ukey4, tmp, tmp); + + if (((tmp[0] == 0x45555254) && (tmp[3] == 0)) || ((tmp[0] == 0x45555254) && ((tmp[1] >> 16) <= 5))) + { + mark_hash_s0 (plains_buf, hashes_shown, 0, gid, 0); + + d_return_buf[lid] = 1; + } + } +} diff --git a/nv/m06300.cu b/nv/m06300.cu new file mode 100644 index 0000000000..a8b79d63fe --- /dev/null +++ b/nv/m06300.cu @@ -0,0 +1,1081 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _MD5_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW2 +#define VECT_SIZE1 +#endif + +#define DGST_R0 0 +#define DGST_R1 1 +#define DGST_R2 2 +#define DGST_R3 3 + +#include "include/kernel_functions.c" +#include "types_nv.c" +#include "common_nv.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +__device__ static void md5_transform (const u32x w0[4], const u32x w1[4], const u32x w2[4], const u32x w3[4], u32x digest[4]) +{ + u32x a = digest[0]; + u32x b = digest[1]; + u32x c = digest[2]; + u32x d = digest[3]; + + u32x w0_t = w0[0]; + u32x w1_t = w0[1]; + u32x w2_t = w0[2]; + u32x w3_t = w0[3]; + u32x w4_t = w1[0]; + u32x w5_t = w1[1]; + u32x w6_t = w1[2]; + u32x w7_t = w1[3]; + u32x w8_t = w2[0]; + u32x w9_t = w2[1]; + u32x wa_t = w2[2]; + u32x wb_t = w2[3]; + u32x wc_t = w3[0]; + u32x wd_t = w3[1]; + u32x we_t = w3[2]; + u32x wf_t = 0; + + u32x tmp2; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t, MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t, MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t, MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t, MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w4_t, MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w5_t, MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w6_t, MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w7_t, MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w8_t, MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w9_t, MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, wa_t, MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, wb_t, MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, wc_t, MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, wd_t, MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, we_t, MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, wf_t, MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w1_t, MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w6_t, MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, wb_t, MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t, MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w5_t, MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, wa_t, MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, wf_t, MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w4_t, MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w9_t, MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, we_t, MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t, MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w8_t, MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, wd_t, MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t, MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w7_t, MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, wc_t, MD5C1f, MD5S13); + + MD5_STEP (MD5_H1, a, b, c, d, w5_t, MD5C20, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w8_t, MD5C21, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, wb_t, MD5C22, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, we_t, MD5C23, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w1_t, MD5C24, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w4_t, MD5C25, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w7_t, MD5C26, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, wa_t, MD5C27, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, wd_t, MD5C28, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w0_t, MD5C29, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w3_t, MD5C2a, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w6_t, MD5C2b, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w9_t, MD5C2c, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, wc_t, MD5C2d, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, wf_t, MD5C2e, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w2_t, MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t, MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w7_t, MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, we_t, MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w5_t, MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, wc_t, MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t, MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, wa_t, MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t, MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w8_t, MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, wf_t, MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w6_t, MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, wd_t, MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w4_t, MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, wb_t, MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t, MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w9_t, MD5C3f, MD5S33); + + digest[0] += a; + digest[1] += b; + digest[2] += c; + digest[3] += d; +} + +__device__ static void memcat16 (u32x block0[4], u32x block1[4], u32x block2[4], u32x block3[4], const u32 block_len, const u32x append[4]) +{ + u32x tmp0; + u32x tmp1; + u32x tmp2; + u32x tmp3; + u32x tmp4; + + #if __CUDA_ARCH__ >= 200 + + const int offset_minus_4 = 4 - (block_len & 3); + + const int selector = (0x76543210 >> (offset_minus_4 * 4)) & 0xffff; + + tmp0 = __byte_perm ( 0, append[0], selector); + tmp1 = __byte_perm (append[0], append[1], selector); + tmp2 = __byte_perm (append[1], append[2], selector); + tmp3 = __byte_perm (append[2], append[3], selector); + tmp4 = __byte_perm (append[3], 0, selector); + + #else + + const u32 mod = block_len & 3; + + switch (mod) + { + case 0: tmp0 = append[0]; + tmp1 = append[1]; + tmp2 = append[2]; + tmp3 = append[3]; + tmp4 = 0; + break; + case 1: tmp0 = append[0] << 8; + tmp1 = append[0] >> 24 | append[1] << 8; + tmp2 = append[1] >> 24 | append[2] << 8; + tmp3 = append[2] >> 24 | append[3] << 8; + tmp4 = append[3] >> 24; + break; + case 2: tmp0 = append[0] << 16; + tmp1 = append[0] >> 16 | append[1] << 16; + tmp2 = append[1] >> 16 | append[2] << 16; + tmp3 = append[2] >> 16 | append[3] << 16; + tmp4 = append[3] >> 16; + break; + case 3: tmp0 = append[0] << 24; + tmp1 = append[0] >> 8 | append[1] << 24; + tmp2 = append[1] >> 8 | append[2] << 24; + tmp3 = append[2] >> 8 | append[3] << 24; + tmp4 = append[3] >> 8; + break; + } + + #endif + + const u32 div = block_len / 4; + + switch (div) + { + case 0: block0[0] |= tmp0; + block0[1] = tmp1; + block0[2] = tmp2; + block0[3] = tmp3; + block1[0] = tmp4; + break; + case 1: block0[1] |= tmp0; + block0[2] = tmp1; + block0[3] = tmp2; + block1[0] = tmp3; + block1[1] = tmp4; + break; + case 2: block0[2] |= tmp0; + block0[3] = tmp1; + block1[0] = tmp2; + block1[1] = tmp3; + block1[2] = tmp4; + break; + case 3: block0[3] |= tmp0; + block1[0] = tmp1; + block1[1] = tmp2; + block1[2] = tmp3; + block1[3] = tmp4; + break; + case 4: block1[0] |= tmp0; + block1[1] = tmp1; + block1[2] = tmp2; + block1[3] = tmp3; + block2[0] = tmp4; + break; + case 5: block1[1] |= tmp0; + block1[2] = tmp1; + block1[3] = tmp2; + block2[0] = tmp3; + block2[1] = tmp4; + break; + case 6: block1[2] |= tmp0; + block1[3] = tmp1; + block2[0] = tmp2; + block2[1] = tmp3; + block2[2] = tmp4; + break; + case 7: block1[3] |= tmp0; + block2[0] = tmp1; + block2[1] = tmp2; + block2[2] = tmp3; + block2[3] = tmp4; + break; + case 8: block2[0] |= tmp0; + block2[1] = tmp1; + block2[2] = tmp2; + block2[3] = tmp3; + block3[0] = tmp4; + break; + case 9: block2[1] |= tmp0; + block2[2] = tmp1; + block2[3] = tmp2; + block3[0] = tmp3; + block3[1] = tmp4; + break; + } + + return; +} + +__device__ static void memcat16_x80 (u32x block0[4], u32x block1[4], u32x block2[4], u32x block3[4], const u32 block_len, const u32x append[4]) +{ + u32x tmp0; + u32x tmp1; + u32x tmp2; + u32x tmp3; + u32x tmp4; + + #if __CUDA_ARCH__ >= 200 + + const int offset_minus_4 = 4 - (block_len & 3); + + const int selector = (0x76543210 >> (offset_minus_4 * 4)) & 0xffff; + + tmp0 = __byte_perm ( 0, append[0], selector); + tmp1 = __byte_perm (append[0], append[1], selector); + tmp2 = __byte_perm (append[1], append[2], selector); + tmp3 = __byte_perm (append[2], append[3], selector); + tmp4 = __byte_perm (append[3], 0x80, selector); + + #else + + const u32 mod = block_len & 3; + + switch (mod) + { + case 0: tmp0 = append[0]; + tmp1 = append[1]; + tmp2 = append[2]; + tmp3 = append[3]; + tmp4 = 0x80; + break; + case 1: tmp0 = append[0] << 8; + tmp1 = append[0] >> 24 | append[1] << 8; + tmp2 = append[1] >> 24 | append[2] << 8; + tmp3 = append[2] >> 24 | append[3] << 8; + tmp4 = append[3] >> 24; + break; + case 2: tmp0 = append[0] << 16; + tmp1 = append[0] >> 16 | append[1] << 16; + tmp2 = append[1] >> 16 | append[2] << 16; + tmp3 = append[2] >> 16 | append[3] << 16; + tmp4 = append[3] >> 16; + break; + case 3: tmp0 = append[0] << 24; + tmp1 = append[0] >> 8 | append[1] << 24; + tmp2 = append[1] >> 8 | append[2] << 24; + tmp3 = append[2] >> 8 | append[3] << 24; + tmp4 = append[3] >> 8; + break; + } + + #endif + + const u32 div = block_len / 4; + + switch (div) + { + case 0: block0[0] |= tmp0; + block0[1] = tmp1; + block0[2] = tmp2; + block0[3] = tmp3; + block1[0] = tmp4; + break; + case 1: block0[1] |= tmp0; + block0[2] = tmp1; + block0[3] = tmp2; + block1[0] = tmp3; + block1[1] = tmp4; + break; + case 2: block0[2] |= tmp0; + block0[3] = tmp1; + block1[0] = tmp2; + block1[1] = tmp3; + block1[2] = tmp4; + break; + case 3: block0[3] |= tmp0; + block1[0] = tmp1; + block1[1] = tmp2; + block1[2] = tmp3; + block1[3] = tmp4; + break; + case 4: block1[0] |= tmp0; + block1[1] = tmp1; + block1[2] = tmp2; + block1[3] = tmp3; + block2[0] = tmp4; + break; + case 5: block1[1] |= tmp0; + block1[2] = tmp1; + block1[3] = tmp2; + block2[0] = tmp3; + block2[1] = tmp4; + break; + case 6: block1[2] |= tmp0; + block1[3] = tmp1; + block2[0] = tmp2; + block2[1] = tmp3; + block2[2] = tmp4; + break; + case 7: block1[3] |= tmp0; + block2[0] = tmp1; + block2[1] = tmp2; + block2[2] = tmp3; + block2[3] = tmp4; + break; + case 8: block2[0] |= tmp0; + block2[1] = tmp1; + block2[2] = tmp2; + block2[3] = tmp3; + block3[0] = tmp4; + break; + case 9: block2[1] |= tmp0; + block2[2] = tmp1; + block2[3] = tmp2; + block3[0] = tmp3; + block3[1] = tmp4; + break; + } + + return; +} + +__device__ static void memcat8 (u32x block0[4], u32x block1[4], u32x block2[4], u32x block3[4], const u32 block_len, const u32 append[2]) +{ + u32x tmp0; + u32x tmp1; + u32x tmp2; + + #if __CUDA_ARCH__ >= 200 + + const int offset_minus_4 = 4 - (block_len & 3); + + const int selector = (0x76543210 >> (offset_minus_4 * 4)) & 0xffff; + + tmp0 = __byte_perm ( 0, append[0], selector); + tmp1 = __byte_perm (append[0], append[1], selector); + tmp2 = __byte_perm (append[1], 0, selector); + + #else + + const u32 mod = block_len & 3; + + switch (mod) + { + case 0: tmp0 = append[0]; + tmp1 = append[1]; + tmp2 = 0; + break; + case 1: tmp0 = append[0] << 8; + tmp1 = append[0] >> 24 | append[1] << 8; + tmp2 = append[1] >> 24; + break; + case 2: tmp0 = append[0] << 16; + tmp1 = append[0] >> 16 | append[1] << 16; + tmp2 = append[1] >> 16; + break; + case 3: tmp0 = append[0] << 24; + tmp1 = append[0] >> 8 | append[1] << 24; + tmp2 = append[1] >> 8; + break; + } + + #endif + + const u32 div = block_len / 4; + + switch (div) + { + case 0: block0[0] |= tmp0; + block0[1] = tmp1; + block0[2] = tmp2; + break; + case 1: block0[1] |= tmp0; + block0[2] = tmp1; + block0[3] = tmp2; + break; + case 2: block0[2] |= tmp0; + block0[3] = tmp1; + block1[0] = tmp2; + break; + case 3: block0[3] |= tmp0; + block1[0] = tmp1; + block1[1] = tmp2; + break; + case 4: block1[0] |= tmp0; + block1[1] = tmp1; + block1[2] = tmp2; + break; + case 5: block1[1] |= tmp0; + block1[2] = tmp1; + block1[3] = tmp2; + break; + case 6: block1[2] |= tmp0; + block1[3] = tmp1; + block2[0] = tmp2; + break; + case 7: block1[3] |= tmp0; + block2[0] = tmp1; + block2[1] = tmp2; + break; + case 8: block2[0] |= tmp0; + block2[1] = tmp1; + block2[2] = tmp2; + break; + case 9: block2[1] |= tmp0; + block2[2] = tmp1; + block2[3] = tmp2; + break; + case 10: block2[2] |= tmp0; + block2[3] = tmp1; + block3[0] = tmp2; + break; + case 11: block2[3] |= tmp0; + block3[0] = tmp1; + block3[1] = tmp2; + break; + } + + return; +} + +__device__ static void append_1st (u32x block0[4], u32x block1[4], u32x block2[4], u32x block3[4], const u32 block_len, const u32x append) +{ + switch (block_len) + { + case 0: + block0[0] = append; + break; + + case 1: + block0[0] = block0[0] | append << 8; + break; + + case 2: + block0[0] = block0[0] | append << 16; + break; + + case 3: + block0[0] = block0[0] | append << 24; + break; + + case 4: + block0[1] = append; + break; + + case 5: + block0[1] = block0[1] | append << 8; + break; + + case 6: + block0[1] = block0[1] | append << 16; + break; + + case 7: + block0[1] = block0[1] | append << 24; + break; + + case 8: + block0[2] = append; + break; + + case 9: + block0[2] = block0[2] | append << 8; + break; + + case 10: + block0[2] = block0[2] | append << 16; + break; + + case 11: + block0[2] = block0[2] | append << 24; + break; + + case 12: + block0[3] = append; + break; + + case 13: + block0[3] = block0[3] | append << 8; + break; + + case 14: + block0[3] = block0[3] | append << 16; + break; + + case 15: + block0[3] = block0[3] | append << 24; + break; + + case 16: + block1[0] = append; + break; + + case 17: + block1[0] = block1[0] | append << 8; + break; + + case 18: + block1[0] = block1[0] | append << 16; + break; + + case 19: + block1[0] = block1[0] | append << 24; + break; + + case 20: + block1[1] = append; + break; + + case 21: + block1[1] = block1[1] | append << 8; + break; + + case 22: + block1[1] = block1[1] | append << 16; + break; + + case 23: + block1[1] = block1[1] | append << 24; + break; + + case 24: + block1[2] = append; + break; + + case 25: + block1[2] = block1[2] | append << 8; + break; + + case 26: + block1[2] = block1[2] | append << 16; + break; + + case 27: + block1[2] = block1[2] | append << 24; + break; + + case 28: + block1[3] = append; + break; + + case 29: + block1[3] = block1[3] | append << 8; + break; + + case 30: + block1[3] = block1[3] | append << 16; + break; + + case 31: + block1[3] = block1[3] | append << 24; + break; + + case 32: + block2[0] = append; + break; + + case 33: + block2[0] = block2[0] | append << 8; + break; + + case 34: + block2[0] = block2[0] | append << 16; + break; + + case 35: + block2[0] = block2[0] | append << 24; + break; + + case 36: + block2[1] = append; + break; + + case 37: + block2[1] = block2[1] | append << 8; + break; + + case 38: + block2[1] = block2[1] | append << 16; + break; + + case 39: + block2[1] = block2[1] | append << 24; + break; + + case 40: + block2[2] = append; + break; + + case 41: + block2[2] = block2[2] | append << 8; + break; + + case 42: + block2[2] = block2[2] | append << 16; + break; + + case 43: + block2[2] = block2[2] | append << 24; + break; + + case 44: + block2[3] = append; + break; + + case 45: + block2[3] = block2[3] | append << 8; + break; + + case 46: + block2[3] = block2[3] | append << 16; + break; + + case 47: + block2[3] = block2[3] | append << 24; + break; + + case 48: + block3[0] = append; + break; + + case 49: + block3[0] = block3[0] | append << 8; + break; + + case 50: + block3[0] = block3[0] | append << 16; + break; + + case 51: + block3[0] = block3[0] | append << 24; + break; + + case 52: + block3[1] = append; + break; + + case 53: + block3[1] = block3[1] | append << 8; + break; + + case 54: + block3[1] = block3[1] | append << 16; + break; + + case 55: + block3[1] = block3[1] | append << 24; + break; + + case 56: + block3[2] = append; + break; + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m06300_init (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, md5crypt_tmp_t *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[0]; + w0[1] = pws[gid].i[1]; + w0[2] = pws[gid].i[2]; + w0[3] = pws[gid].i[3]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * salt + */ + + u32 salt_buf[2]; + + salt_buf[0] = salt_bufs[salt_pos].salt_buf[0]; + salt_buf[1] = salt_bufs[salt_pos].salt_buf[1]; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + /** + * init + */ + + //memcat16 (block0, block1, block2, block3, block_len, w0); + //block_len += pw_len; + + u32 block_len = pw_len; + + u32x block0[4]; + + block0[0] = w0[0]; + block0[1] = w0[1]; + block0[2] = w0[2]; + block0[3] = w0[3]; + + u32x block1[4]; + + block1[0] = 0; + block1[1] = 0; + block1[2] = 0; + block1[3] = 0; + + u32x block2[4]; + + block2[0] = 0; + block2[1] = 0; + block2[2] = 0; + block2[3] = 0; + + u32x block3[4]; + + block3[0] = 0; + block3[1] = 0; + block3[2] = 0; + block3[3] = 0; + + memcat8 (block0, block1, block2, block3, block_len, salt_buf); + + block_len += salt_len; + + memcat16 (block0, block1, block2, block3, block_len, w0); + + block_len += pw_len; + + append_0x80_4 (block0, block1, block2, block3, block_len); + + block3[2] = block_len * 8; + + u32x digest[4]; + + digest[0] = MD5M_A; + digest[1] = MD5M_B; + digest[2] = MD5M_C; + digest[3] = MD5M_D; + + md5_transform (block0, block1, block2, block3, digest); + + /* The password first, since that is what is most unknown */ + /* Then the raw salt */ + /* Then just as many characters of the MD5(pw,salt,pw) */ + + //memcat16 (block0, block1, block2, block3, block_len, w); + //block_len += pw_len; + + block_len = pw_len; + + block0[0] = w0[0]; + block0[1] = w0[1]; + block0[2] = w0[2]; + block0[3] = w0[3]; + + block1[0] = 0; + block1[1] = 0; + block1[2] = 0; + block1[3] = 0; + + block2[0] = 0; + block2[1] = 0; + block2[2] = 0; + block2[3] = 0; + + block3[0] = 0; + block3[1] = 0; + block3[2] = 0; + block3[3] = 0; + + memcat8 (block0, block1, block2, block3, block_len, salt_buf); + + block_len += salt_len; + + truncate_block (digest, pw_len); + + memcat16 (block0, block1, block2, block3, block_len, digest); + + block_len += pw_len; + + /* Then something really weird... */ + + u32x append = block0[0] & 0xFF; + + for (u32 j = pw_len; j; j >>= 1) + { + if ((j & 1) == 0) + { + append_1st (block0, block1, block2, block3, block_len, append); + } + + block_len++; + } + + append_0x80_4 (block0, block1, block2, block3, block_len); + + block3[2] = block_len * 8; + + digest[0] = MD5M_A; + digest[1] = MD5M_B; + digest[2] = MD5M_C; + digest[3] = MD5M_D; + + md5_transform (block0, block1, block2, block3, digest); + + tmps[gid].digest_buf[0] = digest[0]; + tmps[gid].digest_buf[1] = digest[1]; + tmps[gid].digest_buf[2] = digest[2]; + tmps[gid].digest_buf[3] = digest[3]; +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m06300_loop (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, md5crypt_tmp_t *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[0]; + w0[1] = pws[gid].i[1]; + w0[2] = pws[gid].i[2]; + w0[3] = pws[gid].i[3]; + + const u32 pw_len = pws[gid].pw_len; + + u32x w0_x80[4]; + + w0_x80[0] = w0[0]; + w0_x80[1] = w0[1]; + w0_x80[2] = w0[2]; + w0_x80[3] = w0[3]; + + append_0x80_1 (w0_x80, pw_len); + + /** + * salt + */ + + u32 salt_buf[2]; + + salt_buf[0] = salt_bufs[salt_pos].salt_buf[0]; + salt_buf[1] = salt_bufs[salt_pos].salt_buf[1]; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + /** + * digest + */ + + u32x digest[4]; + + digest[0] = tmps[gid].digest_buf[0]; + digest[1] = tmps[gid].digest_buf[1]; + digest[2] = tmps[gid].digest_buf[2]; + digest[3] = tmps[gid].digest_buf[3]; + + /** + * loop + */ + + /* and now, just to make sure things don't run too fast */ + + u32 block_len; + + u32x block0[4]; + + block0[0] = 0; + block0[1] = 0; + block0[2] = 0; + block0[3] = 0; + + u32x block1[4]; + + block1[0] = 0; + block1[1] = 0; + block1[2] = 0; + block1[3] = 0; + + u32x block2[4]; + + block2[0] = 0; + block2[1] = 0; + block2[2] = 0; + block2[3] = 0; + + u32x block3[4]; + + block3[0] = 0; + block3[1] = 0; + block3[2] = 0; + block3[3] = 0; + + for (u32 i = 0, j = loop_pos; i < loop_cnt; i++, j++) + { + block1[0] = 0; + block1[1] = 0; + block1[2] = 0; + block1[3] = 0; + block2[0] = 0; + block2[1] = 0; + block2[2] = 0; + block2[3] = 0; + block3[0] = 0; + block3[1] = 0; + + const u32 j1 = (j & 1) ? 1 : 0; + const u32 j3 = (j % 3) ? 1 : 0; + const u32 j7 = (j % 7) ? 1 : 0; + + if (j1) + { + block0[0] = w0[0]; + block0[1] = w0[1]; + block0[2] = w0[2]; + block0[3] = w0[3]; + + block_len = pw_len; + + if (j3) + { + memcat8 (block0, block1, block2, block3, block_len, salt_buf); + + block_len += salt_len; + } + + if (j7) + { + memcat16 (block0, block1, block2, block3, block_len, w0); + + block_len += pw_len; + } + + memcat16_x80 (block0, block1, block2, block3, block_len, digest); + + block_len += 16; + } + else + { + block0[0] = digest[0]; + block0[1] = digest[1]; + block0[2] = digest[2]; + block0[3] = digest[3]; + + block_len = 16; + + if (j3 && j7) + { + block1[0] = salt_buf[0]; + block1[1] = salt_buf[1]; + + block_len += salt_len; + + memcat16 (block0, block1, block2, block3, block_len, w0); + + block_len += pw_len; + } + else if (j3) + { + block1[0] = salt_buf[0]; + block1[1] = salt_buf[1]; + + block_len += salt_len; + } + else if (j7) + { + block1[0] = w0[0]; + block1[1] = w0[1]; + block1[2] = w0[2]; + block1[3] = w0[3]; + + block_len += pw_len; + } + + memcat16 (block0, block1, block2, block3, block_len, w0_x80); + + block_len += pw_len; + } + + block3[2] = block_len * 8; + + digest[0] = MD5M_A; + digest[1] = MD5M_B; + digest[2] = MD5M_C; + digest[3] = MD5M_D; + + md5_transform (block0, block1, block2, block3, digest); + } + + tmps[gid].digest_buf[0] = digest[0]; + tmps[gid].digest_buf[1] = digest[1]; + tmps[gid].digest_buf[2] = digest[2]; + tmps[gid].digest_buf[3] = digest[3]; +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m06300_comp (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, md5crypt_tmp_t *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + const u32 lid = threadIdx.x; + + /** + * digest + */ + + const u32x r0 = tmps[gid].digest_buf[DGST_R0]; + const u32x r1 = tmps[gid].digest_buf[DGST_R1]; + const u32x r2 = tmps[gid].digest_buf[DGST_R2]; + const u32x r3 = tmps[gid].digest_buf[DGST_R3]; + + #define il_pos 0 + + #include VECT_COMPARE_M +} diff --git a/nv/m06400.cu b/nv/m06400.cu new file mode 100644 index 0000000000..5c8224a265 --- /dev/null +++ b/nv/m06400.cu @@ -0,0 +1,555 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _SHA256_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW2 +#define VECT_SIZE1 +#endif + +#define DGST_R0 0 +#define DGST_R1 1 +#define DGST_R2 2 +#define DGST_R3 3 + +#include "include/kernel_functions.c" +#include "types_nv.c" +#include "common_nv.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +__device__ static void sha256_transform (const u32x w0[4], const u32x w1[4], const u32x w2[4], const u32x w3[4], u32x digest[8]) +{ + u32x a = digest[0]; + u32x b = digest[1]; + u32x c = digest[2]; + u32x d = digest[3]; + u32x e = digest[4]; + u32x f = digest[5]; + u32x g = digest[6]; + u32x h = digest[7]; + + u32x w0_t = w0[0]; + u32x w1_t = w0[1]; + u32x w2_t = w0[2]; + u32x w3_t = w0[3]; + u32x w4_t = w1[0]; + u32x w5_t = w1[1]; + u32x w6_t = w1[2]; + u32x w7_t = w1[3]; + u32x w8_t = w2[0]; + u32x w9_t = w2[1]; + u32x wa_t = w2[2]; + u32x wb_t = w2[3]; + u32x wc_t = w3[0]; + u32x wd_t = w3[1]; + u32x we_t = w3[2]; + u32x wf_t = w3[3]; + + SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C00); + SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C01); + SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C02); + SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C03); + SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C04); + SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C05); + SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C06); + SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C07); + SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C08); + SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C09); + SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C0a); + SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C0b); + SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C0c); + SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C0d); + SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C0e); + SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C0f); + w0_t = SHA256_S1(we_t) + w9_t + SHA256_S0(w1_t) + w0_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C10); + w1_t = SHA256_S1(wf_t) + wa_t + SHA256_S0(w2_t) + w1_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C11); + w2_t = SHA256_S1(w0_t) + wb_t + SHA256_S0(w3_t) + w2_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C12); + w3_t = SHA256_S1(w1_t) + wc_t + SHA256_S0(w4_t) + w3_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C13); + w4_t = SHA256_S1(w2_t) + wd_t + SHA256_S0(w5_t) + w4_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C14); + w5_t = SHA256_S1(w3_t) + we_t + SHA256_S0(w6_t) + w5_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C15); + w6_t = SHA256_S1(w4_t) + wf_t + SHA256_S0(w7_t) + w6_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C16); + w7_t = SHA256_S1(w5_t) + w0_t + SHA256_S0(w8_t) + w7_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C17); + w8_t = SHA256_S1(w6_t) + w1_t + SHA256_S0(w9_t) + w8_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C18); + w9_t = SHA256_S1(w7_t) + w2_t + SHA256_S0(wa_t) + w9_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C19); + wa_t = SHA256_S1(w8_t) + w3_t + SHA256_S0(wb_t) + wa_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C1a); + wb_t = SHA256_S1(w9_t) + w4_t + SHA256_S0(wc_t) + wb_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C1b); + wc_t = SHA256_S1(wa_t) + w5_t + SHA256_S0(wd_t) + wc_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C1c); + wd_t = SHA256_S1(wb_t) + w6_t + SHA256_S0(we_t) + wd_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C1d); + we_t = SHA256_S1(wc_t) + w7_t + SHA256_S0(wf_t) + we_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C1e); + wf_t = SHA256_S1(wd_t) + w8_t + SHA256_S0(w0_t) + wf_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C1f); + w0_t = SHA256_S1(we_t) + w9_t + SHA256_S0(w1_t) + w0_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C20); + w1_t = SHA256_S1(wf_t) + wa_t + SHA256_S0(w2_t) + w1_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C21); + w2_t = SHA256_S1(w0_t) + wb_t + SHA256_S0(w3_t) + w2_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C22); + w3_t = SHA256_S1(w1_t) + wc_t + SHA256_S0(w4_t) + w3_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C23); + w4_t = SHA256_S1(w2_t) + wd_t + SHA256_S0(w5_t) + w4_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C24); + w5_t = SHA256_S1(w3_t) + we_t + SHA256_S0(w6_t) + w5_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C25); + w6_t = SHA256_S1(w4_t) + wf_t + SHA256_S0(w7_t) + w6_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C26); + w7_t = SHA256_S1(w5_t) + w0_t + SHA256_S0(w8_t) + w7_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C27); + w8_t = SHA256_S1(w6_t) + w1_t + SHA256_S0(w9_t) + w8_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C28); + w9_t = SHA256_S1(w7_t) + w2_t + SHA256_S0(wa_t) + w9_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C29); + wa_t = SHA256_S1(w8_t) + w3_t + SHA256_S0(wb_t) + wa_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C2a); + wb_t = SHA256_S1(w9_t) + w4_t + SHA256_S0(wc_t) + wb_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C2b); + wc_t = SHA256_S1(wa_t) + w5_t + SHA256_S0(wd_t) + wc_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C2c); + wd_t = SHA256_S1(wb_t) + w6_t + SHA256_S0(we_t) + wd_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C2d); + we_t = SHA256_S1(wc_t) + w7_t + SHA256_S0(wf_t) + we_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C2e); + wf_t = SHA256_S1(wd_t) + w8_t + SHA256_S0(w0_t) + wf_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C2f); + w0_t = SHA256_S1(we_t) + w9_t + SHA256_S0(w1_t) + w0_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C30); + w1_t = SHA256_S1(wf_t) + wa_t + SHA256_S0(w2_t) + w1_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C31); + w2_t = SHA256_S1(w0_t) + wb_t + SHA256_S0(w3_t) + w2_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C32); + w3_t = SHA256_S1(w1_t) + wc_t + SHA256_S0(w4_t) + w3_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C33); + w4_t = SHA256_S1(w2_t) + wd_t + SHA256_S0(w5_t) + w4_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C34); + w5_t = SHA256_S1(w3_t) + we_t + SHA256_S0(w6_t) + w5_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C35); + w6_t = SHA256_S1(w4_t) + wf_t + SHA256_S0(w7_t) + w6_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C36); + w7_t = SHA256_S1(w5_t) + w0_t + SHA256_S0(w8_t) + w7_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C37); + w8_t = SHA256_S1(w6_t) + w1_t + SHA256_S0(w9_t) + w8_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C38); + w9_t = SHA256_S1(w7_t) + w2_t + SHA256_S0(wa_t) + w9_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C39); + wa_t = SHA256_S1(w8_t) + w3_t + SHA256_S0(wb_t) + wa_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C3a); + wb_t = SHA256_S1(w9_t) + w4_t + SHA256_S0(wc_t) + wb_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C3b); + wc_t = SHA256_S1(wa_t) + w5_t + SHA256_S0(wd_t) + wc_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C3c); + wd_t = SHA256_S1(wb_t) + w6_t + SHA256_S0(we_t) + wd_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C3d); + we_t = SHA256_S1(wc_t) + w7_t + SHA256_S0(wf_t) + we_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C3e); + wf_t = SHA256_S1(wd_t) + w8_t + SHA256_S0(w0_t) + wf_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C3f); + + digest[0] += a; + digest[1] += b; + digest[2] += c; + digest[3] += d; + digest[4] += e; + digest[5] += f; + digest[6] += g; + digest[7] += h; +} + +__device__ static void hmac_sha256_pad (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], u32x ipad[8], u32x opad[8]) +{ + w0[0] = w0[0] ^ 0x36363636; + w0[1] = w0[1] ^ 0x36363636; + w0[2] = w0[2] ^ 0x36363636; + w0[3] = w0[3] ^ 0x36363636; + w1[0] = w1[0] ^ 0x36363636; + w1[1] = w1[1] ^ 0x36363636; + w1[2] = w1[2] ^ 0x36363636; + w1[3] = w1[3] ^ 0x36363636; + w2[0] = w2[0] ^ 0x36363636; + w2[1] = w2[1] ^ 0x36363636; + w2[2] = w2[2] ^ 0x36363636; + w2[3] = w2[3] ^ 0x36363636; + w3[0] = w3[0] ^ 0x36363636; + w3[1] = w3[1] ^ 0x36363636; + w3[2] = w3[2] ^ 0x36363636; + w3[3] = w3[3] ^ 0x36363636; + + ipad[0] = SHA256M_A; + ipad[1] = SHA256M_B; + ipad[2] = SHA256M_C; + ipad[3] = SHA256M_D; + ipad[4] = SHA256M_E; + ipad[5] = SHA256M_F; + ipad[6] = SHA256M_G; + ipad[7] = SHA256M_H; + + sha256_transform (w0, w1, w2, w3, ipad); + + w0[0] = w0[0] ^ 0x6a6a6a6a; + w0[1] = w0[1] ^ 0x6a6a6a6a; + w0[2] = w0[2] ^ 0x6a6a6a6a; + w0[3] = w0[3] ^ 0x6a6a6a6a; + w1[0] = w1[0] ^ 0x6a6a6a6a; + w1[1] = w1[1] ^ 0x6a6a6a6a; + w1[2] = w1[2] ^ 0x6a6a6a6a; + w1[3] = w1[3] ^ 0x6a6a6a6a; + w2[0] = w2[0] ^ 0x6a6a6a6a; + w2[1] = w2[1] ^ 0x6a6a6a6a; + w2[2] = w2[2] ^ 0x6a6a6a6a; + w2[3] = w2[3] ^ 0x6a6a6a6a; + w3[0] = w3[0] ^ 0x6a6a6a6a; + w3[1] = w3[1] ^ 0x6a6a6a6a; + w3[2] = w3[2] ^ 0x6a6a6a6a; + w3[3] = w3[3] ^ 0x6a6a6a6a; + + opad[0] = SHA256M_A; + opad[1] = SHA256M_B; + opad[2] = SHA256M_C; + opad[3] = SHA256M_D; + opad[4] = SHA256M_E; + opad[5] = SHA256M_F; + opad[6] = SHA256M_G; + opad[7] = SHA256M_H; + + sha256_transform (w0, w1, w2, w3, opad); +} + +__device__ static void hmac_sha256_run (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], u32x ipad[8], u32x opad[8], u32x digest[8]) +{ + digest[0] = ipad[0]; + digest[1] = ipad[1]; + digest[2] = ipad[2]; + digest[3] = ipad[3]; + digest[4] = ipad[4]; + digest[5] = ipad[5]; + digest[6] = ipad[6]; + digest[7] = ipad[7]; + + sha256_transform (w0, w1, w2, w3, digest); + + w0[0] = digest[0]; + w0[1] = digest[1]; + w0[2] = digest[2]; + w0[3] = digest[3]; + w1[0] = digest[4]; + w1[1] = digest[5]; + w1[2] = digest[6]; + w1[3] = digest[7]; + w2[0] = 0x80000000; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = (64 + 32) * 8; + + digest[0] = opad[0]; + digest[1] = opad[1]; + digest[2] = opad[2]; + digest[3] = opad[3]; + digest[4] = opad[4]; + digest[5] = opad[5]; + digest[6] = opad[6]; + digest[7] = opad[7]; + + sha256_transform (w0, w1, w2, w3, digest); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m06400_init (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, sha256aix_tmp_t *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = pws[gid].i[ 8]; + w2[1] = pws[gid].i[ 9]; + w2[2] = pws[gid].i[10]; + w2[3] = pws[gid].i[11]; + + u32x w3[4]; + + w3[0] = pws[gid].i[12]; + w3[1] = pws[gid].i[13]; + w3[2] = pws[gid].i[14]; + w3[3] = pws[gid].i[15]; + + /** + * salt + */ + + u32 salt_len = salt_bufs[salt_pos].salt_len; + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[ 1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[ 2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[ 3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[ 4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[ 5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[ 6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[ 7]; + + u32 salt_buf2[4]; + + salt_buf2[0] = salt_bufs[salt_pos].salt_buf[ 8]; + salt_buf2[1] = salt_bufs[salt_pos].salt_buf[ 9]; + salt_buf2[2] = salt_bufs[salt_pos].salt_buf[10]; + salt_buf2[3] = salt_bufs[salt_pos].salt_buf[11]; + + u32 salt_buf3[4]; + + salt_buf3[0] = 0; + salt_buf3[1] = 0; + salt_buf3[2] = 0; + salt_buf3[3] = 0; + + append_0x01_4 (salt_buf0, salt_buf1, salt_buf2, salt_buf3, salt_len + 3); + + append_0x80_4 (salt_buf0, salt_buf1, salt_buf2, salt_buf3, salt_len + 4); + + /** + * pads + */ + + w0[0] = swap_workaround (w0[0]); + w0[1] = swap_workaround (w0[1]); + w0[2] = swap_workaround (w0[2]); + w0[3] = swap_workaround (w0[3]); + w1[0] = swap_workaround (w1[0]); + w1[1] = swap_workaround (w1[1]); + w1[2] = swap_workaround (w1[2]); + w1[3] = swap_workaround (w1[3]); + w2[0] = swap_workaround (w2[0]); + w2[1] = swap_workaround (w2[1]); + w2[2] = swap_workaround (w2[2]); + w2[3] = swap_workaround (w2[3]); + w3[0] = swap_workaround (w3[0]); + w3[1] = swap_workaround (w3[1]); + w3[2] = swap_workaround (w3[2]); + w3[3] = swap_workaround (w3[3]); + + u32x ipad[8]; + u32x opad[8]; + + hmac_sha256_pad (w0, w1, w2, w3, ipad, opad); + + tmps[gid].ipad[0] = ipad[0]; + tmps[gid].ipad[1] = ipad[1]; + tmps[gid].ipad[2] = ipad[2]; + tmps[gid].ipad[3] = ipad[3]; + tmps[gid].ipad[4] = ipad[4]; + tmps[gid].ipad[5] = ipad[5]; + tmps[gid].ipad[6] = ipad[6]; + tmps[gid].ipad[7] = ipad[7]; + + tmps[gid].opad[0] = opad[0]; + tmps[gid].opad[1] = opad[1]; + tmps[gid].opad[2] = opad[2]; + tmps[gid].opad[3] = opad[3]; + tmps[gid].opad[4] = opad[4]; + tmps[gid].opad[5] = opad[5]; + tmps[gid].opad[6] = opad[6]; + tmps[gid].opad[7] = opad[7]; + + w0[0] = salt_buf0[0]; + w0[1] = salt_buf0[1]; + w0[2] = salt_buf0[2]; + w0[3] = salt_buf0[3]; + w1[0] = salt_buf1[0]; + w1[1] = salt_buf1[1]; + w1[2] = salt_buf1[2]; + w1[3] = salt_buf1[3]; + w2[0] = salt_buf2[0]; + w2[1] = salt_buf2[1]; + w2[2] = salt_buf2[2]; + w2[3] = salt_buf2[3]; + w3[0] = salt_buf3[0]; + w3[1] = salt_buf3[1]; + w3[2] = salt_buf3[2]; + // w3[3] = 0; + + w0[0] = swap_workaround (w0[0]); + w0[1] = swap_workaround (w0[1]); + w0[2] = swap_workaround (w0[2]); + w0[3] = swap_workaround (w0[3]); + w1[0] = swap_workaround (w1[0]); + w1[1] = swap_workaround (w1[1]); + w1[2] = swap_workaround (w1[2]); + w1[3] = swap_workaround (w1[3]); + w2[0] = swap_workaround (w2[0]); + w2[1] = swap_workaround (w2[1]); + w2[2] = swap_workaround (w2[2]); + w2[3] = swap_workaround (w2[3]); + w3[0] = swap_workaround (w3[0]); + w3[1] = swap_workaround (w3[1]); + w3[2] = swap_workaround (w3[2]); + w3[3] = (64 + salt_len + 4) * 8; + + u32x dgst[8]; + + hmac_sha256_run (w0, w1, w2, w3, ipad, opad, dgst); + + tmps[gid].dgst[0] = dgst[0]; + tmps[gid].dgst[1] = dgst[1]; + tmps[gid].dgst[2] = dgst[2]; + tmps[gid].dgst[3] = dgst[3]; + tmps[gid].dgst[4] = dgst[4]; + tmps[gid].dgst[5] = dgst[5]; + tmps[gid].dgst[6] = dgst[6]; + tmps[gid].dgst[7] = dgst[7]; + + tmps[gid].out[0] = dgst[0]; + tmps[gid].out[1] = dgst[1]; + tmps[gid].out[2] = dgst[2]; + tmps[gid].out[3] = dgst[3]; + tmps[gid].out[4] = dgst[4]; + tmps[gid].out[5] = dgst[5]; + tmps[gid].out[6] = dgst[6]; + tmps[gid].out[7] = dgst[7]; +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m06400_loop (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, sha256aix_tmp_t *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x ipad[8]; + u32x opad[8]; + + ipad[0] = tmps[gid].ipad[0]; + ipad[1] = tmps[gid].ipad[1]; + ipad[2] = tmps[gid].ipad[2]; + ipad[3] = tmps[gid].ipad[3]; + ipad[4] = tmps[gid].ipad[4]; + ipad[5] = tmps[gid].ipad[5]; + ipad[6] = tmps[gid].ipad[6]; + ipad[7] = tmps[gid].ipad[7]; + + opad[0] = tmps[gid].opad[0]; + opad[1] = tmps[gid].opad[1]; + opad[2] = tmps[gid].opad[2]; + opad[3] = tmps[gid].opad[3]; + opad[4] = tmps[gid].opad[4]; + opad[5] = tmps[gid].opad[5]; + opad[6] = tmps[gid].opad[6]; + opad[7] = tmps[gid].opad[7]; + + u32x dgst[8]; + u32x out[8]; + + dgst[0] = tmps[gid].dgst[0]; + dgst[1] = tmps[gid].dgst[1]; + dgst[2] = tmps[gid].dgst[2]; + dgst[3] = tmps[gid].dgst[3]; + dgst[4] = tmps[gid].dgst[4]; + dgst[5] = tmps[gid].dgst[5]; + dgst[6] = tmps[gid].dgst[6]; + dgst[7] = tmps[gid].dgst[7]; + + out[0] = tmps[gid].out[0]; + out[1] = tmps[gid].out[1]; + out[2] = tmps[gid].out[2]; + out[3] = tmps[gid].out[3]; + out[4] = tmps[gid].out[4]; + out[5] = tmps[gid].out[5]; + out[6] = tmps[gid].out[6]; + out[7] = tmps[gid].out[7]; + + for (u32 j = 0; j < loop_cnt; j++) + { + u32x w0[4]; + u32x w1[4]; + u32x w2[4]; + u32x w3[4]; + + w0[0] = dgst[0]; + w0[1] = dgst[1]; + w0[2] = dgst[2]; + w0[3] = dgst[3]; + w1[0] = dgst[4]; + w1[1] = dgst[5]; + w1[2] = dgst[6]; + w1[3] = dgst[7]; + w2[0] = 0x80000000; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = (64 + 32) * 8; + + hmac_sha256_run (w0, w1, w2, w3, ipad, opad, dgst); + + out[0] ^= dgst[0]; + out[1] ^= dgst[1]; + out[2] ^= dgst[2]; + out[3] ^= dgst[3]; + out[4] ^= dgst[4]; + out[5] ^= dgst[5]; + out[6] ^= dgst[6]; + out[7] ^= dgst[7]; + } + + tmps[gid].dgst[0] = dgst[0]; + tmps[gid].dgst[1] = dgst[1]; + tmps[gid].dgst[2] = dgst[2]; + tmps[gid].dgst[3] = dgst[3]; + tmps[gid].dgst[4] = dgst[4]; + tmps[gid].dgst[5] = dgst[5]; + tmps[gid].dgst[6] = dgst[6]; + tmps[gid].dgst[7] = dgst[7]; + + tmps[gid].out[0] = out[0]; + tmps[gid].out[1] = out[1]; + tmps[gid].out[2] = out[2]; + tmps[gid].out[3] = out[3]; + tmps[gid].out[4] = out[4]; + tmps[gid].out[5] = out[5]; + tmps[gid].out[6] = out[6]; + tmps[gid].out[7] = out[7]; +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m06400_comp (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, sha256aix_tmp_t *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + const u32 lid = threadIdx.x; + + /** + * digest + */ + + const u32x r0 = tmps[gid].out[DGST_R0]; + const u32x r1 = tmps[gid].out[DGST_R1]; + const u32x r2 = tmps[gid].out[DGST_R2]; + const u32x r3 = tmps[gid].out[DGST_R3]; + + /* + u32x a = tmps[gid].out[0]; + u32x b = tmps[gid].out[1]; + u32x c = tmps[gid].out[2]; + u32x d = tmps[gid].out[3]; + u32x e = tmps[gid].out[4]; + u32x f = tmps[gid].out[5]; + u32x g = tmps[gid].out[6]; + u32x h = tmps[gid].out[7] & 0xffff03ff; + */ + + #define il_pos 0 + + #include VECT_COMPARE_M +} diff --git a/nv/m06500.cu b/nv/m06500.cu new file mode 100644 index 0000000000..ed429d4cef --- /dev/null +++ b/nv/m06500.cu @@ -0,0 +1,583 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _SHA512_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW2 +#define VECT_SIZE1 +#endif + +#define DGST_R0 0 +#define DGST_R1 1 +#define DGST_R2 2 +#define DGST_R3 3 + +#include "include/kernel_functions.c" +#include "types_nv.c" +#include "common_nv.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +__device__ __constant__ u64 k[80] = +{ + SHA512C00, SHA512C01, SHA512C02, SHA512C03, + SHA512C04, SHA512C05, SHA512C06, SHA512C07, + SHA512C08, SHA512C09, SHA512C0a, SHA512C0b, + SHA512C0c, SHA512C0d, SHA512C0e, SHA512C0f, + SHA512C10, SHA512C11, SHA512C12, SHA512C13, + SHA512C14, SHA512C15, SHA512C16, SHA512C17, + SHA512C18, SHA512C19, SHA512C1a, SHA512C1b, + SHA512C1c, SHA512C1d, SHA512C1e, SHA512C1f, + SHA512C20, SHA512C21, SHA512C22, SHA512C23, + SHA512C24, SHA512C25, SHA512C26, SHA512C27, + SHA512C28, SHA512C29, SHA512C2a, SHA512C2b, + SHA512C2c, SHA512C2d, SHA512C2e, SHA512C2f, + SHA512C30, SHA512C31, SHA512C32, SHA512C33, + SHA512C34, SHA512C35, SHA512C36, SHA512C37, + SHA512C38, SHA512C39, SHA512C3a, SHA512C3b, + SHA512C3c, SHA512C3d, SHA512C3e, SHA512C3f, + SHA512C40, SHA512C41, SHA512C42, SHA512C43, + SHA512C44, SHA512C45, SHA512C46, SHA512C47, + SHA512C48, SHA512C49, SHA512C4a, SHA512C4b, + SHA512C4c, SHA512C4d, SHA512C4e, SHA512C4f, +}; + +#define ROUND_EXPAND() \ +{ \ + w0_t = SHA512_EXPAND (we_t, w9_t, w1_t, w0_t); \ + w1_t = SHA512_EXPAND (wf_t, wa_t, w2_t, w1_t); \ + w2_t = SHA512_EXPAND (w0_t, wb_t, w3_t, w2_t); \ + w3_t = SHA512_EXPAND (w1_t, wc_t, w4_t, w3_t); \ + w4_t = SHA512_EXPAND (w2_t, wd_t, w5_t, w4_t); \ + w5_t = SHA512_EXPAND (w3_t, we_t, w6_t, w5_t); \ + w6_t = SHA512_EXPAND (w4_t, wf_t, w7_t, w6_t); \ + w7_t = SHA512_EXPAND (w5_t, w0_t, w8_t, w7_t); \ + w8_t = SHA512_EXPAND (w6_t, w1_t, w9_t, w8_t); \ + w9_t = SHA512_EXPAND (w7_t, w2_t, wa_t, w9_t); \ + wa_t = SHA512_EXPAND (w8_t, w3_t, wb_t, wa_t); \ + wb_t = SHA512_EXPAND (w9_t, w4_t, wc_t, wb_t); \ + wc_t = SHA512_EXPAND (wa_t, w5_t, wd_t, wc_t); \ + wd_t = SHA512_EXPAND (wb_t, w6_t, we_t, wd_t); \ + we_t = SHA512_EXPAND (wc_t, w7_t, wf_t, we_t); \ + wf_t = SHA512_EXPAND (wd_t, w8_t, w0_t, wf_t); \ +} + +#define ROUND_STEP(i) \ +{ \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, a, b, c, d, e, f, g, h, w0_t, k[i + 0]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, h, a, b, c, d, e, f, g, w1_t, k[i + 1]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, g, h, a, b, c, d, e, f, w2_t, k[i + 2]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, f, g, h, a, b, c, d, e, w3_t, k[i + 3]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, e, f, g, h, a, b, c, d, w4_t, k[i + 4]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, d, e, f, g, h, a, b, c, w5_t, k[i + 5]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, c, d, e, f, g, h, a, b, w6_t, k[i + 6]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, b, c, d, e, f, g, h, a, w7_t, k[i + 7]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, a, b, c, d, e, f, g, h, w8_t, k[i + 8]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, h, a, b, c, d, e, f, g, w9_t, k[i + 9]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, g, h, a, b, c, d, e, f, wa_t, k[i + 10]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, f, g, h, a, b, c, d, e, wb_t, k[i + 11]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, e, f, g, h, a, b, c, d, wc_t, k[i + 12]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, d, e, f, g, h, a, b, c, wd_t, k[i + 13]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, c, d, e, f, g, h, a, b, we_t, k[i + 14]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, b, c, d, e, f, g, h, a, wf_t, k[i + 15]); \ +} + +__device__ static void sha512_transform (const u64x w0[4], const u64x w1[4], const u64x w2[4], const u64x w3[4], u64x digest[8]) +{ + u64x a = digest[0]; + u64x b = digest[1]; + u64x c = digest[2]; + u64x d = digest[3]; + u64x e = digest[4]; + u64x f = digest[5]; + u64x g = digest[6]; + u64x h = digest[7]; + + u64x w0_t = w0[0]; + u64x w1_t = w0[1]; + u64x w2_t = w0[2]; + u64x w3_t = w0[3]; + u64x w4_t = w1[0]; + u64x w5_t = w1[1]; + u64x w6_t = w1[2]; + u64x w7_t = w1[3]; + u64x w8_t = w2[0]; + u64x w9_t = w2[1]; + u64x wa_t = w2[2]; + u64x wb_t = w2[3]; + u64x wc_t = w3[0]; + u64x wd_t = w3[1]; + u64x we_t = w3[2]; + u64x wf_t = w3[3]; + + ROUND_STEP (0); + + for (int i = 16; i < 80; i += 16) + { + ROUND_EXPAND (); ROUND_STEP (i); + } + + digest[0] += a; + digest[1] += b; + digest[2] += c; + digest[3] += d; + digest[4] += e; + digest[5] += f; + digest[6] += g; + digest[7] += h; +} + +__device__ static void hmac_sha512_pad (u64x w0[4], u64x w1[4], u64x w2[4], u64x w3[4], u64x ipad[8], u64x opad[8]) +{ + w0[0] = w0[0] ^ 0x3636363636363636; + w0[1] = w0[1] ^ 0x3636363636363636; + w0[2] = w0[2] ^ 0x3636363636363636; + w0[3] = w0[3] ^ 0x3636363636363636; + w1[0] = w1[0] ^ 0x3636363636363636; + w1[1] = w1[1] ^ 0x3636363636363636; + w1[2] = w1[2] ^ 0x3636363636363636; + w1[3] = w1[3] ^ 0x3636363636363636; + w2[0] = w2[0] ^ 0x3636363636363636; + w2[1] = w2[1] ^ 0x3636363636363636; + w2[2] = w2[2] ^ 0x3636363636363636; + w2[3] = w2[3] ^ 0x3636363636363636; + w3[0] = w3[0] ^ 0x3636363636363636; + w3[1] = w3[1] ^ 0x3636363636363636; + w3[2] = w3[2] ^ 0x3636363636363636; + w3[3] = w3[3] ^ 0x3636363636363636; + + ipad[0] = SHA512M_A; + ipad[1] = SHA512M_B; + ipad[2] = SHA512M_C; + ipad[3] = SHA512M_D; + ipad[4] = SHA512M_E; + ipad[5] = SHA512M_F; + ipad[6] = SHA512M_G; + ipad[7] = SHA512M_H; + + sha512_transform (w0, w1, w2, w3, ipad); + + w0[0] = w0[0] ^ 0x6a6a6a6a6a6a6a6a; + w0[1] = w0[1] ^ 0x6a6a6a6a6a6a6a6a; + w0[2] = w0[2] ^ 0x6a6a6a6a6a6a6a6a; + w0[3] = w0[3] ^ 0x6a6a6a6a6a6a6a6a; + w1[0] = w1[0] ^ 0x6a6a6a6a6a6a6a6a; + w1[1] = w1[1] ^ 0x6a6a6a6a6a6a6a6a; + w1[2] = w1[2] ^ 0x6a6a6a6a6a6a6a6a; + w1[3] = w1[3] ^ 0x6a6a6a6a6a6a6a6a; + w2[0] = w2[0] ^ 0x6a6a6a6a6a6a6a6a; + w2[1] = w2[1] ^ 0x6a6a6a6a6a6a6a6a; + w2[2] = w2[2] ^ 0x6a6a6a6a6a6a6a6a; + w2[3] = w2[3] ^ 0x6a6a6a6a6a6a6a6a; + w3[0] = w3[0] ^ 0x6a6a6a6a6a6a6a6a; + w3[1] = w3[1] ^ 0x6a6a6a6a6a6a6a6a; + w3[2] = w3[2] ^ 0x6a6a6a6a6a6a6a6a; + w3[3] = w3[3] ^ 0x6a6a6a6a6a6a6a6a; + + opad[0] = SHA512M_A; + opad[1] = SHA512M_B; + opad[2] = SHA512M_C; + opad[3] = SHA512M_D; + opad[4] = SHA512M_E; + opad[5] = SHA512M_F; + opad[6] = SHA512M_G; + opad[7] = SHA512M_H; + + sha512_transform (w0, w1, w2, w3, opad); +} + +__device__ static void hmac_sha512_run (u64x w0[4], u64x w1[4], u64x w2[4], u64x w3[4], u64x ipad[8], u64x opad[8], u64x digest[8]) +{ + digest[0] = ipad[0]; + digest[1] = ipad[1]; + digest[2] = ipad[2]; + digest[3] = ipad[3]; + digest[4] = ipad[4]; + digest[5] = ipad[5]; + digest[6] = ipad[6]; + digest[7] = ipad[7]; + + sha512_transform (w0, w1, w2, w3, digest); + + w0[0] = digest[0]; + w0[1] = digest[1]; + w0[2] = digest[2]; + w0[3] = digest[3]; + w1[0] = digest[4]; + w1[1] = digest[5]; + w1[2] = digest[6]; + w1[3] = digest[7]; + w2[0] = 0x8000000000000000; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = (128 + 64) * 8; + + digest[0] = opad[0]; + digest[1] = opad[1]; + digest[2] = opad[2]; + digest[3] = opad[3]; + digest[4] = opad[4]; + digest[5] = opad[5]; + digest[6] = opad[6]; + digest[7] = opad[7]; + + sha512_transform (w0, w1, w2, w3, digest); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m06500_init (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, sha512aix_tmp_t *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = pws[gid].i[ 8]; + w2[1] = pws[gid].i[ 9]; + w2[2] = pws[gid].i[10]; + w2[3] = pws[gid].i[11]; + + u32x w3[4]; + + w3[0] = pws[gid].i[12]; + w3[1] = pws[gid].i[13]; + w3[2] = pws[gid].i[14]; + w3[3] = pws[gid].i[15]; + + /** + * salt + */ + + u32 salt_len = salt_bufs[salt_pos].salt_len; + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[ 1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[ 2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[ 3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[ 4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[ 5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[ 6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[ 7]; + + u32 salt_buf2[4]; + + salt_buf2[0] = salt_bufs[salt_pos].salt_buf[ 8]; + salt_buf2[1] = salt_bufs[salt_pos].salt_buf[ 9]; + salt_buf2[2] = salt_bufs[salt_pos].salt_buf[10]; + salt_buf2[3] = salt_bufs[salt_pos].salt_buf[11]; + + u32 salt_buf3[4]; + + salt_buf3[0] = 0; + salt_buf3[1] = 0; + salt_buf3[2] = 0; + salt_buf3[3] = 0; + + append_0x01_4 (salt_buf0, salt_buf1, salt_buf2, salt_buf3, salt_len + 3); + + append_0x80_4 (salt_buf0, salt_buf1, salt_buf2, salt_buf3, salt_len + 4); + + /** + * pads + */ + + w0[0] = swap_workaround (w0[0]); + w0[1] = swap_workaround (w0[1]); + w0[2] = swap_workaround (w0[2]); + w0[3] = swap_workaround (w0[3]); + w1[0] = swap_workaround (w1[0]); + w1[1] = swap_workaround (w1[1]); + w1[2] = swap_workaround (w1[2]); + w1[3] = swap_workaround (w1[3]); + w2[0] = swap_workaround (w2[0]); + w2[1] = swap_workaround (w2[1]); + w2[2] = swap_workaround (w2[2]); + w2[3] = swap_workaround (w2[3]); + w3[0] = swap_workaround (w3[0]); + w3[1] = swap_workaround (w3[1]); + w3[2] = swap_workaround (w3[2]); + w3[3] = swap_workaround (w3[3]); + + u64x w0l[4]; + u64x w1l[4]; + u64x w2l[4]; + u64x w3l[4]; + + w0l[0] = (u64x) (w0[0]) << 32 | (u64x) (w0[1]); + w0l[1] = (u64x) (w0[2]) << 32 | (u64x) (w0[3]); + w0l[2] = (u64x) (w1[0]) << 32 | (u64x) (w1[1]); + w0l[3] = (u64x) (w1[2]) << 32 | (u64x) (w1[3]); + w1l[0] = (u64x) (w2[0]) << 32 | (u64x) (w2[1]); + w1l[1] = (u64x) (w2[2]) << 32 | (u64x) (w2[3]); + w1l[2] = (u64x) (w3[0]) << 32 | (u64x) (w3[1]); + w1l[3] = (u64x) (w3[2]) << 32 | (u64x) (w3[3]); + w2l[0] = 0; + w2l[1] = 0; + w2l[2] = 0; + w2l[3] = 0; + w3l[0] = 0; + w3l[1] = 0; + w3l[2] = 0; + w3l[3] = 0; + + u64x ipad[8]; + u64x opad[8]; + + hmac_sha512_pad (w0l, w1l, w2l, w3l, ipad, opad); + + tmps[gid].ipad[0] = ipad[0]; + tmps[gid].ipad[1] = ipad[1]; + tmps[gid].ipad[2] = ipad[2]; + tmps[gid].ipad[3] = ipad[3]; + tmps[gid].ipad[4] = ipad[4]; + tmps[gid].ipad[5] = ipad[5]; + tmps[gid].ipad[6] = ipad[6]; + tmps[gid].ipad[7] = ipad[7]; + + tmps[gid].opad[0] = opad[0]; + tmps[gid].opad[1] = opad[1]; + tmps[gid].opad[2] = opad[2]; + tmps[gid].opad[3] = opad[3]; + tmps[gid].opad[4] = opad[4]; + tmps[gid].opad[5] = opad[5]; + tmps[gid].opad[6] = opad[6]; + tmps[gid].opad[7] = opad[7]; + + w0l[0] = (u64x) salt_buf0[1] << 32 | (u64x) salt_buf0[0]; + w0l[1] = (u64x) salt_buf0[3] << 32 | (u64x) salt_buf0[2]; + w0l[2] = (u64x) salt_buf1[1] << 32 | (u64x) salt_buf1[0]; + w0l[3] = (u64x) salt_buf1[3] << 32 | (u64x) salt_buf1[2]; + w1l[0] = (u64x) salt_buf2[1] << 32 | (u64x) salt_buf2[0]; + w1l[1] = (u64x) salt_buf2[3] << 32 | (u64x) salt_buf2[2]; + w1l[2] = (u64x) salt_buf3[1] << 32 | (u64x) salt_buf3[0]; + w1l[3] = (u64x) salt_buf3[3] << 32 | (u64x) salt_buf3[2]; + w2l[0] = 0; + w2l[1] = 0; + w2l[2] = 0; + w2l[3] = 0; + w3l[0] = 0; + w3l[1] = 0; + w3l[2] = 0; + w3l[3] = 0; + + w0l[0] = swap_workaround (w0l[0]); + w0l[1] = swap_workaround (w0l[1]); + w0l[2] = swap_workaround (w0l[2]); + w0l[3] = swap_workaround (w0l[3]); + w1l[0] = swap_workaround (w1l[0]); + w1l[1] = swap_workaround (w1l[1]); + w1l[2] = swap_workaround (w1l[2]); + w1l[3] = swap_workaround (w1l[3]); + w2l[0] = 0; + w2l[1] = 0; + w2l[2] = 0; + w2l[3] = 0; + w3l[0] = 0; + w3l[1] = 0; + w3l[2] = 0; + w3l[3] = (128 + salt_len + 4) * 8; + + u64x dgst[8]; + + hmac_sha512_run (w0l, w1l, w2l, w3l, ipad, opad, dgst); + + tmps[gid].dgst[0] = dgst[0]; + tmps[gid].dgst[1] = dgst[1]; + tmps[gid].dgst[2] = dgst[2]; + tmps[gid].dgst[3] = dgst[3]; + tmps[gid].dgst[4] = dgst[4]; + tmps[gid].dgst[5] = dgst[5]; + tmps[gid].dgst[6] = dgst[6]; + tmps[gid].dgst[7] = dgst[7]; + + tmps[gid].out[0] = dgst[0]; + tmps[gid].out[1] = dgst[1]; + tmps[gid].out[2] = dgst[2]; + tmps[gid].out[3] = dgst[3]; + tmps[gid].out[4] = dgst[4]; + tmps[gid].out[5] = dgst[5]; + tmps[gid].out[6] = dgst[6]; + tmps[gid].out[7] = dgst[7]; +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m06500_loop (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, sha512aix_tmp_t *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u64x ipad[8]; + u64x opad[8]; + + ipad[0] = tmps[gid].ipad[0]; + ipad[1] = tmps[gid].ipad[1]; + ipad[2] = tmps[gid].ipad[2]; + ipad[3] = tmps[gid].ipad[3]; + ipad[4] = tmps[gid].ipad[4]; + ipad[5] = tmps[gid].ipad[5]; + ipad[6] = tmps[gid].ipad[6]; + ipad[7] = tmps[gid].ipad[7]; + + opad[0] = tmps[gid].opad[0]; + opad[1] = tmps[gid].opad[1]; + opad[2] = tmps[gid].opad[2]; + opad[3] = tmps[gid].opad[3]; + opad[4] = tmps[gid].opad[4]; + opad[5] = tmps[gid].opad[5]; + opad[6] = tmps[gid].opad[6]; + opad[7] = tmps[gid].opad[7]; + + u64x dgst[8]; + u64x out[8]; + + dgst[0] = tmps[gid].dgst[0]; + dgst[1] = tmps[gid].dgst[1]; + dgst[2] = tmps[gid].dgst[2]; + dgst[3] = tmps[gid].dgst[3]; + dgst[4] = tmps[gid].dgst[4]; + dgst[5] = tmps[gid].dgst[5]; + dgst[6] = tmps[gid].dgst[6]; + dgst[7] = tmps[gid].dgst[7]; + + out[0] = tmps[gid].out[0]; + out[1] = tmps[gid].out[1]; + out[2] = tmps[gid].out[2]; + out[3] = tmps[gid].out[3]; + out[4] = tmps[gid].out[4]; + out[5] = tmps[gid].out[5]; + out[6] = tmps[gid].out[6]; + out[7] = tmps[gid].out[7]; + + for (u32 j = 0; j < loop_cnt; j++) + { + u64x w0[4]; + u64x w1[4]; + u64x w2[4]; + u64x w3[4]; + + w0[0] = dgst[0]; + w0[1] = dgst[1]; + w0[2] = dgst[2]; + w0[3] = dgst[3]; + w1[0] = dgst[4]; + w1[1] = dgst[5]; + w1[2] = dgst[6]; + w1[3] = dgst[7]; + w2[0] = 0x8000000000000000; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = (128 + 64) * 8; + + hmac_sha512_run (w0, w1, w2, w3, ipad, opad, dgst); + + out[0] ^= dgst[0]; + out[1] ^= dgst[1]; + out[2] ^= dgst[2]; + out[3] ^= dgst[3]; + out[4] ^= dgst[4]; + out[5] ^= dgst[5]; + out[6] ^= dgst[6]; + out[7] ^= dgst[7]; + } + + tmps[gid].dgst[0] = dgst[0]; + tmps[gid].dgst[1] = dgst[1]; + tmps[gid].dgst[2] = dgst[2]; + tmps[gid].dgst[3] = dgst[3]; + tmps[gid].dgst[4] = dgst[4]; + tmps[gid].dgst[5] = dgst[5]; + tmps[gid].dgst[6] = dgst[6]; + tmps[gid].dgst[7] = dgst[7]; + + tmps[gid].out[0] = out[0]; + tmps[gid].out[1] = out[1]; + tmps[gid].out[2] = out[2]; + tmps[gid].out[3] = out[3]; + tmps[gid].out[4] = out[4]; + tmps[gid].out[5] = out[5]; + tmps[gid].out[6] = out[6]; + tmps[gid].out[7] = out[7]; +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m06500_comp (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, sha512aix_tmp_t *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + const u32 lid = threadIdx.x; + + /** + * digest + */ + + /* + u64x a = tmps[gid].out[0]; + u64x b = tmps[gid].out[1]; + u64x c = tmps[gid].out[2]; + u64x d = tmps[gid].out[3]; + u64x e = tmps[gid].out[4]; + u64x f = tmps[gid].out[5]; + u64x g = tmps[gid].out[6]; + u64x h = tmps[gid].out[7] & 0xffffffffffffff00; + */ + + const u32x r0 = l32_from_64 (tmps[gid].out[0]); + const u32x r1 = h32_from_64 (tmps[gid].out[0]); + const u32x r2 = l32_from_64 (tmps[gid].out[1]); + const u32x r3 = h32_from_64 (tmps[gid].out[1]); + + #define il_pos 0 + + #include VECT_COMPARE_M +} diff --git a/nv/m06600.cu b/nv/m06600.cu new file mode 100644 index 0000000000..8f46b44f1a --- /dev/null +++ b/nv/m06600.cu @@ -0,0 +1,1414 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _SHA1_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW2 +#define VECT_SIZE1 +#endif + +#define DGST_R0 0 +#define DGST_R1 1 +#define DGST_R2 2 +#define DGST_R3 3 + +#include "include/kernel_functions.c" +#include "types_nv.c" +#include "common_nv.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +__device__ __constant__ u32 te0[256] = +{ + 0xc66363a5, 0xf87c7c84, 0xee777799, 0xf67b7b8d, + 0xfff2f20d, 0xd66b6bbd, 0xde6f6fb1, 0x91c5c554, + 0x60303050, 0x02010103, 0xce6767a9, 0x562b2b7d, + 0xe7fefe19, 0xb5d7d762, 0x4dababe6, 0xec76769a, + 0x8fcaca45, 0x1f82829d, 0x89c9c940, 0xfa7d7d87, + 0xeffafa15, 0xb25959eb, 0x8e4747c9, 0xfbf0f00b, + 0x41adadec, 0xb3d4d467, 0x5fa2a2fd, 0x45afafea, + 0x239c9cbf, 0x53a4a4f7, 0xe4727296, 0x9bc0c05b, + 0x75b7b7c2, 0xe1fdfd1c, 0x3d9393ae, 0x4c26266a, + 0x6c36365a, 0x7e3f3f41, 0xf5f7f702, 0x83cccc4f, + 0x6834345c, 0x51a5a5f4, 0xd1e5e534, 0xf9f1f108, + 0xe2717193, 0xabd8d873, 0x62313153, 0x2a15153f, + 0x0804040c, 0x95c7c752, 0x46232365, 0x9dc3c35e, + 0x30181828, 0x379696a1, 0x0a05050f, 0x2f9a9ab5, + 0x0e070709, 0x24121236, 0x1b80809b, 0xdfe2e23d, + 0xcdebeb26, 0x4e272769, 0x7fb2b2cd, 0xea75759f, + 0x1209091b, 0x1d83839e, 0x582c2c74, 0x341a1a2e, + 0x361b1b2d, 0xdc6e6eb2, 0xb45a5aee, 0x5ba0a0fb, + 0xa45252f6, 0x763b3b4d, 0xb7d6d661, 0x7db3b3ce, + 0x5229297b, 0xdde3e33e, 0x5e2f2f71, 0x13848497, + 0xa65353f5, 0xb9d1d168, 0x00000000, 0xc1eded2c, + 0x40202060, 0xe3fcfc1f, 0x79b1b1c8, 0xb65b5bed, + 0xd46a6abe, 0x8dcbcb46, 0x67bebed9, 0x7239394b, + 0x944a4ade, 0x984c4cd4, 0xb05858e8, 0x85cfcf4a, + 0xbbd0d06b, 0xc5efef2a, 0x4faaaae5, 0xedfbfb16, + 0x864343c5, 0x9a4d4dd7, 0x66333355, 0x11858594, + 0x8a4545cf, 0xe9f9f910, 0x04020206, 0xfe7f7f81, + 0xa05050f0, 0x783c3c44, 0x259f9fba, 0x4ba8a8e3, + 0xa25151f3, 0x5da3a3fe, 0x804040c0, 0x058f8f8a, + 0x3f9292ad, 0x219d9dbc, 0x70383848, 0xf1f5f504, + 0x63bcbcdf, 0x77b6b6c1, 0xafdada75, 0x42212163, + 0x20101030, 0xe5ffff1a, 0xfdf3f30e, 0xbfd2d26d, + 0x81cdcd4c, 0x180c0c14, 0x26131335, 0xc3ecec2f, + 0xbe5f5fe1, 0x359797a2, 0x884444cc, 0x2e171739, + 0x93c4c457, 0x55a7a7f2, 0xfc7e7e82, 0x7a3d3d47, + 0xc86464ac, 0xba5d5de7, 0x3219192b, 0xe6737395, + 0xc06060a0, 0x19818198, 0x9e4f4fd1, 0xa3dcdc7f, + 0x44222266, 0x542a2a7e, 0x3b9090ab, 0x0b888883, + 0x8c4646ca, 0xc7eeee29, 0x6bb8b8d3, 0x2814143c, + 0xa7dede79, 0xbc5e5ee2, 0x160b0b1d, 0xaddbdb76, + 0xdbe0e03b, 0x64323256, 0x743a3a4e, 0x140a0a1e, + 0x924949db, 0x0c06060a, 0x4824246c, 0xb85c5ce4, + 0x9fc2c25d, 0xbdd3d36e, 0x43acacef, 0xc46262a6, + 0x399191a8, 0x319595a4, 0xd3e4e437, 0xf279798b, + 0xd5e7e732, 0x8bc8c843, 0x6e373759, 0xda6d6db7, + 0x018d8d8c, 0xb1d5d564, 0x9c4e4ed2, 0x49a9a9e0, + 0xd86c6cb4, 0xac5656fa, 0xf3f4f407, 0xcfeaea25, + 0xca6565af, 0xf47a7a8e, 0x47aeaee9, 0x10080818, + 0x6fbabad5, 0xf0787888, 0x4a25256f, 0x5c2e2e72, + 0x381c1c24, 0x57a6a6f1, 0x73b4b4c7, 0x97c6c651, + 0xcbe8e823, 0xa1dddd7c, 0xe874749c, 0x3e1f1f21, + 0x964b4bdd, 0x61bdbddc, 0x0d8b8b86, 0x0f8a8a85, + 0xe0707090, 0x7c3e3e42, 0x71b5b5c4, 0xcc6666aa, + 0x904848d8, 0x06030305, 0xf7f6f601, 0x1c0e0e12, + 0xc26161a3, 0x6a35355f, 0xae5757f9, 0x69b9b9d0, + 0x17868691, 0x99c1c158, 0x3a1d1d27, 0x279e9eb9, + 0xd9e1e138, 0xebf8f813, 0x2b9898b3, 0x22111133, + 0xd26969bb, 0xa9d9d970, 0x078e8e89, 0x339494a7, + 0x2d9b9bb6, 0x3c1e1e22, 0x15878792, 0xc9e9e920, + 0x87cece49, 0xaa5555ff, 0x50282878, 0xa5dfdf7a, + 0x038c8c8f, 0x59a1a1f8, 0x09898980, 0x1a0d0d17, + 0x65bfbfda, 0xd7e6e631, 0x844242c6, 0xd06868b8, + 0x824141c3, 0x299999b0, 0x5a2d2d77, 0x1e0f0f11, + 0x7bb0b0cb, 0xa85454fc, 0x6dbbbbd6, 0x2c16163a, +}; + +__device__ __constant__ u32 te1[256] = +{ + 0xa5c66363, 0x84f87c7c, 0x99ee7777, 0x8df67b7b, + 0x0dfff2f2, 0xbdd66b6b, 0xb1de6f6f, 0x5491c5c5, + 0x50603030, 0x03020101, 0xa9ce6767, 0x7d562b2b, + 0x19e7fefe, 0x62b5d7d7, 0xe64dabab, 0x9aec7676, + 0x458fcaca, 0x9d1f8282, 0x4089c9c9, 0x87fa7d7d, + 0x15effafa, 0xebb25959, 0xc98e4747, 0x0bfbf0f0, + 0xec41adad, 0x67b3d4d4, 0xfd5fa2a2, 0xea45afaf, + 0xbf239c9c, 0xf753a4a4, 0x96e47272, 0x5b9bc0c0, + 0xc275b7b7, 0x1ce1fdfd, 0xae3d9393, 0x6a4c2626, + 0x5a6c3636, 0x417e3f3f, 0x02f5f7f7, 0x4f83cccc, + 0x5c683434, 0xf451a5a5, 0x34d1e5e5, 0x08f9f1f1, + 0x93e27171, 0x73abd8d8, 0x53623131, 0x3f2a1515, + 0x0c080404, 0x5295c7c7, 0x65462323, 0x5e9dc3c3, + 0x28301818, 0xa1379696, 0x0f0a0505, 0xb52f9a9a, + 0x090e0707, 0x36241212, 0x9b1b8080, 0x3ddfe2e2, + 0x26cdebeb, 0x694e2727, 0xcd7fb2b2, 0x9fea7575, + 0x1b120909, 0x9e1d8383, 0x74582c2c, 0x2e341a1a, + 0x2d361b1b, 0xb2dc6e6e, 0xeeb45a5a, 0xfb5ba0a0, + 0xf6a45252, 0x4d763b3b, 0x61b7d6d6, 0xce7db3b3, + 0x7b522929, 0x3edde3e3, 0x715e2f2f, 0x97138484, + 0xf5a65353, 0x68b9d1d1, 0x00000000, 0x2cc1eded, + 0x60402020, 0x1fe3fcfc, 0xc879b1b1, 0xedb65b5b, + 0xbed46a6a, 0x468dcbcb, 0xd967bebe, 0x4b723939, + 0xde944a4a, 0xd4984c4c, 0xe8b05858, 0x4a85cfcf, + 0x6bbbd0d0, 0x2ac5efef, 0xe54faaaa, 0x16edfbfb, + 0xc5864343, 0xd79a4d4d, 0x55663333, 0x94118585, + 0xcf8a4545, 0x10e9f9f9, 0x06040202, 0x81fe7f7f, + 0xf0a05050, 0x44783c3c, 0xba259f9f, 0xe34ba8a8, + 0xf3a25151, 0xfe5da3a3, 0xc0804040, 0x8a058f8f, + 0xad3f9292, 0xbc219d9d, 0x48703838, 0x04f1f5f5, + 0xdf63bcbc, 0xc177b6b6, 0x75afdada, 0x63422121, + 0x30201010, 0x1ae5ffff, 0x0efdf3f3, 0x6dbfd2d2, + 0x4c81cdcd, 0x14180c0c, 0x35261313, 0x2fc3ecec, + 0xe1be5f5f, 0xa2359797, 0xcc884444, 0x392e1717, + 0x5793c4c4, 0xf255a7a7, 0x82fc7e7e, 0x477a3d3d, + 0xacc86464, 0xe7ba5d5d, 0x2b321919, 0x95e67373, + 0xa0c06060, 0x98198181, 0xd19e4f4f, 0x7fa3dcdc, + 0x66442222, 0x7e542a2a, 0xab3b9090, 0x830b8888, + 0xca8c4646, 0x29c7eeee, 0xd36bb8b8, 0x3c281414, + 0x79a7dede, 0xe2bc5e5e, 0x1d160b0b, 0x76addbdb, + 0x3bdbe0e0, 0x56643232, 0x4e743a3a, 0x1e140a0a, + 0xdb924949, 0x0a0c0606, 0x6c482424, 0xe4b85c5c, + 0x5d9fc2c2, 0x6ebdd3d3, 0xef43acac, 0xa6c46262, + 0xa8399191, 0xa4319595, 0x37d3e4e4, 0x8bf27979, + 0x32d5e7e7, 0x438bc8c8, 0x596e3737, 0xb7da6d6d, + 0x8c018d8d, 0x64b1d5d5, 0xd29c4e4e, 0xe049a9a9, + 0xb4d86c6c, 0xfaac5656, 0x07f3f4f4, 0x25cfeaea, + 0xafca6565, 0x8ef47a7a, 0xe947aeae, 0x18100808, + 0xd56fbaba, 0x88f07878, 0x6f4a2525, 0x725c2e2e, + 0x24381c1c, 0xf157a6a6, 0xc773b4b4, 0x5197c6c6, + 0x23cbe8e8, 0x7ca1dddd, 0x9ce87474, 0x213e1f1f, + 0xdd964b4b, 0xdc61bdbd, 0x860d8b8b, 0x850f8a8a, + 0x90e07070, 0x427c3e3e, 0xc471b5b5, 0xaacc6666, + 0xd8904848, 0x05060303, 0x01f7f6f6, 0x121c0e0e, + 0xa3c26161, 0x5f6a3535, 0xf9ae5757, 0xd069b9b9, + 0x91178686, 0x5899c1c1, 0x273a1d1d, 0xb9279e9e, + 0x38d9e1e1, 0x13ebf8f8, 0xb32b9898, 0x33221111, + 0xbbd26969, 0x70a9d9d9, 0x89078e8e, 0xa7339494, + 0xb62d9b9b, 0x223c1e1e, 0x92158787, 0x20c9e9e9, + 0x4987cece, 0xffaa5555, 0x78502828, 0x7aa5dfdf, + 0x8f038c8c, 0xf859a1a1, 0x80098989, 0x171a0d0d, + 0xda65bfbf, 0x31d7e6e6, 0xc6844242, 0xb8d06868, + 0xc3824141, 0xb0299999, 0x775a2d2d, 0x111e0f0f, + 0xcb7bb0b0, 0xfca85454, 0xd66dbbbb, 0x3a2c1616, +}; + +__device__ __constant__ u32 te2[256] = +{ + 0x63a5c663, 0x7c84f87c, 0x7799ee77, 0x7b8df67b, + 0xf20dfff2, 0x6bbdd66b, 0x6fb1de6f, 0xc55491c5, + 0x30506030, 0x01030201, 0x67a9ce67, 0x2b7d562b, + 0xfe19e7fe, 0xd762b5d7, 0xabe64dab, 0x769aec76, + 0xca458fca, 0x829d1f82, 0xc94089c9, 0x7d87fa7d, + 0xfa15effa, 0x59ebb259, 0x47c98e47, 0xf00bfbf0, + 0xadec41ad, 0xd467b3d4, 0xa2fd5fa2, 0xafea45af, + 0x9cbf239c, 0xa4f753a4, 0x7296e472, 0xc05b9bc0, + 0xb7c275b7, 0xfd1ce1fd, 0x93ae3d93, 0x266a4c26, + 0x365a6c36, 0x3f417e3f, 0xf702f5f7, 0xcc4f83cc, + 0x345c6834, 0xa5f451a5, 0xe534d1e5, 0xf108f9f1, + 0x7193e271, 0xd873abd8, 0x31536231, 0x153f2a15, + 0x040c0804, 0xc75295c7, 0x23654623, 0xc35e9dc3, + 0x18283018, 0x96a13796, 0x050f0a05, 0x9ab52f9a, + 0x07090e07, 0x12362412, 0x809b1b80, 0xe23ddfe2, + 0xeb26cdeb, 0x27694e27, 0xb2cd7fb2, 0x759fea75, + 0x091b1209, 0x839e1d83, 0x2c74582c, 0x1a2e341a, + 0x1b2d361b, 0x6eb2dc6e, 0x5aeeb45a, 0xa0fb5ba0, + 0x52f6a452, 0x3b4d763b, 0xd661b7d6, 0xb3ce7db3, + 0x297b5229, 0xe33edde3, 0x2f715e2f, 0x84971384, + 0x53f5a653, 0xd168b9d1, 0x00000000, 0xed2cc1ed, + 0x20604020, 0xfc1fe3fc, 0xb1c879b1, 0x5bedb65b, + 0x6abed46a, 0xcb468dcb, 0xbed967be, 0x394b7239, + 0x4ade944a, 0x4cd4984c, 0x58e8b058, 0xcf4a85cf, + 0xd06bbbd0, 0xef2ac5ef, 0xaae54faa, 0xfb16edfb, + 0x43c58643, 0x4dd79a4d, 0x33556633, 0x85941185, + 0x45cf8a45, 0xf910e9f9, 0x02060402, 0x7f81fe7f, + 0x50f0a050, 0x3c44783c, 0x9fba259f, 0xa8e34ba8, + 0x51f3a251, 0xa3fe5da3, 0x40c08040, 0x8f8a058f, + 0x92ad3f92, 0x9dbc219d, 0x38487038, 0xf504f1f5, + 0xbcdf63bc, 0xb6c177b6, 0xda75afda, 0x21634221, + 0x10302010, 0xff1ae5ff, 0xf30efdf3, 0xd26dbfd2, + 0xcd4c81cd, 0x0c14180c, 0x13352613, 0xec2fc3ec, + 0x5fe1be5f, 0x97a23597, 0x44cc8844, 0x17392e17, + 0xc45793c4, 0xa7f255a7, 0x7e82fc7e, 0x3d477a3d, + 0x64acc864, 0x5de7ba5d, 0x192b3219, 0x7395e673, + 0x60a0c060, 0x81981981, 0x4fd19e4f, 0xdc7fa3dc, + 0x22664422, 0x2a7e542a, 0x90ab3b90, 0x88830b88, + 0x46ca8c46, 0xee29c7ee, 0xb8d36bb8, 0x143c2814, + 0xde79a7de, 0x5ee2bc5e, 0x0b1d160b, 0xdb76addb, + 0xe03bdbe0, 0x32566432, 0x3a4e743a, 0x0a1e140a, + 0x49db9249, 0x060a0c06, 0x246c4824, 0x5ce4b85c, + 0xc25d9fc2, 0xd36ebdd3, 0xacef43ac, 0x62a6c462, + 0x91a83991, 0x95a43195, 0xe437d3e4, 0x798bf279, + 0xe732d5e7, 0xc8438bc8, 0x37596e37, 0x6db7da6d, + 0x8d8c018d, 0xd564b1d5, 0x4ed29c4e, 0xa9e049a9, + 0x6cb4d86c, 0x56faac56, 0xf407f3f4, 0xea25cfea, + 0x65afca65, 0x7a8ef47a, 0xaee947ae, 0x08181008, + 0xbad56fba, 0x7888f078, 0x256f4a25, 0x2e725c2e, + 0x1c24381c, 0xa6f157a6, 0xb4c773b4, 0xc65197c6, + 0xe823cbe8, 0xdd7ca1dd, 0x749ce874, 0x1f213e1f, + 0x4bdd964b, 0xbddc61bd, 0x8b860d8b, 0x8a850f8a, + 0x7090e070, 0x3e427c3e, 0xb5c471b5, 0x66aacc66, + 0x48d89048, 0x03050603, 0xf601f7f6, 0x0e121c0e, + 0x61a3c261, 0x355f6a35, 0x57f9ae57, 0xb9d069b9, + 0x86911786, 0xc15899c1, 0x1d273a1d, 0x9eb9279e, + 0xe138d9e1, 0xf813ebf8, 0x98b32b98, 0x11332211, + 0x69bbd269, 0xd970a9d9, 0x8e89078e, 0x94a73394, + 0x9bb62d9b, 0x1e223c1e, 0x87921587, 0xe920c9e9, + 0xce4987ce, 0x55ffaa55, 0x28785028, 0xdf7aa5df, + 0x8c8f038c, 0xa1f859a1, 0x89800989, 0x0d171a0d, + 0xbfda65bf, 0xe631d7e6, 0x42c68442, 0x68b8d068, + 0x41c38241, 0x99b02999, 0x2d775a2d, 0x0f111e0f, + 0xb0cb7bb0, 0x54fca854, 0xbbd66dbb, 0x163a2c16, +}; + +__device__ __constant__ u32 te3[256] = +{ + 0x6363a5c6, 0x7c7c84f8, 0x777799ee, 0x7b7b8df6, + 0xf2f20dff, 0x6b6bbdd6, 0x6f6fb1de, 0xc5c55491, + 0x30305060, 0x01010302, 0x6767a9ce, 0x2b2b7d56, + 0xfefe19e7, 0xd7d762b5, 0xababe64d, 0x76769aec, + 0xcaca458f, 0x82829d1f, 0xc9c94089, 0x7d7d87fa, + 0xfafa15ef, 0x5959ebb2, 0x4747c98e, 0xf0f00bfb, + 0xadadec41, 0xd4d467b3, 0xa2a2fd5f, 0xafafea45, + 0x9c9cbf23, 0xa4a4f753, 0x727296e4, 0xc0c05b9b, + 0xb7b7c275, 0xfdfd1ce1, 0x9393ae3d, 0x26266a4c, + 0x36365a6c, 0x3f3f417e, 0xf7f702f5, 0xcccc4f83, + 0x34345c68, 0xa5a5f451, 0xe5e534d1, 0xf1f108f9, + 0x717193e2, 0xd8d873ab, 0x31315362, 0x15153f2a, + 0x04040c08, 0xc7c75295, 0x23236546, 0xc3c35e9d, + 0x18182830, 0x9696a137, 0x05050f0a, 0x9a9ab52f, + 0x0707090e, 0x12123624, 0x80809b1b, 0xe2e23ddf, + 0xebeb26cd, 0x2727694e, 0xb2b2cd7f, 0x75759fea, + 0x09091b12, 0x83839e1d, 0x2c2c7458, 0x1a1a2e34, + 0x1b1b2d36, 0x6e6eb2dc, 0x5a5aeeb4, 0xa0a0fb5b, + 0x5252f6a4, 0x3b3b4d76, 0xd6d661b7, 0xb3b3ce7d, + 0x29297b52, 0xe3e33edd, 0x2f2f715e, 0x84849713, + 0x5353f5a6, 0xd1d168b9, 0x00000000, 0xeded2cc1, + 0x20206040, 0xfcfc1fe3, 0xb1b1c879, 0x5b5bedb6, + 0x6a6abed4, 0xcbcb468d, 0xbebed967, 0x39394b72, + 0x4a4ade94, 0x4c4cd498, 0x5858e8b0, 0xcfcf4a85, + 0xd0d06bbb, 0xefef2ac5, 0xaaaae54f, 0xfbfb16ed, + 0x4343c586, 0x4d4dd79a, 0x33335566, 0x85859411, + 0x4545cf8a, 0xf9f910e9, 0x02020604, 0x7f7f81fe, + 0x5050f0a0, 0x3c3c4478, 0x9f9fba25, 0xa8a8e34b, + 0x5151f3a2, 0xa3a3fe5d, 0x4040c080, 0x8f8f8a05, + 0x9292ad3f, 0x9d9dbc21, 0x38384870, 0xf5f504f1, + 0xbcbcdf63, 0xb6b6c177, 0xdada75af, 0x21216342, + 0x10103020, 0xffff1ae5, 0xf3f30efd, 0xd2d26dbf, + 0xcdcd4c81, 0x0c0c1418, 0x13133526, 0xecec2fc3, + 0x5f5fe1be, 0x9797a235, 0x4444cc88, 0x1717392e, + 0xc4c45793, 0xa7a7f255, 0x7e7e82fc, 0x3d3d477a, + 0x6464acc8, 0x5d5de7ba, 0x19192b32, 0x737395e6, + 0x6060a0c0, 0x81819819, 0x4f4fd19e, 0xdcdc7fa3, + 0x22226644, 0x2a2a7e54, 0x9090ab3b, 0x8888830b, + 0x4646ca8c, 0xeeee29c7, 0xb8b8d36b, 0x14143c28, + 0xdede79a7, 0x5e5ee2bc, 0x0b0b1d16, 0xdbdb76ad, + 0xe0e03bdb, 0x32325664, 0x3a3a4e74, 0x0a0a1e14, + 0x4949db92, 0x06060a0c, 0x24246c48, 0x5c5ce4b8, + 0xc2c25d9f, 0xd3d36ebd, 0xacacef43, 0x6262a6c4, + 0x9191a839, 0x9595a431, 0xe4e437d3, 0x79798bf2, + 0xe7e732d5, 0xc8c8438b, 0x3737596e, 0x6d6db7da, + 0x8d8d8c01, 0xd5d564b1, 0x4e4ed29c, 0xa9a9e049, + 0x6c6cb4d8, 0x5656faac, 0xf4f407f3, 0xeaea25cf, + 0x6565afca, 0x7a7a8ef4, 0xaeaee947, 0x08081810, + 0xbabad56f, 0x787888f0, 0x25256f4a, 0x2e2e725c, + 0x1c1c2438, 0xa6a6f157, 0xb4b4c773, 0xc6c65197, + 0xe8e823cb, 0xdddd7ca1, 0x74749ce8, 0x1f1f213e, + 0x4b4bdd96, 0xbdbddc61, 0x8b8b860d, 0x8a8a850f, + 0x707090e0, 0x3e3e427c, 0xb5b5c471, 0x6666aacc, + 0x4848d890, 0x03030506, 0xf6f601f7, 0x0e0e121c, + 0x6161a3c2, 0x35355f6a, 0x5757f9ae, 0xb9b9d069, + 0x86869117, 0xc1c15899, 0x1d1d273a, 0x9e9eb927, + 0xe1e138d9, 0xf8f813eb, 0x9898b32b, 0x11113322, + 0x6969bbd2, 0xd9d970a9, 0x8e8e8907, 0x9494a733, + 0x9b9bb62d, 0x1e1e223c, 0x87879215, 0xe9e920c9, + 0xcece4987, 0x5555ffaa, 0x28287850, 0xdfdf7aa5, + 0x8c8c8f03, 0xa1a1f859, 0x89898009, 0x0d0d171a, + 0xbfbfda65, 0xe6e631d7, 0x4242c684, 0x6868b8d0, + 0x4141c382, 0x9999b029, 0x2d2d775a, 0x0f0f111e, + 0xb0b0cb7b, 0x5454fca8, 0xbbbbd66d, 0x16163a2c, +}; + +__device__ __constant__ u32 te4[256] = +{ + 0x63636363, 0x7c7c7c7c, 0x77777777, 0x7b7b7b7b, + 0xf2f2f2f2, 0x6b6b6b6b, 0x6f6f6f6f, 0xc5c5c5c5, + 0x30303030, 0x01010101, 0x67676767, 0x2b2b2b2b, + 0xfefefefe, 0xd7d7d7d7, 0xabababab, 0x76767676, + 0xcacacaca, 0x82828282, 0xc9c9c9c9, 0x7d7d7d7d, + 0xfafafafa, 0x59595959, 0x47474747, 0xf0f0f0f0, + 0xadadadad, 0xd4d4d4d4, 0xa2a2a2a2, 0xafafafaf, + 0x9c9c9c9c, 0xa4a4a4a4, 0x72727272, 0xc0c0c0c0, + 0xb7b7b7b7, 0xfdfdfdfd, 0x93939393, 0x26262626, + 0x36363636, 0x3f3f3f3f, 0xf7f7f7f7, 0xcccccccc, + 0x34343434, 0xa5a5a5a5, 0xe5e5e5e5, 0xf1f1f1f1, + 0x71717171, 0xd8d8d8d8, 0x31313131, 0x15151515, + 0x04040404, 0xc7c7c7c7, 0x23232323, 0xc3c3c3c3, + 0x18181818, 0x96969696, 0x05050505, 0x9a9a9a9a, + 0x07070707, 0x12121212, 0x80808080, 0xe2e2e2e2, + 0xebebebeb, 0x27272727, 0xb2b2b2b2, 0x75757575, + 0x09090909, 0x83838383, 0x2c2c2c2c, 0x1a1a1a1a, + 0x1b1b1b1b, 0x6e6e6e6e, 0x5a5a5a5a, 0xa0a0a0a0, + 0x52525252, 0x3b3b3b3b, 0xd6d6d6d6, 0xb3b3b3b3, + 0x29292929, 0xe3e3e3e3, 0x2f2f2f2f, 0x84848484, + 0x53535353, 0xd1d1d1d1, 0x00000000, 0xedededed, + 0x20202020, 0xfcfcfcfc, 0xb1b1b1b1, 0x5b5b5b5b, + 0x6a6a6a6a, 0xcbcbcbcb, 0xbebebebe, 0x39393939, + 0x4a4a4a4a, 0x4c4c4c4c, 0x58585858, 0xcfcfcfcf, + 0xd0d0d0d0, 0xefefefef, 0xaaaaaaaa, 0xfbfbfbfb, + 0x43434343, 0x4d4d4d4d, 0x33333333, 0x85858585, + 0x45454545, 0xf9f9f9f9, 0x02020202, 0x7f7f7f7f, + 0x50505050, 0x3c3c3c3c, 0x9f9f9f9f, 0xa8a8a8a8, + 0x51515151, 0xa3a3a3a3, 0x40404040, 0x8f8f8f8f, + 0x92929292, 0x9d9d9d9d, 0x38383838, 0xf5f5f5f5, + 0xbcbcbcbc, 0xb6b6b6b6, 0xdadadada, 0x21212121, + 0x10101010, 0xffffffff, 0xf3f3f3f3, 0xd2d2d2d2, + 0xcdcdcdcd, 0x0c0c0c0c, 0x13131313, 0xecececec, + 0x5f5f5f5f, 0x97979797, 0x44444444, 0x17171717, + 0xc4c4c4c4, 0xa7a7a7a7, 0x7e7e7e7e, 0x3d3d3d3d, + 0x64646464, 0x5d5d5d5d, 0x19191919, 0x73737373, + 0x60606060, 0x81818181, 0x4f4f4f4f, 0xdcdcdcdc, + 0x22222222, 0x2a2a2a2a, 0x90909090, 0x88888888, + 0x46464646, 0xeeeeeeee, 0xb8b8b8b8, 0x14141414, + 0xdededede, 0x5e5e5e5e, 0x0b0b0b0b, 0xdbdbdbdb, + 0xe0e0e0e0, 0x32323232, 0x3a3a3a3a, 0x0a0a0a0a, + 0x49494949, 0x06060606, 0x24242424, 0x5c5c5c5c, + 0xc2c2c2c2, 0xd3d3d3d3, 0xacacacac, 0x62626262, + 0x91919191, 0x95959595, 0xe4e4e4e4, 0x79797979, + 0xe7e7e7e7, 0xc8c8c8c8, 0x37373737, 0x6d6d6d6d, + 0x8d8d8d8d, 0xd5d5d5d5, 0x4e4e4e4e, 0xa9a9a9a9, + 0x6c6c6c6c, 0x56565656, 0xf4f4f4f4, 0xeaeaeaea, + 0x65656565, 0x7a7a7a7a, 0xaeaeaeae, 0x08080808, + 0xbabababa, 0x78787878, 0x25252525, 0x2e2e2e2e, + 0x1c1c1c1c, 0xa6a6a6a6, 0xb4b4b4b4, 0xc6c6c6c6, + 0xe8e8e8e8, 0xdddddddd, 0x74747474, 0x1f1f1f1f, + 0x4b4b4b4b, 0xbdbdbdbd, 0x8b8b8b8b, 0x8a8a8a8a, + 0x70707070, 0x3e3e3e3e, 0xb5b5b5b5, 0x66666666, + 0x48484848, 0x03030303, 0xf6f6f6f6, 0x0e0e0e0e, + 0x61616161, 0x35353535, 0x57575757, 0xb9b9b9b9, + 0x86868686, 0xc1c1c1c1, 0x1d1d1d1d, 0x9e9e9e9e, + 0xe1e1e1e1, 0xf8f8f8f8, 0x98989898, 0x11111111, + 0x69696969, 0xd9d9d9d9, 0x8e8e8e8e, 0x94949494, + 0x9b9b9b9b, 0x1e1e1e1e, 0x87878787, 0xe9e9e9e9, + 0xcececece, 0x55555555, 0x28282828, 0xdfdfdfdf, + 0x8c8c8c8c, 0xa1a1a1a1, 0x89898989, 0x0d0d0d0d, + 0xbfbfbfbf, 0xe6e6e6e6, 0x42424242, 0x68686868, + 0x41414141, 0x99999999, 0x2d2d2d2d, 0x0f0f0f0f, + 0xb0b0b0b0, 0x54545454, 0xbbbbbbbb, 0x16161616, +}; + +__device__ __constant__ u32 td0[256] = +{ + 0x51f4a750, 0x7e416553, 0x1a17a4c3, 0x3a275e96, + 0x3bab6bcb, 0x1f9d45f1, 0xacfa58ab, 0x4be30393, + 0x2030fa55, 0xad766df6, 0x88cc7691, 0xf5024c25, + 0x4fe5d7fc, 0xc52acbd7, 0x26354480, 0xb562a38f, + 0xdeb15a49, 0x25ba1b67, 0x45ea0e98, 0x5dfec0e1, + 0xc32f7502, 0x814cf012, 0x8d4697a3, 0x6bd3f9c6, + 0x038f5fe7, 0x15929c95, 0xbf6d7aeb, 0x955259da, + 0xd4be832d, 0x587421d3, 0x49e06929, 0x8ec9c844, + 0x75c2896a, 0xf48e7978, 0x99583e6b, 0x27b971dd, + 0xbee14fb6, 0xf088ad17, 0xc920ac66, 0x7dce3ab4, + 0x63df4a18, 0xe51a3182, 0x97513360, 0x62537f45, + 0xb16477e0, 0xbb6bae84, 0xfe81a01c, 0xf9082b94, + 0x70486858, 0x8f45fd19, 0x94de6c87, 0x527bf8b7, + 0xab73d323, 0x724b02e2, 0xe31f8f57, 0x6655ab2a, + 0xb2eb2807, 0x2fb5c203, 0x86c57b9a, 0xd33708a5, + 0x302887f2, 0x23bfa5b2, 0x02036aba, 0xed16825c, + 0x8acf1c2b, 0xa779b492, 0xf307f2f0, 0x4e69e2a1, + 0x65daf4cd, 0x0605bed5, 0xd134621f, 0xc4a6fe8a, + 0x342e539d, 0xa2f355a0, 0x058ae132, 0xa4f6eb75, + 0x0b83ec39, 0x4060efaa, 0x5e719f06, 0xbd6e1051, + 0x3e218af9, 0x96dd063d, 0xdd3e05ae, 0x4de6bd46, + 0x91548db5, 0x71c45d05, 0x0406d46f, 0x605015ff, + 0x1998fb24, 0xd6bde997, 0x894043cc, 0x67d99e77, + 0xb0e842bd, 0x07898b88, 0xe7195b38, 0x79c8eedb, + 0xa17c0a47, 0x7c420fe9, 0xf8841ec9, 0x00000000, + 0x09808683, 0x322bed48, 0x1e1170ac, 0x6c5a724e, + 0xfd0efffb, 0x0f853856, 0x3daed51e, 0x362d3927, + 0x0a0fd964, 0x685ca621, 0x9b5b54d1, 0x24362e3a, + 0x0c0a67b1, 0x9357e70f, 0xb4ee96d2, 0x1b9b919e, + 0x80c0c54f, 0x61dc20a2, 0x5a774b69, 0x1c121a16, + 0xe293ba0a, 0xc0a02ae5, 0x3c22e043, 0x121b171d, + 0x0e090d0b, 0xf28bc7ad, 0x2db6a8b9, 0x141ea9c8, + 0x57f11985, 0xaf75074c, 0xee99ddbb, 0xa37f60fd, + 0xf701269f, 0x5c72f5bc, 0x44663bc5, 0x5bfb7e34, + 0x8b432976, 0xcb23c6dc, 0xb6edfc68, 0xb8e4f163, + 0xd731dcca, 0x42638510, 0x13972240, 0x84c61120, + 0x854a247d, 0xd2bb3df8, 0xaef93211, 0xc729a16d, + 0x1d9e2f4b, 0xdcb230f3, 0x0d8652ec, 0x77c1e3d0, + 0x2bb3166c, 0xa970b999, 0x119448fa, 0x47e96422, + 0xa8fc8cc4, 0xa0f03f1a, 0x567d2cd8, 0x223390ef, + 0x87494ec7, 0xd938d1c1, 0x8ccaa2fe, 0x98d40b36, + 0xa6f581cf, 0xa57ade28, 0xdab78e26, 0x3fadbfa4, + 0x2c3a9de4, 0x5078920d, 0x6a5fcc9b, 0x547e4662, + 0xf68d13c2, 0x90d8b8e8, 0x2e39f75e, 0x82c3aff5, + 0x9f5d80be, 0x69d0937c, 0x6fd52da9, 0xcf2512b3, + 0xc8ac993b, 0x10187da7, 0xe89c636e, 0xdb3bbb7b, + 0xcd267809, 0x6e5918f4, 0xec9ab701, 0x834f9aa8, + 0xe6956e65, 0xaaffe67e, 0x21bccf08, 0xef15e8e6, + 0xbae79bd9, 0x4a6f36ce, 0xea9f09d4, 0x29b07cd6, + 0x31a4b2af, 0x2a3f2331, 0xc6a59430, 0x35a266c0, + 0x744ebc37, 0xfc82caa6, 0xe090d0b0, 0x33a7d815, + 0xf104984a, 0x41ecdaf7, 0x7fcd500e, 0x1791f62f, + 0x764dd68d, 0x43efb04d, 0xccaa4d54, 0xe49604df, + 0x9ed1b5e3, 0x4c6a881b, 0xc12c1fb8, 0x4665517f, + 0x9d5eea04, 0x018c355d, 0xfa877473, 0xfb0b412e, + 0xb3671d5a, 0x92dbd252, 0xe9105633, 0x6dd64713, + 0x9ad7618c, 0x37a10c7a, 0x59f8148e, 0xeb133c89, + 0xcea927ee, 0xb761c935, 0xe11ce5ed, 0x7a47b13c, + 0x9cd2df59, 0x55f2733f, 0x1814ce79, 0x73c737bf, + 0x53f7cdea, 0x5ffdaa5b, 0xdf3d6f14, 0x7844db86, + 0xcaaff381, 0xb968c43e, 0x3824342c, 0xc2a3405f, + 0x161dc372, 0xbce2250c, 0x283c498b, 0xff0d9541, + 0x39a80171, 0x080cb3de, 0xd8b4e49c, 0x6456c190, + 0x7bcb8461, 0xd532b670, 0x486c5c74, 0xd0b85742, +}; + +__device__ __constant__ u32 td1[256] = +{ + 0x5051f4a7, 0x537e4165, 0xc31a17a4, 0x963a275e, + 0xcb3bab6b, 0xf11f9d45, 0xabacfa58, 0x934be303, + 0x552030fa, 0xf6ad766d, 0x9188cc76, 0x25f5024c, + 0xfc4fe5d7, 0xd7c52acb, 0x80263544, 0x8fb562a3, + 0x49deb15a, 0x6725ba1b, 0x9845ea0e, 0xe15dfec0, + 0x02c32f75, 0x12814cf0, 0xa38d4697, 0xc66bd3f9, + 0xe7038f5f, 0x9515929c, 0xebbf6d7a, 0xda955259, + 0x2dd4be83, 0xd3587421, 0x2949e069, 0x448ec9c8, + 0x6a75c289, 0x78f48e79, 0x6b99583e, 0xdd27b971, + 0xb6bee14f, 0x17f088ad, 0x66c920ac, 0xb47dce3a, + 0x1863df4a, 0x82e51a31, 0x60975133, 0x4562537f, + 0xe0b16477, 0x84bb6bae, 0x1cfe81a0, 0x94f9082b, + 0x58704868, 0x198f45fd, 0x8794de6c, 0xb7527bf8, + 0x23ab73d3, 0xe2724b02, 0x57e31f8f, 0x2a6655ab, + 0x07b2eb28, 0x032fb5c2, 0x9a86c57b, 0xa5d33708, + 0xf2302887, 0xb223bfa5, 0xba02036a, 0x5ced1682, + 0x2b8acf1c, 0x92a779b4, 0xf0f307f2, 0xa14e69e2, + 0xcd65daf4, 0xd50605be, 0x1fd13462, 0x8ac4a6fe, + 0x9d342e53, 0xa0a2f355, 0x32058ae1, 0x75a4f6eb, + 0x390b83ec, 0xaa4060ef, 0x065e719f, 0x51bd6e10, + 0xf93e218a, 0x3d96dd06, 0xaedd3e05, 0x464de6bd, + 0xb591548d, 0x0571c45d, 0x6f0406d4, 0xff605015, + 0x241998fb, 0x97d6bde9, 0xcc894043, 0x7767d99e, + 0xbdb0e842, 0x8807898b, 0x38e7195b, 0xdb79c8ee, + 0x47a17c0a, 0xe97c420f, 0xc9f8841e, 0x00000000, + 0x83098086, 0x48322bed, 0xac1e1170, 0x4e6c5a72, + 0xfbfd0eff, 0x560f8538, 0x1e3daed5, 0x27362d39, + 0x640a0fd9, 0x21685ca6, 0xd19b5b54, 0x3a24362e, + 0xb10c0a67, 0x0f9357e7, 0xd2b4ee96, 0x9e1b9b91, + 0x4f80c0c5, 0xa261dc20, 0x695a774b, 0x161c121a, + 0x0ae293ba, 0xe5c0a02a, 0x433c22e0, 0x1d121b17, + 0x0b0e090d, 0xadf28bc7, 0xb92db6a8, 0xc8141ea9, + 0x8557f119, 0x4caf7507, 0xbbee99dd, 0xfda37f60, + 0x9ff70126, 0xbc5c72f5, 0xc544663b, 0x345bfb7e, + 0x768b4329, 0xdccb23c6, 0x68b6edfc, 0x63b8e4f1, + 0xcad731dc, 0x10426385, 0x40139722, 0x2084c611, + 0x7d854a24, 0xf8d2bb3d, 0x11aef932, 0x6dc729a1, + 0x4b1d9e2f, 0xf3dcb230, 0xec0d8652, 0xd077c1e3, + 0x6c2bb316, 0x99a970b9, 0xfa119448, 0x2247e964, + 0xc4a8fc8c, 0x1aa0f03f, 0xd8567d2c, 0xef223390, + 0xc787494e, 0xc1d938d1, 0xfe8ccaa2, 0x3698d40b, + 0xcfa6f581, 0x28a57ade, 0x26dab78e, 0xa43fadbf, + 0xe42c3a9d, 0x0d507892, 0x9b6a5fcc, 0x62547e46, + 0xc2f68d13, 0xe890d8b8, 0x5e2e39f7, 0xf582c3af, + 0xbe9f5d80, 0x7c69d093, 0xa96fd52d, 0xb3cf2512, + 0x3bc8ac99, 0xa710187d, 0x6ee89c63, 0x7bdb3bbb, + 0x09cd2678, 0xf46e5918, 0x01ec9ab7, 0xa8834f9a, + 0x65e6956e, 0x7eaaffe6, 0x0821bccf, 0xe6ef15e8, + 0xd9bae79b, 0xce4a6f36, 0xd4ea9f09, 0xd629b07c, + 0xaf31a4b2, 0x312a3f23, 0x30c6a594, 0xc035a266, + 0x37744ebc, 0xa6fc82ca, 0xb0e090d0, 0x1533a7d8, + 0x4af10498, 0xf741ecda, 0x0e7fcd50, 0x2f1791f6, + 0x8d764dd6, 0x4d43efb0, 0x54ccaa4d, 0xdfe49604, + 0xe39ed1b5, 0x1b4c6a88, 0xb8c12c1f, 0x7f466551, + 0x049d5eea, 0x5d018c35, 0x73fa8774, 0x2efb0b41, + 0x5ab3671d, 0x5292dbd2, 0x33e91056, 0x136dd647, + 0x8c9ad761, 0x7a37a10c, 0x8e59f814, 0x89eb133c, + 0xeecea927, 0x35b761c9, 0xede11ce5, 0x3c7a47b1, + 0x599cd2df, 0x3f55f273, 0x791814ce, 0xbf73c737, + 0xea53f7cd, 0x5b5ffdaa, 0x14df3d6f, 0x867844db, + 0x81caaff3, 0x3eb968c4, 0x2c382434, 0x5fc2a340, + 0x72161dc3, 0x0cbce225, 0x8b283c49, 0x41ff0d95, + 0x7139a801, 0xde080cb3, 0x9cd8b4e4, 0x906456c1, + 0x617bcb84, 0x70d532b6, 0x74486c5c, 0x42d0b857, +}; + +__device__ __constant__ u32 td2[256] = +{ + 0xa75051f4, 0x65537e41, 0xa4c31a17, 0x5e963a27, + 0x6bcb3bab, 0x45f11f9d, 0x58abacfa, 0x03934be3, + 0xfa552030, 0x6df6ad76, 0x769188cc, 0x4c25f502, + 0xd7fc4fe5, 0xcbd7c52a, 0x44802635, 0xa38fb562, + 0x5a49deb1, 0x1b6725ba, 0x0e9845ea, 0xc0e15dfe, + 0x7502c32f, 0xf012814c, 0x97a38d46, 0xf9c66bd3, + 0x5fe7038f, 0x9c951592, 0x7aebbf6d, 0x59da9552, + 0x832dd4be, 0x21d35874, 0x692949e0, 0xc8448ec9, + 0x896a75c2, 0x7978f48e, 0x3e6b9958, 0x71dd27b9, + 0x4fb6bee1, 0xad17f088, 0xac66c920, 0x3ab47dce, + 0x4a1863df, 0x3182e51a, 0x33609751, 0x7f456253, + 0x77e0b164, 0xae84bb6b, 0xa01cfe81, 0x2b94f908, + 0x68587048, 0xfd198f45, 0x6c8794de, 0xf8b7527b, + 0xd323ab73, 0x02e2724b, 0x8f57e31f, 0xab2a6655, + 0x2807b2eb, 0xc2032fb5, 0x7b9a86c5, 0x08a5d337, + 0x87f23028, 0xa5b223bf, 0x6aba0203, 0x825ced16, + 0x1c2b8acf, 0xb492a779, 0xf2f0f307, 0xe2a14e69, + 0xf4cd65da, 0xbed50605, 0x621fd134, 0xfe8ac4a6, + 0x539d342e, 0x55a0a2f3, 0xe132058a, 0xeb75a4f6, + 0xec390b83, 0xefaa4060, 0x9f065e71, 0x1051bd6e, + 0x8af93e21, 0x063d96dd, 0x05aedd3e, 0xbd464de6, + 0x8db59154, 0x5d0571c4, 0xd46f0406, 0x15ff6050, + 0xfb241998, 0xe997d6bd, 0x43cc8940, 0x9e7767d9, + 0x42bdb0e8, 0x8b880789, 0x5b38e719, 0xeedb79c8, + 0x0a47a17c, 0x0fe97c42, 0x1ec9f884, 0x00000000, + 0x86830980, 0xed48322b, 0x70ac1e11, 0x724e6c5a, + 0xfffbfd0e, 0x38560f85, 0xd51e3dae, 0x3927362d, + 0xd9640a0f, 0xa621685c, 0x54d19b5b, 0x2e3a2436, + 0x67b10c0a, 0xe70f9357, 0x96d2b4ee, 0x919e1b9b, + 0xc54f80c0, 0x20a261dc, 0x4b695a77, 0x1a161c12, + 0xba0ae293, 0x2ae5c0a0, 0xe0433c22, 0x171d121b, + 0x0d0b0e09, 0xc7adf28b, 0xa8b92db6, 0xa9c8141e, + 0x198557f1, 0x074caf75, 0xddbbee99, 0x60fda37f, + 0x269ff701, 0xf5bc5c72, 0x3bc54466, 0x7e345bfb, + 0x29768b43, 0xc6dccb23, 0xfc68b6ed, 0xf163b8e4, + 0xdccad731, 0x85104263, 0x22401397, 0x112084c6, + 0x247d854a, 0x3df8d2bb, 0x3211aef9, 0xa16dc729, + 0x2f4b1d9e, 0x30f3dcb2, 0x52ec0d86, 0xe3d077c1, + 0x166c2bb3, 0xb999a970, 0x48fa1194, 0x642247e9, + 0x8cc4a8fc, 0x3f1aa0f0, 0x2cd8567d, 0x90ef2233, + 0x4ec78749, 0xd1c1d938, 0xa2fe8cca, 0x0b3698d4, + 0x81cfa6f5, 0xde28a57a, 0x8e26dab7, 0xbfa43fad, + 0x9de42c3a, 0x920d5078, 0xcc9b6a5f, 0x4662547e, + 0x13c2f68d, 0xb8e890d8, 0xf75e2e39, 0xaff582c3, + 0x80be9f5d, 0x937c69d0, 0x2da96fd5, 0x12b3cf25, + 0x993bc8ac, 0x7da71018, 0x636ee89c, 0xbb7bdb3b, + 0x7809cd26, 0x18f46e59, 0xb701ec9a, 0x9aa8834f, + 0x6e65e695, 0xe67eaaff, 0xcf0821bc, 0xe8e6ef15, + 0x9bd9bae7, 0x36ce4a6f, 0x09d4ea9f, 0x7cd629b0, + 0xb2af31a4, 0x23312a3f, 0x9430c6a5, 0x66c035a2, + 0xbc37744e, 0xcaa6fc82, 0xd0b0e090, 0xd81533a7, + 0x984af104, 0xdaf741ec, 0x500e7fcd, 0xf62f1791, + 0xd68d764d, 0xb04d43ef, 0x4d54ccaa, 0x04dfe496, + 0xb5e39ed1, 0x881b4c6a, 0x1fb8c12c, 0x517f4665, + 0xea049d5e, 0x355d018c, 0x7473fa87, 0x412efb0b, + 0x1d5ab367, 0xd25292db, 0x5633e910, 0x47136dd6, + 0x618c9ad7, 0x0c7a37a1, 0x148e59f8, 0x3c89eb13, + 0x27eecea9, 0xc935b761, 0xe5ede11c, 0xb13c7a47, + 0xdf599cd2, 0x733f55f2, 0xce791814, 0x37bf73c7, + 0xcdea53f7, 0xaa5b5ffd, 0x6f14df3d, 0xdb867844, + 0xf381caaf, 0xc43eb968, 0x342c3824, 0x405fc2a3, + 0xc372161d, 0x250cbce2, 0x498b283c, 0x9541ff0d, + 0x017139a8, 0xb3de080c, 0xe49cd8b4, 0xc1906456, + 0x84617bcb, 0xb670d532, 0x5c74486c, 0x5742d0b8, +}; + +__device__ __constant__ u32 td3[256] = +{ + 0xf4a75051, 0x4165537e, 0x17a4c31a, 0x275e963a, + 0xab6bcb3b, 0x9d45f11f, 0xfa58abac, 0xe303934b, + 0x30fa5520, 0x766df6ad, 0xcc769188, 0x024c25f5, + 0xe5d7fc4f, 0x2acbd7c5, 0x35448026, 0x62a38fb5, + 0xb15a49de, 0xba1b6725, 0xea0e9845, 0xfec0e15d, + 0x2f7502c3, 0x4cf01281, 0x4697a38d, 0xd3f9c66b, + 0x8f5fe703, 0x929c9515, 0x6d7aebbf, 0x5259da95, + 0xbe832dd4, 0x7421d358, 0xe0692949, 0xc9c8448e, + 0xc2896a75, 0x8e7978f4, 0x583e6b99, 0xb971dd27, + 0xe14fb6be, 0x88ad17f0, 0x20ac66c9, 0xce3ab47d, + 0xdf4a1863, 0x1a3182e5, 0x51336097, 0x537f4562, + 0x6477e0b1, 0x6bae84bb, 0x81a01cfe, 0x082b94f9, + 0x48685870, 0x45fd198f, 0xde6c8794, 0x7bf8b752, + 0x73d323ab, 0x4b02e272, 0x1f8f57e3, 0x55ab2a66, + 0xeb2807b2, 0xb5c2032f, 0xc57b9a86, 0x3708a5d3, + 0x2887f230, 0xbfa5b223, 0x036aba02, 0x16825ced, + 0xcf1c2b8a, 0x79b492a7, 0x07f2f0f3, 0x69e2a14e, + 0xdaf4cd65, 0x05bed506, 0x34621fd1, 0xa6fe8ac4, + 0x2e539d34, 0xf355a0a2, 0x8ae13205, 0xf6eb75a4, + 0x83ec390b, 0x60efaa40, 0x719f065e, 0x6e1051bd, + 0x218af93e, 0xdd063d96, 0x3e05aedd, 0xe6bd464d, + 0x548db591, 0xc45d0571, 0x06d46f04, 0x5015ff60, + 0x98fb2419, 0xbde997d6, 0x4043cc89, 0xd99e7767, + 0xe842bdb0, 0x898b8807, 0x195b38e7, 0xc8eedb79, + 0x7c0a47a1, 0x420fe97c, 0x841ec9f8, 0x00000000, + 0x80868309, 0x2bed4832, 0x1170ac1e, 0x5a724e6c, + 0x0efffbfd, 0x8538560f, 0xaed51e3d, 0x2d392736, + 0x0fd9640a, 0x5ca62168, 0x5b54d19b, 0x362e3a24, + 0x0a67b10c, 0x57e70f93, 0xee96d2b4, 0x9b919e1b, + 0xc0c54f80, 0xdc20a261, 0x774b695a, 0x121a161c, + 0x93ba0ae2, 0xa02ae5c0, 0x22e0433c, 0x1b171d12, + 0x090d0b0e, 0x8bc7adf2, 0xb6a8b92d, 0x1ea9c814, + 0xf1198557, 0x75074caf, 0x99ddbbee, 0x7f60fda3, + 0x01269ff7, 0x72f5bc5c, 0x663bc544, 0xfb7e345b, + 0x4329768b, 0x23c6dccb, 0xedfc68b6, 0xe4f163b8, + 0x31dccad7, 0x63851042, 0x97224013, 0xc6112084, + 0x4a247d85, 0xbb3df8d2, 0xf93211ae, 0x29a16dc7, + 0x9e2f4b1d, 0xb230f3dc, 0x8652ec0d, 0xc1e3d077, + 0xb3166c2b, 0x70b999a9, 0x9448fa11, 0xe9642247, + 0xfc8cc4a8, 0xf03f1aa0, 0x7d2cd856, 0x3390ef22, + 0x494ec787, 0x38d1c1d9, 0xcaa2fe8c, 0xd40b3698, + 0xf581cfa6, 0x7ade28a5, 0xb78e26da, 0xadbfa43f, + 0x3a9de42c, 0x78920d50, 0x5fcc9b6a, 0x7e466254, + 0x8d13c2f6, 0xd8b8e890, 0x39f75e2e, 0xc3aff582, + 0x5d80be9f, 0xd0937c69, 0xd52da96f, 0x2512b3cf, + 0xac993bc8, 0x187da710, 0x9c636ee8, 0x3bbb7bdb, + 0x267809cd, 0x5918f46e, 0x9ab701ec, 0x4f9aa883, + 0x956e65e6, 0xffe67eaa, 0xbccf0821, 0x15e8e6ef, + 0xe79bd9ba, 0x6f36ce4a, 0x9f09d4ea, 0xb07cd629, + 0xa4b2af31, 0x3f23312a, 0xa59430c6, 0xa266c035, + 0x4ebc3774, 0x82caa6fc, 0x90d0b0e0, 0xa7d81533, + 0x04984af1, 0xecdaf741, 0xcd500e7f, 0x91f62f17, + 0x4dd68d76, 0xefb04d43, 0xaa4d54cc, 0x9604dfe4, + 0xd1b5e39e, 0x6a881b4c, 0x2c1fb8c1, 0x65517f46, + 0x5eea049d, 0x8c355d01, 0x877473fa, 0x0b412efb, + 0x671d5ab3, 0xdbd25292, 0x105633e9, 0xd647136d, + 0xd7618c9a, 0xa10c7a37, 0xf8148e59, 0x133c89eb, + 0xa927eece, 0x61c935b7, 0x1ce5ede1, 0x47b13c7a, + 0xd2df599c, 0xf2733f55, 0x14ce7918, 0xc737bf73, + 0xf7cdea53, 0xfdaa5b5f, 0x3d6f14df, 0x44db8678, + 0xaff381ca, 0x68c43eb9, 0x24342c38, 0xa3405fc2, + 0x1dc37216, 0xe2250cbc, 0x3c498b28, 0x0d9541ff, + 0xa8017139, 0x0cb3de08, 0xb4e49cd8, 0x56c19064, + 0xcb84617b, 0x32b670d5, 0x6c5c7448, 0xb85742d0, +}; + +__device__ __constant__ u32 td4[256] = +{ + 0x52525252, 0x09090909, 0x6a6a6a6a, 0xd5d5d5d5, + 0x30303030, 0x36363636, 0xa5a5a5a5, 0x38383838, + 0xbfbfbfbf, 0x40404040, 0xa3a3a3a3, 0x9e9e9e9e, + 0x81818181, 0xf3f3f3f3, 0xd7d7d7d7, 0xfbfbfbfb, + 0x7c7c7c7c, 0xe3e3e3e3, 0x39393939, 0x82828282, + 0x9b9b9b9b, 0x2f2f2f2f, 0xffffffff, 0x87878787, + 0x34343434, 0x8e8e8e8e, 0x43434343, 0x44444444, + 0xc4c4c4c4, 0xdededede, 0xe9e9e9e9, 0xcbcbcbcb, + 0x54545454, 0x7b7b7b7b, 0x94949494, 0x32323232, + 0xa6a6a6a6, 0xc2c2c2c2, 0x23232323, 0x3d3d3d3d, + 0xeeeeeeee, 0x4c4c4c4c, 0x95959595, 0x0b0b0b0b, + 0x42424242, 0xfafafafa, 0xc3c3c3c3, 0x4e4e4e4e, + 0x08080808, 0x2e2e2e2e, 0xa1a1a1a1, 0x66666666, + 0x28282828, 0xd9d9d9d9, 0x24242424, 0xb2b2b2b2, + 0x76767676, 0x5b5b5b5b, 0xa2a2a2a2, 0x49494949, + 0x6d6d6d6d, 0x8b8b8b8b, 0xd1d1d1d1, 0x25252525, + 0x72727272, 0xf8f8f8f8, 0xf6f6f6f6, 0x64646464, + 0x86868686, 0x68686868, 0x98989898, 0x16161616, + 0xd4d4d4d4, 0xa4a4a4a4, 0x5c5c5c5c, 0xcccccccc, + 0x5d5d5d5d, 0x65656565, 0xb6b6b6b6, 0x92929292, + 0x6c6c6c6c, 0x70707070, 0x48484848, 0x50505050, + 0xfdfdfdfd, 0xedededed, 0xb9b9b9b9, 0xdadadada, + 0x5e5e5e5e, 0x15151515, 0x46464646, 0x57575757, + 0xa7a7a7a7, 0x8d8d8d8d, 0x9d9d9d9d, 0x84848484, + 0x90909090, 0xd8d8d8d8, 0xabababab, 0x00000000, + 0x8c8c8c8c, 0xbcbcbcbc, 0xd3d3d3d3, 0x0a0a0a0a, + 0xf7f7f7f7, 0xe4e4e4e4, 0x58585858, 0x05050505, + 0xb8b8b8b8, 0xb3b3b3b3, 0x45454545, 0x06060606, + 0xd0d0d0d0, 0x2c2c2c2c, 0x1e1e1e1e, 0x8f8f8f8f, + 0xcacacaca, 0x3f3f3f3f, 0x0f0f0f0f, 0x02020202, + 0xc1c1c1c1, 0xafafafaf, 0xbdbdbdbd, 0x03030303, + 0x01010101, 0x13131313, 0x8a8a8a8a, 0x6b6b6b6b, + 0x3a3a3a3a, 0x91919191, 0x11111111, 0x41414141, + 0x4f4f4f4f, 0x67676767, 0xdcdcdcdc, 0xeaeaeaea, + 0x97979797, 0xf2f2f2f2, 0xcfcfcfcf, 0xcececece, + 0xf0f0f0f0, 0xb4b4b4b4, 0xe6e6e6e6, 0x73737373, + 0x96969696, 0xacacacac, 0x74747474, 0x22222222, + 0xe7e7e7e7, 0xadadadad, 0x35353535, 0x85858585, + 0xe2e2e2e2, 0xf9f9f9f9, 0x37373737, 0xe8e8e8e8, + 0x1c1c1c1c, 0x75757575, 0xdfdfdfdf, 0x6e6e6e6e, + 0x47474747, 0xf1f1f1f1, 0x1a1a1a1a, 0x71717171, + 0x1d1d1d1d, 0x29292929, 0xc5c5c5c5, 0x89898989, + 0x6f6f6f6f, 0xb7b7b7b7, 0x62626262, 0x0e0e0e0e, + 0xaaaaaaaa, 0x18181818, 0xbebebebe, 0x1b1b1b1b, + 0xfcfcfcfc, 0x56565656, 0x3e3e3e3e, 0x4b4b4b4b, + 0xc6c6c6c6, 0xd2d2d2d2, 0x79797979, 0x20202020, + 0x9a9a9a9a, 0xdbdbdbdb, 0xc0c0c0c0, 0xfefefefe, + 0x78787878, 0xcdcdcdcd, 0x5a5a5a5a, 0xf4f4f4f4, + 0x1f1f1f1f, 0xdddddddd, 0xa8a8a8a8, 0x33333333, + 0x88888888, 0x07070707, 0xc7c7c7c7, 0x31313131, + 0xb1b1b1b1, 0x12121212, 0x10101010, 0x59595959, + 0x27272727, 0x80808080, 0xecececec, 0x5f5f5f5f, + 0x60606060, 0x51515151, 0x7f7f7f7f, 0xa9a9a9a9, + 0x19191919, 0xb5b5b5b5, 0x4a4a4a4a, 0x0d0d0d0d, + 0x2d2d2d2d, 0xe5e5e5e5, 0x7a7a7a7a, 0x9f9f9f9f, + 0x93939393, 0xc9c9c9c9, 0x9c9c9c9c, 0xefefefef, + 0xa0a0a0a0, 0xe0e0e0e0, 0x3b3b3b3b, 0x4d4d4d4d, + 0xaeaeaeae, 0x2a2a2a2a, 0xf5f5f5f5, 0xb0b0b0b0, + 0xc8c8c8c8, 0xebebebeb, 0xbbbbbbbb, 0x3c3c3c3c, + 0x83838383, 0x53535353, 0x99999999, 0x61616161, + 0x17171717, 0x2b2b2b2b, 0x04040404, 0x7e7e7e7e, + 0xbabababa, 0x77777777, 0xd6d6d6d6, 0x26262626, + 0xe1e1e1e1, 0x69696969, 0x14141414, 0x63636363, + 0x55555555, 0x21212121, 0x0c0c0c0c, 0x7d7d7d7d, +}; + +__device__ __constant__ u32 rcon[] = +{ + 0x01000000, 0x02000000, 0x04000000, 0x08000000, + 0x10000000, 0x20000000, 0x40000000, 0x80000000, + 0x1b000000, 0x36000000, +}; + +__device__ static void AES128_ExpandKey (u32 *userkey, u32 *rek, u32 s_te0[256], u32 s_te1[256], u32 s_te2[256], u32 s_te3[256], u32 s_te4[256]) +{ + rek[0] = userkey[0]; + rek[1] = userkey[1]; + rek[2] = userkey[2]; + rek[3] = userkey[3]; + + #pragma unroll 10 + for (u32 i = 0, j = 0; i < 10; i += 1, j += 4) + { + u32 temp = rek[j + 3]; + + temp = (s_te2[(temp >> 16) & 0xff] & 0xff000000) + ^ (s_te3[(temp >> 8) & 0xff] & 0x00ff0000) + ^ (s_te0[(temp >> 0) & 0xff] & 0x0000ff00) + ^ (s_te1[(temp >> 24) & 0xff] & 0x000000ff); + + rek[j + 4] = rek[j + 0] + ^ temp + ^ rcon[i]; + + rek[j + 5] = rek[j + 1] ^ rek[j + 4]; + rek[j + 6] = rek[j + 2] ^ rek[j + 5]; + rek[j + 7] = rek[j + 3] ^ rek[j + 6]; + } +} + +__device__ static void AES128_InvertKey (u32 *rdk, u32 s_td0[256], u32 s_td1[256], u32 s_td2[256], u32 s_td3[256], u32 s_td4[256], u32 s_te0[256], u32 s_te1[256], u32 s_te2[256], u32 s_te3[256], u32 s_te4[256]) +{ + for (u32 i = 0, j = 40; i < j; i += 4, j -= 4) + { + u32 temp; + + temp = rdk[i + 0]; rdk[i + 0] = rdk[j + 0]; rdk[j + 0] = temp; + temp = rdk[i + 1]; rdk[i + 1] = rdk[j + 1]; rdk[j + 1] = temp; + temp = rdk[i + 2]; rdk[i + 2] = rdk[j + 2]; rdk[j + 2] = temp; + temp = rdk[i + 3]; rdk[i + 3] = rdk[j + 3]; rdk[j + 3] = temp; + } + + for (u32 i = 1, j = 4; i < 10; i += 1, j += 4) + { + rdk[j + 0] = + s_td0[s_te1[(rdk[j + 0] >> 24) & 0xff] & 0xff] ^ + s_td1[s_te1[(rdk[j + 0] >> 16) & 0xff] & 0xff] ^ + s_td2[s_te1[(rdk[j + 0] >> 8) & 0xff] & 0xff] ^ + s_td3[s_te1[(rdk[j + 0] >> 0) & 0xff] & 0xff]; + + rdk[j + 1] = + s_td0[s_te1[(rdk[j + 1] >> 24) & 0xff] & 0xff] ^ + s_td1[s_te1[(rdk[j + 1] >> 16) & 0xff] & 0xff] ^ + s_td2[s_te1[(rdk[j + 1] >> 8) & 0xff] & 0xff] ^ + s_td3[s_te1[(rdk[j + 1] >> 0) & 0xff] & 0xff]; + + rdk[j + 2] = + s_td0[s_te1[(rdk[j + 2] >> 24) & 0xff] & 0xff] ^ + s_td1[s_te1[(rdk[j + 2] >> 16) & 0xff] & 0xff] ^ + s_td2[s_te1[(rdk[j + 2] >> 8) & 0xff] & 0xff] ^ + s_td3[s_te1[(rdk[j + 2] >> 0) & 0xff] & 0xff]; + + rdk[j + 3] = + s_td0[s_te1[(rdk[j + 3] >> 24) & 0xff] & 0xff] ^ + s_td1[s_te1[(rdk[j + 3] >> 16) & 0xff] & 0xff] ^ + s_td2[s_te1[(rdk[j + 3] >> 8) & 0xff] & 0xff] ^ + s_td3[s_te1[(rdk[j + 3] >> 0) & 0xff] & 0xff]; + } +} + +__device__ static void AES128_decrypt (const u32 *in, u32 *out, const u32 *rdk, u32 s_td0[256], u32 s_td1[256], u32 s_td2[256], u32 s_td3[256], u32 s_td4[256]) +{ + u32 s0 = in[0] ^ rdk[0]; + u32 s1 = in[1] ^ rdk[1]; + u32 s2 = in[2] ^ rdk[2]; + u32 s3 = in[3] ^ rdk[3]; + + u32 t0; + u32 t1; + u32 t2; + u32 t3; + + t0 = s_td0[s0 >> 24] ^ s_td1[(s3 >> 16) & 0xff] ^ s_td2[(s2 >> 8) & 0xff] ^ s_td3[s1 & 0xff] ^ rdk[ 4]; + t1 = s_td0[s1 >> 24] ^ s_td1[(s0 >> 16) & 0xff] ^ s_td2[(s3 >> 8) & 0xff] ^ s_td3[s2 & 0xff] ^ rdk[ 5]; + t2 = s_td0[s2 >> 24] ^ s_td1[(s1 >> 16) & 0xff] ^ s_td2[(s0 >> 8) & 0xff] ^ s_td3[s3 & 0xff] ^ rdk[ 6]; + t3 = s_td0[s3 >> 24] ^ s_td1[(s2 >> 16) & 0xff] ^ s_td2[(s1 >> 8) & 0xff] ^ s_td3[s0 & 0xff] ^ rdk[ 7]; + s0 = s_td0[t0 >> 24] ^ s_td1[(t3 >> 16) & 0xff] ^ s_td2[(t2 >> 8) & 0xff] ^ s_td3[t1 & 0xff] ^ rdk[ 8]; + s1 = s_td0[t1 >> 24] ^ s_td1[(t0 >> 16) & 0xff] ^ s_td2[(t3 >> 8) & 0xff] ^ s_td3[t2 & 0xff] ^ rdk[ 9]; + s2 = s_td0[t2 >> 24] ^ s_td1[(t1 >> 16) & 0xff] ^ s_td2[(t0 >> 8) & 0xff] ^ s_td3[t3 & 0xff] ^ rdk[10]; + s3 = s_td0[t3 >> 24] ^ s_td1[(t2 >> 16) & 0xff] ^ s_td2[(t1 >> 8) & 0xff] ^ s_td3[t0 & 0xff] ^ rdk[11]; + t0 = s_td0[s0 >> 24] ^ s_td1[(s3 >> 16) & 0xff] ^ s_td2[(s2 >> 8) & 0xff] ^ s_td3[s1 & 0xff] ^ rdk[12]; + t1 = s_td0[s1 >> 24] ^ s_td1[(s0 >> 16) & 0xff] ^ s_td2[(s3 >> 8) & 0xff] ^ s_td3[s2 & 0xff] ^ rdk[13]; + t2 = s_td0[s2 >> 24] ^ s_td1[(s1 >> 16) & 0xff] ^ s_td2[(s0 >> 8) & 0xff] ^ s_td3[s3 & 0xff] ^ rdk[14]; + t3 = s_td0[s3 >> 24] ^ s_td1[(s2 >> 16) & 0xff] ^ s_td2[(s1 >> 8) & 0xff] ^ s_td3[s0 & 0xff] ^ rdk[15]; + s0 = s_td0[t0 >> 24] ^ s_td1[(t3 >> 16) & 0xff] ^ s_td2[(t2 >> 8) & 0xff] ^ s_td3[t1 & 0xff] ^ rdk[16]; + s1 = s_td0[t1 >> 24] ^ s_td1[(t0 >> 16) & 0xff] ^ s_td2[(t3 >> 8) & 0xff] ^ s_td3[t2 & 0xff] ^ rdk[17]; + s2 = s_td0[t2 >> 24] ^ s_td1[(t1 >> 16) & 0xff] ^ s_td2[(t0 >> 8) & 0xff] ^ s_td3[t3 & 0xff] ^ rdk[18]; + s3 = s_td0[t3 >> 24] ^ s_td1[(t2 >> 16) & 0xff] ^ s_td2[(t1 >> 8) & 0xff] ^ s_td3[t0 & 0xff] ^ rdk[19]; + t0 = s_td0[s0 >> 24] ^ s_td1[(s3 >> 16) & 0xff] ^ s_td2[(s2 >> 8) & 0xff] ^ s_td3[s1 & 0xff] ^ rdk[20]; + t1 = s_td0[s1 >> 24] ^ s_td1[(s0 >> 16) & 0xff] ^ s_td2[(s3 >> 8) & 0xff] ^ s_td3[s2 & 0xff] ^ rdk[21]; + t2 = s_td0[s2 >> 24] ^ s_td1[(s1 >> 16) & 0xff] ^ s_td2[(s0 >> 8) & 0xff] ^ s_td3[s3 & 0xff] ^ rdk[22]; + t3 = s_td0[s3 >> 24] ^ s_td1[(s2 >> 16) & 0xff] ^ s_td2[(s1 >> 8) & 0xff] ^ s_td3[s0 & 0xff] ^ rdk[23]; + s0 = s_td0[t0 >> 24] ^ s_td1[(t3 >> 16) & 0xff] ^ s_td2[(t2 >> 8) & 0xff] ^ s_td3[t1 & 0xff] ^ rdk[24]; + s1 = s_td0[t1 >> 24] ^ s_td1[(t0 >> 16) & 0xff] ^ s_td2[(t3 >> 8) & 0xff] ^ s_td3[t2 & 0xff] ^ rdk[25]; + s2 = s_td0[t2 >> 24] ^ s_td1[(t1 >> 16) & 0xff] ^ s_td2[(t0 >> 8) & 0xff] ^ s_td3[t3 & 0xff] ^ rdk[26]; + s3 = s_td0[t3 >> 24] ^ s_td1[(t2 >> 16) & 0xff] ^ s_td2[(t1 >> 8) & 0xff] ^ s_td3[t0 & 0xff] ^ rdk[27]; + t0 = s_td0[s0 >> 24] ^ s_td1[(s3 >> 16) & 0xff] ^ s_td2[(s2 >> 8) & 0xff] ^ s_td3[s1 & 0xff] ^ rdk[28]; + t1 = s_td0[s1 >> 24] ^ s_td1[(s0 >> 16) & 0xff] ^ s_td2[(s3 >> 8) & 0xff] ^ s_td3[s2 & 0xff] ^ rdk[29]; + t2 = s_td0[s2 >> 24] ^ s_td1[(s1 >> 16) & 0xff] ^ s_td2[(s0 >> 8) & 0xff] ^ s_td3[s3 & 0xff] ^ rdk[30]; + t3 = s_td0[s3 >> 24] ^ s_td1[(s2 >> 16) & 0xff] ^ s_td2[(s1 >> 8) & 0xff] ^ s_td3[s0 & 0xff] ^ rdk[31]; + s0 = s_td0[t0 >> 24] ^ s_td1[(t3 >> 16) & 0xff] ^ s_td2[(t2 >> 8) & 0xff] ^ s_td3[t1 & 0xff] ^ rdk[32]; + s1 = s_td0[t1 >> 24] ^ s_td1[(t0 >> 16) & 0xff] ^ s_td2[(t3 >> 8) & 0xff] ^ s_td3[t2 & 0xff] ^ rdk[33]; + s2 = s_td0[t2 >> 24] ^ s_td1[(t1 >> 16) & 0xff] ^ s_td2[(t0 >> 8) & 0xff] ^ s_td3[t3 & 0xff] ^ rdk[34]; + s3 = s_td0[t3 >> 24] ^ s_td1[(t2 >> 16) & 0xff] ^ s_td2[(t1 >> 8) & 0xff] ^ s_td3[t0 & 0xff] ^ rdk[35]; + t0 = s_td0[s0 >> 24] ^ s_td1[(s3 >> 16) & 0xff] ^ s_td2[(s2 >> 8) & 0xff] ^ s_td3[s1 & 0xff] ^ rdk[36]; + t1 = s_td0[s1 >> 24] ^ s_td1[(s0 >> 16) & 0xff] ^ s_td2[(s3 >> 8) & 0xff] ^ s_td3[s2 & 0xff] ^ rdk[37]; + t2 = s_td0[s2 >> 24] ^ s_td1[(s1 >> 16) & 0xff] ^ s_td2[(s0 >> 8) & 0xff] ^ s_td3[s3 & 0xff] ^ rdk[38]; + t3 = s_td0[s3 >> 24] ^ s_td1[(s2 >> 16) & 0xff] ^ s_td2[(s1 >> 8) & 0xff] ^ s_td3[s0 & 0xff] ^ rdk[39]; + + out[0] = (s_td4[(t0 >> 24) & 0xff] & 0xff000000) + ^ (s_td4[(t3 >> 16) & 0xff] & 0x00ff0000) + ^ (s_td4[(t2 >> 8) & 0xff] & 0x0000ff00) + ^ (s_td4[(t1 >> 0) & 0xff] & 0x000000ff) + ^ rdk[40]; + + out[1] = (s_td4[(t1 >> 24) & 0xff] & 0xff000000) + ^ (s_td4[(t0 >> 16) & 0xff] & 0x00ff0000) + ^ (s_td4[(t3 >> 8) & 0xff] & 0x0000ff00) + ^ (s_td4[(t2 >> 0) & 0xff] & 0x000000ff) + ^ rdk[41]; + + out[2] = (s_td4[(t2 >> 24) & 0xff] & 0xff000000) + ^ (s_td4[(t1 >> 16) & 0xff] & 0x00ff0000) + ^ (s_td4[(t0 >> 8) & 0xff] & 0x0000ff00) + ^ (s_td4[(t3 >> 0) & 0xff] & 0x000000ff) + ^ rdk[42]; + + out[3] = (s_td4[(t3 >> 24) & 0xff] & 0xff000000) + ^ (s_td4[(t2 >> 16) & 0xff] & 0x00ff0000) + ^ (s_td4[(t1 >> 8) & 0xff] & 0x0000ff00) + ^ (s_td4[(t0 >> 0) & 0xff] & 0x000000ff) + ^ rdk[43]; +} + +__device__ static void sha1_transform (const u32x w0[4], const u32x w1[4], const u32x w2[4], const u32x w3[4], u32x digest[5]) +{ + u32x A = digest[0]; + u32x B = digest[1]; + u32x C = digest[2]; + u32x D = digest[3]; + u32x E = digest[4]; + + u32x w0_t = w0[0]; + u32x w1_t = w0[1]; + u32x w2_t = w0[2]; + u32x w3_t = w0[3]; + u32x w4_t = w1[0]; + u32x w5_t = w1[1]; + u32x w6_t = w1[2]; + u32x w7_t = w1[3]; + u32x w8_t = w2[0]; + u32x w9_t = w2[1]; + u32x wa_t = w2[2]; + u32x wb_t = w2[3]; + u32x wc_t = w3[0]; + u32x wd_t = w3[1]; + u32x we_t = w3[2]; + u32x wf_t = w3[3]; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, A, B, C, D, E, w0_t); + SHA1_STEP (SHA1_F0o, E, A, B, C, D, w1_t); + SHA1_STEP (SHA1_F0o, D, E, A, B, C, w2_t); + SHA1_STEP (SHA1_F0o, C, D, E, A, B, w3_t); + SHA1_STEP (SHA1_F0o, B, C, D, E, A, w4_t); + SHA1_STEP (SHA1_F0o, A, B, C, D, E, w5_t); + SHA1_STEP (SHA1_F0o, E, A, B, C, D, w6_t); + SHA1_STEP (SHA1_F0o, D, E, A, B, C, w7_t); + SHA1_STEP (SHA1_F0o, C, D, E, A, B, w8_t); + SHA1_STEP (SHA1_F0o, B, C, D, E, A, w9_t); + SHA1_STEP (SHA1_F0o, A, B, C, D, E, wa_t); + SHA1_STEP (SHA1_F0o, E, A, B, C, D, wb_t); + SHA1_STEP (SHA1_F0o, D, E, A, B, C, wc_t); + SHA1_STEP (SHA1_F0o, C, D, E, A, B, wd_t); + SHA1_STEP (SHA1_F0o, B, C, D, E, A, we_t); + SHA1_STEP (SHA1_F0o, A, B, C, D, E, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F0o, E, A, B, C, D, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F0o, D, E, A, B, C, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F0o, C, D, E, A, B, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F0o, B, C, D, E, A, w3_t); + + #undef K + #define K SHA1C01 + + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w7_t); + + #undef K + #define K SHA1C02 + + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, wb_t); + + #undef K + #define K SHA1C03 + + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, wf_t); + + digest[0] += A; + digest[1] += B; + digest[2] += C; + digest[3] += D; + digest[4] += E; +} + +__device__ static void hmac_sha1_pad (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], u32x ipad[5], u32x opad[5]) +{ + w0[0] = w0[0] ^ 0x36363636; + w0[1] = w0[1] ^ 0x36363636; + w0[2] = w0[2] ^ 0x36363636; + w0[3] = w0[3] ^ 0x36363636; + w1[0] = w1[0] ^ 0x36363636; + w1[1] = w1[1] ^ 0x36363636; + w1[2] = w1[2] ^ 0x36363636; + w1[3] = w1[3] ^ 0x36363636; + w2[0] = w2[0] ^ 0x36363636; + w2[1] = w2[1] ^ 0x36363636; + w2[2] = w2[2] ^ 0x36363636; + w2[3] = w2[3] ^ 0x36363636; + w3[0] = w3[0] ^ 0x36363636; + w3[1] = w3[1] ^ 0x36363636; + w3[2] = w3[2] ^ 0x36363636; + w3[3] = w3[3] ^ 0x36363636; + + ipad[0] = SHA1M_A; + ipad[1] = SHA1M_B; + ipad[2] = SHA1M_C; + ipad[3] = SHA1M_D; + ipad[4] = SHA1M_E; + + sha1_transform (w0, w1, w2, w3, ipad); + + w0[0] = w0[0] ^ 0x6a6a6a6a; + w0[1] = w0[1] ^ 0x6a6a6a6a; + w0[2] = w0[2] ^ 0x6a6a6a6a; + w0[3] = w0[3] ^ 0x6a6a6a6a; + w1[0] = w1[0] ^ 0x6a6a6a6a; + w1[1] = w1[1] ^ 0x6a6a6a6a; + w1[2] = w1[2] ^ 0x6a6a6a6a; + w1[3] = w1[3] ^ 0x6a6a6a6a; + w2[0] = w2[0] ^ 0x6a6a6a6a; + w2[1] = w2[1] ^ 0x6a6a6a6a; + w2[2] = w2[2] ^ 0x6a6a6a6a; + w2[3] = w2[3] ^ 0x6a6a6a6a; + w3[0] = w3[0] ^ 0x6a6a6a6a; + w3[1] = w3[1] ^ 0x6a6a6a6a; + w3[2] = w3[2] ^ 0x6a6a6a6a; + w3[3] = w3[3] ^ 0x6a6a6a6a; + + opad[0] = SHA1M_A; + opad[1] = SHA1M_B; + opad[2] = SHA1M_C; + opad[3] = SHA1M_D; + opad[4] = SHA1M_E; + + sha1_transform (w0, w1, w2, w3, opad); +} + +__device__ static void hmac_sha1_run (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], u32x ipad[5], u32x opad[5], u32x digest[5]) +{ + digest[0] = ipad[0]; + digest[1] = ipad[1]; + digest[2] = ipad[2]; + digest[3] = ipad[3]; + digest[4] = ipad[4]; + + sha1_transform (w0, w1, w2, w3, digest); + + w0[0] = digest[0]; + w0[1] = digest[1]; + w0[2] = digest[2]; + w0[3] = digest[3]; + w1[0] = digest[4]; + w1[1] = 0x80000000; + w1[2] = 0; + w1[3] = 0; + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = (64 + 20) * 8; + + digest[0] = opad[0]; + digest[1] = opad[1]; + digest[2] = opad[2]; + digest[3] = opad[3]; + digest[4] = opad[4]; + + sha1_transform (w0, w1, w2, w3, digest); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m06600_init (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, agilekey_tmp_t *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = pws[gid].i[ 8]; + w2[1] = pws[gid].i[ 9]; + w2[2] = pws[gid].i[10]; + w2[3] = pws[gid].i[11]; + + u32x w3[4]; + + w3[0] = pws[gid].i[12]; + w3[1] = pws[gid].i[13]; + w3[2] = pws[gid].i[14]; + w3[3] = pws[gid].i[15]; + + /** + * salt + */ + + u32 salt_len = 8; + + u32 salt_buf[2]; + + salt_buf[0] = salt_bufs[salt_pos].salt_buf[0]; + salt_buf[1] = salt_bufs[salt_pos].salt_buf[1]; + + /** + * pads + */ + + w0[0] = swap_workaround (w0[0]); + w0[1] = swap_workaround (w0[1]); + w0[2] = swap_workaround (w0[2]); + w0[3] = swap_workaround (w0[3]); + w1[0] = swap_workaround (w1[0]); + w1[1] = swap_workaround (w1[1]); + w1[2] = swap_workaround (w1[2]); + w1[3] = swap_workaround (w1[3]); + w2[0] = swap_workaround (w2[0]); + w2[1] = swap_workaround (w2[1]); + w2[2] = swap_workaround (w2[2]); + w2[3] = swap_workaround (w2[3]); + w3[0] = swap_workaround (w3[0]); + w3[1] = swap_workaround (w3[1]); + w3[2] = swap_workaround (w3[2]); + w3[3] = swap_workaround (w3[3]); + + u32x ipad[5]; + u32x opad[5]; + + hmac_sha1_pad (w0, w1, w2, w3, ipad, opad); + + tmps[gid].ipad[0] = ipad[0]; + tmps[gid].ipad[1] = ipad[1]; + tmps[gid].ipad[2] = ipad[2]; + tmps[gid].ipad[3] = ipad[3]; + tmps[gid].ipad[4] = ipad[4]; + + tmps[gid].opad[0] = opad[0]; + tmps[gid].opad[1] = opad[1]; + tmps[gid].opad[2] = opad[2]; + tmps[gid].opad[3] = opad[3]; + tmps[gid].opad[4] = opad[4]; + + w0[0] = salt_buf[0]; + w0[1] = salt_buf[1]; + w0[2] = 0; + w0[3] = 0; + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + append_0x01_1 (w0, salt_len + 3); + append_0x80_1 (w0, salt_len + 4); + + w0[0] = swap_workaround (w0[0]); + w0[1] = swap_workaround (w0[1]); + w0[2] = swap_workaround (w0[2]); + w0[3] = swap_workaround (w0[3]); + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = (64 + salt_len + 4) * 8; + + u32x dgst[5]; + + hmac_sha1_run (w0, w1, w2, w3, ipad, opad, dgst); + + tmps[gid].dgst[0] = dgst[0]; + tmps[gid].dgst[1] = dgst[1]; + tmps[gid].dgst[2] = dgst[2]; + tmps[gid].dgst[3] = dgst[3]; + tmps[gid].dgst[4] = dgst[4]; + + tmps[gid].out[0] = dgst[0]; + tmps[gid].out[1] = dgst[1]; + tmps[gid].out[2] = dgst[2]; + tmps[gid].out[3] = dgst[3]; + tmps[gid].out[4] = dgst[4]; +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m06600_loop (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, agilekey_tmp_t *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x ipad[5]; + u32x opad[5]; + + ipad[0] = tmps[gid].ipad[0]; + ipad[1] = tmps[gid].ipad[1]; + ipad[2] = tmps[gid].ipad[2]; + ipad[3] = tmps[gid].ipad[3]; + ipad[4] = tmps[gid].ipad[4]; + + opad[0] = tmps[gid].opad[0]; + opad[1] = tmps[gid].opad[1]; + opad[2] = tmps[gid].opad[2]; + opad[3] = tmps[gid].opad[3]; + opad[4] = tmps[gid].opad[4]; + + u32x dgst[5]; + u32x out[5]; + + dgst[0] = tmps[gid].dgst[0]; + dgst[1] = tmps[gid].dgst[1]; + dgst[2] = tmps[gid].dgst[2]; + dgst[3] = tmps[gid].dgst[3]; + dgst[4] = tmps[gid].dgst[4]; + + out[0] = tmps[gid].out[0]; + out[1] = tmps[gid].out[1]; + out[2] = tmps[gid].out[2]; + out[3] = tmps[gid].out[3]; + out[4] = tmps[gid].out[4]; + + for (u32 j = 0; j < loop_cnt; j++) + { + u32x w0[4]; + u32x w1[4]; + u32x w2[4]; + u32x w3[4]; + + w0[0] = dgst[0]; + w0[1] = dgst[1]; + w0[2] = dgst[2]; + w0[3] = dgst[3]; + w1[0] = dgst[4]; + w1[1] = 0x80000000; + w1[2] = 0; + w1[3] = 0; + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = (64 + 20) * 8; + + hmac_sha1_run (w0, w1, w2, w3, ipad, opad, dgst); + + out[0] ^= dgst[0]; + out[1] ^= dgst[1]; + out[2] ^= dgst[2]; + out[3] ^= dgst[3]; + out[4] ^= dgst[4]; + } + + tmps[gid].dgst[0] = dgst[0]; + tmps[gid].dgst[1] = dgst[1]; + tmps[gid].dgst[2] = dgst[2]; + tmps[gid].dgst[3] = dgst[3]; + tmps[gid].dgst[4] = dgst[4]; + + tmps[gid].out[0] = out[0]; + tmps[gid].out[1] = out[1]; + tmps[gid].out[2] = out[2]; + tmps[gid].out[3] = out[3]; + tmps[gid].out[4] = out[4]; +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m06600_comp (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, agilekey_tmp_t *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + const u32 lid = threadIdx.x; + + /** + * salt + */ + + const u32 iv[4] = + { + salt_bufs[salt_pos].salt_buf[ 4], + salt_bufs[salt_pos].salt_buf[ 5], + salt_bufs[salt_pos].salt_buf[ 6], + salt_bufs[salt_pos].salt_buf[ 7] + }; + + const u32 data[4] = + { + salt_bufs[salt_pos].salt_buf[ 8], + salt_bufs[salt_pos].salt_buf[ 9], + salt_bufs[salt_pos].salt_buf[10], + salt_bufs[salt_pos].salt_buf[11] + }; + + /** + * aes shared + */ + + __shared__ u32 s_td0[256]; + __shared__ u32 s_td1[256]; + __shared__ u32 s_td2[256]; + __shared__ u32 s_td3[256]; + __shared__ u32 s_td4[256]; + + __shared__ u32 s_te0[256]; + __shared__ u32 s_te1[256]; + __shared__ u32 s_te2[256]; + __shared__ u32 s_te3[256]; + __shared__ u32 s_te4[256]; + + s_td0[lid] = td0[lid]; + s_td1[lid] = td1[lid]; + s_td2[lid] = td2[lid]; + s_td3[lid] = td3[lid]; + s_td4[lid] = td4[lid]; + + s_te0[lid] = te0[lid]; + s_te1[lid] = te1[lid]; + s_te2[lid] = te2[lid]; + s_te3[lid] = te3[lid]; + s_te4[lid] = te4[lid]; + + __syncthreads (); + + if (gid >= gid_max) return; + + /** + * aes init + */ + + u32x ukey[4]; + + ukey[0] = tmps[gid].out[0]; + ukey[1] = tmps[gid].out[1]; + ukey[2] = tmps[gid].out[2]; + ukey[3] = tmps[gid].out[3]; + + u32x a; + u32x b; + u32x c; + u32x d; + + #define KEYLEN 44 + + u32 rek[KEYLEN]; + u32 rdk[KEYLEN]; + + u32 out[4]; + + /** + * aes decrypt key + */ + + AES128_ExpandKey (ukey, rek, s_te0, s_te1, s_te2, s_te3, s_te4); + + #pragma unroll 44 + for (u32 i = 0; i < KEYLEN; i++) rdk[i] = rek[i]; + + AES128_InvertKey (rdk, s_td0, s_td1, s_td2, s_td3, s_td4, s_te0, s_te1, s_te2, s_te3, s_te4); + + AES128_decrypt (data, out, rdk, s_td0, s_td1, s_td2, s_td3, s_td4); + + a = out[0] ^ iv[0]; + b = out[1] ^ iv[1]; + c = out[2] ^ iv[2]; + d = out[3] ^ iv[3]; + + const u32x r0 = a; + const u32x r1 = b; + const u32x r2 = c; + const u32x r3 = d; + + #define il_pos 0 + + #include VECT_COMPARE_M +} diff --git a/nv/m06700.cu b/nv/m06700.cu new file mode 100644 index 0000000000..26dc67f3a0 --- /dev/null +++ b/nv/m06700.cu @@ -0,0 +1,532 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _SHA1_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW2 +#define VECT_SIZE1 +#endif + +#define DGST_R0 0 +#define DGST_R1 1 +#define DGST_R2 2 +#define DGST_R3 3 + +#include "include/kernel_functions.c" +#include "types_nv.c" +#include "common_nv.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +__device__ static void sha1_transform (const u32x w0[4], const u32x w1[4], const u32x w2[4], const u32x w3[4], u32x digest[5]) +{ + u32x A = digest[0]; + u32x B = digest[1]; + u32x C = digest[2]; + u32x D = digest[3]; + u32x E = digest[4]; + + u32x w0_t = w0[0]; + u32x w1_t = w0[1]; + u32x w2_t = w0[2]; + u32x w3_t = w0[3]; + u32x w4_t = w1[0]; + u32x w5_t = w1[1]; + u32x w6_t = w1[2]; + u32x w7_t = w1[3]; + u32x w8_t = w2[0]; + u32x w9_t = w2[1]; + u32x wa_t = w2[2]; + u32x wb_t = w2[3]; + u32x wc_t = w3[0]; + u32x wd_t = w3[1]; + u32x we_t = w3[2]; + u32x wf_t = w3[3]; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, A, B, C, D, E, w0_t); + SHA1_STEP (SHA1_F0o, E, A, B, C, D, w1_t); + SHA1_STEP (SHA1_F0o, D, E, A, B, C, w2_t); + SHA1_STEP (SHA1_F0o, C, D, E, A, B, w3_t); + SHA1_STEP (SHA1_F0o, B, C, D, E, A, w4_t); + SHA1_STEP (SHA1_F0o, A, B, C, D, E, w5_t); + SHA1_STEP (SHA1_F0o, E, A, B, C, D, w6_t); + SHA1_STEP (SHA1_F0o, D, E, A, B, C, w7_t); + SHA1_STEP (SHA1_F0o, C, D, E, A, B, w8_t); + SHA1_STEP (SHA1_F0o, B, C, D, E, A, w9_t); + SHA1_STEP (SHA1_F0o, A, B, C, D, E, wa_t); + SHA1_STEP (SHA1_F0o, E, A, B, C, D, wb_t); + SHA1_STEP (SHA1_F0o, D, E, A, B, C, wc_t); + SHA1_STEP (SHA1_F0o, C, D, E, A, B, wd_t); + SHA1_STEP (SHA1_F0o, B, C, D, E, A, we_t); + SHA1_STEP (SHA1_F0o, A, B, C, D, E, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F0o, E, A, B, C, D, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F0o, D, E, A, B, C, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F0o, C, D, E, A, B, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F0o, B, C, D, E, A, w3_t); + + #undef K + #define K SHA1C01 + + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w7_t); + + #undef K + #define K SHA1C02 + + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, wb_t); + + #undef K + #define K SHA1C03 + + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, wf_t); + + digest[0] += A; + digest[1] += B; + digest[2] += C; + digest[3] += D; + digest[4] += E; +} + +__device__ static void hmac_sha1_pad (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], u32x ipad[5], u32x opad[5]) +{ + w0[0] = w0[0] ^ 0x36363636; + w0[1] = w0[1] ^ 0x36363636; + w0[2] = w0[2] ^ 0x36363636; + w0[3] = w0[3] ^ 0x36363636; + w1[0] = w1[0] ^ 0x36363636; + w1[1] = w1[1] ^ 0x36363636; + w1[2] = w1[2] ^ 0x36363636; + w1[3] = w1[3] ^ 0x36363636; + w2[0] = w2[0] ^ 0x36363636; + w2[1] = w2[1] ^ 0x36363636; + w2[2] = w2[2] ^ 0x36363636; + w2[3] = w2[3] ^ 0x36363636; + w3[0] = w3[0] ^ 0x36363636; + w3[1] = w3[1] ^ 0x36363636; + w3[2] = w3[2] ^ 0x36363636; + w3[3] = w3[3] ^ 0x36363636; + + ipad[0] = SHA1M_A; + ipad[1] = SHA1M_B; + ipad[2] = SHA1M_C; + ipad[3] = SHA1M_D; + ipad[4] = SHA1M_E; + + sha1_transform (w0, w1, w2, w3, ipad); + + w0[0] = w0[0] ^ 0x6a6a6a6a; + w0[1] = w0[1] ^ 0x6a6a6a6a; + w0[2] = w0[2] ^ 0x6a6a6a6a; + w0[3] = w0[3] ^ 0x6a6a6a6a; + w1[0] = w1[0] ^ 0x6a6a6a6a; + w1[1] = w1[1] ^ 0x6a6a6a6a; + w1[2] = w1[2] ^ 0x6a6a6a6a; + w1[3] = w1[3] ^ 0x6a6a6a6a; + w2[0] = w2[0] ^ 0x6a6a6a6a; + w2[1] = w2[1] ^ 0x6a6a6a6a; + w2[2] = w2[2] ^ 0x6a6a6a6a; + w2[3] = w2[3] ^ 0x6a6a6a6a; + w3[0] = w3[0] ^ 0x6a6a6a6a; + w3[1] = w3[1] ^ 0x6a6a6a6a; + w3[2] = w3[2] ^ 0x6a6a6a6a; + w3[3] = w3[3] ^ 0x6a6a6a6a; + + opad[0] = SHA1M_A; + opad[1] = SHA1M_B; + opad[2] = SHA1M_C; + opad[3] = SHA1M_D; + opad[4] = SHA1M_E; + + sha1_transform (w0, w1, w2, w3, opad); +} + +__device__ static void hmac_sha1_run (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], u32x ipad[5], u32x opad[5], u32x digest[5]) +{ + digest[0] = ipad[0]; + digest[1] = ipad[1]; + digest[2] = ipad[2]; + digest[3] = ipad[3]; + digest[4] = ipad[4]; + + sha1_transform (w0, w1, w2, w3, digest); + + w0[0] = digest[0]; + w0[1] = digest[1]; + w0[2] = digest[2]; + w0[3] = digest[3]; + w1[0] = digest[4]; + w1[1] = 0x80000000; + w1[2] = 0; + w1[3] = 0; + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = (64 + 20) * 8; + + digest[0] = opad[0]; + digest[1] = opad[1]; + digest[2] = opad[2]; + digest[3] = opad[3]; + digest[4] = opad[4]; + + sha1_transform (w0, w1, w2, w3, digest); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m06700_init (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, sha1aix_tmp_t *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = pws[gid].i[ 8]; + w2[1] = pws[gid].i[ 9]; + w2[2] = pws[gid].i[10]; + w2[3] = pws[gid].i[11]; + + u32x w3[4]; + + w3[0] = pws[gid].i[12]; + w3[1] = pws[gid].i[13]; + w3[2] = pws[gid].i[14]; + w3[3] = pws[gid].i[15]; + + /** + * salt + */ + + u32 salt_len = salt_bufs[salt_pos].salt_len; + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[ 1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[ 2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[ 3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[ 4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[ 5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[ 6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[ 7]; + + u32 salt_buf2[4]; + + salt_buf2[0] = salt_bufs[salt_pos].salt_buf[ 8]; + salt_buf2[1] = salt_bufs[salt_pos].salt_buf[ 9]; + salt_buf2[2] = salt_bufs[salt_pos].salt_buf[10]; + salt_buf2[3] = salt_bufs[salt_pos].salt_buf[11]; + + u32 salt_buf3[4]; + + salt_buf3[0] = 0; + salt_buf3[1] = 0; + salt_buf3[2] = 0; + salt_buf3[3] = 0; + + append_0x01_4 (salt_buf0, salt_buf1, salt_buf2, salt_buf3, salt_len + 3); + + append_0x80_4 (salt_buf0, salt_buf1, salt_buf2, salt_buf3, salt_len + 4); + + /** + * pads + */ + + w0[0] = swap_workaround (w0[0]); + w0[1] = swap_workaround (w0[1]); + w0[2] = swap_workaround (w0[2]); + w0[3] = swap_workaround (w0[3]); + w1[0] = swap_workaround (w1[0]); + w1[1] = swap_workaround (w1[1]); + w1[2] = swap_workaround (w1[2]); + w1[3] = swap_workaround (w1[3]); + w2[0] = swap_workaround (w2[0]); + w2[1] = swap_workaround (w2[1]); + w2[2] = swap_workaround (w2[2]); + w2[3] = swap_workaround (w2[3]); + w3[0] = swap_workaround (w3[0]); + w3[1] = swap_workaround (w3[1]); + w3[2] = swap_workaround (w3[2]); + w3[3] = swap_workaround (w3[3]); + + u32x ipad[5]; + u32x opad[5]; + + hmac_sha1_pad (w0, w1, w2, w3, ipad, opad); + + tmps[gid].ipad[0] = ipad[0]; + tmps[gid].ipad[1] = ipad[1]; + tmps[gid].ipad[2] = ipad[2]; + tmps[gid].ipad[3] = ipad[3]; + tmps[gid].ipad[4] = ipad[4]; + + tmps[gid].opad[0] = opad[0]; + tmps[gid].opad[1] = opad[1]; + tmps[gid].opad[2] = opad[2]; + tmps[gid].opad[3] = opad[3]; + tmps[gid].opad[4] = opad[4]; + + w0[0] = salt_buf0[0]; + w0[1] = salt_buf0[1]; + w0[2] = salt_buf0[2]; + w0[3] = salt_buf0[3]; + w1[0] = salt_buf1[0]; + w1[1] = salt_buf1[1]; + w1[2] = salt_buf1[2]; + w1[3] = salt_buf1[3]; + w2[0] = salt_buf2[0]; + w2[1] = salt_buf2[1]; + w2[2] = salt_buf2[2]; + w2[3] = salt_buf2[3]; + w3[0] = salt_buf3[0]; + w3[1] = salt_buf3[1]; + w3[2] = salt_buf3[2]; + //w3[3] = salt_buf3[3]; + + w0[0] = swap_workaround (w0[0]); + w0[1] = swap_workaround (w0[1]); + w0[2] = swap_workaround (w0[2]); + w0[3] = swap_workaround (w0[3]); + w1[0] = swap_workaround (w1[0]); + w1[1] = swap_workaround (w1[1]); + w1[2] = swap_workaround (w1[2]); + w1[3] = swap_workaround (w1[3]); + w2[0] = swap_workaround (w2[0]); + w2[1] = swap_workaround (w2[1]); + w2[2] = swap_workaround (w2[2]); + w2[3] = swap_workaround (w2[3]); + w3[0] = swap_workaround (w3[0]); + w3[1] = swap_workaround (w3[1]); + w3[2] = swap_workaround (w3[2]); + w3[3] = (64 + salt_len + 4) * 8; + + u32x dgst[5]; + + hmac_sha1_run (w0, w1, w2, w3, ipad, opad, dgst); + + tmps[gid].dgst[0] = dgst[0]; + tmps[gid].dgst[1] = dgst[1]; + tmps[gid].dgst[2] = dgst[2]; + tmps[gid].dgst[3] = dgst[3]; + tmps[gid].dgst[4] = dgst[4]; + + tmps[gid].out[0] = dgst[0]; + tmps[gid].out[1] = dgst[1]; + tmps[gid].out[2] = dgst[2]; + tmps[gid].out[3] = dgst[3]; + tmps[gid].out[4] = dgst[4]; +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m06700_loop (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, sha1aix_tmp_t *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x ipad[5]; + u32x opad[5]; + + ipad[0] = tmps[gid].ipad[0]; + ipad[1] = tmps[gid].ipad[1]; + ipad[2] = tmps[gid].ipad[2]; + ipad[3] = tmps[gid].ipad[3]; + ipad[4] = tmps[gid].ipad[4]; + + opad[0] = tmps[gid].opad[0]; + opad[1] = tmps[gid].opad[1]; + opad[2] = tmps[gid].opad[2]; + opad[3] = tmps[gid].opad[3]; + opad[4] = tmps[gid].opad[4]; + + u32x dgst[5]; + u32x out[5]; + + dgst[0] = tmps[gid].dgst[0]; + dgst[1] = tmps[gid].dgst[1]; + dgst[2] = tmps[gid].dgst[2]; + dgst[3] = tmps[gid].dgst[3]; + dgst[4] = tmps[gid].dgst[4]; + + out[0] = tmps[gid].out[0]; + out[1] = tmps[gid].out[1]; + out[2] = tmps[gid].out[2]; + out[3] = tmps[gid].out[3]; + out[4] = tmps[gid].out[4]; + + for (u32 j = 0; j < loop_cnt; j++) + { + u32x w0[4]; + u32x w1[4]; + u32x w2[4]; + u32x w3[4]; + + w0[0] = dgst[0]; + w0[1] = dgst[1]; + w0[2] = dgst[2]; + w0[3] = dgst[3]; + w1[0] = dgst[4]; + w1[1] = 0x80000000; + w1[2] = 0; + w1[3] = 0; + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = (64 + 20) * 8; + + hmac_sha1_run (w0, w1, w2, w3, ipad, opad, dgst); + + out[0] ^= dgst[0]; + out[1] ^= dgst[1]; + out[2] ^= dgst[2]; + out[3] ^= dgst[3]; + out[4] ^= dgst[4]; + } + + tmps[gid].dgst[0] = dgst[0]; + tmps[gid].dgst[1] = dgst[1]; + tmps[gid].dgst[2] = dgst[2]; + tmps[gid].dgst[3] = dgst[3]; + tmps[gid].dgst[4] = dgst[4]; + + tmps[gid].out[0] = out[0]; + tmps[gid].out[1] = out[1]; + tmps[gid].out[2] = out[2]; + tmps[gid].out[3] = out[3]; + tmps[gid].out[4] = out[4]; +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m06700_comp (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, sha1aix_tmp_t *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + const u32 lid = threadIdx.x; + + /** + * digest + */ + + /* + u32x a = tmps[gid].out[0]; + u32x b = tmps[gid].out[1]; + u32x c = tmps[gid].out[2]; + u32x d = tmps[gid].out[3]; + u32x e = tmps[gid].out[4] & 0xffff03ff; + */ + + const u32x r0 = tmps[gid].out[DGST_R0]; + const u32x r1 = tmps[gid].out[DGST_R1]; + const u32x r2 = tmps[gid].out[DGST_R2]; + const u32x r3 = tmps[gid].out[DGST_R3]; + + #define il_pos 0 + + #include VECT_COMPARE_M +} diff --git a/nv/m06800.cu b/nv/m06800.cu new file mode 100644 index 0000000000..d9478c89bd --- /dev/null +++ b/nv/m06800.cu @@ -0,0 +1,1603 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _SHA256_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW2 +#define VECT_SIZE1 +#endif + +#define DGST_R0 0 +#define DGST_R1 1 +#define DGST_R2 2 +#define DGST_R3 3 + +#include "include/kernel_functions.c" +#include "types_nv.c" +#include "common_nv.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +__device__ __constant__ u32 te0[256] = +{ + 0xc66363a5, 0xf87c7c84, 0xee777799, 0xf67b7b8d, + 0xfff2f20d, 0xd66b6bbd, 0xde6f6fb1, 0x91c5c554, + 0x60303050, 0x02010103, 0xce6767a9, 0x562b2b7d, + 0xe7fefe19, 0xb5d7d762, 0x4dababe6, 0xec76769a, + 0x8fcaca45, 0x1f82829d, 0x89c9c940, 0xfa7d7d87, + 0xeffafa15, 0xb25959eb, 0x8e4747c9, 0xfbf0f00b, + 0x41adadec, 0xb3d4d467, 0x5fa2a2fd, 0x45afafea, + 0x239c9cbf, 0x53a4a4f7, 0xe4727296, 0x9bc0c05b, + 0x75b7b7c2, 0xe1fdfd1c, 0x3d9393ae, 0x4c26266a, + 0x6c36365a, 0x7e3f3f41, 0xf5f7f702, 0x83cccc4f, + 0x6834345c, 0x51a5a5f4, 0xd1e5e534, 0xf9f1f108, + 0xe2717193, 0xabd8d873, 0x62313153, 0x2a15153f, + 0x0804040c, 0x95c7c752, 0x46232365, 0x9dc3c35e, + 0x30181828, 0x379696a1, 0x0a05050f, 0x2f9a9ab5, + 0x0e070709, 0x24121236, 0x1b80809b, 0xdfe2e23d, + 0xcdebeb26, 0x4e272769, 0x7fb2b2cd, 0xea75759f, + 0x1209091b, 0x1d83839e, 0x582c2c74, 0x341a1a2e, + 0x361b1b2d, 0xdc6e6eb2, 0xb45a5aee, 0x5ba0a0fb, + 0xa45252f6, 0x763b3b4d, 0xb7d6d661, 0x7db3b3ce, + 0x5229297b, 0xdde3e33e, 0x5e2f2f71, 0x13848497, + 0xa65353f5, 0xb9d1d168, 0x00000000, 0xc1eded2c, + 0x40202060, 0xe3fcfc1f, 0x79b1b1c8, 0xb65b5bed, + 0xd46a6abe, 0x8dcbcb46, 0x67bebed9, 0x7239394b, + 0x944a4ade, 0x984c4cd4, 0xb05858e8, 0x85cfcf4a, + 0xbbd0d06b, 0xc5efef2a, 0x4faaaae5, 0xedfbfb16, + 0x864343c5, 0x9a4d4dd7, 0x66333355, 0x11858594, + 0x8a4545cf, 0xe9f9f910, 0x04020206, 0xfe7f7f81, + 0xa05050f0, 0x783c3c44, 0x259f9fba, 0x4ba8a8e3, + 0xa25151f3, 0x5da3a3fe, 0x804040c0, 0x058f8f8a, + 0x3f9292ad, 0x219d9dbc, 0x70383848, 0xf1f5f504, + 0x63bcbcdf, 0x77b6b6c1, 0xafdada75, 0x42212163, + 0x20101030, 0xe5ffff1a, 0xfdf3f30e, 0xbfd2d26d, + 0x81cdcd4c, 0x180c0c14, 0x26131335, 0xc3ecec2f, + 0xbe5f5fe1, 0x359797a2, 0x884444cc, 0x2e171739, + 0x93c4c457, 0x55a7a7f2, 0xfc7e7e82, 0x7a3d3d47, + 0xc86464ac, 0xba5d5de7, 0x3219192b, 0xe6737395, + 0xc06060a0, 0x19818198, 0x9e4f4fd1, 0xa3dcdc7f, + 0x44222266, 0x542a2a7e, 0x3b9090ab, 0x0b888883, + 0x8c4646ca, 0xc7eeee29, 0x6bb8b8d3, 0x2814143c, + 0xa7dede79, 0xbc5e5ee2, 0x160b0b1d, 0xaddbdb76, + 0xdbe0e03b, 0x64323256, 0x743a3a4e, 0x140a0a1e, + 0x924949db, 0x0c06060a, 0x4824246c, 0xb85c5ce4, + 0x9fc2c25d, 0xbdd3d36e, 0x43acacef, 0xc46262a6, + 0x399191a8, 0x319595a4, 0xd3e4e437, 0xf279798b, + 0xd5e7e732, 0x8bc8c843, 0x6e373759, 0xda6d6db7, + 0x018d8d8c, 0xb1d5d564, 0x9c4e4ed2, 0x49a9a9e0, + 0xd86c6cb4, 0xac5656fa, 0xf3f4f407, 0xcfeaea25, + 0xca6565af, 0xf47a7a8e, 0x47aeaee9, 0x10080818, + 0x6fbabad5, 0xf0787888, 0x4a25256f, 0x5c2e2e72, + 0x381c1c24, 0x57a6a6f1, 0x73b4b4c7, 0x97c6c651, + 0xcbe8e823, 0xa1dddd7c, 0xe874749c, 0x3e1f1f21, + 0x964b4bdd, 0x61bdbddc, 0x0d8b8b86, 0x0f8a8a85, + 0xe0707090, 0x7c3e3e42, 0x71b5b5c4, 0xcc6666aa, + 0x904848d8, 0x06030305, 0xf7f6f601, 0x1c0e0e12, + 0xc26161a3, 0x6a35355f, 0xae5757f9, 0x69b9b9d0, + 0x17868691, 0x99c1c158, 0x3a1d1d27, 0x279e9eb9, + 0xd9e1e138, 0xebf8f813, 0x2b9898b3, 0x22111133, + 0xd26969bb, 0xa9d9d970, 0x078e8e89, 0x339494a7, + 0x2d9b9bb6, 0x3c1e1e22, 0x15878792, 0xc9e9e920, + 0x87cece49, 0xaa5555ff, 0x50282878, 0xa5dfdf7a, + 0x038c8c8f, 0x59a1a1f8, 0x09898980, 0x1a0d0d17, + 0x65bfbfda, 0xd7e6e631, 0x844242c6, 0xd06868b8, + 0x824141c3, 0x299999b0, 0x5a2d2d77, 0x1e0f0f11, + 0x7bb0b0cb, 0xa85454fc, 0x6dbbbbd6, 0x2c16163a, +}; + +__device__ __constant__ u32 te1[256] = +{ + 0xa5c66363, 0x84f87c7c, 0x99ee7777, 0x8df67b7b, + 0x0dfff2f2, 0xbdd66b6b, 0xb1de6f6f, 0x5491c5c5, + 0x50603030, 0x03020101, 0xa9ce6767, 0x7d562b2b, + 0x19e7fefe, 0x62b5d7d7, 0xe64dabab, 0x9aec7676, + 0x458fcaca, 0x9d1f8282, 0x4089c9c9, 0x87fa7d7d, + 0x15effafa, 0xebb25959, 0xc98e4747, 0x0bfbf0f0, + 0xec41adad, 0x67b3d4d4, 0xfd5fa2a2, 0xea45afaf, + 0xbf239c9c, 0xf753a4a4, 0x96e47272, 0x5b9bc0c0, + 0xc275b7b7, 0x1ce1fdfd, 0xae3d9393, 0x6a4c2626, + 0x5a6c3636, 0x417e3f3f, 0x02f5f7f7, 0x4f83cccc, + 0x5c683434, 0xf451a5a5, 0x34d1e5e5, 0x08f9f1f1, + 0x93e27171, 0x73abd8d8, 0x53623131, 0x3f2a1515, + 0x0c080404, 0x5295c7c7, 0x65462323, 0x5e9dc3c3, + 0x28301818, 0xa1379696, 0x0f0a0505, 0xb52f9a9a, + 0x090e0707, 0x36241212, 0x9b1b8080, 0x3ddfe2e2, + 0x26cdebeb, 0x694e2727, 0xcd7fb2b2, 0x9fea7575, + 0x1b120909, 0x9e1d8383, 0x74582c2c, 0x2e341a1a, + 0x2d361b1b, 0xb2dc6e6e, 0xeeb45a5a, 0xfb5ba0a0, + 0xf6a45252, 0x4d763b3b, 0x61b7d6d6, 0xce7db3b3, + 0x7b522929, 0x3edde3e3, 0x715e2f2f, 0x97138484, + 0xf5a65353, 0x68b9d1d1, 0x00000000, 0x2cc1eded, + 0x60402020, 0x1fe3fcfc, 0xc879b1b1, 0xedb65b5b, + 0xbed46a6a, 0x468dcbcb, 0xd967bebe, 0x4b723939, + 0xde944a4a, 0xd4984c4c, 0xe8b05858, 0x4a85cfcf, + 0x6bbbd0d0, 0x2ac5efef, 0xe54faaaa, 0x16edfbfb, + 0xc5864343, 0xd79a4d4d, 0x55663333, 0x94118585, + 0xcf8a4545, 0x10e9f9f9, 0x06040202, 0x81fe7f7f, + 0xf0a05050, 0x44783c3c, 0xba259f9f, 0xe34ba8a8, + 0xf3a25151, 0xfe5da3a3, 0xc0804040, 0x8a058f8f, + 0xad3f9292, 0xbc219d9d, 0x48703838, 0x04f1f5f5, + 0xdf63bcbc, 0xc177b6b6, 0x75afdada, 0x63422121, + 0x30201010, 0x1ae5ffff, 0x0efdf3f3, 0x6dbfd2d2, + 0x4c81cdcd, 0x14180c0c, 0x35261313, 0x2fc3ecec, + 0xe1be5f5f, 0xa2359797, 0xcc884444, 0x392e1717, + 0x5793c4c4, 0xf255a7a7, 0x82fc7e7e, 0x477a3d3d, + 0xacc86464, 0xe7ba5d5d, 0x2b321919, 0x95e67373, + 0xa0c06060, 0x98198181, 0xd19e4f4f, 0x7fa3dcdc, + 0x66442222, 0x7e542a2a, 0xab3b9090, 0x830b8888, + 0xca8c4646, 0x29c7eeee, 0xd36bb8b8, 0x3c281414, + 0x79a7dede, 0xe2bc5e5e, 0x1d160b0b, 0x76addbdb, + 0x3bdbe0e0, 0x56643232, 0x4e743a3a, 0x1e140a0a, + 0xdb924949, 0x0a0c0606, 0x6c482424, 0xe4b85c5c, + 0x5d9fc2c2, 0x6ebdd3d3, 0xef43acac, 0xa6c46262, + 0xa8399191, 0xa4319595, 0x37d3e4e4, 0x8bf27979, + 0x32d5e7e7, 0x438bc8c8, 0x596e3737, 0xb7da6d6d, + 0x8c018d8d, 0x64b1d5d5, 0xd29c4e4e, 0xe049a9a9, + 0xb4d86c6c, 0xfaac5656, 0x07f3f4f4, 0x25cfeaea, + 0xafca6565, 0x8ef47a7a, 0xe947aeae, 0x18100808, + 0xd56fbaba, 0x88f07878, 0x6f4a2525, 0x725c2e2e, + 0x24381c1c, 0xf157a6a6, 0xc773b4b4, 0x5197c6c6, + 0x23cbe8e8, 0x7ca1dddd, 0x9ce87474, 0x213e1f1f, + 0xdd964b4b, 0xdc61bdbd, 0x860d8b8b, 0x850f8a8a, + 0x90e07070, 0x427c3e3e, 0xc471b5b5, 0xaacc6666, + 0xd8904848, 0x05060303, 0x01f7f6f6, 0x121c0e0e, + 0xa3c26161, 0x5f6a3535, 0xf9ae5757, 0xd069b9b9, + 0x91178686, 0x5899c1c1, 0x273a1d1d, 0xb9279e9e, + 0x38d9e1e1, 0x13ebf8f8, 0xb32b9898, 0x33221111, + 0xbbd26969, 0x70a9d9d9, 0x89078e8e, 0xa7339494, + 0xb62d9b9b, 0x223c1e1e, 0x92158787, 0x20c9e9e9, + 0x4987cece, 0xffaa5555, 0x78502828, 0x7aa5dfdf, + 0x8f038c8c, 0xf859a1a1, 0x80098989, 0x171a0d0d, + 0xda65bfbf, 0x31d7e6e6, 0xc6844242, 0xb8d06868, + 0xc3824141, 0xb0299999, 0x775a2d2d, 0x111e0f0f, + 0xcb7bb0b0, 0xfca85454, 0xd66dbbbb, 0x3a2c1616, +}; + +__device__ __constant__ u32 te2[256] = +{ + 0x63a5c663, 0x7c84f87c, 0x7799ee77, 0x7b8df67b, + 0xf20dfff2, 0x6bbdd66b, 0x6fb1de6f, 0xc55491c5, + 0x30506030, 0x01030201, 0x67a9ce67, 0x2b7d562b, + 0xfe19e7fe, 0xd762b5d7, 0xabe64dab, 0x769aec76, + 0xca458fca, 0x829d1f82, 0xc94089c9, 0x7d87fa7d, + 0xfa15effa, 0x59ebb259, 0x47c98e47, 0xf00bfbf0, + 0xadec41ad, 0xd467b3d4, 0xa2fd5fa2, 0xafea45af, + 0x9cbf239c, 0xa4f753a4, 0x7296e472, 0xc05b9bc0, + 0xb7c275b7, 0xfd1ce1fd, 0x93ae3d93, 0x266a4c26, + 0x365a6c36, 0x3f417e3f, 0xf702f5f7, 0xcc4f83cc, + 0x345c6834, 0xa5f451a5, 0xe534d1e5, 0xf108f9f1, + 0x7193e271, 0xd873abd8, 0x31536231, 0x153f2a15, + 0x040c0804, 0xc75295c7, 0x23654623, 0xc35e9dc3, + 0x18283018, 0x96a13796, 0x050f0a05, 0x9ab52f9a, + 0x07090e07, 0x12362412, 0x809b1b80, 0xe23ddfe2, + 0xeb26cdeb, 0x27694e27, 0xb2cd7fb2, 0x759fea75, + 0x091b1209, 0x839e1d83, 0x2c74582c, 0x1a2e341a, + 0x1b2d361b, 0x6eb2dc6e, 0x5aeeb45a, 0xa0fb5ba0, + 0x52f6a452, 0x3b4d763b, 0xd661b7d6, 0xb3ce7db3, + 0x297b5229, 0xe33edde3, 0x2f715e2f, 0x84971384, + 0x53f5a653, 0xd168b9d1, 0x00000000, 0xed2cc1ed, + 0x20604020, 0xfc1fe3fc, 0xb1c879b1, 0x5bedb65b, + 0x6abed46a, 0xcb468dcb, 0xbed967be, 0x394b7239, + 0x4ade944a, 0x4cd4984c, 0x58e8b058, 0xcf4a85cf, + 0xd06bbbd0, 0xef2ac5ef, 0xaae54faa, 0xfb16edfb, + 0x43c58643, 0x4dd79a4d, 0x33556633, 0x85941185, + 0x45cf8a45, 0xf910e9f9, 0x02060402, 0x7f81fe7f, + 0x50f0a050, 0x3c44783c, 0x9fba259f, 0xa8e34ba8, + 0x51f3a251, 0xa3fe5da3, 0x40c08040, 0x8f8a058f, + 0x92ad3f92, 0x9dbc219d, 0x38487038, 0xf504f1f5, + 0xbcdf63bc, 0xb6c177b6, 0xda75afda, 0x21634221, + 0x10302010, 0xff1ae5ff, 0xf30efdf3, 0xd26dbfd2, + 0xcd4c81cd, 0x0c14180c, 0x13352613, 0xec2fc3ec, + 0x5fe1be5f, 0x97a23597, 0x44cc8844, 0x17392e17, + 0xc45793c4, 0xa7f255a7, 0x7e82fc7e, 0x3d477a3d, + 0x64acc864, 0x5de7ba5d, 0x192b3219, 0x7395e673, + 0x60a0c060, 0x81981981, 0x4fd19e4f, 0xdc7fa3dc, + 0x22664422, 0x2a7e542a, 0x90ab3b90, 0x88830b88, + 0x46ca8c46, 0xee29c7ee, 0xb8d36bb8, 0x143c2814, + 0xde79a7de, 0x5ee2bc5e, 0x0b1d160b, 0xdb76addb, + 0xe03bdbe0, 0x32566432, 0x3a4e743a, 0x0a1e140a, + 0x49db9249, 0x060a0c06, 0x246c4824, 0x5ce4b85c, + 0xc25d9fc2, 0xd36ebdd3, 0xacef43ac, 0x62a6c462, + 0x91a83991, 0x95a43195, 0xe437d3e4, 0x798bf279, + 0xe732d5e7, 0xc8438bc8, 0x37596e37, 0x6db7da6d, + 0x8d8c018d, 0xd564b1d5, 0x4ed29c4e, 0xa9e049a9, + 0x6cb4d86c, 0x56faac56, 0xf407f3f4, 0xea25cfea, + 0x65afca65, 0x7a8ef47a, 0xaee947ae, 0x08181008, + 0xbad56fba, 0x7888f078, 0x256f4a25, 0x2e725c2e, + 0x1c24381c, 0xa6f157a6, 0xb4c773b4, 0xc65197c6, + 0xe823cbe8, 0xdd7ca1dd, 0x749ce874, 0x1f213e1f, + 0x4bdd964b, 0xbddc61bd, 0x8b860d8b, 0x8a850f8a, + 0x7090e070, 0x3e427c3e, 0xb5c471b5, 0x66aacc66, + 0x48d89048, 0x03050603, 0xf601f7f6, 0x0e121c0e, + 0x61a3c261, 0x355f6a35, 0x57f9ae57, 0xb9d069b9, + 0x86911786, 0xc15899c1, 0x1d273a1d, 0x9eb9279e, + 0xe138d9e1, 0xf813ebf8, 0x98b32b98, 0x11332211, + 0x69bbd269, 0xd970a9d9, 0x8e89078e, 0x94a73394, + 0x9bb62d9b, 0x1e223c1e, 0x87921587, 0xe920c9e9, + 0xce4987ce, 0x55ffaa55, 0x28785028, 0xdf7aa5df, + 0x8c8f038c, 0xa1f859a1, 0x89800989, 0x0d171a0d, + 0xbfda65bf, 0xe631d7e6, 0x42c68442, 0x68b8d068, + 0x41c38241, 0x99b02999, 0x2d775a2d, 0x0f111e0f, + 0xb0cb7bb0, 0x54fca854, 0xbbd66dbb, 0x163a2c16, +}; + +__device__ __constant__ u32 te3[256] = +{ + 0x6363a5c6, 0x7c7c84f8, 0x777799ee, 0x7b7b8df6, + 0xf2f20dff, 0x6b6bbdd6, 0x6f6fb1de, 0xc5c55491, + 0x30305060, 0x01010302, 0x6767a9ce, 0x2b2b7d56, + 0xfefe19e7, 0xd7d762b5, 0xababe64d, 0x76769aec, + 0xcaca458f, 0x82829d1f, 0xc9c94089, 0x7d7d87fa, + 0xfafa15ef, 0x5959ebb2, 0x4747c98e, 0xf0f00bfb, + 0xadadec41, 0xd4d467b3, 0xa2a2fd5f, 0xafafea45, + 0x9c9cbf23, 0xa4a4f753, 0x727296e4, 0xc0c05b9b, + 0xb7b7c275, 0xfdfd1ce1, 0x9393ae3d, 0x26266a4c, + 0x36365a6c, 0x3f3f417e, 0xf7f702f5, 0xcccc4f83, + 0x34345c68, 0xa5a5f451, 0xe5e534d1, 0xf1f108f9, + 0x717193e2, 0xd8d873ab, 0x31315362, 0x15153f2a, + 0x04040c08, 0xc7c75295, 0x23236546, 0xc3c35e9d, + 0x18182830, 0x9696a137, 0x05050f0a, 0x9a9ab52f, + 0x0707090e, 0x12123624, 0x80809b1b, 0xe2e23ddf, + 0xebeb26cd, 0x2727694e, 0xb2b2cd7f, 0x75759fea, + 0x09091b12, 0x83839e1d, 0x2c2c7458, 0x1a1a2e34, + 0x1b1b2d36, 0x6e6eb2dc, 0x5a5aeeb4, 0xa0a0fb5b, + 0x5252f6a4, 0x3b3b4d76, 0xd6d661b7, 0xb3b3ce7d, + 0x29297b52, 0xe3e33edd, 0x2f2f715e, 0x84849713, + 0x5353f5a6, 0xd1d168b9, 0x00000000, 0xeded2cc1, + 0x20206040, 0xfcfc1fe3, 0xb1b1c879, 0x5b5bedb6, + 0x6a6abed4, 0xcbcb468d, 0xbebed967, 0x39394b72, + 0x4a4ade94, 0x4c4cd498, 0x5858e8b0, 0xcfcf4a85, + 0xd0d06bbb, 0xefef2ac5, 0xaaaae54f, 0xfbfb16ed, + 0x4343c586, 0x4d4dd79a, 0x33335566, 0x85859411, + 0x4545cf8a, 0xf9f910e9, 0x02020604, 0x7f7f81fe, + 0x5050f0a0, 0x3c3c4478, 0x9f9fba25, 0xa8a8e34b, + 0x5151f3a2, 0xa3a3fe5d, 0x4040c080, 0x8f8f8a05, + 0x9292ad3f, 0x9d9dbc21, 0x38384870, 0xf5f504f1, + 0xbcbcdf63, 0xb6b6c177, 0xdada75af, 0x21216342, + 0x10103020, 0xffff1ae5, 0xf3f30efd, 0xd2d26dbf, + 0xcdcd4c81, 0x0c0c1418, 0x13133526, 0xecec2fc3, + 0x5f5fe1be, 0x9797a235, 0x4444cc88, 0x1717392e, + 0xc4c45793, 0xa7a7f255, 0x7e7e82fc, 0x3d3d477a, + 0x6464acc8, 0x5d5de7ba, 0x19192b32, 0x737395e6, + 0x6060a0c0, 0x81819819, 0x4f4fd19e, 0xdcdc7fa3, + 0x22226644, 0x2a2a7e54, 0x9090ab3b, 0x8888830b, + 0x4646ca8c, 0xeeee29c7, 0xb8b8d36b, 0x14143c28, + 0xdede79a7, 0x5e5ee2bc, 0x0b0b1d16, 0xdbdb76ad, + 0xe0e03bdb, 0x32325664, 0x3a3a4e74, 0x0a0a1e14, + 0x4949db92, 0x06060a0c, 0x24246c48, 0x5c5ce4b8, + 0xc2c25d9f, 0xd3d36ebd, 0xacacef43, 0x6262a6c4, + 0x9191a839, 0x9595a431, 0xe4e437d3, 0x79798bf2, + 0xe7e732d5, 0xc8c8438b, 0x3737596e, 0x6d6db7da, + 0x8d8d8c01, 0xd5d564b1, 0x4e4ed29c, 0xa9a9e049, + 0x6c6cb4d8, 0x5656faac, 0xf4f407f3, 0xeaea25cf, + 0x6565afca, 0x7a7a8ef4, 0xaeaee947, 0x08081810, + 0xbabad56f, 0x787888f0, 0x25256f4a, 0x2e2e725c, + 0x1c1c2438, 0xa6a6f157, 0xb4b4c773, 0xc6c65197, + 0xe8e823cb, 0xdddd7ca1, 0x74749ce8, 0x1f1f213e, + 0x4b4bdd96, 0xbdbddc61, 0x8b8b860d, 0x8a8a850f, + 0x707090e0, 0x3e3e427c, 0xb5b5c471, 0x6666aacc, + 0x4848d890, 0x03030506, 0xf6f601f7, 0x0e0e121c, + 0x6161a3c2, 0x35355f6a, 0x5757f9ae, 0xb9b9d069, + 0x86869117, 0xc1c15899, 0x1d1d273a, 0x9e9eb927, + 0xe1e138d9, 0xf8f813eb, 0x9898b32b, 0x11113322, + 0x6969bbd2, 0xd9d970a9, 0x8e8e8907, 0x9494a733, + 0x9b9bb62d, 0x1e1e223c, 0x87879215, 0xe9e920c9, + 0xcece4987, 0x5555ffaa, 0x28287850, 0xdfdf7aa5, + 0x8c8c8f03, 0xa1a1f859, 0x89898009, 0x0d0d171a, + 0xbfbfda65, 0xe6e631d7, 0x4242c684, 0x6868b8d0, + 0x4141c382, 0x9999b029, 0x2d2d775a, 0x0f0f111e, + 0xb0b0cb7b, 0x5454fca8, 0xbbbbd66d, 0x16163a2c, +}; + +__device__ __constant__ u32 te4[256] = +{ + 0x63636363, 0x7c7c7c7c, 0x77777777, 0x7b7b7b7b, + 0xf2f2f2f2, 0x6b6b6b6b, 0x6f6f6f6f, 0xc5c5c5c5, + 0x30303030, 0x01010101, 0x67676767, 0x2b2b2b2b, + 0xfefefefe, 0xd7d7d7d7, 0xabababab, 0x76767676, + 0xcacacaca, 0x82828282, 0xc9c9c9c9, 0x7d7d7d7d, + 0xfafafafa, 0x59595959, 0x47474747, 0xf0f0f0f0, + 0xadadadad, 0xd4d4d4d4, 0xa2a2a2a2, 0xafafafaf, + 0x9c9c9c9c, 0xa4a4a4a4, 0x72727272, 0xc0c0c0c0, + 0xb7b7b7b7, 0xfdfdfdfd, 0x93939393, 0x26262626, + 0x36363636, 0x3f3f3f3f, 0xf7f7f7f7, 0xcccccccc, + 0x34343434, 0xa5a5a5a5, 0xe5e5e5e5, 0xf1f1f1f1, + 0x71717171, 0xd8d8d8d8, 0x31313131, 0x15151515, + 0x04040404, 0xc7c7c7c7, 0x23232323, 0xc3c3c3c3, + 0x18181818, 0x96969696, 0x05050505, 0x9a9a9a9a, + 0x07070707, 0x12121212, 0x80808080, 0xe2e2e2e2, + 0xebebebeb, 0x27272727, 0xb2b2b2b2, 0x75757575, + 0x09090909, 0x83838383, 0x2c2c2c2c, 0x1a1a1a1a, + 0x1b1b1b1b, 0x6e6e6e6e, 0x5a5a5a5a, 0xa0a0a0a0, + 0x52525252, 0x3b3b3b3b, 0xd6d6d6d6, 0xb3b3b3b3, + 0x29292929, 0xe3e3e3e3, 0x2f2f2f2f, 0x84848484, + 0x53535353, 0xd1d1d1d1, 0x00000000, 0xedededed, + 0x20202020, 0xfcfcfcfc, 0xb1b1b1b1, 0x5b5b5b5b, + 0x6a6a6a6a, 0xcbcbcbcb, 0xbebebebe, 0x39393939, + 0x4a4a4a4a, 0x4c4c4c4c, 0x58585858, 0xcfcfcfcf, + 0xd0d0d0d0, 0xefefefef, 0xaaaaaaaa, 0xfbfbfbfb, + 0x43434343, 0x4d4d4d4d, 0x33333333, 0x85858585, + 0x45454545, 0xf9f9f9f9, 0x02020202, 0x7f7f7f7f, + 0x50505050, 0x3c3c3c3c, 0x9f9f9f9f, 0xa8a8a8a8, + 0x51515151, 0xa3a3a3a3, 0x40404040, 0x8f8f8f8f, + 0x92929292, 0x9d9d9d9d, 0x38383838, 0xf5f5f5f5, + 0xbcbcbcbc, 0xb6b6b6b6, 0xdadadada, 0x21212121, + 0x10101010, 0xffffffff, 0xf3f3f3f3, 0xd2d2d2d2, + 0xcdcdcdcd, 0x0c0c0c0c, 0x13131313, 0xecececec, + 0x5f5f5f5f, 0x97979797, 0x44444444, 0x17171717, + 0xc4c4c4c4, 0xa7a7a7a7, 0x7e7e7e7e, 0x3d3d3d3d, + 0x64646464, 0x5d5d5d5d, 0x19191919, 0x73737373, + 0x60606060, 0x81818181, 0x4f4f4f4f, 0xdcdcdcdc, + 0x22222222, 0x2a2a2a2a, 0x90909090, 0x88888888, + 0x46464646, 0xeeeeeeee, 0xb8b8b8b8, 0x14141414, + 0xdededede, 0x5e5e5e5e, 0x0b0b0b0b, 0xdbdbdbdb, + 0xe0e0e0e0, 0x32323232, 0x3a3a3a3a, 0x0a0a0a0a, + 0x49494949, 0x06060606, 0x24242424, 0x5c5c5c5c, + 0xc2c2c2c2, 0xd3d3d3d3, 0xacacacac, 0x62626262, + 0x91919191, 0x95959595, 0xe4e4e4e4, 0x79797979, + 0xe7e7e7e7, 0xc8c8c8c8, 0x37373737, 0x6d6d6d6d, + 0x8d8d8d8d, 0xd5d5d5d5, 0x4e4e4e4e, 0xa9a9a9a9, + 0x6c6c6c6c, 0x56565656, 0xf4f4f4f4, 0xeaeaeaea, + 0x65656565, 0x7a7a7a7a, 0xaeaeaeae, 0x08080808, + 0xbabababa, 0x78787878, 0x25252525, 0x2e2e2e2e, + 0x1c1c1c1c, 0xa6a6a6a6, 0xb4b4b4b4, 0xc6c6c6c6, + 0xe8e8e8e8, 0xdddddddd, 0x74747474, 0x1f1f1f1f, + 0x4b4b4b4b, 0xbdbdbdbd, 0x8b8b8b8b, 0x8a8a8a8a, + 0x70707070, 0x3e3e3e3e, 0xb5b5b5b5, 0x66666666, + 0x48484848, 0x03030303, 0xf6f6f6f6, 0x0e0e0e0e, + 0x61616161, 0x35353535, 0x57575757, 0xb9b9b9b9, + 0x86868686, 0xc1c1c1c1, 0x1d1d1d1d, 0x9e9e9e9e, + 0xe1e1e1e1, 0xf8f8f8f8, 0x98989898, 0x11111111, + 0x69696969, 0xd9d9d9d9, 0x8e8e8e8e, 0x94949494, + 0x9b9b9b9b, 0x1e1e1e1e, 0x87878787, 0xe9e9e9e9, + 0xcececece, 0x55555555, 0x28282828, 0xdfdfdfdf, + 0x8c8c8c8c, 0xa1a1a1a1, 0x89898989, 0x0d0d0d0d, + 0xbfbfbfbf, 0xe6e6e6e6, 0x42424242, 0x68686868, + 0x41414141, 0x99999999, 0x2d2d2d2d, 0x0f0f0f0f, + 0xb0b0b0b0, 0x54545454, 0xbbbbbbbb, 0x16161616, +}; + +__device__ __constant__ u32 td0[256] = +{ + 0x51f4a750, 0x7e416553, 0x1a17a4c3, 0x3a275e96, + 0x3bab6bcb, 0x1f9d45f1, 0xacfa58ab, 0x4be30393, + 0x2030fa55, 0xad766df6, 0x88cc7691, 0xf5024c25, + 0x4fe5d7fc, 0xc52acbd7, 0x26354480, 0xb562a38f, + 0xdeb15a49, 0x25ba1b67, 0x45ea0e98, 0x5dfec0e1, + 0xc32f7502, 0x814cf012, 0x8d4697a3, 0x6bd3f9c6, + 0x038f5fe7, 0x15929c95, 0xbf6d7aeb, 0x955259da, + 0xd4be832d, 0x587421d3, 0x49e06929, 0x8ec9c844, + 0x75c2896a, 0xf48e7978, 0x99583e6b, 0x27b971dd, + 0xbee14fb6, 0xf088ad17, 0xc920ac66, 0x7dce3ab4, + 0x63df4a18, 0xe51a3182, 0x97513360, 0x62537f45, + 0xb16477e0, 0xbb6bae84, 0xfe81a01c, 0xf9082b94, + 0x70486858, 0x8f45fd19, 0x94de6c87, 0x527bf8b7, + 0xab73d323, 0x724b02e2, 0xe31f8f57, 0x6655ab2a, + 0xb2eb2807, 0x2fb5c203, 0x86c57b9a, 0xd33708a5, + 0x302887f2, 0x23bfa5b2, 0x02036aba, 0xed16825c, + 0x8acf1c2b, 0xa779b492, 0xf307f2f0, 0x4e69e2a1, + 0x65daf4cd, 0x0605bed5, 0xd134621f, 0xc4a6fe8a, + 0x342e539d, 0xa2f355a0, 0x058ae132, 0xa4f6eb75, + 0x0b83ec39, 0x4060efaa, 0x5e719f06, 0xbd6e1051, + 0x3e218af9, 0x96dd063d, 0xdd3e05ae, 0x4de6bd46, + 0x91548db5, 0x71c45d05, 0x0406d46f, 0x605015ff, + 0x1998fb24, 0xd6bde997, 0x894043cc, 0x67d99e77, + 0xb0e842bd, 0x07898b88, 0xe7195b38, 0x79c8eedb, + 0xa17c0a47, 0x7c420fe9, 0xf8841ec9, 0x00000000, + 0x09808683, 0x322bed48, 0x1e1170ac, 0x6c5a724e, + 0xfd0efffb, 0x0f853856, 0x3daed51e, 0x362d3927, + 0x0a0fd964, 0x685ca621, 0x9b5b54d1, 0x24362e3a, + 0x0c0a67b1, 0x9357e70f, 0xb4ee96d2, 0x1b9b919e, + 0x80c0c54f, 0x61dc20a2, 0x5a774b69, 0x1c121a16, + 0xe293ba0a, 0xc0a02ae5, 0x3c22e043, 0x121b171d, + 0x0e090d0b, 0xf28bc7ad, 0x2db6a8b9, 0x141ea9c8, + 0x57f11985, 0xaf75074c, 0xee99ddbb, 0xa37f60fd, + 0xf701269f, 0x5c72f5bc, 0x44663bc5, 0x5bfb7e34, + 0x8b432976, 0xcb23c6dc, 0xb6edfc68, 0xb8e4f163, + 0xd731dcca, 0x42638510, 0x13972240, 0x84c61120, + 0x854a247d, 0xd2bb3df8, 0xaef93211, 0xc729a16d, + 0x1d9e2f4b, 0xdcb230f3, 0x0d8652ec, 0x77c1e3d0, + 0x2bb3166c, 0xa970b999, 0x119448fa, 0x47e96422, + 0xa8fc8cc4, 0xa0f03f1a, 0x567d2cd8, 0x223390ef, + 0x87494ec7, 0xd938d1c1, 0x8ccaa2fe, 0x98d40b36, + 0xa6f581cf, 0xa57ade28, 0xdab78e26, 0x3fadbfa4, + 0x2c3a9de4, 0x5078920d, 0x6a5fcc9b, 0x547e4662, + 0xf68d13c2, 0x90d8b8e8, 0x2e39f75e, 0x82c3aff5, + 0x9f5d80be, 0x69d0937c, 0x6fd52da9, 0xcf2512b3, + 0xc8ac993b, 0x10187da7, 0xe89c636e, 0xdb3bbb7b, + 0xcd267809, 0x6e5918f4, 0xec9ab701, 0x834f9aa8, + 0xe6956e65, 0xaaffe67e, 0x21bccf08, 0xef15e8e6, + 0xbae79bd9, 0x4a6f36ce, 0xea9f09d4, 0x29b07cd6, + 0x31a4b2af, 0x2a3f2331, 0xc6a59430, 0x35a266c0, + 0x744ebc37, 0xfc82caa6, 0xe090d0b0, 0x33a7d815, + 0xf104984a, 0x41ecdaf7, 0x7fcd500e, 0x1791f62f, + 0x764dd68d, 0x43efb04d, 0xccaa4d54, 0xe49604df, + 0x9ed1b5e3, 0x4c6a881b, 0xc12c1fb8, 0x4665517f, + 0x9d5eea04, 0x018c355d, 0xfa877473, 0xfb0b412e, + 0xb3671d5a, 0x92dbd252, 0xe9105633, 0x6dd64713, + 0x9ad7618c, 0x37a10c7a, 0x59f8148e, 0xeb133c89, + 0xcea927ee, 0xb761c935, 0xe11ce5ed, 0x7a47b13c, + 0x9cd2df59, 0x55f2733f, 0x1814ce79, 0x73c737bf, + 0x53f7cdea, 0x5ffdaa5b, 0xdf3d6f14, 0x7844db86, + 0xcaaff381, 0xb968c43e, 0x3824342c, 0xc2a3405f, + 0x161dc372, 0xbce2250c, 0x283c498b, 0xff0d9541, + 0x39a80171, 0x080cb3de, 0xd8b4e49c, 0x6456c190, + 0x7bcb8461, 0xd532b670, 0x486c5c74, 0xd0b85742, +}; + +__device__ __constant__ u32 td1[256] = +{ + 0x5051f4a7, 0x537e4165, 0xc31a17a4, 0x963a275e, + 0xcb3bab6b, 0xf11f9d45, 0xabacfa58, 0x934be303, + 0x552030fa, 0xf6ad766d, 0x9188cc76, 0x25f5024c, + 0xfc4fe5d7, 0xd7c52acb, 0x80263544, 0x8fb562a3, + 0x49deb15a, 0x6725ba1b, 0x9845ea0e, 0xe15dfec0, + 0x02c32f75, 0x12814cf0, 0xa38d4697, 0xc66bd3f9, + 0xe7038f5f, 0x9515929c, 0xebbf6d7a, 0xda955259, + 0x2dd4be83, 0xd3587421, 0x2949e069, 0x448ec9c8, + 0x6a75c289, 0x78f48e79, 0x6b99583e, 0xdd27b971, + 0xb6bee14f, 0x17f088ad, 0x66c920ac, 0xb47dce3a, + 0x1863df4a, 0x82e51a31, 0x60975133, 0x4562537f, + 0xe0b16477, 0x84bb6bae, 0x1cfe81a0, 0x94f9082b, + 0x58704868, 0x198f45fd, 0x8794de6c, 0xb7527bf8, + 0x23ab73d3, 0xe2724b02, 0x57e31f8f, 0x2a6655ab, + 0x07b2eb28, 0x032fb5c2, 0x9a86c57b, 0xa5d33708, + 0xf2302887, 0xb223bfa5, 0xba02036a, 0x5ced1682, + 0x2b8acf1c, 0x92a779b4, 0xf0f307f2, 0xa14e69e2, + 0xcd65daf4, 0xd50605be, 0x1fd13462, 0x8ac4a6fe, + 0x9d342e53, 0xa0a2f355, 0x32058ae1, 0x75a4f6eb, + 0x390b83ec, 0xaa4060ef, 0x065e719f, 0x51bd6e10, + 0xf93e218a, 0x3d96dd06, 0xaedd3e05, 0x464de6bd, + 0xb591548d, 0x0571c45d, 0x6f0406d4, 0xff605015, + 0x241998fb, 0x97d6bde9, 0xcc894043, 0x7767d99e, + 0xbdb0e842, 0x8807898b, 0x38e7195b, 0xdb79c8ee, + 0x47a17c0a, 0xe97c420f, 0xc9f8841e, 0x00000000, + 0x83098086, 0x48322bed, 0xac1e1170, 0x4e6c5a72, + 0xfbfd0eff, 0x560f8538, 0x1e3daed5, 0x27362d39, + 0x640a0fd9, 0x21685ca6, 0xd19b5b54, 0x3a24362e, + 0xb10c0a67, 0x0f9357e7, 0xd2b4ee96, 0x9e1b9b91, + 0x4f80c0c5, 0xa261dc20, 0x695a774b, 0x161c121a, + 0x0ae293ba, 0xe5c0a02a, 0x433c22e0, 0x1d121b17, + 0x0b0e090d, 0xadf28bc7, 0xb92db6a8, 0xc8141ea9, + 0x8557f119, 0x4caf7507, 0xbbee99dd, 0xfda37f60, + 0x9ff70126, 0xbc5c72f5, 0xc544663b, 0x345bfb7e, + 0x768b4329, 0xdccb23c6, 0x68b6edfc, 0x63b8e4f1, + 0xcad731dc, 0x10426385, 0x40139722, 0x2084c611, + 0x7d854a24, 0xf8d2bb3d, 0x11aef932, 0x6dc729a1, + 0x4b1d9e2f, 0xf3dcb230, 0xec0d8652, 0xd077c1e3, + 0x6c2bb316, 0x99a970b9, 0xfa119448, 0x2247e964, + 0xc4a8fc8c, 0x1aa0f03f, 0xd8567d2c, 0xef223390, + 0xc787494e, 0xc1d938d1, 0xfe8ccaa2, 0x3698d40b, + 0xcfa6f581, 0x28a57ade, 0x26dab78e, 0xa43fadbf, + 0xe42c3a9d, 0x0d507892, 0x9b6a5fcc, 0x62547e46, + 0xc2f68d13, 0xe890d8b8, 0x5e2e39f7, 0xf582c3af, + 0xbe9f5d80, 0x7c69d093, 0xa96fd52d, 0xb3cf2512, + 0x3bc8ac99, 0xa710187d, 0x6ee89c63, 0x7bdb3bbb, + 0x09cd2678, 0xf46e5918, 0x01ec9ab7, 0xa8834f9a, + 0x65e6956e, 0x7eaaffe6, 0x0821bccf, 0xe6ef15e8, + 0xd9bae79b, 0xce4a6f36, 0xd4ea9f09, 0xd629b07c, + 0xaf31a4b2, 0x312a3f23, 0x30c6a594, 0xc035a266, + 0x37744ebc, 0xa6fc82ca, 0xb0e090d0, 0x1533a7d8, + 0x4af10498, 0xf741ecda, 0x0e7fcd50, 0x2f1791f6, + 0x8d764dd6, 0x4d43efb0, 0x54ccaa4d, 0xdfe49604, + 0xe39ed1b5, 0x1b4c6a88, 0xb8c12c1f, 0x7f466551, + 0x049d5eea, 0x5d018c35, 0x73fa8774, 0x2efb0b41, + 0x5ab3671d, 0x5292dbd2, 0x33e91056, 0x136dd647, + 0x8c9ad761, 0x7a37a10c, 0x8e59f814, 0x89eb133c, + 0xeecea927, 0x35b761c9, 0xede11ce5, 0x3c7a47b1, + 0x599cd2df, 0x3f55f273, 0x791814ce, 0xbf73c737, + 0xea53f7cd, 0x5b5ffdaa, 0x14df3d6f, 0x867844db, + 0x81caaff3, 0x3eb968c4, 0x2c382434, 0x5fc2a340, + 0x72161dc3, 0x0cbce225, 0x8b283c49, 0x41ff0d95, + 0x7139a801, 0xde080cb3, 0x9cd8b4e4, 0x906456c1, + 0x617bcb84, 0x70d532b6, 0x74486c5c, 0x42d0b857, +}; + +__device__ __constant__ u32 td2[256] = +{ + 0xa75051f4, 0x65537e41, 0xa4c31a17, 0x5e963a27, + 0x6bcb3bab, 0x45f11f9d, 0x58abacfa, 0x03934be3, + 0xfa552030, 0x6df6ad76, 0x769188cc, 0x4c25f502, + 0xd7fc4fe5, 0xcbd7c52a, 0x44802635, 0xa38fb562, + 0x5a49deb1, 0x1b6725ba, 0x0e9845ea, 0xc0e15dfe, + 0x7502c32f, 0xf012814c, 0x97a38d46, 0xf9c66bd3, + 0x5fe7038f, 0x9c951592, 0x7aebbf6d, 0x59da9552, + 0x832dd4be, 0x21d35874, 0x692949e0, 0xc8448ec9, + 0x896a75c2, 0x7978f48e, 0x3e6b9958, 0x71dd27b9, + 0x4fb6bee1, 0xad17f088, 0xac66c920, 0x3ab47dce, + 0x4a1863df, 0x3182e51a, 0x33609751, 0x7f456253, + 0x77e0b164, 0xae84bb6b, 0xa01cfe81, 0x2b94f908, + 0x68587048, 0xfd198f45, 0x6c8794de, 0xf8b7527b, + 0xd323ab73, 0x02e2724b, 0x8f57e31f, 0xab2a6655, + 0x2807b2eb, 0xc2032fb5, 0x7b9a86c5, 0x08a5d337, + 0x87f23028, 0xa5b223bf, 0x6aba0203, 0x825ced16, + 0x1c2b8acf, 0xb492a779, 0xf2f0f307, 0xe2a14e69, + 0xf4cd65da, 0xbed50605, 0x621fd134, 0xfe8ac4a6, + 0x539d342e, 0x55a0a2f3, 0xe132058a, 0xeb75a4f6, + 0xec390b83, 0xefaa4060, 0x9f065e71, 0x1051bd6e, + 0x8af93e21, 0x063d96dd, 0x05aedd3e, 0xbd464de6, + 0x8db59154, 0x5d0571c4, 0xd46f0406, 0x15ff6050, + 0xfb241998, 0xe997d6bd, 0x43cc8940, 0x9e7767d9, + 0x42bdb0e8, 0x8b880789, 0x5b38e719, 0xeedb79c8, + 0x0a47a17c, 0x0fe97c42, 0x1ec9f884, 0x00000000, + 0x86830980, 0xed48322b, 0x70ac1e11, 0x724e6c5a, + 0xfffbfd0e, 0x38560f85, 0xd51e3dae, 0x3927362d, + 0xd9640a0f, 0xa621685c, 0x54d19b5b, 0x2e3a2436, + 0x67b10c0a, 0xe70f9357, 0x96d2b4ee, 0x919e1b9b, + 0xc54f80c0, 0x20a261dc, 0x4b695a77, 0x1a161c12, + 0xba0ae293, 0x2ae5c0a0, 0xe0433c22, 0x171d121b, + 0x0d0b0e09, 0xc7adf28b, 0xa8b92db6, 0xa9c8141e, + 0x198557f1, 0x074caf75, 0xddbbee99, 0x60fda37f, + 0x269ff701, 0xf5bc5c72, 0x3bc54466, 0x7e345bfb, + 0x29768b43, 0xc6dccb23, 0xfc68b6ed, 0xf163b8e4, + 0xdccad731, 0x85104263, 0x22401397, 0x112084c6, + 0x247d854a, 0x3df8d2bb, 0x3211aef9, 0xa16dc729, + 0x2f4b1d9e, 0x30f3dcb2, 0x52ec0d86, 0xe3d077c1, + 0x166c2bb3, 0xb999a970, 0x48fa1194, 0x642247e9, + 0x8cc4a8fc, 0x3f1aa0f0, 0x2cd8567d, 0x90ef2233, + 0x4ec78749, 0xd1c1d938, 0xa2fe8cca, 0x0b3698d4, + 0x81cfa6f5, 0xde28a57a, 0x8e26dab7, 0xbfa43fad, + 0x9de42c3a, 0x920d5078, 0xcc9b6a5f, 0x4662547e, + 0x13c2f68d, 0xb8e890d8, 0xf75e2e39, 0xaff582c3, + 0x80be9f5d, 0x937c69d0, 0x2da96fd5, 0x12b3cf25, + 0x993bc8ac, 0x7da71018, 0x636ee89c, 0xbb7bdb3b, + 0x7809cd26, 0x18f46e59, 0xb701ec9a, 0x9aa8834f, + 0x6e65e695, 0xe67eaaff, 0xcf0821bc, 0xe8e6ef15, + 0x9bd9bae7, 0x36ce4a6f, 0x09d4ea9f, 0x7cd629b0, + 0xb2af31a4, 0x23312a3f, 0x9430c6a5, 0x66c035a2, + 0xbc37744e, 0xcaa6fc82, 0xd0b0e090, 0xd81533a7, + 0x984af104, 0xdaf741ec, 0x500e7fcd, 0xf62f1791, + 0xd68d764d, 0xb04d43ef, 0x4d54ccaa, 0x04dfe496, + 0xb5e39ed1, 0x881b4c6a, 0x1fb8c12c, 0x517f4665, + 0xea049d5e, 0x355d018c, 0x7473fa87, 0x412efb0b, + 0x1d5ab367, 0xd25292db, 0x5633e910, 0x47136dd6, + 0x618c9ad7, 0x0c7a37a1, 0x148e59f8, 0x3c89eb13, + 0x27eecea9, 0xc935b761, 0xe5ede11c, 0xb13c7a47, + 0xdf599cd2, 0x733f55f2, 0xce791814, 0x37bf73c7, + 0xcdea53f7, 0xaa5b5ffd, 0x6f14df3d, 0xdb867844, + 0xf381caaf, 0xc43eb968, 0x342c3824, 0x405fc2a3, + 0xc372161d, 0x250cbce2, 0x498b283c, 0x9541ff0d, + 0x017139a8, 0xb3de080c, 0xe49cd8b4, 0xc1906456, + 0x84617bcb, 0xb670d532, 0x5c74486c, 0x5742d0b8, +}; + +__device__ __constant__ u32 td3[256] = +{ + 0xf4a75051, 0x4165537e, 0x17a4c31a, 0x275e963a, + 0xab6bcb3b, 0x9d45f11f, 0xfa58abac, 0xe303934b, + 0x30fa5520, 0x766df6ad, 0xcc769188, 0x024c25f5, + 0xe5d7fc4f, 0x2acbd7c5, 0x35448026, 0x62a38fb5, + 0xb15a49de, 0xba1b6725, 0xea0e9845, 0xfec0e15d, + 0x2f7502c3, 0x4cf01281, 0x4697a38d, 0xd3f9c66b, + 0x8f5fe703, 0x929c9515, 0x6d7aebbf, 0x5259da95, + 0xbe832dd4, 0x7421d358, 0xe0692949, 0xc9c8448e, + 0xc2896a75, 0x8e7978f4, 0x583e6b99, 0xb971dd27, + 0xe14fb6be, 0x88ad17f0, 0x20ac66c9, 0xce3ab47d, + 0xdf4a1863, 0x1a3182e5, 0x51336097, 0x537f4562, + 0x6477e0b1, 0x6bae84bb, 0x81a01cfe, 0x082b94f9, + 0x48685870, 0x45fd198f, 0xde6c8794, 0x7bf8b752, + 0x73d323ab, 0x4b02e272, 0x1f8f57e3, 0x55ab2a66, + 0xeb2807b2, 0xb5c2032f, 0xc57b9a86, 0x3708a5d3, + 0x2887f230, 0xbfa5b223, 0x036aba02, 0x16825ced, + 0xcf1c2b8a, 0x79b492a7, 0x07f2f0f3, 0x69e2a14e, + 0xdaf4cd65, 0x05bed506, 0x34621fd1, 0xa6fe8ac4, + 0x2e539d34, 0xf355a0a2, 0x8ae13205, 0xf6eb75a4, + 0x83ec390b, 0x60efaa40, 0x719f065e, 0x6e1051bd, + 0x218af93e, 0xdd063d96, 0x3e05aedd, 0xe6bd464d, + 0x548db591, 0xc45d0571, 0x06d46f04, 0x5015ff60, + 0x98fb2419, 0xbde997d6, 0x4043cc89, 0xd99e7767, + 0xe842bdb0, 0x898b8807, 0x195b38e7, 0xc8eedb79, + 0x7c0a47a1, 0x420fe97c, 0x841ec9f8, 0x00000000, + 0x80868309, 0x2bed4832, 0x1170ac1e, 0x5a724e6c, + 0x0efffbfd, 0x8538560f, 0xaed51e3d, 0x2d392736, + 0x0fd9640a, 0x5ca62168, 0x5b54d19b, 0x362e3a24, + 0x0a67b10c, 0x57e70f93, 0xee96d2b4, 0x9b919e1b, + 0xc0c54f80, 0xdc20a261, 0x774b695a, 0x121a161c, + 0x93ba0ae2, 0xa02ae5c0, 0x22e0433c, 0x1b171d12, + 0x090d0b0e, 0x8bc7adf2, 0xb6a8b92d, 0x1ea9c814, + 0xf1198557, 0x75074caf, 0x99ddbbee, 0x7f60fda3, + 0x01269ff7, 0x72f5bc5c, 0x663bc544, 0xfb7e345b, + 0x4329768b, 0x23c6dccb, 0xedfc68b6, 0xe4f163b8, + 0x31dccad7, 0x63851042, 0x97224013, 0xc6112084, + 0x4a247d85, 0xbb3df8d2, 0xf93211ae, 0x29a16dc7, + 0x9e2f4b1d, 0xb230f3dc, 0x8652ec0d, 0xc1e3d077, + 0xb3166c2b, 0x70b999a9, 0x9448fa11, 0xe9642247, + 0xfc8cc4a8, 0xf03f1aa0, 0x7d2cd856, 0x3390ef22, + 0x494ec787, 0x38d1c1d9, 0xcaa2fe8c, 0xd40b3698, + 0xf581cfa6, 0x7ade28a5, 0xb78e26da, 0xadbfa43f, + 0x3a9de42c, 0x78920d50, 0x5fcc9b6a, 0x7e466254, + 0x8d13c2f6, 0xd8b8e890, 0x39f75e2e, 0xc3aff582, + 0x5d80be9f, 0xd0937c69, 0xd52da96f, 0x2512b3cf, + 0xac993bc8, 0x187da710, 0x9c636ee8, 0x3bbb7bdb, + 0x267809cd, 0x5918f46e, 0x9ab701ec, 0x4f9aa883, + 0x956e65e6, 0xffe67eaa, 0xbccf0821, 0x15e8e6ef, + 0xe79bd9ba, 0x6f36ce4a, 0x9f09d4ea, 0xb07cd629, + 0xa4b2af31, 0x3f23312a, 0xa59430c6, 0xa266c035, + 0x4ebc3774, 0x82caa6fc, 0x90d0b0e0, 0xa7d81533, + 0x04984af1, 0xecdaf741, 0xcd500e7f, 0x91f62f17, + 0x4dd68d76, 0xefb04d43, 0xaa4d54cc, 0x9604dfe4, + 0xd1b5e39e, 0x6a881b4c, 0x2c1fb8c1, 0x65517f46, + 0x5eea049d, 0x8c355d01, 0x877473fa, 0x0b412efb, + 0x671d5ab3, 0xdbd25292, 0x105633e9, 0xd647136d, + 0xd7618c9a, 0xa10c7a37, 0xf8148e59, 0x133c89eb, + 0xa927eece, 0x61c935b7, 0x1ce5ede1, 0x47b13c7a, + 0xd2df599c, 0xf2733f55, 0x14ce7918, 0xc737bf73, + 0xf7cdea53, 0xfdaa5b5f, 0x3d6f14df, 0x44db8678, + 0xaff381ca, 0x68c43eb9, 0x24342c38, 0xa3405fc2, + 0x1dc37216, 0xe2250cbc, 0x3c498b28, 0x0d9541ff, + 0xa8017139, 0x0cb3de08, 0xb4e49cd8, 0x56c19064, + 0xcb84617b, 0x32b670d5, 0x6c5c7448, 0xb85742d0, +}; + +__device__ __constant__ u32 td4[256] = +{ + 0x52525252, 0x09090909, 0x6a6a6a6a, 0xd5d5d5d5, + 0x30303030, 0x36363636, 0xa5a5a5a5, 0x38383838, + 0xbfbfbfbf, 0x40404040, 0xa3a3a3a3, 0x9e9e9e9e, + 0x81818181, 0xf3f3f3f3, 0xd7d7d7d7, 0xfbfbfbfb, + 0x7c7c7c7c, 0xe3e3e3e3, 0x39393939, 0x82828282, + 0x9b9b9b9b, 0x2f2f2f2f, 0xffffffff, 0x87878787, + 0x34343434, 0x8e8e8e8e, 0x43434343, 0x44444444, + 0xc4c4c4c4, 0xdededede, 0xe9e9e9e9, 0xcbcbcbcb, + 0x54545454, 0x7b7b7b7b, 0x94949494, 0x32323232, + 0xa6a6a6a6, 0xc2c2c2c2, 0x23232323, 0x3d3d3d3d, + 0xeeeeeeee, 0x4c4c4c4c, 0x95959595, 0x0b0b0b0b, + 0x42424242, 0xfafafafa, 0xc3c3c3c3, 0x4e4e4e4e, + 0x08080808, 0x2e2e2e2e, 0xa1a1a1a1, 0x66666666, + 0x28282828, 0xd9d9d9d9, 0x24242424, 0xb2b2b2b2, + 0x76767676, 0x5b5b5b5b, 0xa2a2a2a2, 0x49494949, + 0x6d6d6d6d, 0x8b8b8b8b, 0xd1d1d1d1, 0x25252525, + 0x72727272, 0xf8f8f8f8, 0xf6f6f6f6, 0x64646464, + 0x86868686, 0x68686868, 0x98989898, 0x16161616, + 0xd4d4d4d4, 0xa4a4a4a4, 0x5c5c5c5c, 0xcccccccc, + 0x5d5d5d5d, 0x65656565, 0xb6b6b6b6, 0x92929292, + 0x6c6c6c6c, 0x70707070, 0x48484848, 0x50505050, + 0xfdfdfdfd, 0xedededed, 0xb9b9b9b9, 0xdadadada, + 0x5e5e5e5e, 0x15151515, 0x46464646, 0x57575757, + 0xa7a7a7a7, 0x8d8d8d8d, 0x9d9d9d9d, 0x84848484, + 0x90909090, 0xd8d8d8d8, 0xabababab, 0x00000000, + 0x8c8c8c8c, 0xbcbcbcbc, 0xd3d3d3d3, 0x0a0a0a0a, + 0xf7f7f7f7, 0xe4e4e4e4, 0x58585858, 0x05050505, + 0xb8b8b8b8, 0xb3b3b3b3, 0x45454545, 0x06060606, + 0xd0d0d0d0, 0x2c2c2c2c, 0x1e1e1e1e, 0x8f8f8f8f, + 0xcacacaca, 0x3f3f3f3f, 0x0f0f0f0f, 0x02020202, + 0xc1c1c1c1, 0xafafafaf, 0xbdbdbdbd, 0x03030303, + 0x01010101, 0x13131313, 0x8a8a8a8a, 0x6b6b6b6b, + 0x3a3a3a3a, 0x91919191, 0x11111111, 0x41414141, + 0x4f4f4f4f, 0x67676767, 0xdcdcdcdc, 0xeaeaeaea, + 0x97979797, 0xf2f2f2f2, 0xcfcfcfcf, 0xcececece, + 0xf0f0f0f0, 0xb4b4b4b4, 0xe6e6e6e6, 0x73737373, + 0x96969696, 0xacacacac, 0x74747474, 0x22222222, + 0xe7e7e7e7, 0xadadadad, 0x35353535, 0x85858585, + 0xe2e2e2e2, 0xf9f9f9f9, 0x37373737, 0xe8e8e8e8, + 0x1c1c1c1c, 0x75757575, 0xdfdfdfdf, 0x6e6e6e6e, + 0x47474747, 0xf1f1f1f1, 0x1a1a1a1a, 0x71717171, + 0x1d1d1d1d, 0x29292929, 0xc5c5c5c5, 0x89898989, + 0x6f6f6f6f, 0xb7b7b7b7, 0x62626262, 0x0e0e0e0e, + 0xaaaaaaaa, 0x18181818, 0xbebebebe, 0x1b1b1b1b, + 0xfcfcfcfc, 0x56565656, 0x3e3e3e3e, 0x4b4b4b4b, + 0xc6c6c6c6, 0xd2d2d2d2, 0x79797979, 0x20202020, + 0x9a9a9a9a, 0xdbdbdbdb, 0xc0c0c0c0, 0xfefefefe, + 0x78787878, 0xcdcdcdcd, 0x5a5a5a5a, 0xf4f4f4f4, + 0x1f1f1f1f, 0xdddddddd, 0xa8a8a8a8, 0x33333333, + 0x88888888, 0x07070707, 0xc7c7c7c7, 0x31313131, + 0xb1b1b1b1, 0x12121212, 0x10101010, 0x59595959, + 0x27272727, 0x80808080, 0xecececec, 0x5f5f5f5f, + 0x60606060, 0x51515151, 0x7f7f7f7f, 0xa9a9a9a9, + 0x19191919, 0xb5b5b5b5, 0x4a4a4a4a, 0x0d0d0d0d, + 0x2d2d2d2d, 0xe5e5e5e5, 0x7a7a7a7a, 0x9f9f9f9f, + 0x93939393, 0xc9c9c9c9, 0x9c9c9c9c, 0xefefefef, + 0xa0a0a0a0, 0xe0e0e0e0, 0x3b3b3b3b, 0x4d4d4d4d, + 0xaeaeaeae, 0x2a2a2a2a, 0xf5f5f5f5, 0xb0b0b0b0, + 0xc8c8c8c8, 0xebebebeb, 0xbbbbbbbb, 0x3c3c3c3c, + 0x83838383, 0x53535353, 0x99999999, 0x61616161, + 0x17171717, 0x2b2b2b2b, 0x04040404, 0x7e7e7e7e, + 0xbabababa, 0x77777777, 0xd6d6d6d6, 0x26262626, + 0xe1e1e1e1, 0x69696969, 0x14141414, 0x63636363, + 0x55555555, 0x21212121, 0x0c0c0c0c, 0x7d7d7d7d, +}; + +__device__ __constant__ u32 rcon[] = +{ + 0x01000000, 0x02000000, 0x04000000, 0x08000000, + 0x10000000, 0x20000000, 0x40000000, 0x80000000, + 0x1b000000, 0x36000000, +}; + +__device__ static void AES256_ExpandKey (u32 *userkey, u32 *rek, u32 s_te0[256], u32 s_te1[256], u32 s_te2[256], u32 s_te3[256], u32 s_te4[256]) +{ + rek[0] = userkey[0]; + rek[1] = userkey[1]; + rek[2] = userkey[2]; + rek[3] = userkey[3]; + rek[4] = userkey[4]; + rek[5] = userkey[5]; + rek[6] = userkey[6]; + rek[7] = userkey[7]; + + int i; + int j; + + i = 0; + j = 0; + + u32 run = 1; + + while (run) + { + u32 temp = rek[j + 7]; + + rek[j + 8] = rek[j + 0] + ^ (s_te2[(temp >> 16) & 0xff] & 0xff000000) + ^ (s_te3[(temp >> 8) & 0xff] & 0x00ff0000) + ^ (s_te0[(temp >> 0) & 0xff] & 0x0000ff00) + ^ (s_te1[(temp >> 24) & 0xff] & 0x000000ff) + ^ rcon[i]; + + rek[j + 9] = rek[j + 1] ^ rek[j + 8]; + rek[j + 10] = rek[j + 2] ^ rek[j + 9]; + rek[j + 11] = rek[j + 3] ^ rek[j + 10]; + + if (++i == 7) + { + run = 0; + continue; + } + + temp = rek[j + 11]; + + rek[j + 12] = rek[j + 4] + ^ (s_te2[(temp >> 24) & 0xff] & 0xff000000) + ^ (s_te3[(temp >> 16) & 0xff] & 0x00ff0000) + ^ (s_te0[(temp >> 8) & 0xff] & 0x0000ff00) + ^ (s_te1[(temp >> 0) & 0xff] & 0x000000ff); + + rek[j + 13] = rek[j + 5] ^ rek[j + 12]; + rek[j + 14] = rek[j + 6] ^ rek[j + 13]; + rek[j + 15] = rek[j + 7] ^ rek[j + 14]; + + j += 8; + } +} + +__device__ static void AES256_InvertKey (u32 *rdk, u32 s_td0[256], u32 s_td1[256], u32 s_td2[256], u32 s_td3[256], u32 s_td4[256], u32 s_te0[256], u32 s_te1[256], u32 s_te2[256], u32 s_te3[256], u32 s_te4[256]) +{ + for (u32 i = 0, j = 56; i < j; i += 4, j -= 4) + { + u32 temp; + + temp = rdk[i + 0]; rdk[i + 0] = rdk[j + 0]; rdk[j + 0] = temp; + temp = rdk[i + 1]; rdk[i + 1] = rdk[j + 1]; rdk[j + 1] = temp; + temp = rdk[i + 2]; rdk[i + 2] = rdk[j + 2]; rdk[j + 2] = temp; + temp = rdk[i + 3]; rdk[i + 3] = rdk[j + 3]; rdk[j + 3] = temp; + } + + for (u32 i = 1, j = 4; i < 14; i += 1, j += 4) + { + rdk[j + 0] = + s_td0[s_te1[(rdk[j + 0] >> 24) & 0xff] & 0xff] ^ + s_td1[s_te1[(rdk[j + 0] >> 16) & 0xff] & 0xff] ^ + s_td2[s_te1[(rdk[j + 0] >> 8) & 0xff] & 0xff] ^ + s_td3[s_te1[(rdk[j + 0] >> 0) & 0xff] & 0xff]; + + rdk[j + 1] = + s_td0[s_te1[(rdk[j + 1] >> 24) & 0xff] & 0xff] ^ + s_td1[s_te1[(rdk[j + 1] >> 16) & 0xff] & 0xff] ^ + s_td2[s_te1[(rdk[j + 1] >> 8) & 0xff] & 0xff] ^ + s_td3[s_te1[(rdk[j + 1] >> 0) & 0xff] & 0xff]; + + rdk[j + 2] = + s_td0[s_te1[(rdk[j + 2] >> 24) & 0xff] & 0xff] ^ + s_td1[s_te1[(rdk[j + 2] >> 16) & 0xff] & 0xff] ^ + s_td2[s_te1[(rdk[j + 2] >> 8) & 0xff] & 0xff] ^ + s_td3[s_te1[(rdk[j + 2] >> 0) & 0xff] & 0xff]; + + rdk[j + 3] = + s_td0[s_te1[(rdk[j + 3] >> 24) & 0xff] & 0xff] ^ + s_td1[s_te1[(rdk[j + 3] >> 16) & 0xff] & 0xff] ^ + s_td2[s_te1[(rdk[j + 3] >> 8) & 0xff] & 0xff] ^ + s_td3[s_te1[(rdk[j + 3] >> 0) & 0xff] & 0xff]; + } +} + +__device__ static void AES256_decrypt (const u32 *in, u32 *out, const u32 *rdk, u32 s_td0[256], u32 s_td1[256], u32 s_td2[256], u32 s_td3[256], u32 s_td4[256]) +{ + u32 s0 = in[0] ^ rdk[0]; + u32 s1 = in[1] ^ rdk[1]; + u32 s2 = in[2] ^ rdk[2]; + u32 s3 = in[3] ^ rdk[3]; + + u32 t0; + u32 t1; + u32 t2; + u32 t3; + + t0 = s_td0[s0 >> 24] ^ s_td1[(s3 >> 16) & 0xff] ^ s_td2[(s2 >> 8) & 0xff] ^ s_td3[s1 & 0xff] ^ rdk[ 4]; + t1 = s_td0[s1 >> 24] ^ s_td1[(s0 >> 16) & 0xff] ^ s_td2[(s3 >> 8) & 0xff] ^ s_td3[s2 & 0xff] ^ rdk[ 5]; + t2 = s_td0[s2 >> 24] ^ s_td1[(s1 >> 16) & 0xff] ^ s_td2[(s0 >> 8) & 0xff] ^ s_td3[s3 & 0xff] ^ rdk[ 6]; + t3 = s_td0[s3 >> 24] ^ s_td1[(s2 >> 16) & 0xff] ^ s_td2[(s1 >> 8) & 0xff] ^ s_td3[s0 & 0xff] ^ rdk[ 7]; + s0 = s_td0[t0 >> 24] ^ s_td1[(t3 >> 16) & 0xff] ^ s_td2[(t2 >> 8) & 0xff] ^ s_td3[t1 & 0xff] ^ rdk[ 8]; + s1 = s_td0[t1 >> 24] ^ s_td1[(t0 >> 16) & 0xff] ^ s_td2[(t3 >> 8) & 0xff] ^ s_td3[t2 & 0xff] ^ rdk[ 9]; + s2 = s_td0[t2 >> 24] ^ s_td1[(t1 >> 16) & 0xff] ^ s_td2[(t0 >> 8) & 0xff] ^ s_td3[t3 & 0xff] ^ rdk[10]; + s3 = s_td0[t3 >> 24] ^ s_td1[(t2 >> 16) & 0xff] ^ s_td2[(t1 >> 8) & 0xff] ^ s_td3[t0 & 0xff] ^ rdk[11]; + t0 = s_td0[s0 >> 24] ^ s_td1[(s3 >> 16) & 0xff] ^ s_td2[(s2 >> 8) & 0xff] ^ s_td3[s1 & 0xff] ^ rdk[12]; + t1 = s_td0[s1 >> 24] ^ s_td1[(s0 >> 16) & 0xff] ^ s_td2[(s3 >> 8) & 0xff] ^ s_td3[s2 & 0xff] ^ rdk[13]; + t2 = s_td0[s2 >> 24] ^ s_td1[(s1 >> 16) & 0xff] ^ s_td2[(s0 >> 8) & 0xff] ^ s_td3[s3 & 0xff] ^ rdk[14]; + t3 = s_td0[s3 >> 24] ^ s_td1[(s2 >> 16) & 0xff] ^ s_td2[(s1 >> 8) & 0xff] ^ s_td3[s0 & 0xff] ^ rdk[15]; + s0 = s_td0[t0 >> 24] ^ s_td1[(t3 >> 16) & 0xff] ^ s_td2[(t2 >> 8) & 0xff] ^ s_td3[t1 & 0xff] ^ rdk[16]; + s1 = s_td0[t1 >> 24] ^ s_td1[(t0 >> 16) & 0xff] ^ s_td2[(t3 >> 8) & 0xff] ^ s_td3[t2 & 0xff] ^ rdk[17]; + s2 = s_td0[t2 >> 24] ^ s_td1[(t1 >> 16) & 0xff] ^ s_td2[(t0 >> 8) & 0xff] ^ s_td3[t3 & 0xff] ^ rdk[18]; + s3 = s_td0[t3 >> 24] ^ s_td1[(t2 >> 16) & 0xff] ^ s_td2[(t1 >> 8) & 0xff] ^ s_td3[t0 & 0xff] ^ rdk[19]; + t0 = s_td0[s0 >> 24] ^ s_td1[(s3 >> 16) & 0xff] ^ s_td2[(s2 >> 8) & 0xff] ^ s_td3[s1 & 0xff] ^ rdk[20]; + t1 = s_td0[s1 >> 24] ^ s_td1[(s0 >> 16) & 0xff] ^ s_td2[(s3 >> 8) & 0xff] ^ s_td3[s2 & 0xff] ^ rdk[21]; + t2 = s_td0[s2 >> 24] ^ s_td1[(s1 >> 16) & 0xff] ^ s_td2[(s0 >> 8) & 0xff] ^ s_td3[s3 & 0xff] ^ rdk[22]; + t3 = s_td0[s3 >> 24] ^ s_td1[(s2 >> 16) & 0xff] ^ s_td2[(s1 >> 8) & 0xff] ^ s_td3[s0 & 0xff] ^ rdk[23]; + s0 = s_td0[t0 >> 24] ^ s_td1[(t3 >> 16) & 0xff] ^ s_td2[(t2 >> 8) & 0xff] ^ s_td3[t1 & 0xff] ^ rdk[24]; + s1 = s_td0[t1 >> 24] ^ s_td1[(t0 >> 16) & 0xff] ^ s_td2[(t3 >> 8) & 0xff] ^ s_td3[t2 & 0xff] ^ rdk[25]; + s2 = s_td0[t2 >> 24] ^ s_td1[(t1 >> 16) & 0xff] ^ s_td2[(t0 >> 8) & 0xff] ^ s_td3[t3 & 0xff] ^ rdk[26]; + s3 = s_td0[t3 >> 24] ^ s_td1[(t2 >> 16) & 0xff] ^ s_td2[(t1 >> 8) & 0xff] ^ s_td3[t0 & 0xff] ^ rdk[27]; + t0 = s_td0[s0 >> 24] ^ s_td1[(s3 >> 16) & 0xff] ^ s_td2[(s2 >> 8) & 0xff] ^ s_td3[s1 & 0xff] ^ rdk[28]; + t1 = s_td0[s1 >> 24] ^ s_td1[(s0 >> 16) & 0xff] ^ s_td2[(s3 >> 8) & 0xff] ^ s_td3[s2 & 0xff] ^ rdk[29]; + t2 = s_td0[s2 >> 24] ^ s_td1[(s1 >> 16) & 0xff] ^ s_td2[(s0 >> 8) & 0xff] ^ s_td3[s3 & 0xff] ^ rdk[30]; + t3 = s_td0[s3 >> 24] ^ s_td1[(s2 >> 16) & 0xff] ^ s_td2[(s1 >> 8) & 0xff] ^ s_td3[s0 & 0xff] ^ rdk[31]; + s0 = s_td0[t0 >> 24] ^ s_td1[(t3 >> 16) & 0xff] ^ s_td2[(t2 >> 8) & 0xff] ^ s_td3[t1 & 0xff] ^ rdk[32]; + s1 = s_td0[t1 >> 24] ^ s_td1[(t0 >> 16) & 0xff] ^ s_td2[(t3 >> 8) & 0xff] ^ s_td3[t2 & 0xff] ^ rdk[33]; + s2 = s_td0[t2 >> 24] ^ s_td1[(t1 >> 16) & 0xff] ^ s_td2[(t0 >> 8) & 0xff] ^ s_td3[t3 & 0xff] ^ rdk[34]; + s3 = s_td0[t3 >> 24] ^ s_td1[(t2 >> 16) & 0xff] ^ s_td2[(t1 >> 8) & 0xff] ^ s_td3[t0 & 0xff] ^ rdk[35]; + t0 = s_td0[s0 >> 24] ^ s_td1[(s3 >> 16) & 0xff] ^ s_td2[(s2 >> 8) & 0xff] ^ s_td3[s1 & 0xff] ^ rdk[36]; + t1 = s_td0[s1 >> 24] ^ s_td1[(s0 >> 16) & 0xff] ^ s_td2[(s3 >> 8) & 0xff] ^ s_td3[s2 & 0xff] ^ rdk[37]; + t2 = s_td0[s2 >> 24] ^ s_td1[(s1 >> 16) & 0xff] ^ s_td2[(s0 >> 8) & 0xff] ^ s_td3[s3 & 0xff] ^ rdk[38]; + t3 = s_td0[s3 >> 24] ^ s_td1[(s2 >> 16) & 0xff] ^ s_td2[(s1 >> 8) & 0xff] ^ s_td3[s0 & 0xff] ^ rdk[39]; + s0 = s_td0[t0 >> 24] ^ s_td1[(t3 >> 16) & 0xff] ^ s_td2[(t2 >> 8) & 0xff] ^ s_td3[t1 & 0xff] ^ rdk[40]; + s1 = s_td0[t1 >> 24] ^ s_td1[(t0 >> 16) & 0xff] ^ s_td2[(t3 >> 8) & 0xff] ^ s_td3[t2 & 0xff] ^ rdk[41]; + s2 = s_td0[t2 >> 24] ^ s_td1[(t1 >> 16) & 0xff] ^ s_td2[(t0 >> 8) & 0xff] ^ s_td3[t3 & 0xff] ^ rdk[42]; + s3 = s_td0[t3 >> 24] ^ s_td1[(t2 >> 16) & 0xff] ^ s_td2[(t1 >> 8) & 0xff] ^ s_td3[t0 & 0xff] ^ rdk[43]; + t0 = s_td0[s0 >> 24] ^ s_td1[(s3 >> 16) & 0xff] ^ s_td2[(s2 >> 8) & 0xff] ^ s_td3[s1 & 0xff] ^ rdk[44]; + t1 = s_td0[s1 >> 24] ^ s_td1[(s0 >> 16) & 0xff] ^ s_td2[(s3 >> 8) & 0xff] ^ s_td3[s2 & 0xff] ^ rdk[45]; + t2 = s_td0[s2 >> 24] ^ s_td1[(s1 >> 16) & 0xff] ^ s_td2[(s0 >> 8) & 0xff] ^ s_td3[s3 & 0xff] ^ rdk[46]; + t3 = s_td0[s3 >> 24] ^ s_td1[(s2 >> 16) & 0xff] ^ s_td2[(s1 >> 8) & 0xff] ^ s_td3[s0 & 0xff] ^ rdk[47]; + s0 = s_td0[t0 >> 24] ^ s_td1[(t3 >> 16) & 0xff] ^ s_td2[(t2 >> 8) & 0xff] ^ s_td3[t1 & 0xff] ^ rdk[48]; + s1 = s_td0[t1 >> 24] ^ s_td1[(t0 >> 16) & 0xff] ^ s_td2[(t3 >> 8) & 0xff] ^ s_td3[t2 & 0xff] ^ rdk[49]; + s2 = s_td0[t2 >> 24] ^ s_td1[(t1 >> 16) & 0xff] ^ s_td2[(t0 >> 8) & 0xff] ^ s_td3[t3 & 0xff] ^ rdk[50]; + s3 = s_td0[t3 >> 24] ^ s_td1[(t2 >> 16) & 0xff] ^ s_td2[(t1 >> 8) & 0xff] ^ s_td3[t0 & 0xff] ^ rdk[51]; + t0 = s_td0[s0 >> 24] ^ s_td1[(s3 >> 16) & 0xff] ^ s_td2[(s2 >> 8) & 0xff] ^ s_td3[s1 & 0xff] ^ rdk[52]; + t1 = s_td0[s1 >> 24] ^ s_td1[(s0 >> 16) & 0xff] ^ s_td2[(s3 >> 8) & 0xff] ^ s_td3[s2 & 0xff] ^ rdk[53]; + t2 = s_td0[s2 >> 24] ^ s_td1[(s1 >> 16) & 0xff] ^ s_td2[(s0 >> 8) & 0xff] ^ s_td3[s3 & 0xff] ^ rdk[54]; + t3 = s_td0[s3 >> 24] ^ s_td1[(s2 >> 16) & 0xff] ^ s_td2[(s1 >> 8) & 0xff] ^ s_td3[s0 & 0xff] ^ rdk[55]; + + out[0] = (s_td4[(t0 >> 24) & 0xff] & 0xff000000) + ^ (s_td4[(t3 >> 16) & 0xff] & 0x00ff0000) + ^ (s_td4[(t2 >> 8) & 0xff] & 0x0000ff00) + ^ (s_td4[(t1 >> 0) & 0xff] & 0x000000ff) + ^ rdk[56]; + + out[1] = (s_td4[(t1 >> 24) & 0xff] & 0xff000000) + ^ (s_td4[(t0 >> 16) & 0xff] & 0x00ff0000) + ^ (s_td4[(t3 >> 8) & 0xff] & 0x0000ff00) + ^ (s_td4[(t2 >> 0) & 0xff] & 0x000000ff) + ^ rdk[57]; + + out[2] = (s_td4[(t2 >> 24) & 0xff] & 0xff000000) + ^ (s_td4[(t1 >> 16) & 0xff] & 0x00ff0000) + ^ (s_td4[(t0 >> 8) & 0xff] & 0x0000ff00) + ^ (s_td4[(t3 >> 0) & 0xff] & 0x000000ff) + ^ rdk[58]; + + out[3] = (s_td4[(t3 >> 24) & 0xff] & 0xff000000) + ^ (s_td4[(t2 >> 16) & 0xff] & 0x00ff0000) + ^ (s_td4[(t1 >> 8) & 0xff] & 0x0000ff00) + ^ (s_td4[(t0 >> 0) & 0xff] & 0x000000ff) + ^ rdk[59]; +} + +__device__ static void AES256_encrypt (const u32 *in, u32 *out, const u32 *rek, u32 s_te0[256], u32 s_te1[256], u32 s_te2[256], u32 s_te3[256], u32 s_te4[256]) +{ + u32 s0 = in[0] ^ rek[0]; + u32 s1 = in[1] ^ rek[1]; + u32 s2 = in[2] ^ rek[2]; + u32 s3 = in[3] ^ rek[3]; + + u32 t0; + u32 t1; + u32 t2; + u32 t3; + + t0 = s_te0[s0 >> 24] ^ s_te1[(s1 >> 16) & 0xff] ^ s_te2[(s2 >> 8) & 0xff] ^ s_te3[s3 & 0xff] ^ rek[ 4]; + t1 = s_te0[s1 >> 24] ^ s_te1[(s2 >> 16) & 0xff] ^ s_te2[(s3 >> 8) & 0xff] ^ s_te3[s0 & 0xff] ^ rek[ 5]; + t2 = s_te0[s2 >> 24] ^ s_te1[(s3 >> 16) & 0xff] ^ s_te2[(s0 >> 8) & 0xff] ^ s_te3[s1 & 0xff] ^ rek[ 6]; + t3 = s_te0[s3 >> 24] ^ s_te1[(s0 >> 16) & 0xff] ^ s_te2[(s1 >> 8) & 0xff] ^ s_te3[s2 & 0xff] ^ rek[ 7]; + s0 = s_te0[t0 >> 24] ^ s_te1[(t1 >> 16) & 0xff] ^ s_te2[(t2 >> 8) & 0xff] ^ s_te3[t3 & 0xff] ^ rek[ 8]; + s1 = s_te0[t1 >> 24] ^ s_te1[(t2 >> 16) & 0xff] ^ s_te2[(t3 >> 8) & 0xff] ^ s_te3[t0 & 0xff] ^ rek[ 9]; + s2 = s_te0[t2 >> 24] ^ s_te1[(t3 >> 16) & 0xff] ^ s_te2[(t0 >> 8) & 0xff] ^ s_te3[t1 & 0xff] ^ rek[10]; + s3 = s_te0[t3 >> 24] ^ s_te1[(t0 >> 16) & 0xff] ^ s_te2[(t1 >> 8) & 0xff] ^ s_te3[t2 & 0xff] ^ rek[11]; + t0 = s_te0[s0 >> 24] ^ s_te1[(s1 >> 16) & 0xff] ^ s_te2[(s2 >> 8) & 0xff] ^ s_te3[s3 & 0xff] ^ rek[12]; + t1 = s_te0[s1 >> 24] ^ s_te1[(s2 >> 16) & 0xff] ^ s_te2[(s3 >> 8) & 0xff] ^ s_te3[s0 & 0xff] ^ rek[13]; + t2 = s_te0[s2 >> 24] ^ s_te1[(s3 >> 16) & 0xff] ^ s_te2[(s0 >> 8) & 0xff] ^ s_te3[s1 & 0xff] ^ rek[14]; + t3 = s_te0[s3 >> 24] ^ s_te1[(s0 >> 16) & 0xff] ^ s_te2[(s1 >> 8) & 0xff] ^ s_te3[s2 & 0xff] ^ rek[15]; + s0 = s_te0[t0 >> 24] ^ s_te1[(t1 >> 16) & 0xff] ^ s_te2[(t2 >> 8) & 0xff] ^ s_te3[t3 & 0xff] ^ rek[16]; + s1 = s_te0[t1 >> 24] ^ s_te1[(t2 >> 16) & 0xff] ^ s_te2[(t3 >> 8) & 0xff] ^ s_te3[t0 & 0xff] ^ rek[17]; + s2 = s_te0[t2 >> 24] ^ s_te1[(t3 >> 16) & 0xff] ^ s_te2[(t0 >> 8) & 0xff] ^ s_te3[t1 & 0xff] ^ rek[18]; + s3 = s_te0[t3 >> 24] ^ s_te1[(t0 >> 16) & 0xff] ^ s_te2[(t1 >> 8) & 0xff] ^ s_te3[t2 & 0xff] ^ rek[19]; + t0 = s_te0[s0 >> 24] ^ s_te1[(s1 >> 16) & 0xff] ^ s_te2[(s2 >> 8) & 0xff] ^ s_te3[s3 & 0xff] ^ rek[20]; + t1 = s_te0[s1 >> 24] ^ s_te1[(s2 >> 16) & 0xff] ^ s_te2[(s3 >> 8) & 0xff] ^ s_te3[s0 & 0xff] ^ rek[21]; + t2 = s_te0[s2 >> 24] ^ s_te1[(s3 >> 16) & 0xff] ^ s_te2[(s0 >> 8) & 0xff] ^ s_te3[s1 & 0xff] ^ rek[22]; + t3 = s_te0[s3 >> 24] ^ s_te1[(s0 >> 16) & 0xff] ^ s_te2[(s1 >> 8) & 0xff] ^ s_te3[s2 & 0xff] ^ rek[23]; + s0 = s_te0[t0 >> 24] ^ s_te1[(t1 >> 16) & 0xff] ^ s_te2[(t2 >> 8) & 0xff] ^ s_te3[t3 & 0xff] ^ rek[24]; + s1 = s_te0[t1 >> 24] ^ s_te1[(t2 >> 16) & 0xff] ^ s_te2[(t3 >> 8) & 0xff] ^ s_te3[t0 & 0xff] ^ rek[25]; + s2 = s_te0[t2 >> 24] ^ s_te1[(t3 >> 16) & 0xff] ^ s_te2[(t0 >> 8) & 0xff] ^ s_te3[t1 & 0xff] ^ rek[26]; + s3 = s_te0[t3 >> 24] ^ s_te1[(t0 >> 16) & 0xff] ^ s_te2[(t1 >> 8) & 0xff] ^ s_te3[t2 & 0xff] ^ rek[27]; + t0 = s_te0[s0 >> 24] ^ s_te1[(s1 >> 16) & 0xff] ^ s_te2[(s2 >> 8) & 0xff] ^ s_te3[s3 & 0xff] ^ rek[28]; + t1 = s_te0[s1 >> 24] ^ s_te1[(s2 >> 16) & 0xff] ^ s_te2[(s3 >> 8) & 0xff] ^ s_te3[s0 & 0xff] ^ rek[29]; + t2 = s_te0[s2 >> 24] ^ s_te1[(s3 >> 16) & 0xff] ^ s_te2[(s0 >> 8) & 0xff] ^ s_te3[s1 & 0xff] ^ rek[30]; + t3 = s_te0[s3 >> 24] ^ s_te1[(s0 >> 16) & 0xff] ^ s_te2[(s1 >> 8) & 0xff] ^ s_te3[s2 & 0xff] ^ rek[31]; + s0 = s_te0[t0 >> 24] ^ s_te1[(t1 >> 16) & 0xff] ^ s_te2[(t2 >> 8) & 0xff] ^ s_te3[t3 & 0xff] ^ rek[32]; + s1 = s_te0[t1 >> 24] ^ s_te1[(t2 >> 16) & 0xff] ^ s_te2[(t3 >> 8) & 0xff] ^ s_te3[t0 & 0xff] ^ rek[33]; + s2 = s_te0[t2 >> 24] ^ s_te1[(t3 >> 16) & 0xff] ^ s_te2[(t0 >> 8) & 0xff] ^ s_te3[t1 & 0xff] ^ rek[34]; + s3 = s_te0[t3 >> 24] ^ s_te1[(t0 >> 16) & 0xff] ^ s_te2[(t1 >> 8) & 0xff] ^ s_te3[t2 & 0xff] ^ rek[35]; + t0 = s_te0[s0 >> 24] ^ s_te1[(s1 >> 16) & 0xff] ^ s_te2[(s2 >> 8) & 0xff] ^ s_te3[s3 & 0xff] ^ rek[36]; + t1 = s_te0[s1 >> 24] ^ s_te1[(s2 >> 16) & 0xff] ^ s_te2[(s3 >> 8) & 0xff] ^ s_te3[s0 & 0xff] ^ rek[37]; + t2 = s_te0[s2 >> 24] ^ s_te1[(s3 >> 16) & 0xff] ^ s_te2[(s0 >> 8) & 0xff] ^ s_te3[s1 & 0xff] ^ rek[38]; + t3 = s_te0[s3 >> 24] ^ s_te1[(s0 >> 16) & 0xff] ^ s_te2[(s1 >> 8) & 0xff] ^ s_te3[s2 & 0xff] ^ rek[39]; + s0 = s_te0[t0 >> 24] ^ s_te1[(t1 >> 16) & 0xff] ^ s_te2[(t2 >> 8) & 0xff] ^ s_te3[t3 & 0xff] ^ rek[40]; + s1 = s_te0[t1 >> 24] ^ s_te1[(t2 >> 16) & 0xff] ^ s_te2[(t3 >> 8) & 0xff] ^ s_te3[t0 & 0xff] ^ rek[41]; + s2 = s_te0[t2 >> 24] ^ s_te1[(t3 >> 16) & 0xff] ^ s_te2[(t0 >> 8) & 0xff] ^ s_te3[t1 & 0xff] ^ rek[42]; + s3 = s_te0[t3 >> 24] ^ s_te1[(t0 >> 16) & 0xff] ^ s_te2[(t1 >> 8) & 0xff] ^ s_te3[t2 & 0xff] ^ rek[43]; + t0 = s_te0[s0 >> 24] ^ s_te1[(s1 >> 16) & 0xff] ^ s_te2[(s2 >> 8) & 0xff] ^ s_te3[s3 & 0xff] ^ rek[44]; + t1 = s_te0[s1 >> 24] ^ s_te1[(s2 >> 16) & 0xff] ^ s_te2[(s3 >> 8) & 0xff] ^ s_te3[s0 & 0xff] ^ rek[45]; + t2 = s_te0[s2 >> 24] ^ s_te1[(s3 >> 16) & 0xff] ^ s_te2[(s0 >> 8) & 0xff] ^ s_te3[s1 & 0xff] ^ rek[46]; + t3 = s_te0[s3 >> 24] ^ s_te1[(s0 >> 16) & 0xff] ^ s_te2[(s1 >> 8) & 0xff] ^ s_te3[s2 & 0xff] ^ rek[47]; + s0 = s_te0[t0 >> 24] ^ s_te1[(t1 >> 16) & 0xff] ^ s_te2[(t2 >> 8) & 0xff] ^ s_te3[t3 & 0xff] ^ rek[48]; + s1 = s_te0[t1 >> 24] ^ s_te1[(t2 >> 16) & 0xff] ^ s_te2[(t3 >> 8) & 0xff] ^ s_te3[t0 & 0xff] ^ rek[49]; + s2 = s_te0[t2 >> 24] ^ s_te1[(t3 >> 16) & 0xff] ^ s_te2[(t0 >> 8) & 0xff] ^ s_te3[t1 & 0xff] ^ rek[50]; + s3 = s_te0[t3 >> 24] ^ s_te1[(t0 >> 16) & 0xff] ^ s_te2[(t1 >> 8) & 0xff] ^ s_te3[t2 & 0xff] ^ rek[51]; + t0 = s_te0[s0 >> 24] ^ s_te1[(s1 >> 16) & 0xff] ^ s_te2[(s2 >> 8) & 0xff] ^ s_te3[s3 & 0xff] ^ rek[52]; + t1 = s_te0[s1 >> 24] ^ s_te1[(s2 >> 16) & 0xff] ^ s_te2[(s3 >> 8) & 0xff] ^ s_te3[s0 & 0xff] ^ rek[53]; + t2 = s_te0[s2 >> 24] ^ s_te1[(s3 >> 16) & 0xff] ^ s_te2[(s0 >> 8) & 0xff] ^ s_te3[s1 & 0xff] ^ rek[54]; + t3 = s_te0[s3 >> 24] ^ s_te1[(s0 >> 16) & 0xff] ^ s_te2[(s1 >> 8) & 0xff] ^ s_te3[s2 & 0xff] ^ rek[55]; + + out[0] = (s_te4[(t0 >> 24) & 0xff] & 0xff000000) + ^ (s_te4[(t1 >> 16) & 0xff] & 0x00ff0000) + ^ (s_te4[(t2 >> 8) & 0xff] & 0x0000ff00) + ^ (s_te4[(t3 >> 0) & 0xff] & 0x000000ff) + ^ rek[56]; + + out[1] = (s_te4[(t1 >> 24) & 0xff] & 0xff000000) + ^ (s_te4[(t2 >> 16) & 0xff] & 0x00ff0000) + ^ (s_te4[(t3 >> 8) & 0xff] & 0x0000ff00) + ^ (s_te4[(t0 >> 0) & 0xff] & 0x000000ff) + ^ rek[57]; + + out[2] = (s_te4[(t2 >> 24) & 0xff] & 0xff000000) + ^ (s_te4[(t3 >> 16) & 0xff] & 0x00ff0000) + ^ (s_te4[(t0 >> 8) & 0xff] & 0x0000ff00) + ^ (s_te4[(t1 >> 0) & 0xff] & 0x000000ff) + ^ rek[58]; + + out[3] = (s_te4[(t3 >> 24) & 0xff] & 0xff000000) + ^ (s_te4[(t0 >> 16) & 0xff] & 0x00ff0000) + ^ (s_te4[(t1 >> 8) & 0xff] & 0x0000ff00) + ^ (s_te4[(t2 >> 0) & 0xff] & 0x000000ff) + ^ rek[59]; +} + +__device__ static void sha256_transform (const u32x w0[4], const u32x w1[4], const u32x w2[4], const u32x w3[4], u32x digest[8]) +{ + u32x a = digest[0]; + u32x b = digest[1]; + u32x c = digest[2]; + u32x d = digest[3]; + u32x e = digest[4]; + u32x f = digest[5]; + u32x g = digest[6]; + u32x h = digest[7]; + + u32x w0_t = w0[0]; + u32x w1_t = w0[1]; + u32x w2_t = w0[2]; + u32x w3_t = w0[3]; + u32x w4_t = w1[0]; + u32x w5_t = w1[1]; + u32x w6_t = w1[2]; + u32x w7_t = w1[3]; + u32x w8_t = w2[0]; + u32x w9_t = w2[1]; + u32x wa_t = w2[2]; + u32x wb_t = w2[3]; + u32x wc_t = w3[0]; + u32x wd_t = w3[1]; + u32x we_t = w3[2]; + u32x wf_t = w3[3]; + + SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C00); + SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C01); + SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C02); + SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C03); + SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C04); + SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C05); + SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C06); + SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C07); + SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C08); + SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C09); + SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C0a); + SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C0b); + SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C0c); + SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C0d); + SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C0e); + SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C0f); + w0_t = SHA256_S1(we_t) + w9_t + SHA256_S0(w1_t) + w0_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C10); + w1_t = SHA256_S1(wf_t) + wa_t + SHA256_S0(w2_t) + w1_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C11); + w2_t = SHA256_S1(w0_t) + wb_t + SHA256_S0(w3_t) + w2_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C12); + w3_t = SHA256_S1(w1_t) + wc_t + SHA256_S0(w4_t) + w3_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C13); + w4_t = SHA256_S1(w2_t) + wd_t + SHA256_S0(w5_t) + w4_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C14); + w5_t = SHA256_S1(w3_t) + we_t + SHA256_S0(w6_t) + w5_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C15); + w6_t = SHA256_S1(w4_t) + wf_t + SHA256_S0(w7_t) + w6_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C16); + w7_t = SHA256_S1(w5_t) + w0_t + SHA256_S0(w8_t) + w7_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C17); + w8_t = SHA256_S1(w6_t) + w1_t + SHA256_S0(w9_t) + w8_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C18); + w9_t = SHA256_S1(w7_t) + w2_t + SHA256_S0(wa_t) + w9_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C19); + wa_t = SHA256_S1(w8_t) + w3_t + SHA256_S0(wb_t) + wa_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C1a); + wb_t = SHA256_S1(w9_t) + w4_t + SHA256_S0(wc_t) + wb_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C1b); + wc_t = SHA256_S1(wa_t) + w5_t + SHA256_S0(wd_t) + wc_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C1c); + wd_t = SHA256_S1(wb_t) + w6_t + SHA256_S0(we_t) + wd_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C1d); + we_t = SHA256_S1(wc_t) + w7_t + SHA256_S0(wf_t) + we_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C1e); + wf_t = SHA256_S1(wd_t) + w8_t + SHA256_S0(w0_t) + wf_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C1f); + w0_t = SHA256_S1(we_t) + w9_t + SHA256_S0(w1_t) + w0_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C20); + w1_t = SHA256_S1(wf_t) + wa_t + SHA256_S0(w2_t) + w1_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C21); + w2_t = SHA256_S1(w0_t) + wb_t + SHA256_S0(w3_t) + w2_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C22); + w3_t = SHA256_S1(w1_t) + wc_t + SHA256_S0(w4_t) + w3_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C23); + w4_t = SHA256_S1(w2_t) + wd_t + SHA256_S0(w5_t) + w4_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C24); + w5_t = SHA256_S1(w3_t) + we_t + SHA256_S0(w6_t) + w5_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C25); + w6_t = SHA256_S1(w4_t) + wf_t + SHA256_S0(w7_t) + w6_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C26); + w7_t = SHA256_S1(w5_t) + w0_t + SHA256_S0(w8_t) + w7_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C27); + w8_t = SHA256_S1(w6_t) + w1_t + SHA256_S0(w9_t) + w8_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C28); + w9_t = SHA256_S1(w7_t) + w2_t + SHA256_S0(wa_t) + w9_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C29); + wa_t = SHA256_S1(w8_t) + w3_t + SHA256_S0(wb_t) + wa_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C2a); + wb_t = SHA256_S1(w9_t) + w4_t + SHA256_S0(wc_t) + wb_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C2b); + wc_t = SHA256_S1(wa_t) + w5_t + SHA256_S0(wd_t) + wc_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C2c); + wd_t = SHA256_S1(wb_t) + w6_t + SHA256_S0(we_t) + wd_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C2d); + we_t = SHA256_S1(wc_t) + w7_t + SHA256_S0(wf_t) + we_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C2e); + wf_t = SHA256_S1(wd_t) + w8_t + SHA256_S0(w0_t) + wf_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C2f); + w0_t = SHA256_S1(we_t) + w9_t + SHA256_S0(w1_t) + w0_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C30); + w1_t = SHA256_S1(wf_t) + wa_t + SHA256_S0(w2_t) + w1_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C31); + w2_t = SHA256_S1(w0_t) + wb_t + SHA256_S0(w3_t) + w2_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C32); + w3_t = SHA256_S1(w1_t) + wc_t + SHA256_S0(w4_t) + w3_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C33); + w4_t = SHA256_S1(w2_t) + wd_t + SHA256_S0(w5_t) + w4_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C34); + w5_t = SHA256_S1(w3_t) + we_t + SHA256_S0(w6_t) + w5_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C35); + w6_t = SHA256_S1(w4_t) + wf_t + SHA256_S0(w7_t) + w6_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C36); + w7_t = SHA256_S1(w5_t) + w0_t + SHA256_S0(w8_t) + w7_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C37); + w8_t = SHA256_S1(w6_t) + w1_t + SHA256_S0(w9_t) + w8_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C38); + w9_t = SHA256_S1(w7_t) + w2_t + SHA256_S0(wa_t) + w9_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C39); + wa_t = SHA256_S1(w8_t) + w3_t + SHA256_S0(wb_t) + wa_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C3a); + wb_t = SHA256_S1(w9_t) + w4_t + SHA256_S0(wc_t) + wb_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C3b); + wc_t = SHA256_S1(wa_t) + w5_t + SHA256_S0(wd_t) + wc_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C3c); + wd_t = SHA256_S1(wb_t) + w6_t + SHA256_S0(we_t) + wd_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C3d); + we_t = SHA256_S1(wc_t) + w7_t + SHA256_S0(wf_t) + we_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C3e); + wf_t = SHA256_S1(wd_t) + w8_t + SHA256_S0(w0_t) + wf_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C3f); + + digest[0] += a; + digest[1] += b; + digest[2] += c; + digest[3] += d; + digest[4] += e; + digest[5] += f; + digest[6] += g; + digest[7] += h; +} + +__device__ static void hmac_sha256_pad (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], u32x ipad[8], u32x opad[8]) +{ + w0[0] = w0[0] ^ 0x36363636; + w0[1] = w0[1] ^ 0x36363636; + w0[2] = w0[2] ^ 0x36363636; + w0[3] = w0[3] ^ 0x36363636; + w1[0] = w1[0] ^ 0x36363636; + w1[1] = w1[1] ^ 0x36363636; + w1[2] = w1[2] ^ 0x36363636; + w1[3] = w1[3] ^ 0x36363636; + w2[0] = w2[0] ^ 0x36363636; + w2[1] = w2[1] ^ 0x36363636; + w2[2] = w2[2] ^ 0x36363636; + w2[3] = w2[3] ^ 0x36363636; + w3[0] = w3[0] ^ 0x36363636; + w3[1] = w3[1] ^ 0x36363636; + w3[2] = w3[2] ^ 0x36363636; + w3[3] = w3[3] ^ 0x36363636; + + ipad[0] = SHA256M_A; + ipad[1] = SHA256M_B; + ipad[2] = SHA256M_C; + ipad[3] = SHA256M_D; + ipad[4] = SHA256M_E; + ipad[5] = SHA256M_F; + ipad[6] = SHA256M_G; + ipad[7] = SHA256M_H; + + sha256_transform (w0, w1, w2, w3, ipad); + + w0[0] = w0[0] ^ 0x6a6a6a6a; + w0[1] = w0[1] ^ 0x6a6a6a6a; + w0[2] = w0[2] ^ 0x6a6a6a6a; + w0[3] = w0[3] ^ 0x6a6a6a6a; + w1[0] = w1[0] ^ 0x6a6a6a6a; + w1[1] = w1[1] ^ 0x6a6a6a6a; + w1[2] = w1[2] ^ 0x6a6a6a6a; + w1[3] = w1[3] ^ 0x6a6a6a6a; + w2[0] = w2[0] ^ 0x6a6a6a6a; + w2[1] = w2[1] ^ 0x6a6a6a6a; + w2[2] = w2[2] ^ 0x6a6a6a6a; + w2[3] = w2[3] ^ 0x6a6a6a6a; + w3[0] = w3[0] ^ 0x6a6a6a6a; + w3[1] = w3[1] ^ 0x6a6a6a6a; + w3[2] = w3[2] ^ 0x6a6a6a6a; + w3[3] = w3[3] ^ 0x6a6a6a6a; + + opad[0] = SHA256M_A; + opad[1] = SHA256M_B; + opad[2] = SHA256M_C; + opad[3] = SHA256M_D; + opad[4] = SHA256M_E; + opad[5] = SHA256M_F; + opad[6] = SHA256M_G; + opad[7] = SHA256M_H; + + sha256_transform (w0, w1, w2, w3, opad); +} + +__device__ static void hmac_sha256_run (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], u32x ipad[8], u32x opad[8], u32x digest[8]) +{ + digest[0] = ipad[0]; + digest[1] = ipad[1]; + digest[2] = ipad[2]; + digest[3] = ipad[3]; + digest[4] = ipad[4]; + digest[5] = ipad[5]; + digest[6] = ipad[6]; + digest[7] = ipad[7]; + + sha256_transform (w0, w1, w2, w3, digest); + + w0[0] = digest[0]; + w0[1] = digest[1]; + w0[2] = digest[2]; + w0[3] = digest[3]; + w1[0] = digest[4]; + w1[1] = digest[5]; + w1[2] = digest[6]; + w1[3] = digest[7]; + w2[0] = 0x80000000; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = (64 + 32) * 8; + + digest[0] = opad[0]; + digest[1] = opad[1]; + digest[2] = opad[2]; + digest[3] = opad[3]; + digest[4] = opad[4]; + digest[5] = opad[5]; + digest[6] = opad[6]; + digest[7] = opad[7]; + + sha256_transform (w0, w1, w2, w3, digest); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m06800_init (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, lastpass_tmp_t *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = pws[gid].i[ 8]; + w2[1] = pws[gid].i[ 9]; + w2[2] = pws[gid].i[10]; + w2[3] = pws[gid].i[11]; + + u32x w3[4]; + + w3[0] = pws[gid].i[12]; + w3[1] = pws[gid].i[13]; + w3[2] = pws[gid].i[14]; + w3[3] = pws[gid].i[15]; + + /** + * salt + */ + + u32 salt_len = salt_bufs[salt_pos].salt_len; + + u32 salt_buf0[4]; + u32 salt_buf1[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[3]; + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[7]; + + /** + * pads + */ + + w0[0] = swap_workaround (w0[0]); + w0[1] = swap_workaround (w0[1]); + w0[2] = swap_workaround (w0[2]); + w0[3] = swap_workaround (w0[3]); + w1[0] = swap_workaround (w1[0]); + w1[1] = swap_workaround (w1[1]); + w1[2] = swap_workaround (w1[2]); + w1[3] = swap_workaround (w1[3]); + w2[0] = swap_workaround (w2[0]); + w2[1] = swap_workaround (w2[1]); + w2[2] = swap_workaround (w2[2]); + w2[3] = swap_workaround (w2[3]); + w3[0] = swap_workaround (w3[0]); + w3[1] = swap_workaround (w3[1]); + w3[2] = swap_workaround (w3[2]); + w3[3] = swap_workaround (w3[3]); + + u32x ipad[8]; + u32x opad[8]; + + hmac_sha256_pad (w0, w1, w2, w3, ipad, opad); + + tmps[gid].ipad[0] = ipad[0]; + tmps[gid].ipad[1] = ipad[1]; + tmps[gid].ipad[2] = ipad[2]; + tmps[gid].ipad[3] = ipad[3]; + tmps[gid].ipad[4] = ipad[4]; + tmps[gid].ipad[5] = ipad[5]; + tmps[gid].ipad[6] = ipad[6]; + tmps[gid].ipad[7] = ipad[7]; + + tmps[gid].opad[0] = opad[0]; + tmps[gid].opad[1] = opad[1]; + tmps[gid].opad[2] = opad[2]; + tmps[gid].opad[3] = opad[3]; + tmps[gid].opad[4] = opad[4]; + tmps[gid].opad[5] = opad[5]; + tmps[gid].opad[6] = opad[6]; + tmps[gid].opad[7] = opad[7]; + + w0[0] = salt_buf0[0]; + w0[1] = salt_buf0[1]; + w0[2] = salt_buf0[2]; + w0[3] = salt_buf0[3]; + w1[0] = salt_buf1[0]; + w1[1] = salt_buf1[1]; + w1[2] = salt_buf1[2]; + w1[3] = salt_buf1[3]; + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + append_0x01_3 (w0, w1, w2, salt_len + 3); + append_0x80_3 (w0, w1, w2, salt_len + 4); + + w0[0] = swap_workaround (w0[0]); + w0[1] = swap_workaround (w0[1]); + w0[2] = swap_workaround (w0[2]); + w0[3] = swap_workaround (w0[3]); + w1[0] = swap_workaround (w1[0]); + w1[1] = swap_workaround (w1[1]); + w1[2] = swap_workaround (w1[2]); + w1[3] = swap_workaround (w1[3]); + w2[0] = swap_workaround (w2[0]); + w2[1] = swap_workaround (w2[1]); + w2[2] = 0; + w2[3] = 0; + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = (64 + salt_len + 4) * 8; + + u32x dgst[8]; + + hmac_sha256_run (w0, w1, w2, w3, ipad, opad, dgst); + + tmps[gid].dgst[0] = dgst[0]; + tmps[gid].dgst[1] = dgst[1]; + tmps[gid].dgst[2] = dgst[2]; + tmps[gid].dgst[3] = dgst[3]; + tmps[gid].dgst[4] = dgst[4]; + tmps[gid].dgst[5] = dgst[5]; + tmps[gid].dgst[6] = dgst[6]; + tmps[gid].dgst[7] = dgst[7]; + + tmps[gid].out[0] = dgst[0]; + tmps[gid].out[1] = dgst[1]; + tmps[gid].out[2] = dgst[2]; + tmps[gid].out[3] = dgst[3]; + tmps[gid].out[4] = dgst[4]; + tmps[gid].out[5] = dgst[5]; + tmps[gid].out[6] = dgst[6]; + tmps[gid].out[7] = dgst[7]; +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m06800_loop (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, lastpass_tmp_t *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x ipad[8]; + u32x opad[8]; + + ipad[0] = tmps[gid].ipad[0]; + ipad[1] = tmps[gid].ipad[1]; + ipad[2] = tmps[gid].ipad[2]; + ipad[3] = tmps[gid].ipad[3]; + ipad[4] = tmps[gid].ipad[4]; + ipad[5] = tmps[gid].ipad[5]; + ipad[6] = tmps[gid].ipad[6]; + ipad[7] = tmps[gid].ipad[7]; + + opad[0] = tmps[gid].opad[0]; + opad[1] = tmps[gid].opad[1]; + opad[2] = tmps[gid].opad[2]; + opad[3] = tmps[gid].opad[3]; + opad[4] = tmps[gid].opad[4]; + opad[5] = tmps[gid].opad[5]; + opad[6] = tmps[gid].opad[6]; + opad[7] = tmps[gid].opad[7]; + + u32x dgst[8]; + u32x out[8]; + + dgst[0] = tmps[gid].dgst[0]; + dgst[1] = tmps[gid].dgst[1]; + dgst[2] = tmps[gid].dgst[2]; + dgst[3] = tmps[gid].dgst[3]; + dgst[4] = tmps[gid].dgst[4]; + dgst[5] = tmps[gid].dgst[5]; + dgst[6] = tmps[gid].dgst[6]; + dgst[7] = tmps[gid].dgst[7]; + + out[0] = tmps[gid].out[0]; + out[1] = tmps[gid].out[1]; + out[2] = tmps[gid].out[2]; + out[3] = tmps[gid].out[3]; + out[4] = tmps[gid].out[4]; + out[5] = tmps[gid].out[5]; + out[6] = tmps[gid].out[6]; + out[7] = tmps[gid].out[7]; + + for (u32 j = 0; j < loop_cnt; j++) + { + u32x w0[4]; + u32x w1[4]; + u32x w2[4]; + u32x w3[4]; + + w0[0] = dgst[0]; + w0[1] = dgst[1]; + w0[2] = dgst[2]; + w0[3] = dgst[3]; + w1[0] = dgst[4]; + w1[1] = dgst[5]; + w1[2] = dgst[6]; + w1[3] = dgst[7]; + w2[0] = 0x80000000; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = (64 + 32) * 8; + + hmac_sha256_run (w0, w1, w2, w3, ipad, opad, dgst); + + out[0] ^= dgst[0]; + out[1] ^= dgst[1]; + out[2] ^= dgst[2]; + out[3] ^= dgst[3]; + out[4] ^= dgst[4]; + out[5] ^= dgst[5]; + out[6] ^= dgst[6]; + out[7] ^= dgst[7]; + } + + tmps[gid].dgst[0] = dgst[0]; + tmps[gid].dgst[1] = dgst[1]; + tmps[gid].dgst[2] = dgst[2]; + tmps[gid].dgst[3] = dgst[3]; + tmps[gid].dgst[4] = dgst[4]; + tmps[gid].dgst[5] = dgst[5]; + tmps[gid].dgst[6] = dgst[6]; + tmps[gid].dgst[7] = dgst[7]; + + tmps[gid].out[0] = out[0]; + tmps[gid].out[1] = out[1]; + tmps[gid].out[2] = out[2]; + tmps[gid].out[3] = out[3]; + tmps[gid].out[4] = out[4]; + tmps[gid].out[5] = out[5]; + tmps[gid].out[6] = out[6]; + tmps[gid].out[7] = out[7]; +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m06800_comp (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, lastpass_tmp_t *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + const u32 lid = threadIdx.x; + + /** + * salt + */ + + const u32 data[4] = + { + digests_buf[digests_offset].digest_buf[0], + digests_buf[digests_offset].digest_buf[1], + digests_buf[digests_offset].digest_buf[2], + digests_buf[digests_offset].digest_buf[3], + }; + + /** + * aes shared + */ + + __shared__ u32 s_td0[256]; + __shared__ u32 s_td1[256]; + __shared__ u32 s_td2[256]; + __shared__ u32 s_td3[256]; + __shared__ u32 s_td4[256]; + + __shared__ u32 s_te0[256]; + __shared__ u32 s_te1[256]; + __shared__ u32 s_te2[256]; + __shared__ u32 s_te3[256]; + __shared__ u32 s_te4[256]; + + s_td0[lid] = td0[lid]; + s_td1[lid] = td1[lid]; + s_td2[lid] = td2[lid]; + s_td3[lid] = td3[lid]; + s_td4[lid] = td4[lid]; + + s_te0[lid] = te0[lid]; + s_te1[lid] = te1[lid]; + s_te2[lid] = te2[lid]; + s_te3[lid] = te3[lid]; + s_te4[lid] = te4[lid]; + + __syncthreads (); + + if (gid >= gid_max) return; + + /** + * aes init + */ + + u32 ukey[8]; + + ukey[0] = tmps[gid].out[0]; + ukey[1] = tmps[gid].out[1]; + ukey[2] = tmps[gid].out[2]; + ukey[3] = tmps[gid].out[3]; + ukey[4] = tmps[gid].out[4]; + ukey[5] = tmps[gid].out[5]; + ukey[6] = tmps[gid].out[6]; + ukey[7] = tmps[gid].out[7]; + + #define KEYLEN 60 + + u32 rek[KEYLEN]; + + AES256_ExpandKey (ukey, rek, s_te0, s_te1, s_te2, s_te3, s_te4); + + u32 out[4]; + + /** + * sniffed mode + */ + + u32 rdk[KEYLEN]; + + #pragma unroll 60 + for (u32 i = 0; i < KEYLEN; i++) rdk[i] = rek[i]; + + AES256_InvertKey (rdk, s_td0, s_td1, s_td2, s_td3, s_td4, s_te0, s_te1, s_te2, s_te3, s_te4); + + AES256_decrypt (data, out, rdk, s_td0, s_td1, s_td2, s_td3, s_td4); + + u32 salt_len = salt_bufs[salt_pos].salt_len; + + u32 salt_buf[4]; + + salt_buf[0] = salt_bufs[salt_pos].salt_buf[0]; + salt_buf[1] = salt_bufs[salt_pos].salt_buf[1]; + salt_buf[2] = salt_bufs[salt_pos].salt_buf[2]; + salt_buf[3] = salt_bufs[salt_pos].salt_buf[3]; + + out[0] = swap_workaround (out[0]); + out[1] = swap_workaround (out[1]); + out[2] = swap_workaround (out[2]); + out[3] = swap_workaround (out[3]); + + truncate_block (out, salt_len); + + if ((out[0] == salt_buf[0]) + && (out[1] == salt_buf[1]) + && (out[2] == salt_buf[2]) + && (out[3] == salt_buf[3])) + { + mark_hash_s0 (plains_buf, hashes_shown, digests_offset + 0, gid, 0); + + d_return_buf[lid] = 1; + } + + /** + * offline mode + */ + + const u32 lastpass_magic[4] = + { + 0x6c617374, + 0x70617373, + 0x20726f63, + 0x6b730202, + }; + + AES256_encrypt (lastpass_magic, out, rek, s_te0, s_te1, s_te2, s_te3, s_te4); + + const u32x r0 = out[DGST_R0]; + const u32x r1 = out[DGST_R1]; + const u32x r2 = out[DGST_R2]; + const u32x r3 = out[DGST_R3]; + + #define il_pos 0 + + #include VECT_COMPARE_M +} diff --git a/nv/m06900_a0.cu b/nv/m06900_a0.cu new file mode 100644 index 0000000000..ccb258662d --- /dev/null +++ b/nv/m06900_a0.cu @@ -0,0 +1,1215 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _GOST_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW2 +#define VECT_SIZE1 +#endif + +#define DGST_R0 0 +#define DGST_R1 1 +#define DGST_R2 2 +#define DGST_R3 3 + +#include "include/kernel_functions.c" +#include "types_nv.c" +#include "common_nv.c" +#include "include/rp_gpu.h" +#include "rp_nv.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE1 +#define BOX(i,n,S) u32x ((S)[(n)][(i)]) +#endif + +#ifdef VECT_SIZE2 +#define BOX(i,n,S) u32x ((S)[(n)][(i).x], (S)[(n)][(i).y]) +#endif + +#define round(k1,k2,tbl) \ +{ \ + u32x t; \ + t = (k1) + r; \ + l ^= BOX ((t >> 0) & 0xff, 0, tbl) ^ \ + BOX ((t >> 8) & 0xff, 1, tbl) ^ \ + BOX ((t >> 16) & 0xff, 2, tbl) ^ \ + BOX ((t >> 24) & 0xff, 3, tbl); \ + t = (k2) + l; \ + r ^= BOX ((t >> 0) & 0xff, 0, tbl) ^ \ + BOX ((t >> 8) & 0xff, 1, tbl) ^ \ + BOX ((t >> 16) & 0xff, 2, tbl) ^ \ + BOX ((t >> 24) & 0xff, 3, tbl); \ +} + +#define R(k,h,s,i,t) \ +{ \ + u32x r; \ + u32x l; \ + r = h[i + 0]; \ + l = h[i + 1]; \ + round (k[0], k[1], t); \ + round (k[2], k[3], t); \ + round (k[4], k[5], t); \ + round (k[6], k[7], t); \ + round (k[0], k[1], t); \ + round (k[2], k[3], t); \ + round (k[4], k[5], t); \ + round (k[6], k[7], t); \ + round (k[0], k[1], t); \ + round (k[2], k[3], t); \ + round (k[4], k[5], t); \ + round (k[6], k[7], t); \ + round (k[7], k[6], t); \ + round (k[5], k[4], t); \ + round (k[3], k[2], t); \ + round (k[1], k[0], t); \ + s[i + 0] = l; \ + s[i + 1] = r; \ +} + +#define X(w,u,v) \ + w[0] = u[0] ^ v[0]; \ + w[1] = u[1] ^ v[1]; \ + w[2] = u[2] ^ v[2]; \ + w[3] = u[3] ^ v[3]; \ + w[4] = u[4] ^ v[4]; \ + w[5] = u[5] ^ v[5]; \ + w[6] = u[6] ^ v[6]; \ + w[7] = u[7] ^ v[7]; + +#define P(k,w) \ + k[0] = ((w[0] & 0x000000ff) << 0) \ + | ((w[2] & 0x000000ff) << 8) \ + | ((w[4] & 0x000000ff) << 16) \ + | ((w[6] & 0x000000ff) << 24); \ + k[1] = ((w[0] & 0x0000ff00) >> 8) \ + | ((w[2] & 0x0000ff00) >> 0) \ + | ((w[4] & 0x0000ff00) << 8) \ + | ((w[6] & 0x0000ff00) << 16); \ + k[2] = ((w[0] & 0x00ff0000) >> 16) \ + | ((w[2] & 0x00ff0000) >> 8) \ + | ((w[4] & 0x00ff0000) << 0) \ + | ((w[6] & 0x00ff0000) << 8); \ + k[3] = ((w[0] & 0xff000000) >> 24) \ + | ((w[2] & 0xff000000) >> 16) \ + | ((w[4] & 0xff000000) >> 8) \ + | ((w[6] & 0xff000000) >> 0); \ + k[4] = ((w[1] & 0x000000ff) << 0) \ + | ((w[3] & 0x000000ff) << 8) \ + | ((w[5] & 0x000000ff) << 16) \ + | ((w[7] & 0x000000ff) << 24); \ + k[5] = ((w[1] & 0x0000ff00) >> 8) \ + | ((w[3] & 0x0000ff00) >> 0) \ + | ((w[5] & 0x0000ff00) << 8) \ + | ((w[7] & 0x0000ff00) << 16); \ + k[6] = ((w[1] & 0x00ff0000) >> 16) \ + | ((w[3] & 0x00ff0000) >> 8) \ + | ((w[5] & 0x00ff0000) << 0) \ + | ((w[7] & 0x00ff0000) << 8); \ + k[7] = ((w[1] & 0xff000000) >> 24) \ + | ((w[3] & 0xff000000) >> 16) \ + | ((w[5] & 0xff000000) >> 8) \ + | ((w[7] & 0xff000000) >> 0); + +#define A(x) \ +{ \ + u32x l; \ + u32x r; \ + l = x[0] ^ x[2]; \ + r = x[1] ^ x[3]; \ + x[0] = x[2]; \ + x[1] = x[3]; \ + x[2] = x[4]; \ + x[3] = x[5]; \ + x[4] = x[6]; \ + x[5] = x[7]; \ + x[6] = l; \ + x[7] = r; \ +} + +#define AA(x) \ +{ \ + u32x l; \ + u32x r; \ + l = x[0]; \ + r = x[2]; \ + x[0] = x[4]; \ + x[2] = x[6]; \ + x[4] = l ^ r; \ + x[6] = x[0] ^ r; \ + l = x[1]; \ + r = x[3]; \ + x[1] = x[5]; \ + x[3] = x[7]; \ + x[5] = l ^ r; \ + x[7] = x[1] ^ r; \ +} + +#define C(x) \ + x[0] ^= 0xff00ff00; \ + x[1] ^= 0xff00ff00; \ + x[2] ^= 0x00ff00ff; \ + x[3] ^= 0x00ff00ff; \ + x[4] ^= 0x00ffff00; \ + x[5] ^= 0xff0000ff; \ + x[6] ^= 0x000000ff; \ + x[7] ^= 0xff00ffff; + +#define SHIFT12(u,m,s) \ + u[0] = m[0] ^ s[6]; \ + u[1] = m[1] ^ s[7]; \ + u[2] = m[2] ^ (s[0] << 16) \ + ^ (s[0] >> 16) \ + ^ (s[0] & 0x0000ffff) \ + ^ (s[1] & 0x0000ffff) \ + ^ (s[1] >> 16) \ + ^ (s[2] << 16) \ + ^ s[6] \ + ^ (s[6] << 16) \ + ^ (s[7] & 0xffff0000) \ + ^ (s[7] >> 16); \ + u[3] = m[3] ^ (s[0] & 0x0000ffff) \ + ^ (s[0] << 16) \ + ^ (s[1] & 0x0000ffff) \ + ^ (s[1] << 16) \ + ^ (s[1] >> 16) \ + ^ (s[2] << 16) \ + ^ (s[2] >> 16) \ + ^ (s[3] << 16) \ + ^ s[6] \ + ^ (s[6] << 16) \ + ^ (s[6] >> 16) \ + ^ (s[7] & 0x0000ffff) \ + ^ (s[7] << 16) \ + ^ (s[7] >> 16); \ + u[4] = m[4] ^ (s[0] & 0xffff0000) \ + ^ (s[0] << 16) \ + ^ (s[0] >> 16) \ + ^ (s[1] & 0xffff0000) \ + ^ (s[1] >> 16) \ + ^ (s[2] << 16) \ + ^ (s[2] >> 16) \ + ^ (s[3] << 16) \ + ^ (s[3] >> 16) \ + ^ (s[4] << 16) \ + ^ (s[6] << 16) \ + ^ (s[6] >> 16) \ + ^ (s[7] & 0x0000ffff) \ + ^ (s[7] << 16) \ + ^ (s[7] >> 16); \ + u[5] = m[5] ^ (s[0] << 16) \ + ^ (s[0] >> 16) \ + ^ (s[0] & 0xffff0000) \ + ^ (s[1] & 0x0000ffff) \ + ^ s[2] \ + ^ (s[2] >> 16) \ + ^ (s[3] << 16) \ + ^ (s[3] >> 16) \ + ^ (s[4] << 16) \ + ^ (s[4] >> 16) \ + ^ (s[5] << 16) \ + ^ (s[6] << 16) \ + ^ (s[6] >> 16) \ + ^ (s[7] & 0xffff0000) \ + ^ (s[7] << 16) \ + ^ (s[7] >> 16); \ + u[6] = m[6] ^ s[0] \ + ^ (s[1] >> 16) \ + ^ (s[2] << 16) \ + ^ s[3] \ + ^ (s[3] >> 16) \ + ^ (s[4] << 16) \ + ^ (s[4] >> 16) \ + ^ (s[5] << 16) \ + ^ (s[5] >> 16) \ + ^ s[6] \ + ^ (s[6] << 16) \ + ^ (s[6] >> 16) \ + ^ (s[7] << 16); \ + u[7] = m[7] ^ (s[0] & 0xffff0000) \ + ^ (s[0] << 16) \ + ^ (s[1] & 0x0000ffff) \ + ^ (s[1] << 16) \ + ^ (s[2] >> 16) \ + ^ (s[3] << 16) \ + ^ s[4] \ + ^ (s[4] >> 16) \ + ^ (s[5] << 16) \ + ^ (s[5] >> 16) \ + ^ (s[6] >> 16) \ + ^ (s[7] & 0x0000ffff) \ + ^ (s[7] << 16) \ + ^ (s[7] >> 16); + +#define SHIFT16(h,v,u) \ + v[0] = h[0] ^ (u[1] << 16) \ + ^ (u[0] >> 16); \ + v[1] = h[1] ^ (u[2] << 16) \ + ^ (u[1] >> 16); \ + v[2] = h[2] ^ (u[3] << 16) \ + ^ (u[2] >> 16); \ + v[3] = h[3] ^ (u[4] << 16) \ + ^ (u[3] >> 16); \ + v[4] = h[4] ^ (u[5] << 16) \ + ^ (u[4] >> 16); \ + v[5] = h[5] ^ (u[6] << 16) \ + ^ (u[5] >> 16); \ + v[6] = h[6] ^ (u[7] << 16) \ + ^ (u[6] >> 16); \ + v[7] = h[7] ^ (u[0] & 0xffff0000) \ + ^ (u[0] << 16) \ + ^ (u[7] >> 16) \ + ^ (u[1] & 0xffff0000) \ + ^ (u[1] << 16) \ + ^ (u[6] << 16) \ + ^ (u[7] & 0xffff0000); + +#define SHIFT61(h,v) \ + h[0] = (v[0] & 0xffff0000) \ + ^ (v[0] << 16) \ + ^ (v[0] >> 16) \ + ^ (v[1] >> 16) \ + ^ (v[1] & 0xffff0000) \ + ^ (v[2] << 16) \ + ^ (v[3] >> 16) \ + ^ (v[4] << 16) \ + ^ (v[5] >> 16) \ + ^ v[5] \ + ^ (v[6] >> 16) \ + ^ (v[7] << 16) \ + ^ (v[7] >> 16) \ + ^ (v[7] & 0x0000ffff); \ + h[1] = (v[0] << 16) \ + ^ (v[0] >> 16) \ + ^ (v[0] & 0xffff0000) \ + ^ (v[1] & 0x0000ffff) \ + ^ v[2] \ + ^ (v[2] >> 16) \ + ^ (v[3] << 16) \ + ^ (v[4] >> 16) \ + ^ (v[5] << 16) \ + ^ (v[6] << 16) \ + ^ v[6] \ + ^ (v[7] & 0xffff0000) \ + ^ (v[7] >> 16); \ + h[2] = (v[0] & 0x0000ffff) \ + ^ (v[0] << 16) \ + ^ (v[1] << 16) \ + ^ (v[1] >> 16) \ + ^ (v[1] & 0xffff0000) \ + ^ (v[2] << 16) \ + ^ (v[3] >> 16) \ + ^ v[3] \ + ^ (v[4] << 16) \ + ^ (v[5] >> 16) \ + ^ v[6] \ + ^ (v[6] >> 16) \ + ^ (v[7] & 0x0000ffff) \ + ^ (v[7] << 16) \ + ^ (v[7] >> 16); \ + h[3] = (v[0] << 16) \ + ^ (v[0] >> 16) \ + ^ (v[0] & 0xffff0000) \ + ^ (v[1] & 0xffff0000) \ + ^ (v[1] >> 16) \ + ^ (v[2] << 16) \ + ^ (v[2] >> 16) \ + ^ v[2] \ + ^ (v[3] << 16) \ + ^ (v[4] >> 16) \ + ^ v[4] \ + ^ (v[5] << 16) \ + ^ (v[6] << 16) \ + ^ (v[7] & 0x0000ffff) \ + ^ (v[7] >> 16); \ + h[4] = (v[0] >> 16) \ + ^ (v[1] << 16) \ + ^ v[1] \ + ^ (v[2] >> 16) \ + ^ v[2] \ + ^ (v[3] << 16) \ + ^ (v[3] >> 16) \ + ^ v[3] \ + ^ (v[4] << 16) \ + ^ (v[5] >> 16) \ + ^ v[5] \ + ^ (v[6] << 16) \ + ^ (v[6] >> 16) \ + ^ (v[7] << 16); \ + h[5] = (v[0] << 16) \ + ^ (v[0] & 0xffff0000) \ + ^ (v[1] << 16) \ + ^ (v[1] >> 16) \ + ^ (v[1] & 0xffff0000) \ + ^ (v[2] << 16) \ + ^ v[2] \ + ^ (v[3] >> 16) \ + ^ v[3] \ + ^ (v[4] << 16) \ + ^ (v[4] >> 16) \ + ^ v[4] \ + ^ (v[5] << 16) \ + ^ (v[6] << 16) \ + ^ (v[6] >> 16) \ + ^ v[6] \ + ^ (v[7] << 16) \ + ^ (v[7] >> 16) \ + ^ (v[7] & 0xffff0000); \ + h[6] = v[0] \ + ^ v[2] \ + ^ (v[2] >> 16) \ + ^ v[3] \ + ^ (v[3] << 16) \ + ^ v[4] \ + ^ (v[4] >> 16) \ + ^ (v[5] << 16) \ + ^ (v[5] >> 16) \ + ^ v[5] \ + ^ (v[6] << 16) \ + ^ (v[6] >> 16) \ + ^ v[6] \ + ^ (v[7] << 16) \ + ^ v[7]; \ + h[7] = v[0] \ + ^ (v[0] >> 16) \ + ^ (v[1] << 16) \ + ^ (v[1] >> 16) \ + ^ (v[2] << 16) \ + ^ (v[3] >> 16) \ + ^ v[3] \ + ^ (v[4] << 16) \ + ^ v[4] \ + ^ (v[5] >> 16) \ + ^ v[5] \ + ^ (v[6] << 16) \ + ^ (v[6] >> 16) \ + ^ (v[7] << 16) \ + ^ v[7]; + +#define PASS0(h,s,u,v,t) \ +{ \ + u32x k[8]; \ + u32x w[8]; \ + X (w, u, v); \ + P (k, w); \ + R (k, h, s, 0, t); \ + A (u); \ + AA (v); \ +} + +#define PASS2(h,s,u,v,t) \ +{ \ + u32x k[8]; \ + u32x w[8]; \ + X (w, u, v); \ + P (k, w); \ + R (k, h, s, 2, t); \ + A (u); \ + C (u); \ + AA (v); \ +} + +#define PASS4(h,s,u,v,t) \ +{ \ + u32x k[8]; \ + u32x w[8]; \ + X (w, u, v); \ + P (k, w); \ + R (k, h, s, 4, t); \ + A (u); \ + AA (v); \ +} + +#define PASS6(h,s,u,v,t) \ +{ \ + u32x k[8]; \ + u32x w[8]; \ + X (w, u, v); \ + P (k, w); \ + R (k, h, s, 6, t); \ +} + +__device__ __constant__ u32 c_tables[4][256] = +{ + { + 0x00072000, 0x00075000, 0x00074800, 0x00071000, + 0x00076800, 0x00074000, 0x00070000, 0x00077000, + 0x00073000, 0x00075800, 0x00070800, 0x00076000, + 0x00073800, 0x00077800, 0x00072800, 0x00071800, + 0x0005a000, 0x0005d000, 0x0005c800, 0x00059000, + 0x0005e800, 0x0005c000, 0x00058000, 0x0005f000, + 0x0005b000, 0x0005d800, 0x00058800, 0x0005e000, + 0x0005b800, 0x0005f800, 0x0005a800, 0x00059800, + 0x00022000, 0x00025000, 0x00024800, 0x00021000, + 0x00026800, 0x00024000, 0x00020000, 0x00027000, + 0x00023000, 0x00025800, 0x00020800, 0x00026000, + 0x00023800, 0x00027800, 0x00022800, 0x00021800, + 0x00062000, 0x00065000, 0x00064800, 0x00061000, + 0x00066800, 0x00064000, 0x00060000, 0x00067000, + 0x00063000, 0x00065800, 0x00060800, 0x00066000, + 0x00063800, 0x00067800, 0x00062800, 0x00061800, + 0x00032000, 0x00035000, 0x00034800, 0x00031000, + 0x00036800, 0x00034000, 0x00030000, 0x00037000, + 0x00033000, 0x00035800, 0x00030800, 0x00036000, + 0x00033800, 0x00037800, 0x00032800, 0x00031800, + 0x0006a000, 0x0006d000, 0x0006c800, 0x00069000, + 0x0006e800, 0x0006c000, 0x00068000, 0x0006f000, + 0x0006b000, 0x0006d800, 0x00068800, 0x0006e000, + 0x0006b800, 0x0006f800, 0x0006a800, 0x00069800, + 0x0007a000, 0x0007d000, 0x0007c800, 0x00079000, + 0x0007e800, 0x0007c000, 0x00078000, 0x0007f000, + 0x0007b000, 0x0007d800, 0x00078800, 0x0007e000, + 0x0007b800, 0x0007f800, 0x0007a800, 0x00079800, + 0x00052000, 0x00055000, 0x00054800, 0x00051000, + 0x00056800, 0x00054000, 0x00050000, 0x00057000, + 0x00053000, 0x00055800, 0x00050800, 0x00056000, + 0x00053800, 0x00057800, 0x00052800, 0x00051800, + 0x00012000, 0x00015000, 0x00014800, 0x00011000, + 0x00016800, 0x00014000, 0x00010000, 0x00017000, + 0x00013000, 0x00015800, 0x00010800, 0x00016000, + 0x00013800, 0x00017800, 0x00012800, 0x00011800, + 0x0001a000, 0x0001d000, 0x0001c800, 0x00019000, + 0x0001e800, 0x0001c000, 0x00018000, 0x0001f000, + 0x0001b000, 0x0001d800, 0x00018800, 0x0001e000, + 0x0001b800, 0x0001f800, 0x0001a800, 0x00019800, + 0x00042000, 0x00045000, 0x00044800, 0x00041000, + 0x00046800, 0x00044000, 0x00040000, 0x00047000, + 0x00043000, 0x00045800, 0x00040800, 0x00046000, + 0x00043800, 0x00047800, 0x00042800, 0x00041800, + 0x0000a000, 0x0000d000, 0x0000c800, 0x00009000, + 0x0000e800, 0x0000c000, 0x00008000, 0x0000f000, + 0x0000b000, 0x0000d800, 0x00008800, 0x0000e000, + 0x0000b800, 0x0000f800, 0x0000a800, 0x00009800, + 0x00002000, 0x00005000, 0x00004800, 0x00001000, + 0x00006800, 0x00004000, 0x00000000, 0x00007000, + 0x00003000, 0x00005800, 0x00000800, 0x00006000, + 0x00003800, 0x00007800, 0x00002800, 0x00001800, + 0x0003a000, 0x0003d000, 0x0003c800, 0x00039000, + 0x0003e800, 0x0003c000, 0x00038000, 0x0003f000, + 0x0003b000, 0x0003d800, 0x00038800, 0x0003e000, + 0x0003b800, 0x0003f800, 0x0003a800, 0x00039800, + 0x0002a000, 0x0002d000, 0x0002c800, 0x00029000, + 0x0002e800, 0x0002c000, 0x00028000, 0x0002f000, + 0x0002b000, 0x0002d800, 0x00028800, 0x0002e000, + 0x0002b800, 0x0002f800, 0x0002a800, 0x00029800, + 0x0004a000, 0x0004d000, 0x0004c800, 0x00049000, + 0x0004e800, 0x0004c000, 0x00048000, 0x0004f000, + 0x0004b000, 0x0004d800, 0x00048800, 0x0004e000, + 0x0004b800, 0x0004f800, 0x0004a800, 0x00049800, + }, + { + 0x03a80000, 0x03c00000, 0x03880000, 0x03e80000, + 0x03d00000, 0x03980000, 0x03a00000, 0x03900000, + 0x03f00000, 0x03f80000, 0x03e00000, 0x03b80000, + 0x03b00000, 0x03800000, 0x03c80000, 0x03d80000, + 0x06a80000, 0x06c00000, 0x06880000, 0x06e80000, + 0x06d00000, 0x06980000, 0x06a00000, 0x06900000, + 0x06f00000, 0x06f80000, 0x06e00000, 0x06b80000, + 0x06b00000, 0x06800000, 0x06c80000, 0x06d80000, + 0x05280000, 0x05400000, 0x05080000, 0x05680000, + 0x05500000, 0x05180000, 0x05200000, 0x05100000, + 0x05700000, 0x05780000, 0x05600000, 0x05380000, + 0x05300000, 0x05000000, 0x05480000, 0x05580000, + 0x00a80000, 0x00c00000, 0x00880000, 0x00e80000, + 0x00d00000, 0x00980000, 0x00a00000, 0x00900000, + 0x00f00000, 0x00f80000, 0x00e00000, 0x00b80000, + 0x00b00000, 0x00800000, 0x00c80000, 0x00d80000, + 0x00280000, 0x00400000, 0x00080000, 0x00680000, + 0x00500000, 0x00180000, 0x00200000, 0x00100000, + 0x00700000, 0x00780000, 0x00600000, 0x00380000, + 0x00300000, 0x00000000, 0x00480000, 0x00580000, + 0x04280000, 0x04400000, 0x04080000, 0x04680000, + 0x04500000, 0x04180000, 0x04200000, 0x04100000, + 0x04700000, 0x04780000, 0x04600000, 0x04380000, + 0x04300000, 0x04000000, 0x04480000, 0x04580000, + 0x04a80000, 0x04c00000, 0x04880000, 0x04e80000, + 0x04d00000, 0x04980000, 0x04a00000, 0x04900000, + 0x04f00000, 0x04f80000, 0x04e00000, 0x04b80000, + 0x04b00000, 0x04800000, 0x04c80000, 0x04d80000, + 0x07a80000, 0x07c00000, 0x07880000, 0x07e80000, + 0x07d00000, 0x07980000, 0x07a00000, 0x07900000, + 0x07f00000, 0x07f80000, 0x07e00000, 0x07b80000, + 0x07b00000, 0x07800000, 0x07c80000, 0x07d80000, + 0x07280000, 0x07400000, 0x07080000, 0x07680000, + 0x07500000, 0x07180000, 0x07200000, 0x07100000, + 0x07700000, 0x07780000, 0x07600000, 0x07380000, + 0x07300000, 0x07000000, 0x07480000, 0x07580000, + 0x02280000, 0x02400000, 0x02080000, 0x02680000, + 0x02500000, 0x02180000, 0x02200000, 0x02100000, + 0x02700000, 0x02780000, 0x02600000, 0x02380000, + 0x02300000, 0x02000000, 0x02480000, 0x02580000, + 0x03280000, 0x03400000, 0x03080000, 0x03680000, + 0x03500000, 0x03180000, 0x03200000, 0x03100000, + 0x03700000, 0x03780000, 0x03600000, 0x03380000, + 0x03300000, 0x03000000, 0x03480000, 0x03580000, + 0x06280000, 0x06400000, 0x06080000, 0x06680000, + 0x06500000, 0x06180000, 0x06200000, 0x06100000, + 0x06700000, 0x06780000, 0x06600000, 0x06380000, + 0x06300000, 0x06000000, 0x06480000, 0x06580000, + 0x05a80000, 0x05c00000, 0x05880000, 0x05e80000, + 0x05d00000, 0x05980000, 0x05a00000, 0x05900000, + 0x05f00000, 0x05f80000, 0x05e00000, 0x05b80000, + 0x05b00000, 0x05800000, 0x05c80000, 0x05d80000, + 0x01280000, 0x01400000, 0x01080000, 0x01680000, + 0x01500000, 0x01180000, 0x01200000, 0x01100000, + 0x01700000, 0x01780000, 0x01600000, 0x01380000, + 0x01300000, 0x01000000, 0x01480000, 0x01580000, + 0x02a80000, 0x02c00000, 0x02880000, 0x02e80000, + 0x02d00000, 0x02980000, 0x02a00000, 0x02900000, + 0x02f00000, 0x02f80000, 0x02e00000, 0x02b80000, + 0x02b00000, 0x02800000, 0x02c80000, 0x02d80000, + 0x01a80000, 0x01c00000, 0x01880000, 0x01e80000, + 0x01d00000, 0x01980000, 0x01a00000, 0x01900000, + 0x01f00000, 0x01f80000, 0x01e00000, 0x01b80000, + 0x01b00000, 0x01800000, 0x01c80000, 0x01d80000, + }, + { + 0x30000002, 0x60000002, 0x38000002, 0x08000002, + 0x28000002, 0x78000002, 0x68000002, 0x40000002, + 0x20000002, 0x50000002, 0x48000002, 0x70000002, + 0x00000002, 0x18000002, 0x58000002, 0x10000002, + 0xb0000005, 0xe0000005, 0xb8000005, 0x88000005, + 0xa8000005, 0xf8000005, 0xe8000005, 0xc0000005, + 0xa0000005, 0xd0000005, 0xc8000005, 0xf0000005, + 0x80000005, 0x98000005, 0xd8000005, 0x90000005, + 0x30000005, 0x60000005, 0x38000005, 0x08000005, + 0x28000005, 0x78000005, 0x68000005, 0x40000005, + 0x20000005, 0x50000005, 0x48000005, 0x70000005, + 0x00000005, 0x18000005, 0x58000005, 0x10000005, + 0x30000000, 0x60000000, 0x38000000, 0x08000000, + 0x28000000, 0x78000000, 0x68000000, 0x40000000, + 0x20000000, 0x50000000, 0x48000000, 0x70000000, + 0x00000000, 0x18000000, 0x58000000, 0x10000000, + 0xb0000003, 0xe0000003, 0xb8000003, 0x88000003, + 0xa8000003, 0xf8000003, 0xe8000003, 0xc0000003, + 0xa0000003, 0xd0000003, 0xc8000003, 0xf0000003, + 0x80000003, 0x98000003, 0xd8000003, 0x90000003, + 0x30000001, 0x60000001, 0x38000001, 0x08000001, + 0x28000001, 0x78000001, 0x68000001, 0x40000001, + 0x20000001, 0x50000001, 0x48000001, 0x70000001, + 0x00000001, 0x18000001, 0x58000001, 0x10000001, + 0xb0000000, 0xe0000000, 0xb8000000, 0x88000000, + 0xa8000000, 0xf8000000, 0xe8000000, 0xc0000000, + 0xa0000000, 0xd0000000, 0xc8000000, 0xf0000000, + 0x80000000, 0x98000000, 0xd8000000, 0x90000000, + 0xb0000006, 0xe0000006, 0xb8000006, 0x88000006, + 0xa8000006, 0xf8000006, 0xe8000006, 0xc0000006, + 0xa0000006, 0xd0000006, 0xc8000006, 0xf0000006, + 0x80000006, 0x98000006, 0xd8000006, 0x90000006, + 0xb0000001, 0xe0000001, 0xb8000001, 0x88000001, + 0xa8000001, 0xf8000001, 0xe8000001, 0xc0000001, + 0xa0000001, 0xd0000001, 0xc8000001, 0xf0000001, + 0x80000001, 0x98000001, 0xd8000001, 0x90000001, + 0x30000003, 0x60000003, 0x38000003, 0x08000003, + 0x28000003, 0x78000003, 0x68000003, 0x40000003, + 0x20000003, 0x50000003, 0x48000003, 0x70000003, + 0x00000003, 0x18000003, 0x58000003, 0x10000003, + 0x30000004, 0x60000004, 0x38000004, 0x08000004, + 0x28000004, 0x78000004, 0x68000004, 0x40000004, + 0x20000004, 0x50000004, 0x48000004, 0x70000004, + 0x00000004, 0x18000004, 0x58000004, 0x10000004, + 0xb0000002, 0xe0000002, 0xb8000002, 0x88000002, + 0xa8000002, 0xf8000002, 0xe8000002, 0xc0000002, + 0xa0000002, 0xd0000002, 0xc8000002, 0xf0000002, + 0x80000002, 0x98000002, 0xd8000002, 0x90000002, + 0xb0000004, 0xe0000004, 0xb8000004, 0x88000004, + 0xa8000004, 0xf8000004, 0xe8000004, 0xc0000004, + 0xa0000004, 0xd0000004, 0xc8000004, 0xf0000004, + 0x80000004, 0x98000004, 0xd8000004, 0x90000004, + 0x30000006, 0x60000006, 0x38000006, 0x08000006, + 0x28000006, 0x78000006, 0x68000006, 0x40000006, + 0x20000006, 0x50000006, 0x48000006, 0x70000006, + 0x00000006, 0x18000006, 0x58000006, 0x10000006, + 0xb0000007, 0xe0000007, 0xb8000007, 0x88000007, + 0xa8000007, 0xf8000007, 0xe8000007, 0xc0000007, + 0xa0000007, 0xd0000007, 0xc8000007, 0xf0000007, + 0x80000007, 0x98000007, 0xd8000007, 0x90000007, + 0x30000007, 0x60000007, 0x38000007, 0x08000007, + 0x28000007, 0x78000007, 0x68000007, 0x40000007, + 0x20000007, 0x50000007, 0x48000007, 0x70000007, + 0x00000007, 0x18000007, 0x58000007, 0x10000007, + }, + { + 0x000000e8, 0x000000d8, 0x000000a0, 0x00000088, + 0x00000098, 0x000000f8, 0x000000a8, 0x000000c8, + 0x00000080, 0x000000d0, 0x000000f0, 0x000000b8, + 0x000000b0, 0x000000c0, 0x00000090, 0x000000e0, + 0x000007e8, 0x000007d8, 0x000007a0, 0x00000788, + 0x00000798, 0x000007f8, 0x000007a8, 0x000007c8, + 0x00000780, 0x000007d0, 0x000007f0, 0x000007b8, + 0x000007b0, 0x000007c0, 0x00000790, 0x000007e0, + 0x000006e8, 0x000006d8, 0x000006a0, 0x00000688, + 0x00000698, 0x000006f8, 0x000006a8, 0x000006c8, + 0x00000680, 0x000006d0, 0x000006f0, 0x000006b8, + 0x000006b0, 0x000006c0, 0x00000690, 0x000006e0, + 0x00000068, 0x00000058, 0x00000020, 0x00000008, + 0x00000018, 0x00000078, 0x00000028, 0x00000048, + 0x00000000, 0x00000050, 0x00000070, 0x00000038, + 0x00000030, 0x00000040, 0x00000010, 0x00000060, + 0x000002e8, 0x000002d8, 0x000002a0, 0x00000288, + 0x00000298, 0x000002f8, 0x000002a8, 0x000002c8, + 0x00000280, 0x000002d0, 0x000002f0, 0x000002b8, + 0x000002b0, 0x000002c0, 0x00000290, 0x000002e0, + 0x000003e8, 0x000003d8, 0x000003a0, 0x00000388, + 0x00000398, 0x000003f8, 0x000003a8, 0x000003c8, + 0x00000380, 0x000003d0, 0x000003f0, 0x000003b8, + 0x000003b0, 0x000003c0, 0x00000390, 0x000003e0, + 0x00000568, 0x00000558, 0x00000520, 0x00000508, + 0x00000518, 0x00000578, 0x00000528, 0x00000548, + 0x00000500, 0x00000550, 0x00000570, 0x00000538, + 0x00000530, 0x00000540, 0x00000510, 0x00000560, + 0x00000268, 0x00000258, 0x00000220, 0x00000208, + 0x00000218, 0x00000278, 0x00000228, 0x00000248, + 0x00000200, 0x00000250, 0x00000270, 0x00000238, + 0x00000230, 0x00000240, 0x00000210, 0x00000260, + 0x000004e8, 0x000004d8, 0x000004a0, 0x00000488, + 0x00000498, 0x000004f8, 0x000004a8, 0x000004c8, + 0x00000480, 0x000004d0, 0x000004f0, 0x000004b8, + 0x000004b0, 0x000004c0, 0x00000490, 0x000004e0, + 0x00000168, 0x00000158, 0x00000120, 0x00000108, + 0x00000118, 0x00000178, 0x00000128, 0x00000148, + 0x00000100, 0x00000150, 0x00000170, 0x00000138, + 0x00000130, 0x00000140, 0x00000110, 0x00000160, + 0x000001e8, 0x000001d8, 0x000001a0, 0x00000188, + 0x00000198, 0x000001f8, 0x000001a8, 0x000001c8, + 0x00000180, 0x000001d0, 0x000001f0, 0x000001b8, + 0x000001b0, 0x000001c0, 0x00000190, 0x000001e0, + 0x00000768, 0x00000758, 0x00000720, 0x00000708, + 0x00000718, 0x00000778, 0x00000728, 0x00000748, + 0x00000700, 0x00000750, 0x00000770, 0x00000738, + 0x00000730, 0x00000740, 0x00000710, 0x00000760, + 0x00000368, 0x00000358, 0x00000320, 0x00000308, + 0x00000318, 0x00000378, 0x00000328, 0x00000348, + 0x00000300, 0x00000350, 0x00000370, 0x00000338, + 0x00000330, 0x00000340, 0x00000310, 0x00000360, + 0x000005e8, 0x000005d8, 0x000005a0, 0x00000588, + 0x00000598, 0x000005f8, 0x000005a8, 0x000005c8, + 0x00000580, 0x000005d0, 0x000005f0, 0x000005b8, + 0x000005b0, 0x000005c0, 0x00000590, 0x000005e0, + 0x00000468, 0x00000458, 0x00000420, 0x00000408, + 0x00000418, 0x00000478, 0x00000428, 0x00000448, + 0x00000400, 0x00000450, 0x00000470, 0x00000438, + 0x00000430, 0x00000440, 0x00000410, 0x00000460, + 0x00000668, 0x00000658, 0x00000620, 0x00000608, + 0x00000618, 0x00000678, 0x00000628, 0x00000648, + 0x00000600, 0x00000650, 0x00000670, 0x00000638, + 0x00000630, 0x00000640, 0x00000610, 0x00000660, + } +}; + +__device__ __constant__ gpu_rule_t c_rules[1024]; + +extern "C" __global__ void __launch_bounds__ (256, 1) m06900_m04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + u32x pw_buf1[4]; + + pw_buf1[0] = pws[gid].i[ 4]; + pw_buf1[1] = pws[gid].i[ 5]; + pw_buf1[2] = pws[gid].i[ 6]; + pw_buf1[3] = pws[gid].i[ 7]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * sbox + */ + + __shared__ u32 s_tables[4][256]; + + s_tables[0][lid] = c_tables[0][lid]; + s_tables[1][lid] = c_tables[1][lid]; + s_tables[2][lid] = c_tables[2][lid]; + s_tables[3][lid] = c_tables[3][lid]; + + __syncthreads (); + + if (gid >= gid_max) return; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + + w0[0] = pw_buf0[0]; + w0[1] = pw_buf0[1]; + w0[2] = pw_buf0[2]; + w0[3] = pw_buf0[3]; + + u32x w1[4]; + + w1[0] = pw_buf1[0]; + w1[1] = pw_buf1[1]; + w1[2] = pw_buf1[2]; + w1[3] = pw_buf1[3]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 out_len = apply_rules (c_rules[il_pos].cmds, w0, w1, pw_len); + + u32 w14 = out_len * 8; + + u32x data[8]; + + data[0] = w0[0]; + data[1] = w0[1]; + data[2] = w0[2]; + data[3] = w0[3]; + data[4] = w1[0]; + data[5] = w1[1]; + data[6] = w1[2]; + data[7] = w1[3]; + + u32x state[16]; + + state[ 0] = 0; + state[ 1] = 0; + state[ 2] = 0; + state[ 3] = 0; + state[ 4] = 0; + state[ 5] = 0; + state[ 6] = 0; + state[ 7] = 0; + state[ 8] = data[0]; + state[ 9] = data[1]; + state[10] = data[2]; + state[11] = data[3]; + state[12] = data[4]; + state[13] = data[5]; + state[14] = data[6]; + state[15] = data[7]; + + u32x state_m[8]; + u32x data_m[8]; + + /* gost1 */ + + state_m[0] = state[0]; + state_m[1] = state[1]; + state_m[2] = state[2]; + state_m[3] = state[3]; + state_m[4] = state[4]; + state_m[5] = state[5]; + state_m[6] = state[6]; + state_m[7] = state[7]; + + data_m[0] = data[0]; + data_m[1] = data[1]; + data_m[2] = data[2]; + data_m[3] = data[3]; + data_m[4] = data[4]; + data_m[5] = data[5]; + data_m[6] = data[6]; + data_m[7] = data[7]; + + u32x tmp[8]; + + PASS0 (state, tmp, state_m, data_m, s_tables); + PASS2 (state, tmp, state_m, data_m, s_tables); + PASS4 (state, tmp, state_m, data_m, s_tables); + PASS6 (state, tmp, state_m, data_m, s_tables); + + SHIFT12 (state_m, data, tmp); + SHIFT16 (state, data_m, state_m); + SHIFT61 (state, data_m); + + data[0] = w14; + data[1] = 0; + data[2] = 0; + data[3] = 0; + data[4] = 0; + data[5] = 0; + data[6] = 0; + data[7] = 0; + + /* gost2 */ + + state_m[0] = state[0]; + state_m[1] = state[1]; + state_m[2] = state[2]; + state_m[3] = state[3]; + state_m[4] = state[4]; + state_m[5] = state[5]; + state_m[6] = state[6]; + state_m[7] = state[7]; + + data_m[0] = data[0]; + data_m[1] = data[1]; + data_m[2] = data[2]; + data_m[3] = data[3]; + data_m[4] = data[4]; + data_m[5] = data[5]; + data_m[6] = data[6]; + data_m[7] = data[7]; + + PASS0 (state, tmp, state_m, data_m, s_tables); + PASS2 (state, tmp, state_m, data_m, s_tables); + PASS4 (state, tmp, state_m, data_m, s_tables); + PASS6 (state, tmp, state_m, data_m, s_tables); + + SHIFT12 (state_m, data, tmp); + SHIFT16 (state, data_m, state_m); + SHIFT61 (state, data_m); + + /* gost3 */ + + data[0] = state[ 8]; + data[1] = state[ 9]; + data[2] = state[10]; + data[3] = state[11]; + data[4] = state[12]; + data[5] = state[13]; + data[6] = state[14]; + data[7] = state[15]; + + state_m[0] = state[0]; + state_m[1] = state[1]; + state_m[2] = state[2]; + state_m[3] = state[3]; + state_m[4] = state[4]; + state_m[5] = state[5]; + state_m[6] = state[6]; + state_m[7] = state[7]; + + data_m[0] = data[0]; + data_m[1] = data[1]; + data_m[2] = data[2]; + data_m[3] = data[3]; + data_m[4] = data[4]; + data_m[5] = data[5]; + data_m[6] = data[6]; + data_m[7] = data[7]; + + PASS0 (state, tmp, state_m, data_m, s_tables); + PASS2 (state, tmp, state_m, data_m, s_tables); + PASS4 (state, tmp, state_m, data_m, s_tables); + PASS6 (state, tmp, state_m, data_m, s_tables); + + SHIFT12 (state_m, data, tmp); + SHIFT16 (state, data_m, state_m); + SHIFT61 (state, data_m); + + /* store */ + + const u32x r0 = state[0]; + const u32x r1 = state[1]; + const u32x r2 = state[2]; + const u32x r3 = state[3]; + + #include VECT_COMPARE_M + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m06900_m08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m06900_m16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m06900_s04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + u32x pw_buf1[4]; + + pw_buf1[0] = pws[gid].i[ 4]; + pw_buf1[1] = pws[gid].i[ 5]; + pw_buf1[2] = pws[gid].i[ 6]; + pw_buf1[3] = pws[gid].i[ 7]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * sbox + */ + + __shared__ u32 s_tables[4][256]; + + s_tables[0][lid] = c_tables[0][lid]; + s_tables[1][lid] = c_tables[1][lid]; + s_tables[2][lid] = c_tables[2][lid]; + s_tables[3][lid] = c_tables[3][lid]; + + __syncthreads (); + + if (gid >= gid_max) return; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + + w0[0] = pw_buf0[0]; + w0[1] = pw_buf0[1]; + w0[2] = pw_buf0[2]; + w0[3] = pw_buf0[3]; + + u32x w1[4]; + + w1[0] = pw_buf1[0]; + w1[1] = pw_buf1[1]; + w1[2] = pw_buf1[2]; + w1[3] = pw_buf1[3]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 out_len = apply_rules (c_rules[il_pos].cmds, w0, w1, pw_len); + + u32 w14 = out_len * 8; + + u32x data[8]; + + data[0] = w0[0]; + data[1] = w0[1]; + data[2] = w0[2]; + data[3] = w0[3]; + data[4] = w1[0]; + data[5] = w1[1]; + data[6] = w1[2]; + data[7] = w1[3]; + + u32x state[16]; + + state[ 0] = 0; + state[ 1] = 0; + state[ 2] = 0; + state[ 3] = 0; + state[ 4] = 0; + state[ 5] = 0; + state[ 6] = 0; + state[ 7] = 0; + state[ 8] = data[0]; + state[ 9] = data[1]; + state[10] = data[2]; + state[11] = data[3]; + state[12] = data[4]; + state[13] = data[5]; + state[14] = data[6]; + state[15] = data[7]; + + u32x state_m[8]; + u32x data_m[8]; + + /* gost1 */ + + state_m[0] = state[0]; + state_m[1] = state[1]; + state_m[2] = state[2]; + state_m[3] = state[3]; + state_m[4] = state[4]; + state_m[5] = state[5]; + state_m[6] = state[6]; + state_m[7] = state[7]; + + data_m[0] = data[0]; + data_m[1] = data[1]; + data_m[2] = data[2]; + data_m[3] = data[3]; + data_m[4] = data[4]; + data_m[5] = data[5]; + data_m[6] = data[6]; + data_m[7] = data[7]; + + u32x tmp[8]; + + PASS0 (state, tmp, state_m, data_m, s_tables); + PASS2 (state, tmp, state_m, data_m, s_tables); + PASS4 (state, tmp, state_m, data_m, s_tables); + PASS6 (state, tmp, state_m, data_m, s_tables); + + SHIFT12 (state_m, data, tmp); + SHIFT16 (state, data_m, state_m); + SHIFT61 (state, data_m); + + data[0] = w14; + data[1] = 0; + data[2] = 0; + data[3] = 0; + data[4] = 0; + data[5] = 0; + data[6] = 0; + data[7] = 0; + + /* gost2 */ + + state_m[0] = state[0]; + state_m[1] = state[1]; + state_m[2] = state[2]; + state_m[3] = state[3]; + state_m[4] = state[4]; + state_m[5] = state[5]; + state_m[6] = state[6]; + state_m[7] = state[7]; + + data_m[0] = data[0]; + data_m[1] = data[1]; + data_m[2] = data[2]; + data_m[3] = data[3]; + data_m[4] = data[4]; + data_m[5] = data[5]; + data_m[6] = data[6]; + data_m[7] = data[7]; + + PASS0 (state, tmp, state_m, data_m, s_tables); + PASS2 (state, tmp, state_m, data_m, s_tables); + PASS4 (state, tmp, state_m, data_m, s_tables); + PASS6 (state, tmp, state_m, data_m, s_tables); + + SHIFT12 (state_m, data, tmp); + SHIFT16 (state, data_m, state_m); + SHIFT61 (state, data_m); + + /* gost3 */ + + data[0] = state[ 8]; + data[1] = state[ 9]; + data[2] = state[10]; + data[3] = state[11]; + data[4] = state[12]; + data[5] = state[13]; + data[6] = state[14]; + data[7] = state[15]; + + state_m[0] = state[0]; + state_m[1] = state[1]; + state_m[2] = state[2]; + state_m[3] = state[3]; + state_m[4] = state[4]; + state_m[5] = state[5]; + state_m[6] = state[6]; + state_m[7] = state[7]; + + data_m[0] = data[0]; + data_m[1] = data[1]; + data_m[2] = data[2]; + data_m[3] = data[3]; + data_m[4] = data[4]; + data_m[5] = data[5]; + data_m[6] = data[6]; + data_m[7] = data[7]; + + PASS0 (state, tmp, state_m, data_m, s_tables); + PASS2 (state, tmp, state_m, data_m, s_tables); + PASS4 (state, tmp, state_m, data_m, s_tables); + PASS6 (state, tmp, state_m, data_m, s_tables); + + SHIFT12 (state_m, data, tmp); + SHIFT16 (state, data_m, state_m); + SHIFT61 (state, data_m); + + /* store */ + + const u32x r0 = state[0]; + const u32x r1 = state[1]; + const u32x r2 = state[2]; + const u32x r3 = state[3]; + + #include VECT_COMPARE_S + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m06900_s08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m06900_s16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/nv/m06900_a1.cu b/nv/m06900_a1.cu new file mode 100644 index 0000000000..339a0a1178 --- /dev/null +++ b/nv/m06900_a1.cu @@ -0,0 +1,1321 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _GOST_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW2 +#define VECT_SIZE1 +#endif + +#define DGST_R0 0 +#define DGST_R1 1 +#define DGST_R2 2 +#define DGST_R3 3 + +#include "include/kernel_functions.c" +#include "types_nv.c" +#include "common_nv.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +__device__ __constant__ u32 c_tables[4][256] = +{ + { + 0x00072000, 0x00075000, 0x00074800, 0x00071000, + 0x00076800, 0x00074000, 0x00070000, 0x00077000, + 0x00073000, 0x00075800, 0x00070800, 0x00076000, + 0x00073800, 0x00077800, 0x00072800, 0x00071800, + 0x0005a000, 0x0005d000, 0x0005c800, 0x00059000, + 0x0005e800, 0x0005c000, 0x00058000, 0x0005f000, + 0x0005b000, 0x0005d800, 0x00058800, 0x0005e000, + 0x0005b800, 0x0005f800, 0x0005a800, 0x00059800, + 0x00022000, 0x00025000, 0x00024800, 0x00021000, + 0x00026800, 0x00024000, 0x00020000, 0x00027000, + 0x00023000, 0x00025800, 0x00020800, 0x00026000, + 0x00023800, 0x00027800, 0x00022800, 0x00021800, + 0x00062000, 0x00065000, 0x00064800, 0x00061000, + 0x00066800, 0x00064000, 0x00060000, 0x00067000, + 0x00063000, 0x00065800, 0x00060800, 0x00066000, + 0x00063800, 0x00067800, 0x00062800, 0x00061800, + 0x00032000, 0x00035000, 0x00034800, 0x00031000, + 0x00036800, 0x00034000, 0x00030000, 0x00037000, + 0x00033000, 0x00035800, 0x00030800, 0x00036000, + 0x00033800, 0x00037800, 0x00032800, 0x00031800, + 0x0006a000, 0x0006d000, 0x0006c800, 0x00069000, + 0x0006e800, 0x0006c000, 0x00068000, 0x0006f000, + 0x0006b000, 0x0006d800, 0x00068800, 0x0006e000, + 0x0006b800, 0x0006f800, 0x0006a800, 0x00069800, + 0x0007a000, 0x0007d000, 0x0007c800, 0x00079000, + 0x0007e800, 0x0007c000, 0x00078000, 0x0007f000, + 0x0007b000, 0x0007d800, 0x00078800, 0x0007e000, + 0x0007b800, 0x0007f800, 0x0007a800, 0x00079800, + 0x00052000, 0x00055000, 0x00054800, 0x00051000, + 0x00056800, 0x00054000, 0x00050000, 0x00057000, + 0x00053000, 0x00055800, 0x00050800, 0x00056000, + 0x00053800, 0x00057800, 0x00052800, 0x00051800, + 0x00012000, 0x00015000, 0x00014800, 0x00011000, + 0x00016800, 0x00014000, 0x00010000, 0x00017000, + 0x00013000, 0x00015800, 0x00010800, 0x00016000, + 0x00013800, 0x00017800, 0x00012800, 0x00011800, + 0x0001a000, 0x0001d000, 0x0001c800, 0x00019000, + 0x0001e800, 0x0001c000, 0x00018000, 0x0001f000, + 0x0001b000, 0x0001d800, 0x00018800, 0x0001e000, + 0x0001b800, 0x0001f800, 0x0001a800, 0x00019800, + 0x00042000, 0x00045000, 0x00044800, 0x00041000, + 0x00046800, 0x00044000, 0x00040000, 0x00047000, + 0x00043000, 0x00045800, 0x00040800, 0x00046000, + 0x00043800, 0x00047800, 0x00042800, 0x00041800, + 0x0000a000, 0x0000d000, 0x0000c800, 0x00009000, + 0x0000e800, 0x0000c000, 0x00008000, 0x0000f000, + 0x0000b000, 0x0000d800, 0x00008800, 0x0000e000, + 0x0000b800, 0x0000f800, 0x0000a800, 0x00009800, + 0x00002000, 0x00005000, 0x00004800, 0x00001000, + 0x00006800, 0x00004000, 0x00000000, 0x00007000, + 0x00003000, 0x00005800, 0x00000800, 0x00006000, + 0x00003800, 0x00007800, 0x00002800, 0x00001800, + 0x0003a000, 0x0003d000, 0x0003c800, 0x00039000, + 0x0003e800, 0x0003c000, 0x00038000, 0x0003f000, + 0x0003b000, 0x0003d800, 0x00038800, 0x0003e000, + 0x0003b800, 0x0003f800, 0x0003a800, 0x00039800, + 0x0002a000, 0x0002d000, 0x0002c800, 0x00029000, + 0x0002e800, 0x0002c000, 0x00028000, 0x0002f000, + 0x0002b000, 0x0002d800, 0x00028800, 0x0002e000, + 0x0002b800, 0x0002f800, 0x0002a800, 0x00029800, + 0x0004a000, 0x0004d000, 0x0004c800, 0x00049000, + 0x0004e800, 0x0004c000, 0x00048000, 0x0004f000, + 0x0004b000, 0x0004d800, 0x00048800, 0x0004e000, + 0x0004b800, 0x0004f800, 0x0004a800, 0x00049800, + }, + { + 0x03a80000, 0x03c00000, 0x03880000, 0x03e80000, + 0x03d00000, 0x03980000, 0x03a00000, 0x03900000, + 0x03f00000, 0x03f80000, 0x03e00000, 0x03b80000, + 0x03b00000, 0x03800000, 0x03c80000, 0x03d80000, + 0x06a80000, 0x06c00000, 0x06880000, 0x06e80000, + 0x06d00000, 0x06980000, 0x06a00000, 0x06900000, + 0x06f00000, 0x06f80000, 0x06e00000, 0x06b80000, + 0x06b00000, 0x06800000, 0x06c80000, 0x06d80000, + 0x05280000, 0x05400000, 0x05080000, 0x05680000, + 0x05500000, 0x05180000, 0x05200000, 0x05100000, + 0x05700000, 0x05780000, 0x05600000, 0x05380000, + 0x05300000, 0x05000000, 0x05480000, 0x05580000, + 0x00a80000, 0x00c00000, 0x00880000, 0x00e80000, + 0x00d00000, 0x00980000, 0x00a00000, 0x00900000, + 0x00f00000, 0x00f80000, 0x00e00000, 0x00b80000, + 0x00b00000, 0x00800000, 0x00c80000, 0x00d80000, + 0x00280000, 0x00400000, 0x00080000, 0x00680000, + 0x00500000, 0x00180000, 0x00200000, 0x00100000, + 0x00700000, 0x00780000, 0x00600000, 0x00380000, + 0x00300000, 0x00000000, 0x00480000, 0x00580000, + 0x04280000, 0x04400000, 0x04080000, 0x04680000, + 0x04500000, 0x04180000, 0x04200000, 0x04100000, + 0x04700000, 0x04780000, 0x04600000, 0x04380000, + 0x04300000, 0x04000000, 0x04480000, 0x04580000, + 0x04a80000, 0x04c00000, 0x04880000, 0x04e80000, + 0x04d00000, 0x04980000, 0x04a00000, 0x04900000, + 0x04f00000, 0x04f80000, 0x04e00000, 0x04b80000, + 0x04b00000, 0x04800000, 0x04c80000, 0x04d80000, + 0x07a80000, 0x07c00000, 0x07880000, 0x07e80000, + 0x07d00000, 0x07980000, 0x07a00000, 0x07900000, + 0x07f00000, 0x07f80000, 0x07e00000, 0x07b80000, + 0x07b00000, 0x07800000, 0x07c80000, 0x07d80000, + 0x07280000, 0x07400000, 0x07080000, 0x07680000, + 0x07500000, 0x07180000, 0x07200000, 0x07100000, + 0x07700000, 0x07780000, 0x07600000, 0x07380000, + 0x07300000, 0x07000000, 0x07480000, 0x07580000, + 0x02280000, 0x02400000, 0x02080000, 0x02680000, + 0x02500000, 0x02180000, 0x02200000, 0x02100000, + 0x02700000, 0x02780000, 0x02600000, 0x02380000, + 0x02300000, 0x02000000, 0x02480000, 0x02580000, + 0x03280000, 0x03400000, 0x03080000, 0x03680000, + 0x03500000, 0x03180000, 0x03200000, 0x03100000, + 0x03700000, 0x03780000, 0x03600000, 0x03380000, + 0x03300000, 0x03000000, 0x03480000, 0x03580000, + 0x06280000, 0x06400000, 0x06080000, 0x06680000, + 0x06500000, 0x06180000, 0x06200000, 0x06100000, + 0x06700000, 0x06780000, 0x06600000, 0x06380000, + 0x06300000, 0x06000000, 0x06480000, 0x06580000, + 0x05a80000, 0x05c00000, 0x05880000, 0x05e80000, + 0x05d00000, 0x05980000, 0x05a00000, 0x05900000, + 0x05f00000, 0x05f80000, 0x05e00000, 0x05b80000, + 0x05b00000, 0x05800000, 0x05c80000, 0x05d80000, + 0x01280000, 0x01400000, 0x01080000, 0x01680000, + 0x01500000, 0x01180000, 0x01200000, 0x01100000, + 0x01700000, 0x01780000, 0x01600000, 0x01380000, + 0x01300000, 0x01000000, 0x01480000, 0x01580000, + 0x02a80000, 0x02c00000, 0x02880000, 0x02e80000, + 0x02d00000, 0x02980000, 0x02a00000, 0x02900000, + 0x02f00000, 0x02f80000, 0x02e00000, 0x02b80000, + 0x02b00000, 0x02800000, 0x02c80000, 0x02d80000, + 0x01a80000, 0x01c00000, 0x01880000, 0x01e80000, + 0x01d00000, 0x01980000, 0x01a00000, 0x01900000, + 0x01f00000, 0x01f80000, 0x01e00000, 0x01b80000, + 0x01b00000, 0x01800000, 0x01c80000, 0x01d80000, + }, + { + 0x30000002, 0x60000002, 0x38000002, 0x08000002, + 0x28000002, 0x78000002, 0x68000002, 0x40000002, + 0x20000002, 0x50000002, 0x48000002, 0x70000002, + 0x00000002, 0x18000002, 0x58000002, 0x10000002, + 0xb0000005, 0xe0000005, 0xb8000005, 0x88000005, + 0xa8000005, 0xf8000005, 0xe8000005, 0xc0000005, + 0xa0000005, 0xd0000005, 0xc8000005, 0xf0000005, + 0x80000005, 0x98000005, 0xd8000005, 0x90000005, + 0x30000005, 0x60000005, 0x38000005, 0x08000005, + 0x28000005, 0x78000005, 0x68000005, 0x40000005, + 0x20000005, 0x50000005, 0x48000005, 0x70000005, + 0x00000005, 0x18000005, 0x58000005, 0x10000005, + 0x30000000, 0x60000000, 0x38000000, 0x08000000, + 0x28000000, 0x78000000, 0x68000000, 0x40000000, + 0x20000000, 0x50000000, 0x48000000, 0x70000000, + 0x00000000, 0x18000000, 0x58000000, 0x10000000, + 0xb0000003, 0xe0000003, 0xb8000003, 0x88000003, + 0xa8000003, 0xf8000003, 0xe8000003, 0xc0000003, + 0xa0000003, 0xd0000003, 0xc8000003, 0xf0000003, + 0x80000003, 0x98000003, 0xd8000003, 0x90000003, + 0x30000001, 0x60000001, 0x38000001, 0x08000001, + 0x28000001, 0x78000001, 0x68000001, 0x40000001, + 0x20000001, 0x50000001, 0x48000001, 0x70000001, + 0x00000001, 0x18000001, 0x58000001, 0x10000001, + 0xb0000000, 0xe0000000, 0xb8000000, 0x88000000, + 0xa8000000, 0xf8000000, 0xe8000000, 0xc0000000, + 0xa0000000, 0xd0000000, 0xc8000000, 0xf0000000, + 0x80000000, 0x98000000, 0xd8000000, 0x90000000, + 0xb0000006, 0xe0000006, 0xb8000006, 0x88000006, + 0xa8000006, 0xf8000006, 0xe8000006, 0xc0000006, + 0xa0000006, 0xd0000006, 0xc8000006, 0xf0000006, + 0x80000006, 0x98000006, 0xd8000006, 0x90000006, + 0xb0000001, 0xe0000001, 0xb8000001, 0x88000001, + 0xa8000001, 0xf8000001, 0xe8000001, 0xc0000001, + 0xa0000001, 0xd0000001, 0xc8000001, 0xf0000001, + 0x80000001, 0x98000001, 0xd8000001, 0x90000001, + 0x30000003, 0x60000003, 0x38000003, 0x08000003, + 0x28000003, 0x78000003, 0x68000003, 0x40000003, + 0x20000003, 0x50000003, 0x48000003, 0x70000003, + 0x00000003, 0x18000003, 0x58000003, 0x10000003, + 0x30000004, 0x60000004, 0x38000004, 0x08000004, + 0x28000004, 0x78000004, 0x68000004, 0x40000004, + 0x20000004, 0x50000004, 0x48000004, 0x70000004, + 0x00000004, 0x18000004, 0x58000004, 0x10000004, + 0xb0000002, 0xe0000002, 0xb8000002, 0x88000002, + 0xa8000002, 0xf8000002, 0xe8000002, 0xc0000002, + 0xa0000002, 0xd0000002, 0xc8000002, 0xf0000002, + 0x80000002, 0x98000002, 0xd8000002, 0x90000002, + 0xb0000004, 0xe0000004, 0xb8000004, 0x88000004, + 0xa8000004, 0xf8000004, 0xe8000004, 0xc0000004, + 0xa0000004, 0xd0000004, 0xc8000004, 0xf0000004, + 0x80000004, 0x98000004, 0xd8000004, 0x90000004, + 0x30000006, 0x60000006, 0x38000006, 0x08000006, + 0x28000006, 0x78000006, 0x68000006, 0x40000006, + 0x20000006, 0x50000006, 0x48000006, 0x70000006, + 0x00000006, 0x18000006, 0x58000006, 0x10000006, + 0xb0000007, 0xe0000007, 0xb8000007, 0x88000007, + 0xa8000007, 0xf8000007, 0xe8000007, 0xc0000007, + 0xa0000007, 0xd0000007, 0xc8000007, 0xf0000007, + 0x80000007, 0x98000007, 0xd8000007, 0x90000007, + 0x30000007, 0x60000007, 0x38000007, 0x08000007, + 0x28000007, 0x78000007, 0x68000007, 0x40000007, + 0x20000007, 0x50000007, 0x48000007, 0x70000007, + 0x00000007, 0x18000007, 0x58000007, 0x10000007, + }, + { + 0x000000e8, 0x000000d8, 0x000000a0, 0x00000088, + 0x00000098, 0x000000f8, 0x000000a8, 0x000000c8, + 0x00000080, 0x000000d0, 0x000000f0, 0x000000b8, + 0x000000b0, 0x000000c0, 0x00000090, 0x000000e0, + 0x000007e8, 0x000007d8, 0x000007a0, 0x00000788, + 0x00000798, 0x000007f8, 0x000007a8, 0x000007c8, + 0x00000780, 0x000007d0, 0x000007f0, 0x000007b8, + 0x000007b0, 0x000007c0, 0x00000790, 0x000007e0, + 0x000006e8, 0x000006d8, 0x000006a0, 0x00000688, + 0x00000698, 0x000006f8, 0x000006a8, 0x000006c8, + 0x00000680, 0x000006d0, 0x000006f0, 0x000006b8, + 0x000006b0, 0x000006c0, 0x00000690, 0x000006e0, + 0x00000068, 0x00000058, 0x00000020, 0x00000008, + 0x00000018, 0x00000078, 0x00000028, 0x00000048, + 0x00000000, 0x00000050, 0x00000070, 0x00000038, + 0x00000030, 0x00000040, 0x00000010, 0x00000060, + 0x000002e8, 0x000002d8, 0x000002a0, 0x00000288, + 0x00000298, 0x000002f8, 0x000002a8, 0x000002c8, + 0x00000280, 0x000002d0, 0x000002f0, 0x000002b8, + 0x000002b0, 0x000002c0, 0x00000290, 0x000002e0, + 0x000003e8, 0x000003d8, 0x000003a0, 0x00000388, + 0x00000398, 0x000003f8, 0x000003a8, 0x000003c8, + 0x00000380, 0x000003d0, 0x000003f0, 0x000003b8, + 0x000003b0, 0x000003c0, 0x00000390, 0x000003e0, + 0x00000568, 0x00000558, 0x00000520, 0x00000508, + 0x00000518, 0x00000578, 0x00000528, 0x00000548, + 0x00000500, 0x00000550, 0x00000570, 0x00000538, + 0x00000530, 0x00000540, 0x00000510, 0x00000560, + 0x00000268, 0x00000258, 0x00000220, 0x00000208, + 0x00000218, 0x00000278, 0x00000228, 0x00000248, + 0x00000200, 0x00000250, 0x00000270, 0x00000238, + 0x00000230, 0x00000240, 0x00000210, 0x00000260, + 0x000004e8, 0x000004d8, 0x000004a0, 0x00000488, + 0x00000498, 0x000004f8, 0x000004a8, 0x000004c8, + 0x00000480, 0x000004d0, 0x000004f0, 0x000004b8, + 0x000004b0, 0x000004c0, 0x00000490, 0x000004e0, + 0x00000168, 0x00000158, 0x00000120, 0x00000108, + 0x00000118, 0x00000178, 0x00000128, 0x00000148, + 0x00000100, 0x00000150, 0x00000170, 0x00000138, + 0x00000130, 0x00000140, 0x00000110, 0x00000160, + 0x000001e8, 0x000001d8, 0x000001a0, 0x00000188, + 0x00000198, 0x000001f8, 0x000001a8, 0x000001c8, + 0x00000180, 0x000001d0, 0x000001f0, 0x000001b8, + 0x000001b0, 0x000001c0, 0x00000190, 0x000001e0, + 0x00000768, 0x00000758, 0x00000720, 0x00000708, + 0x00000718, 0x00000778, 0x00000728, 0x00000748, + 0x00000700, 0x00000750, 0x00000770, 0x00000738, + 0x00000730, 0x00000740, 0x00000710, 0x00000760, + 0x00000368, 0x00000358, 0x00000320, 0x00000308, + 0x00000318, 0x00000378, 0x00000328, 0x00000348, + 0x00000300, 0x00000350, 0x00000370, 0x00000338, + 0x00000330, 0x00000340, 0x00000310, 0x00000360, + 0x000005e8, 0x000005d8, 0x000005a0, 0x00000588, + 0x00000598, 0x000005f8, 0x000005a8, 0x000005c8, + 0x00000580, 0x000005d0, 0x000005f0, 0x000005b8, + 0x000005b0, 0x000005c0, 0x00000590, 0x000005e0, + 0x00000468, 0x00000458, 0x00000420, 0x00000408, + 0x00000418, 0x00000478, 0x00000428, 0x00000448, + 0x00000400, 0x00000450, 0x00000470, 0x00000438, + 0x00000430, 0x00000440, 0x00000410, 0x00000460, + 0x00000668, 0x00000658, 0x00000620, 0x00000608, + 0x00000618, 0x00000678, 0x00000628, 0x00000648, + 0x00000600, 0x00000650, 0x00000670, 0x00000638, + 0x00000630, 0x00000640, 0x00000610, 0x00000660, + } +}; + +#ifdef VECT_SIZE1 +#define BOX(i,n,S) u32x ((S)[(n)][(i)]) +#endif + +#ifdef VECT_SIZE2 +#define BOX(i,n,S) u32x ((S)[(n)][(i).x], (S)[(n)][(i).y]) +#endif + +#define round(k1,k2,tbl) \ +{ \ + u32x t; \ + t = (k1) + r; \ + l ^= BOX ((t >> 0) & 0xff, 0, tbl) ^ \ + BOX ((t >> 8) & 0xff, 1, tbl) ^ \ + BOX ((t >> 16) & 0xff, 2, tbl) ^ \ + BOX ((t >> 24) & 0xff, 3, tbl); \ + t = (k2) + l; \ + r ^= BOX ((t >> 0) & 0xff, 0, tbl) ^ \ + BOX ((t >> 8) & 0xff, 1, tbl) ^ \ + BOX ((t >> 16) & 0xff, 2, tbl) ^ \ + BOX ((t >> 24) & 0xff, 3, tbl); \ +} + +#define R(k,h,s,i,t) \ +{ \ + u32x r; \ + u32x l; \ + r = h[i + 0]; \ + l = h[i + 1]; \ + round (k[0], k[1], t); \ + round (k[2], k[3], t); \ + round (k[4], k[5], t); \ + round (k[6], k[7], t); \ + round (k[0], k[1], t); \ + round (k[2], k[3], t); \ + round (k[4], k[5], t); \ + round (k[6], k[7], t); \ + round (k[0], k[1], t); \ + round (k[2], k[3], t); \ + round (k[4], k[5], t); \ + round (k[6], k[7], t); \ + round (k[7], k[6], t); \ + round (k[5], k[4], t); \ + round (k[3], k[2], t); \ + round (k[1], k[0], t); \ + s[i + 0] = l; \ + s[i + 1] = r; \ +} + +#define X(w,u,v) \ + w[0] = u[0] ^ v[0]; \ + w[1] = u[1] ^ v[1]; \ + w[2] = u[2] ^ v[2]; \ + w[3] = u[3] ^ v[3]; \ + w[4] = u[4] ^ v[4]; \ + w[5] = u[5] ^ v[5]; \ + w[6] = u[6] ^ v[6]; \ + w[7] = u[7] ^ v[7]; + +#define P(k,w) \ + k[0] = ((w[0] & 0x000000ff) << 0) \ + | ((w[2] & 0x000000ff) << 8) \ + | ((w[4] & 0x000000ff) << 16) \ + | ((w[6] & 0x000000ff) << 24); \ + k[1] = ((w[0] & 0x0000ff00) >> 8) \ + | ((w[2] & 0x0000ff00) >> 0) \ + | ((w[4] & 0x0000ff00) << 8) \ + | ((w[6] & 0x0000ff00) << 16); \ + k[2] = ((w[0] & 0x00ff0000) >> 16) \ + | ((w[2] & 0x00ff0000) >> 8) \ + | ((w[4] & 0x00ff0000) << 0) \ + | ((w[6] & 0x00ff0000) << 8); \ + k[3] = ((w[0] & 0xff000000) >> 24) \ + | ((w[2] & 0xff000000) >> 16) \ + | ((w[4] & 0xff000000) >> 8) \ + | ((w[6] & 0xff000000) >> 0); \ + k[4] = ((w[1] & 0x000000ff) << 0) \ + | ((w[3] & 0x000000ff) << 8) \ + | ((w[5] & 0x000000ff) << 16) \ + | ((w[7] & 0x000000ff) << 24); \ + k[5] = ((w[1] & 0x0000ff00) >> 8) \ + | ((w[3] & 0x0000ff00) >> 0) \ + | ((w[5] & 0x0000ff00) << 8) \ + | ((w[7] & 0x0000ff00) << 16); \ + k[6] = ((w[1] & 0x00ff0000) >> 16) \ + | ((w[3] & 0x00ff0000) >> 8) \ + | ((w[5] & 0x00ff0000) << 0) \ + | ((w[7] & 0x00ff0000) << 8); \ + k[7] = ((w[1] & 0xff000000) >> 24) \ + | ((w[3] & 0xff000000) >> 16) \ + | ((w[5] & 0xff000000) >> 8) \ + | ((w[7] & 0xff000000) >> 0); + +#define A(x) \ +{ \ + u32x l; \ + u32x r; \ + l = x[0] ^ x[2]; \ + r = x[1] ^ x[3]; \ + x[0] = x[2]; \ + x[1] = x[3]; \ + x[2] = x[4]; \ + x[3] = x[5]; \ + x[4] = x[6]; \ + x[5] = x[7]; \ + x[6] = l; \ + x[7] = r; \ +} + +#define AA(x) \ +{ \ + u32x l; \ + u32x r; \ + l = x[0]; \ + r = x[2]; \ + x[0] = x[4]; \ + x[2] = x[6]; \ + x[4] = l ^ r; \ + x[6] = x[0] ^ r; \ + l = x[1]; \ + r = x[3]; \ + x[1] = x[5]; \ + x[3] = x[7]; \ + x[5] = l ^ r; \ + x[7] = x[1] ^ r; \ +} + +#define C(x) \ + x[0] ^= 0xff00ff00; \ + x[1] ^= 0xff00ff00; \ + x[2] ^= 0x00ff00ff; \ + x[3] ^= 0x00ff00ff; \ + x[4] ^= 0x00ffff00; \ + x[5] ^= 0xff0000ff; \ + x[6] ^= 0x000000ff; \ + x[7] ^= 0xff00ffff; + +#define SHIFT12(u,m,s) \ + u[0] = m[0] ^ s[6]; \ + u[1] = m[1] ^ s[7]; \ + u[2] = m[2] ^ (s[0] << 16) \ + ^ (s[0] >> 16) \ + ^ (s[0] & 0x0000ffff) \ + ^ (s[1] & 0x0000ffff) \ + ^ (s[1] >> 16) \ + ^ (s[2] << 16) \ + ^ s[6] \ + ^ (s[6] << 16) \ + ^ (s[7] & 0xffff0000) \ + ^ (s[7] >> 16); \ + u[3] = m[3] ^ (s[0] & 0x0000ffff) \ + ^ (s[0] << 16) \ + ^ (s[1] & 0x0000ffff) \ + ^ (s[1] << 16) \ + ^ (s[1] >> 16) \ + ^ (s[2] << 16) \ + ^ (s[2] >> 16) \ + ^ (s[3] << 16) \ + ^ s[6] \ + ^ (s[6] << 16) \ + ^ (s[6] >> 16) \ + ^ (s[7] & 0x0000ffff) \ + ^ (s[7] << 16) \ + ^ (s[7] >> 16); \ + u[4] = m[4] ^ (s[0] & 0xffff0000) \ + ^ (s[0] << 16) \ + ^ (s[0] >> 16) \ + ^ (s[1] & 0xffff0000) \ + ^ (s[1] >> 16) \ + ^ (s[2] << 16) \ + ^ (s[2] >> 16) \ + ^ (s[3] << 16) \ + ^ (s[3] >> 16) \ + ^ (s[4] << 16) \ + ^ (s[6] << 16) \ + ^ (s[6] >> 16) \ + ^ (s[7] & 0x0000ffff) \ + ^ (s[7] << 16) \ + ^ (s[7] >> 16); \ + u[5] = m[5] ^ (s[0] << 16) \ + ^ (s[0] >> 16) \ + ^ (s[0] & 0xffff0000) \ + ^ (s[1] & 0x0000ffff) \ + ^ s[2] \ + ^ (s[2] >> 16) \ + ^ (s[3] << 16) \ + ^ (s[3] >> 16) \ + ^ (s[4] << 16) \ + ^ (s[4] >> 16) \ + ^ (s[5] << 16) \ + ^ (s[6] << 16) \ + ^ (s[6] >> 16) \ + ^ (s[7] & 0xffff0000) \ + ^ (s[7] << 16) \ + ^ (s[7] >> 16); \ + u[6] = m[6] ^ s[0] \ + ^ (s[1] >> 16) \ + ^ (s[2] << 16) \ + ^ s[3] \ + ^ (s[3] >> 16) \ + ^ (s[4] << 16) \ + ^ (s[4] >> 16) \ + ^ (s[5] << 16) \ + ^ (s[5] >> 16) \ + ^ s[6] \ + ^ (s[6] << 16) \ + ^ (s[6] >> 16) \ + ^ (s[7] << 16); \ + u[7] = m[7] ^ (s[0] & 0xffff0000) \ + ^ (s[0] << 16) \ + ^ (s[1] & 0x0000ffff) \ + ^ (s[1] << 16) \ + ^ (s[2] >> 16) \ + ^ (s[3] << 16) \ + ^ s[4] \ + ^ (s[4] >> 16) \ + ^ (s[5] << 16) \ + ^ (s[5] >> 16) \ + ^ (s[6] >> 16) \ + ^ (s[7] & 0x0000ffff) \ + ^ (s[7] << 16) \ + ^ (s[7] >> 16); + +#define SHIFT16(h,v,u) \ + v[0] = h[0] ^ (u[1] << 16) \ + ^ (u[0] >> 16); \ + v[1] = h[1] ^ (u[2] << 16) \ + ^ (u[1] >> 16); \ + v[2] = h[2] ^ (u[3] << 16) \ + ^ (u[2] >> 16); \ + v[3] = h[3] ^ (u[4] << 16) \ + ^ (u[3] >> 16); \ + v[4] = h[4] ^ (u[5] << 16) \ + ^ (u[4] >> 16); \ + v[5] = h[5] ^ (u[6] << 16) \ + ^ (u[5] >> 16); \ + v[6] = h[6] ^ (u[7] << 16) \ + ^ (u[6] >> 16); \ + v[7] = h[7] ^ (u[0] & 0xffff0000) \ + ^ (u[0] << 16) \ + ^ (u[7] >> 16) \ + ^ (u[1] & 0xffff0000) \ + ^ (u[1] << 16) \ + ^ (u[6] << 16) \ + ^ (u[7] & 0xffff0000); + +#define SHIFT61(h,v) \ + h[0] = (v[0] & 0xffff0000) \ + ^ (v[0] << 16) \ + ^ (v[0] >> 16) \ + ^ (v[1] >> 16) \ + ^ (v[1] & 0xffff0000) \ + ^ (v[2] << 16) \ + ^ (v[3] >> 16) \ + ^ (v[4] << 16) \ + ^ (v[5] >> 16) \ + ^ v[5] \ + ^ (v[6] >> 16) \ + ^ (v[7] << 16) \ + ^ (v[7] >> 16) \ + ^ (v[7] & 0x0000ffff); \ + h[1] = (v[0] << 16) \ + ^ (v[0] >> 16) \ + ^ (v[0] & 0xffff0000) \ + ^ (v[1] & 0x0000ffff) \ + ^ v[2] \ + ^ (v[2] >> 16) \ + ^ (v[3] << 16) \ + ^ (v[4] >> 16) \ + ^ (v[5] << 16) \ + ^ (v[6] << 16) \ + ^ v[6] \ + ^ (v[7] & 0xffff0000) \ + ^ (v[7] >> 16); \ + h[2] = (v[0] & 0x0000ffff) \ + ^ (v[0] << 16) \ + ^ (v[1] << 16) \ + ^ (v[1] >> 16) \ + ^ (v[1] & 0xffff0000) \ + ^ (v[2] << 16) \ + ^ (v[3] >> 16) \ + ^ v[3] \ + ^ (v[4] << 16) \ + ^ (v[5] >> 16) \ + ^ v[6] \ + ^ (v[6] >> 16) \ + ^ (v[7] & 0x0000ffff) \ + ^ (v[7] << 16) \ + ^ (v[7] >> 16); \ + h[3] = (v[0] << 16) \ + ^ (v[0] >> 16) \ + ^ (v[0] & 0xffff0000) \ + ^ (v[1] & 0xffff0000) \ + ^ (v[1] >> 16) \ + ^ (v[2] << 16) \ + ^ (v[2] >> 16) \ + ^ v[2] \ + ^ (v[3] << 16) \ + ^ (v[4] >> 16) \ + ^ v[4] \ + ^ (v[5] << 16) \ + ^ (v[6] << 16) \ + ^ (v[7] & 0x0000ffff) \ + ^ (v[7] >> 16); \ + h[4] = (v[0] >> 16) \ + ^ (v[1] << 16) \ + ^ v[1] \ + ^ (v[2] >> 16) \ + ^ v[2] \ + ^ (v[3] << 16) \ + ^ (v[3] >> 16) \ + ^ v[3] \ + ^ (v[4] << 16) \ + ^ (v[5] >> 16) \ + ^ v[5] \ + ^ (v[6] << 16) \ + ^ (v[6] >> 16) \ + ^ (v[7] << 16); \ + h[5] = (v[0] << 16) \ + ^ (v[0] & 0xffff0000) \ + ^ (v[1] << 16) \ + ^ (v[1] >> 16) \ + ^ (v[1] & 0xffff0000) \ + ^ (v[2] << 16) \ + ^ v[2] \ + ^ (v[3] >> 16) \ + ^ v[3] \ + ^ (v[4] << 16) \ + ^ (v[4] >> 16) \ + ^ v[4] \ + ^ (v[5] << 16) \ + ^ (v[6] << 16) \ + ^ (v[6] >> 16) \ + ^ v[6] \ + ^ (v[7] << 16) \ + ^ (v[7] >> 16) \ + ^ (v[7] & 0xffff0000); \ + h[6] = v[0] \ + ^ v[2] \ + ^ (v[2] >> 16) \ + ^ v[3] \ + ^ (v[3] << 16) \ + ^ v[4] \ + ^ (v[4] >> 16) \ + ^ (v[5] << 16) \ + ^ (v[5] >> 16) \ + ^ v[5] \ + ^ (v[6] << 16) \ + ^ (v[6] >> 16) \ + ^ v[6] \ + ^ (v[7] << 16) \ + ^ v[7]; \ + h[7] = v[0] \ + ^ (v[0] >> 16) \ + ^ (v[1] << 16) \ + ^ (v[1] >> 16) \ + ^ (v[2] << 16) \ + ^ (v[3] >> 16) \ + ^ v[3] \ + ^ (v[4] << 16) \ + ^ v[4] \ + ^ (v[5] >> 16) \ + ^ v[5] \ + ^ (v[6] << 16) \ + ^ (v[6] >> 16) \ + ^ (v[7] << 16) \ + ^ v[7]; + +#define PASS0(h,s,u,v,t) \ +{ \ + u32x k[8]; \ + u32x w[8]; \ + X (w, u, v); \ + P (k, w); \ + R (k, h, s, 0, t); \ + A (u); \ + AA (v); \ +} + +#define PASS2(h,s,u,v,t) \ +{ \ + u32x k[8]; \ + u32x w[8]; \ + X (w, u, v); \ + P (k, w); \ + R (k, h, s, 2, t); \ + A (u); \ + C (u); \ + AA (v); \ +} + +#define PASS4(h,s,u,v,t) \ +{ \ + u32x k[8]; \ + u32x w[8]; \ + X (w, u, v); \ + P (k, w); \ + R (k, h, s, 4, t); \ + A (u); \ + AA (v); \ +} + +#define PASS6(h,s,u,v,t) \ +{ \ + u32x k[8]; \ + u32x w[8]; \ + X (w, u, v); \ + P (k, w); \ + R (k, h, s, 6, t); \ +} + +__device__ __constant__ comb_t c_combs[1024]; + +extern "C" __global__ void __launch_bounds__ (256, 1) m06900_m04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, c_combs[0].pw_len); + } + + /** + * sbox + */ + + __shared__ u32 s_tables[4][256]; + + s_tables[0][lid] = c_tables[0][lid]; + s_tables[1][lid] = c_tables[1][lid]; + s_tables[2][lid] = c_tables[2][lid]; + s_tables[3][lid] = c_tables[3][lid]; + + __syncthreads (); + + if (gid >= gid_max) return; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = c_combs[il_pos].pw_len; + + const u32 pw_len = pw_l_len + pw_r_len; + + u32 wordr0[4]; + + wordr0[0] = c_combs[il_pos].i[0]; + wordr0[1] = c_combs[il_pos].i[1]; + wordr0[2] = c_combs[il_pos].i[2]; + wordr0[3] = c_combs[il_pos].i[3]; + + u32 wordr1[4]; + + wordr1[0] = c_combs[il_pos].i[4]; + wordr1[1] = c_combs[il_pos].i[5]; + wordr1[2] = c_combs[il_pos].i[6]; + wordr1[3] = c_combs[il_pos].i[7]; + + u32 wordr2[4]; + + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + + u32 wordr3[4]; + + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + u32x w0[4]; + + w0[0] = wordl0[0] | wordr0[0]; + w0[1] = wordl0[1] | wordr0[1]; + w0[2] = wordl0[2] | wordr0[2]; + w0[3] = wordl0[3] | wordr0[3]; + + u32x w1[4]; + + w1[0] = wordl1[0] | wordr1[0]; + w1[1] = wordl1[1] | wordr1[1]; + w1[2] = wordl1[2] | wordr1[2]; + w1[3] = wordl1[3] | wordr1[3]; + + u32x w2[4]; + + w2[0] = wordl2[0] | wordr2[0]; + w2[1] = wordl2[1] | wordr2[1]; + w2[2] = wordl2[2] | wordr2[2]; + w2[3] = wordl2[3] | wordr2[3]; + + u32x w3[4]; + + w3[0] = wordl3[0] | wordr3[0]; + w3[1] = wordl3[1] | wordr3[1]; + w3[2] = pw_len * 8; + w3[3] = 0; + + const u32 w14 = pw_len * 8; + + u32x data[8]; + + data[0] = w0[0]; + data[1] = w0[1]; + data[2] = w0[2]; + data[3] = w0[3]; + data[4] = w1[0]; + data[5] = w1[1]; + data[6] = w1[2]; + data[7] = w1[3]; + + u32x state[16]; + + state[ 0] = 0; + state[ 1] = 0; + state[ 2] = 0; + state[ 3] = 0; + state[ 4] = 0; + state[ 5] = 0; + state[ 6] = 0; + state[ 7] = 0; + state[ 8] = data[0]; + state[ 9] = data[1]; + state[10] = data[2]; + state[11] = data[3]; + state[12] = data[4]; + state[13] = data[5]; + state[14] = data[6]; + state[15] = data[7]; + + u32x state_m[8]; + u32x data_m[8]; + + /* gost1 */ + + state_m[0] = state[0]; + state_m[1] = state[1]; + state_m[2] = state[2]; + state_m[3] = state[3]; + state_m[4] = state[4]; + state_m[5] = state[5]; + state_m[6] = state[6]; + state_m[7] = state[7]; + + data_m[0] = data[0]; + data_m[1] = data[1]; + data_m[2] = data[2]; + data_m[3] = data[3]; + data_m[4] = data[4]; + data_m[5] = data[5]; + data_m[6] = data[6]; + data_m[7] = data[7]; + + u32x tmp[8]; + + PASS0 (state, tmp, state_m, data_m, s_tables); + PASS2 (state, tmp, state_m, data_m, s_tables); + PASS4 (state, tmp, state_m, data_m, s_tables); + PASS6 (state, tmp, state_m, data_m, s_tables); + + SHIFT12 (state_m, data, tmp); + SHIFT16 (state, data_m, state_m); + SHIFT61 (state, data_m); + + data[0] = w14; + data[1] = 0; + data[2] = 0; + data[3] = 0; + data[4] = 0; + data[5] = 0; + data[6] = 0; + data[7] = 0; + + /* gost2 */ + + state_m[0] = state[0]; + state_m[1] = state[1]; + state_m[2] = state[2]; + state_m[3] = state[3]; + state_m[4] = state[4]; + state_m[5] = state[5]; + state_m[6] = state[6]; + state_m[7] = state[7]; + + data_m[0] = data[0]; + data_m[1] = data[1]; + data_m[2] = data[2]; + data_m[3] = data[3]; + data_m[4] = data[4]; + data_m[5] = data[5]; + data_m[6] = data[6]; + data_m[7] = data[7]; + + PASS0 (state, tmp, state_m, data_m, s_tables); + PASS2 (state, tmp, state_m, data_m, s_tables); + PASS4 (state, tmp, state_m, data_m, s_tables); + PASS6 (state, tmp, state_m, data_m, s_tables); + + SHIFT12 (state_m, data, tmp); + SHIFT16 (state, data_m, state_m); + SHIFT61 (state, data_m); + + /* gost3 */ + + data[0] = state[ 8]; + data[1] = state[ 9]; + data[2] = state[10]; + data[3] = state[11]; + data[4] = state[12]; + data[5] = state[13]; + data[6] = state[14]; + data[7] = state[15]; + + state_m[0] = state[0]; + state_m[1] = state[1]; + state_m[2] = state[2]; + state_m[3] = state[3]; + state_m[4] = state[4]; + state_m[5] = state[5]; + state_m[6] = state[6]; + state_m[7] = state[7]; + + data_m[0] = data[0]; + data_m[1] = data[1]; + data_m[2] = data[2]; + data_m[3] = data[3]; + data_m[4] = data[4]; + data_m[5] = data[5]; + data_m[6] = data[6]; + data_m[7] = data[7]; + + PASS0 (state, tmp, state_m, data_m, s_tables); + PASS2 (state, tmp, state_m, data_m, s_tables); + PASS4 (state, tmp, state_m, data_m, s_tables); + PASS6 (state, tmp, state_m, data_m, s_tables); + + SHIFT12 (state_m, data, tmp); + SHIFT16 (state, data_m, state_m); + SHIFT61 (state, data_m); + + /* store */ + + const u32x r0 = state[0]; + const u32x r1 = state[1]; + const u32x r2 = state[2]; + const u32x r3 = state[3]; + + #include VECT_COMPARE_M + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m06900_m08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m06900_m16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m06900_s04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, c_combs[0].pw_len); + } + + /** + * sbox + */ + + __shared__ u32 s_tables[4][256]; + + s_tables[0][lid] = c_tables[0][lid]; + s_tables[1][lid] = c_tables[1][lid]; + s_tables[2][lid] = c_tables[2][lid]; + s_tables[3][lid] = c_tables[3][lid]; + + __syncthreads (); + + if (gid >= gid_max) return; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = c_combs[il_pos].pw_len; + + const u32 pw_len = pw_l_len + pw_r_len; + + u32 wordr0[4]; + + wordr0[0] = c_combs[il_pos].i[0]; + wordr0[1] = c_combs[il_pos].i[1]; + wordr0[2] = c_combs[il_pos].i[2]; + wordr0[3] = c_combs[il_pos].i[3]; + + u32 wordr1[4]; + + wordr1[0] = c_combs[il_pos].i[4]; + wordr1[1] = c_combs[il_pos].i[5]; + wordr1[2] = c_combs[il_pos].i[6]; + wordr1[3] = c_combs[il_pos].i[7]; + + u32 wordr2[4]; + + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + + u32 wordr3[4]; + + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + u32x w0[4]; + + w0[0] = wordl0[0] | wordr0[0]; + w0[1] = wordl0[1] | wordr0[1]; + w0[2] = wordl0[2] | wordr0[2]; + w0[3] = wordl0[3] | wordr0[3]; + + u32x w1[4]; + + w1[0] = wordl1[0] | wordr1[0]; + w1[1] = wordl1[1] | wordr1[1]; + w1[2] = wordl1[2] | wordr1[2]; + w1[3] = wordl1[3] | wordr1[3]; + + u32x w2[4]; + + w2[0] = wordl2[0] | wordr2[0]; + w2[1] = wordl2[1] | wordr2[1]; + w2[2] = wordl2[2] | wordr2[2]; + w2[3] = wordl2[3] | wordr2[3]; + + u32x w3[4]; + + w3[0] = wordl3[0] | wordr3[0]; + w3[1] = wordl3[1] | wordr3[1]; + w3[2] = pw_len * 8; + w3[3] = 0; + + const u32 w14 = pw_len * 8; + + u32x data[8]; + + data[0] = w0[0]; + data[1] = w0[1]; + data[2] = w0[2]; + data[3] = w0[3]; + data[4] = w1[0]; + data[5] = w1[1]; + data[6] = w1[2]; + data[7] = w1[3]; + + u32x state[16]; + + state[ 0] = 0; + state[ 1] = 0; + state[ 2] = 0; + state[ 3] = 0; + state[ 4] = 0; + state[ 5] = 0; + state[ 6] = 0; + state[ 7] = 0; + state[ 8] = data[0]; + state[ 9] = data[1]; + state[10] = data[2]; + state[11] = data[3]; + state[12] = data[4]; + state[13] = data[5]; + state[14] = data[6]; + state[15] = data[7]; + + u32x state_m[8]; + u32x data_m[8]; + + /* gost1 */ + + state_m[0] = state[0]; + state_m[1] = state[1]; + state_m[2] = state[2]; + state_m[3] = state[3]; + state_m[4] = state[4]; + state_m[5] = state[5]; + state_m[6] = state[6]; + state_m[7] = state[7]; + + data_m[0] = data[0]; + data_m[1] = data[1]; + data_m[2] = data[2]; + data_m[3] = data[3]; + data_m[4] = data[4]; + data_m[5] = data[5]; + data_m[6] = data[6]; + data_m[7] = data[7]; + + u32x tmp[8]; + + PASS0 (state, tmp, state_m, data_m, s_tables); + PASS2 (state, tmp, state_m, data_m, s_tables); + PASS4 (state, tmp, state_m, data_m, s_tables); + PASS6 (state, tmp, state_m, data_m, s_tables); + + SHIFT12 (state_m, data, tmp); + SHIFT16 (state, data_m, state_m); + SHIFT61 (state, data_m); + + data[0] = w14; + data[1] = 0; + data[2] = 0; + data[3] = 0; + data[4] = 0; + data[5] = 0; + data[6] = 0; + data[7] = 0; + + /* gost2 */ + + state_m[0] = state[0]; + state_m[1] = state[1]; + state_m[2] = state[2]; + state_m[3] = state[3]; + state_m[4] = state[4]; + state_m[5] = state[5]; + state_m[6] = state[6]; + state_m[7] = state[7]; + + data_m[0] = data[0]; + data_m[1] = data[1]; + data_m[2] = data[2]; + data_m[3] = data[3]; + data_m[4] = data[4]; + data_m[5] = data[5]; + data_m[6] = data[6]; + data_m[7] = data[7]; + + PASS0 (state, tmp, state_m, data_m, s_tables); + PASS2 (state, tmp, state_m, data_m, s_tables); + PASS4 (state, tmp, state_m, data_m, s_tables); + PASS6 (state, tmp, state_m, data_m, s_tables); + + SHIFT12 (state_m, data, tmp); + SHIFT16 (state, data_m, state_m); + SHIFT61 (state, data_m); + + /* gost3 */ + + data[0] = state[ 8]; + data[1] = state[ 9]; + data[2] = state[10]; + data[3] = state[11]; + data[4] = state[12]; + data[5] = state[13]; + data[6] = state[14]; + data[7] = state[15]; + + state_m[0] = state[0]; + state_m[1] = state[1]; + state_m[2] = state[2]; + state_m[3] = state[3]; + state_m[4] = state[4]; + state_m[5] = state[5]; + state_m[6] = state[6]; + state_m[7] = state[7]; + + data_m[0] = data[0]; + data_m[1] = data[1]; + data_m[2] = data[2]; + data_m[3] = data[3]; + data_m[4] = data[4]; + data_m[5] = data[5]; + data_m[6] = data[6]; + data_m[7] = data[7]; + + PASS0 (state, tmp, state_m, data_m, s_tables); + PASS2 (state, tmp, state_m, data_m, s_tables); + PASS4 (state, tmp, state_m, data_m, s_tables); + PASS6 (state, tmp, state_m, data_m, s_tables); + + SHIFT12 (state_m, data, tmp); + SHIFT16 (state, data_m, state_m); + SHIFT61 (state, data_m); + + /* store */ + + const u32x r0 = state[0]; + const u32x r1 = state[1]; + const u32x r2 = state[2]; + const u32x r3 = state[3]; + + #include VECT_COMPARE_S + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m06900_s08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m06900_s16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/nv/m06900_a3.cu b/nv/m06900_a3.cu new file mode 100644 index 0000000000..8d237fc0ce --- /dev/null +++ b/nv/m06900_a3.cu @@ -0,0 +1,1331 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _GOST_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW2 +#define VECT_SIZE1 +#endif + +#define DGST_R0 0 +#define DGST_R1 1 +#define DGST_R2 2 +#define DGST_R3 3 + +#include "include/kernel_functions.c" +#include "types_nv.c" +#include "common_nv.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +__device__ __constant__ u32 c_tables[4][256] = +{ + { + 0x00072000, 0x00075000, 0x00074800, 0x00071000, + 0x00076800, 0x00074000, 0x00070000, 0x00077000, + 0x00073000, 0x00075800, 0x00070800, 0x00076000, + 0x00073800, 0x00077800, 0x00072800, 0x00071800, + 0x0005a000, 0x0005d000, 0x0005c800, 0x00059000, + 0x0005e800, 0x0005c000, 0x00058000, 0x0005f000, + 0x0005b000, 0x0005d800, 0x00058800, 0x0005e000, + 0x0005b800, 0x0005f800, 0x0005a800, 0x00059800, + 0x00022000, 0x00025000, 0x00024800, 0x00021000, + 0x00026800, 0x00024000, 0x00020000, 0x00027000, + 0x00023000, 0x00025800, 0x00020800, 0x00026000, + 0x00023800, 0x00027800, 0x00022800, 0x00021800, + 0x00062000, 0x00065000, 0x00064800, 0x00061000, + 0x00066800, 0x00064000, 0x00060000, 0x00067000, + 0x00063000, 0x00065800, 0x00060800, 0x00066000, + 0x00063800, 0x00067800, 0x00062800, 0x00061800, + 0x00032000, 0x00035000, 0x00034800, 0x00031000, + 0x00036800, 0x00034000, 0x00030000, 0x00037000, + 0x00033000, 0x00035800, 0x00030800, 0x00036000, + 0x00033800, 0x00037800, 0x00032800, 0x00031800, + 0x0006a000, 0x0006d000, 0x0006c800, 0x00069000, + 0x0006e800, 0x0006c000, 0x00068000, 0x0006f000, + 0x0006b000, 0x0006d800, 0x00068800, 0x0006e000, + 0x0006b800, 0x0006f800, 0x0006a800, 0x00069800, + 0x0007a000, 0x0007d000, 0x0007c800, 0x00079000, + 0x0007e800, 0x0007c000, 0x00078000, 0x0007f000, + 0x0007b000, 0x0007d800, 0x00078800, 0x0007e000, + 0x0007b800, 0x0007f800, 0x0007a800, 0x00079800, + 0x00052000, 0x00055000, 0x00054800, 0x00051000, + 0x00056800, 0x00054000, 0x00050000, 0x00057000, + 0x00053000, 0x00055800, 0x00050800, 0x00056000, + 0x00053800, 0x00057800, 0x00052800, 0x00051800, + 0x00012000, 0x00015000, 0x00014800, 0x00011000, + 0x00016800, 0x00014000, 0x00010000, 0x00017000, + 0x00013000, 0x00015800, 0x00010800, 0x00016000, + 0x00013800, 0x00017800, 0x00012800, 0x00011800, + 0x0001a000, 0x0001d000, 0x0001c800, 0x00019000, + 0x0001e800, 0x0001c000, 0x00018000, 0x0001f000, + 0x0001b000, 0x0001d800, 0x00018800, 0x0001e000, + 0x0001b800, 0x0001f800, 0x0001a800, 0x00019800, + 0x00042000, 0x00045000, 0x00044800, 0x00041000, + 0x00046800, 0x00044000, 0x00040000, 0x00047000, + 0x00043000, 0x00045800, 0x00040800, 0x00046000, + 0x00043800, 0x00047800, 0x00042800, 0x00041800, + 0x0000a000, 0x0000d000, 0x0000c800, 0x00009000, + 0x0000e800, 0x0000c000, 0x00008000, 0x0000f000, + 0x0000b000, 0x0000d800, 0x00008800, 0x0000e000, + 0x0000b800, 0x0000f800, 0x0000a800, 0x00009800, + 0x00002000, 0x00005000, 0x00004800, 0x00001000, + 0x00006800, 0x00004000, 0x00000000, 0x00007000, + 0x00003000, 0x00005800, 0x00000800, 0x00006000, + 0x00003800, 0x00007800, 0x00002800, 0x00001800, + 0x0003a000, 0x0003d000, 0x0003c800, 0x00039000, + 0x0003e800, 0x0003c000, 0x00038000, 0x0003f000, + 0x0003b000, 0x0003d800, 0x00038800, 0x0003e000, + 0x0003b800, 0x0003f800, 0x0003a800, 0x00039800, + 0x0002a000, 0x0002d000, 0x0002c800, 0x00029000, + 0x0002e800, 0x0002c000, 0x00028000, 0x0002f000, + 0x0002b000, 0x0002d800, 0x00028800, 0x0002e000, + 0x0002b800, 0x0002f800, 0x0002a800, 0x00029800, + 0x0004a000, 0x0004d000, 0x0004c800, 0x00049000, + 0x0004e800, 0x0004c000, 0x00048000, 0x0004f000, + 0x0004b000, 0x0004d800, 0x00048800, 0x0004e000, + 0x0004b800, 0x0004f800, 0x0004a800, 0x00049800, + }, + { + 0x03a80000, 0x03c00000, 0x03880000, 0x03e80000, + 0x03d00000, 0x03980000, 0x03a00000, 0x03900000, + 0x03f00000, 0x03f80000, 0x03e00000, 0x03b80000, + 0x03b00000, 0x03800000, 0x03c80000, 0x03d80000, + 0x06a80000, 0x06c00000, 0x06880000, 0x06e80000, + 0x06d00000, 0x06980000, 0x06a00000, 0x06900000, + 0x06f00000, 0x06f80000, 0x06e00000, 0x06b80000, + 0x06b00000, 0x06800000, 0x06c80000, 0x06d80000, + 0x05280000, 0x05400000, 0x05080000, 0x05680000, + 0x05500000, 0x05180000, 0x05200000, 0x05100000, + 0x05700000, 0x05780000, 0x05600000, 0x05380000, + 0x05300000, 0x05000000, 0x05480000, 0x05580000, + 0x00a80000, 0x00c00000, 0x00880000, 0x00e80000, + 0x00d00000, 0x00980000, 0x00a00000, 0x00900000, + 0x00f00000, 0x00f80000, 0x00e00000, 0x00b80000, + 0x00b00000, 0x00800000, 0x00c80000, 0x00d80000, + 0x00280000, 0x00400000, 0x00080000, 0x00680000, + 0x00500000, 0x00180000, 0x00200000, 0x00100000, + 0x00700000, 0x00780000, 0x00600000, 0x00380000, + 0x00300000, 0x00000000, 0x00480000, 0x00580000, + 0x04280000, 0x04400000, 0x04080000, 0x04680000, + 0x04500000, 0x04180000, 0x04200000, 0x04100000, + 0x04700000, 0x04780000, 0x04600000, 0x04380000, + 0x04300000, 0x04000000, 0x04480000, 0x04580000, + 0x04a80000, 0x04c00000, 0x04880000, 0x04e80000, + 0x04d00000, 0x04980000, 0x04a00000, 0x04900000, + 0x04f00000, 0x04f80000, 0x04e00000, 0x04b80000, + 0x04b00000, 0x04800000, 0x04c80000, 0x04d80000, + 0x07a80000, 0x07c00000, 0x07880000, 0x07e80000, + 0x07d00000, 0x07980000, 0x07a00000, 0x07900000, + 0x07f00000, 0x07f80000, 0x07e00000, 0x07b80000, + 0x07b00000, 0x07800000, 0x07c80000, 0x07d80000, + 0x07280000, 0x07400000, 0x07080000, 0x07680000, + 0x07500000, 0x07180000, 0x07200000, 0x07100000, + 0x07700000, 0x07780000, 0x07600000, 0x07380000, + 0x07300000, 0x07000000, 0x07480000, 0x07580000, + 0x02280000, 0x02400000, 0x02080000, 0x02680000, + 0x02500000, 0x02180000, 0x02200000, 0x02100000, + 0x02700000, 0x02780000, 0x02600000, 0x02380000, + 0x02300000, 0x02000000, 0x02480000, 0x02580000, + 0x03280000, 0x03400000, 0x03080000, 0x03680000, + 0x03500000, 0x03180000, 0x03200000, 0x03100000, + 0x03700000, 0x03780000, 0x03600000, 0x03380000, + 0x03300000, 0x03000000, 0x03480000, 0x03580000, + 0x06280000, 0x06400000, 0x06080000, 0x06680000, + 0x06500000, 0x06180000, 0x06200000, 0x06100000, + 0x06700000, 0x06780000, 0x06600000, 0x06380000, + 0x06300000, 0x06000000, 0x06480000, 0x06580000, + 0x05a80000, 0x05c00000, 0x05880000, 0x05e80000, + 0x05d00000, 0x05980000, 0x05a00000, 0x05900000, + 0x05f00000, 0x05f80000, 0x05e00000, 0x05b80000, + 0x05b00000, 0x05800000, 0x05c80000, 0x05d80000, + 0x01280000, 0x01400000, 0x01080000, 0x01680000, + 0x01500000, 0x01180000, 0x01200000, 0x01100000, + 0x01700000, 0x01780000, 0x01600000, 0x01380000, + 0x01300000, 0x01000000, 0x01480000, 0x01580000, + 0x02a80000, 0x02c00000, 0x02880000, 0x02e80000, + 0x02d00000, 0x02980000, 0x02a00000, 0x02900000, + 0x02f00000, 0x02f80000, 0x02e00000, 0x02b80000, + 0x02b00000, 0x02800000, 0x02c80000, 0x02d80000, + 0x01a80000, 0x01c00000, 0x01880000, 0x01e80000, + 0x01d00000, 0x01980000, 0x01a00000, 0x01900000, + 0x01f00000, 0x01f80000, 0x01e00000, 0x01b80000, + 0x01b00000, 0x01800000, 0x01c80000, 0x01d80000, + }, + { + 0x30000002, 0x60000002, 0x38000002, 0x08000002, + 0x28000002, 0x78000002, 0x68000002, 0x40000002, + 0x20000002, 0x50000002, 0x48000002, 0x70000002, + 0x00000002, 0x18000002, 0x58000002, 0x10000002, + 0xb0000005, 0xe0000005, 0xb8000005, 0x88000005, + 0xa8000005, 0xf8000005, 0xe8000005, 0xc0000005, + 0xa0000005, 0xd0000005, 0xc8000005, 0xf0000005, + 0x80000005, 0x98000005, 0xd8000005, 0x90000005, + 0x30000005, 0x60000005, 0x38000005, 0x08000005, + 0x28000005, 0x78000005, 0x68000005, 0x40000005, + 0x20000005, 0x50000005, 0x48000005, 0x70000005, + 0x00000005, 0x18000005, 0x58000005, 0x10000005, + 0x30000000, 0x60000000, 0x38000000, 0x08000000, + 0x28000000, 0x78000000, 0x68000000, 0x40000000, + 0x20000000, 0x50000000, 0x48000000, 0x70000000, + 0x00000000, 0x18000000, 0x58000000, 0x10000000, + 0xb0000003, 0xe0000003, 0xb8000003, 0x88000003, + 0xa8000003, 0xf8000003, 0xe8000003, 0xc0000003, + 0xa0000003, 0xd0000003, 0xc8000003, 0xf0000003, + 0x80000003, 0x98000003, 0xd8000003, 0x90000003, + 0x30000001, 0x60000001, 0x38000001, 0x08000001, + 0x28000001, 0x78000001, 0x68000001, 0x40000001, + 0x20000001, 0x50000001, 0x48000001, 0x70000001, + 0x00000001, 0x18000001, 0x58000001, 0x10000001, + 0xb0000000, 0xe0000000, 0xb8000000, 0x88000000, + 0xa8000000, 0xf8000000, 0xe8000000, 0xc0000000, + 0xa0000000, 0xd0000000, 0xc8000000, 0xf0000000, + 0x80000000, 0x98000000, 0xd8000000, 0x90000000, + 0xb0000006, 0xe0000006, 0xb8000006, 0x88000006, + 0xa8000006, 0xf8000006, 0xe8000006, 0xc0000006, + 0xa0000006, 0xd0000006, 0xc8000006, 0xf0000006, + 0x80000006, 0x98000006, 0xd8000006, 0x90000006, + 0xb0000001, 0xe0000001, 0xb8000001, 0x88000001, + 0xa8000001, 0xf8000001, 0xe8000001, 0xc0000001, + 0xa0000001, 0xd0000001, 0xc8000001, 0xf0000001, + 0x80000001, 0x98000001, 0xd8000001, 0x90000001, + 0x30000003, 0x60000003, 0x38000003, 0x08000003, + 0x28000003, 0x78000003, 0x68000003, 0x40000003, + 0x20000003, 0x50000003, 0x48000003, 0x70000003, + 0x00000003, 0x18000003, 0x58000003, 0x10000003, + 0x30000004, 0x60000004, 0x38000004, 0x08000004, + 0x28000004, 0x78000004, 0x68000004, 0x40000004, + 0x20000004, 0x50000004, 0x48000004, 0x70000004, + 0x00000004, 0x18000004, 0x58000004, 0x10000004, + 0xb0000002, 0xe0000002, 0xb8000002, 0x88000002, + 0xa8000002, 0xf8000002, 0xe8000002, 0xc0000002, + 0xa0000002, 0xd0000002, 0xc8000002, 0xf0000002, + 0x80000002, 0x98000002, 0xd8000002, 0x90000002, + 0xb0000004, 0xe0000004, 0xb8000004, 0x88000004, + 0xa8000004, 0xf8000004, 0xe8000004, 0xc0000004, + 0xa0000004, 0xd0000004, 0xc8000004, 0xf0000004, + 0x80000004, 0x98000004, 0xd8000004, 0x90000004, + 0x30000006, 0x60000006, 0x38000006, 0x08000006, + 0x28000006, 0x78000006, 0x68000006, 0x40000006, + 0x20000006, 0x50000006, 0x48000006, 0x70000006, + 0x00000006, 0x18000006, 0x58000006, 0x10000006, + 0xb0000007, 0xe0000007, 0xb8000007, 0x88000007, + 0xa8000007, 0xf8000007, 0xe8000007, 0xc0000007, + 0xa0000007, 0xd0000007, 0xc8000007, 0xf0000007, + 0x80000007, 0x98000007, 0xd8000007, 0x90000007, + 0x30000007, 0x60000007, 0x38000007, 0x08000007, + 0x28000007, 0x78000007, 0x68000007, 0x40000007, + 0x20000007, 0x50000007, 0x48000007, 0x70000007, + 0x00000007, 0x18000007, 0x58000007, 0x10000007, + }, + { + 0x000000e8, 0x000000d8, 0x000000a0, 0x00000088, + 0x00000098, 0x000000f8, 0x000000a8, 0x000000c8, + 0x00000080, 0x000000d0, 0x000000f0, 0x000000b8, + 0x000000b0, 0x000000c0, 0x00000090, 0x000000e0, + 0x000007e8, 0x000007d8, 0x000007a0, 0x00000788, + 0x00000798, 0x000007f8, 0x000007a8, 0x000007c8, + 0x00000780, 0x000007d0, 0x000007f0, 0x000007b8, + 0x000007b0, 0x000007c0, 0x00000790, 0x000007e0, + 0x000006e8, 0x000006d8, 0x000006a0, 0x00000688, + 0x00000698, 0x000006f8, 0x000006a8, 0x000006c8, + 0x00000680, 0x000006d0, 0x000006f0, 0x000006b8, + 0x000006b0, 0x000006c0, 0x00000690, 0x000006e0, + 0x00000068, 0x00000058, 0x00000020, 0x00000008, + 0x00000018, 0x00000078, 0x00000028, 0x00000048, + 0x00000000, 0x00000050, 0x00000070, 0x00000038, + 0x00000030, 0x00000040, 0x00000010, 0x00000060, + 0x000002e8, 0x000002d8, 0x000002a0, 0x00000288, + 0x00000298, 0x000002f8, 0x000002a8, 0x000002c8, + 0x00000280, 0x000002d0, 0x000002f0, 0x000002b8, + 0x000002b0, 0x000002c0, 0x00000290, 0x000002e0, + 0x000003e8, 0x000003d8, 0x000003a0, 0x00000388, + 0x00000398, 0x000003f8, 0x000003a8, 0x000003c8, + 0x00000380, 0x000003d0, 0x000003f0, 0x000003b8, + 0x000003b0, 0x000003c0, 0x00000390, 0x000003e0, + 0x00000568, 0x00000558, 0x00000520, 0x00000508, + 0x00000518, 0x00000578, 0x00000528, 0x00000548, + 0x00000500, 0x00000550, 0x00000570, 0x00000538, + 0x00000530, 0x00000540, 0x00000510, 0x00000560, + 0x00000268, 0x00000258, 0x00000220, 0x00000208, + 0x00000218, 0x00000278, 0x00000228, 0x00000248, + 0x00000200, 0x00000250, 0x00000270, 0x00000238, + 0x00000230, 0x00000240, 0x00000210, 0x00000260, + 0x000004e8, 0x000004d8, 0x000004a0, 0x00000488, + 0x00000498, 0x000004f8, 0x000004a8, 0x000004c8, + 0x00000480, 0x000004d0, 0x000004f0, 0x000004b8, + 0x000004b0, 0x000004c0, 0x00000490, 0x000004e0, + 0x00000168, 0x00000158, 0x00000120, 0x00000108, + 0x00000118, 0x00000178, 0x00000128, 0x00000148, + 0x00000100, 0x00000150, 0x00000170, 0x00000138, + 0x00000130, 0x00000140, 0x00000110, 0x00000160, + 0x000001e8, 0x000001d8, 0x000001a0, 0x00000188, + 0x00000198, 0x000001f8, 0x000001a8, 0x000001c8, + 0x00000180, 0x000001d0, 0x000001f0, 0x000001b8, + 0x000001b0, 0x000001c0, 0x00000190, 0x000001e0, + 0x00000768, 0x00000758, 0x00000720, 0x00000708, + 0x00000718, 0x00000778, 0x00000728, 0x00000748, + 0x00000700, 0x00000750, 0x00000770, 0x00000738, + 0x00000730, 0x00000740, 0x00000710, 0x00000760, + 0x00000368, 0x00000358, 0x00000320, 0x00000308, + 0x00000318, 0x00000378, 0x00000328, 0x00000348, + 0x00000300, 0x00000350, 0x00000370, 0x00000338, + 0x00000330, 0x00000340, 0x00000310, 0x00000360, + 0x000005e8, 0x000005d8, 0x000005a0, 0x00000588, + 0x00000598, 0x000005f8, 0x000005a8, 0x000005c8, + 0x00000580, 0x000005d0, 0x000005f0, 0x000005b8, + 0x000005b0, 0x000005c0, 0x00000590, 0x000005e0, + 0x00000468, 0x00000458, 0x00000420, 0x00000408, + 0x00000418, 0x00000478, 0x00000428, 0x00000448, + 0x00000400, 0x00000450, 0x00000470, 0x00000438, + 0x00000430, 0x00000440, 0x00000410, 0x00000460, + 0x00000668, 0x00000658, 0x00000620, 0x00000608, + 0x00000618, 0x00000678, 0x00000628, 0x00000648, + 0x00000600, 0x00000650, 0x00000670, 0x00000638, + 0x00000630, 0x00000640, 0x00000610, 0x00000660, + } +}; + +#ifdef VECT_SIZE1 +#define BOX(i,n,S) u32x ((S)[(n)][(i)]) +#endif + +#ifdef VECT_SIZE2 +#define BOX(i,n,S) u32x ((S)[(n)][(i).x], (S)[(n)][(i).y]) +#endif + +#define round(k1,k2,tbl) \ +{ \ + u32x t; \ + t = (k1) + r; \ + l ^= BOX ((t >> 0) & 0xff, 0, tbl) ^ \ + BOX ((t >> 8) & 0xff, 1, tbl) ^ \ + BOX ((t >> 16) & 0xff, 2, tbl) ^ \ + BOX ((t >> 24) & 0xff, 3, tbl); \ + t = (k2) + l; \ + r ^= BOX ((t >> 0) & 0xff, 0, tbl) ^ \ + BOX ((t >> 8) & 0xff, 1, tbl) ^ \ + BOX ((t >> 16) & 0xff, 2, tbl) ^ \ + BOX ((t >> 24) & 0xff, 3, tbl); \ +} + +#define R(k,h,s,i,t) \ +{ \ + u32x r; \ + u32x l; \ + r = h[i + 0]; \ + l = h[i + 1]; \ + round (k[0], k[1], t); \ + round (k[2], k[3], t); \ + round (k[4], k[5], t); \ + round (k[6], k[7], t); \ + round (k[0], k[1], t); \ + round (k[2], k[3], t); \ + round (k[4], k[5], t); \ + round (k[6], k[7], t); \ + round (k[0], k[1], t); \ + round (k[2], k[3], t); \ + round (k[4], k[5], t); \ + round (k[6], k[7], t); \ + round (k[7], k[6], t); \ + round (k[5], k[4], t); \ + round (k[3], k[2], t); \ + round (k[1], k[0], t); \ + s[i + 0] = l; \ + s[i + 1] = r; \ +} + +#define X(w,u,v) \ + w[0] = u[0] ^ v[0]; \ + w[1] = u[1] ^ v[1]; \ + w[2] = u[2] ^ v[2]; \ + w[3] = u[3] ^ v[3]; \ + w[4] = u[4] ^ v[4]; \ + w[5] = u[5] ^ v[5]; \ + w[6] = u[6] ^ v[6]; \ + w[7] = u[7] ^ v[7]; + +#define P(k,w) \ + k[0] = ((w[0] & 0x000000ff) << 0) \ + | ((w[2] & 0x000000ff) << 8) \ + | ((w[4] & 0x000000ff) << 16) \ + | ((w[6] & 0x000000ff) << 24); \ + k[1] = ((w[0] & 0x0000ff00) >> 8) \ + | ((w[2] & 0x0000ff00) >> 0) \ + | ((w[4] & 0x0000ff00) << 8) \ + | ((w[6] & 0x0000ff00) << 16); \ + k[2] = ((w[0] & 0x00ff0000) >> 16) \ + | ((w[2] & 0x00ff0000) >> 8) \ + | ((w[4] & 0x00ff0000) << 0) \ + | ((w[6] & 0x00ff0000) << 8); \ + k[3] = ((w[0] & 0xff000000) >> 24) \ + | ((w[2] & 0xff000000) >> 16) \ + | ((w[4] & 0xff000000) >> 8) \ + | ((w[6] & 0xff000000) >> 0); \ + k[4] = ((w[1] & 0x000000ff) << 0) \ + | ((w[3] & 0x000000ff) << 8) \ + | ((w[5] & 0x000000ff) << 16) \ + | ((w[7] & 0x000000ff) << 24); \ + k[5] = ((w[1] & 0x0000ff00) >> 8) \ + | ((w[3] & 0x0000ff00) >> 0) \ + | ((w[5] & 0x0000ff00) << 8) \ + | ((w[7] & 0x0000ff00) << 16); \ + k[6] = ((w[1] & 0x00ff0000) >> 16) \ + | ((w[3] & 0x00ff0000) >> 8) \ + | ((w[5] & 0x00ff0000) << 0) \ + | ((w[7] & 0x00ff0000) << 8); \ + k[7] = ((w[1] & 0xff000000) >> 24) \ + | ((w[3] & 0xff000000) >> 16) \ + | ((w[5] & 0xff000000) >> 8) \ + | ((w[7] & 0xff000000) >> 0); + +#define A(x) \ +{ \ + u32x l; \ + u32x r; \ + l = x[0] ^ x[2]; \ + r = x[1] ^ x[3]; \ + x[0] = x[2]; \ + x[1] = x[3]; \ + x[2] = x[4]; \ + x[3] = x[5]; \ + x[4] = x[6]; \ + x[5] = x[7]; \ + x[6] = l; \ + x[7] = r; \ +} + +#define AA(x) \ +{ \ + u32x l; \ + u32x r; \ + l = x[0]; \ + r = x[2]; \ + x[0] = x[4]; \ + x[2] = x[6]; \ + x[4] = l ^ r; \ + x[6] = x[0] ^ r; \ + l = x[1]; \ + r = x[3]; \ + x[1] = x[5]; \ + x[3] = x[7]; \ + x[5] = l ^ r; \ + x[7] = x[1] ^ r; \ +} + +#define C(x) \ + x[0] ^= 0xff00ff00; \ + x[1] ^= 0xff00ff00; \ + x[2] ^= 0x00ff00ff; \ + x[3] ^= 0x00ff00ff; \ + x[4] ^= 0x00ffff00; \ + x[5] ^= 0xff0000ff; \ + x[6] ^= 0x000000ff; \ + x[7] ^= 0xff00ffff; + +#define SHIFT12(u,m,s) \ + u[0] = m[0] ^ s[6]; \ + u[1] = m[1] ^ s[7]; \ + u[2] = m[2] ^ (s[0] << 16) \ + ^ (s[0] >> 16) \ + ^ (s[0] & 0x0000ffff) \ + ^ (s[1] & 0x0000ffff) \ + ^ (s[1] >> 16) \ + ^ (s[2] << 16) \ + ^ s[6] \ + ^ (s[6] << 16) \ + ^ (s[7] & 0xffff0000) \ + ^ (s[7] >> 16); \ + u[3] = m[3] ^ (s[0] & 0x0000ffff) \ + ^ (s[0] << 16) \ + ^ (s[1] & 0x0000ffff) \ + ^ (s[1] << 16) \ + ^ (s[1] >> 16) \ + ^ (s[2] << 16) \ + ^ (s[2] >> 16) \ + ^ (s[3] << 16) \ + ^ s[6] \ + ^ (s[6] << 16) \ + ^ (s[6] >> 16) \ + ^ (s[7] & 0x0000ffff) \ + ^ (s[7] << 16) \ + ^ (s[7] >> 16); \ + u[4] = m[4] ^ (s[0] & 0xffff0000) \ + ^ (s[0] << 16) \ + ^ (s[0] >> 16) \ + ^ (s[1] & 0xffff0000) \ + ^ (s[1] >> 16) \ + ^ (s[2] << 16) \ + ^ (s[2] >> 16) \ + ^ (s[3] << 16) \ + ^ (s[3] >> 16) \ + ^ (s[4] << 16) \ + ^ (s[6] << 16) \ + ^ (s[6] >> 16) \ + ^ (s[7] & 0x0000ffff) \ + ^ (s[7] << 16) \ + ^ (s[7] >> 16); \ + u[5] = m[5] ^ (s[0] << 16) \ + ^ (s[0] >> 16) \ + ^ (s[0] & 0xffff0000) \ + ^ (s[1] & 0x0000ffff) \ + ^ s[2] \ + ^ (s[2] >> 16) \ + ^ (s[3] << 16) \ + ^ (s[3] >> 16) \ + ^ (s[4] << 16) \ + ^ (s[4] >> 16) \ + ^ (s[5] << 16) \ + ^ (s[6] << 16) \ + ^ (s[6] >> 16) \ + ^ (s[7] & 0xffff0000) \ + ^ (s[7] << 16) \ + ^ (s[7] >> 16); \ + u[6] = m[6] ^ s[0] \ + ^ (s[1] >> 16) \ + ^ (s[2] << 16) \ + ^ s[3] \ + ^ (s[3] >> 16) \ + ^ (s[4] << 16) \ + ^ (s[4] >> 16) \ + ^ (s[5] << 16) \ + ^ (s[5] >> 16) \ + ^ s[6] \ + ^ (s[6] << 16) \ + ^ (s[6] >> 16) \ + ^ (s[7] << 16); \ + u[7] = m[7] ^ (s[0] & 0xffff0000) \ + ^ (s[0] << 16) \ + ^ (s[1] & 0x0000ffff) \ + ^ (s[1] << 16) \ + ^ (s[2] >> 16) \ + ^ (s[3] << 16) \ + ^ s[4] \ + ^ (s[4] >> 16) \ + ^ (s[5] << 16) \ + ^ (s[5] >> 16) \ + ^ (s[6] >> 16) \ + ^ (s[7] & 0x0000ffff) \ + ^ (s[7] << 16) \ + ^ (s[7] >> 16); + +#define SHIFT16(h,v,u) \ + v[0] = h[0] ^ (u[1] << 16) \ + ^ (u[0] >> 16); \ + v[1] = h[1] ^ (u[2] << 16) \ + ^ (u[1] >> 16); \ + v[2] = h[2] ^ (u[3] << 16) \ + ^ (u[2] >> 16); \ + v[3] = h[3] ^ (u[4] << 16) \ + ^ (u[3] >> 16); \ + v[4] = h[4] ^ (u[5] << 16) \ + ^ (u[4] >> 16); \ + v[5] = h[5] ^ (u[6] << 16) \ + ^ (u[5] >> 16); \ + v[6] = h[6] ^ (u[7] << 16) \ + ^ (u[6] >> 16); \ + v[7] = h[7] ^ (u[0] & 0xffff0000) \ + ^ (u[0] << 16) \ + ^ (u[7] >> 16) \ + ^ (u[1] & 0xffff0000) \ + ^ (u[1] << 16) \ + ^ (u[6] << 16) \ + ^ (u[7] & 0xffff0000); + +#define SHIFT61(h,v) \ + h[0] = (v[0] & 0xffff0000) \ + ^ (v[0] << 16) \ + ^ (v[0] >> 16) \ + ^ (v[1] >> 16) \ + ^ (v[1] & 0xffff0000) \ + ^ (v[2] << 16) \ + ^ (v[3] >> 16) \ + ^ (v[4] << 16) \ + ^ (v[5] >> 16) \ + ^ v[5] \ + ^ (v[6] >> 16) \ + ^ (v[7] << 16) \ + ^ (v[7] >> 16) \ + ^ (v[7] & 0x0000ffff); \ + h[1] = (v[0] << 16) \ + ^ (v[0] >> 16) \ + ^ (v[0] & 0xffff0000) \ + ^ (v[1] & 0x0000ffff) \ + ^ v[2] \ + ^ (v[2] >> 16) \ + ^ (v[3] << 16) \ + ^ (v[4] >> 16) \ + ^ (v[5] << 16) \ + ^ (v[6] << 16) \ + ^ v[6] \ + ^ (v[7] & 0xffff0000) \ + ^ (v[7] >> 16); \ + h[2] = (v[0] & 0x0000ffff) \ + ^ (v[0] << 16) \ + ^ (v[1] << 16) \ + ^ (v[1] >> 16) \ + ^ (v[1] & 0xffff0000) \ + ^ (v[2] << 16) \ + ^ (v[3] >> 16) \ + ^ v[3] \ + ^ (v[4] << 16) \ + ^ (v[5] >> 16) \ + ^ v[6] \ + ^ (v[6] >> 16) \ + ^ (v[7] & 0x0000ffff) \ + ^ (v[7] << 16) \ + ^ (v[7] >> 16); \ + h[3] = (v[0] << 16) \ + ^ (v[0] >> 16) \ + ^ (v[0] & 0xffff0000) \ + ^ (v[1] & 0xffff0000) \ + ^ (v[1] >> 16) \ + ^ (v[2] << 16) \ + ^ (v[2] >> 16) \ + ^ v[2] \ + ^ (v[3] << 16) \ + ^ (v[4] >> 16) \ + ^ v[4] \ + ^ (v[5] << 16) \ + ^ (v[6] << 16) \ + ^ (v[7] & 0x0000ffff) \ + ^ (v[7] >> 16); \ + h[4] = (v[0] >> 16) \ + ^ (v[1] << 16) \ + ^ v[1] \ + ^ (v[2] >> 16) \ + ^ v[2] \ + ^ (v[3] << 16) \ + ^ (v[3] >> 16) \ + ^ v[3] \ + ^ (v[4] << 16) \ + ^ (v[5] >> 16) \ + ^ v[5] \ + ^ (v[6] << 16) \ + ^ (v[6] >> 16) \ + ^ (v[7] << 16); \ + h[5] = (v[0] << 16) \ + ^ (v[0] & 0xffff0000) \ + ^ (v[1] << 16) \ + ^ (v[1] >> 16) \ + ^ (v[1] & 0xffff0000) \ + ^ (v[2] << 16) \ + ^ v[2] \ + ^ (v[3] >> 16) \ + ^ v[3] \ + ^ (v[4] << 16) \ + ^ (v[4] >> 16) \ + ^ v[4] \ + ^ (v[5] << 16) \ + ^ (v[6] << 16) \ + ^ (v[6] >> 16) \ + ^ v[6] \ + ^ (v[7] << 16) \ + ^ (v[7] >> 16) \ + ^ (v[7] & 0xffff0000); \ + h[6] = v[0] \ + ^ v[2] \ + ^ (v[2] >> 16) \ + ^ v[3] \ + ^ (v[3] << 16) \ + ^ v[4] \ + ^ (v[4] >> 16) \ + ^ (v[5] << 16) \ + ^ (v[5] >> 16) \ + ^ v[5] \ + ^ (v[6] << 16) \ + ^ (v[6] >> 16) \ + ^ v[6] \ + ^ (v[7] << 16) \ + ^ v[7]; \ + h[7] = v[0] \ + ^ (v[0] >> 16) \ + ^ (v[1] << 16) \ + ^ (v[1] >> 16) \ + ^ (v[2] << 16) \ + ^ (v[3] >> 16) \ + ^ v[3] \ + ^ (v[4] << 16) \ + ^ v[4] \ + ^ (v[5] >> 16) \ + ^ v[5] \ + ^ (v[6] << 16) \ + ^ (v[6] >> 16) \ + ^ (v[7] << 16) \ + ^ v[7]; + +#define PASS0(h,s,u,v,t) \ +{ \ + u32x k[8]; \ + u32x w[8]; \ + X (w, u, v); \ + P (k, w); \ + R (k, h, s, 0, t); \ + A (u); \ + AA (v); \ +} + +#define PASS2(h,s,u,v,t) \ +{ \ + u32x k[8]; \ + u32x w[8]; \ + X (w, u, v); \ + P (k, w); \ + R (k, h, s, 2, t); \ + A (u); \ + C (u); \ + AA (v); \ +} + +#define PASS4(h,s,u,v,t) \ +{ \ + u32x k[8]; \ + u32x w[8]; \ + X (w, u, v); \ + P (k, w); \ + R (k, h, s, 4, t); \ + A (u); \ + AA (v); \ +} + +#define PASS6(h,s,u,v,t) \ +{ \ + u32x k[8]; \ + u32x w[8]; \ + X (w, u, v); \ + P (k, w); \ + R (k, h, s, 6, t); \ +} + +__device__ __shared__ u32 s_tables[4][256]; + +__device__ __constant__ bf_t c_bfs[1024]; + +__device__ static void m06900m (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], const u32 pw_len, const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset) +{ + /** + * modifier + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 w14 = pw_len * 8; + + /** + * loop + */ + + u32x w0l = w0[0]; + + for (u32 il_pos = 0; il_pos < bfs_cnt; il_pos++) + { + const u32 w0r = c_bfs[il_pos].i; + + w0[0] = w0l | w0r; + + u32x data[8]; + + data[0] = w0[0]; + data[1] = w0[1]; + data[2] = w0[2]; + data[3] = w0[3]; + data[4] = w1[0]; + data[5] = w1[1]; + data[6] = w1[2]; + data[7] = w1[3]; + + u32x state[16]; + + state[ 0] = 0; + state[ 1] = 0; + state[ 2] = 0; + state[ 3] = 0; + state[ 4] = 0; + state[ 5] = 0; + state[ 6] = 0; + state[ 7] = 0; + state[ 8] = data[0]; + state[ 9] = data[1]; + state[10] = data[2]; + state[11] = data[3]; + state[12] = data[4]; + state[13] = data[5]; + state[14] = data[6]; + state[15] = data[7]; + + u32x state_m[8]; + u32x data_m[8]; + + /* gost1 */ + + state_m[0] = state[0]; + state_m[1] = state[1]; + state_m[2] = state[2]; + state_m[3] = state[3]; + state_m[4] = state[4]; + state_m[5] = state[5]; + state_m[6] = state[6]; + state_m[7] = state[7]; + + data_m[0] = data[0]; + data_m[1] = data[1]; + data_m[2] = data[2]; + data_m[3] = data[3]; + data_m[4] = data[4]; + data_m[5] = data[5]; + data_m[6] = data[6]; + data_m[7] = data[7]; + + u32x tmp[8]; + + PASS0 (state, tmp, state_m, data_m, s_tables); + PASS2 (state, tmp, state_m, data_m, s_tables); + PASS4 (state, tmp, state_m, data_m, s_tables); + PASS6 (state, tmp, state_m, data_m, s_tables); + + SHIFT12 (state_m, data, tmp); + SHIFT16 (state, data_m, state_m); + SHIFT61 (state, data_m); + + data[0] = w14; + data[1] = 0; + data[2] = 0; + data[3] = 0; + data[4] = 0; + data[5] = 0; + data[6] = 0; + data[7] = 0; + + /* gost2 */ + + state_m[0] = state[0]; + state_m[1] = state[1]; + state_m[2] = state[2]; + state_m[3] = state[3]; + state_m[4] = state[4]; + state_m[5] = state[5]; + state_m[6] = state[6]; + state_m[7] = state[7]; + + data_m[0] = data[0]; + data_m[1] = data[1]; + data_m[2] = data[2]; + data_m[3] = data[3]; + data_m[4] = data[4]; + data_m[5] = data[5]; + data_m[6] = data[6]; + data_m[7] = data[7]; + + PASS0 (state, tmp, state_m, data_m, s_tables); + PASS2 (state, tmp, state_m, data_m, s_tables); + PASS4 (state, tmp, state_m, data_m, s_tables); + PASS6 (state, tmp, state_m, data_m, s_tables); + + SHIFT12 (state_m, data, tmp); + SHIFT16 (state, data_m, state_m); + SHIFT61 (state, data_m); + + /* gost3 */ + + data[0] = state[ 8]; + data[1] = state[ 9]; + data[2] = state[10]; + data[3] = state[11]; + data[4] = state[12]; + data[5] = state[13]; + data[6] = state[14]; + data[7] = state[15]; + + state_m[0] = state[0]; + state_m[1] = state[1]; + state_m[2] = state[2]; + state_m[3] = state[3]; + state_m[4] = state[4]; + state_m[5] = state[5]; + state_m[6] = state[6]; + state_m[7] = state[7]; + + data_m[0] = data[0]; + data_m[1] = data[1]; + data_m[2] = data[2]; + data_m[3] = data[3]; + data_m[4] = data[4]; + data_m[5] = data[5]; + data_m[6] = data[6]; + data_m[7] = data[7]; + + PASS0 (state, tmp, state_m, data_m, s_tables); + PASS2 (state, tmp, state_m, data_m, s_tables); + PASS4 (state, tmp, state_m, data_m, s_tables); + PASS6 (state, tmp, state_m, data_m, s_tables); + + SHIFT12 (state_m, data, tmp); + SHIFT16 (state, data_m, state_m); + SHIFT61 (state, data_m); + + /* store */ + + const u32x r0 = state[0]; + const u32x r1 = state[1]; + const u32x r2 = state[2]; + const u32x r3 = state[3]; + + #include VECT_COMPARE_M + } +} + +__device__ static void m06900s (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], const u32 pw_len, const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset) +{ + /** + * modifier + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 w14 = pw_len * 8; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * loop + */ + + u32x w0l = w0[0]; + + for (u32 il_pos = 0; il_pos < bfs_cnt; il_pos++) + { + const u32 w0r = c_bfs[il_pos].i; + + w0[0] = w0l | w0r; + + u32x data[8]; + + data[0] = w0[0]; + data[1] = w0[1]; + data[2] = w0[2]; + data[3] = w0[3]; + data[4] = w1[0]; + data[5] = w1[1]; + data[6] = w1[2]; + data[7] = w1[3]; + + u32x state[16]; + + state[ 0] = 0; + state[ 1] = 0; + state[ 2] = 0; + state[ 3] = 0; + state[ 4] = 0; + state[ 5] = 0; + state[ 6] = 0; + state[ 7] = 0; + state[ 8] = data[0]; + state[ 9] = data[1]; + state[10] = data[2]; + state[11] = data[3]; + state[12] = data[4]; + state[13] = data[5]; + state[14] = data[6]; + state[15] = data[7]; + + u32x state_m[8]; + u32x data_m[8]; + + /* gost1 */ + + state_m[0] = state[0]; + state_m[1] = state[1]; + state_m[2] = state[2]; + state_m[3] = state[3]; + state_m[4] = state[4]; + state_m[5] = state[5]; + state_m[6] = state[6]; + state_m[7] = state[7]; + + data_m[0] = data[0]; + data_m[1] = data[1]; + data_m[2] = data[2]; + data_m[3] = data[3]; + data_m[4] = data[4]; + data_m[5] = data[5]; + data_m[6] = data[6]; + data_m[7] = data[7]; + + u32x tmp[8]; + + PASS0 (state, tmp, state_m, data_m, s_tables); + PASS2 (state, tmp, state_m, data_m, s_tables); + PASS4 (state, tmp, state_m, data_m, s_tables); + PASS6 (state, tmp, state_m, data_m, s_tables); + + SHIFT12 (state_m, data, tmp); + SHIFT16 (state, data_m, state_m); + SHIFT61 (state, data_m); + + data[0] = w14; + data[1] = 0; + data[2] = 0; + data[3] = 0; + data[4] = 0; + data[5] = 0; + data[6] = 0; + data[7] = 0; + + /* gost2 */ + + state_m[0] = state[0]; + state_m[1] = state[1]; + state_m[2] = state[2]; + state_m[3] = state[3]; + state_m[4] = state[4]; + state_m[5] = state[5]; + state_m[6] = state[6]; + state_m[7] = state[7]; + + data_m[0] = data[0]; + data_m[1] = data[1]; + data_m[2] = data[2]; + data_m[3] = data[3]; + data_m[4] = data[4]; + data_m[5] = data[5]; + data_m[6] = data[6]; + data_m[7] = data[7]; + + PASS0 (state, tmp, state_m, data_m, s_tables); + PASS2 (state, tmp, state_m, data_m, s_tables); + PASS4 (state, tmp, state_m, data_m, s_tables); + PASS6 (state, tmp, state_m, data_m, s_tables); + + SHIFT12 (state_m, data, tmp); + SHIFT16 (state, data_m, state_m); + SHIFT61 (state, data_m); + + /* gost3 */ + + data[0] = state[ 8]; + data[1] = state[ 9]; + data[2] = state[10]; + data[3] = state[11]; + data[4] = state[12]; + data[5] = state[13]; + data[6] = state[14]; + data[7] = state[15]; + + state_m[0] = state[0]; + state_m[1] = state[1]; + state_m[2] = state[2]; + state_m[3] = state[3]; + state_m[4] = state[4]; + state_m[5] = state[5]; + state_m[6] = state[6]; + state_m[7] = state[7]; + + data_m[0] = data[0]; + data_m[1] = data[1]; + data_m[2] = data[2]; + data_m[3] = data[3]; + data_m[4] = data[4]; + data_m[5] = data[5]; + data_m[6] = data[6]; + data_m[7] = data[7]; + + PASS0 (state, tmp, state_m, data_m, s_tables); + PASS2 (state, tmp, state_m, data_m, s_tables); + PASS4 (state, tmp, state_m, data_m, s_tables); + PASS6 (state, tmp, state_m, data_m, s_tables); + + SHIFT12 (state_m, data, tmp); + SHIFT16 (state, data_m, state_m); + SHIFT61 (state, data_m); + + /* store */ + + const u32x r0 = state[0]; + const u32x r1 = state[1]; + const u32x r2 = state[2]; + const u32x r3 = state[3]; + + #include VECT_COMPARE_S + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m06900_m04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + const u32 lid = threadIdx.x; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * sbox + */ + + s_tables[0][lid] = c_tables[0][lid]; + s_tables[1][lid] = c_tables[1][lid]; + s_tables[2][lid] = c_tables[2][lid]; + s_tables[3][lid] = c_tables[3][lid]; + + __syncthreads (); + + if (gid >= gid_max) return; + + /** + * main + */ + + m06900m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m06900_m08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + const u32 lid = threadIdx.x; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * sbox + */ + + s_tables[0][lid] = c_tables[0][lid]; + s_tables[1][lid] = c_tables[1][lid]; + s_tables[2][lid] = c_tables[2][lid]; + s_tables[3][lid] = c_tables[3][lid]; + + __syncthreads (); + + if (gid >= gid_max) return; + + /** + * main + */ + + m06900m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m06900_m16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m06900_s04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + const u32 lid = threadIdx.x; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * sbox + */ + + s_tables[0][lid] = c_tables[0][lid]; + s_tables[1][lid] = c_tables[1][lid]; + s_tables[2][lid] = c_tables[2][lid]; + s_tables[3][lid] = c_tables[3][lid]; + + __syncthreads (); + + if (gid >= gid_max) return; + + /** + * main + */ + + m06900s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m06900_s08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + const u32 lid = threadIdx.x; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * sbox + */ + + s_tables[0][lid] = c_tables[0][lid]; + s_tables[1][lid] = c_tables[1][lid]; + s_tables[2][lid] = c_tables[2][lid]; + s_tables[3][lid] = c_tables[3][lid]; + + __syncthreads (); + + if (gid >= gid_max) return; + + /** + * main + */ + + m06900s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m06900_s16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/nv/m07100.cu b/nv/m07100.cu new file mode 100644 index 0000000000..79e625b9f5 --- /dev/null +++ b/nv/m07100.cu @@ -0,0 +1,503 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _PBKDF2_SHA512_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW2 +#define VECT_SIZE1 +#endif + +#define DGST_R0 0 +#define DGST_R1 1 +#define DGST_R2 2 +#define DGST_R3 3 + +#include "include/kernel_functions.c" +#include "types_nv.c" +#include "common_nv.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +__device__ __constant__ u64 k[80] = +{ + SHA512C00, SHA512C01, SHA512C02, SHA512C03, + SHA512C04, SHA512C05, SHA512C06, SHA512C07, + SHA512C08, SHA512C09, SHA512C0a, SHA512C0b, + SHA512C0c, SHA512C0d, SHA512C0e, SHA512C0f, + SHA512C10, SHA512C11, SHA512C12, SHA512C13, + SHA512C14, SHA512C15, SHA512C16, SHA512C17, + SHA512C18, SHA512C19, SHA512C1a, SHA512C1b, + SHA512C1c, SHA512C1d, SHA512C1e, SHA512C1f, + SHA512C20, SHA512C21, SHA512C22, SHA512C23, + SHA512C24, SHA512C25, SHA512C26, SHA512C27, + SHA512C28, SHA512C29, SHA512C2a, SHA512C2b, + SHA512C2c, SHA512C2d, SHA512C2e, SHA512C2f, + SHA512C30, SHA512C31, SHA512C32, SHA512C33, + SHA512C34, SHA512C35, SHA512C36, SHA512C37, + SHA512C38, SHA512C39, SHA512C3a, SHA512C3b, + SHA512C3c, SHA512C3d, SHA512C3e, SHA512C3f, + SHA512C40, SHA512C41, SHA512C42, SHA512C43, + SHA512C44, SHA512C45, SHA512C46, SHA512C47, + SHA512C48, SHA512C49, SHA512C4a, SHA512C4b, + SHA512C4c, SHA512C4d, SHA512C4e, SHA512C4f, +}; + +#define ROUND_EXPAND() \ +{ \ + w0_t = SHA512_EXPAND (we_t, w9_t, w1_t, w0_t); \ + w1_t = SHA512_EXPAND (wf_t, wa_t, w2_t, w1_t); \ + w2_t = SHA512_EXPAND (w0_t, wb_t, w3_t, w2_t); \ + w3_t = SHA512_EXPAND (w1_t, wc_t, w4_t, w3_t); \ + w4_t = SHA512_EXPAND (w2_t, wd_t, w5_t, w4_t); \ + w5_t = SHA512_EXPAND (w3_t, we_t, w6_t, w5_t); \ + w6_t = SHA512_EXPAND (w4_t, wf_t, w7_t, w6_t); \ + w7_t = SHA512_EXPAND (w5_t, w0_t, w8_t, w7_t); \ + w8_t = SHA512_EXPAND (w6_t, w1_t, w9_t, w8_t); \ + w9_t = SHA512_EXPAND (w7_t, w2_t, wa_t, w9_t); \ + wa_t = SHA512_EXPAND (w8_t, w3_t, wb_t, wa_t); \ + wb_t = SHA512_EXPAND (w9_t, w4_t, wc_t, wb_t); \ + wc_t = SHA512_EXPAND (wa_t, w5_t, wd_t, wc_t); \ + wd_t = SHA512_EXPAND (wb_t, w6_t, we_t, wd_t); \ + we_t = SHA512_EXPAND (wc_t, w7_t, wf_t, we_t); \ + wf_t = SHA512_EXPAND (wd_t, w8_t, w0_t, wf_t); \ +} + +#define ROUND_STEP(i) \ +{ \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, a, b, c, d, e, f, g, h, w0_t, k[i + 0]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, h, a, b, c, d, e, f, g, w1_t, k[i + 1]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, g, h, a, b, c, d, e, f, w2_t, k[i + 2]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, f, g, h, a, b, c, d, e, w3_t, k[i + 3]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, e, f, g, h, a, b, c, d, w4_t, k[i + 4]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, d, e, f, g, h, a, b, c, w5_t, k[i + 5]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, c, d, e, f, g, h, a, b, w6_t, k[i + 6]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, b, c, d, e, f, g, h, a, w7_t, k[i + 7]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, a, b, c, d, e, f, g, h, w8_t, k[i + 8]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, h, a, b, c, d, e, f, g, w9_t, k[i + 9]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, g, h, a, b, c, d, e, f, wa_t, k[i + 10]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, f, g, h, a, b, c, d, e, wb_t, k[i + 11]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, e, f, g, h, a, b, c, d, wc_t, k[i + 12]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, d, e, f, g, h, a, b, c, wd_t, k[i + 13]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, c, d, e, f, g, h, a, b, we_t, k[i + 14]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, b, c, d, e, f, g, h, a, wf_t, k[i + 15]); \ +} + +__device__ static void sha512_transform (const u64 w[16], u64 dgst[8]) +{ + u64 a = dgst[0]; + u64 b = dgst[1]; + u64 c = dgst[2]; + u64 d = dgst[3]; + u64 e = dgst[4]; + u64 f = dgst[5]; + u64 g = dgst[6]; + u64 h = dgst[7]; + + u64 w0_t = w[ 0]; + u64 w1_t = w[ 1]; + u64 w2_t = w[ 2]; + u64 w3_t = w[ 3]; + u64 w4_t = w[ 4]; + u64 w5_t = w[ 5]; + u64 w6_t = w[ 6]; + u64 w7_t = w[ 7]; + u64 w8_t = w[ 8]; + u64 w9_t = w[ 9]; + u64 wa_t = w[10]; + u64 wb_t = w[11]; + u64 wc_t = w[12]; + u64 wd_t = w[13]; + u64 we_t = w[14]; + u64 wf_t = w[15]; + + ROUND_STEP (0); + + for (int i = 16; i < 80; i += 16) + { + ROUND_EXPAND (); ROUND_STEP (i); + } + + dgst[0] += a; + dgst[1] += b; + dgst[2] += c; + dgst[3] += d; + dgst[4] += e; + dgst[5] += f; + dgst[6] += g; + dgst[7] += h; +} + +__device__ static void hmac_run (const u64 w1[16], const u64 ipad[8], const u64 opad[8], u64 dgst[8]) +{ + dgst[0] = ipad[0]; + dgst[1] = ipad[1]; + dgst[2] = ipad[2]; + dgst[3] = ipad[3]; + dgst[4] = ipad[4]; + dgst[5] = ipad[5]; + dgst[6] = ipad[6]; + dgst[7] = ipad[7]; + + sha512_transform (w1, dgst); + + u64 w[16]; + + w[ 0] = dgst[0]; + w[ 1] = dgst[1]; + w[ 2] = dgst[2]; + w[ 3] = dgst[3]; + w[ 4] = dgst[4]; + w[ 5] = dgst[5]; + w[ 6] = dgst[6]; + w[ 7] = dgst[7]; + w[ 8] = 0x8000000000000000; + w[ 9] = 0; + w[10] = 0; + w[11] = 0; + w[12] = 0; + w[13] = 0; + w[14] = 0; + w[15] = (128 + 64) * 8; + + dgst[0] = opad[0]; + dgst[1] = opad[1]; + dgst[2] = opad[2]; + dgst[3] = opad[3]; + dgst[4] = opad[4]; + dgst[5] = opad[5]; + dgst[6] = opad[6]; + dgst[7] = opad[7]; + + sha512_transform (w, dgst); +} + +__device__ static void hmac_init (u64 w[16], u64 ipad[8], u64 opad[8]) +{ + w[ 0] ^= 0x3636363636363636; + w[ 1] ^= 0x3636363636363636; + w[ 2] ^= 0x3636363636363636; + w[ 3] ^= 0x3636363636363636; + w[ 4] ^= 0x3636363636363636; + w[ 5] ^= 0x3636363636363636; + w[ 6] ^= 0x3636363636363636; + w[ 7] ^= 0x3636363636363636; + w[ 8] ^= 0x3636363636363636; + w[ 9] ^= 0x3636363636363636; + w[10] ^= 0x3636363636363636; + w[11] ^= 0x3636363636363636; + w[12] ^= 0x3636363636363636; + w[13] ^= 0x3636363636363636; + w[14] ^= 0x3636363636363636; + w[15] ^= 0x3636363636363636; + + ipad[0] = SHA512M_A; + ipad[1] = SHA512M_B; + ipad[2] = SHA512M_C; + ipad[3] = SHA512M_D; + ipad[4] = SHA512M_E; + ipad[5] = SHA512M_F; + ipad[6] = SHA512M_G; + ipad[7] = SHA512M_H; + + sha512_transform (w, ipad); + + w[ 0] ^= 0x6a6a6a6a6a6a6a6a; + w[ 1] ^= 0x6a6a6a6a6a6a6a6a; + w[ 2] ^= 0x6a6a6a6a6a6a6a6a; + w[ 3] ^= 0x6a6a6a6a6a6a6a6a; + w[ 4] ^= 0x6a6a6a6a6a6a6a6a; + w[ 5] ^= 0x6a6a6a6a6a6a6a6a; + w[ 6] ^= 0x6a6a6a6a6a6a6a6a; + w[ 7] ^= 0x6a6a6a6a6a6a6a6a; + w[ 8] ^= 0x6a6a6a6a6a6a6a6a; + w[ 9] ^= 0x6a6a6a6a6a6a6a6a; + w[10] ^= 0x6a6a6a6a6a6a6a6a; + w[11] ^= 0x6a6a6a6a6a6a6a6a; + w[12] ^= 0x6a6a6a6a6a6a6a6a; + w[13] ^= 0x6a6a6a6a6a6a6a6a; + w[14] ^= 0x6a6a6a6a6a6a6a6a; + w[15] ^= 0x6a6a6a6a6a6a6a6a; + + opad[0] = SHA512M_A; + opad[1] = SHA512M_B; + opad[2] = SHA512M_C; + opad[3] = SHA512M_D; + opad[4] = SHA512M_E; + opad[5] = SHA512M_F; + opad[6] = SHA512M_G; + opad[7] = SHA512M_H; + + sha512_transform (w, opad); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m07100_init (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, pbkdf2_sha512_tmp_t *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const pbkdf2_sha512_t *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = swap_workaround (pws[gid].i[ 0]); + w0[1] = swap_workaround (pws[gid].i[ 1]); + w0[2] = swap_workaround (pws[gid].i[ 2]); + w0[3] = swap_workaround (pws[gid].i[ 3]); + + u32x w1[4]; + + w1[0] = swap_workaround (pws[gid].i[ 4]); + w1[1] = swap_workaround (pws[gid].i[ 5]); + w1[2] = swap_workaround (pws[gid].i[ 6]); + w1[3] = swap_workaround (pws[gid].i[ 7]); + + u32x w2[4]; + + w2[0] = swap_workaround (pws[gid].i[ 8]); + w2[1] = swap_workaround (pws[gid].i[ 9]); + w2[2] = swap_workaround (pws[gid].i[10]); + w2[3] = swap_workaround (pws[gid].i[11]); + + u32x w3[4]; + + w3[0] = swap_workaround (pws[gid].i[12]); + w3[1] = swap_workaround (pws[gid].i[13]); + w3[2] = swap_workaround (pws[gid].i[14]); + w3[3] = swap_workaround (pws[gid].i[15]); + + /** + * salt + */ + + u64 esalt_buf[16]; + + u32 salt_len = salt_bufs[salt_pos].salt_len; + + esalt_buf[ 0] = hl32_to_64 (swap_workaround (esalt_bufs[salt_pos].salt_buf[ 0]), swap_workaround (esalt_bufs[salt_pos].salt_buf[ 1])); + esalt_buf[ 1] = hl32_to_64 (swap_workaround (esalt_bufs[salt_pos].salt_buf[ 2]), swap_workaround (esalt_bufs[salt_pos].salt_buf[ 3])); + esalt_buf[ 2] = hl32_to_64 (swap_workaround (esalt_bufs[salt_pos].salt_buf[ 4]), swap_workaround (esalt_bufs[salt_pos].salt_buf[ 5])); + esalt_buf[ 3] = hl32_to_64 (swap_workaround (esalt_bufs[salt_pos].salt_buf[ 6]), swap_workaround (esalt_bufs[salt_pos].salt_buf[ 7])); + esalt_buf[ 4] = hl32_to_64 (swap_workaround (esalt_bufs[salt_pos].salt_buf[ 8]), swap_workaround (esalt_bufs[salt_pos].salt_buf[ 9])); + esalt_buf[ 5] = hl32_to_64 (swap_workaround (esalt_bufs[salt_pos].salt_buf[10]), swap_workaround (esalt_bufs[salt_pos].salt_buf[11])); + esalt_buf[ 6] = hl32_to_64 (swap_workaround (esalt_bufs[salt_pos].salt_buf[12]), swap_workaround (esalt_bufs[salt_pos].salt_buf[13])); + esalt_buf[ 7] = hl32_to_64 (swap_workaround (esalt_bufs[salt_pos].salt_buf[14]), swap_workaround (esalt_bufs[salt_pos].salt_buf[15])); + esalt_buf[ 8] = hl32_to_64 (swap_workaround (esalt_bufs[salt_pos].salt_buf[16]), swap_workaround (esalt_bufs[salt_pos].salt_buf[17])); + esalt_buf[ 9] = hl32_to_64 (swap_workaround (esalt_bufs[salt_pos].salt_buf[18]), swap_workaround (esalt_bufs[salt_pos].salt_buf[19])); + esalt_buf[10] = hl32_to_64 (swap_workaround (esalt_bufs[salt_pos].salt_buf[20]), swap_workaround (esalt_bufs[salt_pos].salt_buf[21])); + esalt_buf[11] = hl32_to_64 (swap_workaround (esalt_bufs[salt_pos].salt_buf[22]), swap_workaround (esalt_bufs[salt_pos].salt_buf[23])); + esalt_buf[12] = hl32_to_64 (swap_workaround (esalt_bufs[salt_pos].salt_buf[24]), swap_workaround (esalt_bufs[salt_pos].salt_buf[25])); + esalt_buf[13] = hl32_to_64 (swap_workaround (esalt_bufs[salt_pos].salt_buf[26]), swap_workaround (esalt_bufs[salt_pos].salt_buf[27])); + esalt_buf[14] = 0; + esalt_buf[15] = (128 + salt_len + 4) * 8; + + u64 w[16]; + + w[ 0] = hl32_to_64 (w0[0], w0[1]); + w[ 1] = hl32_to_64 (w0[2], w0[3]); + w[ 2] = hl32_to_64 (w1[0], w1[1]); + w[ 3] = hl32_to_64 (w1[2], w1[3]); + w[ 4] = hl32_to_64 (w2[0], w2[1]); + w[ 5] = hl32_to_64 (w2[2], w2[3]); + w[ 6] = hl32_to_64 (w3[0], w3[1]); + w[ 7] = hl32_to_64 (w3[2], w3[3]); + w[ 8] = 0; + w[ 9] = 0; + w[10] = 0; + w[11] = 0; + w[12] = 0; + w[13] = 0; + w[14] = 0; + w[15] = 0; + + u64 ipad[8]; + u64 opad[8]; + + hmac_init (w, ipad, opad); + + tmps[gid].ipad[0] = ipad[0]; + tmps[gid].ipad[1] = ipad[1]; + tmps[gid].ipad[2] = ipad[2]; + tmps[gid].ipad[3] = ipad[3]; + tmps[gid].ipad[4] = ipad[4]; + tmps[gid].ipad[5] = ipad[5]; + tmps[gid].ipad[6] = ipad[6]; + tmps[gid].ipad[7] = ipad[7]; + + tmps[gid].opad[0] = opad[0]; + tmps[gid].opad[1] = opad[1]; + tmps[gid].opad[2] = opad[2]; + tmps[gid].opad[3] = opad[3]; + tmps[gid].opad[4] = opad[4]; + tmps[gid].opad[5] = opad[5]; + tmps[gid].opad[6] = opad[6]; + tmps[gid].opad[7] = opad[7]; + + for (u32 i = 0, j = 1; i < 8; i += 8, j += 1) + { + u64 dgst[8]; + + hmac_run (esalt_buf, ipad, opad, dgst); + + tmps[gid].dgst[i + 0] = dgst[0]; + tmps[gid].dgst[i + 1] = dgst[1]; + tmps[gid].dgst[i + 2] = dgst[2]; + tmps[gid].dgst[i + 3] = dgst[3]; + tmps[gid].dgst[i + 4] = dgst[4]; + tmps[gid].dgst[i + 5] = dgst[5]; + tmps[gid].dgst[i + 6] = dgst[6]; + tmps[gid].dgst[i + 7] = dgst[7]; + + tmps[gid].out[i + 0] = dgst[0]; + tmps[gid].out[i + 1] = dgst[1]; + tmps[gid].out[i + 2] = dgst[2]; + tmps[gid].out[i + 3] = dgst[3]; + tmps[gid].out[i + 4] = dgst[4]; + tmps[gid].out[i + 5] = dgst[5]; + tmps[gid].out[i + 6] = dgst[6]; + tmps[gid].out[i + 7] = dgst[7]; + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m07100_loop (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, pbkdf2_sha512_tmp_t *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const pbkdf2_sha512_t *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u64 ipad[8]; + + ipad[0] = tmps[gid].ipad[0]; + ipad[1] = tmps[gid].ipad[1]; + ipad[2] = tmps[gid].ipad[2]; + ipad[3] = tmps[gid].ipad[3]; + ipad[4] = tmps[gid].ipad[4]; + ipad[5] = tmps[gid].ipad[5]; + ipad[6] = tmps[gid].ipad[6]; + ipad[7] = tmps[gid].ipad[7]; + + u64 opad[8]; + + opad[0] = tmps[gid].opad[0]; + opad[1] = tmps[gid].opad[1]; + opad[2] = tmps[gid].opad[2]; + opad[3] = tmps[gid].opad[3]; + opad[4] = tmps[gid].opad[4]; + opad[5] = tmps[gid].opad[5]; + opad[6] = tmps[gid].opad[6]; + opad[7] = tmps[gid].opad[7]; + + for (u32 i = 0; i < 8; i += 8) + { + u64 dgst[8]; + + dgst[0] = tmps[gid].dgst[i + 0]; + dgst[1] = tmps[gid].dgst[i + 1]; + dgst[2] = tmps[gid].dgst[i + 2]; + dgst[3] = tmps[gid].dgst[i + 3]; + dgst[4] = tmps[gid].dgst[i + 4]; + dgst[5] = tmps[gid].dgst[i + 5]; + dgst[6] = tmps[gid].dgst[i + 6]; + dgst[7] = tmps[gid].dgst[i + 7]; + + u64 out[8]; + + out[0] = tmps[gid].out[i + 0]; + out[1] = tmps[gid].out[i + 1]; + out[2] = tmps[gid].out[i + 2]; + out[3] = tmps[gid].out[i + 3]; + out[4] = tmps[gid].out[i + 4]; + out[5] = tmps[gid].out[i + 5]; + out[6] = tmps[gid].out[i + 6]; + out[7] = tmps[gid].out[i + 7]; + + for (u32 j = 0; j < loop_cnt; j++) + { + u64 w[16]; + + w[ 0] = dgst[0]; + w[ 1] = dgst[1]; + w[ 2] = dgst[2]; + w[ 3] = dgst[3]; + w[ 4] = dgst[4]; + w[ 5] = dgst[5]; + w[ 6] = dgst[6]; + w[ 7] = dgst[7]; + w[ 8] = 0x8000000000000000; + w[ 9] = 0; + w[10] = 0; + w[11] = 0; + w[12] = 0; + w[13] = 0; + w[14] = 0; + w[15] = (128 + 64) * 8; + + hmac_run (w, ipad, opad, dgst); + + out[0] ^= dgst[0]; + out[1] ^= dgst[1]; + out[2] ^= dgst[2]; + out[3] ^= dgst[3]; + out[4] ^= dgst[4]; + out[5] ^= dgst[5]; + out[6] ^= dgst[6]; + out[7] ^= dgst[7]; + } + + tmps[gid].dgst[i + 0] = dgst[0]; + tmps[gid].dgst[i + 1] = dgst[1]; + tmps[gid].dgst[i + 2] = dgst[2]; + tmps[gid].dgst[i + 3] = dgst[3]; + tmps[gid].dgst[i + 4] = dgst[4]; + tmps[gid].dgst[i + 5] = dgst[5]; + tmps[gid].dgst[i + 6] = dgst[6]; + tmps[gid].dgst[i + 7] = dgst[7]; + + tmps[gid].out[i + 0] = out[0]; + tmps[gid].out[i + 1] = out[1]; + tmps[gid].out[i + 2] = out[2]; + tmps[gid].out[i + 3] = out[3]; + tmps[gid].out[i + 4] = out[4]; + tmps[gid].out[i + 5] = out[5]; + tmps[gid].out[i + 6] = out[6]; + tmps[gid].out[i + 7] = out[7]; + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m07100_comp (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, pbkdf2_sha512_tmp_t *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const pbkdf2_sha512_t *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + const u32 lid = threadIdx.x; + + const u64x a = tmps[gid].out[0]; + const u64x b = tmps[gid].out[1]; + + const u32x r0 = l32_from_64 (a); + const u32x r1 = h32_from_64 (a); + const u32x r2 = l32_from_64 (b); + const u32x r3 = h32_from_64 (b); + + #define il_pos 0 + + #include VECT_COMPARE_M +} diff --git a/nv/m07300_a0.cu b/nv/m07300_a0.cu new file mode 100644 index 0000000000..7048ef23b4 --- /dev/null +++ b/nv/m07300_a0.cu @@ -0,0 +1,621 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _SHA1_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW2 +#define VECT_SIZE1 +#endif + +#define DGST_R0 3 +#define DGST_R1 4 +#define DGST_R2 2 +#define DGST_R3 1 + +#include "include/kernel_functions.c" +#include "types_nv.c" +#include "common_nv.c" +#include "include/rp_gpu.h" +#include "rp_nv.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +__device__ static void sha1_transform (const u32x w0[4], const u32x w1[4], const u32x w2[4], const u32x w3[4], u32x digest[5]) +{ + u32x A = digest[0]; + u32x B = digest[1]; + u32x C = digest[2]; + u32x D = digest[3]; + u32x E = digest[4]; + + u32x w0_t = w0[0]; + u32x w1_t = w0[1]; + u32x w2_t = w0[2]; + u32x w3_t = w0[3]; + u32x w4_t = w1[0]; + u32x w5_t = w1[1]; + u32x w6_t = w1[2]; + u32x w7_t = w1[3]; + u32x w8_t = w2[0]; + u32x w9_t = w2[1]; + u32x wa_t = w2[2]; + u32x wb_t = w2[3]; + u32x wc_t = w3[0]; + u32x wd_t = w3[1]; + u32x we_t = w3[2]; + u32x wf_t = w3[3]; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, A, B, C, D, E, w0_t); + SHA1_STEP (SHA1_F0o, E, A, B, C, D, w1_t); + SHA1_STEP (SHA1_F0o, D, E, A, B, C, w2_t); + SHA1_STEP (SHA1_F0o, C, D, E, A, B, w3_t); + SHA1_STEP (SHA1_F0o, B, C, D, E, A, w4_t); + SHA1_STEP (SHA1_F0o, A, B, C, D, E, w5_t); + SHA1_STEP (SHA1_F0o, E, A, B, C, D, w6_t); + SHA1_STEP (SHA1_F0o, D, E, A, B, C, w7_t); + SHA1_STEP (SHA1_F0o, C, D, E, A, B, w8_t); + SHA1_STEP (SHA1_F0o, B, C, D, E, A, w9_t); + SHA1_STEP (SHA1_F0o, A, B, C, D, E, wa_t); + SHA1_STEP (SHA1_F0o, E, A, B, C, D, wb_t); + SHA1_STEP (SHA1_F0o, D, E, A, B, C, wc_t); + SHA1_STEP (SHA1_F0o, C, D, E, A, B, wd_t); + SHA1_STEP (SHA1_F0o, B, C, D, E, A, we_t); + SHA1_STEP (SHA1_F0o, A, B, C, D, E, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F0o, E, A, B, C, D, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F0o, D, E, A, B, C, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F0o, C, D, E, A, B, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F0o, B, C, D, E, A, w3_t); + + #undef K + #define K SHA1C01 + + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w7_t); + + #undef K + #define K SHA1C02 + + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, wb_t); + + #undef K + #define K SHA1C03 + + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, wf_t); + + digest[0] += A; + digest[1] += B; + digest[2] += C; + digest[3] += D; + digest[4] += E; +} + +__device__ static void hmac_sha1_pad (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], u32x ipad[5], u32x opad[5]) +{ + w0[0] = w0[0] ^ 0x36363636; + w0[1] = w0[1] ^ 0x36363636; + w0[2] = w0[2] ^ 0x36363636; + w0[3] = w0[3] ^ 0x36363636; + w1[0] = w1[0] ^ 0x36363636; + w1[1] = w1[1] ^ 0x36363636; + w1[2] = w1[2] ^ 0x36363636; + w1[3] = w1[3] ^ 0x36363636; + w2[0] = w2[0] ^ 0x36363636; + w2[1] = w2[1] ^ 0x36363636; + w2[2] = w2[2] ^ 0x36363636; + w2[3] = w2[3] ^ 0x36363636; + w3[0] = w3[0] ^ 0x36363636; + w3[1] = w3[1] ^ 0x36363636; + w3[2] = w3[2] ^ 0x36363636; + w3[3] = w3[3] ^ 0x36363636; + + ipad[0] = SHA1M_A; + ipad[1] = SHA1M_B; + ipad[2] = SHA1M_C; + ipad[3] = SHA1M_D; + ipad[4] = SHA1M_E; + + sha1_transform (w0, w1, w2, w3, ipad); + + w0[0] = w0[0] ^ 0x6a6a6a6a; + w0[1] = w0[1] ^ 0x6a6a6a6a; + w0[2] = w0[2] ^ 0x6a6a6a6a; + w0[3] = w0[3] ^ 0x6a6a6a6a; + w1[0] = w1[0] ^ 0x6a6a6a6a; + w1[1] = w1[1] ^ 0x6a6a6a6a; + w1[2] = w1[2] ^ 0x6a6a6a6a; + w1[3] = w1[3] ^ 0x6a6a6a6a; + w2[0] = w2[0] ^ 0x6a6a6a6a; + w2[1] = w2[1] ^ 0x6a6a6a6a; + w2[2] = w2[2] ^ 0x6a6a6a6a; + w2[3] = w2[3] ^ 0x6a6a6a6a; + w3[0] = w3[0] ^ 0x6a6a6a6a; + w3[1] = w3[1] ^ 0x6a6a6a6a; + w3[2] = w3[2] ^ 0x6a6a6a6a; + w3[3] = w3[3] ^ 0x6a6a6a6a; + + opad[0] = SHA1M_A; + opad[1] = SHA1M_B; + opad[2] = SHA1M_C; + opad[3] = SHA1M_D; + opad[4] = SHA1M_E; + + sha1_transform (w0, w1, w2, w3, opad); +} + +__device__ static void hmac_sha1_run (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], u32x ipad[5], u32x opad[5], u32x digest[5]) +{ + digest[0] = ipad[0]; + digest[1] = ipad[1]; + digest[2] = ipad[2]; + digest[3] = ipad[3]; + digest[4] = ipad[4]; + + sha1_transform (w0, w1, w2, w3, digest); + + w0[0] = digest[0]; + w0[1] = digest[1]; + w0[2] = digest[2]; + w0[3] = digest[3]; + w1[0] = digest[4]; + w1[1] = 0x80000000; + w1[2] = 0; + w1[3] = 0; + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = (64 + 20) * 8; + + digest[0] = opad[0]; + digest[1] = opad[1]; + digest[2] = opad[2]; + digest[3] = opad[3]; + digest[4] = opad[4]; + + sha1_transform (w0, w1, w2, w3, digest); +} + +__device__ __constant__ gpu_rule_t c_rules[1024]; + +extern "C" __global__ void __launch_bounds__ (256, 1) m07300_m04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const rakp_t *rakp_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + u32x pw_buf1[4]; + + pw_buf1[0] = pws[gid].i[ 4]; + pw_buf1[1] = pws[gid].i[ 5]; + pw_buf1[2] = pws[gid].i[ 6]; + pw_buf1[3] = pws[gid].i[ 7]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * salt + */ + + const u32 esalt_len = rakp_bufs[salt_pos].salt_len; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + + w0[0] = pw_buf0[0]; + w0[1] = pw_buf0[1]; + w0[2] = pw_buf0[2]; + w0[3] = pw_buf0[3]; + + u32x w1[4]; + + w1[0] = pw_buf1[0]; + w1[1] = pw_buf1[1]; + w1[2] = pw_buf1[2]; + w1[3] = pw_buf1[3]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 out_len = apply_rules (c_rules[il_pos].cmds, w0, w1, pw_len); + + /** + * pads + */ + + u32x w0_t[4]; + + w0_t[0] = swap_workaround (w0[0]); + w0_t[1] = swap_workaround (w0[1]); + w0_t[2] = swap_workaround (w0[2]); + w0_t[3] = swap_workaround (w0[3]); + + u32x w1_t[4]; + + w1_t[0] = swap_workaround (w1[0]); + w1_t[1] = swap_workaround (w1[1]); + w1_t[2] = swap_workaround (w1[2]); + w1_t[3] = swap_workaround (w1[3]); + + u32x w2_t[4]; + + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + + u32x w3_t[4]; + + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = 0; + + u32x ipad[5]; + u32x opad[5]; + + hmac_sha1_pad (w0_t, w1_t, w2_t, w3_t, ipad, opad); + + int esalt_size = esalt_len; + + int esalt_left; + int esalt_off; + + for (esalt_left = esalt_size, esalt_off = 0; esalt_left >= 56; esalt_left -= 64, esalt_off += 16) + { + w0_t[0] = rakp_bufs[salt_pos].salt_buf[esalt_off + 0]; + w0_t[1] = rakp_bufs[salt_pos].salt_buf[esalt_off + 1]; + w0_t[2] = rakp_bufs[salt_pos].salt_buf[esalt_off + 2]; + w0_t[3] = rakp_bufs[salt_pos].salt_buf[esalt_off + 3]; + w1_t[0] = rakp_bufs[salt_pos].salt_buf[esalt_off + 4]; + w1_t[1] = rakp_bufs[salt_pos].salt_buf[esalt_off + 5]; + w1_t[2] = rakp_bufs[salt_pos].salt_buf[esalt_off + 6]; + w1_t[3] = rakp_bufs[salt_pos].salt_buf[esalt_off + 7]; + w2_t[0] = rakp_bufs[salt_pos].salt_buf[esalt_off + 8]; + w2_t[1] = rakp_bufs[salt_pos].salt_buf[esalt_off + 9]; + w2_t[2] = rakp_bufs[salt_pos].salt_buf[esalt_off + 10]; + w2_t[3] = rakp_bufs[salt_pos].salt_buf[esalt_off + 11]; + w3_t[0] = rakp_bufs[salt_pos].salt_buf[esalt_off + 12]; + w3_t[1] = rakp_bufs[salt_pos].salt_buf[esalt_off + 13]; + w3_t[2] = rakp_bufs[salt_pos].salt_buf[esalt_off + 14]; + w3_t[3] = rakp_bufs[salt_pos].salt_buf[esalt_off + 15]; + + sha1_transform (w0_t, w1_t, w2_t, w3_t, ipad); + } + + w0_t[0] = rakp_bufs[salt_pos].salt_buf[esalt_off + 0]; + w0_t[1] = rakp_bufs[salt_pos].salt_buf[esalt_off + 1]; + w0_t[2] = rakp_bufs[salt_pos].salt_buf[esalt_off + 2]; + w0_t[3] = rakp_bufs[salt_pos].salt_buf[esalt_off + 3]; + w1_t[0] = rakp_bufs[salt_pos].salt_buf[esalt_off + 4]; + w1_t[1] = rakp_bufs[salt_pos].salt_buf[esalt_off + 5]; + w1_t[2] = rakp_bufs[salt_pos].salt_buf[esalt_off + 6]; + w1_t[3] = rakp_bufs[salt_pos].salt_buf[esalt_off + 7]; + w2_t[0] = rakp_bufs[salt_pos].salt_buf[esalt_off + 8]; + w2_t[1] = rakp_bufs[salt_pos].salt_buf[esalt_off + 9]; + w2_t[2] = rakp_bufs[salt_pos].salt_buf[esalt_off + 10]; + w2_t[3] = rakp_bufs[salt_pos].salt_buf[esalt_off + 11]; + w3_t[0] = rakp_bufs[salt_pos].salt_buf[esalt_off + 12]; + w3_t[1] = rakp_bufs[salt_pos].salt_buf[esalt_off + 13]; + w3_t[2] = 0; + w3_t[3] = (64 + esalt_size) * 8; + + u32x digest[5]; + + hmac_sha1_run (w0_t, w1_t, w2_t, w3_t, ipad, opad, digest); + + const u32x r0 = digest[3]; + const u32x r1 = digest[4]; + const u32x r2 = digest[2]; + const u32x r3 = digest[1]; + + #include VECT_COMPARE_M + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m07300_m08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const rakp_t *rakp_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m07300_m16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const rakp_t *rakp_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m07300_s04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const rakp_t *rakp_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + u32x pw_buf1[4]; + + pw_buf1[0] = pws[gid].i[ 4]; + pw_buf1[1] = pws[gid].i[ 5]; + pw_buf1[2] = pws[gid].i[ 6]; + pw_buf1[3] = pws[gid].i[ 7]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * salt + */ + + const u32 esalt_len = rakp_bufs[salt_pos].salt_len; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + + w0[0] = pw_buf0[0]; + w0[1] = pw_buf0[1]; + w0[2] = pw_buf0[2]; + w0[3] = pw_buf0[3]; + + u32x w1[4]; + + w1[0] = pw_buf1[0]; + w1[1] = pw_buf1[1]; + w1[2] = pw_buf1[2]; + w1[3] = pw_buf1[3]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 out_len = apply_rules (c_rules[il_pos].cmds, w0, w1, pw_len); + + /** + * pads + */ + + u32x w0_t[4]; + + w0_t[0] = swap_workaround (w0[0]); + w0_t[1] = swap_workaround (w0[1]); + w0_t[2] = swap_workaround (w0[2]); + w0_t[3] = swap_workaround (w0[3]); + + u32x w1_t[4]; + + w1_t[0] = swap_workaround (w1[0]); + w1_t[1] = swap_workaround (w1[1]); + w1_t[2] = swap_workaround (w1[2]); + w1_t[3] = swap_workaround (w1[3]); + + u32x w2_t[4]; + + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + + u32x w3_t[4]; + + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = 0; + + u32x ipad[5]; + u32x opad[5]; + + hmac_sha1_pad (w0_t, w1_t, w2_t, w3_t, ipad, opad); + + int esalt_size = esalt_len; + + int esalt_left; + int esalt_off; + + for (esalt_left = esalt_size, esalt_off = 0; esalt_left >= 56; esalt_left -= 64, esalt_off += 16) + { + w0_t[0] = rakp_bufs[salt_pos].salt_buf[esalt_off + 0]; + w0_t[1] = rakp_bufs[salt_pos].salt_buf[esalt_off + 1]; + w0_t[2] = rakp_bufs[salt_pos].salt_buf[esalt_off + 2]; + w0_t[3] = rakp_bufs[salt_pos].salt_buf[esalt_off + 3]; + w1_t[0] = rakp_bufs[salt_pos].salt_buf[esalt_off + 4]; + w1_t[1] = rakp_bufs[salt_pos].salt_buf[esalt_off + 5]; + w1_t[2] = rakp_bufs[salt_pos].salt_buf[esalt_off + 6]; + w1_t[3] = rakp_bufs[salt_pos].salt_buf[esalt_off + 7]; + w2_t[0] = rakp_bufs[salt_pos].salt_buf[esalt_off + 8]; + w2_t[1] = rakp_bufs[salt_pos].salt_buf[esalt_off + 9]; + w2_t[2] = rakp_bufs[salt_pos].salt_buf[esalt_off + 10]; + w2_t[3] = rakp_bufs[salt_pos].salt_buf[esalt_off + 11]; + w3_t[0] = rakp_bufs[salt_pos].salt_buf[esalt_off + 12]; + w3_t[1] = rakp_bufs[salt_pos].salt_buf[esalt_off + 13]; + w3_t[2] = rakp_bufs[salt_pos].salt_buf[esalt_off + 14]; + w3_t[3] = rakp_bufs[salt_pos].salt_buf[esalt_off + 15]; + + sha1_transform (w0_t, w1_t, w2_t, w3_t, ipad); + } + + w0_t[0] = rakp_bufs[salt_pos].salt_buf[esalt_off + 0]; + w0_t[1] = rakp_bufs[salt_pos].salt_buf[esalt_off + 1]; + w0_t[2] = rakp_bufs[salt_pos].salt_buf[esalt_off + 2]; + w0_t[3] = rakp_bufs[salt_pos].salt_buf[esalt_off + 3]; + w1_t[0] = rakp_bufs[salt_pos].salt_buf[esalt_off + 4]; + w1_t[1] = rakp_bufs[salt_pos].salt_buf[esalt_off + 5]; + w1_t[2] = rakp_bufs[salt_pos].salt_buf[esalt_off + 6]; + w1_t[3] = rakp_bufs[salt_pos].salt_buf[esalt_off + 7]; + w2_t[0] = rakp_bufs[salt_pos].salt_buf[esalt_off + 8]; + w2_t[1] = rakp_bufs[salt_pos].salt_buf[esalt_off + 9]; + w2_t[2] = rakp_bufs[salt_pos].salt_buf[esalt_off + 10]; + w2_t[3] = rakp_bufs[salt_pos].salt_buf[esalt_off + 11]; + w3_t[0] = rakp_bufs[salt_pos].salt_buf[esalt_off + 12]; + w3_t[1] = rakp_bufs[salt_pos].salt_buf[esalt_off + 13]; + w3_t[2] = 0; + w3_t[3] = (64 + esalt_size) * 8; + + u32x digest[5]; + + hmac_sha1_run (w0_t, w1_t, w2_t, w3_t, ipad, opad, digest); + + const u32x r0 = digest[3]; + const u32x r1 = digest[4]; + const u32x r2 = digest[2]; + const u32x r3 = digest[1]; + + #include VECT_COMPARE_S + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m07300_s08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const rakp_t *rakp_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m07300_s16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const rakp_t *rakp_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/nv/m07300_a1.cu b/nv/m07300_a1.cu new file mode 100644 index 0000000000..28db29a167 --- /dev/null +++ b/nv/m07300_a1.cu @@ -0,0 +1,727 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _SHA1_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW2 +#define VECT_SIZE1 +#endif + +#define DGST_R0 3 +#define DGST_R1 4 +#define DGST_R2 2 +#define DGST_R3 1 + +#include "include/kernel_functions.c" +#include "types_nv.c" +#include "common_nv.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +__device__ static void sha1_transform (const u32x w0[4], const u32x w1[4], const u32x w2[4], const u32x w3[4], u32x digest[5]) +{ + u32x A = digest[0]; + u32x B = digest[1]; + u32x C = digest[2]; + u32x D = digest[3]; + u32x E = digest[4]; + + u32x w0_t = w0[0]; + u32x w1_t = w0[1]; + u32x w2_t = w0[2]; + u32x w3_t = w0[3]; + u32x w4_t = w1[0]; + u32x w5_t = w1[1]; + u32x w6_t = w1[2]; + u32x w7_t = w1[3]; + u32x w8_t = w2[0]; + u32x w9_t = w2[1]; + u32x wa_t = w2[2]; + u32x wb_t = w2[3]; + u32x wc_t = w3[0]; + u32x wd_t = w3[1]; + u32x we_t = w3[2]; + u32x wf_t = w3[3]; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, A, B, C, D, E, w0_t); + SHA1_STEP (SHA1_F0o, E, A, B, C, D, w1_t); + SHA1_STEP (SHA1_F0o, D, E, A, B, C, w2_t); + SHA1_STEP (SHA1_F0o, C, D, E, A, B, w3_t); + SHA1_STEP (SHA1_F0o, B, C, D, E, A, w4_t); + SHA1_STEP (SHA1_F0o, A, B, C, D, E, w5_t); + SHA1_STEP (SHA1_F0o, E, A, B, C, D, w6_t); + SHA1_STEP (SHA1_F0o, D, E, A, B, C, w7_t); + SHA1_STEP (SHA1_F0o, C, D, E, A, B, w8_t); + SHA1_STEP (SHA1_F0o, B, C, D, E, A, w9_t); + SHA1_STEP (SHA1_F0o, A, B, C, D, E, wa_t); + SHA1_STEP (SHA1_F0o, E, A, B, C, D, wb_t); + SHA1_STEP (SHA1_F0o, D, E, A, B, C, wc_t); + SHA1_STEP (SHA1_F0o, C, D, E, A, B, wd_t); + SHA1_STEP (SHA1_F0o, B, C, D, E, A, we_t); + SHA1_STEP (SHA1_F0o, A, B, C, D, E, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F0o, E, A, B, C, D, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F0o, D, E, A, B, C, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F0o, C, D, E, A, B, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F0o, B, C, D, E, A, w3_t); + + #undef K + #define K SHA1C01 + + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w7_t); + + #undef K + #define K SHA1C02 + + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, wb_t); + + #undef K + #define K SHA1C03 + + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, wf_t); + + digest[0] += A; + digest[1] += B; + digest[2] += C; + digest[3] += D; + digest[4] += E; +} + +__device__ static void hmac_sha1_pad (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], u32x ipad[5], u32x opad[5]) +{ + w0[0] = w0[0] ^ 0x36363636; + w0[1] = w0[1] ^ 0x36363636; + w0[2] = w0[2] ^ 0x36363636; + w0[3] = w0[3] ^ 0x36363636; + w1[0] = w1[0] ^ 0x36363636; + w1[1] = w1[1] ^ 0x36363636; + w1[2] = w1[2] ^ 0x36363636; + w1[3] = w1[3] ^ 0x36363636; + w2[0] = w2[0] ^ 0x36363636; + w2[1] = w2[1] ^ 0x36363636; + w2[2] = w2[2] ^ 0x36363636; + w2[3] = w2[3] ^ 0x36363636; + w3[0] = w3[0] ^ 0x36363636; + w3[1] = w3[1] ^ 0x36363636; + w3[2] = w3[2] ^ 0x36363636; + w3[3] = w3[3] ^ 0x36363636; + + ipad[0] = SHA1M_A; + ipad[1] = SHA1M_B; + ipad[2] = SHA1M_C; + ipad[3] = SHA1M_D; + ipad[4] = SHA1M_E; + + sha1_transform (w0, w1, w2, w3, ipad); + + w0[0] = w0[0] ^ 0x6a6a6a6a; + w0[1] = w0[1] ^ 0x6a6a6a6a; + w0[2] = w0[2] ^ 0x6a6a6a6a; + w0[3] = w0[3] ^ 0x6a6a6a6a; + w1[0] = w1[0] ^ 0x6a6a6a6a; + w1[1] = w1[1] ^ 0x6a6a6a6a; + w1[2] = w1[2] ^ 0x6a6a6a6a; + w1[3] = w1[3] ^ 0x6a6a6a6a; + w2[0] = w2[0] ^ 0x6a6a6a6a; + w2[1] = w2[1] ^ 0x6a6a6a6a; + w2[2] = w2[2] ^ 0x6a6a6a6a; + w2[3] = w2[3] ^ 0x6a6a6a6a; + w3[0] = w3[0] ^ 0x6a6a6a6a; + w3[1] = w3[1] ^ 0x6a6a6a6a; + w3[2] = w3[2] ^ 0x6a6a6a6a; + w3[3] = w3[3] ^ 0x6a6a6a6a; + + opad[0] = SHA1M_A; + opad[1] = SHA1M_B; + opad[2] = SHA1M_C; + opad[3] = SHA1M_D; + opad[4] = SHA1M_E; + + sha1_transform (w0, w1, w2, w3, opad); +} + +__device__ static void hmac_sha1_run (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], u32x ipad[5], u32x opad[5], u32x digest[5]) +{ + digest[0] = ipad[0]; + digest[1] = ipad[1]; + digest[2] = ipad[2]; + digest[3] = ipad[3]; + digest[4] = ipad[4]; + + sha1_transform (w0, w1, w2, w3, digest); + + w0[0] = digest[0]; + w0[1] = digest[1]; + w0[2] = digest[2]; + w0[3] = digest[3]; + w1[0] = digest[4]; + w1[1] = 0x80000000; + w1[2] = 0; + w1[3] = 0; + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = (64 + 20) * 8; + + digest[0] = opad[0]; + digest[1] = opad[1]; + digest[2] = opad[2]; + digest[3] = opad[3]; + digest[4] = opad[4]; + + sha1_transform (w0, w1, w2, w3, digest); +} + +__device__ __constant__ comb_t c_combs[1024]; + +extern "C" __global__ void __launch_bounds__ (256, 1) m07300_m04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const rakp_t *rakp_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, c_combs[0].pw_len); + } + + /** + * salt + */ + + const u32 esalt_len = rakp_bufs[salt_pos].salt_len; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = c_combs[il_pos].pw_len; + + const u32 pw_len = pw_l_len + pw_r_len; + + u32 wordr0[4]; + + wordr0[0] = c_combs[il_pos].i[0]; + wordr0[1] = c_combs[il_pos].i[1]; + wordr0[2] = c_combs[il_pos].i[2]; + wordr0[3] = c_combs[il_pos].i[3]; + + u32 wordr1[4]; + + wordr1[0] = c_combs[il_pos].i[4]; + wordr1[1] = c_combs[il_pos].i[5]; + wordr1[2] = c_combs[il_pos].i[6]; + wordr1[3] = c_combs[il_pos].i[7]; + + u32 wordr2[4]; + + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + + u32 wordr3[4]; + + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + u32x w0[4]; + + w0[0] = wordl0[0] | wordr0[0]; + w0[1] = wordl0[1] | wordr0[1]; + w0[2] = wordl0[2] | wordr0[2]; + w0[3] = wordl0[3] | wordr0[3]; + + u32x w1[4]; + + w1[0] = wordl1[0] | wordr1[0]; + w1[1] = wordl1[1] | wordr1[1]; + w1[2] = wordl1[2] | wordr1[2]; + w1[3] = wordl1[3] | wordr1[3]; + + u32x w2[4]; + + w2[0] = wordl2[0] | wordr2[0]; + w2[1] = wordl2[1] | wordr2[1]; + w2[2] = wordl2[2] | wordr2[2]; + w2[3] = wordl2[3] | wordr2[3]; + + u32x w3[4]; + + w3[0] = wordl3[0] | wordr3[0]; + w3[1] = wordl3[1] | wordr3[1]; + w3[2] = wordl3[2] | wordr3[2]; + w3[3] = wordl3[3] | wordr3[3]; + + /** + * pads + */ + + u32x w0_t[4]; + + w0_t[0] = swap_workaround (w0[0]); + w0_t[1] = swap_workaround (w0[1]); + w0_t[2] = swap_workaround (w0[2]); + w0_t[3] = swap_workaround (w0[3]); + + u32x w1_t[4]; + + w1_t[0] = swap_workaround (w1[0]); + w1_t[1] = swap_workaround (w1[1]); + w1_t[2] = swap_workaround (w1[2]); + w1_t[3] = swap_workaround (w1[3]); + + u32x w2_t[4]; + + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + + u32x w3_t[4]; + + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = 0; + + u32x ipad[5]; + u32x opad[5]; + + hmac_sha1_pad (w0_t, w1_t, w2_t, w3_t, ipad, opad); + + int esalt_size = esalt_len; + + int esalt_left; + int esalt_off; + + for (esalt_left = esalt_size, esalt_off = 0; esalt_left >= 56; esalt_left -= 64, esalt_off += 16) + { + w0_t[0] = rakp_bufs[salt_pos].salt_buf[esalt_off + 0]; + w0_t[1] = rakp_bufs[salt_pos].salt_buf[esalt_off + 1]; + w0_t[2] = rakp_bufs[salt_pos].salt_buf[esalt_off + 2]; + w0_t[3] = rakp_bufs[salt_pos].salt_buf[esalt_off + 3]; + w1_t[0] = rakp_bufs[salt_pos].salt_buf[esalt_off + 4]; + w1_t[1] = rakp_bufs[salt_pos].salt_buf[esalt_off + 5]; + w1_t[2] = rakp_bufs[salt_pos].salt_buf[esalt_off + 6]; + w1_t[3] = rakp_bufs[salt_pos].salt_buf[esalt_off + 7]; + w2_t[0] = rakp_bufs[salt_pos].salt_buf[esalt_off + 8]; + w2_t[1] = rakp_bufs[salt_pos].salt_buf[esalt_off + 9]; + w2_t[2] = rakp_bufs[salt_pos].salt_buf[esalt_off + 10]; + w2_t[3] = rakp_bufs[salt_pos].salt_buf[esalt_off + 11]; + w3_t[0] = rakp_bufs[salt_pos].salt_buf[esalt_off + 12]; + w3_t[1] = rakp_bufs[salt_pos].salt_buf[esalt_off + 13]; + w3_t[2] = rakp_bufs[salt_pos].salt_buf[esalt_off + 14]; + w3_t[3] = rakp_bufs[salt_pos].salt_buf[esalt_off + 15]; + + sha1_transform (w0_t, w1_t, w2_t, w3_t, ipad); + } + + w0_t[0] = rakp_bufs[salt_pos].salt_buf[esalt_off + 0]; + w0_t[1] = rakp_bufs[salt_pos].salt_buf[esalt_off + 1]; + w0_t[2] = rakp_bufs[salt_pos].salt_buf[esalt_off + 2]; + w0_t[3] = rakp_bufs[salt_pos].salt_buf[esalt_off + 3]; + w1_t[0] = rakp_bufs[salt_pos].salt_buf[esalt_off + 4]; + w1_t[1] = rakp_bufs[salt_pos].salt_buf[esalt_off + 5]; + w1_t[2] = rakp_bufs[salt_pos].salt_buf[esalt_off + 6]; + w1_t[3] = rakp_bufs[salt_pos].salt_buf[esalt_off + 7]; + w2_t[0] = rakp_bufs[salt_pos].salt_buf[esalt_off + 8]; + w2_t[1] = rakp_bufs[salt_pos].salt_buf[esalt_off + 9]; + w2_t[2] = rakp_bufs[salt_pos].salt_buf[esalt_off + 10]; + w2_t[3] = rakp_bufs[salt_pos].salt_buf[esalt_off + 11]; + w3_t[0] = rakp_bufs[salt_pos].salt_buf[esalt_off + 12]; + w3_t[1] = rakp_bufs[salt_pos].salt_buf[esalt_off + 13]; + w3_t[2] = 0; + w3_t[3] = (64 + esalt_size) * 8; + + u32x digest[5]; + + hmac_sha1_run (w0_t, w1_t, w2_t, w3_t, ipad, opad, digest); + + const u32x r0 = digest[3]; + const u32x r1 = digest[4]; + const u32x r2 = digest[2]; + const u32x r3 = digest[1]; + + #include VECT_COMPARE_M + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m07300_m08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const rakp_t *rakp_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m07300_m16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const rakp_t *rakp_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m07300_s04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const rakp_t *rakp_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, c_combs[0].pw_len); + } + + /** + * salt + */ + + const u32 esalt_len = rakp_bufs[salt_pos].salt_len; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = c_combs[il_pos].pw_len; + + const u32 pw_len = pw_l_len + pw_r_len; + + u32 wordr0[4]; + + wordr0[0] = c_combs[il_pos].i[0]; + wordr0[1] = c_combs[il_pos].i[1]; + wordr0[2] = c_combs[il_pos].i[2]; + wordr0[3] = c_combs[il_pos].i[3]; + + u32 wordr1[4]; + + wordr1[0] = c_combs[il_pos].i[4]; + wordr1[1] = c_combs[il_pos].i[5]; + wordr1[2] = c_combs[il_pos].i[6]; + wordr1[3] = c_combs[il_pos].i[7]; + + u32 wordr2[4]; + + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + + u32 wordr3[4]; + + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + u32x w0[4]; + + w0[0] = wordl0[0] | wordr0[0]; + w0[1] = wordl0[1] | wordr0[1]; + w0[2] = wordl0[2] | wordr0[2]; + w0[3] = wordl0[3] | wordr0[3]; + + u32x w1[4]; + + w1[0] = wordl1[0] | wordr1[0]; + w1[1] = wordl1[1] | wordr1[1]; + w1[2] = wordl1[2] | wordr1[2]; + w1[3] = wordl1[3] | wordr1[3]; + + u32x w2[4]; + + w2[0] = wordl2[0] | wordr2[0]; + w2[1] = wordl2[1] | wordr2[1]; + w2[2] = wordl2[2] | wordr2[2]; + w2[3] = wordl2[3] | wordr2[3]; + + u32x w3[4]; + + w3[0] = wordl3[0] | wordr3[0]; + w3[1] = wordl3[1] | wordr3[1]; + w3[2] = wordl3[2] | wordr3[2]; + w3[3] = wordl3[3] | wordr3[3]; + + /** + * pads + */ + + u32x w0_t[4]; + + w0_t[0] = swap_workaround (w0[0]); + w0_t[1] = swap_workaround (w0[1]); + w0_t[2] = swap_workaround (w0[2]); + w0_t[3] = swap_workaround (w0[3]); + + u32x w1_t[4]; + + w1_t[0] = swap_workaround (w1[0]); + w1_t[1] = swap_workaround (w1[1]); + w1_t[2] = swap_workaround (w1[2]); + w1_t[3] = swap_workaround (w1[3]); + + u32x w2_t[4]; + + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + + u32x w3_t[4]; + + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = 0; + + u32x ipad[5]; + u32x opad[5]; + + hmac_sha1_pad (w0_t, w1_t, w2_t, w3_t, ipad, opad); + + int esalt_size = esalt_len; + + int esalt_left; + int esalt_off; + + for (esalt_left = esalt_size, esalt_off = 0; esalt_left >= 56; esalt_left -= 64, esalt_off += 16) + { + w0_t[0] = rakp_bufs[salt_pos].salt_buf[esalt_off + 0]; + w0_t[1] = rakp_bufs[salt_pos].salt_buf[esalt_off + 1]; + w0_t[2] = rakp_bufs[salt_pos].salt_buf[esalt_off + 2]; + w0_t[3] = rakp_bufs[salt_pos].salt_buf[esalt_off + 3]; + w1_t[0] = rakp_bufs[salt_pos].salt_buf[esalt_off + 4]; + w1_t[1] = rakp_bufs[salt_pos].salt_buf[esalt_off + 5]; + w1_t[2] = rakp_bufs[salt_pos].salt_buf[esalt_off + 6]; + w1_t[3] = rakp_bufs[salt_pos].salt_buf[esalt_off + 7]; + w2_t[0] = rakp_bufs[salt_pos].salt_buf[esalt_off + 8]; + w2_t[1] = rakp_bufs[salt_pos].salt_buf[esalt_off + 9]; + w2_t[2] = rakp_bufs[salt_pos].salt_buf[esalt_off + 10]; + w2_t[3] = rakp_bufs[salt_pos].salt_buf[esalt_off + 11]; + w3_t[0] = rakp_bufs[salt_pos].salt_buf[esalt_off + 12]; + w3_t[1] = rakp_bufs[salt_pos].salt_buf[esalt_off + 13]; + w3_t[2] = rakp_bufs[salt_pos].salt_buf[esalt_off + 14]; + w3_t[3] = rakp_bufs[salt_pos].salt_buf[esalt_off + 15]; + + sha1_transform (w0_t, w1_t, w2_t, w3_t, ipad); + } + + w0_t[0] = rakp_bufs[salt_pos].salt_buf[esalt_off + 0]; + w0_t[1] = rakp_bufs[salt_pos].salt_buf[esalt_off + 1]; + w0_t[2] = rakp_bufs[salt_pos].salt_buf[esalt_off + 2]; + w0_t[3] = rakp_bufs[salt_pos].salt_buf[esalt_off + 3]; + w1_t[0] = rakp_bufs[salt_pos].salt_buf[esalt_off + 4]; + w1_t[1] = rakp_bufs[salt_pos].salt_buf[esalt_off + 5]; + w1_t[2] = rakp_bufs[salt_pos].salt_buf[esalt_off + 6]; + w1_t[3] = rakp_bufs[salt_pos].salt_buf[esalt_off + 7]; + w2_t[0] = rakp_bufs[salt_pos].salt_buf[esalt_off + 8]; + w2_t[1] = rakp_bufs[salt_pos].salt_buf[esalt_off + 9]; + w2_t[2] = rakp_bufs[salt_pos].salt_buf[esalt_off + 10]; + w2_t[3] = rakp_bufs[salt_pos].salt_buf[esalt_off + 11]; + w3_t[0] = rakp_bufs[salt_pos].salt_buf[esalt_off + 12]; + w3_t[1] = rakp_bufs[salt_pos].salt_buf[esalt_off + 13]; + w3_t[2] = 0; + w3_t[3] = (64 + esalt_size) * 8; + + u32x digest[5]; + + hmac_sha1_run (w0_t, w1_t, w2_t, w3_t, ipad, opad, digest); + + const u32x r0 = digest[3]; + const u32x r1 = digest[4]; + const u32x r2 = digest[2]; + const u32x r3 = digest[1]; + + #include VECT_COMPARE_S + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m07300_s08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const rakp_t *rakp_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m07300_s16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const rakp_t *rakp_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/nv/m07300_a3.cu b/nv/m07300_a3.cu new file mode 100644 index 0000000000..4966609670 --- /dev/null +++ b/nv/m07300_a3.cu @@ -0,0 +1,791 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _SHA1_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW2 +#define VECT_SIZE1 +#endif + +#define DGST_R0 3 +#define DGST_R1 4 +#define DGST_R2 2 +#define DGST_R3 1 + +#include "include/kernel_functions.c" +#include "types_nv.c" +#include "common_nv.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +__device__ static void sha1_transform (const u32x w0[4], const u32x w1[4], const u32x w2[4], const u32x w3[4], u32x digest[5]) +{ + u32x A = digest[0]; + u32x B = digest[1]; + u32x C = digest[2]; + u32x D = digest[3]; + u32x E = digest[4]; + + u32x w0_t = w0[0]; + u32x w1_t = w0[1]; + u32x w2_t = w0[2]; + u32x w3_t = w0[3]; + u32x w4_t = w1[0]; + u32x w5_t = w1[1]; + u32x w6_t = w1[2]; + u32x w7_t = w1[3]; + u32x w8_t = w2[0]; + u32x w9_t = w2[1]; + u32x wa_t = w2[2]; + u32x wb_t = w2[3]; + u32x wc_t = w3[0]; + u32x wd_t = w3[1]; + u32x we_t = w3[2]; + u32x wf_t = w3[3]; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, A, B, C, D, E, w0_t); + SHA1_STEP (SHA1_F0o, E, A, B, C, D, w1_t); + SHA1_STEP (SHA1_F0o, D, E, A, B, C, w2_t); + SHA1_STEP (SHA1_F0o, C, D, E, A, B, w3_t); + SHA1_STEP (SHA1_F0o, B, C, D, E, A, w4_t); + SHA1_STEP (SHA1_F0o, A, B, C, D, E, w5_t); + SHA1_STEP (SHA1_F0o, E, A, B, C, D, w6_t); + SHA1_STEP (SHA1_F0o, D, E, A, B, C, w7_t); + SHA1_STEP (SHA1_F0o, C, D, E, A, B, w8_t); + SHA1_STEP (SHA1_F0o, B, C, D, E, A, w9_t); + SHA1_STEP (SHA1_F0o, A, B, C, D, E, wa_t); + SHA1_STEP (SHA1_F0o, E, A, B, C, D, wb_t); + SHA1_STEP (SHA1_F0o, D, E, A, B, C, wc_t); + SHA1_STEP (SHA1_F0o, C, D, E, A, B, wd_t); + SHA1_STEP (SHA1_F0o, B, C, D, E, A, we_t); + SHA1_STEP (SHA1_F0o, A, B, C, D, E, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F0o, E, A, B, C, D, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F0o, D, E, A, B, C, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F0o, C, D, E, A, B, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F0o, B, C, D, E, A, w3_t); + + #undef K + #define K SHA1C01 + + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w7_t); + + #undef K + #define K SHA1C02 + + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, wb_t); + + #undef K + #define K SHA1C03 + + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, wf_t); + + digest[0] += A; + digest[1] += B; + digest[2] += C; + digest[3] += D; + digest[4] += E; +} + +__device__ static void hmac_sha1_pad (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], u32x ipad[5], u32x opad[5]) +{ + w0[0] = w0[0] ^ 0x36363636; + w0[1] = w0[1] ^ 0x36363636; + w0[2] = w0[2] ^ 0x36363636; + w0[3] = w0[3] ^ 0x36363636; + w1[0] = w1[0] ^ 0x36363636; + w1[1] = w1[1] ^ 0x36363636; + w1[2] = w1[2] ^ 0x36363636; + w1[3] = w1[3] ^ 0x36363636; + w2[0] = w2[0] ^ 0x36363636; + w2[1] = w2[1] ^ 0x36363636; + w2[2] = w2[2] ^ 0x36363636; + w2[3] = w2[3] ^ 0x36363636; + w3[0] = w3[0] ^ 0x36363636; + w3[1] = w3[1] ^ 0x36363636; + w3[2] = w3[2] ^ 0x36363636; + w3[3] = w3[3] ^ 0x36363636; + + ipad[0] = SHA1M_A; + ipad[1] = SHA1M_B; + ipad[2] = SHA1M_C; + ipad[3] = SHA1M_D; + ipad[4] = SHA1M_E; + + sha1_transform (w0, w1, w2, w3, ipad); + + w0[0] = w0[0] ^ 0x6a6a6a6a; + w0[1] = w0[1] ^ 0x6a6a6a6a; + w0[2] = w0[2] ^ 0x6a6a6a6a; + w0[3] = w0[3] ^ 0x6a6a6a6a; + w1[0] = w1[0] ^ 0x6a6a6a6a; + w1[1] = w1[1] ^ 0x6a6a6a6a; + w1[2] = w1[2] ^ 0x6a6a6a6a; + w1[3] = w1[3] ^ 0x6a6a6a6a; + w2[0] = w2[0] ^ 0x6a6a6a6a; + w2[1] = w2[1] ^ 0x6a6a6a6a; + w2[2] = w2[2] ^ 0x6a6a6a6a; + w2[3] = w2[3] ^ 0x6a6a6a6a; + w3[0] = w3[0] ^ 0x6a6a6a6a; + w3[1] = w3[1] ^ 0x6a6a6a6a; + w3[2] = w3[2] ^ 0x6a6a6a6a; + w3[3] = w3[3] ^ 0x6a6a6a6a; + + opad[0] = SHA1M_A; + opad[1] = SHA1M_B; + opad[2] = SHA1M_C; + opad[3] = SHA1M_D; + opad[4] = SHA1M_E; + + sha1_transform (w0, w1, w2, w3, opad); +} + +__device__ static void hmac_sha1_run (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], u32x ipad[5], u32x opad[5], u32x digest[5]) +{ + digest[0] = ipad[0]; + digest[1] = ipad[1]; + digest[2] = ipad[2]; + digest[3] = ipad[3]; + digest[4] = ipad[4]; + + sha1_transform (w0, w1, w2, w3, digest); + + w0[0] = digest[0]; + w0[1] = digest[1]; + w0[2] = digest[2]; + w0[3] = digest[3]; + w1[0] = digest[4]; + w1[1] = 0x80000000; + w1[2] = 0; + w1[3] = 0; + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = (64 + 20) * 8; + + digest[0] = opad[0]; + digest[1] = opad[1]; + digest[2] = opad[2]; + digest[3] = opad[3]; + digest[4] = opad[4]; + + sha1_transform (w0, w1, w2, w3, digest); +} + +__device__ __constant__ bf_t c_bfs[1024]; + +__device__ static void m07300m (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], const u32 pw_len, const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const rakp_t *rakp_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset) +{ + /** + * modifier + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + const u32 lid = threadIdx.x; + + /** + * salt + */ + + const u32 esalt_len = rakp_bufs[salt_pos].salt_len; + + /** + * loop + */ + + u32x w0l = w0[0]; + + for (u32 il_pos = 0; il_pos < bfs_cnt; il_pos++) + { + const u32 w0r = c_bfs[il_pos].i; + + w0[0] = w0l | w0r; + + /** + * pads + */ + + u32x w0_t[4]; + + w0_t[0] = w0[0]; + w0_t[1] = w0[1]; + w0_t[2] = w0[2]; + w0_t[3] = w0[3]; + + u32x w1_t[4]; + + w1_t[0] = w1[0]; + w1_t[1] = w1[1]; + w1_t[2] = w1[2]; + w1_t[3] = w1[3]; + + u32x w2_t[4]; + + w2_t[0] = w2[0]; + w2_t[1] = w2[1]; + w2_t[2] = w2[2]; + w2_t[3] = w2[3]; + + u32x w3_t[4]; + + w3_t[0] = w3[0]; + w3_t[1] = w3[1]; + w3_t[2] = 0; + w3_t[3] = 0; + + u32x ipad[5]; + u32x opad[5]; + + hmac_sha1_pad (w0_t, w1_t, w2_t, w3_t, ipad, opad); + + int esalt_size = esalt_len; + + int esalt_left; + int esalt_off; + + for (esalt_left = esalt_size, esalt_off = 0; esalt_left >= 56; esalt_left -= 64, esalt_off += 16) + { + w0_t[0] = rakp_bufs[salt_pos].salt_buf[esalt_off + 0]; + w0_t[1] = rakp_bufs[salt_pos].salt_buf[esalt_off + 1]; + w0_t[2] = rakp_bufs[salt_pos].salt_buf[esalt_off + 2]; + w0_t[3] = rakp_bufs[salt_pos].salt_buf[esalt_off + 3]; + w1_t[0] = rakp_bufs[salt_pos].salt_buf[esalt_off + 4]; + w1_t[1] = rakp_bufs[salt_pos].salt_buf[esalt_off + 5]; + w1_t[2] = rakp_bufs[salt_pos].salt_buf[esalt_off + 6]; + w1_t[3] = rakp_bufs[salt_pos].salt_buf[esalt_off + 7]; + w2_t[0] = rakp_bufs[salt_pos].salt_buf[esalt_off + 8]; + w2_t[1] = rakp_bufs[salt_pos].salt_buf[esalt_off + 9]; + w2_t[2] = rakp_bufs[salt_pos].salt_buf[esalt_off + 10]; + w2_t[3] = rakp_bufs[salt_pos].salt_buf[esalt_off + 11]; + w3_t[0] = rakp_bufs[salt_pos].salt_buf[esalt_off + 12]; + w3_t[1] = rakp_bufs[salt_pos].salt_buf[esalt_off + 13]; + w3_t[2] = rakp_bufs[salt_pos].salt_buf[esalt_off + 14]; + w3_t[3] = rakp_bufs[salt_pos].salt_buf[esalt_off + 15]; + + sha1_transform (w0_t, w1_t, w2_t, w3_t, ipad); + } + + w0_t[0] = rakp_bufs[salt_pos].salt_buf[esalt_off + 0]; + w0_t[1] = rakp_bufs[salt_pos].salt_buf[esalt_off + 1]; + w0_t[2] = rakp_bufs[salt_pos].salt_buf[esalt_off + 2]; + w0_t[3] = rakp_bufs[salt_pos].salt_buf[esalt_off + 3]; + w1_t[0] = rakp_bufs[salt_pos].salt_buf[esalt_off + 4]; + w1_t[1] = rakp_bufs[salt_pos].salt_buf[esalt_off + 5]; + w1_t[2] = rakp_bufs[salt_pos].salt_buf[esalt_off + 6]; + w1_t[3] = rakp_bufs[salt_pos].salt_buf[esalt_off + 7]; + w2_t[0] = rakp_bufs[salt_pos].salt_buf[esalt_off + 8]; + w2_t[1] = rakp_bufs[salt_pos].salt_buf[esalt_off + 9]; + w2_t[2] = rakp_bufs[salt_pos].salt_buf[esalt_off + 10]; + w2_t[3] = rakp_bufs[salt_pos].salt_buf[esalt_off + 11]; + w3_t[0] = rakp_bufs[salt_pos].salt_buf[esalt_off + 12]; + w3_t[1] = rakp_bufs[salt_pos].salt_buf[esalt_off + 13]; + w3_t[2] = 0; + w3_t[3] = (64 + esalt_size) * 8; + + u32x digest[5]; + + hmac_sha1_run (w0_t, w1_t, w2_t, w3_t, ipad, opad, digest); + + const u32x r0 = digest[3]; + const u32x r1 = digest[4]; + const u32x r2 = digest[2]; + const u32x r3 = digest[1]; + + #include VECT_COMPARE_M + } +} + +__device__ static void m07300s (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], const u32 pw_len, const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const rakp_t *rakp_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset) +{ + /** + * modifier + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + const u32 lid = threadIdx.x; + + /** + * salt + */ + + const u32 esalt_len = rakp_bufs[salt_pos].salt_len; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * loop + */ + + u32x w0l = w0[0]; + + for (u32 il_pos = 0; il_pos < bfs_cnt; il_pos++) + { + const u32 w0r = c_bfs[il_pos].i; + + w0[0] = w0l | w0r; + + /** + * pads + */ + + u32x w0_t[4]; + + w0_t[0] = w0[0]; + w0_t[1] = w0[1]; + w0_t[2] = w0[2]; + w0_t[3] = w0[3]; + + u32x w1_t[4]; + + w1_t[0] = w1[0]; + w1_t[1] = w1[1]; + w1_t[2] = w1[2]; + w1_t[3] = w1[3]; + + u32x w2_t[4]; + + w2_t[0] = w2[0]; + w2_t[1] = w2[1]; + w2_t[2] = w2[2]; + w2_t[3] = w2[3]; + + u32x w3_t[4]; + + w3_t[0] = w3[0]; + w3_t[1] = w3[1]; + w3_t[2] = 0; + w3_t[3] = 0; + + u32x ipad[5]; + u32x opad[5]; + + hmac_sha1_pad (w0_t, w1_t, w2_t, w3_t, ipad, opad); + + int esalt_size = esalt_len; + + int esalt_left; + int esalt_off; + + for (esalt_left = esalt_size, esalt_off = 0; esalt_left >= 56; esalt_left -= 64, esalt_off += 16) + { + w0_t[0] = rakp_bufs[salt_pos].salt_buf[esalt_off + 0]; + w0_t[1] = rakp_bufs[salt_pos].salt_buf[esalt_off + 1]; + w0_t[2] = rakp_bufs[salt_pos].salt_buf[esalt_off + 2]; + w0_t[3] = rakp_bufs[salt_pos].salt_buf[esalt_off + 3]; + w1_t[0] = rakp_bufs[salt_pos].salt_buf[esalt_off + 4]; + w1_t[1] = rakp_bufs[salt_pos].salt_buf[esalt_off + 5]; + w1_t[2] = rakp_bufs[salt_pos].salt_buf[esalt_off + 6]; + w1_t[3] = rakp_bufs[salt_pos].salt_buf[esalt_off + 7]; + w2_t[0] = rakp_bufs[salt_pos].salt_buf[esalt_off + 8]; + w2_t[1] = rakp_bufs[salt_pos].salt_buf[esalt_off + 9]; + w2_t[2] = rakp_bufs[salt_pos].salt_buf[esalt_off + 10]; + w2_t[3] = rakp_bufs[salt_pos].salt_buf[esalt_off + 11]; + w3_t[0] = rakp_bufs[salt_pos].salt_buf[esalt_off + 12]; + w3_t[1] = rakp_bufs[salt_pos].salt_buf[esalt_off + 13]; + w3_t[2] = rakp_bufs[salt_pos].salt_buf[esalt_off + 14]; + w3_t[3] = rakp_bufs[salt_pos].salt_buf[esalt_off + 15]; + + sha1_transform (w0_t, w1_t, w2_t, w3_t, ipad); + } + + w0_t[0] = rakp_bufs[salt_pos].salt_buf[esalt_off + 0]; + w0_t[1] = rakp_bufs[salt_pos].salt_buf[esalt_off + 1]; + w0_t[2] = rakp_bufs[salt_pos].salt_buf[esalt_off + 2]; + w0_t[3] = rakp_bufs[salt_pos].salt_buf[esalt_off + 3]; + w1_t[0] = rakp_bufs[salt_pos].salt_buf[esalt_off + 4]; + w1_t[1] = rakp_bufs[salt_pos].salt_buf[esalt_off + 5]; + w1_t[2] = rakp_bufs[salt_pos].salt_buf[esalt_off + 6]; + w1_t[3] = rakp_bufs[salt_pos].salt_buf[esalt_off + 7]; + w2_t[0] = rakp_bufs[salt_pos].salt_buf[esalt_off + 8]; + w2_t[1] = rakp_bufs[salt_pos].salt_buf[esalt_off + 9]; + w2_t[2] = rakp_bufs[salt_pos].salt_buf[esalt_off + 10]; + w2_t[3] = rakp_bufs[salt_pos].salt_buf[esalt_off + 11]; + w3_t[0] = rakp_bufs[salt_pos].salt_buf[esalt_off + 12]; + w3_t[1] = rakp_bufs[salt_pos].salt_buf[esalt_off + 13]; + w3_t[2] = 0; + w3_t[3] = (64 + esalt_size) * 8; + + u32x digest[5]; + + hmac_sha1_run (w0_t, w1_t, w2_t, w3_t, ipad, opad, digest); + + const u32x r0 = digest[3]; + const u32x r1 = digest[4]; + const u32x r2 = digest[2]; + const u32x r3 = digest[1]; + + #include VECT_COMPARE_S + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m07300_m04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const rakp_t *rakp_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m07300m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, rakp_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m07300_m08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const rakp_t *rakp_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m07300m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, rakp_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m07300_m16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const rakp_t *rakp_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = pws[gid].i[ 8]; + w2[1] = pws[gid].i[ 9]; + w2[2] = pws[gid].i[10]; + w2[3] = pws[gid].i[11]; + + u32x w3[4]; + + w3[0] = pws[gid].i[12]; + w3[1] = pws[gid].i[13]; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m07300m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, rakp_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m07300_s04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const rakp_t *rakp_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m07300s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, rakp_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m07300_s08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const rakp_t *rakp_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m07300s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, rakp_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m07300_s16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const rakp_t *rakp_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = pws[gid].i[ 8]; + w2[1] = pws[gid].i[ 9]; + w2[2] = pws[gid].i[10]; + w2[3] = pws[gid].i[11]; + + u32x w3[4]; + + w3[0] = pws[gid].i[12]; + w3[1] = pws[gid].i[13]; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m07300s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, rakp_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} diff --git a/nv/m07400.cu b/nv/m07400.cu new file mode 100644 index 0000000000..9412e40fd6 --- /dev/null +++ b/nv/m07400.cu @@ -0,0 +1,1283 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _SHA256_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW2 +#define VECT_SIZE1 +#endif + +#define DGST_R0 0 +#define DGST_R1 1 +#define DGST_R2 2 +#define DGST_R3 3 + +#include "include/kernel_functions.c" +#include "types_nv.c" +#include "common_nv.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +__device__ __constant__ u32 k_sha256[64] = +{ + SHA256C00, SHA256C01, SHA256C02, SHA256C03, + SHA256C04, SHA256C05, SHA256C06, SHA256C07, + SHA256C08, SHA256C09, SHA256C0a, SHA256C0b, + SHA256C0c, SHA256C0d, SHA256C0e, SHA256C0f, + SHA256C10, SHA256C11, SHA256C12, SHA256C13, + SHA256C14, SHA256C15, SHA256C16, SHA256C17, + SHA256C18, SHA256C19, SHA256C1a, SHA256C1b, + SHA256C1c, SHA256C1d, SHA256C1e, SHA256C1f, + SHA256C20, SHA256C21, SHA256C22, SHA256C23, + SHA256C24, SHA256C25, SHA256C26, SHA256C27, + SHA256C28, SHA256C29, SHA256C2a, SHA256C2b, + SHA256C2c, SHA256C2d, SHA256C2e, SHA256C2f, + SHA256C30, SHA256C31, SHA256C32, SHA256C33, + SHA256C34, SHA256C35, SHA256C36, SHA256C37, + SHA256C38, SHA256C39, SHA256C3a, SHA256C3b, + SHA256C3c, SHA256C3d, SHA256C3e, SHA256C3f, +}; + +__device__ static void sha256_transform (const u32x w[16], u32x digest[8]) +{ + u32x a = digest[0]; + u32x b = digest[1]; + u32x c = digest[2]; + u32x d = digest[3]; + u32x e = digest[4]; + u32x f = digest[5]; + u32x g = digest[6]; + u32x h = digest[7]; + + u32x w0_t = swap_workaround (w[ 0]); + u32x w1_t = swap_workaround (w[ 1]); + u32x w2_t = swap_workaround (w[ 2]); + u32x w3_t = swap_workaround (w[ 3]); + u32x w4_t = swap_workaround (w[ 4]); + u32x w5_t = swap_workaround (w[ 5]); + u32x w6_t = swap_workaround (w[ 6]); + u32x w7_t = swap_workaround (w[ 7]); + u32x w8_t = swap_workaround (w[ 8]); + u32x w9_t = swap_workaround (w[ 9]); + u32x wa_t = swap_workaround (w[10]); + u32x wb_t = swap_workaround (w[11]); + u32x wc_t = swap_workaround (w[12]); + u32x wd_t = swap_workaround (w[13]); + u32x we_t = swap_workaround (w[14]); + u32x wf_t = swap_workaround (w[15]); + + #define ROUND_EXPAND() \ + { \ + w0_t = SHA256_EXPAND (we_t, w9_t, w1_t, w0_t); \ + w1_t = SHA256_EXPAND (wf_t, wa_t, w2_t, w1_t); \ + w2_t = SHA256_EXPAND (w0_t, wb_t, w3_t, w2_t); \ + w3_t = SHA256_EXPAND (w1_t, wc_t, w4_t, w3_t); \ + w4_t = SHA256_EXPAND (w2_t, wd_t, w5_t, w4_t); \ + w5_t = SHA256_EXPAND (w3_t, we_t, w6_t, w5_t); \ + w6_t = SHA256_EXPAND (w4_t, wf_t, w7_t, w6_t); \ + w7_t = SHA256_EXPAND (w5_t, w0_t, w8_t, w7_t); \ + w8_t = SHA256_EXPAND (w6_t, w1_t, w9_t, w8_t); \ + w9_t = SHA256_EXPAND (w7_t, w2_t, wa_t, w9_t); \ + wa_t = SHA256_EXPAND (w8_t, w3_t, wb_t, wa_t); \ + wb_t = SHA256_EXPAND (w9_t, w4_t, wc_t, wb_t); \ + wc_t = SHA256_EXPAND (wa_t, w5_t, wd_t, wc_t); \ + wd_t = SHA256_EXPAND (wb_t, w6_t, we_t, wd_t); \ + we_t = SHA256_EXPAND (wc_t, w7_t, wf_t, we_t); \ + wf_t = SHA256_EXPAND (wd_t, w8_t, w0_t, wf_t); \ + } + + #define ROUND_STEP(i) \ + { \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, k_sha256[i + 0]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, k_sha256[i + 1]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, k_sha256[i + 2]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, k_sha256[i + 3]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, k_sha256[i + 4]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, k_sha256[i + 5]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, k_sha256[i + 6]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, k_sha256[i + 7]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, k_sha256[i + 8]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, k_sha256[i + 9]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, k_sha256[i + 10]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, k_sha256[i + 11]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, k_sha256[i + 12]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, k_sha256[i + 13]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, k_sha256[i + 14]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, k_sha256[i + 15]); \ + } + + ROUND_STEP (0); + + for (int i = 16; i < 64; i += 16) + { + ROUND_EXPAND (); ROUND_STEP (i); + } + + digest[0] += a; + digest[1] += b; + digest[2] += c; + digest[3] += d; + digest[4] += e; + digest[5] += f; + digest[6] += g; + digest[7] += h; +} + +__device__ static void sha256_transform_no14 (const u32x w[16], u32x digest[8]) +{ + u32x w_t[16]; + + w_t[ 0] = w[ 0]; + w_t[ 1] = w[ 1]; + w_t[ 2] = w[ 2]; + w_t[ 3] = w[ 3]; + w_t[ 4] = w[ 4]; + w_t[ 5] = w[ 5]; + w_t[ 6] = w[ 6]; + w_t[ 7] = w[ 7]; + w_t[ 8] = w[ 8]; + w_t[ 9] = w[ 9]; + w_t[10] = w[10]; + w_t[11] = w[11]; + w_t[12] = w[12]; + w_t[13] = w[13]; + w_t[14] = 0; + w_t[15] = w[15]; + + sha256_transform (w_t, digest); +} + +__device__ static void init_ctx (u32x digest[8]) +{ + digest[0] = SHA256M_A; + digest[1] = SHA256M_B; + digest[2] = SHA256M_C; + digest[3] = SHA256M_D; + digest[4] = SHA256M_E; + digest[5] = SHA256M_F; + digest[6] = SHA256M_G; + digest[7] = SHA256M_H; +} + +__device__ static void bzero16 (u32x block[16]) +{ + block[ 0] = 0; + block[ 1] = 0; + block[ 2] = 0; + block[ 3] = 0; + block[ 4] = 0; + block[ 5] = 0; + block[ 6] = 0; + block[ 7] = 0; + block[ 8] = 0; + block[ 9] = 0; + block[10] = 0; + block[11] = 0; + block[12] = 0; + block[13] = 0; + block[14] = 0; + block[15] = 0; +} + +__device__ static void bswap8 (u32x block[16]) +{ + block[ 0] = swap_workaround (block[ 0]); + block[ 1] = swap_workaround (block[ 1]); + block[ 2] = swap_workaround (block[ 2]); + block[ 3] = swap_workaround (block[ 3]); + block[ 4] = swap_workaround (block[ 4]); + block[ 5] = swap_workaround (block[ 5]); + block[ 6] = swap_workaround (block[ 6]); + block[ 7] = swap_workaround (block[ 7]); +} + +__device__ static u32 memcat16 (u32x block[16], const u32 block_len, const u32x append[4], const u32 append_len) +{ + const u32 div = block_len / 4; + + u32x tmp0; + u32x tmp1; + u32x tmp2; + u32x tmp3; + u32x tmp4; + + #if __CUDA_ARCH__ >= 200 + + const int offset_minus_4 = 4 - (block_len & 3); + + const int selector = (0x76543210 >> (offset_minus_4 * 4)) & 0xffff; + + tmp0 = __byte_perm ( 0, append[0], selector); + tmp1 = __byte_perm (append[0], append[1], selector); + tmp2 = __byte_perm (append[1], append[2], selector); + tmp3 = __byte_perm (append[2], append[3], selector); + tmp4 = __byte_perm (append[3], 0, selector); + + #else + + const u32 mod = block_len & 3; + + switch (mod) + { + case 0: tmp0 = append[0]; + tmp1 = append[1]; + tmp2 = append[2]; + tmp3 = append[3]; + tmp4 = 0; + break; + case 1: tmp0 = append[0] << 8; + tmp1 = append[0] >> 24 | append[1] << 8; + tmp2 = append[1] >> 24 | append[2] << 8; + tmp3 = append[2] >> 24 | append[3] << 8; + tmp4 = append[3] >> 24; + break; + case 2: tmp0 = append[0] << 16; + tmp1 = append[0] >> 16 | append[1] << 16; + tmp2 = append[1] >> 16 | append[2] << 16; + tmp3 = append[2] >> 16 | append[3] << 16; + tmp4 = append[3] >> 16; + break; + case 3: tmp0 = append[0] << 24; + tmp1 = append[0] >> 8 | append[1] << 24; + tmp2 = append[1] >> 8 | append[2] << 24; + tmp3 = append[2] >> 8 | append[3] << 24; + tmp4 = append[3] >> 8; + break; + } + + #endif + + switch (div) + { + case 0: block[ 0] |= tmp0; + block[ 1] = tmp1; + block[ 2] = tmp2; + block[ 3] = tmp3; + block[ 4] = tmp4; + break; + case 1: block[ 1] |= tmp0; + block[ 2] = tmp1; + block[ 3] = tmp2; + block[ 4] = tmp3; + block[ 5] = tmp4; + break; + case 2: block[ 2] |= tmp0; + block[ 3] = tmp1; + block[ 4] = tmp2; + block[ 5] = tmp3; + block[ 6] = tmp4; + break; + case 3: block[ 3] |= tmp0; + block[ 4] = tmp1; + block[ 5] = tmp2; + block[ 6] = tmp3; + block[ 7] = tmp4; + break; + case 4: block[ 4] |= tmp0; + block[ 5] = tmp1; + block[ 6] = tmp2; + block[ 7] = tmp3; + block[ 8] = tmp4; + break; + case 5: block[ 5] |= tmp0; + block[ 6] = tmp1; + block[ 7] = tmp2; + block[ 8] = tmp3; + block[ 9] = tmp4; + break; + case 6: block[ 6] |= tmp0; + block[ 7] = tmp1; + block[ 8] = tmp2; + block[ 9] = tmp3; + block[10] = tmp4; + break; + case 7: block[ 7] |= tmp0; + block[ 8] = tmp1; + block[ 9] = tmp2; + block[10] = tmp3; + block[11] = tmp4; + break; + case 8: block[ 8] |= tmp0; + block[ 9] = tmp1; + block[10] = tmp2; + block[11] = tmp3; + block[12] = tmp4; + break; + case 9: block[ 9] |= tmp0; + block[10] = tmp1; + block[11] = tmp2; + block[12] = tmp3; + block[13] = tmp4; + break; + case 10: block[10] |= tmp0; + block[11] = tmp1; + block[12] = tmp2; + block[13] = tmp3; + block[14] = tmp4; + break; + case 11: block[11] |= tmp0; + block[12] = tmp1; + block[13] = tmp2; + block[14] = tmp3; + block[15] = tmp4; + break; + case 12: block[12] |= tmp0; + block[13] = tmp1; + block[14] = tmp2; + block[15] = tmp3; + break; + case 13: block[13] |= tmp0; + block[14] = tmp1; + block[15] = tmp2; + break; + case 14: block[14] |= tmp0; + block[15] = tmp1; + break; + case 15: block[15] |= tmp0; + break; + } + + u32 new_len = block_len + append_len; + + return new_len; +} + +__device__ static u32 memcat16c (u32x block[16], const u32 block_len, const u32x append[4], const u32 append_len, u32x digest[8]) +{ + const u32 div = block_len / 4; + + u32x tmp0; + u32x tmp1; + u32x tmp2; + u32x tmp3; + u32x tmp4; + + #if __CUDA_ARCH__ >= 200 + + const int offset_minus_4 = 4 - (block_len & 3); + + const int selector = (0x76543210 >> (offset_minus_4 * 4)) & 0xffff; + + tmp0 = __byte_perm ( 0, append[0], selector); + tmp1 = __byte_perm (append[0], append[1], selector); + tmp2 = __byte_perm (append[1], append[2], selector); + tmp3 = __byte_perm (append[2], append[3], selector); + tmp4 = __byte_perm (append[3], 0, selector); + + #else + + const u32 mod = block_len & 3; + + switch (mod) + { + case 0: tmp0 = append[0]; + tmp1 = append[1]; + tmp2 = append[2]; + tmp3 = append[3]; + tmp4 = 0; + break; + case 1: tmp0 = append[0] << 8; + tmp1 = append[0] >> 24 | append[1] << 8; + tmp2 = append[1] >> 24 | append[2] << 8; + tmp3 = append[2] >> 24 | append[3] << 8; + tmp4 = append[3] >> 24; + break; + case 2: tmp0 = append[0] << 16; + tmp1 = append[0] >> 16 | append[1] << 16; + tmp2 = append[1] >> 16 | append[2] << 16; + tmp3 = append[2] >> 16 | append[3] << 16; + tmp4 = append[3] >> 16; + break; + case 3: tmp0 = append[0] << 24; + tmp1 = append[0] >> 8 | append[1] << 24; + tmp2 = append[1] >> 8 | append[2] << 24; + tmp3 = append[2] >> 8 | append[3] << 24; + tmp4 = append[3] >> 8; + break; + } + + #endif + + u32x carry[4] = { 0, 0, 0, 0 }; + + switch (div) + { + case 0: block[ 0] |= tmp0; + block[ 1] = tmp1; + block[ 2] = tmp2; + block[ 3] = tmp3; + block[ 4] = tmp4; + break; + case 1: block[ 1] |= tmp0; + block[ 2] = tmp1; + block[ 3] = tmp2; + block[ 4] = tmp3; + block[ 5] = tmp4; + break; + case 2: block[ 2] |= tmp0; + block[ 3] = tmp1; + block[ 4] = tmp2; + block[ 5] = tmp3; + block[ 6] = tmp4; + break; + case 3: block[ 3] |= tmp0; + block[ 4] = tmp1; + block[ 5] = tmp2; + block[ 6] = tmp3; + block[ 7] = tmp4; + break; + case 4: block[ 4] |= tmp0; + block[ 5] = tmp1; + block[ 6] = tmp2; + block[ 7] = tmp3; + block[ 8] = tmp4; + break; + case 5: block[ 5] |= tmp0; + block[ 6] = tmp1; + block[ 7] = tmp2; + block[ 8] = tmp3; + block[ 9] = tmp4; + break; + case 6: block[ 6] |= tmp0; + block[ 7] = tmp1; + block[ 8] = tmp2; + block[ 9] = tmp3; + block[10] = tmp4; + break; + case 7: block[ 7] |= tmp0; + block[ 8] = tmp1; + block[ 9] = tmp2; + block[10] = tmp3; + block[11] = tmp4; + break; + case 8: block[ 8] |= tmp0; + block[ 9] = tmp1; + block[10] = tmp2; + block[11] = tmp3; + block[12] = tmp4; + break; + case 9: block[ 9] |= tmp0; + block[10] = tmp1; + block[11] = tmp2; + block[12] = tmp3; + block[13] = tmp4; + break; + case 10: block[10] |= tmp0; + block[11] = tmp1; + block[12] = tmp2; + block[13] = tmp3; + block[14] = tmp4; + break; + case 11: block[11] |= tmp0; + block[12] = tmp1; + block[13] = tmp2; + block[14] = tmp3; + block[15] = tmp4; + break; + case 12: block[12] |= tmp0; + block[13] = tmp1; + block[14] = tmp2; + block[15] = tmp3; + carry[ 0] = tmp4; + break; + case 13: block[13] |= tmp0; + block[14] = tmp1; + block[15] = tmp2; + carry[ 0] = tmp3; + carry[ 1] = tmp4; + break; + case 14: block[14] |= tmp0; + block[15] = tmp1; + carry[ 0] = tmp2; + carry[ 1] = tmp3; + carry[ 2] = tmp4; + break; + case 15: block[15] |= tmp0; + carry[ 0] = tmp1; + carry[ 1] = tmp2; + carry[ 2] = tmp3; + carry[ 3] = tmp4; + break; + } + + u32 new_len = block_len + append_len; + + if (new_len >= 64) + { + new_len -= 64; + + sha256_transform (block, digest); + + bzero16 (block); + + block[0] = carry[0]; + block[1] = carry[1]; + block[2] = carry[2]; + block[3] = carry[3]; + } + + return new_len; +} + +__device__ static u32 memcat20 (u32x block[20], const u32 block_len, const u32x append[4], const u32 append_len) +{ + const u32 div = block_len / 4; + + u32x tmp0; + u32x tmp1; + u32x tmp2; + u32x tmp3; + u32x tmp4; + + #if __CUDA_ARCH__ >= 200 + + const int offset_minus_4 = 4 - (block_len & 3); + + const int selector = (0x76543210 >> (offset_minus_4 * 4)) & 0xffff; + + tmp0 = __byte_perm ( 0, append[0], selector); + tmp1 = __byte_perm (append[0], append[1], selector); + tmp2 = __byte_perm (append[1], append[2], selector); + tmp3 = __byte_perm (append[2], append[3], selector); + tmp4 = __byte_perm (append[3], 0, selector); + + #else + + const u32 mod = block_len & 3; + + switch (mod) + { + case 0: tmp0 = append[0]; + tmp1 = append[1]; + tmp2 = append[2]; + tmp3 = append[3]; + tmp4 = 0; + break; + case 1: tmp0 = append[0] << 8; + tmp1 = append[0] >> 24 | append[1] << 8; + tmp2 = append[1] >> 24 | append[2] << 8; + tmp3 = append[2] >> 24 | append[3] << 8; + tmp4 = append[3] >> 24; + break; + case 2: tmp0 = append[0] << 16; + tmp1 = append[0] >> 16 | append[1] << 16; + tmp2 = append[1] >> 16 | append[2] << 16; + tmp3 = append[2] >> 16 | append[3] << 16; + tmp4 = append[3] >> 16; + break; + case 3: tmp0 = append[0] << 24; + tmp1 = append[0] >> 8 | append[1] << 24; + tmp2 = append[1] >> 8 | append[2] << 24; + tmp3 = append[2] >> 8 | append[3] << 24; + tmp4 = append[3] >> 8; + break; + } + + #endif + + switch (div) + { + case 0: block[ 0] |= tmp0; + block[ 1] = tmp1; + block[ 2] = tmp2; + block[ 3] = tmp3; + block[ 4] = tmp4; + break; + case 1: block[ 1] |= tmp0; + block[ 2] = tmp1; + block[ 3] = tmp2; + block[ 4] = tmp3; + block[ 5] = tmp4; + break; + case 2: block[ 2] |= tmp0; + block[ 3] = tmp1; + block[ 4] = tmp2; + block[ 5] = tmp3; + block[ 6] = tmp4; + break; + case 3: block[ 3] |= tmp0; + block[ 4] = tmp1; + block[ 5] = tmp2; + block[ 6] = tmp3; + block[ 7] = tmp4; + break; + case 4: block[ 4] |= tmp0; + block[ 5] = tmp1; + block[ 6] = tmp2; + block[ 7] = tmp3; + block[ 8] = tmp4; + break; + case 5: block[ 5] |= tmp0; + block[ 6] = tmp1; + block[ 7] = tmp2; + block[ 8] = tmp3; + block[ 9] = tmp4; + break; + case 6: block[ 6] |= tmp0; + block[ 7] = tmp1; + block[ 8] = tmp2; + block[ 9] = tmp3; + block[10] = tmp4; + break; + case 7: block[ 7] |= tmp0; + block[ 8] = tmp1; + block[ 9] = tmp2; + block[10] = tmp3; + block[11] = tmp4; + break; + case 8: block[ 8] |= tmp0; + block[ 9] = tmp1; + block[10] = tmp2; + block[11] = tmp3; + block[12] = tmp4; + break; + case 9: block[ 9] |= tmp0; + block[10] = tmp1; + block[11] = tmp2; + block[12] = tmp3; + block[13] = tmp4; + break; + case 10: block[10] |= tmp0; + block[11] = tmp1; + block[12] = tmp2; + block[13] = tmp3; + block[14] = tmp4; + break; + case 11: block[11] |= tmp0; + block[12] = tmp1; + block[13] = tmp2; + block[14] = tmp3; + block[15] = tmp4; + break; + case 12: block[12] |= tmp0; + block[13] = tmp1; + block[14] = tmp2; + block[15] = tmp3; + block[16] = tmp4; + break; + case 13: block[13] |= tmp0; + block[14] = tmp1; + block[15] = tmp2; + block[16] = tmp3; + block[17] = tmp4; + break; + case 14: block[14] |= tmp0; + block[15] = tmp1; + block[16] = tmp2; + block[17] = tmp3; + block[18] = tmp4; + break; + case 15: block[15] |= tmp0; + block[16] = tmp1; + block[17] = tmp2; + block[18] = tmp3; + block[19] = tmp4; + break; + } + + return block_len + append_len; +} + +__device__ static u32 memcat20_x80 (u32x block[20], const u32 block_len, const u32x append[4], const u32 append_len) +{ + const u32 div = block_len / 4; + + u32x tmp0; + u32x tmp1; + u32x tmp2; + u32x tmp3; + u32x tmp4; + + #if __CUDA_ARCH__ >= 200 + + const int offset_minus_4 = 4 - (block_len & 3); + + const int selector = (0x76543210 >> (offset_minus_4 * 4)) & 0xffff; + + tmp0 = __byte_perm ( 0, append[0], selector); + tmp1 = __byte_perm (append[0], append[1], selector); + tmp2 = __byte_perm (append[1], append[2], selector); + tmp3 = __byte_perm (append[2], append[3], selector); + tmp4 = __byte_perm (append[3], 0x80, selector); + + #else + + const u32 mod = block_len & 3; + + switch (mod) + { + case 0: tmp0 = append[0]; + tmp1 = append[1]; + tmp2 = append[2]; + tmp3 = append[3]; + tmp4 = 0; + break; + case 1: tmp0 = append[0] << 8; + tmp1 = append[0] >> 24 | append[1] << 8; + tmp2 = append[1] >> 24 | append[2] << 8; + tmp3 = append[2] >> 24 | append[3] << 8; + tmp4 = append[3] >> 24; + break; + case 2: tmp0 = append[0] << 16; + tmp1 = append[0] >> 16 | append[1] << 16; + tmp2 = append[1] >> 16 | append[2] << 16; + tmp3 = append[2] >> 16 | append[3] << 16; + tmp4 = append[3] >> 16; + break; + case 3: tmp0 = append[0] << 24; + tmp1 = append[0] >> 8 | append[1] << 24; + tmp2 = append[1] >> 8 | append[2] << 24; + tmp3 = append[2] >> 8 | append[3] << 24; + tmp4 = append[3] >> 8; + break; + } + + #endif + + switch (div) + { + case 0: block[ 0] |= tmp0; + block[ 1] = tmp1; + block[ 2] = tmp2; + block[ 3] = tmp3; + block[ 4] = tmp4; + break; + case 1: block[ 1] |= tmp0; + block[ 2] = tmp1; + block[ 3] = tmp2; + block[ 4] = tmp3; + block[ 5] = tmp4; + break; + case 2: block[ 2] |= tmp0; + block[ 3] = tmp1; + block[ 4] = tmp2; + block[ 5] = tmp3; + block[ 6] = tmp4; + break; + case 3: block[ 3] |= tmp0; + block[ 4] = tmp1; + block[ 5] = tmp2; + block[ 6] = tmp3; + block[ 7] = tmp4; + break; + case 4: block[ 4] |= tmp0; + block[ 5] = tmp1; + block[ 6] = tmp2; + block[ 7] = tmp3; + block[ 8] = tmp4; + break; + case 5: block[ 5] |= tmp0; + block[ 6] = tmp1; + block[ 7] = tmp2; + block[ 8] = tmp3; + block[ 9] = tmp4; + break; + case 6: block[ 6] |= tmp0; + block[ 7] = tmp1; + block[ 8] = tmp2; + block[ 9] = tmp3; + block[10] = tmp4; + break; + case 7: block[ 7] |= tmp0; + block[ 8] = tmp1; + block[ 9] = tmp2; + block[10] = tmp3; + block[11] = tmp4; + break; + case 8: block[ 8] |= tmp0; + block[ 9] = tmp1; + block[10] = tmp2; + block[11] = tmp3; + block[12] = tmp4; + break; + case 9: block[ 9] |= tmp0; + block[10] = tmp1; + block[11] = tmp2; + block[12] = tmp3; + block[13] = tmp4; + break; + case 10: block[10] |= tmp0; + block[11] = tmp1; + block[12] = tmp2; + block[13] = tmp3; + block[14] = tmp4; + break; + case 11: block[11] |= tmp0; + block[12] = tmp1; + block[13] = tmp2; + block[14] = tmp3; + block[15] = tmp4; + break; + case 12: block[12] |= tmp0; + block[13] = tmp1; + block[14] = tmp2; + block[15] = tmp3; + block[16] = tmp4; + break; + case 13: block[13] |= tmp0; + block[14] = tmp1; + block[15] = tmp2; + block[16] = tmp3; + block[17] = tmp4; + break; + case 14: block[14] |= tmp0; + block[15] = tmp1; + block[16] = tmp2; + block[17] = tmp3; + block[18] = tmp4; + break; + case 15: block[15] |= tmp0; + block[16] = tmp1; + block[17] = tmp2; + block[18] = tmp3; + block[19] = tmp4; + break; + } + + return block_len + append_len; +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m07400_init (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, sha256crypt_tmp_t *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[0]; + w0[1] = pws[gid].i[1]; + w0[2] = pws[gid].i[2]; + w0[3] = pws[gid].i[3]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * salt + */ + + u32 salt_buf[4]; + + salt_buf[0] = salt_bufs[salt_pos].salt_buf[0]; + salt_buf[1] = salt_bufs[salt_pos].salt_buf[1]; + salt_buf[2] = salt_bufs[salt_pos].salt_buf[2]; + salt_buf[3] = salt_bufs[salt_pos].salt_buf[3]; + + u32 salt_len = salt_bufs[salt_pos].salt_len; + + /** + * buffers + */ + + u32 block_len; // never reaches > 64 + u32 transform_len; // required for w[15] = len * 8 + + u32x block[16]; + + u32x alt_result[8]; + u32x p_bytes[8]; + u32x s_bytes[8]; + + /* Prepare for the real work. */ + + block_len = 0; + + bzero16 (block); + + /* Add key. */ + + block_len = memcat16 (block, block_len, w0, pw_len); + + /* Add salt. */ + + block_len = memcat16 (block, block_len, salt_buf, salt_len); + + /* Add key again. */ + + block_len = memcat16 (block, block_len, w0, pw_len); + + append_0x80_4 (block, block_len); + + block[15] = swap_workaround (block_len * 8); + + init_ctx (alt_result); + + sha256_transform (block, alt_result); + + bswap8 (alt_result); + + block_len = 0; + + bzero16 (block); + + u32x alt_result_tmp[8]; + + alt_result_tmp[0] = alt_result[0]; + alt_result_tmp[1] = alt_result[1]; + alt_result_tmp[2] = alt_result[2]; + alt_result_tmp[3] = alt_result[3]; + alt_result_tmp[4] = 0; + alt_result_tmp[5] = 0; + alt_result_tmp[6] = 0; + alt_result_tmp[7] = 0; + + truncate_block (alt_result_tmp, pw_len); + + /* Add the key string. */ + + block_len = memcat16 (block, block_len, w0, pw_len); + + /* The last part is the salt string. This must be at most 8 + characters and it ends at the first `$' character (for + compatibility with existing implementations). */ + + block_len = memcat16 (block, block_len, salt_buf, salt_len); + + /* Now get result of this (32 bytes) and add it to the other + context. */ + + block_len = memcat16 (block, block_len, alt_result_tmp, pw_len); + + transform_len = block_len; + + /* Take the binary representation of the length of the key and for every + 1 add the alternate sum, for every 0 the key. */ + + alt_result_tmp[0] = alt_result[0]; + alt_result_tmp[1] = alt_result[1]; + alt_result_tmp[2] = alt_result[2]; + alt_result_tmp[3] = alt_result[3]; + alt_result_tmp[4] = alt_result[4]; + alt_result_tmp[5] = alt_result[5]; + alt_result_tmp[6] = alt_result[6]; + alt_result_tmp[7] = alt_result[7]; + + init_ctx (alt_result); + + for (u32 j = pw_len; j; j >>= 1) + { + if (j & 1) + { + block_len = memcat16c (block, block_len, &alt_result_tmp[0], 16, alt_result); + block_len = memcat16c (block, block_len, &alt_result_tmp[4], 16, alt_result); + + transform_len += 32; + } + else + { + block_len = memcat16c (block, block_len, w0, pw_len, alt_result); + + transform_len += pw_len; + } + } + + append_0x80_4 (block, block_len); + + if (block_len >= 56) + { + sha256_transform (block, alt_result); + + bzero16 (block); + } + + block[15] = swap_workaround (transform_len * 8); + + sha256_transform (block, alt_result); + + bswap8 (alt_result); + + tmps[gid].alt_result[0] = alt_result[0]; + tmps[gid].alt_result[1] = alt_result[1]; + tmps[gid].alt_result[2] = alt_result[2]; + tmps[gid].alt_result[3] = alt_result[3]; + tmps[gid].alt_result[4] = alt_result[4]; + tmps[gid].alt_result[5] = alt_result[5]; + tmps[gid].alt_result[6] = alt_result[6]; + tmps[gid].alt_result[7] = alt_result[7]; + + /* Start computation of P byte sequence. */ + + block_len = 0; + + transform_len = 0; + + bzero16 (block); + + /* For every character in the password add the entire password. */ + + init_ctx (p_bytes); + + for (u32 j = 0; j < pw_len; j++) + { + block_len = memcat16c (block, block_len, w0, pw_len, p_bytes); + + transform_len += pw_len; + } + + /* Finish the digest. */ + + append_0x80_4 (block, block_len); + + if (block_len >= 56) + { + sha256_transform (block, p_bytes); + + bzero16 (block); + } + + block[15] = swap_workaround (transform_len * 8); + + sha256_transform (block, p_bytes); + + bswap8 (p_bytes); + + truncate_block (p_bytes, pw_len); + + tmps[gid].p_bytes[0] = p_bytes[0]; + tmps[gid].p_bytes[1] = p_bytes[1]; + tmps[gid].p_bytes[2] = p_bytes[2]; + tmps[gid].p_bytes[3] = p_bytes[3]; + + /* Start computation of S byte sequence. */ + + block_len = 0; + + transform_len = 0; + + bzero16 (block); + + /* For every character in the password add the entire password. */ + + init_ctx (s_bytes); + + for (u32 j = 0; j < 16 + (alt_result[0] & 0xff); j++) + { + block_len = memcat16c (block, block_len, salt_buf, salt_len, s_bytes); + + transform_len += salt_len; + } + + /* Finish the digest. */ + + append_0x80_4 (block, block_len); + + if (block_len >= 56) + { + sha256_transform (block, s_bytes); + + bzero16 (block); + } + + block[15] = swap_workaround (transform_len * 8); + + sha256_transform (block, s_bytes); + + bswap8 (s_bytes); + + truncate_block (s_bytes, salt_len); + + tmps[gid].s_bytes[0] = s_bytes[0]; + tmps[gid].s_bytes[1] = s_bytes[1]; + tmps[gid].s_bytes[2] = s_bytes[2]; + tmps[gid].s_bytes[3] = s_bytes[3]; +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m07400_loop (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, sha256crypt_tmp_t *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + const u32 pw_len = pws[gid].pw_len; + + /** + * base + */ + + u32x p_bytes[4]; + + p_bytes[0] = tmps[gid].p_bytes[0]; + p_bytes[1] = tmps[gid].p_bytes[1]; + p_bytes[2] = tmps[gid].p_bytes[2]; + p_bytes[3] = tmps[gid].p_bytes[3]; + + u32x p_bytes_x80[4]; + + p_bytes_x80[0] = tmps[gid].p_bytes[0]; + p_bytes_x80[1] = tmps[gid].p_bytes[1]; + p_bytes_x80[2] = tmps[gid].p_bytes[2]; + p_bytes_x80[3] = tmps[gid].p_bytes[3]; + + append_0x80_1 (p_bytes_x80, pw_len); + + u32x s_bytes[4]; + + s_bytes[0] = tmps[gid].s_bytes[0]; + s_bytes[1] = tmps[gid].s_bytes[1]; + s_bytes[2] = tmps[gid].s_bytes[2]; + s_bytes[3] = tmps[gid].s_bytes[3]; + + u32x alt_result[8]; + + alt_result[0] = tmps[gid].alt_result[0]; + alt_result[1] = tmps[gid].alt_result[1]; + alt_result[2] = tmps[gid].alt_result[2]; + alt_result[3] = tmps[gid].alt_result[3]; + alt_result[4] = tmps[gid].alt_result[4]; + alt_result[5] = tmps[gid].alt_result[5]; + alt_result[6] = tmps[gid].alt_result[6]; + alt_result[7] = tmps[gid].alt_result[7]; + + u32 salt_len = salt_bufs[salt_pos].salt_len; + + /* Repeatedly run the collected hash value through SHA256 to burn + CPU cycles. */ + + for (u32 i = 0, j = loop_pos; i < loop_cnt; i++, j++) + { + u32x tmp[8]; + + init_ctx (tmp); + + u32x block[32]; + + bzero16 (&block[ 0]); + bzero16 (&block[16]); + + u32 block_len = 0; + + const u32 j1 = (j & 1) ? 1 : 0; + const u32 j3 = (j % 3) ? 1 : 0; + const u32 j7 = (j % 7) ? 1 : 0; + + if (j1) + { + block[0] = p_bytes[0]; + block[1] = p_bytes[1]; + block[2] = p_bytes[2]; + block[3] = p_bytes[3]; + + block_len = pw_len; + } + else + { + block[0] = alt_result[0]; + block[1] = alt_result[1]; + block[2] = alt_result[2]; + block[3] = alt_result[3]; + block[4] = alt_result[4]; + block[5] = alt_result[5]; + block[6] = alt_result[6]; + block[7] = alt_result[7]; + + block_len = 32; + } + + if (j3) + { + block_len = memcat20 (block, block_len, s_bytes, salt_len); + } + + if (j7) + { + block_len = memcat20 (block, block_len, p_bytes, pw_len); + } + + if (j1) + { + block_len = memcat20 (block, block_len, &alt_result[0], 16); + block_len = memcat20_x80 (block, block_len, &alt_result[4], 16); + } + else + { + block_len = memcat20 (block, block_len, p_bytes_x80, pw_len); + } + + if (block_len >= 56) + { + sha256_transform (block, tmp); + + block[ 0] = block[16]; + block[ 1] = block[17]; + block[ 2] = block[18]; + block[ 3] = block[19]; + block[ 4] = 0; + block[ 5] = 0; + block[ 6] = 0; + block[ 7] = 0; + block[ 8] = 0; + block[ 9] = 0; + block[10] = 0; + block[11] = 0; + block[12] = 0; + block[13] = 0; + block[14] = 0; + block[15] = 0; + } + + block[15] = swap_workaround (block_len * 8); + + sha256_transform_no14 (block, tmp); + + bswap8 (tmp); + + alt_result[0] = tmp[0]; + alt_result[1] = tmp[1]; + alt_result[2] = tmp[2]; + alt_result[3] = tmp[3]; + alt_result[4] = tmp[4]; + alt_result[5] = tmp[5]; + alt_result[6] = tmp[6]; + alt_result[7] = tmp[7]; + } + + tmps[gid].alt_result[0] = alt_result[0]; + tmps[gid].alt_result[1] = alt_result[1]; + tmps[gid].alt_result[2] = alt_result[2]; + tmps[gid].alt_result[3] = alt_result[3]; + tmps[gid].alt_result[4] = alt_result[4]; + tmps[gid].alt_result[5] = alt_result[5]; + tmps[gid].alt_result[6] = alt_result[6]; + tmps[gid].alt_result[7] = alt_result[7]; +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m07400_comp (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, sha256crypt_tmp_t *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + const u32 lid = threadIdx.x; + + const u32x r0 = tmps[gid].alt_result[0]; + const u32x r1 = tmps[gid].alt_result[1]; + const u32x r2 = tmps[gid].alt_result[2]; + const u32x r3 = tmps[gid].alt_result[3]; + + #define il_pos 0 + + #include VECT_COMPARE_M +} diff --git a/nv/m07500_a0.cu b/nv/m07500_a0.cu new file mode 100644 index 0000000000..7e2269e3af --- /dev/null +++ b/nv/m07500_a0.cu @@ -0,0 +1,813 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _KRB5PA_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW2 +#define VECT_SIZE1 +#endif + +#define DGST_R0 3 +#define DGST_R1 7 +#define DGST_R2 2 +#define DGST_R3 6 + +#include "include/kernel_functions.c" +#include "types_nv.c" +#include "common_nv.c" +#include "include/rp_gpu.h" +#include "rp_nv.c" + +__device__ __constant__ gpu_rule_t c_rules[1024]; + +typedef struct +{ + u8 S[256]; + + u8 i; + u8 j; + +} RC4_KEY; + +__device__ static void swap (RC4_KEY *rc4_key, const u8 i, const u8 j) +{ + u8 tmp; + + tmp = rc4_key->S[i]; + rc4_key->S[i] = rc4_key->S[j]; + rc4_key->S[j] = tmp; +} + +__device__ static void rc4_init_16 (RC4_KEY *rc4_key, const u32 data[4]) +{ + u32 i; + + for (i = 0; i < 256; i += 1) rc4_key->S[i] = i; + + u8 j = 0; + + for (i = 0; i < 256; i += 16) + { + u32 idx = i; + + u32 v; + + v = data[0]; + + j += rc4_key->S[idx] + (v >> 0); swap (rc4_key, idx, j); idx++; + j += rc4_key->S[idx] + (v >> 8); swap (rc4_key, idx, j); idx++; + j += rc4_key->S[idx] + (v >> 16); swap (rc4_key, idx, j); idx++; + j += rc4_key->S[idx] + (v >> 24); swap (rc4_key, idx, j); idx++; + + v = data[1]; + + j += rc4_key->S[idx] + (v >> 0); swap (rc4_key, idx, j); idx++; + j += rc4_key->S[idx] + (v >> 8); swap (rc4_key, idx, j); idx++; + j += rc4_key->S[idx] + (v >> 16); swap (rc4_key, idx, j); idx++; + j += rc4_key->S[idx] + (v >> 24); swap (rc4_key, idx, j); idx++; + + v = data[2]; + + j += rc4_key->S[idx] + (v >> 0); swap (rc4_key, idx, j); idx++; + j += rc4_key->S[idx] + (v >> 8); swap (rc4_key, idx, j); idx++; + j += rc4_key->S[idx] + (v >> 16); swap (rc4_key, idx, j); idx++; + j += rc4_key->S[idx] + (v >> 24); swap (rc4_key, idx, j); idx++; + + v = data[3]; + + j += rc4_key->S[idx] + (v >> 0); swap (rc4_key, idx, j); idx++; + j += rc4_key->S[idx] + (v >> 8); swap (rc4_key, idx, j); idx++; + j += rc4_key->S[idx] + (v >> 16); swap (rc4_key, idx, j); idx++; + j += rc4_key->S[idx] + (v >> 24); swap (rc4_key, idx, j); idx++; + } + + rc4_key->i = 0; + rc4_key->j = 0; +} + +__device__ static u32 rc4_next_4 (RC4_KEY *rc4_key, const u32 ct) +{ + u8 idx; + + u32 xor4 = 0; + + u8 i = rc4_key->i; + u8 j = rc4_key->j; + + i += 1; + j += rc4_key->S[i]; + + swap (rc4_key, i, j); + + idx = rc4_key->S[i] + rc4_key->S[j]; + + xor4 |= rc4_key->S[idx] << 0; + + i += 1; + j += rc4_key->S[i]; + + swap (rc4_key, i, j); + + idx = rc4_key->S[i] + rc4_key->S[j]; + + xor4 |= rc4_key->S[idx] << 8; + + i += 1; + j += rc4_key->S[i]; + + swap (rc4_key, i, j); + + idx = rc4_key->S[i] + rc4_key->S[j]; + + xor4 |= rc4_key->S[idx] << 16; + + i += 1; + j += rc4_key->S[i]; + + swap (rc4_key, i, j); + + idx = rc4_key->S[i] + rc4_key->S[j]; + + xor4 |= rc4_key->S[idx] << 24; + + rc4_key->i = i; + rc4_key->j = j; + + return ct ^ xor4; +} + +__device__ static int decrypt_and_check (RC4_KEY *rc4_key, u32 data[4], u32 timestamp_ct[8]) +{ + u32 pt; + + rc4_init_16 (rc4_key, data); + + pt = rc4_next_4 (rc4_key, timestamp_ct[0]); + pt = rc4_next_4 (rc4_key, timestamp_ct[1]); + pt = rc4_next_4 (rc4_key, timestamp_ct[2]); + pt = rc4_next_4 (rc4_key, timestamp_ct[3]); + + if ((pt & 0xffff0000) != 0x30320000) return 0; + + pt = rc4_next_4 (rc4_key, timestamp_ct[4]); + + if (((pt & 0xff) < '0') || ((pt & 0xff) > '9')) return 0; pt >>= 8; + if (((pt & 0xff) < '0') || ((pt & 0xff) > '9')) return 0; pt >>= 8; + if (((pt & 0xff) < '0') || ((pt & 0xff) > '9')) return 0; pt >>= 8; + if (((pt & 0xff) < '0') || ((pt & 0xff) > '9')) return 0; + + pt = rc4_next_4 (rc4_key, timestamp_ct[5]); + + if (((pt & 0xff) < '0') || ((pt & 0xff) > '9')) return 0; pt >>= 8; + if (((pt & 0xff) < '0') || ((pt & 0xff) > '9')) return 0; pt >>= 8; + if (((pt & 0xff) < '0') || ((pt & 0xff) > '9')) return 0; pt >>= 8; + if (((pt & 0xff) < '0') || ((pt & 0xff) > '9')) return 0; + + pt = rc4_next_4 (rc4_key, timestamp_ct[6]); + + if (((pt & 0xff) < '0') || ((pt & 0xff) > '9')) return 0; pt >>= 8; + if (((pt & 0xff) < '0') || ((pt & 0xff) > '9')) return 0; pt >>= 8; + if (((pt & 0xff) < '0') || ((pt & 0xff) > '9')) return 0; pt >>= 8; + if (((pt & 0xff) < '0') || ((pt & 0xff) > '9')) return 0; + + return 1; +} + +__device__ static void md4_transform (const u32x w0[4], const u32x w1[4], const u32x w2[4], const u32x w3[4], u32x digest[4]) +{ + u32x a = digest[0]; + u32x b = digest[1]; + u32x c = digest[2]; + u32x d = digest[3]; + + MD4_STEP (MD4_Fo, a, b, c, d, w0[0], MD4C00, MD4S00); + MD4_STEP (MD4_Fo, d, a, b, c, w0[1], MD4C00, MD4S01); + MD4_STEP (MD4_Fo, c, d, a, b, w0[2], MD4C00, MD4S02); + MD4_STEP (MD4_Fo, b, c, d, a, w0[3], MD4C00, MD4S03); + MD4_STEP (MD4_Fo, a, b, c, d, w1[0], MD4C00, MD4S00); + MD4_STEP (MD4_Fo, d, a, b, c, w1[1], MD4C00, MD4S01); + MD4_STEP (MD4_Fo, c, d, a, b, w1[2], MD4C00, MD4S02); + MD4_STEP (MD4_Fo, b, c, d, a, w1[3], MD4C00, MD4S03); + MD4_STEP (MD4_Fo, a, b, c, d, w2[0], MD4C00, MD4S00); + MD4_STEP (MD4_Fo, d, a, b, c, w2[1], MD4C00, MD4S01); + MD4_STEP (MD4_Fo, c, d, a, b, w2[2], MD4C00, MD4S02); + MD4_STEP (MD4_Fo, b, c, d, a, w2[3], MD4C00, MD4S03); + MD4_STEP (MD4_Fo, a, b, c, d, w3[0], MD4C00, MD4S00); + MD4_STEP (MD4_Fo, d, a, b, c, w3[1], MD4C00, MD4S01); + MD4_STEP (MD4_Fo, c, d, a, b, w3[2], MD4C00, MD4S02); + MD4_STEP (MD4_Fo, b, c, d, a, w3[3], MD4C00, MD4S03); + + MD4_STEP (MD4_Go, a, b, c, d, w0[0], MD4C01, MD4S10); + MD4_STEP (MD4_Go, d, a, b, c, w1[0], MD4C01, MD4S11); + MD4_STEP (MD4_Go, c, d, a, b, w2[0], MD4C01, MD4S12); + MD4_STEP (MD4_Go, b, c, d, a, w3[0], MD4C01, MD4S13); + MD4_STEP (MD4_Go, a, b, c, d, w0[1], MD4C01, MD4S10); + MD4_STEP (MD4_Go, d, a, b, c, w1[1], MD4C01, MD4S11); + MD4_STEP (MD4_Go, c, d, a, b, w2[1], MD4C01, MD4S12); + MD4_STEP (MD4_Go, b, c, d, a, w3[1], MD4C01, MD4S13); + MD4_STEP (MD4_Go, a, b, c, d, w0[2], MD4C01, MD4S10); + MD4_STEP (MD4_Go, d, a, b, c, w1[2], MD4C01, MD4S11); + MD4_STEP (MD4_Go, c, d, a, b, w2[2], MD4C01, MD4S12); + MD4_STEP (MD4_Go, b, c, d, a, w3[2], MD4C01, MD4S13); + MD4_STEP (MD4_Go, a, b, c, d, w0[3], MD4C01, MD4S10); + MD4_STEP (MD4_Go, d, a, b, c, w1[3], MD4C01, MD4S11); + MD4_STEP (MD4_Go, c, d, a, b, w2[3], MD4C01, MD4S12); + MD4_STEP (MD4_Go, b, c, d, a, w3[3], MD4C01, MD4S13); + + MD4_STEP (MD4_H , a, b, c, d, w0[0], MD4C02, MD4S20); + MD4_STEP (MD4_H , d, a, b, c, w2[0], MD4C02, MD4S21); + MD4_STEP (MD4_H , c, d, a, b, w1[0], MD4C02, MD4S22); + MD4_STEP (MD4_H , b, c, d, a, w3[0], MD4C02, MD4S23); + MD4_STEP (MD4_H , a, b, c, d, w0[2], MD4C02, MD4S20); + MD4_STEP (MD4_H , d, a, b, c, w2[2], MD4C02, MD4S21); + MD4_STEP (MD4_H , c, d, a, b, w1[2], MD4C02, MD4S22); + MD4_STEP (MD4_H , b, c, d, a, w3[2], MD4C02, MD4S23); + MD4_STEP (MD4_H , a, b, c, d, w0[1], MD4C02, MD4S20); + MD4_STEP (MD4_H , d, a, b, c, w2[1], MD4C02, MD4S21); + MD4_STEP (MD4_H , c, d, a, b, w1[1], MD4C02, MD4S22); + MD4_STEP (MD4_H , b, c, d, a, w3[1], MD4C02, MD4S23); + MD4_STEP (MD4_H , a, b, c, d, w0[3], MD4C02, MD4S20); + MD4_STEP (MD4_H , d, a, b, c, w2[3], MD4C02, MD4S21); + MD4_STEP (MD4_H , c, d, a, b, w1[3], MD4C02, MD4S22); + MD4_STEP (MD4_H , b, c, d, a, w3[3], MD4C02, MD4S23); + + digest[0] += a; + digest[1] += b; + digest[2] += c; + digest[3] += d; +} + +__device__ static void md5_transform (const u32x w0[4], const u32x w1[4], const u32x w2[4], const u32x w3[4], u32x digest[4]) +{ + u32x a = digest[0]; + u32x b = digest[1]; + u32x c = digest[2]; + u32x d = digest[3]; + + u32x w0_t = w0[0]; + u32x w1_t = w0[1]; + u32x w2_t = w0[2]; + u32x w3_t = w0[3]; + u32x w4_t = w1[0]; + u32x w5_t = w1[1]; + u32x w6_t = w1[2]; + u32x w7_t = w1[3]; + u32x w8_t = w2[0]; + u32x w9_t = w2[1]; + u32x wa_t = w2[2]; + u32x wb_t = w2[3]; + u32x wc_t = w3[0]; + u32x wd_t = w3[1]; + u32x we_t = w3[2]; + u32x wf_t = w3[3]; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t, MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t, MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t, MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t, MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w4_t, MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w5_t, MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w6_t, MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w7_t, MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w8_t, MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w9_t, MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, wa_t, MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, wb_t, MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, wc_t, MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, wd_t, MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, we_t, MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, wf_t, MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w1_t, MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w6_t, MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, wb_t, MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t, MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w5_t, MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, wa_t, MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, wf_t, MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w4_t, MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w9_t, MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, we_t, MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t, MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w8_t, MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, wd_t, MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t, MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w7_t, MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, wc_t, MD5C1f, MD5S13); + + MD5_STEP (MD5_H , a, b, c, d, w5_t, MD5C20, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w8_t, MD5C21, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, wb_t, MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, we_t, MD5C23, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w1_t, MD5C24, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w4_t, MD5C25, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w7_t, MD5C26, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, wa_t, MD5C27, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, wd_t, MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w0_t, MD5C29, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w3_t, MD5C2a, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w6_t, MD5C2b, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w9_t, MD5C2c, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, wc_t, MD5C2d, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, wf_t, MD5C2e, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w2_t, MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t, MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w7_t, MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, we_t, MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w5_t, MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, wc_t, MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t, MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, wa_t, MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t, MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w8_t, MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, wf_t, MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w6_t, MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, wd_t, MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w4_t, MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, wb_t, MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t, MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w9_t, MD5C3f, MD5S33); + + digest[0] += a; + digest[1] += b; + digest[2] += c; + digest[3] += d; +} + +__device__ static void hmac_md5_pad (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], u32x ipad[4], u32x opad[4]) +{ + w0[0] = w0[0] ^ 0x36363636; + w0[1] = w0[1] ^ 0x36363636; + w0[2] = w0[2] ^ 0x36363636; + w0[3] = w0[3] ^ 0x36363636; + w1[0] = w1[0] ^ 0x36363636; + w1[1] = w1[1] ^ 0x36363636; + w1[2] = w1[2] ^ 0x36363636; + w1[3] = w1[3] ^ 0x36363636; + w2[0] = w2[0] ^ 0x36363636; + w2[1] = w2[1] ^ 0x36363636; + w2[2] = w2[2] ^ 0x36363636; + w2[3] = w2[3] ^ 0x36363636; + w3[0] = w3[0] ^ 0x36363636; + w3[1] = w3[1] ^ 0x36363636; + w3[2] = w3[2] ^ 0x36363636; + w3[3] = w3[3] ^ 0x36363636; + + ipad[0] = MD5M_A; + ipad[1] = MD5M_B; + ipad[2] = MD5M_C; + ipad[3] = MD5M_D; + + md5_transform (w0, w1, w2, w3, ipad); + + w0[0] = w0[0] ^ 0x6a6a6a6a; + w0[1] = w0[1] ^ 0x6a6a6a6a; + w0[2] = w0[2] ^ 0x6a6a6a6a; + w0[3] = w0[3] ^ 0x6a6a6a6a; + w1[0] = w1[0] ^ 0x6a6a6a6a; + w1[1] = w1[1] ^ 0x6a6a6a6a; + w1[2] = w1[2] ^ 0x6a6a6a6a; + w1[3] = w1[3] ^ 0x6a6a6a6a; + w2[0] = w2[0] ^ 0x6a6a6a6a; + w2[1] = w2[1] ^ 0x6a6a6a6a; + w2[2] = w2[2] ^ 0x6a6a6a6a; + w2[3] = w2[3] ^ 0x6a6a6a6a; + w3[0] = w3[0] ^ 0x6a6a6a6a; + w3[1] = w3[1] ^ 0x6a6a6a6a; + w3[2] = w3[2] ^ 0x6a6a6a6a; + w3[3] = w3[3] ^ 0x6a6a6a6a; + + opad[0] = MD5M_A; + opad[1] = MD5M_B; + opad[2] = MD5M_C; + opad[3] = MD5M_D; + + md5_transform (w0, w1, w2, w3, opad); +} + +__device__ static void hmac_md5_run (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], u32x ipad[4], u32x opad[4], u32x digest[4]) +{ + digest[0] = ipad[0]; + digest[1] = ipad[1]; + digest[2] = ipad[2]; + digest[3] = ipad[3]; + + md5_transform (w0, w1, w2, w3, digest); + + w0[0] = digest[0]; + w0[1] = digest[1]; + w0[2] = digest[2]; + w0[3] = digest[3]; + w1[0] = 0x80; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + w3[0] = 0; + w3[1] = 0; + w3[2] = (64 + 16) * 8; + w3[3] = 0; + + digest[0] = opad[0]; + digest[1] = opad[1]; + digest[2] = opad[2]; + digest[3] = opad[3]; + + md5_transform (w0, w1, w2, w3, digest); +} + +__device__ static void kerb_prepare (const u32x w0[4], const u32x w1[4], const u32 pw_len, const u32 checksum[4], u32x digest[4]) +{ + /** + * pads + */ + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + w0_t[0] = w0[0]; + w0_t[1] = w0[1]; + w0_t[2] = w0[2]; + w0_t[3] = w0[3]; + w1_t[0] = w1[0]; + w1_t[1] = w1[1]; + w1_t[2] = w1[2]; + w1_t[3] = w1[3]; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = 0; + + // K=MD4(Little_indian(UNICODE(pwd)) + + append_0x80_2 (w0_t, w1_t, pw_len); + + make_unicode (w1_t, w2_t, w3_t); + make_unicode (w0_t, w0_t, w1_t); + + w3_t[2] = pw_len * 8 * 2; + w3_t[3] = 0; + + digest[0] = MD4M_A; + digest[1] = MD4M_B; + digest[2] = MD4M_C; + digest[3] = MD4M_D; + + md4_transform (w0_t, w1_t, w2_t, w3_t, digest); + + // K1=MD5_HMAC(K,1); with 1 encoded as little indian on 4 bytes (01000000 in hexa); + + w0_t[0] = digest[0]; + w0_t[1] = digest[1]; + w0_t[2] = digest[2]; + w0_t[3] = digest[3]; + w1_t[0] = 0; + w1_t[1] = 0; + w1_t[2] = 0; + w1_t[3] = 0; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = 0; + + u32x ipad[4]; + u32x opad[4]; + + hmac_md5_pad (w0_t, w1_t, w2_t, w3_t, ipad, opad); + + w0_t[0] = 1; + w0_t[1] = 0x80; + w0_t[2] = 0; + w0_t[3] = 0; + w1_t[0] = 0; + w1_t[1] = 0; + w1_t[2] = 0; + w1_t[3] = 0; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = (64 + 4) * 8; + w3_t[3] = 0; + + hmac_md5_run (w0_t, w1_t, w2_t, w3_t, ipad, opad, digest); + + // K3=MD5_HMAC(K1,checksum); + + w0_t[0] = digest[0]; + w0_t[1] = digest[1]; + w0_t[2] = digest[2]; + w0_t[3] = digest[3]; + w1_t[0] = 0; + w1_t[1] = 0; + w1_t[2] = 0; + w1_t[3] = 0; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = 0; + + hmac_md5_pad (w0_t, w1_t, w2_t, w3_t, ipad, opad); + + w0_t[0] = checksum[0]; + w0_t[1] = checksum[1]; + w0_t[2] = checksum[2]; + w0_t[3] = checksum[3]; + w1_t[0] = 0x80; + w1_t[1] = 0; + w1_t[2] = 0; + w1_t[3] = 0; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = (64 + 16) * 8; + w3_t[3] = 0; + + hmac_md5_run (w0_t, w1_t, w2_t, w3_t, ipad, opad, digest); +} + +extern "C" __global__ void __launch_bounds__ (64, 1) m07500_m04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const krb5pa_t *krb5pa_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + __shared__ RC4_KEY rc4_keys[64]; + + const u32 lid = threadIdx.x; + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + /** + * base + */ + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + u32x pw_buf1[4]; + + pw_buf1[0] = pws[gid].i[ 4]; + pw_buf1[1] = pws[gid].i[ 5]; + pw_buf1[2] = pws[gid].i[ 6]; + pw_buf1[3] = pws[gid].i[ 7]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * salt + */ + + u32 checksum[4]; + + checksum[0] = krb5pa_bufs[salt_pos].checksum[0]; + checksum[1] = krb5pa_bufs[salt_pos].checksum[1]; + checksum[2] = krb5pa_bufs[salt_pos].checksum[2]; + checksum[3] = krb5pa_bufs[salt_pos].checksum[3]; + + u32 timestamp_ct[8]; + + timestamp_ct[0] = krb5pa_bufs[salt_pos].timestamp[0]; + timestamp_ct[1] = krb5pa_bufs[salt_pos].timestamp[1]; + timestamp_ct[2] = krb5pa_bufs[salt_pos].timestamp[2]; + timestamp_ct[3] = krb5pa_bufs[salt_pos].timestamp[3]; + timestamp_ct[4] = krb5pa_bufs[salt_pos].timestamp[4]; + timestamp_ct[5] = krb5pa_bufs[salt_pos].timestamp[5]; + timestamp_ct[6] = krb5pa_bufs[salt_pos].timestamp[6]; + timestamp_ct[7] = krb5pa_bufs[salt_pos].timestamp[7]; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + + w0[0] = pw_buf0[0]; + w0[1] = pw_buf0[1]; + w0[2] = pw_buf0[2]; + w0[3] = pw_buf0[3]; + + u32x w1[4]; + + w1[0] = pw_buf1[0]; + w1[1] = pw_buf1[1]; + w1[2] = pw_buf1[2]; + w1[3] = pw_buf1[3]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 out_len = apply_rules (c_rules[il_pos].cmds, w0, w1, pw_len); + + /** + * kerberos + */ + + u32x digest[4]; + + kerb_prepare (w0, w1, out_len, checksum, digest); + + u32 tmp[4]; + + #ifdef VECT_SIZE1 + + tmp[0] = digest[0]; + tmp[1] = digest[1]; + tmp[2] = digest[2]; + tmp[3] = digest[3]; + + if (decrypt_and_check (&rc4_keys[lid], tmp, timestamp_ct) == 1) + { + mark_hash_s0 (plains_buf, hashes_shown, digests_offset, gid, il_pos); + + d_return_buf[lid] = 1; + } + + #endif + } +} + +extern "C" __global__ void __launch_bounds__ (64, 1) m07500_m08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const krb5pa_t *krb5pa_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (64, 1) m07500_m16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const krb5pa_t *krb5pa_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (64, 1) m07500_s04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const krb5pa_t *krb5pa_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + __shared__ RC4_KEY rc4_keys[64]; + + const u32 lid = threadIdx.x; + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + /** + * base + */ + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + u32x pw_buf1[4]; + + pw_buf1[0] = pws[gid].i[ 4]; + pw_buf1[1] = pws[gid].i[ 5]; + pw_buf1[2] = pws[gid].i[ 6]; + pw_buf1[3] = pws[gid].i[ 7]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * salt + */ + + u32 checksum[4]; + + checksum[0] = krb5pa_bufs[salt_pos].checksum[0]; + checksum[1] = krb5pa_bufs[salt_pos].checksum[1]; + checksum[2] = krb5pa_bufs[salt_pos].checksum[2]; + checksum[3] = krb5pa_bufs[salt_pos].checksum[3]; + + u32 timestamp_ct[8]; + + timestamp_ct[0] = krb5pa_bufs[salt_pos].timestamp[0]; + timestamp_ct[1] = krb5pa_bufs[salt_pos].timestamp[1]; + timestamp_ct[2] = krb5pa_bufs[salt_pos].timestamp[2]; + timestamp_ct[3] = krb5pa_bufs[salt_pos].timestamp[3]; + timestamp_ct[4] = krb5pa_bufs[salt_pos].timestamp[4]; + timestamp_ct[5] = krb5pa_bufs[salt_pos].timestamp[5]; + timestamp_ct[6] = krb5pa_bufs[salt_pos].timestamp[6]; + timestamp_ct[7] = krb5pa_bufs[salt_pos].timestamp[7]; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + + w0[0] = pw_buf0[0]; + w0[1] = pw_buf0[1]; + w0[2] = pw_buf0[2]; + w0[3] = pw_buf0[3]; + + u32x w1[4]; + + w1[0] = pw_buf1[0]; + w1[1] = pw_buf1[1]; + w1[2] = pw_buf1[2]; + w1[3] = pw_buf1[3]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 out_len = apply_rules (c_rules[il_pos].cmds, w0, w1, pw_len); + + /** + * kerberos + */ + + u32x digest[4]; + + kerb_prepare (w0, w1, out_len, checksum, digest); + + u32 tmp[4]; + + #ifdef VECT_SIZE1 + + tmp[0] = digest[0]; + tmp[1] = digest[1]; + tmp[2] = digest[2]; + tmp[3] = digest[3]; + + if (decrypt_and_check (&rc4_keys[lid], tmp, timestamp_ct) == 1) + { + mark_hash_s0 (plains_buf, hashes_shown, digests_offset, gid, il_pos); + + d_return_buf[lid] = 1; + } + + #endif + } +} + +extern "C" __global__ void __launch_bounds__ (64, 1) m07500_s08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const krb5pa_t *krb5pa_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (64, 1) m07500_s16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const krb5pa_t *krb5pa_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/nv/m07500_a1.cu b/nv/m07500_a1.cu new file mode 100644 index 0000000000..bcfb40c784 --- /dev/null +++ b/nv/m07500_a1.cu @@ -0,0 +1,919 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _KRB5PA_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW2 +#define VECT_SIZE1 +#endif + +#define DGST_R0 3 +#define DGST_R1 7 +#define DGST_R2 2 +#define DGST_R3 6 + +#include "include/kernel_functions.c" +#include "types_nv.c" +#include "common_nv.c" + +__device__ __constant__ comb_t c_combs[1024]; + +typedef struct +{ + u8 S[256]; + + u8 i; + u8 j; + +} RC4_KEY; + +__device__ static void swap (RC4_KEY *rc4_key, const u8 i, const u8 j) +{ + u8 tmp; + + tmp = rc4_key->S[i]; + rc4_key->S[i] = rc4_key->S[j]; + rc4_key->S[j] = tmp; +} + +__device__ static void rc4_init_16 (RC4_KEY *rc4_key, const u32 data[4]) +{ + u32 i; + + for (i = 0; i < 256; i += 1) rc4_key->S[i] = i; + + u8 j = 0; + + for (i = 0; i < 256; i += 16) + { + u32 idx = i; + + u32 v; + + v = data[0]; + + j += rc4_key->S[idx] + (v >> 0); swap (rc4_key, idx, j); idx++; + j += rc4_key->S[idx] + (v >> 8); swap (rc4_key, idx, j); idx++; + j += rc4_key->S[idx] + (v >> 16); swap (rc4_key, idx, j); idx++; + j += rc4_key->S[idx] + (v >> 24); swap (rc4_key, idx, j); idx++; + + v = data[1]; + + j += rc4_key->S[idx] + (v >> 0); swap (rc4_key, idx, j); idx++; + j += rc4_key->S[idx] + (v >> 8); swap (rc4_key, idx, j); idx++; + j += rc4_key->S[idx] + (v >> 16); swap (rc4_key, idx, j); idx++; + j += rc4_key->S[idx] + (v >> 24); swap (rc4_key, idx, j); idx++; + + v = data[2]; + + j += rc4_key->S[idx] + (v >> 0); swap (rc4_key, idx, j); idx++; + j += rc4_key->S[idx] + (v >> 8); swap (rc4_key, idx, j); idx++; + j += rc4_key->S[idx] + (v >> 16); swap (rc4_key, idx, j); idx++; + j += rc4_key->S[idx] + (v >> 24); swap (rc4_key, idx, j); idx++; + + v = data[3]; + + j += rc4_key->S[idx] + (v >> 0); swap (rc4_key, idx, j); idx++; + j += rc4_key->S[idx] + (v >> 8); swap (rc4_key, idx, j); idx++; + j += rc4_key->S[idx] + (v >> 16); swap (rc4_key, idx, j); idx++; + j += rc4_key->S[idx] + (v >> 24); swap (rc4_key, idx, j); idx++; + } + + rc4_key->i = 0; + rc4_key->j = 0; +} + +__device__ static u32 rc4_next_4 (RC4_KEY *rc4_key, const u32 ct) +{ + u8 idx; + + u32 xor4 = 0; + + u8 i = rc4_key->i; + u8 j = rc4_key->j; + + i += 1; + j += rc4_key->S[i]; + + swap (rc4_key, i, j); + + idx = rc4_key->S[i] + rc4_key->S[j]; + + xor4 |= rc4_key->S[idx] << 0; + + i += 1; + j += rc4_key->S[i]; + + swap (rc4_key, i, j); + + idx = rc4_key->S[i] + rc4_key->S[j]; + + xor4 |= rc4_key->S[idx] << 8; + + i += 1; + j += rc4_key->S[i]; + + swap (rc4_key, i, j); + + idx = rc4_key->S[i] + rc4_key->S[j]; + + xor4 |= rc4_key->S[idx] << 16; + + i += 1; + j += rc4_key->S[i]; + + swap (rc4_key, i, j); + + idx = rc4_key->S[i] + rc4_key->S[j]; + + xor4 |= rc4_key->S[idx] << 24; + + rc4_key->i = i; + rc4_key->j = j; + + return ct ^ xor4; +} + +__device__ static int decrypt_and_check (RC4_KEY *rc4_key, u32 data[4], u32 timestamp_ct[8]) +{ + u32 pt; + + rc4_init_16 (rc4_key, data); + + pt = rc4_next_4 (rc4_key, timestamp_ct[0]); + pt = rc4_next_4 (rc4_key, timestamp_ct[1]); + pt = rc4_next_4 (rc4_key, timestamp_ct[2]); + pt = rc4_next_4 (rc4_key, timestamp_ct[3]); + + if ((pt & 0xffff0000) != 0x30320000) return 0; + + pt = rc4_next_4 (rc4_key, timestamp_ct[4]); + + if (((pt & 0xff) < '0') || ((pt & 0xff) > '9')) return 0; pt >>= 8; + if (((pt & 0xff) < '0') || ((pt & 0xff) > '9')) return 0; pt >>= 8; + if (((pt & 0xff) < '0') || ((pt & 0xff) > '9')) return 0; pt >>= 8; + if (((pt & 0xff) < '0') || ((pt & 0xff) > '9')) return 0; + + pt = rc4_next_4 (rc4_key, timestamp_ct[5]); + + if (((pt & 0xff) < '0') || ((pt & 0xff) > '9')) return 0; pt >>= 8; + if (((pt & 0xff) < '0') || ((pt & 0xff) > '9')) return 0; pt >>= 8; + if (((pt & 0xff) < '0') || ((pt & 0xff) > '9')) return 0; pt >>= 8; + if (((pt & 0xff) < '0') || ((pt & 0xff) > '9')) return 0; + + pt = rc4_next_4 (rc4_key, timestamp_ct[6]); + + if (((pt & 0xff) < '0') || ((pt & 0xff) > '9')) return 0; pt >>= 8; + if (((pt & 0xff) < '0') || ((pt & 0xff) > '9')) return 0; pt >>= 8; + if (((pt & 0xff) < '0') || ((pt & 0xff) > '9')) return 0; pt >>= 8; + if (((pt & 0xff) < '0') || ((pt & 0xff) > '9')) return 0; + + return 1; +} + +__device__ static void md4_transform (const u32x w0[4], const u32x w1[4], const u32x w2[4], const u32x w3[4], u32x digest[4]) +{ + u32x a = digest[0]; + u32x b = digest[1]; + u32x c = digest[2]; + u32x d = digest[3]; + + MD4_STEP (MD4_Fo, a, b, c, d, w0[0], MD4C00, MD4S00); + MD4_STEP (MD4_Fo, d, a, b, c, w0[1], MD4C00, MD4S01); + MD4_STEP (MD4_Fo, c, d, a, b, w0[2], MD4C00, MD4S02); + MD4_STEP (MD4_Fo, b, c, d, a, w0[3], MD4C00, MD4S03); + MD4_STEP (MD4_Fo, a, b, c, d, w1[0], MD4C00, MD4S00); + MD4_STEP (MD4_Fo, d, a, b, c, w1[1], MD4C00, MD4S01); + MD4_STEP (MD4_Fo, c, d, a, b, w1[2], MD4C00, MD4S02); + MD4_STEP (MD4_Fo, b, c, d, a, w1[3], MD4C00, MD4S03); + MD4_STEP (MD4_Fo, a, b, c, d, w2[0], MD4C00, MD4S00); + MD4_STEP (MD4_Fo, d, a, b, c, w2[1], MD4C00, MD4S01); + MD4_STEP (MD4_Fo, c, d, a, b, w2[2], MD4C00, MD4S02); + MD4_STEP (MD4_Fo, b, c, d, a, w2[3], MD4C00, MD4S03); + MD4_STEP (MD4_Fo, a, b, c, d, w3[0], MD4C00, MD4S00); + MD4_STEP (MD4_Fo, d, a, b, c, w3[1], MD4C00, MD4S01); + MD4_STEP (MD4_Fo, c, d, a, b, w3[2], MD4C00, MD4S02); + MD4_STEP (MD4_Fo, b, c, d, a, w3[3], MD4C00, MD4S03); + + MD4_STEP (MD4_Go, a, b, c, d, w0[0], MD4C01, MD4S10); + MD4_STEP (MD4_Go, d, a, b, c, w1[0], MD4C01, MD4S11); + MD4_STEP (MD4_Go, c, d, a, b, w2[0], MD4C01, MD4S12); + MD4_STEP (MD4_Go, b, c, d, a, w3[0], MD4C01, MD4S13); + MD4_STEP (MD4_Go, a, b, c, d, w0[1], MD4C01, MD4S10); + MD4_STEP (MD4_Go, d, a, b, c, w1[1], MD4C01, MD4S11); + MD4_STEP (MD4_Go, c, d, a, b, w2[1], MD4C01, MD4S12); + MD4_STEP (MD4_Go, b, c, d, a, w3[1], MD4C01, MD4S13); + MD4_STEP (MD4_Go, a, b, c, d, w0[2], MD4C01, MD4S10); + MD4_STEP (MD4_Go, d, a, b, c, w1[2], MD4C01, MD4S11); + MD4_STEP (MD4_Go, c, d, a, b, w2[2], MD4C01, MD4S12); + MD4_STEP (MD4_Go, b, c, d, a, w3[2], MD4C01, MD4S13); + MD4_STEP (MD4_Go, a, b, c, d, w0[3], MD4C01, MD4S10); + MD4_STEP (MD4_Go, d, a, b, c, w1[3], MD4C01, MD4S11); + MD4_STEP (MD4_Go, c, d, a, b, w2[3], MD4C01, MD4S12); + MD4_STEP (MD4_Go, b, c, d, a, w3[3], MD4C01, MD4S13); + + MD4_STEP (MD4_H , a, b, c, d, w0[0], MD4C02, MD4S20); + MD4_STEP (MD4_H , d, a, b, c, w2[0], MD4C02, MD4S21); + MD4_STEP (MD4_H , c, d, a, b, w1[0], MD4C02, MD4S22); + MD4_STEP (MD4_H , b, c, d, a, w3[0], MD4C02, MD4S23); + MD4_STEP (MD4_H , a, b, c, d, w0[2], MD4C02, MD4S20); + MD4_STEP (MD4_H , d, a, b, c, w2[2], MD4C02, MD4S21); + MD4_STEP (MD4_H , c, d, a, b, w1[2], MD4C02, MD4S22); + MD4_STEP (MD4_H , b, c, d, a, w3[2], MD4C02, MD4S23); + MD4_STEP (MD4_H , a, b, c, d, w0[1], MD4C02, MD4S20); + MD4_STEP (MD4_H , d, a, b, c, w2[1], MD4C02, MD4S21); + MD4_STEP (MD4_H , c, d, a, b, w1[1], MD4C02, MD4S22); + MD4_STEP (MD4_H , b, c, d, a, w3[1], MD4C02, MD4S23); + MD4_STEP (MD4_H , a, b, c, d, w0[3], MD4C02, MD4S20); + MD4_STEP (MD4_H , d, a, b, c, w2[3], MD4C02, MD4S21); + MD4_STEP (MD4_H , c, d, a, b, w1[3], MD4C02, MD4S22); + MD4_STEP (MD4_H , b, c, d, a, w3[3], MD4C02, MD4S23); + + digest[0] += a; + digest[1] += b; + digest[2] += c; + digest[3] += d; +} + +__device__ static void md5_transform (const u32x w0[4], const u32x w1[4], const u32x w2[4], const u32x w3[4], u32x digest[4]) +{ + u32x a = digest[0]; + u32x b = digest[1]; + u32x c = digest[2]; + u32x d = digest[3]; + + u32x w0_t = w0[0]; + u32x w1_t = w0[1]; + u32x w2_t = w0[2]; + u32x w3_t = w0[3]; + u32x w4_t = w1[0]; + u32x w5_t = w1[1]; + u32x w6_t = w1[2]; + u32x w7_t = w1[3]; + u32x w8_t = w2[0]; + u32x w9_t = w2[1]; + u32x wa_t = w2[2]; + u32x wb_t = w2[3]; + u32x wc_t = w3[0]; + u32x wd_t = w3[1]; + u32x we_t = w3[2]; + u32x wf_t = w3[3]; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t, MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t, MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t, MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t, MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w4_t, MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w5_t, MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w6_t, MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w7_t, MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w8_t, MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w9_t, MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, wa_t, MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, wb_t, MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, wc_t, MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, wd_t, MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, we_t, MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, wf_t, MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w1_t, MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w6_t, MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, wb_t, MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t, MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w5_t, MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, wa_t, MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, wf_t, MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w4_t, MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w9_t, MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, we_t, MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t, MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w8_t, MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, wd_t, MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t, MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w7_t, MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, wc_t, MD5C1f, MD5S13); + + MD5_STEP (MD5_H , a, b, c, d, w5_t, MD5C20, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w8_t, MD5C21, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, wb_t, MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, we_t, MD5C23, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w1_t, MD5C24, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w4_t, MD5C25, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w7_t, MD5C26, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, wa_t, MD5C27, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, wd_t, MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w0_t, MD5C29, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w3_t, MD5C2a, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w6_t, MD5C2b, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w9_t, MD5C2c, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, wc_t, MD5C2d, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, wf_t, MD5C2e, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w2_t, MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t, MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w7_t, MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, we_t, MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w5_t, MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, wc_t, MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t, MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, wa_t, MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t, MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w8_t, MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, wf_t, MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w6_t, MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, wd_t, MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w4_t, MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, wb_t, MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t, MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w9_t, MD5C3f, MD5S33); + + digest[0] += a; + digest[1] += b; + digest[2] += c; + digest[3] += d; +} + +__device__ static void hmac_md5_pad (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], u32x ipad[4], u32x opad[4]) +{ + w0[0] = w0[0] ^ 0x36363636; + w0[1] = w0[1] ^ 0x36363636; + w0[2] = w0[2] ^ 0x36363636; + w0[3] = w0[3] ^ 0x36363636; + w1[0] = w1[0] ^ 0x36363636; + w1[1] = w1[1] ^ 0x36363636; + w1[2] = w1[2] ^ 0x36363636; + w1[3] = w1[3] ^ 0x36363636; + w2[0] = w2[0] ^ 0x36363636; + w2[1] = w2[1] ^ 0x36363636; + w2[2] = w2[2] ^ 0x36363636; + w2[3] = w2[3] ^ 0x36363636; + w3[0] = w3[0] ^ 0x36363636; + w3[1] = w3[1] ^ 0x36363636; + w3[2] = w3[2] ^ 0x36363636; + w3[3] = w3[3] ^ 0x36363636; + + ipad[0] = MD5M_A; + ipad[1] = MD5M_B; + ipad[2] = MD5M_C; + ipad[3] = MD5M_D; + + md5_transform (w0, w1, w2, w3, ipad); + + w0[0] = w0[0] ^ 0x6a6a6a6a; + w0[1] = w0[1] ^ 0x6a6a6a6a; + w0[2] = w0[2] ^ 0x6a6a6a6a; + w0[3] = w0[3] ^ 0x6a6a6a6a; + w1[0] = w1[0] ^ 0x6a6a6a6a; + w1[1] = w1[1] ^ 0x6a6a6a6a; + w1[2] = w1[2] ^ 0x6a6a6a6a; + w1[3] = w1[3] ^ 0x6a6a6a6a; + w2[0] = w2[0] ^ 0x6a6a6a6a; + w2[1] = w2[1] ^ 0x6a6a6a6a; + w2[2] = w2[2] ^ 0x6a6a6a6a; + w2[3] = w2[3] ^ 0x6a6a6a6a; + w3[0] = w3[0] ^ 0x6a6a6a6a; + w3[1] = w3[1] ^ 0x6a6a6a6a; + w3[2] = w3[2] ^ 0x6a6a6a6a; + w3[3] = w3[3] ^ 0x6a6a6a6a; + + opad[0] = MD5M_A; + opad[1] = MD5M_B; + opad[2] = MD5M_C; + opad[3] = MD5M_D; + + md5_transform (w0, w1, w2, w3, opad); +} + +__device__ static void hmac_md5_run (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], u32x ipad[4], u32x opad[4], u32x digest[4]) +{ + digest[0] = ipad[0]; + digest[1] = ipad[1]; + digest[2] = ipad[2]; + digest[3] = ipad[3]; + + md5_transform (w0, w1, w2, w3, digest); + + w0[0] = digest[0]; + w0[1] = digest[1]; + w0[2] = digest[2]; + w0[3] = digest[3]; + w1[0] = 0x80; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + w3[0] = 0; + w3[1] = 0; + w3[2] = (64 + 16) * 8; + w3[3] = 0; + + digest[0] = opad[0]; + digest[1] = opad[1]; + digest[2] = opad[2]; + digest[3] = opad[3]; + + md5_transform (w0, w1, w2, w3, digest); +} + +__device__ static void kerb_prepare (const u32x w0[4], const u32x w1[4], const u32 pw_len, const u32 checksum[4], u32x digest[4]) +{ + /** + * pads + */ + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + w0_t[0] = w0[0]; + w0_t[1] = w0[1]; + w0_t[2] = w0[2]; + w0_t[3] = w0[3]; + w1_t[0] = w1[0]; + w1_t[1] = w1[1]; + w1_t[2] = w1[2]; + w1_t[3] = w1[3]; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = 0; + + // K=MD4(Little_indian(UNICODE(pwd)) + + append_0x80_2 (w0_t, w1_t, pw_len); + + make_unicode (w1_t, w2_t, w3_t); + make_unicode (w0_t, w0_t, w1_t); + + w3_t[2] = pw_len * 8 * 2; + w3_t[3] = 0; + + digest[0] = MD4M_A; + digest[1] = MD4M_B; + digest[2] = MD4M_C; + digest[3] = MD4M_D; + + md4_transform (w0_t, w1_t, w2_t, w3_t, digest); + + // K1=MD5_HMAC(K,1); with 1 encoded as little indian on 4 bytes (01000000 in hexa); + + w0_t[0] = digest[0]; + w0_t[1] = digest[1]; + w0_t[2] = digest[2]; + w0_t[3] = digest[3]; + w1_t[0] = 0; + w1_t[1] = 0; + w1_t[2] = 0; + w1_t[3] = 0; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = 0; + + u32x ipad[4]; + u32x opad[4]; + + hmac_md5_pad (w0_t, w1_t, w2_t, w3_t, ipad, opad); + + w0_t[0] = 1; + w0_t[1] = 0x80; + w0_t[2] = 0; + w0_t[3] = 0; + w1_t[0] = 0; + w1_t[1] = 0; + w1_t[2] = 0; + w1_t[3] = 0; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = (64 + 4) * 8; + w3_t[3] = 0; + + hmac_md5_run (w0_t, w1_t, w2_t, w3_t, ipad, opad, digest); + + // K3=MD5_HMAC(K1,checksum); + + w0_t[0] = digest[0]; + w0_t[1] = digest[1]; + w0_t[2] = digest[2]; + w0_t[3] = digest[3]; + w1_t[0] = 0; + w1_t[1] = 0; + w1_t[2] = 0; + w1_t[3] = 0; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = 0; + + hmac_md5_pad (w0_t, w1_t, w2_t, w3_t, ipad, opad); + + w0_t[0] = checksum[0]; + w0_t[1] = checksum[1]; + w0_t[2] = checksum[2]; + w0_t[3] = checksum[3]; + w1_t[0] = 0x80; + w1_t[1] = 0; + w1_t[2] = 0; + w1_t[3] = 0; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = (64 + 16) * 8; + w3_t[3] = 0; + + hmac_md5_run (w0_t, w1_t, w2_t, w3_t, ipad, opad, digest); +} + +extern "C" __global__ void __launch_bounds__ (64, 1) m07500_m04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const krb5pa_t *krb5pa_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + __shared__ RC4_KEY rc4_keys[64]; + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + const u32 lid = threadIdx.x; + + if (gid >= gid_max) return; + + /** + * base + */ + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, c_combs[0].pw_len); + } + + /** + * salt + */ + + u32 checksum[4]; + + checksum[0] = krb5pa_bufs[salt_pos].checksum[0]; + checksum[1] = krb5pa_bufs[salt_pos].checksum[1]; + checksum[2] = krb5pa_bufs[salt_pos].checksum[2]; + checksum[3] = krb5pa_bufs[salt_pos].checksum[3]; + + u32 timestamp_ct[8]; + + timestamp_ct[0] = krb5pa_bufs[salt_pos].timestamp[0]; + timestamp_ct[1] = krb5pa_bufs[salt_pos].timestamp[1]; + timestamp_ct[2] = krb5pa_bufs[salt_pos].timestamp[2]; + timestamp_ct[3] = krb5pa_bufs[salt_pos].timestamp[3]; + timestamp_ct[4] = krb5pa_bufs[salt_pos].timestamp[4]; + timestamp_ct[5] = krb5pa_bufs[salt_pos].timestamp[5]; + timestamp_ct[6] = krb5pa_bufs[salt_pos].timestamp[6]; + timestamp_ct[7] = krb5pa_bufs[salt_pos].timestamp[7]; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = c_combs[il_pos].pw_len; + + const u32 pw_len = pw_l_len + pw_r_len; + + u32 wordr0[4]; + + wordr0[0] = c_combs[il_pos].i[0]; + wordr0[1] = c_combs[il_pos].i[1]; + wordr0[2] = c_combs[il_pos].i[2]; + wordr0[3] = c_combs[il_pos].i[3]; + + u32 wordr1[4]; + + wordr1[0] = c_combs[il_pos].i[4]; + wordr1[1] = c_combs[il_pos].i[5]; + wordr1[2] = c_combs[il_pos].i[6]; + wordr1[3] = c_combs[il_pos].i[7]; + + u32 wordr2[4]; + + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + + u32 wordr3[4]; + + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + u32x w0[4]; + + w0[0] = wordl0[0] | wordr0[0]; + w0[1] = wordl0[1] | wordr0[1]; + w0[2] = wordl0[2] | wordr0[2]; + w0[3] = wordl0[3] | wordr0[3]; + + u32x w1[4]; + + w1[0] = wordl1[0] | wordr1[0]; + w1[1] = wordl1[1] | wordr1[1]; + w1[2] = wordl1[2] | wordr1[2]; + w1[3] = wordl1[3] | wordr1[3]; + + u32x w2[4]; + + w2[0] = wordl2[0] | wordr2[0]; + w2[1] = wordl2[1] | wordr2[1]; + w2[2] = wordl2[2] | wordr2[2]; + w2[3] = wordl2[3] | wordr2[3]; + + u32x w3[4]; + + w3[0] = wordl3[0] | wordr3[0]; + w3[1] = wordl3[1] | wordr3[1]; + w3[2] = 0; + w3[3] = 0; + + /** + * kerberos + */ + + u32x digest[4]; + + kerb_prepare (w0, w1, pw_len, checksum, digest); + + u32 tmp[4]; + + #ifdef VECT_SIZE1 + + tmp[0] = digest[0]; + tmp[1] = digest[1]; + tmp[2] = digest[2]; + tmp[3] = digest[3]; + + if (decrypt_and_check (&rc4_keys[lid], tmp, timestamp_ct) == 1) + { + mark_hash_s0 (plains_buf, hashes_shown, digests_offset, gid, il_pos); + + d_return_buf[lid] = 1; + } + + #endif + } +} + +extern "C" __global__ void __launch_bounds__ (64, 1) m07500_m08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const krb5pa_t *krb5pa_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (64, 1) m07500_m16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const krb5pa_t *krb5pa_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (64, 1) m07500_s04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const krb5pa_t *krb5pa_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + __shared__ RC4_KEY rc4_keys[64]; + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + const u32 lid = threadIdx.x; + + if (gid >= gid_max) return; + + /** + * base + */ + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, c_combs[0].pw_len); + } + + /** + * salt + */ + + u32 checksum[4]; + + checksum[0] = krb5pa_bufs[salt_pos].checksum[0]; + checksum[1] = krb5pa_bufs[salt_pos].checksum[1]; + checksum[2] = krb5pa_bufs[salt_pos].checksum[2]; + checksum[3] = krb5pa_bufs[salt_pos].checksum[3]; + + u32 timestamp_ct[8]; + + timestamp_ct[0] = krb5pa_bufs[salt_pos].timestamp[0]; + timestamp_ct[1] = krb5pa_bufs[salt_pos].timestamp[1]; + timestamp_ct[2] = krb5pa_bufs[salt_pos].timestamp[2]; + timestamp_ct[3] = krb5pa_bufs[salt_pos].timestamp[3]; + timestamp_ct[4] = krb5pa_bufs[salt_pos].timestamp[4]; + timestamp_ct[5] = krb5pa_bufs[salt_pos].timestamp[5]; + timestamp_ct[6] = krb5pa_bufs[salt_pos].timestamp[6]; + timestamp_ct[7] = krb5pa_bufs[salt_pos].timestamp[7]; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = c_combs[il_pos].pw_len; + + const u32 pw_len = pw_l_len + pw_r_len; + + u32 wordr0[4]; + + wordr0[0] = c_combs[il_pos].i[0]; + wordr0[1] = c_combs[il_pos].i[1]; + wordr0[2] = c_combs[il_pos].i[2]; + wordr0[3] = c_combs[il_pos].i[3]; + + u32 wordr1[4]; + + wordr1[0] = c_combs[il_pos].i[4]; + wordr1[1] = c_combs[il_pos].i[5]; + wordr1[2] = c_combs[il_pos].i[6]; + wordr1[3] = c_combs[il_pos].i[7]; + + u32 wordr2[4]; + + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + + u32 wordr3[4]; + + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + u32x w0[4]; + + w0[0] = wordl0[0] | wordr0[0]; + w0[1] = wordl0[1] | wordr0[1]; + w0[2] = wordl0[2] | wordr0[2]; + w0[3] = wordl0[3] | wordr0[3]; + + u32x w1[4]; + + w1[0] = wordl1[0] | wordr1[0]; + w1[1] = wordl1[1] | wordr1[1]; + w1[2] = wordl1[2] | wordr1[2]; + w1[3] = wordl1[3] | wordr1[3]; + + u32x w2[4]; + + w2[0] = wordl2[0] | wordr2[0]; + w2[1] = wordl2[1] | wordr2[1]; + w2[2] = wordl2[2] | wordr2[2]; + w2[3] = wordl2[3] | wordr2[3]; + + u32x w3[4]; + + w3[0] = wordl3[0] | wordr3[0]; + w3[1] = wordl3[1] | wordr3[1]; + w3[2] = 0; + w3[3] = 0; + + /** + * kerberos + */ + + u32x digest[4]; + + kerb_prepare (w0, w1, pw_len, checksum, digest); + + u32 tmp[4]; + + #ifdef VECT_SIZE1 + + tmp[0] = digest[0]; + tmp[1] = digest[1]; + tmp[2] = digest[2]; + tmp[3] = digest[3]; + + if (decrypt_and_check (&rc4_keys[lid], tmp, timestamp_ct) == 1) + { + mark_hash_s0 (plains_buf, hashes_shown, digests_offset, gid, il_pos); + + d_return_buf[lid] = 1; + } + + #endif + } +} + +extern "C" __global__ void __launch_bounds__ (64, 1) m07500_s08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const krb5pa_t *krb5pa_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (64, 1) m07500_s16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const krb5pa_t *krb5pa_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/nv/m07500_a3.cu b/nv/m07500_a3.cu new file mode 100644 index 0000000000..8336ce3cbd --- /dev/null +++ b/nv/m07500_a3.cu @@ -0,0 +1,826 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _KRB5PA_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW2 +#define VECT_SIZE1 +#endif + +#define DGST_R0 3 +#define DGST_R1 7 +#define DGST_R2 2 +#define DGST_R3 6 + +#include "include/kernel_functions.c" +#include "types_nv.c" +#include "common_nv.c" + +__device__ __constant__ bf_t c_bfs[1024]; + +typedef struct +{ + u8 S[256]; + + u8 i; + u8 j; + +} RC4_KEY; + +__device__ static void swap (RC4_KEY *rc4_key, const u8 i, const u8 j) +{ + u8 tmp; + + tmp = rc4_key->S[i]; + rc4_key->S[i] = rc4_key->S[j]; + rc4_key->S[j] = tmp; +} + +__device__ static void rc4_init_16 (RC4_KEY *rc4_key, const u32 data[4]) +{ + u32 i; + + for (i = 0; i < 256; i += 1) rc4_key->S[i] = i; + + u8 j = 0; + + for (i = 0; i < 256; i += 16) + { + u32 idx = i; + + u32 v; + + v = data[0]; + + j += rc4_key->S[idx] + (v >> 0); swap (rc4_key, idx, j); idx++; + j += rc4_key->S[idx] + (v >> 8); swap (rc4_key, idx, j); idx++; + j += rc4_key->S[idx] + (v >> 16); swap (rc4_key, idx, j); idx++; + j += rc4_key->S[idx] + (v >> 24); swap (rc4_key, idx, j); idx++; + + v = data[1]; + + j += rc4_key->S[idx] + (v >> 0); swap (rc4_key, idx, j); idx++; + j += rc4_key->S[idx] + (v >> 8); swap (rc4_key, idx, j); idx++; + j += rc4_key->S[idx] + (v >> 16); swap (rc4_key, idx, j); idx++; + j += rc4_key->S[idx] + (v >> 24); swap (rc4_key, idx, j); idx++; + + v = data[2]; + + j += rc4_key->S[idx] + (v >> 0); swap (rc4_key, idx, j); idx++; + j += rc4_key->S[idx] + (v >> 8); swap (rc4_key, idx, j); idx++; + j += rc4_key->S[idx] + (v >> 16); swap (rc4_key, idx, j); idx++; + j += rc4_key->S[idx] + (v >> 24); swap (rc4_key, idx, j); idx++; + + v = data[3]; + + j += rc4_key->S[idx] + (v >> 0); swap (rc4_key, idx, j); idx++; + j += rc4_key->S[idx] + (v >> 8); swap (rc4_key, idx, j); idx++; + j += rc4_key->S[idx] + (v >> 16); swap (rc4_key, idx, j); idx++; + j += rc4_key->S[idx] + (v >> 24); swap (rc4_key, idx, j); idx++; + } + + rc4_key->i = 0; + rc4_key->j = 0; +} + +__device__ static u32 rc4_next_4 (RC4_KEY *rc4_key, const u32 ct) +{ + u8 idx; + + u32 xor4 = 0; + + u8 i = rc4_key->i; + u8 j = rc4_key->j; + + i += 1; + j += rc4_key->S[i]; + + swap (rc4_key, i, j); + + idx = rc4_key->S[i] + rc4_key->S[j]; + + xor4 |= rc4_key->S[idx] << 0; + + i += 1; + j += rc4_key->S[i]; + + swap (rc4_key, i, j); + + idx = rc4_key->S[i] + rc4_key->S[j]; + + xor4 |= rc4_key->S[idx] << 8; + + i += 1; + j += rc4_key->S[i]; + + swap (rc4_key, i, j); + + idx = rc4_key->S[i] + rc4_key->S[j]; + + xor4 |= rc4_key->S[idx] << 16; + + i += 1; + j += rc4_key->S[i]; + + swap (rc4_key, i, j); + + idx = rc4_key->S[i] + rc4_key->S[j]; + + xor4 |= rc4_key->S[idx] << 24; + + rc4_key->i = i; + rc4_key->j = j; + + return ct ^ xor4; +} + +__device__ static int decrypt_and_check (RC4_KEY *rc4_key, u32 data[4], u32 timestamp_ct[8]) +{ + u32 pt; + + rc4_init_16 (rc4_key, data); + + pt = rc4_next_4 (rc4_key, timestamp_ct[0]); + pt = rc4_next_4 (rc4_key, timestamp_ct[1]); + pt = rc4_next_4 (rc4_key, timestamp_ct[2]); + pt = rc4_next_4 (rc4_key, timestamp_ct[3]); + + if ((pt & 0xffff0000) != 0x30320000) return 0; + + pt = rc4_next_4 (rc4_key, timestamp_ct[4]); + + if (((pt & 0xff) < '0') || ((pt & 0xff) > '9')) return 0; pt >>= 8; + if (((pt & 0xff) < '0') || ((pt & 0xff) > '9')) return 0; pt >>= 8; + if (((pt & 0xff) < '0') || ((pt & 0xff) > '9')) return 0; pt >>= 8; + if (((pt & 0xff) < '0') || ((pt & 0xff) > '9')) return 0; + + pt = rc4_next_4 (rc4_key, timestamp_ct[5]); + + if (((pt & 0xff) < '0') || ((pt & 0xff) > '9')) return 0; pt >>= 8; + if (((pt & 0xff) < '0') || ((pt & 0xff) > '9')) return 0; pt >>= 8; + if (((pt & 0xff) < '0') || ((pt & 0xff) > '9')) return 0; pt >>= 8; + if (((pt & 0xff) < '0') || ((pt & 0xff) > '9')) return 0; + + pt = rc4_next_4 (rc4_key, timestamp_ct[6]); + + if (((pt & 0xff) < '0') || ((pt & 0xff) > '9')) return 0; pt >>= 8; + if (((pt & 0xff) < '0') || ((pt & 0xff) > '9')) return 0; pt >>= 8; + if (((pt & 0xff) < '0') || ((pt & 0xff) > '9')) return 0; pt >>= 8; + if (((pt & 0xff) < '0') || ((pt & 0xff) > '9')) return 0; + + return 1; +} + +__device__ static void md4_transform (const u32x w0[4], const u32x w1[4], const u32x w2[4], const u32x w3[4], u32x digest[4]) +{ + u32x a = digest[0]; + u32x b = digest[1]; + u32x c = digest[2]; + u32x d = digest[3]; + + MD4_STEP (MD4_Fo, a, b, c, d, w0[0], MD4C00, MD4S00); + MD4_STEP (MD4_Fo, d, a, b, c, w0[1], MD4C00, MD4S01); + MD4_STEP (MD4_Fo, c, d, a, b, w0[2], MD4C00, MD4S02); + MD4_STEP (MD4_Fo, b, c, d, a, w0[3], MD4C00, MD4S03); + MD4_STEP (MD4_Fo, a, b, c, d, w1[0], MD4C00, MD4S00); + MD4_STEP (MD4_Fo, d, a, b, c, w1[1], MD4C00, MD4S01); + MD4_STEP (MD4_Fo, c, d, a, b, w1[2], MD4C00, MD4S02); + MD4_STEP (MD4_Fo, b, c, d, a, w1[3], MD4C00, MD4S03); + MD4_STEP (MD4_Fo, a, b, c, d, w2[0], MD4C00, MD4S00); + MD4_STEP (MD4_Fo, d, a, b, c, w2[1], MD4C00, MD4S01); + MD4_STEP (MD4_Fo, c, d, a, b, w2[2], MD4C00, MD4S02); + MD4_STEP (MD4_Fo, b, c, d, a, w2[3], MD4C00, MD4S03); + MD4_STEP (MD4_Fo, a, b, c, d, w3[0], MD4C00, MD4S00); + MD4_STEP (MD4_Fo, d, a, b, c, w3[1], MD4C00, MD4S01); + MD4_STEP (MD4_Fo, c, d, a, b, w3[2], MD4C00, MD4S02); + MD4_STEP (MD4_Fo, b, c, d, a, w3[3], MD4C00, MD4S03); + + MD4_STEP (MD4_Go, a, b, c, d, w0[0], MD4C01, MD4S10); + MD4_STEP (MD4_Go, d, a, b, c, w1[0], MD4C01, MD4S11); + MD4_STEP (MD4_Go, c, d, a, b, w2[0], MD4C01, MD4S12); + MD4_STEP (MD4_Go, b, c, d, a, w3[0], MD4C01, MD4S13); + MD4_STEP (MD4_Go, a, b, c, d, w0[1], MD4C01, MD4S10); + MD4_STEP (MD4_Go, d, a, b, c, w1[1], MD4C01, MD4S11); + MD4_STEP (MD4_Go, c, d, a, b, w2[1], MD4C01, MD4S12); + MD4_STEP (MD4_Go, b, c, d, a, w3[1], MD4C01, MD4S13); + MD4_STEP (MD4_Go, a, b, c, d, w0[2], MD4C01, MD4S10); + MD4_STEP (MD4_Go, d, a, b, c, w1[2], MD4C01, MD4S11); + MD4_STEP (MD4_Go, c, d, a, b, w2[2], MD4C01, MD4S12); + MD4_STEP (MD4_Go, b, c, d, a, w3[2], MD4C01, MD4S13); + MD4_STEP (MD4_Go, a, b, c, d, w0[3], MD4C01, MD4S10); + MD4_STEP (MD4_Go, d, a, b, c, w1[3], MD4C01, MD4S11); + MD4_STEP (MD4_Go, c, d, a, b, w2[3], MD4C01, MD4S12); + MD4_STEP (MD4_Go, b, c, d, a, w3[3], MD4C01, MD4S13); + + MD4_STEP (MD4_H , a, b, c, d, w0[0], MD4C02, MD4S20); + MD4_STEP (MD4_H , d, a, b, c, w2[0], MD4C02, MD4S21); + MD4_STEP (MD4_H , c, d, a, b, w1[0], MD4C02, MD4S22); + MD4_STEP (MD4_H , b, c, d, a, w3[0], MD4C02, MD4S23); + MD4_STEP (MD4_H , a, b, c, d, w0[2], MD4C02, MD4S20); + MD4_STEP (MD4_H , d, a, b, c, w2[2], MD4C02, MD4S21); + MD4_STEP (MD4_H , c, d, a, b, w1[2], MD4C02, MD4S22); + MD4_STEP (MD4_H , b, c, d, a, w3[2], MD4C02, MD4S23); + MD4_STEP (MD4_H , a, b, c, d, w0[1], MD4C02, MD4S20); + MD4_STEP (MD4_H , d, a, b, c, w2[1], MD4C02, MD4S21); + MD4_STEP (MD4_H , c, d, a, b, w1[1], MD4C02, MD4S22); + MD4_STEP (MD4_H , b, c, d, a, w3[1], MD4C02, MD4S23); + MD4_STEP (MD4_H , a, b, c, d, w0[3], MD4C02, MD4S20); + MD4_STEP (MD4_H , d, a, b, c, w2[3], MD4C02, MD4S21); + MD4_STEP (MD4_H , c, d, a, b, w1[3], MD4C02, MD4S22); + MD4_STEP (MD4_H , b, c, d, a, w3[3], MD4C02, MD4S23); + + digest[0] += a; + digest[1] += b; + digest[2] += c; + digest[3] += d; +} + +__device__ static void md5_transform (const u32x w0[4], const u32x w1[4], const u32x w2[4], const u32x w3[4], u32x digest[4]) +{ + u32x a = digest[0]; + u32x b = digest[1]; + u32x c = digest[2]; + u32x d = digest[3]; + + u32x w0_t = w0[0]; + u32x w1_t = w0[1]; + u32x w2_t = w0[2]; + u32x w3_t = w0[3]; + u32x w4_t = w1[0]; + u32x w5_t = w1[1]; + u32x w6_t = w1[2]; + u32x w7_t = w1[3]; + u32x w8_t = w2[0]; + u32x w9_t = w2[1]; + u32x wa_t = w2[2]; + u32x wb_t = w2[3]; + u32x wc_t = w3[0]; + u32x wd_t = w3[1]; + u32x we_t = w3[2]; + u32x wf_t = w3[3]; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t, MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t, MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t, MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t, MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w4_t, MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w5_t, MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w6_t, MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w7_t, MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w8_t, MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w9_t, MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, wa_t, MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, wb_t, MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, wc_t, MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, wd_t, MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, we_t, MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, wf_t, MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w1_t, MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w6_t, MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, wb_t, MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t, MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w5_t, MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, wa_t, MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, wf_t, MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w4_t, MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w9_t, MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, we_t, MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t, MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w8_t, MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, wd_t, MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t, MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w7_t, MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, wc_t, MD5C1f, MD5S13); + + MD5_STEP (MD5_H , a, b, c, d, w5_t, MD5C20, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w8_t, MD5C21, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, wb_t, MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, we_t, MD5C23, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w1_t, MD5C24, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w4_t, MD5C25, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w7_t, MD5C26, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, wa_t, MD5C27, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, wd_t, MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w0_t, MD5C29, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w3_t, MD5C2a, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w6_t, MD5C2b, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w9_t, MD5C2c, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, wc_t, MD5C2d, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, wf_t, MD5C2e, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w2_t, MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t, MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w7_t, MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, we_t, MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w5_t, MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, wc_t, MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t, MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, wa_t, MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t, MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w8_t, MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, wf_t, MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w6_t, MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, wd_t, MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w4_t, MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, wb_t, MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t, MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w9_t, MD5C3f, MD5S33); + + digest[0] += a; + digest[1] += b; + digest[2] += c; + digest[3] += d; +} + +__device__ static void hmac_md5_pad (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], u32x ipad[4], u32x opad[4]) +{ + w0[0] = w0[0] ^ 0x36363636; + w0[1] = w0[1] ^ 0x36363636; + w0[2] = w0[2] ^ 0x36363636; + w0[3] = w0[3] ^ 0x36363636; + w1[0] = w1[0] ^ 0x36363636; + w1[1] = w1[1] ^ 0x36363636; + w1[2] = w1[2] ^ 0x36363636; + w1[3] = w1[3] ^ 0x36363636; + w2[0] = w2[0] ^ 0x36363636; + w2[1] = w2[1] ^ 0x36363636; + w2[2] = w2[2] ^ 0x36363636; + w2[3] = w2[3] ^ 0x36363636; + w3[0] = w3[0] ^ 0x36363636; + w3[1] = w3[1] ^ 0x36363636; + w3[2] = w3[2] ^ 0x36363636; + w3[3] = w3[3] ^ 0x36363636; + + ipad[0] = MD5M_A; + ipad[1] = MD5M_B; + ipad[2] = MD5M_C; + ipad[3] = MD5M_D; + + md5_transform (w0, w1, w2, w3, ipad); + + w0[0] = w0[0] ^ 0x6a6a6a6a; + w0[1] = w0[1] ^ 0x6a6a6a6a; + w0[2] = w0[2] ^ 0x6a6a6a6a; + w0[3] = w0[3] ^ 0x6a6a6a6a; + w1[0] = w1[0] ^ 0x6a6a6a6a; + w1[1] = w1[1] ^ 0x6a6a6a6a; + w1[2] = w1[2] ^ 0x6a6a6a6a; + w1[3] = w1[3] ^ 0x6a6a6a6a; + w2[0] = w2[0] ^ 0x6a6a6a6a; + w2[1] = w2[1] ^ 0x6a6a6a6a; + w2[2] = w2[2] ^ 0x6a6a6a6a; + w2[3] = w2[3] ^ 0x6a6a6a6a; + w3[0] = w3[0] ^ 0x6a6a6a6a; + w3[1] = w3[1] ^ 0x6a6a6a6a; + w3[2] = w3[2] ^ 0x6a6a6a6a; + w3[3] = w3[3] ^ 0x6a6a6a6a; + + opad[0] = MD5M_A; + opad[1] = MD5M_B; + opad[2] = MD5M_C; + opad[3] = MD5M_D; + + md5_transform (w0, w1, w2, w3, opad); +} + +__device__ static void hmac_md5_run (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], u32x ipad[4], u32x opad[4], u32x digest[4]) +{ + digest[0] = ipad[0]; + digest[1] = ipad[1]; + digest[2] = ipad[2]; + digest[3] = ipad[3]; + + md5_transform (w0, w1, w2, w3, digest); + + w0[0] = digest[0]; + w0[1] = digest[1]; + w0[2] = digest[2]; + w0[3] = digest[3]; + w1[0] = 0x80; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + w3[0] = 0; + w3[1] = 0; + w3[2] = (64 + 16) * 8; + w3[3] = 0; + + digest[0] = opad[0]; + digest[1] = opad[1]; + digest[2] = opad[2]; + digest[3] = opad[3]; + + md5_transform (w0, w1, w2, w3, digest); +} + +__device__ static void kerb_prepare (const u32x w0[4], const u32x w1[4], const u32 pw_len, const u32 checksum[4], u32x digest[4]) +{ + /** + * pads + */ + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + w0_t[0] = w0[0]; + w0_t[1] = w0[1]; + w0_t[2] = w0[2]; + w0_t[3] = w0[3]; + w1_t[0] = w1[0]; + w1_t[1] = w1[1]; + w1_t[2] = w1[2]; + w1_t[3] = w1[3]; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = 0; + + // K=MD4(Little_indian(UNICODE(pwd)) + + append_0x80_2 (w0_t, w1_t, pw_len); + + make_unicode (w1_t, w2_t, w3_t); + make_unicode (w0_t, w0_t, w1_t); + + w3_t[2] = pw_len * 8 * 2; + w3_t[3] = 0; + + digest[0] = MD4M_A; + digest[1] = MD4M_B; + digest[2] = MD4M_C; + digest[3] = MD4M_D; + + md4_transform (w0_t, w1_t, w2_t, w3_t, digest); + + // K1=MD5_HMAC(K,1); with 1 encoded as little indian on 4 bytes (01000000 in hexa); + + w0_t[0] = digest[0]; + w0_t[1] = digest[1]; + w0_t[2] = digest[2]; + w0_t[3] = digest[3]; + w1_t[0] = 0; + w1_t[1] = 0; + w1_t[2] = 0; + w1_t[3] = 0; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = 0; + + u32x ipad[4]; + u32x opad[4]; + + hmac_md5_pad (w0_t, w1_t, w2_t, w3_t, ipad, opad); + + w0_t[0] = 1; + w0_t[1] = 0x80; + w0_t[2] = 0; + w0_t[3] = 0; + w1_t[0] = 0; + w1_t[1] = 0; + w1_t[2] = 0; + w1_t[3] = 0; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = (64 + 4) * 8; + w3_t[3] = 0; + + hmac_md5_run (w0_t, w1_t, w2_t, w3_t, ipad, opad, digest); + + // K3=MD5_HMAC(K1,checksum); + + w0_t[0] = digest[0]; + w0_t[1] = digest[1]; + w0_t[2] = digest[2]; + w0_t[3] = digest[3]; + w1_t[0] = 0; + w1_t[1] = 0; + w1_t[2] = 0; + w1_t[3] = 0; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = 0; + + hmac_md5_pad (w0_t, w1_t, w2_t, w3_t, ipad, opad); + + w0_t[0] = checksum[0]; + w0_t[1] = checksum[1]; + w0_t[2] = checksum[2]; + w0_t[3] = checksum[3]; + w1_t[0] = 0x80; + w1_t[1] = 0; + w1_t[2] = 0; + w1_t[3] = 0; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = (64 + 16) * 8; + w3_t[3] = 0; + + hmac_md5_run (w0_t, w1_t, w2_t, w3_t, ipad, opad, digest); +} + +__device__ static void m07500 (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], const u32 pw_len, const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const krb5pa_t *krb5pa_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset) +{ + /** + * modifier + */ + + __shared__ RC4_KEY rc4_keys[64]; + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + const u32 lid = threadIdx.x; + + /** + * salt + */ + + u32 checksum[4]; + + checksum[0] = krb5pa_bufs[salt_pos].checksum[0]; + checksum[1] = krb5pa_bufs[salt_pos].checksum[1]; + checksum[2] = krb5pa_bufs[salt_pos].checksum[2]; + checksum[3] = krb5pa_bufs[salt_pos].checksum[3]; + + u32 timestamp_ct[8]; + + timestamp_ct[0] = krb5pa_bufs[salt_pos].timestamp[0]; + timestamp_ct[1] = krb5pa_bufs[salt_pos].timestamp[1]; + timestamp_ct[2] = krb5pa_bufs[salt_pos].timestamp[2]; + timestamp_ct[3] = krb5pa_bufs[salt_pos].timestamp[3]; + timestamp_ct[4] = krb5pa_bufs[salt_pos].timestamp[4]; + timestamp_ct[5] = krb5pa_bufs[salt_pos].timestamp[5]; + timestamp_ct[6] = krb5pa_bufs[salt_pos].timestamp[6]; + timestamp_ct[7] = krb5pa_bufs[salt_pos].timestamp[7]; + + /** + * loop + */ + + u32x w0l = w0[0]; + + for (u32 il_pos = 0; il_pos < bfs_cnt; il_pos++) + { + const u32 w0r = c_bfs[il_pos].i; + + w0[0] = w0l | w0r; + + u32x digest[4]; + + kerb_prepare (w0, w1, pw_len, checksum, digest); + + u32 tmp[4]; + + #ifdef VECT_SIZE1 + + tmp[0] = digest[0]; + tmp[1] = digest[1]; + tmp[2] = digest[2]; + tmp[3] = digest[3]; + + if (decrypt_and_check (&rc4_keys[lid], tmp, timestamp_ct) == 1) + { + mark_hash_s0 (plains_buf, hashes_shown, digests_offset, gid, il_pos); + + d_return_buf[lid] = 1; + } + + #endif + } +} + +extern "C" __global__ void __launch_bounds__ (64, 1) m07500_m04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const krb5pa_t *krb5pa_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + const u32 lid = threadIdx.x; + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m07500 (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, krb5pa_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (64, 1) m07500_m08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const krb5pa_t *krb5pa_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + const u32 lid = threadIdx.x; + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m07500 (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, krb5pa_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (64, 1) m07500_m16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const krb5pa_t *krb5pa_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (64, 1) m07500_s04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const krb5pa_t *krb5pa_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + const u32 lid = threadIdx.x; + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m07500 (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, krb5pa_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (64, 1) m07500_s08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const krb5pa_t *krb5pa_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + const u32 lid = threadIdx.x; + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m07500 (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, krb5pa_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (64, 1) m07500_s16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const krb5pa_t *krb5pa_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/nv/m07600_a0.cu b/nv/m07600_a0.cu new file mode 100644 index 0000000000..b0d7892a1e --- /dev/null +++ b/nv/m07600_a0.cu @@ -0,0 +1,1180 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _SHA1_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW2 +#define VECT_SIZE1 +#endif + +#define DGST_R0 3 +#define DGST_R1 4 +#define DGST_R2 2 +#define DGST_R3 1 + +#include "include/kernel_functions.c" +#include "types_nv.c" +#include "common_nv.c" +#include "include/rp_gpu.h" +#include "rp_nv.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE1 +#define uint_to_hex_lower8(i) l_bin2asc[(i)] +#endif + +#ifdef VECT_SIZE2 +#define uint_to_hex_lower8(i) u32x (l_bin2asc[(i).x], l_bin2asc[(i).y]) +#endif + +__device__ __constant__ char c_bin2asc[16] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' }; + +__device__ __shared__ short l_bin2asc[256]; + +__device__ __constant__ gpu_rule_t c_rules[1024]; + +extern "C" __global__ void __launch_bounds__ (256, 1) m07600_m04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + u32x pw_buf1[4]; + + pw_buf1[0] = pws[gid].i[ 4]; + pw_buf1[1] = pws[gid].i[ 5]; + pw_buf1[2] = pws[gid].i[ 6]; + pw_buf1[3] = pws[gid].i[ 7]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[ 1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[ 2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[ 3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[ 4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[ 5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[ 6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[ 7]; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + const u32 total_len = (salt_len + 40) * 8; + + /** + * bin2asc table + */ + + l_bin2asc[lid] = c_bin2asc[(lid >> 0) & 15] << 8 + | c_bin2asc[(lid >> 4) & 15] << 0; + + __syncthreads (); + + if (gid >= gid_max) return; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + + w0[0] = pw_buf0[0]; + w0[1] = pw_buf0[1]; + w0[2] = pw_buf0[2]; + w0[3] = pw_buf0[3]; + + u32x w1[4]; + + w1[0] = pw_buf1[0]; + w1[1] = pw_buf1[1]; + w1[2] = pw_buf1[2]; + w1[3] = pw_buf1[3]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 out_len = apply_rules (c_rules[il_pos].cmds, w0, w1, pw_len); + + append_0x80_2 (w0, w1, out_len); + + /** + * sha1 + */ + + u32x w0_t = swap_workaround (w0[0]); + u32x w1_t = swap_workaround (w0[1]); + u32x w2_t = swap_workaround (w0[2]); + u32x w3_t = swap_workaround (w0[3]); + u32x w4_t = swap_workaround (w1[0]); + u32x w5_t = swap_workaround (w1[1]); + u32x w6_t = swap_workaround (w1[2]); + u32x w7_t = swap_workaround (w1[3]); + u32x w8_t = swap_workaround (w2[0]); + u32x w9_t = swap_workaround (w2[1]); + u32x wa_t = swap_workaround (w2[2]); + u32x wb_t = swap_workaround (w2[3]); + u32x wc_t = swap_workaround (w3[0]); + u32x wd_t = swap_workaround (w3[1]); + u32x we_t = 0; + u32x wf_t = pw_len * 8; + + u32x a = SHA1M_A; + u32x b = SHA1M_B; + u32x c = SHA1M_C; + u32x d = SHA1M_D; + u32x e = SHA1M_E; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w0_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w1_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w2_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w3_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w4_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w5_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w6_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w7_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w8_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w9_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wa_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, wb_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, wc_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, wd_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, we_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F0o, e, a, b, c, d, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F0o, d, e, a, b, c, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F0o, c, d, e, a, b, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F0o, b, c, d, e, a, w3_t); + + #undef K + #define K SHA1C01 + + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w7_t); + + #undef K + #define K SHA1C02 + + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wb_t); + + #undef K + #define K SHA1C03 + + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wf_t); + + a += SHA1M_A; + b += SHA1M_B; + c += SHA1M_C; + d += SHA1M_D; + e += SHA1M_E; + + /** + * Prepend salt + */ + + u32x w0t[4]; + + w0t[0] = uint_to_hex_lower8 ((a >> 24) & 255) << 0 + | uint_to_hex_lower8 ((a >> 16) & 255) << 16; + w0t[1] = uint_to_hex_lower8 ((a >> 8) & 255) << 0 + | uint_to_hex_lower8 ((a >> 0) & 255) << 16; + w0t[2] = uint_to_hex_lower8 ((b >> 24) & 255) << 0 + | uint_to_hex_lower8 ((b >> 16) & 255) << 16; + w0t[3] = uint_to_hex_lower8 ((b >> 8) & 255) << 0 + | uint_to_hex_lower8 ((b >> 0) & 255) << 16; + + u32x w1t[4]; + + w1t[0] = uint_to_hex_lower8 ((c >> 24) & 255) << 0 + | uint_to_hex_lower8 ((c >> 16) & 255) << 16; + w1t[1] = uint_to_hex_lower8 ((c >> 8) & 255) << 0 + | uint_to_hex_lower8 ((c >> 0) & 255) << 16; + w1t[2] = uint_to_hex_lower8 ((d >> 24) & 255) << 0 + | uint_to_hex_lower8 ((d >> 16) & 255) << 16; + w1t[3] = uint_to_hex_lower8 ((d >> 8) & 255) << 0 + | uint_to_hex_lower8 ((d >> 0) & 255) << 16; + + u32x w2t[2]; + + w2t[0] = uint_to_hex_lower8 ((e >> 24) & 255) << 0 + | uint_to_hex_lower8 ((e >> 16) & 255) << 16; + w2t[1] = uint_to_hex_lower8 ((e >> 8) & 255) << 0 + | uint_to_hex_lower8 ((e >> 0) & 255) << 16; + + w0_t = salt_buf0[0]; + w1_t = salt_buf0[1]; + w2_t = salt_buf0[2]; + w3_t = salt_buf0[3]; + w4_t = salt_buf1[0]; + w5_t = salt_buf1[1]; + w6_t = salt_buf1[2]; + w7_t = salt_buf1[3]; + w8_t = w0t[0]; + w9_t = w0t[1]; + wa_t = w0t[2]; + wb_t = w0t[3]; + wc_t = w1t[0]; + wd_t = w1t[1]; + we_t = w1t[2]; + wf_t = w1t[3]; + + /** + * 2nd SHA1 + */ + + // 1st transform + + w0_t = swap_workaround (w0_t); + w1_t = swap_workaround (w1_t); + w2_t = swap_workaround (w2_t); + w3_t = swap_workaround (w3_t); + w4_t = swap_workaround (w4_t); + w5_t = swap_workaround (w5_t); + w6_t = swap_workaround (w6_t); + w7_t = swap_workaround (w7_t); + w8_t = swap_workaround (w8_t); + w9_t = swap_workaround (w9_t); + wa_t = swap_workaround (wa_t); + wb_t = swap_workaround (wb_t); + wc_t = swap_workaround (wc_t); + wd_t = swap_workaround (wd_t); + we_t = swap_workaround (we_t); + wf_t = swap_workaround (wf_t); + + a = SHA1M_A; + b = SHA1M_B; + c = SHA1M_C; + d = SHA1M_D; + e = SHA1M_E; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w0_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w1_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w2_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w3_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w4_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w5_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w6_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w7_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w8_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w9_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wa_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, wb_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, wc_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, wd_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, we_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F0o, e, a, b, c, d, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F0o, d, e, a, b, c, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F0o, c, d, e, a, b, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F0o, b, c, d, e, a, w3_t); + + #undef K + #define K SHA1C01 + + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w7_t); + + #undef K + #define K SHA1C02 + + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wb_t); + + #undef K + #define K SHA1C03 + + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wf_t); + + a += SHA1M_A; + b += SHA1M_B; + c += SHA1M_C; + d += SHA1M_D; + e += SHA1M_E; + + u32x r_a = a; + u32x r_b = b; + u32x r_c = c; + u32x r_d = d; + u32x r_e = e; + + // 2nd transform + + w0_t = swap_workaround (w2t[0]); + w1_t = swap_workaround (w2t[1]); + w2_t = 0x80000000; + w3_t = 0; + w4_t = 0; + w5_t = 0; + w6_t = 0; + w7_t = 0; + w8_t = 0; + w9_t = 0; + wa_t = 0; + wb_t = 0; + wc_t = 0; + wd_t = 0; + we_t = 0; + wf_t = total_len; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w0_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w1_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w2_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w3_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w4_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w5_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w6_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w7_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w8_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w9_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wa_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, wb_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, wc_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, wd_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, we_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F0o, e, a, b, c, d, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F0o, d, e, a, b, c, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F0o, c, d, e, a, b, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F0o, b, c, d, e, a, w3_t); + + #undef K + #define K SHA1C01 + + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w7_t); + + #undef K + #define K SHA1C02 + + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wb_t); + + #undef K + #define K SHA1C03 + + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wf_t); + + a += r_a; + b += r_b; + c += r_c; + d += r_d; + e += r_e; + + const u32x r0 = d; + const u32x r1 = e; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_M + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m07600_m08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m07600_m16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m07600_s04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + u32x pw_buf1[4]; + + pw_buf1[0] = pws[gid].i[ 4]; + pw_buf1[1] = pws[gid].i[ 5]; + pw_buf1[2] = pws[gid].i[ 6]; + pw_buf1[3] = pws[gid].i[ 7]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[ 1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[ 2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[ 3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[ 4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[ 5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[ 6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[ 7]; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + const u32 total_len = (salt_len + 40) * 8; + + /** + * bin2asc table + */ + + l_bin2asc[lid] = c_bin2asc[(lid >> 0) & 15] << 8 + | c_bin2asc[(lid >> 4) & 15] << 0; + + __syncthreads (); + + if (gid >= gid_max) return; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * reverse + */ + + const u32 e_rev = rotl32 (search[1], 2u); + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + + w0[0] = pw_buf0[0]; + w0[1] = pw_buf0[1]; + w0[2] = pw_buf0[2]; + w0[3] = pw_buf0[3]; + + u32x w1[4]; + + w1[0] = pw_buf1[0]; + w1[1] = pw_buf1[1]; + w1[2] = pw_buf1[2]; + w1[3] = pw_buf1[3]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 out_len = apply_rules (c_rules[il_pos].cmds, w0, w1, pw_len); + + append_0x80_2 (w0, w1, out_len); + + /** + * sha1 + */ + + u32x w0_t = swap_workaround (w0[0]); + u32x w1_t = swap_workaround (w0[1]); + u32x w2_t = swap_workaround (w0[2]); + u32x w3_t = swap_workaround (w0[3]); + u32x w4_t = swap_workaround (w1[0]); + u32x w5_t = swap_workaround (w1[1]); + u32x w6_t = swap_workaround (w1[2]); + u32x w7_t = swap_workaround (w1[3]); + u32x w8_t = swap_workaround (w2[0]); + u32x w9_t = swap_workaround (w2[1]); + u32x wa_t = swap_workaround (w2[2]); + u32x wb_t = swap_workaround (w2[3]); + u32x wc_t = swap_workaround (w3[0]); + u32x wd_t = swap_workaround (w3[1]); + u32x we_t = 0; + u32x wf_t = pw_len * 8; + + u32x a = SHA1M_A; + u32x b = SHA1M_B; + u32x c = SHA1M_C; + u32x d = SHA1M_D; + u32x e = SHA1M_E; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w0_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w1_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w2_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w3_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w4_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w5_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w6_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w7_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w8_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w9_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wa_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, wb_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, wc_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, wd_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, we_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F0o, e, a, b, c, d, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F0o, d, e, a, b, c, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F0o, c, d, e, a, b, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F0o, b, c, d, e, a, w3_t); + + #undef K + #define K SHA1C01 + + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w7_t); + + #undef K + #define K SHA1C02 + + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wb_t); + + #undef K + #define K SHA1C03 + + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wf_t); + + a += SHA1M_A; + b += SHA1M_B; + c += SHA1M_C; + d += SHA1M_D; + e += SHA1M_E; + + /** + * Prepend salt + */ + + u32x w0t[4]; + + w0t[0] = uint_to_hex_lower8 ((a >> 24) & 255) << 0 + | uint_to_hex_lower8 ((a >> 16) & 255) << 16; + w0t[1] = uint_to_hex_lower8 ((a >> 8) & 255) << 0 + | uint_to_hex_lower8 ((a >> 0) & 255) << 16; + w0t[2] = uint_to_hex_lower8 ((b >> 24) & 255) << 0 + | uint_to_hex_lower8 ((b >> 16) & 255) << 16; + w0t[3] = uint_to_hex_lower8 ((b >> 8) & 255) << 0 + | uint_to_hex_lower8 ((b >> 0) & 255) << 16; + + u32x w1t[4]; + + w1t[0] = uint_to_hex_lower8 ((c >> 24) & 255) << 0 + | uint_to_hex_lower8 ((c >> 16) & 255) << 16; + w1t[1] = uint_to_hex_lower8 ((c >> 8) & 255) << 0 + | uint_to_hex_lower8 ((c >> 0) & 255) << 16; + w1t[2] = uint_to_hex_lower8 ((d >> 24) & 255) << 0 + | uint_to_hex_lower8 ((d >> 16) & 255) << 16; + w1t[3] = uint_to_hex_lower8 ((d >> 8) & 255) << 0 + | uint_to_hex_lower8 ((d >> 0) & 255) << 16; + + u32x w2t[2]; + + w2t[0] = uint_to_hex_lower8 ((e >> 24) & 255) << 0 + | uint_to_hex_lower8 ((e >> 16) & 255) << 16; + w2t[1] = uint_to_hex_lower8 ((e >> 8) & 255) << 0 + | uint_to_hex_lower8 ((e >> 0) & 255) << 16; + + w0_t = salt_buf0[0]; + w1_t = salt_buf0[1]; + w2_t = salt_buf0[2]; + w3_t = salt_buf0[3]; + w4_t = salt_buf1[0]; + w5_t = salt_buf1[1]; + w6_t = salt_buf1[2]; + w7_t = salt_buf1[3]; + w8_t = w0t[0]; + w9_t = w0t[1]; + wa_t = w0t[2]; + wb_t = w0t[3]; + wc_t = w1t[0]; + wd_t = w1t[1]; + we_t = w1t[2]; + wf_t = w1t[3]; + + /** + * 2nd SHA1 + */ + + // 1st transform + + w0_t = swap_workaround (w0_t); + w1_t = swap_workaround (w1_t); + w2_t = swap_workaround (w2_t); + w3_t = swap_workaround (w3_t); + w4_t = swap_workaround (w4_t); + w5_t = swap_workaround (w5_t); + w6_t = swap_workaround (w6_t); + w7_t = swap_workaround (w7_t); + w8_t = swap_workaround (w8_t); + w9_t = swap_workaround (w9_t); + wa_t = swap_workaround (wa_t); + wb_t = swap_workaround (wb_t); + wc_t = swap_workaround (wc_t); + wd_t = swap_workaround (wd_t); + we_t = swap_workaround (we_t); + wf_t = swap_workaround (wf_t); + + a = SHA1M_A; + b = SHA1M_B; + c = SHA1M_C; + d = SHA1M_D; + e = SHA1M_E; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w0_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w1_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w2_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w3_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w4_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w5_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w6_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w7_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w8_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w9_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wa_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, wb_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, wc_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, wd_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, we_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F0o, e, a, b, c, d, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F0o, d, e, a, b, c, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F0o, c, d, e, a, b, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F0o, b, c, d, e, a, w3_t); + + #undef K + #define K SHA1C01 + + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w7_t); + + #undef K + #define K SHA1C02 + + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wb_t); + + #undef K + #define K SHA1C03 + + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wf_t); + + a += SHA1M_A; + b += SHA1M_B; + c += SHA1M_C; + d += SHA1M_D; + e += SHA1M_E; + + u32x r_a = a; + u32x r_b = b; + u32x r_c = c; + u32x r_d = d; + u32x r_e = e; + + // 2nd transform + + w0_t = swap_workaround (w2t[0]); + w1_t = swap_workaround (w2t[1]); + w2_t = 0x80000000; + w3_t = 0; + w4_t = 0; + w5_t = 0; + w6_t = 0; + w7_t = 0; + w8_t = 0; + w9_t = 0; + wa_t = 0; + wb_t = 0; + wc_t = 0; + wd_t = 0; + we_t = 0; + wf_t = total_len; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w0_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w1_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w2_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w3_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w4_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w5_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w6_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w7_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w8_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w9_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wa_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, wb_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, wc_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, wd_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, we_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F0o, e, a, b, c, d, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F0o, d, e, a, b, c, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F0o, c, d, e, a, b, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F0o, b, c, d, e, a, w3_t); + + #undef K + #define K SHA1C01 + + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w7_t); + + #undef K + #define K SHA1C02 + + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wb_t); + + #undef K + #define K SHA1C03 + + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wf_t); + + a += r_a; + b += r_b; + c += r_c; + d += r_d; + e += r_e; + + const u32x r0 = d; + const u32x r1 = e; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_S + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m07600_s08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m07600_s16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/nv/m07600_a1.cu b/nv/m07600_a1.cu new file mode 100644 index 0000000000..9fecf6a104 --- /dev/null +++ b/nv/m07600_a1.cu @@ -0,0 +1,1290 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _SHA1_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW2 +#define VECT_SIZE1 +#endif + +#define DGST_R0 3 +#define DGST_R1 4 +#define DGST_R2 2 +#define DGST_R3 1 + +#include "include/kernel_functions.c" +#include "types_nv.c" +#include "common_nv.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE1 +#define uint_to_hex_lower8(i) l_bin2asc[(i)] +#endif + +#ifdef VECT_SIZE2 +#define uint_to_hex_lower8(i) u32x (l_bin2asc[(i).x], l_bin2asc[(i).y]) +#endif + +__device__ __constant__ char c_bin2asc[16] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' }; + +__device__ __shared__ short l_bin2asc[256]; + +__device__ __constant__ comb_t c_combs[1024]; + +extern "C" __global__ void __launch_bounds__ (256, 1) m07600_m04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + append_0x80_2 (wordl0, wordl1, pw_l_len); + + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, c_combs[0].pw_len); + } + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[ 1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[ 2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[ 3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[ 4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[ 5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[ 6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[ 7]; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + const u32 total_len = (salt_len + 40) * 8; + + /** + * bin2asc table + */ + + l_bin2asc[lid] = c_bin2asc[(lid >> 0) & 15] << 8 + | c_bin2asc[(lid >> 4) & 15] << 0; + + __syncthreads (); + + if (gid >= gid_max) return; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = c_combs[il_pos].pw_len; + + const u32 pw_len = pw_l_len + pw_r_len; + + u32 wordr0[4]; + + wordr0[0] = c_combs[il_pos].i[0]; + wordr0[1] = c_combs[il_pos].i[1]; + wordr0[2] = c_combs[il_pos].i[2]; + wordr0[3] = c_combs[il_pos].i[3]; + + u32 wordr1[4]; + + wordr1[0] = c_combs[il_pos].i[4]; + wordr1[1] = c_combs[il_pos].i[5]; + wordr1[2] = c_combs[il_pos].i[6]; + wordr1[3] = c_combs[il_pos].i[7]; + + u32 wordr2[4]; + + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + + u32 wordr3[4]; + + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + append_0x80_2 (wordr0, wordr1, pw_r_len); + + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + u32x w0[4]; + + w0[0] = wordl0[0] | wordr0[0]; + w0[1] = wordl0[1] | wordr0[1]; + w0[2] = wordl0[2] | wordr0[2]; + w0[3] = wordl0[3] | wordr0[3]; + + u32x w1[4]; + + w1[0] = wordl1[0] | wordr1[0]; + w1[1] = wordl1[1] | wordr1[1]; + w1[2] = wordl1[2] | wordr1[2]; + w1[3] = wordl1[3] | wordr1[3]; + + u32x w2[4]; + + w2[0] = wordl2[0] | wordr2[0]; + w2[1] = wordl2[1] | wordr2[1]; + w2[2] = wordl2[2] | wordr2[2]; + w2[3] = wordl2[3] | wordr2[3]; + + u32x w3[4]; + + w3[0] = wordl3[0] | wordr3[0]; + w3[1] = wordl3[1] | wordr3[1]; + w3[2] = 0; + w3[3] = 0; + + /** + * sha1 + */ + + u32x w0_t = swap_workaround (w0[0]); + u32x w1_t = swap_workaround (w0[1]); + u32x w2_t = swap_workaround (w0[2]); + u32x w3_t = swap_workaround (w0[3]); + u32x w4_t = swap_workaround (w1[0]); + u32x w5_t = swap_workaround (w1[1]); + u32x w6_t = swap_workaround (w1[2]); + u32x w7_t = swap_workaround (w1[3]); + u32x w8_t = swap_workaround (w2[0]); + u32x w9_t = swap_workaround (w2[1]); + u32x wa_t = swap_workaround (w2[2]); + u32x wb_t = swap_workaround (w2[3]); + u32x wc_t = swap_workaround (w3[0]); + u32x wd_t = swap_workaround (w3[1]); + u32x we_t = 0; + u32x wf_t = pw_len * 8; + + u32x a = SHA1M_A; + u32x b = SHA1M_B; + u32x c = SHA1M_C; + u32x d = SHA1M_D; + u32x e = SHA1M_E; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w0_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w1_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w2_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w3_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w4_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w5_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w6_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w7_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w8_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w9_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wa_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, wb_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, wc_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, wd_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, we_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F0o, e, a, b, c, d, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F0o, d, e, a, b, c, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F0o, c, d, e, a, b, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F0o, b, c, d, e, a, w3_t); + + #undef K + #define K SHA1C01 + + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w7_t); + + #undef K + #define K SHA1C02 + + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wb_t); + + #undef K + #define K SHA1C03 + + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wf_t); + + a += SHA1M_A; + b += SHA1M_B; + c += SHA1M_C; + d += SHA1M_D; + e += SHA1M_E; + + /** + * Prepend salt + */ + + u32x w0t[4]; + + w0t[0] = uint_to_hex_lower8 ((a >> 24) & 255) << 0 + | uint_to_hex_lower8 ((a >> 16) & 255) << 16; + w0t[1] = uint_to_hex_lower8 ((a >> 8) & 255) << 0 + | uint_to_hex_lower8 ((a >> 0) & 255) << 16; + w0t[2] = uint_to_hex_lower8 ((b >> 24) & 255) << 0 + | uint_to_hex_lower8 ((b >> 16) & 255) << 16; + w0t[3] = uint_to_hex_lower8 ((b >> 8) & 255) << 0 + | uint_to_hex_lower8 ((b >> 0) & 255) << 16; + + u32x w1t[4]; + + w1t[0] = uint_to_hex_lower8 ((c >> 24) & 255) << 0 + | uint_to_hex_lower8 ((c >> 16) & 255) << 16; + w1t[1] = uint_to_hex_lower8 ((c >> 8) & 255) << 0 + | uint_to_hex_lower8 ((c >> 0) & 255) << 16; + w1t[2] = uint_to_hex_lower8 ((d >> 24) & 255) << 0 + | uint_to_hex_lower8 ((d >> 16) & 255) << 16; + w1t[3] = uint_to_hex_lower8 ((d >> 8) & 255) << 0 + | uint_to_hex_lower8 ((d >> 0) & 255) << 16; + + u32x w2t[2]; + + w2t[0] = uint_to_hex_lower8 ((e >> 24) & 255) << 0 + | uint_to_hex_lower8 ((e >> 16) & 255) << 16; + w2t[1] = uint_to_hex_lower8 ((e >> 8) & 255) << 0 + | uint_to_hex_lower8 ((e >> 0) & 255) << 16; + + w0_t = salt_buf0[0]; + w1_t = salt_buf0[1]; + w2_t = salt_buf0[2]; + w3_t = salt_buf0[3]; + w4_t = salt_buf1[0]; + w5_t = salt_buf1[1]; + w6_t = salt_buf1[2]; + w7_t = salt_buf1[3]; + w8_t = w0t[0]; + w9_t = w0t[1]; + wa_t = w0t[2]; + wb_t = w0t[3]; + wc_t = w1t[0]; + wd_t = w1t[1]; + we_t = w1t[2]; + wf_t = w1t[3]; + + /** + * 2nd SHA1 + */ + + // 1st transform + + w0_t = swap_workaround (w0_t); + w1_t = swap_workaround (w1_t); + w2_t = swap_workaround (w2_t); + w3_t = swap_workaround (w3_t); + w4_t = swap_workaround (w4_t); + w5_t = swap_workaround (w5_t); + w6_t = swap_workaround (w6_t); + w7_t = swap_workaround (w7_t); + w8_t = swap_workaround (w8_t); + w9_t = swap_workaround (w9_t); + wa_t = swap_workaround (wa_t); + wb_t = swap_workaround (wb_t); + wc_t = swap_workaround (wc_t); + wd_t = swap_workaround (wd_t); + we_t = swap_workaround (we_t); + wf_t = swap_workaround (wf_t); + + a = SHA1M_A; + b = SHA1M_B; + c = SHA1M_C; + d = SHA1M_D; + e = SHA1M_E; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w0_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w1_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w2_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w3_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w4_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w5_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w6_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w7_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w8_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w9_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wa_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, wb_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, wc_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, wd_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, we_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F0o, e, a, b, c, d, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F0o, d, e, a, b, c, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F0o, c, d, e, a, b, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F0o, b, c, d, e, a, w3_t); + + #undef K + #define K SHA1C01 + + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w7_t); + + #undef K + #define K SHA1C02 + + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wb_t); + + #undef K + #define K SHA1C03 + + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wf_t); + + a += SHA1M_A; + b += SHA1M_B; + c += SHA1M_C; + d += SHA1M_D; + e += SHA1M_E; + + u32x r_a = a; + u32x r_b = b; + u32x r_c = c; + u32x r_d = d; + u32x r_e = e; + + // 2nd transform + + w0_t = swap_workaround (w2t[0]); + w1_t = swap_workaround (w2t[1]); + w2_t = 0x80000000; + w3_t = 0; + w4_t = 0; + w5_t = 0; + w6_t = 0; + w7_t = 0; + w8_t = 0; + w9_t = 0; + wa_t = 0; + wb_t = 0; + wc_t = 0; + wd_t = 0; + we_t = 0; + wf_t = total_len; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w0_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w1_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w2_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w3_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w4_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w5_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w6_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w7_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w8_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w9_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wa_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, wb_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, wc_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, wd_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, we_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F0o, e, a, b, c, d, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F0o, d, e, a, b, c, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F0o, c, d, e, a, b, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F0o, b, c, d, e, a, w3_t); + + #undef K + #define K SHA1C01 + + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w7_t); + + #undef K + #define K SHA1C02 + + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wb_t); + + #undef K + #define K SHA1C03 + + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wf_t); + + a += r_a; + b += r_b; + c += r_c; + d += r_d; + e += r_e; + + const u32x r0 = d; + const u32x r1 = e; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_M + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m07600_m08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m07600_m16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m07600_s04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + append_0x80_2 (wordl0, wordl1, pw_l_len); + + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, c_combs[0].pw_len); + } + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[ 1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[ 2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[ 3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[ 4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[ 5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[ 6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[ 7]; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + const u32 total_len = (salt_len + 40) * 8; + + /** + * bin2asc table + */ + + l_bin2asc[lid] = c_bin2asc[(lid >> 0) & 15] << 8 + | c_bin2asc[(lid >> 4) & 15] << 0; + + __syncthreads (); + + if (gid >= gid_max) return; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * reverse + */ + + const u32 e_rev = rotl32 (search[1], 2u); + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = c_combs[il_pos].pw_len; + + const u32 pw_len = pw_l_len + pw_r_len; + + u32 wordr0[4]; + + wordr0[0] = c_combs[il_pos].i[0]; + wordr0[1] = c_combs[il_pos].i[1]; + wordr0[2] = c_combs[il_pos].i[2]; + wordr0[3] = c_combs[il_pos].i[3]; + + u32 wordr1[4]; + + wordr1[0] = c_combs[il_pos].i[4]; + wordr1[1] = c_combs[il_pos].i[5]; + wordr1[2] = c_combs[il_pos].i[6]; + wordr1[3] = c_combs[il_pos].i[7]; + + u32 wordr2[4]; + + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + + u32 wordr3[4]; + + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + append_0x80_2 (wordr0, wordr1, pw_r_len); + + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + u32x w0[4]; + + w0[0] = wordl0[0] | wordr0[0]; + w0[1] = wordl0[1] | wordr0[1]; + w0[2] = wordl0[2] | wordr0[2]; + w0[3] = wordl0[3] | wordr0[3]; + + u32x w1[4]; + + w1[0] = wordl1[0] | wordr1[0]; + w1[1] = wordl1[1] | wordr1[1]; + w1[2] = wordl1[2] | wordr1[2]; + w1[3] = wordl1[3] | wordr1[3]; + + u32x w2[4]; + + w2[0] = wordl2[0] | wordr2[0]; + w2[1] = wordl2[1] | wordr2[1]; + w2[2] = wordl2[2] | wordr2[2]; + w2[3] = wordl2[3] | wordr2[3]; + + u32x w3[4]; + + w3[0] = wordl3[0] | wordr3[0]; + w3[1] = wordl3[1] | wordr3[1]; + w3[2] = 0; + w3[3] = 0; + + /** + * sha1 + */ + + u32x w0_t = swap_workaround (w0[0]); + u32x w1_t = swap_workaround (w0[1]); + u32x w2_t = swap_workaround (w0[2]); + u32x w3_t = swap_workaround (w0[3]); + u32x w4_t = swap_workaround (w1[0]); + u32x w5_t = swap_workaround (w1[1]); + u32x w6_t = swap_workaround (w1[2]); + u32x w7_t = swap_workaround (w1[3]); + u32x w8_t = swap_workaround (w2[0]); + u32x w9_t = swap_workaround (w2[1]); + u32x wa_t = swap_workaround (w2[2]); + u32x wb_t = swap_workaround (w2[3]); + u32x wc_t = swap_workaround (w3[0]); + u32x wd_t = swap_workaround (w3[1]); + u32x we_t = 0; + u32x wf_t = pw_len * 8; + + u32x a = SHA1M_A; + u32x b = SHA1M_B; + u32x c = SHA1M_C; + u32x d = SHA1M_D; + u32x e = SHA1M_E; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w0_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w1_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w2_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w3_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w4_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w5_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w6_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w7_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w8_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w9_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wa_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, wb_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, wc_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, wd_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, we_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F0o, e, a, b, c, d, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F0o, d, e, a, b, c, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F0o, c, d, e, a, b, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F0o, b, c, d, e, a, w3_t); + + #undef K + #define K SHA1C01 + + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w7_t); + + #undef K + #define K SHA1C02 + + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wb_t); + + #undef K + #define K SHA1C03 + + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wf_t); + + a += SHA1M_A; + b += SHA1M_B; + c += SHA1M_C; + d += SHA1M_D; + e += SHA1M_E; + + /** + * Prepend salt + */ + + u32x w0t[4]; + + w0t[0] = uint_to_hex_lower8 ((a >> 24) & 255) << 0 + | uint_to_hex_lower8 ((a >> 16) & 255) << 16; + w0t[1] = uint_to_hex_lower8 ((a >> 8) & 255) << 0 + | uint_to_hex_lower8 ((a >> 0) & 255) << 16; + w0t[2] = uint_to_hex_lower8 ((b >> 24) & 255) << 0 + | uint_to_hex_lower8 ((b >> 16) & 255) << 16; + w0t[3] = uint_to_hex_lower8 ((b >> 8) & 255) << 0 + | uint_to_hex_lower8 ((b >> 0) & 255) << 16; + + u32x w1t[4]; + + w1t[0] = uint_to_hex_lower8 ((c >> 24) & 255) << 0 + | uint_to_hex_lower8 ((c >> 16) & 255) << 16; + w1t[1] = uint_to_hex_lower8 ((c >> 8) & 255) << 0 + | uint_to_hex_lower8 ((c >> 0) & 255) << 16; + w1t[2] = uint_to_hex_lower8 ((d >> 24) & 255) << 0 + | uint_to_hex_lower8 ((d >> 16) & 255) << 16; + w1t[3] = uint_to_hex_lower8 ((d >> 8) & 255) << 0 + | uint_to_hex_lower8 ((d >> 0) & 255) << 16; + + u32x w2t[2]; + + w2t[0] = uint_to_hex_lower8 ((e >> 24) & 255) << 0 + | uint_to_hex_lower8 ((e >> 16) & 255) << 16; + w2t[1] = uint_to_hex_lower8 ((e >> 8) & 255) << 0 + | uint_to_hex_lower8 ((e >> 0) & 255) << 16; + + w0_t = salt_buf0[0]; + w1_t = salt_buf0[1]; + w2_t = salt_buf0[2]; + w3_t = salt_buf0[3]; + w4_t = salt_buf1[0]; + w5_t = salt_buf1[1]; + w6_t = salt_buf1[2]; + w7_t = salt_buf1[3]; + w8_t = w0t[0]; + w9_t = w0t[1]; + wa_t = w0t[2]; + wb_t = w0t[3]; + wc_t = w1t[0]; + wd_t = w1t[1]; + we_t = w1t[2]; + wf_t = w1t[3]; + + /** + * 2nd SHA1 + */ + + // 1st transform + + w0_t = swap_workaround (w0_t); + w1_t = swap_workaround (w1_t); + w2_t = swap_workaround (w2_t); + w3_t = swap_workaround (w3_t); + w4_t = swap_workaround (w4_t); + w5_t = swap_workaround (w5_t); + w6_t = swap_workaround (w6_t); + w7_t = swap_workaround (w7_t); + w8_t = swap_workaround (w8_t); + w9_t = swap_workaround (w9_t); + wa_t = swap_workaround (wa_t); + wb_t = swap_workaround (wb_t); + wc_t = swap_workaround (wc_t); + wd_t = swap_workaround (wd_t); + we_t = swap_workaround (we_t); + wf_t = swap_workaround (wf_t); + + a = SHA1M_A; + b = SHA1M_B; + c = SHA1M_C; + d = SHA1M_D; + e = SHA1M_E; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w0_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w1_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w2_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w3_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w4_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w5_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w6_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w7_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w8_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w9_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wa_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, wb_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, wc_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, wd_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, we_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F0o, e, a, b, c, d, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F0o, d, e, a, b, c, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F0o, c, d, e, a, b, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F0o, b, c, d, e, a, w3_t); + + #undef K + #define K SHA1C01 + + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w7_t); + + #undef K + #define K SHA1C02 + + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wb_t); + + #undef K + #define K SHA1C03 + + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wf_t); + + a += SHA1M_A; + b += SHA1M_B; + c += SHA1M_C; + d += SHA1M_D; + e += SHA1M_E; + + u32x r_a = a; + u32x r_b = b; + u32x r_c = c; + u32x r_d = d; + u32x r_e = e; + + // 2nd transform + + w0_t = swap_workaround (w2t[0]); + w1_t = swap_workaround (w2t[1]); + w2_t = 0x80000000; + w3_t = 0; + w4_t = 0; + w5_t = 0; + w6_t = 0; + w7_t = 0; + w8_t = 0; + w9_t = 0; + wa_t = 0; + wb_t = 0; + wc_t = 0; + wd_t = 0; + we_t = 0; + wf_t = total_len; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w0_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w1_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w2_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w3_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w4_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w5_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w6_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w7_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w8_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w9_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wa_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, wb_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, wc_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, wd_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, we_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F0o, e, a, b, c, d, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F0o, d, e, a, b, c, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F0o, c, d, e, a, b, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F0o, b, c, d, e, a, w3_t); + + #undef K + #define K SHA1C01 + + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w7_t); + + #undef K + #define K SHA1C02 + + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wb_t); + + #undef K + #define K SHA1C03 + + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wf_t); + + a += r_a; + b += r_b; + c += r_c; + d += r_d; + e += r_e; + + const u32x r0 = d; + const u32x r1 = e; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_S + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m07600_s08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m07600_s16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/nv/m07600_a3.cu b/nv/m07600_a3.cu new file mode 100644 index 0000000000..3d60d8e773 --- /dev/null +++ b/nv/m07600_a3.cu @@ -0,0 +1,1419 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _SHA1_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW2 +#define VECT_SIZE1 +#endif + +#define DGST_R0 3 +#define DGST_R1 4 +#define DGST_R2 2 +#define DGST_R3 1 + +#include "include/kernel_functions.c" +#include "types_nv.c" +#include "common_nv.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE1 +#define uint_to_hex_lower8(i) l_bin2asc[(i)] +#endif + +#ifdef VECT_SIZE2 +#define uint_to_hex_lower8(i) u32x (l_bin2asc[(i).x], l_bin2asc[(i).y]) +#endif + +__device__ __constant__ char c_bin2asc[16] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' }; + +__device__ __shared__ short l_bin2asc[256]; + +__device__ __constant__ bf_t c_bfs[1024]; + +__device__ static void m07600m (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], const u32 pw_len, const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset) +{ + /** + * modifier + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + const u32 lid = threadIdx.x; + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[ 1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[ 2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[ 3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[ 4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[ 5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[ 6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[ 7]; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + const u32 total_len = (salt_len + 40) * 8; + + /** + * loop + */ + + u32x w0l = w0[0]; + + for (u32 il_pos = 0; il_pos < bfs_cnt; il_pos++) + { + const u32 w0r = c_bfs[il_pos].i; + + w0[0] = w0l | w0r; + + /** + * sha1 + */ + + u32x w0_t = w0[0]; + u32x w1_t = w0[1]; + u32x w2_t = w0[2]; + u32x w3_t = w0[3]; + u32x w4_t = w1[0]; + u32x w5_t = w1[1]; + u32x w6_t = w1[2]; + u32x w7_t = w1[3]; + u32x w8_t = w2[0]; + u32x w9_t = w2[1]; + u32x wa_t = w2[2]; + u32x wb_t = w2[3]; + u32x wc_t = w3[0]; + u32x wd_t = w3[1]; + u32x we_t = 0; + u32x wf_t = pw_len * 8; + + u32x a = SHA1M_A; + u32x b = SHA1M_B; + u32x c = SHA1M_C; + u32x d = SHA1M_D; + u32x e = SHA1M_E; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w0_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w1_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w2_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w3_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w4_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w5_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w6_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w7_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w8_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w9_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wa_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, wb_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, wc_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, wd_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, we_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F0o, e, a, b, c, d, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F0o, d, e, a, b, c, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F0o, c, d, e, a, b, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F0o, b, c, d, e, a, w3_t); + + #undef K + #define K SHA1C01 + + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w7_t); + + #undef K + #define K SHA1C02 + + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wb_t); + + #undef K + #define K SHA1C03 + + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wf_t); + + a += SHA1M_A; + b += SHA1M_B; + c += SHA1M_C; + d += SHA1M_D; + e += SHA1M_E; + + /** + * Prepend salt + */ + + u32x w0t[4]; + + w0t[0] = uint_to_hex_lower8 ((a >> 24) & 255) << 0 + | uint_to_hex_lower8 ((a >> 16) & 255) << 16; + w0t[1] = uint_to_hex_lower8 ((a >> 8) & 255) << 0 + | uint_to_hex_lower8 ((a >> 0) & 255) << 16; + w0t[2] = uint_to_hex_lower8 ((b >> 24) & 255) << 0 + | uint_to_hex_lower8 ((b >> 16) & 255) << 16; + w0t[3] = uint_to_hex_lower8 ((b >> 8) & 255) << 0 + | uint_to_hex_lower8 ((b >> 0) & 255) << 16; + + u32x w1t[4]; + + w1t[0] = uint_to_hex_lower8 ((c >> 24) & 255) << 0 + | uint_to_hex_lower8 ((c >> 16) & 255) << 16; + w1t[1] = uint_to_hex_lower8 ((c >> 8) & 255) << 0 + | uint_to_hex_lower8 ((c >> 0) & 255) << 16; + w1t[2] = uint_to_hex_lower8 ((d >> 24) & 255) << 0 + | uint_to_hex_lower8 ((d >> 16) & 255) << 16; + w1t[3] = uint_to_hex_lower8 ((d >> 8) & 255) << 0 + | uint_to_hex_lower8 ((d >> 0) & 255) << 16; + + u32x w2t[2]; + + w2t[0] = uint_to_hex_lower8 ((e >> 24) & 255) << 0 + | uint_to_hex_lower8 ((e >> 16) & 255) << 16; + w2t[1] = uint_to_hex_lower8 ((e >> 8) & 255) << 0 + | uint_to_hex_lower8 ((e >> 0) & 255) << 16; + + w0_t = salt_buf0[0]; + w1_t = salt_buf0[1]; + w2_t = salt_buf0[2]; + w3_t = salt_buf0[3]; + w4_t = salt_buf1[0]; + w5_t = salt_buf1[1]; + w6_t = salt_buf1[2]; + w7_t = salt_buf1[3]; + w8_t = w0t[0]; + w9_t = w0t[1]; + wa_t = w0t[2]; + wb_t = w0t[3]; + wc_t = w1t[0]; + wd_t = w1t[1]; + we_t = w1t[2]; + wf_t = w1t[3]; + + /** + * 2nd SHA1 + */ + + // 1st transform + + w0_t = swap_workaround (w0_t); + w1_t = swap_workaround (w1_t); + w2_t = swap_workaround (w2_t); + w3_t = swap_workaround (w3_t); + w4_t = swap_workaround (w4_t); + w5_t = swap_workaround (w5_t); + w6_t = swap_workaround (w6_t); + w7_t = swap_workaround (w7_t); + w8_t = swap_workaround (w8_t); + w9_t = swap_workaround (w9_t); + wa_t = swap_workaround (wa_t); + wb_t = swap_workaround (wb_t); + wc_t = swap_workaround (wc_t); + wd_t = swap_workaround (wd_t); + we_t = swap_workaround (we_t); + wf_t = swap_workaround (wf_t); + + a = SHA1M_A; + b = SHA1M_B; + c = SHA1M_C; + d = SHA1M_D; + e = SHA1M_E; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w0_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w1_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w2_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w3_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w4_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w5_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w6_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w7_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w8_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w9_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wa_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, wb_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, wc_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, wd_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, we_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F0o, e, a, b, c, d, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F0o, d, e, a, b, c, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F0o, c, d, e, a, b, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F0o, b, c, d, e, a, w3_t); + + #undef K + #define K SHA1C01 + + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w7_t); + + #undef K + #define K SHA1C02 + + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wb_t); + + #undef K + #define K SHA1C03 + + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wf_t); + + a += SHA1M_A; + b += SHA1M_B; + c += SHA1M_C; + d += SHA1M_D; + e += SHA1M_E; + + u32x r_a = a; + u32x r_b = b; + u32x r_c = c; + u32x r_d = d; + u32x r_e = e; + + // 2nd transform + + w0_t = swap_workaround (w2t[0]); + w1_t = swap_workaround (w2t[1]); + w2_t = 0x80000000; + w3_t = 0; + w4_t = 0; + w5_t = 0; + w6_t = 0; + w7_t = 0; + w8_t = 0; + w9_t = 0; + wa_t = 0; + wb_t = 0; + wc_t = 0; + wd_t = 0; + we_t = 0; + wf_t = total_len; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w0_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w1_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w2_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w3_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w4_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w5_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w6_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w7_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w8_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w9_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wa_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, wb_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, wc_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, wd_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, we_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F0o, e, a, b, c, d, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F0o, d, e, a, b, c, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F0o, c, d, e, a, b, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F0o, b, c, d, e, a, w3_t); + + #undef K + #define K SHA1C01 + + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w7_t); + + #undef K + #define K SHA1C02 + + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wb_t); + + #undef K + #define K SHA1C03 + + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wf_t); + + a += r_a; + b += r_b; + c += r_c; + d += r_d; + e += r_e; + + const u32x r0 = d; + const u32x r1 = e; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_M + } +} + +__device__ static void m07600s (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], const u32 pw_len, const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset) +{ + /** + * modifier + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + const u32 lid = threadIdx.x; + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[ 1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[ 2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[ 3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[ 4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[ 5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[ 6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[ 7]; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + const u32 total_len = (salt_len + 40) * 8; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * reverse + */ + + const u32 e_rev = rotl32 (search[1], 2u); + + /** + * loop + */ + + u32x w0l = w0[0]; + + for (u32 il_pos = 0; il_pos < bfs_cnt; il_pos++) + { + const u32 w0r = c_bfs[il_pos].i; + + w0[0] = w0l | w0r; + + /** + * sha1 + */ + + u32x w0_t = w0[0]; + u32x w1_t = w0[1]; + u32x w2_t = w0[2]; + u32x w3_t = w0[3]; + u32x w4_t = w1[0]; + u32x w5_t = w1[1]; + u32x w6_t = w1[2]; + u32x w7_t = w1[3]; + u32x w8_t = w2[0]; + u32x w9_t = w2[1]; + u32x wa_t = w2[2]; + u32x wb_t = w2[3]; + u32x wc_t = w3[0]; + u32x wd_t = w3[1]; + u32x we_t = 0; + u32x wf_t = pw_len * 8; + + u32x a = SHA1M_A; + u32x b = SHA1M_B; + u32x c = SHA1M_C; + u32x d = SHA1M_D; + u32x e = SHA1M_E; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w0_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w1_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w2_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w3_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w4_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w5_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w6_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w7_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w8_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w9_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wa_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, wb_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, wc_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, wd_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, we_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F0o, e, a, b, c, d, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F0o, d, e, a, b, c, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F0o, c, d, e, a, b, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F0o, b, c, d, e, a, w3_t); + + #undef K + #define K SHA1C01 + + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w7_t); + + #undef K + #define K SHA1C02 + + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wb_t); + + #undef K + #define K SHA1C03 + + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wf_t); + + a += SHA1M_A; + b += SHA1M_B; + c += SHA1M_C; + d += SHA1M_D; + e += SHA1M_E; + + /** + * Prepend salt + */ + + u32x w0t[4]; + + w0t[0] = uint_to_hex_lower8 ((a >> 24) & 255) << 0 + | uint_to_hex_lower8 ((a >> 16) & 255) << 16; + w0t[1] = uint_to_hex_lower8 ((a >> 8) & 255) << 0 + | uint_to_hex_lower8 ((a >> 0) & 255) << 16; + w0t[2] = uint_to_hex_lower8 ((b >> 24) & 255) << 0 + | uint_to_hex_lower8 ((b >> 16) & 255) << 16; + w0t[3] = uint_to_hex_lower8 ((b >> 8) & 255) << 0 + | uint_to_hex_lower8 ((b >> 0) & 255) << 16; + + u32x w1t[4]; + + w1t[0] = uint_to_hex_lower8 ((c >> 24) & 255) << 0 + | uint_to_hex_lower8 ((c >> 16) & 255) << 16; + w1t[1] = uint_to_hex_lower8 ((c >> 8) & 255) << 0 + | uint_to_hex_lower8 ((c >> 0) & 255) << 16; + w1t[2] = uint_to_hex_lower8 ((d >> 24) & 255) << 0 + | uint_to_hex_lower8 ((d >> 16) & 255) << 16; + w1t[3] = uint_to_hex_lower8 ((d >> 8) & 255) << 0 + | uint_to_hex_lower8 ((d >> 0) & 255) << 16; + + u32x w2t[2]; + + w2t[0] = uint_to_hex_lower8 ((e >> 24) & 255) << 0 + | uint_to_hex_lower8 ((e >> 16) & 255) << 16; + w2t[1] = uint_to_hex_lower8 ((e >> 8) & 255) << 0 + | uint_to_hex_lower8 ((e >> 0) & 255) << 16; + + w0_t = salt_buf0[0]; + w1_t = salt_buf0[1]; + w2_t = salt_buf0[2]; + w3_t = salt_buf0[3]; + w4_t = salt_buf1[0]; + w5_t = salt_buf1[1]; + w6_t = salt_buf1[2]; + w7_t = salt_buf1[3]; + w8_t = w0t[0]; + w9_t = w0t[1]; + wa_t = w0t[2]; + wb_t = w0t[3]; + wc_t = w1t[0]; + wd_t = w1t[1]; + we_t = w1t[2]; + wf_t = w1t[3]; + + /** + * 2nd SHA1 + */ + + // 1st transform + + w0_t = swap_workaround (w0_t); + w1_t = swap_workaround (w1_t); + w2_t = swap_workaround (w2_t); + w3_t = swap_workaround (w3_t); + w4_t = swap_workaround (w4_t); + w5_t = swap_workaround (w5_t); + w6_t = swap_workaround (w6_t); + w7_t = swap_workaround (w7_t); + w8_t = swap_workaround (w8_t); + w9_t = swap_workaround (w9_t); + wa_t = swap_workaround (wa_t); + wb_t = swap_workaround (wb_t); + wc_t = swap_workaround (wc_t); + wd_t = swap_workaround (wd_t); + we_t = swap_workaround (we_t); + wf_t = swap_workaround (wf_t); + + a = SHA1M_A; + b = SHA1M_B; + c = SHA1M_C; + d = SHA1M_D; + e = SHA1M_E; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w0_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w1_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w2_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w3_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w4_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w5_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w6_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w7_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w8_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w9_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wa_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, wb_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, wc_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, wd_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, we_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F0o, e, a, b, c, d, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F0o, d, e, a, b, c, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F0o, c, d, e, a, b, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F0o, b, c, d, e, a, w3_t); + + #undef K + #define K SHA1C01 + + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w7_t); + + #undef K + #define K SHA1C02 + + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wb_t); + + #undef K + #define K SHA1C03 + + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wf_t); + + a += SHA1M_A; + b += SHA1M_B; + c += SHA1M_C; + d += SHA1M_D; + e += SHA1M_E; + + u32x r_a = a; + u32x r_b = b; + u32x r_c = c; + u32x r_d = d; + u32x r_e = e; + + // 2nd transform + + w0_t = swap_workaround (w2t[0]); + w1_t = swap_workaround (w2t[1]); + w2_t = 0x80000000; + w3_t = 0; + w4_t = 0; + w5_t = 0; + w6_t = 0; + w7_t = 0; + w8_t = 0; + w9_t = 0; + wa_t = 0; + wb_t = 0; + wc_t = 0; + wd_t = 0; + we_t = 0; + wf_t = total_len; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w0_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w1_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w2_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w3_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w4_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w5_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w6_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w7_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w8_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w9_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wa_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, wb_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, wc_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, wd_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, we_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F0o, e, a, b, c, d, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F0o, d, e, a, b, c, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F0o, c, d, e, a, b, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F0o, b, c, d, e, a, w3_t); + + #undef K + #define K SHA1C01 + + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w7_t); + + #undef K + #define K SHA1C02 + + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wb_t); + + #undef K + #define K SHA1C03 + + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wf_t); + + a += r_a; + b += r_b; + c += r_c; + d += r_d; + e += r_e; + + const u32x r0 = d; + const u32x r1 = e; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_S + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m07600_m04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = pws[gid].i[15]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * bin2asc table + */ + + l_bin2asc[lid] = c_bin2asc[(lid >> 0) & 15] << 8 + | c_bin2asc[(lid >> 4) & 15] << 0; + + __syncthreads (); + + if (gid >= gid_max) return; + + /** + * main + */ + + m07600m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m07600_m08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = pws[gid].i[15]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * bin2asc table + */ + + l_bin2asc[lid] = c_bin2asc[(lid >> 0) & 15] << 8 + | c_bin2asc[(lid >> 4) & 15] << 0; + + __syncthreads (); + + if (gid >= gid_max) return; + + /** + * main + */ + + m07600m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m07600_m16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = pws[gid].i[ 8]; + w2[1] = pws[gid].i[ 9]; + w2[2] = pws[gid].i[10]; + w2[3] = pws[gid].i[11]; + + u32x w3[4]; + + w3[0] = pws[gid].i[12]; + w3[1] = pws[gid].i[13]; + w3[2] = pws[gid].i[14]; + w3[3] = pws[gid].i[15]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * bin2asc table + */ + + l_bin2asc[lid] = c_bin2asc[(lid >> 0) & 15] << 8 + | c_bin2asc[(lid >> 4) & 15] << 0; + + __syncthreads (); + + if (gid >= gid_max) return; + + /** + * main + */ + + m07600m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m07600_s04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = pws[gid].i[15]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * bin2asc table + */ + + l_bin2asc[lid] = c_bin2asc[(lid >> 0) & 15] << 8 + | c_bin2asc[(lid >> 4) & 15] << 0; + + __syncthreads (); + + if (gid >= gid_max) return; + + /** + * main + */ + + m07600s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m07600_s08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = pws[gid].i[15]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * bin2asc table + */ + + l_bin2asc[lid] = c_bin2asc[(lid >> 0) & 15] << 8 + | c_bin2asc[(lid >> 4) & 15] << 0; + + __syncthreads (); + + if (gid >= gid_max) return; + + /** + * main + */ + + m07600s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m07600_s16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = pws[gid].i[ 8]; + w2[1] = pws[gid].i[ 9]; + w2[2] = pws[gid].i[10]; + w2[3] = pws[gid].i[11]; + + u32x w3[4]; + + w3[0] = pws[gid].i[12]; + w3[1] = pws[gid].i[13]; + w3[2] = pws[gid].i[14]; + w3[3] = pws[gid].i[15]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * bin2asc table + */ + + l_bin2asc[lid] = c_bin2asc[(lid >> 0) & 15] << 8 + | c_bin2asc[(lid >> 4) & 15] << 0; + + __syncthreads (); + + if (gid >= gid_max) return; + + /** + * main + */ + + m07600s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} diff --git a/nv/m07700_a0.cu b/nv/m07700_a0.cu new file mode 100644 index 0000000000..4ce2f9ab93 --- /dev/null +++ b/nv/m07700_a0.cu @@ -0,0 +1,901 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _SAPB_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW2 +#define VECT_SIZE1 +#endif + +#define DGST_R0 0 +#define DGST_R1 1 +#define DGST_R2 2 +#define DGST_R3 3 + +#include "include/kernel_functions.c" +#include "types_nv.c" +#include "common_nv.c" +#include "include/rp_gpu.h" +#include "rp_nv.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#define GETCHAR(a,p) (((a)[(p) / 4] >> (((p) & 3) * 8)) & 0xff) +#define PUTCHAR(a,p,c) ((a)[(p) / 4] = (((a)[(p) / 4] & ~(0xff << (((p) & 3) * 8))) | ((c) << (((p) & 3) * 8)))) + +__device__ __constant__ u32 sapb_trans_tbl[256] = +{ + // first value hack for 0 byte as part of an optimization + 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x3f, 0x40, 0x41, 0x50, 0x43, 0x44, 0x45, 0x4b, 0x47, 0x48, 0x4d, 0x4e, 0x54, 0x51, 0x53, 0x46, + 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x56, 0x55, 0x5c, 0x49, 0x5d, 0x4a, + 0x42, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, + 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x58, 0x5b, 0x59, 0xff, 0x52, + 0x4c, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, + 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x57, 0x5e, 0x5a, 0x4f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff +}; + +__device__ __constant__ u32 bcodeArray[48] = +{ + 0x14, 0x77, 0xf3, 0xd4, 0xbb, 0x71, 0x23, 0xd0, 0x03, 0xff, 0x47, 0x93, 0x55, 0xaa, 0x66, 0x91, + 0xf2, 0x88, 0x6b, 0x99, 0xbf, 0xcb, 0x32, 0x1a, 0x19, 0xd9, 0xa7, 0x82, 0x22, 0x49, 0xa2, 0x51, + 0xe2, 0xb7, 0x33, 0x71, 0x8b, 0x9f, 0x5d, 0x01, 0x44, 0x70, 0xae, 0x11, 0xef, 0x28, 0xf0, 0x0d +}; + +__device__ static u32x sapb_trans (const u32x in) +{ + u32x out = 0; + + #ifdef VECT_SIZE1 + out |= (sapb_trans_tbl[(in >> 0) & 0xff]) << 0; + out |= (sapb_trans_tbl[(in >> 8) & 0xff]) << 8; + out |= (sapb_trans_tbl[(in >> 16) & 0xff]) << 16; + out |= (sapb_trans_tbl[(in >> 24) & 0xff]) << 24; + #endif + + return out; +} + +__device__ static u32x walld0rf_magic (const u32x w0[4], const u32 pw_len, const u32x salt_buf0[4], const u32 salt_len, const u32x a, const u32x b, const u32x c, const u32x d, u32x t[16]) +{ + t[ 0] = 0; + t[ 1] = 0; + t[ 2] = 0; + t[ 3] = 0; + t[ 4] = 0; + t[ 5] = 0; + t[ 6] = 0; + t[ 7] = 0; + t[ 8] = 0; + t[ 9] = 0; + t[10] = 0; + t[11] = 0; + t[12] = 0; + t[13] = 0; + t[14] = 0; + t[15] = 0; + + u32 sum20 = ((a >> 24) & 3) + + ((a >> 16) & 3) + + ((a >> 8) & 3) + + ((a >> 0) & 3) + + ((b >> 8) & 3); + + sum20 |= 0x20; + + const u32 w[2] = { w0[0], w0[1] }; + + const u32 s[3] = { salt_buf0[0], salt_buf0[1], salt_buf0[2] }; + + u32 saved_key[4] = { a, b, c, d }; + + u32 i1 = 0; + u32 i2 = 0; + u32 i3 = 0; + + // we can assume this because the password must be at least 3 + // and the username must be at least 1 so we can save the if () + + u32 t0 = 0; + + if ((d >> 24) & 1) + { + t0 |= bcodeArray[47] << 0; + t0 |= (w[0] & 0xff) << 8; + t0 |= (s[0] & 0xff) << 16; + t0 |= bcodeArray[ 1] << 24; + + i1 = 1; + i2 = 5; + i3 = 1; + } + else + { + t0 |= (w[0] & 0xff) << 0; + t0 |= (s[0] & 0xff) << 8; + t0 |= bcodeArray[ 0] << 16; + + i1 = 1; + i2 = 4; + i3 = 1; + } + + t[0] = t0; + + // because the following code can increase i2 by a maximum of 5, + // there is an overflow potential of 4 before it comes to the next test for i2 >= sum20 + // we need to truncate in that case + + while ((i1 < pw_len) && (i3 < salt_len)) + { + if (GETCHAR (saved_key, 15 - i1) & 1) + { + PUTCHAR (t, i2, bcodeArray[48 - 1 - i1]); + + i2++; + } + + PUTCHAR (t, i2, GETCHAR (w, i1)); + + i1++; + i2++; + + PUTCHAR (t, i2, GETCHAR (s, i3)); + + i2++; + i3++; + + PUTCHAR (t, i2, bcodeArray[i2 - i1 - i3]); + + i2++; + i2++; + + if (i2 >= sum20) + { + PUTCHAR (t, sum20 + 0, 0x80); + PUTCHAR (t, sum20 + 1, 0); + PUTCHAR (t, sum20 + 2, 0); + PUTCHAR (t, sum20 + 3, 0); + + return sum20; + } + } + + while ((i1 < pw_len) || (i3 < salt_len)) + { + if (i1 < pw_len) // max 8 + { + if (GETCHAR (saved_key, 15 - i1) & 1) + { + PUTCHAR (t, i2, bcodeArray[48 - 1 - i1]); + + i2++; + } + + PUTCHAR (t, i2, GETCHAR (w, i1)); + + i1++; + i2++; + } + else if (i3 < salt_len) // max 12 + { + PUTCHAR (t, i2, GETCHAR (s, i3)); + + i2++; + i3++; + } + + PUTCHAR (t, i2, bcodeArray[i2 - i1 - i3]); + + i2++; + i2++; + + if (i2 >= sum20) + { + PUTCHAR (t, sum20 + 0, 0x80); + PUTCHAR (t, sum20 + 1, 0); + PUTCHAR (t, sum20 + 2, 0); + PUTCHAR (t, sum20 + 3, 0); + + return sum20; + } + } + + while (i2 < sum20) + { + PUTCHAR (t, i2, bcodeArray[i2 - i1 - i3]); + + i2++; + i2++; + } + + PUTCHAR (t, sum20 + 0, 0x80); + PUTCHAR (t, sum20 + 1, 0); + PUTCHAR (t, sum20 + 2, 0); + PUTCHAR (t, sum20 + 3, 0); + + return sum20; +} + +__device__ __constant__ gpu_rule_t c_rules[1024]; + +extern "C" __global__ void __launch_bounds__ (256, 1) m07700_m04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = 0; + pw_buf0[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[2]; + salt_buf0[3] = 0; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + salt_buf0[0] = sapb_trans (salt_buf0[0]); + salt_buf0[1] = sapb_trans (salt_buf0[1]); + salt_buf0[2] = sapb_trans (salt_buf0[2]); + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + + w0[0] = pw_buf0[0]; + w0[1] = pw_buf0[1]; + w0[2] = 0; + w0[3] = 0; + + u32x w1[4]; + + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 out_len = apply_rules (c_rules[il_pos].cmds, w0, w1, pw_len); + + if (out_len > 8) continue; // otherwise it overflows in waldorf function + + w0[0] = sapb_trans (w0[0]); + w0[1] = sapb_trans (w0[1]); + + /** + * append salt + */ + + u32 s0[4]; + + s0[0] = salt_buf0[0]; + s0[1] = salt_buf0[1]; + s0[2] = salt_buf0[2]; + s0[3] = 0; + + u32 s1[4]; + + s1[0] = 0; + s1[1] = 0; + s1[2] = 0; + s1[3] = 0; + + u32 s2[4]; + + s2[0] = 0; + s2[1] = 0; + s2[2] = 0; + s2[3] = 0; + + u32 s3[4]; + + s3[0] = 0; + s3[1] = 0; + s3[2] = 0; + s3[3] = 0; + + switch_buffer_by_offset (s0, s1, s2, s3, out_len); + + const u32 pw_salt_len = out_len + salt_len; + + u32x t[16]; + + t[ 0] = s0[0] | w0[0]; + t[ 1] = s0[1] | w0[1]; + t[ 2] = s0[2]; + t[ 3] = s0[3]; + t[ 4] = s1[0]; + t[ 5] = 0; + t[ 6] = 0; + t[ 7] = 0; + t[ 8] = 0; + t[ 9] = 0; + t[10] = 0; + t[11] = 0; + t[12] = 0; + t[13] = 0; + t[14] = pw_salt_len * 8; + t[15] = 0; + + append_0x80_4 (&t[0], &t[4], &t[8], &t[12], pw_salt_len); + + /** + * md5 + */ + + u32x a = MD5M_A; + u32x b = MD5M_B; + u32x c = MD5M_C; + u32x d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, t[ 0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, t[ 1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, t[ 2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, t[ 3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, t[ 4], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, t[ 5], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, t[ 6], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, t[ 7], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, t[ 8], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, t[ 9], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, t[10], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, t[11], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, t[12], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, t[13], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, t[14], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, t[15], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, t[ 1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, t[ 6], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, t[11], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, t[ 0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, t[ 5], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, t[10], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, t[15], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, t[ 4], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, t[ 9], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, t[14], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, t[ 3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, t[ 8], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, t[13], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, t[ 2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, t[ 7], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, t[12], MD5C1f, MD5S13); + + MD5_STEP (MD5_H , a, b, c, d, t[ 5], MD5C20, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, t[ 8], MD5C21, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, t[11], MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, t[14], MD5C23, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, t[ 1], MD5C24, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, t[ 4], MD5C25, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, t[ 7], MD5C26, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, t[10], MD5C27, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, t[13], MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, t[ 0], MD5C29, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, t[ 3], MD5C2a, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, t[ 6], MD5C2b, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, t[ 9], MD5C2c, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, t[12], MD5C2d, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, t[15], MD5C2e, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, t[ 2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, t[ 0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, t[ 7], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, t[14], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, t[ 5], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, t[12], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, t[ 3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, t[10], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, t[ 1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, t[ 8], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, t[15], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, t[ 6], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, t[13], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, t[ 4], MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, t[11], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, t[ 2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, t[ 9], MD5C3f, MD5S33); + + a += MD5M_A; + b += MD5M_B; + c += MD5M_C; + d += MD5M_D; + + const u32x sum20 = walld0rf_magic (w0, out_len, salt_buf0, salt_len, a, b, c, d, t); + + t[14] = sum20 * 8; + + a = MD5M_A; + b = MD5M_B; + c = MD5M_C; + d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, t[ 0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, t[ 1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, t[ 2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, t[ 3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, t[ 4], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, t[ 5], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, t[ 6], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, t[ 7], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, t[ 8], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, t[ 9], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, t[10], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, t[11], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, t[12], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, t[13], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, t[14], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, t[15], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, t[ 1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, t[ 6], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, t[11], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, t[ 0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, t[ 5], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, t[10], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, t[15], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, t[ 4], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, t[ 9], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, t[14], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, t[ 3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, t[ 8], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, t[13], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, t[ 2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, t[ 7], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, t[12], MD5C1f, MD5S13); + + MD5_STEP (MD5_H , a, b, c, d, t[ 5], MD5C20, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, t[ 8], MD5C21, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, t[11], MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, t[14], MD5C23, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, t[ 1], MD5C24, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, t[ 4], MD5C25, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, t[ 7], MD5C26, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, t[10], MD5C27, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, t[13], MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, t[ 0], MD5C29, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, t[ 3], MD5C2a, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, t[ 6], MD5C2b, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, t[ 9], MD5C2c, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, t[12], MD5C2d, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, t[15], MD5C2e, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, t[ 2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, t[ 0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, t[ 7], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, t[14], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, t[ 5], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, t[12], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, t[ 3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, t[10], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, t[ 1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, t[ 8], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, t[15], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, t[ 6], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, t[13], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, t[ 4], MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, t[11], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, t[ 2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, t[ 9], MD5C3f, MD5S33); + + a += MD5M_A; + b += MD5M_B; + c += MD5M_C; + d += MD5M_D; + + a ^= c; + b ^= d; + + const u32x r0 = a; + const u32x r1 = b; + const u32x r2 = 0; + const u32x r3 = 0; + + #include VECT_COMPARE_M + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m07700_m08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m07700_m16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m07700_s04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = 0; + pw_buf0[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[2]; + salt_buf0[3] = 0; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + salt_buf0[0] = sapb_trans (salt_buf0[0]); + salt_buf0[1] = sapb_trans (salt_buf0[1]); + salt_buf0[2] = sapb_trans (salt_buf0[2]); + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + + w0[0] = pw_buf0[0]; + w0[1] = pw_buf0[1]; + w0[2] = 0; + w0[3] = 0; + + u32x w1[4]; + + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 out_len = apply_rules (c_rules[il_pos].cmds, w0, w1, pw_len); + + if (out_len > 8) continue; // otherwise it overflows in waldorf function + + w0[0] = sapb_trans (w0[0]); + w0[1] = sapb_trans (w0[1]); + + /** + * append salt + */ + + u32 s0[4]; + + s0[0] = salt_buf0[0]; + s0[1] = salt_buf0[1]; + s0[2] = salt_buf0[2]; + s0[3] = 0; + + u32 s1[4]; + + s1[0] = 0; + s1[1] = 0; + s1[2] = 0; + s1[3] = 0; + + u32 s2[4]; + + s2[0] = 0; + s2[1] = 0; + s2[2] = 0; + s2[3] = 0; + + u32 s3[4]; + + s3[0] = 0; + s3[1] = 0; + s3[2] = 0; + s3[3] = 0; + + switch_buffer_by_offset (s0, s1, s2, s3, out_len); + + const u32 pw_salt_len = out_len + salt_len; + + u32x t[16]; + + t[ 0] = s0[0] | w0[0]; + t[ 1] = s0[1] | w0[1]; + t[ 2] = s0[2]; + t[ 3] = s0[3]; + t[ 4] = s1[0]; + t[ 5] = 0; + t[ 6] = 0; + t[ 7] = 0; + t[ 8] = 0; + t[ 9] = 0; + t[10] = 0; + t[11] = 0; + t[12] = 0; + t[13] = 0; + t[14] = pw_salt_len * 8; + t[15] = 0; + + append_0x80_4 (&t[0], &t[4], &t[8], &t[12], pw_salt_len); + + /** + * md5 + */ + + u32x a = MD5M_A; + u32x b = MD5M_B; + u32x c = MD5M_C; + u32x d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, t[ 0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, t[ 1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, t[ 2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, t[ 3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, t[ 4], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, t[ 5], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, t[ 6], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, t[ 7], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, t[ 8], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, t[ 9], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, t[10], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, t[11], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, t[12], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, t[13], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, t[14], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, t[15], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, t[ 1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, t[ 6], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, t[11], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, t[ 0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, t[ 5], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, t[10], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, t[15], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, t[ 4], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, t[ 9], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, t[14], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, t[ 3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, t[ 8], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, t[13], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, t[ 2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, t[ 7], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, t[12], MD5C1f, MD5S13); + + MD5_STEP (MD5_H , a, b, c, d, t[ 5], MD5C20, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, t[ 8], MD5C21, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, t[11], MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, t[14], MD5C23, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, t[ 1], MD5C24, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, t[ 4], MD5C25, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, t[ 7], MD5C26, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, t[10], MD5C27, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, t[13], MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, t[ 0], MD5C29, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, t[ 3], MD5C2a, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, t[ 6], MD5C2b, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, t[ 9], MD5C2c, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, t[12], MD5C2d, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, t[15], MD5C2e, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, t[ 2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, t[ 0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, t[ 7], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, t[14], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, t[ 5], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, t[12], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, t[ 3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, t[10], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, t[ 1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, t[ 8], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, t[15], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, t[ 6], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, t[13], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, t[ 4], MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, t[11], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, t[ 2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, t[ 9], MD5C3f, MD5S33); + + a += MD5M_A; + b += MD5M_B; + c += MD5M_C; + d += MD5M_D; + + const u32x sum20 = walld0rf_magic (w0, out_len, salt_buf0, salt_len, a, b, c, d, t); + + t[14] = sum20 * 8; + + a = MD5M_A; + b = MD5M_B; + c = MD5M_C; + d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, t[ 0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, t[ 1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, t[ 2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, t[ 3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, t[ 4], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, t[ 5], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, t[ 6], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, t[ 7], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, t[ 8], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, t[ 9], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, t[10], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, t[11], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, t[12], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, t[13], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, t[14], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, t[15], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, t[ 1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, t[ 6], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, t[11], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, t[ 0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, t[ 5], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, t[10], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, t[15], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, t[ 4], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, t[ 9], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, t[14], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, t[ 3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, t[ 8], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, t[13], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, t[ 2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, t[ 7], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, t[12], MD5C1f, MD5S13); + + MD5_STEP (MD5_H , a, b, c, d, t[ 5], MD5C20, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, t[ 8], MD5C21, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, t[11], MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, t[14], MD5C23, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, t[ 1], MD5C24, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, t[ 4], MD5C25, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, t[ 7], MD5C26, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, t[10], MD5C27, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, t[13], MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, t[ 0], MD5C29, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, t[ 3], MD5C2a, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, t[ 6], MD5C2b, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, t[ 9], MD5C2c, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, t[12], MD5C2d, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, t[15], MD5C2e, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, t[ 2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, t[ 0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, t[ 7], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, t[14], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, t[ 5], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, t[12], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, t[ 3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, t[10], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, t[ 1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, t[ 8], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, t[15], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, t[ 6], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, t[13], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, t[ 4], MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, t[11], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, t[ 2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, t[ 9], MD5C3f, MD5S33); + + a += MD5M_A; + b += MD5M_B; + c += MD5M_C; + d += MD5M_D; + + a ^= c; + b ^= d; + + const u32x r0 = a; + const u32x r1 = b; + const u32x r2 = 0; + const u32x r3 = 0; + + #include VECT_COMPARE_S + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m07700_s08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m07700_s16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/nv/m07700_a1.cu b/nv/m07700_a1.cu new file mode 100644 index 0000000000..b0014e18e7 --- /dev/null +++ b/nv/m07700_a1.cu @@ -0,0 +1,973 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _SAPB_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW2 +#define VECT_SIZE1 +#endif + +#define DGST_R0 0 +#define DGST_R1 1 +#define DGST_R2 2 +#define DGST_R3 3 + +#include "include/kernel_functions.c" +#include "types_nv.c" +#include "common_nv.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#define GETCHAR(a,p) (((a)[(p) / 4] >> (((p) & 3) * 8)) & 0xff) +#define PUTCHAR(a,p,c) ((a)[(p) / 4] = (((a)[(p) / 4] & ~(0xff << (((p) & 3) * 8))) | ((c) << (((p) & 3) * 8)))) + +__device__ __constant__ u32 sapb_trans_tbl[256] = +{ + // first value hack for 0 byte as part of an optimization + 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x3f, 0x40, 0x41, 0x50, 0x43, 0x44, 0x45, 0x4b, 0x47, 0x48, 0x4d, 0x4e, 0x54, 0x51, 0x53, 0x46, + 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x56, 0x55, 0x5c, 0x49, 0x5d, 0x4a, + 0x42, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, + 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x58, 0x5b, 0x59, 0xff, 0x52, + 0x4c, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, + 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x57, 0x5e, 0x5a, 0x4f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff +}; + +__device__ __constant__ u32 bcodeArray[48] = +{ + 0x14, 0x77, 0xf3, 0xd4, 0xbb, 0x71, 0x23, 0xd0, 0x03, 0xff, 0x47, 0x93, 0x55, 0xaa, 0x66, 0x91, + 0xf2, 0x88, 0x6b, 0x99, 0xbf, 0xcb, 0x32, 0x1a, 0x19, 0xd9, 0xa7, 0x82, 0x22, 0x49, 0xa2, 0x51, + 0xe2, 0xb7, 0x33, 0x71, 0x8b, 0x9f, 0x5d, 0x01, 0x44, 0x70, 0xae, 0x11, 0xef, 0x28, 0xf0, 0x0d +}; + +__device__ static u32x sapb_trans (const u32x in) +{ + u32x out = 0; + + #ifdef VECT_SIZE1 + out |= (sapb_trans_tbl[(in >> 0) & 0xff]) << 0; + out |= (sapb_trans_tbl[(in >> 8) & 0xff]) << 8; + out |= (sapb_trans_tbl[(in >> 16) & 0xff]) << 16; + out |= (sapb_trans_tbl[(in >> 24) & 0xff]) << 24; + #endif + + return out; +} + +__device__ static u32x walld0rf_magic (const u32x w0[4], const u32 pw_len, const u32x salt_buf0[4], const u32 salt_len, const u32x a, const u32x b, const u32x c, const u32x d, u32x t[16]) +{ + t[ 0] = 0; + t[ 1] = 0; + t[ 2] = 0; + t[ 3] = 0; + t[ 4] = 0; + t[ 5] = 0; + t[ 6] = 0; + t[ 7] = 0; + t[ 8] = 0; + t[ 9] = 0; + t[10] = 0; + t[11] = 0; + t[12] = 0; + t[13] = 0; + t[14] = 0; + t[15] = 0; + + u32 sum20 = ((a >> 24) & 3) + + ((a >> 16) & 3) + + ((a >> 8) & 3) + + ((a >> 0) & 3) + + ((b >> 8) & 3); + + sum20 |= 0x20; + + const u32 w[2] = { w0[0], w0[1] }; + + const u32 s[3] = { salt_buf0[0], salt_buf0[1], salt_buf0[2] }; + + u32 saved_key[4] = { a, b, c, d }; + + u32 i1 = 0; + u32 i2 = 0; + u32 i3 = 0; + + // we can assume this because the password must be at least 3 + // and the username must be at least 1 so we can save the if () + + u32 t0 = 0; + + if ((d >> 24) & 1) + { + t0 |= bcodeArray[47] << 0; + t0 |= (w[0] & 0xff) << 8; + t0 |= (s[0] & 0xff) << 16; + t0 |= bcodeArray[ 1] << 24; + + i1 = 1; + i2 = 5; + i3 = 1; + } + else + { + t0 |= (w[0] & 0xff) << 0; + t0 |= (s[0] & 0xff) << 8; + t0 |= bcodeArray[ 0] << 16; + + i1 = 1; + i2 = 4; + i3 = 1; + } + + t[0] = t0; + + // because the following code can increase i2 by a maximum of 5, + // there is an overflow potential of 4 before it comes to the next test for i2 >= sum20 + // we need to truncate in that case + + while ((i1 < pw_len) && (i3 < salt_len)) + { + if (GETCHAR (saved_key, 15 - i1) & 1) + { + PUTCHAR (t, i2, bcodeArray[48 - 1 - i1]); + + i2++; + } + + PUTCHAR (t, i2, GETCHAR (w, i1)); + + i1++; + i2++; + + PUTCHAR (t, i2, GETCHAR (s, i3)); + + i2++; + i3++; + + PUTCHAR (t, i2, bcodeArray[i2 - i1 - i3]); + + i2++; + i2++; + + if (i2 >= sum20) + { + PUTCHAR (t, sum20 + 0, 0x80); + PUTCHAR (t, sum20 + 1, 0); + PUTCHAR (t, sum20 + 2, 0); + PUTCHAR (t, sum20 + 3, 0); + + return sum20; + } + } + + while ((i1 < pw_len) || (i3 < salt_len)) + { + if (i1 < pw_len) // max 8 + { + if (GETCHAR (saved_key, 15 - i1) & 1) + { + PUTCHAR (t, i2, bcodeArray[48 - 1 - i1]); + + i2++; + } + + PUTCHAR (t, i2, GETCHAR (w, i1)); + + i1++; + i2++; + } + else if (i3 < salt_len) // max 12 + { + PUTCHAR (t, i2, GETCHAR (s, i3)); + + i2++; + i3++; + } + + PUTCHAR (t, i2, bcodeArray[i2 - i1 - i3]); + + i2++; + i2++; + + if (i2 >= sum20) + { + PUTCHAR (t, sum20 + 0, 0x80); + PUTCHAR (t, sum20 + 1, 0); + PUTCHAR (t, sum20 + 2, 0); + PUTCHAR (t, sum20 + 3, 0); + + return sum20; + } + } + + while (i2 < sum20) + { + PUTCHAR (t, i2, bcodeArray[i2 - i1 - i3]); + + i2++; + i2++; + } + + PUTCHAR (t, sum20 + 0, 0x80); + PUTCHAR (t, sum20 + 1, 0); + PUTCHAR (t, sum20 + 2, 0); + PUTCHAR (t, sum20 + 3, 0); + + return sum20; +} + +__device__ __constant__ comb_t c_combs[1024]; + +extern "C" __global__ void __launch_bounds__ (256, 1) m07700_m04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = 0; + wordl0[3] = 0; + + u32x wordl1[4]; + + wordl1[0] = 0; + wordl1[1] = 0; + wordl1[2] = 0; + wordl1[3] = 0; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, c_combs[0].pw_len); + } + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[2]; + salt_buf0[3] = 0; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + salt_buf0[0] = sapb_trans (salt_buf0[0]); + salt_buf0[1] = sapb_trans (salt_buf0[1]); + salt_buf0[2] = sapb_trans (salt_buf0[2]); + + /** + * digest + */ + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = c_combs[il_pos].pw_len; + + const u32 pw_len = pw_l_len + pw_r_len; + + u32 wordr0[4]; + + wordr0[0] = c_combs[il_pos].i[0]; + wordr0[1] = c_combs[il_pos].i[1]; + wordr0[2] = 0; + wordr0[3] = 0; + + u32 wordr1[4]; + + wordr1[0] = 0; + wordr1[1] = 0; + wordr1[2] = 0; + wordr1[3] = 0; + + u32 wordr2[4]; + + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + + u32 wordr3[4]; + + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + u32x w0[4]; + + w0[0] = sapb_trans (wordl0[0] | wordr0[0]); + w0[1] = sapb_trans (wordl0[1] | wordr0[1]); + w0[2] = 0; + w0[3] = 0; + + /** + * append salt + */ + + u32 s0[4]; + + s0[0] = salt_buf0[0]; + s0[1] = salt_buf0[1]; + s0[2] = salt_buf0[2]; + s0[3] = 0; + + u32 s1[4]; + + s1[0] = 0; + s1[1] = 0; + s1[2] = 0; + s1[3] = 0; + + u32 s2[4]; + + s2[0] = 0; + s2[1] = 0; + s2[2] = 0; + s2[3] = 0; + + u32 s3[4]; + + s3[0] = 0; + s3[1] = 0; + s3[2] = 0; + s3[3] = 0; + + switch_buffer_by_offset (s0, s1, s2, s3, pw_len); + + const u32 pw_salt_len = pw_len + salt_len; + + u32x t[16]; + + t[ 0] = s0[0] | w0[0]; + t[ 1] = s0[1] | w0[1]; + t[ 2] = s0[2]; + t[ 3] = s0[3]; + t[ 4] = s1[0]; + t[ 5] = 0; + t[ 6] = 0; + t[ 7] = 0; + t[ 8] = 0; + t[ 9] = 0; + t[10] = 0; + t[11] = 0; + t[12] = 0; + t[13] = 0; + t[14] = pw_salt_len * 8; + t[15] = 0; + + append_0x80_4 (&t[0], &t[4], &t[8], &t[12], pw_salt_len); + + /** + * md5 + */ + + u32x a = MD5M_A; + u32x b = MD5M_B; + u32x c = MD5M_C; + u32x d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, t[ 0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, t[ 1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, t[ 2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, t[ 3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, t[ 4], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, t[ 5], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, t[ 6], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, t[ 7], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, t[ 8], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, t[ 9], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, t[10], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, t[11], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, t[12], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, t[13], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, t[14], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, t[15], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, t[ 1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, t[ 6], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, t[11], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, t[ 0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, t[ 5], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, t[10], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, t[15], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, t[ 4], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, t[ 9], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, t[14], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, t[ 3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, t[ 8], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, t[13], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, t[ 2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, t[ 7], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, t[12], MD5C1f, MD5S13); + + MD5_STEP (MD5_H , a, b, c, d, t[ 5], MD5C20, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, t[ 8], MD5C21, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, t[11], MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, t[14], MD5C23, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, t[ 1], MD5C24, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, t[ 4], MD5C25, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, t[ 7], MD5C26, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, t[10], MD5C27, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, t[13], MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, t[ 0], MD5C29, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, t[ 3], MD5C2a, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, t[ 6], MD5C2b, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, t[ 9], MD5C2c, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, t[12], MD5C2d, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, t[15], MD5C2e, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, t[ 2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, t[ 0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, t[ 7], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, t[14], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, t[ 5], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, t[12], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, t[ 3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, t[10], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, t[ 1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, t[ 8], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, t[15], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, t[ 6], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, t[13], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, t[ 4], MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, t[11], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, t[ 2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, t[ 9], MD5C3f, MD5S33); + + a += MD5M_A; + b += MD5M_B; + c += MD5M_C; + d += MD5M_D; + + const u32x sum20 = walld0rf_magic (w0, pw_len, salt_buf0, salt_len, a, b, c, d, t); + + t[14] = sum20 * 8; + + a = MD5M_A; + b = MD5M_B; + c = MD5M_C; + d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, t[ 0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, t[ 1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, t[ 2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, t[ 3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, t[ 4], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, t[ 5], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, t[ 6], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, t[ 7], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, t[ 8], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, t[ 9], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, t[10], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, t[11], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, t[12], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, t[13], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, t[14], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, t[15], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, t[ 1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, t[ 6], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, t[11], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, t[ 0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, t[ 5], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, t[10], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, t[15], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, t[ 4], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, t[ 9], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, t[14], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, t[ 3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, t[ 8], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, t[13], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, t[ 2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, t[ 7], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, t[12], MD5C1f, MD5S13); + + MD5_STEP (MD5_H , a, b, c, d, t[ 5], MD5C20, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, t[ 8], MD5C21, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, t[11], MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, t[14], MD5C23, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, t[ 1], MD5C24, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, t[ 4], MD5C25, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, t[ 7], MD5C26, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, t[10], MD5C27, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, t[13], MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, t[ 0], MD5C29, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, t[ 3], MD5C2a, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, t[ 6], MD5C2b, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, t[ 9], MD5C2c, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, t[12], MD5C2d, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, t[15], MD5C2e, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, t[ 2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, t[ 0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, t[ 7], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, t[14], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, t[ 5], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, t[12], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, t[ 3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, t[10], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, t[ 1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, t[ 8], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, t[15], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, t[ 6], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, t[13], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, t[ 4], MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, t[11], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, t[ 2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, t[ 9], MD5C3f, MD5S33); + + a += MD5M_A; + b += MD5M_B; + c += MD5M_C; + d += MD5M_D; + + a ^= c; + b ^= d; + + const u32x r0 = a; + const u32x r1 = b; + const u32x r2 = 0; + const u32x r3 = 0; + + #include VECT_COMPARE_M + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m07700_m08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m07700_m16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m07700_s04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = 0; + wordl0[3] = 0; + + u32x wordl1[4]; + + wordl1[0] = 0; + wordl1[1] = 0; + wordl1[2] = 0; + wordl1[3] = 0; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, c_combs[0].pw_len); + } + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[2]; + salt_buf0[3] = 0; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + salt_buf0[0] = sapb_trans (salt_buf0[0]); + salt_buf0[1] = sapb_trans (salt_buf0[1]); + salt_buf0[2] = sapb_trans (salt_buf0[2]); + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = c_combs[il_pos].pw_len; + + const u32 pw_len = pw_l_len + pw_r_len; + + u32 wordr0[4]; + + wordr0[0] = c_combs[il_pos].i[0]; + wordr0[1] = c_combs[il_pos].i[1]; + wordr0[2] = 0; + wordr0[3] = 0; + + u32 wordr1[4]; + + wordr1[0] = 0; + wordr1[1] = 0; + wordr1[2] = 0; + wordr1[3] = 0; + + u32 wordr2[4]; + + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + + u32 wordr3[4]; + + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + u32x w0[4]; + + w0[0] = sapb_trans (wordl0[0] | wordr0[0]); + w0[1] = sapb_trans (wordl0[1] | wordr0[1]); + w0[2] = 0; + w0[3] = 0; + + /** + * append salt + */ + + u32 s0[4]; + + s0[0] = salt_buf0[0]; + s0[1] = salt_buf0[1]; + s0[2] = salt_buf0[2]; + s0[3] = 0; + + u32 s1[4]; + + s1[0] = 0; + s1[1] = 0; + s1[2] = 0; + s1[3] = 0; + + u32 s2[4]; + + s2[0] = 0; + s2[1] = 0; + s2[2] = 0; + s2[3] = 0; + + u32 s3[4]; + + s3[0] = 0; + s3[1] = 0; + s3[2] = 0; + s3[3] = 0; + + switch_buffer_by_offset (s0, s1, s2, s3, pw_len); + + const u32 pw_salt_len = pw_len + salt_len; + + u32x t[16]; + + t[ 0] = s0[0] | w0[0]; + t[ 1] = s0[1] | w0[1]; + t[ 2] = s0[2]; + t[ 3] = s0[3]; + t[ 4] = s1[0]; + t[ 5] = 0; + t[ 6] = 0; + t[ 7] = 0; + t[ 8] = 0; + t[ 9] = 0; + t[10] = 0; + t[11] = 0; + t[12] = 0; + t[13] = 0; + t[14] = pw_salt_len * 8; + t[15] = 0; + + append_0x80_4 (&t[0], &t[4], &t[8], &t[12], pw_salt_len); + + /** + * md5 + */ + + u32x a = MD5M_A; + u32x b = MD5M_B; + u32x c = MD5M_C; + u32x d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, t[ 0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, t[ 1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, t[ 2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, t[ 3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, t[ 4], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, t[ 5], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, t[ 6], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, t[ 7], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, t[ 8], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, t[ 9], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, t[10], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, t[11], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, t[12], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, t[13], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, t[14], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, t[15], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, t[ 1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, t[ 6], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, t[11], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, t[ 0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, t[ 5], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, t[10], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, t[15], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, t[ 4], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, t[ 9], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, t[14], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, t[ 3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, t[ 8], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, t[13], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, t[ 2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, t[ 7], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, t[12], MD5C1f, MD5S13); + + MD5_STEP (MD5_H , a, b, c, d, t[ 5], MD5C20, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, t[ 8], MD5C21, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, t[11], MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, t[14], MD5C23, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, t[ 1], MD5C24, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, t[ 4], MD5C25, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, t[ 7], MD5C26, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, t[10], MD5C27, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, t[13], MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, t[ 0], MD5C29, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, t[ 3], MD5C2a, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, t[ 6], MD5C2b, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, t[ 9], MD5C2c, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, t[12], MD5C2d, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, t[15], MD5C2e, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, t[ 2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, t[ 0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, t[ 7], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, t[14], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, t[ 5], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, t[12], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, t[ 3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, t[10], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, t[ 1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, t[ 8], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, t[15], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, t[ 6], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, t[13], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, t[ 4], MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, t[11], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, t[ 2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, t[ 9], MD5C3f, MD5S33); + + a += MD5M_A; + b += MD5M_B; + c += MD5M_C; + d += MD5M_D; + + const u32x sum20 = walld0rf_magic (w0, pw_len, salt_buf0, salt_len, a, b, c, d, t); + + t[14] = sum20 * 8; + + a = MD5M_A; + b = MD5M_B; + c = MD5M_C; + d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, t[ 0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, t[ 1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, t[ 2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, t[ 3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, t[ 4], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, t[ 5], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, t[ 6], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, t[ 7], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, t[ 8], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, t[ 9], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, t[10], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, t[11], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, t[12], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, t[13], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, t[14], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, t[15], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, t[ 1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, t[ 6], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, t[11], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, t[ 0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, t[ 5], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, t[10], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, t[15], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, t[ 4], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, t[ 9], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, t[14], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, t[ 3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, t[ 8], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, t[13], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, t[ 2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, t[ 7], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, t[12], MD5C1f, MD5S13); + + MD5_STEP (MD5_H , a, b, c, d, t[ 5], MD5C20, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, t[ 8], MD5C21, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, t[11], MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, t[14], MD5C23, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, t[ 1], MD5C24, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, t[ 4], MD5C25, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, t[ 7], MD5C26, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, t[10], MD5C27, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, t[13], MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, t[ 0], MD5C29, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, t[ 3], MD5C2a, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, t[ 6], MD5C2b, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, t[ 9], MD5C2c, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, t[12], MD5C2d, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, t[15], MD5C2e, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, t[ 2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, t[ 0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, t[ 7], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, t[14], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, t[ 5], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, t[12], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, t[ 3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, t[10], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, t[ 1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, t[ 8], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, t[15], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, t[ 6], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, t[13], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, t[ 4], MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, t[11], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, t[ 2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, t[ 9], MD5C3f, MD5S33); + + a += MD5M_A; + b += MD5M_B; + c += MD5M_C; + d += MD5M_D; + + a ^= c; + b ^= d; + + const u32x r0 = a; + const u32x r1 = b; + const u32x r2 = 0; + const u32x r3 = 0; + + #include VECT_COMPARE_S + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m07700_s08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m07700_s16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/nv/m07700_a3.cu b/nv/m07700_a3.cu new file mode 100644 index 0000000000..9bb892798d --- /dev/null +++ b/nv/m07700_a3.cu @@ -0,0 +1,985 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _SAPB_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW2 +#define VECT_SIZE1 +#endif + +#define DGST_R0 0 +#define DGST_R1 1 +#define DGST_R2 2 +#define DGST_R3 3 + +#include "include/kernel_functions.c" +#include "types_nv.c" +#include "common_nv.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#define GETCHAR(a,p) (((a)[(p) / 4] >> (((p) & 3) * 8)) & 0xff) +#define PUTCHAR(a,p,c) ((a)[(p) / 4] = (((a)[(p) / 4] & ~(0xff << (((p) & 3) * 8))) | ((c) << (((p) & 3) * 8)))) + +__device__ __constant__ u32 sapb_trans_tbl[256] = +{ + // first value hack for 0 byte as part of an optimization + 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x3f, 0x40, 0x41, 0x50, 0x43, 0x44, 0x45, 0x4b, 0x47, 0x48, 0x4d, 0x4e, 0x54, 0x51, 0x53, 0x46, + 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x56, 0x55, 0x5c, 0x49, 0x5d, 0x4a, + 0x42, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, + 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x58, 0x5b, 0x59, 0xff, 0x52, + 0x4c, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, + 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x57, 0x5e, 0x5a, 0x4f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff +}; + +__device__ __constant__ u32 bcodeArray[48] = +{ + 0x14, 0x77, 0xf3, 0xd4, 0xbb, 0x71, 0x23, 0xd0, 0x03, 0xff, 0x47, 0x93, 0x55, 0xaa, 0x66, 0x91, + 0xf2, 0x88, 0x6b, 0x99, 0xbf, 0xcb, 0x32, 0x1a, 0x19, 0xd9, 0xa7, 0x82, 0x22, 0x49, 0xa2, 0x51, + 0xe2, 0xb7, 0x33, 0x71, 0x8b, 0x9f, 0x5d, 0x01, 0x44, 0x70, 0xae, 0x11, 0xef, 0x28, 0xf0, 0x0d +}; + +__device__ static u32x sapb_trans (const u32x in) +{ + u32x out = 0; + + #ifdef VECT_SIZE1 + out |= (sapb_trans_tbl[(in >> 0) & 0xff]) << 0; + out |= (sapb_trans_tbl[(in >> 8) & 0xff]) << 8; + out |= (sapb_trans_tbl[(in >> 16) & 0xff]) << 16; + out |= (sapb_trans_tbl[(in >> 24) & 0xff]) << 24; + #endif + + return out; +} + +__device__ static u32x walld0rf_magic (const u32x w0[4], const u32 pw_len, const u32x salt_buf0[4], const u32 salt_len, const u32x a, const u32x b, const u32x c, const u32x d, u32x t[16]) +{ + t[ 0] = 0; + t[ 1] = 0; + t[ 2] = 0; + t[ 3] = 0; + t[ 4] = 0; + t[ 5] = 0; + t[ 6] = 0; + t[ 7] = 0; + t[ 8] = 0; + t[ 9] = 0; + t[10] = 0; + t[11] = 0; + t[12] = 0; + t[13] = 0; + t[14] = 0; + t[15] = 0; + + u32 sum20 = ((a >> 24) & 3) + + ((a >> 16) & 3) + + ((a >> 8) & 3) + + ((a >> 0) & 3) + + ((b >> 8) & 3); + + sum20 |= 0x20; + + const u32 w[2] = { w0[0], w0[1] }; + + const u32 s[3] = { salt_buf0[0], salt_buf0[1], salt_buf0[2] }; + + u32 saved_key[4] = { a, b, c, d }; + + u32 i1 = 0; + u32 i2 = 0; + u32 i3 = 0; + + // we can assume this because the password must be at least 3 + // and the username must be at least 1 so we can save the if () + + u32 t0 = 0; + + if ((d >> 24) & 1) + { + t0 |= bcodeArray[47] << 0; + t0 |= (w[0] & 0xff) << 8; + t0 |= (s[0] & 0xff) << 16; + t0 |= bcodeArray[ 1] << 24; + + i1 = 1; + i2 = 5; + i3 = 1; + } + else + { + t0 |= (w[0] & 0xff) << 0; + t0 |= (s[0] & 0xff) << 8; + t0 |= bcodeArray[ 0] << 16; + + i1 = 1; + i2 = 4; + i3 = 1; + } + + t[0] = t0; + + // because the following code can increase i2 by a maximum of 5, + // there is an overflow potential of 4 before it comes to the next test for i2 >= sum20 + // we need to truncate in that case + + while ((i1 < pw_len) && (i3 < salt_len)) + { + if (GETCHAR (saved_key, 15 - i1) & 1) + { + PUTCHAR (t, i2, bcodeArray[48 - 1 - i1]); + + i2++; + } + + PUTCHAR (t, i2, GETCHAR (w, i1)); + + i1++; + i2++; + + PUTCHAR (t, i2, GETCHAR (s, i3)); + + i2++; + i3++; + + PUTCHAR (t, i2, bcodeArray[i2 - i1 - i3]); + + i2++; + i2++; + + if (i2 >= sum20) + { + PUTCHAR (t, sum20 + 0, 0x80); + PUTCHAR (t, sum20 + 1, 0); + PUTCHAR (t, sum20 + 2, 0); + PUTCHAR (t, sum20 + 3, 0); + + return sum20; + } + } + + while ((i1 < pw_len) || (i3 < salt_len)) + { + if (i1 < pw_len) // max 8 + { + if (GETCHAR (saved_key, 15 - i1) & 1) + { + PUTCHAR (t, i2, bcodeArray[48 - 1 - i1]); + + i2++; + } + + PUTCHAR (t, i2, GETCHAR (w, i1)); + + i1++; + i2++; + } + else if (i3 < salt_len) // max 12 + { + PUTCHAR (t, i2, GETCHAR (s, i3)); + + i2++; + i3++; + } + + PUTCHAR (t, i2, bcodeArray[i2 - i1 - i3]); + + i2++; + i2++; + + if (i2 >= sum20) + { + PUTCHAR (t, sum20 + 0, 0x80); + PUTCHAR (t, sum20 + 1, 0); + PUTCHAR (t, sum20 + 2, 0); + PUTCHAR (t, sum20 + 3, 0); + + return sum20; + } + } + + while (i2 < sum20) + { + PUTCHAR (t, i2, bcodeArray[i2 - i1 - i3]); + + i2++; + i2++; + } + + PUTCHAR (t, sum20 + 0, 0x80); + PUTCHAR (t, sum20 + 1, 0); + PUTCHAR (t, sum20 + 2, 0); + PUTCHAR (t, sum20 + 3, 0); + + return sum20; +} + +__device__ __constant__ bf_t c_bfs[1024]; + +__device__ static void m07700m (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], const u32 pw_len, const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset) +{ + /** + * modifier + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + const u32 lid = threadIdx.x; + + w0[0] = sapb_trans (w0[0]); + w0[1] = sapb_trans (w0[1]); + + /** + * salt + */ + + u32 salt_buf0[3]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[2]; + + salt_buf0[0] = sapb_trans (salt_buf0[0]); + salt_buf0[1] = sapb_trans (salt_buf0[1]); + salt_buf0[2] = sapb_trans (salt_buf0[2]); + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + u32 s0[4]; + + s0[0] = salt_buf0[0]; + s0[1] = salt_buf0[1]; + s0[2] = salt_buf0[2]; + s0[3] = 0; + + u32 s1[4]; + + s1[0] = 0; + s1[1] = 0; + s1[2] = 0; + s1[3] = 0; + + u32 s2[4]; + + s2[0] = 0; + s2[1] = 0; + s2[2] = 0; + s2[3] = 0; + + u32 s3[4]; + + s3[0] = 0; + s3[1] = 0; + s3[2] = 0; + s3[3] = 0; + + switch_buffer_by_offset (s0, s1, s2, s3, pw_len); + + const u32 pw_salt_len = pw_len + salt_len; + + /** + * loop + */ + + u32x w0l = w0[0]; + + for (u32 il_pos = 0; il_pos < bfs_cnt; il_pos++) + { + const u32 w0r = sapb_trans (c_bfs[il_pos].i); + + w0[0] = w0l | w0r; + + u32x t[16]; + + t[ 0] = s0[0] | w0[0]; + t[ 1] = s0[1] | w0[1]; + t[ 2] = s0[2]; + t[ 3] = s0[3]; + t[ 4] = s1[0]; + t[ 5] = 0; + t[ 6] = 0; + t[ 7] = 0; + t[ 8] = 0; + t[ 9] = 0; + t[10] = 0; + t[11] = 0; + t[12] = 0; + t[13] = 0; + t[14] = pw_salt_len * 8; + t[15] = 0; + + append_0x80_4 (&t[0], &t[4], &t[8], &t[12], pw_salt_len); + + /** + * md5 + */ + + u32x a = MD5M_A; + u32x b = MD5M_B; + u32x c = MD5M_C; + u32x d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, t[ 0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, t[ 1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, t[ 2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, t[ 3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, t[ 4], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, t[ 5], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, t[ 6], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, t[ 7], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, t[ 8], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, t[ 9], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, t[10], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, t[11], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, t[12], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, t[13], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, t[14], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, t[15], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, t[ 1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, t[ 6], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, t[11], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, t[ 0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, t[ 5], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, t[10], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, t[15], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, t[ 4], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, t[ 9], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, t[14], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, t[ 3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, t[ 8], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, t[13], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, t[ 2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, t[ 7], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, t[12], MD5C1f, MD5S13); + + MD5_STEP (MD5_H , a, b, c, d, t[ 5], MD5C20, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, t[ 8], MD5C21, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, t[11], MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, t[14], MD5C23, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, t[ 1], MD5C24, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, t[ 4], MD5C25, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, t[ 7], MD5C26, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, t[10], MD5C27, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, t[13], MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, t[ 0], MD5C29, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, t[ 3], MD5C2a, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, t[ 6], MD5C2b, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, t[ 9], MD5C2c, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, t[12], MD5C2d, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, t[15], MD5C2e, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, t[ 2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, t[ 0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, t[ 7], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, t[14], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, t[ 5], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, t[12], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, t[ 3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, t[10], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, t[ 1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, t[ 8], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, t[15], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, t[ 6], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, t[13], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, t[ 4], MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, t[11], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, t[ 2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, t[ 9], MD5C3f, MD5S33); + + a += MD5M_A; + b += MD5M_B; + c += MD5M_C; + d += MD5M_D; + + const u32x sum20 = walld0rf_magic (w0, pw_len, salt_buf0, salt_len, a, b, c, d, t); + + t[14] = sum20 * 8; + + a = MD5M_A; + b = MD5M_B; + c = MD5M_C; + d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, t[ 0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, t[ 1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, t[ 2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, t[ 3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, t[ 4], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, t[ 5], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, t[ 6], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, t[ 7], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, t[ 8], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, t[ 9], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, t[10], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, t[11], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, t[12], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, t[13], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, t[14], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, t[15], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, t[ 1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, t[ 6], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, t[11], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, t[ 0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, t[ 5], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, t[10], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, t[15], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, t[ 4], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, t[ 9], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, t[14], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, t[ 3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, t[ 8], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, t[13], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, t[ 2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, t[ 7], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, t[12], MD5C1f, MD5S13); + + MD5_STEP (MD5_H , a, b, c, d, t[ 5], MD5C20, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, t[ 8], MD5C21, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, t[11], MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, t[14], MD5C23, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, t[ 1], MD5C24, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, t[ 4], MD5C25, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, t[ 7], MD5C26, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, t[10], MD5C27, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, t[13], MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, t[ 0], MD5C29, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, t[ 3], MD5C2a, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, t[ 6], MD5C2b, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, t[ 9], MD5C2c, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, t[12], MD5C2d, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, t[15], MD5C2e, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, t[ 2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, t[ 0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, t[ 7], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, t[14], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, t[ 5], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, t[12], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, t[ 3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, t[10], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, t[ 1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, t[ 8], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, t[15], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, t[ 6], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, t[13], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, t[ 4], MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, t[11], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, t[ 2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, t[ 9], MD5C3f, MD5S33); + + a += MD5M_A; + b += MD5M_B; + c += MD5M_C; + d += MD5M_D; + + a ^= c; + b ^= d; + + const u32x r0 = a; + const u32x r1 = b; + const u32x r2 = 0; + const u32x r3 = 0; + + #include VECT_COMPARE_M + } +} + +__device__ static void m07700s (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], const u32 pw_len, const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset) +{ + /** + * modifier + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + const u32 lid = threadIdx.x; + + w0[0] = sapb_trans (w0[0]); + w0[1] = sapb_trans (w0[1]); + + /** + * salt + */ + + u32 salt_buf0[3]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[2]; + + salt_buf0[0] = sapb_trans (salt_buf0[0]); + salt_buf0[1] = sapb_trans (salt_buf0[1]); + salt_buf0[2] = sapb_trans (salt_buf0[2]); + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + u32 s0[4]; + + s0[0] = salt_buf0[0]; + s0[1] = salt_buf0[1]; + s0[2] = salt_buf0[2]; + s0[3] = 0; + + u32 s1[4]; + + s1[0] = 0; + s1[1] = 0; + s1[2] = 0; + s1[3] = 0; + + u32 s2[4]; + + s2[0] = 0; + s2[1] = 0; + s2[2] = 0; + s2[3] = 0; + + u32 s3[4]; + + s3[0] = 0; + s3[1] = 0; + s3[2] = 0; + s3[3] = 0; + + switch_buffer_by_offset (s0, s1, s2, s3, pw_len); + + const u32 pw_salt_len = pw_len + salt_len; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * loop + */ + + u32x w0l = w0[0]; + + for (u32 il_pos = 0; il_pos < bfs_cnt; il_pos++) + { + const u32 w0r = sapb_trans (c_bfs[il_pos].i); + + w0[0] = w0l | w0r; + + u32x t[16]; + + t[ 0] = s0[0] | w0[0]; + t[ 1] = s0[1] | w0[1]; + t[ 2] = s0[2]; + t[ 3] = s0[3]; + t[ 4] = s1[0]; + t[ 5] = 0; + t[ 6] = 0; + t[ 7] = 0; + t[ 8] = 0; + t[ 9] = 0; + t[10] = 0; + t[11] = 0; + t[12] = 0; + t[13] = 0; + t[14] = pw_salt_len * 8; + t[15] = 0; + + append_0x80_4 (&t[0], &t[4], &t[8], &t[12], pw_salt_len); + + /** + * md5 + */ + + u32x a = MD5M_A; + u32x b = MD5M_B; + u32x c = MD5M_C; + u32x d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, t[ 0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, t[ 1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, t[ 2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, t[ 3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, t[ 4], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, t[ 5], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, t[ 6], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, t[ 7], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, t[ 8], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, t[ 9], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, t[10], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, t[11], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, t[12], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, t[13], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, t[14], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, t[15], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, t[ 1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, t[ 6], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, t[11], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, t[ 0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, t[ 5], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, t[10], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, t[15], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, t[ 4], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, t[ 9], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, t[14], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, t[ 3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, t[ 8], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, t[13], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, t[ 2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, t[ 7], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, t[12], MD5C1f, MD5S13); + + MD5_STEP (MD5_H , a, b, c, d, t[ 5], MD5C20, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, t[ 8], MD5C21, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, t[11], MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, t[14], MD5C23, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, t[ 1], MD5C24, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, t[ 4], MD5C25, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, t[ 7], MD5C26, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, t[10], MD5C27, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, t[13], MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, t[ 0], MD5C29, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, t[ 3], MD5C2a, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, t[ 6], MD5C2b, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, t[ 9], MD5C2c, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, t[12], MD5C2d, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, t[15], MD5C2e, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, t[ 2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, t[ 0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, t[ 7], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, t[14], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, t[ 5], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, t[12], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, t[ 3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, t[10], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, t[ 1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, t[ 8], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, t[15], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, t[ 6], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, t[13], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, t[ 4], MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, t[11], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, t[ 2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, t[ 9], MD5C3f, MD5S33); + + a += MD5M_A; + b += MD5M_B; + c += MD5M_C; + d += MD5M_D; + + const u32x sum20 = walld0rf_magic (w0, pw_len, salt_buf0, salt_len, a, b, c, d, t); + + t[14] = sum20 * 8; + + a = MD5M_A; + b = MD5M_B; + c = MD5M_C; + d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, t[ 0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, t[ 1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, t[ 2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, t[ 3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, t[ 4], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, t[ 5], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, t[ 6], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, t[ 7], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, t[ 8], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, t[ 9], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, t[10], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, t[11], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, t[12], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, t[13], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, t[14], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, t[15], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, t[ 1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, t[ 6], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, t[11], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, t[ 0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, t[ 5], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, t[10], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, t[15], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, t[ 4], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, t[ 9], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, t[14], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, t[ 3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, t[ 8], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, t[13], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, t[ 2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, t[ 7], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, t[12], MD5C1f, MD5S13); + + MD5_STEP (MD5_H , a, b, c, d, t[ 5], MD5C20, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, t[ 8], MD5C21, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, t[11], MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, t[14], MD5C23, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, t[ 1], MD5C24, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, t[ 4], MD5C25, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, t[ 7], MD5C26, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, t[10], MD5C27, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, t[13], MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, t[ 0], MD5C29, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, t[ 3], MD5C2a, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, t[ 6], MD5C2b, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, t[ 9], MD5C2c, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, t[12], MD5C2d, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, t[15], MD5C2e, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, t[ 2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, t[ 0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, t[ 7], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, t[14], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, t[ 5], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, t[12], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, t[ 3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, t[10], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, t[ 1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, t[ 8], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, t[15], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, t[ 6], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, t[13], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, t[ 4], MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, t[11], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, t[ 2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, t[ 9], MD5C3f, MD5S33); + + a += MD5M_A; + b += MD5M_B; + c += MD5M_C; + d += MD5M_D; + + a ^= c; + b ^= d; + + const u32x r0 = a; + const u32x r1 = b; + const u32x r2 = 0; + const u32x r3 = 0; + + #include VECT_COMPARE_S + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m07700_m04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m07700m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m07700_m08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m07700m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m07700_m16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m07700_s04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m07700s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m07700_s08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m07700s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m07700_s16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/nv/m07800_a0.cu b/nv/m07800_a0.cu new file mode 100644 index 0000000000..7699e39fd5 --- /dev/null +++ b/nv/m07800_a0.cu @@ -0,0 +1,764 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _SAPG_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW2 +#define VECT_SIZE1 +#endif + +#define DGST_R0 3 +#define DGST_R1 4 +#define DGST_R2 2 +#define DGST_R3 1 + +#include "include/kernel_functions.c" +#include "types_nv.c" +#include "common_nv.c" +#include "include/rp_gpu.h" +#include "rp_nv.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +__device__ static u32 bytealign (u32 src0, u32 src1, u32 src2) +{ + return (u32) (((((u64)src0) << 32) | (u64)src1) >> ((src2 & 3)*8)); +} + +#if __CUDA_ARCH__ >= 350 +#define GETSHIFTEDINT(a,n) __funnelshift_r ((a)[((n)/4)+0], (a)[((n)/4)+1], (n & 3) * 8) +#elif __CUDA_ARCH__ >= 200 +#define GETSHIFTEDINT(a,n) __byte_perm ((a)[((n)/4)+0], (a)[((n)/4)+1], (0x76543210 >> ((n & 3) * 4)) & 0xffff) +#else +#define GETSHIFTEDINT(a,n) bytealign ((a)[((n)/4)+1], (a)[((n)/4)+0], n) +#endif + +#define SETSHIFTEDINT(a,n,v) \ +{ \ + const u32 s = ((n) & 3) * 8; \ + const u64 x = (u64) (v) << s; \ + (a)[((n)/4)+0] |= x; \ + (a)[((n)/4)+1] = x >> 32; \ +} + +__device__ __constant__ u32 theMagicArray[64] = +{ + 0x1451ac91,0x4354679f,0xe03be724,0xc27b7428,0xeb133386,0x5ccb4f5a,0x37730a08,0x2f1c5d0e, + 0xe5e68f33,0xddae9bf8,0x8d4bf216,0xdcd4e12c,0x9ddfcbb0,0x176d70d4,0x3f424df9,0x94111b9b, + 0x9bc15b9f,0x039d0506,0x8a135e9d,0xe86a9a1e,0x17147cd9,0xf62ac758,0x0a6399a1,0xc370fdd7, + 0x13745ef6,0x040bc903,0x26f79826,0x2593928a,0x230da2b0,0x6d7963ed,0x3cfa3213,0xa39a0235, + 0x0a8eddb3,0xc351bf24,0x9f55cd7c,0x4c94af37,0x82520829,0x374e3bb2,0x9107179f,0xcdfd3b11, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0 +}; + +__device__ static void swap_buffer (u32x final[16]) +{ + final[ 0] = swap_workaround (final[ 0]); + final[ 1] = swap_workaround (final[ 1]); + final[ 2] = swap_workaround (final[ 2]); + final[ 3] = swap_workaround (final[ 3]); + final[ 4] = swap_workaround (final[ 4]); + final[ 5] = swap_workaround (final[ 5]); + final[ 6] = swap_workaround (final[ 6]); + final[ 7] = swap_workaround (final[ 7]); + final[ 8] = swap_workaround (final[ 8]); + final[ 9] = swap_workaround (final[ 9]); + final[10] = swap_workaround (final[10]); + final[11] = swap_workaround (final[11]); + final[12] = swap_workaround (final[12]); + final[13] = swap_workaround (final[13]); + final[14] = swap_workaround (final[14]); + final[15] = swap_workaround (final[15]); +} + +__device__ static void sha1_transform (const u32x w0[4], const u32x w1[4], const u32x w2[4], const u32x w3[4], u32x digest[5]) +{ + u32x A = digest[0]; + u32x B = digest[1]; + u32x C = digest[2]; + u32x D = digest[3]; + u32x E = digest[4]; + + u32x w0_t = w0[0]; + u32x w1_t = w0[1]; + u32x w2_t = w0[2]; + u32x w3_t = w0[3]; + u32x w4_t = w1[0]; + u32x w5_t = w1[1]; + u32x w6_t = w1[2]; + u32x w7_t = w1[3]; + u32x w8_t = w2[0]; + u32x w9_t = w2[1]; + u32x wa_t = w2[2]; + u32x wb_t = w2[3]; + u32x wc_t = w3[0]; + u32x wd_t = w3[1]; + u32x we_t = w3[2]; + u32x wf_t = w3[3]; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, A, B, C, D, E, w0_t); + SHA1_STEP (SHA1_F0o, E, A, B, C, D, w1_t); + SHA1_STEP (SHA1_F0o, D, E, A, B, C, w2_t); + SHA1_STEP (SHA1_F0o, C, D, E, A, B, w3_t); + SHA1_STEP (SHA1_F0o, B, C, D, E, A, w4_t); + SHA1_STEP (SHA1_F0o, A, B, C, D, E, w5_t); + SHA1_STEP (SHA1_F0o, E, A, B, C, D, w6_t); + SHA1_STEP (SHA1_F0o, D, E, A, B, C, w7_t); + SHA1_STEP (SHA1_F0o, C, D, E, A, B, w8_t); + SHA1_STEP (SHA1_F0o, B, C, D, E, A, w9_t); + SHA1_STEP (SHA1_F0o, A, B, C, D, E, wa_t); + SHA1_STEP (SHA1_F0o, E, A, B, C, D, wb_t); + SHA1_STEP (SHA1_F0o, D, E, A, B, C, wc_t); + SHA1_STEP (SHA1_F0o, C, D, E, A, B, wd_t); + SHA1_STEP (SHA1_F0o, B, C, D, E, A, we_t); + SHA1_STEP (SHA1_F0o, A, B, C, D, E, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F0o, E, A, B, C, D, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F0o, D, E, A, B, C, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F0o, C, D, E, A, B, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F0o, B, C, D, E, A, w3_t); + + #undef K + #define K SHA1C01 + + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w7_t); + + #undef K + #define K SHA1C02 + + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, wb_t); + + #undef K + #define K SHA1C03 + + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, wf_t); + + digest[0] += A; + digest[1] += B; + digest[2] += C; + digest[3] += D; + digest[4] += E; +} + +__device__ __constant__ gpu_rule_t c_rules[1024]; + +extern "C" __global__ void __launch_bounds__ (256, 1) m07800_m04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + u32x pw_buf1[4]; + + pw_buf1[0] = pws[gid].i[ 4]; + pw_buf1[1] = pws[gid].i[ 5]; + pw_buf1[2] = pws[gid].i[ 6]; + pw_buf1[3] = pws[gid].i[ 7]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * salt + */ + + u32 salt_buf[8]; + + salt_buf[0] = salt_bufs[salt_pos].salt_buf[0]; + salt_buf[1] = salt_bufs[salt_pos].salt_buf[1]; + salt_buf[2] = salt_bufs[salt_pos].salt_buf[2]; + salt_buf[3] = salt_bufs[salt_pos].salt_buf[3]; + salt_buf[4] = salt_bufs[salt_pos].salt_buf[4]; + salt_buf[5] = salt_bufs[salt_pos].salt_buf[5]; + salt_buf[6] = salt_bufs[salt_pos].salt_buf[6]; + salt_buf[7] = salt_bufs[salt_pos].salt_buf[7]; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + + w0[0] = pw_buf0[0]; + w0[1] = pw_buf0[1]; + w0[2] = pw_buf0[2]; + w0[3] = pw_buf0[3]; + + u32x w1[4]; + + w1[0] = pw_buf1[0]; + w1[1] = pw_buf1[1]; + w1[2] = pw_buf1[2]; + w1[3] = pw_buf1[3]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 out_len = apply_rules (c_rules[il_pos].cmds, w0, w1, pw_len); + + /** + * append salt + */ + + u32 s0[4]; + + s0[0] = salt_buf[0]; + s0[1] = salt_buf[1]; + s0[2] = salt_buf[2]; + s0[3] = salt_buf[3]; + + u32 s1[4]; + + s1[0] = salt_buf[4]; + s1[1] = salt_buf[5]; + s1[2] = salt_buf[6]; + s1[3] = salt_buf[7]; + + u32 s2[4]; + + s2[0] = 0; + s2[1] = 0; + s2[2] = 0; + s2[3] = 0; + + u32 s3[4]; + + s3[0] = 0; + s3[1] = 0; + s3[2] = 0; + s3[3] = 0; + + switch_buffer_by_offset (s0, s1, s2, s3, out_len); + + const u32 pw_salt_len = out_len + salt_len; + + /** + * sha1 + */ + + u32x final[256]; + + final[ 0] = swap_workaround (w0[0] | s0[0]); + final[ 1] = swap_workaround (w0[1] | s0[1]); + final[ 2] = swap_workaround (w0[2] | s0[2]); + final[ 3] = swap_workaround (w0[3] | s0[3]); + final[ 4] = swap_workaround (w1[0] | s1[0]); + final[ 5] = swap_workaround (w1[1] | s1[1]); + final[ 6] = swap_workaround (w1[2] | s1[2]); + final[ 7] = swap_workaround (w1[3] | s1[3]); + final[ 8] = swap_workaround (w2[0] | s2[0]); + final[ 9] = swap_workaround (w2[1] | s2[1]); + final[10] = swap_workaround (w2[2] | s2[2]); + final[11] = swap_workaround (w2[3] | s2[3]); + final[12] = swap_workaround (w3[0] | s3[0]); + final[13] = swap_workaround (w3[1] | s3[1]); + final[14] = 0; + final[15] = pw_salt_len * 8; + + u32x digest[5]; + + digest[0] = SHA1M_A; + digest[1] = SHA1M_B; + digest[2] = SHA1M_C; + digest[3] = SHA1M_D; + digest[4] = SHA1M_E; + + sha1_transform (&final[0], &final[4], &final[8], &final[12], digest); + + // prepare magic array range + + u32x lengthMagicArray = 0x20; + u32x offsetMagicArray = 0; + + lengthMagicArray += ((digest[0] >> 24) & 0xff) % 6; + lengthMagicArray += ((digest[0] >> 16) & 0xff) % 6; + lengthMagicArray += ((digest[0] >> 8) & 0xff) % 6; + lengthMagicArray += ((digest[0] >> 0) & 0xff) % 6; + lengthMagicArray += ((digest[1] >> 24) & 0xff) % 6; + lengthMagicArray += ((digest[1] >> 16) & 0xff) % 6; + lengthMagicArray += ((digest[1] >> 8) & 0xff) % 6; + lengthMagicArray += ((digest[1] >> 0) & 0xff) % 6; + lengthMagicArray += ((digest[2] >> 24) & 0xff) % 6; + lengthMagicArray += ((digest[2] >> 16) & 0xff) % 6; + offsetMagicArray += ((digest[2] >> 8) & 0xff) % 8; + offsetMagicArray += ((digest[2] >> 0) & 0xff) % 8; + offsetMagicArray += ((digest[3] >> 24) & 0xff) % 8; + offsetMagicArray += ((digest[3] >> 16) & 0xff) % 8; + offsetMagicArray += ((digest[3] >> 8) & 0xff) % 8; + offsetMagicArray += ((digest[3] >> 0) & 0xff) % 8; + offsetMagicArray += ((digest[4] >> 24) & 0xff) % 8; + offsetMagicArray += ((digest[4] >> 16) & 0xff) % 8; + offsetMagicArray += ((digest[4] >> 8) & 0xff) % 8; + offsetMagicArray += ((digest[4] >> 0) & 0xff) % 8; + + // final + + digest[0] = SHA1M_A; + digest[1] = SHA1M_B; + digest[2] = SHA1M_C; + digest[3] = SHA1M_D; + digest[4] = SHA1M_E; + + #pragma unroll 64 + for (int i = 0; i < 64; i++) final[i] = 0; + + final[0] = w0[0]; + final[1] = w0[1]; + final[2] = w0[2]; + final[3] = w0[3]; + final[4] = w1[0]; + final[5] = w1[1]; + final[6] = w1[2]; + final[7] = w1[3]; + + u32 final_len = out_len; + + int i; + + // append MagicArray + + for (i = 0; i < lengthMagicArray - 4; i += 4) + { + const u32 tmp = GETSHIFTEDINT (theMagicArray, offsetMagicArray + i); + + SETSHIFTEDINT (final, final_len + i, tmp); + } + + const u32 mask = 0xffffffff >> (((i - lengthMagicArray) & 3) * 8); + + const u32 tmp = GETSHIFTEDINT (theMagicArray, offsetMagicArray + i) & mask; + + SETSHIFTEDINT (final, final_len + i, tmp); + + final_len += lengthMagicArray; + + // append Salt + + for (i = 0; i < salt_len + 1; i += 4) // +1 for the 0x80 + { + const u32 tmp = salt_buf[i / 4]; // attention, int[] not char[] + + SETSHIFTEDINT (final, final_len + i, tmp); + } + + final_len += salt_len; + + // calculate + + int left; + int off; + + for (left = final_len, off = 0; left >= 56; left -= 64, off += 16) + { + swap_buffer (&final[off]); + + sha1_transform (&final[off + 0], &final[off + 4], &final[off + 8], &final[off + 12], digest); + } + + swap_buffer (&final[off]); + + final[off + 14] = 0; + final[off + 15] = final_len * 8; + + sha1_transform (&final[off + 0], &final[off + 4], &final[off + 8], &final[off + 12], digest); + + const u32x r0 = digest[3]; + const u32x r1 = digest[4]; + const u32x r2 = digest[2]; + const u32x r3 = digest[1]; + + #include VECT_COMPARE_M + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m07800_m08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m07800_m16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m07800_s04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + u32x pw_buf1[4]; + + pw_buf1[0] = pws[gid].i[ 4]; + pw_buf1[1] = pws[gid].i[ 5]; + pw_buf1[2] = pws[gid].i[ 6]; + pw_buf1[3] = pws[gid].i[ 7]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * salt + */ + + u32 salt_buf[8]; + + salt_buf[0] = salt_bufs[salt_pos].salt_buf[0]; + salt_buf[1] = salt_bufs[salt_pos].salt_buf[1]; + salt_buf[2] = salt_bufs[salt_pos].salt_buf[2]; + salt_buf[3] = salt_bufs[salt_pos].salt_buf[3]; + salt_buf[4] = salt_bufs[salt_pos].salt_buf[4]; + salt_buf[5] = salt_bufs[salt_pos].salt_buf[5]; + salt_buf[6] = salt_bufs[salt_pos].salt_buf[6]; + salt_buf[7] = salt_bufs[salt_pos].salt_buf[7]; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + + w0[0] = pw_buf0[0]; + w0[1] = pw_buf0[1]; + w0[2] = pw_buf0[2]; + w0[3] = pw_buf0[3]; + + u32x w1[4]; + + w1[0] = pw_buf1[0]; + w1[1] = pw_buf1[1]; + w1[2] = pw_buf1[2]; + w1[3] = pw_buf1[3]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 out_len = apply_rules (c_rules[il_pos].cmds, w0, w1, pw_len); + + /** + * append salt + */ + + u32 s0[4]; + + s0[0] = salt_buf[0]; + s0[1] = salt_buf[1]; + s0[2] = salt_buf[2]; + s0[3] = salt_buf[3]; + + u32 s1[4]; + + s1[0] = salt_buf[4]; + s1[1] = salt_buf[5]; + s1[2] = salt_buf[6]; + s1[3] = salt_buf[7]; + + u32 s2[4]; + + s2[0] = 0; + s2[1] = 0; + s2[2] = 0; + s2[3] = 0; + + u32 s3[4]; + + s3[0] = 0; + s3[1] = 0; + s3[2] = 0; + s3[3] = 0; + + switch_buffer_by_offset (s0, s1, s2, s3, out_len); + + const u32 pw_salt_len = out_len + salt_len; + + /** + * sha1 + */ + + u32x final[256]; + + final[ 0] = swap_workaround (w0[0] | s0[0]); + final[ 1] = swap_workaround (w0[1] | s0[1]); + final[ 2] = swap_workaround (w0[2] | s0[2]); + final[ 3] = swap_workaround (w0[3] | s0[3]); + final[ 4] = swap_workaround (w1[0] | s1[0]); + final[ 5] = swap_workaround (w1[1] | s1[1]); + final[ 6] = swap_workaround (w1[2] | s1[2]); + final[ 7] = swap_workaround (w1[3] | s1[3]); + final[ 8] = swap_workaround (w2[0] | s2[0]); + final[ 9] = swap_workaround (w2[1] | s2[1]); + final[10] = swap_workaround (w2[2] | s2[2]); + final[11] = swap_workaround (w2[3] | s2[3]); + final[12] = swap_workaround (w3[0] | s3[0]); + final[13] = swap_workaround (w3[1] | s3[1]); + final[14] = 0; + final[15] = pw_salt_len * 8; + + u32x digest[5]; + + digest[0] = SHA1M_A; + digest[1] = SHA1M_B; + digest[2] = SHA1M_C; + digest[3] = SHA1M_D; + digest[4] = SHA1M_E; + + sha1_transform (&final[0], &final[4], &final[8], &final[12], digest); + + // prepare magic array range + + u32x lengthMagicArray = 0x20; + u32x offsetMagicArray = 0; + + lengthMagicArray += ((digest[0] >> 24) & 0xff) % 6; + lengthMagicArray += ((digest[0] >> 16) & 0xff) % 6; + lengthMagicArray += ((digest[0] >> 8) & 0xff) % 6; + lengthMagicArray += ((digest[0] >> 0) & 0xff) % 6; + lengthMagicArray += ((digest[1] >> 24) & 0xff) % 6; + lengthMagicArray += ((digest[1] >> 16) & 0xff) % 6; + lengthMagicArray += ((digest[1] >> 8) & 0xff) % 6; + lengthMagicArray += ((digest[1] >> 0) & 0xff) % 6; + lengthMagicArray += ((digest[2] >> 24) & 0xff) % 6; + lengthMagicArray += ((digest[2] >> 16) & 0xff) % 6; + offsetMagicArray += ((digest[2] >> 8) & 0xff) % 8; + offsetMagicArray += ((digest[2] >> 0) & 0xff) % 8; + offsetMagicArray += ((digest[3] >> 24) & 0xff) % 8; + offsetMagicArray += ((digest[3] >> 16) & 0xff) % 8; + offsetMagicArray += ((digest[3] >> 8) & 0xff) % 8; + offsetMagicArray += ((digest[3] >> 0) & 0xff) % 8; + offsetMagicArray += ((digest[4] >> 24) & 0xff) % 8; + offsetMagicArray += ((digest[4] >> 16) & 0xff) % 8; + offsetMagicArray += ((digest[4] >> 8) & 0xff) % 8; + offsetMagicArray += ((digest[4] >> 0) & 0xff) % 8; + + // final + + digest[0] = SHA1M_A; + digest[1] = SHA1M_B; + digest[2] = SHA1M_C; + digest[3] = SHA1M_D; + digest[4] = SHA1M_E; + + #pragma unroll 64 + for (int i = 0; i < 64; i++) final[i] = 0; + + final[0] = w0[0]; + final[1] = w0[1]; + final[2] = w0[2]; + final[3] = w0[3]; + final[4] = w1[0]; + final[5] = w1[1]; + final[6] = w1[2]; + final[7] = w1[3]; + + u32 final_len = out_len; + + int i; + + // append MagicArray + + for (i = 0; i < lengthMagicArray - 4; i += 4) + { + const u32 tmp = GETSHIFTEDINT (theMagicArray, offsetMagicArray + i); + + SETSHIFTEDINT (final, final_len + i, tmp); + } + + const u32 mask = 0xffffffff >> (((i - lengthMagicArray) & 3) * 8); + + const u32 tmp = GETSHIFTEDINT (theMagicArray, offsetMagicArray + i) & mask; + + SETSHIFTEDINT (final, final_len + i, tmp); + + final_len += lengthMagicArray; + + // append Salt + + for (i = 0; i < salt_len + 1; i += 4) // +1 for the 0x80 + { + const u32 tmp = salt_buf[i / 4]; // attention, int[] not char[] + + SETSHIFTEDINT (final, final_len + i, tmp); + } + + final_len += salt_len; + + // calculate + + int left; + int off; + + for (left = final_len, off = 0; left >= 56; left -= 64, off += 16) + { + swap_buffer (&final[off]); + + sha1_transform (&final[off + 0], &final[off + 4], &final[off + 8], &final[off + 12], digest); + } + + swap_buffer (&final[off]); + + final[off + 14] = 0; + final[off + 15] = final_len * 8; + + sha1_transform (&final[off + 0], &final[off + 4], &final[off + 8], &final[off + 12], digest); + + const u32x r0 = digest[3]; + const u32x r1 = digest[4]; + const u32x r2 = digest[2]; + const u32x r3 = digest[1]; + + #include VECT_COMPARE_S + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m07800_s08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m07800_s16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/nv/m07800_a1.cu b/nv/m07800_a1.cu new file mode 100644 index 0000000000..137fd80df9 --- /dev/null +++ b/nv/m07800_a1.cu @@ -0,0 +1,866 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _SAPG_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW2 +#define VECT_SIZE1 +#endif + +#define DGST_R0 3 +#define DGST_R1 4 +#define DGST_R2 2 +#define DGST_R3 1 + +#include "include/kernel_functions.c" +#include "types_nv.c" +#include "common_nv.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +__device__ static u32 bytealign (u32 src0, u32 src1, u32 src2) +{ + return (u32) (((((u64)src0) << 32) | (u64)src1) >> ((src2 & 3)*8)); +} + +#if __CUDA_ARCH__ >= 350 +#define GETSHIFTEDINT(a,n) __funnelshift_r ((a)[((n)/4)+0], (a)[((n)/4)+1], (n & 3) * 8) +#elif __CUDA_ARCH__ >= 200 +#define GETSHIFTEDINT(a,n) __byte_perm ((a)[((n)/4)+0], (a)[((n)/4)+1], (0x76543210 >> ((n & 3) * 4)) & 0xffff) +#else +#define GETSHIFTEDINT(a,n) bytealign ((a)[((n)/4)+1], (a)[((n)/4)+0], n) +#endif + +#define SETSHIFTEDINT(a,n,v) \ +{ \ + const u32 s = ((n) & 3) * 8; \ + const u64 x = (u64) (v) << s; \ + (a)[((n)/4)+0] |= x; \ + (a)[((n)/4)+1] = x >> 32; \ +} + +__device__ __constant__ u32 theMagicArray[64] = +{ + 0x1451ac91,0x4354679f,0xe03be724,0xc27b7428,0xeb133386,0x5ccb4f5a,0x37730a08,0x2f1c5d0e, + 0xe5e68f33,0xddae9bf8,0x8d4bf216,0xdcd4e12c,0x9ddfcbb0,0x176d70d4,0x3f424df9,0x94111b9b, + 0x9bc15b9f,0x039d0506,0x8a135e9d,0xe86a9a1e,0x17147cd9,0xf62ac758,0x0a6399a1,0xc370fdd7, + 0x13745ef6,0x040bc903,0x26f79826,0x2593928a,0x230da2b0,0x6d7963ed,0x3cfa3213,0xa39a0235, + 0x0a8eddb3,0xc351bf24,0x9f55cd7c,0x4c94af37,0x82520829,0x374e3bb2,0x9107179f,0xcdfd3b11, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0 +}; + +__device__ static void swap_buffer (u32x final[16]) +{ + final[ 0] = swap_workaround (final[ 0]); + final[ 1] = swap_workaround (final[ 1]); + final[ 2] = swap_workaround (final[ 2]); + final[ 3] = swap_workaround (final[ 3]); + final[ 4] = swap_workaround (final[ 4]); + final[ 5] = swap_workaround (final[ 5]); + final[ 6] = swap_workaround (final[ 6]); + final[ 7] = swap_workaround (final[ 7]); + final[ 8] = swap_workaround (final[ 8]); + final[ 9] = swap_workaround (final[ 9]); + final[10] = swap_workaround (final[10]); + final[11] = swap_workaround (final[11]); + final[12] = swap_workaround (final[12]); + final[13] = swap_workaround (final[13]); + final[14] = swap_workaround (final[14]); + final[15] = swap_workaround (final[15]); +} + +__device__ static void sha1_transform (const u32x w0[4], const u32x w1[4], const u32x w2[4], const u32x w3[4], u32x digest[5]) +{ + u32x A = digest[0]; + u32x B = digest[1]; + u32x C = digest[2]; + u32x D = digest[3]; + u32x E = digest[4]; + + u32x w0_t = w0[0]; + u32x w1_t = w0[1]; + u32x w2_t = w0[2]; + u32x w3_t = w0[3]; + u32x w4_t = w1[0]; + u32x w5_t = w1[1]; + u32x w6_t = w1[2]; + u32x w7_t = w1[3]; + u32x w8_t = w2[0]; + u32x w9_t = w2[1]; + u32x wa_t = w2[2]; + u32x wb_t = w2[3]; + u32x wc_t = w3[0]; + u32x wd_t = w3[1]; + u32x we_t = w3[2]; + u32x wf_t = w3[3]; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, A, B, C, D, E, w0_t); + SHA1_STEP (SHA1_F0o, E, A, B, C, D, w1_t); + SHA1_STEP (SHA1_F0o, D, E, A, B, C, w2_t); + SHA1_STEP (SHA1_F0o, C, D, E, A, B, w3_t); + SHA1_STEP (SHA1_F0o, B, C, D, E, A, w4_t); + SHA1_STEP (SHA1_F0o, A, B, C, D, E, w5_t); + SHA1_STEP (SHA1_F0o, E, A, B, C, D, w6_t); + SHA1_STEP (SHA1_F0o, D, E, A, B, C, w7_t); + SHA1_STEP (SHA1_F0o, C, D, E, A, B, w8_t); + SHA1_STEP (SHA1_F0o, B, C, D, E, A, w9_t); + SHA1_STEP (SHA1_F0o, A, B, C, D, E, wa_t); + SHA1_STEP (SHA1_F0o, E, A, B, C, D, wb_t); + SHA1_STEP (SHA1_F0o, D, E, A, B, C, wc_t); + SHA1_STEP (SHA1_F0o, C, D, E, A, B, wd_t); + SHA1_STEP (SHA1_F0o, B, C, D, E, A, we_t); + SHA1_STEP (SHA1_F0o, A, B, C, D, E, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F0o, E, A, B, C, D, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F0o, D, E, A, B, C, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F0o, C, D, E, A, B, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F0o, B, C, D, E, A, w3_t); + + #undef K + #define K SHA1C01 + + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w7_t); + + #undef K + #define K SHA1C02 + + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, wb_t); + + #undef K + #define K SHA1C03 + + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, wf_t); + + digest[0] += A; + digest[1] += B; + digest[2] += C; + digest[3] += D; + digest[4] += E; +} + +__device__ __constant__ comb_t c_combs[1024]; + +extern "C" __global__ void __launch_bounds__ (256, 1) m07800_m04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, c_combs[0].pw_len); + } + + /** + * salt + */ + + u32 salt_buf[8]; + + salt_buf[0] = salt_bufs[salt_pos].salt_buf[0]; + salt_buf[1] = salt_bufs[salt_pos].salt_buf[1]; + salt_buf[2] = salt_bufs[salt_pos].salt_buf[2]; + salt_buf[3] = salt_bufs[salt_pos].salt_buf[3]; + salt_buf[4] = salt_bufs[salt_pos].salt_buf[4]; + salt_buf[5] = salt_bufs[salt_pos].salt_buf[5]; + salt_buf[6] = salt_bufs[salt_pos].salt_buf[6]; + salt_buf[7] = salt_bufs[salt_pos].salt_buf[7]; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = c_combs[il_pos].pw_len; + + const u32 pw_len = pw_l_len + pw_r_len; + + u32 wordr0[4]; + + wordr0[0] = c_combs[il_pos].i[0]; + wordr0[1] = c_combs[il_pos].i[1]; + wordr0[2] = c_combs[il_pos].i[2]; + wordr0[3] = c_combs[il_pos].i[3]; + + u32 wordr1[4]; + + wordr1[0] = c_combs[il_pos].i[4]; + wordr1[1] = c_combs[il_pos].i[5]; + wordr1[2] = c_combs[il_pos].i[6]; + wordr1[3] = c_combs[il_pos].i[7]; + + u32 wordr2[4]; + + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + + u32 wordr3[4]; + + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + /** + * append salt + */ + + u32 s0[4]; + + s0[0] = salt_buf[0]; + s0[1] = salt_buf[1]; + s0[2] = salt_buf[2]; + s0[3] = salt_buf[3]; + + u32 s1[4]; + + s1[0] = salt_buf[4]; + s1[1] = salt_buf[5]; + s1[2] = salt_buf[6]; + s1[3] = salt_buf[7]; + + u32 s2[4]; + + s2[0] = 0; + s2[1] = 0; + s2[2] = 0; + s2[3] = 0; + + u32 s3[4]; + + s3[0] = 0; + s3[1] = 0; + s3[2] = 0; + s3[3] = 0; + + switch_buffer_by_offset (s0, s1, s2, s3, pw_len); + + const u32 pw_salt_len = pw_len + salt_len; + + u32x w0[4]; + + w0[0] = wordl0[0] | wordr0[0]; + w0[1] = wordl0[1] | wordr0[1]; + w0[2] = wordl0[2] | wordr0[2]; + w0[3] = wordl0[3] | wordr0[3]; + + u32x w1[4]; + + w1[0] = wordl1[0] | wordr1[0]; + w1[1] = wordl1[1] | wordr1[1]; + w1[2] = wordl1[2] | wordr1[2]; + w1[3] = wordl1[3] | wordr1[3]; + + u32x w2[4]; + + w2[0] = wordl2[0] | wordr2[0]; + w2[1] = wordl2[1] | wordr2[1]; + w2[2] = wordl2[2] | wordr2[2]; + w2[3] = wordl2[3] | wordr2[3]; + + u32x w3[4]; + + w3[0] = wordl3[0] | wordr3[0]; + w3[1] = wordl3[1] | wordr3[1]; + w3[2] = 0; + w3[3] = 0; + + /** + * sha1 + */ + + u32x final[256]; + + final[ 0] = swap_workaround (w0[0] | s0[0]); + final[ 1] = swap_workaround (w0[1] | s0[1]); + final[ 2] = swap_workaround (w0[2] | s0[2]); + final[ 3] = swap_workaround (w0[3] | s0[3]); + final[ 4] = swap_workaround (w1[0] | s1[0]); + final[ 5] = swap_workaround (w1[1] | s1[1]); + final[ 6] = swap_workaround (w1[2] | s1[2]); + final[ 7] = swap_workaround (w1[3] | s1[3]); + final[ 8] = swap_workaround (w2[0] | s2[0]); + final[ 9] = swap_workaround (w2[1] | s2[1]); + final[10] = swap_workaround (w2[2] | s2[2]); + final[11] = swap_workaround (w2[3] | s2[3]); + final[12] = swap_workaround (w3[0] | s3[0]); + final[13] = swap_workaround (w3[1] | s3[1]); + final[14] = 0; + final[15] = pw_salt_len * 8; + + u32x digest[5]; + + digest[0] = SHA1M_A; + digest[1] = SHA1M_B; + digest[2] = SHA1M_C; + digest[3] = SHA1M_D; + digest[4] = SHA1M_E; + + sha1_transform (&final[0], &final[4], &final[8], &final[12], digest); + + // prepare magic array range + + u32x lengthMagicArray = 0x20; + u32x offsetMagicArray = 0; + + lengthMagicArray += ((digest[0] >> 24) & 0xff) % 6; + lengthMagicArray += ((digest[0] >> 16) & 0xff) % 6; + lengthMagicArray += ((digest[0] >> 8) & 0xff) % 6; + lengthMagicArray += ((digest[0] >> 0) & 0xff) % 6; + lengthMagicArray += ((digest[1] >> 24) & 0xff) % 6; + lengthMagicArray += ((digest[1] >> 16) & 0xff) % 6; + lengthMagicArray += ((digest[1] >> 8) & 0xff) % 6; + lengthMagicArray += ((digest[1] >> 0) & 0xff) % 6; + lengthMagicArray += ((digest[2] >> 24) & 0xff) % 6; + lengthMagicArray += ((digest[2] >> 16) & 0xff) % 6; + offsetMagicArray += ((digest[2] >> 8) & 0xff) % 8; + offsetMagicArray += ((digest[2] >> 0) & 0xff) % 8; + offsetMagicArray += ((digest[3] >> 24) & 0xff) % 8; + offsetMagicArray += ((digest[3] >> 16) & 0xff) % 8; + offsetMagicArray += ((digest[3] >> 8) & 0xff) % 8; + offsetMagicArray += ((digest[3] >> 0) & 0xff) % 8; + offsetMagicArray += ((digest[4] >> 24) & 0xff) % 8; + offsetMagicArray += ((digest[4] >> 16) & 0xff) % 8; + offsetMagicArray += ((digest[4] >> 8) & 0xff) % 8; + offsetMagicArray += ((digest[4] >> 0) & 0xff) % 8; + + // final + + digest[0] = SHA1M_A; + digest[1] = SHA1M_B; + digest[2] = SHA1M_C; + digest[3] = SHA1M_D; + digest[4] = SHA1M_E; + + #pragma unroll 64 + for (int i = 0; i < 64; i++) final[i] = 0; + + final[0] = w0[0]; + final[1] = w0[1]; + final[2] = w0[2]; + final[3] = w0[3]; + final[4] = w1[0]; + final[5] = w1[1]; + final[6] = w1[2]; + final[7] = w1[3]; + + u32 final_len = pw_len; + + int i; + + // append MagicArray + + for (i = 0; i < lengthMagicArray - 4; i += 4) + { + const u32 tmp = GETSHIFTEDINT (theMagicArray, offsetMagicArray + i); + + SETSHIFTEDINT (final, final_len + i, tmp); + } + + const u32 mask = 0xffffffff >> (((i - lengthMagicArray) & 3) * 8); + + const u32 tmp = GETSHIFTEDINT (theMagicArray, offsetMagicArray + i) & mask; + + SETSHIFTEDINT (final, final_len + i, tmp); + + final_len += lengthMagicArray; + + // append Salt + + for (i = 0; i < salt_len + 1; i += 4) // +1 for the 0x80 + { + const u32 tmp = salt_buf[i / 4]; // attention, int[] not char[] + + SETSHIFTEDINT (final, final_len + i, tmp); + } + + final_len += salt_len; + + // calculate + + int left; + int off; + + for (left = final_len, off = 0; left >= 56; left -= 64, off += 16) + { + swap_buffer (&final[off]); + + sha1_transform (&final[off + 0], &final[off + 4], &final[off + 8], &final[off + 12], digest); + } + + swap_buffer (&final[off]); + + final[off + 14] = 0; + final[off + 15] = final_len * 8; + + sha1_transform (&final[off + 0], &final[off + 4], &final[off + 8], &final[off + 12], digest); + + const u32x r0 = digest[3]; + const u32x r1 = digest[4]; + const u32x r2 = digest[2]; + const u32x r3 = digest[1]; + + #include VECT_COMPARE_M + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m07800_m08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m07800_m16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m07800_s04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, c_combs[0].pw_len); + } + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * salt + */ + + u32 salt_buf[8]; + + salt_buf[0] = salt_bufs[salt_pos].salt_buf[0]; + salt_buf[1] = salt_bufs[salt_pos].salt_buf[1]; + salt_buf[2] = salt_bufs[salt_pos].salt_buf[2]; + salt_buf[3] = salt_bufs[salt_pos].salt_buf[3]; + salt_buf[4] = salt_bufs[salt_pos].salt_buf[4]; + salt_buf[5] = salt_bufs[salt_pos].salt_buf[5]; + salt_buf[6] = salt_bufs[salt_pos].salt_buf[6]; + salt_buf[7] = salt_bufs[salt_pos].salt_buf[7]; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = c_combs[il_pos].pw_len; + + const u32 pw_len = pw_l_len + pw_r_len; + + u32 wordr0[4]; + + wordr0[0] = c_combs[il_pos].i[0]; + wordr0[1] = c_combs[il_pos].i[1]; + wordr0[2] = c_combs[il_pos].i[2]; + wordr0[3] = c_combs[il_pos].i[3]; + + u32 wordr1[4]; + + wordr1[0] = c_combs[il_pos].i[4]; + wordr1[1] = c_combs[il_pos].i[5]; + wordr1[2] = c_combs[il_pos].i[6]; + wordr1[3] = c_combs[il_pos].i[7]; + + u32 wordr2[4]; + + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + + u32 wordr3[4]; + + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + /** + * append salt + */ + + u32 s0[4]; + + s0[0] = salt_buf[0]; + s0[1] = salt_buf[1]; + s0[2] = salt_buf[2]; + s0[3] = salt_buf[3]; + + u32 s1[4]; + + s1[0] = salt_buf[4]; + s1[1] = salt_buf[5]; + s1[2] = salt_buf[6]; + s1[3] = salt_buf[7]; + + u32 s2[4]; + + s2[0] = 0; + s2[1] = 0; + s2[2] = 0; + s2[3] = 0; + + u32 s3[4]; + + s3[0] = 0; + s3[1] = 0; + s3[2] = 0; + s3[3] = 0; + + switch_buffer_by_offset (s0, s1, s2, s3, pw_len); + + const u32 pw_salt_len = pw_len + salt_len; + + u32x w0[4]; + + w0[0] = wordl0[0] | wordr0[0]; + w0[1] = wordl0[1] | wordr0[1]; + w0[2] = wordl0[2] | wordr0[2]; + w0[3] = wordl0[3] | wordr0[3]; + + u32x w1[4]; + + w1[0] = wordl1[0] | wordr1[0]; + w1[1] = wordl1[1] | wordr1[1]; + w1[2] = wordl1[2] | wordr1[2]; + w1[3] = wordl1[3] | wordr1[3]; + + u32x w2[4]; + + w2[0] = wordl2[0] | wordr2[0]; + w2[1] = wordl2[1] | wordr2[1]; + w2[2] = wordl2[2] | wordr2[2]; + w2[3] = wordl2[3] | wordr2[3]; + + u32x w3[4]; + + w3[0] = wordl3[0] | wordr3[0]; + w3[1] = wordl3[1] | wordr3[1]; + w3[2] = 0; + w3[3] = 0; + + /** + * sha1 + */ + + u32x final[256]; + + final[ 0] = swap_workaround (w0[0] | s0[0]); + final[ 1] = swap_workaround (w0[1] | s0[1]); + final[ 2] = swap_workaround (w0[2] | s0[2]); + final[ 3] = swap_workaround (w0[3] | s0[3]); + final[ 4] = swap_workaround (w1[0] | s1[0]); + final[ 5] = swap_workaround (w1[1] | s1[1]); + final[ 6] = swap_workaround (w1[2] | s1[2]); + final[ 7] = swap_workaround (w1[3] | s1[3]); + final[ 8] = swap_workaround (w2[0] | s2[0]); + final[ 9] = swap_workaround (w2[1] | s2[1]); + final[10] = swap_workaround (w2[2] | s2[2]); + final[11] = swap_workaround (w2[3] | s2[3]); + final[12] = swap_workaround (w3[0] | s3[0]); + final[13] = swap_workaround (w3[1] | s3[1]); + final[14] = 0; + final[15] = pw_salt_len * 8; + + u32x digest[5]; + + digest[0] = SHA1M_A; + digest[1] = SHA1M_B; + digest[2] = SHA1M_C; + digest[3] = SHA1M_D; + digest[4] = SHA1M_E; + + sha1_transform (&final[0], &final[4], &final[8], &final[12], digest); + + // prepare magic array range + + u32x lengthMagicArray = 0x20; + u32x offsetMagicArray = 0; + + lengthMagicArray += ((digest[0] >> 24) & 0xff) % 6; + lengthMagicArray += ((digest[0] >> 16) & 0xff) % 6; + lengthMagicArray += ((digest[0] >> 8) & 0xff) % 6; + lengthMagicArray += ((digest[0] >> 0) & 0xff) % 6; + lengthMagicArray += ((digest[1] >> 24) & 0xff) % 6; + lengthMagicArray += ((digest[1] >> 16) & 0xff) % 6; + lengthMagicArray += ((digest[1] >> 8) & 0xff) % 6; + lengthMagicArray += ((digest[1] >> 0) & 0xff) % 6; + lengthMagicArray += ((digest[2] >> 24) & 0xff) % 6; + lengthMagicArray += ((digest[2] >> 16) & 0xff) % 6; + offsetMagicArray += ((digest[2] >> 8) & 0xff) % 8; + offsetMagicArray += ((digest[2] >> 0) & 0xff) % 8; + offsetMagicArray += ((digest[3] >> 24) & 0xff) % 8; + offsetMagicArray += ((digest[3] >> 16) & 0xff) % 8; + offsetMagicArray += ((digest[3] >> 8) & 0xff) % 8; + offsetMagicArray += ((digest[3] >> 0) & 0xff) % 8; + offsetMagicArray += ((digest[4] >> 24) & 0xff) % 8; + offsetMagicArray += ((digest[4] >> 16) & 0xff) % 8; + offsetMagicArray += ((digest[4] >> 8) & 0xff) % 8; + offsetMagicArray += ((digest[4] >> 0) & 0xff) % 8; + + // final + + digest[0] = SHA1M_A; + digest[1] = SHA1M_B; + digest[2] = SHA1M_C; + digest[3] = SHA1M_D; + digest[4] = SHA1M_E; + + #pragma unroll 64 + for (int i = 0; i < 64; i++) final[i] = 0; + + final[0] = w0[0]; + final[1] = w0[1]; + final[2] = w0[2]; + final[3] = w0[3]; + final[4] = w1[0]; + final[5] = w1[1]; + final[6] = w1[2]; + final[7] = w1[3]; + + u32 final_len = pw_len; + + int i; + + // append MagicArray + + for (i = 0; i < lengthMagicArray - 4; i += 4) + { + const u32 tmp = GETSHIFTEDINT (theMagicArray, offsetMagicArray + i); + + SETSHIFTEDINT (final, final_len + i, tmp); + } + + const u32 mask = 0xffffffff >> (((i - lengthMagicArray) & 3) * 8); + + const u32 tmp = GETSHIFTEDINT (theMagicArray, offsetMagicArray + i) & mask; + + SETSHIFTEDINT (final, final_len + i, tmp); + + final_len += lengthMagicArray; + + // append Salt + + for (i = 0; i < salt_len + 1; i += 4) // +1 for the 0x80 + { + const u32 tmp = salt_buf[i / 4]; // attention, int[] not char[] + + SETSHIFTEDINT (final, final_len + i, tmp); + } + + final_len += salt_len; + + // calculate + + int left; + int off; + + for (left = final_len, off = 0; left >= 56; left -= 64, off += 16) + { + swap_buffer (&final[off]); + + sha1_transform (&final[off + 0], &final[off + 4], &final[off + 8], &final[off + 12], digest); + } + + swap_buffer (&final[off]); + + final[off + 14] = 0; + final[off + 15] = final_len * 8; + + sha1_transform (&final[off + 0], &final[off + 4], &final[off + 8], &final[off + 12], digest); + + const u32x r0 = digest[3]; + const u32x r1 = digest[4]; + const u32x r2 = digest[2]; + const u32x r3 = digest[1]; + + #include VECT_COMPARE_S + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m07800_s08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m07800_s16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/nv/m07800_a3.cu b/nv/m07800_a3.cu new file mode 100644 index 0000000000..dd7a7f92b2 --- /dev/null +++ b/nv/m07800_a3.cu @@ -0,0 +1,860 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _SAPG_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW2 +#define VECT_SIZE1 +#endif + +#define DGST_R0 3 +#define DGST_R1 4 +#define DGST_R2 2 +#define DGST_R3 1 + +#include "include/kernel_functions.c" +#include "types_nv.c" +#include "common_nv.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +__device__ static u32 bytealign (u32 src0, u32 src1, u32 src2) +{ + return (u32) (((((u64)src0) << 32) | (u64)src1) >> ((src2 & 3)*8)); +} + +#if __CUDA_ARCH__ >= 350 +#define GETSHIFTEDINT(a,n) __funnelshift_r ((a)[((n)/4)+0], (a)[((n)/4)+1], (n & 3) * 8) +#elif __CUDA_ARCH__ >= 200 +#define GETSHIFTEDINT(a,n) __byte_perm ((a)[((n)/4)+0], (a)[((n)/4)+1], (0x76543210 >> ((n & 3) * 4)) & 0xffff) +#else +#define GETSHIFTEDINT(a,n) bytealign ((a)[((n)/4)+1], (a)[((n)/4)+0], n) +#endif + +#define SETSHIFTEDINT(a,n,v) \ +{ \ + const u32 s = ((n) & 3) * 8; \ + const u64 x = (u64) (v) << s; \ + (a)[((n)/4)+0] |= x; \ + (a)[((n)/4)+1] = x >> 32; \ +} + +__device__ __constant__ u32 theMagicArray[64] = +{ + 0x1451ac91,0x4354679f,0xe03be724,0xc27b7428,0xeb133386,0x5ccb4f5a,0x37730a08,0x2f1c5d0e, + 0xe5e68f33,0xddae9bf8,0x8d4bf216,0xdcd4e12c,0x9ddfcbb0,0x176d70d4,0x3f424df9,0x94111b9b, + 0x9bc15b9f,0x039d0506,0x8a135e9d,0xe86a9a1e,0x17147cd9,0xf62ac758,0x0a6399a1,0xc370fdd7, + 0x13745ef6,0x040bc903,0x26f79826,0x2593928a,0x230da2b0,0x6d7963ed,0x3cfa3213,0xa39a0235, + 0x0a8eddb3,0xc351bf24,0x9f55cd7c,0x4c94af37,0x82520829,0x374e3bb2,0x9107179f,0xcdfd3b11, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0 +}; + +__device__ static void swap_buffer (u32x final[16]) +{ + final[ 0] = swap_workaround (final[ 0]); + final[ 1] = swap_workaround (final[ 1]); + final[ 2] = swap_workaround (final[ 2]); + final[ 3] = swap_workaround (final[ 3]); + final[ 4] = swap_workaround (final[ 4]); + final[ 5] = swap_workaround (final[ 5]); + final[ 6] = swap_workaround (final[ 6]); + final[ 7] = swap_workaround (final[ 7]); + final[ 8] = swap_workaround (final[ 8]); + final[ 9] = swap_workaround (final[ 9]); + final[10] = swap_workaround (final[10]); + final[11] = swap_workaround (final[11]); + final[12] = swap_workaround (final[12]); + final[13] = swap_workaround (final[13]); + final[14] = swap_workaround (final[14]); + final[15] = swap_workaround (final[15]); +} + +__device__ static void sha1_transform (const u32x w0[4], const u32x w1[4], const u32x w2[4], const u32x w3[4], u32x digest[5]) +{ + u32x A = digest[0]; + u32x B = digest[1]; + u32x C = digest[2]; + u32x D = digest[3]; + u32x E = digest[4]; + + u32x w0_t = w0[0]; + u32x w1_t = w0[1]; + u32x w2_t = w0[2]; + u32x w3_t = w0[3]; + u32x w4_t = w1[0]; + u32x w5_t = w1[1]; + u32x w6_t = w1[2]; + u32x w7_t = w1[3]; + u32x w8_t = w2[0]; + u32x w9_t = w2[1]; + u32x wa_t = w2[2]; + u32x wb_t = w2[3]; + u32x wc_t = w3[0]; + u32x wd_t = w3[1]; + u32x we_t = w3[2]; + u32x wf_t = w3[3]; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, A, B, C, D, E, w0_t); + SHA1_STEP (SHA1_F0o, E, A, B, C, D, w1_t); + SHA1_STEP (SHA1_F0o, D, E, A, B, C, w2_t); + SHA1_STEP (SHA1_F0o, C, D, E, A, B, w3_t); + SHA1_STEP (SHA1_F0o, B, C, D, E, A, w4_t); + SHA1_STEP (SHA1_F0o, A, B, C, D, E, w5_t); + SHA1_STEP (SHA1_F0o, E, A, B, C, D, w6_t); + SHA1_STEP (SHA1_F0o, D, E, A, B, C, w7_t); + SHA1_STEP (SHA1_F0o, C, D, E, A, B, w8_t); + SHA1_STEP (SHA1_F0o, B, C, D, E, A, w9_t); + SHA1_STEP (SHA1_F0o, A, B, C, D, E, wa_t); + SHA1_STEP (SHA1_F0o, E, A, B, C, D, wb_t); + SHA1_STEP (SHA1_F0o, D, E, A, B, C, wc_t); + SHA1_STEP (SHA1_F0o, C, D, E, A, B, wd_t); + SHA1_STEP (SHA1_F0o, B, C, D, E, A, we_t); + SHA1_STEP (SHA1_F0o, A, B, C, D, E, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F0o, E, A, B, C, D, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F0o, D, E, A, B, C, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F0o, C, D, E, A, B, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F0o, B, C, D, E, A, w3_t); + + #undef K + #define K SHA1C01 + + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w7_t); + + #undef K + #define K SHA1C02 + + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, wb_t); + + #undef K + #define K SHA1C03 + + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, wf_t); + + digest[0] += A; + digest[1] += B; + digest[2] += C; + digest[3] += D; + digest[4] += E; +} + +__device__ __constant__ bf_t c_bfs[1024]; + +__device__ static void m07800m (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], const u32 pw_len, const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset) +{ + /** + * modifier + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + const u32 lid = threadIdx.x; + + w0[0] = swap_workaround (w0[0]); + w0[1] = swap_workaround (w0[1]); + w0[2] = swap_workaround (w0[2]); + w0[3] = swap_workaround (w0[3]); + + w1[0] = swap_workaround (w1[0]); + w1[1] = swap_workaround (w1[1]); + w1[2] = swap_workaround (w1[2]); + w1[3] = swap_workaround (w1[3]); + + /** + * salt + */ + + u32 salt_buf[8]; + + salt_buf[0] = salt_bufs[salt_pos].salt_buf[0]; + salt_buf[1] = salt_bufs[salt_pos].salt_buf[1]; + salt_buf[2] = salt_bufs[salt_pos].salt_buf[2]; + salt_buf[3] = salt_bufs[salt_pos].salt_buf[3]; + salt_buf[4] = salt_bufs[salt_pos].salt_buf[4]; + salt_buf[5] = salt_bufs[salt_pos].salt_buf[5]; + salt_buf[6] = salt_bufs[salt_pos].salt_buf[6]; + salt_buf[7] = salt_bufs[salt_pos].salt_buf[7]; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + u32 s0[4]; + + s0[0] = salt_buf[0]; + s0[1] = salt_buf[1]; + s0[2] = salt_buf[2]; + s0[3] = salt_buf[3]; + + u32 s1[4]; + + s1[0] = salt_buf[4]; + s1[1] = salt_buf[5]; + s1[2] = salt_buf[6]; + s1[3] = salt_buf[7]; + + u32 s2[4]; + + s2[0] = 0; + s2[1] = 0; + s2[2] = 0; + s2[3] = 0; + + u32 s3[4]; + + s3[0] = 0; + s3[1] = 0; + s3[2] = 0; + s3[3] = 0; + + switch_buffer_by_offset (s0, s1, s2, s3, pw_len); + + const u32 pw_salt_len = pw_len + salt_len; + + /** + * loop + */ + + u32x w0l = w0[0]; + + for (u32 il_pos = 0; il_pos < bfs_cnt; il_pos++) + { + const u32 w0r = swap_workaround (c_bfs[il_pos].i); + + w0[0] = w0l | w0r; + + /** + * sha1 + */ + + u32x final[256]; + + final[ 0] = swap_workaround (w0[0] | s0[0]); + final[ 1] = swap_workaround (w0[1] | s0[1]); + final[ 2] = swap_workaround (w0[2] | s0[2]); + final[ 3] = swap_workaround (w0[3] | s0[3]); + final[ 4] = swap_workaround (w1[0] | s1[0]); + final[ 5] = swap_workaround (w1[1] | s1[1]); + final[ 6] = swap_workaround (w1[2] | s1[2]); + final[ 7] = swap_workaround (w1[3] | s1[3]); + final[ 8] = swap_workaround (w2[0] | s2[0]); + final[ 9] = swap_workaround (w2[1] | s2[1]); + final[10] = swap_workaround (w2[2] | s2[2]); + final[11] = swap_workaround (w2[3] | s2[3]); + final[12] = swap_workaround (w3[0] | s3[0]); + final[13] = swap_workaround (w3[1] | s3[1]); + final[14] = 0; + final[15] = pw_salt_len * 8; + + u32x digest[5]; + + digest[0] = SHA1M_A; + digest[1] = SHA1M_B; + digest[2] = SHA1M_C; + digest[3] = SHA1M_D; + digest[4] = SHA1M_E; + + sha1_transform (&final[0], &final[4], &final[8], &final[12], digest); + + // prepare magic array range + + u32x lengthMagicArray = 0x20; + u32x offsetMagicArray = 0; + + lengthMagicArray += ((digest[0] >> 24) & 0xff) % 6; + lengthMagicArray += ((digest[0] >> 16) & 0xff) % 6; + lengthMagicArray += ((digest[0] >> 8) & 0xff) % 6; + lengthMagicArray += ((digest[0] >> 0) & 0xff) % 6; + lengthMagicArray += ((digest[1] >> 24) & 0xff) % 6; + lengthMagicArray += ((digest[1] >> 16) & 0xff) % 6; + lengthMagicArray += ((digest[1] >> 8) & 0xff) % 6; + lengthMagicArray += ((digest[1] >> 0) & 0xff) % 6; + lengthMagicArray += ((digest[2] >> 24) & 0xff) % 6; + lengthMagicArray += ((digest[2] >> 16) & 0xff) % 6; + offsetMagicArray += ((digest[2] >> 8) & 0xff) % 8; + offsetMagicArray += ((digest[2] >> 0) & 0xff) % 8; + offsetMagicArray += ((digest[3] >> 24) & 0xff) % 8; + offsetMagicArray += ((digest[3] >> 16) & 0xff) % 8; + offsetMagicArray += ((digest[3] >> 8) & 0xff) % 8; + offsetMagicArray += ((digest[3] >> 0) & 0xff) % 8; + offsetMagicArray += ((digest[4] >> 24) & 0xff) % 8; + offsetMagicArray += ((digest[4] >> 16) & 0xff) % 8; + offsetMagicArray += ((digest[4] >> 8) & 0xff) % 8; + offsetMagicArray += ((digest[4] >> 0) & 0xff) % 8; + + // final + + digest[0] = SHA1M_A; + digest[1] = SHA1M_B; + digest[2] = SHA1M_C; + digest[3] = SHA1M_D; + digest[4] = SHA1M_E; + + #pragma unroll 64 + for (int i = 0; i < 64; i++) final[i] = 0; + + final[0] = w0[0]; + final[1] = w0[1]; + final[2] = w0[2]; + final[3] = w0[3]; + final[4] = w1[0]; + final[5] = w1[1]; + final[6] = w1[2]; + final[7] = w1[3]; + + u32 final_len = pw_len; + + int i; + + // append MagicArray + + for (i = 0; i < lengthMagicArray - 4; i += 4) + { + const u32 tmp = GETSHIFTEDINT (theMagicArray, offsetMagicArray + i); + + SETSHIFTEDINT (final, final_len + i, tmp); + } + + const u32 mask = 0xffffffff >> (((i - lengthMagicArray) & 3) * 8); + + const u32 tmp = GETSHIFTEDINT (theMagicArray, offsetMagicArray + i) & mask; + + SETSHIFTEDINT (final, final_len + i, tmp); + + final_len += lengthMagicArray; + + // append Salt + + for (i = 0; i < salt_len + 1; i += 4) // +1 for the 0x80 + { + const u32 tmp = salt_buf[i / 4]; // attention, int[] not char[] + + SETSHIFTEDINT (final, final_len + i, tmp); + } + + final_len += salt_len; + + // calculate + + int left; + int off; + + for (left = final_len, off = 0; left >= 56; left -= 64, off += 16) + { + swap_buffer (&final[off]); + + sha1_transform (&final[off + 0], &final[off + 4], &final[off + 8], &final[off + 12], digest); + } + + swap_buffer (&final[off]); + + final[off + 14] = 0; + final[off + 15] = final_len * 8; + + sha1_transform (&final[off + 0], &final[off + 4], &final[off + 8], &final[off + 12], digest); + + const u32x r0 = digest[3]; + const u32x r1 = digest[4]; + const u32x r2 = digest[2]; + const u32x r3 = digest[1]; + + #include VECT_COMPARE_M + } +} + +__device__ static void m07800s (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], const u32 pw_len, const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset) +{ + /** + * modifier + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + const u32 lid = threadIdx.x; + + w0[0] = swap_workaround (w0[0]); + w0[1] = swap_workaround (w0[1]); + w0[2] = swap_workaround (w0[2]); + w0[3] = swap_workaround (w0[3]); + + w1[0] = swap_workaround (w1[0]); + w1[1] = swap_workaround (w1[1]); + w1[2] = swap_workaround (w1[2]); + w1[3] = swap_workaround (w1[3]); + + /** + * salt + */ + + u32 salt_buf[8]; + + salt_buf[0] = salt_bufs[salt_pos].salt_buf[0]; + salt_buf[1] = salt_bufs[salt_pos].salt_buf[1]; + salt_buf[2] = salt_bufs[salt_pos].salt_buf[2]; + salt_buf[3] = salt_bufs[salt_pos].salt_buf[3]; + salt_buf[4] = salt_bufs[salt_pos].salt_buf[4]; + salt_buf[5] = salt_bufs[salt_pos].salt_buf[5]; + salt_buf[6] = salt_bufs[salt_pos].salt_buf[6]; + salt_buf[7] = salt_bufs[salt_pos].salt_buf[7]; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + u32 s0[4]; + + s0[0] = salt_buf[0]; + s0[1] = salt_buf[1]; + s0[2] = salt_buf[2]; + s0[3] = salt_buf[3]; + + u32 s1[4]; + + s1[0] = salt_buf[4]; + s1[1] = salt_buf[5]; + s1[2] = salt_buf[6]; + s1[3] = salt_buf[7]; + + u32 s2[4]; + + s2[0] = 0; + s2[1] = 0; + s2[2] = 0; + s2[3] = 0; + + u32 s3[4]; + + s3[0] = 0; + s3[1] = 0; + s3[2] = 0; + s3[3] = 0; + + switch_buffer_by_offset (s0, s1, s2, s3, pw_len); + + const u32 pw_salt_len = pw_len + salt_len; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * loop + */ + + u32x w0l = w0[0]; + + for (u32 il_pos = 0; il_pos < bfs_cnt; il_pos++) + { + const u32 w0r = swap_workaround (c_bfs[il_pos].i); + + w0[0] = w0l | w0r; + + /** + * sha1 + */ + + u32x final[256]; + + final[ 0] = swap_workaround (w0[0] | s0[0]); + final[ 1] = swap_workaround (w0[1] | s0[1]); + final[ 2] = swap_workaround (w0[2] | s0[2]); + final[ 3] = swap_workaround (w0[3] | s0[3]); + final[ 4] = swap_workaround (w1[0] | s1[0]); + final[ 5] = swap_workaround (w1[1] | s1[1]); + final[ 6] = swap_workaround (w1[2] | s1[2]); + final[ 7] = swap_workaround (w1[3] | s1[3]); + final[ 8] = swap_workaround (w2[0] | s2[0]); + final[ 9] = swap_workaround (w2[1] | s2[1]); + final[10] = swap_workaround (w2[2] | s2[2]); + final[11] = swap_workaround (w2[3] | s2[3]); + final[12] = swap_workaround (w3[0] | s3[0]); + final[13] = swap_workaround (w3[1] | s3[1]); + final[14] = 0; + final[15] = pw_salt_len * 8; + + u32x digest[5]; + + digest[0] = SHA1M_A; + digest[1] = SHA1M_B; + digest[2] = SHA1M_C; + digest[3] = SHA1M_D; + digest[4] = SHA1M_E; + + sha1_transform (&final[0], &final[4], &final[8], &final[12], digest); + + // prepare magic array range + + u32x lengthMagicArray = 0x20; + u32x offsetMagicArray = 0; + + lengthMagicArray += ((digest[0] >> 24) & 0xff) % 6; + lengthMagicArray += ((digest[0] >> 16) & 0xff) % 6; + lengthMagicArray += ((digest[0] >> 8) & 0xff) % 6; + lengthMagicArray += ((digest[0] >> 0) & 0xff) % 6; + lengthMagicArray += ((digest[1] >> 24) & 0xff) % 6; + lengthMagicArray += ((digest[1] >> 16) & 0xff) % 6; + lengthMagicArray += ((digest[1] >> 8) & 0xff) % 6; + lengthMagicArray += ((digest[1] >> 0) & 0xff) % 6; + lengthMagicArray += ((digest[2] >> 24) & 0xff) % 6; + lengthMagicArray += ((digest[2] >> 16) & 0xff) % 6; + offsetMagicArray += ((digest[2] >> 8) & 0xff) % 8; + offsetMagicArray += ((digest[2] >> 0) & 0xff) % 8; + offsetMagicArray += ((digest[3] >> 24) & 0xff) % 8; + offsetMagicArray += ((digest[3] >> 16) & 0xff) % 8; + offsetMagicArray += ((digest[3] >> 8) & 0xff) % 8; + offsetMagicArray += ((digest[3] >> 0) & 0xff) % 8; + offsetMagicArray += ((digest[4] >> 24) & 0xff) % 8; + offsetMagicArray += ((digest[4] >> 16) & 0xff) % 8; + offsetMagicArray += ((digest[4] >> 8) & 0xff) % 8; + offsetMagicArray += ((digest[4] >> 0) & 0xff) % 8; + + // final + + digest[0] = SHA1M_A; + digest[1] = SHA1M_B; + digest[2] = SHA1M_C; + digest[3] = SHA1M_D; + digest[4] = SHA1M_E; + + #pragma unroll 64 + for (int i = 0; i < 64; i++) final[i] = 0; + + final[0] = w0[0]; + final[1] = w0[1]; + final[2] = w0[2]; + final[3] = w0[3]; + final[4] = w1[0]; + final[5] = w1[1]; + final[6] = w1[2]; + final[7] = w1[3]; + + u32 final_len = pw_len; + + int i; + + // append MagicArray + + for (i = 0; i < lengthMagicArray - 4; i += 4) + { + const u32 tmp = GETSHIFTEDINT (theMagicArray, offsetMagicArray + i); + + SETSHIFTEDINT (final, final_len + i, tmp); + } + + const u32 mask = 0xffffffff >> (((i - lengthMagicArray) & 3) * 8); + + const u32 tmp = GETSHIFTEDINT (theMagicArray, offsetMagicArray + i) & mask; + + SETSHIFTEDINT (final, final_len + i, tmp); + + final_len += lengthMagicArray; + + // append Salt + + for (i = 0; i < salt_len + 1; i += 4) // +1 for the 0x80 + { + const u32 tmp = salt_buf[i / 4]; // attention, int[] not char[] + + SETSHIFTEDINT (final, final_len + i, tmp); + } + + final_len += salt_len; + + // calculate + + int left; + int off; + + for (left = final_len, off = 0; left >= 56; left -= 64, off += 16) + { + swap_buffer (&final[off]); + + sha1_transform (&final[off + 0], &final[off + 4], &final[off + 8], &final[off + 12], digest); + } + + swap_buffer (&final[off]); + + final[off + 14] = 0; + final[off + 15] = final_len * 8; + + sha1_transform (&final[off + 0], &final[off + 4], &final[off + 8], &final[off + 12], digest); + + const u32x r0 = digest[3]; + const u32x r1 = digest[4]; + const u32x r2 = digest[2]; + const u32x r3 = digest[1]; + + #include VECT_COMPARE_S + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m07800_m04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m07800m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m07800_m08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m07800m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m07800_m16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m07800_s04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m07800s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m07800_s08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m07800s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m07800_s16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/nv/m07900.cu b/nv/m07900.cu new file mode 100644 index 0000000000..5bff78d2b5 --- /dev/null +++ b/nv/m07900.cu @@ -0,0 +1,387 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _SHA512_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW2 +#define VECT_SIZE1 +#endif + +#define DGST_R0 0 +#define DGST_R1 1 +#define DGST_R2 2 +#define DGST_R3 3 + +#include "include/kernel_functions.c" +#include "types_nv.c" +#include "common_nv.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +__device__ __constant__ u64 k[80] = +{ + SHA512C00, SHA512C01, SHA512C02, SHA512C03, + SHA512C04, SHA512C05, SHA512C06, SHA512C07, + SHA512C08, SHA512C09, SHA512C0a, SHA512C0b, + SHA512C0c, SHA512C0d, SHA512C0e, SHA512C0f, + SHA512C10, SHA512C11, SHA512C12, SHA512C13, + SHA512C14, SHA512C15, SHA512C16, SHA512C17, + SHA512C18, SHA512C19, SHA512C1a, SHA512C1b, + SHA512C1c, SHA512C1d, SHA512C1e, SHA512C1f, + SHA512C20, SHA512C21, SHA512C22, SHA512C23, + SHA512C24, SHA512C25, SHA512C26, SHA512C27, + SHA512C28, SHA512C29, SHA512C2a, SHA512C2b, + SHA512C2c, SHA512C2d, SHA512C2e, SHA512C2f, + SHA512C30, SHA512C31, SHA512C32, SHA512C33, + SHA512C34, SHA512C35, SHA512C36, SHA512C37, + SHA512C38, SHA512C39, SHA512C3a, SHA512C3b, + SHA512C3c, SHA512C3d, SHA512C3e, SHA512C3f, + SHA512C40, SHA512C41, SHA512C42, SHA512C43, + SHA512C44, SHA512C45, SHA512C46, SHA512C47, + SHA512C48, SHA512C49, SHA512C4a, SHA512C4b, + SHA512C4c, SHA512C4d, SHA512C4e, SHA512C4f, +}; + +#define ROUND_EXPAND() \ +{ \ + w0_t = SHA512_EXPAND (we_t, w9_t, w1_t, w0_t); \ + w1_t = SHA512_EXPAND (wf_t, wa_t, w2_t, w1_t); \ + w2_t = SHA512_EXPAND (w0_t, wb_t, w3_t, w2_t); \ + w3_t = SHA512_EXPAND (w1_t, wc_t, w4_t, w3_t); \ + w4_t = SHA512_EXPAND (w2_t, wd_t, w5_t, w4_t); \ + w5_t = SHA512_EXPAND (w3_t, we_t, w6_t, w5_t); \ + w6_t = SHA512_EXPAND (w4_t, wf_t, w7_t, w6_t); \ + w7_t = SHA512_EXPAND (w5_t, w0_t, w8_t, w7_t); \ + w8_t = SHA512_EXPAND (w6_t, w1_t, w9_t, w8_t); \ + w9_t = SHA512_EXPAND (w7_t, w2_t, wa_t, w9_t); \ + wa_t = SHA512_EXPAND (w8_t, w3_t, wb_t, wa_t); \ + wb_t = SHA512_EXPAND (w9_t, w4_t, wc_t, wb_t); \ + wc_t = SHA512_EXPAND (wa_t, w5_t, wd_t, wc_t); \ + wd_t = SHA512_EXPAND (wb_t, w6_t, we_t, wd_t); \ + we_t = SHA512_EXPAND (wc_t, w7_t, wf_t, we_t); \ + wf_t = SHA512_EXPAND (wd_t, w8_t, w0_t, wf_t); \ +} + +#define ROUND_STEP(i) \ +{ \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, a, b, c, d, e, f, g, h, w0_t, k[i + 0]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, h, a, b, c, d, e, f, g, w1_t, k[i + 1]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, g, h, a, b, c, d, e, f, w2_t, k[i + 2]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, f, g, h, a, b, c, d, e, w3_t, k[i + 3]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, e, f, g, h, a, b, c, d, w4_t, k[i + 4]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, d, e, f, g, h, a, b, c, w5_t, k[i + 5]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, c, d, e, f, g, h, a, b, w6_t, k[i + 6]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, b, c, d, e, f, g, h, a, w7_t, k[i + 7]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, a, b, c, d, e, f, g, h, w8_t, k[i + 8]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, h, a, b, c, d, e, f, g, w9_t, k[i + 9]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, g, h, a, b, c, d, e, f, wa_t, k[i + 10]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, f, g, h, a, b, c, d, e, wb_t, k[i + 11]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, e, f, g, h, a, b, c, d, wc_t, k[i + 12]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, d, e, f, g, h, a, b, c, wd_t, k[i + 13]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, c, d, e, f, g, h, a, b, we_t, k[i + 14]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, b, c, d, e, f, g, h, a, wf_t, k[i + 15]); \ +} + +__device__ static void sha512_transform (const u64 w[16], u64 dgst[8]) +{ + u64 a = dgst[0]; + u64 b = dgst[1]; + u64 c = dgst[2]; + u64 d = dgst[3]; + u64 e = dgst[4]; + u64 f = dgst[5]; + u64 g = dgst[6]; + u64 h = dgst[7]; + + u64 w0_t = w[ 0]; + u64 w1_t = w[ 1]; + u64 w2_t = w[ 2]; + u64 w3_t = w[ 3]; + u64 w4_t = w[ 4]; + u64 w5_t = w[ 5]; + u64 w6_t = w[ 6]; + u64 w7_t = w[ 7]; + u64 w8_t = w[ 8]; + u64 w9_t = w[ 9]; + u64 wa_t = w[10]; + u64 wb_t = w[11]; + u64 wc_t = w[12]; + u64 wd_t = w[13]; + u64 we_t = w[14]; + u64 wf_t = w[15]; + + ROUND_STEP (0); + + for (int i = 16; i < 80; i += 16) + { + ROUND_EXPAND (); ROUND_STEP (i); + } + + dgst[0] += a; + dgst[1] += b; + dgst[2] += c; + dgst[3] += d; + dgst[4] += e; + dgst[5] += f; + dgst[6] += g; + dgst[7] += h; +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m07900_init (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, drupal7_tmp_t *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = pws[gid].i[ 8]; + w2[1] = pws[gid].i[ 9]; + w2[2] = pws[gid].i[10]; + w2[3] = pws[gid].i[11]; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + append_0x80_4 (w0, w1, w2, w3, pw_len); + + /** + * salt + */ + + u32 salt_buf[2]; + + salt_buf[0] = salt_bufs[salt_pos].salt_buf[0]; + salt_buf[1] = salt_bufs[salt_pos].salt_buf[1]; + + /** + * init + */ + + u32 block_len = 8 + pw_len; + + u64 w[16]; + + w[ 0] = ((u64) swap_workaround (salt_buf[0])) << 32 | (u64) swap_workaround (salt_buf[1]); + w[ 1] = ((u64) swap_workaround (w0[0])) << 32 | (u64) swap_workaround (w0[1]); + w[ 2] = ((u64) swap_workaround (w0[2])) << 32 | (u64) swap_workaround (w0[3]); + w[ 3] = ((u64) swap_workaround (w1[0])) << 32 | (u64) swap_workaround (w1[1]); + w[ 4] = ((u64) swap_workaround (w1[2])) << 32 | (u64) swap_workaround (w1[3]); + w[ 5] = ((u64) swap_workaround (w2[0])) << 32 | (u64) swap_workaround (w2[1]); + w[ 6] = ((u64) swap_workaround (w2[2])) << 32 | (u64) swap_workaround (w2[3]); + w[ 7] = ((u64) swap_workaround (w3[0])) << 32 | (u64) swap_workaround (w3[1]); + w[ 8] = ((u64) swap_workaround (w3[2])) << 32 | (u64) swap_workaround (w3[3]); + w[ 9] = 0; + w[10] = 0; + w[11] = 0; + w[12] = 0; + w[13] = 0; + w[14] = 0; + w[15] = block_len * 8; + + /** + * init + */ + + u64 digest[8]; + + digest[0] = SHA512M_A; + digest[1] = SHA512M_B; + digest[2] = SHA512M_C; + digest[3] = SHA512M_D; + digest[4] = SHA512M_E; + digest[5] = SHA512M_F; + digest[6] = SHA512M_G; + digest[7] = SHA512M_H; + + sha512_transform (w, digest); + + tmps[gid].digest_buf[0] = digest[0]; + tmps[gid].digest_buf[1] = digest[1]; + tmps[gid].digest_buf[2] = digest[2]; + tmps[gid].digest_buf[3] = digest[3]; + tmps[gid].digest_buf[4] = digest[4]; + tmps[gid].digest_buf[5] = digest[5]; + tmps[gid].digest_buf[6] = digest[6]; + tmps[gid].digest_buf[7] = digest[7]; +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m07900_loop (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, drupal7_tmp_t *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = pws[gid].i[ 8]; + w2[1] = pws[gid].i[ 9]; + w2[2] = pws[gid].i[10]; + w2[3] = pws[gid].i[11]; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + append_0x80_4 (w0, w1, w2, w3, pw_len); + + /** + * digest + */ + + u64 digest[8]; + + digest[0] = tmps[gid].digest_buf[0]; + digest[1] = tmps[gid].digest_buf[1]; + digest[2] = tmps[gid].digest_buf[2]; + digest[3] = tmps[gid].digest_buf[3]; + digest[4] = tmps[gid].digest_buf[4]; + digest[5] = tmps[gid].digest_buf[5]; + digest[6] = tmps[gid].digest_buf[6]; + digest[7] = tmps[gid].digest_buf[7]; + + /** + * loop + */ + + u32 block_len = (64 + pw_len); + + u64 w[16]; + + w[ 0] = 0; + w[ 1] = 0; + w[ 2] = 0; + w[ 3] = 0; + w[ 4] = 0; + w[ 5] = 0; + w[ 6] = 0; + w[ 7] = 0; + w[ 8] = ((u64) swap_workaround (w0[0])) << 32 | (u64) swap_workaround (w0[1]); + w[ 9] = ((u64) swap_workaround (w0[2])) << 32 | (u64) swap_workaround (w0[3]); + w[10] = ((u64) swap_workaround (w1[0])) << 32 | (u64) swap_workaround (w1[1]); + w[11] = ((u64) swap_workaround (w1[2])) << 32 | (u64) swap_workaround (w1[3]); + w[12] = ((u64) swap_workaround (w2[0])) << 32 | (u64) swap_workaround (w2[1]); + w[13] = ((u64) swap_workaround (w2[2])) << 32 | (u64) swap_workaround (w2[3]); + w[14] = 0; + w[15] = block_len * 8; + + /** + * init + */ + + for (u32 i = 0; i < loop_cnt; i++) + { + w[ 0] = digest[0]; + w[ 1] = digest[1]; + w[ 2] = digest[2]; + w[ 3] = digest[3]; + w[ 4] = digest[4]; + w[ 5] = digest[5]; + w[ 6] = digest[6]; + w[ 7] = digest[7]; + + digest[0] = SHA512M_A; + digest[1] = SHA512M_B; + digest[2] = SHA512M_C; + digest[3] = SHA512M_D; + digest[4] = SHA512M_E; + digest[5] = SHA512M_F; + digest[6] = SHA512M_G; + digest[7] = SHA512M_H; + + sha512_transform (w, digest); + } + + tmps[gid].digest_buf[0] = digest[0]; + tmps[gid].digest_buf[1] = digest[1]; + tmps[gid].digest_buf[2] = digest[2]; + tmps[gid].digest_buf[3] = digest[3]; + tmps[gid].digest_buf[4] = digest[4]; + tmps[gid].digest_buf[5] = digest[5]; + tmps[gid].digest_buf[6] = digest[6]; + tmps[gid].digest_buf[7] = digest[7]; +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m07900_comp (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, drupal7_tmp_t *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + const u32 lid = threadIdx.x; + + /** + * digest + */ + + const u32x r0 = l32_from_64 (tmps[gid].digest_buf[0]); + const u32x r1 = h32_from_64 (tmps[gid].digest_buf[0]); + const u32x r2 = l32_from_64 (tmps[gid].digest_buf[1]); + const u32x r3 = h32_from_64 (tmps[gid].digest_buf[1]); + + #define il_pos 0 + + #include VECT_COMPARE_M +} diff --git a/nv/m08000_a0.cu b/nv/m08000_a0.cu new file mode 100644 index 0000000000..e6c81d0607 --- /dev/null +++ b/nv/m08000_a0.cu @@ -0,0 +1,515 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _SHA256_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW2 +#define VECT_SIZE1 +#endif + +#define DGST_R0 3 +#define DGST_R1 7 +#define DGST_R2 2 +#define DGST_R3 6 + +#include "include/kernel_functions.c" +#include "types_nv.c" +#include "common_nv.c" +#include "include/rp_gpu.h" +#include "rp_nv.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +__device__ static void sha256_transform (u32x digest[8], const u32x w[16]) +{ + u32x w0_t = w[ 0]; + u32x w1_t = w[ 1]; + u32x w2_t = w[ 2]; + u32x w3_t = w[ 3]; + u32x w4_t = w[ 4]; + u32x w5_t = w[ 5]; + u32x w6_t = w[ 6]; + u32x w7_t = w[ 7]; + u32x w8_t = w[ 8]; + u32x w9_t = w[ 9]; + u32x wa_t = w[10]; + u32x wb_t = w[11]; + u32x wc_t = w[12]; + u32x wd_t = w[13]; + u32x we_t = w[14]; + u32x wf_t = w[15]; + + u32x a = digest[0]; + u32x b = digest[1]; + u32x c = digest[2]; + u32x d = digest[3]; + u32x e = digest[4]; + u32x f = digest[5]; + u32x g = digest[6]; + u32x h = digest[7]; + + SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C00); + SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C01); + SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C02); + SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C03); + SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C04); + SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C05); + SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C06); + SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C07); + SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C08); + SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C09); + SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C0a); + SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C0b); + SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C0c); + SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C0d); + SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C0e); + SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C0f); + w0_t = SHA256_S1(we_t) + w9_t + SHA256_S0(w1_t) + w0_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C10); + w1_t = SHA256_S1(wf_t) + wa_t + SHA256_S0(w2_t) + w1_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C11); + w2_t = SHA256_S1(w0_t) + wb_t + SHA256_S0(w3_t) + w2_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C12); + w3_t = SHA256_S1(w1_t) + wc_t + SHA256_S0(w4_t) + w3_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C13); + w4_t = SHA256_S1(w2_t) + wd_t + SHA256_S0(w5_t) + w4_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C14); + w5_t = SHA256_S1(w3_t) + we_t + SHA256_S0(w6_t) + w5_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C15); + w6_t = SHA256_S1(w4_t) + wf_t + SHA256_S0(w7_t) + w6_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C16); + w7_t = SHA256_S1(w5_t) + w0_t + SHA256_S0(w8_t) + w7_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C17); + w8_t = SHA256_S1(w6_t) + w1_t + SHA256_S0(w9_t) + w8_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C18); + w9_t = SHA256_S1(w7_t) + w2_t + SHA256_S0(wa_t) + w9_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C19); + wa_t = SHA256_S1(w8_t) + w3_t + SHA256_S0(wb_t) + wa_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C1a); + wb_t = SHA256_S1(w9_t) + w4_t + SHA256_S0(wc_t) + wb_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C1b); + wc_t = SHA256_S1(wa_t) + w5_t + SHA256_S0(wd_t) + wc_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C1c); + wd_t = SHA256_S1(wb_t) + w6_t + SHA256_S0(we_t) + wd_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C1d); + we_t = SHA256_S1(wc_t) + w7_t + SHA256_S0(wf_t) + we_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C1e); + wf_t = SHA256_S1(wd_t) + w8_t + SHA256_S0(w0_t) + wf_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C1f); + w0_t = SHA256_S1(we_t) + w9_t + SHA256_S0(w1_t) + w0_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C20); + w1_t = SHA256_S1(wf_t) + wa_t + SHA256_S0(w2_t) + w1_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C21); + w2_t = SHA256_S1(w0_t) + wb_t + SHA256_S0(w3_t) + w2_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C22); + w3_t = SHA256_S1(w1_t) + wc_t + SHA256_S0(w4_t) + w3_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C23); + w4_t = SHA256_S1(w2_t) + wd_t + SHA256_S0(w5_t) + w4_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C24); + w5_t = SHA256_S1(w3_t) + we_t + SHA256_S0(w6_t) + w5_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C25); + w6_t = SHA256_S1(w4_t) + wf_t + SHA256_S0(w7_t) + w6_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C26); + w7_t = SHA256_S1(w5_t) + w0_t + SHA256_S0(w8_t) + w7_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C27); + w8_t = SHA256_S1(w6_t) + w1_t + SHA256_S0(w9_t) + w8_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C28); + w9_t = SHA256_S1(w7_t) + w2_t + SHA256_S0(wa_t) + w9_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C29); + wa_t = SHA256_S1(w8_t) + w3_t + SHA256_S0(wb_t) + wa_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C2a); + wb_t = SHA256_S1(w9_t) + w4_t + SHA256_S0(wc_t) + wb_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C2b); + wc_t = SHA256_S1(wa_t) + w5_t + SHA256_S0(wd_t) + wc_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C2c); + wd_t = SHA256_S1(wb_t) + w6_t + SHA256_S0(we_t) + wd_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C2d); + we_t = SHA256_S1(wc_t) + w7_t + SHA256_S0(wf_t) + we_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C2e); + wf_t = SHA256_S1(wd_t) + w8_t + SHA256_S0(w0_t) + wf_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C2f); + w0_t = SHA256_S1(we_t) + w9_t + SHA256_S0(w1_t) + w0_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C30); + w1_t = SHA256_S1(wf_t) + wa_t + SHA256_S0(w2_t) + w1_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C31); + w2_t = SHA256_S1(w0_t) + wb_t + SHA256_S0(w3_t) + w2_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C32); + w3_t = SHA256_S1(w1_t) + wc_t + SHA256_S0(w4_t) + w3_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C33); + w4_t = SHA256_S1(w2_t) + wd_t + SHA256_S0(w5_t) + w4_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C34); + w5_t = SHA256_S1(w3_t) + we_t + SHA256_S0(w6_t) + w5_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C35); + w6_t = SHA256_S1(w4_t) + wf_t + SHA256_S0(w7_t) + w6_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C36); + w7_t = SHA256_S1(w5_t) + w0_t + SHA256_S0(w8_t) + w7_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C37); + w8_t = SHA256_S1(w6_t) + w1_t + SHA256_S0(w9_t) + w8_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C38); + w9_t = SHA256_S1(w7_t) + w2_t + SHA256_S0(wa_t) + w9_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C39); + wa_t = SHA256_S1(w8_t) + w3_t + SHA256_S0(wb_t) + wa_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C3a); + wb_t = SHA256_S1(w9_t) + w4_t + SHA256_S0(wc_t) + wb_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C3b); + wc_t = SHA256_S1(wa_t) + w5_t + SHA256_S0(wd_t) + wc_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C3c); + wd_t = SHA256_S1(wb_t) + w6_t + SHA256_S0(we_t) + wd_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C3d); + we_t = SHA256_S1(wc_t) + w7_t + SHA256_S0(wf_t) + we_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C3e); + wf_t = SHA256_S1(wd_t) + w8_t + SHA256_S0(w0_t) + wf_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C3f); + + digest[0] += a; + digest[1] += b; + digest[2] += c; + digest[3] += d; + digest[4] += e; + digest[5] += f; + digest[6] += g; + digest[7] += h; +} + +__device__ __constant__ gpu_rule_t c_rules[1024]; + +extern "C" __global__ void __launch_bounds__ (256, 1) m08000_m04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + u32x pw_buf1[4]; + + pw_buf1[0] = pws[gid].i[ 4]; + pw_buf1[1] = pws[gid].i[ 5]; + pw_buf1[2] = pws[gid].i[ 6]; + pw_buf1[3] = pws[gid].i[ 7]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * salt + */ + + const u32 salt_buf0 = swap_workaround (salt_bufs[salt_pos].salt_buf[ 0]); + const u32 salt_buf1 = swap_workaround (salt_bufs[salt_pos].salt_buf[ 1]); + const u32 salt_buf2 = swap_workaround (salt_bufs[salt_pos].salt_buf[ 2]); // 0x80 + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + u32x w1[4]; + u32x w2[4]; + u32x w3[4]; + + w0[0] = pw_buf0[0]; + w0[1] = pw_buf0[1]; + w0[2] = pw_buf0[2]; + w0[3] = pw_buf0[3]; + w1[0] = pw_buf1[0]; + w1[1] = pw_buf1[1]; + w1[2] = pw_buf1[2]; + w1[3] = pw_buf1[3]; + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 out_len = apply_rules (c_rules[il_pos].cmds, w0, w1, pw_len); + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + make_unicode (w0, w0_t, w1_t); + + make_unicode (w1, w2_t, w3_t); + + u32x w_t[16]; + + w_t[ 0] = swap_workaround (w0_t[0]); + w_t[ 1] = swap_workaround (w0_t[1]); + w_t[ 2] = swap_workaround (w0_t[2]); + w_t[ 3] = swap_workaround (w0_t[3]); + w_t[ 4] = swap_workaround (w1_t[0]); + w_t[ 5] = swap_workaround (w1_t[1]); + w_t[ 6] = swap_workaround (w1_t[2]); + w_t[ 7] = swap_workaround (w1_t[3]); + w_t[ 8] = swap_workaround (w2_t[0]); + w_t[ 9] = swap_workaround (w2_t[1]); + w_t[10] = swap_workaround (w2_t[2]); + w_t[11] = swap_workaround (w2_t[3]); + w_t[12] = swap_workaround (w3_t[0]); + w_t[13] = swap_workaround (w3_t[1]); + w_t[14] = swap_workaround (w3_t[2]); + w_t[15] = swap_workaround (w3_t[3]); + + w_t[ 0] = w_t[ 0] >> 8; + w_t[ 1] = w_t[ 1] >> 8; + w_t[ 2] = w_t[ 2] >> 8; + w_t[ 3] = w_t[ 3] >> 8; + w_t[ 4] = w_t[ 4] >> 8; + w_t[ 5] = w_t[ 5] >> 8; + w_t[ 6] = w_t[ 6] >> 8; + w_t[ 7] = w_t[ 7] >> 8; + w_t[ 8] = w_t[ 8] >> 8; + w_t[ 9] = w_t[ 9] >> 8; + w_t[10] = w_t[10] >> 8; + w_t[11] = w_t[11] >> 8; + w_t[12] = w_t[12] >> 8; + w_t[13] = w_t[13] >> 8; + w_t[14] = w_t[14] >> 8; + w_t[15] = w_t[15] >> 8; + + u32x digest[8]; + + digest[0] = SHA256M_A; + digest[1] = SHA256M_B; + digest[2] = SHA256M_C; + digest[3] = SHA256M_D; + digest[4] = SHA256M_E; + digest[5] = SHA256M_F; + digest[6] = SHA256M_G; + digest[7] = SHA256M_H; + + sha256_transform (digest, w_t); // 0 - 64 + + w_t[ 0] = 0; + w_t[ 1] = 0; + w_t[ 2] = 0; + w_t[ 3] = 0; + w_t[ 4] = 0; + w_t[ 5] = 0; + w_t[ 6] = 0; + w_t[ 7] = 0; + w_t[ 8] = 0; + w_t[ 9] = 0; + w_t[10] = 0; + w_t[11] = 0; + w_t[12] = 0; + w_t[13] = 0; + w_t[14] = 0; + w_t[15] = 0; + + sha256_transform (digest, w_t); // 64 - 128 + sha256_transform (digest, w_t); // 128 - 192 + sha256_transform (digest, w_t); // 192 - 256 + sha256_transform (digest, w_t); // 256 - 320 + sha256_transform (digest, w_t); // 320 - 384 + sha256_transform (digest, w_t); // 384 - 448 + + w_t[15] = 0 | salt_buf0 >> 16; + + sha256_transform (digest, w_t); // 448 - 512 + + w_t[ 0] = salt_buf0 << 16 | salt_buf1 >> 16; + w_t[ 1] = salt_buf1 << 16 | salt_buf2 >> 16; + w_t[ 2] = salt_buf2 << 16 | 0; + w_t[15] = (510 + 8) * 8; + + sha256_transform (digest, w_t); // 512 - 576 + + const u32x r0 = digest[3]; + const u32x r1 = digest[7]; + const u32x r2 = digest[2]; + const u32x r3 = digest[6]; + + #include VECT_COMPARE_M + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m08000_m08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m08000_m16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m08000_s04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + u32x pw_buf1[4]; + + pw_buf1[0] = pws[gid].i[ 4]; + pw_buf1[1] = pws[gid].i[ 5]; + pw_buf1[2] = pws[gid].i[ 6]; + pw_buf1[3] = pws[gid].i[ 7]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * salt + */ + + const u32 salt_buf0 = swap_workaround (salt_bufs[salt_pos].salt_buf[ 0]); + const u32 salt_buf1 = swap_workaround (salt_bufs[salt_pos].salt_buf[ 1]); + const u32 salt_buf2 = swap_workaround (salt_bufs[salt_pos].salt_buf[ 2]); // 0x80 + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + u32x w1[4]; + u32x w2[4]; + u32x w3[4]; + + w0[0] = pw_buf0[0]; + w0[1] = pw_buf0[1]; + w0[2] = pw_buf0[2]; + w0[3] = pw_buf0[3]; + w1[0] = pw_buf1[0]; + w1[1] = pw_buf1[1]; + w1[2] = pw_buf1[2]; + w1[3] = pw_buf1[3]; + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 out_len = apply_rules (c_rules[il_pos].cmds, w0, w1, pw_len); + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + make_unicode (w0, w0_t, w1_t); + + make_unicode (w1, w2_t, w3_t); + + u32x w_t[16]; + + w_t[ 0] = swap_workaround (w0_t[0]); + w_t[ 1] = swap_workaround (w0_t[1]); + w_t[ 2] = swap_workaround (w0_t[2]); + w_t[ 3] = swap_workaround (w0_t[3]); + w_t[ 4] = swap_workaround (w1_t[0]); + w_t[ 5] = swap_workaround (w1_t[1]); + w_t[ 6] = swap_workaround (w1_t[2]); + w_t[ 7] = swap_workaround (w1_t[3]); + w_t[ 8] = swap_workaround (w2_t[0]); + w_t[ 9] = swap_workaround (w2_t[1]); + w_t[10] = swap_workaround (w2_t[2]); + w_t[11] = swap_workaround (w2_t[3]); + w_t[12] = swap_workaround (w3_t[0]); + w_t[13] = swap_workaround (w3_t[1]); + w_t[14] = swap_workaround (w3_t[2]); + w_t[15] = swap_workaround (w3_t[3]); + + w_t[ 0] = w_t[ 0] >> 8; + w_t[ 1] = w_t[ 1] >> 8; + w_t[ 2] = w_t[ 2] >> 8; + w_t[ 3] = w_t[ 3] >> 8; + w_t[ 4] = w_t[ 4] >> 8; + w_t[ 5] = w_t[ 5] >> 8; + w_t[ 6] = w_t[ 6] >> 8; + w_t[ 7] = w_t[ 7] >> 8; + w_t[ 8] = w_t[ 8] >> 8; + w_t[ 9] = w_t[ 9] >> 8; + w_t[10] = w_t[10] >> 8; + w_t[11] = w_t[11] >> 8; + w_t[12] = w_t[12] >> 8; + w_t[13] = w_t[13] >> 8; + w_t[14] = w_t[14] >> 8; + w_t[15] = w_t[15] >> 8; + + u32x digest[8]; + + digest[0] = SHA256M_A; + digest[1] = SHA256M_B; + digest[2] = SHA256M_C; + digest[3] = SHA256M_D; + digest[4] = SHA256M_E; + digest[5] = SHA256M_F; + digest[6] = SHA256M_G; + digest[7] = SHA256M_H; + + sha256_transform (digest, w_t); // 0 - 64 + + w_t[ 0] = 0; + w_t[ 1] = 0; + w_t[ 2] = 0; + w_t[ 3] = 0; + w_t[ 4] = 0; + w_t[ 5] = 0; + w_t[ 6] = 0; + w_t[ 7] = 0; + w_t[ 8] = 0; + w_t[ 9] = 0; + w_t[10] = 0; + w_t[11] = 0; + w_t[12] = 0; + w_t[13] = 0; + w_t[14] = 0; + w_t[15] = 0; + + sha256_transform (digest, w_t); // 64 - 128 + sha256_transform (digest, w_t); // 128 - 192 + sha256_transform (digest, w_t); // 192 - 256 + sha256_transform (digest, w_t); // 256 - 320 + sha256_transform (digest, w_t); // 320 - 384 + sha256_transform (digest, w_t); // 384 - 448 + + w_t[15] = 0 | salt_buf0 >> 16; + + sha256_transform (digest, w_t); // 448 - 512 + + w_t[ 0] = salt_buf0 << 16 | salt_buf1 >> 16; + w_t[ 1] = salt_buf1 << 16 | salt_buf2 >> 16; + w_t[ 2] = salt_buf2 << 16 | 0; + w_t[15] = (510 + 8) * 8; + + sha256_transform (digest, w_t); // 512 - 576 + + const u32x r0 = digest[3]; + const u32x r1 = digest[7]; + const u32x r2 = digest[2]; + const u32x r3 = digest[6]; + + #include VECT_COMPARE_S + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m08000_s08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m08000_s16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/nv/m08000_a1.cu b/nv/m08000_a1.cu new file mode 100644 index 0000000000..cc269e1085 --- /dev/null +++ b/nv/m08000_a1.cu @@ -0,0 +1,601 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _SHA256_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW2 +#define VECT_SIZE1 +#endif + +#define DGST_R0 3 +#define DGST_R1 7 +#define DGST_R2 2 +#define DGST_R3 6 + +#include "include/kernel_functions.c" +#include "types_nv.c" +#include "common_nv.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +__device__ static void sha256_transform (u32x digest[8], const u32x w[16]) +{ + u32x w0_t = w[ 0]; + u32x w1_t = w[ 1]; + u32x w2_t = w[ 2]; + u32x w3_t = w[ 3]; + u32x w4_t = w[ 4]; + u32x w5_t = w[ 5]; + u32x w6_t = w[ 6]; + u32x w7_t = w[ 7]; + u32x w8_t = w[ 8]; + u32x w9_t = w[ 9]; + u32x wa_t = w[10]; + u32x wb_t = w[11]; + u32x wc_t = w[12]; + u32x wd_t = w[13]; + u32x we_t = w[14]; + u32x wf_t = w[15]; + + u32x a = digest[0]; + u32x b = digest[1]; + u32x c = digest[2]; + u32x d = digest[3]; + u32x e = digest[4]; + u32x f = digest[5]; + u32x g = digest[6]; + u32x h = digest[7]; + + SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C00); + SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C01); + SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C02); + SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C03); + SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C04); + SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C05); + SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C06); + SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C07); + SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C08); + SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C09); + SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C0a); + SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C0b); + SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C0c); + SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C0d); + SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C0e); + SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C0f); + w0_t = SHA256_S1(we_t) + w9_t + SHA256_S0(w1_t) + w0_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C10); + w1_t = SHA256_S1(wf_t) + wa_t + SHA256_S0(w2_t) + w1_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C11); + w2_t = SHA256_S1(w0_t) + wb_t + SHA256_S0(w3_t) + w2_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C12); + w3_t = SHA256_S1(w1_t) + wc_t + SHA256_S0(w4_t) + w3_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C13); + w4_t = SHA256_S1(w2_t) + wd_t + SHA256_S0(w5_t) + w4_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C14); + w5_t = SHA256_S1(w3_t) + we_t + SHA256_S0(w6_t) + w5_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C15); + w6_t = SHA256_S1(w4_t) + wf_t + SHA256_S0(w7_t) + w6_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C16); + w7_t = SHA256_S1(w5_t) + w0_t + SHA256_S0(w8_t) + w7_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C17); + w8_t = SHA256_S1(w6_t) + w1_t + SHA256_S0(w9_t) + w8_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C18); + w9_t = SHA256_S1(w7_t) + w2_t + SHA256_S0(wa_t) + w9_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C19); + wa_t = SHA256_S1(w8_t) + w3_t + SHA256_S0(wb_t) + wa_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C1a); + wb_t = SHA256_S1(w9_t) + w4_t + SHA256_S0(wc_t) + wb_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C1b); + wc_t = SHA256_S1(wa_t) + w5_t + SHA256_S0(wd_t) + wc_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C1c); + wd_t = SHA256_S1(wb_t) + w6_t + SHA256_S0(we_t) + wd_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C1d); + we_t = SHA256_S1(wc_t) + w7_t + SHA256_S0(wf_t) + we_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C1e); + wf_t = SHA256_S1(wd_t) + w8_t + SHA256_S0(w0_t) + wf_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C1f); + w0_t = SHA256_S1(we_t) + w9_t + SHA256_S0(w1_t) + w0_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C20); + w1_t = SHA256_S1(wf_t) + wa_t + SHA256_S0(w2_t) + w1_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C21); + w2_t = SHA256_S1(w0_t) + wb_t + SHA256_S0(w3_t) + w2_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C22); + w3_t = SHA256_S1(w1_t) + wc_t + SHA256_S0(w4_t) + w3_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C23); + w4_t = SHA256_S1(w2_t) + wd_t + SHA256_S0(w5_t) + w4_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C24); + w5_t = SHA256_S1(w3_t) + we_t + SHA256_S0(w6_t) + w5_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C25); + w6_t = SHA256_S1(w4_t) + wf_t + SHA256_S0(w7_t) + w6_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C26); + w7_t = SHA256_S1(w5_t) + w0_t + SHA256_S0(w8_t) + w7_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C27); + w8_t = SHA256_S1(w6_t) + w1_t + SHA256_S0(w9_t) + w8_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C28); + w9_t = SHA256_S1(w7_t) + w2_t + SHA256_S0(wa_t) + w9_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C29); + wa_t = SHA256_S1(w8_t) + w3_t + SHA256_S0(wb_t) + wa_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C2a); + wb_t = SHA256_S1(w9_t) + w4_t + SHA256_S0(wc_t) + wb_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C2b); + wc_t = SHA256_S1(wa_t) + w5_t + SHA256_S0(wd_t) + wc_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C2c); + wd_t = SHA256_S1(wb_t) + w6_t + SHA256_S0(we_t) + wd_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C2d); + we_t = SHA256_S1(wc_t) + w7_t + SHA256_S0(wf_t) + we_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C2e); + wf_t = SHA256_S1(wd_t) + w8_t + SHA256_S0(w0_t) + wf_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C2f); + w0_t = SHA256_S1(we_t) + w9_t + SHA256_S0(w1_t) + w0_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C30); + w1_t = SHA256_S1(wf_t) + wa_t + SHA256_S0(w2_t) + w1_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C31); + w2_t = SHA256_S1(w0_t) + wb_t + SHA256_S0(w3_t) + w2_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C32); + w3_t = SHA256_S1(w1_t) + wc_t + SHA256_S0(w4_t) + w3_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C33); + w4_t = SHA256_S1(w2_t) + wd_t + SHA256_S0(w5_t) + w4_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C34); + w5_t = SHA256_S1(w3_t) + we_t + SHA256_S0(w6_t) + w5_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C35); + w6_t = SHA256_S1(w4_t) + wf_t + SHA256_S0(w7_t) + w6_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C36); + w7_t = SHA256_S1(w5_t) + w0_t + SHA256_S0(w8_t) + w7_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C37); + w8_t = SHA256_S1(w6_t) + w1_t + SHA256_S0(w9_t) + w8_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C38); + w9_t = SHA256_S1(w7_t) + w2_t + SHA256_S0(wa_t) + w9_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C39); + wa_t = SHA256_S1(w8_t) + w3_t + SHA256_S0(wb_t) + wa_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C3a); + wb_t = SHA256_S1(w9_t) + w4_t + SHA256_S0(wc_t) + wb_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C3b); + wc_t = SHA256_S1(wa_t) + w5_t + SHA256_S0(wd_t) + wc_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C3c); + wd_t = SHA256_S1(wb_t) + w6_t + SHA256_S0(we_t) + wd_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C3d); + we_t = SHA256_S1(wc_t) + w7_t + SHA256_S0(wf_t) + we_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C3e); + wf_t = SHA256_S1(wd_t) + w8_t + SHA256_S0(w0_t) + wf_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C3f); + + digest[0] += a; + digest[1] += b; + digest[2] += c; + digest[3] += d; + digest[4] += e; + digest[5] += f; + digest[6] += g; + digest[7] += h; +} + +__device__ __constant__ comb_t c_combs[1024]; + +extern "C" __global__ void __launch_bounds__ (256, 1) m08000_m04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, c_combs[0].pw_len); + } + + /** + * salt + */ + + const u32 salt_buf0 = swap_workaround (salt_bufs[salt_pos].salt_buf[ 0]); + const u32 salt_buf1 = swap_workaround (salt_bufs[salt_pos].salt_buf[ 1]); + const u32 salt_buf2 = swap_workaround (salt_bufs[salt_pos].salt_buf[ 2]); // 0x80 + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + u32 wordr0[4]; + u32 wordr1[4]; + u32 wordr2[4]; + u32 wordr3[4]; + + wordr0[0] = c_combs[il_pos].i[0]; + wordr0[1] = c_combs[il_pos].i[1]; + wordr0[2] = c_combs[il_pos].i[2]; + wordr0[3] = c_combs[il_pos].i[3]; + wordr1[0] = c_combs[il_pos].i[4]; + wordr1[1] = c_combs[il_pos].i[5]; + wordr1[2] = c_combs[il_pos].i[6]; + wordr1[3] = c_combs[il_pos].i[7]; + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + u32x w0[4]; + u32x w1[4]; + u32x w2[4]; + u32x w3[4]; + + w0[0] = wordl0[0] | wordr0[0]; + w0[1] = wordl0[1] | wordr0[1]; + w0[2] = wordl0[2] | wordr0[2]; + w0[3] = wordl0[3] | wordr0[3]; + w1[0] = wordl1[0] | wordr1[0]; + w1[1] = wordl1[1] | wordr1[1]; + w1[2] = wordl1[2] | wordr1[2]; + w1[3] = wordl1[3] | wordr1[3]; + w2[0] = wordl2[0] | wordr2[0]; + w2[1] = wordl2[1] | wordr2[1]; + w2[2] = wordl2[2] | wordr2[2]; + w2[3] = wordl2[3] | wordr2[3]; + w3[0] = wordl3[0] | wordr3[0]; + w3[1] = wordl3[1] | wordr3[1]; + w3[2] = wordl3[2] | wordr3[2]; + w3[3] = wordl3[3] | wordr3[3]; + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + make_unicode (w0, w0_t, w1_t); + + make_unicode (w1, w2_t, w3_t); + + u32x w_t[16]; + + w_t[ 0] = swap_workaround (w0_t[0]); + w_t[ 1] = swap_workaround (w0_t[1]); + w_t[ 2] = swap_workaround (w0_t[2]); + w_t[ 3] = swap_workaround (w0_t[3]); + w_t[ 4] = swap_workaround (w1_t[0]); + w_t[ 5] = swap_workaround (w1_t[1]); + w_t[ 6] = swap_workaround (w1_t[2]); + w_t[ 7] = swap_workaround (w1_t[3]); + w_t[ 8] = swap_workaround (w2_t[0]); + w_t[ 9] = swap_workaround (w2_t[1]); + w_t[10] = swap_workaround (w2_t[2]); + w_t[11] = swap_workaround (w2_t[3]); + w_t[12] = swap_workaround (w3_t[0]); + w_t[13] = swap_workaround (w3_t[1]); + w_t[14] = swap_workaround (w3_t[2]); + w_t[15] = swap_workaround (w3_t[3]); + + w_t[ 0] = w_t[ 0] >> 8; + w_t[ 1] = w_t[ 1] >> 8; + w_t[ 2] = w_t[ 2] >> 8; + w_t[ 3] = w_t[ 3] >> 8; + w_t[ 4] = w_t[ 4] >> 8; + w_t[ 5] = w_t[ 5] >> 8; + w_t[ 6] = w_t[ 6] >> 8; + w_t[ 7] = w_t[ 7] >> 8; + w_t[ 8] = w_t[ 8] >> 8; + w_t[ 9] = w_t[ 9] >> 8; + w_t[10] = w_t[10] >> 8; + w_t[11] = w_t[11] >> 8; + w_t[12] = w_t[12] >> 8; + w_t[13] = w_t[13] >> 8; + w_t[14] = w_t[14] >> 8; + w_t[15] = w_t[15] >> 8; + + u32x digest[8]; + + digest[0] = SHA256M_A; + digest[1] = SHA256M_B; + digest[2] = SHA256M_C; + digest[3] = SHA256M_D; + digest[4] = SHA256M_E; + digest[5] = SHA256M_F; + digest[6] = SHA256M_G; + digest[7] = SHA256M_H; + + sha256_transform (digest, w_t); // 0 - 64 + + w_t[ 0] = 0; + w_t[ 1] = 0; + w_t[ 2] = 0; + w_t[ 3] = 0; + w_t[ 4] = 0; + w_t[ 5] = 0; + w_t[ 6] = 0; + w_t[ 7] = 0; + w_t[ 8] = 0; + w_t[ 9] = 0; + w_t[10] = 0; + w_t[11] = 0; + w_t[12] = 0; + w_t[13] = 0; + w_t[14] = 0; + w_t[15] = 0; + + sha256_transform (digest, w_t); // 64 - 128 + sha256_transform (digest, w_t); // 128 - 192 + sha256_transform (digest, w_t); // 192 - 256 + sha256_transform (digest, w_t); // 256 - 320 + sha256_transform (digest, w_t); // 320 - 384 + sha256_transform (digest, w_t); // 384 - 448 + + w_t[15] = 0 | salt_buf0 >> 16; + + sha256_transform (digest, w_t); // 448 - 512 + + w_t[ 0] = salt_buf0 << 16 | salt_buf1 >> 16; + w_t[ 1] = salt_buf1 << 16 | salt_buf2 >> 16; + w_t[ 2] = salt_buf2 << 16 | 0; + w_t[15] = (510 + 8) * 8; + + sha256_transform (digest, w_t); // 512 - 576 + + const u32x r0 = digest[3]; + const u32x r1 = digest[7]; + const u32x r2 = digest[2]; + const u32x r3 = digest[6]; + + #include VECT_COMPARE_M + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m08000_m08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m08000_m16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m08000_s04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, c_combs[0].pw_len); + } + + /** + * salt + */ + + const u32 salt_buf0 = swap_workaround (salt_bufs[salt_pos].salt_buf[ 0]); + const u32 salt_buf1 = swap_workaround (salt_bufs[salt_pos].salt_buf[ 1]); + const u32 salt_buf2 = swap_workaround (salt_bufs[salt_pos].salt_buf[ 2]); // 0x80 + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + u32 wordr0[4]; + u32 wordr1[4]; + u32 wordr2[4]; + u32 wordr3[4]; + + wordr0[0] = c_combs[il_pos].i[0]; + wordr0[1] = c_combs[il_pos].i[1]; + wordr0[2] = c_combs[il_pos].i[2]; + wordr0[3] = c_combs[il_pos].i[3]; + wordr1[0] = c_combs[il_pos].i[4]; + wordr1[1] = c_combs[il_pos].i[5]; + wordr1[2] = c_combs[il_pos].i[6]; + wordr1[3] = c_combs[il_pos].i[7]; + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + u32x w0[4]; + u32x w1[4]; + u32x w2[4]; + u32x w3[4]; + + w0[0] = wordl0[0] | wordr0[0]; + w0[1] = wordl0[1] | wordr0[1]; + w0[2] = wordl0[2] | wordr0[2]; + w0[3] = wordl0[3] | wordr0[3]; + w1[0] = wordl1[0] | wordr1[0]; + w1[1] = wordl1[1] | wordr1[1]; + w1[2] = wordl1[2] | wordr1[2]; + w1[3] = wordl1[3] | wordr1[3]; + w2[0] = wordl2[0] | wordr2[0]; + w2[1] = wordl2[1] | wordr2[1]; + w2[2] = wordl2[2] | wordr2[2]; + w2[3] = wordl2[3] | wordr2[3]; + w3[0] = wordl3[0] | wordr3[0]; + w3[1] = wordl3[1] | wordr3[1]; + w3[2] = wordl3[2] | wordr3[2]; + w3[3] = wordl3[3] | wordr3[3]; + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + make_unicode (w0, w0_t, w1_t); + + make_unicode (w1, w2_t, w3_t); + + u32x w_t[16]; + + w_t[ 0] = swap_workaround (w0_t[0]); + w_t[ 1] = swap_workaround (w0_t[1]); + w_t[ 2] = swap_workaround (w0_t[2]); + w_t[ 3] = swap_workaround (w0_t[3]); + w_t[ 4] = swap_workaround (w1_t[0]); + w_t[ 5] = swap_workaround (w1_t[1]); + w_t[ 6] = swap_workaround (w1_t[2]); + w_t[ 7] = swap_workaround (w1_t[3]); + w_t[ 8] = swap_workaround (w2_t[0]); + w_t[ 9] = swap_workaround (w2_t[1]); + w_t[10] = swap_workaround (w2_t[2]); + w_t[11] = swap_workaround (w2_t[3]); + w_t[12] = swap_workaround (w3_t[0]); + w_t[13] = swap_workaround (w3_t[1]); + w_t[14] = swap_workaround (w3_t[2]); + w_t[15] = swap_workaround (w3_t[3]); + + w_t[ 0] = w_t[ 0] >> 8; + w_t[ 1] = w_t[ 1] >> 8; + w_t[ 2] = w_t[ 2] >> 8; + w_t[ 3] = w_t[ 3] >> 8; + w_t[ 4] = w_t[ 4] >> 8; + w_t[ 5] = w_t[ 5] >> 8; + w_t[ 6] = w_t[ 6] >> 8; + w_t[ 7] = w_t[ 7] >> 8; + w_t[ 8] = w_t[ 8] >> 8; + w_t[ 9] = w_t[ 9] >> 8; + w_t[10] = w_t[10] >> 8; + w_t[11] = w_t[11] >> 8; + w_t[12] = w_t[12] >> 8; + w_t[13] = w_t[13] >> 8; + w_t[14] = w_t[14] >> 8; + w_t[15] = w_t[15] >> 8; + + u32x digest[8]; + + digest[0] = SHA256M_A; + digest[1] = SHA256M_B; + digest[2] = SHA256M_C; + digest[3] = SHA256M_D; + digest[4] = SHA256M_E; + digest[5] = SHA256M_F; + digest[6] = SHA256M_G; + digest[7] = SHA256M_H; + + sha256_transform (digest, w_t); // 0 - 64 + + w_t[ 0] = 0; + w_t[ 1] = 0; + w_t[ 2] = 0; + w_t[ 3] = 0; + w_t[ 4] = 0; + w_t[ 5] = 0; + w_t[ 6] = 0; + w_t[ 7] = 0; + w_t[ 8] = 0; + w_t[ 9] = 0; + w_t[10] = 0; + w_t[11] = 0; + w_t[12] = 0; + w_t[13] = 0; + w_t[14] = 0; + w_t[15] = 0; + + sha256_transform (digest, w_t); // 64 - 128 + sha256_transform (digest, w_t); // 128 - 192 + sha256_transform (digest, w_t); // 192 - 256 + sha256_transform (digest, w_t); // 256 - 320 + sha256_transform (digest, w_t); // 320 - 384 + sha256_transform (digest, w_t); // 384 - 448 + + w_t[15] = 0 | salt_buf0 >> 16; + + sha256_transform (digest, w_t); // 448 - 512 + + w_t[ 0] = salt_buf0 << 16 | salt_buf1 >> 16; + w_t[ 1] = salt_buf1 << 16 | salt_buf2 >> 16; + w_t[ 2] = salt_buf2 << 16 | 0; + w_t[15] = (510 + 8) * 8; + + sha256_transform (digest, w_t); // 512 - 576 + + const u32x r0 = digest[3]; + const u32x r1 = digest[7]; + const u32x r2 = digest[2]; + const u32x r3 = digest[6]; + + #include VECT_COMPARE_S + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m08000_s08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m08000_s16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/nv/m08000_a3.cu b/nv/m08000_a3.cu new file mode 100644 index 0000000000..89bc4b0e14 --- /dev/null +++ b/nv/m08000_a3.cu @@ -0,0 +1,596 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _SHA256_ +#define _SCALAR_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW2 +#define VECT_SIZE1 +#endif + +#define DGST_R0 3 +#define DGST_R1 7 +#define DGST_R2 2 +#define DGST_R3 6 + +#include "include/kernel_functions.c" +#include "types_nv.c" +#include "common_nv.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4_warp.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4_warp.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4_warp.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4_warp.c" +#endif + +__device__ static void sha256_transform (u32x digest[8], const u32x w[16]) +{ + u32x w0_t = w[ 0]; + u32x w1_t = w[ 1]; + u32x w2_t = w[ 2]; + u32x w3_t = w[ 3]; + u32x w4_t = w[ 4]; + u32x w5_t = w[ 5]; + u32x w6_t = w[ 6]; + u32x w7_t = w[ 7]; + u32x w8_t = w[ 8]; + u32x w9_t = w[ 9]; + u32x wa_t = w[10]; + u32x wb_t = w[11]; + u32x wc_t = w[12]; + u32x wd_t = w[13]; + u32x we_t = w[14]; + u32x wf_t = w[15]; + + u32x a = digest[0]; + u32x b = digest[1]; + u32x c = digest[2]; + u32x d = digest[3]; + u32x e = digest[4]; + u32x f = digest[5]; + u32x g = digest[6]; + u32x h = digest[7]; + + SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C00); + SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C01); + SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C02); + SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C03); + SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C04); + SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C05); + SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C06); + SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C07); + SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C08); + SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C09); + SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C0a); + SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C0b); + SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C0c); + SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C0d); + SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C0e); + SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C0f); + w0_t = SHA256_S1(we_t) + w9_t + SHA256_S0(w1_t) + w0_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C10); + w1_t = SHA256_S1(wf_t) + wa_t + SHA256_S0(w2_t) + w1_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C11); + w2_t = SHA256_S1(w0_t) + wb_t + SHA256_S0(w3_t) + w2_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C12); + w3_t = SHA256_S1(w1_t) + wc_t + SHA256_S0(w4_t) + w3_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C13); + w4_t = SHA256_S1(w2_t) + wd_t + SHA256_S0(w5_t) + w4_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C14); + w5_t = SHA256_S1(w3_t) + we_t + SHA256_S0(w6_t) + w5_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C15); + w6_t = SHA256_S1(w4_t) + wf_t + SHA256_S0(w7_t) + w6_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C16); + w7_t = SHA256_S1(w5_t) + w0_t + SHA256_S0(w8_t) + w7_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C17); + w8_t = SHA256_S1(w6_t) + w1_t + SHA256_S0(w9_t) + w8_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C18); + w9_t = SHA256_S1(w7_t) + w2_t + SHA256_S0(wa_t) + w9_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C19); + wa_t = SHA256_S1(w8_t) + w3_t + SHA256_S0(wb_t) + wa_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C1a); + wb_t = SHA256_S1(w9_t) + w4_t + SHA256_S0(wc_t) + wb_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C1b); + wc_t = SHA256_S1(wa_t) + w5_t + SHA256_S0(wd_t) + wc_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C1c); + wd_t = SHA256_S1(wb_t) + w6_t + SHA256_S0(we_t) + wd_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C1d); + we_t = SHA256_S1(wc_t) + w7_t + SHA256_S0(wf_t) + we_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C1e); + wf_t = SHA256_S1(wd_t) + w8_t + SHA256_S0(w0_t) + wf_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C1f); + w0_t = SHA256_S1(we_t) + w9_t + SHA256_S0(w1_t) + w0_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C20); + w1_t = SHA256_S1(wf_t) + wa_t + SHA256_S0(w2_t) + w1_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C21); + w2_t = SHA256_S1(w0_t) + wb_t + SHA256_S0(w3_t) + w2_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C22); + w3_t = SHA256_S1(w1_t) + wc_t + SHA256_S0(w4_t) + w3_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C23); + w4_t = SHA256_S1(w2_t) + wd_t + SHA256_S0(w5_t) + w4_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C24); + w5_t = SHA256_S1(w3_t) + we_t + SHA256_S0(w6_t) + w5_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C25); + w6_t = SHA256_S1(w4_t) + wf_t + SHA256_S0(w7_t) + w6_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C26); + w7_t = SHA256_S1(w5_t) + w0_t + SHA256_S0(w8_t) + w7_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C27); + w8_t = SHA256_S1(w6_t) + w1_t + SHA256_S0(w9_t) + w8_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C28); + w9_t = SHA256_S1(w7_t) + w2_t + SHA256_S0(wa_t) + w9_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C29); + wa_t = SHA256_S1(w8_t) + w3_t + SHA256_S0(wb_t) + wa_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C2a); + wb_t = SHA256_S1(w9_t) + w4_t + SHA256_S0(wc_t) + wb_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C2b); + wc_t = SHA256_S1(wa_t) + w5_t + SHA256_S0(wd_t) + wc_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C2c); + wd_t = SHA256_S1(wb_t) + w6_t + SHA256_S0(we_t) + wd_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C2d); + we_t = SHA256_S1(wc_t) + w7_t + SHA256_S0(wf_t) + we_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C2e); + wf_t = SHA256_S1(wd_t) + w8_t + SHA256_S0(w0_t) + wf_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C2f); + w0_t = SHA256_S1(we_t) + w9_t + SHA256_S0(w1_t) + w0_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C30); + w1_t = SHA256_S1(wf_t) + wa_t + SHA256_S0(w2_t) + w1_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C31); + w2_t = SHA256_S1(w0_t) + wb_t + SHA256_S0(w3_t) + w2_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C32); + w3_t = SHA256_S1(w1_t) + wc_t + SHA256_S0(w4_t) + w3_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C33); + w4_t = SHA256_S1(w2_t) + wd_t + SHA256_S0(w5_t) + w4_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C34); + w5_t = SHA256_S1(w3_t) + we_t + SHA256_S0(w6_t) + w5_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C35); + w6_t = SHA256_S1(w4_t) + wf_t + SHA256_S0(w7_t) + w6_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C36); + w7_t = SHA256_S1(w5_t) + w0_t + SHA256_S0(w8_t) + w7_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C37); + w8_t = SHA256_S1(w6_t) + w1_t + SHA256_S0(w9_t) + w8_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C38); + w9_t = SHA256_S1(w7_t) + w2_t + SHA256_S0(wa_t) + w9_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C39); + wa_t = SHA256_S1(w8_t) + w3_t + SHA256_S0(wb_t) + wa_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C3a); + wb_t = SHA256_S1(w9_t) + w4_t + SHA256_S0(wc_t) + wb_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C3b); + wc_t = SHA256_S1(wa_t) + w5_t + SHA256_S0(wd_t) + wc_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C3c); + wd_t = SHA256_S1(wb_t) + w6_t + SHA256_S0(we_t) + wd_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C3d); + we_t = SHA256_S1(wc_t) + w7_t + SHA256_S0(wf_t) + we_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C3e); + wf_t = SHA256_S1(wd_t) + w8_t + SHA256_S0(w0_t) + wf_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C3f); + + digest[0] += a; + digest[1] += b; + digest[2] += c; + digest[3] += d; + digest[4] += e; + digest[5] += f; + digest[6] += g; + digest[7] += h; +} + +__device__ __constant__ u32x c_bfs[1024]; + +__device__ static void m08000m (u32 w[16], const u32 pw_len, const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const u32x *words_buf_r, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset) +{ + /** + * modifier + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + const u32 lid = threadIdx.x; + + /** + * salt + */ + + const u32 salt_buf0 = swap_workaround (salt_bufs[salt_pos].salt_buf[ 0]); + const u32 salt_buf1 = swap_workaround (salt_bufs[salt_pos].salt_buf[ 1]); + const u32 salt_buf2 = swap_workaround (salt_bufs[salt_pos].salt_buf[ 2]); // 0x80 + + /** + * loop + */ + + const u32 bf_loops = ceil ((float) bfs_cnt / VECT_DIV); + + u32x w0l = w[0]; + + for (u32 il_pos = 0; il_pos < bf_loops; il_pos++) + { + const u32x w0r = c_bfs[il_pos]; + + const u32x w0 = w0l | w0r; + + u32x w_t[16]; + + w_t[ 0] = w0 >> 8; + w_t[ 1] = w[ 1] >> 8; + w_t[ 2] = w[ 2] >> 8; + w_t[ 3] = w[ 3] >> 8; + w_t[ 4] = w[ 4] >> 8; + w_t[ 5] = w[ 5] >> 8; + w_t[ 6] = w[ 6] >> 8; + w_t[ 7] = w[ 7] >> 8; + w_t[ 8] = w[ 8] >> 8; + w_t[ 9] = w[ 9] >> 8; + w_t[10] = w[10] >> 8; + w_t[11] = w[11] >> 8; + w_t[12] = w[12] >> 8; + w_t[13] = w[13] >> 8; + w_t[14] = w[14] >> 8; + w_t[15] = w[15] >> 8; + + u32x digest[8]; + + digest[0] = SHA256M_A; + digest[1] = SHA256M_B; + digest[2] = SHA256M_C; + digest[3] = SHA256M_D; + digest[4] = SHA256M_E; + digest[5] = SHA256M_F; + digest[6] = SHA256M_G; + digest[7] = SHA256M_H; + + sha256_transform (digest, w_t); // 0 - 64 + + w_t[ 0] = 0; + w_t[ 1] = 0; + w_t[ 2] = 0; + w_t[ 3] = 0; + w_t[ 4] = 0; + w_t[ 5] = 0; + w_t[ 6] = 0; + w_t[ 7] = 0; + w_t[ 8] = 0; + w_t[ 9] = 0; + w_t[10] = 0; + w_t[11] = 0; + w_t[12] = 0; + w_t[13] = 0; + w_t[14] = 0; + w_t[15] = 0; + + sha256_transform (digest, w_t); // 64 - 128 + sha256_transform (digest, w_t); // 128 - 192 + sha256_transform (digest, w_t); // 192 - 256 + sha256_transform (digest, w_t); // 256 - 320 + sha256_transform (digest, w_t); // 320 - 384 + sha256_transform (digest, w_t); // 384 - 448 + + w_t[15] = 0 | salt_buf0 >> 16; + + sha256_transform (digest, w_t); // 448 - 512 + + w_t[ 0] = salt_buf0 << 16 | salt_buf1 >> 16; + w_t[ 1] = salt_buf1 << 16 | salt_buf2 >> 16; + w_t[ 2] = salt_buf2 << 16 | 0; + w_t[15] = (510 + 8) * 8; + + sha256_transform (digest, w_t); // 512 - 576 + + const u32x r0 = digest[3]; + const u32x r1 = digest[7]; + const u32x r2 = digest[2]; + const u32x r3 = digest[6]; + + #include VECT_COMPARE_M + } +} + +__device__ static void m08000s (u32 w[16], const u32 pw_len, const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const u32x *words_buf_r, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset) +{ + /** + * modifier + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + const u32 lid = threadIdx.x; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * salt + */ + + const u32 salt_buf0 = swap_workaround (salt_bufs[salt_pos].salt_buf[ 0]); + const u32 salt_buf1 = swap_workaround (salt_bufs[salt_pos].salt_buf[ 1]); + const u32 salt_buf2 = swap_workaround (salt_bufs[salt_pos].salt_buf[ 2]); // 0x80 + + /** + * loop + */ + + const u32 bf_loops = ceil ((float) bfs_cnt / VECT_DIV); + + u32x w0l = w[0]; + + for (u32 il_pos = 0; il_pos < bf_loops; il_pos++) + { + const u32x w0r = c_bfs[il_pos]; + + const u32x w0 = w0l | w0r; + + u32x w_t[16]; + + w_t[ 0] = w0 >> 8; + w_t[ 1] = w[ 1] >> 8; + w_t[ 2] = w[ 2] >> 8; + w_t[ 3] = w[ 3] >> 8; + w_t[ 4] = w[ 4] >> 8; + w_t[ 5] = w[ 5] >> 8; + w_t[ 6] = w[ 6] >> 8; + w_t[ 7] = w[ 7] >> 8; + w_t[ 8] = w[ 8] >> 8; + w_t[ 9] = w[ 9] >> 8; + w_t[10] = w[10] >> 8; + w_t[11] = w[11] >> 8; + w_t[12] = w[12] >> 8; + w_t[13] = w[13] >> 8; + w_t[14] = w[14] >> 8; + w_t[15] = w[15] >> 8; + + u32x digest[8]; + + digest[0] = SHA256M_A; + digest[1] = SHA256M_B; + digest[2] = SHA256M_C; + digest[3] = SHA256M_D; + digest[4] = SHA256M_E; + digest[5] = SHA256M_F; + digest[6] = SHA256M_G; + digest[7] = SHA256M_H; + + sha256_transform (digest, w_t); // 0 - 64 + + w_t[ 0] = 0; + w_t[ 1] = 0; + w_t[ 2] = 0; + w_t[ 3] = 0; + w_t[ 4] = 0; + w_t[ 5] = 0; + w_t[ 6] = 0; + w_t[ 7] = 0; + w_t[ 8] = 0; + w_t[ 9] = 0; + w_t[10] = 0; + w_t[11] = 0; + w_t[12] = 0; + w_t[13] = 0; + w_t[14] = 0; + w_t[15] = 0; + + sha256_transform (digest, w_t); // 64 - 128 + sha256_transform (digest, w_t); // 128 - 192 + sha256_transform (digest, w_t); // 192 - 256 + sha256_transform (digest, w_t); // 256 - 320 + sha256_transform (digest, w_t); // 320 - 384 + sha256_transform (digest, w_t); // 384 - 448 + + w_t[15] = 0 | salt_buf0 >> 16; + + sha256_transform (digest, w_t); // 448 - 512 + + w_t[ 0] = salt_buf0 << 16 | salt_buf1 >> 16; + w_t[ 1] = salt_buf1 << 16 | salt_buf2 >> 16; + w_t[ 2] = salt_buf2 << 16 | 0; + w_t[15] = (510 + 8) * 8; + + sha256_transform (digest, w_t); // 512 - 576 + + const u32x r0 = digest[3]; + const u32x r1 = digest[7]; + const u32x r2 = digest[2]; + const u32x r3 = digest[6]; + + #include VECT_COMPARE_S + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m08000_m04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const u32x *words_buf_r, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32 w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = 0; + w[ 5] = 0; + w[ 6] = 0; + w[ 7] = 0; + w[ 8] = 0; + w[ 9] = 0; + w[10] = 0; + w[11] = 0; + w[12] = 0; + w[13] = 0; + w[14] = 0; + w[15] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m08000m (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m08000_m08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const u32x *words_buf_r, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32 w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = pws[gid].i[ 4]; + w[ 5] = pws[gid].i[ 5]; + w[ 6] = pws[gid].i[ 6]; + w[ 7] = pws[gid].i[ 7]; + w[ 8] = 0; + w[ 9] = 0; + w[10] = 0; + w[11] = 0; + w[12] = 0; + w[13] = 0; + w[14] = 0; + w[15] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m08000m (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m08000_m16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const u32x *words_buf_r, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32 w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = pws[gid].i[ 4]; + w[ 5] = pws[gid].i[ 5]; + w[ 6] = pws[gid].i[ 6]; + w[ 7] = pws[gid].i[ 7]; + w[ 8] = pws[gid].i[ 8]; + w[ 9] = pws[gid].i[ 9]; + w[10] = pws[gid].i[10]; + w[11] = pws[gid].i[11]; + w[12] = pws[gid].i[12]; + w[13] = pws[gid].i[13]; + w[14] = pws[gid].i[14]; + w[15] = pws[gid].i[15]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m08000m (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m08000_s04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const u32x *words_buf_r, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32 w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = 0; + w[ 5] = 0; + w[ 6] = 0; + w[ 7] = 0; + w[ 8] = 0; + w[ 9] = 0; + w[10] = 0; + w[11] = 0; + w[12] = 0; + w[13] = 0; + w[14] = 0; + w[15] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m08000s (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m08000_s08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const u32x *words_buf_r, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32 w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = pws[gid].i[ 4]; + w[ 5] = pws[gid].i[ 5]; + w[ 6] = pws[gid].i[ 6]; + w[ 7] = pws[gid].i[ 7]; + w[ 8] = 0; + w[ 9] = 0; + w[10] = 0; + w[11] = 0; + w[12] = 0; + w[13] = 0; + w[14] = 0; + w[15] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m08000s (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m08000_s16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const u32x *words_buf_r, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32 w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = pws[gid].i[ 4]; + w[ 5] = pws[gid].i[ 5]; + w[ 6] = pws[gid].i[ 6]; + w[ 7] = pws[gid].i[ 7]; + w[ 8] = pws[gid].i[ 8]; + w[ 9] = pws[gid].i[ 9]; + w[10] = pws[gid].i[10]; + w[11] = pws[gid].i[11]; + w[12] = pws[gid].i[12]; + w[13] = pws[gid].i[13]; + w[14] = pws[gid].i[14]; + w[15] = pws[gid].i[15]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m08000s (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} diff --git a/nv/m08100_a0.cu b/nv/m08100_a0.cu new file mode 100644 index 0000000000..42c032067a --- /dev/null +++ b/nv/m08100_a0.cu @@ -0,0 +1,547 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _SHA1_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW2 +#define VECT_SIZE1 +#endif + +#define DGST_R0 3 +#define DGST_R1 4 +#define DGST_R2 2 +#define DGST_R3 1 + +#include "include/kernel_functions.c" +#include "types_nv.c" +#include "common_nv.c" +#include "include/rp_gpu.h" +#include "rp_nv.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +__device__ __constant__ gpu_rule_t c_rules[1024]; + +extern "C" __global__ void __launch_bounds__ (256, 1) m08100_m04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + u32x pw_buf1[4]; + + pw_buf1[0] = pws[gid].i[ 4]; + pw_buf1[1] = pws[gid].i[ 5]; + pw_buf1[2] = pws[gid].i[ 6]; + pw_buf1[3] = pws[gid].i[ 7]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * salt + */ + + u32 salt_buf0[2]; + + salt_buf0[0] = swap_workaround (salt_bufs[salt_pos].salt_buf[0]); + salt_buf0[1] = swap_workaround (salt_bufs[salt_pos].salt_buf[1]); + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + u32x w1[4]; + u32x w2[4]; + u32x w3[4]; + + w0[0] = pw_buf0[0]; + w0[1] = pw_buf0[1]; + w0[2] = pw_buf0[2]; + w0[3] = pw_buf0[3]; + w1[0] = pw_buf1[0]; + w1[1] = pw_buf1[1]; + w1[2] = pw_buf1[2]; + w1[3] = pw_buf1[3]; + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 out_len = apply_rules (c_rules[il_pos].cmds, w0, w1, pw_len); + + /** + * prepend salt + */ + + const u32 out_salt_len = out_len + salt_len; + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + w0_t[0] = salt_buf0[0]; + w0_t[1] = salt_buf0[1]; + w0_t[2] = w0[0]; + w0_t[3] = w0[1]; + w1_t[0] = w0[2]; + w1_t[1] = w0[3]; + w1_t[2] = w1[0]; + w1_t[3] = w1[1]; + w2_t[0] = w1[2]; + w2_t[1] = w1[3]; + w2_t[2] = w2[0]; + w2_t[3] = w2[1]; + w3_t[0] = w2[2]; + w3_t[1] = w2[3]; + w3_t[2] = 0; + w3_t[3] = (out_salt_len + 1) * 8; + + append_0x80_4 (w0_t, w1_t, w2_t, w3_t, out_salt_len + 1); + + /** + * sha1 + */ + + w0_t[0] = swap_workaround (w0_t[0]); + w0_t[1] = swap_workaround (w0_t[1]); + w0_t[2] = swap_workaround (w0_t[2]); + w0_t[3] = swap_workaround (w0_t[3]); + w1_t[0] = swap_workaround (w1_t[0]); + w1_t[1] = swap_workaround (w1_t[1]); + w1_t[2] = swap_workaround (w1_t[2]); + w1_t[3] = swap_workaround (w1_t[3]); + w2_t[0] = swap_workaround (w2_t[0]); + w2_t[1] = swap_workaround (w2_t[1]); + w2_t[2] = swap_workaround (w2_t[2]); + w2_t[3] = swap_workaround (w2_t[3]); + w3_t[0] = swap_workaround (w3_t[0]); + w3_t[1] = swap_workaround (w3_t[1]); + //w3_t[2] = swap_workaround (w3_t[2]); + //w3_t[3] = swap_workaround (w3_t[3]); + + u32x a = SHA1M_A; + u32x b = SHA1M_B; + u32x c = SHA1M_C; + u32x d = SHA1M_D; + u32x e = SHA1M_E; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w0_t[0]); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w0_t[1]); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w0_t[2]); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w0_t[3]); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w1_t[0]); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w1_t[1]); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w1_t[2]); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w1_t[3]); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w2_t[0]); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w2_t[1]); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w2_t[2]); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w2_t[3]); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w3_t[0]); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w3_t[1]); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w3_t[2]); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w3_t[3]); + w0_t[0] = rotl32 ((w3_t[1] ^ w2_t[0] ^ w0_t[2] ^ w0_t[0]), 1u); SHA1_STEP (SHA1_F0o, e, a, b, c, d, w0_t[0]); + w0_t[1] = rotl32 ((w3_t[2] ^ w2_t[1] ^ w0_t[3] ^ w0_t[1]), 1u); SHA1_STEP (SHA1_F0o, d, e, a, b, c, w0_t[1]); + w0_t[2] = rotl32 ((w3_t[3] ^ w2_t[2] ^ w1_t[0] ^ w0_t[2]), 1u); SHA1_STEP (SHA1_F0o, c, d, e, a, b, w0_t[2]); + w0_t[3] = rotl32 ((w0_t[0] ^ w2_t[3] ^ w1_t[1] ^ w0_t[3]), 1u); SHA1_STEP (SHA1_F0o, b, c, d, e, a, w0_t[3]); + + #undef K + #define K SHA1C01 + + w1_t[0] = rotl32 ((w0_t[1] ^ w3_t[0] ^ w1_t[2] ^ w1_t[0]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w1_t[0]); + w1_t[1] = rotl32 ((w0_t[2] ^ w3_t[1] ^ w1_t[3] ^ w1_t[1]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w1_t[1]); + w1_t[2] = rotl32 ((w0_t[3] ^ w3_t[2] ^ w2_t[0] ^ w1_t[2]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w1_t[2]); + w1_t[3] = rotl32 ((w1_t[0] ^ w3_t[3] ^ w2_t[1] ^ w1_t[3]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1_t[3]); + w2_t[0] = rotl32 ((w1_t[1] ^ w0_t[0] ^ w2_t[2] ^ w2_t[0]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w2_t[0]); + w2_t[1] = rotl32 ((w1_t[2] ^ w0_t[1] ^ w2_t[3] ^ w2_t[1]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w2_t[1]); + w2_t[2] = rotl32 ((w1_t[3] ^ w0_t[2] ^ w3_t[0] ^ w2_t[2]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w2_t[2]); + w2_t[3] = rotl32 ((w2_t[0] ^ w0_t[3] ^ w3_t[1] ^ w2_t[3]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w2_t[3]); + w3_t[0] = rotl32 ((w2_t[1] ^ w1_t[0] ^ w3_t[2] ^ w3_t[0]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w3_t[0]); + w3_t[1] = rotl32 ((w2_t[2] ^ w1_t[1] ^ w3_t[3] ^ w3_t[1]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w3_t[1]); + w3_t[2] = rotl32 ((w2_t[3] ^ w1_t[2] ^ w0_t[0] ^ w3_t[2]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w3_t[2]); + w3_t[3] = rotl32 ((w3_t[0] ^ w1_t[3] ^ w0_t[1] ^ w3_t[3]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w3_t[3]); + w0_t[0] = rotl32 ((w3_t[1] ^ w2_t[0] ^ w0_t[2] ^ w0_t[0]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w0_t[0]); + w0_t[1] = rotl32 ((w3_t[2] ^ w2_t[1] ^ w0_t[3] ^ w0_t[1]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w0_t[1]); + w0_t[2] = rotl32 ((w3_t[3] ^ w2_t[2] ^ w1_t[0] ^ w0_t[2]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w0_t[2]); + w0_t[3] = rotl32 ((w0_t[0] ^ w2_t[3] ^ w1_t[1] ^ w0_t[3]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w0_t[3]); + w1_t[0] = rotl32 ((w0_t[1] ^ w3_t[0] ^ w1_t[2] ^ w1_t[0]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w1_t[0]); + w1_t[1] = rotl32 ((w0_t[2] ^ w3_t[1] ^ w1_t[3] ^ w1_t[1]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w1_t[1]); + w1_t[2] = rotl32 ((w0_t[3] ^ w3_t[2] ^ w2_t[0] ^ w1_t[2]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1_t[2]); + w1_t[3] = rotl32 ((w1_t[0] ^ w3_t[3] ^ w2_t[1] ^ w1_t[3]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w1_t[3]); + + #undef K + #define K SHA1C02 + + w2_t[0] = rotl32 ((w1_t[1] ^ w0_t[0] ^ w2_t[2] ^ w2_t[0]), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w2_t[0]); + w2_t[1] = rotl32 ((w1_t[2] ^ w0_t[1] ^ w2_t[3] ^ w2_t[1]), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w2_t[1]); + w2_t[2] = rotl32 ((w1_t[3] ^ w0_t[2] ^ w3_t[0] ^ w2_t[2]), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w2_t[2]); + w2_t[3] = rotl32 ((w2_t[0] ^ w0_t[3] ^ w3_t[1] ^ w2_t[3]), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w2_t[3]); + w3_t[0] = rotl32 ((w2_t[1] ^ w1_t[0] ^ w3_t[2] ^ w3_t[0]), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w3_t[0]); + w3_t[1] = rotl32 ((w2_t[2] ^ w1_t[1] ^ w3_t[3] ^ w3_t[1]), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w3_t[1]); + w3_t[2] = rotl32 ((w2_t[3] ^ w1_t[2] ^ w0_t[0] ^ w3_t[2]), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w3_t[2]); + w3_t[3] = rotl32 ((w3_t[0] ^ w1_t[3] ^ w0_t[1] ^ w3_t[3]), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w3_t[3]); + w0_t[0] = rotl32 ((w3_t[1] ^ w2_t[0] ^ w0_t[2] ^ w0_t[0]), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w0_t[0]); + w0_t[1] = rotl32 ((w3_t[2] ^ w2_t[1] ^ w0_t[3] ^ w0_t[1]), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w0_t[1]); + w0_t[2] = rotl32 ((w3_t[3] ^ w2_t[2] ^ w1_t[0] ^ w0_t[2]), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w0_t[2]); + w0_t[3] = rotl32 ((w0_t[0] ^ w2_t[3] ^ w1_t[1] ^ w0_t[3]), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w0_t[3]); + w1_t[0] = rotl32 ((w0_t[1] ^ w3_t[0] ^ w1_t[2] ^ w1_t[0]), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w1_t[0]); + w1_t[1] = rotl32 ((w0_t[2] ^ w3_t[1] ^ w1_t[3] ^ w1_t[1]), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w1_t[1]); + w1_t[2] = rotl32 ((w0_t[3] ^ w3_t[2] ^ w2_t[0] ^ w1_t[2]), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w1_t[2]); + w1_t[3] = rotl32 ((w1_t[0] ^ w3_t[3] ^ w2_t[1] ^ w1_t[3]), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w1_t[3]); + w2_t[0] = rotl32 ((w1_t[1] ^ w0_t[0] ^ w2_t[2] ^ w2_t[0]), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w2_t[0]); + w2_t[1] = rotl32 ((w1_t[2] ^ w0_t[1] ^ w2_t[3] ^ w2_t[1]), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w2_t[1]); + w2_t[2] = rotl32 ((w1_t[3] ^ w0_t[2] ^ w3_t[0] ^ w2_t[2]), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w2_t[2]); + w2_t[3] = rotl32 ((w2_t[0] ^ w0_t[3] ^ w3_t[1] ^ w2_t[3]), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w2_t[3]); + + #undef K + #define K SHA1C03 + + w3_t[0] = rotl32 ((w2_t[1] ^ w1_t[0] ^ w3_t[2] ^ w3_t[0]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w3_t[0]); + w3_t[1] = rotl32 ((w2_t[2] ^ w1_t[1] ^ w3_t[3] ^ w3_t[1]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w3_t[1]); + w3_t[2] = rotl32 ((w2_t[3] ^ w1_t[2] ^ w0_t[0] ^ w3_t[2]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w3_t[2]); + w3_t[3] = rotl32 ((w3_t[0] ^ w1_t[3] ^ w0_t[1] ^ w3_t[3]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w3_t[3]); + w0_t[0] = rotl32 ((w3_t[1] ^ w2_t[0] ^ w0_t[2] ^ w0_t[0]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w0_t[0]); + w0_t[1] = rotl32 ((w3_t[2] ^ w2_t[1] ^ w0_t[3] ^ w0_t[1]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w0_t[1]); + w0_t[2] = rotl32 ((w3_t[3] ^ w2_t[2] ^ w1_t[0] ^ w0_t[2]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w0_t[2]); + w0_t[3] = rotl32 ((w0_t[0] ^ w2_t[3] ^ w1_t[1] ^ w0_t[3]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w0_t[3]); + w1_t[0] = rotl32 ((w0_t[1] ^ w3_t[0] ^ w1_t[2] ^ w1_t[0]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1_t[0]); + w1_t[1] = rotl32 ((w0_t[2] ^ w3_t[1] ^ w1_t[3] ^ w1_t[1]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w1_t[1]); + w1_t[2] = rotl32 ((w0_t[3] ^ w3_t[2] ^ w2_t[0] ^ w1_t[2]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w1_t[2]); + w1_t[3] = rotl32 ((w1_t[0] ^ w3_t[3] ^ w2_t[1] ^ w1_t[3]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w1_t[3]); + w2_t[0] = rotl32 ((w1_t[1] ^ w0_t[0] ^ w2_t[2] ^ w2_t[0]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w2_t[0]); + w2_t[1] = rotl32 ((w1_t[2] ^ w0_t[1] ^ w2_t[3] ^ w2_t[1]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w2_t[1]); + w2_t[2] = rotl32 ((w1_t[3] ^ w0_t[2] ^ w3_t[0] ^ w2_t[2]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w2_t[2]); + w2_t[3] = rotl32 ((w2_t[0] ^ w0_t[3] ^ w3_t[1] ^ w2_t[3]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w2_t[3]); + w3_t[0] = rotl32 ((w2_t[1] ^ w1_t[0] ^ w3_t[2] ^ w3_t[0]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w3_t[0]); + w3_t[1] = rotl32 ((w2_t[2] ^ w1_t[1] ^ w3_t[3] ^ w3_t[1]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w3_t[1]); + w3_t[2] = rotl32 ((w2_t[3] ^ w1_t[2] ^ w0_t[0] ^ w3_t[2]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w3_t[2]); + w3_t[3] = rotl32 ((w3_t[0] ^ w1_t[3] ^ w0_t[1] ^ w3_t[3]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w3_t[3]); + + const u32x r0 = d; + const u32x r1 = e; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_M + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m08100_m08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m08100_m16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m08100_s04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + u32x pw_buf1[4]; + + pw_buf1[0] = pws[gid].i[ 4]; + pw_buf1[1] = pws[gid].i[ 5]; + pw_buf1[2] = pws[gid].i[ 6]; + pw_buf1[3] = pws[gid].i[ 7]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * salt + */ + + u32 salt_buf0[2]; + + salt_buf0[0] = swap_workaround (salt_bufs[salt_pos].salt_buf[0]); + salt_buf0[1] = swap_workaround (salt_bufs[salt_pos].salt_buf[1]); + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * reverse + */ + + const u32 e_rev = rotl32 (search[1], 2u); + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + u32x w1[4]; + u32x w2[4]; + u32x w3[4]; + + w0[0] = pw_buf0[0]; + w0[1] = pw_buf0[1]; + w0[2] = pw_buf0[2]; + w0[3] = pw_buf0[3]; + w1[0] = pw_buf1[0]; + w1[1] = pw_buf1[1]; + w1[2] = pw_buf1[2]; + w1[3] = pw_buf1[3]; + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 out_len = apply_rules (c_rules[il_pos].cmds, w0, w1, pw_len); + + /** + * prepend salt + */ + + const u32 out_salt_len = out_len + salt_len; + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + w0_t[0] = salt_buf0[0]; + w0_t[1] = salt_buf0[1]; + w0_t[2] = w0[0]; + w0_t[3] = w0[1]; + w1_t[0] = w0[2]; + w1_t[1] = w0[3]; + w1_t[2] = w1[0]; + w1_t[3] = w1[1]; + w2_t[0] = w1[2]; + w2_t[1] = w1[3]; + w2_t[2] = w2[0]; + w2_t[3] = w2[1]; + w3_t[0] = w2[2]; + w3_t[1] = w2[3]; + w3_t[2] = 0; + w3_t[3] = (out_salt_len + 1) * 8; + + append_0x80_4 (w0_t, w1_t, w2_t, w3_t, out_salt_len + 1); + + /** + * sha1 + */ + + w0_t[0] = swap_workaround (w0_t[0]); + w0_t[1] = swap_workaround (w0_t[1]); + w0_t[2] = swap_workaround (w0_t[2]); + w0_t[3] = swap_workaround (w0_t[3]); + w1_t[0] = swap_workaround (w1_t[0]); + w1_t[1] = swap_workaround (w1_t[1]); + w1_t[2] = swap_workaround (w1_t[2]); + w1_t[3] = swap_workaround (w1_t[3]); + w2_t[0] = swap_workaround (w2_t[0]); + w2_t[1] = swap_workaround (w2_t[1]); + w2_t[2] = swap_workaround (w2_t[2]); + w2_t[3] = swap_workaround (w2_t[3]); + w3_t[0] = swap_workaround (w3_t[0]); + w3_t[1] = swap_workaround (w3_t[1]); + //w3_t[2] = swap_workaround (w3_t[2]); + //w3_t[3] = swap_workaround (w3_t[3]); + + u32x a = SHA1M_A; + u32x b = SHA1M_B; + u32x c = SHA1M_C; + u32x d = SHA1M_D; + u32x e = SHA1M_E; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w0_t[0]); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w0_t[1]); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w0_t[2]); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w0_t[3]); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w1_t[0]); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w1_t[1]); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w1_t[2]); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w1_t[3]); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w2_t[0]); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w2_t[1]); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w2_t[2]); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w2_t[3]); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w3_t[0]); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w3_t[1]); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w3_t[2]); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w3_t[3]); + w0_t[0] = rotl32 ((w3_t[1] ^ w2_t[0] ^ w0_t[2] ^ w0_t[0]), 1u); SHA1_STEP (SHA1_F0o, e, a, b, c, d, w0_t[0]); + w0_t[1] = rotl32 ((w3_t[2] ^ w2_t[1] ^ w0_t[3] ^ w0_t[1]), 1u); SHA1_STEP (SHA1_F0o, d, e, a, b, c, w0_t[1]); + w0_t[2] = rotl32 ((w3_t[3] ^ w2_t[2] ^ w1_t[0] ^ w0_t[2]), 1u); SHA1_STEP (SHA1_F0o, c, d, e, a, b, w0_t[2]); + w0_t[3] = rotl32 ((w0_t[0] ^ w2_t[3] ^ w1_t[1] ^ w0_t[3]), 1u); SHA1_STEP (SHA1_F0o, b, c, d, e, a, w0_t[3]); + + #undef K + #define K SHA1C01 + + w1_t[0] = rotl32 ((w0_t[1] ^ w3_t[0] ^ w1_t[2] ^ w1_t[0]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w1_t[0]); + w1_t[1] = rotl32 ((w0_t[2] ^ w3_t[1] ^ w1_t[3] ^ w1_t[1]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w1_t[1]); + w1_t[2] = rotl32 ((w0_t[3] ^ w3_t[2] ^ w2_t[0] ^ w1_t[2]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w1_t[2]); + w1_t[3] = rotl32 ((w1_t[0] ^ w3_t[3] ^ w2_t[1] ^ w1_t[3]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1_t[3]); + w2_t[0] = rotl32 ((w1_t[1] ^ w0_t[0] ^ w2_t[2] ^ w2_t[0]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w2_t[0]); + w2_t[1] = rotl32 ((w1_t[2] ^ w0_t[1] ^ w2_t[3] ^ w2_t[1]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w2_t[1]); + w2_t[2] = rotl32 ((w1_t[3] ^ w0_t[2] ^ w3_t[0] ^ w2_t[2]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w2_t[2]); + w2_t[3] = rotl32 ((w2_t[0] ^ w0_t[3] ^ w3_t[1] ^ w2_t[3]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w2_t[3]); + w3_t[0] = rotl32 ((w2_t[1] ^ w1_t[0] ^ w3_t[2] ^ w3_t[0]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w3_t[0]); + w3_t[1] = rotl32 ((w2_t[2] ^ w1_t[1] ^ w3_t[3] ^ w3_t[1]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w3_t[1]); + w3_t[2] = rotl32 ((w2_t[3] ^ w1_t[2] ^ w0_t[0] ^ w3_t[2]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w3_t[2]); + w3_t[3] = rotl32 ((w3_t[0] ^ w1_t[3] ^ w0_t[1] ^ w3_t[3]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w3_t[3]); + w0_t[0] = rotl32 ((w3_t[1] ^ w2_t[0] ^ w0_t[2] ^ w0_t[0]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w0_t[0]); + w0_t[1] = rotl32 ((w3_t[2] ^ w2_t[1] ^ w0_t[3] ^ w0_t[1]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w0_t[1]); + w0_t[2] = rotl32 ((w3_t[3] ^ w2_t[2] ^ w1_t[0] ^ w0_t[2]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w0_t[2]); + w0_t[3] = rotl32 ((w0_t[0] ^ w2_t[3] ^ w1_t[1] ^ w0_t[3]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w0_t[3]); + w1_t[0] = rotl32 ((w0_t[1] ^ w3_t[0] ^ w1_t[2] ^ w1_t[0]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w1_t[0]); + w1_t[1] = rotl32 ((w0_t[2] ^ w3_t[1] ^ w1_t[3] ^ w1_t[1]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w1_t[1]); + w1_t[2] = rotl32 ((w0_t[3] ^ w3_t[2] ^ w2_t[0] ^ w1_t[2]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1_t[2]); + w1_t[3] = rotl32 ((w1_t[0] ^ w3_t[3] ^ w2_t[1] ^ w1_t[3]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w1_t[3]); + + #undef K + #define K SHA1C02 + + w2_t[0] = rotl32 ((w1_t[1] ^ w0_t[0] ^ w2_t[2] ^ w2_t[0]), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w2_t[0]); + w2_t[1] = rotl32 ((w1_t[2] ^ w0_t[1] ^ w2_t[3] ^ w2_t[1]), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w2_t[1]); + w2_t[2] = rotl32 ((w1_t[3] ^ w0_t[2] ^ w3_t[0] ^ w2_t[2]), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w2_t[2]); + w2_t[3] = rotl32 ((w2_t[0] ^ w0_t[3] ^ w3_t[1] ^ w2_t[3]), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w2_t[3]); + w3_t[0] = rotl32 ((w2_t[1] ^ w1_t[0] ^ w3_t[2] ^ w3_t[0]), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w3_t[0]); + w3_t[1] = rotl32 ((w2_t[2] ^ w1_t[1] ^ w3_t[3] ^ w3_t[1]), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w3_t[1]); + w3_t[2] = rotl32 ((w2_t[3] ^ w1_t[2] ^ w0_t[0] ^ w3_t[2]), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w3_t[2]); + w3_t[3] = rotl32 ((w3_t[0] ^ w1_t[3] ^ w0_t[1] ^ w3_t[3]), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w3_t[3]); + w0_t[0] = rotl32 ((w3_t[1] ^ w2_t[0] ^ w0_t[2] ^ w0_t[0]), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w0_t[0]); + w0_t[1] = rotl32 ((w3_t[2] ^ w2_t[1] ^ w0_t[3] ^ w0_t[1]), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w0_t[1]); + w0_t[2] = rotl32 ((w3_t[3] ^ w2_t[2] ^ w1_t[0] ^ w0_t[2]), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w0_t[2]); + w0_t[3] = rotl32 ((w0_t[0] ^ w2_t[3] ^ w1_t[1] ^ w0_t[3]), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w0_t[3]); + w1_t[0] = rotl32 ((w0_t[1] ^ w3_t[0] ^ w1_t[2] ^ w1_t[0]), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w1_t[0]); + w1_t[1] = rotl32 ((w0_t[2] ^ w3_t[1] ^ w1_t[3] ^ w1_t[1]), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w1_t[1]); + w1_t[2] = rotl32 ((w0_t[3] ^ w3_t[2] ^ w2_t[0] ^ w1_t[2]), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w1_t[2]); + w1_t[3] = rotl32 ((w1_t[0] ^ w3_t[3] ^ w2_t[1] ^ w1_t[3]), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w1_t[3]); + w2_t[0] = rotl32 ((w1_t[1] ^ w0_t[0] ^ w2_t[2] ^ w2_t[0]), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w2_t[0]); + w2_t[1] = rotl32 ((w1_t[2] ^ w0_t[1] ^ w2_t[3] ^ w2_t[1]), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w2_t[1]); + w2_t[2] = rotl32 ((w1_t[3] ^ w0_t[2] ^ w3_t[0] ^ w2_t[2]), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w2_t[2]); + w2_t[3] = rotl32 ((w2_t[0] ^ w0_t[3] ^ w3_t[1] ^ w2_t[3]), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w2_t[3]); + + #undef K + #define K SHA1C03 + + w3_t[0] = rotl32 ((w2_t[1] ^ w1_t[0] ^ w3_t[2] ^ w3_t[0]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w3_t[0]); + w3_t[1] = rotl32 ((w2_t[2] ^ w1_t[1] ^ w3_t[3] ^ w3_t[1]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w3_t[1]); + w3_t[2] = rotl32 ((w2_t[3] ^ w1_t[2] ^ w0_t[0] ^ w3_t[2]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w3_t[2]); + w3_t[3] = rotl32 ((w3_t[0] ^ w1_t[3] ^ w0_t[1] ^ w3_t[3]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w3_t[3]); + w0_t[0] = rotl32 ((w3_t[1] ^ w2_t[0] ^ w0_t[2] ^ w0_t[0]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w0_t[0]); + w0_t[1] = rotl32 ((w3_t[2] ^ w2_t[1] ^ w0_t[3] ^ w0_t[1]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w0_t[1]); + w0_t[2] = rotl32 ((w3_t[3] ^ w2_t[2] ^ w1_t[0] ^ w0_t[2]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w0_t[2]); + w0_t[3] = rotl32 ((w0_t[0] ^ w2_t[3] ^ w1_t[1] ^ w0_t[3]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w0_t[3]); + w1_t[0] = rotl32 ((w0_t[1] ^ w3_t[0] ^ w1_t[2] ^ w1_t[0]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1_t[0]); + w1_t[1] = rotl32 ((w0_t[2] ^ w3_t[1] ^ w1_t[3] ^ w1_t[1]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w1_t[1]); + w1_t[2] = rotl32 ((w0_t[3] ^ w3_t[2] ^ w2_t[0] ^ w1_t[2]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w1_t[2]); + w1_t[3] = rotl32 ((w1_t[0] ^ w3_t[3] ^ w2_t[1] ^ w1_t[3]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w1_t[3]); + w2_t[0] = rotl32 ((w1_t[1] ^ w0_t[0] ^ w2_t[2] ^ w2_t[0]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w2_t[0]); + w2_t[1] = rotl32 ((w1_t[2] ^ w0_t[1] ^ w2_t[3] ^ w2_t[1]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w2_t[1]); + w2_t[2] = rotl32 ((w1_t[3] ^ w0_t[2] ^ w3_t[0] ^ w2_t[2]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w2_t[2]); + w2_t[3] = rotl32 ((w2_t[0] ^ w0_t[3] ^ w3_t[1] ^ w2_t[3]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w2_t[3]); + w3_t[0] = rotl32 ((w2_t[1] ^ w1_t[0] ^ w3_t[2] ^ w3_t[0]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w3_t[0]); + + if (e != e_rev) continue; + + w3_t[1] = rotl32 ((w2_t[2] ^ w1_t[1] ^ w3_t[3] ^ w3_t[1]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w3_t[1]); + w3_t[2] = rotl32 ((w2_t[3] ^ w1_t[2] ^ w0_t[0] ^ w3_t[2]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w3_t[2]); + w3_t[3] = rotl32 ((w3_t[0] ^ w1_t[3] ^ w0_t[1] ^ w3_t[3]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w3_t[3]); + + const u32x r0 = d; + const u32x r1 = e; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_S + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m08100_s08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m08100_s16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/nv/m08100_a1.cu b/nv/m08100_a1.cu new file mode 100644 index 0000000000..54da4f62b7 --- /dev/null +++ b/nv/m08100_a1.cu @@ -0,0 +1,641 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _SHA1_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW2 +#define VECT_SIZE1 +#endif + +#define DGST_R0 3 +#define DGST_R1 4 +#define DGST_R2 2 +#define DGST_R3 1 + +#include "include/kernel_functions.c" +#include "types_nv.c" +#include "common_nv.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +__device__ __constant__ comb_t c_combs[1024]; + +extern "C" __global__ void __launch_bounds__ (256, 1) m08100_m04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, c_combs[0].pw_len); + } + + /** + * salt + */ + + u32 salt_buf0[2]; + + salt_buf0[0] = swap_workaround (salt_bufs[salt_pos].salt_buf[0]); + salt_buf0[1] = swap_workaround (salt_bufs[salt_pos].salt_buf[1]); + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = c_combs[il_pos].pw_len; + + const u32 pw_len = pw_l_len + pw_r_len; + + u32 wordr0[4]; + u32 wordr1[4]; + u32 wordr2[4]; + u32 wordr3[4]; + + wordr0[0] = c_combs[il_pos].i[0]; + wordr0[1] = c_combs[il_pos].i[1]; + wordr0[2] = c_combs[il_pos].i[2]; + wordr0[3] = c_combs[il_pos].i[3]; + wordr1[0] = c_combs[il_pos].i[4]; + wordr1[1] = c_combs[il_pos].i[5]; + wordr1[2] = c_combs[il_pos].i[6]; + wordr1[3] = c_combs[il_pos].i[7]; + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + u32x w0[4]; + u32x w1[4]; + u32x w2[4]; + u32x w3[4]; + + w0[0] = wordl0[0] | wordr0[0]; + w0[1] = wordl0[1] | wordr0[1]; + w0[2] = wordl0[2] | wordr0[2]; + w0[3] = wordl0[3] | wordr0[3]; + w1[0] = wordl1[0] | wordr1[0]; + w1[1] = wordl1[1] | wordr1[1]; + w1[2] = wordl1[2] | wordr1[2]; + w1[3] = wordl1[3] | wordr1[3]; + w2[0] = wordl2[0] | wordr2[0]; + w2[1] = wordl2[1] | wordr2[1]; + w2[2] = wordl2[2] | wordr2[2]; + w2[3] = wordl2[3] | wordr2[3]; + w3[0] = wordl3[0] | wordr3[0]; + w3[1] = wordl3[1] | wordr3[1]; + w3[2] = wordl3[2] | wordr3[2]; + w3[3] = wordl3[3] | wordr3[3]; + + /** + * prepend salt + */ + + const u32 pw_salt_len = pw_len + salt_len; + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + w0_t[0] = salt_buf0[0]; + w0_t[1] = salt_buf0[1]; + w0_t[2] = w0[0]; + w0_t[3] = w0[1]; + w1_t[0] = w0[2]; + w1_t[1] = w0[3]; + w1_t[2] = w1[0]; + w1_t[3] = w1[1]; + w2_t[0] = w1[2]; + w2_t[1] = w1[3]; + w2_t[2] = w2[0]; + w2_t[3] = w2[1]; + w3_t[0] = w2[2]; + w3_t[1] = w2[3]; + w3_t[2] = 0; + w3_t[3] = (pw_salt_len + 1) * 8; + + append_0x80_4 (w0_t, w1_t, w2_t, w3_t, pw_salt_len + 1); + + /** + * sha1 + */ + + w0_t[0] = swap_workaround (w0_t[0]); + w0_t[1] = swap_workaround (w0_t[1]); + w0_t[2] = swap_workaround (w0_t[2]); + w0_t[3] = swap_workaround (w0_t[3]); + w1_t[0] = swap_workaround (w1_t[0]); + w1_t[1] = swap_workaround (w1_t[1]); + w1_t[2] = swap_workaround (w1_t[2]); + w1_t[3] = swap_workaround (w1_t[3]); + w2_t[0] = swap_workaround (w2_t[0]); + w2_t[1] = swap_workaround (w2_t[1]); + w2_t[2] = swap_workaround (w2_t[2]); + w2_t[3] = swap_workaround (w2_t[3]); + w3_t[0] = swap_workaround (w3_t[0]); + w3_t[1] = swap_workaround (w3_t[1]); + //w3_t[2] = swap_workaround (w3_t[2]); + //w3_t[3] = swap_workaround (w3_t[3]); + + u32x a = SHA1M_A; + u32x b = SHA1M_B; + u32x c = SHA1M_C; + u32x d = SHA1M_D; + u32x e = SHA1M_E; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w0_t[0]); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w0_t[1]); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w0_t[2]); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w0_t[3]); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w1_t[0]); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w1_t[1]); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w1_t[2]); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w1_t[3]); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w2_t[0]); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w2_t[1]); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w2_t[2]); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w2_t[3]); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w3_t[0]); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w3_t[1]); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w3_t[2]); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w3_t[3]); + w0_t[0] = rotl32 ((w3_t[1] ^ w2_t[0] ^ w0_t[2] ^ w0_t[0]), 1u); SHA1_STEP (SHA1_F0o, e, a, b, c, d, w0_t[0]); + w0_t[1] = rotl32 ((w3_t[2] ^ w2_t[1] ^ w0_t[3] ^ w0_t[1]), 1u); SHA1_STEP (SHA1_F0o, d, e, a, b, c, w0_t[1]); + w0_t[2] = rotl32 ((w3_t[3] ^ w2_t[2] ^ w1_t[0] ^ w0_t[2]), 1u); SHA1_STEP (SHA1_F0o, c, d, e, a, b, w0_t[2]); + w0_t[3] = rotl32 ((w0_t[0] ^ w2_t[3] ^ w1_t[1] ^ w0_t[3]), 1u); SHA1_STEP (SHA1_F0o, b, c, d, e, a, w0_t[3]); + + #undef K + #define K SHA1C01 + + w1_t[0] = rotl32 ((w0_t[1] ^ w3_t[0] ^ w1_t[2] ^ w1_t[0]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w1_t[0]); + w1_t[1] = rotl32 ((w0_t[2] ^ w3_t[1] ^ w1_t[3] ^ w1_t[1]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w1_t[1]); + w1_t[2] = rotl32 ((w0_t[3] ^ w3_t[2] ^ w2_t[0] ^ w1_t[2]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w1_t[2]); + w1_t[3] = rotl32 ((w1_t[0] ^ w3_t[3] ^ w2_t[1] ^ w1_t[3]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1_t[3]); + w2_t[0] = rotl32 ((w1_t[1] ^ w0_t[0] ^ w2_t[2] ^ w2_t[0]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w2_t[0]); + w2_t[1] = rotl32 ((w1_t[2] ^ w0_t[1] ^ w2_t[3] ^ w2_t[1]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w2_t[1]); + w2_t[2] = rotl32 ((w1_t[3] ^ w0_t[2] ^ w3_t[0] ^ w2_t[2]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w2_t[2]); + w2_t[3] = rotl32 ((w2_t[0] ^ w0_t[3] ^ w3_t[1] ^ w2_t[3]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w2_t[3]); + w3_t[0] = rotl32 ((w2_t[1] ^ w1_t[0] ^ w3_t[2] ^ w3_t[0]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w3_t[0]); + w3_t[1] = rotl32 ((w2_t[2] ^ w1_t[1] ^ w3_t[3] ^ w3_t[1]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w3_t[1]); + w3_t[2] = rotl32 ((w2_t[3] ^ w1_t[2] ^ w0_t[0] ^ w3_t[2]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w3_t[2]); + w3_t[3] = rotl32 ((w3_t[0] ^ w1_t[3] ^ w0_t[1] ^ w3_t[3]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w3_t[3]); + w0_t[0] = rotl32 ((w3_t[1] ^ w2_t[0] ^ w0_t[2] ^ w0_t[0]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w0_t[0]); + w0_t[1] = rotl32 ((w3_t[2] ^ w2_t[1] ^ w0_t[3] ^ w0_t[1]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w0_t[1]); + w0_t[2] = rotl32 ((w3_t[3] ^ w2_t[2] ^ w1_t[0] ^ w0_t[2]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w0_t[2]); + w0_t[3] = rotl32 ((w0_t[0] ^ w2_t[3] ^ w1_t[1] ^ w0_t[3]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w0_t[3]); + w1_t[0] = rotl32 ((w0_t[1] ^ w3_t[0] ^ w1_t[2] ^ w1_t[0]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w1_t[0]); + w1_t[1] = rotl32 ((w0_t[2] ^ w3_t[1] ^ w1_t[3] ^ w1_t[1]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w1_t[1]); + w1_t[2] = rotl32 ((w0_t[3] ^ w3_t[2] ^ w2_t[0] ^ w1_t[2]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1_t[2]); + w1_t[3] = rotl32 ((w1_t[0] ^ w3_t[3] ^ w2_t[1] ^ w1_t[3]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w1_t[3]); + + #undef K + #define K SHA1C02 + + w2_t[0] = rotl32 ((w1_t[1] ^ w0_t[0] ^ w2_t[2] ^ w2_t[0]), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w2_t[0]); + w2_t[1] = rotl32 ((w1_t[2] ^ w0_t[1] ^ w2_t[3] ^ w2_t[1]), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w2_t[1]); + w2_t[2] = rotl32 ((w1_t[3] ^ w0_t[2] ^ w3_t[0] ^ w2_t[2]), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w2_t[2]); + w2_t[3] = rotl32 ((w2_t[0] ^ w0_t[3] ^ w3_t[1] ^ w2_t[3]), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w2_t[3]); + w3_t[0] = rotl32 ((w2_t[1] ^ w1_t[0] ^ w3_t[2] ^ w3_t[0]), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w3_t[0]); + w3_t[1] = rotl32 ((w2_t[2] ^ w1_t[1] ^ w3_t[3] ^ w3_t[1]), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w3_t[1]); + w3_t[2] = rotl32 ((w2_t[3] ^ w1_t[2] ^ w0_t[0] ^ w3_t[2]), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w3_t[2]); + w3_t[3] = rotl32 ((w3_t[0] ^ w1_t[3] ^ w0_t[1] ^ w3_t[3]), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w3_t[3]); + w0_t[0] = rotl32 ((w3_t[1] ^ w2_t[0] ^ w0_t[2] ^ w0_t[0]), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w0_t[0]); + w0_t[1] = rotl32 ((w3_t[2] ^ w2_t[1] ^ w0_t[3] ^ w0_t[1]), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w0_t[1]); + w0_t[2] = rotl32 ((w3_t[3] ^ w2_t[2] ^ w1_t[0] ^ w0_t[2]), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w0_t[2]); + w0_t[3] = rotl32 ((w0_t[0] ^ w2_t[3] ^ w1_t[1] ^ w0_t[3]), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w0_t[3]); + w1_t[0] = rotl32 ((w0_t[1] ^ w3_t[0] ^ w1_t[2] ^ w1_t[0]), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w1_t[0]); + w1_t[1] = rotl32 ((w0_t[2] ^ w3_t[1] ^ w1_t[3] ^ w1_t[1]), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w1_t[1]); + w1_t[2] = rotl32 ((w0_t[3] ^ w3_t[2] ^ w2_t[0] ^ w1_t[2]), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w1_t[2]); + w1_t[3] = rotl32 ((w1_t[0] ^ w3_t[3] ^ w2_t[1] ^ w1_t[3]), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w1_t[3]); + w2_t[0] = rotl32 ((w1_t[1] ^ w0_t[0] ^ w2_t[2] ^ w2_t[0]), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w2_t[0]); + w2_t[1] = rotl32 ((w1_t[2] ^ w0_t[1] ^ w2_t[3] ^ w2_t[1]), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w2_t[1]); + w2_t[2] = rotl32 ((w1_t[3] ^ w0_t[2] ^ w3_t[0] ^ w2_t[2]), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w2_t[2]); + w2_t[3] = rotl32 ((w2_t[0] ^ w0_t[3] ^ w3_t[1] ^ w2_t[3]), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w2_t[3]); + + #undef K + #define K SHA1C03 + + w3_t[0] = rotl32 ((w2_t[1] ^ w1_t[0] ^ w3_t[2] ^ w3_t[0]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w3_t[0]); + w3_t[1] = rotl32 ((w2_t[2] ^ w1_t[1] ^ w3_t[3] ^ w3_t[1]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w3_t[1]); + w3_t[2] = rotl32 ((w2_t[3] ^ w1_t[2] ^ w0_t[0] ^ w3_t[2]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w3_t[2]); + w3_t[3] = rotl32 ((w3_t[0] ^ w1_t[3] ^ w0_t[1] ^ w3_t[3]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w3_t[3]); + w0_t[0] = rotl32 ((w3_t[1] ^ w2_t[0] ^ w0_t[2] ^ w0_t[0]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w0_t[0]); + w0_t[1] = rotl32 ((w3_t[2] ^ w2_t[1] ^ w0_t[3] ^ w0_t[1]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w0_t[1]); + w0_t[2] = rotl32 ((w3_t[3] ^ w2_t[2] ^ w1_t[0] ^ w0_t[2]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w0_t[2]); + w0_t[3] = rotl32 ((w0_t[0] ^ w2_t[3] ^ w1_t[1] ^ w0_t[3]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w0_t[3]); + w1_t[0] = rotl32 ((w0_t[1] ^ w3_t[0] ^ w1_t[2] ^ w1_t[0]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1_t[0]); + w1_t[1] = rotl32 ((w0_t[2] ^ w3_t[1] ^ w1_t[3] ^ w1_t[1]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w1_t[1]); + w1_t[2] = rotl32 ((w0_t[3] ^ w3_t[2] ^ w2_t[0] ^ w1_t[2]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w1_t[2]); + w1_t[3] = rotl32 ((w1_t[0] ^ w3_t[3] ^ w2_t[1] ^ w1_t[3]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w1_t[3]); + w2_t[0] = rotl32 ((w1_t[1] ^ w0_t[0] ^ w2_t[2] ^ w2_t[0]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w2_t[0]); + w2_t[1] = rotl32 ((w1_t[2] ^ w0_t[1] ^ w2_t[3] ^ w2_t[1]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w2_t[1]); + w2_t[2] = rotl32 ((w1_t[3] ^ w0_t[2] ^ w3_t[0] ^ w2_t[2]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w2_t[2]); + w2_t[3] = rotl32 ((w2_t[0] ^ w0_t[3] ^ w3_t[1] ^ w2_t[3]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w2_t[3]); + w3_t[0] = rotl32 ((w2_t[1] ^ w1_t[0] ^ w3_t[2] ^ w3_t[0]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w3_t[0]); + w3_t[1] = rotl32 ((w2_t[2] ^ w1_t[1] ^ w3_t[3] ^ w3_t[1]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w3_t[1]); + w3_t[2] = rotl32 ((w2_t[3] ^ w1_t[2] ^ w0_t[0] ^ w3_t[2]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w3_t[2]); + w3_t[3] = rotl32 ((w3_t[0] ^ w1_t[3] ^ w0_t[1] ^ w3_t[3]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w3_t[3]); + + const u32x r0 = d; + const u32x r1 = e; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_M + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m08100_m08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m08100_m16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m08100_s04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, c_combs[0].pw_len); + } + + /** + * salt + */ + + u32 salt_buf0[2]; + + salt_buf0[0] = swap_workaround (salt_bufs[salt_pos].salt_buf[0]); + salt_buf0[1] = swap_workaround (salt_bufs[salt_pos].salt_buf[1]); + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * reverse + */ + + const u32 e_rev = rotl32 (search[1], 2u); + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = c_combs[il_pos].pw_len; + + const u32 pw_len = pw_l_len + pw_r_len; + + u32 wordr0[4]; + u32 wordr1[4]; + u32 wordr2[4]; + u32 wordr3[4]; + + wordr0[0] = c_combs[il_pos].i[0]; + wordr0[1] = c_combs[il_pos].i[1]; + wordr0[2] = c_combs[il_pos].i[2]; + wordr0[3] = c_combs[il_pos].i[3]; + wordr1[0] = c_combs[il_pos].i[4]; + wordr1[1] = c_combs[il_pos].i[5]; + wordr1[2] = c_combs[il_pos].i[6]; + wordr1[3] = c_combs[il_pos].i[7]; + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + u32x w0[4]; + u32x w1[4]; + u32x w2[4]; + u32x w3[4]; + + w0[0] = wordl0[0] | wordr0[0]; + w0[1] = wordl0[1] | wordr0[1]; + w0[2] = wordl0[2] | wordr0[2]; + w0[3] = wordl0[3] | wordr0[3]; + w1[0] = wordl1[0] | wordr1[0]; + w1[1] = wordl1[1] | wordr1[1]; + w1[2] = wordl1[2] | wordr1[2]; + w1[3] = wordl1[3] | wordr1[3]; + w2[0] = wordl2[0] | wordr2[0]; + w2[1] = wordl2[1] | wordr2[1]; + w2[2] = wordl2[2] | wordr2[2]; + w2[3] = wordl2[3] | wordr2[3]; + w3[0] = wordl3[0] | wordr3[0]; + w3[1] = wordl3[1] | wordr3[1]; + w3[2] = wordl3[2] | wordr3[2]; + w3[3] = wordl3[3] | wordr3[3]; + + /** + * prepend salt + */ + + const u32 pw_salt_len = pw_len + salt_len; + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + w0_t[0] = salt_buf0[0]; + w0_t[1] = salt_buf0[1]; + w0_t[2] = w0[0]; + w0_t[3] = w0[1]; + w1_t[0] = w0[2]; + w1_t[1] = w0[3]; + w1_t[2] = w1[0]; + w1_t[3] = w1[1]; + w2_t[0] = w1[2]; + w2_t[1] = w1[3]; + w2_t[2] = w2[0]; + w2_t[3] = w2[1]; + w3_t[0] = w2[2]; + w3_t[1] = w2[3]; + w3_t[2] = 0; + w3_t[3] = (pw_salt_len + 1) * 8; + + append_0x80_4 (w0_t, w1_t, w2_t, w3_t, pw_salt_len + 1); + + /** + * sha1 + */ + + w0_t[0] = swap_workaround (w0_t[0]); + w0_t[1] = swap_workaround (w0_t[1]); + w0_t[2] = swap_workaround (w0_t[2]); + w0_t[3] = swap_workaround (w0_t[3]); + w1_t[0] = swap_workaround (w1_t[0]); + w1_t[1] = swap_workaround (w1_t[1]); + w1_t[2] = swap_workaround (w1_t[2]); + w1_t[3] = swap_workaround (w1_t[3]); + w2_t[0] = swap_workaround (w2_t[0]); + w2_t[1] = swap_workaround (w2_t[1]); + w2_t[2] = swap_workaround (w2_t[2]); + w2_t[3] = swap_workaround (w2_t[3]); + w3_t[0] = swap_workaround (w3_t[0]); + w3_t[1] = swap_workaround (w3_t[1]); + //w3_t[2] = swap_workaround (w3_t[2]); + //w3_t[3] = swap_workaround (w3_t[3]); + + u32x a = SHA1M_A; + u32x b = SHA1M_B; + u32x c = SHA1M_C; + u32x d = SHA1M_D; + u32x e = SHA1M_E; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w0_t[0]); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w0_t[1]); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w0_t[2]); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w0_t[3]); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w1_t[0]); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w1_t[1]); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w1_t[2]); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w1_t[3]); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w2_t[0]); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w2_t[1]); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w2_t[2]); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w2_t[3]); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w3_t[0]); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w3_t[1]); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w3_t[2]); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w3_t[3]); + w0_t[0] = rotl32 ((w3_t[1] ^ w2_t[0] ^ w0_t[2] ^ w0_t[0]), 1u); SHA1_STEP (SHA1_F0o, e, a, b, c, d, w0_t[0]); + w0_t[1] = rotl32 ((w3_t[2] ^ w2_t[1] ^ w0_t[3] ^ w0_t[1]), 1u); SHA1_STEP (SHA1_F0o, d, e, a, b, c, w0_t[1]); + w0_t[2] = rotl32 ((w3_t[3] ^ w2_t[2] ^ w1_t[0] ^ w0_t[2]), 1u); SHA1_STEP (SHA1_F0o, c, d, e, a, b, w0_t[2]); + w0_t[3] = rotl32 ((w0_t[0] ^ w2_t[3] ^ w1_t[1] ^ w0_t[3]), 1u); SHA1_STEP (SHA1_F0o, b, c, d, e, a, w0_t[3]); + + #undef K + #define K SHA1C01 + + w1_t[0] = rotl32 ((w0_t[1] ^ w3_t[0] ^ w1_t[2] ^ w1_t[0]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w1_t[0]); + w1_t[1] = rotl32 ((w0_t[2] ^ w3_t[1] ^ w1_t[3] ^ w1_t[1]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w1_t[1]); + w1_t[2] = rotl32 ((w0_t[3] ^ w3_t[2] ^ w2_t[0] ^ w1_t[2]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w1_t[2]); + w1_t[3] = rotl32 ((w1_t[0] ^ w3_t[3] ^ w2_t[1] ^ w1_t[3]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1_t[3]); + w2_t[0] = rotl32 ((w1_t[1] ^ w0_t[0] ^ w2_t[2] ^ w2_t[0]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w2_t[0]); + w2_t[1] = rotl32 ((w1_t[2] ^ w0_t[1] ^ w2_t[3] ^ w2_t[1]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w2_t[1]); + w2_t[2] = rotl32 ((w1_t[3] ^ w0_t[2] ^ w3_t[0] ^ w2_t[2]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w2_t[2]); + w2_t[3] = rotl32 ((w2_t[0] ^ w0_t[3] ^ w3_t[1] ^ w2_t[3]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w2_t[3]); + w3_t[0] = rotl32 ((w2_t[1] ^ w1_t[0] ^ w3_t[2] ^ w3_t[0]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w3_t[0]); + w3_t[1] = rotl32 ((w2_t[2] ^ w1_t[1] ^ w3_t[3] ^ w3_t[1]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w3_t[1]); + w3_t[2] = rotl32 ((w2_t[3] ^ w1_t[2] ^ w0_t[0] ^ w3_t[2]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w3_t[2]); + w3_t[3] = rotl32 ((w3_t[0] ^ w1_t[3] ^ w0_t[1] ^ w3_t[3]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w3_t[3]); + w0_t[0] = rotl32 ((w3_t[1] ^ w2_t[0] ^ w0_t[2] ^ w0_t[0]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w0_t[0]); + w0_t[1] = rotl32 ((w3_t[2] ^ w2_t[1] ^ w0_t[3] ^ w0_t[1]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w0_t[1]); + w0_t[2] = rotl32 ((w3_t[3] ^ w2_t[2] ^ w1_t[0] ^ w0_t[2]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w0_t[2]); + w0_t[3] = rotl32 ((w0_t[0] ^ w2_t[3] ^ w1_t[1] ^ w0_t[3]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w0_t[3]); + w1_t[0] = rotl32 ((w0_t[1] ^ w3_t[0] ^ w1_t[2] ^ w1_t[0]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w1_t[0]); + w1_t[1] = rotl32 ((w0_t[2] ^ w3_t[1] ^ w1_t[3] ^ w1_t[1]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w1_t[1]); + w1_t[2] = rotl32 ((w0_t[3] ^ w3_t[2] ^ w2_t[0] ^ w1_t[2]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1_t[2]); + w1_t[3] = rotl32 ((w1_t[0] ^ w3_t[3] ^ w2_t[1] ^ w1_t[3]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w1_t[3]); + + #undef K + #define K SHA1C02 + + w2_t[0] = rotl32 ((w1_t[1] ^ w0_t[0] ^ w2_t[2] ^ w2_t[0]), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w2_t[0]); + w2_t[1] = rotl32 ((w1_t[2] ^ w0_t[1] ^ w2_t[3] ^ w2_t[1]), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w2_t[1]); + w2_t[2] = rotl32 ((w1_t[3] ^ w0_t[2] ^ w3_t[0] ^ w2_t[2]), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w2_t[2]); + w2_t[3] = rotl32 ((w2_t[0] ^ w0_t[3] ^ w3_t[1] ^ w2_t[3]), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w2_t[3]); + w3_t[0] = rotl32 ((w2_t[1] ^ w1_t[0] ^ w3_t[2] ^ w3_t[0]), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w3_t[0]); + w3_t[1] = rotl32 ((w2_t[2] ^ w1_t[1] ^ w3_t[3] ^ w3_t[1]), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w3_t[1]); + w3_t[2] = rotl32 ((w2_t[3] ^ w1_t[2] ^ w0_t[0] ^ w3_t[2]), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w3_t[2]); + w3_t[3] = rotl32 ((w3_t[0] ^ w1_t[3] ^ w0_t[1] ^ w3_t[3]), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w3_t[3]); + w0_t[0] = rotl32 ((w3_t[1] ^ w2_t[0] ^ w0_t[2] ^ w0_t[0]), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w0_t[0]); + w0_t[1] = rotl32 ((w3_t[2] ^ w2_t[1] ^ w0_t[3] ^ w0_t[1]), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w0_t[1]); + w0_t[2] = rotl32 ((w3_t[3] ^ w2_t[2] ^ w1_t[0] ^ w0_t[2]), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w0_t[2]); + w0_t[3] = rotl32 ((w0_t[0] ^ w2_t[3] ^ w1_t[1] ^ w0_t[3]), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w0_t[3]); + w1_t[0] = rotl32 ((w0_t[1] ^ w3_t[0] ^ w1_t[2] ^ w1_t[0]), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w1_t[0]); + w1_t[1] = rotl32 ((w0_t[2] ^ w3_t[1] ^ w1_t[3] ^ w1_t[1]), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w1_t[1]); + w1_t[2] = rotl32 ((w0_t[3] ^ w3_t[2] ^ w2_t[0] ^ w1_t[2]), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w1_t[2]); + w1_t[3] = rotl32 ((w1_t[0] ^ w3_t[3] ^ w2_t[1] ^ w1_t[3]), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w1_t[3]); + w2_t[0] = rotl32 ((w1_t[1] ^ w0_t[0] ^ w2_t[2] ^ w2_t[0]), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w2_t[0]); + w2_t[1] = rotl32 ((w1_t[2] ^ w0_t[1] ^ w2_t[3] ^ w2_t[1]), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w2_t[1]); + w2_t[2] = rotl32 ((w1_t[3] ^ w0_t[2] ^ w3_t[0] ^ w2_t[2]), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w2_t[2]); + w2_t[3] = rotl32 ((w2_t[0] ^ w0_t[3] ^ w3_t[1] ^ w2_t[3]), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w2_t[3]); + + #undef K + #define K SHA1C03 + + w3_t[0] = rotl32 ((w2_t[1] ^ w1_t[0] ^ w3_t[2] ^ w3_t[0]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w3_t[0]); + w3_t[1] = rotl32 ((w2_t[2] ^ w1_t[1] ^ w3_t[3] ^ w3_t[1]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w3_t[1]); + w3_t[2] = rotl32 ((w2_t[3] ^ w1_t[2] ^ w0_t[0] ^ w3_t[2]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w3_t[2]); + w3_t[3] = rotl32 ((w3_t[0] ^ w1_t[3] ^ w0_t[1] ^ w3_t[3]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w3_t[3]); + w0_t[0] = rotl32 ((w3_t[1] ^ w2_t[0] ^ w0_t[2] ^ w0_t[0]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w0_t[0]); + w0_t[1] = rotl32 ((w3_t[2] ^ w2_t[1] ^ w0_t[3] ^ w0_t[1]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w0_t[1]); + w0_t[2] = rotl32 ((w3_t[3] ^ w2_t[2] ^ w1_t[0] ^ w0_t[2]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w0_t[2]); + w0_t[3] = rotl32 ((w0_t[0] ^ w2_t[3] ^ w1_t[1] ^ w0_t[3]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w0_t[3]); + w1_t[0] = rotl32 ((w0_t[1] ^ w3_t[0] ^ w1_t[2] ^ w1_t[0]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1_t[0]); + w1_t[1] = rotl32 ((w0_t[2] ^ w3_t[1] ^ w1_t[3] ^ w1_t[1]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w1_t[1]); + w1_t[2] = rotl32 ((w0_t[3] ^ w3_t[2] ^ w2_t[0] ^ w1_t[2]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w1_t[2]); + w1_t[3] = rotl32 ((w1_t[0] ^ w3_t[3] ^ w2_t[1] ^ w1_t[3]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w1_t[3]); + w2_t[0] = rotl32 ((w1_t[1] ^ w0_t[0] ^ w2_t[2] ^ w2_t[0]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w2_t[0]); + w2_t[1] = rotl32 ((w1_t[2] ^ w0_t[1] ^ w2_t[3] ^ w2_t[1]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w2_t[1]); + w2_t[2] = rotl32 ((w1_t[3] ^ w0_t[2] ^ w3_t[0] ^ w2_t[2]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w2_t[2]); + w2_t[3] = rotl32 ((w2_t[0] ^ w0_t[3] ^ w3_t[1] ^ w2_t[3]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w2_t[3]); + w3_t[0] = rotl32 ((w2_t[1] ^ w1_t[0] ^ w3_t[2] ^ w3_t[0]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w3_t[0]); + + if (e != e_rev) continue; + + w3_t[1] = rotl32 ((w2_t[2] ^ w1_t[1] ^ w3_t[3] ^ w3_t[1]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w3_t[1]); + w3_t[2] = rotl32 ((w2_t[3] ^ w1_t[2] ^ w0_t[0] ^ w3_t[2]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w3_t[2]); + w3_t[3] = rotl32 ((w3_t[0] ^ w1_t[3] ^ w0_t[1] ^ w3_t[3]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w3_t[3]); + + const u32x r0 = d; + const u32x r1 = e; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_S + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m08100_s08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m08100_s16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/nv/m08100_a3.cu b/nv/m08100_a3.cu new file mode 100644 index 0000000000..ca450baa9b --- /dev/null +++ b/nv/m08100_a3.cu @@ -0,0 +1,855 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _SHA1_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW2 +#define VECT_SIZE1 +#endif + +#define DGST_R0 3 +#define DGST_R1 4 +#define DGST_R2 2 +#define DGST_R3 1 + +#include "include/kernel_functions.c" +#include "types_nv.c" +#include "common_nv.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +__device__ __constant__ bf_t c_bfs[1024]; + +__device__ static void m08100m (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], const u32 pw_len, const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset) +{ + /** + * modifier + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + const u32 lid = threadIdx.x; + + /** + * salt + */ + + u32 salt_buf0[2]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[1]; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + const u32 pw_salt_len = pw_len + salt_len; + + /** + * loop + */ + + u32x w0l = w0[0]; + + for (u32 il_pos = 0; il_pos < bfs_cnt; il_pos++) + { + const u32 w0r = c_bfs[il_pos].i; + + w0[0] = w0l | w0r; + + /** + * prepend salt + */ + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + w0_t[0] = salt_buf0[0]; + w0_t[1] = salt_buf0[1]; + w0_t[2] = w0[0]; + w0_t[3] = w0[1]; + w1_t[0] = w0[2]; + w1_t[1] = w0[3]; + w1_t[2] = w1[0]; + w1_t[3] = w1[1]; + w2_t[0] = w1[2]; + w2_t[1] = w1[3]; + w2_t[2] = w2[0]; + w2_t[3] = w2[1]; + w3_t[0] = w2[2]; + w3_t[1] = w2[3]; + w3_t[2] = 0; + w3_t[3] = (pw_salt_len + 1) * 8; + + /** + * sha1 + */ + + u32x a = SHA1M_A; + u32x b = SHA1M_B; + u32x c = SHA1M_C; + u32x d = SHA1M_D; + u32x e = SHA1M_E; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w0_t[0]); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w0_t[1]); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w0_t[2]); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w0_t[3]); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w1_t[0]); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w1_t[1]); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w1_t[2]); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w1_t[3]); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w2_t[0]); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w2_t[1]); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w2_t[2]); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w2_t[3]); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w3_t[0]); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w3_t[1]); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w3_t[2]); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w3_t[3]); + w0_t[0] = rotl32 ((w3_t[1] ^ w2_t[0] ^ w0_t[2] ^ w0_t[0]), 1u); SHA1_STEP (SHA1_F0o, e, a, b, c, d, w0_t[0]); + w0_t[1] = rotl32 ((w3_t[2] ^ w2_t[1] ^ w0_t[3] ^ w0_t[1]), 1u); SHA1_STEP (SHA1_F0o, d, e, a, b, c, w0_t[1]); + w0_t[2] = rotl32 ((w3_t[3] ^ w2_t[2] ^ w1_t[0] ^ w0_t[2]), 1u); SHA1_STEP (SHA1_F0o, c, d, e, a, b, w0_t[2]); + w0_t[3] = rotl32 ((w0_t[0] ^ w2_t[3] ^ w1_t[1] ^ w0_t[3]), 1u); SHA1_STEP (SHA1_F0o, b, c, d, e, a, w0_t[3]); + + #undef K + #define K SHA1C01 + + w1_t[0] = rotl32 ((w0_t[1] ^ w3_t[0] ^ w1_t[2] ^ w1_t[0]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w1_t[0]); + w1_t[1] = rotl32 ((w0_t[2] ^ w3_t[1] ^ w1_t[3] ^ w1_t[1]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w1_t[1]); + w1_t[2] = rotl32 ((w0_t[3] ^ w3_t[2] ^ w2_t[0] ^ w1_t[2]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w1_t[2]); + w1_t[3] = rotl32 ((w1_t[0] ^ w3_t[3] ^ w2_t[1] ^ w1_t[3]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1_t[3]); + w2_t[0] = rotl32 ((w1_t[1] ^ w0_t[0] ^ w2_t[2] ^ w2_t[0]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w2_t[0]); + w2_t[1] = rotl32 ((w1_t[2] ^ w0_t[1] ^ w2_t[3] ^ w2_t[1]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w2_t[1]); + w2_t[2] = rotl32 ((w1_t[3] ^ w0_t[2] ^ w3_t[0] ^ w2_t[2]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w2_t[2]); + w2_t[3] = rotl32 ((w2_t[0] ^ w0_t[3] ^ w3_t[1] ^ w2_t[3]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w2_t[3]); + w3_t[0] = rotl32 ((w2_t[1] ^ w1_t[0] ^ w3_t[2] ^ w3_t[0]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w3_t[0]); + w3_t[1] = rotl32 ((w2_t[2] ^ w1_t[1] ^ w3_t[3] ^ w3_t[1]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w3_t[1]); + w3_t[2] = rotl32 ((w2_t[3] ^ w1_t[2] ^ w0_t[0] ^ w3_t[2]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w3_t[2]); + w3_t[3] = rotl32 ((w3_t[0] ^ w1_t[3] ^ w0_t[1] ^ w3_t[3]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w3_t[3]); + w0_t[0] = rotl32 ((w3_t[1] ^ w2_t[0] ^ w0_t[2] ^ w0_t[0]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w0_t[0]); + w0_t[1] = rotl32 ((w3_t[2] ^ w2_t[1] ^ w0_t[3] ^ w0_t[1]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w0_t[1]); + w0_t[2] = rotl32 ((w3_t[3] ^ w2_t[2] ^ w1_t[0] ^ w0_t[2]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w0_t[2]); + w0_t[3] = rotl32 ((w0_t[0] ^ w2_t[3] ^ w1_t[1] ^ w0_t[3]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w0_t[3]); + w1_t[0] = rotl32 ((w0_t[1] ^ w3_t[0] ^ w1_t[2] ^ w1_t[0]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w1_t[0]); + w1_t[1] = rotl32 ((w0_t[2] ^ w3_t[1] ^ w1_t[3] ^ w1_t[1]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w1_t[1]); + w1_t[2] = rotl32 ((w0_t[3] ^ w3_t[2] ^ w2_t[0] ^ w1_t[2]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1_t[2]); + w1_t[3] = rotl32 ((w1_t[0] ^ w3_t[3] ^ w2_t[1] ^ w1_t[3]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w1_t[3]); + + #undef K + #define K SHA1C02 + + w2_t[0] = rotl32 ((w1_t[1] ^ w0_t[0] ^ w2_t[2] ^ w2_t[0]), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w2_t[0]); + w2_t[1] = rotl32 ((w1_t[2] ^ w0_t[1] ^ w2_t[3] ^ w2_t[1]), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w2_t[1]); + w2_t[2] = rotl32 ((w1_t[3] ^ w0_t[2] ^ w3_t[0] ^ w2_t[2]), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w2_t[2]); + w2_t[3] = rotl32 ((w2_t[0] ^ w0_t[3] ^ w3_t[1] ^ w2_t[3]), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w2_t[3]); + w3_t[0] = rotl32 ((w2_t[1] ^ w1_t[0] ^ w3_t[2] ^ w3_t[0]), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w3_t[0]); + w3_t[1] = rotl32 ((w2_t[2] ^ w1_t[1] ^ w3_t[3] ^ w3_t[1]), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w3_t[1]); + w3_t[2] = rotl32 ((w2_t[3] ^ w1_t[2] ^ w0_t[0] ^ w3_t[2]), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w3_t[2]); + w3_t[3] = rotl32 ((w3_t[0] ^ w1_t[3] ^ w0_t[1] ^ w3_t[3]), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w3_t[3]); + w0_t[0] = rotl32 ((w3_t[1] ^ w2_t[0] ^ w0_t[2] ^ w0_t[0]), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w0_t[0]); + w0_t[1] = rotl32 ((w3_t[2] ^ w2_t[1] ^ w0_t[3] ^ w0_t[1]), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w0_t[1]); + w0_t[2] = rotl32 ((w3_t[3] ^ w2_t[2] ^ w1_t[0] ^ w0_t[2]), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w0_t[2]); + w0_t[3] = rotl32 ((w0_t[0] ^ w2_t[3] ^ w1_t[1] ^ w0_t[3]), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w0_t[3]); + w1_t[0] = rotl32 ((w0_t[1] ^ w3_t[0] ^ w1_t[2] ^ w1_t[0]), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w1_t[0]); + w1_t[1] = rotl32 ((w0_t[2] ^ w3_t[1] ^ w1_t[3] ^ w1_t[1]), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w1_t[1]); + w1_t[2] = rotl32 ((w0_t[3] ^ w3_t[2] ^ w2_t[0] ^ w1_t[2]), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w1_t[2]); + w1_t[3] = rotl32 ((w1_t[0] ^ w3_t[3] ^ w2_t[1] ^ w1_t[3]), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w1_t[3]); + w2_t[0] = rotl32 ((w1_t[1] ^ w0_t[0] ^ w2_t[2] ^ w2_t[0]), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w2_t[0]); + w2_t[1] = rotl32 ((w1_t[2] ^ w0_t[1] ^ w2_t[3] ^ w2_t[1]), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w2_t[1]); + w2_t[2] = rotl32 ((w1_t[3] ^ w0_t[2] ^ w3_t[0] ^ w2_t[2]), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w2_t[2]); + w2_t[3] = rotl32 ((w2_t[0] ^ w0_t[3] ^ w3_t[1] ^ w2_t[3]), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w2_t[3]); + + #undef K + #define K SHA1C03 + + w3_t[0] = rotl32 ((w2_t[1] ^ w1_t[0] ^ w3_t[2] ^ w3_t[0]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w3_t[0]); + w3_t[1] = rotl32 ((w2_t[2] ^ w1_t[1] ^ w3_t[3] ^ w3_t[1]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w3_t[1]); + w3_t[2] = rotl32 ((w2_t[3] ^ w1_t[2] ^ w0_t[0] ^ w3_t[2]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w3_t[2]); + w3_t[3] = rotl32 ((w3_t[0] ^ w1_t[3] ^ w0_t[1] ^ w3_t[3]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w3_t[3]); + w0_t[0] = rotl32 ((w3_t[1] ^ w2_t[0] ^ w0_t[2] ^ w0_t[0]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w0_t[0]); + w0_t[1] = rotl32 ((w3_t[2] ^ w2_t[1] ^ w0_t[3] ^ w0_t[1]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w0_t[1]); + w0_t[2] = rotl32 ((w3_t[3] ^ w2_t[2] ^ w1_t[0] ^ w0_t[2]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w0_t[2]); + w0_t[3] = rotl32 ((w0_t[0] ^ w2_t[3] ^ w1_t[1] ^ w0_t[3]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w0_t[3]); + w1_t[0] = rotl32 ((w0_t[1] ^ w3_t[0] ^ w1_t[2] ^ w1_t[0]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1_t[0]); + w1_t[1] = rotl32 ((w0_t[2] ^ w3_t[1] ^ w1_t[3] ^ w1_t[1]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w1_t[1]); + w1_t[2] = rotl32 ((w0_t[3] ^ w3_t[2] ^ w2_t[0] ^ w1_t[2]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w1_t[2]); + w1_t[3] = rotl32 ((w1_t[0] ^ w3_t[3] ^ w2_t[1] ^ w1_t[3]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w1_t[3]); + w2_t[0] = rotl32 ((w1_t[1] ^ w0_t[0] ^ w2_t[2] ^ w2_t[0]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w2_t[0]); + w2_t[1] = rotl32 ((w1_t[2] ^ w0_t[1] ^ w2_t[3] ^ w2_t[1]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w2_t[1]); + w2_t[2] = rotl32 ((w1_t[3] ^ w0_t[2] ^ w3_t[0] ^ w2_t[2]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w2_t[2]); + w2_t[3] = rotl32 ((w2_t[0] ^ w0_t[3] ^ w3_t[1] ^ w2_t[3]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w2_t[3]); + w3_t[0] = rotl32 ((w2_t[1] ^ w1_t[0] ^ w3_t[2] ^ w3_t[0]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w3_t[0]); + w3_t[1] = rotl32 ((w2_t[2] ^ w1_t[1] ^ w3_t[3] ^ w3_t[1]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w3_t[1]); + w3_t[2] = rotl32 ((w2_t[3] ^ w1_t[2] ^ w0_t[0] ^ w3_t[2]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w3_t[2]); + w3_t[3] = rotl32 ((w3_t[0] ^ w1_t[3] ^ w0_t[1] ^ w3_t[3]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w3_t[3]); + + const u32x r0 = d; + const u32x r1 = e; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_M + } +} + +__device__ static void m08100s (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], const u32 pw_len, const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset) +{ + /** + * modifier + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + const u32 lid = threadIdx.x; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * reverse + */ + + const u32 e_rev = rotl32 (search[1], 2u); + + /** + * salt + */ + + u32 salt_buf0[2]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[1]; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + const u32 pw_salt_len = pw_len + salt_len; + + /** + * loop + */ + + u32x w0l = w0[0]; + + for (u32 il_pos = 0; il_pos < bfs_cnt; il_pos++) + { + const u32 w0r = c_bfs[il_pos].i; + + w0[0] = w0l | w0r; + + /** + * prepend salt + */ + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + w0_t[0] = salt_buf0[0]; + w0_t[1] = salt_buf0[1]; + w0_t[2] = w0[0]; + w0_t[3] = w0[1]; + w1_t[0] = w0[2]; + w1_t[1] = w0[3]; + w1_t[2] = w1[0]; + w1_t[3] = w1[1]; + w2_t[0] = w1[2]; + w2_t[1] = w1[3]; + w2_t[2] = w2[0]; + w2_t[3] = w2[1]; + w3_t[0] = w2[2]; + w3_t[1] = w2[3]; + w3_t[2] = 0; + w3_t[3] = (pw_salt_len + 1) * 8; + + /** + * sha1 + */ + + u32x a = SHA1M_A; + u32x b = SHA1M_B; + u32x c = SHA1M_C; + u32x d = SHA1M_D; + u32x e = SHA1M_E; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w0_t[0]); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w0_t[1]); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w0_t[2]); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w0_t[3]); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w1_t[0]); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w1_t[1]); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w1_t[2]); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w1_t[3]); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w2_t[0]); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w2_t[1]); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w2_t[2]); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w2_t[3]); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w3_t[0]); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w3_t[1]); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w3_t[2]); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w3_t[3]); + w0_t[0] = rotl32 ((w3_t[1] ^ w2_t[0] ^ w0_t[2] ^ w0_t[0]), 1u); SHA1_STEP (SHA1_F0o, e, a, b, c, d, w0_t[0]); + w0_t[1] = rotl32 ((w3_t[2] ^ w2_t[1] ^ w0_t[3] ^ w0_t[1]), 1u); SHA1_STEP (SHA1_F0o, d, e, a, b, c, w0_t[1]); + w0_t[2] = rotl32 ((w3_t[3] ^ w2_t[2] ^ w1_t[0] ^ w0_t[2]), 1u); SHA1_STEP (SHA1_F0o, c, d, e, a, b, w0_t[2]); + w0_t[3] = rotl32 ((w0_t[0] ^ w2_t[3] ^ w1_t[1] ^ w0_t[3]), 1u); SHA1_STEP (SHA1_F0o, b, c, d, e, a, w0_t[3]); + + #undef K + #define K SHA1C01 + + w1_t[0] = rotl32 ((w0_t[1] ^ w3_t[0] ^ w1_t[2] ^ w1_t[0]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w1_t[0]); + w1_t[1] = rotl32 ((w0_t[2] ^ w3_t[1] ^ w1_t[3] ^ w1_t[1]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w1_t[1]); + w1_t[2] = rotl32 ((w0_t[3] ^ w3_t[2] ^ w2_t[0] ^ w1_t[2]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w1_t[2]); + w1_t[3] = rotl32 ((w1_t[0] ^ w3_t[3] ^ w2_t[1] ^ w1_t[3]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1_t[3]); + w2_t[0] = rotl32 ((w1_t[1] ^ w0_t[0] ^ w2_t[2] ^ w2_t[0]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w2_t[0]); + w2_t[1] = rotl32 ((w1_t[2] ^ w0_t[1] ^ w2_t[3] ^ w2_t[1]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w2_t[1]); + w2_t[2] = rotl32 ((w1_t[3] ^ w0_t[2] ^ w3_t[0] ^ w2_t[2]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w2_t[2]); + w2_t[3] = rotl32 ((w2_t[0] ^ w0_t[3] ^ w3_t[1] ^ w2_t[3]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w2_t[3]); + w3_t[0] = rotl32 ((w2_t[1] ^ w1_t[0] ^ w3_t[2] ^ w3_t[0]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w3_t[0]); + w3_t[1] = rotl32 ((w2_t[2] ^ w1_t[1] ^ w3_t[3] ^ w3_t[1]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w3_t[1]); + w3_t[2] = rotl32 ((w2_t[3] ^ w1_t[2] ^ w0_t[0] ^ w3_t[2]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w3_t[2]); + w3_t[3] = rotl32 ((w3_t[0] ^ w1_t[3] ^ w0_t[1] ^ w3_t[3]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w3_t[3]); + w0_t[0] = rotl32 ((w3_t[1] ^ w2_t[0] ^ w0_t[2] ^ w0_t[0]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w0_t[0]); + w0_t[1] = rotl32 ((w3_t[2] ^ w2_t[1] ^ w0_t[3] ^ w0_t[1]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w0_t[1]); + w0_t[2] = rotl32 ((w3_t[3] ^ w2_t[2] ^ w1_t[0] ^ w0_t[2]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w0_t[2]); + w0_t[3] = rotl32 ((w0_t[0] ^ w2_t[3] ^ w1_t[1] ^ w0_t[3]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w0_t[3]); + w1_t[0] = rotl32 ((w0_t[1] ^ w3_t[0] ^ w1_t[2] ^ w1_t[0]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w1_t[0]); + w1_t[1] = rotl32 ((w0_t[2] ^ w3_t[1] ^ w1_t[3] ^ w1_t[1]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w1_t[1]); + w1_t[2] = rotl32 ((w0_t[3] ^ w3_t[2] ^ w2_t[0] ^ w1_t[2]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1_t[2]); + w1_t[3] = rotl32 ((w1_t[0] ^ w3_t[3] ^ w2_t[1] ^ w1_t[3]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w1_t[3]); + + #undef K + #define K SHA1C02 + + w2_t[0] = rotl32 ((w1_t[1] ^ w0_t[0] ^ w2_t[2] ^ w2_t[0]), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w2_t[0]); + w2_t[1] = rotl32 ((w1_t[2] ^ w0_t[1] ^ w2_t[3] ^ w2_t[1]), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w2_t[1]); + w2_t[2] = rotl32 ((w1_t[3] ^ w0_t[2] ^ w3_t[0] ^ w2_t[2]), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w2_t[2]); + w2_t[3] = rotl32 ((w2_t[0] ^ w0_t[3] ^ w3_t[1] ^ w2_t[3]), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w2_t[3]); + w3_t[0] = rotl32 ((w2_t[1] ^ w1_t[0] ^ w3_t[2] ^ w3_t[0]), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w3_t[0]); + w3_t[1] = rotl32 ((w2_t[2] ^ w1_t[1] ^ w3_t[3] ^ w3_t[1]), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w3_t[1]); + w3_t[2] = rotl32 ((w2_t[3] ^ w1_t[2] ^ w0_t[0] ^ w3_t[2]), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w3_t[2]); + w3_t[3] = rotl32 ((w3_t[0] ^ w1_t[3] ^ w0_t[1] ^ w3_t[3]), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w3_t[3]); + w0_t[0] = rotl32 ((w3_t[1] ^ w2_t[0] ^ w0_t[2] ^ w0_t[0]), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w0_t[0]); + w0_t[1] = rotl32 ((w3_t[2] ^ w2_t[1] ^ w0_t[3] ^ w0_t[1]), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w0_t[1]); + w0_t[2] = rotl32 ((w3_t[3] ^ w2_t[2] ^ w1_t[0] ^ w0_t[2]), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w0_t[2]); + w0_t[3] = rotl32 ((w0_t[0] ^ w2_t[3] ^ w1_t[1] ^ w0_t[3]), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w0_t[3]); + w1_t[0] = rotl32 ((w0_t[1] ^ w3_t[0] ^ w1_t[2] ^ w1_t[0]), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w1_t[0]); + w1_t[1] = rotl32 ((w0_t[2] ^ w3_t[1] ^ w1_t[3] ^ w1_t[1]), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w1_t[1]); + w1_t[2] = rotl32 ((w0_t[3] ^ w3_t[2] ^ w2_t[0] ^ w1_t[2]), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w1_t[2]); + w1_t[3] = rotl32 ((w1_t[0] ^ w3_t[3] ^ w2_t[1] ^ w1_t[3]), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w1_t[3]); + w2_t[0] = rotl32 ((w1_t[1] ^ w0_t[0] ^ w2_t[2] ^ w2_t[0]), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w2_t[0]); + w2_t[1] = rotl32 ((w1_t[2] ^ w0_t[1] ^ w2_t[3] ^ w2_t[1]), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w2_t[1]); + w2_t[2] = rotl32 ((w1_t[3] ^ w0_t[2] ^ w3_t[0] ^ w2_t[2]), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w2_t[2]); + w2_t[3] = rotl32 ((w2_t[0] ^ w0_t[3] ^ w3_t[1] ^ w2_t[3]), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w2_t[3]); + + #undef K + #define K SHA1C03 + + w3_t[0] = rotl32 ((w2_t[1] ^ w1_t[0] ^ w3_t[2] ^ w3_t[0]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w3_t[0]); + w3_t[1] = rotl32 ((w2_t[2] ^ w1_t[1] ^ w3_t[3] ^ w3_t[1]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w3_t[1]); + w3_t[2] = rotl32 ((w2_t[3] ^ w1_t[2] ^ w0_t[0] ^ w3_t[2]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w3_t[2]); + w3_t[3] = rotl32 ((w3_t[0] ^ w1_t[3] ^ w0_t[1] ^ w3_t[3]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w3_t[3]); + w0_t[0] = rotl32 ((w3_t[1] ^ w2_t[0] ^ w0_t[2] ^ w0_t[0]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w0_t[0]); + w0_t[1] = rotl32 ((w3_t[2] ^ w2_t[1] ^ w0_t[3] ^ w0_t[1]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w0_t[1]); + w0_t[2] = rotl32 ((w3_t[3] ^ w2_t[2] ^ w1_t[0] ^ w0_t[2]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w0_t[2]); + w0_t[3] = rotl32 ((w0_t[0] ^ w2_t[3] ^ w1_t[1] ^ w0_t[3]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w0_t[3]); + w1_t[0] = rotl32 ((w0_t[1] ^ w3_t[0] ^ w1_t[2] ^ w1_t[0]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1_t[0]); + w1_t[1] = rotl32 ((w0_t[2] ^ w3_t[1] ^ w1_t[3] ^ w1_t[1]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w1_t[1]); + w1_t[2] = rotl32 ((w0_t[3] ^ w3_t[2] ^ w2_t[0] ^ w1_t[2]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w1_t[2]); + w1_t[3] = rotl32 ((w1_t[0] ^ w3_t[3] ^ w2_t[1] ^ w1_t[3]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w1_t[3]); + w2_t[0] = rotl32 ((w1_t[1] ^ w0_t[0] ^ w2_t[2] ^ w2_t[0]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w2_t[0]); + w2_t[1] = rotl32 ((w1_t[2] ^ w0_t[1] ^ w2_t[3] ^ w2_t[1]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w2_t[1]); + w2_t[2] = rotl32 ((w1_t[3] ^ w0_t[2] ^ w3_t[0] ^ w2_t[2]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w2_t[2]); + w2_t[3] = rotl32 ((w2_t[0] ^ w0_t[3] ^ w3_t[1] ^ w2_t[3]), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w2_t[3]); + w3_t[0] = rotl32 ((w2_t[1] ^ w1_t[0] ^ w3_t[2] ^ w3_t[0]), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w3_t[0]); + + if (e != e_rev) continue; + + w3_t[1] = rotl32 ((w2_t[2] ^ w1_t[1] ^ w3_t[3] ^ w3_t[1]), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w3_t[1]); + w3_t[2] = rotl32 ((w2_t[3] ^ w1_t[2] ^ w0_t[0] ^ w3_t[2]), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w3_t[2]); + w3_t[3] = rotl32 ((w3_t[0] ^ w1_t[3] ^ w0_t[1] ^ w3_t[3]), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w3_t[3]); + + const u32x r0 = d; + const u32x r1 = e; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_S + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m08100_m04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * base + */ + + w0[0] = swap_workaround (w0[0]); + w0[1] = swap_workaround (w0[1]); + w0[2] = swap_workaround (w0[2]); + w0[3] = swap_workaround (w0[3]); + + append_0x80_2 (w0, w1, pw_len + 1); + + w0[0] = swap_workaround (w0[0]); + w0[1] = swap_workaround (w0[1]); + w0[2] = swap_workaround (w0[2]); + w0[3] = swap_workaround (w0[3]); + w1[0] = swap_workaround (w1[0]); + + /** + * main + */ + + m08100m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m08100_m08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * base + */ + + w0[0] = swap_workaround (w0[0]); + w0[1] = swap_workaround (w0[1]); + w0[2] = swap_workaround (w0[2]); + w0[3] = swap_workaround (w0[3]); + w1[0] = swap_workaround (w1[0]); + w1[1] = swap_workaround (w1[1]); + w1[2] = swap_workaround (w1[2]); + w1[3] = swap_workaround (w1[3]); + + append_0x80_3 (w0, w1, w2, pw_len + 1); + + w0[0] = swap_workaround (w0[0]); + w0[1] = swap_workaround (w0[1]); + w0[2] = swap_workaround (w0[2]); + w0[3] = swap_workaround (w0[3]); + w1[0] = swap_workaround (w1[0]); + w1[1] = swap_workaround (w1[1]); + w1[2] = swap_workaround (w1[2]); + w1[3] = swap_workaround (w1[3]); + w2[0] = swap_workaround (w2[0]); + + /** + * main + */ + + m08100m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m08100_m16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = pws[gid].i[ 8]; + w2[1] = pws[gid].i[ 9]; + w2[2] = pws[gid].i[10]; + w2[3] = pws[gid].i[11]; + + u32x w3[4]; + + w3[0] = pws[gid].i[12]; + w3[1] = pws[gid].i[13]; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * base + */ + + w0[0] = swap_workaround (w0[0]); + w0[1] = swap_workaround (w0[1]); + w0[2] = swap_workaround (w0[2]); + w0[3] = swap_workaround (w0[3]); + w1[0] = swap_workaround (w1[0]); + w1[1] = swap_workaround (w1[1]); + w1[2] = swap_workaround (w1[2]); + w1[3] = swap_workaround (w1[3]); + w2[0] = swap_workaround (w2[0]); + w2[1] = swap_workaround (w2[1]); + w2[2] = swap_workaround (w2[2]); + w2[3] = swap_workaround (w2[3]); + w3[0] = swap_workaround (w3[0]); + w3[1] = swap_workaround (w3[1]); + w3[2] = 0; + w3[3] = 0; + + append_0x80_4 (w0, w1, w2, w3, pw_len + 1); + + w0[0] = swap_workaround (w0[0]); + w0[1] = swap_workaround (w0[1]); + w0[2] = swap_workaround (w0[2]); + w0[3] = swap_workaround (w0[3]); + w1[0] = swap_workaround (w1[0]); + w1[1] = swap_workaround (w1[1]); + w1[2] = swap_workaround (w1[2]); + w1[3] = swap_workaround (w1[3]); + w2[0] = swap_workaround (w2[0]); + w2[1] = swap_workaround (w2[1]); + w2[2] = swap_workaround (w2[2]); + w2[3] = swap_workaround (w2[3]); + w3[0] = swap_workaround (w3[0]); + w3[1] = swap_workaround (w3[1]); + w3[2] = 0; + w3[3] = 0; + + /** + * main + */ + + m08100m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m08100_s04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * base + */ + + w0[0] = swap_workaround (w0[0]); + w0[1] = swap_workaround (w0[1]); + w0[2] = swap_workaround (w0[2]); + w0[3] = swap_workaround (w0[3]); + + append_0x80_2 (w0, w1, pw_len + 1); + + w0[0] = swap_workaround (w0[0]); + w0[1] = swap_workaround (w0[1]); + w0[2] = swap_workaround (w0[2]); + w0[3] = swap_workaround (w0[3]); + w1[0] = swap_workaround (w1[0]); + + /** + * main + */ + + m08100s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m08100_s08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * base + */ + + w0[0] = swap_workaround (w0[0]); + w0[1] = swap_workaround (w0[1]); + w0[2] = swap_workaround (w0[2]); + w0[3] = swap_workaround (w0[3]); + w1[0] = swap_workaround (w1[0]); + w1[1] = swap_workaround (w1[1]); + w1[2] = swap_workaround (w1[2]); + w1[3] = swap_workaround (w1[3]); + + append_0x80_3 (w0, w1, w2, pw_len + 1); + + w0[0] = swap_workaround (w0[0]); + w0[1] = swap_workaround (w0[1]); + w0[2] = swap_workaround (w0[2]); + w0[3] = swap_workaround (w0[3]); + w1[0] = swap_workaround (w1[0]); + w1[1] = swap_workaround (w1[1]); + w1[2] = swap_workaround (w1[2]); + w1[3] = swap_workaround (w1[3]); + w2[0] = swap_workaround (w2[0]); + + /** + * main + */ + + m08100s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m08100_s16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = pws[gid].i[ 8]; + w2[1] = pws[gid].i[ 9]; + w2[2] = pws[gid].i[10]; + w2[3] = pws[gid].i[11]; + + u32x w3[4]; + + w3[0] = pws[gid].i[12]; + w3[1] = pws[gid].i[13]; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * base + */ + + w0[0] = swap_workaround (w0[0]); + w0[1] = swap_workaround (w0[1]); + w0[2] = swap_workaround (w0[2]); + w0[3] = swap_workaround (w0[3]); + w1[0] = swap_workaround (w1[0]); + w1[1] = swap_workaround (w1[1]); + w1[2] = swap_workaround (w1[2]); + w1[3] = swap_workaround (w1[3]); + w2[0] = swap_workaround (w2[0]); + w2[1] = swap_workaround (w2[1]); + w2[2] = swap_workaround (w2[2]); + w2[3] = swap_workaround (w2[3]); + w3[0] = swap_workaround (w3[0]); + w3[1] = swap_workaround (w3[1]); + w3[2] = 0; + w3[3] = 0; + + append_0x80_4 (w0, w1, w2, w3, pw_len + 1); + + w0[0] = swap_workaround (w0[0]); + w0[1] = swap_workaround (w0[1]); + w0[2] = swap_workaround (w0[2]); + w0[3] = swap_workaround (w0[3]); + w1[0] = swap_workaround (w1[0]); + w1[1] = swap_workaround (w1[1]); + w1[2] = swap_workaround (w1[2]); + w1[3] = swap_workaround (w1[3]); + w2[0] = swap_workaround (w2[0]); + w2[1] = swap_workaround (w2[1]); + w2[2] = swap_workaround (w2[2]); + w2[3] = swap_workaround (w2[3]); + w3[0] = swap_workaround (w3[0]); + w3[1] = swap_workaround (w3[1]); + w3[2] = 0; + w3[3] = 0; + + /** + * main + */ + + m08100s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} diff --git a/nv/m08200.cu b/nv/m08200.cu new file mode 100644 index 0000000000..2ce2b77c45 --- /dev/null +++ b/nv/m08200.cu @@ -0,0 +1,793 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _CLOUDKEY_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW2 +#define VECT_SIZE1 +#endif + +#define DGST_R0 0 +#define DGST_R1 1 +#define DGST_R2 2 +#define DGST_R3 3 + +#include "include/kernel_functions.c" +#include "types_nv.c" +#include "common_nv.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +__device__ __constant__ u64 k[80] = +{ + SHA512C00, SHA512C01, SHA512C02, SHA512C03, + SHA512C04, SHA512C05, SHA512C06, SHA512C07, + SHA512C08, SHA512C09, SHA512C0a, SHA512C0b, + SHA512C0c, SHA512C0d, SHA512C0e, SHA512C0f, + SHA512C10, SHA512C11, SHA512C12, SHA512C13, + SHA512C14, SHA512C15, SHA512C16, SHA512C17, + SHA512C18, SHA512C19, SHA512C1a, SHA512C1b, + SHA512C1c, SHA512C1d, SHA512C1e, SHA512C1f, + SHA512C20, SHA512C21, SHA512C22, SHA512C23, + SHA512C24, SHA512C25, SHA512C26, SHA512C27, + SHA512C28, SHA512C29, SHA512C2a, SHA512C2b, + SHA512C2c, SHA512C2d, SHA512C2e, SHA512C2f, + SHA512C30, SHA512C31, SHA512C32, SHA512C33, + SHA512C34, SHA512C35, SHA512C36, SHA512C37, + SHA512C38, SHA512C39, SHA512C3a, SHA512C3b, + SHA512C3c, SHA512C3d, SHA512C3e, SHA512C3f, + SHA512C40, SHA512C41, SHA512C42, SHA512C43, + SHA512C44, SHA512C45, SHA512C46, SHA512C47, + SHA512C48, SHA512C49, SHA512C4a, SHA512C4b, + SHA512C4c, SHA512C4d, SHA512C4e, SHA512C4f, +}; + +#define ROUND_EXPAND() \ +{ \ + w0_t = SHA512_EXPAND (we_t, w9_t, w1_t, w0_t); \ + w1_t = SHA512_EXPAND (wf_t, wa_t, w2_t, w1_t); \ + w2_t = SHA512_EXPAND (w0_t, wb_t, w3_t, w2_t); \ + w3_t = SHA512_EXPAND (w1_t, wc_t, w4_t, w3_t); \ + w4_t = SHA512_EXPAND (w2_t, wd_t, w5_t, w4_t); \ + w5_t = SHA512_EXPAND (w3_t, we_t, w6_t, w5_t); \ + w6_t = SHA512_EXPAND (w4_t, wf_t, w7_t, w6_t); \ + w7_t = SHA512_EXPAND (w5_t, w0_t, w8_t, w7_t); \ + w8_t = SHA512_EXPAND (w6_t, w1_t, w9_t, w8_t); \ + w9_t = SHA512_EXPAND (w7_t, w2_t, wa_t, w9_t); \ + wa_t = SHA512_EXPAND (w8_t, w3_t, wb_t, wa_t); \ + wb_t = SHA512_EXPAND (w9_t, w4_t, wc_t, wb_t); \ + wc_t = SHA512_EXPAND (wa_t, w5_t, wd_t, wc_t); \ + wd_t = SHA512_EXPAND (wb_t, w6_t, we_t, wd_t); \ + we_t = SHA512_EXPAND (wc_t, w7_t, wf_t, we_t); \ + wf_t = SHA512_EXPAND (wd_t, w8_t, w0_t, wf_t); \ +} + +#define ROUND_STEP(i) \ +{ \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, a, b, c, d, e, f, g, h, w0_t, k[i + 0]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, h, a, b, c, d, e, f, g, w1_t, k[i + 1]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, g, h, a, b, c, d, e, f, w2_t, k[i + 2]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, f, g, h, a, b, c, d, e, w3_t, k[i + 3]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, e, f, g, h, a, b, c, d, w4_t, k[i + 4]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, d, e, f, g, h, a, b, c, w5_t, k[i + 5]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, c, d, e, f, g, h, a, b, w6_t, k[i + 6]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, b, c, d, e, f, g, h, a, w7_t, k[i + 7]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, a, b, c, d, e, f, g, h, w8_t, k[i + 8]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, h, a, b, c, d, e, f, g, w9_t, k[i + 9]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, g, h, a, b, c, d, e, f, wa_t, k[i + 10]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, f, g, h, a, b, c, d, e, wb_t, k[i + 11]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, e, f, g, h, a, b, c, d, wc_t, k[i + 12]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, d, e, f, g, h, a, b, c, wd_t, k[i + 13]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, c, d, e, f, g, h, a, b, we_t, k[i + 14]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, b, c, d, e, f, g, h, a, wf_t, k[i + 15]); \ +} + +__device__ static void sha256_transform (const u32x w0[4], const u32x w1[4], const u32x w2[4], const u32x w3[4], u32x digest[8]) +{ + u32x a = digest[0]; + u32x b = digest[1]; + u32x c = digest[2]; + u32x d = digest[3]; + u32x e = digest[4]; + u32x f = digest[5]; + u32x g = digest[6]; + u32x h = digest[7]; + + u32x w0_t = w0[0]; + u32x w1_t = w0[1]; + u32x w2_t = w0[2]; + u32x w3_t = w0[3]; + u32x w4_t = w1[0]; + u32x w5_t = w1[1]; + u32x w6_t = w1[2]; + u32x w7_t = w1[3]; + u32x w8_t = w2[0]; + u32x w9_t = w2[1]; + u32x wa_t = w2[2]; + u32x wb_t = w2[3]; + u32x wc_t = w3[0]; + u32x wd_t = w3[1]; + u32x we_t = w3[2]; + u32x wf_t = w3[3]; + + SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C00); + SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C01); + SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C02); + SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C03); + SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C04); + SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C05); + SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C06); + SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C07); + SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C08); + SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C09); + SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C0a); + SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C0b); + SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C0c); + SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C0d); + SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C0e); + SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C0f); + w0_t = SHA256_S1(we_t) + w9_t + SHA256_S0(w1_t) + w0_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C10); + w1_t = SHA256_S1(wf_t) + wa_t + SHA256_S0(w2_t) + w1_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C11); + w2_t = SHA256_S1(w0_t) + wb_t + SHA256_S0(w3_t) + w2_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C12); + w3_t = SHA256_S1(w1_t) + wc_t + SHA256_S0(w4_t) + w3_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C13); + w4_t = SHA256_S1(w2_t) + wd_t + SHA256_S0(w5_t) + w4_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C14); + w5_t = SHA256_S1(w3_t) + we_t + SHA256_S0(w6_t) + w5_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C15); + w6_t = SHA256_S1(w4_t) + wf_t + SHA256_S0(w7_t) + w6_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C16); + w7_t = SHA256_S1(w5_t) + w0_t + SHA256_S0(w8_t) + w7_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C17); + w8_t = SHA256_S1(w6_t) + w1_t + SHA256_S0(w9_t) + w8_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C18); + w9_t = SHA256_S1(w7_t) + w2_t + SHA256_S0(wa_t) + w9_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C19); + wa_t = SHA256_S1(w8_t) + w3_t + SHA256_S0(wb_t) + wa_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C1a); + wb_t = SHA256_S1(w9_t) + w4_t + SHA256_S0(wc_t) + wb_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C1b); + wc_t = SHA256_S1(wa_t) + w5_t + SHA256_S0(wd_t) + wc_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C1c); + wd_t = SHA256_S1(wb_t) + w6_t + SHA256_S0(we_t) + wd_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C1d); + we_t = SHA256_S1(wc_t) + w7_t + SHA256_S0(wf_t) + we_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C1e); + wf_t = SHA256_S1(wd_t) + w8_t + SHA256_S0(w0_t) + wf_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C1f); + w0_t = SHA256_S1(we_t) + w9_t + SHA256_S0(w1_t) + w0_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C20); + w1_t = SHA256_S1(wf_t) + wa_t + SHA256_S0(w2_t) + w1_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C21); + w2_t = SHA256_S1(w0_t) + wb_t + SHA256_S0(w3_t) + w2_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C22); + w3_t = SHA256_S1(w1_t) + wc_t + SHA256_S0(w4_t) + w3_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C23); + w4_t = SHA256_S1(w2_t) + wd_t + SHA256_S0(w5_t) + w4_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C24); + w5_t = SHA256_S1(w3_t) + we_t + SHA256_S0(w6_t) + w5_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C25); + w6_t = SHA256_S1(w4_t) + wf_t + SHA256_S0(w7_t) + w6_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C26); + w7_t = SHA256_S1(w5_t) + w0_t + SHA256_S0(w8_t) + w7_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C27); + w8_t = SHA256_S1(w6_t) + w1_t + SHA256_S0(w9_t) + w8_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C28); + w9_t = SHA256_S1(w7_t) + w2_t + SHA256_S0(wa_t) + w9_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C29); + wa_t = SHA256_S1(w8_t) + w3_t + SHA256_S0(wb_t) + wa_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C2a); + wb_t = SHA256_S1(w9_t) + w4_t + SHA256_S0(wc_t) + wb_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C2b); + wc_t = SHA256_S1(wa_t) + w5_t + SHA256_S0(wd_t) + wc_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C2c); + wd_t = SHA256_S1(wb_t) + w6_t + SHA256_S0(we_t) + wd_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C2d); + we_t = SHA256_S1(wc_t) + w7_t + SHA256_S0(wf_t) + we_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C2e); + wf_t = SHA256_S1(wd_t) + w8_t + SHA256_S0(w0_t) + wf_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C2f); + w0_t = SHA256_S1(we_t) + w9_t + SHA256_S0(w1_t) + w0_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C30); + w1_t = SHA256_S1(wf_t) + wa_t + SHA256_S0(w2_t) + w1_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C31); + w2_t = SHA256_S1(w0_t) + wb_t + SHA256_S0(w3_t) + w2_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C32); + w3_t = SHA256_S1(w1_t) + wc_t + SHA256_S0(w4_t) + w3_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C33); + w4_t = SHA256_S1(w2_t) + wd_t + SHA256_S0(w5_t) + w4_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C34); + w5_t = SHA256_S1(w3_t) + we_t + SHA256_S0(w6_t) + w5_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C35); + w6_t = SHA256_S1(w4_t) + wf_t + SHA256_S0(w7_t) + w6_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C36); + w7_t = SHA256_S1(w5_t) + w0_t + SHA256_S0(w8_t) + w7_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C37); + w8_t = SHA256_S1(w6_t) + w1_t + SHA256_S0(w9_t) + w8_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C38); + w9_t = SHA256_S1(w7_t) + w2_t + SHA256_S0(wa_t) + w9_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C39); + wa_t = SHA256_S1(w8_t) + w3_t + SHA256_S0(wb_t) + wa_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C3a); + wb_t = SHA256_S1(w9_t) + w4_t + SHA256_S0(wc_t) + wb_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C3b); + wc_t = SHA256_S1(wa_t) + w5_t + SHA256_S0(wd_t) + wc_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C3c); + wd_t = SHA256_S1(wb_t) + w6_t + SHA256_S0(we_t) + wd_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C3d); + we_t = SHA256_S1(wc_t) + w7_t + SHA256_S0(wf_t) + we_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C3e); + wf_t = SHA256_S1(wd_t) + w8_t + SHA256_S0(w0_t) + wf_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C3f); + + digest[0] += a; + digest[1] += b; + digest[2] += c; + digest[3] += d; + digest[4] += e; + digest[5] += f; + digest[6] += g; + digest[7] += h; +} + +__device__ static void hmac_sha256_pad (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], u32x ipad[8], u32x opad[8]) +{ + w0[0] = w0[0] ^ 0x36363636; + w0[1] = w0[1] ^ 0x36363636; + w0[2] = w0[2] ^ 0x36363636; + w0[3] = w0[3] ^ 0x36363636; + w1[0] = w1[0] ^ 0x36363636; + w1[1] = w1[1] ^ 0x36363636; + w1[2] = w1[2] ^ 0x36363636; + w1[3] = w1[3] ^ 0x36363636; + w2[0] = w2[0] ^ 0x36363636; + w2[1] = w2[1] ^ 0x36363636; + w2[2] = w2[2] ^ 0x36363636; + w2[3] = w2[3] ^ 0x36363636; + w3[0] = w3[0] ^ 0x36363636; + w3[1] = w3[1] ^ 0x36363636; + w3[2] = w3[2] ^ 0x36363636; + w3[3] = w3[3] ^ 0x36363636; + + ipad[0] = SHA256M_A; + ipad[1] = SHA256M_B; + ipad[2] = SHA256M_C; + ipad[3] = SHA256M_D; + ipad[4] = SHA256M_E; + ipad[5] = SHA256M_F; + ipad[6] = SHA256M_G; + ipad[7] = SHA256M_H; + + sha256_transform (w0, w1, w2, w3, ipad); + + w0[0] = w0[0] ^ 0x6a6a6a6a; + w0[1] = w0[1] ^ 0x6a6a6a6a; + w0[2] = w0[2] ^ 0x6a6a6a6a; + w0[3] = w0[3] ^ 0x6a6a6a6a; + w1[0] = w1[0] ^ 0x6a6a6a6a; + w1[1] = w1[1] ^ 0x6a6a6a6a; + w1[2] = w1[2] ^ 0x6a6a6a6a; + w1[3] = w1[3] ^ 0x6a6a6a6a; + w2[0] = w2[0] ^ 0x6a6a6a6a; + w2[1] = w2[1] ^ 0x6a6a6a6a; + w2[2] = w2[2] ^ 0x6a6a6a6a; + w2[3] = w2[3] ^ 0x6a6a6a6a; + w3[0] = w3[0] ^ 0x6a6a6a6a; + w3[1] = w3[1] ^ 0x6a6a6a6a; + w3[2] = w3[2] ^ 0x6a6a6a6a; + w3[3] = w3[3] ^ 0x6a6a6a6a; + + opad[0] = SHA256M_A; + opad[1] = SHA256M_B; + opad[2] = SHA256M_C; + opad[3] = SHA256M_D; + opad[4] = SHA256M_E; + opad[5] = SHA256M_F; + opad[6] = SHA256M_G; + opad[7] = SHA256M_H; + + sha256_transform (w0, w1, w2, w3, opad); +} + +__device__ static void hmac_sha256_run (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], u32x ipad[8], u32x opad[8], u32x digest[8]) +{ + digest[0] = ipad[0]; + digest[1] = ipad[1]; + digest[2] = ipad[2]; + digest[3] = ipad[3]; + digest[4] = ipad[4]; + digest[5] = ipad[5]; + digest[6] = ipad[6]; + digest[7] = ipad[7]; + + sha256_transform (w0, w1, w2, w3, digest); + + w0[0] = digest[0]; + w0[1] = digest[1]; + w0[2] = digest[2]; + w0[3] = digest[3]; + w1[0] = digest[4]; + w1[1] = digest[5]; + w1[2] = digest[6]; + w1[3] = digest[7]; + w2[0] = 0x80000000; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = (64 + 32) * 8; + + digest[0] = opad[0]; + digest[1] = opad[1]; + digest[2] = opad[2]; + digest[3] = opad[3]; + digest[4] = opad[4]; + digest[5] = opad[5]; + digest[6] = opad[6]; + digest[7] = opad[7]; + + sha256_transform (w0, w1, w2, w3, digest); +} + +__device__ static void sha512_transform (const u64 w[16], u64 dgst[8]) +{ + u64 a = dgst[0]; + u64 b = dgst[1]; + u64 c = dgst[2]; + u64 d = dgst[3]; + u64 e = dgst[4]; + u64 f = dgst[5]; + u64 g = dgst[6]; + u64 h = dgst[7]; + + u64 w0_t = w[ 0]; + u64 w1_t = w[ 1]; + u64 w2_t = w[ 2]; + u64 w3_t = w[ 3]; + u64 w4_t = w[ 4]; + u64 w5_t = w[ 5]; + u64 w6_t = w[ 6]; + u64 w7_t = w[ 7]; + u64 w8_t = w[ 8]; + u64 w9_t = w[ 9]; + u64 wa_t = w[10]; + u64 wb_t = w[11]; + u64 wc_t = w[12]; + u64 wd_t = w[13]; + u64 we_t = w[14]; + u64 wf_t = w[15]; + + ROUND_STEP (0); + + for (int i = 16; i < 80; i += 16) + { + ROUND_EXPAND (); ROUND_STEP (i); + } + + dgst[0] += a; + dgst[1] += b; + dgst[2] += c; + dgst[3] += d; + dgst[4] += e; + dgst[5] += f; + dgst[6] += g; + dgst[7] += h; +} + +__device__ static void hmac_sha512_run (const u64 w1[16], const u64 ipad[8], const u64 opad[8], u64 dgst[8]) +{ + dgst[0] = ipad[0]; + dgst[1] = ipad[1]; + dgst[2] = ipad[2]; + dgst[3] = ipad[3]; + dgst[4] = ipad[4]; + dgst[5] = ipad[5]; + dgst[6] = ipad[6]; + dgst[7] = ipad[7]; + + sha512_transform (w1, dgst); + + u64 w[16]; + + w[ 0] = dgst[0]; + w[ 1] = dgst[1]; + w[ 2] = dgst[2]; + w[ 3] = dgst[3]; + w[ 4] = dgst[4]; + w[ 5] = dgst[5]; + w[ 6] = dgst[6]; + w[ 7] = dgst[7]; + w[ 8] = 0x8000000000000000; + w[ 9] = 0; + w[10] = 0; + w[11] = 0; + w[12] = 0; + w[13] = 0; + w[14] = 0; + w[15] = (128 + 64) * 8; + + dgst[0] = opad[0]; + dgst[1] = opad[1]; + dgst[2] = opad[2]; + dgst[3] = opad[3]; + dgst[4] = opad[4]; + dgst[5] = opad[5]; + dgst[6] = opad[6]; + dgst[7] = opad[7]; + + sha512_transform (w, dgst); +} + +__device__ static void hmac_sha512_init (u64 w[16], u64 ipad[8], u64 opad[8]) +{ + w[ 0] ^= 0x3636363636363636; + w[ 1] ^= 0x3636363636363636; + w[ 2] ^= 0x3636363636363636; + w[ 3] ^= 0x3636363636363636; + w[ 4] ^= 0x3636363636363636; + w[ 5] ^= 0x3636363636363636; + w[ 6] ^= 0x3636363636363636; + w[ 7] ^= 0x3636363636363636; + w[ 8] ^= 0x3636363636363636; + w[ 9] ^= 0x3636363636363636; + w[10] ^= 0x3636363636363636; + w[11] ^= 0x3636363636363636; + w[12] ^= 0x3636363636363636; + w[13] ^= 0x3636363636363636; + w[14] ^= 0x3636363636363636; + w[15] ^= 0x3636363636363636; + + ipad[0] = SHA512M_A; + ipad[1] = SHA512M_B; + ipad[2] = SHA512M_C; + ipad[3] = SHA512M_D; + ipad[4] = SHA512M_E; + ipad[5] = SHA512M_F; + ipad[6] = SHA512M_G; + ipad[7] = SHA512M_H; + + sha512_transform (w, ipad); + + w[ 0] ^= 0x6a6a6a6a6a6a6a6a; + w[ 1] ^= 0x6a6a6a6a6a6a6a6a; + w[ 2] ^= 0x6a6a6a6a6a6a6a6a; + w[ 3] ^= 0x6a6a6a6a6a6a6a6a; + w[ 4] ^= 0x6a6a6a6a6a6a6a6a; + w[ 5] ^= 0x6a6a6a6a6a6a6a6a; + w[ 6] ^= 0x6a6a6a6a6a6a6a6a; + w[ 7] ^= 0x6a6a6a6a6a6a6a6a; + w[ 8] ^= 0x6a6a6a6a6a6a6a6a; + w[ 9] ^= 0x6a6a6a6a6a6a6a6a; + w[10] ^= 0x6a6a6a6a6a6a6a6a; + w[11] ^= 0x6a6a6a6a6a6a6a6a; + w[12] ^= 0x6a6a6a6a6a6a6a6a; + w[13] ^= 0x6a6a6a6a6a6a6a6a; + w[14] ^= 0x6a6a6a6a6a6a6a6a; + w[15] ^= 0x6a6a6a6a6a6a6a6a; + + opad[0] = SHA512M_A; + opad[1] = SHA512M_B; + opad[2] = SHA512M_C; + opad[3] = SHA512M_D; + opad[4] = SHA512M_E; + opad[5] = SHA512M_F; + opad[6] = SHA512M_G; + opad[7] = SHA512M_H; + + sha512_transform (w, opad); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m08200_init (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, pbkdf2_sha512_tmp_t *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const cloudkey_t *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = pws[gid].i[ 8]; + w2[1] = pws[gid].i[ 9]; + w2[2] = pws[gid].i[10]; + w2[3] = pws[gid].i[11]; + + u32x w3[4]; + + w3[0] = pws[gid].i[12]; + w3[1] = pws[gid].i[13]; + w3[2] = pws[gid].i[14]; + w3[3] = pws[gid].i[15]; + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[ 1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[ 2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[ 3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[ 4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[ 5]; + salt_buf1[2] = 0; + salt_buf1[3] = 0; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + u64 data_buf[16]; + + data_buf[ 0] = ((u64) swap_workaround (salt_buf0[ 0])) << 32 | (u64) swap_workaround (salt_buf0[ 1]); + data_buf[ 1] = ((u64) swap_workaround (salt_buf0[ 2])) << 32 | (u64) swap_workaround (salt_buf0[ 3]); + data_buf[ 2] = ((u64) swap_workaround (salt_buf1[ 0])) << 32 | (u64) swap_workaround (salt_buf1[ 1]); + data_buf[ 3] = 0; + data_buf[ 4] = 0; + data_buf[ 5] = 0; + data_buf[ 6] = 0; + data_buf[ 7] = 0; + data_buf[ 8] = 0; + data_buf[ 9] = 0; + data_buf[10] = 0; + data_buf[11] = 0; + data_buf[12] = 0; + data_buf[13] = 0; + data_buf[14] = 0; + data_buf[15] = (128 + salt_len + 4) * 8; + + u64 w[16]; + + w[ 0] = ((u64) swap_workaround (w0[0])) << 32 | (u64) swap_workaround (w0[1]); + w[ 1] = ((u64) swap_workaround (w0[2])) << 32 | (u64) swap_workaround (w0[3]); + w[ 2] = ((u64) swap_workaround (w1[0])) << 32 | (u64) swap_workaround (w1[1]); + w[ 3] = ((u64) swap_workaround (w1[2])) << 32 | (u64) swap_workaround (w1[3]); + w[ 4] = ((u64) swap_workaround (w2[0])) << 32 | (u64) swap_workaround (w2[1]); + w[ 5] = ((u64) swap_workaround (w2[2])) << 32 | (u64) swap_workaround (w2[3]); + w[ 6] = ((u64) swap_workaround (w3[0])) << 32 | (u64) swap_workaround (w3[1]); + w[ 7] = ((u64) swap_workaround (w3[2])) << 32 | (u64) swap_workaround (w3[3]); + w[ 8] = 0; + w[ 9] = 0; + w[10] = 0; + w[11] = 0; + w[12] = 0; + w[13] = 0; + w[14] = 0; + w[15] = 0; + + u64 ipad[8]; + u64 opad[8]; + + hmac_sha512_init (w, ipad, opad); + + tmps[gid].ipad[0] = ipad[0]; + tmps[gid].ipad[1] = ipad[1]; + tmps[gid].ipad[2] = ipad[2]; + tmps[gid].ipad[3] = ipad[3]; + tmps[gid].ipad[4] = ipad[4]; + tmps[gid].ipad[5] = ipad[5]; + tmps[gid].ipad[6] = ipad[6]; + tmps[gid].ipad[7] = ipad[7]; + + tmps[gid].opad[0] = opad[0]; + tmps[gid].opad[1] = opad[1]; + tmps[gid].opad[2] = opad[2]; + tmps[gid].opad[3] = opad[3]; + tmps[gid].opad[4] = opad[4]; + tmps[gid].opad[5] = opad[5]; + tmps[gid].opad[6] = opad[6]; + tmps[gid].opad[7] = opad[7]; + + for (u32 i = 0, j = 1; i < 8; i += 8, j += 1) + { + u64 dgst[8]; + + hmac_sha512_run (data_buf, ipad, opad, dgst); + + tmps[gid].dgst[i + 0] = dgst[0]; + tmps[gid].dgst[i + 1] = dgst[1]; + tmps[gid].dgst[i + 2] = dgst[2]; + tmps[gid].dgst[i + 3] = dgst[3]; + tmps[gid].dgst[i + 4] = dgst[4]; + tmps[gid].dgst[i + 5] = dgst[5]; + tmps[gid].dgst[i + 6] = dgst[6]; + tmps[gid].dgst[i + 7] = dgst[7]; + + tmps[gid].out[i + 0] = dgst[0]; + tmps[gid].out[i + 1] = dgst[1]; + tmps[gid].out[i + 2] = dgst[2]; + tmps[gid].out[i + 3] = dgst[3]; + tmps[gid].out[i + 4] = dgst[4]; + tmps[gid].out[i + 5] = dgst[5]; + tmps[gid].out[i + 6] = dgst[6]; + tmps[gid].out[i + 7] = dgst[7]; + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m08200_loop (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, pbkdf2_sha512_tmp_t *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const cloudkey_t *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u64 ipad[8]; + + ipad[0] = tmps[gid].ipad[0]; + ipad[1] = tmps[gid].ipad[1]; + ipad[2] = tmps[gid].ipad[2]; + ipad[3] = tmps[gid].ipad[3]; + ipad[4] = tmps[gid].ipad[4]; + ipad[5] = tmps[gid].ipad[5]; + ipad[6] = tmps[gid].ipad[6]; + ipad[7] = tmps[gid].ipad[7]; + + u64 opad[8]; + + opad[0] = tmps[gid].opad[0]; + opad[1] = tmps[gid].opad[1]; + opad[2] = tmps[gid].opad[2]; + opad[3] = tmps[gid].opad[3]; + opad[4] = tmps[gid].opad[4]; + opad[5] = tmps[gid].opad[5]; + opad[6] = tmps[gid].opad[6]; + opad[7] = tmps[gid].opad[7]; + + for (u32 i = 0; i < 8; i += 8) + { + u64 dgst[8]; + + dgst[0] = tmps[gid].dgst[i + 0]; + dgst[1] = tmps[gid].dgst[i + 1]; + dgst[2] = tmps[gid].dgst[i + 2]; + dgst[3] = tmps[gid].dgst[i + 3]; + dgst[4] = tmps[gid].dgst[i + 4]; + dgst[5] = tmps[gid].dgst[i + 5]; + dgst[6] = tmps[gid].dgst[i + 6]; + dgst[7] = tmps[gid].dgst[i + 7]; + + u64 out[8]; + + out[0] = tmps[gid].out[i + 0]; + out[1] = tmps[gid].out[i + 1]; + out[2] = tmps[gid].out[i + 2]; + out[3] = tmps[gid].out[i + 3]; + out[4] = tmps[gid].out[i + 4]; + out[5] = tmps[gid].out[i + 5]; + out[6] = tmps[gid].out[i + 6]; + out[7] = tmps[gid].out[i + 7]; + + for (u32 j = 0; j < loop_cnt; j++) + { + u64 w[16]; + + w[ 0] = dgst[0]; + w[ 1] = dgst[1]; + w[ 2] = dgst[2]; + w[ 3] = dgst[3]; + w[ 4] = dgst[4]; + w[ 5] = dgst[5]; + w[ 6] = dgst[6]; + w[ 7] = dgst[7]; + w[ 8] = 0x8000000000000000; + w[ 9] = 0; + w[10] = 0; + w[11] = 0; + w[12] = 0; + w[13] = 0; + w[14] = 0; + w[15] = (128 + 64) * 8; + + hmac_sha512_run (w, ipad, opad, dgst); + + out[0] ^= dgst[0]; + out[1] ^= dgst[1]; + out[2] ^= dgst[2]; + out[3] ^= dgst[3]; + out[4] ^= dgst[4]; + out[5] ^= dgst[5]; + out[6] ^= dgst[6]; + out[7] ^= dgst[7]; + } + + tmps[gid].dgst[i + 0] = dgst[0]; + tmps[gid].dgst[i + 1] = dgst[1]; + tmps[gid].dgst[i + 2] = dgst[2]; + tmps[gid].dgst[i + 3] = dgst[3]; + tmps[gid].dgst[i + 4] = dgst[4]; + tmps[gid].dgst[i + 5] = dgst[5]; + tmps[gid].dgst[i + 6] = dgst[6]; + tmps[gid].dgst[i + 7] = dgst[7]; + + tmps[gid].out[i + 0] = out[0]; + tmps[gid].out[i + 1] = out[1]; + tmps[gid].out[i + 2] = out[2]; + tmps[gid].out[i + 3] = out[3]; + tmps[gid].out[i + 4] = out[4]; + tmps[gid].out[i + 5] = out[5]; + tmps[gid].out[i + 6] = out[6]; + tmps[gid].out[i + 7] = out[7]; + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m08200_comp (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, pbkdf2_sha512_tmp_t *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const cloudkey_t *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + const u32 lid = threadIdx.x; + + u32 w0[4]; + u32 w1[4]; + u32 w2[4]; + u32 w3[4]; + + w0[0] = tmps[gid].out[4] >> 32; + w0[1] = tmps[gid].out[4] & 0xffffffff; + w0[2] = tmps[gid].out[5] >> 32; + w0[3] = tmps[gid].out[5] & 0xffffffff; + w1[0] = tmps[gid].out[6] >> 32; + w1[1] = tmps[gid].out[6] & 0xffffffff; + w1[2] = tmps[gid].out[7] >> 32; + w1[3] = tmps[gid].out[7] & 0xffffffff; + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + u32 ipad[8]; + u32 opad[8]; + + hmac_sha256_pad (w0, w1, w2, w3, ipad, opad); + + int size = esalt_bufs[salt_pos].data_len; + + int left; + int off; + + for (left = size, off = 0; left >= 56; left -= 64, off += 16) + { + w0[0] = esalt_bufs[salt_pos].data_buf[off + 0]; + w0[1] = esalt_bufs[salt_pos].data_buf[off + 1]; + w0[2] = esalt_bufs[salt_pos].data_buf[off + 2]; + w0[3] = esalt_bufs[salt_pos].data_buf[off + 3]; + w1[0] = esalt_bufs[salt_pos].data_buf[off + 4]; + w1[1] = esalt_bufs[salt_pos].data_buf[off + 5]; + w1[2] = esalt_bufs[salt_pos].data_buf[off + 6]; + w1[3] = esalt_bufs[salt_pos].data_buf[off + 7]; + w2[0] = esalt_bufs[salt_pos].data_buf[off + 8]; + w2[1] = esalt_bufs[salt_pos].data_buf[off + 9]; + w2[2] = esalt_bufs[salt_pos].data_buf[off + 10]; + w2[3] = esalt_bufs[salt_pos].data_buf[off + 11]; + w3[0] = esalt_bufs[salt_pos].data_buf[off + 12]; + w3[1] = esalt_bufs[salt_pos].data_buf[off + 13]; + w3[2] = esalt_bufs[salt_pos].data_buf[off + 14]; + w3[3] = esalt_bufs[salt_pos].data_buf[off + 15]; + + sha256_transform (w0, w1, w2, w3, ipad); + } + + w0[0] = esalt_bufs[salt_pos].data_buf[off + 0]; + w0[1] = esalt_bufs[salt_pos].data_buf[off + 1]; + w0[2] = esalt_bufs[salt_pos].data_buf[off + 2]; + w0[3] = esalt_bufs[salt_pos].data_buf[off + 3]; + w1[0] = esalt_bufs[salt_pos].data_buf[off + 4]; + w1[1] = esalt_bufs[salt_pos].data_buf[off + 5]; + w1[2] = esalt_bufs[salt_pos].data_buf[off + 6]; + w1[3] = esalt_bufs[salt_pos].data_buf[off + 7]; + w2[0] = esalt_bufs[salt_pos].data_buf[off + 8]; + w2[1] = esalt_bufs[salt_pos].data_buf[off + 9]; + w2[2] = esalt_bufs[salt_pos].data_buf[off + 10]; + w2[3] = esalt_bufs[salt_pos].data_buf[off + 11]; + w3[0] = esalt_bufs[salt_pos].data_buf[off + 12]; + w3[1] = esalt_bufs[salt_pos].data_buf[off + 13]; + w3[2] = 0; + w3[3] = (64 + size) * 8; + + u32x digest[8]; + + hmac_sha256_run (w0, w1, w2, w3, ipad, opad, digest); + + const u32x r0 = digest[0]; + const u32x r1 = digest[1]; + const u32x r2 = digest[2]; + const u32x r3 = digest[3]; + + #define il_pos 0 + + #include VECT_COMPARE_M +} diff --git a/nv/m08300_a0.cu b/nv/m08300_a0.cu new file mode 100644 index 0000000000..b3d98b8439 --- /dev/null +++ b/nv/m08300_a0.cu @@ -0,0 +1,772 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _SHA1_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW2 +#define VECT_SIZE1 +#endif + +#define DGST_R0 3 +#define DGST_R1 4 +#define DGST_R2 2 +#define DGST_R3 1 + +#include "include/kernel_functions.c" +#include "types_nv.c" +#include "common_nv.c" +#include "include/rp_gpu.h" +#include "rp_nv.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +__device__ __constant__ gpu_rule_t c_rules[1024]; + +__device__ static void sha1_transform (const u32x w0[4], const u32x w1[4], const u32x w2[4], const u32x w3[4], u32x digest[5]) +{ + u32x A = digest[0]; + u32x B = digest[1]; + u32x C = digest[2]; + u32x D = digest[3]; + u32x E = digest[4]; + + u32x w0_t = w0[0]; + u32x w1_t = w0[1]; + u32x w2_t = w0[2]; + u32x w3_t = w0[3]; + u32x w4_t = w1[0]; + u32x w5_t = w1[1]; + u32x w6_t = w1[2]; + u32x w7_t = w1[3]; + u32x w8_t = w2[0]; + u32x w9_t = w2[1]; + u32x wa_t = w2[2]; + u32x wb_t = w2[3]; + u32x wc_t = w3[0]; + u32x wd_t = w3[1]; + u32x we_t = w3[2]; + u32x wf_t = w3[3]; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, A, B, C, D, E, w0_t); + SHA1_STEP (SHA1_F0o, E, A, B, C, D, w1_t); + SHA1_STEP (SHA1_F0o, D, E, A, B, C, w2_t); + SHA1_STEP (SHA1_F0o, C, D, E, A, B, w3_t); + SHA1_STEP (SHA1_F0o, B, C, D, E, A, w4_t); + SHA1_STEP (SHA1_F0o, A, B, C, D, E, w5_t); + SHA1_STEP (SHA1_F0o, E, A, B, C, D, w6_t); + SHA1_STEP (SHA1_F0o, D, E, A, B, C, w7_t); + SHA1_STEP (SHA1_F0o, C, D, E, A, B, w8_t); + SHA1_STEP (SHA1_F0o, B, C, D, E, A, w9_t); + SHA1_STEP (SHA1_F0o, A, B, C, D, E, wa_t); + SHA1_STEP (SHA1_F0o, E, A, B, C, D, wb_t); + SHA1_STEP (SHA1_F0o, D, E, A, B, C, wc_t); + SHA1_STEP (SHA1_F0o, C, D, E, A, B, wd_t); + SHA1_STEP (SHA1_F0o, B, C, D, E, A, we_t); + SHA1_STEP (SHA1_F0o, A, B, C, D, E, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F0o, E, A, B, C, D, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F0o, D, E, A, B, C, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F0o, C, D, E, A, B, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F0o, B, C, D, E, A, w3_t); + + #undef K + #define K SHA1C01 + + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w7_t); + + #undef K + #define K SHA1C02 + + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, wb_t); + + #undef K + #define K SHA1C03 + + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, wf_t); + + digest[0] += A; + digest[1] += B; + digest[2] += C; + digest[3] += D; + digest[4] += E; +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m08300_m04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + u32x pw_buf1[4]; + + pw_buf1[0] = pws[gid].i[ 4]; + pw_buf1[1] = pws[gid].i[ 5]; + pw_buf1[2] = pws[gid].i[ 6]; + pw_buf1[3] = pws[gid].i[ 7]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * salt + */ + + const u32 salt_iter = salt_bufs[salt_pos].salt_iter; + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[ 1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[ 2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[ 3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[ 4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[ 5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[ 6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[ 7]; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + u32 domain_buf0[4]; + + domain_buf0[0] = salt_bufs[salt_pos].salt_buf_pc[ 0]; + domain_buf0[1] = salt_bufs[salt_pos].salt_buf_pc[ 1]; + domain_buf0[2] = salt_bufs[salt_pos].salt_buf_pc[ 2]; + domain_buf0[3] = salt_bufs[salt_pos].salt_buf_pc[ 3]; + + u32 domain_buf1[4]; + + domain_buf1[0] = salt_bufs[salt_pos].salt_buf_pc[ 4]; + domain_buf1[1] = salt_bufs[salt_pos].salt_buf_pc[ 5]; + domain_buf1[2] = salt_bufs[salt_pos].salt_buf_pc[ 6]; + domain_buf1[3] = 0; + + const u32 domain_len = salt_bufs[salt_pos].salt_buf_pc[ 7]; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + u32x w1[4]; + u32x w2[4]; + u32x w3[4]; + + w0[0] = pw_buf0[0]; + w0[1] = pw_buf0[1]; + w0[2] = pw_buf0[2]; + w0[3] = pw_buf0[3]; + w1[0] = pw_buf1[0]; + w1[1] = pw_buf1[1]; + w1[2] = pw_buf1[2]; + w1[3] = pw_buf1[3]; + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 out_len = apply_rules (c_rules[il_pos].cmds, w0, w1, pw_len); + + u32x w0_t[4]; + + w0_t[0] = w0[0]; + w0_t[1] = w0[1]; + w0_t[2] = w0[2]; + w0_t[3] = w0[3]; + + u32x w1_t[4]; + + w1_t[0] = w1[0]; + w1_t[1] = w1[1]; + w1_t[2] = w1[2]; + w1_t[3] = w1[3]; + + u32x w2_t[4]; + + w2_t[0] = w2[0]; + w2_t[1] = w2[1]; + w2_t[2] = w2[2]; + w2_t[3] = w2[3]; + + u32x w3_t[4]; + + w3_t[0] = w3[0]; + w3_t[1] = w3[1]; + w3_t[2] = w3[2]; + w3_t[3] = w3[3]; + + switch_buffer_by_offset (w0_t, w1_t, w2_t, w3_t, 1); + + w0_t[0] |= pw_len & 0xff; + + /** + * salt + */ + + u32 s0[4]; + + s0[0] = salt_buf0[0]; + s0[1] = salt_buf0[1]; + s0[2] = salt_buf0[2]; + s0[3] = salt_buf0[3]; + + u32 s1[4]; + + s1[0] = salt_buf1[0]; + s1[1] = salt_buf1[1]; + s1[2] = salt_buf1[2]; + s1[3] = salt_buf1[3]; + + u32 s2[4]; + + s2[0] = 0; + s2[1] = 0; + s2[2] = 0; + s2[3] = 0; + + u32 s3[4]; + + s3[0] = 0; + s3[1] = 0; + s3[2] = 0; + s3[3] = 0; + + switch_buffer_by_offset (s0, s1, s2, s3, 1 + out_len + domain_len + 1); + + u32 d0[4]; + + d0[0] = domain_buf0[0]; + d0[1] = domain_buf0[1]; + d0[2] = domain_buf0[2]; + d0[3] = domain_buf0[3]; + + u32 d1[4]; + + d1[0] = domain_buf1[0]; + d1[1] = domain_buf1[1]; + d1[2] = domain_buf1[2]; + d1[3] = 0; + + u32 d2[4]; + + d2[0] = 0; + d2[1] = 0; + d2[2] = 0; + d2[3] = 0; + + u32 d3[4]; + + d3[0] = 0; + d3[1] = 0; + d3[2] = 0; + d3[3] = 0; + + switch_buffer_by_offset (d0, d1, d2, d3, 1 + out_len); + + /** + * sha1 + */ + + u32x w0_t2[4]; + + w0_t2[0] = swap_workaround (w0_t[0] | d0[0] | s0[0]); + w0_t2[1] = swap_workaround (w0_t[1] | d0[1] | s0[1]); + w0_t2[2] = swap_workaround (w0_t[2] | d0[2] | s0[2]); + w0_t2[3] = swap_workaround (w0_t[3] | d0[3] | s0[3]); + + u32x w1_t2[4]; + + w1_t2[0] = swap_workaround (w1_t[0] | d1[0] | s1[0]); + w1_t2[1] = swap_workaround (w1_t[1] | d1[1] | s1[1]); + w1_t2[2] = swap_workaround (w1_t[2] | d1[2] | s1[2]); + w1_t2[3] = swap_workaround (w1_t[3] | d1[3] | s1[3]); + + u32x w2_t2[4]; + + w2_t2[0] = swap_workaround (w2_t[0] | d2[0] | s2[0]); + w2_t2[1] = swap_workaround (w2_t[1] | d2[1] | s2[1]); + w2_t2[2] = swap_workaround (w2_t[2] | d2[2] | s2[2]); + w2_t2[3] = swap_workaround (w2_t[3] | d2[3] | s2[3]); + + u32x w3_t2[4]; + + w3_t2[0] = swap_workaround (w3_t[0] | d3[0] | s3[0]); + w3_t2[1] = swap_workaround (w3_t[1] | d3[1] | s3[1]); + w3_t2[2] = 0; + w3_t2[3] = (1 + out_len + domain_len + 1 + salt_len) * 8; + + u32x digest[5]; + + digest[0] = SHA1M_A; + digest[1] = SHA1M_B; + digest[2] = SHA1M_C; + digest[3] = SHA1M_D; + digest[4] = SHA1M_E; + + sha1_transform (w0_t2, w1_t2, w2_t2, w3_t2, digest); + + // iterations + + for (u32 i = 0; i < salt_iter; i++) + { + u32x w0_t3[4]; + + w0_t3[0] = digest[0]; + w0_t3[1] = digest[1]; + w0_t3[2] = digest[2]; + w0_t3[3] = digest[3]; + + u32x w1_t3[4]; + + w1_t3[0] = digest[4]; + w1_t3[1] = swap_workaround (salt_buf0[0]); + w1_t3[2] = swap_workaround (salt_buf0[1]); + w1_t3[3] = swap_workaround (salt_buf0[2]); + + u32x w2_t3[4]; + + w2_t3[0] = swap_workaround (salt_buf0[3]); + w2_t3[1] = swap_workaround (salt_buf1[0]); + w2_t3[2] = swap_workaround (salt_buf1[1]); + w2_t3[3] = swap_workaround (salt_buf1[2]); + + u32x w3_t3[4]; + + w3_t3[0] = swap_workaround (salt_buf1[3]); + w3_t3[1] = 0; + w3_t3[2] = 0; + w3_t3[3] = (20 + salt_len) * 8; + + digest[0] = SHA1M_A; + digest[1] = SHA1M_B; + digest[2] = SHA1M_C; + digest[3] = SHA1M_D; + digest[4] = SHA1M_E; + + sha1_transform (w0_t3, w1_t3, w2_t3, w3_t3, digest); + } + + const u32x r0 = digest[3]; + const u32x r1 = digest[4]; + const u32x r2 = digest[2]; + const u32x r3 = digest[1]; + + #include VECT_COMPARE_M + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m08300_m08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m08300_m16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m08300_s04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + u32x pw_buf1[4]; + + pw_buf1[0] = pws[gid].i[ 4]; + pw_buf1[1] = pws[gid].i[ 5]; + pw_buf1[2] = pws[gid].i[ 6]; + pw_buf1[3] = pws[gid].i[ 7]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * salt + */ + + const u32 salt_iter = salt_bufs[salt_pos].salt_iter; + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[ 1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[ 2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[ 3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[ 4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[ 5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[ 6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[ 7]; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + u32 domain_buf0[4]; + + domain_buf0[0] = salt_bufs[salt_pos].salt_buf_pc[ 0]; + domain_buf0[1] = salt_bufs[salt_pos].salt_buf_pc[ 1]; + domain_buf0[2] = salt_bufs[salt_pos].salt_buf_pc[ 2]; + domain_buf0[3] = salt_bufs[salt_pos].salt_buf_pc[ 3]; + + u32 domain_buf1[4]; + + domain_buf1[0] = salt_bufs[salt_pos].salt_buf_pc[ 4]; + domain_buf1[1] = salt_bufs[salt_pos].salt_buf_pc[ 5]; + domain_buf1[2] = salt_bufs[salt_pos].salt_buf_pc[ 6]; + domain_buf1[3] = 0; + + const u32 domain_len = salt_bufs[salt_pos].salt_buf_pc[ 7]; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + u32x w1[4]; + u32x w2[4]; + u32x w3[4]; + + w0[0] = pw_buf0[0]; + w0[1] = pw_buf0[1]; + w0[2] = pw_buf0[2]; + w0[3] = pw_buf0[3]; + w1[0] = pw_buf1[0]; + w1[1] = pw_buf1[1]; + w1[2] = pw_buf1[2]; + w1[3] = pw_buf1[3]; + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 out_len = apply_rules (c_rules[il_pos].cmds, w0, w1, pw_len); + + u32x w0_t[4]; + + w0_t[0] = w0[0]; + w0_t[1] = w0[1]; + w0_t[2] = w0[2]; + w0_t[3] = w0[3]; + + u32x w1_t[4]; + + w1_t[0] = w1[0]; + w1_t[1] = w1[1]; + w1_t[2] = w1[2]; + w1_t[3] = w1[3]; + + u32x w2_t[4]; + + w2_t[0] = w2[0]; + w2_t[1] = w2[1]; + w2_t[2] = w2[2]; + w2_t[3] = w2[3]; + + u32x w3_t[4]; + + w3_t[0] = w3[0]; + w3_t[1] = w3[1]; + w3_t[2] = w3[2]; + w3_t[3] = w3[3]; + + switch_buffer_by_offset (w0_t, w1_t, w2_t, w3_t, 1); + + w0_t[0] |= pw_len & 0xff; + + /** + * salt + */ + + u32 s0[4]; + + s0[0] = salt_buf0[0]; + s0[1] = salt_buf0[1]; + s0[2] = salt_buf0[2]; + s0[3] = salt_buf0[3]; + + u32 s1[4]; + + s1[0] = salt_buf1[0]; + s1[1] = salt_buf1[1]; + s1[2] = salt_buf1[2]; + s1[3] = salt_buf1[3]; + + u32 s2[4]; + + s2[0] = 0; + s2[1] = 0; + s2[2] = 0; + s2[3] = 0; + + u32 s3[4]; + + s3[0] = 0; + s3[1] = 0; + s3[2] = 0; + s3[3] = 0; + + switch_buffer_by_offset (s0, s1, s2, s3, 1 + out_len + domain_len + 1); + + u32 d0[4]; + + d0[0] = domain_buf0[0]; + d0[1] = domain_buf0[1]; + d0[2] = domain_buf0[2]; + d0[3] = domain_buf0[3]; + + u32 d1[4]; + + d1[0] = domain_buf1[0]; + d1[1] = domain_buf1[1]; + d1[2] = domain_buf1[2]; + d1[3] = 0; + + u32 d2[4]; + + d2[0] = 0; + d2[1] = 0; + d2[2] = 0; + d2[3] = 0; + + u32 d3[4]; + + d3[0] = 0; + d3[1] = 0; + d3[2] = 0; + d3[3] = 0; + + switch_buffer_by_offset (d0, d1, d2, d3, 1 + out_len); + + /** + * sha1 + */ + + u32x w0_t2[4]; + + w0_t2[0] = swap_workaround (w0_t[0] | d0[0] | s0[0]); + w0_t2[1] = swap_workaround (w0_t[1] | d0[1] | s0[1]); + w0_t2[2] = swap_workaround (w0_t[2] | d0[2] | s0[2]); + w0_t2[3] = swap_workaround (w0_t[3] | d0[3] | s0[3]); + + u32x w1_t2[4]; + + w1_t2[0] = swap_workaround (w1_t[0] | d1[0] | s1[0]); + w1_t2[1] = swap_workaround (w1_t[1] | d1[1] | s1[1]); + w1_t2[2] = swap_workaround (w1_t[2] | d1[2] | s1[2]); + w1_t2[3] = swap_workaround (w1_t[3] | d1[3] | s1[3]); + + u32x w2_t2[4]; + + w2_t2[0] = swap_workaround (w2_t[0] | d2[0] | s2[0]); + w2_t2[1] = swap_workaround (w2_t[1] | d2[1] | s2[1]); + w2_t2[2] = swap_workaround (w2_t[2] | d2[2] | s2[2]); + w2_t2[3] = swap_workaround (w2_t[3] | d2[3] | s2[3]); + + u32x w3_t2[4]; + + w3_t2[0] = swap_workaround (w3_t[0] | d3[0] | s3[0]); + w3_t2[1] = swap_workaround (w3_t[1] | d3[1] | s3[1]); + w3_t2[2] = 0; + w3_t2[3] = (1 + out_len + domain_len + 1 + salt_len) * 8; + + u32x digest[5]; + + digest[0] = SHA1M_A; + digest[1] = SHA1M_B; + digest[2] = SHA1M_C; + digest[3] = SHA1M_D; + digest[4] = SHA1M_E; + + sha1_transform (w0_t2, w1_t2, w2_t2, w3_t2, digest); + + // iterations + + for (u32 i = 0; i < salt_iter; i++) + { + u32x w0_t3[4]; + + w0_t3[0] = digest[0]; + w0_t3[1] = digest[1]; + w0_t3[2] = digest[2]; + w0_t3[3] = digest[3]; + + u32x w1_t3[4]; + + w1_t3[0] = digest[4]; + w1_t3[1] = swap_workaround (salt_buf0[0]); + w1_t3[2] = swap_workaround (salt_buf0[1]); + w1_t3[3] = swap_workaround (salt_buf0[2]); + + u32x w2_t3[4]; + + w2_t3[0] = swap_workaround (salt_buf0[3]); + w2_t3[1] = swap_workaround (salt_buf1[0]); + w2_t3[2] = swap_workaround (salt_buf1[1]); + w2_t3[3] = swap_workaround (salt_buf1[2]); + + u32x w3_t3[4]; + + w3_t3[0] = swap_workaround (salt_buf1[3]); + w3_t3[1] = 0; + w3_t3[2] = 0; + w3_t3[3] = (20 + salt_len) * 8; + + digest[0] = SHA1M_A; + digest[1] = SHA1M_B; + digest[2] = SHA1M_C; + digest[3] = SHA1M_D; + digest[4] = SHA1M_E; + + sha1_transform (w0_t3, w1_t3, w2_t3, w3_t3, digest); + } + + const u32x r0 = digest[3]; + const u32x r1 = digest[4]; + const u32x r2 = digest[2]; + const u32x r3 = digest[1]; + + #include VECT_COMPARE_S + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m08300_s08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m08300_s16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/nv/m08300_a1.cu b/nv/m08300_a1.cu new file mode 100644 index 0000000000..1f3bb6302a --- /dev/null +++ b/nv/m08300_a1.cu @@ -0,0 +1,866 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _SHA1_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW2 +#define VECT_SIZE1 +#endif + +#define DGST_R0 3 +#define DGST_R1 4 +#define DGST_R2 2 +#define DGST_R3 1 + +#include "include/kernel_functions.c" +#include "types_nv.c" +#include "common_nv.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +__device__ __constant__ comb_t c_combs[1024]; + +__device__ static void sha1_transform (const u32x w0[4], const u32x w1[4], const u32x w2[4], const u32x w3[4], u32x digest[5]) +{ + u32x A = digest[0]; + u32x B = digest[1]; + u32x C = digest[2]; + u32x D = digest[3]; + u32x E = digest[4]; + + u32x w0_t = w0[0]; + u32x w1_t = w0[1]; + u32x w2_t = w0[2]; + u32x w3_t = w0[3]; + u32x w4_t = w1[0]; + u32x w5_t = w1[1]; + u32x w6_t = w1[2]; + u32x w7_t = w1[3]; + u32x w8_t = w2[0]; + u32x w9_t = w2[1]; + u32x wa_t = w2[2]; + u32x wb_t = w2[3]; + u32x wc_t = w3[0]; + u32x wd_t = w3[1]; + u32x we_t = w3[2]; + u32x wf_t = w3[3]; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, A, B, C, D, E, w0_t); + SHA1_STEP (SHA1_F0o, E, A, B, C, D, w1_t); + SHA1_STEP (SHA1_F0o, D, E, A, B, C, w2_t); + SHA1_STEP (SHA1_F0o, C, D, E, A, B, w3_t); + SHA1_STEP (SHA1_F0o, B, C, D, E, A, w4_t); + SHA1_STEP (SHA1_F0o, A, B, C, D, E, w5_t); + SHA1_STEP (SHA1_F0o, E, A, B, C, D, w6_t); + SHA1_STEP (SHA1_F0o, D, E, A, B, C, w7_t); + SHA1_STEP (SHA1_F0o, C, D, E, A, B, w8_t); + SHA1_STEP (SHA1_F0o, B, C, D, E, A, w9_t); + SHA1_STEP (SHA1_F0o, A, B, C, D, E, wa_t); + SHA1_STEP (SHA1_F0o, E, A, B, C, D, wb_t); + SHA1_STEP (SHA1_F0o, D, E, A, B, C, wc_t); + SHA1_STEP (SHA1_F0o, C, D, E, A, B, wd_t); + SHA1_STEP (SHA1_F0o, B, C, D, E, A, we_t); + SHA1_STEP (SHA1_F0o, A, B, C, D, E, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F0o, E, A, B, C, D, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F0o, D, E, A, B, C, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F0o, C, D, E, A, B, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F0o, B, C, D, E, A, w3_t); + + #undef K + #define K SHA1C01 + + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w7_t); + + #undef K + #define K SHA1C02 + + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, wb_t); + + #undef K + #define K SHA1C03 + + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, wf_t); + + digest[0] += A; + digest[1] += B; + digest[2] += C; + digest[3] += D; + digest[4] += E; +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m08300_m04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, c_combs[0].pw_len); + } + + /** + * salt + */ + + const u32 salt_iter = salt_bufs[salt_pos].salt_iter; + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[ 1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[ 2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[ 3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[ 4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[ 5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[ 6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[ 7]; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + u32 domain_buf0[4]; + + domain_buf0[0] = salt_bufs[salt_pos].salt_buf_pc[ 0]; + domain_buf0[1] = salt_bufs[salt_pos].salt_buf_pc[ 1]; + domain_buf0[2] = salt_bufs[salt_pos].salt_buf_pc[ 2]; + domain_buf0[3] = salt_bufs[salt_pos].salt_buf_pc[ 3]; + + u32 domain_buf1[4]; + + domain_buf1[0] = salt_bufs[salt_pos].salt_buf_pc[ 4]; + domain_buf1[1] = salt_bufs[salt_pos].salt_buf_pc[ 5]; + domain_buf1[2] = salt_bufs[salt_pos].salt_buf_pc[ 6]; + domain_buf1[3] = 0; + + const u32 domain_len = salt_bufs[salt_pos].salt_buf_pc[ 7]; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = c_combs[il_pos].pw_len; + + const u32 pw_len = pw_l_len + pw_r_len; + + u32 wordr0[4]; + u32 wordr1[4]; + u32 wordr2[4]; + u32 wordr3[4]; + + wordr0[0] = c_combs[il_pos].i[0]; + wordr0[1] = c_combs[il_pos].i[1]; + wordr0[2] = c_combs[il_pos].i[2]; + wordr0[3] = c_combs[il_pos].i[3]; + wordr1[0] = c_combs[il_pos].i[4]; + wordr1[1] = c_combs[il_pos].i[5]; + wordr1[2] = c_combs[il_pos].i[6]; + wordr1[3] = c_combs[il_pos].i[7]; + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + u32x w0[4]; + u32x w1[4]; + u32x w2[4]; + u32x w3[4]; + + w0[0] = wordl0[0] | wordr0[0]; + w0[1] = wordl0[1] | wordr0[1]; + w0[2] = wordl0[2] | wordr0[2]; + w0[3] = wordl0[3] | wordr0[3]; + w1[0] = wordl1[0] | wordr1[0]; + w1[1] = wordl1[1] | wordr1[1]; + w1[2] = wordl1[2] | wordr1[2]; + w1[3] = wordl1[3] | wordr1[3]; + w2[0] = wordl2[0] | wordr2[0]; + w2[1] = wordl2[1] | wordr2[1]; + w2[2] = wordl2[2] | wordr2[2]; + w2[3] = wordl2[3] | wordr2[3]; + w3[0] = wordl3[0] | wordr3[0]; + w3[1] = wordl3[1] | wordr3[1]; + w3[2] = wordl3[2] | wordr3[2]; + w3[3] = wordl3[3] | wordr3[3]; + + u32x w0_t[4]; + + w0_t[0] = w0[0]; + w0_t[1] = w0[1]; + w0_t[2] = w0[2]; + w0_t[3] = w0[3]; + + u32x w1_t[4]; + + w1_t[0] = w1[0]; + w1_t[1] = w1[1]; + w1_t[2] = w1[2]; + w1_t[3] = w1[3]; + + u32x w2_t[4]; + + w2_t[0] = w2[0]; + w2_t[1] = w2[1]; + w2_t[2] = w2[2]; + w2_t[3] = w2[3]; + + u32x w3_t[4]; + + w3_t[0] = w3[0]; + w3_t[1] = w3[1]; + w3_t[2] = w3[2]; + w3_t[3] = w3[3]; + + switch_buffer_by_offset (w0_t, w1_t, w2_t, w3_t, 1); + + w0_t[0] |= pw_len & 0xff; + + /** + * salt + */ + + u32 s0[4]; + + s0[0] = salt_buf0[0]; + s0[1] = salt_buf0[1]; + s0[2] = salt_buf0[2]; + s0[3] = salt_buf0[3]; + + u32 s1[4]; + + s1[0] = salt_buf1[0]; + s1[1] = salt_buf1[1]; + s1[2] = salt_buf1[2]; + s1[3] = salt_buf1[3]; + + u32 s2[4]; + + s2[0] = 0; + s2[1] = 0; + s2[2] = 0; + s2[3] = 0; + + u32 s3[4]; + + s3[0] = 0; + s3[1] = 0; + s3[2] = 0; + s3[3] = 0; + + switch_buffer_by_offset (s0, s1, s2, s3, 1 + pw_len + domain_len + 1); + + u32 d0[4]; + + d0[0] = domain_buf0[0]; + d0[1] = domain_buf0[1]; + d0[2] = domain_buf0[2]; + d0[3] = domain_buf0[3]; + + u32 d1[4]; + + d1[0] = domain_buf1[0]; + d1[1] = domain_buf1[1]; + d1[2] = domain_buf1[2]; + d1[3] = 0; + + u32 d2[4]; + + d2[0] = 0; + d2[1] = 0; + d2[2] = 0; + d2[3] = 0; + + u32 d3[4]; + + d3[0] = 0; + d3[1] = 0; + d3[2] = 0; + d3[3] = 0; + + switch_buffer_by_offset (d0, d1, d2, d3, 1 + pw_len); + + /** + * sha1 + */ + + u32x w0_t2[4]; + + w0_t2[0] = swap_workaround (w0_t[0] | d0[0] | s0[0]); + w0_t2[1] = swap_workaround (w0_t[1] | d0[1] | s0[1]); + w0_t2[2] = swap_workaround (w0_t[2] | d0[2] | s0[2]); + w0_t2[3] = swap_workaround (w0_t[3] | d0[3] | s0[3]); + + u32x w1_t2[4]; + + w1_t2[0] = swap_workaround (w1_t[0] | d1[0] | s1[0]); + w1_t2[1] = swap_workaround (w1_t[1] | d1[1] | s1[1]); + w1_t2[2] = swap_workaround (w1_t[2] | d1[2] | s1[2]); + w1_t2[3] = swap_workaround (w1_t[3] | d1[3] | s1[3]); + + u32x w2_t2[4]; + + w2_t2[0] = swap_workaround (w2_t[0] | d2[0] | s2[0]); + w2_t2[1] = swap_workaround (w2_t[1] | d2[1] | s2[1]); + w2_t2[2] = swap_workaround (w2_t[2] | d2[2] | s2[2]); + w2_t2[3] = swap_workaround (w2_t[3] | d2[3] | s2[3]); + + u32x w3_t2[4]; + + w3_t2[0] = swap_workaround (w3_t[0] | d3[0] | s3[0]); + w3_t2[1] = swap_workaround (w3_t[1] | d3[1] | s3[1]); + w3_t2[2] = 0; + w3_t2[3] = (1 + pw_len + domain_len + 1 + salt_len) * 8; + + u32x digest[5]; + + digest[0] = SHA1M_A; + digest[1] = SHA1M_B; + digest[2] = SHA1M_C; + digest[3] = SHA1M_D; + digest[4] = SHA1M_E; + + sha1_transform (w0_t2, w1_t2, w2_t2, w3_t2, digest); + + // iterations + + for (u32 i = 0; i < salt_iter; i++) + { + u32x w0_t3[4]; + + w0_t3[0] = digest[0]; + w0_t3[1] = digest[1]; + w0_t3[2] = digest[2]; + w0_t3[3] = digest[3]; + + u32x w1_t3[4]; + + w1_t3[0] = digest[4]; + w1_t3[1] = swap_workaround (salt_buf0[0]); + w1_t3[2] = swap_workaround (salt_buf0[1]); + w1_t3[3] = swap_workaround (salt_buf0[2]); + + u32x w2_t3[4]; + + w2_t3[0] = swap_workaround (salt_buf0[3]); + w2_t3[1] = swap_workaround (salt_buf1[0]); + w2_t3[2] = swap_workaround (salt_buf1[1]); + w2_t3[3] = swap_workaround (salt_buf1[2]); + + u32x w3_t3[4]; + + w3_t3[0] = swap_workaround (salt_buf1[3]); + w3_t3[1] = 0; + w3_t3[2] = 0; + w3_t3[3] = (20 + salt_len) * 8; + + digest[0] = SHA1M_A; + digest[1] = SHA1M_B; + digest[2] = SHA1M_C; + digest[3] = SHA1M_D; + digest[4] = SHA1M_E; + + sha1_transform (w0_t3, w1_t3, w2_t3, w3_t3, digest); + } + + const u32x r0 = digest[3]; + const u32x r1 = digest[4]; + const u32x r2 = digest[2]; + const u32x r3 = digest[1]; + + #include VECT_COMPARE_M + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m08300_m08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m08300_m16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m08300_s04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, c_combs[0].pw_len); + } + + /** + * salt + */ + + const u32 salt_iter = salt_bufs[salt_pos].salt_iter; + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[ 1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[ 2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[ 3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[ 4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[ 5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[ 6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[ 7]; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + u32 domain_buf0[4]; + + domain_buf0[0] = salt_bufs[salt_pos].salt_buf_pc[ 0]; + domain_buf0[1] = salt_bufs[salt_pos].salt_buf_pc[ 1]; + domain_buf0[2] = salt_bufs[salt_pos].salt_buf_pc[ 2]; + domain_buf0[3] = salt_bufs[salt_pos].salt_buf_pc[ 3]; + + u32 domain_buf1[4]; + + domain_buf1[0] = salt_bufs[salt_pos].salt_buf_pc[ 4]; + domain_buf1[1] = salt_bufs[salt_pos].salt_buf_pc[ 5]; + domain_buf1[2] = salt_bufs[salt_pos].salt_buf_pc[ 6]; + domain_buf1[3] = 0; + + const u32 domain_len = salt_bufs[salt_pos].salt_buf_pc[ 7]; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = c_combs[il_pos].pw_len; + + const u32 pw_len = pw_l_len + pw_r_len; + + u32 wordr0[4]; + u32 wordr1[4]; + u32 wordr2[4]; + u32 wordr3[4]; + + wordr0[0] = c_combs[il_pos].i[0]; + wordr0[1] = c_combs[il_pos].i[1]; + wordr0[2] = c_combs[il_pos].i[2]; + wordr0[3] = c_combs[il_pos].i[3]; + wordr1[0] = c_combs[il_pos].i[4]; + wordr1[1] = c_combs[il_pos].i[5]; + wordr1[2] = c_combs[il_pos].i[6]; + wordr1[3] = c_combs[il_pos].i[7]; + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + u32x w0[4]; + u32x w1[4]; + u32x w2[4]; + u32x w3[4]; + + w0[0] = wordl0[0] | wordr0[0]; + w0[1] = wordl0[1] | wordr0[1]; + w0[2] = wordl0[2] | wordr0[2]; + w0[3] = wordl0[3] | wordr0[3]; + w1[0] = wordl1[0] | wordr1[0]; + w1[1] = wordl1[1] | wordr1[1]; + w1[2] = wordl1[2] | wordr1[2]; + w1[3] = wordl1[3] | wordr1[3]; + w2[0] = wordl2[0] | wordr2[0]; + w2[1] = wordl2[1] | wordr2[1]; + w2[2] = wordl2[2] | wordr2[2]; + w2[3] = wordl2[3] | wordr2[3]; + w3[0] = wordl3[0] | wordr3[0]; + w3[1] = wordl3[1] | wordr3[1]; + w3[2] = wordl3[2] | wordr3[2]; + w3[3] = wordl3[3] | wordr3[3]; + + u32x w0_t[4]; + + w0_t[0] = w0[0]; + w0_t[1] = w0[1]; + w0_t[2] = w0[2]; + w0_t[3] = w0[3]; + + u32x w1_t[4]; + + w1_t[0] = w1[0]; + w1_t[1] = w1[1]; + w1_t[2] = w1[2]; + w1_t[3] = w1[3]; + + u32x w2_t[4]; + + w2_t[0] = w2[0]; + w2_t[1] = w2[1]; + w2_t[2] = w2[2]; + w2_t[3] = w2[3]; + + u32x w3_t[4]; + + w3_t[0] = w3[0]; + w3_t[1] = w3[1]; + w3_t[2] = w3[2]; + w3_t[3] = w3[3]; + + switch_buffer_by_offset (w0_t, w1_t, w2_t, w3_t, 1); + + w0_t[0] |= pw_len & 0xff; + + /** + * salt + */ + + u32 s0[4]; + + s0[0] = salt_buf0[0]; + s0[1] = salt_buf0[1]; + s0[2] = salt_buf0[2]; + s0[3] = salt_buf0[3]; + + u32 s1[4]; + + s1[0] = salt_buf1[0]; + s1[1] = salt_buf1[1]; + s1[2] = salt_buf1[2]; + s1[3] = salt_buf1[3]; + + u32 s2[4]; + + s2[0] = 0; + s2[1] = 0; + s2[2] = 0; + s2[3] = 0; + + u32 s3[4]; + + s3[0] = 0; + s3[1] = 0; + s3[2] = 0; + s3[3] = 0; + + switch_buffer_by_offset (s0, s1, s2, s3, 1 + pw_len + domain_len + 1); + + u32 d0[4]; + + d0[0] = domain_buf0[0]; + d0[1] = domain_buf0[1]; + d0[2] = domain_buf0[2]; + d0[3] = domain_buf0[3]; + + u32 d1[4]; + + d1[0] = domain_buf1[0]; + d1[1] = domain_buf1[1]; + d1[2] = domain_buf1[2]; + d1[3] = 0; + + u32 d2[4]; + + d2[0] = 0; + d2[1] = 0; + d2[2] = 0; + d2[3] = 0; + + u32 d3[4]; + + d3[0] = 0; + d3[1] = 0; + d3[2] = 0; + d3[3] = 0; + + switch_buffer_by_offset (d0, d1, d2, d3, 1 + pw_len); + + /** + * sha1 + */ + + u32x w0_t2[4]; + + w0_t2[0] = swap_workaround (w0_t[0] | d0[0] | s0[0]); + w0_t2[1] = swap_workaround (w0_t[1] | d0[1] | s0[1]); + w0_t2[2] = swap_workaround (w0_t[2] | d0[2] | s0[2]); + w0_t2[3] = swap_workaround (w0_t[3] | d0[3] | s0[3]); + + u32x w1_t2[4]; + + w1_t2[0] = swap_workaround (w1_t[0] | d1[0] | s1[0]); + w1_t2[1] = swap_workaround (w1_t[1] | d1[1] | s1[1]); + w1_t2[2] = swap_workaround (w1_t[2] | d1[2] | s1[2]); + w1_t2[3] = swap_workaround (w1_t[3] | d1[3] | s1[3]); + + u32x w2_t2[4]; + + w2_t2[0] = swap_workaround (w2_t[0] | d2[0] | s2[0]); + w2_t2[1] = swap_workaround (w2_t[1] | d2[1] | s2[1]); + w2_t2[2] = swap_workaround (w2_t[2] | d2[2] | s2[2]); + w2_t2[3] = swap_workaround (w2_t[3] | d2[3] | s2[3]); + + u32x w3_t2[4]; + + w3_t2[0] = swap_workaround (w3_t[0] | d3[0] | s3[0]); + w3_t2[1] = swap_workaround (w3_t[1] | d3[1] | s3[1]); + w3_t2[2] = 0; + w3_t2[3] = (1 + pw_len + domain_len + 1 + salt_len) * 8; + + u32x digest[5]; + + digest[0] = SHA1M_A; + digest[1] = SHA1M_B; + digest[2] = SHA1M_C; + digest[3] = SHA1M_D; + digest[4] = SHA1M_E; + + sha1_transform (w0_t2, w1_t2, w2_t2, w3_t2, digest); + + // iterations + + for (u32 i = 0; i < salt_iter; i++) + { + u32x w0_t3[4]; + + w0_t3[0] = digest[0]; + w0_t3[1] = digest[1]; + w0_t3[2] = digest[2]; + w0_t3[3] = digest[3]; + + u32x w1_t3[4]; + + w1_t3[0] = digest[4]; + w1_t3[1] = swap_workaround (salt_buf0[0]); + w1_t3[2] = swap_workaround (salt_buf0[1]); + w1_t3[3] = swap_workaround (salt_buf0[2]); + + u32x w2_t3[4]; + + w2_t3[0] = swap_workaround (salt_buf0[3]); + w2_t3[1] = swap_workaround (salt_buf1[0]); + w2_t3[2] = swap_workaround (salt_buf1[1]); + w2_t3[3] = swap_workaround (salt_buf1[2]); + + u32x w3_t3[4]; + + w3_t3[0] = swap_workaround (salt_buf1[3]); + w3_t3[1] = 0; + w3_t3[2] = 0; + w3_t3[3] = (20 + salt_len) * 8; + + digest[0] = SHA1M_A; + digest[1] = SHA1M_B; + digest[2] = SHA1M_C; + digest[3] = SHA1M_D; + digest[4] = SHA1M_E; + + sha1_transform (w0_t3, w1_t3, w2_t3, w3_t3, digest); + } + + const u32x r0 = digest[3]; + const u32x r1 = digest[4]; + const u32x r2 = digest[2]; + const u32x r3 = digest[1]; + + #include VECT_COMPARE_S + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m08300_s08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m08300_s16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/nv/m08300_a3.cu b/nv/m08300_a3.cu new file mode 100644 index 0000000000..13694ca50a --- /dev/null +++ b/nv/m08300_a3.cu @@ -0,0 +1,954 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _SHA1_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW2 +#define VECT_SIZE1 +#endif + +#define DGST_R0 3 +#define DGST_R1 4 +#define DGST_R2 2 +#define DGST_R3 1 + +#include "include/kernel_functions.c" +#include "types_nv.c" +#include "common_nv.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +__device__ __constant__ bf_t c_bfs[1024]; + +__device__ static void sha1_transform (const u32x w0[4], const u32x w1[4], const u32x w2[4], const u32x w3[4], u32x digest[5]) +{ + u32x A = digest[0]; + u32x B = digest[1]; + u32x C = digest[2]; + u32x D = digest[3]; + u32x E = digest[4]; + + u32x w0_t = w0[0]; + u32x w1_t = w0[1]; + u32x w2_t = w0[2]; + u32x w3_t = w0[3]; + u32x w4_t = w1[0]; + u32x w5_t = w1[1]; + u32x w6_t = w1[2]; + u32x w7_t = w1[3]; + u32x w8_t = w2[0]; + u32x w9_t = w2[1]; + u32x wa_t = w2[2]; + u32x wb_t = w2[3]; + u32x wc_t = w3[0]; + u32x wd_t = w3[1]; + u32x we_t = w3[2]; + u32x wf_t = w3[3]; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, A, B, C, D, E, w0_t); + SHA1_STEP (SHA1_F0o, E, A, B, C, D, w1_t); + SHA1_STEP (SHA1_F0o, D, E, A, B, C, w2_t); + SHA1_STEP (SHA1_F0o, C, D, E, A, B, w3_t); + SHA1_STEP (SHA1_F0o, B, C, D, E, A, w4_t); + SHA1_STEP (SHA1_F0o, A, B, C, D, E, w5_t); + SHA1_STEP (SHA1_F0o, E, A, B, C, D, w6_t); + SHA1_STEP (SHA1_F0o, D, E, A, B, C, w7_t); + SHA1_STEP (SHA1_F0o, C, D, E, A, B, w8_t); + SHA1_STEP (SHA1_F0o, B, C, D, E, A, w9_t); + SHA1_STEP (SHA1_F0o, A, B, C, D, E, wa_t); + SHA1_STEP (SHA1_F0o, E, A, B, C, D, wb_t); + SHA1_STEP (SHA1_F0o, D, E, A, B, C, wc_t); + SHA1_STEP (SHA1_F0o, C, D, E, A, B, wd_t); + SHA1_STEP (SHA1_F0o, B, C, D, E, A, we_t); + SHA1_STEP (SHA1_F0o, A, B, C, D, E, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F0o, E, A, B, C, D, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F0o, D, E, A, B, C, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F0o, C, D, E, A, B, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F0o, B, C, D, E, A, w3_t); + + #undef K + #define K SHA1C01 + + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w7_t); + + #undef K + #define K SHA1C02 + + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, wb_t); + + #undef K + #define K SHA1C03 + + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, wf_t); + + digest[0] += A; + digest[1] += B; + digest[2] += C; + digest[3] += D; + digest[4] += E; +} + +__device__ static void m08300m (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], const u32 pw_len, const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset) +{ + /** + * modifier + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + const u32 lid = threadIdx.x; + + /** + * salt + */ + + const u32 salt_iter = salt_bufs[salt_pos].salt_iter; + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[ 1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[ 2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[ 3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[ 4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[ 5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[ 6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[ 7]; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + u32 domain_buf0[4]; + + domain_buf0[0] = salt_bufs[salt_pos].salt_buf_pc[ 0]; + domain_buf0[1] = salt_bufs[salt_pos].salt_buf_pc[ 1]; + domain_buf0[2] = salt_bufs[salt_pos].salt_buf_pc[ 2]; + domain_buf0[3] = salt_bufs[salt_pos].salt_buf_pc[ 3]; + + u32 domain_buf1[4]; + + domain_buf1[0] = salt_bufs[salt_pos].salt_buf_pc[ 4]; + domain_buf1[1] = salt_bufs[salt_pos].salt_buf_pc[ 5]; + domain_buf1[2] = salt_bufs[salt_pos].salt_buf_pc[ 6]; + domain_buf1[3] = 0; + + const u32 domain_len = salt_bufs[salt_pos].salt_buf_pc[ 7]; + + /** + * base + */ + + u32 s0[4]; + + s0[0] = salt_buf0[0]; + s0[1] = salt_buf0[1]; + s0[2] = salt_buf0[2]; + s0[3] = salt_buf0[3]; + + u32 s1[4]; + + s1[0] = salt_buf1[0]; + s1[1] = salt_buf1[1]; + s1[2] = salt_buf1[2]; + s1[3] = salt_buf1[3]; + + u32 s2[4]; + + s2[0] = 0; + s2[1] = 0; + s2[2] = 0; + s2[3] = 0; + + u32 s3[4]; + + s3[0] = 0; + s3[1] = 0; + s3[2] = 0; + s3[3] = 0; + + switch_buffer_by_offset (s0, s1, s2, s3, 1 + pw_len + domain_len + 1); + + u32 d0[4]; + + d0[0] = domain_buf0[0]; + d0[1] = domain_buf0[1]; + d0[2] = domain_buf0[2]; + d0[3] = domain_buf0[3]; + + u32 d1[4]; + + d1[0] = domain_buf1[0]; + d1[1] = domain_buf1[1]; + d1[2] = domain_buf1[2]; + d1[3] = 0; + + u32 d2[4]; + + d2[0] = 0; + d2[1] = 0; + d2[2] = 0; + d2[3] = 0; + + u32 d3[4]; + + d3[0] = 0; + d3[1] = 0; + d3[2] = 0; + d3[3] = 0; + + switch_buffer_by_offset (d0, d1, d2, d3, 1 + pw_len); + + /** + * loop + */ + + u32x w0l = w0[0]; + + for (u32 il_pos = 0; il_pos < bfs_cnt; il_pos++) + { + const u32 w0r = c_bfs[il_pos].i; + + w0[0] = w0l | w0r; + + u32x w0_t[4]; + + w0_t[0] = w0[0]; + w0_t[1] = w0[1]; + w0_t[2] = w0[2]; + w0_t[3] = w0[3]; + + u32x w1_t[4]; + + w1_t[0] = w1[0]; + w1_t[1] = w1[1]; + w1_t[2] = w1[2]; + w1_t[3] = w1[3]; + + u32x w2_t[4]; + + w2_t[0] = w2[0]; + w2_t[1] = w2[1]; + w2_t[2] = w2[2]; + w2_t[3] = w2[3]; + + u32x w3_t[4]; + + w3_t[0] = w3[0]; + w3_t[1] = w3[1]; + w3_t[2] = w3[2]; + w3_t[3] = w3[3]; + + switch_buffer_by_offset (w0_t, w1_t, w2_t, w3_t, 1); + + w0_t[0] |= pw_len & 0xff; + + /** + * sha1 + */ + + u32x w0_t2[4]; + + w0_t2[0] = swap_workaround (w0_t[0] | d0[0] | s0[0]); + w0_t2[1] = swap_workaround (w0_t[1] | d0[1] | s0[1]); + w0_t2[2] = swap_workaround (w0_t[2] | d0[2] | s0[2]); + w0_t2[3] = swap_workaround (w0_t[3] | d0[3] | s0[3]); + + u32x w1_t2[4]; + + w1_t2[0] = swap_workaround (w1_t[0] | d1[0] | s1[0]); + w1_t2[1] = swap_workaround (w1_t[1] | d1[1] | s1[1]); + w1_t2[2] = swap_workaround (w1_t[2] | d1[2] | s1[2]); + w1_t2[3] = swap_workaround (w1_t[3] | d1[3] | s1[3]); + + u32x w2_t2[4]; + + w2_t2[0] = swap_workaround (w2_t[0] | d2[0] | s2[0]); + w2_t2[1] = swap_workaround (w2_t[1] | d2[1] | s2[1]); + w2_t2[2] = swap_workaround (w2_t[2] | d2[2] | s2[2]); + w2_t2[3] = swap_workaround (w2_t[3] | d2[3] | s2[3]); + + u32x w3_t2[4]; + + w3_t2[0] = swap_workaround (w3_t[0] | d3[0] | s3[0]); + w3_t2[1] = swap_workaround (w3_t[1] | d3[1] | s3[1]); + w3_t2[2] = 0; + w3_t2[3] = (1 + pw_len + domain_len + 1 + salt_len) * 8; + + u32x digest[5]; + + digest[0] = SHA1M_A; + digest[1] = SHA1M_B; + digest[2] = SHA1M_C; + digest[3] = SHA1M_D; + digest[4] = SHA1M_E; + + sha1_transform (w0_t2, w1_t2, w2_t2, w3_t2, digest); + + // iterations + + for (u32 i = 0; i < salt_iter; i++) + { + u32x w0_t3[4]; + + w0_t3[0] = digest[0]; + w0_t3[1] = digest[1]; + w0_t3[2] = digest[2]; + w0_t3[3] = digest[3]; + + u32x w1_t3[4]; + + w1_t3[0] = digest[4]; + w1_t3[1] = swap_workaround (salt_buf0[0]); + w1_t3[2] = swap_workaround (salt_buf0[1]); + w1_t3[3] = swap_workaround (salt_buf0[2]); + + u32x w2_t3[4]; + + w2_t3[0] = swap_workaround (salt_buf0[3]); + w2_t3[1] = swap_workaround (salt_buf1[0]); + w2_t3[2] = swap_workaround (salt_buf1[1]); + w2_t3[3] = swap_workaround (salt_buf1[2]); + + u32x w3_t3[4]; + + w3_t3[0] = swap_workaround (salt_buf1[3]); + w3_t3[1] = 0; + w3_t3[2] = 0; + w3_t3[3] = (20 + salt_len) * 8; + + digest[0] = SHA1M_A; + digest[1] = SHA1M_B; + digest[2] = SHA1M_C; + digest[3] = SHA1M_D; + digest[4] = SHA1M_E; + + sha1_transform (w0_t3, w1_t3, w2_t3, w3_t3, digest); + } + + const u32x r0 = digest[3]; + const u32x r1 = digest[4]; + const u32x r2 = digest[2]; + const u32x r3 = digest[1]; + + #include VECT_COMPARE_M + } +} + +__device__ static void m08300s (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], const u32 pw_len, const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset) +{ + /** + * modifier + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + const u32 lid = threadIdx.x; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * salt + */ + + const u32 salt_iter = salt_bufs[salt_pos].salt_iter; + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[ 1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[ 2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[ 3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[ 4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[ 5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[ 6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[ 7]; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + u32 domain_buf0[4]; + + domain_buf0[0] = salt_bufs[salt_pos].salt_buf_pc[ 0]; + domain_buf0[1] = salt_bufs[salt_pos].salt_buf_pc[ 1]; + domain_buf0[2] = salt_bufs[salt_pos].salt_buf_pc[ 2]; + domain_buf0[3] = salt_bufs[salt_pos].salt_buf_pc[ 3]; + + u32 domain_buf1[4]; + + domain_buf1[0] = salt_bufs[salt_pos].salt_buf_pc[ 4]; + domain_buf1[1] = salt_bufs[salt_pos].salt_buf_pc[ 5]; + domain_buf1[2] = salt_bufs[salt_pos].salt_buf_pc[ 6]; + domain_buf1[3] = 0; + + const u32 domain_len = salt_bufs[salt_pos].salt_buf_pc[ 7]; + + /** + * base + */ + + u32 s0[4]; + + s0[0] = salt_buf0[0]; + s0[1] = salt_buf0[1]; + s0[2] = salt_buf0[2]; + s0[3] = salt_buf0[3]; + + u32 s1[4]; + + s1[0] = salt_buf1[0]; + s1[1] = salt_buf1[1]; + s1[2] = salt_buf1[2]; + s1[3] = salt_buf1[3]; + + u32 s2[4]; + + s2[0] = 0; + s2[1] = 0; + s2[2] = 0; + s2[3] = 0; + + u32 s3[4]; + + s3[0] = 0; + s3[1] = 0; + s3[2] = 0; + s3[3] = 0; + + switch_buffer_by_offset (s0, s1, s2, s3, 1 + pw_len + domain_len + 1); + + u32 d0[4]; + + d0[0] = domain_buf0[0]; + d0[1] = domain_buf0[1]; + d0[2] = domain_buf0[2]; + d0[3] = domain_buf0[3]; + + u32 d1[4]; + + d1[0] = domain_buf1[0]; + d1[1] = domain_buf1[1]; + d1[2] = domain_buf1[2]; + d1[3] = 0; + + u32 d2[4]; + + d2[0] = 0; + d2[1] = 0; + d2[2] = 0; + d2[3] = 0; + + u32 d3[4]; + + d3[0] = 0; + d3[1] = 0; + d3[2] = 0; + d3[3] = 0; + + switch_buffer_by_offset (d0, d1, d2, d3, 1 + pw_len); + + /** + * loop + */ + + u32x w0l = w0[0]; + + for (u32 il_pos = 0; il_pos < bfs_cnt; il_pos++) + { + const u32 w0r = c_bfs[il_pos].i; + + w0[0] = w0l | w0r; + + u32x w0_t[4]; + + w0_t[0] = w0[0]; + w0_t[1] = w0[1]; + w0_t[2] = w0[2]; + w0_t[3] = w0[3]; + + u32x w1_t[4]; + + w1_t[0] = w1[0]; + w1_t[1] = w1[1]; + w1_t[2] = w1[2]; + w1_t[3] = w1[3]; + + u32x w2_t[4]; + + w2_t[0] = w2[0]; + w2_t[1] = w2[1]; + w2_t[2] = w2[2]; + w2_t[3] = w2[3]; + + u32x w3_t[4]; + + w3_t[0] = w3[0]; + w3_t[1] = w3[1]; + w3_t[2] = w3[2]; + w3_t[3] = w3[3]; + + switch_buffer_by_offset (w0_t, w1_t, w2_t, w3_t, 1); + + w0_t[0] |= pw_len & 0xff; + + /** + * sha1 + */ + + u32x w0_t2[4]; + + w0_t2[0] = swap_workaround (w0_t[0] | d0[0] | s0[0]); + w0_t2[1] = swap_workaround (w0_t[1] | d0[1] | s0[1]); + w0_t2[2] = swap_workaround (w0_t[2] | d0[2] | s0[2]); + w0_t2[3] = swap_workaround (w0_t[3] | d0[3] | s0[3]); + + u32x w1_t2[4]; + + w1_t2[0] = swap_workaround (w1_t[0] | d1[0] | s1[0]); + w1_t2[1] = swap_workaround (w1_t[1] | d1[1] | s1[1]); + w1_t2[2] = swap_workaround (w1_t[2] | d1[2] | s1[2]); + w1_t2[3] = swap_workaround (w1_t[3] | d1[3] | s1[3]); + + u32x w2_t2[4]; + + w2_t2[0] = swap_workaround (w2_t[0] | d2[0] | s2[0]); + w2_t2[1] = swap_workaround (w2_t[1] | d2[1] | s2[1]); + w2_t2[2] = swap_workaround (w2_t[2] | d2[2] | s2[2]); + w2_t2[3] = swap_workaround (w2_t[3] | d2[3] | s2[3]); + + u32x w3_t2[4]; + + w3_t2[0] = swap_workaround (w3_t[0] | d3[0] | s3[0]); + w3_t2[1] = swap_workaround (w3_t[1] | d3[1] | s3[1]); + w3_t2[2] = 0; + w3_t2[3] = (1 + pw_len + domain_len + 1 + salt_len) * 8; + + u32x digest[5]; + + digest[0] = SHA1M_A; + digest[1] = SHA1M_B; + digest[2] = SHA1M_C; + digest[3] = SHA1M_D; + digest[4] = SHA1M_E; + + sha1_transform (w0_t2, w1_t2, w2_t2, w3_t2, digest); + + // iterations + + for (u32 i = 0; i < salt_iter; i++) + { + u32x w0_t3[4]; + + w0_t3[0] = digest[0]; + w0_t3[1] = digest[1]; + w0_t3[2] = digest[2]; + w0_t3[3] = digest[3]; + + u32x w1_t3[4]; + + w1_t3[0] = digest[4]; + w1_t3[1] = swap_workaround (salt_buf0[0]); + w1_t3[2] = swap_workaround (salt_buf0[1]); + w1_t3[3] = swap_workaround (salt_buf0[2]); + + u32x w2_t3[4]; + + w2_t3[0] = swap_workaround (salt_buf0[3]); + w2_t3[1] = swap_workaround (salt_buf1[0]); + w2_t3[2] = swap_workaround (salt_buf1[1]); + w2_t3[3] = swap_workaround (salt_buf1[2]); + + u32x w3_t3[4]; + + w3_t3[0] = swap_workaround (salt_buf1[3]); + w3_t3[1] = 0; + w3_t3[2] = 0; + w3_t3[3] = (20 + salt_len) * 8; + + digest[0] = SHA1M_A; + digest[1] = SHA1M_B; + digest[2] = SHA1M_C; + digest[3] = SHA1M_D; + digest[4] = SHA1M_E; + + sha1_transform (w0_t3, w1_t3, w2_t3, w3_t3, digest); + } + + const u32x r0 = digest[3]; + const u32x r1 = digest[4]; + const u32x r2 = digest[2]; + const u32x r3 = digest[1]; + + #include VECT_COMPARE_S + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m08300_m04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m08300m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m08300_m08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m08300m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m08300_m16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = pws[gid].i[ 8]; + w2[1] = pws[gid].i[ 9]; + w2[2] = pws[gid].i[10]; + w2[3] = pws[gid].i[11]; + + u32x w3[4]; + + w3[0] = pws[gid].i[12]; + w3[1] = pws[gid].i[13]; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m08300m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m08300_s04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m08300s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m08300_s08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m08300s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m08300_s16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = pws[gid].i[ 8]; + w2[1] = pws[gid].i[ 9]; + w2[2] = pws[gid].i[10]; + w2[3] = pws[gid].i[11]; + + u32x w3[4]; + + w3[0] = pws[gid].i[12]; + w3[1] = pws[gid].i[13]; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m08300s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} diff --git a/nv/m08400_a0.cu b/nv/m08400_a0.cu new file mode 100644 index 0000000000..a328a9902a --- /dev/null +++ b/nv/m08400_a0.cu @@ -0,0 +1,766 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _SHA1_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW2 +#define VECT_SIZE1 +#endif + +#define DGST_R0 3 +#define DGST_R1 4 +#define DGST_R2 2 +#define DGST_R3 1 + +#include "include/kernel_functions.c" +#include "types_nv.c" +#include "common_nv.c" +#include "include/rp_gpu.h" +#include "rp_nv.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE1 +#define uint_to_hex_lower8_le(i) l_bin2asc[(i)] +#endif + +#ifdef VECT_SIZE2 +#define uint_to_hex_lower8_le(i) u32x (l_bin2asc[(i).x], l_bin2asc[(i).y]) +#endif + +__device__ __constant__ char c_bin2asc[16] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' }; + +__device__ __shared__ short l_bin2asc[256]; + +__device__ __constant__ gpu_rule_t c_rules[1024]; + +__device__ static void sha1_transform (const u32x w0[4], const u32x w1[4], const u32x w2[4], const u32x w3[4], u32x digest[5]) +{ + u32x A = digest[0]; + u32x B = digest[1]; + u32x C = digest[2]; + u32x D = digest[3]; + u32x E = digest[4]; + + u32x w0_t = w0[0]; + u32x w1_t = w0[1]; + u32x w2_t = w0[2]; + u32x w3_t = w0[3]; + u32x w4_t = w1[0]; + u32x w5_t = w1[1]; + u32x w6_t = w1[2]; + u32x w7_t = w1[3]; + u32x w8_t = w2[0]; + u32x w9_t = w2[1]; + u32x wa_t = w2[2]; + u32x wb_t = w2[3]; + u32x wc_t = w3[0]; + u32x wd_t = w3[1]; + u32x we_t = w3[2]; + u32x wf_t = w3[3]; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, A, B, C, D, E, w0_t); + SHA1_STEP (SHA1_F0o, E, A, B, C, D, w1_t); + SHA1_STEP (SHA1_F0o, D, E, A, B, C, w2_t); + SHA1_STEP (SHA1_F0o, C, D, E, A, B, w3_t); + SHA1_STEP (SHA1_F0o, B, C, D, E, A, w4_t); + SHA1_STEP (SHA1_F0o, A, B, C, D, E, w5_t); + SHA1_STEP (SHA1_F0o, E, A, B, C, D, w6_t); + SHA1_STEP (SHA1_F0o, D, E, A, B, C, w7_t); + SHA1_STEP (SHA1_F0o, C, D, E, A, B, w8_t); + SHA1_STEP (SHA1_F0o, B, C, D, E, A, w9_t); + SHA1_STEP (SHA1_F0o, A, B, C, D, E, wa_t); + SHA1_STEP (SHA1_F0o, E, A, B, C, D, wb_t); + SHA1_STEP (SHA1_F0o, D, E, A, B, C, wc_t); + SHA1_STEP (SHA1_F0o, C, D, E, A, B, wd_t); + SHA1_STEP (SHA1_F0o, B, C, D, E, A, we_t); + SHA1_STEP (SHA1_F0o, A, B, C, D, E, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F0o, E, A, B, C, D, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F0o, D, E, A, B, C, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F0o, C, D, E, A, B, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F0o, B, C, D, E, A, w3_t); + + #undef K + #define K SHA1C01 + + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w7_t); + + #undef K + #define K SHA1C02 + + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, wb_t); + + #undef K + #define K SHA1C03 + + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, wf_t); + + digest[0] += A; + digest[1] += B; + digest[2] += C; + digest[3] += D; + digest[4] += E; +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m08400_m04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + u32x pw_buf1[4]; + + pw_buf1[0] = pws[gid].i[ 4]; + pw_buf1[1] = pws[gid].i[ 5]; + pw_buf1[2] = pws[gid].i[ 6]; + pw_buf1[3] = pws[gid].i[ 7]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * bin2asc table + */ + + l_bin2asc[lid] = c_bin2asc[(lid >> 0) & 15] << 0 + | c_bin2asc[(lid >> 4) & 15] << 8; + + __syncthreads (); + + if (gid >= gid_max) return; + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = swap_workaround (salt_bufs[salt_pos].salt_buf[ 0]); + salt_buf0[1] = swap_workaround (salt_bufs[salt_pos].salt_buf[ 1]); + salt_buf0[2] = swap_workaround (salt_bufs[salt_pos].salt_buf[ 2]); + salt_buf0[3] = swap_workaround (salt_bufs[salt_pos].salt_buf[ 3]); + + u32 salt_buf1[4]; + + salt_buf1[0] = swap_workaround (salt_bufs[salt_pos].salt_buf[ 4]); + salt_buf1[1] = swap_workaround (salt_bufs[salt_pos].salt_buf[ 5]); + salt_buf1[2] = swap_workaround (salt_bufs[salt_pos].salt_buf[ 6]); + salt_buf1[3] = swap_workaround (salt_bufs[salt_pos].salt_buf[ 7]); + + u32 salt_buf2[4]; + + salt_buf2[0] = swap_workaround (salt_bufs[salt_pos].salt_buf[ 8]); + salt_buf2[1] = swap_workaround (salt_bufs[salt_pos].salt_buf[ 9]); + salt_buf2[2] = 0; + salt_buf2[3] = 0; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + + w0[0] = pw_buf0[0]; + w0[1] = pw_buf0[1]; + w0[2] = pw_buf0[2]; + w0[3] = pw_buf0[3]; + + u32x w1[4]; + + w1[0] = pw_buf1[0]; + w1[1] = pw_buf1[1]; + w1[2] = pw_buf1[2]; + w1[3] = pw_buf1[3]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 out_len = apply_rules (c_rules[il_pos].cmds, w0, w1, pw_len); + + append_0x80_2 (w0, w1, out_len); + + u32x w0_t[4]; + + w0_t[0] = swap_workaround (w0[0]); + w0_t[1] = swap_workaround (w0[1]); + w0_t[2] = swap_workaround (w0[2]); + w0_t[3] = swap_workaround (w0[3]); + + u32x w1_t[4]; + + w1_t[0] = swap_workaround (w1[0]); + w1_t[1] = swap_workaround (w1[1]); + w1_t[2] = swap_workaround (w1[2]); + w1_t[3] = swap_workaround (w1[3]); + + u32x w2_t[4]; + + w2_t[0] = swap_workaround (w2[0]); + w2_t[1] = swap_workaround (w2[1]); + w2_t[2] = swap_workaround (w2[2]); + w2_t[3] = swap_workaround (w2[3]); + + u32x w3_t[4]; + + w3_t[0] = swap_workaround (w3[0]); + w3_t[1] = swap_workaround (w3[1]); + w3_t[2] = 0; + w3_t[3] = pw_len * 8; + + u32x digest[5]; + + digest[0] = SHA1M_A; + digest[1] = SHA1M_B; + digest[2] = SHA1M_C; + digest[3] = SHA1M_D; + digest[4] = SHA1M_E; + + sha1_transform (w0_t, w1_t, w2_t, w3_t, digest); + + u32x a; + u32x b; + u32x c; + u32x d; + u32x e; + + a = digest[0]; + b = digest[1]; + c = digest[2]; + d = digest[3]; + e = digest[4]; + + w0_t[0] = salt_buf0[0]; + w0_t[1] = salt_buf0[1]; + w0_t[2] = salt_buf0[2]; + w0_t[3] = salt_buf0[3]; + w1_t[0] = salt_buf1[0]; + w1_t[1] = salt_buf1[1]; + w1_t[2] = salt_buf1[2]; + w1_t[3] = salt_buf1[3]; + w2_t[0] = salt_buf2[0]; + w2_t[1] = salt_buf2[1]; + w2_t[2] = uint_to_hex_lower8_le ((a >> 16) & 255) << 0 + | uint_to_hex_lower8_le ((a >> 24) & 255) << 16; + w2_t[3] = uint_to_hex_lower8_le ((a >> 0) & 255) << 0 + | uint_to_hex_lower8_le ((a >> 8) & 255) << 16; + w3_t[0] = uint_to_hex_lower8_le ((b >> 16) & 255) << 0 + | uint_to_hex_lower8_le ((b >> 24) & 255) << 16; + w3_t[1] = uint_to_hex_lower8_le ((b >> 0) & 255) << 0 + | uint_to_hex_lower8_le ((b >> 8) & 255) << 16; + w3_t[2] = uint_to_hex_lower8_le ((c >> 16) & 255) << 0 + | uint_to_hex_lower8_le ((c >> 24) & 255) << 16; + w3_t[3] = uint_to_hex_lower8_le ((c >> 0) & 255) << 0 + | uint_to_hex_lower8_le ((c >> 8) & 255) << 16; + + digest[0] = SHA1M_A; + digest[1] = SHA1M_B; + digest[2] = SHA1M_C; + digest[3] = SHA1M_D; + digest[4] = SHA1M_E; + + sha1_transform (w0_t, w1_t, w2_t, w3_t, digest); + + w0_t[0] = uint_to_hex_lower8_le ((d >> 16) & 255) << 0 + | uint_to_hex_lower8_le ((d >> 24) & 255) << 16; + w0_t[1] = uint_to_hex_lower8_le ((d >> 0) & 255) << 0 + | uint_to_hex_lower8_le ((d >> 8) & 255) << 16; + w0_t[2] = uint_to_hex_lower8_le ((e >> 16) & 255) << 0 + | uint_to_hex_lower8_le ((e >> 24) & 255) << 16; + w0_t[3] = uint_to_hex_lower8_le ((e >> 0) & 255) << 0 + | uint_to_hex_lower8_le ((e >> 8) & 255) << 16; + w1_t[0] = 0x80000000; + w1_t[1] = 0; + w1_t[2] = 0; + w1_t[3] = 0; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = (salt_len + 40) * 8; + + sha1_transform (w0_t, w1_t, w2_t, w3_t, digest); + + a = digest[0]; + b = digest[1]; + c = digest[2]; + d = digest[3]; + e = digest[4]; + + w0_t[0] = salt_buf0[0]; + w0_t[1] = salt_buf0[1]; + w0_t[2] = salt_buf0[2]; + w0_t[3] = salt_buf0[3]; + w1_t[0] = salt_buf1[0]; + w1_t[1] = salt_buf1[1]; + w1_t[2] = salt_buf1[2]; + w1_t[3] = salt_buf1[3]; + w2_t[0] = salt_buf2[0]; + w2_t[1] = salt_buf2[1]; + w2_t[2] = uint_to_hex_lower8_le ((a >> 16) & 255) << 0 + | uint_to_hex_lower8_le ((a >> 24) & 255) << 16; + w2_t[3] = uint_to_hex_lower8_le ((a >> 0) & 255) << 0 + | uint_to_hex_lower8_le ((a >> 8) & 255) << 16; + w3_t[0] = uint_to_hex_lower8_le ((b >> 16) & 255) << 0 + | uint_to_hex_lower8_le ((b >> 24) & 255) << 16; + w3_t[1] = uint_to_hex_lower8_le ((b >> 0) & 255) << 0 + | uint_to_hex_lower8_le ((b >> 8) & 255) << 16; + w3_t[2] = uint_to_hex_lower8_le ((c >> 16) & 255) << 0 + | uint_to_hex_lower8_le ((c >> 24) & 255) << 16; + w3_t[3] = uint_to_hex_lower8_le ((c >> 0) & 255) << 0 + | uint_to_hex_lower8_le ((c >> 8) & 255) << 16; + + digest[0] = SHA1M_A; + digest[1] = SHA1M_B; + digest[2] = SHA1M_C; + digest[3] = SHA1M_D; + digest[4] = SHA1M_E; + + sha1_transform (w0_t, w1_t, w2_t, w3_t, digest); + + w0_t[0] = uint_to_hex_lower8_le ((d >> 16) & 255) << 0 + | uint_to_hex_lower8_le ((d >> 24) & 255) << 16; + w0_t[1] = uint_to_hex_lower8_le ((d >> 0) & 255) << 0 + | uint_to_hex_lower8_le ((d >> 8) & 255) << 16; + w0_t[2] = uint_to_hex_lower8_le ((e >> 16) & 255) << 0 + | uint_to_hex_lower8_le ((e >> 24) & 255) << 16; + w0_t[3] = uint_to_hex_lower8_le ((e >> 0) & 255) << 0 + | uint_to_hex_lower8_le ((e >> 8) & 255) << 16; + w1_t[0] = 0x80000000; + w1_t[1] = 0; + w1_t[2] = 0; + w1_t[3] = 0; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = (salt_len + 40) * 8; + + sha1_transform (w0_t, w1_t, w2_t, w3_t, digest); + + const u32x r0 = digest[3]; + const u32x r1 = digest[4]; + const u32x r2 = digest[2]; + const u32x r3 = digest[1]; + + #include VECT_COMPARE_M + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m08400_m08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m08400_m16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m08400_s04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + u32x pw_buf1[4]; + + pw_buf1[0] = pws[gid].i[ 4]; + pw_buf1[1] = pws[gid].i[ 5]; + pw_buf1[2] = pws[gid].i[ 6]; + pw_buf1[3] = pws[gid].i[ 7]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * bin2asc table + */ + + l_bin2asc[lid] = c_bin2asc[(lid >> 0) & 15] << 0 + | c_bin2asc[(lid >> 4) & 15] << 8; + + __syncthreads (); + + if (gid >= gid_max) return; + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = swap_workaround (salt_bufs[salt_pos].salt_buf[ 0]); + salt_buf0[1] = swap_workaround (salt_bufs[salt_pos].salt_buf[ 1]); + salt_buf0[2] = swap_workaround (salt_bufs[salt_pos].salt_buf[ 2]); + salt_buf0[3] = swap_workaround (salt_bufs[salt_pos].salt_buf[ 3]); + + u32 salt_buf1[4]; + + salt_buf1[0] = swap_workaround (salt_bufs[salt_pos].salt_buf[ 4]); + salt_buf1[1] = swap_workaround (salt_bufs[salt_pos].salt_buf[ 5]); + salt_buf1[2] = swap_workaround (salt_bufs[salt_pos].salt_buf[ 6]); + salt_buf1[3] = swap_workaround (salt_bufs[salt_pos].salt_buf[ 7]); + + u32 salt_buf2[4]; + + salt_buf2[0] = swap_workaround (salt_bufs[salt_pos].salt_buf[ 8]); + salt_buf2[1] = swap_workaround (salt_bufs[salt_pos].salt_buf[ 9]); + salt_buf2[2] = 0; + salt_buf2[3] = 0; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + + w0[0] = pw_buf0[0]; + w0[1] = pw_buf0[1]; + w0[2] = pw_buf0[2]; + w0[3] = pw_buf0[3]; + + u32x w1[4]; + + w1[0] = pw_buf1[0]; + w1[1] = pw_buf1[1]; + w1[2] = pw_buf1[2]; + w1[3] = pw_buf1[3]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 out_len = apply_rules (c_rules[il_pos].cmds, w0, w1, pw_len); + + append_0x80_2 (w0, w1, out_len); + + u32x w0_t[4]; + + w0_t[0] = swap_workaround (w0[0]); + w0_t[1] = swap_workaround (w0[1]); + w0_t[2] = swap_workaround (w0[2]); + w0_t[3] = swap_workaround (w0[3]); + + u32x w1_t[4]; + + w1_t[0] = swap_workaround (w1[0]); + w1_t[1] = swap_workaround (w1[1]); + w1_t[2] = swap_workaround (w1[2]); + w1_t[3] = swap_workaround (w1[3]); + + u32x w2_t[4]; + + w2_t[0] = swap_workaround (w2[0]); + w2_t[1] = swap_workaround (w2[1]); + w2_t[2] = swap_workaround (w2[2]); + w2_t[3] = swap_workaround (w2[3]); + + u32x w3_t[4]; + + w3_t[0] = swap_workaround (w3[0]); + w3_t[1] = swap_workaround (w3[1]); + w3_t[2] = 0; + w3_t[3] = pw_len * 8; + + u32x digest[5]; + + digest[0] = SHA1M_A; + digest[1] = SHA1M_B; + digest[2] = SHA1M_C; + digest[3] = SHA1M_D; + digest[4] = SHA1M_E; + + sha1_transform (w0_t, w1_t, w2_t, w3_t, digest); + + u32x a; + u32x b; + u32x c; + u32x d; + u32x e; + + a = digest[0]; + b = digest[1]; + c = digest[2]; + d = digest[3]; + e = digest[4]; + + w0_t[0] = salt_buf0[0]; + w0_t[1] = salt_buf0[1]; + w0_t[2] = salt_buf0[2]; + w0_t[3] = salt_buf0[3]; + w1_t[0] = salt_buf1[0]; + w1_t[1] = salt_buf1[1]; + w1_t[2] = salt_buf1[2]; + w1_t[3] = salt_buf1[3]; + w2_t[0] = salt_buf2[0]; + w2_t[1] = salt_buf2[1]; + w2_t[2] = uint_to_hex_lower8_le ((a >> 16) & 255) << 0 + | uint_to_hex_lower8_le ((a >> 24) & 255) << 16; + w2_t[3] = uint_to_hex_lower8_le ((a >> 0) & 255) << 0 + | uint_to_hex_lower8_le ((a >> 8) & 255) << 16; + w3_t[0] = uint_to_hex_lower8_le ((b >> 16) & 255) << 0 + | uint_to_hex_lower8_le ((b >> 24) & 255) << 16; + w3_t[1] = uint_to_hex_lower8_le ((b >> 0) & 255) << 0 + | uint_to_hex_lower8_le ((b >> 8) & 255) << 16; + w3_t[2] = uint_to_hex_lower8_le ((c >> 16) & 255) << 0 + | uint_to_hex_lower8_le ((c >> 24) & 255) << 16; + w3_t[3] = uint_to_hex_lower8_le ((c >> 0) & 255) << 0 + | uint_to_hex_lower8_le ((c >> 8) & 255) << 16; + + digest[0] = SHA1M_A; + digest[1] = SHA1M_B; + digest[2] = SHA1M_C; + digest[3] = SHA1M_D; + digest[4] = SHA1M_E; + + sha1_transform (w0_t, w1_t, w2_t, w3_t, digest); + + w0_t[0] = uint_to_hex_lower8_le ((d >> 16) & 255) << 0 + | uint_to_hex_lower8_le ((d >> 24) & 255) << 16; + w0_t[1] = uint_to_hex_lower8_le ((d >> 0) & 255) << 0 + | uint_to_hex_lower8_le ((d >> 8) & 255) << 16; + w0_t[2] = uint_to_hex_lower8_le ((e >> 16) & 255) << 0 + | uint_to_hex_lower8_le ((e >> 24) & 255) << 16; + w0_t[3] = uint_to_hex_lower8_le ((e >> 0) & 255) << 0 + | uint_to_hex_lower8_le ((e >> 8) & 255) << 16; + w1_t[0] = 0x80000000; + w1_t[1] = 0; + w1_t[2] = 0; + w1_t[3] = 0; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = 80 * 8; + + sha1_transform (w0_t, w1_t, w2_t, w3_t, digest); + + a = digest[0]; + b = digest[1]; + c = digest[2]; + d = digest[3]; + e = digest[4]; + + w0_t[0] = salt_buf0[0]; + w0_t[1] = salt_buf0[1]; + w0_t[2] = salt_buf0[2]; + w0_t[3] = salt_buf0[3]; + w1_t[0] = salt_buf1[0]; + w1_t[1] = salt_buf1[1]; + w1_t[2] = salt_buf1[2]; + w1_t[3] = salt_buf1[3]; + w2_t[0] = salt_buf2[0]; + w2_t[1] = salt_buf2[1]; + w2_t[2] = uint_to_hex_lower8_le ((a >> 16) & 255) << 0 + | uint_to_hex_lower8_le ((a >> 24) & 255) << 16; + w2_t[3] = uint_to_hex_lower8_le ((a >> 0) & 255) << 0 + | uint_to_hex_lower8_le ((a >> 8) & 255) << 16; + w3_t[0] = uint_to_hex_lower8_le ((b >> 16) & 255) << 0 + | uint_to_hex_lower8_le ((b >> 24) & 255) << 16; + w3_t[1] = uint_to_hex_lower8_le ((b >> 0) & 255) << 0 + | uint_to_hex_lower8_le ((b >> 8) & 255) << 16; + w3_t[2] = uint_to_hex_lower8_le ((c >> 16) & 255) << 0 + | uint_to_hex_lower8_le ((c >> 24) & 255) << 16; + w3_t[3] = uint_to_hex_lower8_le ((c >> 0) & 255) << 0 + | uint_to_hex_lower8_le ((c >> 8) & 255) << 16; + + digest[0] = SHA1M_A; + digest[1] = SHA1M_B; + digest[2] = SHA1M_C; + digest[3] = SHA1M_D; + digest[4] = SHA1M_E; + + sha1_transform (w0_t, w1_t, w2_t, w3_t, digest); + + w0_t[0] = uint_to_hex_lower8_le ((d >> 16) & 255) << 0 + | uint_to_hex_lower8_le ((d >> 24) & 255) << 16; + w0_t[1] = uint_to_hex_lower8_le ((d >> 0) & 255) << 0 + | uint_to_hex_lower8_le ((d >> 8) & 255) << 16; + w0_t[2] = uint_to_hex_lower8_le ((e >> 16) & 255) << 0 + | uint_to_hex_lower8_le ((e >> 24) & 255) << 16; + w0_t[3] = uint_to_hex_lower8_le ((e >> 0) & 255) << 0 + | uint_to_hex_lower8_le ((e >> 8) & 255) << 16; + w1_t[0] = 0x80000000; + w1_t[1] = 0; + w1_t[2] = 0; + w1_t[3] = 0; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = 80 * 8; + + sha1_transform (w0_t, w1_t, w2_t, w3_t, digest); + + const u32x r0 = digest[3]; + const u32x r1 = digest[4]; + const u32x r2 = digest[2]; + const u32x r3 = digest[1]; + + #include VECT_COMPARE_S + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m08400_s08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m08400_s16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/nv/m08400_a1.cu b/nv/m08400_a1.cu new file mode 100644 index 0000000000..68e5704e1d --- /dev/null +++ b/nv/m08400_a1.cu @@ -0,0 +1,876 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _SHA1_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW2 +#define VECT_SIZE1 +#endif + +#define DGST_R0 3 +#define DGST_R1 4 +#define DGST_R2 2 +#define DGST_R3 1 + +#include "include/kernel_functions.c" +#include "types_nv.c" +#include "common_nv.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE1 +#define uint_to_hex_lower8_le(i) l_bin2asc[(i)] +#endif + +#ifdef VECT_SIZE2 +#define uint_to_hex_lower8_le(i) u32x (l_bin2asc[(i).x], l_bin2asc[(i).y]) +#endif + +__device__ __constant__ char c_bin2asc[16] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' }; + +__device__ __shared__ short l_bin2asc[256]; + +__device__ __constant__ comb_t c_combs[1024]; + +__device__ static void sha1_transform (const u32x w0[4], const u32x w1[4], const u32x w2[4], const u32x w3[4], u32x digest[5]) +{ + u32x A = digest[0]; + u32x B = digest[1]; + u32x C = digest[2]; + u32x D = digest[3]; + u32x E = digest[4]; + + u32x w0_t = w0[0]; + u32x w1_t = w0[1]; + u32x w2_t = w0[2]; + u32x w3_t = w0[3]; + u32x w4_t = w1[0]; + u32x w5_t = w1[1]; + u32x w6_t = w1[2]; + u32x w7_t = w1[3]; + u32x w8_t = w2[0]; + u32x w9_t = w2[1]; + u32x wa_t = w2[2]; + u32x wb_t = w2[3]; + u32x wc_t = w3[0]; + u32x wd_t = w3[1]; + u32x we_t = w3[2]; + u32x wf_t = w3[3]; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, A, B, C, D, E, w0_t); + SHA1_STEP (SHA1_F0o, E, A, B, C, D, w1_t); + SHA1_STEP (SHA1_F0o, D, E, A, B, C, w2_t); + SHA1_STEP (SHA1_F0o, C, D, E, A, B, w3_t); + SHA1_STEP (SHA1_F0o, B, C, D, E, A, w4_t); + SHA1_STEP (SHA1_F0o, A, B, C, D, E, w5_t); + SHA1_STEP (SHA1_F0o, E, A, B, C, D, w6_t); + SHA1_STEP (SHA1_F0o, D, E, A, B, C, w7_t); + SHA1_STEP (SHA1_F0o, C, D, E, A, B, w8_t); + SHA1_STEP (SHA1_F0o, B, C, D, E, A, w9_t); + SHA1_STEP (SHA1_F0o, A, B, C, D, E, wa_t); + SHA1_STEP (SHA1_F0o, E, A, B, C, D, wb_t); + SHA1_STEP (SHA1_F0o, D, E, A, B, C, wc_t); + SHA1_STEP (SHA1_F0o, C, D, E, A, B, wd_t); + SHA1_STEP (SHA1_F0o, B, C, D, E, A, we_t); + SHA1_STEP (SHA1_F0o, A, B, C, D, E, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F0o, E, A, B, C, D, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F0o, D, E, A, B, C, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F0o, C, D, E, A, B, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F0o, B, C, D, E, A, w3_t); + + #undef K + #define K SHA1C01 + + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w7_t); + + #undef K + #define K SHA1C02 + + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, wb_t); + + #undef K + #define K SHA1C03 + + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, wf_t); + + digest[0] += A; + digest[1] += B; + digest[2] += C; + digest[3] += D; + digest[4] += E; +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m08400_m04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + append_0x80_2 (wordl0, wordl1, pw_l_len); + + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, c_combs[0].pw_len); + } + + /** + * bin2asc table + */ + + l_bin2asc[lid] = c_bin2asc[(lid >> 0) & 15] << 0 + | c_bin2asc[(lid >> 4) & 15] << 8; + + __syncthreads (); + + if (gid >= gid_max) return; + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = swap_workaround (salt_bufs[salt_pos].salt_buf[ 0]); + salt_buf0[1] = swap_workaround (salt_bufs[salt_pos].salt_buf[ 1]); + salt_buf0[2] = swap_workaround (salt_bufs[salt_pos].salt_buf[ 2]); + salt_buf0[3] = swap_workaround (salt_bufs[salt_pos].salt_buf[ 3]); + + u32 salt_buf1[4]; + + salt_buf1[0] = swap_workaround (salt_bufs[salt_pos].salt_buf[ 4]); + salt_buf1[1] = swap_workaround (salt_bufs[salt_pos].salt_buf[ 5]); + salt_buf1[2] = swap_workaround (salt_bufs[salt_pos].salt_buf[ 6]); + salt_buf1[3] = swap_workaround (salt_bufs[salt_pos].salt_buf[ 7]); + + u32 salt_buf2[4]; + + salt_buf2[0] = swap_workaround (salt_bufs[salt_pos].salt_buf[ 8]); + salt_buf2[1] = swap_workaround (salt_bufs[salt_pos].salt_buf[ 9]); + salt_buf2[2] = 0; + salt_buf2[3] = 0; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = c_combs[il_pos].pw_len; + + const u32 pw_len = pw_l_len + pw_r_len; + + u32 wordr0[4]; + + wordr0[0] = c_combs[il_pos].i[0]; + wordr0[1] = c_combs[il_pos].i[1]; + wordr0[2] = c_combs[il_pos].i[2]; + wordr0[3] = c_combs[il_pos].i[3]; + + u32 wordr1[4]; + + wordr1[0] = c_combs[il_pos].i[4]; + wordr1[1] = c_combs[il_pos].i[5]; + wordr1[2] = c_combs[il_pos].i[6]; + wordr1[3] = c_combs[il_pos].i[7]; + + u32 wordr2[4]; + + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + + u32 wordr3[4]; + + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + append_0x80_2 (wordr0, wordr1, pw_r_len); + + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + u32x w0[4]; + + w0[0] = wordl0[0] | wordr0[0]; + w0[1] = wordl0[1] | wordr0[1]; + w0[2] = wordl0[2] | wordr0[2]; + w0[3] = wordl0[3] | wordr0[3]; + + u32x w1[4]; + + w1[0] = wordl1[0] | wordr1[0]; + w1[1] = wordl1[1] | wordr1[1]; + w1[2] = wordl1[2] | wordr1[2]; + w1[3] = wordl1[3] | wordr1[3]; + + u32x w2[4]; + + w2[0] = wordl2[0] | wordr2[0]; + w2[1] = wordl2[1] | wordr2[1]; + w2[2] = wordl2[2] | wordr2[2]; + w2[3] = wordl2[3] | wordr2[3]; + + u32x w3[4]; + + w3[0] = wordl3[0] | wordr3[0]; + w3[1] = wordl3[1] | wordr3[1]; + w3[2] = 0; + w3[3] = 0; + + u32x w0_t[4]; + + w0_t[0] = swap_workaround (w0[0]); + w0_t[1] = swap_workaround (w0[1]); + w0_t[2] = swap_workaround (w0[2]); + w0_t[3] = swap_workaround (w0[3]); + + u32x w1_t[4]; + + w1_t[0] = swap_workaround (w1[0]); + w1_t[1] = swap_workaround (w1[1]); + w1_t[2] = swap_workaround (w1[2]); + w1_t[3] = swap_workaround (w1[3]); + + u32x w2_t[4]; + + w2_t[0] = swap_workaround (w2[0]); + w2_t[1] = swap_workaround (w2[1]); + w2_t[2] = swap_workaround (w2[2]); + w2_t[3] = swap_workaround (w2[3]); + + u32x w3_t[4]; + + w3_t[0] = swap_workaround (w3[0]); + w3_t[1] = swap_workaround (w3[1]); + w3_t[2] = 0; + w3_t[3] = pw_len * 8; + + u32x digest[5]; + + digest[0] = SHA1M_A; + digest[1] = SHA1M_B; + digest[2] = SHA1M_C; + digest[3] = SHA1M_D; + digest[4] = SHA1M_E; + + sha1_transform (w0_t, w1_t, w2_t, w3_t, digest); + + u32x a; + u32x b; + u32x c; + u32x d; + u32x e; + + a = digest[0]; + b = digest[1]; + c = digest[2]; + d = digest[3]; + e = digest[4]; + + w0_t[0] = salt_buf0[0]; + w0_t[1] = salt_buf0[1]; + w0_t[2] = salt_buf0[2]; + w0_t[3] = salt_buf0[3]; + w1_t[0] = salt_buf1[0]; + w1_t[1] = salt_buf1[1]; + w1_t[2] = salt_buf1[2]; + w1_t[3] = salt_buf1[3]; + w2_t[0] = salt_buf2[0]; + w2_t[1] = salt_buf2[1]; + w2_t[2] = uint_to_hex_lower8_le ((a >> 16) & 255) << 0 + | uint_to_hex_lower8_le ((a >> 24) & 255) << 16; + w2_t[3] = uint_to_hex_lower8_le ((a >> 0) & 255) << 0 + | uint_to_hex_lower8_le ((a >> 8) & 255) << 16; + w3_t[0] = uint_to_hex_lower8_le ((b >> 16) & 255) << 0 + | uint_to_hex_lower8_le ((b >> 24) & 255) << 16; + w3_t[1] = uint_to_hex_lower8_le ((b >> 0) & 255) << 0 + | uint_to_hex_lower8_le ((b >> 8) & 255) << 16; + w3_t[2] = uint_to_hex_lower8_le ((c >> 16) & 255) << 0 + | uint_to_hex_lower8_le ((c >> 24) & 255) << 16; + w3_t[3] = uint_to_hex_lower8_le ((c >> 0) & 255) << 0 + | uint_to_hex_lower8_le ((c >> 8) & 255) << 16; + + digest[0] = SHA1M_A; + digest[1] = SHA1M_B; + digest[2] = SHA1M_C; + digest[3] = SHA1M_D; + digest[4] = SHA1M_E; + + sha1_transform (w0_t, w1_t, w2_t, w3_t, digest); + + w0_t[0] = uint_to_hex_lower8_le ((d >> 16) & 255) << 0 + | uint_to_hex_lower8_le ((d >> 24) & 255) << 16; + w0_t[1] = uint_to_hex_lower8_le ((d >> 0) & 255) << 0 + | uint_to_hex_lower8_le ((d >> 8) & 255) << 16; + w0_t[2] = uint_to_hex_lower8_le ((e >> 16) & 255) << 0 + | uint_to_hex_lower8_le ((e >> 24) & 255) << 16; + w0_t[3] = uint_to_hex_lower8_le ((e >> 0) & 255) << 0 + | uint_to_hex_lower8_le ((e >> 8) & 255) << 16; + w1_t[0] = 0x80000000; + w1_t[1] = 0; + w1_t[2] = 0; + w1_t[3] = 0; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = 80 * 8; + + sha1_transform (w0_t, w1_t, w2_t, w3_t, digest); + + a = digest[0]; + b = digest[1]; + c = digest[2]; + d = digest[3]; + e = digest[4]; + + w0_t[0] = salt_buf0[0]; + w0_t[1] = salt_buf0[1]; + w0_t[2] = salt_buf0[2]; + w0_t[3] = salt_buf0[3]; + w1_t[0] = salt_buf1[0]; + w1_t[1] = salt_buf1[1]; + w1_t[2] = salt_buf1[2]; + w1_t[3] = salt_buf1[3]; + w2_t[0] = salt_buf2[0]; + w2_t[1] = salt_buf2[1]; + w2_t[2] = uint_to_hex_lower8_le ((a >> 16) & 255) << 0 + | uint_to_hex_lower8_le ((a >> 24) & 255) << 16; + w2_t[3] = uint_to_hex_lower8_le ((a >> 0) & 255) << 0 + | uint_to_hex_lower8_le ((a >> 8) & 255) << 16; + w3_t[0] = uint_to_hex_lower8_le ((b >> 16) & 255) << 0 + | uint_to_hex_lower8_le ((b >> 24) & 255) << 16; + w3_t[1] = uint_to_hex_lower8_le ((b >> 0) & 255) << 0 + | uint_to_hex_lower8_le ((b >> 8) & 255) << 16; + w3_t[2] = uint_to_hex_lower8_le ((c >> 16) & 255) << 0 + | uint_to_hex_lower8_le ((c >> 24) & 255) << 16; + w3_t[3] = uint_to_hex_lower8_le ((c >> 0) & 255) << 0 + | uint_to_hex_lower8_le ((c >> 8) & 255) << 16; + + digest[0] = SHA1M_A; + digest[1] = SHA1M_B; + digest[2] = SHA1M_C; + digest[3] = SHA1M_D; + digest[4] = SHA1M_E; + + sha1_transform (w0_t, w1_t, w2_t, w3_t, digest); + + w0_t[0] = uint_to_hex_lower8_le ((d >> 16) & 255) << 0 + | uint_to_hex_lower8_le ((d >> 24) & 255) << 16; + w0_t[1] = uint_to_hex_lower8_le ((d >> 0) & 255) << 0 + | uint_to_hex_lower8_le ((d >> 8) & 255) << 16; + w0_t[2] = uint_to_hex_lower8_le ((e >> 16) & 255) << 0 + | uint_to_hex_lower8_le ((e >> 24) & 255) << 16; + w0_t[3] = uint_to_hex_lower8_le ((e >> 0) & 255) << 0 + | uint_to_hex_lower8_le ((e >> 8) & 255) << 16; + w1_t[0] = 0x80000000; + w1_t[1] = 0; + w1_t[2] = 0; + w1_t[3] = 0; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = 80 * 8; + + sha1_transform (w0_t, w1_t, w2_t, w3_t, digest); + + const u32x r0 = digest[3]; + const u32x r1 = digest[4]; + const u32x r2 = digest[2]; + const u32x r3 = digest[1]; + + #include VECT_COMPARE_M + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m08400_m08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m08400_m16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m08400_s04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + append_0x80_2 (wordl0, wordl1, pw_l_len); + + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, c_combs[0].pw_len); + } + + /** + * bin2asc table + */ + + l_bin2asc[lid] = c_bin2asc[(lid >> 0) & 15] << 0 + | c_bin2asc[(lid >> 4) & 15] << 8; + + __syncthreads (); + + if (gid >= gid_max) return; + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = swap_workaround (salt_bufs[salt_pos].salt_buf[ 0]); + salt_buf0[1] = swap_workaround (salt_bufs[salt_pos].salt_buf[ 1]); + salt_buf0[2] = swap_workaround (salt_bufs[salt_pos].salt_buf[ 2]); + salt_buf0[3] = swap_workaround (salt_bufs[salt_pos].salt_buf[ 3]); + + u32 salt_buf1[4]; + + salt_buf1[0] = swap_workaround (salt_bufs[salt_pos].salt_buf[ 4]); + salt_buf1[1] = swap_workaround (salt_bufs[salt_pos].salt_buf[ 5]); + salt_buf1[2] = swap_workaround (salt_bufs[salt_pos].salt_buf[ 6]); + salt_buf1[3] = swap_workaround (salt_bufs[salt_pos].salt_buf[ 7]); + + u32 salt_buf2[4]; + + salt_buf2[0] = swap_workaround (salt_bufs[salt_pos].salt_buf[ 8]); + salt_buf2[1] = swap_workaround (salt_bufs[salt_pos].salt_buf[ 9]); + salt_buf2[2] = 0; + salt_buf2[3] = 0; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = c_combs[il_pos].pw_len; + + const u32 pw_len = pw_l_len + pw_r_len; + + u32 wordr0[4]; + + wordr0[0] = c_combs[il_pos].i[0]; + wordr0[1] = c_combs[il_pos].i[1]; + wordr0[2] = c_combs[il_pos].i[2]; + wordr0[3] = c_combs[il_pos].i[3]; + + u32 wordr1[4]; + + wordr1[0] = c_combs[il_pos].i[4]; + wordr1[1] = c_combs[il_pos].i[5]; + wordr1[2] = c_combs[il_pos].i[6]; + wordr1[3] = c_combs[il_pos].i[7]; + + u32 wordr2[4]; + + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + + u32 wordr3[4]; + + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + append_0x80_2 (wordr0, wordr1, pw_r_len); + + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + u32x w0[4]; + + w0[0] = wordl0[0] | wordr0[0]; + w0[1] = wordl0[1] | wordr0[1]; + w0[2] = wordl0[2] | wordr0[2]; + w0[3] = wordl0[3] | wordr0[3]; + + u32x w1[4]; + + w1[0] = wordl1[0] | wordr1[0]; + w1[1] = wordl1[1] | wordr1[1]; + w1[2] = wordl1[2] | wordr1[2]; + w1[3] = wordl1[3] | wordr1[3]; + + u32x w2[4]; + + w2[0] = wordl2[0] | wordr2[0]; + w2[1] = wordl2[1] | wordr2[1]; + w2[2] = wordl2[2] | wordr2[2]; + w2[3] = wordl2[3] | wordr2[3]; + + u32x w3[4]; + + w3[0] = wordl3[0] | wordr3[0]; + w3[1] = wordl3[1] | wordr3[1]; + w3[2] = 0; + w3[3] = 0; + + u32x w0_t[4]; + + w0_t[0] = swap_workaround (w0[0]); + w0_t[1] = swap_workaround (w0[1]); + w0_t[2] = swap_workaround (w0[2]); + w0_t[3] = swap_workaround (w0[3]); + + u32x w1_t[4]; + + w1_t[0] = swap_workaround (w1[0]); + w1_t[1] = swap_workaround (w1[1]); + w1_t[2] = swap_workaround (w1[2]); + w1_t[3] = swap_workaround (w1[3]); + + u32x w2_t[4]; + + w2_t[0] = swap_workaround (w2[0]); + w2_t[1] = swap_workaround (w2[1]); + w2_t[2] = swap_workaround (w2[2]); + w2_t[3] = swap_workaround (w2[3]); + + u32x w3_t[4]; + + w3_t[0] = swap_workaround (w3[0]); + w3_t[1] = swap_workaround (w3[1]); + w3_t[2] = 0; + w3_t[3] = pw_len * 8; + + u32x digest[5]; + + digest[0] = SHA1M_A; + digest[1] = SHA1M_B; + digest[2] = SHA1M_C; + digest[3] = SHA1M_D; + digest[4] = SHA1M_E; + + sha1_transform (w0_t, w1_t, w2_t, w3_t, digest); + + u32x a; + u32x b; + u32x c; + u32x d; + u32x e; + + a = digest[0]; + b = digest[1]; + c = digest[2]; + d = digest[3]; + e = digest[4]; + + w0_t[0] = salt_buf0[0]; + w0_t[1] = salt_buf0[1]; + w0_t[2] = salt_buf0[2]; + w0_t[3] = salt_buf0[3]; + w1_t[0] = salt_buf1[0]; + w1_t[1] = salt_buf1[1]; + w1_t[2] = salt_buf1[2]; + w1_t[3] = salt_buf1[3]; + w2_t[0] = salt_buf2[0]; + w2_t[1] = salt_buf2[1]; + w2_t[2] = uint_to_hex_lower8_le ((a >> 16) & 255) << 0 + | uint_to_hex_lower8_le ((a >> 24) & 255) << 16; + w2_t[3] = uint_to_hex_lower8_le ((a >> 0) & 255) << 0 + | uint_to_hex_lower8_le ((a >> 8) & 255) << 16; + w3_t[0] = uint_to_hex_lower8_le ((b >> 16) & 255) << 0 + | uint_to_hex_lower8_le ((b >> 24) & 255) << 16; + w3_t[1] = uint_to_hex_lower8_le ((b >> 0) & 255) << 0 + | uint_to_hex_lower8_le ((b >> 8) & 255) << 16; + w3_t[2] = uint_to_hex_lower8_le ((c >> 16) & 255) << 0 + | uint_to_hex_lower8_le ((c >> 24) & 255) << 16; + w3_t[3] = uint_to_hex_lower8_le ((c >> 0) & 255) << 0 + | uint_to_hex_lower8_le ((c >> 8) & 255) << 16; + + digest[0] = SHA1M_A; + digest[1] = SHA1M_B; + digest[2] = SHA1M_C; + digest[3] = SHA1M_D; + digest[4] = SHA1M_E; + + sha1_transform (w0_t, w1_t, w2_t, w3_t, digest); + + w0_t[0] = uint_to_hex_lower8_le ((d >> 16) & 255) << 0 + | uint_to_hex_lower8_le ((d >> 24) & 255) << 16; + w0_t[1] = uint_to_hex_lower8_le ((d >> 0) & 255) << 0 + | uint_to_hex_lower8_le ((d >> 8) & 255) << 16; + w0_t[2] = uint_to_hex_lower8_le ((e >> 16) & 255) << 0 + | uint_to_hex_lower8_le ((e >> 24) & 255) << 16; + w0_t[3] = uint_to_hex_lower8_le ((e >> 0) & 255) << 0 + | uint_to_hex_lower8_le ((e >> 8) & 255) << 16; + w1_t[0] = 0x80000000; + w1_t[1] = 0; + w1_t[2] = 0; + w1_t[3] = 0; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = (salt_len + 40) * 8; + + sha1_transform (w0_t, w1_t, w2_t, w3_t, digest); + + a = digest[0]; + b = digest[1]; + c = digest[2]; + d = digest[3]; + e = digest[4]; + + w0_t[0] = salt_buf0[0]; + w0_t[1] = salt_buf0[1]; + w0_t[2] = salt_buf0[2]; + w0_t[3] = salt_buf0[3]; + w1_t[0] = salt_buf1[0]; + w1_t[1] = salt_buf1[1]; + w1_t[2] = salt_buf1[2]; + w1_t[3] = salt_buf1[3]; + w2_t[0] = salt_buf2[0]; + w2_t[1] = salt_buf2[1]; + w2_t[2] = uint_to_hex_lower8_le ((a >> 16) & 255) << 0 + | uint_to_hex_lower8_le ((a >> 24) & 255) << 16; + w2_t[3] = uint_to_hex_lower8_le ((a >> 0) & 255) << 0 + | uint_to_hex_lower8_le ((a >> 8) & 255) << 16; + w3_t[0] = uint_to_hex_lower8_le ((b >> 16) & 255) << 0 + | uint_to_hex_lower8_le ((b >> 24) & 255) << 16; + w3_t[1] = uint_to_hex_lower8_le ((b >> 0) & 255) << 0 + | uint_to_hex_lower8_le ((b >> 8) & 255) << 16; + w3_t[2] = uint_to_hex_lower8_le ((c >> 16) & 255) << 0 + | uint_to_hex_lower8_le ((c >> 24) & 255) << 16; + w3_t[3] = uint_to_hex_lower8_le ((c >> 0) & 255) << 0 + | uint_to_hex_lower8_le ((c >> 8) & 255) << 16; + + digest[0] = SHA1M_A; + digest[1] = SHA1M_B; + digest[2] = SHA1M_C; + digest[3] = SHA1M_D; + digest[4] = SHA1M_E; + + sha1_transform (w0_t, w1_t, w2_t, w3_t, digest); + + w0_t[0] = uint_to_hex_lower8_le ((d >> 16) & 255) << 0 + | uint_to_hex_lower8_le ((d >> 24) & 255) << 16; + w0_t[1] = uint_to_hex_lower8_le ((d >> 0) & 255) << 0 + | uint_to_hex_lower8_le ((d >> 8) & 255) << 16; + w0_t[2] = uint_to_hex_lower8_le ((e >> 16) & 255) << 0 + | uint_to_hex_lower8_le ((e >> 24) & 255) << 16; + w0_t[3] = uint_to_hex_lower8_le ((e >> 0) & 255) << 0 + | uint_to_hex_lower8_le ((e >> 8) & 255) << 16; + w1_t[0] = 0x80000000; + w1_t[1] = 0; + w1_t[2] = 0; + w1_t[3] = 0; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = (salt_len + 40) * 8; + + sha1_transform (w0_t, w1_t, w2_t, w3_t, digest); + + const u32x r0 = digest[3]; + const u32x r1 = digest[4]; + const u32x r2 = digest[2]; + const u32x r3 = digest[1]; + + #include VECT_COMPARE_S + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m08400_s08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m08400_s16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/nv/m08400_a3.cu b/nv/m08400_a3.cu new file mode 100644 index 0000000000..6b104d13ae --- /dev/null +++ b/nv/m08400_a3.cu @@ -0,0 +1,1013 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _SHA1_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW2 +#define VECT_SIZE1 +#endif + +#define DGST_R0 3 +#define DGST_R1 4 +#define DGST_R2 2 +#define DGST_R3 1 + +#include "include/kernel_functions.c" +#include "types_nv.c" +#include "common_nv.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE1 +#define uint_to_hex_lower8_le(i) l_bin2asc[(i)] +#endif + +#ifdef VECT_SIZE2 +#define uint_to_hex_lower8_le(i) u32x (l_bin2asc[(i).x], l_bin2asc[(i).y]) +#endif + +__device__ __constant__ char c_bin2asc[16] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' }; + +__device__ __shared__ short l_bin2asc[256]; + +__device__ __constant__ bf_t c_bfs[1024]; + +__device__ static void sha1_transform (const u32x w0[4], const u32x w1[4], const u32x w2[4], const u32x w3[4], u32x digest[5]) +{ + u32x A = digest[0]; + u32x B = digest[1]; + u32x C = digest[2]; + u32x D = digest[3]; + u32x E = digest[4]; + + u32x w0_t = w0[0]; + u32x w1_t = w0[1]; + u32x w2_t = w0[2]; + u32x w3_t = w0[3]; + u32x w4_t = w1[0]; + u32x w5_t = w1[1]; + u32x w6_t = w1[2]; + u32x w7_t = w1[3]; + u32x w8_t = w2[0]; + u32x w9_t = w2[1]; + u32x wa_t = w2[2]; + u32x wb_t = w2[3]; + u32x wc_t = w3[0]; + u32x wd_t = w3[1]; + u32x we_t = w3[2]; + u32x wf_t = w3[3]; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, A, B, C, D, E, w0_t); + SHA1_STEP (SHA1_F0o, E, A, B, C, D, w1_t); + SHA1_STEP (SHA1_F0o, D, E, A, B, C, w2_t); + SHA1_STEP (SHA1_F0o, C, D, E, A, B, w3_t); + SHA1_STEP (SHA1_F0o, B, C, D, E, A, w4_t); + SHA1_STEP (SHA1_F0o, A, B, C, D, E, w5_t); + SHA1_STEP (SHA1_F0o, E, A, B, C, D, w6_t); + SHA1_STEP (SHA1_F0o, D, E, A, B, C, w7_t); + SHA1_STEP (SHA1_F0o, C, D, E, A, B, w8_t); + SHA1_STEP (SHA1_F0o, B, C, D, E, A, w9_t); + SHA1_STEP (SHA1_F0o, A, B, C, D, E, wa_t); + SHA1_STEP (SHA1_F0o, E, A, B, C, D, wb_t); + SHA1_STEP (SHA1_F0o, D, E, A, B, C, wc_t); + SHA1_STEP (SHA1_F0o, C, D, E, A, B, wd_t); + SHA1_STEP (SHA1_F0o, B, C, D, E, A, we_t); + SHA1_STEP (SHA1_F0o, A, B, C, D, E, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F0o, E, A, B, C, D, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F0o, D, E, A, B, C, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F0o, C, D, E, A, B, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F0o, B, C, D, E, A, w3_t); + + #undef K + #define K SHA1C01 + + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w7_t); + + #undef K + #define K SHA1C02 + + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, wb_t); + + #undef K + #define K SHA1C03 + + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, wf_t); + + digest[0] += A; + digest[1] += B; + digest[2] += C; + digest[3] += D; + digest[4] += E; +} + +__device__ static void m08400m (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], const u32 pw_len, const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset) +{ + /** + * modifier + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + const u32 lid = threadIdx.x; + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = swap_workaround (salt_bufs[salt_pos].salt_buf[ 0]); + salt_buf0[1] = swap_workaround (salt_bufs[salt_pos].salt_buf[ 1]); + salt_buf0[2] = swap_workaround (salt_bufs[salt_pos].salt_buf[ 2]); + salt_buf0[3] = swap_workaround (salt_bufs[salt_pos].salt_buf[ 3]); + + u32 salt_buf1[4]; + + salt_buf1[0] = swap_workaround (salt_bufs[salt_pos].salt_buf[ 4]); + salt_buf1[1] = swap_workaround (salt_bufs[salt_pos].salt_buf[ 5]); + salt_buf1[2] = swap_workaround (salt_bufs[salt_pos].salt_buf[ 6]); + salt_buf1[3] = swap_workaround (salt_bufs[salt_pos].salt_buf[ 7]); + + u32 salt_buf2[4]; + + salt_buf2[0] = swap_workaround (salt_bufs[salt_pos].salt_buf[ 8]); + salt_buf2[1] = swap_workaround (salt_bufs[salt_pos].salt_buf[ 9]); + salt_buf2[2] = 0; + salt_buf2[3] = 0; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + /** + * loop + */ + + u32x w0l = w0[0]; + + for (u32 il_pos = 0; il_pos < bfs_cnt; il_pos++) + { + const u32 w0r = c_bfs[il_pos].i; + + w0[0] = w0l | w0r; + + /** + * sha1 + */ + + u32x w0_t[4]; + + w0_t[0] = w0[0]; + w0_t[1] = w0[1]; + w0_t[2] = w0[2]; + w0_t[3] = w0[3]; + + u32x w1_t[4]; + + w1_t[0] = w1[0]; + w1_t[1] = w1[1]; + w1_t[2] = w1[2]; + w1_t[3] = w1[3]; + + u32x w2_t[4]; + + w2_t[0] = w2[0]; + w2_t[1] = w2[1]; + w2_t[2] = w2[2]; + w2_t[3] = w2[3]; + + u32x w3_t[4]; + + w3_t[0] = w3[0]; + w3_t[1] = w3[1]; + w3_t[2] = 0; + w3_t[3] = pw_len * 8; + + u32x digest[5]; + + digest[0] = SHA1M_A; + digest[1] = SHA1M_B; + digest[2] = SHA1M_C; + digest[3] = SHA1M_D; + digest[4] = SHA1M_E; + + sha1_transform (w0_t, w1_t, w2_t, w3_t, digest); + + u32x a; + u32x b; + u32x c; + u32x d; + u32x e; + + a = digest[0]; + b = digest[1]; + c = digest[2]; + d = digest[3]; + e = digest[4]; + + w0_t[0] = salt_buf0[0]; + w0_t[1] = salt_buf0[1]; + w0_t[2] = salt_buf0[2]; + w0_t[3] = salt_buf0[3]; + w1_t[0] = salt_buf1[0]; + w1_t[1] = salt_buf1[1]; + w1_t[2] = salt_buf1[2]; + w1_t[3] = salt_buf1[3]; + w2_t[0] = salt_buf2[0]; + w2_t[1] = salt_buf2[1]; + w2_t[2] = uint_to_hex_lower8_le ((a >> 16) & 255) << 0 + | uint_to_hex_lower8_le ((a >> 24) & 255) << 16; + w2_t[3] = uint_to_hex_lower8_le ((a >> 0) & 255) << 0 + | uint_to_hex_lower8_le ((a >> 8) & 255) << 16; + w3_t[0] = uint_to_hex_lower8_le ((b >> 16) & 255) << 0 + | uint_to_hex_lower8_le ((b >> 24) & 255) << 16; + w3_t[1] = uint_to_hex_lower8_le ((b >> 0) & 255) << 0 + | uint_to_hex_lower8_le ((b >> 8) & 255) << 16; + w3_t[2] = uint_to_hex_lower8_le ((c >> 16) & 255) << 0 + | uint_to_hex_lower8_le ((c >> 24) & 255) << 16; + w3_t[3] = uint_to_hex_lower8_le ((c >> 0) & 255) << 0 + | uint_to_hex_lower8_le ((c >> 8) & 255) << 16; + + digest[0] = SHA1M_A; + digest[1] = SHA1M_B; + digest[2] = SHA1M_C; + digest[3] = SHA1M_D; + digest[4] = SHA1M_E; + + sha1_transform (w0_t, w1_t, w2_t, w3_t, digest); + + w0_t[0] = uint_to_hex_lower8_le ((d >> 16) & 255) << 0 + | uint_to_hex_lower8_le ((d >> 24) & 255) << 16; + w0_t[1] = uint_to_hex_lower8_le ((d >> 0) & 255) << 0 + | uint_to_hex_lower8_le ((d >> 8) & 255) << 16; + w0_t[2] = uint_to_hex_lower8_le ((e >> 16) & 255) << 0 + | uint_to_hex_lower8_le ((e >> 24) & 255) << 16; + w0_t[3] = uint_to_hex_lower8_le ((e >> 0) & 255) << 0 + | uint_to_hex_lower8_le ((e >> 8) & 255) << 16; + w1_t[0] = 0x80000000; + w1_t[1] = 0; + w1_t[2] = 0; + w1_t[3] = 0; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = 80 * 8; + + sha1_transform (w0_t, w1_t, w2_t, w3_t, digest); + + a = digest[0]; + b = digest[1]; + c = digest[2]; + d = digest[3]; + e = digest[4]; + + w0_t[0] = salt_buf0[0]; + w0_t[1] = salt_buf0[1]; + w0_t[2] = salt_buf0[2]; + w0_t[3] = salt_buf0[3]; + w1_t[0] = salt_buf1[0]; + w1_t[1] = salt_buf1[1]; + w1_t[2] = salt_buf1[2]; + w1_t[3] = salt_buf1[3]; + w2_t[0] = salt_buf2[0]; + w2_t[1] = salt_buf2[1]; + w2_t[2] = uint_to_hex_lower8_le ((a >> 16) & 255) << 0 + | uint_to_hex_lower8_le ((a >> 24) & 255) << 16; + w2_t[3] = uint_to_hex_lower8_le ((a >> 0) & 255) << 0 + | uint_to_hex_lower8_le ((a >> 8) & 255) << 16; + w3_t[0] = uint_to_hex_lower8_le ((b >> 16) & 255) << 0 + | uint_to_hex_lower8_le ((b >> 24) & 255) << 16; + w3_t[1] = uint_to_hex_lower8_le ((b >> 0) & 255) << 0 + | uint_to_hex_lower8_le ((b >> 8) & 255) << 16; + w3_t[2] = uint_to_hex_lower8_le ((c >> 16) & 255) << 0 + | uint_to_hex_lower8_le ((c >> 24) & 255) << 16; + w3_t[3] = uint_to_hex_lower8_le ((c >> 0) & 255) << 0 + | uint_to_hex_lower8_le ((c >> 8) & 255) << 16; + + digest[0] = SHA1M_A; + digest[1] = SHA1M_B; + digest[2] = SHA1M_C; + digest[3] = SHA1M_D; + digest[4] = SHA1M_E; + + sha1_transform (w0_t, w1_t, w2_t, w3_t, digest); + + w0_t[0] = uint_to_hex_lower8_le ((d >> 16) & 255) << 0 + | uint_to_hex_lower8_le ((d >> 24) & 255) << 16; + w0_t[1] = uint_to_hex_lower8_le ((d >> 0) & 255) << 0 + | uint_to_hex_lower8_le ((d >> 8) & 255) << 16; + w0_t[2] = uint_to_hex_lower8_le ((e >> 16) & 255) << 0 + | uint_to_hex_lower8_le ((e >> 24) & 255) << 16; + w0_t[3] = uint_to_hex_lower8_le ((e >> 0) & 255) << 0 + | uint_to_hex_lower8_le ((e >> 8) & 255) << 16; + w1_t[0] = 0x80000000; + w1_t[1] = 0; + w1_t[2] = 0; + w1_t[3] = 0; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = (salt_len + 40) * 8; + + sha1_transform (w0_t, w1_t, w2_t, w3_t, digest); + + const u32x r0 = digest[3]; + const u32x r1 = digest[4]; + const u32x r2 = digest[2]; + const u32x r3 = digest[1]; + + #include VECT_COMPARE_M + } +} + +__device__ static void m08400s (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], const u32 pw_len, const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset) +{ + /** + * modifier + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + const u32 lid = threadIdx.x; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = swap_workaround (salt_bufs[salt_pos].salt_buf[ 0]); + salt_buf0[1] = swap_workaround (salt_bufs[salt_pos].salt_buf[ 1]); + salt_buf0[2] = swap_workaround (salt_bufs[salt_pos].salt_buf[ 2]); + salt_buf0[3] = swap_workaround (salt_bufs[salt_pos].salt_buf[ 3]); + + u32 salt_buf1[4]; + + salt_buf1[0] = swap_workaround (salt_bufs[salt_pos].salt_buf[ 4]); + salt_buf1[1] = swap_workaround (salt_bufs[salt_pos].salt_buf[ 5]); + salt_buf1[2] = swap_workaround (salt_bufs[salt_pos].salt_buf[ 6]); + salt_buf1[3] = swap_workaround (salt_bufs[salt_pos].salt_buf[ 7]); + + u32 salt_buf2[4]; + + salt_buf2[0] = swap_workaround (salt_bufs[salt_pos].salt_buf[ 8]); + salt_buf2[1] = swap_workaround (salt_bufs[salt_pos].salt_buf[ 9]); + salt_buf2[2] = 0; + salt_buf2[3] = 0; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + /** + * loop + */ + + u32x w0l = w0[0]; + + for (u32 il_pos = 0; il_pos < bfs_cnt; il_pos++) + { + const u32 w0r = c_bfs[il_pos].i; + + w0[0] = w0l | w0r; + + /** + * sha1 + */ + + u32x w0_t[4]; + + w0_t[0] = w0[0]; + w0_t[1] = w0[1]; + w0_t[2] = w0[2]; + w0_t[3] = w0[3]; + + u32x w1_t[4]; + + w1_t[0] = w1[0]; + w1_t[1] = w1[1]; + w1_t[2] = w1[2]; + w1_t[3] = w1[3]; + + u32x w2_t[4]; + + w2_t[0] = w2[0]; + w2_t[1] = w2[1]; + w2_t[2] = w2[2]; + w2_t[3] = w2[3]; + + u32x w3_t[4]; + + w3_t[0] = w3[0]; + w3_t[1] = w3[1]; + w3_t[2] = 0; + w3_t[3] = pw_len * 8; + + u32x digest[5]; + + digest[0] = SHA1M_A; + digest[1] = SHA1M_B; + digest[2] = SHA1M_C; + digest[3] = SHA1M_D; + digest[4] = SHA1M_E; + + sha1_transform (w0_t, w1_t, w2_t, w3_t, digest); + + u32x a; + u32x b; + u32x c; + u32x d; + u32x e; + + a = digest[0]; + b = digest[1]; + c = digest[2]; + d = digest[3]; + e = digest[4]; + + w0_t[0] = salt_buf0[0]; + w0_t[1] = salt_buf0[1]; + w0_t[2] = salt_buf0[2]; + w0_t[3] = salt_buf0[3]; + w1_t[0] = salt_buf1[0]; + w1_t[1] = salt_buf1[1]; + w1_t[2] = salt_buf1[2]; + w1_t[3] = salt_buf1[3]; + w2_t[0] = salt_buf2[0]; + w2_t[1] = salt_buf2[1]; + w2_t[2] = uint_to_hex_lower8_le ((a >> 16) & 255) << 0 + | uint_to_hex_lower8_le ((a >> 24) & 255) << 16; + w2_t[3] = uint_to_hex_lower8_le ((a >> 0) & 255) << 0 + | uint_to_hex_lower8_le ((a >> 8) & 255) << 16; + w3_t[0] = uint_to_hex_lower8_le ((b >> 16) & 255) << 0 + | uint_to_hex_lower8_le ((b >> 24) & 255) << 16; + w3_t[1] = uint_to_hex_lower8_le ((b >> 0) & 255) << 0 + | uint_to_hex_lower8_le ((b >> 8) & 255) << 16; + w3_t[2] = uint_to_hex_lower8_le ((c >> 16) & 255) << 0 + | uint_to_hex_lower8_le ((c >> 24) & 255) << 16; + w3_t[3] = uint_to_hex_lower8_le ((c >> 0) & 255) << 0 + | uint_to_hex_lower8_le ((c >> 8) & 255) << 16; + + digest[0] = SHA1M_A; + digest[1] = SHA1M_B; + digest[2] = SHA1M_C; + digest[3] = SHA1M_D; + digest[4] = SHA1M_E; + + sha1_transform (w0_t, w1_t, w2_t, w3_t, digest); + + w0_t[0] = uint_to_hex_lower8_le ((d >> 16) & 255) << 0 + | uint_to_hex_lower8_le ((d >> 24) & 255) << 16; + w0_t[1] = uint_to_hex_lower8_le ((d >> 0) & 255) << 0 + | uint_to_hex_lower8_le ((d >> 8) & 255) << 16; + w0_t[2] = uint_to_hex_lower8_le ((e >> 16) & 255) << 0 + | uint_to_hex_lower8_le ((e >> 24) & 255) << 16; + w0_t[3] = uint_to_hex_lower8_le ((e >> 0) & 255) << 0 + | uint_to_hex_lower8_le ((e >> 8) & 255) << 16; + w1_t[0] = 0x80000000; + w1_t[1] = 0; + w1_t[2] = 0; + w1_t[3] = 0; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = (salt_len + 40) * 8; + + sha1_transform (w0_t, w1_t, w2_t, w3_t, digest); + + a = digest[0]; + b = digest[1]; + c = digest[2]; + d = digest[3]; + e = digest[4]; + + w0_t[0] = salt_buf0[0]; + w0_t[1] = salt_buf0[1]; + w0_t[2] = salt_buf0[2]; + w0_t[3] = salt_buf0[3]; + w1_t[0] = salt_buf1[0]; + w1_t[1] = salt_buf1[1]; + w1_t[2] = salt_buf1[2]; + w1_t[3] = salt_buf1[3]; + w2_t[0] = salt_buf2[0]; + w2_t[1] = salt_buf2[1]; + w2_t[2] = uint_to_hex_lower8_le ((a >> 16) & 255) << 0 + | uint_to_hex_lower8_le ((a >> 24) & 255) << 16; + w2_t[3] = uint_to_hex_lower8_le ((a >> 0) & 255) << 0 + | uint_to_hex_lower8_le ((a >> 8) & 255) << 16; + w3_t[0] = uint_to_hex_lower8_le ((b >> 16) & 255) << 0 + | uint_to_hex_lower8_le ((b >> 24) & 255) << 16; + w3_t[1] = uint_to_hex_lower8_le ((b >> 0) & 255) << 0 + | uint_to_hex_lower8_le ((b >> 8) & 255) << 16; + w3_t[2] = uint_to_hex_lower8_le ((c >> 16) & 255) << 0 + | uint_to_hex_lower8_le ((c >> 24) & 255) << 16; + w3_t[3] = uint_to_hex_lower8_le ((c >> 0) & 255) << 0 + | uint_to_hex_lower8_le ((c >> 8) & 255) << 16; + + digest[0] = SHA1M_A; + digest[1] = SHA1M_B; + digest[2] = SHA1M_C; + digest[3] = SHA1M_D; + digest[4] = SHA1M_E; + + sha1_transform (w0_t, w1_t, w2_t, w3_t, digest); + + w0_t[0] = uint_to_hex_lower8_le ((d >> 16) & 255) << 0 + | uint_to_hex_lower8_le ((d >> 24) & 255) << 16; + w0_t[1] = uint_to_hex_lower8_le ((d >> 0) & 255) << 0 + | uint_to_hex_lower8_le ((d >> 8) & 255) << 16; + w0_t[2] = uint_to_hex_lower8_le ((e >> 16) & 255) << 0 + | uint_to_hex_lower8_le ((e >> 24) & 255) << 16; + w0_t[3] = uint_to_hex_lower8_le ((e >> 0) & 255) << 0 + | uint_to_hex_lower8_le ((e >> 8) & 255) << 16; + w1_t[0] = 0x80000000; + w1_t[1] = 0; + w1_t[2] = 0; + w1_t[3] = 0; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = (salt_len + 40) * 8; + + sha1_transform (w0_t, w1_t, w2_t, w3_t, digest); + + const u32x r0 = digest[3]; + const u32x r1 = digest[4]; + const u32x r2 = digest[2]; + const u32x r3 = digest[1]; + + #include VECT_COMPARE_S + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m08400_m04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = pws[gid].i[15]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * bin2asc table + */ + + l_bin2asc[lid] = c_bin2asc[(lid >> 0) & 15] << 0 + | c_bin2asc[(lid >> 4) & 15] << 8; + + __syncthreads (); + + if (gid >= gid_max) return; + + /** + * main + */ + + m08400m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m08400_m08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = pws[gid].i[15]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * bin2asc table + */ + + l_bin2asc[lid] = c_bin2asc[(lid >> 0) & 15] << 0 + | c_bin2asc[(lid >> 4) & 15] << 8; + + __syncthreads (); + + if (gid >= gid_max) return; + + /** + * main + */ + + m08400m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m08400_m16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = pws[gid].i[ 8]; + w2[1] = pws[gid].i[ 9]; + w2[2] = pws[gid].i[10]; + w2[3] = pws[gid].i[11]; + + u32x w3[4]; + + w3[0] = pws[gid].i[12]; + w3[1] = pws[gid].i[13]; + w3[2] = pws[gid].i[14]; + w3[3] = pws[gid].i[15]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * bin2asc table + */ + + l_bin2asc[lid] = c_bin2asc[(lid >> 0) & 15] << 0 + | c_bin2asc[(lid >> 4) & 15] << 8; + + __syncthreads (); + + if (gid >= gid_max) return; + + /** + * main + */ + + m08400m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m08400_s04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = pws[gid].i[15]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * bin2asc table + */ + + l_bin2asc[lid] = c_bin2asc[(lid >> 0) & 15] << 0 + | c_bin2asc[(lid >> 4) & 15] << 8; + + __syncthreads (); + + if (gid >= gid_max) return; + + /** + * main + */ + + m08400s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m08400_s08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = pws[gid].i[15]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * bin2asc table + */ + + l_bin2asc[lid] = c_bin2asc[(lid >> 0) & 15] << 0 + | c_bin2asc[(lid >> 4) & 15] << 8; + + __syncthreads (); + + if (gid >= gid_max) return; + + /** + * main + */ + + m08400s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m08400_s16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = pws[gid].i[ 8]; + w2[1] = pws[gid].i[ 9]; + w2[2] = pws[gid].i[10]; + w2[3] = pws[gid].i[11]; + + u32x w3[4]; + + w3[0] = pws[gid].i[12]; + w3[1] = pws[gid].i[13]; + w3[2] = pws[gid].i[14]; + w3[3] = pws[gid].i[15]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * bin2asc table + */ + + l_bin2asc[lid] = c_bin2asc[(lid >> 0) & 15] << 0 + | c_bin2asc[(lid >> 4) & 15] << 8; + + __syncthreads (); + + if (gid >= gid_max) return; + + /** + * main + */ + + m08400s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} diff --git a/nv/m08500_a0.cu b/nv/m08500_a0.cu new file mode 100644 index 0000000000..1cd8c80b74 --- /dev/null +++ b/nv/m08500_a0.cu @@ -0,0 +1,837 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _DES_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW2 +#define VECT_SIZE1 +#endif + +#define DGST_R0 0 +#define DGST_R1 1 +#define DGST_R2 2 +#define DGST_R3 3 + +#include "include/kernel_functions.c" +#include "types_nv.c" +#include "common_nv.c" +#include "include/rp_gpu.h" +#include "rp_nv.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#define PERM_OP(a,b,tt,n,m) \ +{ \ + tt = a >> n; \ + tt = tt ^ b; \ + tt = tt & m; \ + b = b ^ tt; \ + tt = tt << n; \ + a = a ^ tt; \ +} + +#define HPERM_OP(a,tt,n,m) \ +{ \ + tt = a << (16 + n); \ + tt = tt ^ a; \ + tt = tt & m; \ + a = a ^ tt; \ + tt = tt >> (16 + n); \ + a = a ^ tt; \ +} + +#define IP(l,r,tt) \ +{ \ + PERM_OP (r, l, tt, 4, 0x0f0f0f0f); \ + PERM_OP (l, r, tt, 16, 0x0000ffff); \ + PERM_OP (r, l, tt, 2, 0x33333333); \ + PERM_OP (l, r, tt, 8, 0x00ff00ff); \ + PERM_OP (r, l, tt, 1, 0x55555555); \ +} + +#define FP(l,r,tt) \ +{ \ + PERM_OP (l, r, tt, 1, 0x55555555); \ + PERM_OP (r, l, tt, 8, 0x00ff00ff); \ + PERM_OP (l, r, tt, 2, 0x33333333); \ + PERM_OP (r, l, tt, 16, 0x0000ffff); \ + PERM_OP (l, r, tt, 4, 0x0f0f0f0f); \ +} + +__device__ __constant__ u32 c_SPtrans[8][64] = +{ + /* nibble 0 */ + 0x02080800, 0x00080000, 0x02000002, 0x02080802, + 0x02000000, 0x00080802, 0x00080002, 0x02000002, + 0x00080802, 0x02080800, 0x02080000, 0x00000802, + 0x02000802, 0x02000000, 0x00000000, 0x00080002, + 0x00080000, 0x00000002, 0x02000800, 0x00080800, + 0x02080802, 0x02080000, 0x00000802, 0x02000800, + 0x00000002, 0x00000800, 0x00080800, 0x02080002, + 0x00000800, 0x02000802, 0x02080002, 0x00000000, + 0x00000000, 0x02080802, 0x02000800, 0x00080002, + 0x02080800, 0x00080000, 0x00000802, 0x02000800, + 0x02080002, 0x00000800, 0x00080800, 0x02000002, + 0x00080802, 0x00000002, 0x02000002, 0x02080000, + 0x02080802, 0x00080800, 0x02080000, 0x02000802, + 0x02000000, 0x00000802, 0x00080002, 0x00000000, + 0x00080000, 0x02000000, 0x02000802, 0x02080800, + 0x00000002, 0x02080002, 0x00000800, 0x00080802, + /* nibble 1 */ + 0x40108010, 0x00000000, 0x00108000, 0x40100000, + 0x40000010, 0x00008010, 0x40008000, 0x00108000, + 0x00008000, 0x40100010, 0x00000010, 0x40008000, + 0x00100010, 0x40108000, 0x40100000, 0x00000010, + 0x00100000, 0x40008010, 0x40100010, 0x00008000, + 0x00108010, 0x40000000, 0x00000000, 0x00100010, + 0x40008010, 0x00108010, 0x40108000, 0x40000010, + 0x40000000, 0x00100000, 0x00008010, 0x40108010, + 0x00100010, 0x40108000, 0x40008000, 0x00108010, + 0x40108010, 0x00100010, 0x40000010, 0x00000000, + 0x40000000, 0x00008010, 0x00100000, 0x40100010, + 0x00008000, 0x40000000, 0x00108010, 0x40008010, + 0x40108000, 0x00008000, 0x00000000, 0x40000010, + 0x00000010, 0x40108010, 0x00108000, 0x40100000, + 0x40100010, 0x00100000, 0x00008010, 0x40008000, + 0x40008010, 0x00000010, 0x40100000, 0x00108000, + /* nibble 2 */ + 0x04000001, 0x04040100, 0x00000100, 0x04000101, + 0x00040001, 0x04000000, 0x04000101, 0x00040100, + 0x04000100, 0x00040000, 0x04040000, 0x00000001, + 0x04040101, 0x00000101, 0x00000001, 0x04040001, + 0x00000000, 0x00040001, 0x04040100, 0x00000100, + 0x00000101, 0x04040101, 0x00040000, 0x04000001, + 0x04040001, 0x04000100, 0x00040101, 0x04040000, + 0x00040100, 0x00000000, 0x04000000, 0x00040101, + 0x04040100, 0x00000100, 0x00000001, 0x00040000, + 0x00000101, 0x00040001, 0x04040000, 0x04000101, + 0x00000000, 0x04040100, 0x00040100, 0x04040001, + 0x00040001, 0x04000000, 0x04040101, 0x00000001, + 0x00040101, 0x04000001, 0x04000000, 0x04040101, + 0x00040000, 0x04000100, 0x04000101, 0x00040100, + 0x04000100, 0x00000000, 0x04040001, 0x00000101, + 0x04000001, 0x00040101, 0x00000100, 0x04040000, + /* nibble 3 */ + 0x00401008, 0x10001000, 0x00000008, 0x10401008, + 0x00000000, 0x10400000, 0x10001008, 0x00400008, + 0x10401000, 0x10000008, 0x10000000, 0x00001008, + 0x10000008, 0x00401008, 0x00400000, 0x10000000, + 0x10400008, 0x00401000, 0x00001000, 0x00000008, + 0x00401000, 0x10001008, 0x10400000, 0x00001000, + 0x00001008, 0x00000000, 0x00400008, 0x10401000, + 0x10001000, 0x10400008, 0x10401008, 0x00400000, + 0x10400008, 0x00001008, 0x00400000, 0x10000008, + 0x00401000, 0x10001000, 0x00000008, 0x10400000, + 0x10001008, 0x00000000, 0x00001000, 0x00400008, + 0x00000000, 0x10400008, 0x10401000, 0x00001000, + 0x10000000, 0x10401008, 0x00401008, 0x00400000, + 0x10401008, 0x00000008, 0x10001000, 0x00401008, + 0x00400008, 0x00401000, 0x10400000, 0x10001008, + 0x00001008, 0x10000000, 0x10000008, 0x10401000, + /* nibble 4 */ + 0x08000000, 0x00010000, 0x00000400, 0x08010420, + 0x08010020, 0x08000400, 0x00010420, 0x08010000, + 0x00010000, 0x00000020, 0x08000020, 0x00010400, + 0x08000420, 0x08010020, 0x08010400, 0x00000000, + 0x00010400, 0x08000000, 0x00010020, 0x00000420, + 0x08000400, 0x00010420, 0x00000000, 0x08000020, + 0x00000020, 0x08000420, 0x08010420, 0x00010020, + 0x08010000, 0x00000400, 0x00000420, 0x08010400, + 0x08010400, 0x08000420, 0x00010020, 0x08010000, + 0x00010000, 0x00000020, 0x08000020, 0x08000400, + 0x08000000, 0x00010400, 0x08010420, 0x00000000, + 0x00010420, 0x08000000, 0x00000400, 0x00010020, + 0x08000420, 0x00000400, 0x00000000, 0x08010420, + 0x08010020, 0x08010400, 0x00000420, 0x00010000, + 0x00010400, 0x08010020, 0x08000400, 0x00000420, + 0x00000020, 0x00010420, 0x08010000, 0x08000020, + /* nibble 5 */ + 0x80000040, 0x00200040, 0x00000000, 0x80202000, + 0x00200040, 0x00002000, 0x80002040, 0x00200000, + 0x00002040, 0x80202040, 0x00202000, 0x80000000, + 0x80002000, 0x80000040, 0x80200000, 0x00202040, + 0x00200000, 0x80002040, 0x80200040, 0x00000000, + 0x00002000, 0x00000040, 0x80202000, 0x80200040, + 0x80202040, 0x80200000, 0x80000000, 0x00002040, + 0x00000040, 0x00202000, 0x00202040, 0x80002000, + 0x00002040, 0x80000000, 0x80002000, 0x00202040, + 0x80202000, 0x00200040, 0x00000000, 0x80002000, + 0x80000000, 0x00002000, 0x80200040, 0x00200000, + 0x00200040, 0x80202040, 0x00202000, 0x00000040, + 0x80202040, 0x00202000, 0x00200000, 0x80002040, + 0x80000040, 0x80200000, 0x00202040, 0x00000000, + 0x00002000, 0x80000040, 0x80002040, 0x80202000, + 0x80200000, 0x00002040, 0x00000040, 0x80200040, + /* nibble 6 */ + 0x00004000, 0x00000200, 0x01000200, 0x01000004, + 0x01004204, 0x00004004, 0x00004200, 0x00000000, + 0x01000000, 0x01000204, 0x00000204, 0x01004000, + 0x00000004, 0x01004200, 0x01004000, 0x00000204, + 0x01000204, 0x00004000, 0x00004004, 0x01004204, + 0x00000000, 0x01000200, 0x01000004, 0x00004200, + 0x01004004, 0x00004204, 0x01004200, 0x00000004, + 0x00004204, 0x01004004, 0x00000200, 0x01000000, + 0x00004204, 0x01004000, 0x01004004, 0x00000204, + 0x00004000, 0x00000200, 0x01000000, 0x01004004, + 0x01000204, 0x00004204, 0x00004200, 0x00000000, + 0x00000200, 0x01000004, 0x00000004, 0x01000200, + 0x00000000, 0x01000204, 0x01000200, 0x00004200, + 0x00000204, 0x00004000, 0x01004204, 0x01000000, + 0x01004200, 0x00000004, 0x00004004, 0x01004204, + 0x01000004, 0x01004200, 0x01004000, 0x00004004, + /* nibble 7 */ + 0x20800080, 0x20820000, 0x00020080, 0x00000000, + 0x20020000, 0x00800080, 0x20800000, 0x20820080, + 0x00000080, 0x20000000, 0x00820000, 0x00020080, + 0x00820080, 0x20020080, 0x20000080, 0x20800000, + 0x00020000, 0x00820080, 0x00800080, 0x20020000, + 0x20820080, 0x20000080, 0x00000000, 0x00820000, + 0x20000000, 0x00800000, 0x20020080, 0x20800080, + 0x00800000, 0x00020000, 0x20820000, 0x00000080, + 0x00800000, 0x00020000, 0x20000080, 0x20820080, + 0x00020080, 0x20000000, 0x00000000, 0x00820000, + 0x20800080, 0x20020080, 0x20020000, 0x00800080, + 0x20820000, 0x00000080, 0x00800080, 0x20020000, + 0x20820080, 0x00800000, 0x20800000, 0x20000080, + 0x00820000, 0x00020080, 0x20020080, 0x20800000, + 0x00000080, 0x20820000, 0x00820080, 0x00000000, + 0x20000000, 0x20800080, 0x00020000, 0x00820080, +}; + +__device__ __constant__ u32 c_skb[8][64] = +{ + /* for C bits (numbered as per FIPS 46) 1 2 3 4 5 6 */ + 0x00000000, 0x00000010, 0x20000000, 0x20000010, + 0x00010000, 0x00010010, 0x20010000, 0x20010010, + 0x00000800, 0x00000810, 0x20000800, 0x20000810, + 0x00010800, 0x00010810, 0x20010800, 0x20010810, + 0x00000020, 0x00000030, 0x20000020, 0x20000030, + 0x00010020, 0x00010030, 0x20010020, 0x20010030, + 0x00000820, 0x00000830, 0x20000820, 0x20000830, + 0x00010820, 0x00010830, 0x20010820, 0x20010830, + 0x00080000, 0x00080010, 0x20080000, 0x20080010, + 0x00090000, 0x00090010, 0x20090000, 0x20090010, + 0x00080800, 0x00080810, 0x20080800, 0x20080810, + 0x00090800, 0x00090810, 0x20090800, 0x20090810, + 0x00080020, 0x00080030, 0x20080020, 0x20080030, + 0x00090020, 0x00090030, 0x20090020, 0x20090030, + 0x00080820, 0x00080830, 0x20080820, 0x20080830, + 0x00090820, 0x00090830, 0x20090820, 0x20090830, + /* for C bits (numbered as per FIPS 46) 7 8 10 11 12 13 */ + 0x00000000, 0x02000000, 0x00002000, 0x02002000, + 0x00200000, 0x02200000, 0x00202000, 0x02202000, + 0x00000004, 0x02000004, 0x00002004, 0x02002004, + 0x00200004, 0x02200004, 0x00202004, 0x02202004, + 0x00000400, 0x02000400, 0x00002400, 0x02002400, + 0x00200400, 0x02200400, 0x00202400, 0x02202400, + 0x00000404, 0x02000404, 0x00002404, 0x02002404, + 0x00200404, 0x02200404, 0x00202404, 0x02202404, + 0x10000000, 0x12000000, 0x10002000, 0x12002000, + 0x10200000, 0x12200000, 0x10202000, 0x12202000, + 0x10000004, 0x12000004, 0x10002004, 0x12002004, + 0x10200004, 0x12200004, 0x10202004, 0x12202004, + 0x10000400, 0x12000400, 0x10002400, 0x12002400, + 0x10200400, 0x12200400, 0x10202400, 0x12202400, + 0x10000404, 0x12000404, 0x10002404, 0x12002404, + 0x10200404, 0x12200404, 0x10202404, 0x12202404, + /* for C bits (numbered as per FIPS 46) 14 15 16 17 19 20 */ + 0x00000000, 0x00000001, 0x00040000, 0x00040001, + 0x01000000, 0x01000001, 0x01040000, 0x01040001, + 0x00000002, 0x00000003, 0x00040002, 0x00040003, + 0x01000002, 0x01000003, 0x01040002, 0x01040003, + 0x00000200, 0x00000201, 0x00040200, 0x00040201, + 0x01000200, 0x01000201, 0x01040200, 0x01040201, + 0x00000202, 0x00000203, 0x00040202, 0x00040203, + 0x01000202, 0x01000203, 0x01040202, 0x01040203, + 0x08000000, 0x08000001, 0x08040000, 0x08040001, + 0x09000000, 0x09000001, 0x09040000, 0x09040001, + 0x08000002, 0x08000003, 0x08040002, 0x08040003, + 0x09000002, 0x09000003, 0x09040002, 0x09040003, + 0x08000200, 0x08000201, 0x08040200, 0x08040201, + 0x09000200, 0x09000201, 0x09040200, 0x09040201, + 0x08000202, 0x08000203, 0x08040202, 0x08040203, + 0x09000202, 0x09000203, 0x09040202, 0x09040203, + /* for C bits (numbered as per FIPS 46) 21 23 24 26 27 28 */ + 0x00000000, 0x00100000, 0x00000100, 0x00100100, + 0x00000008, 0x00100008, 0x00000108, 0x00100108, + 0x00001000, 0x00101000, 0x00001100, 0x00101100, + 0x00001008, 0x00101008, 0x00001108, 0x00101108, + 0x04000000, 0x04100000, 0x04000100, 0x04100100, + 0x04000008, 0x04100008, 0x04000108, 0x04100108, + 0x04001000, 0x04101000, 0x04001100, 0x04101100, + 0x04001008, 0x04101008, 0x04001108, 0x04101108, + 0x00020000, 0x00120000, 0x00020100, 0x00120100, + 0x00020008, 0x00120008, 0x00020108, 0x00120108, + 0x00021000, 0x00121000, 0x00021100, 0x00121100, + 0x00021008, 0x00121008, 0x00021108, 0x00121108, + 0x04020000, 0x04120000, 0x04020100, 0x04120100, + 0x04020008, 0x04120008, 0x04020108, 0x04120108, + 0x04021000, 0x04121000, 0x04021100, 0x04121100, + 0x04021008, 0x04121008, 0x04021108, 0x04121108, + /* for D bits (numbered as per FIPS 46) 1 2 3 4 5 6 */ + 0x00000000, 0x10000000, 0x00010000, 0x10010000, + 0x00000004, 0x10000004, 0x00010004, 0x10010004, + 0x20000000, 0x30000000, 0x20010000, 0x30010000, + 0x20000004, 0x30000004, 0x20010004, 0x30010004, + 0x00100000, 0x10100000, 0x00110000, 0x10110000, + 0x00100004, 0x10100004, 0x00110004, 0x10110004, + 0x20100000, 0x30100000, 0x20110000, 0x30110000, + 0x20100004, 0x30100004, 0x20110004, 0x30110004, + 0x00001000, 0x10001000, 0x00011000, 0x10011000, + 0x00001004, 0x10001004, 0x00011004, 0x10011004, + 0x20001000, 0x30001000, 0x20011000, 0x30011000, + 0x20001004, 0x30001004, 0x20011004, 0x30011004, + 0x00101000, 0x10101000, 0x00111000, 0x10111000, + 0x00101004, 0x10101004, 0x00111004, 0x10111004, + 0x20101000, 0x30101000, 0x20111000, 0x30111000, + 0x20101004, 0x30101004, 0x20111004, 0x30111004, + /* for D bits (numbered as per FIPS 46) 8 9 11 12 13 14 */ + 0x00000000, 0x08000000, 0x00000008, 0x08000008, + 0x00000400, 0x08000400, 0x00000408, 0x08000408, + 0x00020000, 0x08020000, 0x00020008, 0x08020008, + 0x00020400, 0x08020400, 0x00020408, 0x08020408, + 0x00000001, 0x08000001, 0x00000009, 0x08000009, + 0x00000401, 0x08000401, 0x00000409, 0x08000409, + 0x00020001, 0x08020001, 0x00020009, 0x08020009, + 0x00020401, 0x08020401, 0x00020409, 0x08020409, + 0x02000000, 0x0A000000, 0x02000008, 0x0A000008, + 0x02000400, 0x0A000400, 0x02000408, 0x0A000408, + 0x02020000, 0x0A020000, 0x02020008, 0x0A020008, + 0x02020400, 0x0A020400, 0x02020408, 0x0A020408, + 0x02000001, 0x0A000001, 0x02000009, 0x0A000009, + 0x02000401, 0x0A000401, 0x02000409, 0x0A000409, + 0x02020001, 0x0A020001, 0x02020009, 0x0A020009, + 0x02020401, 0x0A020401, 0x02020409, 0x0A020409, + /* for D bits (numbered as per FIPS 46) 16 17 18 19 20 21 */ + 0x00000000, 0x00000100, 0x00080000, 0x00080100, + 0x01000000, 0x01000100, 0x01080000, 0x01080100, + 0x00000010, 0x00000110, 0x00080010, 0x00080110, + 0x01000010, 0x01000110, 0x01080010, 0x01080110, + 0x00200000, 0x00200100, 0x00280000, 0x00280100, + 0x01200000, 0x01200100, 0x01280000, 0x01280100, + 0x00200010, 0x00200110, 0x00280010, 0x00280110, + 0x01200010, 0x01200110, 0x01280010, 0x01280110, + 0x00000200, 0x00000300, 0x00080200, 0x00080300, + 0x01000200, 0x01000300, 0x01080200, 0x01080300, + 0x00000210, 0x00000310, 0x00080210, 0x00080310, + 0x01000210, 0x01000310, 0x01080210, 0x01080310, + 0x00200200, 0x00200300, 0x00280200, 0x00280300, + 0x01200200, 0x01200300, 0x01280200, 0x01280300, + 0x00200210, 0x00200310, 0x00280210, 0x00280310, + 0x01200210, 0x01200310, 0x01280210, 0x01280310, + /* for D bits (numbered as per FIPS 46) 22 23 24 25 27 28 */ + 0x00000000, 0x04000000, 0x00040000, 0x04040000, + 0x00000002, 0x04000002, 0x00040002, 0x04040002, + 0x00002000, 0x04002000, 0x00042000, 0x04042000, + 0x00002002, 0x04002002, 0x00042002, 0x04042002, + 0x00000020, 0x04000020, 0x00040020, 0x04040020, + 0x00000022, 0x04000022, 0x00040022, 0x04040022, + 0x00002020, 0x04002020, 0x00042020, 0x04042020, + 0x00002022, 0x04002022, 0x00042022, 0x04042022, + 0x00000800, 0x04000800, 0x00040800, 0x04040800, + 0x00000802, 0x04000802, 0x00040802, 0x04040802, + 0x00002800, 0x04002800, 0x00042800, 0x04042800, + 0x00002802, 0x04002802, 0x00042802, 0x04042802, + 0x00000820, 0x04000820, 0x00040820, 0x04040820, + 0x00000822, 0x04000822, 0x00040822, 0x04040822, + 0x00002820, 0x04002820, 0x00042820, 0x04042820, + 0x00002822, 0x04002822, 0x00042822, 0x04042822, +}; + +#define NBOX(i,n,S) (S)[(n)][(i)] + +__device__ static void _des_crypt_encrypt (u32x iv[2], u32x data[2], u32x Kc[16], u32x Kd[16], u32 s_SPtrans[8][64]) +{ + u32x tt; + + u32x r = data[0]; + u32x l = data[1]; + + #pragma unroll 16 + for (u32 i = 0; i < 16; i++) + { + u32x u = Kc[i] ^ r; + u32x t = Kd[i] ^ rotl32 (r, 28u); + + #ifdef VECT_SIZE1 + l ^= NBOX (((u >> 2) & 0x3f), 0, s_SPtrans) + | NBOX (((u >> 10) & 0x3f), 2, s_SPtrans) + | NBOX (((u >> 18) & 0x3f), 4, s_SPtrans) + | NBOX (((u >> 26) & 0x3f), 6, s_SPtrans) + | NBOX (((t >> 2) & 0x3f), 1, s_SPtrans) + | NBOX (((t >> 10) & 0x3f), 3, s_SPtrans) + | NBOX (((t >> 18) & 0x3f), 5, s_SPtrans) + | NBOX (((t >> 26) & 0x3f), 7, s_SPtrans); + #endif + + #ifdef VECT_SIZE2 + l.s0 ^= NBOX (((u.s0 >> 2) & 0x3f), 0, s_SPtrans) + | NBOX (((u.s0 >> 10) & 0x3f), 2, s_SPtrans) + | NBOX (((u.s0 >> 18) & 0x3f), 4, s_SPtrans) + | NBOX (((u.s0 >> 26) & 0x3f), 6, s_SPtrans) + | NBOX (((t.s0 >> 2) & 0x3f), 1, s_SPtrans) + | NBOX (((t.s0 >> 10) & 0x3f), 3, s_SPtrans) + | NBOX (((t.s0 >> 18) & 0x3f), 5, s_SPtrans) + | NBOX (((t.s0 >> 26) & 0x3f), 7, s_SPtrans); + + l.s1 ^= NBOX (((u.s1 >> 2) & 0x3f), 0, s_SPtrans) + | NBOX (((u.s1 >> 10) & 0x3f), 2, s_SPtrans) + | NBOX (((u.s1 >> 18) & 0x3f), 4, s_SPtrans) + | NBOX (((u.s1 >> 26) & 0x3f), 6, s_SPtrans) + | NBOX (((t.s1 >> 2) & 0x3f), 1, s_SPtrans) + | NBOX (((t.s1 >> 10) & 0x3f), 3, s_SPtrans) + | NBOX (((t.s1 >> 18) & 0x3f), 5, s_SPtrans) + | NBOX (((t.s1 >> 26) & 0x3f), 7, s_SPtrans); + #endif + + tt = l; + l = r; + r = tt; + } + + iv[0] = l; + iv[1] = r; +} + +__device__ static void _des_crypt_keysetup (u32x c, u32x d, u32x Kc[16], u32x Kd[16], u32 s_skb[8][64]) +{ + u32x tt; + + PERM_OP (d, c, tt, 4, 0x0f0f0f0f); + HPERM_OP (c, tt, 2, 0xcccc0000); + HPERM_OP (d, tt, 2, 0xcccc0000); + PERM_OP (d, c, tt, 1, 0x55555555); + PERM_OP (c, d, tt, 8, 0x00ff00ff); + PERM_OP (d, c, tt, 1, 0x55555555); + + d = ((d & 0x000000ff) << 16) + | ((d & 0x0000ff00) << 0) + | ((d & 0x00ff0000) >> 16) + | ((c & 0xf0000000) >> 4); + + c = c & 0x0fffffff; + + //#pragma unroll 16 + for (u32 i = 0; i < 16; i++) + { + const u32 shifts3s0[16] = { 1, 1, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 1 }; + const u32 shifts3s1[16] = { 27, 27, 26, 26, 26, 26, 26, 26, 27, 26, 26, 26, 26, 26, 26, 27 }; + + c = c >> shifts3s0[i] | c << shifts3s1[i]; + d = d >> shifts3s0[i] | d << shifts3s1[i]; + + c = c & 0x0fffffff; + d = d & 0x0fffffff; + + u32x s; + u32x t; + + #ifdef VECT_SIZE1 + s = NBOX ((( c >> 0) & 0x3f), 0, s_skb) + | NBOX ((((c >> 6) & 0x03) + | ((c >> 7) & 0x3c)), 1, s_skb) + | NBOX ((((c >> 13) & 0x0f) + | ((c >> 14) & 0x30)), 2, s_skb) + | NBOX ((((c >> 20) & 0x01) + | ((c >> 21) & 0x06) + | ((c >> 22) & 0x38)), 3, s_skb); + + t = NBOX ((( d >> 0) & 0x3f), 4, s_skb) + | NBOX ((((d >> 7) & 0x03) + | ((d >> 8) & 0x3c)), 5, s_skb) + | NBOX ((((d >> 15) & 0x3f)), 6, s_skb) + | NBOX ((((d >> 21) & 0x0f) + | ((d >> 22) & 0x30)), 7, s_skb); + #endif + + #ifdef VECT_SIZE2 + s.s0 = NBOX ((( c.s0 >> 0) & 0x3f), 0, s_skb) + | NBOX ((((c.s0 >> 6) & 0x03) + | ((c.s0 >> 7) & 0x3c)), 1, s_skb) + | NBOX ((((c.s0 >> 13) & 0x0f) + | ((c.s0 >> 14) & 0x30)), 2, s_skb) + | NBOX ((((c.s0 >> 20) & 0x01) + | ((c.s0 >> 21) & 0x06) + | ((c.s0 >> 22) & 0x38)), 3, s_skb); + + t.s0 = NBOX ((( d.s0 >> 0) & 0x3f), 4, s_skb) + | NBOX ((((d.s0 >> 7) & 0x03) + | ((d.s0 >> 8) & 0x3c)), 5, s_skb) + | NBOX ((((d.s0 >> 15) & 0x3f)), 6, s_skb) + | NBOX ((((d.s0 >> 21) & 0x0f) + | ((d.s0 >> 22) & 0x30)), 7, s_skb); + + s.s1 = NBOX ((( c.s1 >> 0) & 0x3f), 0, s_skb) + | NBOX ((((c.s1 >> 6) & 0x03) + | ((c.s1 >> 7) & 0x3c)), 1, s_skb) + | NBOX ((((c.s1 >> 13) & 0x0f) + | ((c.s1 >> 14) & 0x30)), 2, s_skb) + | NBOX ((((c.s1 >> 20) & 0x01) + | ((c.s1 >> 21) & 0x06) + | ((c.s1 >> 22) & 0x38)), 3, s_skb); + + t.s1 = NBOX ((( d.s1 >> 0) & 0x3f), 4, s_skb) + | NBOX ((((d.s1 >> 7) & 0x03) + | ((d.s1 >> 8) & 0x3c)), 5, s_skb) + | NBOX ((((d.s1 >> 15) & 0x3f)), 6, s_skb) + | NBOX ((((d.s1 >> 21) & 0x0f) + | ((d.s1 >> 22) & 0x30)), 7, s_skb); + #endif + + #if __CUDA_ARCH__ >= 200 + Kc[i] = __byte_perm (s, t, 0x5410); + Kd[i] = __byte_perm (s, t, 0x7632); + #else + Kc[i] = ((t << 16) | (s & 0x0000ffff)); + Kd[i] = ((s >> 16) | (t & 0xffff0000)); + #endif + + Kc[i] = rotl32 (Kc[i], 2u); + Kd[i] = rotl32 (Kd[i], 2u); + } +} + +__device__ static void transform_racf_key (const u32x w0, const u32x w1, u32x key[2]) +{ + + const u8 ascii_to_ebcdic_pc[256] = + { + // little hack, can't crack 0-bytes in password, but who cares + // 0xab, 0xa8, 0xae, 0xad, 0xc4, 0xf1, 0xf7, 0xf4, 0x86, 0xa1, 0xe0, 0xbc, 0xb3, 0xb0, 0xb6, 0xb5, + 0x2a, 0xa8, 0xae, 0xad, 0xc4, 0xf1, 0xf7, 0xf4, 0x86, 0xa1, 0xe0, 0xbc, 0xb3, 0xb0, 0xb6, 0xb5, + 0x8a, 0x89, 0x8f, 0x8c, 0xd3, 0xd0, 0xce, 0xe6, 0x9b, 0x98, 0xd5, 0xe5, 0x92, 0x91, 0x97, 0x94, + 0x2a, 0x34, 0x54, 0x5d, 0x1c, 0x73, 0x0b, 0x51, 0x31, 0x10, 0x13, 0x37, 0x7c, 0x6b, 0x3d, 0x68, + 0x4a, 0x49, 0x4f, 0x4c, 0x43, 0x40, 0x46, 0x45, 0x5b, 0x58, 0x5e, 0x16, 0x32, 0x57, 0x76, 0x75, + 0x52, 0x29, 0x2f, 0x2c, 0x23, 0x20, 0x26, 0x25, 0x3b, 0x38, 0x08, 0x0e, 0x0d, 0x02, 0x01, 0x07, + 0x04, 0x1a, 0x19, 0x6e, 0x6d, 0x62, 0x61, 0x67, 0x64, 0x7a, 0x79, 0x3e, 0x6b, 0x1f, 0x15, 0x70, + 0x58, 0xa8, 0xae, 0xad, 0xa2, 0xa1, 0xa7, 0xa4, 0xba, 0xb9, 0x89, 0x8f, 0x8c, 0x83, 0x80, 0x86, + 0x85, 0x9b, 0x98, 0xef, 0xec, 0xe3, 0xe0, 0xe6, 0xe5, 0xfb, 0xf8, 0x2a, 0x7f, 0x0b, 0xe9, 0xa4, + 0xea, 0xe9, 0xef, 0xec, 0xe3, 0x80, 0xa7, 0x85, 0xfb, 0xf8, 0xfe, 0xfd, 0xf2, 0xb9, 0xbf, 0x9d, + 0xcb, 0xc8, 0x9e, 0xcd, 0xc2, 0xc1, 0xc7, 0xba, 0xda, 0xd9, 0xdf, 0xdc, 0xa2, 0x83, 0xd6, 0x68, + 0x29, 0x2f, 0x2c, 0x23, 0x20, 0x26, 0x25, 0x3b, 0x38, 0x08, 0x0e, 0x0d, 0x02, 0x01, 0x07, 0x04, + 0x1a, 0x19, 0x6e, 0x6d, 0x62, 0x61, 0x67, 0x64, 0x7a, 0x79, 0x4a, 0x49, 0x4f, 0x4c, 0x43, 0x40, + 0x46, 0x45, 0x5b, 0xab, 0xbf, 0xbc, 0xb3, 0xb0, 0xb6, 0xb5, 0x8a, 0x9e, 0x9d, 0x92, 0x91, 0x97, + 0x94, 0xea, 0xfe, 0xfd, 0xf2, 0xf1, 0xf7, 0xf4, 0xcb, 0xc8, 0xce, 0xcd, 0xc2, 0xc1, 0xc7, 0xc4, + 0xda, 0xd9, 0xdf, 0xdc, 0xd3, 0xd0, 0xd6, 0xd5, 0x3e, 0x3d, 0x32, 0x31, 0x37, 0x34, 0x1f, 0x1c, + 0x13, 0x10, 0x16, 0x15, 0x7f, 0x7c, 0x73, 0x70, 0x76, 0x75, 0x5e, 0x5d, 0x52, 0x51, 0x57, 0x54, + }; + + #ifdef VECT_SIZE1 + + key[0] = (ascii_to_ebcdic_pc[(w0 >> 0) & 0xff]) << 0 + | (ascii_to_ebcdic_pc[(w0 >> 8) & 0xff]) << 8 + | (ascii_to_ebcdic_pc[(w0 >> 16) & 0xff]) << 16 + | (ascii_to_ebcdic_pc[(w0 >> 24) & 0xff]) << 24; + + key[1] = (ascii_to_ebcdic_pc[(w1 >> 0) & 0xff]) << 0 + | (ascii_to_ebcdic_pc[(w1 >> 8) & 0xff]) << 8 + | (ascii_to_ebcdic_pc[(w1 >> 16) & 0xff]) << 16 + | (ascii_to_ebcdic_pc[(w1 >> 24) & 0xff]) << 24; + #endif + + #ifdef VECT_SIZE2 + + key[0].s0 = (ascii_to_ebcdic_pc[(w0.s0 >> 0) & 0xff]) << 0 + | (ascii_to_ebcdic_pc[(w0.s0 >> 8) & 0xff]) << 8 + | (ascii_to_ebcdic_pc[(w0.s0 >> 16) & 0xff]) << 16 + | (ascii_to_ebcdic_pc[(w0.s0 >> 24) & 0xff]) << 24; + + key[0].s1 = (ascii_to_ebcdic_pc[(w0.s1 >> 0) & 0xff]) << 0 + | (ascii_to_ebcdic_pc[(w0.s1 >> 8) & 0xff]) << 8 + | (ascii_to_ebcdic_pc[(w0.s1 >> 16) & 0xff]) << 16 + | (ascii_to_ebcdic_pc[(w0.s1 >> 24) & 0xff]) << 24; + + key[1].s0 = (ascii_to_ebcdic_pc[(w1.s0 >> 0) & 0xff]) << 0 + | (ascii_to_ebcdic_pc[(w1.s0 >> 8) & 0xff]) << 8 + | (ascii_to_ebcdic_pc[(w1.s0 >> 16) & 0xff]) << 16 + | (ascii_to_ebcdic_pc[(w1.s0 >> 24) & 0xff]) << 24; + + key[1].s1 = (ascii_to_ebcdic_pc[(w1.s1 >> 0) & 0xff]) << 0 + | (ascii_to_ebcdic_pc[(w1.s1 >> 8) & 0xff]) << 8 + | (ascii_to_ebcdic_pc[(w1.s1 >> 16) & 0xff]) << 16 + | (ascii_to_ebcdic_pc[(w1.s1 >> 24) & 0xff]) << 24; + #endif +} + +__device__ __constant__ gpu_rule_t c_rules[1024]; + +extern "C" __global__ void __launch_bounds__ (256, 1) m08500_m04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + u32x pw_buf[4]; + + pw_buf[0] = pws[gid].i[ 0]; + pw_buf[1] = pws[gid].i[ 1]; + pw_buf[2] = 0; + pw_buf[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * salt + */ + + u32 salt_buf0[2]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf_pc[0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf_pc[1]; + + /** + * sbox, kbox + */ + + __shared__ u32 s_SPtrans[8][64]; + __shared__ u32 s_skb[8][64]; + + if (lid < 64) + { + s_SPtrans[0][lid] = c_SPtrans[0][lid]; + s_SPtrans[1][lid] = c_SPtrans[1][lid]; + s_SPtrans[2][lid] = c_SPtrans[2][lid]; + s_SPtrans[3][lid] = c_SPtrans[3][lid]; + s_SPtrans[4][lid] = c_SPtrans[4][lid]; + s_SPtrans[5][lid] = c_SPtrans[5][lid]; + s_SPtrans[6][lid] = c_SPtrans[6][lid]; + s_SPtrans[7][lid] = c_SPtrans[7][lid]; + + s_skb[0][lid] = c_skb[0][lid]; + s_skb[1][lid] = c_skb[1][lid]; + s_skb[2][lid] = c_skb[2][lid]; + s_skb[3][lid] = c_skb[3][lid]; + s_skb[4][lid] = c_skb[4][lid]; + s_skb[5][lid] = c_skb[5][lid]; + s_skb[6][lid] = c_skb[6][lid]; + s_skb[7][lid] = c_skb[7][lid]; + } + + __syncthreads (); + + if (gid >= gid_max) return; + + /** + * main + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + + w0[0] = pw_buf[0]; + w0[1] = pw_buf[1]; + w0[2] = pw_buf[2]; + w0[3] = pw_buf[3]; + + u32x w1[4]; + + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + + u32 out_len = apply_rules (c_rules[il_pos].cmds, w0, w1, pw_len); + + out_len = (out_len >= 8) ? 8 : out_len; + + u32x key[2]; + + transform_racf_key (w0[0], w0[1], key); + + const u32x c = key[0]; + const u32x d = key[1]; + + u32x Kc[16]; + u32x Kd[16]; + + _des_crypt_keysetup (c, d, Kc, Kd, s_skb); + + u32x data[2]; + + data[0] = salt_buf0[0]; + data[1] = salt_buf0[1]; + + u32x iv[2]; + + _des_crypt_encrypt (iv, data, Kc, Kd, s_SPtrans); + + const u32x r0 = iv[0]; + const u32x r1 = iv[1]; + const u32x r2 = 0; + const u32x r3 = 0; + + #include VECT_COMPARE_M + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m08500_m08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m08500_m16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m08500_s04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + u32x pw_buf[4]; + + pw_buf[0] = pws[gid].i[ 0]; + pw_buf[1] = pws[gid].i[ 1]; + pw_buf[2] = 0; + pw_buf[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * salt + */ + + u32 salt_buf0[2]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf_pc[0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf_pc[1]; + + /** + * sbox, kbox + */ + + __shared__ u32 s_SPtrans[8][64]; + __shared__ u32 s_skb[8][64]; + + if (lid < 64) + { + s_SPtrans[0][lid] = c_SPtrans[0][lid]; + s_SPtrans[1][lid] = c_SPtrans[1][lid]; + s_SPtrans[2][lid] = c_SPtrans[2][lid]; + s_SPtrans[3][lid] = c_SPtrans[3][lid]; + s_SPtrans[4][lid] = c_SPtrans[4][lid]; + s_SPtrans[5][lid] = c_SPtrans[5][lid]; + s_SPtrans[6][lid] = c_SPtrans[6][lid]; + s_SPtrans[7][lid] = c_SPtrans[7][lid]; + + s_skb[0][lid] = c_skb[0][lid]; + s_skb[1][lid] = c_skb[1][lid]; + s_skb[2][lid] = c_skb[2][lid]; + s_skb[3][lid] = c_skb[3][lid]; + s_skb[4][lid] = c_skb[4][lid]; + s_skb[5][lid] = c_skb[5][lid]; + s_skb[6][lid] = c_skb[6][lid]; + s_skb[7][lid] = c_skb[7][lid]; + } + + __syncthreads (); + + if (gid >= gid_max) return; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * main + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + + w0[0] = pw_buf[0]; + w0[1] = pw_buf[1]; + w0[2] = pw_buf[2]; + w0[3] = pw_buf[3]; + + u32x w1[4]; + + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + + u32 out_len = apply_rules (c_rules[il_pos].cmds, w0, w1, pw_len); + + out_len = (out_len >= 8) ? 8 : out_len; + + u32x key[2]; + + transform_racf_key (w0[0], w0[1], key); + + const u32x c = key[0]; + const u32x d = key[1]; + + u32x Kc[16]; + u32x Kd[16]; + + _des_crypt_keysetup (c, d, Kc, Kd, s_skb); + + u32x data[2]; + + data[0] = salt_buf0[0]; + data[1] = salt_buf0[1]; + + u32x iv[2]; + + _des_crypt_encrypt (iv, data, Kc, Kd, s_SPtrans); + + const u32x r0 = iv[0]; + const u32x r1 = iv[1]; + const u32x r2 = 0; + const u32x r3 = 0; + + #include VECT_COMPARE_S + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m08500_s08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m08500_s16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/nv/m08500_a1.cu b/nv/m08500_a1.cu new file mode 100644 index 0000000000..3e9db6ddc1 --- /dev/null +++ b/nv/m08500_a1.cu @@ -0,0 +1,944 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _DES_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW2 +#define VECT_SIZE1 +#endif + +#define DGST_R0 0 +#define DGST_R1 1 +#define DGST_R2 2 +#define DGST_R3 3 + +#include "include/kernel_functions.c" +#include "types_nv.c" +#include "common_nv.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#define PERM_OP(a,b,tt,n,m) \ +{ \ + tt = a >> n; \ + tt = tt ^ b; \ + tt = tt & m; \ + b = b ^ tt; \ + tt = tt << n; \ + a = a ^ tt; \ +} + +#define HPERM_OP(a,tt,n,m) \ +{ \ + tt = a << (16 + n); \ + tt = tt ^ a; \ + tt = tt & m; \ + a = a ^ tt; \ + tt = tt >> (16 + n); \ + a = a ^ tt; \ +} + +#define IP(l,r,tt) \ +{ \ + PERM_OP (r, l, tt, 4, 0x0f0f0f0f); \ + PERM_OP (l, r, tt, 16, 0x0000ffff); \ + PERM_OP (r, l, tt, 2, 0x33333333); \ + PERM_OP (l, r, tt, 8, 0x00ff00ff); \ + PERM_OP (r, l, tt, 1, 0x55555555); \ +} + +#define FP(l,r,tt) \ +{ \ + PERM_OP (l, r, tt, 1, 0x55555555); \ + PERM_OP (r, l, tt, 8, 0x00ff00ff); \ + PERM_OP (l, r, tt, 2, 0x33333333); \ + PERM_OP (r, l, tt, 16, 0x0000ffff); \ + PERM_OP (l, r, tt, 4, 0x0f0f0f0f); \ +} + +__device__ __constant__ u8 ascii_to_ebcdic_pc[256] = +{ + // little hack, can't crack 0-bytes in password, but who cares + // 0xab, 0xa8, 0xae, 0xad, 0xc4, 0xf1, 0xf7, 0xf4, 0x86, 0xa1, 0xe0, 0xbc, 0xb3, 0xb0, 0xb6, 0xb5, + 0x2a, 0xa8, 0xae, 0xad, 0xc4, 0xf1, 0xf7, 0xf4, 0x86, 0xa1, 0xe0, 0xbc, 0xb3, 0xb0, 0xb6, 0xb5, + 0x8a, 0x89, 0x8f, 0x8c, 0xd3, 0xd0, 0xce, 0xe6, 0x9b, 0x98, 0xd5, 0xe5, 0x92, 0x91, 0x97, 0x94, + 0x2a, 0x34, 0x54, 0x5d, 0x1c, 0x73, 0x0b, 0x51, 0x31, 0x10, 0x13, 0x37, 0x7c, 0x6b, 0x3d, 0x68, + 0x4a, 0x49, 0x4f, 0x4c, 0x43, 0x40, 0x46, 0x45, 0x5b, 0x58, 0x5e, 0x16, 0x32, 0x57, 0x76, 0x75, + 0x52, 0x29, 0x2f, 0x2c, 0x23, 0x20, 0x26, 0x25, 0x3b, 0x38, 0x08, 0x0e, 0x0d, 0x02, 0x01, 0x07, + 0x04, 0x1a, 0x19, 0x6e, 0x6d, 0x62, 0x61, 0x67, 0x64, 0x7a, 0x79, 0x3e, 0x6b, 0x1f, 0x15, 0x70, + 0x58, 0xa8, 0xae, 0xad, 0xa2, 0xa1, 0xa7, 0xa4, 0xba, 0xb9, 0x89, 0x8f, 0x8c, 0x83, 0x80, 0x86, + 0x85, 0x9b, 0x98, 0xef, 0xec, 0xe3, 0xe0, 0xe6, 0xe5, 0xfb, 0xf8, 0x2a, 0x7f, 0x0b, 0xe9, 0xa4, + 0xea, 0xe9, 0xef, 0xec, 0xe3, 0x80, 0xa7, 0x85, 0xfb, 0xf8, 0xfe, 0xfd, 0xf2, 0xb9, 0xbf, 0x9d, + 0xcb, 0xc8, 0x9e, 0xcd, 0xc2, 0xc1, 0xc7, 0xba, 0xda, 0xd9, 0xdf, 0xdc, 0xa2, 0x83, 0xd6, 0x68, + 0x29, 0x2f, 0x2c, 0x23, 0x20, 0x26, 0x25, 0x3b, 0x38, 0x08, 0x0e, 0x0d, 0x02, 0x01, 0x07, 0x04, + 0x1a, 0x19, 0x6e, 0x6d, 0x62, 0x61, 0x67, 0x64, 0x7a, 0x79, 0x4a, 0x49, 0x4f, 0x4c, 0x43, 0x40, + 0x46, 0x45, 0x5b, 0xab, 0xbf, 0xbc, 0xb3, 0xb0, 0xb6, 0xb5, 0x8a, 0x9e, 0x9d, 0x92, 0x91, 0x97, + 0x94, 0xea, 0xfe, 0xfd, 0xf2, 0xf1, 0xf7, 0xf4, 0xcb, 0xc8, 0xce, 0xcd, 0xc2, 0xc1, 0xc7, 0xc4, + 0xda, 0xd9, 0xdf, 0xdc, 0xd3, 0xd0, 0xd6, 0xd5, 0x3e, 0x3d, 0x32, 0x31, 0x37, 0x34, 0x1f, 0x1c, + 0x13, 0x10, 0x16, 0x15, 0x7f, 0x7c, 0x73, 0x70, 0x76, 0x75, 0x5e, 0x5d, 0x52, 0x51, 0x57, 0x54, +}; + +__device__ __constant__ u32 c_SPtrans[8][64] = +{ + /* nibble 0 */ + 0x02080800, 0x00080000, 0x02000002, 0x02080802, + 0x02000000, 0x00080802, 0x00080002, 0x02000002, + 0x00080802, 0x02080800, 0x02080000, 0x00000802, + 0x02000802, 0x02000000, 0x00000000, 0x00080002, + 0x00080000, 0x00000002, 0x02000800, 0x00080800, + 0x02080802, 0x02080000, 0x00000802, 0x02000800, + 0x00000002, 0x00000800, 0x00080800, 0x02080002, + 0x00000800, 0x02000802, 0x02080002, 0x00000000, + 0x00000000, 0x02080802, 0x02000800, 0x00080002, + 0x02080800, 0x00080000, 0x00000802, 0x02000800, + 0x02080002, 0x00000800, 0x00080800, 0x02000002, + 0x00080802, 0x00000002, 0x02000002, 0x02080000, + 0x02080802, 0x00080800, 0x02080000, 0x02000802, + 0x02000000, 0x00000802, 0x00080002, 0x00000000, + 0x00080000, 0x02000000, 0x02000802, 0x02080800, + 0x00000002, 0x02080002, 0x00000800, 0x00080802, + /* nibble 1 */ + 0x40108010, 0x00000000, 0x00108000, 0x40100000, + 0x40000010, 0x00008010, 0x40008000, 0x00108000, + 0x00008000, 0x40100010, 0x00000010, 0x40008000, + 0x00100010, 0x40108000, 0x40100000, 0x00000010, + 0x00100000, 0x40008010, 0x40100010, 0x00008000, + 0x00108010, 0x40000000, 0x00000000, 0x00100010, + 0x40008010, 0x00108010, 0x40108000, 0x40000010, + 0x40000000, 0x00100000, 0x00008010, 0x40108010, + 0x00100010, 0x40108000, 0x40008000, 0x00108010, + 0x40108010, 0x00100010, 0x40000010, 0x00000000, + 0x40000000, 0x00008010, 0x00100000, 0x40100010, + 0x00008000, 0x40000000, 0x00108010, 0x40008010, + 0x40108000, 0x00008000, 0x00000000, 0x40000010, + 0x00000010, 0x40108010, 0x00108000, 0x40100000, + 0x40100010, 0x00100000, 0x00008010, 0x40008000, + 0x40008010, 0x00000010, 0x40100000, 0x00108000, + /* nibble 2 */ + 0x04000001, 0x04040100, 0x00000100, 0x04000101, + 0x00040001, 0x04000000, 0x04000101, 0x00040100, + 0x04000100, 0x00040000, 0x04040000, 0x00000001, + 0x04040101, 0x00000101, 0x00000001, 0x04040001, + 0x00000000, 0x00040001, 0x04040100, 0x00000100, + 0x00000101, 0x04040101, 0x00040000, 0x04000001, + 0x04040001, 0x04000100, 0x00040101, 0x04040000, + 0x00040100, 0x00000000, 0x04000000, 0x00040101, + 0x04040100, 0x00000100, 0x00000001, 0x00040000, + 0x00000101, 0x00040001, 0x04040000, 0x04000101, + 0x00000000, 0x04040100, 0x00040100, 0x04040001, + 0x00040001, 0x04000000, 0x04040101, 0x00000001, + 0x00040101, 0x04000001, 0x04000000, 0x04040101, + 0x00040000, 0x04000100, 0x04000101, 0x00040100, + 0x04000100, 0x00000000, 0x04040001, 0x00000101, + 0x04000001, 0x00040101, 0x00000100, 0x04040000, + /* nibble 3 */ + 0x00401008, 0x10001000, 0x00000008, 0x10401008, + 0x00000000, 0x10400000, 0x10001008, 0x00400008, + 0x10401000, 0x10000008, 0x10000000, 0x00001008, + 0x10000008, 0x00401008, 0x00400000, 0x10000000, + 0x10400008, 0x00401000, 0x00001000, 0x00000008, + 0x00401000, 0x10001008, 0x10400000, 0x00001000, + 0x00001008, 0x00000000, 0x00400008, 0x10401000, + 0x10001000, 0x10400008, 0x10401008, 0x00400000, + 0x10400008, 0x00001008, 0x00400000, 0x10000008, + 0x00401000, 0x10001000, 0x00000008, 0x10400000, + 0x10001008, 0x00000000, 0x00001000, 0x00400008, + 0x00000000, 0x10400008, 0x10401000, 0x00001000, + 0x10000000, 0x10401008, 0x00401008, 0x00400000, + 0x10401008, 0x00000008, 0x10001000, 0x00401008, + 0x00400008, 0x00401000, 0x10400000, 0x10001008, + 0x00001008, 0x10000000, 0x10000008, 0x10401000, + /* nibble 4 */ + 0x08000000, 0x00010000, 0x00000400, 0x08010420, + 0x08010020, 0x08000400, 0x00010420, 0x08010000, + 0x00010000, 0x00000020, 0x08000020, 0x00010400, + 0x08000420, 0x08010020, 0x08010400, 0x00000000, + 0x00010400, 0x08000000, 0x00010020, 0x00000420, + 0x08000400, 0x00010420, 0x00000000, 0x08000020, + 0x00000020, 0x08000420, 0x08010420, 0x00010020, + 0x08010000, 0x00000400, 0x00000420, 0x08010400, + 0x08010400, 0x08000420, 0x00010020, 0x08010000, + 0x00010000, 0x00000020, 0x08000020, 0x08000400, + 0x08000000, 0x00010400, 0x08010420, 0x00000000, + 0x00010420, 0x08000000, 0x00000400, 0x00010020, + 0x08000420, 0x00000400, 0x00000000, 0x08010420, + 0x08010020, 0x08010400, 0x00000420, 0x00010000, + 0x00010400, 0x08010020, 0x08000400, 0x00000420, + 0x00000020, 0x00010420, 0x08010000, 0x08000020, + /* nibble 5 */ + 0x80000040, 0x00200040, 0x00000000, 0x80202000, + 0x00200040, 0x00002000, 0x80002040, 0x00200000, + 0x00002040, 0x80202040, 0x00202000, 0x80000000, + 0x80002000, 0x80000040, 0x80200000, 0x00202040, + 0x00200000, 0x80002040, 0x80200040, 0x00000000, + 0x00002000, 0x00000040, 0x80202000, 0x80200040, + 0x80202040, 0x80200000, 0x80000000, 0x00002040, + 0x00000040, 0x00202000, 0x00202040, 0x80002000, + 0x00002040, 0x80000000, 0x80002000, 0x00202040, + 0x80202000, 0x00200040, 0x00000000, 0x80002000, + 0x80000000, 0x00002000, 0x80200040, 0x00200000, + 0x00200040, 0x80202040, 0x00202000, 0x00000040, + 0x80202040, 0x00202000, 0x00200000, 0x80002040, + 0x80000040, 0x80200000, 0x00202040, 0x00000000, + 0x00002000, 0x80000040, 0x80002040, 0x80202000, + 0x80200000, 0x00002040, 0x00000040, 0x80200040, + /* nibble 6 */ + 0x00004000, 0x00000200, 0x01000200, 0x01000004, + 0x01004204, 0x00004004, 0x00004200, 0x00000000, + 0x01000000, 0x01000204, 0x00000204, 0x01004000, + 0x00000004, 0x01004200, 0x01004000, 0x00000204, + 0x01000204, 0x00004000, 0x00004004, 0x01004204, + 0x00000000, 0x01000200, 0x01000004, 0x00004200, + 0x01004004, 0x00004204, 0x01004200, 0x00000004, + 0x00004204, 0x01004004, 0x00000200, 0x01000000, + 0x00004204, 0x01004000, 0x01004004, 0x00000204, + 0x00004000, 0x00000200, 0x01000000, 0x01004004, + 0x01000204, 0x00004204, 0x00004200, 0x00000000, + 0x00000200, 0x01000004, 0x00000004, 0x01000200, + 0x00000000, 0x01000204, 0x01000200, 0x00004200, + 0x00000204, 0x00004000, 0x01004204, 0x01000000, + 0x01004200, 0x00000004, 0x00004004, 0x01004204, + 0x01000004, 0x01004200, 0x01004000, 0x00004004, + /* nibble 7 */ + 0x20800080, 0x20820000, 0x00020080, 0x00000000, + 0x20020000, 0x00800080, 0x20800000, 0x20820080, + 0x00000080, 0x20000000, 0x00820000, 0x00020080, + 0x00820080, 0x20020080, 0x20000080, 0x20800000, + 0x00020000, 0x00820080, 0x00800080, 0x20020000, + 0x20820080, 0x20000080, 0x00000000, 0x00820000, + 0x20000000, 0x00800000, 0x20020080, 0x20800080, + 0x00800000, 0x00020000, 0x20820000, 0x00000080, + 0x00800000, 0x00020000, 0x20000080, 0x20820080, + 0x00020080, 0x20000000, 0x00000000, 0x00820000, + 0x20800080, 0x20020080, 0x20020000, 0x00800080, + 0x20820000, 0x00000080, 0x00800080, 0x20020000, + 0x20820080, 0x00800000, 0x20800000, 0x20000080, + 0x00820000, 0x00020080, 0x20020080, 0x20800000, + 0x00000080, 0x20820000, 0x00820080, 0x00000000, + 0x20000000, 0x20800080, 0x00020000, 0x00820080, +}; + +__device__ __constant__ u32 c_skb[8][64] = +{ + /* for C bits (numbered as per FIPS 46) 1 2 3 4 5 6 */ + 0x00000000, 0x00000010, 0x20000000, 0x20000010, + 0x00010000, 0x00010010, 0x20010000, 0x20010010, + 0x00000800, 0x00000810, 0x20000800, 0x20000810, + 0x00010800, 0x00010810, 0x20010800, 0x20010810, + 0x00000020, 0x00000030, 0x20000020, 0x20000030, + 0x00010020, 0x00010030, 0x20010020, 0x20010030, + 0x00000820, 0x00000830, 0x20000820, 0x20000830, + 0x00010820, 0x00010830, 0x20010820, 0x20010830, + 0x00080000, 0x00080010, 0x20080000, 0x20080010, + 0x00090000, 0x00090010, 0x20090000, 0x20090010, + 0x00080800, 0x00080810, 0x20080800, 0x20080810, + 0x00090800, 0x00090810, 0x20090800, 0x20090810, + 0x00080020, 0x00080030, 0x20080020, 0x20080030, + 0x00090020, 0x00090030, 0x20090020, 0x20090030, + 0x00080820, 0x00080830, 0x20080820, 0x20080830, + 0x00090820, 0x00090830, 0x20090820, 0x20090830, + /* for C bits (numbered as per FIPS 46) 7 8 10 11 12 13 */ + 0x00000000, 0x02000000, 0x00002000, 0x02002000, + 0x00200000, 0x02200000, 0x00202000, 0x02202000, + 0x00000004, 0x02000004, 0x00002004, 0x02002004, + 0x00200004, 0x02200004, 0x00202004, 0x02202004, + 0x00000400, 0x02000400, 0x00002400, 0x02002400, + 0x00200400, 0x02200400, 0x00202400, 0x02202400, + 0x00000404, 0x02000404, 0x00002404, 0x02002404, + 0x00200404, 0x02200404, 0x00202404, 0x02202404, + 0x10000000, 0x12000000, 0x10002000, 0x12002000, + 0x10200000, 0x12200000, 0x10202000, 0x12202000, + 0x10000004, 0x12000004, 0x10002004, 0x12002004, + 0x10200004, 0x12200004, 0x10202004, 0x12202004, + 0x10000400, 0x12000400, 0x10002400, 0x12002400, + 0x10200400, 0x12200400, 0x10202400, 0x12202400, + 0x10000404, 0x12000404, 0x10002404, 0x12002404, + 0x10200404, 0x12200404, 0x10202404, 0x12202404, + /* for C bits (numbered as per FIPS 46) 14 15 16 17 19 20 */ + 0x00000000, 0x00000001, 0x00040000, 0x00040001, + 0x01000000, 0x01000001, 0x01040000, 0x01040001, + 0x00000002, 0x00000003, 0x00040002, 0x00040003, + 0x01000002, 0x01000003, 0x01040002, 0x01040003, + 0x00000200, 0x00000201, 0x00040200, 0x00040201, + 0x01000200, 0x01000201, 0x01040200, 0x01040201, + 0x00000202, 0x00000203, 0x00040202, 0x00040203, + 0x01000202, 0x01000203, 0x01040202, 0x01040203, + 0x08000000, 0x08000001, 0x08040000, 0x08040001, + 0x09000000, 0x09000001, 0x09040000, 0x09040001, + 0x08000002, 0x08000003, 0x08040002, 0x08040003, + 0x09000002, 0x09000003, 0x09040002, 0x09040003, + 0x08000200, 0x08000201, 0x08040200, 0x08040201, + 0x09000200, 0x09000201, 0x09040200, 0x09040201, + 0x08000202, 0x08000203, 0x08040202, 0x08040203, + 0x09000202, 0x09000203, 0x09040202, 0x09040203, + /* for C bits (numbered as per FIPS 46) 21 23 24 26 27 28 */ + 0x00000000, 0x00100000, 0x00000100, 0x00100100, + 0x00000008, 0x00100008, 0x00000108, 0x00100108, + 0x00001000, 0x00101000, 0x00001100, 0x00101100, + 0x00001008, 0x00101008, 0x00001108, 0x00101108, + 0x04000000, 0x04100000, 0x04000100, 0x04100100, + 0x04000008, 0x04100008, 0x04000108, 0x04100108, + 0x04001000, 0x04101000, 0x04001100, 0x04101100, + 0x04001008, 0x04101008, 0x04001108, 0x04101108, + 0x00020000, 0x00120000, 0x00020100, 0x00120100, + 0x00020008, 0x00120008, 0x00020108, 0x00120108, + 0x00021000, 0x00121000, 0x00021100, 0x00121100, + 0x00021008, 0x00121008, 0x00021108, 0x00121108, + 0x04020000, 0x04120000, 0x04020100, 0x04120100, + 0x04020008, 0x04120008, 0x04020108, 0x04120108, + 0x04021000, 0x04121000, 0x04021100, 0x04121100, + 0x04021008, 0x04121008, 0x04021108, 0x04121108, + /* for D bits (numbered as per FIPS 46) 1 2 3 4 5 6 */ + 0x00000000, 0x10000000, 0x00010000, 0x10010000, + 0x00000004, 0x10000004, 0x00010004, 0x10010004, + 0x20000000, 0x30000000, 0x20010000, 0x30010000, + 0x20000004, 0x30000004, 0x20010004, 0x30010004, + 0x00100000, 0x10100000, 0x00110000, 0x10110000, + 0x00100004, 0x10100004, 0x00110004, 0x10110004, + 0x20100000, 0x30100000, 0x20110000, 0x30110000, + 0x20100004, 0x30100004, 0x20110004, 0x30110004, + 0x00001000, 0x10001000, 0x00011000, 0x10011000, + 0x00001004, 0x10001004, 0x00011004, 0x10011004, + 0x20001000, 0x30001000, 0x20011000, 0x30011000, + 0x20001004, 0x30001004, 0x20011004, 0x30011004, + 0x00101000, 0x10101000, 0x00111000, 0x10111000, + 0x00101004, 0x10101004, 0x00111004, 0x10111004, + 0x20101000, 0x30101000, 0x20111000, 0x30111000, + 0x20101004, 0x30101004, 0x20111004, 0x30111004, + /* for D bits (numbered as per FIPS 46) 8 9 11 12 13 14 */ + 0x00000000, 0x08000000, 0x00000008, 0x08000008, + 0x00000400, 0x08000400, 0x00000408, 0x08000408, + 0x00020000, 0x08020000, 0x00020008, 0x08020008, + 0x00020400, 0x08020400, 0x00020408, 0x08020408, + 0x00000001, 0x08000001, 0x00000009, 0x08000009, + 0x00000401, 0x08000401, 0x00000409, 0x08000409, + 0x00020001, 0x08020001, 0x00020009, 0x08020009, + 0x00020401, 0x08020401, 0x00020409, 0x08020409, + 0x02000000, 0x0A000000, 0x02000008, 0x0A000008, + 0x02000400, 0x0A000400, 0x02000408, 0x0A000408, + 0x02020000, 0x0A020000, 0x02020008, 0x0A020008, + 0x02020400, 0x0A020400, 0x02020408, 0x0A020408, + 0x02000001, 0x0A000001, 0x02000009, 0x0A000009, + 0x02000401, 0x0A000401, 0x02000409, 0x0A000409, + 0x02020001, 0x0A020001, 0x02020009, 0x0A020009, + 0x02020401, 0x0A020401, 0x02020409, 0x0A020409, + /* for D bits (numbered as per FIPS 46) 16 17 18 19 20 21 */ + 0x00000000, 0x00000100, 0x00080000, 0x00080100, + 0x01000000, 0x01000100, 0x01080000, 0x01080100, + 0x00000010, 0x00000110, 0x00080010, 0x00080110, + 0x01000010, 0x01000110, 0x01080010, 0x01080110, + 0x00200000, 0x00200100, 0x00280000, 0x00280100, + 0x01200000, 0x01200100, 0x01280000, 0x01280100, + 0x00200010, 0x00200110, 0x00280010, 0x00280110, + 0x01200010, 0x01200110, 0x01280010, 0x01280110, + 0x00000200, 0x00000300, 0x00080200, 0x00080300, + 0x01000200, 0x01000300, 0x01080200, 0x01080300, + 0x00000210, 0x00000310, 0x00080210, 0x00080310, + 0x01000210, 0x01000310, 0x01080210, 0x01080310, + 0x00200200, 0x00200300, 0x00280200, 0x00280300, + 0x01200200, 0x01200300, 0x01280200, 0x01280300, + 0x00200210, 0x00200310, 0x00280210, 0x00280310, + 0x01200210, 0x01200310, 0x01280210, 0x01280310, + /* for D bits (numbered as per FIPS 46) 22 23 24 25 27 28 */ + 0x00000000, 0x04000000, 0x00040000, 0x04040000, + 0x00000002, 0x04000002, 0x00040002, 0x04040002, + 0x00002000, 0x04002000, 0x00042000, 0x04042000, + 0x00002002, 0x04002002, 0x00042002, 0x04042002, + 0x00000020, 0x04000020, 0x00040020, 0x04040020, + 0x00000022, 0x04000022, 0x00040022, 0x04040022, + 0x00002020, 0x04002020, 0x00042020, 0x04042020, + 0x00002022, 0x04002022, 0x00042022, 0x04042022, + 0x00000800, 0x04000800, 0x00040800, 0x04040800, + 0x00000802, 0x04000802, 0x00040802, 0x04040802, + 0x00002800, 0x04002800, 0x00042800, 0x04042800, + 0x00002802, 0x04002802, 0x00042802, 0x04042802, + 0x00000820, 0x04000820, 0x00040820, 0x04040820, + 0x00000822, 0x04000822, 0x00040822, 0x04040822, + 0x00002820, 0x04002820, 0x00042820, 0x04042820, + 0x00002822, 0x04002822, 0x00042822, 0x04042822, +}; + +#define NBOX(i,n,S) (S)[(n)][(i)] + +__device__ static void _des_crypt_encrypt (u32x iv[2], u32x data[2], u32x Kc[16], u32x Kd[16], u32 s_SPtrans[8][64]) +{ + u32x tt; + + u32x r = data[0]; + u32x l = data[1]; + + #pragma unroll 16 + for (u32 i = 0; i < 16; i++) + { + u32x u = Kc[i] ^ r; + u32x t = Kd[i] ^ rotl32 (r, 28u); + + #ifdef VECT_SIZE1 + l ^= NBOX (((u >> 2) & 0x3f), 0, s_SPtrans) + | NBOX (((u >> 10) & 0x3f), 2, s_SPtrans) + | NBOX (((u >> 18) & 0x3f), 4, s_SPtrans) + | NBOX (((u >> 26) & 0x3f), 6, s_SPtrans) + | NBOX (((t >> 2) & 0x3f), 1, s_SPtrans) + | NBOX (((t >> 10) & 0x3f), 3, s_SPtrans) + | NBOX (((t >> 18) & 0x3f), 5, s_SPtrans) + | NBOX (((t >> 26) & 0x3f), 7, s_SPtrans); + #endif + + #ifdef VECT_SIZE2 + l.s0 ^= NBOX (((u.s0 >> 2) & 0x3f), 0, s_SPtrans) + | NBOX (((u.s0 >> 10) & 0x3f), 2, s_SPtrans) + | NBOX (((u.s0 >> 18) & 0x3f), 4, s_SPtrans) + | NBOX (((u.s0 >> 26) & 0x3f), 6, s_SPtrans) + | NBOX (((t.s0 >> 2) & 0x3f), 1, s_SPtrans) + | NBOX (((t.s0 >> 10) & 0x3f), 3, s_SPtrans) + | NBOX (((t.s0 >> 18) & 0x3f), 5, s_SPtrans) + | NBOX (((t.s0 >> 26) & 0x3f), 7, s_SPtrans); + + l.s1 ^= NBOX (((u.s1 >> 2) & 0x3f), 0, s_SPtrans) + | NBOX (((u.s1 >> 10) & 0x3f), 2, s_SPtrans) + | NBOX (((u.s1 >> 18) & 0x3f), 4, s_SPtrans) + | NBOX (((u.s1 >> 26) & 0x3f), 6, s_SPtrans) + | NBOX (((t.s1 >> 2) & 0x3f), 1, s_SPtrans) + | NBOX (((t.s1 >> 10) & 0x3f), 3, s_SPtrans) + | NBOX (((t.s1 >> 18) & 0x3f), 5, s_SPtrans) + | NBOX (((t.s1 >> 26) & 0x3f), 7, s_SPtrans); + #endif + + tt = l; + l = r; + r = tt; + } + + iv[0] = l; + iv[1] = r; +} + +__device__ static void _des_crypt_keysetup (u32x c, u32x d, u32x Kc[16], u32x Kd[16], u32 s_skb[8][64]) +{ + u32x tt; + + PERM_OP (d, c, tt, 4, 0x0f0f0f0f); + HPERM_OP (c, tt, 2, 0xcccc0000); + HPERM_OP (d, tt, 2, 0xcccc0000); + PERM_OP (d, c, tt, 1, 0x55555555); + PERM_OP (c, d, tt, 8, 0x00ff00ff); + PERM_OP (d, c, tt, 1, 0x55555555); + + d = ((d & 0x000000ff) << 16) + | ((d & 0x0000ff00) << 0) + | ((d & 0x00ff0000) >> 16) + | ((c & 0xf0000000) >> 4); + + c = c & 0x0fffffff; + + //#pragma unroll 16 + for (u32 i = 0; i < 16; i++) + { + const u32 shifts3s0[16] = { 1, 1, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 1 }; + const u32 shifts3s1[16] = { 27, 27, 26, 26, 26, 26, 26, 26, 27, 26, 26, 26, 26, 26, 26, 27 }; + + c = c >> shifts3s0[i] | c << shifts3s1[i]; + d = d >> shifts3s0[i] | d << shifts3s1[i]; + + c = c & 0x0fffffff; + d = d & 0x0fffffff; + + u32x s; + u32x t; + + #ifdef VECT_SIZE1 + s = NBOX ((( c >> 0) & 0x3f), 0, s_skb) + | NBOX ((((c >> 6) & 0x03) + | ((c >> 7) & 0x3c)), 1, s_skb) + | NBOX ((((c >> 13) & 0x0f) + | ((c >> 14) & 0x30)), 2, s_skb) + | NBOX ((((c >> 20) & 0x01) + | ((c >> 21) & 0x06) + | ((c >> 22) & 0x38)), 3, s_skb); + + t = NBOX ((( d >> 0) & 0x3f), 4, s_skb) + | NBOX ((((d >> 7) & 0x03) + | ((d >> 8) & 0x3c)), 5, s_skb) + | NBOX ((((d >> 15) & 0x3f)), 6, s_skb) + | NBOX ((((d >> 21) & 0x0f) + | ((d >> 22) & 0x30)), 7, s_skb); + #endif + + #ifdef VECT_SIZE2 + s.s0 = NBOX ((( c.s0 >> 0) & 0x3f), 0, s_skb) + | NBOX ((((c.s0 >> 6) & 0x03) + | ((c.s0 >> 7) & 0x3c)), 1, s_skb) + | NBOX ((((c.s0 >> 13) & 0x0f) + | ((c.s0 >> 14) & 0x30)), 2, s_skb) + | NBOX ((((c.s0 >> 20) & 0x01) + | ((c.s0 >> 21) & 0x06) + | ((c.s0 >> 22) & 0x38)), 3, s_skb); + + t.s0 = NBOX ((( d.s0 >> 0) & 0x3f), 4, s_skb) + | NBOX ((((d.s0 >> 7) & 0x03) + | ((d.s0 >> 8) & 0x3c)), 5, s_skb) + | NBOX ((((d.s0 >> 15) & 0x3f)), 6, s_skb) + | NBOX ((((d.s0 >> 21) & 0x0f) + | ((d.s0 >> 22) & 0x30)), 7, s_skb); + + s.s1 = NBOX ((( c.s1 >> 0) & 0x3f), 0, s_skb) + | NBOX ((((c.s1 >> 6) & 0x03) + | ((c.s1 >> 7) & 0x3c)), 1, s_skb) + | NBOX ((((c.s1 >> 13) & 0x0f) + | ((c.s1 >> 14) & 0x30)), 2, s_skb) + | NBOX ((((c.s1 >> 20) & 0x01) + | ((c.s1 >> 21) & 0x06) + | ((c.s1 >> 22) & 0x38)), 3, s_skb); + + t.s1 = NBOX ((( d.s1 >> 0) & 0x3f), 4, s_skb) + | NBOX ((((d.s1 >> 7) & 0x03) + | ((d.s1 >> 8) & 0x3c)), 5, s_skb) + | NBOX ((((d.s1 >> 15) & 0x3f)), 6, s_skb) + | NBOX ((((d.s1 >> 21) & 0x0f) + | ((d.s1 >> 22) & 0x30)), 7, s_skb); + #endif + + #if __CUDA_ARCH__ >= 200 + Kc[i] = __byte_perm (s, t, 0x5410); + Kd[i] = __byte_perm (s, t, 0x7632); + #else + Kc[i] = ((t << 16) | (s & 0x0000ffff)); + Kd[i] = ((s >> 16) | (t & 0xffff0000)); + #endif + + Kc[i] = rotl32 (Kc[i], 2u); + Kd[i] = rotl32 (Kd[i], 2u); + } +} + +__device__ static void transform_racf_key (const u32x w0, const u32x w1, u32x key[2]) +{ + #ifdef VECT_SIZE1 + + key[0] = (ascii_to_ebcdic_pc[(w0 >> 0) & 0xff]) << 0 + | (ascii_to_ebcdic_pc[(w0 >> 8) & 0xff]) << 8 + | (ascii_to_ebcdic_pc[(w0 >> 16) & 0xff]) << 16 + | (ascii_to_ebcdic_pc[(w0 >> 24) & 0xff]) << 24; + + key[1] = (ascii_to_ebcdic_pc[(w1 >> 0) & 0xff]) << 0 + | (ascii_to_ebcdic_pc[(w1 >> 8) & 0xff]) << 8 + | (ascii_to_ebcdic_pc[(w1 >> 16) & 0xff]) << 16 + | (ascii_to_ebcdic_pc[(w1 >> 24) & 0xff]) << 24; + #endif + + #ifdef VECT_SIZE2 + + key[0].s0 = (ascii_to_ebcdic_pc[(w0.s0 >> 0) & 0xff]) << 0 + | (ascii_to_ebcdic_pc[(w0.s0 >> 8) & 0xff]) << 8 + | (ascii_to_ebcdic_pc[(w0.s0 >> 16) & 0xff]) << 16 + | (ascii_to_ebcdic_pc[(w0.s0 >> 24) & 0xff]) << 24; + + key[0].s1 = (ascii_to_ebcdic_pc[(w0.s1 >> 0) & 0xff]) << 0 + | (ascii_to_ebcdic_pc[(w0.s1 >> 8) & 0xff]) << 8 + | (ascii_to_ebcdic_pc[(w0.s1 >> 16) & 0xff]) << 16 + | (ascii_to_ebcdic_pc[(w0.s1 >> 24) & 0xff]) << 24; + + key[1].s0 = (ascii_to_ebcdic_pc[(w1.s0 >> 0) & 0xff]) << 0 + | (ascii_to_ebcdic_pc[(w1.s0 >> 8) & 0xff]) << 8 + | (ascii_to_ebcdic_pc[(w1.s0 >> 16) & 0xff]) << 16 + | (ascii_to_ebcdic_pc[(w1.s0 >> 24) & 0xff]) << 24; + + key[1].s1 = (ascii_to_ebcdic_pc[(w1.s1 >> 0) & 0xff]) << 0 + | (ascii_to_ebcdic_pc[(w1.s1 >> 8) & 0xff]) << 8 + | (ascii_to_ebcdic_pc[(w1.s1 >> 16) & 0xff]) << 16 + | (ascii_to_ebcdic_pc[(w1.s1 >> 24) & 0xff]) << 24; + #endif +} + +__device__ __constant__ comb_t c_combs[1024]; + +extern "C" __global__ void __launch_bounds__ (256, 1) m08500_m04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = 0; + wordl0[3] = 0; + + u32x wordl1[4]; + + wordl1[0] = 0; + wordl1[1] = 0; + wordl1[2] = 0; + wordl1[3] = 0; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, c_combs[0].pw_len); + } + + /** + * salt + */ + + u32 salt_buf0[2]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf_pc[0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf_pc[1]; + + /** + * sbox, kbox + */ + + __shared__ u32 s_SPtrans[8][64]; + + __shared__ u32 s_skb[8][64]; + + if (lid < 64) + { + s_SPtrans[0][lid] = c_SPtrans[0][lid]; + s_SPtrans[1][lid] = c_SPtrans[1][lid]; + s_SPtrans[2][lid] = c_SPtrans[2][lid]; + s_SPtrans[3][lid] = c_SPtrans[3][lid]; + s_SPtrans[4][lid] = c_SPtrans[4][lid]; + s_SPtrans[5][lid] = c_SPtrans[5][lid]; + s_SPtrans[6][lid] = c_SPtrans[6][lid]; + s_SPtrans[7][lid] = c_SPtrans[7][lid]; + + s_skb[0][lid] = c_skb[0][lid]; + s_skb[1][lid] = c_skb[1][lid]; + s_skb[2][lid] = c_skb[2][lid]; + s_skb[3][lid] = c_skb[3][lid]; + s_skb[4][lid] = c_skb[4][lid]; + s_skb[5][lid] = c_skb[5][lid]; + s_skb[6][lid] = c_skb[6][lid]; + s_skb[7][lid] = c_skb[7][lid]; + } + + __syncthreads (); + + if (gid >= gid_max) return; + + /** + * main + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = c_combs[il_pos].pw_len; + + u32 pw_len = pw_l_len + pw_r_len; + + pw_len = (pw_len >= 7) ? 7 : pw_len; + + u32 wordr0[4]; + + wordr0[0] = c_combs[il_pos].i[0]; + wordr0[1] = c_combs[il_pos].i[1]; + wordr0[2] = 0; + wordr0[3] = 0; + + u32 wordr1[4]; + + wordr1[0] = 0; + wordr1[1] = 0; + wordr1[2] = 0; + wordr1[3] = 0; + + u32 wordr2[4]; + + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + + u32 wordr3[4]; + + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + u32x w0[4]; + + w0[0] = wordl0[0] | wordr0[0]; + w0[1] = wordl0[1] | wordr0[1]; + w0[2] = 0; + w0[3] = 0; + + u32x key[2]; + + transform_racf_key (w0[0], w0[1], key); + + const u32x c = key[0]; + const u32x d = key[1]; + + u32x Kc[16]; + u32x Kd[16]; + + _des_crypt_keysetup (c, d, Kc, Kd, s_skb); + + u32x data[2]; + + data[0] = salt_buf0[0]; + data[1] = salt_buf0[1]; + + u32x iv[2]; + + _des_crypt_encrypt (iv, data, Kc, Kd, s_SPtrans); + + const u32x r0 = iv[0]; + const u32x r1 = iv[1]; + const u32x r2 = 0; + const u32x r3 = 0; + + #include VECT_COMPARE_M + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m08500_m08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m08500_m16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m08500_s04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = 0; + wordl0[3] = 0; + + u32x wordl1[4]; + + wordl1[0] = 0; + wordl1[1] = 0; + wordl1[2] = 0; + wordl1[3] = 0; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, c_combs[0].pw_len); + } + + /** + * salt + */ + + u32 salt_buf0[2]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf_pc[0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf_pc[1]; + + /** + * sbox, kbox + */ + + __shared__ u32 s_SPtrans[8][64]; + + __shared__ u32 s_skb[8][64]; + + if (lid < 64) + { + s_SPtrans[0][lid] = c_SPtrans[0][lid]; + s_SPtrans[1][lid] = c_SPtrans[1][lid]; + s_SPtrans[2][lid] = c_SPtrans[2][lid]; + s_SPtrans[3][lid] = c_SPtrans[3][lid]; + s_SPtrans[4][lid] = c_SPtrans[4][lid]; + s_SPtrans[5][lid] = c_SPtrans[5][lid]; + s_SPtrans[6][lid] = c_SPtrans[6][lid]; + s_SPtrans[7][lid] = c_SPtrans[7][lid]; + + s_skb[0][lid] = c_skb[0][lid]; + s_skb[1][lid] = c_skb[1][lid]; + s_skb[2][lid] = c_skb[2][lid]; + s_skb[3][lid] = c_skb[3][lid]; + s_skb[4][lid] = c_skb[4][lid]; + s_skb[5][lid] = c_skb[5][lid]; + s_skb[6][lid] = c_skb[6][lid]; + s_skb[7][lid] = c_skb[7][lid]; + } + + __syncthreads (); + + if (gid >= gid_max) return; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * main + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = c_combs[il_pos].pw_len; + + u32 pw_len = pw_l_len + pw_r_len; + + pw_len = (pw_len >= 7) ? 7 : pw_len; + + u32 wordr0[4]; + + wordr0[0] = c_combs[il_pos].i[0]; + wordr0[1] = c_combs[il_pos].i[1]; + wordr0[2] = 0; + wordr0[3] = 0; + + u32 wordr1[4]; + + wordr1[0] = 0; + wordr1[1] = 0; + wordr1[2] = 0; + wordr1[3] = 0; + + u32 wordr2[4]; + + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + + u32 wordr3[4]; + + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + u32x w0[4]; + + w0[0] = wordl0[0] | wordr0[0]; + w0[1] = wordl0[1] | wordr0[1]; + w0[2] = 0; + w0[3] = 0; + + u32x key[2]; + + transform_racf_key (w0[0], w0[1], key); + + const u32x c = key[0]; + const u32x d = key[1]; + + u32x Kc[16]; + u32x Kd[16]; + + _des_crypt_keysetup (c, d, Kc, Kd, s_skb); + + u32x data[2]; + + data[0] = salt_buf0[0]; + data[1] = salt_buf0[1]; + + u32x iv[2]; + + _des_crypt_encrypt (iv, data, Kc, Kd, s_SPtrans); + + const u32x r0 = iv[0]; + const u32x r1 = iv[1]; + const u32x r2 = 0; + const u32x r3 = 0; + + #include VECT_COMPARE_S + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m08500_s08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m08500_s16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/nv/m08500_a3.cu b/nv/m08500_a3.cu new file mode 100644 index 0000000000..541d7a8e33 --- /dev/null +++ b/nv/m08500_a3.cu @@ -0,0 +1,863 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _DES_ +#define _SCALAR_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW2 +#define VECT_SIZE1 +#endif + +#define DGST_R0 0 +#define DGST_R1 1 +#define DGST_R2 2 +#define DGST_R3 3 + +#include "include/kernel_functions.c" +#include "types_nv.c" +#include "common_nv.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4_warp.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4_warp.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4_warp.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4_warp.c" +#endif + +#define PERM_OP(a,b,tt,n,m) \ +{ \ + tt = a >> n; \ + tt = tt ^ b; \ + tt = tt & m; \ + b = b ^ tt; \ + tt = tt << n; \ + a = a ^ tt; \ +} + +#define HPERM_OP(a,tt,n,m) \ +{ \ + tt = a << (16 + n); \ + tt = tt ^ a; \ + tt = tt & m; \ + a = a ^ tt; \ + tt = tt >> (16 + n); \ + a = a ^ tt; \ +} + +#define IP(l,r,tt) \ +{ \ + PERM_OP (r, l, tt, 4, 0x0f0f0f0f); \ + PERM_OP (l, r, tt, 16, 0x0000ffff); \ + PERM_OP (r, l, tt, 2, 0x33333333); \ + PERM_OP (l, r, tt, 8, 0x00ff00ff); \ + PERM_OP (r, l, tt, 1, 0x55555555); \ +} + +#define FP(l,r,tt) \ +{ \ + PERM_OP (l, r, tt, 1, 0x55555555); \ + PERM_OP (r, l, tt, 8, 0x00ff00ff); \ + PERM_OP (l, r, tt, 2, 0x33333333); \ + PERM_OP (r, l, tt, 16, 0x0000ffff); \ + PERM_OP (l, r, tt, 4, 0x0f0f0f0f); \ +} + +__device__ __constant__ u8 ascii_to_ebcdic_pc[256] = +{ + // little hack, can't crack 0-bytes in password, but who cares + // 0xab, 0xa8, 0xae, 0xad, 0xc4, 0xf1, 0xf7, 0xf4, 0x86, 0xa1, 0xe0, 0xbc, 0xb3, 0xb0, 0xb6, 0xb5, + 0x2a, 0xa8, 0xae, 0xad, 0xc4, 0xf1, 0xf7, 0xf4, 0x86, 0xa1, 0xe0, 0xbc, 0xb3, 0xb0, 0xb6, 0xb5, + 0x8a, 0x89, 0x8f, 0x8c, 0xd3, 0xd0, 0xce, 0xe6, 0x9b, 0x98, 0xd5, 0xe5, 0x92, 0x91, 0x97, 0x94, + 0x2a, 0x34, 0x54, 0x5d, 0x1c, 0x73, 0x0b, 0x51, 0x31, 0x10, 0x13, 0x37, 0x7c, 0x6b, 0x3d, 0x68, + 0x4a, 0x49, 0x4f, 0x4c, 0x43, 0x40, 0x46, 0x45, 0x5b, 0x58, 0x5e, 0x16, 0x32, 0x57, 0x76, 0x75, + 0x52, 0x29, 0x2f, 0x2c, 0x23, 0x20, 0x26, 0x25, 0x3b, 0x38, 0x08, 0x0e, 0x0d, 0x02, 0x01, 0x07, + 0x04, 0x1a, 0x19, 0x6e, 0x6d, 0x62, 0x61, 0x67, 0x64, 0x7a, 0x79, 0x3e, 0x6b, 0x1f, 0x15, 0x70, + 0x58, 0xa8, 0xae, 0xad, 0xa2, 0xa1, 0xa7, 0xa4, 0xba, 0xb9, 0x89, 0x8f, 0x8c, 0x83, 0x80, 0x86, + 0x85, 0x9b, 0x98, 0xef, 0xec, 0xe3, 0xe0, 0xe6, 0xe5, 0xfb, 0xf8, 0x2a, 0x7f, 0x0b, 0xe9, 0xa4, + 0xea, 0xe9, 0xef, 0xec, 0xe3, 0x80, 0xa7, 0x85, 0xfb, 0xf8, 0xfe, 0xfd, 0xf2, 0xb9, 0xbf, 0x9d, + 0xcb, 0xc8, 0x9e, 0xcd, 0xc2, 0xc1, 0xc7, 0xba, 0xda, 0xd9, 0xdf, 0xdc, 0xa2, 0x83, 0xd6, 0x68, + 0x29, 0x2f, 0x2c, 0x23, 0x20, 0x26, 0x25, 0x3b, 0x38, 0x08, 0x0e, 0x0d, 0x02, 0x01, 0x07, 0x04, + 0x1a, 0x19, 0x6e, 0x6d, 0x62, 0x61, 0x67, 0x64, 0x7a, 0x79, 0x4a, 0x49, 0x4f, 0x4c, 0x43, 0x40, + 0x46, 0x45, 0x5b, 0xab, 0xbf, 0xbc, 0xb3, 0xb0, 0xb6, 0xb5, 0x8a, 0x9e, 0x9d, 0x92, 0x91, 0x97, + 0x94, 0xea, 0xfe, 0xfd, 0xf2, 0xf1, 0xf7, 0xf4, 0xcb, 0xc8, 0xce, 0xcd, 0xc2, 0xc1, 0xc7, 0xc4, + 0xda, 0xd9, 0xdf, 0xdc, 0xd3, 0xd0, 0xd6, 0xd5, 0x3e, 0x3d, 0x32, 0x31, 0x37, 0x34, 0x1f, 0x1c, + 0x13, 0x10, 0x16, 0x15, 0x7f, 0x7c, 0x73, 0x70, 0x76, 0x75, 0x5e, 0x5d, 0x52, 0x51, 0x57, 0x54, +}; + +__device__ __constant__ u32 c_SPtrans[8][64] = +{ + /* nibble 0 */ + 0x02080800, 0x00080000, 0x02000002, 0x02080802, + 0x02000000, 0x00080802, 0x00080002, 0x02000002, + 0x00080802, 0x02080800, 0x02080000, 0x00000802, + 0x02000802, 0x02000000, 0x00000000, 0x00080002, + 0x00080000, 0x00000002, 0x02000800, 0x00080800, + 0x02080802, 0x02080000, 0x00000802, 0x02000800, + 0x00000002, 0x00000800, 0x00080800, 0x02080002, + 0x00000800, 0x02000802, 0x02080002, 0x00000000, + 0x00000000, 0x02080802, 0x02000800, 0x00080002, + 0x02080800, 0x00080000, 0x00000802, 0x02000800, + 0x02080002, 0x00000800, 0x00080800, 0x02000002, + 0x00080802, 0x00000002, 0x02000002, 0x02080000, + 0x02080802, 0x00080800, 0x02080000, 0x02000802, + 0x02000000, 0x00000802, 0x00080002, 0x00000000, + 0x00080000, 0x02000000, 0x02000802, 0x02080800, + 0x00000002, 0x02080002, 0x00000800, 0x00080802, + /* nibble 1 */ + 0x40108010, 0x00000000, 0x00108000, 0x40100000, + 0x40000010, 0x00008010, 0x40008000, 0x00108000, + 0x00008000, 0x40100010, 0x00000010, 0x40008000, + 0x00100010, 0x40108000, 0x40100000, 0x00000010, + 0x00100000, 0x40008010, 0x40100010, 0x00008000, + 0x00108010, 0x40000000, 0x00000000, 0x00100010, + 0x40008010, 0x00108010, 0x40108000, 0x40000010, + 0x40000000, 0x00100000, 0x00008010, 0x40108010, + 0x00100010, 0x40108000, 0x40008000, 0x00108010, + 0x40108010, 0x00100010, 0x40000010, 0x00000000, + 0x40000000, 0x00008010, 0x00100000, 0x40100010, + 0x00008000, 0x40000000, 0x00108010, 0x40008010, + 0x40108000, 0x00008000, 0x00000000, 0x40000010, + 0x00000010, 0x40108010, 0x00108000, 0x40100000, + 0x40100010, 0x00100000, 0x00008010, 0x40008000, + 0x40008010, 0x00000010, 0x40100000, 0x00108000, + /* nibble 2 */ + 0x04000001, 0x04040100, 0x00000100, 0x04000101, + 0x00040001, 0x04000000, 0x04000101, 0x00040100, + 0x04000100, 0x00040000, 0x04040000, 0x00000001, + 0x04040101, 0x00000101, 0x00000001, 0x04040001, + 0x00000000, 0x00040001, 0x04040100, 0x00000100, + 0x00000101, 0x04040101, 0x00040000, 0x04000001, + 0x04040001, 0x04000100, 0x00040101, 0x04040000, + 0x00040100, 0x00000000, 0x04000000, 0x00040101, + 0x04040100, 0x00000100, 0x00000001, 0x00040000, + 0x00000101, 0x00040001, 0x04040000, 0x04000101, + 0x00000000, 0x04040100, 0x00040100, 0x04040001, + 0x00040001, 0x04000000, 0x04040101, 0x00000001, + 0x00040101, 0x04000001, 0x04000000, 0x04040101, + 0x00040000, 0x04000100, 0x04000101, 0x00040100, + 0x04000100, 0x00000000, 0x04040001, 0x00000101, + 0x04000001, 0x00040101, 0x00000100, 0x04040000, + /* nibble 3 */ + 0x00401008, 0x10001000, 0x00000008, 0x10401008, + 0x00000000, 0x10400000, 0x10001008, 0x00400008, + 0x10401000, 0x10000008, 0x10000000, 0x00001008, + 0x10000008, 0x00401008, 0x00400000, 0x10000000, + 0x10400008, 0x00401000, 0x00001000, 0x00000008, + 0x00401000, 0x10001008, 0x10400000, 0x00001000, + 0x00001008, 0x00000000, 0x00400008, 0x10401000, + 0x10001000, 0x10400008, 0x10401008, 0x00400000, + 0x10400008, 0x00001008, 0x00400000, 0x10000008, + 0x00401000, 0x10001000, 0x00000008, 0x10400000, + 0x10001008, 0x00000000, 0x00001000, 0x00400008, + 0x00000000, 0x10400008, 0x10401000, 0x00001000, + 0x10000000, 0x10401008, 0x00401008, 0x00400000, + 0x10401008, 0x00000008, 0x10001000, 0x00401008, + 0x00400008, 0x00401000, 0x10400000, 0x10001008, + 0x00001008, 0x10000000, 0x10000008, 0x10401000, + /* nibble 4 */ + 0x08000000, 0x00010000, 0x00000400, 0x08010420, + 0x08010020, 0x08000400, 0x00010420, 0x08010000, + 0x00010000, 0x00000020, 0x08000020, 0x00010400, + 0x08000420, 0x08010020, 0x08010400, 0x00000000, + 0x00010400, 0x08000000, 0x00010020, 0x00000420, + 0x08000400, 0x00010420, 0x00000000, 0x08000020, + 0x00000020, 0x08000420, 0x08010420, 0x00010020, + 0x08010000, 0x00000400, 0x00000420, 0x08010400, + 0x08010400, 0x08000420, 0x00010020, 0x08010000, + 0x00010000, 0x00000020, 0x08000020, 0x08000400, + 0x08000000, 0x00010400, 0x08010420, 0x00000000, + 0x00010420, 0x08000000, 0x00000400, 0x00010020, + 0x08000420, 0x00000400, 0x00000000, 0x08010420, + 0x08010020, 0x08010400, 0x00000420, 0x00010000, + 0x00010400, 0x08010020, 0x08000400, 0x00000420, + 0x00000020, 0x00010420, 0x08010000, 0x08000020, + /* nibble 5 */ + 0x80000040, 0x00200040, 0x00000000, 0x80202000, + 0x00200040, 0x00002000, 0x80002040, 0x00200000, + 0x00002040, 0x80202040, 0x00202000, 0x80000000, + 0x80002000, 0x80000040, 0x80200000, 0x00202040, + 0x00200000, 0x80002040, 0x80200040, 0x00000000, + 0x00002000, 0x00000040, 0x80202000, 0x80200040, + 0x80202040, 0x80200000, 0x80000000, 0x00002040, + 0x00000040, 0x00202000, 0x00202040, 0x80002000, + 0x00002040, 0x80000000, 0x80002000, 0x00202040, + 0x80202000, 0x00200040, 0x00000000, 0x80002000, + 0x80000000, 0x00002000, 0x80200040, 0x00200000, + 0x00200040, 0x80202040, 0x00202000, 0x00000040, + 0x80202040, 0x00202000, 0x00200000, 0x80002040, + 0x80000040, 0x80200000, 0x00202040, 0x00000000, + 0x00002000, 0x80000040, 0x80002040, 0x80202000, + 0x80200000, 0x00002040, 0x00000040, 0x80200040, + /* nibble 6 */ + 0x00004000, 0x00000200, 0x01000200, 0x01000004, + 0x01004204, 0x00004004, 0x00004200, 0x00000000, + 0x01000000, 0x01000204, 0x00000204, 0x01004000, + 0x00000004, 0x01004200, 0x01004000, 0x00000204, + 0x01000204, 0x00004000, 0x00004004, 0x01004204, + 0x00000000, 0x01000200, 0x01000004, 0x00004200, + 0x01004004, 0x00004204, 0x01004200, 0x00000004, + 0x00004204, 0x01004004, 0x00000200, 0x01000000, + 0x00004204, 0x01004000, 0x01004004, 0x00000204, + 0x00004000, 0x00000200, 0x01000000, 0x01004004, + 0x01000204, 0x00004204, 0x00004200, 0x00000000, + 0x00000200, 0x01000004, 0x00000004, 0x01000200, + 0x00000000, 0x01000204, 0x01000200, 0x00004200, + 0x00000204, 0x00004000, 0x01004204, 0x01000000, + 0x01004200, 0x00000004, 0x00004004, 0x01004204, + 0x01000004, 0x01004200, 0x01004000, 0x00004004, + /* nibble 7 */ + 0x20800080, 0x20820000, 0x00020080, 0x00000000, + 0x20020000, 0x00800080, 0x20800000, 0x20820080, + 0x00000080, 0x20000000, 0x00820000, 0x00020080, + 0x00820080, 0x20020080, 0x20000080, 0x20800000, + 0x00020000, 0x00820080, 0x00800080, 0x20020000, + 0x20820080, 0x20000080, 0x00000000, 0x00820000, + 0x20000000, 0x00800000, 0x20020080, 0x20800080, + 0x00800000, 0x00020000, 0x20820000, 0x00000080, + 0x00800000, 0x00020000, 0x20000080, 0x20820080, + 0x00020080, 0x20000000, 0x00000000, 0x00820000, + 0x20800080, 0x20020080, 0x20020000, 0x00800080, + 0x20820000, 0x00000080, 0x00800080, 0x20020000, + 0x20820080, 0x00800000, 0x20800000, 0x20000080, + 0x00820000, 0x00020080, 0x20020080, 0x20800000, + 0x00000080, 0x20820000, 0x00820080, 0x00000000, + 0x20000000, 0x20800080, 0x00020000, 0x00820080, +}; + +__device__ __constant__ u32 c_skb[8][64] = +{ + /* for C bits (numbered as per FIPS 46) 1 2 3 4 5 6 */ + 0x00000000, 0x00000010, 0x20000000, 0x20000010, + 0x00010000, 0x00010010, 0x20010000, 0x20010010, + 0x00000800, 0x00000810, 0x20000800, 0x20000810, + 0x00010800, 0x00010810, 0x20010800, 0x20010810, + 0x00000020, 0x00000030, 0x20000020, 0x20000030, + 0x00010020, 0x00010030, 0x20010020, 0x20010030, + 0x00000820, 0x00000830, 0x20000820, 0x20000830, + 0x00010820, 0x00010830, 0x20010820, 0x20010830, + 0x00080000, 0x00080010, 0x20080000, 0x20080010, + 0x00090000, 0x00090010, 0x20090000, 0x20090010, + 0x00080800, 0x00080810, 0x20080800, 0x20080810, + 0x00090800, 0x00090810, 0x20090800, 0x20090810, + 0x00080020, 0x00080030, 0x20080020, 0x20080030, + 0x00090020, 0x00090030, 0x20090020, 0x20090030, + 0x00080820, 0x00080830, 0x20080820, 0x20080830, + 0x00090820, 0x00090830, 0x20090820, 0x20090830, + /* for C bits (numbered as per FIPS 46) 7 8 10 11 12 13 */ + 0x00000000, 0x02000000, 0x00002000, 0x02002000, + 0x00200000, 0x02200000, 0x00202000, 0x02202000, + 0x00000004, 0x02000004, 0x00002004, 0x02002004, + 0x00200004, 0x02200004, 0x00202004, 0x02202004, + 0x00000400, 0x02000400, 0x00002400, 0x02002400, + 0x00200400, 0x02200400, 0x00202400, 0x02202400, + 0x00000404, 0x02000404, 0x00002404, 0x02002404, + 0x00200404, 0x02200404, 0x00202404, 0x02202404, + 0x10000000, 0x12000000, 0x10002000, 0x12002000, + 0x10200000, 0x12200000, 0x10202000, 0x12202000, + 0x10000004, 0x12000004, 0x10002004, 0x12002004, + 0x10200004, 0x12200004, 0x10202004, 0x12202004, + 0x10000400, 0x12000400, 0x10002400, 0x12002400, + 0x10200400, 0x12200400, 0x10202400, 0x12202400, + 0x10000404, 0x12000404, 0x10002404, 0x12002404, + 0x10200404, 0x12200404, 0x10202404, 0x12202404, + /* for C bits (numbered as per FIPS 46) 14 15 16 17 19 20 */ + 0x00000000, 0x00000001, 0x00040000, 0x00040001, + 0x01000000, 0x01000001, 0x01040000, 0x01040001, + 0x00000002, 0x00000003, 0x00040002, 0x00040003, + 0x01000002, 0x01000003, 0x01040002, 0x01040003, + 0x00000200, 0x00000201, 0x00040200, 0x00040201, + 0x01000200, 0x01000201, 0x01040200, 0x01040201, + 0x00000202, 0x00000203, 0x00040202, 0x00040203, + 0x01000202, 0x01000203, 0x01040202, 0x01040203, + 0x08000000, 0x08000001, 0x08040000, 0x08040001, + 0x09000000, 0x09000001, 0x09040000, 0x09040001, + 0x08000002, 0x08000003, 0x08040002, 0x08040003, + 0x09000002, 0x09000003, 0x09040002, 0x09040003, + 0x08000200, 0x08000201, 0x08040200, 0x08040201, + 0x09000200, 0x09000201, 0x09040200, 0x09040201, + 0x08000202, 0x08000203, 0x08040202, 0x08040203, + 0x09000202, 0x09000203, 0x09040202, 0x09040203, + /* for C bits (numbered as per FIPS 46) 21 23 24 26 27 28 */ + 0x00000000, 0x00100000, 0x00000100, 0x00100100, + 0x00000008, 0x00100008, 0x00000108, 0x00100108, + 0x00001000, 0x00101000, 0x00001100, 0x00101100, + 0x00001008, 0x00101008, 0x00001108, 0x00101108, + 0x04000000, 0x04100000, 0x04000100, 0x04100100, + 0x04000008, 0x04100008, 0x04000108, 0x04100108, + 0x04001000, 0x04101000, 0x04001100, 0x04101100, + 0x04001008, 0x04101008, 0x04001108, 0x04101108, + 0x00020000, 0x00120000, 0x00020100, 0x00120100, + 0x00020008, 0x00120008, 0x00020108, 0x00120108, + 0x00021000, 0x00121000, 0x00021100, 0x00121100, + 0x00021008, 0x00121008, 0x00021108, 0x00121108, + 0x04020000, 0x04120000, 0x04020100, 0x04120100, + 0x04020008, 0x04120008, 0x04020108, 0x04120108, + 0x04021000, 0x04121000, 0x04021100, 0x04121100, + 0x04021008, 0x04121008, 0x04021108, 0x04121108, + /* for D bits (numbered as per FIPS 46) 1 2 3 4 5 6 */ + 0x00000000, 0x10000000, 0x00010000, 0x10010000, + 0x00000004, 0x10000004, 0x00010004, 0x10010004, + 0x20000000, 0x30000000, 0x20010000, 0x30010000, + 0x20000004, 0x30000004, 0x20010004, 0x30010004, + 0x00100000, 0x10100000, 0x00110000, 0x10110000, + 0x00100004, 0x10100004, 0x00110004, 0x10110004, + 0x20100000, 0x30100000, 0x20110000, 0x30110000, + 0x20100004, 0x30100004, 0x20110004, 0x30110004, + 0x00001000, 0x10001000, 0x00011000, 0x10011000, + 0x00001004, 0x10001004, 0x00011004, 0x10011004, + 0x20001000, 0x30001000, 0x20011000, 0x30011000, + 0x20001004, 0x30001004, 0x20011004, 0x30011004, + 0x00101000, 0x10101000, 0x00111000, 0x10111000, + 0x00101004, 0x10101004, 0x00111004, 0x10111004, + 0x20101000, 0x30101000, 0x20111000, 0x30111000, + 0x20101004, 0x30101004, 0x20111004, 0x30111004, + /* for D bits (numbered as per FIPS 46) 8 9 11 12 13 14 */ + 0x00000000, 0x08000000, 0x00000008, 0x08000008, + 0x00000400, 0x08000400, 0x00000408, 0x08000408, + 0x00020000, 0x08020000, 0x00020008, 0x08020008, + 0x00020400, 0x08020400, 0x00020408, 0x08020408, + 0x00000001, 0x08000001, 0x00000009, 0x08000009, + 0x00000401, 0x08000401, 0x00000409, 0x08000409, + 0x00020001, 0x08020001, 0x00020009, 0x08020009, + 0x00020401, 0x08020401, 0x00020409, 0x08020409, + 0x02000000, 0x0A000000, 0x02000008, 0x0A000008, + 0x02000400, 0x0A000400, 0x02000408, 0x0A000408, + 0x02020000, 0x0A020000, 0x02020008, 0x0A020008, + 0x02020400, 0x0A020400, 0x02020408, 0x0A020408, + 0x02000001, 0x0A000001, 0x02000009, 0x0A000009, + 0x02000401, 0x0A000401, 0x02000409, 0x0A000409, + 0x02020001, 0x0A020001, 0x02020009, 0x0A020009, + 0x02020401, 0x0A020401, 0x02020409, 0x0A020409, + /* for D bits (numbered as per FIPS 46) 16 17 18 19 20 21 */ + 0x00000000, 0x00000100, 0x00080000, 0x00080100, + 0x01000000, 0x01000100, 0x01080000, 0x01080100, + 0x00000010, 0x00000110, 0x00080010, 0x00080110, + 0x01000010, 0x01000110, 0x01080010, 0x01080110, + 0x00200000, 0x00200100, 0x00280000, 0x00280100, + 0x01200000, 0x01200100, 0x01280000, 0x01280100, + 0x00200010, 0x00200110, 0x00280010, 0x00280110, + 0x01200010, 0x01200110, 0x01280010, 0x01280110, + 0x00000200, 0x00000300, 0x00080200, 0x00080300, + 0x01000200, 0x01000300, 0x01080200, 0x01080300, + 0x00000210, 0x00000310, 0x00080210, 0x00080310, + 0x01000210, 0x01000310, 0x01080210, 0x01080310, + 0x00200200, 0x00200300, 0x00280200, 0x00280300, + 0x01200200, 0x01200300, 0x01280200, 0x01280300, + 0x00200210, 0x00200310, 0x00280210, 0x00280310, + 0x01200210, 0x01200310, 0x01280210, 0x01280310, + /* for D bits (numbered as per FIPS 46) 22 23 24 25 27 28 */ + 0x00000000, 0x04000000, 0x00040000, 0x04040000, + 0x00000002, 0x04000002, 0x00040002, 0x04040002, + 0x00002000, 0x04002000, 0x00042000, 0x04042000, + 0x00002002, 0x04002002, 0x00042002, 0x04042002, + 0x00000020, 0x04000020, 0x00040020, 0x04040020, + 0x00000022, 0x04000022, 0x00040022, 0x04040022, + 0x00002020, 0x04002020, 0x00042020, 0x04042020, + 0x00002022, 0x04002022, 0x00042022, 0x04042022, + 0x00000800, 0x04000800, 0x00040800, 0x04040800, + 0x00000802, 0x04000802, 0x00040802, 0x04040802, + 0x00002800, 0x04002800, 0x00042800, 0x04042800, + 0x00002802, 0x04002802, 0x00042802, 0x04042802, + 0x00000820, 0x04000820, 0x00040820, 0x04040820, + 0x00000822, 0x04000822, 0x00040822, 0x04040822, + 0x00002820, 0x04002820, 0x00042820, 0x04042820, + 0x00002822, 0x04002822, 0x00042822, 0x04042822, +}; + +#define NBOX(i,n,S) (S)[(n)][(i)] + +__device__ static void _des_crypt_encrypt (u32x iv[2], u32x data[2], u32x Kc[16], u32x Kd[16], u32 s_SPtrans[8][64]) +{ + u32x tt; + + u32x r = data[0]; + u32x l = data[1]; + + #pragma unroll 16 + for (u32 i = 0; i < 16; i++) + { + u32x u = Kc[i] ^ r; + u32x t = Kd[i] ^ rotl32 (r, 28u); + + #ifdef VECT_SIZE1 + l ^= NBOX (((u >> 2) & 0x3f), 0, s_SPtrans) + | NBOX (((u >> 10) & 0x3f), 2, s_SPtrans) + | NBOX (((u >> 18) & 0x3f), 4, s_SPtrans) + | NBOX (((u >> 26) & 0x3f), 6, s_SPtrans) + | NBOX (((t >> 2) & 0x3f), 1, s_SPtrans) + | NBOX (((t >> 10) & 0x3f), 3, s_SPtrans) + | NBOX (((t >> 18) & 0x3f), 5, s_SPtrans) + | NBOX (((t >> 26) & 0x3f), 7, s_SPtrans); + #endif + + #ifdef VECT_SIZE2 + l.s0 ^= NBOX (((u.s0 >> 2) & 0x3f), 0, s_SPtrans) + | NBOX (((u.s0 >> 10) & 0x3f), 2, s_SPtrans) + | NBOX (((u.s0 >> 18) & 0x3f), 4, s_SPtrans) + | NBOX (((u.s0 >> 26) & 0x3f), 6, s_SPtrans) + | NBOX (((t.s0 >> 2) & 0x3f), 1, s_SPtrans) + | NBOX (((t.s0 >> 10) & 0x3f), 3, s_SPtrans) + | NBOX (((t.s0 >> 18) & 0x3f), 5, s_SPtrans) + | NBOX (((t.s0 >> 26) & 0x3f), 7, s_SPtrans); + + l.s1 ^= NBOX (((u.s1 >> 2) & 0x3f), 0, s_SPtrans) + | NBOX (((u.s1 >> 10) & 0x3f), 2, s_SPtrans) + | NBOX (((u.s1 >> 18) & 0x3f), 4, s_SPtrans) + | NBOX (((u.s1 >> 26) & 0x3f), 6, s_SPtrans) + | NBOX (((t.s1 >> 2) & 0x3f), 1, s_SPtrans) + | NBOX (((t.s1 >> 10) & 0x3f), 3, s_SPtrans) + | NBOX (((t.s1 >> 18) & 0x3f), 5, s_SPtrans) + | NBOX (((t.s1 >> 26) & 0x3f), 7, s_SPtrans); + #endif + + tt = l; + l = r; + r = tt; + } + + iv[0] = l; + iv[1] = r; +} + +__device__ static void _des_crypt_keysetup (u32x c, u32x d, u32x Kc[16], u32x Kd[16], u32 s_skb[8][64]) +{ + u32x tt; + + PERM_OP (d, c, tt, 4, 0x0f0f0f0f); + HPERM_OP (c, tt, 2, 0xcccc0000); + HPERM_OP (d, tt, 2, 0xcccc0000); + PERM_OP (d, c, tt, 1, 0x55555555); + PERM_OP (c, d, tt, 8, 0x00ff00ff); + PERM_OP (d, c, tt, 1, 0x55555555); + + d = ((d & 0x000000ff) << 16) + | ((d & 0x0000ff00) << 0) + | ((d & 0x00ff0000) >> 16) + | ((c & 0xf0000000) >> 4); + + c = c & 0x0fffffff; + + //#pragma unroll 16 + for (u32 i = 0; i < 16; i++) + { + const u32 shifts3s0[16] = { 1, 1, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 1 }; + const u32 shifts3s1[16] = { 27, 27, 26, 26, 26, 26, 26, 26, 27, 26, 26, 26, 26, 26, 26, 27 }; + + c = c >> shifts3s0[i] | c << shifts3s1[i]; + d = d >> shifts3s0[i] | d << shifts3s1[i]; + + c = c & 0x0fffffff; + d = d & 0x0fffffff; + + u32x s; + u32x t; + + #ifdef VECT_SIZE1 + s = NBOX ((( c >> 0) & 0x3f), 0, s_skb) + | NBOX ((((c >> 6) & 0x03) + | ((c >> 7) & 0x3c)), 1, s_skb) + | NBOX ((((c >> 13) & 0x0f) + | ((c >> 14) & 0x30)), 2, s_skb) + | NBOX ((((c >> 20) & 0x01) + | ((c >> 21) & 0x06) + | ((c >> 22) & 0x38)), 3, s_skb); + + t = NBOX ((( d >> 0) & 0x3f), 4, s_skb) + | NBOX ((((d >> 7) & 0x03) + | ((d >> 8) & 0x3c)), 5, s_skb) + | NBOX ((((d >> 15) & 0x3f)), 6, s_skb) + | NBOX ((((d >> 21) & 0x0f) + | ((d >> 22) & 0x30)), 7, s_skb); + #endif + + #ifdef VECT_SIZE2 + s.s0 = NBOX ((( c.s0 >> 0) & 0x3f), 0, s_skb) + | NBOX ((((c.s0 >> 6) & 0x03) + | ((c.s0 >> 7) & 0x3c)), 1, s_skb) + | NBOX ((((c.s0 >> 13) & 0x0f) + | ((c.s0 >> 14) & 0x30)), 2, s_skb) + | NBOX ((((c.s0 >> 20) & 0x01) + | ((c.s0 >> 21) & 0x06) + | ((c.s0 >> 22) & 0x38)), 3, s_skb); + + t.s0 = NBOX ((( d.s0 >> 0) & 0x3f), 4, s_skb) + | NBOX ((((d.s0 >> 7) & 0x03) + | ((d.s0 >> 8) & 0x3c)), 5, s_skb) + | NBOX ((((d.s0 >> 15) & 0x3f)), 6, s_skb) + | NBOX ((((d.s0 >> 21) & 0x0f) + | ((d.s0 >> 22) & 0x30)), 7, s_skb); + + s.s1 = NBOX ((( c.s1 >> 0) & 0x3f), 0, s_skb) + | NBOX ((((c.s1 >> 6) & 0x03) + | ((c.s1 >> 7) & 0x3c)), 1, s_skb) + | NBOX ((((c.s1 >> 13) & 0x0f) + | ((c.s1 >> 14) & 0x30)), 2, s_skb) + | NBOX ((((c.s1 >> 20) & 0x01) + | ((c.s1 >> 21) & 0x06) + | ((c.s1 >> 22) & 0x38)), 3, s_skb); + + t.s1 = NBOX ((( d.s1 >> 0) & 0x3f), 4, s_skb) + | NBOX ((((d.s1 >> 7) & 0x03) + | ((d.s1 >> 8) & 0x3c)), 5, s_skb) + | NBOX ((((d.s1 >> 15) & 0x3f)), 6, s_skb) + | NBOX ((((d.s1 >> 21) & 0x0f) + | ((d.s1 >> 22) & 0x30)), 7, s_skb); + #endif + + #if __CUDA_ARCH__ >= 200 + Kc[i] = __byte_perm (s, t, 0x5410); + Kd[i] = __byte_perm (s, t, 0x7632); + #else + Kc[i] = ((t << 16) | (s & 0x0000ffff)); + Kd[i] = ((s >> 16) | (t & 0xffff0000)); + #endif + + Kc[i] = rotl32 (Kc[i], 2u); + Kd[i] = rotl32 (Kd[i], 2u); + } +} + +__device__ static void transform_racf_key (const u32x w0, const u32x w1, u32x key[2]) +{ + #ifdef VECT_SIZE1 + + key[0] = (ascii_to_ebcdic_pc[(w0 >> 0) & 0xff]) << 0 + | (ascii_to_ebcdic_pc[(w0 >> 8) & 0xff]) << 8 + | (ascii_to_ebcdic_pc[(w0 >> 16) & 0xff]) << 16 + | (ascii_to_ebcdic_pc[(w0 >> 24) & 0xff]) << 24; + + key[1] = (ascii_to_ebcdic_pc[(w1 >> 0) & 0xff]) << 0 + | (ascii_to_ebcdic_pc[(w1 >> 8) & 0xff]) << 8 + | (ascii_to_ebcdic_pc[(w1 >> 16) & 0xff]) << 16 + | (ascii_to_ebcdic_pc[(w1 >> 24) & 0xff]) << 24; + #endif + + #ifdef VECT_SIZE2 + + key[0].s0 = (ascii_to_ebcdic_pc[(w0.s0 >> 0) & 0xff]) << 0 + | (ascii_to_ebcdic_pc[(w0.s0 >> 8) & 0xff]) << 8 + | (ascii_to_ebcdic_pc[(w0.s0 >> 16) & 0xff]) << 16 + | (ascii_to_ebcdic_pc[(w0.s0 >> 24) & 0xff]) << 24; + + key[0].s1 = (ascii_to_ebcdic_pc[(w0.s1 >> 0) & 0xff]) << 0 + | (ascii_to_ebcdic_pc[(w0.s1 >> 8) & 0xff]) << 8 + | (ascii_to_ebcdic_pc[(w0.s1 >> 16) & 0xff]) << 16 + | (ascii_to_ebcdic_pc[(w0.s1 >> 24) & 0xff]) << 24; + + key[1].s0 = (ascii_to_ebcdic_pc[(w1.s0 >> 0) & 0xff]) << 0 + | (ascii_to_ebcdic_pc[(w1.s0 >> 8) & 0xff]) << 8 + | (ascii_to_ebcdic_pc[(w1.s0 >> 16) & 0xff]) << 16 + | (ascii_to_ebcdic_pc[(w1.s0 >> 24) & 0xff]) << 24; + + key[1].s1 = (ascii_to_ebcdic_pc[(w1.s1 >> 0) & 0xff]) << 0 + | (ascii_to_ebcdic_pc[(w1.s1 >> 8) & 0xff]) << 8 + | (ascii_to_ebcdic_pc[(w1.s1 >> 16) & 0xff]) << 16 + | (ascii_to_ebcdic_pc[(w1.s1 >> 24) & 0xff]) << 24; + #endif +} + +__shared__ u32 s_SPtrans[8][64]; + +__shared__ u32 s_skb[8][64]; + +__device__ __constant__ bf_t c_bfs[1024]; + +__device__ static void m08500m (u32x w[16], const u32 pw_len, const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset) +{ + /** + * modifier + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + const u32 lid = threadIdx.x; + + /** + * salt + */ + + u32 salt_buf0[2]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf_pc[0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf_pc[1]; + + /** + * loop + */ + + const u32 bf_loops = ceil ((float) bfs_cnt / VECT_DIV); + + u32x w0l = w[0]; + + u32x w1 = w[1]; + + for (u32 il_pos = 0; il_pos < bf_loops; il_pos++) + { + const u32x w0r = c_bfs[il_pos].i; + + const u32x w0 = w0l | w0r; + + u32x key[2]; + + transform_racf_key (w0, w1, key); + + const u32x c = key[0]; + const u32x d = key[1]; + + u32x Kc[16]; + u32x Kd[16]; + + _des_crypt_keysetup (c, d, Kc, Kd, s_skb); + + u32x data[2]; + + data[0] = salt_buf0[0]; + data[1] = salt_buf0[1]; + + u32x iv[2]; + + _des_crypt_encrypt (iv, data, Kc, Kd, s_SPtrans); + + const u32x r0 = iv[0]; + const u32x r1 = iv[1]; + const u32x r2 = 0; + const u32x r3 = 0; + + #include VECT_COMPARE_M + } +} + +__device__ static void m08500s (u32x w[16], const u32 pw_len, const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset) +{ + /** + * modifier + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + const u32 lid = threadIdx.x; + + /** + * salt + */ + + u32 salt_buf0[2]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf_pc[0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf_pc[1]; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * loop + */ + + const u32 bf_loops = ceil ((float) bfs_cnt / VECT_DIV); + + u32x w0l = w[0]; + + u32x w1 = w[1]; + + for (u32 il_pos = 0; il_pos < bf_loops; il_pos++) + { + const u32x w0r = c_bfs[il_pos].i; + + const u32x w0 = w0l | w0r; + + u32x key[2]; + + transform_racf_key (w0, w1, key); + + const u32x c = key[0]; + const u32x d = key[1]; + + u32x Kc[16]; + u32x Kd[16]; + + _des_crypt_keysetup (c, d, Kc, Kd, s_skb); + + u32x data[2]; + + data[0] = salt_buf0[0]; + data[1] = salt_buf0[1]; + + u32x iv[2]; + + _des_crypt_encrypt (iv, data, Kc, Kd, s_SPtrans); + + const u32x r0 = iv[0]; + const u32x r1 = iv[1]; + const u32x r2 = 0; + const u32x r3 = 0; + + #include VECT_COMPARE_S + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m08500_m04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + const u32 lid = threadIdx.x; + + u32 w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = 0; + w[ 3] = 0; + w[ 4] = 0; + w[ 5] = 0; + w[ 6] = 0; + w[ 7] = 0; + w[ 8] = 0; + w[ 9] = 0; + w[10] = 0; + w[11] = 0; + w[12] = 0; + w[13] = 0; + w[14] = 0; + w[15] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * sbox, kbox + */ + + if (lid < 64) + { + s_SPtrans[0][lid] = c_SPtrans[0][lid]; + s_SPtrans[1][lid] = c_SPtrans[1][lid]; + s_SPtrans[2][lid] = c_SPtrans[2][lid]; + s_SPtrans[3][lid] = c_SPtrans[3][lid]; + s_SPtrans[4][lid] = c_SPtrans[4][lid]; + s_SPtrans[5][lid] = c_SPtrans[5][lid]; + s_SPtrans[6][lid] = c_SPtrans[6][lid]; + s_SPtrans[7][lid] = c_SPtrans[7][lid]; + + s_skb[0][lid] = c_skb[0][lid]; + s_skb[1][lid] = c_skb[1][lid]; + s_skb[2][lid] = c_skb[2][lid]; + s_skb[3][lid] = c_skb[3][lid]; + s_skb[4][lid] = c_skb[4][lid]; + s_skb[5][lid] = c_skb[5][lid]; + s_skb[6][lid] = c_skb[6][lid]; + s_skb[7][lid] = c_skb[7][lid]; + } + + __syncthreads (); + + if (gid >= gid_max) return; + + /** + * main + */ + + m08500m (w, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m08500_m08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m08500_m16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m08500_s04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + const u32 lid = threadIdx.x; + + u32 w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = 0; + w[ 3] = 0; + w[ 4] = 0; + w[ 5] = 0; + w[ 6] = 0; + w[ 7] = 0; + w[ 8] = 0; + w[ 9] = 0; + w[10] = 0; + w[11] = 0; + w[12] = 0; + w[13] = 0; + w[14] = 0; + w[15] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * sbox, kbox + */ + + if (lid < 64) + { + s_SPtrans[0][lid] = c_SPtrans[0][lid]; + s_SPtrans[1][lid] = c_SPtrans[1][lid]; + s_SPtrans[2][lid] = c_SPtrans[2][lid]; + s_SPtrans[3][lid] = c_SPtrans[3][lid]; + s_SPtrans[4][lid] = c_SPtrans[4][lid]; + s_SPtrans[5][lid] = c_SPtrans[5][lid]; + s_SPtrans[6][lid] = c_SPtrans[6][lid]; + s_SPtrans[7][lid] = c_SPtrans[7][lid]; + + s_skb[0][lid] = c_skb[0][lid]; + s_skb[1][lid] = c_skb[1][lid]; + s_skb[2][lid] = c_skb[2][lid]; + s_skb[3][lid] = c_skb[3][lid]; + s_skb[4][lid] = c_skb[4][lid]; + s_skb[5][lid] = c_skb[5][lid]; + s_skb[6][lid] = c_skb[6][lid]; + s_skb[7][lid] = c_skb[7][lid]; + } + + __syncthreads (); + + if (gid >= gid_max) return; + + /** + * main + */ + + m08500s (w, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m08500_s08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m08500_s16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/nv/m08600_a0.cu b/nv/m08600_a0.cu new file mode 100644 index 0000000000..20398957a0 --- /dev/null +++ b/nv/m08600_a0.cu @@ -0,0 +1,555 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _LOTUS5_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW2 +#define VECT_SIZE1 +#endif + +#define DGST_R0 0 +#define DGST_R1 1 +#define DGST_R2 2 +#define DGST_R3 3 + +#include "include/kernel_functions.c" +#include "types_nv.c" +#include "common_nv.c" +#include "include/rp_gpu.h" +#include "rp_nv.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +__device__ __constant__ u32 lotus_magic_table[256] = +{ + 0xbd, 0x56, 0xea, 0xf2, 0xa2, 0xf1, 0xac, 0x2a, + 0xb0, 0x93, 0xd1, 0x9c, 0x1b, 0x33, 0xfd, 0xd0, + 0x30, 0x04, 0xb6, 0xdc, 0x7d, 0xdf, 0x32, 0x4b, + 0xf7, 0xcb, 0x45, 0x9b, 0x31, 0xbb, 0x21, 0x5a, + 0x41, 0x9f, 0xe1, 0xd9, 0x4a, 0x4d, 0x9e, 0xda, + 0xa0, 0x68, 0x2c, 0xc3, 0x27, 0x5f, 0x80, 0x36, + 0x3e, 0xee, 0xfb, 0x95, 0x1a, 0xfe, 0xce, 0xa8, + 0x34, 0xa9, 0x13, 0xf0, 0xa6, 0x3f, 0xd8, 0x0c, + 0x78, 0x24, 0xaf, 0x23, 0x52, 0xc1, 0x67, 0x17, + 0xf5, 0x66, 0x90, 0xe7, 0xe8, 0x07, 0xb8, 0x60, + 0x48, 0xe6, 0x1e, 0x53, 0xf3, 0x92, 0xa4, 0x72, + 0x8c, 0x08, 0x15, 0x6e, 0x86, 0x00, 0x84, 0xfa, + 0xf4, 0x7f, 0x8a, 0x42, 0x19, 0xf6, 0xdb, 0xcd, + 0x14, 0x8d, 0x50, 0x12, 0xba, 0x3c, 0x06, 0x4e, + 0xec, 0xb3, 0x35, 0x11, 0xa1, 0x88, 0x8e, 0x2b, + 0x94, 0x99, 0xb7, 0x71, 0x74, 0xd3, 0xe4, 0xbf, + 0x3a, 0xde, 0x96, 0x0e, 0xbc, 0x0a, 0xed, 0x77, + 0xfc, 0x37, 0x6b, 0x03, 0x79, 0x89, 0x62, 0xc6, + 0xd7, 0xc0, 0xd2, 0x7c, 0x6a, 0x8b, 0x22, 0xa3, + 0x5b, 0x05, 0x5d, 0x02, 0x75, 0xd5, 0x61, 0xe3, + 0x18, 0x8f, 0x55, 0x51, 0xad, 0x1f, 0x0b, 0x5e, + 0x85, 0xe5, 0xc2, 0x57, 0x63, 0xca, 0x3d, 0x6c, + 0xb4, 0xc5, 0xcc, 0x70, 0xb2, 0x91, 0x59, 0x0d, + 0x47, 0x20, 0xc8, 0x4f, 0x58, 0xe0, 0x01, 0xe2, + 0x16, 0x38, 0xc4, 0x6f, 0x3b, 0x0f, 0x65, 0x46, + 0xbe, 0x7e, 0x2d, 0x7b, 0x82, 0xf9, 0x40, 0xb5, + 0x1d, 0x73, 0xf8, 0xeb, 0x26, 0xc7, 0x87, 0x97, + 0x25, 0x54, 0xb1, 0x28, 0xaa, 0x98, 0x9d, 0xa5, + 0x64, 0x6d, 0x7a, 0xd4, 0x10, 0x81, 0x44, 0xef, + 0x49, 0xd6, 0xae, 0x2e, 0xdd, 0x76, 0x5c, 0x2f, + 0xa7, 0x1c, 0xc9, 0x09, 0x69, 0x9a, 0x83, 0xcf, + 0x29, 0x39, 0xb9, 0xe9, 0x4c, 0xff, 0x43, 0xab, +}; + +#ifdef VECT_SIZE1 +#define BOX(S,i) u32x ((S)[(i)]) +#endif + +#ifdef VECT_SIZE2 +#define BOX(S,i) u32x ((S)[(i).x], (S)[(i).y]) +#endif + +__device__ static void lotus_mix (u32x *in, u32 s_lotus_magic_table[256]) +{ + u32x p = 0; + + for (int i = 0; i < 18; i++) + { + u32 s = 48; + + #pragma unroll 12 + for (int j = 0; j < 12; j++) + { + u32x tmp_in = in[j]; + u32x tmp_out = 0; + + p = (p + s--) & 0xff; p = ((tmp_in >> 0) & 0xff) ^ BOX (s_lotus_magic_table, p); tmp_out |= p << 0; + p = (p + s--) & 0xff; p = ((tmp_in >> 8) & 0xff) ^ BOX (s_lotus_magic_table, p); tmp_out |= p << 8; + p = (p + s--) & 0xff; p = ((tmp_in >> 16) & 0xff) ^ BOX (s_lotus_magic_table, p); tmp_out |= p << 16; + p = (p + s--) & 0xff; p = ((tmp_in >> 24) & 0xff) ^ BOX (s_lotus_magic_table, p); tmp_out |= p << 24; + + in[j] = tmp_out; + } + } +} + +__device__ static void lotus_transform_password (u32x *in, u32x *out, u32 s_lotus_magic_table[256]) +{ + u32x t = out[3] >> 24; + + u32x c; + + for (int i = 0; i < 4; i++) + { + t ^= (in[i] >> 0) & 0xff; c = BOX (s_lotus_magic_table, t); out[i] ^= c << 0; t = ((out[i] >> 0) & 0xff); + t ^= (in[i] >> 8) & 0xff; c = BOX (s_lotus_magic_table, t); out[i] ^= c << 8; t = ((out[i] >> 8) & 0xff); + t ^= (in[i] >> 16) & 0xff; c = BOX (s_lotus_magic_table, t); out[i] ^= c << 16; t = ((out[i] >> 16) & 0xff); + t ^= (in[i] >> 24) & 0xff; c = BOX (s_lotus_magic_table, t); out[i] ^= c << 24; t = ((out[i] >> 24) & 0xff); + } +} + +__device__ static void pad (u32x w[4], const u32 len) +{ + const u32 val = 16 - len; + + const u32 mask1 = val << 24; + + const u32 mask2 = val << 16 + | val << 24; + + const u32 mask3 = val << 8 + | val << 16 + | val << 24; + + const u32 mask4 = val << 0 + | val << 8 + | val << 16 + | val << 24; + + switch (len) + { + case 0: w[0] = mask4; + w[1] = mask4; + w[2] = mask4; + w[3] = mask4; + break; + case 1: w[0] |= mask3; + w[1] = mask4; + w[2] = mask4; + w[3] = mask4; + break; + case 2: w[0] |= mask2; + w[1] = mask4; + w[2] = mask4; + w[3] = mask4; + break; + case 3: w[0] |= mask1; + w[1] = mask4; + w[2] = mask4; + w[3] = mask4; + break; + case 4: w[1] = mask4; + w[2] = mask4; + w[3] = mask4; + break; + case 5: w[1] |= mask3; + w[2] = mask4; + w[3] = mask4; + break; + case 6: w[1] |= mask2; + w[2] = mask4; + w[3] = mask4; + break; + case 7: w[1] |= mask1; + w[2] = mask4; + w[3] = mask4; + break; + case 8: w[2] = mask4; + w[3] = mask4; + break; + case 9: w[2] |= mask3; + w[3] = mask4; + break; + case 10: w[2] |= mask2; + w[3] = mask4; + break; + case 11: w[2] |= mask1; + w[3] = mask4; + break; + case 12: w[3] = mask4; + break; + case 13: w[3] |= mask3; + break; + case 14: w[3] |= mask2; + break; + case 15: w[3] |= mask1; + break; + } +} + +__device__ static void mdtransform_norecalc (u32x state[4], u32x block[4], u32 s_lotus_magic_table[256]) +{ + u32x x[12]; + + x[ 0] = state[0]; + x[ 1] = state[1]; + x[ 2] = state[2]; + x[ 3] = state[3]; + x[ 4] = block[0]; + x[ 5] = block[1]; + x[ 6] = block[2]; + x[ 7] = block[3]; + x[ 8] = state[0] ^ block[0]; + x[ 9] = state[1] ^ block[1]; + x[10] = state[2] ^ block[2]; + x[11] = state[3] ^ block[3]; + + lotus_mix (x, s_lotus_magic_table); + + state[0] = x[0]; + state[1] = x[1]; + state[2] = x[2]; + state[3] = x[3]; +} + +__device__ static void mdtransform (u32x state[4], u32x checksum[4], u32x block[4], u32 s_lotus_magic_table[256]) +{ + mdtransform_norecalc (state, block, s_lotus_magic_table); + + lotus_transform_password (block, checksum, s_lotus_magic_table); +} + +__device__ static void domino_big_md (const u32x saved_key[16], const u32 size, u32x state[4], u32 s_lotus_magic_table[256]) +{ + u32x checksum[4]; + + checksum[0] = 0; + checksum[1] = 0; + checksum[2] = 0; + checksum[3] = 0; + + u32x block[4]; + + block[0] = saved_key[0]; + block[1] = saved_key[1]; + block[2] = saved_key[2]; + block[3] = saved_key[3]; + + mdtransform (state, checksum, block, s_lotus_magic_table); + + mdtransform_norecalc (state, checksum, s_lotus_magic_table); +} + +__device__ __constant__ gpu_rule_t c_rules[1024]; + +extern "C" __global__ void __launch_bounds__ (256, 1) m08600_m04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + /** + * sbox + */ + + __shared__ u32 s_lotus_magic_table[256]; + + s_lotus_magic_table[lid] = lotus_magic_table[lid]; + + __syncthreads (); + + if (gid >= gid_max) return; + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + u32x pw_buf1[4]; + + pw_buf1[0] = pws[gid].i[ 4]; + pw_buf1[1] = pws[gid].i[ 5]; + pw_buf1[2] = pws[gid].i[ 6]; + pw_buf1[3] = pws[gid].i[ 7]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + + w0[0] = pw_buf0[0]; + w0[1] = pw_buf0[1]; + w0[2] = pw_buf0[2]; + w0[3] = pw_buf0[3]; + + u32x w1[4]; + + w1[0] = pw_buf1[0]; + w1[1] = pw_buf1[1]; + w1[2] = pw_buf1[2]; + w1[3] = pw_buf1[3]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 out_len = apply_rules (c_rules[il_pos].cmds, w0, w1, pw_len); + + u32x w[16]; + + w[ 0] = w0[0]; + w[ 1] = w0[1]; + w[ 2] = w0[2]; + w[ 3] = w0[3]; + w[ 4] = w1[0]; + w[ 5] = w1[1]; + w[ 6] = w1[2]; + w[ 7] = w1[3]; + w[ 8] = 0; + w[ 9] = 0; + w[10] = 0; + w[11] = 0; + w[12] = 0; + w[13] = 0; + w[14] = 0; + w[15] = 0; + + u32x state[4]; + + state[0] = 0; + state[1] = 0; + state[2] = 0; + state[3] = 0; + + /** + * padding + */ + + if (pw_len < 16) + { + pad (&w[ 0], pw_len & 0xf); + } + else if (pw_len < 32) + { + pad (&w[ 4], pw_len & 0xf); + } + else if (pw_len < 48) + { + pad (&w[ 8], pw_len & 0xf); + } + else if (pw_len < 64) + { + pad (&w[12], pw_len & 0xf); + } + + domino_big_md (w, pw_len, state, s_lotus_magic_table); + + const u32x r0 = state[0]; + const u32x r1 = state[1]; + const u32x r2 = state[2]; + const u32x r3 = state[3]; + + #include VECT_COMPARE_M + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m08600_m08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m08600_m16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m08600_s04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + /** + * sbox + */ + + __shared__ u32 s_lotus_magic_table[256]; + + s_lotus_magic_table[lid] = lotus_magic_table[lid]; + + __syncthreads (); + + if (gid >= gid_max) return; + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + u32x pw_buf1[4]; + + pw_buf1[0] = pws[gid].i[ 4]; + pw_buf1[1] = pws[gid].i[ 5]; + pw_buf1[2] = pws[gid].i[ 6]; + pw_buf1[3] = pws[gid].i[ 7]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + + w0[0] = pw_buf0[0]; + w0[1] = pw_buf0[1]; + w0[2] = pw_buf0[2]; + w0[3] = pw_buf0[3]; + + u32x w1[4]; + + w1[0] = pw_buf1[0]; + w1[1] = pw_buf1[1]; + w1[2] = pw_buf1[2]; + w1[3] = pw_buf1[3]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 out_len = apply_rules (c_rules[il_pos].cmds, w0, w1, pw_len); + + u32x w[16]; + + w[ 0] = w0[0]; + w[ 1] = w0[1]; + w[ 2] = w0[2]; + w[ 3] = w0[3]; + w[ 4] = w1[0]; + w[ 5] = w1[1]; + w[ 6] = w1[2]; + w[ 7] = w1[3]; + w[ 8] = 0; + w[ 9] = 0; + w[10] = 0; + w[11] = 0; + w[12] = 0; + w[13] = 0; + w[14] = 0; + w[15] = 0; + + u32x state[4]; + + state[0] = 0; + state[1] = 0; + state[2] = 0; + state[3] = 0; + + /** + * padding + */ + + if (pw_len < 16) + { + pad (&w[ 0], pw_len & 0xf); + } + else if (pw_len < 32) + { + pad (&w[ 4], pw_len & 0xf); + } + else if (pw_len < 48) + { + pad (&w[ 8], pw_len & 0xf); + } + else if (pw_len < 64) + { + pad (&w[12], pw_len & 0xf); + } + + domino_big_md (w, pw_len, state, s_lotus_magic_table); + + const u32x r0 = state[0]; + const u32x r1 = state[1]; + const u32x r2 = state[2]; + const u32x r3 = state[3]; + + #include VECT_COMPARE_S + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m08600_s08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m08600_s16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/nv/m08600_a1.cu b/nv/m08600_a1.cu new file mode 100644 index 0000000000..adb86cfd13 --- /dev/null +++ b/nv/m08600_a1.cu @@ -0,0 +1,605 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _LOTUS5_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW2 +#define VECT_SIZE1 +#endif + +#define DGST_R0 0 +#define DGST_R1 1 +#define DGST_R2 2 +#define DGST_R3 3 + +#include "include/kernel_functions.c" +#include "types_nv.c" +#include "common_nv.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +__device__ __constant__ u32 lotus_magic_table[256] = +{ + 0xbd, 0x56, 0xea, 0xf2, 0xa2, 0xf1, 0xac, 0x2a, + 0xb0, 0x93, 0xd1, 0x9c, 0x1b, 0x33, 0xfd, 0xd0, + 0x30, 0x04, 0xb6, 0xdc, 0x7d, 0xdf, 0x32, 0x4b, + 0xf7, 0xcb, 0x45, 0x9b, 0x31, 0xbb, 0x21, 0x5a, + 0x41, 0x9f, 0xe1, 0xd9, 0x4a, 0x4d, 0x9e, 0xda, + 0xa0, 0x68, 0x2c, 0xc3, 0x27, 0x5f, 0x80, 0x36, + 0x3e, 0xee, 0xfb, 0x95, 0x1a, 0xfe, 0xce, 0xa8, + 0x34, 0xa9, 0x13, 0xf0, 0xa6, 0x3f, 0xd8, 0x0c, + 0x78, 0x24, 0xaf, 0x23, 0x52, 0xc1, 0x67, 0x17, + 0xf5, 0x66, 0x90, 0xe7, 0xe8, 0x07, 0xb8, 0x60, + 0x48, 0xe6, 0x1e, 0x53, 0xf3, 0x92, 0xa4, 0x72, + 0x8c, 0x08, 0x15, 0x6e, 0x86, 0x00, 0x84, 0xfa, + 0xf4, 0x7f, 0x8a, 0x42, 0x19, 0xf6, 0xdb, 0xcd, + 0x14, 0x8d, 0x50, 0x12, 0xba, 0x3c, 0x06, 0x4e, + 0xec, 0xb3, 0x35, 0x11, 0xa1, 0x88, 0x8e, 0x2b, + 0x94, 0x99, 0xb7, 0x71, 0x74, 0xd3, 0xe4, 0xbf, + 0x3a, 0xde, 0x96, 0x0e, 0xbc, 0x0a, 0xed, 0x77, + 0xfc, 0x37, 0x6b, 0x03, 0x79, 0x89, 0x62, 0xc6, + 0xd7, 0xc0, 0xd2, 0x7c, 0x6a, 0x8b, 0x22, 0xa3, + 0x5b, 0x05, 0x5d, 0x02, 0x75, 0xd5, 0x61, 0xe3, + 0x18, 0x8f, 0x55, 0x51, 0xad, 0x1f, 0x0b, 0x5e, + 0x85, 0xe5, 0xc2, 0x57, 0x63, 0xca, 0x3d, 0x6c, + 0xb4, 0xc5, 0xcc, 0x70, 0xb2, 0x91, 0x59, 0x0d, + 0x47, 0x20, 0xc8, 0x4f, 0x58, 0xe0, 0x01, 0xe2, + 0x16, 0x38, 0xc4, 0x6f, 0x3b, 0x0f, 0x65, 0x46, + 0xbe, 0x7e, 0x2d, 0x7b, 0x82, 0xf9, 0x40, 0xb5, + 0x1d, 0x73, 0xf8, 0xeb, 0x26, 0xc7, 0x87, 0x97, + 0x25, 0x54, 0xb1, 0x28, 0xaa, 0x98, 0x9d, 0xa5, + 0x64, 0x6d, 0x7a, 0xd4, 0x10, 0x81, 0x44, 0xef, + 0x49, 0xd6, 0xae, 0x2e, 0xdd, 0x76, 0x5c, 0x2f, + 0xa7, 0x1c, 0xc9, 0x09, 0x69, 0x9a, 0x83, 0xcf, + 0x29, 0x39, 0xb9, 0xe9, 0x4c, 0xff, 0x43, 0xab, +}; + +#ifdef VECT_SIZE1 +#define BOX(S,i) u32x ((S)[(i)]) +#endif + +#ifdef VECT_SIZE2 +#define BOX(S,i) u32x ((S)[(i).x], (S)[(i).y]) +#endif + +__device__ static void lotus_mix (u32x *in, u32 s_lotus_magic_table[256]) +{ + u32x p = 0; + + for (int i = 0; i < 18; i++) + { + u32 s = 48; + + #pragma unroll 12 + for (int j = 0; j < 12; j++) + { + u32x tmp_in = in[j]; + u32x tmp_out = 0; + + p = (p + s--) & 0xff; p = ((tmp_in >> 0) & 0xff) ^ BOX (s_lotus_magic_table, p); tmp_out |= p << 0; + p = (p + s--) & 0xff; p = ((tmp_in >> 8) & 0xff) ^ BOX (s_lotus_magic_table, p); tmp_out |= p << 8; + p = (p + s--) & 0xff; p = ((tmp_in >> 16) & 0xff) ^ BOX (s_lotus_magic_table, p); tmp_out |= p << 16; + p = (p + s--) & 0xff; p = ((tmp_in >> 24) & 0xff) ^ BOX (s_lotus_magic_table, p); tmp_out |= p << 24; + + in[j] = tmp_out; + } + } +} + +__device__ static void lotus_transform_password (u32x *in, u32x *out, u32 s_lotus_magic_table[256]) +{ + u32x t = out[3] >> 24; + + u32x c; + + for (int i = 0; i < 4; i++) + { + t ^= (in[i] >> 0) & 0xff; c = BOX (s_lotus_magic_table, t); out[i] ^= c << 0; t = ((out[i] >> 0) & 0xff); + t ^= (in[i] >> 8) & 0xff; c = BOX (s_lotus_magic_table, t); out[i] ^= c << 8; t = ((out[i] >> 8) & 0xff); + t ^= (in[i] >> 16) & 0xff; c = BOX (s_lotus_magic_table, t); out[i] ^= c << 16; t = ((out[i] >> 16) & 0xff); + t ^= (in[i] >> 24) & 0xff; c = BOX (s_lotus_magic_table, t); out[i] ^= c << 24; t = ((out[i] >> 24) & 0xff); + } +} + +__device__ static void pad (u32x w[4], const u32 len) +{ + const u32 val = 16 - len; + + const u32 mask1 = val << 24; + + const u32 mask2 = val << 16 + | val << 24; + + const u32 mask3 = val << 8 + | val << 16 + | val << 24; + + const u32 mask4 = val << 0 + | val << 8 + | val << 16 + | val << 24; + + switch (len) + { + case 0: w[0] = mask4; + w[1] = mask4; + w[2] = mask4; + w[3] = mask4; + break; + case 1: w[0] |= mask3; + w[1] = mask4; + w[2] = mask4; + w[3] = mask4; + break; + case 2: w[0] |= mask2; + w[1] = mask4; + w[2] = mask4; + w[3] = mask4; + break; + case 3: w[0] |= mask1; + w[1] = mask4; + w[2] = mask4; + w[3] = mask4; + break; + case 4: w[1] = mask4; + w[2] = mask4; + w[3] = mask4; + break; + case 5: w[1] |= mask3; + w[2] = mask4; + w[3] = mask4; + break; + case 6: w[1] |= mask2; + w[2] = mask4; + w[3] = mask4; + break; + case 7: w[1] |= mask1; + w[2] = mask4; + w[3] = mask4; + break; + case 8: w[2] = mask4; + w[3] = mask4; + break; + case 9: w[2] |= mask3; + w[3] = mask4; + break; + case 10: w[2] |= mask2; + w[3] = mask4; + break; + case 11: w[2] |= mask1; + w[3] = mask4; + break; + case 12: w[3] = mask4; + break; + case 13: w[3] |= mask3; + break; + case 14: w[3] |= mask2; + break; + case 15: w[3] |= mask1; + break; + } +} + +__device__ static void mdtransform_norecalc (u32x state[4], u32x block[4], u32 s_lotus_magic_table[256]) +{ + u32x x[12]; + + x[ 0] = state[0]; + x[ 1] = state[1]; + x[ 2] = state[2]; + x[ 3] = state[3]; + x[ 4] = block[0]; + x[ 5] = block[1]; + x[ 6] = block[2]; + x[ 7] = block[3]; + x[ 8] = state[0] ^ block[0]; + x[ 9] = state[1] ^ block[1]; + x[10] = state[2] ^ block[2]; + x[11] = state[3] ^ block[3]; + + lotus_mix (x, s_lotus_magic_table); + + state[0] = x[0]; + state[1] = x[1]; + state[2] = x[2]; + state[3] = x[3]; +} + +__device__ static void mdtransform (u32x state[4], u32x checksum[4], u32x block[4], u32 s_lotus_magic_table[256]) +{ + mdtransform_norecalc (state, block, s_lotus_magic_table); + + lotus_transform_password (block, checksum, s_lotus_magic_table); +} + +__device__ static void domino_big_md (const u32x saved_key[16], const u32 size, u32x state[4], u32 s_lotus_magic_table[256]) +{ + u32x checksum[4]; + + checksum[0] = 0; + checksum[1] = 0; + checksum[2] = 0; + checksum[3] = 0; + + u32x block[4]; + + block[0] = saved_key[0]; + block[1] = saved_key[1]; + block[2] = saved_key[2]; + block[3] = saved_key[3]; + + mdtransform (state, checksum, block, s_lotus_magic_table); + + mdtransform_norecalc (state, checksum, s_lotus_magic_table); +} + +__device__ __constant__ comb_t c_combs[1024]; + +extern "C" __global__ void __launch_bounds__ (256, 1) m08600_m04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + /** + * sbox + */ + + __shared__ u32 s_lotus_magic_table[256]; + + s_lotus_magic_table[lid] = lotus_magic_table[lid]; + + __syncthreads (); + + if (gid >= gid_max) return; + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, c_combs[0].pw_len); + } + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = c_combs[il_pos].pw_len; + + u32 pw_len = pw_l_len + pw_r_len; + + u32 wordr0[4]; + + wordr0[0] = c_combs[il_pos].i[0]; + wordr0[1] = c_combs[il_pos].i[1]; + wordr0[2] = c_combs[il_pos].i[2]; + wordr0[3] = c_combs[il_pos].i[3]; + + u32 wordr1[4]; + + wordr1[0] = c_combs[il_pos].i[4]; + wordr1[1] = c_combs[il_pos].i[5]; + wordr1[2] = c_combs[il_pos].i[6]; + wordr1[3] = c_combs[il_pos].i[7]; + + u32 wordr2[4]; + + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + + u32 wordr3[4]; + + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + u32x w[16]; + + w[ 0] = wordl0[0] | wordr0[0]; + w[ 1] = wordl0[1] | wordr0[1]; + w[ 2] = wordl0[2] | wordr0[2]; + w[ 3] = wordl0[3] | wordr0[3]; + w[ 4] = wordl1[0] | wordr1[0]; + w[ 5] = wordl1[1] | wordr1[1]; + w[ 6] = wordl1[2] | wordr1[2]; + w[ 7] = wordl1[3] | wordr1[3]; + w[ 8] = wordl2[0] | wordr2[0]; + w[ 9] = wordl2[1] | wordr2[1]; + w[10] = wordl2[2] | wordr2[2]; + w[11] = wordl2[3] | wordr2[3]; + w[12] = wordl3[0] | wordr3[0]; + w[13] = wordl3[1] | wordr3[1]; + w[14] = wordl3[2] | wordr3[2]; + w[15] = wordl3[3] | wordr3[3]; + + u32x state[4]; + + state[0] = 0; + state[1] = 0; + state[2] = 0; + state[3] = 0; + + /** + * padding + */ + + if (pw_len < 16) + { + pad (&w[ 0], pw_len & 0xf); + } + else if (pw_len < 32) + { + pad (&w[ 4], pw_len & 0xf); + } + else if (pw_len < 48) + { + pad (&w[ 8], pw_len & 0xf); + } + else if (pw_len < 64) + { + pad (&w[12], pw_len & 0xf); + } + + domino_big_md (w, pw_len, state, s_lotus_magic_table); + + const u32x r0 = state[0]; + const u32x r1 = state[1]; + const u32x r2 = state[2]; + const u32x r3 = state[3]; + + #include VECT_COMPARE_M + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m08600_m08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m08600_m16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m08600_s04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + /** + * sbox + */ + + __shared__ u32 s_lotus_magic_table[256]; + + s_lotus_magic_table[lid] = lotus_magic_table[lid]; + + __syncthreads (); + + if (gid >= gid_max) return; + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, c_combs[0].pw_len); + } + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = c_combs[il_pos].pw_len; + + u32 pw_len = pw_l_len + pw_r_len; + + u32 wordr0[4]; + + wordr0[0] = c_combs[il_pos].i[0]; + wordr0[1] = c_combs[il_pos].i[1]; + wordr0[2] = c_combs[il_pos].i[2]; + wordr0[3] = c_combs[il_pos].i[3]; + + u32 wordr1[4]; + + wordr1[0] = c_combs[il_pos].i[4]; + wordr1[1] = c_combs[il_pos].i[5]; + wordr1[2] = c_combs[il_pos].i[6]; + wordr1[3] = c_combs[il_pos].i[7]; + + u32 wordr2[4]; + + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + + u32 wordr3[4]; + + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + u32x w[16]; + + w[ 0] = wordl0[0] | wordr0[0]; + w[ 1] = wordl0[1] | wordr0[1]; + w[ 2] = wordl0[2] | wordr0[2]; + w[ 3] = wordl0[3] | wordr0[3]; + w[ 4] = wordl1[0] | wordr1[0]; + w[ 5] = wordl1[1] | wordr1[1]; + w[ 6] = wordl1[2] | wordr1[2]; + w[ 7] = wordl1[3] | wordr1[3]; + w[ 8] = wordl2[0] | wordr2[0]; + w[ 9] = wordl2[1] | wordr2[1]; + w[10] = wordl2[2] | wordr2[2]; + w[11] = wordl2[3] | wordr2[3]; + w[12] = wordl3[0] | wordr3[0]; + w[13] = wordl3[1] | wordr3[1]; + w[14] = wordl3[2] | wordr3[2]; + w[15] = wordl3[3] | wordr3[3]; + + u32x state[4]; + + state[0] = 0; + state[1] = 0; + state[2] = 0; + state[3] = 0; + + /** + * padding + */ + + if (pw_len < 16) + { + pad (&w[ 0], pw_len & 0xf); + } + else if (pw_len < 32) + { + pad (&w[ 4], pw_len & 0xf); + } + else if (pw_len < 48) + { + pad (&w[ 8], pw_len & 0xf); + } + else if (pw_len < 64) + { + pad (&w[12], pw_len & 0xf); + } + + domino_big_md (w, pw_len, state, s_lotus_magic_table); + + const u32x r0 = state[0]; + const u32x r1 = state[1]; + const u32x r2 = state[2]; + const u32x r3 = state[3]; + + #include VECT_COMPARE_S + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m08600_s08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m08600_s16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/nv/m08600_a3.cu b/nv/m08600_a3.cu new file mode 100644 index 0000000000..8dd5bd3857 --- /dev/null +++ b/nv/m08600_a3.cu @@ -0,0 +1,722 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _LOTUS5_ +#define _SCALAR_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW2 +#define VECT_SIZE1 +#endif + +#define DGST_R0 0 +#define DGST_R1 1 +#define DGST_R2 2 +#define DGST_R3 3 + +#include "include/kernel_functions.c" +#include "types_nv.c" +#include "common_nv.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4_warp.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4_warp.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4_warp.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4_warp.c" +#endif + +__device__ __constant__ u32 lotus_magic_table[256] = +{ + 0xbd, 0x56, 0xea, 0xf2, 0xa2, 0xf1, 0xac, 0x2a, + 0xb0, 0x93, 0xd1, 0x9c, 0x1b, 0x33, 0xfd, 0xd0, + 0x30, 0x04, 0xb6, 0xdc, 0x7d, 0xdf, 0x32, 0x4b, + 0xf7, 0xcb, 0x45, 0x9b, 0x31, 0xbb, 0x21, 0x5a, + 0x41, 0x9f, 0xe1, 0xd9, 0x4a, 0x4d, 0x9e, 0xda, + 0xa0, 0x68, 0x2c, 0xc3, 0x27, 0x5f, 0x80, 0x36, + 0x3e, 0xee, 0xfb, 0x95, 0x1a, 0xfe, 0xce, 0xa8, + 0x34, 0xa9, 0x13, 0xf0, 0xa6, 0x3f, 0xd8, 0x0c, + 0x78, 0x24, 0xaf, 0x23, 0x52, 0xc1, 0x67, 0x17, + 0xf5, 0x66, 0x90, 0xe7, 0xe8, 0x07, 0xb8, 0x60, + 0x48, 0xe6, 0x1e, 0x53, 0xf3, 0x92, 0xa4, 0x72, + 0x8c, 0x08, 0x15, 0x6e, 0x86, 0x00, 0x84, 0xfa, + 0xf4, 0x7f, 0x8a, 0x42, 0x19, 0xf6, 0xdb, 0xcd, + 0x14, 0x8d, 0x50, 0x12, 0xba, 0x3c, 0x06, 0x4e, + 0xec, 0xb3, 0x35, 0x11, 0xa1, 0x88, 0x8e, 0x2b, + 0x94, 0x99, 0xb7, 0x71, 0x74, 0xd3, 0xe4, 0xbf, + 0x3a, 0xde, 0x96, 0x0e, 0xbc, 0x0a, 0xed, 0x77, + 0xfc, 0x37, 0x6b, 0x03, 0x79, 0x89, 0x62, 0xc6, + 0xd7, 0xc0, 0xd2, 0x7c, 0x6a, 0x8b, 0x22, 0xa3, + 0x5b, 0x05, 0x5d, 0x02, 0x75, 0xd5, 0x61, 0xe3, + 0x18, 0x8f, 0x55, 0x51, 0xad, 0x1f, 0x0b, 0x5e, + 0x85, 0xe5, 0xc2, 0x57, 0x63, 0xca, 0x3d, 0x6c, + 0xb4, 0xc5, 0xcc, 0x70, 0xb2, 0x91, 0x59, 0x0d, + 0x47, 0x20, 0xc8, 0x4f, 0x58, 0xe0, 0x01, 0xe2, + 0x16, 0x38, 0xc4, 0x6f, 0x3b, 0x0f, 0x65, 0x46, + 0xbe, 0x7e, 0x2d, 0x7b, 0x82, 0xf9, 0x40, 0xb5, + 0x1d, 0x73, 0xf8, 0xeb, 0x26, 0xc7, 0x87, 0x97, + 0x25, 0x54, 0xb1, 0x28, 0xaa, 0x98, 0x9d, 0xa5, + 0x64, 0x6d, 0x7a, 0xd4, 0x10, 0x81, 0x44, 0xef, + 0x49, 0xd6, 0xae, 0x2e, 0xdd, 0x76, 0x5c, 0x2f, + 0xa7, 0x1c, 0xc9, 0x09, 0x69, 0x9a, 0x83, 0xcf, + 0x29, 0x39, 0xb9, 0xe9, 0x4c, 0xff, 0x43, 0xab, +}; + +#ifdef VECT_SIZE1 +#define BOX(S,i) u32x ((S)[(i)]) +#endif + +#ifdef VECT_SIZE2 +#define BOX(S,i) u32x ((S)[(i).x], (S)[(i).y]) +#endif + +__device__ static void lotus_mix (u32x *in, u32 s_lotus_magic_table[256]) +{ + u32x p = 0; + + for (int i = 0; i < 18; i++) + { + u32 s = 48; + + #pragma unroll 12 + for (int j = 0; j < 12; j++) + { + u32x tmp_in = in[j]; + u32x tmp_out = 0; + + p = (p + s--) & 0xff; p = ((tmp_in >> 0) & 0xff) ^ BOX (s_lotus_magic_table, p); tmp_out |= p << 0; + p = (p + s--) & 0xff; p = ((tmp_in >> 8) & 0xff) ^ BOX (s_lotus_magic_table, p); tmp_out |= p << 8; + p = (p + s--) & 0xff; p = ((tmp_in >> 16) & 0xff) ^ BOX (s_lotus_magic_table, p); tmp_out |= p << 16; + p = (p + s--) & 0xff; p = ((tmp_in >> 24) & 0xff) ^ BOX (s_lotus_magic_table, p); tmp_out |= p << 24; + + in[j] = tmp_out; + } + } +} + +__device__ static void lotus_transform_password (u32x *in, u32x *out, u32 s_lotus_magic_table[256]) +{ + u32x t = out[3] >> 24; + + u32x c; + + for (int i = 0; i < 4; i++) + { + t ^= (in[i] >> 0) & 0xff; c = BOX (s_lotus_magic_table, t); out[i] ^= c << 0; t = ((out[i] >> 0) & 0xff); + t ^= (in[i] >> 8) & 0xff; c = BOX (s_lotus_magic_table, t); out[i] ^= c << 8; t = ((out[i] >> 8) & 0xff); + t ^= (in[i] >> 16) & 0xff; c = BOX (s_lotus_magic_table, t); out[i] ^= c << 16; t = ((out[i] >> 16) & 0xff); + t ^= (in[i] >> 24) & 0xff; c = BOX (s_lotus_magic_table, t); out[i] ^= c << 24; t = ((out[i] >> 24) & 0xff); + } +} + +__device__ static void pad (u32 w[4], const u32 len) +{ + const u32 val = 16 - len; + + const u32 mask1 = val << 24; + + const u32 mask2 = val << 16 + | val << 24; + + const u32 mask3 = val << 8 + | val << 16 + | val << 24; + + const u32 mask4 = val << 0 + | val << 8 + | val << 16 + | val << 24; + + switch (len) + { + case 0: w[0] = mask4; + w[1] = mask4; + w[2] = mask4; + w[3] = mask4; + break; + case 1: w[0] |= mask3; + w[1] = mask4; + w[2] = mask4; + w[3] = mask4; + break; + case 2: w[0] |= mask2; + w[1] = mask4; + w[2] = mask4; + w[3] = mask4; + break; + case 3: w[0] |= mask1; + w[1] = mask4; + w[2] = mask4; + w[3] = mask4; + break; + case 4: w[1] = mask4; + w[2] = mask4; + w[3] = mask4; + break; + case 5: w[1] |= mask3; + w[2] = mask4; + w[3] = mask4; + break; + case 6: w[1] |= mask2; + w[2] = mask4; + w[3] = mask4; + break; + case 7: w[1] |= mask1; + w[2] = mask4; + w[3] = mask4; + break; + case 8: w[2] = mask4; + w[3] = mask4; + break; + case 9: w[2] |= mask3; + w[3] = mask4; + break; + case 10: w[2] |= mask2; + w[3] = mask4; + break; + case 11: w[2] |= mask1; + w[3] = mask4; + break; + case 12: w[3] = mask4; + break; + case 13: w[3] |= mask3; + break; + case 14: w[3] |= mask2; + break; + case 15: w[3] |= mask1; + break; + } +} + +__device__ static void mdtransform_norecalc (u32x state[4], u32x block[4], u32 s_lotus_magic_table[256]) +{ + u32x x[12]; + + x[ 0] = state[0]; + x[ 1] = state[1]; + x[ 2] = state[2]; + x[ 3] = state[3]; + x[ 4] = block[0]; + x[ 5] = block[1]; + x[ 6] = block[2]; + x[ 7] = block[3]; + x[ 8] = state[0] ^ block[0]; + x[ 9] = state[1] ^ block[1]; + x[10] = state[2] ^ block[2]; + x[11] = state[3] ^ block[3]; + + lotus_mix (x, s_lotus_magic_table); + + state[0] = x[0]; + state[1] = x[1]; + state[2] = x[2]; + state[3] = x[3]; +} + +__device__ static void mdtransform (u32x state[4], u32x checksum[4], u32x block[4], u32 s_lotus_magic_table[256]) +{ + mdtransform_norecalc (state, block, s_lotus_magic_table); + + lotus_transform_password (block, checksum, s_lotus_magic_table); +} + +__device__ static void domino_big_md (const u32x saved_key[16], const u32 size, u32x state[4], u32 s_lotus_magic_table[256]) +{ + u32x checksum[4]; + + checksum[0] = 0; + checksum[1] = 0; + checksum[2] = 0; + checksum[3] = 0; + + u32x block[4]; + + block[0] = saved_key[0]; + block[1] = saved_key[1]; + block[2] = saved_key[2]; + block[3] = saved_key[3]; + + mdtransform (state, checksum, block, s_lotus_magic_table); + + mdtransform_norecalc (state, checksum, s_lotus_magic_table); +} + +__device__ __constant__ u32x c_bfs[1024]; + +__device__ static void m08600m (u32 s_lotus_magic_table[256], u32 w[16], const u32 pw_len, const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const u32x * words_buf_r, void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset) +{ + /** + * modifier + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + const u32 lid = threadIdx.x; + + /** + * padding + */ + + if (pw_len < 16) + { + pad (&w[ 0], pw_len & 0xf); + } + else if (pw_len < 32) + { + pad (&w[ 4], pw_len & 0xf); + } + else if (pw_len < 48) + { + pad (&w[ 8], pw_len & 0xf); + } + else if (pw_len < 64) + { + pad (&w[12], pw_len & 0xf); + } + + /** + * loop + */ + + const u32 bf_loops = ceil ((float) bfs_cnt / VECT_DIV); + + u32x w0l = w[0]; + + for (u32 il_pos = 0; il_pos < bf_loops; il_pos++) + { + const u32x w0r = c_bfs[il_pos]; + + const u32x w0 = w0l | w0r; + + u32x w_tmp[16]; + + w_tmp[ 0] = w0; + w_tmp[ 1] = w[ 1]; + w_tmp[ 2] = w[ 2]; + w_tmp[ 3] = w[ 3]; + w_tmp[ 4] = w[ 4]; + w_tmp[ 5] = w[ 5]; + w_tmp[ 6] = w[ 6]; + w_tmp[ 7] = w[ 7]; + w_tmp[ 8] = w[ 8]; + w_tmp[ 9] = w[ 9]; + w_tmp[10] = w[10]; + w_tmp[11] = w[11]; + w_tmp[12] = w[12]; + w_tmp[13] = w[13]; + w_tmp[14] = w[14]; + w_tmp[15] = w[15]; + + u32x state[4]; + + state[0] = 0; + state[1] = 0; + state[2] = 0; + state[3] = 0; + + domino_big_md (w_tmp, pw_len, state, s_lotus_magic_table); + + const u32x r0 = state[0]; + const u32x r1 = state[1]; + const u32x r2 = state[2]; + const u32x r3 = state[3]; + + #include VECT_COMPARE_M + } +} + +__device__ static void m08600s (u32 s_lotus_magic_table[256], u32 w[16], const u32 pw_len, const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const u32x * words_buf_r, void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset) +{ + /** + * modifier + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + const u32 lid = threadIdx.x; + + /** + * padding + */ + + if (pw_len < 16) + { + pad (&w[ 0], pw_len & 0xf); + } + else if (pw_len < 32) + { + pad (&w[ 4], pw_len & 0xf); + } + else if (pw_len < 48) + { + pad (&w[ 8], pw_len & 0xf); + } + else if (pw_len < 64) + { + pad (&w[12], pw_len & 0xf); + } + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * loop + */ + + const u32 bf_loops = ceil ((float) bfs_cnt / VECT_DIV); + + u32x w0l = w[0]; + + for (u32 il_pos = 0; il_pos < bf_loops; il_pos++) + { + const u32x w0r = c_bfs[il_pos]; + + const u32x w0 = w0l | w0r; + + u32x w_tmp[16]; + + w_tmp[ 0] = w0; + w_tmp[ 1] = w[ 1]; + w_tmp[ 2] = w[ 2]; + w_tmp[ 3] = w[ 3]; + w_tmp[ 4] = w[ 4]; + w_tmp[ 5] = w[ 5]; + w_tmp[ 6] = w[ 6]; + w_tmp[ 7] = w[ 7]; + w_tmp[ 8] = w[ 8]; + w_tmp[ 9] = w[ 9]; + w_tmp[10] = w[10]; + w_tmp[11] = w[11]; + w_tmp[12] = w[12]; + w_tmp[13] = w[13]; + w_tmp[14] = w[14]; + w_tmp[15] = w[15]; + + u32x state[4]; + + state[0] = 0; + state[1] = 0; + state[2] = 0; + state[3] = 0; + + domino_big_md (w_tmp, pw_len, state, s_lotus_magic_table); + + const u32x r0 = state[0]; + const u32x r1 = state[1]; + const u32x r2 = state[2]; + const u32x r3 = state[3]; + + #include VECT_COMPARE_S + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m08600_m04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const u32x * words_buf_r, void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + const u32 lid = threadIdx.x; + + u32 w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = 0; + w[ 5] = 0; + w[ 6] = 0; + w[ 7] = 0; + w[ 8] = 0; + w[ 9] = 0; + w[10] = 0; + w[11] = 0; + w[12] = 0; + w[13] = 0; + w[14] = 0; + w[15] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * sbox + */ + + __shared__ u32 s_lotus_magic_table[256]; + + s_lotus_magic_table[lid] = lotus_magic_table[lid]; + + __syncthreads (); + + if (gid >= gid_max) return; + + /** + * main + */ + + m08600m (s_lotus_magic_table, w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m08600_m08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const u32x * words_buf_r, void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + const u32 lid = threadIdx.x; + + u32 w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = pws[gid].i[ 4]; + w[ 5] = pws[gid].i[ 5]; + w[ 6] = pws[gid].i[ 6]; + w[ 7] = pws[gid].i[ 7]; + w[ 8] = 0; + w[ 9] = 0; + w[10] = 0; + w[11] = 0; + w[12] = 0; + w[13] = 0; + w[14] = 0; + w[15] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * sbox + */ + + __shared__ u32 s_lotus_magic_table[256]; + + s_lotus_magic_table[lid] = lotus_magic_table[lid]; + + __syncthreads (); + + if (gid >= gid_max) return; + + /** + * main + */ + + m08600m (s_lotus_magic_table, w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m08600_m16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const u32x * words_buf_r, void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + const u32 lid = threadIdx.x; + + u32 w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = pws[gid].i[ 4]; + w[ 5] = pws[gid].i[ 5]; + w[ 6] = pws[gid].i[ 6]; + w[ 7] = pws[gid].i[ 7]; + w[ 8] = pws[gid].i[ 8]; + w[ 9] = pws[gid].i[ 9]; + w[10] = pws[gid].i[10]; + w[11] = pws[gid].i[11]; + w[12] = pws[gid].i[12]; + w[13] = pws[gid].i[13]; + w[14] = pws[gid].i[14]; + w[15] = pws[gid].i[15]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * sbox + */ + + __shared__ u32 s_lotus_magic_table[256]; + + s_lotus_magic_table[lid] = lotus_magic_table[lid]; + + __syncthreads (); + + if (gid >= gid_max) return; + + /** + * main + */ + + m08600m (s_lotus_magic_table, w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m08600_s04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const u32x * words_buf_r, void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + const u32 lid = threadIdx.x; + + u32 w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = 0; + w[ 5] = 0; + w[ 6] = 0; + w[ 7] = 0; + w[ 8] = 0; + w[ 9] = 0; + w[10] = 0; + w[11] = 0; + w[12] = 0; + w[13] = 0; + w[14] = 0; + w[15] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * sbox + */ + + __shared__ u32 s_lotus_magic_table[256]; + + s_lotus_magic_table[lid] = lotus_magic_table[lid]; + + __syncthreads (); + + if (gid >= gid_max) return; + + /** + * main + */ + + m08600s (s_lotus_magic_table, w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m08600_s08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const u32x * words_buf_r, void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + const u32 lid = threadIdx.x; + + u32 w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = pws[gid].i[ 4]; + w[ 5] = pws[gid].i[ 5]; + w[ 6] = pws[gid].i[ 6]; + w[ 7] = pws[gid].i[ 7]; + w[ 8] = 0; + w[ 9] = 0; + w[10] = 0; + w[11] = 0; + w[12] = 0; + w[13] = 0; + w[14] = 0; + w[15] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * sbox + */ + + __shared__ u32 s_lotus_magic_table[256]; + + s_lotus_magic_table[lid] = lotus_magic_table[lid]; + + __syncthreads (); + + if (gid >= gid_max) return; + + /** + * main + */ + + m08600s (s_lotus_magic_table, w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m08600_s16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const u32x * words_buf_r, void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + const u32 lid = threadIdx.x; + + u32 w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = pws[gid].i[ 4]; + w[ 5] = pws[gid].i[ 5]; + w[ 6] = pws[gid].i[ 6]; + w[ 7] = pws[gid].i[ 7]; + w[ 8] = pws[gid].i[ 8]; + w[ 9] = pws[gid].i[ 9]; + w[10] = pws[gid].i[10]; + w[11] = pws[gid].i[11]; + w[12] = pws[gid].i[12]; + w[13] = pws[gid].i[13]; + w[14] = pws[gid].i[14]; + w[15] = pws[gid].i[15]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * sbox + */ + + __shared__ u32 s_lotus_magic_table[256]; + + s_lotus_magic_table[lid] = lotus_magic_table[lid]; + + __syncthreads (); + + if (gid >= gid_max) return; + + /** + * main + */ + + m08600s (s_lotus_magic_table, w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} diff --git a/nv/m08700_a0.cu b/nv/m08700_a0.cu new file mode 100644 index 0000000000..7796948255 --- /dev/null +++ b/nv/m08700_a0.cu @@ -0,0 +1,723 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _LOTUS6_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW2 +#define VECT_SIZE1 +#endif + +#define DGST_R0 0 +#define DGST_R1 1 +#define DGST_R2 2 +#define DGST_R3 3 + +#include "include/kernel_functions.c" +#include "types_nv.c" +#include "common_nv.c" +#include "include/rp_gpu.h" +#include "rp_nv.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +__device__ __constant__ u32 lotus_magic_table[256] = +{ + 0xbd, 0x56, 0xea, 0xf2, 0xa2, 0xf1, 0xac, 0x2a, + 0xb0, 0x93, 0xd1, 0x9c, 0x1b, 0x33, 0xfd, 0xd0, + 0x30, 0x04, 0xb6, 0xdc, 0x7d, 0xdf, 0x32, 0x4b, + 0xf7, 0xcb, 0x45, 0x9b, 0x31, 0xbb, 0x21, 0x5a, + 0x41, 0x9f, 0xe1, 0xd9, 0x4a, 0x4d, 0x9e, 0xda, + 0xa0, 0x68, 0x2c, 0xc3, 0x27, 0x5f, 0x80, 0x36, + 0x3e, 0xee, 0xfb, 0x95, 0x1a, 0xfe, 0xce, 0xa8, + 0x34, 0xa9, 0x13, 0xf0, 0xa6, 0x3f, 0xd8, 0x0c, + 0x78, 0x24, 0xaf, 0x23, 0x52, 0xc1, 0x67, 0x17, + 0xf5, 0x66, 0x90, 0xe7, 0xe8, 0x07, 0xb8, 0x60, + 0x48, 0xe6, 0x1e, 0x53, 0xf3, 0x92, 0xa4, 0x72, + 0x8c, 0x08, 0x15, 0x6e, 0x86, 0x00, 0x84, 0xfa, + 0xf4, 0x7f, 0x8a, 0x42, 0x19, 0xf6, 0xdb, 0xcd, + 0x14, 0x8d, 0x50, 0x12, 0xba, 0x3c, 0x06, 0x4e, + 0xec, 0xb3, 0x35, 0x11, 0xa1, 0x88, 0x8e, 0x2b, + 0x94, 0x99, 0xb7, 0x71, 0x74, 0xd3, 0xe4, 0xbf, + 0x3a, 0xde, 0x96, 0x0e, 0xbc, 0x0a, 0xed, 0x77, + 0xfc, 0x37, 0x6b, 0x03, 0x79, 0x89, 0x62, 0xc6, + 0xd7, 0xc0, 0xd2, 0x7c, 0x6a, 0x8b, 0x22, 0xa3, + 0x5b, 0x05, 0x5d, 0x02, 0x75, 0xd5, 0x61, 0xe3, + 0x18, 0x8f, 0x55, 0x51, 0xad, 0x1f, 0x0b, 0x5e, + 0x85, 0xe5, 0xc2, 0x57, 0x63, 0xca, 0x3d, 0x6c, + 0xb4, 0xc5, 0xcc, 0x70, 0xb2, 0x91, 0x59, 0x0d, + 0x47, 0x20, 0xc8, 0x4f, 0x58, 0xe0, 0x01, 0xe2, + 0x16, 0x38, 0xc4, 0x6f, 0x3b, 0x0f, 0x65, 0x46, + 0xbe, 0x7e, 0x2d, 0x7b, 0x82, 0xf9, 0x40, 0xb5, + 0x1d, 0x73, 0xf8, 0xeb, 0x26, 0xc7, 0x87, 0x97, + 0x25, 0x54, 0xb1, 0x28, 0xaa, 0x98, 0x9d, 0xa5, + 0x64, 0x6d, 0x7a, 0xd4, 0x10, 0x81, 0x44, 0xef, + 0x49, 0xd6, 0xae, 0x2e, 0xdd, 0x76, 0x5c, 0x2f, + 0xa7, 0x1c, 0xc9, 0x09, 0x69, 0x9a, 0x83, 0xcf, + 0x29, 0x39, 0xb9, 0xe9, 0x4c, 0xff, 0x43, 0xab, +}; + +#ifdef VECT_SIZE1 +#define BOX(S,i) u32x ((S)[(i)]) +#endif + +#ifdef VECT_SIZE2 +#define BOX(S,i) u32x ((S)[(i).x], (S)[(i).y]) +#endif + +#ifdef VECT_SIZE1 +#define uint_to_hex_upper8(i) l_bin2asc[(i)] +#endif + +#ifdef VECT_SIZE2 +#define uint_to_hex_upper8(i) u32x (l_bin2asc[(i).x], l_bin2asc[(i).y]) +#endif + +__device__ __constant__ char c_bin2asc[16] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' }; + +__device__ __shared__ short l_bin2asc[256]; + +__device__ static void lotus_mix (u32x *in, u32 s_lotus_magic_table[256]) +{ + u32x p = 0; + + for (int i = 0; i < 18; i++) + { + u32 s = 48; + + #pragma unroll 12 + for (int j = 0; j < 12; j++) + { + u32x tmp_in = in[j]; + u32x tmp_out = 0; + + p = (p + s--) & 0xff; p = ((tmp_in >> 0) & 0xff) ^ BOX (s_lotus_magic_table, p); tmp_out |= p << 0; + p = (p + s--) & 0xff; p = ((tmp_in >> 8) & 0xff) ^ BOX (s_lotus_magic_table, p); tmp_out |= p << 8; + p = (p + s--) & 0xff; p = ((tmp_in >> 16) & 0xff) ^ BOX (s_lotus_magic_table, p); tmp_out |= p << 16; + p = (p + s--) & 0xff; p = ((tmp_in >> 24) & 0xff) ^ BOX (s_lotus_magic_table, p); tmp_out |= p << 24; + + in[j] = tmp_out; + } + } +} + +__device__ static void lotus_transform_password (u32x *in, u32x *out, u32 s_lotus_magic_table[256]) +{ + u32x t = out[3] >> 24; + + u32x c; + + for (int i = 0; i < 4; i++) + { + t ^= (in[i] >> 0) & 0xff; c = BOX (s_lotus_magic_table, t); out[i] ^= c << 0; t = ((out[i] >> 0) & 0xff); + t ^= (in[i] >> 8) & 0xff; c = BOX (s_lotus_magic_table, t); out[i] ^= c << 8; t = ((out[i] >> 8) & 0xff); + t ^= (in[i] >> 16) & 0xff; c = BOX (s_lotus_magic_table, t); out[i] ^= c << 16; t = ((out[i] >> 16) & 0xff); + t ^= (in[i] >> 24) & 0xff; c = BOX (s_lotus_magic_table, t); out[i] ^= c << 24; t = ((out[i] >> 24) & 0xff); + } +} + +__device__ static void pad (u32x w[4], const u32 len) +{ + const u32 val = 16 - len; + + const u32 mask1 = val << 24; + + const u32 mask2 = val << 16 + | val << 24; + + const u32 mask3 = val << 8 + | val << 16 + | val << 24; + + const u32 mask4 = val << 0 + | val << 8 + | val << 16 + | val << 24; + + switch (len) + { + case 0: w[0] = mask4; + w[1] = mask4; + w[2] = mask4; + w[3] = mask4; + break; + case 1: w[0] |= mask3; + w[1] = mask4; + w[2] = mask4; + w[3] = mask4; + break; + case 2: w[0] |= mask2; + w[1] = mask4; + w[2] = mask4; + w[3] = mask4; + break; + case 3: w[0] |= mask1; + w[1] = mask4; + w[2] = mask4; + w[3] = mask4; + break; + case 4: w[1] = mask4; + w[2] = mask4; + w[3] = mask4; + break; + case 5: w[1] |= mask3; + w[2] = mask4; + w[3] = mask4; + break; + case 6: w[1] |= mask2; + w[2] = mask4; + w[3] = mask4; + break; + case 7: w[1] |= mask1; + w[2] = mask4; + w[3] = mask4; + break; + case 8: w[2] = mask4; + w[3] = mask4; + break; + case 9: w[2] |= mask3; + w[3] = mask4; + break; + case 10: w[2] |= mask2; + w[3] = mask4; + break; + case 11: w[2] |= mask1; + w[3] = mask4; + break; + case 12: w[3] = mask4; + break; + case 13: w[3] |= mask3; + break; + case 14: w[3] |= mask2; + break; + case 15: w[3] |= mask1; + break; + } +} + +__device__ static void mdtransform_norecalc (u32x state[4], u32x block[4], u32 s_lotus_magic_table[256]) +{ + u32x x[12]; + + x[ 0] = state[0]; + x[ 1] = state[1]; + x[ 2] = state[2]; + x[ 3] = state[3]; + x[ 4] = block[0]; + x[ 5] = block[1]; + x[ 6] = block[2]; + x[ 7] = block[3]; + x[ 8] = state[0] ^ block[0]; + x[ 9] = state[1] ^ block[1]; + x[10] = state[2] ^ block[2]; + x[11] = state[3] ^ block[3]; + + lotus_mix (x, s_lotus_magic_table); + + state[0] = x[0]; + state[1] = x[1]; + state[2] = x[2]; + state[3] = x[3]; +} + +__device__ static void mdtransform (u32x state[4], u32x checksum[4], u32x block[4], u32 s_lotus_magic_table[256]) +{ + mdtransform_norecalc (state, block, s_lotus_magic_table); + + lotus_transform_password (block, checksum, s_lotus_magic_table); +} + +__device__ static void domino_big_md (const u32x saved_key[16], const u32 size, u32x state[4], u32 s_lotus_magic_table[256]) +{ + u32x checksum[4]; + + checksum[0] = 0; + checksum[1] = 0; + checksum[2] = 0; + checksum[3] = 0; + + u32x block[4]; + + block[0] = 0; + block[1] = 0; + block[2] = 0; + block[3] = 0; + + u32 curpos; + u32 idx; + + for (curpos = 0, idx = 0; curpos + 16 < size; curpos += 16, idx += 4) + { + block[0] = saved_key[idx + 0]; + block[1] = saved_key[idx + 1]; + block[2] = saved_key[idx + 2]; + block[3] = saved_key[idx + 3]; + + mdtransform (state, checksum, block, s_lotus_magic_table); + } + + u32 left = size - curpos; + + block[0] = saved_key[idx + 0]; + block[1] = saved_key[idx + 1]; + block[2] = saved_key[idx + 2]; + block[3] = saved_key[idx + 3]; + + mdtransform (state, checksum, block, s_lotus_magic_table); + + mdtransform_norecalc (state, checksum, s_lotus_magic_table); +} + +__device__ __constant__ gpu_rule_t c_rules[1024]; + +extern "C" __global__ void __launch_bounds__ (256, 1) m08700_m04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + /** + * bin2asc table + */ + + l_bin2asc[lid] = c_bin2asc[(lid >> 0) & 15] << 8 + | c_bin2asc[(lid >> 4) & 15] << 0; + + __syncthreads (); + + /** + * sbox + */ + + __shared__ u32 s_lotus_magic_table[256]; + + s_lotus_magic_table[lid] = lotus_magic_table[lid]; + + __syncthreads (); + + if (gid >= gid_max) return; + + /** + * base + */ + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + u32x pw_buf1[4]; + + pw_buf1[0] = pws[gid].i[ 4]; + pw_buf1[1] = pws[gid].i[ 5]; + pw_buf1[2] = pws[gid].i[ 6]; + pw_buf1[3] = pws[gid].i[ 7]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * salt + */ + + const u32 salt0 = salt_bufs[salt_pos].salt_buf[0]; + const u32 salt1 = salt_bufs[salt_pos].salt_buf[1] & 0xff | '(' << 8; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + + w0[0] = pw_buf0[0]; + w0[1] = pw_buf0[1]; + w0[2] = pw_buf0[2]; + w0[3] = pw_buf0[3]; + + u32x w1[4]; + + w1[0] = pw_buf1[0]; + w1[1] = pw_buf1[1]; + w1[2] = pw_buf1[2]; + w1[3] = pw_buf1[3]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 out_len = apply_rules (c_rules[il_pos].cmds, w0, w1, pw_len); + + u32x w[16]; + + w[ 0] = w0[0]; + w[ 1] = w0[1]; + w[ 2] = w0[2]; + w[ 3] = w0[3]; + w[ 4] = w1[0]; + w[ 5] = w1[1]; + w[ 6] = w1[2]; + w[ 7] = w1[3]; + w[ 8] = w2[0]; + w[ 9] = w2[1]; + w[10] = w2[2]; + w[11] = w2[3]; + w[12] = w3[0]; + w[13] = w3[1]; + w[14] = w3[2]; + w[15] = w3[3]; + + u32x state[4]; + + state[0] = 0; + state[1] = 0; + state[2] = 0; + state[3] = 0; + + /** + * padding + */ + + if (pw_len < 16) + { + pad (&w[ 0], pw_len & 0xf); + } + else if (pw_len < 32) + { + pad (&w[ 4], pw_len & 0xf); + } + else if (pw_len < 48) + { + pad (&w[ 8], pw_len & 0xf); + } + else if (pw_len < 64) + { + pad (&w[12], pw_len & 0xf); + } + + domino_big_md (w, pw_len, state, s_lotus_magic_table); + + const u32x w0_t = uint_to_hex_upper8 ((state[0] >> 0) & 255) << 0 + | uint_to_hex_upper8 ((state[0] >> 8) & 255) << 16; + const u32x w1_t = uint_to_hex_upper8 ((state[0] >> 16) & 255) << 0 + | uint_to_hex_upper8 ((state[0] >> 24) & 255) << 16; + const u32x w2_t = uint_to_hex_upper8 ((state[1] >> 0) & 255) << 0 + | uint_to_hex_upper8 ((state[1] >> 8) & 255) << 16; + const u32x w3_t = uint_to_hex_upper8 ((state[1] >> 16) & 255) << 0 + | uint_to_hex_upper8 ((state[1] >> 24) & 255) << 16; + const u32x w4_t = uint_to_hex_upper8 ((state[2] >> 0) & 255) << 0 + | uint_to_hex_upper8 ((state[2] >> 8) & 255) << 16; + const u32x w5_t = uint_to_hex_upper8 ((state[2] >> 16) & 255) << 0 + | uint_to_hex_upper8 ((state[2] >> 24) & 255) << 16; + const u32x w6_t = uint_to_hex_upper8 ((state[3] >> 0) & 255) << 0 + | uint_to_hex_upper8 ((state[3] >> 8) & 255) << 16; + //const u32x w7_t = uint_to_hex_upper8 ((state[3] >> 16) & 255) << 0 + // | uint_to_hex_upper8 ((state[3] >> 24) & 255) << 16; + + const u32 pade = 0x0e0e0e0e; + + w[ 0] = salt0; + w[ 1] = salt1 | w0_t << 16; + w[ 2] = w0_t >> 16 | w1_t << 16; + w[ 3] = w1_t >> 16 | w2_t << 16; + w[ 4] = w2_t >> 16 | w3_t << 16; + w[ 5] = w3_t >> 16 | w4_t << 16; + w[ 6] = w4_t >> 16 | w5_t << 16; + w[ 7] = w5_t >> 16 | w6_t << 16; + w[ 8] = w6_t >> 16 | pade << 16; // | w7_t << 8; + w[ 9] = pade; + w[10] = pade; + w[11] = pade; + w[12] = 0; + w[13] = 0; + w[14] = 0; + w[15] = 0; + + state[0] = 0; + state[1] = 0; + state[2] = 0; + state[3] = 0; + + domino_big_md (w, 34, state, s_lotus_magic_table); + + u32x a = state[0] & 0xffffffff; + u32x b = state[1] & 0xffffffff; + u32x c = state[2] & 0x000000ff; + u32x d = state[3] & 0x00000000; + + const u32x r0 = a; + const u32x r1 = b; + const u32x r2 = c; + const u32x r3 = d; + + #include VECT_COMPARE_M + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m08700_m08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m08700_m16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m08700_s04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + /** + * bin2asc table + */ + + l_bin2asc[lid] = c_bin2asc[(lid >> 0) & 15] << 8 + | c_bin2asc[(lid >> 4) & 15] << 0; + + __syncthreads (); + + /** + * sbox + */ + + __shared__ u32 s_lotus_magic_table[256]; + + s_lotus_magic_table[lid] = lotus_magic_table[lid]; + + __syncthreads (); + + if (gid >= gid_max) return; + + /** + * base + */ + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + u32x pw_buf1[4]; + + pw_buf1[0] = pws[gid].i[ 4]; + pw_buf1[1] = pws[gid].i[ 5]; + pw_buf1[2] = pws[gid].i[ 6]; + pw_buf1[3] = pws[gid].i[ 7]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * salt + */ + + const u32 salt0 = salt_bufs[salt_pos].salt_buf[0]; + const u32 salt1 = salt_bufs[salt_pos].salt_buf[1] & 0xff | '(' << 8; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + + w0[0] = pw_buf0[0]; + w0[1] = pw_buf0[1]; + w0[2] = pw_buf0[2]; + w0[3] = pw_buf0[3]; + + u32x w1[4]; + + w1[0] = pw_buf1[0]; + w1[1] = pw_buf1[1]; + w1[2] = pw_buf1[2]; + w1[3] = pw_buf1[3]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 out_len = apply_rules (c_rules[il_pos].cmds, w0, w1, pw_len); + + u32x w[16]; + + w[ 0] = w0[0]; + w[ 1] = w0[1]; + w[ 2] = w0[2]; + w[ 3] = w0[3]; + w[ 4] = w1[0]; + w[ 5] = w1[1]; + w[ 6] = w1[2]; + w[ 7] = w1[3]; + w[ 8] = w2[0]; + w[ 9] = w2[1]; + w[10] = w2[2]; + w[11] = w2[3]; + w[12] = w3[0]; + w[13] = w3[1]; + w[14] = w3[2]; + w[15] = w3[3]; + + u32x state[4]; + + state[0] = 0; + state[1] = 0; + state[2] = 0; + state[3] = 0; + + /** + * padding + */ + + if (pw_len < 16) + { + pad (&w[ 0], pw_len & 0xf); + } + else if (pw_len < 32) + { + pad (&w[ 4], pw_len & 0xf); + } + else if (pw_len < 48) + { + pad (&w[ 8], pw_len & 0xf); + } + else if (pw_len < 64) + { + pad (&w[12], pw_len & 0xf); + } + + domino_big_md (w, pw_len, state, s_lotus_magic_table); + + const u32x w0_t = uint_to_hex_upper8 ((state[0] >> 0) & 255) << 0 + | uint_to_hex_upper8 ((state[0] >> 8) & 255) << 16; + const u32x w1_t = uint_to_hex_upper8 ((state[0] >> 16) & 255) << 0 + | uint_to_hex_upper8 ((state[0] >> 24) & 255) << 16; + const u32x w2_t = uint_to_hex_upper8 ((state[1] >> 0) & 255) << 0 + | uint_to_hex_upper8 ((state[1] >> 8) & 255) << 16; + const u32x w3_t = uint_to_hex_upper8 ((state[1] >> 16) & 255) << 0 + | uint_to_hex_upper8 ((state[1] >> 24) & 255) << 16; + const u32x w4_t = uint_to_hex_upper8 ((state[2] >> 0) & 255) << 0 + | uint_to_hex_upper8 ((state[2] >> 8) & 255) << 16; + const u32x w5_t = uint_to_hex_upper8 ((state[2] >> 16) & 255) << 0 + | uint_to_hex_upper8 ((state[2] >> 24) & 255) << 16; + const u32x w6_t = uint_to_hex_upper8 ((state[3] >> 0) & 255) << 0 + | uint_to_hex_upper8 ((state[3] >> 8) & 255) << 16; + //const u32x w7_t = uint_to_hex_upper8 ((state[3] >> 16) & 255) << 0 + // | uint_to_hex_upper8 ((state[3] >> 24) & 255) << 16; + + const u32 pade = 0x0e0e0e0e; + + w[ 0] = salt0; + w[ 1] = salt1 | w0_t << 16; + w[ 2] = w0_t >> 16 | w1_t << 16; + w[ 3] = w1_t >> 16 | w2_t << 16; + w[ 4] = w2_t >> 16 | w3_t << 16; + w[ 5] = w3_t >> 16 | w4_t << 16; + w[ 6] = w4_t >> 16 | w5_t << 16; + w[ 7] = w5_t >> 16 | w6_t << 16; + w[ 8] = w6_t >> 16 | pade << 16; // | w7_t << 8; + w[ 9] = pade; + w[10] = pade; + w[11] = pade; + w[12] = 0; + w[13] = 0; + w[14] = 0; + w[15] = 0; + + state[0] = 0; + state[1] = 0; + state[2] = 0; + state[3] = 0; + + domino_big_md (w, 34, state, s_lotus_magic_table); + + u32x a = state[0] & 0xffffffff; + u32x b = state[1] & 0xffffffff; + u32x c = state[2] & 0x000000ff; + u32x d = state[3] & 0x00000000; + + const u32x r0 = a; + const u32x r1 = b; + const u32x r2 = c; + const u32x r3 = d; + + #include VECT_COMPARE_S + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m08700_s08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m08700_s16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/nv/m08700_a1.cu b/nv/m08700_a1.cu new file mode 100644 index 0000000000..bde1f1240a --- /dev/null +++ b/nv/m08700_a1.cu @@ -0,0 +1,774 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _LOTUS6_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW2 +#define VECT_SIZE1 +#endif + +#define DGST_R0 0 +#define DGST_R1 1 +#define DGST_R2 2 +#define DGST_R3 3 + +#include "include/kernel_functions.c" +#include "types_nv.c" +#include "common_nv.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +__device__ __constant__ u32 lotus_magic_table[256] = +{ + 0xbd, 0x56, 0xea, 0xf2, 0xa2, 0xf1, 0xac, 0x2a, + 0xb0, 0x93, 0xd1, 0x9c, 0x1b, 0x33, 0xfd, 0xd0, + 0x30, 0x04, 0xb6, 0xdc, 0x7d, 0xdf, 0x32, 0x4b, + 0xf7, 0xcb, 0x45, 0x9b, 0x31, 0xbb, 0x21, 0x5a, + 0x41, 0x9f, 0xe1, 0xd9, 0x4a, 0x4d, 0x9e, 0xda, + 0xa0, 0x68, 0x2c, 0xc3, 0x27, 0x5f, 0x80, 0x36, + 0x3e, 0xee, 0xfb, 0x95, 0x1a, 0xfe, 0xce, 0xa8, + 0x34, 0xa9, 0x13, 0xf0, 0xa6, 0x3f, 0xd8, 0x0c, + 0x78, 0x24, 0xaf, 0x23, 0x52, 0xc1, 0x67, 0x17, + 0xf5, 0x66, 0x90, 0xe7, 0xe8, 0x07, 0xb8, 0x60, + 0x48, 0xe6, 0x1e, 0x53, 0xf3, 0x92, 0xa4, 0x72, + 0x8c, 0x08, 0x15, 0x6e, 0x86, 0x00, 0x84, 0xfa, + 0xf4, 0x7f, 0x8a, 0x42, 0x19, 0xf6, 0xdb, 0xcd, + 0x14, 0x8d, 0x50, 0x12, 0xba, 0x3c, 0x06, 0x4e, + 0xec, 0xb3, 0x35, 0x11, 0xa1, 0x88, 0x8e, 0x2b, + 0x94, 0x99, 0xb7, 0x71, 0x74, 0xd3, 0xe4, 0xbf, + 0x3a, 0xde, 0x96, 0x0e, 0xbc, 0x0a, 0xed, 0x77, + 0xfc, 0x37, 0x6b, 0x03, 0x79, 0x89, 0x62, 0xc6, + 0xd7, 0xc0, 0xd2, 0x7c, 0x6a, 0x8b, 0x22, 0xa3, + 0x5b, 0x05, 0x5d, 0x02, 0x75, 0xd5, 0x61, 0xe3, + 0x18, 0x8f, 0x55, 0x51, 0xad, 0x1f, 0x0b, 0x5e, + 0x85, 0xe5, 0xc2, 0x57, 0x63, 0xca, 0x3d, 0x6c, + 0xb4, 0xc5, 0xcc, 0x70, 0xb2, 0x91, 0x59, 0x0d, + 0x47, 0x20, 0xc8, 0x4f, 0x58, 0xe0, 0x01, 0xe2, + 0x16, 0x38, 0xc4, 0x6f, 0x3b, 0x0f, 0x65, 0x46, + 0xbe, 0x7e, 0x2d, 0x7b, 0x82, 0xf9, 0x40, 0xb5, + 0x1d, 0x73, 0xf8, 0xeb, 0x26, 0xc7, 0x87, 0x97, + 0x25, 0x54, 0xb1, 0x28, 0xaa, 0x98, 0x9d, 0xa5, + 0x64, 0x6d, 0x7a, 0xd4, 0x10, 0x81, 0x44, 0xef, + 0x49, 0xd6, 0xae, 0x2e, 0xdd, 0x76, 0x5c, 0x2f, + 0xa7, 0x1c, 0xc9, 0x09, 0x69, 0x9a, 0x83, 0xcf, + 0x29, 0x39, 0xb9, 0xe9, 0x4c, 0xff, 0x43, 0xab, +}; + +#ifdef VECT_SIZE1 +#define BOX(S,i) u32x ((S)[(i)]) +#endif + +#ifdef VECT_SIZE2 +#define BOX(S,i) u32x ((S)[(i).x], (S)[(i).y]) +#endif + +#ifdef VECT_SIZE1 +#define uint_to_hex_upper8(i) l_bin2asc[(i)] +#endif + +#ifdef VECT_SIZE2 +#define uint_to_hex_upper8(i) u32x (l_bin2asc[(i).x], l_bin2asc[(i).y]) +#endif + +__device__ __constant__ char c_bin2asc[16] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' }; + +__device__ __shared__ short l_bin2asc[256]; + +__device__ static void lotus_mix (u32x *in, u32 s_lotus_magic_table[256]) +{ + u32x p = 0; + + for (int i = 0; i < 18; i++) + { + u32 s = 48; + + #pragma unroll 12 + for (int j = 0; j < 12; j++) + { + u32x tmp_in = in[j]; + u32x tmp_out = 0; + + p = (p + s--) & 0xff; p = ((tmp_in >> 0) & 0xff) ^ BOX (s_lotus_magic_table, p); tmp_out |= p << 0; + p = (p + s--) & 0xff; p = ((tmp_in >> 8) & 0xff) ^ BOX (s_lotus_magic_table, p); tmp_out |= p << 8; + p = (p + s--) & 0xff; p = ((tmp_in >> 16) & 0xff) ^ BOX (s_lotus_magic_table, p); tmp_out |= p << 16; + p = (p + s--) & 0xff; p = ((tmp_in >> 24) & 0xff) ^ BOX (s_lotus_magic_table, p); tmp_out |= p << 24; + + in[j] = tmp_out; + } + } +} + +__device__ static void lotus_transform_password (u32x *in, u32x *out, u32 s_lotus_magic_table[256]) +{ + u32x t = out[3] >> 24; + + u32x c; + + for (int i = 0; i < 4; i++) + { + t ^= (in[i] >> 0) & 0xff; c = BOX (s_lotus_magic_table, t); out[i] ^= c << 0; t = ((out[i] >> 0) & 0xff); + t ^= (in[i] >> 8) & 0xff; c = BOX (s_lotus_magic_table, t); out[i] ^= c << 8; t = ((out[i] >> 8) & 0xff); + t ^= (in[i] >> 16) & 0xff; c = BOX (s_lotus_magic_table, t); out[i] ^= c << 16; t = ((out[i] >> 16) & 0xff); + t ^= (in[i] >> 24) & 0xff; c = BOX (s_lotus_magic_table, t); out[i] ^= c << 24; t = ((out[i] >> 24) & 0xff); + } +} + +__device__ static void pad (u32x w[4], const u32 len) +{ + const u32 val = 16 - len; + + const u32 mask1 = val << 24; + + const u32 mask2 = val << 16 + | val << 24; + + const u32 mask3 = val << 8 + | val << 16 + | val << 24; + + const u32 mask4 = val << 0 + | val << 8 + | val << 16 + | val << 24; + + switch (len) + { + case 0: w[0] = mask4; + w[1] = mask4; + w[2] = mask4; + w[3] = mask4; + break; + case 1: w[0] |= mask3; + w[1] = mask4; + w[2] = mask4; + w[3] = mask4; + break; + case 2: w[0] |= mask2; + w[1] = mask4; + w[2] = mask4; + w[3] = mask4; + break; + case 3: w[0] |= mask1; + w[1] = mask4; + w[2] = mask4; + w[3] = mask4; + break; + case 4: w[1] = mask4; + w[2] = mask4; + w[3] = mask4; + break; + case 5: w[1] |= mask3; + w[2] = mask4; + w[3] = mask4; + break; + case 6: w[1] |= mask2; + w[2] = mask4; + w[3] = mask4; + break; + case 7: w[1] |= mask1; + w[2] = mask4; + w[3] = mask4; + break; + case 8: w[2] = mask4; + w[3] = mask4; + break; + case 9: w[2] |= mask3; + w[3] = mask4; + break; + case 10: w[2] |= mask2; + w[3] = mask4; + break; + case 11: w[2] |= mask1; + w[3] = mask4; + break; + case 12: w[3] = mask4; + break; + case 13: w[3] |= mask3; + break; + case 14: w[3] |= mask2; + break; + case 15: w[3] |= mask1; + break; + } +} + +__device__ static void mdtransform_norecalc (u32x state[4], u32x block[4], u32 s_lotus_magic_table[256]) +{ + u32x x[12]; + + x[ 0] = state[0]; + x[ 1] = state[1]; + x[ 2] = state[2]; + x[ 3] = state[3]; + x[ 4] = block[0]; + x[ 5] = block[1]; + x[ 6] = block[2]; + x[ 7] = block[3]; + x[ 8] = state[0] ^ block[0]; + x[ 9] = state[1] ^ block[1]; + x[10] = state[2] ^ block[2]; + x[11] = state[3] ^ block[3]; + + lotus_mix (x, s_lotus_magic_table); + + state[0] = x[0]; + state[1] = x[1]; + state[2] = x[2]; + state[3] = x[3]; +} + +__device__ static void mdtransform (u32x state[4], u32x checksum[4], u32x block[4], u32 s_lotus_magic_table[256]) +{ + mdtransform_norecalc (state, block, s_lotus_magic_table); + + lotus_transform_password (block, checksum, s_lotus_magic_table); +} + +__device__ static void domino_big_md (const u32x saved_key[16], const u32 size, u32x state[4], u32 s_lotus_magic_table[256]) +{ + u32x checksum[4]; + + checksum[0] = 0; + checksum[1] = 0; + checksum[2] = 0; + checksum[3] = 0; + + u32x block[4]; + + block[0] = 0; + block[1] = 0; + block[2] = 0; + block[3] = 0; + + u32 curpos; + u32 idx; + + for (curpos = 0, idx = 0; curpos + 16 < size; curpos += 16, idx += 4) + { + block[0] = saved_key[idx + 0]; + block[1] = saved_key[idx + 1]; + block[2] = saved_key[idx + 2]; + block[3] = saved_key[idx + 3]; + + mdtransform (state, checksum, block, s_lotus_magic_table); + } + + u32 left = size - curpos; + + block[0] = saved_key[idx + 0]; + block[1] = saved_key[idx + 1]; + block[2] = saved_key[idx + 2]; + block[3] = saved_key[idx + 3]; + + mdtransform (state, checksum, block, s_lotus_magic_table); + + mdtransform_norecalc (state, checksum, s_lotus_magic_table); +} + +__device__ __constant__ comb_t c_combs[1024]; + +extern "C" __global__ void __launch_bounds__ (256, 1) m08700_m04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + /** + * bin2asc table + */ + + l_bin2asc[lid] = c_bin2asc[(lid >> 0) & 15] << 8 + | c_bin2asc[(lid >> 4) & 15] << 0; + + __syncthreads (); + + /** + * sbox + */ + + __shared__ u32 s_lotus_magic_table[256]; + + s_lotus_magic_table[lid] = lotus_magic_table[lid]; + + __syncthreads (); + + if (gid >= gid_max) return; + + /** + * base + */ + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, c_combs[0].pw_len); + } + + /** + * salt + */ + + const u32 salt0 = salt_bufs[salt_pos].salt_buf[0]; + const u32 salt1 = salt_bufs[salt_pos].salt_buf[1] & 0xff | '(' << 8; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = c_combs[il_pos].pw_len; + + const u32 pw_len = pw_l_len + pw_r_len; + + u32 wordr0[4]; + + wordr0[0] = c_combs[il_pos].i[0]; + wordr0[1] = c_combs[il_pos].i[1]; + wordr0[2] = c_combs[il_pos].i[2]; + wordr0[3] = c_combs[il_pos].i[3]; + + u32 wordr1[4]; + + wordr1[0] = c_combs[il_pos].i[4]; + wordr1[1] = c_combs[il_pos].i[5]; + wordr1[2] = c_combs[il_pos].i[6]; + wordr1[3] = c_combs[il_pos].i[7]; + + u32 wordr2[4]; + + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + + u32 wordr3[4]; + + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + u32x w[16]; + + w[ 0] = wordl0[0] | wordr0[0]; + w[ 1] = wordl0[1] | wordr0[1]; + w[ 2] = wordl0[2] | wordr0[2]; + w[ 3] = wordl0[3] | wordr0[3]; + w[ 4] = wordl1[0] | wordr1[0]; + w[ 5] = wordl1[1] | wordr1[1]; + w[ 6] = wordl1[2] | wordr1[2]; + w[ 7] = wordl1[3] | wordr1[3]; + w[ 8] = wordl2[0] | wordr2[0]; + w[ 9] = wordl2[1] | wordr2[1]; + w[10] = wordl2[2] | wordr2[2]; + w[11] = wordl2[3] | wordr2[3]; + w[12] = wordl3[0] | wordr3[0]; + w[13] = wordl3[1] | wordr3[1]; + w[14] = wordl3[2] | wordr3[2]; + w[15] = wordl3[3] | wordr3[3]; + + u32x state[4]; + + state[0] = 0; + state[1] = 0; + state[2] = 0; + state[3] = 0; + + /** + * padding + */ + + if (pw_len < 16) + { + pad (&w[ 0], pw_len & 0xf); + } + else if (pw_len < 32) + { + pad (&w[ 4], pw_len & 0xf); + } + else if (pw_len < 48) + { + pad (&w[ 8], pw_len & 0xf); + } + else if (pw_len < 64) + { + pad (&w[12], pw_len & 0xf); + } + + domino_big_md (w, pw_len, state, s_lotus_magic_table); + + const u32x w0_t = uint_to_hex_upper8 ((state[0] >> 0) & 255) << 0 + | uint_to_hex_upper8 ((state[0] >> 8) & 255) << 16; + const u32x w1_t = uint_to_hex_upper8 ((state[0] >> 16) & 255) << 0 + | uint_to_hex_upper8 ((state[0] >> 24) & 255) << 16; + const u32x w2_t = uint_to_hex_upper8 ((state[1] >> 0) & 255) << 0 + | uint_to_hex_upper8 ((state[1] >> 8) & 255) << 16; + const u32x w3_t = uint_to_hex_upper8 ((state[1] >> 16) & 255) << 0 + | uint_to_hex_upper8 ((state[1] >> 24) & 255) << 16; + const u32x w4_t = uint_to_hex_upper8 ((state[2] >> 0) & 255) << 0 + | uint_to_hex_upper8 ((state[2] >> 8) & 255) << 16; + const u32x w5_t = uint_to_hex_upper8 ((state[2] >> 16) & 255) << 0 + | uint_to_hex_upper8 ((state[2] >> 24) & 255) << 16; + const u32x w6_t = uint_to_hex_upper8 ((state[3] >> 0) & 255) << 0 + | uint_to_hex_upper8 ((state[3] >> 8) & 255) << 16; + //const u32x w7_t = uint_to_hex_upper8 ((state[3] >> 16) & 255) << 0 + // | uint_to_hex_upper8 ((state[3] >> 24) & 255) << 16; + + const u32 pade = 0x0e0e0e0e; + + w[ 0] = salt0; + w[ 1] = salt1 | w0_t << 16; + w[ 2] = w0_t >> 16 | w1_t << 16; + w[ 3] = w1_t >> 16 | w2_t << 16; + w[ 4] = w2_t >> 16 | w3_t << 16; + w[ 5] = w3_t >> 16 | w4_t << 16; + w[ 6] = w4_t >> 16 | w5_t << 16; + w[ 7] = w5_t >> 16 | w6_t << 16; + w[ 8] = w6_t >> 16 | pade << 16; // | w7_t << 8; + w[ 9] = pade; + w[10] = pade; + w[11] = pade; + w[12] = 0; + w[13] = 0; + w[14] = 0; + w[15] = 0; + + state[0] = 0; + state[1] = 0; + state[2] = 0; + state[3] = 0; + + domino_big_md (w, 34, state, s_lotus_magic_table); + + u32x a = state[0] & 0xffffffff; + u32x b = state[1] & 0xffffffff; + u32x c = state[2] & 0x000000ff; + u32x d = state[3] & 0x00000000; + + const u32x r0 = a; + const u32x r1 = b; + const u32x r2 = c; + const u32x r3 = d; + + #include VECT_COMPARE_M + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m08700_m08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m08700_m16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m08700_s04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + /** + * bin2asc table + */ + + l_bin2asc[lid] = c_bin2asc[(lid >> 0) & 15] << 8 + | c_bin2asc[(lid >> 4) & 15] << 0; + + __syncthreads (); + + /** + * sbox + */ + + __shared__ u32 s_lotus_magic_table[256]; + + s_lotus_magic_table[lid] = lotus_magic_table[lid]; + + __syncthreads (); + + if (gid >= gid_max) return; + + /** + * base + */ + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, c_combs[0].pw_len); + } + + /** + * salt + */ + + const u32 salt0 = salt_bufs[salt_pos].salt_buf[0]; + const u32 salt1 = salt_bufs[salt_pos].salt_buf[1] & 0xff | '(' << 8; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = c_combs[il_pos].pw_len; + + const u32 pw_len = pw_l_len + pw_r_len; + + u32 wordr0[4]; + + wordr0[0] = c_combs[il_pos].i[0]; + wordr0[1] = c_combs[il_pos].i[1]; + wordr0[2] = c_combs[il_pos].i[2]; + wordr0[3] = c_combs[il_pos].i[3]; + + u32 wordr1[4]; + + wordr1[0] = c_combs[il_pos].i[4]; + wordr1[1] = c_combs[il_pos].i[5]; + wordr1[2] = c_combs[il_pos].i[6]; + wordr1[3] = c_combs[il_pos].i[7]; + + u32 wordr2[4]; + + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + + u32 wordr3[4]; + + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + u32x w[16]; + + w[ 0] = wordl0[0] | wordr0[0]; + w[ 1] = wordl0[1] | wordr0[1]; + w[ 2] = wordl0[2] | wordr0[2]; + w[ 3] = wordl0[3] | wordr0[3]; + w[ 4] = wordl1[0] | wordr1[0]; + w[ 5] = wordl1[1] | wordr1[1]; + w[ 6] = wordl1[2] | wordr1[2]; + w[ 7] = wordl1[3] | wordr1[3]; + w[ 8] = wordl2[0] | wordr2[0]; + w[ 9] = wordl2[1] | wordr2[1]; + w[10] = wordl2[2] | wordr2[2]; + w[11] = wordl2[3] | wordr2[3]; + w[12] = wordl3[0] | wordr3[0]; + w[13] = wordl3[1] | wordr3[1]; + w[14] = wordl3[2] | wordr3[2]; + w[15] = wordl3[3] | wordr3[3]; + + u32x state[4]; + + state[0] = 0; + state[1] = 0; + state[2] = 0; + state[3] = 0; + + /** + * padding + */ + + if (pw_len < 16) + { + pad (&w[ 0], pw_len & 0xf); + } + else if (pw_len < 32) + { + pad (&w[ 4], pw_len & 0xf); + } + else if (pw_len < 48) + { + pad (&w[ 8], pw_len & 0xf); + } + else if (pw_len < 64) + { + pad (&w[12], pw_len & 0xf); + } + + domino_big_md (w, pw_len, state, s_lotus_magic_table); + + const u32x w0_t = uint_to_hex_upper8 ((state[0] >> 0) & 255) << 0 + | uint_to_hex_upper8 ((state[0] >> 8) & 255) << 16; + const u32x w1_t = uint_to_hex_upper8 ((state[0] >> 16) & 255) << 0 + | uint_to_hex_upper8 ((state[0] >> 24) & 255) << 16; + const u32x w2_t = uint_to_hex_upper8 ((state[1] >> 0) & 255) << 0 + | uint_to_hex_upper8 ((state[1] >> 8) & 255) << 16; + const u32x w3_t = uint_to_hex_upper8 ((state[1] >> 16) & 255) << 0 + | uint_to_hex_upper8 ((state[1] >> 24) & 255) << 16; + const u32x w4_t = uint_to_hex_upper8 ((state[2] >> 0) & 255) << 0 + | uint_to_hex_upper8 ((state[2] >> 8) & 255) << 16; + const u32x w5_t = uint_to_hex_upper8 ((state[2] >> 16) & 255) << 0 + | uint_to_hex_upper8 ((state[2] >> 24) & 255) << 16; + const u32x w6_t = uint_to_hex_upper8 ((state[3] >> 0) & 255) << 0 + | uint_to_hex_upper8 ((state[3] >> 8) & 255) << 16; + //const u32x w7_t = uint_to_hex_upper8 ((state[3] >> 16) & 255) << 0 + // | uint_to_hex_upper8 ((state[3] >> 24) & 255) << 16; + + const u32 pade = 0x0e0e0e0e; + + w[ 0] = salt0; + w[ 1] = salt1 | w0_t << 16; + w[ 2] = w0_t >> 16 | w1_t << 16; + w[ 3] = w1_t >> 16 | w2_t << 16; + w[ 4] = w2_t >> 16 | w3_t << 16; + w[ 5] = w3_t >> 16 | w4_t << 16; + w[ 6] = w4_t >> 16 | w5_t << 16; + w[ 7] = w5_t >> 16 | w6_t << 16; + w[ 8] = w6_t >> 16 | pade << 16; // | w7_t << 8; + w[ 9] = pade; + w[10] = pade; + w[11] = pade; + w[12] = 0; + w[13] = 0; + w[14] = 0; + w[15] = 0; + + state[0] = 0; + state[1] = 0; + state[2] = 0; + state[3] = 0; + + domino_big_md (w, 34, state, s_lotus_magic_table); + + u32x a = state[0] & 0xffffffff; + u32x b = state[1] & 0xffffffff; + u32x c = state[2] & 0x000000ff; + u32x d = state[3] & 0x00000000; + + const u32x r0 = a; + const u32x r1 = b; + const u32x r2 = c; + const u32x r3 = d; + + #include VECT_COMPARE_S + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m08700_s08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m08700_s16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/nv/m08700_a3.cu b/nv/m08700_a3.cu new file mode 100644 index 0000000000..d9d4257fd7 --- /dev/null +++ b/nv/m08700_a3.cu @@ -0,0 +1,919 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _LOTUS6_ +#define _SCALAR_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW2 +#define VECT_SIZE1 +#endif + +#define DGST_R0 0 +#define DGST_R1 1 +#define DGST_R2 2 +#define DGST_R3 3 + +#include "include/kernel_functions.c" +#include "types_nv.c" +#include "common_nv.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4_warp.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4_warp.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4_warp.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4_warp.c" +#endif + +__device__ __constant__ u32 lotus_magic_table[256] = +{ + 0xbd, 0x56, 0xea, 0xf2, 0xa2, 0xf1, 0xac, 0x2a, + 0xb0, 0x93, 0xd1, 0x9c, 0x1b, 0x33, 0xfd, 0xd0, + 0x30, 0x04, 0xb6, 0xdc, 0x7d, 0xdf, 0x32, 0x4b, + 0xf7, 0xcb, 0x45, 0x9b, 0x31, 0xbb, 0x21, 0x5a, + 0x41, 0x9f, 0xe1, 0xd9, 0x4a, 0x4d, 0x9e, 0xda, + 0xa0, 0x68, 0x2c, 0xc3, 0x27, 0x5f, 0x80, 0x36, + 0x3e, 0xee, 0xfb, 0x95, 0x1a, 0xfe, 0xce, 0xa8, + 0x34, 0xa9, 0x13, 0xf0, 0xa6, 0x3f, 0xd8, 0x0c, + 0x78, 0x24, 0xaf, 0x23, 0x52, 0xc1, 0x67, 0x17, + 0xf5, 0x66, 0x90, 0xe7, 0xe8, 0x07, 0xb8, 0x60, + 0x48, 0xe6, 0x1e, 0x53, 0xf3, 0x92, 0xa4, 0x72, + 0x8c, 0x08, 0x15, 0x6e, 0x86, 0x00, 0x84, 0xfa, + 0xf4, 0x7f, 0x8a, 0x42, 0x19, 0xf6, 0xdb, 0xcd, + 0x14, 0x8d, 0x50, 0x12, 0xba, 0x3c, 0x06, 0x4e, + 0xec, 0xb3, 0x35, 0x11, 0xa1, 0x88, 0x8e, 0x2b, + 0x94, 0x99, 0xb7, 0x71, 0x74, 0xd3, 0xe4, 0xbf, + 0x3a, 0xde, 0x96, 0x0e, 0xbc, 0x0a, 0xed, 0x77, + 0xfc, 0x37, 0x6b, 0x03, 0x79, 0x89, 0x62, 0xc6, + 0xd7, 0xc0, 0xd2, 0x7c, 0x6a, 0x8b, 0x22, 0xa3, + 0x5b, 0x05, 0x5d, 0x02, 0x75, 0xd5, 0x61, 0xe3, + 0x18, 0x8f, 0x55, 0x51, 0xad, 0x1f, 0x0b, 0x5e, + 0x85, 0xe5, 0xc2, 0x57, 0x63, 0xca, 0x3d, 0x6c, + 0xb4, 0xc5, 0xcc, 0x70, 0xb2, 0x91, 0x59, 0x0d, + 0x47, 0x20, 0xc8, 0x4f, 0x58, 0xe0, 0x01, 0xe2, + 0x16, 0x38, 0xc4, 0x6f, 0x3b, 0x0f, 0x65, 0x46, + 0xbe, 0x7e, 0x2d, 0x7b, 0x82, 0xf9, 0x40, 0xb5, + 0x1d, 0x73, 0xf8, 0xeb, 0x26, 0xc7, 0x87, 0x97, + 0x25, 0x54, 0xb1, 0x28, 0xaa, 0x98, 0x9d, 0xa5, + 0x64, 0x6d, 0x7a, 0xd4, 0x10, 0x81, 0x44, 0xef, + 0x49, 0xd6, 0xae, 0x2e, 0xdd, 0x76, 0x5c, 0x2f, + 0xa7, 0x1c, 0xc9, 0x09, 0x69, 0x9a, 0x83, 0xcf, + 0x29, 0x39, 0xb9, 0xe9, 0x4c, 0xff, 0x43, 0xab, +}; + +#ifdef VECT_SIZE1 +#define BOX(S,i) u32x ((S)[(i)]) +#endif + +#ifdef VECT_SIZE2 +#define BOX(S,i) u32x ((S)[(i).x], (S)[(i).y]) +#endif + +#ifdef VECT_SIZE1 +#define uint_to_hex_upper8(i) l_bin2asc[(i)] +#endif + +#ifdef VECT_SIZE2 +#define uint_to_hex_upper8(i) u32x (l_bin2asc[(i).x], l_bin2asc[(i).y]) +#endif + +__device__ __constant__ char c_bin2asc[16] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' }; + +__device__ __shared__ short l_bin2asc[256]; + +__device__ static void lotus_mix (u32x *in, u32 s_lotus_magic_table[256]) +{ + u32x p = 0; + + for (int i = 0; i < 18; i++) + { + u32 s = 48; + + #pragma unroll 12 + for (int j = 0; j < 12; j++) + { + u32x tmp_in = in[j]; + u32x tmp_out = 0; + + p = (p + s--) & 0xff; p = ((tmp_in >> 0) & 0xff) ^ BOX (s_lotus_magic_table, p); tmp_out |= p << 0; + p = (p + s--) & 0xff; p = ((tmp_in >> 8) & 0xff) ^ BOX (s_lotus_magic_table, p); tmp_out |= p << 8; + p = (p + s--) & 0xff; p = ((tmp_in >> 16) & 0xff) ^ BOX (s_lotus_magic_table, p); tmp_out |= p << 16; + p = (p + s--) & 0xff; p = ((tmp_in >> 24) & 0xff) ^ BOX (s_lotus_magic_table, p); tmp_out |= p << 24; + + in[j] = tmp_out; + } + } +} + +__device__ static void lotus_transform_password (u32x *in, u32x *out, u32 s_lotus_magic_table[256]) +{ + u32x t = out[3] >> 24; + + u32x c; + + for (int i = 0; i < 4; i++) + { + t ^= (in[i] >> 0) & 0xff; c = BOX (s_lotus_magic_table, t); out[i] ^= c << 0; t = ((out[i] >> 0) & 0xff); + t ^= (in[i] >> 8) & 0xff; c = BOX (s_lotus_magic_table, t); out[i] ^= c << 8; t = ((out[i] >> 8) & 0xff); + t ^= (in[i] >> 16) & 0xff; c = BOX (s_lotus_magic_table, t); out[i] ^= c << 16; t = ((out[i] >> 16) & 0xff); + t ^= (in[i] >> 24) & 0xff; c = BOX (s_lotus_magic_table, t); out[i] ^= c << 24; t = ((out[i] >> 24) & 0xff); + } +} + +__device__ static void pad (u32 w[4], const u32 len) +{ + const u32 val = 16 - len; + + const u32 mask1 = val << 24; + + const u32 mask2 = val << 16 + | val << 24; + + const u32 mask3 = val << 8 + | val << 16 + | val << 24; + + const u32 mask4 = val << 0 + | val << 8 + | val << 16 + | val << 24; + + switch (len) + { + case 0: w[0] = mask4; + w[1] = mask4; + w[2] = mask4; + w[3] = mask4; + break; + case 1: w[0] |= mask3; + w[1] = mask4; + w[2] = mask4; + w[3] = mask4; + break; + case 2: w[0] |= mask2; + w[1] = mask4; + w[2] = mask4; + w[3] = mask4; + break; + case 3: w[0] |= mask1; + w[1] = mask4; + w[2] = mask4; + w[3] = mask4; + break; + case 4: w[1] = mask4; + w[2] = mask4; + w[3] = mask4; + break; + case 5: w[1] |= mask3; + w[2] = mask4; + w[3] = mask4; + break; + case 6: w[1] |= mask2; + w[2] = mask4; + w[3] = mask4; + break; + case 7: w[1] |= mask1; + w[2] = mask4; + w[3] = mask4; + break; + case 8: w[2] = mask4; + w[3] = mask4; + break; + case 9: w[2] |= mask3; + w[3] = mask4; + break; + case 10: w[2] |= mask2; + w[3] = mask4; + break; + case 11: w[2] |= mask1; + w[3] = mask4; + break; + case 12: w[3] = mask4; + break; + case 13: w[3] |= mask3; + break; + case 14: w[3] |= mask2; + break; + case 15: w[3] |= mask1; + break; + } +} + +__device__ static void mdtransform_norecalc (u32x state[4], u32x block[4], u32 s_lotus_magic_table[256]) +{ + u32x x[12]; + + x[ 0] = state[0]; + x[ 1] = state[1]; + x[ 2] = state[2]; + x[ 3] = state[3]; + x[ 4] = block[0]; + x[ 5] = block[1]; + x[ 6] = block[2]; + x[ 7] = block[3]; + x[ 8] = state[0] ^ block[0]; + x[ 9] = state[1] ^ block[1]; + x[10] = state[2] ^ block[2]; + x[11] = state[3] ^ block[3]; + + lotus_mix (x, s_lotus_magic_table); + + state[0] = x[0]; + state[1] = x[1]; + state[2] = x[2]; + state[3] = x[3]; +} + +__device__ static void mdtransform (u32x state[4], u32x checksum[4], u32x block[4], u32 s_lotus_magic_table[256]) +{ + mdtransform_norecalc (state, block, s_lotus_magic_table); + + lotus_transform_password (block, checksum, s_lotus_magic_table); +} + +__device__ static void domino_big_md (const u32x saved_key[16], const u32 size, u32x state[4], u32 s_lotus_magic_table[256]) +{ + u32x checksum[4]; + + checksum[0] = 0; + checksum[1] = 0; + checksum[2] = 0; + checksum[3] = 0; + + u32x block[4]; + + block[0] = 0; + block[1] = 0; + block[2] = 0; + block[3] = 0; + + u32 curpos; + u32 idx; + + for (curpos = 0, idx = 0; curpos + 16 < size; curpos += 16, idx += 4) + { + block[0] = saved_key[idx + 0]; + block[1] = saved_key[idx + 1]; + block[2] = saved_key[idx + 2]; + block[3] = saved_key[idx + 3]; + + mdtransform (state, checksum, block, s_lotus_magic_table); + } + + u32 left = size - curpos; + + block[0] = saved_key[idx + 0]; + block[1] = saved_key[idx + 1]; + block[2] = saved_key[idx + 2]; + block[3] = saved_key[idx + 3]; + + mdtransform (state, checksum, block, s_lotus_magic_table); + + mdtransform_norecalc (state, checksum, s_lotus_magic_table); +} + +__device__ __constant__ u32x c_bfs[1024]; + +__device__ static void m08700m (u32 s_lotus_magic_table[256], u32 w[16], const u32 pw_len, const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const u32x * words_buf_r, void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset) +{ + /** + * modifier + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + const u32 lid = threadIdx.x; + + /** + * padding + */ + + if (pw_len < 16) + { + pad (&w[ 0], pw_len & 0xf); + } + else if (pw_len < 32) + { + pad (&w[ 4], pw_len & 0xf); + } + else if (pw_len < 48) + { + pad (&w[ 8], pw_len & 0xf); + } + else if (pw_len < 64) + { + pad (&w[12], pw_len & 0xf); + } + + /** + * salt + */ + + const u32 salt0 = salt_bufs[salt_pos].salt_buf[0]; + const u32 salt1 = salt_bufs[salt_pos].salt_buf[1] & 0xff | '(' << 8; + + /** + * loop + */ + + const u32 bf_loops = ceil ((float) bfs_cnt / VECT_DIV); + + u32x w0l = w[0]; + + for (u32 il_pos = 0; il_pos < bf_loops; il_pos++) + { + const u32x w0r = c_bfs[il_pos]; + + const u32x w0 = w0l | w0r; + + u32x w_tmp[16]; + + w_tmp[ 0] = w0; + w_tmp[ 1] = w[ 1]; + w_tmp[ 2] = w[ 2]; + w_tmp[ 3] = w[ 3]; + w_tmp[ 4] = w[ 4]; + w_tmp[ 5] = w[ 5]; + w_tmp[ 6] = w[ 6]; + w_tmp[ 7] = w[ 7]; + w_tmp[ 8] = w[ 8]; + w_tmp[ 9] = w[ 9]; + w_tmp[10] = w[10]; + w_tmp[11] = w[11]; + w_tmp[12] = w[12]; + w_tmp[13] = w[13]; + w_tmp[14] = w[14]; + w_tmp[15] = w[15]; + + u32x state[4]; + + state[0] = 0; + state[1] = 0; + state[2] = 0; + state[3] = 0; + + domino_big_md (w_tmp, pw_len, state, s_lotus_magic_table); + + const u32x w0_t = uint_to_hex_upper8 ((state[0] >> 0) & 255) << 0 + | uint_to_hex_upper8 ((state[0] >> 8) & 255) << 16; + const u32x w1_t = uint_to_hex_upper8 ((state[0] >> 16) & 255) << 0 + | uint_to_hex_upper8 ((state[0] >> 24) & 255) << 16; + const u32x w2_t = uint_to_hex_upper8 ((state[1] >> 0) & 255) << 0 + | uint_to_hex_upper8 ((state[1] >> 8) & 255) << 16; + const u32x w3_t = uint_to_hex_upper8 ((state[1] >> 16) & 255) << 0 + | uint_to_hex_upper8 ((state[1] >> 24) & 255) << 16; + const u32x w4_t = uint_to_hex_upper8 ((state[2] >> 0) & 255) << 0 + | uint_to_hex_upper8 ((state[2] >> 8) & 255) << 16; + const u32x w5_t = uint_to_hex_upper8 ((state[2] >> 16) & 255) << 0 + | uint_to_hex_upper8 ((state[2] >> 24) & 255) << 16; + const u32x w6_t = uint_to_hex_upper8 ((state[3] >> 0) & 255) << 0 + | uint_to_hex_upper8 ((state[3] >> 8) & 255) << 16; + //const u32x w7_t = uint_to_hex_upper8 ((state[3] >> 16) & 255) << 0 + // | uint_to_hex_upper8 ((state[3] >> 24) & 255) << 16; + + const u32 pade = 0x0e0e0e0e; + + w_tmp[ 0] = salt0; + w_tmp[ 1] = salt1 | w0_t << 16; + w_tmp[ 2] = w0_t >> 16 | w1_t << 16; + w_tmp[ 3] = w1_t >> 16 | w2_t << 16; + w_tmp[ 4] = w2_t >> 16 | w3_t << 16; + w_tmp[ 5] = w3_t >> 16 | w4_t << 16; + w_tmp[ 6] = w4_t >> 16 | w5_t << 16; + w_tmp[ 7] = w5_t >> 16 | w6_t << 16; + w_tmp[ 8] = w6_t >> 16 | pade << 16; // | w7_t << 8; + w_tmp[ 9] = pade; + w_tmp[10] = pade; + w_tmp[11] = pade; + w_tmp[12] = 0; + w_tmp[13] = 0; + w_tmp[14] = 0; + w_tmp[15] = 0; + + state[0] = 0; + state[1] = 0; + state[2] = 0; + state[3] = 0; + + domino_big_md (w_tmp, 34, state, s_lotus_magic_table); + + u32x a = state[0] & 0xffffffff; + u32x b = state[1] & 0xffffffff; + u32x c = state[2] & 0x000000ff; + u32x d = state[3] & 0x00000000; + + const u32x r0 = a; + const u32x r1 = b; + const u32x r2 = c; + const u32x r3 = d; + + #include VECT_COMPARE_M + } +} + +__device__ static void m08700s (u32 s_lotus_magic_table[256], u32 w[16], const u32 pw_len, const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const u32x * words_buf_r, void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset) +{ + /** + * modifier + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + const u32 lid = threadIdx.x; + + /** + * padding + */ + + if (pw_len < 16) + { + pad (&w[ 0], pw_len & 0xf); + } + else if (pw_len < 32) + { + pad (&w[ 4], pw_len & 0xf); + } + else if (pw_len < 48) + { + pad (&w[ 8], pw_len & 0xf); + } + else if (pw_len < 64) + { + pad (&w[12], pw_len & 0xf); + } + + + /** + * salt + */ + + const u32 salt0 = salt_bufs[salt_pos].salt_buf[0]; + const u32 salt1 = salt_bufs[salt_pos].salt_buf[1] & 0xff | '(' << 8; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * loop + */ + + const u32 bf_loops = ceil ((float) bfs_cnt / VECT_DIV); + + u32x w0l = w[0]; + + for (u32 il_pos = 0; il_pos < bf_loops; il_pos++) + { + const u32x w0r = c_bfs[il_pos]; + + const u32x w0 = w0l | w0r; + + u32x w_tmp[16]; + + w_tmp[ 0] = w0; + w_tmp[ 1] = w[ 1]; + w_tmp[ 2] = w[ 2]; + w_tmp[ 3] = w[ 3]; + w_tmp[ 4] = w[ 4]; + w_tmp[ 5] = w[ 5]; + w_tmp[ 6] = w[ 6]; + w_tmp[ 7] = w[ 7]; + w_tmp[ 8] = w[ 8]; + w_tmp[ 9] = w[ 9]; + w_tmp[10] = w[10]; + w_tmp[11] = w[11]; + w_tmp[12] = w[12]; + w_tmp[13] = w[13]; + w_tmp[14] = w[14]; + w_tmp[15] = w[15]; + + u32x state[4]; + + state[0] = 0; + state[1] = 0; + state[2] = 0; + state[3] = 0; + + domino_big_md (w_tmp, pw_len, state, s_lotus_magic_table); + + const u32x w0_t = uint_to_hex_upper8 ((state[0] >> 0) & 255) << 0 + | uint_to_hex_upper8 ((state[0] >> 8) & 255) << 16; + const u32x w1_t = uint_to_hex_upper8 ((state[0] >> 16) & 255) << 0 + | uint_to_hex_upper8 ((state[0] >> 24) & 255) << 16; + const u32x w2_t = uint_to_hex_upper8 ((state[1] >> 0) & 255) << 0 + | uint_to_hex_upper8 ((state[1] >> 8) & 255) << 16; + const u32x w3_t = uint_to_hex_upper8 ((state[1] >> 16) & 255) << 0 + | uint_to_hex_upper8 ((state[1] >> 24) & 255) << 16; + const u32x w4_t = uint_to_hex_upper8 ((state[2] >> 0) & 255) << 0 + | uint_to_hex_upper8 ((state[2] >> 8) & 255) << 16; + const u32x w5_t = uint_to_hex_upper8 ((state[2] >> 16) & 255) << 0 + | uint_to_hex_upper8 ((state[2] >> 24) & 255) << 16; + const u32x w6_t = uint_to_hex_upper8 ((state[3] >> 0) & 255) << 0 + | uint_to_hex_upper8 ((state[3] >> 8) & 255) << 16; + //const u32x w7_t = uint_to_hex_upper8 ((state[3] >> 16) & 255) << 0 + // | uint_to_hex_upper8 ((state[3] >> 24) & 255) << 16; + + const u32 pade = 0x0e0e0e0e; + + w_tmp[ 0] = salt0; + w_tmp[ 1] = salt1 | w0_t << 16; + w_tmp[ 2] = w0_t >> 16 | w1_t << 16; + w_tmp[ 3] = w1_t >> 16 | w2_t << 16; + w_tmp[ 4] = w2_t >> 16 | w3_t << 16; + w_tmp[ 5] = w3_t >> 16 | w4_t << 16; + w_tmp[ 6] = w4_t >> 16 | w5_t << 16; + w_tmp[ 7] = w5_t >> 16 | w6_t << 16; + w_tmp[ 8] = w6_t >> 16 | pade << 16; // | w7_t << 8; + w_tmp[ 9] = pade; + w_tmp[10] = pade; + w_tmp[11] = pade; + w_tmp[12] = 0; + w_tmp[13] = 0; + w_tmp[14] = 0; + w_tmp[15] = 0; + + state[0] = 0; + state[1] = 0; + state[2] = 0; + state[3] = 0; + + domino_big_md (w_tmp, 34, state, s_lotus_magic_table); + + u32x a = state[0] & 0xffffffff; + u32x b = state[1] & 0xffffffff; + u32x c = state[2] & 0x000000ff; + u32x d = state[3] & 0x00000000; + + const u32x r0 = a; + const u32x r1 = b; + const u32x r2 = c; + const u32x r3 = d; + + #include VECT_COMPARE_S + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m08700_m04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const u32x * words_buf_r, void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + const u32 lid = threadIdx.x; + + u32 w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = 0; + w[ 5] = 0; + w[ 6] = 0; + w[ 7] = 0; + w[ 8] = 0; + w[ 9] = 0; + w[10] = 0; + w[11] = 0; + w[12] = 0; + w[13] = 0; + w[14] = 0; + w[15] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * bin2asc table + */ + + l_bin2asc[lid] = c_bin2asc[(lid >> 0) & 15] << 8 + | c_bin2asc[(lid >> 4) & 15] << 0; + + __syncthreads (); + + /** + * sbox + */ + + __shared__ u32 s_lotus_magic_table[256]; + + s_lotus_magic_table[lid] = lotus_magic_table[lid]; + + __syncthreads (); + + if (gid >= gid_max) return; + + /** + * main + */ + + m08700m (s_lotus_magic_table, w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m08700_m08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const u32x * words_buf_r, void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + const u32 lid = threadIdx.x; + + u32 w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = pws[gid].i[ 4]; + w[ 5] = pws[gid].i[ 5]; + w[ 6] = pws[gid].i[ 6]; + w[ 7] = pws[gid].i[ 7]; + w[ 8] = 0; + w[ 9] = 0; + w[10] = 0; + w[11] = 0; + w[12] = 0; + w[13] = 0; + w[14] = 0; + w[15] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * bin2asc table + */ + + l_bin2asc[lid] = c_bin2asc[(lid >> 0) & 15] << 8 + | c_bin2asc[(lid >> 4) & 15] << 0; + + __syncthreads (); + + /** + * sbox + */ + + __shared__ u32 s_lotus_magic_table[256]; + + s_lotus_magic_table[lid] = lotus_magic_table[lid]; + + __syncthreads (); + + if (gid >= gid_max) return; + + /** + * main + */ + + m08700m (s_lotus_magic_table, w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m08700_m16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const u32x * words_buf_r, void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + const u32 lid = threadIdx.x; + + u32 w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = pws[gid].i[ 4]; + w[ 5] = pws[gid].i[ 5]; + w[ 6] = pws[gid].i[ 6]; + w[ 7] = pws[gid].i[ 7]; + w[ 8] = pws[gid].i[ 8]; + w[ 9] = pws[gid].i[ 9]; + w[10] = pws[gid].i[10]; + w[11] = pws[gid].i[11]; + w[12] = pws[gid].i[12]; + w[13] = pws[gid].i[13]; + w[14] = pws[gid].i[14]; + w[15] = pws[gid].i[15]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * bin2asc table + */ + + l_bin2asc[lid] = c_bin2asc[(lid >> 0) & 15] << 8 + | c_bin2asc[(lid >> 4) & 15] << 0; + + __syncthreads (); + + /** + * sbox + */ + + __shared__ u32 s_lotus_magic_table[256]; + + s_lotus_magic_table[lid] = lotus_magic_table[lid]; + + __syncthreads (); + + if (gid >= gid_max) return; + + /** + * main + */ + + m08700m (s_lotus_magic_table, w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m08700_s04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const u32x * words_buf_r, void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + const u32 lid = threadIdx.x; + + u32 w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = 0; + w[ 5] = 0; + w[ 6] = 0; + w[ 7] = 0; + w[ 8] = 0; + w[ 9] = 0; + w[10] = 0; + w[11] = 0; + w[12] = 0; + w[13] = 0; + w[14] = 0; + w[15] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * bin2asc table + */ + + l_bin2asc[lid] = c_bin2asc[(lid >> 0) & 15] << 8 + | c_bin2asc[(lid >> 4) & 15] << 0; + + __syncthreads (); + + /** + * sbox + */ + + __shared__ u32 s_lotus_magic_table[256]; + + s_lotus_magic_table[lid] = lotus_magic_table[lid]; + + __syncthreads (); + + if (gid >= gid_max) return; + + /** + * main + */ + + m08700s (s_lotus_magic_table, w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m08700_s08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const u32x * words_buf_r, void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + const u32 lid = threadIdx.x; + + u32 w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = pws[gid].i[ 4]; + w[ 5] = pws[gid].i[ 5]; + w[ 6] = pws[gid].i[ 6]; + w[ 7] = pws[gid].i[ 7]; + w[ 8] = 0; + w[ 9] = 0; + w[10] = 0; + w[11] = 0; + w[12] = 0; + w[13] = 0; + w[14] = 0; + w[15] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * bin2asc table + */ + + l_bin2asc[lid] = c_bin2asc[(lid >> 0) & 15] << 8 + | c_bin2asc[(lid >> 4) & 15] << 0; + + __syncthreads (); + + /** + * sbox + */ + + __shared__ u32 s_lotus_magic_table[256]; + + s_lotus_magic_table[lid] = lotus_magic_table[lid]; + + __syncthreads (); + + if (gid >= gid_max) return; + + /** + * main + */ + + m08700s (s_lotus_magic_table, w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m08700_s16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const u32x * words_buf_r, void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + const u32 lid = threadIdx.x; + + u32 w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = pws[gid].i[ 4]; + w[ 5] = pws[gid].i[ 5]; + w[ 6] = pws[gid].i[ 6]; + w[ 7] = pws[gid].i[ 7]; + w[ 8] = pws[gid].i[ 8]; + w[ 9] = pws[gid].i[ 9]; + w[10] = pws[gid].i[10]; + w[11] = pws[gid].i[11]; + w[12] = pws[gid].i[12]; + w[13] = pws[gid].i[13]; + w[14] = pws[gid].i[14]; + w[15] = pws[gid].i[15]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * bin2asc table + */ + + l_bin2asc[lid] = c_bin2asc[(lid >> 0) & 15] << 8 + | c_bin2asc[(lid >> 4) & 15] << 0; + + __syncthreads (); + + /** + * sbox + */ + + __shared__ u32 s_lotus_magic_table[256]; + + s_lotus_magic_table[lid] = lotus_magic_table[lid]; + + __syncthreads (); + + if (gid >= gid_max) return; + + /** + * main + */ + + m08700s (s_lotus_magic_table, w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} diff --git a/nv/m08800.cu b/nv/m08800.cu new file mode 100644 index 0000000000..2c7b891523 --- /dev/null +++ b/nv/m08800.cu @@ -0,0 +1,1963 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _ANDROIDFDE_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW2 +#define VECT_SIZE1 +#endif + +#define DGST_R0 0 +#define DGST_R1 1 +#define DGST_R2 2 +#define DGST_R3 3 + +#include "include/kernel_functions.c" +#include "types_nv.c" +#include "common_nv.c" + +__device__ __constant__ u32 te0[256] = +{ + 0xc66363a5, 0xf87c7c84, 0xee777799, 0xf67b7b8d, + 0xfff2f20d, 0xd66b6bbd, 0xde6f6fb1, 0x91c5c554, + 0x60303050, 0x02010103, 0xce6767a9, 0x562b2b7d, + 0xe7fefe19, 0xb5d7d762, 0x4dababe6, 0xec76769a, + 0x8fcaca45, 0x1f82829d, 0x89c9c940, 0xfa7d7d87, + 0xeffafa15, 0xb25959eb, 0x8e4747c9, 0xfbf0f00b, + 0x41adadec, 0xb3d4d467, 0x5fa2a2fd, 0x45afafea, + 0x239c9cbf, 0x53a4a4f7, 0xe4727296, 0x9bc0c05b, + 0x75b7b7c2, 0xe1fdfd1c, 0x3d9393ae, 0x4c26266a, + 0x6c36365a, 0x7e3f3f41, 0xf5f7f702, 0x83cccc4f, + 0x6834345c, 0x51a5a5f4, 0xd1e5e534, 0xf9f1f108, + 0xe2717193, 0xabd8d873, 0x62313153, 0x2a15153f, + 0x0804040c, 0x95c7c752, 0x46232365, 0x9dc3c35e, + 0x30181828, 0x379696a1, 0x0a05050f, 0x2f9a9ab5, + 0x0e070709, 0x24121236, 0x1b80809b, 0xdfe2e23d, + 0xcdebeb26, 0x4e272769, 0x7fb2b2cd, 0xea75759f, + 0x1209091b, 0x1d83839e, 0x582c2c74, 0x341a1a2e, + 0x361b1b2d, 0xdc6e6eb2, 0xb45a5aee, 0x5ba0a0fb, + 0xa45252f6, 0x763b3b4d, 0xb7d6d661, 0x7db3b3ce, + 0x5229297b, 0xdde3e33e, 0x5e2f2f71, 0x13848497, + 0xa65353f5, 0xb9d1d168, 0x00000000, 0xc1eded2c, + 0x40202060, 0xe3fcfc1f, 0x79b1b1c8, 0xb65b5bed, + 0xd46a6abe, 0x8dcbcb46, 0x67bebed9, 0x7239394b, + 0x944a4ade, 0x984c4cd4, 0xb05858e8, 0x85cfcf4a, + 0xbbd0d06b, 0xc5efef2a, 0x4faaaae5, 0xedfbfb16, + 0x864343c5, 0x9a4d4dd7, 0x66333355, 0x11858594, + 0x8a4545cf, 0xe9f9f910, 0x04020206, 0xfe7f7f81, + 0xa05050f0, 0x783c3c44, 0x259f9fba, 0x4ba8a8e3, + 0xa25151f3, 0x5da3a3fe, 0x804040c0, 0x058f8f8a, + 0x3f9292ad, 0x219d9dbc, 0x70383848, 0xf1f5f504, + 0x63bcbcdf, 0x77b6b6c1, 0xafdada75, 0x42212163, + 0x20101030, 0xe5ffff1a, 0xfdf3f30e, 0xbfd2d26d, + 0x81cdcd4c, 0x180c0c14, 0x26131335, 0xc3ecec2f, + 0xbe5f5fe1, 0x359797a2, 0x884444cc, 0x2e171739, + 0x93c4c457, 0x55a7a7f2, 0xfc7e7e82, 0x7a3d3d47, + 0xc86464ac, 0xba5d5de7, 0x3219192b, 0xe6737395, + 0xc06060a0, 0x19818198, 0x9e4f4fd1, 0xa3dcdc7f, + 0x44222266, 0x542a2a7e, 0x3b9090ab, 0x0b888883, + 0x8c4646ca, 0xc7eeee29, 0x6bb8b8d3, 0x2814143c, + 0xa7dede79, 0xbc5e5ee2, 0x160b0b1d, 0xaddbdb76, + 0xdbe0e03b, 0x64323256, 0x743a3a4e, 0x140a0a1e, + 0x924949db, 0x0c06060a, 0x4824246c, 0xb85c5ce4, + 0x9fc2c25d, 0xbdd3d36e, 0x43acacef, 0xc46262a6, + 0x399191a8, 0x319595a4, 0xd3e4e437, 0xf279798b, + 0xd5e7e732, 0x8bc8c843, 0x6e373759, 0xda6d6db7, + 0x018d8d8c, 0xb1d5d564, 0x9c4e4ed2, 0x49a9a9e0, + 0xd86c6cb4, 0xac5656fa, 0xf3f4f407, 0xcfeaea25, + 0xca6565af, 0xf47a7a8e, 0x47aeaee9, 0x10080818, + 0x6fbabad5, 0xf0787888, 0x4a25256f, 0x5c2e2e72, + 0x381c1c24, 0x57a6a6f1, 0x73b4b4c7, 0x97c6c651, + 0xcbe8e823, 0xa1dddd7c, 0xe874749c, 0x3e1f1f21, + 0x964b4bdd, 0x61bdbddc, 0x0d8b8b86, 0x0f8a8a85, + 0xe0707090, 0x7c3e3e42, 0x71b5b5c4, 0xcc6666aa, + 0x904848d8, 0x06030305, 0xf7f6f601, 0x1c0e0e12, + 0xc26161a3, 0x6a35355f, 0xae5757f9, 0x69b9b9d0, + 0x17868691, 0x99c1c158, 0x3a1d1d27, 0x279e9eb9, + 0xd9e1e138, 0xebf8f813, 0x2b9898b3, 0x22111133, + 0xd26969bb, 0xa9d9d970, 0x078e8e89, 0x339494a7, + 0x2d9b9bb6, 0x3c1e1e22, 0x15878792, 0xc9e9e920, + 0x87cece49, 0xaa5555ff, 0x50282878, 0xa5dfdf7a, + 0x038c8c8f, 0x59a1a1f8, 0x09898980, 0x1a0d0d17, + 0x65bfbfda, 0xd7e6e631, 0x844242c6, 0xd06868b8, + 0x824141c3, 0x299999b0, 0x5a2d2d77, 0x1e0f0f11, + 0x7bb0b0cb, 0xa85454fc, 0x6dbbbbd6, 0x2c16163a, +}; + +__device__ __constant__ u32 te1[256] = +{ + 0xa5c66363, 0x84f87c7c, 0x99ee7777, 0x8df67b7b, + 0x0dfff2f2, 0xbdd66b6b, 0xb1de6f6f, 0x5491c5c5, + 0x50603030, 0x03020101, 0xa9ce6767, 0x7d562b2b, + 0x19e7fefe, 0x62b5d7d7, 0xe64dabab, 0x9aec7676, + 0x458fcaca, 0x9d1f8282, 0x4089c9c9, 0x87fa7d7d, + 0x15effafa, 0xebb25959, 0xc98e4747, 0x0bfbf0f0, + 0xec41adad, 0x67b3d4d4, 0xfd5fa2a2, 0xea45afaf, + 0xbf239c9c, 0xf753a4a4, 0x96e47272, 0x5b9bc0c0, + 0xc275b7b7, 0x1ce1fdfd, 0xae3d9393, 0x6a4c2626, + 0x5a6c3636, 0x417e3f3f, 0x02f5f7f7, 0x4f83cccc, + 0x5c683434, 0xf451a5a5, 0x34d1e5e5, 0x08f9f1f1, + 0x93e27171, 0x73abd8d8, 0x53623131, 0x3f2a1515, + 0x0c080404, 0x5295c7c7, 0x65462323, 0x5e9dc3c3, + 0x28301818, 0xa1379696, 0x0f0a0505, 0xb52f9a9a, + 0x090e0707, 0x36241212, 0x9b1b8080, 0x3ddfe2e2, + 0x26cdebeb, 0x694e2727, 0xcd7fb2b2, 0x9fea7575, + 0x1b120909, 0x9e1d8383, 0x74582c2c, 0x2e341a1a, + 0x2d361b1b, 0xb2dc6e6e, 0xeeb45a5a, 0xfb5ba0a0, + 0xf6a45252, 0x4d763b3b, 0x61b7d6d6, 0xce7db3b3, + 0x7b522929, 0x3edde3e3, 0x715e2f2f, 0x97138484, + 0xf5a65353, 0x68b9d1d1, 0x00000000, 0x2cc1eded, + 0x60402020, 0x1fe3fcfc, 0xc879b1b1, 0xedb65b5b, + 0xbed46a6a, 0x468dcbcb, 0xd967bebe, 0x4b723939, + 0xde944a4a, 0xd4984c4c, 0xe8b05858, 0x4a85cfcf, + 0x6bbbd0d0, 0x2ac5efef, 0xe54faaaa, 0x16edfbfb, + 0xc5864343, 0xd79a4d4d, 0x55663333, 0x94118585, + 0xcf8a4545, 0x10e9f9f9, 0x06040202, 0x81fe7f7f, + 0xf0a05050, 0x44783c3c, 0xba259f9f, 0xe34ba8a8, + 0xf3a25151, 0xfe5da3a3, 0xc0804040, 0x8a058f8f, + 0xad3f9292, 0xbc219d9d, 0x48703838, 0x04f1f5f5, + 0xdf63bcbc, 0xc177b6b6, 0x75afdada, 0x63422121, + 0x30201010, 0x1ae5ffff, 0x0efdf3f3, 0x6dbfd2d2, + 0x4c81cdcd, 0x14180c0c, 0x35261313, 0x2fc3ecec, + 0xe1be5f5f, 0xa2359797, 0xcc884444, 0x392e1717, + 0x5793c4c4, 0xf255a7a7, 0x82fc7e7e, 0x477a3d3d, + 0xacc86464, 0xe7ba5d5d, 0x2b321919, 0x95e67373, + 0xa0c06060, 0x98198181, 0xd19e4f4f, 0x7fa3dcdc, + 0x66442222, 0x7e542a2a, 0xab3b9090, 0x830b8888, + 0xca8c4646, 0x29c7eeee, 0xd36bb8b8, 0x3c281414, + 0x79a7dede, 0xe2bc5e5e, 0x1d160b0b, 0x76addbdb, + 0x3bdbe0e0, 0x56643232, 0x4e743a3a, 0x1e140a0a, + 0xdb924949, 0x0a0c0606, 0x6c482424, 0xe4b85c5c, + 0x5d9fc2c2, 0x6ebdd3d3, 0xef43acac, 0xa6c46262, + 0xa8399191, 0xa4319595, 0x37d3e4e4, 0x8bf27979, + 0x32d5e7e7, 0x438bc8c8, 0x596e3737, 0xb7da6d6d, + 0x8c018d8d, 0x64b1d5d5, 0xd29c4e4e, 0xe049a9a9, + 0xb4d86c6c, 0xfaac5656, 0x07f3f4f4, 0x25cfeaea, + 0xafca6565, 0x8ef47a7a, 0xe947aeae, 0x18100808, + 0xd56fbaba, 0x88f07878, 0x6f4a2525, 0x725c2e2e, + 0x24381c1c, 0xf157a6a6, 0xc773b4b4, 0x5197c6c6, + 0x23cbe8e8, 0x7ca1dddd, 0x9ce87474, 0x213e1f1f, + 0xdd964b4b, 0xdc61bdbd, 0x860d8b8b, 0x850f8a8a, + 0x90e07070, 0x427c3e3e, 0xc471b5b5, 0xaacc6666, + 0xd8904848, 0x05060303, 0x01f7f6f6, 0x121c0e0e, + 0xa3c26161, 0x5f6a3535, 0xf9ae5757, 0xd069b9b9, + 0x91178686, 0x5899c1c1, 0x273a1d1d, 0xb9279e9e, + 0x38d9e1e1, 0x13ebf8f8, 0xb32b9898, 0x33221111, + 0xbbd26969, 0x70a9d9d9, 0x89078e8e, 0xa7339494, + 0xb62d9b9b, 0x223c1e1e, 0x92158787, 0x20c9e9e9, + 0x4987cece, 0xffaa5555, 0x78502828, 0x7aa5dfdf, + 0x8f038c8c, 0xf859a1a1, 0x80098989, 0x171a0d0d, + 0xda65bfbf, 0x31d7e6e6, 0xc6844242, 0xb8d06868, + 0xc3824141, 0xb0299999, 0x775a2d2d, 0x111e0f0f, + 0xcb7bb0b0, 0xfca85454, 0xd66dbbbb, 0x3a2c1616, +}; + +__device__ __constant__ u32 te2[256] = +{ + 0x63a5c663, 0x7c84f87c, 0x7799ee77, 0x7b8df67b, + 0xf20dfff2, 0x6bbdd66b, 0x6fb1de6f, 0xc55491c5, + 0x30506030, 0x01030201, 0x67a9ce67, 0x2b7d562b, + 0xfe19e7fe, 0xd762b5d7, 0xabe64dab, 0x769aec76, + 0xca458fca, 0x829d1f82, 0xc94089c9, 0x7d87fa7d, + 0xfa15effa, 0x59ebb259, 0x47c98e47, 0xf00bfbf0, + 0xadec41ad, 0xd467b3d4, 0xa2fd5fa2, 0xafea45af, + 0x9cbf239c, 0xa4f753a4, 0x7296e472, 0xc05b9bc0, + 0xb7c275b7, 0xfd1ce1fd, 0x93ae3d93, 0x266a4c26, + 0x365a6c36, 0x3f417e3f, 0xf702f5f7, 0xcc4f83cc, + 0x345c6834, 0xa5f451a5, 0xe534d1e5, 0xf108f9f1, + 0x7193e271, 0xd873abd8, 0x31536231, 0x153f2a15, + 0x040c0804, 0xc75295c7, 0x23654623, 0xc35e9dc3, + 0x18283018, 0x96a13796, 0x050f0a05, 0x9ab52f9a, + 0x07090e07, 0x12362412, 0x809b1b80, 0xe23ddfe2, + 0xeb26cdeb, 0x27694e27, 0xb2cd7fb2, 0x759fea75, + 0x091b1209, 0x839e1d83, 0x2c74582c, 0x1a2e341a, + 0x1b2d361b, 0x6eb2dc6e, 0x5aeeb45a, 0xa0fb5ba0, + 0x52f6a452, 0x3b4d763b, 0xd661b7d6, 0xb3ce7db3, + 0x297b5229, 0xe33edde3, 0x2f715e2f, 0x84971384, + 0x53f5a653, 0xd168b9d1, 0x00000000, 0xed2cc1ed, + 0x20604020, 0xfc1fe3fc, 0xb1c879b1, 0x5bedb65b, + 0x6abed46a, 0xcb468dcb, 0xbed967be, 0x394b7239, + 0x4ade944a, 0x4cd4984c, 0x58e8b058, 0xcf4a85cf, + 0xd06bbbd0, 0xef2ac5ef, 0xaae54faa, 0xfb16edfb, + 0x43c58643, 0x4dd79a4d, 0x33556633, 0x85941185, + 0x45cf8a45, 0xf910e9f9, 0x02060402, 0x7f81fe7f, + 0x50f0a050, 0x3c44783c, 0x9fba259f, 0xa8e34ba8, + 0x51f3a251, 0xa3fe5da3, 0x40c08040, 0x8f8a058f, + 0x92ad3f92, 0x9dbc219d, 0x38487038, 0xf504f1f5, + 0xbcdf63bc, 0xb6c177b6, 0xda75afda, 0x21634221, + 0x10302010, 0xff1ae5ff, 0xf30efdf3, 0xd26dbfd2, + 0xcd4c81cd, 0x0c14180c, 0x13352613, 0xec2fc3ec, + 0x5fe1be5f, 0x97a23597, 0x44cc8844, 0x17392e17, + 0xc45793c4, 0xa7f255a7, 0x7e82fc7e, 0x3d477a3d, + 0x64acc864, 0x5de7ba5d, 0x192b3219, 0x7395e673, + 0x60a0c060, 0x81981981, 0x4fd19e4f, 0xdc7fa3dc, + 0x22664422, 0x2a7e542a, 0x90ab3b90, 0x88830b88, + 0x46ca8c46, 0xee29c7ee, 0xb8d36bb8, 0x143c2814, + 0xde79a7de, 0x5ee2bc5e, 0x0b1d160b, 0xdb76addb, + 0xe03bdbe0, 0x32566432, 0x3a4e743a, 0x0a1e140a, + 0x49db9249, 0x060a0c06, 0x246c4824, 0x5ce4b85c, + 0xc25d9fc2, 0xd36ebdd3, 0xacef43ac, 0x62a6c462, + 0x91a83991, 0x95a43195, 0xe437d3e4, 0x798bf279, + 0xe732d5e7, 0xc8438bc8, 0x37596e37, 0x6db7da6d, + 0x8d8c018d, 0xd564b1d5, 0x4ed29c4e, 0xa9e049a9, + 0x6cb4d86c, 0x56faac56, 0xf407f3f4, 0xea25cfea, + 0x65afca65, 0x7a8ef47a, 0xaee947ae, 0x08181008, + 0xbad56fba, 0x7888f078, 0x256f4a25, 0x2e725c2e, + 0x1c24381c, 0xa6f157a6, 0xb4c773b4, 0xc65197c6, + 0xe823cbe8, 0xdd7ca1dd, 0x749ce874, 0x1f213e1f, + 0x4bdd964b, 0xbddc61bd, 0x8b860d8b, 0x8a850f8a, + 0x7090e070, 0x3e427c3e, 0xb5c471b5, 0x66aacc66, + 0x48d89048, 0x03050603, 0xf601f7f6, 0x0e121c0e, + 0x61a3c261, 0x355f6a35, 0x57f9ae57, 0xb9d069b9, + 0x86911786, 0xc15899c1, 0x1d273a1d, 0x9eb9279e, + 0xe138d9e1, 0xf813ebf8, 0x98b32b98, 0x11332211, + 0x69bbd269, 0xd970a9d9, 0x8e89078e, 0x94a73394, + 0x9bb62d9b, 0x1e223c1e, 0x87921587, 0xe920c9e9, + 0xce4987ce, 0x55ffaa55, 0x28785028, 0xdf7aa5df, + 0x8c8f038c, 0xa1f859a1, 0x89800989, 0x0d171a0d, + 0xbfda65bf, 0xe631d7e6, 0x42c68442, 0x68b8d068, + 0x41c38241, 0x99b02999, 0x2d775a2d, 0x0f111e0f, + 0xb0cb7bb0, 0x54fca854, 0xbbd66dbb, 0x163a2c16, +}; + +__device__ __constant__ u32 te3[256] = +{ + 0x6363a5c6, 0x7c7c84f8, 0x777799ee, 0x7b7b8df6, + 0xf2f20dff, 0x6b6bbdd6, 0x6f6fb1de, 0xc5c55491, + 0x30305060, 0x01010302, 0x6767a9ce, 0x2b2b7d56, + 0xfefe19e7, 0xd7d762b5, 0xababe64d, 0x76769aec, + 0xcaca458f, 0x82829d1f, 0xc9c94089, 0x7d7d87fa, + 0xfafa15ef, 0x5959ebb2, 0x4747c98e, 0xf0f00bfb, + 0xadadec41, 0xd4d467b3, 0xa2a2fd5f, 0xafafea45, + 0x9c9cbf23, 0xa4a4f753, 0x727296e4, 0xc0c05b9b, + 0xb7b7c275, 0xfdfd1ce1, 0x9393ae3d, 0x26266a4c, + 0x36365a6c, 0x3f3f417e, 0xf7f702f5, 0xcccc4f83, + 0x34345c68, 0xa5a5f451, 0xe5e534d1, 0xf1f108f9, + 0x717193e2, 0xd8d873ab, 0x31315362, 0x15153f2a, + 0x04040c08, 0xc7c75295, 0x23236546, 0xc3c35e9d, + 0x18182830, 0x9696a137, 0x05050f0a, 0x9a9ab52f, + 0x0707090e, 0x12123624, 0x80809b1b, 0xe2e23ddf, + 0xebeb26cd, 0x2727694e, 0xb2b2cd7f, 0x75759fea, + 0x09091b12, 0x83839e1d, 0x2c2c7458, 0x1a1a2e34, + 0x1b1b2d36, 0x6e6eb2dc, 0x5a5aeeb4, 0xa0a0fb5b, + 0x5252f6a4, 0x3b3b4d76, 0xd6d661b7, 0xb3b3ce7d, + 0x29297b52, 0xe3e33edd, 0x2f2f715e, 0x84849713, + 0x5353f5a6, 0xd1d168b9, 0x00000000, 0xeded2cc1, + 0x20206040, 0xfcfc1fe3, 0xb1b1c879, 0x5b5bedb6, + 0x6a6abed4, 0xcbcb468d, 0xbebed967, 0x39394b72, + 0x4a4ade94, 0x4c4cd498, 0x5858e8b0, 0xcfcf4a85, + 0xd0d06bbb, 0xefef2ac5, 0xaaaae54f, 0xfbfb16ed, + 0x4343c586, 0x4d4dd79a, 0x33335566, 0x85859411, + 0x4545cf8a, 0xf9f910e9, 0x02020604, 0x7f7f81fe, + 0x5050f0a0, 0x3c3c4478, 0x9f9fba25, 0xa8a8e34b, + 0x5151f3a2, 0xa3a3fe5d, 0x4040c080, 0x8f8f8a05, + 0x9292ad3f, 0x9d9dbc21, 0x38384870, 0xf5f504f1, + 0xbcbcdf63, 0xb6b6c177, 0xdada75af, 0x21216342, + 0x10103020, 0xffff1ae5, 0xf3f30efd, 0xd2d26dbf, + 0xcdcd4c81, 0x0c0c1418, 0x13133526, 0xecec2fc3, + 0x5f5fe1be, 0x9797a235, 0x4444cc88, 0x1717392e, + 0xc4c45793, 0xa7a7f255, 0x7e7e82fc, 0x3d3d477a, + 0x6464acc8, 0x5d5de7ba, 0x19192b32, 0x737395e6, + 0x6060a0c0, 0x81819819, 0x4f4fd19e, 0xdcdc7fa3, + 0x22226644, 0x2a2a7e54, 0x9090ab3b, 0x8888830b, + 0x4646ca8c, 0xeeee29c7, 0xb8b8d36b, 0x14143c28, + 0xdede79a7, 0x5e5ee2bc, 0x0b0b1d16, 0xdbdb76ad, + 0xe0e03bdb, 0x32325664, 0x3a3a4e74, 0x0a0a1e14, + 0x4949db92, 0x06060a0c, 0x24246c48, 0x5c5ce4b8, + 0xc2c25d9f, 0xd3d36ebd, 0xacacef43, 0x6262a6c4, + 0x9191a839, 0x9595a431, 0xe4e437d3, 0x79798bf2, + 0xe7e732d5, 0xc8c8438b, 0x3737596e, 0x6d6db7da, + 0x8d8d8c01, 0xd5d564b1, 0x4e4ed29c, 0xa9a9e049, + 0x6c6cb4d8, 0x5656faac, 0xf4f407f3, 0xeaea25cf, + 0x6565afca, 0x7a7a8ef4, 0xaeaee947, 0x08081810, + 0xbabad56f, 0x787888f0, 0x25256f4a, 0x2e2e725c, + 0x1c1c2438, 0xa6a6f157, 0xb4b4c773, 0xc6c65197, + 0xe8e823cb, 0xdddd7ca1, 0x74749ce8, 0x1f1f213e, + 0x4b4bdd96, 0xbdbddc61, 0x8b8b860d, 0x8a8a850f, + 0x707090e0, 0x3e3e427c, 0xb5b5c471, 0x6666aacc, + 0x4848d890, 0x03030506, 0xf6f601f7, 0x0e0e121c, + 0x6161a3c2, 0x35355f6a, 0x5757f9ae, 0xb9b9d069, + 0x86869117, 0xc1c15899, 0x1d1d273a, 0x9e9eb927, + 0xe1e138d9, 0xf8f813eb, 0x9898b32b, 0x11113322, + 0x6969bbd2, 0xd9d970a9, 0x8e8e8907, 0x9494a733, + 0x9b9bb62d, 0x1e1e223c, 0x87879215, 0xe9e920c9, + 0xcece4987, 0x5555ffaa, 0x28287850, 0xdfdf7aa5, + 0x8c8c8f03, 0xa1a1f859, 0x89898009, 0x0d0d171a, + 0xbfbfda65, 0xe6e631d7, 0x4242c684, 0x6868b8d0, + 0x4141c382, 0x9999b029, 0x2d2d775a, 0x0f0f111e, + 0xb0b0cb7b, 0x5454fca8, 0xbbbbd66d, 0x16163a2c, +}; + +__device__ __constant__ u32 te4[256] = +{ + 0x63636363, 0x7c7c7c7c, 0x77777777, 0x7b7b7b7b, + 0xf2f2f2f2, 0x6b6b6b6b, 0x6f6f6f6f, 0xc5c5c5c5, + 0x30303030, 0x01010101, 0x67676767, 0x2b2b2b2b, + 0xfefefefe, 0xd7d7d7d7, 0xabababab, 0x76767676, + 0xcacacaca, 0x82828282, 0xc9c9c9c9, 0x7d7d7d7d, + 0xfafafafa, 0x59595959, 0x47474747, 0xf0f0f0f0, + 0xadadadad, 0xd4d4d4d4, 0xa2a2a2a2, 0xafafafaf, + 0x9c9c9c9c, 0xa4a4a4a4, 0x72727272, 0xc0c0c0c0, + 0xb7b7b7b7, 0xfdfdfdfd, 0x93939393, 0x26262626, + 0x36363636, 0x3f3f3f3f, 0xf7f7f7f7, 0xcccccccc, + 0x34343434, 0xa5a5a5a5, 0xe5e5e5e5, 0xf1f1f1f1, + 0x71717171, 0xd8d8d8d8, 0x31313131, 0x15151515, + 0x04040404, 0xc7c7c7c7, 0x23232323, 0xc3c3c3c3, + 0x18181818, 0x96969696, 0x05050505, 0x9a9a9a9a, + 0x07070707, 0x12121212, 0x80808080, 0xe2e2e2e2, + 0xebebebeb, 0x27272727, 0xb2b2b2b2, 0x75757575, + 0x09090909, 0x83838383, 0x2c2c2c2c, 0x1a1a1a1a, + 0x1b1b1b1b, 0x6e6e6e6e, 0x5a5a5a5a, 0xa0a0a0a0, + 0x52525252, 0x3b3b3b3b, 0xd6d6d6d6, 0xb3b3b3b3, + 0x29292929, 0xe3e3e3e3, 0x2f2f2f2f, 0x84848484, + 0x53535353, 0xd1d1d1d1, 0x00000000, 0xedededed, + 0x20202020, 0xfcfcfcfc, 0xb1b1b1b1, 0x5b5b5b5b, + 0x6a6a6a6a, 0xcbcbcbcb, 0xbebebebe, 0x39393939, + 0x4a4a4a4a, 0x4c4c4c4c, 0x58585858, 0xcfcfcfcf, + 0xd0d0d0d0, 0xefefefef, 0xaaaaaaaa, 0xfbfbfbfb, + 0x43434343, 0x4d4d4d4d, 0x33333333, 0x85858585, + 0x45454545, 0xf9f9f9f9, 0x02020202, 0x7f7f7f7f, + 0x50505050, 0x3c3c3c3c, 0x9f9f9f9f, 0xa8a8a8a8, + 0x51515151, 0xa3a3a3a3, 0x40404040, 0x8f8f8f8f, + 0x92929292, 0x9d9d9d9d, 0x38383838, 0xf5f5f5f5, + 0xbcbcbcbc, 0xb6b6b6b6, 0xdadadada, 0x21212121, + 0x10101010, 0xffffffff, 0xf3f3f3f3, 0xd2d2d2d2, + 0xcdcdcdcd, 0x0c0c0c0c, 0x13131313, 0xecececec, + 0x5f5f5f5f, 0x97979797, 0x44444444, 0x17171717, + 0xc4c4c4c4, 0xa7a7a7a7, 0x7e7e7e7e, 0x3d3d3d3d, + 0x64646464, 0x5d5d5d5d, 0x19191919, 0x73737373, + 0x60606060, 0x81818181, 0x4f4f4f4f, 0xdcdcdcdc, + 0x22222222, 0x2a2a2a2a, 0x90909090, 0x88888888, + 0x46464646, 0xeeeeeeee, 0xb8b8b8b8, 0x14141414, + 0xdededede, 0x5e5e5e5e, 0x0b0b0b0b, 0xdbdbdbdb, + 0xe0e0e0e0, 0x32323232, 0x3a3a3a3a, 0x0a0a0a0a, + 0x49494949, 0x06060606, 0x24242424, 0x5c5c5c5c, + 0xc2c2c2c2, 0xd3d3d3d3, 0xacacacac, 0x62626262, + 0x91919191, 0x95959595, 0xe4e4e4e4, 0x79797979, + 0xe7e7e7e7, 0xc8c8c8c8, 0x37373737, 0x6d6d6d6d, + 0x8d8d8d8d, 0xd5d5d5d5, 0x4e4e4e4e, 0xa9a9a9a9, + 0x6c6c6c6c, 0x56565656, 0xf4f4f4f4, 0xeaeaeaea, + 0x65656565, 0x7a7a7a7a, 0xaeaeaeae, 0x08080808, + 0xbabababa, 0x78787878, 0x25252525, 0x2e2e2e2e, + 0x1c1c1c1c, 0xa6a6a6a6, 0xb4b4b4b4, 0xc6c6c6c6, + 0xe8e8e8e8, 0xdddddddd, 0x74747474, 0x1f1f1f1f, + 0x4b4b4b4b, 0xbdbdbdbd, 0x8b8b8b8b, 0x8a8a8a8a, + 0x70707070, 0x3e3e3e3e, 0xb5b5b5b5, 0x66666666, + 0x48484848, 0x03030303, 0xf6f6f6f6, 0x0e0e0e0e, + 0x61616161, 0x35353535, 0x57575757, 0xb9b9b9b9, + 0x86868686, 0xc1c1c1c1, 0x1d1d1d1d, 0x9e9e9e9e, + 0xe1e1e1e1, 0xf8f8f8f8, 0x98989898, 0x11111111, + 0x69696969, 0xd9d9d9d9, 0x8e8e8e8e, 0x94949494, + 0x9b9b9b9b, 0x1e1e1e1e, 0x87878787, 0xe9e9e9e9, + 0xcececece, 0x55555555, 0x28282828, 0xdfdfdfdf, + 0x8c8c8c8c, 0xa1a1a1a1, 0x89898989, 0x0d0d0d0d, + 0xbfbfbfbf, 0xe6e6e6e6, 0x42424242, 0x68686868, + 0x41414141, 0x99999999, 0x2d2d2d2d, 0x0f0f0f0f, + 0xb0b0b0b0, 0x54545454, 0xbbbbbbbb, 0x16161616, +}; + +__device__ __constant__ u32 td0[256] = +{ + 0x51f4a750, 0x7e416553, 0x1a17a4c3, 0x3a275e96, + 0x3bab6bcb, 0x1f9d45f1, 0xacfa58ab, 0x4be30393, + 0x2030fa55, 0xad766df6, 0x88cc7691, 0xf5024c25, + 0x4fe5d7fc, 0xc52acbd7, 0x26354480, 0xb562a38f, + 0xdeb15a49, 0x25ba1b67, 0x45ea0e98, 0x5dfec0e1, + 0xc32f7502, 0x814cf012, 0x8d4697a3, 0x6bd3f9c6, + 0x038f5fe7, 0x15929c95, 0xbf6d7aeb, 0x955259da, + 0xd4be832d, 0x587421d3, 0x49e06929, 0x8ec9c844, + 0x75c2896a, 0xf48e7978, 0x99583e6b, 0x27b971dd, + 0xbee14fb6, 0xf088ad17, 0xc920ac66, 0x7dce3ab4, + 0x63df4a18, 0xe51a3182, 0x97513360, 0x62537f45, + 0xb16477e0, 0xbb6bae84, 0xfe81a01c, 0xf9082b94, + 0x70486858, 0x8f45fd19, 0x94de6c87, 0x527bf8b7, + 0xab73d323, 0x724b02e2, 0xe31f8f57, 0x6655ab2a, + 0xb2eb2807, 0x2fb5c203, 0x86c57b9a, 0xd33708a5, + 0x302887f2, 0x23bfa5b2, 0x02036aba, 0xed16825c, + 0x8acf1c2b, 0xa779b492, 0xf307f2f0, 0x4e69e2a1, + 0x65daf4cd, 0x0605bed5, 0xd134621f, 0xc4a6fe8a, + 0x342e539d, 0xa2f355a0, 0x058ae132, 0xa4f6eb75, + 0x0b83ec39, 0x4060efaa, 0x5e719f06, 0xbd6e1051, + 0x3e218af9, 0x96dd063d, 0xdd3e05ae, 0x4de6bd46, + 0x91548db5, 0x71c45d05, 0x0406d46f, 0x605015ff, + 0x1998fb24, 0xd6bde997, 0x894043cc, 0x67d99e77, + 0xb0e842bd, 0x07898b88, 0xe7195b38, 0x79c8eedb, + 0xa17c0a47, 0x7c420fe9, 0xf8841ec9, 0x00000000, + 0x09808683, 0x322bed48, 0x1e1170ac, 0x6c5a724e, + 0xfd0efffb, 0x0f853856, 0x3daed51e, 0x362d3927, + 0x0a0fd964, 0x685ca621, 0x9b5b54d1, 0x24362e3a, + 0x0c0a67b1, 0x9357e70f, 0xb4ee96d2, 0x1b9b919e, + 0x80c0c54f, 0x61dc20a2, 0x5a774b69, 0x1c121a16, + 0xe293ba0a, 0xc0a02ae5, 0x3c22e043, 0x121b171d, + 0x0e090d0b, 0xf28bc7ad, 0x2db6a8b9, 0x141ea9c8, + 0x57f11985, 0xaf75074c, 0xee99ddbb, 0xa37f60fd, + 0xf701269f, 0x5c72f5bc, 0x44663bc5, 0x5bfb7e34, + 0x8b432976, 0xcb23c6dc, 0xb6edfc68, 0xb8e4f163, + 0xd731dcca, 0x42638510, 0x13972240, 0x84c61120, + 0x854a247d, 0xd2bb3df8, 0xaef93211, 0xc729a16d, + 0x1d9e2f4b, 0xdcb230f3, 0x0d8652ec, 0x77c1e3d0, + 0x2bb3166c, 0xa970b999, 0x119448fa, 0x47e96422, + 0xa8fc8cc4, 0xa0f03f1a, 0x567d2cd8, 0x223390ef, + 0x87494ec7, 0xd938d1c1, 0x8ccaa2fe, 0x98d40b36, + 0xa6f581cf, 0xa57ade28, 0xdab78e26, 0x3fadbfa4, + 0x2c3a9de4, 0x5078920d, 0x6a5fcc9b, 0x547e4662, + 0xf68d13c2, 0x90d8b8e8, 0x2e39f75e, 0x82c3aff5, + 0x9f5d80be, 0x69d0937c, 0x6fd52da9, 0xcf2512b3, + 0xc8ac993b, 0x10187da7, 0xe89c636e, 0xdb3bbb7b, + 0xcd267809, 0x6e5918f4, 0xec9ab701, 0x834f9aa8, + 0xe6956e65, 0xaaffe67e, 0x21bccf08, 0xef15e8e6, + 0xbae79bd9, 0x4a6f36ce, 0xea9f09d4, 0x29b07cd6, + 0x31a4b2af, 0x2a3f2331, 0xc6a59430, 0x35a266c0, + 0x744ebc37, 0xfc82caa6, 0xe090d0b0, 0x33a7d815, + 0xf104984a, 0x41ecdaf7, 0x7fcd500e, 0x1791f62f, + 0x764dd68d, 0x43efb04d, 0xccaa4d54, 0xe49604df, + 0x9ed1b5e3, 0x4c6a881b, 0xc12c1fb8, 0x4665517f, + 0x9d5eea04, 0x018c355d, 0xfa877473, 0xfb0b412e, + 0xb3671d5a, 0x92dbd252, 0xe9105633, 0x6dd64713, + 0x9ad7618c, 0x37a10c7a, 0x59f8148e, 0xeb133c89, + 0xcea927ee, 0xb761c935, 0xe11ce5ed, 0x7a47b13c, + 0x9cd2df59, 0x55f2733f, 0x1814ce79, 0x73c737bf, + 0x53f7cdea, 0x5ffdaa5b, 0xdf3d6f14, 0x7844db86, + 0xcaaff381, 0xb968c43e, 0x3824342c, 0xc2a3405f, + 0x161dc372, 0xbce2250c, 0x283c498b, 0xff0d9541, + 0x39a80171, 0x080cb3de, 0xd8b4e49c, 0x6456c190, + 0x7bcb8461, 0xd532b670, 0x486c5c74, 0xd0b85742, +}; + +__device__ __constant__ u32 td1[256] = +{ + 0x5051f4a7, 0x537e4165, 0xc31a17a4, 0x963a275e, + 0xcb3bab6b, 0xf11f9d45, 0xabacfa58, 0x934be303, + 0x552030fa, 0xf6ad766d, 0x9188cc76, 0x25f5024c, + 0xfc4fe5d7, 0xd7c52acb, 0x80263544, 0x8fb562a3, + 0x49deb15a, 0x6725ba1b, 0x9845ea0e, 0xe15dfec0, + 0x02c32f75, 0x12814cf0, 0xa38d4697, 0xc66bd3f9, + 0xe7038f5f, 0x9515929c, 0xebbf6d7a, 0xda955259, + 0x2dd4be83, 0xd3587421, 0x2949e069, 0x448ec9c8, + 0x6a75c289, 0x78f48e79, 0x6b99583e, 0xdd27b971, + 0xb6bee14f, 0x17f088ad, 0x66c920ac, 0xb47dce3a, + 0x1863df4a, 0x82e51a31, 0x60975133, 0x4562537f, + 0xe0b16477, 0x84bb6bae, 0x1cfe81a0, 0x94f9082b, + 0x58704868, 0x198f45fd, 0x8794de6c, 0xb7527bf8, + 0x23ab73d3, 0xe2724b02, 0x57e31f8f, 0x2a6655ab, + 0x07b2eb28, 0x032fb5c2, 0x9a86c57b, 0xa5d33708, + 0xf2302887, 0xb223bfa5, 0xba02036a, 0x5ced1682, + 0x2b8acf1c, 0x92a779b4, 0xf0f307f2, 0xa14e69e2, + 0xcd65daf4, 0xd50605be, 0x1fd13462, 0x8ac4a6fe, + 0x9d342e53, 0xa0a2f355, 0x32058ae1, 0x75a4f6eb, + 0x390b83ec, 0xaa4060ef, 0x065e719f, 0x51bd6e10, + 0xf93e218a, 0x3d96dd06, 0xaedd3e05, 0x464de6bd, + 0xb591548d, 0x0571c45d, 0x6f0406d4, 0xff605015, + 0x241998fb, 0x97d6bde9, 0xcc894043, 0x7767d99e, + 0xbdb0e842, 0x8807898b, 0x38e7195b, 0xdb79c8ee, + 0x47a17c0a, 0xe97c420f, 0xc9f8841e, 0x00000000, + 0x83098086, 0x48322bed, 0xac1e1170, 0x4e6c5a72, + 0xfbfd0eff, 0x560f8538, 0x1e3daed5, 0x27362d39, + 0x640a0fd9, 0x21685ca6, 0xd19b5b54, 0x3a24362e, + 0xb10c0a67, 0x0f9357e7, 0xd2b4ee96, 0x9e1b9b91, + 0x4f80c0c5, 0xa261dc20, 0x695a774b, 0x161c121a, + 0x0ae293ba, 0xe5c0a02a, 0x433c22e0, 0x1d121b17, + 0x0b0e090d, 0xadf28bc7, 0xb92db6a8, 0xc8141ea9, + 0x8557f119, 0x4caf7507, 0xbbee99dd, 0xfda37f60, + 0x9ff70126, 0xbc5c72f5, 0xc544663b, 0x345bfb7e, + 0x768b4329, 0xdccb23c6, 0x68b6edfc, 0x63b8e4f1, + 0xcad731dc, 0x10426385, 0x40139722, 0x2084c611, + 0x7d854a24, 0xf8d2bb3d, 0x11aef932, 0x6dc729a1, + 0x4b1d9e2f, 0xf3dcb230, 0xec0d8652, 0xd077c1e3, + 0x6c2bb316, 0x99a970b9, 0xfa119448, 0x2247e964, + 0xc4a8fc8c, 0x1aa0f03f, 0xd8567d2c, 0xef223390, + 0xc787494e, 0xc1d938d1, 0xfe8ccaa2, 0x3698d40b, + 0xcfa6f581, 0x28a57ade, 0x26dab78e, 0xa43fadbf, + 0xe42c3a9d, 0x0d507892, 0x9b6a5fcc, 0x62547e46, + 0xc2f68d13, 0xe890d8b8, 0x5e2e39f7, 0xf582c3af, + 0xbe9f5d80, 0x7c69d093, 0xa96fd52d, 0xb3cf2512, + 0x3bc8ac99, 0xa710187d, 0x6ee89c63, 0x7bdb3bbb, + 0x09cd2678, 0xf46e5918, 0x01ec9ab7, 0xa8834f9a, + 0x65e6956e, 0x7eaaffe6, 0x0821bccf, 0xe6ef15e8, + 0xd9bae79b, 0xce4a6f36, 0xd4ea9f09, 0xd629b07c, + 0xaf31a4b2, 0x312a3f23, 0x30c6a594, 0xc035a266, + 0x37744ebc, 0xa6fc82ca, 0xb0e090d0, 0x1533a7d8, + 0x4af10498, 0xf741ecda, 0x0e7fcd50, 0x2f1791f6, + 0x8d764dd6, 0x4d43efb0, 0x54ccaa4d, 0xdfe49604, + 0xe39ed1b5, 0x1b4c6a88, 0xb8c12c1f, 0x7f466551, + 0x049d5eea, 0x5d018c35, 0x73fa8774, 0x2efb0b41, + 0x5ab3671d, 0x5292dbd2, 0x33e91056, 0x136dd647, + 0x8c9ad761, 0x7a37a10c, 0x8e59f814, 0x89eb133c, + 0xeecea927, 0x35b761c9, 0xede11ce5, 0x3c7a47b1, + 0x599cd2df, 0x3f55f273, 0x791814ce, 0xbf73c737, + 0xea53f7cd, 0x5b5ffdaa, 0x14df3d6f, 0x867844db, + 0x81caaff3, 0x3eb968c4, 0x2c382434, 0x5fc2a340, + 0x72161dc3, 0x0cbce225, 0x8b283c49, 0x41ff0d95, + 0x7139a801, 0xde080cb3, 0x9cd8b4e4, 0x906456c1, + 0x617bcb84, 0x70d532b6, 0x74486c5c, 0x42d0b857, +}; + +__device__ __constant__ u32 td2[256] = +{ + 0xa75051f4, 0x65537e41, 0xa4c31a17, 0x5e963a27, + 0x6bcb3bab, 0x45f11f9d, 0x58abacfa, 0x03934be3, + 0xfa552030, 0x6df6ad76, 0x769188cc, 0x4c25f502, + 0xd7fc4fe5, 0xcbd7c52a, 0x44802635, 0xa38fb562, + 0x5a49deb1, 0x1b6725ba, 0x0e9845ea, 0xc0e15dfe, + 0x7502c32f, 0xf012814c, 0x97a38d46, 0xf9c66bd3, + 0x5fe7038f, 0x9c951592, 0x7aebbf6d, 0x59da9552, + 0x832dd4be, 0x21d35874, 0x692949e0, 0xc8448ec9, + 0x896a75c2, 0x7978f48e, 0x3e6b9958, 0x71dd27b9, + 0x4fb6bee1, 0xad17f088, 0xac66c920, 0x3ab47dce, + 0x4a1863df, 0x3182e51a, 0x33609751, 0x7f456253, + 0x77e0b164, 0xae84bb6b, 0xa01cfe81, 0x2b94f908, + 0x68587048, 0xfd198f45, 0x6c8794de, 0xf8b7527b, + 0xd323ab73, 0x02e2724b, 0x8f57e31f, 0xab2a6655, + 0x2807b2eb, 0xc2032fb5, 0x7b9a86c5, 0x08a5d337, + 0x87f23028, 0xa5b223bf, 0x6aba0203, 0x825ced16, + 0x1c2b8acf, 0xb492a779, 0xf2f0f307, 0xe2a14e69, + 0xf4cd65da, 0xbed50605, 0x621fd134, 0xfe8ac4a6, + 0x539d342e, 0x55a0a2f3, 0xe132058a, 0xeb75a4f6, + 0xec390b83, 0xefaa4060, 0x9f065e71, 0x1051bd6e, + 0x8af93e21, 0x063d96dd, 0x05aedd3e, 0xbd464de6, + 0x8db59154, 0x5d0571c4, 0xd46f0406, 0x15ff6050, + 0xfb241998, 0xe997d6bd, 0x43cc8940, 0x9e7767d9, + 0x42bdb0e8, 0x8b880789, 0x5b38e719, 0xeedb79c8, + 0x0a47a17c, 0x0fe97c42, 0x1ec9f884, 0x00000000, + 0x86830980, 0xed48322b, 0x70ac1e11, 0x724e6c5a, + 0xfffbfd0e, 0x38560f85, 0xd51e3dae, 0x3927362d, + 0xd9640a0f, 0xa621685c, 0x54d19b5b, 0x2e3a2436, + 0x67b10c0a, 0xe70f9357, 0x96d2b4ee, 0x919e1b9b, + 0xc54f80c0, 0x20a261dc, 0x4b695a77, 0x1a161c12, + 0xba0ae293, 0x2ae5c0a0, 0xe0433c22, 0x171d121b, + 0x0d0b0e09, 0xc7adf28b, 0xa8b92db6, 0xa9c8141e, + 0x198557f1, 0x074caf75, 0xddbbee99, 0x60fda37f, + 0x269ff701, 0xf5bc5c72, 0x3bc54466, 0x7e345bfb, + 0x29768b43, 0xc6dccb23, 0xfc68b6ed, 0xf163b8e4, + 0xdccad731, 0x85104263, 0x22401397, 0x112084c6, + 0x247d854a, 0x3df8d2bb, 0x3211aef9, 0xa16dc729, + 0x2f4b1d9e, 0x30f3dcb2, 0x52ec0d86, 0xe3d077c1, + 0x166c2bb3, 0xb999a970, 0x48fa1194, 0x642247e9, + 0x8cc4a8fc, 0x3f1aa0f0, 0x2cd8567d, 0x90ef2233, + 0x4ec78749, 0xd1c1d938, 0xa2fe8cca, 0x0b3698d4, + 0x81cfa6f5, 0xde28a57a, 0x8e26dab7, 0xbfa43fad, + 0x9de42c3a, 0x920d5078, 0xcc9b6a5f, 0x4662547e, + 0x13c2f68d, 0xb8e890d8, 0xf75e2e39, 0xaff582c3, + 0x80be9f5d, 0x937c69d0, 0x2da96fd5, 0x12b3cf25, + 0x993bc8ac, 0x7da71018, 0x636ee89c, 0xbb7bdb3b, + 0x7809cd26, 0x18f46e59, 0xb701ec9a, 0x9aa8834f, + 0x6e65e695, 0xe67eaaff, 0xcf0821bc, 0xe8e6ef15, + 0x9bd9bae7, 0x36ce4a6f, 0x09d4ea9f, 0x7cd629b0, + 0xb2af31a4, 0x23312a3f, 0x9430c6a5, 0x66c035a2, + 0xbc37744e, 0xcaa6fc82, 0xd0b0e090, 0xd81533a7, + 0x984af104, 0xdaf741ec, 0x500e7fcd, 0xf62f1791, + 0xd68d764d, 0xb04d43ef, 0x4d54ccaa, 0x04dfe496, + 0xb5e39ed1, 0x881b4c6a, 0x1fb8c12c, 0x517f4665, + 0xea049d5e, 0x355d018c, 0x7473fa87, 0x412efb0b, + 0x1d5ab367, 0xd25292db, 0x5633e910, 0x47136dd6, + 0x618c9ad7, 0x0c7a37a1, 0x148e59f8, 0x3c89eb13, + 0x27eecea9, 0xc935b761, 0xe5ede11c, 0xb13c7a47, + 0xdf599cd2, 0x733f55f2, 0xce791814, 0x37bf73c7, + 0xcdea53f7, 0xaa5b5ffd, 0x6f14df3d, 0xdb867844, + 0xf381caaf, 0xc43eb968, 0x342c3824, 0x405fc2a3, + 0xc372161d, 0x250cbce2, 0x498b283c, 0x9541ff0d, + 0x017139a8, 0xb3de080c, 0xe49cd8b4, 0xc1906456, + 0x84617bcb, 0xb670d532, 0x5c74486c, 0x5742d0b8, +}; + +__device__ __constant__ u32 td3[256] = +{ + 0xf4a75051, 0x4165537e, 0x17a4c31a, 0x275e963a, + 0xab6bcb3b, 0x9d45f11f, 0xfa58abac, 0xe303934b, + 0x30fa5520, 0x766df6ad, 0xcc769188, 0x024c25f5, + 0xe5d7fc4f, 0x2acbd7c5, 0x35448026, 0x62a38fb5, + 0xb15a49de, 0xba1b6725, 0xea0e9845, 0xfec0e15d, + 0x2f7502c3, 0x4cf01281, 0x4697a38d, 0xd3f9c66b, + 0x8f5fe703, 0x929c9515, 0x6d7aebbf, 0x5259da95, + 0xbe832dd4, 0x7421d358, 0xe0692949, 0xc9c8448e, + 0xc2896a75, 0x8e7978f4, 0x583e6b99, 0xb971dd27, + 0xe14fb6be, 0x88ad17f0, 0x20ac66c9, 0xce3ab47d, + 0xdf4a1863, 0x1a3182e5, 0x51336097, 0x537f4562, + 0x6477e0b1, 0x6bae84bb, 0x81a01cfe, 0x082b94f9, + 0x48685870, 0x45fd198f, 0xde6c8794, 0x7bf8b752, + 0x73d323ab, 0x4b02e272, 0x1f8f57e3, 0x55ab2a66, + 0xeb2807b2, 0xb5c2032f, 0xc57b9a86, 0x3708a5d3, + 0x2887f230, 0xbfa5b223, 0x036aba02, 0x16825ced, + 0xcf1c2b8a, 0x79b492a7, 0x07f2f0f3, 0x69e2a14e, + 0xdaf4cd65, 0x05bed506, 0x34621fd1, 0xa6fe8ac4, + 0x2e539d34, 0xf355a0a2, 0x8ae13205, 0xf6eb75a4, + 0x83ec390b, 0x60efaa40, 0x719f065e, 0x6e1051bd, + 0x218af93e, 0xdd063d96, 0x3e05aedd, 0xe6bd464d, + 0x548db591, 0xc45d0571, 0x06d46f04, 0x5015ff60, + 0x98fb2419, 0xbde997d6, 0x4043cc89, 0xd99e7767, + 0xe842bdb0, 0x898b8807, 0x195b38e7, 0xc8eedb79, + 0x7c0a47a1, 0x420fe97c, 0x841ec9f8, 0x00000000, + 0x80868309, 0x2bed4832, 0x1170ac1e, 0x5a724e6c, + 0x0efffbfd, 0x8538560f, 0xaed51e3d, 0x2d392736, + 0x0fd9640a, 0x5ca62168, 0x5b54d19b, 0x362e3a24, + 0x0a67b10c, 0x57e70f93, 0xee96d2b4, 0x9b919e1b, + 0xc0c54f80, 0xdc20a261, 0x774b695a, 0x121a161c, + 0x93ba0ae2, 0xa02ae5c0, 0x22e0433c, 0x1b171d12, + 0x090d0b0e, 0x8bc7adf2, 0xb6a8b92d, 0x1ea9c814, + 0xf1198557, 0x75074caf, 0x99ddbbee, 0x7f60fda3, + 0x01269ff7, 0x72f5bc5c, 0x663bc544, 0xfb7e345b, + 0x4329768b, 0x23c6dccb, 0xedfc68b6, 0xe4f163b8, + 0x31dccad7, 0x63851042, 0x97224013, 0xc6112084, + 0x4a247d85, 0xbb3df8d2, 0xf93211ae, 0x29a16dc7, + 0x9e2f4b1d, 0xb230f3dc, 0x8652ec0d, 0xc1e3d077, + 0xb3166c2b, 0x70b999a9, 0x9448fa11, 0xe9642247, + 0xfc8cc4a8, 0xf03f1aa0, 0x7d2cd856, 0x3390ef22, + 0x494ec787, 0x38d1c1d9, 0xcaa2fe8c, 0xd40b3698, + 0xf581cfa6, 0x7ade28a5, 0xb78e26da, 0xadbfa43f, + 0x3a9de42c, 0x78920d50, 0x5fcc9b6a, 0x7e466254, + 0x8d13c2f6, 0xd8b8e890, 0x39f75e2e, 0xc3aff582, + 0x5d80be9f, 0xd0937c69, 0xd52da96f, 0x2512b3cf, + 0xac993bc8, 0x187da710, 0x9c636ee8, 0x3bbb7bdb, + 0x267809cd, 0x5918f46e, 0x9ab701ec, 0x4f9aa883, + 0x956e65e6, 0xffe67eaa, 0xbccf0821, 0x15e8e6ef, + 0xe79bd9ba, 0x6f36ce4a, 0x9f09d4ea, 0xb07cd629, + 0xa4b2af31, 0x3f23312a, 0xa59430c6, 0xa266c035, + 0x4ebc3774, 0x82caa6fc, 0x90d0b0e0, 0xa7d81533, + 0x04984af1, 0xecdaf741, 0xcd500e7f, 0x91f62f17, + 0x4dd68d76, 0xefb04d43, 0xaa4d54cc, 0x9604dfe4, + 0xd1b5e39e, 0x6a881b4c, 0x2c1fb8c1, 0x65517f46, + 0x5eea049d, 0x8c355d01, 0x877473fa, 0x0b412efb, + 0x671d5ab3, 0xdbd25292, 0x105633e9, 0xd647136d, + 0xd7618c9a, 0xa10c7a37, 0xf8148e59, 0x133c89eb, + 0xa927eece, 0x61c935b7, 0x1ce5ede1, 0x47b13c7a, + 0xd2df599c, 0xf2733f55, 0x14ce7918, 0xc737bf73, + 0xf7cdea53, 0xfdaa5b5f, 0x3d6f14df, 0x44db8678, + 0xaff381ca, 0x68c43eb9, 0x24342c38, 0xa3405fc2, + 0x1dc37216, 0xe2250cbc, 0x3c498b28, 0x0d9541ff, + 0xa8017139, 0x0cb3de08, 0xb4e49cd8, 0x56c19064, + 0xcb84617b, 0x32b670d5, 0x6c5c7448, 0xb85742d0, +}; + +__device__ __constant__ u32 td4[256] = +{ + 0x52525252, 0x09090909, 0x6a6a6a6a, 0xd5d5d5d5, + 0x30303030, 0x36363636, 0xa5a5a5a5, 0x38383838, + 0xbfbfbfbf, 0x40404040, 0xa3a3a3a3, 0x9e9e9e9e, + 0x81818181, 0xf3f3f3f3, 0xd7d7d7d7, 0xfbfbfbfb, + 0x7c7c7c7c, 0xe3e3e3e3, 0x39393939, 0x82828282, + 0x9b9b9b9b, 0x2f2f2f2f, 0xffffffff, 0x87878787, + 0x34343434, 0x8e8e8e8e, 0x43434343, 0x44444444, + 0xc4c4c4c4, 0xdededede, 0xe9e9e9e9, 0xcbcbcbcb, + 0x54545454, 0x7b7b7b7b, 0x94949494, 0x32323232, + 0xa6a6a6a6, 0xc2c2c2c2, 0x23232323, 0x3d3d3d3d, + 0xeeeeeeee, 0x4c4c4c4c, 0x95959595, 0x0b0b0b0b, + 0x42424242, 0xfafafafa, 0xc3c3c3c3, 0x4e4e4e4e, + 0x08080808, 0x2e2e2e2e, 0xa1a1a1a1, 0x66666666, + 0x28282828, 0xd9d9d9d9, 0x24242424, 0xb2b2b2b2, + 0x76767676, 0x5b5b5b5b, 0xa2a2a2a2, 0x49494949, + 0x6d6d6d6d, 0x8b8b8b8b, 0xd1d1d1d1, 0x25252525, + 0x72727272, 0xf8f8f8f8, 0xf6f6f6f6, 0x64646464, + 0x86868686, 0x68686868, 0x98989898, 0x16161616, + 0xd4d4d4d4, 0xa4a4a4a4, 0x5c5c5c5c, 0xcccccccc, + 0x5d5d5d5d, 0x65656565, 0xb6b6b6b6, 0x92929292, + 0x6c6c6c6c, 0x70707070, 0x48484848, 0x50505050, + 0xfdfdfdfd, 0xedededed, 0xb9b9b9b9, 0xdadadada, + 0x5e5e5e5e, 0x15151515, 0x46464646, 0x57575757, + 0xa7a7a7a7, 0x8d8d8d8d, 0x9d9d9d9d, 0x84848484, + 0x90909090, 0xd8d8d8d8, 0xabababab, 0x00000000, + 0x8c8c8c8c, 0xbcbcbcbc, 0xd3d3d3d3, 0x0a0a0a0a, + 0xf7f7f7f7, 0xe4e4e4e4, 0x58585858, 0x05050505, + 0xb8b8b8b8, 0xb3b3b3b3, 0x45454545, 0x06060606, + 0xd0d0d0d0, 0x2c2c2c2c, 0x1e1e1e1e, 0x8f8f8f8f, + 0xcacacaca, 0x3f3f3f3f, 0x0f0f0f0f, 0x02020202, + 0xc1c1c1c1, 0xafafafaf, 0xbdbdbdbd, 0x03030303, + 0x01010101, 0x13131313, 0x8a8a8a8a, 0x6b6b6b6b, + 0x3a3a3a3a, 0x91919191, 0x11111111, 0x41414141, + 0x4f4f4f4f, 0x67676767, 0xdcdcdcdc, 0xeaeaeaea, + 0x97979797, 0xf2f2f2f2, 0xcfcfcfcf, 0xcececece, + 0xf0f0f0f0, 0xb4b4b4b4, 0xe6e6e6e6, 0x73737373, + 0x96969696, 0xacacacac, 0x74747474, 0x22222222, + 0xe7e7e7e7, 0xadadadad, 0x35353535, 0x85858585, + 0xe2e2e2e2, 0xf9f9f9f9, 0x37373737, 0xe8e8e8e8, + 0x1c1c1c1c, 0x75757575, 0xdfdfdfdf, 0x6e6e6e6e, + 0x47474747, 0xf1f1f1f1, 0x1a1a1a1a, 0x71717171, + 0x1d1d1d1d, 0x29292929, 0xc5c5c5c5, 0x89898989, + 0x6f6f6f6f, 0xb7b7b7b7, 0x62626262, 0x0e0e0e0e, + 0xaaaaaaaa, 0x18181818, 0xbebebebe, 0x1b1b1b1b, + 0xfcfcfcfc, 0x56565656, 0x3e3e3e3e, 0x4b4b4b4b, + 0xc6c6c6c6, 0xd2d2d2d2, 0x79797979, 0x20202020, + 0x9a9a9a9a, 0xdbdbdbdb, 0xc0c0c0c0, 0xfefefefe, + 0x78787878, 0xcdcdcdcd, 0x5a5a5a5a, 0xf4f4f4f4, + 0x1f1f1f1f, 0xdddddddd, 0xa8a8a8a8, 0x33333333, + 0x88888888, 0x07070707, 0xc7c7c7c7, 0x31313131, + 0xb1b1b1b1, 0x12121212, 0x10101010, 0x59595959, + 0x27272727, 0x80808080, 0xecececec, 0x5f5f5f5f, + 0x60606060, 0x51515151, 0x7f7f7f7f, 0xa9a9a9a9, + 0x19191919, 0xb5b5b5b5, 0x4a4a4a4a, 0x0d0d0d0d, + 0x2d2d2d2d, 0xe5e5e5e5, 0x7a7a7a7a, 0x9f9f9f9f, + 0x93939393, 0xc9c9c9c9, 0x9c9c9c9c, 0xefefefef, + 0xa0a0a0a0, 0xe0e0e0e0, 0x3b3b3b3b, 0x4d4d4d4d, + 0xaeaeaeae, 0x2a2a2a2a, 0xf5f5f5f5, 0xb0b0b0b0, + 0xc8c8c8c8, 0xebebebeb, 0xbbbbbbbb, 0x3c3c3c3c, + 0x83838383, 0x53535353, 0x99999999, 0x61616161, + 0x17171717, 0x2b2b2b2b, 0x04040404, 0x7e7e7e7e, + 0xbabababa, 0x77777777, 0xd6d6d6d6, 0x26262626, + 0xe1e1e1e1, 0x69696969, 0x14141414, 0x63636363, + 0x55555555, 0x21212121, 0x0c0c0c0c, 0x7d7d7d7d, +}; + +__device__ __constant__ u32 rcon[] = +{ + 0x01000000, 0x02000000, 0x04000000, 0x08000000, + 0x10000000, 0x20000000, 0x40000000, 0x80000000, + 0x1b000000, 0x36000000, +}; + +__device__ static void AES128_ExpandKey (u32 *userkey, u32 *rek, u32 s_te0[256], u32 s_te1[256], u32 s_te2[256], u32 s_te3[256], u32 s_te4[256]) +{ + rek[0] = userkey[0]; + rek[1] = userkey[1]; + rek[2] = userkey[2]; + rek[3] = userkey[3]; + + #pragma unroll 10 + for (u32 i = 0, j = 0; i < 10; i += 1, j += 4) + { + u32 temp = rek[j + 3]; + + temp = (s_te2[(temp >> 16) & 0xff] & 0xff000000) + ^ (s_te3[(temp >> 8) & 0xff] & 0x00ff0000) + ^ (s_te0[(temp >> 0) & 0xff] & 0x0000ff00) + ^ (s_te1[(temp >> 24) & 0xff] & 0x000000ff); + + rek[j + 4] = rek[j + 0] + ^ temp + ^ rcon[i]; + + rek[j + 5] = rek[j + 1] ^ rek[j + 4]; + rek[j + 6] = rek[j + 2] ^ rek[j + 5]; + rek[j + 7] = rek[j + 3] ^ rek[j + 6]; + } +} + +__device__ static void AES128_InvertKey (u32 *rdk, u32 s_td0[256], u32 s_td1[256], u32 s_td2[256], u32 s_td3[256], u32 s_td4[256], u32 s_te0[256], u32 s_te1[256], u32 s_te2[256], u32 s_te3[256], u32 s_te4[256]) +{ + for (u32 i = 0, j = 40; i < j; i += 4, j -= 4) + { + u32 temp; + + temp = rdk[i + 0]; rdk[i + 0] = rdk[j + 0]; rdk[j + 0] = temp; + temp = rdk[i + 1]; rdk[i + 1] = rdk[j + 1]; rdk[j + 1] = temp; + temp = rdk[i + 2]; rdk[i + 2] = rdk[j + 2]; rdk[j + 2] = temp; + temp = rdk[i + 3]; rdk[i + 3] = rdk[j + 3]; rdk[j + 3] = temp; + } + + for (u32 i = 1, j = 4; i < 10; i += 1, j += 4) + { + rdk[j + 0] = + s_td0[s_te1[(rdk[j + 0] >> 24) & 0xff] & 0xff] ^ + s_td1[s_te1[(rdk[j + 0] >> 16) & 0xff] & 0xff] ^ + s_td2[s_te1[(rdk[j + 0] >> 8) & 0xff] & 0xff] ^ + s_td3[s_te1[(rdk[j + 0] >> 0) & 0xff] & 0xff]; + + rdk[j + 1] = + s_td0[s_te1[(rdk[j + 1] >> 24) & 0xff] & 0xff] ^ + s_td1[s_te1[(rdk[j + 1] >> 16) & 0xff] & 0xff] ^ + s_td2[s_te1[(rdk[j + 1] >> 8) & 0xff] & 0xff] ^ + s_td3[s_te1[(rdk[j + 1] >> 0) & 0xff] & 0xff]; + + rdk[j + 2] = + s_td0[s_te1[(rdk[j + 2] >> 24) & 0xff] & 0xff] ^ + s_td1[s_te1[(rdk[j + 2] >> 16) & 0xff] & 0xff] ^ + s_td2[s_te1[(rdk[j + 2] >> 8) & 0xff] & 0xff] ^ + s_td3[s_te1[(rdk[j + 2] >> 0) & 0xff] & 0xff]; + + rdk[j + 3] = + s_td0[s_te1[(rdk[j + 3] >> 24) & 0xff] & 0xff] ^ + s_td1[s_te1[(rdk[j + 3] >> 16) & 0xff] & 0xff] ^ + s_td2[s_te1[(rdk[j + 3] >> 8) & 0xff] & 0xff] ^ + s_td3[s_te1[(rdk[j + 3] >> 0) & 0xff] & 0xff]; + } +} + +__device__ static void AES128_decrypt (const u32 *in, u32 *out, const u32 *rdk, u32 s_td0[256], u32 s_td1[256], u32 s_td2[256], u32 s_td3[256], u32 s_td4[256]) +{ + u32 s0 = in[0] ^ rdk[0]; + u32 s1 = in[1] ^ rdk[1]; + u32 s2 = in[2] ^ rdk[2]; + u32 s3 = in[3] ^ rdk[3]; + + u32 t0; + u32 t1; + u32 t2; + u32 t3; + + t0 = s_td0[s0 >> 24] ^ s_td1[(s3 >> 16) & 0xff] ^ s_td2[(s2 >> 8) & 0xff] ^ s_td3[s1 & 0xff] ^ rdk[ 4]; + t1 = s_td0[s1 >> 24] ^ s_td1[(s0 >> 16) & 0xff] ^ s_td2[(s3 >> 8) & 0xff] ^ s_td3[s2 & 0xff] ^ rdk[ 5]; + t2 = s_td0[s2 >> 24] ^ s_td1[(s1 >> 16) & 0xff] ^ s_td2[(s0 >> 8) & 0xff] ^ s_td3[s3 & 0xff] ^ rdk[ 6]; + t3 = s_td0[s3 >> 24] ^ s_td1[(s2 >> 16) & 0xff] ^ s_td2[(s1 >> 8) & 0xff] ^ s_td3[s0 & 0xff] ^ rdk[ 7]; + s0 = s_td0[t0 >> 24] ^ s_td1[(t3 >> 16) & 0xff] ^ s_td2[(t2 >> 8) & 0xff] ^ s_td3[t1 & 0xff] ^ rdk[ 8]; + s1 = s_td0[t1 >> 24] ^ s_td1[(t0 >> 16) & 0xff] ^ s_td2[(t3 >> 8) & 0xff] ^ s_td3[t2 & 0xff] ^ rdk[ 9]; + s2 = s_td0[t2 >> 24] ^ s_td1[(t1 >> 16) & 0xff] ^ s_td2[(t0 >> 8) & 0xff] ^ s_td3[t3 & 0xff] ^ rdk[10]; + s3 = s_td0[t3 >> 24] ^ s_td1[(t2 >> 16) & 0xff] ^ s_td2[(t1 >> 8) & 0xff] ^ s_td3[t0 & 0xff] ^ rdk[11]; + t0 = s_td0[s0 >> 24] ^ s_td1[(s3 >> 16) & 0xff] ^ s_td2[(s2 >> 8) & 0xff] ^ s_td3[s1 & 0xff] ^ rdk[12]; + t1 = s_td0[s1 >> 24] ^ s_td1[(s0 >> 16) & 0xff] ^ s_td2[(s3 >> 8) & 0xff] ^ s_td3[s2 & 0xff] ^ rdk[13]; + t2 = s_td0[s2 >> 24] ^ s_td1[(s1 >> 16) & 0xff] ^ s_td2[(s0 >> 8) & 0xff] ^ s_td3[s3 & 0xff] ^ rdk[14]; + t3 = s_td0[s3 >> 24] ^ s_td1[(s2 >> 16) & 0xff] ^ s_td2[(s1 >> 8) & 0xff] ^ s_td3[s0 & 0xff] ^ rdk[15]; + s0 = s_td0[t0 >> 24] ^ s_td1[(t3 >> 16) & 0xff] ^ s_td2[(t2 >> 8) & 0xff] ^ s_td3[t1 & 0xff] ^ rdk[16]; + s1 = s_td0[t1 >> 24] ^ s_td1[(t0 >> 16) & 0xff] ^ s_td2[(t3 >> 8) & 0xff] ^ s_td3[t2 & 0xff] ^ rdk[17]; + s2 = s_td0[t2 >> 24] ^ s_td1[(t1 >> 16) & 0xff] ^ s_td2[(t0 >> 8) & 0xff] ^ s_td3[t3 & 0xff] ^ rdk[18]; + s3 = s_td0[t3 >> 24] ^ s_td1[(t2 >> 16) & 0xff] ^ s_td2[(t1 >> 8) & 0xff] ^ s_td3[t0 & 0xff] ^ rdk[19]; + t0 = s_td0[s0 >> 24] ^ s_td1[(s3 >> 16) & 0xff] ^ s_td2[(s2 >> 8) & 0xff] ^ s_td3[s1 & 0xff] ^ rdk[20]; + t1 = s_td0[s1 >> 24] ^ s_td1[(s0 >> 16) & 0xff] ^ s_td2[(s3 >> 8) & 0xff] ^ s_td3[s2 & 0xff] ^ rdk[21]; + t2 = s_td0[s2 >> 24] ^ s_td1[(s1 >> 16) & 0xff] ^ s_td2[(s0 >> 8) & 0xff] ^ s_td3[s3 & 0xff] ^ rdk[22]; + t3 = s_td0[s3 >> 24] ^ s_td1[(s2 >> 16) & 0xff] ^ s_td2[(s1 >> 8) & 0xff] ^ s_td3[s0 & 0xff] ^ rdk[23]; + s0 = s_td0[t0 >> 24] ^ s_td1[(t3 >> 16) & 0xff] ^ s_td2[(t2 >> 8) & 0xff] ^ s_td3[t1 & 0xff] ^ rdk[24]; + s1 = s_td0[t1 >> 24] ^ s_td1[(t0 >> 16) & 0xff] ^ s_td2[(t3 >> 8) & 0xff] ^ s_td3[t2 & 0xff] ^ rdk[25]; + s2 = s_td0[t2 >> 24] ^ s_td1[(t1 >> 16) & 0xff] ^ s_td2[(t0 >> 8) & 0xff] ^ s_td3[t3 & 0xff] ^ rdk[26]; + s3 = s_td0[t3 >> 24] ^ s_td1[(t2 >> 16) & 0xff] ^ s_td2[(t1 >> 8) & 0xff] ^ s_td3[t0 & 0xff] ^ rdk[27]; + t0 = s_td0[s0 >> 24] ^ s_td1[(s3 >> 16) & 0xff] ^ s_td2[(s2 >> 8) & 0xff] ^ s_td3[s1 & 0xff] ^ rdk[28]; + t1 = s_td0[s1 >> 24] ^ s_td1[(s0 >> 16) & 0xff] ^ s_td2[(s3 >> 8) & 0xff] ^ s_td3[s2 & 0xff] ^ rdk[29]; + t2 = s_td0[s2 >> 24] ^ s_td1[(s1 >> 16) & 0xff] ^ s_td2[(s0 >> 8) & 0xff] ^ s_td3[s3 & 0xff] ^ rdk[30]; + t3 = s_td0[s3 >> 24] ^ s_td1[(s2 >> 16) & 0xff] ^ s_td2[(s1 >> 8) & 0xff] ^ s_td3[s0 & 0xff] ^ rdk[31]; + s0 = s_td0[t0 >> 24] ^ s_td1[(t3 >> 16) & 0xff] ^ s_td2[(t2 >> 8) & 0xff] ^ s_td3[t1 & 0xff] ^ rdk[32]; + s1 = s_td0[t1 >> 24] ^ s_td1[(t0 >> 16) & 0xff] ^ s_td2[(t3 >> 8) & 0xff] ^ s_td3[t2 & 0xff] ^ rdk[33]; + s2 = s_td0[t2 >> 24] ^ s_td1[(t1 >> 16) & 0xff] ^ s_td2[(t0 >> 8) & 0xff] ^ s_td3[t3 & 0xff] ^ rdk[34]; + s3 = s_td0[t3 >> 24] ^ s_td1[(t2 >> 16) & 0xff] ^ s_td2[(t1 >> 8) & 0xff] ^ s_td3[t0 & 0xff] ^ rdk[35]; + t0 = s_td0[s0 >> 24] ^ s_td1[(s3 >> 16) & 0xff] ^ s_td2[(s2 >> 8) & 0xff] ^ s_td3[s1 & 0xff] ^ rdk[36]; + t1 = s_td0[s1 >> 24] ^ s_td1[(s0 >> 16) & 0xff] ^ s_td2[(s3 >> 8) & 0xff] ^ s_td3[s2 & 0xff] ^ rdk[37]; + t2 = s_td0[s2 >> 24] ^ s_td1[(s1 >> 16) & 0xff] ^ s_td2[(s0 >> 8) & 0xff] ^ s_td3[s3 & 0xff] ^ rdk[38]; + t3 = s_td0[s3 >> 24] ^ s_td1[(s2 >> 16) & 0xff] ^ s_td2[(s1 >> 8) & 0xff] ^ s_td3[s0 & 0xff] ^ rdk[39]; + + out[0] = (s_td4[(t0 >> 24) & 0xff] & 0xff000000) + ^ (s_td4[(t3 >> 16) & 0xff] & 0x00ff0000) + ^ (s_td4[(t2 >> 8) & 0xff] & 0x0000ff00) + ^ (s_td4[(t1 >> 0) & 0xff] & 0x000000ff) + ^ rdk[40]; + + out[1] = (s_td4[(t1 >> 24) & 0xff] & 0xff000000) + ^ (s_td4[(t0 >> 16) & 0xff] & 0x00ff0000) + ^ (s_td4[(t3 >> 8) & 0xff] & 0x0000ff00) + ^ (s_td4[(t2 >> 0) & 0xff] & 0x000000ff) + ^ rdk[41]; + + out[2] = (s_td4[(t2 >> 24) & 0xff] & 0xff000000) + ^ (s_td4[(t1 >> 16) & 0xff] & 0x00ff0000) + ^ (s_td4[(t0 >> 8) & 0xff] & 0x0000ff00) + ^ (s_td4[(t3 >> 0) & 0xff] & 0x000000ff) + ^ rdk[42]; + + out[3] = (s_td4[(t3 >> 24) & 0xff] & 0xff000000) + ^ (s_td4[(t2 >> 16) & 0xff] & 0x00ff0000) + ^ (s_td4[(t1 >> 8) & 0xff] & 0x0000ff00) + ^ (s_td4[(t0 >> 0) & 0xff] & 0x000000ff) + ^ rdk[43]; +} + +__device__ static void AES256_ExpandKey (u32 *userkey, u32 *rek, u32 s_te0[256], u32 s_te1[256], u32 s_te2[256], u32 s_te3[256], u32 s_te4[256]) +{ + rek[0] = userkey[0]; + rek[1] = userkey[1]; + rek[2] = userkey[2]; + rek[3] = userkey[3]; + rek[4] = userkey[4]; + rek[5] = userkey[5]; + rek[6] = userkey[6]; + rek[7] = userkey[7]; + + int i; + int j; + + i = 0; + j = 0; + + u32 run = 1; + + while (run) + { + u32 temp = rek[j + 7]; + + rek[j + 8] = rek[j + 0] + ^ (s_te2[(temp >> 16) & 0xff] & 0xff000000) + ^ (s_te3[(temp >> 8) & 0xff] & 0x00ff0000) + ^ (s_te0[(temp >> 0) & 0xff] & 0x0000ff00) + ^ (s_te1[(temp >> 24) & 0xff] & 0x000000ff) + ^ rcon[i]; + + rek[j + 9] = rek[j + 1] ^ rek[j + 8]; + rek[j + 10] = rek[j + 2] ^ rek[j + 9]; + rek[j + 11] = rek[j + 3] ^ rek[j + 10]; + + if (++i == 7) + { + run = 0; + continue; + } + + temp = rek[j + 11]; + + rek[j + 12] = rek[j + 4] + ^ (s_te2[(temp >> 24) & 0xff] & 0xff000000) + ^ (s_te3[(temp >> 16) & 0xff] & 0x00ff0000) + ^ (s_te0[(temp >> 8) & 0xff] & 0x0000ff00) + ^ (s_te1[(temp >> 0) & 0xff] & 0x000000ff); + + rek[j + 13] = rek[j + 5] ^ rek[j + 12]; + rek[j + 14] = rek[j + 6] ^ rek[j + 13]; + rek[j + 15] = rek[j + 7] ^ rek[j + 14]; + + j += 8; + } +} + +__device__ static void AES256_InvertKey (u32 *rdk, u32 s_td0[256], u32 s_td1[256], u32 s_td2[256], u32 s_td3[256], u32 s_td4[256], u32 s_te0[256], u32 s_te1[256], u32 s_te2[256], u32 s_te3[256], u32 s_te4[256]) +{ + for (u32 i = 0, j = 56; i < j; i += 4, j -= 4) + { + u32 temp; + + temp = rdk[i + 0]; rdk[i + 0] = rdk[j + 0]; rdk[j + 0] = temp; + temp = rdk[i + 1]; rdk[i + 1] = rdk[j + 1]; rdk[j + 1] = temp; + temp = rdk[i + 2]; rdk[i + 2] = rdk[j + 2]; rdk[j + 2] = temp; + temp = rdk[i + 3]; rdk[i + 3] = rdk[j + 3]; rdk[j + 3] = temp; + } + + for (u32 i = 1, j = 4; i < 14; i += 1, j += 4) + { + rdk[j + 0] = + s_td0[s_te1[(rdk[j + 0] >> 24) & 0xff] & 0xff] ^ + s_td1[s_te1[(rdk[j + 0] >> 16) & 0xff] & 0xff] ^ + s_td2[s_te1[(rdk[j + 0] >> 8) & 0xff] & 0xff] ^ + s_td3[s_te1[(rdk[j + 0] >> 0) & 0xff] & 0xff]; + + rdk[j + 1] = + s_td0[s_te1[(rdk[j + 1] >> 24) & 0xff] & 0xff] ^ + s_td1[s_te1[(rdk[j + 1] >> 16) & 0xff] & 0xff] ^ + s_td2[s_te1[(rdk[j + 1] >> 8) & 0xff] & 0xff] ^ + s_td3[s_te1[(rdk[j + 1] >> 0) & 0xff] & 0xff]; + + rdk[j + 2] = + s_td0[s_te1[(rdk[j + 2] >> 24) & 0xff] & 0xff] ^ + s_td1[s_te1[(rdk[j + 2] >> 16) & 0xff] & 0xff] ^ + s_td2[s_te1[(rdk[j + 2] >> 8) & 0xff] & 0xff] ^ + s_td3[s_te1[(rdk[j + 2] >> 0) & 0xff] & 0xff]; + + rdk[j + 3] = + s_td0[s_te1[(rdk[j + 3] >> 24) & 0xff] & 0xff] ^ + s_td1[s_te1[(rdk[j + 3] >> 16) & 0xff] & 0xff] ^ + s_td2[s_te1[(rdk[j + 3] >> 8) & 0xff] & 0xff] ^ + s_td3[s_te1[(rdk[j + 3] >> 0) & 0xff] & 0xff]; + } +} + +__device__ static void AES256_decrypt (const u32 *in, u32 *out, const u32 *rdk, u32 s_td0[256], u32 s_td1[256], u32 s_td2[256], u32 s_td3[256], u32 s_td4[256]) +{ + u32 s0 = in[0] ^ rdk[0]; + u32 s1 = in[1] ^ rdk[1]; + u32 s2 = in[2] ^ rdk[2]; + u32 s3 = in[3] ^ rdk[3]; + + u32 t0; + u32 t1; + u32 t2; + u32 t3; + + t0 = s_td0[s0 >> 24] ^ s_td1[(s3 >> 16) & 0xff] ^ s_td2[(s2 >> 8) & 0xff] ^ s_td3[s1 & 0xff] ^ rdk[ 4]; + t1 = s_td0[s1 >> 24] ^ s_td1[(s0 >> 16) & 0xff] ^ s_td2[(s3 >> 8) & 0xff] ^ s_td3[s2 & 0xff] ^ rdk[ 5]; + t2 = s_td0[s2 >> 24] ^ s_td1[(s1 >> 16) & 0xff] ^ s_td2[(s0 >> 8) & 0xff] ^ s_td3[s3 & 0xff] ^ rdk[ 6]; + t3 = s_td0[s3 >> 24] ^ s_td1[(s2 >> 16) & 0xff] ^ s_td2[(s1 >> 8) & 0xff] ^ s_td3[s0 & 0xff] ^ rdk[ 7]; + s0 = s_td0[t0 >> 24] ^ s_td1[(t3 >> 16) & 0xff] ^ s_td2[(t2 >> 8) & 0xff] ^ s_td3[t1 & 0xff] ^ rdk[ 8]; + s1 = s_td0[t1 >> 24] ^ s_td1[(t0 >> 16) & 0xff] ^ s_td2[(t3 >> 8) & 0xff] ^ s_td3[t2 & 0xff] ^ rdk[ 9]; + s2 = s_td0[t2 >> 24] ^ s_td1[(t1 >> 16) & 0xff] ^ s_td2[(t0 >> 8) & 0xff] ^ s_td3[t3 & 0xff] ^ rdk[10]; + s3 = s_td0[t3 >> 24] ^ s_td1[(t2 >> 16) & 0xff] ^ s_td2[(t1 >> 8) & 0xff] ^ s_td3[t0 & 0xff] ^ rdk[11]; + t0 = s_td0[s0 >> 24] ^ s_td1[(s3 >> 16) & 0xff] ^ s_td2[(s2 >> 8) & 0xff] ^ s_td3[s1 & 0xff] ^ rdk[12]; + t1 = s_td0[s1 >> 24] ^ s_td1[(s0 >> 16) & 0xff] ^ s_td2[(s3 >> 8) & 0xff] ^ s_td3[s2 & 0xff] ^ rdk[13]; + t2 = s_td0[s2 >> 24] ^ s_td1[(s1 >> 16) & 0xff] ^ s_td2[(s0 >> 8) & 0xff] ^ s_td3[s3 & 0xff] ^ rdk[14]; + t3 = s_td0[s3 >> 24] ^ s_td1[(s2 >> 16) & 0xff] ^ s_td2[(s1 >> 8) & 0xff] ^ s_td3[s0 & 0xff] ^ rdk[15]; + s0 = s_td0[t0 >> 24] ^ s_td1[(t3 >> 16) & 0xff] ^ s_td2[(t2 >> 8) & 0xff] ^ s_td3[t1 & 0xff] ^ rdk[16]; + s1 = s_td0[t1 >> 24] ^ s_td1[(t0 >> 16) & 0xff] ^ s_td2[(t3 >> 8) & 0xff] ^ s_td3[t2 & 0xff] ^ rdk[17]; + s2 = s_td0[t2 >> 24] ^ s_td1[(t1 >> 16) & 0xff] ^ s_td2[(t0 >> 8) & 0xff] ^ s_td3[t3 & 0xff] ^ rdk[18]; + s3 = s_td0[t3 >> 24] ^ s_td1[(t2 >> 16) & 0xff] ^ s_td2[(t1 >> 8) & 0xff] ^ s_td3[t0 & 0xff] ^ rdk[19]; + t0 = s_td0[s0 >> 24] ^ s_td1[(s3 >> 16) & 0xff] ^ s_td2[(s2 >> 8) & 0xff] ^ s_td3[s1 & 0xff] ^ rdk[20]; + t1 = s_td0[s1 >> 24] ^ s_td1[(s0 >> 16) & 0xff] ^ s_td2[(s3 >> 8) & 0xff] ^ s_td3[s2 & 0xff] ^ rdk[21]; + t2 = s_td0[s2 >> 24] ^ s_td1[(s1 >> 16) & 0xff] ^ s_td2[(s0 >> 8) & 0xff] ^ s_td3[s3 & 0xff] ^ rdk[22]; + t3 = s_td0[s3 >> 24] ^ s_td1[(s2 >> 16) & 0xff] ^ s_td2[(s1 >> 8) & 0xff] ^ s_td3[s0 & 0xff] ^ rdk[23]; + s0 = s_td0[t0 >> 24] ^ s_td1[(t3 >> 16) & 0xff] ^ s_td2[(t2 >> 8) & 0xff] ^ s_td3[t1 & 0xff] ^ rdk[24]; + s1 = s_td0[t1 >> 24] ^ s_td1[(t0 >> 16) & 0xff] ^ s_td2[(t3 >> 8) & 0xff] ^ s_td3[t2 & 0xff] ^ rdk[25]; + s2 = s_td0[t2 >> 24] ^ s_td1[(t1 >> 16) & 0xff] ^ s_td2[(t0 >> 8) & 0xff] ^ s_td3[t3 & 0xff] ^ rdk[26]; + s3 = s_td0[t3 >> 24] ^ s_td1[(t2 >> 16) & 0xff] ^ s_td2[(t1 >> 8) & 0xff] ^ s_td3[t0 & 0xff] ^ rdk[27]; + t0 = s_td0[s0 >> 24] ^ s_td1[(s3 >> 16) & 0xff] ^ s_td2[(s2 >> 8) & 0xff] ^ s_td3[s1 & 0xff] ^ rdk[28]; + t1 = s_td0[s1 >> 24] ^ s_td1[(s0 >> 16) & 0xff] ^ s_td2[(s3 >> 8) & 0xff] ^ s_td3[s2 & 0xff] ^ rdk[29]; + t2 = s_td0[s2 >> 24] ^ s_td1[(s1 >> 16) & 0xff] ^ s_td2[(s0 >> 8) & 0xff] ^ s_td3[s3 & 0xff] ^ rdk[30]; + t3 = s_td0[s3 >> 24] ^ s_td1[(s2 >> 16) & 0xff] ^ s_td2[(s1 >> 8) & 0xff] ^ s_td3[s0 & 0xff] ^ rdk[31]; + s0 = s_td0[t0 >> 24] ^ s_td1[(t3 >> 16) & 0xff] ^ s_td2[(t2 >> 8) & 0xff] ^ s_td3[t1 & 0xff] ^ rdk[32]; + s1 = s_td0[t1 >> 24] ^ s_td1[(t0 >> 16) & 0xff] ^ s_td2[(t3 >> 8) & 0xff] ^ s_td3[t2 & 0xff] ^ rdk[33]; + s2 = s_td0[t2 >> 24] ^ s_td1[(t1 >> 16) & 0xff] ^ s_td2[(t0 >> 8) & 0xff] ^ s_td3[t3 & 0xff] ^ rdk[34]; + s3 = s_td0[t3 >> 24] ^ s_td1[(t2 >> 16) & 0xff] ^ s_td2[(t1 >> 8) & 0xff] ^ s_td3[t0 & 0xff] ^ rdk[35]; + t0 = s_td0[s0 >> 24] ^ s_td1[(s3 >> 16) & 0xff] ^ s_td2[(s2 >> 8) & 0xff] ^ s_td3[s1 & 0xff] ^ rdk[36]; + t1 = s_td0[s1 >> 24] ^ s_td1[(s0 >> 16) & 0xff] ^ s_td2[(s3 >> 8) & 0xff] ^ s_td3[s2 & 0xff] ^ rdk[37]; + t2 = s_td0[s2 >> 24] ^ s_td1[(s1 >> 16) & 0xff] ^ s_td2[(s0 >> 8) & 0xff] ^ s_td3[s3 & 0xff] ^ rdk[38]; + t3 = s_td0[s3 >> 24] ^ s_td1[(s2 >> 16) & 0xff] ^ s_td2[(s1 >> 8) & 0xff] ^ s_td3[s0 & 0xff] ^ rdk[39]; + s0 = s_td0[t0 >> 24] ^ s_td1[(t3 >> 16) & 0xff] ^ s_td2[(t2 >> 8) & 0xff] ^ s_td3[t1 & 0xff] ^ rdk[40]; + s1 = s_td0[t1 >> 24] ^ s_td1[(t0 >> 16) & 0xff] ^ s_td2[(t3 >> 8) & 0xff] ^ s_td3[t2 & 0xff] ^ rdk[41]; + s2 = s_td0[t2 >> 24] ^ s_td1[(t1 >> 16) & 0xff] ^ s_td2[(t0 >> 8) & 0xff] ^ s_td3[t3 & 0xff] ^ rdk[42]; + s3 = s_td0[t3 >> 24] ^ s_td1[(t2 >> 16) & 0xff] ^ s_td2[(t1 >> 8) & 0xff] ^ s_td3[t0 & 0xff] ^ rdk[43]; + t0 = s_td0[s0 >> 24] ^ s_td1[(s3 >> 16) & 0xff] ^ s_td2[(s2 >> 8) & 0xff] ^ s_td3[s1 & 0xff] ^ rdk[44]; + t1 = s_td0[s1 >> 24] ^ s_td1[(s0 >> 16) & 0xff] ^ s_td2[(s3 >> 8) & 0xff] ^ s_td3[s2 & 0xff] ^ rdk[45]; + t2 = s_td0[s2 >> 24] ^ s_td1[(s1 >> 16) & 0xff] ^ s_td2[(s0 >> 8) & 0xff] ^ s_td3[s3 & 0xff] ^ rdk[46]; + t3 = s_td0[s3 >> 24] ^ s_td1[(s2 >> 16) & 0xff] ^ s_td2[(s1 >> 8) & 0xff] ^ s_td3[s0 & 0xff] ^ rdk[47]; + s0 = s_td0[t0 >> 24] ^ s_td1[(t3 >> 16) & 0xff] ^ s_td2[(t2 >> 8) & 0xff] ^ s_td3[t1 & 0xff] ^ rdk[48]; + s1 = s_td0[t1 >> 24] ^ s_td1[(t0 >> 16) & 0xff] ^ s_td2[(t3 >> 8) & 0xff] ^ s_td3[t2 & 0xff] ^ rdk[49]; + s2 = s_td0[t2 >> 24] ^ s_td1[(t1 >> 16) & 0xff] ^ s_td2[(t0 >> 8) & 0xff] ^ s_td3[t3 & 0xff] ^ rdk[50]; + s3 = s_td0[t3 >> 24] ^ s_td1[(t2 >> 16) & 0xff] ^ s_td2[(t1 >> 8) & 0xff] ^ s_td3[t0 & 0xff] ^ rdk[51]; + t0 = s_td0[s0 >> 24] ^ s_td1[(s3 >> 16) & 0xff] ^ s_td2[(s2 >> 8) & 0xff] ^ s_td3[s1 & 0xff] ^ rdk[52]; + t1 = s_td0[s1 >> 24] ^ s_td1[(s0 >> 16) & 0xff] ^ s_td2[(s3 >> 8) & 0xff] ^ s_td3[s2 & 0xff] ^ rdk[53]; + t2 = s_td0[s2 >> 24] ^ s_td1[(s1 >> 16) & 0xff] ^ s_td2[(s0 >> 8) & 0xff] ^ s_td3[s3 & 0xff] ^ rdk[54]; + t3 = s_td0[s3 >> 24] ^ s_td1[(s2 >> 16) & 0xff] ^ s_td2[(s1 >> 8) & 0xff] ^ s_td3[s0 & 0xff] ^ rdk[55]; + + out[0] = (s_td4[(t0 >> 24) & 0xff] & 0xff000000) + ^ (s_td4[(t3 >> 16) & 0xff] & 0x00ff0000) + ^ (s_td4[(t2 >> 8) & 0xff] & 0x0000ff00) + ^ (s_td4[(t1 >> 0) & 0xff] & 0x000000ff) + ^ rdk[56]; + + out[1] = (s_td4[(t1 >> 24) & 0xff] & 0xff000000) + ^ (s_td4[(t0 >> 16) & 0xff] & 0x00ff0000) + ^ (s_td4[(t3 >> 8) & 0xff] & 0x0000ff00) + ^ (s_td4[(t2 >> 0) & 0xff] & 0x000000ff) + ^ rdk[57]; + + out[2] = (s_td4[(t2 >> 24) & 0xff] & 0xff000000) + ^ (s_td4[(t1 >> 16) & 0xff] & 0x00ff0000) + ^ (s_td4[(t0 >> 8) & 0xff] & 0x0000ff00) + ^ (s_td4[(t3 >> 0) & 0xff] & 0x000000ff) + ^ rdk[58]; + + out[3] = (s_td4[(t3 >> 24) & 0xff] & 0xff000000) + ^ (s_td4[(t2 >> 16) & 0xff] & 0x00ff0000) + ^ (s_td4[(t1 >> 8) & 0xff] & 0x0000ff00) + ^ (s_td4[(t0 >> 0) & 0xff] & 0x000000ff) + ^ rdk[59]; +} + +__device__ static void AES256_encrypt (const u32 *in, u32 *out, const u32 *rek, u32 s_te0[256], u32 s_te1[256], u32 s_te2[256], u32 s_te3[256], u32 s_te4[256]) +{ + u32 s0 = in[0] ^ rek[0]; + u32 s1 = in[1] ^ rek[1]; + u32 s2 = in[2] ^ rek[2]; + u32 s3 = in[3] ^ rek[3]; + + u32 t0; + u32 t1; + u32 t2; + u32 t3; + + t0 = s_te0[s0 >> 24] ^ s_te1[(s1 >> 16) & 0xff] ^ s_te2[(s2 >> 8) & 0xff] ^ s_te3[s3 & 0xff] ^ rek[ 4]; + t1 = s_te0[s1 >> 24] ^ s_te1[(s2 >> 16) & 0xff] ^ s_te2[(s3 >> 8) & 0xff] ^ s_te3[s0 & 0xff] ^ rek[ 5]; + t2 = s_te0[s2 >> 24] ^ s_te1[(s3 >> 16) & 0xff] ^ s_te2[(s0 >> 8) & 0xff] ^ s_te3[s1 & 0xff] ^ rek[ 6]; + t3 = s_te0[s3 >> 24] ^ s_te1[(s0 >> 16) & 0xff] ^ s_te2[(s1 >> 8) & 0xff] ^ s_te3[s2 & 0xff] ^ rek[ 7]; + s0 = s_te0[t0 >> 24] ^ s_te1[(t1 >> 16) & 0xff] ^ s_te2[(t2 >> 8) & 0xff] ^ s_te3[t3 & 0xff] ^ rek[ 8]; + s1 = s_te0[t1 >> 24] ^ s_te1[(t2 >> 16) & 0xff] ^ s_te2[(t3 >> 8) & 0xff] ^ s_te3[t0 & 0xff] ^ rek[ 9]; + s2 = s_te0[t2 >> 24] ^ s_te1[(t3 >> 16) & 0xff] ^ s_te2[(t0 >> 8) & 0xff] ^ s_te3[t1 & 0xff] ^ rek[10]; + s3 = s_te0[t3 >> 24] ^ s_te1[(t0 >> 16) & 0xff] ^ s_te2[(t1 >> 8) & 0xff] ^ s_te3[t2 & 0xff] ^ rek[11]; + t0 = s_te0[s0 >> 24] ^ s_te1[(s1 >> 16) & 0xff] ^ s_te2[(s2 >> 8) & 0xff] ^ s_te3[s3 & 0xff] ^ rek[12]; + t1 = s_te0[s1 >> 24] ^ s_te1[(s2 >> 16) & 0xff] ^ s_te2[(s3 >> 8) & 0xff] ^ s_te3[s0 & 0xff] ^ rek[13]; + t2 = s_te0[s2 >> 24] ^ s_te1[(s3 >> 16) & 0xff] ^ s_te2[(s0 >> 8) & 0xff] ^ s_te3[s1 & 0xff] ^ rek[14]; + t3 = s_te0[s3 >> 24] ^ s_te1[(s0 >> 16) & 0xff] ^ s_te2[(s1 >> 8) & 0xff] ^ s_te3[s2 & 0xff] ^ rek[15]; + s0 = s_te0[t0 >> 24] ^ s_te1[(t1 >> 16) & 0xff] ^ s_te2[(t2 >> 8) & 0xff] ^ s_te3[t3 & 0xff] ^ rek[16]; + s1 = s_te0[t1 >> 24] ^ s_te1[(t2 >> 16) & 0xff] ^ s_te2[(t3 >> 8) & 0xff] ^ s_te3[t0 & 0xff] ^ rek[17]; + s2 = s_te0[t2 >> 24] ^ s_te1[(t3 >> 16) & 0xff] ^ s_te2[(t0 >> 8) & 0xff] ^ s_te3[t1 & 0xff] ^ rek[18]; + s3 = s_te0[t3 >> 24] ^ s_te1[(t0 >> 16) & 0xff] ^ s_te2[(t1 >> 8) & 0xff] ^ s_te3[t2 & 0xff] ^ rek[19]; + t0 = s_te0[s0 >> 24] ^ s_te1[(s1 >> 16) & 0xff] ^ s_te2[(s2 >> 8) & 0xff] ^ s_te3[s3 & 0xff] ^ rek[20]; + t1 = s_te0[s1 >> 24] ^ s_te1[(s2 >> 16) & 0xff] ^ s_te2[(s3 >> 8) & 0xff] ^ s_te3[s0 & 0xff] ^ rek[21]; + t2 = s_te0[s2 >> 24] ^ s_te1[(s3 >> 16) & 0xff] ^ s_te2[(s0 >> 8) & 0xff] ^ s_te3[s1 & 0xff] ^ rek[22]; + t3 = s_te0[s3 >> 24] ^ s_te1[(s0 >> 16) & 0xff] ^ s_te2[(s1 >> 8) & 0xff] ^ s_te3[s2 & 0xff] ^ rek[23]; + s0 = s_te0[t0 >> 24] ^ s_te1[(t1 >> 16) & 0xff] ^ s_te2[(t2 >> 8) & 0xff] ^ s_te3[t3 & 0xff] ^ rek[24]; + s1 = s_te0[t1 >> 24] ^ s_te1[(t2 >> 16) & 0xff] ^ s_te2[(t3 >> 8) & 0xff] ^ s_te3[t0 & 0xff] ^ rek[25]; + s2 = s_te0[t2 >> 24] ^ s_te1[(t3 >> 16) & 0xff] ^ s_te2[(t0 >> 8) & 0xff] ^ s_te3[t1 & 0xff] ^ rek[26]; + s3 = s_te0[t3 >> 24] ^ s_te1[(t0 >> 16) & 0xff] ^ s_te2[(t1 >> 8) & 0xff] ^ s_te3[t2 & 0xff] ^ rek[27]; + t0 = s_te0[s0 >> 24] ^ s_te1[(s1 >> 16) & 0xff] ^ s_te2[(s2 >> 8) & 0xff] ^ s_te3[s3 & 0xff] ^ rek[28]; + t1 = s_te0[s1 >> 24] ^ s_te1[(s2 >> 16) & 0xff] ^ s_te2[(s3 >> 8) & 0xff] ^ s_te3[s0 & 0xff] ^ rek[29]; + t2 = s_te0[s2 >> 24] ^ s_te1[(s3 >> 16) & 0xff] ^ s_te2[(s0 >> 8) & 0xff] ^ s_te3[s1 & 0xff] ^ rek[30]; + t3 = s_te0[s3 >> 24] ^ s_te1[(s0 >> 16) & 0xff] ^ s_te2[(s1 >> 8) & 0xff] ^ s_te3[s2 & 0xff] ^ rek[31]; + s0 = s_te0[t0 >> 24] ^ s_te1[(t1 >> 16) & 0xff] ^ s_te2[(t2 >> 8) & 0xff] ^ s_te3[t3 & 0xff] ^ rek[32]; + s1 = s_te0[t1 >> 24] ^ s_te1[(t2 >> 16) & 0xff] ^ s_te2[(t3 >> 8) & 0xff] ^ s_te3[t0 & 0xff] ^ rek[33]; + s2 = s_te0[t2 >> 24] ^ s_te1[(t3 >> 16) & 0xff] ^ s_te2[(t0 >> 8) & 0xff] ^ s_te3[t1 & 0xff] ^ rek[34]; + s3 = s_te0[t3 >> 24] ^ s_te1[(t0 >> 16) & 0xff] ^ s_te2[(t1 >> 8) & 0xff] ^ s_te3[t2 & 0xff] ^ rek[35]; + t0 = s_te0[s0 >> 24] ^ s_te1[(s1 >> 16) & 0xff] ^ s_te2[(s2 >> 8) & 0xff] ^ s_te3[s3 & 0xff] ^ rek[36]; + t1 = s_te0[s1 >> 24] ^ s_te1[(s2 >> 16) & 0xff] ^ s_te2[(s3 >> 8) & 0xff] ^ s_te3[s0 & 0xff] ^ rek[37]; + t2 = s_te0[s2 >> 24] ^ s_te1[(s3 >> 16) & 0xff] ^ s_te2[(s0 >> 8) & 0xff] ^ s_te3[s1 & 0xff] ^ rek[38]; + t3 = s_te0[s3 >> 24] ^ s_te1[(s0 >> 16) & 0xff] ^ s_te2[(s1 >> 8) & 0xff] ^ s_te3[s2 & 0xff] ^ rek[39]; + s0 = s_te0[t0 >> 24] ^ s_te1[(t1 >> 16) & 0xff] ^ s_te2[(t2 >> 8) & 0xff] ^ s_te3[t3 & 0xff] ^ rek[40]; + s1 = s_te0[t1 >> 24] ^ s_te1[(t2 >> 16) & 0xff] ^ s_te2[(t3 >> 8) & 0xff] ^ s_te3[t0 & 0xff] ^ rek[41]; + s2 = s_te0[t2 >> 24] ^ s_te1[(t3 >> 16) & 0xff] ^ s_te2[(t0 >> 8) & 0xff] ^ s_te3[t1 & 0xff] ^ rek[42]; + s3 = s_te0[t3 >> 24] ^ s_te1[(t0 >> 16) & 0xff] ^ s_te2[(t1 >> 8) & 0xff] ^ s_te3[t2 & 0xff] ^ rek[43]; + t0 = s_te0[s0 >> 24] ^ s_te1[(s1 >> 16) & 0xff] ^ s_te2[(s2 >> 8) & 0xff] ^ s_te3[s3 & 0xff] ^ rek[44]; + t1 = s_te0[s1 >> 24] ^ s_te1[(s2 >> 16) & 0xff] ^ s_te2[(s3 >> 8) & 0xff] ^ s_te3[s0 & 0xff] ^ rek[45]; + t2 = s_te0[s2 >> 24] ^ s_te1[(s3 >> 16) & 0xff] ^ s_te2[(s0 >> 8) & 0xff] ^ s_te3[s1 & 0xff] ^ rek[46]; + t3 = s_te0[s3 >> 24] ^ s_te1[(s0 >> 16) & 0xff] ^ s_te2[(s1 >> 8) & 0xff] ^ s_te3[s2 & 0xff] ^ rek[47]; + s0 = s_te0[t0 >> 24] ^ s_te1[(t1 >> 16) & 0xff] ^ s_te2[(t2 >> 8) & 0xff] ^ s_te3[t3 & 0xff] ^ rek[48]; + s1 = s_te0[t1 >> 24] ^ s_te1[(t2 >> 16) & 0xff] ^ s_te2[(t3 >> 8) & 0xff] ^ s_te3[t0 & 0xff] ^ rek[49]; + s2 = s_te0[t2 >> 24] ^ s_te1[(t3 >> 16) & 0xff] ^ s_te2[(t0 >> 8) & 0xff] ^ s_te3[t1 & 0xff] ^ rek[50]; + s3 = s_te0[t3 >> 24] ^ s_te1[(t0 >> 16) & 0xff] ^ s_te2[(t1 >> 8) & 0xff] ^ s_te3[t2 & 0xff] ^ rek[51]; + t0 = s_te0[s0 >> 24] ^ s_te1[(s1 >> 16) & 0xff] ^ s_te2[(s2 >> 8) & 0xff] ^ s_te3[s3 & 0xff] ^ rek[52]; + t1 = s_te0[s1 >> 24] ^ s_te1[(s2 >> 16) & 0xff] ^ s_te2[(s3 >> 8) & 0xff] ^ s_te3[s0 & 0xff] ^ rek[53]; + t2 = s_te0[s2 >> 24] ^ s_te1[(s3 >> 16) & 0xff] ^ s_te2[(s0 >> 8) & 0xff] ^ s_te3[s1 & 0xff] ^ rek[54]; + t3 = s_te0[s3 >> 24] ^ s_te1[(s0 >> 16) & 0xff] ^ s_te2[(s1 >> 8) & 0xff] ^ s_te3[s2 & 0xff] ^ rek[55]; + + out[0] = (s_te4[(t0 >> 24) & 0xff] & 0xff000000) + ^ (s_te4[(t1 >> 16) & 0xff] & 0x00ff0000) + ^ (s_te4[(t2 >> 8) & 0xff] & 0x0000ff00) + ^ (s_te4[(t3 >> 0) & 0xff] & 0x000000ff) + ^ rek[56]; + + out[1] = (s_te4[(t1 >> 24) & 0xff] & 0xff000000) + ^ (s_te4[(t2 >> 16) & 0xff] & 0x00ff0000) + ^ (s_te4[(t3 >> 8) & 0xff] & 0x0000ff00) + ^ (s_te4[(t0 >> 0) & 0xff] & 0x000000ff) + ^ rek[57]; + + out[2] = (s_te4[(t2 >> 24) & 0xff] & 0xff000000) + ^ (s_te4[(t3 >> 16) & 0xff] & 0x00ff0000) + ^ (s_te4[(t0 >> 8) & 0xff] & 0x0000ff00) + ^ (s_te4[(t1 >> 0) & 0xff] & 0x000000ff) + ^ rek[58]; + + out[3] = (s_te4[(t3 >> 24) & 0xff] & 0xff000000) + ^ (s_te4[(t0 >> 16) & 0xff] & 0x00ff0000) + ^ (s_te4[(t1 >> 8) & 0xff] & 0x0000ff00) + ^ (s_te4[(t2 >> 0) & 0xff] & 0x000000ff) + ^ rek[59]; +} + +__device__ static void sha256_transform (const u32x w0[4], const u32x w1[4], const u32x w2[4], const u32x w3[4], u32x digest[8]) +{ + u32x a = digest[0]; + u32x b = digest[1]; + u32x c = digest[2]; + u32x d = digest[3]; + u32x e = digest[4]; + u32x f = digest[5]; + u32x g = digest[6]; + u32x h = digest[7]; + + u32x w0_t = w0[0]; + u32x w1_t = w0[1]; + u32x w2_t = w0[2]; + u32x w3_t = w0[3]; + u32x w4_t = w1[0]; + u32x w5_t = w1[1]; + u32x w6_t = w1[2]; + u32x w7_t = w1[3]; + u32x w8_t = w2[0]; + u32x w9_t = w2[1]; + u32x wa_t = w2[2]; + u32x wb_t = w2[3]; + u32x wc_t = w3[0]; + u32x wd_t = w3[1]; + u32x we_t = w3[2]; + u32x wf_t = w3[3]; + + SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C00); + SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C01); + SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C02); + SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C03); + SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C04); + SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C05); + SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C06); + SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C07); + SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C08); + SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C09); + SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C0a); + SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C0b); + SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C0c); + SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C0d); + SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C0e); + SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C0f); + w0_t = SHA256_S1(we_t) + w9_t + SHA256_S0(w1_t) + w0_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C10); + w1_t = SHA256_S1(wf_t) + wa_t + SHA256_S0(w2_t) + w1_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C11); + w2_t = SHA256_S1(w0_t) + wb_t + SHA256_S0(w3_t) + w2_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C12); + w3_t = SHA256_S1(w1_t) + wc_t + SHA256_S0(w4_t) + w3_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C13); + w4_t = SHA256_S1(w2_t) + wd_t + SHA256_S0(w5_t) + w4_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C14); + w5_t = SHA256_S1(w3_t) + we_t + SHA256_S0(w6_t) + w5_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C15); + w6_t = SHA256_S1(w4_t) + wf_t + SHA256_S0(w7_t) + w6_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C16); + w7_t = SHA256_S1(w5_t) + w0_t + SHA256_S0(w8_t) + w7_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C17); + w8_t = SHA256_S1(w6_t) + w1_t + SHA256_S0(w9_t) + w8_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C18); + w9_t = SHA256_S1(w7_t) + w2_t + SHA256_S0(wa_t) + w9_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C19); + wa_t = SHA256_S1(w8_t) + w3_t + SHA256_S0(wb_t) + wa_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C1a); + wb_t = SHA256_S1(w9_t) + w4_t + SHA256_S0(wc_t) + wb_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C1b); + wc_t = SHA256_S1(wa_t) + w5_t + SHA256_S0(wd_t) + wc_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C1c); + wd_t = SHA256_S1(wb_t) + w6_t + SHA256_S0(we_t) + wd_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C1d); + we_t = SHA256_S1(wc_t) + w7_t + SHA256_S0(wf_t) + we_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C1e); + wf_t = SHA256_S1(wd_t) + w8_t + SHA256_S0(w0_t) + wf_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C1f); + w0_t = SHA256_S1(we_t) + w9_t + SHA256_S0(w1_t) + w0_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C20); + w1_t = SHA256_S1(wf_t) + wa_t + SHA256_S0(w2_t) + w1_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C21); + w2_t = SHA256_S1(w0_t) + wb_t + SHA256_S0(w3_t) + w2_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C22); + w3_t = SHA256_S1(w1_t) + wc_t + SHA256_S0(w4_t) + w3_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C23); + w4_t = SHA256_S1(w2_t) + wd_t + SHA256_S0(w5_t) + w4_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C24); + w5_t = SHA256_S1(w3_t) + we_t + SHA256_S0(w6_t) + w5_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C25); + w6_t = SHA256_S1(w4_t) + wf_t + SHA256_S0(w7_t) + w6_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C26); + w7_t = SHA256_S1(w5_t) + w0_t + SHA256_S0(w8_t) + w7_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C27); + w8_t = SHA256_S1(w6_t) + w1_t + SHA256_S0(w9_t) + w8_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C28); + w9_t = SHA256_S1(w7_t) + w2_t + SHA256_S0(wa_t) + w9_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C29); + wa_t = SHA256_S1(w8_t) + w3_t + SHA256_S0(wb_t) + wa_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C2a); + wb_t = SHA256_S1(w9_t) + w4_t + SHA256_S0(wc_t) + wb_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C2b); + wc_t = SHA256_S1(wa_t) + w5_t + SHA256_S0(wd_t) + wc_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C2c); + wd_t = SHA256_S1(wb_t) + w6_t + SHA256_S0(we_t) + wd_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C2d); + we_t = SHA256_S1(wc_t) + w7_t + SHA256_S0(wf_t) + we_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C2e); + wf_t = SHA256_S1(wd_t) + w8_t + SHA256_S0(w0_t) + wf_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C2f); + w0_t = SHA256_S1(we_t) + w9_t + SHA256_S0(w1_t) + w0_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C30); + w1_t = SHA256_S1(wf_t) + wa_t + SHA256_S0(w2_t) + w1_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C31); + w2_t = SHA256_S1(w0_t) + wb_t + SHA256_S0(w3_t) + w2_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C32); + w3_t = SHA256_S1(w1_t) + wc_t + SHA256_S0(w4_t) + w3_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C33); + w4_t = SHA256_S1(w2_t) + wd_t + SHA256_S0(w5_t) + w4_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C34); + w5_t = SHA256_S1(w3_t) + we_t + SHA256_S0(w6_t) + w5_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C35); + w6_t = SHA256_S1(w4_t) + wf_t + SHA256_S0(w7_t) + w6_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C36); + w7_t = SHA256_S1(w5_t) + w0_t + SHA256_S0(w8_t) + w7_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C37); + w8_t = SHA256_S1(w6_t) + w1_t + SHA256_S0(w9_t) + w8_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C38); + w9_t = SHA256_S1(w7_t) + w2_t + SHA256_S0(wa_t) + w9_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C39); + wa_t = SHA256_S1(w8_t) + w3_t + SHA256_S0(wb_t) + wa_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C3a); + wb_t = SHA256_S1(w9_t) + w4_t + SHA256_S0(wc_t) + wb_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C3b); + wc_t = SHA256_S1(wa_t) + w5_t + SHA256_S0(wd_t) + wc_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C3c); + wd_t = SHA256_S1(wb_t) + w6_t + SHA256_S0(we_t) + wd_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C3d); + we_t = SHA256_S1(wc_t) + w7_t + SHA256_S0(wf_t) + we_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C3e); + wf_t = SHA256_S1(wd_t) + w8_t + SHA256_S0(w0_t) + wf_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C3f); + + digest[0] += a; + digest[1] += b; + digest[2] += c; + digest[3] += d; + digest[4] += e; + digest[5] += f; + digest[6] += g; + digest[7] += h; +} + +__device__ static void sha1_transform (const u32x w0[4], const u32x w1[4], const u32x w2[4], const u32x w3[4], u32x digest[5]) +{ + u32x A = digest[0]; + u32x B = digest[1]; + u32x C = digest[2]; + u32x D = digest[3]; + u32x E = digest[4]; + + u32x w0_t = w0[0]; + u32x w1_t = w0[1]; + u32x w2_t = w0[2]; + u32x w3_t = w0[3]; + u32x w4_t = w1[0]; + u32x w5_t = w1[1]; + u32x w6_t = w1[2]; + u32x w7_t = w1[3]; + u32x w8_t = w2[0]; + u32x w9_t = w2[1]; + u32x wa_t = w2[2]; + u32x wb_t = w2[3]; + u32x wc_t = w3[0]; + u32x wd_t = w3[1]; + u32x we_t = w3[2]; + u32x wf_t = w3[3]; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, A, B, C, D, E, w0_t); + SHA1_STEP (SHA1_F0o, E, A, B, C, D, w1_t); + SHA1_STEP (SHA1_F0o, D, E, A, B, C, w2_t); + SHA1_STEP (SHA1_F0o, C, D, E, A, B, w3_t); + SHA1_STEP (SHA1_F0o, B, C, D, E, A, w4_t); + SHA1_STEP (SHA1_F0o, A, B, C, D, E, w5_t); + SHA1_STEP (SHA1_F0o, E, A, B, C, D, w6_t); + SHA1_STEP (SHA1_F0o, D, E, A, B, C, w7_t); + SHA1_STEP (SHA1_F0o, C, D, E, A, B, w8_t); + SHA1_STEP (SHA1_F0o, B, C, D, E, A, w9_t); + SHA1_STEP (SHA1_F0o, A, B, C, D, E, wa_t); + SHA1_STEP (SHA1_F0o, E, A, B, C, D, wb_t); + SHA1_STEP (SHA1_F0o, D, E, A, B, C, wc_t); + SHA1_STEP (SHA1_F0o, C, D, E, A, B, wd_t); + SHA1_STEP (SHA1_F0o, B, C, D, E, A, we_t); + SHA1_STEP (SHA1_F0o, A, B, C, D, E, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F0o, E, A, B, C, D, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F0o, D, E, A, B, C, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F0o, C, D, E, A, B, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F0o, B, C, D, E, A, w3_t); + + #undef K + #define K SHA1C01 + + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w7_t); + + #undef K + #define K SHA1C02 + + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, wb_t); + + #undef K + #define K SHA1C03 + + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, wf_t); + + digest[0] += A; + digest[1] += B; + digest[2] += C; + digest[3] += D; + digest[4] += E; +} + +__device__ static void hmac_sha1_pad (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], u32x ipad[5], u32x opad[5]) +{ + w0[0] = w0[0] ^ 0x36363636; + w0[1] = w0[1] ^ 0x36363636; + w0[2] = w0[2] ^ 0x36363636; + w0[3] = w0[3] ^ 0x36363636; + w1[0] = w1[0] ^ 0x36363636; + w1[1] = w1[1] ^ 0x36363636; + w1[2] = w1[2] ^ 0x36363636; + w1[3] = w1[3] ^ 0x36363636; + w2[0] = w2[0] ^ 0x36363636; + w2[1] = w2[1] ^ 0x36363636; + w2[2] = w2[2] ^ 0x36363636; + w2[3] = w2[3] ^ 0x36363636; + w3[0] = w3[0] ^ 0x36363636; + w3[1] = w3[1] ^ 0x36363636; + w3[2] = w3[2] ^ 0x36363636; + w3[3] = w3[3] ^ 0x36363636; + + ipad[0] = SHA1M_A; + ipad[1] = SHA1M_B; + ipad[2] = SHA1M_C; + ipad[3] = SHA1M_D; + ipad[4] = SHA1M_E; + + sha1_transform (w0, w1, w2, w3, ipad); + + w0[0] = w0[0] ^ 0x6a6a6a6a; + w0[1] = w0[1] ^ 0x6a6a6a6a; + w0[2] = w0[2] ^ 0x6a6a6a6a; + w0[3] = w0[3] ^ 0x6a6a6a6a; + w1[0] = w1[0] ^ 0x6a6a6a6a; + w1[1] = w1[1] ^ 0x6a6a6a6a; + w1[2] = w1[2] ^ 0x6a6a6a6a; + w1[3] = w1[3] ^ 0x6a6a6a6a; + w2[0] = w2[0] ^ 0x6a6a6a6a; + w2[1] = w2[1] ^ 0x6a6a6a6a; + w2[2] = w2[2] ^ 0x6a6a6a6a; + w2[3] = w2[3] ^ 0x6a6a6a6a; + w3[0] = w3[0] ^ 0x6a6a6a6a; + w3[1] = w3[1] ^ 0x6a6a6a6a; + w3[2] = w3[2] ^ 0x6a6a6a6a; + w3[3] = w3[3] ^ 0x6a6a6a6a; + + opad[0] = SHA1M_A; + opad[1] = SHA1M_B; + opad[2] = SHA1M_C; + opad[3] = SHA1M_D; + opad[4] = SHA1M_E; + + sha1_transform (w0, w1, w2, w3, opad); +} + +__device__ static void hmac_sha1_run (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], u32x ipad[5], u32x opad[5], u32x digest[5]) +{ + digest[0] = ipad[0]; + digest[1] = ipad[1]; + digest[2] = ipad[2]; + digest[3] = ipad[3]; + digest[4] = ipad[4]; + + sha1_transform (w0, w1, w2, w3, digest); + + w0[0] = digest[0]; + w0[1] = digest[1]; + w0[2] = digest[2]; + w0[3] = digest[3]; + w1[0] = digest[4]; + w1[1] = 0x80000000; + w1[2] = 0; + w1[3] = 0; + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = (64 + 20) * 8; + + digest[0] = opad[0]; + digest[1] = opad[1]; + digest[2] = opad[2]; + digest[3] = opad[3]; + digest[4] = opad[4]; + + sha1_transform (w0, w1, w2, w3, digest); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m08800_init (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, androidfde_tmp_t *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const androidfde_t *androidfde_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = pws[gid].i[ 8]; + w2[1] = pws[gid].i[ 9]; + w2[2] = pws[gid].i[10]; + w2[3] = pws[gid].i[11]; + + u32x w3[4]; + + w3[0] = pws[gid].i[12]; + w3[1] = pws[gid].i[13]; + w3[2] = pws[gid].i[14]; + w3[3] = pws[gid].i[15]; + + /** + * salt + */ + + u32 salt_len = 16; + + u32 salt_buf[4]; + + salt_buf[0] = salt_bufs[salt_pos].salt_buf[0]; + salt_buf[1] = salt_bufs[salt_pos].salt_buf[1]; + salt_buf[2] = salt_bufs[salt_pos].salt_buf[2]; + salt_buf[3] = salt_bufs[salt_pos].salt_buf[3]; + + /** + * pads + */ + + w0[0] = swap_workaround (w0[0]); + w0[1] = swap_workaround (w0[1]); + w0[2] = swap_workaround (w0[2]); + w0[3] = swap_workaround (w0[3]); + w1[0] = swap_workaround (w1[0]); + w1[1] = swap_workaround (w1[1]); + w1[2] = swap_workaround (w1[2]); + w1[3] = swap_workaround (w1[3]); + w2[0] = swap_workaround (w2[0]); + w2[1] = swap_workaround (w2[1]); + w2[2] = swap_workaround (w2[2]); + w2[3] = swap_workaround (w2[3]); + w3[0] = swap_workaround (w3[0]); + w3[1] = swap_workaround (w3[1]); + w3[2] = swap_workaround (w3[2]); + w3[3] = swap_workaround (w3[3]); + + u32x ipad[5]; + u32x opad[5]; + + hmac_sha1_pad (w0, w1, w2, w3, ipad, opad); + + tmps[gid].ipad[0] = ipad[0]; + tmps[gid].ipad[1] = ipad[1]; + tmps[gid].ipad[2] = ipad[2]; + tmps[gid].ipad[3] = ipad[3]; + tmps[gid].ipad[4] = ipad[4]; + + tmps[gid].opad[0] = opad[0]; + tmps[gid].opad[1] = opad[1]; + tmps[gid].opad[2] = opad[2]; + tmps[gid].opad[3] = opad[3]; + tmps[gid].opad[4] = opad[4]; + + for (u32 i = 0, j = 1; i < 8; i += 5, j += 1) + { + w0[0] = salt_buf[0]; + w0[1] = salt_buf[1]; + w0[2] = salt_buf[2]; + w0[3] = salt_buf[3]; + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + if (j == 1) + append_0x01_3 (w0, w1, w2, salt_len + 3); + else + append_0x02_3 (w0, w1, w2, salt_len + 3); + + append_0x80_3 (w0, w1, w2, salt_len + 4); + + w0[0] = swap_workaround (w0[0]); + w0[1] = swap_workaround (w0[1]); + w0[2] = swap_workaround (w0[2]); + w0[3] = swap_workaround (w0[3]); + w1[0] = swap_workaround (w1[0]); + w1[1] = swap_workaround (w1[1]); + w1[2] = swap_workaround (w1[2]); + w1[3] = swap_workaround (w1[3]); + w2[0] = swap_workaround (w2[0]); + w2[1] = swap_workaround (w2[1]); + w2[2] = 0; + w2[3] = 0; + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = (64 + salt_len + 4) * 8; + + u32x dgst[5]; + + hmac_sha1_run (w0, w1, w2, w3, ipad, opad, dgst); + + tmps[gid].dgst[i + 0] = dgst[0]; + tmps[gid].dgst[i + 1] = dgst[1]; + tmps[gid].dgst[i + 2] = dgst[2]; + tmps[gid].dgst[i + 3] = dgst[3]; + tmps[gid].dgst[i + 4] = dgst[4]; + + tmps[gid].out[i + 0] = dgst[0]; + tmps[gid].out[i + 1] = dgst[1]; + tmps[gid].out[i + 2] = dgst[2]; + tmps[gid].out[i + 3] = dgst[3]; + tmps[gid].out[i + 4] = dgst[4]; + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m08800_loop (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, androidfde_tmp_t *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const androidfde_t *androidfde_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x ipad[5]; + u32x opad[5]; + + ipad[0] = tmps[gid].ipad[0]; + ipad[1] = tmps[gid].ipad[1]; + ipad[2] = tmps[gid].ipad[2]; + ipad[3] = tmps[gid].ipad[3]; + ipad[4] = tmps[gid].ipad[4]; + + opad[0] = tmps[gid].opad[0]; + opad[1] = tmps[gid].opad[1]; + opad[2] = tmps[gid].opad[2]; + opad[3] = tmps[gid].opad[3]; + opad[4] = tmps[gid].opad[4]; + + for (u32 i = 0; i < 8; i += 5) + { + u32x dgst[5]; + u32x out[5]; + + dgst[0] = tmps[gid].dgst[i + 0]; + dgst[1] = tmps[gid].dgst[i + 1]; + dgst[2] = tmps[gid].dgst[i + 2]; + dgst[3] = tmps[gid].dgst[i + 3]; + dgst[4] = tmps[gid].dgst[i + 4]; + + out[0] = tmps[gid].out[i + 0]; + out[1] = tmps[gid].out[i + 1]; + out[2] = tmps[gid].out[i + 2]; + out[3] = tmps[gid].out[i + 3]; + out[4] = tmps[gid].out[i + 4]; + + for (u32 j = 0; j < loop_cnt; j++) + { + u32x w0[4]; + u32x w1[4]; + u32x w2[4]; + u32x w3[4]; + + w0[0] = dgst[0]; + w0[1] = dgst[1]; + w0[2] = dgst[2]; + w0[3] = dgst[3]; + w1[0] = dgst[4]; + w1[1] = 0x80000000; + w1[2] = 0; + w1[3] = 0; + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = (64 + 20) * 8; + + hmac_sha1_run (w0, w1, w2, w3, ipad, opad, dgst); + + out[0] ^= dgst[0]; + out[1] ^= dgst[1]; + out[2] ^= dgst[2]; + out[3] ^= dgst[3]; + out[4] ^= dgst[4]; + } + + tmps[gid].dgst[i + 0] = dgst[0]; + tmps[gid].dgst[i + 1] = dgst[1]; + tmps[gid].dgst[i + 2] = dgst[2]; + tmps[gid].dgst[i + 3] = dgst[3]; + tmps[gid].dgst[i + 4] = dgst[4]; + + tmps[gid].out[i + 0] = out[0]; + tmps[gid].out[i + 1] = out[1]; + tmps[gid].out[i + 2] = out[2]; + tmps[gid].out[i + 3] = out[3]; + tmps[gid].out[i + 4] = out[4]; + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m08800_comp (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, androidfde_tmp_t *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const androidfde_t *androidfde_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + const u32 lid = threadIdx.x; + + u32 rek[60]; + u32 rdk[60]; + + u32 data[4]; + u32 iv[4]; + u32 out[4]; + + /** + * aes shared + */ + + __shared__ u32 s_td0[256]; + __shared__ u32 s_td1[256]; + __shared__ u32 s_td2[256]; + __shared__ u32 s_td3[256]; + __shared__ u32 s_td4[256]; + + __shared__ u32 s_te0[256]; + __shared__ u32 s_te1[256]; + __shared__ u32 s_te2[256]; + __shared__ u32 s_te3[256]; + __shared__ u32 s_te4[256]; + + s_td0[lid] = td0[lid]; + s_td1[lid] = td1[lid]; + s_td2[lid] = td2[lid]; + s_td3[lid] = td3[lid]; + s_td4[lid] = td4[lid]; + + s_te0[lid] = te0[lid]; + s_te1[lid] = te1[lid]; + s_te2[lid] = te2[lid]; + s_te3[lid] = te3[lid]; + s_te4[lid] = te4[lid]; + + __syncthreads (); + + if (gid >= gid_max) return; + + /** + * aes init + */ + + u32x ukeyx[8]; + + ukeyx[0] = tmps[gid].out[0]; + ukeyx[1] = tmps[gid].out[1]; + ukeyx[2] = tmps[gid].out[2]; + ukeyx[3] = tmps[gid].out[3]; + ukeyx[4] = 0; + ukeyx[5] = 0; + ukeyx[6] = 0; + ukeyx[7] = 0; + + u32x a; + u32x b; + u32x c; + u32x d; + + /** + * aes decrypt key + */ + + data[0] = digests_buf[digests_offset].digest_buf[0]; + data[1] = digests_buf[digests_offset].digest_buf[1]; + data[2] = digests_buf[digests_offset].digest_buf[2]; + data[3] = digests_buf[digests_offset].digest_buf[3]; + + iv[0] = tmps[gid].out[4]; + iv[1] = tmps[gid].out[5]; + iv[2] = tmps[gid].out[6]; + iv[3] = tmps[gid].out[7]; + + AES128_ExpandKey (ukeyx, rek, s_te0, s_te1, s_te2, s_te3, s_te4); + + for (u32 i = 0; i < 44; i++) rdk[i] = rek[i]; + + AES128_InvertKey (rdk, s_td0, s_td1, s_td2, s_td3, s_td4, s_te0, s_te1, s_te2, s_te3, s_te4); + + AES128_decrypt (data, out, rdk, s_td0, s_td1, s_td2, s_td3, s_td4); + + a = out[0] ^ iv[0]; + b = out[1] ^ iv[1]; + c = out[2] ^ iv[2]; + d = out[3] ^ iv[3]; + + /** + * section AES_cbc_essiv() starting + */ + + // 1. start with simple sha256_transform + + u32x essivhash[8]; + + essivhash[0] = SHA256M_A; + essivhash[1] = SHA256M_B; + essivhash[2] = SHA256M_C; + essivhash[3] = SHA256M_D; + essivhash[4] = SHA256M_E; + essivhash[5] = SHA256M_F; + essivhash[6] = SHA256M_G; + essivhash[7] = SHA256M_H; + + u32x w0[4]; + u32x w1[4]; + u32x w2[4]; + u32x w3[4]; + + w0[0] = a; + w0[1] = b; + w0[2] = c; + w0[3] = d; + w1[0] = 0x80000000; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 16 * 8; + + sha256_transform (w0, w1, w2, w3, essivhash); + + // check for FAT + + { + // 2. generate essiv based on startsector -- each 512 byte is one sector + + data[0] = 0; + data[1] = 0; + data[2] = 0; + data[3] = 0; + + ukeyx[0] = essivhash[0]; + ukeyx[1] = essivhash[1]; + ukeyx[2] = essivhash[2]; + ukeyx[3] = essivhash[3]; + ukeyx[4] = essivhash[4]; + ukeyx[5] = essivhash[5]; + ukeyx[6] = essivhash[6]; + ukeyx[7] = essivhash[7]; + + AES256_ExpandKey (ukeyx, rek, s_te0, s_te1, s_te2, s_te3, s_te4); + + u32 essiv[4]; + + AES256_encrypt (data, essiv, rek, s_te0, s_te1, s_te2, s_te3, s_te4); + + // 3. decrypt real data, xor essiv afterwards + + data[0] = androidfde_bufs[salt_pos].data[0]; + data[1] = androidfde_bufs[salt_pos].data[1]; + data[2] = androidfde_bufs[salt_pos].data[2]; + data[3] = androidfde_bufs[salt_pos].data[3]; + + iv[0] = essiv[0]; + iv[1] = essiv[1]; + iv[2] = essiv[2]; + iv[3] = essiv[3]; + + ukeyx[0] = a; + ukeyx[1] = b; + ukeyx[2] = c; + ukeyx[3] = d; + ukeyx[4] = 0; + ukeyx[5] = 0; + ukeyx[6] = 0; + ukeyx[7] = 0; + + AES128_ExpandKey (ukeyx, rek, s_te0, s_te1, s_te2, s_te3, s_te4); + + for (u32 i = 0; i < 44; i++) rdk[i] = rek[i]; + + AES128_InvertKey (rdk, s_td0, s_td1, s_td2, s_td3, s_td4, s_te0, s_te1, s_te2, s_te3, s_te4); + + AES128_decrypt (data, out, rdk, s_td0, s_td1, s_td2, s_td3, s_td4); + + u32x r0 = out[0] ^ iv[0]; + u32x r1 = out[1] ^ iv[1]; + u32x r2 = out[2] ^ iv[2]; + u32x r3 = out[3] ^ iv[3]; + + // rotate 3 byte (static in fat!) + + r0 = r1 << 8 | r0 >> 24; + r1 = r2 << 8 | r1 >> 24; + + // MSDOS5.0 + if ((r0 == 0x4f44534d) && (r1 == 0x302e3553)) + { + mark_hash_s0 (plains_buf, hashes_shown, digests_offset + 0, gid, 0); + + d_return_buf[lid] = 1; + } + } + + // check for extfs + + { + u32 r[16]; + + // 2. generate essiv based on startsector -- each 512 byte is one sector + + // not needed because of cbc mode -- implementation flaw !!. first 16 byte are not interessting + + r[0] = 0; + r[1] = 0; + r[2] = 0; + r[3] = 0; + + // 3. decrypt real data + + ukeyx[0] = a; + ukeyx[1] = b; + ukeyx[2] = c; + ukeyx[3] = d; + ukeyx[4] = 0; + ukeyx[5] = 0; + ukeyx[6] = 0; + ukeyx[7] = 0; + + AES128_ExpandKey (ukeyx, rek, s_te0, s_te1, s_te2, s_te3, s_te4); + + for (u32 i = 0; i < 44; i++) rdk[i] = rek[i]; + + AES128_InvertKey (rdk, s_td0, s_td1, s_td2, s_td3, s_td4, s_te0, s_te1, s_te2, s_te3, s_te4); + + for (u32 i = 4; i < 16; i += 4) + { + data[0] = androidfde_bufs[salt_pos].data[256 + i + 0]; + data[1] = androidfde_bufs[salt_pos].data[256 + i + 1]; + data[2] = androidfde_bufs[salt_pos].data[256 + i + 2]; + data[3] = androidfde_bufs[salt_pos].data[256 + i + 3]; + + iv[0] = androidfde_bufs[salt_pos].data[256 + i + 0 - 4]; + iv[1] = androidfde_bufs[salt_pos].data[256 + i + 1 - 4]; + iv[2] = androidfde_bufs[salt_pos].data[256 + i + 2 - 4]; + iv[3] = androidfde_bufs[salt_pos].data[256 + i + 3 - 4]; + + AES128_decrypt (data, out, rdk, s_td0, s_td1, s_td2, s_td3, s_td4); + + r[i + 0] = out[0] ^ iv[0]; + r[i + 1] = out[1] ^ iv[1]; + r[i + 2] = out[2] ^ iv[2]; + r[i + 3] = out[3] ^ iv[3]; + } + + // we need just a few swapped, because we do not access the others + r[ 5] = swap_workaround (r[ 5]); + r[ 6] = swap_workaround (r[ 6]); + r[14] = swap_workaround (r[14]); + + // superblock not on id 0 or 1 + // assumes max block size is 32MiB + // has EXT2_SUPER_MAGIC + + if ((r[5] < 2) && (r[6] < 16) && ((r[14] & 0xffff) == 0xEF53)) + { + mark_hash_s0 (plains_buf, hashes_shown, digests_offset + 0, gid, 0); + + d_return_buf[lid] = 1; + } + } +} diff --git a/nv/m08900.cu b/nv/m08900.cu new file mode 100644 index 0000000000..e589a98a70 --- /dev/null +++ b/nv/m08900.cu @@ -0,0 +1,1179 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _SCRYPT_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW2 +#define VECT_SIZE1 +#endif + +#define DGST_R0 0 +#define DGST_R1 1 +#define DGST_R2 2 +#define DGST_R3 3 + +#include "include/kernel_functions.c" +#include "types_nv.c" +#include "common_nv.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +class uintm +{ + private: + public: + + u32 x; + u32 y; + u32 z; + u32 w; + + inline __device__ uintm (const u32 a, const u32 b, const u32 c, const u32 d) : x(a), y(b), z(c), w(d) { } + inline __device__ uintm (const u32 a) : x(a), y(a), z(a), w(a) { } + + inline __device__ uintm (void) { } + inline __device__ ~uintm (void) { } +}; + +typedef struct +{ + uintm P[64]; + +} scrypt_tmp_t; + +__device__ static uintm __byte_perm (const uintm a, const uintm b, const u32 c) +{ + return uintm (__byte_perm (a.x, b.x, c), + __byte_perm (a.y, b.y, c), + __byte_perm (a.z, b.z, c), + __byte_perm (a.w, b.w, c)); +} + +__device__ static uintm rotate (const uintm a, const unsigned int n) +{ + return uintm (rotl32 (a.x, n), + rotl32 (a.y, n), + rotl32 (a.z, n), + rotl32 (a.w, n)); +} + +inline __device__ uintm wxyz (const uintm a) { return uintm (a.w, a.x, a.y, a.z); } +inline __device__ uintm zwxy (const uintm a) { return uintm (a.z, a.w, a.x, a.y); } + +inline __device__ uintm operator << (const uintm a, const u32 b) { return uintm ((a.x << b ), (a.y << b ), (a.z << b ), (a.w << b )); } +inline __device__ uintm operator << (const uintm a, const uintm b) { return uintm ((a.x << b.x), (a.y << b.y), (a.z << b.z), (a.w << b.w)); } + +inline __device__ uintm operator >> (const uintm a, const u32 b) { return uintm ((a.x >> b ), (a.y >> b ), (a.z >> b ), (a.w >> b )); } +inline __device__ uintm operator >> (const uintm a, const uintm b) { return uintm ((a.x >> b.x), (a.y >> b.y), (a.z >> b.z), (a.w >> b.w)); } + +inline __device__ uintm operator ^ (const uintm a, const u32 b) { return uintm ((a.x ^ b ), (a.y ^ b ), (a.z ^ b ), (a.w ^ b )); } +inline __device__ uintm operator ^ (const uintm a, const uintm b) { return uintm ((a.x ^ b.x), (a.y ^ b.y), (a.z ^ b.z), (a.w ^ b.w)); } + +inline __device__ uintm operator | (const uintm a, const u32 b) { return uintm ((a.x | b ), (a.y | b ), (a.z | b ), (a.w | b )); } +inline __device__ uintm operator | (const uintm a, const uintm b) { return uintm ((a.x | b.x), (a.y | b.y), (a.z | b.z), (a.w | b.w)); } + +inline __device__ uintm operator & (const uintm a, const u32 b) { return uintm ((a.x & b ), (a.y & b ), (a.z & b ), (a.w & b )); } +inline __device__ uintm operator & (const uintm a, const uintm b) { return uintm ((a.x & b.x), (a.y & b.y), (a.z & b.z), (a.w & b.w)); } + +inline __device__ uintm operator + (const uintm a, const u32 b) { return uintm ((a.x + b ), (a.y + b ), (a.z + b ), (a.w + b )); } +inline __device__ uintm operator + (const uintm a, const uintm b) { return uintm ((a.x + b.x), (a.y + b.y), (a.z + b.z), (a.w + b.w)); } + +inline __device__ void operator ^= (uintm &a, const u32 b) { a.x ^= b; a.y ^= b; a.z ^= b; a.w ^= b; } +inline __device__ void operator ^= (uintm &a, const uintm b) { a.x ^= b.x; a.y ^= b.y; a.z ^= b.z; a.w ^= b.w; } + +inline __device__ void operator += (uintm &a, const u32 b) { a.x += b; a.y += b; a.z += b; a.w += b; } +inline __device__ void operator += (uintm &a, const uintm b) { a.x += b.x; a.y += b.y; a.z += b.z; a.w += b.w; } + +__constant__ u32 k_sha256[64] = +{ + SHA256C00, SHA256C01, SHA256C02, SHA256C03, + SHA256C04, SHA256C05, SHA256C06, SHA256C07, + SHA256C08, SHA256C09, SHA256C0a, SHA256C0b, + SHA256C0c, SHA256C0d, SHA256C0e, SHA256C0f, + SHA256C10, SHA256C11, SHA256C12, SHA256C13, + SHA256C14, SHA256C15, SHA256C16, SHA256C17, + SHA256C18, SHA256C19, SHA256C1a, SHA256C1b, + SHA256C1c, SHA256C1d, SHA256C1e, SHA256C1f, + SHA256C20, SHA256C21, SHA256C22, SHA256C23, + SHA256C24, SHA256C25, SHA256C26, SHA256C27, + SHA256C28, SHA256C29, SHA256C2a, SHA256C2b, + SHA256C2c, SHA256C2d, SHA256C2e, SHA256C2f, + SHA256C30, SHA256C31, SHA256C32, SHA256C33, + SHA256C34, SHA256C35, SHA256C36, SHA256C37, + SHA256C38, SHA256C39, SHA256C3a, SHA256C3b, + SHA256C3c, SHA256C3d, SHA256C3e, SHA256C3f, +}; + +__device__ static void sha256_transform (const u32x w0[4], const u32x w1[4], const u32x w2[4], const u32x w3[4], u32x digest[8]) +{ + u32x a = digest[0]; + u32x b = digest[1]; + u32x c = digest[2]; + u32x d = digest[3]; + u32x e = digest[4]; + u32x f = digest[5]; + u32x g = digest[6]; + u32x h = digest[7]; + + u32x w0_t = w0[0]; + u32x w1_t = w0[1]; + u32x w2_t = w0[2]; + u32x w3_t = w0[3]; + u32x w4_t = w1[0]; + u32x w5_t = w1[1]; + u32x w6_t = w1[2]; + u32x w7_t = w1[3]; + u32x w8_t = w2[0]; + u32x w9_t = w2[1]; + u32x wa_t = w2[2]; + u32x wb_t = w2[3]; + u32x wc_t = w3[0]; + u32x wd_t = w3[1]; + u32x we_t = w3[2]; + u32x wf_t = w3[3]; + + #define ROUND_EXPAND() \ + { \ + w0_t = SHA256_EXPAND (we_t, w9_t, w1_t, w0_t); \ + w1_t = SHA256_EXPAND (wf_t, wa_t, w2_t, w1_t); \ + w2_t = SHA256_EXPAND (w0_t, wb_t, w3_t, w2_t); \ + w3_t = SHA256_EXPAND (w1_t, wc_t, w4_t, w3_t); \ + w4_t = SHA256_EXPAND (w2_t, wd_t, w5_t, w4_t); \ + w5_t = SHA256_EXPAND (w3_t, we_t, w6_t, w5_t); \ + w6_t = SHA256_EXPAND (w4_t, wf_t, w7_t, w6_t); \ + w7_t = SHA256_EXPAND (w5_t, w0_t, w8_t, w7_t); \ + w8_t = SHA256_EXPAND (w6_t, w1_t, w9_t, w8_t); \ + w9_t = SHA256_EXPAND (w7_t, w2_t, wa_t, w9_t); \ + wa_t = SHA256_EXPAND (w8_t, w3_t, wb_t, wa_t); \ + wb_t = SHA256_EXPAND (w9_t, w4_t, wc_t, wb_t); \ + wc_t = SHA256_EXPAND (wa_t, w5_t, wd_t, wc_t); \ + wd_t = SHA256_EXPAND (wb_t, w6_t, we_t, wd_t); \ + we_t = SHA256_EXPAND (wc_t, w7_t, wf_t, we_t); \ + wf_t = SHA256_EXPAND (wd_t, w8_t, w0_t, wf_t); \ + } + + #define ROUND_STEP(i) \ + { \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, k_sha256[i + 0]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, k_sha256[i + 1]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, k_sha256[i + 2]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, k_sha256[i + 3]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, k_sha256[i + 4]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, k_sha256[i + 5]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, k_sha256[i + 6]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, k_sha256[i + 7]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, k_sha256[i + 8]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, k_sha256[i + 9]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, k_sha256[i + 10]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, k_sha256[i + 11]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, k_sha256[i + 12]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, k_sha256[i + 13]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, k_sha256[i + 14]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, k_sha256[i + 15]); \ + } + + ROUND_STEP (0); + + for (int i = 16; i < 64; i += 16) + { + ROUND_EXPAND (); ROUND_STEP (i); + } + + digest[0] += a; + digest[1] += b; + digest[2] += c; + digest[3] += d; + digest[4] += e; + digest[5] += f; + digest[6] += g; + digest[7] += h; +} + +__device__ static void hmac_sha256_pad (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], u32x ipad[8], u32x opad[8]) +{ + w0[0] = w0[0] ^ 0x36363636; + w0[1] = w0[1] ^ 0x36363636; + w0[2] = w0[2] ^ 0x36363636; + w0[3] = w0[3] ^ 0x36363636; + w1[0] = w1[0] ^ 0x36363636; + w1[1] = w1[1] ^ 0x36363636; + w1[2] = w1[2] ^ 0x36363636; + w1[3] = w1[3] ^ 0x36363636; + w2[0] = w2[0] ^ 0x36363636; + w2[1] = w2[1] ^ 0x36363636; + w2[2] = w2[2] ^ 0x36363636; + w2[3] = w2[3] ^ 0x36363636; + w3[0] = w3[0] ^ 0x36363636; + w3[1] = w3[1] ^ 0x36363636; + w3[2] = w3[2] ^ 0x36363636; + w3[3] = w3[3] ^ 0x36363636; + + ipad[0] = SHA256M_A; + ipad[1] = SHA256M_B; + ipad[2] = SHA256M_C; + ipad[3] = SHA256M_D; + ipad[4] = SHA256M_E; + ipad[5] = SHA256M_F; + ipad[6] = SHA256M_G; + ipad[7] = SHA256M_H; + + sha256_transform (w0, w1, w2, w3, ipad); + + w0[0] = w0[0] ^ 0x6a6a6a6a; + w0[1] = w0[1] ^ 0x6a6a6a6a; + w0[2] = w0[2] ^ 0x6a6a6a6a; + w0[3] = w0[3] ^ 0x6a6a6a6a; + w1[0] = w1[0] ^ 0x6a6a6a6a; + w1[1] = w1[1] ^ 0x6a6a6a6a; + w1[2] = w1[2] ^ 0x6a6a6a6a; + w1[3] = w1[3] ^ 0x6a6a6a6a; + w2[0] = w2[0] ^ 0x6a6a6a6a; + w2[1] = w2[1] ^ 0x6a6a6a6a; + w2[2] = w2[2] ^ 0x6a6a6a6a; + w2[3] = w2[3] ^ 0x6a6a6a6a; + w3[0] = w3[0] ^ 0x6a6a6a6a; + w3[1] = w3[1] ^ 0x6a6a6a6a; + w3[2] = w3[2] ^ 0x6a6a6a6a; + w3[3] = w3[3] ^ 0x6a6a6a6a; + + opad[0] = SHA256M_A; + opad[1] = SHA256M_B; + opad[2] = SHA256M_C; + opad[3] = SHA256M_D; + opad[4] = SHA256M_E; + opad[5] = SHA256M_F; + opad[6] = SHA256M_G; + opad[7] = SHA256M_H; + + sha256_transform (w0, w1, w2, w3, opad); +} + +__device__ static void hmac_sha256_run (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], u32x ipad[8], u32x opad[8], u32x digest[8]) +{ + digest[0] = ipad[0]; + digest[1] = ipad[1]; + digest[2] = ipad[2]; + digest[3] = ipad[3]; + digest[4] = ipad[4]; + digest[5] = ipad[5]; + digest[6] = ipad[6]; + digest[7] = ipad[7]; + + sha256_transform (w0, w1, w2, w3, digest); + + w0[0] = digest[0]; + w0[1] = digest[1]; + w0[2] = digest[2]; + w0[3] = digest[3]; + w1[0] = digest[4]; + w1[1] = digest[5]; + w1[2] = digest[6]; + w1[3] = digest[7]; + w2[0] = 0x80000000; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = (64 + 32) * 8; + + digest[0] = opad[0]; + digest[1] = opad[1]; + digest[2] = opad[2]; + digest[3] = opad[3]; + digest[4] = opad[4]; + digest[5] = opad[5]; + digest[6] = opad[6]; + digest[7] = opad[7]; + + sha256_transform (w0, w1, w2, w3, digest); +} + +__device__ static void memcat8 (u32x block0[4], u32x block1[4], u32x block2[4], u32x block3[4], const u32 block_len, const u32 append[2]) +{ + switch (block_len) + { + case 0: + block0[0] = append[0]; + block0[1] = append[1]; + break; + + case 1: + block0[0] = block0[0] | append[0] << 8; + block0[1] = append[0] >> 24 | append[1] << 8; + block0[2] = append[1] >> 24; + break; + + case 2: + block0[0] = block0[0] | append[0] << 16; + block0[1] = append[0] >> 16 | append[1] << 16; + block0[2] = append[1] >> 16; + break; + + case 3: + block0[0] = block0[0] | append[0] << 24; + block0[1] = append[0] >> 8 | append[1] << 24; + block0[2] = append[1] >> 8; + break; + + case 4: + block0[1] = append[0]; + block0[2] = append[1]; + break; + + case 5: + block0[1] = block0[1] | append[0] << 8; + block0[2] = append[0] >> 24 | append[1] << 8; + block0[3] = append[1] >> 24; + break; + + case 6: + block0[1] = block0[1] | append[0] << 16; + block0[2] = append[0] >> 16 | append[1] << 16; + block0[3] = append[1] >> 16; + break; + + case 7: + block0[1] = block0[1] | append[0] << 24; + block0[2] = append[0] >> 8 | append[1] << 24; + block0[3] = append[1] >> 8; + break; + + case 8: + block0[2] = append[0]; + block0[3] = append[1]; + break; + + case 9: + block0[2] = block0[2] | append[0] << 8; + block0[3] = append[0] >> 24 | append[1] << 8; + block1[0] = append[1] >> 24; + break; + + case 10: + block0[2] = block0[2] | append[0] << 16; + block0[3] = append[0] >> 16 | append[1] << 16; + block1[0] = append[1] >> 16; + break; + + case 11: + block0[2] = block0[2] | append[0] << 24; + block0[3] = append[0] >> 8 | append[1] << 24; + block1[0] = append[1] >> 8; + break; + + case 12: + block0[3] = append[0]; + block1[0] = append[1]; + break; + + case 13: + block0[3] = block0[3] | append[0] << 8; + block1[0] = append[0] >> 24 | append[1] << 8; + block1[1] = append[1] >> 24; + break; + + case 14: + block0[3] = block0[3] | append[0] << 16; + block1[0] = append[0] >> 16 | append[1] << 16; + block1[1] = append[1] >> 16; + break; + + case 15: + block0[3] = block0[3] | append[0] << 24; + block1[0] = append[0] >> 8 | append[1] << 24; + block1[1] = append[1] >> 8; + break; + + case 16: + block1[0] = append[0]; + block1[1] = append[1]; + break; + + case 17: + block1[0] = block1[0] | append[0] << 8; + block1[1] = append[0] >> 24 | append[1] << 8; + block1[2] = append[1] >> 24; + break; + + case 18: + block1[0] = block1[0] | append[0] << 16; + block1[1] = append[0] >> 16 | append[1] << 16; + block1[2] = append[1] >> 16; + break; + + case 19: + block1[0] = block1[0] | append[0] << 24; + block1[1] = append[0] >> 8 | append[1] << 24; + block1[2] = append[1] >> 8; + break; + + case 20: + block1[1] = append[0]; + block1[2] = append[1]; + break; + + case 21: + block1[1] = block1[1] | append[0] << 8; + block1[2] = append[0] >> 24 | append[1] << 8; + block1[3] = append[1] >> 24; + break; + + case 22: + block1[1] = block1[1] | append[0] << 16; + block1[2] = append[0] >> 16 | append[1] << 16; + block1[3] = append[1] >> 16; + break; + + case 23: + block1[1] = block1[1] | append[0] << 24; + block1[2] = append[0] >> 8 | append[1] << 24; + block1[3] = append[1] >> 8; + break; + + case 24: + block1[2] = append[0]; + block1[3] = append[1]; + break; + + case 25: + block1[2] = block1[2] | append[0] << 8; + block1[3] = append[0] >> 24 | append[1] << 8; + block2[0] = append[1] >> 24; + break; + + case 26: + block1[2] = block1[2] | append[0] << 16; + block1[3] = append[0] >> 16 | append[1] << 16; + block2[0] = append[1] >> 16; + break; + + case 27: + block1[2] = block1[2] | append[0] << 24; + block1[3] = append[0] >> 8 | append[1] << 24; + block2[0] = append[1] >> 8; + break; + + case 28: + block1[3] = append[0]; + block2[0] = append[1]; + break; + + case 29: + block1[3] = block1[3] | append[0] << 8; + block2[0] = append[0] >> 24 | append[1] << 8; + block2[1] = append[1] >> 24; + break; + + case 30: + block1[3] = block1[3] | append[0] << 16; + block2[0] = append[0] >> 16 | append[1] << 16; + block2[1] = append[1] >> 16; + break; + + case 31: + block1[3] = block1[3] | append[0] << 24; + block2[0] = append[0] >> 8 | append[1] << 24; + block2[1] = append[1] >> 8; + break; + + case 32: + block2[0] = append[0]; + block2[1] = append[1]; + break; + + case 33: + block2[0] = block2[0] | append[0] << 8; + block2[1] = append[0] >> 24 | append[1] << 8; + block2[2] = append[1] >> 24; + break; + + case 34: + block2[0] = block2[0] | append[0] << 16; + block2[1] = append[0] >> 16 | append[1] << 16; + block2[2] = append[1] >> 16; + break; + + case 35: + block2[0] = block2[0] | append[0] << 24; + block2[1] = append[0] >> 8 | append[1] << 24; + block2[2] = append[1] >> 8; + break; + + case 36: + block2[1] = append[0]; + block2[2] = append[1]; + break; + + case 37: + block2[1] = block2[1] | append[0] << 8; + block2[2] = append[0] >> 24 | append[1] << 8; + block2[3] = append[1] >> 24; + break; + + case 38: + block2[1] = block2[1] | append[0] << 16; + block2[2] = append[0] >> 16 | append[1] << 16; + block2[3] = append[1] >> 16; + break; + + case 39: + block2[1] = block2[1] | append[0] << 24; + block2[2] = append[0] >> 8 | append[1] << 24; + block2[3] = append[1] >> 8; + break; + + case 40: + block2[2] = append[0]; + block2[3] = append[1]; + break; + + case 41: + block2[2] = block2[2] | append[0] << 8; + block2[3] = append[0] >> 24 | append[1] << 8; + block3[0] = append[1] >> 24; + break; + + case 42: + block2[2] = block2[2] | append[0] << 16; + block2[3] = append[0] >> 16 | append[1] << 16; + block3[0] = append[1] >> 16; + break; + + case 43: + block2[2] = block2[2] | append[0] << 24; + block2[3] = append[0] >> 8 | append[1] << 24; + block3[0] = append[1] >> 8; + break; + + case 44: + block2[3] = append[0]; + block3[0] = append[1]; + break; + + case 45: + block2[3] = block2[3] | append[0] << 8; + block3[0] = append[0] >> 24 | append[1] << 8; + block3[1] = append[1] >> 24; + break; + + case 46: + block2[3] = block2[3] | append[0] << 16; + block3[0] = append[0] >> 16 | append[1] << 16; + block3[1] = append[1] >> 16; + break; + + case 47: + block2[3] = block2[3] | append[0] << 24; + block3[0] = append[0] >> 8 | append[1] << 24; + block3[1] = append[1] >> 8; + break; + + case 48: + block3[0] = append[0]; + block3[1] = append[1]; + break; + + case 49: + block3[0] = block3[0] | append[0] << 8; + block3[1] = append[0] >> 24 | append[1] << 8; + block3[2] = append[1] >> 24; + break; + + case 50: + block3[0] = block3[0] | append[0] << 16; + block3[1] = append[0] >> 16 | append[1] << 16; + block3[2] = append[1] >> 16; + break; + + case 51: + block3[0] = block3[0] | append[0] << 24; + block3[1] = append[0] >> 8 | append[1] << 24; + block3[2] = append[1] >> 8; + break; + + case 52: + block3[1] = append[0]; + block3[2] = append[1]; + break; + + case 53: + block3[1] = block3[1] | append[0] << 8; + block3[2] = append[0] >> 24 | append[1] << 8; + block3[3] = append[1] >> 24; + break; + + case 54: + block3[1] = block3[1] | append[0] << 16; + block3[2] = append[0] >> 16 | append[1] << 16; + block3[3] = append[1] >> 16; + break; + + case 55: + block3[1] = block3[1] | append[0] << 24; + block3[2] = append[0] >> 8 | append[1] << 24; + block3[3] = append[1] >> 8; + break; + + case 56: + block3[2] = append[0]; + block3[3] = append[1]; + break; + } +} + +__device__ static uintm swap_workaround (uintm v) +{ + return __byte_perm (v, 0, 0x0123); +} + +#define GET_SCRYPT_CNT(r,p) (2 * (r) * 16 * (p)) +#define GET_SMIX_CNT(r,N) (2 * (r) * 16 * (N)) +#define GET_STATE_CNT(r) (2 * (r) * 16) + +#define ADD_ROTATE_XOR(r,i1,i2,s) (r) ^= rotate ((i1) + (i2), (s)); + +#define SALSA20_2R() \ +{ \ + ADD_ROTATE_XOR (X1, X0, X3, 7); \ + ADD_ROTATE_XOR (X2, X1, X0, 9); \ + ADD_ROTATE_XOR (X3, X2, X1, 13); \ + ADD_ROTATE_XOR (X0, X3, X2, 18); \ + \ + X1 = uintm (X1.w, X1.x, X1.y, X1.z); \ + X2 = uintm (X2.z, X2.w, X2.x, X2.y); \ + X3 = uintm (X3.y, X3.z, X3.w, X3.x); \ + \ + ADD_ROTATE_XOR (X3, X0, X1, 7); \ + ADD_ROTATE_XOR (X2, X3, X0, 9); \ + ADD_ROTATE_XOR (X1, X2, X3, 13); \ + ADD_ROTATE_XOR (X0, X1, X2, 18); \ + \ + X1 = uintm (X1.y, X1.z, X1.w, X1.x); \ + X2 = uintm (X2.z, X2.w, X2.x, X2.y); \ + X3 = uintm (X3.w, X3.x, X3.y, X3.z); \ +} + +#define SALSA20_8_XOR() \ +{ \ + R0 = R0 ^ Y0; \ + R1 = R1 ^ Y1; \ + R2 = R2 ^ Y2; \ + R3 = R3 ^ Y3; \ + \ + uintm X0 = R0; \ + uintm X1 = R1; \ + uintm X2 = R2; \ + uintm X3 = R3; \ + \ + SALSA20_2R (); \ + SALSA20_2R (); \ + SALSA20_2R (); \ + SALSA20_2R (); \ + \ + R0 = R0 + X0; \ + R1 = R1 + X1; \ + R2 = R2 + X2; \ + R3 = R3 + X3; \ +} + +__device__ static void salsa_r (uintm T[8], const u32 r) +{ + const u32 state_cnt = GET_STATE_CNT (r); + + const u32 state_cnt4 = state_cnt / 4; + + uintm R0 = T[state_cnt4 - 4]; + uintm R1 = T[state_cnt4 - 3]; + uintm R2 = T[state_cnt4 - 2]; + uintm R3 = T[state_cnt4 - 1]; + + for (u32 i = 0; i < state_cnt4; i += 8) + { + uintm Y0; + uintm Y1; + uintm Y2; + uintm Y3; + + Y0 = T[i + 0]; + Y1 = T[i + 1]; + Y2 = T[i + 2]; + Y3 = T[i + 3]; + + SALSA20_8_XOR (); + + T[i + 0] = R0; + T[i + 1] = R1; + T[i + 2] = R2; + T[i + 3] = R3; + + Y0 = T[i + 4]; + Y1 = T[i + 5]; + Y2 = T[i + 6]; + Y3 = T[i + 7]; + + SALSA20_8_XOR (); + + T[i + 4] = R0; + T[i + 5] = R1; + T[i + 6] = R2; + T[i + 7] = R3; + } + + #define exchg(x,y) { const uintm t = T[(x)]; T[(x)] = T[(y)]; T[(y)] = t; } + + #define exchg4(x,y) \ + { \ + const u32 x4 = (x) * 4; \ + const u32 y4 = (y) * 4; \ + \ + exchg (x4 + 0, y4 + 0); \ + exchg (x4 + 1, y4 + 1); \ + exchg (x4 + 2, y4 + 2); \ + exchg (x4 + 3, y4 + 3); \ + } + + for (u32 i = 1; i < r / 1; i++) + { + const u32 x = i * 1; + const u32 y = i * 2; + + exchg4 (x, y); + } + + for (u32 i = 1; i < r / 2; i++) + { + const u32 x = i * 1; + const u32 y = i * 2; + + const u32 xr1 = (r * 2) - 1 - x; + const u32 yr1 = (r * 2) - 1 - y; + + exchg4 (xr1, yr1); + } +} + +__device__ static void scrypt_smix (uintm *X, uintm *T, const u32 N, const u32 r, const u32 tmto, const u32 phy, uintm *V) +{ + const u32 state_cnt = GET_STATE_CNT (r); + + const u32 state_cnt4 = state_cnt / 4; + + #if __CUDA_ARCH__ >= 500 + #define Coord(x,y,z) (((y) * zSIZE) + ((x) * zSIZE * ySIZE) + (z)) + #define CO Coord(x,y,z) + #else + #define Coord(x,y,z) (((x) * zSIZE) + ((y) * zSIZE * xSIZE) + (z)) + #define CO Coord(x,y,z) + #endif + + const u32 xSIZE = phy; + const u32 ySIZE = N / tmto; + const u32 zSIZE = state_cnt4; + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + const u32 x = gid % xSIZE; + + for (u32 i = 0; i < state_cnt4; i += 4) + { + T[0] = uintm (X[i + 0].x, X[i + 1].y, X[i + 2].z, X[i + 3].w); + T[1] = uintm (X[i + 1].x, X[i + 2].y, X[i + 3].z, X[i + 0].w); + T[2] = uintm (X[i + 2].x, X[i + 3].y, X[i + 0].z, X[i + 1].w); + T[3] = uintm (X[i + 3].x, X[i + 0].y, X[i + 1].z, X[i + 2].w); + + X[i + 0] = T[0]; + X[i + 1] = T[1]; + X[i + 2] = T[2]; + X[i + 3] = T[3]; + } + + for (u32 y = 0; y < ySIZE; y++) + { + for (u32 z = 0; z < zSIZE; z++) V[CO] = X[z]; + + for (u32 i = 0; i < tmto; i++) salsa_r (X, r); + } + + for (u32 i = 0; i < N; i++) + { + const u32 k = X[zSIZE - 4].x & (N - 1); + + const u32 y = k / tmto; + + const u32 km = k - (y * tmto); + + for (u32 z = 0; z < zSIZE; z++) T[z] = V[CO]; + + for (u32 i = 0; i < km; i++) salsa_r (T, r); + + for (u32 z = 0; z < zSIZE; z++) X[z] ^= T[z]; + + salsa_r (X, r); + } + + for (u32 i = 0; i < state_cnt4; i += 4) + { + T[0] = uintm (X[i + 0].x, X[i + 3].y, X[i + 2].z, X[i + 1].w); + T[1] = uintm (X[i + 1].x, X[i + 0].y, X[i + 3].z, X[i + 2].w); + T[2] = uintm (X[i + 2].x, X[i + 1].y, X[i + 0].z, X[i + 3].w); + T[3] = uintm (X[i + 3].x, X[i + 2].y, X[i + 1].z, X[i + 0].w); + + X[i + 0] = T[0]; + X[i + 1] = T[1]; + X[i + 2] = T[2]; + X[i + 3] = T[3]; + } +} + +extern "C" __global__ void __launch_bounds__ (64, 1) m08900_init (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, scrypt_tmp_t *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, uintm *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = pws[gid].i[ 8]; + w2[1] = pws[gid].i[ 9]; + w2[2] = pws[gid].i[10]; + w2[3] = pws[gid].i[11]; + + u32x w3[4]; + + w3[0] = pws[gid].i[12]; + w3[1] = pws[gid].i[13]; + w3[2] = pws[gid].i[14]; + w3[3] = pws[gid].i[15]; + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[7]; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + /** + * memory buffers + */ + + const u32 scrypt_r = SCRYPT_R; + const u32 scrypt_p = SCRYPT_P; + //const u32 scrypt_N = SCRYPT_N; + + //const u32 state_cnt = GET_STATE_CNT (scrypt_r); + const u32 scrypt_cnt = GET_SCRYPT_CNT (scrypt_r, scrypt_p); + //const u32 smix_cnt = GET_SMIX_CNT (scrypt_r, scrypt_N); + + /** + * 1st pbkdf2, creates B + */ + + w0[0] = swap_workaround (w0[0]); + w0[1] = swap_workaround (w0[1]); + w0[2] = swap_workaround (w0[2]); + w0[3] = swap_workaround (w0[3]); + w1[0] = swap_workaround (w1[0]); + w1[1] = swap_workaround (w1[1]); + w1[2] = swap_workaround (w1[2]); + w1[3] = swap_workaround (w1[3]); + w2[0] = swap_workaround (w2[0]); + w2[1] = swap_workaround (w2[1]); + w2[2] = swap_workaround (w2[2]); + w2[3] = swap_workaround (w2[3]); + w3[0] = swap_workaround (w3[0]); + w3[1] = swap_workaround (w3[1]); + w3[2] = swap_workaround (w3[2]); + w3[3] = swap_workaround (w3[3]); + + u32 ipad[8]; + u32 opad[8]; + + hmac_sha256_pad (w0, w1, w2, w3, ipad, opad); + + for (u32 i = 0, j = 0, k = 0; i < scrypt_cnt; i += 8, j += 1, k += 2) + { + w0[0] = salt_buf0[0]; + w0[1] = salt_buf0[1]; + w0[2] = salt_buf0[2]; + w0[3] = salt_buf0[3]; + w1[0] = salt_buf1[0]; + w1[1] = salt_buf1[1]; + w1[2] = salt_buf1[2]; + w1[3] = salt_buf1[3]; + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + u32 append[2]; + + append[0] = swap_workaround (j + 1); + append[1] = 0x80; + + memcat8 (w0, w1, w2, w3, salt_len, append); + + w0[0] = swap_workaround (w0[0]); + w0[1] = swap_workaround (w0[1]); + w0[2] = swap_workaround (w0[2]); + w0[3] = swap_workaround (w0[3]); + w1[0] = swap_workaround (w1[0]); + w1[1] = swap_workaround (w1[1]); + w1[2] = swap_workaround (w1[2]); + w1[3] = swap_workaround (w1[3]); + w2[0] = swap_workaround (w2[0]); + w2[1] = swap_workaround (w2[1]); + w2[2] = swap_workaround (w2[2]); + w2[3] = swap_workaround (w2[3]); + w3[0] = swap_workaround (w3[0]); + w3[1] = swap_workaround (w3[1]); + w3[2] = 0; + w3[3] = (64 + salt_len + 4) * 8; + + u32x digest[8]; + + hmac_sha256_run (w0, w1, w2, w3, ipad, opad, digest); + + const uintm tmp0 = uintm (digest[0], digest[1], digest[2], digest[3]); + const uintm tmp1 = uintm (digest[4], digest[5], digest[6], digest[7]); + + __syncthreads (); + + tmps[gid].P[k + 0] = tmp0; + tmps[gid].P[k + 1] = tmp1; + } +} + +extern "C" __global__ void __launch_bounds__ (64, 1) m08900_loop (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, scrypt_tmp_t *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, uintm *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + const u32 scrypt_phy = salt_bufs[salt_pos].scrypt_phy; + + const u32 state_cnt = GET_STATE_CNT (SCRYPT_R); + const u32 scrypt_cnt = GET_SCRYPT_CNT (SCRYPT_R, SCRYPT_P); + + const u32 state_cnt4 = state_cnt / 4; + const u32 scrypt_cnt4 = scrypt_cnt / 4; + + uintm X[state_cnt4]; + uintm T[state_cnt4]; + + for (int z = 0; z < state_cnt4; z++) X[z] = swap_workaround (tmps[gid].P[z]); + + scrypt_smix (X, T, SCRYPT_N, SCRYPT_R, SCRYPT_TMTO, scrypt_phy, d_scryptV_buf); + + for (int z = 0; z < state_cnt4; z++) tmps[gid].P[z] = swap_workaround (X[z]); + + #if SCRYPT_P >= 1 + for (int i = state_cnt4; i < scrypt_cnt4; i += state_cnt4) + { + for (int z = 0; z < state_cnt4; z++) X[z] = swap_workaround (tmps[gid].P[i + z]); + + scrypt_smix (X, T, SCRYPT_N, SCRYPT_R, SCRYPT_TMTO, scrypt_phy, d_scryptV_buf); + + for (int z = 0; z < state_cnt4; z++) tmps[gid].P[i + z] = swap_workaround (X[z]); + } + #endif +} + +extern "C" __global__ void __launch_bounds__ (64, 1) m08900_comp (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, scrypt_tmp_t *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, uintm *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x;; + const u32 lid = threadIdx.x; + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = pws[gid].i[ 8]; + w2[1] = pws[gid].i[ 9]; + w2[2] = pws[gid].i[10]; + w2[3] = pws[gid].i[11]; + + u32x w3[4]; + + w3[0] = pws[gid].i[12]; + w3[1] = pws[gid].i[13]; + w3[2] = pws[gid].i[14]; + w3[3] = pws[gid].i[15]; + + /** + * memory buffers + */ + + const u32 scrypt_r = SCRYPT_R; + const u32 scrypt_p = SCRYPT_P; + + const u32 scrypt_cnt = GET_SCRYPT_CNT (scrypt_r, scrypt_p); + + const u32 scrypt_cnt4 = scrypt_cnt / 4; + + /** + * 2nd pbkdf2, creates B + */ + + w0[0] = swap_workaround (w0[0]); + w0[1] = swap_workaround (w0[1]); + w0[2] = swap_workaround (w0[2]); + w0[3] = swap_workaround (w0[3]); + w1[0] = swap_workaround (w1[0]); + w1[1] = swap_workaround (w1[1]); + w1[2] = swap_workaround (w1[2]); + w1[3] = swap_workaround (w1[3]); + w2[0] = swap_workaround (w2[0]); + w2[1] = swap_workaround (w2[1]); + w2[2] = swap_workaround (w2[2]); + w2[3] = swap_workaround (w2[3]); + w3[0] = swap_workaround (w3[0]); + w3[1] = swap_workaround (w3[1]); + w3[2] = swap_workaround (w3[2]); + w3[3] = swap_workaround (w3[3]); + + u32 ipad[8]; + u32 opad[8]; + + hmac_sha256_pad (w0, w1, w2, w3, ipad, opad); + + for (u32 l = 0; l < scrypt_cnt4; l += 4) + { + __syncthreads (); + + uintm tmp; + + tmp = tmps[gid].P[l + 0]; + + w0[0] = tmp.x; + w0[1] = tmp.y; + w0[2] = tmp.z; + w0[3] = tmp.w; + + tmp = tmps[gid].P[l + 1]; + + w1[0] = tmp.x; + w1[1] = tmp.y; + w1[2] = tmp.z; + w1[3] = tmp.w; + + tmp = tmps[gid].P[l + 2]; + + w2[0] = tmp.x; + w2[1] = tmp.y; + w2[2] = tmp.z; + w2[3] = tmp.w; + + tmp = tmps[gid].P[l + 3]; + + w3[0] = tmp.x; + w3[1] = tmp.y; + w3[2] = tmp.z; + w3[3] = tmp.w; + + sha256_transform (w0, w1, w2, w3, ipad); + } + + w0[0] = 0x00000001; + w0[1] = 0x80000000; + w0[2] = 0; + w0[3] = 0; + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = (64 + (scrypt_cnt * 4) + 4) * 8; + + u32x digest[8]; + + hmac_sha256_run (w0, w1, w2, w3, ipad, opad, digest); + + const u32x r0 = swap_workaround (digest[DGST_R0]); + const u32x r1 = swap_workaround (digest[DGST_R1]); + const u32x r2 = swap_workaround (digest[DGST_R2]); + const u32x r3 = swap_workaround (digest[DGST_R3]); + + #define il_pos 0 + + #include VECT_COMPARE_M +} diff --git a/nv/m09000.cu b/nv/m09000.cu new file mode 100644 index 0000000000..9a4a2a1b85 --- /dev/null +++ b/nv/m09000.cu @@ -0,0 +1,821 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _PSAFE2_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW2 +#define VECT_SIZE1 +#endif + +#define DGST_R0 0 +#define DGST_R1 1 +#define DGST_R2 2 +#define DGST_R3 3 + +#include "include/kernel_functions.c" +#include "types_nv.c" +#include "common_nv.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +// http://www.schneier.com/code/constants.txt + +__device__ __constant__ u32 c_sbox0[256] = +{ + 0xd1310ba6, 0x98dfb5ac, 0x2ffd72db, 0xd01adfb7, + 0xb8e1afed, 0x6a267e96, 0xba7c9045, 0xf12c7f99, + 0x24a19947, 0xb3916cf7, 0x0801f2e2, 0x858efc16, + 0x636920d8, 0x71574e69, 0xa458fea3, 0xf4933d7e, + 0x0d95748f, 0x728eb658, 0x718bcd58, 0x82154aee, + 0x7b54a41d, 0xc25a59b5, 0x9c30d539, 0x2af26013, + 0xc5d1b023, 0x286085f0, 0xca417918, 0xb8db38ef, + 0x8e79dcb0, 0x603a180e, 0x6c9e0e8b, 0xb01e8a3e, + 0xd71577c1, 0xbd314b27, 0x78af2fda, 0x55605c60, + 0xe65525f3, 0xaa55ab94, 0x57489862, 0x63e81440, + 0x55ca396a, 0x2aab10b6, 0xb4cc5c34, 0x1141e8ce, + 0xa15486af, 0x7c72e993, 0xb3ee1411, 0x636fbc2a, + 0x2ba9c55d, 0x741831f6, 0xce5c3e16, 0x9b87931e, + 0xafd6ba33, 0x6c24cf5c, 0x7a325381, 0x28958677, + 0x3b8f4898, 0x6b4bb9af, 0xc4bfe81b, 0x66282193, + 0x61d809cc, 0xfb21a991, 0x487cac60, 0x5dec8032, + 0xef845d5d, 0xe98575b1, 0xdc262302, 0xeb651b88, + 0x23893e81, 0xd396acc5, 0x0f6d6ff3, 0x83f44239, + 0x2e0b4482, 0xa4842004, 0x69c8f04a, 0x9e1f9b5e, + 0x21c66842, 0xf6e96c9a, 0x670c9c61, 0xabd388f0, + 0x6a51a0d2, 0xd8542f68, 0x960fa728, 0xab5133a3, + 0x6eef0b6c, 0x137a3be4, 0xba3bf050, 0x7efb2a98, + 0xa1f1651d, 0x39af0176, 0x66ca593e, 0x82430e88, + 0x8cee8619, 0x456f9fb4, 0x7d84a5c3, 0x3b8b5ebe, + 0xe06f75d8, 0x85c12073, 0x401a449f, 0x56c16aa6, + 0x4ed3aa62, 0x363f7706, 0x1bfedf72, 0x429b023d, + 0x37d0d724, 0xd00a1248, 0xdb0fead3, 0x49f1c09b, + 0x075372c9, 0x80991b7b, 0x25d479d8, 0xf6e8def7, + 0xe3fe501a, 0xb6794c3b, 0x976ce0bd, 0x04c006ba, + 0xc1a94fb6, 0x409f60c4, 0x5e5c9ec2, 0x196a2463, + 0x68fb6faf, 0x3e6c53b5, 0x1339b2eb, 0x3b52ec6f, + 0x6dfc511f, 0x9b30952c, 0xcc814544, 0xaf5ebd09, + 0xbee3d004, 0xde334afd, 0x660f2807, 0x192e4bb3, + 0xc0cba857, 0x45c8740f, 0xd20b5f39, 0xb9d3fbdb, + 0x5579c0bd, 0x1a60320a, 0xd6a100c6, 0x402c7279, + 0x679f25fe, 0xfb1fa3cc, 0x8ea5e9f8, 0xdb3222f8, + 0x3c7516df, 0xfd616b15, 0x2f501ec8, 0xad0552ab, + 0x323db5fa, 0xfd238760, 0x53317b48, 0x3e00df82, + 0x9e5c57bb, 0xca6f8ca0, 0x1a87562e, 0xdf1769db, + 0xd542a8f6, 0x287effc3, 0xac6732c6, 0x8c4f5573, + 0x695b27b0, 0xbbca58c8, 0xe1ffa35d, 0xb8f011a0, + 0x10fa3d98, 0xfd2183b8, 0x4afcb56c, 0x2dd1d35b, + 0x9a53e479, 0xb6f84565, 0xd28e49bc, 0x4bfb9790, + 0xe1ddf2da, 0xa4cb7e33, 0x62fb1341, 0xcee4c6e8, + 0xef20cada, 0x36774c01, 0xd07e9efe, 0x2bf11fb4, + 0x95dbda4d, 0xae909198, 0xeaad8e71, 0x6b93d5a0, + 0xd08ed1d0, 0xafc725e0, 0x8e3c5b2f, 0x8e7594b7, + 0x8ff6e2fb, 0xf2122b64, 0x8888b812, 0x900df01c, + 0x4fad5ea0, 0x688fc31c, 0xd1cff191, 0xb3a8c1ad, + 0x2f2f2218, 0xbe0e1777, 0xea752dfe, 0x8b021fa1, + 0xe5a0cc0f, 0xb56f74e8, 0x18acf3d6, 0xce89e299, + 0xb4a84fe0, 0xfd13e0b7, 0x7cc43b81, 0xd2ada8d9, + 0x165fa266, 0x80957705, 0x93cc7314, 0x211a1477, + 0xe6ad2065, 0x77b5fa86, 0xc75442f5, 0xfb9d35cf, + 0xebcdaf0c, 0x7b3e89a0, 0xd6411bd3, 0xae1e7e49, + 0x00250e2d, 0x2071b35e, 0x226800bb, 0x57b8e0af, + 0x2464369b, 0xf009b91e, 0x5563911d, 0x59dfa6aa, + 0x78c14389, 0xd95a537f, 0x207d5ba2, 0x02e5b9c5, + 0x83260376, 0x6295cfa9, 0x11c81968, 0x4e734a41, + 0xb3472dca, 0x7b14a94a, 0x1b510052, 0x9a532915, + 0xd60f573f, 0xbc9bc6e4, 0x2b60a476, 0x81e67400, + 0x08ba6fb5, 0x571be91f, 0xf296ec6b, 0x2a0dd915, + 0xb6636521, 0xe7b9f9b6, 0xff34052e, 0xc5855664, + 0x53b02d5d, 0xa99f8fa1, 0x08ba4799, 0x6e85076a +}; + +__device__ __constant__ u32 c_sbox1[256] = +{ + 0x4b7a70e9, 0xb5b32944, 0xdb75092e, 0xc4192623, + 0xad6ea6b0, 0x49a7df7d, 0x9cee60b8, 0x8fedb266, + 0xecaa8c71, 0x699a17ff, 0x5664526c, 0xc2b19ee1, + 0x193602a5, 0x75094c29, 0xa0591340, 0xe4183a3e, + 0x3f54989a, 0x5b429d65, 0x6b8fe4d6, 0x99f73fd6, + 0xa1d29c07, 0xefe830f5, 0x4d2d38e6, 0xf0255dc1, + 0x4cdd2086, 0x8470eb26, 0x6382e9c6, 0x021ecc5e, + 0x09686b3f, 0x3ebaefc9, 0x3c971814, 0x6b6a70a1, + 0x687f3584, 0x52a0e286, 0xb79c5305, 0xaa500737, + 0x3e07841c, 0x7fdeae5c, 0x8e7d44ec, 0x5716f2b8, + 0xb03ada37, 0xf0500c0d, 0xf01c1f04, 0x0200b3ff, + 0xae0cf51a, 0x3cb574b2, 0x25837a58, 0xdc0921bd, + 0xd19113f9, 0x7ca92ff6, 0x94324773, 0x22f54701, + 0x3ae5e581, 0x37c2dadc, 0xc8b57634, 0x9af3dda7, + 0xa9446146, 0x0fd0030e, 0xecc8c73e, 0xa4751e41, + 0xe238cd99, 0x3bea0e2f, 0x3280bba1, 0x183eb331, + 0x4e548b38, 0x4f6db908, 0x6f420d03, 0xf60a04bf, + 0x2cb81290, 0x24977c79, 0x5679b072, 0xbcaf89af, + 0xde9a771f, 0xd9930810, 0xb38bae12, 0xdccf3f2e, + 0x5512721f, 0x2e6b7124, 0x501adde6, 0x9f84cd87, + 0x7a584718, 0x7408da17, 0xbc9f9abc, 0xe94b7d8c, + 0xec7aec3a, 0xdb851dfa, 0x63094366, 0xc464c3d2, + 0xef1c1847, 0x3215d908, 0xdd433b37, 0x24c2ba16, + 0x12a14d43, 0x2a65c451, 0x50940002, 0x133ae4dd, + 0x71dff89e, 0x10314e55, 0x81ac77d6, 0x5f11199b, + 0x043556f1, 0xd7a3c76b, 0x3c11183b, 0x5924a509, + 0xf28fe6ed, 0x97f1fbfa, 0x9ebabf2c, 0x1e153c6e, + 0x86e34570, 0xeae96fb1, 0x860e5e0a, 0x5a3e2ab3, + 0x771fe71c, 0x4e3d06fa, 0x2965dcb9, 0x99e71d0f, + 0x803e89d6, 0x5266c825, 0x2e4cc978, 0x9c10b36a, + 0xc6150eba, 0x94e2ea78, 0xa5fc3c53, 0x1e0a2df4, + 0xf2f74ea7, 0x361d2b3d, 0x1939260f, 0x19c27960, + 0x5223a708, 0xf71312b6, 0xebadfe6e, 0xeac31f66, + 0xe3bc4595, 0xa67bc883, 0xb17f37d1, 0x018cff28, + 0xc332ddef, 0xbe6c5aa5, 0x65582185, 0x68ab9802, + 0xeecea50f, 0xdb2f953b, 0x2aef7dad, 0x5b6e2f84, + 0x1521b628, 0x29076170, 0xecdd4775, 0x619f1510, + 0x13cca830, 0xeb61bd96, 0x0334fe1e, 0xaa0363cf, + 0xb5735c90, 0x4c70a239, 0xd59e9e0b, 0xcbaade14, + 0xeecc86bc, 0x60622ca7, 0x9cab5cab, 0xb2f3846e, + 0x648b1eaf, 0x19bdf0ca, 0xa02369b9, 0x655abb50, + 0x40685a32, 0x3c2ab4b3, 0x319ee9d5, 0xc021b8f7, + 0x9b540b19, 0x875fa099, 0x95f7997e, 0x623d7da8, + 0xf837889a, 0x97e32d77, 0x11ed935f, 0x16681281, + 0x0e358829, 0xc7e61fd6, 0x96dedfa1, 0x7858ba99, + 0x57f584a5, 0x1b227263, 0x9b83c3ff, 0x1ac24696, + 0xcdb30aeb, 0x532e3054, 0x8fd948e4, 0x6dbc3128, + 0x58ebf2ef, 0x34c6ffea, 0xfe28ed61, 0xee7c3c73, + 0x5d4a14d9, 0xe864b7e3, 0x42105d14, 0x203e13e0, + 0x45eee2b6, 0xa3aaabea, 0xdb6c4f15, 0xfacb4fd0, + 0xc742f442, 0xef6abbb5, 0x654f3b1d, 0x41cd2105, + 0xd81e799e, 0x86854dc7, 0xe44b476a, 0x3d816250, + 0xcf62a1f2, 0x5b8d2646, 0xfc8883a0, 0xc1c7b6a3, + 0x7f1524c3, 0x69cb7492, 0x47848a0b, 0x5692b285, + 0x095bbf00, 0xad19489d, 0x1462b174, 0x23820e00, + 0x58428d2a, 0x0c55f5ea, 0x1dadf43e, 0x233f7061, + 0x3372f092, 0x8d937e41, 0xd65fecf1, 0x6c223bdb, + 0x7cde3759, 0xcbee7460, 0x4085f2a7, 0xce77326e, + 0xa6078084, 0x19f8509e, 0xe8efd855, 0x61d99735, + 0xa969a7aa, 0xc50c06c2, 0x5a04abfc, 0x800bcadc, + 0x9e447a2e, 0xc3453484, 0xfdd56705, 0x0e1e9ec9, + 0xdb73dbd3, 0x105588cd, 0x675fda79, 0xe3674340, + 0xc5c43465, 0x713e38d8, 0x3d28f89e, 0xf16dff20, + 0x153e21e7, 0x8fb03d4a, 0xe6e39f2b, 0xdb83adf7 +}; + +__device__ __constant__ u32 c_sbox2[256] = +{ + 0xe93d5a68, 0x948140f7, 0xf64c261c, 0x94692934, + 0x411520f7, 0x7602d4f7, 0xbcf46b2e, 0xd4a20068, + 0xd4082471, 0x3320f46a, 0x43b7d4b7, 0x500061af, + 0x1e39f62e, 0x97244546, 0x14214f74, 0xbf8b8840, + 0x4d95fc1d, 0x96b591af, 0x70f4ddd3, 0x66a02f45, + 0xbfbc09ec, 0x03bd9785, 0x7fac6dd0, 0x31cb8504, + 0x96eb27b3, 0x55fd3941, 0xda2547e6, 0xabca0a9a, + 0x28507825, 0x530429f4, 0x0a2c86da, 0xe9b66dfb, + 0x68dc1462, 0xd7486900, 0x680ec0a4, 0x27a18dee, + 0x4f3ffea2, 0xe887ad8c, 0xb58ce006, 0x7af4d6b6, + 0xaace1e7c, 0xd3375fec, 0xce78a399, 0x406b2a42, + 0x20fe9e35, 0xd9f385b9, 0xee39d7ab, 0x3b124e8b, + 0x1dc9faf7, 0x4b6d1856, 0x26a36631, 0xeae397b2, + 0x3a6efa74, 0xdd5b4332, 0x6841e7f7, 0xca7820fb, + 0xfb0af54e, 0xd8feb397, 0x454056ac, 0xba489527, + 0x55533a3a, 0x20838d87, 0xfe6ba9b7, 0xd096954b, + 0x55a867bc, 0xa1159a58, 0xcca92963, 0x99e1db33, + 0xa62a4a56, 0x3f3125f9, 0x5ef47e1c, 0x9029317c, + 0xfdf8e802, 0x04272f70, 0x80bb155c, 0x05282ce3, + 0x95c11548, 0xe4c66d22, 0x48c1133f, 0xc70f86dc, + 0x07f9c9ee, 0x41041f0f, 0x404779a4, 0x5d886e17, + 0x325f51eb, 0xd59bc0d1, 0xf2bcc18f, 0x41113564, + 0x257b7834, 0x602a9c60, 0xdff8e8a3, 0x1f636c1b, + 0x0e12b4c2, 0x02e1329e, 0xaf664fd1, 0xcad18115, + 0x6b2395e0, 0x333e92e1, 0x3b240b62, 0xeebeb922, + 0x85b2a20e, 0xe6ba0d99, 0xde720c8c, 0x2da2f728, + 0xd0127845, 0x95b794fd, 0x647d0862, 0xe7ccf5f0, + 0x5449a36f, 0x877d48fa, 0xc39dfd27, 0xf33e8d1e, + 0x0a476341, 0x992eff74, 0x3a6f6eab, 0xf4f8fd37, + 0xa812dc60, 0xa1ebddf8, 0x991be14c, 0xdb6e6b0d, + 0xc67b5510, 0x6d672c37, 0x2765d43b, 0xdcd0e804, + 0xf1290dc7, 0xcc00ffa3, 0xb5390f92, 0x690fed0b, + 0x667b9ffb, 0xcedb7d9c, 0xa091cf0b, 0xd9155ea3, + 0xbb132f88, 0x515bad24, 0x7b9479bf, 0x763bd6eb, + 0x37392eb3, 0xcc115979, 0x8026e297, 0xf42e312d, + 0x6842ada7, 0xc66a2b3b, 0x12754ccc, 0x782ef11c, + 0x6a124237, 0xb79251e7, 0x06a1bbe6, 0x4bfb6350, + 0x1a6b1018, 0x11caedfa, 0x3d25bdd8, 0xe2e1c3c9, + 0x44421659, 0x0a121386, 0xd90cec6e, 0xd5abea2a, + 0x64af674e, 0xda86a85f, 0xbebfe988, 0x64e4c3fe, + 0x9dbc8057, 0xf0f7c086, 0x60787bf8, 0x6003604d, + 0xd1fd8346, 0xf6381fb0, 0x7745ae04, 0xd736fccc, + 0x83426b33, 0xf01eab71, 0xb0804187, 0x3c005e5f, + 0x77a057be, 0xbde8ae24, 0x55464299, 0xbf582e61, + 0x4e58f48f, 0xf2ddfda2, 0xf474ef38, 0x8789bdc2, + 0x5366f9c3, 0xc8b38e74, 0xb475f255, 0x46fcd9b9, + 0x7aeb2661, 0x8b1ddf84, 0x846a0e79, 0x915f95e2, + 0x466e598e, 0x20b45770, 0x8cd55591, 0xc902de4c, + 0xb90bace1, 0xbb8205d0, 0x11a86248, 0x7574a99e, + 0xb77f19b6, 0xe0a9dc09, 0x662d09a1, 0xc4324633, + 0xe85a1f02, 0x09f0be8c, 0x4a99a025, 0x1d6efe10, + 0x1ab93d1d, 0x0ba5a4df, 0xa186f20f, 0x2868f169, + 0xdcb7da83, 0x573906fe, 0xa1e2ce9b, 0x4fcd7f52, + 0x50115e01, 0xa70683fa, 0xa002b5c4, 0x0de6d027, + 0x9af88c27, 0x773f8641, 0xc3604c06, 0x61a806b5, + 0xf0177a28, 0xc0f586e0, 0x006058aa, 0x30dc7d62, + 0x11e69ed7, 0x2338ea63, 0x53c2dd94, 0xc2c21634, + 0xbbcbee56, 0x90bcb6de, 0xebfc7da1, 0xce591d76, + 0x6f05e409, 0x4b7c0188, 0x39720a3d, 0x7c927c24, + 0x86e3725f, 0x724d9db9, 0x1ac15bb4, 0xd39eb8fc, + 0xed545578, 0x08fca5b5, 0xd83d7cd3, 0x4dad0fc4, + 0x1e50ef5e, 0xb161e6f8, 0xa28514d9, 0x6c51133c, + 0x6fd5c7e7, 0x56e14ec4, 0x362abfce, 0xddc6c837, + 0xd79a3234, 0x92638212, 0x670efa8e, 0x406000e0 +}; + +__device__ __constant__ u32 c_sbox3[256] = +{ + 0x3a39ce37, 0xd3faf5cf, 0xabc27737, 0x5ac52d1b, + 0x5cb0679e, 0x4fa33742, 0xd3822740, 0x99bc9bbe, + 0xd5118e9d, 0xbf0f7315, 0xd62d1c7e, 0xc700c47b, + 0xb78c1b6b, 0x21a19045, 0xb26eb1be, 0x6a366eb4, + 0x5748ab2f, 0xbc946e79, 0xc6a376d2, 0x6549c2c8, + 0x530ff8ee, 0x468dde7d, 0xd5730a1d, 0x4cd04dc6, + 0x2939bbdb, 0xa9ba4650, 0xac9526e8, 0xbe5ee304, + 0xa1fad5f0, 0x6a2d519a, 0x63ef8ce2, 0x9a86ee22, + 0xc089c2b8, 0x43242ef6, 0xa51e03aa, 0x9cf2d0a4, + 0x83c061ba, 0x9be96a4d, 0x8fe51550, 0xba645bd6, + 0x2826a2f9, 0xa73a3ae1, 0x4ba99586, 0xef5562e9, + 0xc72fefd3, 0xf752f7da, 0x3f046f69, 0x77fa0a59, + 0x80e4a915, 0x87b08601, 0x9b09e6ad, 0x3b3ee593, + 0xe990fd5a, 0x9e34d797, 0x2cf0b7d9, 0x022b8b51, + 0x96d5ac3a, 0x017da67d, 0xd1cf3ed6, 0x7c7d2d28, + 0x1f9f25cf, 0xadf2b89b, 0x5ad6b472, 0x5a88f54c, + 0xe029ac71, 0xe019a5e6, 0x47b0acfd, 0xed93fa9b, + 0xe8d3c48d, 0x283b57cc, 0xf8d56629, 0x79132e28, + 0x785f0191, 0xed756055, 0xf7960e44, 0xe3d35e8c, + 0x15056dd4, 0x88f46dba, 0x03a16125, 0x0564f0bd, + 0xc3eb9e15, 0x3c9057a2, 0x97271aec, 0xa93a072a, + 0x1b3f6d9b, 0x1e6321f5, 0xf59c66fb, 0x26dcf319, + 0x7533d928, 0xb155fdf5, 0x03563482, 0x8aba3cbb, + 0x28517711, 0xc20ad9f8, 0xabcc5167, 0xccad925f, + 0x4de81751, 0x3830dc8e, 0x379d5862, 0x9320f991, + 0xea7a90c2, 0xfb3e7bce, 0x5121ce64, 0x774fbe32, + 0xa8b6e37e, 0xc3293d46, 0x48de5369, 0x6413e680, + 0xa2ae0810, 0xdd6db224, 0x69852dfd, 0x09072166, + 0xb39a460a, 0x6445c0dd, 0x586cdecf, 0x1c20c8ae, + 0x5bbef7dd, 0x1b588d40, 0xccd2017f, 0x6bb4e3bb, + 0xdda26a7e, 0x3a59ff45, 0x3e350a44, 0xbcb4cdd5, + 0x72eacea8, 0xfa6484bb, 0x8d6612ae, 0xbf3c6f47, + 0xd29be463, 0x542f5d9e, 0xaec2771b, 0xf64e6370, + 0x740e0d8d, 0xe75b1357, 0xf8721671, 0xaf537d5d, + 0x4040cb08, 0x4eb4e2cc, 0x34d2466a, 0x0115af84, + 0xe1b00428, 0x95983a1d, 0x06b89fb4, 0xce6ea048, + 0x6f3f3b82, 0x3520ab82, 0x011a1d4b, 0x277227f8, + 0x611560b1, 0xe7933fdc, 0xbb3a792b, 0x344525bd, + 0xa08839e1, 0x51ce794b, 0x2f32c9b7, 0xa01fbac9, + 0xe01cc87e, 0xbcc7d1f6, 0xcf0111c3, 0xa1e8aac7, + 0x1a908749, 0xd44fbd9a, 0xd0dadecb, 0xd50ada38, + 0x0339c32a, 0xc6913667, 0x8df9317c, 0xe0b12b4f, + 0xf79e59b7, 0x43f5bb3a, 0xf2d519ff, 0x27d9459c, + 0xbf97222c, 0x15e6fc2a, 0x0f91fc71, 0x9b941525, + 0xfae59361, 0xceb69ceb, 0xc2a86459, 0x12baa8d1, + 0xb6c1075e, 0xe3056a0c, 0x10d25065, 0xcb03a442, + 0xe0ec6e0e, 0x1698db3b, 0x4c98a0be, 0x3278e964, + 0x9f1f9532, 0xe0d392df, 0xd3a0342b, 0x8971f21e, + 0x1b0a7441, 0x4ba3348c, 0xc5be7120, 0xc37632d8, + 0xdf359f8d, 0x9b992f2e, 0xe60b6f47, 0x0fe3f11d, + 0xe54cda54, 0x1edad891, 0xce6279cf, 0xcd3e7e6f, + 0x1618b166, 0xfd2c1d05, 0x848fd2c5, 0xf6fb2299, + 0xf523f357, 0xa6327623, 0x93a83531, 0x56cccd02, + 0xacf08162, 0x5a75ebb5, 0x6e163697, 0x88d273cc, + 0xde966292, 0x81b949d0, 0x4c50901b, 0x71c65614, + 0xe6c6c7bd, 0x327a140a, 0x45e1d006, 0xc3f27b9a, + 0xc9aa53fd, 0x62a80f00, 0xbb25bfe2, 0x35bdd2f6, + 0x71126905, 0xb2040222, 0xb6cbcf7c, 0xcd769c2b, + 0x53113ec0, 0x1640e3d3, 0x38abbd60, 0x2547adf0, + 0xba38209c, 0xf746ce76, 0x77afa1c5, 0x20756060, + 0x85cbfe4e, 0x8ae88dd8, 0x7aaaf9b0, 0x4cf9aa7e, + 0x1948c25c, 0x02fb8a8c, 0x01c36ae4, 0xd6ebe1f9, + 0x90d4f869, 0xa65cdea0, 0x3f09252d, 0xc208e69f, + 0xb74e6132, 0xce77e25b, 0x578fdfe3, 0x3ac372e6 +}; + +__device__ __constant__ u32 c_pbox[18] = +{ + 0x243f6a88, 0x85a308d3, 0x13198a2e, 0x03707344, + 0xa4093822, 0x299f31d0, 0x082efa98, 0xec4e6c89, + 0x452821e6, 0x38d01377, 0xbe5466cf, 0x34e90c6c, + 0xc0ac29b7, 0xc97c50dd, 0x3f84d5b5, 0xb5470917, + 0x9216d5d9, 0x8979fb1b +}; + +#define BF_ROUND(L,R,N) \ +{ \ + u32x tmp; \ + \ + tmp = S0[((L) >> 24) & 0xff]; \ + tmp += S1[((L) >> 16) & 0xff]; \ + tmp ^= S2[((L) >> 8) & 0xff]; \ + tmp += S3[((L) >> 0) & 0xff]; \ + \ + (R) ^= tmp ^ P[(N)]; \ +} + +#define BF_ENCRYPT(L,R) \ +{ \ + u32x tmp; \ + \ + L ^= P[0]; \ + BF_ROUND (L, R, 1); \ + BF_ROUND (R, L, 2); \ + BF_ROUND (L, R, 3); \ + BF_ROUND (R, L, 4); \ + BF_ROUND (L, R, 5); \ + BF_ROUND (R, L, 6); \ + BF_ROUND (L, R, 7); \ + BF_ROUND (R, L, 8); \ + BF_ROUND (L, R, 9); \ + BF_ROUND (R, L, 10); \ + BF_ROUND (L, R, 11); \ + BF_ROUND (R, L, 12); \ + BF_ROUND (L, R, 13); \ + BF_ROUND (R, L, 14); \ + BF_ROUND (L, R, 15); \ + BF_ROUND (R, L, 16); \ + tmp = R; \ + R = L; \ + L = tmp ^ P[17]; \ +} + +__device__ static void sha1_transform (const u32x w0[4], const u32x w1[4], const u32x w2[4], const u32x w3[4], u32x digest[5]) +{ + u32x A = digest[0]; + u32x B = digest[1]; + u32x C = digest[2]; + u32x D = digest[3]; + u32x E = digest[4]; + + u32x w0_t = w0[0]; + u32x w1_t = w0[1]; + u32x w2_t = w0[2]; + u32x w3_t = w0[3]; + u32x w4_t = w1[0]; + u32x w5_t = w1[1]; + u32x w6_t = w1[2]; + u32x w7_t = w1[3]; + u32x w8_t = w2[0]; + u32x w9_t = w2[1]; + u32x wa_t = w2[2]; + u32x wb_t = w2[3]; + u32x wc_t = w3[0]; + u32x wd_t = w3[1]; + u32x we_t = w3[2]; + u32x wf_t = w3[3]; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, A, B, C, D, E, w0_t); + SHA1_STEP (SHA1_F0o, E, A, B, C, D, w1_t); + SHA1_STEP (SHA1_F0o, D, E, A, B, C, w2_t); + SHA1_STEP (SHA1_F0o, C, D, E, A, B, w3_t); + SHA1_STEP (SHA1_F0o, B, C, D, E, A, w4_t); + SHA1_STEP (SHA1_F0o, A, B, C, D, E, w5_t); + SHA1_STEP (SHA1_F0o, E, A, B, C, D, w6_t); + SHA1_STEP (SHA1_F0o, D, E, A, B, C, w7_t); + SHA1_STEP (SHA1_F0o, C, D, E, A, B, w8_t); + SHA1_STEP (SHA1_F0o, B, C, D, E, A, w9_t); + SHA1_STEP (SHA1_F0o, A, B, C, D, E, wa_t); + SHA1_STEP (SHA1_F0o, E, A, B, C, D, wb_t); + SHA1_STEP (SHA1_F0o, D, E, A, B, C, wc_t); + SHA1_STEP (SHA1_F0o, C, D, E, A, B, wd_t); + SHA1_STEP (SHA1_F0o, B, C, D, E, A, we_t); + SHA1_STEP (SHA1_F0o, A, B, C, D, E, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F0o, E, A, B, C, D, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F0o, D, E, A, B, C, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F0o, C, D, E, A, B, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F0o, B, C, D, E, A, w3_t); + + #undef K + #define K SHA1C01 + + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w7_t); + + #undef K + #define K SHA1C02 + + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, wb_t); + + #undef K + #define K SHA1C03 + + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, wf_t); + + digest[0] += A; + digest[1] += B; + digest[2] += C; + digest[3] += D; + digest[4] += E; +} + +extern "C" __global__ void __launch_bounds__ (8, 1) m09000_init (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, pwsafe2_tmp_t *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 lid = threadIdx.x; + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = pws[gid].i[ 8]; + w2[1] = pws[gid].i[ 9]; + w2[2] = pws[gid].i[10]; + w2[3] = pws[gid].i[11]; + + u32x w3[4]; + + w3[0] = pws[gid].i[12]; + w3[1] = pws[gid].i[13]; + w3[2] = pws[gid].i[14]; + w3[3] = pws[gid].i[15]; + + const u32 pw_len = pws[gid].pw_len; + + append_0x80_4 (w0, w1, w2, w3, pw_len); + + /** + * salt + */ + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + u32 salt_buf[2]; + + salt_buf[0] = salt_bufs[salt_pos].salt_buf[0]; + salt_buf[1] = salt_bufs[salt_pos].salt_buf[1]; + + /** + * initial sha1 + */ + + w3[1] = w2[3] << 16 | w2[2] >> 16; + w3[0] = w2[2] << 16 | w2[1] >> 16; + w2[3] = w2[1] << 16 | w2[0] >> 16; + w2[2] = w2[0] << 16 | w1[3] >> 16; + w2[1] = w1[3] << 16 | w1[2] >> 16; + w2[0] = w1[2] << 16 | w1[1] >> 16; + w1[3] = w1[1] << 16 | w1[0] >> 16; + w1[2] = w1[0] << 16 | w0[3] >> 16; + w1[1] = w0[3] << 16 | w0[2] >> 16; + w1[0] = w0[2] << 16 | w0[1] >> 16; + w0[3] = w0[1] << 16 | w0[0] >> 16; + w0[2] = w0[0] << 16; + w0[1] = salt_buf[1]; + w0[0] = salt_buf[0]; + + w0[0] = swap_workaround (w0[0]); + w0[1] = swap_workaround (w0[1]); + w0[2] = swap_workaround (w0[2]); + w0[3] = swap_workaround (w0[3]); + w1[0] = swap_workaround (w1[0]); + w1[1] = swap_workaround (w1[1]); + w1[2] = swap_workaround (w1[2]); + w1[3] = swap_workaround (w1[3]); + w2[0] = swap_workaround (w2[0]); + w2[1] = swap_workaround (w2[1]); + w2[2] = swap_workaround (w2[2]); + w2[3] = swap_workaround (w2[3]); + w3[0] = swap_workaround (w3[0]); + w3[1] = swap_workaround (w3[1]); + + const u32 block_len = salt_len + 2 + pw_len; + + w3[2] = 0; + w3[3] = block_len * 8; + + u32x digest[5]; + + digest[0] = SHA1M_A; + digest[1] = SHA1M_B; + digest[2] = SHA1M_C; + digest[3] = SHA1M_D; + digest[4] = SHA1M_E; + + sha1_transform (w0, w1, w2, w3, digest); + + /** + * blowfish setkey + */ + + u32 P[18]; + + for (u32 i = 0; i < 18; i++) + { + P[i] = c_pbox[i]; + } + + __shared__ u32x S0_all[8][256]; + __shared__ u32x S1_all[8][256]; + __shared__ u32x S2_all[8][256]; + __shared__ u32x S3_all[8][256]; + + u32x *S0 = S0_all[lid]; + u32x *S1 = S1_all[lid]; + u32x *S2 = S2_all[lid]; + u32x *S3 = S3_all[lid]; + + for (u32 i = 0; i < 256; i++) + { + S0[i] = c_sbox0[i]; + S1[i] = c_sbox1[i]; + S2[i] = c_sbox2[i]; + S3[i] = c_sbox3[i]; + } + + for (u32 i = 0; i < 18; i++) + { + P[i] ^= digest[i % 5]; + } + + u32 L0 = 0; + u32 R0 = 0; + + for (u32 i = 0; i < 18; i += 2) + { + BF_ENCRYPT (L0, R0); + + P[i + 0] = L0; + P[i + 1] = R0; + } + + for (u32 i = 0; i < 256; i += 4) + { + BF_ENCRYPT (L0, R0); + + S0[i + 0] = L0; + S0[i + 1] = R0; + + BF_ENCRYPT (L0, R0); + + S0[i + 2] = L0; + S0[i + 3] = R0; + } + + for (u32 i = 0; i < 256; i += 4) + { + BF_ENCRYPT (L0, R0); + + S1[i + 0] = L0; + S1[i + 1] = R0; + + BF_ENCRYPT (L0, R0); + + S1[i + 2] = L0; + S1[i + 3] = R0; + } + + for (u32 i = 0; i < 256; i += 4) + { + BF_ENCRYPT (L0, R0); + + S2[i + 0] = L0; + S2[i + 1] = R0; + + BF_ENCRYPT (L0, R0); + + S2[i + 2] = L0; + S2[i + 3] = R0; + } + + for (u32 i = 0; i < 256; i += 4) + { + BF_ENCRYPT (L0, R0); + + S3[i + 0] = L0; + S3[i + 1] = R0; + + BF_ENCRYPT (L0, R0); + + S3[i + 2] = L0; + S3[i + 3] = R0; + } + + // store + + tmps[gid].digest[0] = salt_buf[0]; + tmps[gid].digest[1] = salt_buf[1]; + + for (u32 i = 0; i < 18; i++) + { + tmps[gid].P[i] = P[i]; + } + + for (u32 i = 0; i < 256; i++) + { + tmps[gid].S0[i] = S0[i]; + tmps[gid].S1[i] = S1[i]; + tmps[gid].S2[i] = S2[i]; + tmps[gid].S3[i] = S3[i]; + } +} + +extern "C" __global__ void __launch_bounds__ (8, 1) m09000_loop (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, pwsafe2_tmp_t *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + const u32 lid = threadIdx.x; + + // load + + u32 digest[2]; + + digest[0] = tmps[gid].digest[0]; + digest[1] = tmps[gid].digest[1]; + + u32x P[18]; + + for (u32 i = 0; i < 18; i++) + { + P[i] = tmps[gid].P[i]; + } + + __shared__ u32x S0_all[8][256]; + __shared__ u32x S1_all[8][256]; + __shared__ u32x S2_all[8][256]; + __shared__ u32x S3_all[8][256]; + + u32x *S0 = S0_all[lid]; + u32x *S1 = S1_all[lid]; + u32x *S2 = S2_all[lid]; + u32x *S3 = S3_all[lid]; + + for (u32 i = 0; i < 256; i++) + { + S0[i] = tmps[gid].S0[i]; + S1[i] = tmps[gid].S1[i]; + S2[i] = tmps[gid].S2[i]; + S3[i] = tmps[gid].S3[i]; + } + + // loop + + u32x L0 = digest[0]; + u32x R0 = digest[1]; + + for (u32 i = 0; i < loop_cnt; i++) + { + BF_ENCRYPT (L0, R0); + } + + // store + + tmps[gid].digest[0] = L0; + tmps[gid].digest[1] = R0; +} + +extern "C" __global__ void __launch_bounds__ (8, 1) m09000_comp (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, pwsafe2_tmp_t *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + const u32 lid = threadIdx.x; + + // load + + u32 digest[2]; + + digest[0] = tmps[gid].digest[0]; + digest[1] = tmps[gid].digest[1]; + + // final sha1 + + u32x w0[4]; + u32x w1[4]; + u32x w2[4]; + u32x w3[4]; + + w0[0] = swap_workaround (digest[0]); + w0[1] = swap_workaround (digest[1]); + w0[2] = 0x00008000; + w0[3] = 0; + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = (8 + 2) * 8; + + u32x out[5]; + + out[0] = 0; // yep, not a bug! context is zero here + out[1] = 0; + out[2] = 0; + out[3] = 0; + out[4] = 0; + + sha1_transform (w0, w1, w2, w3, out); + + const u32x r0 = out[0]; + const u32x r1 = out[1]; + const u32x r2 = out[2]; + const u32x r3 = out[3]; + + #define il_pos 0 + + #include VECT_COMPARE_M +} diff --git a/nv/m09100.cu b/nv/m09100.cu new file mode 100644 index 0000000000..e2e93802bd --- /dev/null +++ b/nv/m09100.cu @@ -0,0 +1,989 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _LOTUS8_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW2 +#define VECT_SIZE1 +#endif + +#define DGST_R0 0 +#define DGST_R1 1 +#define DGST_R2 2 +#define DGST_R3 3 + +#include "include/kernel_functions.c" + +#undef _SHA1_ + +#include "types_nv.c" +#include "common_nv.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +__device__ __constant__ u32 lotus_magic_table[256] = +{ + 0xbd, 0x56, 0xea, 0xf2, 0xa2, 0xf1, 0xac, 0x2a, + 0xb0, 0x93, 0xd1, 0x9c, 0x1b, 0x33, 0xfd, 0xd0, + 0x30, 0x04, 0xb6, 0xdc, 0x7d, 0xdf, 0x32, 0x4b, + 0xf7, 0xcb, 0x45, 0x9b, 0x31, 0xbb, 0x21, 0x5a, + 0x41, 0x9f, 0xe1, 0xd9, 0x4a, 0x4d, 0x9e, 0xda, + 0xa0, 0x68, 0x2c, 0xc3, 0x27, 0x5f, 0x80, 0x36, + 0x3e, 0xee, 0xfb, 0x95, 0x1a, 0xfe, 0xce, 0xa8, + 0x34, 0xa9, 0x13, 0xf0, 0xa6, 0x3f, 0xd8, 0x0c, + 0x78, 0x24, 0xaf, 0x23, 0x52, 0xc1, 0x67, 0x17, + 0xf5, 0x66, 0x90, 0xe7, 0xe8, 0x07, 0xb8, 0x60, + 0x48, 0xe6, 0x1e, 0x53, 0xf3, 0x92, 0xa4, 0x72, + 0x8c, 0x08, 0x15, 0x6e, 0x86, 0x00, 0x84, 0xfa, + 0xf4, 0x7f, 0x8a, 0x42, 0x19, 0xf6, 0xdb, 0xcd, + 0x14, 0x8d, 0x50, 0x12, 0xba, 0x3c, 0x06, 0x4e, + 0xec, 0xb3, 0x35, 0x11, 0xa1, 0x88, 0x8e, 0x2b, + 0x94, 0x99, 0xb7, 0x71, 0x74, 0xd3, 0xe4, 0xbf, + 0x3a, 0xde, 0x96, 0x0e, 0xbc, 0x0a, 0xed, 0x77, + 0xfc, 0x37, 0x6b, 0x03, 0x79, 0x89, 0x62, 0xc6, + 0xd7, 0xc0, 0xd2, 0x7c, 0x6a, 0x8b, 0x22, 0xa3, + 0x5b, 0x05, 0x5d, 0x02, 0x75, 0xd5, 0x61, 0xe3, + 0x18, 0x8f, 0x55, 0x51, 0xad, 0x1f, 0x0b, 0x5e, + 0x85, 0xe5, 0xc2, 0x57, 0x63, 0xca, 0x3d, 0x6c, + 0xb4, 0xc5, 0xcc, 0x70, 0xb2, 0x91, 0x59, 0x0d, + 0x47, 0x20, 0xc8, 0x4f, 0x58, 0xe0, 0x01, 0xe2, + 0x16, 0x38, 0xc4, 0x6f, 0x3b, 0x0f, 0x65, 0x46, + 0xbe, 0x7e, 0x2d, 0x7b, 0x82, 0xf9, 0x40, 0xb5, + 0x1d, 0x73, 0xf8, 0xeb, 0x26, 0xc7, 0x87, 0x97, + 0x25, 0x54, 0xb1, 0x28, 0xaa, 0x98, 0x9d, 0xa5, + 0x64, 0x6d, 0x7a, 0xd4, 0x10, 0x81, 0x44, 0xef, + 0x49, 0xd6, 0xae, 0x2e, 0xdd, 0x76, 0x5c, 0x2f, + 0xa7, 0x1c, 0xc9, 0x09, 0x69, 0x9a, 0x83, 0xcf, + 0x29, 0x39, 0xb9, 0xe9, 0x4c, 0xff, 0x43, 0xab, +}; + +#ifdef VECT_SIZE1 +#define BOX(S,i) u32x ((S)[(i)]) +#endif + +#ifdef VECT_SIZE2 +#define BOX(S,i) u32x ((S)[(i).x], (S)[(i).y]) +#endif + +#ifdef VECT_SIZE1 +#define uint_to_hex_upper8(i) l_bin2asc[(i)] +#endif + +#ifdef VECT_SIZE2 +#define uint_to_hex_upper8(i) u32x (l_bin2asc[(i).x], l_bin2asc[(i).y]) +#endif + +__device__ static void lotus_mix (u32x *in, u32 s_lotus_magic_table[256]) +{ + u32x p = 0; + + for (int i = 0; i < 18; i++) + { + u32 s = 48; + + #pragma unroll 12 + for (int j = 0; j < 12; j++) + { + u32x tmp_in = in[j]; + u32x tmp_out = 0; + + p = (p + s--) & 0xff; p = ((tmp_in >> 0) & 0xff) ^ BOX (s_lotus_magic_table, p); tmp_out |= p << 0; + p = (p + s--) & 0xff; p = ((tmp_in >> 8) & 0xff) ^ BOX (s_lotus_magic_table, p); tmp_out |= p << 8; + p = (p + s--) & 0xff; p = ((tmp_in >> 16) & 0xff) ^ BOX (s_lotus_magic_table, p); tmp_out |= p << 16; + p = (p + s--) & 0xff; p = ((tmp_in >> 24) & 0xff) ^ BOX (s_lotus_magic_table, p); tmp_out |= p << 24; + + in[j] = tmp_out; + } + } +} + +__device__ static void lotus_transform_password (u32x *in, u32x *out, u32 s_lotus_magic_table[256]) +{ + u32x t = out[3] >> 24; + + u32x c; + + #pragma unroll 4 + for (int i = 0; i < 4; i++) + { + t ^= (in[i] >> 0) & 0xff; c = BOX (s_lotus_magic_table, t); out[i] ^= c << 0; t = ((out[i] >> 0) & 0xff); + t ^= (in[i] >> 8) & 0xff; c = BOX (s_lotus_magic_table, t); out[i] ^= c << 8; t = ((out[i] >> 8) & 0xff); + t ^= (in[i] >> 16) & 0xff; c = BOX (s_lotus_magic_table, t); out[i] ^= c << 16; t = ((out[i] >> 16) & 0xff); + t ^= (in[i] >> 24) & 0xff; c = BOX (s_lotus_magic_table, t); out[i] ^= c << 24; t = ((out[i] >> 24) & 0xff); + } +} + +__device__ static void pad (u32x w[4], const u32 len) +{ + const u32 val = 16 - len; + + const u32 mask1 = val << 24; + + const u32 mask2 = val << 16 + | val << 24; + + const u32 mask3 = val << 8 + | val << 16 + | val << 24; + + const u32 mask4 = val << 0 + | val << 8 + | val << 16 + | val << 24; + + switch (len) + { + case 0: w[0] = mask4; + w[1] = mask4; + w[2] = mask4; + w[3] = mask4; + break; + case 1: w[0] |= mask3; + w[1] = mask4; + w[2] = mask4; + w[3] = mask4; + break; + case 2: w[0] |= mask2; + w[1] = mask4; + w[2] = mask4; + w[3] = mask4; + break; + case 3: w[0] |= mask1; + w[1] = mask4; + w[2] = mask4; + w[3] = mask4; + break; + case 4: w[1] = mask4; + w[2] = mask4; + w[3] = mask4; + break; + case 5: w[1] |= mask3; + w[2] = mask4; + w[3] = mask4; + break; + case 6: w[1] |= mask2; + w[2] = mask4; + w[3] = mask4; + break; + case 7: w[1] |= mask1; + w[2] = mask4; + w[3] = mask4; + break; + case 8: w[2] = mask4; + w[3] = mask4; + break; + case 9: w[2] |= mask3; + w[3] = mask4; + break; + case 10: w[2] |= mask2; + w[3] = mask4; + break; + case 11: w[2] |= mask1; + w[3] = mask4; + break; + case 12: w[3] = mask4; + break; + case 13: w[3] |= mask3; + break; + case 14: w[3] |= mask2; + break; + case 15: w[3] |= mask1; + break; + } +} + +__device__ static void mdtransform_norecalc (u32x state[4], u32x block[4], u32 s_lotus_magic_table[256]) +{ + u32x x[12]; + + x[ 0] = state[0]; + x[ 1] = state[1]; + x[ 2] = state[2]; + x[ 3] = state[3]; + x[ 4] = block[0]; + x[ 5] = block[1]; + x[ 6] = block[2]; + x[ 7] = block[3]; + x[ 8] = state[0] ^ block[0]; + x[ 9] = state[1] ^ block[1]; + x[10] = state[2] ^ block[2]; + x[11] = state[3] ^ block[3]; + + lotus_mix (x, s_lotus_magic_table); + + state[0] = x[0]; + state[1] = x[1]; + state[2] = x[2]; + state[3] = x[3]; +} + +__device__ static void mdtransform (u32x state[4], u32x checksum[4], u32x block[4], u32 s_lotus_magic_table[256]) +{ + mdtransform_norecalc (state, block, s_lotus_magic_table); + + lotus_transform_password (block, checksum, s_lotus_magic_table); +} + +__device__ static void domino_big_md (const u32x saved_key[16], const u32 size, u32x state[4], u32 s_lotus_magic_table[256]) +{ + u32x checksum[4]; + + checksum[0] = 0; + checksum[1] = 0; + checksum[2] = 0; + checksum[3] = 0; + + u32x block[4]; + + block[0] = 0; + block[1] = 0; + block[2] = 0; + block[3] = 0; + + u32 curpos; + u32 idx; + + for (curpos = 0, idx = 0; curpos + 16 < size; curpos += 16, idx += 4) + { + block[0] = saved_key[idx + 0]; + block[1] = saved_key[idx + 1]; + block[2] = saved_key[idx + 2]; + block[3] = saved_key[idx + 3]; + + mdtransform (state, checksum, block, s_lotus_magic_table); + } + + block[0] = saved_key[idx + 0]; + block[1] = saved_key[idx + 1]; + block[2] = saved_key[idx + 2]; + block[3] = saved_key[idx + 3]; + + mdtransform (state, checksum, block, s_lotus_magic_table); + + mdtransform_norecalc (state, checksum, s_lotus_magic_table); +} + +__device__ static void sha1_transform (const u32x w0[4], const u32x w1[4], const u32x w2[4], const u32x w3[4], u32x digest[5]) +{ + u32x A = digest[0]; + u32x B = digest[1]; + u32x C = digest[2]; + u32x D = digest[3]; + u32x E = digest[4]; + + u32x w0_t = w0[0]; + u32x w1_t = w0[1]; + u32x w2_t = w0[2]; + u32x w3_t = w0[3]; + u32x w4_t = w1[0]; + u32x w5_t = w1[1]; + u32x w6_t = w1[2]; + u32x w7_t = w1[3]; + u32x w8_t = w2[0]; + u32x w9_t = w2[1]; + u32x wa_t = w2[2]; + u32x wb_t = w2[3]; + u32x wc_t = w3[0]; + u32x wd_t = w3[1]; + u32x we_t = w3[2]; + u32x wf_t = w3[3]; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, A, B, C, D, E, w0_t); + SHA1_STEP (SHA1_F0o, E, A, B, C, D, w1_t); + SHA1_STEP (SHA1_F0o, D, E, A, B, C, w2_t); + SHA1_STEP (SHA1_F0o, C, D, E, A, B, w3_t); + SHA1_STEP (SHA1_F0o, B, C, D, E, A, w4_t); + SHA1_STEP (SHA1_F0o, A, B, C, D, E, w5_t); + SHA1_STEP (SHA1_F0o, E, A, B, C, D, w6_t); + SHA1_STEP (SHA1_F0o, D, E, A, B, C, w7_t); + SHA1_STEP (SHA1_F0o, C, D, E, A, B, w8_t); + SHA1_STEP (SHA1_F0o, B, C, D, E, A, w9_t); + SHA1_STEP (SHA1_F0o, A, B, C, D, E, wa_t); + SHA1_STEP (SHA1_F0o, E, A, B, C, D, wb_t); + SHA1_STEP (SHA1_F0o, D, E, A, B, C, wc_t); + SHA1_STEP (SHA1_F0o, C, D, E, A, B, wd_t); + SHA1_STEP (SHA1_F0o, B, C, D, E, A, we_t); + SHA1_STEP (SHA1_F0o, A, B, C, D, E, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F0o, E, A, B, C, D, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F0o, D, E, A, B, C, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F0o, C, D, E, A, B, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F0o, B, C, D, E, A, w3_t); + + #undef K + #define K SHA1C01 + + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w7_t); + + #undef K + #define K SHA1C02 + + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, wb_t); + + #undef K + #define K SHA1C03 + + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, wf_t); + + digest[0] += A; + digest[1] += B; + digest[2] += C; + digest[3] += D; + digest[4] += E; +} + +__device__ static void hmac_sha1_pad (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], u32x ipad[5], u32x opad[5]) +{ + w0[0] = w0[0] ^ 0x36363636; + w0[1] = w0[1] ^ 0x36363636; + w0[2] = w0[2] ^ 0x36363636; + w0[3] = w0[3] ^ 0x36363636; + w1[0] = w1[0] ^ 0x36363636; + w1[1] = w1[1] ^ 0x36363636; + w1[2] = w1[2] ^ 0x36363636; + w1[3] = w1[3] ^ 0x36363636; + w2[0] = w2[0] ^ 0x36363636; + w2[1] = w2[1] ^ 0x36363636; + w2[2] = w2[2] ^ 0x36363636; + w2[3] = w2[3] ^ 0x36363636; + w3[0] = w3[0] ^ 0x36363636; + w3[1] = w3[1] ^ 0x36363636; + w3[2] = w3[2] ^ 0x36363636; + w3[3] = w3[3] ^ 0x36363636; + + ipad[0] = SHA1M_A; + ipad[1] = SHA1M_B; + ipad[2] = SHA1M_C; + ipad[3] = SHA1M_D; + ipad[4] = SHA1M_E; + + sha1_transform (w0, w1, w2, w3, ipad); + + w0[0] = w0[0] ^ 0x6a6a6a6a; + w0[1] = w0[1] ^ 0x6a6a6a6a; + w0[2] = w0[2] ^ 0x6a6a6a6a; + w0[3] = w0[3] ^ 0x6a6a6a6a; + w1[0] = w1[0] ^ 0x6a6a6a6a; + w1[1] = w1[1] ^ 0x6a6a6a6a; + w1[2] = w1[2] ^ 0x6a6a6a6a; + w1[3] = w1[3] ^ 0x6a6a6a6a; + w2[0] = w2[0] ^ 0x6a6a6a6a; + w2[1] = w2[1] ^ 0x6a6a6a6a; + w2[2] = w2[2] ^ 0x6a6a6a6a; + w2[3] = w2[3] ^ 0x6a6a6a6a; + w3[0] = w3[0] ^ 0x6a6a6a6a; + w3[1] = w3[1] ^ 0x6a6a6a6a; + w3[2] = w3[2] ^ 0x6a6a6a6a; + w3[3] = w3[3] ^ 0x6a6a6a6a; + + opad[0] = SHA1M_A; + opad[1] = SHA1M_B; + opad[2] = SHA1M_C; + opad[3] = SHA1M_D; + opad[4] = SHA1M_E; + + sha1_transform (w0, w1, w2, w3, opad); +} + +__device__ static void hmac_sha1_run (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], u32x ipad[5], u32x opad[5], u32x digest[5]) +{ + digest[0] = ipad[0]; + digest[1] = ipad[1]; + digest[2] = ipad[2]; + digest[3] = ipad[3]; + digest[4] = ipad[4]; + + sha1_transform (w0, w1, w2, w3, digest); + + w0[0] = digest[0]; + w0[1] = digest[1]; + w0[2] = digest[2]; + w0[3] = digest[3]; + w1[0] = digest[4]; + w1[1] = 0x80000000; + w1[2] = 0; + w1[3] = 0; + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = (64 + 20) * 8; + + digest[0] = opad[0]; + digest[1] = opad[1]; + digest[2] = opad[2]; + digest[3] = opad[3]; + digest[4] = opad[4]; + + sha1_transform (w0, w1, w2, w3, digest); +} + +__device__ static void base64_encode (u8 *base64_hash, const u32 len, const u8 *base64_plain) +{ + u8 *out_ptr = (u8 *) base64_hash; + u8 *in_ptr = (u8 *) base64_plain; + + char *lotus64_table = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz+/"; + + u32 i; + + for (i = 0; i < len; i += 3) + { + char out_val0 = lotus64_table [ ((in_ptr[0] >> 2) & 0x3f)]; + char out_val1 = lotus64_table [((in_ptr[0] << 4) & 0x30) | ((in_ptr[1] >> 4) & 0x0f)]; + char out_val2 = lotus64_table [((in_ptr[1] << 2) & 0x3c) | ((in_ptr[2] >> 6) & 0x03)]; + char out_val3 = lotus64_table [ ((in_ptr[2] >> 0) & 0x3f)]; + + out_ptr[0] = out_val0 & 0x7f; + out_ptr[1] = out_val1 & 0x7f; + out_ptr[2] = out_val2 & 0x7f; + out_ptr[3] = out_val3 & 0x7f; + + in_ptr += 3; + out_ptr += 4; + } +} + +__device__ static void lotus6_base64_encode (u8 base64_hash[24], const u32 salt0, const u32 salt1, u32x a, u32x b, u32x c) +{ + u8 *salt0_ptr = (u8 *) &salt0; + u8 *salt1_ptr = (u8 *) &salt1; + + u8 *a_ptr = (u8 *) &a; + u8 *b_ptr = (u8 *) &b; + u8 *c_ptr = (u8 *) &c; + + /* + * Copy $salt.$digest to a tmp buffer + */ + + u8 base64_plain[16]; + + base64_plain[ 0] = salt0_ptr[0]; + base64_plain[ 1] = salt0_ptr[1]; + base64_plain[ 2] = salt0_ptr[2]; + base64_plain[ 3] = salt0_ptr[3]; + + base64_plain[3] -= -4; // dont ask! + + base64_plain[ 4] = salt1_ptr[0]; + + base64_plain[ 5] = a_ptr[0]; + base64_plain[ 6] = a_ptr[1]; + base64_plain[ 7] = a_ptr[2]; + base64_plain[ 8] = a_ptr[3]; + + base64_plain[ 9] = b_ptr[0]; + base64_plain[10] = b_ptr[1]; + base64_plain[11] = b_ptr[2]; + base64_plain[12] = b_ptr[3]; + + base64_plain[13] = c_ptr[0]; + base64_plain[14] = c_ptr[1]; + base64_plain[15] = c_ptr[2]; + + /* + * base64 encode the $salt.$digest string + */ + + base64_hash[ 0] = '('; + base64_hash[ 1] = 'G'; + + base64_encode (base64_hash + 2, 14, base64_plain); + + base64_hash[21] = ')'; +} + +__device__ __constant__ char c_bin2asc[16] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' }; + +__device__ __shared__ short l_bin2asc[256]; + +extern "C" __global__ void __launch_bounds__ (256, 1) m09100_init (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, lotus8_tmp_t *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + const u32 lid = threadIdx.x; + + /** + * bin2asc table + */ + + l_bin2asc[lid] = c_bin2asc[(lid >> 0) & 15] << 8 + | c_bin2asc[(lid >> 4) & 15] << 0; + + __syncthreads (); + + /** + * sbox + */ + + __shared__ u32 s_lotus_magic_table[256]; + + s_lotus_magic_table[lid] = lotus_magic_table[lid]; + + __syncthreads (); + + if (gid >= gid_max) return; + + + u32x w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + + w[ 4] = pws[gid].i[ 4]; + w[ 5] = pws[gid].i[ 5]; + w[ 6] = pws[gid].i[ 6]; + w[ 7] = pws[gid].i[ 7]; + + w[ 8] = pws[gid].i[ 8]; + w[ 9] = pws[gid].i[ 9]; + w[10] = pws[gid].i[10]; + w[11] = pws[gid].i[11]; + + w[12] = pws[gid].i[12]; + w[13] = pws[gid].i[13]; + w[14] = pws[gid].i[14]; + w[15] = pws[gid].i[15]; + + /** + * pad + */ + + u32 pw_len = pws[gid].pw_len; + + if (pw_len < 16) + { + pad (&w[ 0], pw_len & 0xf); + } + else if (pw_len < 32) + { + pad (&w[ 4], pw_len & 0xf); + } + else if (pw_len < 48) + { + pad (&w[ 8], pw_len & 0xf); + } + else if (pw_len < 64) + { + pad (&w[12], pw_len & 0xf); + } + + /** + * salt + */ + + u32 salt_len = salt_bufs[salt_pos].salt_len; + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[ 1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[ 2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[ 3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = 0x01000000; + salt_buf1[1] = 0x00000080; + salt_buf1[2] = 0; + salt_buf1[3] = 0; + + u32 salt_buf2[4]; + + salt_buf2[0] = 0; + salt_buf2[1] = 0; + salt_buf2[2] = 0; + salt_buf2[3] = 0; + + u32 salt_buf3[4]; + + salt_buf3[0] = 0; + salt_buf3[1] = 0; + salt_buf3[2] = 0; + salt_buf3[3] = 0; + + const u32 salt0 = salt_buf0[0]; + const u32 salt1 = salt_buf0[1] & 0xff | '(' << 8; + + /** + * Lotus 6 hash - SEC_pwddigest_V2 + */ + + u32x w_tmp[16]; + + w_tmp[ 0] = w[ 0]; + w_tmp[ 1] = w[ 1]; + w_tmp[ 2] = w[ 2]; + w_tmp[ 3] = w[ 3]; + w_tmp[ 4] = w[ 4]; + w_tmp[ 5] = w[ 5]; + w_tmp[ 6] = w[ 6]; + w_tmp[ 7] = w[ 7]; + w_tmp[ 8] = w[ 8]; + w_tmp[ 9] = w[ 9]; + w_tmp[10] = w[10]; + w_tmp[11] = w[11]; + w_tmp[12] = w[12]; + w_tmp[13] = w[13]; + w_tmp[14] = w[14]; + w_tmp[15] = w[15]; + + u32x state[4]; + + state[0] = 0; + state[1] = 0; + state[2] = 0; + state[3] = 0; + + domino_big_md (w_tmp, pw_len, state, s_lotus_magic_table); + + const u32x w0_t = uint_to_hex_upper8 ((state[0] >> 0) & 255) << 0 + | uint_to_hex_upper8 ((state[0] >> 8) & 255) << 16; + const u32x w1_t = uint_to_hex_upper8 ((state[0] >> 16) & 255) << 0 + | uint_to_hex_upper8 ((state[0] >> 24) & 255) << 16; + const u32x w2_t = uint_to_hex_upper8 ((state[1] >> 0) & 255) << 0 + | uint_to_hex_upper8 ((state[1] >> 8) & 255) << 16; + const u32x w3_t = uint_to_hex_upper8 ((state[1] >> 16) & 255) << 0 + | uint_to_hex_upper8 ((state[1] >> 24) & 255) << 16; + const u32x w4_t = uint_to_hex_upper8 ((state[2] >> 0) & 255) << 0 + | uint_to_hex_upper8 ((state[2] >> 8) & 255) << 16; + const u32x w5_t = uint_to_hex_upper8 ((state[2] >> 16) & 255) << 0 + | uint_to_hex_upper8 ((state[2] >> 24) & 255) << 16; + const u32x w6_t = uint_to_hex_upper8 ((state[3] >> 0) & 255) << 0 + | uint_to_hex_upper8 ((state[3] >> 8) & 255) << 16; + + const u32 pade = 0x0e0e0e0e; + + w_tmp[ 0] = salt0; + w_tmp[ 1] = salt1 | w0_t << 16; + w_tmp[ 2] = w0_t >> 16 | w1_t << 16; + w_tmp[ 3] = w1_t >> 16 | w2_t << 16; + w_tmp[ 4] = w2_t >> 16 | w3_t << 16; + w_tmp[ 5] = w3_t >> 16 | w4_t << 16; + w_tmp[ 6] = w4_t >> 16 | w5_t << 16; + w_tmp[ 7] = w5_t >> 16 | w6_t << 16; + w_tmp[ 8] = w6_t >> 16 | pade << 16; + w_tmp[ 9] = pade; + w_tmp[10] = pade; + w_tmp[11] = pade; + w_tmp[12] = 0; + w_tmp[13] = 0; + w_tmp[14] = 0; + w_tmp[15] = 0; + + state[0] = 0; + state[1] = 0; + state[2] = 0; + state[3] = 0; + + domino_big_md (w_tmp, 34, state, s_lotus_magic_table); + + u32x a = state[0]; + u32x b = state[1]; + u32x c = state[2]; + + /** + * Base64 encode + */ + + pw_len = 22; + + u8 base64_hash[24]; // size 22 (=pw_len) is needed but base64 needs size divisible by 4 + + lotus6_base64_encode (base64_hash, salt_buf0[0], salt_buf0[1], a, b, c); + + + /** + * PBKDF2 - HMACSHA1 - 1st iteration + */ + + u32x w0[4]; + + w0[0] = (base64_hash[ 0] << 24) | (base64_hash[ 1] << 16) | (base64_hash[ 2] << 8) | base64_hash[ 3]; + w0[1] = (base64_hash[ 4] << 24) | (base64_hash[ 5] << 16) | (base64_hash[ 6] << 8) | base64_hash[ 7]; + w0[2] = (base64_hash[ 8] << 24) | (base64_hash[ 9] << 16) | (base64_hash[10] << 8) | base64_hash[11]; + w0[3] = (base64_hash[12] << 24) | (base64_hash[13] << 16) | (base64_hash[14] << 8) | base64_hash[15]; + + u32x w1[4]; + + w1[0] = (base64_hash[16] << 24) | (base64_hash[17] << 16) | (base64_hash[18] << 8) | base64_hash[19]; + w1[1] = (base64_hash[20] << 24) | (base64_hash[21] << 16); + w1[2] = 0; + w1[3] = 0; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + /** + * pads + */ + + u32x ipad[5]; + u32x opad[5]; + + hmac_sha1_pad (w0, w1, w2, w3, ipad, opad); + + tmps[gid].ipad[0] = ipad[0]; + tmps[gid].ipad[1] = ipad[1]; + tmps[gid].ipad[2] = ipad[2]; + tmps[gid].ipad[3] = ipad[3]; + tmps[gid].ipad[4] = ipad[4]; + + tmps[gid].opad[0] = opad[0]; + tmps[gid].opad[1] = opad[1]; + tmps[gid].opad[2] = opad[2]; + tmps[gid].opad[3] = opad[3]; + tmps[gid].opad[4] = opad[4]; + + w0[0] = salt_buf0[0]; + w0[1] = salt_buf0[1]; + w0[2] = salt_buf0[2]; + w0[3] = salt_buf0[3]; + w1[0] = salt_buf1[0]; + w1[1] = salt_buf1[1]; + w1[2] = salt_buf1[2]; + w1[3] = salt_buf1[3]; + w2[0] = salt_buf2[0]; + w2[1] = salt_buf2[1]; + w2[2] = salt_buf2[2]; + w2[3] = salt_buf2[3]; + w3[0] = salt_buf3[0]; + w3[1] = salt_buf3[1]; + w3[2] = salt_buf3[2]; + //w3[3] = salt_buf3[3]; + + w0[0] = swap_workaround (w0[0]); + w0[1] = swap_workaround (w0[1]); + w0[2] = swap_workaround (w0[2]); + w0[3] = swap_workaround (w0[3]); + w1[0] = swap_workaround (w1[0]); + w1[1] = swap_workaround (w1[1]); + w1[2] = swap_workaround (w1[2]); + w1[3] = swap_workaround (w1[3]); + w2[0] = swap_workaround (w2[0]); + w2[1] = swap_workaround (w2[1]); + w2[2] = swap_workaround (w2[2]); + w2[3] = swap_workaround (w2[3]); + w3[0] = swap_workaround (w3[0]); + w3[1] = swap_workaround (w3[1]); + w3[2] = swap_workaround (w3[2]); + w3[3] = (64 + salt_len + 4) * 8; + + u32x dgst[5]; + + hmac_sha1_run (w0, w1, w2, w3, ipad, opad, dgst); + + tmps[gid].dgst[0] = dgst[0]; + tmps[gid].dgst[1] = dgst[1]; + tmps[gid].dgst[2] = dgst[2]; + tmps[gid].dgst[3] = dgst[3]; + tmps[gid].dgst[4] = dgst[4]; + + tmps[gid].out[0] = dgst[0]; + tmps[gid].out[1] = dgst[1]; + tmps[gid].out[2] = dgst[2]; + tmps[gid].out[3] = dgst[3]; + tmps[gid].out[4] = dgst[4]; +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m09100_loop (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, lotus8_tmp_t *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x ipad[5]; + u32x opad[5]; + + ipad[0] = tmps[gid].ipad[0]; + ipad[1] = tmps[gid].ipad[1]; + ipad[2] = tmps[gid].ipad[2]; + ipad[3] = tmps[gid].ipad[3]; + ipad[4] = tmps[gid].ipad[4]; + + opad[0] = tmps[gid].opad[0]; + opad[1] = tmps[gid].opad[1]; + opad[2] = tmps[gid].opad[2]; + opad[3] = tmps[gid].opad[3]; + opad[4] = tmps[gid].opad[4]; + + u32x dgst[5]; + u32x out[5]; + + dgst[0] = tmps[gid].dgst[0]; + dgst[1] = tmps[gid].dgst[1]; + dgst[2] = tmps[gid].dgst[2]; + dgst[3] = tmps[gid].dgst[3]; + dgst[4] = tmps[gid].dgst[4]; + + out[0] = tmps[gid].out[0]; + out[1] = tmps[gid].out[1]; + out[2] = tmps[gid].out[2]; + out[3] = tmps[gid].out[3]; + out[4] = tmps[gid].out[4]; + + for (u32 j = 0; j < loop_cnt; j++) + { + u32x w0[4]; + u32x w1[4]; + u32x w2[4]; + u32x w3[4]; + + w0[0] = dgst[0]; + w0[1] = dgst[1]; + w0[2] = dgst[2]; + w0[3] = dgst[3]; + w1[0] = dgst[4]; + w1[1] = 0x80000000; + w1[2] = 0; + w1[3] = 0; + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = (64 + 20) * 8; + + hmac_sha1_run (w0, w1, w2, w3, ipad, opad, dgst); + + out[0] ^= dgst[0]; + out[1] ^= dgst[1]; + out[2] ^= dgst[2]; + out[3] ^= dgst[3]; + out[4] ^= dgst[4]; + } + + tmps[gid].dgst[0] = dgst[0]; + tmps[gid].dgst[1] = dgst[1]; + tmps[gid].dgst[2] = dgst[2]; + tmps[gid].dgst[3] = dgst[3]; + tmps[gid].dgst[4] = dgst[4]; + + tmps[gid].out[0] = out[0]; + tmps[gid].out[1] = out[1]; + tmps[gid].out[2] = out[2]; + tmps[gid].out[3] = out[3]; + tmps[gid].out[4] = out[4]; +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m09100_comp (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, lotus8_tmp_t *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + const u32 lid = threadIdx.x; + + /** + * digest + */ + + const u32x r0 = tmps[gid].out[DGST_R0]; + const u32x r1 = tmps[gid].out[DGST_R1]; + const u32x r2 = 0; + const u32x r3 = 0; + + #define il_pos 0 + + #include VECT_COMPARE_M +} diff --git a/nv/m09400.cu b/nv/m09400.cu new file mode 100644 index 0000000000..4b4bfc22cd --- /dev/null +++ b/nv/m09400.cu @@ -0,0 +1,1844 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _OFFICE2007_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW2 +#define VECT_SIZE1 +#endif + +#define DGST_R0 0 +#define DGST_R1 1 +#define DGST_R2 2 +#define DGST_R3 3 + +#include "include/kernel_functions.c" +#include "types_nv.c" +#include "common_nv.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +__device__ __constant__ u32 te0[256] = +{ + 0xc66363a5, 0xf87c7c84, 0xee777799, 0xf67b7b8d, + 0xfff2f20d, 0xd66b6bbd, 0xde6f6fb1, 0x91c5c554, + 0x60303050, 0x02010103, 0xce6767a9, 0x562b2b7d, + 0xe7fefe19, 0xb5d7d762, 0x4dababe6, 0xec76769a, + 0x8fcaca45, 0x1f82829d, 0x89c9c940, 0xfa7d7d87, + 0xeffafa15, 0xb25959eb, 0x8e4747c9, 0xfbf0f00b, + 0x41adadec, 0xb3d4d467, 0x5fa2a2fd, 0x45afafea, + 0x239c9cbf, 0x53a4a4f7, 0xe4727296, 0x9bc0c05b, + 0x75b7b7c2, 0xe1fdfd1c, 0x3d9393ae, 0x4c26266a, + 0x6c36365a, 0x7e3f3f41, 0xf5f7f702, 0x83cccc4f, + 0x6834345c, 0x51a5a5f4, 0xd1e5e534, 0xf9f1f108, + 0xe2717193, 0xabd8d873, 0x62313153, 0x2a15153f, + 0x0804040c, 0x95c7c752, 0x46232365, 0x9dc3c35e, + 0x30181828, 0x379696a1, 0x0a05050f, 0x2f9a9ab5, + 0x0e070709, 0x24121236, 0x1b80809b, 0xdfe2e23d, + 0xcdebeb26, 0x4e272769, 0x7fb2b2cd, 0xea75759f, + 0x1209091b, 0x1d83839e, 0x582c2c74, 0x341a1a2e, + 0x361b1b2d, 0xdc6e6eb2, 0xb45a5aee, 0x5ba0a0fb, + 0xa45252f6, 0x763b3b4d, 0xb7d6d661, 0x7db3b3ce, + 0x5229297b, 0xdde3e33e, 0x5e2f2f71, 0x13848497, + 0xa65353f5, 0xb9d1d168, 0x00000000, 0xc1eded2c, + 0x40202060, 0xe3fcfc1f, 0x79b1b1c8, 0xb65b5bed, + 0xd46a6abe, 0x8dcbcb46, 0x67bebed9, 0x7239394b, + 0x944a4ade, 0x984c4cd4, 0xb05858e8, 0x85cfcf4a, + 0xbbd0d06b, 0xc5efef2a, 0x4faaaae5, 0xedfbfb16, + 0x864343c5, 0x9a4d4dd7, 0x66333355, 0x11858594, + 0x8a4545cf, 0xe9f9f910, 0x04020206, 0xfe7f7f81, + 0xa05050f0, 0x783c3c44, 0x259f9fba, 0x4ba8a8e3, + 0xa25151f3, 0x5da3a3fe, 0x804040c0, 0x058f8f8a, + 0x3f9292ad, 0x219d9dbc, 0x70383848, 0xf1f5f504, + 0x63bcbcdf, 0x77b6b6c1, 0xafdada75, 0x42212163, + 0x20101030, 0xe5ffff1a, 0xfdf3f30e, 0xbfd2d26d, + 0x81cdcd4c, 0x180c0c14, 0x26131335, 0xc3ecec2f, + 0xbe5f5fe1, 0x359797a2, 0x884444cc, 0x2e171739, + 0x93c4c457, 0x55a7a7f2, 0xfc7e7e82, 0x7a3d3d47, + 0xc86464ac, 0xba5d5de7, 0x3219192b, 0xe6737395, + 0xc06060a0, 0x19818198, 0x9e4f4fd1, 0xa3dcdc7f, + 0x44222266, 0x542a2a7e, 0x3b9090ab, 0x0b888883, + 0x8c4646ca, 0xc7eeee29, 0x6bb8b8d3, 0x2814143c, + 0xa7dede79, 0xbc5e5ee2, 0x160b0b1d, 0xaddbdb76, + 0xdbe0e03b, 0x64323256, 0x743a3a4e, 0x140a0a1e, + 0x924949db, 0x0c06060a, 0x4824246c, 0xb85c5ce4, + 0x9fc2c25d, 0xbdd3d36e, 0x43acacef, 0xc46262a6, + 0x399191a8, 0x319595a4, 0xd3e4e437, 0xf279798b, + 0xd5e7e732, 0x8bc8c843, 0x6e373759, 0xda6d6db7, + 0x018d8d8c, 0xb1d5d564, 0x9c4e4ed2, 0x49a9a9e0, + 0xd86c6cb4, 0xac5656fa, 0xf3f4f407, 0xcfeaea25, + 0xca6565af, 0xf47a7a8e, 0x47aeaee9, 0x10080818, + 0x6fbabad5, 0xf0787888, 0x4a25256f, 0x5c2e2e72, + 0x381c1c24, 0x57a6a6f1, 0x73b4b4c7, 0x97c6c651, + 0xcbe8e823, 0xa1dddd7c, 0xe874749c, 0x3e1f1f21, + 0x964b4bdd, 0x61bdbddc, 0x0d8b8b86, 0x0f8a8a85, + 0xe0707090, 0x7c3e3e42, 0x71b5b5c4, 0xcc6666aa, + 0x904848d8, 0x06030305, 0xf7f6f601, 0x1c0e0e12, + 0xc26161a3, 0x6a35355f, 0xae5757f9, 0x69b9b9d0, + 0x17868691, 0x99c1c158, 0x3a1d1d27, 0x279e9eb9, + 0xd9e1e138, 0xebf8f813, 0x2b9898b3, 0x22111133, + 0xd26969bb, 0xa9d9d970, 0x078e8e89, 0x339494a7, + 0x2d9b9bb6, 0x3c1e1e22, 0x15878792, 0xc9e9e920, + 0x87cece49, 0xaa5555ff, 0x50282878, 0xa5dfdf7a, + 0x038c8c8f, 0x59a1a1f8, 0x09898980, 0x1a0d0d17, + 0x65bfbfda, 0xd7e6e631, 0x844242c6, 0xd06868b8, + 0x824141c3, 0x299999b0, 0x5a2d2d77, 0x1e0f0f11, + 0x7bb0b0cb, 0xa85454fc, 0x6dbbbbd6, 0x2c16163a, +}; + +__device__ __constant__ u32 te1[256] = +{ + 0xa5c66363, 0x84f87c7c, 0x99ee7777, 0x8df67b7b, + 0x0dfff2f2, 0xbdd66b6b, 0xb1de6f6f, 0x5491c5c5, + 0x50603030, 0x03020101, 0xa9ce6767, 0x7d562b2b, + 0x19e7fefe, 0x62b5d7d7, 0xe64dabab, 0x9aec7676, + 0x458fcaca, 0x9d1f8282, 0x4089c9c9, 0x87fa7d7d, + 0x15effafa, 0xebb25959, 0xc98e4747, 0x0bfbf0f0, + 0xec41adad, 0x67b3d4d4, 0xfd5fa2a2, 0xea45afaf, + 0xbf239c9c, 0xf753a4a4, 0x96e47272, 0x5b9bc0c0, + 0xc275b7b7, 0x1ce1fdfd, 0xae3d9393, 0x6a4c2626, + 0x5a6c3636, 0x417e3f3f, 0x02f5f7f7, 0x4f83cccc, + 0x5c683434, 0xf451a5a5, 0x34d1e5e5, 0x08f9f1f1, + 0x93e27171, 0x73abd8d8, 0x53623131, 0x3f2a1515, + 0x0c080404, 0x5295c7c7, 0x65462323, 0x5e9dc3c3, + 0x28301818, 0xa1379696, 0x0f0a0505, 0xb52f9a9a, + 0x090e0707, 0x36241212, 0x9b1b8080, 0x3ddfe2e2, + 0x26cdebeb, 0x694e2727, 0xcd7fb2b2, 0x9fea7575, + 0x1b120909, 0x9e1d8383, 0x74582c2c, 0x2e341a1a, + 0x2d361b1b, 0xb2dc6e6e, 0xeeb45a5a, 0xfb5ba0a0, + 0xf6a45252, 0x4d763b3b, 0x61b7d6d6, 0xce7db3b3, + 0x7b522929, 0x3edde3e3, 0x715e2f2f, 0x97138484, + 0xf5a65353, 0x68b9d1d1, 0x00000000, 0x2cc1eded, + 0x60402020, 0x1fe3fcfc, 0xc879b1b1, 0xedb65b5b, + 0xbed46a6a, 0x468dcbcb, 0xd967bebe, 0x4b723939, + 0xde944a4a, 0xd4984c4c, 0xe8b05858, 0x4a85cfcf, + 0x6bbbd0d0, 0x2ac5efef, 0xe54faaaa, 0x16edfbfb, + 0xc5864343, 0xd79a4d4d, 0x55663333, 0x94118585, + 0xcf8a4545, 0x10e9f9f9, 0x06040202, 0x81fe7f7f, + 0xf0a05050, 0x44783c3c, 0xba259f9f, 0xe34ba8a8, + 0xf3a25151, 0xfe5da3a3, 0xc0804040, 0x8a058f8f, + 0xad3f9292, 0xbc219d9d, 0x48703838, 0x04f1f5f5, + 0xdf63bcbc, 0xc177b6b6, 0x75afdada, 0x63422121, + 0x30201010, 0x1ae5ffff, 0x0efdf3f3, 0x6dbfd2d2, + 0x4c81cdcd, 0x14180c0c, 0x35261313, 0x2fc3ecec, + 0xe1be5f5f, 0xa2359797, 0xcc884444, 0x392e1717, + 0x5793c4c4, 0xf255a7a7, 0x82fc7e7e, 0x477a3d3d, + 0xacc86464, 0xe7ba5d5d, 0x2b321919, 0x95e67373, + 0xa0c06060, 0x98198181, 0xd19e4f4f, 0x7fa3dcdc, + 0x66442222, 0x7e542a2a, 0xab3b9090, 0x830b8888, + 0xca8c4646, 0x29c7eeee, 0xd36bb8b8, 0x3c281414, + 0x79a7dede, 0xe2bc5e5e, 0x1d160b0b, 0x76addbdb, + 0x3bdbe0e0, 0x56643232, 0x4e743a3a, 0x1e140a0a, + 0xdb924949, 0x0a0c0606, 0x6c482424, 0xe4b85c5c, + 0x5d9fc2c2, 0x6ebdd3d3, 0xef43acac, 0xa6c46262, + 0xa8399191, 0xa4319595, 0x37d3e4e4, 0x8bf27979, + 0x32d5e7e7, 0x438bc8c8, 0x596e3737, 0xb7da6d6d, + 0x8c018d8d, 0x64b1d5d5, 0xd29c4e4e, 0xe049a9a9, + 0xb4d86c6c, 0xfaac5656, 0x07f3f4f4, 0x25cfeaea, + 0xafca6565, 0x8ef47a7a, 0xe947aeae, 0x18100808, + 0xd56fbaba, 0x88f07878, 0x6f4a2525, 0x725c2e2e, + 0x24381c1c, 0xf157a6a6, 0xc773b4b4, 0x5197c6c6, + 0x23cbe8e8, 0x7ca1dddd, 0x9ce87474, 0x213e1f1f, + 0xdd964b4b, 0xdc61bdbd, 0x860d8b8b, 0x850f8a8a, + 0x90e07070, 0x427c3e3e, 0xc471b5b5, 0xaacc6666, + 0xd8904848, 0x05060303, 0x01f7f6f6, 0x121c0e0e, + 0xa3c26161, 0x5f6a3535, 0xf9ae5757, 0xd069b9b9, + 0x91178686, 0x5899c1c1, 0x273a1d1d, 0xb9279e9e, + 0x38d9e1e1, 0x13ebf8f8, 0xb32b9898, 0x33221111, + 0xbbd26969, 0x70a9d9d9, 0x89078e8e, 0xa7339494, + 0xb62d9b9b, 0x223c1e1e, 0x92158787, 0x20c9e9e9, + 0x4987cece, 0xffaa5555, 0x78502828, 0x7aa5dfdf, + 0x8f038c8c, 0xf859a1a1, 0x80098989, 0x171a0d0d, + 0xda65bfbf, 0x31d7e6e6, 0xc6844242, 0xb8d06868, + 0xc3824141, 0xb0299999, 0x775a2d2d, 0x111e0f0f, + 0xcb7bb0b0, 0xfca85454, 0xd66dbbbb, 0x3a2c1616, +}; + +__device__ __constant__ u32 te2[256] = +{ + 0x63a5c663, 0x7c84f87c, 0x7799ee77, 0x7b8df67b, + 0xf20dfff2, 0x6bbdd66b, 0x6fb1de6f, 0xc55491c5, + 0x30506030, 0x01030201, 0x67a9ce67, 0x2b7d562b, + 0xfe19e7fe, 0xd762b5d7, 0xabe64dab, 0x769aec76, + 0xca458fca, 0x829d1f82, 0xc94089c9, 0x7d87fa7d, + 0xfa15effa, 0x59ebb259, 0x47c98e47, 0xf00bfbf0, + 0xadec41ad, 0xd467b3d4, 0xa2fd5fa2, 0xafea45af, + 0x9cbf239c, 0xa4f753a4, 0x7296e472, 0xc05b9bc0, + 0xb7c275b7, 0xfd1ce1fd, 0x93ae3d93, 0x266a4c26, + 0x365a6c36, 0x3f417e3f, 0xf702f5f7, 0xcc4f83cc, + 0x345c6834, 0xa5f451a5, 0xe534d1e5, 0xf108f9f1, + 0x7193e271, 0xd873abd8, 0x31536231, 0x153f2a15, + 0x040c0804, 0xc75295c7, 0x23654623, 0xc35e9dc3, + 0x18283018, 0x96a13796, 0x050f0a05, 0x9ab52f9a, + 0x07090e07, 0x12362412, 0x809b1b80, 0xe23ddfe2, + 0xeb26cdeb, 0x27694e27, 0xb2cd7fb2, 0x759fea75, + 0x091b1209, 0x839e1d83, 0x2c74582c, 0x1a2e341a, + 0x1b2d361b, 0x6eb2dc6e, 0x5aeeb45a, 0xa0fb5ba0, + 0x52f6a452, 0x3b4d763b, 0xd661b7d6, 0xb3ce7db3, + 0x297b5229, 0xe33edde3, 0x2f715e2f, 0x84971384, + 0x53f5a653, 0xd168b9d1, 0x00000000, 0xed2cc1ed, + 0x20604020, 0xfc1fe3fc, 0xb1c879b1, 0x5bedb65b, + 0x6abed46a, 0xcb468dcb, 0xbed967be, 0x394b7239, + 0x4ade944a, 0x4cd4984c, 0x58e8b058, 0xcf4a85cf, + 0xd06bbbd0, 0xef2ac5ef, 0xaae54faa, 0xfb16edfb, + 0x43c58643, 0x4dd79a4d, 0x33556633, 0x85941185, + 0x45cf8a45, 0xf910e9f9, 0x02060402, 0x7f81fe7f, + 0x50f0a050, 0x3c44783c, 0x9fba259f, 0xa8e34ba8, + 0x51f3a251, 0xa3fe5da3, 0x40c08040, 0x8f8a058f, + 0x92ad3f92, 0x9dbc219d, 0x38487038, 0xf504f1f5, + 0xbcdf63bc, 0xb6c177b6, 0xda75afda, 0x21634221, + 0x10302010, 0xff1ae5ff, 0xf30efdf3, 0xd26dbfd2, + 0xcd4c81cd, 0x0c14180c, 0x13352613, 0xec2fc3ec, + 0x5fe1be5f, 0x97a23597, 0x44cc8844, 0x17392e17, + 0xc45793c4, 0xa7f255a7, 0x7e82fc7e, 0x3d477a3d, + 0x64acc864, 0x5de7ba5d, 0x192b3219, 0x7395e673, + 0x60a0c060, 0x81981981, 0x4fd19e4f, 0xdc7fa3dc, + 0x22664422, 0x2a7e542a, 0x90ab3b90, 0x88830b88, + 0x46ca8c46, 0xee29c7ee, 0xb8d36bb8, 0x143c2814, + 0xde79a7de, 0x5ee2bc5e, 0x0b1d160b, 0xdb76addb, + 0xe03bdbe0, 0x32566432, 0x3a4e743a, 0x0a1e140a, + 0x49db9249, 0x060a0c06, 0x246c4824, 0x5ce4b85c, + 0xc25d9fc2, 0xd36ebdd3, 0xacef43ac, 0x62a6c462, + 0x91a83991, 0x95a43195, 0xe437d3e4, 0x798bf279, + 0xe732d5e7, 0xc8438bc8, 0x37596e37, 0x6db7da6d, + 0x8d8c018d, 0xd564b1d5, 0x4ed29c4e, 0xa9e049a9, + 0x6cb4d86c, 0x56faac56, 0xf407f3f4, 0xea25cfea, + 0x65afca65, 0x7a8ef47a, 0xaee947ae, 0x08181008, + 0xbad56fba, 0x7888f078, 0x256f4a25, 0x2e725c2e, + 0x1c24381c, 0xa6f157a6, 0xb4c773b4, 0xc65197c6, + 0xe823cbe8, 0xdd7ca1dd, 0x749ce874, 0x1f213e1f, + 0x4bdd964b, 0xbddc61bd, 0x8b860d8b, 0x8a850f8a, + 0x7090e070, 0x3e427c3e, 0xb5c471b5, 0x66aacc66, + 0x48d89048, 0x03050603, 0xf601f7f6, 0x0e121c0e, + 0x61a3c261, 0x355f6a35, 0x57f9ae57, 0xb9d069b9, + 0x86911786, 0xc15899c1, 0x1d273a1d, 0x9eb9279e, + 0xe138d9e1, 0xf813ebf8, 0x98b32b98, 0x11332211, + 0x69bbd269, 0xd970a9d9, 0x8e89078e, 0x94a73394, + 0x9bb62d9b, 0x1e223c1e, 0x87921587, 0xe920c9e9, + 0xce4987ce, 0x55ffaa55, 0x28785028, 0xdf7aa5df, + 0x8c8f038c, 0xa1f859a1, 0x89800989, 0x0d171a0d, + 0xbfda65bf, 0xe631d7e6, 0x42c68442, 0x68b8d068, + 0x41c38241, 0x99b02999, 0x2d775a2d, 0x0f111e0f, + 0xb0cb7bb0, 0x54fca854, 0xbbd66dbb, 0x163a2c16, +}; + +__device__ __constant__ u32 te3[256] = +{ + 0x6363a5c6, 0x7c7c84f8, 0x777799ee, 0x7b7b8df6, + 0xf2f20dff, 0x6b6bbdd6, 0x6f6fb1de, 0xc5c55491, + 0x30305060, 0x01010302, 0x6767a9ce, 0x2b2b7d56, + 0xfefe19e7, 0xd7d762b5, 0xababe64d, 0x76769aec, + 0xcaca458f, 0x82829d1f, 0xc9c94089, 0x7d7d87fa, + 0xfafa15ef, 0x5959ebb2, 0x4747c98e, 0xf0f00bfb, + 0xadadec41, 0xd4d467b3, 0xa2a2fd5f, 0xafafea45, + 0x9c9cbf23, 0xa4a4f753, 0x727296e4, 0xc0c05b9b, + 0xb7b7c275, 0xfdfd1ce1, 0x9393ae3d, 0x26266a4c, + 0x36365a6c, 0x3f3f417e, 0xf7f702f5, 0xcccc4f83, + 0x34345c68, 0xa5a5f451, 0xe5e534d1, 0xf1f108f9, + 0x717193e2, 0xd8d873ab, 0x31315362, 0x15153f2a, + 0x04040c08, 0xc7c75295, 0x23236546, 0xc3c35e9d, + 0x18182830, 0x9696a137, 0x05050f0a, 0x9a9ab52f, + 0x0707090e, 0x12123624, 0x80809b1b, 0xe2e23ddf, + 0xebeb26cd, 0x2727694e, 0xb2b2cd7f, 0x75759fea, + 0x09091b12, 0x83839e1d, 0x2c2c7458, 0x1a1a2e34, + 0x1b1b2d36, 0x6e6eb2dc, 0x5a5aeeb4, 0xa0a0fb5b, + 0x5252f6a4, 0x3b3b4d76, 0xd6d661b7, 0xb3b3ce7d, + 0x29297b52, 0xe3e33edd, 0x2f2f715e, 0x84849713, + 0x5353f5a6, 0xd1d168b9, 0x00000000, 0xeded2cc1, + 0x20206040, 0xfcfc1fe3, 0xb1b1c879, 0x5b5bedb6, + 0x6a6abed4, 0xcbcb468d, 0xbebed967, 0x39394b72, + 0x4a4ade94, 0x4c4cd498, 0x5858e8b0, 0xcfcf4a85, + 0xd0d06bbb, 0xefef2ac5, 0xaaaae54f, 0xfbfb16ed, + 0x4343c586, 0x4d4dd79a, 0x33335566, 0x85859411, + 0x4545cf8a, 0xf9f910e9, 0x02020604, 0x7f7f81fe, + 0x5050f0a0, 0x3c3c4478, 0x9f9fba25, 0xa8a8e34b, + 0x5151f3a2, 0xa3a3fe5d, 0x4040c080, 0x8f8f8a05, + 0x9292ad3f, 0x9d9dbc21, 0x38384870, 0xf5f504f1, + 0xbcbcdf63, 0xb6b6c177, 0xdada75af, 0x21216342, + 0x10103020, 0xffff1ae5, 0xf3f30efd, 0xd2d26dbf, + 0xcdcd4c81, 0x0c0c1418, 0x13133526, 0xecec2fc3, + 0x5f5fe1be, 0x9797a235, 0x4444cc88, 0x1717392e, + 0xc4c45793, 0xa7a7f255, 0x7e7e82fc, 0x3d3d477a, + 0x6464acc8, 0x5d5de7ba, 0x19192b32, 0x737395e6, + 0x6060a0c0, 0x81819819, 0x4f4fd19e, 0xdcdc7fa3, + 0x22226644, 0x2a2a7e54, 0x9090ab3b, 0x8888830b, + 0x4646ca8c, 0xeeee29c7, 0xb8b8d36b, 0x14143c28, + 0xdede79a7, 0x5e5ee2bc, 0x0b0b1d16, 0xdbdb76ad, + 0xe0e03bdb, 0x32325664, 0x3a3a4e74, 0x0a0a1e14, + 0x4949db92, 0x06060a0c, 0x24246c48, 0x5c5ce4b8, + 0xc2c25d9f, 0xd3d36ebd, 0xacacef43, 0x6262a6c4, + 0x9191a839, 0x9595a431, 0xe4e437d3, 0x79798bf2, + 0xe7e732d5, 0xc8c8438b, 0x3737596e, 0x6d6db7da, + 0x8d8d8c01, 0xd5d564b1, 0x4e4ed29c, 0xa9a9e049, + 0x6c6cb4d8, 0x5656faac, 0xf4f407f3, 0xeaea25cf, + 0x6565afca, 0x7a7a8ef4, 0xaeaee947, 0x08081810, + 0xbabad56f, 0x787888f0, 0x25256f4a, 0x2e2e725c, + 0x1c1c2438, 0xa6a6f157, 0xb4b4c773, 0xc6c65197, + 0xe8e823cb, 0xdddd7ca1, 0x74749ce8, 0x1f1f213e, + 0x4b4bdd96, 0xbdbddc61, 0x8b8b860d, 0x8a8a850f, + 0x707090e0, 0x3e3e427c, 0xb5b5c471, 0x6666aacc, + 0x4848d890, 0x03030506, 0xf6f601f7, 0x0e0e121c, + 0x6161a3c2, 0x35355f6a, 0x5757f9ae, 0xb9b9d069, + 0x86869117, 0xc1c15899, 0x1d1d273a, 0x9e9eb927, + 0xe1e138d9, 0xf8f813eb, 0x9898b32b, 0x11113322, + 0x6969bbd2, 0xd9d970a9, 0x8e8e8907, 0x9494a733, + 0x9b9bb62d, 0x1e1e223c, 0x87879215, 0xe9e920c9, + 0xcece4987, 0x5555ffaa, 0x28287850, 0xdfdf7aa5, + 0x8c8c8f03, 0xa1a1f859, 0x89898009, 0x0d0d171a, + 0xbfbfda65, 0xe6e631d7, 0x4242c684, 0x6868b8d0, + 0x4141c382, 0x9999b029, 0x2d2d775a, 0x0f0f111e, + 0xb0b0cb7b, 0x5454fca8, 0xbbbbd66d, 0x16163a2c, +}; + +__device__ __constant__ u32 te4[256] = +{ + 0x63636363, 0x7c7c7c7c, 0x77777777, 0x7b7b7b7b, + 0xf2f2f2f2, 0x6b6b6b6b, 0x6f6f6f6f, 0xc5c5c5c5, + 0x30303030, 0x01010101, 0x67676767, 0x2b2b2b2b, + 0xfefefefe, 0xd7d7d7d7, 0xabababab, 0x76767676, + 0xcacacaca, 0x82828282, 0xc9c9c9c9, 0x7d7d7d7d, + 0xfafafafa, 0x59595959, 0x47474747, 0xf0f0f0f0, + 0xadadadad, 0xd4d4d4d4, 0xa2a2a2a2, 0xafafafaf, + 0x9c9c9c9c, 0xa4a4a4a4, 0x72727272, 0xc0c0c0c0, + 0xb7b7b7b7, 0xfdfdfdfd, 0x93939393, 0x26262626, + 0x36363636, 0x3f3f3f3f, 0xf7f7f7f7, 0xcccccccc, + 0x34343434, 0xa5a5a5a5, 0xe5e5e5e5, 0xf1f1f1f1, + 0x71717171, 0xd8d8d8d8, 0x31313131, 0x15151515, + 0x04040404, 0xc7c7c7c7, 0x23232323, 0xc3c3c3c3, + 0x18181818, 0x96969696, 0x05050505, 0x9a9a9a9a, + 0x07070707, 0x12121212, 0x80808080, 0xe2e2e2e2, + 0xebebebeb, 0x27272727, 0xb2b2b2b2, 0x75757575, + 0x09090909, 0x83838383, 0x2c2c2c2c, 0x1a1a1a1a, + 0x1b1b1b1b, 0x6e6e6e6e, 0x5a5a5a5a, 0xa0a0a0a0, + 0x52525252, 0x3b3b3b3b, 0xd6d6d6d6, 0xb3b3b3b3, + 0x29292929, 0xe3e3e3e3, 0x2f2f2f2f, 0x84848484, + 0x53535353, 0xd1d1d1d1, 0x00000000, 0xedededed, + 0x20202020, 0xfcfcfcfc, 0xb1b1b1b1, 0x5b5b5b5b, + 0x6a6a6a6a, 0xcbcbcbcb, 0xbebebebe, 0x39393939, + 0x4a4a4a4a, 0x4c4c4c4c, 0x58585858, 0xcfcfcfcf, + 0xd0d0d0d0, 0xefefefef, 0xaaaaaaaa, 0xfbfbfbfb, + 0x43434343, 0x4d4d4d4d, 0x33333333, 0x85858585, + 0x45454545, 0xf9f9f9f9, 0x02020202, 0x7f7f7f7f, + 0x50505050, 0x3c3c3c3c, 0x9f9f9f9f, 0xa8a8a8a8, + 0x51515151, 0xa3a3a3a3, 0x40404040, 0x8f8f8f8f, + 0x92929292, 0x9d9d9d9d, 0x38383838, 0xf5f5f5f5, + 0xbcbcbcbc, 0xb6b6b6b6, 0xdadadada, 0x21212121, + 0x10101010, 0xffffffff, 0xf3f3f3f3, 0xd2d2d2d2, + 0xcdcdcdcd, 0x0c0c0c0c, 0x13131313, 0xecececec, + 0x5f5f5f5f, 0x97979797, 0x44444444, 0x17171717, + 0xc4c4c4c4, 0xa7a7a7a7, 0x7e7e7e7e, 0x3d3d3d3d, + 0x64646464, 0x5d5d5d5d, 0x19191919, 0x73737373, + 0x60606060, 0x81818181, 0x4f4f4f4f, 0xdcdcdcdc, + 0x22222222, 0x2a2a2a2a, 0x90909090, 0x88888888, + 0x46464646, 0xeeeeeeee, 0xb8b8b8b8, 0x14141414, + 0xdededede, 0x5e5e5e5e, 0x0b0b0b0b, 0xdbdbdbdb, + 0xe0e0e0e0, 0x32323232, 0x3a3a3a3a, 0x0a0a0a0a, + 0x49494949, 0x06060606, 0x24242424, 0x5c5c5c5c, + 0xc2c2c2c2, 0xd3d3d3d3, 0xacacacac, 0x62626262, + 0x91919191, 0x95959595, 0xe4e4e4e4, 0x79797979, + 0xe7e7e7e7, 0xc8c8c8c8, 0x37373737, 0x6d6d6d6d, + 0x8d8d8d8d, 0xd5d5d5d5, 0x4e4e4e4e, 0xa9a9a9a9, + 0x6c6c6c6c, 0x56565656, 0xf4f4f4f4, 0xeaeaeaea, + 0x65656565, 0x7a7a7a7a, 0xaeaeaeae, 0x08080808, + 0xbabababa, 0x78787878, 0x25252525, 0x2e2e2e2e, + 0x1c1c1c1c, 0xa6a6a6a6, 0xb4b4b4b4, 0xc6c6c6c6, + 0xe8e8e8e8, 0xdddddddd, 0x74747474, 0x1f1f1f1f, + 0x4b4b4b4b, 0xbdbdbdbd, 0x8b8b8b8b, 0x8a8a8a8a, + 0x70707070, 0x3e3e3e3e, 0xb5b5b5b5, 0x66666666, + 0x48484848, 0x03030303, 0xf6f6f6f6, 0x0e0e0e0e, + 0x61616161, 0x35353535, 0x57575757, 0xb9b9b9b9, + 0x86868686, 0xc1c1c1c1, 0x1d1d1d1d, 0x9e9e9e9e, + 0xe1e1e1e1, 0xf8f8f8f8, 0x98989898, 0x11111111, + 0x69696969, 0xd9d9d9d9, 0x8e8e8e8e, 0x94949494, + 0x9b9b9b9b, 0x1e1e1e1e, 0x87878787, 0xe9e9e9e9, + 0xcececece, 0x55555555, 0x28282828, 0xdfdfdfdf, + 0x8c8c8c8c, 0xa1a1a1a1, 0x89898989, 0x0d0d0d0d, + 0xbfbfbfbf, 0xe6e6e6e6, 0x42424242, 0x68686868, + 0x41414141, 0x99999999, 0x2d2d2d2d, 0x0f0f0f0f, + 0xb0b0b0b0, 0x54545454, 0xbbbbbbbb, 0x16161616, +}; + +__device__ __constant__ u32 td0[256] = +{ + 0x51f4a750, 0x7e416553, 0x1a17a4c3, 0x3a275e96, + 0x3bab6bcb, 0x1f9d45f1, 0xacfa58ab, 0x4be30393, + 0x2030fa55, 0xad766df6, 0x88cc7691, 0xf5024c25, + 0x4fe5d7fc, 0xc52acbd7, 0x26354480, 0xb562a38f, + 0xdeb15a49, 0x25ba1b67, 0x45ea0e98, 0x5dfec0e1, + 0xc32f7502, 0x814cf012, 0x8d4697a3, 0x6bd3f9c6, + 0x038f5fe7, 0x15929c95, 0xbf6d7aeb, 0x955259da, + 0xd4be832d, 0x587421d3, 0x49e06929, 0x8ec9c844, + 0x75c2896a, 0xf48e7978, 0x99583e6b, 0x27b971dd, + 0xbee14fb6, 0xf088ad17, 0xc920ac66, 0x7dce3ab4, + 0x63df4a18, 0xe51a3182, 0x97513360, 0x62537f45, + 0xb16477e0, 0xbb6bae84, 0xfe81a01c, 0xf9082b94, + 0x70486858, 0x8f45fd19, 0x94de6c87, 0x527bf8b7, + 0xab73d323, 0x724b02e2, 0xe31f8f57, 0x6655ab2a, + 0xb2eb2807, 0x2fb5c203, 0x86c57b9a, 0xd33708a5, + 0x302887f2, 0x23bfa5b2, 0x02036aba, 0xed16825c, + 0x8acf1c2b, 0xa779b492, 0xf307f2f0, 0x4e69e2a1, + 0x65daf4cd, 0x0605bed5, 0xd134621f, 0xc4a6fe8a, + 0x342e539d, 0xa2f355a0, 0x058ae132, 0xa4f6eb75, + 0x0b83ec39, 0x4060efaa, 0x5e719f06, 0xbd6e1051, + 0x3e218af9, 0x96dd063d, 0xdd3e05ae, 0x4de6bd46, + 0x91548db5, 0x71c45d05, 0x0406d46f, 0x605015ff, + 0x1998fb24, 0xd6bde997, 0x894043cc, 0x67d99e77, + 0xb0e842bd, 0x07898b88, 0xe7195b38, 0x79c8eedb, + 0xa17c0a47, 0x7c420fe9, 0xf8841ec9, 0x00000000, + 0x09808683, 0x322bed48, 0x1e1170ac, 0x6c5a724e, + 0xfd0efffb, 0x0f853856, 0x3daed51e, 0x362d3927, + 0x0a0fd964, 0x685ca621, 0x9b5b54d1, 0x24362e3a, + 0x0c0a67b1, 0x9357e70f, 0xb4ee96d2, 0x1b9b919e, + 0x80c0c54f, 0x61dc20a2, 0x5a774b69, 0x1c121a16, + 0xe293ba0a, 0xc0a02ae5, 0x3c22e043, 0x121b171d, + 0x0e090d0b, 0xf28bc7ad, 0x2db6a8b9, 0x141ea9c8, + 0x57f11985, 0xaf75074c, 0xee99ddbb, 0xa37f60fd, + 0xf701269f, 0x5c72f5bc, 0x44663bc5, 0x5bfb7e34, + 0x8b432976, 0xcb23c6dc, 0xb6edfc68, 0xb8e4f163, + 0xd731dcca, 0x42638510, 0x13972240, 0x84c61120, + 0x854a247d, 0xd2bb3df8, 0xaef93211, 0xc729a16d, + 0x1d9e2f4b, 0xdcb230f3, 0x0d8652ec, 0x77c1e3d0, + 0x2bb3166c, 0xa970b999, 0x119448fa, 0x47e96422, + 0xa8fc8cc4, 0xa0f03f1a, 0x567d2cd8, 0x223390ef, + 0x87494ec7, 0xd938d1c1, 0x8ccaa2fe, 0x98d40b36, + 0xa6f581cf, 0xa57ade28, 0xdab78e26, 0x3fadbfa4, + 0x2c3a9de4, 0x5078920d, 0x6a5fcc9b, 0x547e4662, + 0xf68d13c2, 0x90d8b8e8, 0x2e39f75e, 0x82c3aff5, + 0x9f5d80be, 0x69d0937c, 0x6fd52da9, 0xcf2512b3, + 0xc8ac993b, 0x10187da7, 0xe89c636e, 0xdb3bbb7b, + 0xcd267809, 0x6e5918f4, 0xec9ab701, 0x834f9aa8, + 0xe6956e65, 0xaaffe67e, 0x21bccf08, 0xef15e8e6, + 0xbae79bd9, 0x4a6f36ce, 0xea9f09d4, 0x29b07cd6, + 0x31a4b2af, 0x2a3f2331, 0xc6a59430, 0x35a266c0, + 0x744ebc37, 0xfc82caa6, 0xe090d0b0, 0x33a7d815, + 0xf104984a, 0x41ecdaf7, 0x7fcd500e, 0x1791f62f, + 0x764dd68d, 0x43efb04d, 0xccaa4d54, 0xe49604df, + 0x9ed1b5e3, 0x4c6a881b, 0xc12c1fb8, 0x4665517f, + 0x9d5eea04, 0x018c355d, 0xfa877473, 0xfb0b412e, + 0xb3671d5a, 0x92dbd252, 0xe9105633, 0x6dd64713, + 0x9ad7618c, 0x37a10c7a, 0x59f8148e, 0xeb133c89, + 0xcea927ee, 0xb761c935, 0xe11ce5ed, 0x7a47b13c, + 0x9cd2df59, 0x55f2733f, 0x1814ce79, 0x73c737bf, + 0x53f7cdea, 0x5ffdaa5b, 0xdf3d6f14, 0x7844db86, + 0xcaaff381, 0xb968c43e, 0x3824342c, 0xc2a3405f, + 0x161dc372, 0xbce2250c, 0x283c498b, 0xff0d9541, + 0x39a80171, 0x080cb3de, 0xd8b4e49c, 0x6456c190, + 0x7bcb8461, 0xd532b670, 0x486c5c74, 0xd0b85742, +}; + +__device__ __constant__ u32 td1[256] = +{ + 0x5051f4a7, 0x537e4165, 0xc31a17a4, 0x963a275e, + 0xcb3bab6b, 0xf11f9d45, 0xabacfa58, 0x934be303, + 0x552030fa, 0xf6ad766d, 0x9188cc76, 0x25f5024c, + 0xfc4fe5d7, 0xd7c52acb, 0x80263544, 0x8fb562a3, + 0x49deb15a, 0x6725ba1b, 0x9845ea0e, 0xe15dfec0, + 0x02c32f75, 0x12814cf0, 0xa38d4697, 0xc66bd3f9, + 0xe7038f5f, 0x9515929c, 0xebbf6d7a, 0xda955259, + 0x2dd4be83, 0xd3587421, 0x2949e069, 0x448ec9c8, + 0x6a75c289, 0x78f48e79, 0x6b99583e, 0xdd27b971, + 0xb6bee14f, 0x17f088ad, 0x66c920ac, 0xb47dce3a, + 0x1863df4a, 0x82e51a31, 0x60975133, 0x4562537f, + 0xe0b16477, 0x84bb6bae, 0x1cfe81a0, 0x94f9082b, + 0x58704868, 0x198f45fd, 0x8794de6c, 0xb7527bf8, + 0x23ab73d3, 0xe2724b02, 0x57e31f8f, 0x2a6655ab, + 0x07b2eb28, 0x032fb5c2, 0x9a86c57b, 0xa5d33708, + 0xf2302887, 0xb223bfa5, 0xba02036a, 0x5ced1682, + 0x2b8acf1c, 0x92a779b4, 0xf0f307f2, 0xa14e69e2, + 0xcd65daf4, 0xd50605be, 0x1fd13462, 0x8ac4a6fe, + 0x9d342e53, 0xa0a2f355, 0x32058ae1, 0x75a4f6eb, + 0x390b83ec, 0xaa4060ef, 0x065e719f, 0x51bd6e10, + 0xf93e218a, 0x3d96dd06, 0xaedd3e05, 0x464de6bd, + 0xb591548d, 0x0571c45d, 0x6f0406d4, 0xff605015, + 0x241998fb, 0x97d6bde9, 0xcc894043, 0x7767d99e, + 0xbdb0e842, 0x8807898b, 0x38e7195b, 0xdb79c8ee, + 0x47a17c0a, 0xe97c420f, 0xc9f8841e, 0x00000000, + 0x83098086, 0x48322bed, 0xac1e1170, 0x4e6c5a72, + 0xfbfd0eff, 0x560f8538, 0x1e3daed5, 0x27362d39, + 0x640a0fd9, 0x21685ca6, 0xd19b5b54, 0x3a24362e, + 0xb10c0a67, 0x0f9357e7, 0xd2b4ee96, 0x9e1b9b91, + 0x4f80c0c5, 0xa261dc20, 0x695a774b, 0x161c121a, + 0x0ae293ba, 0xe5c0a02a, 0x433c22e0, 0x1d121b17, + 0x0b0e090d, 0xadf28bc7, 0xb92db6a8, 0xc8141ea9, + 0x8557f119, 0x4caf7507, 0xbbee99dd, 0xfda37f60, + 0x9ff70126, 0xbc5c72f5, 0xc544663b, 0x345bfb7e, + 0x768b4329, 0xdccb23c6, 0x68b6edfc, 0x63b8e4f1, + 0xcad731dc, 0x10426385, 0x40139722, 0x2084c611, + 0x7d854a24, 0xf8d2bb3d, 0x11aef932, 0x6dc729a1, + 0x4b1d9e2f, 0xf3dcb230, 0xec0d8652, 0xd077c1e3, + 0x6c2bb316, 0x99a970b9, 0xfa119448, 0x2247e964, + 0xc4a8fc8c, 0x1aa0f03f, 0xd8567d2c, 0xef223390, + 0xc787494e, 0xc1d938d1, 0xfe8ccaa2, 0x3698d40b, + 0xcfa6f581, 0x28a57ade, 0x26dab78e, 0xa43fadbf, + 0xe42c3a9d, 0x0d507892, 0x9b6a5fcc, 0x62547e46, + 0xc2f68d13, 0xe890d8b8, 0x5e2e39f7, 0xf582c3af, + 0xbe9f5d80, 0x7c69d093, 0xa96fd52d, 0xb3cf2512, + 0x3bc8ac99, 0xa710187d, 0x6ee89c63, 0x7bdb3bbb, + 0x09cd2678, 0xf46e5918, 0x01ec9ab7, 0xa8834f9a, + 0x65e6956e, 0x7eaaffe6, 0x0821bccf, 0xe6ef15e8, + 0xd9bae79b, 0xce4a6f36, 0xd4ea9f09, 0xd629b07c, + 0xaf31a4b2, 0x312a3f23, 0x30c6a594, 0xc035a266, + 0x37744ebc, 0xa6fc82ca, 0xb0e090d0, 0x1533a7d8, + 0x4af10498, 0xf741ecda, 0x0e7fcd50, 0x2f1791f6, + 0x8d764dd6, 0x4d43efb0, 0x54ccaa4d, 0xdfe49604, + 0xe39ed1b5, 0x1b4c6a88, 0xb8c12c1f, 0x7f466551, + 0x049d5eea, 0x5d018c35, 0x73fa8774, 0x2efb0b41, + 0x5ab3671d, 0x5292dbd2, 0x33e91056, 0x136dd647, + 0x8c9ad761, 0x7a37a10c, 0x8e59f814, 0x89eb133c, + 0xeecea927, 0x35b761c9, 0xede11ce5, 0x3c7a47b1, + 0x599cd2df, 0x3f55f273, 0x791814ce, 0xbf73c737, + 0xea53f7cd, 0x5b5ffdaa, 0x14df3d6f, 0x867844db, + 0x81caaff3, 0x3eb968c4, 0x2c382434, 0x5fc2a340, + 0x72161dc3, 0x0cbce225, 0x8b283c49, 0x41ff0d95, + 0x7139a801, 0xde080cb3, 0x9cd8b4e4, 0x906456c1, + 0x617bcb84, 0x70d532b6, 0x74486c5c, 0x42d0b857, +}; + +__device__ __constant__ u32 td2[256] = +{ + 0xa75051f4, 0x65537e41, 0xa4c31a17, 0x5e963a27, + 0x6bcb3bab, 0x45f11f9d, 0x58abacfa, 0x03934be3, + 0xfa552030, 0x6df6ad76, 0x769188cc, 0x4c25f502, + 0xd7fc4fe5, 0xcbd7c52a, 0x44802635, 0xa38fb562, + 0x5a49deb1, 0x1b6725ba, 0x0e9845ea, 0xc0e15dfe, + 0x7502c32f, 0xf012814c, 0x97a38d46, 0xf9c66bd3, + 0x5fe7038f, 0x9c951592, 0x7aebbf6d, 0x59da9552, + 0x832dd4be, 0x21d35874, 0x692949e0, 0xc8448ec9, + 0x896a75c2, 0x7978f48e, 0x3e6b9958, 0x71dd27b9, + 0x4fb6bee1, 0xad17f088, 0xac66c920, 0x3ab47dce, + 0x4a1863df, 0x3182e51a, 0x33609751, 0x7f456253, + 0x77e0b164, 0xae84bb6b, 0xa01cfe81, 0x2b94f908, + 0x68587048, 0xfd198f45, 0x6c8794de, 0xf8b7527b, + 0xd323ab73, 0x02e2724b, 0x8f57e31f, 0xab2a6655, + 0x2807b2eb, 0xc2032fb5, 0x7b9a86c5, 0x08a5d337, + 0x87f23028, 0xa5b223bf, 0x6aba0203, 0x825ced16, + 0x1c2b8acf, 0xb492a779, 0xf2f0f307, 0xe2a14e69, + 0xf4cd65da, 0xbed50605, 0x621fd134, 0xfe8ac4a6, + 0x539d342e, 0x55a0a2f3, 0xe132058a, 0xeb75a4f6, + 0xec390b83, 0xefaa4060, 0x9f065e71, 0x1051bd6e, + 0x8af93e21, 0x063d96dd, 0x05aedd3e, 0xbd464de6, + 0x8db59154, 0x5d0571c4, 0xd46f0406, 0x15ff6050, + 0xfb241998, 0xe997d6bd, 0x43cc8940, 0x9e7767d9, + 0x42bdb0e8, 0x8b880789, 0x5b38e719, 0xeedb79c8, + 0x0a47a17c, 0x0fe97c42, 0x1ec9f884, 0x00000000, + 0x86830980, 0xed48322b, 0x70ac1e11, 0x724e6c5a, + 0xfffbfd0e, 0x38560f85, 0xd51e3dae, 0x3927362d, + 0xd9640a0f, 0xa621685c, 0x54d19b5b, 0x2e3a2436, + 0x67b10c0a, 0xe70f9357, 0x96d2b4ee, 0x919e1b9b, + 0xc54f80c0, 0x20a261dc, 0x4b695a77, 0x1a161c12, + 0xba0ae293, 0x2ae5c0a0, 0xe0433c22, 0x171d121b, + 0x0d0b0e09, 0xc7adf28b, 0xa8b92db6, 0xa9c8141e, + 0x198557f1, 0x074caf75, 0xddbbee99, 0x60fda37f, + 0x269ff701, 0xf5bc5c72, 0x3bc54466, 0x7e345bfb, + 0x29768b43, 0xc6dccb23, 0xfc68b6ed, 0xf163b8e4, + 0xdccad731, 0x85104263, 0x22401397, 0x112084c6, + 0x247d854a, 0x3df8d2bb, 0x3211aef9, 0xa16dc729, + 0x2f4b1d9e, 0x30f3dcb2, 0x52ec0d86, 0xe3d077c1, + 0x166c2bb3, 0xb999a970, 0x48fa1194, 0x642247e9, + 0x8cc4a8fc, 0x3f1aa0f0, 0x2cd8567d, 0x90ef2233, + 0x4ec78749, 0xd1c1d938, 0xa2fe8cca, 0x0b3698d4, + 0x81cfa6f5, 0xde28a57a, 0x8e26dab7, 0xbfa43fad, + 0x9de42c3a, 0x920d5078, 0xcc9b6a5f, 0x4662547e, + 0x13c2f68d, 0xb8e890d8, 0xf75e2e39, 0xaff582c3, + 0x80be9f5d, 0x937c69d0, 0x2da96fd5, 0x12b3cf25, + 0x993bc8ac, 0x7da71018, 0x636ee89c, 0xbb7bdb3b, + 0x7809cd26, 0x18f46e59, 0xb701ec9a, 0x9aa8834f, + 0x6e65e695, 0xe67eaaff, 0xcf0821bc, 0xe8e6ef15, + 0x9bd9bae7, 0x36ce4a6f, 0x09d4ea9f, 0x7cd629b0, + 0xb2af31a4, 0x23312a3f, 0x9430c6a5, 0x66c035a2, + 0xbc37744e, 0xcaa6fc82, 0xd0b0e090, 0xd81533a7, + 0x984af104, 0xdaf741ec, 0x500e7fcd, 0xf62f1791, + 0xd68d764d, 0xb04d43ef, 0x4d54ccaa, 0x04dfe496, + 0xb5e39ed1, 0x881b4c6a, 0x1fb8c12c, 0x517f4665, + 0xea049d5e, 0x355d018c, 0x7473fa87, 0x412efb0b, + 0x1d5ab367, 0xd25292db, 0x5633e910, 0x47136dd6, + 0x618c9ad7, 0x0c7a37a1, 0x148e59f8, 0x3c89eb13, + 0x27eecea9, 0xc935b761, 0xe5ede11c, 0xb13c7a47, + 0xdf599cd2, 0x733f55f2, 0xce791814, 0x37bf73c7, + 0xcdea53f7, 0xaa5b5ffd, 0x6f14df3d, 0xdb867844, + 0xf381caaf, 0xc43eb968, 0x342c3824, 0x405fc2a3, + 0xc372161d, 0x250cbce2, 0x498b283c, 0x9541ff0d, + 0x017139a8, 0xb3de080c, 0xe49cd8b4, 0xc1906456, + 0x84617bcb, 0xb670d532, 0x5c74486c, 0x5742d0b8, +}; + +__device__ __constant__ u32 td3[256] = +{ + 0xf4a75051, 0x4165537e, 0x17a4c31a, 0x275e963a, + 0xab6bcb3b, 0x9d45f11f, 0xfa58abac, 0xe303934b, + 0x30fa5520, 0x766df6ad, 0xcc769188, 0x024c25f5, + 0xe5d7fc4f, 0x2acbd7c5, 0x35448026, 0x62a38fb5, + 0xb15a49de, 0xba1b6725, 0xea0e9845, 0xfec0e15d, + 0x2f7502c3, 0x4cf01281, 0x4697a38d, 0xd3f9c66b, + 0x8f5fe703, 0x929c9515, 0x6d7aebbf, 0x5259da95, + 0xbe832dd4, 0x7421d358, 0xe0692949, 0xc9c8448e, + 0xc2896a75, 0x8e7978f4, 0x583e6b99, 0xb971dd27, + 0xe14fb6be, 0x88ad17f0, 0x20ac66c9, 0xce3ab47d, + 0xdf4a1863, 0x1a3182e5, 0x51336097, 0x537f4562, + 0x6477e0b1, 0x6bae84bb, 0x81a01cfe, 0x082b94f9, + 0x48685870, 0x45fd198f, 0xde6c8794, 0x7bf8b752, + 0x73d323ab, 0x4b02e272, 0x1f8f57e3, 0x55ab2a66, + 0xeb2807b2, 0xb5c2032f, 0xc57b9a86, 0x3708a5d3, + 0x2887f230, 0xbfa5b223, 0x036aba02, 0x16825ced, + 0xcf1c2b8a, 0x79b492a7, 0x07f2f0f3, 0x69e2a14e, + 0xdaf4cd65, 0x05bed506, 0x34621fd1, 0xa6fe8ac4, + 0x2e539d34, 0xf355a0a2, 0x8ae13205, 0xf6eb75a4, + 0x83ec390b, 0x60efaa40, 0x719f065e, 0x6e1051bd, + 0x218af93e, 0xdd063d96, 0x3e05aedd, 0xe6bd464d, + 0x548db591, 0xc45d0571, 0x06d46f04, 0x5015ff60, + 0x98fb2419, 0xbde997d6, 0x4043cc89, 0xd99e7767, + 0xe842bdb0, 0x898b8807, 0x195b38e7, 0xc8eedb79, + 0x7c0a47a1, 0x420fe97c, 0x841ec9f8, 0x00000000, + 0x80868309, 0x2bed4832, 0x1170ac1e, 0x5a724e6c, + 0x0efffbfd, 0x8538560f, 0xaed51e3d, 0x2d392736, + 0x0fd9640a, 0x5ca62168, 0x5b54d19b, 0x362e3a24, + 0x0a67b10c, 0x57e70f93, 0xee96d2b4, 0x9b919e1b, + 0xc0c54f80, 0xdc20a261, 0x774b695a, 0x121a161c, + 0x93ba0ae2, 0xa02ae5c0, 0x22e0433c, 0x1b171d12, + 0x090d0b0e, 0x8bc7adf2, 0xb6a8b92d, 0x1ea9c814, + 0xf1198557, 0x75074caf, 0x99ddbbee, 0x7f60fda3, + 0x01269ff7, 0x72f5bc5c, 0x663bc544, 0xfb7e345b, + 0x4329768b, 0x23c6dccb, 0xedfc68b6, 0xe4f163b8, + 0x31dccad7, 0x63851042, 0x97224013, 0xc6112084, + 0x4a247d85, 0xbb3df8d2, 0xf93211ae, 0x29a16dc7, + 0x9e2f4b1d, 0xb230f3dc, 0x8652ec0d, 0xc1e3d077, + 0xb3166c2b, 0x70b999a9, 0x9448fa11, 0xe9642247, + 0xfc8cc4a8, 0xf03f1aa0, 0x7d2cd856, 0x3390ef22, + 0x494ec787, 0x38d1c1d9, 0xcaa2fe8c, 0xd40b3698, + 0xf581cfa6, 0x7ade28a5, 0xb78e26da, 0xadbfa43f, + 0x3a9de42c, 0x78920d50, 0x5fcc9b6a, 0x7e466254, + 0x8d13c2f6, 0xd8b8e890, 0x39f75e2e, 0xc3aff582, + 0x5d80be9f, 0xd0937c69, 0xd52da96f, 0x2512b3cf, + 0xac993bc8, 0x187da710, 0x9c636ee8, 0x3bbb7bdb, + 0x267809cd, 0x5918f46e, 0x9ab701ec, 0x4f9aa883, + 0x956e65e6, 0xffe67eaa, 0xbccf0821, 0x15e8e6ef, + 0xe79bd9ba, 0x6f36ce4a, 0x9f09d4ea, 0xb07cd629, + 0xa4b2af31, 0x3f23312a, 0xa59430c6, 0xa266c035, + 0x4ebc3774, 0x82caa6fc, 0x90d0b0e0, 0xa7d81533, + 0x04984af1, 0xecdaf741, 0xcd500e7f, 0x91f62f17, + 0x4dd68d76, 0xefb04d43, 0xaa4d54cc, 0x9604dfe4, + 0xd1b5e39e, 0x6a881b4c, 0x2c1fb8c1, 0x65517f46, + 0x5eea049d, 0x8c355d01, 0x877473fa, 0x0b412efb, + 0x671d5ab3, 0xdbd25292, 0x105633e9, 0xd647136d, + 0xd7618c9a, 0xa10c7a37, 0xf8148e59, 0x133c89eb, + 0xa927eece, 0x61c935b7, 0x1ce5ede1, 0x47b13c7a, + 0xd2df599c, 0xf2733f55, 0x14ce7918, 0xc737bf73, + 0xf7cdea53, 0xfdaa5b5f, 0x3d6f14df, 0x44db8678, + 0xaff381ca, 0x68c43eb9, 0x24342c38, 0xa3405fc2, + 0x1dc37216, 0xe2250cbc, 0x3c498b28, 0x0d9541ff, + 0xa8017139, 0x0cb3de08, 0xb4e49cd8, 0x56c19064, + 0xcb84617b, 0x32b670d5, 0x6c5c7448, 0xb85742d0, +}; + +__device__ __constant__ u32 td4[256] = +{ + 0x52525252, 0x09090909, 0x6a6a6a6a, 0xd5d5d5d5, + 0x30303030, 0x36363636, 0xa5a5a5a5, 0x38383838, + 0xbfbfbfbf, 0x40404040, 0xa3a3a3a3, 0x9e9e9e9e, + 0x81818181, 0xf3f3f3f3, 0xd7d7d7d7, 0xfbfbfbfb, + 0x7c7c7c7c, 0xe3e3e3e3, 0x39393939, 0x82828282, + 0x9b9b9b9b, 0x2f2f2f2f, 0xffffffff, 0x87878787, + 0x34343434, 0x8e8e8e8e, 0x43434343, 0x44444444, + 0xc4c4c4c4, 0xdededede, 0xe9e9e9e9, 0xcbcbcbcb, + 0x54545454, 0x7b7b7b7b, 0x94949494, 0x32323232, + 0xa6a6a6a6, 0xc2c2c2c2, 0x23232323, 0x3d3d3d3d, + 0xeeeeeeee, 0x4c4c4c4c, 0x95959595, 0x0b0b0b0b, + 0x42424242, 0xfafafafa, 0xc3c3c3c3, 0x4e4e4e4e, + 0x08080808, 0x2e2e2e2e, 0xa1a1a1a1, 0x66666666, + 0x28282828, 0xd9d9d9d9, 0x24242424, 0xb2b2b2b2, + 0x76767676, 0x5b5b5b5b, 0xa2a2a2a2, 0x49494949, + 0x6d6d6d6d, 0x8b8b8b8b, 0xd1d1d1d1, 0x25252525, + 0x72727272, 0xf8f8f8f8, 0xf6f6f6f6, 0x64646464, + 0x86868686, 0x68686868, 0x98989898, 0x16161616, + 0xd4d4d4d4, 0xa4a4a4a4, 0x5c5c5c5c, 0xcccccccc, + 0x5d5d5d5d, 0x65656565, 0xb6b6b6b6, 0x92929292, + 0x6c6c6c6c, 0x70707070, 0x48484848, 0x50505050, + 0xfdfdfdfd, 0xedededed, 0xb9b9b9b9, 0xdadadada, + 0x5e5e5e5e, 0x15151515, 0x46464646, 0x57575757, + 0xa7a7a7a7, 0x8d8d8d8d, 0x9d9d9d9d, 0x84848484, + 0x90909090, 0xd8d8d8d8, 0xabababab, 0x00000000, + 0x8c8c8c8c, 0xbcbcbcbc, 0xd3d3d3d3, 0x0a0a0a0a, + 0xf7f7f7f7, 0xe4e4e4e4, 0x58585858, 0x05050505, + 0xb8b8b8b8, 0xb3b3b3b3, 0x45454545, 0x06060606, + 0xd0d0d0d0, 0x2c2c2c2c, 0x1e1e1e1e, 0x8f8f8f8f, + 0xcacacaca, 0x3f3f3f3f, 0x0f0f0f0f, 0x02020202, + 0xc1c1c1c1, 0xafafafaf, 0xbdbdbdbd, 0x03030303, + 0x01010101, 0x13131313, 0x8a8a8a8a, 0x6b6b6b6b, + 0x3a3a3a3a, 0x91919191, 0x11111111, 0x41414141, + 0x4f4f4f4f, 0x67676767, 0xdcdcdcdc, 0xeaeaeaea, + 0x97979797, 0xf2f2f2f2, 0xcfcfcfcf, 0xcececece, + 0xf0f0f0f0, 0xb4b4b4b4, 0xe6e6e6e6, 0x73737373, + 0x96969696, 0xacacacac, 0x74747474, 0x22222222, + 0xe7e7e7e7, 0xadadadad, 0x35353535, 0x85858585, + 0xe2e2e2e2, 0xf9f9f9f9, 0x37373737, 0xe8e8e8e8, + 0x1c1c1c1c, 0x75757575, 0xdfdfdfdf, 0x6e6e6e6e, + 0x47474747, 0xf1f1f1f1, 0x1a1a1a1a, 0x71717171, + 0x1d1d1d1d, 0x29292929, 0xc5c5c5c5, 0x89898989, + 0x6f6f6f6f, 0xb7b7b7b7, 0x62626262, 0x0e0e0e0e, + 0xaaaaaaaa, 0x18181818, 0xbebebebe, 0x1b1b1b1b, + 0xfcfcfcfc, 0x56565656, 0x3e3e3e3e, 0x4b4b4b4b, + 0xc6c6c6c6, 0xd2d2d2d2, 0x79797979, 0x20202020, + 0x9a9a9a9a, 0xdbdbdbdb, 0xc0c0c0c0, 0xfefefefe, + 0x78787878, 0xcdcdcdcd, 0x5a5a5a5a, 0xf4f4f4f4, + 0x1f1f1f1f, 0xdddddddd, 0xa8a8a8a8, 0x33333333, + 0x88888888, 0x07070707, 0xc7c7c7c7, 0x31313131, + 0xb1b1b1b1, 0x12121212, 0x10101010, 0x59595959, + 0x27272727, 0x80808080, 0xecececec, 0x5f5f5f5f, + 0x60606060, 0x51515151, 0x7f7f7f7f, 0xa9a9a9a9, + 0x19191919, 0xb5b5b5b5, 0x4a4a4a4a, 0x0d0d0d0d, + 0x2d2d2d2d, 0xe5e5e5e5, 0x7a7a7a7a, 0x9f9f9f9f, + 0x93939393, 0xc9c9c9c9, 0x9c9c9c9c, 0xefefefef, + 0xa0a0a0a0, 0xe0e0e0e0, 0x3b3b3b3b, 0x4d4d4d4d, + 0xaeaeaeae, 0x2a2a2a2a, 0xf5f5f5f5, 0xb0b0b0b0, + 0xc8c8c8c8, 0xebebebeb, 0xbbbbbbbb, 0x3c3c3c3c, + 0x83838383, 0x53535353, 0x99999999, 0x61616161, + 0x17171717, 0x2b2b2b2b, 0x04040404, 0x7e7e7e7e, + 0xbabababa, 0x77777777, 0xd6d6d6d6, 0x26262626, + 0xe1e1e1e1, 0x69696969, 0x14141414, 0x63636363, + 0x55555555, 0x21212121, 0x0c0c0c0c, 0x7d7d7d7d, +}; + +__device__ __constant__ u32 rcon[] = +{ + 0x01000000, 0x02000000, 0x04000000, 0x08000000, + 0x10000000, 0x20000000, 0x40000000, 0x80000000, + 0x1b000000, 0x36000000, +}; + +__device__ static void AES128_ExpandKey (u32 *userkey, u32 *rek, u32 s_te0[256], u32 s_te1[256], u32 s_te2[256], u32 s_te3[256], u32 s_te4[256]) +{ + rek[0] = userkey[0]; + rek[1] = userkey[1]; + rek[2] = userkey[2]; + rek[3] = userkey[3]; + + #pragma unroll 10 + for (u32 i = 0, j = 0; i < 10; i += 1, j += 4) + { + u32 temp = rek[j + 3]; + + temp = (s_te2[(temp >> 16) & 0xff] & 0xff000000) + ^ (s_te3[(temp >> 8) & 0xff] & 0x00ff0000) + ^ (s_te0[(temp >> 0) & 0xff] & 0x0000ff00) + ^ (s_te1[(temp >> 24) & 0xff] & 0x000000ff); + + rek[j + 4] = rek[j + 0] + ^ temp + ^ rcon[i]; + + rek[j + 5] = rek[j + 1] ^ rek[j + 4]; + rek[j + 6] = rek[j + 2] ^ rek[j + 5]; + rek[j + 7] = rek[j + 3] ^ rek[j + 6]; + } +} + +__device__ static void AES128_InvertKey (u32 *rdk, u32 s_td0[256], u32 s_td1[256], u32 s_td2[256], u32 s_td3[256], u32 s_td4[256], u32 s_te0[256], u32 s_te1[256], u32 s_te2[256], u32 s_te3[256], u32 s_te4[256]) +{ + for (u32 i = 0, j = 40; i < j; i += 4, j -= 4) + { + u32 temp; + + temp = rdk[i + 0]; rdk[i + 0] = rdk[j + 0]; rdk[j + 0] = temp; + temp = rdk[i + 1]; rdk[i + 1] = rdk[j + 1]; rdk[j + 1] = temp; + temp = rdk[i + 2]; rdk[i + 2] = rdk[j + 2]; rdk[j + 2] = temp; + temp = rdk[i + 3]; rdk[i + 3] = rdk[j + 3]; rdk[j + 3] = temp; + } + + for (u32 i = 1, j = 4; i < 10; i += 1, j += 4) + { + rdk[j + 0] = + s_td0[s_te1[(rdk[j + 0] >> 24) & 0xff] & 0xff] ^ + s_td1[s_te1[(rdk[j + 0] >> 16) & 0xff] & 0xff] ^ + s_td2[s_te1[(rdk[j + 0] >> 8) & 0xff] & 0xff] ^ + s_td3[s_te1[(rdk[j + 0] >> 0) & 0xff] & 0xff]; + + rdk[j + 1] = + s_td0[s_te1[(rdk[j + 1] >> 24) & 0xff] & 0xff] ^ + s_td1[s_te1[(rdk[j + 1] >> 16) & 0xff] & 0xff] ^ + s_td2[s_te1[(rdk[j + 1] >> 8) & 0xff] & 0xff] ^ + s_td3[s_te1[(rdk[j + 1] >> 0) & 0xff] & 0xff]; + + rdk[j + 2] = + s_td0[s_te1[(rdk[j + 2] >> 24) & 0xff] & 0xff] ^ + s_td1[s_te1[(rdk[j + 2] >> 16) & 0xff] & 0xff] ^ + s_td2[s_te1[(rdk[j + 2] >> 8) & 0xff] & 0xff] ^ + s_td3[s_te1[(rdk[j + 2] >> 0) & 0xff] & 0xff]; + + rdk[j + 3] = + s_td0[s_te1[(rdk[j + 3] >> 24) & 0xff] & 0xff] ^ + s_td1[s_te1[(rdk[j + 3] >> 16) & 0xff] & 0xff] ^ + s_td2[s_te1[(rdk[j + 3] >> 8) & 0xff] & 0xff] ^ + s_td3[s_te1[(rdk[j + 3] >> 0) & 0xff] & 0xff]; + } +} + +__device__ static void AES128_decrypt (const u32 *in, u32 *out, const u32 *rdk, u32 s_td0[256], u32 s_td1[256], u32 s_td2[256], u32 s_td3[256], u32 s_td4[256]) +{ + u32 s0 = in[0] ^ rdk[0]; + u32 s1 = in[1] ^ rdk[1]; + u32 s2 = in[2] ^ rdk[2]; + u32 s3 = in[3] ^ rdk[3]; + + u32 t0; + u32 t1; + u32 t2; + u32 t3; + + t0 = s_td0[s0 >> 24] ^ s_td1[(s3 >> 16) & 0xff] ^ s_td2[(s2 >> 8) & 0xff] ^ s_td3[s1 & 0xff] ^ rdk[ 4]; + t1 = s_td0[s1 >> 24] ^ s_td1[(s0 >> 16) & 0xff] ^ s_td2[(s3 >> 8) & 0xff] ^ s_td3[s2 & 0xff] ^ rdk[ 5]; + t2 = s_td0[s2 >> 24] ^ s_td1[(s1 >> 16) & 0xff] ^ s_td2[(s0 >> 8) & 0xff] ^ s_td3[s3 & 0xff] ^ rdk[ 6]; + t3 = s_td0[s3 >> 24] ^ s_td1[(s2 >> 16) & 0xff] ^ s_td2[(s1 >> 8) & 0xff] ^ s_td3[s0 & 0xff] ^ rdk[ 7]; + s0 = s_td0[t0 >> 24] ^ s_td1[(t3 >> 16) & 0xff] ^ s_td2[(t2 >> 8) & 0xff] ^ s_td3[t1 & 0xff] ^ rdk[ 8]; + s1 = s_td0[t1 >> 24] ^ s_td1[(t0 >> 16) & 0xff] ^ s_td2[(t3 >> 8) & 0xff] ^ s_td3[t2 & 0xff] ^ rdk[ 9]; + s2 = s_td0[t2 >> 24] ^ s_td1[(t1 >> 16) & 0xff] ^ s_td2[(t0 >> 8) & 0xff] ^ s_td3[t3 & 0xff] ^ rdk[10]; + s3 = s_td0[t3 >> 24] ^ s_td1[(t2 >> 16) & 0xff] ^ s_td2[(t1 >> 8) & 0xff] ^ s_td3[t0 & 0xff] ^ rdk[11]; + t0 = s_td0[s0 >> 24] ^ s_td1[(s3 >> 16) & 0xff] ^ s_td2[(s2 >> 8) & 0xff] ^ s_td3[s1 & 0xff] ^ rdk[12]; + t1 = s_td0[s1 >> 24] ^ s_td1[(s0 >> 16) & 0xff] ^ s_td2[(s3 >> 8) & 0xff] ^ s_td3[s2 & 0xff] ^ rdk[13]; + t2 = s_td0[s2 >> 24] ^ s_td1[(s1 >> 16) & 0xff] ^ s_td2[(s0 >> 8) & 0xff] ^ s_td3[s3 & 0xff] ^ rdk[14]; + t3 = s_td0[s3 >> 24] ^ s_td1[(s2 >> 16) & 0xff] ^ s_td2[(s1 >> 8) & 0xff] ^ s_td3[s0 & 0xff] ^ rdk[15]; + s0 = s_td0[t0 >> 24] ^ s_td1[(t3 >> 16) & 0xff] ^ s_td2[(t2 >> 8) & 0xff] ^ s_td3[t1 & 0xff] ^ rdk[16]; + s1 = s_td0[t1 >> 24] ^ s_td1[(t0 >> 16) & 0xff] ^ s_td2[(t3 >> 8) & 0xff] ^ s_td3[t2 & 0xff] ^ rdk[17]; + s2 = s_td0[t2 >> 24] ^ s_td1[(t1 >> 16) & 0xff] ^ s_td2[(t0 >> 8) & 0xff] ^ s_td3[t3 & 0xff] ^ rdk[18]; + s3 = s_td0[t3 >> 24] ^ s_td1[(t2 >> 16) & 0xff] ^ s_td2[(t1 >> 8) & 0xff] ^ s_td3[t0 & 0xff] ^ rdk[19]; + t0 = s_td0[s0 >> 24] ^ s_td1[(s3 >> 16) & 0xff] ^ s_td2[(s2 >> 8) & 0xff] ^ s_td3[s1 & 0xff] ^ rdk[20]; + t1 = s_td0[s1 >> 24] ^ s_td1[(s0 >> 16) & 0xff] ^ s_td2[(s3 >> 8) & 0xff] ^ s_td3[s2 & 0xff] ^ rdk[21]; + t2 = s_td0[s2 >> 24] ^ s_td1[(s1 >> 16) & 0xff] ^ s_td2[(s0 >> 8) & 0xff] ^ s_td3[s3 & 0xff] ^ rdk[22]; + t3 = s_td0[s3 >> 24] ^ s_td1[(s2 >> 16) & 0xff] ^ s_td2[(s1 >> 8) & 0xff] ^ s_td3[s0 & 0xff] ^ rdk[23]; + s0 = s_td0[t0 >> 24] ^ s_td1[(t3 >> 16) & 0xff] ^ s_td2[(t2 >> 8) & 0xff] ^ s_td3[t1 & 0xff] ^ rdk[24]; + s1 = s_td0[t1 >> 24] ^ s_td1[(t0 >> 16) & 0xff] ^ s_td2[(t3 >> 8) & 0xff] ^ s_td3[t2 & 0xff] ^ rdk[25]; + s2 = s_td0[t2 >> 24] ^ s_td1[(t1 >> 16) & 0xff] ^ s_td2[(t0 >> 8) & 0xff] ^ s_td3[t3 & 0xff] ^ rdk[26]; + s3 = s_td0[t3 >> 24] ^ s_td1[(t2 >> 16) & 0xff] ^ s_td2[(t1 >> 8) & 0xff] ^ s_td3[t0 & 0xff] ^ rdk[27]; + t0 = s_td0[s0 >> 24] ^ s_td1[(s3 >> 16) & 0xff] ^ s_td2[(s2 >> 8) & 0xff] ^ s_td3[s1 & 0xff] ^ rdk[28]; + t1 = s_td0[s1 >> 24] ^ s_td1[(s0 >> 16) & 0xff] ^ s_td2[(s3 >> 8) & 0xff] ^ s_td3[s2 & 0xff] ^ rdk[29]; + t2 = s_td0[s2 >> 24] ^ s_td1[(s1 >> 16) & 0xff] ^ s_td2[(s0 >> 8) & 0xff] ^ s_td3[s3 & 0xff] ^ rdk[30]; + t3 = s_td0[s3 >> 24] ^ s_td1[(s2 >> 16) & 0xff] ^ s_td2[(s1 >> 8) & 0xff] ^ s_td3[s0 & 0xff] ^ rdk[31]; + s0 = s_td0[t0 >> 24] ^ s_td1[(t3 >> 16) & 0xff] ^ s_td2[(t2 >> 8) & 0xff] ^ s_td3[t1 & 0xff] ^ rdk[32]; + s1 = s_td0[t1 >> 24] ^ s_td1[(t0 >> 16) & 0xff] ^ s_td2[(t3 >> 8) & 0xff] ^ s_td3[t2 & 0xff] ^ rdk[33]; + s2 = s_td0[t2 >> 24] ^ s_td1[(t1 >> 16) & 0xff] ^ s_td2[(t0 >> 8) & 0xff] ^ s_td3[t3 & 0xff] ^ rdk[34]; + s3 = s_td0[t3 >> 24] ^ s_td1[(t2 >> 16) & 0xff] ^ s_td2[(t1 >> 8) & 0xff] ^ s_td3[t0 & 0xff] ^ rdk[35]; + t0 = s_td0[s0 >> 24] ^ s_td1[(s3 >> 16) & 0xff] ^ s_td2[(s2 >> 8) & 0xff] ^ s_td3[s1 & 0xff] ^ rdk[36]; + t1 = s_td0[s1 >> 24] ^ s_td1[(s0 >> 16) & 0xff] ^ s_td2[(s3 >> 8) & 0xff] ^ s_td3[s2 & 0xff] ^ rdk[37]; + t2 = s_td0[s2 >> 24] ^ s_td1[(s1 >> 16) & 0xff] ^ s_td2[(s0 >> 8) & 0xff] ^ s_td3[s3 & 0xff] ^ rdk[38]; + t3 = s_td0[s3 >> 24] ^ s_td1[(s2 >> 16) & 0xff] ^ s_td2[(s1 >> 8) & 0xff] ^ s_td3[s0 & 0xff] ^ rdk[39]; + + out[0] = (s_td4[(t0 >> 24) & 0xff] & 0xff000000) + ^ (s_td4[(t3 >> 16) & 0xff] & 0x00ff0000) + ^ (s_td4[(t2 >> 8) & 0xff] & 0x0000ff00) + ^ (s_td4[(t1 >> 0) & 0xff] & 0x000000ff) + ^ rdk[40]; + + out[1] = (s_td4[(t1 >> 24) & 0xff] & 0xff000000) + ^ (s_td4[(t0 >> 16) & 0xff] & 0x00ff0000) + ^ (s_td4[(t3 >> 8) & 0xff] & 0x0000ff00) + ^ (s_td4[(t2 >> 0) & 0xff] & 0x000000ff) + ^ rdk[41]; + + out[2] = (s_td4[(t2 >> 24) & 0xff] & 0xff000000) + ^ (s_td4[(t1 >> 16) & 0xff] & 0x00ff0000) + ^ (s_td4[(t0 >> 8) & 0xff] & 0x0000ff00) + ^ (s_td4[(t3 >> 0) & 0xff] & 0x000000ff) + ^ rdk[42]; + + out[3] = (s_td4[(t3 >> 24) & 0xff] & 0xff000000) + ^ (s_td4[(t2 >> 16) & 0xff] & 0x00ff0000) + ^ (s_td4[(t1 >> 8) & 0xff] & 0x0000ff00) + ^ (s_td4[(t0 >> 0) & 0xff] & 0x000000ff) + ^ rdk[43]; +} + +__device__ static void AES128_encrypt (const u32 *in, u32 *out, const u32 *rek, u32 s_te0[256], u32 s_te1[256], u32 s_te2[256], u32 s_te3[256], u32 s_te4[256]) +{ + u32 s0 = in[0] ^ rek[0]; + u32 s1 = in[1] ^ rek[1]; + u32 s2 = in[2] ^ rek[2]; + u32 s3 = in[3] ^ rek[3]; + + u32 t0; + u32 t1; + u32 t2; + u32 t3; + + t0 = s_te0[s0 >> 24] ^ s_te1[(s1 >> 16) & 0xff] ^ s_te2[(s2 >> 8) & 0xff] ^ s_te3[s3 & 0xff] ^ rek[ 4]; + t1 = s_te0[s1 >> 24] ^ s_te1[(s2 >> 16) & 0xff] ^ s_te2[(s3 >> 8) & 0xff] ^ s_te3[s0 & 0xff] ^ rek[ 5]; + t2 = s_te0[s2 >> 24] ^ s_te1[(s3 >> 16) & 0xff] ^ s_te2[(s0 >> 8) & 0xff] ^ s_te3[s1 & 0xff] ^ rek[ 6]; + t3 = s_te0[s3 >> 24] ^ s_te1[(s0 >> 16) & 0xff] ^ s_te2[(s1 >> 8) & 0xff] ^ s_te3[s2 & 0xff] ^ rek[ 7]; + s0 = s_te0[t0 >> 24] ^ s_te1[(t1 >> 16) & 0xff] ^ s_te2[(t2 >> 8) & 0xff] ^ s_te3[t3 & 0xff] ^ rek[ 8]; + s1 = s_te0[t1 >> 24] ^ s_te1[(t2 >> 16) & 0xff] ^ s_te2[(t3 >> 8) & 0xff] ^ s_te3[t0 & 0xff] ^ rek[ 9]; + s2 = s_te0[t2 >> 24] ^ s_te1[(t3 >> 16) & 0xff] ^ s_te2[(t0 >> 8) & 0xff] ^ s_te3[t1 & 0xff] ^ rek[10]; + s3 = s_te0[t3 >> 24] ^ s_te1[(t0 >> 16) & 0xff] ^ s_te2[(t1 >> 8) & 0xff] ^ s_te3[t2 & 0xff] ^ rek[11]; + t0 = s_te0[s0 >> 24] ^ s_te1[(s1 >> 16) & 0xff] ^ s_te2[(s2 >> 8) & 0xff] ^ s_te3[s3 & 0xff] ^ rek[12]; + t1 = s_te0[s1 >> 24] ^ s_te1[(s2 >> 16) & 0xff] ^ s_te2[(s3 >> 8) & 0xff] ^ s_te3[s0 & 0xff] ^ rek[13]; + t2 = s_te0[s2 >> 24] ^ s_te1[(s3 >> 16) & 0xff] ^ s_te2[(s0 >> 8) & 0xff] ^ s_te3[s1 & 0xff] ^ rek[14]; + t3 = s_te0[s3 >> 24] ^ s_te1[(s0 >> 16) & 0xff] ^ s_te2[(s1 >> 8) & 0xff] ^ s_te3[s2 & 0xff] ^ rek[15]; + s0 = s_te0[t0 >> 24] ^ s_te1[(t1 >> 16) & 0xff] ^ s_te2[(t2 >> 8) & 0xff] ^ s_te3[t3 & 0xff] ^ rek[16]; + s1 = s_te0[t1 >> 24] ^ s_te1[(t2 >> 16) & 0xff] ^ s_te2[(t3 >> 8) & 0xff] ^ s_te3[t0 & 0xff] ^ rek[17]; + s2 = s_te0[t2 >> 24] ^ s_te1[(t3 >> 16) & 0xff] ^ s_te2[(t0 >> 8) & 0xff] ^ s_te3[t1 & 0xff] ^ rek[18]; + s3 = s_te0[t3 >> 24] ^ s_te1[(t0 >> 16) & 0xff] ^ s_te2[(t1 >> 8) & 0xff] ^ s_te3[t2 & 0xff] ^ rek[19]; + t0 = s_te0[s0 >> 24] ^ s_te1[(s1 >> 16) & 0xff] ^ s_te2[(s2 >> 8) & 0xff] ^ s_te3[s3 & 0xff] ^ rek[20]; + t1 = s_te0[s1 >> 24] ^ s_te1[(s2 >> 16) & 0xff] ^ s_te2[(s3 >> 8) & 0xff] ^ s_te3[s0 & 0xff] ^ rek[21]; + t2 = s_te0[s2 >> 24] ^ s_te1[(s3 >> 16) & 0xff] ^ s_te2[(s0 >> 8) & 0xff] ^ s_te3[s1 & 0xff] ^ rek[22]; + t3 = s_te0[s3 >> 24] ^ s_te1[(s0 >> 16) & 0xff] ^ s_te2[(s1 >> 8) & 0xff] ^ s_te3[s2 & 0xff] ^ rek[23]; + s0 = s_te0[t0 >> 24] ^ s_te1[(t1 >> 16) & 0xff] ^ s_te2[(t2 >> 8) & 0xff] ^ s_te3[t3 & 0xff] ^ rek[24]; + s1 = s_te0[t1 >> 24] ^ s_te1[(t2 >> 16) & 0xff] ^ s_te2[(t3 >> 8) & 0xff] ^ s_te3[t0 & 0xff] ^ rek[25]; + s2 = s_te0[t2 >> 24] ^ s_te1[(t3 >> 16) & 0xff] ^ s_te2[(t0 >> 8) & 0xff] ^ s_te3[t1 & 0xff] ^ rek[26]; + s3 = s_te0[t3 >> 24] ^ s_te1[(t0 >> 16) & 0xff] ^ s_te2[(t1 >> 8) & 0xff] ^ s_te3[t2 & 0xff] ^ rek[27]; + t0 = s_te0[s0 >> 24] ^ s_te1[(s1 >> 16) & 0xff] ^ s_te2[(s2 >> 8) & 0xff] ^ s_te3[s3 & 0xff] ^ rek[28]; + t1 = s_te0[s1 >> 24] ^ s_te1[(s2 >> 16) & 0xff] ^ s_te2[(s3 >> 8) & 0xff] ^ s_te3[s0 & 0xff] ^ rek[29]; + t2 = s_te0[s2 >> 24] ^ s_te1[(s3 >> 16) & 0xff] ^ s_te2[(s0 >> 8) & 0xff] ^ s_te3[s1 & 0xff] ^ rek[30]; + t3 = s_te0[s3 >> 24] ^ s_te1[(s0 >> 16) & 0xff] ^ s_te2[(s1 >> 8) & 0xff] ^ s_te3[s2 & 0xff] ^ rek[31]; + s0 = s_te0[t0 >> 24] ^ s_te1[(t1 >> 16) & 0xff] ^ s_te2[(t2 >> 8) & 0xff] ^ s_te3[t3 & 0xff] ^ rek[32]; + s1 = s_te0[t1 >> 24] ^ s_te1[(t2 >> 16) & 0xff] ^ s_te2[(t3 >> 8) & 0xff] ^ s_te3[t0 & 0xff] ^ rek[33]; + s2 = s_te0[t2 >> 24] ^ s_te1[(t3 >> 16) & 0xff] ^ s_te2[(t0 >> 8) & 0xff] ^ s_te3[t1 & 0xff] ^ rek[34]; + s3 = s_te0[t3 >> 24] ^ s_te1[(t0 >> 16) & 0xff] ^ s_te2[(t1 >> 8) & 0xff] ^ s_te3[t2 & 0xff] ^ rek[35]; + t0 = s_te0[s0 >> 24] ^ s_te1[(s1 >> 16) & 0xff] ^ s_te2[(s2 >> 8) & 0xff] ^ s_te3[s3 & 0xff] ^ rek[36]; + t1 = s_te0[s1 >> 24] ^ s_te1[(s2 >> 16) & 0xff] ^ s_te2[(s3 >> 8) & 0xff] ^ s_te3[s0 & 0xff] ^ rek[37]; + t2 = s_te0[s2 >> 24] ^ s_te1[(s3 >> 16) & 0xff] ^ s_te2[(s0 >> 8) & 0xff] ^ s_te3[s1 & 0xff] ^ rek[38]; + t3 = s_te0[s3 >> 24] ^ s_te1[(s0 >> 16) & 0xff] ^ s_te2[(s1 >> 8) & 0xff] ^ s_te3[s2 & 0xff] ^ rek[39]; + + out[0] = (s_te4[(t0 >> 24) & 0xff] & 0xff000000) + ^ (s_te4[(t1 >> 16) & 0xff] & 0x00ff0000) + ^ (s_te4[(t2 >> 8) & 0xff] & 0x0000ff00) + ^ (s_te4[(t3 >> 0) & 0xff] & 0x000000ff) + ^ rek[40]; + + out[1] = (s_te4[(t1 >> 24) & 0xff] & 0xff000000) + ^ (s_te4[(t2 >> 16) & 0xff] & 0x00ff0000) + ^ (s_te4[(t3 >> 8) & 0xff] & 0x0000ff00) + ^ (s_te4[(t0 >> 0) & 0xff] & 0x000000ff) + ^ rek[41]; + + out[2] = (s_te4[(t2 >> 24) & 0xff] & 0xff000000) + ^ (s_te4[(t3 >> 16) & 0xff] & 0x00ff0000) + ^ (s_te4[(t0 >> 8) & 0xff] & 0x0000ff00) + ^ (s_te4[(t1 >> 0) & 0xff] & 0x000000ff) + ^ rek[42]; + + out[3] = (s_te4[(t3 >> 24) & 0xff] & 0xff000000) + ^ (s_te4[(t0 >> 16) & 0xff] & 0x00ff0000) + ^ (s_te4[(t1 >> 8) & 0xff] & 0x0000ff00) + ^ (s_te4[(t2 >> 0) & 0xff] & 0x000000ff) + ^ rek[43]; +} + +__device__ static void AES256_ExpandKey (u32 *userkey, u32 *rek, u32 s_te0[256], u32 s_te1[256], u32 s_te2[256], u32 s_te3[256], u32 s_te4[256]) +{ + rek[0] = userkey[0]; + rek[1] = userkey[1]; + rek[2] = userkey[2]; + rek[3] = userkey[3]; + rek[4] = userkey[4]; + rek[5] = userkey[5]; + rek[6] = userkey[6]; + rek[7] = userkey[7]; + + int i; + int j; + + i = 0; + j = 0; + + while (1) + { + u32 temp = rek[j + 7]; + + rek[j + 8] = rek[j + 0] + ^ (s_te2[(temp >> 16) & 0xff] & 0xff000000) + ^ (s_te3[(temp >> 8) & 0xff] & 0x00ff0000) + ^ (s_te0[(temp >> 0) & 0xff] & 0x0000ff00) + ^ (s_te1[(temp >> 24) & 0xff] & 0x000000ff) + ^ rcon[i]; + + rek[j + 9] = rek[j + 1] ^ rek[j + 8]; + rek[j + 10] = rek[j + 2] ^ rek[j + 9]; + rek[j + 11] = rek[j + 3] ^ rek[j + 10]; + + if (++i == 7) break; + + temp = rek[j + 11]; + + rek[j + 12] = rek[j + 4] + ^ (s_te2[(temp >> 24) & 0xff] & 0xff000000) + ^ (s_te3[(temp >> 16) & 0xff] & 0x00ff0000) + ^ (s_te0[(temp >> 8) & 0xff] & 0x0000ff00) + ^ (s_te1[(temp >> 0) & 0xff] & 0x000000ff); + + rek[j + 13] = rek[j + 5] ^ rek[j + 12]; + rek[j + 14] = rek[j + 6] ^ rek[j + 13]; + rek[j + 15] = rek[j + 7] ^ rek[j + 14]; + + j += 8; + } +} + +__device__ static void AES256_InvertKey (u32 *rdk, u32 s_td0[256], u32 s_td1[256], u32 s_td2[256], u32 s_td3[256], u32 s_td4[256], u32 s_te0[256], u32 s_te1[256], u32 s_te2[256], u32 s_te3[256], u32 s_te4[256]) +{ + for (u32 i = 0, j = 56; i < j; i += 4, j -= 4) + { + u32 temp; + + temp = rdk[i + 0]; rdk[i + 0] = rdk[j + 0]; rdk[j + 0] = temp; + temp = rdk[i + 1]; rdk[i + 1] = rdk[j + 1]; rdk[j + 1] = temp; + temp = rdk[i + 2]; rdk[i + 2] = rdk[j + 2]; rdk[j + 2] = temp; + temp = rdk[i + 3]; rdk[i + 3] = rdk[j + 3]; rdk[j + 3] = temp; + } + + for (u32 i = 1, j = 4; i < 14; i += 1, j += 4) + { + rdk[j + 0] = + s_td0[s_te1[(rdk[j + 0] >> 24) & 0xff] & 0xff] ^ + s_td1[s_te1[(rdk[j + 0] >> 16) & 0xff] & 0xff] ^ + s_td2[s_te1[(rdk[j + 0] >> 8) & 0xff] & 0xff] ^ + s_td3[s_te1[(rdk[j + 0] >> 0) & 0xff] & 0xff]; + + rdk[j + 1] = + s_td0[s_te1[(rdk[j + 1] >> 24) & 0xff] & 0xff] ^ + s_td1[s_te1[(rdk[j + 1] >> 16) & 0xff] & 0xff] ^ + s_td2[s_te1[(rdk[j + 1] >> 8) & 0xff] & 0xff] ^ + s_td3[s_te1[(rdk[j + 1] >> 0) & 0xff] & 0xff]; + + rdk[j + 2] = + s_td0[s_te1[(rdk[j + 2] >> 24) & 0xff] & 0xff] ^ + s_td1[s_te1[(rdk[j + 2] >> 16) & 0xff] & 0xff] ^ + s_td2[s_te1[(rdk[j + 2] >> 8) & 0xff] & 0xff] ^ + s_td3[s_te1[(rdk[j + 2] >> 0) & 0xff] & 0xff]; + + rdk[j + 3] = + s_td0[s_te1[(rdk[j + 3] >> 24) & 0xff] & 0xff] ^ + s_td1[s_te1[(rdk[j + 3] >> 16) & 0xff] & 0xff] ^ + s_td2[s_te1[(rdk[j + 3] >> 8) & 0xff] & 0xff] ^ + s_td3[s_te1[(rdk[j + 3] >> 0) & 0xff] & 0xff]; + } +} + +__device__ static void AES256_decrypt (const u32 *in, u32 *out, const u32 *rdk, u32 s_td0[256], u32 s_td1[256], u32 s_td2[256], u32 s_td3[256], u32 s_td4[256]) +{ + u32 s0 = in[0] ^ rdk[0]; + u32 s1 = in[1] ^ rdk[1]; + u32 s2 = in[2] ^ rdk[2]; + u32 s3 = in[3] ^ rdk[3]; + + u32 t0; + u32 t1; + u32 t2; + u32 t3; + + t0 = s_td0[s0 >> 24] ^ s_td1[(s3 >> 16) & 0xff] ^ s_td2[(s2 >> 8) & 0xff] ^ s_td3[s1 & 0xff] ^ rdk[ 4]; + t1 = s_td0[s1 >> 24] ^ s_td1[(s0 >> 16) & 0xff] ^ s_td2[(s3 >> 8) & 0xff] ^ s_td3[s2 & 0xff] ^ rdk[ 5]; + t2 = s_td0[s2 >> 24] ^ s_td1[(s1 >> 16) & 0xff] ^ s_td2[(s0 >> 8) & 0xff] ^ s_td3[s3 & 0xff] ^ rdk[ 6]; + t3 = s_td0[s3 >> 24] ^ s_td1[(s2 >> 16) & 0xff] ^ s_td2[(s1 >> 8) & 0xff] ^ s_td3[s0 & 0xff] ^ rdk[ 7]; + s0 = s_td0[t0 >> 24] ^ s_td1[(t3 >> 16) & 0xff] ^ s_td2[(t2 >> 8) & 0xff] ^ s_td3[t1 & 0xff] ^ rdk[ 8]; + s1 = s_td0[t1 >> 24] ^ s_td1[(t0 >> 16) & 0xff] ^ s_td2[(t3 >> 8) & 0xff] ^ s_td3[t2 & 0xff] ^ rdk[ 9]; + s2 = s_td0[t2 >> 24] ^ s_td1[(t1 >> 16) & 0xff] ^ s_td2[(t0 >> 8) & 0xff] ^ s_td3[t3 & 0xff] ^ rdk[10]; + s3 = s_td0[t3 >> 24] ^ s_td1[(t2 >> 16) & 0xff] ^ s_td2[(t1 >> 8) & 0xff] ^ s_td3[t0 & 0xff] ^ rdk[11]; + t0 = s_td0[s0 >> 24] ^ s_td1[(s3 >> 16) & 0xff] ^ s_td2[(s2 >> 8) & 0xff] ^ s_td3[s1 & 0xff] ^ rdk[12]; + t1 = s_td0[s1 >> 24] ^ s_td1[(s0 >> 16) & 0xff] ^ s_td2[(s3 >> 8) & 0xff] ^ s_td3[s2 & 0xff] ^ rdk[13]; + t2 = s_td0[s2 >> 24] ^ s_td1[(s1 >> 16) & 0xff] ^ s_td2[(s0 >> 8) & 0xff] ^ s_td3[s3 & 0xff] ^ rdk[14]; + t3 = s_td0[s3 >> 24] ^ s_td1[(s2 >> 16) & 0xff] ^ s_td2[(s1 >> 8) & 0xff] ^ s_td3[s0 & 0xff] ^ rdk[15]; + s0 = s_td0[t0 >> 24] ^ s_td1[(t3 >> 16) & 0xff] ^ s_td2[(t2 >> 8) & 0xff] ^ s_td3[t1 & 0xff] ^ rdk[16]; + s1 = s_td0[t1 >> 24] ^ s_td1[(t0 >> 16) & 0xff] ^ s_td2[(t3 >> 8) & 0xff] ^ s_td3[t2 & 0xff] ^ rdk[17]; + s2 = s_td0[t2 >> 24] ^ s_td1[(t1 >> 16) & 0xff] ^ s_td2[(t0 >> 8) & 0xff] ^ s_td3[t3 & 0xff] ^ rdk[18]; + s3 = s_td0[t3 >> 24] ^ s_td1[(t2 >> 16) & 0xff] ^ s_td2[(t1 >> 8) & 0xff] ^ s_td3[t0 & 0xff] ^ rdk[19]; + t0 = s_td0[s0 >> 24] ^ s_td1[(s3 >> 16) & 0xff] ^ s_td2[(s2 >> 8) & 0xff] ^ s_td3[s1 & 0xff] ^ rdk[20]; + t1 = s_td0[s1 >> 24] ^ s_td1[(s0 >> 16) & 0xff] ^ s_td2[(s3 >> 8) & 0xff] ^ s_td3[s2 & 0xff] ^ rdk[21]; + t2 = s_td0[s2 >> 24] ^ s_td1[(s1 >> 16) & 0xff] ^ s_td2[(s0 >> 8) & 0xff] ^ s_td3[s3 & 0xff] ^ rdk[22]; + t3 = s_td0[s3 >> 24] ^ s_td1[(s2 >> 16) & 0xff] ^ s_td2[(s1 >> 8) & 0xff] ^ s_td3[s0 & 0xff] ^ rdk[23]; + s0 = s_td0[t0 >> 24] ^ s_td1[(t3 >> 16) & 0xff] ^ s_td2[(t2 >> 8) & 0xff] ^ s_td3[t1 & 0xff] ^ rdk[24]; + s1 = s_td0[t1 >> 24] ^ s_td1[(t0 >> 16) & 0xff] ^ s_td2[(t3 >> 8) & 0xff] ^ s_td3[t2 & 0xff] ^ rdk[25]; + s2 = s_td0[t2 >> 24] ^ s_td1[(t1 >> 16) & 0xff] ^ s_td2[(t0 >> 8) & 0xff] ^ s_td3[t3 & 0xff] ^ rdk[26]; + s3 = s_td0[t3 >> 24] ^ s_td1[(t2 >> 16) & 0xff] ^ s_td2[(t1 >> 8) & 0xff] ^ s_td3[t0 & 0xff] ^ rdk[27]; + t0 = s_td0[s0 >> 24] ^ s_td1[(s3 >> 16) & 0xff] ^ s_td2[(s2 >> 8) & 0xff] ^ s_td3[s1 & 0xff] ^ rdk[28]; + t1 = s_td0[s1 >> 24] ^ s_td1[(s0 >> 16) & 0xff] ^ s_td2[(s3 >> 8) & 0xff] ^ s_td3[s2 & 0xff] ^ rdk[29]; + t2 = s_td0[s2 >> 24] ^ s_td1[(s1 >> 16) & 0xff] ^ s_td2[(s0 >> 8) & 0xff] ^ s_td3[s3 & 0xff] ^ rdk[30]; + t3 = s_td0[s3 >> 24] ^ s_td1[(s2 >> 16) & 0xff] ^ s_td2[(s1 >> 8) & 0xff] ^ s_td3[s0 & 0xff] ^ rdk[31]; + s0 = s_td0[t0 >> 24] ^ s_td1[(t3 >> 16) & 0xff] ^ s_td2[(t2 >> 8) & 0xff] ^ s_td3[t1 & 0xff] ^ rdk[32]; + s1 = s_td0[t1 >> 24] ^ s_td1[(t0 >> 16) & 0xff] ^ s_td2[(t3 >> 8) & 0xff] ^ s_td3[t2 & 0xff] ^ rdk[33]; + s2 = s_td0[t2 >> 24] ^ s_td1[(t1 >> 16) & 0xff] ^ s_td2[(t0 >> 8) & 0xff] ^ s_td3[t3 & 0xff] ^ rdk[34]; + s3 = s_td0[t3 >> 24] ^ s_td1[(t2 >> 16) & 0xff] ^ s_td2[(t1 >> 8) & 0xff] ^ s_td3[t0 & 0xff] ^ rdk[35]; + t0 = s_td0[s0 >> 24] ^ s_td1[(s3 >> 16) & 0xff] ^ s_td2[(s2 >> 8) & 0xff] ^ s_td3[s1 & 0xff] ^ rdk[36]; + t1 = s_td0[s1 >> 24] ^ s_td1[(s0 >> 16) & 0xff] ^ s_td2[(s3 >> 8) & 0xff] ^ s_td3[s2 & 0xff] ^ rdk[37]; + t2 = s_td0[s2 >> 24] ^ s_td1[(s1 >> 16) & 0xff] ^ s_td2[(s0 >> 8) & 0xff] ^ s_td3[s3 & 0xff] ^ rdk[38]; + t3 = s_td0[s3 >> 24] ^ s_td1[(s2 >> 16) & 0xff] ^ s_td2[(s1 >> 8) & 0xff] ^ s_td3[s0 & 0xff] ^ rdk[39]; + s0 = s_td0[t0 >> 24] ^ s_td1[(t3 >> 16) & 0xff] ^ s_td2[(t2 >> 8) & 0xff] ^ s_td3[t1 & 0xff] ^ rdk[40]; + s1 = s_td0[t1 >> 24] ^ s_td1[(t0 >> 16) & 0xff] ^ s_td2[(t3 >> 8) & 0xff] ^ s_td3[t2 & 0xff] ^ rdk[41]; + s2 = s_td0[t2 >> 24] ^ s_td1[(t1 >> 16) & 0xff] ^ s_td2[(t0 >> 8) & 0xff] ^ s_td3[t3 & 0xff] ^ rdk[42]; + s3 = s_td0[t3 >> 24] ^ s_td1[(t2 >> 16) & 0xff] ^ s_td2[(t1 >> 8) & 0xff] ^ s_td3[t0 & 0xff] ^ rdk[43]; + t0 = s_td0[s0 >> 24] ^ s_td1[(s3 >> 16) & 0xff] ^ s_td2[(s2 >> 8) & 0xff] ^ s_td3[s1 & 0xff] ^ rdk[44]; + t1 = s_td0[s1 >> 24] ^ s_td1[(s0 >> 16) & 0xff] ^ s_td2[(s3 >> 8) & 0xff] ^ s_td3[s2 & 0xff] ^ rdk[45]; + t2 = s_td0[s2 >> 24] ^ s_td1[(s1 >> 16) & 0xff] ^ s_td2[(s0 >> 8) & 0xff] ^ s_td3[s3 & 0xff] ^ rdk[46]; + t3 = s_td0[s3 >> 24] ^ s_td1[(s2 >> 16) & 0xff] ^ s_td2[(s1 >> 8) & 0xff] ^ s_td3[s0 & 0xff] ^ rdk[47]; + s0 = s_td0[t0 >> 24] ^ s_td1[(t3 >> 16) & 0xff] ^ s_td2[(t2 >> 8) & 0xff] ^ s_td3[t1 & 0xff] ^ rdk[48]; + s1 = s_td0[t1 >> 24] ^ s_td1[(t0 >> 16) & 0xff] ^ s_td2[(t3 >> 8) & 0xff] ^ s_td3[t2 & 0xff] ^ rdk[49]; + s2 = s_td0[t2 >> 24] ^ s_td1[(t1 >> 16) & 0xff] ^ s_td2[(t0 >> 8) & 0xff] ^ s_td3[t3 & 0xff] ^ rdk[50]; + s3 = s_td0[t3 >> 24] ^ s_td1[(t2 >> 16) & 0xff] ^ s_td2[(t1 >> 8) & 0xff] ^ s_td3[t0 & 0xff] ^ rdk[51]; + t0 = s_td0[s0 >> 24] ^ s_td1[(s3 >> 16) & 0xff] ^ s_td2[(s2 >> 8) & 0xff] ^ s_td3[s1 & 0xff] ^ rdk[52]; + t1 = s_td0[s1 >> 24] ^ s_td1[(s0 >> 16) & 0xff] ^ s_td2[(s3 >> 8) & 0xff] ^ s_td3[s2 & 0xff] ^ rdk[53]; + t2 = s_td0[s2 >> 24] ^ s_td1[(s1 >> 16) & 0xff] ^ s_td2[(s0 >> 8) & 0xff] ^ s_td3[s3 & 0xff] ^ rdk[54]; + t3 = s_td0[s3 >> 24] ^ s_td1[(s2 >> 16) & 0xff] ^ s_td2[(s1 >> 8) & 0xff] ^ s_td3[s0 & 0xff] ^ rdk[55]; + + out[0] = (s_td4[(t0 >> 24) & 0xff] & 0xff000000) + ^ (s_td4[(t3 >> 16) & 0xff] & 0x00ff0000) + ^ (s_td4[(t2 >> 8) & 0xff] & 0x0000ff00) + ^ (s_td4[(t1 >> 0) & 0xff] & 0x000000ff) + ^ rdk[56]; + + out[1] = (s_td4[(t1 >> 24) & 0xff] & 0xff000000) + ^ (s_td4[(t0 >> 16) & 0xff] & 0x00ff0000) + ^ (s_td4[(t3 >> 8) & 0xff] & 0x0000ff00) + ^ (s_td4[(t2 >> 0) & 0xff] & 0x000000ff) + ^ rdk[57]; + + out[2] = (s_td4[(t2 >> 24) & 0xff] & 0xff000000) + ^ (s_td4[(t1 >> 16) & 0xff] & 0x00ff0000) + ^ (s_td4[(t0 >> 8) & 0xff] & 0x0000ff00) + ^ (s_td4[(t3 >> 0) & 0xff] & 0x000000ff) + ^ rdk[58]; + + out[3] = (s_td4[(t3 >> 24) & 0xff] & 0xff000000) + ^ (s_td4[(t2 >> 16) & 0xff] & 0x00ff0000) + ^ (s_td4[(t1 >> 8) & 0xff] & 0x0000ff00) + ^ (s_td4[(t0 >> 0) & 0xff] & 0x000000ff) + ^ rdk[59]; +} + +__device__ static void AES256_encrypt (const u32 *in, u32 *out, const u32 *rek, u32 s_te0[256], u32 s_te1[256], u32 s_te2[256], u32 s_te3[256], u32 s_te4[256]) +{ + u32 s0 = in[0] ^ rek[0]; + u32 s1 = in[1] ^ rek[1]; + u32 s2 = in[2] ^ rek[2]; + u32 s3 = in[3] ^ rek[3]; + + u32 t0; + u32 t1; + u32 t2; + u32 t3; + + t0 = s_te0[s0 >> 24] ^ s_te1[(s1 >> 16) & 0xff] ^ s_te2[(s2 >> 8) & 0xff] ^ s_te3[s3 & 0xff] ^ rek[ 4]; + t1 = s_te0[s1 >> 24] ^ s_te1[(s2 >> 16) & 0xff] ^ s_te2[(s3 >> 8) & 0xff] ^ s_te3[s0 & 0xff] ^ rek[ 5]; + t2 = s_te0[s2 >> 24] ^ s_te1[(s3 >> 16) & 0xff] ^ s_te2[(s0 >> 8) & 0xff] ^ s_te3[s1 & 0xff] ^ rek[ 6]; + t3 = s_te0[s3 >> 24] ^ s_te1[(s0 >> 16) & 0xff] ^ s_te2[(s1 >> 8) & 0xff] ^ s_te3[s2 & 0xff] ^ rek[ 7]; + s0 = s_te0[t0 >> 24] ^ s_te1[(t1 >> 16) & 0xff] ^ s_te2[(t2 >> 8) & 0xff] ^ s_te3[t3 & 0xff] ^ rek[ 8]; + s1 = s_te0[t1 >> 24] ^ s_te1[(t2 >> 16) & 0xff] ^ s_te2[(t3 >> 8) & 0xff] ^ s_te3[t0 & 0xff] ^ rek[ 9]; + s2 = s_te0[t2 >> 24] ^ s_te1[(t3 >> 16) & 0xff] ^ s_te2[(t0 >> 8) & 0xff] ^ s_te3[t1 & 0xff] ^ rek[10]; + s3 = s_te0[t3 >> 24] ^ s_te1[(t0 >> 16) & 0xff] ^ s_te2[(t1 >> 8) & 0xff] ^ s_te3[t2 & 0xff] ^ rek[11]; + t0 = s_te0[s0 >> 24] ^ s_te1[(s1 >> 16) & 0xff] ^ s_te2[(s2 >> 8) & 0xff] ^ s_te3[s3 & 0xff] ^ rek[12]; + t1 = s_te0[s1 >> 24] ^ s_te1[(s2 >> 16) & 0xff] ^ s_te2[(s3 >> 8) & 0xff] ^ s_te3[s0 & 0xff] ^ rek[13]; + t2 = s_te0[s2 >> 24] ^ s_te1[(s3 >> 16) & 0xff] ^ s_te2[(s0 >> 8) & 0xff] ^ s_te3[s1 & 0xff] ^ rek[14]; + t3 = s_te0[s3 >> 24] ^ s_te1[(s0 >> 16) & 0xff] ^ s_te2[(s1 >> 8) & 0xff] ^ s_te3[s2 & 0xff] ^ rek[15]; + s0 = s_te0[t0 >> 24] ^ s_te1[(t1 >> 16) & 0xff] ^ s_te2[(t2 >> 8) & 0xff] ^ s_te3[t3 & 0xff] ^ rek[16]; + s1 = s_te0[t1 >> 24] ^ s_te1[(t2 >> 16) & 0xff] ^ s_te2[(t3 >> 8) & 0xff] ^ s_te3[t0 & 0xff] ^ rek[17]; + s2 = s_te0[t2 >> 24] ^ s_te1[(t3 >> 16) & 0xff] ^ s_te2[(t0 >> 8) & 0xff] ^ s_te3[t1 & 0xff] ^ rek[18]; + s3 = s_te0[t3 >> 24] ^ s_te1[(t0 >> 16) & 0xff] ^ s_te2[(t1 >> 8) & 0xff] ^ s_te3[t2 & 0xff] ^ rek[19]; + t0 = s_te0[s0 >> 24] ^ s_te1[(s1 >> 16) & 0xff] ^ s_te2[(s2 >> 8) & 0xff] ^ s_te3[s3 & 0xff] ^ rek[20]; + t1 = s_te0[s1 >> 24] ^ s_te1[(s2 >> 16) & 0xff] ^ s_te2[(s3 >> 8) & 0xff] ^ s_te3[s0 & 0xff] ^ rek[21]; + t2 = s_te0[s2 >> 24] ^ s_te1[(s3 >> 16) & 0xff] ^ s_te2[(s0 >> 8) & 0xff] ^ s_te3[s1 & 0xff] ^ rek[22]; + t3 = s_te0[s3 >> 24] ^ s_te1[(s0 >> 16) & 0xff] ^ s_te2[(s1 >> 8) & 0xff] ^ s_te3[s2 & 0xff] ^ rek[23]; + s0 = s_te0[t0 >> 24] ^ s_te1[(t1 >> 16) & 0xff] ^ s_te2[(t2 >> 8) & 0xff] ^ s_te3[t3 & 0xff] ^ rek[24]; + s1 = s_te0[t1 >> 24] ^ s_te1[(t2 >> 16) & 0xff] ^ s_te2[(t3 >> 8) & 0xff] ^ s_te3[t0 & 0xff] ^ rek[25]; + s2 = s_te0[t2 >> 24] ^ s_te1[(t3 >> 16) & 0xff] ^ s_te2[(t0 >> 8) & 0xff] ^ s_te3[t1 & 0xff] ^ rek[26]; + s3 = s_te0[t3 >> 24] ^ s_te1[(t0 >> 16) & 0xff] ^ s_te2[(t1 >> 8) & 0xff] ^ s_te3[t2 & 0xff] ^ rek[27]; + t0 = s_te0[s0 >> 24] ^ s_te1[(s1 >> 16) & 0xff] ^ s_te2[(s2 >> 8) & 0xff] ^ s_te3[s3 & 0xff] ^ rek[28]; + t1 = s_te0[s1 >> 24] ^ s_te1[(s2 >> 16) & 0xff] ^ s_te2[(s3 >> 8) & 0xff] ^ s_te3[s0 & 0xff] ^ rek[29]; + t2 = s_te0[s2 >> 24] ^ s_te1[(s3 >> 16) & 0xff] ^ s_te2[(s0 >> 8) & 0xff] ^ s_te3[s1 & 0xff] ^ rek[30]; + t3 = s_te0[s3 >> 24] ^ s_te1[(s0 >> 16) & 0xff] ^ s_te2[(s1 >> 8) & 0xff] ^ s_te3[s2 & 0xff] ^ rek[31]; + s0 = s_te0[t0 >> 24] ^ s_te1[(t1 >> 16) & 0xff] ^ s_te2[(t2 >> 8) & 0xff] ^ s_te3[t3 & 0xff] ^ rek[32]; + s1 = s_te0[t1 >> 24] ^ s_te1[(t2 >> 16) & 0xff] ^ s_te2[(t3 >> 8) & 0xff] ^ s_te3[t0 & 0xff] ^ rek[33]; + s2 = s_te0[t2 >> 24] ^ s_te1[(t3 >> 16) & 0xff] ^ s_te2[(t0 >> 8) & 0xff] ^ s_te3[t1 & 0xff] ^ rek[34]; + s3 = s_te0[t3 >> 24] ^ s_te1[(t0 >> 16) & 0xff] ^ s_te2[(t1 >> 8) & 0xff] ^ s_te3[t2 & 0xff] ^ rek[35]; + t0 = s_te0[s0 >> 24] ^ s_te1[(s1 >> 16) & 0xff] ^ s_te2[(s2 >> 8) & 0xff] ^ s_te3[s3 & 0xff] ^ rek[36]; + t1 = s_te0[s1 >> 24] ^ s_te1[(s2 >> 16) & 0xff] ^ s_te2[(s3 >> 8) & 0xff] ^ s_te3[s0 & 0xff] ^ rek[37]; + t2 = s_te0[s2 >> 24] ^ s_te1[(s3 >> 16) & 0xff] ^ s_te2[(s0 >> 8) & 0xff] ^ s_te3[s1 & 0xff] ^ rek[38]; + t3 = s_te0[s3 >> 24] ^ s_te1[(s0 >> 16) & 0xff] ^ s_te2[(s1 >> 8) & 0xff] ^ s_te3[s2 & 0xff] ^ rek[39]; + s0 = s_te0[t0 >> 24] ^ s_te1[(t1 >> 16) & 0xff] ^ s_te2[(t2 >> 8) & 0xff] ^ s_te3[t3 & 0xff] ^ rek[40]; + s1 = s_te0[t1 >> 24] ^ s_te1[(t2 >> 16) & 0xff] ^ s_te2[(t3 >> 8) & 0xff] ^ s_te3[t0 & 0xff] ^ rek[41]; + s2 = s_te0[t2 >> 24] ^ s_te1[(t3 >> 16) & 0xff] ^ s_te2[(t0 >> 8) & 0xff] ^ s_te3[t1 & 0xff] ^ rek[42]; + s3 = s_te0[t3 >> 24] ^ s_te1[(t0 >> 16) & 0xff] ^ s_te2[(t1 >> 8) & 0xff] ^ s_te3[t2 & 0xff] ^ rek[43]; + t0 = s_te0[s0 >> 24] ^ s_te1[(s1 >> 16) & 0xff] ^ s_te2[(s2 >> 8) & 0xff] ^ s_te3[s3 & 0xff] ^ rek[44]; + t1 = s_te0[s1 >> 24] ^ s_te1[(s2 >> 16) & 0xff] ^ s_te2[(s3 >> 8) & 0xff] ^ s_te3[s0 & 0xff] ^ rek[45]; + t2 = s_te0[s2 >> 24] ^ s_te1[(s3 >> 16) & 0xff] ^ s_te2[(s0 >> 8) & 0xff] ^ s_te3[s1 & 0xff] ^ rek[46]; + t3 = s_te0[s3 >> 24] ^ s_te1[(s0 >> 16) & 0xff] ^ s_te2[(s1 >> 8) & 0xff] ^ s_te3[s2 & 0xff] ^ rek[47]; + s0 = s_te0[t0 >> 24] ^ s_te1[(t1 >> 16) & 0xff] ^ s_te2[(t2 >> 8) & 0xff] ^ s_te3[t3 & 0xff] ^ rek[48]; + s1 = s_te0[t1 >> 24] ^ s_te1[(t2 >> 16) & 0xff] ^ s_te2[(t3 >> 8) & 0xff] ^ s_te3[t0 & 0xff] ^ rek[49]; + s2 = s_te0[t2 >> 24] ^ s_te1[(t3 >> 16) & 0xff] ^ s_te2[(t0 >> 8) & 0xff] ^ s_te3[t1 & 0xff] ^ rek[50]; + s3 = s_te0[t3 >> 24] ^ s_te1[(t0 >> 16) & 0xff] ^ s_te2[(t1 >> 8) & 0xff] ^ s_te3[t2 & 0xff] ^ rek[51]; + t0 = s_te0[s0 >> 24] ^ s_te1[(s1 >> 16) & 0xff] ^ s_te2[(s2 >> 8) & 0xff] ^ s_te3[s3 & 0xff] ^ rek[52]; + t1 = s_te0[s1 >> 24] ^ s_te1[(s2 >> 16) & 0xff] ^ s_te2[(s3 >> 8) & 0xff] ^ s_te3[s0 & 0xff] ^ rek[53]; + t2 = s_te0[s2 >> 24] ^ s_te1[(s3 >> 16) & 0xff] ^ s_te2[(s0 >> 8) & 0xff] ^ s_te3[s1 & 0xff] ^ rek[54]; + t3 = s_te0[s3 >> 24] ^ s_te1[(s0 >> 16) & 0xff] ^ s_te2[(s1 >> 8) & 0xff] ^ s_te3[s2 & 0xff] ^ rek[55]; + + out[0] = (s_te4[(t0 >> 24) & 0xff] & 0xff000000) + ^ (s_te4[(t1 >> 16) & 0xff] & 0x00ff0000) + ^ (s_te4[(t2 >> 8) & 0xff] & 0x0000ff00) + ^ (s_te4[(t3 >> 0) & 0xff] & 0x000000ff) + ^ rek[56]; + + out[1] = (s_te4[(t1 >> 24) & 0xff] & 0xff000000) + ^ (s_te4[(t2 >> 16) & 0xff] & 0x00ff0000) + ^ (s_te4[(t3 >> 8) & 0xff] & 0x0000ff00) + ^ (s_te4[(t0 >> 0) & 0xff] & 0x000000ff) + ^ rek[57]; + + out[2] = (s_te4[(t2 >> 24) & 0xff] & 0xff000000) + ^ (s_te4[(t3 >> 16) & 0xff] & 0x00ff0000) + ^ (s_te4[(t0 >> 8) & 0xff] & 0x0000ff00) + ^ (s_te4[(t1 >> 0) & 0xff] & 0x000000ff) + ^ rek[58]; + + out[3] = (s_te4[(t3 >> 24) & 0xff] & 0xff000000) + ^ (s_te4[(t0 >> 16) & 0xff] & 0x00ff0000) + ^ (s_te4[(t1 >> 8) & 0xff] & 0x0000ff00) + ^ (s_te4[(t2 >> 0) & 0xff] & 0x000000ff) + ^ rek[59]; +} + +__device__ static void sha1_transform (const u32x w0[4], const u32x w1[4], const u32x w2[4], const u32x w3[4], u32x digest[5]) +{ + u32x A = digest[0]; + u32x B = digest[1]; + u32x C = digest[2]; + u32x D = digest[3]; + u32x E = digest[4]; + + u32x w0_t = w0[0]; + u32x w1_t = w0[1]; + u32x w2_t = w0[2]; + u32x w3_t = w0[3]; + u32x w4_t = w1[0]; + u32x w5_t = w1[1]; + u32x w6_t = w1[2]; + u32x w7_t = w1[3]; + u32x w8_t = w2[0]; + u32x w9_t = w2[1]; + u32x wa_t = w2[2]; + u32x wb_t = w2[3]; + u32x wc_t = w3[0]; + u32x wd_t = w3[1]; + u32x we_t = w3[2]; + u32x wf_t = w3[3]; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, A, B, C, D, E, w0_t); + SHA1_STEP (SHA1_F0o, E, A, B, C, D, w1_t); + SHA1_STEP (SHA1_F0o, D, E, A, B, C, w2_t); + SHA1_STEP (SHA1_F0o, C, D, E, A, B, w3_t); + SHA1_STEP (SHA1_F0o, B, C, D, E, A, w4_t); + SHA1_STEP (SHA1_F0o, A, B, C, D, E, w5_t); + SHA1_STEP (SHA1_F0o, E, A, B, C, D, w6_t); + SHA1_STEP (SHA1_F0o, D, E, A, B, C, w7_t); + SHA1_STEP (SHA1_F0o, C, D, E, A, B, w8_t); + SHA1_STEP (SHA1_F0o, B, C, D, E, A, w9_t); + SHA1_STEP (SHA1_F0o, A, B, C, D, E, wa_t); + SHA1_STEP (SHA1_F0o, E, A, B, C, D, wb_t); + SHA1_STEP (SHA1_F0o, D, E, A, B, C, wc_t); + SHA1_STEP (SHA1_F0o, C, D, E, A, B, wd_t); + SHA1_STEP (SHA1_F0o, B, C, D, E, A, we_t); + SHA1_STEP (SHA1_F0o, A, B, C, D, E, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F0o, E, A, B, C, D, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F0o, D, E, A, B, C, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F0o, C, D, E, A, B, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F0o, B, C, D, E, A, w3_t); + + #undef K + #define K SHA1C01 + + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w7_t); + + #undef K + #define K SHA1C02 + + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, wb_t); + + #undef K + #define K SHA1C03 + + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, wf_t); + + digest[0] += A; + digest[1] += B; + digest[2] += C; + digest[3] += D; + digest[4] += E; +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m09400_init (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, office2007_tmp_t *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const office2007_t *office2007_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = pws[gid].i[ 8]; + w2[1] = pws[gid].i[ 9]; + w2[2] = pws[gid].i[10]; + w2[3] = pws[gid].i[11]; + + u32x w3[4]; + + w3[0] = pws[gid].i[12]; + w3[1] = pws[gid].i[13]; + w3[2] = pws[gid].i[14]; + w3[3] = pws[gid].i[15]; + + u32 pw_len = pws[gid].pw_len; + + append_0x80_4 (w0, w1, w2, w3, pw_len); + + make_unicode (w1, w2, w3); + make_unicode (w0, w0, w1); + + /** + * salt + */ + + u32 salt_len = salt_bufs[salt_pos].salt_len; + + u32 salt_buf[4]; + + salt_buf[0] = salt_bufs[salt_pos].salt_buf[0]; + salt_buf[1] = salt_bufs[salt_pos].salt_buf[1]; + salt_buf[2] = salt_bufs[salt_pos].salt_buf[2]; + salt_buf[3] = salt_bufs[salt_pos].salt_buf[3]; + + /** + * init + */ + + u32x t0[4]; + + t0[0] = salt_buf[0]; + t0[1] = salt_buf[1]; + t0[2] = salt_buf[2]; + t0[3] = salt_buf[3]; + + u32x t1[4]; + + t1[0] = swap_workaround (w0[0]); + t1[1] = swap_workaround (w0[1]); + t1[2] = swap_workaround (w0[2]); + t1[3] = swap_workaround (w0[3]); + + u32x t2[4]; + + t2[0] = swap_workaround (w1[0]); + t2[1] = swap_workaround (w1[1]); + t2[2] = swap_workaround (w1[2]); + t2[3] = swap_workaround (w1[3]); + + u32x t3[4]; + + t3[0] = swap_workaround (w2[0]); + t3[1] = swap_workaround (w2[1]); + t3[2] = 0; + t3[3] = (salt_len + (pw_len * 2)) * 8; + + u32x digest[5]; + + digest[0] = SHA1M_A; + digest[1] = SHA1M_B; + digest[2] = SHA1M_C; + digest[3] = SHA1M_D; + digest[4] = SHA1M_E; + + sha1_transform (t0, t1, t2, t3, digest); + + tmps[gid].out[0] = digest[0]; + tmps[gid].out[1] = digest[1]; + tmps[gid].out[2] = digest[2]; + tmps[gid].out[3] = digest[3]; + tmps[gid].out[4] = digest[4]; +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m09400_loop (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, office2007_tmp_t *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const office2007_t *office2007_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = 0; + w0[1] = tmps[gid].out[0]; + w0[2] = tmps[gid].out[1]; + w0[3] = tmps[gid].out[2]; + + u32x w1[4]; + + w1[0] = tmps[gid].out[3]; + w1[1] = tmps[gid].out[4]; + w1[2] = 0x80000000; + w1[3] = 0; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = (4 + 20) * 8; + + for (u32 i = 0, j = loop_pos; i < loop_cnt; i++, j++) + { + w0[0] = swap_workaround (j); + + u32x digest[5]; + + digest[0] = SHA1M_A; + digest[1] = SHA1M_B; + digest[2] = SHA1M_C; + digest[3] = SHA1M_D; + digest[4] = SHA1M_E; + + sha1_transform (w0, w1, w2, w3, digest); + + w0[1] = digest[0]; + w0[2] = digest[1]; + w0[3] = digest[2]; + w1[0] = digest[3]; + w1[1] = digest[4]; + } + + tmps[gid].out[0] = w0[1]; + tmps[gid].out[1] = w0[2]; + tmps[gid].out[2] = w0[3]; + tmps[gid].out[3] = w1[0]; + tmps[gid].out[4] = w1[1]; +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m09400_comp (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, office2007_tmp_t *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const office2007_t *office2007_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + const u32 lid = threadIdx.x; + + /** + * aes shared + */ + + __shared__ u32 s_td0[256]; + __shared__ u32 s_td1[256]; + __shared__ u32 s_td2[256]; + __shared__ u32 s_td3[256]; + __shared__ u32 s_td4[256]; + + __shared__ u32 s_te0[256]; + __shared__ u32 s_te1[256]; + __shared__ u32 s_te2[256]; + __shared__ u32 s_te3[256]; + __shared__ u32 s_te4[256]; + + s_td0[lid] = td0[lid]; + s_td1[lid] = td1[lid]; + s_td2[lid] = td2[lid]; + s_td3[lid] = td3[lid]; + s_td4[lid] = td4[lid]; + + s_te0[lid] = te0[lid]; + s_te1[lid] = te1[lid]; + s_te2[lid] = te2[lid]; + s_te3[lid] = te3[lid]; + s_te4[lid] = te4[lid]; + + __syncthreads (); + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = tmps[gid].out[0]; + w0[1] = tmps[gid].out[1]; + w0[2] = tmps[gid].out[2]; + w0[3] = tmps[gid].out[3]; + + u32x w1[4]; + + w1[0] = tmps[gid].out[4]; + w1[1] = 0; + w1[2] = 0x80000000; + w1[3] = 0; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = (20 + 4) * 8; + + u32 digest_common[5]; + + digest_common[0] = SHA1M_A; + digest_common[1] = SHA1M_B; + digest_common[2] = SHA1M_C; + digest_common[3] = SHA1M_D; + digest_common[4] = SHA1M_E; + + sha1_transform (w0, w1, w2, w3, digest_common); + + w0[0] = 0x36363636 ^ digest_common[0]; + w0[1] = 0x36363636 ^ digest_common[1]; + w0[2] = 0x36363636 ^ digest_common[2]; + w0[3] = 0x36363636 ^ digest_common[3]; + w1[0] = 0x36363636 ^ digest_common[4]; + w1[1] = 0x36363636; + w1[2] = 0x36363636; + w1[3] = 0x36363636; + w2[0] = 0x36363636; + w2[1] = 0x36363636; + w2[2] = 0x36363636; + w2[3] = 0x36363636; + w3[0] = 0x36363636; + w3[1] = 0x36363636; + w3[2] = 0x36363636; + w3[3] = 0x36363636; + + u32 digest[5]; + + digest[0] = SHA1M_A; + digest[1] = SHA1M_B; + digest[2] = SHA1M_C; + digest[3] = SHA1M_D; + digest[4] = SHA1M_E; + + sha1_transform (w0, w1, w2, w3, digest); + + w0[0] = 0x80000000; + w0[1] = 0; + w0[2] = 0; + w0[3] = 0; + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 64 * 8; + + sha1_transform (w0, w1, w2, w3, digest); + + // save digest for the AES-256 variant + + u32 digest_saved[5]; + + digest_saved[0] = digest[0]; + digest_saved[1] = digest[1]; + digest_saved[2] = digest[2]; + digest_saved[3] = digest[3]; + digest_saved[4] = digest[4]; + + // now we got the AES key, decrypt the verifier + + u32x rek[60]; + u32x rdk[60]; + + u32 verifier[4]; + + verifier[0] = office2007_bufs[salt_pos].encryptedVerifier[0]; + verifier[1] = office2007_bufs[salt_pos].encryptedVerifier[1]; + verifier[2] = office2007_bufs[salt_pos].encryptedVerifier[2]; + verifier[3] = office2007_bufs[salt_pos].encryptedVerifier[3]; + + u32 data[8]; + + data[0] = verifier[0]; + data[1] = verifier[1]; + data[2] = verifier[2]; + data[3] = verifier[3]; + + data[4] = 0; + data[5] = 0; + data[6] = 0; + data[7] = 0; + + u32x ukeyx[8]; + + ukeyx[0] = digest[0]; + ukeyx[1] = digest[1]; + ukeyx[2] = digest[2]; + ukeyx[3] = digest[3]; + + AES128_ExpandKey (ukeyx, rek, s_te0, s_te1, s_te2, s_te3, s_te4); + + for (u32 i = 0; i < 44; i++) rdk[i] = rek[i]; + + AES128_InvertKey (rdk, s_td0, s_td1, s_td2, s_td3, s_td4, s_te0, s_te1, s_te2, s_te3, s_te4); + + u32 out[4]; + + AES128_decrypt (data, out, rdk, s_td0, s_td1, s_td2, s_td3, s_td4); + + // do a sha1 of the result + + w0[0] = out[0]; + w0[1] = out[1]; + w0[2] = out[2]; + w0[3] = out[3]; + w1[0] = 0x80000000; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 16 * 8; + + digest[0] = SHA1M_A; + digest[1] = SHA1M_B; + digest[2] = SHA1M_C; + digest[3] = SHA1M_D; + digest[4] = SHA1M_E; + + sha1_transform (w0, w1, w2, w3, digest); + + // encrypt it again for verify + + data[0] = digest[0]; + data[1] = digest[1]; + data[2] = digest[2]; + data[3] = digest[3]; + + AES128_encrypt (data, out, rek, s_te0, s_te1, s_te2, s_te3, s_te4); + + { + const u32x r0 = out[0]; + const u32x r1 = out[1]; + const u32x r2 = out[2]; + const u32x r3 = out[3]; + + #define il_pos 0 + + #include VECT_COMPARE_M + } + + /* + * AES-256 test + */ + + // try same procedure but with AES-256 + + w0[0] = 0x5c5c5c5c ^ digest_common[0]; + w0[1] = 0x5c5c5c5c ^ digest_common[1]; + w0[2] = 0x5c5c5c5c ^ digest_common[2]; + w0[3] = 0x5c5c5c5c ^ digest_common[3]; + w1[0] = 0x5c5c5c5c ^ digest_common[4]; + w1[1] = 0x5c5c5c5c; + w1[2] = 0x5c5c5c5c; + w1[3] = 0x5c5c5c5c; + w2[0] = 0x5c5c5c5c; + w2[1] = 0x5c5c5c5c; + w2[2] = 0x5c5c5c5c; + w2[3] = 0x5c5c5c5c; + w3[0] = 0x5c5c5c5c; + w3[1] = 0x5c5c5c5c; + w3[2] = 0x5c5c5c5c; + w3[3] = 0x5c5c5c5c; + + digest[0] = SHA1M_A; + digest[1] = SHA1M_B; + digest[2] = SHA1M_C; + digest[3] = SHA1M_D; + digest[4] = SHA1M_E; + + sha1_transform (w0, w1, w2, w3, digest); + + w0[0] = 0x80000000; + w0[1] = 0; + w0[2] = 0; + w0[3] = 0; + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 64 * 8; + + sha1_transform (w0, w1, w2, w3, digest); + + // now we got the AES key, decrypt the verifier + + ukeyx[0] = digest_saved[0]; + ukeyx[1] = digest_saved[1]; + ukeyx[2] = digest_saved[2]; + ukeyx[3] = digest_saved[3]; + ukeyx[4] = digest_saved[4]; + ukeyx[5] = digest[0]; + ukeyx[6] = digest[1]; + ukeyx[7] = digest[2]; + + AES256_ExpandKey (ukeyx, rek, s_te0, s_te1, s_te2, s_te3, s_te4); + + for (u32 i = 0; i < 60; i++) rdk[i] = rek[i]; + + AES256_InvertKey (rdk, s_td0, s_td1, s_td2, s_td3, s_td4, s_te0, s_te1, s_te2, s_te3, s_te4); + + data[0] = verifier[0]; + data[1] = verifier[1]; + data[2] = verifier[2]; + data[3] = verifier[3]; + + AES256_decrypt (data, out, rdk, s_td0, s_td1, s_td2, s_td3, s_td4); + + // do a sha1 of the result + + w0[0] = out[0]; + w0[1] = out[1]; + w0[2] = out[2]; + w0[3] = out[3]; + w1[0] = 0x80000000; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 16 * 8; + + digest[0] = SHA1M_A; + digest[1] = SHA1M_B; + digest[2] = SHA1M_C; + digest[3] = SHA1M_D; + digest[4] = SHA1M_E; + + sha1_transform (w0, w1, w2, w3, digest); + + // encrypt it again for verify + + data[0] = digest[0]; + data[1] = digest[1]; + data[2] = digest[2]; + data[3] = digest[3]; + + AES256_encrypt (data, out, rek, s_te0, s_te1, s_te2, s_te3, s_te4); + + { + const u32x r0 = out[0]; + const u32x r1 = out[1]; + const u32x r2 = out[2]; + const u32x r3 = out[3]; + + #define il_pos 0 + + #include VECT_COMPARE_M + } +} diff --git a/nv/m09500.cu b/nv/m09500.cu new file mode 100644 index 0000000000..b324d1ca3a --- /dev/null +++ b/nv/m09500.cu @@ -0,0 +1,1421 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _OFFICE2010_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW2 +#define VECT_SIZE1 +#endif + +#define DGST_R0 0 +#define DGST_R1 1 +#define DGST_R2 2 +#define DGST_R3 3 + +#include "include/kernel_functions.c" +#include "types_nv.c" +#include "common_nv.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +__device__ __constant__ u32 te0[256] = +{ + 0xc66363a5, 0xf87c7c84, 0xee777799, 0xf67b7b8d, + 0xfff2f20d, 0xd66b6bbd, 0xde6f6fb1, 0x91c5c554, + 0x60303050, 0x02010103, 0xce6767a9, 0x562b2b7d, + 0xe7fefe19, 0xb5d7d762, 0x4dababe6, 0xec76769a, + 0x8fcaca45, 0x1f82829d, 0x89c9c940, 0xfa7d7d87, + 0xeffafa15, 0xb25959eb, 0x8e4747c9, 0xfbf0f00b, + 0x41adadec, 0xb3d4d467, 0x5fa2a2fd, 0x45afafea, + 0x239c9cbf, 0x53a4a4f7, 0xe4727296, 0x9bc0c05b, + 0x75b7b7c2, 0xe1fdfd1c, 0x3d9393ae, 0x4c26266a, + 0x6c36365a, 0x7e3f3f41, 0xf5f7f702, 0x83cccc4f, + 0x6834345c, 0x51a5a5f4, 0xd1e5e534, 0xf9f1f108, + 0xe2717193, 0xabd8d873, 0x62313153, 0x2a15153f, + 0x0804040c, 0x95c7c752, 0x46232365, 0x9dc3c35e, + 0x30181828, 0x379696a1, 0x0a05050f, 0x2f9a9ab5, + 0x0e070709, 0x24121236, 0x1b80809b, 0xdfe2e23d, + 0xcdebeb26, 0x4e272769, 0x7fb2b2cd, 0xea75759f, + 0x1209091b, 0x1d83839e, 0x582c2c74, 0x341a1a2e, + 0x361b1b2d, 0xdc6e6eb2, 0xb45a5aee, 0x5ba0a0fb, + 0xa45252f6, 0x763b3b4d, 0xb7d6d661, 0x7db3b3ce, + 0x5229297b, 0xdde3e33e, 0x5e2f2f71, 0x13848497, + 0xa65353f5, 0xb9d1d168, 0x00000000, 0xc1eded2c, + 0x40202060, 0xe3fcfc1f, 0x79b1b1c8, 0xb65b5bed, + 0xd46a6abe, 0x8dcbcb46, 0x67bebed9, 0x7239394b, + 0x944a4ade, 0x984c4cd4, 0xb05858e8, 0x85cfcf4a, + 0xbbd0d06b, 0xc5efef2a, 0x4faaaae5, 0xedfbfb16, + 0x864343c5, 0x9a4d4dd7, 0x66333355, 0x11858594, + 0x8a4545cf, 0xe9f9f910, 0x04020206, 0xfe7f7f81, + 0xa05050f0, 0x783c3c44, 0x259f9fba, 0x4ba8a8e3, + 0xa25151f3, 0x5da3a3fe, 0x804040c0, 0x058f8f8a, + 0x3f9292ad, 0x219d9dbc, 0x70383848, 0xf1f5f504, + 0x63bcbcdf, 0x77b6b6c1, 0xafdada75, 0x42212163, + 0x20101030, 0xe5ffff1a, 0xfdf3f30e, 0xbfd2d26d, + 0x81cdcd4c, 0x180c0c14, 0x26131335, 0xc3ecec2f, + 0xbe5f5fe1, 0x359797a2, 0x884444cc, 0x2e171739, + 0x93c4c457, 0x55a7a7f2, 0xfc7e7e82, 0x7a3d3d47, + 0xc86464ac, 0xba5d5de7, 0x3219192b, 0xe6737395, + 0xc06060a0, 0x19818198, 0x9e4f4fd1, 0xa3dcdc7f, + 0x44222266, 0x542a2a7e, 0x3b9090ab, 0x0b888883, + 0x8c4646ca, 0xc7eeee29, 0x6bb8b8d3, 0x2814143c, + 0xa7dede79, 0xbc5e5ee2, 0x160b0b1d, 0xaddbdb76, + 0xdbe0e03b, 0x64323256, 0x743a3a4e, 0x140a0a1e, + 0x924949db, 0x0c06060a, 0x4824246c, 0xb85c5ce4, + 0x9fc2c25d, 0xbdd3d36e, 0x43acacef, 0xc46262a6, + 0x399191a8, 0x319595a4, 0xd3e4e437, 0xf279798b, + 0xd5e7e732, 0x8bc8c843, 0x6e373759, 0xda6d6db7, + 0x018d8d8c, 0xb1d5d564, 0x9c4e4ed2, 0x49a9a9e0, + 0xd86c6cb4, 0xac5656fa, 0xf3f4f407, 0xcfeaea25, + 0xca6565af, 0xf47a7a8e, 0x47aeaee9, 0x10080818, + 0x6fbabad5, 0xf0787888, 0x4a25256f, 0x5c2e2e72, + 0x381c1c24, 0x57a6a6f1, 0x73b4b4c7, 0x97c6c651, + 0xcbe8e823, 0xa1dddd7c, 0xe874749c, 0x3e1f1f21, + 0x964b4bdd, 0x61bdbddc, 0x0d8b8b86, 0x0f8a8a85, + 0xe0707090, 0x7c3e3e42, 0x71b5b5c4, 0xcc6666aa, + 0x904848d8, 0x06030305, 0xf7f6f601, 0x1c0e0e12, + 0xc26161a3, 0x6a35355f, 0xae5757f9, 0x69b9b9d0, + 0x17868691, 0x99c1c158, 0x3a1d1d27, 0x279e9eb9, + 0xd9e1e138, 0xebf8f813, 0x2b9898b3, 0x22111133, + 0xd26969bb, 0xa9d9d970, 0x078e8e89, 0x339494a7, + 0x2d9b9bb6, 0x3c1e1e22, 0x15878792, 0xc9e9e920, + 0x87cece49, 0xaa5555ff, 0x50282878, 0xa5dfdf7a, + 0x038c8c8f, 0x59a1a1f8, 0x09898980, 0x1a0d0d17, + 0x65bfbfda, 0xd7e6e631, 0x844242c6, 0xd06868b8, + 0x824141c3, 0x299999b0, 0x5a2d2d77, 0x1e0f0f11, + 0x7bb0b0cb, 0xa85454fc, 0x6dbbbbd6, 0x2c16163a, +}; + +__device__ __constant__ u32 te1[256] = +{ + 0xa5c66363, 0x84f87c7c, 0x99ee7777, 0x8df67b7b, + 0x0dfff2f2, 0xbdd66b6b, 0xb1de6f6f, 0x5491c5c5, + 0x50603030, 0x03020101, 0xa9ce6767, 0x7d562b2b, + 0x19e7fefe, 0x62b5d7d7, 0xe64dabab, 0x9aec7676, + 0x458fcaca, 0x9d1f8282, 0x4089c9c9, 0x87fa7d7d, + 0x15effafa, 0xebb25959, 0xc98e4747, 0x0bfbf0f0, + 0xec41adad, 0x67b3d4d4, 0xfd5fa2a2, 0xea45afaf, + 0xbf239c9c, 0xf753a4a4, 0x96e47272, 0x5b9bc0c0, + 0xc275b7b7, 0x1ce1fdfd, 0xae3d9393, 0x6a4c2626, + 0x5a6c3636, 0x417e3f3f, 0x02f5f7f7, 0x4f83cccc, + 0x5c683434, 0xf451a5a5, 0x34d1e5e5, 0x08f9f1f1, + 0x93e27171, 0x73abd8d8, 0x53623131, 0x3f2a1515, + 0x0c080404, 0x5295c7c7, 0x65462323, 0x5e9dc3c3, + 0x28301818, 0xa1379696, 0x0f0a0505, 0xb52f9a9a, + 0x090e0707, 0x36241212, 0x9b1b8080, 0x3ddfe2e2, + 0x26cdebeb, 0x694e2727, 0xcd7fb2b2, 0x9fea7575, + 0x1b120909, 0x9e1d8383, 0x74582c2c, 0x2e341a1a, + 0x2d361b1b, 0xb2dc6e6e, 0xeeb45a5a, 0xfb5ba0a0, + 0xf6a45252, 0x4d763b3b, 0x61b7d6d6, 0xce7db3b3, + 0x7b522929, 0x3edde3e3, 0x715e2f2f, 0x97138484, + 0xf5a65353, 0x68b9d1d1, 0x00000000, 0x2cc1eded, + 0x60402020, 0x1fe3fcfc, 0xc879b1b1, 0xedb65b5b, + 0xbed46a6a, 0x468dcbcb, 0xd967bebe, 0x4b723939, + 0xde944a4a, 0xd4984c4c, 0xe8b05858, 0x4a85cfcf, + 0x6bbbd0d0, 0x2ac5efef, 0xe54faaaa, 0x16edfbfb, + 0xc5864343, 0xd79a4d4d, 0x55663333, 0x94118585, + 0xcf8a4545, 0x10e9f9f9, 0x06040202, 0x81fe7f7f, + 0xf0a05050, 0x44783c3c, 0xba259f9f, 0xe34ba8a8, + 0xf3a25151, 0xfe5da3a3, 0xc0804040, 0x8a058f8f, + 0xad3f9292, 0xbc219d9d, 0x48703838, 0x04f1f5f5, + 0xdf63bcbc, 0xc177b6b6, 0x75afdada, 0x63422121, + 0x30201010, 0x1ae5ffff, 0x0efdf3f3, 0x6dbfd2d2, + 0x4c81cdcd, 0x14180c0c, 0x35261313, 0x2fc3ecec, + 0xe1be5f5f, 0xa2359797, 0xcc884444, 0x392e1717, + 0x5793c4c4, 0xf255a7a7, 0x82fc7e7e, 0x477a3d3d, + 0xacc86464, 0xe7ba5d5d, 0x2b321919, 0x95e67373, + 0xa0c06060, 0x98198181, 0xd19e4f4f, 0x7fa3dcdc, + 0x66442222, 0x7e542a2a, 0xab3b9090, 0x830b8888, + 0xca8c4646, 0x29c7eeee, 0xd36bb8b8, 0x3c281414, + 0x79a7dede, 0xe2bc5e5e, 0x1d160b0b, 0x76addbdb, + 0x3bdbe0e0, 0x56643232, 0x4e743a3a, 0x1e140a0a, + 0xdb924949, 0x0a0c0606, 0x6c482424, 0xe4b85c5c, + 0x5d9fc2c2, 0x6ebdd3d3, 0xef43acac, 0xa6c46262, + 0xa8399191, 0xa4319595, 0x37d3e4e4, 0x8bf27979, + 0x32d5e7e7, 0x438bc8c8, 0x596e3737, 0xb7da6d6d, + 0x8c018d8d, 0x64b1d5d5, 0xd29c4e4e, 0xe049a9a9, + 0xb4d86c6c, 0xfaac5656, 0x07f3f4f4, 0x25cfeaea, + 0xafca6565, 0x8ef47a7a, 0xe947aeae, 0x18100808, + 0xd56fbaba, 0x88f07878, 0x6f4a2525, 0x725c2e2e, + 0x24381c1c, 0xf157a6a6, 0xc773b4b4, 0x5197c6c6, + 0x23cbe8e8, 0x7ca1dddd, 0x9ce87474, 0x213e1f1f, + 0xdd964b4b, 0xdc61bdbd, 0x860d8b8b, 0x850f8a8a, + 0x90e07070, 0x427c3e3e, 0xc471b5b5, 0xaacc6666, + 0xd8904848, 0x05060303, 0x01f7f6f6, 0x121c0e0e, + 0xa3c26161, 0x5f6a3535, 0xf9ae5757, 0xd069b9b9, + 0x91178686, 0x5899c1c1, 0x273a1d1d, 0xb9279e9e, + 0x38d9e1e1, 0x13ebf8f8, 0xb32b9898, 0x33221111, + 0xbbd26969, 0x70a9d9d9, 0x89078e8e, 0xa7339494, + 0xb62d9b9b, 0x223c1e1e, 0x92158787, 0x20c9e9e9, + 0x4987cece, 0xffaa5555, 0x78502828, 0x7aa5dfdf, + 0x8f038c8c, 0xf859a1a1, 0x80098989, 0x171a0d0d, + 0xda65bfbf, 0x31d7e6e6, 0xc6844242, 0xb8d06868, + 0xc3824141, 0xb0299999, 0x775a2d2d, 0x111e0f0f, + 0xcb7bb0b0, 0xfca85454, 0xd66dbbbb, 0x3a2c1616, +}; + +__device__ __constant__ u32 te2[256] = +{ + 0x63a5c663, 0x7c84f87c, 0x7799ee77, 0x7b8df67b, + 0xf20dfff2, 0x6bbdd66b, 0x6fb1de6f, 0xc55491c5, + 0x30506030, 0x01030201, 0x67a9ce67, 0x2b7d562b, + 0xfe19e7fe, 0xd762b5d7, 0xabe64dab, 0x769aec76, + 0xca458fca, 0x829d1f82, 0xc94089c9, 0x7d87fa7d, + 0xfa15effa, 0x59ebb259, 0x47c98e47, 0xf00bfbf0, + 0xadec41ad, 0xd467b3d4, 0xa2fd5fa2, 0xafea45af, + 0x9cbf239c, 0xa4f753a4, 0x7296e472, 0xc05b9bc0, + 0xb7c275b7, 0xfd1ce1fd, 0x93ae3d93, 0x266a4c26, + 0x365a6c36, 0x3f417e3f, 0xf702f5f7, 0xcc4f83cc, + 0x345c6834, 0xa5f451a5, 0xe534d1e5, 0xf108f9f1, + 0x7193e271, 0xd873abd8, 0x31536231, 0x153f2a15, + 0x040c0804, 0xc75295c7, 0x23654623, 0xc35e9dc3, + 0x18283018, 0x96a13796, 0x050f0a05, 0x9ab52f9a, + 0x07090e07, 0x12362412, 0x809b1b80, 0xe23ddfe2, + 0xeb26cdeb, 0x27694e27, 0xb2cd7fb2, 0x759fea75, + 0x091b1209, 0x839e1d83, 0x2c74582c, 0x1a2e341a, + 0x1b2d361b, 0x6eb2dc6e, 0x5aeeb45a, 0xa0fb5ba0, + 0x52f6a452, 0x3b4d763b, 0xd661b7d6, 0xb3ce7db3, + 0x297b5229, 0xe33edde3, 0x2f715e2f, 0x84971384, + 0x53f5a653, 0xd168b9d1, 0x00000000, 0xed2cc1ed, + 0x20604020, 0xfc1fe3fc, 0xb1c879b1, 0x5bedb65b, + 0x6abed46a, 0xcb468dcb, 0xbed967be, 0x394b7239, + 0x4ade944a, 0x4cd4984c, 0x58e8b058, 0xcf4a85cf, + 0xd06bbbd0, 0xef2ac5ef, 0xaae54faa, 0xfb16edfb, + 0x43c58643, 0x4dd79a4d, 0x33556633, 0x85941185, + 0x45cf8a45, 0xf910e9f9, 0x02060402, 0x7f81fe7f, + 0x50f0a050, 0x3c44783c, 0x9fba259f, 0xa8e34ba8, + 0x51f3a251, 0xa3fe5da3, 0x40c08040, 0x8f8a058f, + 0x92ad3f92, 0x9dbc219d, 0x38487038, 0xf504f1f5, + 0xbcdf63bc, 0xb6c177b6, 0xda75afda, 0x21634221, + 0x10302010, 0xff1ae5ff, 0xf30efdf3, 0xd26dbfd2, + 0xcd4c81cd, 0x0c14180c, 0x13352613, 0xec2fc3ec, + 0x5fe1be5f, 0x97a23597, 0x44cc8844, 0x17392e17, + 0xc45793c4, 0xa7f255a7, 0x7e82fc7e, 0x3d477a3d, + 0x64acc864, 0x5de7ba5d, 0x192b3219, 0x7395e673, + 0x60a0c060, 0x81981981, 0x4fd19e4f, 0xdc7fa3dc, + 0x22664422, 0x2a7e542a, 0x90ab3b90, 0x88830b88, + 0x46ca8c46, 0xee29c7ee, 0xb8d36bb8, 0x143c2814, + 0xde79a7de, 0x5ee2bc5e, 0x0b1d160b, 0xdb76addb, + 0xe03bdbe0, 0x32566432, 0x3a4e743a, 0x0a1e140a, + 0x49db9249, 0x060a0c06, 0x246c4824, 0x5ce4b85c, + 0xc25d9fc2, 0xd36ebdd3, 0xacef43ac, 0x62a6c462, + 0x91a83991, 0x95a43195, 0xe437d3e4, 0x798bf279, + 0xe732d5e7, 0xc8438bc8, 0x37596e37, 0x6db7da6d, + 0x8d8c018d, 0xd564b1d5, 0x4ed29c4e, 0xa9e049a9, + 0x6cb4d86c, 0x56faac56, 0xf407f3f4, 0xea25cfea, + 0x65afca65, 0x7a8ef47a, 0xaee947ae, 0x08181008, + 0xbad56fba, 0x7888f078, 0x256f4a25, 0x2e725c2e, + 0x1c24381c, 0xa6f157a6, 0xb4c773b4, 0xc65197c6, + 0xe823cbe8, 0xdd7ca1dd, 0x749ce874, 0x1f213e1f, + 0x4bdd964b, 0xbddc61bd, 0x8b860d8b, 0x8a850f8a, + 0x7090e070, 0x3e427c3e, 0xb5c471b5, 0x66aacc66, + 0x48d89048, 0x03050603, 0xf601f7f6, 0x0e121c0e, + 0x61a3c261, 0x355f6a35, 0x57f9ae57, 0xb9d069b9, + 0x86911786, 0xc15899c1, 0x1d273a1d, 0x9eb9279e, + 0xe138d9e1, 0xf813ebf8, 0x98b32b98, 0x11332211, + 0x69bbd269, 0xd970a9d9, 0x8e89078e, 0x94a73394, + 0x9bb62d9b, 0x1e223c1e, 0x87921587, 0xe920c9e9, + 0xce4987ce, 0x55ffaa55, 0x28785028, 0xdf7aa5df, + 0x8c8f038c, 0xa1f859a1, 0x89800989, 0x0d171a0d, + 0xbfda65bf, 0xe631d7e6, 0x42c68442, 0x68b8d068, + 0x41c38241, 0x99b02999, 0x2d775a2d, 0x0f111e0f, + 0xb0cb7bb0, 0x54fca854, 0xbbd66dbb, 0x163a2c16, +}; + +__device__ __constant__ u32 te3[256] = +{ + 0x6363a5c6, 0x7c7c84f8, 0x777799ee, 0x7b7b8df6, + 0xf2f20dff, 0x6b6bbdd6, 0x6f6fb1de, 0xc5c55491, + 0x30305060, 0x01010302, 0x6767a9ce, 0x2b2b7d56, + 0xfefe19e7, 0xd7d762b5, 0xababe64d, 0x76769aec, + 0xcaca458f, 0x82829d1f, 0xc9c94089, 0x7d7d87fa, + 0xfafa15ef, 0x5959ebb2, 0x4747c98e, 0xf0f00bfb, + 0xadadec41, 0xd4d467b3, 0xa2a2fd5f, 0xafafea45, + 0x9c9cbf23, 0xa4a4f753, 0x727296e4, 0xc0c05b9b, + 0xb7b7c275, 0xfdfd1ce1, 0x9393ae3d, 0x26266a4c, + 0x36365a6c, 0x3f3f417e, 0xf7f702f5, 0xcccc4f83, + 0x34345c68, 0xa5a5f451, 0xe5e534d1, 0xf1f108f9, + 0x717193e2, 0xd8d873ab, 0x31315362, 0x15153f2a, + 0x04040c08, 0xc7c75295, 0x23236546, 0xc3c35e9d, + 0x18182830, 0x9696a137, 0x05050f0a, 0x9a9ab52f, + 0x0707090e, 0x12123624, 0x80809b1b, 0xe2e23ddf, + 0xebeb26cd, 0x2727694e, 0xb2b2cd7f, 0x75759fea, + 0x09091b12, 0x83839e1d, 0x2c2c7458, 0x1a1a2e34, + 0x1b1b2d36, 0x6e6eb2dc, 0x5a5aeeb4, 0xa0a0fb5b, + 0x5252f6a4, 0x3b3b4d76, 0xd6d661b7, 0xb3b3ce7d, + 0x29297b52, 0xe3e33edd, 0x2f2f715e, 0x84849713, + 0x5353f5a6, 0xd1d168b9, 0x00000000, 0xeded2cc1, + 0x20206040, 0xfcfc1fe3, 0xb1b1c879, 0x5b5bedb6, + 0x6a6abed4, 0xcbcb468d, 0xbebed967, 0x39394b72, + 0x4a4ade94, 0x4c4cd498, 0x5858e8b0, 0xcfcf4a85, + 0xd0d06bbb, 0xefef2ac5, 0xaaaae54f, 0xfbfb16ed, + 0x4343c586, 0x4d4dd79a, 0x33335566, 0x85859411, + 0x4545cf8a, 0xf9f910e9, 0x02020604, 0x7f7f81fe, + 0x5050f0a0, 0x3c3c4478, 0x9f9fba25, 0xa8a8e34b, + 0x5151f3a2, 0xa3a3fe5d, 0x4040c080, 0x8f8f8a05, + 0x9292ad3f, 0x9d9dbc21, 0x38384870, 0xf5f504f1, + 0xbcbcdf63, 0xb6b6c177, 0xdada75af, 0x21216342, + 0x10103020, 0xffff1ae5, 0xf3f30efd, 0xd2d26dbf, + 0xcdcd4c81, 0x0c0c1418, 0x13133526, 0xecec2fc3, + 0x5f5fe1be, 0x9797a235, 0x4444cc88, 0x1717392e, + 0xc4c45793, 0xa7a7f255, 0x7e7e82fc, 0x3d3d477a, + 0x6464acc8, 0x5d5de7ba, 0x19192b32, 0x737395e6, + 0x6060a0c0, 0x81819819, 0x4f4fd19e, 0xdcdc7fa3, + 0x22226644, 0x2a2a7e54, 0x9090ab3b, 0x8888830b, + 0x4646ca8c, 0xeeee29c7, 0xb8b8d36b, 0x14143c28, + 0xdede79a7, 0x5e5ee2bc, 0x0b0b1d16, 0xdbdb76ad, + 0xe0e03bdb, 0x32325664, 0x3a3a4e74, 0x0a0a1e14, + 0x4949db92, 0x06060a0c, 0x24246c48, 0x5c5ce4b8, + 0xc2c25d9f, 0xd3d36ebd, 0xacacef43, 0x6262a6c4, + 0x9191a839, 0x9595a431, 0xe4e437d3, 0x79798bf2, + 0xe7e732d5, 0xc8c8438b, 0x3737596e, 0x6d6db7da, + 0x8d8d8c01, 0xd5d564b1, 0x4e4ed29c, 0xa9a9e049, + 0x6c6cb4d8, 0x5656faac, 0xf4f407f3, 0xeaea25cf, + 0x6565afca, 0x7a7a8ef4, 0xaeaee947, 0x08081810, + 0xbabad56f, 0x787888f0, 0x25256f4a, 0x2e2e725c, + 0x1c1c2438, 0xa6a6f157, 0xb4b4c773, 0xc6c65197, + 0xe8e823cb, 0xdddd7ca1, 0x74749ce8, 0x1f1f213e, + 0x4b4bdd96, 0xbdbddc61, 0x8b8b860d, 0x8a8a850f, + 0x707090e0, 0x3e3e427c, 0xb5b5c471, 0x6666aacc, + 0x4848d890, 0x03030506, 0xf6f601f7, 0x0e0e121c, + 0x6161a3c2, 0x35355f6a, 0x5757f9ae, 0xb9b9d069, + 0x86869117, 0xc1c15899, 0x1d1d273a, 0x9e9eb927, + 0xe1e138d9, 0xf8f813eb, 0x9898b32b, 0x11113322, + 0x6969bbd2, 0xd9d970a9, 0x8e8e8907, 0x9494a733, + 0x9b9bb62d, 0x1e1e223c, 0x87879215, 0xe9e920c9, + 0xcece4987, 0x5555ffaa, 0x28287850, 0xdfdf7aa5, + 0x8c8c8f03, 0xa1a1f859, 0x89898009, 0x0d0d171a, + 0xbfbfda65, 0xe6e631d7, 0x4242c684, 0x6868b8d0, + 0x4141c382, 0x9999b029, 0x2d2d775a, 0x0f0f111e, + 0xb0b0cb7b, 0x5454fca8, 0xbbbbd66d, 0x16163a2c, +}; + +__device__ __constant__ u32 te4[256] = +{ + 0x63636363, 0x7c7c7c7c, 0x77777777, 0x7b7b7b7b, + 0xf2f2f2f2, 0x6b6b6b6b, 0x6f6f6f6f, 0xc5c5c5c5, + 0x30303030, 0x01010101, 0x67676767, 0x2b2b2b2b, + 0xfefefefe, 0xd7d7d7d7, 0xabababab, 0x76767676, + 0xcacacaca, 0x82828282, 0xc9c9c9c9, 0x7d7d7d7d, + 0xfafafafa, 0x59595959, 0x47474747, 0xf0f0f0f0, + 0xadadadad, 0xd4d4d4d4, 0xa2a2a2a2, 0xafafafaf, + 0x9c9c9c9c, 0xa4a4a4a4, 0x72727272, 0xc0c0c0c0, + 0xb7b7b7b7, 0xfdfdfdfd, 0x93939393, 0x26262626, + 0x36363636, 0x3f3f3f3f, 0xf7f7f7f7, 0xcccccccc, + 0x34343434, 0xa5a5a5a5, 0xe5e5e5e5, 0xf1f1f1f1, + 0x71717171, 0xd8d8d8d8, 0x31313131, 0x15151515, + 0x04040404, 0xc7c7c7c7, 0x23232323, 0xc3c3c3c3, + 0x18181818, 0x96969696, 0x05050505, 0x9a9a9a9a, + 0x07070707, 0x12121212, 0x80808080, 0xe2e2e2e2, + 0xebebebeb, 0x27272727, 0xb2b2b2b2, 0x75757575, + 0x09090909, 0x83838383, 0x2c2c2c2c, 0x1a1a1a1a, + 0x1b1b1b1b, 0x6e6e6e6e, 0x5a5a5a5a, 0xa0a0a0a0, + 0x52525252, 0x3b3b3b3b, 0xd6d6d6d6, 0xb3b3b3b3, + 0x29292929, 0xe3e3e3e3, 0x2f2f2f2f, 0x84848484, + 0x53535353, 0xd1d1d1d1, 0x00000000, 0xedededed, + 0x20202020, 0xfcfcfcfc, 0xb1b1b1b1, 0x5b5b5b5b, + 0x6a6a6a6a, 0xcbcbcbcb, 0xbebebebe, 0x39393939, + 0x4a4a4a4a, 0x4c4c4c4c, 0x58585858, 0xcfcfcfcf, + 0xd0d0d0d0, 0xefefefef, 0xaaaaaaaa, 0xfbfbfbfb, + 0x43434343, 0x4d4d4d4d, 0x33333333, 0x85858585, + 0x45454545, 0xf9f9f9f9, 0x02020202, 0x7f7f7f7f, + 0x50505050, 0x3c3c3c3c, 0x9f9f9f9f, 0xa8a8a8a8, + 0x51515151, 0xa3a3a3a3, 0x40404040, 0x8f8f8f8f, + 0x92929292, 0x9d9d9d9d, 0x38383838, 0xf5f5f5f5, + 0xbcbcbcbc, 0xb6b6b6b6, 0xdadadada, 0x21212121, + 0x10101010, 0xffffffff, 0xf3f3f3f3, 0xd2d2d2d2, + 0xcdcdcdcd, 0x0c0c0c0c, 0x13131313, 0xecececec, + 0x5f5f5f5f, 0x97979797, 0x44444444, 0x17171717, + 0xc4c4c4c4, 0xa7a7a7a7, 0x7e7e7e7e, 0x3d3d3d3d, + 0x64646464, 0x5d5d5d5d, 0x19191919, 0x73737373, + 0x60606060, 0x81818181, 0x4f4f4f4f, 0xdcdcdcdc, + 0x22222222, 0x2a2a2a2a, 0x90909090, 0x88888888, + 0x46464646, 0xeeeeeeee, 0xb8b8b8b8, 0x14141414, + 0xdededede, 0x5e5e5e5e, 0x0b0b0b0b, 0xdbdbdbdb, + 0xe0e0e0e0, 0x32323232, 0x3a3a3a3a, 0x0a0a0a0a, + 0x49494949, 0x06060606, 0x24242424, 0x5c5c5c5c, + 0xc2c2c2c2, 0xd3d3d3d3, 0xacacacac, 0x62626262, + 0x91919191, 0x95959595, 0xe4e4e4e4, 0x79797979, + 0xe7e7e7e7, 0xc8c8c8c8, 0x37373737, 0x6d6d6d6d, + 0x8d8d8d8d, 0xd5d5d5d5, 0x4e4e4e4e, 0xa9a9a9a9, + 0x6c6c6c6c, 0x56565656, 0xf4f4f4f4, 0xeaeaeaea, + 0x65656565, 0x7a7a7a7a, 0xaeaeaeae, 0x08080808, + 0xbabababa, 0x78787878, 0x25252525, 0x2e2e2e2e, + 0x1c1c1c1c, 0xa6a6a6a6, 0xb4b4b4b4, 0xc6c6c6c6, + 0xe8e8e8e8, 0xdddddddd, 0x74747474, 0x1f1f1f1f, + 0x4b4b4b4b, 0xbdbdbdbd, 0x8b8b8b8b, 0x8a8a8a8a, + 0x70707070, 0x3e3e3e3e, 0xb5b5b5b5, 0x66666666, + 0x48484848, 0x03030303, 0xf6f6f6f6, 0x0e0e0e0e, + 0x61616161, 0x35353535, 0x57575757, 0xb9b9b9b9, + 0x86868686, 0xc1c1c1c1, 0x1d1d1d1d, 0x9e9e9e9e, + 0xe1e1e1e1, 0xf8f8f8f8, 0x98989898, 0x11111111, + 0x69696969, 0xd9d9d9d9, 0x8e8e8e8e, 0x94949494, + 0x9b9b9b9b, 0x1e1e1e1e, 0x87878787, 0xe9e9e9e9, + 0xcececece, 0x55555555, 0x28282828, 0xdfdfdfdf, + 0x8c8c8c8c, 0xa1a1a1a1, 0x89898989, 0x0d0d0d0d, + 0xbfbfbfbf, 0xe6e6e6e6, 0x42424242, 0x68686868, + 0x41414141, 0x99999999, 0x2d2d2d2d, 0x0f0f0f0f, + 0xb0b0b0b0, 0x54545454, 0xbbbbbbbb, 0x16161616, +}; + +__device__ __constant__ u32 td0[256] = +{ + 0x51f4a750, 0x7e416553, 0x1a17a4c3, 0x3a275e96, + 0x3bab6bcb, 0x1f9d45f1, 0xacfa58ab, 0x4be30393, + 0x2030fa55, 0xad766df6, 0x88cc7691, 0xf5024c25, + 0x4fe5d7fc, 0xc52acbd7, 0x26354480, 0xb562a38f, + 0xdeb15a49, 0x25ba1b67, 0x45ea0e98, 0x5dfec0e1, + 0xc32f7502, 0x814cf012, 0x8d4697a3, 0x6bd3f9c6, + 0x038f5fe7, 0x15929c95, 0xbf6d7aeb, 0x955259da, + 0xd4be832d, 0x587421d3, 0x49e06929, 0x8ec9c844, + 0x75c2896a, 0xf48e7978, 0x99583e6b, 0x27b971dd, + 0xbee14fb6, 0xf088ad17, 0xc920ac66, 0x7dce3ab4, + 0x63df4a18, 0xe51a3182, 0x97513360, 0x62537f45, + 0xb16477e0, 0xbb6bae84, 0xfe81a01c, 0xf9082b94, + 0x70486858, 0x8f45fd19, 0x94de6c87, 0x527bf8b7, + 0xab73d323, 0x724b02e2, 0xe31f8f57, 0x6655ab2a, + 0xb2eb2807, 0x2fb5c203, 0x86c57b9a, 0xd33708a5, + 0x302887f2, 0x23bfa5b2, 0x02036aba, 0xed16825c, + 0x8acf1c2b, 0xa779b492, 0xf307f2f0, 0x4e69e2a1, + 0x65daf4cd, 0x0605bed5, 0xd134621f, 0xc4a6fe8a, + 0x342e539d, 0xa2f355a0, 0x058ae132, 0xa4f6eb75, + 0x0b83ec39, 0x4060efaa, 0x5e719f06, 0xbd6e1051, + 0x3e218af9, 0x96dd063d, 0xdd3e05ae, 0x4de6bd46, + 0x91548db5, 0x71c45d05, 0x0406d46f, 0x605015ff, + 0x1998fb24, 0xd6bde997, 0x894043cc, 0x67d99e77, + 0xb0e842bd, 0x07898b88, 0xe7195b38, 0x79c8eedb, + 0xa17c0a47, 0x7c420fe9, 0xf8841ec9, 0x00000000, + 0x09808683, 0x322bed48, 0x1e1170ac, 0x6c5a724e, + 0xfd0efffb, 0x0f853856, 0x3daed51e, 0x362d3927, + 0x0a0fd964, 0x685ca621, 0x9b5b54d1, 0x24362e3a, + 0x0c0a67b1, 0x9357e70f, 0xb4ee96d2, 0x1b9b919e, + 0x80c0c54f, 0x61dc20a2, 0x5a774b69, 0x1c121a16, + 0xe293ba0a, 0xc0a02ae5, 0x3c22e043, 0x121b171d, + 0x0e090d0b, 0xf28bc7ad, 0x2db6a8b9, 0x141ea9c8, + 0x57f11985, 0xaf75074c, 0xee99ddbb, 0xa37f60fd, + 0xf701269f, 0x5c72f5bc, 0x44663bc5, 0x5bfb7e34, + 0x8b432976, 0xcb23c6dc, 0xb6edfc68, 0xb8e4f163, + 0xd731dcca, 0x42638510, 0x13972240, 0x84c61120, + 0x854a247d, 0xd2bb3df8, 0xaef93211, 0xc729a16d, + 0x1d9e2f4b, 0xdcb230f3, 0x0d8652ec, 0x77c1e3d0, + 0x2bb3166c, 0xa970b999, 0x119448fa, 0x47e96422, + 0xa8fc8cc4, 0xa0f03f1a, 0x567d2cd8, 0x223390ef, + 0x87494ec7, 0xd938d1c1, 0x8ccaa2fe, 0x98d40b36, + 0xa6f581cf, 0xa57ade28, 0xdab78e26, 0x3fadbfa4, + 0x2c3a9de4, 0x5078920d, 0x6a5fcc9b, 0x547e4662, + 0xf68d13c2, 0x90d8b8e8, 0x2e39f75e, 0x82c3aff5, + 0x9f5d80be, 0x69d0937c, 0x6fd52da9, 0xcf2512b3, + 0xc8ac993b, 0x10187da7, 0xe89c636e, 0xdb3bbb7b, + 0xcd267809, 0x6e5918f4, 0xec9ab701, 0x834f9aa8, + 0xe6956e65, 0xaaffe67e, 0x21bccf08, 0xef15e8e6, + 0xbae79bd9, 0x4a6f36ce, 0xea9f09d4, 0x29b07cd6, + 0x31a4b2af, 0x2a3f2331, 0xc6a59430, 0x35a266c0, + 0x744ebc37, 0xfc82caa6, 0xe090d0b0, 0x33a7d815, + 0xf104984a, 0x41ecdaf7, 0x7fcd500e, 0x1791f62f, + 0x764dd68d, 0x43efb04d, 0xccaa4d54, 0xe49604df, + 0x9ed1b5e3, 0x4c6a881b, 0xc12c1fb8, 0x4665517f, + 0x9d5eea04, 0x018c355d, 0xfa877473, 0xfb0b412e, + 0xb3671d5a, 0x92dbd252, 0xe9105633, 0x6dd64713, + 0x9ad7618c, 0x37a10c7a, 0x59f8148e, 0xeb133c89, + 0xcea927ee, 0xb761c935, 0xe11ce5ed, 0x7a47b13c, + 0x9cd2df59, 0x55f2733f, 0x1814ce79, 0x73c737bf, + 0x53f7cdea, 0x5ffdaa5b, 0xdf3d6f14, 0x7844db86, + 0xcaaff381, 0xb968c43e, 0x3824342c, 0xc2a3405f, + 0x161dc372, 0xbce2250c, 0x283c498b, 0xff0d9541, + 0x39a80171, 0x080cb3de, 0xd8b4e49c, 0x6456c190, + 0x7bcb8461, 0xd532b670, 0x486c5c74, 0xd0b85742, +}; + +__device__ __constant__ u32 td1[256] = +{ + 0x5051f4a7, 0x537e4165, 0xc31a17a4, 0x963a275e, + 0xcb3bab6b, 0xf11f9d45, 0xabacfa58, 0x934be303, + 0x552030fa, 0xf6ad766d, 0x9188cc76, 0x25f5024c, + 0xfc4fe5d7, 0xd7c52acb, 0x80263544, 0x8fb562a3, + 0x49deb15a, 0x6725ba1b, 0x9845ea0e, 0xe15dfec0, + 0x02c32f75, 0x12814cf0, 0xa38d4697, 0xc66bd3f9, + 0xe7038f5f, 0x9515929c, 0xebbf6d7a, 0xda955259, + 0x2dd4be83, 0xd3587421, 0x2949e069, 0x448ec9c8, + 0x6a75c289, 0x78f48e79, 0x6b99583e, 0xdd27b971, + 0xb6bee14f, 0x17f088ad, 0x66c920ac, 0xb47dce3a, + 0x1863df4a, 0x82e51a31, 0x60975133, 0x4562537f, + 0xe0b16477, 0x84bb6bae, 0x1cfe81a0, 0x94f9082b, + 0x58704868, 0x198f45fd, 0x8794de6c, 0xb7527bf8, + 0x23ab73d3, 0xe2724b02, 0x57e31f8f, 0x2a6655ab, + 0x07b2eb28, 0x032fb5c2, 0x9a86c57b, 0xa5d33708, + 0xf2302887, 0xb223bfa5, 0xba02036a, 0x5ced1682, + 0x2b8acf1c, 0x92a779b4, 0xf0f307f2, 0xa14e69e2, + 0xcd65daf4, 0xd50605be, 0x1fd13462, 0x8ac4a6fe, + 0x9d342e53, 0xa0a2f355, 0x32058ae1, 0x75a4f6eb, + 0x390b83ec, 0xaa4060ef, 0x065e719f, 0x51bd6e10, + 0xf93e218a, 0x3d96dd06, 0xaedd3e05, 0x464de6bd, + 0xb591548d, 0x0571c45d, 0x6f0406d4, 0xff605015, + 0x241998fb, 0x97d6bde9, 0xcc894043, 0x7767d99e, + 0xbdb0e842, 0x8807898b, 0x38e7195b, 0xdb79c8ee, + 0x47a17c0a, 0xe97c420f, 0xc9f8841e, 0x00000000, + 0x83098086, 0x48322bed, 0xac1e1170, 0x4e6c5a72, + 0xfbfd0eff, 0x560f8538, 0x1e3daed5, 0x27362d39, + 0x640a0fd9, 0x21685ca6, 0xd19b5b54, 0x3a24362e, + 0xb10c0a67, 0x0f9357e7, 0xd2b4ee96, 0x9e1b9b91, + 0x4f80c0c5, 0xa261dc20, 0x695a774b, 0x161c121a, + 0x0ae293ba, 0xe5c0a02a, 0x433c22e0, 0x1d121b17, + 0x0b0e090d, 0xadf28bc7, 0xb92db6a8, 0xc8141ea9, + 0x8557f119, 0x4caf7507, 0xbbee99dd, 0xfda37f60, + 0x9ff70126, 0xbc5c72f5, 0xc544663b, 0x345bfb7e, + 0x768b4329, 0xdccb23c6, 0x68b6edfc, 0x63b8e4f1, + 0xcad731dc, 0x10426385, 0x40139722, 0x2084c611, + 0x7d854a24, 0xf8d2bb3d, 0x11aef932, 0x6dc729a1, + 0x4b1d9e2f, 0xf3dcb230, 0xec0d8652, 0xd077c1e3, + 0x6c2bb316, 0x99a970b9, 0xfa119448, 0x2247e964, + 0xc4a8fc8c, 0x1aa0f03f, 0xd8567d2c, 0xef223390, + 0xc787494e, 0xc1d938d1, 0xfe8ccaa2, 0x3698d40b, + 0xcfa6f581, 0x28a57ade, 0x26dab78e, 0xa43fadbf, + 0xe42c3a9d, 0x0d507892, 0x9b6a5fcc, 0x62547e46, + 0xc2f68d13, 0xe890d8b8, 0x5e2e39f7, 0xf582c3af, + 0xbe9f5d80, 0x7c69d093, 0xa96fd52d, 0xb3cf2512, + 0x3bc8ac99, 0xa710187d, 0x6ee89c63, 0x7bdb3bbb, + 0x09cd2678, 0xf46e5918, 0x01ec9ab7, 0xa8834f9a, + 0x65e6956e, 0x7eaaffe6, 0x0821bccf, 0xe6ef15e8, + 0xd9bae79b, 0xce4a6f36, 0xd4ea9f09, 0xd629b07c, + 0xaf31a4b2, 0x312a3f23, 0x30c6a594, 0xc035a266, + 0x37744ebc, 0xa6fc82ca, 0xb0e090d0, 0x1533a7d8, + 0x4af10498, 0xf741ecda, 0x0e7fcd50, 0x2f1791f6, + 0x8d764dd6, 0x4d43efb0, 0x54ccaa4d, 0xdfe49604, + 0xe39ed1b5, 0x1b4c6a88, 0xb8c12c1f, 0x7f466551, + 0x049d5eea, 0x5d018c35, 0x73fa8774, 0x2efb0b41, + 0x5ab3671d, 0x5292dbd2, 0x33e91056, 0x136dd647, + 0x8c9ad761, 0x7a37a10c, 0x8e59f814, 0x89eb133c, + 0xeecea927, 0x35b761c9, 0xede11ce5, 0x3c7a47b1, + 0x599cd2df, 0x3f55f273, 0x791814ce, 0xbf73c737, + 0xea53f7cd, 0x5b5ffdaa, 0x14df3d6f, 0x867844db, + 0x81caaff3, 0x3eb968c4, 0x2c382434, 0x5fc2a340, + 0x72161dc3, 0x0cbce225, 0x8b283c49, 0x41ff0d95, + 0x7139a801, 0xde080cb3, 0x9cd8b4e4, 0x906456c1, + 0x617bcb84, 0x70d532b6, 0x74486c5c, 0x42d0b857, +}; + +__device__ __constant__ u32 td2[256] = +{ + 0xa75051f4, 0x65537e41, 0xa4c31a17, 0x5e963a27, + 0x6bcb3bab, 0x45f11f9d, 0x58abacfa, 0x03934be3, + 0xfa552030, 0x6df6ad76, 0x769188cc, 0x4c25f502, + 0xd7fc4fe5, 0xcbd7c52a, 0x44802635, 0xa38fb562, + 0x5a49deb1, 0x1b6725ba, 0x0e9845ea, 0xc0e15dfe, + 0x7502c32f, 0xf012814c, 0x97a38d46, 0xf9c66bd3, + 0x5fe7038f, 0x9c951592, 0x7aebbf6d, 0x59da9552, + 0x832dd4be, 0x21d35874, 0x692949e0, 0xc8448ec9, + 0x896a75c2, 0x7978f48e, 0x3e6b9958, 0x71dd27b9, + 0x4fb6bee1, 0xad17f088, 0xac66c920, 0x3ab47dce, + 0x4a1863df, 0x3182e51a, 0x33609751, 0x7f456253, + 0x77e0b164, 0xae84bb6b, 0xa01cfe81, 0x2b94f908, + 0x68587048, 0xfd198f45, 0x6c8794de, 0xf8b7527b, + 0xd323ab73, 0x02e2724b, 0x8f57e31f, 0xab2a6655, + 0x2807b2eb, 0xc2032fb5, 0x7b9a86c5, 0x08a5d337, + 0x87f23028, 0xa5b223bf, 0x6aba0203, 0x825ced16, + 0x1c2b8acf, 0xb492a779, 0xf2f0f307, 0xe2a14e69, + 0xf4cd65da, 0xbed50605, 0x621fd134, 0xfe8ac4a6, + 0x539d342e, 0x55a0a2f3, 0xe132058a, 0xeb75a4f6, + 0xec390b83, 0xefaa4060, 0x9f065e71, 0x1051bd6e, + 0x8af93e21, 0x063d96dd, 0x05aedd3e, 0xbd464de6, + 0x8db59154, 0x5d0571c4, 0xd46f0406, 0x15ff6050, + 0xfb241998, 0xe997d6bd, 0x43cc8940, 0x9e7767d9, + 0x42bdb0e8, 0x8b880789, 0x5b38e719, 0xeedb79c8, + 0x0a47a17c, 0x0fe97c42, 0x1ec9f884, 0x00000000, + 0x86830980, 0xed48322b, 0x70ac1e11, 0x724e6c5a, + 0xfffbfd0e, 0x38560f85, 0xd51e3dae, 0x3927362d, + 0xd9640a0f, 0xa621685c, 0x54d19b5b, 0x2e3a2436, + 0x67b10c0a, 0xe70f9357, 0x96d2b4ee, 0x919e1b9b, + 0xc54f80c0, 0x20a261dc, 0x4b695a77, 0x1a161c12, + 0xba0ae293, 0x2ae5c0a0, 0xe0433c22, 0x171d121b, + 0x0d0b0e09, 0xc7adf28b, 0xa8b92db6, 0xa9c8141e, + 0x198557f1, 0x074caf75, 0xddbbee99, 0x60fda37f, + 0x269ff701, 0xf5bc5c72, 0x3bc54466, 0x7e345bfb, + 0x29768b43, 0xc6dccb23, 0xfc68b6ed, 0xf163b8e4, + 0xdccad731, 0x85104263, 0x22401397, 0x112084c6, + 0x247d854a, 0x3df8d2bb, 0x3211aef9, 0xa16dc729, + 0x2f4b1d9e, 0x30f3dcb2, 0x52ec0d86, 0xe3d077c1, + 0x166c2bb3, 0xb999a970, 0x48fa1194, 0x642247e9, + 0x8cc4a8fc, 0x3f1aa0f0, 0x2cd8567d, 0x90ef2233, + 0x4ec78749, 0xd1c1d938, 0xa2fe8cca, 0x0b3698d4, + 0x81cfa6f5, 0xde28a57a, 0x8e26dab7, 0xbfa43fad, + 0x9de42c3a, 0x920d5078, 0xcc9b6a5f, 0x4662547e, + 0x13c2f68d, 0xb8e890d8, 0xf75e2e39, 0xaff582c3, + 0x80be9f5d, 0x937c69d0, 0x2da96fd5, 0x12b3cf25, + 0x993bc8ac, 0x7da71018, 0x636ee89c, 0xbb7bdb3b, + 0x7809cd26, 0x18f46e59, 0xb701ec9a, 0x9aa8834f, + 0x6e65e695, 0xe67eaaff, 0xcf0821bc, 0xe8e6ef15, + 0x9bd9bae7, 0x36ce4a6f, 0x09d4ea9f, 0x7cd629b0, + 0xb2af31a4, 0x23312a3f, 0x9430c6a5, 0x66c035a2, + 0xbc37744e, 0xcaa6fc82, 0xd0b0e090, 0xd81533a7, + 0x984af104, 0xdaf741ec, 0x500e7fcd, 0xf62f1791, + 0xd68d764d, 0xb04d43ef, 0x4d54ccaa, 0x04dfe496, + 0xb5e39ed1, 0x881b4c6a, 0x1fb8c12c, 0x517f4665, + 0xea049d5e, 0x355d018c, 0x7473fa87, 0x412efb0b, + 0x1d5ab367, 0xd25292db, 0x5633e910, 0x47136dd6, + 0x618c9ad7, 0x0c7a37a1, 0x148e59f8, 0x3c89eb13, + 0x27eecea9, 0xc935b761, 0xe5ede11c, 0xb13c7a47, + 0xdf599cd2, 0x733f55f2, 0xce791814, 0x37bf73c7, + 0xcdea53f7, 0xaa5b5ffd, 0x6f14df3d, 0xdb867844, + 0xf381caaf, 0xc43eb968, 0x342c3824, 0x405fc2a3, + 0xc372161d, 0x250cbce2, 0x498b283c, 0x9541ff0d, + 0x017139a8, 0xb3de080c, 0xe49cd8b4, 0xc1906456, + 0x84617bcb, 0xb670d532, 0x5c74486c, 0x5742d0b8, +}; + +__device__ __constant__ u32 td3[256] = +{ + 0xf4a75051, 0x4165537e, 0x17a4c31a, 0x275e963a, + 0xab6bcb3b, 0x9d45f11f, 0xfa58abac, 0xe303934b, + 0x30fa5520, 0x766df6ad, 0xcc769188, 0x024c25f5, + 0xe5d7fc4f, 0x2acbd7c5, 0x35448026, 0x62a38fb5, + 0xb15a49de, 0xba1b6725, 0xea0e9845, 0xfec0e15d, + 0x2f7502c3, 0x4cf01281, 0x4697a38d, 0xd3f9c66b, + 0x8f5fe703, 0x929c9515, 0x6d7aebbf, 0x5259da95, + 0xbe832dd4, 0x7421d358, 0xe0692949, 0xc9c8448e, + 0xc2896a75, 0x8e7978f4, 0x583e6b99, 0xb971dd27, + 0xe14fb6be, 0x88ad17f0, 0x20ac66c9, 0xce3ab47d, + 0xdf4a1863, 0x1a3182e5, 0x51336097, 0x537f4562, + 0x6477e0b1, 0x6bae84bb, 0x81a01cfe, 0x082b94f9, + 0x48685870, 0x45fd198f, 0xde6c8794, 0x7bf8b752, + 0x73d323ab, 0x4b02e272, 0x1f8f57e3, 0x55ab2a66, + 0xeb2807b2, 0xb5c2032f, 0xc57b9a86, 0x3708a5d3, + 0x2887f230, 0xbfa5b223, 0x036aba02, 0x16825ced, + 0xcf1c2b8a, 0x79b492a7, 0x07f2f0f3, 0x69e2a14e, + 0xdaf4cd65, 0x05bed506, 0x34621fd1, 0xa6fe8ac4, + 0x2e539d34, 0xf355a0a2, 0x8ae13205, 0xf6eb75a4, + 0x83ec390b, 0x60efaa40, 0x719f065e, 0x6e1051bd, + 0x218af93e, 0xdd063d96, 0x3e05aedd, 0xe6bd464d, + 0x548db591, 0xc45d0571, 0x06d46f04, 0x5015ff60, + 0x98fb2419, 0xbde997d6, 0x4043cc89, 0xd99e7767, + 0xe842bdb0, 0x898b8807, 0x195b38e7, 0xc8eedb79, + 0x7c0a47a1, 0x420fe97c, 0x841ec9f8, 0x00000000, + 0x80868309, 0x2bed4832, 0x1170ac1e, 0x5a724e6c, + 0x0efffbfd, 0x8538560f, 0xaed51e3d, 0x2d392736, + 0x0fd9640a, 0x5ca62168, 0x5b54d19b, 0x362e3a24, + 0x0a67b10c, 0x57e70f93, 0xee96d2b4, 0x9b919e1b, + 0xc0c54f80, 0xdc20a261, 0x774b695a, 0x121a161c, + 0x93ba0ae2, 0xa02ae5c0, 0x22e0433c, 0x1b171d12, + 0x090d0b0e, 0x8bc7adf2, 0xb6a8b92d, 0x1ea9c814, + 0xf1198557, 0x75074caf, 0x99ddbbee, 0x7f60fda3, + 0x01269ff7, 0x72f5bc5c, 0x663bc544, 0xfb7e345b, + 0x4329768b, 0x23c6dccb, 0xedfc68b6, 0xe4f163b8, + 0x31dccad7, 0x63851042, 0x97224013, 0xc6112084, + 0x4a247d85, 0xbb3df8d2, 0xf93211ae, 0x29a16dc7, + 0x9e2f4b1d, 0xb230f3dc, 0x8652ec0d, 0xc1e3d077, + 0xb3166c2b, 0x70b999a9, 0x9448fa11, 0xe9642247, + 0xfc8cc4a8, 0xf03f1aa0, 0x7d2cd856, 0x3390ef22, + 0x494ec787, 0x38d1c1d9, 0xcaa2fe8c, 0xd40b3698, + 0xf581cfa6, 0x7ade28a5, 0xb78e26da, 0xadbfa43f, + 0x3a9de42c, 0x78920d50, 0x5fcc9b6a, 0x7e466254, + 0x8d13c2f6, 0xd8b8e890, 0x39f75e2e, 0xc3aff582, + 0x5d80be9f, 0xd0937c69, 0xd52da96f, 0x2512b3cf, + 0xac993bc8, 0x187da710, 0x9c636ee8, 0x3bbb7bdb, + 0x267809cd, 0x5918f46e, 0x9ab701ec, 0x4f9aa883, + 0x956e65e6, 0xffe67eaa, 0xbccf0821, 0x15e8e6ef, + 0xe79bd9ba, 0x6f36ce4a, 0x9f09d4ea, 0xb07cd629, + 0xa4b2af31, 0x3f23312a, 0xa59430c6, 0xa266c035, + 0x4ebc3774, 0x82caa6fc, 0x90d0b0e0, 0xa7d81533, + 0x04984af1, 0xecdaf741, 0xcd500e7f, 0x91f62f17, + 0x4dd68d76, 0xefb04d43, 0xaa4d54cc, 0x9604dfe4, + 0xd1b5e39e, 0x6a881b4c, 0x2c1fb8c1, 0x65517f46, + 0x5eea049d, 0x8c355d01, 0x877473fa, 0x0b412efb, + 0x671d5ab3, 0xdbd25292, 0x105633e9, 0xd647136d, + 0xd7618c9a, 0xa10c7a37, 0xf8148e59, 0x133c89eb, + 0xa927eece, 0x61c935b7, 0x1ce5ede1, 0x47b13c7a, + 0xd2df599c, 0xf2733f55, 0x14ce7918, 0xc737bf73, + 0xf7cdea53, 0xfdaa5b5f, 0x3d6f14df, 0x44db8678, + 0xaff381ca, 0x68c43eb9, 0x24342c38, 0xa3405fc2, + 0x1dc37216, 0xe2250cbc, 0x3c498b28, 0x0d9541ff, + 0xa8017139, 0x0cb3de08, 0xb4e49cd8, 0x56c19064, + 0xcb84617b, 0x32b670d5, 0x6c5c7448, 0xb85742d0, +}; + +__device__ __constant__ u32 td4[256] = +{ + 0x52525252, 0x09090909, 0x6a6a6a6a, 0xd5d5d5d5, + 0x30303030, 0x36363636, 0xa5a5a5a5, 0x38383838, + 0xbfbfbfbf, 0x40404040, 0xa3a3a3a3, 0x9e9e9e9e, + 0x81818181, 0xf3f3f3f3, 0xd7d7d7d7, 0xfbfbfbfb, + 0x7c7c7c7c, 0xe3e3e3e3, 0x39393939, 0x82828282, + 0x9b9b9b9b, 0x2f2f2f2f, 0xffffffff, 0x87878787, + 0x34343434, 0x8e8e8e8e, 0x43434343, 0x44444444, + 0xc4c4c4c4, 0xdededede, 0xe9e9e9e9, 0xcbcbcbcb, + 0x54545454, 0x7b7b7b7b, 0x94949494, 0x32323232, + 0xa6a6a6a6, 0xc2c2c2c2, 0x23232323, 0x3d3d3d3d, + 0xeeeeeeee, 0x4c4c4c4c, 0x95959595, 0x0b0b0b0b, + 0x42424242, 0xfafafafa, 0xc3c3c3c3, 0x4e4e4e4e, + 0x08080808, 0x2e2e2e2e, 0xa1a1a1a1, 0x66666666, + 0x28282828, 0xd9d9d9d9, 0x24242424, 0xb2b2b2b2, + 0x76767676, 0x5b5b5b5b, 0xa2a2a2a2, 0x49494949, + 0x6d6d6d6d, 0x8b8b8b8b, 0xd1d1d1d1, 0x25252525, + 0x72727272, 0xf8f8f8f8, 0xf6f6f6f6, 0x64646464, + 0x86868686, 0x68686868, 0x98989898, 0x16161616, + 0xd4d4d4d4, 0xa4a4a4a4, 0x5c5c5c5c, 0xcccccccc, + 0x5d5d5d5d, 0x65656565, 0xb6b6b6b6, 0x92929292, + 0x6c6c6c6c, 0x70707070, 0x48484848, 0x50505050, + 0xfdfdfdfd, 0xedededed, 0xb9b9b9b9, 0xdadadada, + 0x5e5e5e5e, 0x15151515, 0x46464646, 0x57575757, + 0xa7a7a7a7, 0x8d8d8d8d, 0x9d9d9d9d, 0x84848484, + 0x90909090, 0xd8d8d8d8, 0xabababab, 0x00000000, + 0x8c8c8c8c, 0xbcbcbcbc, 0xd3d3d3d3, 0x0a0a0a0a, + 0xf7f7f7f7, 0xe4e4e4e4, 0x58585858, 0x05050505, + 0xb8b8b8b8, 0xb3b3b3b3, 0x45454545, 0x06060606, + 0xd0d0d0d0, 0x2c2c2c2c, 0x1e1e1e1e, 0x8f8f8f8f, + 0xcacacaca, 0x3f3f3f3f, 0x0f0f0f0f, 0x02020202, + 0xc1c1c1c1, 0xafafafaf, 0xbdbdbdbd, 0x03030303, + 0x01010101, 0x13131313, 0x8a8a8a8a, 0x6b6b6b6b, + 0x3a3a3a3a, 0x91919191, 0x11111111, 0x41414141, + 0x4f4f4f4f, 0x67676767, 0xdcdcdcdc, 0xeaeaeaea, + 0x97979797, 0xf2f2f2f2, 0xcfcfcfcf, 0xcececece, + 0xf0f0f0f0, 0xb4b4b4b4, 0xe6e6e6e6, 0x73737373, + 0x96969696, 0xacacacac, 0x74747474, 0x22222222, + 0xe7e7e7e7, 0xadadadad, 0x35353535, 0x85858585, + 0xe2e2e2e2, 0xf9f9f9f9, 0x37373737, 0xe8e8e8e8, + 0x1c1c1c1c, 0x75757575, 0xdfdfdfdf, 0x6e6e6e6e, + 0x47474747, 0xf1f1f1f1, 0x1a1a1a1a, 0x71717171, + 0x1d1d1d1d, 0x29292929, 0xc5c5c5c5, 0x89898989, + 0x6f6f6f6f, 0xb7b7b7b7, 0x62626262, 0x0e0e0e0e, + 0xaaaaaaaa, 0x18181818, 0xbebebebe, 0x1b1b1b1b, + 0xfcfcfcfc, 0x56565656, 0x3e3e3e3e, 0x4b4b4b4b, + 0xc6c6c6c6, 0xd2d2d2d2, 0x79797979, 0x20202020, + 0x9a9a9a9a, 0xdbdbdbdb, 0xc0c0c0c0, 0xfefefefe, + 0x78787878, 0xcdcdcdcd, 0x5a5a5a5a, 0xf4f4f4f4, + 0x1f1f1f1f, 0xdddddddd, 0xa8a8a8a8, 0x33333333, + 0x88888888, 0x07070707, 0xc7c7c7c7, 0x31313131, + 0xb1b1b1b1, 0x12121212, 0x10101010, 0x59595959, + 0x27272727, 0x80808080, 0xecececec, 0x5f5f5f5f, + 0x60606060, 0x51515151, 0x7f7f7f7f, 0xa9a9a9a9, + 0x19191919, 0xb5b5b5b5, 0x4a4a4a4a, 0x0d0d0d0d, + 0x2d2d2d2d, 0xe5e5e5e5, 0x7a7a7a7a, 0x9f9f9f9f, + 0x93939393, 0xc9c9c9c9, 0x9c9c9c9c, 0xefefefef, + 0xa0a0a0a0, 0xe0e0e0e0, 0x3b3b3b3b, 0x4d4d4d4d, + 0xaeaeaeae, 0x2a2a2a2a, 0xf5f5f5f5, 0xb0b0b0b0, + 0xc8c8c8c8, 0xebebebeb, 0xbbbbbbbb, 0x3c3c3c3c, + 0x83838383, 0x53535353, 0x99999999, 0x61616161, + 0x17171717, 0x2b2b2b2b, 0x04040404, 0x7e7e7e7e, + 0xbabababa, 0x77777777, 0xd6d6d6d6, 0x26262626, + 0xe1e1e1e1, 0x69696969, 0x14141414, 0x63636363, + 0x55555555, 0x21212121, 0x0c0c0c0c, 0x7d7d7d7d, +}; + +__device__ __constant__ u32 rcon[] = +{ + 0x01000000, 0x02000000, 0x04000000, 0x08000000, + 0x10000000, 0x20000000, 0x40000000, 0x80000000, + 0x1b000000, 0x36000000, +}; + +__device__ static void AES128_ExpandKey (u32 *userkey, u32 *rek, u32 s_te0[256], u32 s_te1[256], u32 s_te2[256], u32 s_te3[256], u32 s_te4[256]) +{ + rek[0] = userkey[0]; + rek[1] = userkey[1]; + rek[2] = userkey[2]; + rek[3] = userkey[3]; + + #pragma unroll 10 + for (u32 i = 0, j = 0; i < 10; i += 1, j += 4) + { + u32 temp = rek[j + 3]; + + temp = (s_te2[(temp >> 16) & 0xff] & 0xff000000) + ^ (s_te3[(temp >> 8) & 0xff] & 0x00ff0000) + ^ (s_te0[(temp >> 0) & 0xff] & 0x0000ff00) + ^ (s_te1[(temp >> 24) & 0xff] & 0x000000ff); + + rek[j + 4] = rek[j + 0] + ^ temp + ^ rcon[i]; + + rek[j + 5] = rek[j + 1] ^ rek[j + 4]; + rek[j + 6] = rek[j + 2] ^ rek[j + 5]; + rek[j + 7] = rek[j + 3] ^ rek[j + 6]; + } +} + +__device__ static void AES128_InvertKey (u32 *rdk, u32 s_td0[256], u32 s_td1[256], u32 s_td2[256], u32 s_td3[256], u32 s_td4[256], u32 s_te0[256], u32 s_te1[256], u32 s_te2[256], u32 s_te3[256], u32 s_te4[256]) +{ + for (u32 i = 0, j = 40; i < j; i += 4, j -= 4) + { + u32 temp; + + temp = rdk[i + 0]; rdk[i + 0] = rdk[j + 0]; rdk[j + 0] = temp; + temp = rdk[i + 1]; rdk[i + 1] = rdk[j + 1]; rdk[j + 1] = temp; + temp = rdk[i + 2]; rdk[i + 2] = rdk[j + 2]; rdk[j + 2] = temp; + temp = rdk[i + 3]; rdk[i + 3] = rdk[j + 3]; rdk[j + 3] = temp; + } + + for (u32 i = 1, j = 4; i < 10; i += 1, j += 4) + { + rdk[j + 0] = + s_td0[s_te1[(rdk[j + 0] >> 24) & 0xff] & 0xff] ^ + s_td1[s_te1[(rdk[j + 0] >> 16) & 0xff] & 0xff] ^ + s_td2[s_te1[(rdk[j + 0] >> 8) & 0xff] & 0xff] ^ + s_td3[s_te1[(rdk[j + 0] >> 0) & 0xff] & 0xff]; + + rdk[j + 1] = + s_td0[s_te1[(rdk[j + 1] >> 24) & 0xff] & 0xff] ^ + s_td1[s_te1[(rdk[j + 1] >> 16) & 0xff] & 0xff] ^ + s_td2[s_te1[(rdk[j + 1] >> 8) & 0xff] & 0xff] ^ + s_td3[s_te1[(rdk[j + 1] >> 0) & 0xff] & 0xff]; + + rdk[j + 2] = + s_td0[s_te1[(rdk[j + 2] >> 24) & 0xff] & 0xff] ^ + s_td1[s_te1[(rdk[j + 2] >> 16) & 0xff] & 0xff] ^ + s_td2[s_te1[(rdk[j + 2] >> 8) & 0xff] & 0xff] ^ + s_td3[s_te1[(rdk[j + 2] >> 0) & 0xff] & 0xff]; + + rdk[j + 3] = + s_td0[s_te1[(rdk[j + 3] >> 24) & 0xff] & 0xff] ^ + s_td1[s_te1[(rdk[j + 3] >> 16) & 0xff] & 0xff] ^ + s_td2[s_te1[(rdk[j + 3] >> 8) & 0xff] & 0xff] ^ + s_td3[s_te1[(rdk[j + 3] >> 0) & 0xff] & 0xff]; + } +} + +__device__ static void AES128_decrypt (const u32 *in, u32 *out, const u32 *rdk, u32 s_td0[256], u32 s_td1[256], u32 s_td2[256], u32 s_td3[256], u32 s_td4[256]) +{ + u32 s0 = in[0] ^ rdk[0]; + u32 s1 = in[1] ^ rdk[1]; + u32 s2 = in[2] ^ rdk[2]; + u32 s3 = in[3] ^ rdk[3]; + + u32 t0; + u32 t1; + u32 t2; + u32 t3; + + t0 = s_td0[s0 >> 24] ^ s_td1[(s3 >> 16) & 0xff] ^ s_td2[(s2 >> 8) & 0xff] ^ s_td3[s1 & 0xff] ^ rdk[ 4]; + t1 = s_td0[s1 >> 24] ^ s_td1[(s0 >> 16) & 0xff] ^ s_td2[(s3 >> 8) & 0xff] ^ s_td3[s2 & 0xff] ^ rdk[ 5]; + t2 = s_td0[s2 >> 24] ^ s_td1[(s1 >> 16) & 0xff] ^ s_td2[(s0 >> 8) & 0xff] ^ s_td3[s3 & 0xff] ^ rdk[ 6]; + t3 = s_td0[s3 >> 24] ^ s_td1[(s2 >> 16) & 0xff] ^ s_td2[(s1 >> 8) & 0xff] ^ s_td3[s0 & 0xff] ^ rdk[ 7]; + s0 = s_td0[t0 >> 24] ^ s_td1[(t3 >> 16) & 0xff] ^ s_td2[(t2 >> 8) & 0xff] ^ s_td3[t1 & 0xff] ^ rdk[ 8]; + s1 = s_td0[t1 >> 24] ^ s_td1[(t0 >> 16) & 0xff] ^ s_td2[(t3 >> 8) & 0xff] ^ s_td3[t2 & 0xff] ^ rdk[ 9]; + s2 = s_td0[t2 >> 24] ^ s_td1[(t1 >> 16) & 0xff] ^ s_td2[(t0 >> 8) & 0xff] ^ s_td3[t3 & 0xff] ^ rdk[10]; + s3 = s_td0[t3 >> 24] ^ s_td1[(t2 >> 16) & 0xff] ^ s_td2[(t1 >> 8) & 0xff] ^ s_td3[t0 & 0xff] ^ rdk[11]; + t0 = s_td0[s0 >> 24] ^ s_td1[(s3 >> 16) & 0xff] ^ s_td2[(s2 >> 8) & 0xff] ^ s_td3[s1 & 0xff] ^ rdk[12]; + t1 = s_td0[s1 >> 24] ^ s_td1[(s0 >> 16) & 0xff] ^ s_td2[(s3 >> 8) & 0xff] ^ s_td3[s2 & 0xff] ^ rdk[13]; + t2 = s_td0[s2 >> 24] ^ s_td1[(s1 >> 16) & 0xff] ^ s_td2[(s0 >> 8) & 0xff] ^ s_td3[s3 & 0xff] ^ rdk[14]; + t3 = s_td0[s3 >> 24] ^ s_td1[(s2 >> 16) & 0xff] ^ s_td2[(s1 >> 8) & 0xff] ^ s_td3[s0 & 0xff] ^ rdk[15]; + s0 = s_td0[t0 >> 24] ^ s_td1[(t3 >> 16) & 0xff] ^ s_td2[(t2 >> 8) & 0xff] ^ s_td3[t1 & 0xff] ^ rdk[16]; + s1 = s_td0[t1 >> 24] ^ s_td1[(t0 >> 16) & 0xff] ^ s_td2[(t3 >> 8) & 0xff] ^ s_td3[t2 & 0xff] ^ rdk[17]; + s2 = s_td0[t2 >> 24] ^ s_td1[(t1 >> 16) & 0xff] ^ s_td2[(t0 >> 8) & 0xff] ^ s_td3[t3 & 0xff] ^ rdk[18]; + s3 = s_td0[t3 >> 24] ^ s_td1[(t2 >> 16) & 0xff] ^ s_td2[(t1 >> 8) & 0xff] ^ s_td3[t0 & 0xff] ^ rdk[19]; + t0 = s_td0[s0 >> 24] ^ s_td1[(s3 >> 16) & 0xff] ^ s_td2[(s2 >> 8) & 0xff] ^ s_td3[s1 & 0xff] ^ rdk[20]; + t1 = s_td0[s1 >> 24] ^ s_td1[(s0 >> 16) & 0xff] ^ s_td2[(s3 >> 8) & 0xff] ^ s_td3[s2 & 0xff] ^ rdk[21]; + t2 = s_td0[s2 >> 24] ^ s_td1[(s1 >> 16) & 0xff] ^ s_td2[(s0 >> 8) & 0xff] ^ s_td3[s3 & 0xff] ^ rdk[22]; + t3 = s_td0[s3 >> 24] ^ s_td1[(s2 >> 16) & 0xff] ^ s_td2[(s1 >> 8) & 0xff] ^ s_td3[s0 & 0xff] ^ rdk[23]; + s0 = s_td0[t0 >> 24] ^ s_td1[(t3 >> 16) & 0xff] ^ s_td2[(t2 >> 8) & 0xff] ^ s_td3[t1 & 0xff] ^ rdk[24]; + s1 = s_td0[t1 >> 24] ^ s_td1[(t0 >> 16) & 0xff] ^ s_td2[(t3 >> 8) & 0xff] ^ s_td3[t2 & 0xff] ^ rdk[25]; + s2 = s_td0[t2 >> 24] ^ s_td1[(t1 >> 16) & 0xff] ^ s_td2[(t0 >> 8) & 0xff] ^ s_td3[t3 & 0xff] ^ rdk[26]; + s3 = s_td0[t3 >> 24] ^ s_td1[(t2 >> 16) & 0xff] ^ s_td2[(t1 >> 8) & 0xff] ^ s_td3[t0 & 0xff] ^ rdk[27]; + t0 = s_td0[s0 >> 24] ^ s_td1[(s3 >> 16) & 0xff] ^ s_td2[(s2 >> 8) & 0xff] ^ s_td3[s1 & 0xff] ^ rdk[28]; + t1 = s_td0[s1 >> 24] ^ s_td1[(s0 >> 16) & 0xff] ^ s_td2[(s3 >> 8) & 0xff] ^ s_td3[s2 & 0xff] ^ rdk[29]; + t2 = s_td0[s2 >> 24] ^ s_td1[(s1 >> 16) & 0xff] ^ s_td2[(s0 >> 8) & 0xff] ^ s_td3[s3 & 0xff] ^ rdk[30]; + t3 = s_td0[s3 >> 24] ^ s_td1[(s2 >> 16) & 0xff] ^ s_td2[(s1 >> 8) & 0xff] ^ s_td3[s0 & 0xff] ^ rdk[31]; + s0 = s_td0[t0 >> 24] ^ s_td1[(t3 >> 16) & 0xff] ^ s_td2[(t2 >> 8) & 0xff] ^ s_td3[t1 & 0xff] ^ rdk[32]; + s1 = s_td0[t1 >> 24] ^ s_td1[(t0 >> 16) & 0xff] ^ s_td2[(t3 >> 8) & 0xff] ^ s_td3[t2 & 0xff] ^ rdk[33]; + s2 = s_td0[t2 >> 24] ^ s_td1[(t1 >> 16) & 0xff] ^ s_td2[(t0 >> 8) & 0xff] ^ s_td3[t3 & 0xff] ^ rdk[34]; + s3 = s_td0[t3 >> 24] ^ s_td1[(t2 >> 16) & 0xff] ^ s_td2[(t1 >> 8) & 0xff] ^ s_td3[t0 & 0xff] ^ rdk[35]; + t0 = s_td0[s0 >> 24] ^ s_td1[(s3 >> 16) & 0xff] ^ s_td2[(s2 >> 8) & 0xff] ^ s_td3[s1 & 0xff] ^ rdk[36]; + t1 = s_td0[s1 >> 24] ^ s_td1[(s0 >> 16) & 0xff] ^ s_td2[(s3 >> 8) & 0xff] ^ s_td3[s2 & 0xff] ^ rdk[37]; + t2 = s_td0[s2 >> 24] ^ s_td1[(s1 >> 16) & 0xff] ^ s_td2[(s0 >> 8) & 0xff] ^ s_td3[s3 & 0xff] ^ rdk[38]; + t3 = s_td0[s3 >> 24] ^ s_td1[(s2 >> 16) & 0xff] ^ s_td2[(s1 >> 8) & 0xff] ^ s_td3[s0 & 0xff] ^ rdk[39]; + + out[0] = (s_td4[(t0 >> 24) & 0xff] & 0xff000000) + ^ (s_td4[(t3 >> 16) & 0xff] & 0x00ff0000) + ^ (s_td4[(t2 >> 8) & 0xff] & 0x0000ff00) + ^ (s_td4[(t1 >> 0) & 0xff] & 0x000000ff) + ^ rdk[40]; + + out[1] = (s_td4[(t1 >> 24) & 0xff] & 0xff000000) + ^ (s_td4[(t0 >> 16) & 0xff] & 0x00ff0000) + ^ (s_td4[(t3 >> 8) & 0xff] & 0x0000ff00) + ^ (s_td4[(t2 >> 0) & 0xff] & 0x000000ff) + ^ rdk[41]; + + out[2] = (s_td4[(t2 >> 24) & 0xff] & 0xff000000) + ^ (s_td4[(t1 >> 16) & 0xff] & 0x00ff0000) + ^ (s_td4[(t0 >> 8) & 0xff] & 0x0000ff00) + ^ (s_td4[(t3 >> 0) & 0xff] & 0x000000ff) + ^ rdk[42]; + + out[3] = (s_td4[(t3 >> 24) & 0xff] & 0xff000000) + ^ (s_td4[(t2 >> 16) & 0xff] & 0x00ff0000) + ^ (s_td4[(t1 >> 8) & 0xff] & 0x0000ff00) + ^ (s_td4[(t0 >> 0) & 0xff] & 0x000000ff) + ^ rdk[43]; +} + +__device__ static void AES128_encrypt (const u32 *in, u32 *out, const u32 *rek, u32 s_te0[256], u32 s_te1[256], u32 s_te2[256], u32 s_te3[256], u32 s_te4[256]) +{ + u32 s0 = in[0] ^ rek[0]; + u32 s1 = in[1] ^ rek[1]; + u32 s2 = in[2] ^ rek[2]; + u32 s3 = in[3] ^ rek[3]; + + u32 t0; + u32 t1; + u32 t2; + u32 t3; + + t0 = s_te0[s0 >> 24] ^ s_te1[(s1 >> 16) & 0xff] ^ s_te2[(s2 >> 8) & 0xff] ^ s_te3[s3 & 0xff] ^ rek[ 4]; + t1 = s_te0[s1 >> 24] ^ s_te1[(s2 >> 16) & 0xff] ^ s_te2[(s3 >> 8) & 0xff] ^ s_te3[s0 & 0xff] ^ rek[ 5]; + t2 = s_te0[s2 >> 24] ^ s_te1[(s3 >> 16) & 0xff] ^ s_te2[(s0 >> 8) & 0xff] ^ s_te3[s1 & 0xff] ^ rek[ 6]; + t3 = s_te0[s3 >> 24] ^ s_te1[(s0 >> 16) & 0xff] ^ s_te2[(s1 >> 8) & 0xff] ^ s_te3[s2 & 0xff] ^ rek[ 7]; + s0 = s_te0[t0 >> 24] ^ s_te1[(t1 >> 16) & 0xff] ^ s_te2[(t2 >> 8) & 0xff] ^ s_te3[t3 & 0xff] ^ rek[ 8]; + s1 = s_te0[t1 >> 24] ^ s_te1[(t2 >> 16) & 0xff] ^ s_te2[(t3 >> 8) & 0xff] ^ s_te3[t0 & 0xff] ^ rek[ 9]; + s2 = s_te0[t2 >> 24] ^ s_te1[(t3 >> 16) & 0xff] ^ s_te2[(t0 >> 8) & 0xff] ^ s_te3[t1 & 0xff] ^ rek[10]; + s3 = s_te0[t3 >> 24] ^ s_te1[(t0 >> 16) & 0xff] ^ s_te2[(t1 >> 8) & 0xff] ^ s_te3[t2 & 0xff] ^ rek[11]; + t0 = s_te0[s0 >> 24] ^ s_te1[(s1 >> 16) & 0xff] ^ s_te2[(s2 >> 8) & 0xff] ^ s_te3[s3 & 0xff] ^ rek[12]; + t1 = s_te0[s1 >> 24] ^ s_te1[(s2 >> 16) & 0xff] ^ s_te2[(s3 >> 8) & 0xff] ^ s_te3[s0 & 0xff] ^ rek[13]; + t2 = s_te0[s2 >> 24] ^ s_te1[(s3 >> 16) & 0xff] ^ s_te2[(s0 >> 8) & 0xff] ^ s_te3[s1 & 0xff] ^ rek[14]; + t3 = s_te0[s3 >> 24] ^ s_te1[(s0 >> 16) & 0xff] ^ s_te2[(s1 >> 8) & 0xff] ^ s_te3[s2 & 0xff] ^ rek[15]; + s0 = s_te0[t0 >> 24] ^ s_te1[(t1 >> 16) & 0xff] ^ s_te2[(t2 >> 8) & 0xff] ^ s_te3[t3 & 0xff] ^ rek[16]; + s1 = s_te0[t1 >> 24] ^ s_te1[(t2 >> 16) & 0xff] ^ s_te2[(t3 >> 8) & 0xff] ^ s_te3[t0 & 0xff] ^ rek[17]; + s2 = s_te0[t2 >> 24] ^ s_te1[(t3 >> 16) & 0xff] ^ s_te2[(t0 >> 8) & 0xff] ^ s_te3[t1 & 0xff] ^ rek[18]; + s3 = s_te0[t3 >> 24] ^ s_te1[(t0 >> 16) & 0xff] ^ s_te2[(t1 >> 8) & 0xff] ^ s_te3[t2 & 0xff] ^ rek[19]; + t0 = s_te0[s0 >> 24] ^ s_te1[(s1 >> 16) & 0xff] ^ s_te2[(s2 >> 8) & 0xff] ^ s_te3[s3 & 0xff] ^ rek[20]; + t1 = s_te0[s1 >> 24] ^ s_te1[(s2 >> 16) & 0xff] ^ s_te2[(s3 >> 8) & 0xff] ^ s_te3[s0 & 0xff] ^ rek[21]; + t2 = s_te0[s2 >> 24] ^ s_te1[(s3 >> 16) & 0xff] ^ s_te2[(s0 >> 8) & 0xff] ^ s_te3[s1 & 0xff] ^ rek[22]; + t3 = s_te0[s3 >> 24] ^ s_te1[(s0 >> 16) & 0xff] ^ s_te2[(s1 >> 8) & 0xff] ^ s_te3[s2 & 0xff] ^ rek[23]; + s0 = s_te0[t0 >> 24] ^ s_te1[(t1 >> 16) & 0xff] ^ s_te2[(t2 >> 8) & 0xff] ^ s_te3[t3 & 0xff] ^ rek[24]; + s1 = s_te0[t1 >> 24] ^ s_te1[(t2 >> 16) & 0xff] ^ s_te2[(t3 >> 8) & 0xff] ^ s_te3[t0 & 0xff] ^ rek[25]; + s2 = s_te0[t2 >> 24] ^ s_te1[(t3 >> 16) & 0xff] ^ s_te2[(t0 >> 8) & 0xff] ^ s_te3[t1 & 0xff] ^ rek[26]; + s3 = s_te0[t3 >> 24] ^ s_te1[(t0 >> 16) & 0xff] ^ s_te2[(t1 >> 8) & 0xff] ^ s_te3[t2 & 0xff] ^ rek[27]; + t0 = s_te0[s0 >> 24] ^ s_te1[(s1 >> 16) & 0xff] ^ s_te2[(s2 >> 8) & 0xff] ^ s_te3[s3 & 0xff] ^ rek[28]; + t1 = s_te0[s1 >> 24] ^ s_te1[(s2 >> 16) & 0xff] ^ s_te2[(s3 >> 8) & 0xff] ^ s_te3[s0 & 0xff] ^ rek[29]; + t2 = s_te0[s2 >> 24] ^ s_te1[(s3 >> 16) & 0xff] ^ s_te2[(s0 >> 8) & 0xff] ^ s_te3[s1 & 0xff] ^ rek[30]; + t3 = s_te0[s3 >> 24] ^ s_te1[(s0 >> 16) & 0xff] ^ s_te2[(s1 >> 8) & 0xff] ^ s_te3[s2 & 0xff] ^ rek[31]; + s0 = s_te0[t0 >> 24] ^ s_te1[(t1 >> 16) & 0xff] ^ s_te2[(t2 >> 8) & 0xff] ^ s_te3[t3 & 0xff] ^ rek[32]; + s1 = s_te0[t1 >> 24] ^ s_te1[(t2 >> 16) & 0xff] ^ s_te2[(t3 >> 8) & 0xff] ^ s_te3[t0 & 0xff] ^ rek[33]; + s2 = s_te0[t2 >> 24] ^ s_te1[(t3 >> 16) & 0xff] ^ s_te2[(t0 >> 8) & 0xff] ^ s_te3[t1 & 0xff] ^ rek[34]; + s3 = s_te0[t3 >> 24] ^ s_te1[(t0 >> 16) & 0xff] ^ s_te2[(t1 >> 8) & 0xff] ^ s_te3[t2 & 0xff] ^ rek[35]; + t0 = s_te0[s0 >> 24] ^ s_te1[(s1 >> 16) & 0xff] ^ s_te2[(s2 >> 8) & 0xff] ^ s_te3[s3 & 0xff] ^ rek[36]; + t1 = s_te0[s1 >> 24] ^ s_te1[(s2 >> 16) & 0xff] ^ s_te2[(s3 >> 8) & 0xff] ^ s_te3[s0 & 0xff] ^ rek[37]; + t2 = s_te0[s2 >> 24] ^ s_te1[(s3 >> 16) & 0xff] ^ s_te2[(s0 >> 8) & 0xff] ^ s_te3[s1 & 0xff] ^ rek[38]; + t3 = s_te0[s3 >> 24] ^ s_te1[(s0 >> 16) & 0xff] ^ s_te2[(s1 >> 8) & 0xff] ^ s_te3[s2 & 0xff] ^ rek[39]; + + out[0] = (s_te4[(t0 >> 24) & 0xff] & 0xff000000) + ^ (s_te4[(t1 >> 16) & 0xff] & 0x00ff0000) + ^ (s_te4[(t2 >> 8) & 0xff] & 0x0000ff00) + ^ (s_te4[(t3 >> 0) & 0xff] & 0x000000ff) + ^ rek[40]; + + out[1] = (s_te4[(t1 >> 24) & 0xff] & 0xff000000) + ^ (s_te4[(t2 >> 16) & 0xff] & 0x00ff0000) + ^ (s_te4[(t3 >> 8) & 0xff] & 0x0000ff00) + ^ (s_te4[(t0 >> 0) & 0xff] & 0x000000ff) + ^ rek[41]; + + out[2] = (s_te4[(t2 >> 24) & 0xff] & 0xff000000) + ^ (s_te4[(t3 >> 16) & 0xff] & 0x00ff0000) + ^ (s_te4[(t0 >> 8) & 0xff] & 0x0000ff00) + ^ (s_te4[(t1 >> 0) & 0xff] & 0x000000ff) + ^ rek[42]; + + out[3] = (s_te4[(t3 >> 24) & 0xff] & 0xff000000) + ^ (s_te4[(t0 >> 16) & 0xff] & 0x00ff0000) + ^ (s_te4[(t1 >> 8) & 0xff] & 0x0000ff00) + ^ (s_te4[(t2 >> 0) & 0xff] & 0x000000ff) + ^ rek[43]; +} + +__device__ static void sha1_transform (const u32x w0[4], const u32x w1[4], const u32x w2[4], const u32x w3[4], u32x digest[5]) +{ + u32x A = digest[0]; + u32x B = digest[1]; + u32x C = digest[2]; + u32x D = digest[3]; + u32x E = digest[4]; + + u32x w0_t = w0[0]; + u32x w1_t = w0[1]; + u32x w2_t = w0[2]; + u32x w3_t = w0[3]; + u32x w4_t = w1[0]; + u32x w5_t = w1[1]; + u32x w6_t = w1[2]; + u32x w7_t = w1[3]; + u32x w8_t = w2[0]; + u32x w9_t = w2[1]; + u32x wa_t = w2[2]; + u32x wb_t = w2[3]; + u32x wc_t = w3[0]; + u32x wd_t = w3[1]; + u32x we_t = w3[2]; + u32x wf_t = w3[3]; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, A, B, C, D, E, w0_t); + SHA1_STEP (SHA1_F0o, E, A, B, C, D, w1_t); + SHA1_STEP (SHA1_F0o, D, E, A, B, C, w2_t); + SHA1_STEP (SHA1_F0o, C, D, E, A, B, w3_t); + SHA1_STEP (SHA1_F0o, B, C, D, E, A, w4_t); + SHA1_STEP (SHA1_F0o, A, B, C, D, E, w5_t); + SHA1_STEP (SHA1_F0o, E, A, B, C, D, w6_t); + SHA1_STEP (SHA1_F0o, D, E, A, B, C, w7_t); + SHA1_STEP (SHA1_F0o, C, D, E, A, B, w8_t); + SHA1_STEP (SHA1_F0o, B, C, D, E, A, w9_t); + SHA1_STEP (SHA1_F0o, A, B, C, D, E, wa_t); + SHA1_STEP (SHA1_F0o, E, A, B, C, D, wb_t); + SHA1_STEP (SHA1_F0o, D, E, A, B, C, wc_t); + SHA1_STEP (SHA1_F0o, C, D, E, A, B, wd_t); + SHA1_STEP (SHA1_F0o, B, C, D, E, A, we_t); + SHA1_STEP (SHA1_F0o, A, B, C, D, E, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F0o, E, A, B, C, D, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F0o, D, E, A, B, C, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F0o, C, D, E, A, B, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F0o, B, C, D, E, A, w3_t); + + #undef K + #define K SHA1C01 + + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w7_t); + + #undef K + #define K SHA1C02 + + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, wb_t); + + #undef K + #define K SHA1C03 + + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, wf_t); + + digest[0] += A; + digest[1] += B; + digest[2] += C; + digest[3] += D; + digest[4] += E; +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m09500_init (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, office2010_tmp_t *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const office2010_t *office2010_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = pws[gid].i[ 8]; + w2[1] = pws[gid].i[ 9]; + w2[2] = pws[gid].i[10]; + w2[3] = pws[gid].i[11]; + + u32x w3[4]; + + w3[0] = pws[gid].i[12]; + w3[1] = pws[gid].i[13]; + w3[2] = pws[gid].i[14]; + w3[3] = pws[gid].i[15]; + + u32 pw_len = pws[gid].pw_len; + + append_0x80_4 (w0, w1, w2, w3, pw_len); + + make_unicode (w1, w2, w3); + make_unicode (w0, w0, w1); + + /** + * salt + */ + + u32 salt_len = salt_bufs[salt_pos].salt_len; + + u32 salt_buf[4]; + + salt_buf[0] = salt_bufs[salt_pos].salt_buf[0]; + salt_buf[1] = salt_bufs[salt_pos].salt_buf[1]; + salt_buf[2] = salt_bufs[salt_pos].salt_buf[2]; + salt_buf[3] = salt_bufs[salt_pos].salt_buf[3]; + + /** + * init + */ + + u32x t0[4]; + + t0[0] = salt_buf[0]; + t0[1] = salt_buf[1]; + t0[2] = salt_buf[2]; + t0[3] = salt_buf[3]; + + u32x t1[4]; + + t1[0] = swap_workaround (w0[0]); + t1[1] = swap_workaround (w0[1]); + t1[2] = swap_workaround (w0[2]); + t1[3] = swap_workaround (w0[3]); + + u32x t2[4]; + + t2[0] = swap_workaround (w1[0]); + t2[1] = swap_workaround (w1[1]); + t2[2] = swap_workaround (w1[2]); + t2[3] = swap_workaround (w1[3]); + + u32x t3[4]; + + t3[0] = swap_workaround (w2[0]); + t3[1] = swap_workaround (w2[1]); + t3[2] = 0; + t3[3] = (salt_len + (pw_len * 2)) * 8; + + u32x digest[5]; + + digest[0] = SHA1M_A; + digest[1] = SHA1M_B; + digest[2] = SHA1M_C; + digest[3] = SHA1M_D; + digest[4] = SHA1M_E; + + sha1_transform (t0, t1, t2, t3, digest); + + tmps[gid].out[0] = digest[0]; + tmps[gid].out[1] = digest[1]; + tmps[gid].out[2] = digest[2]; + tmps[gid].out[3] = digest[3]; + tmps[gid].out[4] = digest[4]; +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m09500_loop (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, office2010_tmp_t *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const office2010_t *office2010_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = 0; + w0[1] = tmps[gid].out[0]; + w0[2] = tmps[gid].out[1]; + w0[3] = tmps[gid].out[2]; + + u32x w1[4]; + + w1[0] = tmps[gid].out[3]; + w1[1] = tmps[gid].out[4]; + w1[2] = 0x80000000; + w1[3] = 0; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = (4 + 20) * 8; + + for (u32 i = 0, j = loop_pos; i < loop_cnt; i++, j++) + { + w0[0] = swap_workaround (j); + + u32x digest[5]; + + digest[0] = SHA1M_A; + digest[1] = SHA1M_B; + digest[2] = SHA1M_C; + digest[3] = SHA1M_D; + digest[4] = SHA1M_E; + + sha1_transform (w0, w1, w2, w3, digest); + + w0[1] = digest[0]; + w0[2] = digest[1]; + w0[3] = digest[2]; + w1[0] = digest[3]; + w1[1] = digest[4]; + } + + tmps[gid].out[0] = w0[1]; + tmps[gid].out[1] = w0[2]; + tmps[gid].out[2] = w0[3]; + tmps[gid].out[3] = w1[0]; + tmps[gid].out[4] = w1[1]; +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m09500_comp (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, office2010_tmp_t *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const office2010_t *office2010_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + const u32 lid = threadIdx.x; + + /** + * aes shared + */ + + __shared__ u32 s_td0[256]; + __shared__ u32 s_td1[256]; + __shared__ u32 s_td2[256]; + __shared__ u32 s_td3[256]; + __shared__ u32 s_td4[256]; + + __shared__ u32 s_te0[256]; + __shared__ u32 s_te1[256]; + __shared__ u32 s_te2[256]; + __shared__ u32 s_te3[256]; + __shared__ u32 s_te4[256]; + + s_td0[lid] = td0[lid]; + s_td1[lid] = td1[lid]; + s_td2[lid] = td2[lid]; + s_td3[lid] = td3[lid]; + s_td4[lid] = td4[lid]; + + s_te0[lid] = te0[lid]; + s_te1[lid] = te1[lid]; + s_te2[lid] = te2[lid]; + s_te3[lid] = te3[lid]; + s_te4[lid] = te4[lid]; + + __syncthreads (); + + if (gid >= gid_max) return; + + u32x encryptedVerifierHashInputBlockKey[2] = { 0xfea7d276, 0x3b4b9e79 }; + u32x encryptedVerifierHashValueBlockKey[2] = { 0xd7aa0f6d, 0x3061344e }; + + u32x w0[4]; + u32x w1[4]; + u32x w2[4]; + u32x w3[4]; + + w0[0] = tmps[gid].out[0]; + w0[1] = tmps[gid].out[1]; + w0[2] = tmps[gid].out[2]; + w0[3] = tmps[gid].out[3]; + w1[0] = tmps[gid].out[4]; + w1[1] = encryptedVerifierHashInputBlockKey[0]; + w1[2] = encryptedVerifierHashInputBlockKey[1]; + w1[3] = 0x80000000; + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = (20 + 8) * 8; + + u32 digest0[5]; + + digest0[0] = SHA1M_A; + digest0[1] = SHA1M_B; + digest0[2] = SHA1M_C; + digest0[3] = SHA1M_D; + digest0[4] = SHA1M_E; + + sha1_transform (w0, w1, w2, w3, digest0); + + w0[0] = tmps[gid].out[0]; + w0[1] = tmps[gid].out[1]; + w0[2] = tmps[gid].out[2]; + w0[3] = tmps[gid].out[3]; + w1[0] = tmps[gid].out[4]; + w1[1] = encryptedVerifierHashValueBlockKey[0]; + w1[2] = encryptedVerifierHashValueBlockKey[1]; + w1[3] = 0x80000000; + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = (20 + 8) * 8; + + u32 digest1[5]; + + digest1[0] = SHA1M_A; + digest1[1] = SHA1M_B; + digest1[2] = SHA1M_C; + digest1[3] = SHA1M_D; + digest1[4] = SHA1M_E; + + sha1_transform (w0, w1, w2, w3, digest1); + + // now we got the AES key, decrypt the verifier + + u32x rek[60]; + u32x rdk[60]; + + u32 data[4]; + + data[0] = office2010_bufs[salt_pos].encryptedVerifier[0]; + data[1] = office2010_bufs[salt_pos].encryptedVerifier[1]; + data[2] = office2010_bufs[salt_pos].encryptedVerifier[2]; + data[3] = office2010_bufs[salt_pos].encryptedVerifier[3]; + + u32x ukeyx[4]; + + ukeyx[0] = digest0[0]; + ukeyx[1] = digest0[1]; + ukeyx[2] = digest0[2]; + ukeyx[3] = digest0[3]; + + AES128_ExpandKey (ukeyx, rek, s_te0, s_te1, s_te2, s_te3, s_te4); + + for (u32 i = 0; i < 44; i++) rdk[i] = rek[i]; + + AES128_InvertKey (rdk, s_td0, s_td1, s_td2, s_td3, s_td4, s_te0, s_te1, s_te2, s_te3, s_te4); + + u32 out[4]; + + AES128_decrypt (data, out, rdk, s_td0, s_td1, s_td2, s_td3, s_td4); + + out[0] ^= salt_bufs[salt_pos].salt_buf[0]; + out[1] ^= salt_bufs[salt_pos].salt_buf[1]; + out[2] ^= salt_bufs[salt_pos].salt_buf[2]; + out[3] ^= salt_bufs[salt_pos].salt_buf[3]; + + // do a sha1 of the result + + w0[0] = out[0]; + w0[1] = out[1]; + w0[2] = out[2]; + w0[3] = out[3]; + w1[0] = 0x80000000; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 16 * 8; + + u32x digest[5]; + + digest[0] = SHA1M_A; + digest[1] = SHA1M_B; + digest[2] = SHA1M_C; + digest[3] = SHA1M_D; + digest[4] = SHA1M_E; + + sha1_transform (w0, w1, w2, w3, digest); + + // encrypt it again for verify + + ukeyx[0] = digest1[0]; + ukeyx[1] = digest1[1]; + ukeyx[2] = digest1[2]; + ukeyx[3] = digest1[3]; + + AES128_ExpandKey (ukeyx, rek, s_te0, s_te1, s_te2, s_te3, s_te4); + + data[0] = digest[0] ^ salt_bufs[salt_pos].salt_buf[0]; + data[1] = digest[1] ^ salt_bufs[salt_pos].salt_buf[1]; + data[2] = digest[2] ^ salt_bufs[salt_pos].salt_buf[2]; + data[3] = digest[3] ^ salt_bufs[salt_pos].salt_buf[3]; + + AES128_encrypt (data, out, rek, s_te0, s_te1, s_te2, s_te3, s_te4); + + const u32x r0 = out[0]; + const u32x r1 = out[1]; + const u32x r2 = out[2]; + const u32x r3 = out[3]; + + #define il_pos 0 + + #include VECT_COMPARE_M +} diff --git a/nv/m09600.cu b/nv/m09600.cu new file mode 100644 index 0000000000..648062ccf9 --- /dev/null +++ b/nv/m09600.cu @@ -0,0 +1,1490 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _OFFICE2013_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW2 +#define VECT_SIZE1 +#endif + +#define DGST_R0 0 +#define DGST_R1 1 +#define DGST_R2 2 +#define DGST_R3 3 + +#include "include/kernel_functions.c" +#include "types_nv.c" +#include "common_nv.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +__device__ __constant__ u32 te0[256] = +{ + 0xc66363a5, 0xf87c7c84, 0xee777799, 0xf67b7b8d, + 0xfff2f20d, 0xd66b6bbd, 0xde6f6fb1, 0x91c5c554, + 0x60303050, 0x02010103, 0xce6767a9, 0x562b2b7d, + 0xe7fefe19, 0xb5d7d762, 0x4dababe6, 0xec76769a, + 0x8fcaca45, 0x1f82829d, 0x89c9c940, 0xfa7d7d87, + 0xeffafa15, 0xb25959eb, 0x8e4747c9, 0xfbf0f00b, + 0x41adadec, 0xb3d4d467, 0x5fa2a2fd, 0x45afafea, + 0x239c9cbf, 0x53a4a4f7, 0xe4727296, 0x9bc0c05b, + 0x75b7b7c2, 0xe1fdfd1c, 0x3d9393ae, 0x4c26266a, + 0x6c36365a, 0x7e3f3f41, 0xf5f7f702, 0x83cccc4f, + 0x6834345c, 0x51a5a5f4, 0xd1e5e534, 0xf9f1f108, + 0xe2717193, 0xabd8d873, 0x62313153, 0x2a15153f, + 0x0804040c, 0x95c7c752, 0x46232365, 0x9dc3c35e, + 0x30181828, 0x379696a1, 0x0a05050f, 0x2f9a9ab5, + 0x0e070709, 0x24121236, 0x1b80809b, 0xdfe2e23d, + 0xcdebeb26, 0x4e272769, 0x7fb2b2cd, 0xea75759f, + 0x1209091b, 0x1d83839e, 0x582c2c74, 0x341a1a2e, + 0x361b1b2d, 0xdc6e6eb2, 0xb45a5aee, 0x5ba0a0fb, + 0xa45252f6, 0x763b3b4d, 0xb7d6d661, 0x7db3b3ce, + 0x5229297b, 0xdde3e33e, 0x5e2f2f71, 0x13848497, + 0xa65353f5, 0xb9d1d168, 0x00000000, 0xc1eded2c, + 0x40202060, 0xe3fcfc1f, 0x79b1b1c8, 0xb65b5bed, + 0xd46a6abe, 0x8dcbcb46, 0x67bebed9, 0x7239394b, + 0x944a4ade, 0x984c4cd4, 0xb05858e8, 0x85cfcf4a, + 0xbbd0d06b, 0xc5efef2a, 0x4faaaae5, 0xedfbfb16, + 0x864343c5, 0x9a4d4dd7, 0x66333355, 0x11858594, + 0x8a4545cf, 0xe9f9f910, 0x04020206, 0xfe7f7f81, + 0xa05050f0, 0x783c3c44, 0x259f9fba, 0x4ba8a8e3, + 0xa25151f3, 0x5da3a3fe, 0x804040c0, 0x058f8f8a, + 0x3f9292ad, 0x219d9dbc, 0x70383848, 0xf1f5f504, + 0x63bcbcdf, 0x77b6b6c1, 0xafdada75, 0x42212163, + 0x20101030, 0xe5ffff1a, 0xfdf3f30e, 0xbfd2d26d, + 0x81cdcd4c, 0x180c0c14, 0x26131335, 0xc3ecec2f, + 0xbe5f5fe1, 0x359797a2, 0x884444cc, 0x2e171739, + 0x93c4c457, 0x55a7a7f2, 0xfc7e7e82, 0x7a3d3d47, + 0xc86464ac, 0xba5d5de7, 0x3219192b, 0xe6737395, + 0xc06060a0, 0x19818198, 0x9e4f4fd1, 0xa3dcdc7f, + 0x44222266, 0x542a2a7e, 0x3b9090ab, 0x0b888883, + 0x8c4646ca, 0xc7eeee29, 0x6bb8b8d3, 0x2814143c, + 0xa7dede79, 0xbc5e5ee2, 0x160b0b1d, 0xaddbdb76, + 0xdbe0e03b, 0x64323256, 0x743a3a4e, 0x140a0a1e, + 0x924949db, 0x0c06060a, 0x4824246c, 0xb85c5ce4, + 0x9fc2c25d, 0xbdd3d36e, 0x43acacef, 0xc46262a6, + 0x399191a8, 0x319595a4, 0xd3e4e437, 0xf279798b, + 0xd5e7e732, 0x8bc8c843, 0x6e373759, 0xda6d6db7, + 0x018d8d8c, 0xb1d5d564, 0x9c4e4ed2, 0x49a9a9e0, + 0xd86c6cb4, 0xac5656fa, 0xf3f4f407, 0xcfeaea25, + 0xca6565af, 0xf47a7a8e, 0x47aeaee9, 0x10080818, + 0x6fbabad5, 0xf0787888, 0x4a25256f, 0x5c2e2e72, + 0x381c1c24, 0x57a6a6f1, 0x73b4b4c7, 0x97c6c651, + 0xcbe8e823, 0xa1dddd7c, 0xe874749c, 0x3e1f1f21, + 0x964b4bdd, 0x61bdbddc, 0x0d8b8b86, 0x0f8a8a85, + 0xe0707090, 0x7c3e3e42, 0x71b5b5c4, 0xcc6666aa, + 0x904848d8, 0x06030305, 0xf7f6f601, 0x1c0e0e12, + 0xc26161a3, 0x6a35355f, 0xae5757f9, 0x69b9b9d0, + 0x17868691, 0x99c1c158, 0x3a1d1d27, 0x279e9eb9, + 0xd9e1e138, 0xebf8f813, 0x2b9898b3, 0x22111133, + 0xd26969bb, 0xa9d9d970, 0x078e8e89, 0x339494a7, + 0x2d9b9bb6, 0x3c1e1e22, 0x15878792, 0xc9e9e920, + 0x87cece49, 0xaa5555ff, 0x50282878, 0xa5dfdf7a, + 0x038c8c8f, 0x59a1a1f8, 0x09898980, 0x1a0d0d17, + 0x65bfbfda, 0xd7e6e631, 0x844242c6, 0xd06868b8, + 0x824141c3, 0x299999b0, 0x5a2d2d77, 0x1e0f0f11, + 0x7bb0b0cb, 0xa85454fc, 0x6dbbbbd6, 0x2c16163a, +}; + +__device__ __constant__ u32 te1[256] = +{ + 0xa5c66363, 0x84f87c7c, 0x99ee7777, 0x8df67b7b, + 0x0dfff2f2, 0xbdd66b6b, 0xb1de6f6f, 0x5491c5c5, + 0x50603030, 0x03020101, 0xa9ce6767, 0x7d562b2b, + 0x19e7fefe, 0x62b5d7d7, 0xe64dabab, 0x9aec7676, + 0x458fcaca, 0x9d1f8282, 0x4089c9c9, 0x87fa7d7d, + 0x15effafa, 0xebb25959, 0xc98e4747, 0x0bfbf0f0, + 0xec41adad, 0x67b3d4d4, 0xfd5fa2a2, 0xea45afaf, + 0xbf239c9c, 0xf753a4a4, 0x96e47272, 0x5b9bc0c0, + 0xc275b7b7, 0x1ce1fdfd, 0xae3d9393, 0x6a4c2626, + 0x5a6c3636, 0x417e3f3f, 0x02f5f7f7, 0x4f83cccc, + 0x5c683434, 0xf451a5a5, 0x34d1e5e5, 0x08f9f1f1, + 0x93e27171, 0x73abd8d8, 0x53623131, 0x3f2a1515, + 0x0c080404, 0x5295c7c7, 0x65462323, 0x5e9dc3c3, + 0x28301818, 0xa1379696, 0x0f0a0505, 0xb52f9a9a, + 0x090e0707, 0x36241212, 0x9b1b8080, 0x3ddfe2e2, + 0x26cdebeb, 0x694e2727, 0xcd7fb2b2, 0x9fea7575, + 0x1b120909, 0x9e1d8383, 0x74582c2c, 0x2e341a1a, + 0x2d361b1b, 0xb2dc6e6e, 0xeeb45a5a, 0xfb5ba0a0, + 0xf6a45252, 0x4d763b3b, 0x61b7d6d6, 0xce7db3b3, + 0x7b522929, 0x3edde3e3, 0x715e2f2f, 0x97138484, + 0xf5a65353, 0x68b9d1d1, 0x00000000, 0x2cc1eded, + 0x60402020, 0x1fe3fcfc, 0xc879b1b1, 0xedb65b5b, + 0xbed46a6a, 0x468dcbcb, 0xd967bebe, 0x4b723939, + 0xde944a4a, 0xd4984c4c, 0xe8b05858, 0x4a85cfcf, + 0x6bbbd0d0, 0x2ac5efef, 0xe54faaaa, 0x16edfbfb, + 0xc5864343, 0xd79a4d4d, 0x55663333, 0x94118585, + 0xcf8a4545, 0x10e9f9f9, 0x06040202, 0x81fe7f7f, + 0xf0a05050, 0x44783c3c, 0xba259f9f, 0xe34ba8a8, + 0xf3a25151, 0xfe5da3a3, 0xc0804040, 0x8a058f8f, + 0xad3f9292, 0xbc219d9d, 0x48703838, 0x04f1f5f5, + 0xdf63bcbc, 0xc177b6b6, 0x75afdada, 0x63422121, + 0x30201010, 0x1ae5ffff, 0x0efdf3f3, 0x6dbfd2d2, + 0x4c81cdcd, 0x14180c0c, 0x35261313, 0x2fc3ecec, + 0xe1be5f5f, 0xa2359797, 0xcc884444, 0x392e1717, + 0x5793c4c4, 0xf255a7a7, 0x82fc7e7e, 0x477a3d3d, + 0xacc86464, 0xe7ba5d5d, 0x2b321919, 0x95e67373, + 0xa0c06060, 0x98198181, 0xd19e4f4f, 0x7fa3dcdc, + 0x66442222, 0x7e542a2a, 0xab3b9090, 0x830b8888, + 0xca8c4646, 0x29c7eeee, 0xd36bb8b8, 0x3c281414, + 0x79a7dede, 0xe2bc5e5e, 0x1d160b0b, 0x76addbdb, + 0x3bdbe0e0, 0x56643232, 0x4e743a3a, 0x1e140a0a, + 0xdb924949, 0x0a0c0606, 0x6c482424, 0xe4b85c5c, + 0x5d9fc2c2, 0x6ebdd3d3, 0xef43acac, 0xa6c46262, + 0xa8399191, 0xa4319595, 0x37d3e4e4, 0x8bf27979, + 0x32d5e7e7, 0x438bc8c8, 0x596e3737, 0xb7da6d6d, + 0x8c018d8d, 0x64b1d5d5, 0xd29c4e4e, 0xe049a9a9, + 0xb4d86c6c, 0xfaac5656, 0x07f3f4f4, 0x25cfeaea, + 0xafca6565, 0x8ef47a7a, 0xe947aeae, 0x18100808, + 0xd56fbaba, 0x88f07878, 0x6f4a2525, 0x725c2e2e, + 0x24381c1c, 0xf157a6a6, 0xc773b4b4, 0x5197c6c6, + 0x23cbe8e8, 0x7ca1dddd, 0x9ce87474, 0x213e1f1f, + 0xdd964b4b, 0xdc61bdbd, 0x860d8b8b, 0x850f8a8a, + 0x90e07070, 0x427c3e3e, 0xc471b5b5, 0xaacc6666, + 0xd8904848, 0x05060303, 0x01f7f6f6, 0x121c0e0e, + 0xa3c26161, 0x5f6a3535, 0xf9ae5757, 0xd069b9b9, + 0x91178686, 0x5899c1c1, 0x273a1d1d, 0xb9279e9e, + 0x38d9e1e1, 0x13ebf8f8, 0xb32b9898, 0x33221111, + 0xbbd26969, 0x70a9d9d9, 0x89078e8e, 0xa7339494, + 0xb62d9b9b, 0x223c1e1e, 0x92158787, 0x20c9e9e9, + 0x4987cece, 0xffaa5555, 0x78502828, 0x7aa5dfdf, + 0x8f038c8c, 0xf859a1a1, 0x80098989, 0x171a0d0d, + 0xda65bfbf, 0x31d7e6e6, 0xc6844242, 0xb8d06868, + 0xc3824141, 0xb0299999, 0x775a2d2d, 0x111e0f0f, + 0xcb7bb0b0, 0xfca85454, 0xd66dbbbb, 0x3a2c1616, +}; + +__device__ __constant__ u32 te2[256] = +{ + 0x63a5c663, 0x7c84f87c, 0x7799ee77, 0x7b8df67b, + 0xf20dfff2, 0x6bbdd66b, 0x6fb1de6f, 0xc55491c5, + 0x30506030, 0x01030201, 0x67a9ce67, 0x2b7d562b, + 0xfe19e7fe, 0xd762b5d7, 0xabe64dab, 0x769aec76, + 0xca458fca, 0x829d1f82, 0xc94089c9, 0x7d87fa7d, + 0xfa15effa, 0x59ebb259, 0x47c98e47, 0xf00bfbf0, + 0xadec41ad, 0xd467b3d4, 0xa2fd5fa2, 0xafea45af, + 0x9cbf239c, 0xa4f753a4, 0x7296e472, 0xc05b9bc0, + 0xb7c275b7, 0xfd1ce1fd, 0x93ae3d93, 0x266a4c26, + 0x365a6c36, 0x3f417e3f, 0xf702f5f7, 0xcc4f83cc, + 0x345c6834, 0xa5f451a5, 0xe534d1e5, 0xf108f9f1, + 0x7193e271, 0xd873abd8, 0x31536231, 0x153f2a15, + 0x040c0804, 0xc75295c7, 0x23654623, 0xc35e9dc3, + 0x18283018, 0x96a13796, 0x050f0a05, 0x9ab52f9a, + 0x07090e07, 0x12362412, 0x809b1b80, 0xe23ddfe2, + 0xeb26cdeb, 0x27694e27, 0xb2cd7fb2, 0x759fea75, + 0x091b1209, 0x839e1d83, 0x2c74582c, 0x1a2e341a, + 0x1b2d361b, 0x6eb2dc6e, 0x5aeeb45a, 0xa0fb5ba0, + 0x52f6a452, 0x3b4d763b, 0xd661b7d6, 0xb3ce7db3, + 0x297b5229, 0xe33edde3, 0x2f715e2f, 0x84971384, + 0x53f5a653, 0xd168b9d1, 0x00000000, 0xed2cc1ed, + 0x20604020, 0xfc1fe3fc, 0xb1c879b1, 0x5bedb65b, + 0x6abed46a, 0xcb468dcb, 0xbed967be, 0x394b7239, + 0x4ade944a, 0x4cd4984c, 0x58e8b058, 0xcf4a85cf, + 0xd06bbbd0, 0xef2ac5ef, 0xaae54faa, 0xfb16edfb, + 0x43c58643, 0x4dd79a4d, 0x33556633, 0x85941185, + 0x45cf8a45, 0xf910e9f9, 0x02060402, 0x7f81fe7f, + 0x50f0a050, 0x3c44783c, 0x9fba259f, 0xa8e34ba8, + 0x51f3a251, 0xa3fe5da3, 0x40c08040, 0x8f8a058f, + 0x92ad3f92, 0x9dbc219d, 0x38487038, 0xf504f1f5, + 0xbcdf63bc, 0xb6c177b6, 0xda75afda, 0x21634221, + 0x10302010, 0xff1ae5ff, 0xf30efdf3, 0xd26dbfd2, + 0xcd4c81cd, 0x0c14180c, 0x13352613, 0xec2fc3ec, + 0x5fe1be5f, 0x97a23597, 0x44cc8844, 0x17392e17, + 0xc45793c4, 0xa7f255a7, 0x7e82fc7e, 0x3d477a3d, + 0x64acc864, 0x5de7ba5d, 0x192b3219, 0x7395e673, + 0x60a0c060, 0x81981981, 0x4fd19e4f, 0xdc7fa3dc, + 0x22664422, 0x2a7e542a, 0x90ab3b90, 0x88830b88, + 0x46ca8c46, 0xee29c7ee, 0xb8d36bb8, 0x143c2814, + 0xde79a7de, 0x5ee2bc5e, 0x0b1d160b, 0xdb76addb, + 0xe03bdbe0, 0x32566432, 0x3a4e743a, 0x0a1e140a, + 0x49db9249, 0x060a0c06, 0x246c4824, 0x5ce4b85c, + 0xc25d9fc2, 0xd36ebdd3, 0xacef43ac, 0x62a6c462, + 0x91a83991, 0x95a43195, 0xe437d3e4, 0x798bf279, + 0xe732d5e7, 0xc8438bc8, 0x37596e37, 0x6db7da6d, + 0x8d8c018d, 0xd564b1d5, 0x4ed29c4e, 0xa9e049a9, + 0x6cb4d86c, 0x56faac56, 0xf407f3f4, 0xea25cfea, + 0x65afca65, 0x7a8ef47a, 0xaee947ae, 0x08181008, + 0xbad56fba, 0x7888f078, 0x256f4a25, 0x2e725c2e, + 0x1c24381c, 0xa6f157a6, 0xb4c773b4, 0xc65197c6, + 0xe823cbe8, 0xdd7ca1dd, 0x749ce874, 0x1f213e1f, + 0x4bdd964b, 0xbddc61bd, 0x8b860d8b, 0x8a850f8a, + 0x7090e070, 0x3e427c3e, 0xb5c471b5, 0x66aacc66, + 0x48d89048, 0x03050603, 0xf601f7f6, 0x0e121c0e, + 0x61a3c261, 0x355f6a35, 0x57f9ae57, 0xb9d069b9, + 0x86911786, 0xc15899c1, 0x1d273a1d, 0x9eb9279e, + 0xe138d9e1, 0xf813ebf8, 0x98b32b98, 0x11332211, + 0x69bbd269, 0xd970a9d9, 0x8e89078e, 0x94a73394, + 0x9bb62d9b, 0x1e223c1e, 0x87921587, 0xe920c9e9, + 0xce4987ce, 0x55ffaa55, 0x28785028, 0xdf7aa5df, + 0x8c8f038c, 0xa1f859a1, 0x89800989, 0x0d171a0d, + 0xbfda65bf, 0xe631d7e6, 0x42c68442, 0x68b8d068, + 0x41c38241, 0x99b02999, 0x2d775a2d, 0x0f111e0f, + 0xb0cb7bb0, 0x54fca854, 0xbbd66dbb, 0x163a2c16, +}; + +__device__ __constant__ u32 te3[256] = +{ + 0x6363a5c6, 0x7c7c84f8, 0x777799ee, 0x7b7b8df6, + 0xf2f20dff, 0x6b6bbdd6, 0x6f6fb1de, 0xc5c55491, + 0x30305060, 0x01010302, 0x6767a9ce, 0x2b2b7d56, + 0xfefe19e7, 0xd7d762b5, 0xababe64d, 0x76769aec, + 0xcaca458f, 0x82829d1f, 0xc9c94089, 0x7d7d87fa, + 0xfafa15ef, 0x5959ebb2, 0x4747c98e, 0xf0f00bfb, + 0xadadec41, 0xd4d467b3, 0xa2a2fd5f, 0xafafea45, + 0x9c9cbf23, 0xa4a4f753, 0x727296e4, 0xc0c05b9b, + 0xb7b7c275, 0xfdfd1ce1, 0x9393ae3d, 0x26266a4c, + 0x36365a6c, 0x3f3f417e, 0xf7f702f5, 0xcccc4f83, + 0x34345c68, 0xa5a5f451, 0xe5e534d1, 0xf1f108f9, + 0x717193e2, 0xd8d873ab, 0x31315362, 0x15153f2a, + 0x04040c08, 0xc7c75295, 0x23236546, 0xc3c35e9d, + 0x18182830, 0x9696a137, 0x05050f0a, 0x9a9ab52f, + 0x0707090e, 0x12123624, 0x80809b1b, 0xe2e23ddf, + 0xebeb26cd, 0x2727694e, 0xb2b2cd7f, 0x75759fea, + 0x09091b12, 0x83839e1d, 0x2c2c7458, 0x1a1a2e34, + 0x1b1b2d36, 0x6e6eb2dc, 0x5a5aeeb4, 0xa0a0fb5b, + 0x5252f6a4, 0x3b3b4d76, 0xd6d661b7, 0xb3b3ce7d, + 0x29297b52, 0xe3e33edd, 0x2f2f715e, 0x84849713, + 0x5353f5a6, 0xd1d168b9, 0x00000000, 0xeded2cc1, + 0x20206040, 0xfcfc1fe3, 0xb1b1c879, 0x5b5bedb6, + 0x6a6abed4, 0xcbcb468d, 0xbebed967, 0x39394b72, + 0x4a4ade94, 0x4c4cd498, 0x5858e8b0, 0xcfcf4a85, + 0xd0d06bbb, 0xefef2ac5, 0xaaaae54f, 0xfbfb16ed, + 0x4343c586, 0x4d4dd79a, 0x33335566, 0x85859411, + 0x4545cf8a, 0xf9f910e9, 0x02020604, 0x7f7f81fe, + 0x5050f0a0, 0x3c3c4478, 0x9f9fba25, 0xa8a8e34b, + 0x5151f3a2, 0xa3a3fe5d, 0x4040c080, 0x8f8f8a05, + 0x9292ad3f, 0x9d9dbc21, 0x38384870, 0xf5f504f1, + 0xbcbcdf63, 0xb6b6c177, 0xdada75af, 0x21216342, + 0x10103020, 0xffff1ae5, 0xf3f30efd, 0xd2d26dbf, + 0xcdcd4c81, 0x0c0c1418, 0x13133526, 0xecec2fc3, + 0x5f5fe1be, 0x9797a235, 0x4444cc88, 0x1717392e, + 0xc4c45793, 0xa7a7f255, 0x7e7e82fc, 0x3d3d477a, + 0x6464acc8, 0x5d5de7ba, 0x19192b32, 0x737395e6, + 0x6060a0c0, 0x81819819, 0x4f4fd19e, 0xdcdc7fa3, + 0x22226644, 0x2a2a7e54, 0x9090ab3b, 0x8888830b, + 0x4646ca8c, 0xeeee29c7, 0xb8b8d36b, 0x14143c28, + 0xdede79a7, 0x5e5ee2bc, 0x0b0b1d16, 0xdbdb76ad, + 0xe0e03bdb, 0x32325664, 0x3a3a4e74, 0x0a0a1e14, + 0x4949db92, 0x06060a0c, 0x24246c48, 0x5c5ce4b8, + 0xc2c25d9f, 0xd3d36ebd, 0xacacef43, 0x6262a6c4, + 0x9191a839, 0x9595a431, 0xe4e437d3, 0x79798bf2, + 0xe7e732d5, 0xc8c8438b, 0x3737596e, 0x6d6db7da, + 0x8d8d8c01, 0xd5d564b1, 0x4e4ed29c, 0xa9a9e049, + 0x6c6cb4d8, 0x5656faac, 0xf4f407f3, 0xeaea25cf, + 0x6565afca, 0x7a7a8ef4, 0xaeaee947, 0x08081810, + 0xbabad56f, 0x787888f0, 0x25256f4a, 0x2e2e725c, + 0x1c1c2438, 0xa6a6f157, 0xb4b4c773, 0xc6c65197, + 0xe8e823cb, 0xdddd7ca1, 0x74749ce8, 0x1f1f213e, + 0x4b4bdd96, 0xbdbddc61, 0x8b8b860d, 0x8a8a850f, + 0x707090e0, 0x3e3e427c, 0xb5b5c471, 0x6666aacc, + 0x4848d890, 0x03030506, 0xf6f601f7, 0x0e0e121c, + 0x6161a3c2, 0x35355f6a, 0x5757f9ae, 0xb9b9d069, + 0x86869117, 0xc1c15899, 0x1d1d273a, 0x9e9eb927, + 0xe1e138d9, 0xf8f813eb, 0x9898b32b, 0x11113322, + 0x6969bbd2, 0xd9d970a9, 0x8e8e8907, 0x9494a733, + 0x9b9bb62d, 0x1e1e223c, 0x87879215, 0xe9e920c9, + 0xcece4987, 0x5555ffaa, 0x28287850, 0xdfdf7aa5, + 0x8c8c8f03, 0xa1a1f859, 0x89898009, 0x0d0d171a, + 0xbfbfda65, 0xe6e631d7, 0x4242c684, 0x6868b8d0, + 0x4141c382, 0x9999b029, 0x2d2d775a, 0x0f0f111e, + 0xb0b0cb7b, 0x5454fca8, 0xbbbbd66d, 0x16163a2c, +}; + +__device__ __constant__ u32 te4[256] = +{ + 0x63636363, 0x7c7c7c7c, 0x77777777, 0x7b7b7b7b, + 0xf2f2f2f2, 0x6b6b6b6b, 0x6f6f6f6f, 0xc5c5c5c5, + 0x30303030, 0x01010101, 0x67676767, 0x2b2b2b2b, + 0xfefefefe, 0xd7d7d7d7, 0xabababab, 0x76767676, + 0xcacacaca, 0x82828282, 0xc9c9c9c9, 0x7d7d7d7d, + 0xfafafafa, 0x59595959, 0x47474747, 0xf0f0f0f0, + 0xadadadad, 0xd4d4d4d4, 0xa2a2a2a2, 0xafafafaf, + 0x9c9c9c9c, 0xa4a4a4a4, 0x72727272, 0xc0c0c0c0, + 0xb7b7b7b7, 0xfdfdfdfd, 0x93939393, 0x26262626, + 0x36363636, 0x3f3f3f3f, 0xf7f7f7f7, 0xcccccccc, + 0x34343434, 0xa5a5a5a5, 0xe5e5e5e5, 0xf1f1f1f1, + 0x71717171, 0xd8d8d8d8, 0x31313131, 0x15151515, + 0x04040404, 0xc7c7c7c7, 0x23232323, 0xc3c3c3c3, + 0x18181818, 0x96969696, 0x05050505, 0x9a9a9a9a, + 0x07070707, 0x12121212, 0x80808080, 0xe2e2e2e2, + 0xebebebeb, 0x27272727, 0xb2b2b2b2, 0x75757575, + 0x09090909, 0x83838383, 0x2c2c2c2c, 0x1a1a1a1a, + 0x1b1b1b1b, 0x6e6e6e6e, 0x5a5a5a5a, 0xa0a0a0a0, + 0x52525252, 0x3b3b3b3b, 0xd6d6d6d6, 0xb3b3b3b3, + 0x29292929, 0xe3e3e3e3, 0x2f2f2f2f, 0x84848484, + 0x53535353, 0xd1d1d1d1, 0x00000000, 0xedededed, + 0x20202020, 0xfcfcfcfc, 0xb1b1b1b1, 0x5b5b5b5b, + 0x6a6a6a6a, 0xcbcbcbcb, 0xbebebebe, 0x39393939, + 0x4a4a4a4a, 0x4c4c4c4c, 0x58585858, 0xcfcfcfcf, + 0xd0d0d0d0, 0xefefefef, 0xaaaaaaaa, 0xfbfbfbfb, + 0x43434343, 0x4d4d4d4d, 0x33333333, 0x85858585, + 0x45454545, 0xf9f9f9f9, 0x02020202, 0x7f7f7f7f, + 0x50505050, 0x3c3c3c3c, 0x9f9f9f9f, 0xa8a8a8a8, + 0x51515151, 0xa3a3a3a3, 0x40404040, 0x8f8f8f8f, + 0x92929292, 0x9d9d9d9d, 0x38383838, 0xf5f5f5f5, + 0xbcbcbcbc, 0xb6b6b6b6, 0xdadadada, 0x21212121, + 0x10101010, 0xffffffff, 0xf3f3f3f3, 0xd2d2d2d2, + 0xcdcdcdcd, 0x0c0c0c0c, 0x13131313, 0xecececec, + 0x5f5f5f5f, 0x97979797, 0x44444444, 0x17171717, + 0xc4c4c4c4, 0xa7a7a7a7, 0x7e7e7e7e, 0x3d3d3d3d, + 0x64646464, 0x5d5d5d5d, 0x19191919, 0x73737373, + 0x60606060, 0x81818181, 0x4f4f4f4f, 0xdcdcdcdc, + 0x22222222, 0x2a2a2a2a, 0x90909090, 0x88888888, + 0x46464646, 0xeeeeeeee, 0xb8b8b8b8, 0x14141414, + 0xdededede, 0x5e5e5e5e, 0x0b0b0b0b, 0xdbdbdbdb, + 0xe0e0e0e0, 0x32323232, 0x3a3a3a3a, 0x0a0a0a0a, + 0x49494949, 0x06060606, 0x24242424, 0x5c5c5c5c, + 0xc2c2c2c2, 0xd3d3d3d3, 0xacacacac, 0x62626262, + 0x91919191, 0x95959595, 0xe4e4e4e4, 0x79797979, + 0xe7e7e7e7, 0xc8c8c8c8, 0x37373737, 0x6d6d6d6d, + 0x8d8d8d8d, 0xd5d5d5d5, 0x4e4e4e4e, 0xa9a9a9a9, + 0x6c6c6c6c, 0x56565656, 0xf4f4f4f4, 0xeaeaeaea, + 0x65656565, 0x7a7a7a7a, 0xaeaeaeae, 0x08080808, + 0xbabababa, 0x78787878, 0x25252525, 0x2e2e2e2e, + 0x1c1c1c1c, 0xa6a6a6a6, 0xb4b4b4b4, 0xc6c6c6c6, + 0xe8e8e8e8, 0xdddddddd, 0x74747474, 0x1f1f1f1f, + 0x4b4b4b4b, 0xbdbdbdbd, 0x8b8b8b8b, 0x8a8a8a8a, + 0x70707070, 0x3e3e3e3e, 0xb5b5b5b5, 0x66666666, + 0x48484848, 0x03030303, 0xf6f6f6f6, 0x0e0e0e0e, + 0x61616161, 0x35353535, 0x57575757, 0xb9b9b9b9, + 0x86868686, 0xc1c1c1c1, 0x1d1d1d1d, 0x9e9e9e9e, + 0xe1e1e1e1, 0xf8f8f8f8, 0x98989898, 0x11111111, + 0x69696969, 0xd9d9d9d9, 0x8e8e8e8e, 0x94949494, + 0x9b9b9b9b, 0x1e1e1e1e, 0x87878787, 0xe9e9e9e9, + 0xcececece, 0x55555555, 0x28282828, 0xdfdfdfdf, + 0x8c8c8c8c, 0xa1a1a1a1, 0x89898989, 0x0d0d0d0d, + 0xbfbfbfbf, 0xe6e6e6e6, 0x42424242, 0x68686868, + 0x41414141, 0x99999999, 0x2d2d2d2d, 0x0f0f0f0f, + 0xb0b0b0b0, 0x54545454, 0xbbbbbbbb, 0x16161616, +}; + +__device__ __constant__ u32 td0[256] = +{ + 0x51f4a750, 0x7e416553, 0x1a17a4c3, 0x3a275e96, + 0x3bab6bcb, 0x1f9d45f1, 0xacfa58ab, 0x4be30393, + 0x2030fa55, 0xad766df6, 0x88cc7691, 0xf5024c25, + 0x4fe5d7fc, 0xc52acbd7, 0x26354480, 0xb562a38f, + 0xdeb15a49, 0x25ba1b67, 0x45ea0e98, 0x5dfec0e1, + 0xc32f7502, 0x814cf012, 0x8d4697a3, 0x6bd3f9c6, + 0x038f5fe7, 0x15929c95, 0xbf6d7aeb, 0x955259da, + 0xd4be832d, 0x587421d3, 0x49e06929, 0x8ec9c844, + 0x75c2896a, 0xf48e7978, 0x99583e6b, 0x27b971dd, + 0xbee14fb6, 0xf088ad17, 0xc920ac66, 0x7dce3ab4, + 0x63df4a18, 0xe51a3182, 0x97513360, 0x62537f45, + 0xb16477e0, 0xbb6bae84, 0xfe81a01c, 0xf9082b94, + 0x70486858, 0x8f45fd19, 0x94de6c87, 0x527bf8b7, + 0xab73d323, 0x724b02e2, 0xe31f8f57, 0x6655ab2a, + 0xb2eb2807, 0x2fb5c203, 0x86c57b9a, 0xd33708a5, + 0x302887f2, 0x23bfa5b2, 0x02036aba, 0xed16825c, + 0x8acf1c2b, 0xa779b492, 0xf307f2f0, 0x4e69e2a1, + 0x65daf4cd, 0x0605bed5, 0xd134621f, 0xc4a6fe8a, + 0x342e539d, 0xa2f355a0, 0x058ae132, 0xa4f6eb75, + 0x0b83ec39, 0x4060efaa, 0x5e719f06, 0xbd6e1051, + 0x3e218af9, 0x96dd063d, 0xdd3e05ae, 0x4de6bd46, + 0x91548db5, 0x71c45d05, 0x0406d46f, 0x605015ff, + 0x1998fb24, 0xd6bde997, 0x894043cc, 0x67d99e77, + 0xb0e842bd, 0x07898b88, 0xe7195b38, 0x79c8eedb, + 0xa17c0a47, 0x7c420fe9, 0xf8841ec9, 0x00000000, + 0x09808683, 0x322bed48, 0x1e1170ac, 0x6c5a724e, + 0xfd0efffb, 0x0f853856, 0x3daed51e, 0x362d3927, + 0x0a0fd964, 0x685ca621, 0x9b5b54d1, 0x24362e3a, + 0x0c0a67b1, 0x9357e70f, 0xb4ee96d2, 0x1b9b919e, + 0x80c0c54f, 0x61dc20a2, 0x5a774b69, 0x1c121a16, + 0xe293ba0a, 0xc0a02ae5, 0x3c22e043, 0x121b171d, + 0x0e090d0b, 0xf28bc7ad, 0x2db6a8b9, 0x141ea9c8, + 0x57f11985, 0xaf75074c, 0xee99ddbb, 0xa37f60fd, + 0xf701269f, 0x5c72f5bc, 0x44663bc5, 0x5bfb7e34, + 0x8b432976, 0xcb23c6dc, 0xb6edfc68, 0xb8e4f163, + 0xd731dcca, 0x42638510, 0x13972240, 0x84c61120, + 0x854a247d, 0xd2bb3df8, 0xaef93211, 0xc729a16d, + 0x1d9e2f4b, 0xdcb230f3, 0x0d8652ec, 0x77c1e3d0, + 0x2bb3166c, 0xa970b999, 0x119448fa, 0x47e96422, + 0xa8fc8cc4, 0xa0f03f1a, 0x567d2cd8, 0x223390ef, + 0x87494ec7, 0xd938d1c1, 0x8ccaa2fe, 0x98d40b36, + 0xa6f581cf, 0xa57ade28, 0xdab78e26, 0x3fadbfa4, + 0x2c3a9de4, 0x5078920d, 0x6a5fcc9b, 0x547e4662, + 0xf68d13c2, 0x90d8b8e8, 0x2e39f75e, 0x82c3aff5, + 0x9f5d80be, 0x69d0937c, 0x6fd52da9, 0xcf2512b3, + 0xc8ac993b, 0x10187da7, 0xe89c636e, 0xdb3bbb7b, + 0xcd267809, 0x6e5918f4, 0xec9ab701, 0x834f9aa8, + 0xe6956e65, 0xaaffe67e, 0x21bccf08, 0xef15e8e6, + 0xbae79bd9, 0x4a6f36ce, 0xea9f09d4, 0x29b07cd6, + 0x31a4b2af, 0x2a3f2331, 0xc6a59430, 0x35a266c0, + 0x744ebc37, 0xfc82caa6, 0xe090d0b0, 0x33a7d815, + 0xf104984a, 0x41ecdaf7, 0x7fcd500e, 0x1791f62f, + 0x764dd68d, 0x43efb04d, 0xccaa4d54, 0xe49604df, + 0x9ed1b5e3, 0x4c6a881b, 0xc12c1fb8, 0x4665517f, + 0x9d5eea04, 0x018c355d, 0xfa877473, 0xfb0b412e, + 0xb3671d5a, 0x92dbd252, 0xe9105633, 0x6dd64713, + 0x9ad7618c, 0x37a10c7a, 0x59f8148e, 0xeb133c89, + 0xcea927ee, 0xb761c935, 0xe11ce5ed, 0x7a47b13c, + 0x9cd2df59, 0x55f2733f, 0x1814ce79, 0x73c737bf, + 0x53f7cdea, 0x5ffdaa5b, 0xdf3d6f14, 0x7844db86, + 0xcaaff381, 0xb968c43e, 0x3824342c, 0xc2a3405f, + 0x161dc372, 0xbce2250c, 0x283c498b, 0xff0d9541, + 0x39a80171, 0x080cb3de, 0xd8b4e49c, 0x6456c190, + 0x7bcb8461, 0xd532b670, 0x486c5c74, 0xd0b85742, +}; + +__device__ __constant__ u32 td1[256] = +{ + 0x5051f4a7, 0x537e4165, 0xc31a17a4, 0x963a275e, + 0xcb3bab6b, 0xf11f9d45, 0xabacfa58, 0x934be303, + 0x552030fa, 0xf6ad766d, 0x9188cc76, 0x25f5024c, + 0xfc4fe5d7, 0xd7c52acb, 0x80263544, 0x8fb562a3, + 0x49deb15a, 0x6725ba1b, 0x9845ea0e, 0xe15dfec0, + 0x02c32f75, 0x12814cf0, 0xa38d4697, 0xc66bd3f9, + 0xe7038f5f, 0x9515929c, 0xebbf6d7a, 0xda955259, + 0x2dd4be83, 0xd3587421, 0x2949e069, 0x448ec9c8, + 0x6a75c289, 0x78f48e79, 0x6b99583e, 0xdd27b971, + 0xb6bee14f, 0x17f088ad, 0x66c920ac, 0xb47dce3a, + 0x1863df4a, 0x82e51a31, 0x60975133, 0x4562537f, + 0xe0b16477, 0x84bb6bae, 0x1cfe81a0, 0x94f9082b, + 0x58704868, 0x198f45fd, 0x8794de6c, 0xb7527bf8, + 0x23ab73d3, 0xe2724b02, 0x57e31f8f, 0x2a6655ab, + 0x07b2eb28, 0x032fb5c2, 0x9a86c57b, 0xa5d33708, + 0xf2302887, 0xb223bfa5, 0xba02036a, 0x5ced1682, + 0x2b8acf1c, 0x92a779b4, 0xf0f307f2, 0xa14e69e2, + 0xcd65daf4, 0xd50605be, 0x1fd13462, 0x8ac4a6fe, + 0x9d342e53, 0xa0a2f355, 0x32058ae1, 0x75a4f6eb, + 0x390b83ec, 0xaa4060ef, 0x065e719f, 0x51bd6e10, + 0xf93e218a, 0x3d96dd06, 0xaedd3e05, 0x464de6bd, + 0xb591548d, 0x0571c45d, 0x6f0406d4, 0xff605015, + 0x241998fb, 0x97d6bde9, 0xcc894043, 0x7767d99e, + 0xbdb0e842, 0x8807898b, 0x38e7195b, 0xdb79c8ee, + 0x47a17c0a, 0xe97c420f, 0xc9f8841e, 0x00000000, + 0x83098086, 0x48322bed, 0xac1e1170, 0x4e6c5a72, + 0xfbfd0eff, 0x560f8538, 0x1e3daed5, 0x27362d39, + 0x640a0fd9, 0x21685ca6, 0xd19b5b54, 0x3a24362e, + 0xb10c0a67, 0x0f9357e7, 0xd2b4ee96, 0x9e1b9b91, + 0x4f80c0c5, 0xa261dc20, 0x695a774b, 0x161c121a, + 0x0ae293ba, 0xe5c0a02a, 0x433c22e0, 0x1d121b17, + 0x0b0e090d, 0xadf28bc7, 0xb92db6a8, 0xc8141ea9, + 0x8557f119, 0x4caf7507, 0xbbee99dd, 0xfda37f60, + 0x9ff70126, 0xbc5c72f5, 0xc544663b, 0x345bfb7e, + 0x768b4329, 0xdccb23c6, 0x68b6edfc, 0x63b8e4f1, + 0xcad731dc, 0x10426385, 0x40139722, 0x2084c611, + 0x7d854a24, 0xf8d2bb3d, 0x11aef932, 0x6dc729a1, + 0x4b1d9e2f, 0xf3dcb230, 0xec0d8652, 0xd077c1e3, + 0x6c2bb316, 0x99a970b9, 0xfa119448, 0x2247e964, + 0xc4a8fc8c, 0x1aa0f03f, 0xd8567d2c, 0xef223390, + 0xc787494e, 0xc1d938d1, 0xfe8ccaa2, 0x3698d40b, + 0xcfa6f581, 0x28a57ade, 0x26dab78e, 0xa43fadbf, + 0xe42c3a9d, 0x0d507892, 0x9b6a5fcc, 0x62547e46, + 0xc2f68d13, 0xe890d8b8, 0x5e2e39f7, 0xf582c3af, + 0xbe9f5d80, 0x7c69d093, 0xa96fd52d, 0xb3cf2512, + 0x3bc8ac99, 0xa710187d, 0x6ee89c63, 0x7bdb3bbb, + 0x09cd2678, 0xf46e5918, 0x01ec9ab7, 0xa8834f9a, + 0x65e6956e, 0x7eaaffe6, 0x0821bccf, 0xe6ef15e8, + 0xd9bae79b, 0xce4a6f36, 0xd4ea9f09, 0xd629b07c, + 0xaf31a4b2, 0x312a3f23, 0x30c6a594, 0xc035a266, + 0x37744ebc, 0xa6fc82ca, 0xb0e090d0, 0x1533a7d8, + 0x4af10498, 0xf741ecda, 0x0e7fcd50, 0x2f1791f6, + 0x8d764dd6, 0x4d43efb0, 0x54ccaa4d, 0xdfe49604, + 0xe39ed1b5, 0x1b4c6a88, 0xb8c12c1f, 0x7f466551, + 0x049d5eea, 0x5d018c35, 0x73fa8774, 0x2efb0b41, + 0x5ab3671d, 0x5292dbd2, 0x33e91056, 0x136dd647, + 0x8c9ad761, 0x7a37a10c, 0x8e59f814, 0x89eb133c, + 0xeecea927, 0x35b761c9, 0xede11ce5, 0x3c7a47b1, + 0x599cd2df, 0x3f55f273, 0x791814ce, 0xbf73c737, + 0xea53f7cd, 0x5b5ffdaa, 0x14df3d6f, 0x867844db, + 0x81caaff3, 0x3eb968c4, 0x2c382434, 0x5fc2a340, + 0x72161dc3, 0x0cbce225, 0x8b283c49, 0x41ff0d95, + 0x7139a801, 0xde080cb3, 0x9cd8b4e4, 0x906456c1, + 0x617bcb84, 0x70d532b6, 0x74486c5c, 0x42d0b857, +}; + +__device__ __constant__ u32 td2[256] = +{ + 0xa75051f4, 0x65537e41, 0xa4c31a17, 0x5e963a27, + 0x6bcb3bab, 0x45f11f9d, 0x58abacfa, 0x03934be3, + 0xfa552030, 0x6df6ad76, 0x769188cc, 0x4c25f502, + 0xd7fc4fe5, 0xcbd7c52a, 0x44802635, 0xa38fb562, + 0x5a49deb1, 0x1b6725ba, 0x0e9845ea, 0xc0e15dfe, + 0x7502c32f, 0xf012814c, 0x97a38d46, 0xf9c66bd3, + 0x5fe7038f, 0x9c951592, 0x7aebbf6d, 0x59da9552, + 0x832dd4be, 0x21d35874, 0x692949e0, 0xc8448ec9, + 0x896a75c2, 0x7978f48e, 0x3e6b9958, 0x71dd27b9, + 0x4fb6bee1, 0xad17f088, 0xac66c920, 0x3ab47dce, + 0x4a1863df, 0x3182e51a, 0x33609751, 0x7f456253, + 0x77e0b164, 0xae84bb6b, 0xa01cfe81, 0x2b94f908, + 0x68587048, 0xfd198f45, 0x6c8794de, 0xf8b7527b, + 0xd323ab73, 0x02e2724b, 0x8f57e31f, 0xab2a6655, + 0x2807b2eb, 0xc2032fb5, 0x7b9a86c5, 0x08a5d337, + 0x87f23028, 0xa5b223bf, 0x6aba0203, 0x825ced16, + 0x1c2b8acf, 0xb492a779, 0xf2f0f307, 0xe2a14e69, + 0xf4cd65da, 0xbed50605, 0x621fd134, 0xfe8ac4a6, + 0x539d342e, 0x55a0a2f3, 0xe132058a, 0xeb75a4f6, + 0xec390b83, 0xefaa4060, 0x9f065e71, 0x1051bd6e, + 0x8af93e21, 0x063d96dd, 0x05aedd3e, 0xbd464de6, + 0x8db59154, 0x5d0571c4, 0xd46f0406, 0x15ff6050, + 0xfb241998, 0xe997d6bd, 0x43cc8940, 0x9e7767d9, + 0x42bdb0e8, 0x8b880789, 0x5b38e719, 0xeedb79c8, + 0x0a47a17c, 0x0fe97c42, 0x1ec9f884, 0x00000000, + 0x86830980, 0xed48322b, 0x70ac1e11, 0x724e6c5a, + 0xfffbfd0e, 0x38560f85, 0xd51e3dae, 0x3927362d, + 0xd9640a0f, 0xa621685c, 0x54d19b5b, 0x2e3a2436, + 0x67b10c0a, 0xe70f9357, 0x96d2b4ee, 0x919e1b9b, + 0xc54f80c0, 0x20a261dc, 0x4b695a77, 0x1a161c12, + 0xba0ae293, 0x2ae5c0a0, 0xe0433c22, 0x171d121b, + 0x0d0b0e09, 0xc7adf28b, 0xa8b92db6, 0xa9c8141e, + 0x198557f1, 0x074caf75, 0xddbbee99, 0x60fda37f, + 0x269ff701, 0xf5bc5c72, 0x3bc54466, 0x7e345bfb, + 0x29768b43, 0xc6dccb23, 0xfc68b6ed, 0xf163b8e4, + 0xdccad731, 0x85104263, 0x22401397, 0x112084c6, + 0x247d854a, 0x3df8d2bb, 0x3211aef9, 0xa16dc729, + 0x2f4b1d9e, 0x30f3dcb2, 0x52ec0d86, 0xe3d077c1, + 0x166c2bb3, 0xb999a970, 0x48fa1194, 0x642247e9, + 0x8cc4a8fc, 0x3f1aa0f0, 0x2cd8567d, 0x90ef2233, + 0x4ec78749, 0xd1c1d938, 0xa2fe8cca, 0x0b3698d4, + 0x81cfa6f5, 0xde28a57a, 0x8e26dab7, 0xbfa43fad, + 0x9de42c3a, 0x920d5078, 0xcc9b6a5f, 0x4662547e, + 0x13c2f68d, 0xb8e890d8, 0xf75e2e39, 0xaff582c3, + 0x80be9f5d, 0x937c69d0, 0x2da96fd5, 0x12b3cf25, + 0x993bc8ac, 0x7da71018, 0x636ee89c, 0xbb7bdb3b, + 0x7809cd26, 0x18f46e59, 0xb701ec9a, 0x9aa8834f, + 0x6e65e695, 0xe67eaaff, 0xcf0821bc, 0xe8e6ef15, + 0x9bd9bae7, 0x36ce4a6f, 0x09d4ea9f, 0x7cd629b0, + 0xb2af31a4, 0x23312a3f, 0x9430c6a5, 0x66c035a2, + 0xbc37744e, 0xcaa6fc82, 0xd0b0e090, 0xd81533a7, + 0x984af104, 0xdaf741ec, 0x500e7fcd, 0xf62f1791, + 0xd68d764d, 0xb04d43ef, 0x4d54ccaa, 0x04dfe496, + 0xb5e39ed1, 0x881b4c6a, 0x1fb8c12c, 0x517f4665, + 0xea049d5e, 0x355d018c, 0x7473fa87, 0x412efb0b, + 0x1d5ab367, 0xd25292db, 0x5633e910, 0x47136dd6, + 0x618c9ad7, 0x0c7a37a1, 0x148e59f8, 0x3c89eb13, + 0x27eecea9, 0xc935b761, 0xe5ede11c, 0xb13c7a47, + 0xdf599cd2, 0x733f55f2, 0xce791814, 0x37bf73c7, + 0xcdea53f7, 0xaa5b5ffd, 0x6f14df3d, 0xdb867844, + 0xf381caaf, 0xc43eb968, 0x342c3824, 0x405fc2a3, + 0xc372161d, 0x250cbce2, 0x498b283c, 0x9541ff0d, + 0x017139a8, 0xb3de080c, 0xe49cd8b4, 0xc1906456, + 0x84617bcb, 0xb670d532, 0x5c74486c, 0x5742d0b8, +}; + +__device__ __constant__ u32 td3[256] = +{ + 0xf4a75051, 0x4165537e, 0x17a4c31a, 0x275e963a, + 0xab6bcb3b, 0x9d45f11f, 0xfa58abac, 0xe303934b, + 0x30fa5520, 0x766df6ad, 0xcc769188, 0x024c25f5, + 0xe5d7fc4f, 0x2acbd7c5, 0x35448026, 0x62a38fb5, + 0xb15a49de, 0xba1b6725, 0xea0e9845, 0xfec0e15d, + 0x2f7502c3, 0x4cf01281, 0x4697a38d, 0xd3f9c66b, + 0x8f5fe703, 0x929c9515, 0x6d7aebbf, 0x5259da95, + 0xbe832dd4, 0x7421d358, 0xe0692949, 0xc9c8448e, + 0xc2896a75, 0x8e7978f4, 0x583e6b99, 0xb971dd27, + 0xe14fb6be, 0x88ad17f0, 0x20ac66c9, 0xce3ab47d, + 0xdf4a1863, 0x1a3182e5, 0x51336097, 0x537f4562, + 0x6477e0b1, 0x6bae84bb, 0x81a01cfe, 0x082b94f9, + 0x48685870, 0x45fd198f, 0xde6c8794, 0x7bf8b752, + 0x73d323ab, 0x4b02e272, 0x1f8f57e3, 0x55ab2a66, + 0xeb2807b2, 0xb5c2032f, 0xc57b9a86, 0x3708a5d3, + 0x2887f230, 0xbfa5b223, 0x036aba02, 0x16825ced, + 0xcf1c2b8a, 0x79b492a7, 0x07f2f0f3, 0x69e2a14e, + 0xdaf4cd65, 0x05bed506, 0x34621fd1, 0xa6fe8ac4, + 0x2e539d34, 0xf355a0a2, 0x8ae13205, 0xf6eb75a4, + 0x83ec390b, 0x60efaa40, 0x719f065e, 0x6e1051bd, + 0x218af93e, 0xdd063d96, 0x3e05aedd, 0xe6bd464d, + 0x548db591, 0xc45d0571, 0x06d46f04, 0x5015ff60, + 0x98fb2419, 0xbde997d6, 0x4043cc89, 0xd99e7767, + 0xe842bdb0, 0x898b8807, 0x195b38e7, 0xc8eedb79, + 0x7c0a47a1, 0x420fe97c, 0x841ec9f8, 0x00000000, + 0x80868309, 0x2bed4832, 0x1170ac1e, 0x5a724e6c, + 0x0efffbfd, 0x8538560f, 0xaed51e3d, 0x2d392736, + 0x0fd9640a, 0x5ca62168, 0x5b54d19b, 0x362e3a24, + 0x0a67b10c, 0x57e70f93, 0xee96d2b4, 0x9b919e1b, + 0xc0c54f80, 0xdc20a261, 0x774b695a, 0x121a161c, + 0x93ba0ae2, 0xa02ae5c0, 0x22e0433c, 0x1b171d12, + 0x090d0b0e, 0x8bc7adf2, 0xb6a8b92d, 0x1ea9c814, + 0xf1198557, 0x75074caf, 0x99ddbbee, 0x7f60fda3, + 0x01269ff7, 0x72f5bc5c, 0x663bc544, 0xfb7e345b, + 0x4329768b, 0x23c6dccb, 0xedfc68b6, 0xe4f163b8, + 0x31dccad7, 0x63851042, 0x97224013, 0xc6112084, + 0x4a247d85, 0xbb3df8d2, 0xf93211ae, 0x29a16dc7, + 0x9e2f4b1d, 0xb230f3dc, 0x8652ec0d, 0xc1e3d077, + 0xb3166c2b, 0x70b999a9, 0x9448fa11, 0xe9642247, + 0xfc8cc4a8, 0xf03f1aa0, 0x7d2cd856, 0x3390ef22, + 0x494ec787, 0x38d1c1d9, 0xcaa2fe8c, 0xd40b3698, + 0xf581cfa6, 0x7ade28a5, 0xb78e26da, 0xadbfa43f, + 0x3a9de42c, 0x78920d50, 0x5fcc9b6a, 0x7e466254, + 0x8d13c2f6, 0xd8b8e890, 0x39f75e2e, 0xc3aff582, + 0x5d80be9f, 0xd0937c69, 0xd52da96f, 0x2512b3cf, + 0xac993bc8, 0x187da710, 0x9c636ee8, 0x3bbb7bdb, + 0x267809cd, 0x5918f46e, 0x9ab701ec, 0x4f9aa883, + 0x956e65e6, 0xffe67eaa, 0xbccf0821, 0x15e8e6ef, + 0xe79bd9ba, 0x6f36ce4a, 0x9f09d4ea, 0xb07cd629, + 0xa4b2af31, 0x3f23312a, 0xa59430c6, 0xa266c035, + 0x4ebc3774, 0x82caa6fc, 0x90d0b0e0, 0xa7d81533, + 0x04984af1, 0xecdaf741, 0xcd500e7f, 0x91f62f17, + 0x4dd68d76, 0xefb04d43, 0xaa4d54cc, 0x9604dfe4, + 0xd1b5e39e, 0x6a881b4c, 0x2c1fb8c1, 0x65517f46, + 0x5eea049d, 0x8c355d01, 0x877473fa, 0x0b412efb, + 0x671d5ab3, 0xdbd25292, 0x105633e9, 0xd647136d, + 0xd7618c9a, 0xa10c7a37, 0xf8148e59, 0x133c89eb, + 0xa927eece, 0x61c935b7, 0x1ce5ede1, 0x47b13c7a, + 0xd2df599c, 0xf2733f55, 0x14ce7918, 0xc737bf73, + 0xf7cdea53, 0xfdaa5b5f, 0x3d6f14df, 0x44db8678, + 0xaff381ca, 0x68c43eb9, 0x24342c38, 0xa3405fc2, + 0x1dc37216, 0xe2250cbc, 0x3c498b28, 0x0d9541ff, + 0xa8017139, 0x0cb3de08, 0xb4e49cd8, 0x56c19064, + 0xcb84617b, 0x32b670d5, 0x6c5c7448, 0xb85742d0, +}; + +__device__ __constant__ u32 td4[256] = +{ + 0x52525252, 0x09090909, 0x6a6a6a6a, 0xd5d5d5d5, + 0x30303030, 0x36363636, 0xa5a5a5a5, 0x38383838, + 0xbfbfbfbf, 0x40404040, 0xa3a3a3a3, 0x9e9e9e9e, + 0x81818181, 0xf3f3f3f3, 0xd7d7d7d7, 0xfbfbfbfb, + 0x7c7c7c7c, 0xe3e3e3e3, 0x39393939, 0x82828282, + 0x9b9b9b9b, 0x2f2f2f2f, 0xffffffff, 0x87878787, + 0x34343434, 0x8e8e8e8e, 0x43434343, 0x44444444, + 0xc4c4c4c4, 0xdededede, 0xe9e9e9e9, 0xcbcbcbcb, + 0x54545454, 0x7b7b7b7b, 0x94949494, 0x32323232, + 0xa6a6a6a6, 0xc2c2c2c2, 0x23232323, 0x3d3d3d3d, + 0xeeeeeeee, 0x4c4c4c4c, 0x95959595, 0x0b0b0b0b, + 0x42424242, 0xfafafafa, 0xc3c3c3c3, 0x4e4e4e4e, + 0x08080808, 0x2e2e2e2e, 0xa1a1a1a1, 0x66666666, + 0x28282828, 0xd9d9d9d9, 0x24242424, 0xb2b2b2b2, + 0x76767676, 0x5b5b5b5b, 0xa2a2a2a2, 0x49494949, + 0x6d6d6d6d, 0x8b8b8b8b, 0xd1d1d1d1, 0x25252525, + 0x72727272, 0xf8f8f8f8, 0xf6f6f6f6, 0x64646464, + 0x86868686, 0x68686868, 0x98989898, 0x16161616, + 0xd4d4d4d4, 0xa4a4a4a4, 0x5c5c5c5c, 0xcccccccc, + 0x5d5d5d5d, 0x65656565, 0xb6b6b6b6, 0x92929292, + 0x6c6c6c6c, 0x70707070, 0x48484848, 0x50505050, + 0xfdfdfdfd, 0xedededed, 0xb9b9b9b9, 0xdadadada, + 0x5e5e5e5e, 0x15151515, 0x46464646, 0x57575757, + 0xa7a7a7a7, 0x8d8d8d8d, 0x9d9d9d9d, 0x84848484, + 0x90909090, 0xd8d8d8d8, 0xabababab, 0x00000000, + 0x8c8c8c8c, 0xbcbcbcbc, 0xd3d3d3d3, 0x0a0a0a0a, + 0xf7f7f7f7, 0xe4e4e4e4, 0x58585858, 0x05050505, + 0xb8b8b8b8, 0xb3b3b3b3, 0x45454545, 0x06060606, + 0xd0d0d0d0, 0x2c2c2c2c, 0x1e1e1e1e, 0x8f8f8f8f, + 0xcacacaca, 0x3f3f3f3f, 0x0f0f0f0f, 0x02020202, + 0xc1c1c1c1, 0xafafafaf, 0xbdbdbdbd, 0x03030303, + 0x01010101, 0x13131313, 0x8a8a8a8a, 0x6b6b6b6b, + 0x3a3a3a3a, 0x91919191, 0x11111111, 0x41414141, + 0x4f4f4f4f, 0x67676767, 0xdcdcdcdc, 0xeaeaeaea, + 0x97979797, 0xf2f2f2f2, 0xcfcfcfcf, 0xcececece, + 0xf0f0f0f0, 0xb4b4b4b4, 0xe6e6e6e6, 0x73737373, + 0x96969696, 0xacacacac, 0x74747474, 0x22222222, + 0xe7e7e7e7, 0xadadadad, 0x35353535, 0x85858585, + 0xe2e2e2e2, 0xf9f9f9f9, 0x37373737, 0xe8e8e8e8, + 0x1c1c1c1c, 0x75757575, 0xdfdfdfdf, 0x6e6e6e6e, + 0x47474747, 0xf1f1f1f1, 0x1a1a1a1a, 0x71717171, + 0x1d1d1d1d, 0x29292929, 0xc5c5c5c5, 0x89898989, + 0x6f6f6f6f, 0xb7b7b7b7, 0x62626262, 0x0e0e0e0e, + 0xaaaaaaaa, 0x18181818, 0xbebebebe, 0x1b1b1b1b, + 0xfcfcfcfc, 0x56565656, 0x3e3e3e3e, 0x4b4b4b4b, + 0xc6c6c6c6, 0xd2d2d2d2, 0x79797979, 0x20202020, + 0x9a9a9a9a, 0xdbdbdbdb, 0xc0c0c0c0, 0xfefefefe, + 0x78787878, 0xcdcdcdcd, 0x5a5a5a5a, 0xf4f4f4f4, + 0x1f1f1f1f, 0xdddddddd, 0xa8a8a8a8, 0x33333333, + 0x88888888, 0x07070707, 0xc7c7c7c7, 0x31313131, + 0xb1b1b1b1, 0x12121212, 0x10101010, 0x59595959, + 0x27272727, 0x80808080, 0xecececec, 0x5f5f5f5f, + 0x60606060, 0x51515151, 0x7f7f7f7f, 0xa9a9a9a9, + 0x19191919, 0xb5b5b5b5, 0x4a4a4a4a, 0x0d0d0d0d, + 0x2d2d2d2d, 0xe5e5e5e5, 0x7a7a7a7a, 0x9f9f9f9f, + 0x93939393, 0xc9c9c9c9, 0x9c9c9c9c, 0xefefefef, + 0xa0a0a0a0, 0xe0e0e0e0, 0x3b3b3b3b, 0x4d4d4d4d, + 0xaeaeaeae, 0x2a2a2a2a, 0xf5f5f5f5, 0xb0b0b0b0, + 0xc8c8c8c8, 0xebebebeb, 0xbbbbbbbb, 0x3c3c3c3c, + 0x83838383, 0x53535353, 0x99999999, 0x61616161, + 0x17171717, 0x2b2b2b2b, 0x04040404, 0x7e7e7e7e, + 0xbabababa, 0x77777777, 0xd6d6d6d6, 0x26262626, + 0xe1e1e1e1, 0x69696969, 0x14141414, 0x63636363, + 0x55555555, 0x21212121, 0x0c0c0c0c, 0x7d7d7d7d, +}; + +__device__ __constant__ u32 rcon[] = +{ + 0x01000000, 0x02000000, 0x04000000, 0x08000000, + 0x10000000, 0x20000000, 0x40000000, 0x80000000, + 0x1b000000, 0x36000000, +}; + +__device__ static void AES256_ExpandKey (u32 *userkey, u32 *rek, u32 s_te0[256], u32 s_te1[256], u32 s_te2[256], u32 s_te3[256], u32 s_te4[256]) +{ + rek[0] = userkey[0]; + rek[1] = userkey[1]; + rek[2] = userkey[2]; + rek[3] = userkey[3]; + rek[4] = userkey[4]; + rek[5] = userkey[5]; + rek[6] = userkey[6]; + rek[7] = userkey[7]; + + int i; + int j; + + i = 0; + j = 0; + + while (1) + { + u32 temp = rek[j + 7]; + + rek[j + 8] = rek[j + 0] + ^ (s_te2[(temp >> 16) & 0xff] & 0xff000000) + ^ (s_te3[(temp >> 8) & 0xff] & 0x00ff0000) + ^ (s_te0[(temp >> 0) & 0xff] & 0x0000ff00) + ^ (s_te1[(temp >> 24) & 0xff] & 0x000000ff) + ^ rcon[i]; + + rek[j + 9] = rek[j + 1] ^ rek[j + 8]; + rek[j + 10] = rek[j + 2] ^ rek[j + 9]; + rek[j + 11] = rek[j + 3] ^ rek[j + 10]; + + if (++i == 7) break; + + temp = rek[j + 11]; + + rek[j + 12] = rek[j + 4] + ^ (s_te2[(temp >> 24) & 0xff] & 0xff000000) + ^ (s_te3[(temp >> 16) & 0xff] & 0x00ff0000) + ^ (s_te0[(temp >> 8) & 0xff] & 0x0000ff00) + ^ (s_te1[(temp >> 0) & 0xff] & 0x000000ff); + + rek[j + 13] = rek[j + 5] ^ rek[j + 12]; + rek[j + 14] = rek[j + 6] ^ rek[j + 13]; + rek[j + 15] = rek[j + 7] ^ rek[j + 14]; + + j += 8; + } +} + +__device__ static void AES256_InvertKey (u32 *rdk, u32 s_td0[256], u32 s_td1[256], u32 s_td2[256], u32 s_td3[256], u32 s_td4[256], u32 s_te0[256], u32 s_te1[256], u32 s_te2[256], u32 s_te3[256], u32 s_te4[256]) +{ + for (u32 i = 0, j = 56; i < j; i += 4, j -= 4) + { + u32 temp; + + temp = rdk[i + 0]; rdk[i + 0] = rdk[j + 0]; rdk[j + 0] = temp; + temp = rdk[i + 1]; rdk[i + 1] = rdk[j + 1]; rdk[j + 1] = temp; + temp = rdk[i + 2]; rdk[i + 2] = rdk[j + 2]; rdk[j + 2] = temp; + temp = rdk[i + 3]; rdk[i + 3] = rdk[j + 3]; rdk[j + 3] = temp; + } + + for (u32 i = 1, j = 4; i < 14; i += 1, j += 4) + { + rdk[j + 0] = + s_td0[s_te1[(rdk[j + 0] >> 24) & 0xff] & 0xff] ^ + s_td1[s_te1[(rdk[j + 0] >> 16) & 0xff] & 0xff] ^ + s_td2[s_te1[(rdk[j + 0] >> 8) & 0xff] & 0xff] ^ + s_td3[s_te1[(rdk[j + 0] >> 0) & 0xff] & 0xff]; + + rdk[j + 1] = + s_td0[s_te1[(rdk[j + 1] >> 24) & 0xff] & 0xff] ^ + s_td1[s_te1[(rdk[j + 1] >> 16) & 0xff] & 0xff] ^ + s_td2[s_te1[(rdk[j + 1] >> 8) & 0xff] & 0xff] ^ + s_td3[s_te1[(rdk[j + 1] >> 0) & 0xff] & 0xff]; + + rdk[j + 2] = + s_td0[s_te1[(rdk[j + 2] >> 24) & 0xff] & 0xff] ^ + s_td1[s_te1[(rdk[j + 2] >> 16) & 0xff] & 0xff] ^ + s_td2[s_te1[(rdk[j + 2] >> 8) & 0xff] & 0xff] ^ + s_td3[s_te1[(rdk[j + 2] >> 0) & 0xff] & 0xff]; + + rdk[j + 3] = + s_td0[s_te1[(rdk[j + 3] >> 24) & 0xff] & 0xff] ^ + s_td1[s_te1[(rdk[j + 3] >> 16) & 0xff] & 0xff] ^ + s_td2[s_te1[(rdk[j + 3] >> 8) & 0xff] & 0xff] ^ + s_td3[s_te1[(rdk[j + 3] >> 0) & 0xff] & 0xff]; + } +} + +__device__ static void AES256_decrypt (const u32 *in, u32 *out, const u32 *rdk, u32 s_td0[256], u32 s_td1[256], u32 s_td2[256], u32 s_td3[256], u32 s_td4[256]) +{ + u32 s0 = in[0] ^ rdk[0]; + u32 s1 = in[1] ^ rdk[1]; + u32 s2 = in[2] ^ rdk[2]; + u32 s3 = in[3] ^ rdk[3]; + + u32 t0; + u32 t1; + u32 t2; + u32 t3; + + t0 = s_td0[s0 >> 24] ^ s_td1[(s3 >> 16) & 0xff] ^ s_td2[(s2 >> 8) & 0xff] ^ s_td3[s1 & 0xff] ^ rdk[ 4]; + t1 = s_td0[s1 >> 24] ^ s_td1[(s0 >> 16) & 0xff] ^ s_td2[(s3 >> 8) & 0xff] ^ s_td3[s2 & 0xff] ^ rdk[ 5]; + t2 = s_td0[s2 >> 24] ^ s_td1[(s1 >> 16) & 0xff] ^ s_td2[(s0 >> 8) & 0xff] ^ s_td3[s3 & 0xff] ^ rdk[ 6]; + t3 = s_td0[s3 >> 24] ^ s_td1[(s2 >> 16) & 0xff] ^ s_td2[(s1 >> 8) & 0xff] ^ s_td3[s0 & 0xff] ^ rdk[ 7]; + s0 = s_td0[t0 >> 24] ^ s_td1[(t3 >> 16) & 0xff] ^ s_td2[(t2 >> 8) & 0xff] ^ s_td3[t1 & 0xff] ^ rdk[ 8]; + s1 = s_td0[t1 >> 24] ^ s_td1[(t0 >> 16) & 0xff] ^ s_td2[(t3 >> 8) & 0xff] ^ s_td3[t2 & 0xff] ^ rdk[ 9]; + s2 = s_td0[t2 >> 24] ^ s_td1[(t1 >> 16) & 0xff] ^ s_td2[(t0 >> 8) & 0xff] ^ s_td3[t3 & 0xff] ^ rdk[10]; + s3 = s_td0[t3 >> 24] ^ s_td1[(t2 >> 16) & 0xff] ^ s_td2[(t1 >> 8) & 0xff] ^ s_td3[t0 & 0xff] ^ rdk[11]; + t0 = s_td0[s0 >> 24] ^ s_td1[(s3 >> 16) & 0xff] ^ s_td2[(s2 >> 8) & 0xff] ^ s_td3[s1 & 0xff] ^ rdk[12]; + t1 = s_td0[s1 >> 24] ^ s_td1[(s0 >> 16) & 0xff] ^ s_td2[(s3 >> 8) & 0xff] ^ s_td3[s2 & 0xff] ^ rdk[13]; + t2 = s_td0[s2 >> 24] ^ s_td1[(s1 >> 16) & 0xff] ^ s_td2[(s0 >> 8) & 0xff] ^ s_td3[s3 & 0xff] ^ rdk[14]; + t3 = s_td0[s3 >> 24] ^ s_td1[(s2 >> 16) & 0xff] ^ s_td2[(s1 >> 8) & 0xff] ^ s_td3[s0 & 0xff] ^ rdk[15]; + s0 = s_td0[t0 >> 24] ^ s_td1[(t3 >> 16) & 0xff] ^ s_td2[(t2 >> 8) & 0xff] ^ s_td3[t1 & 0xff] ^ rdk[16]; + s1 = s_td0[t1 >> 24] ^ s_td1[(t0 >> 16) & 0xff] ^ s_td2[(t3 >> 8) & 0xff] ^ s_td3[t2 & 0xff] ^ rdk[17]; + s2 = s_td0[t2 >> 24] ^ s_td1[(t1 >> 16) & 0xff] ^ s_td2[(t0 >> 8) & 0xff] ^ s_td3[t3 & 0xff] ^ rdk[18]; + s3 = s_td0[t3 >> 24] ^ s_td1[(t2 >> 16) & 0xff] ^ s_td2[(t1 >> 8) & 0xff] ^ s_td3[t0 & 0xff] ^ rdk[19]; + t0 = s_td0[s0 >> 24] ^ s_td1[(s3 >> 16) & 0xff] ^ s_td2[(s2 >> 8) & 0xff] ^ s_td3[s1 & 0xff] ^ rdk[20]; + t1 = s_td0[s1 >> 24] ^ s_td1[(s0 >> 16) & 0xff] ^ s_td2[(s3 >> 8) & 0xff] ^ s_td3[s2 & 0xff] ^ rdk[21]; + t2 = s_td0[s2 >> 24] ^ s_td1[(s1 >> 16) & 0xff] ^ s_td2[(s0 >> 8) & 0xff] ^ s_td3[s3 & 0xff] ^ rdk[22]; + t3 = s_td0[s3 >> 24] ^ s_td1[(s2 >> 16) & 0xff] ^ s_td2[(s1 >> 8) & 0xff] ^ s_td3[s0 & 0xff] ^ rdk[23]; + s0 = s_td0[t0 >> 24] ^ s_td1[(t3 >> 16) & 0xff] ^ s_td2[(t2 >> 8) & 0xff] ^ s_td3[t1 & 0xff] ^ rdk[24]; + s1 = s_td0[t1 >> 24] ^ s_td1[(t0 >> 16) & 0xff] ^ s_td2[(t3 >> 8) & 0xff] ^ s_td3[t2 & 0xff] ^ rdk[25]; + s2 = s_td0[t2 >> 24] ^ s_td1[(t1 >> 16) & 0xff] ^ s_td2[(t0 >> 8) & 0xff] ^ s_td3[t3 & 0xff] ^ rdk[26]; + s3 = s_td0[t3 >> 24] ^ s_td1[(t2 >> 16) & 0xff] ^ s_td2[(t1 >> 8) & 0xff] ^ s_td3[t0 & 0xff] ^ rdk[27]; + t0 = s_td0[s0 >> 24] ^ s_td1[(s3 >> 16) & 0xff] ^ s_td2[(s2 >> 8) & 0xff] ^ s_td3[s1 & 0xff] ^ rdk[28]; + t1 = s_td0[s1 >> 24] ^ s_td1[(s0 >> 16) & 0xff] ^ s_td2[(s3 >> 8) & 0xff] ^ s_td3[s2 & 0xff] ^ rdk[29]; + t2 = s_td0[s2 >> 24] ^ s_td1[(s1 >> 16) & 0xff] ^ s_td2[(s0 >> 8) & 0xff] ^ s_td3[s3 & 0xff] ^ rdk[30]; + t3 = s_td0[s3 >> 24] ^ s_td1[(s2 >> 16) & 0xff] ^ s_td2[(s1 >> 8) & 0xff] ^ s_td3[s0 & 0xff] ^ rdk[31]; + s0 = s_td0[t0 >> 24] ^ s_td1[(t3 >> 16) & 0xff] ^ s_td2[(t2 >> 8) & 0xff] ^ s_td3[t1 & 0xff] ^ rdk[32]; + s1 = s_td0[t1 >> 24] ^ s_td1[(t0 >> 16) & 0xff] ^ s_td2[(t3 >> 8) & 0xff] ^ s_td3[t2 & 0xff] ^ rdk[33]; + s2 = s_td0[t2 >> 24] ^ s_td1[(t1 >> 16) & 0xff] ^ s_td2[(t0 >> 8) & 0xff] ^ s_td3[t3 & 0xff] ^ rdk[34]; + s3 = s_td0[t3 >> 24] ^ s_td1[(t2 >> 16) & 0xff] ^ s_td2[(t1 >> 8) & 0xff] ^ s_td3[t0 & 0xff] ^ rdk[35]; + t0 = s_td0[s0 >> 24] ^ s_td1[(s3 >> 16) & 0xff] ^ s_td2[(s2 >> 8) & 0xff] ^ s_td3[s1 & 0xff] ^ rdk[36]; + t1 = s_td0[s1 >> 24] ^ s_td1[(s0 >> 16) & 0xff] ^ s_td2[(s3 >> 8) & 0xff] ^ s_td3[s2 & 0xff] ^ rdk[37]; + t2 = s_td0[s2 >> 24] ^ s_td1[(s1 >> 16) & 0xff] ^ s_td2[(s0 >> 8) & 0xff] ^ s_td3[s3 & 0xff] ^ rdk[38]; + t3 = s_td0[s3 >> 24] ^ s_td1[(s2 >> 16) & 0xff] ^ s_td2[(s1 >> 8) & 0xff] ^ s_td3[s0 & 0xff] ^ rdk[39]; + s0 = s_td0[t0 >> 24] ^ s_td1[(t3 >> 16) & 0xff] ^ s_td2[(t2 >> 8) & 0xff] ^ s_td3[t1 & 0xff] ^ rdk[40]; + s1 = s_td0[t1 >> 24] ^ s_td1[(t0 >> 16) & 0xff] ^ s_td2[(t3 >> 8) & 0xff] ^ s_td3[t2 & 0xff] ^ rdk[41]; + s2 = s_td0[t2 >> 24] ^ s_td1[(t1 >> 16) & 0xff] ^ s_td2[(t0 >> 8) & 0xff] ^ s_td3[t3 & 0xff] ^ rdk[42]; + s3 = s_td0[t3 >> 24] ^ s_td1[(t2 >> 16) & 0xff] ^ s_td2[(t1 >> 8) & 0xff] ^ s_td3[t0 & 0xff] ^ rdk[43]; + t0 = s_td0[s0 >> 24] ^ s_td1[(s3 >> 16) & 0xff] ^ s_td2[(s2 >> 8) & 0xff] ^ s_td3[s1 & 0xff] ^ rdk[44]; + t1 = s_td0[s1 >> 24] ^ s_td1[(s0 >> 16) & 0xff] ^ s_td2[(s3 >> 8) & 0xff] ^ s_td3[s2 & 0xff] ^ rdk[45]; + t2 = s_td0[s2 >> 24] ^ s_td1[(s1 >> 16) & 0xff] ^ s_td2[(s0 >> 8) & 0xff] ^ s_td3[s3 & 0xff] ^ rdk[46]; + t3 = s_td0[s3 >> 24] ^ s_td1[(s2 >> 16) & 0xff] ^ s_td2[(s1 >> 8) & 0xff] ^ s_td3[s0 & 0xff] ^ rdk[47]; + s0 = s_td0[t0 >> 24] ^ s_td1[(t3 >> 16) & 0xff] ^ s_td2[(t2 >> 8) & 0xff] ^ s_td3[t1 & 0xff] ^ rdk[48]; + s1 = s_td0[t1 >> 24] ^ s_td1[(t0 >> 16) & 0xff] ^ s_td2[(t3 >> 8) & 0xff] ^ s_td3[t2 & 0xff] ^ rdk[49]; + s2 = s_td0[t2 >> 24] ^ s_td1[(t1 >> 16) & 0xff] ^ s_td2[(t0 >> 8) & 0xff] ^ s_td3[t3 & 0xff] ^ rdk[50]; + s3 = s_td0[t3 >> 24] ^ s_td1[(t2 >> 16) & 0xff] ^ s_td2[(t1 >> 8) & 0xff] ^ s_td3[t0 & 0xff] ^ rdk[51]; + t0 = s_td0[s0 >> 24] ^ s_td1[(s3 >> 16) & 0xff] ^ s_td2[(s2 >> 8) & 0xff] ^ s_td3[s1 & 0xff] ^ rdk[52]; + t1 = s_td0[s1 >> 24] ^ s_td1[(s0 >> 16) & 0xff] ^ s_td2[(s3 >> 8) & 0xff] ^ s_td3[s2 & 0xff] ^ rdk[53]; + t2 = s_td0[s2 >> 24] ^ s_td1[(s1 >> 16) & 0xff] ^ s_td2[(s0 >> 8) & 0xff] ^ s_td3[s3 & 0xff] ^ rdk[54]; + t3 = s_td0[s3 >> 24] ^ s_td1[(s2 >> 16) & 0xff] ^ s_td2[(s1 >> 8) & 0xff] ^ s_td3[s0 & 0xff] ^ rdk[55]; + + out[0] = (s_td4[(t0 >> 24) & 0xff] & 0xff000000) + ^ (s_td4[(t3 >> 16) & 0xff] & 0x00ff0000) + ^ (s_td4[(t2 >> 8) & 0xff] & 0x0000ff00) + ^ (s_td4[(t1 >> 0) & 0xff] & 0x000000ff) + ^ rdk[56]; + + out[1] = (s_td4[(t1 >> 24) & 0xff] & 0xff000000) + ^ (s_td4[(t0 >> 16) & 0xff] & 0x00ff0000) + ^ (s_td4[(t3 >> 8) & 0xff] & 0x0000ff00) + ^ (s_td4[(t2 >> 0) & 0xff] & 0x000000ff) + ^ rdk[57]; + + out[2] = (s_td4[(t2 >> 24) & 0xff] & 0xff000000) + ^ (s_td4[(t1 >> 16) & 0xff] & 0x00ff0000) + ^ (s_td4[(t0 >> 8) & 0xff] & 0x0000ff00) + ^ (s_td4[(t3 >> 0) & 0xff] & 0x000000ff) + ^ rdk[58]; + + out[3] = (s_td4[(t3 >> 24) & 0xff] & 0xff000000) + ^ (s_td4[(t2 >> 16) & 0xff] & 0x00ff0000) + ^ (s_td4[(t1 >> 8) & 0xff] & 0x0000ff00) + ^ (s_td4[(t0 >> 0) & 0xff] & 0x000000ff) + ^ rdk[59]; +} + +__device__ static void AES256_encrypt (const u32 *in, u32 *out, const u32 *rek, u32 s_te0[256], u32 s_te1[256], u32 s_te2[256], u32 s_te3[256], u32 s_te4[256]) +{ + u32 s0 = in[0] ^ rek[0]; + u32 s1 = in[1] ^ rek[1]; + u32 s2 = in[2] ^ rek[2]; + u32 s3 = in[3] ^ rek[3]; + + u32 t0; + u32 t1; + u32 t2; + u32 t3; + + t0 = s_te0[s0 >> 24] ^ s_te1[(s1 >> 16) & 0xff] ^ s_te2[(s2 >> 8) & 0xff] ^ s_te3[s3 & 0xff] ^ rek[ 4]; + t1 = s_te0[s1 >> 24] ^ s_te1[(s2 >> 16) & 0xff] ^ s_te2[(s3 >> 8) & 0xff] ^ s_te3[s0 & 0xff] ^ rek[ 5]; + t2 = s_te0[s2 >> 24] ^ s_te1[(s3 >> 16) & 0xff] ^ s_te2[(s0 >> 8) & 0xff] ^ s_te3[s1 & 0xff] ^ rek[ 6]; + t3 = s_te0[s3 >> 24] ^ s_te1[(s0 >> 16) & 0xff] ^ s_te2[(s1 >> 8) & 0xff] ^ s_te3[s2 & 0xff] ^ rek[ 7]; + s0 = s_te0[t0 >> 24] ^ s_te1[(t1 >> 16) & 0xff] ^ s_te2[(t2 >> 8) & 0xff] ^ s_te3[t3 & 0xff] ^ rek[ 8]; + s1 = s_te0[t1 >> 24] ^ s_te1[(t2 >> 16) & 0xff] ^ s_te2[(t3 >> 8) & 0xff] ^ s_te3[t0 & 0xff] ^ rek[ 9]; + s2 = s_te0[t2 >> 24] ^ s_te1[(t3 >> 16) & 0xff] ^ s_te2[(t0 >> 8) & 0xff] ^ s_te3[t1 & 0xff] ^ rek[10]; + s3 = s_te0[t3 >> 24] ^ s_te1[(t0 >> 16) & 0xff] ^ s_te2[(t1 >> 8) & 0xff] ^ s_te3[t2 & 0xff] ^ rek[11]; + t0 = s_te0[s0 >> 24] ^ s_te1[(s1 >> 16) & 0xff] ^ s_te2[(s2 >> 8) & 0xff] ^ s_te3[s3 & 0xff] ^ rek[12]; + t1 = s_te0[s1 >> 24] ^ s_te1[(s2 >> 16) & 0xff] ^ s_te2[(s3 >> 8) & 0xff] ^ s_te3[s0 & 0xff] ^ rek[13]; + t2 = s_te0[s2 >> 24] ^ s_te1[(s3 >> 16) & 0xff] ^ s_te2[(s0 >> 8) & 0xff] ^ s_te3[s1 & 0xff] ^ rek[14]; + t3 = s_te0[s3 >> 24] ^ s_te1[(s0 >> 16) & 0xff] ^ s_te2[(s1 >> 8) & 0xff] ^ s_te3[s2 & 0xff] ^ rek[15]; + s0 = s_te0[t0 >> 24] ^ s_te1[(t1 >> 16) & 0xff] ^ s_te2[(t2 >> 8) & 0xff] ^ s_te3[t3 & 0xff] ^ rek[16]; + s1 = s_te0[t1 >> 24] ^ s_te1[(t2 >> 16) & 0xff] ^ s_te2[(t3 >> 8) & 0xff] ^ s_te3[t0 & 0xff] ^ rek[17]; + s2 = s_te0[t2 >> 24] ^ s_te1[(t3 >> 16) & 0xff] ^ s_te2[(t0 >> 8) & 0xff] ^ s_te3[t1 & 0xff] ^ rek[18]; + s3 = s_te0[t3 >> 24] ^ s_te1[(t0 >> 16) & 0xff] ^ s_te2[(t1 >> 8) & 0xff] ^ s_te3[t2 & 0xff] ^ rek[19]; + t0 = s_te0[s0 >> 24] ^ s_te1[(s1 >> 16) & 0xff] ^ s_te2[(s2 >> 8) & 0xff] ^ s_te3[s3 & 0xff] ^ rek[20]; + t1 = s_te0[s1 >> 24] ^ s_te1[(s2 >> 16) & 0xff] ^ s_te2[(s3 >> 8) & 0xff] ^ s_te3[s0 & 0xff] ^ rek[21]; + t2 = s_te0[s2 >> 24] ^ s_te1[(s3 >> 16) & 0xff] ^ s_te2[(s0 >> 8) & 0xff] ^ s_te3[s1 & 0xff] ^ rek[22]; + t3 = s_te0[s3 >> 24] ^ s_te1[(s0 >> 16) & 0xff] ^ s_te2[(s1 >> 8) & 0xff] ^ s_te3[s2 & 0xff] ^ rek[23]; + s0 = s_te0[t0 >> 24] ^ s_te1[(t1 >> 16) & 0xff] ^ s_te2[(t2 >> 8) & 0xff] ^ s_te3[t3 & 0xff] ^ rek[24]; + s1 = s_te0[t1 >> 24] ^ s_te1[(t2 >> 16) & 0xff] ^ s_te2[(t3 >> 8) & 0xff] ^ s_te3[t0 & 0xff] ^ rek[25]; + s2 = s_te0[t2 >> 24] ^ s_te1[(t3 >> 16) & 0xff] ^ s_te2[(t0 >> 8) & 0xff] ^ s_te3[t1 & 0xff] ^ rek[26]; + s3 = s_te0[t3 >> 24] ^ s_te1[(t0 >> 16) & 0xff] ^ s_te2[(t1 >> 8) & 0xff] ^ s_te3[t2 & 0xff] ^ rek[27]; + t0 = s_te0[s0 >> 24] ^ s_te1[(s1 >> 16) & 0xff] ^ s_te2[(s2 >> 8) & 0xff] ^ s_te3[s3 & 0xff] ^ rek[28]; + t1 = s_te0[s1 >> 24] ^ s_te1[(s2 >> 16) & 0xff] ^ s_te2[(s3 >> 8) & 0xff] ^ s_te3[s0 & 0xff] ^ rek[29]; + t2 = s_te0[s2 >> 24] ^ s_te1[(s3 >> 16) & 0xff] ^ s_te2[(s0 >> 8) & 0xff] ^ s_te3[s1 & 0xff] ^ rek[30]; + t3 = s_te0[s3 >> 24] ^ s_te1[(s0 >> 16) & 0xff] ^ s_te2[(s1 >> 8) & 0xff] ^ s_te3[s2 & 0xff] ^ rek[31]; + s0 = s_te0[t0 >> 24] ^ s_te1[(t1 >> 16) & 0xff] ^ s_te2[(t2 >> 8) & 0xff] ^ s_te3[t3 & 0xff] ^ rek[32]; + s1 = s_te0[t1 >> 24] ^ s_te1[(t2 >> 16) & 0xff] ^ s_te2[(t3 >> 8) & 0xff] ^ s_te3[t0 & 0xff] ^ rek[33]; + s2 = s_te0[t2 >> 24] ^ s_te1[(t3 >> 16) & 0xff] ^ s_te2[(t0 >> 8) & 0xff] ^ s_te3[t1 & 0xff] ^ rek[34]; + s3 = s_te0[t3 >> 24] ^ s_te1[(t0 >> 16) & 0xff] ^ s_te2[(t1 >> 8) & 0xff] ^ s_te3[t2 & 0xff] ^ rek[35]; + t0 = s_te0[s0 >> 24] ^ s_te1[(s1 >> 16) & 0xff] ^ s_te2[(s2 >> 8) & 0xff] ^ s_te3[s3 & 0xff] ^ rek[36]; + t1 = s_te0[s1 >> 24] ^ s_te1[(s2 >> 16) & 0xff] ^ s_te2[(s3 >> 8) & 0xff] ^ s_te3[s0 & 0xff] ^ rek[37]; + t2 = s_te0[s2 >> 24] ^ s_te1[(s3 >> 16) & 0xff] ^ s_te2[(s0 >> 8) & 0xff] ^ s_te3[s1 & 0xff] ^ rek[38]; + t3 = s_te0[s3 >> 24] ^ s_te1[(s0 >> 16) & 0xff] ^ s_te2[(s1 >> 8) & 0xff] ^ s_te3[s2 & 0xff] ^ rek[39]; + s0 = s_te0[t0 >> 24] ^ s_te1[(t1 >> 16) & 0xff] ^ s_te2[(t2 >> 8) & 0xff] ^ s_te3[t3 & 0xff] ^ rek[40]; + s1 = s_te0[t1 >> 24] ^ s_te1[(t2 >> 16) & 0xff] ^ s_te2[(t3 >> 8) & 0xff] ^ s_te3[t0 & 0xff] ^ rek[41]; + s2 = s_te0[t2 >> 24] ^ s_te1[(t3 >> 16) & 0xff] ^ s_te2[(t0 >> 8) & 0xff] ^ s_te3[t1 & 0xff] ^ rek[42]; + s3 = s_te0[t3 >> 24] ^ s_te1[(t0 >> 16) & 0xff] ^ s_te2[(t1 >> 8) & 0xff] ^ s_te3[t2 & 0xff] ^ rek[43]; + t0 = s_te0[s0 >> 24] ^ s_te1[(s1 >> 16) & 0xff] ^ s_te2[(s2 >> 8) & 0xff] ^ s_te3[s3 & 0xff] ^ rek[44]; + t1 = s_te0[s1 >> 24] ^ s_te1[(s2 >> 16) & 0xff] ^ s_te2[(s3 >> 8) & 0xff] ^ s_te3[s0 & 0xff] ^ rek[45]; + t2 = s_te0[s2 >> 24] ^ s_te1[(s3 >> 16) & 0xff] ^ s_te2[(s0 >> 8) & 0xff] ^ s_te3[s1 & 0xff] ^ rek[46]; + t3 = s_te0[s3 >> 24] ^ s_te1[(s0 >> 16) & 0xff] ^ s_te2[(s1 >> 8) & 0xff] ^ s_te3[s2 & 0xff] ^ rek[47]; + s0 = s_te0[t0 >> 24] ^ s_te1[(t1 >> 16) & 0xff] ^ s_te2[(t2 >> 8) & 0xff] ^ s_te3[t3 & 0xff] ^ rek[48]; + s1 = s_te0[t1 >> 24] ^ s_te1[(t2 >> 16) & 0xff] ^ s_te2[(t3 >> 8) & 0xff] ^ s_te3[t0 & 0xff] ^ rek[49]; + s2 = s_te0[t2 >> 24] ^ s_te1[(t3 >> 16) & 0xff] ^ s_te2[(t0 >> 8) & 0xff] ^ s_te3[t1 & 0xff] ^ rek[50]; + s3 = s_te0[t3 >> 24] ^ s_te1[(t0 >> 16) & 0xff] ^ s_te2[(t1 >> 8) & 0xff] ^ s_te3[t2 & 0xff] ^ rek[51]; + t0 = s_te0[s0 >> 24] ^ s_te1[(s1 >> 16) & 0xff] ^ s_te2[(s2 >> 8) & 0xff] ^ s_te3[s3 & 0xff] ^ rek[52]; + t1 = s_te0[s1 >> 24] ^ s_te1[(s2 >> 16) & 0xff] ^ s_te2[(s3 >> 8) & 0xff] ^ s_te3[s0 & 0xff] ^ rek[53]; + t2 = s_te0[s2 >> 24] ^ s_te1[(s3 >> 16) & 0xff] ^ s_te2[(s0 >> 8) & 0xff] ^ s_te3[s1 & 0xff] ^ rek[54]; + t3 = s_te0[s3 >> 24] ^ s_te1[(s0 >> 16) & 0xff] ^ s_te2[(s1 >> 8) & 0xff] ^ s_te3[s2 & 0xff] ^ rek[55]; + + out[0] = (s_te4[(t0 >> 24) & 0xff] & 0xff000000) + ^ (s_te4[(t1 >> 16) & 0xff] & 0x00ff0000) + ^ (s_te4[(t2 >> 8) & 0xff] & 0x0000ff00) + ^ (s_te4[(t3 >> 0) & 0xff] & 0x000000ff) + ^ rek[56]; + + out[1] = (s_te4[(t1 >> 24) & 0xff] & 0xff000000) + ^ (s_te4[(t2 >> 16) & 0xff] & 0x00ff0000) + ^ (s_te4[(t3 >> 8) & 0xff] & 0x0000ff00) + ^ (s_te4[(t0 >> 0) & 0xff] & 0x000000ff) + ^ rek[57]; + + out[2] = (s_te4[(t2 >> 24) & 0xff] & 0xff000000) + ^ (s_te4[(t3 >> 16) & 0xff] & 0x00ff0000) + ^ (s_te4[(t0 >> 8) & 0xff] & 0x0000ff00) + ^ (s_te4[(t1 >> 0) & 0xff] & 0x000000ff) + ^ rek[58]; + + out[3] = (s_te4[(t3 >> 24) & 0xff] & 0xff000000) + ^ (s_te4[(t0 >> 16) & 0xff] & 0x00ff0000) + ^ (s_te4[(t1 >> 8) & 0xff] & 0x0000ff00) + ^ (s_te4[(t2 >> 0) & 0xff] & 0x000000ff) + ^ rek[59]; +} + +__device__ __constant__ u64 k[80] = +{ + SHA512C00, SHA512C01, SHA512C02, SHA512C03, + SHA512C04, SHA512C05, SHA512C06, SHA512C07, + SHA512C08, SHA512C09, SHA512C0a, SHA512C0b, + SHA512C0c, SHA512C0d, SHA512C0e, SHA512C0f, + SHA512C10, SHA512C11, SHA512C12, SHA512C13, + SHA512C14, SHA512C15, SHA512C16, SHA512C17, + SHA512C18, SHA512C19, SHA512C1a, SHA512C1b, + SHA512C1c, SHA512C1d, SHA512C1e, SHA512C1f, + SHA512C20, SHA512C21, SHA512C22, SHA512C23, + SHA512C24, SHA512C25, SHA512C26, SHA512C27, + SHA512C28, SHA512C29, SHA512C2a, SHA512C2b, + SHA512C2c, SHA512C2d, SHA512C2e, SHA512C2f, + SHA512C30, SHA512C31, SHA512C32, SHA512C33, + SHA512C34, SHA512C35, SHA512C36, SHA512C37, + SHA512C38, SHA512C39, SHA512C3a, SHA512C3b, + SHA512C3c, SHA512C3d, SHA512C3e, SHA512C3f, + SHA512C40, SHA512C41, SHA512C42, SHA512C43, + SHA512C44, SHA512C45, SHA512C46, SHA512C47, + SHA512C48, SHA512C49, SHA512C4a, SHA512C4b, + SHA512C4c, SHA512C4d, SHA512C4e, SHA512C4f, +}; + +__device__ static void sha512_transform (const u64 w0[4], const u64 w1[4], const u64 w2[4], const u64 w3[4], u64 dgst[8]) +{ + u64 a = dgst[0]; + u64 b = dgst[1]; + u64 c = dgst[2]; + u64 d = dgst[3]; + u64 e = dgst[4]; + u64 f = dgst[5]; + u64 g = dgst[6]; + u64 h = dgst[7]; + + u64 w0_t = w0[0]; + u64 w1_t = w0[1]; + u64 w2_t = w0[2]; + u64 w3_t = w0[3]; + u64 w4_t = w1[0]; + u64 w5_t = w1[1]; + u64 w6_t = w1[2]; + u64 w7_t = w1[3]; + u64 w8_t = w2[0]; + u64 w9_t = w2[1]; + u64 wa_t = w2[2]; + u64 wb_t = w2[3]; + u64 wc_t = w3[0]; + u64 wd_t = w3[1]; + u64 we_t = w3[2]; + u64 wf_t = w3[3]; + + #define ROUND_EXPAND() \ + { \ + w0_t = SHA512_EXPAND (we_t, w9_t, w1_t, w0_t); \ + w1_t = SHA512_EXPAND (wf_t, wa_t, w2_t, w1_t); \ + w2_t = SHA512_EXPAND (w0_t, wb_t, w3_t, w2_t); \ + w3_t = SHA512_EXPAND (w1_t, wc_t, w4_t, w3_t); \ + w4_t = SHA512_EXPAND (w2_t, wd_t, w5_t, w4_t); \ + w5_t = SHA512_EXPAND (w3_t, we_t, w6_t, w5_t); \ + w6_t = SHA512_EXPAND (w4_t, wf_t, w7_t, w6_t); \ + w7_t = SHA512_EXPAND (w5_t, w0_t, w8_t, w7_t); \ + w8_t = SHA512_EXPAND (w6_t, w1_t, w9_t, w8_t); \ + w9_t = SHA512_EXPAND (w7_t, w2_t, wa_t, w9_t); \ + wa_t = SHA512_EXPAND (w8_t, w3_t, wb_t, wa_t); \ + wb_t = SHA512_EXPAND (w9_t, w4_t, wc_t, wb_t); \ + wc_t = SHA512_EXPAND (wa_t, w5_t, wd_t, wc_t); \ + wd_t = SHA512_EXPAND (wb_t, w6_t, we_t, wd_t); \ + we_t = SHA512_EXPAND (wc_t, w7_t, wf_t, we_t); \ + wf_t = SHA512_EXPAND (wd_t, w8_t, w0_t, wf_t); \ + } + + #define ROUND_STEP(i) \ + { \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, a, b, c, d, e, f, g, h, w0_t, k[i + 0]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, h, a, b, c, d, e, f, g, w1_t, k[i + 1]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, g, h, a, b, c, d, e, f, w2_t, k[i + 2]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, f, g, h, a, b, c, d, e, w3_t, k[i + 3]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, e, f, g, h, a, b, c, d, w4_t, k[i + 4]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, d, e, f, g, h, a, b, c, w5_t, k[i + 5]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, c, d, e, f, g, h, a, b, w6_t, k[i + 6]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, b, c, d, e, f, g, h, a, w7_t, k[i + 7]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, a, b, c, d, e, f, g, h, w8_t, k[i + 8]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, h, a, b, c, d, e, f, g, w9_t, k[i + 9]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, g, h, a, b, c, d, e, f, wa_t, k[i + 10]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, f, g, h, a, b, c, d, e, wb_t, k[i + 11]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, e, f, g, h, a, b, c, d, wc_t, k[i + 12]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, d, e, f, g, h, a, b, c, wd_t, k[i + 13]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, c, d, e, f, g, h, a, b, we_t, k[i + 14]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, b, c, d, e, f, g, h, a, wf_t, k[i + 15]); \ + } + + ROUND_STEP (0); + + for (int i = 16; i < 80; i += 16) + { + ROUND_EXPAND (); ROUND_STEP (i); + } + + dgst[0] += a; + dgst[1] += b; + dgst[2] += c; + dgst[3] += d; + dgst[4] += e; + dgst[5] += f; + dgst[6] += g; + dgst[7] += h; +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m09600_init (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, office2013_tmp_t *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const office2013_t *office2013_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = pws[gid].i[ 8]; + w2[1] = pws[gid].i[ 9]; + w2[2] = pws[gid].i[10]; + w2[3] = pws[gid].i[11]; + + u32x w3[4]; + + w3[0] = pws[gid].i[12]; + w3[1] = pws[gid].i[13]; + w3[2] = pws[gid].i[14]; + w3[3] = pws[gid].i[15]; + + u32 pw_len = pws[gid].pw_len; + + append_0x80_4 (w0, w1, w2, w3, pw_len); + + make_unicode (w1, w2, w3); + make_unicode (w0, w0, w1); + + /** + * salt + */ + + u32 salt_len = salt_bufs[salt_pos].salt_len; + + u32 salt_buf[4]; + + salt_buf[0] = salt_bufs[salt_pos].salt_buf[0]; + salt_buf[1] = salt_bufs[salt_pos].salt_buf[1]; + salt_buf[2] = salt_bufs[salt_pos].salt_buf[2]; + salt_buf[3] = salt_bufs[salt_pos].salt_buf[3]; + + /** + * init + */ + + u64x t0[4]; + + t0[0] = (u64) salt_buf[0] << 32 | salt_buf[1]; + t0[1] = (u64) salt_buf[2] << 32 | salt_buf[3]; + t0[2] = (u64) swap_workaround (w0[0]) << 32 | swap_workaround (w0[1]); + t0[3] = (u64) swap_workaround (w0[2]) << 32 | swap_workaround (w0[3]); + + u64x t1[4]; + + t1[0] = (u64) swap_workaround (w1[0]) << 32 | swap_workaround (w1[1]); + t1[1] = (u64) swap_workaround (w1[2]) << 32 | swap_workaround (w1[3]); + t1[2] = (u64) swap_workaround (w2[0]) << 32 | swap_workaround (w2[1]); + t1[3] = (u64) swap_workaround (w2[2]) << 32 | swap_workaround (w2[3]); + + u64x t2[4]; + + t2[0] = (u64) swap_workaround (w3[0]) << 32 | swap_workaround (w3[1]); + t2[1] = (u64) swap_workaround (w3[2]) << 32 | swap_workaround (w3[3]); + t2[2] = 0; + t2[3] = 0; + + u64x t3[4]; + + t3[0] = 0; + t3[1] = 0; + t3[2] = 0; + t3[3] = (salt_len + (pw_len * 2)) * 8; + + u64x digest[8]; + + digest[0] = SHA512M_A; + digest[1] = SHA512M_B; + digest[2] = SHA512M_C; + digest[3] = SHA512M_D; + digest[4] = SHA512M_E; + digest[5] = SHA512M_F; + digest[6] = SHA512M_G; + digest[7] = SHA512M_H; + + sha512_transform (t0, t1, t2, t3, digest); + + tmps[gid].out[0] = digest[0]; + tmps[gid].out[1] = digest[1]; + tmps[gid].out[2] = digest[2]; + tmps[gid].out[3] = digest[3]; + tmps[gid].out[4] = digest[4]; + tmps[gid].out[5] = digest[5]; + tmps[gid].out[6] = digest[6]; + tmps[gid].out[7] = digest[7]; +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m09600_loop (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, office2013_tmp_t *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const office2013_t *office2013_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u64x w0[4]; + + w0[0] = tmps[gid].out[0] >> 32; + w0[1] = tmps[gid].out[0] << 32 | tmps[gid].out[1] >> 32; + w0[2] = tmps[gid].out[1] << 32 | tmps[gid].out[2] >> 32; + w0[3] = tmps[gid].out[2] << 32 | tmps[gid].out[3] >> 32; + + u64x w1[4]; + + w1[0] = tmps[gid].out[3] << 32 | tmps[gid].out[4] >> 32; + w1[1] = tmps[gid].out[4] << 32 | tmps[gid].out[5] >> 32; + w1[2] = tmps[gid].out[5] << 32 | tmps[gid].out[6] >> 32; + w1[3] = tmps[gid].out[6] << 32 | tmps[gid].out[7] >> 32; + + u64x w2[4]; + + w2[0] = tmps[gid].out[7] << 32 | 0x80000000; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u64x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = (4 + 64) * 8; + + for (u32 i = 0, j = loop_pos; i < loop_cnt; i++, j++) + { + w0[0] = (u64) swap_workaround (j) << 32 | w0[0] & 0xffffffff; + + u64x digest[8]; + + digest[0] = SHA512M_A; + digest[1] = SHA512M_B; + digest[2] = SHA512M_C; + digest[3] = SHA512M_D; + digest[4] = SHA512M_E; + digest[5] = SHA512M_F; + digest[6] = SHA512M_G; + digest[7] = SHA512M_H; + + sha512_transform (w0, w1, w2, w3, digest); + + w0[0] = digest[0] >> 32; + w0[1] = digest[0] << 32 | digest[1] >> 32; + w0[2] = digest[1] << 32 | digest[2] >> 32; + w0[3] = digest[2] << 32 | digest[3] >> 32; + w1[0] = digest[3] << 32 | digest[4] >> 32; + w1[1] = digest[4] << 32 | digest[5] >> 32; + w1[2] = digest[5] << 32 | digest[6] >> 32; + w1[3] = digest[6] << 32 | digest[7] >> 32; + w2[0] = digest[7] << 32 | 0x80000000; + } + + tmps[gid].out[0] = w0[0] << 32 | w0[1] >> 32; + tmps[gid].out[1] = w0[1] << 32 | w0[2] >> 32; + tmps[gid].out[2] = w0[2] << 32 | w0[3] >> 32; + tmps[gid].out[3] = w0[3] << 32 | w1[0] >> 32; + tmps[gid].out[4] = w1[0] << 32 | w1[1] >> 32; + tmps[gid].out[5] = w1[1] << 32 | w1[2] >> 32; + tmps[gid].out[6] = w1[2] << 32 | w1[3] >> 32; + tmps[gid].out[7] = w1[3] << 32 | w2[0] >> 32; +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m09600_comp (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, office2013_tmp_t *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const office2013_t *office2013_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + const u32 lid = threadIdx.x; + + /** + * aes shared + */ + + __shared__ u32 s_td0[256]; + __shared__ u32 s_td1[256]; + __shared__ u32 s_td2[256]; + __shared__ u32 s_td3[256]; + __shared__ u32 s_td4[256]; + + __shared__ u32 s_te0[256]; + __shared__ u32 s_te1[256]; + __shared__ u32 s_te2[256]; + __shared__ u32 s_te3[256]; + __shared__ u32 s_te4[256]; + + s_td0[lid] = td0[lid]; + s_td1[lid] = td1[lid]; + s_td2[lid] = td2[lid]; + s_td3[lid] = td3[lid]; + s_td4[lid] = td4[lid]; + + s_te0[lid] = te0[lid]; + s_te1[lid] = te1[lid]; + s_te2[lid] = te2[lid]; + s_te3[lid] = te3[lid]; + s_te4[lid] = te4[lid]; + + __syncthreads (); + + if (gid >= gid_max) return; + + u32x encryptedVerifierHashInputBlockKey[2] = { 0xfea7d276, 0x3b4b9e79 }; + u32x encryptedVerifierHashValueBlockKey[2] = { 0xd7aa0f6d, 0x3061344e }; + + u64x w0[4]; + u64x w1[4]; + u64x w2[4]; + u64x w3[4]; + + w0[0] = tmps[gid].out[0]; + w0[1] = tmps[gid].out[1]; + w0[2] = tmps[gid].out[2]; + w0[3] = tmps[gid].out[3]; + w1[0] = tmps[gid].out[4]; + w1[1] = tmps[gid].out[5]; + w1[2] = tmps[gid].out[6]; + w1[3] = tmps[gid].out[7]; + w2[0] = hl32_to_64 (encryptedVerifierHashInputBlockKey[0], encryptedVerifierHashInputBlockKey[1]); + w2[1] = 0x8000000000000000; + w2[2] = 0; + w2[3] = 0; + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = (64 + 8) * 8; + + u64x digest0[8]; + + digest0[0] = SHA512M_A; + digest0[1] = SHA512M_B; + digest0[2] = SHA512M_C; + digest0[3] = SHA512M_D; + digest0[4] = SHA512M_E; + digest0[5] = SHA512M_F; + digest0[6] = SHA512M_G; + digest0[7] = SHA512M_H; + + sha512_transform (w0, w1, w2, w3, digest0); + + w0[0] = tmps[gid].out[0]; + w0[1] = tmps[gid].out[1]; + w0[2] = tmps[gid].out[2]; + w0[3] = tmps[gid].out[3]; + w1[0] = tmps[gid].out[4]; + w1[1] = tmps[gid].out[5]; + w1[2] = tmps[gid].out[6]; + w1[3] = tmps[gid].out[7]; + w2[0] = hl32_to_64 (encryptedVerifierHashValueBlockKey[0], encryptedVerifierHashValueBlockKey[1]); + w2[1] = 0x8000000000000000; + w2[2] = 0; + w2[3] = 0; + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = (64 + 8) * 8; + + u64x digest1[8]; + + digest1[0] = SHA512M_A; + digest1[1] = SHA512M_B; + digest1[2] = SHA512M_C; + digest1[3] = SHA512M_D; + digest1[4] = SHA512M_E; + digest1[5] = SHA512M_F; + digest1[6] = SHA512M_G; + digest1[7] = SHA512M_H; + + sha512_transform (w0, w1, w2, w3, digest1); + + // now we got the AES key, decrypt the verifier + + u32x rek[60]; + u32x rdk[60]; + + u32 data[4]; + + data[0] = office2013_bufs[salt_pos].encryptedVerifier[0]; + data[1] = office2013_bufs[salt_pos].encryptedVerifier[1]; + data[2] = office2013_bufs[salt_pos].encryptedVerifier[2]; + data[3] = office2013_bufs[salt_pos].encryptedVerifier[3]; + + u32x ukeyx[8]; + + ukeyx[0] = h32_from_64 (digest0[0]); + ukeyx[1] = l32_from_64 (digest0[0]); + ukeyx[2] = h32_from_64 (digest0[1]); + ukeyx[3] = l32_from_64 (digest0[1]); + ukeyx[4] = h32_from_64 (digest0[2]); + ukeyx[5] = l32_from_64 (digest0[2]); + ukeyx[6] = h32_from_64 (digest0[3]); + ukeyx[7] = l32_from_64 (digest0[3]); + + AES256_ExpandKey (ukeyx, rek, s_te0, s_te1, s_te2, s_te3, s_te4); + + for (u32 i = 0; i < 60; i++) rdk[i] = rek[i]; + + AES256_InvertKey (rdk, s_td0, s_td1, s_td2, s_td3, s_td4, s_te0, s_te1, s_te2, s_te3, s_te4); + + u32 out[4]; + + AES256_decrypt (data, out, rdk, s_td0, s_td1, s_td2, s_td3, s_td4); + + out[0] ^= salt_bufs[salt_pos].salt_buf[0]; + out[1] ^= salt_bufs[salt_pos].salt_buf[1]; + out[2] ^= salt_bufs[salt_pos].salt_buf[2]; + out[3] ^= salt_bufs[salt_pos].salt_buf[3]; + + // final sha512 + + w0[0] = hl32_to_64 (out[0], out[1]); + w0[1] = hl32_to_64 (out[2], out[3]); + w0[2] = 0x8000000000000000; + w0[3] = 0; + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 16 * 8; + + u64x digest[8]; + + digest[0] = SHA512M_A; + digest[1] = SHA512M_B; + digest[2] = SHA512M_C; + digest[3] = SHA512M_D; + digest[4] = SHA512M_E; + digest[5] = SHA512M_F; + digest[6] = SHA512M_G; + digest[7] = SHA512M_H; + + sha512_transform (w0, w1, w2, w3, digest); + + // encrypt with 2nd key + + ukeyx[0] = h32_from_64 (digest1[0]); + ukeyx[1] = l32_from_64 (digest1[0]); + ukeyx[2] = h32_from_64 (digest1[1]); + ukeyx[3] = l32_from_64 (digest1[1]); + ukeyx[4] = h32_from_64 (digest1[2]); + ukeyx[5] = l32_from_64 (digest1[2]); + ukeyx[6] = h32_from_64 (digest1[3]); + ukeyx[7] = l32_from_64 (digest1[3]); + + AES256_ExpandKey (ukeyx, rek, s_te0, s_te1, s_te2, s_te3, s_te4); + + data[0] = h32_from_64 (digest[0]) ^ salt_bufs[salt_pos].salt_buf[0]; + data[1] = l32_from_64 (digest[0]) ^ salt_bufs[salt_pos].salt_buf[1]; + data[2] = h32_from_64 (digest[1]) ^ salt_bufs[salt_pos].salt_buf[2]; + data[3] = l32_from_64 (digest[1]) ^ salt_bufs[salt_pos].salt_buf[3]; + + AES256_encrypt (data, out, rek, s_te0, s_te1, s_te2, s_te3, s_te4); + + const u32x r0 = out[0]; + const u32x r1 = out[1]; + const u32x r2 = out[2]; + const u32x r3 = out[3]; + + #define il_pos 0 + + #include VECT_COMPARE_M +} diff --git a/nv/m09700_a0.cu b/nv/m09700_a0.cu new file mode 100644 index 0000000000..6cc738f541 --- /dev/null +++ b/nv/m09700_a0.cu @@ -0,0 +1,1047 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _OLDOFFICE01_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW2 +#define VECT_SIZE1 +#endif + +#define DGST_R0 0 +#define DGST_R1 1 +#define DGST_R2 2 +#define DGST_R3 3 + +#include "include/kernel_functions.c" +#include "types_nv.c" +#include "common_nv.c" +#include "include/rp_gpu.h" +#include "rp_nv.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +typedef struct +{ + u8 S[256]; + + u32 wtf_its_faster; + +} RC4_KEY; + +__device__ static void swap (RC4_KEY *rc4_key, const u8 i, const u8 j) +{ + u8 tmp; + + tmp = rc4_key->S[i]; + rc4_key->S[i] = rc4_key->S[j]; + rc4_key->S[j] = tmp; +} + +__device__ static void rc4_init_16 (RC4_KEY *rc4_key, const u32 data[4]) +{ + u32 v = 0x03020100; + u32 a = 0x04040404; + + u32 *ptr = (u32 *) rc4_key->S; + + #pragma unroll 64 + for (u32 i = 0; i < 64; i++) + { + *ptr++ = v; v += a; + } + + u32 j = 0; + + for (u32 i = 0; i < 16; i++) + { + u32 idx = i * 16; + + u32 v; + + v = data[0]; + + j += rc4_key->S[idx] + (v >> 0); swap (rc4_key, idx, j); idx++; + j += rc4_key->S[idx] + (v >> 8); swap (rc4_key, idx, j); idx++; + j += rc4_key->S[idx] + (v >> 16); swap (rc4_key, idx, j); idx++; + j += rc4_key->S[idx] + (v >> 24); swap (rc4_key, idx, j); idx++; + + v = data[1]; + + j += rc4_key->S[idx] + (v >> 0); swap (rc4_key, idx, j); idx++; + j += rc4_key->S[idx] + (v >> 8); swap (rc4_key, idx, j); idx++; + j += rc4_key->S[idx] + (v >> 16); swap (rc4_key, idx, j); idx++; + j += rc4_key->S[idx] + (v >> 24); swap (rc4_key, idx, j); idx++; + + v = data[2]; + + j += rc4_key->S[idx] + (v >> 0); swap (rc4_key, idx, j); idx++; + j += rc4_key->S[idx] + (v >> 8); swap (rc4_key, idx, j); idx++; + j += rc4_key->S[idx] + (v >> 16); swap (rc4_key, idx, j); idx++; + j += rc4_key->S[idx] + (v >> 24); swap (rc4_key, idx, j); idx++; + + v = data[3]; + + j += rc4_key->S[idx] + (v >> 0); swap (rc4_key, idx, j); idx++; + j += rc4_key->S[idx] + (v >> 8); swap (rc4_key, idx, j); idx++; + j += rc4_key->S[idx] + (v >> 16); swap (rc4_key, idx, j); idx++; + j += rc4_key->S[idx] + (v >> 24); swap (rc4_key, idx, j); idx++; + } +} + +__device__ static u8 rc4_next_16 (RC4_KEY *rc4_key, u8 i, u8 j, const u32 in[4], u32 out[4]) +{ + for (u32 k = 0; k < 4; k++) + { + u32 xor4 = 0; + + u8 idx; + + i += 1; + j += rc4_key->S[i]; + + swap (rc4_key, i, j); + + idx = rc4_key->S[i] + rc4_key->S[j]; + + xor4 |= rc4_key->S[idx] << 0; + + i += 1; + j += rc4_key->S[i]; + + swap (rc4_key, i, j); + + idx = rc4_key->S[i] + rc4_key->S[j]; + + xor4 |= rc4_key->S[idx] << 8; + + i += 1; + j += rc4_key->S[i]; + + swap (rc4_key, i, j); + + idx = rc4_key->S[i] + rc4_key->S[j]; + + xor4 |= rc4_key->S[idx] << 16; + + i += 1; + j += rc4_key->S[i]; + + swap (rc4_key, i, j); + + idx = rc4_key->S[i] + rc4_key->S[j]; + + xor4 |= rc4_key->S[idx] << 24; + + out[k] = in[k] ^ xor4; + } + + return j; +} + +__device__ static void md5_transform (const u32x w0[4], const u32x w1[4], const u32x w2[4], const u32x w3[4], u32x digest[4]) +{ + u32x a = digest[0]; + u32x b = digest[1]; + u32x c = digest[2]; + u32x d = digest[3]; + + u32x w0_t = w0[0]; + u32x w1_t = w0[1]; + u32x w2_t = w0[2]; + u32x w3_t = w0[3]; + u32x w4_t = w1[0]; + u32x w5_t = w1[1]; + u32x w6_t = w1[2]; + u32x w7_t = w1[3]; + u32x w8_t = w2[0]; + u32x w9_t = w2[1]; + u32x wa_t = w2[2]; + u32x wb_t = w2[3]; + u32x wc_t = w3[0]; + u32x wd_t = w3[1]; + u32x we_t = w3[2]; + u32x wf_t = w3[3]; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t, MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t, MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t, MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t, MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w4_t, MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w5_t, MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w6_t, MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w7_t, MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w8_t, MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w9_t, MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, wa_t, MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, wb_t, MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, wc_t, MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, wd_t, MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, we_t, MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, wf_t, MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w1_t, MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w6_t, MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, wb_t, MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t, MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w5_t, MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, wa_t, MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, wf_t, MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w4_t, MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w9_t, MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, we_t, MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t, MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w8_t, MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, wd_t, MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t, MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w7_t, MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, wc_t, MD5C1f, MD5S13); + + MD5_STEP (MD5_H , a, b, c, d, w5_t, MD5C20, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w8_t, MD5C21, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, wb_t, MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, we_t, MD5C23, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w1_t, MD5C24, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w4_t, MD5C25, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w7_t, MD5C26, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, wa_t, MD5C27, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, wd_t, MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w0_t, MD5C29, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w3_t, MD5C2a, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w6_t, MD5C2b, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w9_t, MD5C2c, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, wc_t, MD5C2d, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, wf_t, MD5C2e, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w2_t, MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t, MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w7_t, MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, we_t, MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w5_t, MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, wc_t, MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t, MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, wa_t, MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t, MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w8_t, MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, wf_t, MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w6_t, MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, wd_t, MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w4_t, MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, wb_t, MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t, MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w9_t, MD5C3f, MD5S33); + + digest[0] += a; + digest[1] += b; + digest[2] += c; + digest[3] += d; +} + +__device__ static void gen336 (u32x digest_pre[4], u32 salt_buf[4], u32x digest[4]) +{ + u32x digest_t0[2]; + u32x digest_t1[2]; + u32x digest_t2[2]; + u32x digest_t3[2]; + + digest_t0[0] = digest_pre[0]; + digest_t0[1] = digest_pre[1] & 0xff; + + digest_t1[0] = digest_pre[0] << 8; + digest_t1[1] = digest_pre[0] >> 24 | digest_pre[1] << 8; + + digest_t2[0] = digest_pre[0] << 16; + digest_t2[1] = digest_pre[0] >> 16 | digest_pre[1] << 16; + + digest_t3[0] = digest_pre[0] << 24; + digest_t3[1] = digest_pre[0] >> 8 | digest_pre[1] << 24; + + u32 salt_buf_t0[4]; + u32 salt_buf_t1[5]; + u32 salt_buf_t2[5]; + u32 salt_buf_t3[5]; + + salt_buf_t0[0] = salt_buf[0]; + salt_buf_t0[1] = salt_buf[1]; + salt_buf_t0[2] = salt_buf[2]; + salt_buf_t0[3] = salt_buf[3]; + + salt_buf_t1[0] = salt_buf[0] << 8; + salt_buf_t1[1] = salt_buf[0] >> 24 | salt_buf[1] << 8; + salt_buf_t1[2] = salt_buf[1] >> 24 | salt_buf[2] << 8; + salt_buf_t1[3] = salt_buf[2] >> 24 | salt_buf[3] << 8; + salt_buf_t1[4] = salt_buf[3] >> 24; + + salt_buf_t2[0] = salt_buf[0] << 16; + salt_buf_t2[1] = salt_buf[0] >> 16 | salt_buf[1] << 16; + salt_buf_t2[2] = salt_buf[1] >> 16 | salt_buf[2] << 16; + salt_buf_t2[3] = salt_buf[2] >> 16 | salt_buf[3] << 16; + salt_buf_t2[4] = salt_buf[3] >> 16; + + salt_buf_t3[0] = salt_buf[0] << 24; + salt_buf_t3[1] = salt_buf[0] >> 8 | salt_buf[1] << 24; + salt_buf_t3[2] = salt_buf[1] >> 8 | salt_buf[2] << 24; + salt_buf_t3[3] = salt_buf[2] >> 8 | salt_buf[3] << 24; + salt_buf_t3[4] = salt_buf[3] >> 8; + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + // generate the 16 * 21 buffer + + w0_t[0] = 0; + w0_t[1] = 0; + w0_t[2] = 0; + w0_t[3] = 0; + w1_t[0] = 0; + w1_t[1] = 0; + w1_t[2] = 0; + w1_t[3] = 0; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = 0; + + // 0..5 + w0_t[0] = digest_t0[0]; + w0_t[1] = digest_t0[1]; + + // 5..21 + w0_t[1] |= salt_buf_t1[0]; + w0_t[2] = salt_buf_t1[1]; + w0_t[3] = salt_buf_t1[2]; + w1_t[0] = salt_buf_t1[3]; + w1_t[1] = salt_buf_t1[4]; + + // 21..26 + w1_t[1] |= digest_t1[0]; + w1_t[2] = digest_t1[1]; + + // 26..42 + w1_t[2] |= salt_buf_t2[0]; + w1_t[3] = salt_buf_t2[1]; + w2_t[0] = salt_buf_t2[2]; + w2_t[1] = salt_buf_t2[3]; + w2_t[2] = salt_buf_t2[4]; + + // 42..47 + w2_t[2] |= digest_t2[0]; + w2_t[3] = digest_t2[1]; + + // 47..63 + w2_t[3] |= salt_buf_t3[0]; + w3_t[0] = salt_buf_t3[1]; + w3_t[1] = salt_buf_t3[2]; + w3_t[2] = salt_buf_t3[3]; + w3_t[3] = salt_buf_t3[4]; + + // 63.. + + w3_t[3] |= digest_t3[0]; + + md5_transform (w0_t, w1_t, w2_t, w3_t, digest); + + w0_t[0] = 0; + w0_t[1] = 0; + w0_t[2] = 0; + w0_t[3] = 0; + w1_t[0] = 0; + w1_t[1] = 0; + w1_t[2] = 0; + w1_t[3] = 0; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = 0; + + // 0..4 + w0_t[0] = digest_t3[1]; + + // 4..20 + w0_t[1] = salt_buf_t0[0]; + w0_t[2] = salt_buf_t0[1]; + w0_t[3] = salt_buf_t0[2]; + w1_t[0] = salt_buf_t0[3]; + + // 20..25 + w1_t[1] = digest_t0[0]; + w1_t[2] = digest_t0[1]; + + // 25..41 + w1_t[2] |= salt_buf_t1[0]; + w1_t[3] = salt_buf_t1[1]; + w2_t[0] = salt_buf_t1[2]; + w2_t[1] = salt_buf_t1[3]; + w2_t[2] = salt_buf_t1[4]; + + // 41..46 + w2_t[2] |= digest_t1[0]; + w2_t[3] = digest_t1[1]; + + // 46..62 + w2_t[3] |= salt_buf_t2[0]; + w3_t[0] = salt_buf_t2[1]; + w3_t[1] = salt_buf_t2[2]; + w3_t[2] = salt_buf_t2[3]; + w3_t[3] = salt_buf_t2[4]; + + // 62.. + w3_t[3] |= digest_t2[0]; + + md5_transform (w0_t, w1_t, w2_t, w3_t, digest); + + w0_t[0] = 0; + w0_t[1] = 0; + w0_t[2] = 0; + w0_t[3] = 0; + w1_t[0] = 0; + w1_t[1] = 0; + w1_t[2] = 0; + w1_t[3] = 0; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = 0; + + // 0..3 + w0_t[0] = digest_t2[1]; + + // 3..19 + w0_t[0] |= salt_buf_t3[0]; + w0_t[1] = salt_buf_t3[1]; + w0_t[2] = salt_buf_t3[2]; + w0_t[3] = salt_buf_t3[3]; + w1_t[0] = salt_buf_t3[4]; + + // 19..24 + w1_t[0] |= digest_t3[0]; + w1_t[1] = digest_t3[1]; + + // 24..40 + w1_t[2] = salt_buf_t0[0]; + w1_t[3] = salt_buf_t0[1]; + w2_t[0] = salt_buf_t0[2]; + w2_t[1] = salt_buf_t0[3]; + + // 40..45 + w2_t[2] = digest_t0[0]; + w2_t[3] = digest_t0[1]; + + // 45..61 + w2_t[3] |= salt_buf_t1[0]; + w3_t[0] = salt_buf_t1[1]; + w3_t[1] = salt_buf_t1[2]; + w3_t[2] = salt_buf_t1[3]; + w3_t[3] = salt_buf_t1[4]; + + // 61.. + w3_t[3] |= digest_t1[0]; + + md5_transform (w0_t, w1_t, w2_t, w3_t, digest); + + w0_t[0] = 0; + w0_t[1] = 0; + w0_t[2] = 0; + w0_t[3] = 0; + w1_t[0] = 0; + w1_t[1] = 0; + w1_t[2] = 0; + w1_t[3] = 0; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = 0; + + // 0..2 + w0_t[0] = digest_t1[1]; + + // 2..18 + w0_t[0] |= salt_buf_t2[0]; + w0_t[1] = salt_buf_t2[1]; + w0_t[2] = salt_buf_t2[2]; + w0_t[3] = salt_buf_t2[3]; + w1_t[0] = salt_buf_t2[4]; + + // 18..23 + w1_t[0] |= digest_t2[0]; + w1_t[1] = digest_t2[1]; + + // 23..39 + w1_t[1] |= salt_buf_t3[0]; + w1_t[2] = salt_buf_t3[1]; + w1_t[3] = salt_buf_t3[2]; + w2_t[0] = salt_buf_t3[3]; + w2_t[1] = salt_buf_t3[4]; + + // 39..44 + w2_t[1] |= digest_t3[0]; + w2_t[2] = digest_t3[1]; + + // 44..60 + w2_t[3] = salt_buf_t0[0]; + w3_t[0] = salt_buf_t0[1]; + w3_t[1] = salt_buf_t0[2]; + w3_t[2] = salt_buf_t0[3]; + + // 60.. + w3_t[3] = digest_t0[0]; + + md5_transform (w0_t, w1_t, w2_t, w3_t, digest); + + w0_t[0] = 0; + w0_t[1] = 0; + w0_t[2] = 0; + w0_t[3] = 0; + w1_t[0] = 0; + w1_t[1] = 0; + w1_t[2] = 0; + w1_t[3] = 0; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = 0; + + // 0..1 + w0_t[0] = digest_t0[1]; + + // 1..17 + w0_t[0] |= salt_buf_t1[0]; + w0_t[1] = salt_buf_t1[1]; + w0_t[2] = salt_buf_t1[2]; + w0_t[3] = salt_buf_t1[3]; + w1_t[0] = salt_buf_t1[4]; + + // 17..22 + w1_t[0] |= digest_t1[0]; + w1_t[1] = digest_t1[1]; + + // 22..38 + w1_t[1] |= salt_buf_t2[0]; + w1_t[2] = salt_buf_t2[1]; + w1_t[3] = salt_buf_t2[2]; + w2_t[0] = salt_buf_t2[3]; + w2_t[1] = salt_buf_t2[4]; + + // 38..43 + w2_t[1] |= digest_t2[0]; + w2_t[2] = digest_t2[1]; + + // 43..59 + w2_t[2] |= salt_buf_t3[0]; + w2_t[3] = salt_buf_t3[1]; + w3_t[0] = salt_buf_t3[2]; + w3_t[1] = salt_buf_t3[3]; + w3_t[2] = salt_buf_t3[4]; + + // 59.. + w3_t[2] |= digest_t3[0]; + w3_t[3] = digest_t3[1]; + + md5_transform (w0_t, w1_t, w2_t, w3_t, digest); + + w0_t[0] = salt_buf_t0[0]; + w0_t[1] = salt_buf_t0[1]; + w0_t[2] = salt_buf_t0[2]; + w0_t[3] = salt_buf_t0[3]; + w1_t[0] = 0x80; + w1_t[1] = 0; + w1_t[2] = 0; + w1_t[3] = 0; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 21 * 16 * 8; + w3_t[3] = 0; + + md5_transform (w0_t, w1_t, w2_t, w3_t, digest); +} + +__device__ __constant__ gpu_rule_t c_rules[1024]; + +extern "C" __global__ void __launch_bounds__ (64, 1) m09700_m04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const oldoffice01_t *oldoffice01_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + __shared__ RC4_KEY rc4_keys[64]; + + RC4_KEY *rc4_key = &rc4_keys[lid]; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + u32x pw_buf1[4]; + + pw_buf1[0] = pws[gid].i[ 4]; + pw_buf1[1] = pws[gid].i[ 5]; + pw_buf1[2] = pws[gid].i[ 6]; + pw_buf1[3] = pws[gid].i[ 7]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * salt + */ + + u32 salt_buf[4]; + + salt_buf[0] = salt_bufs[salt_pos].salt_buf[0]; + salt_buf[1] = salt_bufs[salt_pos].salt_buf[1]; + salt_buf[2] = salt_bufs[salt_pos].salt_buf[2]; + salt_buf[3] = salt_bufs[salt_pos].salt_buf[3]; + + /** + * esalt + */ + + const u32 version = oldoffice01_bufs[salt_pos].version; + + u32 encryptedVerifier[4]; + + encryptedVerifier[0] = oldoffice01_bufs[salt_pos].encryptedVerifier[0]; + encryptedVerifier[1] = oldoffice01_bufs[salt_pos].encryptedVerifier[1]; + encryptedVerifier[2] = oldoffice01_bufs[salt_pos].encryptedVerifier[2]; + encryptedVerifier[3] = oldoffice01_bufs[salt_pos].encryptedVerifier[3]; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + + w0[0] = pw_buf0[0]; + w0[1] = pw_buf0[1]; + w0[2] = pw_buf0[2]; + w0[3] = pw_buf0[3]; + + u32x w1[4]; + + w1[0] = pw_buf1[0]; + w1[1] = pw_buf1[1]; + w1[2] = pw_buf1[2]; + w1[3] = pw_buf1[3]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 out_len = apply_rules (c_rules[il_pos].cmds, w0, w1, pw_len); + + append_0x80_2 (w0, w1, out_len); + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + make_unicode (w0, w0_t, w1_t); + make_unicode (w1, w2_t, w3_t); + + w3_t[2] = out_len * 8 * 2; + + u32x digest_pre[4]; + + digest_pre[0] = MD5M_A; + digest_pre[1] = MD5M_B; + digest_pre[2] = MD5M_C; + digest_pre[3] = MD5M_D; + + md5_transform (w0_t, w1_t, w2_t, w3_t, digest_pre); + + digest_pre[0] &= 0xffffffff; + digest_pre[1] &= 0x000000ff; + digest_pre[2] &= 0x00000000; + digest_pre[3] &= 0x00000000; + + u32x digest[4]; + + digest[0] = MD5M_A; + digest[1] = MD5M_B; + digest[2] = MD5M_C; + digest[3] = MD5M_D; + + gen336 (digest_pre, salt_buf, digest); + + // now the 40 bit input for the MD5 which then will generate the RC4 key, so it's precomputable! + + w0_t[0] = digest[0]; + w0_t[1] = digest[1] & 0xff; + w0_t[2] = 0x8000; + w0_t[3] = 0; + w1_t[0] = 0; + w1_t[1] = 0; + w1_t[2] = 0; + w1_t[3] = 0; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 9 * 8; + w3_t[3] = 0; + + digest[0] = MD5M_A; + digest[1] = MD5M_B; + digest[2] = MD5M_C; + digest[3] = MD5M_D; + + md5_transform (w0_t, w1_t, w2_t, w3_t, digest); + + // now the RC4 part + + u32x key[4]; + + key[0] = digest[0]; + key[1] = digest[1]; + key[2] = digest[2]; + key[3] = digest[3]; + + rc4_init_16 (rc4_key, key); + + u32x out[4]; + + u8 j = rc4_next_16 (rc4_key, 0, 0, encryptedVerifier, out); + + w0_t[0] = out[0]; + w0_t[1] = out[1]; + w0_t[2] = out[2]; + w0_t[3] = out[3]; + w1_t[0] = 0x80; + w1_t[1] = 0; + w1_t[2] = 0; + w1_t[3] = 0; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 16 * 8; + w3_t[3] = 0; + + digest[0] = MD5M_A; + digest[1] = MD5M_B; + digest[2] = MD5M_C; + digest[3] = MD5M_D; + + md5_transform (w0_t, w1_t, w2_t, w3_t, digest); + + rc4_next_16 (rc4_key, 16, j, digest, out); + + const u32x r0 = out[0]; + const u32x r1 = out[1]; + const u32x r2 = out[2]; + const u32x r3 = out[3]; + + #include VECT_COMPARE_M + } +} + +extern "C" __global__ void __launch_bounds__ (64, 1) m09700_m08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const oldoffice01_t *oldoffice01_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (64, 1) m09700_m16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const oldoffice01_t *oldoffice01_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (64, 1) m09700_s04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const oldoffice01_t *oldoffice01_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + __shared__ RC4_KEY rc4_keys[64]; + + RC4_KEY *rc4_key = &rc4_keys[lid]; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + u32x pw_buf1[4]; + + pw_buf1[0] = pws[gid].i[ 4]; + pw_buf1[1] = pws[gid].i[ 5]; + pw_buf1[2] = pws[gid].i[ 6]; + pw_buf1[3] = pws[gid].i[ 7]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * salt + */ + + u32 salt_buf[4]; + + salt_buf[0] = salt_bufs[salt_pos].salt_buf[0]; + salt_buf[1] = salt_bufs[salt_pos].salt_buf[1]; + salt_buf[2] = salt_bufs[salt_pos].salt_buf[2]; + salt_buf[3] = salt_bufs[salt_pos].salt_buf[3]; + + /** + * esalt + */ + + const u32 version = oldoffice01_bufs[salt_pos].version; + + u32 encryptedVerifier[4]; + + encryptedVerifier[0] = oldoffice01_bufs[salt_pos].encryptedVerifier[0]; + encryptedVerifier[1] = oldoffice01_bufs[salt_pos].encryptedVerifier[1]; + encryptedVerifier[2] = oldoffice01_bufs[salt_pos].encryptedVerifier[2]; + encryptedVerifier[3] = oldoffice01_bufs[salt_pos].encryptedVerifier[3]; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + + w0[0] = pw_buf0[0]; + w0[1] = pw_buf0[1]; + w0[2] = pw_buf0[2]; + w0[3] = pw_buf0[3]; + + u32x w1[4]; + + w1[0] = pw_buf1[0]; + w1[1] = pw_buf1[1]; + w1[2] = pw_buf1[2]; + w1[3] = pw_buf1[3]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 out_len = apply_rules (c_rules[il_pos].cmds, w0, w1, pw_len); + + append_0x80_2 (w0, w1, out_len); + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + make_unicode (w0, w0_t, w1_t); + make_unicode (w1, w2_t, w3_t); + + w3_t[2] = out_len * 8 * 2; + + u32x digest_pre[4]; + + digest_pre[0] = MD5M_A; + digest_pre[1] = MD5M_B; + digest_pre[2] = MD5M_C; + digest_pre[3] = MD5M_D; + + md5_transform (w0_t, w1_t, w2_t, w3_t, digest_pre); + + digest_pre[0] &= 0xffffffff; + digest_pre[1] &= 0x000000ff; + digest_pre[2] &= 0x00000000; + digest_pre[3] &= 0x00000000; + + u32x digest[4]; + + digest[0] = MD5M_A; + digest[1] = MD5M_B; + digest[2] = MD5M_C; + digest[3] = MD5M_D; + + gen336 (digest_pre, salt_buf, digest); + + // now the 40 bit input for the MD5 which then will generate the RC4 key, so it's precomputable! + + w0_t[0] = digest[0]; + w0_t[1] = digest[1] & 0xff; + w0_t[2] = 0x8000; + w0_t[3] = 0; + w1_t[0] = 0; + w1_t[1] = 0; + w1_t[2] = 0; + w1_t[3] = 0; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 9 * 8; + w3_t[3] = 0; + + digest[0] = MD5M_A; + digest[1] = MD5M_B; + digest[2] = MD5M_C; + digest[3] = MD5M_D; + + md5_transform (w0_t, w1_t, w2_t, w3_t, digest); + + // now the RC4 part + + u32x key[4]; + + key[0] = digest[0]; + key[1] = digest[1]; + key[2] = digest[2]; + key[3] = digest[3]; + + rc4_init_16 (rc4_key, key); + + u32x out[4]; + + u8 j = rc4_next_16 (rc4_key, 0, 0, encryptedVerifier, out); + + w0_t[0] = out[0]; + w0_t[1] = out[1]; + w0_t[2] = out[2]; + w0_t[3] = out[3]; + w1_t[0] = 0x80; + w1_t[1] = 0; + w1_t[2] = 0; + w1_t[3] = 0; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 16 * 8; + w3_t[3] = 0; + + digest[0] = MD5M_A; + digest[1] = MD5M_B; + digest[2] = MD5M_C; + digest[3] = MD5M_D; + + md5_transform (w0_t, w1_t, w2_t, w3_t, digest); + + rc4_next_16 (rc4_key, 16, j, digest, out); + + const u32x r0 = out[0]; + const u32x r1 = out[1]; + const u32x r2 = out[2]; + const u32x r3 = out[3]; + + #include VECT_COMPARE_S + } +} + +extern "C" __global__ void __launch_bounds__ (64, 1) m09700_s08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const oldoffice01_t *oldoffice01_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (64, 1) m09700_s16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const oldoffice01_t *oldoffice01_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/nv/m09700_a1.cu b/nv/m09700_a1.cu new file mode 100644 index 0000000000..3b4490e023 --- /dev/null +++ b/nv/m09700_a1.cu @@ -0,0 +1,1165 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _OLDOFFICE01_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW2 +#define VECT_SIZE1 +#endif + +#define DGST_R0 0 +#define DGST_R1 1 +#define DGST_R2 2 +#define DGST_R3 3 + +#include "include/kernel_functions.c" +#include "types_nv.c" +#include "common_nv.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +typedef struct +{ + u8 S[256]; + + u32 wtf_its_faster; + +} RC4_KEY; + +__device__ static void swap (RC4_KEY *rc4_key, const u8 i, const u8 j) +{ + u8 tmp; + + tmp = rc4_key->S[i]; + rc4_key->S[i] = rc4_key->S[j]; + rc4_key->S[j] = tmp; +} + +__device__ static void rc4_init_16 (RC4_KEY *rc4_key, const u32 data[4]) +{ + u32 v = 0x03020100; + u32 a = 0x04040404; + + u32 *ptr = (u32 *) rc4_key->S; + + #pragma unroll 64 + for (u32 i = 0; i < 64; i++) + { + *ptr++ = v; v += a; + } + + u32 j = 0; + + for (u32 i = 0; i < 16; i++) + { + u32 idx = i * 16; + + u32 v; + + v = data[0]; + + j += rc4_key->S[idx] + (v >> 0); swap (rc4_key, idx, j); idx++; + j += rc4_key->S[idx] + (v >> 8); swap (rc4_key, idx, j); idx++; + j += rc4_key->S[idx] + (v >> 16); swap (rc4_key, idx, j); idx++; + j += rc4_key->S[idx] + (v >> 24); swap (rc4_key, idx, j); idx++; + + v = data[1]; + + j += rc4_key->S[idx] + (v >> 0); swap (rc4_key, idx, j); idx++; + j += rc4_key->S[idx] + (v >> 8); swap (rc4_key, idx, j); idx++; + j += rc4_key->S[idx] + (v >> 16); swap (rc4_key, idx, j); idx++; + j += rc4_key->S[idx] + (v >> 24); swap (rc4_key, idx, j); idx++; + + v = data[2]; + + j += rc4_key->S[idx] + (v >> 0); swap (rc4_key, idx, j); idx++; + j += rc4_key->S[idx] + (v >> 8); swap (rc4_key, idx, j); idx++; + j += rc4_key->S[idx] + (v >> 16); swap (rc4_key, idx, j); idx++; + j += rc4_key->S[idx] + (v >> 24); swap (rc4_key, idx, j); idx++; + + v = data[3]; + + j += rc4_key->S[idx] + (v >> 0); swap (rc4_key, idx, j); idx++; + j += rc4_key->S[idx] + (v >> 8); swap (rc4_key, idx, j); idx++; + j += rc4_key->S[idx] + (v >> 16); swap (rc4_key, idx, j); idx++; + j += rc4_key->S[idx] + (v >> 24); swap (rc4_key, idx, j); idx++; + } +} + +__device__ static u8 rc4_next_16 (RC4_KEY *rc4_key, u8 i, u8 j, const u32 in[4], u32 out[4]) +{ + for (u32 k = 0; k < 4; k++) + { + u32 xor4 = 0; + + u8 idx; + + i += 1; + j += rc4_key->S[i]; + + swap (rc4_key, i, j); + + idx = rc4_key->S[i] + rc4_key->S[j]; + + xor4 |= rc4_key->S[idx] << 0; + + i += 1; + j += rc4_key->S[i]; + + swap (rc4_key, i, j); + + idx = rc4_key->S[i] + rc4_key->S[j]; + + xor4 |= rc4_key->S[idx] << 8; + + i += 1; + j += rc4_key->S[i]; + + swap (rc4_key, i, j); + + idx = rc4_key->S[i] + rc4_key->S[j]; + + xor4 |= rc4_key->S[idx] << 16; + + i += 1; + j += rc4_key->S[i]; + + swap (rc4_key, i, j); + + idx = rc4_key->S[i] + rc4_key->S[j]; + + xor4 |= rc4_key->S[idx] << 24; + + out[k] = in[k] ^ xor4; + } + + return j; +} + +__device__ static void md5_transform (const u32x w0[4], const u32x w1[4], const u32x w2[4], const u32x w3[4], u32x digest[4]) +{ + u32x a = digest[0]; + u32x b = digest[1]; + u32x c = digest[2]; + u32x d = digest[3]; + + u32x w0_t = w0[0]; + u32x w1_t = w0[1]; + u32x w2_t = w0[2]; + u32x w3_t = w0[3]; + u32x w4_t = w1[0]; + u32x w5_t = w1[1]; + u32x w6_t = w1[2]; + u32x w7_t = w1[3]; + u32x w8_t = w2[0]; + u32x w9_t = w2[1]; + u32x wa_t = w2[2]; + u32x wb_t = w2[3]; + u32x wc_t = w3[0]; + u32x wd_t = w3[1]; + u32x we_t = w3[2]; + u32x wf_t = w3[3]; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t, MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t, MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t, MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t, MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w4_t, MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w5_t, MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w6_t, MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w7_t, MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w8_t, MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w9_t, MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, wa_t, MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, wb_t, MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, wc_t, MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, wd_t, MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, we_t, MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, wf_t, MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w1_t, MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w6_t, MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, wb_t, MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t, MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w5_t, MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, wa_t, MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, wf_t, MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w4_t, MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w9_t, MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, we_t, MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t, MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w8_t, MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, wd_t, MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t, MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w7_t, MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, wc_t, MD5C1f, MD5S13); + + MD5_STEP (MD5_H , a, b, c, d, w5_t, MD5C20, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w8_t, MD5C21, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, wb_t, MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, we_t, MD5C23, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w1_t, MD5C24, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w4_t, MD5C25, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w7_t, MD5C26, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, wa_t, MD5C27, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, wd_t, MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w0_t, MD5C29, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w3_t, MD5C2a, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w6_t, MD5C2b, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w9_t, MD5C2c, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, wc_t, MD5C2d, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, wf_t, MD5C2e, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w2_t, MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t, MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w7_t, MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, we_t, MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w5_t, MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, wc_t, MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t, MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, wa_t, MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t, MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w8_t, MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, wf_t, MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w6_t, MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, wd_t, MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w4_t, MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, wb_t, MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t, MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w9_t, MD5C3f, MD5S33); + + digest[0] += a; + digest[1] += b; + digest[2] += c; + digest[3] += d; +} + +__device__ static void gen336 (u32x digest_pre[4], u32 salt_buf[4], u32x digest[4]) +{ + u32x digest_t0[2]; + u32x digest_t1[2]; + u32x digest_t2[2]; + u32x digest_t3[2]; + + digest_t0[0] = digest_pre[0]; + digest_t0[1] = digest_pre[1] & 0xff; + + digest_t1[0] = digest_pre[0] << 8; + digest_t1[1] = digest_pre[0] >> 24 | digest_pre[1] << 8; + + digest_t2[0] = digest_pre[0] << 16; + digest_t2[1] = digest_pre[0] >> 16 | digest_pre[1] << 16; + + digest_t3[0] = digest_pre[0] << 24; + digest_t3[1] = digest_pre[0] >> 8 | digest_pre[1] << 24; + + u32 salt_buf_t0[4]; + u32 salt_buf_t1[5]; + u32 salt_buf_t2[5]; + u32 salt_buf_t3[5]; + + salt_buf_t0[0] = salt_buf[0]; + salt_buf_t0[1] = salt_buf[1]; + salt_buf_t0[2] = salt_buf[2]; + salt_buf_t0[3] = salt_buf[3]; + + salt_buf_t1[0] = salt_buf[0] << 8; + salt_buf_t1[1] = salt_buf[0] >> 24 | salt_buf[1] << 8; + salt_buf_t1[2] = salt_buf[1] >> 24 | salt_buf[2] << 8; + salt_buf_t1[3] = salt_buf[2] >> 24 | salt_buf[3] << 8; + salt_buf_t1[4] = salt_buf[3] >> 24; + + salt_buf_t2[0] = salt_buf[0] << 16; + salt_buf_t2[1] = salt_buf[0] >> 16 | salt_buf[1] << 16; + salt_buf_t2[2] = salt_buf[1] >> 16 | salt_buf[2] << 16; + salt_buf_t2[3] = salt_buf[2] >> 16 | salt_buf[3] << 16; + salt_buf_t2[4] = salt_buf[3] >> 16; + + salt_buf_t3[0] = salt_buf[0] << 24; + salt_buf_t3[1] = salt_buf[0] >> 8 | salt_buf[1] << 24; + salt_buf_t3[2] = salt_buf[1] >> 8 | salt_buf[2] << 24; + salt_buf_t3[3] = salt_buf[2] >> 8 | salt_buf[3] << 24; + salt_buf_t3[4] = salt_buf[3] >> 8; + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + // generate the 16 * 21 buffer + + w0_t[0] = 0; + w0_t[1] = 0; + w0_t[2] = 0; + w0_t[3] = 0; + w1_t[0] = 0; + w1_t[1] = 0; + w1_t[2] = 0; + w1_t[3] = 0; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = 0; + + // 0..5 + w0_t[0] = digest_t0[0]; + w0_t[1] = digest_t0[1]; + + // 5..21 + w0_t[1] |= salt_buf_t1[0]; + w0_t[2] = salt_buf_t1[1]; + w0_t[3] = salt_buf_t1[2]; + w1_t[0] = salt_buf_t1[3]; + w1_t[1] = salt_buf_t1[4]; + + // 21..26 + w1_t[1] |= digest_t1[0]; + w1_t[2] = digest_t1[1]; + + // 26..42 + w1_t[2] |= salt_buf_t2[0]; + w1_t[3] = salt_buf_t2[1]; + w2_t[0] = salt_buf_t2[2]; + w2_t[1] = salt_buf_t2[3]; + w2_t[2] = salt_buf_t2[4]; + + // 42..47 + w2_t[2] |= digest_t2[0]; + w2_t[3] = digest_t2[1]; + + // 47..63 + w2_t[3] |= salt_buf_t3[0]; + w3_t[0] = salt_buf_t3[1]; + w3_t[1] = salt_buf_t3[2]; + w3_t[2] = salt_buf_t3[3]; + w3_t[3] = salt_buf_t3[4]; + + // 63.. + + w3_t[3] |= digest_t3[0]; + + md5_transform (w0_t, w1_t, w2_t, w3_t, digest); + + w0_t[0] = 0; + w0_t[1] = 0; + w0_t[2] = 0; + w0_t[3] = 0; + w1_t[0] = 0; + w1_t[1] = 0; + w1_t[2] = 0; + w1_t[3] = 0; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = 0; + + // 0..4 + w0_t[0] = digest_t3[1]; + + // 4..20 + w0_t[1] = salt_buf_t0[0]; + w0_t[2] = salt_buf_t0[1]; + w0_t[3] = salt_buf_t0[2]; + w1_t[0] = salt_buf_t0[3]; + + // 20..25 + w1_t[1] = digest_t0[0]; + w1_t[2] = digest_t0[1]; + + // 25..41 + w1_t[2] |= salt_buf_t1[0]; + w1_t[3] = salt_buf_t1[1]; + w2_t[0] = salt_buf_t1[2]; + w2_t[1] = salt_buf_t1[3]; + w2_t[2] = salt_buf_t1[4]; + + // 41..46 + w2_t[2] |= digest_t1[0]; + w2_t[3] = digest_t1[1]; + + // 46..62 + w2_t[3] |= salt_buf_t2[0]; + w3_t[0] = salt_buf_t2[1]; + w3_t[1] = salt_buf_t2[2]; + w3_t[2] = salt_buf_t2[3]; + w3_t[3] = salt_buf_t2[4]; + + // 62.. + w3_t[3] |= digest_t2[0]; + + md5_transform (w0_t, w1_t, w2_t, w3_t, digest); + + w0_t[0] = 0; + w0_t[1] = 0; + w0_t[2] = 0; + w0_t[3] = 0; + w1_t[0] = 0; + w1_t[1] = 0; + w1_t[2] = 0; + w1_t[3] = 0; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = 0; + + // 0..3 + w0_t[0] = digest_t2[1]; + + // 3..19 + w0_t[0] |= salt_buf_t3[0]; + w0_t[1] = salt_buf_t3[1]; + w0_t[2] = salt_buf_t3[2]; + w0_t[3] = salt_buf_t3[3]; + w1_t[0] = salt_buf_t3[4]; + + // 19..24 + w1_t[0] |= digest_t3[0]; + w1_t[1] = digest_t3[1]; + + // 24..40 + w1_t[2] = salt_buf_t0[0]; + w1_t[3] = salt_buf_t0[1]; + w2_t[0] = salt_buf_t0[2]; + w2_t[1] = salt_buf_t0[3]; + + // 40..45 + w2_t[2] = digest_t0[0]; + w2_t[3] = digest_t0[1]; + + // 45..61 + w2_t[3] |= salt_buf_t1[0]; + w3_t[0] = salt_buf_t1[1]; + w3_t[1] = salt_buf_t1[2]; + w3_t[2] = salt_buf_t1[3]; + w3_t[3] = salt_buf_t1[4]; + + // 61.. + w3_t[3] |= digest_t1[0]; + + md5_transform (w0_t, w1_t, w2_t, w3_t, digest); + + w0_t[0] = 0; + w0_t[1] = 0; + w0_t[2] = 0; + w0_t[3] = 0; + w1_t[0] = 0; + w1_t[1] = 0; + w1_t[2] = 0; + w1_t[3] = 0; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = 0; + + // 0..2 + w0_t[0] = digest_t1[1]; + + // 2..18 + w0_t[0] |= salt_buf_t2[0]; + w0_t[1] = salt_buf_t2[1]; + w0_t[2] = salt_buf_t2[2]; + w0_t[3] = salt_buf_t2[3]; + w1_t[0] = salt_buf_t2[4]; + + // 18..23 + w1_t[0] |= digest_t2[0]; + w1_t[1] = digest_t2[1]; + + // 23..39 + w1_t[1] |= salt_buf_t3[0]; + w1_t[2] = salt_buf_t3[1]; + w1_t[3] = salt_buf_t3[2]; + w2_t[0] = salt_buf_t3[3]; + w2_t[1] = salt_buf_t3[4]; + + // 39..44 + w2_t[1] |= digest_t3[0]; + w2_t[2] = digest_t3[1]; + + // 44..60 + w2_t[3] = salt_buf_t0[0]; + w3_t[0] = salt_buf_t0[1]; + w3_t[1] = salt_buf_t0[2]; + w3_t[2] = salt_buf_t0[3]; + + // 60.. + w3_t[3] = digest_t0[0]; + + md5_transform (w0_t, w1_t, w2_t, w3_t, digest); + + w0_t[0] = 0; + w0_t[1] = 0; + w0_t[2] = 0; + w0_t[3] = 0; + w1_t[0] = 0; + w1_t[1] = 0; + w1_t[2] = 0; + w1_t[3] = 0; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = 0; + + // 0..1 + w0_t[0] = digest_t0[1]; + + // 1..17 + w0_t[0] |= salt_buf_t1[0]; + w0_t[1] = salt_buf_t1[1]; + w0_t[2] = salt_buf_t1[2]; + w0_t[3] = salt_buf_t1[3]; + w1_t[0] = salt_buf_t1[4]; + + // 17..22 + w1_t[0] |= digest_t1[0]; + w1_t[1] = digest_t1[1]; + + // 22..38 + w1_t[1] |= salt_buf_t2[0]; + w1_t[2] = salt_buf_t2[1]; + w1_t[3] = salt_buf_t2[2]; + w2_t[0] = salt_buf_t2[3]; + w2_t[1] = salt_buf_t2[4]; + + // 38..43 + w2_t[1] |= digest_t2[0]; + w2_t[2] = digest_t2[1]; + + // 43..59 + w2_t[2] |= salt_buf_t3[0]; + w2_t[3] = salt_buf_t3[1]; + w3_t[0] = salt_buf_t3[2]; + w3_t[1] = salt_buf_t3[3]; + w3_t[2] = salt_buf_t3[4]; + + // 59.. + w3_t[2] |= digest_t3[0]; + w3_t[3] = digest_t3[1]; + + md5_transform (w0_t, w1_t, w2_t, w3_t, digest); + + w0_t[0] = salt_buf_t0[0]; + w0_t[1] = salt_buf_t0[1]; + w0_t[2] = salt_buf_t0[2]; + w0_t[3] = salt_buf_t0[3]; + w1_t[0] = 0x80; + w1_t[1] = 0; + w1_t[2] = 0; + w1_t[3] = 0; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 21 * 16 * 8; + w3_t[3] = 0; + + md5_transform (w0_t, w1_t, w2_t, w3_t, digest); +} + +__device__ __constant__ comb_t c_combs[1024]; + +extern "C" __global__ void __launch_bounds__ (64, 1) m09700_m04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const oldoffice01_t *oldoffice01_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + __shared__ RC4_KEY rc4_keys[64]; + + RC4_KEY *rc4_key = &rc4_keys[lid]; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, c_combs[0].pw_len); + } + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * salt + */ + + u32 salt_buf[4]; + + salt_buf[0] = salt_bufs[salt_pos].salt_buf[0]; + salt_buf[1] = salt_bufs[salt_pos].salt_buf[1]; + salt_buf[2] = salt_bufs[salt_pos].salt_buf[2]; + salt_buf[3] = salt_bufs[salt_pos].salt_buf[3]; + + /** + * esalt + */ + + const u32 version = oldoffice01_bufs[salt_pos].version; + + u32 encryptedVerifier[4]; + + encryptedVerifier[0] = oldoffice01_bufs[salt_pos].encryptedVerifier[0]; + encryptedVerifier[1] = oldoffice01_bufs[salt_pos].encryptedVerifier[1]; + encryptedVerifier[2] = oldoffice01_bufs[salt_pos].encryptedVerifier[2]; + encryptedVerifier[3] = oldoffice01_bufs[salt_pos].encryptedVerifier[3]; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = c_combs[il_pos].pw_len; + + const u32 pw_len = pw_l_len + pw_r_len; + + u32 wordr0[4]; + + wordr0[0] = c_combs[il_pos].i[0]; + wordr0[1] = c_combs[il_pos].i[1]; + wordr0[2] = c_combs[il_pos].i[2]; + wordr0[3] = c_combs[il_pos].i[3]; + + u32 wordr1[4]; + + wordr1[0] = c_combs[il_pos].i[4]; + wordr1[1] = c_combs[il_pos].i[5]; + wordr1[2] = c_combs[il_pos].i[6]; + wordr1[3] = c_combs[il_pos].i[7]; + + u32 wordr2[4]; + + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + + u32 wordr3[4]; + + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + u32x w0[4]; + + w0[0] = wordl0[0] | wordr0[0]; + w0[1] = wordl0[1] | wordr0[1]; + w0[2] = wordl0[2] | wordr0[2]; + w0[3] = wordl0[3] | wordr0[3]; + + u32x w1[4]; + + w1[0] = wordl1[0] | wordr1[0]; + w1[1] = wordl1[1] | wordr1[1]; + w1[2] = wordl1[2] | wordr1[2]; + w1[3] = wordl1[3] | wordr1[3]; + + u32x w2[4]; + + w2[0] = wordl2[0] | wordr2[0]; + w2[1] = wordl2[1] | wordr2[1]; + w2[2] = wordl2[2] | wordr2[2]; + w2[3] = wordl2[3] | wordr2[3]; + + u32x w3[4]; + + w3[0] = wordl3[0] | wordr3[0]; + w3[1] = wordl3[1] | wordr3[1]; + w3[2] = 0; + w3[3] = 0; + + append_0x80_2 (w0, w1, pw_len); + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + make_unicode (w0, w0_t, w1_t); + make_unicode (w1, w2_t, w3_t); + + w3_t[2] = pw_len * 8 * 2; + + u32x digest_pre[4]; + + digest_pre[0] = MD5M_A; + digest_pre[1] = MD5M_B; + digest_pre[2] = MD5M_C; + digest_pre[3] = MD5M_D; + + md5_transform (w0_t, w1_t, w2_t, w3_t, digest_pre); + + digest_pre[0] &= 0xffffffff; + digest_pre[1] &= 0x000000ff; + digest_pre[2] &= 0x00000000; + digest_pre[3] &= 0x00000000; + + u32x digest[4]; + + digest[0] = MD5M_A; + digest[1] = MD5M_B; + digest[2] = MD5M_C; + digest[3] = MD5M_D; + + gen336 (digest_pre, salt_buf, digest); + + // now the 40 bit input for the MD5 which then will generate the RC4 key, so it's precomputable! + + w0_t[0] = digest[0]; + w0_t[1] = digest[1] & 0xff; + w0_t[2] = 0x8000; + w0_t[3] = 0; + w1_t[0] = 0; + w1_t[1] = 0; + w1_t[2] = 0; + w1_t[3] = 0; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 9 * 8; + w3_t[3] = 0; + + digest[0] = MD5M_A; + digest[1] = MD5M_B; + digest[2] = MD5M_C; + digest[3] = MD5M_D; + + md5_transform (w0_t, w1_t, w2_t, w3_t, digest); + + // now the RC4 part + + u32x key[4]; + + key[0] = digest[0]; + key[1] = digest[1]; + key[2] = digest[2]; + key[3] = digest[3]; + + rc4_init_16 (rc4_key, key); + + u32x out[4]; + + u8 j = rc4_next_16 (rc4_key, 0, 0, encryptedVerifier, out); + + w0_t[0] = out[0]; + w0_t[1] = out[1]; + w0_t[2] = out[2]; + w0_t[3] = out[3]; + w1_t[0] = 0x80; + w1_t[1] = 0; + w1_t[2] = 0; + w1_t[3] = 0; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 16 * 8; + w3_t[3] = 0; + + digest[0] = MD5M_A; + digest[1] = MD5M_B; + digest[2] = MD5M_C; + digest[3] = MD5M_D; + + md5_transform (w0_t, w1_t, w2_t, w3_t, digest); + + rc4_next_16 (rc4_key, 16, j, digest, out); + + const u32x r0 = out[0]; + const u32x r1 = out[1]; + const u32x r2 = out[2]; + const u32x r3 = out[3]; + + #include VECT_COMPARE_M + } +} + +extern "C" __global__ void __launch_bounds__ (64, 1) m09700_m08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const oldoffice01_t *oldoffice01_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (64, 1) m09700_m16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const oldoffice01_t *oldoffice01_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (64, 1) m09700_s04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const oldoffice01_t *oldoffice01_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + __shared__ RC4_KEY rc4_keys[64]; + + RC4_KEY *rc4_key = &rc4_keys[lid]; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, c_combs[0].pw_len); + } + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * salt + */ + + u32 salt_buf[4]; + + salt_buf[0] = salt_bufs[salt_pos].salt_buf[0]; + salt_buf[1] = salt_bufs[salt_pos].salt_buf[1]; + salt_buf[2] = salt_bufs[salt_pos].salt_buf[2]; + salt_buf[3] = salt_bufs[salt_pos].salt_buf[3]; + + /** + * esalt + */ + + const u32 version = oldoffice01_bufs[salt_pos].version; + + u32 encryptedVerifier[4]; + + encryptedVerifier[0] = oldoffice01_bufs[salt_pos].encryptedVerifier[0]; + encryptedVerifier[1] = oldoffice01_bufs[salt_pos].encryptedVerifier[1]; + encryptedVerifier[2] = oldoffice01_bufs[salt_pos].encryptedVerifier[2]; + encryptedVerifier[3] = oldoffice01_bufs[salt_pos].encryptedVerifier[3]; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = c_combs[il_pos].pw_len; + + const u32 pw_len = pw_l_len + pw_r_len; + + u32 wordr0[4]; + + wordr0[0] = c_combs[il_pos].i[0]; + wordr0[1] = c_combs[il_pos].i[1]; + wordr0[2] = c_combs[il_pos].i[2]; + wordr0[3] = c_combs[il_pos].i[3]; + + u32 wordr1[4]; + + wordr1[0] = c_combs[il_pos].i[4]; + wordr1[1] = c_combs[il_pos].i[5]; + wordr1[2] = c_combs[il_pos].i[6]; + wordr1[3] = c_combs[il_pos].i[7]; + + u32 wordr2[4]; + + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + + u32 wordr3[4]; + + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + u32x w0[4]; + + w0[0] = wordl0[0] | wordr0[0]; + w0[1] = wordl0[1] | wordr0[1]; + w0[2] = wordl0[2] | wordr0[2]; + w0[3] = wordl0[3] | wordr0[3]; + + u32x w1[4]; + + w1[0] = wordl1[0] | wordr1[0]; + w1[1] = wordl1[1] | wordr1[1]; + w1[2] = wordl1[2] | wordr1[2]; + w1[3] = wordl1[3] | wordr1[3]; + + u32x w2[4]; + + w2[0] = wordl2[0] | wordr2[0]; + w2[1] = wordl2[1] | wordr2[1]; + w2[2] = wordl2[2] | wordr2[2]; + w2[3] = wordl2[3] | wordr2[3]; + + u32x w3[4]; + + w3[0] = wordl3[0] | wordr3[0]; + w3[1] = wordl3[1] | wordr3[1]; + w3[2] = 0; + w3[3] = 0; + + append_0x80_2 (w0, w1, pw_len); + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + make_unicode (w0, w0_t, w1_t); + make_unicode (w1, w2_t, w3_t); + + w3_t[2] = pw_len * 8 * 2; + + u32x digest_pre[4]; + + digest_pre[0] = MD5M_A; + digest_pre[1] = MD5M_B; + digest_pre[2] = MD5M_C; + digest_pre[3] = MD5M_D; + + md5_transform (w0_t, w1_t, w2_t, w3_t, digest_pre); + + digest_pre[0] &= 0xffffffff; + digest_pre[1] &= 0x000000ff; + digest_pre[2] &= 0x00000000; + digest_pre[3] &= 0x00000000; + + u32x digest[4]; + + digest[0] = MD5M_A; + digest[1] = MD5M_B; + digest[2] = MD5M_C; + digest[3] = MD5M_D; + + gen336 (digest_pre, salt_buf, digest); + + // now the 40 bit input for the MD5 which then will generate the RC4 key, so it's precomputable! + + w0_t[0] = digest[0]; + w0_t[1] = digest[1] & 0xff; + w0_t[2] = 0x8000; + w0_t[3] = 0; + w1_t[0] = 0; + w1_t[1] = 0; + w1_t[2] = 0; + w1_t[3] = 0; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 9 * 8; + w3_t[3] = 0; + + digest[0] = MD5M_A; + digest[1] = MD5M_B; + digest[2] = MD5M_C; + digest[3] = MD5M_D; + + md5_transform (w0_t, w1_t, w2_t, w3_t, digest); + + // now the RC4 part + + u32x key[4]; + + key[0] = digest[0]; + key[1] = digest[1]; + key[2] = digest[2]; + key[3] = digest[3]; + + rc4_init_16 (rc4_key, key); + + u32x out[4]; + + u8 j = rc4_next_16 (rc4_key, 0, 0, encryptedVerifier, out); + + w0_t[0] = out[0]; + w0_t[1] = out[1]; + w0_t[2] = out[2]; + w0_t[3] = out[3]; + w1_t[0] = 0x80; + w1_t[1] = 0; + w1_t[2] = 0; + w1_t[3] = 0; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 16 * 8; + w3_t[3] = 0; + + digest[0] = MD5M_A; + digest[1] = MD5M_B; + digest[2] = MD5M_C; + digest[3] = MD5M_D; + + md5_transform (w0_t, w1_t, w2_t, w3_t, digest); + + rc4_next_16 (rc4_key, 16, j, digest, out); + + const u32x r0 = out[0]; + const u32x r1 = out[1]; + const u32x r2 = out[2]; + const u32x r3 = out[3]; + + #include VECT_COMPARE_S + } +} + +extern "C" __global__ void __launch_bounds__ (64, 1) m09700_s08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const oldoffice01_t *oldoffice01_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (64, 1) m09700_s16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const oldoffice01_t *oldoffice01_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/nv/m09700_a3.cu b/nv/m09700_a3.cu new file mode 100644 index 0000000000..e095b04704 --- /dev/null +++ b/nv/m09700_a3.cu @@ -0,0 +1,1552 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _OLDOFFICE01_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW2 +#define VECT_SIZE1 +#endif + +#define DGST_R0 0 +#define DGST_R1 1 +#define DGST_R2 2 +#define DGST_R3 3 + +#include "include/kernel_functions.c" +#include "types_nv.c" +#include "common_nv.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +typedef struct +{ + u8 S[256]; + + u32 wtf_its_faster; + +} RC4_KEY; + +__device__ static void swap (RC4_KEY *rc4_key, const u8 i, const u8 j) +{ + u8 tmp; + + tmp = rc4_key->S[i]; + rc4_key->S[i] = rc4_key->S[j]; + rc4_key->S[j] = tmp; +} + +__device__ static void rc4_init_16 (RC4_KEY *rc4_key, const u32 data[4]) +{ + u32 v = 0x03020100; + u32 a = 0x04040404; + + u32 *ptr = (u32 *) rc4_key->S; + + #pragma unroll 64 + for (u32 i = 0; i < 64; i++) + { + *ptr++ = v; v += a; + } + + u32 j = 0; + + for (u32 i = 0; i < 16; i++) + { + u32 idx = i * 16; + + u32 v; + + v = data[0]; + + j += rc4_key->S[idx] + (v >> 0); swap (rc4_key, idx, j); idx++; + j += rc4_key->S[idx] + (v >> 8); swap (rc4_key, idx, j); idx++; + j += rc4_key->S[idx] + (v >> 16); swap (rc4_key, idx, j); idx++; + j += rc4_key->S[idx] + (v >> 24); swap (rc4_key, idx, j); idx++; + + v = data[1]; + + j += rc4_key->S[idx] + (v >> 0); swap (rc4_key, idx, j); idx++; + j += rc4_key->S[idx] + (v >> 8); swap (rc4_key, idx, j); idx++; + j += rc4_key->S[idx] + (v >> 16); swap (rc4_key, idx, j); idx++; + j += rc4_key->S[idx] + (v >> 24); swap (rc4_key, idx, j); idx++; + + v = data[2]; + + j += rc4_key->S[idx] + (v >> 0); swap (rc4_key, idx, j); idx++; + j += rc4_key->S[idx] + (v >> 8); swap (rc4_key, idx, j); idx++; + j += rc4_key->S[idx] + (v >> 16); swap (rc4_key, idx, j); idx++; + j += rc4_key->S[idx] + (v >> 24); swap (rc4_key, idx, j); idx++; + + v = data[3]; + + j += rc4_key->S[idx] + (v >> 0); swap (rc4_key, idx, j); idx++; + j += rc4_key->S[idx] + (v >> 8); swap (rc4_key, idx, j); idx++; + j += rc4_key->S[idx] + (v >> 16); swap (rc4_key, idx, j); idx++; + j += rc4_key->S[idx] + (v >> 24); swap (rc4_key, idx, j); idx++; + } +} + +__device__ static u8 rc4_next_16 (RC4_KEY *rc4_key, u8 i, u8 j, const u32 in[4], u32 out[4]) +{ + for (u32 k = 0; k < 4; k++) + { + u32 xor4 = 0; + + u8 idx; + + i += 1; + j += rc4_key->S[i]; + + swap (rc4_key, i, j); + + idx = rc4_key->S[i] + rc4_key->S[j]; + + xor4 |= rc4_key->S[idx] << 0; + + i += 1; + j += rc4_key->S[i]; + + swap (rc4_key, i, j); + + idx = rc4_key->S[i] + rc4_key->S[j]; + + xor4 |= rc4_key->S[idx] << 8; + + i += 1; + j += rc4_key->S[i]; + + swap (rc4_key, i, j); + + idx = rc4_key->S[i] + rc4_key->S[j]; + + xor4 |= rc4_key->S[idx] << 16; + + i += 1; + j += rc4_key->S[i]; + + swap (rc4_key, i, j); + + idx = rc4_key->S[i] + rc4_key->S[j]; + + xor4 |= rc4_key->S[idx] << 24; + + out[k] = in[k] ^ xor4; + } + + return j; +} + +__device__ static void md5_transform (const u32x w0[4], const u32x w1[4], const u32x w2[4], const u32x w3[4], u32x digest[4]) +{ + u32x a = digest[0]; + u32x b = digest[1]; + u32x c = digest[2]; + u32x d = digest[3]; + + u32x w0_t = w0[0]; + u32x w1_t = w0[1]; + u32x w2_t = w0[2]; + u32x w3_t = w0[3]; + u32x w4_t = w1[0]; + u32x w5_t = w1[1]; + u32x w6_t = w1[2]; + u32x w7_t = w1[3]; + u32x w8_t = w2[0]; + u32x w9_t = w2[1]; + u32x wa_t = w2[2]; + u32x wb_t = w2[3]; + u32x wc_t = w3[0]; + u32x wd_t = w3[1]; + u32x we_t = w3[2]; + u32x wf_t = w3[3]; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t, MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t, MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t, MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t, MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w4_t, MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w5_t, MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w6_t, MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w7_t, MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w8_t, MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w9_t, MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, wa_t, MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, wb_t, MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, wc_t, MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, wd_t, MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, we_t, MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, wf_t, MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w1_t, MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w6_t, MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, wb_t, MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t, MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w5_t, MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, wa_t, MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, wf_t, MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w4_t, MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w9_t, MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, we_t, MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t, MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w8_t, MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, wd_t, MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t, MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w7_t, MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, wc_t, MD5C1f, MD5S13); + + MD5_STEP (MD5_H , a, b, c, d, w5_t, MD5C20, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w8_t, MD5C21, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, wb_t, MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, we_t, MD5C23, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w1_t, MD5C24, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w4_t, MD5C25, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w7_t, MD5C26, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, wa_t, MD5C27, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, wd_t, MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w0_t, MD5C29, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w3_t, MD5C2a, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w6_t, MD5C2b, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w9_t, MD5C2c, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, wc_t, MD5C2d, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, wf_t, MD5C2e, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w2_t, MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t, MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w7_t, MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, we_t, MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w5_t, MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, wc_t, MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t, MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, wa_t, MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t, MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w8_t, MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, wf_t, MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w6_t, MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, wd_t, MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w4_t, MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, wb_t, MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t, MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w9_t, MD5C3f, MD5S33); + + digest[0] += a; + digest[1] += b; + digest[2] += c; + digest[3] += d; +} + +__device__ __constant__ bf_t c_bfs[1024]; + +__device__ static void m09700m (RC4_KEY rc4_keys[64], u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], const u32 pw_len, const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const u32x *bfs_buf, void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const oldoffice01_t *oldoffice01_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset) +{ + /** + * modifier + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + const u32 lid = threadIdx.x; + + RC4_KEY *rc4_key = &rc4_keys[lid]; + + /** + * salt + */ + + u32 salt_buf_t0[4]; + u32 salt_buf_t1[5]; + u32 salt_buf_t2[5]; + u32 salt_buf_t3[5]; + + salt_buf_t0[0] = salt_bufs[salt_pos].salt_buf[0]; + salt_buf_t0[1] = salt_bufs[salt_pos].salt_buf[1]; + salt_buf_t0[2] = salt_bufs[salt_pos].salt_buf[2]; + salt_buf_t0[3] = salt_bufs[salt_pos].salt_buf[3]; + + salt_buf_t1[0] = salt_buf_t0[0] << 8; + salt_buf_t1[1] = salt_buf_t0[0] >> 24 | salt_buf_t0[1] << 8; + salt_buf_t1[2] = salt_buf_t0[1] >> 24 | salt_buf_t0[2] << 8; + salt_buf_t1[3] = salt_buf_t0[2] >> 24 | salt_buf_t0[3] << 8; + salt_buf_t1[4] = salt_buf_t0[3] >> 24; + + salt_buf_t2[0] = salt_buf_t0[0] << 16; + salt_buf_t2[1] = salt_buf_t0[0] >> 16 | salt_buf_t0[1] << 16; + salt_buf_t2[2] = salt_buf_t0[1] >> 16 | salt_buf_t0[2] << 16; + salt_buf_t2[3] = salt_buf_t0[2] >> 16 | salt_buf_t0[3] << 16; + salt_buf_t2[4] = salt_buf_t0[3] >> 16; + + salt_buf_t3[0] = salt_buf_t0[0] << 24; + salt_buf_t3[1] = salt_buf_t0[0] >> 8 | salt_buf_t0[1] << 24; + salt_buf_t3[2] = salt_buf_t0[1] >> 8 | salt_buf_t0[2] << 24; + salt_buf_t3[3] = salt_buf_t0[2] >> 8 | salt_buf_t0[3] << 24; + salt_buf_t3[4] = salt_buf_t0[3] >> 8; + + const u32 salt_len = 16; + + /** + * esalt + */ + + const u32 version = oldoffice01_bufs[salt_pos].version; + + u32 encryptedVerifier[4]; + + encryptedVerifier[0] = oldoffice01_bufs[salt_pos].encryptedVerifier[0]; + encryptedVerifier[1] = oldoffice01_bufs[salt_pos].encryptedVerifier[1]; + encryptedVerifier[2] = oldoffice01_bufs[salt_pos].encryptedVerifier[2]; + encryptedVerifier[3] = oldoffice01_bufs[salt_pos].encryptedVerifier[3]; + + /** + * loop + */ + + u32x w0l = w0[0]; + + for (u32 il_pos = 0; il_pos < bfs_cnt; il_pos++) + { + const u32 w0r = c_bfs[il_pos].i; + + w0[0] = w0l | w0r; + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + w0_t[0] = w0[0]; + w0_t[1] = w0[1]; + w0_t[2] = w0[2]; + w0_t[3] = w0[3]; + w1_t[0] = w1[0]; + w1_t[1] = w1[1]; + w1_t[2] = w1[2]; + w1_t[3] = w1[3]; + w2_t[0] = w2[0]; + w2_t[1] = w2[1]; + w2_t[2] = w2[2]; + w2_t[3] = w2[3]; + w3_t[0] = w3[0]; + w3_t[1] = w3[1]; + w3_t[2] = pw_len * 8; + w3_t[3] = 0; + + u32x digest_t0[4]; + u32x digest_t1[2]; // need only first 5 byte + u32x digest_t2[2]; + u32x digest_t3[2]; + + digest_t0[0] = MD5M_A; + digest_t0[1] = MD5M_B; + digest_t0[2] = MD5M_C; + digest_t0[3] = MD5M_D; + + md5_transform (w0_t, w1_t, w2_t, w3_t, digest_t0); + + // prepare 16 * 21 buffer stuff + + u32x digest[4]; + + digest[0] = MD5M_A; + digest[1] = MD5M_B; + digest[2] = MD5M_C; + digest[3] = MD5M_D; + + // offsets + + digest_t0[0] &= 0xffffffff; + digest_t0[1] &= 0x000000ff; + digest_t0[2] &= 0x00000000; + digest_t0[3] &= 0x00000000; + + digest_t1[0] = digest_t0[0] << 8; + digest_t1[1] = digest_t0[0] >> 24 | digest_t0[1] << 8; + + digest_t2[0] = digest_t0[0] << 16; + digest_t2[1] = digest_t0[0] >> 16 | digest_t0[1] << 16; + + digest_t3[0] = digest_t0[0] << 24; + digest_t3[1] = digest_t0[0] >> 8 | digest_t0[1] << 24; + + // generate the 16 * 21 buffer + + w0_t[0] = 0; + w0_t[1] = 0; + w0_t[2] = 0; + w0_t[3] = 0; + w1_t[0] = 0; + w1_t[1] = 0; + w1_t[2] = 0; + w1_t[3] = 0; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = 0; + + // 0..5 + w0_t[0] = digest_t0[0]; + w0_t[1] = digest_t0[1]; + + // 5..21 + w0_t[1] |= salt_buf_t1[0]; + w0_t[2] = salt_buf_t1[1]; + w0_t[3] = salt_buf_t1[2]; + w1_t[0] = salt_buf_t1[3]; + w1_t[1] = salt_buf_t1[4]; + + // 21..26 + w1_t[1] |= digest_t1[0]; + w1_t[2] = digest_t1[1]; + + // 26..42 + w1_t[2] |= salt_buf_t2[0]; + w1_t[3] = salt_buf_t2[1]; + w2_t[0] = salt_buf_t2[2]; + w2_t[1] = salt_buf_t2[3]; + w2_t[2] = salt_buf_t2[4]; + + // 42..47 + w2_t[2] |= digest_t2[0]; + w2_t[3] = digest_t2[1]; + + // 47..63 + w2_t[3] |= salt_buf_t3[0]; + w3_t[0] = salt_buf_t3[1]; + w3_t[1] = salt_buf_t3[2]; + w3_t[2] = salt_buf_t3[3]; + w3_t[3] = salt_buf_t3[4]; + + // 63.. + + w3_t[3] |= digest_t3[0]; + + md5_transform (w0_t, w1_t, w2_t, w3_t, digest); + + w0_t[0] = 0; + w0_t[1] = 0; + w0_t[2] = 0; + w0_t[3] = 0; + w1_t[0] = 0; + w1_t[1] = 0; + w1_t[2] = 0; + w1_t[3] = 0; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = 0; + + // 0..4 + w0_t[0] = digest_t3[1]; + + // 4..20 + w0_t[1] = salt_buf_t0[0]; + w0_t[2] = salt_buf_t0[1]; + w0_t[3] = salt_buf_t0[2]; + w1_t[0] = salt_buf_t0[3]; + + // 20..25 + w1_t[1] = digest_t0[0]; + w1_t[2] = digest_t0[1]; + + // 25..41 + w1_t[2] |= salt_buf_t1[0]; + w1_t[3] = salt_buf_t1[1]; + w2_t[0] = salt_buf_t1[2]; + w2_t[1] = salt_buf_t1[3]; + w2_t[2] = salt_buf_t1[4]; + + // 41..46 + w2_t[2] |= digest_t1[0]; + w2_t[3] = digest_t1[1]; + + // 46..62 + w2_t[3] |= salt_buf_t2[0]; + w3_t[0] = salt_buf_t2[1]; + w3_t[1] = salt_buf_t2[2]; + w3_t[2] = salt_buf_t2[3]; + w3_t[3] = salt_buf_t2[4]; + + // 62.. + w3_t[3] |= digest_t2[0]; + + md5_transform (w0_t, w1_t, w2_t, w3_t, digest); + + w0_t[0] = 0; + w0_t[1] = 0; + w0_t[2] = 0; + w0_t[3] = 0; + w1_t[0] = 0; + w1_t[1] = 0; + w1_t[2] = 0; + w1_t[3] = 0; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = 0; + + // 0..3 + w0_t[0] = digest_t2[1]; + + // 3..19 + w0_t[0] |= salt_buf_t3[0]; + w0_t[1] = salt_buf_t3[1]; + w0_t[2] = salt_buf_t3[2]; + w0_t[3] = salt_buf_t3[3]; + w1_t[0] = salt_buf_t3[4]; + + // 19..24 + w1_t[0] |= digest_t3[0]; + w1_t[1] = digest_t3[1]; + + // 24..40 + w1_t[2] = salt_buf_t0[0]; + w1_t[3] = salt_buf_t0[1]; + w2_t[0] = salt_buf_t0[2]; + w2_t[1] = salt_buf_t0[3]; + + // 40..45 + w2_t[2] = digest_t0[0]; + w2_t[3] = digest_t0[1]; + + // 45..61 + w2_t[3] |= salt_buf_t1[0]; + w3_t[0] = salt_buf_t1[1]; + w3_t[1] = salt_buf_t1[2]; + w3_t[2] = salt_buf_t1[3]; + w3_t[3] = salt_buf_t1[4]; + + // 61.. + w3_t[3] |= digest_t1[0]; + + md5_transform (w0_t, w1_t, w2_t, w3_t, digest); + + w0_t[0] = 0; + w0_t[1] = 0; + w0_t[2] = 0; + w0_t[3] = 0; + w1_t[0] = 0; + w1_t[1] = 0; + w1_t[2] = 0; + w1_t[3] = 0; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = 0; + + // 0..2 + w0_t[0] = digest_t1[1]; + + // 2..18 + w0_t[0] |= salt_buf_t2[0]; + w0_t[1] = salt_buf_t2[1]; + w0_t[2] = salt_buf_t2[2]; + w0_t[3] = salt_buf_t2[3]; + w1_t[0] = salt_buf_t2[4]; + + // 18..23 + w1_t[0] |= digest_t2[0]; + w1_t[1] = digest_t2[1]; + + // 23..39 + w1_t[1] |= salt_buf_t3[0]; + w1_t[2] = salt_buf_t3[1]; + w1_t[3] = salt_buf_t3[2]; + w2_t[0] = salt_buf_t3[3]; + w2_t[1] = salt_buf_t3[4]; + + // 39..44 + w2_t[1] |= digest_t3[0]; + w2_t[2] = digest_t3[1]; + + // 44..60 + w2_t[3] = salt_buf_t0[0]; + w3_t[0] = salt_buf_t0[1]; + w3_t[1] = salt_buf_t0[2]; + w3_t[2] = salt_buf_t0[3]; + + // 60.. + w3_t[3] = digest_t0[0]; + + md5_transform (w0_t, w1_t, w2_t, w3_t, digest); + + w0_t[0] = 0; + w0_t[1] = 0; + w0_t[2] = 0; + w0_t[3] = 0; + w1_t[0] = 0; + w1_t[1] = 0; + w1_t[2] = 0; + w1_t[3] = 0; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = 0; + + // 0..1 + w0_t[0] = digest_t0[1]; + + // 1..17 + w0_t[0] |= salt_buf_t1[0]; + w0_t[1] = salt_buf_t1[1]; + w0_t[2] = salt_buf_t1[2]; + w0_t[3] = salt_buf_t1[3]; + w1_t[0] = salt_buf_t1[4]; + + // 17..22 + w1_t[0] |= digest_t1[0]; + w1_t[1] = digest_t1[1]; + + // 22..38 + w1_t[1] |= salt_buf_t2[0]; + w1_t[2] = salt_buf_t2[1]; + w1_t[3] = salt_buf_t2[2]; + w2_t[0] = salt_buf_t2[3]; + w2_t[1] = salt_buf_t2[4]; + + // 38..43 + w2_t[1] |= digest_t2[0]; + w2_t[2] = digest_t2[1]; + + // 43..59 + w2_t[2] |= salt_buf_t3[0]; + w2_t[3] = salt_buf_t3[1]; + w3_t[0] = salt_buf_t3[2]; + w3_t[1] = salt_buf_t3[3]; + w3_t[2] = salt_buf_t3[4]; + + // 59.. + w3_t[2] |= digest_t3[0]; + w3_t[3] = digest_t3[1]; + + md5_transform (w0_t, w1_t, w2_t, w3_t, digest); + + w0_t[0] = salt_buf_t0[0]; + w0_t[1] = salt_buf_t0[1]; + w0_t[2] = salt_buf_t0[2]; + w0_t[3] = salt_buf_t0[3]; + w1_t[0] = 0x80; + w1_t[1] = 0; + w1_t[2] = 0; + w1_t[3] = 0; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 21 * 16 * 8; + w3_t[3] = 0; + + md5_transform (w0_t, w1_t, w2_t, w3_t, digest); + + // now the 40 bit input for the MD5 which then will generate the RC4 key, so it's precomputable! + + w0_t[0] = digest[0]; + w0_t[1] = digest[1] & 0xff; + w0_t[2] = 0x8000; + w0_t[3] = 0; + w1_t[0] = 0; + w1_t[1] = 0; + w1_t[2] = 0; + w1_t[3] = 0; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 9 * 8; + w3_t[3] = 0; + + digest[0] = MD5M_A; + digest[1] = MD5M_B; + digest[2] = MD5M_C; + digest[3] = MD5M_D; + + md5_transform (w0_t, w1_t, w2_t, w3_t, digest); + + // now the RC4 part + + u32x key[4]; + + key[0] = digest[0]; + key[1] = digest[1]; + key[2] = digest[2]; + key[3] = digest[3]; + + rc4_init_16 (rc4_key, key); + + u32x out[4]; + + u8 j = rc4_next_16 (rc4_key, 0, 0, encryptedVerifier, out); + + w0_t[0] = out[0]; + w0_t[1] = out[1]; + w0_t[2] = out[2]; + w0_t[3] = out[3]; + w1_t[0] = 0x80; + w1_t[1] = 0; + w1_t[2] = 0; + w1_t[3] = 0; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 16 * 8; + w3_t[3] = 0; + + digest[0] = MD5M_A; + digest[1] = MD5M_B; + digest[2] = MD5M_C; + digest[3] = MD5M_D; + + md5_transform (w0_t, w1_t, w2_t, w3_t, digest); + + rc4_next_16 (rc4_key, 16, j, digest, out); + + const u32x r0 = out[0]; + const u32x r1 = out[1]; + const u32x r2 = out[2]; + const u32x r3 = out[3]; + + #include VECT_COMPARE_M + } +} + +__device__ static void m09700s (RC4_KEY rc4_keys[64], u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], const u32 pw_len, const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const u32x *bfs_buf, void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const oldoffice01_t *oldoffice01_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset) +{ + /** + * modifier + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + const u32 lid = threadIdx.x; + + RC4_KEY *rc4_key = &rc4_keys[lid]; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * salt + */ + + u32 salt_buf_t0[4]; + u32 salt_buf_t1[5]; + u32 salt_buf_t2[5]; + u32 salt_buf_t3[5]; + + salt_buf_t0[0] = salt_bufs[salt_pos].salt_buf[0]; + salt_buf_t0[1] = salt_bufs[salt_pos].salt_buf[1]; + salt_buf_t0[2] = salt_bufs[salt_pos].salt_buf[2]; + salt_buf_t0[3] = salt_bufs[salt_pos].salt_buf[3]; + + salt_buf_t1[0] = salt_buf_t0[0] << 8; + salt_buf_t1[1] = salt_buf_t0[0] >> 24 | salt_buf_t0[1] << 8; + salt_buf_t1[2] = salt_buf_t0[1] >> 24 | salt_buf_t0[2] << 8; + salt_buf_t1[3] = salt_buf_t0[2] >> 24 | salt_buf_t0[3] << 8; + salt_buf_t1[4] = salt_buf_t0[3] >> 24; + + salt_buf_t2[0] = salt_buf_t0[0] << 16; + salt_buf_t2[1] = salt_buf_t0[0] >> 16 | salt_buf_t0[1] << 16; + salt_buf_t2[2] = salt_buf_t0[1] >> 16 | salt_buf_t0[2] << 16; + salt_buf_t2[3] = salt_buf_t0[2] >> 16 | salt_buf_t0[3] << 16; + salt_buf_t2[4] = salt_buf_t0[3] >> 16; + + salt_buf_t3[0] = salt_buf_t0[0] << 24; + salt_buf_t3[1] = salt_buf_t0[0] >> 8 | salt_buf_t0[1] << 24; + salt_buf_t3[2] = salt_buf_t0[1] >> 8 | salt_buf_t0[2] << 24; + salt_buf_t3[3] = salt_buf_t0[2] >> 8 | salt_buf_t0[3] << 24; + salt_buf_t3[4] = salt_buf_t0[3] >> 8; + + const u32 salt_len = 16; + + /** + * esalt + */ + + const u32 version = oldoffice01_bufs[salt_pos].version; + + u32 encryptedVerifier[4]; + + encryptedVerifier[0] = oldoffice01_bufs[salt_pos].encryptedVerifier[0]; + encryptedVerifier[1] = oldoffice01_bufs[salt_pos].encryptedVerifier[1]; + encryptedVerifier[2] = oldoffice01_bufs[salt_pos].encryptedVerifier[2]; + encryptedVerifier[3] = oldoffice01_bufs[salt_pos].encryptedVerifier[3]; + + /** + * loop + */ + + u32x w0l = w0[0]; + + for (u32 il_pos = 0; il_pos < bfs_cnt; il_pos++) + { + const u32 w0r = c_bfs[il_pos].i; + + w0[0] = w0l | w0r; + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + w0_t[0] = w0[0]; + w0_t[1] = w0[1]; + w0_t[2] = w0[2]; + w0_t[3] = w0[3]; + w1_t[0] = w1[0]; + w1_t[1] = w1[1]; + w1_t[2] = w1[2]; + w1_t[3] = w1[3]; + w2_t[0] = w2[0]; + w2_t[1] = w2[1]; + w2_t[2] = w2[2]; + w2_t[3] = w2[3]; + w3_t[0] = w3[0]; + w3_t[1] = w3[1]; + w3_t[2] = pw_len * 8; + w3_t[3] = 0; + + u32x digest_t0[4]; + u32x digest_t1[2]; // need only first 5 byte + u32x digest_t2[2]; + u32x digest_t3[2]; + + digest_t0[0] = MD5M_A; + digest_t0[1] = MD5M_B; + digest_t0[2] = MD5M_C; + digest_t0[3] = MD5M_D; + + md5_transform (w0_t, w1_t, w2_t, w3_t, digest_t0); + + // prepare 16 * 21 buffer stuff + + u32x digest[4]; + + digest[0] = MD5M_A; + digest[1] = MD5M_B; + digest[2] = MD5M_C; + digest[3] = MD5M_D; + + // offsets + + digest_t0[0] &= 0xffffffff; + digest_t0[1] &= 0x000000ff; + digest_t0[2] &= 0x00000000; + digest_t0[3] &= 0x00000000; + + digest_t1[0] = digest_t0[0] << 8; + digest_t1[1] = digest_t0[0] >> 24 | digest_t0[1] << 8; + + digest_t2[0] = digest_t0[0] << 16; + digest_t2[1] = digest_t0[0] >> 16 | digest_t0[1] << 16; + + digest_t3[0] = digest_t0[0] << 24; + digest_t3[1] = digest_t0[0] >> 8 | digest_t0[1] << 24; + + // generate the 16 * 21 buffer + + w0_t[0] = 0; + w0_t[1] = 0; + w0_t[2] = 0; + w0_t[3] = 0; + w1_t[0] = 0; + w1_t[1] = 0; + w1_t[2] = 0; + w1_t[3] = 0; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = 0; + + // 0..5 + w0_t[0] = digest_t0[0]; + w0_t[1] = digest_t0[1]; + + // 5..21 + w0_t[1] |= salt_buf_t1[0]; + w0_t[2] = salt_buf_t1[1]; + w0_t[3] = salt_buf_t1[2]; + w1_t[0] = salt_buf_t1[3]; + w1_t[1] = salt_buf_t1[4]; + + // 21..26 + w1_t[1] |= digest_t1[0]; + w1_t[2] = digest_t1[1]; + + // 26..42 + w1_t[2] |= salt_buf_t2[0]; + w1_t[3] = salt_buf_t2[1]; + w2_t[0] = salt_buf_t2[2]; + w2_t[1] = salt_buf_t2[3]; + w2_t[2] = salt_buf_t2[4]; + + // 42..47 + w2_t[2] |= digest_t2[0]; + w2_t[3] = digest_t2[1]; + + // 47..63 + w2_t[3] |= salt_buf_t3[0]; + w3_t[0] = salt_buf_t3[1]; + w3_t[1] = salt_buf_t3[2]; + w3_t[2] = salt_buf_t3[3]; + w3_t[3] = salt_buf_t3[4]; + + // 63.. + + w3_t[3] |= digest_t3[0]; + + md5_transform (w0_t, w1_t, w2_t, w3_t, digest); + + w0_t[0] = 0; + w0_t[1] = 0; + w0_t[2] = 0; + w0_t[3] = 0; + w1_t[0] = 0; + w1_t[1] = 0; + w1_t[2] = 0; + w1_t[3] = 0; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = 0; + + // 0..4 + w0_t[0] = digest_t3[1]; + + // 4..20 + w0_t[1] = salt_buf_t0[0]; + w0_t[2] = salt_buf_t0[1]; + w0_t[3] = salt_buf_t0[2]; + w1_t[0] = salt_buf_t0[3]; + + // 20..25 + w1_t[1] = digest_t0[0]; + w1_t[2] = digest_t0[1]; + + // 25..41 + w1_t[2] |= salt_buf_t1[0]; + w1_t[3] = salt_buf_t1[1]; + w2_t[0] = salt_buf_t1[2]; + w2_t[1] = salt_buf_t1[3]; + w2_t[2] = salt_buf_t1[4]; + + // 41..46 + w2_t[2] |= digest_t1[0]; + w2_t[3] = digest_t1[1]; + + // 46..62 + w2_t[3] |= salt_buf_t2[0]; + w3_t[0] = salt_buf_t2[1]; + w3_t[1] = salt_buf_t2[2]; + w3_t[2] = salt_buf_t2[3]; + w3_t[3] = salt_buf_t2[4]; + + // 62.. + w3_t[3] |= digest_t2[0]; + + md5_transform (w0_t, w1_t, w2_t, w3_t, digest); + + w0_t[0] = 0; + w0_t[1] = 0; + w0_t[2] = 0; + w0_t[3] = 0; + w1_t[0] = 0; + w1_t[1] = 0; + w1_t[2] = 0; + w1_t[3] = 0; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = 0; + + // 0..3 + w0_t[0] = digest_t2[1]; + + // 3..19 + w0_t[0] |= salt_buf_t3[0]; + w0_t[1] = salt_buf_t3[1]; + w0_t[2] = salt_buf_t3[2]; + w0_t[3] = salt_buf_t3[3]; + w1_t[0] = salt_buf_t3[4]; + + // 19..24 + w1_t[0] |= digest_t3[0]; + w1_t[1] = digest_t3[1]; + + // 24..40 + w1_t[2] = salt_buf_t0[0]; + w1_t[3] = salt_buf_t0[1]; + w2_t[0] = salt_buf_t0[2]; + w2_t[1] = salt_buf_t0[3]; + + // 40..45 + w2_t[2] = digest_t0[0]; + w2_t[3] = digest_t0[1]; + + // 45..61 + w2_t[3] |= salt_buf_t1[0]; + w3_t[0] = salt_buf_t1[1]; + w3_t[1] = salt_buf_t1[2]; + w3_t[2] = salt_buf_t1[3]; + w3_t[3] = salt_buf_t1[4]; + + // 61.. + w3_t[3] |= digest_t1[0]; + + md5_transform (w0_t, w1_t, w2_t, w3_t, digest); + + w0_t[0] = 0; + w0_t[1] = 0; + w0_t[2] = 0; + w0_t[3] = 0; + w1_t[0] = 0; + w1_t[1] = 0; + w1_t[2] = 0; + w1_t[3] = 0; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = 0; + + // 0..2 + w0_t[0] = digest_t1[1]; + + // 2..18 + w0_t[0] |= salt_buf_t2[0]; + w0_t[1] = salt_buf_t2[1]; + w0_t[2] = salt_buf_t2[2]; + w0_t[3] = salt_buf_t2[3]; + w1_t[0] = salt_buf_t2[4]; + + // 18..23 + w1_t[0] |= digest_t2[0]; + w1_t[1] = digest_t2[1]; + + // 23..39 + w1_t[1] |= salt_buf_t3[0]; + w1_t[2] = salt_buf_t3[1]; + w1_t[3] = salt_buf_t3[2]; + w2_t[0] = salt_buf_t3[3]; + w2_t[1] = salt_buf_t3[4]; + + // 39..44 + w2_t[1] |= digest_t3[0]; + w2_t[2] = digest_t3[1]; + + // 44..60 + w2_t[3] = salt_buf_t0[0]; + w3_t[0] = salt_buf_t0[1]; + w3_t[1] = salt_buf_t0[2]; + w3_t[2] = salt_buf_t0[3]; + + // 60.. + w3_t[3] = digest_t0[0]; + + md5_transform (w0_t, w1_t, w2_t, w3_t, digest); + + w0_t[0] = 0; + w0_t[1] = 0; + w0_t[2] = 0; + w0_t[3] = 0; + w1_t[0] = 0; + w1_t[1] = 0; + w1_t[2] = 0; + w1_t[3] = 0; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = 0; + + // 0..1 + w0_t[0] = digest_t0[1]; + + // 1..17 + w0_t[0] |= salt_buf_t1[0]; + w0_t[1] = salt_buf_t1[1]; + w0_t[2] = salt_buf_t1[2]; + w0_t[3] = salt_buf_t1[3]; + w1_t[0] = salt_buf_t1[4]; + + // 17..22 + w1_t[0] |= digest_t1[0]; + w1_t[1] = digest_t1[1]; + + // 22..38 + w1_t[1] |= salt_buf_t2[0]; + w1_t[2] = salt_buf_t2[1]; + w1_t[3] = salt_buf_t2[2]; + w2_t[0] = salt_buf_t2[3]; + w2_t[1] = salt_buf_t2[4]; + + // 38..43 + w2_t[1] |= digest_t2[0]; + w2_t[2] = digest_t2[1]; + + // 43..59 + w2_t[2] |= salt_buf_t3[0]; + w2_t[3] = salt_buf_t3[1]; + w3_t[0] = salt_buf_t3[2]; + w3_t[1] = salt_buf_t3[3]; + w3_t[2] = salt_buf_t3[4]; + + // 59.. + w3_t[2] |= digest_t3[0]; + w3_t[3] = digest_t3[1]; + + md5_transform (w0_t, w1_t, w2_t, w3_t, digest); + + w0_t[0] = salt_buf_t0[0]; + w0_t[1] = salt_buf_t0[1]; + w0_t[2] = salt_buf_t0[2]; + w0_t[3] = salt_buf_t0[3]; + w1_t[0] = 0x80; + w1_t[1] = 0; + w1_t[2] = 0; + w1_t[3] = 0; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 21 * 16 * 8; + w3_t[3] = 0; + + md5_transform (w0_t, w1_t, w2_t, w3_t, digest); + + // now the 40 bit input for the MD5 which then will generate the RC4 key, so it's precomputable! + + w0_t[0] = digest[0]; + w0_t[1] = digest[1] & 0xff; + w0_t[2] = 0x8000; + w0_t[3] = 0; + w1_t[0] = 0; + w1_t[1] = 0; + w1_t[2] = 0; + w1_t[3] = 0; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 9 * 8; + w3_t[3] = 0; + + digest[0] = MD5M_A; + digest[1] = MD5M_B; + digest[2] = MD5M_C; + digest[3] = MD5M_D; + + md5_transform (w0_t, w1_t, w2_t, w3_t, digest); + + // now the RC4 part + + u32x key[4]; + + key[0] = digest[0]; + key[1] = digest[1]; + key[2] = digest[2]; + key[3] = digest[3]; + + rc4_init_16 (rc4_key, key); + + u32x out[4]; + + u8 j = rc4_next_16 (rc4_key, 0, 0, encryptedVerifier, out); + + w0_t[0] = out[0]; + w0_t[1] = out[1]; + w0_t[2] = out[2]; + w0_t[3] = out[3]; + w1_t[0] = 0x80; + w1_t[1] = 0; + w1_t[2] = 0; + w1_t[3] = 0; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 16 * 8; + w3_t[3] = 0; + + digest[0] = MD5M_A; + digest[1] = MD5M_B; + digest[2] = MD5M_C; + digest[3] = MD5M_D; + + md5_transform (w0_t, w1_t, w2_t, w3_t, digest); + + rc4_next_16 (rc4_key, 16, j, digest, out); + + const u32x r0 = out[0]; + const u32x r1 = out[1]; + const u32x r2 = out[2]; + const u32x r3 = out[3]; + + #include VECT_COMPARE_S + } +} + +extern "C" __global__ void __launch_bounds__ (64, 1) m09700_m04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const u32x *bfs_buf, void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const oldoffice01_t *oldoffice01_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + __shared__ RC4_KEY rc4_keys[64]; + + m09700m (rc4_keys, w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, oldoffice01_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (64, 1) m09700_m08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const u32x *bfs_buf, void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const oldoffice01_t *oldoffice01_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + __shared__ RC4_KEY rc4_keys[64]; + + m09700m (rc4_keys, w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, oldoffice01_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (64, 1) m09700_m16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const u32x *bfs_buf, void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const oldoffice01_t *oldoffice01_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = pws[gid].i[ 8]; + w2[1] = pws[gid].i[ 9]; + w2[2] = pws[gid].i[10]; + w2[3] = pws[gid].i[11]; + + u32x w3[4]; + + w3[0] = pws[gid].i[12]; + w3[1] = pws[gid].i[13]; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + __shared__ RC4_KEY rc4_keys[64]; + + m09700m (rc4_keys, w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, oldoffice01_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (64, 1) m09700_s04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const u32x *bfs_buf, void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const oldoffice01_t *oldoffice01_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + __shared__ RC4_KEY rc4_keys[64]; + + m09700s (rc4_keys, w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, oldoffice01_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (64, 1) m09700_s08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const u32x *bfs_buf, void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const oldoffice01_t *oldoffice01_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + __shared__ RC4_KEY rc4_keys[64]; + + m09700s (rc4_keys, w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, oldoffice01_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (64, 1) m09700_s16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const u32x *bfs_buf, void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const oldoffice01_t *oldoffice01_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = pws[gid].i[ 8]; + w2[1] = pws[gid].i[ 9]; + w2[2] = pws[gid].i[10]; + w2[3] = pws[gid].i[11]; + + u32x w3[4]; + + w3[0] = pws[gid].i[12]; + w3[1] = pws[gid].i[13]; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + __shared__ RC4_KEY rc4_keys[64]; + + m09700s (rc4_keys, w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, oldoffice01_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} diff --git a/nv/m09710_a0.cu b/nv/m09710_a0.cu new file mode 100644 index 0000000000..d8cb3ee98f --- /dev/null +++ b/nv/m09710_a0.cu @@ -0,0 +1,625 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _OLDOFFICE01_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW2 +#define VECT_SIZE1 +#endif + +#define DGST_R0 0 +#define DGST_R1 1 +#define DGST_R2 2 +#define DGST_R3 3 + +#include "include/kernel_functions.c" +#include "types_nv.c" +#include "common_nv.c" +#include "include/rp_gpu.h" +#include "rp_nv.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +typedef struct +{ + u8 S[256]; + + u32 wtf_its_faster; + +} RC4_KEY; + +__device__ static void swap (RC4_KEY *rc4_key, const u8 i, const u8 j) +{ + u8 tmp; + + tmp = rc4_key->S[i]; + rc4_key->S[i] = rc4_key->S[j]; + rc4_key->S[j] = tmp; +} + +__device__ static void rc4_init_16 (RC4_KEY *rc4_key, const u32 data[4]) +{ + u32 v = 0x03020100; + u32 a = 0x04040404; + + u32 *ptr = (u32 *) rc4_key->S; + + #pragma unroll 64 + for (u32 i = 0; i < 64; i++) + { + *ptr++ = v; v += a; + } + + u32 j = 0; + + for (u32 i = 0; i < 16; i++) + { + u32 idx = i * 16; + + u32 v; + + v = data[0]; + + j += rc4_key->S[idx] + (v >> 0); swap (rc4_key, idx, j); idx++; + j += rc4_key->S[idx] + (v >> 8); swap (rc4_key, idx, j); idx++; + j += rc4_key->S[idx] + (v >> 16); swap (rc4_key, idx, j); idx++; + j += rc4_key->S[idx] + (v >> 24); swap (rc4_key, idx, j); idx++; + + v = data[1]; + + j += rc4_key->S[idx] + (v >> 0); swap (rc4_key, idx, j); idx++; + j += rc4_key->S[idx] + (v >> 8); swap (rc4_key, idx, j); idx++; + j += rc4_key->S[idx] + (v >> 16); swap (rc4_key, idx, j); idx++; + j += rc4_key->S[idx] + (v >> 24); swap (rc4_key, idx, j); idx++; + + v = data[2]; + + j += rc4_key->S[idx] + (v >> 0); swap (rc4_key, idx, j); idx++; + j += rc4_key->S[idx] + (v >> 8); swap (rc4_key, idx, j); idx++; + j += rc4_key->S[idx] + (v >> 16); swap (rc4_key, idx, j); idx++; + j += rc4_key->S[idx] + (v >> 24); swap (rc4_key, idx, j); idx++; + + v = data[3]; + + j += rc4_key->S[idx] + (v >> 0); swap (rc4_key, idx, j); idx++; + j += rc4_key->S[idx] + (v >> 8); swap (rc4_key, idx, j); idx++; + j += rc4_key->S[idx] + (v >> 16); swap (rc4_key, idx, j); idx++; + j += rc4_key->S[idx] + (v >> 24); swap (rc4_key, idx, j); idx++; + } +} + +__device__ static u8 rc4_next_16 (RC4_KEY *rc4_key, u8 i, u8 j, const u32 in[4], u32 out[4]) +{ + for (u32 k = 0; k < 4; k++) + { + u32 xor4 = 0; + + u8 idx; + + i += 1; + j += rc4_key->S[i]; + + swap (rc4_key, i, j); + + idx = rc4_key->S[i] + rc4_key->S[j]; + + xor4 |= rc4_key->S[idx] << 0; + + i += 1; + j += rc4_key->S[i]; + + swap (rc4_key, i, j); + + idx = rc4_key->S[i] + rc4_key->S[j]; + + xor4 |= rc4_key->S[idx] << 8; + + i += 1; + j += rc4_key->S[i]; + + swap (rc4_key, i, j); + + idx = rc4_key->S[i] + rc4_key->S[j]; + + xor4 |= rc4_key->S[idx] << 16; + + i += 1; + j += rc4_key->S[i]; + + swap (rc4_key, i, j); + + idx = rc4_key->S[i] + rc4_key->S[j]; + + xor4 |= rc4_key->S[idx] << 24; + + out[k] = in[k] ^ xor4; + } + + return j; +} + +__device__ static void md5_transform (const u32x w0[4], const u32x w1[4], const u32x w2[4], const u32x w3[4], u32x digest[4]) +{ + u32x a = digest[0]; + u32x b = digest[1]; + u32x c = digest[2]; + u32x d = digest[3]; + + u32x w0_t = w0[0]; + u32x w1_t = w0[1]; + u32x w2_t = w0[2]; + u32x w3_t = w0[3]; + u32x w4_t = w1[0]; + u32x w5_t = w1[1]; + u32x w6_t = w1[2]; + u32x w7_t = w1[3]; + u32x w8_t = w2[0]; + u32x w9_t = w2[1]; + u32x wa_t = w2[2]; + u32x wb_t = w2[3]; + u32x wc_t = w3[0]; + u32x wd_t = w3[1]; + u32x we_t = w3[2]; + u32x wf_t = w3[3]; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t, MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t, MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t, MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t, MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w4_t, MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w5_t, MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w6_t, MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w7_t, MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w8_t, MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w9_t, MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, wa_t, MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, wb_t, MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, wc_t, MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, wd_t, MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, we_t, MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, wf_t, MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w1_t, MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w6_t, MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, wb_t, MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t, MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w5_t, MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, wa_t, MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, wf_t, MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w4_t, MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w9_t, MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, we_t, MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t, MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w8_t, MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, wd_t, MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t, MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w7_t, MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, wc_t, MD5C1f, MD5S13); + + MD5_STEP (MD5_H , a, b, c, d, w5_t, MD5C20, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w8_t, MD5C21, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, wb_t, MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, we_t, MD5C23, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w1_t, MD5C24, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w4_t, MD5C25, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w7_t, MD5C26, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, wa_t, MD5C27, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, wd_t, MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w0_t, MD5C29, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w3_t, MD5C2a, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w6_t, MD5C2b, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w9_t, MD5C2c, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, wc_t, MD5C2d, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, wf_t, MD5C2e, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w2_t, MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t, MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w7_t, MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, we_t, MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w5_t, MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, wc_t, MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t, MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, wa_t, MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t, MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w8_t, MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, wf_t, MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w6_t, MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, wd_t, MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w4_t, MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, wb_t, MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t, MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w9_t, MD5C3f, MD5S33); + + digest[0] += a; + digest[1] += b; + digest[2] += c; + digest[3] += d; +} + +__device__ __constant__ gpu_rule_t c_rules[1024]; + +extern "C" __global__ void __launch_bounds__ (64, 1) m09710_m04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const oldoffice01_t *oldoffice01_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + __shared__ RC4_KEY rc4_keys[64]; + + RC4_KEY *rc4_key = &rc4_keys[lid]; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + u32x pw_buf1[4]; + + pw_buf1[0] = pws[gid].i[ 4]; + pw_buf1[1] = pws[gid].i[ 5]; + pw_buf1[2] = pws[gid].i[ 6]; + pw_buf1[3] = pws[gid].i[ 7]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * esalt + */ + + const u32 version = oldoffice01_bufs[salt_pos].version; + + u32 encryptedVerifier[4]; + + encryptedVerifier[0] = oldoffice01_bufs[salt_pos].encryptedVerifier[0]; + encryptedVerifier[1] = oldoffice01_bufs[salt_pos].encryptedVerifier[1]; + encryptedVerifier[2] = oldoffice01_bufs[salt_pos].encryptedVerifier[2]; + encryptedVerifier[3] = oldoffice01_bufs[salt_pos].encryptedVerifier[3]; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + + w0[0] = pw_buf0[0]; + w0[1] = pw_buf0[1]; + w0[2] = pw_buf0[2]; + w0[3] = pw_buf0[3]; + + u32x w1[4]; + + w1[0] = pw_buf1[0]; + w1[1] = pw_buf1[1]; + w1[2] = pw_buf1[2]; + w1[3] = pw_buf1[3]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + apply_rules (c_rules[il_pos].cmds, w0, w1, pw_len); + + // first md5 to generate RC4 128 bit key + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + w0_t[0] = w0[0]; + w0_t[1] = w0[1] & 0xff; + w0_t[2] = 0x8000; + w0_t[3] = 0; + w1_t[0] = 0; + w1_t[1] = 0; + w1_t[2] = 0; + w1_t[3] = 0; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 9 * 8; + w3_t[3] = 0; + + u32x digest[4]; + + digest[0] = MD5M_A; + digest[1] = MD5M_B; + digest[2] = MD5M_C; + digest[3] = MD5M_D; + + md5_transform (w0_t, w1_t, w2_t, w3_t, digest); + + // now the RC4 part + + u32x key[4]; + + key[0] = digest[0]; + key[1] = digest[1]; + key[2] = digest[2]; + key[3] = digest[3]; + + rc4_init_16 (rc4_key, key); + + u32x out[4]; + + u8 j = rc4_next_16 (rc4_key, 0, 0, encryptedVerifier, out); + + w0_t[0] = out[0]; + w0_t[1] = out[1]; + w0_t[2] = out[2]; + w0_t[3] = out[3]; + w1_t[0] = 0x80; + w1_t[1] = 0; + w1_t[2] = 0; + w1_t[3] = 0; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 16 * 8; + w3_t[3] = 0; + + digest[0] = MD5M_A; + digest[1] = MD5M_B; + digest[2] = MD5M_C; + digest[3] = MD5M_D; + + md5_transform (w0_t, w1_t, w2_t, w3_t, digest); + + rc4_next_16 (rc4_key, 16, j, digest, out); + + const u32x r0 = out[0]; + const u32x r1 = out[1]; + const u32x r2 = out[2]; + const u32x r3 = out[3]; + + #include VECT_COMPARE_M + } +} + +extern "C" __global__ void __launch_bounds__ (64, 1) m09710_m08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const oldoffice01_t *oldoffice01_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (64, 1) m09710_m16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const oldoffice01_t *oldoffice01_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (64, 1) m09710_s04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const oldoffice01_t *oldoffice01_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + __shared__ RC4_KEY rc4_keys[64]; + + RC4_KEY *rc4_key = &rc4_keys[lid]; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + u32x pw_buf1[4]; + + pw_buf1[0] = pws[gid].i[ 4]; + pw_buf1[1] = pws[gid].i[ 5]; + pw_buf1[2] = pws[gid].i[ 6]; + pw_buf1[3] = pws[gid].i[ 7]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * esalt + */ + + const u32 version = oldoffice01_bufs[salt_pos].version; + + u32 encryptedVerifier[4]; + + encryptedVerifier[0] = oldoffice01_bufs[salt_pos].encryptedVerifier[0]; + encryptedVerifier[1] = oldoffice01_bufs[salt_pos].encryptedVerifier[1]; + encryptedVerifier[2] = oldoffice01_bufs[salt_pos].encryptedVerifier[2]; + encryptedVerifier[3] = oldoffice01_bufs[salt_pos].encryptedVerifier[3]; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + + w0[0] = pw_buf0[0]; + w0[1] = pw_buf0[1]; + w0[2] = pw_buf0[2]; + w0[3] = pw_buf0[3]; + + u32x w1[4]; + + w1[0] = pw_buf1[0]; + w1[1] = pw_buf1[1]; + w1[2] = pw_buf1[2]; + w1[3] = pw_buf1[3]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + apply_rules (c_rules[il_pos].cmds, w0, w1, pw_len); + + // first md5 to generate RC4 128 bit key + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + w0_t[0] = w0[0]; + w0_t[1] = w0[1] & 0xff; + w0_t[2] = 0x8000; + w0_t[3] = 0; + w1_t[0] = 0; + w1_t[1] = 0; + w1_t[2] = 0; + w1_t[3] = 0; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 9 * 8; + w3_t[3] = 0; + + u32x digest[4]; + + digest[0] = MD5M_A; + digest[1] = MD5M_B; + digest[2] = MD5M_C; + digest[3] = MD5M_D; + + md5_transform (w0_t, w1_t, w2_t, w3_t, digest); + + // now the RC4 part + + u32x key[4]; + + key[0] = digest[0]; + key[1] = digest[1]; + key[2] = digest[2]; + key[3] = digest[3]; + + rc4_init_16 (rc4_key, key); + + u32x out[4]; + + u8 j = rc4_next_16 (rc4_key, 0, 0, encryptedVerifier, out); + + w0_t[0] = out[0]; + w0_t[1] = out[1]; + w0_t[2] = out[2]; + w0_t[3] = out[3]; + w1_t[0] = 0x80; + w1_t[1] = 0; + w1_t[2] = 0; + w1_t[3] = 0; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 16 * 8; + w3_t[3] = 0; + + digest[0] = MD5M_A; + digest[1] = MD5M_B; + digest[2] = MD5M_C; + digest[3] = MD5M_D; + + md5_transform (w0_t, w1_t, w2_t, w3_t, digest); + + rc4_next_16 (rc4_key, 16, j, digest, out); + + const u32x r0 = out[0]; + const u32x r1 = out[1]; + const u32x r2 = out[2]; + const u32x r3 = out[3]; + + #include VECT_COMPARE_S + } +} + +extern "C" __global__ void __launch_bounds__ (64, 1) m09710_s08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const oldoffice01_t *oldoffice01_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (64, 1) m09710_s16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const oldoffice01_t *oldoffice01_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/nv/m09710_a1.cu b/nv/m09710_a1.cu new file mode 100644 index 0000000000..b3177a1ce7 --- /dev/null +++ b/nv/m09710_a1.cu @@ -0,0 +1,667 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _OLDOFFICE01_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW2 +#define VECT_SIZE1 +#endif + +#define DGST_R0 0 +#define DGST_R1 1 +#define DGST_R2 2 +#define DGST_R3 3 + +#include "include/kernel_functions.c" +#include "types_nv.c" +#include "common_nv.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +typedef struct +{ + u8 S[256]; + + u32 wtf_its_faster; + +} RC4_KEY; + +__device__ static void swap (RC4_KEY *rc4_key, const u8 i, const u8 j) +{ + u8 tmp; + + tmp = rc4_key->S[i]; + rc4_key->S[i] = rc4_key->S[j]; + rc4_key->S[j] = tmp; +} + +__device__ static void rc4_init_16 (RC4_KEY *rc4_key, const u32 data[4]) +{ + u32 v = 0x03020100; + u32 a = 0x04040404; + + u32 *ptr = (u32 *) rc4_key->S; + + #pragma unroll 64 + for (u32 i = 0; i < 64; i++) + { + *ptr++ = v; v += a; + } + + u32 j = 0; + + for (u32 i = 0; i < 16; i++) + { + u32 idx = i * 16; + + u32 v; + + v = data[0]; + + j += rc4_key->S[idx] + (v >> 0); swap (rc4_key, idx, j); idx++; + j += rc4_key->S[idx] + (v >> 8); swap (rc4_key, idx, j); idx++; + j += rc4_key->S[idx] + (v >> 16); swap (rc4_key, idx, j); idx++; + j += rc4_key->S[idx] + (v >> 24); swap (rc4_key, idx, j); idx++; + + v = data[1]; + + j += rc4_key->S[idx] + (v >> 0); swap (rc4_key, idx, j); idx++; + j += rc4_key->S[idx] + (v >> 8); swap (rc4_key, idx, j); idx++; + j += rc4_key->S[idx] + (v >> 16); swap (rc4_key, idx, j); idx++; + j += rc4_key->S[idx] + (v >> 24); swap (rc4_key, idx, j); idx++; + + v = data[2]; + + j += rc4_key->S[idx] + (v >> 0); swap (rc4_key, idx, j); idx++; + j += rc4_key->S[idx] + (v >> 8); swap (rc4_key, idx, j); idx++; + j += rc4_key->S[idx] + (v >> 16); swap (rc4_key, idx, j); idx++; + j += rc4_key->S[idx] + (v >> 24); swap (rc4_key, idx, j); idx++; + + v = data[3]; + + j += rc4_key->S[idx] + (v >> 0); swap (rc4_key, idx, j); idx++; + j += rc4_key->S[idx] + (v >> 8); swap (rc4_key, idx, j); idx++; + j += rc4_key->S[idx] + (v >> 16); swap (rc4_key, idx, j); idx++; + j += rc4_key->S[idx] + (v >> 24); swap (rc4_key, idx, j); idx++; + } +} + +__device__ static u8 rc4_next_16 (RC4_KEY *rc4_key, u8 i, u8 j, const u32 in[4], u32 out[4]) +{ + for (u32 k = 0; k < 4; k++) + { + u32 xor4 = 0; + + u8 idx; + + i += 1; + j += rc4_key->S[i]; + + swap (rc4_key, i, j); + + idx = rc4_key->S[i] + rc4_key->S[j]; + + xor4 |= rc4_key->S[idx] << 0; + + i += 1; + j += rc4_key->S[i]; + + swap (rc4_key, i, j); + + idx = rc4_key->S[i] + rc4_key->S[j]; + + xor4 |= rc4_key->S[idx] << 8; + + i += 1; + j += rc4_key->S[i]; + + swap (rc4_key, i, j); + + idx = rc4_key->S[i] + rc4_key->S[j]; + + xor4 |= rc4_key->S[idx] << 16; + + i += 1; + j += rc4_key->S[i]; + + swap (rc4_key, i, j); + + idx = rc4_key->S[i] + rc4_key->S[j]; + + xor4 |= rc4_key->S[idx] << 24; + + out[k] = in[k] ^ xor4; + } + + return j; +} + +__device__ static void md5_transform (const u32x w0[4], const u32x w1[4], const u32x w2[4], const u32x w3[4], u32x digest[4]) +{ + u32x a = digest[0]; + u32x b = digest[1]; + u32x c = digest[2]; + u32x d = digest[3]; + + u32x w0_t = w0[0]; + u32x w1_t = w0[1]; + u32x w2_t = w0[2]; + u32x w3_t = w0[3]; + u32x w4_t = w1[0]; + u32x w5_t = w1[1]; + u32x w6_t = w1[2]; + u32x w7_t = w1[3]; + u32x w8_t = w2[0]; + u32x w9_t = w2[1]; + u32x wa_t = w2[2]; + u32x wb_t = w2[3]; + u32x wc_t = w3[0]; + u32x wd_t = w3[1]; + u32x we_t = w3[2]; + u32x wf_t = w3[3]; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t, MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t, MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t, MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t, MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w4_t, MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w5_t, MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w6_t, MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w7_t, MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w8_t, MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w9_t, MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, wa_t, MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, wb_t, MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, wc_t, MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, wd_t, MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, we_t, MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, wf_t, MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w1_t, MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w6_t, MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, wb_t, MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t, MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w5_t, MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, wa_t, MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, wf_t, MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w4_t, MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w9_t, MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, we_t, MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t, MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w8_t, MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, wd_t, MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t, MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w7_t, MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, wc_t, MD5C1f, MD5S13); + + MD5_STEP (MD5_H , a, b, c, d, w5_t, MD5C20, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w8_t, MD5C21, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, wb_t, MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, we_t, MD5C23, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w1_t, MD5C24, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w4_t, MD5C25, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w7_t, MD5C26, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, wa_t, MD5C27, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, wd_t, MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w0_t, MD5C29, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w3_t, MD5C2a, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w6_t, MD5C2b, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w9_t, MD5C2c, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, wc_t, MD5C2d, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, wf_t, MD5C2e, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w2_t, MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t, MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w7_t, MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, we_t, MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w5_t, MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, wc_t, MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t, MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, wa_t, MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t, MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w8_t, MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, wf_t, MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w6_t, MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, wd_t, MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w4_t, MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, wb_t, MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t, MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w9_t, MD5C3f, MD5S33); + + digest[0] += a; + digest[1] += b; + digest[2] += c; + digest[3] += d; +} + +__device__ __constant__ comb_t c_combs[1024]; + +extern "C" __global__ void __launch_bounds__ (64, 1) m09710_m04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const oldoffice01_t *oldoffice01_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + __shared__ RC4_KEY rc4_keys[64]; + + RC4_KEY *rc4_key = &rc4_keys[lid]; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, c_combs[0].pw_len); + } + + /** + * esalt + */ + + const u32 version = oldoffice01_bufs[salt_pos].version; + + u32 encryptedVerifier[4]; + + encryptedVerifier[0] = oldoffice01_bufs[salt_pos].encryptedVerifier[0]; + encryptedVerifier[1] = oldoffice01_bufs[salt_pos].encryptedVerifier[1]; + encryptedVerifier[2] = oldoffice01_bufs[salt_pos].encryptedVerifier[2]; + encryptedVerifier[3] = oldoffice01_bufs[salt_pos].encryptedVerifier[3]; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + u32 wordr0[4]; + + wordr0[0] = c_combs[il_pos].i[0]; + wordr0[1] = c_combs[il_pos].i[1]; + wordr0[2] = c_combs[il_pos].i[2]; + wordr0[3] = c_combs[il_pos].i[3]; + + u32 wordr1[4]; + + wordr1[0] = c_combs[il_pos].i[4]; + wordr1[1] = c_combs[il_pos].i[5]; + wordr1[2] = c_combs[il_pos].i[6]; + wordr1[3] = c_combs[il_pos].i[7]; + + u32 wordr2[4]; + + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + + u32 wordr3[4]; + + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + // first md5 to generate RC4 128 bit key + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + w0_t[0] = wordl0[0] | wordr0[0]; + w0_t[1] = (wordl0[1] | wordr0[1]) & 0xff; + w0_t[2] = 0x8000; + w0_t[3] = 0; + w1_t[0] = 0; + w1_t[1] = 0; + w1_t[2] = 0; + w1_t[3] = 0; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 9 * 8; + w3_t[3] = 0; + + u32x digest[4]; + + digest[0] = MD5M_A; + digest[1] = MD5M_B; + digest[2] = MD5M_C; + digest[3] = MD5M_D; + + md5_transform (w0_t, w1_t, w2_t, w3_t, digest); + + // now the RC4 part + + u32x key[4]; + + key[0] = digest[0]; + key[1] = digest[1]; + key[2] = digest[2]; + key[3] = digest[3]; + + rc4_init_16 (rc4_key, key); + + u32x out[4]; + + u8 j = rc4_next_16 (rc4_key, 0, 0, encryptedVerifier, out); + + w0_t[0] = out[0]; + w0_t[1] = out[1]; + w0_t[2] = out[2]; + w0_t[3] = out[3]; + w1_t[0] = 0x80; + w1_t[1] = 0; + w1_t[2] = 0; + w1_t[3] = 0; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 16 * 8; + w3_t[3] = 0; + + digest[0] = MD5M_A; + digest[1] = MD5M_B; + digest[2] = MD5M_C; + digest[3] = MD5M_D; + + md5_transform (w0_t, w1_t, w2_t, w3_t, digest); + + rc4_next_16 (rc4_key, 16, j, digest, out); + + const u32x r0 = out[0]; + const u32x r1 = out[1]; + const u32x r2 = out[2]; + const u32x r3 = out[3]; + + #include VECT_COMPARE_M + } +} + +extern "C" __global__ void __launch_bounds__ (64, 1) m09710_m08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const oldoffice01_t *oldoffice01_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (64, 1) m09710_m16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const oldoffice01_t *oldoffice01_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (64, 1) m09710_s04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const oldoffice01_t *oldoffice01_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + __shared__ RC4_KEY rc4_keys[64]; + + RC4_KEY *rc4_key = &rc4_keys[lid]; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, c_combs[0].pw_len); + } + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * esalt + */ + + const u32 version = oldoffice01_bufs[salt_pos].version; + + u32 encryptedVerifier[4]; + + encryptedVerifier[0] = oldoffice01_bufs[salt_pos].encryptedVerifier[0]; + encryptedVerifier[1] = oldoffice01_bufs[salt_pos].encryptedVerifier[1]; + encryptedVerifier[2] = oldoffice01_bufs[salt_pos].encryptedVerifier[2]; + encryptedVerifier[3] = oldoffice01_bufs[salt_pos].encryptedVerifier[3]; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + u32 wordr0[4]; + + wordr0[0] = c_combs[il_pos].i[0]; + wordr0[1] = c_combs[il_pos].i[1]; + wordr0[2] = c_combs[il_pos].i[2]; + wordr0[3] = c_combs[il_pos].i[3]; + + u32 wordr1[4]; + + wordr1[0] = c_combs[il_pos].i[4]; + wordr1[1] = c_combs[il_pos].i[5]; + wordr1[2] = c_combs[il_pos].i[6]; + wordr1[3] = c_combs[il_pos].i[7]; + + u32 wordr2[4]; + + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + + u32 wordr3[4]; + + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + // first md5 to generate RC4 128 bit key + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + w0_t[0] = wordl0[0] | wordr0[0]; + w0_t[1] = (wordl0[1] | wordr0[1]) & 0xff; + w0_t[2] = 0x8000; + w0_t[3] = 0; + w1_t[0] = 0; + w1_t[1] = 0; + w1_t[2] = 0; + w1_t[3] = 0; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 9 * 8; + w3_t[3] = 0; + + u32x digest[4]; + + digest[0] = MD5M_A; + digest[1] = MD5M_B; + digest[2] = MD5M_C; + digest[3] = MD5M_D; + + md5_transform (w0_t, w1_t, w2_t, w3_t, digest); + + // now the RC4 part + + u32x key[4]; + + key[0] = digest[0]; + key[1] = digest[1]; + key[2] = digest[2]; + key[3] = digest[3]; + + rc4_init_16 (rc4_key, key); + + u32x out[4]; + + u8 j = rc4_next_16 (rc4_key, 0, 0, encryptedVerifier, out); + + w0_t[0] = out[0]; + w0_t[1] = out[1]; + w0_t[2] = out[2]; + w0_t[3] = out[3]; + w1_t[0] = 0x80; + w1_t[1] = 0; + w1_t[2] = 0; + w1_t[3] = 0; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 16 * 8; + w3_t[3] = 0; + + digest[0] = MD5M_A; + digest[1] = MD5M_B; + digest[2] = MD5M_C; + digest[3] = MD5M_D; + + md5_transform (w0_t, w1_t, w2_t, w3_t, digest); + + rc4_next_16 (rc4_key, 16, j, digest, out); + + const u32x r0 = out[0]; + const u32x r1 = out[1]; + const u32x r2 = out[2]; + const u32x r3 = out[3]; + + #include VECT_COMPARE_S + } +} + +extern "C" __global__ void __launch_bounds__ (64, 1) m09710_s08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const oldoffice01_t *oldoffice01_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (64, 1) m09710_s16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const oldoffice01_t *oldoffice01_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/nv/m09710_a3.cu b/nv/m09710_a3.cu new file mode 100644 index 0000000000..6480bf5498 --- /dev/null +++ b/nv/m09710_a3.cu @@ -0,0 +1,618 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _OLDOFFICE01_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW2 +#define VECT_SIZE1 +#endif + +#define DGST_R0 0 +#define DGST_R1 1 +#define DGST_R2 2 +#define DGST_R3 3 + +#include "include/kernel_functions.c" +#include "types_nv.c" +#include "common_nv.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +typedef struct +{ + u8 S[256]; + + u32 wtf_its_faster; + +} RC4_KEY; + +__device__ static void swap (RC4_KEY *rc4_key, const u8 i, const u8 j) +{ + u8 tmp; + + tmp = rc4_key->S[i]; + rc4_key->S[i] = rc4_key->S[j]; + rc4_key->S[j] = tmp; +} + +__device__ static void rc4_init_16 (RC4_KEY *rc4_key, const u32 data[4]) +{ + u32 v = 0x03020100; + u32 a = 0x04040404; + + u32 *ptr = (u32 *) rc4_key->S; + + #pragma unroll 64 + for (u32 i = 0; i < 64; i++) + { + *ptr++ = v; v += a; + } + + u32 j = 0; + + for (u32 i = 0; i < 16; i++) + { + u32 idx = i * 16; + + u32 v; + + v = data[0]; + + j += rc4_key->S[idx] + (v >> 0); swap (rc4_key, idx, j); idx++; + j += rc4_key->S[idx] + (v >> 8); swap (rc4_key, idx, j); idx++; + j += rc4_key->S[idx] + (v >> 16); swap (rc4_key, idx, j); idx++; + j += rc4_key->S[idx] + (v >> 24); swap (rc4_key, idx, j); idx++; + + v = data[1]; + + j += rc4_key->S[idx] + (v >> 0); swap (rc4_key, idx, j); idx++; + j += rc4_key->S[idx] + (v >> 8); swap (rc4_key, idx, j); idx++; + j += rc4_key->S[idx] + (v >> 16); swap (rc4_key, idx, j); idx++; + j += rc4_key->S[idx] + (v >> 24); swap (rc4_key, idx, j); idx++; + + v = data[2]; + + j += rc4_key->S[idx] + (v >> 0); swap (rc4_key, idx, j); idx++; + j += rc4_key->S[idx] + (v >> 8); swap (rc4_key, idx, j); idx++; + j += rc4_key->S[idx] + (v >> 16); swap (rc4_key, idx, j); idx++; + j += rc4_key->S[idx] + (v >> 24); swap (rc4_key, idx, j); idx++; + + v = data[3]; + + j += rc4_key->S[idx] + (v >> 0); swap (rc4_key, idx, j); idx++; + j += rc4_key->S[idx] + (v >> 8); swap (rc4_key, idx, j); idx++; + j += rc4_key->S[idx] + (v >> 16); swap (rc4_key, idx, j); idx++; + j += rc4_key->S[idx] + (v >> 24); swap (rc4_key, idx, j); idx++; + } +} + +__device__ static u8 rc4_next_16 (RC4_KEY *rc4_key, u8 i, u8 j, const u32 in[4], u32 out[4]) +{ + for (u32 k = 0; k < 4; k++) + { + u32 xor4 = 0; + + u8 idx; + + i += 1; + j += rc4_key->S[i]; + + swap (rc4_key, i, j); + + idx = rc4_key->S[i] + rc4_key->S[j]; + + xor4 |= rc4_key->S[idx] << 0; + + i += 1; + j += rc4_key->S[i]; + + swap (rc4_key, i, j); + + idx = rc4_key->S[i] + rc4_key->S[j]; + + xor4 |= rc4_key->S[idx] << 8; + + i += 1; + j += rc4_key->S[i]; + + swap (rc4_key, i, j); + + idx = rc4_key->S[i] + rc4_key->S[j]; + + xor4 |= rc4_key->S[idx] << 16; + + i += 1; + j += rc4_key->S[i]; + + swap (rc4_key, i, j); + + idx = rc4_key->S[i] + rc4_key->S[j]; + + xor4 |= rc4_key->S[idx] << 24; + + out[k] = in[k] ^ xor4; + } + + return j; +} + +__device__ static void md5_transform (const u32x w0[4], const u32x w1[4], const u32x w2[4], const u32x w3[4], u32x digest[4]) +{ + u32x a = digest[0]; + u32x b = digest[1]; + u32x c = digest[2]; + u32x d = digest[3]; + + u32x w0_t = w0[0]; + u32x w1_t = w0[1]; + u32x w2_t = w0[2]; + u32x w3_t = w0[3]; + u32x w4_t = w1[0]; + u32x w5_t = w1[1]; + u32x w6_t = w1[2]; + u32x w7_t = w1[3]; + u32x w8_t = w2[0]; + u32x w9_t = w2[1]; + u32x wa_t = w2[2]; + u32x wb_t = w2[3]; + u32x wc_t = w3[0]; + u32x wd_t = w3[1]; + u32x we_t = w3[2]; + u32x wf_t = w3[3]; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t, MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t, MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t, MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t, MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w4_t, MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w5_t, MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w6_t, MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w7_t, MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w8_t, MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w9_t, MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, wa_t, MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, wb_t, MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, wc_t, MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, wd_t, MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, we_t, MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, wf_t, MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w1_t, MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w6_t, MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, wb_t, MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t, MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w5_t, MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, wa_t, MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, wf_t, MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w4_t, MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w9_t, MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, we_t, MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t, MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w8_t, MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, wd_t, MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t, MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w7_t, MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, wc_t, MD5C1f, MD5S13); + + MD5_STEP (MD5_H , a, b, c, d, w5_t, MD5C20, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w8_t, MD5C21, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, wb_t, MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, we_t, MD5C23, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w1_t, MD5C24, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w4_t, MD5C25, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w7_t, MD5C26, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, wa_t, MD5C27, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, wd_t, MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w0_t, MD5C29, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w3_t, MD5C2a, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w6_t, MD5C2b, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w9_t, MD5C2c, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, wc_t, MD5C2d, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, wf_t, MD5C2e, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w2_t, MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t, MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w7_t, MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, we_t, MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w5_t, MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, wc_t, MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t, MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, wa_t, MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t, MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w8_t, MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, wf_t, MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w6_t, MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, wd_t, MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w4_t, MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, wb_t, MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t, MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w9_t, MD5C3f, MD5S33); + + digest[0] += a; + digest[1] += b; + digest[2] += c; + digest[3] += d; +} + +__device__ __constant__ bf_t c_bfs[1024]; + +__device__ static void m09710m (RC4_KEY rc4_keys[64], u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], const u32 pw_len, const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const u32x *bfs_buf, void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const oldoffice01_t *oldoffice01_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset) +{ + /** + * modifier + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + const u32 lid = threadIdx.x; + + RC4_KEY *rc4_key = &rc4_keys[lid]; + + /** + * esalt + */ + + const u32 version = oldoffice01_bufs[salt_pos].version; + + u32 encryptedVerifier[4]; + + encryptedVerifier[0] = oldoffice01_bufs[salt_pos].encryptedVerifier[0]; + encryptedVerifier[1] = oldoffice01_bufs[salt_pos].encryptedVerifier[1]; + encryptedVerifier[2] = oldoffice01_bufs[salt_pos].encryptedVerifier[2]; + encryptedVerifier[3] = oldoffice01_bufs[salt_pos].encryptedVerifier[3]; + + /** + * loop + */ + + u32x w0l = w0[0]; + + for (u32 il_pos = 0; il_pos < bfs_cnt; il_pos++) + { + const u32 w0r = c_bfs[il_pos].i; + + w0[0] = w0l | w0r; + + // first md5 to generate RC4 128 bit key + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + w0_t[0] = w0[0]; + w0_t[1] = w0[1] & 0xff; + w0_t[2] = 0x8000; + w0_t[3] = 0; + w1_t[0] = 0; + w1_t[1] = 0; + w1_t[2] = 0; + w1_t[3] = 0; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 9 * 8; + w3_t[3] = 0; + + u32x digest[4]; + + digest[0] = MD5M_A; + digest[1] = MD5M_B; + digest[2] = MD5M_C; + digest[3] = MD5M_D; + + md5_transform (w0_t, w1_t, w2_t, w3_t, digest); + + // now the RC4 part + + u32x key[4]; + + key[0] = digest[0]; + key[1] = digest[1]; + key[2] = digest[2]; + key[3] = digest[3]; + + rc4_init_16 (rc4_key, key); + + u32x out[4]; + + u8 j = rc4_next_16 (rc4_key, 0, 0, encryptedVerifier, out); + + w0_t[0] = out[0]; + w0_t[1] = out[1]; + w0_t[2] = out[2]; + w0_t[3] = out[3]; + w1_t[0] = 0x80; + w1_t[1] = 0; + w1_t[2] = 0; + w1_t[3] = 0; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 16 * 8; + w3_t[3] = 0; + + digest[0] = MD5M_A; + digest[1] = MD5M_B; + digest[2] = MD5M_C; + digest[3] = MD5M_D; + + md5_transform (w0_t, w1_t, w2_t, w3_t, digest); + + rc4_next_16 (rc4_key, 16, j, digest, out); + + const u32x r0 = out[0]; + const u32x r1 = out[1]; + const u32x r2 = out[2]; + const u32x r3 = out[3]; + + #include VECT_COMPARE_M + } +} + +__device__ static void m09710s (RC4_KEY rc4_keys[64], u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], const u32 pw_len, const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const u32x *bfs_buf, void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const oldoffice01_t *oldoffice01_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset) +{ + /** + * modifier + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + const u32 lid = threadIdx.x; + + RC4_KEY *rc4_key = &rc4_keys[lid]; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * esalt + */ + + const u32 version = oldoffice01_bufs[salt_pos].version; + + u32 encryptedVerifier[4]; + + encryptedVerifier[0] = oldoffice01_bufs[salt_pos].encryptedVerifier[0]; + encryptedVerifier[1] = oldoffice01_bufs[salt_pos].encryptedVerifier[1]; + encryptedVerifier[2] = oldoffice01_bufs[salt_pos].encryptedVerifier[2]; + encryptedVerifier[3] = oldoffice01_bufs[salt_pos].encryptedVerifier[3]; + + /** + * loop + */ + + u32x w0l = w0[0]; + + for (u32 il_pos = 0; il_pos < bfs_cnt; il_pos++) + { + const u32 w0r = c_bfs[il_pos].i; + + w0[0] = w0l | w0r; + + // first md5 to generate RC4 128 bit key + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + w0_t[0] = w0[0]; + w0_t[1] = w0[1] & 0xff; + w0_t[2] = 0x8000; + w0_t[3] = 0; + w1_t[0] = 0; + w1_t[1] = 0; + w1_t[2] = 0; + w1_t[3] = 0; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 9 * 8; + w3_t[3] = 0; + + u32x digest[4]; + + digest[0] = MD5M_A; + digest[1] = MD5M_B; + digest[2] = MD5M_C; + digest[3] = MD5M_D; + + md5_transform (w0_t, w1_t, w2_t, w3_t, digest); + + // now the RC4 part + + u32x key[4]; + + key[0] = digest[0]; + key[1] = digest[1]; + key[2] = digest[2]; + key[3] = digest[3]; + + rc4_init_16 (rc4_key, key); + + u32x out[4]; + + u8 j = rc4_next_16 (rc4_key, 0, 0, encryptedVerifier, out); + + w0_t[0] = out[0]; + w0_t[1] = out[1]; + w0_t[2] = out[2]; + w0_t[3] = out[3]; + w1_t[0] = 0x80; + w1_t[1] = 0; + w1_t[2] = 0; + w1_t[3] = 0; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 16 * 8; + w3_t[3] = 0; + + digest[0] = MD5M_A; + digest[1] = MD5M_B; + digest[2] = MD5M_C; + digest[3] = MD5M_D; + + md5_transform (w0_t, w1_t, w2_t, w3_t, digest); + + rc4_next_16 (rc4_key, 16, j, digest, out); + + const u32x r0 = out[0]; + const u32x r1 = out[1]; + const u32x r2 = out[2]; + const u32x r3 = out[3]; + + #include VECT_COMPARE_S + } +} + +extern "C" __global__ void __launch_bounds__ (64, 1) m09710_m04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const u32x *bfs_buf, void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const oldoffice01_t *oldoffice01_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + __shared__ RC4_KEY rc4_keys[64]; + + m09710m (rc4_keys, w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, oldoffice01_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (64, 1) m09710_m08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const u32x *bfs_buf, void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const oldoffice01_t *oldoffice01_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (64, 1) m09710_m16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const u32x *bfs_buf, void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const oldoffice01_t *oldoffice01_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (64, 1) m09710_s04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const u32x *bfs_buf, void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const oldoffice01_t *oldoffice01_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + __shared__ RC4_KEY rc4_keys[64]; + + m09710s (rc4_keys, w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, oldoffice01_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (64, 1) m09710_s08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const u32x *bfs_buf, void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const oldoffice01_t *oldoffice01_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (64, 1) m09710_s16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const u32x *bfs_buf, void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const oldoffice01_t *oldoffice01_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/nv/m09720_a0.cu b/nv/m09720_a0.cu new file mode 100644 index 0000000000..7ba1648761 --- /dev/null +++ b/nv/m09720_a0.cu @@ -0,0 +1,762 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _OLDOFFICE01_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW2 +#define VECT_SIZE1 +#endif + +#define DGST_R0 0 +#define DGST_R1 1 +#define DGST_R2 2 +#define DGST_R3 3 + +#include "include/kernel_functions.c" +#include "types_nv.c" +#include "common_nv.c" +#include "include/rp_gpu.h" +#include "rp_nv.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +__device__ static void md5_transform (const u32x w0[4], const u32x w1[4], const u32x w2[4], const u32x w3[4], u32x digest[4]) +{ + u32x a = digest[0]; + u32x b = digest[1]; + u32x c = digest[2]; + u32x d = digest[3]; + + u32x w0_t = w0[0]; + u32x w1_t = w0[1]; + u32x w2_t = w0[2]; + u32x w3_t = w0[3]; + u32x w4_t = w1[0]; + u32x w5_t = w1[1]; + u32x w6_t = w1[2]; + u32x w7_t = w1[3]; + u32x w8_t = w2[0]; + u32x w9_t = w2[1]; + u32x wa_t = w2[2]; + u32x wb_t = w2[3]; + u32x wc_t = w3[0]; + u32x wd_t = w3[1]; + u32x we_t = w3[2]; + u32x wf_t = w3[3]; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t, MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t, MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t, MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t, MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w4_t, MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w5_t, MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w6_t, MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w7_t, MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w8_t, MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w9_t, MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, wa_t, MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, wb_t, MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, wc_t, MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, wd_t, MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, we_t, MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, wf_t, MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w1_t, MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w6_t, MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, wb_t, MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t, MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w5_t, MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, wa_t, MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, wf_t, MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w4_t, MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w9_t, MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, we_t, MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t, MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w8_t, MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, wd_t, MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t, MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w7_t, MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, wc_t, MD5C1f, MD5S13); + + MD5_STEP (MD5_H , a, b, c, d, w5_t, MD5C20, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w8_t, MD5C21, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, wb_t, MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, we_t, MD5C23, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w1_t, MD5C24, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w4_t, MD5C25, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w7_t, MD5C26, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, wa_t, MD5C27, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, wd_t, MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w0_t, MD5C29, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w3_t, MD5C2a, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w6_t, MD5C2b, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w9_t, MD5C2c, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, wc_t, MD5C2d, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, wf_t, MD5C2e, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w2_t, MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t, MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w7_t, MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, we_t, MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w5_t, MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, wc_t, MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t, MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, wa_t, MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t, MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w8_t, MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, wf_t, MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w6_t, MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, wd_t, MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w4_t, MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, wb_t, MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t, MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w9_t, MD5C3f, MD5S33); + + digest[0] += a; + digest[1] += b; + digest[2] += c; + digest[3] += d; +} + +__device__ static void gen336 (u32x digest_pre[4], u32 salt_buf[4], u32x digest[4]) +{ + u32x digest_t0[2]; + u32x digest_t1[2]; + u32x digest_t2[2]; + u32x digest_t3[2]; + + digest_t0[0] = digest_pre[0]; + digest_t0[1] = digest_pre[1] & 0xff; + + digest_t1[0] = digest_pre[0] << 8; + digest_t1[1] = digest_pre[0] >> 24 | digest_pre[1] << 8; + + digest_t2[0] = digest_pre[0] << 16; + digest_t2[1] = digest_pre[0] >> 16 | digest_pre[1] << 16; + + digest_t3[0] = digest_pre[0] << 24; + digest_t3[1] = digest_pre[0] >> 8 | digest_pre[1] << 24; + + u32 salt_buf_t0[4]; + u32 salt_buf_t1[5]; + u32 salt_buf_t2[5]; + u32 salt_buf_t3[5]; + + salt_buf_t0[0] = salt_buf[0]; + salt_buf_t0[1] = salt_buf[1]; + salt_buf_t0[2] = salt_buf[2]; + salt_buf_t0[3] = salt_buf[3]; + + salt_buf_t1[0] = salt_buf[0] << 8; + salt_buf_t1[1] = salt_buf[0] >> 24 | salt_buf[1] << 8; + salt_buf_t1[2] = salt_buf[1] >> 24 | salt_buf[2] << 8; + salt_buf_t1[3] = salt_buf[2] >> 24 | salt_buf[3] << 8; + salt_buf_t1[4] = salt_buf[3] >> 24; + + salt_buf_t2[0] = salt_buf[0] << 16; + salt_buf_t2[1] = salt_buf[0] >> 16 | salt_buf[1] << 16; + salt_buf_t2[2] = salt_buf[1] >> 16 | salt_buf[2] << 16; + salt_buf_t2[3] = salt_buf[2] >> 16 | salt_buf[3] << 16; + salt_buf_t2[4] = salt_buf[3] >> 16; + + salt_buf_t3[0] = salt_buf[0] << 24; + salt_buf_t3[1] = salt_buf[0] >> 8 | salt_buf[1] << 24; + salt_buf_t3[2] = salt_buf[1] >> 8 | salt_buf[2] << 24; + salt_buf_t3[3] = salt_buf[2] >> 8 | salt_buf[3] << 24; + salt_buf_t3[4] = salt_buf[3] >> 8; + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + // generate the 16 * 21 buffer + + w0_t[0] = 0; + w0_t[1] = 0; + w0_t[2] = 0; + w0_t[3] = 0; + w1_t[0] = 0; + w1_t[1] = 0; + w1_t[2] = 0; + w1_t[3] = 0; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = 0; + + // 0..5 + w0_t[0] = digest_t0[0]; + w0_t[1] = digest_t0[1]; + + // 5..21 + w0_t[1] |= salt_buf_t1[0]; + w0_t[2] = salt_buf_t1[1]; + w0_t[3] = salt_buf_t1[2]; + w1_t[0] = salt_buf_t1[3]; + w1_t[1] = salt_buf_t1[4]; + + // 21..26 + w1_t[1] |= digest_t1[0]; + w1_t[2] = digest_t1[1]; + + // 26..42 + w1_t[2] |= salt_buf_t2[0]; + w1_t[3] = salt_buf_t2[1]; + w2_t[0] = salt_buf_t2[2]; + w2_t[1] = salt_buf_t2[3]; + w2_t[2] = salt_buf_t2[4]; + + // 42..47 + w2_t[2] |= digest_t2[0]; + w2_t[3] = digest_t2[1]; + + // 47..63 + w2_t[3] |= salt_buf_t3[0]; + w3_t[0] = salt_buf_t3[1]; + w3_t[1] = salt_buf_t3[2]; + w3_t[2] = salt_buf_t3[3]; + w3_t[3] = salt_buf_t3[4]; + + // 63.. + + w3_t[3] |= digest_t3[0]; + + md5_transform (w0_t, w1_t, w2_t, w3_t, digest); + + w0_t[0] = 0; + w0_t[1] = 0; + w0_t[2] = 0; + w0_t[3] = 0; + w1_t[0] = 0; + w1_t[1] = 0; + w1_t[2] = 0; + w1_t[3] = 0; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = 0; + + // 0..4 + w0_t[0] = digest_t3[1]; + + // 4..20 + w0_t[1] = salt_buf_t0[0]; + w0_t[2] = salt_buf_t0[1]; + w0_t[3] = salt_buf_t0[2]; + w1_t[0] = salt_buf_t0[3]; + + // 20..25 + w1_t[1] = digest_t0[0]; + w1_t[2] = digest_t0[1]; + + // 25..41 + w1_t[2] |= salt_buf_t1[0]; + w1_t[3] = salt_buf_t1[1]; + w2_t[0] = salt_buf_t1[2]; + w2_t[1] = salt_buf_t1[3]; + w2_t[2] = salt_buf_t1[4]; + + // 41..46 + w2_t[2] |= digest_t1[0]; + w2_t[3] = digest_t1[1]; + + // 46..62 + w2_t[3] |= salt_buf_t2[0]; + w3_t[0] = salt_buf_t2[1]; + w3_t[1] = salt_buf_t2[2]; + w3_t[2] = salt_buf_t2[3]; + w3_t[3] = salt_buf_t2[4]; + + // 62.. + w3_t[3] |= digest_t2[0]; + + md5_transform (w0_t, w1_t, w2_t, w3_t, digest); + + w0_t[0] = 0; + w0_t[1] = 0; + w0_t[2] = 0; + w0_t[3] = 0; + w1_t[0] = 0; + w1_t[1] = 0; + w1_t[2] = 0; + w1_t[3] = 0; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = 0; + + // 0..3 + w0_t[0] = digest_t2[1]; + + // 3..19 + w0_t[0] |= salt_buf_t3[0]; + w0_t[1] = salt_buf_t3[1]; + w0_t[2] = salt_buf_t3[2]; + w0_t[3] = salt_buf_t3[3]; + w1_t[0] = salt_buf_t3[4]; + + // 19..24 + w1_t[0] |= digest_t3[0]; + w1_t[1] = digest_t3[1]; + + // 24..40 + w1_t[2] = salt_buf_t0[0]; + w1_t[3] = salt_buf_t0[1]; + w2_t[0] = salt_buf_t0[2]; + w2_t[1] = salt_buf_t0[3]; + + // 40..45 + w2_t[2] = digest_t0[0]; + w2_t[3] = digest_t0[1]; + + // 45..61 + w2_t[3] |= salt_buf_t1[0]; + w3_t[0] = salt_buf_t1[1]; + w3_t[1] = salt_buf_t1[2]; + w3_t[2] = salt_buf_t1[3]; + w3_t[3] = salt_buf_t1[4]; + + // 61.. + w3_t[3] |= digest_t1[0]; + + md5_transform (w0_t, w1_t, w2_t, w3_t, digest); + + w0_t[0] = 0; + w0_t[1] = 0; + w0_t[2] = 0; + w0_t[3] = 0; + w1_t[0] = 0; + w1_t[1] = 0; + w1_t[2] = 0; + w1_t[3] = 0; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = 0; + + // 0..2 + w0_t[0] = digest_t1[1]; + + // 2..18 + w0_t[0] |= salt_buf_t2[0]; + w0_t[1] = salt_buf_t2[1]; + w0_t[2] = salt_buf_t2[2]; + w0_t[3] = salt_buf_t2[3]; + w1_t[0] = salt_buf_t2[4]; + + // 18..23 + w1_t[0] |= digest_t2[0]; + w1_t[1] = digest_t2[1]; + + // 23..39 + w1_t[1] |= salt_buf_t3[0]; + w1_t[2] = salt_buf_t3[1]; + w1_t[3] = salt_buf_t3[2]; + w2_t[0] = salt_buf_t3[3]; + w2_t[1] = salt_buf_t3[4]; + + // 39..44 + w2_t[1] |= digest_t3[0]; + w2_t[2] = digest_t3[1]; + + // 44..60 + w2_t[3] = salt_buf_t0[0]; + w3_t[0] = salt_buf_t0[1]; + w3_t[1] = salt_buf_t0[2]; + w3_t[2] = salt_buf_t0[3]; + + // 60.. + w3_t[3] = digest_t0[0]; + + md5_transform (w0_t, w1_t, w2_t, w3_t, digest); + + w0_t[0] = 0; + w0_t[1] = 0; + w0_t[2] = 0; + w0_t[3] = 0; + w1_t[0] = 0; + w1_t[1] = 0; + w1_t[2] = 0; + w1_t[3] = 0; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = 0; + + // 0..1 + w0_t[0] = digest_t0[1]; + + // 1..17 + w0_t[0] |= salt_buf_t1[0]; + w0_t[1] = salt_buf_t1[1]; + w0_t[2] = salt_buf_t1[2]; + w0_t[3] = salt_buf_t1[3]; + w1_t[0] = salt_buf_t1[4]; + + // 17..22 + w1_t[0] |= digest_t1[0]; + w1_t[1] = digest_t1[1]; + + // 22..38 + w1_t[1] |= salt_buf_t2[0]; + w1_t[2] = salt_buf_t2[1]; + w1_t[3] = salt_buf_t2[2]; + w2_t[0] = salt_buf_t2[3]; + w2_t[1] = salt_buf_t2[4]; + + // 38..43 + w2_t[1] |= digest_t2[0]; + w2_t[2] = digest_t2[1]; + + // 43..59 + w2_t[2] |= salt_buf_t3[0]; + w2_t[3] = salt_buf_t3[1]; + w3_t[0] = salt_buf_t3[2]; + w3_t[1] = salt_buf_t3[3]; + w3_t[2] = salt_buf_t3[4]; + + // 59.. + w3_t[2] |= digest_t3[0]; + w3_t[3] = digest_t3[1]; + + md5_transform (w0_t, w1_t, w2_t, w3_t, digest); + + w0_t[0] = salt_buf_t0[0]; + w0_t[1] = salt_buf_t0[1]; + w0_t[2] = salt_buf_t0[2]; + w0_t[3] = salt_buf_t0[3]; + w1_t[0] = 0x80; + w1_t[1] = 0; + w1_t[2] = 0; + w1_t[3] = 0; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 21 * 16 * 8; + w3_t[3] = 0; + + md5_transform (w0_t, w1_t, w2_t, w3_t, digest); +} + +__device__ __constant__ gpu_rule_t c_rules[1024]; + +extern "C" __global__ void __launch_bounds__ (256, 1) m09720_m04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const oldoffice01_t *oldoffice01_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + u32x pw_buf1[4]; + + pw_buf1[0] = pws[gid].i[ 4]; + pw_buf1[1] = pws[gid].i[ 5]; + pw_buf1[2] = pws[gid].i[ 6]; + pw_buf1[3] = pws[gid].i[ 7]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * salt + */ + + u32 salt_buf[4]; + + salt_buf[0] = salt_bufs[salt_pos].salt_buf[0]; + salt_buf[1] = salt_bufs[salt_pos].salt_buf[1]; + salt_buf[2] = salt_bufs[salt_pos].salt_buf[2]; + salt_buf[3] = salt_bufs[salt_pos].salt_buf[3]; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + + w0[0] = pw_buf0[0]; + w0[1] = pw_buf0[1]; + w0[2] = pw_buf0[2]; + w0[3] = pw_buf0[3]; + + u32x w1[4]; + + w1[0] = pw_buf1[0]; + w1[1] = pw_buf1[1]; + w1[2] = pw_buf1[2]; + w1[3] = pw_buf1[3]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 out_len = apply_rules (c_rules[il_pos].cmds, w0, w1, pw_len); + + append_0x80_2 (w0, w1, out_len); + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + make_unicode (w0, w0_t, w1_t); + make_unicode (w1, w2_t, w3_t); + + w3_t[2] = out_len * 8 * 2; + + u32x digest_pre[4]; + + digest_pre[0] = MD5M_A; + digest_pre[1] = MD5M_B; + digest_pre[2] = MD5M_C; + digest_pre[3] = MD5M_D; + + md5_transform (w0_t, w1_t, w2_t, w3_t, digest_pre); + + digest_pre[0] &= 0xffffffff; + digest_pre[1] &= 0x000000ff; + digest_pre[2] &= 0x00000000; + digest_pre[3] &= 0x00000000; + + u32x digest[4]; + + digest[0] = MD5M_A; + digest[1] = MD5M_B; + digest[2] = MD5M_C; + digest[3] = MD5M_D; + + gen336 (digest_pre, salt_buf, digest); + + u32x a = digest[0]; + u32x b = digest[1] & 0xff; + + const u32x r0 = a; + const u32x r1 = b; + const u32x r2 = 0; + const u32x r3 = 0; + + #include VECT_COMPARE_M + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m09720_m08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const oldoffice01_t *oldoffice01_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m09720_m16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const oldoffice01_t *oldoffice01_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m09720_s04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const oldoffice01_t *oldoffice01_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + u32x pw_buf1[4]; + + pw_buf1[0] = pws[gid].i[ 4]; + pw_buf1[1] = pws[gid].i[ 5]; + pw_buf1[2] = pws[gid].i[ 6]; + pw_buf1[3] = pws[gid].i[ 7]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * salt + */ + + u32 salt_buf[4]; + + salt_buf[0] = salt_bufs[salt_pos].salt_buf[0]; + salt_buf[1] = salt_bufs[salt_pos].salt_buf[1]; + salt_buf[2] = salt_bufs[salt_pos].salt_buf[2]; + salt_buf[3] = salt_bufs[salt_pos].salt_buf[3]; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + + w0[0] = pw_buf0[0]; + w0[1] = pw_buf0[1]; + w0[2] = pw_buf0[2]; + w0[3] = pw_buf0[3]; + + u32x w1[4]; + + w1[0] = pw_buf1[0]; + w1[1] = pw_buf1[1]; + w1[2] = pw_buf1[2]; + w1[3] = pw_buf1[3]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 out_len = apply_rules (c_rules[il_pos].cmds, w0, w1, pw_len); + + append_0x80_2 (w0, w1, out_len); + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + make_unicode (w0, w0_t, w1_t); + make_unicode (w1, w2_t, w3_t); + + w3_t[2] = out_len * 8 * 2; + + u32x digest_pre[4]; + + digest_pre[0] = MD5M_A; + digest_pre[1] = MD5M_B; + digest_pre[2] = MD5M_C; + digest_pre[3] = MD5M_D; + + md5_transform (w0_t, w1_t, w2_t, w3_t, digest_pre); + + digest_pre[0] &= 0xffffffff; + digest_pre[1] &= 0x000000ff; + digest_pre[2] &= 0x00000000; + digest_pre[3] &= 0x00000000; + + u32x digest[4]; + + digest[0] = MD5M_A; + digest[1] = MD5M_B; + digest[2] = MD5M_C; + digest[3] = MD5M_D; + + gen336 (digest_pre, salt_buf, digest); + + u32x a = digest[0]; + u32x b = digest[1] & 0xff; + + const u32x r0 = a; + const u32x r1 = b; + const u32x r2 = 0; + const u32x r3 = 0; + + #include VECT_COMPARE_S + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m09720_s08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const oldoffice01_t *oldoffice01_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m09720_s16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const oldoffice01_t *oldoffice01_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/nv/m09720_a1.cu b/nv/m09720_a1.cu new file mode 100644 index 0000000000..157a7eb588 --- /dev/null +++ b/nv/m09720_a1.cu @@ -0,0 +1,873 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _OLDOFFICE01_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW2 +#define VECT_SIZE1 +#endif + +#define DGST_R0 0 +#define DGST_R1 1 +#define DGST_R2 2 +#define DGST_R3 3 + +#include "include/kernel_functions.c" +#include "types_nv.c" +#include "common_nv.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +__device__ static void md5_transform (const u32x w0[4], const u32x w1[4], const u32x w2[4], const u32x w3[4], u32x digest[4]) +{ + u32x a = digest[0]; + u32x b = digest[1]; + u32x c = digest[2]; + u32x d = digest[3]; + + u32x w0_t = w0[0]; + u32x w1_t = w0[1]; + u32x w2_t = w0[2]; + u32x w3_t = w0[3]; + u32x w4_t = w1[0]; + u32x w5_t = w1[1]; + u32x w6_t = w1[2]; + u32x w7_t = w1[3]; + u32x w8_t = w2[0]; + u32x w9_t = w2[1]; + u32x wa_t = w2[2]; + u32x wb_t = w2[3]; + u32x wc_t = w3[0]; + u32x wd_t = w3[1]; + u32x we_t = w3[2]; + u32x wf_t = w3[3]; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t, MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t, MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t, MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t, MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w4_t, MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w5_t, MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w6_t, MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w7_t, MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w8_t, MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w9_t, MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, wa_t, MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, wb_t, MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, wc_t, MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, wd_t, MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, we_t, MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, wf_t, MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w1_t, MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w6_t, MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, wb_t, MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t, MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w5_t, MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, wa_t, MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, wf_t, MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w4_t, MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w9_t, MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, we_t, MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t, MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w8_t, MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, wd_t, MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t, MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w7_t, MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, wc_t, MD5C1f, MD5S13); + + MD5_STEP (MD5_H , a, b, c, d, w5_t, MD5C20, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w8_t, MD5C21, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, wb_t, MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, we_t, MD5C23, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w1_t, MD5C24, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w4_t, MD5C25, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w7_t, MD5C26, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, wa_t, MD5C27, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, wd_t, MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w0_t, MD5C29, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w3_t, MD5C2a, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w6_t, MD5C2b, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w9_t, MD5C2c, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, wc_t, MD5C2d, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, wf_t, MD5C2e, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w2_t, MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t, MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w7_t, MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, we_t, MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w5_t, MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, wc_t, MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t, MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, wa_t, MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t, MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w8_t, MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, wf_t, MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w6_t, MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, wd_t, MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w4_t, MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, wb_t, MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t, MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w9_t, MD5C3f, MD5S33); + + digest[0] += a; + digest[1] += b; + digest[2] += c; + digest[3] += d; +} + +__device__ static void gen336 (u32x digest_pre[4], u32 salt_buf[4], u32x digest[4]) +{ + u32x digest_t0[2]; + u32x digest_t1[2]; + u32x digest_t2[2]; + u32x digest_t3[2]; + + digest_t0[0] = digest_pre[0]; + digest_t0[1] = digest_pre[1] & 0xff; + + digest_t1[0] = digest_pre[0] << 8; + digest_t1[1] = digest_pre[0] >> 24 | digest_pre[1] << 8; + + digest_t2[0] = digest_pre[0] << 16; + digest_t2[1] = digest_pre[0] >> 16 | digest_pre[1] << 16; + + digest_t3[0] = digest_pre[0] << 24; + digest_t3[1] = digest_pre[0] >> 8 | digest_pre[1] << 24; + + u32 salt_buf_t0[4]; + u32 salt_buf_t1[5]; + u32 salt_buf_t2[5]; + u32 salt_buf_t3[5]; + + salt_buf_t0[0] = salt_buf[0]; + salt_buf_t0[1] = salt_buf[1]; + salt_buf_t0[2] = salt_buf[2]; + salt_buf_t0[3] = salt_buf[3]; + + salt_buf_t1[0] = salt_buf[0] << 8; + salt_buf_t1[1] = salt_buf[0] >> 24 | salt_buf[1] << 8; + salt_buf_t1[2] = salt_buf[1] >> 24 | salt_buf[2] << 8; + salt_buf_t1[3] = salt_buf[2] >> 24 | salt_buf[3] << 8; + salt_buf_t1[4] = salt_buf[3] >> 24; + + salt_buf_t2[0] = salt_buf[0] << 16; + salt_buf_t2[1] = salt_buf[0] >> 16 | salt_buf[1] << 16; + salt_buf_t2[2] = salt_buf[1] >> 16 | salt_buf[2] << 16; + salt_buf_t2[3] = salt_buf[2] >> 16 | salt_buf[3] << 16; + salt_buf_t2[4] = salt_buf[3] >> 16; + + salt_buf_t3[0] = salt_buf[0] << 24; + salt_buf_t3[1] = salt_buf[0] >> 8 | salt_buf[1] << 24; + salt_buf_t3[2] = salt_buf[1] >> 8 | salt_buf[2] << 24; + salt_buf_t3[3] = salt_buf[2] >> 8 | salt_buf[3] << 24; + salt_buf_t3[4] = salt_buf[3] >> 8; + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + // generate the 16 * 21 buffer + + w0_t[0] = 0; + w0_t[1] = 0; + w0_t[2] = 0; + w0_t[3] = 0; + w1_t[0] = 0; + w1_t[1] = 0; + w1_t[2] = 0; + w1_t[3] = 0; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = 0; + + // 0..5 + w0_t[0] = digest_t0[0]; + w0_t[1] = digest_t0[1]; + + // 5..21 + w0_t[1] |= salt_buf_t1[0]; + w0_t[2] = salt_buf_t1[1]; + w0_t[3] = salt_buf_t1[2]; + w1_t[0] = salt_buf_t1[3]; + w1_t[1] = salt_buf_t1[4]; + + // 21..26 + w1_t[1] |= digest_t1[0]; + w1_t[2] = digest_t1[1]; + + // 26..42 + w1_t[2] |= salt_buf_t2[0]; + w1_t[3] = salt_buf_t2[1]; + w2_t[0] = salt_buf_t2[2]; + w2_t[1] = salt_buf_t2[3]; + w2_t[2] = salt_buf_t2[4]; + + // 42..47 + w2_t[2] |= digest_t2[0]; + w2_t[3] = digest_t2[1]; + + // 47..63 + w2_t[3] |= salt_buf_t3[0]; + w3_t[0] = salt_buf_t3[1]; + w3_t[1] = salt_buf_t3[2]; + w3_t[2] = salt_buf_t3[3]; + w3_t[3] = salt_buf_t3[4]; + + // 63.. + + w3_t[3] |= digest_t3[0]; + + md5_transform (w0_t, w1_t, w2_t, w3_t, digest); + + w0_t[0] = 0; + w0_t[1] = 0; + w0_t[2] = 0; + w0_t[3] = 0; + w1_t[0] = 0; + w1_t[1] = 0; + w1_t[2] = 0; + w1_t[3] = 0; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = 0; + + // 0..4 + w0_t[0] = digest_t3[1]; + + // 4..20 + w0_t[1] = salt_buf_t0[0]; + w0_t[2] = salt_buf_t0[1]; + w0_t[3] = salt_buf_t0[2]; + w1_t[0] = salt_buf_t0[3]; + + // 20..25 + w1_t[1] = digest_t0[0]; + w1_t[2] = digest_t0[1]; + + // 25..41 + w1_t[2] |= salt_buf_t1[0]; + w1_t[3] = salt_buf_t1[1]; + w2_t[0] = salt_buf_t1[2]; + w2_t[1] = salt_buf_t1[3]; + w2_t[2] = salt_buf_t1[4]; + + // 41..46 + w2_t[2] |= digest_t1[0]; + w2_t[3] = digest_t1[1]; + + // 46..62 + w2_t[3] |= salt_buf_t2[0]; + w3_t[0] = salt_buf_t2[1]; + w3_t[1] = salt_buf_t2[2]; + w3_t[2] = salt_buf_t2[3]; + w3_t[3] = salt_buf_t2[4]; + + // 62.. + w3_t[3] |= digest_t2[0]; + + md5_transform (w0_t, w1_t, w2_t, w3_t, digest); + + w0_t[0] = 0; + w0_t[1] = 0; + w0_t[2] = 0; + w0_t[3] = 0; + w1_t[0] = 0; + w1_t[1] = 0; + w1_t[2] = 0; + w1_t[3] = 0; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = 0; + + // 0..3 + w0_t[0] = digest_t2[1]; + + // 3..19 + w0_t[0] |= salt_buf_t3[0]; + w0_t[1] = salt_buf_t3[1]; + w0_t[2] = salt_buf_t3[2]; + w0_t[3] = salt_buf_t3[3]; + w1_t[0] = salt_buf_t3[4]; + + // 19..24 + w1_t[0] |= digest_t3[0]; + w1_t[1] = digest_t3[1]; + + // 24..40 + w1_t[2] = salt_buf_t0[0]; + w1_t[3] = salt_buf_t0[1]; + w2_t[0] = salt_buf_t0[2]; + w2_t[1] = salt_buf_t0[3]; + + // 40..45 + w2_t[2] = digest_t0[0]; + w2_t[3] = digest_t0[1]; + + // 45..61 + w2_t[3] |= salt_buf_t1[0]; + w3_t[0] = salt_buf_t1[1]; + w3_t[1] = salt_buf_t1[2]; + w3_t[2] = salt_buf_t1[3]; + w3_t[3] = salt_buf_t1[4]; + + // 61.. + w3_t[3] |= digest_t1[0]; + + md5_transform (w0_t, w1_t, w2_t, w3_t, digest); + + w0_t[0] = 0; + w0_t[1] = 0; + w0_t[2] = 0; + w0_t[3] = 0; + w1_t[0] = 0; + w1_t[1] = 0; + w1_t[2] = 0; + w1_t[3] = 0; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = 0; + + // 0..2 + w0_t[0] = digest_t1[1]; + + // 2..18 + w0_t[0] |= salt_buf_t2[0]; + w0_t[1] = salt_buf_t2[1]; + w0_t[2] = salt_buf_t2[2]; + w0_t[3] = salt_buf_t2[3]; + w1_t[0] = salt_buf_t2[4]; + + // 18..23 + w1_t[0] |= digest_t2[0]; + w1_t[1] = digest_t2[1]; + + // 23..39 + w1_t[1] |= salt_buf_t3[0]; + w1_t[2] = salt_buf_t3[1]; + w1_t[3] = salt_buf_t3[2]; + w2_t[0] = salt_buf_t3[3]; + w2_t[1] = salt_buf_t3[4]; + + // 39..44 + w2_t[1] |= digest_t3[0]; + w2_t[2] = digest_t3[1]; + + // 44..60 + w2_t[3] = salt_buf_t0[0]; + w3_t[0] = salt_buf_t0[1]; + w3_t[1] = salt_buf_t0[2]; + w3_t[2] = salt_buf_t0[3]; + + // 60.. + w3_t[3] = digest_t0[0]; + + md5_transform (w0_t, w1_t, w2_t, w3_t, digest); + + w0_t[0] = 0; + w0_t[1] = 0; + w0_t[2] = 0; + w0_t[3] = 0; + w1_t[0] = 0; + w1_t[1] = 0; + w1_t[2] = 0; + w1_t[3] = 0; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = 0; + + // 0..1 + w0_t[0] = digest_t0[1]; + + // 1..17 + w0_t[0] |= salt_buf_t1[0]; + w0_t[1] = salt_buf_t1[1]; + w0_t[2] = salt_buf_t1[2]; + w0_t[3] = salt_buf_t1[3]; + w1_t[0] = salt_buf_t1[4]; + + // 17..22 + w1_t[0] |= digest_t1[0]; + w1_t[1] = digest_t1[1]; + + // 22..38 + w1_t[1] |= salt_buf_t2[0]; + w1_t[2] = salt_buf_t2[1]; + w1_t[3] = salt_buf_t2[2]; + w2_t[0] = salt_buf_t2[3]; + w2_t[1] = salt_buf_t2[4]; + + // 38..43 + w2_t[1] |= digest_t2[0]; + w2_t[2] = digest_t2[1]; + + // 43..59 + w2_t[2] |= salt_buf_t3[0]; + w2_t[3] = salt_buf_t3[1]; + w3_t[0] = salt_buf_t3[2]; + w3_t[1] = salt_buf_t3[3]; + w3_t[2] = salt_buf_t3[4]; + + // 59.. + w3_t[2] |= digest_t3[0]; + w3_t[3] = digest_t3[1]; + + md5_transform (w0_t, w1_t, w2_t, w3_t, digest); + + w0_t[0] = salt_buf_t0[0]; + w0_t[1] = salt_buf_t0[1]; + w0_t[2] = salt_buf_t0[2]; + w0_t[3] = salt_buf_t0[3]; + w1_t[0] = 0x80; + w1_t[1] = 0; + w1_t[2] = 0; + w1_t[3] = 0; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 21 * 16 * 8; + w3_t[3] = 0; + + md5_transform (w0_t, w1_t, w2_t, w3_t, digest); +} + +__device__ __constant__ comb_t c_combs[1024]; + +extern "C" __global__ void __launch_bounds__ (256, 1) m09720_m04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const oldoffice01_t *oldoffice01_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, c_combs[0].pw_len); + } + + /** + * salt + */ + + u32 salt_buf[4]; + + salt_buf[0] = salt_bufs[salt_pos].salt_buf[0]; + salt_buf[1] = salt_bufs[salt_pos].salt_buf[1]; + salt_buf[2] = salt_bufs[salt_pos].salt_buf[2]; + salt_buf[3] = salt_bufs[salt_pos].salt_buf[3]; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = c_combs[il_pos].pw_len; + + const u32 pw_len = pw_l_len + pw_r_len; + + u32 wordr0[4]; + + wordr0[0] = c_combs[il_pos].i[0]; + wordr0[1] = c_combs[il_pos].i[1]; + wordr0[2] = c_combs[il_pos].i[2]; + wordr0[3] = c_combs[il_pos].i[3]; + + u32 wordr1[4]; + + wordr1[0] = c_combs[il_pos].i[4]; + wordr1[1] = c_combs[il_pos].i[5]; + wordr1[2] = c_combs[il_pos].i[6]; + wordr1[3] = c_combs[il_pos].i[7]; + + u32 wordr2[4]; + + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + + u32 wordr3[4]; + + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + u32x w0[4]; + + w0[0] = wordl0[0] | wordr0[0]; + w0[1] = wordl0[1] | wordr0[1]; + w0[2] = wordl0[2] | wordr0[2]; + w0[3] = wordl0[3] | wordr0[3]; + + u32x w1[4]; + + w1[0] = wordl1[0] | wordr1[0]; + w1[1] = wordl1[1] | wordr1[1]; + w1[2] = wordl1[2] | wordr1[2]; + w1[3] = wordl1[3] | wordr1[3]; + + u32x w2[4]; + + w2[0] = wordl2[0] | wordr2[0]; + w2[1] = wordl2[1] | wordr2[1]; + w2[2] = wordl2[2] | wordr2[2]; + w2[3] = wordl2[3] | wordr2[3]; + + u32x w3[4]; + + w3[0] = wordl3[0] | wordr3[0]; + w3[1] = wordl3[1] | wordr3[1]; + w3[2] = 0; + w3[3] = 0; + + append_0x80_2 (w0, w1, pw_len); + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + make_unicode (w0, w0_t, w1_t); + make_unicode (w1, w2_t, w3_t); + + w3_t[2] = pw_len * 8 * 2; + + u32x digest_pre[4]; + + digest_pre[0] = MD5M_A; + digest_pre[1] = MD5M_B; + digest_pre[2] = MD5M_C; + digest_pre[3] = MD5M_D; + + md5_transform (w0_t, w1_t, w2_t, w3_t, digest_pre); + + digest_pre[0] &= 0xffffffff; + digest_pre[1] &= 0x000000ff; + digest_pre[2] &= 0x00000000; + digest_pre[3] &= 0x00000000; + + u32x digest[4]; + + digest[0] = MD5M_A; + digest[1] = MD5M_B; + digest[2] = MD5M_C; + digest[3] = MD5M_D; + + gen336 (digest_pre, salt_buf, digest); + + u32x a = digest[0]; + u32x b = digest[1] & 0xff; + + const u32x r0 = a; + const u32x r1 = b; + const u32x r2 = 0; + const u32x r3 = 0; + + #include VECT_COMPARE_M + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m09720_m08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const oldoffice01_t *oldoffice01_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m09720_m16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const oldoffice01_t *oldoffice01_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m09720_s04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const oldoffice01_t *oldoffice01_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, c_combs[0].pw_len); + } + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * salt + */ + + u32 salt_buf[4]; + + salt_buf[0] = salt_bufs[salt_pos].salt_buf[0]; + salt_buf[1] = salt_bufs[salt_pos].salt_buf[1]; + salt_buf[2] = salt_bufs[salt_pos].salt_buf[2]; + salt_buf[3] = salt_bufs[salt_pos].salt_buf[3]; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = c_combs[il_pos].pw_len; + + const u32 pw_len = pw_l_len + pw_r_len; + + u32 wordr0[4]; + + wordr0[0] = c_combs[il_pos].i[0]; + wordr0[1] = c_combs[il_pos].i[1]; + wordr0[2] = c_combs[il_pos].i[2]; + wordr0[3] = c_combs[il_pos].i[3]; + + u32 wordr1[4]; + + wordr1[0] = c_combs[il_pos].i[4]; + wordr1[1] = c_combs[il_pos].i[5]; + wordr1[2] = c_combs[il_pos].i[6]; + wordr1[3] = c_combs[il_pos].i[7]; + + u32 wordr2[4]; + + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + + u32 wordr3[4]; + + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + u32x w0[4]; + + w0[0] = wordl0[0] | wordr0[0]; + w0[1] = wordl0[1] | wordr0[1]; + w0[2] = wordl0[2] | wordr0[2]; + w0[3] = wordl0[3] | wordr0[3]; + + u32x w1[4]; + + w1[0] = wordl1[0] | wordr1[0]; + w1[1] = wordl1[1] | wordr1[1]; + w1[2] = wordl1[2] | wordr1[2]; + w1[3] = wordl1[3] | wordr1[3]; + + u32x w2[4]; + + w2[0] = wordl2[0] | wordr2[0]; + w2[1] = wordl2[1] | wordr2[1]; + w2[2] = wordl2[2] | wordr2[2]; + w2[3] = wordl2[3] | wordr2[3]; + + u32x w3[4]; + + w3[0] = wordl3[0] | wordr3[0]; + w3[1] = wordl3[1] | wordr3[1]; + w3[2] = 0; + w3[3] = 0; + + append_0x80_2 (w0, w1, pw_len); + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + make_unicode (w0, w0_t, w1_t); + make_unicode (w1, w2_t, w3_t); + + w3_t[2] = pw_len * 8 * 2; + + u32x digest_pre[4]; + + digest_pre[0] = MD5M_A; + digest_pre[1] = MD5M_B; + digest_pre[2] = MD5M_C; + digest_pre[3] = MD5M_D; + + md5_transform (w0_t, w1_t, w2_t, w3_t, digest_pre); + + digest_pre[0] &= 0xffffffff; + digest_pre[1] &= 0x000000ff; + digest_pre[2] &= 0x00000000; + digest_pre[3] &= 0x00000000; + + u32x digest[4]; + + digest[0] = MD5M_A; + digest[1] = MD5M_B; + digest[2] = MD5M_C; + digest[3] = MD5M_D; + + gen336 (digest_pre, salt_buf, digest); + + u32x a = digest[0]; + u32x b = digest[1] & 0xff; + + const u32x r0 = a; + const u32x r1 = b; + const u32x r2 = 0; + const u32x r3 = 0; + + #include VECT_COMPARE_S + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m09720_s08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const oldoffice01_t *oldoffice01_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m09720_s16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const oldoffice01_t *oldoffice01_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/nv/m09720_a3.cu b/nv/m09720_a3.cu new file mode 100644 index 0000000000..ae3955b5bc --- /dev/null +++ b/nv/m09720_a3.cu @@ -0,0 +1,952 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _OLDOFFICE01_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW2 +#define VECT_SIZE1 +#endif + +#define DGST_R0 0 +#define DGST_R1 1 +#define DGST_R2 2 +#define DGST_R3 3 + +#include "include/kernel_functions.c" +#include "types_nv.c" +#include "common_nv.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +__device__ static void md5_transform (const u32x w0[4], const u32x w1[4], const u32x w2[4], const u32x w3[4], u32x digest[4]) +{ + u32x a = digest[0]; + u32x b = digest[1]; + u32x c = digest[2]; + u32x d = digest[3]; + + u32x w0_t = w0[0]; + u32x w1_t = w0[1]; + u32x w2_t = w0[2]; + u32x w3_t = w0[3]; + u32x w4_t = w1[0]; + u32x w5_t = w1[1]; + u32x w6_t = w1[2]; + u32x w7_t = w1[3]; + u32x w8_t = w2[0]; + u32x w9_t = w2[1]; + u32x wa_t = w2[2]; + u32x wb_t = w2[3]; + u32x wc_t = w3[0]; + u32x wd_t = w3[1]; + u32x we_t = w3[2]; + u32x wf_t = w3[3]; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t, MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t, MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t, MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t, MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w4_t, MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w5_t, MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w6_t, MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w7_t, MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w8_t, MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w9_t, MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, wa_t, MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, wb_t, MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, wc_t, MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, wd_t, MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, we_t, MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, wf_t, MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w1_t, MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w6_t, MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, wb_t, MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t, MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w5_t, MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, wa_t, MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, wf_t, MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w4_t, MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w9_t, MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, we_t, MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t, MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w8_t, MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, wd_t, MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t, MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w7_t, MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, wc_t, MD5C1f, MD5S13); + + MD5_STEP (MD5_H , a, b, c, d, w5_t, MD5C20, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w8_t, MD5C21, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, wb_t, MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, we_t, MD5C23, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w1_t, MD5C24, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w4_t, MD5C25, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w7_t, MD5C26, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, wa_t, MD5C27, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, wd_t, MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w0_t, MD5C29, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w3_t, MD5C2a, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w6_t, MD5C2b, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w9_t, MD5C2c, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, wc_t, MD5C2d, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, wf_t, MD5C2e, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w2_t, MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t, MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w7_t, MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, we_t, MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w5_t, MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, wc_t, MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t, MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, wa_t, MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t, MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w8_t, MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, wf_t, MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w6_t, MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, wd_t, MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w4_t, MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, wb_t, MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t, MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w9_t, MD5C3f, MD5S33); + + digest[0] += a; + digest[1] += b; + digest[2] += c; + digest[3] += d; +} + +__device__ static void gen336 (u32x digest_pre[4], u32 salt_buf[4], u32x digest[4]) +{ + u32x digest_t0[2]; + u32x digest_t1[2]; + u32x digest_t2[2]; + u32x digest_t3[2]; + + digest_t0[0] = digest_pre[0]; + digest_t0[1] = digest_pre[1] & 0xff; + + digest_t1[0] = digest_pre[0] << 8; + digest_t1[1] = digest_pre[0] >> 24 | digest_pre[1] << 8; + + digest_t2[0] = digest_pre[0] << 16; + digest_t2[1] = digest_pre[0] >> 16 | digest_pre[1] << 16; + + digest_t3[0] = digest_pre[0] << 24; + digest_t3[1] = digest_pre[0] >> 8 | digest_pre[1] << 24; + + u32 salt_buf_t0[4]; + u32 salt_buf_t1[5]; + u32 salt_buf_t2[5]; + u32 salt_buf_t3[5]; + + salt_buf_t0[0] = salt_buf[0]; + salt_buf_t0[1] = salt_buf[1]; + salt_buf_t0[2] = salt_buf[2]; + salt_buf_t0[3] = salt_buf[3]; + + salt_buf_t1[0] = salt_buf[0] << 8; + salt_buf_t1[1] = salt_buf[0] >> 24 | salt_buf[1] << 8; + salt_buf_t1[2] = salt_buf[1] >> 24 | salt_buf[2] << 8; + salt_buf_t1[3] = salt_buf[2] >> 24 | salt_buf[3] << 8; + salt_buf_t1[4] = salt_buf[3] >> 24; + + salt_buf_t2[0] = salt_buf[0] << 16; + salt_buf_t2[1] = salt_buf[0] >> 16 | salt_buf[1] << 16; + salt_buf_t2[2] = salt_buf[1] >> 16 | salt_buf[2] << 16; + salt_buf_t2[3] = salt_buf[2] >> 16 | salt_buf[3] << 16; + salt_buf_t2[4] = salt_buf[3] >> 16; + + salt_buf_t3[0] = salt_buf[0] << 24; + salt_buf_t3[1] = salt_buf[0] >> 8 | salt_buf[1] << 24; + salt_buf_t3[2] = salt_buf[1] >> 8 | salt_buf[2] << 24; + salt_buf_t3[3] = salt_buf[2] >> 8 | salt_buf[3] << 24; + salt_buf_t3[4] = salt_buf[3] >> 8; + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + // generate the 16 * 21 buffer + + w0_t[0] = 0; + w0_t[1] = 0; + w0_t[2] = 0; + w0_t[3] = 0; + w1_t[0] = 0; + w1_t[1] = 0; + w1_t[2] = 0; + w1_t[3] = 0; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = 0; + + // 0..5 + w0_t[0] = digest_t0[0]; + w0_t[1] = digest_t0[1]; + + // 5..21 + w0_t[1] |= salt_buf_t1[0]; + w0_t[2] = salt_buf_t1[1]; + w0_t[3] = salt_buf_t1[2]; + w1_t[0] = salt_buf_t1[3]; + w1_t[1] = salt_buf_t1[4]; + + // 21..26 + w1_t[1] |= digest_t1[0]; + w1_t[2] = digest_t1[1]; + + // 26..42 + w1_t[2] |= salt_buf_t2[0]; + w1_t[3] = salt_buf_t2[1]; + w2_t[0] = salt_buf_t2[2]; + w2_t[1] = salt_buf_t2[3]; + w2_t[2] = salt_buf_t2[4]; + + // 42..47 + w2_t[2] |= digest_t2[0]; + w2_t[3] = digest_t2[1]; + + // 47..63 + w2_t[3] |= salt_buf_t3[0]; + w3_t[0] = salt_buf_t3[1]; + w3_t[1] = salt_buf_t3[2]; + w3_t[2] = salt_buf_t3[3]; + w3_t[3] = salt_buf_t3[4]; + + // 63.. + + w3_t[3] |= digest_t3[0]; + + md5_transform (w0_t, w1_t, w2_t, w3_t, digest); + + w0_t[0] = 0; + w0_t[1] = 0; + w0_t[2] = 0; + w0_t[3] = 0; + w1_t[0] = 0; + w1_t[1] = 0; + w1_t[2] = 0; + w1_t[3] = 0; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = 0; + + // 0..4 + w0_t[0] = digest_t3[1]; + + // 4..20 + w0_t[1] = salt_buf_t0[0]; + w0_t[2] = salt_buf_t0[1]; + w0_t[3] = salt_buf_t0[2]; + w1_t[0] = salt_buf_t0[3]; + + // 20..25 + w1_t[1] = digest_t0[0]; + w1_t[2] = digest_t0[1]; + + // 25..41 + w1_t[2] |= salt_buf_t1[0]; + w1_t[3] = salt_buf_t1[1]; + w2_t[0] = salt_buf_t1[2]; + w2_t[1] = salt_buf_t1[3]; + w2_t[2] = salt_buf_t1[4]; + + // 41..46 + w2_t[2] |= digest_t1[0]; + w2_t[3] = digest_t1[1]; + + // 46..62 + w2_t[3] |= salt_buf_t2[0]; + w3_t[0] = salt_buf_t2[1]; + w3_t[1] = salt_buf_t2[2]; + w3_t[2] = salt_buf_t2[3]; + w3_t[3] = salt_buf_t2[4]; + + // 62.. + w3_t[3] |= digest_t2[0]; + + md5_transform (w0_t, w1_t, w2_t, w3_t, digest); + + w0_t[0] = 0; + w0_t[1] = 0; + w0_t[2] = 0; + w0_t[3] = 0; + w1_t[0] = 0; + w1_t[1] = 0; + w1_t[2] = 0; + w1_t[3] = 0; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = 0; + + // 0..3 + w0_t[0] = digest_t2[1]; + + // 3..19 + w0_t[0] |= salt_buf_t3[0]; + w0_t[1] = salt_buf_t3[1]; + w0_t[2] = salt_buf_t3[2]; + w0_t[3] = salt_buf_t3[3]; + w1_t[0] = salt_buf_t3[4]; + + // 19..24 + w1_t[0] |= digest_t3[0]; + w1_t[1] = digest_t3[1]; + + // 24..40 + w1_t[2] = salt_buf_t0[0]; + w1_t[3] = salt_buf_t0[1]; + w2_t[0] = salt_buf_t0[2]; + w2_t[1] = salt_buf_t0[3]; + + // 40..45 + w2_t[2] = digest_t0[0]; + w2_t[3] = digest_t0[1]; + + // 45..61 + w2_t[3] |= salt_buf_t1[0]; + w3_t[0] = salt_buf_t1[1]; + w3_t[1] = salt_buf_t1[2]; + w3_t[2] = salt_buf_t1[3]; + w3_t[3] = salt_buf_t1[4]; + + // 61.. + w3_t[3] |= digest_t1[0]; + + md5_transform (w0_t, w1_t, w2_t, w3_t, digest); + + w0_t[0] = 0; + w0_t[1] = 0; + w0_t[2] = 0; + w0_t[3] = 0; + w1_t[0] = 0; + w1_t[1] = 0; + w1_t[2] = 0; + w1_t[3] = 0; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = 0; + + // 0..2 + w0_t[0] = digest_t1[1]; + + // 2..18 + w0_t[0] |= salt_buf_t2[0]; + w0_t[1] = salt_buf_t2[1]; + w0_t[2] = salt_buf_t2[2]; + w0_t[3] = salt_buf_t2[3]; + w1_t[0] = salt_buf_t2[4]; + + // 18..23 + w1_t[0] |= digest_t2[0]; + w1_t[1] = digest_t2[1]; + + // 23..39 + w1_t[1] |= salt_buf_t3[0]; + w1_t[2] = salt_buf_t3[1]; + w1_t[3] = salt_buf_t3[2]; + w2_t[0] = salt_buf_t3[3]; + w2_t[1] = salt_buf_t3[4]; + + // 39..44 + w2_t[1] |= digest_t3[0]; + w2_t[2] = digest_t3[1]; + + // 44..60 + w2_t[3] = salt_buf_t0[0]; + w3_t[0] = salt_buf_t0[1]; + w3_t[1] = salt_buf_t0[2]; + w3_t[2] = salt_buf_t0[3]; + + // 60.. + w3_t[3] = digest_t0[0]; + + md5_transform (w0_t, w1_t, w2_t, w3_t, digest); + + w0_t[0] = 0; + w0_t[1] = 0; + w0_t[2] = 0; + w0_t[3] = 0; + w1_t[0] = 0; + w1_t[1] = 0; + w1_t[2] = 0; + w1_t[3] = 0; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = 0; + + // 0..1 + w0_t[0] = digest_t0[1]; + + // 1..17 + w0_t[0] |= salt_buf_t1[0]; + w0_t[1] = salt_buf_t1[1]; + w0_t[2] = salt_buf_t1[2]; + w0_t[3] = salt_buf_t1[3]; + w1_t[0] = salt_buf_t1[4]; + + // 17..22 + w1_t[0] |= digest_t1[0]; + w1_t[1] = digest_t1[1]; + + // 22..38 + w1_t[1] |= salt_buf_t2[0]; + w1_t[2] = salt_buf_t2[1]; + w1_t[3] = salt_buf_t2[2]; + w2_t[0] = salt_buf_t2[3]; + w2_t[1] = salt_buf_t2[4]; + + // 38..43 + w2_t[1] |= digest_t2[0]; + w2_t[2] = digest_t2[1]; + + // 43..59 + w2_t[2] |= salt_buf_t3[0]; + w2_t[3] = salt_buf_t3[1]; + w3_t[0] = salt_buf_t3[2]; + w3_t[1] = salt_buf_t3[3]; + w3_t[2] = salt_buf_t3[4]; + + // 59.. + w3_t[2] |= digest_t3[0]; + w3_t[3] = digest_t3[1]; + + md5_transform (w0_t, w1_t, w2_t, w3_t, digest); + + w0_t[0] = salt_buf_t0[0]; + w0_t[1] = salt_buf_t0[1]; + w0_t[2] = salt_buf_t0[2]; + w0_t[3] = salt_buf_t0[3]; + w1_t[0] = 0x80; + w1_t[1] = 0; + w1_t[2] = 0; + w1_t[3] = 0; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 21 * 16 * 8; + w3_t[3] = 0; + + md5_transform (w0_t, w1_t, w2_t, w3_t, digest); +} + +__device__ __constant__ bf_t c_bfs[1024]; + +__device__ static void m09720m (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], const u32 pw_len, const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const u32x *bfs_buf, void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const oldoffice01_t *oldoffice01_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset) +{ + /** + * modifier + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + const u32 lid = threadIdx.x; + + /** + * salt + */ + + u32 salt_buf[4]; + + salt_buf[0] = salt_bufs[salt_pos].salt_buf[0]; + salt_buf[1] = salt_bufs[salt_pos].salt_buf[1]; + salt_buf[2] = salt_bufs[salt_pos].salt_buf[2]; + salt_buf[3] = salt_bufs[salt_pos].salt_buf[3]; + + /** + * loop + */ + + u32x w0l = w0[0]; + + for (u32 il_pos = 0; il_pos < bfs_cnt; il_pos++) + { + const u32 w0r = c_bfs[il_pos].i; + + w0[0] = w0l | w0r; + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + w0_t[0] = w0[0]; + w0_t[1] = w0[1]; + w0_t[2] = w0[2]; + w0_t[3] = w0[3]; + w1_t[0] = w1[0]; + w1_t[1] = w1[1]; + w1_t[2] = w1[2]; + w1_t[3] = w1[3]; + w2_t[0] = w2[0]; + w2_t[1] = w2[1]; + w2_t[2] = w2[2]; + w2_t[3] = w2[3]; + w3_t[0] = w3[0]; + w3_t[1] = w3[1]; + w3_t[2] = pw_len * 8; + w3_t[3] = 0; + + u32x digest_pre[4]; + + digest_pre[0] = MD5M_A; + digest_pre[1] = MD5M_B; + digest_pre[2] = MD5M_C; + digest_pre[3] = MD5M_D; + + md5_transform (w0_t, w1_t, w2_t, w3_t, digest_pre); + + digest_pre[0] &= 0xffffffff; + digest_pre[1] &= 0x000000ff; + digest_pre[2] &= 0x00000000; + digest_pre[3] &= 0x00000000; + + u32x digest[4]; + + digest[0] = MD5M_A; + digest[1] = MD5M_B; + digest[2] = MD5M_C; + digest[3] = MD5M_D; + + gen336 (digest_pre, salt_buf, digest); + + u32x a = digest[0]; + u32x b = digest[1] & 0xff; + + const u32x r0 = a; + const u32x r1 = b; + const u32x r2 = 0; + const u32x r3 = 0; + + #include VECT_COMPARE_M + } +} + +__device__ static void m09720s (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], const u32 pw_len, const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const u32x *bfs_buf, void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const oldoffice01_t *oldoffice01_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset) +{ + /** + * modifier + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + const u32 lid = threadIdx.x; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * salt + */ + + u32 salt_buf[4]; + + salt_buf[0] = salt_bufs[salt_pos].salt_buf[0]; + salt_buf[1] = salt_bufs[salt_pos].salt_buf[1]; + salt_buf[2] = salt_bufs[salt_pos].salt_buf[2]; + salt_buf[3] = salt_bufs[salt_pos].salt_buf[3]; + + /** + * loop + */ + + u32x w0l = w0[0]; + + for (u32 il_pos = 0; il_pos < bfs_cnt; il_pos++) + { + const u32 w0r = c_bfs[il_pos].i; + + w0[0] = w0l | w0r; + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + w0_t[0] = w0[0]; + w0_t[1] = w0[1]; + w0_t[2] = w0[2]; + w0_t[3] = w0[3]; + w1_t[0] = w1[0]; + w1_t[1] = w1[1]; + w1_t[2] = w1[2]; + w1_t[3] = w1[3]; + w2_t[0] = w2[0]; + w2_t[1] = w2[1]; + w2_t[2] = w2[2]; + w2_t[3] = w2[3]; + w3_t[0] = w3[0]; + w3_t[1] = w3[1]; + w3_t[2] = pw_len * 8; + w3_t[3] = 0; + + u32x digest_pre[4]; + + digest_pre[0] = MD5M_A; + digest_pre[1] = MD5M_B; + digest_pre[2] = MD5M_C; + digest_pre[3] = MD5M_D; + + md5_transform (w0_t, w1_t, w2_t, w3_t, digest_pre); + + digest_pre[0] &= 0xffffffff; + digest_pre[1] &= 0x000000ff; + digest_pre[2] &= 0x00000000; + digest_pre[3] &= 0x00000000; + + u32x digest[4]; + + digest[0] = MD5M_A; + digest[1] = MD5M_B; + digest[2] = MD5M_C; + digest[3] = MD5M_D; + + gen336 (digest_pre, salt_buf, digest); + + u32x a = digest[0]; + u32x b = digest[1] & 0xff; + + const u32x r0 = a; + const u32x r1 = b; + const u32x r2 = 0; + const u32x r3 = 0; + + #include VECT_COMPARE_S + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m09720_m04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const u32x *bfs_buf, void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const oldoffice01_t *oldoffice01_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m09720m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, oldoffice01_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m09720_m08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const u32x *bfs_buf, void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const oldoffice01_t *oldoffice01_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m09720m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, oldoffice01_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m09720_m16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const u32x *bfs_buf, void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const oldoffice01_t *oldoffice01_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = pws[gid].i[ 8]; + w2[1] = pws[gid].i[ 9]; + w2[2] = pws[gid].i[10]; + w2[3] = pws[gid].i[11]; + + u32x w3[4]; + + w3[0] = pws[gid].i[12]; + w3[1] = pws[gid].i[13]; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m09720m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, oldoffice01_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m09720_s04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const u32x *bfs_buf, void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const oldoffice01_t *oldoffice01_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m09720s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, oldoffice01_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m09720_s08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const u32x *bfs_buf, void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const oldoffice01_t *oldoffice01_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m09720s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, oldoffice01_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m09720_s16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const u32x *bfs_buf, void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const oldoffice01_t *oldoffice01_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = pws[gid].i[ 8]; + w2[1] = pws[gid].i[ 9]; + w2[2] = pws[gid].i[10]; + w2[3] = pws[gid].i[11]; + + u32x w3[4]; + + w3[0] = pws[gid].i[12]; + w3[1] = pws[gid].i[13]; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m09720s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, oldoffice01_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} diff --git a/nv/m09800_a0.cu b/nv/m09800_a0.cu new file mode 100644 index 0000000000..43d791b1fc --- /dev/null +++ b/nv/m09800_a0.cu @@ -0,0 +1,769 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _OLDOFFICE34_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW2 +#define VECT_SIZE1 +#endif + +#define DGST_R0 0 +#define DGST_R1 1 +#define DGST_R2 2 +#define DGST_R3 3 + +#include "include/kernel_functions.c" +#include "types_nv.c" +#include "common_nv.c" +#include "include/rp_gpu.h" +#include "rp_nv.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +typedef struct +{ + u8 S[256]; + + u32 wtf_its_faster; + +} RC4_KEY; + +__device__ static void swap (RC4_KEY *rc4_key, const u32 i, const u32 j) +{ + u8 tmp; + + tmp = rc4_key->S[i]; + rc4_key->S[i] = rc4_key->S[j]; + rc4_key->S[j] = tmp; +} + +__device__ static void rc4_init_16 (RC4_KEY *rc4_key, const u32 data[4]) +{ + u32 v = 0x03020100; + u32 a = 0x04040404; + + u32 *ptr = (u32 *) rc4_key->S; + + #pragma unroll 64 + for (u32 i = 0; i < 64; i++) + { + *ptr++ = v; v += a; + } + + u32 j = 0; + + for (u32 i = 0; i < 16; i++) + { + u32 idx = i * 16; + + u32 v; + + v = data[0]; + + j += rc4_key->S[idx] + (v >> 0); swap (rc4_key, idx, j & 0xff); idx++; + j += rc4_key->S[idx] + (v >> 8); swap (rc4_key, idx, j & 0xff); idx++; + j += rc4_key->S[idx] + (v >> 16); swap (rc4_key, idx, j & 0xff); idx++; + j += rc4_key->S[idx] + (v >> 24); swap (rc4_key, idx, j & 0xff); idx++; + + v = data[1]; + + j += rc4_key->S[idx] + (v >> 0); swap (rc4_key, idx, j & 0xff); idx++; + j += rc4_key->S[idx] + (v >> 8); swap (rc4_key, idx, j & 0xff); idx++; + j += rc4_key->S[idx] + (v >> 16); swap (rc4_key, idx, j & 0xff); idx++; + j += rc4_key->S[idx] + (v >> 24); swap (rc4_key, idx, j & 0xff); idx++; + + v = data[2]; + + j += rc4_key->S[idx] + (v >> 0); swap (rc4_key, idx, j & 0xff); idx++; + j += rc4_key->S[idx] + (v >> 8); swap (rc4_key, idx, j & 0xff); idx++; + j += rc4_key->S[idx] + (v >> 16); swap (rc4_key, idx, j & 0xff); idx++; + j += rc4_key->S[idx] + (v >> 24); swap (rc4_key, idx, j & 0xff); idx++; + + v = data[3]; + + j += rc4_key->S[idx] + (v >> 0); swap (rc4_key, idx, j & 0xff); idx++; + j += rc4_key->S[idx] + (v >> 8); swap (rc4_key, idx, j & 0xff); idx++; + j += rc4_key->S[idx] + (v >> 16); swap (rc4_key, idx, j & 0xff); idx++; + j += rc4_key->S[idx] + (v >> 24); swap (rc4_key, idx, j & 0xff); idx++; + } +} + +__device__ static u8 rc4_next_16 (RC4_KEY *rc4_key, u8 i, u8 j, const u32 in[4], u32 out[4]) +{ + for (u32 k = 0; k < 4; k++) + { + u32 xor4 = 0; + + u8 idx; + + i += 1; + j += rc4_key->S[i]; + + swap (rc4_key, i, j); + + idx = rc4_key->S[i] + rc4_key->S[j]; + + xor4 |= rc4_key->S[idx] << 0; + + i += 1; + j += rc4_key->S[i]; + + swap (rc4_key, i, j); + + idx = rc4_key->S[i] + rc4_key->S[j]; + + xor4 |= rc4_key->S[idx] << 8; + + i += 1; + j += rc4_key->S[i]; + + swap (rc4_key, i, j); + + idx = rc4_key->S[i] + rc4_key->S[j]; + + xor4 |= rc4_key->S[idx] << 16; + + i += 1; + j += rc4_key->S[i]; + + swap (rc4_key, i, j); + + idx = rc4_key->S[i] + rc4_key->S[j]; + + xor4 |= rc4_key->S[idx] << 24; + + out[k] = in[k] ^ xor4; + } + + return j; +} + +__device__ static void sha1_transform (const u32x w0[4], const u32x w1[4], const u32x w2[4], const u32x w3[4], u32x digest[5]) +{ + u32x A = digest[0]; + u32x B = digest[1]; + u32x C = digest[2]; + u32x D = digest[3]; + u32x E = digest[4]; + + u32x w0_t = w0[0]; + u32x w1_t = w0[1]; + u32x w2_t = w0[2]; + u32x w3_t = w0[3]; + u32x w4_t = w1[0]; + u32x w5_t = w1[1]; + u32x w6_t = w1[2]; + u32x w7_t = w1[3]; + u32x w8_t = w2[0]; + u32x w9_t = w2[1]; + u32x wa_t = w2[2]; + u32x wb_t = w2[3]; + u32x wc_t = w3[0]; + u32x wd_t = w3[1]; + u32x we_t = w3[2]; + u32x wf_t = w3[3]; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, A, B, C, D, E, w0_t); + SHA1_STEP (SHA1_F0o, E, A, B, C, D, w1_t); + SHA1_STEP (SHA1_F0o, D, E, A, B, C, w2_t); + SHA1_STEP (SHA1_F0o, C, D, E, A, B, w3_t); + SHA1_STEP (SHA1_F0o, B, C, D, E, A, w4_t); + SHA1_STEP (SHA1_F0o, A, B, C, D, E, w5_t); + SHA1_STEP (SHA1_F0o, E, A, B, C, D, w6_t); + SHA1_STEP (SHA1_F0o, D, E, A, B, C, w7_t); + SHA1_STEP (SHA1_F0o, C, D, E, A, B, w8_t); + SHA1_STEP (SHA1_F0o, B, C, D, E, A, w9_t); + SHA1_STEP (SHA1_F0o, A, B, C, D, E, wa_t); + SHA1_STEP (SHA1_F0o, E, A, B, C, D, wb_t); + SHA1_STEP (SHA1_F0o, D, E, A, B, C, wc_t); + SHA1_STEP (SHA1_F0o, C, D, E, A, B, wd_t); + SHA1_STEP (SHA1_F0o, B, C, D, E, A, we_t); + SHA1_STEP (SHA1_F0o, A, B, C, D, E, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F0o, E, A, B, C, D, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F0o, D, E, A, B, C, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F0o, C, D, E, A, B, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F0o, B, C, D, E, A, w3_t); + + #undef K + #define K SHA1C01 + + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w7_t); + + #undef K + #define K SHA1C02 + + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, wb_t); + + #undef K + #define K SHA1C03 + + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, wf_t); + + digest[0] += A; + digest[1] += B; + digest[2] += C; + digest[3] += D; + digest[4] += E; +} + +__device__ __constant__ gpu_rule_t c_rules[1024]; + +extern "C" __global__ void __launch_bounds__ (64, 1) m09800_m04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const oldoffice34_t *oldoffice34_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + __shared__ RC4_KEY rc4_keys[64]; + + RC4_KEY *rc4_key = &rc4_keys[lid]; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + u32x pw_buf1[4]; + + pw_buf1[0] = pws[gid].i[ 4]; + pw_buf1[1] = pws[gid].i[ 5]; + pw_buf1[2] = pws[gid].i[ 6]; + pw_buf1[3] = pws[gid].i[ 7]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * salt + */ + + u32 salt_buf[4]; + + salt_buf[0] = salt_bufs[salt_pos].salt_buf[0]; + salt_buf[1] = salt_bufs[salt_pos].salt_buf[1]; + salt_buf[2] = salt_bufs[salt_pos].salt_buf[2]; + salt_buf[3] = salt_bufs[salt_pos].salt_buf[3]; + + const u32 salt_len = 16; + + /** + * esalt + */ + + const u32 version = oldoffice34_bufs[salt_pos].version; + + u32 encryptedVerifier[4]; + + encryptedVerifier[0] = oldoffice34_bufs[salt_pos].encryptedVerifier[0]; + encryptedVerifier[1] = oldoffice34_bufs[salt_pos].encryptedVerifier[1]; + encryptedVerifier[2] = oldoffice34_bufs[salt_pos].encryptedVerifier[2]; + encryptedVerifier[3] = oldoffice34_bufs[salt_pos].encryptedVerifier[3]; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + + w0[0] = pw_buf0[0]; + w0[1] = pw_buf0[1]; + w0[2] = pw_buf0[2]; + w0[3] = pw_buf0[3]; + + u32x w1[4]; + + w1[0] = pw_buf1[0]; + w1[1] = pw_buf1[1]; + w1[2] = pw_buf1[2]; + w1[3] = pw_buf1[3]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 out_len = apply_rules (c_rules[il_pos].cmds, w0, w1, pw_len); + + const u32 pw_salt_len = (out_len * 2) + salt_len; + + append_0x80_2 (w0, w1, out_len); + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + make_unicode (w0, w0_t, w1_t); + make_unicode (w1, w2_t, w3_t); + + switch_buffer_by_offset (w0_t, w1_t, w2_t, w3_t, salt_len); + + w0_t[0] = salt_buf[0]; + w0_t[1] = salt_buf[1]; + w0_t[2] = salt_buf[2]; + w0_t[3] = salt_buf[3]; + w1_t[0] = swap_workaround (w1_t[0]); + w1_t[1] = swap_workaround (w1_t[1]); + w1_t[2] = swap_workaround (w1_t[2]); + w1_t[3] = swap_workaround (w1_t[3]); + w2_t[0] = swap_workaround (w2_t[0]); + w2_t[1] = swap_workaround (w2_t[1]); + w2_t[2] = swap_workaround (w2_t[2]); + w2_t[3] = swap_workaround (w2_t[3]); + w3_t[0] = swap_workaround (w3_t[0]); + w3_t[1] = swap_workaround (w3_t[1]); + w3_t[2] = 0; + w3_t[3] = pw_salt_len * 8; + + u32x digest[5]; + + digest[0] = SHA1M_A; + digest[1] = SHA1M_B; + digest[2] = SHA1M_C; + digest[3] = SHA1M_D; + digest[4] = SHA1M_E; + + sha1_transform (w0_t, w1_t, w2_t, w3_t, digest); + + w0_t[0] = digest[0]; + w0_t[1] = digest[1]; + w0_t[2] = digest[2]; + w0_t[3] = digest[3]; + w1_t[0] = digest[4]; + w1_t[1] = 0; + w1_t[2] = 0x80000000; + w1_t[3] = 0; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = (20 + 4) * 8; + + digest[0] = SHA1M_A; + digest[1] = SHA1M_B; + digest[2] = SHA1M_C; + digest[3] = SHA1M_D; + digest[4] = SHA1M_E; + + sha1_transform (w0_t, w1_t, w2_t, w3_t, digest); + + u32x key[4]; + + key[0] = swap_workaround (digest[0]); + key[1] = swap_workaround (digest[1]); + key[2] = swap_workaround (digest[2]); + key[3] = swap_workaround (digest[3]); + + if (version == 3) + { + key[1] &= 0xff; + key[2] = 0; + key[3] = 0; + } + + rc4_init_16 (rc4_key, key); + + u32x out[4]; + + u8 j = rc4_next_16 (rc4_key, 0, 0, encryptedVerifier, out); + + w0_t[0] = swap_workaround (out[0]); + w0_t[1] = swap_workaround (out[1]); + w0_t[2] = swap_workaround (out[2]); + w0_t[3] = swap_workaround (out[3]); + w1_t[0] = 0x80000000; + w1_t[1] = 0; + w1_t[2] = 0; + w1_t[3] = 0; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = 16 * 8; + + digest[0] = SHA1M_A; + digest[1] = SHA1M_B; + digest[2] = SHA1M_C; + digest[3] = SHA1M_D; + digest[4] = SHA1M_E; + + sha1_transform (w0_t, w1_t, w2_t, w3_t, digest); + + digest[0] = swap_workaround (digest[0]); + digest[1] = swap_workaround (digest[1]); + digest[2] = swap_workaround (digest[2]); + digest[3] = swap_workaround (digest[3]); + + rc4_next_16 (rc4_key, 16, j, digest, out); + + const u32x r0 = out[0]; + const u32x r1 = out[1]; + const u32x r2 = out[2]; + const u32x r3 = out[3]; + + #include VECT_COMPARE_M + } +} + +extern "C" __global__ void __launch_bounds__ (64, 1) m09800_m08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const oldoffice34_t *oldoffice34_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (64, 1) m09800_m16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const oldoffice34_t *oldoffice34_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (64, 1) m09800_s04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const oldoffice34_t *oldoffice34_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + __shared__ RC4_KEY rc4_keys[64]; + + RC4_KEY *rc4_key = &rc4_keys[lid]; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + u32x pw_buf1[4]; + + pw_buf1[0] = pws[gid].i[ 4]; + pw_buf1[1] = pws[gid].i[ 5]; + pw_buf1[2] = pws[gid].i[ 6]; + pw_buf1[3] = pws[gid].i[ 7]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * salt + */ + + u32 salt_buf[4]; + + salt_buf[0] = salt_bufs[salt_pos].salt_buf[0]; + salt_buf[1] = salt_bufs[salt_pos].salt_buf[1]; + salt_buf[2] = salt_bufs[salt_pos].salt_buf[2]; + salt_buf[3] = salt_bufs[salt_pos].salt_buf[3]; + + const u32 salt_len = 16; + + /** + * esalt + */ + + const u32 version = oldoffice34_bufs[salt_pos].version; + + u32 encryptedVerifier[4]; + + encryptedVerifier[0] = oldoffice34_bufs[salt_pos].encryptedVerifier[0]; + encryptedVerifier[1] = oldoffice34_bufs[salt_pos].encryptedVerifier[1]; + encryptedVerifier[2] = oldoffice34_bufs[salt_pos].encryptedVerifier[2]; + encryptedVerifier[3] = oldoffice34_bufs[salt_pos].encryptedVerifier[3]; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + + w0[0] = pw_buf0[0]; + w0[1] = pw_buf0[1]; + w0[2] = pw_buf0[2]; + w0[3] = pw_buf0[3]; + + u32x w1[4]; + + w1[0] = pw_buf1[0]; + w1[1] = pw_buf1[1]; + w1[2] = pw_buf1[2]; + w1[3] = pw_buf1[3]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 out_len = apply_rules (c_rules[il_pos].cmds, w0, w1, pw_len); + + const u32 pw_salt_len = (out_len * 2) + salt_len; + + append_0x80_2 (w0, w1, out_len); + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + make_unicode (w0, w0_t, w1_t); + make_unicode (w1, w2_t, w3_t); + + switch_buffer_by_offset (w0_t, w1_t, w2_t, w3_t, salt_len); + + w0_t[0] = salt_buf[0]; + w0_t[1] = salt_buf[1]; + w0_t[2] = salt_buf[2]; + w0_t[3] = salt_buf[3]; + w1_t[0] = swap_workaround (w1_t[0]); + w1_t[1] = swap_workaround (w1_t[1]); + w1_t[2] = swap_workaround (w1_t[2]); + w1_t[3] = swap_workaround (w1_t[3]); + w2_t[0] = swap_workaround (w2_t[0]); + w2_t[1] = swap_workaround (w2_t[1]); + w2_t[2] = swap_workaround (w2_t[2]); + w2_t[3] = swap_workaround (w2_t[3]); + w3_t[0] = swap_workaround (w3_t[0]); + w3_t[1] = swap_workaround (w3_t[1]); + w3_t[2] = 0; + w3_t[3] = pw_salt_len * 8; + + u32x digest[5]; + + digest[0] = SHA1M_A; + digest[1] = SHA1M_B; + digest[2] = SHA1M_C; + digest[3] = SHA1M_D; + digest[4] = SHA1M_E; + + sha1_transform (w0_t, w1_t, w2_t, w3_t, digest); + + w0_t[0] = digest[0]; + w0_t[1] = digest[1]; + w0_t[2] = digest[2]; + w0_t[3] = digest[3]; + w1_t[0] = digest[4]; + w1_t[1] = 0; + w1_t[2] = 0x80000000; + w1_t[3] = 0; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = (20 + 4) * 8; + + digest[0] = SHA1M_A; + digest[1] = SHA1M_B; + digest[2] = SHA1M_C; + digest[3] = SHA1M_D; + digest[4] = SHA1M_E; + + sha1_transform (w0_t, w1_t, w2_t, w3_t, digest); + + u32x key[4]; + + key[0] = swap_workaround (digest[0]); + key[1] = swap_workaround (digest[1]); + key[2] = swap_workaround (digest[2]); + key[3] = swap_workaround (digest[3]); + + if (version == 3) + { + key[1] &= 0xff; + key[2] = 0; + key[3] = 0; + } + + rc4_init_16 (rc4_key, key); + + u32x out[4]; + + u8 j = rc4_next_16 (rc4_key, 0, 0, encryptedVerifier, out); + + w0_t[0] = swap_workaround (out[0]); + w0_t[1] = swap_workaround (out[1]); + w0_t[2] = swap_workaround (out[2]); + w0_t[3] = swap_workaround (out[3]); + w1_t[0] = 0x80000000; + w1_t[1] = 0; + w1_t[2] = 0; + w1_t[3] = 0; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = 16 * 8; + + digest[0] = SHA1M_A; + digest[1] = SHA1M_B; + digest[2] = SHA1M_C; + digest[3] = SHA1M_D; + digest[4] = SHA1M_E; + + sha1_transform (w0_t, w1_t, w2_t, w3_t, digest); + + digest[0] = swap_workaround (digest[0]); + digest[1] = swap_workaround (digest[1]); + digest[2] = swap_workaround (digest[2]); + digest[3] = swap_workaround (digest[3]); + + rc4_next_16 (rc4_key, 16, j, digest, out); + + const u32x r0 = out[0]; + const u32x r1 = out[1]; + const u32x r2 = out[2]; + const u32x r3 = out[3]; + + #include VECT_COMPARE_S + } +} + +extern "C" __global__ void __launch_bounds__ (64, 1) m09800_s08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const oldoffice34_t *oldoffice34_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (64, 1) m09800_s16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const oldoffice34_t *oldoffice34_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/nv/m09800_a1.cu b/nv/m09800_a1.cu new file mode 100644 index 0000000000..cd60751c67 --- /dev/null +++ b/nv/m09800_a1.cu @@ -0,0 +1,875 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _OLDOFFICE34_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW2 +#define VECT_SIZE1 +#endif + +#define DGST_R0 0 +#define DGST_R1 1 +#define DGST_R2 2 +#define DGST_R3 3 + +#include "include/kernel_functions.c" +#include "types_nv.c" +#include "common_nv.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +typedef struct +{ + u8 S[256]; + + u32 wtf_its_faster; + +} RC4_KEY; + +__device__ static void swap (RC4_KEY *rc4_key, const u32 i, const u32 j) +{ + u8 tmp; + + tmp = rc4_key->S[i]; + rc4_key->S[i] = rc4_key->S[j]; + rc4_key->S[j] = tmp; +} + +__device__ static void rc4_init_16 (RC4_KEY *rc4_key, const u32 data[4]) +{ + u32 v = 0x03020100; + u32 a = 0x04040404; + + u32 *ptr = (u32 *) rc4_key->S; + + #pragma unroll 64 + for (u32 i = 0; i < 64; i++) + { + *ptr++ = v; v += a; + } + + u32 j = 0; + + for (u32 i = 0; i < 16; i++) + { + u32 idx = i * 16; + + u32 v; + + v = data[0]; + + j += rc4_key->S[idx] + (v >> 0); swap (rc4_key, idx, j & 0xff); idx++; + j += rc4_key->S[idx] + (v >> 8); swap (rc4_key, idx, j & 0xff); idx++; + j += rc4_key->S[idx] + (v >> 16); swap (rc4_key, idx, j & 0xff); idx++; + j += rc4_key->S[idx] + (v >> 24); swap (rc4_key, idx, j & 0xff); idx++; + + v = data[1]; + + j += rc4_key->S[idx] + (v >> 0); swap (rc4_key, idx, j & 0xff); idx++; + j += rc4_key->S[idx] + (v >> 8); swap (rc4_key, idx, j & 0xff); idx++; + j += rc4_key->S[idx] + (v >> 16); swap (rc4_key, idx, j & 0xff); idx++; + j += rc4_key->S[idx] + (v >> 24); swap (rc4_key, idx, j & 0xff); idx++; + + v = data[2]; + + j += rc4_key->S[idx] + (v >> 0); swap (rc4_key, idx, j & 0xff); idx++; + j += rc4_key->S[idx] + (v >> 8); swap (rc4_key, idx, j & 0xff); idx++; + j += rc4_key->S[idx] + (v >> 16); swap (rc4_key, idx, j & 0xff); idx++; + j += rc4_key->S[idx] + (v >> 24); swap (rc4_key, idx, j & 0xff); idx++; + + v = data[3]; + + j += rc4_key->S[idx] + (v >> 0); swap (rc4_key, idx, j & 0xff); idx++; + j += rc4_key->S[idx] + (v >> 8); swap (rc4_key, idx, j & 0xff); idx++; + j += rc4_key->S[idx] + (v >> 16); swap (rc4_key, idx, j & 0xff); idx++; + j += rc4_key->S[idx] + (v >> 24); swap (rc4_key, idx, j & 0xff); idx++; + } +} + +__device__ static u8 rc4_next_16 (RC4_KEY *rc4_key, u8 i, u8 j, const u32 in[4], u32 out[4]) +{ + for (u32 k = 0; k < 4; k++) + { + u32 xor4 = 0; + + u8 idx; + + i += 1; + j += rc4_key->S[i]; + + swap (rc4_key, i, j); + + idx = rc4_key->S[i] + rc4_key->S[j]; + + xor4 |= rc4_key->S[idx] << 0; + + i += 1; + j += rc4_key->S[i]; + + swap (rc4_key, i, j); + + idx = rc4_key->S[i] + rc4_key->S[j]; + + xor4 |= rc4_key->S[idx] << 8; + + i += 1; + j += rc4_key->S[i]; + + swap (rc4_key, i, j); + + idx = rc4_key->S[i] + rc4_key->S[j]; + + xor4 |= rc4_key->S[idx] << 16; + + i += 1; + j += rc4_key->S[i]; + + swap (rc4_key, i, j); + + idx = rc4_key->S[i] + rc4_key->S[j]; + + xor4 |= rc4_key->S[idx] << 24; + + out[k] = in[k] ^ xor4; + } + + return j; +} + +__device__ static void sha1_transform (const u32x w0[4], const u32x w1[4], const u32x w2[4], const u32x w3[4], u32x digest[5]) +{ + u32x A = digest[0]; + u32x B = digest[1]; + u32x C = digest[2]; + u32x D = digest[3]; + u32x E = digest[4]; + + u32x w0_t = w0[0]; + u32x w1_t = w0[1]; + u32x w2_t = w0[2]; + u32x w3_t = w0[3]; + u32x w4_t = w1[0]; + u32x w5_t = w1[1]; + u32x w6_t = w1[2]; + u32x w7_t = w1[3]; + u32x w8_t = w2[0]; + u32x w9_t = w2[1]; + u32x wa_t = w2[2]; + u32x wb_t = w2[3]; + u32x wc_t = w3[0]; + u32x wd_t = w3[1]; + u32x we_t = w3[2]; + u32x wf_t = w3[3]; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, A, B, C, D, E, w0_t); + SHA1_STEP (SHA1_F0o, E, A, B, C, D, w1_t); + SHA1_STEP (SHA1_F0o, D, E, A, B, C, w2_t); + SHA1_STEP (SHA1_F0o, C, D, E, A, B, w3_t); + SHA1_STEP (SHA1_F0o, B, C, D, E, A, w4_t); + SHA1_STEP (SHA1_F0o, A, B, C, D, E, w5_t); + SHA1_STEP (SHA1_F0o, E, A, B, C, D, w6_t); + SHA1_STEP (SHA1_F0o, D, E, A, B, C, w7_t); + SHA1_STEP (SHA1_F0o, C, D, E, A, B, w8_t); + SHA1_STEP (SHA1_F0o, B, C, D, E, A, w9_t); + SHA1_STEP (SHA1_F0o, A, B, C, D, E, wa_t); + SHA1_STEP (SHA1_F0o, E, A, B, C, D, wb_t); + SHA1_STEP (SHA1_F0o, D, E, A, B, C, wc_t); + SHA1_STEP (SHA1_F0o, C, D, E, A, B, wd_t); + SHA1_STEP (SHA1_F0o, B, C, D, E, A, we_t); + SHA1_STEP (SHA1_F0o, A, B, C, D, E, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F0o, E, A, B, C, D, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F0o, D, E, A, B, C, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F0o, C, D, E, A, B, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F0o, B, C, D, E, A, w3_t); + + #undef K + #define K SHA1C01 + + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w7_t); + + #undef K + #define K SHA1C02 + + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, wb_t); + + #undef K + #define K SHA1C03 + + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, wf_t); + + digest[0] += A; + digest[1] += B; + digest[2] += C; + digest[3] += D; + digest[4] += E; +} + +__device__ __constant__ comb_t c_combs[1024]; + +extern "C" __global__ void __launch_bounds__ (64, 1) m09800_m04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const oldoffice34_t *oldoffice34_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + __shared__ RC4_KEY rc4_keys[64]; + + RC4_KEY *rc4_key = &rc4_keys[lid]; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, c_combs[0].pw_len); + } + + /** + * salt + */ + + u32 salt_buf[4]; + + salt_buf[0] = salt_bufs[salt_pos].salt_buf[0]; + salt_buf[1] = salt_bufs[salt_pos].salt_buf[1]; + salt_buf[2] = salt_bufs[salt_pos].salt_buf[2]; + salt_buf[3] = salt_bufs[salt_pos].salt_buf[3]; + + const u32 salt_len = 16; + + /** + * esalt + */ + + const u32 version = oldoffice34_bufs[salt_pos].version; + + u32 encryptedVerifier[4]; + + encryptedVerifier[0] = oldoffice34_bufs[salt_pos].encryptedVerifier[0]; + encryptedVerifier[1] = oldoffice34_bufs[salt_pos].encryptedVerifier[1]; + encryptedVerifier[2] = oldoffice34_bufs[salt_pos].encryptedVerifier[2]; + encryptedVerifier[3] = oldoffice34_bufs[salt_pos].encryptedVerifier[3]; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = c_combs[il_pos].pw_len; + + const u32 pw_len = pw_l_len + pw_r_len; + + const u32 pw_salt_len = (pw_len * 2) + salt_len; + + u32 wordr0[4]; + + wordr0[0] = c_combs[il_pos].i[0]; + wordr0[1] = c_combs[il_pos].i[1]; + wordr0[2] = c_combs[il_pos].i[2]; + wordr0[3] = c_combs[il_pos].i[3]; + + u32 wordr1[4]; + + wordr1[0] = c_combs[il_pos].i[4]; + wordr1[1] = c_combs[il_pos].i[5]; + wordr1[2] = c_combs[il_pos].i[6]; + wordr1[3] = c_combs[il_pos].i[7]; + + u32 wordr2[4]; + + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + + u32 wordr3[4]; + + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + u32x w0[4]; + + w0[0] = wordl0[0] | wordr0[0]; + w0[1] = wordl0[1] | wordr0[1]; + w0[2] = wordl0[2] | wordr0[2]; + w0[3] = wordl0[3] | wordr0[3]; + + u32x w1[4]; + + w1[0] = wordl1[0] | wordr1[0]; + w1[1] = wordl1[1] | wordr1[1]; + w1[2] = wordl1[2] | wordr1[2]; + w1[3] = wordl1[3] | wordr1[3]; + + u32x w2[4]; + + w2[0] = wordl2[0] | wordr2[0]; + w2[1] = wordl2[1] | wordr2[1]; + w2[2] = wordl2[2] | wordr2[2]; + w2[3] = wordl2[3] | wordr2[3]; + + u32x w3[4]; + + w3[0] = wordl3[0] | wordr3[0]; + w3[1] = wordl3[1] | wordr3[1]; + w3[2] = 0; + w3[3] = 0; + + append_0x80_2 (w0, w1, pw_len); + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + make_unicode (w0, w0_t, w1_t); + make_unicode (w1, w2_t, w3_t); + + switch_buffer_by_offset (w0_t, w1_t, w2_t, w3_t, salt_len); + + w0_t[0] = salt_buf[0]; + w0_t[1] = salt_buf[1]; + w0_t[2] = salt_buf[2]; + w0_t[3] = salt_buf[3]; + w1_t[0] = swap_workaround (w1_t[0]); + w1_t[1] = swap_workaround (w1_t[1]); + w1_t[2] = swap_workaround (w1_t[2]); + w1_t[3] = swap_workaround (w1_t[3]); + w2_t[0] = swap_workaround (w2_t[0]); + w2_t[1] = swap_workaround (w2_t[1]); + w2_t[2] = swap_workaround (w2_t[2]); + w2_t[3] = swap_workaround (w2_t[3]); + w3_t[0] = swap_workaround (w3_t[0]); + w3_t[1] = swap_workaround (w3_t[1]); + w3_t[2] = 0; + w3_t[3] = pw_salt_len * 8; + + u32x digest[5]; + + digest[0] = SHA1M_A; + digest[1] = SHA1M_B; + digest[2] = SHA1M_C; + digest[3] = SHA1M_D; + digest[4] = SHA1M_E; + + sha1_transform (w0_t, w1_t, w2_t, w3_t, digest); + + w0_t[0] = digest[0]; + w0_t[1] = digest[1]; + w0_t[2] = digest[2]; + w0_t[3] = digest[3]; + w1_t[0] = digest[4]; + w1_t[1] = 0; + w1_t[2] = 0x80000000; + w1_t[3] = 0; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = (20 + 4) * 8; + + digest[0] = SHA1M_A; + digest[1] = SHA1M_B; + digest[2] = SHA1M_C; + digest[3] = SHA1M_D; + digest[4] = SHA1M_E; + + sha1_transform (w0_t, w1_t, w2_t, w3_t, digest); + + u32x key[4]; + + key[0] = swap_workaround (digest[0]); + key[1] = swap_workaround (digest[1]); + key[2] = swap_workaround (digest[2]); + key[3] = swap_workaround (digest[3]); + + if (version == 3) + { + key[1] &= 0xff; + key[2] = 0; + key[3] = 0; + } + + rc4_init_16 (rc4_key, key); + + u32x out[4]; + + u8 j = rc4_next_16 (rc4_key, 0, 0, encryptedVerifier, out); + + w0_t[0] = swap_workaround (out[0]); + w0_t[1] = swap_workaround (out[1]); + w0_t[2] = swap_workaround (out[2]); + w0_t[3] = swap_workaround (out[3]); + w1_t[0] = 0x80000000; + w1_t[1] = 0; + w1_t[2] = 0; + w1_t[3] = 0; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = 16 * 8; + + digest[0] = SHA1M_A; + digest[1] = SHA1M_B; + digest[2] = SHA1M_C; + digest[3] = SHA1M_D; + digest[4] = SHA1M_E; + + sha1_transform (w0_t, w1_t, w2_t, w3_t, digest); + + digest[0] = swap_workaround (digest[0]); + digest[1] = swap_workaround (digest[1]); + digest[2] = swap_workaround (digest[2]); + digest[3] = swap_workaround (digest[3]); + + rc4_next_16 (rc4_key, 16, j, digest, out); + + const u32x r0 = out[0]; + const u32x r1 = out[1]; + const u32x r2 = out[2]; + const u32x r3 = out[3]; + + #include VECT_COMPARE_M + } +} + +extern "C" __global__ void __launch_bounds__ (64, 1) m09800_m08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const oldoffice34_t *oldoffice34_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (64, 1) m09800_m16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const oldoffice34_t *oldoffice34_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (64, 1) m09800_s04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const oldoffice34_t *oldoffice34_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + __shared__ RC4_KEY rc4_keys[64]; + + RC4_KEY *rc4_key = &rc4_keys[lid]; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, c_combs[0].pw_len); + } + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * salt + */ + + u32 salt_buf[4]; + + salt_buf[0] = salt_bufs[salt_pos].salt_buf[0]; + salt_buf[1] = salt_bufs[salt_pos].salt_buf[1]; + salt_buf[2] = salt_bufs[salt_pos].salt_buf[2]; + salt_buf[3] = salt_bufs[salt_pos].salt_buf[3]; + + const u32 salt_len = 16; + + /** + * esalt + */ + + const u32 version = oldoffice34_bufs[salt_pos].version; + + u32 encryptedVerifier[4]; + + encryptedVerifier[0] = oldoffice34_bufs[salt_pos].encryptedVerifier[0]; + encryptedVerifier[1] = oldoffice34_bufs[salt_pos].encryptedVerifier[1]; + encryptedVerifier[2] = oldoffice34_bufs[salt_pos].encryptedVerifier[2]; + encryptedVerifier[3] = oldoffice34_bufs[salt_pos].encryptedVerifier[3]; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = c_combs[il_pos].pw_len; + + const u32 pw_len = pw_l_len + pw_r_len; + + const u32 pw_salt_len = (pw_len * 2) + salt_len; + + u32 wordr0[4]; + + wordr0[0] = c_combs[il_pos].i[0]; + wordr0[1] = c_combs[il_pos].i[1]; + wordr0[2] = c_combs[il_pos].i[2]; + wordr0[3] = c_combs[il_pos].i[3]; + + u32 wordr1[4]; + + wordr1[0] = c_combs[il_pos].i[4]; + wordr1[1] = c_combs[il_pos].i[5]; + wordr1[2] = c_combs[il_pos].i[6]; + wordr1[3] = c_combs[il_pos].i[7]; + + u32 wordr2[4]; + + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + + u32 wordr3[4]; + + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + u32x w0[4]; + + w0[0] = wordl0[0] | wordr0[0]; + w0[1] = wordl0[1] | wordr0[1]; + w0[2] = wordl0[2] | wordr0[2]; + w0[3] = wordl0[3] | wordr0[3]; + + u32x w1[4]; + + w1[0] = wordl1[0] | wordr1[0]; + w1[1] = wordl1[1] | wordr1[1]; + w1[2] = wordl1[2] | wordr1[2]; + w1[3] = wordl1[3] | wordr1[3]; + + u32x w2[4]; + + w2[0] = wordl2[0] | wordr2[0]; + w2[1] = wordl2[1] | wordr2[1]; + w2[2] = wordl2[2] | wordr2[2]; + w2[3] = wordl2[3] | wordr2[3]; + + u32x w3[4]; + + w3[0] = wordl3[0] | wordr3[0]; + w3[1] = wordl3[1] | wordr3[1]; + w3[2] = 0; + w3[3] = 0; + + append_0x80_2 (w0, w1, pw_len); + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + make_unicode (w0, w0_t, w1_t); + make_unicode (w1, w2_t, w3_t); + + switch_buffer_by_offset (w0_t, w1_t, w2_t, w3_t, salt_len); + + w0_t[0] = salt_buf[0]; + w0_t[1] = salt_buf[1]; + w0_t[2] = salt_buf[2]; + w0_t[3] = salt_buf[3]; + w1_t[0] = swap_workaround (w1_t[0]); + w1_t[1] = swap_workaround (w1_t[1]); + w1_t[2] = swap_workaround (w1_t[2]); + w1_t[3] = swap_workaround (w1_t[3]); + w2_t[0] = swap_workaround (w2_t[0]); + w2_t[1] = swap_workaround (w2_t[1]); + w2_t[2] = swap_workaround (w2_t[2]); + w2_t[3] = swap_workaround (w2_t[3]); + w3_t[0] = swap_workaround (w3_t[0]); + w3_t[1] = swap_workaround (w3_t[1]); + w3_t[2] = 0; + w3_t[3] = pw_salt_len * 8; + + u32x digest[5]; + + digest[0] = SHA1M_A; + digest[1] = SHA1M_B; + digest[2] = SHA1M_C; + digest[3] = SHA1M_D; + digest[4] = SHA1M_E; + + sha1_transform (w0_t, w1_t, w2_t, w3_t, digest); + + w0_t[0] = digest[0]; + w0_t[1] = digest[1]; + w0_t[2] = digest[2]; + w0_t[3] = digest[3]; + w1_t[0] = digest[4]; + w1_t[1] = 0; + w1_t[2] = 0x80000000; + w1_t[3] = 0; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = (20 + 4) * 8; + + digest[0] = SHA1M_A; + digest[1] = SHA1M_B; + digest[2] = SHA1M_C; + digest[3] = SHA1M_D; + digest[4] = SHA1M_E; + + sha1_transform (w0_t, w1_t, w2_t, w3_t, digest); + + u32x key[4]; + + key[0] = swap_workaround (digest[0]); + key[1] = swap_workaround (digest[1]); + key[2] = swap_workaround (digest[2]); + key[3] = swap_workaround (digest[3]); + + if (version == 3) + { + key[1] &= 0xff; + key[2] = 0; + key[3] = 0; + } + + rc4_init_16 (rc4_key, key); + + u32x out[4]; + + u8 j = rc4_next_16 (rc4_key, 0, 0, encryptedVerifier, out); + + w0_t[0] = swap_workaround (out[0]); + w0_t[1] = swap_workaround (out[1]); + w0_t[2] = swap_workaround (out[2]); + w0_t[3] = swap_workaround (out[3]); + w1_t[0] = 0x80000000; + w1_t[1] = 0; + w1_t[2] = 0; + w1_t[3] = 0; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = 16 * 8; + + digest[0] = SHA1M_A; + digest[1] = SHA1M_B; + digest[2] = SHA1M_C; + digest[3] = SHA1M_D; + digest[4] = SHA1M_E; + + sha1_transform (w0_t, w1_t, w2_t, w3_t, digest); + + digest[0] = swap_workaround (digest[0]); + digest[1] = swap_workaround (digest[1]); + digest[2] = swap_workaround (digest[2]); + digest[3] = swap_workaround (digest[3]); + + rc4_next_16 (rc4_key, 16, j, digest, out); + + const u32x r0 = out[0]; + const u32x r1 = out[1]; + const u32x r2 = out[2]; + const u32x r3 = out[3]; + + #include VECT_COMPARE_S + } +} + +extern "C" __global__ void __launch_bounds__ (64, 1) m09800_s08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const oldoffice34_t *oldoffice34_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (64, 1) m09800_s16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const oldoffice34_t *oldoffice34_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/nv/m09800_a3.cu b/nv/m09800_a3.cu new file mode 100644 index 0000000000..0bf3a8787b --- /dev/null +++ b/nv/m09800_a3.cu @@ -0,0 +1,928 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _OLDOFFICE34_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW2 +#define VECT_SIZE1 +#endif + +#define DGST_R0 0 +#define DGST_R1 1 +#define DGST_R2 2 +#define DGST_R3 3 + +#include "include/kernel_functions.c" +#include "types_nv.c" +#include "common_nv.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +typedef struct +{ + u8 S[256]; + + u32 wtf_its_faster; + +} RC4_KEY; + +__device__ static void swap (RC4_KEY *rc4_key, const u32 i, const u32 j) +{ + u8 tmp; + + tmp = rc4_key->S[i]; + rc4_key->S[i] = rc4_key->S[j]; + rc4_key->S[j] = tmp; +} + +__device__ static void rc4_init_16 (RC4_KEY *rc4_key, const u32 data[4]) +{ + u32 v = 0x03020100; + u32 a = 0x04040404; + + u32 *ptr = (u32 *) rc4_key->S; + + #pragma unroll 64 + for (u32 i = 0; i < 64; i++) + { + *ptr++ = v; v += a; + } + + u32 j = 0; + + for (u32 i = 0; i < 16; i++) + { + u32 idx = i * 16; + + u32 v; + + v = data[0]; + + j += rc4_key->S[idx] + (v >> 0); swap (rc4_key, idx, j & 0xff); idx++; + j += rc4_key->S[idx] + (v >> 8); swap (rc4_key, idx, j & 0xff); idx++; + j += rc4_key->S[idx] + (v >> 16); swap (rc4_key, idx, j & 0xff); idx++; + j += rc4_key->S[idx] + (v >> 24); swap (rc4_key, idx, j & 0xff); idx++; + + v = data[1]; + + j += rc4_key->S[idx] + (v >> 0); swap (rc4_key, idx, j & 0xff); idx++; + j += rc4_key->S[idx] + (v >> 8); swap (rc4_key, idx, j & 0xff); idx++; + j += rc4_key->S[idx] + (v >> 16); swap (rc4_key, idx, j & 0xff); idx++; + j += rc4_key->S[idx] + (v >> 24); swap (rc4_key, idx, j & 0xff); idx++; + + v = data[2]; + + j += rc4_key->S[idx] + (v >> 0); swap (rc4_key, idx, j & 0xff); idx++; + j += rc4_key->S[idx] + (v >> 8); swap (rc4_key, idx, j & 0xff); idx++; + j += rc4_key->S[idx] + (v >> 16); swap (rc4_key, idx, j & 0xff); idx++; + j += rc4_key->S[idx] + (v >> 24); swap (rc4_key, idx, j & 0xff); idx++; + + v = data[3]; + + j += rc4_key->S[idx] + (v >> 0); swap (rc4_key, idx, j & 0xff); idx++; + j += rc4_key->S[idx] + (v >> 8); swap (rc4_key, idx, j & 0xff); idx++; + j += rc4_key->S[idx] + (v >> 16); swap (rc4_key, idx, j & 0xff); idx++; + j += rc4_key->S[idx] + (v >> 24); swap (rc4_key, idx, j & 0xff); idx++; + } +} + +__device__ static u8 rc4_next_16 (RC4_KEY *rc4_key, u8 i, u8 j, const u32 in[4], u32 out[4]) +{ + for (u32 k = 0; k < 4; k++) + { + u32 xor4 = 0; + + u8 idx; + + i += 1; + j += rc4_key->S[i]; + + swap (rc4_key, i, j); + + idx = rc4_key->S[i] + rc4_key->S[j]; + + xor4 |= rc4_key->S[idx] << 0; + + i += 1; + j += rc4_key->S[i]; + + swap (rc4_key, i, j); + + idx = rc4_key->S[i] + rc4_key->S[j]; + + xor4 |= rc4_key->S[idx] << 8; + + i += 1; + j += rc4_key->S[i]; + + swap (rc4_key, i, j); + + idx = rc4_key->S[i] + rc4_key->S[j]; + + xor4 |= rc4_key->S[idx] << 16; + + i += 1; + j += rc4_key->S[i]; + + swap (rc4_key, i, j); + + idx = rc4_key->S[i] + rc4_key->S[j]; + + xor4 |= rc4_key->S[idx] << 24; + + out[k] = in[k] ^ xor4; + } + + return j; +} + +__device__ static void sha1_transform (const u32x w0[4], const u32x w1[4], const u32x w2[4], const u32x w3[4], u32x digest[5]) +{ + u32x A = digest[0]; + u32x B = digest[1]; + u32x C = digest[2]; + u32x D = digest[3]; + u32x E = digest[4]; + + u32x w0_t = w0[0]; + u32x w1_t = w0[1]; + u32x w2_t = w0[2]; + u32x w3_t = w0[3]; + u32x w4_t = w1[0]; + u32x w5_t = w1[1]; + u32x w6_t = w1[2]; + u32x w7_t = w1[3]; + u32x w8_t = w2[0]; + u32x w9_t = w2[1]; + u32x wa_t = w2[2]; + u32x wb_t = w2[3]; + u32x wc_t = w3[0]; + u32x wd_t = w3[1]; + u32x we_t = w3[2]; + u32x wf_t = w3[3]; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, A, B, C, D, E, w0_t); + SHA1_STEP (SHA1_F0o, E, A, B, C, D, w1_t); + SHA1_STEP (SHA1_F0o, D, E, A, B, C, w2_t); + SHA1_STEP (SHA1_F0o, C, D, E, A, B, w3_t); + SHA1_STEP (SHA1_F0o, B, C, D, E, A, w4_t); + SHA1_STEP (SHA1_F0o, A, B, C, D, E, w5_t); + SHA1_STEP (SHA1_F0o, E, A, B, C, D, w6_t); + SHA1_STEP (SHA1_F0o, D, E, A, B, C, w7_t); + SHA1_STEP (SHA1_F0o, C, D, E, A, B, w8_t); + SHA1_STEP (SHA1_F0o, B, C, D, E, A, w9_t); + SHA1_STEP (SHA1_F0o, A, B, C, D, E, wa_t); + SHA1_STEP (SHA1_F0o, E, A, B, C, D, wb_t); + SHA1_STEP (SHA1_F0o, D, E, A, B, C, wc_t); + SHA1_STEP (SHA1_F0o, C, D, E, A, B, wd_t); + SHA1_STEP (SHA1_F0o, B, C, D, E, A, we_t); + SHA1_STEP (SHA1_F0o, A, B, C, D, E, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F0o, E, A, B, C, D, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F0o, D, E, A, B, C, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F0o, C, D, E, A, B, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F0o, B, C, D, E, A, w3_t); + + #undef K + #define K SHA1C01 + + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w7_t); + + #undef K + #define K SHA1C02 + + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, wb_t); + + #undef K + #define K SHA1C03 + + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, wf_t); + + digest[0] += A; + digest[1] += B; + digest[2] += C; + digest[3] += D; + digest[4] += E; +} + +__device__ __constant__ bf_t c_bfs[1024]; + +__device__ static void m09800m (RC4_KEY rc4_keys[64], u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], const u32 pw_len, const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const u32x *bfs_buf, void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const oldoffice34_t *oldoffice34_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset) +{ + /** + * modifier + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + const u32 lid = threadIdx.x; + + RC4_KEY *rc4_key = &rc4_keys[lid]; + + /** + * salt + */ + + u32 salt_buf[4]; + + salt_buf[0] = salt_bufs[salt_pos].salt_buf[0]; + salt_buf[1] = salt_bufs[salt_pos].salt_buf[1]; + salt_buf[2] = salt_bufs[salt_pos].salt_buf[2]; + salt_buf[3] = salt_bufs[salt_pos].salt_buf[3]; + + const u32 salt_len = 16; + + const u32 pw_salt_len = pw_len + salt_len; + + /** + * esalt + */ + + const u32 version = oldoffice34_bufs[salt_pos].version; + + u32 encryptedVerifier[4]; + + encryptedVerifier[0] = oldoffice34_bufs[salt_pos].encryptedVerifier[0]; + encryptedVerifier[1] = oldoffice34_bufs[salt_pos].encryptedVerifier[1]; + encryptedVerifier[2] = oldoffice34_bufs[salt_pos].encryptedVerifier[2]; + encryptedVerifier[3] = oldoffice34_bufs[salt_pos].encryptedVerifier[3]; + + /** + * loop + */ + + u32x w0l = w0[0]; + + for (u32 il_pos = 0; il_pos < bfs_cnt; il_pos++) + { + const u32 w0r = c_bfs[il_pos].i; + + w0[0] = w0l | w0r; + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + w0_t[0] = salt_buf[0]; + w0_t[1] = salt_buf[1]; + w0_t[2] = salt_buf[2]; + w0_t[3] = salt_buf[3]; + w1_t[0] = w0[0]; + w1_t[1] = w0[1]; + w1_t[2] = w0[2]; + w1_t[3] = w0[3]; + w2_t[0] = w1[0]; + w2_t[1] = w1[1]; + w2_t[2] = w1[2]; + w2_t[3] = w1[3]; + w3_t[0] = w2[0]; + w3_t[1] = w2[1]; + w3_t[2] = 0; + w3_t[3] = pw_salt_len * 8; + + u32x digest[5]; + + digest[0] = SHA1M_A; + digest[1] = SHA1M_B; + digest[2] = SHA1M_C; + digest[3] = SHA1M_D; + digest[4] = SHA1M_E; + + sha1_transform (w0_t, w1_t, w2_t, w3_t, digest); + + w0_t[0] = digest[0]; + w0_t[1] = digest[1]; + w0_t[2] = digest[2]; + w0_t[3] = digest[3]; + w1_t[0] = digest[4]; + w1_t[1] = 0; + w1_t[2] = 0x80000000; + w1_t[3] = 0; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = (20 + 4) * 8; + + digest[0] = SHA1M_A; + digest[1] = SHA1M_B; + digest[2] = SHA1M_C; + digest[3] = SHA1M_D; + digest[4] = SHA1M_E; + + sha1_transform (w0_t, w1_t, w2_t, w3_t, digest); + + u32x key[4]; + + key[0] = swap_workaround (digest[0]); + key[1] = swap_workaround (digest[1]); + key[2] = swap_workaround (digest[2]); + key[3] = swap_workaround (digest[3]); + + if (version == 3) + { + key[1] &= 0xff; + key[2] = 0; + key[3] = 0; + } + + rc4_init_16 (rc4_key, key); + + u32x out[4]; + + u8 j = rc4_next_16 (rc4_key, 0, 0, encryptedVerifier, out); + + w0_t[0] = swap_workaround (out[0]); + w0_t[1] = swap_workaround (out[1]); + w0_t[2] = swap_workaround (out[2]); + w0_t[3] = swap_workaround (out[3]); + w1_t[0] = 0x80000000; + w1_t[1] = 0; + w1_t[2] = 0; + w1_t[3] = 0; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = 16 * 8; + + digest[0] = SHA1M_A; + digest[1] = SHA1M_B; + digest[2] = SHA1M_C; + digest[3] = SHA1M_D; + digest[4] = SHA1M_E; + + sha1_transform (w0_t, w1_t, w2_t, w3_t, digest); + + digest[0] = swap_workaround (digest[0]); + digest[1] = swap_workaround (digest[1]); + digest[2] = swap_workaround (digest[2]); + digest[3] = swap_workaround (digest[3]); + + rc4_next_16 (rc4_key, 16, j, digest, out); + + const u32x r0 = out[0]; + const u32x r1 = out[1]; + const u32x r2 = out[2]; + const u32x r3 = out[3]; + + #include VECT_COMPARE_M + } +} + +__device__ static void m09800s (RC4_KEY rc4_keys[64], u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], const u32 pw_len, const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const u32x *bfs_buf, void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const oldoffice34_t *oldoffice34_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset) +{ + /** + * modifier + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + const u32 lid = threadIdx.x; + + RC4_KEY *rc4_key = &rc4_keys[lid]; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * salt + */ + + u32 salt_buf[4]; + + salt_buf[0] = salt_bufs[salt_pos].salt_buf[0]; + salt_buf[1] = salt_bufs[salt_pos].salt_buf[1]; + salt_buf[2] = salt_bufs[salt_pos].salt_buf[2]; + salt_buf[3] = salt_bufs[salt_pos].salt_buf[3]; + + const u32 salt_len = 16; + + const u32 pw_salt_len = pw_len + salt_len; + + /** + * esalt + */ + + const u32 version = oldoffice34_bufs[salt_pos].version; + + u32 encryptedVerifier[4]; + + encryptedVerifier[0] = oldoffice34_bufs[salt_pos].encryptedVerifier[0]; + encryptedVerifier[1] = oldoffice34_bufs[salt_pos].encryptedVerifier[1]; + encryptedVerifier[2] = oldoffice34_bufs[salt_pos].encryptedVerifier[2]; + encryptedVerifier[3] = oldoffice34_bufs[salt_pos].encryptedVerifier[3]; + + /** + * loop + */ + + u32x w0l = w0[0]; + + for (u32 il_pos = 0; il_pos < bfs_cnt; il_pos++) + { + const u32 w0r = c_bfs[il_pos].i; + + w0[0] = w0l | w0r; + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + w0_t[0] = salt_buf[0]; + w0_t[1] = salt_buf[1]; + w0_t[2] = salt_buf[2]; + w0_t[3] = salt_buf[3]; + w1_t[0] = w0[0]; + w1_t[1] = w0[1]; + w1_t[2] = w0[2]; + w1_t[3] = w0[3]; + w2_t[0] = w1[0]; + w2_t[1] = w1[1]; + w2_t[2] = w1[2]; + w2_t[3] = w1[3]; + w3_t[0] = w2[0]; + w3_t[1] = w2[1]; + w3_t[2] = 0; + w3_t[3] = pw_salt_len * 8; + + u32x digest[5]; + + digest[0] = SHA1M_A; + digest[1] = SHA1M_B; + digest[2] = SHA1M_C; + digest[3] = SHA1M_D; + digest[4] = SHA1M_E; + + sha1_transform (w0_t, w1_t, w2_t, w3_t, digest); + + w0_t[0] = digest[0]; + w0_t[1] = digest[1]; + w0_t[2] = digest[2]; + w0_t[3] = digest[3]; + w1_t[0] = digest[4]; + w1_t[1] = 0; + w1_t[2] = 0x80000000; + w1_t[3] = 0; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = (20 + 4) * 8; + + digest[0] = SHA1M_A; + digest[1] = SHA1M_B; + digest[2] = SHA1M_C; + digest[3] = SHA1M_D; + digest[4] = SHA1M_E; + + sha1_transform (w0_t, w1_t, w2_t, w3_t, digest); + + u32x key[4]; + + key[0] = swap_workaround (digest[0]); + key[1] = swap_workaround (digest[1]); + key[2] = swap_workaround (digest[2]); + key[3] = swap_workaround (digest[3]); + + if (version == 3) + { + key[1] &= 0xff; + key[2] = 0; + key[3] = 0; + } + + rc4_init_16 (rc4_key, key); + + u32x out[4]; + + u8 j = rc4_next_16 (rc4_key, 0, 0, encryptedVerifier, out); + + w0_t[0] = swap_workaround (out[0]); + w0_t[1] = swap_workaround (out[1]); + w0_t[2] = swap_workaround (out[2]); + w0_t[3] = swap_workaround (out[3]); + w1_t[0] = 0x80000000; + w1_t[1] = 0; + w1_t[2] = 0; + w1_t[3] = 0; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = 16 * 8; + + digest[0] = SHA1M_A; + digest[1] = SHA1M_B; + digest[2] = SHA1M_C; + digest[3] = SHA1M_D; + digest[4] = SHA1M_E; + + sha1_transform (w0_t, w1_t, w2_t, w3_t, digest); + + digest[0] = swap_workaround (digest[0]); + digest[1] = swap_workaround (digest[1]); + digest[2] = swap_workaround (digest[2]); + digest[3] = swap_workaround (digest[3]); + + rc4_next_16 (rc4_key, 16, j, digest, out); + + const u32x r0 = out[0]; + const u32x r1 = out[1]; + const u32x r2 = out[2]; + const u32x r3 = out[3]; + + #include VECT_COMPARE_S + } +} + +extern "C" __global__ void __launch_bounds__ (64, 1) m09800_m04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const u32x *bfs_buf, void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const oldoffice34_t *oldoffice34_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + __shared__ RC4_KEY rc4_keys[64]; + + m09800m (rc4_keys, w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, oldoffice34_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (64, 1) m09800_m08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const u32x *bfs_buf, void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const oldoffice34_t *oldoffice34_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + __shared__ RC4_KEY rc4_keys[64]; + + m09800m (rc4_keys, w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, oldoffice34_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (64, 1) m09800_m16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const u32x *bfs_buf, void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const oldoffice34_t *oldoffice34_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = pws[gid].i[ 8]; + w2[1] = pws[gid].i[ 9]; + w2[2] = pws[gid].i[10]; + w2[3] = pws[gid].i[11]; + + u32x w3[4]; + + w3[0] = pws[gid].i[12]; + w3[1] = pws[gid].i[13]; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + __shared__ RC4_KEY rc4_keys[64]; + + m09800m (rc4_keys, w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, oldoffice34_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (64, 1) m09800_s04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const u32x *bfs_buf, void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const oldoffice34_t *oldoffice34_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + __shared__ RC4_KEY rc4_keys[64]; + + m09800s (rc4_keys, w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, oldoffice34_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (64, 1) m09800_s08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const u32x *bfs_buf, void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const oldoffice34_t *oldoffice34_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + __shared__ RC4_KEY rc4_keys[64]; + + m09800s (rc4_keys, w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, oldoffice34_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (64, 1) m09800_s16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const u32x *bfs_buf, void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const oldoffice34_t *oldoffice34_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = pws[gid].i[ 8]; + w2[1] = pws[gid].i[ 9]; + w2[2] = pws[gid].i[10]; + w2[3] = pws[gid].i[11]; + + u32x w3[4]; + + w3[0] = pws[gid].i[12]; + w3[1] = pws[gid].i[13]; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + __shared__ RC4_KEY rc4_keys[64]; + + m09800s (rc4_keys, w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, oldoffice34_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} diff --git a/nv/m09810_a0.cu b/nv/m09810_a0.cu new file mode 100644 index 0000000000..2313691021 --- /dev/null +++ b/nv/m09810_a0.cu @@ -0,0 +1,611 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _OLDOFFICE34_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW2 +#define VECT_SIZE1 +#endif + +#define DGST_R0 0 +#define DGST_R1 1 +#define DGST_R2 2 +#define DGST_R3 3 + +#include "include/kernel_functions.c" +#include "types_nv.c" +#include "common_nv.c" +#include "include/rp_gpu.h" +#include "rp_nv.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +typedef struct +{ + u8 S[256]; + + u32 wtf_its_faster; + +} RC4_KEY; + +__device__ static void swap (RC4_KEY *rc4_key, const u32 i, const u32 j) +{ + u8 tmp; + + tmp = rc4_key->S[i]; + rc4_key->S[i] = rc4_key->S[j]; + rc4_key->S[j] = tmp; +} + +__device__ static void rc4_init_16 (RC4_KEY *rc4_key, const u32 data[4]) +{ + u32 v = 0x03020100; + u32 a = 0x04040404; + + u32 *ptr = (u32 *) rc4_key->S; + + #pragma unroll 64 + for (u32 i = 0; i < 64; i++) + { + *ptr++ = v; v += a; + } + + u32 j = 0; + + for (u32 i = 0; i < 16; i++) + { + u32 idx = i * 16; + + u32 v; + + v = data[0]; + + j += rc4_key->S[idx] + (v >> 0); swap (rc4_key, idx, j & 0xff); idx++; + j += rc4_key->S[idx] + (v >> 8); swap (rc4_key, idx, j & 0xff); idx++; + j += rc4_key->S[idx] + (v >> 16); swap (rc4_key, idx, j & 0xff); idx++; + j += rc4_key->S[idx] + (v >> 24); swap (rc4_key, idx, j & 0xff); idx++; + + v = data[1]; + + j += rc4_key->S[idx] + (v >> 0); swap (rc4_key, idx, j & 0xff); idx++; + j += rc4_key->S[idx] + (v >> 8); swap (rc4_key, idx, j & 0xff); idx++; + j += rc4_key->S[idx] + (v >> 16); swap (rc4_key, idx, j & 0xff); idx++; + j += rc4_key->S[idx] + (v >> 24); swap (rc4_key, idx, j & 0xff); idx++; + + v = data[2]; + + j += rc4_key->S[idx] + (v >> 0); swap (rc4_key, idx, j & 0xff); idx++; + j += rc4_key->S[idx] + (v >> 8); swap (rc4_key, idx, j & 0xff); idx++; + j += rc4_key->S[idx] + (v >> 16); swap (rc4_key, idx, j & 0xff); idx++; + j += rc4_key->S[idx] + (v >> 24); swap (rc4_key, idx, j & 0xff); idx++; + + v = data[3]; + + j += rc4_key->S[idx] + (v >> 0); swap (rc4_key, idx, j & 0xff); idx++; + j += rc4_key->S[idx] + (v >> 8); swap (rc4_key, idx, j & 0xff); idx++; + j += rc4_key->S[idx] + (v >> 16); swap (rc4_key, idx, j & 0xff); idx++; + j += rc4_key->S[idx] + (v >> 24); swap (rc4_key, idx, j & 0xff); idx++; + } +} + +__device__ static u8 rc4_next_16 (RC4_KEY *rc4_key, u8 i, u8 j, const u32 in[4], u32 out[4]) +{ + for (u32 k = 0; k < 4; k++) + { + u32 xor4 = 0; + + u8 idx; + + i += 1; + j += rc4_key->S[i]; + + swap (rc4_key, i, j); + + idx = rc4_key->S[i] + rc4_key->S[j]; + + xor4 |= rc4_key->S[idx] << 0; + + i += 1; + j += rc4_key->S[i]; + + swap (rc4_key, i, j); + + idx = rc4_key->S[i] + rc4_key->S[j]; + + xor4 |= rc4_key->S[idx] << 8; + + i += 1; + j += rc4_key->S[i]; + + swap (rc4_key, i, j); + + idx = rc4_key->S[i] + rc4_key->S[j]; + + xor4 |= rc4_key->S[idx] << 16; + + i += 1; + j += rc4_key->S[i]; + + swap (rc4_key, i, j); + + idx = rc4_key->S[i] + rc4_key->S[j]; + + xor4 |= rc4_key->S[idx] << 24; + + out[k] = in[k] ^ xor4; + } + + return j; +} + +__device__ static void sha1_transform (const u32x w0[4], const u32x w1[4], const u32x w2[4], const u32x w3[4], u32x digest[5]) +{ + u32x A = digest[0]; + u32x B = digest[1]; + u32x C = digest[2]; + u32x D = digest[3]; + u32x E = digest[4]; + + u32x w0_t = w0[0]; + u32x w1_t = w0[1]; + u32x w2_t = w0[2]; + u32x w3_t = w0[3]; + u32x w4_t = w1[0]; + u32x w5_t = w1[1]; + u32x w6_t = w1[2]; + u32x w7_t = w1[3]; + u32x w8_t = w2[0]; + u32x w9_t = w2[1]; + u32x wa_t = w2[2]; + u32x wb_t = w2[3]; + u32x wc_t = w3[0]; + u32x wd_t = w3[1]; + u32x we_t = w3[2]; + u32x wf_t = w3[3]; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, A, B, C, D, E, w0_t); + SHA1_STEP (SHA1_F0o, E, A, B, C, D, w1_t); + SHA1_STEP (SHA1_F0o, D, E, A, B, C, w2_t); + SHA1_STEP (SHA1_F0o, C, D, E, A, B, w3_t); + SHA1_STEP (SHA1_F0o, B, C, D, E, A, w4_t); + SHA1_STEP (SHA1_F0o, A, B, C, D, E, w5_t); + SHA1_STEP (SHA1_F0o, E, A, B, C, D, w6_t); + SHA1_STEP (SHA1_F0o, D, E, A, B, C, w7_t); + SHA1_STEP (SHA1_F0o, C, D, E, A, B, w8_t); + SHA1_STEP (SHA1_F0o, B, C, D, E, A, w9_t); + SHA1_STEP (SHA1_F0o, A, B, C, D, E, wa_t); + SHA1_STEP (SHA1_F0o, E, A, B, C, D, wb_t); + SHA1_STEP (SHA1_F0o, D, E, A, B, C, wc_t); + SHA1_STEP (SHA1_F0o, C, D, E, A, B, wd_t); + SHA1_STEP (SHA1_F0o, B, C, D, E, A, we_t); + SHA1_STEP (SHA1_F0o, A, B, C, D, E, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F0o, E, A, B, C, D, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F0o, D, E, A, B, C, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F0o, C, D, E, A, B, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F0o, B, C, D, E, A, w3_t); + + #undef K + #define K SHA1C01 + + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w7_t); + + #undef K + #define K SHA1C02 + + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, wb_t); + + #undef K + #define K SHA1C03 + + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, wf_t); + + digest[0] += A; + digest[1] += B; + digest[2] += C; + digest[3] += D; + digest[4] += E; +} + +__device__ __constant__ gpu_rule_t c_rules[1024]; + +extern "C" __global__ void __launch_bounds__ (64, 1) m09810_m04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const oldoffice34_t *oldoffice34_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + __shared__ RC4_KEY rc4_keys[64]; + + RC4_KEY *rc4_key = &rc4_keys[lid]; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + u32x pw_buf1[4]; + + pw_buf1[0] = pws[gid].i[ 4]; + pw_buf1[1] = pws[gid].i[ 5]; + pw_buf1[2] = pws[gid].i[ 6]; + pw_buf1[3] = pws[gid].i[ 7]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * esalt + */ + + const u32 version = oldoffice34_bufs[salt_pos].version; + + u32 encryptedVerifier[4]; + + encryptedVerifier[0] = oldoffice34_bufs[salt_pos].encryptedVerifier[0]; + encryptedVerifier[1] = oldoffice34_bufs[salt_pos].encryptedVerifier[1]; + encryptedVerifier[2] = oldoffice34_bufs[salt_pos].encryptedVerifier[2]; + encryptedVerifier[3] = oldoffice34_bufs[salt_pos].encryptedVerifier[3]; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + + w0[0] = pw_buf0[0]; + w0[1] = pw_buf0[1]; + w0[2] = pw_buf0[2]; + w0[3] = pw_buf0[3]; + + u32x w1[4]; + + w1[0] = pw_buf1[0]; + w1[1] = pw_buf1[1]; + w1[2] = pw_buf1[2]; + w1[3] = pw_buf1[3]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + apply_rules (c_rules[il_pos].cmds, w0, w1, pw_len); + + u32x key[4]; + + key[0] = w0[0]; + key[1] = w0[1] & 0xff; + key[2] = 0; + key[3] = 0; + + rc4_init_16 (rc4_key, key); + + u32x out[4]; + + u8 j = rc4_next_16 (rc4_key, 0, 0, encryptedVerifier, out); + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + w0_t[0] = swap_workaround (out[0]); + w0_t[1] = swap_workaround (out[1]); + w0_t[2] = swap_workaround (out[2]); + w0_t[3] = swap_workaround (out[3]); + w1_t[0] = 0x80000000; + w1_t[1] = 0; + w1_t[2] = 0; + w1_t[3] = 0; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = 16 * 8; + + u32x digest[5]; + + digest[0] = SHA1M_A; + digest[1] = SHA1M_B; + digest[2] = SHA1M_C; + digest[3] = SHA1M_D; + digest[4] = SHA1M_E; + + sha1_transform (w0_t, w1_t, w2_t, w3_t, digest); + + digest[0] = swap_workaround (digest[0]); + digest[1] = swap_workaround (digest[1]); + digest[2] = swap_workaround (digest[2]); + digest[3] = swap_workaround (digest[3]); + + rc4_next_16 (rc4_key, 16, j, digest, out); + + const u32x r0 = out[0]; + const u32x r1 = out[1]; + const u32x r2 = out[2]; + const u32x r3 = out[3]; + + #include VECT_COMPARE_M + } +} + +extern "C" __global__ void __launch_bounds__ (64, 1) m09810_m08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const oldoffice34_t *oldoffice34_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (64, 1) m09810_m16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const oldoffice34_t *oldoffice34_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (64, 1) m09810_s04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const oldoffice34_t *oldoffice34_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + __shared__ RC4_KEY rc4_keys[64]; + + RC4_KEY *rc4_key = &rc4_keys[lid]; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + u32x pw_buf1[4]; + + pw_buf1[0] = pws[gid].i[ 4]; + pw_buf1[1] = pws[gid].i[ 5]; + pw_buf1[2] = pws[gid].i[ 6]; + pw_buf1[3] = pws[gid].i[ 7]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * esalt + */ + + const u32 version = oldoffice34_bufs[salt_pos].version; + + u32 encryptedVerifier[4]; + + encryptedVerifier[0] = oldoffice34_bufs[salt_pos].encryptedVerifier[0]; + encryptedVerifier[1] = oldoffice34_bufs[salt_pos].encryptedVerifier[1]; + encryptedVerifier[2] = oldoffice34_bufs[salt_pos].encryptedVerifier[2]; + encryptedVerifier[3] = oldoffice34_bufs[salt_pos].encryptedVerifier[3]; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + + w0[0] = pw_buf0[0]; + w0[1] = pw_buf0[1]; + w0[2] = pw_buf0[2]; + w0[3] = pw_buf0[3]; + + u32x w1[4]; + + w1[0] = pw_buf1[0]; + w1[1] = pw_buf1[1]; + w1[2] = pw_buf1[2]; + w1[3] = pw_buf1[3]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + apply_rules (c_rules[il_pos].cmds, w0, w1, pw_len); + + u32x key[4]; + + key[0] = w0[0]; + key[1] = w0[1] & 0xff; + key[2] = 0; + key[3] = 0; + + rc4_init_16 (rc4_key, key); + + u32x out[4]; + + u8 j = rc4_next_16 (rc4_key, 0, 0, encryptedVerifier, out); + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + w0_t[0] = swap_workaround (out[0]); + w0_t[1] = swap_workaround (out[1]); + w0_t[2] = swap_workaround (out[2]); + w0_t[3] = swap_workaround (out[3]); + w1_t[0] = 0x80000000; + w1_t[1] = 0; + w1_t[2] = 0; + w1_t[3] = 0; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = 16 * 8; + + u32x digest[5]; + + digest[0] = SHA1M_A; + digest[1] = SHA1M_B; + digest[2] = SHA1M_C; + digest[3] = SHA1M_D; + digest[4] = SHA1M_E; + + sha1_transform (w0_t, w1_t, w2_t, w3_t, digest); + + digest[0] = swap_workaround (digest[0]); + digest[1] = swap_workaround (digest[1]); + digest[2] = swap_workaround (digest[2]); + digest[3] = swap_workaround (digest[3]); + + rc4_next_16 (rc4_key, 16, j, digest, out); + + const u32x r0 = out[0]; + const u32x r1 = out[1]; + const u32x r2 = out[2]; + const u32x r3 = out[3]; + + #include VECT_COMPARE_S + } +} + +extern "C" __global__ void __launch_bounds__ (64, 1) m09810_s08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const oldoffice34_t *oldoffice34_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (64, 1) m09810_s16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const oldoffice34_t *oldoffice34_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/nv/m09810_a1.cu b/nv/m09810_a1.cu new file mode 100644 index 0000000000..b1f40b29ec --- /dev/null +++ b/nv/m09810_a1.cu @@ -0,0 +1,657 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _OLDOFFICE34_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW2 +#define VECT_SIZE1 +#endif + +#define DGST_R0 0 +#define DGST_R1 1 +#define DGST_R2 2 +#define DGST_R3 3 + +#include "include/kernel_functions.c" +#include "types_nv.c" +#include "common_nv.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +typedef struct +{ + u8 S[256]; + + u32 wtf_its_faster; + +} RC4_KEY; + +__device__ static void swap (RC4_KEY *rc4_key, const u32 i, const u32 j) +{ + u8 tmp; + + tmp = rc4_key->S[i]; + rc4_key->S[i] = rc4_key->S[j]; + rc4_key->S[j] = tmp; +} + +__device__ static void rc4_init_16 (RC4_KEY *rc4_key, const u32 data[4]) +{ + u32 v = 0x03020100; + u32 a = 0x04040404; + + u32 *ptr = (u32 *) rc4_key->S; + + #pragma unroll 64 + for (u32 i = 0; i < 64; i++) + { + *ptr++ = v; v += a; + } + + u32 j = 0; + + for (u32 i = 0; i < 16; i++) + { + u32 idx = i * 16; + + u32 v; + + v = data[0]; + + j += rc4_key->S[idx] + (v >> 0); swap (rc4_key, idx, j & 0xff); idx++; + j += rc4_key->S[idx] + (v >> 8); swap (rc4_key, idx, j & 0xff); idx++; + j += rc4_key->S[idx] + (v >> 16); swap (rc4_key, idx, j & 0xff); idx++; + j += rc4_key->S[idx] + (v >> 24); swap (rc4_key, idx, j & 0xff); idx++; + + v = data[1]; + + j += rc4_key->S[idx] + (v >> 0); swap (rc4_key, idx, j & 0xff); idx++; + j += rc4_key->S[idx] + (v >> 8); swap (rc4_key, idx, j & 0xff); idx++; + j += rc4_key->S[idx] + (v >> 16); swap (rc4_key, idx, j & 0xff); idx++; + j += rc4_key->S[idx] + (v >> 24); swap (rc4_key, idx, j & 0xff); idx++; + + v = data[2]; + + j += rc4_key->S[idx] + (v >> 0); swap (rc4_key, idx, j & 0xff); idx++; + j += rc4_key->S[idx] + (v >> 8); swap (rc4_key, idx, j & 0xff); idx++; + j += rc4_key->S[idx] + (v >> 16); swap (rc4_key, idx, j & 0xff); idx++; + j += rc4_key->S[idx] + (v >> 24); swap (rc4_key, idx, j & 0xff); idx++; + + v = data[3]; + + j += rc4_key->S[idx] + (v >> 0); swap (rc4_key, idx, j & 0xff); idx++; + j += rc4_key->S[idx] + (v >> 8); swap (rc4_key, idx, j & 0xff); idx++; + j += rc4_key->S[idx] + (v >> 16); swap (rc4_key, idx, j & 0xff); idx++; + j += rc4_key->S[idx] + (v >> 24); swap (rc4_key, idx, j & 0xff); idx++; + } +} + +__device__ static u8 rc4_next_16 (RC4_KEY *rc4_key, u8 i, u8 j, const u32 in[4], u32 out[4]) +{ + for (u32 k = 0; k < 4; k++) + { + u32 xor4 = 0; + + u8 idx; + + i += 1; + j += rc4_key->S[i]; + + swap (rc4_key, i, j); + + idx = rc4_key->S[i] + rc4_key->S[j]; + + xor4 |= rc4_key->S[idx] << 0; + + i += 1; + j += rc4_key->S[i]; + + swap (rc4_key, i, j); + + idx = rc4_key->S[i] + rc4_key->S[j]; + + xor4 |= rc4_key->S[idx] << 8; + + i += 1; + j += rc4_key->S[i]; + + swap (rc4_key, i, j); + + idx = rc4_key->S[i] + rc4_key->S[j]; + + xor4 |= rc4_key->S[idx] << 16; + + i += 1; + j += rc4_key->S[i]; + + swap (rc4_key, i, j); + + idx = rc4_key->S[i] + rc4_key->S[j]; + + xor4 |= rc4_key->S[idx] << 24; + + out[k] = in[k] ^ xor4; + } + + return j; +} + +__device__ static void sha1_transform (const u32x w0[4], const u32x w1[4], const u32x w2[4], const u32x w3[4], u32x digest[5]) +{ + u32x A = digest[0]; + u32x B = digest[1]; + u32x C = digest[2]; + u32x D = digest[3]; + u32x E = digest[4]; + + u32x w0_t = w0[0]; + u32x w1_t = w0[1]; + u32x w2_t = w0[2]; + u32x w3_t = w0[3]; + u32x w4_t = w1[0]; + u32x w5_t = w1[1]; + u32x w6_t = w1[2]; + u32x w7_t = w1[3]; + u32x w8_t = w2[0]; + u32x w9_t = w2[1]; + u32x wa_t = w2[2]; + u32x wb_t = w2[3]; + u32x wc_t = w3[0]; + u32x wd_t = w3[1]; + u32x we_t = w3[2]; + u32x wf_t = w3[3]; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, A, B, C, D, E, w0_t); + SHA1_STEP (SHA1_F0o, E, A, B, C, D, w1_t); + SHA1_STEP (SHA1_F0o, D, E, A, B, C, w2_t); + SHA1_STEP (SHA1_F0o, C, D, E, A, B, w3_t); + SHA1_STEP (SHA1_F0o, B, C, D, E, A, w4_t); + SHA1_STEP (SHA1_F0o, A, B, C, D, E, w5_t); + SHA1_STEP (SHA1_F0o, E, A, B, C, D, w6_t); + SHA1_STEP (SHA1_F0o, D, E, A, B, C, w7_t); + SHA1_STEP (SHA1_F0o, C, D, E, A, B, w8_t); + SHA1_STEP (SHA1_F0o, B, C, D, E, A, w9_t); + SHA1_STEP (SHA1_F0o, A, B, C, D, E, wa_t); + SHA1_STEP (SHA1_F0o, E, A, B, C, D, wb_t); + SHA1_STEP (SHA1_F0o, D, E, A, B, C, wc_t); + SHA1_STEP (SHA1_F0o, C, D, E, A, B, wd_t); + SHA1_STEP (SHA1_F0o, B, C, D, E, A, we_t); + SHA1_STEP (SHA1_F0o, A, B, C, D, E, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F0o, E, A, B, C, D, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F0o, D, E, A, B, C, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F0o, C, D, E, A, B, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F0o, B, C, D, E, A, w3_t); + + #undef K + #define K SHA1C01 + + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w7_t); + + #undef K + #define K SHA1C02 + + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, wb_t); + + #undef K + #define K SHA1C03 + + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, wf_t); + + digest[0] += A; + digest[1] += B; + digest[2] += C; + digest[3] += D; + digest[4] += E; +} + +__device__ __constant__ comb_t c_combs[1024]; + +extern "C" __global__ void __launch_bounds__ (64, 1) m09810_m04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const oldoffice34_t *oldoffice34_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + __shared__ RC4_KEY rc4_keys[64]; + + RC4_KEY *rc4_key = &rc4_keys[lid]; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, c_combs[0].pw_len); + } + + /** + * esalt + */ + + const u32 version = oldoffice34_bufs[salt_pos].version; + + u32 encryptedVerifier[4]; + + encryptedVerifier[0] = oldoffice34_bufs[salt_pos].encryptedVerifier[0]; + encryptedVerifier[1] = oldoffice34_bufs[salt_pos].encryptedVerifier[1]; + encryptedVerifier[2] = oldoffice34_bufs[salt_pos].encryptedVerifier[2]; + encryptedVerifier[3] = oldoffice34_bufs[salt_pos].encryptedVerifier[3]; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + u32 wordr0[4]; + + wordr0[0] = c_combs[il_pos].i[0]; + wordr0[1] = c_combs[il_pos].i[1]; + wordr0[2] = c_combs[il_pos].i[2]; + wordr0[3] = c_combs[il_pos].i[3]; + + u32 wordr1[4]; + + wordr1[0] = c_combs[il_pos].i[4]; + wordr1[1] = c_combs[il_pos].i[5]; + wordr1[2] = c_combs[il_pos].i[6]; + wordr1[3] = c_combs[il_pos].i[7]; + + u32 wordr2[4]; + + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + + u32 wordr3[4]; + + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + u32x w0[4]; + + u32x key[4]; + + key[0] = wordl0[0] | wordr0[0]; + key[1] = (wordl0[1] | wordr0[1]) & 0xff; + key[2] = 0; + key[3] = 0; + + rc4_init_16 (rc4_key, key); + + u32x out[4]; + + u8 j = rc4_next_16 (rc4_key, 0, 0, encryptedVerifier, out); + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + w0_t[0] = swap_workaround (out[0]); + w0_t[1] = swap_workaround (out[1]); + w0_t[2] = swap_workaround (out[2]); + w0_t[3] = swap_workaround (out[3]); + w1_t[0] = 0x80000000; + w1_t[1] = 0; + w1_t[2] = 0; + w1_t[3] = 0; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = 16 * 8; + + u32x digest[5]; + + digest[0] = SHA1M_A; + digest[1] = SHA1M_B; + digest[2] = SHA1M_C; + digest[3] = SHA1M_D; + digest[4] = SHA1M_E; + + sha1_transform (w0_t, w1_t, w2_t, w3_t, digest); + + digest[0] = swap_workaround (digest[0]); + digest[1] = swap_workaround (digest[1]); + digest[2] = swap_workaround (digest[2]); + digest[3] = swap_workaround (digest[3]); + + rc4_next_16 (rc4_key, 16, j, digest, out); + + const u32x r0 = out[0]; + const u32x r1 = out[1]; + const u32x r2 = out[2]; + const u32x r3 = out[3]; + + #include VECT_COMPARE_M + } +} + +extern "C" __global__ void __launch_bounds__ (64, 1) m09810_m08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const oldoffice34_t *oldoffice34_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (64, 1) m09810_m16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const oldoffice34_t *oldoffice34_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (64, 1) m09810_s04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const oldoffice34_t *oldoffice34_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + __shared__ RC4_KEY rc4_keys[64]; + + RC4_KEY *rc4_key = &rc4_keys[lid]; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, c_combs[0].pw_len); + } + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * esalt + */ + + const u32 version = oldoffice34_bufs[salt_pos].version; + + u32 encryptedVerifier[4]; + + encryptedVerifier[0] = oldoffice34_bufs[salt_pos].encryptedVerifier[0]; + encryptedVerifier[1] = oldoffice34_bufs[salt_pos].encryptedVerifier[1]; + encryptedVerifier[2] = oldoffice34_bufs[salt_pos].encryptedVerifier[2]; + encryptedVerifier[3] = oldoffice34_bufs[salt_pos].encryptedVerifier[3]; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + u32 wordr0[4]; + + wordr0[0] = c_combs[il_pos].i[0]; + wordr0[1] = c_combs[il_pos].i[1]; + wordr0[2] = c_combs[il_pos].i[2]; + wordr0[3] = c_combs[il_pos].i[3]; + + u32 wordr1[4]; + + wordr1[0] = c_combs[il_pos].i[4]; + wordr1[1] = c_combs[il_pos].i[5]; + wordr1[2] = c_combs[il_pos].i[6]; + wordr1[3] = c_combs[il_pos].i[7]; + + u32 wordr2[4]; + + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + + u32 wordr3[4]; + + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + u32x w0[4]; + + u32x key[4]; + + key[0] = wordl0[0] | wordr0[0]; + key[1] = (wordl0[1] | wordr0[1]) & 0xff; + key[2] = 0; + key[3] = 0; + + rc4_init_16 (rc4_key, key); + + u32x out[4]; + + u8 j = rc4_next_16 (rc4_key, 0, 0, encryptedVerifier, out); + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + w0_t[0] = swap_workaround (out[0]); + w0_t[1] = swap_workaround (out[1]); + w0_t[2] = swap_workaround (out[2]); + w0_t[3] = swap_workaround (out[3]); + w1_t[0] = 0x80000000; + w1_t[1] = 0; + w1_t[2] = 0; + w1_t[3] = 0; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = 16 * 8; + + u32x digest[5]; + + digest[0] = SHA1M_A; + digest[1] = SHA1M_B; + digest[2] = SHA1M_C; + digest[3] = SHA1M_D; + digest[4] = SHA1M_E; + + sha1_transform (w0_t, w1_t, w2_t, w3_t, digest); + + digest[0] = swap_workaround (digest[0]); + digest[1] = swap_workaround (digest[1]); + digest[2] = swap_workaround (digest[2]); + digest[3] = swap_workaround (digest[3]); + + rc4_next_16 (rc4_key, 16, j, digest, out); + + const u32x r0 = out[0]; + const u32x r1 = out[1]; + const u32x r2 = out[2]; + const u32x r3 = out[3]; + + #include VECT_COMPARE_S + } +} + +extern "C" __global__ void __launch_bounds__ (64, 1) m09810_s08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const oldoffice34_t *oldoffice34_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (64, 1) m09810_s16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const oldoffice34_t *oldoffice34_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/nv/m09810_a3.cu b/nv/m09810_a3.cu new file mode 100644 index 0000000000..d577962617 --- /dev/null +++ b/nv/m09810_a3.cu @@ -0,0 +1,784 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _OLDOFFICE34_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW2 +#define VECT_SIZE1 +#endif + +#define DGST_R0 0 +#define DGST_R1 1 +#define DGST_R2 2 +#define DGST_R3 3 + +#include "include/kernel_functions.c" +#include "types_nv.c" +#include "common_nv.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +typedef struct +{ + u8 S[256]; + + u32 wtf_its_faster; + +} RC4_KEY; + +__device__ static void swap (RC4_KEY *rc4_key, const u32 i, const u32 j) +{ + u8 tmp; + + tmp = rc4_key->S[i]; + rc4_key->S[i] = rc4_key->S[j]; + rc4_key->S[j] = tmp; +} + +__device__ static void rc4_init_16 (RC4_KEY *rc4_key, const u32 data[4]) +{ + u32 v = 0x03020100; + u32 a = 0x04040404; + + u32 *ptr = (u32 *) rc4_key->S; + + #pragma unroll 64 + for (u32 i = 0; i < 64; i++) + { + *ptr++ = v; v += a; + } + + u32 j = 0; + + for (u32 i = 0; i < 16; i++) + { + u32 idx = i * 16; + + u32 v; + + v = data[0]; + + j += rc4_key->S[idx] + (v >> 0); swap (rc4_key, idx, j & 0xff); idx++; + j += rc4_key->S[idx] + (v >> 8); swap (rc4_key, idx, j & 0xff); idx++; + j += rc4_key->S[idx] + (v >> 16); swap (rc4_key, idx, j & 0xff); idx++; + j += rc4_key->S[idx] + (v >> 24); swap (rc4_key, idx, j & 0xff); idx++; + + v = data[1]; + + j += rc4_key->S[idx] + (v >> 0); swap (rc4_key, idx, j & 0xff); idx++; + j += rc4_key->S[idx] + (v >> 8); swap (rc4_key, idx, j & 0xff); idx++; + j += rc4_key->S[idx] + (v >> 16); swap (rc4_key, idx, j & 0xff); idx++; + j += rc4_key->S[idx] + (v >> 24); swap (rc4_key, idx, j & 0xff); idx++; + + v = data[2]; + + j += rc4_key->S[idx] + (v >> 0); swap (rc4_key, idx, j & 0xff); idx++; + j += rc4_key->S[idx] + (v >> 8); swap (rc4_key, idx, j & 0xff); idx++; + j += rc4_key->S[idx] + (v >> 16); swap (rc4_key, idx, j & 0xff); idx++; + j += rc4_key->S[idx] + (v >> 24); swap (rc4_key, idx, j & 0xff); idx++; + + v = data[3]; + + j += rc4_key->S[idx] + (v >> 0); swap (rc4_key, idx, j & 0xff); idx++; + j += rc4_key->S[idx] + (v >> 8); swap (rc4_key, idx, j & 0xff); idx++; + j += rc4_key->S[idx] + (v >> 16); swap (rc4_key, idx, j & 0xff); idx++; + j += rc4_key->S[idx] + (v >> 24); swap (rc4_key, idx, j & 0xff); idx++; + } +} + +__device__ static u8 rc4_next_16 (RC4_KEY *rc4_key, u8 i, u8 j, const u32 in[4], u32 out[4]) +{ + for (u32 k = 0; k < 4; k++) + { + u32 xor4 = 0; + + u8 idx; + + i += 1; + j += rc4_key->S[i]; + + swap (rc4_key, i, j); + + idx = rc4_key->S[i] + rc4_key->S[j]; + + xor4 |= rc4_key->S[idx] << 0; + + i += 1; + j += rc4_key->S[i]; + + swap (rc4_key, i, j); + + idx = rc4_key->S[i] + rc4_key->S[j]; + + xor4 |= rc4_key->S[idx] << 8; + + i += 1; + j += rc4_key->S[i]; + + swap (rc4_key, i, j); + + idx = rc4_key->S[i] + rc4_key->S[j]; + + xor4 |= rc4_key->S[idx] << 16; + + i += 1; + j += rc4_key->S[i]; + + swap (rc4_key, i, j); + + idx = rc4_key->S[i] + rc4_key->S[j]; + + xor4 |= rc4_key->S[idx] << 24; + + out[k] = in[k] ^ xor4; + } + + return j; +} + +__device__ static void sha1_transform (const u32x w0[4], const u32x w1[4], const u32x w2[4], const u32x w3[4], u32x digest[5]) +{ + u32x A = digest[0]; + u32x B = digest[1]; + u32x C = digest[2]; + u32x D = digest[3]; + u32x E = digest[4]; + + u32x w0_t = w0[0]; + u32x w1_t = w0[1]; + u32x w2_t = w0[2]; + u32x w3_t = w0[3]; + u32x w4_t = w1[0]; + u32x w5_t = w1[1]; + u32x w6_t = w1[2]; + u32x w7_t = w1[3]; + u32x w8_t = w2[0]; + u32x w9_t = w2[1]; + u32x wa_t = w2[2]; + u32x wb_t = w2[3]; + u32x wc_t = w3[0]; + u32x wd_t = w3[1]; + u32x we_t = w3[2]; + u32x wf_t = w3[3]; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, A, B, C, D, E, w0_t); + SHA1_STEP (SHA1_F0o, E, A, B, C, D, w1_t); + SHA1_STEP (SHA1_F0o, D, E, A, B, C, w2_t); + SHA1_STEP (SHA1_F0o, C, D, E, A, B, w3_t); + SHA1_STEP (SHA1_F0o, B, C, D, E, A, w4_t); + SHA1_STEP (SHA1_F0o, A, B, C, D, E, w5_t); + SHA1_STEP (SHA1_F0o, E, A, B, C, D, w6_t); + SHA1_STEP (SHA1_F0o, D, E, A, B, C, w7_t); + SHA1_STEP (SHA1_F0o, C, D, E, A, B, w8_t); + SHA1_STEP (SHA1_F0o, B, C, D, E, A, w9_t); + SHA1_STEP (SHA1_F0o, A, B, C, D, E, wa_t); + SHA1_STEP (SHA1_F0o, E, A, B, C, D, wb_t); + SHA1_STEP (SHA1_F0o, D, E, A, B, C, wc_t); + SHA1_STEP (SHA1_F0o, C, D, E, A, B, wd_t); + SHA1_STEP (SHA1_F0o, B, C, D, E, A, we_t); + SHA1_STEP (SHA1_F0o, A, B, C, D, E, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F0o, E, A, B, C, D, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F0o, D, E, A, B, C, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F0o, C, D, E, A, B, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F0o, B, C, D, E, A, w3_t); + + #undef K + #define K SHA1C01 + + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w7_t); + + #undef K + #define K SHA1C02 + + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, wb_t); + + #undef K + #define K SHA1C03 + + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, wf_t); + + digest[0] += A; + digest[1] += B; + digest[2] += C; + digest[3] += D; + digest[4] += E; +} + +__device__ __constant__ bf_t c_bfs[1024]; + +__device__ static void m09810m (RC4_KEY rc4_keys[64], u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], const u32 pw_len, const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const u32x *bfs_buf, void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const oldoffice34_t *oldoffice34_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset) +{ + /** + * modifier + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + const u32 lid = threadIdx.x; + + RC4_KEY *rc4_key = &rc4_keys[lid]; + + /** + * esalt + */ + + const u32 version = oldoffice34_bufs[salt_pos].version; + + u32 encryptedVerifier[4]; + + encryptedVerifier[0] = oldoffice34_bufs[salt_pos].encryptedVerifier[0]; + encryptedVerifier[1] = oldoffice34_bufs[salt_pos].encryptedVerifier[1]; + encryptedVerifier[2] = oldoffice34_bufs[salt_pos].encryptedVerifier[2]; + encryptedVerifier[3] = oldoffice34_bufs[salt_pos].encryptedVerifier[3]; + + /** + * loop + */ + + u32x w0l = w0[0]; + + for (u32 il_pos = 0; il_pos < bfs_cnt; il_pos++) + { + const u32 w0r = c_bfs[il_pos].i; + + w0[0] = w0l | w0r; + + u32x key[4]; + + key[0] = w0[0]; + key[1] = w0[1] & 0xff; + key[2] = 0; + key[3] = 0; + + rc4_init_16 (rc4_key, key); + + u32x out[4]; + + u8 j = rc4_next_16 (rc4_key, 0, 0, encryptedVerifier, out); + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + w0_t[0] = swap_workaround (out[0]); + w0_t[1] = swap_workaround (out[1]); + w0_t[2] = swap_workaround (out[2]); + w0_t[3] = swap_workaround (out[3]); + w1_t[0] = 0x80000000; + w1_t[1] = 0; + w1_t[2] = 0; + w1_t[3] = 0; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = 16 * 8; + + u32x digest[5]; + + digest[0] = SHA1M_A; + digest[1] = SHA1M_B; + digest[2] = SHA1M_C; + digest[3] = SHA1M_D; + digest[4] = SHA1M_E; + + sha1_transform (w0_t, w1_t, w2_t, w3_t, digest); + + digest[0] = swap_workaround (digest[0]); + digest[1] = swap_workaround (digest[1]); + digest[2] = swap_workaround (digest[2]); + digest[3] = swap_workaround (digest[3]); + + rc4_next_16 (rc4_key, 16, j, digest, out); + + const u32x r0 = out[0]; + const u32x r1 = out[1]; + const u32x r2 = out[2]; + const u32x r3 = out[3]; + + #include VECT_COMPARE_M + } +} + +__device__ static void m09810s (RC4_KEY rc4_keys[64], u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], const u32 pw_len, const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const u32x *bfs_buf, void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const oldoffice34_t *oldoffice34_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset) +{ + /** + * modifier + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + const u32 lid = threadIdx.x; + + RC4_KEY *rc4_key = &rc4_keys[lid]; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * esalt + */ + + const u32 version = oldoffice34_bufs[salt_pos].version; + + u32 encryptedVerifier[4]; + + encryptedVerifier[0] = oldoffice34_bufs[salt_pos].encryptedVerifier[0]; + encryptedVerifier[1] = oldoffice34_bufs[salt_pos].encryptedVerifier[1]; + encryptedVerifier[2] = oldoffice34_bufs[salt_pos].encryptedVerifier[2]; + encryptedVerifier[3] = oldoffice34_bufs[salt_pos].encryptedVerifier[3]; + + /** + * loop + */ + + u32x w0l = w0[0]; + + for (u32 il_pos = 0; il_pos < bfs_cnt; il_pos++) + { + const u32 w0r = c_bfs[il_pos].i; + + w0[0] = w0l | w0r; + + u32x key[4]; + + key[0] = w0[0]; + key[1] = w0[1] & 0xff; + key[2] = 0; + key[3] = 0; + + rc4_init_16 (rc4_key, key); + + u32x out[4]; + + u8 j = rc4_next_16 (rc4_key, 0, 0, encryptedVerifier, out); + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + w0_t[0] = swap_workaround (out[0]); + w0_t[1] = swap_workaround (out[1]); + w0_t[2] = swap_workaround (out[2]); + w0_t[3] = swap_workaround (out[3]); + w1_t[0] = 0x80000000; + w1_t[1] = 0; + w1_t[2] = 0; + w1_t[3] = 0; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = 16 * 8; + + u32x digest[5]; + + digest[0] = SHA1M_A; + digest[1] = SHA1M_B; + digest[2] = SHA1M_C; + digest[3] = SHA1M_D; + digest[4] = SHA1M_E; + + sha1_transform (w0_t, w1_t, w2_t, w3_t, digest); + + digest[0] = swap_workaround (digest[0]); + digest[1] = swap_workaround (digest[1]); + digest[2] = swap_workaround (digest[2]); + digest[3] = swap_workaround (digest[3]); + + rc4_next_16 (rc4_key, 16, j, digest, out); + + const u32x r0 = out[0]; + const u32x r1 = out[1]; + const u32x r2 = out[2]; + const u32x r3 = out[3]; + + #include VECT_COMPARE_S + } +} + +extern "C" __global__ void __launch_bounds__ (64, 1) m09810_m04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const u32x *bfs_buf, void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const oldoffice34_t *oldoffice34_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + __shared__ RC4_KEY rc4_keys[64]; + + m09810m (rc4_keys, w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, oldoffice34_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (64, 1) m09810_m08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const u32x *bfs_buf, void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const oldoffice34_t *oldoffice34_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + __shared__ RC4_KEY rc4_keys[64]; + + m09810m (rc4_keys, w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, oldoffice34_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (64, 1) m09810_m16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const u32x *bfs_buf, void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const oldoffice34_t *oldoffice34_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = pws[gid].i[ 8]; + w2[1] = pws[gid].i[ 9]; + w2[2] = pws[gid].i[10]; + w2[3] = pws[gid].i[11]; + + u32x w3[4]; + + w3[0] = pws[gid].i[12]; + w3[1] = pws[gid].i[13]; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + __shared__ RC4_KEY rc4_keys[64]; + + m09810m (rc4_keys, w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, oldoffice34_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (64, 1) m09810_s04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const u32x *bfs_buf, void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const oldoffice34_t *oldoffice34_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + __shared__ RC4_KEY rc4_keys[64]; + + m09810s (rc4_keys, w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, oldoffice34_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (64, 1) m09810_s08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const u32x *bfs_buf, void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const oldoffice34_t *oldoffice34_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + __shared__ RC4_KEY rc4_keys[64]; + + m09810s (rc4_keys, w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, oldoffice34_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (64, 1) m09810_s16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const u32x *bfs_buf, void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const oldoffice34_t *oldoffice34_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = pws[gid].i[ 8]; + w2[1] = pws[gid].i[ 9]; + w2[2] = pws[gid].i[10]; + w2[3] = pws[gid].i[11]; + + u32x w3[4]; + + w3[0] = pws[gid].i[12]; + w3[1] = pws[gid].i[13]; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + __shared__ RC4_KEY rc4_keys[64]; + + m09810s (rc4_keys, w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, oldoffice34_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} diff --git a/nv/m09820_a0.cu b/nv/m09820_a0.cu new file mode 100644 index 0000000000..fc54f7c5dd --- /dev/null +++ b/nv/m09820_a0.cu @@ -0,0 +1,519 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _OLDOFFICE34_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW2 +#define VECT_SIZE1 +#endif + +#define DGST_R0 0 +#define DGST_R1 1 +#define DGST_R2 2 +#define DGST_R3 3 + +#include "include/kernel_functions.c" +#include "types_nv.c" +#include "common_nv.c" +#include "include/rp_gpu.h" +#include "rp_nv.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +__device__ static void sha1_transform (const u32x w0[4], const u32x w1[4], const u32x w2[4], const u32x w3[4], u32x digest[5]) +{ + u32x A = digest[0]; + u32x B = digest[1]; + u32x C = digest[2]; + u32x D = digest[3]; + u32x E = digest[4]; + + u32x w0_t = w0[0]; + u32x w1_t = w0[1]; + u32x w2_t = w0[2]; + u32x w3_t = w0[3]; + u32x w4_t = w1[0]; + u32x w5_t = w1[1]; + u32x w6_t = w1[2]; + u32x w7_t = w1[3]; + u32x w8_t = w2[0]; + u32x w9_t = w2[1]; + u32x wa_t = w2[2]; + u32x wb_t = w2[3]; + u32x wc_t = w3[0]; + u32x wd_t = w3[1]; + u32x we_t = w3[2]; + u32x wf_t = w3[3]; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, A, B, C, D, E, w0_t); + SHA1_STEP (SHA1_F0o, E, A, B, C, D, w1_t); + SHA1_STEP (SHA1_F0o, D, E, A, B, C, w2_t); + SHA1_STEP (SHA1_F0o, C, D, E, A, B, w3_t); + SHA1_STEP (SHA1_F0o, B, C, D, E, A, w4_t); + SHA1_STEP (SHA1_F0o, A, B, C, D, E, w5_t); + SHA1_STEP (SHA1_F0o, E, A, B, C, D, w6_t); + SHA1_STEP (SHA1_F0o, D, E, A, B, C, w7_t); + SHA1_STEP (SHA1_F0o, C, D, E, A, B, w8_t); + SHA1_STEP (SHA1_F0o, B, C, D, E, A, w9_t); + SHA1_STEP (SHA1_F0o, A, B, C, D, E, wa_t); + SHA1_STEP (SHA1_F0o, E, A, B, C, D, wb_t); + SHA1_STEP (SHA1_F0o, D, E, A, B, C, wc_t); + SHA1_STEP (SHA1_F0o, C, D, E, A, B, wd_t); + SHA1_STEP (SHA1_F0o, B, C, D, E, A, we_t); + SHA1_STEP (SHA1_F0o, A, B, C, D, E, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F0o, E, A, B, C, D, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F0o, D, E, A, B, C, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F0o, C, D, E, A, B, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F0o, B, C, D, E, A, w3_t); + + #undef K + #define K SHA1C01 + + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w7_t); + + #undef K + #define K SHA1C02 + + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, wb_t); + + #undef K + #define K SHA1C03 + + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, wf_t); + + digest[0] += A; + digest[1] += B; + digest[2] += C; + digest[3] += D; + digest[4] += E; +} + +__device__ __constant__ gpu_rule_t c_rules[1024]; + +extern "C" __global__ void __launch_bounds__ (256, 1) m09820_m04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const oldoffice34_t *oldoffice34_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + u32x pw_buf1[4]; + + pw_buf1[0] = pws[gid].i[ 4]; + pw_buf1[1] = pws[gid].i[ 5]; + pw_buf1[2] = pws[gid].i[ 6]; + pw_buf1[3] = pws[gid].i[ 7]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * salt + */ + + u32 salt_buf[4]; + + salt_buf[0] = salt_bufs[salt_pos].salt_buf[0]; + salt_buf[1] = salt_bufs[salt_pos].salt_buf[1]; + salt_buf[2] = salt_bufs[salt_pos].salt_buf[2]; + salt_buf[3] = salt_bufs[salt_pos].salt_buf[3]; + + const u32 salt_len = 16; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + + w0[0] = pw_buf0[0]; + w0[1] = pw_buf0[1]; + w0[2] = pw_buf0[2]; + w0[3] = pw_buf0[3]; + + u32x w1[4]; + + w1[0] = pw_buf1[0]; + w1[1] = pw_buf1[1]; + w1[2] = pw_buf1[2]; + w1[3] = pw_buf1[3]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 out_len = apply_rules (c_rules[il_pos].cmds, w0, w1, pw_len); + + const u32 pw_salt_len = (out_len * 2) + salt_len; + + append_0x80_2 (w0, w1, out_len); + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + make_unicode (w0, w0_t, w1_t); + make_unicode (w1, w2_t, w3_t); + + switch_buffer_by_offset (w0_t, w1_t, w2_t, w3_t, salt_len); + + w0_t[0] = salt_buf[0]; + w0_t[1] = salt_buf[1]; + w0_t[2] = salt_buf[2]; + w0_t[3] = salt_buf[3]; + w1_t[0] = swap_workaround (w1_t[0]); + w1_t[1] = swap_workaround (w1_t[1]); + w1_t[2] = swap_workaround (w1_t[2]); + w1_t[3] = swap_workaround (w1_t[3]); + w2_t[0] = swap_workaround (w2_t[0]); + w2_t[1] = swap_workaround (w2_t[1]); + w2_t[2] = swap_workaround (w2_t[2]); + w2_t[3] = swap_workaround (w2_t[3]); + w3_t[0] = swap_workaround (w3_t[0]); + w3_t[1] = swap_workaround (w3_t[1]); + w3_t[2] = 0; + w3_t[3] = pw_salt_len * 8; + + u32x digest[5]; + + digest[0] = SHA1M_A; + digest[1] = SHA1M_B; + digest[2] = SHA1M_C; + digest[3] = SHA1M_D; + digest[4] = SHA1M_E; + + sha1_transform (w0_t, w1_t, w2_t, w3_t, digest); + + w0_t[0] = digest[0]; + w0_t[1] = digest[1]; + w0_t[2] = digest[2]; + w0_t[3] = digest[3]; + w1_t[0] = digest[4]; + w1_t[1] = 0; + w1_t[2] = 0x80000000; + w1_t[3] = 0; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = (20 + 4) * 8; + + digest[0] = SHA1M_A; + digest[1] = SHA1M_B; + digest[2] = SHA1M_C; + digest[3] = SHA1M_D; + digest[4] = SHA1M_E; + + sha1_transform (w0_t, w1_t, w2_t, w3_t, digest); + + u32x a = swap_workaround (digest[0]); + u32x b = swap_workaround (digest[1]) & 0xff; + + const u32x r0 = a; + const u32x r1 = b; + const u32x r2 = 0; + const u32x r3 = 0; + + #include VECT_COMPARE_M + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m09820_m08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const oldoffice34_t *oldoffice34_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m09820_m16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const oldoffice34_t *oldoffice34_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m09820_s04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const oldoffice34_t *oldoffice34_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + u32x pw_buf1[4]; + + pw_buf1[0] = pws[gid].i[ 4]; + pw_buf1[1] = pws[gid].i[ 5]; + pw_buf1[2] = pws[gid].i[ 6]; + pw_buf1[3] = pws[gid].i[ 7]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * salt + */ + + u32 salt_buf[4]; + + salt_buf[0] = salt_bufs[salt_pos].salt_buf[0]; + salt_buf[1] = salt_bufs[salt_pos].salt_buf[1]; + salt_buf[2] = salt_bufs[salt_pos].salt_buf[2]; + salt_buf[3] = salt_bufs[salt_pos].salt_buf[3]; + + const u32 salt_len = 16; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + + w0[0] = pw_buf0[0]; + w0[1] = pw_buf0[1]; + w0[2] = pw_buf0[2]; + w0[3] = pw_buf0[3]; + + u32x w1[4]; + + w1[0] = pw_buf1[0]; + w1[1] = pw_buf1[1]; + w1[2] = pw_buf1[2]; + w1[3] = pw_buf1[3]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 out_len = apply_rules (c_rules[il_pos].cmds, w0, w1, pw_len); + + const u32 pw_salt_len = (out_len * 2) + salt_len; + + append_0x80_2 (w0, w1, out_len); + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + make_unicode (w0, w0_t, w1_t); + make_unicode (w1, w2_t, w3_t); + + switch_buffer_by_offset (w0_t, w1_t, w2_t, w3_t, salt_len); + + w0_t[0] = salt_buf[0]; + w0_t[1] = salt_buf[1]; + w0_t[2] = salt_buf[2]; + w0_t[3] = salt_buf[3]; + w1_t[0] = swap_workaround (w1_t[0]); + w1_t[1] = swap_workaround (w1_t[1]); + w1_t[2] = swap_workaround (w1_t[2]); + w1_t[3] = swap_workaround (w1_t[3]); + w2_t[0] = swap_workaround (w2_t[0]); + w2_t[1] = swap_workaround (w2_t[1]); + w2_t[2] = swap_workaround (w2_t[2]); + w2_t[3] = swap_workaround (w2_t[3]); + w3_t[0] = swap_workaround (w3_t[0]); + w3_t[1] = swap_workaround (w3_t[1]); + w3_t[2] = 0; + w3_t[3] = pw_salt_len * 8; + + u32x digest[5]; + + digest[0] = SHA1M_A; + digest[1] = SHA1M_B; + digest[2] = SHA1M_C; + digest[3] = SHA1M_D; + digest[4] = SHA1M_E; + + sha1_transform (w0_t, w1_t, w2_t, w3_t, digest); + + w0_t[0] = digest[0]; + w0_t[1] = digest[1]; + w0_t[2] = digest[2]; + w0_t[3] = digest[3]; + w1_t[0] = digest[4]; + w1_t[1] = 0; + w1_t[2] = 0x80000000; + w1_t[3] = 0; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = (20 + 4) * 8; + + digest[0] = SHA1M_A; + digest[1] = SHA1M_B; + digest[2] = SHA1M_C; + digest[3] = SHA1M_D; + digest[4] = SHA1M_E; + + sha1_transform (w0_t, w1_t, w2_t, w3_t, digest); + + u32x a = swap_workaround (digest[0]); + u32x b = swap_workaround (digest[1]) & 0xff; + + const u32x r0 = a; + const u32x r1 = b; + const u32x r2 = 0; + const u32x r3 = 0; + + #include VECT_COMPARE_S + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m09820_s08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const oldoffice34_t *oldoffice34_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m09820_s16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const oldoffice34_t *oldoffice34_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/nv/m09820_a1.cu b/nv/m09820_a1.cu new file mode 100644 index 0000000000..6d9ff52a0c --- /dev/null +++ b/nv/m09820_a1.cu @@ -0,0 +1,625 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _OLDOFFICE34_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW2 +#define VECT_SIZE1 +#endif + +#define DGST_R0 0 +#define DGST_R1 1 +#define DGST_R2 2 +#define DGST_R3 3 + +#include "include/kernel_functions.c" +#include "types_nv.c" +#include "common_nv.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +__device__ static void sha1_transform (const u32x w0[4], const u32x w1[4], const u32x w2[4], const u32x w3[4], u32x digest[5]) +{ + u32x A = digest[0]; + u32x B = digest[1]; + u32x C = digest[2]; + u32x D = digest[3]; + u32x E = digest[4]; + + u32x w0_t = w0[0]; + u32x w1_t = w0[1]; + u32x w2_t = w0[2]; + u32x w3_t = w0[3]; + u32x w4_t = w1[0]; + u32x w5_t = w1[1]; + u32x w6_t = w1[2]; + u32x w7_t = w1[3]; + u32x w8_t = w2[0]; + u32x w9_t = w2[1]; + u32x wa_t = w2[2]; + u32x wb_t = w2[3]; + u32x wc_t = w3[0]; + u32x wd_t = w3[1]; + u32x we_t = w3[2]; + u32x wf_t = w3[3]; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, A, B, C, D, E, w0_t); + SHA1_STEP (SHA1_F0o, E, A, B, C, D, w1_t); + SHA1_STEP (SHA1_F0o, D, E, A, B, C, w2_t); + SHA1_STEP (SHA1_F0o, C, D, E, A, B, w3_t); + SHA1_STEP (SHA1_F0o, B, C, D, E, A, w4_t); + SHA1_STEP (SHA1_F0o, A, B, C, D, E, w5_t); + SHA1_STEP (SHA1_F0o, E, A, B, C, D, w6_t); + SHA1_STEP (SHA1_F0o, D, E, A, B, C, w7_t); + SHA1_STEP (SHA1_F0o, C, D, E, A, B, w8_t); + SHA1_STEP (SHA1_F0o, B, C, D, E, A, w9_t); + SHA1_STEP (SHA1_F0o, A, B, C, D, E, wa_t); + SHA1_STEP (SHA1_F0o, E, A, B, C, D, wb_t); + SHA1_STEP (SHA1_F0o, D, E, A, B, C, wc_t); + SHA1_STEP (SHA1_F0o, C, D, E, A, B, wd_t); + SHA1_STEP (SHA1_F0o, B, C, D, E, A, we_t); + SHA1_STEP (SHA1_F0o, A, B, C, D, E, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F0o, E, A, B, C, D, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F0o, D, E, A, B, C, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F0o, C, D, E, A, B, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F0o, B, C, D, E, A, w3_t); + + #undef K + #define K SHA1C01 + + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w7_t); + + #undef K + #define K SHA1C02 + + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, wb_t); + + #undef K + #define K SHA1C03 + + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, wf_t); + + digest[0] += A; + digest[1] += B; + digest[2] += C; + digest[3] += D; + digest[4] += E; +} + +__device__ __constant__ comb_t c_combs[1024]; + +extern "C" __global__ void __launch_bounds__ (256, 1) m09820_m04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const oldoffice34_t *oldoffice34_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, c_combs[0].pw_len); + } + + /** + * salt + */ + + u32 salt_buf[4]; + + salt_buf[0] = salt_bufs[salt_pos].salt_buf[0]; + salt_buf[1] = salt_bufs[salt_pos].salt_buf[1]; + salt_buf[2] = salt_bufs[salt_pos].salt_buf[2]; + salt_buf[3] = salt_bufs[salt_pos].salt_buf[3]; + + const u32 salt_len = 16; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = c_combs[il_pos].pw_len; + + const u32 pw_len = pw_l_len + pw_r_len; + + const u32 pw_salt_len = (pw_len * 2) + salt_len; + + u32 wordr0[4]; + + wordr0[0] = c_combs[il_pos].i[0]; + wordr0[1] = c_combs[il_pos].i[1]; + wordr0[2] = c_combs[il_pos].i[2]; + wordr0[3] = c_combs[il_pos].i[3]; + + u32 wordr1[4]; + + wordr1[0] = c_combs[il_pos].i[4]; + wordr1[1] = c_combs[il_pos].i[5]; + wordr1[2] = c_combs[il_pos].i[6]; + wordr1[3] = c_combs[il_pos].i[7]; + + u32 wordr2[4]; + + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + + u32 wordr3[4]; + + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + u32x w0[4]; + + w0[0] = wordl0[0] | wordr0[0]; + w0[1] = wordl0[1] | wordr0[1]; + w0[2] = wordl0[2] | wordr0[2]; + w0[3] = wordl0[3] | wordr0[3]; + + u32x w1[4]; + + w1[0] = wordl1[0] | wordr1[0]; + w1[1] = wordl1[1] | wordr1[1]; + w1[2] = wordl1[2] | wordr1[2]; + w1[3] = wordl1[3] | wordr1[3]; + + u32x w2[4]; + + w2[0] = wordl2[0] | wordr2[0]; + w2[1] = wordl2[1] | wordr2[1]; + w2[2] = wordl2[2] | wordr2[2]; + w2[3] = wordl2[3] | wordr2[3]; + + u32x w3[4]; + + w3[0] = wordl3[0] | wordr3[0]; + w3[1] = wordl3[1] | wordr3[1]; + w3[2] = 0; + w3[3] = 0; + + append_0x80_2 (w0, w1, pw_len); + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + make_unicode (w0, w0_t, w1_t); + make_unicode (w1, w2_t, w3_t); + + switch_buffer_by_offset (w0_t, w1_t, w2_t, w3_t, salt_len); + + w0_t[0] = salt_buf[0]; + w0_t[1] = salt_buf[1]; + w0_t[2] = salt_buf[2]; + w0_t[3] = salt_buf[3]; + w1_t[0] = swap_workaround (w1_t[0]); + w1_t[1] = swap_workaround (w1_t[1]); + w1_t[2] = swap_workaround (w1_t[2]); + w1_t[3] = swap_workaround (w1_t[3]); + w2_t[0] = swap_workaround (w2_t[0]); + w2_t[1] = swap_workaround (w2_t[1]); + w2_t[2] = swap_workaround (w2_t[2]); + w2_t[3] = swap_workaround (w2_t[3]); + w3_t[0] = swap_workaround (w3_t[0]); + w3_t[1] = swap_workaround (w3_t[1]); + w3_t[2] = 0; + w3_t[3] = pw_salt_len * 8; + + u32x digest[5]; + + digest[0] = SHA1M_A; + digest[1] = SHA1M_B; + digest[2] = SHA1M_C; + digest[3] = SHA1M_D; + digest[4] = SHA1M_E; + + sha1_transform (w0_t, w1_t, w2_t, w3_t, digest); + + w0_t[0] = digest[0]; + w0_t[1] = digest[1]; + w0_t[2] = digest[2]; + w0_t[3] = digest[3]; + w1_t[0] = digest[4]; + w1_t[1] = 0; + w1_t[2] = 0x80000000; + w1_t[3] = 0; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = (20 + 4) * 8; + + digest[0] = SHA1M_A; + digest[1] = SHA1M_B; + digest[2] = SHA1M_C; + digest[3] = SHA1M_D; + digest[4] = SHA1M_E; + + sha1_transform (w0_t, w1_t, w2_t, w3_t, digest); + + u32x a = swap_workaround (digest[0]); + u32x b = swap_workaround (digest[1]) & 0xff; + + const u32x r0 = a; + const u32x r1 = b; + const u32x r2 = 0; + const u32x r3 = 0; + + #include VECT_COMPARE_M + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m09820_m08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const oldoffice34_t *oldoffice34_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m09820_m16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const oldoffice34_t *oldoffice34_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m09820_s04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const oldoffice34_t *oldoffice34_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, c_combs[0].pw_len); + } + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * salt + */ + + u32 salt_buf[4]; + + salt_buf[0] = salt_bufs[salt_pos].salt_buf[0]; + salt_buf[1] = salt_bufs[salt_pos].salt_buf[1]; + salt_buf[2] = salt_bufs[salt_pos].salt_buf[2]; + salt_buf[3] = salt_bufs[salt_pos].salt_buf[3]; + + const u32 salt_len = 16; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = c_combs[il_pos].pw_len; + + const u32 pw_len = pw_l_len + pw_r_len; + + const u32 pw_salt_len = (pw_len * 2) + salt_len; + + u32 wordr0[4]; + + wordr0[0] = c_combs[il_pos].i[0]; + wordr0[1] = c_combs[il_pos].i[1]; + wordr0[2] = c_combs[il_pos].i[2]; + wordr0[3] = c_combs[il_pos].i[3]; + + u32 wordr1[4]; + + wordr1[0] = c_combs[il_pos].i[4]; + wordr1[1] = c_combs[il_pos].i[5]; + wordr1[2] = c_combs[il_pos].i[6]; + wordr1[3] = c_combs[il_pos].i[7]; + + u32 wordr2[4]; + + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + + u32 wordr3[4]; + + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + u32x w0[4]; + + w0[0] = wordl0[0] | wordr0[0]; + w0[1] = wordl0[1] | wordr0[1]; + w0[2] = wordl0[2] | wordr0[2]; + w0[3] = wordl0[3] | wordr0[3]; + + u32x w1[4]; + + w1[0] = wordl1[0] | wordr1[0]; + w1[1] = wordl1[1] | wordr1[1]; + w1[2] = wordl1[2] | wordr1[2]; + w1[3] = wordl1[3] | wordr1[3]; + + u32x w2[4]; + + w2[0] = wordl2[0] | wordr2[0]; + w2[1] = wordl2[1] | wordr2[1]; + w2[2] = wordl2[2] | wordr2[2]; + w2[3] = wordl2[3] | wordr2[3]; + + u32x w3[4]; + + w3[0] = wordl3[0] | wordr3[0]; + w3[1] = wordl3[1] | wordr3[1]; + w3[2] = 0; + w3[3] = 0; + + append_0x80_2 (w0, w1, pw_len); + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + make_unicode (w0, w0_t, w1_t); + make_unicode (w1, w2_t, w3_t); + + switch_buffer_by_offset (w0_t, w1_t, w2_t, w3_t, salt_len); + + w0_t[0] = salt_buf[0]; + w0_t[1] = salt_buf[1]; + w0_t[2] = salt_buf[2]; + w0_t[3] = salt_buf[3]; + w1_t[0] = swap_workaround (w1_t[0]); + w1_t[1] = swap_workaround (w1_t[1]); + w1_t[2] = swap_workaround (w1_t[2]); + w1_t[3] = swap_workaround (w1_t[3]); + w2_t[0] = swap_workaround (w2_t[0]); + w2_t[1] = swap_workaround (w2_t[1]); + w2_t[2] = swap_workaround (w2_t[2]); + w2_t[3] = swap_workaround (w2_t[3]); + w3_t[0] = swap_workaround (w3_t[0]); + w3_t[1] = swap_workaround (w3_t[1]); + w3_t[2] = 0; + w3_t[3] = pw_salt_len * 8; + + u32x digest[5]; + + digest[0] = SHA1M_A; + digest[1] = SHA1M_B; + digest[2] = SHA1M_C; + digest[3] = SHA1M_D; + digest[4] = SHA1M_E; + + sha1_transform (w0_t, w1_t, w2_t, w3_t, digest); + + w0_t[0] = digest[0]; + w0_t[1] = digest[1]; + w0_t[2] = digest[2]; + w0_t[3] = digest[3]; + w1_t[0] = digest[4]; + w1_t[1] = 0; + w1_t[2] = 0x80000000; + w1_t[3] = 0; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = (20 + 4) * 8; + + digest[0] = SHA1M_A; + digest[1] = SHA1M_B; + digest[2] = SHA1M_C; + digest[3] = SHA1M_D; + digest[4] = SHA1M_E; + + sha1_transform (w0_t, w1_t, w2_t, w3_t, digest); + + u32x a = swap_workaround (digest[0]); + u32x b = swap_workaround (digest[1]) & 0xff; + + const u32x r0 = a; + const u32x r1 = b; + const u32x r2 = 0; + const u32x r3 = 0; + + #include VECT_COMPARE_S + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m09820_s08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const oldoffice34_t *oldoffice34_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m09820_s16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const oldoffice34_t *oldoffice34_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/nv/m09820_a3.cu b/nv/m09820_a3.cu new file mode 100644 index 0000000000..49d8dec921 --- /dev/null +++ b/nv/m09820_a3.cu @@ -0,0 +1,646 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _OLDOFFICE34_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW2 +#define VECT_SIZE1 +#endif + +#define DGST_R0 0 +#define DGST_R1 1 +#define DGST_R2 2 +#define DGST_R3 3 + +#include "include/kernel_functions.c" +#include "types_nv.c" +#include "common_nv.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +__device__ static void sha1_transform (const u32x w0[4], const u32x w1[4], const u32x w2[4], const u32x w3[4], u32x digest[5]) +{ + u32x A = digest[0]; + u32x B = digest[1]; + u32x C = digest[2]; + u32x D = digest[3]; + u32x E = digest[4]; + + u32x w0_t = w0[0]; + u32x w1_t = w0[1]; + u32x w2_t = w0[2]; + u32x w3_t = w0[3]; + u32x w4_t = w1[0]; + u32x w5_t = w1[1]; + u32x w6_t = w1[2]; + u32x w7_t = w1[3]; + u32x w8_t = w2[0]; + u32x w9_t = w2[1]; + u32x wa_t = w2[2]; + u32x wb_t = w2[3]; + u32x wc_t = w3[0]; + u32x wd_t = w3[1]; + u32x we_t = w3[2]; + u32x wf_t = w3[3]; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, A, B, C, D, E, w0_t); + SHA1_STEP (SHA1_F0o, E, A, B, C, D, w1_t); + SHA1_STEP (SHA1_F0o, D, E, A, B, C, w2_t); + SHA1_STEP (SHA1_F0o, C, D, E, A, B, w3_t); + SHA1_STEP (SHA1_F0o, B, C, D, E, A, w4_t); + SHA1_STEP (SHA1_F0o, A, B, C, D, E, w5_t); + SHA1_STEP (SHA1_F0o, E, A, B, C, D, w6_t); + SHA1_STEP (SHA1_F0o, D, E, A, B, C, w7_t); + SHA1_STEP (SHA1_F0o, C, D, E, A, B, w8_t); + SHA1_STEP (SHA1_F0o, B, C, D, E, A, w9_t); + SHA1_STEP (SHA1_F0o, A, B, C, D, E, wa_t); + SHA1_STEP (SHA1_F0o, E, A, B, C, D, wb_t); + SHA1_STEP (SHA1_F0o, D, E, A, B, C, wc_t); + SHA1_STEP (SHA1_F0o, C, D, E, A, B, wd_t); + SHA1_STEP (SHA1_F0o, B, C, D, E, A, we_t); + SHA1_STEP (SHA1_F0o, A, B, C, D, E, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F0o, E, A, B, C, D, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F0o, D, E, A, B, C, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F0o, C, D, E, A, B, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F0o, B, C, D, E, A, w3_t); + + #undef K + #define K SHA1C01 + + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w7_t); + + #undef K + #define K SHA1C02 + + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, wb_t); + + #undef K + #define K SHA1C03 + + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, wf_t); + + digest[0] += A; + digest[1] += B; + digest[2] += C; + digest[3] += D; + digest[4] += E; +} + +__device__ __constant__ bf_t c_bfs[1024]; + +__device__ static void m09820m (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], const u32 pw_len, const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const u32x *bfs_buf, void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const oldoffice34_t *oldoffice34_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset) +{ + /** + * modifier + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + const u32 lid = threadIdx.x; + + /** + * salt + */ + + u32 salt_buf[4]; + + salt_buf[0] = salt_bufs[salt_pos].salt_buf[0]; + salt_buf[1] = salt_bufs[salt_pos].salt_buf[1]; + salt_buf[2] = salt_bufs[salt_pos].salt_buf[2]; + salt_buf[3] = salt_bufs[salt_pos].salt_buf[3]; + + const u32 salt_len = 16; + + const u32 pw_salt_len = pw_len + salt_len; + + /** + * loop + */ + + u32x w0l = w0[0]; + + for (u32 il_pos = 0; il_pos < bfs_cnt; il_pos++) + { + const u32 w0r = c_bfs[il_pos].i; + + w0[0] = w0l | w0r; + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + w0_t[0] = salt_buf[0]; + w0_t[1] = salt_buf[1]; + w0_t[2] = salt_buf[2]; + w0_t[3] = salt_buf[3]; + w1_t[0] = w0[0]; + w1_t[1] = w0[1]; + w1_t[2] = w0[2]; + w1_t[3] = w0[3]; + w2_t[0] = w1[0]; + w2_t[1] = w1[1]; + w2_t[2] = w1[2]; + w2_t[3] = w1[3]; + w3_t[0] = w2[0]; + w3_t[1] = w2[1]; + w3_t[2] = 0; + w3_t[3] = pw_salt_len * 8; + + u32x digest[5]; + + digest[0] = SHA1M_A; + digest[1] = SHA1M_B; + digest[2] = SHA1M_C; + digest[3] = SHA1M_D; + digest[4] = SHA1M_E; + + sha1_transform (w0_t, w1_t, w2_t, w3_t, digest); + + w0_t[0] = digest[0]; + w0_t[1] = digest[1]; + w0_t[2] = digest[2]; + w0_t[3] = digest[3]; + w1_t[0] = digest[4]; + w1_t[1] = 0; + w1_t[2] = 0x80000000; + w1_t[3] = 0; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = (20 + 4) * 8; + + digest[0] = SHA1M_A; + digest[1] = SHA1M_B; + digest[2] = SHA1M_C; + digest[3] = SHA1M_D; + digest[4] = SHA1M_E; + + sha1_transform (w0_t, w1_t, w2_t, w3_t, digest); + + u32x a = swap_workaround (digest[0]); + u32x b = swap_workaround (digest[1]) & 0xff; + + const u32x r0 = a; + const u32x r1 = b; + const u32x r2 = 0; + const u32x r3 = 0; + + #include VECT_COMPARE_M + } +} + +__device__ static void m09820s (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], const u32 pw_len, const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const u32x *bfs_buf, void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const oldoffice34_t *oldoffice34_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset) +{ + /** + * modifier + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + const u32 lid = threadIdx.x; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * salt + */ + + u32 salt_buf[4]; + + salt_buf[0] = salt_bufs[salt_pos].salt_buf[0]; + salt_buf[1] = salt_bufs[salt_pos].salt_buf[1]; + salt_buf[2] = salt_bufs[salt_pos].salt_buf[2]; + salt_buf[3] = salt_bufs[salt_pos].salt_buf[3]; + + const u32 salt_len = 16; + + const u32 pw_salt_len = pw_len + salt_len; + + /** + * loop + */ + + u32x w0l = w0[0]; + + for (u32 il_pos = 0; il_pos < bfs_cnt; il_pos++) + { + const u32 w0r = c_bfs[il_pos].i; + + w0[0] = w0l | w0r; + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + w0_t[0] = salt_buf[0]; + w0_t[1] = salt_buf[1]; + w0_t[2] = salt_buf[2]; + w0_t[3] = salt_buf[3]; + w1_t[0] = w0[0]; + w1_t[1] = w0[1]; + w1_t[2] = w0[2]; + w1_t[3] = w0[3]; + w2_t[0] = w1[0]; + w2_t[1] = w1[1]; + w2_t[2] = w1[2]; + w2_t[3] = w1[3]; + w3_t[0] = w2[0]; + w3_t[1] = w2[1]; + w3_t[2] = 0; + w3_t[3] = pw_salt_len * 8; + + u32x digest[5]; + + digest[0] = SHA1M_A; + digest[1] = SHA1M_B; + digest[2] = SHA1M_C; + digest[3] = SHA1M_D; + digest[4] = SHA1M_E; + + sha1_transform (w0_t, w1_t, w2_t, w3_t, digest); + + w0_t[0] = digest[0]; + w0_t[1] = digest[1]; + w0_t[2] = digest[2]; + w0_t[3] = digest[3]; + w1_t[0] = digest[4]; + w1_t[1] = 0; + w1_t[2] = 0x80000000; + w1_t[3] = 0; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = (20 + 4) * 8; + + digest[0] = SHA1M_A; + digest[1] = SHA1M_B; + digest[2] = SHA1M_C; + digest[3] = SHA1M_D; + digest[4] = SHA1M_E; + + sha1_transform (w0_t, w1_t, w2_t, w3_t, digest); + + u32x a = swap_workaround (digest[0]); + u32x b = swap_workaround (digest[1]) & 0xff; + + const u32x r0 = a; + const u32x r1 = b; + const u32x r2 = 0; + const u32x r3 = 0; + + #include VECT_COMPARE_S + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m09820_m04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const u32x *bfs_buf, void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const oldoffice34_t *oldoffice34_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + m09820m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, oldoffice34_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m09820_m08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const u32x *bfs_buf, void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const oldoffice34_t *oldoffice34_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + m09820m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, oldoffice34_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m09820_m16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const u32x *bfs_buf, void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const oldoffice34_t *oldoffice34_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = pws[gid].i[ 8]; + w2[1] = pws[gid].i[ 9]; + w2[2] = pws[gid].i[10]; + w2[3] = pws[gid].i[11]; + + u32x w3[4]; + + w3[0] = pws[gid].i[12]; + w3[1] = pws[gid].i[13]; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + m09820m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, oldoffice34_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m09820_s04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const u32x *bfs_buf, void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const oldoffice34_t *oldoffice34_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + m09820s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, oldoffice34_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m09820_s08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const u32x *bfs_buf, void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const oldoffice34_t *oldoffice34_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + m09820s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, oldoffice34_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m09820_s16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const u32x *bfs_buf, void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const oldoffice34_t *oldoffice34_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = pws[gid].i[ 8]; + w2[1] = pws[gid].i[ 9]; + w2[2] = pws[gid].i[10]; + w2[3] = pws[gid].i[11]; + + u32x w3[4]; + + w3[0] = pws[gid].i[12]; + w3[1] = pws[gid].i[13]; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + m09820s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, oldoffice34_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} diff --git a/nv/m09900_a0.cu b/nv/m09900_a0.cu new file mode 100644 index 0000000000..649a957047 --- /dev/null +++ b/nv/m09900_a0.cu @@ -0,0 +1,586 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _MD5_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW2 +#define VECT_SIZE1 +#endif + +#define DGST_R0 0 +#define DGST_R1 3 +#define DGST_R2 2 +#define DGST_R3 1 + +#include "include/kernel_functions.c" +#include "types_nv.c" +#include "common_nv.c" +#include "include/rp_gpu.h" +#include "rp_nv.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +__device__ __constant__ gpu_rule_t c_rules[1024]; + +extern "C" __global__ void __launch_bounds__ (256, 1) m09900_m04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + u32x pw_buf1[4]; + + pw_buf1[0] = pws[gid].i[ 4]; + pw_buf1[1] = pws[gid].i[ 5]; + pw_buf1[2] = pws[gid].i[ 6]; + pw_buf1[3] = pws[gid].i[ 7]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + + w0[0] = pw_buf0[0]; + w0[1] = pw_buf0[1]; + w0[2] = pw_buf0[2]; + w0[3] = pw_buf0[3]; + + u32x w1[4]; + + w1[0] = pw_buf1[0]; + w1[1] = pw_buf1[1]; + w1[2] = pw_buf1[2]; + w1[3] = pw_buf1[3]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + apply_rules (c_rules[il_pos].cmds, w0, w1, pw_len); + + u32x a = MD5M_A; + u32x b = MD5M_B; + u32x c = MD5M_C; + u32x d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H , a, b, c, d, w1[1], MD5C20, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w2[0], MD5C21, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w2[3], MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w3[2], MD5C23, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w0[1], MD5C24, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w1[0], MD5C25, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w1[3], MD5C26, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w2[2], MD5C27, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w3[1], MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w0[0], MD5C29, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w0[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w1[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w2[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w3[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w3[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w0[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1[0], MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w2[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2[1], MD5C3f, MD5S33); + + a += MD5M_A; + b += MD5M_B; + c += MD5M_C; + d += MD5M_D; + + u32x r_a = a; + u32x r_b = b; + u32x r_c = c; + u32x r_d = d; + + u32x t0[4]; + u32x t1[4]; + u32x t2[4]; + u32x t3[4]; + + t0[0] = 0; + t0[1] = 0; + t0[2] = 0; + t0[3] = 0; + t1[0] = 0; + t1[1] = 0; + t1[2] = 0; + t1[3] = 0; + t2[0] = 0; + t2[1] = 0x80; + t2[2] = 0; + t2[3] = 0; + t3[0] = 0; + t3[1] = 0; + t3[2] = 100 * 8; + t3[3] = 0; + + MD5_STEP (MD5_Fo, a, b, c, d, t0[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, t0[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, t0[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, t0[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, t1[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, t1[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, t1[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, t1[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, t2[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, t2[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, t2[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, t2[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, t3[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, t3[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, t3[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, t3[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, t0[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, t1[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, t2[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, t0[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, t1[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, t2[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, t3[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, t1[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, t2[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, t3[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, t0[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, t2[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, t3[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, t0[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, t1[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, t3[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H , a, b, c, d, t1[1], MD5C20, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, t2[0], MD5C21, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, t2[3], MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, t3[2], MD5C23, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, t0[1], MD5C24, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, t1[0], MD5C25, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, t1[3], MD5C26, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, t2[2], MD5C27, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, t3[1], MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, t0[0], MD5C29, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, t0[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, t1[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, t2[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, t3[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, t3[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, t0[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, t0[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, t1[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, t3[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, t1[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, t3[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, t0[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, t2[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, t0[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, t2[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, t3[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, t1[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, t3[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, t1[0], MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, t2[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, t0[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, t2[1], MD5C3f, MD5S33); + + a += r_a; + b += r_b; + c += r_c; + d += r_d; + + const u32x r0 = a; + const u32x r1 = d; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_M + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m09900_m08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m09900_m16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m09900_s04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + u32x pw_buf1[4]; + + pw_buf1[0] = pws[gid].i[ 4]; + pw_buf1[1] = pws[gid].i[ 5]; + pw_buf1[2] = pws[gid].i[ 6]; + pw_buf1[3] = pws[gid].i[ 7]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + + w0[0] = pw_buf0[0]; + w0[1] = pw_buf0[1]; + w0[2] = pw_buf0[2]; + w0[3] = pw_buf0[3]; + + u32x w1[4]; + + w1[0] = pw_buf1[0]; + w1[1] = pw_buf1[1]; + w1[2] = pw_buf1[2]; + w1[3] = pw_buf1[3]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + apply_rules (c_rules[il_pos].cmds, w0, w1, pw_len); + + u32x a = MD5M_A; + u32x b = MD5M_B; + u32x c = MD5M_C; + u32x d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H , a, b, c, d, w1[1], MD5C20, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w2[0], MD5C21, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w2[3], MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w3[2], MD5C23, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w0[1], MD5C24, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w1[0], MD5C25, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w1[3], MD5C26, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w2[2], MD5C27, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w3[1], MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w0[0], MD5C29, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w0[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w1[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w2[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w3[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w3[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w0[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1[0], MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w2[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2[1], MD5C3f, MD5S33); + + a += MD5M_A; + b += MD5M_B; + c += MD5M_C; + d += MD5M_D; + + u32x r_a = a; + u32x r_b = b; + u32x r_c = c; + u32x r_d = d; + + u32x t0[4]; + u32x t1[4]; + u32x t2[4]; + u32x t3[4]; + + t0[0] = 0; + t0[1] = 0; + t0[2] = 0; + t0[3] = 0; + t1[0] = 0; + t1[1] = 0; + t1[2] = 0; + t1[3] = 0; + t2[0] = 0; + t2[1] = 0x80; + t2[2] = 0; + t2[3] = 0; + t3[0] = 0; + t3[1] = 0; + t3[2] = 100 * 8; + t3[3] = 0; + + MD5_STEP (MD5_Fo, a, b, c, d, t0[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, t0[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, t0[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, t0[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, t1[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, t1[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, t1[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, t1[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, t2[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, t2[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, t2[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, t2[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, t3[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, t3[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, t3[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, t3[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, t0[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, t1[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, t2[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, t0[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, t1[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, t2[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, t3[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, t1[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, t2[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, t3[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, t0[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, t2[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, t3[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, t0[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, t1[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, t3[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H , a, b, c, d, t1[1], MD5C20, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, t2[0], MD5C21, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, t2[3], MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, t3[2], MD5C23, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, t0[1], MD5C24, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, t1[0], MD5C25, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, t1[3], MD5C26, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, t2[2], MD5C27, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, t3[1], MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, t0[0], MD5C29, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, t0[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, t1[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, t2[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, t3[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, t3[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, t0[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, t0[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, t1[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, t3[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, t1[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, t3[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, t0[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, t2[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, t0[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, t2[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, t3[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, t1[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, t3[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, t1[0], MD5C3c, MD5S30); + + if ((a + r_a) != search[0]) continue; + + MD5_STEP (MD5_I , d, a, b, c, t2[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, t0[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, t2[1], MD5C3f, MD5S33); + + a += r_a; + b += r_b; + c += r_c; + d += r_d; + + const u32x r0 = a; + const u32x r1 = d; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_S + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m09900_s08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m09900_s16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/nv/m09900_a1.cu b/nv/m09900_a1.cu new file mode 100644 index 0000000000..b25abf57dd --- /dev/null +++ b/nv/m09900_a1.cu @@ -0,0 +1,692 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _MD5_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW2 +#define VECT_SIZE4 +#endif + +#define DGST_R0 0 +#define DGST_R1 3 +#define DGST_R2 2 +#define DGST_R3 1 + +#include "include/kernel_functions.c" +#include "types_nv.c" +#include "common_nv.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +__device__ __constant__ comb_t c_combs[1024]; + +extern "C" __global__ void __launch_bounds__ (256, 1) m09900_m04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, c_combs[0].pw_len); + } + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = c_combs[il_pos].pw_len; + + const u32 pw_len = pw_l_len + pw_r_len; + + u32 wordr0[4]; + + wordr0[0] = c_combs[il_pos].i[0]; + wordr0[1] = c_combs[il_pos].i[1]; + wordr0[2] = c_combs[il_pos].i[2]; + wordr0[3] = c_combs[il_pos].i[3]; + + u32 wordr1[4]; + + wordr1[0] = c_combs[il_pos].i[4]; + wordr1[1] = c_combs[il_pos].i[5]; + wordr1[2] = c_combs[il_pos].i[6]; + wordr1[3] = c_combs[il_pos].i[7]; + + u32 wordr2[4]; + + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + + u32 wordr3[4]; + + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + u32x w0[4]; + + w0[0] = wordl0[0] | wordr0[0]; + w0[1] = wordl0[1] | wordr0[1]; + w0[2] = wordl0[2] | wordr0[2]; + w0[3] = wordl0[3] | wordr0[3]; + + u32x w1[4]; + + w1[0] = wordl1[0] | wordr1[0]; + w1[1] = wordl1[1] | wordr1[1]; + w1[2] = wordl1[2] | wordr1[2]; + w1[3] = wordl1[3] | wordr1[3]; + + u32x w2[4]; + + w2[0] = wordl2[0] | wordr2[0]; + w2[1] = wordl2[1] | wordr2[1]; + w2[2] = wordl2[2] | wordr2[2]; + w2[3] = wordl2[3] | wordr2[3]; + + u32x w3[4]; + + w3[0] = wordl3[0] | wordr3[0]; + w3[1] = wordl3[1] | wordr3[1]; + w3[2] = wordl3[2] | wordr3[2]; + w3[3] = wordl3[3] | wordr3[3]; + + u32x a = MD5M_A; + u32x b = MD5M_B; + u32x c = MD5M_C; + u32x d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H , a, b, c, d, w1[1], MD5C20, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w2[0], MD5C21, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w2[3], MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w3[2], MD5C23, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w0[1], MD5C24, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w1[0], MD5C25, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w1[3], MD5C26, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w2[2], MD5C27, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w3[1], MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w0[0], MD5C29, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w0[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w1[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w2[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w3[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w3[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w0[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1[0], MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w2[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2[1], MD5C3f, MD5S33); + + a += MD5M_A; + b += MD5M_B; + c += MD5M_C; + d += MD5M_D; + + u32x r_a = a; + u32x r_b = b; + u32x r_c = c; + u32x r_d = d; + + u32x t0[4]; + u32x t1[4]; + u32x t2[4]; + u32x t3[4]; + + t0[0] = 0; + t0[1] = 0; + t0[2] = 0; + t0[3] = 0; + t1[0] = 0; + t1[1] = 0; + t1[2] = 0; + t1[3] = 0; + t2[0] = 0; + t2[1] = 0x80; + t2[2] = 0; + t2[3] = 0; + t3[0] = 0; + t3[1] = 0; + t3[2] = 100 * 8; + t3[3] = 0; + + MD5_STEP (MD5_Fo, a, b, c, d, t0[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, t0[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, t0[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, t0[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, t1[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, t1[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, t1[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, t1[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, t2[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, t2[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, t2[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, t2[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, t3[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, t3[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, t3[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, t3[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, t0[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, t1[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, t2[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, t0[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, t1[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, t2[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, t3[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, t1[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, t2[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, t3[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, t0[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, t2[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, t3[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, t0[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, t1[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, t3[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H , a, b, c, d, t1[1], MD5C20, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, t2[0], MD5C21, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, t2[3], MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, t3[2], MD5C23, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, t0[1], MD5C24, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, t1[0], MD5C25, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, t1[3], MD5C26, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, t2[2], MD5C27, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, t3[1], MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, t0[0], MD5C29, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, t0[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, t1[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, t2[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, t3[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, t3[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, t0[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, t0[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, t1[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, t3[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, t1[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, t3[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, t0[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, t2[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, t0[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, t2[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, t3[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, t1[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, t3[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, t1[0], MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, t2[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, t0[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, t2[1], MD5C3f, MD5S33); + + a += r_a; + b += r_b; + c += r_c; + d += r_d; + + const u32x r0 = a; + const u32x r1 = d; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_M + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m09900_m08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m09900_m16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m09900_s04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, c_combs[0].pw_len); + } + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = c_combs[il_pos].pw_len; + + const u32 pw_len = pw_l_len + pw_r_len; + + u32 wordr0[4]; + + wordr0[0] = c_combs[il_pos].i[0]; + wordr0[1] = c_combs[il_pos].i[1]; + wordr0[2] = c_combs[il_pos].i[2]; + wordr0[3] = c_combs[il_pos].i[3]; + + u32 wordr1[4]; + + wordr1[0] = c_combs[il_pos].i[4]; + wordr1[1] = c_combs[il_pos].i[5]; + wordr1[2] = c_combs[il_pos].i[6]; + wordr1[3] = c_combs[il_pos].i[7]; + + u32 wordr2[4]; + + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + + u32 wordr3[4]; + + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + u32x w0[4]; + + w0[0] = wordl0[0] | wordr0[0]; + w0[1] = wordl0[1] | wordr0[1]; + w0[2] = wordl0[2] | wordr0[2]; + w0[3] = wordl0[3] | wordr0[3]; + + u32x w1[4]; + + w1[0] = wordl1[0] | wordr1[0]; + w1[1] = wordl1[1] | wordr1[1]; + w1[2] = wordl1[2] | wordr1[2]; + w1[3] = wordl1[3] | wordr1[3]; + + u32x w2[4]; + + w2[0] = wordl2[0] | wordr2[0]; + w2[1] = wordl2[1] | wordr2[1]; + w2[2] = wordl2[2] | wordr2[2]; + w2[3] = wordl2[3] | wordr2[3]; + + u32x w3[4]; + + w3[0] = wordl3[0] | wordr3[0]; + w3[1] = wordl3[1] | wordr3[1]; + w3[2] = wordl3[2] | wordr3[2]; + w3[3] = wordl3[3] | wordr3[3]; + + u32x a = MD5M_A; + u32x b = MD5M_B; + u32x c = MD5M_C; + u32x d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H , a, b, c, d, w1[1], MD5C20, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w2[0], MD5C21, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w2[3], MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w3[2], MD5C23, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w0[1], MD5C24, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w1[0], MD5C25, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w1[3], MD5C26, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w2[2], MD5C27, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w3[1], MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w0[0], MD5C29, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w0[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w1[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w2[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w3[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w3[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w0[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1[0], MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w2[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2[1], MD5C3f, MD5S33); + + a += MD5M_A; + b += MD5M_B; + c += MD5M_C; + d += MD5M_D; + + u32x r_a = a; + u32x r_b = b; + u32x r_c = c; + u32x r_d = d; + + u32x t0[4]; + u32x t1[4]; + u32x t2[4]; + u32x t3[4]; + + t0[0] = 0; + t0[1] = 0; + t0[2] = 0; + t0[3] = 0; + t1[0] = 0; + t1[1] = 0; + t1[2] = 0; + t1[3] = 0; + t2[0] = 0; + t2[1] = 0x80; + t2[2] = 0; + t2[3] = 0; + t3[0] = 0; + t3[1] = 0; + t3[2] = 100 * 8; + t3[3] = 0; + + MD5_STEP (MD5_Fo, a, b, c, d, t0[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, t0[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, t0[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, t0[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, t1[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, t1[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, t1[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, t1[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, t2[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, t2[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, t2[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, t2[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, t3[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, t3[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, t3[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, t3[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, t0[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, t1[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, t2[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, t0[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, t1[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, t2[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, t3[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, t1[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, t2[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, t3[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, t0[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, t2[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, t3[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, t0[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, t1[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, t3[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H , a, b, c, d, t1[1], MD5C20, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, t2[0], MD5C21, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, t2[3], MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, t3[2], MD5C23, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, t0[1], MD5C24, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, t1[0], MD5C25, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, t1[3], MD5C26, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, t2[2], MD5C27, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, t3[1], MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, t0[0], MD5C29, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, t0[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, t1[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, t2[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, t3[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, t3[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, t0[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, t0[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, t1[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, t3[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, t1[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, t3[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, t0[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, t2[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, t0[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, t2[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, t3[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, t1[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, t3[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, t1[0], MD5C3c, MD5S30); + + if ((a + r_a) != search[0]) continue; + + MD5_STEP (MD5_I , d, a, b, c, t2[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, t0[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, t2[1], MD5C3f, MD5S33); + + a += r_a; + b += r_b; + c += r_c; + d += r_d; + + const u32x r0 = a; + const u32x r1 = d; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_S + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m09900_s08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m09900_s16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/nv/m09900_a3.cu b/nv/m09900_a3.cu new file mode 100644 index 0000000000..3ed2b39951 --- /dev/null +++ b/nv/m09900_a3.cu @@ -0,0 +1,851 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _MD5_ +#define _SCALAR_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW2 +#define VECT_SIZE4 +#endif + +#define DGST_R0 0 +#define DGST_R1 3 +#define DGST_R2 2 +#define DGST_R3 1 + +#include "include/kernel_functions.c" +#include "types_nv.c" +#include "common_nv.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4_warp.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4_warp.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4_warp.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4_warp.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4_warp.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4_warp.c" +#endif + +__device__ __constant__ u32x c_bfs[1024]; + +__device__ static void m09900m (u32 w[16], const u32 pw_len, const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const u32x * words_buf_r, void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset) +{ + /** + * modifier + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 F_w0c00 = 0 + MD5C00; + const u32 F_w1c01 = w[ 1] + MD5C01; + const u32 F_w2c02 = w[ 2] + MD5C02; + const u32 F_w3c03 = w[ 3] + MD5C03; + const u32 F_w4c04 = w[ 4] + MD5C04; + const u32 F_w5c05 = w[ 5] + MD5C05; + const u32 F_w6c06 = w[ 6] + MD5C06; + const u32 F_w7c07 = w[ 7] + MD5C07; + const u32 F_w8c08 = w[ 8] + MD5C08; + const u32 F_w9c09 = w[ 9] + MD5C09; + const u32 F_wac0a = w[10] + MD5C0a; + const u32 F_wbc0b = w[11] + MD5C0b; + const u32 F_wcc0c = w[12] + MD5C0c; + const u32 F_wdc0d = w[13] + MD5C0d; + const u32 F_wec0e = w[14] + MD5C0e; + const u32 F_wfc0f = w[15] + MD5C0f; + + const u32 G_w1c10 = w[ 1] + MD5C10; + const u32 G_w6c11 = w[ 6] + MD5C11; + const u32 G_wbc12 = w[11] + MD5C12; + const u32 G_w0c13 = 0 + MD5C13; + const u32 G_w5c14 = w[ 5] + MD5C14; + const u32 G_wac15 = w[10] + MD5C15; + const u32 G_wfc16 = w[15] + MD5C16; + const u32 G_w4c17 = w[ 4] + MD5C17; + const u32 G_w9c18 = w[ 9] + MD5C18; + const u32 G_wec19 = w[14] + MD5C19; + const u32 G_w3c1a = w[ 3] + MD5C1a; + const u32 G_w8c1b = w[ 8] + MD5C1b; + const u32 G_wdc1c = w[13] + MD5C1c; + const u32 G_w2c1d = w[ 2] + MD5C1d; + const u32 G_w7c1e = w[ 7] + MD5C1e; + const u32 G_wcc1f = w[12] + MD5C1f; + + const u32 H_w5c20 = w[ 5] + MD5C20; + const u32 H_w8c21 = w[ 8] + MD5C21; + const u32 H_wbc22 = w[11] + MD5C22; + const u32 H_wec23 = w[14] + MD5C23; + const u32 H_w1c24 = w[ 1] + MD5C24; + const u32 H_w4c25 = w[ 4] + MD5C25; + const u32 H_w7c26 = w[ 7] + MD5C26; + const u32 H_wac27 = w[10] + MD5C27; + const u32 H_wdc28 = w[13] + MD5C28; + const u32 H_w0c29 = 0 + MD5C29; + const u32 H_w3c2a = w[ 3] + MD5C2a; + const u32 H_w6c2b = w[ 6] + MD5C2b; + const u32 H_w9c2c = w[ 9] + MD5C2c; + const u32 H_wcc2d = w[12] + MD5C2d; + const u32 H_wfc2e = w[15] + MD5C2e; + const u32 H_w2c2f = w[ 2] + MD5C2f; + + const u32 I_w0c30 = 0 + MD5C30; + const u32 I_w7c31 = w[ 7] + MD5C31; + const u32 I_wec32 = w[14] + MD5C32; + const u32 I_w5c33 = w[ 5] + MD5C33; + const u32 I_wcc34 = w[12] + MD5C34; + const u32 I_w3c35 = w[ 3] + MD5C35; + const u32 I_wac36 = w[10] + MD5C36; + const u32 I_w1c37 = w[ 1] + MD5C37; + const u32 I_w8c38 = w[ 8] + MD5C38; + const u32 I_wfc39 = w[15] + MD5C39; + const u32 I_w6c3a = w[ 6] + MD5C3a; + const u32 I_wdc3b = w[13] + MD5C3b; + const u32 I_w4c3c = w[ 4] + MD5C3c; + const u32 I_wbc3d = w[11] + MD5C3d; + const u32 I_w2c3e = w[ 2] + MD5C3e; + const u32 I_w9c3f = w[ 9] + MD5C3f; + + /** + * loop + */ + + const u32 bf_loops = ceil ((float) bfs_cnt / VECT_DIV); + + u32x w0l = w[0]; + + for (u32 il_pos = 0; il_pos < bf_loops; il_pos++) + { + const u32x w0r = c_bfs[il_pos]; + + const u32x w0 = w0l | w0r; + + u32x a = MD5M_A; + u32x b = MD5M_B; + u32x c = MD5M_C; + u32x d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0, F_w0c00, MD5S00); + MD5_STEP0(MD5_Fo, d, a, b, c, F_w1c01, MD5S01); + MD5_STEP0(MD5_Fo, c, d, a, b, F_w2c02, MD5S02); + MD5_STEP0(MD5_Fo, b, c, d, a, F_w3c03, MD5S03); + MD5_STEP0(MD5_Fo, a, b, c, d, F_w4c04, MD5S00); + MD5_STEP0(MD5_Fo, d, a, b, c, F_w5c05, MD5S01); + MD5_STEP0(MD5_Fo, c, d, a, b, F_w6c06, MD5S02); + MD5_STEP0(MD5_Fo, b, c, d, a, F_w7c07, MD5S03); + MD5_STEP0(MD5_Fo, a, b, c, d, F_w8c08, MD5S00); + MD5_STEP0(MD5_Fo, d, a, b, c, F_w9c09, MD5S01); + MD5_STEP0(MD5_Fo, c, d, a, b, F_wac0a, MD5S02); + MD5_STEP0(MD5_Fo, b, c, d, a, F_wbc0b, MD5S03); + MD5_STEP0(MD5_Fo, a, b, c, d, F_wcc0c, MD5S00); + MD5_STEP0(MD5_Fo, d, a, b, c, F_wdc0d, MD5S01); + MD5_STEP0(MD5_Fo, c, d, a, b, F_wec0e, MD5S02); + MD5_STEP0(MD5_Fo, b, c, d, a, F_wfc0f, MD5S03); + + MD5_STEP0(MD5_Go, a, b, c, d, G_w1c10, MD5S10); + MD5_STEP0(MD5_Go, d, a, b, c, G_w6c11, MD5S11); + MD5_STEP0(MD5_Go, c, d, a, b, G_wbc12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0, G_w0c13, MD5S13); + MD5_STEP0(MD5_Go, a, b, c, d, G_w5c14, MD5S10); + MD5_STEP0(MD5_Go, d, a, b, c, G_wac15, MD5S11); + MD5_STEP0(MD5_Go, c, d, a, b, G_wfc16, MD5S12); + MD5_STEP0(MD5_Go, b, c, d, a, G_w4c17, MD5S13); + MD5_STEP0(MD5_Go, a, b, c, d, G_w9c18, MD5S10); + MD5_STEP0(MD5_Go, d, a, b, c, G_wec19, MD5S11); + MD5_STEP0(MD5_Go, c, d, a, b, G_w3c1a, MD5S12); + MD5_STEP0(MD5_Go, b, c, d, a, G_w8c1b, MD5S13); + MD5_STEP0(MD5_Go, a, b, c, d, G_wdc1c, MD5S10); + MD5_STEP0(MD5_Go, d, a, b, c, G_w2c1d, MD5S11); + MD5_STEP0(MD5_Go, c, d, a, b, G_w7c1e, MD5S12); + MD5_STEP0(MD5_Go, b, c, d, a, G_wcc1f, MD5S13); + + MD5_STEP0(MD5_H , a, b, c, d, H_w5c20, MD5S20); + MD5_STEP0(MD5_H , d, a, b, c, H_w8c21, MD5S21); + MD5_STEP0(MD5_H , c, d, a, b, H_wbc22, MD5S22); + MD5_STEP0(MD5_H , b, c, d, a, H_wec23, MD5S23); + MD5_STEP0(MD5_H , a, b, c, d, H_w1c24, MD5S20); + MD5_STEP0(MD5_H , d, a, b, c, H_w4c25, MD5S21); + MD5_STEP0(MD5_H , c, d, a, b, H_w7c26, MD5S22); + MD5_STEP0(MD5_H , b, c, d, a, H_wac27, MD5S23); + MD5_STEP0(MD5_H , a, b, c, d, H_wdc28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w0, H_w0c29, MD5S21); + MD5_STEP0(MD5_H , c, d, a, b, H_w3c2a, MD5S22); + MD5_STEP0(MD5_H , b, c, d, a, H_w6c2b, MD5S23); + MD5_STEP0(MD5_H , a, b, c, d, H_w9c2c, MD5S20); + MD5_STEP0(MD5_H , d, a, b, c, H_wcc2d, MD5S21); + MD5_STEP0(MD5_H , c, d, a, b, H_wfc2e, MD5S22); + MD5_STEP0(MD5_H , b, c, d, a, H_w2c2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0, I_w0c30, MD5S30); + MD5_STEP0(MD5_I , d, a, b, c, I_w7c31, MD5S31); + MD5_STEP0(MD5_I , c, d, a, b, I_wec32, MD5S32); + MD5_STEP0(MD5_I , b, c, d, a, I_w5c33, MD5S33); + MD5_STEP0(MD5_I , a, b, c, d, I_wcc34, MD5S30); + MD5_STEP0(MD5_I , d, a, b, c, I_w3c35, MD5S31); + MD5_STEP0(MD5_I , c, d, a, b, I_wac36, MD5S32); + MD5_STEP0(MD5_I , b, c, d, a, I_w1c37, MD5S33); + MD5_STEP0(MD5_I , a, b, c, d, I_w8c38, MD5S30); + MD5_STEP0(MD5_I , d, a, b, c, I_wfc39, MD5S31); + MD5_STEP0(MD5_I , c, d, a, b, I_w6c3a, MD5S32); + MD5_STEP0(MD5_I , b, c, d, a, I_wdc3b, MD5S33); + MD5_STEP0(MD5_I , a, b, c, d, I_w4c3c, MD5S30); + MD5_STEP0(MD5_I , d, a, b, c, I_wbc3d, MD5S31); + MD5_STEP0(MD5_I , c, d, a, b, I_w2c3e, MD5S32); + MD5_STEP0(MD5_I , b, c, d, a, I_w9c3f, MD5S33); + + a += MD5M_A; + b += MD5M_B; + c += MD5M_C; + d += MD5M_D; + + u32x r_a = a; + u32x r_b = b; + u32x r_c = c; + u32x r_d = d; + + u32x t0[4]; + u32x t1[4]; + u32x t2[4]; + u32x t3[4]; + + t0[0] = 0; + t0[1] = 0; + t0[2] = 0; + t0[3] = 0; + t1[0] = 0; + t1[1] = 0; + t1[2] = 0; + t1[3] = 0; + t2[0] = 0; + t2[1] = 0x80; + t2[2] = 0; + t2[3] = 0; + t3[0] = 0; + t3[1] = 0; + t3[2] = 100 * 8; + t3[3] = 0; + + MD5_STEP (MD5_Fo, a, b, c, d, t0[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, t0[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, t0[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, t0[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, t1[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, t1[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, t1[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, t1[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, t2[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, t2[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, t2[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, t2[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, t3[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, t3[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, t3[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, t3[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, t0[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, t1[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, t2[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, t0[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, t1[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, t2[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, t3[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, t1[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, t2[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, t3[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, t0[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, t2[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, t3[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, t0[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, t1[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, t3[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H , a, b, c, d, t1[1], MD5C20, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, t2[0], MD5C21, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, t2[3], MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, t3[2], MD5C23, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, t0[1], MD5C24, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, t1[0], MD5C25, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, t1[3], MD5C26, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, t2[2], MD5C27, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, t3[1], MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, t0[0], MD5C29, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, t0[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, t1[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, t2[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, t3[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, t3[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, t0[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, t0[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, t1[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, t3[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, t1[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, t3[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, t0[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, t2[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, t0[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, t2[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, t3[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, t1[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, t3[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, t1[0], MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, t2[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, t0[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, t2[1], MD5C3f, MD5S33); + + a += r_a; + b += r_b; + c += r_c; + d += r_d; + + const u32x r0 = a; + const u32x r1 = d; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_M + } +} + +__device__ static void m09900s (u32 w[16], const u32 pw_len, const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const u32x * words_buf_r, void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset) +{ + /** + * modifier + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 F_w0c00 = 0 + MD5C00; + const u32 F_w1c01 = w[ 1] + MD5C01; + const u32 F_w2c02 = w[ 2] + MD5C02; + const u32 F_w3c03 = w[ 3] + MD5C03; + const u32 F_w4c04 = w[ 4] + MD5C04; + const u32 F_w5c05 = w[ 5] + MD5C05; + const u32 F_w6c06 = w[ 6] + MD5C06; + const u32 F_w7c07 = w[ 7] + MD5C07; + const u32 F_w8c08 = w[ 8] + MD5C08; + const u32 F_w9c09 = w[ 9] + MD5C09; + const u32 F_wac0a = w[10] + MD5C0a; + const u32 F_wbc0b = w[11] + MD5C0b; + const u32 F_wcc0c = w[12] + MD5C0c; + const u32 F_wdc0d = w[13] + MD5C0d; + const u32 F_wec0e = w[14] + MD5C0e; + const u32 F_wfc0f = w[15] + MD5C0f; + + const u32 G_w1c10 = w[ 1] + MD5C10; + const u32 G_w6c11 = w[ 6] + MD5C11; + const u32 G_wbc12 = w[11] + MD5C12; + const u32 G_w0c13 = 0 + MD5C13; + const u32 G_w5c14 = w[ 5] + MD5C14; + const u32 G_wac15 = w[10] + MD5C15; + const u32 G_wfc16 = w[15] + MD5C16; + const u32 G_w4c17 = w[ 4] + MD5C17; + const u32 G_w9c18 = w[ 9] + MD5C18; + const u32 G_wec19 = w[14] + MD5C19; + const u32 G_w3c1a = w[ 3] + MD5C1a; + const u32 G_w8c1b = w[ 8] + MD5C1b; + const u32 G_wdc1c = w[13] + MD5C1c; + const u32 G_w2c1d = w[ 2] + MD5C1d; + const u32 G_w7c1e = w[ 7] + MD5C1e; + const u32 G_wcc1f = w[12] + MD5C1f; + + const u32 H_w5c20 = w[ 5] + MD5C20; + const u32 H_w8c21 = w[ 8] + MD5C21; + const u32 H_wbc22 = w[11] + MD5C22; + const u32 H_wec23 = w[14] + MD5C23; + const u32 H_w1c24 = w[ 1] + MD5C24; + const u32 H_w4c25 = w[ 4] + MD5C25; + const u32 H_w7c26 = w[ 7] + MD5C26; + const u32 H_wac27 = w[10] + MD5C27; + const u32 H_wdc28 = w[13] + MD5C28; + const u32 H_w0c29 = 0 + MD5C29; + const u32 H_w3c2a = w[ 3] + MD5C2a; + const u32 H_w6c2b = w[ 6] + MD5C2b; + const u32 H_w9c2c = w[ 9] + MD5C2c; + const u32 H_wcc2d = w[12] + MD5C2d; + const u32 H_wfc2e = w[15] + MD5C2e; + const u32 H_w2c2f = w[ 2] + MD5C2f; + + const u32 I_w0c30 = 0 + MD5C30; + const u32 I_w7c31 = w[ 7] + MD5C31; + const u32 I_wec32 = w[14] + MD5C32; + const u32 I_w5c33 = w[ 5] + MD5C33; + const u32 I_wcc34 = w[12] + MD5C34; + const u32 I_w3c35 = w[ 3] + MD5C35; + const u32 I_wac36 = w[10] + MD5C36; + const u32 I_w1c37 = w[ 1] + MD5C37; + const u32 I_w8c38 = w[ 8] + MD5C38; + const u32 I_wfc39 = w[15] + MD5C39; + const u32 I_w6c3a = w[ 6] + MD5C3a; + const u32 I_wdc3b = w[13] + MD5C3b; + const u32 I_w4c3c = w[ 4] + MD5C3c; + const u32 I_wbc3d = w[11] + MD5C3d; + const u32 I_w2c3e = w[ 2] + MD5C3e; + const u32 I_w9c3f = w[ 9] + MD5C3f; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * loop + */ + + const u32 bf_loops = ceil ((float) bfs_cnt / VECT_DIV); + + u32x w0l = w[0]; + + for (u32 il_pos = 0; il_pos < bf_loops; il_pos++) + { + const u32x w0r = c_bfs[il_pos]; + + const u32x w0 = w0l | w0r; + + u32x a = MD5M_A; + u32x b = MD5M_B; + u32x c = MD5M_C; + u32x d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0, F_w0c00, MD5S00); + MD5_STEP0(MD5_Fo, d, a, b, c, F_w1c01, MD5S01); + MD5_STEP0(MD5_Fo, c, d, a, b, F_w2c02, MD5S02); + MD5_STEP0(MD5_Fo, b, c, d, a, F_w3c03, MD5S03); + MD5_STEP0(MD5_Fo, a, b, c, d, F_w4c04, MD5S00); + MD5_STEP0(MD5_Fo, d, a, b, c, F_w5c05, MD5S01); + MD5_STEP0(MD5_Fo, c, d, a, b, F_w6c06, MD5S02); + MD5_STEP0(MD5_Fo, b, c, d, a, F_w7c07, MD5S03); + MD5_STEP0(MD5_Fo, a, b, c, d, F_w8c08, MD5S00); + MD5_STEP0(MD5_Fo, d, a, b, c, F_w9c09, MD5S01); + MD5_STEP0(MD5_Fo, c, d, a, b, F_wac0a, MD5S02); + MD5_STEP0(MD5_Fo, b, c, d, a, F_wbc0b, MD5S03); + MD5_STEP0(MD5_Fo, a, b, c, d, F_wcc0c, MD5S00); + MD5_STEP0(MD5_Fo, d, a, b, c, F_wdc0d, MD5S01); + MD5_STEP0(MD5_Fo, c, d, a, b, F_wec0e, MD5S02); + MD5_STEP0(MD5_Fo, b, c, d, a, F_wfc0f, MD5S03); + + MD5_STEP0(MD5_Go, a, b, c, d, G_w1c10, MD5S10); + MD5_STEP0(MD5_Go, d, a, b, c, G_w6c11, MD5S11); + MD5_STEP0(MD5_Go, c, d, a, b, G_wbc12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0, G_w0c13, MD5S13); + MD5_STEP0(MD5_Go, a, b, c, d, G_w5c14, MD5S10); + MD5_STEP0(MD5_Go, d, a, b, c, G_wac15, MD5S11); + MD5_STEP0(MD5_Go, c, d, a, b, G_wfc16, MD5S12); + MD5_STEP0(MD5_Go, b, c, d, a, G_w4c17, MD5S13); + MD5_STEP0(MD5_Go, a, b, c, d, G_w9c18, MD5S10); + MD5_STEP0(MD5_Go, d, a, b, c, G_wec19, MD5S11); + MD5_STEP0(MD5_Go, c, d, a, b, G_w3c1a, MD5S12); + MD5_STEP0(MD5_Go, b, c, d, a, G_w8c1b, MD5S13); + MD5_STEP0(MD5_Go, a, b, c, d, G_wdc1c, MD5S10); + MD5_STEP0(MD5_Go, d, a, b, c, G_w2c1d, MD5S11); + MD5_STEP0(MD5_Go, c, d, a, b, G_w7c1e, MD5S12); + MD5_STEP0(MD5_Go, b, c, d, a, G_wcc1f, MD5S13); + + MD5_STEP0(MD5_H , a, b, c, d, H_w5c20, MD5S20); + MD5_STEP0(MD5_H , d, a, b, c, H_w8c21, MD5S21); + MD5_STEP0(MD5_H , c, d, a, b, H_wbc22, MD5S22); + MD5_STEP0(MD5_H , b, c, d, a, H_wec23, MD5S23); + MD5_STEP0(MD5_H , a, b, c, d, H_w1c24, MD5S20); + MD5_STEP0(MD5_H , d, a, b, c, H_w4c25, MD5S21); + MD5_STEP0(MD5_H , c, d, a, b, H_w7c26, MD5S22); + MD5_STEP0(MD5_H , b, c, d, a, H_wac27, MD5S23); + MD5_STEP0(MD5_H , a, b, c, d, H_wdc28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w0, H_w0c29, MD5S21); + MD5_STEP0(MD5_H , c, d, a, b, H_w3c2a, MD5S22); + MD5_STEP0(MD5_H , b, c, d, a, H_w6c2b, MD5S23); + MD5_STEP0(MD5_H , a, b, c, d, H_w9c2c, MD5S20); + MD5_STEP0(MD5_H , d, a, b, c, H_wcc2d, MD5S21); + MD5_STEP0(MD5_H , c, d, a, b, H_wfc2e, MD5S22); + MD5_STEP0(MD5_H , b, c, d, a, H_w2c2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0, I_w0c30, MD5S30); + MD5_STEP0(MD5_I , d, a, b, c, I_w7c31, MD5S31); + MD5_STEP0(MD5_I , c, d, a, b, I_wec32, MD5S32); + MD5_STEP0(MD5_I , b, c, d, a, I_w5c33, MD5S33); + MD5_STEP0(MD5_I , a, b, c, d, I_wcc34, MD5S30); + MD5_STEP0(MD5_I , d, a, b, c, I_w3c35, MD5S31); + MD5_STEP0(MD5_I , c, d, a, b, I_wac36, MD5S32); + MD5_STEP0(MD5_I , b, c, d, a, I_w1c37, MD5S33); + MD5_STEP0(MD5_I , a, b, c, d, I_w8c38, MD5S30); + MD5_STEP0(MD5_I , d, a, b, c, I_wfc39, MD5S31); + MD5_STEP0(MD5_I , c, d, a, b, I_w6c3a, MD5S32); + MD5_STEP0(MD5_I , b, c, d, a, I_wdc3b, MD5S33); + MD5_STEP0(MD5_I , a, b, c, d, I_w4c3c, MD5S30); + MD5_STEP0(MD5_I , d, a, b, c, I_wbc3d, MD5S31); + MD5_STEP0(MD5_I , c, d, a, b, I_w2c3e, MD5S32); + MD5_STEP0(MD5_I , b, c, d, a, I_w9c3f, MD5S33); + + a += MD5M_A; + b += MD5M_B; + c += MD5M_C; + d += MD5M_D; + + u32x r_a = a; + u32x r_b = b; + u32x r_c = c; + u32x r_d = d; + + u32x t0[4]; + u32x t1[4]; + u32x t2[4]; + u32x t3[4]; + + t0[0] = 0; + t0[1] = 0; + t0[2] = 0; + t0[3] = 0; + t1[0] = 0; + t1[1] = 0; + t1[2] = 0; + t1[3] = 0; + t2[0] = 0; + t2[1] = 0x80; + t2[2] = 0; + t2[3] = 0; + t3[0] = 0; + t3[1] = 0; + t3[2] = 100 * 8; + t3[3] = 0; + + MD5_STEP (MD5_Fo, a, b, c, d, t0[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, t0[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, t0[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, t0[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, t1[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, t1[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, t1[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, t1[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, t2[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, t2[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, t2[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, t2[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, t3[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, t3[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, t3[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, t3[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, t0[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, t1[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, t2[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, t0[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, t1[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, t2[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, t3[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, t1[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, t2[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, t3[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, t0[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, t2[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, t3[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, t0[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, t1[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, t3[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H , a, b, c, d, t1[1], MD5C20, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, t2[0], MD5C21, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, t2[3], MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, t3[2], MD5C23, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, t0[1], MD5C24, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, t1[0], MD5C25, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, t1[3], MD5C26, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, t2[2], MD5C27, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, t3[1], MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, t0[0], MD5C29, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, t0[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, t1[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, t2[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, t3[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, t3[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, t0[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, t0[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, t1[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, t3[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, t1[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, t3[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, t0[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, t2[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, t0[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, t2[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, t3[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, t1[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, t3[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, t1[0], MD5C3c, MD5S30); + + if ((a + r_a) != search[0]) continue; + + MD5_STEP (MD5_I , d, a, b, c, t2[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, t0[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, t2[1], MD5C3f, MD5S33); + + a += r_a; + b += r_b; + c += r_c; + d += r_d; + + const u32x r0 = a; + const u32x r1 = d; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_S + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m09900_m04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const u32x *words_buf_r,void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32 w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = 0; + w[ 5] = 0; + w[ 6] = 0; + w[ 7] = 0; + w[ 8] = 0; + w[ 9] = 0; + w[10] = 0; + w[11] = 0; + w[12] = 0; + w[13] = 0; + w[14] = pws[gid].i[14]; + w[15] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m09900m (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m09900_m08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const u32x *words_buf_r,void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32 w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = pws[gid].i[ 4]; + w[ 5] = pws[gid].i[ 5]; + w[ 6] = pws[gid].i[ 6]; + w[ 7] = pws[gid].i[ 7]; + w[ 8] = 0; + w[ 9] = 0; + w[10] = 0; + w[11] = 0; + w[12] = 0; + w[13] = 0; + w[14] = pws[gid].i[14]; + w[15] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m09900m (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m09900_m16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const u32x *words_buf_r,void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32 w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = pws[gid].i[ 4]; + w[ 5] = pws[gid].i[ 5]; + w[ 6] = pws[gid].i[ 6]; + w[ 7] = pws[gid].i[ 7]; + w[ 8] = pws[gid].i[ 8]; + w[ 9] = pws[gid].i[ 9]; + w[10] = pws[gid].i[10]; + w[11] = pws[gid].i[11]; + w[12] = pws[gid].i[12]; + w[13] = pws[gid].i[13]; + w[14] = pws[gid].i[14]; + w[15] = pws[gid].i[15]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m09900m (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m09900_s04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const u32x *words_buf_r,void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32 w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = 0; + w[ 5] = 0; + w[ 6] = 0; + w[ 7] = 0; + w[ 8] = 0; + w[ 9] = 0; + w[10] = 0; + w[11] = 0; + w[12] = 0; + w[13] = 0; + w[14] = pws[gid].i[14]; + w[15] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m09900s (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m09900_s08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const u32x *words_buf_r,void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32 w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = pws[gid].i[ 4]; + w[ 5] = pws[gid].i[ 5]; + w[ 6] = pws[gid].i[ 6]; + w[ 7] = pws[gid].i[ 7]; + w[ 8] = 0; + w[ 9] = 0; + w[10] = 0; + w[11] = 0; + w[12] = 0; + w[13] = 0; + w[14] = pws[gid].i[14]; + w[15] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m09900s (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m09900_s16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const u32x *words_buf_r,void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32 w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = pws[gid].i[ 4]; + w[ 5] = pws[gid].i[ 5]; + w[ 6] = pws[gid].i[ 6]; + w[ 7] = pws[gid].i[ 7]; + w[ 8] = pws[gid].i[ 8]; + w[ 9] = pws[gid].i[ 9]; + w[10] = pws[gid].i[10]; + w[11] = pws[gid].i[11]; + w[12] = pws[gid].i[12]; + w[13] = pws[gid].i[13]; + w[14] = pws[gid].i[14]; + w[15] = pws[gid].i[15]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m09900s (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} diff --git a/nv/m10100_a0.cu b/nv/m10100_a0.cu new file mode 100644 index 0000000000..f10a9934e8 --- /dev/null +++ b/nv/m10100_a0.cu @@ -0,0 +1,325 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _SIPHASH_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW2 +#define VECT_SIZE1 +#endif + +#define DGST_R0 0 +#define DGST_R1 1 +#define DGST_R2 2 +#define DGST_R3 3 + +#include "include/kernel_functions.c" +#include "types_nv.c" +#include "common_nv.c" +#include "include/rp_gpu.h" +#include "rp_nv.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +#define SIPROUND(v0,v1,v2,v3) \ + (v0) += (v1); \ + (v1) = rotl64 ((v1), 13); \ + (v1) ^= (v0); \ + (v0) = rotl64 ((v0), 32); \ + (v2) += (v3); \ + (v3) = rotl64 ((v3), 16); \ + (v3) ^= (v2); \ + (v0) += (v3); \ + (v3) = rotl64 ((v3), 21); \ + (v3) ^= (v0); \ + (v2) += (v1); \ + (v1) = rotl64 ((v1), 17); \ + (v1) ^= (v2); \ + (v2) = rotl64 ((v2), 32); + +__device__ __constant__ gpu_rule_t c_rules[1024]; + +extern "C" __global__ void __launch_bounds__ (256, 1) m10100_m04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + u32x pw_buf1[4]; + + pw_buf1[0] = pws[gid].i[ 4]; + pw_buf1[1] = pws[gid].i[ 5]; + pw_buf1[2] = pws[gid].i[ 6]; + pw_buf1[3] = pws[gid].i[ 7]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * base + */ + + u64 v0p = SIPHASHM_0; + u64 v1p = SIPHASHM_1; + u64 v2p = SIPHASHM_2; + u64 v3p = SIPHASHM_3; + + v0p ^= hl32_to_64 (salt_bufs[salt_pos].salt_buf[1], salt_bufs[salt_pos].salt_buf[0]); + v1p ^= hl32_to_64 (salt_bufs[salt_pos].salt_buf[3], salt_bufs[salt_pos].salt_buf[2]); + v2p ^= hl32_to_64 (salt_bufs[salt_pos].salt_buf[1], salt_bufs[salt_pos].salt_buf[0]); + v3p ^= hl32_to_64 (salt_bufs[salt_pos].salt_buf[3], salt_bufs[salt_pos].salt_buf[2]); + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w[16]; + + w[ 0] = pw_buf0[0]; + w[ 1] = pw_buf0[1]; + w[ 2] = pw_buf0[2]; + w[ 3] = pw_buf0[3]; + w[ 4] = pw_buf1[0]; + w[ 5] = pw_buf1[1]; + w[ 6] = pw_buf1[2]; + w[ 7] = pw_buf1[3]; + w[ 8] = 0; + w[ 9] = 0; + w[10] = 0; + w[11] = 0; + w[12] = 0; + w[13] = 0; + w[14] = 0; + w[15] = 0; + + const u32x out_len = apply_rules (c_rules[il_pos].cmds, &w[0], &w[4], pw_len); + + u64 *w_ptr = (u64 *) w; + + w_ptr[out_len / 8] |= (u64) out_len << 56; + + u64x v0 = v0p; + u64x v1 = v1p; + u64x v2 = v2p; + u64x v3 = v3p; + + int i; + int j; + + for (i = 0, j = 0; i <= pw_len; i += 8, j += 2) + { + u64x m = hl32_to_64 (w[j + 1], w[j + 0]); + + v3 ^= m; + + SIPROUND (v0, v1, v2, v3); + SIPROUND (v0, v1, v2, v3); + + v0 ^= m; + } + + v2 ^= 0xff; + + SIPROUND (v0, v1, v2, v3); + SIPROUND (v0, v1, v2, v3); + SIPROUND (v0, v1, v2, v3); + SIPROUND (v0, v1, v2, v3); + + const u64x v = v0 ^ v1 ^ v2 ^ v3; + + const u32x a = l32_from_64 (v); + const u32x b = h32_from_64 (v); + + const u32x r0 = a; + const u32x r1 = b; + const u32x r2 = 0; + const u32x r3 = 0; + + #include VECT_COMPARE_M + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m10100_m08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m10100_m16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m10100_s04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + u32x pw_buf1[4]; + + pw_buf1[0] = pws[gid].i[ 4]; + pw_buf1[1] = pws[gid].i[ 5]; + pw_buf1[2] = pws[gid].i[ 6]; + pw_buf1[3] = pws[gid].i[ 7]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * base + */ + + u64 v0p = SIPHASHM_0; + u64 v1p = SIPHASHM_1; + u64 v2p = SIPHASHM_2; + u64 v3p = SIPHASHM_3; + + v0p ^= hl32_to_64 (salt_bufs[salt_pos].salt_buf[1], salt_bufs[salt_pos].salt_buf[0]); + v1p ^= hl32_to_64 (salt_bufs[salt_pos].salt_buf[3], salt_bufs[salt_pos].salt_buf[2]); + v2p ^= hl32_to_64 (salt_bufs[salt_pos].salt_buf[1], salt_bufs[salt_pos].salt_buf[0]); + v3p ^= hl32_to_64 (salt_bufs[salt_pos].salt_buf[3], salt_bufs[salt_pos].salt_buf[2]); + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w[16]; + + w[ 0] = pw_buf0[0]; + w[ 1] = pw_buf0[1]; + w[ 2] = pw_buf0[2]; + w[ 3] = pw_buf0[3]; + w[ 4] = pw_buf1[0]; + w[ 5] = pw_buf1[1]; + w[ 6] = pw_buf1[2]; + w[ 7] = pw_buf1[3]; + w[ 8] = 0; + w[ 9] = 0; + w[10] = 0; + w[11] = 0; + w[12] = 0; + w[13] = 0; + w[14] = 0; + w[15] = 0; + + const u32x out_len = apply_rules (c_rules[il_pos].cmds, &w[0], &w[4], pw_len); + + u64 *w_ptr = (u64 *) w; + + w_ptr[out_len / 8] |= (u64) out_len << 56; + + u64x v0 = v0p; + u64x v1 = v1p; + u64x v2 = v2p; + u64x v3 = v3p; + + int i; + int j; + + for (i = 0, j = 0; i <= pw_len; i += 8, j += 2) + { + u64x m = hl32_to_64 (w[j + 1], w[j + 0]); + + v3 ^= m; + + SIPROUND (v0, v1, v2, v3); + SIPROUND (v0, v1, v2, v3); + + v0 ^= m; + } + + v2 ^= 0xff; + + SIPROUND (v0, v1, v2, v3); + SIPROUND (v0, v1, v2, v3); + SIPROUND (v0, v1, v2, v3); + SIPROUND (v0, v1, v2, v3); + + const u64x v = v0 ^ v1 ^ v2 ^ v3; + + const u32x a = l32_from_64 (v); + const u32x b = h32_from_64 (v); + + const u32x r0 = a; + const u32x r1 = b; + const u32x r2 = 0; + const u32x r3 = 0; + + #include VECT_COMPARE_S + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m10100_s08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m10100_s16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/nv/m10100_a1.cu b/nv/m10100_a1.cu new file mode 100644 index 0000000000..77209c2776 --- /dev/null +++ b/nv/m10100_a1.cu @@ -0,0 +1,431 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _SIPHASH_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW2 +#define VECT_SIZE1 +#endif + +#define DGST_R0 0 +#define DGST_R1 1 +#define DGST_R2 2 +#define DGST_R3 3 + +#include "include/kernel_functions.c" +#include "types_nv.c" +#include "common_nv.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +#define SIPROUND(v0,v1,v2,v3) \ + (v0) += (v1); \ + (v1) = rotl64 ((v1), 13); \ + (v1) ^= (v0); \ + (v0) = rotl64 ((v0), 32); \ + (v2) += (v3); \ + (v3) = rotl64 ((v3), 16); \ + (v3) ^= (v2); \ + (v0) += (v3); \ + (v3) = rotl64 ((v3), 21); \ + (v3) ^= (v0); \ + (v2) += (v1); \ + (v1) = rotl64 ((v1), 17); \ + (v1) ^= (v2); \ + (v2) = rotl64 ((v2), 32); + +__device__ __constant__ comb_t c_combs[1024]; + +extern "C" __global__ void __launch_bounds__ (256, 1) m10100_m04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, c_combs[0].pw_len); + } + + /** + * base + */ + + u64 v0p = SIPHASHM_0; + u64 v1p = SIPHASHM_1; + u64 v2p = SIPHASHM_2; + u64 v3p = SIPHASHM_3; + + v0p ^= hl32_to_64 (salt_bufs[salt_pos].salt_buf[1], salt_bufs[salt_pos].salt_buf[0]); + v1p ^= hl32_to_64 (salt_bufs[salt_pos].salt_buf[3], salt_bufs[salt_pos].salt_buf[2]); + v2p ^= hl32_to_64 (salt_bufs[salt_pos].salt_buf[1], salt_bufs[salt_pos].salt_buf[0]); + v3p ^= hl32_to_64 (salt_bufs[salt_pos].salt_buf[3], salt_bufs[salt_pos].salt_buf[2]); + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = c_combs[il_pos].pw_len; + + const u32 pw_len = pw_l_len + pw_r_len; + + u32 wordr0[4]; + + wordr0[0] = c_combs[il_pos].i[0]; + wordr0[1] = c_combs[il_pos].i[1]; + wordr0[2] = c_combs[il_pos].i[2]; + wordr0[3] = c_combs[il_pos].i[3]; + + u32 wordr1[4]; + + wordr1[0] = c_combs[il_pos].i[4]; + wordr1[1] = c_combs[il_pos].i[5]; + wordr1[2] = c_combs[il_pos].i[6]; + wordr1[3] = c_combs[il_pos].i[7]; + + u32 wordr2[4]; + + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + + u32 wordr3[4]; + + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + u32x w[16]; + + w[ 0] = wordl0[0] | wordr0[0]; + w[ 1] = wordl0[1] | wordr0[1]; + w[ 2] = wordl0[2] | wordr0[2]; + w[ 3] = wordl0[3] | wordr0[3]; + w[ 4] = wordl1[0] | wordr1[0]; + w[ 5] = wordl1[1] | wordr1[1]; + w[ 6] = wordl1[2] | wordr1[2]; + w[ 7] = wordl1[3] | wordr1[3]; + w[ 8] = wordl2[0] | wordr2[0]; + w[ 9] = wordl2[1] | wordr2[1]; + w[10] = wordl2[2] | wordr2[2]; + w[11] = wordl2[3] | wordr2[3]; + w[12] = wordl3[0] | wordr3[0]; + w[13] = wordl3[1] | wordr3[1]; + w[14] = wordl3[2] | wordr3[2]; + w[15] = wordl3[3] | wordr3[3]; + + u64 *w_ptr = (u64 *) w; + + w_ptr[pw_len / 8] |= (u64) pw_len << 56; + + u64x v0 = v0p; + u64x v1 = v1p; + u64x v2 = v2p; + u64x v3 = v3p; + + int i; + int j; + + for (i = 0, j = 0; i <= pw_len; i += 8, j += 2) + { + u64x m = hl32_to_64 (w[j + 1], w[j + 0]); + + v3 ^= m; + + SIPROUND (v0, v1, v2, v3); + SIPROUND (v0, v1, v2, v3); + + v0 ^= m; + } + + v2 ^= 0xff; + + SIPROUND (v0, v1, v2, v3); + SIPROUND (v0, v1, v2, v3); + SIPROUND (v0, v1, v2, v3); + SIPROUND (v0, v1, v2, v3); + + const u64x v = v0 ^ v1 ^ v2 ^ v3; + + const u32x a = l32_from_64 (v); + const u32x b = h32_from_64 (v); + + const u32x r0 = a; + const u32x r1 = b; + const u32x r2 = 0; + const u32x r3 = 0; + + #include VECT_COMPARE_M + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m10100_m08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m10100_m16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m10100_s04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, c_combs[0].pw_len); + } + + /** + * base + */ + + u64 v0p = SIPHASHM_0; + u64 v1p = SIPHASHM_1; + u64 v2p = SIPHASHM_2; + u64 v3p = SIPHASHM_3; + + v0p ^= hl32_to_64 (salt_bufs[salt_pos].salt_buf[1], salt_bufs[salt_pos].salt_buf[0]); + v1p ^= hl32_to_64 (salt_bufs[salt_pos].salt_buf[3], salt_bufs[salt_pos].salt_buf[2]); + v2p ^= hl32_to_64 (salt_bufs[salt_pos].salt_buf[1], salt_bufs[salt_pos].salt_buf[0]); + v3p ^= hl32_to_64 (salt_bufs[salt_pos].salt_buf[3], salt_bufs[salt_pos].salt_buf[2]); + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = c_combs[il_pos].pw_len; + + const u32 pw_len = pw_l_len + pw_r_len; + + u32 wordr0[4]; + + wordr0[0] = c_combs[il_pos].i[0]; + wordr0[1] = c_combs[il_pos].i[1]; + wordr0[2] = c_combs[il_pos].i[2]; + wordr0[3] = c_combs[il_pos].i[3]; + + u32 wordr1[4]; + + wordr1[0] = c_combs[il_pos].i[4]; + wordr1[1] = c_combs[il_pos].i[5]; + wordr1[2] = c_combs[il_pos].i[6]; + wordr1[3] = c_combs[il_pos].i[7]; + + u32 wordr2[4]; + + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + + u32 wordr3[4]; + + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + u32x w[16]; + + w[ 0] = wordl0[0] | wordr0[0]; + w[ 1] = wordl0[1] | wordr0[1]; + w[ 2] = wordl0[2] | wordr0[2]; + w[ 3] = wordl0[3] | wordr0[3]; + w[ 4] = wordl1[0] | wordr1[0]; + w[ 5] = wordl1[1] | wordr1[1]; + w[ 6] = wordl1[2] | wordr1[2]; + w[ 7] = wordl1[3] | wordr1[3]; + w[ 8] = wordl2[0] | wordr2[0]; + w[ 9] = wordl2[1] | wordr2[1]; + w[10] = wordl2[2] | wordr2[2]; + w[11] = wordl2[3] | wordr2[3]; + w[12] = wordl3[0] | wordr3[0]; + w[13] = wordl3[1] | wordr3[1]; + w[14] = wordl3[2] | wordr3[2]; + w[15] = wordl3[3] | wordr3[3]; + + u64 *w_ptr = (u64 *) w; + + w_ptr[pw_len / 8] |= (u64) pw_len << 56; + + u64x v0 = v0p; + u64x v1 = v1p; + u64x v2 = v2p; + u64x v3 = v3p; + + int i; + int j; + + for (i = 0, j = 0; i <= pw_len; i += 8, j += 2) + { + u64x m = hl32_to_64 (w[j + 1], w[j + 0]); + + v3 ^= m; + + SIPROUND (v0, v1, v2, v3); + SIPROUND (v0, v1, v2, v3); + + v0 ^= m; + } + + v2 ^= 0xff; + + SIPROUND (v0, v1, v2, v3); + SIPROUND (v0, v1, v2, v3); + SIPROUND (v0, v1, v2, v3); + SIPROUND (v0, v1, v2, v3); + + const u64x v = v0 ^ v1 ^ v2 ^ v3; + + const u32x a = l32_from_64 (v); + const u32x b = h32_from_64 (v); + + const u32x r0 = a; + const u32x r1 = b; + const u32x r2 = 0; + const u32x r3 = 0; + + #include VECT_COMPARE_S + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m10100_s08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m10100_s16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/nv/m10100_a3.cu b/nv/m10100_a3.cu new file mode 100644 index 0000000000..e06295f223 --- /dev/null +++ b/nv/m10100_a3.cu @@ -0,0 +1,482 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _SIPHASH_ +#define _SCALAR_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW2 +#define VECT_SIZE1 +#endif + +#define DGST_R0 0 +#define DGST_R1 1 +#define DGST_R2 2 +#define DGST_R3 3 + +#include "include/kernel_functions.c" +#include "types_nv.c" +#include "common_nv.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4_warp.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4_warp.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4_warp.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4_warp.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4_warp.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4_warp.c" +#endif + +#define SIPROUND(v0,v1,v2,v3) \ + (v0) += (v1); \ + (v1) = rotl64 ((v1), 13); \ + (v1) ^= (v0); \ + (v0) = rotl64 ((v0), 32); \ + (v2) += (v3); \ + (v3) = rotl64 ((v3), 16); \ + (v3) ^= (v2); \ + (v0) += (v3); \ + (v3) = rotl64 ((v3), 21); \ + (v3) ^= (v0); \ + (v2) += (v1); \ + (v1) = rotl64 ((v1), 17); \ + (v1) ^= (v2); \ + (v2) = rotl64 ((v2), 32); + +__device__ __constant__ u32x c_bfs[1024]; + +__device__ static void m10100m (u32 w[16], const u32 pw_len, const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const u32x * words_buf_r, void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset) +{ + /** + * modifier + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + const u32 lid = threadIdx.x; + + /** + * base + */ + + u64 v0p = SIPHASHM_0; + u64 v1p = SIPHASHM_1; + u64 v2p = SIPHASHM_2; + u64 v3p = SIPHASHM_3; + + v0p ^= hl32_to_64 (salt_bufs[salt_pos].salt_buf[1], salt_bufs[salt_pos].salt_buf[0]); + v1p ^= hl32_to_64 (salt_bufs[salt_pos].salt_buf[3], salt_bufs[salt_pos].salt_buf[2]); + v2p ^= hl32_to_64 (salt_bufs[salt_pos].salt_buf[1], salt_bufs[salt_pos].salt_buf[0]); + v3p ^= hl32_to_64 (salt_bufs[salt_pos].salt_buf[3], salt_bufs[salt_pos].salt_buf[2]); + + u64 *w_ptr = (u64 *) w; + + w_ptr[pw_len / 8] |= (u64) pw_len << 56; + + /** + * loop + */ + + const u32 bf_loops = ceil ((float) bfs_cnt / VECT_DIV); + + u32x w0l = w[0]; + + for (u32 il_pos = 0; il_pos < bf_loops; il_pos++) + { + const u32x w0r = c_bfs[il_pos]; + + const u32x w0 = w0l | w0r; + + u64x v0 = v0p; + u64x v1 = v1p; + u64x v2 = v2p; + u64x v3 = v3p; + + u64x m = hl32_to_64 (w[1], w0); + + v3 ^= m; + + SIPROUND (v0, v1, v2, v3); + SIPROUND (v0, v1, v2, v3); + + v0 ^= m; + + int i; + int j; + + for (i = 8, j = 2; i <= pw_len; i += 8, j += 2) + { + m = hl32_to_64 (w[j + 1], w[j + 0]); + + v3 ^= m; + + SIPROUND (v0, v1, v2, v3); + SIPROUND (v0, v1, v2, v3); + + v0 ^= m; + } + + v2 ^= 0xff; + + SIPROUND (v0, v1, v2, v3); + SIPROUND (v0, v1, v2, v3); + SIPROUND (v0, v1, v2, v3); + SIPROUND (v0, v1, v2, v3); + + const u64x v = v0 ^ v1 ^ v2 ^ v3; + + const u32x a = l32_from_64 (v); + const u32x b = h32_from_64 (v); + + const u32x r0 = a; + const u32x r1 = b; + const u32x r2 = 0; + const u32x r3 = 0; + + #include VECT_COMPARE_M + } +} + +__device__ static void m10100s (u32 w[16], const u32 pw_len, const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const u32x * words_buf_r, void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset) +{ + /** + * modifier + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + const u32 lid = threadIdx.x; + + /** + * base + */ + + u64 v0p = SIPHASHM_0; + u64 v1p = SIPHASHM_1; + u64 v2p = SIPHASHM_2; + u64 v3p = SIPHASHM_3; + + v0p ^= hl32_to_64 (salt_bufs[salt_pos].salt_buf[1], salt_bufs[salt_pos].salt_buf[0]); + v1p ^= hl32_to_64 (salt_bufs[salt_pos].salt_buf[3], salt_bufs[salt_pos].salt_buf[2]); + v2p ^= hl32_to_64 (salt_bufs[salt_pos].salt_buf[1], salt_bufs[salt_pos].salt_buf[0]); + v3p ^= hl32_to_64 (salt_bufs[salt_pos].salt_buf[3], salt_bufs[salt_pos].salt_buf[2]); + + u64 *w_ptr = (u64 *) w; + + w_ptr[pw_len / 8] |= (u64) pw_len << 56; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * loop + */ + + const u32 bf_loops = ceil ((float) bfs_cnt / VECT_DIV); + + u32x w0l = w[0]; + + for (u32 il_pos = 0; il_pos < bf_loops; il_pos++) + { + const u32x w0r = c_bfs[il_pos]; + + const u32x w0 = w0l | w0r; + + u64x v0 = v0p; + u64x v1 = v1p; + u64x v2 = v2p; + u64x v3 = v3p; + + u64x m = hl32_to_64 (w[1], w0); + + v3 ^= m; + + SIPROUND (v0, v1, v2, v3); + SIPROUND (v0, v1, v2, v3); + + v0 ^= m; + + int i; + int j; + + for (i = 8, j = 2; i <= pw_len; i += 8, j += 2) + { + m = hl32_to_64 (w[j + 1], w[j + 0]); + + v3 ^= m; + + SIPROUND (v0, v1, v2, v3); + SIPROUND (v0, v1, v2, v3); + + v0 ^= m; + } + + v2 ^= 0xff; + + SIPROUND (v0, v1, v2, v3); + SIPROUND (v0, v1, v2, v3); + SIPROUND (v0, v1, v2, v3); + SIPROUND (v0, v1, v2, v3); + + const u64x v = v0 ^ v1 ^ v2 ^ v3; + + const u32x a = l32_from_64 (v); + const u32x b = h32_from_64 (v); + + const u32x r0 = a; + const u32x r1 = b; + const u32x r2 = 0; + const u32x r3 = 0; + + #include VECT_COMPARE_S + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m10100_m04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const u32x *words_buf_r,void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32 w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = 0; + w[ 5] = 0; + w[ 6] = 0; + w[ 7] = 0; + w[ 8] = 0; + w[ 9] = 0; + w[10] = 0; + w[11] = 0; + w[12] = 0; + w[13] = 0; + w[14] = pws[gid].i[14]; + w[15] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m10100m (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m10100_m08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const u32x *words_buf_r,void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32 w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = pws[gid].i[ 4]; + w[ 5] = pws[gid].i[ 5]; + w[ 6] = pws[gid].i[ 6]; + w[ 7] = pws[gid].i[ 7]; + w[ 8] = 0; + w[ 9] = 0; + w[10] = 0; + w[11] = 0; + w[12] = 0; + w[13] = 0; + w[14] = pws[gid].i[14]; + w[15] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m10100m (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m10100_m16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const u32x *words_buf_r,void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32 w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = pws[gid].i[ 4]; + w[ 5] = pws[gid].i[ 5]; + w[ 6] = pws[gid].i[ 6]; + w[ 7] = pws[gid].i[ 7]; + w[ 8] = pws[gid].i[ 8]; + w[ 9] = pws[gid].i[ 9]; + w[10] = pws[gid].i[10]; + w[11] = pws[gid].i[11]; + w[12] = pws[gid].i[12]; + w[13] = pws[gid].i[13]; + w[14] = pws[gid].i[14]; + w[15] = pws[gid].i[15]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m10100m (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m10100_s04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const u32x *words_buf_r,void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32 w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = 0; + w[ 5] = 0; + w[ 6] = 0; + w[ 7] = 0; + w[ 8] = 0; + w[ 9] = 0; + w[10] = 0; + w[11] = 0; + w[12] = 0; + w[13] = 0; + w[14] = pws[gid].i[14]; + w[15] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m10100s (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m10100_s08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const u32x *words_buf_r,void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32 w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = pws[gid].i[ 4]; + w[ 5] = pws[gid].i[ 5]; + w[ 6] = pws[gid].i[ 6]; + w[ 7] = pws[gid].i[ 7]; + w[ 8] = 0; + w[ 9] = 0; + w[10] = 0; + w[11] = 0; + w[12] = 0; + w[13] = 0; + w[14] = pws[gid].i[14]; + w[15] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m10100s (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m10100_s16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const u32x *words_buf_r,void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32 w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = pws[gid].i[ 4]; + w[ 5] = pws[gid].i[ 5]; + w[ 6] = pws[gid].i[ 6]; + w[ 7] = pws[gid].i[ 7]; + w[ 8] = pws[gid].i[ 8]; + w[ 9] = pws[gid].i[ 9]; + w[10] = pws[gid].i[10]; + w[11] = pws[gid].i[11]; + w[12] = pws[gid].i[12]; + w[13] = pws[gid].i[13]; + w[14] = pws[gid].i[14]; + w[15] = pws[gid].i[15]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m10100s (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} diff --git a/nv/m10300.cu b/nv/m10300.cu new file mode 100644 index 0000000000..b0e6f56b2e --- /dev/null +++ b/nv/m10300.cu @@ -0,0 +1,421 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _SHA1_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW2 +#define VECT_SIZE1 +#endif + +#define DGST_R0 0 +#define DGST_R1 1 +#define DGST_R2 2 +#define DGST_R3 3 + +#include "include/kernel_functions.c" +#include "types_nv.c" +#include "common_nv.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +__device__ static void sha1_transform (const u32x w0[4], const u32x w1[4], const u32x w2[4], const u32x w3[4], u32x digest[5]) +{ + u32x A = digest[0]; + u32x B = digest[1]; + u32x C = digest[2]; + u32x D = digest[3]; + u32x E = digest[4]; + + u32x w0_t = w0[0]; + u32x w1_t = w0[1]; + u32x w2_t = w0[2]; + u32x w3_t = w0[3]; + u32x w4_t = w1[0]; + u32x w5_t = w1[1]; + u32x w6_t = w1[2]; + u32x w7_t = w1[3]; + u32x w8_t = w2[0]; + u32x w9_t = w2[1]; + u32x wa_t = w2[2]; + u32x wb_t = w2[3]; + u32x wc_t = w3[0]; + u32x wd_t = w3[1]; + u32x we_t = w3[2]; + u32x wf_t = w3[3]; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, A, B, C, D, E, w0_t); + SHA1_STEP (SHA1_F0o, E, A, B, C, D, w1_t); + SHA1_STEP (SHA1_F0o, D, E, A, B, C, w2_t); + SHA1_STEP (SHA1_F0o, C, D, E, A, B, w3_t); + SHA1_STEP (SHA1_F0o, B, C, D, E, A, w4_t); + SHA1_STEP (SHA1_F0o, A, B, C, D, E, w5_t); + SHA1_STEP (SHA1_F0o, E, A, B, C, D, w6_t); + SHA1_STEP (SHA1_F0o, D, E, A, B, C, w7_t); + SHA1_STEP (SHA1_F0o, C, D, E, A, B, w8_t); + SHA1_STEP (SHA1_F0o, B, C, D, E, A, w9_t); + SHA1_STEP (SHA1_F0o, A, B, C, D, E, wa_t); + SHA1_STEP (SHA1_F0o, E, A, B, C, D, wb_t); + SHA1_STEP (SHA1_F0o, D, E, A, B, C, wc_t); + SHA1_STEP (SHA1_F0o, C, D, E, A, B, wd_t); + SHA1_STEP (SHA1_F0o, B, C, D, E, A, we_t); + SHA1_STEP (SHA1_F0o, A, B, C, D, E, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F0o, E, A, B, C, D, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F0o, D, E, A, B, C, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F0o, C, D, E, A, B, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F0o, B, C, D, E, A, w3_t); + + #undef K + #define K SHA1C01 + + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w7_t); + + #undef K + #define K SHA1C02 + + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, wb_t); + + #undef K + #define K SHA1C03 + + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, wf_t); + + digest[0] += A; + digest[1] += B; + digest[2] += C; + digest[3] += D; + digest[4] += E; +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m10300_init (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, saph_sha1_tmp_t *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x word_buf0[4]; + + word_buf0[0] = pws[gid].i[0]; + word_buf0[1] = pws[gid].i[1]; + word_buf0[2] = pws[gid].i[2]; + word_buf0[3] = pws[gid].i[3]; + + u32x word_buf1[4]; + + word_buf1[0] = pws[gid].i[4]; + word_buf1[1] = pws[gid].i[5]; + word_buf1[2] = pws[gid].i[6]; + word_buf1[3] = pws[gid].i[7]; + + u32x word_buf2[2]; + + word_buf2[0] = pws[gid].i[8]; + word_buf2[1] = pws[gid].i[9]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * salt + */ + + u32 salt_len = salt_bufs[salt_pos].salt_len; + + u32 salt_buf[4]; + + salt_buf[0] = salt_bufs[salt_pos].salt_buf[0]; + salt_buf[1] = salt_bufs[salt_pos].salt_buf[1]; + salt_buf[2] = salt_bufs[salt_pos].salt_buf[2]; + salt_buf[3] = salt_bufs[salt_pos].salt_buf[3]; + + /** + * init + */ + + u32x w0[4]; + + w0[0] = salt_buf[0]; + w0[1] = salt_buf[1]; + w0[2] = salt_buf[2]; + w0[3] = salt_buf[3]; + + u32x w1[4]; + + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + switch_buffer_by_offset (w0, w1, w2, w3, pw_len); + + w0[0] |= word_buf0[0]; + w0[1] |= word_buf0[1]; + w0[2] |= word_buf0[2]; + w0[3] |= word_buf0[3]; + + w1[0] |= word_buf1[0]; + w1[1] |= word_buf1[1]; + w1[2] |= word_buf1[2]; + w1[3] |= word_buf1[3]; + + w2[0] |= word_buf2[0]; + w2[1] |= word_buf2[1]; + + const u32 pw_salt_len = pw_len + salt_len; + + append_0x80_4 (w0, w1, w2, w3, pw_salt_len); + + // swaps needed + + w0[0] = swap_workaround (w0[0]); + w0[1] = swap_workaround (w0[1]); + w0[2] = swap_workaround (w0[2]); + w0[3] = swap_workaround (w0[3]); + + w1[0] = swap_workaround (w1[0]); + w1[1] = swap_workaround (w1[1]); + w1[2] = swap_workaround (w1[2]); + w1[3] = swap_workaround (w1[3]); + + w2[0] = swap_workaround (w2[0]); + w2[1] = swap_workaround (w2[1]); + w2[2] = swap_workaround (w2[2]); + w2[3] = swap_workaround (w2[3]); + + w3[0] = swap_workaround (w3[0]); + w3[1] = swap_workaround (w3[1]); + w3[2] = swap_workaround (w3[2]); + w3[3] = pw_salt_len * 8; + + u32x digest[5]; + + digest[0] = SHA1M_A; + digest[1] = SHA1M_B; + digest[2] = SHA1M_C; + digest[3] = SHA1M_D; + digest[4] = SHA1M_E; + + sha1_transform (w0, w1, w2, w3, digest); + + tmps[gid].digest_buf[0] = digest[0]; + tmps[gid].digest_buf[1] = digest[1]; + tmps[gid].digest_buf[2] = digest[2]; + tmps[gid].digest_buf[3] = digest[3]; + tmps[gid].digest_buf[4] = digest[4]; +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m10300_loop (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, saph_sha1_tmp_t *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + u32x word_buf0[4]; + + word_buf0[0] = swap_workaround (pws[gid].i[0]); + word_buf0[1] = swap_workaround (pws[gid].i[1]); + word_buf0[2] = swap_workaround (pws[gid].i[2]); + word_buf0[3] = swap_workaround (pws[gid].i[3]); + + u32x word_buf1[4]; + + word_buf1[0] = swap_workaround (pws[gid].i[4]); + word_buf1[1] = swap_workaround (pws[gid].i[5]); + word_buf1[2] = swap_workaround (pws[gid].i[6]); + word_buf1[3] = swap_workaround (pws[gid].i[7]); + + u32x word_buf2[2]; + + word_buf2[0] = swap_workaround (pws[gid].i[8]); + word_buf2[1] = swap_workaround (pws[gid].i[9]); + + const u32 pw_len = pws[gid].pw_len; + + u32x digest[5]; + + digest[0] = tmps[gid].digest_buf[0]; + digest[1] = tmps[gid].digest_buf[1]; + digest[2] = tmps[gid].digest_buf[2]; + digest[3] = tmps[gid].digest_buf[3]; + digest[4] = tmps[gid].digest_buf[4]; + + /** + * loop + */ + + for (u32 i = 0; i < loop_cnt; i++) + { + u32x w0[4]; + u32x w1[4]; + u32x w2[4]; + u32x w3[4]; + + w0[0] = digest[0]; + w0[1] = digest[1]; + w0[2] = digest[2]; + w0[3] = digest[3]; + w1[0] = digest[4]; + w1[1] = 0x80000000; + w1[2] = 0; + w1[3] = 0; + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + switch_buffer_by_offset_be (w0, w1, w2, w3, pw_len); + + w0[0] |= word_buf0[0]; + w0[1] |= word_buf0[1]; + w0[2] |= word_buf0[2]; + w0[3] |= word_buf0[3]; + w1[0] |= word_buf1[0]; + w1[1] |= word_buf1[1]; + w1[2] |= word_buf1[2]; + w1[3] |= word_buf1[3]; + w2[0] |= word_buf2[0]; + w2[1] |= word_buf2[1]; + + // not needed + + w3[2] = 0; + w3[3] = (pw_len + 20) * 8; + + digest[0] = SHA1M_A; + digest[1] = SHA1M_B; + digest[2] = SHA1M_C; + digest[3] = SHA1M_D; + digest[4] = SHA1M_E; + + sha1_transform (w0, w1, w2, w3, digest); + } + + tmps[gid].digest_buf[0] = digest[0]; + tmps[gid].digest_buf[1] = digest[1]; + tmps[gid].digest_buf[2] = digest[2]; + tmps[gid].digest_buf[3] = digest[3]; + tmps[gid].digest_buf[4] = digest[4]; +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m10300_comp (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, saph_sha1_tmp_t *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + const u32 lid = threadIdx.x; + + /** + * digest + */ + + const u32x r0 = tmps[gid].digest_buf[0]; + const u32x r1 = tmps[gid].digest_buf[1]; + const u32x r2 = tmps[gid].digest_buf[2]; + const u32x r3 = tmps[gid].digest_buf[3]; + + #define il_pos 0 + + #include VECT_COMPARE_M +} diff --git a/nv/m10400_a0.cu b/nv/m10400_a0.cu new file mode 100644 index 0000000000..b0792ca699 --- /dev/null +++ b/nv/m10400_a0.cu @@ -0,0 +1,679 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _MD5_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW2 +#define VECT_SIZE1 +#endif + +#define DGST_R0 0 +#define DGST_R1 1 +#define DGST_R2 2 +#define DGST_R3 3 + +#include "include/kernel_functions.c" +#include "types_nv.c" +#include "common_nv.c" +#include "include/rp_gpu.h" +#include "rp_nv.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +__device__ __constant__ u32 padding[8] = +{ + 0x5e4ebf28, + 0x418a754e, + 0x564e0064, + 0x0801faff, + 0xb6002e2e, + 0x803e68d0, + 0xfea90c2f, + 0x7a695364 +}; + +typedef struct +{ + u8 S[256]; + + u32 wtf_its_faster; + +} RC4_KEY; + +__device__ static void swap (RC4_KEY *rc4_key, const u8 i, const u8 j) +{ + u8 tmp; + + tmp = rc4_key->S[i]; + rc4_key->S[i] = rc4_key->S[j]; + rc4_key->S[j] = tmp; +} + +__device__ static void rc4_init_16 (RC4_KEY *rc4_key, const u32 data[4]) +{ + u32 v = 0x03020100; + u32 a = 0x04040404; + + u32 *ptr = (u32 *) rc4_key->S; + + #pragma unroll 64 + for (u32 i = 0; i < 64; i++) + { + *ptr++ = v; v += a; + } + + const u32 d0 = data[0] >> 0; + const u32 d1 = data[0] >> 8; + const u32 d2 = data[0] >> 16; + const u32 d3 = data[0] >> 24; + const u32 d4 = data[1] >> 0; + + u32 i = 0; + u32 j = 0; + + #pragma unroll 52 + for (i = 0; i < 255; i += 5) + { + j += rc4_key->S[i + 0]; j += d0; swap (rc4_key, i + 0, j); + j += rc4_key->S[i + 1]; j += d1; swap (rc4_key, i + 1, j); + j += rc4_key->S[i + 2]; j += d2; swap (rc4_key, i + 2, j); + j += rc4_key->S[i + 3]; j += d3; swap (rc4_key, i + 3, j); + j += rc4_key->S[i + 4]; j += d4; swap (rc4_key, i + 4, j); + } + + j += rc4_key->S[i + 0]; j += d0; swap (rc4_key, i + 0, j); +} + +__device__ static u8 rc4_next_16 (RC4_KEY *rc4_key, u8 i, u8 j, const u32 in[4], u32 out[4]) +{ + #pragma unroll 4 + for (u32 k = 0; k < 4; k++) + { + u32 xor4 = 0; + + u8 idx; + + i += 1; + j += rc4_key->S[i]; + + swap (rc4_key, i, j); + + idx = rc4_key->S[i] + rc4_key->S[j]; + + xor4 |= rc4_key->S[idx] << 0; + + i += 1; + j += rc4_key->S[i]; + + swap (rc4_key, i, j); + + idx = rc4_key->S[i] + rc4_key->S[j]; + + xor4 |= rc4_key->S[idx] << 8; + + i += 1; + j += rc4_key->S[i]; + + swap (rc4_key, i, j); + + idx = rc4_key->S[i] + rc4_key->S[j]; + + xor4 |= rc4_key->S[idx] << 16; + + i += 1; + j += rc4_key->S[i]; + + swap (rc4_key, i, j); + + idx = rc4_key->S[i] + rc4_key->S[j]; + + xor4 |= rc4_key->S[idx] << 24; + + out[k] = in[k] ^ xor4; + } + + return j; +} + +__device__ static void md5_transform (const u32x w0[4], const u32x w1[4], const u32x w2[4], const u32x w3[4], u32x digest[4]) +{ + u32x a = digest[0]; + u32x b = digest[1]; + u32x c = digest[2]; + u32x d = digest[3]; + + u32x w0_t = w0[0]; + u32x w1_t = w0[1]; + u32x w2_t = w0[2]; + u32x w3_t = w0[3]; + u32x w4_t = w1[0]; + u32x w5_t = w1[1]; + u32x w6_t = w1[2]; + u32x w7_t = w1[3]; + u32x w8_t = w2[0]; + u32x w9_t = w2[1]; + u32x wa_t = w2[2]; + u32x wb_t = w2[3]; + u32x wc_t = w3[0]; + u32x wd_t = w3[1]; + u32x we_t = w3[2]; + u32x wf_t = w3[3]; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t, MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t, MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t, MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t, MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w4_t, MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w5_t, MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w6_t, MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w7_t, MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w8_t, MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w9_t, MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, wa_t, MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, wb_t, MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, wc_t, MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, wd_t, MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, we_t, MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, wf_t, MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w1_t, MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w6_t, MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, wb_t, MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t, MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w5_t, MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, wa_t, MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, wf_t, MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w4_t, MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w9_t, MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, we_t, MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t, MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w8_t, MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, wd_t, MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t, MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w7_t, MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, wc_t, MD5C1f, MD5S13); + + MD5_STEP (MD5_H , a, b, c, d, w5_t, MD5C20, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w8_t, MD5C21, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, wb_t, MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, we_t, MD5C23, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w1_t, MD5C24, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w4_t, MD5C25, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w7_t, MD5C26, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, wa_t, MD5C27, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, wd_t, MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w0_t, MD5C29, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w3_t, MD5C2a, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w6_t, MD5C2b, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w9_t, MD5C2c, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, wc_t, MD5C2d, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, wf_t, MD5C2e, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w2_t, MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t, MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w7_t, MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, we_t, MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w5_t, MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, wc_t, MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t, MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, wa_t, MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t, MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w8_t, MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, wf_t, MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w6_t, MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, wd_t, MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w4_t, MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, wb_t, MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t, MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w9_t, MD5C3f, MD5S33); + + digest[0] += a; + digest[1] += b; + digest[2] += c; + digest[3] += d; +} + +__device__ __constant__ gpu_rule_t c_rules[1024]; + +extern "C" __global__ void __launch_bounds__ (64, 1) m10400_m04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const pdf_t *pdf_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + u32x pw_buf1[4]; + + pw_buf1[0] = pws[gid].i[ 4]; + pw_buf1[1] = pws[gid].i[ 5]; + pw_buf1[2] = pws[gid].i[ 6]; + pw_buf1[3] = pws[gid].i[ 7]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * key + */ + + __shared__ RC4_KEY rc4_keys[64]; + + RC4_KEY *rc4_key = &rc4_keys[lid]; + + /** + * U_buf + */ + + u32 o_buf[8]; + + o_buf[0] = pdf_bufs[salt_pos].o_buf[0]; + o_buf[1] = pdf_bufs[salt_pos].o_buf[1]; + o_buf[2] = pdf_bufs[salt_pos].o_buf[2]; + o_buf[3] = pdf_bufs[salt_pos].o_buf[3]; + o_buf[4] = pdf_bufs[salt_pos].o_buf[4]; + o_buf[5] = pdf_bufs[salt_pos].o_buf[5]; + o_buf[6] = pdf_bufs[salt_pos].o_buf[6]; + o_buf[7] = pdf_bufs[salt_pos].o_buf[7]; + + u32 P = pdf_bufs[salt_pos].P; + + u32 id_buf[4]; + + id_buf[0] = pdf_bufs[salt_pos].id_buf[0]; + id_buf[1] = pdf_bufs[salt_pos].id_buf[1]; + id_buf[2] = pdf_bufs[salt_pos].id_buf[2]; + id_buf[3] = pdf_bufs[salt_pos].id_buf[3]; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + + w0[0] = pw_buf0[0]; + w0[1] = pw_buf0[1]; + w0[2] = pw_buf0[2]; + w0[3] = pw_buf0[3]; + + u32x w1[4]; + + w1[0] = pw_buf1[0]; + w1[1] = pw_buf1[1]; + w1[2] = pw_buf1[2]; + w1[3] = pw_buf1[3]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 out_len = apply_rules (c_rules[il_pos].cmds, w0, w1, pw_len); + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + // max length supported by pdf11 is 32 + + w0_t[0] = padding[0]; + w0_t[1] = padding[1]; + w0_t[2] = padding[2]; + w0_t[3] = padding[3]; + w1_t[0] = padding[4]; + w1_t[1] = padding[5]; + w1_t[2] = padding[6]; + w1_t[3] = padding[7]; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = 0; + + switch_buffer_by_offset (w0_t, w1_t, w2_t, w3_t, pw_len); + + // add password + // truncate at 32 is wanted, not a bug! + // add o_buf + + w0_t[0] |= w0[0]; + w0_t[1] |= w0[1]; + w0_t[2] |= w0[2]; + w0_t[3] |= w0[3]; + w1_t[0] |= w1[0]; + w1_t[1] |= w1[1]; + w1_t[2] |= w1[2]; + w1_t[3] |= w1[3]; + w2_t[0] = o_buf[0]; + w2_t[1] = o_buf[1]; + w2_t[2] = o_buf[2]; + w2_t[3] = o_buf[3]; + w3_t[0] = o_buf[4]; + w3_t[1] = o_buf[5]; + w3_t[2] = o_buf[6]; + w3_t[3] = o_buf[7]; + + u32x digest[4]; + + digest[0] = MD5M_A; + digest[1] = MD5M_B; + digest[2] = MD5M_C; + digest[3] = MD5M_D; + + md5_transform (w0_t, w1_t, w2_t, w3_t, digest); + + w0_t[0] = P; + w0_t[1] = id_buf[0]; + w0_t[2] = id_buf[1]; + w0_t[3] = id_buf[2]; + w1_t[0] = id_buf[3]; + w1_t[1] = 0x80; + w1_t[2] = 0; + w1_t[3] = 0; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 84 * 8; + w3_t[3] = 0; + + md5_transform (w0_t, w1_t, w2_t, w3_t, digest); + + // now the RC4 part + + u32x key[4]; + + key[0] = digest[0]; + key[1] = digest[1] & 0xff; + key[2] = 0; + key[3] = 0; + + rc4_init_16 (rc4_key, key); + + u32x out[4]; + + rc4_next_16 (rc4_key, 0, 0, padding, out); + + const u32x r0 = out[0]; + const u32x r1 = out[1]; + const u32x r2 = out[2]; + const u32x r3 = out[3]; + + #include VECT_COMPARE_M + } +} + +extern "C" __global__ void __launch_bounds__ (64, 1) m10400_m08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const pdf_t *pdf_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (64, 1) m10400_m16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const pdf_t *pdf_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (64, 1) m10400_s04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const pdf_t *pdf_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + u32x pw_buf1[4]; + + pw_buf1[0] = pws[gid].i[ 4]; + pw_buf1[1] = pws[gid].i[ 5]; + pw_buf1[2] = pws[gid].i[ 6]; + pw_buf1[3] = pws[gid].i[ 7]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * key + */ + + __shared__ RC4_KEY rc4_keys[64]; + + RC4_KEY *rc4_key = &rc4_keys[lid]; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * U_buf + */ + + u32 o_buf[8]; + + o_buf[0] = pdf_bufs[salt_pos].o_buf[0]; + o_buf[1] = pdf_bufs[salt_pos].o_buf[1]; + o_buf[2] = pdf_bufs[salt_pos].o_buf[2]; + o_buf[3] = pdf_bufs[salt_pos].o_buf[3]; + o_buf[4] = pdf_bufs[salt_pos].o_buf[4]; + o_buf[5] = pdf_bufs[salt_pos].o_buf[5]; + o_buf[6] = pdf_bufs[salt_pos].o_buf[6]; + o_buf[7] = pdf_bufs[salt_pos].o_buf[7]; + + u32 P = pdf_bufs[salt_pos].P; + + u32 id_buf[4]; + + id_buf[0] = pdf_bufs[salt_pos].id_buf[0]; + id_buf[1] = pdf_bufs[salt_pos].id_buf[1]; + id_buf[2] = pdf_bufs[salt_pos].id_buf[2]; + id_buf[3] = pdf_bufs[salt_pos].id_buf[3]; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + + w0[0] = pw_buf0[0]; + w0[1] = pw_buf0[1]; + w0[2] = pw_buf0[2]; + w0[3] = pw_buf0[3]; + + u32x w1[4]; + + w1[0] = pw_buf1[0]; + w1[1] = pw_buf1[1]; + w1[2] = pw_buf1[2]; + w1[3] = pw_buf1[3]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 out_len = apply_rules (c_rules[il_pos].cmds, w0, w1, pw_len); + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + // max length supported by pdf11 is 32 + + w0_t[0] = padding[0]; + w0_t[1] = padding[1]; + w0_t[2] = padding[2]; + w0_t[3] = padding[3]; + w1_t[0] = padding[4]; + w1_t[1] = padding[5]; + w1_t[2] = padding[6]; + w1_t[3] = padding[7]; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = 0; + + switch_buffer_by_offset (w0_t, w1_t, w2_t, w3_t, pw_len); + + // add password + // truncate at 32 is wanted, not a bug! + // add o_buf + + w0_t[0] |= w0[0]; + w0_t[1] |= w0[1]; + w0_t[2] |= w0[2]; + w0_t[3] |= w0[3]; + w1_t[0] |= w1[0]; + w1_t[1] |= w1[1]; + w1_t[2] |= w1[2]; + w1_t[3] |= w1[3]; + w2_t[0] = o_buf[0]; + w2_t[1] = o_buf[1]; + w2_t[2] = o_buf[2]; + w2_t[3] = o_buf[3]; + w3_t[0] = o_buf[4]; + w3_t[1] = o_buf[5]; + w3_t[2] = o_buf[6]; + w3_t[3] = o_buf[7]; + + u32x digest[4]; + + digest[0] = MD5M_A; + digest[1] = MD5M_B; + digest[2] = MD5M_C; + digest[3] = MD5M_D; + + md5_transform (w0_t, w1_t, w2_t, w3_t, digest); + + w0_t[0] = P; + w0_t[1] = id_buf[0]; + w0_t[2] = id_buf[1]; + w0_t[3] = id_buf[2]; + w1_t[0] = id_buf[3]; + w1_t[1] = 0x80; + w1_t[2] = 0; + w1_t[3] = 0; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 84 * 8; + w3_t[3] = 0; + + md5_transform (w0_t, w1_t, w2_t, w3_t, digest); + + // now the RC4 part + + u32x key[4]; + + key[0] = digest[0]; + key[1] = digest[1] & 0xff; + key[2] = 0; + key[3] = 0; + + rc4_init_16 (rc4_key, key); + + u32x out[4]; + + rc4_next_16 (rc4_key, 0, 0, padding, out); + + const u32x r0 = out[0]; + const u32x r1 = out[1]; + const u32x r2 = out[2]; + const u32x r3 = out[3]; + + #include VECT_COMPARE_S + } +} + +extern "C" __global__ void __launch_bounds__ (64, 1) m10400_s08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const pdf_t *pdf_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (64, 1) m10400_s16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const pdf_t *pdf_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/nv/m10400_a1.cu b/nv/m10400_a1.cu new file mode 100644 index 0000000000..b307562aa6 --- /dev/null +++ b/nv/m10400_a1.cu @@ -0,0 +1,785 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _MD5_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW2 +#define VECT_SIZE1 +#endif + +#define DGST_R0 0 +#define DGST_R1 1 +#define DGST_R2 2 +#define DGST_R3 3 + +#include "include/kernel_functions.c" +#include "types_nv.c" +#include "common_nv.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +__device__ __constant__ u32 padding[8] = +{ + 0x5e4ebf28, + 0x418a754e, + 0x564e0064, + 0x0801faff, + 0xb6002e2e, + 0x803e68d0, + 0xfea90c2f, + 0x7a695364 +}; + +typedef struct +{ + u8 S[256]; + + u32 wtf_its_faster; + +} RC4_KEY; + +__device__ static void swap (RC4_KEY *rc4_key, const u8 i, const u8 j) +{ + u8 tmp; + + tmp = rc4_key->S[i]; + rc4_key->S[i] = rc4_key->S[j]; + rc4_key->S[j] = tmp; +} + +__device__ static void rc4_init_16 (RC4_KEY *rc4_key, const u32 data[4]) +{ + u32 v = 0x03020100; + u32 a = 0x04040404; + + u32 *ptr = (u32 *) rc4_key->S; + + #pragma unroll 64 + for (u32 i = 0; i < 64; i++) + { + *ptr++ = v; v += a; + } + + const u32 d0 = data[0] >> 0; + const u32 d1 = data[0] >> 8; + const u32 d2 = data[0] >> 16; + const u32 d3 = data[0] >> 24; + const u32 d4 = data[1] >> 0; + + u32 i = 0; + u32 j = 0; + + #pragma unroll 52 + for (i = 0; i < 255; i += 5) + { + j += rc4_key->S[i + 0]; j += d0; swap (rc4_key, i + 0, j); + j += rc4_key->S[i + 1]; j += d1; swap (rc4_key, i + 1, j); + j += rc4_key->S[i + 2]; j += d2; swap (rc4_key, i + 2, j); + j += rc4_key->S[i + 3]; j += d3; swap (rc4_key, i + 3, j); + j += rc4_key->S[i + 4]; j += d4; swap (rc4_key, i + 4, j); + } + + j += rc4_key->S[i + 0]; j += d0; swap (rc4_key, i + 0, j); +} + +__device__ static u8 rc4_next_16 (RC4_KEY *rc4_key, u8 i, u8 j, const u32 in[4], u32 out[4]) +{ + #pragma unroll 4 + for (u32 k = 0; k < 4; k++) + { + u32 xor4 = 0; + + u8 idx; + + i += 1; + j += rc4_key->S[i]; + + swap (rc4_key, i, j); + + idx = rc4_key->S[i] + rc4_key->S[j]; + + xor4 |= rc4_key->S[idx] << 0; + + i += 1; + j += rc4_key->S[i]; + + swap (rc4_key, i, j); + + idx = rc4_key->S[i] + rc4_key->S[j]; + + xor4 |= rc4_key->S[idx] << 8; + + i += 1; + j += rc4_key->S[i]; + + swap (rc4_key, i, j); + + idx = rc4_key->S[i] + rc4_key->S[j]; + + xor4 |= rc4_key->S[idx] << 16; + + i += 1; + j += rc4_key->S[i]; + + swap (rc4_key, i, j); + + idx = rc4_key->S[i] + rc4_key->S[j]; + + xor4 |= rc4_key->S[idx] << 24; + + out[k] = in[k] ^ xor4; + } + + return j; +} + +__device__ static void md5_transform (const u32x w0[4], const u32x w1[4], const u32x w2[4], const u32x w3[4], u32x digest[4]) +{ + u32x a = digest[0]; + u32x b = digest[1]; + u32x c = digest[2]; + u32x d = digest[3]; + + u32x w0_t = w0[0]; + u32x w1_t = w0[1]; + u32x w2_t = w0[2]; + u32x w3_t = w0[3]; + u32x w4_t = w1[0]; + u32x w5_t = w1[1]; + u32x w6_t = w1[2]; + u32x w7_t = w1[3]; + u32x w8_t = w2[0]; + u32x w9_t = w2[1]; + u32x wa_t = w2[2]; + u32x wb_t = w2[3]; + u32x wc_t = w3[0]; + u32x wd_t = w3[1]; + u32x we_t = w3[2]; + u32x wf_t = w3[3]; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t, MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t, MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t, MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t, MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w4_t, MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w5_t, MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w6_t, MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w7_t, MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w8_t, MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w9_t, MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, wa_t, MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, wb_t, MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, wc_t, MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, wd_t, MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, we_t, MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, wf_t, MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w1_t, MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w6_t, MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, wb_t, MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t, MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w5_t, MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, wa_t, MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, wf_t, MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w4_t, MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w9_t, MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, we_t, MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t, MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w8_t, MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, wd_t, MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t, MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w7_t, MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, wc_t, MD5C1f, MD5S13); + + MD5_STEP (MD5_H , a, b, c, d, w5_t, MD5C20, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w8_t, MD5C21, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, wb_t, MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, we_t, MD5C23, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w1_t, MD5C24, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w4_t, MD5C25, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w7_t, MD5C26, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, wa_t, MD5C27, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, wd_t, MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w0_t, MD5C29, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w3_t, MD5C2a, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w6_t, MD5C2b, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w9_t, MD5C2c, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, wc_t, MD5C2d, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, wf_t, MD5C2e, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w2_t, MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t, MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w7_t, MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, we_t, MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w5_t, MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, wc_t, MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t, MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, wa_t, MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t, MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w8_t, MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, wf_t, MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w6_t, MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, wd_t, MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w4_t, MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, wb_t, MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t, MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w9_t, MD5C3f, MD5S33); + + digest[0] += a; + digest[1] += b; + digest[2] += c; + digest[3] += d; +} + +__device__ __constant__ comb_t c_combs[1024]; + +extern "C" __global__ void __launch_bounds__ (64, 1) m10400_m04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const pdf_t *pdf_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, c_combs[0].pw_len); + } + + /** + * key + */ + + __shared__ RC4_KEY rc4_keys[64]; + + RC4_KEY *rc4_key = &rc4_keys[lid]; + + /** + * U_buf + */ + + u32 o_buf[8]; + + o_buf[0] = pdf_bufs[salt_pos].o_buf[0]; + o_buf[1] = pdf_bufs[salt_pos].o_buf[1]; + o_buf[2] = pdf_bufs[salt_pos].o_buf[2]; + o_buf[3] = pdf_bufs[salt_pos].o_buf[3]; + o_buf[4] = pdf_bufs[salt_pos].o_buf[4]; + o_buf[5] = pdf_bufs[salt_pos].o_buf[5]; + o_buf[6] = pdf_bufs[salt_pos].o_buf[6]; + o_buf[7] = pdf_bufs[salt_pos].o_buf[7]; + + u32 P = pdf_bufs[salt_pos].P; + + u32 id_buf[4]; + + id_buf[0] = pdf_bufs[salt_pos].id_buf[0]; + id_buf[1] = pdf_bufs[salt_pos].id_buf[1]; + id_buf[2] = pdf_bufs[salt_pos].id_buf[2]; + id_buf[3] = pdf_bufs[salt_pos].id_buf[3]; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = c_combs[il_pos].pw_len; + + const u32 pw_len = pw_l_len + pw_r_len; + + u32 wordr0[4]; + + wordr0[0] = c_combs[il_pos].i[0]; + wordr0[1] = c_combs[il_pos].i[1]; + wordr0[2] = c_combs[il_pos].i[2]; + wordr0[3] = c_combs[il_pos].i[3]; + + u32 wordr1[4]; + + wordr1[0] = c_combs[il_pos].i[4]; + wordr1[1] = c_combs[il_pos].i[5]; + wordr1[2] = c_combs[il_pos].i[6]; + wordr1[3] = c_combs[il_pos].i[7]; + + u32 wordr2[4]; + + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + + u32 wordr3[4]; + + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + u32x w0[4]; + + w0[0] = wordl0[0] | wordr0[0]; + w0[1] = wordl0[1] | wordr0[1]; + w0[2] = wordl0[2] | wordr0[2]; + w0[3] = wordl0[3] | wordr0[3]; + + u32x w1[4]; + + w1[0] = wordl1[0] | wordr1[0]; + w1[1] = wordl1[1] | wordr1[1]; + w1[2] = wordl1[2] | wordr1[2]; + w1[3] = wordl1[3] | wordr1[3]; + + u32x w2[4]; + + w2[0] = wordl2[0] | wordr2[0]; + w2[1] = wordl2[1] | wordr2[1]; + w2[2] = wordl2[2] | wordr2[2]; + w2[3] = wordl2[3] | wordr2[3]; + + u32x w3[4]; + + w3[0] = wordl3[0] | wordr3[0]; + w3[1] = wordl3[1] | wordr3[1]; + w3[2] = wordl3[2] | wordr3[2]; + w3[3] = wordl3[3] | wordr3[3]; + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + // max length supported by pdf11 is 32 + + w0_t[0] = padding[0]; + w0_t[1] = padding[1]; + w0_t[2] = padding[2]; + w0_t[3] = padding[3]; + w1_t[0] = padding[4]; + w1_t[1] = padding[5]; + w1_t[2] = padding[6]; + w1_t[3] = padding[7]; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = 0; + + switch_buffer_by_offset (w0_t, w1_t, w2_t, w3_t, pw_len); + + // add password + // truncate at 32 is wanted, not a bug! + // add o_buf + + w0_t[0] |= w0[0]; + w0_t[1] |= w0[1]; + w0_t[2] |= w0[2]; + w0_t[3] |= w0[3]; + w1_t[0] |= w1[0]; + w1_t[1] |= w1[1]; + w1_t[2] |= w1[2]; + w1_t[3] |= w1[3]; + w2_t[0] = o_buf[0]; + w2_t[1] = o_buf[1]; + w2_t[2] = o_buf[2]; + w2_t[3] = o_buf[3]; + w3_t[0] = o_buf[4]; + w3_t[1] = o_buf[5]; + w3_t[2] = o_buf[6]; + w3_t[3] = o_buf[7]; + + u32x digest[4]; + + digest[0] = MD5M_A; + digest[1] = MD5M_B; + digest[2] = MD5M_C; + digest[3] = MD5M_D; + + md5_transform (w0_t, w1_t, w2_t, w3_t, digest); + + w0_t[0] = P; + w0_t[1] = id_buf[0]; + w0_t[2] = id_buf[1]; + w0_t[3] = id_buf[2]; + w1_t[0] = id_buf[3]; + w1_t[1] = 0x80; + w1_t[2] = 0; + w1_t[3] = 0; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 84 * 8; + w3_t[3] = 0; + + md5_transform (w0_t, w1_t, w2_t, w3_t, digest); + + // now the RC4 part + + u32x key[4]; + + key[0] = digest[0]; + key[1] = digest[1] & 0xff; + key[2] = 0; + key[3] = 0; + + rc4_init_16 (rc4_key, key); + + u32x out[4]; + + rc4_next_16 (rc4_key, 0, 0, padding, out); + + const u32x r0 = out[0]; + const u32x r1 = out[1]; + const u32x r2 = out[2]; + const u32x r3 = out[3]; + + #include VECT_COMPARE_M + } +} + +extern "C" __global__ void __launch_bounds__ (64, 1) m10400_m08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const pdf_t *pdf_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (64, 1) m10400_m16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const pdf_t *pdf_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (64, 1) m10400_s04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const pdf_t *pdf_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, c_combs[0].pw_len); + } + + /** + * key + */ + + __shared__ RC4_KEY rc4_keys[64]; + + RC4_KEY *rc4_key = &rc4_keys[lid]; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * U_buf + */ + + u32 o_buf[8]; + + o_buf[0] = pdf_bufs[salt_pos].o_buf[0]; + o_buf[1] = pdf_bufs[salt_pos].o_buf[1]; + o_buf[2] = pdf_bufs[salt_pos].o_buf[2]; + o_buf[3] = pdf_bufs[salt_pos].o_buf[3]; + o_buf[4] = pdf_bufs[salt_pos].o_buf[4]; + o_buf[5] = pdf_bufs[salt_pos].o_buf[5]; + o_buf[6] = pdf_bufs[salt_pos].o_buf[6]; + o_buf[7] = pdf_bufs[salt_pos].o_buf[7]; + + u32 P = pdf_bufs[salt_pos].P; + + u32 id_buf[4]; + + id_buf[0] = pdf_bufs[salt_pos].id_buf[0]; + id_buf[1] = pdf_bufs[salt_pos].id_buf[1]; + id_buf[2] = pdf_bufs[salt_pos].id_buf[2]; + id_buf[3] = pdf_bufs[salt_pos].id_buf[3]; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = c_combs[il_pos].pw_len; + + const u32 pw_len = pw_l_len + pw_r_len; + + u32 wordr0[4]; + + wordr0[0] = c_combs[il_pos].i[0]; + wordr0[1] = c_combs[il_pos].i[1]; + wordr0[2] = c_combs[il_pos].i[2]; + wordr0[3] = c_combs[il_pos].i[3]; + + u32 wordr1[4]; + + wordr1[0] = c_combs[il_pos].i[4]; + wordr1[1] = c_combs[il_pos].i[5]; + wordr1[2] = c_combs[il_pos].i[6]; + wordr1[3] = c_combs[il_pos].i[7]; + + u32 wordr2[4]; + + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + + u32 wordr3[4]; + + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + u32x w0[4]; + + w0[0] = wordl0[0] | wordr0[0]; + w0[1] = wordl0[1] | wordr0[1]; + w0[2] = wordl0[2] | wordr0[2]; + w0[3] = wordl0[3] | wordr0[3]; + + u32x w1[4]; + + w1[0] = wordl1[0] | wordr1[0]; + w1[1] = wordl1[1] | wordr1[1]; + w1[2] = wordl1[2] | wordr1[2]; + w1[3] = wordl1[3] | wordr1[3]; + + u32x w2[4]; + + w2[0] = wordl2[0] | wordr2[0]; + w2[1] = wordl2[1] | wordr2[1]; + w2[2] = wordl2[2] | wordr2[2]; + w2[3] = wordl2[3] | wordr2[3]; + + u32x w3[4]; + + w3[0] = wordl3[0] | wordr3[0]; + w3[1] = wordl3[1] | wordr3[1]; + w3[2] = wordl3[2] | wordr3[2]; + w3[3] = wordl3[3] | wordr3[3]; + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + // max length supported by pdf11 is 32 + + w0_t[0] = padding[0]; + w0_t[1] = padding[1]; + w0_t[2] = padding[2]; + w0_t[3] = padding[3]; + w1_t[0] = padding[4]; + w1_t[1] = padding[5]; + w1_t[2] = padding[6]; + w1_t[3] = padding[7]; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = 0; + + switch_buffer_by_offset (w0_t, w1_t, w2_t, w3_t, pw_len); + + // add password + // truncate at 32 is wanted, not a bug! + // add o_buf + + w0_t[0] |= w0[0]; + w0_t[1] |= w0[1]; + w0_t[2] |= w0[2]; + w0_t[3] |= w0[3]; + w1_t[0] |= w1[0]; + w1_t[1] |= w1[1]; + w1_t[2] |= w1[2]; + w1_t[3] |= w1[3]; + w2_t[0] = o_buf[0]; + w2_t[1] = o_buf[1]; + w2_t[2] = o_buf[2]; + w2_t[3] = o_buf[3]; + w3_t[0] = o_buf[4]; + w3_t[1] = o_buf[5]; + w3_t[2] = o_buf[6]; + w3_t[3] = o_buf[7]; + + u32x digest[4]; + + digest[0] = MD5M_A; + digest[1] = MD5M_B; + digest[2] = MD5M_C; + digest[3] = MD5M_D; + + md5_transform (w0_t, w1_t, w2_t, w3_t, digest); + + w0_t[0] = P; + w0_t[1] = id_buf[0]; + w0_t[2] = id_buf[1]; + w0_t[3] = id_buf[2]; + w1_t[0] = id_buf[3]; + w1_t[1] = 0x80; + w1_t[2] = 0; + w1_t[3] = 0; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 84 * 8; + w3_t[3] = 0; + + md5_transform (w0_t, w1_t, w2_t, w3_t, digest); + + // now the RC4 part + + u32x key[4]; + + key[0] = digest[0]; + key[1] = digest[1] & 0xff; + key[2] = 0; + key[3] = 0; + + rc4_init_16 (rc4_key, key); + + u32x out[4]; + + rc4_next_16 (rc4_key, 0, 0, padding, out); + + const u32x r0 = out[0]; + const u32x r1 = out[1]; + const u32x r2 = out[2]; + const u32x r3 = out[3]; + + #include VECT_COMPARE_S + } +} + +extern "C" __global__ void __launch_bounds__ (64, 1) m10400_s08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const pdf_t *pdf_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (64, 1) m10400_s16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const pdf_t *pdf_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/nv/m10400_a3.cu b/nv/m10400_a3.cu new file mode 100644 index 0000000000..2c84a2e632 --- /dev/null +++ b/nv/m10400_a3.cu @@ -0,0 +1,849 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _MD5_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW2 +#define VECT_SIZE1 +#endif + +#define DGST_R0 0 +#define DGST_R1 1 +#define DGST_R2 2 +#define DGST_R3 3 + +#include "include/kernel_functions.c" +#include "types_nv.c" +#include "common_nv.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +__device__ __constant__ u32 padding[8] = +{ + 0x5e4ebf28, + 0x418a754e, + 0x564e0064, + 0x0801faff, + 0xb6002e2e, + 0x803e68d0, + 0xfea90c2f, + 0x7a695364 +}; + +typedef struct +{ + u8 S[256]; + + u32 wtf_its_faster; + +} RC4_KEY; + +__device__ static void swap (RC4_KEY *rc4_key, const u8 i, const u8 j) +{ + u8 tmp; + + tmp = rc4_key->S[i]; + rc4_key->S[i] = rc4_key->S[j]; + rc4_key->S[j] = tmp; +} + +__device__ static void rc4_init_16 (RC4_KEY *rc4_key, const u32 data[4]) +{ + u32 v = 0x03020100; + u32 a = 0x04040404; + + u32 *ptr = (u32 *) rc4_key->S; + + #pragma unroll 64 + for (u32 i = 0; i < 64; i++) + { + *ptr++ = v; v += a; + } + + const u32 d0 = data[0] >> 0; + const u32 d1 = data[0] >> 8; + const u32 d2 = data[0] >> 16; + const u32 d3 = data[0] >> 24; + const u32 d4 = data[1] >> 0; + + u32 i = 0; + u32 j = 0; + + #pragma unroll 52 + for (i = 0; i < 255; i += 5) + { + j += rc4_key->S[i + 0]; j += d0; swap (rc4_key, i + 0, j); + j += rc4_key->S[i + 1]; j += d1; swap (rc4_key, i + 1, j); + j += rc4_key->S[i + 2]; j += d2; swap (rc4_key, i + 2, j); + j += rc4_key->S[i + 3]; j += d3; swap (rc4_key, i + 3, j); + j += rc4_key->S[i + 4]; j += d4; swap (rc4_key, i + 4, j); + } + + j += rc4_key->S[i + 0]; j += d0; swap (rc4_key, i + 0, j); +} + +__device__ static u8 rc4_next_16 (RC4_KEY *rc4_key, u8 i, u8 j, const u32 in[4], u32 out[4]) +{ + #pragma unroll 4 + for (u32 k = 0; k < 4; k++) + { + u32 xor4 = 0; + + u8 idx; + + i += 1; + j += rc4_key->S[i]; + + swap (rc4_key, i, j); + + idx = rc4_key->S[i] + rc4_key->S[j]; + + xor4 |= rc4_key->S[idx] << 0; + + i += 1; + j += rc4_key->S[i]; + + swap (rc4_key, i, j); + + idx = rc4_key->S[i] + rc4_key->S[j]; + + xor4 |= rc4_key->S[idx] << 8; + + i += 1; + j += rc4_key->S[i]; + + swap (rc4_key, i, j); + + idx = rc4_key->S[i] + rc4_key->S[j]; + + xor4 |= rc4_key->S[idx] << 16; + + i += 1; + j += rc4_key->S[i]; + + swap (rc4_key, i, j); + + idx = rc4_key->S[i] + rc4_key->S[j]; + + xor4 |= rc4_key->S[idx] << 24; + + out[k] = in[k] ^ xor4; + } + + return j; +} + +__device__ static void md5_transform (const u32x w0[4], const u32x w1[4], const u32x w2[4], const u32x w3[4], u32x digest[4]) +{ + u32x a = digest[0]; + u32x b = digest[1]; + u32x c = digest[2]; + u32x d = digest[3]; + + u32x w0_t = w0[0]; + u32x w1_t = w0[1]; + u32x w2_t = w0[2]; + u32x w3_t = w0[3]; + u32x w4_t = w1[0]; + u32x w5_t = w1[1]; + u32x w6_t = w1[2]; + u32x w7_t = w1[3]; + u32x w8_t = w2[0]; + u32x w9_t = w2[1]; + u32x wa_t = w2[2]; + u32x wb_t = w2[3]; + u32x wc_t = w3[0]; + u32x wd_t = w3[1]; + u32x we_t = w3[2]; + u32x wf_t = w3[3]; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t, MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t, MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t, MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t, MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w4_t, MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w5_t, MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w6_t, MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w7_t, MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w8_t, MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w9_t, MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, wa_t, MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, wb_t, MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, wc_t, MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, wd_t, MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, we_t, MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, wf_t, MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w1_t, MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w6_t, MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, wb_t, MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t, MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w5_t, MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, wa_t, MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, wf_t, MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w4_t, MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w9_t, MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, we_t, MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t, MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w8_t, MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, wd_t, MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t, MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w7_t, MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, wc_t, MD5C1f, MD5S13); + + MD5_STEP (MD5_H , a, b, c, d, w5_t, MD5C20, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w8_t, MD5C21, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, wb_t, MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, we_t, MD5C23, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w1_t, MD5C24, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w4_t, MD5C25, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w7_t, MD5C26, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, wa_t, MD5C27, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, wd_t, MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w0_t, MD5C29, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w3_t, MD5C2a, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w6_t, MD5C2b, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w9_t, MD5C2c, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, wc_t, MD5C2d, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, wf_t, MD5C2e, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w2_t, MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t, MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w7_t, MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, we_t, MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w5_t, MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, wc_t, MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t, MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, wa_t, MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t, MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w8_t, MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, wf_t, MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w6_t, MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, wd_t, MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w4_t, MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, wb_t, MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t, MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w9_t, MD5C3f, MD5S33); + + digest[0] += a; + digest[1] += b; + digest[2] += c; + digest[3] += d; +} + +__device__ __constant__ bf_t c_bfs[1024]; + +__device__ static void m10400m (RC4_KEY rc4_keys[64], u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], const u32 pw_len, const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const u32x * words_buf_r, void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const pdf_t *pdf_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset) +{ + /** + * modifier + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + const u32 lid = threadIdx.x; + + RC4_KEY *rc4_key = &rc4_keys[lid]; + + /** + * U_buf + */ + + u32 o_buf[8]; + + o_buf[0] = pdf_bufs[salt_pos].o_buf[0]; + o_buf[1] = pdf_bufs[salt_pos].o_buf[1]; + o_buf[2] = pdf_bufs[salt_pos].o_buf[2]; + o_buf[3] = pdf_bufs[salt_pos].o_buf[3]; + o_buf[4] = pdf_bufs[salt_pos].o_buf[4]; + o_buf[5] = pdf_bufs[salt_pos].o_buf[5]; + o_buf[6] = pdf_bufs[salt_pos].o_buf[6]; + o_buf[7] = pdf_bufs[salt_pos].o_buf[7]; + + u32 P = pdf_bufs[salt_pos].P; + + u32 id_buf[4]; + + id_buf[0] = pdf_bufs[salt_pos].id_buf[0]; + id_buf[1] = pdf_bufs[salt_pos].id_buf[1]; + id_buf[2] = pdf_bufs[salt_pos].id_buf[2]; + id_buf[3] = pdf_bufs[salt_pos].id_buf[3]; + + /** + * loop + */ + + u32x w0l = w0[0]; + + for (u32 il_pos = 0; il_pos < bfs_cnt; il_pos++) + { + const u32 w0r = c_bfs[il_pos].i; + + w0[0] = w0l | w0r; + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + // max length supported by pdf11 is 32 + + w0_t[0] = padding[0]; + w0_t[1] = padding[1]; + w0_t[2] = padding[2]; + w0_t[3] = padding[3]; + w1_t[0] = padding[4]; + w1_t[1] = padding[5]; + w1_t[2] = padding[6]; + w1_t[3] = padding[7]; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = 0; + + switch_buffer_by_offset (w0_t, w1_t, w2_t, w3_t, pw_len); + + // add password + // truncate at 32 is wanted, not a bug! + // add o_buf + + w0_t[0] |= w0[0]; + w0_t[1] |= w0[1]; + w0_t[2] |= w0[2]; + w0_t[3] |= w0[3]; + w1_t[0] |= w1[0]; + w1_t[1] |= w1[1]; + w1_t[2] |= w1[2]; + w1_t[3] |= w1[3]; + w2_t[0] = o_buf[0]; + w2_t[1] = o_buf[1]; + w2_t[2] = o_buf[2]; + w2_t[3] = o_buf[3]; + w3_t[0] = o_buf[4]; + w3_t[1] = o_buf[5]; + w3_t[2] = o_buf[6]; + w3_t[3] = o_buf[7]; + + u32x digest[4]; + + digest[0] = MD5M_A; + digest[1] = MD5M_B; + digest[2] = MD5M_C; + digest[3] = MD5M_D; + + md5_transform (w0_t, w1_t, w2_t, w3_t, digest); + + w0_t[0] = P; + w0_t[1] = id_buf[0]; + w0_t[2] = id_buf[1]; + w0_t[3] = id_buf[2]; + w1_t[0] = id_buf[3]; + w1_t[1] = 0x80; + w1_t[2] = 0; + w1_t[3] = 0; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 84 * 8; + w3_t[3] = 0; + + md5_transform (w0_t, w1_t, w2_t, w3_t, digest); + + // now the RC4 part + + u32x key[4]; + + key[0] = digest[0]; + key[1] = digest[1] & 0xff; + key[2] = 0; + key[3] = 0; + + rc4_init_16 (rc4_key, key); + + u32x out[4]; + + rc4_next_16 (rc4_key, 0, 0, padding, out); + + const u32x r0 = out[0]; + const u32x r1 = out[1]; + const u32x r2 = out[2]; + const u32x r3 = out[3]; + + #include VECT_COMPARE_M + } +} + +__device__ static void m10400s (RC4_KEY rc4_keys[64], u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], const u32 pw_len, const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const u32x * words_buf_r, void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const pdf_t *pdf_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset) +{ + /** + * modifier + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + const u32 lid = threadIdx.x; + + RC4_KEY *rc4_key = &rc4_keys[lid]; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * U_buf + */ + + u32 o_buf[8]; + + o_buf[0] = pdf_bufs[salt_pos].o_buf[0]; + o_buf[1] = pdf_bufs[salt_pos].o_buf[1]; + o_buf[2] = pdf_bufs[salt_pos].o_buf[2]; + o_buf[3] = pdf_bufs[salt_pos].o_buf[3]; + o_buf[4] = pdf_bufs[salt_pos].o_buf[4]; + o_buf[5] = pdf_bufs[salt_pos].o_buf[5]; + o_buf[6] = pdf_bufs[salt_pos].o_buf[6]; + o_buf[7] = pdf_bufs[salt_pos].o_buf[7]; + + u32 P = pdf_bufs[salt_pos].P; + + u32 id_buf[4]; + + id_buf[0] = pdf_bufs[salt_pos].id_buf[0]; + id_buf[1] = pdf_bufs[salt_pos].id_buf[1]; + id_buf[2] = pdf_bufs[salt_pos].id_buf[2]; + id_buf[3] = pdf_bufs[salt_pos].id_buf[3]; + + /** + * loop + */ + + u32x w0l = w0[0]; + + for (u32 il_pos = 0; il_pos < bfs_cnt; il_pos++) + { + const u32 w0r = c_bfs[il_pos].i; + + w0[0] = w0l | w0r; + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + // max length supported by pdf11 is 32 + + w0_t[0] = padding[0]; + w0_t[1] = padding[1]; + w0_t[2] = padding[2]; + w0_t[3] = padding[3]; + w1_t[0] = padding[4]; + w1_t[1] = padding[5]; + w1_t[2] = padding[6]; + w1_t[3] = padding[7]; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = 0; + + switch_buffer_by_offset (w0_t, w1_t, w2_t, w3_t, pw_len); + + // add password + // truncate at 32 is wanted, not a bug! + // add o_buf + + w0_t[0] |= w0[0]; + w0_t[1] |= w0[1]; + w0_t[2] |= w0[2]; + w0_t[3] |= w0[3]; + w1_t[0] |= w1[0]; + w1_t[1] |= w1[1]; + w1_t[2] |= w1[2]; + w1_t[3] |= w1[3]; + w2_t[0] = o_buf[0]; + w2_t[1] = o_buf[1]; + w2_t[2] = o_buf[2]; + w2_t[3] = o_buf[3]; + w3_t[0] = o_buf[4]; + w3_t[1] = o_buf[5]; + w3_t[2] = o_buf[6]; + w3_t[3] = o_buf[7]; + + u32x digest[4]; + + digest[0] = MD5M_A; + digest[1] = MD5M_B; + digest[2] = MD5M_C; + digest[3] = MD5M_D; + + md5_transform (w0_t, w1_t, w2_t, w3_t, digest); + + w0_t[0] = P; + w0_t[1] = id_buf[0]; + w0_t[2] = id_buf[1]; + w0_t[3] = id_buf[2]; + w1_t[0] = id_buf[3]; + w1_t[1] = 0x80; + w1_t[2] = 0; + w1_t[3] = 0; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 84 * 8; + w3_t[3] = 0; + + md5_transform (w0_t, w1_t, w2_t, w3_t, digest); + + // now the RC4 part + + u32x key[4]; + + key[0] = digest[0]; + key[1] = digest[1] & 0xff; + key[2] = 0; + key[3] = 0; + + rc4_init_16 (rc4_key, key); + + u32x out[4]; + + rc4_next_16 (rc4_key, 0, 0, padding, out); + + const u32x r0 = out[0]; + const u32x r1 = out[1]; + const u32x r2 = out[2]; + const u32x r3 = out[3]; + + #include VECT_COMPARE_S + } +} + +extern "C" __global__ void __launch_bounds__ (64, 1) m10400_m04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const u32x * words_buf_r, void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const pdf_t *pdf_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + __shared__ RC4_KEY rc4_keys[64]; + + m10400m (rc4_keys, w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, pdf_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (64, 1) m10400_m08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const u32x * words_buf_r, void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const pdf_t *pdf_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + __shared__ RC4_KEY rc4_keys[64]; + + m10400m (rc4_keys, w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, pdf_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (64, 1) m10400_m16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const u32x * words_buf_r, void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const pdf_t *pdf_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = pws[gid].i[ 8]; + w2[1] = pws[gid].i[ 9]; + w2[2] = pws[gid].i[10]; + w2[3] = pws[gid].i[11]; + + u32x w3[4]; + + w3[0] = pws[gid].i[12]; + w3[1] = pws[gid].i[13]; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + __shared__ RC4_KEY rc4_keys[64]; + + m10400m (rc4_keys, w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, pdf_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (64, 1) m10400_s04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const u32x * words_buf_r, void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const pdf_t *pdf_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + __shared__ RC4_KEY rc4_keys[64]; + + m10400s (rc4_keys, w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, pdf_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (64, 1) m10400_s08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const u32x * words_buf_r, void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const pdf_t *pdf_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + __shared__ RC4_KEY rc4_keys[64]; + + m10400s (rc4_keys, w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, pdf_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (64, 1) m10400_s16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const u32x * words_buf_r, void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const pdf_t *pdf_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = pws[gid].i[ 8]; + w2[1] = pws[gid].i[ 9]; + w2[2] = pws[gid].i[10]; + w2[3] = pws[gid].i[11]; + + u32x w3[4]; + + w3[0] = pws[gid].i[12]; + w3[1] = pws[gid].i[13]; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + __shared__ RC4_KEY rc4_keys[64]; + + m10400s (rc4_keys, w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, pdf_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} diff --git a/nv/m10410_a0.cu b/nv/m10410_a0.cu new file mode 100644 index 0000000000..a2b3692c80 --- /dev/null +++ b/nv/m10410_a0.cu @@ -0,0 +1,380 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _MD5_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW2 +#define VECT_SIZE1 +#endif + +#define DGST_R0 0 +#define DGST_R1 1 +#define DGST_R2 2 +#define DGST_R3 3 + +#include "include/kernel_functions.c" +#include "types_nv.c" +#include "common_nv.c" +#include "include/rp_gpu.h" +#include "rp_nv.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +__device__ __constant__ u32 padding[8] = +{ + 0x5e4ebf28, + 0x418a754e, + 0x564e0064, + 0x0801faff, + 0xb6002e2e, + 0x803e68d0, + 0xfea90c2f, + 0x7a695364 +}; + +typedef struct +{ + u8 S[256]; + + u32 wtf_its_faster; + +} RC4_KEY; + +__device__ static void swap (RC4_KEY *rc4_key, const u8 i, const u8 j) +{ + u8 tmp; + + tmp = rc4_key->S[i]; + rc4_key->S[i] = rc4_key->S[j]; + rc4_key->S[j] = tmp; +} + +__device__ static void rc4_init_16 (RC4_KEY *rc4_key, const u32 data[4]) +{ + u32 v = 0x03020100; + u32 a = 0x04040404; + + u32 *ptr = (u32 *) rc4_key->S; + + #pragma unroll 64 + for (u32 i = 0; i < 64; i++) + { + *ptr++ = v; v += a; + } + + const u32 d0 = data[0] >> 0; + const u32 d1 = data[0] >> 8; + const u32 d2 = data[0] >> 16; + const u32 d3 = data[0] >> 24; + const u32 d4 = data[1] >> 0; + + u32 i = 0; + u32 j = 0; + + #pragma unroll 52 + for (i = 0; i < 255; i += 5) + { + j += rc4_key->S[i + 0]; j += d0; swap (rc4_key, i + 0, j); + j += rc4_key->S[i + 1]; j += d1; swap (rc4_key, i + 1, j); + j += rc4_key->S[i + 2]; j += d2; swap (rc4_key, i + 2, j); + j += rc4_key->S[i + 3]; j += d3; swap (rc4_key, i + 3, j); + j += rc4_key->S[i + 4]; j += d4; swap (rc4_key, i + 4, j); + } + + j += rc4_key->S[i + 0]; j += d0; swap (rc4_key, i + 0, j); +} + +__device__ static u8 rc4_next_16 (RC4_KEY *rc4_key, u8 i, u8 j, const u32 in[4], u32 out[4]) +{ + for (u32 k = 0; k < 4; k++) + { + u32 xor4 = 0; + + u8 idx; + + i += 1; + j += rc4_key->S[i]; + + swap (rc4_key, i, j); + + idx = rc4_key->S[i] + rc4_key->S[j]; + + xor4 |= rc4_key->S[idx] << 0; + + i += 1; + j += rc4_key->S[i]; + + swap (rc4_key, i, j); + + idx = rc4_key->S[i] + rc4_key->S[j]; + + xor4 |= rc4_key->S[idx] << 8; + + i += 1; + j += rc4_key->S[i]; + + swap (rc4_key, i, j); + + idx = rc4_key->S[i] + rc4_key->S[j]; + + xor4 |= rc4_key->S[idx] << 16; + + i += 1; + j += rc4_key->S[i]; + + swap (rc4_key, i, j); + + idx = rc4_key->S[i] + rc4_key->S[j]; + + xor4 |= rc4_key->S[idx] << 24; + + out[k] = in[k] ^ xor4; + } + + return j; +} + +__device__ __constant__ gpu_rule_t c_rules[1024]; + +extern "C" __global__ void __launch_bounds__ (64, 1) m10410_m04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const pdf_t *pdf_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + u32x pw_buf1[4]; + + pw_buf1[0] = pws[gid].i[ 4]; + pw_buf1[1] = pws[gid].i[ 5]; + pw_buf1[2] = pws[gid].i[ 6]; + pw_buf1[3] = pws[gid].i[ 7]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * key + */ + + __shared__ RC4_KEY rc4_keys[64]; + RC4_KEY *rc4_key = &rc4_keys[lid]; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + + w0[0] = pw_buf0[0]; + w0[1] = pw_buf0[1]; + w0[2] = pw_buf0[2]; + w0[3] = pw_buf0[3]; + + u32x w1[4]; + + w1[0] = pw_buf1[0]; + w1[1] = pw_buf1[1]; + w1[2] = pw_buf1[2]; + w1[3] = pw_buf1[3]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 out_len = apply_rules (c_rules[il_pos].cmds, w0, w1, pw_len); + + // now the RC4 part + + u32x key[4]; + + key[0] = w0[0]; + key[1] = w0[1]; + key[2] = 0; + key[3] = 0; + + rc4_init_16 (rc4_key, key); + + u32x out[4]; + + rc4_next_16 (rc4_key, 0, 0, padding, out); + + const u32x r0 = out[0]; + const u32x r1 = out[1]; + const u32x r2 = out[2]; + const u32x r3 = out[3]; + + #include VECT_COMPARE_M + } +} + +extern "C" __global__ void __launch_bounds__ (64, 1) m10410_m08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const pdf_t *pdf_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (64, 1) m10410_m16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const pdf_t *pdf_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (64, 1) m10410_s04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const pdf_t *pdf_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + u32x pw_buf1[4]; + + pw_buf1[0] = pws[gid].i[ 4]; + pw_buf1[1] = pws[gid].i[ 5]; + pw_buf1[2] = pws[gid].i[ 6]; + pw_buf1[3] = pws[gid].i[ 7]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * key + */ + + __shared__ RC4_KEY rc4_keys[64]; + RC4_KEY *rc4_key = &rc4_keys[lid]; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + + w0[0] = pw_buf0[0]; + w0[1] = pw_buf0[1]; + w0[2] = pw_buf0[2]; + w0[3] = pw_buf0[3]; + + u32x w1[4]; + + w1[0] = pw_buf1[0]; + w1[1] = pw_buf1[1]; + w1[2] = pw_buf1[2]; + w1[3] = pw_buf1[3]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 out_len = apply_rules (c_rules[il_pos].cmds, w0, w1, pw_len); + + // now the RC4 part + + u32x key[4]; + + key[0] = w0[0]; + key[1] = w0[1]; + key[2] = 0; + key[3] = 0; + + rc4_init_16 (rc4_key, key); + + u32x out[4]; + + rc4_next_16 (rc4_key, 0, 0, padding, out); + + const u32x r0 = out[0]; + const u32x r1 = out[1]; + const u32x r2 = out[2]; + const u32x r3 = out[3]; + + #include VECT_COMPARE_S + } +} + +extern "C" __global__ void __launch_bounds__ (64, 1) m10410_s08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const pdf_t *pdf_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (64, 1) m10410_s16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const pdf_t *pdf_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/nv/m10410_a1.cu b/nv/m10410_a1.cu new file mode 100644 index 0000000000..e881982bed --- /dev/null +++ b/nv/m10410_a1.cu @@ -0,0 +1,432 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _MD5_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW2 +#define VECT_SIZE1 +#endif + +#define DGST_R0 0 +#define DGST_R1 1 +#define DGST_R2 2 +#define DGST_R3 3 + +#include "include/kernel_functions.c" +#include "types_nv.c" +#include "common_nv.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +__device__ __constant__ u32 padding[8] = +{ + 0x5e4ebf28, + 0x418a754e, + 0x564e0064, + 0x0801faff, + 0xb6002e2e, + 0x803e68d0, + 0xfea90c2f, + 0x7a695364 +}; + +typedef struct +{ + u8 S[256]; + + u32 wtf_its_faster; + +} RC4_KEY; + +__device__ static void swap (RC4_KEY *rc4_key, const u8 i, const u8 j) +{ + u8 tmp; + + tmp = rc4_key->S[i]; + rc4_key->S[i] = rc4_key->S[j]; + rc4_key->S[j] = tmp; +} + +__device__ static void rc4_init_16 (RC4_KEY *rc4_key, const u32 data[4]) +{ + u32 v = 0x03020100; + u32 a = 0x04040404; + + u32 *ptr = (u32 *) rc4_key->S; + + #pragma unroll 64 + for (u32 i = 0; i < 64; i++) + { + *ptr++ = v; v += a; + } + + const u32 d0 = data[0] >> 0; + const u32 d1 = data[0] >> 8; + const u32 d2 = data[0] >> 16; + const u32 d3 = data[0] >> 24; + const u32 d4 = data[1] >> 0; + + u32 i = 0; + u32 j = 0; + + #pragma unroll 52 + for (i = 0; i < 255; i += 5) + { + j += rc4_key->S[i + 0]; j += d0; swap (rc4_key, i + 0, j); + j += rc4_key->S[i + 1]; j += d1; swap (rc4_key, i + 1, j); + j += rc4_key->S[i + 2]; j += d2; swap (rc4_key, i + 2, j); + j += rc4_key->S[i + 3]; j += d3; swap (rc4_key, i + 3, j); + j += rc4_key->S[i + 4]; j += d4; swap (rc4_key, i + 4, j); + } + + j += rc4_key->S[i + 0]; j += d0; swap (rc4_key, i + 0, j); +} + +__device__ static u8 rc4_next_16 (RC4_KEY *rc4_key, u8 i, u8 j, const u32 in[4], u32 out[4]) +{ + for (u32 k = 0; k < 4; k++) + { + u32 xor4 = 0; + + u8 idx; + + i += 1; + j += rc4_key->S[i]; + + swap (rc4_key, i, j); + + idx = rc4_key->S[i] + rc4_key->S[j]; + + xor4 |= rc4_key->S[idx] << 0; + + i += 1; + j += rc4_key->S[i]; + + swap (rc4_key, i, j); + + idx = rc4_key->S[i] + rc4_key->S[j]; + + xor4 |= rc4_key->S[idx] << 8; + + i += 1; + j += rc4_key->S[i]; + + swap (rc4_key, i, j); + + idx = rc4_key->S[i] + rc4_key->S[j]; + + xor4 |= rc4_key->S[idx] << 16; + + i += 1; + j += rc4_key->S[i]; + + swap (rc4_key, i, j); + + idx = rc4_key->S[i] + rc4_key->S[j]; + + xor4 |= rc4_key->S[idx] << 24; + + out[k] = in[k] ^ xor4; + } + + return j; +} + +__device__ __constant__ comb_t c_combs[1024]; + +extern "C" __global__ void __launch_bounds__ (64, 1) m10410_m04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const pdf_t *pdf_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, c_combs[0].pw_len); + } + + /** + * key + */ + + __shared__ RC4_KEY rc4_keys[64]; + RC4_KEY *rc4_key = &rc4_keys[lid]; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + u32 wordr0[4]; + + wordr0[0] = c_combs[il_pos].i[0]; + wordr0[1] = c_combs[il_pos].i[1]; + wordr0[2] = c_combs[il_pos].i[2]; + wordr0[3] = c_combs[il_pos].i[3]; + + u32 wordr1[4]; + + wordr1[0] = c_combs[il_pos].i[4]; + wordr1[1] = c_combs[il_pos].i[5]; + wordr1[2] = c_combs[il_pos].i[6]; + wordr1[3] = c_combs[il_pos].i[7]; + + u32 wordr2[4]; + + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + + u32 wordr3[4]; + + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + u32x w0[2]; + + w0[0] = wordl0[0] | wordr0[0]; + w0[1] = wordl0[1] | wordr0[1]; + + // now the RC4 part + + u32x key[4]; + + key[0] = w0[0]; + key[1] = w0[1]; + key[2] = 0; + key[3] = 0; + + rc4_init_16 (rc4_key, key); + + u32x out[4]; + + rc4_next_16 (rc4_key, 0, 0, padding, out); + + const u32x r0 = out[0]; + const u32x r1 = out[1]; + const u32x r2 = out[2]; + const u32x r3 = out[3]; + + #include VECT_COMPARE_M + } +} + +extern "C" __global__ void __launch_bounds__ (64, 1) m10410_m08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const pdf_t *pdf_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (64, 1) m10410_m16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const pdf_t *pdf_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (64, 1) m10410_s04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const pdf_t *pdf_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, c_combs[0].pw_len); + } + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * key + */ + + __shared__ RC4_KEY rc4_keys[64]; + RC4_KEY *rc4_key = &rc4_keys[lid]; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + u32 wordr0[4]; + + wordr0[0] = c_combs[il_pos].i[0]; + wordr0[1] = c_combs[il_pos].i[1]; + wordr0[2] = c_combs[il_pos].i[2]; + wordr0[3] = c_combs[il_pos].i[3]; + + u32 wordr1[4]; + + wordr1[0] = c_combs[il_pos].i[4]; + wordr1[1] = c_combs[il_pos].i[5]; + wordr1[2] = c_combs[il_pos].i[6]; + wordr1[3] = c_combs[il_pos].i[7]; + + u32 wordr2[4]; + + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + + u32 wordr3[4]; + + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + u32x w0[2]; + + w0[0] = wordl0[0] | wordr0[0]; + w0[1] = wordl0[1] | wordr0[1]; + + // now the RC4 part + + u32x key[4]; + + key[0] = w0[0]; + key[1] = w0[1]; + key[2] = 0; + key[3] = 0; + + rc4_init_16 (rc4_key, key); + + u32x out[4]; + + rc4_next_16 (rc4_key, 0, 0, padding, out); + + const u32x r0 = out[0]; + const u32x r1 = out[1]; + const u32x r2 = out[2]; + const u32x r3 = out[3]; + + #include VECT_COMPARE_S + } +} + +extern "C" __global__ void __launch_bounds__ (64, 1) m10410_s08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const pdf_t *pdf_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (64, 1) m10410_s16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const pdf_t *pdf_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/nv/m10410_a3.cu b/nv/m10410_a3.cu new file mode 100644 index 0000000000..7e0ab50a47 --- /dev/null +++ b/nv/m10410_a3.cu @@ -0,0 +1,552 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _MD5_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW2 +#define VECT_SIZE1 +#endif + +#define DGST_R0 0 +#define DGST_R1 1 +#define DGST_R2 2 +#define DGST_R3 3 + +#include "include/kernel_functions.c" +#include "types_nv.c" +#include "common_nv.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +__device__ __constant__ u32 padding[8] = +{ + 0x5e4ebf28, + 0x418a754e, + 0x564e0064, + 0x0801faff, + 0xb6002e2e, + 0x803e68d0, + 0xfea90c2f, + 0x7a695364 +}; + +typedef struct +{ + u8 S[256]; + + u32 wtf_its_faster; + +} RC4_KEY; + +__device__ static void swap (RC4_KEY *rc4_key, const u8 i, const u8 j) +{ + u8 tmp; + + tmp = rc4_key->S[i]; + rc4_key->S[i] = rc4_key->S[j]; + rc4_key->S[j] = tmp; +} + +__device__ static void rc4_init_16 (RC4_KEY *rc4_key, const u32 data[4]) +{ + u32 v = 0x03020100; + u32 a = 0x04040404; + + u32 *ptr = (u32 *) rc4_key->S; + + #pragma unroll 64 + for (u32 i = 0; i < 64; i++) + { + *ptr++ = v; v += a; + } + + const u32 d0 = data[0] >> 0; + const u32 d1 = data[0] >> 8; + const u32 d2 = data[0] >> 16; + const u32 d3 = data[0] >> 24; + const u32 d4 = data[1] >> 0; + + u32 i = 0; + u32 j = 0; + + #pragma unroll 52 + for (i = 0; i < 255; i += 5) + { + j += rc4_key->S[i + 0]; j += d0; swap (rc4_key, i + 0, j); + j += rc4_key->S[i + 1]; j += d1; swap (rc4_key, i + 1, j); + j += rc4_key->S[i + 2]; j += d2; swap (rc4_key, i + 2, j); + j += rc4_key->S[i + 3]; j += d3; swap (rc4_key, i + 3, j); + j += rc4_key->S[i + 4]; j += d4; swap (rc4_key, i + 4, j); + } + + j += rc4_key->S[i + 0]; j += d0; swap (rc4_key, i + 0, j); +} + +__device__ static u8 rc4_next_16 (RC4_KEY *rc4_key, u8 i, u8 j, const u32 in[4], u32 out[4]) +{ + for (u32 k = 0; k < 4; k++) + { + u32 xor4 = 0; + + u8 idx; + + i += 1; + j += rc4_key->S[i]; + + swap (rc4_key, i, j); + + idx = rc4_key->S[i] + rc4_key->S[j]; + + xor4 |= rc4_key->S[idx] << 0; + + i += 1; + j += rc4_key->S[i]; + + swap (rc4_key, i, j); + + idx = rc4_key->S[i] + rc4_key->S[j]; + + xor4 |= rc4_key->S[idx] << 8; + + i += 1; + j += rc4_key->S[i]; + + swap (rc4_key, i, j); + + idx = rc4_key->S[i] + rc4_key->S[j]; + + xor4 |= rc4_key->S[idx] << 16; + + i += 1; + j += rc4_key->S[i]; + + swap (rc4_key, i, j); + + idx = rc4_key->S[i] + rc4_key->S[j]; + + xor4 |= rc4_key->S[idx] << 24; + + out[k] = in[k] ^ xor4; + } + + return j; +} + +__device__ __constant__ bf_t c_bfs[1024]; + +__device__ static void m10410m (RC4_KEY rc4_keys[64], u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], const u32 pw_len, const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const u32x * words_buf_r, void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const pdf_t *pdf_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset) +{ + /** + * modifier + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + const u32 lid = threadIdx.x; + + RC4_KEY *rc4_key = &rc4_keys[lid]; + + /** + * loop + */ + + u32x w0l = w0[0]; + + for (u32 il_pos = 0; il_pos < bfs_cnt; il_pos++) + { + const u32 w0r = c_bfs[il_pos].i; + + w0[0] = w0l | w0r; + + // now the RC4 part + + u32x key[4]; + + key[0] = w0[0]; + key[1] = w0[1]; + key[2] = 0; + key[3] = 0; + + rc4_init_16 (rc4_key, key); + + u32x out[4]; + + rc4_next_16 (rc4_key, 0, 0, padding, out); + + const u32x r0 = out[0]; + const u32x r1 = out[1]; + const u32x r2 = out[2]; + const u32x r3 = out[3]; + + #include VECT_COMPARE_M + } +} + +__device__ static void m10410s (RC4_KEY rc4_keys[64], u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], const u32 pw_len, const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const u32x * words_buf_r, void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const pdf_t *pdf_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset) +{ + /** + * modifier + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + const u32 lid = threadIdx.x; + + RC4_KEY *rc4_key = &rc4_keys[lid]; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * loop + */ + + u32x w0l = w0[0]; + + for (u32 il_pos = 0; il_pos < bfs_cnt; il_pos++) + { + const u32 w0r = c_bfs[il_pos].i; + + w0[0] = w0l | w0r; + + // now the RC4 part + + u32x key[4]; + + key[0] = w0[0]; + key[1] = w0[1]; + key[2] = 0; + key[3] = 0; + + rc4_init_16 (rc4_key, key); + + u32x out[4]; + + rc4_next_16 (rc4_key, 0, 0, padding, out); + + const u32x r0 = out[0]; + const u32x r1 = out[1]; + const u32x r2 = out[2]; + const u32x r3 = out[3]; + + #include VECT_COMPARE_S + } +} + +extern "C" __global__ void __launch_bounds__ (64, 1) m10410_m04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const u32x * words_buf_r, void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const pdf_t *pdf_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + __shared__ RC4_KEY rc4_keys[64]; + + m10410m (rc4_keys, w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, pdf_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (64, 1) m10410_m08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const u32x * words_buf_r, void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const pdf_t *pdf_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + __shared__ RC4_KEY rc4_keys[64]; + + m10410m (rc4_keys, w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, pdf_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (64, 1) m10410_m16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const u32x * words_buf_r, void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const pdf_t *pdf_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = pws[gid].i[ 8]; + w2[1] = pws[gid].i[ 9]; + w2[2] = pws[gid].i[10]; + w2[3] = pws[gid].i[11]; + + u32x w3[4]; + + w3[0] = pws[gid].i[12]; + w3[1] = pws[gid].i[13]; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + __shared__ RC4_KEY rc4_keys[64]; + + m10410m (rc4_keys, w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, pdf_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (64, 1) m10410_s04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const u32x * words_buf_r, void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const pdf_t *pdf_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + __shared__ RC4_KEY rc4_keys[64]; + + m10410s (rc4_keys, w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, pdf_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (64, 1) m10410_s08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const u32x * words_buf_r, void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const pdf_t *pdf_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + __shared__ RC4_KEY rc4_keys[64]; + + m10410s (rc4_keys, w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, pdf_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m10410_s16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const u32x * words_buf_r, void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const pdf_t *pdf_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = pws[gid].i[ 8]; + w2[1] = pws[gid].i[ 9]; + w2[2] = pws[gid].i[10]; + w2[3] = pws[gid].i[11]; + + u32x w3[4]; + + w3[0] = pws[gid].i[12]; + w3[1] = pws[gid].i[13]; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + __shared__ RC4_KEY rc4_keys[64]; + + m10410s (rc4_keys, w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, pdf_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} diff --git a/nv/m10420_a0.cu b/nv/m10420_a0.cu new file mode 100644 index 0000000000..aa2d33c5df --- /dev/null +++ b/nv/m10420_a0.cu @@ -0,0 +1,536 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _MD5_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW2 +#define VECT_SIZE1 +#endif + +#define DGST_R0 0 +#define DGST_R1 1 +#define DGST_R2 2 +#define DGST_R3 3 + +#include "include/kernel_functions.c" +#include "types_nv.c" +#include "common_nv.c" +#include "include/rp_gpu.h" +#include "rp_nv.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +__device__ __constant__ u32 padding[8] = +{ + 0x5e4ebf28, + 0x418a754e, + 0x564e0064, + 0x0801faff, + 0xb6002e2e, + 0x803e68d0, + 0xfea90c2f, + 0x7a695364 +}; + +__device__ static void md5_transform (const u32x w0[4], const u32x w1[4], const u32x w2[4], const u32x w3[4], u32x digest[4]) +{ + u32x a = digest[0]; + u32x b = digest[1]; + u32x c = digest[2]; + u32x d = digest[3]; + + u32x w0_t = w0[0]; + u32x w1_t = w0[1]; + u32x w2_t = w0[2]; + u32x w3_t = w0[3]; + u32x w4_t = w1[0]; + u32x w5_t = w1[1]; + u32x w6_t = w1[2]; + u32x w7_t = w1[3]; + u32x w8_t = w2[0]; + u32x w9_t = w2[1]; + u32x wa_t = w2[2]; + u32x wb_t = w2[3]; + u32x wc_t = w3[0]; + u32x wd_t = w3[1]; + u32x we_t = w3[2]; + u32x wf_t = w3[3]; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t, MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t, MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t, MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t, MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w4_t, MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w5_t, MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w6_t, MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w7_t, MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w8_t, MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w9_t, MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, wa_t, MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, wb_t, MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, wc_t, MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, wd_t, MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, we_t, MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, wf_t, MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w1_t, MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w6_t, MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, wb_t, MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t, MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w5_t, MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, wa_t, MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, wf_t, MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w4_t, MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w9_t, MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, we_t, MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t, MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w8_t, MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, wd_t, MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t, MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w7_t, MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, wc_t, MD5C1f, MD5S13); + + MD5_STEP (MD5_H , a, b, c, d, w5_t, MD5C20, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w8_t, MD5C21, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, wb_t, MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, we_t, MD5C23, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w1_t, MD5C24, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w4_t, MD5C25, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w7_t, MD5C26, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, wa_t, MD5C27, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, wd_t, MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w0_t, MD5C29, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w3_t, MD5C2a, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w6_t, MD5C2b, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w9_t, MD5C2c, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, wc_t, MD5C2d, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, wf_t, MD5C2e, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w2_t, MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t, MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w7_t, MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, we_t, MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w5_t, MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, wc_t, MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t, MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, wa_t, MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t, MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w8_t, MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, wf_t, MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w6_t, MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, wd_t, MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w4_t, MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, wb_t, MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t, MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w9_t, MD5C3f, MD5S33); + + digest[0] += a; + digest[1] += b; + digest[2] += c; + digest[3] += d; +} + +__device__ __constant__ gpu_rule_t c_rules[1024]; + +extern "C" __global__ void __launch_bounds__ (256, 1) m10420_m04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const pdf_t *pdf_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + u32x pw_buf1[4]; + + pw_buf1[0] = pws[gid].i[ 4]; + pw_buf1[1] = pws[gid].i[ 5]; + pw_buf1[2] = pws[gid].i[ 6]; + pw_buf1[3] = pws[gid].i[ 7]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * U_buf + */ + + u32 o_buf[8]; + + o_buf[0] = pdf_bufs[salt_pos].o_buf[0]; + o_buf[1] = pdf_bufs[salt_pos].o_buf[1]; + o_buf[2] = pdf_bufs[salt_pos].o_buf[2]; + o_buf[3] = pdf_bufs[salt_pos].o_buf[3]; + o_buf[4] = pdf_bufs[salt_pos].o_buf[4]; + o_buf[5] = pdf_bufs[salt_pos].o_buf[5]; + o_buf[6] = pdf_bufs[salt_pos].o_buf[6]; + o_buf[7] = pdf_bufs[salt_pos].o_buf[7]; + + u32 P = pdf_bufs[salt_pos].P; + + u32 id_buf[4]; + + id_buf[0] = pdf_bufs[salt_pos].id_buf[0]; + id_buf[1] = pdf_bufs[salt_pos].id_buf[1]; + id_buf[2] = pdf_bufs[salt_pos].id_buf[2]; + id_buf[3] = pdf_bufs[salt_pos].id_buf[3]; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + + w0[0] = pw_buf0[0]; + w0[1] = pw_buf0[1]; + w0[2] = pw_buf0[2]; + w0[3] = pw_buf0[3]; + + u32x w1[4]; + + w1[0] = pw_buf1[0]; + w1[1] = pw_buf1[1]; + w1[2] = pw_buf1[2]; + w1[3] = pw_buf1[3]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 out_len = apply_rules (c_rules[il_pos].cmds, w0, w1, pw_len); + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + // max length supported by pdf11 is 32 + + w0_t[0] = padding[0]; + w0_t[1] = padding[1]; + w0_t[2] = padding[2]; + w0_t[3] = padding[3]; + w1_t[0] = padding[4]; + w1_t[1] = padding[5]; + w1_t[2] = padding[6]; + w1_t[3] = padding[7]; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = 0; + + switch_buffer_by_offset (w0_t, w1_t, w2_t, w3_t, pw_len); + + // add password + // truncate at 32 is wanted, not a bug! + // add o_buf + + w0_t[0] |= w0[0]; + w0_t[1] |= w0[1]; + w0_t[2] |= w0[2]; + w0_t[3] |= w0[3]; + w1_t[0] |= w1[0]; + w1_t[1] |= w1[1]; + w1_t[2] |= w1[2]; + w1_t[3] |= w1[3]; + w2_t[0] = o_buf[0]; + w2_t[1] = o_buf[1]; + w2_t[2] = o_buf[2]; + w2_t[3] = o_buf[3]; + w3_t[0] = o_buf[4]; + w3_t[1] = o_buf[5]; + w3_t[2] = o_buf[6]; + w3_t[3] = o_buf[7]; + + u32x digest[4]; + + digest[0] = MD5M_A; + digest[1] = MD5M_B; + digest[2] = MD5M_C; + digest[3] = MD5M_D; + + md5_transform (w0_t, w1_t, w2_t, w3_t, digest); + + w0_t[0] = P; + w0_t[1] = id_buf[0]; + w0_t[2] = id_buf[1]; + w0_t[3] = id_buf[2]; + w1_t[0] = id_buf[3]; + w1_t[1] = 0x80; + w1_t[2] = 0; + w1_t[3] = 0; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 84 * 8; + w3_t[3] = 0; + + md5_transform (w0_t, w1_t, w2_t, w3_t, digest); + + u32x a = digest[0]; + u32x b = digest[1] & 0xff; + + const u32x r0 = a; + const u32x r1 = b; + const u32x r2 = 0; + const u32x r3 = 0; + + #include VECT_COMPARE_M + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m10420_m08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const pdf_t *pdf_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m10420_m16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const pdf_t *pdf_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m10420_s04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const pdf_t *pdf_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + u32x pw_buf1[4]; + + pw_buf1[0] = pws[gid].i[ 4]; + pw_buf1[1] = pws[gid].i[ 5]; + pw_buf1[2] = pws[gid].i[ 6]; + pw_buf1[3] = pws[gid].i[ 7]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * U_buf + */ + + u32 o_buf[8]; + + o_buf[0] = pdf_bufs[salt_pos].o_buf[0]; + o_buf[1] = pdf_bufs[salt_pos].o_buf[1]; + o_buf[2] = pdf_bufs[salt_pos].o_buf[2]; + o_buf[3] = pdf_bufs[salt_pos].o_buf[3]; + o_buf[4] = pdf_bufs[salt_pos].o_buf[4]; + o_buf[5] = pdf_bufs[salt_pos].o_buf[5]; + o_buf[6] = pdf_bufs[salt_pos].o_buf[6]; + o_buf[7] = pdf_bufs[salt_pos].o_buf[7]; + + u32 P = pdf_bufs[salt_pos].P; + + u32 id_buf[4]; + + id_buf[0] = pdf_bufs[salt_pos].id_buf[0]; + id_buf[1] = pdf_bufs[salt_pos].id_buf[1]; + id_buf[2] = pdf_bufs[salt_pos].id_buf[2]; + id_buf[3] = pdf_bufs[salt_pos].id_buf[3]; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + + w0[0] = pw_buf0[0]; + w0[1] = pw_buf0[1]; + w0[2] = pw_buf0[2]; + w0[3] = pw_buf0[3]; + + u32x w1[4]; + + w1[0] = pw_buf1[0]; + w1[1] = pw_buf1[1]; + w1[2] = pw_buf1[2]; + w1[3] = pw_buf1[3]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 out_len = apply_rules (c_rules[il_pos].cmds, w0, w1, pw_len); + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + // max length supported by pdf11 is 32 + + w0_t[0] = padding[0]; + w0_t[1] = padding[1]; + w0_t[2] = padding[2]; + w0_t[3] = padding[3]; + w1_t[0] = padding[4]; + w1_t[1] = padding[5]; + w1_t[2] = padding[6]; + w1_t[3] = padding[7]; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = 0; + + switch_buffer_by_offset (w0_t, w1_t, w2_t, w3_t, pw_len); + + // add password + // truncate at 32 is wanted, not a bug! + // add o_buf + + w0_t[0] |= w0[0]; + w0_t[1] |= w0[1]; + w0_t[2] |= w0[2]; + w0_t[3] |= w0[3]; + w1_t[0] |= w1[0]; + w1_t[1] |= w1[1]; + w1_t[2] |= w1[2]; + w1_t[3] |= w1[3]; + w2_t[0] = o_buf[0]; + w2_t[1] = o_buf[1]; + w2_t[2] = o_buf[2]; + w2_t[3] = o_buf[3]; + w3_t[0] = o_buf[4]; + w3_t[1] = o_buf[5]; + w3_t[2] = o_buf[6]; + w3_t[3] = o_buf[7]; + + u32x digest[4]; + + digest[0] = MD5M_A; + digest[1] = MD5M_B; + digest[2] = MD5M_C; + digest[3] = MD5M_D; + + md5_transform (w0_t, w1_t, w2_t, w3_t, digest); + + w0_t[0] = P; + w0_t[1] = id_buf[0]; + w0_t[2] = id_buf[1]; + w0_t[3] = id_buf[2]; + w1_t[0] = id_buf[3]; + w1_t[1] = 0x80; + w1_t[2] = 0; + w1_t[3] = 0; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 84 * 8; + w3_t[3] = 0; + + md5_transform (w0_t, w1_t, w2_t, w3_t, digest); + + u32x a = digest[0]; + u32x b = digest[1] & 0xff; + + const u32x r0 = a; + const u32x r1 = b; + const u32x r2 = 0; + const u32x r3 = 0; + + #include VECT_COMPARE_S + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m10420_s08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const pdf_t *pdf_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m10420_s16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const pdf_t *pdf_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/nv/m10420_a1.cu b/nv/m10420_a1.cu new file mode 100644 index 0000000000..0fcae66eb7 --- /dev/null +++ b/nv/m10420_a1.cu @@ -0,0 +1,646 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _MD5_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW2 +#define VECT_SIZE2 +#endif + +#define DGST_R0 0 +#define DGST_R1 1 +#define DGST_R2 2 +#define DGST_R3 3 + +#include "include/kernel_functions.c" +#include "types_nv.c" +#include "common_nv.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +__device__ __constant__ u32 padding[8] = +{ + 0x5e4ebf28, + 0x418a754e, + 0x564e0064, + 0x0801faff, + 0xb6002e2e, + 0x803e68d0, + 0xfea90c2f, + 0x7a695364 +}; + +__device__ static void md5_transform (const u32x w0[4], const u32x w1[4], const u32x w2[4], const u32x w3[4], u32x digest[4]) +{ + u32x a = digest[0]; + u32x b = digest[1]; + u32x c = digest[2]; + u32x d = digest[3]; + + u32x w0_t = w0[0]; + u32x w1_t = w0[1]; + u32x w2_t = w0[2]; + u32x w3_t = w0[3]; + u32x w4_t = w1[0]; + u32x w5_t = w1[1]; + u32x w6_t = w1[2]; + u32x w7_t = w1[3]; + u32x w8_t = w2[0]; + u32x w9_t = w2[1]; + u32x wa_t = w2[2]; + u32x wb_t = w2[3]; + u32x wc_t = w3[0]; + u32x wd_t = w3[1]; + u32x we_t = w3[2]; + u32x wf_t = w3[3]; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t, MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t, MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t, MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t, MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w4_t, MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w5_t, MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w6_t, MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w7_t, MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w8_t, MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w9_t, MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, wa_t, MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, wb_t, MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, wc_t, MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, wd_t, MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, we_t, MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, wf_t, MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w1_t, MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w6_t, MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, wb_t, MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t, MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w5_t, MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, wa_t, MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, wf_t, MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w4_t, MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w9_t, MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, we_t, MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t, MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w8_t, MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, wd_t, MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t, MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w7_t, MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, wc_t, MD5C1f, MD5S13); + + MD5_STEP (MD5_H , a, b, c, d, w5_t, MD5C20, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w8_t, MD5C21, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, wb_t, MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, we_t, MD5C23, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w1_t, MD5C24, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w4_t, MD5C25, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w7_t, MD5C26, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, wa_t, MD5C27, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, wd_t, MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w0_t, MD5C29, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w3_t, MD5C2a, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w6_t, MD5C2b, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w9_t, MD5C2c, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, wc_t, MD5C2d, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, wf_t, MD5C2e, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w2_t, MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t, MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w7_t, MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, we_t, MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w5_t, MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, wc_t, MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t, MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, wa_t, MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t, MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w8_t, MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, wf_t, MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w6_t, MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, wd_t, MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w4_t, MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, wb_t, MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t, MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w9_t, MD5C3f, MD5S33); + + digest[0] += a; + digest[1] += b; + digest[2] += c; + digest[3] += d; +} + +__device__ __constant__ comb_t c_combs[1024]; + +extern "C" __global__ void __launch_bounds__ (256, 1) m10420_m04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const pdf_t *pdf_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + append_0x80_2 (wordl0, wordl1, pw_l_len); + + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, c_combs[0].pw_len); + } + + /** + * U_buf + */ + + u32 o_buf[8]; + + o_buf[0] = pdf_bufs[salt_pos].o_buf[0]; + o_buf[1] = pdf_bufs[salt_pos].o_buf[1]; + o_buf[2] = pdf_bufs[salt_pos].o_buf[2]; + o_buf[3] = pdf_bufs[salt_pos].o_buf[3]; + o_buf[4] = pdf_bufs[salt_pos].o_buf[4]; + o_buf[5] = pdf_bufs[salt_pos].o_buf[5]; + o_buf[6] = pdf_bufs[salt_pos].o_buf[6]; + o_buf[7] = pdf_bufs[salt_pos].o_buf[7]; + + u32 P = pdf_bufs[salt_pos].P; + + u32 id_buf[4]; + + id_buf[0] = pdf_bufs[salt_pos].id_buf[0]; + id_buf[1] = pdf_bufs[salt_pos].id_buf[1]; + id_buf[2] = pdf_bufs[salt_pos].id_buf[2]; + id_buf[3] = pdf_bufs[salt_pos].id_buf[3]; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = c_combs[il_pos].pw_len; + + const u32 pw_len = pw_l_len + pw_r_len; + + u32 wordr0[4]; + + wordr0[0] = c_combs[il_pos].i[0]; + wordr0[1] = c_combs[il_pos].i[1]; + wordr0[2] = c_combs[il_pos].i[2]; + wordr0[3] = c_combs[il_pos].i[3]; + + u32 wordr1[4]; + + wordr1[0] = c_combs[il_pos].i[4]; + wordr1[1] = c_combs[il_pos].i[5]; + wordr1[2] = c_combs[il_pos].i[6]; + wordr1[3] = c_combs[il_pos].i[7]; + + u32 wordr2[4]; + + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + + u32 wordr3[4]; + + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + u32x w0[4]; + + w0[0] = wordl0[0] | wordr0[0]; + w0[1] = wordl0[1] | wordr0[1]; + w0[2] = wordl0[2] | wordr0[2]; + w0[3] = wordl0[3] | wordr0[3]; + + u32x w1[4]; + + w1[0] = wordl1[0] | wordr1[0]; + w1[1] = wordl1[1] | wordr1[1]; + w1[2] = wordl1[2] | wordr1[2]; + w1[3] = wordl1[3] | wordr1[3]; + + u32x w2[4]; + + w2[0] = wordl2[0] | wordr2[0]; + w2[1] = wordl2[1] | wordr2[1]; + w2[2] = wordl2[2] | wordr2[2]; + w2[3] = wordl2[3] | wordr2[3]; + + u32x w3[4]; + + w3[0] = wordl3[0] | wordr3[0]; + w3[1] = wordl3[1] | wordr3[1]; + w3[2] = wordl3[2] | wordr3[2]; + w3[3] = wordl3[3] | wordr3[3]; + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + // max length supported by pdf11 is 32 + + w0_t[0] = padding[0]; + w0_t[1] = padding[1]; + w0_t[2] = padding[2]; + w0_t[3] = padding[3]; + w1_t[0] = padding[4]; + w1_t[1] = padding[5]; + w1_t[2] = padding[6]; + w1_t[3] = padding[7]; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = 0; + + switch_buffer_by_offset (w0_t, w1_t, w2_t, w3_t, pw_len); + + // add password + // truncate at 32 is wanted, not a bug! + // add o_buf + + w0_t[0] |= w0[0]; + w0_t[1] |= w0[1]; + w0_t[2] |= w0[2]; + w0_t[3] |= w0[3]; + w1_t[0] |= w1[0]; + w1_t[1] |= w1[1]; + w1_t[2] |= w1[2]; + w1_t[3] |= w1[3]; + w2_t[0] = o_buf[0]; + w2_t[1] = o_buf[1]; + w2_t[2] = o_buf[2]; + w2_t[3] = o_buf[3]; + w3_t[0] = o_buf[4]; + w3_t[1] = o_buf[5]; + w3_t[2] = o_buf[6]; + w3_t[3] = o_buf[7]; + + u32x digest[4]; + + digest[0] = MD5M_A; + digest[1] = MD5M_B; + digest[2] = MD5M_C; + digest[3] = MD5M_D; + + md5_transform (w0_t, w1_t, w2_t, w3_t, digest); + + w0_t[0] = P; + w0_t[1] = id_buf[0]; + w0_t[2] = id_buf[1]; + w0_t[3] = id_buf[2]; + w1_t[0] = id_buf[3]; + w1_t[1] = 0x80; + w1_t[2] = 0; + w1_t[3] = 0; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 84 * 8; + w3_t[3] = 0; + + md5_transform (w0_t, w1_t, w2_t, w3_t, digest); + + u32x a = digest[0]; + u32x b = digest[1] & 0xff; + + const u32x r0 = a; + const u32x r1 = b; + const u32x r2 = 0; + const u32x r3 = 0; + + #include VECT_COMPARE_M + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m10420_m08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const pdf_t *pdf_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m10420_m16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const pdf_t *pdf_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m10420_s04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const pdf_t *pdf_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + append_0x80_2 (wordl0, wordl1, pw_l_len); + + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, c_combs[0].pw_len); + } + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * U_buf + */ + + u32 o_buf[8]; + + o_buf[0] = pdf_bufs[salt_pos].o_buf[0]; + o_buf[1] = pdf_bufs[salt_pos].o_buf[1]; + o_buf[2] = pdf_bufs[salt_pos].o_buf[2]; + o_buf[3] = pdf_bufs[salt_pos].o_buf[3]; + o_buf[4] = pdf_bufs[salt_pos].o_buf[4]; + o_buf[5] = pdf_bufs[salt_pos].o_buf[5]; + o_buf[6] = pdf_bufs[salt_pos].o_buf[6]; + o_buf[7] = pdf_bufs[salt_pos].o_buf[7]; + + u32 P = pdf_bufs[salt_pos].P; + + u32 id_buf[4]; + + id_buf[0] = pdf_bufs[salt_pos].id_buf[0]; + id_buf[1] = pdf_bufs[salt_pos].id_buf[1]; + id_buf[2] = pdf_bufs[salt_pos].id_buf[2]; + id_buf[3] = pdf_bufs[salt_pos].id_buf[3]; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = c_combs[il_pos].pw_len; + + const u32 pw_len = pw_l_len + pw_r_len; + + u32 wordr0[4]; + + wordr0[0] = c_combs[il_pos].i[0]; + wordr0[1] = c_combs[il_pos].i[1]; + wordr0[2] = c_combs[il_pos].i[2]; + wordr0[3] = c_combs[il_pos].i[3]; + + u32 wordr1[4]; + + wordr1[0] = c_combs[il_pos].i[4]; + wordr1[1] = c_combs[il_pos].i[5]; + wordr1[2] = c_combs[il_pos].i[6]; + wordr1[3] = c_combs[il_pos].i[7]; + + u32 wordr2[4]; + + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + + u32 wordr3[4]; + + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + u32x w0[4]; + + w0[0] = wordl0[0] | wordr0[0]; + w0[1] = wordl0[1] | wordr0[1]; + w0[2] = wordl0[2] | wordr0[2]; + w0[3] = wordl0[3] | wordr0[3]; + + u32x w1[4]; + + w1[0] = wordl1[0] | wordr1[0]; + w1[1] = wordl1[1] | wordr1[1]; + w1[2] = wordl1[2] | wordr1[2]; + w1[3] = wordl1[3] | wordr1[3]; + + u32x w2[4]; + + w2[0] = wordl2[0] | wordr2[0]; + w2[1] = wordl2[1] | wordr2[1]; + w2[2] = wordl2[2] | wordr2[2]; + w2[3] = wordl2[3] | wordr2[3]; + + u32x w3[4]; + + w3[0] = wordl3[0] | wordr3[0]; + w3[1] = wordl3[1] | wordr3[1]; + w3[2] = wordl3[2] | wordr3[2]; + w3[3] = wordl3[3] | wordr3[3]; + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + // max length supported by pdf11 is 32 + + w0_t[0] = padding[0]; + w0_t[1] = padding[1]; + w0_t[2] = padding[2]; + w0_t[3] = padding[3]; + w1_t[0] = padding[4]; + w1_t[1] = padding[5]; + w1_t[2] = padding[6]; + w1_t[3] = padding[7]; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = 0; + + switch_buffer_by_offset (w0_t, w1_t, w2_t, w3_t, pw_len); + + // add password + // truncate at 32 is wanted, not a bug! + // add o_buf + + w0_t[0] |= w0[0]; + w0_t[1] |= w0[1]; + w0_t[2] |= w0[2]; + w0_t[3] |= w0[3]; + w1_t[0] |= w1[0]; + w1_t[1] |= w1[1]; + w1_t[2] |= w1[2]; + w1_t[3] |= w1[3]; + w2_t[0] = o_buf[0]; + w2_t[1] = o_buf[1]; + w2_t[2] = o_buf[2]; + w2_t[3] = o_buf[3]; + w3_t[0] = o_buf[4]; + w3_t[1] = o_buf[5]; + w3_t[2] = o_buf[6]; + w3_t[3] = o_buf[7]; + + u32x digest[4]; + + digest[0] = MD5M_A; + digest[1] = MD5M_B; + digest[2] = MD5M_C; + digest[3] = MD5M_D; + + md5_transform (w0_t, w1_t, w2_t, w3_t, digest); + + w0_t[0] = P; + w0_t[1] = id_buf[0]; + w0_t[2] = id_buf[1]; + w0_t[3] = id_buf[2]; + w1_t[0] = id_buf[3]; + w1_t[1] = 0x80; + w1_t[2] = 0; + w1_t[3] = 0; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 84 * 8; + w3_t[3] = 0; + + md5_transform (w0_t, w1_t, w2_t, w3_t, digest); + + u32x a = digest[0]; + u32x b = digest[1] & 0xff; + + const u32x r0 = a; + const u32x r1 = b; + const u32x r2 = 0; + const u32x r3 = 0; + + #include VECT_COMPARE_S + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m10420_s08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const pdf_t *pdf_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m10420_s16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const pdf_t *pdf_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/nv/m10420_a3.cu b/nv/m10420_a3.cu new file mode 100644 index 0000000000..afd817993c --- /dev/null +++ b/nv/m10420_a3.cu @@ -0,0 +1,711 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _MD5_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW2 +#define VECT_SIZE2 +#endif + +#define DGST_R0 0 +#define DGST_R1 1 +#define DGST_R2 2 +#define DGST_R3 3 + +#include "include/kernel_functions.c" +#include "types_nv.c" +#include "common_nv.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +__device__ __constant__ u32 padding[8] = +{ + 0x5e4ebf28, + 0x418a754e, + 0x564e0064, + 0x0801faff, + 0xb6002e2e, + 0x803e68d0, + 0xfea90c2f, + 0x7a695364 +}; + +__device__ static void md5_transform (const u32x w0[4], const u32x w1[4], const u32x w2[4], const u32x w3[4], u32x digest[4]) +{ + u32x a = digest[0]; + u32x b = digest[1]; + u32x c = digest[2]; + u32x d = digest[3]; + + u32x w0_t = w0[0]; + u32x w1_t = w0[1]; + u32x w2_t = w0[2]; + u32x w3_t = w0[3]; + u32x w4_t = w1[0]; + u32x w5_t = w1[1]; + u32x w6_t = w1[2]; + u32x w7_t = w1[3]; + u32x w8_t = w2[0]; + u32x w9_t = w2[1]; + u32x wa_t = w2[2]; + u32x wb_t = w2[3]; + u32x wc_t = w3[0]; + u32x wd_t = w3[1]; + u32x we_t = w3[2]; + u32x wf_t = w3[3]; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t, MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t, MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t, MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t, MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w4_t, MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w5_t, MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w6_t, MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w7_t, MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w8_t, MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w9_t, MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, wa_t, MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, wb_t, MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, wc_t, MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, wd_t, MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, we_t, MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, wf_t, MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w1_t, MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w6_t, MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, wb_t, MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t, MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w5_t, MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, wa_t, MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, wf_t, MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w4_t, MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w9_t, MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, we_t, MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t, MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w8_t, MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, wd_t, MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t, MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w7_t, MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, wc_t, MD5C1f, MD5S13); + + MD5_STEP (MD5_H , a, b, c, d, w5_t, MD5C20, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w8_t, MD5C21, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, wb_t, MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, we_t, MD5C23, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w1_t, MD5C24, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w4_t, MD5C25, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w7_t, MD5C26, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, wa_t, MD5C27, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, wd_t, MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w0_t, MD5C29, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w3_t, MD5C2a, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w6_t, MD5C2b, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w9_t, MD5C2c, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, wc_t, MD5C2d, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, wf_t, MD5C2e, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w2_t, MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t, MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w7_t, MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, we_t, MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w5_t, MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, wc_t, MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t, MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, wa_t, MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t, MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w8_t, MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, wf_t, MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w6_t, MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, wd_t, MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w4_t, MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, wb_t, MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t, MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w9_t, MD5C3f, MD5S33); + + digest[0] += a; + digest[1] += b; + digest[2] += c; + digest[3] += d; +} + +__device__ __constant__ bf_t c_bfs[1024]; + +__device__ static void m10420m (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], const u32 pw_len, const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const u32x * words_buf_r, void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const pdf_t *pdf_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset) +{ + /** + * modifier + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + const u32 lid = threadIdx.x; + + /** + * U_buf + */ + + u32 o_buf[8]; + + o_buf[0] = pdf_bufs[salt_pos].o_buf[0]; + o_buf[1] = pdf_bufs[salt_pos].o_buf[1]; + o_buf[2] = pdf_bufs[salt_pos].o_buf[2]; + o_buf[3] = pdf_bufs[salt_pos].o_buf[3]; + o_buf[4] = pdf_bufs[salt_pos].o_buf[4]; + o_buf[5] = pdf_bufs[salt_pos].o_buf[5]; + o_buf[6] = pdf_bufs[salt_pos].o_buf[6]; + o_buf[7] = pdf_bufs[salt_pos].o_buf[7]; + + u32 P = pdf_bufs[salt_pos].P; + + u32 id_buf[4]; + + id_buf[0] = pdf_bufs[salt_pos].id_buf[0]; + id_buf[1] = pdf_bufs[salt_pos].id_buf[1]; + id_buf[2] = pdf_bufs[salt_pos].id_buf[2]; + id_buf[3] = pdf_bufs[salt_pos].id_buf[3]; + + /** + * loop + */ + + u32x w0l = w0[0]; + + for (u32 il_pos = 0; il_pos < bfs_cnt; il_pos++) + { + const u32 w0r = c_bfs[il_pos].i; + + w0[0] = w0l | w0r; + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + // max length supported by pdf11 is 32 + + w0_t[0] = padding[0]; + w0_t[1] = padding[1]; + w0_t[2] = padding[2]; + w0_t[3] = padding[3]; + w1_t[0] = padding[4]; + w1_t[1] = padding[5]; + w1_t[2] = padding[6]; + w1_t[3] = padding[7]; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = 0; + + switch_buffer_by_offset (w0_t, w1_t, w2_t, w3_t, pw_len); + + // add password + // truncate at 32 is wanted, not a bug! + // add o_buf + + w0_t[0] |= w0[0]; + w0_t[1] |= w0[1]; + w0_t[2] |= w0[2]; + w0_t[3] |= w0[3]; + w1_t[0] |= w1[0]; + w1_t[1] |= w1[1]; + w1_t[2] |= w1[2]; + w1_t[3] |= w1[3]; + w2_t[0] = o_buf[0]; + w2_t[1] = o_buf[1]; + w2_t[2] = o_buf[2]; + w2_t[3] = o_buf[3]; + w3_t[0] = o_buf[4]; + w3_t[1] = o_buf[5]; + w3_t[2] = o_buf[6]; + w3_t[3] = o_buf[7]; + + u32x digest[4]; + + digest[0] = MD5M_A; + digest[1] = MD5M_B; + digest[2] = MD5M_C; + digest[3] = MD5M_D; + + md5_transform (w0_t, w1_t, w2_t, w3_t, digest); + + w0_t[0] = P; + w0_t[1] = id_buf[0]; + w0_t[2] = id_buf[1]; + w0_t[3] = id_buf[2]; + w1_t[0] = id_buf[3]; + w1_t[1] = 0x80; + w1_t[2] = 0; + w1_t[3] = 0; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 84 * 8; + w3_t[3] = 0; + + md5_transform (w0_t, w1_t, w2_t, w3_t, digest); + + u32x a = digest[0]; + u32x b = digest[1] & 0xff; + + const u32x r0 = a; + const u32x r1 = b; + const u32x r2 = 0; + const u32x r3 = 0; + + #include VECT_COMPARE_M + } +} + +__device__ static void m10420s (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], const u32 pw_len, const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const u32x * words_buf_r, void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const pdf_t *pdf_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset) +{ + /** + * modifier + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + const u32 lid = threadIdx.x; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * U_buf + */ + + u32 o_buf[8]; + + o_buf[0] = pdf_bufs[salt_pos].o_buf[0]; + o_buf[1] = pdf_bufs[salt_pos].o_buf[1]; + o_buf[2] = pdf_bufs[salt_pos].o_buf[2]; + o_buf[3] = pdf_bufs[salt_pos].o_buf[3]; + o_buf[4] = pdf_bufs[salt_pos].o_buf[4]; + o_buf[5] = pdf_bufs[salt_pos].o_buf[5]; + o_buf[6] = pdf_bufs[salt_pos].o_buf[6]; + o_buf[7] = pdf_bufs[salt_pos].o_buf[7]; + + u32 P = pdf_bufs[salt_pos].P; + + u32 id_buf[4]; + + id_buf[0] = pdf_bufs[salt_pos].id_buf[0]; + id_buf[1] = pdf_bufs[salt_pos].id_buf[1]; + id_buf[2] = pdf_bufs[salt_pos].id_buf[2]; + id_buf[3] = pdf_bufs[salt_pos].id_buf[3]; + + /** + * loop + */ + + u32x w0l = w0[0]; + + for (u32 il_pos = 0; il_pos < bfs_cnt; il_pos++) + { + const u32 w0r = c_bfs[il_pos].i; + + w0[0] = w0l | w0r; + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + // max length supported by pdf11 is 32 + + w0_t[0] = padding[0]; + w0_t[1] = padding[1]; + w0_t[2] = padding[2]; + w0_t[3] = padding[3]; + w1_t[0] = padding[4]; + w1_t[1] = padding[5]; + w1_t[2] = padding[6]; + w1_t[3] = padding[7]; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = 0; + + switch_buffer_by_offset (w0_t, w1_t, w2_t, w3_t, pw_len); + + // add password + // truncate at 32 is wanted, not a bug! + // add o_buf + + w0_t[0] |= w0[0]; + w0_t[1] |= w0[1]; + w0_t[2] |= w0[2]; + w0_t[3] |= w0[3]; + w1_t[0] |= w1[0]; + w1_t[1] |= w1[1]; + w1_t[2] |= w1[2]; + w1_t[3] |= w1[3]; + w2_t[0] = o_buf[0]; + w2_t[1] = o_buf[1]; + w2_t[2] = o_buf[2]; + w2_t[3] = o_buf[3]; + w3_t[0] = o_buf[4]; + w3_t[1] = o_buf[5]; + w3_t[2] = o_buf[6]; + w3_t[3] = o_buf[7]; + + u32x digest[4]; + + digest[0] = MD5M_A; + digest[1] = MD5M_B; + digest[2] = MD5M_C; + digest[3] = MD5M_D; + + md5_transform (w0_t, w1_t, w2_t, w3_t, digest); + + w0_t[0] = P; + w0_t[1] = id_buf[0]; + w0_t[2] = id_buf[1]; + w0_t[3] = id_buf[2]; + w1_t[0] = id_buf[3]; + w1_t[1] = 0x80; + w1_t[2] = 0; + w1_t[3] = 0; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 84 * 8; + w3_t[3] = 0; + + md5_transform (w0_t, w1_t, w2_t, w3_t, digest); + + u32x a = digest[0]; + u32x b = digest[1] & 0xff; + + const u32x r0 = a; + const u32x r1 = b; + const u32x r2 = 0; + const u32x r3 = 0; + + #include VECT_COMPARE_S + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m10420_m04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const u32x * words_buf_r, void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const pdf_t *pdf_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m10420m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, pdf_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m10420_m08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const u32x * words_buf_r, void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const pdf_t *pdf_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m10420m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, pdf_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m10420_m16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const u32x * words_buf_r, void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const pdf_t *pdf_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = pws[gid].i[ 8]; + w2[1] = pws[gid].i[ 9]; + w2[2] = pws[gid].i[10]; + w2[3] = pws[gid].i[11]; + + u32x w3[4]; + + w3[0] = pws[gid].i[12]; + w3[1] = pws[gid].i[13]; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m10420m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, pdf_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m10420_s04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const u32x * words_buf_r, void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const pdf_t *pdf_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m10420s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, pdf_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m10420_s08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const u32x * words_buf_r, void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const pdf_t *pdf_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m10420s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, pdf_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m10420_s16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const u32x * words_buf_r, void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const pdf_t *pdf_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = pws[gid].i[ 8]; + w2[1] = pws[gid].i[ 9]; + w2[2] = pws[gid].i[10]; + w2[3] = pws[gid].i[11]; + + u32x w3[4]; + + w3[0] = pws[gid].i[12]; + w3[1] = pws[gid].i[13]; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m10420s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, pdf_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} diff --git a/nv/m10500.cu b/nv/m10500.cu new file mode 100644 index 0000000000..c7453dda38 --- /dev/null +++ b/nv/m10500.cu @@ -0,0 +1,574 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _MD5_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW2 +#define VECT_SIZE1 +#endif + +#define DGST_R0 0 +#define DGST_R1 1 +#define DGST_R2 2 +#define DGST_R3 3 + +#include "include/kernel_functions.c" +#include "types_nv.c" +#include "common_nv.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +__device__ __constant__ u32 padding[8] = +{ + 0x5e4ebf28, + 0x418a754e, + 0x564e0064, + 0x0801faff, + 0xb6002e2e, + 0x803e68d0, + 0xfea90c2f, + 0x7a695364 +}; + +typedef struct +{ + u8 S[256]; + + u32 wtf_its_faster; + +} RC4_KEY; + +__device__ static void swap (RC4_KEY *rc4_key, const u8 i, const u8 j) +{ + u8 tmp; + + tmp = rc4_key->S[i]; + rc4_key->S[i] = rc4_key->S[j]; + rc4_key->S[j] = tmp; +} + +__device__ static void rc4_init_16 (RC4_KEY *rc4_key, const u32 data[4]) +{ + u32 v = 0x03020100; + u32 a = 0x04040404; + + u32 *ptr = (u32 *) rc4_key->S; + + #pragma unroll 64 + for (u32 i = 0; i < 64; i++) + { + *ptr++ = v; v += a; + } + + u32 j = 0; + + for (u32 i = 0; i < 16; i++) + { + u32 idx = i * 16; + + u32 v; + + v = data[0]; + + j += rc4_key->S[idx] + (v >> 0); swap (rc4_key, idx, j); idx++; + j += rc4_key->S[idx] + (v >> 8); swap (rc4_key, idx, j); idx++; + j += rc4_key->S[idx] + (v >> 16); swap (rc4_key, idx, j); idx++; + j += rc4_key->S[idx] + (v >> 24); swap (rc4_key, idx, j); idx++; + + v = data[1]; + + j += rc4_key->S[idx] + (v >> 0); swap (rc4_key, idx, j); idx++; + j += rc4_key->S[idx] + (v >> 8); swap (rc4_key, idx, j); idx++; + j += rc4_key->S[idx] + (v >> 16); swap (rc4_key, idx, j); idx++; + j += rc4_key->S[idx] + (v >> 24); swap (rc4_key, idx, j); idx++; + + v = data[2]; + + j += rc4_key->S[idx] + (v >> 0); swap (rc4_key, idx, j); idx++; + j += rc4_key->S[idx] + (v >> 8); swap (rc4_key, idx, j); idx++; + j += rc4_key->S[idx] + (v >> 16); swap (rc4_key, idx, j); idx++; + j += rc4_key->S[idx] + (v >> 24); swap (rc4_key, idx, j); idx++; + + v = data[3]; + + j += rc4_key->S[idx] + (v >> 0); swap (rc4_key, idx, j); idx++; + j += rc4_key->S[idx] + (v >> 8); swap (rc4_key, idx, j); idx++; + j += rc4_key->S[idx] + (v >> 16); swap (rc4_key, idx, j); idx++; + j += rc4_key->S[idx] + (v >> 24); swap (rc4_key, idx, j); idx++; + } +} + +__device__ static u8 rc4_next_16 (RC4_KEY *rc4_key, u8 i, u8 j, const u32 in[4], u32 out[4]) +{ + for (u32 k = 0; k < 4; k++) + { + u32 xor4 = 0; + + u8 idx; + + i += 1; + j += rc4_key->S[i]; + + swap (rc4_key, i, j); + + idx = rc4_key->S[i] + rc4_key->S[j]; + + xor4 |= rc4_key->S[idx] << 0; + + i += 1; + j += rc4_key->S[i]; + + swap (rc4_key, i, j); + + idx = rc4_key->S[i] + rc4_key->S[j]; + + xor4 |= rc4_key->S[idx] << 8; + + i += 1; + j += rc4_key->S[i]; + + swap (rc4_key, i, j); + + idx = rc4_key->S[i] + rc4_key->S[j]; + + xor4 |= rc4_key->S[idx] << 16; + + i += 1; + j += rc4_key->S[i]; + + swap (rc4_key, i, j); + + idx = rc4_key->S[i] + rc4_key->S[j]; + + xor4 |= rc4_key->S[idx] << 24; + + out[k] = in[k] ^ xor4; + } + + return j; +} + +__device__ static void md5_transform (const u32x w0[4], const u32x w1[4], const u32x w2[4], const u32x w3[4], u32x digest[4]) +{ + u32x a = digest[0]; + u32x b = digest[1]; + u32x c = digest[2]; + u32x d = digest[3]; + + u32x w0_t = w0[0]; + u32x w1_t = w0[1]; + u32x w2_t = w0[2]; + u32x w3_t = w0[3]; + u32x w4_t = w1[0]; + u32x w5_t = w1[1]; + u32x w6_t = w1[2]; + u32x w7_t = w1[3]; + u32x w8_t = w2[0]; + u32x w9_t = w2[1]; + u32x wa_t = w2[2]; + u32x wb_t = w2[3]; + u32x wc_t = w3[0]; + u32x wd_t = w3[1]; + u32x we_t = w3[2]; + u32x wf_t = w3[3]; + + u32x tmp2; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t, MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t, MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t, MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t, MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w4_t, MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w5_t, MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w6_t, MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w7_t, MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w8_t, MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w9_t, MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, wa_t, MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, wb_t, MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, wc_t, MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, wd_t, MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, we_t, MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, wf_t, MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w1_t, MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w6_t, MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, wb_t, MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t, MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w5_t, MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, wa_t, MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, wf_t, MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w4_t, MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w9_t, MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, we_t, MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t, MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w8_t, MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, wd_t, MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t, MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w7_t, MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, wc_t, MD5C1f, MD5S13); + + MD5_STEP (MD5_H1, a, b, c, d, w5_t, MD5C20, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w8_t, MD5C21, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, wb_t, MD5C22, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, we_t, MD5C23, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w1_t, MD5C24, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w4_t, MD5C25, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w7_t, MD5C26, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, wa_t, MD5C27, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, wd_t, MD5C28, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w0_t, MD5C29, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w3_t, MD5C2a, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w6_t, MD5C2b, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w9_t, MD5C2c, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, wc_t, MD5C2d, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, wf_t, MD5C2e, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w2_t, MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t, MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w7_t, MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, we_t, MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w5_t, MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, wc_t, MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t, MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, wa_t, MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t, MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w8_t, MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, wf_t, MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w6_t, MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, wd_t, MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w4_t, MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, wb_t, MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t, MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w9_t, MD5C3f, MD5S33); + + digest[0] += a; + digest[1] += b; + digest[2] += c; + digest[3] += d; +} + +extern "C" __global__ void __launch_bounds__ (64, 1) m10500_init (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, pdf14_tmp_t *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const pdf_t *pdf_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = pws[gid].i[ 8]; + w2[1] = pws[gid].i[ 9]; + w2[2] = 0; + w2[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * U_buf + */ + + u32 o_buf[8]; + + o_buf[0] = pdf_bufs[salt_pos].o_buf[0]; + o_buf[1] = pdf_bufs[salt_pos].o_buf[1]; + o_buf[2] = pdf_bufs[salt_pos].o_buf[2]; + o_buf[3] = pdf_bufs[salt_pos].o_buf[3]; + o_buf[4] = pdf_bufs[salt_pos].o_buf[4]; + o_buf[5] = pdf_bufs[salt_pos].o_buf[5]; + o_buf[6] = pdf_bufs[salt_pos].o_buf[6]; + o_buf[7] = pdf_bufs[salt_pos].o_buf[7]; + + u32 P = pdf_bufs[salt_pos].P; + + u32 id_buf[12]; + + id_buf[ 0] = pdf_bufs[salt_pos].id_buf[0]; + id_buf[ 1] = pdf_bufs[salt_pos].id_buf[1]; + id_buf[ 2] = pdf_bufs[salt_pos].id_buf[2]; + id_buf[ 3] = pdf_bufs[salt_pos].id_buf[3]; + + id_buf[ 4] = pdf_bufs[salt_pos].id_buf[4]; + id_buf[ 5] = pdf_bufs[salt_pos].id_buf[5]; + id_buf[ 6] = pdf_bufs[salt_pos].id_buf[6]; + id_buf[ 7] = pdf_bufs[salt_pos].id_buf[7]; + + id_buf[ 8] = 0; + id_buf[ 9] = 0; + id_buf[10] = 0; + id_buf[11] = 0; + + u32 id_len = pdf_bufs[salt_pos].id_len; + u32 id_len4 = id_len / 4; + + u32 rc4data[2]; + + rc4data[0] = pdf_bufs[salt_pos].rc4data[0]; + rc4data[1] = pdf_bufs[salt_pos].rc4data[1]; + + u32 final_length = 68 + id_len; + + u32x w11 = 0x80; + u32x w12 = 0; + + if (pdf_bufs[salt_pos].enc_md != 1) + { + w11 = 0xffffffff; + w12 = 0x80; + + final_length += 4; + } + + id_buf[id_len4 + 0] = w11; + id_buf[id_len4 + 1] = w12; + + /** + * main init + */ + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + // max length supported by pdf11 is 32 + + w0_t[0] = padding[0]; + w0_t[1] = padding[1]; + w0_t[2] = padding[2]; + w0_t[3] = padding[3]; + w1_t[0] = padding[4]; + w1_t[1] = padding[5]; + w1_t[2] = padding[6]; + w1_t[3] = padding[7]; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = 0; + + switch_buffer_by_offset (w0_t, w1_t, w2_t, w3_t, pw_len); + + // add password + // truncate at 32 is wanted, not a bug! + // add o_buf + + w0_t[0] |= w0[0]; + w0_t[1] |= w0[1]; + w0_t[2] |= w0[2]; + w0_t[3] |= w0[3]; + w1_t[0] |= w1[0]; + w1_t[1] |= w1[1]; + w1_t[2] |= w1[2]; + w1_t[3] |= w1[3]; + w2_t[0] = o_buf[0]; + w2_t[1] = o_buf[1]; + w2_t[2] = o_buf[2]; + w2_t[3] = o_buf[3]; + w3_t[0] = o_buf[4]; + w3_t[1] = o_buf[5]; + w3_t[2] = o_buf[6]; + w3_t[3] = o_buf[7]; + + u32x digest[4]; + + digest[0] = MD5M_A; + digest[1] = MD5M_B; + digest[2] = MD5M_C; + digest[3] = MD5M_D; + + md5_transform (w0_t, w1_t, w2_t, w3_t, digest); + + w0_t[0] = P; + w0_t[1] = id_buf[ 0]; + w0_t[2] = id_buf[ 1]; + w0_t[3] = id_buf[ 2]; + w1_t[0] = id_buf[ 3]; + w1_t[1] = id_buf[ 4]; + w1_t[2] = id_buf[ 5]; + w1_t[3] = id_buf[ 6]; + w2_t[0] = id_buf[ 7]; + w2_t[1] = id_buf[ 8]; + w2_t[2] = id_buf[ 9]; + w2_t[3] = id_buf[10]; + w3_t[0] = id_buf[11]; + w3_t[1] = 0; + w3_t[2] = final_length * 8; + w3_t[3] = 0; + + md5_transform (w0_t, w1_t, w2_t, w3_t, digest); + + tmps[gid].digest[0] = digest[0]; + tmps[gid].digest[1] = digest[1]; + tmps[gid].digest[2] = digest[2]; + tmps[gid].digest[3] = digest[3]; + + tmps[gid].out[0] = rc4data[0]; + tmps[gid].out[1] = rc4data[1]; + tmps[gid].out[2] = 0; + tmps[gid].out[3] = 0; +} + +extern "C" __global__ void __launch_bounds__ (64, 1) m10500_loop (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, pdf14_tmp_t *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const pdf_t *pdf_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + const u32 lid = threadIdx.x; + + if (gid >= gid_max) return; + + /** + * shared + */ + + __shared__ RC4_KEY rc4_keys[64]; + + RC4_KEY *rc4_key = &rc4_keys[lid]; + + /** + * loop + */ + + u32x digest[4]; + + digest[0] = tmps[gid].digest[0]; + digest[1] = tmps[gid].digest[1]; + digest[2] = tmps[gid].digest[2]; + digest[3] = tmps[gid].digest[3]; + + u32x out[4]; + + out[0] = tmps[gid].out[0]; + out[1] = tmps[gid].out[1]; + out[2] = tmps[gid].out[2]; + out[3] = tmps[gid].out[3]; + + for (u32 i = 0, j = loop_pos; i < loop_cnt; i++, j++) + { + if (j < 50) + { + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + w0_t[0] = digest[0]; + w0_t[1] = digest[1]; + w0_t[2] = digest[2]; + w0_t[3] = digest[3]; + w1_t[0] = 0x80; + w1_t[1] = 0; + w1_t[2] = 0; + w1_t[3] = 0; + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 16 * 8; + w3_t[3] = 0; + + digest[0] = MD5M_A; + digest[1] = MD5M_B; + digest[2] = MD5M_C; + digest[3] = MD5M_D; + + md5_transform (w0_t, w1_t, w2_t, w3_t, digest); + } + else + { + const u32 x = j - 50; + + const u32 xv = x << 0 + | x << 8 + | x << 16 + | x << 24; + + u32x tmp[4]; + + tmp[0] = digest[0] ^ xv; + tmp[1] = digest[1] ^ xv; + tmp[2] = digest[2] ^ xv; + tmp[3] = digest[3] ^ xv; + + rc4_init_16 (rc4_key, tmp); + + rc4_next_16 (rc4_key, 0, 0, out, out); + } + } + + tmps[gid].digest[0] = digest[0]; + tmps[gid].digest[1] = digest[1]; + tmps[gid].digest[2] = digest[2]; + tmps[gid].digest[3] = digest[3]; + + tmps[gid].out[0] = out[0]; + tmps[gid].out[1] = out[1]; + tmps[gid].out[2] = out[2]; + tmps[gid].out[3] = out[3]; +} + +extern "C" __global__ void __launch_bounds__ (64, 1) m10500_comp (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, pdf14_tmp_t *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const pdf_t *pdf_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + const u32 lid = threadIdx.x; + + /** + * digest + */ + + const u32x r0 = tmps[gid].out[0]; + const u32x r1 = tmps[gid].out[1]; + const u32x r2 = 0; + const u32x r3 = 0; + + #define il_pos 0 + + #include VECT_COMPARE_M +} diff --git a/nv/m10700.cu b/nv/m10700.cu new file mode 100644 index 0000000000..e1a89c63e6 --- /dev/null +++ b/nv/m10700.cu @@ -0,0 +1,1720 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _PDF17L8_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW2 +#define VECT_SIZE1 +#endif + +#define DGST_R0 0 +#define DGST_R1 1 +#define DGST_R2 2 +#define DGST_R3 3 + +#include "include/kernel_functions.c" +#include "types_nv.c" +#include "common_nv.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +typedef struct +{ + union + { + u32 dgst32[16]; + u64 dgst64[8]; + }; + + u32 dgst_len; + + union + { + u32 W32[32]; + u64 W64[16]; + }; + + u32 W_len; + +} ctx_t; + +__device__ __constant__ u32 k_sha256[64] = +{ + SHA256C00, SHA256C01, SHA256C02, SHA256C03, + SHA256C04, SHA256C05, SHA256C06, SHA256C07, + SHA256C08, SHA256C09, SHA256C0a, SHA256C0b, + SHA256C0c, SHA256C0d, SHA256C0e, SHA256C0f, + SHA256C10, SHA256C11, SHA256C12, SHA256C13, + SHA256C14, SHA256C15, SHA256C16, SHA256C17, + SHA256C18, SHA256C19, SHA256C1a, SHA256C1b, + SHA256C1c, SHA256C1d, SHA256C1e, SHA256C1f, + SHA256C20, SHA256C21, SHA256C22, SHA256C23, + SHA256C24, SHA256C25, SHA256C26, SHA256C27, + SHA256C28, SHA256C29, SHA256C2a, SHA256C2b, + SHA256C2c, SHA256C2d, SHA256C2e, SHA256C2f, + SHA256C30, SHA256C31, SHA256C32, SHA256C33, + SHA256C34, SHA256C35, SHA256C36, SHA256C37, + SHA256C38, SHA256C39, SHA256C3a, SHA256C3b, + SHA256C3c, SHA256C3d, SHA256C3e, SHA256C3f, +}; + +__device__ static void sha256_transform (const u32x w0[4], const u32x w1[4], const u32x w2[4], const u32x w3[4], u32x digest[8]) +{ + u32x a = digest[0]; + u32x b = digest[1]; + u32x c = digest[2]; + u32x d = digest[3]; + u32x e = digest[4]; + u32x f = digest[5]; + u32x g = digest[6]; + u32x h = digest[7]; + + u32x w0_t = swap_workaround (w0[0]); + u32x w1_t = swap_workaround (w0[1]); + u32x w2_t = swap_workaround (w0[2]); + u32x w3_t = swap_workaround (w0[3]); + u32x w4_t = swap_workaround (w1[0]); + u32x w5_t = swap_workaround (w1[1]); + u32x w6_t = swap_workaround (w1[2]); + u32x w7_t = swap_workaround (w1[3]); + u32x w8_t = swap_workaround (w2[0]); + u32x w9_t = swap_workaround (w2[1]); + u32x wa_t = swap_workaround (w2[2]); + u32x wb_t = swap_workaround (w2[3]); + u32x wc_t = swap_workaround (w3[0]); + u32x wd_t = swap_workaround (w3[1]); + u32x we_t = swap_workaround (w3[2]); + u32x wf_t = swap_workaround (w3[3]); + + #define ROUND256_EXPAND() \ + { \ + w0_t = SHA256_EXPAND (we_t, w9_t, w1_t, w0_t); \ + w1_t = SHA256_EXPAND (wf_t, wa_t, w2_t, w1_t); \ + w2_t = SHA256_EXPAND (w0_t, wb_t, w3_t, w2_t); \ + w3_t = SHA256_EXPAND (w1_t, wc_t, w4_t, w3_t); \ + w4_t = SHA256_EXPAND (w2_t, wd_t, w5_t, w4_t); \ + w5_t = SHA256_EXPAND (w3_t, we_t, w6_t, w5_t); \ + w6_t = SHA256_EXPAND (w4_t, wf_t, w7_t, w6_t); \ + w7_t = SHA256_EXPAND (w5_t, w0_t, w8_t, w7_t); \ + w8_t = SHA256_EXPAND (w6_t, w1_t, w9_t, w8_t); \ + w9_t = SHA256_EXPAND (w7_t, w2_t, wa_t, w9_t); \ + wa_t = SHA256_EXPAND (w8_t, w3_t, wb_t, wa_t); \ + wb_t = SHA256_EXPAND (w9_t, w4_t, wc_t, wb_t); \ + wc_t = SHA256_EXPAND (wa_t, w5_t, wd_t, wc_t); \ + wd_t = SHA256_EXPAND (wb_t, w6_t, we_t, wd_t); \ + we_t = SHA256_EXPAND (wc_t, w7_t, wf_t, we_t); \ + wf_t = SHA256_EXPAND (wd_t, w8_t, w0_t, wf_t); \ + } + + #define ROUND256_STEP(i) \ + { \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, k_sha256[i + 0]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, k_sha256[i + 1]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, k_sha256[i + 2]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, k_sha256[i + 3]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, k_sha256[i + 4]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, k_sha256[i + 5]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, k_sha256[i + 6]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, k_sha256[i + 7]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, k_sha256[i + 8]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, k_sha256[i + 9]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, k_sha256[i + 10]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, k_sha256[i + 11]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, k_sha256[i + 12]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, k_sha256[i + 13]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, k_sha256[i + 14]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, k_sha256[i + 15]); \ + } + + ROUND256_STEP (0); + + for (int i = 16; i < 64; i += 16) + { + ROUND256_EXPAND (); ROUND256_STEP (i); + } + + digest[0] += a; + digest[1] += b; + digest[2] += c; + digest[3] += d; + digest[4] += e; + digest[5] += f; + digest[6] += g; + digest[7] += h; +} + +__device__ __constant__ u64 k_sha384[80] = +{ + SHA384C00, SHA384C01, SHA384C02, SHA384C03, + SHA384C04, SHA384C05, SHA384C06, SHA384C07, + SHA384C08, SHA384C09, SHA384C0a, SHA384C0b, + SHA384C0c, SHA384C0d, SHA384C0e, SHA384C0f, + SHA384C10, SHA384C11, SHA384C12, SHA384C13, + SHA384C14, SHA384C15, SHA384C16, SHA384C17, + SHA384C18, SHA384C19, SHA384C1a, SHA384C1b, + SHA384C1c, SHA384C1d, SHA384C1e, SHA384C1f, + SHA384C20, SHA384C21, SHA384C22, SHA384C23, + SHA384C24, SHA384C25, SHA384C26, SHA384C27, + SHA384C28, SHA384C29, SHA384C2a, SHA384C2b, + SHA384C2c, SHA384C2d, SHA384C2e, SHA384C2f, + SHA384C30, SHA384C31, SHA384C32, SHA384C33, + SHA384C34, SHA384C35, SHA384C36, SHA384C37, + SHA384C38, SHA384C39, SHA384C3a, SHA384C3b, + SHA384C3c, SHA384C3d, SHA384C3e, SHA384C3f, + SHA384C40, SHA384C41, SHA384C42, SHA384C43, + SHA384C44, SHA384C45, SHA384C46, SHA384C47, + SHA384C48, SHA384C49, SHA384C4a, SHA384C4b, + SHA384C4c, SHA384C4d, SHA384C4e, SHA384C4f, +}; + +__device__ static void sha384_transform (const u64 w0[4], const u64 w1[4], const u64 w2[4], const u64 w3[4], u64x digest[8]) +{ + u64x a = digest[0]; + u64x b = digest[1]; + u64x c = digest[2]; + u64x d = digest[3]; + u64x e = digest[4]; + u64x f = digest[5]; + u64x g = digest[6]; + u64x h = digest[7]; + + u64x w0_t = swap_workaround (w0[0]); + u64x w1_t = swap_workaround (w0[1]); + u64x w2_t = swap_workaround (w0[2]); + u64x w3_t = swap_workaround (w0[3]); + u64x w4_t = swap_workaround (w1[0]); + u64x w5_t = swap_workaround (w1[1]); + u64x w6_t = swap_workaround (w1[2]); + u64x w7_t = swap_workaround (w1[3]); + u64x w8_t = swap_workaround (w2[0]); + u64x w9_t = swap_workaround (w2[1]); + u64x wa_t = swap_workaround (w2[2]); + u64x wb_t = swap_workaround (w2[3]); + u64x wc_t = swap_workaround (w3[0]); + u64x wd_t = swap_workaround (w3[1]); + u64x we_t = swap_workaround (w3[2]); + u64x wf_t = swap_workaround (w3[3]); + + #define ROUND384_EXPAND() \ + { \ + w0_t = SHA384_EXPAND (we_t, w9_t, w1_t, w0_t); \ + w1_t = SHA384_EXPAND (wf_t, wa_t, w2_t, w1_t); \ + w2_t = SHA384_EXPAND (w0_t, wb_t, w3_t, w2_t); \ + w3_t = SHA384_EXPAND (w1_t, wc_t, w4_t, w3_t); \ + w4_t = SHA384_EXPAND (w2_t, wd_t, w5_t, w4_t); \ + w5_t = SHA384_EXPAND (w3_t, we_t, w6_t, w5_t); \ + w6_t = SHA384_EXPAND (w4_t, wf_t, w7_t, w6_t); \ + w7_t = SHA384_EXPAND (w5_t, w0_t, w8_t, w7_t); \ + w8_t = SHA384_EXPAND (w6_t, w1_t, w9_t, w8_t); \ + w9_t = SHA384_EXPAND (w7_t, w2_t, wa_t, w9_t); \ + wa_t = SHA384_EXPAND (w8_t, w3_t, wb_t, wa_t); \ + wb_t = SHA384_EXPAND (w9_t, w4_t, wc_t, wb_t); \ + wc_t = SHA384_EXPAND (wa_t, w5_t, wd_t, wc_t); \ + wd_t = SHA384_EXPAND (wb_t, w6_t, we_t, wd_t); \ + we_t = SHA384_EXPAND (wc_t, w7_t, wf_t, we_t); \ + wf_t = SHA384_EXPAND (wd_t, w8_t, w0_t, wf_t); \ + } + + #define ROUND384_STEP(i) \ + { \ + SHA384_STEP (SHA384_F0o, SHA384_F1o, a, b, c, d, e, f, g, h, w0_t, k_sha384[i + 0]); \ + SHA384_STEP (SHA384_F0o, SHA384_F1o, h, a, b, c, d, e, f, g, w1_t, k_sha384[i + 1]); \ + SHA384_STEP (SHA384_F0o, SHA384_F1o, g, h, a, b, c, d, e, f, w2_t, k_sha384[i + 2]); \ + SHA384_STEP (SHA384_F0o, SHA384_F1o, f, g, h, a, b, c, d, e, w3_t, k_sha384[i + 3]); \ + SHA384_STEP (SHA384_F0o, SHA384_F1o, e, f, g, h, a, b, c, d, w4_t, k_sha384[i + 4]); \ + SHA384_STEP (SHA384_F0o, SHA384_F1o, d, e, f, g, h, a, b, c, w5_t, k_sha384[i + 5]); \ + SHA384_STEP (SHA384_F0o, SHA384_F1o, c, d, e, f, g, h, a, b, w6_t, k_sha384[i + 6]); \ + SHA384_STEP (SHA384_F0o, SHA384_F1o, b, c, d, e, f, g, h, a, w7_t, k_sha384[i + 7]); \ + SHA384_STEP (SHA384_F0o, SHA384_F1o, a, b, c, d, e, f, g, h, w8_t, k_sha384[i + 8]); \ + SHA384_STEP (SHA384_F0o, SHA384_F1o, h, a, b, c, d, e, f, g, w9_t, k_sha384[i + 9]); \ + SHA384_STEP (SHA384_F0o, SHA384_F1o, g, h, a, b, c, d, e, f, wa_t, k_sha384[i + 10]); \ + SHA384_STEP (SHA384_F0o, SHA384_F1o, f, g, h, a, b, c, d, e, wb_t, k_sha384[i + 11]); \ + SHA384_STEP (SHA384_F0o, SHA384_F1o, e, f, g, h, a, b, c, d, wc_t, k_sha384[i + 12]); \ + SHA384_STEP (SHA384_F0o, SHA384_F1o, d, e, f, g, h, a, b, c, wd_t, k_sha384[i + 13]); \ + SHA384_STEP (SHA384_F0o, SHA384_F1o, c, d, e, f, g, h, a, b, we_t, k_sha384[i + 14]); \ + SHA384_STEP (SHA384_F0o, SHA384_F1o, b, c, d, e, f, g, h, a, wf_t, k_sha384[i + 15]); \ + } + + ROUND384_STEP (0); + + for (int i = 16; i < 80; i += 16) + { + ROUND384_EXPAND (); ROUND384_STEP (i); + } + + digest[0] += a; + digest[1] += b; + digest[2] += c; + digest[3] += d; + digest[4] += e; + digest[5] += f; + digest[6] += g; + digest[7] += h; +} + +__device__ __constant__ u64 k_sha512[80] = +{ + SHA384C00, SHA384C01, SHA384C02, SHA384C03, + SHA384C04, SHA384C05, SHA384C06, SHA384C07, + SHA384C08, SHA384C09, SHA384C0a, SHA384C0b, + SHA384C0c, SHA384C0d, SHA384C0e, SHA384C0f, + SHA384C10, SHA384C11, SHA384C12, SHA384C13, + SHA384C14, SHA384C15, SHA384C16, SHA384C17, + SHA384C18, SHA384C19, SHA384C1a, SHA384C1b, + SHA384C1c, SHA384C1d, SHA384C1e, SHA384C1f, + SHA384C20, SHA384C21, SHA384C22, SHA384C23, + SHA384C24, SHA384C25, SHA384C26, SHA384C27, + SHA384C28, SHA384C29, SHA384C2a, SHA384C2b, + SHA384C2c, SHA384C2d, SHA384C2e, SHA384C2f, + SHA384C30, SHA384C31, SHA384C32, SHA384C33, + SHA384C34, SHA384C35, SHA384C36, SHA384C37, + SHA384C38, SHA384C39, SHA384C3a, SHA384C3b, + SHA384C3c, SHA384C3d, SHA384C3e, SHA384C3f, + SHA384C40, SHA384C41, SHA384C42, SHA384C43, + SHA384C44, SHA384C45, SHA384C46, SHA384C47, + SHA384C48, SHA384C49, SHA384C4a, SHA384C4b, + SHA384C4c, SHA384C4d, SHA384C4e, SHA384C4f, +}; + +__device__ static void sha512_transform (const u64 w0[4], const u64 w1[4], const u64 w2[4], const u64 w3[4], u64 digest[8]) +{ + u64x a = digest[0]; + u64x b = digest[1]; + u64x c = digest[2]; + u64x d = digest[3]; + u64x e = digest[4]; + u64x f = digest[5]; + u64x g = digest[6]; + u64x h = digest[7]; + + u64x w0_t = swap_workaround (w0[0]); + u64x w1_t = swap_workaround (w0[1]); + u64x w2_t = swap_workaround (w0[2]); + u64x w3_t = swap_workaround (w0[3]); + u64x w4_t = swap_workaround (w1[0]); + u64x w5_t = swap_workaround (w1[1]); + u64x w6_t = swap_workaround (w1[2]); + u64x w7_t = swap_workaround (w1[3]); + u64x w8_t = swap_workaround (w2[0]); + u64x w9_t = swap_workaround (w2[1]); + u64x wa_t = swap_workaround (w2[2]); + u64x wb_t = swap_workaround (w2[3]); + u64x wc_t = swap_workaround (w3[0]); + u64x wd_t = swap_workaround (w3[1]); + u64x we_t = swap_workaround (w3[2]); + u64x wf_t = swap_workaround (w3[3]); + + #define ROUND512_EXPAND() \ + { \ + w0_t = SHA512_EXPAND (we_t, w9_t, w1_t, w0_t); \ + w1_t = SHA512_EXPAND (wf_t, wa_t, w2_t, w1_t); \ + w2_t = SHA512_EXPAND (w0_t, wb_t, w3_t, w2_t); \ + w3_t = SHA512_EXPAND (w1_t, wc_t, w4_t, w3_t); \ + w4_t = SHA512_EXPAND (w2_t, wd_t, w5_t, w4_t); \ + w5_t = SHA512_EXPAND (w3_t, we_t, w6_t, w5_t); \ + w6_t = SHA512_EXPAND (w4_t, wf_t, w7_t, w6_t); \ + w7_t = SHA512_EXPAND (w5_t, w0_t, w8_t, w7_t); \ + w8_t = SHA512_EXPAND (w6_t, w1_t, w9_t, w8_t); \ + w9_t = SHA512_EXPAND (w7_t, w2_t, wa_t, w9_t); \ + wa_t = SHA512_EXPAND (w8_t, w3_t, wb_t, wa_t); \ + wb_t = SHA512_EXPAND (w9_t, w4_t, wc_t, wb_t); \ + wc_t = SHA512_EXPAND (wa_t, w5_t, wd_t, wc_t); \ + wd_t = SHA512_EXPAND (wb_t, w6_t, we_t, wd_t); \ + we_t = SHA512_EXPAND (wc_t, w7_t, wf_t, we_t); \ + wf_t = SHA512_EXPAND (wd_t, w8_t, w0_t, wf_t); \ + } + + #define ROUND512_STEP(i) \ + { \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, a, b, c, d, e, f, g, h, w0_t, k_sha512[i + 0]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, h, a, b, c, d, e, f, g, w1_t, k_sha512[i + 1]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, g, h, a, b, c, d, e, f, w2_t, k_sha512[i + 2]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, f, g, h, a, b, c, d, e, w3_t, k_sha512[i + 3]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, e, f, g, h, a, b, c, d, w4_t, k_sha512[i + 4]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, d, e, f, g, h, a, b, c, w5_t, k_sha512[i + 5]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, c, d, e, f, g, h, a, b, w6_t, k_sha512[i + 6]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, b, c, d, e, f, g, h, a, w7_t, k_sha512[i + 7]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, a, b, c, d, e, f, g, h, w8_t, k_sha512[i + 8]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, h, a, b, c, d, e, f, g, w9_t, k_sha512[i + 9]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, g, h, a, b, c, d, e, f, wa_t, k_sha512[i + 10]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, f, g, h, a, b, c, d, e, wb_t, k_sha512[i + 11]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, e, f, g, h, a, b, c, d, wc_t, k_sha512[i + 12]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, d, e, f, g, h, a, b, c, wd_t, k_sha512[i + 13]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, c, d, e, f, g, h, a, b, we_t, k_sha512[i + 14]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, b, c, d, e, f, g, h, a, wf_t, k_sha512[i + 15]); \ + } + + ROUND512_STEP (0); + + for (int i = 16; i < 80; i += 16) + { + ROUND512_EXPAND (); ROUND512_STEP (i); + } + + digest[0] += a; + digest[1] += b; + digest[2] += c; + digest[3] += d; + digest[4] += e; + digest[5] += f; + digest[6] += g; + digest[7] += h; +} + +__device__ __constant__ u32 te0[256] = +{ + 0xc66363a5, 0xf87c7c84, 0xee777799, 0xf67b7b8d, + 0xfff2f20d, 0xd66b6bbd, 0xde6f6fb1, 0x91c5c554, + 0x60303050, 0x02010103, 0xce6767a9, 0x562b2b7d, + 0xe7fefe19, 0xb5d7d762, 0x4dababe6, 0xec76769a, + 0x8fcaca45, 0x1f82829d, 0x89c9c940, 0xfa7d7d87, + 0xeffafa15, 0xb25959eb, 0x8e4747c9, 0xfbf0f00b, + 0x41adadec, 0xb3d4d467, 0x5fa2a2fd, 0x45afafea, + 0x239c9cbf, 0x53a4a4f7, 0xe4727296, 0x9bc0c05b, + 0x75b7b7c2, 0xe1fdfd1c, 0x3d9393ae, 0x4c26266a, + 0x6c36365a, 0x7e3f3f41, 0xf5f7f702, 0x83cccc4f, + 0x6834345c, 0x51a5a5f4, 0xd1e5e534, 0xf9f1f108, + 0xe2717193, 0xabd8d873, 0x62313153, 0x2a15153f, + 0x0804040c, 0x95c7c752, 0x46232365, 0x9dc3c35e, + 0x30181828, 0x379696a1, 0x0a05050f, 0x2f9a9ab5, + 0x0e070709, 0x24121236, 0x1b80809b, 0xdfe2e23d, + 0xcdebeb26, 0x4e272769, 0x7fb2b2cd, 0xea75759f, + 0x1209091b, 0x1d83839e, 0x582c2c74, 0x341a1a2e, + 0x361b1b2d, 0xdc6e6eb2, 0xb45a5aee, 0x5ba0a0fb, + 0xa45252f6, 0x763b3b4d, 0xb7d6d661, 0x7db3b3ce, + 0x5229297b, 0xdde3e33e, 0x5e2f2f71, 0x13848497, + 0xa65353f5, 0xb9d1d168, 0x00000000, 0xc1eded2c, + 0x40202060, 0xe3fcfc1f, 0x79b1b1c8, 0xb65b5bed, + 0xd46a6abe, 0x8dcbcb46, 0x67bebed9, 0x7239394b, + 0x944a4ade, 0x984c4cd4, 0xb05858e8, 0x85cfcf4a, + 0xbbd0d06b, 0xc5efef2a, 0x4faaaae5, 0xedfbfb16, + 0x864343c5, 0x9a4d4dd7, 0x66333355, 0x11858594, + 0x8a4545cf, 0xe9f9f910, 0x04020206, 0xfe7f7f81, + 0xa05050f0, 0x783c3c44, 0x259f9fba, 0x4ba8a8e3, + 0xa25151f3, 0x5da3a3fe, 0x804040c0, 0x058f8f8a, + 0x3f9292ad, 0x219d9dbc, 0x70383848, 0xf1f5f504, + 0x63bcbcdf, 0x77b6b6c1, 0xafdada75, 0x42212163, + 0x20101030, 0xe5ffff1a, 0xfdf3f30e, 0xbfd2d26d, + 0x81cdcd4c, 0x180c0c14, 0x26131335, 0xc3ecec2f, + 0xbe5f5fe1, 0x359797a2, 0x884444cc, 0x2e171739, + 0x93c4c457, 0x55a7a7f2, 0xfc7e7e82, 0x7a3d3d47, + 0xc86464ac, 0xba5d5de7, 0x3219192b, 0xe6737395, + 0xc06060a0, 0x19818198, 0x9e4f4fd1, 0xa3dcdc7f, + 0x44222266, 0x542a2a7e, 0x3b9090ab, 0x0b888883, + 0x8c4646ca, 0xc7eeee29, 0x6bb8b8d3, 0x2814143c, + 0xa7dede79, 0xbc5e5ee2, 0x160b0b1d, 0xaddbdb76, + 0xdbe0e03b, 0x64323256, 0x743a3a4e, 0x140a0a1e, + 0x924949db, 0x0c06060a, 0x4824246c, 0xb85c5ce4, + 0x9fc2c25d, 0xbdd3d36e, 0x43acacef, 0xc46262a6, + 0x399191a8, 0x319595a4, 0xd3e4e437, 0xf279798b, + 0xd5e7e732, 0x8bc8c843, 0x6e373759, 0xda6d6db7, + 0x018d8d8c, 0xb1d5d564, 0x9c4e4ed2, 0x49a9a9e0, + 0xd86c6cb4, 0xac5656fa, 0xf3f4f407, 0xcfeaea25, + 0xca6565af, 0xf47a7a8e, 0x47aeaee9, 0x10080818, + 0x6fbabad5, 0xf0787888, 0x4a25256f, 0x5c2e2e72, + 0x381c1c24, 0x57a6a6f1, 0x73b4b4c7, 0x97c6c651, + 0xcbe8e823, 0xa1dddd7c, 0xe874749c, 0x3e1f1f21, + 0x964b4bdd, 0x61bdbddc, 0x0d8b8b86, 0x0f8a8a85, + 0xe0707090, 0x7c3e3e42, 0x71b5b5c4, 0xcc6666aa, + 0x904848d8, 0x06030305, 0xf7f6f601, 0x1c0e0e12, + 0xc26161a3, 0x6a35355f, 0xae5757f9, 0x69b9b9d0, + 0x17868691, 0x99c1c158, 0x3a1d1d27, 0x279e9eb9, + 0xd9e1e138, 0xebf8f813, 0x2b9898b3, 0x22111133, + 0xd26969bb, 0xa9d9d970, 0x078e8e89, 0x339494a7, + 0x2d9b9bb6, 0x3c1e1e22, 0x15878792, 0xc9e9e920, + 0x87cece49, 0xaa5555ff, 0x50282878, 0xa5dfdf7a, + 0x038c8c8f, 0x59a1a1f8, 0x09898980, 0x1a0d0d17, + 0x65bfbfda, 0xd7e6e631, 0x844242c6, 0xd06868b8, + 0x824141c3, 0x299999b0, 0x5a2d2d77, 0x1e0f0f11, + 0x7bb0b0cb, 0xa85454fc, 0x6dbbbbd6, 0x2c16163a, +}; + +__device__ __constant__ u32 te1[256] = +{ + 0xa5c66363, 0x84f87c7c, 0x99ee7777, 0x8df67b7b, + 0x0dfff2f2, 0xbdd66b6b, 0xb1de6f6f, 0x5491c5c5, + 0x50603030, 0x03020101, 0xa9ce6767, 0x7d562b2b, + 0x19e7fefe, 0x62b5d7d7, 0xe64dabab, 0x9aec7676, + 0x458fcaca, 0x9d1f8282, 0x4089c9c9, 0x87fa7d7d, + 0x15effafa, 0xebb25959, 0xc98e4747, 0x0bfbf0f0, + 0xec41adad, 0x67b3d4d4, 0xfd5fa2a2, 0xea45afaf, + 0xbf239c9c, 0xf753a4a4, 0x96e47272, 0x5b9bc0c0, + 0xc275b7b7, 0x1ce1fdfd, 0xae3d9393, 0x6a4c2626, + 0x5a6c3636, 0x417e3f3f, 0x02f5f7f7, 0x4f83cccc, + 0x5c683434, 0xf451a5a5, 0x34d1e5e5, 0x08f9f1f1, + 0x93e27171, 0x73abd8d8, 0x53623131, 0x3f2a1515, + 0x0c080404, 0x5295c7c7, 0x65462323, 0x5e9dc3c3, + 0x28301818, 0xa1379696, 0x0f0a0505, 0xb52f9a9a, + 0x090e0707, 0x36241212, 0x9b1b8080, 0x3ddfe2e2, + 0x26cdebeb, 0x694e2727, 0xcd7fb2b2, 0x9fea7575, + 0x1b120909, 0x9e1d8383, 0x74582c2c, 0x2e341a1a, + 0x2d361b1b, 0xb2dc6e6e, 0xeeb45a5a, 0xfb5ba0a0, + 0xf6a45252, 0x4d763b3b, 0x61b7d6d6, 0xce7db3b3, + 0x7b522929, 0x3edde3e3, 0x715e2f2f, 0x97138484, + 0xf5a65353, 0x68b9d1d1, 0x00000000, 0x2cc1eded, + 0x60402020, 0x1fe3fcfc, 0xc879b1b1, 0xedb65b5b, + 0xbed46a6a, 0x468dcbcb, 0xd967bebe, 0x4b723939, + 0xde944a4a, 0xd4984c4c, 0xe8b05858, 0x4a85cfcf, + 0x6bbbd0d0, 0x2ac5efef, 0xe54faaaa, 0x16edfbfb, + 0xc5864343, 0xd79a4d4d, 0x55663333, 0x94118585, + 0xcf8a4545, 0x10e9f9f9, 0x06040202, 0x81fe7f7f, + 0xf0a05050, 0x44783c3c, 0xba259f9f, 0xe34ba8a8, + 0xf3a25151, 0xfe5da3a3, 0xc0804040, 0x8a058f8f, + 0xad3f9292, 0xbc219d9d, 0x48703838, 0x04f1f5f5, + 0xdf63bcbc, 0xc177b6b6, 0x75afdada, 0x63422121, + 0x30201010, 0x1ae5ffff, 0x0efdf3f3, 0x6dbfd2d2, + 0x4c81cdcd, 0x14180c0c, 0x35261313, 0x2fc3ecec, + 0xe1be5f5f, 0xa2359797, 0xcc884444, 0x392e1717, + 0x5793c4c4, 0xf255a7a7, 0x82fc7e7e, 0x477a3d3d, + 0xacc86464, 0xe7ba5d5d, 0x2b321919, 0x95e67373, + 0xa0c06060, 0x98198181, 0xd19e4f4f, 0x7fa3dcdc, + 0x66442222, 0x7e542a2a, 0xab3b9090, 0x830b8888, + 0xca8c4646, 0x29c7eeee, 0xd36bb8b8, 0x3c281414, + 0x79a7dede, 0xe2bc5e5e, 0x1d160b0b, 0x76addbdb, + 0x3bdbe0e0, 0x56643232, 0x4e743a3a, 0x1e140a0a, + 0xdb924949, 0x0a0c0606, 0x6c482424, 0xe4b85c5c, + 0x5d9fc2c2, 0x6ebdd3d3, 0xef43acac, 0xa6c46262, + 0xa8399191, 0xa4319595, 0x37d3e4e4, 0x8bf27979, + 0x32d5e7e7, 0x438bc8c8, 0x596e3737, 0xb7da6d6d, + 0x8c018d8d, 0x64b1d5d5, 0xd29c4e4e, 0xe049a9a9, + 0xb4d86c6c, 0xfaac5656, 0x07f3f4f4, 0x25cfeaea, + 0xafca6565, 0x8ef47a7a, 0xe947aeae, 0x18100808, + 0xd56fbaba, 0x88f07878, 0x6f4a2525, 0x725c2e2e, + 0x24381c1c, 0xf157a6a6, 0xc773b4b4, 0x5197c6c6, + 0x23cbe8e8, 0x7ca1dddd, 0x9ce87474, 0x213e1f1f, + 0xdd964b4b, 0xdc61bdbd, 0x860d8b8b, 0x850f8a8a, + 0x90e07070, 0x427c3e3e, 0xc471b5b5, 0xaacc6666, + 0xd8904848, 0x05060303, 0x01f7f6f6, 0x121c0e0e, + 0xa3c26161, 0x5f6a3535, 0xf9ae5757, 0xd069b9b9, + 0x91178686, 0x5899c1c1, 0x273a1d1d, 0xb9279e9e, + 0x38d9e1e1, 0x13ebf8f8, 0xb32b9898, 0x33221111, + 0xbbd26969, 0x70a9d9d9, 0x89078e8e, 0xa7339494, + 0xb62d9b9b, 0x223c1e1e, 0x92158787, 0x20c9e9e9, + 0x4987cece, 0xffaa5555, 0x78502828, 0x7aa5dfdf, + 0x8f038c8c, 0xf859a1a1, 0x80098989, 0x171a0d0d, + 0xda65bfbf, 0x31d7e6e6, 0xc6844242, 0xb8d06868, + 0xc3824141, 0xb0299999, 0x775a2d2d, 0x111e0f0f, + 0xcb7bb0b0, 0xfca85454, 0xd66dbbbb, 0x3a2c1616, +}; + +__device__ __constant__ u32 te2[256] = +{ + 0x63a5c663, 0x7c84f87c, 0x7799ee77, 0x7b8df67b, + 0xf20dfff2, 0x6bbdd66b, 0x6fb1de6f, 0xc55491c5, + 0x30506030, 0x01030201, 0x67a9ce67, 0x2b7d562b, + 0xfe19e7fe, 0xd762b5d7, 0xabe64dab, 0x769aec76, + 0xca458fca, 0x829d1f82, 0xc94089c9, 0x7d87fa7d, + 0xfa15effa, 0x59ebb259, 0x47c98e47, 0xf00bfbf0, + 0xadec41ad, 0xd467b3d4, 0xa2fd5fa2, 0xafea45af, + 0x9cbf239c, 0xa4f753a4, 0x7296e472, 0xc05b9bc0, + 0xb7c275b7, 0xfd1ce1fd, 0x93ae3d93, 0x266a4c26, + 0x365a6c36, 0x3f417e3f, 0xf702f5f7, 0xcc4f83cc, + 0x345c6834, 0xa5f451a5, 0xe534d1e5, 0xf108f9f1, + 0x7193e271, 0xd873abd8, 0x31536231, 0x153f2a15, + 0x040c0804, 0xc75295c7, 0x23654623, 0xc35e9dc3, + 0x18283018, 0x96a13796, 0x050f0a05, 0x9ab52f9a, + 0x07090e07, 0x12362412, 0x809b1b80, 0xe23ddfe2, + 0xeb26cdeb, 0x27694e27, 0xb2cd7fb2, 0x759fea75, + 0x091b1209, 0x839e1d83, 0x2c74582c, 0x1a2e341a, + 0x1b2d361b, 0x6eb2dc6e, 0x5aeeb45a, 0xa0fb5ba0, + 0x52f6a452, 0x3b4d763b, 0xd661b7d6, 0xb3ce7db3, + 0x297b5229, 0xe33edde3, 0x2f715e2f, 0x84971384, + 0x53f5a653, 0xd168b9d1, 0x00000000, 0xed2cc1ed, + 0x20604020, 0xfc1fe3fc, 0xb1c879b1, 0x5bedb65b, + 0x6abed46a, 0xcb468dcb, 0xbed967be, 0x394b7239, + 0x4ade944a, 0x4cd4984c, 0x58e8b058, 0xcf4a85cf, + 0xd06bbbd0, 0xef2ac5ef, 0xaae54faa, 0xfb16edfb, + 0x43c58643, 0x4dd79a4d, 0x33556633, 0x85941185, + 0x45cf8a45, 0xf910e9f9, 0x02060402, 0x7f81fe7f, + 0x50f0a050, 0x3c44783c, 0x9fba259f, 0xa8e34ba8, + 0x51f3a251, 0xa3fe5da3, 0x40c08040, 0x8f8a058f, + 0x92ad3f92, 0x9dbc219d, 0x38487038, 0xf504f1f5, + 0xbcdf63bc, 0xb6c177b6, 0xda75afda, 0x21634221, + 0x10302010, 0xff1ae5ff, 0xf30efdf3, 0xd26dbfd2, + 0xcd4c81cd, 0x0c14180c, 0x13352613, 0xec2fc3ec, + 0x5fe1be5f, 0x97a23597, 0x44cc8844, 0x17392e17, + 0xc45793c4, 0xa7f255a7, 0x7e82fc7e, 0x3d477a3d, + 0x64acc864, 0x5de7ba5d, 0x192b3219, 0x7395e673, + 0x60a0c060, 0x81981981, 0x4fd19e4f, 0xdc7fa3dc, + 0x22664422, 0x2a7e542a, 0x90ab3b90, 0x88830b88, + 0x46ca8c46, 0xee29c7ee, 0xb8d36bb8, 0x143c2814, + 0xde79a7de, 0x5ee2bc5e, 0x0b1d160b, 0xdb76addb, + 0xe03bdbe0, 0x32566432, 0x3a4e743a, 0x0a1e140a, + 0x49db9249, 0x060a0c06, 0x246c4824, 0x5ce4b85c, + 0xc25d9fc2, 0xd36ebdd3, 0xacef43ac, 0x62a6c462, + 0x91a83991, 0x95a43195, 0xe437d3e4, 0x798bf279, + 0xe732d5e7, 0xc8438bc8, 0x37596e37, 0x6db7da6d, + 0x8d8c018d, 0xd564b1d5, 0x4ed29c4e, 0xa9e049a9, + 0x6cb4d86c, 0x56faac56, 0xf407f3f4, 0xea25cfea, + 0x65afca65, 0x7a8ef47a, 0xaee947ae, 0x08181008, + 0xbad56fba, 0x7888f078, 0x256f4a25, 0x2e725c2e, + 0x1c24381c, 0xa6f157a6, 0xb4c773b4, 0xc65197c6, + 0xe823cbe8, 0xdd7ca1dd, 0x749ce874, 0x1f213e1f, + 0x4bdd964b, 0xbddc61bd, 0x8b860d8b, 0x8a850f8a, + 0x7090e070, 0x3e427c3e, 0xb5c471b5, 0x66aacc66, + 0x48d89048, 0x03050603, 0xf601f7f6, 0x0e121c0e, + 0x61a3c261, 0x355f6a35, 0x57f9ae57, 0xb9d069b9, + 0x86911786, 0xc15899c1, 0x1d273a1d, 0x9eb9279e, + 0xe138d9e1, 0xf813ebf8, 0x98b32b98, 0x11332211, + 0x69bbd269, 0xd970a9d9, 0x8e89078e, 0x94a73394, + 0x9bb62d9b, 0x1e223c1e, 0x87921587, 0xe920c9e9, + 0xce4987ce, 0x55ffaa55, 0x28785028, 0xdf7aa5df, + 0x8c8f038c, 0xa1f859a1, 0x89800989, 0x0d171a0d, + 0xbfda65bf, 0xe631d7e6, 0x42c68442, 0x68b8d068, + 0x41c38241, 0x99b02999, 0x2d775a2d, 0x0f111e0f, + 0xb0cb7bb0, 0x54fca854, 0xbbd66dbb, 0x163a2c16, +}; + +__device__ __constant__ u32 te3[256] = +{ + 0x6363a5c6, 0x7c7c84f8, 0x777799ee, 0x7b7b8df6, + 0xf2f20dff, 0x6b6bbdd6, 0x6f6fb1de, 0xc5c55491, + 0x30305060, 0x01010302, 0x6767a9ce, 0x2b2b7d56, + 0xfefe19e7, 0xd7d762b5, 0xababe64d, 0x76769aec, + 0xcaca458f, 0x82829d1f, 0xc9c94089, 0x7d7d87fa, + 0xfafa15ef, 0x5959ebb2, 0x4747c98e, 0xf0f00bfb, + 0xadadec41, 0xd4d467b3, 0xa2a2fd5f, 0xafafea45, + 0x9c9cbf23, 0xa4a4f753, 0x727296e4, 0xc0c05b9b, + 0xb7b7c275, 0xfdfd1ce1, 0x9393ae3d, 0x26266a4c, + 0x36365a6c, 0x3f3f417e, 0xf7f702f5, 0xcccc4f83, + 0x34345c68, 0xa5a5f451, 0xe5e534d1, 0xf1f108f9, + 0x717193e2, 0xd8d873ab, 0x31315362, 0x15153f2a, + 0x04040c08, 0xc7c75295, 0x23236546, 0xc3c35e9d, + 0x18182830, 0x9696a137, 0x05050f0a, 0x9a9ab52f, + 0x0707090e, 0x12123624, 0x80809b1b, 0xe2e23ddf, + 0xebeb26cd, 0x2727694e, 0xb2b2cd7f, 0x75759fea, + 0x09091b12, 0x83839e1d, 0x2c2c7458, 0x1a1a2e34, + 0x1b1b2d36, 0x6e6eb2dc, 0x5a5aeeb4, 0xa0a0fb5b, + 0x5252f6a4, 0x3b3b4d76, 0xd6d661b7, 0xb3b3ce7d, + 0x29297b52, 0xe3e33edd, 0x2f2f715e, 0x84849713, + 0x5353f5a6, 0xd1d168b9, 0x00000000, 0xeded2cc1, + 0x20206040, 0xfcfc1fe3, 0xb1b1c879, 0x5b5bedb6, + 0x6a6abed4, 0xcbcb468d, 0xbebed967, 0x39394b72, + 0x4a4ade94, 0x4c4cd498, 0x5858e8b0, 0xcfcf4a85, + 0xd0d06bbb, 0xefef2ac5, 0xaaaae54f, 0xfbfb16ed, + 0x4343c586, 0x4d4dd79a, 0x33335566, 0x85859411, + 0x4545cf8a, 0xf9f910e9, 0x02020604, 0x7f7f81fe, + 0x5050f0a0, 0x3c3c4478, 0x9f9fba25, 0xa8a8e34b, + 0x5151f3a2, 0xa3a3fe5d, 0x4040c080, 0x8f8f8a05, + 0x9292ad3f, 0x9d9dbc21, 0x38384870, 0xf5f504f1, + 0xbcbcdf63, 0xb6b6c177, 0xdada75af, 0x21216342, + 0x10103020, 0xffff1ae5, 0xf3f30efd, 0xd2d26dbf, + 0xcdcd4c81, 0x0c0c1418, 0x13133526, 0xecec2fc3, + 0x5f5fe1be, 0x9797a235, 0x4444cc88, 0x1717392e, + 0xc4c45793, 0xa7a7f255, 0x7e7e82fc, 0x3d3d477a, + 0x6464acc8, 0x5d5de7ba, 0x19192b32, 0x737395e6, + 0x6060a0c0, 0x81819819, 0x4f4fd19e, 0xdcdc7fa3, + 0x22226644, 0x2a2a7e54, 0x9090ab3b, 0x8888830b, + 0x4646ca8c, 0xeeee29c7, 0xb8b8d36b, 0x14143c28, + 0xdede79a7, 0x5e5ee2bc, 0x0b0b1d16, 0xdbdb76ad, + 0xe0e03bdb, 0x32325664, 0x3a3a4e74, 0x0a0a1e14, + 0x4949db92, 0x06060a0c, 0x24246c48, 0x5c5ce4b8, + 0xc2c25d9f, 0xd3d36ebd, 0xacacef43, 0x6262a6c4, + 0x9191a839, 0x9595a431, 0xe4e437d3, 0x79798bf2, + 0xe7e732d5, 0xc8c8438b, 0x3737596e, 0x6d6db7da, + 0x8d8d8c01, 0xd5d564b1, 0x4e4ed29c, 0xa9a9e049, + 0x6c6cb4d8, 0x5656faac, 0xf4f407f3, 0xeaea25cf, + 0x6565afca, 0x7a7a8ef4, 0xaeaee947, 0x08081810, + 0xbabad56f, 0x787888f0, 0x25256f4a, 0x2e2e725c, + 0x1c1c2438, 0xa6a6f157, 0xb4b4c773, 0xc6c65197, + 0xe8e823cb, 0xdddd7ca1, 0x74749ce8, 0x1f1f213e, + 0x4b4bdd96, 0xbdbddc61, 0x8b8b860d, 0x8a8a850f, + 0x707090e0, 0x3e3e427c, 0xb5b5c471, 0x6666aacc, + 0x4848d890, 0x03030506, 0xf6f601f7, 0x0e0e121c, + 0x6161a3c2, 0x35355f6a, 0x5757f9ae, 0xb9b9d069, + 0x86869117, 0xc1c15899, 0x1d1d273a, 0x9e9eb927, + 0xe1e138d9, 0xf8f813eb, 0x9898b32b, 0x11113322, + 0x6969bbd2, 0xd9d970a9, 0x8e8e8907, 0x9494a733, + 0x9b9bb62d, 0x1e1e223c, 0x87879215, 0xe9e920c9, + 0xcece4987, 0x5555ffaa, 0x28287850, 0xdfdf7aa5, + 0x8c8c8f03, 0xa1a1f859, 0x89898009, 0x0d0d171a, + 0xbfbfda65, 0xe6e631d7, 0x4242c684, 0x6868b8d0, + 0x4141c382, 0x9999b029, 0x2d2d775a, 0x0f0f111e, + 0xb0b0cb7b, 0x5454fca8, 0xbbbbd66d, 0x16163a2c, +}; + +__device__ __constant__ u32 te4[256] = +{ + 0x63636363, 0x7c7c7c7c, 0x77777777, 0x7b7b7b7b, + 0xf2f2f2f2, 0x6b6b6b6b, 0x6f6f6f6f, 0xc5c5c5c5, + 0x30303030, 0x01010101, 0x67676767, 0x2b2b2b2b, + 0xfefefefe, 0xd7d7d7d7, 0xabababab, 0x76767676, + 0xcacacaca, 0x82828282, 0xc9c9c9c9, 0x7d7d7d7d, + 0xfafafafa, 0x59595959, 0x47474747, 0xf0f0f0f0, + 0xadadadad, 0xd4d4d4d4, 0xa2a2a2a2, 0xafafafaf, + 0x9c9c9c9c, 0xa4a4a4a4, 0x72727272, 0xc0c0c0c0, + 0xb7b7b7b7, 0xfdfdfdfd, 0x93939393, 0x26262626, + 0x36363636, 0x3f3f3f3f, 0xf7f7f7f7, 0xcccccccc, + 0x34343434, 0xa5a5a5a5, 0xe5e5e5e5, 0xf1f1f1f1, + 0x71717171, 0xd8d8d8d8, 0x31313131, 0x15151515, + 0x04040404, 0xc7c7c7c7, 0x23232323, 0xc3c3c3c3, + 0x18181818, 0x96969696, 0x05050505, 0x9a9a9a9a, + 0x07070707, 0x12121212, 0x80808080, 0xe2e2e2e2, + 0xebebebeb, 0x27272727, 0xb2b2b2b2, 0x75757575, + 0x09090909, 0x83838383, 0x2c2c2c2c, 0x1a1a1a1a, + 0x1b1b1b1b, 0x6e6e6e6e, 0x5a5a5a5a, 0xa0a0a0a0, + 0x52525252, 0x3b3b3b3b, 0xd6d6d6d6, 0xb3b3b3b3, + 0x29292929, 0xe3e3e3e3, 0x2f2f2f2f, 0x84848484, + 0x53535353, 0xd1d1d1d1, 0x00000000, 0xedededed, + 0x20202020, 0xfcfcfcfc, 0xb1b1b1b1, 0x5b5b5b5b, + 0x6a6a6a6a, 0xcbcbcbcb, 0xbebebebe, 0x39393939, + 0x4a4a4a4a, 0x4c4c4c4c, 0x58585858, 0xcfcfcfcf, + 0xd0d0d0d0, 0xefefefef, 0xaaaaaaaa, 0xfbfbfbfb, + 0x43434343, 0x4d4d4d4d, 0x33333333, 0x85858585, + 0x45454545, 0xf9f9f9f9, 0x02020202, 0x7f7f7f7f, + 0x50505050, 0x3c3c3c3c, 0x9f9f9f9f, 0xa8a8a8a8, + 0x51515151, 0xa3a3a3a3, 0x40404040, 0x8f8f8f8f, + 0x92929292, 0x9d9d9d9d, 0x38383838, 0xf5f5f5f5, + 0xbcbcbcbc, 0xb6b6b6b6, 0xdadadada, 0x21212121, + 0x10101010, 0xffffffff, 0xf3f3f3f3, 0xd2d2d2d2, + 0xcdcdcdcd, 0x0c0c0c0c, 0x13131313, 0xecececec, + 0x5f5f5f5f, 0x97979797, 0x44444444, 0x17171717, + 0xc4c4c4c4, 0xa7a7a7a7, 0x7e7e7e7e, 0x3d3d3d3d, + 0x64646464, 0x5d5d5d5d, 0x19191919, 0x73737373, + 0x60606060, 0x81818181, 0x4f4f4f4f, 0xdcdcdcdc, + 0x22222222, 0x2a2a2a2a, 0x90909090, 0x88888888, + 0x46464646, 0xeeeeeeee, 0xb8b8b8b8, 0x14141414, + 0xdededede, 0x5e5e5e5e, 0x0b0b0b0b, 0xdbdbdbdb, + 0xe0e0e0e0, 0x32323232, 0x3a3a3a3a, 0x0a0a0a0a, + 0x49494949, 0x06060606, 0x24242424, 0x5c5c5c5c, + 0xc2c2c2c2, 0xd3d3d3d3, 0xacacacac, 0x62626262, + 0x91919191, 0x95959595, 0xe4e4e4e4, 0x79797979, + 0xe7e7e7e7, 0xc8c8c8c8, 0x37373737, 0x6d6d6d6d, + 0x8d8d8d8d, 0xd5d5d5d5, 0x4e4e4e4e, 0xa9a9a9a9, + 0x6c6c6c6c, 0x56565656, 0xf4f4f4f4, 0xeaeaeaea, + 0x65656565, 0x7a7a7a7a, 0xaeaeaeae, 0x08080808, + 0xbabababa, 0x78787878, 0x25252525, 0x2e2e2e2e, + 0x1c1c1c1c, 0xa6a6a6a6, 0xb4b4b4b4, 0xc6c6c6c6, + 0xe8e8e8e8, 0xdddddddd, 0x74747474, 0x1f1f1f1f, + 0x4b4b4b4b, 0xbdbdbdbd, 0x8b8b8b8b, 0x8a8a8a8a, + 0x70707070, 0x3e3e3e3e, 0xb5b5b5b5, 0x66666666, + 0x48484848, 0x03030303, 0xf6f6f6f6, 0x0e0e0e0e, + 0x61616161, 0x35353535, 0x57575757, 0xb9b9b9b9, + 0x86868686, 0xc1c1c1c1, 0x1d1d1d1d, 0x9e9e9e9e, + 0xe1e1e1e1, 0xf8f8f8f8, 0x98989898, 0x11111111, + 0x69696969, 0xd9d9d9d9, 0x8e8e8e8e, 0x94949494, + 0x9b9b9b9b, 0x1e1e1e1e, 0x87878787, 0xe9e9e9e9, + 0xcececece, 0x55555555, 0x28282828, 0xdfdfdfdf, + 0x8c8c8c8c, 0xa1a1a1a1, 0x89898989, 0x0d0d0d0d, + 0xbfbfbfbf, 0xe6e6e6e6, 0x42424242, 0x68686868, + 0x41414141, 0x99999999, 0x2d2d2d2d, 0x0f0f0f0f, + 0xb0b0b0b0, 0x54545454, 0xbbbbbbbb, 0x16161616, +}; + +__device__ __constant__ u32 rcon[] = +{ + 0x01000000, 0x02000000, 0x04000000, 0x08000000, + 0x10000000, 0x20000000, 0x40000000, 0x80000000, + 0x1b000000, 0x36000000, +}; + +__device__ static void AES128_ExpandKey (u32 *userkey, u32 *rek, u32 s_te0[256], u32 s_te1[256], u32 s_te2[256], u32 s_te3[256], u32 s_te4[256]) +{ + rek[0] = swap_workaround (userkey[0]); + rek[1] = swap_workaround (userkey[1]); + rek[2] = swap_workaround (userkey[2]); + rek[3] = swap_workaround (userkey[3]); + + for (u32 i = 0, j = 0; i < 10; i += 1, j += 4) + { + u32 temp = rek[j + 3]; + + temp = (s_te2[(temp >> 16) & 0xff] & 0xff000000) + ^ (s_te3[(temp >> 8) & 0xff] & 0x00ff0000) + ^ (s_te0[(temp >> 0) & 0xff] & 0x0000ff00) + ^ (s_te1[(temp >> 24) & 0xff] & 0x000000ff); + + rek[j + 4] = rek[j + 0] + ^ temp + ^ rcon[i]; + + rek[j + 5] = rek[j + 1] ^ rek[j + 4]; + rek[j + 6] = rek[j + 2] ^ rek[j + 5]; + rek[j + 7] = rek[j + 3] ^ rek[j + 6]; + } +} + +__device__ static void AES128_encrypt (const u32 *in, u32 *out, const u32 *rek, u32 s_te0[256], u32 s_te1[256], u32 s_te2[256], u32 s_te3[256], u32 s_te4[256]) +{ + u32 in_swap[4]; + + in_swap[0] = swap_workaround (in[0]); + in_swap[1] = swap_workaround (in[1]); + in_swap[2] = swap_workaround (in[2]); + in_swap[3] = swap_workaround (in[3]); + + u32 s0 = in_swap[0] ^ rek[0]; + u32 s1 = in_swap[1] ^ rek[1]; + u32 s2 = in_swap[2] ^ rek[2]; + u32 s3 = in_swap[3] ^ rek[3]; + + u32 t0; + u32 t1; + u32 t2; + u32 t3; + + t0 = s_te0[s0 >> 24] ^ s_te1[(s1 >> 16) & 0xff] ^ s_te2[(s2 >> 8) & 0xff] ^ s_te3[s3 & 0xff] ^ rek[ 4]; + t1 = s_te0[s1 >> 24] ^ s_te1[(s2 >> 16) & 0xff] ^ s_te2[(s3 >> 8) & 0xff] ^ s_te3[s0 & 0xff] ^ rek[ 5]; + t2 = s_te0[s2 >> 24] ^ s_te1[(s3 >> 16) & 0xff] ^ s_te2[(s0 >> 8) & 0xff] ^ s_te3[s1 & 0xff] ^ rek[ 6]; + t3 = s_te0[s3 >> 24] ^ s_te1[(s0 >> 16) & 0xff] ^ s_te2[(s1 >> 8) & 0xff] ^ s_te3[s2 & 0xff] ^ rek[ 7]; + s0 = s_te0[t0 >> 24] ^ s_te1[(t1 >> 16) & 0xff] ^ s_te2[(t2 >> 8) & 0xff] ^ s_te3[t3 & 0xff] ^ rek[ 8]; + s1 = s_te0[t1 >> 24] ^ s_te1[(t2 >> 16) & 0xff] ^ s_te2[(t3 >> 8) & 0xff] ^ s_te3[t0 & 0xff] ^ rek[ 9]; + s2 = s_te0[t2 >> 24] ^ s_te1[(t3 >> 16) & 0xff] ^ s_te2[(t0 >> 8) & 0xff] ^ s_te3[t1 & 0xff] ^ rek[10]; + s3 = s_te0[t3 >> 24] ^ s_te1[(t0 >> 16) & 0xff] ^ s_te2[(t1 >> 8) & 0xff] ^ s_te3[t2 & 0xff] ^ rek[11]; + t0 = s_te0[s0 >> 24] ^ s_te1[(s1 >> 16) & 0xff] ^ s_te2[(s2 >> 8) & 0xff] ^ s_te3[s3 & 0xff] ^ rek[12]; + t1 = s_te0[s1 >> 24] ^ s_te1[(s2 >> 16) & 0xff] ^ s_te2[(s3 >> 8) & 0xff] ^ s_te3[s0 & 0xff] ^ rek[13]; + t2 = s_te0[s2 >> 24] ^ s_te1[(s3 >> 16) & 0xff] ^ s_te2[(s0 >> 8) & 0xff] ^ s_te3[s1 & 0xff] ^ rek[14]; + t3 = s_te0[s3 >> 24] ^ s_te1[(s0 >> 16) & 0xff] ^ s_te2[(s1 >> 8) & 0xff] ^ s_te3[s2 & 0xff] ^ rek[15]; + s0 = s_te0[t0 >> 24] ^ s_te1[(t1 >> 16) & 0xff] ^ s_te2[(t2 >> 8) & 0xff] ^ s_te3[t3 & 0xff] ^ rek[16]; + s1 = s_te0[t1 >> 24] ^ s_te1[(t2 >> 16) & 0xff] ^ s_te2[(t3 >> 8) & 0xff] ^ s_te3[t0 & 0xff] ^ rek[17]; + s2 = s_te0[t2 >> 24] ^ s_te1[(t3 >> 16) & 0xff] ^ s_te2[(t0 >> 8) & 0xff] ^ s_te3[t1 & 0xff] ^ rek[18]; + s3 = s_te0[t3 >> 24] ^ s_te1[(t0 >> 16) & 0xff] ^ s_te2[(t1 >> 8) & 0xff] ^ s_te3[t2 & 0xff] ^ rek[19]; + t0 = s_te0[s0 >> 24] ^ s_te1[(s1 >> 16) & 0xff] ^ s_te2[(s2 >> 8) & 0xff] ^ s_te3[s3 & 0xff] ^ rek[20]; + t1 = s_te0[s1 >> 24] ^ s_te1[(s2 >> 16) & 0xff] ^ s_te2[(s3 >> 8) & 0xff] ^ s_te3[s0 & 0xff] ^ rek[21]; + t2 = s_te0[s2 >> 24] ^ s_te1[(s3 >> 16) & 0xff] ^ s_te2[(s0 >> 8) & 0xff] ^ s_te3[s1 & 0xff] ^ rek[22]; + t3 = s_te0[s3 >> 24] ^ s_te1[(s0 >> 16) & 0xff] ^ s_te2[(s1 >> 8) & 0xff] ^ s_te3[s2 & 0xff] ^ rek[23]; + s0 = s_te0[t0 >> 24] ^ s_te1[(t1 >> 16) & 0xff] ^ s_te2[(t2 >> 8) & 0xff] ^ s_te3[t3 & 0xff] ^ rek[24]; + s1 = s_te0[t1 >> 24] ^ s_te1[(t2 >> 16) & 0xff] ^ s_te2[(t3 >> 8) & 0xff] ^ s_te3[t0 & 0xff] ^ rek[25]; + s2 = s_te0[t2 >> 24] ^ s_te1[(t3 >> 16) & 0xff] ^ s_te2[(t0 >> 8) & 0xff] ^ s_te3[t1 & 0xff] ^ rek[26]; + s3 = s_te0[t3 >> 24] ^ s_te1[(t0 >> 16) & 0xff] ^ s_te2[(t1 >> 8) & 0xff] ^ s_te3[t2 & 0xff] ^ rek[27]; + t0 = s_te0[s0 >> 24] ^ s_te1[(s1 >> 16) & 0xff] ^ s_te2[(s2 >> 8) & 0xff] ^ s_te3[s3 & 0xff] ^ rek[28]; + t1 = s_te0[s1 >> 24] ^ s_te1[(s2 >> 16) & 0xff] ^ s_te2[(s3 >> 8) & 0xff] ^ s_te3[s0 & 0xff] ^ rek[29]; + t2 = s_te0[s2 >> 24] ^ s_te1[(s3 >> 16) & 0xff] ^ s_te2[(s0 >> 8) & 0xff] ^ s_te3[s1 & 0xff] ^ rek[30]; + t3 = s_te0[s3 >> 24] ^ s_te1[(s0 >> 16) & 0xff] ^ s_te2[(s1 >> 8) & 0xff] ^ s_te3[s2 & 0xff] ^ rek[31]; + s0 = s_te0[t0 >> 24] ^ s_te1[(t1 >> 16) & 0xff] ^ s_te2[(t2 >> 8) & 0xff] ^ s_te3[t3 & 0xff] ^ rek[32]; + s1 = s_te0[t1 >> 24] ^ s_te1[(t2 >> 16) & 0xff] ^ s_te2[(t3 >> 8) & 0xff] ^ s_te3[t0 & 0xff] ^ rek[33]; + s2 = s_te0[t2 >> 24] ^ s_te1[(t3 >> 16) & 0xff] ^ s_te2[(t0 >> 8) & 0xff] ^ s_te3[t1 & 0xff] ^ rek[34]; + s3 = s_te0[t3 >> 24] ^ s_te1[(t0 >> 16) & 0xff] ^ s_te2[(t1 >> 8) & 0xff] ^ s_te3[t2 & 0xff] ^ rek[35]; + t0 = s_te0[s0 >> 24] ^ s_te1[(s1 >> 16) & 0xff] ^ s_te2[(s2 >> 8) & 0xff] ^ s_te3[s3 & 0xff] ^ rek[36]; + t1 = s_te0[s1 >> 24] ^ s_te1[(s2 >> 16) & 0xff] ^ s_te2[(s3 >> 8) & 0xff] ^ s_te3[s0 & 0xff] ^ rek[37]; + t2 = s_te0[s2 >> 24] ^ s_te1[(s3 >> 16) & 0xff] ^ s_te2[(s0 >> 8) & 0xff] ^ s_te3[s1 & 0xff] ^ rek[38]; + t3 = s_te0[s3 >> 24] ^ s_te1[(s0 >> 16) & 0xff] ^ s_te2[(s1 >> 8) & 0xff] ^ s_te3[s2 & 0xff] ^ rek[39]; + + out[0] = (s_te4[(t0 >> 24) & 0xff] & 0xff000000) + ^ (s_te4[(t1 >> 16) & 0xff] & 0x00ff0000) + ^ (s_te4[(t2 >> 8) & 0xff] & 0x0000ff00) + ^ (s_te4[(t3 >> 0) & 0xff] & 0x000000ff) + ^ rek[40]; + + out[1] = (s_te4[(t1 >> 24) & 0xff] & 0xff000000) + ^ (s_te4[(t2 >> 16) & 0xff] & 0x00ff0000) + ^ (s_te4[(t3 >> 8) & 0xff] & 0x0000ff00) + ^ (s_te4[(t0 >> 0) & 0xff] & 0x000000ff) + ^ rek[41]; + + out[2] = (s_te4[(t2 >> 24) & 0xff] & 0xff000000) + ^ (s_te4[(t3 >> 16) & 0xff] & 0x00ff0000) + ^ (s_te4[(t0 >> 8) & 0xff] & 0x0000ff00) + ^ (s_te4[(t1 >> 0) & 0xff] & 0x000000ff) + ^ rek[42]; + + out[3] = (s_te4[(t3 >> 24) & 0xff] & 0xff000000) + ^ (s_te4[(t0 >> 16) & 0xff] & 0x00ff0000) + ^ (s_te4[(t1 >> 8) & 0xff] & 0x0000ff00) + ^ (s_te4[(t2 >> 0) & 0xff] & 0x000000ff) + ^ rek[43]; + + out[0] = swap_workaround (out[0]); + out[1] = swap_workaround (out[1]); + out[2] = swap_workaround (out[2]); + out[3] = swap_workaround (out[3]); +} + +__device__ static void memcat8 (u32x block0[4], u32x block1[4], u32x block2[4], u32x block3[4], const u32 block_len, const u32 append[2]) +{ + switch (block_len) + { + case 0: + block0[0] = append[0]; + block0[1] = append[1]; + break; + + case 1: + block0[0] = block0[0] | append[0] << 8; + block0[1] = append[0] >> 24 | append[1] << 8; + block0[2] = append[1] >> 24; + break; + + case 2: + block0[0] = block0[0] | append[0] << 16; + block0[1] = append[0] >> 16 | append[1] << 16; + block0[2] = append[1] >> 16; + break; + + case 3: + block0[0] = block0[0] | append[0] << 24; + block0[1] = append[0] >> 8 | append[1] << 24; + block0[2] = append[1] >> 8; + break; + + case 4: + block0[1] = append[0]; + block0[2] = append[1]; + break; + + case 5: + block0[1] = block0[1] | append[0] << 8; + block0[2] = append[0] >> 24 | append[1] << 8; + block0[3] = append[1] >> 24; + break; + + case 6: + block0[1] = block0[1] | append[0] << 16; + block0[2] = append[0] >> 16 | append[1] << 16; + block0[3] = append[1] >> 16; + break; + + case 7: + block0[1] = block0[1] | append[0] << 24; + block0[2] = append[0] >> 8 | append[1] << 24; + block0[3] = append[1] >> 8; + break; + + case 8: + block0[2] = append[0]; + block0[3] = append[1]; + break; + + case 9: + block0[2] = block0[2] | append[0] << 8; + block0[3] = append[0] >> 24 | append[1] << 8; + block1[0] = append[1] >> 24; + break; + + case 10: + block0[2] = block0[2] | append[0] << 16; + block0[3] = append[0] >> 16 | append[1] << 16; + block1[0] = append[1] >> 16; + break; + + case 11: + block0[2] = block0[2] | append[0] << 24; + block0[3] = append[0] >> 8 | append[1] << 24; + block1[0] = append[1] >> 8; + break; + + case 12: + block0[3] = append[0]; + block1[0] = append[1]; + break; + + case 13: + block0[3] = block0[3] | append[0] << 8; + block1[0] = append[0] >> 24 | append[1] << 8; + block1[1] = append[1] >> 24; + break; + + case 14: + block0[3] = block0[3] | append[0] << 16; + block1[0] = append[0] >> 16 | append[1] << 16; + block1[1] = append[1] >> 16; + break; + + case 15: + block0[3] = block0[3] | append[0] << 24; + block1[0] = append[0] >> 8 | append[1] << 24; + block1[1] = append[1] >> 8; + break; + + case 16: + block1[0] = append[0]; + block1[1] = append[1]; + break; + + case 17: + block1[0] = block1[0] | append[0] << 8; + block1[1] = append[0] >> 24 | append[1] << 8; + block1[2] = append[1] >> 24; + break; + + case 18: + block1[0] = block1[0] | append[0] << 16; + block1[1] = append[0] >> 16 | append[1] << 16; + block1[2] = append[1] >> 16; + break; + + case 19: + block1[0] = block1[0] | append[0] << 24; + block1[1] = append[0] >> 8 | append[1] << 24; + block1[2] = append[1] >> 8; + break; + + case 20: + block1[1] = append[0]; + block1[2] = append[1]; + break; + + case 21: + block1[1] = block1[1] | append[0] << 8; + block1[2] = append[0] >> 24 | append[1] << 8; + block1[3] = append[1] >> 24; + break; + + case 22: + block1[1] = block1[1] | append[0] << 16; + block1[2] = append[0] >> 16 | append[1] << 16; + block1[3] = append[1] >> 16; + break; + + case 23: + block1[1] = block1[1] | append[0] << 24; + block1[2] = append[0] >> 8 | append[1] << 24; + block1[3] = append[1] >> 8; + break; + + case 24: + block1[2] = append[0]; + block1[3] = append[1]; + break; + + case 25: + block1[2] = block1[2] | append[0] << 8; + block1[3] = append[0] >> 24 | append[1] << 8; + block2[0] = append[1] >> 24; + break; + + case 26: + block1[2] = block1[2] | append[0] << 16; + block1[3] = append[0] >> 16 | append[1] << 16; + block2[0] = append[1] >> 16; + break; + + case 27: + block1[2] = block1[2] | append[0] << 24; + block1[3] = append[0] >> 8 | append[1] << 24; + block2[0] = append[1] >> 8; + break; + + case 28: + block1[3] = append[0]; + block2[0] = append[1]; + break; + + case 29: + block1[3] = block1[3] | append[0] << 8; + block2[0] = append[0] >> 24 | append[1] << 8; + block2[1] = append[1] >> 24; + break; + + case 30: + block1[3] = block1[3] | append[0] << 16; + block2[0] = append[0] >> 16 | append[1] << 16; + block2[1] = append[1] >> 16; + break; + + case 31: + block1[3] = block1[3] | append[0] << 24; + block2[0] = append[0] >> 8 | append[1] << 24; + block2[1] = append[1] >> 8; + break; + + case 32: + block2[0] = append[0]; + block2[1] = append[1]; + break; + + case 33: + block2[0] = block2[0] | append[0] << 8; + block2[1] = append[0] >> 24 | append[1] << 8; + block2[2] = append[1] >> 24; + break; + + case 34: + block2[0] = block2[0] | append[0] << 16; + block2[1] = append[0] >> 16 | append[1] << 16; + block2[2] = append[1] >> 16; + break; + + case 35: + block2[0] = block2[0] | append[0] << 24; + block2[1] = append[0] >> 8 | append[1] << 24; + block2[2] = append[1] >> 8; + break; + + case 36: + block2[1] = append[0]; + block2[2] = append[1]; + break; + + case 37: + block2[1] = block2[1] | append[0] << 8; + block2[2] = append[0] >> 24 | append[1] << 8; + block2[3] = append[1] >> 24; + break; + + case 38: + block2[1] = block2[1] | append[0] << 16; + block2[2] = append[0] >> 16 | append[1] << 16; + block2[3] = append[1] >> 16; + break; + + case 39: + block2[1] = block2[1] | append[0] << 24; + block2[2] = append[0] >> 8 | append[1] << 24; + block2[3] = append[1] >> 8; + break; + + case 40: + block2[2] = append[0]; + block2[3] = append[1]; + break; + + case 41: + block2[2] = block2[2] | append[0] << 8; + block2[3] = append[0] >> 24 | append[1] << 8; + block3[0] = append[1] >> 24; + break; + + case 42: + block2[2] = block2[2] | append[0] << 16; + block2[3] = append[0] >> 16 | append[1] << 16; + block3[0] = append[1] >> 16; + break; + + case 43: + block2[2] = block2[2] | append[0] << 24; + block2[3] = append[0] >> 8 | append[1] << 24; + block3[0] = append[1] >> 8; + break; + + case 44: + block2[3] = append[0]; + block3[0] = append[1]; + break; + + case 45: + block2[3] = block2[3] | append[0] << 8; + block3[0] = append[0] >> 24 | append[1] << 8; + block3[1] = append[1] >> 24; + break; + + case 46: + block2[3] = block2[3] | append[0] << 16; + block3[0] = append[0] >> 16 | append[1] << 16; + block3[1] = append[1] >> 16; + break; + + case 47: + block2[3] = block2[3] | append[0] << 24; + block3[0] = append[0] >> 8 | append[1] << 24; + block3[1] = append[1] >> 8; + break; + + case 48: + block3[0] = append[0]; + block3[1] = append[1]; + break; + + case 49: + block3[0] = block3[0] | append[0] << 8; + block3[1] = append[0] >> 24 | append[1] << 8; + block3[2] = append[1] >> 24; + break; + + case 50: + block3[0] = block3[0] | append[0] << 16; + block3[1] = append[0] >> 16 | append[1] << 16; + block3[2] = append[1] >> 16; + break; + + case 51: + block3[0] = block3[0] | append[0] << 24; + block3[1] = append[0] >> 8 | append[1] << 24; + block3[2] = append[1] >> 8; + break; + + case 52: + block3[1] = append[0]; + block3[2] = append[1]; + break; + + case 53: + block3[1] = block3[1] | append[0] << 8; + block3[2] = append[0] >> 24 | append[1] << 8; + block3[3] = append[1] >> 24; + break; + + case 54: + block3[1] = block3[1] | append[0] << 16; + block3[2] = append[0] >> 16 | append[1] << 16; + block3[3] = append[1] >> 16; + break; + + case 55: + block3[1] = block3[1] | append[0] << 24; + block3[2] = append[0] >> 8 | append[1] << 24; + block3[3] = append[1] >> 8; + break; + + case 56: + block3[2] = append[0]; + block3[3] = append[1]; + break; + } +} + +#define AESSZ 16 // AES_BLOCK_SIZE + +#define BLSZ256 32 +#define BLSZ384 48 +#define BLSZ512 64 + +#define WORDSZ256 64 +#define WORDSZ384 128 +#define WORDSZ512 128 + +#define PWMAXSZ 32 // oclHashcat password length limit +#define BLMAXSZ BLSZ512 +#define WORDMAXSZ WORDSZ512 + +#define PWMAXSZ4 (PWMAXSZ / 4) +#define BLMAXSZ4 (BLMAXSZ / 4) +#define WORDMAXSZ4 (WORDMAXSZ / 4) +#define AESSZ4 (AESSZ / 4) + +__device__ static void make_sc (u32 *sc, const u32 *pw, const u32 pw_len, const u32 *bl, const u32 bl_len) +{ + const u32 bd = bl_len / 4; + + const u32 pm = pw_len % 4; + const u32 pd = pw_len / 4; + + u32 idx = 0; + + if (pm == 0) + { + for (u32 i = 0; i < pd; i++) sc[idx++] = pw[i]; + for (u32 i = 0; i < bd; i++) sc[idx++] = bl[i]; + for (u32 i = 0; i < 4; i++) sc[idx++] = sc[i]; + } + else + { + u32 pm4 = 4 - pm; + + int selector = (0x76543210 >> (pm4 * 4)) & 0xffff; + + u32 i; + + for (i = 0; i < pd; i++) sc[idx++] = pw[i]; + sc[idx++] = pw[i] + | __byte_perm ( 0, bl[0], selector); + for (i = 1; i < bd; i++) sc[idx++] = __byte_perm (bl[i - 1], bl[i], selector); + sc[idx++] = __byte_perm (bl[i - 1], sc[0], selector); + for (i = 1; i < 4; i++) sc[idx++] = __byte_perm (sc[i - 1], sc[i], selector); + sc[idx++] = __byte_perm (sc[i - 1], 0, selector); + } +} + +__device__ static void make_pt_with_offset (u32 *pt, const u32 offset, const u32 *sc, const u32 pwbl_len) +{ + const u32 m = offset % pwbl_len; + + const u32 om = m % 4; + const u32 od = m / 4; + + int selector = (0x76543210 >> (om * 4)) & 0xffff; + + pt[0] = __byte_perm (sc[od + 0], sc[od + 1], selector); + pt[1] = __byte_perm (sc[od + 1], sc[od + 2], selector); + pt[2] = __byte_perm (sc[od + 2], sc[od + 3], selector); + pt[3] = __byte_perm (sc[od + 3], sc[od + 4], selector); +} + +__device__ static void make_w_with_offset (ctx_t *ctx, const u32 W_len, const u32 offset, const u32 *sc, const u32 pwbl_len, u32 *iv, const u32 *rek, u32 s_te0[256], u32 s_te1[256], u32 s_te2[256], u32 s_te3[256], u32 s_te4[256]) +{ + for (u32 k = 0, wk = 0; k < W_len; k += AESSZ, wk += AESSZ4) + { + u32 pt[AESSZ4]; + + make_pt_with_offset (pt, offset + k, sc, pwbl_len); + + pt[0] ^= iv[0]; + pt[1] ^= iv[1]; + pt[2] ^= iv[2]; + pt[3] ^= iv[3]; + + AES128_encrypt (pt, iv, rek, s_te0, s_te1, s_te2, s_te3, s_te4); + + ctx->W32[wk + 0] = iv[0]; + ctx->W32[wk + 1] = iv[1]; + ctx->W32[wk + 2] = iv[2]; + ctx->W32[wk + 3] = iv[3]; + } +} + +__device__ static u32 do_round (const u32 *pw, const u32 pw_len, ctx_t *ctx, u32 s_te0[256], u32 s_te1[256], u32 s_te2[256], u32 s_te3[256], u32 s_te4[256]) +{ + // make scratch buffer + + u32 sc[PWMAXSZ4 + BLMAXSZ4 + AESSZ4]; + + make_sc (sc, pw, pw_len, ctx->dgst32, ctx->dgst_len); + + // make sure pwbl_len is calculcated before it gets changed + + const u32 pwbl_len = pw_len + ctx->dgst_len; + + // init iv + + u32 iv[AESSZ4]; + + iv[0] = ctx->dgst32[4]; + iv[1] = ctx->dgst32[5]; + iv[2] = ctx->dgst32[6]; + iv[3] = ctx->dgst32[7]; + + // init aes + + u32 rek[60]; + + AES128_ExpandKey (ctx->dgst32, rek, s_te0, s_te1, s_te2, s_te3, s_te4); + + // first call is special as the hash depends on the result of it + // but since we do not know about the outcome at this time + // we must use the max + + make_w_with_offset (ctx, WORDMAXSZ, 0, sc, pwbl_len, iv, rek, s_te0, s_te1, s_te2, s_te3, s_te4); + + // now we can find out hash to use + + u32 sum = 0; + + for (u32 i = 0; i < 4; i++) + { + sum += (ctx->W32[i] >> 24) & 0xff; + sum += (ctx->W32[i] >> 16) & 0xff; + sum += (ctx->W32[i] >> 8) & 0xff; + sum += (ctx->W32[i] >> 0) & 0xff; + } + + // init hash + + switch (sum % 3) + { + case 0: ctx->dgst32[0] = SHA256M_A; + ctx->dgst32[1] = SHA256M_B; + ctx->dgst32[2] = SHA256M_C; + ctx->dgst32[3] = SHA256M_D; + ctx->dgst32[4] = SHA256M_E; + ctx->dgst32[5] = SHA256M_F; + ctx->dgst32[6] = SHA256M_G; + ctx->dgst32[7] = SHA256M_H; + ctx->dgst_len = BLSZ256; + ctx->W_len = WORDSZ256; + sha256_transform (&ctx->W32[ 0], &ctx->W32[ 4], &ctx->W32[ 8], &ctx->W32[12], ctx->dgst32); + sha256_transform (&ctx->W32[16], &ctx->W32[20], &ctx->W32[24], &ctx->W32[28], ctx->dgst32); + break; + case 1: ctx->dgst64[0] = SHA384M_A; + ctx->dgst64[1] = SHA384M_B; + ctx->dgst64[2] = SHA384M_C; + ctx->dgst64[3] = SHA384M_D; + ctx->dgst64[4] = SHA384M_E; + ctx->dgst64[5] = SHA384M_F; + ctx->dgst64[6] = SHA384M_G; + ctx->dgst64[7] = SHA384M_H; + ctx->dgst_len = BLSZ384; + ctx->W_len = WORDSZ384; + sha384_transform (&ctx->W64[ 0], &ctx->W64[ 4], &ctx->W64[ 8], &ctx->W64[12], ctx->dgst64); + break; + case 2: ctx->dgst64[0] = SHA512M_A; + ctx->dgst64[1] = SHA512M_B; + ctx->dgst64[2] = SHA512M_C; + ctx->dgst64[3] = SHA512M_D; + ctx->dgst64[4] = SHA512M_E; + ctx->dgst64[5] = SHA512M_F; + ctx->dgst64[6] = SHA512M_G; + ctx->dgst64[7] = SHA512M_H; + ctx->dgst_len = BLSZ512; + ctx->W_len = WORDSZ512; + sha512_transform (&ctx->W64[ 0], &ctx->W64[ 4], &ctx->W64[ 8], &ctx->W64[12], ctx->dgst64); + break; + } + + // main loop + + const u32 final_len = pwbl_len * 64; + + const u32 iter_max = ctx->W_len - (ctx->W_len / 8); + + u32 offset; + u32 left; + + for (offset = WORDMAXSZ, left = final_len - offset; left >= iter_max; offset += ctx->W_len, left -= ctx->W_len) + { + make_w_with_offset (ctx, ctx->W_len, offset, sc, pwbl_len, iv, rek, s_te0, s_te1, s_te2, s_te3, s_te4); + + switch (ctx->dgst_len) + { + case BLSZ256: sha256_transform (&ctx->W32[ 0], &ctx->W32[ 4], &ctx->W32[ 8], &ctx->W32[12], ctx->dgst32); + break; + case BLSZ384: sha384_transform (&ctx->W64[ 0], &ctx->W64[ 4], &ctx->W64[ 8], &ctx->W64[12], ctx->dgst64); + break; + case BLSZ512: sha512_transform (&ctx->W64[ 0], &ctx->W64[ 4], &ctx->W64[ 8], &ctx->W64[12], ctx->dgst64); + break; + } + } + + u32 ex = 0; + + if (left) + { + switch (ctx->dgst_len) + { + case BLSZ384: make_w_with_offset (ctx, 64, offset, sc, pwbl_len, iv, rek, s_te0, s_te1, s_te2, s_te3, s_te4); + ctx->W64[ 8] = 0x80; + ctx->W64[ 9] = 0; + ctx->W64[10] = 0; + ctx->W64[11] = 0; + ctx->W64[12] = 0; + ctx->W64[13] = 0; + ctx->W64[14] = 0; + ctx->W64[15] = swap_workaround ((u64) (final_len * 8)); + ex = ctx->W64[7] >> 56; + break; + case BLSZ512: make_w_with_offset (ctx, 64, offset, sc, pwbl_len, iv, rek, s_te0, s_te1, s_te2, s_te3, s_te4); + ctx->W64[ 8] = 0x80; + ctx->W64[ 9] = 0; + ctx->W64[10] = 0; + ctx->W64[11] = 0; + ctx->W64[12] = 0; + ctx->W64[13] = 0; + ctx->W64[14] = 0; + ctx->W64[15] = swap_workaround ((u64) (final_len * 8)); + ex = ctx->W64[7] >> 56; + break; + } + } + else + { + switch (ctx->dgst_len) + { + case BLSZ256: ex = ctx->W32[15] >> 24; + ctx->W32[ 0] = 0x80; + ctx->W32[ 1] = 0; + ctx->W32[ 2] = 0; + ctx->W32[ 3] = 0; + ctx->W32[ 4] = 0; + ctx->W32[ 5] = 0; + ctx->W32[ 6] = 0; + ctx->W32[ 7] = 0; + ctx->W32[ 8] = 0; + ctx->W32[ 9] = 0; + ctx->W32[10] = 0; + ctx->W32[11] = 0; + ctx->W32[12] = 0; + ctx->W32[13] = 0; + ctx->W32[14] = 0; + ctx->W32[15] = swap_workaround (final_len * 8); + break; + case BLSZ384: ex = ctx->W64[15] >> 56; + ctx->W64[ 0] = 0x80; + ctx->W64[ 1] = 0; + ctx->W64[ 2] = 0; + ctx->W64[ 3] = 0; + ctx->W64[ 4] = 0; + ctx->W64[ 5] = 0; + ctx->W64[ 6] = 0; + ctx->W64[ 7] = 0; + ctx->W64[ 8] = 0; + ctx->W64[ 9] = 0; + ctx->W64[10] = 0; + ctx->W64[11] = 0; + ctx->W64[12] = 0; + ctx->W64[13] = 0; + ctx->W64[14] = 0; + ctx->W64[15] = swap_workaround ((u64) (final_len * 8)); + break; + case BLSZ512: ex = ctx->W64[15] >> 56; + ctx->W64[ 0] = 0x80; + ctx->W64[ 1] = 0; + ctx->W64[ 2] = 0; + ctx->W64[ 3] = 0; + ctx->W64[ 4] = 0; + ctx->W64[ 5] = 0; + ctx->W64[ 6] = 0; + ctx->W64[ 7] = 0; + ctx->W64[ 8] = 0; + ctx->W64[ 9] = 0; + ctx->W64[10] = 0; + ctx->W64[11] = 0; + ctx->W64[12] = 0; + ctx->W64[13] = 0; + ctx->W64[14] = 0; + ctx->W64[15] = swap_workaround ((u64) (final_len * 8)); + break; + } + } + + switch (ctx->dgst_len) + { + case BLSZ256: sha256_transform (&ctx->W32[ 0], &ctx->W32[ 4], &ctx->W32[ 8], &ctx->W32[12], ctx->dgst32); + ctx->dgst32[ 0] = swap_workaround (ctx->dgst32[0]); + ctx->dgst32[ 1] = swap_workaround (ctx->dgst32[1]); + ctx->dgst32[ 2] = swap_workaround (ctx->dgst32[2]); + ctx->dgst32[ 3] = swap_workaround (ctx->dgst32[3]); + ctx->dgst32[ 4] = swap_workaround (ctx->dgst32[4]); + ctx->dgst32[ 5] = swap_workaround (ctx->dgst32[5]); + ctx->dgst32[ 6] = swap_workaround (ctx->dgst32[6]); + ctx->dgst32[ 7] = swap_workaround (ctx->dgst32[7]); + ctx->dgst32[ 8] = 0; + ctx->dgst32[ 9] = 0; + ctx->dgst32[10] = 0; + ctx->dgst32[11] = 0; + ctx->dgst32[12] = 0; + ctx->dgst32[13] = 0; + ctx->dgst32[14] = 0; + ctx->dgst32[15] = 0; + break; + case BLSZ384: sha384_transform (&ctx->W64[ 0], &ctx->W64[ 4], &ctx->W64[ 8], &ctx->W64[12], ctx->dgst64); + ctx->dgst64[0] = swap_workaround (ctx->dgst64[0]); + ctx->dgst64[1] = swap_workaround (ctx->dgst64[1]); + ctx->dgst64[2] = swap_workaround (ctx->dgst64[2]); + ctx->dgst64[3] = swap_workaround (ctx->dgst64[3]); + ctx->dgst64[4] = swap_workaround (ctx->dgst64[4]); + ctx->dgst64[5] = swap_workaround (ctx->dgst64[5]); + ctx->dgst64[6] = 0; + ctx->dgst64[7] = 0; + break; + case BLSZ512: sha512_transform (&ctx->W64[ 0], &ctx->W64[ 4], &ctx->W64[ 8], &ctx->W64[12], ctx->dgst64); + ctx->dgst64[0] = swap_workaround (ctx->dgst64[0]); + ctx->dgst64[1] = swap_workaround (ctx->dgst64[1]); + ctx->dgst64[2] = swap_workaround (ctx->dgst64[2]); + ctx->dgst64[3] = swap_workaround (ctx->dgst64[3]); + ctx->dgst64[4] = swap_workaround (ctx->dgst64[4]); + ctx->dgst64[5] = swap_workaround (ctx->dgst64[5]); + ctx->dgst64[6] = swap_workaround (ctx->dgst64[6]); + ctx->dgst64[7] = swap_workaround (ctx->dgst64[7]); + break; + } + + return ex; +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m10700_init (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, pdf17l8_tmp_t *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const pdf_t *pdf_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[0]; + w0[1] = pws[gid].i[1]; + w0[2] = pws[gid].i[2]; + w0[3] = pws[gid].i[3]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * salt + */ + + u32 salt_buf[2]; + + salt_buf[0] = salt_bufs[salt_pos].salt_buf[0]; + salt_buf[1] = salt_bufs[salt_pos].salt_buf[1]; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + /** + * init + */ + + u32 block_len = pw_len; + + u32x block0[4]; + + block0[0] = w0[0]; + block0[1] = w0[1]; + block0[2] = w0[2]; + block0[3] = w0[3]; + + u32x block1[4]; + + block1[0] = 0; + block1[1] = 0; + block1[2] = 0; + block1[3] = 0; + + u32x block2[4]; + + block2[0] = 0; + block2[1] = 0; + block2[2] = 0; + block2[3] = 0; + + u32x block3[4]; + + block3[0] = 0; + block3[1] = 0; + block3[2] = 0; + block3[3] = 0; + + memcat8 (block0, block1, block2, block3, block_len, salt_buf); + + block_len += salt_len; + + append_0x80_2 (block0, block1, block_len); + + block3[3] = swap_workaround (block_len * 8); + + u32x digest[8]; + + digest[0] = SHA256M_A; + digest[1] = SHA256M_B; + digest[2] = SHA256M_C; + digest[3] = SHA256M_D; + digest[4] = SHA256M_E; + digest[5] = SHA256M_F; + digest[6] = SHA256M_G; + digest[7] = SHA256M_H; + + sha256_transform (block0, block1, block2, block3, digest); + + digest[0] = swap_workaround (digest[0]); + digest[1] = swap_workaround (digest[1]); + digest[2] = swap_workaround (digest[2]); + digest[3] = swap_workaround (digest[3]); + digest[4] = swap_workaround (digest[4]); + digest[5] = swap_workaround (digest[5]); + digest[6] = swap_workaround (digest[6]); + digest[7] = swap_workaround (digest[7]); + + tmps[gid].dgst32[0] = digest[0]; + tmps[gid].dgst32[1] = digest[1]; + tmps[gid].dgst32[2] = digest[2]; + tmps[gid].dgst32[3] = digest[3]; + tmps[gid].dgst32[4] = digest[4]; + tmps[gid].dgst32[5] = digest[5]; + tmps[gid].dgst32[6] = digest[6]; + tmps[gid].dgst32[7] = digest[7]; + tmps[gid].dgst_len = BLSZ256; + tmps[gid].W_len = WORDSZ256; +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m10700_loop (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, pdf17l8_tmp_t *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const pdf_t *pdf_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + const u32 lid = threadIdx.x; + + /** + * aes shared + */ + + __shared__ u32 s_te0[256]; + __shared__ u32 s_te1[256]; + __shared__ u32 s_te2[256]; + __shared__ u32 s_te3[256]; + __shared__ u32 s_te4[256]; + + s_te0[lid] = te0[lid]; + s_te1[lid] = te1[lid]; + s_te2[lid] = te2[lid]; + s_te3[lid] = te3[lid]; + s_te4[lid] = te4[lid]; + + __syncthreads (); + + if (gid >= gid_max) return; + + /** + * base + */ + + u32x w0[4]; + + w0[0] = pws[gid].i[0]; + w0[1] = pws[gid].i[1]; + w0[2] = pws[gid].i[2]; + w0[3] = pws[gid].i[3]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * digest + */ + + ctx_t ctx; + + ctx.dgst64[0] = tmps[gid].dgst64[0]; + ctx.dgst64[1] = tmps[gid].dgst64[1]; + ctx.dgst64[2] = tmps[gid].dgst64[2]; + ctx.dgst64[3] = tmps[gid].dgst64[3]; + ctx.dgst64[4] = tmps[gid].dgst64[4]; + ctx.dgst64[5] = tmps[gid].dgst64[5]; + ctx.dgst64[6] = tmps[gid].dgst64[6]; + ctx.dgst64[7] = tmps[gid].dgst64[7]; + ctx.dgst_len = tmps[gid].dgst_len; + ctx.W_len = tmps[gid].W_len; + + u32 ex = 0; + + for (u32 i = 0, j = loop_pos; i < loop_cnt; i++, j++) + { + ex = do_round (w0, pw_len, &ctx, s_te0, s_te1, s_te2, s_te3, s_te4); + } + + if ((loop_pos + loop_cnt) == 64) + { + for (u32 i = 64; i < ex + 32; i++) + { + ex = do_round (w0, pw_len, &ctx, s_te0, s_te1, s_te2, s_te3, s_te4); + } + } + + tmps[gid].dgst64[0] = ctx.dgst64[0]; + tmps[gid].dgst64[1] = ctx.dgst64[1]; + tmps[gid].dgst64[2] = ctx.dgst64[2]; + tmps[gid].dgst64[3] = ctx.dgst64[3]; + tmps[gid].dgst64[4] = ctx.dgst64[4]; + tmps[gid].dgst64[5] = ctx.dgst64[5]; + tmps[gid].dgst64[6] = ctx.dgst64[6]; + tmps[gid].dgst64[7] = ctx.dgst64[7]; + tmps[gid].dgst_len = ctx.dgst_len; + tmps[gid].W_len = ctx.W_len; +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m10700_comp (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, pdf17l8_tmp_t *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const pdf_t *pdf_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + const u32 lid = threadIdx.x; + + /** + * digest + */ + + const u32x r0 = swap_workaround (tmps[gid].dgst32[DGST_R0]); + const u32x r1 = swap_workaround (tmps[gid].dgst32[DGST_R1]); + const u32x r2 = swap_workaround (tmps[gid].dgst32[DGST_R2]); + const u32x r3 = swap_workaround (tmps[gid].dgst32[DGST_R3]); + + #define il_pos 0 + + #include VECT_COMPARE_M +} diff --git a/nv/m10800_a0.cu b/nv/m10800_a0.cu new file mode 100644 index 0000000000..060e048787 --- /dev/null +++ b/nv/m10800_a0.cu @@ -0,0 +1,429 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _SHA384_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW2 +#define VECT_SIZE1 +#endif + +#define DGST_R0 6 +#define DGST_R1 7 +#define DGST_R2 4 +#define DGST_R3 5 + +#include "include/kernel_functions.c" +#include "types_nv.c" +#include "common_nv.c" +#include "include/rp_gpu.h" +#include "rp_nv.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +__device__ __constant__ gpu_rule_t c_rules[1024]; + +__device__ __constant__ u64 k_sha384[80] = +{ + SHA384C00, SHA384C01, SHA384C02, SHA384C03, + SHA384C04, SHA384C05, SHA384C06, SHA384C07, + SHA384C08, SHA384C09, SHA384C0a, SHA384C0b, + SHA384C0c, SHA384C0d, SHA384C0e, SHA384C0f, + SHA384C10, SHA384C11, SHA384C12, SHA384C13, + SHA384C14, SHA384C15, SHA384C16, SHA384C17, + SHA384C18, SHA384C19, SHA384C1a, SHA384C1b, + SHA384C1c, SHA384C1d, SHA384C1e, SHA384C1f, + SHA384C20, SHA384C21, SHA384C22, SHA384C23, + SHA384C24, SHA384C25, SHA384C26, SHA384C27, + SHA384C28, SHA384C29, SHA384C2a, SHA384C2b, + SHA384C2c, SHA384C2d, SHA384C2e, SHA384C2f, + SHA384C30, SHA384C31, SHA384C32, SHA384C33, + SHA384C34, SHA384C35, SHA384C36, SHA384C37, + SHA384C38, SHA384C39, SHA384C3a, SHA384C3b, + SHA384C3c, SHA384C3d, SHA384C3e, SHA384C3f, + SHA384C40, SHA384C41, SHA384C42, SHA384C43, + SHA384C44, SHA384C45, SHA384C46, SHA384C47, + SHA384C48, SHA384C49, SHA384C4a, SHA384C4b, + SHA384C4c, SHA384C4d, SHA384C4e, SHA384C4f, +}; + +__device__ static void sha384_transform (const u32x w0[4], const u32x w1[4], const u32x w2[4], const u32x w3[4], u64x digest[8]) +{ + u64x w0_t = hl32_to_64 (w0[0], w0[1]); + u64x w1_t = hl32_to_64 (w0[2], w0[3]); + u64x w2_t = hl32_to_64 (w1[0], w1[1]); + u64x w3_t = hl32_to_64 (w1[2], w1[3]); + u64x w4_t = hl32_to_64 (w2[0], w2[1]); + u64x w5_t = hl32_to_64 (w2[2], w2[3]); + u64x w6_t = hl32_to_64 (w3[0], w3[1]); + u64x w7_t = 0; + u64x w8_t = 0; + u64x w9_t = 0; + u64x wa_t = 0; + u64x wb_t = 0; + u64x wc_t = 0; + u64x wd_t = 0; + u64x we_t = 0; + u64x wf_t = hl32_to_64 (w3[2], w3[3]); + + u64x a = digest[0]; + u64x b = digest[1]; + u64x c = digest[2]; + u64x d = digest[3]; + u64x e = digest[4]; + u64x f = digest[5]; + u64x g = digest[6]; + u64x h = digest[7]; + + #define ROUND_EXPAND() \ + { \ + w0_t = SHA384_EXPAND (we_t, w9_t, w1_t, w0_t); \ + w1_t = SHA384_EXPAND (wf_t, wa_t, w2_t, w1_t); \ + w2_t = SHA384_EXPAND (w0_t, wb_t, w3_t, w2_t); \ + w3_t = SHA384_EXPAND (w1_t, wc_t, w4_t, w3_t); \ + w4_t = SHA384_EXPAND (w2_t, wd_t, w5_t, w4_t); \ + w5_t = SHA384_EXPAND (w3_t, we_t, w6_t, w5_t); \ + w6_t = SHA384_EXPAND (w4_t, wf_t, w7_t, w6_t); \ + w7_t = SHA384_EXPAND (w5_t, w0_t, w8_t, w7_t); \ + w8_t = SHA384_EXPAND (w6_t, w1_t, w9_t, w8_t); \ + w9_t = SHA384_EXPAND (w7_t, w2_t, wa_t, w9_t); \ + wa_t = SHA384_EXPAND (w8_t, w3_t, wb_t, wa_t); \ + wb_t = SHA384_EXPAND (w9_t, w4_t, wc_t, wb_t); \ + wc_t = SHA384_EXPAND (wa_t, w5_t, wd_t, wc_t); \ + wd_t = SHA384_EXPAND (wb_t, w6_t, we_t, wd_t); \ + we_t = SHA384_EXPAND (wc_t, w7_t, wf_t, we_t); \ + wf_t = SHA384_EXPAND (wd_t, w8_t, w0_t, wf_t); \ + } + + #define ROUND_STEP(i) \ + { \ + SHA384_STEP (SHA384_F0o, SHA384_F1o, a, b, c, d, e, f, g, h, w0_t, k_sha384[i + 0]); \ + SHA384_STEP (SHA384_F0o, SHA384_F1o, h, a, b, c, d, e, f, g, w1_t, k_sha384[i + 1]); \ + SHA384_STEP (SHA384_F0o, SHA384_F1o, g, h, a, b, c, d, e, f, w2_t, k_sha384[i + 2]); \ + SHA384_STEP (SHA384_F0o, SHA384_F1o, f, g, h, a, b, c, d, e, w3_t, k_sha384[i + 3]); \ + SHA384_STEP (SHA384_F0o, SHA384_F1o, e, f, g, h, a, b, c, d, w4_t, k_sha384[i + 4]); \ + SHA384_STEP (SHA384_F0o, SHA384_F1o, d, e, f, g, h, a, b, c, w5_t, k_sha384[i + 5]); \ + SHA384_STEP (SHA384_F0o, SHA384_F1o, c, d, e, f, g, h, a, b, w6_t, k_sha384[i + 6]); \ + SHA384_STEP (SHA384_F0o, SHA384_F1o, b, c, d, e, f, g, h, a, w7_t, k_sha384[i + 7]); \ + SHA384_STEP (SHA384_F0o, SHA384_F1o, a, b, c, d, e, f, g, h, w8_t, k_sha384[i + 8]); \ + SHA384_STEP (SHA384_F0o, SHA384_F1o, h, a, b, c, d, e, f, g, w9_t, k_sha384[i + 9]); \ + SHA384_STEP (SHA384_F0o, SHA384_F1o, g, h, a, b, c, d, e, f, wa_t, k_sha384[i + 10]); \ + SHA384_STEP (SHA384_F0o, SHA384_F1o, f, g, h, a, b, c, d, e, wb_t, k_sha384[i + 11]); \ + SHA384_STEP (SHA384_F0o, SHA384_F1o, e, f, g, h, a, b, c, d, wc_t, k_sha384[i + 12]); \ + SHA384_STEP (SHA384_F0o, SHA384_F1o, d, e, f, g, h, a, b, c, wd_t, k_sha384[i + 13]); \ + SHA384_STEP (SHA384_F0o, SHA384_F1o, c, d, e, f, g, h, a, b, we_t, k_sha384[i + 14]); \ + SHA384_STEP (SHA384_F0o, SHA384_F1o, b, c, d, e, f, g, h, a, wf_t, k_sha384[i + 15]); \ + } + + ROUND_STEP (0); + + for (int i = 16; i < 80; i += 16) + { + ROUND_EXPAND (); ROUND_STEP (i); + } + + /* rev + digest[0] += a; + digest[1] += b; + digest[2] += c; + digest[3] += d; + digest[4] += e; + digest[5] += f; + digest[6] += g; + digest[7] += h; + */ + + digest[0] = a; + digest[1] = b; + digest[2] = c; + digest[3] = d; + digest[4] = e; + digest[5] = f; + digest[6] = 0; + digest[7] = 0; +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m10800_m04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + u32x pw_buf1[4]; + + pw_buf1[0] = pws[gid].i[ 4]; + pw_buf1[1] = pws[gid].i[ 5]; + pw_buf1[2] = pws[gid].i[ 6]; + pw_buf1[3] = pws[gid].i[ 7]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + + w0[0] = pw_buf0[0]; + w0[1] = pw_buf0[1]; + w0[2] = pw_buf0[2]; + w0[3] = pw_buf0[3]; + + u32x w1[4]; + + w1[0] = pw_buf1[0]; + w1[1] = pw_buf1[1]; + w1[2] = pw_buf1[2]; + w1[3] = pw_buf1[3]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 out_len = apply_rules (c_rules[il_pos].cmds, w0, w1, pw_len); + + append_0x80_2 (w0, w1, out_len); + + /** + * SHA384 + */ + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + w0_t[0] = swap_workaround (w0[0]); + w0_t[1] = swap_workaround (w0[1]); + w0_t[2] = swap_workaround (w0[2]); + w0_t[3] = swap_workaround (w0[3]); + w1_t[0] = swap_workaround (w1[0]); + w1_t[1] = swap_workaround (w1[1]); + w1_t[2] = swap_workaround (w1[2]); + w1_t[3] = swap_workaround (w1[3]); + w2_t[0] = swap_workaround (w2[0]); + w2_t[1] = swap_workaround (w2[1]); + w2_t[2] = swap_workaround (w2[2]); + w2_t[3] = swap_workaround (w2[3]); + w3_t[0] = swap_workaround (w3[0]); + w3_t[1] = swap_workaround (w3[1]); + w3_t[2] = 0; + w3_t[3] = out_len * 8; + + u64x digest[8]; + + digest[0] = SHA384M_A; + digest[1] = SHA384M_B; + digest[2] = SHA384M_C; + digest[3] = SHA384M_D; + digest[4] = SHA384M_E; + digest[5] = SHA384M_F; + digest[6] = SHA384M_G; + digest[7] = SHA384M_H; + + sha384_transform (w0_t, w1_t, w2_t, w3_t, digest); + + const u32x r0 = l32_from_64 (digest[3]); + const u32x r1 = h32_from_64 (digest[3]); + const u32x r2 = l32_from_64 (digest[2]); + const u32x r3 = h32_from_64 (digest[2]); + + #include VECT_COMPARE_M + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m10800_m08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m10800_m16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m10800_s04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + u32x pw_buf1[4]; + + pw_buf1[0] = pws[gid].i[ 4]; + pw_buf1[1] = pws[gid].i[ 5]; + pw_buf1[2] = pws[gid].i[ 6]; + pw_buf1[3] = pws[gid].i[ 7]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + + w0[0] = pw_buf0[0]; + w0[1] = pw_buf0[1]; + w0[2] = pw_buf0[2]; + w0[3] = pw_buf0[3]; + + u32x w1[4]; + + w1[0] = pw_buf1[0]; + w1[1] = pw_buf1[1]; + w1[2] = pw_buf1[2]; + w1[3] = pw_buf1[3]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 out_len = apply_rules (c_rules[il_pos].cmds, w0, w1, pw_len); + + append_0x80_2 (w0, w1, out_len); + + /** + * SHA384 + */ + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + w0_t[0] = swap_workaround (w0[0]); + w0_t[1] = swap_workaround (w0[1]); + w0_t[2] = swap_workaround (w0[2]); + w0_t[3] = swap_workaround (w0[3]); + w1_t[0] = swap_workaround (w1[0]); + w1_t[1] = swap_workaround (w1[1]); + w1_t[2] = swap_workaround (w1[2]); + w1_t[3] = swap_workaround (w1[3]); + w2_t[0] = swap_workaround (w2[0]); + w2_t[1] = swap_workaround (w2[1]); + w2_t[2] = swap_workaround (w2[2]); + w2_t[3] = swap_workaround (w2[3]); + w3_t[0] = swap_workaround (w3[0]); + w3_t[1] = swap_workaround (w3[1]); + w3_t[2] = 0; + w3_t[3] = out_len * 8; + + u64x digest[8]; + + digest[0] = SHA384M_A; + digest[1] = SHA384M_B; + digest[2] = SHA384M_C; + digest[3] = SHA384M_D; + digest[4] = SHA384M_E; + digest[5] = SHA384M_F; + digest[6] = SHA384M_G; + digest[7] = SHA384M_H; + + sha384_transform (w0_t, w1_t, w2_t, w3_t, digest); + + const u32x r0 = l32_from_64 (digest[3]); + const u32x r1 = h32_from_64 (digest[3]); + const u32x r2 = l32_from_64 (digest[2]); + const u32x r3 = h32_from_64 (digest[2]); + + #include VECT_COMPARE_S + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m10800_s08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m10800_s16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/nv/m10800_a1.cu b/nv/m10800_a1.cu new file mode 100644 index 0000000000..19b4e18b98 --- /dev/null +++ b/nv/m10800_a1.cu @@ -0,0 +1,527 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _SHA384_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW2 +#define VECT_SIZE1 +#endif + +#define DGST_R0 6 +#define DGST_R1 7 +#define DGST_R2 4 +#define DGST_R3 5 + +#include "include/kernel_functions.c" +#include "types_nv.c" +#include "common_nv.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +__device__ __constant__ comb_t c_combs[1024]; + +__device__ __constant__ u64 k_sha384[80] = +{ + SHA384C00, SHA384C01, SHA384C02, SHA384C03, + SHA384C04, SHA384C05, SHA384C06, SHA384C07, + SHA384C08, SHA384C09, SHA384C0a, SHA384C0b, + SHA384C0c, SHA384C0d, SHA384C0e, SHA384C0f, + SHA384C10, SHA384C11, SHA384C12, SHA384C13, + SHA384C14, SHA384C15, SHA384C16, SHA384C17, + SHA384C18, SHA384C19, SHA384C1a, SHA384C1b, + SHA384C1c, SHA384C1d, SHA384C1e, SHA384C1f, + SHA384C20, SHA384C21, SHA384C22, SHA384C23, + SHA384C24, SHA384C25, SHA384C26, SHA384C27, + SHA384C28, SHA384C29, SHA384C2a, SHA384C2b, + SHA384C2c, SHA384C2d, SHA384C2e, SHA384C2f, + SHA384C30, SHA384C31, SHA384C32, SHA384C33, + SHA384C34, SHA384C35, SHA384C36, SHA384C37, + SHA384C38, SHA384C39, SHA384C3a, SHA384C3b, + SHA384C3c, SHA384C3d, SHA384C3e, SHA384C3f, + SHA384C40, SHA384C41, SHA384C42, SHA384C43, + SHA384C44, SHA384C45, SHA384C46, SHA384C47, + SHA384C48, SHA384C49, SHA384C4a, SHA384C4b, + SHA384C4c, SHA384C4d, SHA384C4e, SHA384C4f, +}; + +__device__ static void sha384_transform (const u32x w0[4], const u32x w1[4], const u32x w2[4], const u32x w3[4], u64x digest[8]) +{ + u64x w0_t = hl32_to_64 (w0[0], w0[1]); + u64x w1_t = hl32_to_64 (w0[2], w0[3]); + u64x w2_t = hl32_to_64 (w1[0], w1[1]); + u64x w3_t = hl32_to_64 (w1[2], w1[3]); + u64x w4_t = hl32_to_64 (w2[0], w2[1]); + u64x w5_t = hl32_to_64 (w2[2], w2[3]); + u64x w6_t = hl32_to_64 (w3[0], w3[1]); + u64x w7_t = 0; + u64x w8_t = 0; + u64x w9_t = 0; + u64x wa_t = 0; + u64x wb_t = 0; + u64x wc_t = 0; + u64x wd_t = 0; + u64x we_t = 0; + u64x wf_t = hl32_to_64 (w3[2], w3[3]); + + u64x a = digest[0]; + u64x b = digest[1]; + u64x c = digest[2]; + u64x d = digest[3]; + u64x e = digest[4]; + u64x f = digest[5]; + u64x g = digest[6]; + u64x h = digest[7]; + + #define ROUND_EXPAND() \ + { \ + w0_t = SHA384_EXPAND (we_t, w9_t, w1_t, w0_t); \ + w1_t = SHA384_EXPAND (wf_t, wa_t, w2_t, w1_t); \ + w2_t = SHA384_EXPAND (w0_t, wb_t, w3_t, w2_t); \ + w3_t = SHA384_EXPAND (w1_t, wc_t, w4_t, w3_t); \ + w4_t = SHA384_EXPAND (w2_t, wd_t, w5_t, w4_t); \ + w5_t = SHA384_EXPAND (w3_t, we_t, w6_t, w5_t); \ + w6_t = SHA384_EXPAND (w4_t, wf_t, w7_t, w6_t); \ + w7_t = SHA384_EXPAND (w5_t, w0_t, w8_t, w7_t); \ + w8_t = SHA384_EXPAND (w6_t, w1_t, w9_t, w8_t); \ + w9_t = SHA384_EXPAND (w7_t, w2_t, wa_t, w9_t); \ + wa_t = SHA384_EXPAND (w8_t, w3_t, wb_t, wa_t); \ + wb_t = SHA384_EXPAND (w9_t, w4_t, wc_t, wb_t); \ + wc_t = SHA384_EXPAND (wa_t, w5_t, wd_t, wc_t); \ + wd_t = SHA384_EXPAND (wb_t, w6_t, we_t, wd_t); \ + we_t = SHA384_EXPAND (wc_t, w7_t, wf_t, we_t); \ + wf_t = SHA384_EXPAND (wd_t, w8_t, w0_t, wf_t); \ + } + + #define ROUND_STEP(i) \ + { \ + SHA384_STEP (SHA384_F0o, SHA384_F1o, a, b, c, d, e, f, g, h, w0_t, k_sha384[i + 0]); \ + SHA384_STEP (SHA384_F0o, SHA384_F1o, h, a, b, c, d, e, f, g, w1_t, k_sha384[i + 1]); \ + SHA384_STEP (SHA384_F0o, SHA384_F1o, g, h, a, b, c, d, e, f, w2_t, k_sha384[i + 2]); \ + SHA384_STEP (SHA384_F0o, SHA384_F1o, f, g, h, a, b, c, d, e, w3_t, k_sha384[i + 3]); \ + SHA384_STEP (SHA384_F0o, SHA384_F1o, e, f, g, h, a, b, c, d, w4_t, k_sha384[i + 4]); \ + SHA384_STEP (SHA384_F0o, SHA384_F1o, d, e, f, g, h, a, b, c, w5_t, k_sha384[i + 5]); \ + SHA384_STEP (SHA384_F0o, SHA384_F1o, c, d, e, f, g, h, a, b, w6_t, k_sha384[i + 6]); \ + SHA384_STEP (SHA384_F0o, SHA384_F1o, b, c, d, e, f, g, h, a, w7_t, k_sha384[i + 7]); \ + SHA384_STEP (SHA384_F0o, SHA384_F1o, a, b, c, d, e, f, g, h, w8_t, k_sha384[i + 8]); \ + SHA384_STEP (SHA384_F0o, SHA384_F1o, h, a, b, c, d, e, f, g, w9_t, k_sha384[i + 9]); \ + SHA384_STEP (SHA384_F0o, SHA384_F1o, g, h, a, b, c, d, e, f, wa_t, k_sha384[i + 10]); \ + SHA384_STEP (SHA384_F0o, SHA384_F1o, f, g, h, a, b, c, d, e, wb_t, k_sha384[i + 11]); \ + SHA384_STEP (SHA384_F0o, SHA384_F1o, e, f, g, h, a, b, c, d, wc_t, k_sha384[i + 12]); \ + SHA384_STEP (SHA384_F0o, SHA384_F1o, d, e, f, g, h, a, b, c, wd_t, k_sha384[i + 13]); \ + SHA384_STEP (SHA384_F0o, SHA384_F1o, c, d, e, f, g, h, a, b, we_t, k_sha384[i + 14]); \ + SHA384_STEP (SHA384_F0o, SHA384_F1o, b, c, d, e, f, g, h, a, wf_t, k_sha384[i + 15]); \ + } + + ROUND_STEP (0); + + for (int i = 16; i < 80; i += 16) + { + ROUND_EXPAND (); ROUND_STEP (i); + } + + /* rev + digest[0] += a; + digest[1] += b; + digest[2] += c; + digest[3] += d; + digest[4] += e; + digest[5] += f; + digest[6] += g; + digest[7] += h; + */ + + digest[0] = a; + digest[1] = b; + digest[2] = c; + digest[3] = d; + digest[4] = e; + digest[5] = f; + digest[6] = 0; + digest[7] = 0; +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m10800_m04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + append_0x80_2 (wordl0, wordl1, pw_l_len); + + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, c_combs[0].pw_len); + } + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = c_combs[il_pos].pw_len; + + const u32 pw_len = pw_l_len + pw_r_len; + + u32 wordr0[4]; + + wordr0[0] = c_combs[il_pos].i[0]; + wordr0[1] = c_combs[il_pos].i[1]; + wordr0[2] = c_combs[il_pos].i[2]; + wordr0[3] = c_combs[il_pos].i[3]; + + u32 wordr1[4]; + + wordr1[0] = c_combs[il_pos].i[4]; + wordr1[1] = c_combs[il_pos].i[5]; + wordr1[2] = c_combs[il_pos].i[6]; + wordr1[3] = c_combs[il_pos].i[7]; + + u32 wordr2[4]; + + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + + u32 wordr3[4]; + + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + append_0x80_2 (wordr0, wordr1, pw_r_len); + + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + u32x w0[4]; + u32x w1[4]; + u32x w2[4]; + u32x w3[4]; + + w0[0] = wordl0[0] | wordr0[0]; + w0[1] = wordl0[1] | wordr0[1]; + w0[2] = wordl0[2] | wordr0[2]; + w0[3] = wordl0[3] | wordr0[3]; + w1[0] = wordl1[0] | wordr1[0]; + w1[1] = wordl1[1] | wordr1[1]; + w1[2] = wordl1[2] | wordr1[2]; + w1[3] = wordl1[3] | wordr1[3]; + w2[0] = wordl2[0] | wordr2[0]; + w2[1] = wordl2[1] | wordr2[1]; + w2[2] = wordl2[2] | wordr2[2]; + w2[3] = wordl2[3] | wordr2[3]; + w3[0] = wordl3[0] | wordr3[0]; + w3[1] = wordl3[1] | wordr3[1]; + w3[2] = wordl3[2] | wordr3[2]; + w3[3] = wordl3[3] | wordr3[3]; + + /** + * SHA384 + */ + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + w0_t[0] = swap_workaround (w0[0]); + w0_t[1] = swap_workaround (w0[1]); + w0_t[2] = swap_workaround (w0[2]); + w0_t[3] = swap_workaround (w0[3]); + w1_t[0] = swap_workaround (w1[0]); + w1_t[1] = swap_workaround (w1[1]); + w1_t[2] = swap_workaround (w1[2]); + w1_t[3] = swap_workaround (w1[3]); + w2_t[0] = swap_workaround (w2[0]); + w2_t[1] = swap_workaround (w2[1]); + w2_t[2] = swap_workaround (w2[2]); + w2_t[3] = swap_workaround (w2[3]); + w3_t[0] = swap_workaround (w3[0]); + w3_t[1] = swap_workaround (w3[1]); + w3_t[2] = 0; + w3_t[3] = pw_len * 8; + + u64x digest[8]; + + digest[0] = SHA384M_A; + digest[1] = SHA384M_B; + digest[2] = SHA384M_C; + digest[3] = SHA384M_D; + digest[4] = SHA384M_E; + digest[5] = SHA384M_F; + digest[6] = SHA384M_G; + digest[7] = SHA384M_H; + + sha384_transform (w0_t, w1_t, w2_t, w3_t, digest); + + const u32x r0 = l32_from_64 (digest[3]); + const u32x r1 = h32_from_64 (digest[3]); + const u32x r2 = l32_from_64 (digest[2]); + const u32x r3 = h32_from_64 (digest[2]); + + #include VECT_COMPARE_M + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m10800_m08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m10800_m16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m10800_s04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + append_0x80_2 (wordl0, wordl1, pw_l_len); + + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, c_combs[0].pw_len); + } + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = c_combs[il_pos].pw_len; + + const u32 pw_len = pw_l_len + pw_r_len; + + u32 wordr0[4]; + + wordr0[0] = c_combs[il_pos].i[0]; + wordr0[1] = c_combs[il_pos].i[1]; + wordr0[2] = c_combs[il_pos].i[2]; + wordr0[3] = c_combs[il_pos].i[3]; + + u32 wordr1[4]; + + wordr1[0] = c_combs[il_pos].i[4]; + wordr1[1] = c_combs[il_pos].i[5]; + wordr1[2] = c_combs[il_pos].i[6]; + wordr1[3] = c_combs[il_pos].i[7]; + + u32 wordr2[4]; + + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + + u32 wordr3[4]; + + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + append_0x80_2 (wordr0, wordr1, pw_r_len); + + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + u32x w0[4]; + u32x w1[4]; + u32x w2[4]; + u32x w3[4]; + + w0[0] = wordl0[0] | wordr0[0]; + w0[1] = wordl0[1] | wordr0[1]; + w0[2] = wordl0[2] | wordr0[2]; + w0[3] = wordl0[3] | wordr0[3]; + w1[0] = wordl1[0] | wordr1[0]; + w1[1] = wordl1[1] | wordr1[1]; + w1[2] = wordl1[2] | wordr1[2]; + w1[3] = wordl1[3] | wordr1[3]; + w2[0] = wordl2[0] | wordr2[0]; + w2[1] = wordl2[1] | wordr2[1]; + w2[2] = wordl2[2] | wordr2[2]; + w2[3] = wordl2[3] | wordr2[3]; + w3[0] = wordl3[0] | wordr3[0]; + w3[1] = wordl3[1] | wordr3[1]; + w3[2] = wordl3[2] | wordr3[2]; + w3[3] = wordl3[3] | wordr3[3]; + + /** + * SHA384 + */ + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + w0_t[0] = swap_workaround (w0[0]); + w0_t[1] = swap_workaround (w0[1]); + w0_t[2] = swap_workaround (w0[2]); + w0_t[3] = swap_workaround (w0[3]); + w1_t[0] = swap_workaround (w1[0]); + w1_t[1] = swap_workaround (w1[1]); + w1_t[2] = swap_workaround (w1[2]); + w1_t[3] = swap_workaround (w1[3]); + w2_t[0] = swap_workaround (w2[0]); + w2_t[1] = swap_workaround (w2[1]); + w2_t[2] = swap_workaround (w2[2]); + w2_t[3] = swap_workaround (w2[3]); + w3_t[0] = swap_workaround (w3[0]); + w3_t[1] = swap_workaround (w3[1]); + w3_t[2] = 0; + w3_t[3] = pw_len * 8; + + u64x digest[8]; + + digest[0] = SHA384M_A; + digest[1] = SHA384M_B; + digest[2] = SHA384M_C; + digest[3] = SHA384M_D; + digest[4] = SHA384M_E; + digest[5] = SHA384M_F; + digest[6] = SHA384M_G; + digest[7] = SHA384M_H; + + sha384_transform (w0_t, w1_t, w2_t, w3_t, digest); + + const u32x r0 = l32_from_64 (digest[3]); + const u32x r1 = h32_from_64 (digest[3]); + const u32x r2 = l32_from_64 (digest[2]); + const u32x r3 = h32_from_64 (digest[2]); + + #include VECT_COMPARE_S + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m10800_s08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m10800_s16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/nv/m10800_a3.cu b/nv/m10800_a3.cu new file mode 100644 index 0000000000..50ccf9e1e7 --- /dev/null +++ b/nv/m10800_a3.cu @@ -0,0 +1,538 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _SHA384_ +#define _SCALAR_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW2 +#define VECT_SIZE1 +#endif + +#define DGST_R0 6 +#define DGST_R1 7 +#define DGST_R2 4 +#define DGST_R3 5 + +#include "include/kernel_functions.c" +#include "types_nv.c" +#include "common_nv.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4_warp.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4_warp.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4_warp.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4_warp.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4_warp.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4_warp.c" +#endif + +__device__ __constant__ u32x c_bfs[1024]; + +__device__ __constant__ u64 k_sha384[80] = +{ + SHA384C00, SHA384C01, SHA384C02, SHA384C03, + SHA384C04, SHA384C05, SHA384C06, SHA384C07, + SHA384C08, SHA384C09, SHA384C0a, SHA384C0b, + SHA384C0c, SHA384C0d, SHA384C0e, SHA384C0f, + SHA384C10, SHA384C11, SHA384C12, SHA384C13, + SHA384C14, SHA384C15, SHA384C16, SHA384C17, + SHA384C18, SHA384C19, SHA384C1a, SHA384C1b, + SHA384C1c, SHA384C1d, SHA384C1e, SHA384C1f, + SHA384C20, SHA384C21, SHA384C22, SHA384C23, + SHA384C24, SHA384C25, SHA384C26, SHA384C27, + SHA384C28, SHA384C29, SHA384C2a, SHA384C2b, + SHA384C2c, SHA384C2d, SHA384C2e, SHA384C2f, + SHA384C30, SHA384C31, SHA384C32, SHA384C33, + SHA384C34, SHA384C35, SHA384C36, SHA384C37, + SHA384C38, SHA384C39, SHA384C3a, SHA384C3b, + SHA384C3c, SHA384C3d, SHA384C3e, SHA384C3f, + SHA384C40, SHA384C41, SHA384C42, SHA384C43, + SHA384C44, SHA384C45, SHA384C46, SHA384C47, + SHA384C48, SHA384C49, SHA384C4a, SHA384C4b, + SHA384C4c, SHA384C4d, SHA384C4e, SHA384C4f, +}; + +__device__ static void sha384_transform (const u32x w0[4], const u32x w1[4], const u32x w2[4], const u32x w3[4], u64x digest[8]) +{ + u64x w0_t = hl32_to_64 (w0[0], w0[1]); + u64x w1_t = hl32_to_64 (w0[2], w0[3]); + u64x w2_t = hl32_to_64 (w1[0], w1[1]); + u64x w3_t = hl32_to_64 (w1[2], w1[3]); + u64x w4_t = hl32_to_64 (w2[0], w2[1]); + u64x w5_t = hl32_to_64 (w2[2], w2[3]); + u64x w6_t = hl32_to_64 (w3[0], w3[1]); + u64x w7_t = 0; + u64x w8_t = 0; + u64x w9_t = 0; + u64x wa_t = 0; + u64x wb_t = 0; + u64x wc_t = 0; + u64x wd_t = 0; + u64x we_t = 0; + u64x wf_t = hl32_to_64 (w3[2], w3[3]); + + u64x a = digest[0]; + u64x b = digest[1]; + u64x c = digest[2]; + u64x d = digest[3]; + u64x e = digest[4]; + u64x f = digest[5]; + u64x g = digest[6]; + u64x h = digest[7]; + + #define ROUND_EXPAND() \ + { \ + w0_t = SHA384_EXPAND (we_t, w9_t, w1_t, w0_t); \ + w1_t = SHA384_EXPAND (wf_t, wa_t, w2_t, w1_t); \ + w2_t = SHA384_EXPAND (w0_t, wb_t, w3_t, w2_t); \ + w3_t = SHA384_EXPAND (w1_t, wc_t, w4_t, w3_t); \ + w4_t = SHA384_EXPAND (w2_t, wd_t, w5_t, w4_t); \ + w5_t = SHA384_EXPAND (w3_t, we_t, w6_t, w5_t); \ + w6_t = SHA384_EXPAND (w4_t, wf_t, w7_t, w6_t); \ + w7_t = SHA384_EXPAND (w5_t, w0_t, w8_t, w7_t); \ + w8_t = SHA384_EXPAND (w6_t, w1_t, w9_t, w8_t); \ + w9_t = SHA384_EXPAND (w7_t, w2_t, wa_t, w9_t); \ + wa_t = SHA384_EXPAND (w8_t, w3_t, wb_t, wa_t); \ + wb_t = SHA384_EXPAND (w9_t, w4_t, wc_t, wb_t); \ + wc_t = SHA384_EXPAND (wa_t, w5_t, wd_t, wc_t); \ + wd_t = SHA384_EXPAND (wb_t, w6_t, we_t, wd_t); \ + we_t = SHA384_EXPAND (wc_t, w7_t, wf_t, we_t); \ + wf_t = SHA384_EXPAND (wd_t, w8_t, w0_t, wf_t); \ + } + + #define ROUND_STEP(i) \ + { \ + SHA384_STEP (SHA384_F0o, SHA384_F1o, a, b, c, d, e, f, g, h, w0_t, k_sha384[i + 0]); \ + SHA384_STEP (SHA384_F0o, SHA384_F1o, h, a, b, c, d, e, f, g, w1_t, k_sha384[i + 1]); \ + SHA384_STEP (SHA384_F0o, SHA384_F1o, g, h, a, b, c, d, e, f, w2_t, k_sha384[i + 2]); \ + SHA384_STEP (SHA384_F0o, SHA384_F1o, f, g, h, a, b, c, d, e, w3_t, k_sha384[i + 3]); \ + SHA384_STEP (SHA384_F0o, SHA384_F1o, e, f, g, h, a, b, c, d, w4_t, k_sha384[i + 4]); \ + SHA384_STEP (SHA384_F0o, SHA384_F1o, d, e, f, g, h, a, b, c, w5_t, k_sha384[i + 5]); \ + SHA384_STEP (SHA384_F0o, SHA384_F1o, c, d, e, f, g, h, a, b, w6_t, k_sha384[i + 6]); \ + SHA384_STEP (SHA384_F0o, SHA384_F1o, b, c, d, e, f, g, h, a, w7_t, k_sha384[i + 7]); \ + SHA384_STEP (SHA384_F0o, SHA384_F1o, a, b, c, d, e, f, g, h, w8_t, k_sha384[i + 8]); \ + SHA384_STEP (SHA384_F0o, SHA384_F1o, h, a, b, c, d, e, f, g, w9_t, k_sha384[i + 9]); \ + SHA384_STEP (SHA384_F0o, SHA384_F1o, g, h, a, b, c, d, e, f, wa_t, k_sha384[i + 10]); \ + SHA384_STEP (SHA384_F0o, SHA384_F1o, f, g, h, a, b, c, d, e, wb_t, k_sha384[i + 11]); \ + SHA384_STEP (SHA384_F0o, SHA384_F1o, e, f, g, h, a, b, c, d, wc_t, k_sha384[i + 12]); \ + SHA384_STEP (SHA384_F0o, SHA384_F1o, d, e, f, g, h, a, b, c, wd_t, k_sha384[i + 13]); \ + SHA384_STEP (SHA384_F0o, SHA384_F1o, c, d, e, f, g, h, a, b, we_t, k_sha384[i + 14]); \ + SHA384_STEP (SHA384_F0o, SHA384_F1o, b, c, d, e, f, g, h, a, wf_t, k_sha384[i + 15]); \ + } + + ROUND_STEP (0); + + for (int i = 16; i < 80; i += 16) + { + ROUND_EXPAND (); ROUND_STEP (i); + } + + /* rev + digest[0] += a; + digest[1] += b; + digest[2] += c; + digest[3] += d; + digest[4] += e; + digest[5] += f; + digest[6] += g; + digest[7] += h; + */ + + digest[0] = a; + digest[1] = b; + digest[2] = c; + digest[3] = d; + digest[4] = e; + digest[5] = f; + digest[6] = 0; + digest[7] = 0; +} + +__device__ static void m10800m (u32 w[16], const u32 pw_len, const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const u32x *words_buf_r, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset) +{ + /** + * modifier + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + const u32 lid = threadIdx.x; + + /** + * loop + */ + + const u32 bf_loops = ceil ((float) bfs_cnt / VECT_DIV); + + u32x w0l = w[0]; + + for (u32 il_pos = 0; il_pos < bf_loops; il_pos++) + { + const u32x w0r = c_bfs[il_pos]; + + const u32x w0 = w0l | w0r; + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + w0_t[0] = w0; + w0_t[1] = w[ 1]; + w0_t[2] = w[ 2]; + w0_t[3] = w[ 3]; + w1_t[0] = w[ 4]; + w1_t[1] = w[ 5]; + w1_t[2] = w[ 6]; + w1_t[3] = w[ 7]; + w2_t[0] = w[ 8]; + w2_t[1] = w[ 9]; + w2_t[2] = w[10]; + w2_t[3] = w[11]; + w3_t[0] = w[12]; + w3_t[1] = w[13]; + w3_t[2] = w[14]; + w3_t[3] = w[15]; + + u64x digest[8]; + + digest[0] = SHA384M_A; + digest[1] = SHA384M_B; + digest[2] = SHA384M_C; + digest[3] = SHA384M_D; + digest[4] = SHA384M_E; + digest[5] = SHA384M_F; + digest[6] = SHA384M_G; + digest[7] = SHA384M_H; + + sha384_transform (w0_t, w1_t, w2_t, w3_t, digest); + + const u32x r0 = l32_from_64 (digest[3]); + const u32x r1 = h32_from_64 (digest[3]); + const u32x r2 = l32_from_64 (digest[2]); + const u32x r3 = h32_from_64 (digest[2]); + + #include VECT_COMPARE_M + } +} + +__device__ static void m10800s (u32 w[16], const u32 pw_len, const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const u32x *words_buf_r, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset) +{ + /** + * modifier + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + const u32 lid = threadIdx.x; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * loop + */ + + const u32 bf_loops = ceil ((float) bfs_cnt / VECT_DIV); + + u32x w0l = w[0]; + + for (u32 il_pos = 0; il_pos < bf_loops; il_pos++) + { + const u32x w0r = c_bfs[il_pos]; + + const u32x w0 = w0l | w0r; + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + w0_t[0] = w0; + w0_t[1] = w[ 1]; + w0_t[2] = w[ 2]; + w0_t[3] = w[ 3]; + w1_t[0] = w[ 4]; + w1_t[1] = w[ 5]; + w1_t[2] = w[ 6]; + w1_t[3] = w[ 7]; + w2_t[0] = w[ 8]; + w2_t[1] = w[ 9]; + w2_t[2] = w[10]; + w2_t[3] = w[11]; + w3_t[0] = w[12]; + w3_t[1] = w[13]; + w3_t[2] = w[14]; + w3_t[3] = w[15]; + + u64x digest[8]; + + digest[0] = SHA384M_A; + digest[1] = SHA384M_B; + digest[2] = SHA384M_C; + digest[3] = SHA384M_D; + digest[4] = SHA384M_E; + digest[5] = SHA384M_F; + digest[6] = SHA384M_G; + digest[7] = SHA384M_H; + + sha384_transform (w0_t, w1_t, w2_t, w3_t, digest); + + const u32x r0 = l32_from_64 (digest[3]); + const u32x r1 = h32_from_64 (digest[3]); + const u32x r2 = l32_from_64 (digest[2]); + const u32x r3 = h32_from_64 (digest[2]); + + #include VECT_COMPARE_S + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m10800_m04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const u32x *words_buf_r, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32 w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = 0; + w[ 5] = 0; + w[ 6] = 0; + w[ 7] = 0; + w[ 8] = 0; + w[ 9] = 0; + w[10] = 0; + w[11] = 0; + w[12] = 0; + w[13] = 0; + w[14] = 0; + w[15] = pws[gid].i[15]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m10800m (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m10800_m08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const u32x *words_buf_r, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32 w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = pws[gid].i[ 4]; + w[ 5] = pws[gid].i[ 5]; + w[ 6] = pws[gid].i[ 6]; + w[ 7] = pws[gid].i[ 7]; + w[ 8] = 0; + w[ 9] = 0; + w[10] = 0; + w[11] = 0; + w[12] = 0; + w[13] = 0; + w[14] = 0; + w[15] = pws[gid].i[15]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m10800m (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m10800_m16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const u32x *words_buf_r, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32 w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = pws[gid].i[ 4]; + w[ 5] = pws[gid].i[ 5]; + w[ 6] = pws[gid].i[ 6]; + w[ 7] = pws[gid].i[ 7]; + w[ 8] = pws[gid].i[ 8]; + w[ 9] = pws[gid].i[ 9]; + w[10] = pws[gid].i[10]; + w[11] = pws[gid].i[11]; + w[12] = pws[gid].i[12]; + w[13] = pws[gid].i[13]; + w[14] = pws[gid].i[14]; + w[15] = pws[gid].i[15]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m10800m (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m10800_s04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const u32x *words_buf_r, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32 w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = 0; + w[ 5] = 0; + w[ 6] = 0; + w[ 7] = 0; + w[ 8] = 0; + w[ 9] = 0; + w[10] = 0; + w[11] = 0; + w[12] = 0; + w[13] = 0; + w[14] = 0; + w[15] = pws[gid].i[15]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m10800s (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m10800_s08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const u32x *words_buf_r, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32 w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = pws[gid].i[ 4]; + w[ 5] = pws[gid].i[ 5]; + w[ 6] = pws[gid].i[ 6]; + w[ 7] = pws[gid].i[ 7]; + w[ 8] = 0; + w[ 9] = 0; + w[10] = 0; + w[11] = 0; + w[12] = 0; + w[13] = 0; + w[14] = 0; + w[15] = pws[gid].i[15]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m10800s (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m10800_s16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const u32x *words_buf_r, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32 w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = pws[gid].i[ 4]; + w[ 5] = pws[gid].i[ 5]; + w[ 6] = pws[gid].i[ 6]; + w[ 7] = pws[gid].i[ 7]; + w[ 8] = pws[gid].i[ 8]; + w[ 9] = pws[gid].i[ 9]; + w[10] = pws[gid].i[10]; + w[11] = pws[gid].i[11]; + w[12] = pws[gid].i[12]; + w[13] = pws[gid].i[13]; + w[14] = pws[gid].i[14]; + w[15] = pws[gid].i[15]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m10800s (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} diff --git a/nv/m10900.cu b/nv/m10900.cu new file mode 100644 index 0000000000..9fbd78d7ab --- /dev/null +++ b/nv/m10900.cu @@ -0,0 +1,480 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _PBKDF2_SHA256_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW2 +#define VECT_SIZE1 +#endif + +#define DGST_R0 0 +#define DGST_R1 1 +#define DGST_R2 2 +#define DGST_R3 3 + +#include "include/kernel_functions.c" + +#include "types_nv.c" +#include "common_nv.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +__device__ static void sha256_transform (const u32x w0[4], const u32x w1[4], const u32x w2[4], const u32x w3[4], u32x digest[8]) +{ + u32x a = digest[0]; + u32x b = digest[1]; + u32x c = digest[2]; + u32x d = digest[3]; + u32x e = digest[4]; + u32x f = digest[5]; + u32x g = digest[6]; + u32x h = digest[7]; + + u32x w0_t = w0[0]; + u32x w1_t = w0[1]; + u32x w2_t = w0[2]; + u32x w3_t = w0[3]; + u32x w4_t = w1[0]; + u32x w5_t = w1[1]; + u32x w6_t = w1[2]; + u32x w7_t = w1[3]; + u32x w8_t = w2[0]; + u32x w9_t = w2[1]; + u32x wa_t = w2[2]; + u32x wb_t = w2[3]; + u32x wc_t = w3[0]; + u32x wd_t = w3[1]; + u32x we_t = w3[2]; + u32x wf_t = w3[3]; + + SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C00); + SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C01); + SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C02); + SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C03); + SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C04); + SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C05); + SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C06); + SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C07); + SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C08); + SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C09); + SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C0a); + SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C0b); + SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C0c); + SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C0d); + SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C0e); + SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C0f); + w0_t = SHA256_S1(we_t) + w9_t + SHA256_S0(w1_t) + w0_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C10); + w1_t = SHA256_S1(wf_t) + wa_t + SHA256_S0(w2_t) + w1_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C11); + w2_t = SHA256_S1(w0_t) + wb_t + SHA256_S0(w3_t) + w2_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C12); + w3_t = SHA256_S1(w1_t) + wc_t + SHA256_S0(w4_t) + w3_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C13); + w4_t = SHA256_S1(w2_t) + wd_t + SHA256_S0(w5_t) + w4_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C14); + w5_t = SHA256_S1(w3_t) + we_t + SHA256_S0(w6_t) + w5_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C15); + w6_t = SHA256_S1(w4_t) + wf_t + SHA256_S0(w7_t) + w6_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C16); + w7_t = SHA256_S1(w5_t) + w0_t + SHA256_S0(w8_t) + w7_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C17); + w8_t = SHA256_S1(w6_t) + w1_t + SHA256_S0(w9_t) + w8_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C18); + w9_t = SHA256_S1(w7_t) + w2_t + SHA256_S0(wa_t) + w9_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C19); + wa_t = SHA256_S1(w8_t) + w3_t + SHA256_S0(wb_t) + wa_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C1a); + wb_t = SHA256_S1(w9_t) + w4_t + SHA256_S0(wc_t) + wb_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C1b); + wc_t = SHA256_S1(wa_t) + w5_t + SHA256_S0(wd_t) + wc_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C1c); + wd_t = SHA256_S1(wb_t) + w6_t + SHA256_S0(we_t) + wd_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C1d); + we_t = SHA256_S1(wc_t) + w7_t + SHA256_S0(wf_t) + we_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C1e); + wf_t = SHA256_S1(wd_t) + w8_t + SHA256_S0(w0_t) + wf_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C1f); + w0_t = SHA256_S1(we_t) + w9_t + SHA256_S0(w1_t) + w0_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C20); + w1_t = SHA256_S1(wf_t) + wa_t + SHA256_S0(w2_t) + w1_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C21); + w2_t = SHA256_S1(w0_t) + wb_t + SHA256_S0(w3_t) + w2_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C22); + w3_t = SHA256_S1(w1_t) + wc_t + SHA256_S0(w4_t) + w3_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C23); + w4_t = SHA256_S1(w2_t) + wd_t + SHA256_S0(w5_t) + w4_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C24); + w5_t = SHA256_S1(w3_t) + we_t + SHA256_S0(w6_t) + w5_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C25); + w6_t = SHA256_S1(w4_t) + wf_t + SHA256_S0(w7_t) + w6_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C26); + w7_t = SHA256_S1(w5_t) + w0_t + SHA256_S0(w8_t) + w7_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C27); + w8_t = SHA256_S1(w6_t) + w1_t + SHA256_S0(w9_t) + w8_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C28); + w9_t = SHA256_S1(w7_t) + w2_t + SHA256_S0(wa_t) + w9_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C29); + wa_t = SHA256_S1(w8_t) + w3_t + SHA256_S0(wb_t) + wa_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C2a); + wb_t = SHA256_S1(w9_t) + w4_t + SHA256_S0(wc_t) + wb_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C2b); + wc_t = SHA256_S1(wa_t) + w5_t + SHA256_S0(wd_t) + wc_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C2c); + wd_t = SHA256_S1(wb_t) + w6_t + SHA256_S0(we_t) + wd_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C2d); + we_t = SHA256_S1(wc_t) + w7_t + SHA256_S0(wf_t) + we_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C2e); + wf_t = SHA256_S1(wd_t) + w8_t + SHA256_S0(w0_t) + wf_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C2f); + w0_t = SHA256_S1(we_t) + w9_t + SHA256_S0(w1_t) + w0_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C30); + w1_t = SHA256_S1(wf_t) + wa_t + SHA256_S0(w2_t) + w1_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C31); + w2_t = SHA256_S1(w0_t) + wb_t + SHA256_S0(w3_t) + w2_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C32); + w3_t = SHA256_S1(w1_t) + wc_t + SHA256_S0(w4_t) + w3_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C33); + w4_t = SHA256_S1(w2_t) + wd_t + SHA256_S0(w5_t) + w4_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C34); + w5_t = SHA256_S1(w3_t) + we_t + SHA256_S0(w6_t) + w5_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C35); + w6_t = SHA256_S1(w4_t) + wf_t + SHA256_S0(w7_t) + w6_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C36); + w7_t = SHA256_S1(w5_t) + w0_t + SHA256_S0(w8_t) + w7_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C37); + w8_t = SHA256_S1(w6_t) + w1_t + SHA256_S0(w9_t) + w8_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C38); + w9_t = SHA256_S1(w7_t) + w2_t + SHA256_S0(wa_t) + w9_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C39); + wa_t = SHA256_S1(w8_t) + w3_t + SHA256_S0(wb_t) + wa_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C3a); + wb_t = SHA256_S1(w9_t) + w4_t + SHA256_S0(wc_t) + wb_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C3b); + wc_t = SHA256_S1(wa_t) + w5_t + SHA256_S0(wd_t) + wc_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C3c); + wd_t = SHA256_S1(wb_t) + w6_t + SHA256_S0(we_t) + wd_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C3d); + we_t = SHA256_S1(wc_t) + w7_t + SHA256_S0(wf_t) + we_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C3e); + wf_t = SHA256_S1(wd_t) + w8_t + SHA256_S0(w0_t) + wf_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C3f); + + digest[0] += a; + digest[1] += b; + digest[2] += c; + digest[3] += d; + digest[4] += e; + digest[5] += f; + digest[6] += g; + digest[7] += h; +} + +__device__ static void hmac_sha256_pad (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], u32x ipad[8], u32x opad[8]) +{ + w0[0] = w0[0] ^ 0x36363636; + w0[1] = w0[1] ^ 0x36363636; + w0[2] = w0[2] ^ 0x36363636; + w0[3] = w0[3] ^ 0x36363636; + w1[0] = w1[0] ^ 0x36363636; + w1[1] = w1[1] ^ 0x36363636; + w1[2] = w1[2] ^ 0x36363636; + w1[3] = w1[3] ^ 0x36363636; + w2[0] = w2[0] ^ 0x36363636; + w2[1] = w2[1] ^ 0x36363636; + w2[2] = w2[2] ^ 0x36363636; + w2[3] = w2[3] ^ 0x36363636; + w3[0] = w3[0] ^ 0x36363636; + w3[1] = w3[1] ^ 0x36363636; + w3[2] = w3[2] ^ 0x36363636; + w3[3] = w3[3] ^ 0x36363636; + + ipad[0] = SHA256M_A; + ipad[1] = SHA256M_B; + ipad[2] = SHA256M_C; + ipad[3] = SHA256M_D; + ipad[4] = SHA256M_E; + ipad[5] = SHA256M_F; + ipad[6] = SHA256M_G; + ipad[7] = SHA256M_H; + + sha256_transform (w0, w1, w2, w3, ipad); + + w0[0] = w0[0] ^ 0x6a6a6a6a; + w0[1] = w0[1] ^ 0x6a6a6a6a; + w0[2] = w0[2] ^ 0x6a6a6a6a; + w0[3] = w0[3] ^ 0x6a6a6a6a; + w1[0] = w1[0] ^ 0x6a6a6a6a; + w1[1] = w1[1] ^ 0x6a6a6a6a; + w1[2] = w1[2] ^ 0x6a6a6a6a; + w1[3] = w1[3] ^ 0x6a6a6a6a; + w2[0] = w2[0] ^ 0x6a6a6a6a; + w2[1] = w2[1] ^ 0x6a6a6a6a; + w2[2] = w2[2] ^ 0x6a6a6a6a; + w2[3] = w2[3] ^ 0x6a6a6a6a; + w3[0] = w3[0] ^ 0x6a6a6a6a; + w3[1] = w3[1] ^ 0x6a6a6a6a; + w3[2] = w3[2] ^ 0x6a6a6a6a; + w3[3] = w3[3] ^ 0x6a6a6a6a; + + opad[0] = SHA256M_A; + opad[1] = SHA256M_B; + opad[2] = SHA256M_C; + opad[3] = SHA256M_D; + opad[4] = SHA256M_E; + opad[5] = SHA256M_F; + opad[6] = SHA256M_G; + opad[7] = SHA256M_H; + + sha256_transform (w0, w1, w2, w3, opad); +} + +__device__ static void hmac_sha256_run (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], u32x ipad[8], u32x opad[8], u32x digest[8]) +{ + digest[0] = ipad[0]; + digest[1] = ipad[1]; + digest[2] = ipad[2]; + digest[3] = ipad[3]; + digest[4] = ipad[4]; + digest[5] = ipad[5]; + digest[6] = ipad[6]; + digest[7] = ipad[7]; + + sha256_transform (w0, w1, w2, w3, digest); + + w0[0] = digest[0]; + w0[1] = digest[1]; + w0[2] = digest[2]; + w0[3] = digest[3]; + w1[0] = digest[4]; + w1[1] = digest[5]; + w1[2] = digest[6]; + w1[3] = digest[7]; + w2[0] = 0x80000000; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = (64 + 32) * 8; + + digest[0] = opad[0]; + digest[1] = opad[1]; + digest[2] = opad[2]; + digest[3] = opad[3]; + digest[4] = opad[4]; + digest[5] = opad[5]; + digest[6] = opad[6]; + digest[7] = opad[7]; + + sha256_transform (w0, w1, w2, w3, digest); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m10900_init (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, pbkdf2_sha256_tmp_t *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const pbkdf2_sha256_t *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = swap_workaround (pws[gid].i[ 0]); + w0[1] = swap_workaround (pws[gid].i[ 1]); + w0[2] = swap_workaround (pws[gid].i[ 2]); + w0[3] = swap_workaround (pws[gid].i[ 3]); + + u32x w1[4]; + + w1[0] = swap_workaround (pws[gid].i[ 4]); + w1[1] = swap_workaround (pws[gid].i[ 5]); + w1[2] = swap_workaround (pws[gid].i[ 6]); + w1[3] = swap_workaround (pws[gid].i[ 7]); + + u32x w2[4]; + + w2[0] = swap_workaround (pws[gid].i[ 8]); + w2[1] = swap_workaround (pws[gid].i[ 9]); + w2[2] = swap_workaround (pws[gid].i[10]); + w2[3] = swap_workaround (pws[gid].i[11]); + + u32x w3[4]; + + w3[0] = swap_workaround (pws[gid].i[12]); + w3[1] = swap_workaround (pws[gid].i[13]); + w3[2] = swap_workaround (pws[gid].i[14]); + w3[3] = swap_workaround (pws[gid].i[15]); + + /** + * salt + */ + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + u32 esalt_buf0[4]; + u32 esalt_buf1[4]; + u32 esalt_buf2[4]; + u32 esalt_buf3[4]; + + esalt_buf0[0] = swap_workaround (esalt_bufs[salt_pos].salt_buf[ 0]); + esalt_buf0[1] = swap_workaround (esalt_bufs[salt_pos].salt_buf[ 1]); + esalt_buf0[2] = swap_workaround (esalt_bufs[salt_pos].salt_buf[ 2]); + esalt_buf0[3] = swap_workaround (esalt_bufs[salt_pos].salt_buf[ 3]); + esalt_buf1[0] = swap_workaround (esalt_bufs[salt_pos].salt_buf[ 4]); + esalt_buf1[1] = swap_workaround (esalt_bufs[salt_pos].salt_buf[ 5]); + esalt_buf1[2] = swap_workaround (esalt_bufs[salt_pos].salt_buf[ 6]); + esalt_buf1[3] = swap_workaround (esalt_bufs[salt_pos].salt_buf[ 7]); + esalt_buf2[0] = swap_workaround (esalt_bufs[salt_pos].salt_buf[ 8]); + esalt_buf2[1] = swap_workaround (esalt_bufs[salt_pos].salt_buf[ 9]); + esalt_buf2[2] = swap_workaround (esalt_bufs[salt_pos].salt_buf[10]); + esalt_buf2[3] = swap_workaround (esalt_bufs[salt_pos].salt_buf[11]); + esalt_buf3[0] = swap_workaround (esalt_bufs[salt_pos].salt_buf[12]); + esalt_buf3[1] = swap_workaround (esalt_bufs[salt_pos].salt_buf[13]); + esalt_buf3[2] = 0; + esalt_buf3[3] = (64 + salt_len + 4) * 8; + + u32 ipad[8]; + u32 opad[8]; + + hmac_sha256_pad (w0, w1, w2, w3, ipad, opad); + + tmps[gid].ipad[0] = ipad[0]; + tmps[gid].ipad[1] = ipad[1]; + tmps[gid].ipad[2] = ipad[2]; + tmps[gid].ipad[3] = ipad[3]; + tmps[gid].ipad[4] = ipad[4]; + tmps[gid].ipad[5] = ipad[5]; + tmps[gid].ipad[6] = ipad[6]; + tmps[gid].ipad[7] = ipad[7]; + + tmps[gid].opad[0] = opad[0]; + tmps[gid].opad[1] = opad[1]; + tmps[gid].opad[2] = opad[2]; + tmps[gid].opad[3] = opad[3]; + tmps[gid].opad[4] = opad[4]; + tmps[gid].opad[5] = opad[5]; + tmps[gid].opad[6] = opad[6]; + tmps[gid].opad[7] = opad[7]; + + for (u32 i = 0, j = 1; i < 8; i += 8, j += 1) + { + u32 dgst[8]; + + hmac_sha256_run (esalt_buf0, esalt_buf1, esalt_buf2, esalt_buf3, ipad, opad, dgst); + + tmps[gid].dgst[i + 0] = dgst[0]; + tmps[gid].dgst[i + 1] = dgst[1]; + tmps[gid].dgst[i + 2] = dgst[2]; + tmps[gid].dgst[i + 3] = dgst[3]; + tmps[gid].dgst[i + 4] = dgst[4]; + tmps[gid].dgst[i + 5] = dgst[5]; + tmps[gid].dgst[i + 6] = dgst[6]; + tmps[gid].dgst[i + 7] = dgst[7]; + + tmps[gid].out[i + 0] = dgst[0]; + tmps[gid].out[i + 1] = dgst[1]; + tmps[gid].out[i + 2] = dgst[2]; + tmps[gid].out[i + 3] = dgst[3]; + tmps[gid].out[i + 4] = dgst[4]; + tmps[gid].out[i + 5] = dgst[5]; + tmps[gid].out[i + 6] = dgst[6]; + tmps[gid].out[i + 7] = dgst[7]; + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m10900_loop (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, pbkdf2_sha256_tmp_t *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const pbkdf2_sha256_t *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32 ipad[8]; + + ipad[0] = tmps[gid].ipad[0]; + ipad[1] = tmps[gid].ipad[1]; + ipad[2] = tmps[gid].ipad[2]; + ipad[3] = tmps[gid].ipad[3]; + ipad[4] = tmps[gid].ipad[4]; + ipad[5] = tmps[gid].ipad[5]; + ipad[6] = tmps[gid].ipad[6]; + ipad[7] = tmps[gid].ipad[7]; + + u32 opad[8]; + + opad[0] = tmps[gid].opad[0]; + opad[1] = tmps[gid].opad[1]; + opad[2] = tmps[gid].opad[2]; + opad[3] = tmps[gid].opad[3]; + opad[4] = tmps[gid].opad[4]; + opad[5] = tmps[gid].opad[5]; + opad[6] = tmps[gid].opad[6]; + opad[7] = tmps[gid].opad[7]; + + for (u32 i = 0; i < 8; i += 8) + { + u32 dgst[8]; + + dgst[0] = tmps[gid].dgst[i + 0]; + dgst[1] = tmps[gid].dgst[i + 1]; + dgst[2] = tmps[gid].dgst[i + 2]; + dgst[3] = tmps[gid].dgst[i + 3]; + dgst[4] = tmps[gid].dgst[i + 4]; + dgst[5] = tmps[gid].dgst[i + 5]; + dgst[6] = tmps[gid].dgst[i + 6]; + dgst[7] = tmps[gid].dgst[i + 7]; + + u32 out[8]; + + out[0] = tmps[gid].out[i + 0]; + out[1] = tmps[gid].out[i + 1]; + out[2] = tmps[gid].out[i + 2]; + out[3] = tmps[gid].out[i + 3]; + out[4] = tmps[gid].out[i + 4]; + out[5] = tmps[gid].out[i + 5]; + out[6] = tmps[gid].out[i + 6]; + out[7] = tmps[gid].out[i + 7]; + + for (u32 j = 0; j < loop_cnt; j++) + { + u32 w0[4]; + u32 w1[4]; + u32 w2[4]; + u32 w3[4]; + + w0[0] = dgst[0]; + w0[1] = dgst[1]; + w0[2] = dgst[2]; + w0[3] = dgst[3]; + w1[0] = dgst[4]; + w1[1] = dgst[5]; + w1[2] = dgst[6]; + w1[3] = dgst[7]; + w2[0] = 0x80000000; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = (64 + 32) * 8; + + hmac_sha256_run (w0, w1, w2, w3, ipad, opad, dgst); + + out[0] ^= dgst[0]; + out[1] ^= dgst[1]; + out[2] ^= dgst[2]; + out[3] ^= dgst[3]; + out[4] ^= dgst[4]; + out[5] ^= dgst[5]; + out[6] ^= dgst[6]; + out[7] ^= dgst[7]; + } + + tmps[gid].dgst[i + 0] = dgst[0]; + tmps[gid].dgst[i + 1] = dgst[1]; + tmps[gid].dgst[i + 2] = dgst[2]; + tmps[gid].dgst[i + 3] = dgst[3]; + tmps[gid].dgst[i + 4] = dgst[4]; + tmps[gid].dgst[i + 5] = dgst[5]; + tmps[gid].dgst[i + 6] = dgst[6]; + tmps[gid].dgst[i + 7] = dgst[7]; + + tmps[gid].out[i + 0] = out[0]; + tmps[gid].out[i + 1] = out[1]; + tmps[gid].out[i + 2] = out[2]; + tmps[gid].out[i + 3] = out[3]; + tmps[gid].out[i + 4] = out[4]; + tmps[gid].out[i + 5] = out[5]; + tmps[gid].out[i + 6] = out[6]; + tmps[gid].out[i + 7] = out[7]; + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m10900_comp (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, pbkdf2_sha256_tmp_t *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const pbkdf2_sha256_t *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + const u32 lid = threadIdx.x; + + const u32x r0 = tmps[gid].out[DGST_R0]; + const u32x r1 = tmps[gid].out[DGST_R1]; + const u32x r2 = tmps[gid].out[DGST_R2]; + const u32x r3 = tmps[gid].out[DGST_R3]; + + #define il_pos 0 + + #include VECT_COMPARE_M +} diff --git a/nv/m11000_a0.cu b/nv/m11000_a0.cu new file mode 100644 index 0000000000..49e3bcab8c --- /dev/null +++ b/nv/m11000_a0.cu @@ -0,0 +1,713 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _MD5_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW2 +#define VECT_SIZE1 +#endif + +#define DGST_R0 0 +#define DGST_R1 3 +#define DGST_R2 2 +#define DGST_R3 1 + +#include "include/kernel_functions.c" +#include "types_nv.c" +#include "common_nv.c" +#include "include/rp_gpu.h" +#include "rp_nv.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +__device__ __constant__ gpu_rule_t c_rules[1024]; + +extern "C" __global__ void __launch_bounds__ (256, 1) m11000_m04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + u32x pw_buf1[4]; + + pw_buf1[0] = pws[gid].i[ 4]; + pw_buf1[1] = pws[gid].i[ 5]; + pw_buf1[2] = pws[gid].i[ 6]; + pw_buf1[3] = pws[gid].i[ 7]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * salt + */ + + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[ 1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[ 2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[ 3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[ 4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[ 5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[ 6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[ 7]; + + u32 salt_buf2[4]; + + salt_buf2[0] = salt_bufs[salt_pos].salt_buf[ 8]; + salt_buf2[1] = salt_bufs[salt_pos].salt_buf[ 9]; + salt_buf2[2] = salt_bufs[salt_pos].salt_buf[10]; + salt_buf2[3] = salt_bufs[salt_pos].salt_buf[11]; + + u32 salt_buf3[2]; + + salt_buf3[0] = salt_bufs[salt_pos].salt_buf[12]; + salt_buf3[1] = salt_bufs[salt_pos].salt_buf[13]; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + u32x w1[4]; + u32x w2[4]; + u32x w3[4]; + + w0[0] = pw_buf0[0]; + w0[1] = pw_buf0[1]; + w0[2] = pw_buf0[2]; + w0[3] = pw_buf0[3]; + w1[0] = pw_buf1[0]; + w1[1] = pw_buf1[1]; + w1[2] = pw_buf1[2]; + w1[3] = pw_buf1[3]; + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 out_len = apply_rules (c_rules[il_pos].cmds, w0, w1, pw_len); + + const u32 pw_salt_len = pw_len + salt_len; + + append_0x80_4 (w0, w1, w2, w3, out_len); + + /** + * prepend salt + */ + + // first step fixed 56 bytes of salt + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + w0_t[0] = salt_buf0[0]; + w0_t[1] = salt_buf0[1]; + w0_t[2] = salt_buf0[2]; + w0_t[3] = salt_buf0[3]; + w1_t[0] = salt_buf1[0]; + w1_t[1] = salt_buf1[1]; + w1_t[2] = salt_buf1[2]; + w1_t[3] = salt_buf1[3]; + w2_t[0] = salt_buf2[0]; + w2_t[1] = salt_buf2[1]; + w2_t[2] = salt_buf2[2]; + w2_t[3] = salt_buf2[3]; + w3_t[0] = salt_buf3[0]; + w3_t[1] = salt_buf3[1]; + + // after 56 byte salt, we have beginning of the password + + w3_t[2] = w0[0]; + w3_t[3] = w0[1]; + + /** + * md5 + */ + + // first transform + + u32x a = MD5M_A; + u32x b = MD5M_B; + u32x c = MD5M_C; + u32x d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0_t[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0_t[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0_t[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1_t[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1_t[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1_t[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2_t[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2_t[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2_t[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3_t[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3_t[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3_t[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0_t[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1_t[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2_t[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1_t[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1_t[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2_t[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3_t[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0_t[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2_t[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3_t[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0_t[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1_t[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3_t[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H , a, b, c, d, w1_t[1], MD5C20, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w2_t[0], MD5C21, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w2_t[3], MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w3_t[2], MD5C23, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w0_t[1], MD5C24, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w1_t[0], MD5C25, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w1_t[3], MD5C26, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w2_t[2], MD5C27, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w3_t[1], MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w0_t[0], MD5C29, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w0_t[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w1_t[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w2_t[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w3_t[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w3_t[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w0_t[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1_t[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3_t[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3_t[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0_t[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0_t[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2_t[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1_t[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3_t[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1_t[0], MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w2_t[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0_t[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2_t[1], MD5C3f, MD5S33); + + a += MD5M_A; + b += MD5M_B; + c += MD5M_C; + d += MD5M_D; + + u32x r_a = a; + u32x r_b = b; + u32x r_c = c; + u32x r_d = d; + + // 2nd transform + + w0_t[0] = w0[2]; + w0_t[1] = w0[3]; + w0_t[2] = w1[0]; + w0_t[3] = w1[1]; + w1_t[0] = w1[2]; + w1_t[1] = w1[3]; + w1_t[2] = w2[0]; + w1_t[3] = w2[1]; + w2_t[0] = w2[2]; + w2_t[1] = w2[3]; + w2_t[2] = w3[0]; + w2_t[3] = w3[1]; + w3_t[0] = w3[2]; + w3_t[1] = w3[3]; + w3_t[2] = pw_salt_len * 8; + w3_t[3] = 0; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0_t[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0_t[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0_t[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1_t[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1_t[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1_t[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2_t[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2_t[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2_t[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3_t[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3_t[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3_t[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0_t[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1_t[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2_t[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1_t[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1_t[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2_t[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3_t[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0_t[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2_t[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3_t[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0_t[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1_t[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3_t[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H , a, b, c, d, w1_t[1], MD5C20, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w2_t[0], MD5C21, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w2_t[3], MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w3_t[2], MD5C23, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w0_t[1], MD5C24, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w1_t[0], MD5C25, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w1_t[3], MD5C26, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w2_t[2], MD5C27, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w3_t[1], MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w0_t[0], MD5C29, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w0_t[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w1_t[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w2_t[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w3_t[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w3_t[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w0_t[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1_t[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3_t[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3_t[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0_t[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0_t[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2_t[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1_t[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3_t[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1_t[0], MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w2_t[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0_t[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2_t[1], MD5C3f, MD5S33); + + a += r_a; + b += r_b; + c += r_c; + d += r_d; + + const u32x r0 = a; + const u32x r1 = d; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_M + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m11000_m08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m11000_m16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m11000_s04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + u32x pw_buf1[4]; + + pw_buf1[0] = pws[gid].i[ 4]; + pw_buf1[1] = pws[gid].i[ 5]; + pw_buf1[2] = pws[gid].i[ 6]; + pw_buf1[3] = pws[gid].i[ 7]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * salt + */ + + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[ 1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[ 2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[ 3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[ 4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[ 5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[ 6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[ 7]; + + u32 salt_buf2[4]; + + salt_buf2[0] = salt_bufs[salt_pos].salt_buf[ 8]; + salt_buf2[1] = salt_bufs[salt_pos].salt_buf[ 9]; + salt_buf2[2] = salt_bufs[salt_pos].salt_buf[10]; + salt_buf2[3] = salt_bufs[salt_pos].salt_buf[11]; + + u32 salt_buf3[2]; + + salt_buf3[0] = salt_bufs[salt_pos].salt_buf[12]; + salt_buf3[1] = salt_bufs[salt_pos].salt_buf[13]; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + u32x w1[4]; + u32x w2[4]; + u32x w3[4]; + + w0[0] = pw_buf0[0]; + w0[1] = pw_buf0[1]; + w0[2] = pw_buf0[2]; + w0[3] = pw_buf0[3]; + w1[0] = pw_buf1[0]; + w1[1] = pw_buf1[1]; + w1[2] = pw_buf1[2]; + w1[3] = pw_buf1[3]; + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 out_len = apply_rules (c_rules[il_pos].cmds, w0, w1, pw_len); + + const u32 pw_salt_len = pw_len + salt_len; + + append_0x80_4 (w0, w1, w2, w3, out_len); + + /** + * prepend salt + */ + + // first step fixed 56 bytes of salt + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + w0_t[0] = salt_buf0[0]; + w0_t[1] = salt_buf0[1]; + w0_t[2] = salt_buf0[2]; + w0_t[3] = salt_buf0[3]; + w1_t[0] = salt_buf1[0]; + w1_t[1] = salt_buf1[1]; + w1_t[2] = salt_buf1[2]; + w1_t[3] = salt_buf1[3]; + w2_t[0] = salt_buf2[0]; + w2_t[1] = salt_buf2[1]; + w2_t[2] = salt_buf2[2]; + w2_t[3] = salt_buf2[3]; + w3_t[0] = salt_buf3[0]; + w3_t[1] = salt_buf3[1]; + + // after 56 byte salt, we have beginning of the password + + w3_t[2] = w0[0]; + w3_t[3] = w0[1]; + + /** + * md5 + */ + + // first transform + + u32x a = MD5M_A; + u32x b = MD5M_B; + u32x c = MD5M_C; + u32x d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0_t[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0_t[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0_t[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1_t[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1_t[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1_t[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2_t[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2_t[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2_t[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3_t[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3_t[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3_t[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0_t[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1_t[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2_t[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1_t[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1_t[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2_t[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3_t[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0_t[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2_t[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3_t[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0_t[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1_t[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3_t[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H , a, b, c, d, w1_t[1], MD5C20, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w2_t[0], MD5C21, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w2_t[3], MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w3_t[2], MD5C23, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w0_t[1], MD5C24, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w1_t[0], MD5C25, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w1_t[3], MD5C26, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w2_t[2], MD5C27, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w3_t[1], MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w0_t[0], MD5C29, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w0_t[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w1_t[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w2_t[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w3_t[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w3_t[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w0_t[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1_t[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3_t[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3_t[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0_t[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0_t[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2_t[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1_t[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3_t[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1_t[0], MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w2_t[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0_t[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2_t[1], MD5C3f, MD5S33); + + a += MD5M_A; + b += MD5M_B; + c += MD5M_C; + d += MD5M_D; + + u32x r_a = a; + u32x r_b = b; + u32x r_c = c; + u32x r_d = d; + + // 2nd transform + + w0_t[0] = w0[2]; + w0_t[1] = w0[3]; + w0_t[2] = w1[0]; + w0_t[3] = w1[1]; + w1_t[0] = w1[2]; + w1_t[1] = w1[3]; + w1_t[2] = w2[0]; + w1_t[3] = w2[1]; + w2_t[0] = w2[2]; + w2_t[1] = w2[3]; + w2_t[2] = w3[0]; + w2_t[3] = w3[1]; + w3_t[0] = w3[2]; + w3_t[1] = w3[3]; + w3_t[2] = pw_salt_len * 8; + w3_t[3] = 0; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0_t[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0_t[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0_t[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1_t[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1_t[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1_t[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2_t[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2_t[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2_t[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3_t[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3_t[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3_t[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0_t[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1_t[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2_t[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1_t[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1_t[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2_t[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3_t[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0_t[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2_t[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3_t[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0_t[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1_t[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3_t[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H , a, b, c, d, w1_t[1], MD5C20, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w2_t[0], MD5C21, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w2_t[3], MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w3_t[2], MD5C23, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w0_t[1], MD5C24, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w1_t[0], MD5C25, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w1_t[3], MD5C26, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w2_t[2], MD5C27, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w3_t[1], MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w0_t[0], MD5C29, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w0_t[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w1_t[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w2_t[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w3_t[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w3_t[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w0_t[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1_t[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3_t[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3_t[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0_t[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0_t[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2_t[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1_t[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3_t[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1_t[0], MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w2_t[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0_t[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2_t[1], MD5C3f, MD5S33); + + a += r_a; + b += r_b; + c += r_c; + d += r_d; + + const u32x r0 = a; + const u32x r1 = d; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_S + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m11000_s08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m11000_s16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/nv/m11000_a1.cu b/nv/m11000_a1.cu new file mode 100644 index 0000000000..e04e7b13e2 --- /dev/null +++ b/nv/m11000_a1.cu @@ -0,0 +1,805 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _MD5_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW2 +#define VECT_SIZE4 +#endif + +#define DGST_R0 0 +#define DGST_R1 3 +#define DGST_R2 2 +#define DGST_R3 1 + +#include "include/kernel_functions.c" +#include "types_nv.c" +#include "common_nv.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +__device__ __constant__ comb_t c_combs[1024]; + +extern "C" __global__ void __launch_bounds__ (256, 1) m11000_m04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, c_combs[0].pw_len); + } + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[ 1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[ 2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[ 3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[ 4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[ 5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[ 6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[ 7]; + + u32 salt_buf2[4]; + + salt_buf2[0] = salt_bufs[salt_pos].salt_buf[ 8]; + salt_buf2[1] = salt_bufs[salt_pos].salt_buf[ 9]; + salt_buf2[2] = salt_bufs[salt_pos].salt_buf[10]; + salt_buf2[3] = salt_bufs[salt_pos].salt_buf[11]; + + u32 salt_buf3[2]; + + salt_buf3[0] = salt_bufs[salt_pos].salt_buf[12]; + salt_buf3[1] = salt_bufs[salt_pos].salt_buf[13]; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = c_combs[il_pos].pw_len; + + const u32 pw_len = pw_l_len + pw_r_len; + + u32 wordr0[4]; + u32 wordr1[4]; + u32 wordr2[4]; + u32 wordr3[4]; + + wordr0[0] = c_combs[il_pos].i[0]; + wordr0[1] = c_combs[il_pos].i[1]; + wordr0[2] = c_combs[il_pos].i[2]; + wordr0[3] = c_combs[il_pos].i[3]; + wordr1[0] = c_combs[il_pos].i[4]; + wordr1[1] = c_combs[il_pos].i[5]; + wordr1[2] = c_combs[il_pos].i[6]; + wordr1[3] = c_combs[il_pos].i[7]; + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + u32x w0[4]; + u32x w1[4]; + u32x w2[4]; + u32x w3[4]; + + w0[0] = wordl0[0] | wordr0[0]; + w0[1] = wordl0[1] | wordr0[1]; + w0[2] = wordl0[2] | wordr0[2]; + w0[3] = wordl0[3] | wordr0[3]; + w1[0] = wordl1[0] | wordr1[0]; + w1[1] = wordl1[1] | wordr1[1]; + w1[2] = wordl1[2] | wordr1[2]; + w1[3] = wordl1[3] | wordr1[3]; + w2[0] = wordl2[0] | wordr2[0]; + w2[1] = wordl2[1] | wordr2[1]; + w2[2] = wordl2[2] | wordr2[2]; + w2[3] = wordl2[3] | wordr2[3]; + w3[0] = wordl3[0] | wordr3[0]; + w3[1] = wordl3[1] | wordr3[1]; + w3[2] = wordl3[2] | wordr3[2]; + w3[3] = wordl3[3] | wordr3[3]; + + append_0x80_4 (w0, w1, w2, w3, pw_len); + + const u32 pw_salt_len = pw_len + salt_len; + + /** + * prepend salt + */ + + // first step fixed 56 bytes of salt + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + w0_t[0] = salt_buf0[0]; + w0_t[1] = salt_buf0[1]; + w0_t[2] = salt_buf0[2]; + w0_t[3] = salt_buf0[3]; + w1_t[0] = salt_buf1[0]; + w1_t[1] = salt_buf1[1]; + w1_t[2] = salt_buf1[2]; + w1_t[3] = salt_buf1[3]; + w2_t[0] = salt_buf2[0]; + w2_t[1] = salt_buf2[1]; + w2_t[2] = salt_buf2[2]; + w2_t[3] = salt_buf2[3]; + w3_t[0] = salt_buf3[0]; + w3_t[1] = salt_buf3[1]; + + // after 56 byte salt, we have beginning of the password + + w3_t[2] = w0[0]; + w3_t[3] = w0[1]; + + /** + * md5 + */ + + // first transform + + u32x a = MD5M_A; + u32x b = MD5M_B; + u32x c = MD5M_C; + u32x d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0_t[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0_t[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0_t[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1_t[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1_t[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1_t[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2_t[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2_t[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2_t[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3_t[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3_t[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3_t[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0_t[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1_t[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2_t[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1_t[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1_t[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2_t[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3_t[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0_t[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2_t[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3_t[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0_t[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1_t[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3_t[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H , a, b, c, d, w1_t[1], MD5C20, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w2_t[0], MD5C21, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w2_t[3], MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w3_t[2], MD5C23, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w0_t[1], MD5C24, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w1_t[0], MD5C25, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w1_t[3], MD5C26, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w2_t[2], MD5C27, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w3_t[1], MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w0_t[0], MD5C29, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w0_t[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w1_t[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w2_t[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w3_t[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w3_t[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w0_t[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1_t[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3_t[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3_t[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0_t[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0_t[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2_t[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1_t[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3_t[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1_t[0], MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w2_t[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0_t[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2_t[1], MD5C3f, MD5S33); + + a += MD5M_A; + b += MD5M_B; + c += MD5M_C; + d += MD5M_D; + + u32x r_a = a; + u32x r_b = b; + u32x r_c = c; + u32x r_d = d; + + // 2nd transform + + w0_t[0] = w0[2]; + w0_t[1] = w0[3]; + w0_t[2] = w1[0]; + w0_t[3] = w1[1]; + w1_t[0] = w1[2]; + w1_t[1] = w1[3]; + w1_t[2] = w2[0]; + w1_t[3] = w2[1]; + w2_t[0] = w2[2]; + w2_t[1] = w2[3]; + w2_t[2] = w3[0]; + w2_t[3] = w3[1]; + w3_t[0] = w3[2]; + w3_t[1] = w3[3]; + w3_t[2] = pw_salt_len * 8; + w3_t[3] = 0; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0_t[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0_t[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0_t[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1_t[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1_t[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1_t[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2_t[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2_t[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2_t[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3_t[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3_t[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3_t[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0_t[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1_t[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2_t[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1_t[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1_t[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2_t[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3_t[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0_t[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2_t[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3_t[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0_t[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1_t[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3_t[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H , a, b, c, d, w1_t[1], MD5C20, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w2_t[0], MD5C21, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w2_t[3], MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w3_t[2], MD5C23, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w0_t[1], MD5C24, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w1_t[0], MD5C25, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w1_t[3], MD5C26, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w2_t[2], MD5C27, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w3_t[1], MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w0_t[0], MD5C29, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w0_t[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w1_t[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w2_t[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w3_t[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w3_t[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w0_t[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1_t[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3_t[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3_t[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0_t[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0_t[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2_t[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1_t[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3_t[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1_t[0], MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w2_t[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0_t[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2_t[1], MD5C3f, MD5S33); + + a += r_a; + b += r_b; + c += r_c; + d += r_d; + + const u32x r0 = a; + const u32x r1 = d; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_M + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m11000_m08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m11000_m16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m11000_s04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, c_combs[0].pw_len); + } + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[ 1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[ 2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[ 3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[ 4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[ 5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[ 6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[ 7]; + + u32 salt_buf2[4]; + + salt_buf2[0] = salt_bufs[salt_pos].salt_buf[ 8]; + salt_buf2[1] = salt_bufs[salt_pos].salt_buf[ 9]; + salt_buf2[2] = salt_bufs[salt_pos].salt_buf[10]; + salt_buf2[3] = salt_bufs[salt_pos].salt_buf[11]; + + u32 salt_buf3[2]; + + salt_buf3[0] = salt_bufs[salt_pos].salt_buf[12]; + salt_buf3[1] = salt_bufs[salt_pos].salt_buf[13]; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = c_combs[il_pos].pw_len; + + const u32 pw_len = pw_l_len + pw_r_len; + + u32 wordr0[4]; + u32 wordr1[4]; + u32 wordr2[4]; + u32 wordr3[4]; + + wordr0[0] = c_combs[il_pos].i[0]; + wordr0[1] = c_combs[il_pos].i[1]; + wordr0[2] = c_combs[il_pos].i[2]; + wordr0[3] = c_combs[il_pos].i[3]; + wordr1[0] = c_combs[il_pos].i[4]; + wordr1[1] = c_combs[il_pos].i[5]; + wordr1[2] = c_combs[il_pos].i[6]; + wordr1[3] = c_combs[il_pos].i[7]; + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + u32x w0[4]; + u32x w1[4]; + u32x w2[4]; + u32x w3[4]; + + w0[0] = wordl0[0] | wordr0[0]; + w0[1] = wordl0[1] | wordr0[1]; + w0[2] = wordl0[2] | wordr0[2]; + w0[3] = wordl0[3] | wordr0[3]; + w1[0] = wordl1[0] | wordr1[0]; + w1[1] = wordl1[1] | wordr1[1]; + w1[2] = wordl1[2] | wordr1[2]; + w1[3] = wordl1[3] | wordr1[3]; + w2[0] = wordl2[0] | wordr2[0]; + w2[1] = wordl2[1] | wordr2[1]; + w2[2] = wordl2[2] | wordr2[2]; + w2[3] = wordl2[3] | wordr2[3]; + w3[0] = wordl3[0] | wordr3[0]; + w3[1] = wordl3[1] | wordr3[1]; + w3[2] = wordl3[2] | wordr3[2]; + w3[3] = wordl3[3] | wordr3[3]; + + append_0x80_4 (w0, w1, w2, w3, pw_len); + + const u32 pw_salt_len = pw_len + salt_len; + + /** + * prepend salt + */ + + // first step fixed 56 bytes of salt + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + w0_t[0] = salt_buf0[0]; + w0_t[1] = salt_buf0[1]; + w0_t[2] = salt_buf0[2]; + w0_t[3] = salt_buf0[3]; + w1_t[0] = salt_buf1[0]; + w1_t[1] = salt_buf1[1]; + w1_t[2] = salt_buf1[2]; + w1_t[3] = salt_buf1[3]; + w2_t[0] = salt_buf2[0]; + w2_t[1] = salt_buf2[1]; + w2_t[2] = salt_buf2[2]; + w2_t[3] = salt_buf2[3]; + w3_t[0] = salt_buf3[0]; + w3_t[1] = salt_buf3[1]; + + // after 56 byte salt, we have beginning of the password + + w3_t[2] = w0[0]; + w3_t[3] = w0[1]; + + /** + * md5 + */ + + // first transform + + u32x a = MD5M_A; + u32x b = MD5M_B; + u32x c = MD5M_C; + u32x d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0_t[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0_t[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0_t[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1_t[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1_t[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1_t[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2_t[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2_t[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2_t[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3_t[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3_t[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3_t[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0_t[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1_t[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2_t[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1_t[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1_t[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2_t[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3_t[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0_t[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2_t[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3_t[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0_t[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1_t[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3_t[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H , a, b, c, d, w1_t[1], MD5C20, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w2_t[0], MD5C21, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w2_t[3], MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w3_t[2], MD5C23, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w0_t[1], MD5C24, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w1_t[0], MD5C25, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w1_t[3], MD5C26, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w2_t[2], MD5C27, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w3_t[1], MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w0_t[0], MD5C29, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w0_t[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w1_t[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w2_t[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w3_t[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w3_t[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w0_t[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1_t[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3_t[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3_t[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0_t[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0_t[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2_t[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1_t[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3_t[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1_t[0], MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w2_t[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0_t[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2_t[1], MD5C3f, MD5S33); + + a += MD5M_A; + b += MD5M_B; + c += MD5M_C; + d += MD5M_D; + + u32x r_a = a; + u32x r_b = b; + u32x r_c = c; + u32x r_d = d; + + // 2nd transform + + w0_t[0] = w0[2]; + w0_t[1] = w0[3]; + w0_t[2] = w1[0]; + w0_t[3] = w1[1]; + w1_t[0] = w1[2]; + w1_t[1] = w1[3]; + w1_t[2] = w2[0]; + w1_t[3] = w2[1]; + w2_t[0] = w2[2]; + w2_t[1] = w2[3]; + w2_t[2] = w3[0]; + w2_t[3] = w3[1]; + w3_t[0] = w3[2]; + w3_t[1] = w3[3]; + w3_t[2] = pw_salt_len * 8; + w3_t[3] = 0; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0_t[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0_t[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0_t[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1_t[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1_t[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1_t[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2_t[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2_t[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2_t[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3_t[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3_t[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3_t[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0_t[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1_t[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2_t[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1_t[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1_t[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2_t[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3_t[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0_t[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2_t[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3_t[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0_t[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1_t[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3_t[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H , a, b, c, d, w1_t[1], MD5C20, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w2_t[0], MD5C21, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w2_t[3], MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w3_t[2], MD5C23, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w0_t[1], MD5C24, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w1_t[0], MD5C25, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w1_t[3], MD5C26, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w2_t[2], MD5C27, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w3_t[1], MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w0_t[0], MD5C29, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w0_t[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w1_t[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w2_t[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w3_t[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w3_t[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w0_t[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1_t[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3_t[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3_t[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0_t[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0_t[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2_t[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1_t[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3_t[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1_t[0], MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w2_t[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0_t[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2_t[1], MD5C3f, MD5S33); + + a += r_a; + b += r_b; + c += r_c; + d += r_d; + + const u32x r0 = a; + const u32x r1 = d; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_S + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m11000_s08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m11000_s16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/nv/m11000_a3.cu b/nv/m11000_a3.cu new file mode 100644 index 0000000000..9bde0a4957 --- /dev/null +++ b/nv/m11000_a3.cu @@ -0,0 +1,889 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _MD5_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW2 +#define VECT_SIZE4 +#endif + +#define DGST_R0 0 +#define DGST_R1 3 +#define DGST_R2 2 +#define DGST_R3 1 + +#include "include/kernel_functions.c" +#include "types_nv.c" +#include "common_nv.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +__device__ __constant__ bf_t c_bfs[1024]; + +__device__ static void m11000m (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], const u32 pw_len, const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset) +{ + /** + * modifier + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + const u32 lid = threadIdx.x; + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[ 1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[ 2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[ 3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[ 4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[ 5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[ 6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[ 7]; + + u32 salt_buf2[4]; + + salt_buf2[0] = salt_bufs[salt_pos].salt_buf[ 8]; + salt_buf2[1] = salt_bufs[salt_pos].salt_buf[ 9]; + salt_buf2[2] = salt_bufs[salt_pos].salt_buf[10]; + salt_buf2[3] = salt_bufs[salt_pos].salt_buf[11]; + + u32 salt_buf3[2]; + + salt_buf3[0] = salt_bufs[salt_pos].salt_buf[12]; + salt_buf3[1] = salt_bufs[salt_pos].salt_buf[13]; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + const u32 pw_salt_len = pw_len + salt_len; + + /** + * loop + */ + + u32x w0l = w0[0]; + + for (u32 il_pos = 0; il_pos < bfs_cnt; il_pos++) + { + const u32 w0r = c_bfs[il_pos].i; + + w0[0] = w0l | w0r; + + /** + * prepend salt + */ + + // first step fixed 56 bytes of salt + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + w0_t[0] = salt_buf0[0]; + w0_t[1] = salt_buf0[1]; + w0_t[2] = salt_buf0[2]; + w0_t[3] = salt_buf0[3]; + w1_t[0] = salt_buf1[0]; + w1_t[1] = salt_buf1[1]; + w1_t[2] = salt_buf1[2]; + w1_t[3] = salt_buf1[3]; + w2_t[0] = salt_buf2[0]; + w2_t[1] = salt_buf2[1]; + w2_t[2] = salt_buf2[2]; + w2_t[3] = salt_buf2[3]; + w3_t[0] = salt_buf3[0]; + w3_t[1] = salt_buf3[1]; + + // after 56 byte salt, we have beginning of the password + + w3_t[2] = w0[0]; + w3_t[3] = w0[1]; + + /** + * md5 + */ + + // first transform + + u32x a = MD5M_A; + u32x b = MD5M_B; + u32x c = MD5M_C; + u32x d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0_t[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0_t[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0_t[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1_t[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1_t[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1_t[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2_t[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2_t[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2_t[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3_t[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3_t[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3_t[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0_t[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1_t[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2_t[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1_t[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1_t[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2_t[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3_t[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0_t[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2_t[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3_t[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0_t[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1_t[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3_t[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H , a, b, c, d, w1_t[1], MD5C20, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w2_t[0], MD5C21, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w2_t[3], MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w3_t[2], MD5C23, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w0_t[1], MD5C24, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w1_t[0], MD5C25, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w1_t[3], MD5C26, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w2_t[2], MD5C27, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w3_t[1], MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w0_t[0], MD5C29, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w0_t[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w1_t[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w2_t[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w3_t[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w3_t[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w0_t[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1_t[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3_t[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3_t[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0_t[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0_t[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2_t[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1_t[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3_t[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1_t[0], MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w2_t[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0_t[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2_t[1], MD5C3f, MD5S33); + + a += MD5M_A; + b += MD5M_B; + c += MD5M_C; + d += MD5M_D; + + u32x r_a = a; + u32x r_b = b; + u32x r_c = c; + u32x r_d = d; + + // 2nd transform + + w0_t[0] = w0[2]; + w0_t[1] = w0[3]; + w0_t[2] = w1[0]; + w0_t[3] = w1[1]; + w1_t[0] = w1[2]; + w1_t[1] = w1[3]; + w1_t[2] = w2[0]; + w1_t[3] = w2[1]; + w2_t[0] = w2[2]; + w2_t[1] = w2[3]; + w2_t[2] = w3[0]; + w2_t[3] = w3[1]; + w3_t[0] = w3[2]; + w3_t[1] = w3[3]; + w3_t[2] = pw_salt_len * 8; + w3_t[3] = 0; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0_t[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0_t[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0_t[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1_t[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1_t[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1_t[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2_t[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2_t[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2_t[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3_t[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3_t[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3_t[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0_t[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1_t[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2_t[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1_t[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1_t[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2_t[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3_t[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0_t[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2_t[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3_t[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0_t[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1_t[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3_t[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H , a, b, c, d, w1_t[1], MD5C20, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w2_t[0], MD5C21, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w2_t[3], MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w3_t[2], MD5C23, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w0_t[1], MD5C24, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w1_t[0], MD5C25, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w1_t[3], MD5C26, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w2_t[2], MD5C27, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w3_t[1], MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w0_t[0], MD5C29, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w0_t[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w1_t[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w2_t[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w3_t[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w3_t[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w0_t[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1_t[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3_t[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3_t[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0_t[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0_t[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2_t[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1_t[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3_t[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1_t[0], MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w2_t[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0_t[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2_t[1], MD5C3f, MD5S33); + + a += r_a; + b += r_b; + c += r_c; + d += r_d; + + const u32x r0 = a; + const u32x r1 = d; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_M + } +} + +__device__ static void m11000s (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], const u32 pw_len, const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset) +{ + /** + * modifier + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + const u32 lid = threadIdx.x; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[ 1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[ 2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[ 3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[ 4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[ 5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[ 6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[ 7]; + + u32 salt_buf2[4]; + + salt_buf2[0] = salt_bufs[salt_pos].salt_buf[ 8]; + salt_buf2[1] = salt_bufs[salt_pos].salt_buf[ 9]; + salt_buf2[2] = salt_bufs[salt_pos].salt_buf[10]; + salt_buf2[3] = salt_bufs[salt_pos].salt_buf[11]; + + u32 salt_buf3[2]; + + salt_buf3[0] = salt_bufs[salt_pos].salt_buf[12]; + salt_buf3[1] = salt_bufs[salt_pos].salt_buf[13]; + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + const u32 pw_salt_len = pw_len + salt_len; + + /** + * loop + */ + + u32x w0l = w0[0]; + + for (u32 il_pos = 0; il_pos < bfs_cnt; il_pos++) + { + const u32 w0r = c_bfs[il_pos].i; + + w0[0] = w0l | w0r; + + /** + * prepend salt + */ + + // first step fixed 56 bytes of salt + + u32x w0_t[4]; + u32x w1_t[4]; + u32x w2_t[4]; + u32x w3_t[4]; + + w0_t[0] = salt_buf0[0]; + w0_t[1] = salt_buf0[1]; + w0_t[2] = salt_buf0[2]; + w0_t[3] = salt_buf0[3]; + w1_t[0] = salt_buf1[0]; + w1_t[1] = salt_buf1[1]; + w1_t[2] = salt_buf1[2]; + w1_t[3] = salt_buf1[3]; + w2_t[0] = salt_buf2[0]; + w2_t[1] = salt_buf2[1]; + w2_t[2] = salt_buf2[2]; + w2_t[3] = salt_buf2[3]; + w3_t[0] = salt_buf3[0]; + w3_t[1] = salt_buf3[1]; + + // after 56 byte salt, we have beginning of the password + + w3_t[2] = w0[0]; + w3_t[3] = w0[1]; + + /** + * md5 + */ + + // first transform + + u32x a = MD5M_A; + u32x b = MD5M_B; + u32x c = MD5M_C; + u32x d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0_t[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0_t[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0_t[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1_t[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1_t[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1_t[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2_t[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2_t[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2_t[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3_t[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3_t[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3_t[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0_t[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1_t[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2_t[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1_t[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1_t[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2_t[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3_t[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0_t[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2_t[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3_t[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0_t[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1_t[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3_t[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H , a, b, c, d, w1_t[1], MD5C20, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w2_t[0], MD5C21, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w2_t[3], MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w3_t[2], MD5C23, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w0_t[1], MD5C24, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w1_t[0], MD5C25, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w1_t[3], MD5C26, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w2_t[2], MD5C27, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w3_t[1], MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w0_t[0], MD5C29, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w0_t[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w1_t[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w2_t[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w3_t[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w3_t[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w0_t[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1_t[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3_t[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3_t[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0_t[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0_t[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2_t[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1_t[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3_t[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1_t[0], MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w2_t[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0_t[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2_t[1], MD5C3f, MD5S33); + + a += MD5M_A; + b += MD5M_B; + c += MD5M_C; + d += MD5M_D; + + u32x r_a = a; + u32x r_b = b; + u32x r_c = c; + u32x r_d = d; + + // 2nd transform + + w0_t[0] = w0[2]; + w0_t[1] = w0[3]; + w0_t[2] = w1[0]; + w0_t[3] = w1[1]; + w1_t[0] = w1[2]; + w1_t[1] = w1[3]; + w1_t[2] = w2[0]; + w1_t[3] = w2[1]; + w2_t[0] = w2[2]; + w2_t[1] = w2[3]; + w2_t[2] = w3[0]; + w2_t[3] = w3[1]; + w3_t[0] = w3[2]; + w3_t[1] = w3[3]; + w3_t[2] = pw_salt_len * 8; + w3_t[3] = 0; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0_t[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0_t[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0_t[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1_t[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1_t[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1_t[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2_t[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2_t[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2_t[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3_t[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3_t[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3_t[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0_t[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1_t[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2_t[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1_t[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1_t[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2_t[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3_t[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0_t[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2_t[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3_t[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0_t[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1_t[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3_t[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H , a, b, c, d, w1_t[1], MD5C20, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w2_t[0], MD5C21, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w2_t[3], MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w3_t[2], MD5C23, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w0_t[1], MD5C24, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w1_t[0], MD5C25, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w1_t[3], MD5C26, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w2_t[2], MD5C27, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w3_t[1], MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w0_t[0], MD5C29, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w0_t[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w1_t[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w2_t[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w3_t[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w3_t[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w0_t[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1_t[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3_t[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3_t[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0_t[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0_t[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2_t[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1_t[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3_t[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1_t[0], MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w2_t[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0_t[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2_t[1], MD5C3f, MD5S33); + + a += r_a; + b += r_b; + c += r_c; + d += r_d; + + const u32x r0 = a; + const u32x r1 = d; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_S + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m11000_m04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m11000m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m11000_m08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m11000m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m11000_m16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = pws[gid].i[ 8]; + w2[1] = pws[gid].i[ 9]; + w2[2] = pws[gid].i[10]; + w2[3] = pws[gid].i[11]; + + u32x w3[4]; + + w3[0] = pws[gid].i[12]; + w3[1] = pws[gid].i[13]; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m11000m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m11000_s04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m11000s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m11000_s08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m11000s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m11000_s16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = pws[gid].i[ 8]; + w2[1] = pws[gid].i[ 9]; + w2[2] = pws[gid].i[10]; + w2[3] = pws[gid].i[11]; + + u32x w3[4]; + + w3[0] = pws[gid].i[12]; + w3[1] = pws[gid].i[13]; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m11000s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} diff --git a/nv/m11100_a0.cu b/nv/m11100_a0.cu new file mode 100644 index 0000000000..75029e2bf8 --- /dev/null +++ b/nv/m11100_a0.cu @@ -0,0 +1,805 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _MD5_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW2 +#define VECT_SIZE1 +#endif + +#define DGST_R0 0 +#define DGST_R1 3 +#define DGST_R2 2 +#define DGST_R3 1 + +#include "include/kernel_functions.c" +#include "types_nv.c" +#include "common_nv.c" +#include "include/rp_gpu.h" +#include "rp_nv.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +#ifdef VECT_SIZE1 +#define uint_to_hex_lower8(i) l_bin2asc[(i)] +#endif + +#ifdef VECT_SIZE2 +#define uint_to_hex_lower8(i) u32x (l_bin2asc[(i).x], l_bin2asc[(i).y]) +#endif + +#ifdef VECT_SIZE4 +#define uint_to_hex_lower8(i) u32x (l_bin2asc[(i).x], l_bin2asc[(i).y], l_bin2asc[(i).z], l_bin2asc[(i).w]) +#endif + +__device__ __constant__ char c_bin2asc[16] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' }; + +__device__ __shared__ short l_bin2asc[256]; + +__device__ __constant__ gpu_rule_t c_rules[1024]; + +extern "C" __global__ void __launch_bounds__ (256, 1) m11100_m04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + u32x pw_buf1[4]; + + pw_buf1[0] = pws[gid].i[ 4]; + pw_buf1[1] = pws[gid].i[ 5]; + pw_buf1[2] = pws[gid].i[ 6]; + pw_buf1[3] = pws[gid].i[ 7]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * challenge + */ + + u32 challenge; + + challenge = salt_bufs[salt_pos].salt_buf[0]; + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 1]; // not a bug + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[ 2]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[ 3]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[ 4]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[ 5]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[ 6]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[ 7]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[ 8]; + + const u32 salt_len = salt_bufs[salt_pos].salt_len - 4; + + /** + * bin2asc table + */ + + l_bin2asc[lid] = c_bin2asc[(lid >> 0) & 15] << 8 + | c_bin2asc[(lid >> 4) & 15] << 0; + + __syncthreads (); + + if (gid >= gid_max) return; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + + w0[0] = pw_buf0[0]; + w0[1] = pw_buf0[1]; + w0[2] = pw_buf0[2]; + w0[3] = pw_buf0[3]; + + u32x w1[4]; + + w1[0] = pw_buf1[0]; + w1[1] = pw_buf1[1]; + w1[2] = pw_buf1[2]; + w1[3] = pw_buf1[3]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 out_len = apply_rules (c_rules[il_pos].cmds, w0, w1, pw_len); + + u32x w0_t[4]; + + w0_t[0] = salt_buf0[0]; + w0_t[1] = salt_buf0[1]; + w0_t[2] = salt_buf0[2]; + w0_t[3] = salt_buf0[3]; + + u32x w1_t[4]; + + w1_t[0] = salt_buf1[0]; + w1_t[1] = salt_buf1[1]; + w1_t[2] = salt_buf1[2]; + w1_t[3] = salt_buf1[3]; + + u32x w2_t[4]; + + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + + u32x w3_t[4]; + + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = 0; + + /* + * append the salt + */ + + switch_buffer_by_offset (w0_t, w1_t, w2_t, w3_t, pw_len); + + const u32 pw_salt_len = out_len + salt_len; + + w0_t[0] |= w0[0]; + w0_t[1] |= w0[1]; + w0_t[2] |= w0[2]; + w0_t[3] |= w0[3]; + + w1_t[0] |= w1[0]; + w1_t[1] |= w1[1]; + w1_t[2] |= w1[2]; + w1_t[3] |= w1[3]; + + w2_t[0] |= w2[0]; + w2_t[1] |= w2[1]; + w2_t[2] |= w2[2]; + w2_t[3] |= w2[3]; + + w3_t[0] |= w3[0]; + w3_t[1] |= w3[1]; + w3_t[2] = pw_salt_len * 8; + w3_t[3] = 0; + + /* + * md5 ($pass.$salt) + */ + + u32x a = MD5M_A; + u32x b = MD5M_B; + u32x c = MD5M_C; + u32x d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0_t[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0_t[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0_t[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1_t[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1_t[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1_t[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2_t[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2_t[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2_t[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3_t[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3_t[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3_t[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0_t[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1_t[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2_t[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1_t[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1_t[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2_t[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3_t[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0_t[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2_t[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3_t[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0_t[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1_t[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3_t[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H , a, b, c, d, w1_t[1], MD5C20, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w2_t[0], MD5C21, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w2_t[3], MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w3_t[2], MD5C23, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w0_t[1], MD5C24, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w1_t[0], MD5C25, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w1_t[3], MD5C26, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w2_t[2], MD5C27, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w3_t[1], MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w0_t[0], MD5C29, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w0_t[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w1_t[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w2_t[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w3_t[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w3_t[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w0_t[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1_t[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3_t[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3_t[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0_t[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0_t[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2_t[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1_t[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3_t[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1_t[0], MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w2_t[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0_t[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2_t[1], MD5C3f, MD5S33); + + a += MD5M_A; + b += MD5M_B; + c += MD5M_C; + d += MD5M_D; + + w0_t[0] = uint_to_hex_lower8 ((a >> 0) & 255) << 0 + | uint_to_hex_lower8 ((a >> 8) & 255) << 16; + w0_t[1] = uint_to_hex_lower8 ((a >> 16) & 255) << 0 + | uint_to_hex_lower8 ((a >> 24) & 255) << 16; + w0_t[2] = uint_to_hex_lower8 ((b >> 0) & 255) << 0 + | uint_to_hex_lower8 ((b >> 8) & 255) << 16; + w0_t[3] = uint_to_hex_lower8 ((b >> 16) & 255) << 0 + | uint_to_hex_lower8 ((b >> 24) & 255) << 16; + w1_t[0] = uint_to_hex_lower8 ((c >> 0) & 255) << 0 + | uint_to_hex_lower8 ((c >> 8) & 255) << 16; + w1_t[1] = uint_to_hex_lower8 ((c >> 16) & 255) << 0 + | uint_to_hex_lower8 ((c >> 24) & 255) << 16; + w1_t[2] = uint_to_hex_lower8 ((d >> 0) & 255) << 0 + | uint_to_hex_lower8 ((d >> 8) & 255) << 16; + w1_t[3] = uint_to_hex_lower8 ((d >> 16) & 255) << 0 + | uint_to_hex_lower8 ((d >> 24) & 255) << 16; + + // add the 4 byte challenge here + + w2_t[0] = challenge; + w2_t[1] = 0x00000080; + w2_t[2] = 0; + w2_t[3] = 0; + + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = (32 + 4) * 8; + w3_t[3] = 0; + + /** + * md5 ($hash.$challenge) + */ + + a = MD5M_A; + b = MD5M_B; + c = MD5M_C; + d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0_t[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0_t[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0_t[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1_t[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1_t[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1_t[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2_t[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2_t[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2_t[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3_t[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3_t[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3_t[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0_t[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1_t[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2_t[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1_t[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1_t[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2_t[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3_t[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0_t[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2_t[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3_t[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0_t[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1_t[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3_t[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H , a, b, c, d, w1_t[1], MD5C20, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w2_t[0], MD5C21, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w2_t[3], MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w3_t[2], MD5C23, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w0_t[1], MD5C24, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w1_t[0], MD5C25, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w1_t[3], MD5C26, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w2_t[2], MD5C27, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w3_t[1], MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w0_t[0], MD5C29, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w0_t[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w1_t[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w2_t[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w3_t[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w3_t[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w0_t[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1_t[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3_t[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3_t[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0_t[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0_t[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2_t[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1_t[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3_t[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1_t[0], MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w2_t[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0_t[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2_t[1], MD5C3f, MD5S33); + + const u32x r0 = a; + const u32x r1 = d; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_M + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m11100_m08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m11100_m16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m11100_s04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + u32x pw_buf1[4]; + + pw_buf1[0] = pws[gid].i[ 4]; + pw_buf1[1] = pws[gid].i[ 5]; + pw_buf1[2] = pws[gid].i[ 6]; + pw_buf1[3] = pws[gid].i[ 7]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * challenge + */ + + u32 challenge; + + challenge = salt_bufs[salt_pos].salt_buf[0]; + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 1]; // not a bug + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[ 2]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[ 3]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[ 4]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[ 5]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[ 6]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[ 7]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[ 8]; + + const u32 salt_len = salt_bufs[salt_pos].salt_len - 4; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * bin2asc table + */ + + l_bin2asc[lid] = c_bin2asc[(lid >> 0) & 15] << 8 + | c_bin2asc[(lid >> 4) & 15] << 0; + + __syncthreads (); + + if (gid >= gid_max) return; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + + w0[0] = pw_buf0[0]; + w0[1] = pw_buf0[1]; + w0[2] = pw_buf0[2]; + w0[3] = pw_buf0[3]; + + u32x w1[4]; + + w1[0] = pw_buf1[0]; + w1[1] = pw_buf1[1]; + w1[2] = pw_buf1[2]; + w1[3] = pw_buf1[3]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 out_len = apply_rules (c_rules[il_pos].cmds, w0, w1, pw_len); + + u32x w0_t[4]; + + w0_t[0] = salt_buf0[0]; + w0_t[1] = salt_buf0[1]; + w0_t[2] = salt_buf0[2]; + w0_t[3] = salt_buf0[3]; + + u32x w1_t[4]; + + w1_t[0] = salt_buf1[0]; + w1_t[1] = salt_buf1[1]; + w1_t[2] = salt_buf1[2]; + w1_t[3] = salt_buf1[3]; + + u32x w2_t[4]; + + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + + u32x w3_t[4]; + + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = 0; + + /* + * append the salt + */ + + switch_buffer_by_offset (w0_t, w1_t, w2_t, w3_t, pw_len); + + const u32 pw_salt_len = out_len + salt_len; + + w0_t[0] |= w0[0]; + w0_t[1] |= w0[1]; + w0_t[2] |= w0[2]; + w0_t[3] |= w0[3]; + + w1_t[0] |= w1[0]; + w1_t[1] |= w1[1]; + w1_t[2] |= w1[2]; + w1_t[3] |= w1[3]; + + w2_t[0] |= w2[0]; + w2_t[1] |= w2[1]; + w2_t[2] |= w2[2]; + w2_t[3] |= w2[3]; + + w3_t[0] |= w3[0]; + w3_t[1] |= w3[1]; + w3_t[2] = pw_salt_len * 8; + w3_t[3] = 0; + + /* + * md5 ($pass.$salt) + */ + + u32x a = MD5M_A; + u32x b = MD5M_B; + u32x c = MD5M_C; + u32x d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0_t[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0_t[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0_t[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1_t[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1_t[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1_t[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2_t[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2_t[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2_t[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3_t[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3_t[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3_t[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0_t[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1_t[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2_t[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1_t[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1_t[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2_t[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3_t[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0_t[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2_t[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3_t[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0_t[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1_t[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3_t[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H , a, b, c, d, w1_t[1], MD5C20, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w2_t[0], MD5C21, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w2_t[3], MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w3_t[2], MD5C23, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w0_t[1], MD5C24, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w1_t[0], MD5C25, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w1_t[3], MD5C26, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w2_t[2], MD5C27, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w3_t[1], MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w0_t[0], MD5C29, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w0_t[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w1_t[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w2_t[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w3_t[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w3_t[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w0_t[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1_t[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3_t[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3_t[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0_t[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0_t[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2_t[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1_t[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3_t[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1_t[0], MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w2_t[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0_t[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2_t[1], MD5C3f, MD5S33); + + a += MD5M_A; + b += MD5M_B; + c += MD5M_C; + d += MD5M_D; + + w0_t[0] = uint_to_hex_lower8 ((a >> 0) & 255) << 0 + | uint_to_hex_lower8 ((a >> 8) & 255) << 16; + w0_t[1] = uint_to_hex_lower8 ((a >> 16) & 255) << 0 + | uint_to_hex_lower8 ((a >> 24) & 255) << 16; + w0_t[2] = uint_to_hex_lower8 ((b >> 0) & 255) << 0 + | uint_to_hex_lower8 ((b >> 8) & 255) << 16; + w0_t[3] = uint_to_hex_lower8 ((b >> 16) & 255) << 0 + | uint_to_hex_lower8 ((b >> 24) & 255) << 16; + w1_t[0] = uint_to_hex_lower8 ((c >> 0) & 255) << 0 + | uint_to_hex_lower8 ((c >> 8) & 255) << 16; + w1_t[1] = uint_to_hex_lower8 ((c >> 16) & 255) << 0 + | uint_to_hex_lower8 ((c >> 24) & 255) << 16; + w1_t[2] = uint_to_hex_lower8 ((d >> 0) & 255) << 0 + | uint_to_hex_lower8 ((d >> 8) & 255) << 16; + w1_t[3] = uint_to_hex_lower8 ((d >> 16) & 255) << 0 + | uint_to_hex_lower8 ((d >> 24) & 255) << 16; + + // add the 4 byte challenge here + + w2_t[0] = challenge; + w2_t[1] = 0x00000080; + w2_t[2] = 0; + w2_t[3] = 0; + + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = (32 + 4) * 8; + w3_t[3] = 0; + + /** + * md5 ($hash.$challenge) + */ + + a = MD5M_A; + b = MD5M_B; + c = MD5M_C; + d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0_t[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0_t[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0_t[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1_t[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1_t[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1_t[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2_t[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2_t[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2_t[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3_t[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3_t[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3_t[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0_t[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1_t[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2_t[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1_t[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1_t[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2_t[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3_t[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0_t[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2_t[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3_t[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0_t[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1_t[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3_t[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H , a, b, c, d, w1_t[1], MD5C20, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w2_t[0], MD5C21, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w2_t[3], MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w3_t[2], MD5C23, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w0_t[1], MD5C24, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w1_t[0], MD5C25, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w1_t[3], MD5C26, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w2_t[2], MD5C27, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w3_t[1], MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w0_t[0], MD5C29, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w0_t[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w1_t[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w2_t[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w3_t[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w3_t[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w0_t[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1_t[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3_t[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3_t[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0_t[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0_t[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2_t[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1_t[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3_t[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1_t[0], MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w2_t[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0_t[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2_t[1], MD5C3f, MD5S33); + + const u32x r0 = a; + const u32x r1 = d; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_S + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m11100_s08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m11100_s16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/nv/m11100_a1.cu b/nv/m11100_a1.cu new file mode 100644 index 0000000000..c28630e843 --- /dev/null +++ b/nv/m11100_a1.cu @@ -0,0 +1,855 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _MD5_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW2 +#define VECT_SIZE1 +#endif + +#define DGST_R0 0 +#define DGST_R1 3 +#define DGST_R2 2 +#define DGST_R3 1 + +#include "include/kernel_functions.c" +#include "types_nv.c" +#include "common_nv.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +#ifdef VECT_SIZE1 +#define uint_to_hex_lower8(i) l_bin2asc[(i)] +#endif + +#ifdef VECT_SIZE2 +#define uint_to_hex_lower8(i) u32x (l_bin2asc[(i).x], l_bin2asc[(i).y]) +#endif + +#ifdef VECT_SIZE4 +#define uint_to_hex_lower8(i) u32x (l_bin2asc[(i).x], l_bin2asc[(i).y], l_bin2asc[(i).z], l_bin2asc[(i).w]) +#endif + +__device__ __constant__ char c_bin2asc[16] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' }; + +__device__ __shared__ short l_bin2asc[256]; + +__device__ __constant__ comb_t c_combs[1024]; + +extern "C" __global__ void __launch_bounds__ (256, 1) m11100_m04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, c_combs[0].pw_len); + } + + /** + * challenge + */ + + u32 challenge; + + challenge = salt_bufs[salt_pos].salt_buf[0]; + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 1]; // not a bug + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[ 2]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[ 3]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[ 4]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[ 5]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[ 6]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[ 7]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[ 8]; + + const u32 salt_len = salt_bufs[salt_pos].salt_len - 4; + + /** + * bin2asc table + */ + + l_bin2asc[lid] = c_bin2asc[(lid >> 0) & 15] << 8 + | c_bin2asc[(lid >> 4) & 15] << 0; + + __syncthreads (); + + if (gid >= gid_max) return; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = c_combs[il_pos].pw_len; + + const u32 pw_len = pw_l_len + pw_r_len; + + u32 wordr0[4]; + + wordr0[0] = c_combs[il_pos].i[0]; + wordr0[1] = c_combs[il_pos].i[1]; + wordr0[2] = c_combs[il_pos].i[2]; + wordr0[3] = c_combs[il_pos].i[3]; + + u32 wordr1[4]; + + wordr1[0] = c_combs[il_pos].i[4]; + wordr1[1] = c_combs[il_pos].i[5]; + wordr1[2] = c_combs[il_pos].i[6]; + wordr1[3] = c_combs[il_pos].i[7]; + + u32 wordr2[4]; + + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + + u32 wordr3[4]; + + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + u32x w0_t[4]; + + w0_t[0] = salt_buf0[0]; + w0_t[1] = salt_buf0[1]; + w0_t[2] = salt_buf0[2]; + w0_t[3] = salt_buf0[3]; + + u32x w1_t[4]; + + w1_t[0] = salt_buf1[0]; + w1_t[1] = salt_buf1[1]; + w1_t[2] = salt_buf1[2]; + w1_t[3] = salt_buf1[3]; + + u32x w2_t[4]; + + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + + u32x w3_t[4]; + + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = 0; + + /* + * append the salt + */ + + switch_buffer_by_offset (w0_t, w1_t, w2_t, w3_t, pw_len); + + const u32 pw_salt_len = pw_len + salt_len; + + w0_t[0] |= wordl0[0] | wordr0[0]; + w0_t[1] |= wordl0[1] | wordr0[1]; + w0_t[2] |= wordl0[2] | wordr0[2]; + w0_t[3] |= wordl0[3] | wordr0[3]; + + w1_t[0] |= wordl1[0] | wordr1[0]; + w1_t[1] |= wordl1[1] | wordr1[1]; + w1_t[2] |= wordl1[2] | wordr1[2]; + w1_t[3] |= wordl1[3] | wordr1[3]; + + w2_t[0] |= wordl2[0] | wordr2[0]; + w2_t[1] |= wordl2[1] | wordr2[1]; + w2_t[2] |= wordl2[2] | wordr2[2]; + w2_t[3] |= wordl2[3] | wordr2[3]; + + w3_t[0] |= wordl3[0] | wordr3[0]; + w3_t[1] |= wordl3[0] | wordr3[0]; + w3_t[2] = pw_salt_len * 8; + w3_t[3] = 0; + + /* + * md5 ($pass.$salt) + */ + + u32x a = MD5M_A; + u32x b = MD5M_B; + u32x c = MD5M_C; + u32x d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0_t[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0_t[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0_t[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1_t[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1_t[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1_t[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2_t[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2_t[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2_t[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3_t[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3_t[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3_t[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0_t[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1_t[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2_t[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1_t[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1_t[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2_t[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3_t[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0_t[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2_t[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3_t[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0_t[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1_t[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3_t[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H , a, b, c, d, w1_t[1], MD5C20, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w2_t[0], MD5C21, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w2_t[3], MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w3_t[2], MD5C23, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w0_t[1], MD5C24, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w1_t[0], MD5C25, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w1_t[3], MD5C26, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w2_t[2], MD5C27, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w3_t[1], MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w0_t[0], MD5C29, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w0_t[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w1_t[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w2_t[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w3_t[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w3_t[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w0_t[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1_t[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3_t[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3_t[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0_t[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0_t[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2_t[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1_t[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3_t[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1_t[0], MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w2_t[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0_t[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2_t[1], MD5C3f, MD5S33); + + a += MD5M_A; + b += MD5M_B; + c += MD5M_C; + d += MD5M_D; + + w0_t[0] = uint_to_hex_lower8 ((a >> 0) & 255) << 0 + | uint_to_hex_lower8 ((a >> 8) & 255) << 16; + w0_t[1] = uint_to_hex_lower8 ((a >> 16) & 255) << 0 + | uint_to_hex_lower8 ((a >> 24) & 255) << 16; + w0_t[2] = uint_to_hex_lower8 ((b >> 0) & 255) << 0 + | uint_to_hex_lower8 ((b >> 8) & 255) << 16; + w0_t[3] = uint_to_hex_lower8 ((b >> 16) & 255) << 0 + | uint_to_hex_lower8 ((b >> 24) & 255) << 16; + w1_t[0] = uint_to_hex_lower8 ((c >> 0) & 255) << 0 + | uint_to_hex_lower8 ((c >> 8) & 255) << 16; + w1_t[1] = uint_to_hex_lower8 ((c >> 16) & 255) << 0 + | uint_to_hex_lower8 ((c >> 24) & 255) << 16; + w1_t[2] = uint_to_hex_lower8 ((d >> 0) & 255) << 0 + | uint_to_hex_lower8 ((d >> 8) & 255) << 16; + w1_t[3] = uint_to_hex_lower8 ((d >> 16) & 255) << 0 + | uint_to_hex_lower8 ((d >> 24) & 255) << 16; + + // add the 4 byte challenge here + + w2_t[0] = challenge; + w2_t[1] = 0x00000080; + w2_t[2] = 0; + w2_t[3] = 0; + + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = (32 + 4) * 8; + w3_t[3] = 0; + + /** + * md5 ($hash.$challenge) + */ + + a = MD5M_A; + b = MD5M_B; + c = MD5M_C; + d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0_t[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0_t[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0_t[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1_t[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1_t[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1_t[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2_t[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2_t[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2_t[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3_t[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3_t[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3_t[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0_t[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1_t[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2_t[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1_t[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1_t[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2_t[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3_t[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0_t[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2_t[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3_t[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0_t[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1_t[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3_t[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H , a, b, c, d, w1_t[1], MD5C20, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w2_t[0], MD5C21, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w2_t[3], MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w3_t[2], MD5C23, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w0_t[1], MD5C24, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w1_t[0], MD5C25, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w1_t[3], MD5C26, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w2_t[2], MD5C27, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w3_t[1], MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w0_t[0], MD5C29, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w0_t[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w1_t[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w2_t[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w3_t[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w3_t[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w0_t[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1_t[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3_t[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3_t[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0_t[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0_t[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2_t[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1_t[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3_t[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1_t[0], MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w2_t[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0_t[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2_t[1], MD5C3f, MD5S33); + + const u32x r0 = a; + const u32x r1 = d; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_M + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m11100_m08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m11100_m16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m11100_s04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, c_combs[0].pw_len); + } + + /** + * challenge + */ + + u32 challenge; + + challenge = salt_bufs[salt_pos].salt_buf[0]; + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 1]; // not a bug + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[ 2]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[ 3]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[ 4]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[ 5]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[ 6]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[ 7]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[ 8]; + + const u32 salt_len = salt_bufs[salt_pos].salt_len - 4; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * bin2asc table + */ + + l_bin2asc[lid] = c_bin2asc[(lid >> 0) & 15] << 8 + | c_bin2asc[(lid >> 4) & 15] << 0; + + __syncthreads (); + + if (gid >= gid_max) return; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = c_combs[il_pos].pw_len; + + const u32 pw_len = pw_l_len + pw_r_len; + + u32 wordr0[4]; + + wordr0[0] = c_combs[il_pos].i[0]; + wordr0[1] = c_combs[il_pos].i[1]; + wordr0[2] = c_combs[il_pos].i[2]; + wordr0[3] = c_combs[il_pos].i[3]; + + u32 wordr1[4]; + + wordr1[0] = c_combs[il_pos].i[4]; + wordr1[1] = c_combs[il_pos].i[5]; + wordr1[2] = c_combs[il_pos].i[6]; + wordr1[3] = c_combs[il_pos].i[7]; + + u32 wordr2[4]; + + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + + u32 wordr3[4]; + + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + u32x w0_t[4]; + + w0_t[0] = salt_buf0[0]; + w0_t[1] = salt_buf0[1]; + w0_t[2] = salt_buf0[2]; + w0_t[3] = salt_buf0[3]; + + u32x w1_t[4]; + + w1_t[0] = salt_buf1[0]; + w1_t[1] = salt_buf1[1]; + w1_t[2] = salt_buf1[2]; + w1_t[3] = salt_buf1[3]; + + u32x w2_t[4]; + + w2_t[0] = 0; + w2_t[1] = 0; + w2_t[2] = 0; + w2_t[3] = 0; + + u32x w3_t[4]; + + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = 0; + w3_t[3] = 0; + + /* + * append the salt + */ + + switch_buffer_by_offset (w0_t, w1_t, w2_t, w3_t, pw_len); + + const u32 pw_salt_len = pw_len + salt_len; + + w0_t[0] |= wordl0[0] | wordr0[0]; + w0_t[1] |= wordl0[1] | wordr0[1]; + w0_t[2] |= wordl0[2] | wordr0[2]; + w0_t[3] |= wordl0[3] | wordr0[3]; + + w1_t[0] |= wordl1[0] | wordr1[0]; + w1_t[1] |= wordl1[1] | wordr1[1]; + w1_t[2] |= wordl1[2] | wordr1[2]; + w1_t[3] |= wordl1[3] | wordr1[3]; + + w2_t[0] |= wordl2[0] | wordr2[0]; + w2_t[1] |= wordl2[1] | wordr2[1]; + w2_t[2] |= wordl2[2] | wordr2[2]; + w2_t[3] |= wordl2[3] | wordr2[3]; + + w3_t[0] |= wordl3[0] | wordr3[0]; + w3_t[1] |= wordl3[0] | wordr3[0]; + w3_t[2] = pw_salt_len * 8; + w3_t[3] = 0; + + /* + * md5 ($pass.$salt) + */ + + u32x a = MD5M_A; + u32x b = MD5M_B; + u32x c = MD5M_C; + u32x d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0_t[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0_t[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0_t[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1_t[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1_t[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1_t[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2_t[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2_t[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2_t[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3_t[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3_t[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3_t[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0_t[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1_t[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2_t[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1_t[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1_t[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2_t[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3_t[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0_t[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2_t[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3_t[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0_t[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1_t[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3_t[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H , a, b, c, d, w1_t[1], MD5C20, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w2_t[0], MD5C21, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w2_t[3], MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w3_t[2], MD5C23, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w0_t[1], MD5C24, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w1_t[0], MD5C25, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w1_t[3], MD5C26, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w2_t[2], MD5C27, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w3_t[1], MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w0_t[0], MD5C29, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w0_t[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w1_t[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w2_t[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w3_t[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w3_t[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w0_t[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1_t[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3_t[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3_t[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0_t[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0_t[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2_t[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1_t[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3_t[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1_t[0], MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w2_t[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0_t[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2_t[1], MD5C3f, MD5S33); + + a += MD5M_A; + b += MD5M_B; + c += MD5M_C; + d += MD5M_D; + + w0_t[0] = uint_to_hex_lower8 ((a >> 0) & 255) << 0 + | uint_to_hex_lower8 ((a >> 8) & 255) << 16; + w0_t[1] = uint_to_hex_lower8 ((a >> 16) & 255) << 0 + | uint_to_hex_lower8 ((a >> 24) & 255) << 16; + w0_t[2] = uint_to_hex_lower8 ((b >> 0) & 255) << 0 + | uint_to_hex_lower8 ((b >> 8) & 255) << 16; + w0_t[3] = uint_to_hex_lower8 ((b >> 16) & 255) << 0 + | uint_to_hex_lower8 ((b >> 24) & 255) << 16; + w1_t[0] = uint_to_hex_lower8 ((c >> 0) & 255) << 0 + | uint_to_hex_lower8 ((c >> 8) & 255) << 16; + w1_t[1] = uint_to_hex_lower8 ((c >> 16) & 255) << 0 + | uint_to_hex_lower8 ((c >> 24) & 255) << 16; + w1_t[2] = uint_to_hex_lower8 ((d >> 0) & 255) << 0 + | uint_to_hex_lower8 ((d >> 8) & 255) << 16; + w1_t[3] = uint_to_hex_lower8 ((d >> 16) & 255) << 0 + | uint_to_hex_lower8 ((d >> 24) & 255) << 16; + + // add the 4 byte challenge here + + w2_t[0] = challenge; + w2_t[1] = 0x00000080; + w2_t[2] = 0; + w2_t[3] = 0; + + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = (32 + 4) * 8; + w3_t[3] = 0; + + /** + * md5 ($hash.$challenge) + */ + + a = MD5M_A; + b = MD5M_B; + c = MD5M_C; + d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0_t[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0_t[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0_t[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1_t[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1_t[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1_t[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2_t[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2_t[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2_t[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3_t[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3_t[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3_t[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0_t[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1_t[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2_t[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1_t[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1_t[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2_t[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3_t[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0_t[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2_t[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3_t[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0_t[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1_t[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3_t[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H , a, b, c, d, w1_t[1], MD5C20, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w2_t[0], MD5C21, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w2_t[3], MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w3_t[2], MD5C23, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w0_t[1], MD5C24, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w1_t[0], MD5C25, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w1_t[3], MD5C26, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w2_t[2], MD5C27, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w3_t[1], MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w0_t[0], MD5C29, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w0_t[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w1_t[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w2_t[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w3_t[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w3_t[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w0_t[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1_t[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3_t[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3_t[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0_t[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0_t[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2_t[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1_t[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3_t[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1_t[0], MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w2_t[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0_t[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2_t[1], MD5C3f, MD5S33); + + const u32x r0 = a; + const u32x r1 = d; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_S + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m11100_s08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m11100_s16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/nv/m11100_a3.cu b/nv/m11100_a3.cu new file mode 100644 index 0000000000..b30db2ca91 --- /dev/null +++ b/nv/m11100_a3.cu @@ -0,0 +1,1027 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _MD5_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW2 +#define VECT_SIZE1 +#endif + +#define DGST_R0 0 +#define DGST_R1 3 +#define DGST_R2 2 +#define DGST_R3 1 + +#include "include/kernel_functions.c" +#include "types_nv.c" +#include "common_nv.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +#ifdef VECT_SIZE1 +#define uint_to_hex_lower8(i) l_bin2asc[(i)] +#endif + +#ifdef VECT_SIZE2 +#define uint_to_hex_lower8(i) u32x (l_bin2asc[(i).x], l_bin2asc[(i).y]) +#endif + +#ifdef VECT_SIZE4 +#define uint_to_hex_lower8(i) u32x (l_bin2asc[(i).x], l_bin2asc[(i).y], l_bin2asc[(i).z], l_bin2asc[(i).w]) +#endif + +__device__ __constant__ char c_bin2asc[16] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' }; + +__device__ __shared__ short l_bin2asc[256]; + +__device__ __constant__ bf_t c_bfs[1024]; + +__device__ static void m11100m (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], const u32 pw_len, const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset) +{ + /** + * modifier + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + const u32 lid = threadIdx.x; + + /** + * challenge + */ + + u32 challenge; + + challenge = salt_bufs[salt_pos].salt_buf[0]; + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 1]; // not a bug + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[ 2]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[ 3]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[ 4]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[ 5]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[ 6]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[ 7]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[ 8]; + + u32 salt_buf2[4]; + + salt_buf2[0] = 0; + salt_buf2[1] = 0; + salt_buf2[2] = 0; + salt_buf2[3] = 0; + + u32 salt_buf3[4]; + + salt_buf3[0] = 0; + salt_buf3[1] = 0; + salt_buf3[2] = 0; + salt_buf3[3] = 0; + + const u32 salt_len = salt_bufs[salt_pos].salt_len - 4; + + switch_buffer_by_offset (salt_buf0, salt_buf1, salt_buf2, salt_buf3, pw_len); + + const u32 pw_salt_len = pw_len + salt_len; + + /** + * loop + */ + + u32x w0l = w0[0]; + + for (u32 il_pos = 0; il_pos < bfs_cnt; il_pos++) + { + const u32 w0r = c_bfs[il_pos].i; + + w0[0] = w0l | w0r; + + u32x w0_t[4]; + + w0_t[0] = w0[0] | salt_buf0[0]; + w0_t[1] = w0[1] | salt_buf0[1]; + w0_t[2] = w0[2] | salt_buf0[2]; + w0_t[3] = w0[3] | salt_buf0[3]; + + u32x w1_t[4]; + + w1_t[0] = w1[0] | salt_buf1[0]; + w1_t[1] = w1[1] | salt_buf1[1]; + w1_t[2] = w1[2] | salt_buf1[2]; + w1_t[3] = w1[3] | salt_buf1[3]; + + u32x w2_t[4]; + + w2_t[0] = w2[0] | salt_buf2[0]; + w2_t[1] = w2[1] | salt_buf2[1]; + w2_t[2] = w2[2] | salt_buf2[2]; + w2_t[3] = w2[3] | salt_buf2[3]; + + u32x w3_t[4]; + + w3_t[0] = w3[0] | salt_buf3[0]; + w3_t[1] = w3[1] | salt_buf3[1]; + w3_t[2] = pw_salt_len * 8; + w3_t[3] = 0; + + /* + * md5 ($pass.$salt) + */ + + u32x a = MD5M_A; + u32x b = MD5M_B; + u32x c = MD5M_C; + u32x d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0_t[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0_t[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0_t[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1_t[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1_t[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1_t[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2_t[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2_t[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2_t[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3_t[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3_t[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3_t[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0_t[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1_t[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2_t[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1_t[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1_t[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2_t[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3_t[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0_t[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2_t[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3_t[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0_t[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1_t[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3_t[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H , a, b, c, d, w1_t[1], MD5C20, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w2_t[0], MD5C21, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w2_t[3], MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w3_t[2], MD5C23, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w0_t[1], MD5C24, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w1_t[0], MD5C25, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w1_t[3], MD5C26, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w2_t[2], MD5C27, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w3_t[1], MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w0_t[0], MD5C29, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w0_t[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w1_t[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w2_t[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w3_t[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w3_t[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w0_t[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1_t[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3_t[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3_t[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0_t[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0_t[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2_t[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1_t[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3_t[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1_t[0], MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w2_t[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0_t[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2_t[1], MD5C3f, MD5S33); + + a += MD5M_A; + b += MD5M_B; + c += MD5M_C; + d += MD5M_D; + + w0_t[0] = uint_to_hex_lower8 ((a >> 0) & 255) << 0 + | uint_to_hex_lower8 ((a >> 8) & 255) << 16; + w0_t[1] = uint_to_hex_lower8 ((a >> 16) & 255) << 0 + | uint_to_hex_lower8 ((a >> 24) & 255) << 16; + w0_t[2] = uint_to_hex_lower8 ((b >> 0) & 255) << 0 + | uint_to_hex_lower8 ((b >> 8) & 255) << 16; + w0_t[3] = uint_to_hex_lower8 ((b >> 16) & 255) << 0 + | uint_to_hex_lower8 ((b >> 24) & 255) << 16; + w1_t[0] = uint_to_hex_lower8 ((c >> 0) & 255) << 0 + | uint_to_hex_lower8 ((c >> 8) & 255) << 16; + w1_t[1] = uint_to_hex_lower8 ((c >> 16) & 255) << 0 + | uint_to_hex_lower8 ((c >> 24) & 255) << 16; + w1_t[2] = uint_to_hex_lower8 ((d >> 0) & 255) << 0 + | uint_to_hex_lower8 ((d >> 8) & 255) << 16; + w1_t[3] = uint_to_hex_lower8 ((d >> 16) & 255) << 0 + | uint_to_hex_lower8 ((d >> 24) & 255) << 16; + + // add the 4 byte challenge here + + w2_t[0] = challenge; + w2_t[1] = 0x00000080; + w2_t[2] = 0; + w2_t[3] = 0; + + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = (32 + 4) * 8; + w3_t[3] = 0; + + /** + * md5 ($hash.$challenge) + */ + + a = MD5M_A; + b = MD5M_B; + c = MD5M_C; + d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0_t[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0_t[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0_t[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1_t[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1_t[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1_t[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2_t[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2_t[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2_t[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3_t[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3_t[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3_t[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0_t[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1_t[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2_t[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1_t[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1_t[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2_t[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3_t[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0_t[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2_t[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3_t[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0_t[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1_t[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3_t[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H , a, b, c, d, w1_t[1], MD5C20, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w2_t[0], MD5C21, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w2_t[3], MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w3_t[2], MD5C23, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w0_t[1], MD5C24, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w1_t[0], MD5C25, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w1_t[3], MD5C26, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w2_t[2], MD5C27, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w3_t[1], MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w0_t[0], MD5C29, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w0_t[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w1_t[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w2_t[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w3_t[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w3_t[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w0_t[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1_t[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3_t[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3_t[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0_t[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0_t[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2_t[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1_t[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3_t[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1_t[0], MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w2_t[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0_t[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2_t[1], MD5C3f, MD5S33); + + const u32x r0 = a; + const u32x r1 = d; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_M + } +} + +__device__ static void m11100s (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], const u32 pw_len, const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset) +{ + /** + * modifier + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + const u32 lid = threadIdx.x; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * challenge + */ + + u32 challenge; + + challenge = salt_bufs[salt_pos].salt_buf[0]; + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[ 1]; // not a bug + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[ 2]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[ 3]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[ 4]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[ 5]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[ 6]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[ 7]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[ 8]; + + u32 salt_buf2[4]; + + salt_buf2[0] = 0; + salt_buf2[1] = 0; + salt_buf2[2] = 0; + salt_buf2[3] = 0; + + u32 salt_buf3[4]; + + salt_buf3[0] = 0; + salt_buf3[1] = 0; + salt_buf3[2] = 0; + salt_buf3[3] = 0; + + const u32 salt_len = salt_bufs[salt_pos].salt_len - 4; + + switch_buffer_by_offset (salt_buf0, salt_buf1, salt_buf2, salt_buf3, pw_len); + + const u32 pw_salt_len = pw_len + salt_len; + + /** + * loop + */ + + u32x w0l = w0[0]; + + for (u32 il_pos = 0; il_pos < bfs_cnt; il_pos++) + { + const u32 w0r = c_bfs[il_pos].i; + + w0[0] = w0l | w0r; + + u32x w0_t[4]; + + w0_t[0] = w0[0] | salt_buf0[0]; + w0_t[1] = w0[1] | salt_buf0[1]; + w0_t[2] = w0[2] | salt_buf0[2]; + w0_t[3] = w0[3] | salt_buf0[3]; + + u32x w1_t[4]; + + w1_t[0] = w1[0] | salt_buf1[0]; + w1_t[1] = w1[1] | salt_buf1[1]; + w1_t[2] = w1[2] | salt_buf1[2]; + w1_t[3] = w1[3] | salt_buf1[3]; + + u32x w2_t[4]; + + w2_t[0] = w2[0] | salt_buf2[0]; + w2_t[1] = w2[1] | salt_buf2[1]; + w2_t[2] = w2[2] | salt_buf2[2]; + w2_t[3] = w2[3] | salt_buf2[3]; + + u32x w3_t[4]; + + w3_t[0] = w3[0] | salt_buf3[0]; + w3_t[1] = w3[1] | salt_buf3[1]; + w3_t[2] = pw_salt_len * 8; + w3_t[3] = 0; + + /* + * md5 ($pass.$salt) + */ + + u32x a = MD5M_A; + u32x b = MD5M_B; + u32x c = MD5M_C; + u32x d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0_t[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0_t[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0_t[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1_t[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1_t[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1_t[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2_t[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2_t[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2_t[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3_t[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3_t[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3_t[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0_t[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1_t[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2_t[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1_t[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1_t[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2_t[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3_t[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0_t[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2_t[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3_t[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0_t[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1_t[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3_t[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H , a, b, c, d, w1_t[1], MD5C20, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w2_t[0], MD5C21, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w2_t[3], MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w3_t[2], MD5C23, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w0_t[1], MD5C24, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w1_t[0], MD5C25, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w1_t[3], MD5C26, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w2_t[2], MD5C27, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w3_t[1], MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w0_t[0], MD5C29, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w0_t[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w1_t[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w2_t[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w3_t[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w3_t[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w0_t[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1_t[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3_t[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3_t[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0_t[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0_t[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2_t[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1_t[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3_t[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1_t[0], MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w2_t[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0_t[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2_t[1], MD5C3f, MD5S33); + + a += MD5M_A; + b += MD5M_B; + c += MD5M_C; + d += MD5M_D; + + w0_t[0] = uint_to_hex_lower8 ((a >> 0) & 255) << 0 + | uint_to_hex_lower8 ((a >> 8) & 255) << 16; + w0_t[1] = uint_to_hex_lower8 ((a >> 16) & 255) << 0 + | uint_to_hex_lower8 ((a >> 24) & 255) << 16; + w0_t[2] = uint_to_hex_lower8 ((b >> 0) & 255) << 0 + | uint_to_hex_lower8 ((b >> 8) & 255) << 16; + w0_t[3] = uint_to_hex_lower8 ((b >> 16) & 255) << 0 + | uint_to_hex_lower8 ((b >> 24) & 255) << 16; + w1_t[0] = uint_to_hex_lower8 ((c >> 0) & 255) << 0 + | uint_to_hex_lower8 ((c >> 8) & 255) << 16; + w1_t[1] = uint_to_hex_lower8 ((c >> 16) & 255) << 0 + | uint_to_hex_lower8 ((c >> 24) & 255) << 16; + w1_t[2] = uint_to_hex_lower8 ((d >> 0) & 255) << 0 + | uint_to_hex_lower8 ((d >> 8) & 255) << 16; + w1_t[3] = uint_to_hex_lower8 ((d >> 16) & 255) << 0 + | uint_to_hex_lower8 ((d >> 24) & 255) << 16; + + // add the 4 byte challenge here + + w2_t[0] = challenge; + w2_t[1] = 0x00000080; + w2_t[2] = 0; + w2_t[3] = 0; + + w3_t[0] = 0; + w3_t[1] = 0; + w3_t[2] = (32 + 4) * 8; + w3_t[3] = 0; + + /** + * md5 ($hash.$challenge) + */ + + a = MD5M_A; + b = MD5M_B; + c = MD5M_C; + d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0_t[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0_t[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0_t[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1_t[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1_t[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1_t[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2_t[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2_t[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2_t[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3_t[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3_t[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3_t[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0_t[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1_t[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2_t[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1_t[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1_t[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2_t[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3_t[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0_t[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2_t[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3_t[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0_t[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1_t[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3_t[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H , a, b, c, d, w1_t[1], MD5C20, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w2_t[0], MD5C21, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w2_t[3], MD5C22, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w3_t[2], MD5C23, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w0_t[1], MD5C24, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w1_t[0], MD5C25, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w1_t[3], MD5C26, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w2_t[2], MD5C27, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w3_t[1], MD5C28, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w0_t[0], MD5C29, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w0_t[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w1_t[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H , a, b, c, d, w2_t[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H , d, a, b, c, w3_t[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H , c, d, a, b, w3_t[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H , b, c, d, a, w0_t[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1_t[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3_t[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3_t[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0_t[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0_t[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2_t[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1_t[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3_t[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1_t[0], MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w2_t[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0_t[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2_t[1], MD5C3f, MD5S33); + + const u32x r0 = a; + const u32x r1 = d; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_S + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m11100_m04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = pws[gid].i[14]; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * bin2asc table + */ + + l_bin2asc[lid] = c_bin2asc[(lid >> 0) & 15] << 8 + | c_bin2asc[(lid >> 4) & 15] << 0; + + __syncthreads (); + + if (gid >= gid_max) return; + + /** + * main + */ + + m11100m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m11100_m08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = pws[gid].i[14]; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * bin2asc table + */ + + l_bin2asc[lid] = c_bin2asc[(lid >> 0) & 15] << 8 + | c_bin2asc[(lid >> 4) & 15] << 0; + + __syncthreads (); + + if (gid >= gid_max) return; + + /** + * main + */ + + m11100m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m11100_m16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = pws[gid].i[ 8]; + w2[1] = pws[gid].i[ 9]; + w2[2] = pws[gid].i[10]; + w2[3] = pws[gid].i[11]; + + u32x w3[4]; + + w3[0] = pws[gid].i[12]; + w3[1] = pws[gid].i[13]; + w3[2] = pws[gid].i[14]; + w3[3] = pws[gid].i[15]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * bin2asc table + */ + + l_bin2asc[lid] = c_bin2asc[(lid >> 0) & 15] << 8 + | c_bin2asc[(lid >> 4) & 15] << 0; + + __syncthreads (); + + if (gid >= gid_max) return; + + /** + * main + */ + + m11100m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m11100_s04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = pws[gid].i[14]; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * bin2asc table + */ + + l_bin2asc[lid] = c_bin2asc[(lid >> 0) & 15] << 8 + | c_bin2asc[(lid >> 4) & 15] << 0; + + __syncthreads (); + + if (gid >= gid_max) return; + + /** + * main + */ + + m11100s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m11100_s08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = pws[gid].i[14]; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * bin2asc table + */ + + l_bin2asc[lid] = c_bin2asc[(lid >> 0) & 15] << 8 + | c_bin2asc[(lid >> 4) & 15] << 0; + + __syncthreads (); + + if (gid >= gid_max) return; + + /** + * main + */ + + m11100s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m11100_s16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = pws[gid].i[ 8]; + w2[1] = pws[gid].i[ 9]; + w2[2] = pws[gid].i[10]; + w2[3] = pws[gid].i[11]; + + u32x w3[4]; + + w3[0] = pws[gid].i[12]; + w3[1] = pws[gid].i[13]; + w3[2] = pws[gid].i[14]; + w3[3] = pws[gid].i[15]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * bin2asc table + */ + + l_bin2asc[lid] = c_bin2asc[(lid >> 0) & 15] << 8 + | c_bin2asc[(lid >> 4) & 15] << 0; + + __syncthreads (); + + if (gid >= gid_max) return; + + /** + * main + */ + + m11100s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} diff --git a/nv/m11200_a0.cu b/nv/m11200_a0.cu new file mode 100644 index 0000000000..3a59118325 --- /dev/null +++ b/nv/m11200_a0.cu @@ -0,0 +1,1043 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _SHA1_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW2 +#define VECT_SIZE1 +#endif + +#define DGST_R0 3 +#define DGST_R1 4 +#define DGST_R2 2 +#define DGST_R3 1 + +#include "include/kernel_functions.c" +#include "types_nv.c" +#include "common_nv.c" +#include "include/rp_gpu.h" +#include "rp_nv.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +__device__ __constant__ gpu_rule_t c_rules[1024]; + +extern "C" __global__ void __launch_bounds__ (256, 1) m11200_m04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + u32x pw_buf1[4]; + + pw_buf1[0] = pws[gid].i[ 4]; + pw_buf1[1] = pws[gid].i[ 5]; + pw_buf1[2] = pws[gid].i[ 6]; + pw_buf1[3] = pws[gid].i[ 7]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * salt + */ + + u32 salt_buf[5]; + + salt_buf[0] = swap_workaround (salt_bufs[salt_pos].salt_buf[0]); + salt_buf[1] = swap_workaround (salt_bufs[salt_pos].salt_buf[1]); + salt_buf[2] = swap_workaround (salt_bufs[salt_pos].salt_buf[2]); + salt_buf[3] = swap_workaround (salt_bufs[salt_pos].salt_buf[3]); + salt_buf[4] = swap_workaround (salt_bufs[salt_pos].salt_buf[4]); + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + + w0[0] = pw_buf0[0]; + w0[1] = pw_buf0[1]; + w0[2] = pw_buf0[2]; + w0[3] = pw_buf0[3]; + + u32x w1[4]; + + w1[0] = pw_buf1[0]; + w1[1] = pw_buf1[1]; + w1[2] = pw_buf1[2]; + w1[3] = pw_buf1[3]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 out_len = apply_rules (c_rules[il_pos].cmds, w0, w1, pw_len); + + append_0x80_2 (w0, w1, out_len); + + /** + * sha1 ($pass) + */ + + u32x w0_t = swap_workaround (w0[0]); + u32x w1_t = swap_workaround (w0[1]); + u32x w2_t = swap_workaround (w0[2]); + u32x w3_t = swap_workaround (w0[3]); + u32x w4_t = swap_workaround (w1[0]); + u32x w5_t = swap_workaround (w1[1]); + u32x w6_t = swap_workaround (w1[2]); + u32x w7_t = swap_workaround (w1[3]); + u32x w8_t = swap_workaround (w2[0]); + u32x w9_t = swap_workaround (w2[1]); + u32x wa_t = swap_workaround (w2[2]); + u32x wb_t = swap_workaround (w2[3]); + u32x wc_t = swap_workaround (w3[0]); + u32x wd_t = swap_workaround (w3[1]); + u32x we_t = 0; + u32x wf_t = out_len * 8; + + u32x a = SHA1M_A; + u32x b = SHA1M_B; + u32x c = SHA1M_C; + u32x d = SHA1M_D; + u32x e = SHA1M_E; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w0_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w1_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w2_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w3_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w4_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w5_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w6_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w7_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w8_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w9_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wa_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, wb_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, wc_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, wd_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, we_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F0o, e, a, b, c, d, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F0o, d, e, a, b, c, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F0o, c, d, e, a, b, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F0o, b, c, d, e, a, w3_t); + + #undef K + #define K SHA1C01 + + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w7_t); + + #undef K + #define K SHA1C02 + + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wb_t); + + #undef K + #define K SHA1C03 + + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wf_t); + + u32x plain_sha1_a = a + SHA1M_A; + u32x plain_sha1_b = b + SHA1M_B; + u32x plain_sha1_c = c + SHA1M_C; + u32x plain_sha1_d = d + SHA1M_D; + u32x plain_sha1_e = e + SHA1M_E; + + /** + * sha1 (sha1 ($pass)) + */ + + w0_t = plain_sha1_a; + w1_t = plain_sha1_b; + w2_t = plain_sha1_c; + w3_t = plain_sha1_d; + w4_t = plain_sha1_e; + + w5_t = 0x80000000; + w6_t = 0; + w7_t = 0; + w8_t = 0; + w9_t = 0; + wa_t = 0; + wb_t = 0; + wc_t = 0; + wd_t = 0; + we_t = 0; + wf_t = 20 * 8; + + a = SHA1M_A; + b = SHA1M_B; + c = SHA1M_C; + d = SHA1M_D; + e = SHA1M_E; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w0_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w1_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w2_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w3_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w4_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w5_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w6_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w7_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w8_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w9_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wa_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, wb_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, wc_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, wd_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, we_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F0o, e, a, b, c, d, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F0o, d, e, a, b, c, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F0o, c, d, e, a, b, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F0o, b, c, d, e, a, w3_t); + + #undef K + #define K SHA1C01 + + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w7_t); + + #undef K + #define K SHA1C02 + + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wb_t); + + #undef K + #define K SHA1C03 + + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wf_t); + + a += SHA1M_A; + b += SHA1M_B; + c += SHA1M_C; + d += SHA1M_D; + e += SHA1M_E; + + /** + * sha1 ($salt . sha1 (sha1 ($pass))) + */ + + w0_t = salt_buf[0]; + w1_t = salt_buf[1]; + w2_t = salt_buf[2]; + w3_t = salt_buf[3]; + w4_t = salt_buf[4]; + w5_t = a; + w6_t = b; + w7_t = c; + w8_t = d; + w9_t = e; + wa_t = 0x80000000; + wb_t = 0; + wc_t = 0; + wd_t = 0; + we_t = 0; + wf_t = 40 * 8; + + a = SHA1M_A; + b = SHA1M_B; + c = SHA1M_C; + d = SHA1M_D; + e = SHA1M_E; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w0_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w1_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w2_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w3_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w4_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w5_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w6_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w7_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w8_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w9_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wa_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, wb_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, wc_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, wd_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, we_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F0o, e, a, b, c, d, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F0o, d, e, a, b, c, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F0o, c, d, e, a, b, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F0o, b, c, d, e, a, w3_t); + + #undef K + #define K SHA1C01 + + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w7_t); + + #undef K + #define K SHA1C02 + + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wb_t); + + #undef K + #define K SHA1C03 + + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wf_t); + + a += SHA1M_A; + b += SHA1M_B; + c += SHA1M_C; + d += SHA1M_D; + e += SHA1M_E; + + a ^= plain_sha1_a; + b ^= plain_sha1_b; + c ^= plain_sha1_c; + d ^= plain_sha1_d; + e ^= plain_sha1_e; + + const u32x r0 = d; + const u32x r1 = e; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_M + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m11200_m08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m11200_m16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m11200_s04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + u32x pw_buf1[4]; + + pw_buf1[0] = pws[gid].i[ 4]; + pw_buf1[1] = pws[gid].i[ 5]; + pw_buf1[2] = pws[gid].i[ 6]; + pw_buf1[3] = pws[gid].i[ 7]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * salt + */ + + u32 salt_buf[5]; + + salt_buf[0] = swap_workaround (salt_bufs[salt_pos].salt_buf[0]); + salt_buf[1] = swap_workaround (salt_bufs[salt_pos].salt_buf[1]); + salt_buf[2] = swap_workaround (salt_bufs[salt_pos].salt_buf[2]); + salt_buf[3] = swap_workaround (salt_bufs[salt_pos].salt_buf[3]); + salt_buf[4] = swap_workaround (salt_bufs[salt_pos].salt_buf[4]); + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + + w0[0] = pw_buf0[0]; + w0[1] = pw_buf0[1]; + w0[2] = pw_buf0[2]; + w0[3] = pw_buf0[3]; + + u32x w1[4]; + + w1[0] = pw_buf1[0]; + w1[1] = pw_buf1[1]; + w1[2] = pw_buf1[2]; + w1[3] = pw_buf1[3]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 out_len = apply_rules (c_rules[il_pos].cmds, w0, w1, pw_len); + + append_0x80_2 (w0, w1, out_len); + + /** + * sha1 ($pass) + */ + + u32x w0_t = swap_workaround (w0[0]); + u32x w1_t = swap_workaround (w0[1]); + u32x w2_t = swap_workaround (w0[2]); + u32x w3_t = swap_workaround (w0[3]); + u32x w4_t = swap_workaround (w1[0]); + u32x w5_t = swap_workaround (w1[1]); + u32x w6_t = swap_workaround (w1[2]); + u32x w7_t = swap_workaround (w1[3]); + u32x w8_t = swap_workaround (w2[0]); + u32x w9_t = swap_workaround (w2[1]); + u32x wa_t = swap_workaround (w2[2]); + u32x wb_t = swap_workaround (w2[3]); + u32x wc_t = swap_workaround (w3[0]); + u32x wd_t = swap_workaround (w3[1]); + u32x we_t = 0; + u32x wf_t = out_len * 8; + + u32x a = SHA1M_A; + u32x b = SHA1M_B; + u32x c = SHA1M_C; + u32x d = SHA1M_D; + u32x e = SHA1M_E; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w0_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w1_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w2_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w3_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w4_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w5_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w6_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w7_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w8_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w9_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wa_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, wb_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, wc_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, wd_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, we_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F0o, e, a, b, c, d, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F0o, d, e, a, b, c, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F0o, c, d, e, a, b, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F0o, b, c, d, e, a, w3_t); + + #undef K + #define K SHA1C01 + + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w7_t); + + #undef K + #define K SHA1C02 + + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wb_t); + + #undef K + #define K SHA1C03 + + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wf_t); + + u32x plain_sha1_a = a + SHA1M_A; + u32x plain_sha1_b = b + SHA1M_B; + u32x plain_sha1_c = c + SHA1M_C; + u32x plain_sha1_d = d + SHA1M_D; + u32x plain_sha1_e = e + SHA1M_E; + + /** + * sha1 (sha1 ($pass)) + */ + + w0_t = plain_sha1_a; + w1_t = plain_sha1_b; + w2_t = plain_sha1_c; + w3_t = plain_sha1_d; + w4_t = plain_sha1_e; + + w5_t = 0x80000000; + w6_t = 0; + w7_t = 0; + w8_t = 0; + w9_t = 0; + wa_t = 0; + wb_t = 0; + wc_t = 0; + wd_t = 0; + we_t = 0; + wf_t = 20 * 8; + + a = SHA1M_A; + b = SHA1M_B; + c = SHA1M_C; + d = SHA1M_D; + e = SHA1M_E; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w0_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w1_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w2_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w3_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w4_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w5_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w6_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w7_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w8_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w9_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wa_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, wb_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, wc_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, wd_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, we_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F0o, e, a, b, c, d, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F0o, d, e, a, b, c, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F0o, c, d, e, a, b, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F0o, b, c, d, e, a, w3_t); + + #undef K + #define K SHA1C01 + + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w7_t); + + #undef K + #define K SHA1C02 + + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wb_t); + + #undef K + #define K SHA1C03 + + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wf_t); + + a += SHA1M_A; + b += SHA1M_B; + c += SHA1M_C; + d += SHA1M_D; + e += SHA1M_E; + + /** + * sha1 ($salt . sha1 (sha1 ($pass))) + */ + + w0_t = salt_buf[0]; + w1_t = salt_buf[1]; + w2_t = salt_buf[2]; + w3_t = salt_buf[3]; + w4_t = salt_buf[4]; + w5_t = a; + w6_t = b; + w7_t = c; + w8_t = d; + w9_t = e; + wa_t = 0x80000000; + wb_t = 0; + wc_t = 0; + wd_t = 0; + we_t = 0; + wf_t = 40 * 8; + + a = SHA1M_A; + b = SHA1M_B; + c = SHA1M_C; + d = SHA1M_D; + e = SHA1M_E; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w0_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w1_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w2_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w3_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w4_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w5_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w6_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w7_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w8_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w9_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wa_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, wb_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, wc_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, wd_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, we_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F0o, e, a, b, c, d, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F0o, d, e, a, b, c, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F0o, c, d, e, a, b, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F0o, b, c, d, e, a, w3_t); + + #undef K + #define K SHA1C01 + + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w7_t); + + #undef K + #define K SHA1C02 + + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wb_t); + + #undef K + #define K SHA1C03 + + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wf_t); + + a += SHA1M_A; + b += SHA1M_B; + c += SHA1M_C; + d += SHA1M_D; + e += SHA1M_E; + + a ^= plain_sha1_a; + b ^= plain_sha1_b; + c ^= plain_sha1_c; + d ^= plain_sha1_d; + e ^= plain_sha1_e; + + const u32x r0 = d; + const u32x r1 = e; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_S + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m11200_s08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m11200_s16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/nv/m11200_a1.cu b/nv/m11200_a1.cu new file mode 100644 index 0000000000..c373e21f4b --- /dev/null +++ b/nv/m11200_a1.cu @@ -0,0 +1,1153 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _SHA1_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW2 +#define VECT_SIZE1 +#endif + +#define DGST_R0 3 +#define DGST_R1 4 +#define DGST_R2 2 +#define DGST_R3 1 + +#include "include/kernel_functions.c" +#include "types_nv.c" +#include "common_nv.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +__device__ __constant__ comb_t c_combs[1024]; + +extern "C" __global__ void __launch_bounds__ (256, 1) m11200_m04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + append_0x80_2 (wordl0, wordl1, pw_l_len); + + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, c_combs[0].pw_len); + } + + /** + * salt + */ + + u32 salt_buf[5]; + + salt_buf[0] = swap_workaround (salt_bufs[salt_pos].salt_buf[0]); + salt_buf[1] = swap_workaround (salt_bufs[salt_pos].salt_buf[1]); + salt_buf[2] = swap_workaround (salt_bufs[salt_pos].salt_buf[2]); + salt_buf[3] = swap_workaround (salt_bufs[salt_pos].salt_buf[3]); + salt_buf[4] = swap_workaround (salt_bufs[salt_pos].salt_buf[4]); + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = c_combs[il_pos].pw_len; + + const u32 pw_len = pw_l_len + pw_r_len; + + u32 wordr0[4]; + + wordr0[0] = c_combs[il_pos].i[0]; + wordr0[1] = c_combs[il_pos].i[1]; + wordr0[2] = c_combs[il_pos].i[2]; + wordr0[3] = c_combs[il_pos].i[3]; + + u32 wordr1[4]; + + wordr1[0] = c_combs[il_pos].i[4]; + wordr1[1] = c_combs[il_pos].i[5]; + wordr1[2] = c_combs[il_pos].i[6]; + wordr1[3] = c_combs[il_pos].i[7]; + + u32 wordr2[4]; + + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + + u32 wordr3[4]; + + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + append_0x80_2 (wordr0, wordr1, pw_r_len); + + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + u32x w0[4]; + + w0[0] = wordl0[0] | wordr0[0]; + w0[1] = wordl0[1] | wordr0[1]; + w0[2] = wordl0[2] | wordr0[2]; + w0[3] = wordl0[3] | wordr0[3]; + + u32x w1[4]; + + w1[0] = wordl1[0] | wordr1[0]; + w1[1] = wordl1[1] | wordr1[1]; + w1[2] = wordl1[2] | wordr1[2]; + w1[3] = wordl1[3] | wordr1[3]; + + u32x w2[4]; + + w2[0] = wordl2[0] | wordr2[0]; + w2[1] = wordl2[1] | wordr2[1]; + w2[2] = wordl2[2] | wordr2[2]; + w2[3] = wordl2[3] | wordr2[3]; + + u32x w3[4]; + + w3[0] = wordl3[0] | wordr3[0]; + w3[1] = wordl3[1] | wordr3[1]; + w3[2] = 0; + w3[3] = 0; + + /** + * sha1 ($pass) + */ + + u32x w0_t = swap_workaround (w0[0]); + u32x w1_t = swap_workaround (w0[1]); + u32x w2_t = swap_workaround (w0[2]); + u32x w3_t = swap_workaround (w0[3]); + u32x w4_t = swap_workaround (w1[0]); + u32x w5_t = swap_workaround (w1[1]); + u32x w6_t = swap_workaround (w1[2]); + u32x w7_t = swap_workaround (w1[3]); + u32x w8_t = swap_workaround (w2[0]); + u32x w9_t = swap_workaround (w2[1]); + u32x wa_t = swap_workaround (w2[2]); + u32x wb_t = swap_workaround (w2[3]); + u32x wc_t = swap_workaround (w3[0]); + u32x wd_t = swap_workaround (w3[1]); + u32x we_t = 0; + u32x wf_t = pw_len * 8; + + u32x a = SHA1M_A; + u32x b = SHA1M_B; + u32x c = SHA1M_C; + u32x d = SHA1M_D; + u32x e = SHA1M_E; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w0_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w1_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w2_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w3_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w4_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w5_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w6_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w7_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w8_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w9_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wa_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, wb_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, wc_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, wd_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, we_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F0o, e, a, b, c, d, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F0o, d, e, a, b, c, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F0o, c, d, e, a, b, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F0o, b, c, d, e, a, w3_t); + + #undef K + #define K SHA1C01 + + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w7_t); + + #undef K + #define K SHA1C02 + + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wb_t); + + #undef K + #define K SHA1C03 + + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wf_t); + + u32x plain_sha1_a = a + SHA1M_A; + u32x plain_sha1_b = b + SHA1M_B; + u32x plain_sha1_c = c + SHA1M_C; + u32x plain_sha1_d = d + SHA1M_D; + u32x plain_sha1_e = e + SHA1M_E; + + /** + * sha1 (sha1 ($pass)) + */ + + w0_t = plain_sha1_a; + w1_t = plain_sha1_b; + w2_t = plain_sha1_c; + w3_t = plain_sha1_d; + w4_t = plain_sha1_e; + + w5_t = 0x80000000; + w6_t = 0; + w7_t = 0; + w8_t = 0; + w9_t = 0; + wa_t = 0; + wb_t = 0; + wc_t = 0; + wd_t = 0; + we_t = 0; + wf_t = 20 * 8; + + a = SHA1M_A; + b = SHA1M_B; + c = SHA1M_C; + d = SHA1M_D; + e = SHA1M_E; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w0_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w1_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w2_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w3_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w4_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w5_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w6_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w7_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w8_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w9_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wa_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, wb_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, wc_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, wd_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, we_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F0o, e, a, b, c, d, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F0o, d, e, a, b, c, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F0o, c, d, e, a, b, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F0o, b, c, d, e, a, w3_t); + + #undef K + #define K SHA1C01 + + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w7_t); + + #undef K + #define K SHA1C02 + + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wb_t); + + #undef K + #define K SHA1C03 + + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wf_t); + + a += SHA1M_A; + b += SHA1M_B; + c += SHA1M_C; + d += SHA1M_D; + e += SHA1M_E; + + /** + * sha1 ($salt . sha1 (sha1 ($pass))) + */ + + w0_t = salt_buf[0]; + w1_t = salt_buf[1]; + w2_t = salt_buf[2]; + w3_t = salt_buf[3]; + w4_t = salt_buf[4]; + w5_t = a; + w6_t = b; + w7_t = c; + w8_t = d; + w9_t = e; + wa_t = 0x80000000; + wb_t = 0; + wc_t = 0; + wd_t = 0; + we_t = 0; + wf_t = 40 * 8; + + a = SHA1M_A; + b = SHA1M_B; + c = SHA1M_C; + d = SHA1M_D; + e = SHA1M_E; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w0_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w1_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w2_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w3_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w4_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w5_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w6_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w7_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w8_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w9_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wa_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, wb_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, wc_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, wd_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, we_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F0o, e, a, b, c, d, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F0o, d, e, a, b, c, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F0o, c, d, e, a, b, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F0o, b, c, d, e, a, w3_t); + + #undef K + #define K SHA1C01 + + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w7_t); + + #undef K + #define K SHA1C02 + + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wb_t); + + #undef K + #define K SHA1C03 + + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wf_t); + + a += SHA1M_A; + b += SHA1M_B; + c += SHA1M_C; + d += SHA1M_D; + e += SHA1M_E; + + a ^= plain_sha1_a; + b ^= plain_sha1_b; + c ^= plain_sha1_c; + d ^= plain_sha1_d; + e ^= plain_sha1_e; + + const u32x r0 = d; + const u32x r1 = e; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_M + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m11200_m08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m11200_m16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m11200_s04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + append_0x80_2 (wordl0, wordl1, pw_l_len); + + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, c_combs[0].pw_len); + } + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * salt + */ + + u32 salt_buf[5]; + + salt_buf[0] = swap_workaround (salt_bufs[salt_pos].salt_buf[0]); + salt_buf[1] = swap_workaround (salt_bufs[salt_pos].salt_buf[1]); + salt_buf[2] = swap_workaround (salt_bufs[salt_pos].salt_buf[2]); + salt_buf[3] = swap_workaround (salt_bufs[salt_pos].salt_buf[3]); + salt_buf[4] = swap_workaround (salt_bufs[salt_pos].salt_buf[4]); + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = c_combs[il_pos].pw_len; + + const u32 pw_len = pw_l_len + pw_r_len; + + u32 wordr0[4]; + + wordr0[0] = c_combs[il_pos].i[0]; + wordr0[1] = c_combs[il_pos].i[1]; + wordr0[2] = c_combs[il_pos].i[2]; + wordr0[3] = c_combs[il_pos].i[3]; + + u32 wordr1[4]; + + wordr1[0] = c_combs[il_pos].i[4]; + wordr1[1] = c_combs[il_pos].i[5]; + wordr1[2] = c_combs[il_pos].i[6]; + wordr1[3] = c_combs[il_pos].i[7]; + + u32 wordr2[4]; + + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + + u32 wordr3[4]; + + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + append_0x80_2 (wordr0, wordr1, pw_r_len); + + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + u32x w0[4]; + + w0[0] = wordl0[0] | wordr0[0]; + w0[1] = wordl0[1] | wordr0[1]; + w0[2] = wordl0[2] | wordr0[2]; + w0[3] = wordl0[3] | wordr0[3]; + + u32x w1[4]; + + w1[0] = wordl1[0] | wordr1[0]; + w1[1] = wordl1[1] | wordr1[1]; + w1[2] = wordl1[2] | wordr1[2]; + w1[3] = wordl1[3] | wordr1[3]; + + u32x w2[4]; + + w2[0] = wordl2[0] | wordr2[0]; + w2[1] = wordl2[1] | wordr2[1]; + w2[2] = wordl2[2] | wordr2[2]; + w2[3] = wordl2[3] | wordr2[3]; + + u32x w3[4]; + + w3[0] = wordl3[0] | wordr3[0]; + w3[1] = wordl3[1] | wordr3[1]; + w3[2] = 0; + w3[3] = 0; + + /** + * sha1 ($pass) + */ + + u32x w0_t = swap_workaround (w0[0]); + u32x w1_t = swap_workaround (w0[1]); + u32x w2_t = swap_workaround (w0[2]); + u32x w3_t = swap_workaround (w0[3]); + u32x w4_t = swap_workaround (w1[0]); + u32x w5_t = swap_workaround (w1[1]); + u32x w6_t = swap_workaround (w1[2]); + u32x w7_t = swap_workaround (w1[3]); + u32x w8_t = swap_workaround (w2[0]); + u32x w9_t = swap_workaround (w2[1]); + u32x wa_t = swap_workaround (w2[2]); + u32x wb_t = swap_workaround (w2[3]); + u32x wc_t = swap_workaround (w3[0]); + u32x wd_t = swap_workaround (w3[1]); + u32x we_t = 0; + u32x wf_t = pw_len * 8; + + u32x a = SHA1M_A; + u32x b = SHA1M_B; + u32x c = SHA1M_C; + u32x d = SHA1M_D; + u32x e = SHA1M_E; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w0_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w1_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w2_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w3_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w4_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w5_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w6_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w7_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w8_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w9_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wa_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, wb_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, wc_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, wd_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, we_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F0o, e, a, b, c, d, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F0o, d, e, a, b, c, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F0o, c, d, e, a, b, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F0o, b, c, d, e, a, w3_t); + + #undef K + #define K SHA1C01 + + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w7_t); + + #undef K + #define K SHA1C02 + + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wb_t); + + #undef K + #define K SHA1C03 + + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wf_t); + + u32x plain_sha1_a = a + SHA1M_A; + u32x plain_sha1_b = b + SHA1M_B; + u32x plain_sha1_c = c + SHA1M_C; + u32x plain_sha1_d = d + SHA1M_D; + u32x plain_sha1_e = e + SHA1M_E; + + /** + * sha1 (sha1 ($pass)) + */ + + w0_t = plain_sha1_a; + w1_t = plain_sha1_b; + w2_t = plain_sha1_c; + w3_t = plain_sha1_d; + w4_t = plain_sha1_e; + + w5_t = 0x80000000; + w6_t = 0; + w7_t = 0; + w8_t = 0; + w9_t = 0; + wa_t = 0; + wb_t = 0; + wc_t = 0; + wd_t = 0; + we_t = 0; + wf_t = 20 * 8; + + a = SHA1M_A; + b = SHA1M_B; + c = SHA1M_C; + d = SHA1M_D; + e = SHA1M_E; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w0_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w1_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w2_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w3_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w4_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w5_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w6_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w7_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w8_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w9_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wa_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, wb_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, wc_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, wd_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, we_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F0o, e, a, b, c, d, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F0o, d, e, a, b, c, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F0o, c, d, e, a, b, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F0o, b, c, d, e, a, w3_t); + + #undef K + #define K SHA1C01 + + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w7_t); + + #undef K + #define K SHA1C02 + + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wb_t); + + #undef K + #define K SHA1C03 + + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wf_t); + + a += SHA1M_A; + b += SHA1M_B; + c += SHA1M_C; + d += SHA1M_D; + e += SHA1M_E; + + /** + * sha1 ($salt . sha1 (sha1 ($pass))) + */ + + w0_t = salt_buf[0]; + w1_t = salt_buf[1]; + w2_t = salt_buf[2]; + w3_t = salt_buf[3]; + w4_t = salt_buf[4]; + w5_t = a; + w6_t = b; + w7_t = c; + w8_t = d; + w9_t = e; + wa_t = 0x80000000; + wb_t = 0; + wc_t = 0; + wd_t = 0; + we_t = 0; + wf_t = 40 * 8; + + a = SHA1M_A; + b = SHA1M_B; + c = SHA1M_C; + d = SHA1M_D; + e = SHA1M_E; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w0_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w1_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w2_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w3_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w4_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w5_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w6_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w7_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w8_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w9_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wa_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, wb_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, wc_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, wd_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, we_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F0o, e, a, b, c, d, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F0o, d, e, a, b, c, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F0o, c, d, e, a, b, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F0o, b, c, d, e, a, w3_t); + + #undef K + #define K SHA1C01 + + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w7_t); + + #undef K + #define K SHA1C02 + + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wb_t); + + #undef K + #define K SHA1C03 + + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wf_t); + + a += SHA1M_A; + b += SHA1M_B; + c += SHA1M_C; + d += SHA1M_D; + e += SHA1M_E; + + a ^= plain_sha1_a; + b ^= plain_sha1_b; + c ^= plain_sha1_c; + d ^= plain_sha1_d; + e ^= plain_sha1_e; + + const u32x r0 = d; + const u32x r1 = e; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_S + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m11200_s08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m11200_s16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/nv/m11200_a3.cu b/nv/m11200_a3.cu new file mode 100644 index 0000000000..c6953c4d22 --- /dev/null +++ b/nv/m11200_a3.cu @@ -0,0 +1,1233 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _SHA1_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW2 +#define VECT_SIZE1 +#endif + +#define DGST_R0 3 +#define DGST_R1 4 +#define DGST_R2 2 +#define DGST_R3 1 + +#include "include/kernel_functions.c" +#include "types_nv.c" +#include "common_nv.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +__device__ __constant__ bf_t c_bfs[1024]; + +__device__ static void m11200m (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], const u32 pw_len, const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset) +{ + /** + * modifier + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + const u32 lid = threadIdx.x; + + /** + * salt + */ + + u32 salt_buf[5]; + + salt_buf[0] = swap_workaround (salt_bufs[salt_pos].salt_buf[0]); + salt_buf[1] = swap_workaround (salt_bufs[salt_pos].salt_buf[1]); + salt_buf[2] = swap_workaround (salt_bufs[salt_pos].salt_buf[2]); + salt_buf[3] = swap_workaround (salt_bufs[salt_pos].salt_buf[3]); + salt_buf[4] = swap_workaround (salt_bufs[salt_pos].salt_buf[4]); + + /** + * loop + */ + + u32x w0l = w0[0]; + + for (u32 il_pos = 0; il_pos < bfs_cnt; il_pos++) + { + const u32 w0r = c_bfs[il_pos].i; + + w0[0] = w0l | w0r; + + /** + * sha1 ($pass) + */ + + u32x w0_t = w0[0]; + u32x w1_t = w0[1]; + u32x w2_t = w0[2]; + u32x w3_t = w0[3]; + u32x w4_t = w1[0]; + u32x w5_t = w1[1]; + u32x w6_t = w1[2]; + u32x w7_t = w1[3]; + u32x w8_t = w2[0]; + u32x w9_t = w2[1]; + u32x wa_t = w2[2]; + u32x wb_t = w2[3]; + u32x wc_t = w3[0]; + u32x wd_t = w3[1]; + u32x we_t = 0; + u32x wf_t = pw_len * 8; + + u32x a = SHA1M_A; + u32x b = SHA1M_B; + u32x c = SHA1M_C; + u32x d = SHA1M_D; + u32x e = SHA1M_E; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w0_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w1_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w2_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w3_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w4_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w5_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w6_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w7_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w8_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w9_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wa_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, wb_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, wc_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, wd_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, we_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F0o, e, a, b, c, d, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F0o, d, e, a, b, c, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F0o, c, d, e, a, b, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F0o, b, c, d, e, a, w3_t); + + #undef K + #define K SHA1C01 + + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w7_t); + + #undef K + #define K SHA1C02 + + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wb_t); + + #undef K + #define K SHA1C03 + + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wf_t); + + u32x plain_sha1_a = a + SHA1M_A; + u32x plain_sha1_b = b + SHA1M_B; + u32x plain_sha1_c = c + SHA1M_C; + u32x plain_sha1_d = d + SHA1M_D; + u32x plain_sha1_e = e + SHA1M_E; + + /** + * sha1 (sha1 ($pass)) + */ + + w0_t = plain_sha1_a; + w1_t = plain_sha1_b; + w2_t = plain_sha1_c; + w3_t = plain_sha1_d; + w4_t = plain_sha1_e; + + w5_t = 0x80000000; + w6_t = 0; + w7_t = 0; + w8_t = 0; + w9_t = 0; + wa_t = 0; + wb_t = 0; + wc_t = 0; + wd_t = 0; + we_t = 0; + wf_t = 20 * 8; + + a = SHA1M_A; + b = SHA1M_B; + c = SHA1M_C; + d = SHA1M_D; + e = SHA1M_E; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w0_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w1_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w2_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w3_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w4_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w5_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w6_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w7_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w8_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w9_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wa_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, wb_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, wc_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, wd_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, we_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F0o, e, a, b, c, d, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F0o, d, e, a, b, c, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F0o, c, d, e, a, b, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F0o, b, c, d, e, a, w3_t); + + #undef K + #define K SHA1C01 + + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w7_t); + + #undef K + #define K SHA1C02 + + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wb_t); + + #undef K + #define K SHA1C03 + + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wf_t); + + a += SHA1M_A; + b += SHA1M_B; + c += SHA1M_C; + d += SHA1M_D; + e += SHA1M_E; + + /** + * sha1 ($salt . sha1 (sha1 ($pass))) + */ + + w0_t = salt_buf[0]; + w1_t = salt_buf[1]; + w2_t = salt_buf[2]; + w3_t = salt_buf[3]; + w4_t = salt_buf[4]; + w5_t = a; + w6_t = b; + w7_t = c; + w8_t = d; + w9_t = e; + wa_t = 0x80000000; + wb_t = 0; + wc_t = 0; + wd_t = 0; + we_t = 0; + wf_t = 40 * 8; + + a = SHA1M_A; + b = SHA1M_B; + c = SHA1M_C; + d = SHA1M_D; + e = SHA1M_E; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w0_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w1_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w2_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w3_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w4_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w5_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w6_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w7_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w8_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w9_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wa_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, wb_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, wc_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, wd_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, we_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F0o, e, a, b, c, d, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F0o, d, e, a, b, c, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F0o, c, d, e, a, b, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F0o, b, c, d, e, a, w3_t); + + #undef K + #define K SHA1C01 + + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w7_t); + + #undef K + #define K SHA1C02 + + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wb_t); + + #undef K + #define K SHA1C03 + + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wf_t); + + a += SHA1M_A; + b += SHA1M_B; + c += SHA1M_C; + d += SHA1M_D; + e += SHA1M_E; + + a ^= plain_sha1_a; + b ^= plain_sha1_b; + c ^= plain_sha1_c; + d ^= plain_sha1_d; + e ^= plain_sha1_e; + + const u32x r0 = d; + const u32x r1 = e; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_M + } +} + +__device__ static void m11200s (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], const u32 pw_len, const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset) +{ + /** + * modifier + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + const u32 lid = threadIdx.x; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * salt + */ + + u32 salt_buf[5]; + + salt_buf[0] = swap_workaround (salt_bufs[salt_pos].salt_buf[0]); + salt_buf[1] = swap_workaround (salt_bufs[salt_pos].salt_buf[1]); + salt_buf[2] = swap_workaround (salt_bufs[salt_pos].salt_buf[2]); + salt_buf[3] = swap_workaround (salt_bufs[salt_pos].salt_buf[3]); + salt_buf[4] = swap_workaround (salt_bufs[salt_pos].salt_buf[4]); + + /** + * loop + */ + + u32x w0l = w0[0]; + + for (u32 il_pos = 0; il_pos < bfs_cnt; il_pos++) + { + const u32 w0r = c_bfs[il_pos].i; + + w0[0] = w0l | w0r; + + /** + * sha1 ($pass) + */ + + u32x w0_t = w0[0]; + u32x w1_t = w0[1]; + u32x w2_t = w0[2]; + u32x w3_t = w0[3]; + u32x w4_t = w1[0]; + u32x w5_t = w1[1]; + u32x w6_t = w1[2]; + u32x w7_t = w1[3]; + u32x w8_t = w2[0]; + u32x w9_t = w2[1]; + u32x wa_t = w2[2]; + u32x wb_t = w2[3]; + u32x wc_t = w3[0]; + u32x wd_t = w3[1]; + u32x we_t = 0; + u32x wf_t = pw_len * 8; + + u32x a = SHA1M_A; + u32x b = SHA1M_B; + u32x c = SHA1M_C; + u32x d = SHA1M_D; + u32x e = SHA1M_E; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w0_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w1_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w2_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w3_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w4_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w5_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w6_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w7_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w8_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w9_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wa_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, wb_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, wc_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, wd_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, we_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F0o, e, a, b, c, d, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F0o, d, e, a, b, c, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F0o, c, d, e, a, b, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F0o, b, c, d, e, a, w3_t); + + #undef K + #define K SHA1C01 + + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w7_t); + + #undef K + #define K SHA1C02 + + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wb_t); + + #undef K + #define K SHA1C03 + + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wf_t); + + u32x plain_sha1_a = a + SHA1M_A; + u32x plain_sha1_b = b + SHA1M_B; + u32x plain_sha1_c = c + SHA1M_C; + u32x plain_sha1_d = d + SHA1M_D; + u32x plain_sha1_e = e + SHA1M_E; + + /** + * sha1 (sha1 ($pass)) + */ + + w0_t = plain_sha1_a; + w1_t = plain_sha1_b; + w2_t = plain_sha1_c; + w3_t = plain_sha1_d; + w4_t = plain_sha1_e; + + w5_t = 0x80000000; + w6_t = 0; + w7_t = 0; + w8_t = 0; + w9_t = 0; + wa_t = 0; + wb_t = 0; + wc_t = 0; + wd_t = 0; + we_t = 0; + wf_t = 20 * 8; + + a = SHA1M_A; + b = SHA1M_B; + c = SHA1M_C; + d = SHA1M_D; + e = SHA1M_E; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w0_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w1_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w2_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w3_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w4_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w5_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w6_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w7_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w8_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w9_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wa_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, wb_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, wc_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, wd_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, we_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F0o, e, a, b, c, d, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F0o, d, e, a, b, c, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F0o, c, d, e, a, b, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F0o, b, c, d, e, a, w3_t); + + #undef K + #define K SHA1C01 + + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w7_t); + + #undef K + #define K SHA1C02 + + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wb_t); + + #undef K + #define K SHA1C03 + + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wf_t); + + a += SHA1M_A; + b += SHA1M_B; + c += SHA1M_C; + d += SHA1M_D; + e += SHA1M_E; + + /** + * sha1 ($salt . sha1 (sha1 ($pass))) + */ + + w0_t = salt_buf[0]; + w1_t = salt_buf[1]; + w2_t = salt_buf[2]; + w3_t = salt_buf[3]; + w4_t = salt_buf[4]; + w5_t = a; + w6_t = b; + w7_t = c; + w8_t = d; + w9_t = e; + wa_t = 0x80000000; + wb_t = 0; + wc_t = 0; + wd_t = 0; + we_t = 0; + wf_t = 40 * 8; + + a = SHA1M_A; + b = SHA1M_B; + c = SHA1M_C; + d = SHA1M_D; + e = SHA1M_E; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w0_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w1_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w2_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w3_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w4_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w5_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w6_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w7_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w8_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w9_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wa_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, wb_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, wc_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, wd_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, we_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F0o, e, a, b, c, d, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F0o, d, e, a, b, c, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F0o, c, d, e, a, b, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F0o, b, c, d, e, a, w3_t); + + #undef K + #define K SHA1C01 + + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w7_t); + + #undef K + #define K SHA1C02 + + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wb_t); + + #undef K + #define K SHA1C03 + + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wf_t); + + a += SHA1M_A; + b += SHA1M_B; + c += SHA1M_C; + d += SHA1M_D; + e += SHA1M_E; + + a ^= plain_sha1_a; + b ^= plain_sha1_b; + c ^= plain_sha1_c; + d ^= plain_sha1_d; + e ^= plain_sha1_e; + + const u32x r0 = d; + const u32x r1 = e; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_S + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m11200_m04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + /** + * modifier + */ + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = pws[gid].i[15]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m11200m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m11200_m08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + /** + * modifier + */ + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = pws[gid].i[15]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m11200m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m11200_m16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + /** + * modifier + */ + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = pws[gid].i[ 8]; + w2[1] = pws[gid].i[ 9]; + w2[2] = pws[gid].i[10]; + w2[3] = pws[gid].i[11]; + + u32x w3[4]; + + w3[0] = pws[gid].i[12]; + w3[1] = pws[gid].i[13]; + w3[2] = pws[gid].i[14]; + w3[3] = pws[gid].i[15]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m11200m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m11200_s04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + /** + * modifier + */ + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = pws[gid].i[15]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m11200s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m11200_s08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + /** + * modifier + */ + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = pws[gid].i[15]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m11200s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m11200_s16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + /** + * modifier + */ + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = pws[gid].i[ 8]; + w2[1] = pws[gid].i[ 9]; + w2[2] = pws[gid].i[10]; + w2[3] = pws[gid].i[11]; + + u32x w3[4]; + + w3[0] = pws[gid].i[12]; + w3[1] = pws[gid].i[13]; + w3[2] = pws[gid].i[14]; + w3[3] = pws[gid].i[15]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m11200s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} diff --git a/nv/m11300.cu b/nv/m11300.cu new file mode 100644 index 0000000000..4691c471f3 --- /dev/null +++ b/nv/m11300.cu @@ -0,0 +1,1356 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _SHA512_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW2 +#define VECT_SIZE1 +#endif + +#define DGST_R0 0 +#define DGST_R1 1 +#define DGST_R2 2 +#define DGST_R3 3 + +#include "include/kernel_functions.c" +#include "types_nv.c" +#include "common_nv.c" + +__device__ __constant__ u64 k[80] = +{ + SHA512C00, SHA512C01, SHA512C02, SHA512C03, + SHA512C04, SHA512C05, SHA512C06, SHA512C07, + SHA512C08, SHA512C09, SHA512C0a, SHA512C0b, + SHA512C0c, SHA512C0d, SHA512C0e, SHA512C0f, + SHA512C10, SHA512C11, SHA512C12, SHA512C13, + SHA512C14, SHA512C15, SHA512C16, SHA512C17, + SHA512C18, SHA512C19, SHA512C1a, SHA512C1b, + SHA512C1c, SHA512C1d, SHA512C1e, SHA512C1f, + SHA512C20, SHA512C21, SHA512C22, SHA512C23, + SHA512C24, SHA512C25, SHA512C26, SHA512C27, + SHA512C28, SHA512C29, SHA512C2a, SHA512C2b, + SHA512C2c, SHA512C2d, SHA512C2e, SHA512C2f, + SHA512C30, SHA512C31, SHA512C32, SHA512C33, + SHA512C34, SHA512C35, SHA512C36, SHA512C37, + SHA512C38, SHA512C39, SHA512C3a, SHA512C3b, + SHA512C3c, SHA512C3d, SHA512C3e, SHA512C3f, + SHA512C40, SHA512C41, SHA512C42, SHA512C43, + SHA512C44, SHA512C45, SHA512C46, SHA512C47, + SHA512C48, SHA512C49, SHA512C4a, SHA512C4b, + SHA512C4c, SHA512C4d, SHA512C4e, SHA512C4f, +}; + +#define ROUND_EXPAND() \ +{ \ + w0_t = SHA512_EXPAND (we_t, w9_t, w1_t, w0_t); \ + w1_t = SHA512_EXPAND (wf_t, wa_t, w2_t, w1_t); \ + w2_t = SHA512_EXPAND (w0_t, wb_t, w3_t, w2_t); \ + w3_t = SHA512_EXPAND (w1_t, wc_t, w4_t, w3_t); \ + w4_t = SHA512_EXPAND (w2_t, wd_t, w5_t, w4_t); \ + w5_t = SHA512_EXPAND (w3_t, we_t, w6_t, w5_t); \ + w6_t = SHA512_EXPAND (w4_t, wf_t, w7_t, w6_t); \ + w7_t = SHA512_EXPAND (w5_t, w0_t, w8_t, w7_t); \ + w8_t = SHA512_EXPAND (w6_t, w1_t, w9_t, w8_t); \ + w9_t = SHA512_EXPAND (w7_t, w2_t, wa_t, w9_t); \ + wa_t = SHA512_EXPAND (w8_t, w3_t, wb_t, wa_t); \ + wb_t = SHA512_EXPAND (w9_t, w4_t, wc_t, wb_t); \ + wc_t = SHA512_EXPAND (wa_t, w5_t, wd_t, wc_t); \ + wd_t = SHA512_EXPAND (wb_t, w6_t, we_t, wd_t); \ + we_t = SHA512_EXPAND (wc_t, w7_t, wf_t, we_t); \ + wf_t = SHA512_EXPAND (wd_t, w8_t, w0_t, wf_t); \ +} + +#define ROUND_STEP(i) \ +{ \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, a, b, c, d, e, f, g, h, w0_t, k[i + 0]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, h, a, b, c, d, e, f, g, w1_t, k[i + 1]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, g, h, a, b, c, d, e, f, w2_t, k[i + 2]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, f, g, h, a, b, c, d, e, w3_t, k[i + 3]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, e, f, g, h, a, b, c, d, w4_t, k[i + 4]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, d, e, f, g, h, a, b, c, w5_t, k[i + 5]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, c, d, e, f, g, h, a, b, w6_t, k[i + 6]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, b, c, d, e, f, g, h, a, w7_t, k[i + 7]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, a, b, c, d, e, f, g, h, w8_t, k[i + 8]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, h, a, b, c, d, e, f, g, w9_t, k[i + 9]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, g, h, a, b, c, d, e, f, wa_t, k[i + 10]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, f, g, h, a, b, c, d, e, wb_t, k[i + 11]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, e, f, g, h, a, b, c, d, wc_t, k[i + 12]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, d, e, f, g, h, a, b, c, wd_t, k[i + 13]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, c, d, e, f, g, h, a, b, we_t, k[i + 14]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, b, c, d, e, f, g, h, a, wf_t, k[i + 15]); \ +} + +__device__ static void sha512_transform (const u64 w[16], u64 dgst[8]) +{ + u64 a = dgst[0]; + u64 b = dgst[1]; + u64 c = dgst[2]; + u64 d = dgst[3]; + u64 e = dgst[4]; + u64 f = dgst[5]; + u64 g = dgst[6]; + u64 h = dgst[7]; + + u64 w0_t = w[ 0]; + u64 w1_t = w[ 1]; + u64 w2_t = w[ 2]; + u64 w3_t = w[ 3]; + u64 w4_t = w[ 4]; + u64 w5_t = w[ 5]; + u64 w6_t = w[ 6]; + u64 w7_t = w[ 7]; + u64 w8_t = w[ 8]; + u64 w9_t = w[ 9]; + u64 wa_t = w[10]; + u64 wb_t = w[11]; + u64 wc_t = w[12]; + u64 wd_t = w[13]; + u64 we_t = w[14]; + u64 wf_t = w[15]; + + ROUND_STEP (0); + + for (int i = 16; i < 80; i += 16) + { + ROUND_EXPAND (); ROUND_STEP (i); + } + + dgst[0] += a; + dgst[1] += b; + dgst[2] += c; + dgst[3] += d; + dgst[4] += e; + dgst[5] += f; + dgst[6] += g; + dgst[7] += h; +} + +__device__ __constant__ u32 te0[256] = +{ + 0xc66363a5, 0xf87c7c84, 0xee777799, 0xf67b7b8d, + 0xfff2f20d, 0xd66b6bbd, 0xde6f6fb1, 0x91c5c554, + 0x60303050, 0x02010103, 0xce6767a9, 0x562b2b7d, + 0xe7fefe19, 0xb5d7d762, 0x4dababe6, 0xec76769a, + 0x8fcaca45, 0x1f82829d, 0x89c9c940, 0xfa7d7d87, + 0xeffafa15, 0xb25959eb, 0x8e4747c9, 0xfbf0f00b, + 0x41adadec, 0xb3d4d467, 0x5fa2a2fd, 0x45afafea, + 0x239c9cbf, 0x53a4a4f7, 0xe4727296, 0x9bc0c05b, + 0x75b7b7c2, 0xe1fdfd1c, 0x3d9393ae, 0x4c26266a, + 0x6c36365a, 0x7e3f3f41, 0xf5f7f702, 0x83cccc4f, + 0x6834345c, 0x51a5a5f4, 0xd1e5e534, 0xf9f1f108, + 0xe2717193, 0xabd8d873, 0x62313153, 0x2a15153f, + 0x0804040c, 0x95c7c752, 0x46232365, 0x9dc3c35e, + 0x30181828, 0x379696a1, 0x0a05050f, 0x2f9a9ab5, + 0x0e070709, 0x24121236, 0x1b80809b, 0xdfe2e23d, + 0xcdebeb26, 0x4e272769, 0x7fb2b2cd, 0xea75759f, + 0x1209091b, 0x1d83839e, 0x582c2c74, 0x341a1a2e, + 0x361b1b2d, 0xdc6e6eb2, 0xb45a5aee, 0x5ba0a0fb, + 0xa45252f6, 0x763b3b4d, 0xb7d6d661, 0x7db3b3ce, + 0x5229297b, 0xdde3e33e, 0x5e2f2f71, 0x13848497, + 0xa65353f5, 0xb9d1d168, 0x00000000, 0xc1eded2c, + 0x40202060, 0xe3fcfc1f, 0x79b1b1c8, 0xb65b5bed, + 0xd46a6abe, 0x8dcbcb46, 0x67bebed9, 0x7239394b, + 0x944a4ade, 0x984c4cd4, 0xb05858e8, 0x85cfcf4a, + 0xbbd0d06b, 0xc5efef2a, 0x4faaaae5, 0xedfbfb16, + 0x864343c5, 0x9a4d4dd7, 0x66333355, 0x11858594, + 0x8a4545cf, 0xe9f9f910, 0x04020206, 0xfe7f7f81, + 0xa05050f0, 0x783c3c44, 0x259f9fba, 0x4ba8a8e3, + 0xa25151f3, 0x5da3a3fe, 0x804040c0, 0x058f8f8a, + 0x3f9292ad, 0x219d9dbc, 0x70383848, 0xf1f5f504, + 0x63bcbcdf, 0x77b6b6c1, 0xafdada75, 0x42212163, + 0x20101030, 0xe5ffff1a, 0xfdf3f30e, 0xbfd2d26d, + 0x81cdcd4c, 0x180c0c14, 0x26131335, 0xc3ecec2f, + 0xbe5f5fe1, 0x359797a2, 0x884444cc, 0x2e171739, + 0x93c4c457, 0x55a7a7f2, 0xfc7e7e82, 0x7a3d3d47, + 0xc86464ac, 0xba5d5de7, 0x3219192b, 0xe6737395, + 0xc06060a0, 0x19818198, 0x9e4f4fd1, 0xa3dcdc7f, + 0x44222266, 0x542a2a7e, 0x3b9090ab, 0x0b888883, + 0x8c4646ca, 0xc7eeee29, 0x6bb8b8d3, 0x2814143c, + 0xa7dede79, 0xbc5e5ee2, 0x160b0b1d, 0xaddbdb76, + 0xdbe0e03b, 0x64323256, 0x743a3a4e, 0x140a0a1e, + 0x924949db, 0x0c06060a, 0x4824246c, 0xb85c5ce4, + 0x9fc2c25d, 0xbdd3d36e, 0x43acacef, 0xc46262a6, + 0x399191a8, 0x319595a4, 0xd3e4e437, 0xf279798b, + 0xd5e7e732, 0x8bc8c843, 0x6e373759, 0xda6d6db7, + 0x018d8d8c, 0xb1d5d564, 0x9c4e4ed2, 0x49a9a9e0, + 0xd86c6cb4, 0xac5656fa, 0xf3f4f407, 0xcfeaea25, + 0xca6565af, 0xf47a7a8e, 0x47aeaee9, 0x10080818, + 0x6fbabad5, 0xf0787888, 0x4a25256f, 0x5c2e2e72, + 0x381c1c24, 0x57a6a6f1, 0x73b4b4c7, 0x97c6c651, + 0xcbe8e823, 0xa1dddd7c, 0xe874749c, 0x3e1f1f21, + 0x964b4bdd, 0x61bdbddc, 0x0d8b8b86, 0x0f8a8a85, + 0xe0707090, 0x7c3e3e42, 0x71b5b5c4, 0xcc6666aa, + 0x904848d8, 0x06030305, 0xf7f6f601, 0x1c0e0e12, + 0xc26161a3, 0x6a35355f, 0xae5757f9, 0x69b9b9d0, + 0x17868691, 0x99c1c158, 0x3a1d1d27, 0x279e9eb9, + 0xd9e1e138, 0xebf8f813, 0x2b9898b3, 0x22111133, + 0xd26969bb, 0xa9d9d970, 0x078e8e89, 0x339494a7, + 0x2d9b9bb6, 0x3c1e1e22, 0x15878792, 0xc9e9e920, + 0x87cece49, 0xaa5555ff, 0x50282878, 0xa5dfdf7a, + 0x038c8c8f, 0x59a1a1f8, 0x09898980, 0x1a0d0d17, + 0x65bfbfda, 0xd7e6e631, 0x844242c6, 0xd06868b8, + 0x824141c3, 0x299999b0, 0x5a2d2d77, 0x1e0f0f11, + 0x7bb0b0cb, 0xa85454fc, 0x6dbbbbd6, 0x2c16163a, +}; + +__device__ __constant__ u32 te1[256] = +{ + 0xa5c66363, 0x84f87c7c, 0x99ee7777, 0x8df67b7b, + 0x0dfff2f2, 0xbdd66b6b, 0xb1de6f6f, 0x5491c5c5, + 0x50603030, 0x03020101, 0xa9ce6767, 0x7d562b2b, + 0x19e7fefe, 0x62b5d7d7, 0xe64dabab, 0x9aec7676, + 0x458fcaca, 0x9d1f8282, 0x4089c9c9, 0x87fa7d7d, + 0x15effafa, 0xebb25959, 0xc98e4747, 0x0bfbf0f0, + 0xec41adad, 0x67b3d4d4, 0xfd5fa2a2, 0xea45afaf, + 0xbf239c9c, 0xf753a4a4, 0x96e47272, 0x5b9bc0c0, + 0xc275b7b7, 0x1ce1fdfd, 0xae3d9393, 0x6a4c2626, + 0x5a6c3636, 0x417e3f3f, 0x02f5f7f7, 0x4f83cccc, + 0x5c683434, 0xf451a5a5, 0x34d1e5e5, 0x08f9f1f1, + 0x93e27171, 0x73abd8d8, 0x53623131, 0x3f2a1515, + 0x0c080404, 0x5295c7c7, 0x65462323, 0x5e9dc3c3, + 0x28301818, 0xa1379696, 0x0f0a0505, 0xb52f9a9a, + 0x090e0707, 0x36241212, 0x9b1b8080, 0x3ddfe2e2, + 0x26cdebeb, 0x694e2727, 0xcd7fb2b2, 0x9fea7575, + 0x1b120909, 0x9e1d8383, 0x74582c2c, 0x2e341a1a, + 0x2d361b1b, 0xb2dc6e6e, 0xeeb45a5a, 0xfb5ba0a0, + 0xf6a45252, 0x4d763b3b, 0x61b7d6d6, 0xce7db3b3, + 0x7b522929, 0x3edde3e3, 0x715e2f2f, 0x97138484, + 0xf5a65353, 0x68b9d1d1, 0x00000000, 0x2cc1eded, + 0x60402020, 0x1fe3fcfc, 0xc879b1b1, 0xedb65b5b, + 0xbed46a6a, 0x468dcbcb, 0xd967bebe, 0x4b723939, + 0xde944a4a, 0xd4984c4c, 0xe8b05858, 0x4a85cfcf, + 0x6bbbd0d0, 0x2ac5efef, 0xe54faaaa, 0x16edfbfb, + 0xc5864343, 0xd79a4d4d, 0x55663333, 0x94118585, + 0xcf8a4545, 0x10e9f9f9, 0x06040202, 0x81fe7f7f, + 0xf0a05050, 0x44783c3c, 0xba259f9f, 0xe34ba8a8, + 0xf3a25151, 0xfe5da3a3, 0xc0804040, 0x8a058f8f, + 0xad3f9292, 0xbc219d9d, 0x48703838, 0x04f1f5f5, + 0xdf63bcbc, 0xc177b6b6, 0x75afdada, 0x63422121, + 0x30201010, 0x1ae5ffff, 0x0efdf3f3, 0x6dbfd2d2, + 0x4c81cdcd, 0x14180c0c, 0x35261313, 0x2fc3ecec, + 0xe1be5f5f, 0xa2359797, 0xcc884444, 0x392e1717, + 0x5793c4c4, 0xf255a7a7, 0x82fc7e7e, 0x477a3d3d, + 0xacc86464, 0xe7ba5d5d, 0x2b321919, 0x95e67373, + 0xa0c06060, 0x98198181, 0xd19e4f4f, 0x7fa3dcdc, + 0x66442222, 0x7e542a2a, 0xab3b9090, 0x830b8888, + 0xca8c4646, 0x29c7eeee, 0xd36bb8b8, 0x3c281414, + 0x79a7dede, 0xe2bc5e5e, 0x1d160b0b, 0x76addbdb, + 0x3bdbe0e0, 0x56643232, 0x4e743a3a, 0x1e140a0a, + 0xdb924949, 0x0a0c0606, 0x6c482424, 0xe4b85c5c, + 0x5d9fc2c2, 0x6ebdd3d3, 0xef43acac, 0xa6c46262, + 0xa8399191, 0xa4319595, 0x37d3e4e4, 0x8bf27979, + 0x32d5e7e7, 0x438bc8c8, 0x596e3737, 0xb7da6d6d, + 0x8c018d8d, 0x64b1d5d5, 0xd29c4e4e, 0xe049a9a9, + 0xb4d86c6c, 0xfaac5656, 0x07f3f4f4, 0x25cfeaea, + 0xafca6565, 0x8ef47a7a, 0xe947aeae, 0x18100808, + 0xd56fbaba, 0x88f07878, 0x6f4a2525, 0x725c2e2e, + 0x24381c1c, 0xf157a6a6, 0xc773b4b4, 0x5197c6c6, + 0x23cbe8e8, 0x7ca1dddd, 0x9ce87474, 0x213e1f1f, + 0xdd964b4b, 0xdc61bdbd, 0x860d8b8b, 0x850f8a8a, + 0x90e07070, 0x427c3e3e, 0xc471b5b5, 0xaacc6666, + 0xd8904848, 0x05060303, 0x01f7f6f6, 0x121c0e0e, + 0xa3c26161, 0x5f6a3535, 0xf9ae5757, 0xd069b9b9, + 0x91178686, 0x5899c1c1, 0x273a1d1d, 0xb9279e9e, + 0x38d9e1e1, 0x13ebf8f8, 0xb32b9898, 0x33221111, + 0xbbd26969, 0x70a9d9d9, 0x89078e8e, 0xa7339494, + 0xb62d9b9b, 0x223c1e1e, 0x92158787, 0x20c9e9e9, + 0x4987cece, 0xffaa5555, 0x78502828, 0x7aa5dfdf, + 0x8f038c8c, 0xf859a1a1, 0x80098989, 0x171a0d0d, + 0xda65bfbf, 0x31d7e6e6, 0xc6844242, 0xb8d06868, + 0xc3824141, 0xb0299999, 0x775a2d2d, 0x111e0f0f, + 0xcb7bb0b0, 0xfca85454, 0xd66dbbbb, 0x3a2c1616, +}; + +__device__ __constant__ u32 te2[256] = +{ + 0x63a5c663, 0x7c84f87c, 0x7799ee77, 0x7b8df67b, + 0xf20dfff2, 0x6bbdd66b, 0x6fb1de6f, 0xc55491c5, + 0x30506030, 0x01030201, 0x67a9ce67, 0x2b7d562b, + 0xfe19e7fe, 0xd762b5d7, 0xabe64dab, 0x769aec76, + 0xca458fca, 0x829d1f82, 0xc94089c9, 0x7d87fa7d, + 0xfa15effa, 0x59ebb259, 0x47c98e47, 0xf00bfbf0, + 0xadec41ad, 0xd467b3d4, 0xa2fd5fa2, 0xafea45af, + 0x9cbf239c, 0xa4f753a4, 0x7296e472, 0xc05b9bc0, + 0xb7c275b7, 0xfd1ce1fd, 0x93ae3d93, 0x266a4c26, + 0x365a6c36, 0x3f417e3f, 0xf702f5f7, 0xcc4f83cc, + 0x345c6834, 0xa5f451a5, 0xe534d1e5, 0xf108f9f1, + 0x7193e271, 0xd873abd8, 0x31536231, 0x153f2a15, + 0x040c0804, 0xc75295c7, 0x23654623, 0xc35e9dc3, + 0x18283018, 0x96a13796, 0x050f0a05, 0x9ab52f9a, + 0x07090e07, 0x12362412, 0x809b1b80, 0xe23ddfe2, + 0xeb26cdeb, 0x27694e27, 0xb2cd7fb2, 0x759fea75, + 0x091b1209, 0x839e1d83, 0x2c74582c, 0x1a2e341a, + 0x1b2d361b, 0x6eb2dc6e, 0x5aeeb45a, 0xa0fb5ba0, + 0x52f6a452, 0x3b4d763b, 0xd661b7d6, 0xb3ce7db3, + 0x297b5229, 0xe33edde3, 0x2f715e2f, 0x84971384, + 0x53f5a653, 0xd168b9d1, 0x00000000, 0xed2cc1ed, + 0x20604020, 0xfc1fe3fc, 0xb1c879b1, 0x5bedb65b, + 0x6abed46a, 0xcb468dcb, 0xbed967be, 0x394b7239, + 0x4ade944a, 0x4cd4984c, 0x58e8b058, 0xcf4a85cf, + 0xd06bbbd0, 0xef2ac5ef, 0xaae54faa, 0xfb16edfb, + 0x43c58643, 0x4dd79a4d, 0x33556633, 0x85941185, + 0x45cf8a45, 0xf910e9f9, 0x02060402, 0x7f81fe7f, + 0x50f0a050, 0x3c44783c, 0x9fba259f, 0xa8e34ba8, + 0x51f3a251, 0xa3fe5da3, 0x40c08040, 0x8f8a058f, + 0x92ad3f92, 0x9dbc219d, 0x38487038, 0xf504f1f5, + 0xbcdf63bc, 0xb6c177b6, 0xda75afda, 0x21634221, + 0x10302010, 0xff1ae5ff, 0xf30efdf3, 0xd26dbfd2, + 0xcd4c81cd, 0x0c14180c, 0x13352613, 0xec2fc3ec, + 0x5fe1be5f, 0x97a23597, 0x44cc8844, 0x17392e17, + 0xc45793c4, 0xa7f255a7, 0x7e82fc7e, 0x3d477a3d, + 0x64acc864, 0x5de7ba5d, 0x192b3219, 0x7395e673, + 0x60a0c060, 0x81981981, 0x4fd19e4f, 0xdc7fa3dc, + 0x22664422, 0x2a7e542a, 0x90ab3b90, 0x88830b88, + 0x46ca8c46, 0xee29c7ee, 0xb8d36bb8, 0x143c2814, + 0xde79a7de, 0x5ee2bc5e, 0x0b1d160b, 0xdb76addb, + 0xe03bdbe0, 0x32566432, 0x3a4e743a, 0x0a1e140a, + 0x49db9249, 0x060a0c06, 0x246c4824, 0x5ce4b85c, + 0xc25d9fc2, 0xd36ebdd3, 0xacef43ac, 0x62a6c462, + 0x91a83991, 0x95a43195, 0xe437d3e4, 0x798bf279, + 0xe732d5e7, 0xc8438bc8, 0x37596e37, 0x6db7da6d, + 0x8d8c018d, 0xd564b1d5, 0x4ed29c4e, 0xa9e049a9, + 0x6cb4d86c, 0x56faac56, 0xf407f3f4, 0xea25cfea, + 0x65afca65, 0x7a8ef47a, 0xaee947ae, 0x08181008, + 0xbad56fba, 0x7888f078, 0x256f4a25, 0x2e725c2e, + 0x1c24381c, 0xa6f157a6, 0xb4c773b4, 0xc65197c6, + 0xe823cbe8, 0xdd7ca1dd, 0x749ce874, 0x1f213e1f, + 0x4bdd964b, 0xbddc61bd, 0x8b860d8b, 0x8a850f8a, + 0x7090e070, 0x3e427c3e, 0xb5c471b5, 0x66aacc66, + 0x48d89048, 0x03050603, 0xf601f7f6, 0x0e121c0e, + 0x61a3c261, 0x355f6a35, 0x57f9ae57, 0xb9d069b9, + 0x86911786, 0xc15899c1, 0x1d273a1d, 0x9eb9279e, + 0xe138d9e1, 0xf813ebf8, 0x98b32b98, 0x11332211, + 0x69bbd269, 0xd970a9d9, 0x8e89078e, 0x94a73394, + 0x9bb62d9b, 0x1e223c1e, 0x87921587, 0xe920c9e9, + 0xce4987ce, 0x55ffaa55, 0x28785028, 0xdf7aa5df, + 0x8c8f038c, 0xa1f859a1, 0x89800989, 0x0d171a0d, + 0xbfda65bf, 0xe631d7e6, 0x42c68442, 0x68b8d068, + 0x41c38241, 0x99b02999, 0x2d775a2d, 0x0f111e0f, + 0xb0cb7bb0, 0x54fca854, 0xbbd66dbb, 0x163a2c16, +}; + +__device__ __constant__ u32 te3[256] = +{ + 0x6363a5c6, 0x7c7c84f8, 0x777799ee, 0x7b7b8df6, + 0xf2f20dff, 0x6b6bbdd6, 0x6f6fb1de, 0xc5c55491, + 0x30305060, 0x01010302, 0x6767a9ce, 0x2b2b7d56, + 0xfefe19e7, 0xd7d762b5, 0xababe64d, 0x76769aec, + 0xcaca458f, 0x82829d1f, 0xc9c94089, 0x7d7d87fa, + 0xfafa15ef, 0x5959ebb2, 0x4747c98e, 0xf0f00bfb, + 0xadadec41, 0xd4d467b3, 0xa2a2fd5f, 0xafafea45, + 0x9c9cbf23, 0xa4a4f753, 0x727296e4, 0xc0c05b9b, + 0xb7b7c275, 0xfdfd1ce1, 0x9393ae3d, 0x26266a4c, + 0x36365a6c, 0x3f3f417e, 0xf7f702f5, 0xcccc4f83, + 0x34345c68, 0xa5a5f451, 0xe5e534d1, 0xf1f108f9, + 0x717193e2, 0xd8d873ab, 0x31315362, 0x15153f2a, + 0x04040c08, 0xc7c75295, 0x23236546, 0xc3c35e9d, + 0x18182830, 0x9696a137, 0x05050f0a, 0x9a9ab52f, + 0x0707090e, 0x12123624, 0x80809b1b, 0xe2e23ddf, + 0xebeb26cd, 0x2727694e, 0xb2b2cd7f, 0x75759fea, + 0x09091b12, 0x83839e1d, 0x2c2c7458, 0x1a1a2e34, + 0x1b1b2d36, 0x6e6eb2dc, 0x5a5aeeb4, 0xa0a0fb5b, + 0x5252f6a4, 0x3b3b4d76, 0xd6d661b7, 0xb3b3ce7d, + 0x29297b52, 0xe3e33edd, 0x2f2f715e, 0x84849713, + 0x5353f5a6, 0xd1d168b9, 0x00000000, 0xeded2cc1, + 0x20206040, 0xfcfc1fe3, 0xb1b1c879, 0x5b5bedb6, + 0x6a6abed4, 0xcbcb468d, 0xbebed967, 0x39394b72, + 0x4a4ade94, 0x4c4cd498, 0x5858e8b0, 0xcfcf4a85, + 0xd0d06bbb, 0xefef2ac5, 0xaaaae54f, 0xfbfb16ed, + 0x4343c586, 0x4d4dd79a, 0x33335566, 0x85859411, + 0x4545cf8a, 0xf9f910e9, 0x02020604, 0x7f7f81fe, + 0x5050f0a0, 0x3c3c4478, 0x9f9fba25, 0xa8a8e34b, + 0x5151f3a2, 0xa3a3fe5d, 0x4040c080, 0x8f8f8a05, + 0x9292ad3f, 0x9d9dbc21, 0x38384870, 0xf5f504f1, + 0xbcbcdf63, 0xb6b6c177, 0xdada75af, 0x21216342, + 0x10103020, 0xffff1ae5, 0xf3f30efd, 0xd2d26dbf, + 0xcdcd4c81, 0x0c0c1418, 0x13133526, 0xecec2fc3, + 0x5f5fe1be, 0x9797a235, 0x4444cc88, 0x1717392e, + 0xc4c45793, 0xa7a7f255, 0x7e7e82fc, 0x3d3d477a, + 0x6464acc8, 0x5d5de7ba, 0x19192b32, 0x737395e6, + 0x6060a0c0, 0x81819819, 0x4f4fd19e, 0xdcdc7fa3, + 0x22226644, 0x2a2a7e54, 0x9090ab3b, 0x8888830b, + 0x4646ca8c, 0xeeee29c7, 0xb8b8d36b, 0x14143c28, + 0xdede79a7, 0x5e5ee2bc, 0x0b0b1d16, 0xdbdb76ad, + 0xe0e03bdb, 0x32325664, 0x3a3a4e74, 0x0a0a1e14, + 0x4949db92, 0x06060a0c, 0x24246c48, 0x5c5ce4b8, + 0xc2c25d9f, 0xd3d36ebd, 0xacacef43, 0x6262a6c4, + 0x9191a839, 0x9595a431, 0xe4e437d3, 0x79798bf2, + 0xe7e732d5, 0xc8c8438b, 0x3737596e, 0x6d6db7da, + 0x8d8d8c01, 0xd5d564b1, 0x4e4ed29c, 0xa9a9e049, + 0x6c6cb4d8, 0x5656faac, 0xf4f407f3, 0xeaea25cf, + 0x6565afca, 0x7a7a8ef4, 0xaeaee947, 0x08081810, + 0xbabad56f, 0x787888f0, 0x25256f4a, 0x2e2e725c, + 0x1c1c2438, 0xa6a6f157, 0xb4b4c773, 0xc6c65197, + 0xe8e823cb, 0xdddd7ca1, 0x74749ce8, 0x1f1f213e, + 0x4b4bdd96, 0xbdbddc61, 0x8b8b860d, 0x8a8a850f, + 0x707090e0, 0x3e3e427c, 0xb5b5c471, 0x6666aacc, + 0x4848d890, 0x03030506, 0xf6f601f7, 0x0e0e121c, + 0x6161a3c2, 0x35355f6a, 0x5757f9ae, 0xb9b9d069, + 0x86869117, 0xc1c15899, 0x1d1d273a, 0x9e9eb927, + 0xe1e138d9, 0xf8f813eb, 0x9898b32b, 0x11113322, + 0x6969bbd2, 0xd9d970a9, 0x8e8e8907, 0x9494a733, + 0x9b9bb62d, 0x1e1e223c, 0x87879215, 0xe9e920c9, + 0xcece4987, 0x5555ffaa, 0x28287850, 0xdfdf7aa5, + 0x8c8c8f03, 0xa1a1f859, 0x89898009, 0x0d0d171a, + 0xbfbfda65, 0xe6e631d7, 0x4242c684, 0x6868b8d0, + 0x4141c382, 0x9999b029, 0x2d2d775a, 0x0f0f111e, + 0xb0b0cb7b, 0x5454fca8, 0xbbbbd66d, 0x16163a2c, +}; + +__device__ __constant__ u32 te4[256] = +{ + 0x63636363, 0x7c7c7c7c, 0x77777777, 0x7b7b7b7b, + 0xf2f2f2f2, 0x6b6b6b6b, 0x6f6f6f6f, 0xc5c5c5c5, + 0x30303030, 0x01010101, 0x67676767, 0x2b2b2b2b, + 0xfefefefe, 0xd7d7d7d7, 0xabababab, 0x76767676, + 0xcacacaca, 0x82828282, 0xc9c9c9c9, 0x7d7d7d7d, + 0xfafafafa, 0x59595959, 0x47474747, 0xf0f0f0f0, + 0xadadadad, 0xd4d4d4d4, 0xa2a2a2a2, 0xafafafaf, + 0x9c9c9c9c, 0xa4a4a4a4, 0x72727272, 0xc0c0c0c0, + 0xb7b7b7b7, 0xfdfdfdfd, 0x93939393, 0x26262626, + 0x36363636, 0x3f3f3f3f, 0xf7f7f7f7, 0xcccccccc, + 0x34343434, 0xa5a5a5a5, 0xe5e5e5e5, 0xf1f1f1f1, + 0x71717171, 0xd8d8d8d8, 0x31313131, 0x15151515, + 0x04040404, 0xc7c7c7c7, 0x23232323, 0xc3c3c3c3, + 0x18181818, 0x96969696, 0x05050505, 0x9a9a9a9a, + 0x07070707, 0x12121212, 0x80808080, 0xe2e2e2e2, + 0xebebebeb, 0x27272727, 0xb2b2b2b2, 0x75757575, + 0x09090909, 0x83838383, 0x2c2c2c2c, 0x1a1a1a1a, + 0x1b1b1b1b, 0x6e6e6e6e, 0x5a5a5a5a, 0xa0a0a0a0, + 0x52525252, 0x3b3b3b3b, 0xd6d6d6d6, 0xb3b3b3b3, + 0x29292929, 0xe3e3e3e3, 0x2f2f2f2f, 0x84848484, + 0x53535353, 0xd1d1d1d1, 0x00000000, 0xedededed, + 0x20202020, 0xfcfcfcfc, 0xb1b1b1b1, 0x5b5b5b5b, + 0x6a6a6a6a, 0xcbcbcbcb, 0xbebebebe, 0x39393939, + 0x4a4a4a4a, 0x4c4c4c4c, 0x58585858, 0xcfcfcfcf, + 0xd0d0d0d0, 0xefefefef, 0xaaaaaaaa, 0xfbfbfbfb, + 0x43434343, 0x4d4d4d4d, 0x33333333, 0x85858585, + 0x45454545, 0xf9f9f9f9, 0x02020202, 0x7f7f7f7f, + 0x50505050, 0x3c3c3c3c, 0x9f9f9f9f, 0xa8a8a8a8, + 0x51515151, 0xa3a3a3a3, 0x40404040, 0x8f8f8f8f, + 0x92929292, 0x9d9d9d9d, 0x38383838, 0xf5f5f5f5, + 0xbcbcbcbc, 0xb6b6b6b6, 0xdadadada, 0x21212121, + 0x10101010, 0xffffffff, 0xf3f3f3f3, 0xd2d2d2d2, + 0xcdcdcdcd, 0x0c0c0c0c, 0x13131313, 0xecececec, + 0x5f5f5f5f, 0x97979797, 0x44444444, 0x17171717, + 0xc4c4c4c4, 0xa7a7a7a7, 0x7e7e7e7e, 0x3d3d3d3d, + 0x64646464, 0x5d5d5d5d, 0x19191919, 0x73737373, + 0x60606060, 0x81818181, 0x4f4f4f4f, 0xdcdcdcdc, + 0x22222222, 0x2a2a2a2a, 0x90909090, 0x88888888, + 0x46464646, 0xeeeeeeee, 0xb8b8b8b8, 0x14141414, + 0xdededede, 0x5e5e5e5e, 0x0b0b0b0b, 0xdbdbdbdb, + 0xe0e0e0e0, 0x32323232, 0x3a3a3a3a, 0x0a0a0a0a, + 0x49494949, 0x06060606, 0x24242424, 0x5c5c5c5c, + 0xc2c2c2c2, 0xd3d3d3d3, 0xacacacac, 0x62626262, + 0x91919191, 0x95959595, 0xe4e4e4e4, 0x79797979, + 0xe7e7e7e7, 0xc8c8c8c8, 0x37373737, 0x6d6d6d6d, + 0x8d8d8d8d, 0xd5d5d5d5, 0x4e4e4e4e, 0xa9a9a9a9, + 0x6c6c6c6c, 0x56565656, 0xf4f4f4f4, 0xeaeaeaea, + 0x65656565, 0x7a7a7a7a, 0xaeaeaeae, 0x08080808, + 0xbabababa, 0x78787878, 0x25252525, 0x2e2e2e2e, + 0x1c1c1c1c, 0xa6a6a6a6, 0xb4b4b4b4, 0xc6c6c6c6, + 0xe8e8e8e8, 0xdddddddd, 0x74747474, 0x1f1f1f1f, + 0x4b4b4b4b, 0xbdbdbdbd, 0x8b8b8b8b, 0x8a8a8a8a, + 0x70707070, 0x3e3e3e3e, 0xb5b5b5b5, 0x66666666, + 0x48484848, 0x03030303, 0xf6f6f6f6, 0x0e0e0e0e, + 0x61616161, 0x35353535, 0x57575757, 0xb9b9b9b9, + 0x86868686, 0xc1c1c1c1, 0x1d1d1d1d, 0x9e9e9e9e, + 0xe1e1e1e1, 0xf8f8f8f8, 0x98989898, 0x11111111, + 0x69696969, 0xd9d9d9d9, 0x8e8e8e8e, 0x94949494, + 0x9b9b9b9b, 0x1e1e1e1e, 0x87878787, 0xe9e9e9e9, + 0xcececece, 0x55555555, 0x28282828, 0xdfdfdfdf, + 0x8c8c8c8c, 0xa1a1a1a1, 0x89898989, 0x0d0d0d0d, + 0xbfbfbfbf, 0xe6e6e6e6, 0x42424242, 0x68686868, + 0x41414141, 0x99999999, 0x2d2d2d2d, 0x0f0f0f0f, + 0xb0b0b0b0, 0x54545454, 0xbbbbbbbb, 0x16161616, +}; + +__device__ __constant__ u32 td0[256] = +{ + 0x51f4a750, 0x7e416553, 0x1a17a4c3, 0x3a275e96, + 0x3bab6bcb, 0x1f9d45f1, 0xacfa58ab, 0x4be30393, + 0x2030fa55, 0xad766df6, 0x88cc7691, 0xf5024c25, + 0x4fe5d7fc, 0xc52acbd7, 0x26354480, 0xb562a38f, + 0xdeb15a49, 0x25ba1b67, 0x45ea0e98, 0x5dfec0e1, + 0xc32f7502, 0x814cf012, 0x8d4697a3, 0x6bd3f9c6, + 0x038f5fe7, 0x15929c95, 0xbf6d7aeb, 0x955259da, + 0xd4be832d, 0x587421d3, 0x49e06929, 0x8ec9c844, + 0x75c2896a, 0xf48e7978, 0x99583e6b, 0x27b971dd, + 0xbee14fb6, 0xf088ad17, 0xc920ac66, 0x7dce3ab4, + 0x63df4a18, 0xe51a3182, 0x97513360, 0x62537f45, + 0xb16477e0, 0xbb6bae84, 0xfe81a01c, 0xf9082b94, + 0x70486858, 0x8f45fd19, 0x94de6c87, 0x527bf8b7, + 0xab73d323, 0x724b02e2, 0xe31f8f57, 0x6655ab2a, + 0xb2eb2807, 0x2fb5c203, 0x86c57b9a, 0xd33708a5, + 0x302887f2, 0x23bfa5b2, 0x02036aba, 0xed16825c, + 0x8acf1c2b, 0xa779b492, 0xf307f2f0, 0x4e69e2a1, + 0x65daf4cd, 0x0605bed5, 0xd134621f, 0xc4a6fe8a, + 0x342e539d, 0xa2f355a0, 0x058ae132, 0xa4f6eb75, + 0x0b83ec39, 0x4060efaa, 0x5e719f06, 0xbd6e1051, + 0x3e218af9, 0x96dd063d, 0xdd3e05ae, 0x4de6bd46, + 0x91548db5, 0x71c45d05, 0x0406d46f, 0x605015ff, + 0x1998fb24, 0xd6bde997, 0x894043cc, 0x67d99e77, + 0xb0e842bd, 0x07898b88, 0xe7195b38, 0x79c8eedb, + 0xa17c0a47, 0x7c420fe9, 0xf8841ec9, 0x00000000, + 0x09808683, 0x322bed48, 0x1e1170ac, 0x6c5a724e, + 0xfd0efffb, 0x0f853856, 0x3daed51e, 0x362d3927, + 0x0a0fd964, 0x685ca621, 0x9b5b54d1, 0x24362e3a, + 0x0c0a67b1, 0x9357e70f, 0xb4ee96d2, 0x1b9b919e, + 0x80c0c54f, 0x61dc20a2, 0x5a774b69, 0x1c121a16, + 0xe293ba0a, 0xc0a02ae5, 0x3c22e043, 0x121b171d, + 0x0e090d0b, 0xf28bc7ad, 0x2db6a8b9, 0x141ea9c8, + 0x57f11985, 0xaf75074c, 0xee99ddbb, 0xa37f60fd, + 0xf701269f, 0x5c72f5bc, 0x44663bc5, 0x5bfb7e34, + 0x8b432976, 0xcb23c6dc, 0xb6edfc68, 0xb8e4f163, + 0xd731dcca, 0x42638510, 0x13972240, 0x84c61120, + 0x854a247d, 0xd2bb3df8, 0xaef93211, 0xc729a16d, + 0x1d9e2f4b, 0xdcb230f3, 0x0d8652ec, 0x77c1e3d0, + 0x2bb3166c, 0xa970b999, 0x119448fa, 0x47e96422, + 0xa8fc8cc4, 0xa0f03f1a, 0x567d2cd8, 0x223390ef, + 0x87494ec7, 0xd938d1c1, 0x8ccaa2fe, 0x98d40b36, + 0xa6f581cf, 0xa57ade28, 0xdab78e26, 0x3fadbfa4, + 0x2c3a9de4, 0x5078920d, 0x6a5fcc9b, 0x547e4662, + 0xf68d13c2, 0x90d8b8e8, 0x2e39f75e, 0x82c3aff5, + 0x9f5d80be, 0x69d0937c, 0x6fd52da9, 0xcf2512b3, + 0xc8ac993b, 0x10187da7, 0xe89c636e, 0xdb3bbb7b, + 0xcd267809, 0x6e5918f4, 0xec9ab701, 0x834f9aa8, + 0xe6956e65, 0xaaffe67e, 0x21bccf08, 0xef15e8e6, + 0xbae79bd9, 0x4a6f36ce, 0xea9f09d4, 0x29b07cd6, + 0x31a4b2af, 0x2a3f2331, 0xc6a59430, 0x35a266c0, + 0x744ebc37, 0xfc82caa6, 0xe090d0b0, 0x33a7d815, + 0xf104984a, 0x41ecdaf7, 0x7fcd500e, 0x1791f62f, + 0x764dd68d, 0x43efb04d, 0xccaa4d54, 0xe49604df, + 0x9ed1b5e3, 0x4c6a881b, 0xc12c1fb8, 0x4665517f, + 0x9d5eea04, 0x018c355d, 0xfa877473, 0xfb0b412e, + 0xb3671d5a, 0x92dbd252, 0xe9105633, 0x6dd64713, + 0x9ad7618c, 0x37a10c7a, 0x59f8148e, 0xeb133c89, + 0xcea927ee, 0xb761c935, 0xe11ce5ed, 0x7a47b13c, + 0x9cd2df59, 0x55f2733f, 0x1814ce79, 0x73c737bf, + 0x53f7cdea, 0x5ffdaa5b, 0xdf3d6f14, 0x7844db86, + 0xcaaff381, 0xb968c43e, 0x3824342c, 0xc2a3405f, + 0x161dc372, 0xbce2250c, 0x283c498b, 0xff0d9541, + 0x39a80171, 0x080cb3de, 0xd8b4e49c, 0x6456c190, + 0x7bcb8461, 0xd532b670, 0x486c5c74, 0xd0b85742, +}; + +__device__ __constant__ u32 td1[256] = +{ + 0x5051f4a7, 0x537e4165, 0xc31a17a4, 0x963a275e, + 0xcb3bab6b, 0xf11f9d45, 0xabacfa58, 0x934be303, + 0x552030fa, 0xf6ad766d, 0x9188cc76, 0x25f5024c, + 0xfc4fe5d7, 0xd7c52acb, 0x80263544, 0x8fb562a3, + 0x49deb15a, 0x6725ba1b, 0x9845ea0e, 0xe15dfec0, + 0x02c32f75, 0x12814cf0, 0xa38d4697, 0xc66bd3f9, + 0xe7038f5f, 0x9515929c, 0xebbf6d7a, 0xda955259, + 0x2dd4be83, 0xd3587421, 0x2949e069, 0x448ec9c8, + 0x6a75c289, 0x78f48e79, 0x6b99583e, 0xdd27b971, + 0xb6bee14f, 0x17f088ad, 0x66c920ac, 0xb47dce3a, + 0x1863df4a, 0x82e51a31, 0x60975133, 0x4562537f, + 0xe0b16477, 0x84bb6bae, 0x1cfe81a0, 0x94f9082b, + 0x58704868, 0x198f45fd, 0x8794de6c, 0xb7527bf8, + 0x23ab73d3, 0xe2724b02, 0x57e31f8f, 0x2a6655ab, + 0x07b2eb28, 0x032fb5c2, 0x9a86c57b, 0xa5d33708, + 0xf2302887, 0xb223bfa5, 0xba02036a, 0x5ced1682, + 0x2b8acf1c, 0x92a779b4, 0xf0f307f2, 0xa14e69e2, + 0xcd65daf4, 0xd50605be, 0x1fd13462, 0x8ac4a6fe, + 0x9d342e53, 0xa0a2f355, 0x32058ae1, 0x75a4f6eb, + 0x390b83ec, 0xaa4060ef, 0x065e719f, 0x51bd6e10, + 0xf93e218a, 0x3d96dd06, 0xaedd3e05, 0x464de6bd, + 0xb591548d, 0x0571c45d, 0x6f0406d4, 0xff605015, + 0x241998fb, 0x97d6bde9, 0xcc894043, 0x7767d99e, + 0xbdb0e842, 0x8807898b, 0x38e7195b, 0xdb79c8ee, + 0x47a17c0a, 0xe97c420f, 0xc9f8841e, 0x00000000, + 0x83098086, 0x48322bed, 0xac1e1170, 0x4e6c5a72, + 0xfbfd0eff, 0x560f8538, 0x1e3daed5, 0x27362d39, + 0x640a0fd9, 0x21685ca6, 0xd19b5b54, 0x3a24362e, + 0xb10c0a67, 0x0f9357e7, 0xd2b4ee96, 0x9e1b9b91, + 0x4f80c0c5, 0xa261dc20, 0x695a774b, 0x161c121a, + 0x0ae293ba, 0xe5c0a02a, 0x433c22e0, 0x1d121b17, + 0x0b0e090d, 0xadf28bc7, 0xb92db6a8, 0xc8141ea9, + 0x8557f119, 0x4caf7507, 0xbbee99dd, 0xfda37f60, + 0x9ff70126, 0xbc5c72f5, 0xc544663b, 0x345bfb7e, + 0x768b4329, 0xdccb23c6, 0x68b6edfc, 0x63b8e4f1, + 0xcad731dc, 0x10426385, 0x40139722, 0x2084c611, + 0x7d854a24, 0xf8d2bb3d, 0x11aef932, 0x6dc729a1, + 0x4b1d9e2f, 0xf3dcb230, 0xec0d8652, 0xd077c1e3, + 0x6c2bb316, 0x99a970b9, 0xfa119448, 0x2247e964, + 0xc4a8fc8c, 0x1aa0f03f, 0xd8567d2c, 0xef223390, + 0xc787494e, 0xc1d938d1, 0xfe8ccaa2, 0x3698d40b, + 0xcfa6f581, 0x28a57ade, 0x26dab78e, 0xa43fadbf, + 0xe42c3a9d, 0x0d507892, 0x9b6a5fcc, 0x62547e46, + 0xc2f68d13, 0xe890d8b8, 0x5e2e39f7, 0xf582c3af, + 0xbe9f5d80, 0x7c69d093, 0xa96fd52d, 0xb3cf2512, + 0x3bc8ac99, 0xa710187d, 0x6ee89c63, 0x7bdb3bbb, + 0x09cd2678, 0xf46e5918, 0x01ec9ab7, 0xa8834f9a, + 0x65e6956e, 0x7eaaffe6, 0x0821bccf, 0xe6ef15e8, + 0xd9bae79b, 0xce4a6f36, 0xd4ea9f09, 0xd629b07c, + 0xaf31a4b2, 0x312a3f23, 0x30c6a594, 0xc035a266, + 0x37744ebc, 0xa6fc82ca, 0xb0e090d0, 0x1533a7d8, + 0x4af10498, 0xf741ecda, 0x0e7fcd50, 0x2f1791f6, + 0x8d764dd6, 0x4d43efb0, 0x54ccaa4d, 0xdfe49604, + 0xe39ed1b5, 0x1b4c6a88, 0xb8c12c1f, 0x7f466551, + 0x049d5eea, 0x5d018c35, 0x73fa8774, 0x2efb0b41, + 0x5ab3671d, 0x5292dbd2, 0x33e91056, 0x136dd647, + 0x8c9ad761, 0x7a37a10c, 0x8e59f814, 0x89eb133c, + 0xeecea927, 0x35b761c9, 0xede11ce5, 0x3c7a47b1, + 0x599cd2df, 0x3f55f273, 0x791814ce, 0xbf73c737, + 0xea53f7cd, 0x5b5ffdaa, 0x14df3d6f, 0x867844db, + 0x81caaff3, 0x3eb968c4, 0x2c382434, 0x5fc2a340, + 0x72161dc3, 0x0cbce225, 0x8b283c49, 0x41ff0d95, + 0x7139a801, 0xde080cb3, 0x9cd8b4e4, 0x906456c1, + 0x617bcb84, 0x70d532b6, 0x74486c5c, 0x42d0b857, +}; + +__device__ __constant__ u32 td2[256] = +{ + 0xa75051f4, 0x65537e41, 0xa4c31a17, 0x5e963a27, + 0x6bcb3bab, 0x45f11f9d, 0x58abacfa, 0x03934be3, + 0xfa552030, 0x6df6ad76, 0x769188cc, 0x4c25f502, + 0xd7fc4fe5, 0xcbd7c52a, 0x44802635, 0xa38fb562, + 0x5a49deb1, 0x1b6725ba, 0x0e9845ea, 0xc0e15dfe, + 0x7502c32f, 0xf012814c, 0x97a38d46, 0xf9c66bd3, + 0x5fe7038f, 0x9c951592, 0x7aebbf6d, 0x59da9552, + 0x832dd4be, 0x21d35874, 0x692949e0, 0xc8448ec9, + 0x896a75c2, 0x7978f48e, 0x3e6b9958, 0x71dd27b9, + 0x4fb6bee1, 0xad17f088, 0xac66c920, 0x3ab47dce, + 0x4a1863df, 0x3182e51a, 0x33609751, 0x7f456253, + 0x77e0b164, 0xae84bb6b, 0xa01cfe81, 0x2b94f908, + 0x68587048, 0xfd198f45, 0x6c8794de, 0xf8b7527b, + 0xd323ab73, 0x02e2724b, 0x8f57e31f, 0xab2a6655, + 0x2807b2eb, 0xc2032fb5, 0x7b9a86c5, 0x08a5d337, + 0x87f23028, 0xa5b223bf, 0x6aba0203, 0x825ced16, + 0x1c2b8acf, 0xb492a779, 0xf2f0f307, 0xe2a14e69, + 0xf4cd65da, 0xbed50605, 0x621fd134, 0xfe8ac4a6, + 0x539d342e, 0x55a0a2f3, 0xe132058a, 0xeb75a4f6, + 0xec390b83, 0xefaa4060, 0x9f065e71, 0x1051bd6e, + 0x8af93e21, 0x063d96dd, 0x05aedd3e, 0xbd464de6, + 0x8db59154, 0x5d0571c4, 0xd46f0406, 0x15ff6050, + 0xfb241998, 0xe997d6bd, 0x43cc8940, 0x9e7767d9, + 0x42bdb0e8, 0x8b880789, 0x5b38e719, 0xeedb79c8, + 0x0a47a17c, 0x0fe97c42, 0x1ec9f884, 0x00000000, + 0x86830980, 0xed48322b, 0x70ac1e11, 0x724e6c5a, + 0xfffbfd0e, 0x38560f85, 0xd51e3dae, 0x3927362d, + 0xd9640a0f, 0xa621685c, 0x54d19b5b, 0x2e3a2436, + 0x67b10c0a, 0xe70f9357, 0x96d2b4ee, 0x919e1b9b, + 0xc54f80c0, 0x20a261dc, 0x4b695a77, 0x1a161c12, + 0xba0ae293, 0x2ae5c0a0, 0xe0433c22, 0x171d121b, + 0x0d0b0e09, 0xc7adf28b, 0xa8b92db6, 0xa9c8141e, + 0x198557f1, 0x074caf75, 0xddbbee99, 0x60fda37f, + 0x269ff701, 0xf5bc5c72, 0x3bc54466, 0x7e345bfb, + 0x29768b43, 0xc6dccb23, 0xfc68b6ed, 0xf163b8e4, + 0xdccad731, 0x85104263, 0x22401397, 0x112084c6, + 0x247d854a, 0x3df8d2bb, 0x3211aef9, 0xa16dc729, + 0x2f4b1d9e, 0x30f3dcb2, 0x52ec0d86, 0xe3d077c1, + 0x166c2bb3, 0xb999a970, 0x48fa1194, 0x642247e9, + 0x8cc4a8fc, 0x3f1aa0f0, 0x2cd8567d, 0x90ef2233, + 0x4ec78749, 0xd1c1d938, 0xa2fe8cca, 0x0b3698d4, + 0x81cfa6f5, 0xde28a57a, 0x8e26dab7, 0xbfa43fad, + 0x9de42c3a, 0x920d5078, 0xcc9b6a5f, 0x4662547e, + 0x13c2f68d, 0xb8e890d8, 0xf75e2e39, 0xaff582c3, + 0x80be9f5d, 0x937c69d0, 0x2da96fd5, 0x12b3cf25, + 0x993bc8ac, 0x7da71018, 0x636ee89c, 0xbb7bdb3b, + 0x7809cd26, 0x18f46e59, 0xb701ec9a, 0x9aa8834f, + 0x6e65e695, 0xe67eaaff, 0xcf0821bc, 0xe8e6ef15, + 0x9bd9bae7, 0x36ce4a6f, 0x09d4ea9f, 0x7cd629b0, + 0xb2af31a4, 0x23312a3f, 0x9430c6a5, 0x66c035a2, + 0xbc37744e, 0xcaa6fc82, 0xd0b0e090, 0xd81533a7, + 0x984af104, 0xdaf741ec, 0x500e7fcd, 0xf62f1791, + 0xd68d764d, 0xb04d43ef, 0x4d54ccaa, 0x04dfe496, + 0xb5e39ed1, 0x881b4c6a, 0x1fb8c12c, 0x517f4665, + 0xea049d5e, 0x355d018c, 0x7473fa87, 0x412efb0b, + 0x1d5ab367, 0xd25292db, 0x5633e910, 0x47136dd6, + 0x618c9ad7, 0x0c7a37a1, 0x148e59f8, 0x3c89eb13, + 0x27eecea9, 0xc935b761, 0xe5ede11c, 0xb13c7a47, + 0xdf599cd2, 0x733f55f2, 0xce791814, 0x37bf73c7, + 0xcdea53f7, 0xaa5b5ffd, 0x6f14df3d, 0xdb867844, + 0xf381caaf, 0xc43eb968, 0x342c3824, 0x405fc2a3, + 0xc372161d, 0x250cbce2, 0x498b283c, 0x9541ff0d, + 0x017139a8, 0xb3de080c, 0xe49cd8b4, 0xc1906456, + 0x84617bcb, 0xb670d532, 0x5c74486c, 0x5742d0b8, +}; + +__device__ __constant__ u32 td3[256] = +{ + 0xf4a75051, 0x4165537e, 0x17a4c31a, 0x275e963a, + 0xab6bcb3b, 0x9d45f11f, 0xfa58abac, 0xe303934b, + 0x30fa5520, 0x766df6ad, 0xcc769188, 0x024c25f5, + 0xe5d7fc4f, 0x2acbd7c5, 0x35448026, 0x62a38fb5, + 0xb15a49de, 0xba1b6725, 0xea0e9845, 0xfec0e15d, + 0x2f7502c3, 0x4cf01281, 0x4697a38d, 0xd3f9c66b, + 0x8f5fe703, 0x929c9515, 0x6d7aebbf, 0x5259da95, + 0xbe832dd4, 0x7421d358, 0xe0692949, 0xc9c8448e, + 0xc2896a75, 0x8e7978f4, 0x583e6b99, 0xb971dd27, + 0xe14fb6be, 0x88ad17f0, 0x20ac66c9, 0xce3ab47d, + 0xdf4a1863, 0x1a3182e5, 0x51336097, 0x537f4562, + 0x6477e0b1, 0x6bae84bb, 0x81a01cfe, 0x082b94f9, + 0x48685870, 0x45fd198f, 0xde6c8794, 0x7bf8b752, + 0x73d323ab, 0x4b02e272, 0x1f8f57e3, 0x55ab2a66, + 0xeb2807b2, 0xb5c2032f, 0xc57b9a86, 0x3708a5d3, + 0x2887f230, 0xbfa5b223, 0x036aba02, 0x16825ced, + 0xcf1c2b8a, 0x79b492a7, 0x07f2f0f3, 0x69e2a14e, + 0xdaf4cd65, 0x05bed506, 0x34621fd1, 0xa6fe8ac4, + 0x2e539d34, 0xf355a0a2, 0x8ae13205, 0xf6eb75a4, + 0x83ec390b, 0x60efaa40, 0x719f065e, 0x6e1051bd, + 0x218af93e, 0xdd063d96, 0x3e05aedd, 0xe6bd464d, + 0x548db591, 0xc45d0571, 0x06d46f04, 0x5015ff60, + 0x98fb2419, 0xbde997d6, 0x4043cc89, 0xd99e7767, + 0xe842bdb0, 0x898b8807, 0x195b38e7, 0xc8eedb79, + 0x7c0a47a1, 0x420fe97c, 0x841ec9f8, 0x00000000, + 0x80868309, 0x2bed4832, 0x1170ac1e, 0x5a724e6c, + 0x0efffbfd, 0x8538560f, 0xaed51e3d, 0x2d392736, + 0x0fd9640a, 0x5ca62168, 0x5b54d19b, 0x362e3a24, + 0x0a67b10c, 0x57e70f93, 0xee96d2b4, 0x9b919e1b, + 0xc0c54f80, 0xdc20a261, 0x774b695a, 0x121a161c, + 0x93ba0ae2, 0xa02ae5c0, 0x22e0433c, 0x1b171d12, + 0x090d0b0e, 0x8bc7adf2, 0xb6a8b92d, 0x1ea9c814, + 0xf1198557, 0x75074caf, 0x99ddbbee, 0x7f60fda3, + 0x01269ff7, 0x72f5bc5c, 0x663bc544, 0xfb7e345b, + 0x4329768b, 0x23c6dccb, 0xedfc68b6, 0xe4f163b8, + 0x31dccad7, 0x63851042, 0x97224013, 0xc6112084, + 0x4a247d85, 0xbb3df8d2, 0xf93211ae, 0x29a16dc7, + 0x9e2f4b1d, 0xb230f3dc, 0x8652ec0d, 0xc1e3d077, + 0xb3166c2b, 0x70b999a9, 0x9448fa11, 0xe9642247, + 0xfc8cc4a8, 0xf03f1aa0, 0x7d2cd856, 0x3390ef22, + 0x494ec787, 0x38d1c1d9, 0xcaa2fe8c, 0xd40b3698, + 0xf581cfa6, 0x7ade28a5, 0xb78e26da, 0xadbfa43f, + 0x3a9de42c, 0x78920d50, 0x5fcc9b6a, 0x7e466254, + 0x8d13c2f6, 0xd8b8e890, 0x39f75e2e, 0xc3aff582, + 0x5d80be9f, 0xd0937c69, 0xd52da96f, 0x2512b3cf, + 0xac993bc8, 0x187da710, 0x9c636ee8, 0x3bbb7bdb, + 0x267809cd, 0x5918f46e, 0x9ab701ec, 0x4f9aa883, + 0x956e65e6, 0xffe67eaa, 0xbccf0821, 0x15e8e6ef, + 0xe79bd9ba, 0x6f36ce4a, 0x9f09d4ea, 0xb07cd629, + 0xa4b2af31, 0x3f23312a, 0xa59430c6, 0xa266c035, + 0x4ebc3774, 0x82caa6fc, 0x90d0b0e0, 0xa7d81533, + 0x04984af1, 0xecdaf741, 0xcd500e7f, 0x91f62f17, + 0x4dd68d76, 0xefb04d43, 0xaa4d54cc, 0x9604dfe4, + 0xd1b5e39e, 0x6a881b4c, 0x2c1fb8c1, 0x65517f46, + 0x5eea049d, 0x8c355d01, 0x877473fa, 0x0b412efb, + 0x671d5ab3, 0xdbd25292, 0x105633e9, 0xd647136d, + 0xd7618c9a, 0xa10c7a37, 0xf8148e59, 0x133c89eb, + 0xa927eece, 0x61c935b7, 0x1ce5ede1, 0x47b13c7a, + 0xd2df599c, 0xf2733f55, 0x14ce7918, 0xc737bf73, + 0xf7cdea53, 0xfdaa5b5f, 0x3d6f14df, 0x44db8678, + 0xaff381ca, 0x68c43eb9, 0x24342c38, 0xa3405fc2, + 0x1dc37216, 0xe2250cbc, 0x3c498b28, 0x0d9541ff, + 0xa8017139, 0x0cb3de08, 0xb4e49cd8, 0x56c19064, + 0xcb84617b, 0x32b670d5, 0x6c5c7448, 0xb85742d0, +}; + +__device__ __constant__ u32 td4[256] = +{ + 0x52525252, 0x09090909, 0x6a6a6a6a, 0xd5d5d5d5, + 0x30303030, 0x36363636, 0xa5a5a5a5, 0x38383838, + 0xbfbfbfbf, 0x40404040, 0xa3a3a3a3, 0x9e9e9e9e, + 0x81818181, 0xf3f3f3f3, 0xd7d7d7d7, 0xfbfbfbfb, + 0x7c7c7c7c, 0xe3e3e3e3, 0x39393939, 0x82828282, + 0x9b9b9b9b, 0x2f2f2f2f, 0xffffffff, 0x87878787, + 0x34343434, 0x8e8e8e8e, 0x43434343, 0x44444444, + 0xc4c4c4c4, 0xdededede, 0xe9e9e9e9, 0xcbcbcbcb, + 0x54545454, 0x7b7b7b7b, 0x94949494, 0x32323232, + 0xa6a6a6a6, 0xc2c2c2c2, 0x23232323, 0x3d3d3d3d, + 0xeeeeeeee, 0x4c4c4c4c, 0x95959595, 0x0b0b0b0b, + 0x42424242, 0xfafafafa, 0xc3c3c3c3, 0x4e4e4e4e, + 0x08080808, 0x2e2e2e2e, 0xa1a1a1a1, 0x66666666, + 0x28282828, 0xd9d9d9d9, 0x24242424, 0xb2b2b2b2, + 0x76767676, 0x5b5b5b5b, 0xa2a2a2a2, 0x49494949, + 0x6d6d6d6d, 0x8b8b8b8b, 0xd1d1d1d1, 0x25252525, + 0x72727272, 0xf8f8f8f8, 0xf6f6f6f6, 0x64646464, + 0x86868686, 0x68686868, 0x98989898, 0x16161616, + 0xd4d4d4d4, 0xa4a4a4a4, 0x5c5c5c5c, 0xcccccccc, + 0x5d5d5d5d, 0x65656565, 0xb6b6b6b6, 0x92929292, + 0x6c6c6c6c, 0x70707070, 0x48484848, 0x50505050, + 0xfdfdfdfd, 0xedededed, 0xb9b9b9b9, 0xdadadada, + 0x5e5e5e5e, 0x15151515, 0x46464646, 0x57575757, + 0xa7a7a7a7, 0x8d8d8d8d, 0x9d9d9d9d, 0x84848484, + 0x90909090, 0xd8d8d8d8, 0xabababab, 0x00000000, + 0x8c8c8c8c, 0xbcbcbcbc, 0xd3d3d3d3, 0x0a0a0a0a, + 0xf7f7f7f7, 0xe4e4e4e4, 0x58585858, 0x05050505, + 0xb8b8b8b8, 0xb3b3b3b3, 0x45454545, 0x06060606, + 0xd0d0d0d0, 0x2c2c2c2c, 0x1e1e1e1e, 0x8f8f8f8f, + 0xcacacaca, 0x3f3f3f3f, 0x0f0f0f0f, 0x02020202, + 0xc1c1c1c1, 0xafafafaf, 0xbdbdbdbd, 0x03030303, + 0x01010101, 0x13131313, 0x8a8a8a8a, 0x6b6b6b6b, + 0x3a3a3a3a, 0x91919191, 0x11111111, 0x41414141, + 0x4f4f4f4f, 0x67676767, 0xdcdcdcdc, 0xeaeaeaea, + 0x97979797, 0xf2f2f2f2, 0xcfcfcfcf, 0xcececece, + 0xf0f0f0f0, 0xb4b4b4b4, 0xe6e6e6e6, 0x73737373, + 0x96969696, 0xacacacac, 0x74747474, 0x22222222, + 0xe7e7e7e7, 0xadadadad, 0x35353535, 0x85858585, + 0xe2e2e2e2, 0xf9f9f9f9, 0x37373737, 0xe8e8e8e8, + 0x1c1c1c1c, 0x75757575, 0xdfdfdfdf, 0x6e6e6e6e, + 0x47474747, 0xf1f1f1f1, 0x1a1a1a1a, 0x71717171, + 0x1d1d1d1d, 0x29292929, 0xc5c5c5c5, 0x89898989, + 0x6f6f6f6f, 0xb7b7b7b7, 0x62626262, 0x0e0e0e0e, + 0xaaaaaaaa, 0x18181818, 0xbebebebe, 0x1b1b1b1b, + 0xfcfcfcfc, 0x56565656, 0x3e3e3e3e, 0x4b4b4b4b, + 0xc6c6c6c6, 0xd2d2d2d2, 0x79797979, 0x20202020, + 0x9a9a9a9a, 0xdbdbdbdb, 0xc0c0c0c0, 0xfefefefe, + 0x78787878, 0xcdcdcdcd, 0x5a5a5a5a, 0xf4f4f4f4, + 0x1f1f1f1f, 0xdddddddd, 0xa8a8a8a8, 0x33333333, + 0x88888888, 0x07070707, 0xc7c7c7c7, 0x31313131, + 0xb1b1b1b1, 0x12121212, 0x10101010, 0x59595959, + 0x27272727, 0x80808080, 0xecececec, 0x5f5f5f5f, + 0x60606060, 0x51515151, 0x7f7f7f7f, 0xa9a9a9a9, + 0x19191919, 0xb5b5b5b5, 0x4a4a4a4a, 0x0d0d0d0d, + 0x2d2d2d2d, 0xe5e5e5e5, 0x7a7a7a7a, 0x9f9f9f9f, + 0x93939393, 0xc9c9c9c9, 0x9c9c9c9c, 0xefefefef, + 0xa0a0a0a0, 0xe0e0e0e0, 0x3b3b3b3b, 0x4d4d4d4d, + 0xaeaeaeae, 0x2a2a2a2a, 0xf5f5f5f5, 0xb0b0b0b0, + 0xc8c8c8c8, 0xebebebeb, 0xbbbbbbbb, 0x3c3c3c3c, + 0x83838383, 0x53535353, 0x99999999, 0x61616161, + 0x17171717, 0x2b2b2b2b, 0x04040404, 0x7e7e7e7e, + 0xbabababa, 0x77777777, 0xd6d6d6d6, 0x26262626, + 0xe1e1e1e1, 0x69696969, 0x14141414, 0x63636363, + 0x55555555, 0x21212121, 0x0c0c0c0c, 0x7d7d7d7d, +}; + +__device__ __constant__ u32 rcon[] = +{ + 0x01000000, 0x02000000, 0x04000000, 0x08000000, + 0x10000000, 0x20000000, 0x40000000, 0x80000000, + 0x1b000000, 0x36000000, +}; + +__device__ static void AES256_ExpandKey (u32 *userkey, u32 *rek, u32 s_te0[256], u32 s_te1[256], u32 s_te2[256], u32 s_te3[256], u32 s_te4[256]) +{ + rek[0] = userkey[0]; + rek[1] = userkey[1]; + rek[2] = userkey[2]; + rek[3] = userkey[3]; + rek[4] = userkey[4]; + rek[5] = userkey[5]; + rek[6] = userkey[6]; + rek[7] = userkey[7]; + + int i; + int j; + + i = 0; + j = 0; + + u32 run = 1; + + while (run) + { + u32 temp = rek[j + 7]; + + rek[j + 8] = rek[j + 0] + ^ (s_te2[(temp >> 16) & 0xff] & 0xff000000) + ^ (s_te3[(temp >> 8) & 0xff] & 0x00ff0000) + ^ (s_te0[(temp >> 0) & 0xff] & 0x0000ff00) + ^ (s_te1[(temp >> 24) & 0xff] & 0x000000ff) + ^ rcon[i]; + + rek[j + 9] = rek[j + 1] ^ rek[j + 8]; + rek[j + 10] = rek[j + 2] ^ rek[j + 9]; + rek[j + 11] = rek[j + 3] ^ rek[j + 10]; + + if (++i == 7) + { + run = 0; + continue; + } + + temp = rek[j + 11]; + + rek[j + 12] = rek[j + 4] + ^ (s_te2[(temp >> 24) & 0xff] & 0xff000000) + ^ (s_te3[(temp >> 16) & 0xff] & 0x00ff0000) + ^ (s_te0[(temp >> 8) & 0xff] & 0x0000ff00) + ^ (s_te1[(temp >> 0) & 0xff] & 0x000000ff); + + rek[j + 13] = rek[j + 5] ^ rek[j + 12]; + rek[j + 14] = rek[j + 6] ^ rek[j + 13]; + rek[j + 15] = rek[j + 7] ^ rek[j + 14]; + + j += 8; + } +} + +__device__ static void AES256_InvertKey (u32 *rdk, u32 s_td0[256], u32 s_td1[256], u32 s_td2[256], u32 s_td3[256], u32 s_td4[256], u32 s_te0[256], u32 s_te1[256], u32 s_te2[256], u32 s_te3[256], u32 s_te4[256]) +{ + for (u32 i = 0, j = 56; i < j; i += 4, j -= 4) + { + u32 temp; + + temp = rdk[i + 0]; rdk[i + 0] = rdk[j + 0]; rdk[j + 0] = temp; + temp = rdk[i + 1]; rdk[i + 1] = rdk[j + 1]; rdk[j + 1] = temp; + temp = rdk[i + 2]; rdk[i + 2] = rdk[j + 2]; rdk[j + 2] = temp; + temp = rdk[i + 3]; rdk[i + 3] = rdk[j + 3]; rdk[j + 3] = temp; + } + + for (u32 i = 1, j = 4; i < 14; i += 1, j += 4) + { + rdk[j + 0] = + s_td0[s_te1[(rdk[j + 0] >> 24) & 0xff] & 0xff] ^ + s_td1[s_te1[(rdk[j + 0] >> 16) & 0xff] & 0xff] ^ + s_td2[s_te1[(rdk[j + 0] >> 8) & 0xff] & 0xff] ^ + s_td3[s_te1[(rdk[j + 0] >> 0) & 0xff] & 0xff]; + + rdk[j + 1] = + s_td0[s_te1[(rdk[j + 1] >> 24) & 0xff] & 0xff] ^ + s_td1[s_te1[(rdk[j + 1] >> 16) & 0xff] & 0xff] ^ + s_td2[s_te1[(rdk[j + 1] >> 8) & 0xff] & 0xff] ^ + s_td3[s_te1[(rdk[j + 1] >> 0) & 0xff] & 0xff]; + + rdk[j + 2] = + s_td0[s_te1[(rdk[j + 2] >> 24) & 0xff] & 0xff] ^ + s_td1[s_te1[(rdk[j + 2] >> 16) & 0xff] & 0xff] ^ + s_td2[s_te1[(rdk[j + 2] >> 8) & 0xff] & 0xff] ^ + s_td3[s_te1[(rdk[j + 2] >> 0) & 0xff] & 0xff]; + + rdk[j + 3] = + s_td0[s_te1[(rdk[j + 3] >> 24) & 0xff] & 0xff] ^ + s_td1[s_te1[(rdk[j + 3] >> 16) & 0xff] & 0xff] ^ + s_td2[s_te1[(rdk[j + 3] >> 8) & 0xff] & 0xff] ^ + s_td3[s_te1[(rdk[j + 3] >> 0) & 0xff] & 0xff]; + } +} + +__device__ static void AES256_decrypt (const u32 *in, u32 *out, const u32 *rdk, u32 s_td0[256], u32 s_td1[256], u32 s_td2[256], u32 s_td3[256], u32 s_td4[256]) +{ + u32 s0 = in[0] ^ rdk[0]; + u32 s1 = in[1] ^ rdk[1]; + u32 s2 = in[2] ^ rdk[2]; + u32 s3 = in[3] ^ rdk[3]; + + u32 t0; + u32 t1; + u32 t2; + u32 t3; + + t0 = s_td0[s0 >> 24] ^ s_td1[(s3 >> 16) & 0xff] ^ s_td2[(s2 >> 8) & 0xff] ^ s_td3[s1 & 0xff] ^ rdk[ 4]; + t1 = s_td0[s1 >> 24] ^ s_td1[(s0 >> 16) & 0xff] ^ s_td2[(s3 >> 8) & 0xff] ^ s_td3[s2 & 0xff] ^ rdk[ 5]; + t2 = s_td0[s2 >> 24] ^ s_td1[(s1 >> 16) & 0xff] ^ s_td2[(s0 >> 8) & 0xff] ^ s_td3[s3 & 0xff] ^ rdk[ 6]; + t3 = s_td0[s3 >> 24] ^ s_td1[(s2 >> 16) & 0xff] ^ s_td2[(s1 >> 8) & 0xff] ^ s_td3[s0 & 0xff] ^ rdk[ 7]; + s0 = s_td0[t0 >> 24] ^ s_td1[(t3 >> 16) & 0xff] ^ s_td2[(t2 >> 8) & 0xff] ^ s_td3[t1 & 0xff] ^ rdk[ 8]; + s1 = s_td0[t1 >> 24] ^ s_td1[(t0 >> 16) & 0xff] ^ s_td2[(t3 >> 8) & 0xff] ^ s_td3[t2 & 0xff] ^ rdk[ 9]; + s2 = s_td0[t2 >> 24] ^ s_td1[(t1 >> 16) & 0xff] ^ s_td2[(t0 >> 8) & 0xff] ^ s_td3[t3 & 0xff] ^ rdk[10]; + s3 = s_td0[t3 >> 24] ^ s_td1[(t2 >> 16) & 0xff] ^ s_td2[(t1 >> 8) & 0xff] ^ s_td3[t0 & 0xff] ^ rdk[11]; + t0 = s_td0[s0 >> 24] ^ s_td1[(s3 >> 16) & 0xff] ^ s_td2[(s2 >> 8) & 0xff] ^ s_td3[s1 & 0xff] ^ rdk[12]; + t1 = s_td0[s1 >> 24] ^ s_td1[(s0 >> 16) & 0xff] ^ s_td2[(s3 >> 8) & 0xff] ^ s_td3[s2 & 0xff] ^ rdk[13]; + t2 = s_td0[s2 >> 24] ^ s_td1[(s1 >> 16) & 0xff] ^ s_td2[(s0 >> 8) & 0xff] ^ s_td3[s3 & 0xff] ^ rdk[14]; + t3 = s_td0[s3 >> 24] ^ s_td1[(s2 >> 16) & 0xff] ^ s_td2[(s1 >> 8) & 0xff] ^ s_td3[s0 & 0xff] ^ rdk[15]; + s0 = s_td0[t0 >> 24] ^ s_td1[(t3 >> 16) & 0xff] ^ s_td2[(t2 >> 8) & 0xff] ^ s_td3[t1 & 0xff] ^ rdk[16]; + s1 = s_td0[t1 >> 24] ^ s_td1[(t0 >> 16) & 0xff] ^ s_td2[(t3 >> 8) & 0xff] ^ s_td3[t2 & 0xff] ^ rdk[17]; + s2 = s_td0[t2 >> 24] ^ s_td1[(t1 >> 16) & 0xff] ^ s_td2[(t0 >> 8) & 0xff] ^ s_td3[t3 & 0xff] ^ rdk[18]; + s3 = s_td0[t3 >> 24] ^ s_td1[(t2 >> 16) & 0xff] ^ s_td2[(t1 >> 8) & 0xff] ^ s_td3[t0 & 0xff] ^ rdk[19]; + t0 = s_td0[s0 >> 24] ^ s_td1[(s3 >> 16) & 0xff] ^ s_td2[(s2 >> 8) & 0xff] ^ s_td3[s1 & 0xff] ^ rdk[20]; + t1 = s_td0[s1 >> 24] ^ s_td1[(s0 >> 16) & 0xff] ^ s_td2[(s3 >> 8) & 0xff] ^ s_td3[s2 & 0xff] ^ rdk[21]; + t2 = s_td0[s2 >> 24] ^ s_td1[(s1 >> 16) & 0xff] ^ s_td2[(s0 >> 8) & 0xff] ^ s_td3[s3 & 0xff] ^ rdk[22]; + t3 = s_td0[s3 >> 24] ^ s_td1[(s2 >> 16) & 0xff] ^ s_td2[(s1 >> 8) & 0xff] ^ s_td3[s0 & 0xff] ^ rdk[23]; + s0 = s_td0[t0 >> 24] ^ s_td1[(t3 >> 16) & 0xff] ^ s_td2[(t2 >> 8) & 0xff] ^ s_td3[t1 & 0xff] ^ rdk[24]; + s1 = s_td0[t1 >> 24] ^ s_td1[(t0 >> 16) & 0xff] ^ s_td2[(t3 >> 8) & 0xff] ^ s_td3[t2 & 0xff] ^ rdk[25]; + s2 = s_td0[t2 >> 24] ^ s_td1[(t1 >> 16) & 0xff] ^ s_td2[(t0 >> 8) & 0xff] ^ s_td3[t3 & 0xff] ^ rdk[26]; + s3 = s_td0[t3 >> 24] ^ s_td1[(t2 >> 16) & 0xff] ^ s_td2[(t1 >> 8) & 0xff] ^ s_td3[t0 & 0xff] ^ rdk[27]; + t0 = s_td0[s0 >> 24] ^ s_td1[(s3 >> 16) & 0xff] ^ s_td2[(s2 >> 8) & 0xff] ^ s_td3[s1 & 0xff] ^ rdk[28]; + t1 = s_td0[s1 >> 24] ^ s_td1[(s0 >> 16) & 0xff] ^ s_td2[(s3 >> 8) & 0xff] ^ s_td3[s2 & 0xff] ^ rdk[29]; + t2 = s_td0[s2 >> 24] ^ s_td1[(s1 >> 16) & 0xff] ^ s_td2[(s0 >> 8) & 0xff] ^ s_td3[s3 & 0xff] ^ rdk[30]; + t3 = s_td0[s3 >> 24] ^ s_td1[(s2 >> 16) & 0xff] ^ s_td2[(s1 >> 8) & 0xff] ^ s_td3[s0 & 0xff] ^ rdk[31]; + s0 = s_td0[t0 >> 24] ^ s_td1[(t3 >> 16) & 0xff] ^ s_td2[(t2 >> 8) & 0xff] ^ s_td3[t1 & 0xff] ^ rdk[32]; + s1 = s_td0[t1 >> 24] ^ s_td1[(t0 >> 16) & 0xff] ^ s_td2[(t3 >> 8) & 0xff] ^ s_td3[t2 & 0xff] ^ rdk[33]; + s2 = s_td0[t2 >> 24] ^ s_td1[(t1 >> 16) & 0xff] ^ s_td2[(t0 >> 8) & 0xff] ^ s_td3[t3 & 0xff] ^ rdk[34]; + s3 = s_td0[t3 >> 24] ^ s_td1[(t2 >> 16) & 0xff] ^ s_td2[(t1 >> 8) & 0xff] ^ s_td3[t0 & 0xff] ^ rdk[35]; + t0 = s_td0[s0 >> 24] ^ s_td1[(s3 >> 16) & 0xff] ^ s_td2[(s2 >> 8) & 0xff] ^ s_td3[s1 & 0xff] ^ rdk[36]; + t1 = s_td0[s1 >> 24] ^ s_td1[(s0 >> 16) & 0xff] ^ s_td2[(s3 >> 8) & 0xff] ^ s_td3[s2 & 0xff] ^ rdk[37]; + t2 = s_td0[s2 >> 24] ^ s_td1[(s1 >> 16) & 0xff] ^ s_td2[(s0 >> 8) & 0xff] ^ s_td3[s3 & 0xff] ^ rdk[38]; + t3 = s_td0[s3 >> 24] ^ s_td1[(s2 >> 16) & 0xff] ^ s_td2[(s1 >> 8) & 0xff] ^ s_td3[s0 & 0xff] ^ rdk[39]; + s0 = s_td0[t0 >> 24] ^ s_td1[(t3 >> 16) & 0xff] ^ s_td2[(t2 >> 8) & 0xff] ^ s_td3[t1 & 0xff] ^ rdk[40]; + s1 = s_td0[t1 >> 24] ^ s_td1[(t0 >> 16) & 0xff] ^ s_td2[(t3 >> 8) & 0xff] ^ s_td3[t2 & 0xff] ^ rdk[41]; + s2 = s_td0[t2 >> 24] ^ s_td1[(t1 >> 16) & 0xff] ^ s_td2[(t0 >> 8) & 0xff] ^ s_td3[t3 & 0xff] ^ rdk[42]; + s3 = s_td0[t3 >> 24] ^ s_td1[(t2 >> 16) & 0xff] ^ s_td2[(t1 >> 8) & 0xff] ^ s_td3[t0 & 0xff] ^ rdk[43]; + t0 = s_td0[s0 >> 24] ^ s_td1[(s3 >> 16) & 0xff] ^ s_td2[(s2 >> 8) & 0xff] ^ s_td3[s1 & 0xff] ^ rdk[44]; + t1 = s_td0[s1 >> 24] ^ s_td1[(s0 >> 16) & 0xff] ^ s_td2[(s3 >> 8) & 0xff] ^ s_td3[s2 & 0xff] ^ rdk[45]; + t2 = s_td0[s2 >> 24] ^ s_td1[(s1 >> 16) & 0xff] ^ s_td2[(s0 >> 8) & 0xff] ^ s_td3[s3 & 0xff] ^ rdk[46]; + t3 = s_td0[s3 >> 24] ^ s_td1[(s2 >> 16) & 0xff] ^ s_td2[(s1 >> 8) & 0xff] ^ s_td3[s0 & 0xff] ^ rdk[47]; + s0 = s_td0[t0 >> 24] ^ s_td1[(t3 >> 16) & 0xff] ^ s_td2[(t2 >> 8) & 0xff] ^ s_td3[t1 & 0xff] ^ rdk[48]; + s1 = s_td0[t1 >> 24] ^ s_td1[(t0 >> 16) & 0xff] ^ s_td2[(t3 >> 8) & 0xff] ^ s_td3[t2 & 0xff] ^ rdk[49]; + s2 = s_td0[t2 >> 24] ^ s_td1[(t1 >> 16) & 0xff] ^ s_td2[(t0 >> 8) & 0xff] ^ s_td3[t3 & 0xff] ^ rdk[50]; + s3 = s_td0[t3 >> 24] ^ s_td1[(t2 >> 16) & 0xff] ^ s_td2[(t1 >> 8) & 0xff] ^ s_td3[t0 & 0xff] ^ rdk[51]; + t0 = s_td0[s0 >> 24] ^ s_td1[(s3 >> 16) & 0xff] ^ s_td2[(s2 >> 8) & 0xff] ^ s_td3[s1 & 0xff] ^ rdk[52]; + t1 = s_td0[s1 >> 24] ^ s_td1[(s0 >> 16) & 0xff] ^ s_td2[(s3 >> 8) & 0xff] ^ s_td3[s2 & 0xff] ^ rdk[53]; + t2 = s_td0[s2 >> 24] ^ s_td1[(s1 >> 16) & 0xff] ^ s_td2[(s0 >> 8) & 0xff] ^ s_td3[s3 & 0xff] ^ rdk[54]; + t3 = s_td0[s3 >> 24] ^ s_td1[(s2 >> 16) & 0xff] ^ s_td2[(s1 >> 8) & 0xff] ^ s_td3[s0 & 0xff] ^ rdk[55]; + + out[0] = (s_td4[(t0 >> 24) & 0xff] & 0xff000000) + ^ (s_td4[(t3 >> 16) & 0xff] & 0x00ff0000) + ^ (s_td4[(t2 >> 8) & 0xff] & 0x0000ff00) + ^ (s_td4[(t1 >> 0) & 0xff] & 0x000000ff) + ^ rdk[56]; + + out[1] = (s_td4[(t1 >> 24) & 0xff] & 0xff000000) + ^ (s_td4[(t0 >> 16) & 0xff] & 0x00ff0000) + ^ (s_td4[(t3 >> 8) & 0xff] & 0x0000ff00) + ^ (s_td4[(t2 >> 0) & 0xff] & 0x000000ff) + ^ rdk[57]; + + out[2] = (s_td4[(t2 >> 24) & 0xff] & 0xff000000) + ^ (s_td4[(t1 >> 16) & 0xff] & 0x00ff0000) + ^ (s_td4[(t0 >> 8) & 0xff] & 0x0000ff00) + ^ (s_td4[(t3 >> 0) & 0xff] & 0x000000ff) + ^ rdk[58]; + + out[3] = (s_td4[(t3 >> 24) & 0xff] & 0xff000000) + ^ (s_td4[(t2 >> 16) & 0xff] & 0x00ff0000) + ^ (s_td4[(t1 >> 8) & 0xff] & 0x0000ff00) + ^ (s_td4[(t0 >> 0) & 0xff] & 0x000000ff) + ^ rdk[59]; +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m11300_init (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, bitcoin_wallet_tmp_t *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const bitcoin_wallet_t *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = pws[gid].i[ 8]; + w2[1] = pws[gid].i[ 9]; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * salt + */ + + u32 salt_buf0[4]; + + salt_buf0[0] = salt_bufs[salt_pos].salt_buf[0]; + salt_buf0[1] = salt_bufs[salt_pos].salt_buf[1]; + salt_buf0[2] = salt_bufs[salt_pos].salt_buf[2]; + salt_buf0[3] = salt_bufs[salt_pos].salt_buf[3]; + + u32 salt_buf1[4]; + + salt_buf1[0] = salt_bufs[salt_pos].salt_buf[4]; + salt_buf1[1] = salt_bufs[salt_pos].salt_buf[5]; + salt_buf1[2] = salt_bufs[salt_pos].salt_buf[6]; + salt_buf1[3] = salt_bufs[salt_pos].salt_buf[7]; + + u32 salt_buf2[4]; + + salt_buf2[0] = 0; + salt_buf2[1] = 0; + salt_buf2[2] = 0; + salt_buf2[3] = 0; + + u32 salt_buf3[4]; + + salt_buf3[0] = 0; + salt_buf3[1] = 0; + salt_buf3[2] = 0; + salt_buf3[3] = 0; + + u32 salt_len = salt_bufs[salt_pos].salt_len; + + switch_buffer_by_offset (salt_buf0, salt_buf1, salt_buf2, salt_buf3, pw_len); + + w0[0] |= salt_buf0[0]; + w0[1] |= salt_buf0[1]; + w0[2] |= salt_buf0[2]; + w0[3] |= salt_buf0[3]; + + w1[0] |= salt_buf1[0]; + w1[1] |= salt_buf1[1]; + w1[2] |= salt_buf1[2]; + w1[3] |= salt_buf1[3]; + + w2[0] |= salt_buf2[0]; + w2[1] |= salt_buf2[1]; + w2[2] |= salt_buf2[2]; + w2[3] |= salt_buf2[3]; + + w3[0] |= salt_buf3[0]; + w3[1] |= salt_buf3[1]; + w3[2] |= salt_buf3[2]; + w3[3] |= salt_buf3[3]; + + const u32 block_len = pw_len + salt_len; + + /** + * init + */ + + w0[0] = swap_workaround (w0[0]); + w0[1] = swap_workaround (w0[1]); + w0[2] = swap_workaround (w0[2]); + w0[3] = swap_workaround (w0[3]); + w1[0] = swap_workaround (w1[0]); + w1[1] = swap_workaround (w1[1]); + w1[2] = swap_workaround (w1[2]); + w1[3] = swap_workaround (w1[3]); + w2[0] = swap_workaround (w2[0]); + w2[1] = swap_workaround (w2[1]); + w2[2] = swap_workaround (w2[2]); + w2[3] = swap_workaround (w2[3]); + w3[0] = swap_workaround (w3[0]); + w3[1] = swap_workaround (w3[1]); + w3[2] = swap_workaround (w3[2]); + w3[3] = swap_workaround (w3[3]); + + u64x w[16]; + + w[ 0] = hl32_to_64 (w0[0], w0[1]); + w[ 1] = hl32_to_64 (w0[2], w0[3]); + w[ 2] = hl32_to_64 (w1[0], w1[1]); + w[ 3] = hl32_to_64 (w1[2], w1[3]); + w[ 4] = hl32_to_64 (w2[0], w2[1]); + w[ 5] = hl32_to_64 (w2[2], w2[3]); + w[ 6] = hl32_to_64 (w3[0], w3[1]); + w[ 7] = hl32_to_64 (w3[2], w3[3]); + w[ 8] = 0; + w[ 9] = 0; + w[10] = 0; + w[11] = 0; + w[12] = 0; + w[13] = 0; + w[14] = 0; + w[15] = block_len * 8; + + u64x dgst[8]; + + dgst[0] = SHA512M_A; + dgst[1] = SHA512M_B; + dgst[2] = SHA512M_C; + dgst[3] = SHA512M_D; + dgst[4] = SHA512M_E; + dgst[5] = SHA512M_F; + dgst[6] = SHA512M_G; + dgst[7] = SHA512M_H; + + sha512_transform (w, dgst); + + tmps[gid].dgst[0] = dgst[0]; + tmps[gid].dgst[1] = dgst[1]; + tmps[gid].dgst[2] = dgst[2]; + tmps[gid].dgst[3] = dgst[3]; + tmps[gid].dgst[4] = dgst[4]; + tmps[gid].dgst[5] = dgst[5]; + tmps[gid].dgst[6] = dgst[6]; + tmps[gid].dgst[7] = dgst[7]; +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m11300_loop (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, bitcoin_wallet_tmp_t *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const bitcoin_wallet_t *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + + if (gid >= gid_max) return; + + u64x dgst[8]; + + dgst[0] = tmps[gid].dgst[0]; + dgst[1] = tmps[gid].dgst[1]; + dgst[2] = tmps[gid].dgst[2]; + dgst[3] = tmps[gid].dgst[3]; + dgst[4] = tmps[gid].dgst[4]; + dgst[5] = tmps[gid].dgst[5]; + dgst[6] = tmps[gid].dgst[6]; + dgst[7] = tmps[gid].dgst[7]; + + u64x w[16]; + + w[ 0] = dgst[0]; + w[ 1] = dgst[1]; + w[ 2] = dgst[2]; + w[ 3] = dgst[3]; + w[ 4] = dgst[4]; + w[ 5] = dgst[5]; + w[ 6] = dgst[6]; + w[ 7] = dgst[7]; + w[ 8] = 0x8000000000000000; + w[ 9] = 0; + w[10] = 0; + w[11] = 0; + w[12] = 0; + w[13] = 0; + w[14] = 0; + w[15] = 64 * 8; + + for (u32 i = 0; i < loop_cnt; i++) + { + w[0] = dgst[0]; + w[1] = dgst[1]; + w[2] = dgst[2]; + w[3] = dgst[3]; + w[4] = dgst[4]; + w[5] = dgst[5]; + w[6] = dgst[6]; + w[7] = dgst[7]; + + dgst[0] = SHA512M_A; + dgst[1] = SHA512M_B; + dgst[2] = SHA512M_C; + dgst[3] = SHA512M_D; + dgst[4] = SHA512M_E; + dgst[5] = SHA512M_F; + dgst[6] = SHA512M_G; + dgst[7] = SHA512M_H; + + sha512_transform (w, dgst); + } + + tmps[gid].dgst[0] = dgst[0]; + tmps[gid].dgst[1] = dgst[1]; + tmps[gid].dgst[2] = dgst[2]; + tmps[gid].dgst[3] = dgst[3]; + tmps[gid].dgst[4] = dgst[4]; + tmps[gid].dgst[5] = dgst[5]; + tmps[gid].dgst[6] = dgst[6]; + tmps[gid].dgst[7] = dgst[7]; +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m11300_comp (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, bitcoin_wallet_tmp_t *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const bitcoin_wallet_t *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + const u32 lid = threadIdx.x; + + /** + * aes shared + */ + + __shared__ u32 s_td0[256]; + __shared__ u32 s_td1[256]; + __shared__ u32 s_td2[256]; + __shared__ u32 s_td3[256]; + __shared__ u32 s_td4[256]; + + __shared__ u32 s_te0[256]; + __shared__ u32 s_te1[256]; + __shared__ u32 s_te2[256]; + __shared__ u32 s_te3[256]; + __shared__ u32 s_te4[256]; + + s_td0[lid] = td0[lid]; + s_td1[lid] = td1[lid]; + s_td2[lid] = td2[lid]; + s_td3[lid] = td3[lid]; + s_td4[lid] = td4[lid]; + + s_te0[lid] = te0[lid]; + s_te1[lid] = te1[lid]; + s_te2[lid] = te2[lid]; + s_te3[lid] = te3[lid]; + s_te4[lid] = te4[lid]; + + __syncthreads (); + + if (gid >= gid_max) return; + + /** + * real code + */ + + u64 dgst[8]; + + dgst[0] = tmps[gid].dgst[0]; + dgst[1] = tmps[gid].dgst[1]; + dgst[2] = tmps[gid].dgst[2]; + dgst[3] = tmps[gid].dgst[3]; + dgst[4] = tmps[gid].dgst[4]; + dgst[5] = tmps[gid].dgst[5]; + dgst[6] = tmps[gid].dgst[6]; + dgst[7] = tmps[gid].dgst[7]; + + u32x key[8]; + + key[0] = h32_from_64 (dgst[0]); + key[1] = l32_from_64 (dgst[0]); + key[2] = h32_from_64 (dgst[1]); + key[3] = l32_from_64 (dgst[1]); + key[4] = h32_from_64 (dgst[2]); + key[5] = l32_from_64 (dgst[2]); + key[6] = h32_from_64 (dgst[3]); + key[7] = l32_from_64 (dgst[3]); + + u32x iv[4]; + + iv[0] = h32_from_64 (dgst[4]); + iv[1] = l32_from_64 (dgst[4]); + iv[2] = h32_from_64 (dgst[5]); + iv[3] = l32_from_64 (dgst[5]); + + #define KEYLEN 60 + + u32 rk[KEYLEN]; + + AES256_ExpandKey (key, rk, s_te0, s_te1, s_te2, s_te3, s_te4); + + AES256_InvertKey (rk, s_td0, s_td1, s_td2, s_td3, s_td4, s_te0, s_te1, s_te2, s_te3, s_te4); + + u32x out[4]; + + for (u32 i = 0; i < esalt_bufs[salt_pos].cry_master_len; i += 16) + { + u32x data[4]; + + data[0] = swap_workaround (esalt_bufs[salt_pos].cry_master_buf[(i / 4) + 0]); + data[1] = swap_workaround (esalt_bufs[salt_pos].cry_master_buf[(i / 4) + 1]); + data[2] = swap_workaround (esalt_bufs[salt_pos].cry_master_buf[(i / 4) + 2]); + data[3] = swap_workaround (esalt_bufs[salt_pos].cry_master_buf[(i / 4) + 3]); + + AES256_decrypt (data, out, rk, s_td0, s_td1, s_td2, s_td3, s_td4); + + out[0] ^= iv[0]; + out[1] ^= iv[1]; + out[2] ^= iv[2]; + out[3] ^= iv[3]; + + iv[0] = data[0]; + iv[1] = data[1]; + iv[2] = data[2]; + iv[3] = data[3]; + } + + if ((out[0] == 0x10101010) + && (out[1] == 0x10101010) + && (out[2] == 0x10101010) + && (out[3] == 0x10101010)) + { + mark_hash_s0 (plains_buf, hashes_shown, digests_offset + 0, gid, 0); + + d_return_buf[lid] = 1; + } +} diff --git a/nv/m11400_a0.cu b/nv/m11400_a0.cu new file mode 100644 index 0000000000..8ffb01f142 --- /dev/null +++ b/nv/m11400_a0.cu @@ -0,0 +1,2322 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _MD5_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW2 +#define VECT_SIZE1 +#endif + +#define DGST_R0 0 +#define DGST_R1 3 +#define DGST_R2 2 +#define DGST_R3 1 + +#include "include/kernel_functions.c" +#include "types_nv.c" +#include "common_nv.c" +#include "include/rp_gpu.h" +#include "rp_nv.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +#ifdef VECT_SIZE1 +#define uint_to_hex_lower8(i) l_bin2asc[(i)] +#endif + +#ifdef VECT_SIZE2 +#define uint_to_hex_lower8(i) u32x (l_bin2asc[(i).x], l_bin2asc[(i).y]) +#endif + +#ifdef VECT_SIZE4 +#define uint_to_hex_lower8(i) u32x (l_bin2asc[(i).x], l_bin2asc[(i).y], l_bin2asc[(i).z], l_bin2asc[(i).w]) +#endif + +__device__ static u32 memcat32 (u32x block0[16], u32x block1[16], const u32 block_len, const u32x append0[4], const u32x append1[4], const u32x append2[4], const u32x append3[4], const u32 append_len) +{ + const u32 mod = block_len & 3; + const u32 div = block_len / 4; + + const int offset_minus_4 = 4 - mod; + + const int selector = (0x76543210 >> (offset_minus_4 * 4)) & 0xffff; + + u32x append0_t[4]; + + append0_t[0] = __byte_perm ( 0, append0[0], selector); + append0_t[1] = __byte_perm (append0[0], append0[1], selector); + append0_t[2] = __byte_perm (append0[1], append0[2], selector); + append0_t[3] = __byte_perm (append0[2], append0[3], selector); + + u32x append1_t[4]; + + append1_t[0] = __byte_perm (append0[3], append1[0], selector); + append1_t[1] = __byte_perm (append1[0], append1[1], selector); + append1_t[2] = __byte_perm (append1[1], append1[2], selector); + append1_t[3] = __byte_perm (append1[2], append1[3], selector); + + u32x append2_t[4]; + + append2_t[0] = __byte_perm (append1[3], append2[0], selector); + append2_t[1] = __byte_perm (append2[0], append2[1], selector); + append2_t[2] = __byte_perm (append2[1], append2[2], selector); + append2_t[3] = __byte_perm (append2[2], append2[3], selector); + + u32x append3_t[4]; + + append3_t[0] = __byte_perm (append2[3], append3[0], selector); + append3_t[1] = __byte_perm (append3[0], append3[1], selector); + append3_t[2] = __byte_perm (append3[1], append3[2], selector); + append3_t[3] = __byte_perm (append3[2], append3[3], selector); + + u32x append4_t[4]; + + append4_t[0] = __byte_perm (append3[3], 0, selector); + append4_t[1] = 0; + append4_t[2] = 0; + append4_t[3] = 0; + + switch (div) + { + case 0: block0[ 0] |= append0_t[0]; + block0[ 1] = append0_t[1]; + block0[ 2] = append0_t[2]; + block0[ 3] = append0_t[3]; + + block0[ 4] = append1_t[0]; + block0[ 5] = append1_t[1]; + block0[ 6] = append1_t[2]; + block0[ 7] = append1_t[3]; + + block0[ 8] = append2_t[0]; + block0[ 9] = append2_t[1]; + block0[10] = append2_t[2]; + block0[11] = append2_t[3]; + + block0[12] = append3_t[0]; + block0[13] = append3_t[1]; + block0[14] = append3_t[2]; + block0[15] = append3_t[3]; + + block1[ 0] = append4_t[0]; + block1[ 1] = append4_t[1]; + block1[ 2] = append4_t[2]; + block1[ 3] = append4_t[3]; + break; + + case 1: block0[ 1] |= append0_t[0]; + block0[ 2] = append0_t[1]; + block0[ 3] = append0_t[2]; + block0[ 4] = append0_t[3]; + + block0[ 5] = append1_t[0]; + block0[ 6] = append1_t[1]; + block0[ 7] = append1_t[2]; + block0[ 8] = append1_t[3]; + + block0[ 9] = append2_t[0]; + block0[10] = append2_t[1]; + block0[11] = append2_t[2]; + block0[12] = append2_t[3]; + + block0[13] = append3_t[0]; + block0[14] = append3_t[1]; + block0[15] = append3_t[2]; + block1[ 0] = append3_t[3]; + + block1[ 1] = append4_t[0]; + block1[ 2] = append4_t[1]; + block1[ 3] = append4_t[2]; + block1[ 4] = append4_t[3]; + break; + + case 2: block0[ 2] |= append0_t[0]; + block0[ 3] = append0_t[1]; + block0[ 4] = append0_t[2]; + block0[ 5] = append0_t[3]; + + block0[ 6] = append1_t[0]; + block0[ 7] = append1_t[1]; + block0[ 8] = append1_t[2]; + block0[ 9] = append1_t[3]; + + block0[10] = append2_t[0]; + block0[11] = append2_t[1]; + block0[12] = append2_t[2]; + block0[13] = append2_t[3]; + + block0[14] = append3_t[0]; + block0[15] = append3_t[1]; + block1[ 0] = append3_t[2]; + block1[ 1] = append3_t[3]; + + block1[ 2] = append4_t[0]; + block1[ 3] = append4_t[1]; + block1[ 4] = append4_t[2]; + block1[ 5] = append4_t[3]; + break; + + case 3: block0[ 3] |= append0_t[0]; + block0[ 4] = append0_t[1]; + block0[ 5] = append0_t[2]; + block0[ 6] = append0_t[3]; + + block0[ 7] = append1_t[0]; + block0[ 8] = append1_t[1]; + block0[ 9] = append1_t[2]; + block0[10] = append1_t[3]; + + block0[11] = append2_t[0]; + block0[12] = append2_t[1]; + block0[13] = append2_t[2]; + block0[14] = append2_t[3]; + + block0[15] = append3_t[0]; + block1[ 0] = append3_t[1]; + block1[ 1] = append3_t[2]; + block1[ 2] = append3_t[3]; + + block1[ 3] = append4_t[0]; + block1[ 4] = append4_t[1]; + block1[ 5] = append4_t[2]; + block1[ 6] = append4_t[3]; + break; + + case 4: block0[ 4] |= append0_t[0]; + block0[ 5] = append0_t[1]; + block0[ 6] = append0_t[2]; + block0[ 7] = append0_t[3]; + + block0[ 8] = append1_t[0]; + block0[ 9] = append1_t[1]; + block0[10] = append1_t[2]; + block0[11] = append1_t[3]; + + block0[12] = append2_t[0]; + block0[13] = append2_t[1]; + block0[14] = append2_t[2]; + block0[15] = append2_t[3]; + + block1[ 0] = append3_t[0]; + block1[ 1] = append3_t[1]; + block1[ 2] = append3_t[2]; + block1[ 3] = append3_t[3]; + + block1[ 4] = append4_t[0]; + block1[ 5] = append4_t[1]; + block1[ 6] = append4_t[2]; + block1[ 7] = append4_t[3]; + break; + + case 5: block0[ 5] |= append0_t[0]; + block0[ 6] = append0_t[1]; + block0[ 7] = append0_t[2]; + block0[ 8] = append0_t[3]; + + block0[ 9] = append1_t[0]; + block0[10] = append1_t[1]; + block0[11] = append1_t[2]; + block0[12] = append1_t[3]; + + block0[13] = append2_t[0]; + block0[14] = append2_t[1]; + block0[15] = append2_t[2]; + block1[ 0] = append2_t[3]; + + block1[ 1] = append3_t[0]; + block1[ 2] = append3_t[1]; + block1[ 3] = append3_t[2]; + block1[ 4] = append3_t[3]; + + block1[ 5] = append4_t[0]; + block1[ 6] = append4_t[1]; + block1[ 7] = append4_t[2]; + block1[ 8] = append4_t[3]; + break; + + case 6: block0[ 6] |= append0_t[0]; + block0[ 7] = append0_t[1]; + block0[ 8] = append0_t[2]; + block0[ 9] = append0_t[3]; + + block0[10] = append1_t[0]; + block0[11] = append1_t[1]; + block0[12] = append1_t[2]; + block0[13] = append1_t[3]; + + block0[14] = append2_t[0]; + block0[15] = append2_t[1]; + block1[ 0] = append2_t[2]; + block1[ 1] = append2_t[3]; + + block1[ 2] = append3_t[0]; + block1[ 3] = append3_t[1]; + block1[ 4] = append3_t[2]; + block1[ 5] = append3_t[3]; + + block1[ 6] = append4_t[0]; + block1[ 7] = append4_t[1]; + block1[ 8] = append4_t[2]; + block1[ 9] = append4_t[3]; + break; + + case 7: block0[ 7] |= append0_t[0]; + block0[ 8] = append0_t[1]; + block0[ 9] = append0_t[2]; + block0[10] = append0_t[3]; + + block0[11] = append1_t[0]; + block0[12] = append1_t[1]; + block0[13] = append1_t[2]; + block0[14] = append1_t[3]; + + block0[15] = append2_t[0]; + block1[ 0] = append2_t[1]; + block1[ 1] = append2_t[2]; + block1[ 2] = append2_t[3]; + + block1[ 3] = append3_t[0]; + block1[ 4] = append3_t[1]; + block1[ 5] = append3_t[2]; + block1[ 6] = append3_t[3]; + + block1[ 7] = append4_t[0]; + block1[ 8] = append4_t[1]; + block1[ 9] = append4_t[2]; + block1[10] = append4_t[3]; + break; + + case 8: block0[ 8] |= append0_t[0]; + block0[ 9] = append0_t[1]; + block0[10] = append0_t[2]; + block0[11] = append0_t[3]; + + block0[12] = append1_t[0]; + block0[13] = append1_t[1]; + block0[14] = append1_t[2]; + block0[15] = append1_t[3]; + + block1[ 0] = append2_t[0]; + block1[ 1] = append2_t[1]; + block1[ 2] = append2_t[2]; + block1[ 3] = append2_t[3]; + + block1[ 4] = append3_t[0]; + block1[ 5] = append3_t[1]; + block1[ 6] = append3_t[2]; + block1[ 7] = append3_t[3]; + + block1[ 8] = append4_t[0]; + block1[ 9] = append4_t[1]; + block1[10] = append4_t[2]; + block1[11] = append4_t[3]; + break; + + case 9: block0[ 9] |= append0_t[0]; + block0[10] = append0_t[1]; + block0[11] = append0_t[2]; + block0[12] = append0_t[3]; + + block0[13] = append1_t[0]; + block0[14] = append1_t[1]; + block0[15] = append1_t[2]; + block1[ 0] = append1_t[3]; + + block1[ 1] = append2_t[0]; + block1[ 2] = append2_t[1]; + block1[ 3] = append2_t[2]; + block1[ 4] = append2_t[3]; + + block1[ 5] = append3_t[0]; + block1[ 6] = append3_t[1]; + block1[ 7] = append3_t[2]; + block1[ 8] = append3_t[3]; + + block1[ 9] = append4_t[0]; + block1[10] = append4_t[1]; + block1[11] = append4_t[2]; + block1[12] = append4_t[3]; + break; + + case 10: block0[10] |= append0_t[0]; + block0[11] = append0_t[1]; + block0[12] = append0_t[2]; + block0[13] = append0_t[3]; + + block0[14] = append1_t[0]; + block0[15] = append1_t[1]; + block1[ 0] = append1_t[2]; + block1[ 1] = append1_t[3]; + + block1[ 2] = append2_t[0]; + block1[ 3] = append2_t[1]; + block1[ 4] = append2_t[2]; + block1[ 5] = append2_t[3]; + + block1[ 6] = append3_t[0]; + block1[ 7] = append3_t[1]; + block1[ 8] = append3_t[2]; + block1[ 9] = append3_t[3]; + + block1[10] = append4_t[0]; + block1[11] = append4_t[1]; + block1[12] = append4_t[2]; + block1[13] = append4_t[3]; + break; + + case 11: block0[11] |= append0_t[0]; + block0[12] = append0_t[1]; + block0[13] = append0_t[2]; + block0[14] = append0_t[3]; + + block0[15] = append1_t[0]; + block1[ 0] = append1_t[1]; + block1[ 1] = append1_t[2]; + block1[ 2] = append1_t[3]; + + block1[ 3] = append2_t[0]; + block1[ 4] = append2_t[1]; + block1[ 5] = append2_t[2]; + block1[ 6] = append2_t[3]; + + block1[ 7] = append3_t[0]; + block1[ 8] = append3_t[1]; + block1[ 9] = append3_t[2]; + block1[10] = append3_t[3]; + + block1[11] = append4_t[0]; + block1[12] = append4_t[1]; + block1[13] = append4_t[2]; + block1[14] = append4_t[3]; + break; + + case 12: block0[12] |= append0_t[0]; + block0[13] = append0_t[1]; + block0[14] = append0_t[2]; + block0[15] = append0_t[3]; + + block1[ 0] = append1_t[0]; + block1[ 1] = append1_t[1]; + block1[ 2] = append1_t[2]; + block1[ 3] = append1_t[3]; + + block1[ 4] = append2_t[0]; + block1[ 5] = append2_t[1]; + block1[ 6] = append2_t[2]; + block1[ 7] = append2_t[3]; + + block1[ 8] = append3_t[0]; + block1[ 9] = append3_t[1]; + block1[10] = append3_t[2]; + block1[11] = append3_t[3]; + + block1[12] = append4_t[0]; + block1[13] = append4_t[1]; + block1[14] = append4_t[2]; + block1[15] = append4_t[3]; + break; + + case 13: block0[13] |= append0_t[0]; + block0[14] = append0_t[1]; + block0[15] = append0_t[2]; + block1[ 0] = append0_t[3]; + + block1[ 1] = append1_t[0]; + block1[ 2] = append1_t[1]; + block1[ 3] = append1_t[2]; + block1[ 4] = append1_t[3]; + + block1[ 5] = append2_t[0]; + block1[ 6] = append2_t[1]; + block1[ 7] = append2_t[2]; + block1[ 8] = append2_t[3]; + + block1[ 9] = append3_t[0]; + block1[10] = append3_t[1]; + block1[11] = append3_t[2]; + block1[12] = append3_t[3]; + + block1[13] = append4_t[0]; + block1[14] = append4_t[1]; + block1[15] = append4_t[2]; + break; + + case 14: block0[14] |= append0_t[0]; + block0[15] = append0_t[1]; + block1[ 0] = append0_t[2]; + block1[ 1] = append0_t[3]; + + block1[ 2] = append1_t[0]; + block1[ 3] = append1_t[1]; + block1[ 4] = append1_t[2]; + block1[ 5] = append1_t[3]; + + block1[ 6] = append2_t[0]; + block1[ 7] = append2_t[1]; + block1[ 8] = append2_t[2]; + block1[ 9] = append2_t[3]; + + block1[10] = append3_t[0]; + block1[11] = append3_t[1]; + block1[12] = append3_t[2]; + block1[13] = append3_t[3]; + + block1[14] = append4_t[0]; + block1[15] = append4_t[1]; + break; + + case 15: block0[15] |= append0_t[0]; + block1[ 0] = append0_t[1]; + block1[ 1] = append0_t[2]; + block1[ 2] = append0_t[3]; + + block1[ 3] = append1_t[1]; + block1[ 4] = append1_t[2]; + block1[ 5] = append1_t[3]; + block1[ 6] = append1_t[0]; + + block1[ 7] = append2_t[0]; + block1[ 8] = append2_t[1]; + block1[ 9] = append2_t[2]; + block1[10] = append2_t[3]; + + block1[11] = append3_t[0]; + block1[12] = append3_t[1]; + block1[13] = append3_t[2]; + block1[14] = append3_t[3]; + + block1[15] = append4_t[0]; + break; + + case 16: block1[ 0] |= append0_t[0]; + block1[ 1] = append0_t[1]; + block1[ 2] = append0_t[2]; + block1[ 3] = append0_t[3]; + + block1[ 4] = append1_t[0]; + block1[ 5] = append1_t[1]; + block1[ 6] = append1_t[2]; + block1[ 7] = append1_t[3]; + + block1[ 8] = append2_t[0]; + block1[ 9] = append2_t[1]; + block1[10] = append2_t[2]; + block1[11] = append2_t[3]; + + block1[12] = append3_t[0]; + block1[13] = append3_t[1]; + block1[14] = append3_t[2]; + block1[15] = append3_t[3]; + break; + + case 17: block1[ 1] |= append0_t[0]; + block1[ 2] = append0_t[1]; + block1[ 3] = append0_t[2]; + block1[ 4] = append0_t[3]; + + block1[ 5] = append1_t[0]; + block1[ 6] = append1_t[1]; + block1[ 7] = append1_t[2]; + block1[ 8] = append1_t[3]; + + block1[ 9] = append2_t[0]; + block1[10] = append2_t[1]; + block1[11] = append2_t[2]; + block1[12] = append2_t[3]; + + block1[13] = append3_t[0]; + block1[14] = append3_t[1]; + block1[15] = append3_t[2]; + break; + + case 18: block1[ 2] |= append0_t[0]; + block1[ 3] = append0_t[1]; + block1[ 4] = append0_t[2]; + block1[ 5] = append0_t[3]; + + block1[ 6] = append1_t[0]; + block1[ 7] = append1_t[1]; + block1[ 8] = append1_t[2]; + block1[ 9] = append1_t[3]; + + block1[10] = append2_t[0]; + block1[11] = append2_t[1]; + block1[12] = append2_t[2]; + block1[13] = append2_t[3]; + + block1[14] = append3_t[0]; + block1[15] = append3_t[1]; + break; + + case 19: block1[ 3] |= append0_t[0]; + block1[ 4] = append0_t[1]; + block1[ 5] = append0_t[2]; + block1[ 6] = append0_t[3]; + + block1[ 7] = append1_t[0]; + block1[ 8] = append1_t[1]; + block1[ 9] = append1_t[2]; + block1[10] = append1_t[3]; + + block1[11] = append2_t[0]; + block1[12] = append2_t[1]; + block1[13] = append2_t[2]; + block1[14] = append2_t[3]; + + block1[15] = append3_t[0]; + break; + + case 20: block1[ 4] |= append0_t[0]; + block1[ 5] = append0_t[1]; + block1[ 6] = append0_t[2]; + block1[ 7] = append0_t[3]; + + block1[ 8] = append1_t[0]; + block1[ 9] = append1_t[1]; + block1[10] = append1_t[2]; + block1[11] = append1_t[3]; + + block1[12] = append2_t[0]; + block1[13] = append2_t[1]; + block1[14] = append2_t[2]; + block1[15] = append2_t[3]; + break; + + case 21: block1[ 5] |= append0_t[0]; + block1[ 6] = append0_t[1]; + block1[ 7] = append0_t[2]; + block1[ 8] = append0_t[3]; + + block1[ 9] = append1_t[0]; + block1[10] = append1_t[1]; + block1[11] = append1_t[2]; + block1[12] = append1_t[3]; + + block1[13] = append2_t[0]; + block1[14] = append2_t[1]; + block1[15] = append2_t[2]; + break; + + case 22: block1[ 6] |= append0_t[0]; + block1[ 7] = append0_t[1]; + block1[ 8] = append0_t[2]; + block1[ 9] = append0_t[3]; + + block1[10] = append1_t[0]; + block1[11] = append1_t[1]; + block1[12] = append1_t[2]; + block1[13] = append1_t[3]; + + block1[14] = append2_t[0]; + block1[15] = append2_t[1]; + break; + + case 23: block1[ 7] |= append0_t[0]; + block1[ 8] = append0_t[1]; + block1[ 9] = append0_t[2]; + block1[10] = append0_t[3]; + + block1[11] = append1_t[0]; + block1[12] = append1_t[1]; + block1[13] = append1_t[2]; + block1[14] = append1_t[3]; + + block1[15] = append2_t[0]; + break; + + case 24: block1[ 8] |= append0_t[0]; + block1[ 9] = append0_t[1]; + block1[10] = append0_t[2]; + block1[11] = append0_t[3]; + + block1[12] = append1_t[0]; + block1[13] = append1_t[1]; + block1[14] = append1_t[2]; + block1[15] = append1_t[3]; + break; + + case 25: block1[ 9] |= append0_t[0]; + block1[10] = append0_t[1]; + block1[11] = append0_t[2]; + block1[12] = append0_t[3]; + + block1[13] = append1_t[0]; + block1[14] = append1_t[1]; + block1[15] = append1_t[2]; + break; + + case 26: block1[10] |= append0_t[0]; + block1[11] = append0_t[1]; + block1[12] = append0_t[2]; + block1[13] = append0_t[3]; + + block1[14] = append1_t[0]; + block1[15] = append1_t[1]; + break; + + case 27: block1[11] |= append0_t[0]; + block1[12] = append0_t[1]; + block1[13] = append0_t[2]; + block1[14] = append0_t[3]; + + block1[15] = append1_t[0]; + break; + + case 28: block1[12] |= append0_t[0]; + block1[13] = append0_t[1]; + block1[14] = append0_t[2]; + block1[15] = append0_t[3]; + break; + + case 29: block1[13] |= append0_t[0]; + block1[14] = append0_t[1]; + block1[15] = append0_t[2]; + break; + + case 30: block1[14] |= append0_t[0]; + block1[15] = append0_t[1]; + break; + } + + u32 new_len = block_len + append_len; + + return new_len; +} + +__device__ __constant__ char c_bin2asc[16] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' }; + +__device__ __shared__ short l_bin2asc[256]; + +__device__ __constant__ gpu_rule_t c_rules[1024]; + +extern "C" __global__ void __launch_bounds__ (256, 1) m11400_m04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const sip_t *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + u32x pw_buf1[4]; + + pw_buf1[0] = pws[gid].i[ 4]; + pw_buf1[1] = pws[gid].i[ 5]; + pw_buf1[2] = pws[gid].i[ 6]; + pw_buf1[3] = pws[gid].i[ 7]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * bin2asc table + */ + + l_bin2asc[lid] = c_bin2asc[(lid >> 0) & 15] << 8 + | c_bin2asc[(lid >> 4) & 15] << 0; + + __syncthreads (); + + if (gid >= gid_max) return; + + /** + * salt + */ + + const u32 salt_len = esalt_bufs[salt_pos].salt_len; // not a bug, we need to get it from the esalt + + u32 salt_buf0[16]; + + salt_buf0[ 0] = esalt_bufs[salt_pos].salt_buf[ 0]; + salt_buf0[ 1] = esalt_bufs[salt_pos].salt_buf[ 1]; + salt_buf0[ 2] = esalt_bufs[salt_pos].salt_buf[ 2]; + salt_buf0[ 3] = esalt_bufs[salt_pos].salt_buf[ 3]; + salt_buf0[ 4] = esalt_bufs[salt_pos].salt_buf[ 4]; + salt_buf0[ 5] = esalt_bufs[salt_pos].salt_buf[ 5]; + salt_buf0[ 6] = esalt_bufs[salt_pos].salt_buf[ 6]; + salt_buf0[ 7] = esalt_bufs[salt_pos].salt_buf[ 7]; + salt_buf0[ 8] = esalt_bufs[salt_pos].salt_buf[ 8]; + salt_buf0[ 9] = esalt_bufs[salt_pos].salt_buf[ 9]; + salt_buf0[10] = esalt_bufs[salt_pos].salt_buf[10]; + salt_buf0[11] = esalt_bufs[salt_pos].salt_buf[11]; + salt_buf0[12] = esalt_bufs[salt_pos].salt_buf[12]; + salt_buf0[13] = esalt_bufs[salt_pos].salt_buf[13]; + salt_buf0[14] = esalt_bufs[salt_pos].salt_buf[14]; + salt_buf0[15] = esalt_bufs[salt_pos].salt_buf[15]; + + u32 salt_buf1[16]; + + salt_buf1[ 0] = esalt_bufs[salt_pos].salt_buf[16]; + salt_buf1[ 1] = esalt_bufs[salt_pos].salt_buf[17]; + salt_buf1[ 2] = esalt_bufs[salt_pos].salt_buf[18]; + salt_buf1[ 3] = esalt_bufs[salt_pos].salt_buf[19]; + salt_buf1[ 4] = esalt_bufs[salt_pos].salt_buf[20]; + salt_buf1[ 5] = esalt_bufs[salt_pos].salt_buf[21]; + salt_buf1[ 6] = esalt_bufs[salt_pos].salt_buf[22]; + salt_buf1[ 7] = esalt_bufs[salt_pos].salt_buf[23]; + salt_buf1[ 8] = esalt_bufs[salt_pos].salt_buf[24]; + salt_buf1[ 9] = esalt_bufs[salt_pos].salt_buf[25]; + salt_buf1[10] = esalt_bufs[salt_pos].salt_buf[26]; + salt_buf1[11] = esalt_bufs[salt_pos].salt_buf[27]; + salt_buf1[12] = esalt_bufs[salt_pos].salt_buf[28]; + salt_buf1[13] = esalt_bufs[salt_pos].salt_buf[29]; + salt_buf1[14] = 0; + salt_buf1[15] = 0; + + /** + * esalt + */ + + const u32 esalt_len = esalt_bufs[salt_pos].esalt_len; + + u32 esalt_buf0[16]; + + esalt_buf0[ 0] = esalt_bufs[salt_pos].esalt_buf[ 0]; + esalt_buf0[ 1] = esalt_bufs[salt_pos].esalt_buf[ 1]; + esalt_buf0[ 2] = esalt_bufs[salt_pos].esalt_buf[ 2]; + esalt_buf0[ 3] = esalt_bufs[salt_pos].esalt_buf[ 3]; + esalt_buf0[ 4] = esalt_bufs[salt_pos].esalt_buf[ 4]; + esalt_buf0[ 5] = esalt_bufs[salt_pos].esalt_buf[ 5]; + esalt_buf0[ 6] = esalt_bufs[salt_pos].esalt_buf[ 6]; + esalt_buf0[ 7] = esalt_bufs[salt_pos].esalt_buf[ 7]; + esalt_buf0[ 8] = esalt_bufs[salt_pos].esalt_buf[ 8]; + esalt_buf0[ 9] = esalt_bufs[salt_pos].esalt_buf[ 9]; + esalt_buf0[10] = esalt_bufs[salt_pos].esalt_buf[10]; + esalt_buf0[11] = esalt_bufs[salt_pos].esalt_buf[11]; + esalt_buf0[12] = esalt_bufs[salt_pos].esalt_buf[12]; + esalt_buf0[13] = esalt_bufs[salt_pos].esalt_buf[13]; + esalt_buf0[14] = esalt_bufs[salt_pos].esalt_buf[14]; + esalt_buf0[15] = esalt_bufs[salt_pos].esalt_buf[15]; + + u32 esalt_buf1[16]; + + esalt_buf1[ 0] = esalt_bufs[salt_pos].esalt_buf[16]; + esalt_buf1[ 1] = esalt_bufs[salt_pos].esalt_buf[17]; + esalt_buf1[ 2] = esalt_bufs[salt_pos].esalt_buf[18]; + esalt_buf1[ 3] = esalt_bufs[salt_pos].esalt_buf[19]; + esalt_buf1[ 4] = esalt_bufs[salt_pos].esalt_buf[20]; + esalt_buf1[ 5] = esalt_bufs[salt_pos].esalt_buf[21]; + esalt_buf1[ 6] = esalt_bufs[salt_pos].esalt_buf[22]; + esalt_buf1[ 7] = esalt_bufs[salt_pos].esalt_buf[23]; + esalt_buf1[ 8] = esalt_bufs[salt_pos].esalt_buf[24]; + esalt_buf1[ 9] = esalt_bufs[salt_pos].esalt_buf[25]; + esalt_buf1[10] = esalt_bufs[salt_pos].esalt_buf[26]; + esalt_buf1[11] = esalt_bufs[salt_pos].esalt_buf[27]; + esalt_buf1[12] = esalt_bufs[salt_pos].esalt_buf[28]; + esalt_buf1[13] = esalt_bufs[salt_pos].esalt_buf[29]; + esalt_buf1[14] = esalt_bufs[salt_pos].esalt_buf[30]; + esalt_buf1[15] = esalt_bufs[salt_pos].esalt_buf[31]; + + u32 esalt_buf2[16]; + + esalt_buf2[ 0] = esalt_bufs[salt_pos].esalt_buf[32]; + esalt_buf2[ 1] = esalt_bufs[salt_pos].esalt_buf[33]; + esalt_buf2[ 2] = esalt_bufs[salt_pos].esalt_buf[34]; + esalt_buf2[ 3] = esalt_bufs[salt_pos].esalt_buf[35]; + esalt_buf2[ 4] = esalt_bufs[salt_pos].esalt_buf[36]; + esalt_buf2[ 5] = esalt_bufs[salt_pos].esalt_buf[37]; + esalt_buf2[ 6] = 0; + esalt_buf2[ 7] = 0; + esalt_buf2[ 8] = 0; + esalt_buf2[ 9] = 0; + esalt_buf2[10] = 0; + esalt_buf2[11] = 0; + esalt_buf2[12] = 0; + esalt_buf2[13] = 0; + esalt_buf2[14] = 0; + esalt_buf2[15] = 0; + + const u32 digest_esalt_len = 32 + esalt_len; + const u32 remaining_bytes = digest_esalt_len + 1 - 64; // substract previous block + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + + w0[0] = pw_buf0[0]; + w0[1] = pw_buf0[1]; + w0[2] = pw_buf0[2]; + w0[3] = pw_buf0[3]; + + u32x w1[4]; + + w1[0] = pw_buf1[0]; + w1[1] = pw_buf1[1]; + w1[2] = pw_buf1[2]; + w1[3] = pw_buf1[3]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 out_len = apply_rules (c_rules[il_pos].cmds, w0, w1, pw_len); + + append_0x80_2 (w0, w1, out_len); + + const u32 pw_salt_len = salt_len + out_len; + + /* + * HA1 = md5 ($salt . $pass) + */ + + // append the pass to the salt + + u32x block0[16]; + + block0[ 0] = salt_buf0[ 0]; + block0[ 1] = salt_buf0[ 1]; + block0[ 2] = salt_buf0[ 2]; + block0[ 3] = salt_buf0[ 3]; + block0[ 4] = salt_buf0[ 4]; + block0[ 5] = salt_buf0[ 5]; + block0[ 6] = salt_buf0[ 6]; + block0[ 7] = salt_buf0[ 7]; + block0[ 8] = salt_buf0[ 8]; + block0[ 9] = salt_buf0[ 9]; + block0[10] = salt_buf0[10]; + block0[11] = salt_buf0[11]; + block0[12] = salt_buf0[12]; + block0[13] = salt_buf0[13]; + block0[14] = salt_buf0[14]; + block0[15] = salt_buf0[15]; + + u32x block1[16]; + + block1[ 0] = salt_buf1[ 0]; + block1[ 1] = salt_buf1[ 1]; + block1[ 2] = salt_buf1[ 2]; + block1[ 3] = salt_buf1[ 3]; + block1[ 4] = salt_buf1[ 4]; + block1[ 5] = salt_buf1[ 5]; + block1[ 6] = salt_buf1[ 6]; + block1[ 7] = salt_buf1[ 7]; + block1[ 8] = salt_buf1[ 8]; + block1[ 9] = salt_buf1[ 9]; + block1[10] = salt_buf1[10]; + block1[11] = salt_buf1[11]; + block1[12] = salt_buf1[12]; + block1[13] = salt_buf1[13]; + block1[14] = salt_buf1[14]; + block1[15] = salt_buf1[15]; + + u32 block_len = 0; + + block_len = memcat32 (block0, block1, salt_len, w0, w1, w2, w3, out_len); + + u32x w0_t[4]; + + w0_t[0] = block0[ 0]; + w0_t[1] = block0[ 1]; + w0_t[2] = block0[ 2]; + w0_t[3] = block0[ 3]; + + u32x w1_t[4]; + + w1_t[0] = block0[ 4]; + w1_t[1] = block0[ 5]; + w1_t[2] = block0[ 6]; + w1_t[3] = block0[ 7]; + + u32x w2_t[4]; + + w2_t[0] = block0[ 8]; + w2_t[1] = block0[ 9]; + w2_t[2] = block0[10]; + w2_t[3] = block0[11]; + + u32x w3_t[4]; + + w3_t[0] = block0[12]; + w3_t[1] = block0[13]; + w3_t[2] = block0[14]; + w3_t[3] = block0[15]; + + if (block_len < 56) + { + w3_t[2] = pw_salt_len * 8; + } + + // md5 + + u32x tmp2; + + u32x a = MD5M_A; + u32x b = MD5M_B; + u32x c = MD5M_C; + u32x d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0_t[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0_t[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0_t[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1_t[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1_t[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1_t[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2_t[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2_t[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2_t[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3_t[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3_t[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3_t[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0_t[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1_t[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2_t[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1_t[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1_t[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2_t[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3_t[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0_t[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2_t[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3_t[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0_t[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1_t[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3_t[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H1, a, b, c, d, w1_t[1], MD5C20, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w2_t[0], MD5C21, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w2_t[3], MD5C22, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w3_t[2], MD5C23, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w0_t[1], MD5C24, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w1_t[0], MD5C25, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w1_t[3], MD5C26, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w2_t[2], MD5C27, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w3_t[1], MD5C28, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w0_t[0], MD5C29, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w0_t[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w1_t[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w2_t[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w3_t[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w3_t[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w0_t[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1_t[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3_t[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3_t[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0_t[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0_t[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2_t[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1_t[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3_t[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1_t[0], MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w2_t[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0_t[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2_t[1], MD5C3f, MD5S33); + + a += MD5M_A; + b += MD5M_B; + c += MD5M_C; + d += MD5M_D; + + if (block_len > 55) + { + u32x r_a = a; + u32x r_b = b; + u32x r_c = c; + u32x r_d = d; + + w0_t[0] = block1[ 0]; + w0_t[1] = block1[ 1]; + w0_t[2] = block1[ 2]; + w0_t[3] = block1[ 3]; + + w1_t[0] = block1[ 4]; + w1_t[1] = block1[ 5]; + w1_t[2] = block1[ 6]; + w1_t[3] = block1[ 7]; + + w2_t[0] = block1[ 8]; + w2_t[1] = block1[ 9]; + w2_t[2] = block1[10]; + w2_t[3] = block1[11]; + + w3_t[0] = block1[12]; + w3_t[1] = block1[13]; + w3_t[2] = pw_salt_len * 8; + w3_t[3] = 0; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0_t[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0_t[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0_t[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1_t[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1_t[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1_t[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2_t[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2_t[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2_t[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3_t[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3_t[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3_t[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0_t[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1_t[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2_t[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1_t[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1_t[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2_t[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3_t[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0_t[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2_t[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3_t[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0_t[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1_t[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3_t[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H1, a, b, c, d, w1_t[1], MD5C20, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w2_t[0], MD5C21, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w2_t[3], MD5C22, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w3_t[2], MD5C23, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w0_t[1], MD5C24, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w1_t[0], MD5C25, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w1_t[3], MD5C26, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w2_t[2], MD5C27, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w3_t[1], MD5C28, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w0_t[0], MD5C29, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w0_t[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w1_t[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w2_t[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w3_t[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w3_t[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w0_t[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1_t[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3_t[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3_t[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0_t[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0_t[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2_t[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1_t[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3_t[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1_t[0], MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w2_t[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0_t[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2_t[1], MD5C3f, MD5S33); + + a += r_a; + b += r_b; + c += r_c; + d += r_d; + } + + /* + * final = md5 ($HA1 . $esalt) + * we have at least 2 MD5 blocks/transformations, but we might need 3 + */ + + w0_t[0] = uint_to_hex_lower8 ((a >> 0) & 255) << 0 + | uint_to_hex_lower8 ((a >> 8) & 255) << 16; + w0_t[1] = uint_to_hex_lower8 ((a >> 16) & 255) << 0 + | uint_to_hex_lower8 ((a >> 24) & 255) << 16; + w0_t[2] = uint_to_hex_lower8 ((b >> 0) & 255) << 0 + | uint_to_hex_lower8 ((b >> 8) & 255) << 16; + w0_t[3] = uint_to_hex_lower8 ((b >> 16) & 255) << 0 + | uint_to_hex_lower8 ((b >> 24) & 255) << 16; + w1_t[0] = uint_to_hex_lower8 ((c >> 0) & 255) << 0 + | uint_to_hex_lower8 ((c >> 8) & 255) << 16; + w1_t[1] = uint_to_hex_lower8 ((c >> 16) & 255) << 0 + | uint_to_hex_lower8 ((c >> 24) & 255) << 16; + w1_t[2] = uint_to_hex_lower8 ((d >> 0) & 255) << 0 + | uint_to_hex_lower8 ((d >> 8) & 255) << 16; + w1_t[3] = uint_to_hex_lower8 ((d >> 16) & 255) << 0 + | uint_to_hex_lower8 ((d >> 24) & 255) << 16; + + w2_t[0] = esalt_buf0[0]; + w2_t[1] = esalt_buf0[1]; + w2_t[2] = esalt_buf0[2]; + w2_t[3] = esalt_buf0[3]; + + w3_t[0] = esalt_buf0[4]; + w3_t[1] = esalt_buf0[5]; + w3_t[2] = esalt_buf0[6]; + w3_t[3] = esalt_buf0[7]; + + // md5 + // 1st transform + + a = MD5M_A; + b = MD5M_B; + c = MD5M_C; + d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0_t[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0_t[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0_t[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1_t[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1_t[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1_t[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2_t[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2_t[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2_t[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3_t[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3_t[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3_t[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0_t[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1_t[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2_t[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1_t[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1_t[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2_t[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3_t[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0_t[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2_t[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3_t[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0_t[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1_t[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3_t[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H1, a, b, c, d, w1_t[1], MD5C20, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w2_t[0], MD5C21, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w2_t[3], MD5C22, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w3_t[2], MD5C23, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w0_t[1], MD5C24, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w1_t[0], MD5C25, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w1_t[3], MD5C26, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w2_t[2], MD5C27, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w3_t[1], MD5C28, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w0_t[0], MD5C29, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w0_t[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w1_t[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w2_t[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w3_t[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w3_t[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w0_t[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1_t[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3_t[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3_t[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0_t[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0_t[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2_t[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1_t[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3_t[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1_t[0], MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w2_t[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0_t[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2_t[1], MD5C3f, MD5S33); + + a += MD5M_A; + b += MD5M_B; + c += MD5M_C; + d += MD5M_D; + + u32x r_a = a; + u32x r_b = b; + u32x r_c = c; + u32x r_d = d; + + // 2nd transform + + w0_t[0] = esalt_buf0[ 8]; + w0_t[1] = esalt_buf0[ 9]; + w0_t[2] = esalt_buf0[10]; + w0_t[3] = esalt_buf0[11]; + + w1_t[0] = esalt_buf0[12]; + w1_t[1] = esalt_buf0[13]; + w1_t[2] = esalt_buf0[14]; + w1_t[3] = esalt_buf0[15]; + + w2_t[0] = esalt_buf1[ 0]; + w2_t[1] = esalt_buf1[ 1]; + w2_t[2] = esalt_buf1[ 2]; + w2_t[3] = esalt_buf1[ 3]; + + w3_t[0] = esalt_buf1[ 4]; + w3_t[1] = esalt_buf1[ 5]; + w3_t[2] = esalt_buf1[ 6]; + w3_t[3] = esalt_buf1[ 7]; + + // it is the final block when no more than 55 bytes left + + if (remaining_bytes < 56) + { + // it is the last block ! + + w3_t[2] = digest_esalt_len * 8; + } + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0_t[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0_t[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0_t[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1_t[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1_t[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1_t[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2_t[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2_t[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2_t[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3_t[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3_t[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3_t[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0_t[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1_t[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2_t[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1_t[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1_t[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2_t[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3_t[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0_t[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2_t[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3_t[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0_t[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1_t[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3_t[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H1, a, b, c, d, w1_t[1], MD5C20, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w2_t[0], MD5C21, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w2_t[3], MD5C22, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w3_t[2], MD5C23, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w0_t[1], MD5C24, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w1_t[0], MD5C25, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w1_t[3], MD5C26, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w2_t[2], MD5C27, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w3_t[1], MD5C28, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w0_t[0], MD5C29, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w0_t[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w1_t[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w2_t[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w3_t[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w3_t[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w0_t[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1_t[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3_t[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3_t[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0_t[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0_t[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2_t[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1_t[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3_t[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1_t[0], MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w2_t[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0_t[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2_t[1], MD5C3f, MD5S33); + + // sometimes (not rare at all) we need a third block :( + + if (remaining_bytes > 55) + { + // this is for sure the final block + + a += r_a; + b += r_b; + c += r_c; + d += r_d; + + r_a = a; + r_b = b; + r_c = c; + r_d = d; + + w0_t[0] = esalt_buf1[ 8]; + w0_t[1] = esalt_buf1[ 9]; + w0_t[2] = esalt_buf1[10]; + w0_t[3] = esalt_buf1[11]; + + w1_t[0] = esalt_buf1[12]; + w1_t[1] = esalt_buf1[13]; + w1_t[2] = esalt_buf1[14]; + w1_t[3] = esalt_buf1[15]; + + w2_t[0] = esalt_buf2[ 0]; + w2_t[1] = esalt_buf2[ 1]; + w2_t[2] = esalt_buf2[ 2]; + w2_t[3] = esalt_buf2[ 3]; + + w3_t[0] = esalt_buf2[ 4]; + w3_t[1] = esalt_buf2[ 5]; + w3_t[2] = digest_esalt_len * 8; + w3_t[3] = 0; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0_t[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0_t[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0_t[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1_t[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1_t[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1_t[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2_t[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2_t[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2_t[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3_t[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3_t[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3_t[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0_t[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1_t[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2_t[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1_t[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1_t[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2_t[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3_t[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0_t[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2_t[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3_t[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0_t[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1_t[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3_t[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H1, a, b, c, d, w1_t[1], MD5C20, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w2_t[0], MD5C21, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w2_t[3], MD5C22, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w3_t[2], MD5C23, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w0_t[1], MD5C24, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w1_t[0], MD5C25, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w1_t[3], MD5C26, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w2_t[2], MD5C27, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w3_t[1], MD5C28, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w0_t[0], MD5C29, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w0_t[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w1_t[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w2_t[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w3_t[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w3_t[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w0_t[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1_t[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3_t[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3_t[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0_t[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0_t[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2_t[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1_t[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3_t[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1_t[0], MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w2_t[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0_t[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2_t[1], MD5C3f, MD5S33); + } + + a += r_a; + b += r_b; + c += r_c; + d += r_d; + + const u32x r0 = a; + const u32x r1 = d; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_M + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m11400_m08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const sip_t *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m11400_m16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const sip_t *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m11400_s04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const sip_t *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + u32x pw_buf1[4]; + + pw_buf1[0] = pws[gid].i[ 4]; + pw_buf1[1] = pws[gid].i[ 5]; + pw_buf1[2] = pws[gid].i[ 6]; + pw_buf1[3] = pws[gid].i[ 7]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * bin2asc table + */ + + l_bin2asc[lid] = c_bin2asc[(lid >> 0) & 15] << 8 + | c_bin2asc[(lid >> 4) & 15] << 0; + + __syncthreads (); + + if (gid >= gid_max) return; + + /** + * salt + */ + + const u32 salt_len = esalt_bufs[salt_pos].salt_len; // not a bug, we need to get it from the esalt + + u32 salt_buf0[16]; + + salt_buf0[ 0] = esalt_bufs[salt_pos].salt_buf[ 0]; + salt_buf0[ 1] = esalt_bufs[salt_pos].salt_buf[ 1]; + salt_buf0[ 2] = esalt_bufs[salt_pos].salt_buf[ 2]; + salt_buf0[ 3] = esalt_bufs[salt_pos].salt_buf[ 3]; + salt_buf0[ 4] = esalt_bufs[salt_pos].salt_buf[ 4]; + salt_buf0[ 5] = esalt_bufs[salt_pos].salt_buf[ 5]; + salt_buf0[ 6] = esalt_bufs[salt_pos].salt_buf[ 6]; + salt_buf0[ 7] = esalt_bufs[salt_pos].salt_buf[ 7]; + salt_buf0[ 8] = esalt_bufs[salt_pos].salt_buf[ 8]; + salt_buf0[ 9] = esalt_bufs[salt_pos].salt_buf[ 9]; + salt_buf0[10] = esalt_bufs[salt_pos].salt_buf[10]; + salt_buf0[11] = esalt_bufs[salt_pos].salt_buf[11]; + salt_buf0[12] = esalt_bufs[salt_pos].salt_buf[12]; + salt_buf0[13] = esalt_bufs[salt_pos].salt_buf[13]; + salt_buf0[14] = esalt_bufs[salt_pos].salt_buf[14]; + salt_buf0[15] = esalt_bufs[salt_pos].salt_buf[15]; + + u32 salt_buf1[16]; + + salt_buf1[ 0] = esalt_bufs[salt_pos].salt_buf[16]; + salt_buf1[ 1] = esalt_bufs[salt_pos].salt_buf[17]; + salt_buf1[ 2] = esalt_bufs[salt_pos].salt_buf[18]; + salt_buf1[ 3] = esalt_bufs[salt_pos].salt_buf[19]; + salt_buf1[ 4] = esalt_bufs[salt_pos].salt_buf[20]; + salt_buf1[ 5] = esalt_bufs[salt_pos].salt_buf[21]; + salt_buf1[ 6] = esalt_bufs[salt_pos].salt_buf[22]; + salt_buf1[ 7] = esalt_bufs[salt_pos].salt_buf[23]; + salt_buf1[ 8] = esalt_bufs[salt_pos].salt_buf[24]; + salt_buf1[ 9] = esalt_bufs[salt_pos].salt_buf[25]; + salt_buf1[10] = esalt_bufs[salt_pos].salt_buf[26]; + salt_buf1[11] = esalt_bufs[salt_pos].salt_buf[27]; + salt_buf1[12] = esalt_bufs[salt_pos].salt_buf[28]; + salt_buf1[13] = esalt_bufs[salt_pos].salt_buf[29]; + salt_buf1[14] = 0; + salt_buf1[15] = 0; + + /** + * esalt + */ + + const u32 esalt_len = esalt_bufs[salt_pos].esalt_len; + + u32 esalt_buf0[16]; + + esalt_buf0[ 0] = esalt_bufs[salt_pos].esalt_buf[ 0]; + esalt_buf0[ 1] = esalt_bufs[salt_pos].esalt_buf[ 1]; + esalt_buf0[ 2] = esalt_bufs[salt_pos].esalt_buf[ 2]; + esalt_buf0[ 3] = esalt_bufs[salt_pos].esalt_buf[ 3]; + esalt_buf0[ 4] = esalt_bufs[salt_pos].esalt_buf[ 4]; + esalt_buf0[ 5] = esalt_bufs[salt_pos].esalt_buf[ 5]; + esalt_buf0[ 6] = esalt_bufs[salt_pos].esalt_buf[ 6]; + esalt_buf0[ 7] = esalt_bufs[salt_pos].esalt_buf[ 7]; + esalt_buf0[ 8] = esalt_bufs[salt_pos].esalt_buf[ 8]; + esalt_buf0[ 9] = esalt_bufs[salt_pos].esalt_buf[ 9]; + esalt_buf0[10] = esalt_bufs[salt_pos].esalt_buf[10]; + esalt_buf0[11] = esalt_bufs[salt_pos].esalt_buf[11]; + esalt_buf0[12] = esalt_bufs[salt_pos].esalt_buf[12]; + esalt_buf0[13] = esalt_bufs[salt_pos].esalt_buf[13]; + esalt_buf0[14] = esalt_bufs[salt_pos].esalt_buf[14]; + esalt_buf0[15] = esalt_bufs[salt_pos].esalt_buf[15]; + + u32 esalt_buf1[16]; + + esalt_buf1[ 0] = esalt_bufs[salt_pos].esalt_buf[16]; + esalt_buf1[ 1] = esalt_bufs[salt_pos].esalt_buf[17]; + esalt_buf1[ 2] = esalt_bufs[salt_pos].esalt_buf[18]; + esalt_buf1[ 3] = esalt_bufs[salt_pos].esalt_buf[19]; + esalt_buf1[ 4] = esalt_bufs[salt_pos].esalt_buf[20]; + esalt_buf1[ 5] = esalt_bufs[salt_pos].esalt_buf[21]; + esalt_buf1[ 6] = esalt_bufs[salt_pos].esalt_buf[22]; + esalt_buf1[ 7] = esalt_bufs[salt_pos].esalt_buf[23]; + esalt_buf1[ 8] = esalt_bufs[salt_pos].esalt_buf[24]; + esalt_buf1[ 9] = esalt_bufs[salt_pos].esalt_buf[25]; + esalt_buf1[10] = esalt_bufs[salt_pos].esalt_buf[26]; + esalt_buf1[11] = esalt_bufs[salt_pos].esalt_buf[27]; + esalt_buf1[12] = esalt_bufs[salt_pos].esalt_buf[28]; + esalt_buf1[13] = esalt_bufs[salt_pos].esalt_buf[29]; + esalt_buf1[14] = esalt_bufs[salt_pos].esalt_buf[30]; + esalt_buf1[15] = esalt_bufs[salt_pos].esalt_buf[31]; + + u32 esalt_buf2[16]; + + esalt_buf2[ 0] = esalt_bufs[salt_pos].esalt_buf[32]; + esalt_buf2[ 1] = esalt_bufs[salt_pos].esalt_buf[33]; + esalt_buf2[ 2] = esalt_bufs[salt_pos].esalt_buf[34]; + esalt_buf2[ 3] = esalt_bufs[salt_pos].esalt_buf[35]; + esalt_buf2[ 4] = esalt_bufs[salt_pos].esalt_buf[36]; + esalt_buf2[ 5] = esalt_bufs[salt_pos].esalt_buf[37]; + esalt_buf2[ 6] = 0; + esalt_buf2[ 7] = 0; + esalt_buf2[ 8] = 0; + esalt_buf2[ 9] = 0; + esalt_buf2[10] = 0; + esalt_buf2[11] = 0; + esalt_buf2[12] = 0; + esalt_buf2[13] = 0; + esalt_buf2[14] = 0; + esalt_buf2[15] = 0; + + const u32 digest_esalt_len = 32 + esalt_len; + const u32 remaining_bytes = digest_esalt_len + 1 - 64; // substract previous block + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + + w0[0] = pw_buf0[0]; + w0[1] = pw_buf0[1]; + w0[2] = pw_buf0[2]; + w0[3] = pw_buf0[3]; + + u32x w1[4]; + + w1[0] = pw_buf1[0]; + w1[1] = pw_buf1[1]; + w1[2] = pw_buf1[2]; + w1[3] = pw_buf1[3]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 out_len = apply_rules (c_rules[il_pos].cmds, w0, w1, pw_len); + + append_0x80_2 (w0, w1, out_len); + + const u32 pw_salt_len = salt_len + out_len; + + /* + * HA1 = md5 ($salt . $pass) + */ + + // append the pass to the salt + + u32x block0[16]; + + block0[ 0] = salt_buf0[ 0]; + block0[ 1] = salt_buf0[ 1]; + block0[ 2] = salt_buf0[ 2]; + block0[ 3] = salt_buf0[ 3]; + block0[ 4] = salt_buf0[ 4]; + block0[ 5] = salt_buf0[ 5]; + block0[ 6] = salt_buf0[ 6]; + block0[ 7] = salt_buf0[ 7]; + block0[ 8] = salt_buf0[ 8]; + block0[ 9] = salt_buf0[ 9]; + block0[10] = salt_buf0[10]; + block0[11] = salt_buf0[11]; + block0[12] = salt_buf0[12]; + block0[13] = salt_buf0[13]; + block0[14] = salt_buf0[14]; + block0[15] = salt_buf0[15]; + + u32x block1[16]; + + block1[ 0] = salt_buf1[ 0]; + block1[ 1] = salt_buf1[ 1]; + block1[ 2] = salt_buf1[ 2]; + block1[ 3] = salt_buf1[ 3]; + block1[ 4] = salt_buf1[ 4]; + block1[ 5] = salt_buf1[ 5]; + block1[ 6] = salt_buf1[ 6]; + block1[ 7] = salt_buf1[ 7]; + block1[ 8] = salt_buf1[ 8]; + block1[ 9] = salt_buf1[ 9]; + block1[10] = salt_buf1[10]; + block1[11] = salt_buf1[11]; + block1[12] = salt_buf1[12]; + block1[13] = salt_buf1[13]; + block1[14] = salt_buf1[14]; + block1[15] = salt_buf1[15]; + + u32 block_len = 0; + + block_len = memcat32 (block0, block1, salt_len, w0, w1, w2, w3, out_len); + + u32x w0_t[4]; + + w0_t[0] = block0[ 0]; + w0_t[1] = block0[ 1]; + w0_t[2] = block0[ 2]; + w0_t[3] = block0[ 3]; + + u32x w1_t[4]; + + w1_t[0] = block0[ 4]; + w1_t[1] = block0[ 5]; + w1_t[2] = block0[ 6]; + w1_t[3] = block0[ 7]; + + u32x w2_t[4]; + + w2_t[0] = block0[ 8]; + w2_t[1] = block0[ 9]; + w2_t[2] = block0[10]; + w2_t[3] = block0[11]; + + u32x w3_t[4]; + + w3_t[0] = block0[12]; + w3_t[1] = block0[13]; + w3_t[2] = block0[14]; + w3_t[3] = block0[15]; + + if (block_len < 56) + { + w3_t[2] = pw_salt_len * 8; + } + + // md5 + + u32x tmp2; + + u32x a = MD5M_A; + u32x b = MD5M_B; + u32x c = MD5M_C; + u32x d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0_t[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0_t[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0_t[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1_t[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1_t[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1_t[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2_t[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2_t[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2_t[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3_t[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3_t[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3_t[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0_t[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1_t[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2_t[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1_t[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1_t[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2_t[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3_t[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0_t[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2_t[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3_t[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0_t[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1_t[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3_t[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H1, a, b, c, d, w1_t[1], MD5C20, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w2_t[0], MD5C21, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w2_t[3], MD5C22, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w3_t[2], MD5C23, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w0_t[1], MD5C24, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w1_t[0], MD5C25, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w1_t[3], MD5C26, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w2_t[2], MD5C27, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w3_t[1], MD5C28, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w0_t[0], MD5C29, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w0_t[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w1_t[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w2_t[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w3_t[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w3_t[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w0_t[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1_t[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3_t[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3_t[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0_t[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0_t[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2_t[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1_t[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3_t[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1_t[0], MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w2_t[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0_t[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2_t[1], MD5C3f, MD5S33); + + a += MD5M_A; + b += MD5M_B; + c += MD5M_C; + d += MD5M_D; + + if (block_len > 55) + { + u32x r_a = a; + u32x r_b = b; + u32x r_c = c; + u32x r_d = d; + + w0_t[0] = block1[ 0]; + w0_t[1] = block1[ 1]; + w0_t[2] = block1[ 2]; + w0_t[3] = block1[ 3]; + + w1_t[0] = block1[ 4]; + w1_t[1] = block1[ 5]; + w1_t[2] = block1[ 6]; + w1_t[3] = block1[ 7]; + + w2_t[0] = block1[ 8]; + w2_t[1] = block1[ 9]; + w2_t[2] = block1[10]; + w2_t[3] = block1[11]; + + w3_t[0] = block1[12]; + w3_t[1] = block1[13]; + w3_t[2] = pw_salt_len * 8; + w3_t[3] = 0; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0_t[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0_t[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0_t[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1_t[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1_t[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1_t[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2_t[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2_t[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2_t[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3_t[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3_t[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3_t[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0_t[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1_t[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2_t[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1_t[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1_t[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2_t[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3_t[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0_t[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2_t[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3_t[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0_t[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1_t[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3_t[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H1, a, b, c, d, w1_t[1], MD5C20, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w2_t[0], MD5C21, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w2_t[3], MD5C22, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w3_t[2], MD5C23, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w0_t[1], MD5C24, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w1_t[0], MD5C25, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w1_t[3], MD5C26, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w2_t[2], MD5C27, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w3_t[1], MD5C28, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w0_t[0], MD5C29, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w0_t[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w1_t[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w2_t[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w3_t[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w3_t[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w0_t[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1_t[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3_t[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3_t[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0_t[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0_t[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2_t[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1_t[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3_t[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1_t[0], MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w2_t[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0_t[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2_t[1], MD5C3f, MD5S33); + + a += r_a; + b += r_b; + c += r_c; + d += r_d; + } + + /* + * final = md5 ($HA1 . $esalt) + * we have at least 2 MD5 blocks/transformations, but we might need 3 + */ + + w0_t[0] = uint_to_hex_lower8 ((a >> 0) & 255) << 0 + | uint_to_hex_lower8 ((a >> 8) & 255) << 16; + w0_t[1] = uint_to_hex_lower8 ((a >> 16) & 255) << 0 + | uint_to_hex_lower8 ((a >> 24) & 255) << 16; + w0_t[2] = uint_to_hex_lower8 ((b >> 0) & 255) << 0 + | uint_to_hex_lower8 ((b >> 8) & 255) << 16; + w0_t[3] = uint_to_hex_lower8 ((b >> 16) & 255) << 0 + | uint_to_hex_lower8 ((b >> 24) & 255) << 16; + w1_t[0] = uint_to_hex_lower8 ((c >> 0) & 255) << 0 + | uint_to_hex_lower8 ((c >> 8) & 255) << 16; + w1_t[1] = uint_to_hex_lower8 ((c >> 16) & 255) << 0 + | uint_to_hex_lower8 ((c >> 24) & 255) << 16; + w1_t[2] = uint_to_hex_lower8 ((d >> 0) & 255) << 0 + | uint_to_hex_lower8 ((d >> 8) & 255) << 16; + w1_t[3] = uint_to_hex_lower8 ((d >> 16) & 255) << 0 + | uint_to_hex_lower8 ((d >> 24) & 255) << 16; + + w2_t[0] = esalt_buf0[0]; + w2_t[1] = esalt_buf0[1]; + w2_t[2] = esalt_buf0[2]; + w2_t[3] = esalt_buf0[3]; + + w3_t[0] = esalt_buf0[4]; + w3_t[1] = esalt_buf0[5]; + w3_t[2] = esalt_buf0[6]; + w3_t[3] = esalt_buf0[7]; + + // md5 + // 1st transform + + a = MD5M_A; + b = MD5M_B; + c = MD5M_C; + d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0_t[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0_t[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0_t[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1_t[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1_t[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1_t[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2_t[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2_t[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2_t[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3_t[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3_t[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3_t[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0_t[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1_t[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2_t[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1_t[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1_t[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2_t[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3_t[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0_t[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2_t[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3_t[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0_t[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1_t[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3_t[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H1, a, b, c, d, w1_t[1], MD5C20, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w2_t[0], MD5C21, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w2_t[3], MD5C22, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w3_t[2], MD5C23, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w0_t[1], MD5C24, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w1_t[0], MD5C25, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w1_t[3], MD5C26, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w2_t[2], MD5C27, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w3_t[1], MD5C28, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w0_t[0], MD5C29, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w0_t[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w1_t[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w2_t[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w3_t[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w3_t[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w0_t[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1_t[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3_t[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3_t[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0_t[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0_t[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2_t[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1_t[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3_t[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1_t[0], MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w2_t[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0_t[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2_t[1], MD5C3f, MD5S33); + + a += MD5M_A; + b += MD5M_B; + c += MD5M_C; + d += MD5M_D; + + u32x r_a = a; + u32x r_b = b; + u32x r_c = c; + u32x r_d = d; + + // 2nd transform + + w0_t[0] = esalt_buf0[ 8]; + w0_t[1] = esalt_buf0[ 9]; + w0_t[2] = esalt_buf0[10]; + w0_t[3] = esalt_buf0[11]; + + w1_t[0] = esalt_buf0[12]; + w1_t[1] = esalt_buf0[13]; + w1_t[2] = esalt_buf0[14]; + w1_t[3] = esalt_buf0[15]; + + w2_t[0] = esalt_buf1[ 0]; + w2_t[1] = esalt_buf1[ 1]; + w2_t[2] = esalt_buf1[ 2]; + w2_t[3] = esalt_buf1[ 3]; + + w3_t[0] = esalt_buf1[ 4]; + w3_t[1] = esalt_buf1[ 5]; + w3_t[2] = esalt_buf1[ 6]; + w3_t[3] = esalt_buf1[ 7]; + + // it is the final block when no more than 55 bytes left + + if (remaining_bytes < 56) + { + // it is the last block ! + + w3_t[2] = digest_esalt_len * 8; + } + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0_t[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0_t[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0_t[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1_t[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1_t[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1_t[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2_t[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2_t[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2_t[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3_t[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3_t[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3_t[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0_t[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1_t[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2_t[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1_t[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1_t[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2_t[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3_t[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0_t[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2_t[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3_t[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0_t[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1_t[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3_t[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H1, a, b, c, d, w1_t[1], MD5C20, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w2_t[0], MD5C21, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w2_t[3], MD5C22, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w3_t[2], MD5C23, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w0_t[1], MD5C24, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w1_t[0], MD5C25, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w1_t[3], MD5C26, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w2_t[2], MD5C27, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w3_t[1], MD5C28, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w0_t[0], MD5C29, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w0_t[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w1_t[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w2_t[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w3_t[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w3_t[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w0_t[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1_t[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3_t[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3_t[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0_t[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0_t[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2_t[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1_t[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3_t[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1_t[0], MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w2_t[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0_t[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2_t[1], MD5C3f, MD5S33); + + // sometimes (not rare at all) we need a third block :( + + if (remaining_bytes > 55) + { + // this is for sure the final block + + a += r_a; + b += r_b; + c += r_c; + d += r_d; + + r_a = a; + r_b = b; + r_c = c; + r_d = d; + + w0_t[0] = esalt_buf1[ 8]; + w0_t[1] = esalt_buf1[ 9]; + w0_t[2] = esalt_buf1[10]; + w0_t[3] = esalt_buf1[11]; + + w1_t[0] = esalt_buf1[12]; + w1_t[1] = esalt_buf1[13]; + w1_t[2] = esalt_buf1[14]; + w1_t[3] = esalt_buf1[15]; + + w2_t[0] = esalt_buf2[ 0]; + w2_t[1] = esalt_buf2[ 1]; + w2_t[2] = esalt_buf2[ 2]; + w2_t[3] = esalt_buf2[ 3]; + + w3_t[0] = esalt_buf2[ 4]; + w3_t[1] = esalt_buf2[ 5]; + w3_t[2] = digest_esalt_len * 8; + w3_t[3] = 0; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0_t[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0_t[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0_t[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1_t[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1_t[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1_t[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2_t[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2_t[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2_t[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3_t[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3_t[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3_t[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0_t[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1_t[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2_t[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1_t[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1_t[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2_t[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3_t[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0_t[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2_t[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3_t[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0_t[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1_t[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3_t[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H1, a, b, c, d, w1_t[1], MD5C20, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w2_t[0], MD5C21, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w2_t[3], MD5C22, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w3_t[2], MD5C23, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w0_t[1], MD5C24, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w1_t[0], MD5C25, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w1_t[3], MD5C26, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w2_t[2], MD5C27, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w3_t[1], MD5C28, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w0_t[0], MD5C29, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w0_t[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w1_t[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w2_t[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w3_t[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w3_t[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w0_t[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1_t[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3_t[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3_t[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0_t[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0_t[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2_t[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1_t[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3_t[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1_t[0], MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w2_t[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0_t[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2_t[1], MD5C3f, MD5S33); + } + + a += r_a; + b += r_b; + c += r_c; + d += r_d; + + const u32x r0 = a; + const u32x r1 = d; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_S + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m11400_s08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const sip_t *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m11400_s16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const sip_t *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/nv/m11400_a1.cu b/nv/m11400_a1.cu new file mode 100644 index 0000000000..e8a7d31623 --- /dev/null +++ b/nv/m11400_a1.cu @@ -0,0 +1,2428 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _MD5_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW2 +#define VECT_SIZE1 +#endif + +#define DGST_R0 0 +#define DGST_R1 3 +#define DGST_R2 2 +#define DGST_R3 1 + +#include "include/kernel_functions.c" +#include "types_nv.c" +#include "common_nv.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +#ifdef VECT_SIZE1 +#define uint_to_hex_lower8(i) l_bin2asc[(i)] +#endif + +#ifdef VECT_SIZE2 +#define uint_to_hex_lower8(i) u32x (l_bin2asc[(i).x], l_bin2asc[(i).y]) +#endif + +#ifdef VECT_SIZE4 +#define uint_to_hex_lower8(i) u32x (l_bin2asc[(i).x], l_bin2asc[(i).y], l_bin2asc[(i).z], l_bin2asc[(i).w]) +#endif + +__device__ static u32 memcat32 (u32x block0[16], u32x block1[16], const u32 block_len, const u32x append0[4], const u32x append1[4], const u32x append2[4], const u32x append3[4], const u32 append_len) +{ + const u32 mod = block_len & 3; + const u32 div = block_len / 4; + + const int offset_minus_4 = 4 - mod; + + const int selector = (0x76543210 >> (offset_minus_4 * 4)) & 0xffff; + + u32x append0_t[4]; + + append0_t[0] = __byte_perm ( 0, append0[0], selector); + append0_t[1] = __byte_perm (append0[0], append0[1], selector); + append0_t[2] = __byte_perm (append0[1], append0[2], selector); + append0_t[3] = __byte_perm (append0[2], append0[3], selector); + + u32x append1_t[4]; + + append1_t[0] = __byte_perm (append0[3], append1[0], selector); + append1_t[1] = __byte_perm (append1[0], append1[1], selector); + append1_t[2] = __byte_perm (append1[1], append1[2], selector); + append1_t[3] = __byte_perm (append1[2], append1[3], selector); + + u32x append2_t[4]; + + append2_t[0] = __byte_perm (append1[3], append2[0], selector); + append2_t[1] = __byte_perm (append2[0], append2[1], selector); + append2_t[2] = __byte_perm (append2[1], append2[2], selector); + append2_t[3] = __byte_perm (append2[2], append2[3], selector); + + u32x append3_t[4]; + + append3_t[0] = __byte_perm (append2[3], append3[0], selector); + append3_t[1] = __byte_perm (append3[0], append3[1], selector); + append3_t[2] = __byte_perm (append3[1], append3[2], selector); + append3_t[3] = __byte_perm (append3[2], append3[3], selector); + + u32x append4_t[4]; + + append4_t[0] = __byte_perm (append3[3], 0, selector); + append4_t[1] = 0; + append4_t[2] = 0; + append4_t[3] = 0; + + switch (div) + { + case 0: block0[ 0] |= append0_t[0]; + block0[ 1] = append0_t[1]; + block0[ 2] = append0_t[2]; + block0[ 3] = append0_t[3]; + + block0[ 4] = append1_t[0]; + block0[ 5] = append1_t[1]; + block0[ 6] = append1_t[2]; + block0[ 7] = append1_t[3]; + + block0[ 8] = append2_t[0]; + block0[ 9] = append2_t[1]; + block0[10] = append2_t[2]; + block0[11] = append2_t[3]; + + block0[12] = append3_t[0]; + block0[13] = append3_t[1]; + block0[14] = append3_t[2]; + block0[15] = append3_t[3]; + + block1[ 0] = append4_t[0]; + block1[ 1] = append4_t[1]; + block1[ 2] = append4_t[2]; + block1[ 3] = append4_t[3]; + break; + + case 1: block0[ 1] |= append0_t[0]; + block0[ 2] = append0_t[1]; + block0[ 3] = append0_t[2]; + block0[ 4] = append0_t[3]; + + block0[ 5] = append1_t[0]; + block0[ 6] = append1_t[1]; + block0[ 7] = append1_t[2]; + block0[ 8] = append1_t[3]; + + block0[ 9] = append2_t[0]; + block0[10] = append2_t[1]; + block0[11] = append2_t[2]; + block0[12] = append2_t[3]; + + block0[13] = append3_t[0]; + block0[14] = append3_t[1]; + block0[15] = append3_t[2]; + block1[ 0] = append3_t[3]; + + block1[ 1] = append4_t[0]; + block1[ 2] = append4_t[1]; + block1[ 3] = append4_t[2]; + block1[ 4] = append4_t[3]; + break; + + case 2: block0[ 2] |= append0_t[0]; + block0[ 3] = append0_t[1]; + block0[ 4] = append0_t[2]; + block0[ 5] = append0_t[3]; + + block0[ 6] = append1_t[0]; + block0[ 7] = append1_t[1]; + block0[ 8] = append1_t[2]; + block0[ 9] = append1_t[3]; + + block0[10] = append2_t[0]; + block0[11] = append2_t[1]; + block0[12] = append2_t[2]; + block0[13] = append2_t[3]; + + block0[14] = append3_t[0]; + block0[15] = append3_t[1]; + block1[ 0] = append3_t[2]; + block1[ 1] = append3_t[3]; + + block1[ 2] = append4_t[0]; + block1[ 3] = append4_t[1]; + block1[ 4] = append4_t[2]; + block1[ 5] = append4_t[3]; + break; + + case 3: block0[ 3] |= append0_t[0]; + block0[ 4] = append0_t[1]; + block0[ 5] = append0_t[2]; + block0[ 6] = append0_t[3]; + + block0[ 7] = append1_t[0]; + block0[ 8] = append1_t[1]; + block0[ 9] = append1_t[2]; + block0[10] = append1_t[3]; + + block0[11] = append2_t[0]; + block0[12] = append2_t[1]; + block0[13] = append2_t[2]; + block0[14] = append2_t[3]; + + block0[15] = append3_t[0]; + block1[ 0] = append3_t[1]; + block1[ 1] = append3_t[2]; + block1[ 2] = append3_t[3]; + + block1[ 3] = append4_t[0]; + block1[ 4] = append4_t[1]; + block1[ 5] = append4_t[2]; + block1[ 6] = append4_t[3]; + break; + + case 4: block0[ 4] |= append0_t[0]; + block0[ 5] = append0_t[1]; + block0[ 6] = append0_t[2]; + block0[ 7] = append0_t[3]; + + block0[ 8] = append1_t[0]; + block0[ 9] = append1_t[1]; + block0[10] = append1_t[2]; + block0[11] = append1_t[3]; + + block0[12] = append2_t[0]; + block0[13] = append2_t[1]; + block0[14] = append2_t[2]; + block0[15] = append2_t[3]; + + block1[ 0] = append3_t[0]; + block1[ 1] = append3_t[1]; + block1[ 2] = append3_t[2]; + block1[ 3] = append3_t[3]; + + block1[ 4] = append4_t[0]; + block1[ 5] = append4_t[1]; + block1[ 6] = append4_t[2]; + block1[ 7] = append4_t[3]; + break; + + case 5: block0[ 5] |= append0_t[0]; + block0[ 6] = append0_t[1]; + block0[ 7] = append0_t[2]; + block0[ 8] = append0_t[3]; + + block0[ 9] = append1_t[0]; + block0[10] = append1_t[1]; + block0[11] = append1_t[2]; + block0[12] = append1_t[3]; + + block0[13] = append2_t[0]; + block0[14] = append2_t[1]; + block0[15] = append2_t[2]; + block1[ 0] = append2_t[3]; + + block1[ 1] = append3_t[0]; + block1[ 2] = append3_t[1]; + block1[ 3] = append3_t[2]; + block1[ 4] = append3_t[3]; + + block1[ 5] = append4_t[0]; + block1[ 6] = append4_t[1]; + block1[ 7] = append4_t[2]; + block1[ 8] = append4_t[3]; + break; + + case 6: block0[ 6] |= append0_t[0]; + block0[ 7] = append0_t[1]; + block0[ 8] = append0_t[2]; + block0[ 9] = append0_t[3]; + + block0[10] = append1_t[0]; + block0[11] = append1_t[1]; + block0[12] = append1_t[2]; + block0[13] = append1_t[3]; + + block0[14] = append2_t[0]; + block0[15] = append2_t[1]; + block1[ 0] = append2_t[2]; + block1[ 1] = append2_t[3]; + + block1[ 2] = append3_t[0]; + block1[ 3] = append3_t[1]; + block1[ 4] = append3_t[2]; + block1[ 5] = append3_t[3]; + + block1[ 6] = append4_t[0]; + block1[ 7] = append4_t[1]; + block1[ 8] = append4_t[2]; + block1[ 9] = append4_t[3]; + break; + + case 7: block0[ 7] |= append0_t[0]; + block0[ 8] = append0_t[1]; + block0[ 9] = append0_t[2]; + block0[10] = append0_t[3]; + + block0[11] = append1_t[0]; + block0[12] = append1_t[1]; + block0[13] = append1_t[2]; + block0[14] = append1_t[3]; + + block0[15] = append2_t[0]; + block1[ 0] = append2_t[1]; + block1[ 1] = append2_t[2]; + block1[ 2] = append2_t[3]; + + block1[ 3] = append3_t[0]; + block1[ 4] = append3_t[1]; + block1[ 5] = append3_t[2]; + block1[ 6] = append3_t[3]; + + block1[ 7] = append4_t[0]; + block1[ 8] = append4_t[1]; + block1[ 9] = append4_t[2]; + block1[10] = append4_t[3]; + break; + + case 8: block0[ 8] |= append0_t[0]; + block0[ 9] = append0_t[1]; + block0[10] = append0_t[2]; + block0[11] = append0_t[3]; + + block0[12] = append1_t[0]; + block0[13] = append1_t[1]; + block0[14] = append1_t[2]; + block0[15] = append1_t[3]; + + block1[ 0] = append2_t[0]; + block1[ 1] = append2_t[1]; + block1[ 2] = append2_t[2]; + block1[ 3] = append2_t[3]; + + block1[ 4] = append3_t[0]; + block1[ 5] = append3_t[1]; + block1[ 6] = append3_t[2]; + block1[ 7] = append3_t[3]; + + block1[ 8] = append4_t[0]; + block1[ 9] = append4_t[1]; + block1[10] = append4_t[2]; + block1[11] = append4_t[3]; + break; + + case 9: block0[ 9] |= append0_t[0]; + block0[10] = append0_t[1]; + block0[11] = append0_t[2]; + block0[12] = append0_t[3]; + + block0[13] = append1_t[0]; + block0[14] = append1_t[1]; + block0[15] = append1_t[2]; + block1[ 0] = append1_t[3]; + + block1[ 1] = append2_t[0]; + block1[ 2] = append2_t[1]; + block1[ 3] = append2_t[2]; + block1[ 4] = append2_t[3]; + + block1[ 5] = append3_t[0]; + block1[ 6] = append3_t[1]; + block1[ 7] = append3_t[2]; + block1[ 8] = append3_t[3]; + + block1[ 9] = append4_t[0]; + block1[10] = append4_t[1]; + block1[11] = append4_t[2]; + block1[12] = append4_t[3]; + break; + + case 10: block0[10] |= append0_t[0]; + block0[11] = append0_t[1]; + block0[12] = append0_t[2]; + block0[13] = append0_t[3]; + + block0[14] = append1_t[0]; + block0[15] = append1_t[1]; + block1[ 0] = append1_t[2]; + block1[ 1] = append1_t[3]; + + block1[ 2] = append2_t[0]; + block1[ 3] = append2_t[1]; + block1[ 4] = append2_t[2]; + block1[ 5] = append2_t[3]; + + block1[ 6] = append3_t[0]; + block1[ 7] = append3_t[1]; + block1[ 8] = append3_t[2]; + block1[ 9] = append3_t[3]; + + block1[10] = append4_t[0]; + block1[11] = append4_t[1]; + block1[12] = append4_t[2]; + block1[13] = append4_t[3]; + break; + + case 11: block0[11] |= append0_t[0]; + block0[12] = append0_t[1]; + block0[13] = append0_t[2]; + block0[14] = append0_t[3]; + + block0[15] = append1_t[0]; + block1[ 0] = append1_t[1]; + block1[ 1] = append1_t[2]; + block1[ 2] = append1_t[3]; + + block1[ 3] = append2_t[0]; + block1[ 4] = append2_t[1]; + block1[ 5] = append2_t[2]; + block1[ 6] = append2_t[3]; + + block1[ 7] = append3_t[0]; + block1[ 8] = append3_t[1]; + block1[ 9] = append3_t[2]; + block1[10] = append3_t[3]; + + block1[11] = append4_t[0]; + block1[12] = append4_t[1]; + block1[13] = append4_t[2]; + block1[14] = append4_t[3]; + break; + + case 12: block0[12] |= append0_t[0]; + block0[13] = append0_t[1]; + block0[14] = append0_t[2]; + block0[15] = append0_t[3]; + + block1[ 0] = append1_t[0]; + block1[ 1] = append1_t[1]; + block1[ 2] = append1_t[2]; + block1[ 3] = append1_t[3]; + + block1[ 4] = append2_t[0]; + block1[ 5] = append2_t[1]; + block1[ 6] = append2_t[2]; + block1[ 7] = append2_t[3]; + + block1[ 8] = append3_t[0]; + block1[ 9] = append3_t[1]; + block1[10] = append3_t[2]; + block1[11] = append3_t[3]; + + block1[12] = append4_t[0]; + block1[13] = append4_t[1]; + block1[14] = append4_t[2]; + block1[15] = append4_t[3]; + break; + + case 13: block0[13] |= append0_t[0]; + block0[14] = append0_t[1]; + block0[15] = append0_t[2]; + block1[ 0] = append0_t[3]; + + block1[ 1] = append1_t[0]; + block1[ 2] = append1_t[1]; + block1[ 3] = append1_t[2]; + block1[ 4] = append1_t[3]; + + block1[ 5] = append2_t[0]; + block1[ 6] = append2_t[1]; + block1[ 7] = append2_t[2]; + block1[ 8] = append2_t[3]; + + block1[ 9] = append3_t[0]; + block1[10] = append3_t[1]; + block1[11] = append3_t[2]; + block1[12] = append3_t[3]; + + block1[13] = append4_t[0]; + block1[14] = append4_t[1]; + block1[15] = append4_t[2]; + break; + + case 14: block0[14] |= append0_t[0]; + block0[15] = append0_t[1]; + block1[ 0] = append0_t[2]; + block1[ 1] = append0_t[3]; + + block1[ 2] = append1_t[0]; + block1[ 3] = append1_t[1]; + block1[ 4] = append1_t[2]; + block1[ 5] = append1_t[3]; + + block1[ 6] = append2_t[0]; + block1[ 7] = append2_t[1]; + block1[ 8] = append2_t[2]; + block1[ 9] = append2_t[3]; + + block1[10] = append3_t[0]; + block1[11] = append3_t[1]; + block1[12] = append3_t[2]; + block1[13] = append3_t[3]; + + block1[14] = append4_t[0]; + block1[15] = append4_t[1]; + break; + + case 15: block0[15] |= append0_t[0]; + block1[ 0] = append0_t[1]; + block1[ 1] = append0_t[2]; + block1[ 2] = append0_t[3]; + + block1[ 3] = append1_t[1]; + block1[ 4] = append1_t[2]; + block1[ 5] = append1_t[3]; + block1[ 6] = append1_t[0]; + + block1[ 7] = append2_t[0]; + block1[ 8] = append2_t[1]; + block1[ 9] = append2_t[2]; + block1[10] = append2_t[3]; + + block1[11] = append3_t[0]; + block1[12] = append3_t[1]; + block1[13] = append3_t[2]; + block1[14] = append3_t[3]; + + block1[15] = append4_t[0]; + break; + + case 16: block1[ 0] |= append0_t[0]; + block1[ 1] = append0_t[1]; + block1[ 2] = append0_t[2]; + block1[ 3] = append0_t[3]; + + block1[ 4] = append1_t[0]; + block1[ 5] = append1_t[1]; + block1[ 6] = append1_t[2]; + block1[ 7] = append1_t[3]; + + block1[ 8] = append2_t[0]; + block1[ 9] = append2_t[1]; + block1[10] = append2_t[2]; + block1[11] = append2_t[3]; + + block1[12] = append3_t[0]; + block1[13] = append3_t[1]; + block1[14] = append3_t[2]; + block1[15] = append3_t[3]; + break; + + case 17: block1[ 1] |= append0_t[0]; + block1[ 2] = append0_t[1]; + block1[ 3] = append0_t[2]; + block1[ 4] = append0_t[3]; + + block1[ 5] = append1_t[0]; + block1[ 6] = append1_t[1]; + block1[ 7] = append1_t[2]; + block1[ 8] = append1_t[3]; + + block1[ 9] = append2_t[0]; + block1[10] = append2_t[1]; + block1[11] = append2_t[2]; + block1[12] = append2_t[3]; + + block1[13] = append3_t[0]; + block1[14] = append3_t[1]; + block1[15] = append3_t[2]; + break; + + case 18: block1[ 2] |= append0_t[0]; + block1[ 3] = append0_t[1]; + block1[ 4] = append0_t[2]; + block1[ 5] = append0_t[3]; + + block1[ 6] = append1_t[0]; + block1[ 7] = append1_t[1]; + block1[ 8] = append1_t[2]; + block1[ 9] = append1_t[3]; + + block1[10] = append2_t[0]; + block1[11] = append2_t[1]; + block1[12] = append2_t[2]; + block1[13] = append2_t[3]; + + block1[14] = append3_t[0]; + block1[15] = append3_t[1]; + break; + + case 19: block1[ 3] |= append0_t[0]; + block1[ 4] = append0_t[1]; + block1[ 5] = append0_t[2]; + block1[ 6] = append0_t[3]; + + block1[ 7] = append1_t[0]; + block1[ 8] = append1_t[1]; + block1[ 9] = append1_t[2]; + block1[10] = append1_t[3]; + + block1[11] = append2_t[0]; + block1[12] = append2_t[1]; + block1[13] = append2_t[2]; + block1[14] = append2_t[3]; + + block1[15] = append3_t[0]; + break; + + case 20: block1[ 4] |= append0_t[0]; + block1[ 5] = append0_t[1]; + block1[ 6] = append0_t[2]; + block1[ 7] = append0_t[3]; + + block1[ 8] = append1_t[0]; + block1[ 9] = append1_t[1]; + block1[10] = append1_t[2]; + block1[11] = append1_t[3]; + + block1[12] = append2_t[0]; + block1[13] = append2_t[1]; + block1[14] = append2_t[2]; + block1[15] = append2_t[3]; + break; + + case 21: block1[ 5] |= append0_t[0]; + block1[ 6] = append0_t[1]; + block1[ 7] = append0_t[2]; + block1[ 8] = append0_t[3]; + + block1[ 9] = append1_t[0]; + block1[10] = append1_t[1]; + block1[11] = append1_t[2]; + block1[12] = append1_t[3]; + + block1[13] = append2_t[0]; + block1[14] = append2_t[1]; + block1[15] = append2_t[2]; + break; + + case 22: block1[ 6] |= append0_t[0]; + block1[ 7] = append0_t[1]; + block1[ 8] = append0_t[2]; + block1[ 9] = append0_t[3]; + + block1[10] = append1_t[0]; + block1[11] = append1_t[1]; + block1[12] = append1_t[2]; + block1[13] = append1_t[3]; + + block1[14] = append2_t[0]; + block1[15] = append2_t[1]; + break; + + case 23: block1[ 7] |= append0_t[0]; + block1[ 8] = append0_t[1]; + block1[ 9] = append0_t[2]; + block1[10] = append0_t[3]; + + block1[11] = append1_t[0]; + block1[12] = append1_t[1]; + block1[13] = append1_t[2]; + block1[14] = append1_t[3]; + + block1[15] = append2_t[0]; + break; + + case 24: block1[ 8] |= append0_t[0]; + block1[ 9] = append0_t[1]; + block1[10] = append0_t[2]; + block1[11] = append0_t[3]; + + block1[12] = append1_t[0]; + block1[13] = append1_t[1]; + block1[14] = append1_t[2]; + block1[15] = append1_t[3]; + break; + + case 25: block1[ 9] |= append0_t[0]; + block1[10] = append0_t[1]; + block1[11] = append0_t[2]; + block1[12] = append0_t[3]; + + block1[13] = append1_t[0]; + block1[14] = append1_t[1]; + block1[15] = append1_t[2]; + break; + + case 26: block1[10] |= append0_t[0]; + block1[11] = append0_t[1]; + block1[12] = append0_t[2]; + block1[13] = append0_t[3]; + + block1[14] = append1_t[0]; + block1[15] = append1_t[1]; + break; + + case 27: block1[11] |= append0_t[0]; + block1[12] = append0_t[1]; + block1[13] = append0_t[2]; + block1[14] = append0_t[3]; + + block1[15] = append1_t[0]; + break; + + case 28: block1[12] |= append0_t[0]; + block1[13] = append0_t[1]; + block1[14] = append0_t[2]; + block1[15] = append0_t[3]; + break; + + case 29: block1[13] |= append0_t[0]; + block1[14] = append0_t[1]; + block1[15] = append0_t[2]; + break; + + case 30: block1[14] |= append0_t[0]; + block1[15] = append0_t[1]; + break; + } + + u32 new_len = block_len + append_len; + + return new_len; +} + +__device__ __constant__ char c_bin2asc[16] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' }; + +__device__ __shared__ short l_bin2asc[256]; + +__device__ __constant__ comb_t c_combs[1024]; + +extern "C" __global__ void __launch_bounds__ (256, 1) m11400_m04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const sip_t *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + /** + * bin2asc table + */ + + l_bin2asc[lid] = c_bin2asc[(lid >> 0) & 15] << 8 + | c_bin2asc[(lid >> 4) & 15] << 0; + + __syncthreads (); + + if (gid >= gid_max) return; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + append_0x80_2 (wordl0, wordl1, pw_l_len); + + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, c_combs[0].pw_len); + } + + /** + * salt + */ + + const u32 salt_len = esalt_bufs[salt_pos].salt_len; // not a bug, we need to get it from the esalt + + u32 salt_buf0[16]; + + salt_buf0[ 0] = esalt_bufs[salt_pos].salt_buf[ 0]; + salt_buf0[ 1] = esalt_bufs[salt_pos].salt_buf[ 1]; + salt_buf0[ 2] = esalt_bufs[salt_pos].salt_buf[ 2]; + salt_buf0[ 3] = esalt_bufs[salt_pos].salt_buf[ 3]; + salt_buf0[ 4] = esalt_bufs[salt_pos].salt_buf[ 4]; + salt_buf0[ 5] = esalt_bufs[salt_pos].salt_buf[ 5]; + salt_buf0[ 6] = esalt_bufs[salt_pos].salt_buf[ 6]; + salt_buf0[ 7] = esalt_bufs[salt_pos].salt_buf[ 7]; + salt_buf0[ 8] = esalt_bufs[salt_pos].salt_buf[ 8]; + salt_buf0[ 9] = esalt_bufs[salt_pos].salt_buf[ 9]; + salt_buf0[10] = esalt_bufs[salt_pos].salt_buf[10]; + salt_buf0[11] = esalt_bufs[salt_pos].salt_buf[11]; + salt_buf0[12] = esalt_bufs[salt_pos].salt_buf[12]; + salt_buf0[13] = esalt_bufs[salt_pos].salt_buf[13]; + salt_buf0[14] = esalt_bufs[salt_pos].salt_buf[14]; + salt_buf0[15] = esalt_bufs[salt_pos].salt_buf[15]; + + u32 salt_buf1[16]; + + salt_buf1[ 0] = esalt_bufs[salt_pos].salt_buf[16]; + salt_buf1[ 1] = esalt_bufs[salt_pos].salt_buf[17]; + salt_buf1[ 2] = esalt_bufs[salt_pos].salt_buf[18]; + salt_buf1[ 3] = esalt_bufs[salt_pos].salt_buf[19]; + salt_buf1[ 4] = esalt_bufs[salt_pos].salt_buf[20]; + salt_buf1[ 5] = esalt_bufs[salt_pos].salt_buf[21]; + salt_buf1[ 6] = esalt_bufs[salt_pos].salt_buf[22]; + salt_buf1[ 7] = esalt_bufs[salt_pos].salt_buf[23]; + salt_buf1[ 8] = esalt_bufs[salt_pos].salt_buf[24]; + salt_buf1[ 9] = esalt_bufs[salt_pos].salt_buf[25]; + salt_buf1[10] = esalt_bufs[salt_pos].salt_buf[26]; + salt_buf1[11] = esalt_bufs[salt_pos].salt_buf[27]; + salt_buf1[12] = esalt_bufs[salt_pos].salt_buf[28]; + salt_buf1[13] = esalt_bufs[salt_pos].salt_buf[29]; + salt_buf1[14] = 0; + salt_buf1[15] = 0; + + /** + * esalt + */ + + const u32 esalt_len = esalt_bufs[salt_pos].esalt_len; + + u32 esalt_buf0[16]; + + esalt_buf0[ 0] = esalt_bufs[salt_pos].esalt_buf[ 0]; + esalt_buf0[ 1] = esalt_bufs[salt_pos].esalt_buf[ 1]; + esalt_buf0[ 2] = esalt_bufs[salt_pos].esalt_buf[ 2]; + esalt_buf0[ 3] = esalt_bufs[salt_pos].esalt_buf[ 3]; + esalt_buf0[ 4] = esalt_bufs[salt_pos].esalt_buf[ 4]; + esalt_buf0[ 5] = esalt_bufs[salt_pos].esalt_buf[ 5]; + esalt_buf0[ 6] = esalt_bufs[salt_pos].esalt_buf[ 6]; + esalt_buf0[ 7] = esalt_bufs[salt_pos].esalt_buf[ 7]; + esalt_buf0[ 8] = esalt_bufs[salt_pos].esalt_buf[ 8]; + esalt_buf0[ 9] = esalt_bufs[salt_pos].esalt_buf[ 9]; + esalt_buf0[10] = esalt_bufs[salt_pos].esalt_buf[10]; + esalt_buf0[11] = esalt_bufs[salt_pos].esalt_buf[11]; + esalt_buf0[12] = esalt_bufs[salt_pos].esalt_buf[12]; + esalt_buf0[13] = esalt_bufs[salt_pos].esalt_buf[13]; + esalt_buf0[14] = esalt_bufs[salt_pos].esalt_buf[14]; + esalt_buf0[15] = esalt_bufs[salt_pos].esalt_buf[15]; + + u32 esalt_buf1[16]; + + esalt_buf1[ 0] = esalt_bufs[salt_pos].esalt_buf[16]; + esalt_buf1[ 1] = esalt_bufs[salt_pos].esalt_buf[17]; + esalt_buf1[ 2] = esalt_bufs[salt_pos].esalt_buf[18]; + esalt_buf1[ 3] = esalt_bufs[salt_pos].esalt_buf[19]; + esalt_buf1[ 4] = esalt_bufs[salt_pos].esalt_buf[20]; + esalt_buf1[ 5] = esalt_bufs[salt_pos].esalt_buf[21]; + esalt_buf1[ 6] = esalt_bufs[salt_pos].esalt_buf[22]; + esalt_buf1[ 7] = esalt_bufs[salt_pos].esalt_buf[23]; + esalt_buf1[ 8] = esalt_bufs[salt_pos].esalt_buf[24]; + esalt_buf1[ 9] = esalt_bufs[salt_pos].esalt_buf[25]; + esalt_buf1[10] = esalt_bufs[salt_pos].esalt_buf[26]; + esalt_buf1[11] = esalt_bufs[salt_pos].esalt_buf[27]; + esalt_buf1[12] = esalt_bufs[salt_pos].esalt_buf[28]; + esalt_buf1[13] = esalt_bufs[salt_pos].esalt_buf[29]; + esalt_buf1[14] = esalt_bufs[salt_pos].esalt_buf[30]; + esalt_buf1[15] = esalt_bufs[salt_pos].esalt_buf[31]; + + u32 esalt_buf2[16]; + + esalt_buf2[ 0] = esalt_bufs[salt_pos].esalt_buf[32]; + esalt_buf2[ 1] = esalt_bufs[salt_pos].esalt_buf[33]; + esalt_buf2[ 2] = esalt_bufs[salt_pos].esalt_buf[34]; + esalt_buf2[ 3] = esalt_bufs[salt_pos].esalt_buf[35]; + esalt_buf2[ 4] = esalt_bufs[salt_pos].esalt_buf[36]; + esalt_buf2[ 5] = esalt_bufs[salt_pos].esalt_buf[37]; + esalt_buf2[ 6] = 0; + esalt_buf2[ 7] = 0; + esalt_buf2[ 8] = 0; + esalt_buf2[ 9] = 0; + esalt_buf2[10] = 0; + esalt_buf2[11] = 0; + esalt_buf2[12] = 0; + esalt_buf2[13] = 0; + esalt_buf2[14] = 0; + esalt_buf2[15] = 0; + + const u32 digest_esalt_len = 32 + esalt_len; + const u32 remaining_bytes = digest_esalt_len + 1 - 64; // substract previous block + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = c_combs[il_pos].pw_len; + + const u32 pw_len = pw_l_len + pw_r_len; + + u32 wordr0[4]; + + wordr0[0] = c_combs[il_pos].i[0]; + wordr0[1] = c_combs[il_pos].i[1]; + wordr0[2] = c_combs[il_pos].i[2]; + wordr0[3] = c_combs[il_pos].i[3]; + + u32 wordr1[4]; + + wordr1[0] = c_combs[il_pos].i[4]; + wordr1[1] = c_combs[il_pos].i[5]; + wordr1[2] = c_combs[il_pos].i[6]; + wordr1[3] = c_combs[il_pos].i[7]; + + u32 wordr2[4]; + + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + + u32 wordr3[4]; + + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + u32x w0[4]; + + w0[0] = wordl0[0] | wordr0[0]; + w0[1] = wordl0[1] | wordr0[1]; + w0[2] = wordl0[2] | wordr0[2]; + w0[3] = wordl0[3] | wordr0[3]; + + u32x w1[4]; + + w1[0] = wordl1[0] | wordr1[0]; + w1[1] = wordl1[1] | wordr1[1]; + w1[2] = wordl1[2] | wordr1[2]; + w1[3] = wordl1[3] | wordr1[3]; + + u32x w2[4]; + + w2[0] = wordl2[0] | wordr2[0]; + w2[1] = wordl2[1] | wordr2[1]; + w2[2] = wordl2[2] | wordr2[2]; + w2[3] = wordl2[3] | wordr2[3]; + + u32x w3[4]; + + w3[0] = wordl3[0] | wordr3[0]; + w3[1] = wordl3[1] | wordr3[1]; + w3[2] = wordl3[2] | wordr3[2]; + w3[3] = wordl3[3] | wordr3[3]; + + const u32 pw_salt_len = salt_len + pw_len; + + /* + * HA1 = md5 ($salt . $pass) + */ + + // append the pass to the salt + + u32x block0[16]; + + block0[ 0] = salt_buf0[ 0]; + block0[ 1] = salt_buf0[ 1]; + block0[ 2] = salt_buf0[ 2]; + block0[ 3] = salt_buf0[ 3]; + block0[ 4] = salt_buf0[ 4]; + block0[ 5] = salt_buf0[ 5]; + block0[ 6] = salt_buf0[ 6]; + block0[ 7] = salt_buf0[ 7]; + block0[ 8] = salt_buf0[ 8]; + block0[ 9] = salt_buf0[ 9]; + block0[10] = salt_buf0[10]; + block0[11] = salt_buf0[11]; + block0[12] = salt_buf0[12]; + block0[13] = salt_buf0[13]; + block0[14] = salt_buf0[14]; + block0[15] = salt_buf0[15]; + + u32x block1[16]; + + block1[ 0] = salt_buf1[ 0]; + block1[ 1] = salt_buf1[ 1]; + block1[ 2] = salt_buf1[ 2]; + block1[ 3] = salt_buf1[ 3]; + block1[ 4] = salt_buf1[ 4]; + block1[ 5] = salt_buf1[ 5]; + block1[ 6] = salt_buf1[ 6]; + block1[ 7] = salt_buf1[ 7]; + block1[ 8] = salt_buf1[ 8]; + block1[ 9] = salt_buf1[ 9]; + block1[10] = salt_buf1[10]; + block1[11] = salt_buf1[11]; + block1[12] = salt_buf1[12]; + block1[13] = salt_buf1[13]; + block1[14] = salt_buf1[14]; + block1[15] = salt_buf1[15]; + + u32 block_len = 0; + + block_len = memcat32 (block0, block1, salt_len, w0, w1, w2, w3, pw_len); + + u32x w0_t[4]; + + w0_t[0] = block0[ 0]; + w0_t[1] = block0[ 1]; + w0_t[2] = block0[ 2]; + w0_t[3] = block0[ 3]; + + u32x w1_t[4]; + + w1_t[0] = block0[ 4]; + w1_t[1] = block0[ 5]; + w1_t[2] = block0[ 6]; + w1_t[3] = block0[ 7]; + + u32x w2_t[4]; + + w2_t[0] = block0[ 8]; + w2_t[1] = block0[ 9]; + w2_t[2] = block0[10]; + w2_t[3] = block0[11]; + + u32x w3_t[4]; + + w3_t[0] = block0[12]; + w3_t[1] = block0[13]; + w3_t[2] = block0[14]; + w3_t[3] = block0[15]; + + if (block_len < 56) + { + w3_t[2] = pw_salt_len * 8; + } + + // md5 + + u32x tmp2; + + u32x a = MD5M_A; + u32x b = MD5M_B; + u32x c = MD5M_C; + u32x d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0_t[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0_t[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0_t[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1_t[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1_t[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1_t[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2_t[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2_t[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2_t[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3_t[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3_t[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3_t[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0_t[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1_t[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2_t[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1_t[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1_t[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2_t[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3_t[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0_t[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2_t[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3_t[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0_t[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1_t[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3_t[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H1, a, b, c, d, w1_t[1], MD5C20, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w2_t[0], MD5C21, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w2_t[3], MD5C22, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w3_t[2], MD5C23, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w0_t[1], MD5C24, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w1_t[0], MD5C25, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w1_t[3], MD5C26, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w2_t[2], MD5C27, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w3_t[1], MD5C28, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w0_t[0], MD5C29, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w0_t[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w1_t[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w2_t[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w3_t[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w3_t[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w0_t[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1_t[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3_t[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3_t[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0_t[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0_t[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2_t[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1_t[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3_t[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1_t[0], MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w2_t[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0_t[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2_t[1], MD5C3f, MD5S33); + + a += MD5M_A; + b += MD5M_B; + c += MD5M_C; + d += MD5M_D; + + if (block_len > 55) + { + u32x r_a = a; + u32x r_b = b; + u32x r_c = c; + u32x r_d = d; + + w0_t[0] = block1[ 0]; + w0_t[1] = block1[ 1]; + w0_t[2] = block1[ 2]; + w0_t[3] = block1[ 3]; + + w1_t[0] = block1[ 4]; + w1_t[1] = block1[ 5]; + w1_t[2] = block1[ 6]; + w1_t[3] = block1[ 7]; + + w2_t[0] = block1[ 8]; + w2_t[1] = block1[ 9]; + w2_t[2] = block1[10]; + w2_t[3] = block1[11]; + + w3_t[0] = block1[12]; + w3_t[1] = block1[13]; + w3_t[2] = pw_salt_len * 8; + w3_t[3] = 0; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0_t[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0_t[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0_t[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1_t[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1_t[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1_t[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2_t[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2_t[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2_t[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3_t[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3_t[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3_t[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0_t[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1_t[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2_t[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1_t[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1_t[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2_t[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3_t[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0_t[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2_t[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3_t[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0_t[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1_t[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3_t[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H1, a, b, c, d, w1_t[1], MD5C20, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w2_t[0], MD5C21, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w2_t[3], MD5C22, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w3_t[2], MD5C23, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w0_t[1], MD5C24, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w1_t[0], MD5C25, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w1_t[3], MD5C26, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w2_t[2], MD5C27, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w3_t[1], MD5C28, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w0_t[0], MD5C29, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w0_t[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w1_t[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w2_t[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w3_t[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w3_t[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w0_t[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1_t[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3_t[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3_t[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0_t[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0_t[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2_t[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1_t[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3_t[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1_t[0], MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w2_t[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0_t[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2_t[1], MD5C3f, MD5S33); + + a += r_a; + b += r_b; + c += r_c; + d += r_d; + } + + /* + * final = md5 ($HA1 . $esalt) + * we have at least 2 MD5 blocks/transformations, but we might need 3 + */ + + w0_t[0] = uint_to_hex_lower8 ((a >> 0) & 255) << 0 + | uint_to_hex_lower8 ((a >> 8) & 255) << 16; + w0_t[1] = uint_to_hex_lower8 ((a >> 16) & 255) << 0 + | uint_to_hex_lower8 ((a >> 24) & 255) << 16; + w0_t[2] = uint_to_hex_lower8 ((b >> 0) & 255) << 0 + | uint_to_hex_lower8 ((b >> 8) & 255) << 16; + w0_t[3] = uint_to_hex_lower8 ((b >> 16) & 255) << 0 + | uint_to_hex_lower8 ((b >> 24) & 255) << 16; + w1_t[0] = uint_to_hex_lower8 ((c >> 0) & 255) << 0 + | uint_to_hex_lower8 ((c >> 8) & 255) << 16; + w1_t[1] = uint_to_hex_lower8 ((c >> 16) & 255) << 0 + | uint_to_hex_lower8 ((c >> 24) & 255) << 16; + w1_t[2] = uint_to_hex_lower8 ((d >> 0) & 255) << 0 + | uint_to_hex_lower8 ((d >> 8) & 255) << 16; + w1_t[3] = uint_to_hex_lower8 ((d >> 16) & 255) << 0 + | uint_to_hex_lower8 ((d >> 24) & 255) << 16; + + w2_t[0] = esalt_buf0[0]; + w2_t[1] = esalt_buf0[1]; + w2_t[2] = esalt_buf0[2]; + w2_t[3] = esalt_buf0[3]; + + w3_t[0] = esalt_buf0[4]; + w3_t[1] = esalt_buf0[5]; + w3_t[2] = esalt_buf0[6]; + w3_t[3] = esalt_buf0[7]; + + // md5 + // 1st transform + + a = MD5M_A; + b = MD5M_B; + c = MD5M_C; + d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0_t[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0_t[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0_t[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1_t[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1_t[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1_t[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2_t[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2_t[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2_t[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3_t[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3_t[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3_t[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0_t[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1_t[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2_t[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1_t[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1_t[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2_t[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3_t[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0_t[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2_t[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3_t[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0_t[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1_t[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3_t[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H1, a, b, c, d, w1_t[1], MD5C20, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w2_t[0], MD5C21, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w2_t[3], MD5C22, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w3_t[2], MD5C23, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w0_t[1], MD5C24, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w1_t[0], MD5C25, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w1_t[3], MD5C26, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w2_t[2], MD5C27, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w3_t[1], MD5C28, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w0_t[0], MD5C29, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w0_t[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w1_t[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w2_t[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w3_t[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w3_t[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w0_t[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1_t[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3_t[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3_t[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0_t[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0_t[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2_t[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1_t[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3_t[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1_t[0], MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w2_t[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0_t[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2_t[1], MD5C3f, MD5S33); + + a += MD5M_A; + b += MD5M_B; + c += MD5M_C; + d += MD5M_D; + + u32x r_a = a; + u32x r_b = b; + u32x r_c = c; + u32x r_d = d; + + // 2nd transform + + w0_t[0] = esalt_buf0[ 8]; + w0_t[1] = esalt_buf0[ 9]; + w0_t[2] = esalt_buf0[10]; + w0_t[3] = esalt_buf0[11]; + + w1_t[0] = esalt_buf0[12]; + w1_t[1] = esalt_buf0[13]; + w1_t[2] = esalt_buf0[14]; + w1_t[3] = esalt_buf0[15]; + + w2_t[0] = esalt_buf1[ 0]; + w2_t[1] = esalt_buf1[ 1]; + w2_t[2] = esalt_buf1[ 2]; + w2_t[3] = esalt_buf1[ 3]; + + w3_t[0] = esalt_buf1[ 4]; + w3_t[1] = esalt_buf1[ 5]; + w3_t[2] = esalt_buf1[ 6]; + w3_t[3] = esalt_buf1[ 7]; + + // it is the final block when no more than 55 bytes left + + if (remaining_bytes < 56) + { + // it is the last block ! + + w3_t[2] = digest_esalt_len * 8; + } + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0_t[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0_t[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0_t[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1_t[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1_t[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1_t[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2_t[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2_t[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2_t[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3_t[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3_t[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3_t[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0_t[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1_t[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2_t[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1_t[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1_t[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2_t[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3_t[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0_t[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2_t[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3_t[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0_t[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1_t[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3_t[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H1, a, b, c, d, w1_t[1], MD5C20, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w2_t[0], MD5C21, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w2_t[3], MD5C22, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w3_t[2], MD5C23, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w0_t[1], MD5C24, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w1_t[0], MD5C25, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w1_t[3], MD5C26, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w2_t[2], MD5C27, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w3_t[1], MD5C28, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w0_t[0], MD5C29, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w0_t[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w1_t[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w2_t[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w3_t[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w3_t[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w0_t[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1_t[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3_t[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3_t[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0_t[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0_t[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2_t[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1_t[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3_t[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1_t[0], MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w2_t[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0_t[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2_t[1], MD5C3f, MD5S33); + + // sometimes (not rare at all) we need a third block :( + + if (remaining_bytes > 55) + { + // this is for sure the final block + + a += r_a; + b += r_b; + c += r_c; + d += r_d; + + r_a = a; + r_b = b; + r_c = c; + r_d = d; + + w0_t[0] = esalt_buf1[ 8]; + w0_t[1] = esalt_buf1[ 9]; + w0_t[2] = esalt_buf1[10]; + w0_t[3] = esalt_buf1[11]; + + w1_t[0] = esalt_buf1[12]; + w1_t[1] = esalt_buf1[13]; + w1_t[2] = esalt_buf1[14]; + w1_t[3] = esalt_buf1[15]; + + w2_t[0] = esalt_buf2[ 0]; + w2_t[1] = esalt_buf2[ 1]; + w2_t[2] = esalt_buf2[ 2]; + w2_t[3] = esalt_buf2[ 3]; + + w3_t[0] = esalt_buf2[ 4]; + w3_t[1] = esalt_buf2[ 5]; + w3_t[2] = digest_esalt_len * 8; + w3_t[3] = 0; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0_t[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0_t[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0_t[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1_t[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1_t[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1_t[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2_t[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2_t[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2_t[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3_t[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3_t[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3_t[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0_t[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1_t[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2_t[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1_t[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1_t[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2_t[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3_t[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0_t[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2_t[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3_t[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0_t[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1_t[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3_t[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H1, a, b, c, d, w1_t[1], MD5C20, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w2_t[0], MD5C21, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w2_t[3], MD5C22, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w3_t[2], MD5C23, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w0_t[1], MD5C24, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w1_t[0], MD5C25, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w1_t[3], MD5C26, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w2_t[2], MD5C27, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w3_t[1], MD5C28, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w0_t[0], MD5C29, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w0_t[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w1_t[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w2_t[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w3_t[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w3_t[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w0_t[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1_t[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3_t[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3_t[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0_t[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0_t[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2_t[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1_t[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3_t[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1_t[0], MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w2_t[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0_t[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2_t[1], MD5C3f, MD5S33); + } + + a += r_a; + b += r_b; + c += r_c; + d += r_d; + + const u32x r0 = a; + const u32x r1 = d; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_M + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m11400_m08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const sip_t *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m11400_m16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const sip_t *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m11400_s04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const sip_t *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + /** + * bin2asc table + */ + + l_bin2asc[lid] = c_bin2asc[(lid >> 0) & 15] << 8 + | c_bin2asc[(lid >> 4) & 15] << 0; + + __syncthreads (); + + if (gid >= gid_max) return; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + append_0x80_2 (wordl0, wordl1, pw_l_len); + + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, c_combs[0].pw_len); + } + + /** + * salt + */ + + const u32 salt_len = esalt_bufs[salt_pos].salt_len; // not a bug, we need to get it from the esalt + + u32 salt_buf0[16]; + + salt_buf0[ 0] = esalt_bufs[salt_pos].salt_buf[ 0]; + salt_buf0[ 1] = esalt_bufs[salt_pos].salt_buf[ 1]; + salt_buf0[ 2] = esalt_bufs[salt_pos].salt_buf[ 2]; + salt_buf0[ 3] = esalt_bufs[salt_pos].salt_buf[ 3]; + salt_buf0[ 4] = esalt_bufs[salt_pos].salt_buf[ 4]; + salt_buf0[ 5] = esalt_bufs[salt_pos].salt_buf[ 5]; + salt_buf0[ 6] = esalt_bufs[salt_pos].salt_buf[ 6]; + salt_buf0[ 7] = esalt_bufs[salt_pos].salt_buf[ 7]; + salt_buf0[ 8] = esalt_bufs[salt_pos].salt_buf[ 8]; + salt_buf0[ 9] = esalt_bufs[salt_pos].salt_buf[ 9]; + salt_buf0[10] = esalt_bufs[salt_pos].salt_buf[10]; + salt_buf0[11] = esalt_bufs[salt_pos].salt_buf[11]; + salt_buf0[12] = esalt_bufs[salt_pos].salt_buf[12]; + salt_buf0[13] = esalt_bufs[salt_pos].salt_buf[13]; + salt_buf0[14] = esalt_bufs[salt_pos].salt_buf[14]; + salt_buf0[15] = esalt_bufs[salt_pos].salt_buf[15]; + + u32 salt_buf1[16]; + + salt_buf1[ 0] = esalt_bufs[salt_pos].salt_buf[16]; + salt_buf1[ 1] = esalt_bufs[salt_pos].salt_buf[17]; + salt_buf1[ 2] = esalt_bufs[salt_pos].salt_buf[18]; + salt_buf1[ 3] = esalt_bufs[salt_pos].salt_buf[19]; + salt_buf1[ 4] = esalt_bufs[salt_pos].salt_buf[20]; + salt_buf1[ 5] = esalt_bufs[salt_pos].salt_buf[21]; + salt_buf1[ 6] = esalt_bufs[salt_pos].salt_buf[22]; + salt_buf1[ 7] = esalt_bufs[salt_pos].salt_buf[23]; + salt_buf1[ 8] = esalt_bufs[salt_pos].salt_buf[24]; + salt_buf1[ 9] = esalt_bufs[salt_pos].salt_buf[25]; + salt_buf1[10] = esalt_bufs[salt_pos].salt_buf[26]; + salt_buf1[11] = esalt_bufs[salt_pos].salt_buf[27]; + salt_buf1[12] = esalt_bufs[salt_pos].salt_buf[28]; + salt_buf1[13] = esalt_bufs[salt_pos].salt_buf[29]; + salt_buf1[14] = 0; + salt_buf1[15] = 0; + + /** + * esalt + */ + + const u32 esalt_len = esalt_bufs[salt_pos].esalt_len; + + u32 esalt_buf0[16]; + + esalt_buf0[ 0] = esalt_bufs[salt_pos].esalt_buf[ 0]; + esalt_buf0[ 1] = esalt_bufs[salt_pos].esalt_buf[ 1]; + esalt_buf0[ 2] = esalt_bufs[salt_pos].esalt_buf[ 2]; + esalt_buf0[ 3] = esalt_bufs[salt_pos].esalt_buf[ 3]; + esalt_buf0[ 4] = esalt_bufs[salt_pos].esalt_buf[ 4]; + esalt_buf0[ 5] = esalt_bufs[salt_pos].esalt_buf[ 5]; + esalt_buf0[ 6] = esalt_bufs[salt_pos].esalt_buf[ 6]; + esalt_buf0[ 7] = esalt_bufs[salt_pos].esalt_buf[ 7]; + esalt_buf0[ 8] = esalt_bufs[salt_pos].esalt_buf[ 8]; + esalt_buf0[ 9] = esalt_bufs[salt_pos].esalt_buf[ 9]; + esalt_buf0[10] = esalt_bufs[salt_pos].esalt_buf[10]; + esalt_buf0[11] = esalt_bufs[salt_pos].esalt_buf[11]; + esalt_buf0[12] = esalt_bufs[salt_pos].esalt_buf[12]; + esalt_buf0[13] = esalt_bufs[salt_pos].esalt_buf[13]; + esalt_buf0[14] = esalt_bufs[salt_pos].esalt_buf[14]; + esalt_buf0[15] = esalt_bufs[salt_pos].esalt_buf[15]; + + u32 esalt_buf1[16]; + + esalt_buf1[ 0] = esalt_bufs[salt_pos].esalt_buf[16]; + esalt_buf1[ 1] = esalt_bufs[salt_pos].esalt_buf[17]; + esalt_buf1[ 2] = esalt_bufs[salt_pos].esalt_buf[18]; + esalt_buf1[ 3] = esalt_bufs[salt_pos].esalt_buf[19]; + esalt_buf1[ 4] = esalt_bufs[salt_pos].esalt_buf[20]; + esalt_buf1[ 5] = esalt_bufs[salt_pos].esalt_buf[21]; + esalt_buf1[ 6] = esalt_bufs[salt_pos].esalt_buf[22]; + esalt_buf1[ 7] = esalt_bufs[salt_pos].esalt_buf[23]; + esalt_buf1[ 8] = esalt_bufs[salt_pos].esalt_buf[24]; + esalt_buf1[ 9] = esalt_bufs[salt_pos].esalt_buf[25]; + esalt_buf1[10] = esalt_bufs[salt_pos].esalt_buf[26]; + esalt_buf1[11] = esalt_bufs[salt_pos].esalt_buf[27]; + esalt_buf1[12] = esalt_bufs[salt_pos].esalt_buf[28]; + esalt_buf1[13] = esalt_bufs[salt_pos].esalt_buf[29]; + esalt_buf1[14] = esalt_bufs[salt_pos].esalt_buf[30]; + esalt_buf1[15] = esalt_bufs[salt_pos].esalt_buf[31]; + + u32 esalt_buf2[16]; + + esalt_buf2[ 0] = esalt_bufs[salt_pos].esalt_buf[32]; + esalt_buf2[ 1] = esalt_bufs[salt_pos].esalt_buf[33]; + esalt_buf2[ 2] = esalt_bufs[salt_pos].esalt_buf[34]; + esalt_buf2[ 3] = esalt_bufs[salt_pos].esalt_buf[35]; + esalt_buf2[ 4] = esalt_bufs[salt_pos].esalt_buf[36]; + esalt_buf2[ 5] = esalt_bufs[salt_pos].esalt_buf[37]; + esalt_buf2[ 6] = 0; + esalt_buf2[ 7] = 0; + esalt_buf2[ 8] = 0; + esalt_buf2[ 9] = 0; + esalt_buf2[10] = 0; + esalt_buf2[11] = 0; + esalt_buf2[12] = 0; + esalt_buf2[13] = 0; + esalt_buf2[14] = 0; + esalt_buf2[15] = 0; + + const u32 digest_esalt_len = 32 + esalt_len; + const u32 remaining_bytes = digest_esalt_len + 1 - 64; // substract previous block + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = c_combs[il_pos].pw_len; + + const u32 pw_len = pw_l_len + pw_r_len; + + u32 wordr0[4]; + + wordr0[0] = c_combs[il_pos].i[0]; + wordr0[1] = c_combs[il_pos].i[1]; + wordr0[2] = c_combs[il_pos].i[2]; + wordr0[3] = c_combs[il_pos].i[3]; + + u32 wordr1[4]; + + wordr1[0] = c_combs[il_pos].i[4]; + wordr1[1] = c_combs[il_pos].i[5]; + wordr1[2] = c_combs[il_pos].i[6]; + wordr1[3] = c_combs[il_pos].i[7]; + + u32 wordr2[4]; + + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + + u32 wordr3[4]; + + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + u32x w0[4]; + + w0[0] = wordl0[0] | wordr0[0]; + w0[1] = wordl0[1] | wordr0[1]; + w0[2] = wordl0[2] | wordr0[2]; + w0[3] = wordl0[3] | wordr0[3]; + + u32x w1[4]; + + w1[0] = wordl1[0] | wordr1[0]; + w1[1] = wordl1[1] | wordr1[1]; + w1[2] = wordl1[2] | wordr1[2]; + w1[3] = wordl1[3] | wordr1[3]; + + u32x w2[4]; + + w2[0] = wordl2[0] | wordr2[0]; + w2[1] = wordl2[1] | wordr2[1]; + w2[2] = wordl2[2] | wordr2[2]; + w2[3] = wordl2[3] | wordr2[3]; + + u32x w3[4]; + + w3[0] = wordl3[0] | wordr3[0]; + w3[1] = wordl3[1] | wordr3[1]; + w3[2] = wordl3[2] | wordr3[2]; + w3[3] = wordl3[3] | wordr3[3]; + + const u32 pw_salt_len = salt_len + pw_len; + + /* + * HA1 = md5 ($salt . $pass) + */ + + // append the pass to the salt + + u32x block0[16]; + + block0[ 0] = salt_buf0[ 0]; + block0[ 1] = salt_buf0[ 1]; + block0[ 2] = salt_buf0[ 2]; + block0[ 3] = salt_buf0[ 3]; + block0[ 4] = salt_buf0[ 4]; + block0[ 5] = salt_buf0[ 5]; + block0[ 6] = salt_buf0[ 6]; + block0[ 7] = salt_buf0[ 7]; + block0[ 8] = salt_buf0[ 8]; + block0[ 9] = salt_buf0[ 9]; + block0[10] = salt_buf0[10]; + block0[11] = salt_buf0[11]; + block0[12] = salt_buf0[12]; + block0[13] = salt_buf0[13]; + block0[14] = salt_buf0[14]; + block0[15] = salt_buf0[15]; + + u32x block1[16]; + + block1[ 0] = salt_buf1[ 0]; + block1[ 1] = salt_buf1[ 1]; + block1[ 2] = salt_buf1[ 2]; + block1[ 3] = salt_buf1[ 3]; + block1[ 4] = salt_buf1[ 4]; + block1[ 5] = salt_buf1[ 5]; + block1[ 6] = salt_buf1[ 6]; + block1[ 7] = salt_buf1[ 7]; + block1[ 8] = salt_buf1[ 8]; + block1[ 9] = salt_buf1[ 9]; + block1[10] = salt_buf1[10]; + block1[11] = salt_buf1[11]; + block1[12] = salt_buf1[12]; + block1[13] = salt_buf1[13]; + block1[14] = salt_buf1[14]; + block1[15] = salt_buf1[15]; + + u32 block_len = 0; + + block_len = memcat32 (block0, block1, salt_len, w0, w1, w2, w3, pw_len); + + u32x w0_t[4]; + + w0_t[0] = block0[ 0]; + w0_t[1] = block0[ 1]; + w0_t[2] = block0[ 2]; + w0_t[3] = block0[ 3]; + + u32x w1_t[4]; + + w1_t[0] = block0[ 4]; + w1_t[1] = block0[ 5]; + w1_t[2] = block0[ 6]; + w1_t[3] = block0[ 7]; + + u32x w2_t[4]; + + w2_t[0] = block0[ 8]; + w2_t[1] = block0[ 9]; + w2_t[2] = block0[10]; + w2_t[3] = block0[11]; + + u32x w3_t[4]; + + w3_t[0] = block0[12]; + w3_t[1] = block0[13]; + w3_t[2] = block0[14]; + w3_t[3] = block0[15]; + + if (block_len < 56) + { + w3_t[2] = pw_salt_len * 8; + } + + // md5 + + u32x tmp2; + + u32x a = MD5M_A; + u32x b = MD5M_B; + u32x c = MD5M_C; + u32x d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0_t[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0_t[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0_t[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1_t[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1_t[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1_t[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2_t[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2_t[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2_t[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3_t[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3_t[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3_t[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0_t[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1_t[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2_t[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1_t[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1_t[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2_t[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3_t[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0_t[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2_t[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3_t[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0_t[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1_t[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3_t[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H1, a, b, c, d, w1_t[1], MD5C20, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w2_t[0], MD5C21, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w2_t[3], MD5C22, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w3_t[2], MD5C23, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w0_t[1], MD5C24, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w1_t[0], MD5C25, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w1_t[3], MD5C26, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w2_t[2], MD5C27, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w3_t[1], MD5C28, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w0_t[0], MD5C29, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w0_t[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w1_t[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w2_t[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w3_t[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w3_t[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w0_t[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1_t[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3_t[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3_t[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0_t[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0_t[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2_t[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1_t[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3_t[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1_t[0], MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w2_t[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0_t[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2_t[1], MD5C3f, MD5S33); + + a += MD5M_A; + b += MD5M_B; + c += MD5M_C; + d += MD5M_D; + + if (block_len > 55) + { + u32x r_a = a; + u32x r_b = b; + u32x r_c = c; + u32x r_d = d; + + w0_t[0] = block1[ 0]; + w0_t[1] = block1[ 1]; + w0_t[2] = block1[ 2]; + w0_t[3] = block1[ 3]; + + w1_t[0] = block1[ 4]; + w1_t[1] = block1[ 5]; + w1_t[2] = block1[ 6]; + w1_t[3] = block1[ 7]; + + w2_t[0] = block1[ 8]; + w2_t[1] = block1[ 9]; + w2_t[2] = block1[10]; + w2_t[3] = block1[11]; + + w3_t[0] = block1[12]; + w3_t[1] = block1[13]; + w3_t[2] = pw_salt_len * 8; + w3_t[3] = 0; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0_t[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0_t[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0_t[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1_t[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1_t[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1_t[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2_t[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2_t[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2_t[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3_t[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3_t[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3_t[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0_t[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1_t[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2_t[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1_t[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1_t[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2_t[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3_t[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0_t[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2_t[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3_t[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0_t[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1_t[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3_t[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H1, a, b, c, d, w1_t[1], MD5C20, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w2_t[0], MD5C21, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w2_t[3], MD5C22, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w3_t[2], MD5C23, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w0_t[1], MD5C24, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w1_t[0], MD5C25, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w1_t[3], MD5C26, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w2_t[2], MD5C27, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w3_t[1], MD5C28, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w0_t[0], MD5C29, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w0_t[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w1_t[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w2_t[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w3_t[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w3_t[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w0_t[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1_t[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3_t[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3_t[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0_t[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0_t[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2_t[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1_t[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3_t[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1_t[0], MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w2_t[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0_t[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2_t[1], MD5C3f, MD5S33); + + a += r_a; + b += r_b; + c += r_c; + d += r_d; + } + + /* + * final = md5 ($HA1 . $esalt) + * we have at least 2 MD5 blocks/transformations, but we might need 3 + */ + + w0_t[0] = uint_to_hex_lower8 ((a >> 0) & 255) << 0 + | uint_to_hex_lower8 ((a >> 8) & 255) << 16; + w0_t[1] = uint_to_hex_lower8 ((a >> 16) & 255) << 0 + | uint_to_hex_lower8 ((a >> 24) & 255) << 16; + w0_t[2] = uint_to_hex_lower8 ((b >> 0) & 255) << 0 + | uint_to_hex_lower8 ((b >> 8) & 255) << 16; + w0_t[3] = uint_to_hex_lower8 ((b >> 16) & 255) << 0 + | uint_to_hex_lower8 ((b >> 24) & 255) << 16; + w1_t[0] = uint_to_hex_lower8 ((c >> 0) & 255) << 0 + | uint_to_hex_lower8 ((c >> 8) & 255) << 16; + w1_t[1] = uint_to_hex_lower8 ((c >> 16) & 255) << 0 + | uint_to_hex_lower8 ((c >> 24) & 255) << 16; + w1_t[2] = uint_to_hex_lower8 ((d >> 0) & 255) << 0 + | uint_to_hex_lower8 ((d >> 8) & 255) << 16; + w1_t[3] = uint_to_hex_lower8 ((d >> 16) & 255) << 0 + | uint_to_hex_lower8 ((d >> 24) & 255) << 16; + + w2_t[0] = esalt_buf0[0]; + w2_t[1] = esalt_buf0[1]; + w2_t[2] = esalt_buf0[2]; + w2_t[3] = esalt_buf0[3]; + + w3_t[0] = esalt_buf0[4]; + w3_t[1] = esalt_buf0[5]; + w3_t[2] = esalt_buf0[6]; + w3_t[3] = esalt_buf0[7]; + + // md5 + // 1st transform + + a = MD5M_A; + b = MD5M_B; + c = MD5M_C; + d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0_t[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0_t[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0_t[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1_t[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1_t[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1_t[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2_t[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2_t[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2_t[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3_t[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3_t[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3_t[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0_t[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1_t[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2_t[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1_t[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1_t[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2_t[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3_t[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0_t[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2_t[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3_t[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0_t[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1_t[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3_t[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H1, a, b, c, d, w1_t[1], MD5C20, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w2_t[0], MD5C21, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w2_t[3], MD5C22, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w3_t[2], MD5C23, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w0_t[1], MD5C24, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w1_t[0], MD5C25, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w1_t[3], MD5C26, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w2_t[2], MD5C27, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w3_t[1], MD5C28, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w0_t[0], MD5C29, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w0_t[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w1_t[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w2_t[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w3_t[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w3_t[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w0_t[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1_t[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3_t[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3_t[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0_t[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0_t[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2_t[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1_t[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3_t[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1_t[0], MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w2_t[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0_t[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2_t[1], MD5C3f, MD5S33); + + a += MD5M_A; + b += MD5M_B; + c += MD5M_C; + d += MD5M_D; + + u32x r_a = a; + u32x r_b = b; + u32x r_c = c; + u32x r_d = d; + + // 2nd transform + + w0_t[0] = esalt_buf0[ 8]; + w0_t[1] = esalt_buf0[ 9]; + w0_t[2] = esalt_buf0[10]; + w0_t[3] = esalt_buf0[11]; + + w1_t[0] = esalt_buf0[12]; + w1_t[1] = esalt_buf0[13]; + w1_t[2] = esalt_buf0[14]; + w1_t[3] = esalt_buf0[15]; + + w2_t[0] = esalt_buf1[ 0]; + w2_t[1] = esalt_buf1[ 1]; + w2_t[2] = esalt_buf1[ 2]; + w2_t[3] = esalt_buf1[ 3]; + + w3_t[0] = esalt_buf1[ 4]; + w3_t[1] = esalt_buf1[ 5]; + w3_t[2] = esalt_buf1[ 6]; + w3_t[3] = esalt_buf1[ 7]; + + // it is the final block when no more than 55 bytes left + + if (remaining_bytes < 56) + { + // it is the last block ! + + w3_t[2] = digest_esalt_len * 8; + } + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0_t[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0_t[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0_t[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1_t[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1_t[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1_t[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2_t[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2_t[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2_t[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3_t[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3_t[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3_t[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0_t[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1_t[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2_t[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1_t[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1_t[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2_t[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3_t[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0_t[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2_t[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3_t[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0_t[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1_t[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3_t[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H1, a, b, c, d, w1_t[1], MD5C20, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w2_t[0], MD5C21, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w2_t[3], MD5C22, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w3_t[2], MD5C23, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w0_t[1], MD5C24, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w1_t[0], MD5C25, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w1_t[3], MD5C26, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w2_t[2], MD5C27, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w3_t[1], MD5C28, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w0_t[0], MD5C29, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w0_t[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w1_t[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w2_t[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w3_t[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w3_t[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w0_t[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1_t[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3_t[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3_t[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0_t[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0_t[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2_t[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1_t[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3_t[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1_t[0], MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w2_t[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0_t[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2_t[1], MD5C3f, MD5S33); + + // sometimes (not rare at all) we need a third block :( + + if (remaining_bytes > 55) + { + // this is for sure the final block + + a += r_a; + b += r_b; + c += r_c; + d += r_d; + + r_a = a; + r_b = b; + r_c = c; + r_d = d; + + w0_t[0] = esalt_buf1[ 8]; + w0_t[1] = esalt_buf1[ 9]; + w0_t[2] = esalt_buf1[10]; + w0_t[3] = esalt_buf1[11]; + + w1_t[0] = esalt_buf1[12]; + w1_t[1] = esalt_buf1[13]; + w1_t[2] = esalt_buf1[14]; + w1_t[3] = esalt_buf1[15]; + + w2_t[0] = esalt_buf2[ 0]; + w2_t[1] = esalt_buf2[ 1]; + w2_t[2] = esalt_buf2[ 2]; + w2_t[3] = esalt_buf2[ 3]; + + w3_t[0] = esalt_buf2[ 4]; + w3_t[1] = esalt_buf2[ 5]; + w3_t[2] = digest_esalt_len * 8; + w3_t[3] = 0; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0_t[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0_t[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0_t[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1_t[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1_t[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1_t[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2_t[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2_t[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2_t[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3_t[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3_t[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3_t[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0_t[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1_t[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2_t[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1_t[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1_t[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2_t[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3_t[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0_t[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2_t[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3_t[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0_t[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1_t[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3_t[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H1, a, b, c, d, w1_t[1], MD5C20, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w2_t[0], MD5C21, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w2_t[3], MD5C22, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w3_t[2], MD5C23, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w0_t[1], MD5C24, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w1_t[0], MD5C25, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w1_t[3], MD5C26, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w2_t[2], MD5C27, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w3_t[1], MD5C28, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w0_t[0], MD5C29, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w0_t[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w1_t[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w2_t[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w3_t[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w3_t[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w0_t[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1_t[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3_t[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3_t[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0_t[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0_t[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2_t[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1_t[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3_t[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1_t[0], MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w2_t[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0_t[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2_t[1], MD5C3f, MD5S33); + } + + a += r_a; + b += r_b; + c += r_c; + d += r_d; + + const u32x r0 = a; + const u32x r1 = d; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_S + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m11400_s08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const sip_t *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m11400_s16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const sip_t *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/nv/m11400_a3.cu b/nv/m11400_a3.cu new file mode 100644 index 0000000000..d17c45bac7 --- /dev/null +++ b/nv/m11400_a3.cu @@ -0,0 +1,6095 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _MD5_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW2 +#define VECT_SIZE1 +#endif + +#define DGST_R0 0 +#define DGST_R1 3 +#define DGST_R2 2 +#define DGST_R3 1 + +#include "include/kernel_functions.c" +#include "types_nv.c" +#include "common_nv.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +#ifdef VECT_SIZE1 +#define uint_to_hex_lower8(i) l_bin2asc[(i)] +#endif + +#ifdef VECT_SIZE2 +#define uint_to_hex_lower8(i) u32x (l_bin2asc[(i).x], l_bin2asc[(i).y]) +#endif + +#ifdef VECT_SIZE4 +#define uint_to_hex_lower8(i) u32x (l_bin2asc[(i).x], l_bin2asc[(i).y], l_bin2asc[(i).z], l_bin2asc[(i).w]) +#endif + +__device__ static u32 memcat32 (u32x block0[16], u32x block1[16], const u32 block_len, const u32x append0[4], const u32x append1[4], const u32x append2[4], const u32x append3[4], const u32 append_len) +{ + const u32 mod = block_len & 3; + const u32 div = block_len / 4; + + const int offset_minus_4 = 4 - mod; + + const int selector = (0x76543210 >> (offset_minus_4 * 4)) & 0xffff; + + u32x append0_t[4]; + + append0_t[0] = __byte_perm ( 0, append0[0], selector); + append0_t[1] = __byte_perm (append0[0], append0[1], selector); + append0_t[2] = __byte_perm (append0[1], append0[2], selector); + append0_t[3] = __byte_perm (append0[2], append0[3], selector); + + u32x append1_t[4]; + + append1_t[0] = __byte_perm (append0[3], append1[0], selector); + append1_t[1] = __byte_perm (append1[0], append1[1], selector); + append1_t[2] = __byte_perm (append1[1], append1[2], selector); + append1_t[3] = __byte_perm (append1[2], append1[3], selector); + + u32x append2_t[4]; + + append2_t[0] = __byte_perm (append1[3], append2[0], selector); + append2_t[1] = __byte_perm (append2[0], append2[1], selector); + append2_t[2] = __byte_perm (append2[1], append2[2], selector); + append2_t[3] = __byte_perm (append2[2], append2[3], selector); + + u32x append3_t[4]; + + append3_t[0] = __byte_perm (append2[3], append3[0], selector); + append3_t[1] = __byte_perm (append3[0], append3[1], selector); + append3_t[2] = __byte_perm (append3[1], append3[2], selector); + append3_t[3] = __byte_perm (append3[2], append3[3], selector); + + u32x append4_t[4]; + + append4_t[0] = __byte_perm (append3[3], 0, selector); + append4_t[1] = 0; + append4_t[2] = 0; + append4_t[3] = 0; + + switch (div) + { + case 0: block0[ 0] |= append0_t[0]; + block0[ 1] = append0_t[1]; + block0[ 2] = append0_t[2]; + block0[ 3] = append0_t[3]; + + block0[ 4] = append1_t[0]; + block0[ 5] = append1_t[1]; + block0[ 6] = append1_t[2]; + block0[ 7] = append1_t[3]; + + block0[ 8] = append2_t[0]; + block0[ 9] = append2_t[1]; + block0[10] = append2_t[2]; + block0[11] = append2_t[3]; + + block0[12] = append3_t[0]; + block0[13] = append3_t[1]; + block0[14] = append3_t[2]; + block0[15] = append3_t[3]; + + block1[ 0] = append4_t[0]; + block1[ 1] = append4_t[1]; + block1[ 2] = append4_t[2]; + block1[ 3] = append4_t[3]; + break; + + case 1: block0[ 1] |= append0_t[0]; + block0[ 2] = append0_t[1]; + block0[ 3] = append0_t[2]; + block0[ 4] = append0_t[3]; + + block0[ 5] = append1_t[0]; + block0[ 6] = append1_t[1]; + block0[ 7] = append1_t[2]; + block0[ 8] = append1_t[3]; + + block0[ 9] = append2_t[0]; + block0[10] = append2_t[1]; + block0[11] = append2_t[2]; + block0[12] = append2_t[3]; + + block0[13] = append3_t[0]; + block0[14] = append3_t[1]; + block0[15] = append3_t[2]; + block1[ 0] = append3_t[3]; + + block1[ 1] = append4_t[0]; + block1[ 2] = append4_t[1]; + block1[ 3] = append4_t[2]; + block1[ 4] = append4_t[3]; + break; + + case 2: block0[ 2] |= append0_t[0]; + block0[ 3] = append0_t[1]; + block0[ 4] = append0_t[2]; + block0[ 5] = append0_t[3]; + + block0[ 6] = append1_t[0]; + block0[ 7] = append1_t[1]; + block0[ 8] = append1_t[2]; + block0[ 9] = append1_t[3]; + + block0[10] = append2_t[0]; + block0[11] = append2_t[1]; + block0[12] = append2_t[2]; + block0[13] = append2_t[3]; + + block0[14] = append3_t[0]; + block0[15] = append3_t[1]; + block1[ 0] = append3_t[2]; + block1[ 1] = append3_t[3]; + + block1[ 2] = append4_t[0]; + block1[ 3] = append4_t[1]; + block1[ 4] = append4_t[2]; + block1[ 5] = append4_t[3]; + break; + + case 3: block0[ 3] |= append0_t[0]; + block0[ 4] = append0_t[1]; + block0[ 5] = append0_t[2]; + block0[ 6] = append0_t[3]; + + block0[ 7] = append1_t[0]; + block0[ 8] = append1_t[1]; + block0[ 9] = append1_t[2]; + block0[10] = append1_t[3]; + + block0[11] = append2_t[0]; + block0[12] = append2_t[1]; + block0[13] = append2_t[2]; + block0[14] = append2_t[3]; + + block0[15] = append3_t[0]; + block1[ 0] = append3_t[1]; + block1[ 1] = append3_t[2]; + block1[ 2] = append3_t[3]; + + block1[ 3] = append4_t[0]; + block1[ 4] = append4_t[1]; + block1[ 5] = append4_t[2]; + block1[ 6] = append4_t[3]; + break; + + case 4: block0[ 4] |= append0_t[0]; + block0[ 5] = append0_t[1]; + block0[ 6] = append0_t[2]; + block0[ 7] = append0_t[3]; + + block0[ 8] = append1_t[0]; + block0[ 9] = append1_t[1]; + block0[10] = append1_t[2]; + block0[11] = append1_t[3]; + + block0[12] = append2_t[0]; + block0[13] = append2_t[1]; + block0[14] = append2_t[2]; + block0[15] = append2_t[3]; + + block1[ 0] = append3_t[0]; + block1[ 1] = append3_t[1]; + block1[ 2] = append3_t[2]; + block1[ 3] = append3_t[3]; + + block1[ 4] = append4_t[0]; + block1[ 5] = append4_t[1]; + block1[ 6] = append4_t[2]; + block1[ 7] = append4_t[3]; + break; + + case 5: block0[ 5] |= append0_t[0]; + block0[ 6] = append0_t[1]; + block0[ 7] = append0_t[2]; + block0[ 8] = append0_t[3]; + + block0[ 9] = append1_t[0]; + block0[10] = append1_t[1]; + block0[11] = append1_t[2]; + block0[12] = append1_t[3]; + + block0[13] = append2_t[0]; + block0[14] = append2_t[1]; + block0[15] = append2_t[2]; + block1[ 0] = append2_t[3]; + + block1[ 1] = append3_t[0]; + block1[ 2] = append3_t[1]; + block1[ 3] = append3_t[2]; + block1[ 4] = append3_t[3]; + + block1[ 5] = append4_t[0]; + block1[ 6] = append4_t[1]; + block1[ 7] = append4_t[2]; + block1[ 8] = append4_t[3]; + break; + + case 6: block0[ 6] |= append0_t[0]; + block0[ 7] = append0_t[1]; + block0[ 8] = append0_t[2]; + block0[ 9] = append0_t[3]; + + block0[10] = append1_t[0]; + block0[11] = append1_t[1]; + block0[12] = append1_t[2]; + block0[13] = append1_t[3]; + + block0[14] = append2_t[0]; + block0[15] = append2_t[1]; + block1[ 0] = append2_t[2]; + block1[ 1] = append2_t[3]; + + block1[ 2] = append3_t[0]; + block1[ 3] = append3_t[1]; + block1[ 4] = append3_t[2]; + block1[ 5] = append3_t[3]; + + block1[ 6] = append4_t[0]; + block1[ 7] = append4_t[1]; + block1[ 8] = append4_t[2]; + block1[ 9] = append4_t[3]; + break; + + case 7: block0[ 7] |= append0_t[0]; + block0[ 8] = append0_t[1]; + block0[ 9] = append0_t[2]; + block0[10] = append0_t[3]; + + block0[11] = append1_t[0]; + block0[12] = append1_t[1]; + block0[13] = append1_t[2]; + block0[14] = append1_t[3]; + + block0[15] = append2_t[0]; + block1[ 0] = append2_t[1]; + block1[ 1] = append2_t[2]; + block1[ 2] = append2_t[3]; + + block1[ 3] = append3_t[0]; + block1[ 4] = append3_t[1]; + block1[ 5] = append3_t[2]; + block1[ 6] = append3_t[3]; + + block1[ 7] = append4_t[0]; + block1[ 8] = append4_t[1]; + block1[ 9] = append4_t[2]; + block1[10] = append4_t[3]; + break; + + case 8: block0[ 8] |= append0_t[0]; + block0[ 9] = append0_t[1]; + block0[10] = append0_t[2]; + block0[11] = append0_t[3]; + + block0[12] = append1_t[0]; + block0[13] = append1_t[1]; + block0[14] = append1_t[2]; + block0[15] = append1_t[3]; + + block1[ 0] = append2_t[0]; + block1[ 1] = append2_t[1]; + block1[ 2] = append2_t[2]; + block1[ 3] = append2_t[3]; + + block1[ 4] = append3_t[0]; + block1[ 5] = append3_t[1]; + block1[ 6] = append3_t[2]; + block1[ 7] = append3_t[3]; + + block1[ 8] = append4_t[0]; + block1[ 9] = append4_t[1]; + block1[10] = append4_t[2]; + block1[11] = append4_t[3]; + break; + + case 9: block0[ 9] |= append0_t[0]; + block0[10] = append0_t[1]; + block0[11] = append0_t[2]; + block0[12] = append0_t[3]; + + block0[13] = append1_t[0]; + block0[14] = append1_t[1]; + block0[15] = append1_t[2]; + block1[ 0] = append1_t[3]; + + block1[ 1] = append2_t[0]; + block1[ 2] = append2_t[1]; + block1[ 3] = append2_t[2]; + block1[ 4] = append2_t[3]; + + block1[ 5] = append3_t[0]; + block1[ 6] = append3_t[1]; + block1[ 7] = append3_t[2]; + block1[ 8] = append3_t[3]; + + block1[ 9] = append4_t[0]; + block1[10] = append4_t[1]; + block1[11] = append4_t[2]; + block1[12] = append4_t[3]; + break; + + case 10: block0[10] |= append0_t[0]; + block0[11] = append0_t[1]; + block0[12] = append0_t[2]; + block0[13] = append0_t[3]; + + block0[14] = append1_t[0]; + block0[15] = append1_t[1]; + block1[ 0] = append1_t[2]; + block1[ 1] = append1_t[3]; + + block1[ 2] = append2_t[0]; + block1[ 3] = append2_t[1]; + block1[ 4] = append2_t[2]; + block1[ 5] = append2_t[3]; + + block1[ 6] = append3_t[0]; + block1[ 7] = append3_t[1]; + block1[ 8] = append3_t[2]; + block1[ 9] = append3_t[3]; + + block1[10] = append4_t[0]; + block1[11] = append4_t[1]; + block1[12] = append4_t[2]; + block1[13] = append4_t[3]; + break; + + case 11: block0[11] |= append0_t[0]; + block0[12] = append0_t[1]; + block0[13] = append0_t[2]; + block0[14] = append0_t[3]; + + block0[15] = append1_t[0]; + block1[ 0] = append1_t[1]; + block1[ 1] = append1_t[2]; + block1[ 2] = append1_t[3]; + + block1[ 3] = append2_t[0]; + block1[ 4] = append2_t[1]; + block1[ 5] = append2_t[2]; + block1[ 6] = append2_t[3]; + + block1[ 7] = append3_t[0]; + block1[ 8] = append3_t[1]; + block1[ 9] = append3_t[2]; + block1[10] = append3_t[3]; + + block1[11] = append4_t[0]; + block1[12] = append4_t[1]; + block1[13] = append4_t[2]; + block1[14] = append4_t[3]; + break; + + case 12: block0[12] |= append0_t[0]; + block0[13] = append0_t[1]; + block0[14] = append0_t[2]; + block0[15] = append0_t[3]; + + block1[ 0] = append1_t[0]; + block1[ 1] = append1_t[1]; + block1[ 2] = append1_t[2]; + block1[ 3] = append1_t[3]; + + block1[ 4] = append2_t[0]; + block1[ 5] = append2_t[1]; + block1[ 6] = append2_t[2]; + block1[ 7] = append2_t[3]; + + block1[ 8] = append3_t[0]; + block1[ 9] = append3_t[1]; + block1[10] = append3_t[2]; + block1[11] = append3_t[3]; + + block1[12] = append4_t[0]; + block1[13] = append4_t[1]; + block1[14] = append4_t[2]; + block1[15] = append4_t[3]; + break; + + case 13: block0[13] |= append0_t[0]; + block0[14] = append0_t[1]; + block0[15] = append0_t[2]; + block1[ 0] = append0_t[3]; + + block1[ 1] = append1_t[0]; + block1[ 2] = append1_t[1]; + block1[ 3] = append1_t[2]; + block1[ 4] = append1_t[3]; + + block1[ 5] = append2_t[0]; + block1[ 6] = append2_t[1]; + block1[ 7] = append2_t[2]; + block1[ 8] = append2_t[3]; + + block1[ 9] = append3_t[0]; + block1[10] = append3_t[1]; + block1[11] = append3_t[2]; + block1[12] = append3_t[3]; + + block1[13] = append4_t[0]; + block1[14] = append4_t[1]; + block1[15] = append4_t[2]; + break; + + case 14: block0[14] |= append0_t[0]; + block0[15] = append0_t[1]; + block1[ 0] = append0_t[2]; + block1[ 1] = append0_t[3]; + + block1[ 2] = append1_t[0]; + block1[ 3] = append1_t[1]; + block1[ 4] = append1_t[2]; + block1[ 5] = append1_t[3]; + + block1[ 6] = append2_t[0]; + block1[ 7] = append2_t[1]; + block1[ 8] = append2_t[2]; + block1[ 9] = append2_t[3]; + + block1[10] = append3_t[0]; + block1[11] = append3_t[1]; + block1[12] = append3_t[2]; + block1[13] = append3_t[3]; + + block1[14] = append4_t[0]; + block1[15] = append4_t[1]; + break; + + case 15: block0[15] |= append0_t[0]; + block1[ 0] = append0_t[1]; + block1[ 1] = append0_t[2]; + block1[ 2] = append0_t[3]; + + block1[ 3] = append1_t[1]; + block1[ 4] = append1_t[2]; + block1[ 5] = append1_t[3]; + block1[ 6] = append1_t[0]; + + block1[ 7] = append2_t[0]; + block1[ 8] = append2_t[1]; + block1[ 9] = append2_t[2]; + block1[10] = append2_t[3]; + + block1[11] = append3_t[0]; + block1[12] = append3_t[1]; + block1[13] = append3_t[2]; + block1[14] = append3_t[3]; + + block1[15] = append4_t[0]; + break; + + case 16: block1[ 0] |= append0_t[0]; + block1[ 1] = append0_t[1]; + block1[ 2] = append0_t[2]; + block1[ 3] = append0_t[3]; + + block1[ 4] = append1_t[0]; + block1[ 5] = append1_t[1]; + block1[ 6] = append1_t[2]; + block1[ 7] = append1_t[3]; + + block1[ 8] = append2_t[0]; + block1[ 9] = append2_t[1]; + block1[10] = append2_t[2]; + block1[11] = append2_t[3]; + + block1[12] = append3_t[0]; + block1[13] = append3_t[1]; + block1[14] = append3_t[2]; + block1[15] = append3_t[3]; + break; + + case 17: block1[ 1] |= append0_t[0]; + block1[ 2] = append0_t[1]; + block1[ 3] = append0_t[2]; + block1[ 4] = append0_t[3]; + + block1[ 5] = append1_t[0]; + block1[ 6] = append1_t[1]; + block1[ 7] = append1_t[2]; + block1[ 8] = append1_t[3]; + + block1[ 9] = append2_t[0]; + block1[10] = append2_t[1]; + block1[11] = append2_t[2]; + block1[12] = append2_t[3]; + + block1[13] = append3_t[0]; + block1[14] = append3_t[1]; + block1[15] = append3_t[2]; + break; + + case 18: block1[ 2] |= append0_t[0]; + block1[ 3] = append0_t[1]; + block1[ 4] = append0_t[2]; + block1[ 5] = append0_t[3]; + + block1[ 6] = append1_t[0]; + block1[ 7] = append1_t[1]; + block1[ 8] = append1_t[2]; + block1[ 9] = append1_t[3]; + + block1[10] = append2_t[0]; + block1[11] = append2_t[1]; + block1[12] = append2_t[2]; + block1[13] = append2_t[3]; + + block1[14] = append3_t[0]; + block1[15] = append3_t[1]; + break; + + case 19: block1[ 3] |= append0_t[0]; + block1[ 4] = append0_t[1]; + block1[ 5] = append0_t[2]; + block1[ 6] = append0_t[3]; + + block1[ 7] = append1_t[0]; + block1[ 8] = append1_t[1]; + block1[ 9] = append1_t[2]; + block1[10] = append1_t[3]; + + block1[11] = append2_t[0]; + block1[12] = append2_t[1]; + block1[13] = append2_t[2]; + block1[14] = append2_t[3]; + + block1[15] = append3_t[0]; + break; + + case 20: block1[ 4] |= append0_t[0]; + block1[ 5] = append0_t[1]; + block1[ 6] = append0_t[2]; + block1[ 7] = append0_t[3]; + + block1[ 8] = append1_t[0]; + block1[ 9] = append1_t[1]; + block1[10] = append1_t[2]; + block1[11] = append1_t[3]; + + block1[12] = append2_t[0]; + block1[13] = append2_t[1]; + block1[14] = append2_t[2]; + block1[15] = append2_t[3]; + break; + + case 21: block1[ 5] |= append0_t[0]; + block1[ 6] = append0_t[1]; + block1[ 7] = append0_t[2]; + block1[ 8] = append0_t[3]; + + block1[ 9] = append1_t[0]; + block1[10] = append1_t[1]; + block1[11] = append1_t[2]; + block1[12] = append1_t[3]; + + block1[13] = append2_t[0]; + block1[14] = append2_t[1]; + block1[15] = append2_t[2]; + break; + + case 22: block1[ 6] |= append0_t[0]; + block1[ 7] = append0_t[1]; + block1[ 8] = append0_t[2]; + block1[ 9] = append0_t[3]; + + block1[10] = append1_t[0]; + block1[11] = append1_t[1]; + block1[12] = append1_t[2]; + block1[13] = append1_t[3]; + + block1[14] = append2_t[0]; + block1[15] = append2_t[1]; + break; + + case 23: block1[ 7] |= append0_t[0]; + block1[ 8] = append0_t[1]; + block1[ 9] = append0_t[2]; + block1[10] = append0_t[3]; + + block1[11] = append1_t[0]; + block1[12] = append1_t[1]; + block1[13] = append1_t[2]; + block1[14] = append1_t[3]; + + block1[15] = append2_t[0]; + break; + + case 24: block1[ 8] |= append0_t[0]; + block1[ 9] = append0_t[1]; + block1[10] = append0_t[2]; + block1[11] = append0_t[3]; + + block1[12] = append1_t[0]; + block1[13] = append1_t[1]; + block1[14] = append1_t[2]; + block1[15] = append1_t[3]; + break; + + case 25: block1[ 9] |= append0_t[0]; + block1[10] = append0_t[1]; + block1[11] = append0_t[2]; + block1[12] = append0_t[3]; + + block1[13] = append1_t[0]; + block1[14] = append1_t[1]; + block1[15] = append1_t[2]; + break; + + case 26: block1[10] |= append0_t[0]; + block1[11] = append0_t[1]; + block1[12] = append0_t[2]; + block1[13] = append0_t[3]; + + block1[14] = append1_t[0]; + block1[15] = append1_t[1]; + break; + + case 27: block1[11] |= append0_t[0]; + block1[12] = append0_t[1]; + block1[13] = append0_t[2]; + block1[14] = append0_t[3]; + + block1[15] = append1_t[0]; + break; + + case 28: block1[12] |= append0_t[0]; + block1[13] = append0_t[1]; + block1[14] = append0_t[2]; + block1[15] = append0_t[3]; + break; + + case 29: block1[13] |= append0_t[0]; + block1[14] = append0_t[1]; + block1[15] = append0_t[2]; + break; + + case 30: block1[14] |= append0_t[0]; + block1[15] = append0_t[1]; + break; + } + + u32 new_len = block_len + append_len; + + return new_len; +} + +__device__ __constant__ char c_bin2asc[16] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' }; + +__device__ __shared__ short l_bin2asc[256]; + +__device__ __constant__ bf_t c_bfs[1024]; + +__device__ static void m11400m_0_0 (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], const u32 pw_len, const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const sip_t *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset) +{ + /** + * modifier + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + const u32 lid = threadIdx.x; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * salt + */ + + const u32 salt_len = esalt_bufs[salt_pos].salt_len; // not a bug, we need to get it from the esalt + + const u32 pw_salt_len = salt_len + pw_len; + + u32 salt_buf0[16]; + + salt_buf0[ 0] = esalt_bufs[salt_pos].salt_buf[ 0]; + salt_buf0[ 1] = esalt_bufs[salt_pos].salt_buf[ 1]; + salt_buf0[ 2] = esalt_bufs[salt_pos].salt_buf[ 2]; + salt_buf0[ 3] = esalt_bufs[salt_pos].salt_buf[ 3]; + salt_buf0[ 4] = esalt_bufs[salt_pos].salt_buf[ 4]; + salt_buf0[ 5] = esalt_bufs[salt_pos].salt_buf[ 5]; + salt_buf0[ 6] = esalt_bufs[salt_pos].salt_buf[ 6]; + salt_buf0[ 7] = esalt_bufs[salt_pos].salt_buf[ 7]; + salt_buf0[ 8] = esalt_bufs[salt_pos].salt_buf[ 8]; + salt_buf0[ 9] = esalt_bufs[salt_pos].salt_buf[ 9]; + salt_buf0[10] = esalt_bufs[salt_pos].salt_buf[10]; + salt_buf0[11] = esalt_bufs[salt_pos].salt_buf[11]; + salt_buf0[12] = esalt_bufs[salt_pos].salt_buf[12]; + salt_buf0[13] = esalt_bufs[salt_pos].salt_buf[13]; + salt_buf0[14] = esalt_bufs[salt_pos].salt_buf[14]; + salt_buf0[15] = esalt_bufs[salt_pos].salt_buf[15]; + + u32 salt_buf1[16]; + + salt_buf1[ 0] = esalt_bufs[salt_pos].salt_buf[16]; + salt_buf1[ 1] = esalt_bufs[salt_pos].salt_buf[17]; + salt_buf1[ 2] = esalt_bufs[salt_pos].salt_buf[18]; + salt_buf1[ 3] = esalt_bufs[salt_pos].salt_buf[19]; + salt_buf1[ 4] = esalt_bufs[salt_pos].salt_buf[20]; + salt_buf1[ 5] = esalt_bufs[salt_pos].salt_buf[21]; + salt_buf1[ 6] = esalt_bufs[salt_pos].salt_buf[22]; + salt_buf1[ 7] = esalt_bufs[salt_pos].salt_buf[23]; + salt_buf1[ 8] = esalt_bufs[salt_pos].salt_buf[24]; + salt_buf1[ 9] = esalt_bufs[salt_pos].salt_buf[25]; + salt_buf1[10] = esalt_bufs[salt_pos].salt_buf[26]; + salt_buf1[11] = esalt_bufs[salt_pos].salt_buf[27]; + salt_buf1[12] = esalt_bufs[salt_pos].salt_buf[28]; + salt_buf1[13] = esalt_bufs[salt_pos].salt_buf[29]; + salt_buf1[14] = 0; + salt_buf1[15] = 0; + + /** + * esalt + */ + + const u32 esalt_len = esalt_bufs[salt_pos].esalt_len; + + u32 esalt_buf0[16]; + + esalt_buf0[ 0] = esalt_bufs[salt_pos].esalt_buf[ 0]; + esalt_buf0[ 1] = esalt_bufs[salt_pos].esalt_buf[ 1]; + esalt_buf0[ 2] = esalt_bufs[salt_pos].esalt_buf[ 2]; + esalt_buf0[ 3] = esalt_bufs[salt_pos].esalt_buf[ 3]; + esalt_buf0[ 4] = esalt_bufs[salt_pos].esalt_buf[ 4]; + esalt_buf0[ 5] = esalt_bufs[salt_pos].esalt_buf[ 5]; + esalt_buf0[ 6] = esalt_bufs[salt_pos].esalt_buf[ 6]; + esalt_buf0[ 7] = esalt_bufs[salt_pos].esalt_buf[ 7]; + esalt_buf0[ 8] = esalt_bufs[salt_pos].esalt_buf[ 8]; + esalt_buf0[ 9] = esalt_bufs[salt_pos].esalt_buf[ 9]; + esalt_buf0[10] = esalt_bufs[salt_pos].esalt_buf[10]; + esalt_buf0[11] = esalt_bufs[salt_pos].esalt_buf[11]; + esalt_buf0[12] = esalt_bufs[salt_pos].esalt_buf[12]; + esalt_buf0[13] = esalt_bufs[salt_pos].esalt_buf[13]; + esalt_buf0[14] = esalt_bufs[salt_pos].esalt_buf[14]; + esalt_buf0[15] = esalt_bufs[salt_pos].esalt_buf[15]; + + u32 esalt_buf1[16]; + + esalt_buf1[ 0] = esalt_bufs[salt_pos].esalt_buf[16]; + esalt_buf1[ 1] = esalt_bufs[salt_pos].esalt_buf[17]; + esalt_buf1[ 2] = esalt_bufs[salt_pos].esalt_buf[18]; + esalt_buf1[ 3] = esalt_bufs[salt_pos].esalt_buf[19]; + esalt_buf1[ 4] = esalt_bufs[salt_pos].esalt_buf[20]; + esalt_buf1[ 5] = esalt_bufs[salt_pos].esalt_buf[21]; + esalt_buf1[ 6] = esalt_bufs[salt_pos].esalt_buf[22]; + esalt_buf1[ 7] = esalt_bufs[salt_pos].esalt_buf[23]; + esalt_buf1[ 8] = esalt_bufs[salt_pos].esalt_buf[24]; + esalt_buf1[ 9] = esalt_bufs[salt_pos].esalt_buf[25]; + esalt_buf1[10] = esalt_bufs[salt_pos].esalt_buf[26]; + esalt_buf1[11] = esalt_bufs[salt_pos].esalt_buf[27]; + esalt_buf1[12] = esalt_bufs[salt_pos].esalt_buf[28]; + esalt_buf1[13] = esalt_bufs[salt_pos].esalt_buf[29]; + esalt_buf1[14] = esalt_bufs[salt_pos].esalt_buf[30]; + esalt_buf1[15] = esalt_bufs[salt_pos].esalt_buf[31]; + + const u32 digest_esalt_len = 32 + esalt_len; + + /** + * loop + */ + + u32x w0l = w0[0]; + + for (u32 il_pos = 0; il_pos < bfs_cnt; il_pos++) + { + const u32 w0r = c_bfs[il_pos].i; + + w0[0] = w0l | w0r; + + /* + * HA1 = md5 ($salt . $pass) + */ + + // append the pass to the salt + + u32x block0[16]; + + block0[ 0] = salt_buf0[ 0]; + block0[ 1] = salt_buf0[ 1]; + block0[ 2] = salt_buf0[ 2]; + block0[ 3] = salt_buf0[ 3]; + block0[ 4] = salt_buf0[ 4]; + block0[ 5] = salt_buf0[ 5]; + block0[ 6] = salt_buf0[ 6]; + block0[ 7] = salt_buf0[ 7]; + block0[ 8] = salt_buf0[ 8]; + block0[ 9] = salt_buf0[ 9]; + block0[10] = salt_buf0[10]; + block0[11] = salt_buf0[11]; + block0[12] = salt_buf0[12]; + block0[13] = salt_buf0[13]; + block0[14] = salt_buf0[14]; + block0[15] = salt_buf0[15]; + + u32x block1[16]; + + block1[ 0] = salt_buf1[ 0]; + block1[ 1] = salt_buf1[ 1]; + block1[ 2] = salt_buf1[ 2]; + block1[ 3] = salt_buf1[ 3]; + block1[ 4] = salt_buf1[ 4]; + block1[ 5] = salt_buf1[ 5]; + block1[ 6] = salt_buf1[ 6]; + block1[ 7] = salt_buf1[ 7]; + block1[ 8] = salt_buf1[ 8]; + block1[ 9] = salt_buf1[ 9]; + block1[10] = salt_buf1[10]; + block1[11] = salt_buf1[11]; + block1[12] = salt_buf1[12]; + block1[13] = salt_buf1[13]; + block1[14] = salt_buf1[14]; + block1[15] = salt_buf1[15]; + + memcat32 (block0, block1, salt_len, w0, w1, w2, w3, pw_len); + + u32x w0_t[4]; + + w0_t[0] = block0[ 0]; + w0_t[1] = block0[ 1]; + w0_t[2] = block0[ 2]; + w0_t[3] = block0[ 3]; + + u32x w1_t[4]; + + w1_t[0] = block0[ 4]; + w1_t[1] = block0[ 5]; + w1_t[2] = block0[ 6]; + w1_t[3] = block0[ 7]; + + u32x w2_t[4]; + + w2_t[0] = block0[ 8]; + w2_t[1] = block0[ 9]; + w2_t[2] = block0[10]; + w2_t[3] = block0[11]; + + u32x w3_t[4]; + + w3_t[0] = block0[12]; + w3_t[1] = block0[13]; + w3_t[2] = pw_salt_len * 8; + w3_t[3] = 0; + + // md5 + + u32x tmp2; + + u32x a = MD5M_A; + u32x b = MD5M_B; + u32x c = MD5M_C; + u32x d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0_t[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0_t[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0_t[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1_t[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1_t[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1_t[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2_t[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2_t[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2_t[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3_t[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3_t[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3_t[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0_t[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1_t[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2_t[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1_t[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1_t[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2_t[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3_t[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0_t[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2_t[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3_t[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0_t[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1_t[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3_t[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H1, a, b, c, d, w1_t[1], MD5C20, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w2_t[0], MD5C21, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w2_t[3], MD5C22, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w3_t[2], MD5C23, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w0_t[1], MD5C24, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w1_t[0], MD5C25, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w1_t[3], MD5C26, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w2_t[2], MD5C27, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w3_t[1], MD5C28, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w0_t[0], MD5C29, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w0_t[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w1_t[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w2_t[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w3_t[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w3_t[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w0_t[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1_t[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3_t[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3_t[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0_t[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0_t[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2_t[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1_t[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3_t[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1_t[0], MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w2_t[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0_t[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2_t[1], MD5C3f, MD5S33); + + a += MD5M_A; + b += MD5M_B; + c += MD5M_C; + d += MD5M_D; + + /* + * final = md5 ($HA1 . $esalt) + * we have at least 2 MD5 blocks/transformations, but we might need 3 + */ + + w0_t[0] = uint_to_hex_lower8 ((a >> 0) & 255) << 0 + | uint_to_hex_lower8 ((a >> 8) & 255) << 16; + w0_t[1] = uint_to_hex_lower8 ((a >> 16) & 255) << 0 + | uint_to_hex_lower8 ((a >> 24) & 255) << 16; + w0_t[2] = uint_to_hex_lower8 ((b >> 0) & 255) << 0 + | uint_to_hex_lower8 ((b >> 8) & 255) << 16; + w0_t[3] = uint_to_hex_lower8 ((b >> 16) & 255) << 0 + | uint_to_hex_lower8 ((b >> 24) & 255) << 16; + w1_t[0] = uint_to_hex_lower8 ((c >> 0) & 255) << 0 + | uint_to_hex_lower8 ((c >> 8) & 255) << 16; + w1_t[1] = uint_to_hex_lower8 ((c >> 16) & 255) << 0 + | uint_to_hex_lower8 ((c >> 24) & 255) << 16; + w1_t[2] = uint_to_hex_lower8 ((d >> 0) & 255) << 0 + | uint_to_hex_lower8 ((d >> 8) & 255) << 16; + w1_t[3] = uint_to_hex_lower8 ((d >> 16) & 255) << 0 + | uint_to_hex_lower8 ((d >> 24) & 255) << 16; + + w2_t[0] = esalt_buf0[0]; + w2_t[1] = esalt_buf0[1]; + w2_t[2] = esalt_buf0[2]; + w2_t[3] = esalt_buf0[3]; + + w3_t[0] = esalt_buf0[4]; + w3_t[1] = esalt_buf0[5]; + w3_t[2] = esalt_buf0[6]; + w3_t[3] = esalt_buf0[7]; + + // md5 + // 1st transform + + a = MD5M_A; + b = MD5M_B; + c = MD5M_C; + d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0_t[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0_t[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0_t[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1_t[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1_t[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1_t[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2_t[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2_t[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2_t[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3_t[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3_t[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3_t[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0_t[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1_t[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2_t[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1_t[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1_t[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2_t[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3_t[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0_t[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2_t[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3_t[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0_t[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1_t[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3_t[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H1, a, b, c, d, w1_t[1], MD5C20, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w2_t[0], MD5C21, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w2_t[3], MD5C22, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w3_t[2], MD5C23, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w0_t[1], MD5C24, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w1_t[0], MD5C25, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w1_t[3], MD5C26, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w2_t[2], MD5C27, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w3_t[1], MD5C28, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w0_t[0], MD5C29, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w0_t[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w1_t[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w2_t[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w3_t[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w3_t[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w0_t[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1_t[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3_t[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3_t[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0_t[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0_t[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2_t[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1_t[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3_t[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1_t[0], MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w2_t[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0_t[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2_t[1], MD5C3f, MD5S33); + + a += MD5M_A; + b += MD5M_B; + c += MD5M_C; + d += MD5M_D; + + u32x r_a = a; + u32x r_b = b; + u32x r_c = c; + u32x r_d = d; + + // 2nd transform + + w0_t[0] = esalt_buf0[ 8]; + w0_t[1] = esalt_buf0[ 9]; + w0_t[2] = esalt_buf0[10]; + w0_t[3] = esalt_buf0[11]; + + w1_t[0] = esalt_buf0[12]; + w1_t[1] = esalt_buf0[13]; + w1_t[2] = esalt_buf0[14]; + w1_t[3] = esalt_buf0[15]; + + w2_t[0] = esalt_buf1[ 0]; + w2_t[1] = esalt_buf1[ 1]; + w2_t[2] = esalt_buf1[ 2]; + w2_t[3] = esalt_buf1[ 3]; + + w3_t[0] = esalt_buf1[ 4]; + w3_t[1] = esalt_buf1[ 5]; + w3_t[2] = digest_esalt_len * 8; + w3_t[3] = 0; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0_t[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0_t[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0_t[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1_t[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1_t[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1_t[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2_t[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2_t[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2_t[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3_t[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3_t[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3_t[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0_t[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1_t[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2_t[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1_t[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1_t[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2_t[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3_t[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0_t[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2_t[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3_t[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0_t[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1_t[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3_t[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H1, a, b, c, d, w1_t[1], MD5C20, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w2_t[0], MD5C21, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w2_t[3], MD5C22, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w3_t[2], MD5C23, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w0_t[1], MD5C24, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w1_t[0], MD5C25, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w1_t[3], MD5C26, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w2_t[2], MD5C27, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w3_t[1], MD5C28, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w0_t[0], MD5C29, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w0_t[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w1_t[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w2_t[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w3_t[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w3_t[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w0_t[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1_t[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3_t[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3_t[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0_t[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0_t[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2_t[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1_t[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3_t[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1_t[0], MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w2_t[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0_t[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2_t[1], MD5C3f, MD5S33); + + a += r_a; + b += r_b; + c += r_c; + d += r_d; + + const u32x r0 = a; + const u32x r1 = d; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_S + } +} + +__device__ static void m11400m_0_1 (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], const u32 pw_len, const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const sip_t *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset) +{ + /** + * modifier + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + const u32 lid = threadIdx.x; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * salt + */ + + const u32 salt_len = esalt_bufs[salt_pos].salt_len; // not a bug, we need to get it from the esalt + + const u32 pw_salt_len = salt_len + pw_len; + + u32 salt_buf0[16]; + + salt_buf0[ 0] = esalt_bufs[salt_pos].salt_buf[ 0]; + salt_buf0[ 1] = esalt_bufs[salt_pos].salt_buf[ 1]; + salt_buf0[ 2] = esalt_bufs[salt_pos].salt_buf[ 2]; + salt_buf0[ 3] = esalt_bufs[salt_pos].salt_buf[ 3]; + salt_buf0[ 4] = esalt_bufs[salt_pos].salt_buf[ 4]; + salt_buf0[ 5] = esalt_bufs[salt_pos].salt_buf[ 5]; + salt_buf0[ 6] = esalt_bufs[salt_pos].salt_buf[ 6]; + salt_buf0[ 7] = esalt_bufs[salt_pos].salt_buf[ 7]; + salt_buf0[ 8] = esalt_bufs[salt_pos].salt_buf[ 8]; + salt_buf0[ 9] = esalt_bufs[salt_pos].salt_buf[ 9]; + salt_buf0[10] = esalt_bufs[salt_pos].salt_buf[10]; + salt_buf0[11] = esalt_bufs[salt_pos].salt_buf[11]; + salt_buf0[12] = esalt_bufs[salt_pos].salt_buf[12]; + salt_buf0[13] = esalt_bufs[salt_pos].salt_buf[13]; + salt_buf0[14] = esalt_bufs[salt_pos].salt_buf[14]; + salt_buf0[15] = esalt_bufs[salt_pos].salt_buf[15]; + + u32 salt_buf1[16]; + + salt_buf1[ 0] = esalt_bufs[salt_pos].salt_buf[16]; + salt_buf1[ 1] = esalt_bufs[salt_pos].salt_buf[17]; + salt_buf1[ 2] = esalt_bufs[salt_pos].salt_buf[18]; + salt_buf1[ 3] = esalt_bufs[salt_pos].salt_buf[19]; + salt_buf1[ 4] = esalt_bufs[salt_pos].salt_buf[20]; + salt_buf1[ 5] = esalt_bufs[salt_pos].salt_buf[21]; + salt_buf1[ 6] = esalt_bufs[salt_pos].salt_buf[22]; + salt_buf1[ 7] = esalt_bufs[salt_pos].salt_buf[23]; + salt_buf1[ 8] = esalt_bufs[salt_pos].salt_buf[24]; + salt_buf1[ 9] = esalt_bufs[salt_pos].salt_buf[25]; + salt_buf1[10] = esalt_bufs[salt_pos].salt_buf[26]; + salt_buf1[11] = esalt_bufs[salt_pos].salt_buf[27]; + salt_buf1[12] = esalt_bufs[salt_pos].salt_buf[28]; + salt_buf1[13] = esalt_bufs[salt_pos].salt_buf[29]; + salt_buf1[14] = 0; + salt_buf1[15] = 0; + + /** + * esalt + */ + + const u32 esalt_len = esalt_bufs[salt_pos].esalt_len; + + u32 esalt_buf0[16]; + + esalt_buf0[ 0] = esalt_bufs[salt_pos].esalt_buf[ 0]; + esalt_buf0[ 1] = esalt_bufs[salt_pos].esalt_buf[ 1]; + esalt_buf0[ 2] = esalt_bufs[salt_pos].esalt_buf[ 2]; + esalt_buf0[ 3] = esalt_bufs[salt_pos].esalt_buf[ 3]; + esalt_buf0[ 4] = esalt_bufs[salt_pos].esalt_buf[ 4]; + esalt_buf0[ 5] = esalt_bufs[salt_pos].esalt_buf[ 5]; + esalt_buf0[ 6] = esalt_bufs[salt_pos].esalt_buf[ 6]; + esalt_buf0[ 7] = esalt_bufs[salt_pos].esalt_buf[ 7]; + esalt_buf0[ 8] = esalt_bufs[salt_pos].esalt_buf[ 8]; + esalt_buf0[ 9] = esalt_bufs[salt_pos].esalt_buf[ 9]; + esalt_buf0[10] = esalt_bufs[salt_pos].esalt_buf[10]; + esalt_buf0[11] = esalt_bufs[salt_pos].esalt_buf[11]; + esalt_buf0[12] = esalt_bufs[salt_pos].esalt_buf[12]; + esalt_buf0[13] = esalt_bufs[salt_pos].esalt_buf[13]; + esalt_buf0[14] = esalt_bufs[salt_pos].esalt_buf[14]; + esalt_buf0[15] = esalt_bufs[salt_pos].esalt_buf[15]; + + u32 esalt_buf1[16]; + + esalt_buf1[ 0] = esalt_bufs[salt_pos].esalt_buf[16]; + esalt_buf1[ 1] = esalt_bufs[salt_pos].esalt_buf[17]; + esalt_buf1[ 2] = esalt_bufs[salt_pos].esalt_buf[18]; + esalt_buf1[ 3] = esalt_bufs[salt_pos].esalt_buf[19]; + esalt_buf1[ 4] = esalt_bufs[salt_pos].esalt_buf[20]; + esalt_buf1[ 5] = esalt_bufs[salt_pos].esalt_buf[21]; + esalt_buf1[ 6] = esalt_bufs[salt_pos].esalt_buf[22]; + esalt_buf1[ 7] = esalt_bufs[salt_pos].esalt_buf[23]; + esalt_buf1[ 8] = esalt_bufs[salt_pos].esalt_buf[24]; + esalt_buf1[ 9] = esalt_bufs[salt_pos].esalt_buf[25]; + esalt_buf1[10] = esalt_bufs[salt_pos].esalt_buf[26]; + esalt_buf1[11] = esalt_bufs[salt_pos].esalt_buf[27]; + esalt_buf1[12] = esalt_bufs[salt_pos].esalt_buf[28]; + esalt_buf1[13] = esalt_bufs[salt_pos].esalt_buf[29]; + esalt_buf1[14] = esalt_bufs[salt_pos].esalt_buf[30]; + esalt_buf1[15] = esalt_bufs[salt_pos].esalt_buf[31]; + + u32 esalt_buf2[16]; + + esalt_buf2[ 0] = esalt_bufs[salt_pos].esalt_buf[32]; + esalt_buf2[ 1] = esalt_bufs[salt_pos].esalt_buf[33]; + esalt_buf2[ 2] = esalt_bufs[salt_pos].esalt_buf[34]; + esalt_buf2[ 3] = esalt_bufs[salt_pos].esalt_buf[35]; + esalt_buf2[ 4] = esalt_bufs[salt_pos].esalt_buf[36]; + esalt_buf2[ 5] = esalt_bufs[salt_pos].esalt_buf[37]; + esalt_buf2[ 6] = 0; + esalt_buf2[ 7] = 0; + esalt_buf2[ 8] = 0; + esalt_buf2[ 9] = 0; + esalt_buf2[10] = 0; + esalt_buf2[11] = 0; + esalt_buf2[12] = 0; + esalt_buf2[13] = 0; + esalt_buf2[14] = 0; + esalt_buf2[15] = 0; + + const u32 digest_esalt_len = 32 + esalt_len; + + /** + * loop + */ + + u32x w0l = w0[0]; + + for (u32 il_pos = 0; il_pos < bfs_cnt; il_pos++) + { + const u32 w0r = c_bfs[il_pos].i; + + w0[0] = w0l | w0r; + + /* + * HA1 = md5 ($salt . $pass) + */ + + // append the pass to the salt + + u32x block0[16]; + + block0[ 0] = salt_buf0[ 0]; + block0[ 1] = salt_buf0[ 1]; + block0[ 2] = salt_buf0[ 2]; + block0[ 3] = salt_buf0[ 3]; + block0[ 4] = salt_buf0[ 4]; + block0[ 5] = salt_buf0[ 5]; + block0[ 6] = salt_buf0[ 6]; + block0[ 7] = salt_buf0[ 7]; + block0[ 8] = salt_buf0[ 8]; + block0[ 9] = salt_buf0[ 9]; + block0[10] = salt_buf0[10]; + block0[11] = salt_buf0[11]; + block0[12] = salt_buf0[12]; + block0[13] = salt_buf0[13]; + block0[14] = salt_buf0[14]; + block0[15] = salt_buf0[15]; + + u32x block1[16]; + + block1[ 0] = salt_buf1[ 0]; + block1[ 1] = salt_buf1[ 1]; + block1[ 2] = salt_buf1[ 2]; + block1[ 3] = salt_buf1[ 3]; + block1[ 4] = salt_buf1[ 4]; + block1[ 5] = salt_buf1[ 5]; + block1[ 6] = salt_buf1[ 6]; + block1[ 7] = salt_buf1[ 7]; + block1[ 8] = salt_buf1[ 8]; + block1[ 9] = salt_buf1[ 9]; + block1[10] = salt_buf1[10]; + block1[11] = salt_buf1[11]; + block1[12] = salt_buf1[12]; + block1[13] = salt_buf1[13]; + block1[14] = salt_buf1[14]; + block1[15] = salt_buf1[15]; + + memcat32 (block0, block1, salt_len, w0, w1, w2, w3, pw_len); + + u32x w0_t[4]; + + w0_t[0] = block0[ 0]; + w0_t[1] = block0[ 1]; + w0_t[2] = block0[ 2]; + w0_t[3] = block0[ 3]; + + u32x w1_t[4]; + + w1_t[0] = block0[ 4]; + w1_t[1] = block0[ 5]; + w1_t[2] = block0[ 6]; + w1_t[3] = block0[ 7]; + + u32x w2_t[4]; + + w2_t[0] = block0[ 8]; + w2_t[1] = block0[ 9]; + w2_t[2] = block0[10]; + w2_t[3] = block0[11]; + + u32x w3_t[4]; + + w3_t[0] = block0[12]; + w3_t[1] = block0[13]; + w3_t[2] = pw_salt_len * 8; + w3_t[3] = 0; + + // md5 + + u32x tmp2; + + u32x a = MD5M_A; + u32x b = MD5M_B; + u32x c = MD5M_C; + u32x d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0_t[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0_t[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0_t[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1_t[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1_t[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1_t[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2_t[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2_t[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2_t[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3_t[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3_t[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3_t[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0_t[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1_t[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2_t[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1_t[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1_t[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2_t[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3_t[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0_t[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2_t[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3_t[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0_t[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1_t[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3_t[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H1, a, b, c, d, w1_t[1], MD5C20, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w2_t[0], MD5C21, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w2_t[3], MD5C22, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w3_t[2], MD5C23, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w0_t[1], MD5C24, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w1_t[0], MD5C25, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w1_t[3], MD5C26, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w2_t[2], MD5C27, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w3_t[1], MD5C28, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w0_t[0], MD5C29, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w0_t[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w1_t[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w2_t[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w3_t[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w3_t[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w0_t[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1_t[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3_t[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3_t[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0_t[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0_t[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2_t[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1_t[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3_t[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1_t[0], MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w2_t[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0_t[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2_t[1], MD5C3f, MD5S33); + + a += MD5M_A; + b += MD5M_B; + c += MD5M_C; + d += MD5M_D; + + /* + * final = md5 ($HA1 . $esalt) + * we have at least 2 MD5 blocks/transformations, but we might need 3 + */ + + w0_t[0] = uint_to_hex_lower8 ((a >> 0) & 255) << 0 + | uint_to_hex_lower8 ((a >> 8) & 255) << 16; + w0_t[1] = uint_to_hex_lower8 ((a >> 16) & 255) << 0 + | uint_to_hex_lower8 ((a >> 24) & 255) << 16; + w0_t[2] = uint_to_hex_lower8 ((b >> 0) & 255) << 0 + | uint_to_hex_lower8 ((b >> 8) & 255) << 16; + w0_t[3] = uint_to_hex_lower8 ((b >> 16) & 255) << 0 + | uint_to_hex_lower8 ((b >> 24) & 255) << 16; + w1_t[0] = uint_to_hex_lower8 ((c >> 0) & 255) << 0 + | uint_to_hex_lower8 ((c >> 8) & 255) << 16; + w1_t[1] = uint_to_hex_lower8 ((c >> 16) & 255) << 0 + | uint_to_hex_lower8 ((c >> 24) & 255) << 16; + w1_t[2] = uint_to_hex_lower8 ((d >> 0) & 255) << 0 + | uint_to_hex_lower8 ((d >> 8) & 255) << 16; + w1_t[3] = uint_to_hex_lower8 ((d >> 16) & 255) << 0 + | uint_to_hex_lower8 ((d >> 24) & 255) << 16; + + w2_t[0] = esalt_buf0[0]; + w2_t[1] = esalt_buf0[1]; + w2_t[2] = esalt_buf0[2]; + w2_t[3] = esalt_buf0[3]; + + w3_t[0] = esalt_buf0[4]; + w3_t[1] = esalt_buf0[5]; + w3_t[2] = esalt_buf0[6]; + w3_t[3] = esalt_buf0[7]; + + // md5 + // 1st transform + + a = MD5M_A; + b = MD5M_B; + c = MD5M_C; + d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0_t[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0_t[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0_t[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1_t[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1_t[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1_t[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2_t[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2_t[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2_t[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3_t[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3_t[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3_t[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0_t[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1_t[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2_t[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1_t[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1_t[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2_t[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3_t[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0_t[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2_t[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3_t[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0_t[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1_t[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3_t[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H1, a, b, c, d, w1_t[1], MD5C20, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w2_t[0], MD5C21, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w2_t[3], MD5C22, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w3_t[2], MD5C23, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w0_t[1], MD5C24, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w1_t[0], MD5C25, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w1_t[3], MD5C26, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w2_t[2], MD5C27, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w3_t[1], MD5C28, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w0_t[0], MD5C29, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w0_t[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w1_t[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w2_t[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w3_t[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w3_t[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w0_t[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1_t[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3_t[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3_t[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0_t[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0_t[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2_t[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1_t[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3_t[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1_t[0], MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w2_t[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0_t[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2_t[1], MD5C3f, MD5S33); + + a += MD5M_A; + b += MD5M_B; + c += MD5M_C; + d += MD5M_D; + + u32x r_a = a; + u32x r_b = b; + u32x r_c = c; + u32x r_d = d; + + // 2nd transform + + w0_t[0] = esalt_buf0[ 8]; + w0_t[1] = esalt_buf0[ 9]; + w0_t[2] = esalt_buf0[10]; + w0_t[3] = esalt_buf0[11]; + + w1_t[0] = esalt_buf0[12]; + w1_t[1] = esalt_buf0[13]; + w1_t[2] = esalt_buf0[14]; + w1_t[3] = esalt_buf0[15]; + + w2_t[0] = esalt_buf1[ 0]; + w2_t[1] = esalt_buf1[ 1]; + w2_t[2] = esalt_buf1[ 2]; + w2_t[3] = esalt_buf1[ 3]; + + w3_t[0] = esalt_buf1[ 4]; + w3_t[1] = esalt_buf1[ 5]; + w3_t[2] = esalt_buf1[ 6]; + w3_t[3] = esalt_buf1[ 7]; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0_t[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0_t[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0_t[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1_t[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1_t[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1_t[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2_t[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2_t[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2_t[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3_t[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3_t[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3_t[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0_t[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1_t[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2_t[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1_t[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1_t[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2_t[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3_t[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0_t[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2_t[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3_t[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0_t[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1_t[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3_t[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H1, a, b, c, d, w1_t[1], MD5C20, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w2_t[0], MD5C21, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w2_t[3], MD5C22, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w3_t[2], MD5C23, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w0_t[1], MD5C24, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w1_t[0], MD5C25, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w1_t[3], MD5C26, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w2_t[2], MD5C27, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w3_t[1], MD5C28, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w0_t[0], MD5C29, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w0_t[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w1_t[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w2_t[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w3_t[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w3_t[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w0_t[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1_t[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3_t[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3_t[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0_t[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0_t[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2_t[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1_t[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3_t[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1_t[0], MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w2_t[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0_t[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2_t[1], MD5C3f, MD5S33); + + // this is for sure the final block + + a += r_a; + b += r_b; + c += r_c; + d += r_d; + + r_a = a; + r_b = b; + r_c = c; + r_d = d; + + w0_t[0] = esalt_buf1[ 8]; + w0_t[1] = esalt_buf1[ 9]; + w0_t[2] = esalt_buf1[10]; + w0_t[3] = esalt_buf1[11]; + + w1_t[0] = esalt_buf1[12]; + w1_t[1] = esalt_buf1[13]; + w1_t[2] = esalt_buf1[14]; + w1_t[3] = esalt_buf1[15]; + + w2_t[0] = esalt_buf2[ 0]; + w2_t[1] = esalt_buf2[ 1]; + w2_t[2] = esalt_buf2[ 2]; + w2_t[3] = esalt_buf2[ 3]; + + w3_t[0] = esalt_buf2[ 4]; + w3_t[1] = esalt_buf2[ 5]; + w3_t[2] = digest_esalt_len * 8; + w3_t[3] = 0; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0_t[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0_t[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0_t[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1_t[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1_t[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1_t[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2_t[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2_t[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2_t[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3_t[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3_t[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3_t[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0_t[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1_t[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2_t[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1_t[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1_t[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2_t[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3_t[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0_t[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2_t[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3_t[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0_t[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1_t[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3_t[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H1, a, b, c, d, w1_t[1], MD5C20, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w2_t[0], MD5C21, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w2_t[3], MD5C22, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w3_t[2], MD5C23, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w0_t[1], MD5C24, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w1_t[0], MD5C25, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w1_t[3], MD5C26, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w2_t[2], MD5C27, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w3_t[1], MD5C28, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w0_t[0], MD5C29, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w0_t[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w1_t[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w2_t[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w3_t[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w3_t[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w0_t[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1_t[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3_t[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3_t[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0_t[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0_t[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2_t[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1_t[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3_t[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1_t[0], MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w2_t[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0_t[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2_t[1], MD5C3f, MD5S33); + + a += r_a; + b += r_b; + c += r_c; + d += r_d; + + const u32x r0 = a; + const u32x r1 = d; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_S + } +} + +__device__ static void m11400m_1_0 (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], const u32 pw_len, const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const sip_t *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset) +{ + /** + * modifier + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + const u32 lid = threadIdx.x; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * salt + */ + + const u32 salt_len = esalt_bufs[salt_pos].salt_len; // not a bug, we need to get it from the esalt + + const u32 pw_salt_len = salt_len + pw_len; + + u32 salt_buf0[16]; + + salt_buf0[ 0] = esalt_bufs[salt_pos].salt_buf[ 0]; + salt_buf0[ 1] = esalt_bufs[salt_pos].salt_buf[ 1]; + salt_buf0[ 2] = esalt_bufs[salt_pos].salt_buf[ 2]; + salt_buf0[ 3] = esalt_bufs[salt_pos].salt_buf[ 3]; + salt_buf0[ 4] = esalt_bufs[salt_pos].salt_buf[ 4]; + salt_buf0[ 5] = esalt_bufs[salt_pos].salt_buf[ 5]; + salt_buf0[ 6] = esalt_bufs[salt_pos].salt_buf[ 6]; + salt_buf0[ 7] = esalt_bufs[salt_pos].salt_buf[ 7]; + salt_buf0[ 8] = esalt_bufs[salt_pos].salt_buf[ 8]; + salt_buf0[ 9] = esalt_bufs[salt_pos].salt_buf[ 9]; + salt_buf0[10] = esalt_bufs[salt_pos].salt_buf[10]; + salt_buf0[11] = esalt_bufs[salt_pos].salt_buf[11]; + salt_buf0[12] = esalt_bufs[salt_pos].salt_buf[12]; + salt_buf0[13] = esalt_bufs[salt_pos].salt_buf[13]; + salt_buf0[14] = esalt_bufs[salt_pos].salt_buf[14]; + salt_buf0[15] = esalt_bufs[salt_pos].salt_buf[15]; + + u32 salt_buf1[16]; + + salt_buf1[ 0] = esalt_bufs[salt_pos].salt_buf[16]; + salt_buf1[ 1] = esalt_bufs[salt_pos].salt_buf[17]; + salt_buf1[ 2] = esalt_bufs[salt_pos].salt_buf[18]; + salt_buf1[ 3] = esalt_bufs[salt_pos].salt_buf[19]; + salt_buf1[ 4] = esalt_bufs[salt_pos].salt_buf[20]; + salt_buf1[ 5] = esalt_bufs[salt_pos].salt_buf[21]; + salt_buf1[ 6] = esalt_bufs[salt_pos].salt_buf[22]; + salt_buf1[ 7] = esalt_bufs[salt_pos].salt_buf[23]; + salt_buf1[ 8] = esalt_bufs[salt_pos].salt_buf[24]; + salt_buf1[ 9] = esalt_bufs[salt_pos].salt_buf[25]; + salt_buf1[10] = esalt_bufs[salt_pos].salt_buf[26]; + salt_buf1[11] = esalt_bufs[salt_pos].salt_buf[27]; + salt_buf1[12] = esalt_bufs[salt_pos].salt_buf[28]; + salt_buf1[13] = esalt_bufs[salt_pos].salt_buf[29]; + salt_buf1[14] = 0; + salt_buf1[15] = 0; + + /** + * esalt + */ + + const u32 esalt_len = esalt_bufs[salt_pos].esalt_len; + + u32 esalt_buf0[16]; + + esalt_buf0[ 0] = esalt_bufs[salt_pos].esalt_buf[ 0]; + esalt_buf0[ 1] = esalt_bufs[salt_pos].esalt_buf[ 1]; + esalt_buf0[ 2] = esalt_bufs[salt_pos].esalt_buf[ 2]; + esalt_buf0[ 3] = esalt_bufs[salt_pos].esalt_buf[ 3]; + esalt_buf0[ 4] = esalt_bufs[salt_pos].esalt_buf[ 4]; + esalt_buf0[ 5] = esalt_bufs[salt_pos].esalt_buf[ 5]; + esalt_buf0[ 6] = esalt_bufs[salt_pos].esalt_buf[ 6]; + esalt_buf0[ 7] = esalt_bufs[salt_pos].esalt_buf[ 7]; + esalt_buf0[ 8] = esalt_bufs[salt_pos].esalt_buf[ 8]; + esalt_buf0[ 9] = esalt_bufs[salt_pos].esalt_buf[ 9]; + esalt_buf0[10] = esalt_bufs[salt_pos].esalt_buf[10]; + esalt_buf0[11] = esalt_bufs[salt_pos].esalt_buf[11]; + esalt_buf0[12] = esalt_bufs[salt_pos].esalt_buf[12]; + esalt_buf0[13] = esalt_bufs[salt_pos].esalt_buf[13]; + esalt_buf0[14] = esalt_bufs[salt_pos].esalt_buf[14]; + esalt_buf0[15] = esalt_bufs[salt_pos].esalt_buf[15]; + + u32 esalt_buf1[16]; + + esalt_buf1[ 0] = esalt_bufs[salt_pos].esalt_buf[16]; + esalt_buf1[ 1] = esalt_bufs[salt_pos].esalt_buf[17]; + esalt_buf1[ 2] = esalt_bufs[salt_pos].esalt_buf[18]; + esalt_buf1[ 3] = esalt_bufs[salt_pos].esalt_buf[19]; + esalt_buf1[ 4] = esalt_bufs[salt_pos].esalt_buf[20]; + esalt_buf1[ 5] = esalt_bufs[salt_pos].esalt_buf[21]; + esalt_buf1[ 6] = esalt_bufs[salt_pos].esalt_buf[22]; + esalt_buf1[ 7] = esalt_bufs[salt_pos].esalt_buf[23]; + esalt_buf1[ 8] = esalt_bufs[salt_pos].esalt_buf[24]; + esalt_buf1[ 9] = esalt_bufs[salt_pos].esalt_buf[25]; + esalt_buf1[10] = esalt_bufs[salt_pos].esalt_buf[26]; + esalt_buf1[11] = esalt_bufs[salt_pos].esalt_buf[27]; + esalt_buf1[12] = esalt_bufs[salt_pos].esalt_buf[28]; + esalt_buf1[13] = esalt_bufs[salt_pos].esalt_buf[29]; + esalt_buf1[14] = esalt_bufs[salt_pos].esalt_buf[30]; + esalt_buf1[15] = esalt_bufs[salt_pos].esalt_buf[31]; + + const u32 digest_esalt_len = 32 + esalt_len; + + /** + * loop + */ + + u32x w0l = w0[0]; + + for (u32 il_pos = 0; il_pos < bfs_cnt; il_pos++) + { + const u32 w0r = c_bfs[il_pos].i; + + w0[0] = w0l | w0r; + + /* + * HA1 = md5 ($salt . $pass) + */ + + // append the pass to the salt + + u32x block0[16]; + + block0[ 0] = salt_buf0[ 0]; + block0[ 1] = salt_buf0[ 1]; + block0[ 2] = salt_buf0[ 2]; + block0[ 3] = salt_buf0[ 3]; + block0[ 4] = salt_buf0[ 4]; + block0[ 5] = salt_buf0[ 5]; + block0[ 6] = salt_buf0[ 6]; + block0[ 7] = salt_buf0[ 7]; + block0[ 8] = salt_buf0[ 8]; + block0[ 9] = salt_buf0[ 9]; + block0[10] = salt_buf0[10]; + block0[11] = salt_buf0[11]; + block0[12] = salt_buf0[12]; + block0[13] = salt_buf0[13]; + block0[14] = salt_buf0[14]; + block0[15] = salt_buf0[15]; + + u32x block1[16]; + + block1[ 0] = salt_buf1[ 0]; + block1[ 1] = salt_buf1[ 1]; + block1[ 2] = salt_buf1[ 2]; + block1[ 3] = salt_buf1[ 3]; + block1[ 4] = salt_buf1[ 4]; + block1[ 5] = salt_buf1[ 5]; + block1[ 6] = salt_buf1[ 6]; + block1[ 7] = salt_buf1[ 7]; + block1[ 8] = salt_buf1[ 8]; + block1[ 9] = salt_buf1[ 9]; + block1[10] = salt_buf1[10]; + block1[11] = salt_buf1[11]; + block1[12] = salt_buf1[12]; + block1[13] = salt_buf1[13]; + block1[14] = salt_buf1[14]; + block1[15] = salt_buf1[15]; + + memcat32 (block0, block1, salt_len, w0, w1, w2, w3, pw_len); + + u32x w0_t[4]; + + w0_t[0] = block0[ 0]; + w0_t[1] = block0[ 1]; + w0_t[2] = block0[ 2]; + w0_t[3] = block0[ 3]; + + u32x w1_t[4]; + + w1_t[0] = block0[ 4]; + w1_t[1] = block0[ 5]; + w1_t[2] = block0[ 6]; + w1_t[3] = block0[ 7]; + + u32x w2_t[4]; + + w2_t[0] = block0[ 8]; + w2_t[1] = block0[ 9]; + w2_t[2] = block0[10]; + w2_t[3] = block0[11]; + + u32x w3_t[4]; + + w3_t[0] = block0[12]; + w3_t[1] = block0[13]; + w3_t[2] = block0[14]; + w3_t[3] = block0[15]; + + // md5 + + u32x tmp2; + + u32x a = MD5M_A; + u32x b = MD5M_B; + u32x c = MD5M_C; + u32x d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0_t[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0_t[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0_t[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1_t[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1_t[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1_t[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2_t[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2_t[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2_t[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3_t[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3_t[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3_t[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0_t[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1_t[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2_t[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1_t[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1_t[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2_t[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3_t[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0_t[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2_t[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3_t[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0_t[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1_t[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3_t[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H1, a, b, c, d, w1_t[1], MD5C20, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w2_t[0], MD5C21, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w2_t[3], MD5C22, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w3_t[2], MD5C23, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w0_t[1], MD5C24, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w1_t[0], MD5C25, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w1_t[3], MD5C26, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w2_t[2], MD5C27, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w3_t[1], MD5C28, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w0_t[0], MD5C29, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w0_t[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w1_t[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w2_t[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w3_t[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w3_t[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w0_t[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1_t[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3_t[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3_t[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0_t[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0_t[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2_t[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1_t[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3_t[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1_t[0], MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w2_t[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0_t[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2_t[1], MD5C3f, MD5S33); + + a += MD5M_A; + b += MD5M_B; + c += MD5M_C; + d += MD5M_D; + + u32x r_a = a; + u32x r_b = b; + u32x r_c = c; + u32x r_d = d; + + w0_t[0] = block1[ 0]; + w0_t[1] = block1[ 1]; + w0_t[2] = block1[ 2]; + w0_t[3] = block1[ 3]; + + w1_t[0] = block1[ 4]; + w1_t[1] = block1[ 5]; + w1_t[2] = block1[ 6]; + w1_t[3] = block1[ 7]; + + w2_t[0] = block1[ 8]; + w2_t[1] = block1[ 9]; + w2_t[2] = block1[10]; + w2_t[3] = block1[11]; + + w3_t[0] = block1[12]; + w3_t[1] = block1[13]; + w3_t[2] = pw_salt_len * 8; + w3_t[3] = 0; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0_t[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0_t[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0_t[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1_t[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1_t[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1_t[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2_t[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2_t[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2_t[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3_t[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3_t[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3_t[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0_t[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1_t[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2_t[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1_t[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1_t[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2_t[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3_t[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0_t[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2_t[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3_t[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0_t[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1_t[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3_t[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H1, a, b, c, d, w1_t[1], MD5C20, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w2_t[0], MD5C21, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w2_t[3], MD5C22, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w3_t[2], MD5C23, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w0_t[1], MD5C24, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w1_t[0], MD5C25, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w1_t[3], MD5C26, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w2_t[2], MD5C27, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w3_t[1], MD5C28, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w0_t[0], MD5C29, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w0_t[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w1_t[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w2_t[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w3_t[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w3_t[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w0_t[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1_t[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3_t[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3_t[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0_t[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0_t[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2_t[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1_t[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3_t[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1_t[0], MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w2_t[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0_t[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2_t[1], MD5C3f, MD5S33); + + a += r_a; + b += r_b; + c += r_c; + d += r_d; + + /* + * final = md5 ($HA1 . $esalt) + * we have at least 2 MD5 blocks/transformations, but we might need 3 + */ + + w0_t[0] = uint_to_hex_lower8 ((a >> 0) & 255) << 0 + | uint_to_hex_lower8 ((a >> 8) & 255) << 16; + w0_t[1] = uint_to_hex_lower8 ((a >> 16) & 255) << 0 + | uint_to_hex_lower8 ((a >> 24) & 255) << 16; + w0_t[2] = uint_to_hex_lower8 ((b >> 0) & 255) << 0 + | uint_to_hex_lower8 ((b >> 8) & 255) << 16; + w0_t[3] = uint_to_hex_lower8 ((b >> 16) & 255) << 0 + | uint_to_hex_lower8 ((b >> 24) & 255) << 16; + w1_t[0] = uint_to_hex_lower8 ((c >> 0) & 255) << 0 + | uint_to_hex_lower8 ((c >> 8) & 255) << 16; + w1_t[1] = uint_to_hex_lower8 ((c >> 16) & 255) << 0 + | uint_to_hex_lower8 ((c >> 24) & 255) << 16; + w1_t[2] = uint_to_hex_lower8 ((d >> 0) & 255) << 0 + | uint_to_hex_lower8 ((d >> 8) & 255) << 16; + w1_t[3] = uint_to_hex_lower8 ((d >> 16) & 255) << 0 + | uint_to_hex_lower8 ((d >> 24) & 255) << 16; + + w2_t[0] = esalt_buf0[0]; + w2_t[1] = esalt_buf0[1]; + w2_t[2] = esalt_buf0[2]; + w2_t[3] = esalt_buf0[3]; + + w3_t[0] = esalt_buf0[4]; + w3_t[1] = esalt_buf0[5]; + w3_t[2] = esalt_buf0[6]; + w3_t[3] = esalt_buf0[7]; + + // md5 + // 1st transform + + a = MD5M_A; + b = MD5M_B; + c = MD5M_C; + d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0_t[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0_t[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0_t[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1_t[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1_t[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1_t[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2_t[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2_t[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2_t[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3_t[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3_t[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3_t[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0_t[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1_t[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2_t[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1_t[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1_t[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2_t[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3_t[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0_t[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2_t[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3_t[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0_t[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1_t[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3_t[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H1, a, b, c, d, w1_t[1], MD5C20, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w2_t[0], MD5C21, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w2_t[3], MD5C22, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w3_t[2], MD5C23, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w0_t[1], MD5C24, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w1_t[0], MD5C25, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w1_t[3], MD5C26, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w2_t[2], MD5C27, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w3_t[1], MD5C28, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w0_t[0], MD5C29, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w0_t[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w1_t[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w2_t[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w3_t[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w3_t[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w0_t[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1_t[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3_t[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3_t[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0_t[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0_t[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2_t[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1_t[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3_t[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1_t[0], MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w2_t[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0_t[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2_t[1], MD5C3f, MD5S33); + + a += MD5M_A; + b += MD5M_B; + c += MD5M_C; + d += MD5M_D; + + r_a = a; + r_b = b; + r_c = c; + r_d = d; + + // 2nd transform + + w0_t[0] = esalt_buf0[ 8]; + w0_t[1] = esalt_buf0[ 9]; + w0_t[2] = esalt_buf0[10]; + w0_t[3] = esalt_buf0[11]; + + w1_t[0] = esalt_buf0[12]; + w1_t[1] = esalt_buf0[13]; + w1_t[2] = esalt_buf0[14]; + w1_t[3] = esalt_buf0[15]; + + w2_t[0] = esalt_buf1[ 0]; + w2_t[1] = esalt_buf1[ 1]; + w2_t[2] = esalt_buf1[ 2]; + w2_t[3] = esalt_buf1[ 3]; + + w3_t[0] = esalt_buf1[ 4]; + w3_t[1] = esalt_buf1[ 5]; + w3_t[2] = digest_esalt_len * 8; + w3_t[3] = 0; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0_t[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0_t[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0_t[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1_t[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1_t[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1_t[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2_t[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2_t[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2_t[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3_t[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3_t[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3_t[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0_t[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1_t[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2_t[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1_t[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1_t[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2_t[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3_t[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0_t[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2_t[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3_t[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0_t[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1_t[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3_t[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H1, a, b, c, d, w1_t[1], MD5C20, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w2_t[0], MD5C21, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w2_t[3], MD5C22, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w3_t[2], MD5C23, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w0_t[1], MD5C24, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w1_t[0], MD5C25, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w1_t[3], MD5C26, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w2_t[2], MD5C27, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w3_t[1], MD5C28, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w0_t[0], MD5C29, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w0_t[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w1_t[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w2_t[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w3_t[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w3_t[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w0_t[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1_t[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3_t[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3_t[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0_t[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0_t[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2_t[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1_t[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3_t[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1_t[0], MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w2_t[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0_t[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2_t[1], MD5C3f, MD5S33); + + a += r_a; + b += r_b; + c += r_c; + d += r_d; + + const u32x r0 = a; + const u32x r1 = d; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_S + } +} + +__device__ static void m11400m_1_1 (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], const u32 pw_len, const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const sip_t *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset) +{ + /** + * modifier + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + const u32 lid = threadIdx.x; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * salt + */ + + const u32 salt_len = esalt_bufs[salt_pos].salt_len; // not a bug, we need to get it from the esalt + + const u32 pw_salt_len = salt_len + pw_len; + + u32 salt_buf0[16]; + + salt_buf0[ 0] = esalt_bufs[salt_pos].salt_buf[ 0]; + salt_buf0[ 1] = esalt_bufs[salt_pos].salt_buf[ 1]; + salt_buf0[ 2] = esalt_bufs[salt_pos].salt_buf[ 2]; + salt_buf0[ 3] = esalt_bufs[salt_pos].salt_buf[ 3]; + salt_buf0[ 4] = esalt_bufs[salt_pos].salt_buf[ 4]; + salt_buf0[ 5] = esalt_bufs[salt_pos].salt_buf[ 5]; + salt_buf0[ 6] = esalt_bufs[salt_pos].salt_buf[ 6]; + salt_buf0[ 7] = esalt_bufs[salt_pos].salt_buf[ 7]; + salt_buf0[ 8] = esalt_bufs[salt_pos].salt_buf[ 8]; + salt_buf0[ 9] = esalt_bufs[salt_pos].salt_buf[ 9]; + salt_buf0[10] = esalt_bufs[salt_pos].salt_buf[10]; + salt_buf0[11] = esalt_bufs[salt_pos].salt_buf[11]; + salt_buf0[12] = esalt_bufs[salt_pos].salt_buf[12]; + salt_buf0[13] = esalt_bufs[salt_pos].salt_buf[13]; + salt_buf0[14] = esalt_bufs[salt_pos].salt_buf[14]; + salt_buf0[15] = esalt_bufs[salt_pos].salt_buf[15]; + + u32 salt_buf1[16]; + + salt_buf1[ 0] = esalt_bufs[salt_pos].salt_buf[16]; + salt_buf1[ 1] = esalt_bufs[salt_pos].salt_buf[17]; + salt_buf1[ 2] = esalt_bufs[salt_pos].salt_buf[18]; + salt_buf1[ 3] = esalt_bufs[salt_pos].salt_buf[19]; + salt_buf1[ 4] = esalt_bufs[salt_pos].salt_buf[20]; + salt_buf1[ 5] = esalt_bufs[salt_pos].salt_buf[21]; + salt_buf1[ 6] = esalt_bufs[salt_pos].salt_buf[22]; + salt_buf1[ 7] = esalt_bufs[salt_pos].salt_buf[23]; + salt_buf1[ 8] = esalt_bufs[salt_pos].salt_buf[24]; + salt_buf1[ 9] = esalt_bufs[salt_pos].salt_buf[25]; + salt_buf1[10] = esalt_bufs[salt_pos].salt_buf[26]; + salt_buf1[11] = esalt_bufs[salt_pos].salt_buf[27]; + salt_buf1[12] = esalt_bufs[salt_pos].salt_buf[28]; + salt_buf1[13] = esalt_bufs[salt_pos].salt_buf[29]; + salt_buf1[14] = 0; + salt_buf1[15] = 0; + + /** + * esalt + */ + + const u32 esalt_len = esalt_bufs[salt_pos].esalt_len; + + u32 esalt_buf0[16]; + + esalt_buf0[ 0] = esalt_bufs[salt_pos].esalt_buf[ 0]; + esalt_buf0[ 1] = esalt_bufs[salt_pos].esalt_buf[ 1]; + esalt_buf0[ 2] = esalt_bufs[salt_pos].esalt_buf[ 2]; + esalt_buf0[ 3] = esalt_bufs[salt_pos].esalt_buf[ 3]; + esalt_buf0[ 4] = esalt_bufs[salt_pos].esalt_buf[ 4]; + esalt_buf0[ 5] = esalt_bufs[salt_pos].esalt_buf[ 5]; + esalt_buf0[ 6] = esalt_bufs[salt_pos].esalt_buf[ 6]; + esalt_buf0[ 7] = esalt_bufs[salt_pos].esalt_buf[ 7]; + esalt_buf0[ 8] = esalt_bufs[salt_pos].esalt_buf[ 8]; + esalt_buf0[ 9] = esalt_bufs[salt_pos].esalt_buf[ 9]; + esalt_buf0[10] = esalt_bufs[salt_pos].esalt_buf[10]; + esalt_buf0[11] = esalt_bufs[salt_pos].esalt_buf[11]; + esalt_buf0[12] = esalt_bufs[salt_pos].esalt_buf[12]; + esalt_buf0[13] = esalt_bufs[salt_pos].esalt_buf[13]; + esalt_buf0[14] = esalt_bufs[salt_pos].esalt_buf[14]; + esalt_buf0[15] = esalt_bufs[salt_pos].esalt_buf[15]; + + u32 esalt_buf1[16]; + + esalt_buf1[ 0] = esalt_bufs[salt_pos].esalt_buf[16]; + esalt_buf1[ 1] = esalt_bufs[salt_pos].esalt_buf[17]; + esalt_buf1[ 2] = esalt_bufs[salt_pos].esalt_buf[18]; + esalt_buf1[ 3] = esalt_bufs[salt_pos].esalt_buf[19]; + esalt_buf1[ 4] = esalt_bufs[salt_pos].esalt_buf[20]; + esalt_buf1[ 5] = esalt_bufs[salt_pos].esalt_buf[21]; + esalt_buf1[ 6] = esalt_bufs[salt_pos].esalt_buf[22]; + esalt_buf1[ 7] = esalt_bufs[salt_pos].esalt_buf[23]; + esalt_buf1[ 8] = esalt_bufs[salt_pos].esalt_buf[24]; + esalt_buf1[ 9] = esalt_bufs[salt_pos].esalt_buf[25]; + esalt_buf1[10] = esalt_bufs[salt_pos].esalt_buf[26]; + esalt_buf1[11] = esalt_bufs[salt_pos].esalt_buf[27]; + esalt_buf1[12] = esalt_bufs[salt_pos].esalt_buf[28]; + esalt_buf1[13] = esalt_bufs[salt_pos].esalt_buf[29]; + esalt_buf1[14] = esalt_bufs[salt_pos].esalt_buf[30]; + esalt_buf1[15] = esalt_bufs[salt_pos].esalt_buf[31]; + + u32 esalt_buf2[16]; + + esalt_buf2[ 0] = esalt_bufs[salt_pos].esalt_buf[32]; + esalt_buf2[ 1] = esalt_bufs[salt_pos].esalt_buf[33]; + esalt_buf2[ 2] = esalt_bufs[salt_pos].esalt_buf[34]; + esalt_buf2[ 3] = esalt_bufs[salt_pos].esalt_buf[35]; + esalt_buf2[ 4] = esalt_bufs[salt_pos].esalt_buf[36]; + esalt_buf2[ 5] = esalt_bufs[salt_pos].esalt_buf[37]; + esalt_buf2[ 6] = 0; + esalt_buf2[ 7] = 0; + esalt_buf2[ 8] = 0; + esalt_buf2[ 9] = 0; + esalt_buf2[10] = 0; + esalt_buf2[11] = 0; + esalt_buf2[12] = 0; + esalt_buf2[13] = 0; + esalt_buf2[14] = 0; + esalt_buf2[15] = 0; + + const u32 digest_esalt_len = 32 + esalt_len; + + /** + * loop + */ + + u32x w0l = w0[0]; + + for (u32 il_pos = 0; il_pos < bfs_cnt; il_pos++) + { + const u32 w0r = c_bfs[il_pos].i; + + w0[0] = w0l | w0r; + + /* + * HA1 = md5 ($salt . $pass) + */ + + // append the pass to the salt + + u32x block0[16]; + + block0[ 0] = salt_buf0[ 0]; + block0[ 1] = salt_buf0[ 1]; + block0[ 2] = salt_buf0[ 2]; + block0[ 3] = salt_buf0[ 3]; + block0[ 4] = salt_buf0[ 4]; + block0[ 5] = salt_buf0[ 5]; + block0[ 6] = salt_buf0[ 6]; + block0[ 7] = salt_buf0[ 7]; + block0[ 8] = salt_buf0[ 8]; + block0[ 9] = salt_buf0[ 9]; + block0[10] = salt_buf0[10]; + block0[11] = salt_buf0[11]; + block0[12] = salt_buf0[12]; + block0[13] = salt_buf0[13]; + block0[14] = salt_buf0[14]; + block0[15] = salt_buf0[15]; + + u32x block1[16]; + + block1[ 0] = salt_buf1[ 0]; + block1[ 1] = salt_buf1[ 1]; + block1[ 2] = salt_buf1[ 2]; + block1[ 3] = salt_buf1[ 3]; + block1[ 4] = salt_buf1[ 4]; + block1[ 5] = salt_buf1[ 5]; + block1[ 6] = salt_buf1[ 6]; + block1[ 7] = salt_buf1[ 7]; + block1[ 8] = salt_buf1[ 8]; + block1[ 9] = salt_buf1[ 9]; + block1[10] = salt_buf1[10]; + block1[11] = salt_buf1[11]; + block1[12] = salt_buf1[12]; + block1[13] = salt_buf1[13]; + block1[14] = salt_buf1[14]; + block1[15] = salt_buf1[15]; + + memcat32 (block0, block1, salt_len, w0, w1, w2, w3, pw_len); + + u32x w0_t[4]; + + w0_t[0] = block0[ 0]; + w0_t[1] = block0[ 1]; + w0_t[2] = block0[ 2]; + w0_t[3] = block0[ 3]; + + u32x w1_t[4]; + + w1_t[0] = block0[ 4]; + w1_t[1] = block0[ 5]; + w1_t[2] = block0[ 6]; + w1_t[3] = block0[ 7]; + + u32x w2_t[4]; + + w2_t[0] = block0[ 8]; + w2_t[1] = block0[ 9]; + w2_t[2] = block0[10]; + w2_t[3] = block0[11]; + + u32x w3_t[4]; + + w3_t[0] = block0[12]; + w3_t[1] = block0[13]; + w3_t[2] = block0[14]; + w3_t[3] = block0[15]; + + // md5 + + u32x tmp2; + + u32x a = MD5M_A; + u32x b = MD5M_B; + u32x c = MD5M_C; + u32x d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0_t[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0_t[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0_t[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1_t[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1_t[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1_t[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2_t[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2_t[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2_t[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3_t[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3_t[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3_t[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0_t[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1_t[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2_t[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1_t[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1_t[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2_t[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3_t[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0_t[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2_t[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3_t[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0_t[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1_t[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3_t[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H1, a, b, c, d, w1_t[1], MD5C20, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w2_t[0], MD5C21, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w2_t[3], MD5C22, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w3_t[2], MD5C23, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w0_t[1], MD5C24, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w1_t[0], MD5C25, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w1_t[3], MD5C26, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w2_t[2], MD5C27, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w3_t[1], MD5C28, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w0_t[0], MD5C29, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w0_t[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w1_t[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w2_t[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w3_t[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w3_t[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w0_t[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1_t[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3_t[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3_t[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0_t[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0_t[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2_t[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1_t[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3_t[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1_t[0], MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w2_t[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0_t[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2_t[1], MD5C3f, MD5S33); + + a += MD5M_A; + b += MD5M_B; + c += MD5M_C; + d += MD5M_D; + + u32x r_a = a; + u32x r_b = b; + u32x r_c = c; + u32x r_d = d; + + w0_t[0] = block1[ 0]; + w0_t[1] = block1[ 1]; + w0_t[2] = block1[ 2]; + w0_t[3] = block1[ 3]; + + w1_t[0] = block1[ 4]; + w1_t[1] = block1[ 5]; + w1_t[2] = block1[ 6]; + w1_t[3] = block1[ 7]; + + w2_t[0] = block1[ 8]; + w2_t[1] = block1[ 9]; + w2_t[2] = block1[10]; + w2_t[3] = block1[11]; + + w3_t[0] = block1[12]; + w3_t[1] = block1[13]; + w3_t[2] = pw_salt_len * 8; + w3_t[3] = 0; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0_t[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0_t[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0_t[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1_t[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1_t[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1_t[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2_t[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2_t[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2_t[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3_t[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3_t[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3_t[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0_t[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1_t[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2_t[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1_t[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1_t[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2_t[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3_t[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0_t[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2_t[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3_t[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0_t[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1_t[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3_t[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H1, a, b, c, d, w1_t[1], MD5C20, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w2_t[0], MD5C21, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w2_t[3], MD5C22, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w3_t[2], MD5C23, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w0_t[1], MD5C24, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w1_t[0], MD5C25, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w1_t[3], MD5C26, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w2_t[2], MD5C27, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w3_t[1], MD5C28, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w0_t[0], MD5C29, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w0_t[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w1_t[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w2_t[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w3_t[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w3_t[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w0_t[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1_t[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3_t[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3_t[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0_t[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0_t[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2_t[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1_t[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3_t[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1_t[0], MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w2_t[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0_t[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2_t[1], MD5C3f, MD5S33); + + a += r_a; + b += r_b; + c += r_c; + d += r_d; + + /* + * final = md5 ($HA1 . $esalt) + * we have at least 2 MD5 blocks/transformations, but we might need 3 + */ + + w0_t[0] = uint_to_hex_lower8 ((a >> 0) & 255) << 0 + | uint_to_hex_lower8 ((a >> 8) & 255) << 16; + w0_t[1] = uint_to_hex_lower8 ((a >> 16) & 255) << 0 + | uint_to_hex_lower8 ((a >> 24) & 255) << 16; + w0_t[2] = uint_to_hex_lower8 ((b >> 0) & 255) << 0 + | uint_to_hex_lower8 ((b >> 8) & 255) << 16; + w0_t[3] = uint_to_hex_lower8 ((b >> 16) & 255) << 0 + | uint_to_hex_lower8 ((b >> 24) & 255) << 16; + w1_t[0] = uint_to_hex_lower8 ((c >> 0) & 255) << 0 + | uint_to_hex_lower8 ((c >> 8) & 255) << 16; + w1_t[1] = uint_to_hex_lower8 ((c >> 16) & 255) << 0 + | uint_to_hex_lower8 ((c >> 24) & 255) << 16; + w1_t[2] = uint_to_hex_lower8 ((d >> 0) & 255) << 0 + | uint_to_hex_lower8 ((d >> 8) & 255) << 16; + w1_t[3] = uint_to_hex_lower8 ((d >> 16) & 255) << 0 + | uint_to_hex_lower8 ((d >> 24) & 255) << 16; + + w2_t[0] = esalt_buf0[0]; + w2_t[1] = esalt_buf0[1]; + w2_t[2] = esalt_buf0[2]; + w2_t[3] = esalt_buf0[3]; + + w3_t[0] = esalt_buf0[4]; + w3_t[1] = esalt_buf0[5]; + w3_t[2] = esalt_buf0[6]; + w3_t[3] = esalt_buf0[7]; + + // md5 + // 1st transform + + a = MD5M_A; + b = MD5M_B; + c = MD5M_C; + d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0_t[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0_t[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0_t[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1_t[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1_t[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1_t[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2_t[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2_t[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2_t[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3_t[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3_t[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3_t[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0_t[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1_t[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2_t[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1_t[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1_t[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2_t[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3_t[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0_t[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2_t[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3_t[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0_t[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1_t[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3_t[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H1, a, b, c, d, w1_t[1], MD5C20, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w2_t[0], MD5C21, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w2_t[3], MD5C22, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w3_t[2], MD5C23, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w0_t[1], MD5C24, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w1_t[0], MD5C25, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w1_t[3], MD5C26, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w2_t[2], MD5C27, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w3_t[1], MD5C28, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w0_t[0], MD5C29, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w0_t[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w1_t[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w2_t[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w3_t[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w3_t[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w0_t[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1_t[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3_t[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3_t[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0_t[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0_t[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2_t[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1_t[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3_t[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1_t[0], MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w2_t[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0_t[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2_t[1], MD5C3f, MD5S33); + + a += MD5M_A; + b += MD5M_B; + c += MD5M_C; + d += MD5M_D; + + r_a = a; + r_b = b; + r_c = c; + r_d = d; + + // 2nd transform + + w0_t[0] = esalt_buf0[ 8]; + w0_t[1] = esalt_buf0[ 9]; + w0_t[2] = esalt_buf0[10]; + w0_t[3] = esalt_buf0[11]; + + w1_t[0] = esalt_buf0[12]; + w1_t[1] = esalt_buf0[13]; + w1_t[2] = esalt_buf0[14]; + w1_t[3] = esalt_buf0[15]; + + w2_t[0] = esalt_buf1[ 0]; + w2_t[1] = esalt_buf1[ 1]; + w2_t[2] = esalt_buf1[ 2]; + w2_t[3] = esalt_buf1[ 3]; + + w3_t[0] = esalt_buf1[ 4]; + w3_t[1] = esalt_buf1[ 5]; + w3_t[2] = esalt_buf1[ 6]; + w3_t[3] = esalt_buf1[ 7]; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0_t[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0_t[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0_t[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1_t[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1_t[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1_t[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2_t[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2_t[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2_t[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3_t[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3_t[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3_t[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0_t[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1_t[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2_t[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1_t[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1_t[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2_t[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3_t[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0_t[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2_t[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3_t[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0_t[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1_t[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3_t[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H1, a, b, c, d, w1_t[1], MD5C20, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w2_t[0], MD5C21, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w2_t[3], MD5C22, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w3_t[2], MD5C23, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w0_t[1], MD5C24, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w1_t[0], MD5C25, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w1_t[3], MD5C26, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w2_t[2], MD5C27, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w3_t[1], MD5C28, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w0_t[0], MD5C29, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w0_t[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w1_t[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w2_t[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w3_t[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w3_t[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w0_t[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1_t[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3_t[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3_t[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0_t[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0_t[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2_t[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1_t[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3_t[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1_t[0], MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w2_t[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0_t[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2_t[1], MD5C3f, MD5S33); + + // this is for sure the final block + + a += r_a; + b += r_b; + c += r_c; + d += r_d; + + r_a = a; + r_b = b; + r_c = c; + r_d = d; + + w0_t[0] = esalt_buf1[ 8]; + w0_t[1] = esalt_buf1[ 9]; + w0_t[2] = esalt_buf1[10]; + w0_t[3] = esalt_buf1[11]; + + w1_t[0] = esalt_buf1[12]; + w1_t[1] = esalt_buf1[13]; + w1_t[2] = esalt_buf1[14]; + w1_t[3] = esalt_buf1[15]; + + w2_t[0] = esalt_buf2[ 0]; + w2_t[1] = esalt_buf2[ 1]; + w2_t[2] = esalt_buf2[ 2]; + w2_t[3] = esalt_buf2[ 3]; + + w3_t[0] = esalt_buf2[ 4]; + w3_t[1] = esalt_buf2[ 5]; + w3_t[2] = digest_esalt_len * 8; + w3_t[3] = 0; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0_t[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0_t[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0_t[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1_t[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1_t[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1_t[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2_t[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2_t[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2_t[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3_t[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3_t[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3_t[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0_t[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1_t[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2_t[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1_t[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1_t[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2_t[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3_t[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0_t[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2_t[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3_t[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0_t[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1_t[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3_t[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H1, a, b, c, d, w1_t[1], MD5C20, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w2_t[0], MD5C21, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w2_t[3], MD5C22, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w3_t[2], MD5C23, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w0_t[1], MD5C24, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w1_t[0], MD5C25, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w1_t[3], MD5C26, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w2_t[2], MD5C27, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w3_t[1], MD5C28, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w0_t[0], MD5C29, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w0_t[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w1_t[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w2_t[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w3_t[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w3_t[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w0_t[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1_t[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3_t[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3_t[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0_t[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0_t[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2_t[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1_t[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3_t[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1_t[0], MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w2_t[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0_t[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2_t[1], MD5C3f, MD5S33); + + a += r_a; + b += r_b; + c += r_c; + d += r_d; + + const u32x r0 = a; + const u32x r1 = d; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_S + } +} + +__device__ static void m11400s_0_0 (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], const u32 pw_len, const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const sip_t *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset) +{ + /** + * modifier + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + const u32 lid = threadIdx.x; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * salt + */ + + const u32 salt_len = esalt_bufs[salt_pos].salt_len; // not a bug, we need to get it from the esalt + + const u32 pw_salt_len = salt_len + pw_len; + + u32 salt_buf0[16]; + + salt_buf0[ 0] = esalt_bufs[salt_pos].salt_buf[ 0]; + salt_buf0[ 1] = esalt_bufs[salt_pos].salt_buf[ 1]; + salt_buf0[ 2] = esalt_bufs[salt_pos].salt_buf[ 2]; + salt_buf0[ 3] = esalt_bufs[salt_pos].salt_buf[ 3]; + salt_buf0[ 4] = esalt_bufs[salt_pos].salt_buf[ 4]; + salt_buf0[ 5] = esalt_bufs[salt_pos].salt_buf[ 5]; + salt_buf0[ 6] = esalt_bufs[salt_pos].salt_buf[ 6]; + salt_buf0[ 7] = esalt_bufs[salt_pos].salt_buf[ 7]; + salt_buf0[ 8] = esalt_bufs[salt_pos].salt_buf[ 8]; + salt_buf0[ 9] = esalt_bufs[salt_pos].salt_buf[ 9]; + salt_buf0[10] = esalt_bufs[salt_pos].salt_buf[10]; + salt_buf0[11] = esalt_bufs[salt_pos].salt_buf[11]; + salt_buf0[12] = esalt_bufs[salt_pos].salt_buf[12]; + salt_buf0[13] = esalt_bufs[salt_pos].salt_buf[13]; + salt_buf0[14] = esalt_bufs[salt_pos].salt_buf[14]; + salt_buf0[15] = esalt_bufs[salt_pos].salt_buf[15]; + + u32 salt_buf1[16]; + + salt_buf1[ 0] = esalt_bufs[salt_pos].salt_buf[16]; + salt_buf1[ 1] = esalt_bufs[salt_pos].salt_buf[17]; + salt_buf1[ 2] = esalt_bufs[salt_pos].salt_buf[18]; + salt_buf1[ 3] = esalt_bufs[salt_pos].salt_buf[19]; + salt_buf1[ 4] = esalt_bufs[salt_pos].salt_buf[20]; + salt_buf1[ 5] = esalt_bufs[salt_pos].salt_buf[21]; + salt_buf1[ 6] = esalt_bufs[salt_pos].salt_buf[22]; + salt_buf1[ 7] = esalt_bufs[salt_pos].salt_buf[23]; + salt_buf1[ 8] = esalt_bufs[salt_pos].salt_buf[24]; + salt_buf1[ 9] = esalt_bufs[salt_pos].salt_buf[25]; + salt_buf1[10] = esalt_bufs[salt_pos].salt_buf[26]; + salt_buf1[11] = esalt_bufs[salt_pos].salt_buf[27]; + salt_buf1[12] = esalt_bufs[salt_pos].salt_buf[28]; + salt_buf1[13] = esalt_bufs[salt_pos].salt_buf[29]; + salt_buf1[14] = 0; + salt_buf1[15] = 0; + + /** + * esalt + */ + + const u32 esalt_len = esalt_bufs[salt_pos].esalt_len; + + u32 esalt_buf0[16]; + + esalt_buf0[ 0] = esalt_bufs[salt_pos].esalt_buf[ 0]; + esalt_buf0[ 1] = esalt_bufs[salt_pos].esalt_buf[ 1]; + esalt_buf0[ 2] = esalt_bufs[salt_pos].esalt_buf[ 2]; + esalt_buf0[ 3] = esalt_bufs[salt_pos].esalt_buf[ 3]; + esalt_buf0[ 4] = esalt_bufs[salt_pos].esalt_buf[ 4]; + esalt_buf0[ 5] = esalt_bufs[salt_pos].esalt_buf[ 5]; + esalt_buf0[ 6] = esalt_bufs[salt_pos].esalt_buf[ 6]; + esalt_buf0[ 7] = esalt_bufs[salt_pos].esalt_buf[ 7]; + esalt_buf0[ 8] = esalt_bufs[salt_pos].esalt_buf[ 8]; + esalt_buf0[ 9] = esalt_bufs[salt_pos].esalt_buf[ 9]; + esalt_buf0[10] = esalt_bufs[salt_pos].esalt_buf[10]; + esalt_buf0[11] = esalt_bufs[salt_pos].esalt_buf[11]; + esalt_buf0[12] = esalt_bufs[salt_pos].esalt_buf[12]; + esalt_buf0[13] = esalt_bufs[salt_pos].esalt_buf[13]; + esalt_buf0[14] = esalt_bufs[salt_pos].esalt_buf[14]; + esalt_buf0[15] = esalt_bufs[salt_pos].esalt_buf[15]; + + u32 esalt_buf1[16]; + + esalt_buf1[ 0] = esalt_bufs[salt_pos].esalt_buf[16]; + esalt_buf1[ 1] = esalt_bufs[salt_pos].esalt_buf[17]; + esalt_buf1[ 2] = esalt_bufs[salt_pos].esalt_buf[18]; + esalt_buf1[ 3] = esalt_bufs[salt_pos].esalt_buf[19]; + esalt_buf1[ 4] = esalt_bufs[salt_pos].esalt_buf[20]; + esalt_buf1[ 5] = esalt_bufs[salt_pos].esalt_buf[21]; + esalt_buf1[ 6] = esalt_bufs[salt_pos].esalt_buf[22]; + esalt_buf1[ 7] = esalt_bufs[salt_pos].esalt_buf[23]; + esalt_buf1[ 8] = esalt_bufs[salt_pos].esalt_buf[24]; + esalt_buf1[ 9] = esalt_bufs[salt_pos].esalt_buf[25]; + esalt_buf1[10] = esalt_bufs[salt_pos].esalt_buf[26]; + esalt_buf1[11] = esalt_bufs[salt_pos].esalt_buf[27]; + esalt_buf1[12] = esalt_bufs[salt_pos].esalt_buf[28]; + esalt_buf1[13] = esalt_bufs[salt_pos].esalt_buf[29]; + esalt_buf1[14] = esalt_bufs[salt_pos].esalt_buf[30]; + esalt_buf1[15] = esalt_bufs[salt_pos].esalt_buf[31]; + + const u32 digest_esalt_len = 32 + esalt_len; + + /** + * loop + */ + + u32x w0l = w0[0]; + + for (u32 il_pos = 0; il_pos < bfs_cnt; il_pos++) + { + const u32 w0r = c_bfs[il_pos].i; + + w0[0] = w0l | w0r; + + /* + * HA1 = md5 ($salt . $pass) + */ + + // append the pass to the salt + + u32x block0[16]; + + block0[ 0] = salt_buf0[ 0]; + block0[ 1] = salt_buf0[ 1]; + block0[ 2] = salt_buf0[ 2]; + block0[ 3] = salt_buf0[ 3]; + block0[ 4] = salt_buf0[ 4]; + block0[ 5] = salt_buf0[ 5]; + block0[ 6] = salt_buf0[ 6]; + block0[ 7] = salt_buf0[ 7]; + block0[ 8] = salt_buf0[ 8]; + block0[ 9] = salt_buf0[ 9]; + block0[10] = salt_buf0[10]; + block0[11] = salt_buf0[11]; + block0[12] = salt_buf0[12]; + block0[13] = salt_buf0[13]; + block0[14] = salt_buf0[14]; + block0[15] = salt_buf0[15]; + + u32x block1[16]; + + block1[ 0] = salt_buf1[ 0]; + block1[ 1] = salt_buf1[ 1]; + block1[ 2] = salt_buf1[ 2]; + block1[ 3] = salt_buf1[ 3]; + block1[ 4] = salt_buf1[ 4]; + block1[ 5] = salt_buf1[ 5]; + block1[ 6] = salt_buf1[ 6]; + block1[ 7] = salt_buf1[ 7]; + block1[ 8] = salt_buf1[ 8]; + block1[ 9] = salt_buf1[ 9]; + block1[10] = salt_buf1[10]; + block1[11] = salt_buf1[11]; + block1[12] = salt_buf1[12]; + block1[13] = salt_buf1[13]; + block1[14] = salt_buf1[14]; + block1[15] = salt_buf1[15]; + + memcat32 (block0, block1, salt_len, w0, w1, w2, w3, pw_len); + + u32x w0_t[4]; + + w0_t[0] = block0[ 0]; + w0_t[1] = block0[ 1]; + w0_t[2] = block0[ 2]; + w0_t[3] = block0[ 3]; + + u32x w1_t[4]; + + w1_t[0] = block0[ 4]; + w1_t[1] = block0[ 5]; + w1_t[2] = block0[ 6]; + w1_t[3] = block0[ 7]; + + u32x w2_t[4]; + + w2_t[0] = block0[ 8]; + w2_t[1] = block0[ 9]; + w2_t[2] = block0[10]; + w2_t[3] = block0[11]; + + u32x w3_t[4]; + + w3_t[0] = block0[12]; + w3_t[1] = block0[13]; + w3_t[2] = pw_salt_len * 8; + w3_t[3] = 0; + + // md5 + + u32x tmp2; + + u32x a = MD5M_A; + u32x b = MD5M_B; + u32x c = MD5M_C; + u32x d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0_t[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0_t[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0_t[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1_t[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1_t[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1_t[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2_t[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2_t[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2_t[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3_t[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3_t[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3_t[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0_t[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1_t[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2_t[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1_t[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1_t[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2_t[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3_t[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0_t[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2_t[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3_t[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0_t[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1_t[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3_t[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H1, a, b, c, d, w1_t[1], MD5C20, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w2_t[0], MD5C21, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w2_t[3], MD5C22, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w3_t[2], MD5C23, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w0_t[1], MD5C24, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w1_t[0], MD5C25, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w1_t[3], MD5C26, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w2_t[2], MD5C27, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w3_t[1], MD5C28, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w0_t[0], MD5C29, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w0_t[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w1_t[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w2_t[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w3_t[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w3_t[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w0_t[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1_t[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3_t[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3_t[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0_t[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0_t[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2_t[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1_t[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3_t[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1_t[0], MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w2_t[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0_t[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2_t[1], MD5C3f, MD5S33); + + a += MD5M_A; + b += MD5M_B; + c += MD5M_C; + d += MD5M_D; + + /* + * final = md5 ($HA1 . $esalt) + * we have at least 2 MD5 blocks/transformations, but we might need 3 + */ + + w0_t[0] = uint_to_hex_lower8 ((a >> 0) & 255) << 0 + | uint_to_hex_lower8 ((a >> 8) & 255) << 16; + w0_t[1] = uint_to_hex_lower8 ((a >> 16) & 255) << 0 + | uint_to_hex_lower8 ((a >> 24) & 255) << 16; + w0_t[2] = uint_to_hex_lower8 ((b >> 0) & 255) << 0 + | uint_to_hex_lower8 ((b >> 8) & 255) << 16; + w0_t[3] = uint_to_hex_lower8 ((b >> 16) & 255) << 0 + | uint_to_hex_lower8 ((b >> 24) & 255) << 16; + w1_t[0] = uint_to_hex_lower8 ((c >> 0) & 255) << 0 + | uint_to_hex_lower8 ((c >> 8) & 255) << 16; + w1_t[1] = uint_to_hex_lower8 ((c >> 16) & 255) << 0 + | uint_to_hex_lower8 ((c >> 24) & 255) << 16; + w1_t[2] = uint_to_hex_lower8 ((d >> 0) & 255) << 0 + | uint_to_hex_lower8 ((d >> 8) & 255) << 16; + w1_t[3] = uint_to_hex_lower8 ((d >> 16) & 255) << 0 + | uint_to_hex_lower8 ((d >> 24) & 255) << 16; + + w2_t[0] = esalt_buf0[0]; + w2_t[1] = esalt_buf0[1]; + w2_t[2] = esalt_buf0[2]; + w2_t[3] = esalt_buf0[3]; + + w3_t[0] = esalt_buf0[4]; + w3_t[1] = esalt_buf0[5]; + w3_t[2] = esalt_buf0[6]; + w3_t[3] = esalt_buf0[7]; + + // md5 + // 1st transform + + a = MD5M_A; + b = MD5M_B; + c = MD5M_C; + d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0_t[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0_t[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0_t[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1_t[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1_t[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1_t[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2_t[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2_t[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2_t[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3_t[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3_t[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3_t[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0_t[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1_t[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2_t[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1_t[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1_t[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2_t[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3_t[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0_t[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2_t[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3_t[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0_t[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1_t[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3_t[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H1, a, b, c, d, w1_t[1], MD5C20, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w2_t[0], MD5C21, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w2_t[3], MD5C22, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w3_t[2], MD5C23, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w0_t[1], MD5C24, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w1_t[0], MD5C25, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w1_t[3], MD5C26, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w2_t[2], MD5C27, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w3_t[1], MD5C28, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w0_t[0], MD5C29, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w0_t[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w1_t[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w2_t[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w3_t[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w3_t[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w0_t[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1_t[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3_t[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3_t[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0_t[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0_t[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2_t[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1_t[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3_t[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1_t[0], MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w2_t[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0_t[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2_t[1], MD5C3f, MD5S33); + + a += MD5M_A; + b += MD5M_B; + c += MD5M_C; + d += MD5M_D; + + u32x r_a = a; + u32x r_b = b; + u32x r_c = c; + u32x r_d = d; + + // 2nd transform + + w0_t[0] = esalt_buf0[ 8]; + w0_t[1] = esalt_buf0[ 9]; + w0_t[2] = esalt_buf0[10]; + w0_t[3] = esalt_buf0[11]; + + w1_t[0] = esalt_buf0[12]; + w1_t[1] = esalt_buf0[13]; + w1_t[2] = esalt_buf0[14]; + w1_t[3] = esalt_buf0[15]; + + w2_t[0] = esalt_buf1[ 0]; + w2_t[1] = esalt_buf1[ 1]; + w2_t[2] = esalt_buf1[ 2]; + w2_t[3] = esalt_buf1[ 3]; + + w3_t[0] = esalt_buf1[ 4]; + w3_t[1] = esalt_buf1[ 5]; + w3_t[2] = digest_esalt_len * 8; + w3_t[3] = 0; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0_t[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0_t[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0_t[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1_t[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1_t[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1_t[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2_t[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2_t[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2_t[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3_t[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3_t[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3_t[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0_t[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1_t[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2_t[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1_t[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1_t[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2_t[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3_t[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0_t[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2_t[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3_t[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0_t[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1_t[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3_t[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H1, a, b, c, d, w1_t[1], MD5C20, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w2_t[0], MD5C21, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w2_t[3], MD5C22, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w3_t[2], MD5C23, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w0_t[1], MD5C24, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w1_t[0], MD5C25, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w1_t[3], MD5C26, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w2_t[2], MD5C27, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w3_t[1], MD5C28, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w0_t[0], MD5C29, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w0_t[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w1_t[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w2_t[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w3_t[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w3_t[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w0_t[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1_t[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3_t[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3_t[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0_t[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0_t[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2_t[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1_t[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3_t[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1_t[0], MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w2_t[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0_t[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2_t[1], MD5C3f, MD5S33); + + a += r_a; + b += r_b; + c += r_c; + d += r_d; + + const u32x r0 = a; + const u32x r1 = d; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_S + } +} + +__device__ static void m11400s_0_1 (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], const u32 pw_len, const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const sip_t *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset) +{ + /** + * modifier + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + const u32 lid = threadIdx.x; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * salt + */ + + const u32 salt_len = esalt_bufs[salt_pos].salt_len; // not a bug, we need to get it from the esalt + + const u32 pw_salt_len = salt_len + pw_len; + + u32 salt_buf0[16]; + + salt_buf0[ 0] = esalt_bufs[salt_pos].salt_buf[ 0]; + salt_buf0[ 1] = esalt_bufs[salt_pos].salt_buf[ 1]; + salt_buf0[ 2] = esalt_bufs[salt_pos].salt_buf[ 2]; + salt_buf0[ 3] = esalt_bufs[salt_pos].salt_buf[ 3]; + salt_buf0[ 4] = esalt_bufs[salt_pos].salt_buf[ 4]; + salt_buf0[ 5] = esalt_bufs[salt_pos].salt_buf[ 5]; + salt_buf0[ 6] = esalt_bufs[salt_pos].salt_buf[ 6]; + salt_buf0[ 7] = esalt_bufs[salt_pos].salt_buf[ 7]; + salt_buf0[ 8] = esalt_bufs[salt_pos].salt_buf[ 8]; + salt_buf0[ 9] = esalt_bufs[salt_pos].salt_buf[ 9]; + salt_buf0[10] = esalt_bufs[salt_pos].salt_buf[10]; + salt_buf0[11] = esalt_bufs[salt_pos].salt_buf[11]; + salt_buf0[12] = esalt_bufs[salt_pos].salt_buf[12]; + salt_buf0[13] = esalt_bufs[salt_pos].salt_buf[13]; + salt_buf0[14] = esalt_bufs[salt_pos].salt_buf[14]; + salt_buf0[15] = esalt_bufs[salt_pos].salt_buf[15]; + + u32 salt_buf1[16]; + + salt_buf1[ 0] = esalt_bufs[salt_pos].salt_buf[16]; + salt_buf1[ 1] = esalt_bufs[salt_pos].salt_buf[17]; + salt_buf1[ 2] = esalt_bufs[salt_pos].salt_buf[18]; + salt_buf1[ 3] = esalt_bufs[salt_pos].salt_buf[19]; + salt_buf1[ 4] = esalt_bufs[salt_pos].salt_buf[20]; + salt_buf1[ 5] = esalt_bufs[salt_pos].salt_buf[21]; + salt_buf1[ 6] = esalt_bufs[salt_pos].salt_buf[22]; + salt_buf1[ 7] = esalt_bufs[salt_pos].salt_buf[23]; + salt_buf1[ 8] = esalt_bufs[salt_pos].salt_buf[24]; + salt_buf1[ 9] = esalt_bufs[salt_pos].salt_buf[25]; + salt_buf1[10] = esalt_bufs[salt_pos].salt_buf[26]; + salt_buf1[11] = esalt_bufs[salt_pos].salt_buf[27]; + salt_buf1[12] = esalt_bufs[salt_pos].salt_buf[28]; + salt_buf1[13] = esalt_bufs[salt_pos].salt_buf[29]; + salt_buf1[14] = 0; + salt_buf1[15] = 0; + + /** + * esalt + */ + + const u32 esalt_len = esalt_bufs[salt_pos].esalt_len; + + u32 esalt_buf0[16]; + + esalt_buf0[ 0] = esalt_bufs[salt_pos].esalt_buf[ 0]; + esalt_buf0[ 1] = esalt_bufs[salt_pos].esalt_buf[ 1]; + esalt_buf0[ 2] = esalt_bufs[salt_pos].esalt_buf[ 2]; + esalt_buf0[ 3] = esalt_bufs[salt_pos].esalt_buf[ 3]; + esalt_buf0[ 4] = esalt_bufs[salt_pos].esalt_buf[ 4]; + esalt_buf0[ 5] = esalt_bufs[salt_pos].esalt_buf[ 5]; + esalt_buf0[ 6] = esalt_bufs[salt_pos].esalt_buf[ 6]; + esalt_buf0[ 7] = esalt_bufs[salt_pos].esalt_buf[ 7]; + esalt_buf0[ 8] = esalt_bufs[salt_pos].esalt_buf[ 8]; + esalt_buf0[ 9] = esalt_bufs[salt_pos].esalt_buf[ 9]; + esalt_buf0[10] = esalt_bufs[salt_pos].esalt_buf[10]; + esalt_buf0[11] = esalt_bufs[salt_pos].esalt_buf[11]; + esalt_buf0[12] = esalt_bufs[salt_pos].esalt_buf[12]; + esalt_buf0[13] = esalt_bufs[salt_pos].esalt_buf[13]; + esalt_buf0[14] = esalt_bufs[salt_pos].esalt_buf[14]; + esalt_buf0[15] = esalt_bufs[salt_pos].esalt_buf[15]; + + u32 esalt_buf1[16]; + + esalt_buf1[ 0] = esalt_bufs[salt_pos].esalt_buf[16]; + esalt_buf1[ 1] = esalt_bufs[salt_pos].esalt_buf[17]; + esalt_buf1[ 2] = esalt_bufs[salt_pos].esalt_buf[18]; + esalt_buf1[ 3] = esalt_bufs[salt_pos].esalt_buf[19]; + esalt_buf1[ 4] = esalt_bufs[salt_pos].esalt_buf[20]; + esalt_buf1[ 5] = esalt_bufs[salt_pos].esalt_buf[21]; + esalt_buf1[ 6] = esalt_bufs[salt_pos].esalt_buf[22]; + esalt_buf1[ 7] = esalt_bufs[salt_pos].esalt_buf[23]; + esalt_buf1[ 8] = esalt_bufs[salt_pos].esalt_buf[24]; + esalt_buf1[ 9] = esalt_bufs[salt_pos].esalt_buf[25]; + esalt_buf1[10] = esalt_bufs[salt_pos].esalt_buf[26]; + esalt_buf1[11] = esalt_bufs[salt_pos].esalt_buf[27]; + esalt_buf1[12] = esalt_bufs[salt_pos].esalt_buf[28]; + esalt_buf1[13] = esalt_bufs[salt_pos].esalt_buf[29]; + esalt_buf1[14] = esalt_bufs[salt_pos].esalt_buf[30]; + esalt_buf1[15] = esalt_bufs[salt_pos].esalt_buf[31]; + + u32 esalt_buf2[16]; + + esalt_buf2[ 0] = esalt_bufs[salt_pos].esalt_buf[32]; + esalt_buf2[ 1] = esalt_bufs[salt_pos].esalt_buf[33]; + esalt_buf2[ 2] = esalt_bufs[salt_pos].esalt_buf[34]; + esalt_buf2[ 3] = esalt_bufs[salt_pos].esalt_buf[35]; + esalt_buf2[ 4] = esalt_bufs[salt_pos].esalt_buf[36]; + esalt_buf2[ 5] = esalt_bufs[salt_pos].esalt_buf[37]; + esalt_buf2[ 6] = 0; + esalt_buf2[ 7] = 0; + esalt_buf2[ 8] = 0; + esalt_buf2[ 9] = 0; + esalt_buf2[10] = 0; + esalt_buf2[11] = 0; + esalt_buf2[12] = 0; + esalt_buf2[13] = 0; + esalt_buf2[14] = 0; + esalt_buf2[15] = 0; + + const u32 digest_esalt_len = 32 + esalt_len; + + /** + * loop + */ + + u32x w0l = w0[0]; + + for (u32 il_pos = 0; il_pos < bfs_cnt; il_pos++) + { + const u32 w0r = c_bfs[il_pos].i; + + w0[0] = w0l | w0r; + + /* + * HA1 = md5 ($salt . $pass) + */ + + // append the pass to the salt + + u32x block0[16]; + + block0[ 0] = salt_buf0[ 0]; + block0[ 1] = salt_buf0[ 1]; + block0[ 2] = salt_buf0[ 2]; + block0[ 3] = salt_buf0[ 3]; + block0[ 4] = salt_buf0[ 4]; + block0[ 5] = salt_buf0[ 5]; + block0[ 6] = salt_buf0[ 6]; + block0[ 7] = salt_buf0[ 7]; + block0[ 8] = salt_buf0[ 8]; + block0[ 9] = salt_buf0[ 9]; + block0[10] = salt_buf0[10]; + block0[11] = salt_buf0[11]; + block0[12] = salt_buf0[12]; + block0[13] = salt_buf0[13]; + block0[14] = salt_buf0[14]; + block0[15] = salt_buf0[15]; + + u32x block1[16]; + + block1[ 0] = salt_buf1[ 0]; + block1[ 1] = salt_buf1[ 1]; + block1[ 2] = salt_buf1[ 2]; + block1[ 3] = salt_buf1[ 3]; + block1[ 4] = salt_buf1[ 4]; + block1[ 5] = salt_buf1[ 5]; + block1[ 6] = salt_buf1[ 6]; + block1[ 7] = salt_buf1[ 7]; + block1[ 8] = salt_buf1[ 8]; + block1[ 9] = salt_buf1[ 9]; + block1[10] = salt_buf1[10]; + block1[11] = salt_buf1[11]; + block1[12] = salt_buf1[12]; + block1[13] = salt_buf1[13]; + block1[14] = salt_buf1[14]; + block1[15] = salt_buf1[15]; + + memcat32 (block0, block1, salt_len, w0, w1, w2, w3, pw_len); + + u32x w0_t[4]; + + w0_t[0] = block0[ 0]; + w0_t[1] = block0[ 1]; + w0_t[2] = block0[ 2]; + w0_t[3] = block0[ 3]; + + u32x w1_t[4]; + + w1_t[0] = block0[ 4]; + w1_t[1] = block0[ 5]; + w1_t[2] = block0[ 6]; + w1_t[3] = block0[ 7]; + + u32x w2_t[4]; + + w2_t[0] = block0[ 8]; + w2_t[1] = block0[ 9]; + w2_t[2] = block0[10]; + w2_t[3] = block0[11]; + + u32x w3_t[4]; + + w3_t[0] = block0[12]; + w3_t[1] = block0[13]; + w3_t[2] = pw_salt_len * 8; + w3_t[3] = 0; + + // md5 + + u32x tmp2; + + u32x a = MD5M_A; + u32x b = MD5M_B; + u32x c = MD5M_C; + u32x d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0_t[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0_t[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0_t[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1_t[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1_t[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1_t[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2_t[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2_t[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2_t[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3_t[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3_t[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3_t[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0_t[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1_t[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2_t[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1_t[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1_t[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2_t[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3_t[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0_t[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2_t[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3_t[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0_t[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1_t[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3_t[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H1, a, b, c, d, w1_t[1], MD5C20, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w2_t[0], MD5C21, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w2_t[3], MD5C22, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w3_t[2], MD5C23, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w0_t[1], MD5C24, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w1_t[0], MD5C25, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w1_t[3], MD5C26, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w2_t[2], MD5C27, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w3_t[1], MD5C28, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w0_t[0], MD5C29, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w0_t[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w1_t[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w2_t[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w3_t[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w3_t[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w0_t[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1_t[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3_t[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3_t[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0_t[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0_t[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2_t[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1_t[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3_t[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1_t[0], MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w2_t[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0_t[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2_t[1], MD5C3f, MD5S33); + + a += MD5M_A; + b += MD5M_B; + c += MD5M_C; + d += MD5M_D; + + /* + * final = md5 ($HA1 . $esalt) + * we have at least 2 MD5 blocks/transformations, but we might need 3 + */ + + w0_t[0] = uint_to_hex_lower8 ((a >> 0) & 255) << 0 + | uint_to_hex_lower8 ((a >> 8) & 255) << 16; + w0_t[1] = uint_to_hex_lower8 ((a >> 16) & 255) << 0 + | uint_to_hex_lower8 ((a >> 24) & 255) << 16; + w0_t[2] = uint_to_hex_lower8 ((b >> 0) & 255) << 0 + | uint_to_hex_lower8 ((b >> 8) & 255) << 16; + w0_t[3] = uint_to_hex_lower8 ((b >> 16) & 255) << 0 + | uint_to_hex_lower8 ((b >> 24) & 255) << 16; + w1_t[0] = uint_to_hex_lower8 ((c >> 0) & 255) << 0 + | uint_to_hex_lower8 ((c >> 8) & 255) << 16; + w1_t[1] = uint_to_hex_lower8 ((c >> 16) & 255) << 0 + | uint_to_hex_lower8 ((c >> 24) & 255) << 16; + w1_t[2] = uint_to_hex_lower8 ((d >> 0) & 255) << 0 + | uint_to_hex_lower8 ((d >> 8) & 255) << 16; + w1_t[3] = uint_to_hex_lower8 ((d >> 16) & 255) << 0 + | uint_to_hex_lower8 ((d >> 24) & 255) << 16; + + w2_t[0] = esalt_buf0[0]; + w2_t[1] = esalt_buf0[1]; + w2_t[2] = esalt_buf0[2]; + w2_t[3] = esalt_buf0[3]; + + w3_t[0] = esalt_buf0[4]; + w3_t[1] = esalt_buf0[5]; + w3_t[2] = esalt_buf0[6]; + w3_t[3] = esalt_buf0[7]; + + // md5 + // 1st transform + + a = MD5M_A; + b = MD5M_B; + c = MD5M_C; + d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0_t[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0_t[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0_t[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1_t[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1_t[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1_t[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2_t[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2_t[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2_t[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3_t[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3_t[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3_t[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0_t[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1_t[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2_t[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1_t[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1_t[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2_t[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3_t[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0_t[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2_t[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3_t[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0_t[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1_t[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3_t[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H1, a, b, c, d, w1_t[1], MD5C20, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w2_t[0], MD5C21, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w2_t[3], MD5C22, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w3_t[2], MD5C23, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w0_t[1], MD5C24, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w1_t[0], MD5C25, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w1_t[3], MD5C26, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w2_t[2], MD5C27, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w3_t[1], MD5C28, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w0_t[0], MD5C29, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w0_t[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w1_t[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w2_t[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w3_t[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w3_t[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w0_t[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1_t[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3_t[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3_t[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0_t[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0_t[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2_t[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1_t[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3_t[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1_t[0], MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w2_t[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0_t[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2_t[1], MD5C3f, MD5S33); + + a += MD5M_A; + b += MD5M_B; + c += MD5M_C; + d += MD5M_D; + + u32x r_a = a; + u32x r_b = b; + u32x r_c = c; + u32x r_d = d; + + // 2nd transform + + w0_t[0] = esalt_buf0[ 8]; + w0_t[1] = esalt_buf0[ 9]; + w0_t[2] = esalt_buf0[10]; + w0_t[3] = esalt_buf0[11]; + + w1_t[0] = esalt_buf0[12]; + w1_t[1] = esalt_buf0[13]; + w1_t[2] = esalt_buf0[14]; + w1_t[3] = esalt_buf0[15]; + + w2_t[0] = esalt_buf1[ 0]; + w2_t[1] = esalt_buf1[ 1]; + w2_t[2] = esalt_buf1[ 2]; + w2_t[3] = esalt_buf1[ 3]; + + w3_t[0] = esalt_buf1[ 4]; + w3_t[1] = esalt_buf1[ 5]; + w3_t[2] = esalt_buf1[ 6]; + w3_t[3] = esalt_buf1[ 7]; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0_t[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0_t[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0_t[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1_t[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1_t[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1_t[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2_t[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2_t[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2_t[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3_t[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3_t[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3_t[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0_t[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1_t[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2_t[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1_t[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1_t[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2_t[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3_t[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0_t[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2_t[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3_t[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0_t[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1_t[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3_t[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H1, a, b, c, d, w1_t[1], MD5C20, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w2_t[0], MD5C21, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w2_t[3], MD5C22, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w3_t[2], MD5C23, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w0_t[1], MD5C24, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w1_t[0], MD5C25, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w1_t[3], MD5C26, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w2_t[2], MD5C27, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w3_t[1], MD5C28, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w0_t[0], MD5C29, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w0_t[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w1_t[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w2_t[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w3_t[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w3_t[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w0_t[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1_t[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3_t[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3_t[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0_t[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0_t[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2_t[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1_t[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3_t[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1_t[0], MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w2_t[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0_t[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2_t[1], MD5C3f, MD5S33); + + // this is for sure the final block + + a += r_a; + b += r_b; + c += r_c; + d += r_d; + + r_a = a; + r_b = b; + r_c = c; + r_d = d; + + w0_t[0] = esalt_buf1[ 8]; + w0_t[1] = esalt_buf1[ 9]; + w0_t[2] = esalt_buf1[10]; + w0_t[3] = esalt_buf1[11]; + + w1_t[0] = esalt_buf1[12]; + w1_t[1] = esalt_buf1[13]; + w1_t[2] = esalt_buf1[14]; + w1_t[3] = esalt_buf1[15]; + + w2_t[0] = esalt_buf2[ 0]; + w2_t[1] = esalt_buf2[ 1]; + w2_t[2] = esalt_buf2[ 2]; + w2_t[3] = esalt_buf2[ 3]; + + w3_t[0] = esalt_buf2[ 4]; + w3_t[1] = esalt_buf2[ 5]; + w3_t[2] = digest_esalt_len * 8; + w3_t[3] = 0; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0_t[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0_t[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0_t[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1_t[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1_t[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1_t[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2_t[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2_t[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2_t[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3_t[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3_t[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3_t[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0_t[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1_t[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2_t[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1_t[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1_t[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2_t[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3_t[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0_t[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2_t[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3_t[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0_t[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1_t[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3_t[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H1, a, b, c, d, w1_t[1], MD5C20, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w2_t[0], MD5C21, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w2_t[3], MD5C22, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w3_t[2], MD5C23, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w0_t[1], MD5C24, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w1_t[0], MD5C25, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w1_t[3], MD5C26, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w2_t[2], MD5C27, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w3_t[1], MD5C28, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w0_t[0], MD5C29, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w0_t[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w1_t[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w2_t[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w3_t[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w3_t[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w0_t[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1_t[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3_t[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3_t[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0_t[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0_t[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2_t[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1_t[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3_t[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1_t[0], MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w2_t[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0_t[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2_t[1], MD5C3f, MD5S33); + + a += r_a; + b += r_b; + c += r_c; + d += r_d; + + const u32x r0 = a; + const u32x r1 = d; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_S + } +} + +__device__ static void m11400s_1_0 (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], const u32 pw_len, const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const sip_t *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset) +{ + /** + * modifier + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + const u32 lid = threadIdx.x; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * salt + */ + + const u32 salt_len = esalt_bufs[salt_pos].salt_len; // not a bug, we need to get it from the esalt + + const u32 pw_salt_len = salt_len + pw_len; + + u32 salt_buf0[16]; + + salt_buf0[ 0] = esalt_bufs[salt_pos].salt_buf[ 0]; + salt_buf0[ 1] = esalt_bufs[salt_pos].salt_buf[ 1]; + salt_buf0[ 2] = esalt_bufs[salt_pos].salt_buf[ 2]; + salt_buf0[ 3] = esalt_bufs[salt_pos].salt_buf[ 3]; + salt_buf0[ 4] = esalt_bufs[salt_pos].salt_buf[ 4]; + salt_buf0[ 5] = esalt_bufs[salt_pos].salt_buf[ 5]; + salt_buf0[ 6] = esalt_bufs[salt_pos].salt_buf[ 6]; + salt_buf0[ 7] = esalt_bufs[salt_pos].salt_buf[ 7]; + salt_buf0[ 8] = esalt_bufs[salt_pos].salt_buf[ 8]; + salt_buf0[ 9] = esalt_bufs[salt_pos].salt_buf[ 9]; + salt_buf0[10] = esalt_bufs[salt_pos].salt_buf[10]; + salt_buf0[11] = esalt_bufs[salt_pos].salt_buf[11]; + salt_buf0[12] = esalt_bufs[salt_pos].salt_buf[12]; + salt_buf0[13] = esalt_bufs[salt_pos].salt_buf[13]; + salt_buf0[14] = esalt_bufs[salt_pos].salt_buf[14]; + salt_buf0[15] = esalt_bufs[salt_pos].salt_buf[15]; + + u32 salt_buf1[16]; + + salt_buf1[ 0] = esalt_bufs[salt_pos].salt_buf[16]; + salt_buf1[ 1] = esalt_bufs[salt_pos].salt_buf[17]; + salt_buf1[ 2] = esalt_bufs[salt_pos].salt_buf[18]; + salt_buf1[ 3] = esalt_bufs[salt_pos].salt_buf[19]; + salt_buf1[ 4] = esalt_bufs[salt_pos].salt_buf[20]; + salt_buf1[ 5] = esalt_bufs[salt_pos].salt_buf[21]; + salt_buf1[ 6] = esalt_bufs[salt_pos].salt_buf[22]; + salt_buf1[ 7] = esalt_bufs[salt_pos].salt_buf[23]; + salt_buf1[ 8] = esalt_bufs[salt_pos].salt_buf[24]; + salt_buf1[ 9] = esalt_bufs[salt_pos].salt_buf[25]; + salt_buf1[10] = esalt_bufs[salt_pos].salt_buf[26]; + salt_buf1[11] = esalt_bufs[salt_pos].salt_buf[27]; + salt_buf1[12] = esalt_bufs[salt_pos].salt_buf[28]; + salt_buf1[13] = esalt_bufs[salt_pos].salt_buf[29]; + salt_buf1[14] = 0; + salt_buf1[15] = 0; + + /** + * esalt + */ + + const u32 esalt_len = esalt_bufs[salt_pos].esalt_len; + + u32 esalt_buf0[16]; + + esalt_buf0[ 0] = esalt_bufs[salt_pos].esalt_buf[ 0]; + esalt_buf0[ 1] = esalt_bufs[salt_pos].esalt_buf[ 1]; + esalt_buf0[ 2] = esalt_bufs[salt_pos].esalt_buf[ 2]; + esalt_buf0[ 3] = esalt_bufs[salt_pos].esalt_buf[ 3]; + esalt_buf0[ 4] = esalt_bufs[salt_pos].esalt_buf[ 4]; + esalt_buf0[ 5] = esalt_bufs[salt_pos].esalt_buf[ 5]; + esalt_buf0[ 6] = esalt_bufs[salt_pos].esalt_buf[ 6]; + esalt_buf0[ 7] = esalt_bufs[salt_pos].esalt_buf[ 7]; + esalt_buf0[ 8] = esalt_bufs[salt_pos].esalt_buf[ 8]; + esalt_buf0[ 9] = esalt_bufs[salt_pos].esalt_buf[ 9]; + esalt_buf0[10] = esalt_bufs[salt_pos].esalt_buf[10]; + esalt_buf0[11] = esalt_bufs[salt_pos].esalt_buf[11]; + esalt_buf0[12] = esalt_bufs[salt_pos].esalt_buf[12]; + esalt_buf0[13] = esalt_bufs[salt_pos].esalt_buf[13]; + esalt_buf0[14] = esalt_bufs[salt_pos].esalt_buf[14]; + esalt_buf0[15] = esalt_bufs[salt_pos].esalt_buf[15]; + + u32 esalt_buf1[16]; + + esalt_buf1[ 0] = esalt_bufs[salt_pos].esalt_buf[16]; + esalt_buf1[ 1] = esalt_bufs[salt_pos].esalt_buf[17]; + esalt_buf1[ 2] = esalt_bufs[salt_pos].esalt_buf[18]; + esalt_buf1[ 3] = esalt_bufs[salt_pos].esalt_buf[19]; + esalt_buf1[ 4] = esalt_bufs[salt_pos].esalt_buf[20]; + esalt_buf1[ 5] = esalt_bufs[salt_pos].esalt_buf[21]; + esalt_buf1[ 6] = esalt_bufs[salt_pos].esalt_buf[22]; + esalt_buf1[ 7] = esalt_bufs[salt_pos].esalt_buf[23]; + esalt_buf1[ 8] = esalt_bufs[salt_pos].esalt_buf[24]; + esalt_buf1[ 9] = esalt_bufs[salt_pos].esalt_buf[25]; + esalt_buf1[10] = esalt_bufs[salt_pos].esalt_buf[26]; + esalt_buf1[11] = esalt_bufs[salt_pos].esalt_buf[27]; + esalt_buf1[12] = esalt_bufs[salt_pos].esalt_buf[28]; + esalt_buf1[13] = esalt_bufs[salt_pos].esalt_buf[29]; + esalt_buf1[14] = esalt_bufs[salt_pos].esalt_buf[30]; + esalt_buf1[15] = esalt_bufs[salt_pos].esalt_buf[31]; + + const u32 digest_esalt_len = 32 + esalt_len; + + /** + * loop + */ + + u32x w0l = w0[0]; + + for (u32 il_pos = 0; il_pos < bfs_cnt; il_pos++) + { + const u32 w0r = c_bfs[il_pos].i; + + w0[0] = w0l | w0r; + + /* + * HA1 = md5 ($salt . $pass) + */ + + // append the pass to the salt + + u32x block0[16]; + + block0[ 0] = salt_buf0[ 0]; + block0[ 1] = salt_buf0[ 1]; + block0[ 2] = salt_buf0[ 2]; + block0[ 3] = salt_buf0[ 3]; + block0[ 4] = salt_buf0[ 4]; + block0[ 5] = salt_buf0[ 5]; + block0[ 6] = salt_buf0[ 6]; + block0[ 7] = salt_buf0[ 7]; + block0[ 8] = salt_buf0[ 8]; + block0[ 9] = salt_buf0[ 9]; + block0[10] = salt_buf0[10]; + block0[11] = salt_buf0[11]; + block0[12] = salt_buf0[12]; + block0[13] = salt_buf0[13]; + block0[14] = salt_buf0[14]; + block0[15] = salt_buf0[15]; + + u32x block1[16]; + + block1[ 0] = salt_buf1[ 0]; + block1[ 1] = salt_buf1[ 1]; + block1[ 2] = salt_buf1[ 2]; + block1[ 3] = salt_buf1[ 3]; + block1[ 4] = salt_buf1[ 4]; + block1[ 5] = salt_buf1[ 5]; + block1[ 6] = salt_buf1[ 6]; + block1[ 7] = salt_buf1[ 7]; + block1[ 8] = salt_buf1[ 8]; + block1[ 9] = salt_buf1[ 9]; + block1[10] = salt_buf1[10]; + block1[11] = salt_buf1[11]; + block1[12] = salt_buf1[12]; + block1[13] = salt_buf1[13]; + block1[14] = salt_buf1[14]; + block1[15] = salt_buf1[15]; + + memcat32 (block0, block1, salt_len, w0, w1, w2, w3, pw_len); + + u32x w0_t[4]; + + w0_t[0] = block0[ 0]; + w0_t[1] = block0[ 1]; + w0_t[2] = block0[ 2]; + w0_t[3] = block0[ 3]; + + u32x w1_t[4]; + + w1_t[0] = block0[ 4]; + w1_t[1] = block0[ 5]; + w1_t[2] = block0[ 6]; + w1_t[3] = block0[ 7]; + + u32x w2_t[4]; + + w2_t[0] = block0[ 8]; + w2_t[1] = block0[ 9]; + w2_t[2] = block0[10]; + w2_t[3] = block0[11]; + + u32x w3_t[4]; + + w3_t[0] = block0[12]; + w3_t[1] = block0[13]; + w3_t[2] = block0[14]; + w3_t[3] = block0[15]; + + // md5 + + u32x tmp2; + + u32x a = MD5M_A; + u32x b = MD5M_B; + u32x c = MD5M_C; + u32x d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0_t[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0_t[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0_t[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1_t[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1_t[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1_t[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2_t[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2_t[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2_t[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3_t[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3_t[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3_t[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0_t[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1_t[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2_t[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1_t[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1_t[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2_t[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3_t[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0_t[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2_t[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3_t[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0_t[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1_t[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3_t[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H1, a, b, c, d, w1_t[1], MD5C20, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w2_t[0], MD5C21, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w2_t[3], MD5C22, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w3_t[2], MD5C23, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w0_t[1], MD5C24, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w1_t[0], MD5C25, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w1_t[3], MD5C26, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w2_t[2], MD5C27, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w3_t[1], MD5C28, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w0_t[0], MD5C29, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w0_t[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w1_t[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w2_t[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w3_t[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w3_t[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w0_t[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1_t[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3_t[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3_t[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0_t[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0_t[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2_t[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1_t[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3_t[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1_t[0], MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w2_t[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0_t[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2_t[1], MD5C3f, MD5S33); + + a += MD5M_A; + b += MD5M_B; + c += MD5M_C; + d += MD5M_D; + + u32x r_a = a; + u32x r_b = b; + u32x r_c = c; + u32x r_d = d; + + w0_t[0] = block1[ 0]; + w0_t[1] = block1[ 1]; + w0_t[2] = block1[ 2]; + w0_t[3] = block1[ 3]; + + w1_t[0] = block1[ 4]; + w1_t[1] = block1[ 5]; + w1_t[2] = block1[ 6]; + w1_t[3] = block1[ 7]; + + w2_t[0] = block1[ 8]; + w2_t[1] = block1[ 9]; + w2_t[2] = block1[10]; + w2_t[3] = block1[11]; + + w3_t[0] = block1[12]; + w3_t[1] = block1[13]; + w3_t[2] = pw_salt_len * 8; + w3_t[3] = 0; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0_t[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0_t[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0_t[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1_t[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1_t[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1_t[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2_t[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2_t[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2_t[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3_t[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3_t[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3_t[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0_t[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1_t[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2_t[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1_t[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1_t[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2_t[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3_t[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0_t[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2_t[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3_t[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0_t[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1_t[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3_t[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H1, a, b, c, d, w1_t[1], MD5C20, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w2_t[0], MD5C21, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w2_t[3], MD5C22, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w3_t[2], MD5C23, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w0_t[1], MD5C24, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w1_t[0], MD5C25, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w1_t[3], MD5C26, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w2_t[2], MD5C27, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w3_t[1], MD5C28, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w0_t[0], MD5C29, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w0_t[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w1_t[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w2_t[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w3_t[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w3_t[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w0_t[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1_t[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3_t[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3_t[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0_t[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0_t[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2_t[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1_t[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3_t[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1_t[0], MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w2_t[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0_t[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2_t[1], MD5C3f, MD5S33); + + a += r_a; + b += r_b; + c += r_c; + d += r_d; + + /* + * final = md5 ($HA1 . $esalt) + * we have at least 2 MD5 blocks/transformations, but we might need 3 + */ + + w0_t[0] = uint_to_hex_lower8 ((a >> 0) & 255) << 0 + | uint_to_hex_lower8 ((a >> 8) & 255) << 16; + w0_t[1] = uint_to_hex_lower8 ((a >> 16) & 255) << 0 + | uint_to_hex_lower8 ((a >> 24) & 255) << 16; + w0_t[2] = uint_to_hex_lower8 ((b >> 0) & 255) << 0 + | uint_to_hex_lower8 ((b >> 8) & 255) << 16; + w0_t[3] = uint_to_hex_lower8 ((b >> 16) & 255) << 0 + | uint_to_hex_lower8 ((b >> 24) & 255) << 16; + w1_t[0] = uint_to_hex_lower8 ((c >> 0) & 255) << 0 + | uint_to_hex_lower8 ((c >> 8) & 255) << 16; + w1_t[1] = uint_to_hex_lower8 ((c >> 16) & 255) << 0 + | uint_to_hex_lower8 ((c >> 24) & 255) << 16; + w1_t[2] = uint_to_hex_lower8 ((d >> 0) & 255) << 0 + | uint_to_hex_lower8 ((d >> 8) & 255) << 16; + w1_t[3] = uint_to_hex_lower8 ((d >> 16) & 255) << 0 + | uint_to_hex_lower8 ((d >> 24) & 255) << 16; + + w2_t[0] = esalt_buf0[0]; + w2_t[1] = esalt_buf0[1]; + w2_t[2] = esalt_buf0[2]; + w2_t[3] = esalt_buf0[3]; + + w3_t[0] = esalt_buf0[4]; + w3_t[1] = esalt_buf0[5]; + w3_t[2] = esalt_buf0[6]; + w3_t[3] = esalt_buf0[7]; + + // md5 + // 1st transform + + a = MD5M_A; + b = MD5M_B; + c = MD5M_C; + d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0_t[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0_t[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0_t[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1_t[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1_t[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1_t[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2_t[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2_t[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2_t[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3_t[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3_t[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3_t[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0_t[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1_t[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2_t[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1_t[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1_t[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2_t[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3_t[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0_t[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2_t[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3_t[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0_t[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1_t[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3_t[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H1, a, b, c, d, w1_t[1], MD5C20, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w2_t[0], MD5C21, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w2_t[3], MD5C22, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w3_t[2], MD5C23, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w0_t[1], MD5C24, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w1_t[0], MD5C25, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w1_t[3], MD5C26, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w2_t[2], MD5C27, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w3_t[1], MD5C28, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w0_t[0], MD5C29, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w0_t[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w1_t[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w2_t[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w3_t[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w3_t[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w0_t[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1_t[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3_t[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3_t[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0_t[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0_t[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2_t[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1_t[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3_t[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1_t[0], MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w2_t[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0_t[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2_t[1], MD5C3f, MD5S33); + + a += MD5M_A; + b += MD5M_B; + c += MD5M_C; + d += MD5M_D; + + r_a = a; + r_b = b; + r_c = c; + r_d = d; + + // 2nd transform + + w0_t[0] = esalt_buf0[ 8]; + w0_t[1] = esalt_buf0[ 9]; + w0_t[2] = esalt_buf0[10]; + w0_t[3] = esalt_buf0[11]; + + w1_t[0] = esalt_buf0[12]; + w1_t[1] = esalt_buf0[13]; + w1_t[2] = esalt_buf0[14]; + w1_t[3] = esalt_buf0[15]; + + w2_t[0] = esalt_buf1[ 0]; + w2_t[1] = esalt_buf1[ 1]; + w2_t[2] = esalt_buf1[ 2]; + w2_t[3] = esalt_buf1[ 3]; + + w3_t[0] = esalt_buf1[ 4]; + w3_t[1] = esalt_buf1[ 5]; + w3_t[2] = digest_esalt_len * 8; + w3_t[3] = 0; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0_t[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0_t[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0_t[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1_t[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1_t[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1_t[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2_t[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2_t[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2_t[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3_t[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3_t[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3_t[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0_t[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1_t[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2_t[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1_t[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1_t[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2_t[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3_t[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0_t[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2_t[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3_t[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0_t[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1_t[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3_t[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H1, a, b, c, d, w1_t[1], MD5C20, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w2_t[0], MD5C21, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w2_t[3], MD5C22, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w3_t[2], MD5C23, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w0_t[1], MD5C24, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w1_t[0], MD5C25, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w1_t[3], MD5C26, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w2_t[2], MD5C27, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w3_t[1], MD5C28, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w0_t[0], MD5C29, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w0_t[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w1_t[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w2_t[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w3_t[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w3_t[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w0_t[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1_t[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3_t[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3_t[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0_t[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0_t[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2_t[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1_t[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3_t[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1_t[0], MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w2_t[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0_t[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2_t[1], MD5C3f, MD5S33); + + a += r_a; + b += r_b; + c += r_c; + d += r_d; + + const u32x r0 = a; + const u32x r1 = d; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_S + } +} + +__device__ static void m11400s_1_1 (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], const u32 pw_len, const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const sip_t *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset) +{ + /** + * modifier + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + const u32 lid = threadIdx.x; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * salt + */ + + const u32 salt_len = esalt_bufs[salt_pos].salt_len; // not a bug, we need to get it from the esalt + + const u32 pw_salt_len = salt_len + pw_len; + + u32 salt_buf0[16]; + + salt_buf0[ 0] = esalt_bufs[salt_pos].salt_buf[ 0]; + salt_buf0[ 1] = esalt_bufs[salt_pos].salt_buf[ 1]; + salt_buf0[ 2] = esalt_bufs[salt_pos].salt_buf[ 2]; + salt_buf0[ 3] = esalt_bufs[salt_pos].salt_buf[ 3]; + salt_buf0[ 4] = esalt_bufs[salt_pos].salt_buf[ 4]; + salt_buf0[ 5] = esalt_bufs[salt_pos].salt_buf[ 5]; + salt_buf0[ 6] = esalt_bufs[salt_pos].salt_buf[ 6]; + salt_buf0[ 7] = esalt_bufs[salt_pos].salt_buf[ 7]; + salt_buf0[ 8] = esalt_bufs[salt_pos].salt_buf[ 8]; + salt_buf0[ 9] = esalt_bufs[salt_pos].salt_buf[ 9]; + salt_buf0[10] = esalt_bufs[salt_pos].salt_buf[10]; + salt_buf0[11] = esalt_bufs[salt_pos].salt_buf[11]; + salt_buf0[12] = esalt_bufs[salt_pos].salt_buf[12]; + salt_buf0[13] = esalt_bufs[salt_pos].salt_buf[13]; + salt_buf0[14] = esalt_bufs[salt_pos].salt_buf[14]; + salt_buf0[15] = esalt_bufs[salt_pos].salt_buf[15]; + + u32 salt_buf1[16]; + + salt_buf1[ 0] = esalt_bufs[salt_pos].salt_buf[16]; + salt_buf1[ 1] = esalt_bufs[salt_pos].salt_buf[17]; + salt_buf1[ 2] = esalt_bufs[salt_pos].salt_buf[18]; + salt_buf1[ 3] = esalt_bufs[salt_pos].salt_buf[19]; + salt_buf1[ 4] = esalt_bufs[salt_pos].salt_buf[20]; + salt_buf1[ 5] = esalt_bufs[salt_pos].salt_buf[21]; + salt_buf1[ 6] = esalt_bufs[salt_pos].salt_buf[22]; + salt_buf1[ 7] = esalt_bufs[salt_pos].salt_buf[23]; + salt_buf1[ 8] = esalt_bufs[salt_pos].salt_buf[24]; + salt_buf1[ 9] = esalt_bufs[salt_pos].salt_buf[25]; + salt_buf1[10] = esalt_bufs[salt_pos].salt_buf[26]; + salt_buf1[11] = esalt_bufs[salt_pos].salt_buf[27]; + salt_buf1[12] = esalt_bufs[salt_pos].salt_buf[28]; + salt_buf1[13] = esalt_bufs[salt_pos].salt_buf[29]; + salt_buf1[14] = 0; + salt_buf1[15] = 0; + + /** + * esalt + */ + + const u32 esalt_len = esalt_bufs[salt_pos].esalt_len; + + u32 esalt_buf0[16]; + + esalt_buf0[ 0] = esalt_bufs[salt_pos].esalt_buf[ 0]; + esalt_buf0[ 1] = esalt_bufs[salt_pos].esalt_buf[ 1]; + esalt_buf0[ 2] = esalt_bufs[salt_pos].esalt_buf[ 2]; + esalt_buf0[ 3] = esalt_bufs[salt_pos].esalt_buf[ 3]; + esalt_buf0[ 4] = esalt_bufs[salt_pos].esalt_buf[ 4]; + esalt_buf0[ 5] = esalt_bufs[salt_pos].esalt_buf[ 5]; + esalt_buf0[ 6] = esalt_bufs[salt_pos].esalt_buf[ 6]; + esalt_buf0[ 7] = esalt_bufs[salt_pos].esalt_buf[ 7]; + esalt_buf0[ 8] = esalt_bufs[salt_pos].esalt_buf[ 8]; + esalt_buf0[ 9] = esalt_bufs[salt_pos].esalt_buf[ 9]; + esalt_buf0[10] = esalt_bufs[salt_pos].esalt_buf[10]; + esalt_buf0[11] = esalt_bufs[salt_pos].esalt_buf[11]; + esalt_buf0[12] = esalt_bufs[salt_pos].esalt_buf[12]; + esalt_buf0[13] = esalt_bufs[salt_pos].esalt_buf[13]; + esalt_buf0[14] = esalt_bufs[salt_pos].esalt_buf[14]; + esalt_buf0[15] = esalt_bufs[salt_pos].esalt_buf[15]; + + u32 esalt_buf1[16]; + + esalt_buf1[ 0] = esalt_bufs[salt_pos].esalt_buf[16]; + esalt_buf1[ 1] = esalt_bufs[salt_pos].esalt_buf[17]; + esalt_buf1[ 2] = esalt_bufs[salt_pos].esalt_buf[18]; + esalt_buf1[ 3] = esalt_bufs[salt_pos].esalt_buf[19]; + esalt_buf1[ 4] = esalt_bufs[salt_pos].esalt_buf[20]; + esalt_buf1[ 5] = esalt_bufs[salt_pos].esalt_buf[21]; + esalt_buf1[ 6] = esalt_bufs[salt_pos].esalt_buf[22]; + esalt_buf1[ 7] = esalt_bufs[salt_pos].esalt_buf[23]; + esalt_buf1[ 8] = esalt_bufs[salt_pos].esalt_buf[24]; + esalt_buf1[ 9] = esalt_bufs[salt_pos].esalt_buf[25]; + esalt_buf1[10] = esalt_bufs[salt_pos].esalt_buf[26]; + esalt_buf1[11] = esalt_bufs[salt_pos].esalt_buf[27]; + esalt_buf1[12] = esalt_bufs[salt_pos].esalt_buf[28]; + esalt_buf1[13] = esalt_bufs[salt_pos].esalt_buf[29]; + esalt_buf1[14] = esalt_bufs[salt_pos].esalt_buf[30]; + esalt_buf1[15] = esalt_bufs[salt_pos].esalt_buf[31]; + + u32 esalt_buf2[16]; + + esalt_buf2[ 0] = esalt_bufs[salt_pos].esalt_buf[32]; + esalt_buf2[ 1] = esalt_bufs[salt_pos].esalt_buf[33]; + esalt_buf2[ 2] = esalt_bufs[salt_pos].esalt_buf[34]; + esalt_buf2[ 3] = esalt_bufs[salt_pos].esalt_buf[35]; + esalt_buf2[ 4] = esalt_bufs[salt_pos].esalt_buf[36]; + esalt_buf2[ 5] = esalt_bufs[salt_pos].esalt_buf[37]; + esalt_buf2[ 6] = 0; + esalt_buf2[ 7] = 0; + esalt_buf2[ 8] = 0; + esalt_buf2[ 9] = 0; + esalt_buf2[10] = 0; + esalt_buf2[11] = 0; + esalt_buf2[12] = 0; + esalt_buf2[13] = 0; + esalt_buf2[14] = 0; + esalt_buf2[15] = 0; + + const u32 digest_esalt_len = 32 + esalt_len; + + /** + * loop + */ + + u32x w0l = w0[0]; + + for (u32 il_pos = 0; il_pos < bfs_cnt; il_pos++) + { + const u32 w0r = c_bfs[il_pos].i; + + w0[0] = w0l | w0r; + + /* + * HA1 = md5 ($salt . $pass) + */ + + // append the pass to the salt + + u32x block0[16]; + + block0[ 0] = salt_buf0[ 0]; + block0[ 1] = salt_buf0[ 1]; + block0[ 2] = salt_buf0[ 2]; + block0[ 3] = salt_buf0[ 3]; + block0[ 4] = salt_buf0[ 4]; + block0[ 5] = salt_buf0[ 5]; + block0[ 6] = salt_buf0[ 6]; + block0[ 7] = salt_buf0[ 7]; + block0[ 8] = salt_buf0[ 8]; + block0[ 9] = salt_buf0[ 9]; + block0[10] = salt_buf0[10]; + block0[11] = salt_buf0[11]; + block0[12] = salt_buf0[12]; + block0[13] = salt_buf0[13]; + block0[14] = salt_buf0[14]; + block0[15] = salt_buf0[15]; + + u32x block1[16]; + + block1[ 0] = salt_buf1[ 0]; + block1[ 1] = salt_buf1[ 1]; + block1[ 2] = salt_buf1[ 2]; + block1[ 3] = salt_buf1[ 3]; + block1[ 4] = salt_buf1[ 4]; + block1[ 5] = salt_buf1[ 5]; + block1[ 6] = salt_buf1[ 6]; + block1[ 7] = salt_buf1[ 7]; + block1[ 8] = salt_buf1[ 8]; + block1[ 9] = salt_buf1[ 9]; + block1[10] = salt_buf1[10]; + block1[11] = salt_buf1[11]; + block1[12] = salt_buf1[12]; + block1[13] = salt_buf1[13]; + block1[14] = salt_buf1[14]; + block1[15] = salt_buf1[15]; + + memcat32 (block0, block1, salt_len, w0, w1, w2, w3, pw_len); + + u32x w0_t[4]; + + w0_t[0] = block0[ 0]; + w0_t[1] = block0[ 1]; + w0_t[2] = block0[ 2]; + w0_t[3] = block0[ 3]; + + u32x w1_t[4]; + + w1_t[0] = block0[ 4]; + w1_t[1] = block0[ 5]; + w1_t[2] = block0[ 6]; + w1_t[3] = block0[ 7]; + + u32x w2_t[4]; + + w2_t[0] = block0[ 8]; + w2_t[1] = block0[ 9]; + w2_t[2] = block0[10]; + w2_t[3] = block0[11]; + + u32x w3_t[4]; + + w3_t[0] = block0[12]; + w3_t[1] = block0[13]; + w3_t[2] = block0[14]; + w3_t[3] = block0[15]; + + // md5 + + u32x tmp2; + + u32x a = MD5M_A; + u32x b = MD5M_B; + u32x c = MD5M_C; + u32x d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0_t[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0_t[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0_t[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1_t[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1_t[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1_t[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2_t[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2_t[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2_t[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3_t[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3_t[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3_t[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0_t[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1_t[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2_t[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1_t[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1_t[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2_t[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3_t[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0_t[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2_t[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3_t[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0_t[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1_t[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3_t[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H1, a, b, c, d, w1_t[1], MD5C20, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w2_t[0], MD5C21, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w2_t[3], MD5C22, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w3_t[2], MD5C23, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w0_t[1], MD5C24, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w1_t[0], MD5C25, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w1_t[3], MD5C26, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w2_t[2], MD5C27, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w3_t[1], MD5C28, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w0_t[0], MD5C29, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w0_t[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w1_t[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w2_t[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w3_t[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w3_t[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w0_t[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1_t[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3_t[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3_t[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0_t[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0_t[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2_t[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1_t[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3_t[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1_t[0], MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w2_t[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0_t[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2_t[1], MD5C3f, MD5S33); + + a += MD5M_A; + b += MD5M_B; + c += MD5M_C; + d += MD5M_D; + + u32x r_a = a; + u32x r_b = b; + u32x r_c = c; + u32x r_d = d; + + w0_t[0] = block1[ 0]; + w0_t[1] = block1[ 1]; + w0_t[2] = block1[ 2]; + w0_t[3] = block1[ 3]; + + w1_t[0] = block1[ 4]; + w1_t[1] = block1[ 5]; + w1_t[2] = block1[ 6]; + w1_t[3] = block1[ 7]; + + w2_t[0] = block1[ 8]; + w2_t[1] = block1[ 9]; + w2_t[2] = block1[10]; + w2_t[3] = block1[11]; + + w3_t[0] = block1[12]; + w3_t[1] = block1[13]; + w3_t[2] = pw_salt_len * 8; + w3_t[3] = 0; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0_t[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0_t[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0_t[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1_t[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1_t[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1_t[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2_t[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2_t[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2_t[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3_t[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3_t[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3_t[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0_t[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1_t[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2_t[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1_t[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1_t[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2_t[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3_t[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0_t[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2_t[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3_t[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0_t[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1_t[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3_t[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H1, a, b, c, d, w1_t[1], MD5C20, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w2_t[0], MD5C21, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w2_t[3], MD5C22, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w3_t[2], MD5C23, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w0_t[1], MD5C24, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w1_t[0], MD5C25, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w1_t[3], MD5C26, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w2_t[2], MD5C27, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w3_t[1], MD5C28, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w0_t[0], MD5C29, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w0_t[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w1_t[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w2_t[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w3_t[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w3_t[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w0_t[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1_t[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3_t[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3_t[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0_t[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0_t[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2_t[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1_t[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3_t[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1_t[0], MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w2_t[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0_t[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2_t[1], MD5C3f, MD5S33); + + a += r_a; + b += r_b; + c += r_c; + d += r_d; + + /* + * final = md5 ($HA1 . $esalt) + * we have at least 2 MD5 blocks/transformations, but we might need 3 + */ + + w0_t[0] = uint_to_hex_lower8 ((a >> 0) & 255) << 0 + | uint_to_hex_lower8 ((a >> 8) & 255) << 16; + w0_t[1] = uint_to_hex_lower8 ((a >> 16) & 255) << 0 + | uint_to_hex_lower8 ((a >> 24) & 255) << 16; + w0_t[2] = uint_to_hex_lower8 ((b >> 0) & 255) << 0 + | uint_to_hex_lower8 ((b >> 8) & 255) << 16; + w0_t[3] = uint_to_hex_lower8 ((b >> 16) & 255) << 0 + | uint_to_hex_lower8 ((b >> 24) & 255) << 16; + w1_t[0] = uint_to_hex_lower8 ((c >> 0) & 255) << 0 + | uint_to_hex_lower8 ((c >> 8) & 255) << 16; + w1_t[1] = uint_to_hex_lower8 ((c >> 16) & 255) << 0 + | uint_to_hex_lower8 ((c >> 24) & 255) << 16; + w1_t[2] = uint_to_hex_lower8 ((d >> 0) & 255) << 0 + | uint_to_hex_lower8 ((d >> 8) & 255) << 16; + w1_t[3] = uint_to_hex_lower8 ((d >> 16) & 255) << 0 + | uint_to_hex_lower8 ((d >> 24) & 255) << 16; + + w2_t[0] = esalt_buf0[0]; + w2_t[1] = esalt_buf0[1]; + w2_t[2] = esalt_buf0[2]; + w2_t[3] = esalt_buf0[3]; + + w3_t[0] = esalt_buf0[4]; + w3_t[1] = esalt_buf0[5]; + w3_t[2] = esalt_buf0[6]; + w3_t[3] = esalt_buf0[7]; + + // md5 + // 1st transform + + a = MD5M_A; + b = MD5M_B; + c = MD5M_C; + d = MD5M_D; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0_t[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0_t[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0_t[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1_t[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1_t[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1_t[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2_t[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2_t[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2_t[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3_t[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3_t[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3_t[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0_t[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1_t[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2_t[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1_t[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1_t[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2_t[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3_t[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0_t[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2_t[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3_t[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0_t[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1_t[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3_t[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H1, a, b, c, d, w1_t[1], MD5C20, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w2_t[0], MD5C21, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w2_t[3], MD5C22, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w3_t[2], MD5C23, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w0_t[1], MD5C24, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w1_t[0], MD5C25, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w1_t[3], MD5C26, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w2_t[2], MD5C27, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w3_t[1], MD5C28, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w0_t[0], MD5C29, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w0_t[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w1_t[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w2_t[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w3_t[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w3_t[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w0_t[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1_t[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3_t[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3_t[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0_t[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0_t[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2_t[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1_t[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3_t[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1_t[0], MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w2_t[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0_t[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2_t[1], MD5C3f, MD5S33); + + a += MD5M_A; + b += MD5M_B; + c += MD5M_C; + d += MD5M_D; + + r_a = a; + r_b = b; + r_c = c; + r_d = d; + + // 2nd transform + + w0_t[0] = esalt_buf0[ 8]; + w0_t[1] = esalt_buf0[ 9]; + w0_t[2] = esalt_buf0[10]; + w0_t[3] = esalt_buf0[11]; + + w1_t[0] = esalt_buf0[12]; + w1_t[1] = esalt_buf0[13]; + w1_t[2] = esalt_buf0[14]; + w1_t[3] = esalt_buf0[15]; + + w2_t[0] = esalt_buf1[ 0]; + w2_t[1] = esalt_buf1[ 1]; + w2_t[2] = esalt_buf1[ 2]; + w2_t[3] = esalt_buf1[ 3]; + + w3_t[0] = esalt_buf1[ 4]; + w3_t[1] = esalt_buf1[ 5]; + w3_t[2] = esalt_buf1[ 6]; + w3_t[3] = esalt_buf1[ 7]; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0_t[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0_t[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0_t[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1_t[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1_t[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1_t[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2_t[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2_t[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2_t[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3_t[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3_t[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3_t[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0_t[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1_t[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2_t[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1_t[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1_t[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2_t[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3_t[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0_t[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2_t[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3_t[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0_t[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1_t[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3_t[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H1, a, b, c, d, w1_t[1], MD5C20, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w2_t[0], MD5C21, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w2_t[3], MD5C22, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w3_t[2], MD5C23, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w0_t[1], MD5C24, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w1_t[0], MD5C25, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w1_t[3], MD5C26, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w2_t[2], MD5C27, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w3_t[1], MD5C28, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w0_t[0], MD5C29, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w0_t[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w1_t[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w2_t[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w3_t[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w3_t[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w0_t[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1_t[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3_t[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3_t[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0_t[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0_t[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2_t[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1_t[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3_t[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1_t[0], MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w2_t[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0_t[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2_t[1], MD5C3f, MD5S33); + + // this is for sure the final block + + a += r_a; + b += r_b; + c += r_c; + d += r_d; + + r_a = a; + r_b = b; + r_c = c; + r_d = d; + + w0_t[0] = esalt_buf1[ 8]; + w0_t[1] = esalt_buf1[ 9]; + w0_t[2] = esalt_buf1[10]; + w0_t[3] = esalt_buf1[11]; + + w1_t[0] = esalt_buf1[12]; + w1_t[1] = esalt_buf1[13]; + w1_t[2] = esalt_buf1[14]; + w1_t[3] = esalt_buf1[15]; + + w2_t[0] = esalt_buf2[ 0]; + w2_t[1] = esalt_buf2[ 1]; + w2_t[2] = esalt_buf2[ 2]; + w2_t[3] = esalt_buf2[ 3]; + + w3_t[0] = esalt_buf2[ 4]; + w3_t[1] = esalt_buf2[ 5]; + w3_t[2] = digest_esalt_len * 8; + w3_t[3] = 0; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t[0], MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w0_t[1], MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w0_t[2], MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w0_t[3], MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w1_t[0], MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t[1], MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w1_t[2], MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w1_t[3], MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w2_t[0], MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w2_t[1], MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t[2], MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w2_t[3], MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w3_t[0], MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w3_t[1], MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w3_t[2], MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t[3], MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w0_t[1], MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w1_t[2], MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w2_t[3], MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t[0], MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w1_t[1], MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t[2], MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t[3], MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w1_t[0], MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w2_t[1], MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w3_t[2], MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w0_t[3], MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w2_t[0], MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w3_t[1], MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w0_t[2], MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w1_t[3], MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w3_t[0], MD5C1f, MD5S13); + + MD5_STEP (MD5_H1, a, b, c, d, w1_t[1], MD5C20, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w2_t[0], MD5C21, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w2_t[3], MD5C22, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w3_t[2], MD5C23, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w0_t[1], MD5C24, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w1_t[0], MD5C25, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w1_t[3], MD5C26, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w2_t[2], MD5C27, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w3_t[1], MD5C28, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w0_t[0], MD5C29, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w0_t[3], MD5C2a, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w1_t[2], MD5C2b, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w2_t[1], MD5C2c, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w3_t[0], MD5C2d, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w3_t[3], MD5C2e, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w0_t[2], MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t[0], MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w1_t[3], MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w3_t[2], MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t[1], MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w3_t[0], MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w0_t[3], MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t[2], MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w0_t[1], MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w2_t[0], MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t[3], MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w1_t[2], MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w3_t[1], MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w1_t[0], MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w2_t[3], MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w0_t[2], MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w2_t[1], MD5C3f, MD5S33); + + a += r_a; + b += r_b; + c += r_c; + d += r_d; + + const u32x r0 = a; + const u32x r1 = d; + const u32x r2 = c; + const u32x r3 = b; + + #include VECT_COMPARE_S + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m11400_m04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const sip_t *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = pws[gid].i[14]; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * bin2asc table + */ + + l_bin2asc[lid] = c_bin2asc[(lid >> 0) & 15] << 8 + | c_bin2asc[(lid >> 4) & 15] << 0; + + __syncthreads (); + + if (gid >= gid_max) return; + + /** + * main + */ + + const u32 esalt_len = esalt_bufs[salt_pos].esalt_len; + const u32 salt_len = esalt_bufs[salt_pos].salt_len; + + const u32 sw_1 = ((32 + esalt_len + 1) > 119); + const u32 sw_2 = ((pw_len + salt_len) > 55) << 1; + + switch (sw_1 | sw_2) + { + case 0: + m11400m_0_0 (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); + break; + case 1: + m11400m_0_1 (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); + break; + case 2: + m11400m_1_0 (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); + break; + case 3: + m11400m_1_1 (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); + break; + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m11400_m08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const sip_t *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = pws[gid].i[14]; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * bin2asc table + */ + + l_bin2asc[lid] = c_bin2asc[(lid >> 0) & 15] << 8 + | c_bin2asc[(lid >> 4) & 15] << 0; + + __syncthreads (); + + if (gid >= gid_max) return; + + /** + * main + */ + + const u32 esalt_len = esalt_bufs[salt_pos].esalt_len; + const u32 salt_len = esalt_bufs[salt_pos].salt_len; + + const u32 sw_1 = ((32 + esalt_len + 1) > 119); + const u32 sw_2 = ((pw_len + salt_len) > 55) << 1; + + switch (sw_1 | sw_2) + { + case 0: + m11400m_0_0 (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); + break; + case 1: + m11400m_0_1 (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); + break; + case 2: + m11400m_1_0 (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); + break; + case 3: + m11400m_1_1 (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); + break; + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m11400_m16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const sip_t *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = pws[gid].i[ 8]; + w2[1] = pws[gid].i[ 9]; + w2[2] = pws[gid].i[10]; + w2[3] = pws[gid].i[11]; + + u32x w3[4]; + + w3[0] = pws[gid].i[12]; + w3[1] = pws[gid].i[13]; + w3[2] = pws[gid].i[14]; + w3[3] = pws[gid].i[15]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * bin2asc table + */ + + l_bin2asc[lid] = c_bin2asc[(lid >> 0) & 15] << 8 + | c_bin2asc[(lid >> 4) & 15] << 0; + + __syncthreads (); + + if (gid >= gid_max) return; + + /** + * main + */ + + const u32 esalt_len = esalt_bufs[salt_pos].esalt_len; + const u32 salt_len = esalt_bufs[salt_pos].salt_len; + + const u32 sw_1 = ((32 + esalt_len + 1) > 119); + const u32 sw_2 = ((pw_len + salt_len) > 55) << 1; + + switch (sw_1 | sw_2) + { + case 0: + m11400m_0_0 (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); + break; + case 1: + m11400m_0_1 (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); + break; + case 2: + m11400m_1_0 (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); + break; + case 3: + m11400m_1_1 (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); + break; + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m11400_s04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const sip_t *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = pws[gid].i[14]; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * bin2asc table + */ + + l_bin2asc[lid] = c_bin2asc[(lid >> 0) & 15] << 8 + | c_bin2asc[(lid >> 4) & 15] << 0; + + __syncthreads (); + + if (gid >= gid_max) return; + + /** + * main + */ + + const u32 esalt_len = esalt_bufs[salt_pos].esalt_len; + const u32 salt_len = esalt_bufs[salt_pos].salt_len; + + const u32 sw_1 = ((32 + esalt_len + 1) > 119); + const u32 sw_2 = ((pw_len + salt_len) > 55) << 1; + + switch (sw_1 | sw_2) + { + case 0: + m11400s_0_0 (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); + break; + case 1: + m11400s_0_1 (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); + break; + case 2: + m11400s_1_0 (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); + break; + case 3: + m11400s_1_1 (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); + break; + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m11400_s08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const sip_t *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = pws[gid].i[14]; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * bin2asc table + */ + + l_bin2asc[lid] = c_bin2asc[(lid >> 0) & 15] << 8 + | c_bin2asc[(lid >> 4) & 15] << 0; + + __syncthreads (); + + if (gid >= gid_max) return; + + /** + * main + */ + + const u32 esalt_len = esalt_bufs[salt_pos].esalt_len; + const u32 salt_len = esalt_bufs[salt_pos].salt_len; + + const u32 sw_1 = ((32 + esalt_len + 1) > 119); + const u32 sw_2 = ((pw_len + salt_len) > 55) << 1; + + switch (sw_1 | sw_2) + { + case 0: + m11400s_0_0 (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); + break; + case 1: + m11400s_0_1 (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); + break; + case 2: + m11400s_1_0 (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); + break; + case 3: + m11400s_1_1 (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); + break; + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m11400_s16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const sip_t *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = pws[gid].i[ 8]; + w2[1] = pws[gid].i[ 9]; + w2[2] = pws[gid].i[10]; + w2[3] = pws[gid].i[11]; + + u32x w3[4]; + + w3[0] = pws[gid].i[12]; + w3[1] = pws[gid].i[13]; + w3[2] = pws[gid].i[14]; + w3[3] = pws[gid].i[15]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * bin2asc table + */ + + l_bin2asc[lid] = c_bin2asc[(lid >> 0) & 15] << 8 + | c_bin2asc[(lid >> 4) & 15] << 0; + + __syncthreads (); + + if (gid >= gid_max) return; + + /** + * main + */ + + const u32 esalt_len = esalt_bufs[salt_pos].esalt_len; + const u32 salt_len = esalt_bufs[salt_pos].salt_len; + + const u32 sw_1 = ((32 + esalt_len + 1) > 119); + const u32 sw_2 = ((pw_len + salt_len) > 55) << 1; + + switch (sw_1 | sw_2) + { + case 0: + m11400s_0_0 (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); + break; + case 1: + m11400s_0_1 (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); + break; + case 2: + m11400s_1_0 (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); + break; + case 3: + m11400s_1_1 (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); + break; + } +} diff --git a/nv/m11500_a0.cu b/nv/m11500_a0.cu new file mode 100644 index 0000000000..231a1ff790 --- /dev/null +++ b/nv/m11500_a0.cu @@ -0,0 +1,366 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _CRC32_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW2 +#define VECT_SIZE1 +#endif + +#define DGST_R0 0 +#define DGST_R1 1 +#define DGST_R2 2 +#define DGST_R3 3 + +#include "include/kernel_functions.c" +#include "types_nv.c" +#include "common_nv.c" +#include "include/rp_gpu.h" +#include "rp_nv.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +__device__ const u32 crc32tab[0x100] = +{ + 0x00000000, 0x77073096, 0xee0e612c, 0x990951ba, + 0x076dc419, 0x706af48f, 0xe963a535, 0x9e6495a3, + 0x0edb8832, 0x79dcb8a4, 0xe0d5e91e, 0x97d2d988, + 0x09b64c2b, 0x7eb17cbd, 0xe7b82d07, 0x90bf1d91, + 0x1db71064, 0x6ab020f2, 0xf3b97148, 0x84be41de, + 0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7, + 0x136c9856, 0x646ba8c0, 0xfd62f97a, 0x8a65c9ec, + 0x14015c4f, 0x63066cd9, 0xfa0f3d63, 0x8d080df5, + 0x3b6e20c8, 0x4c69105e, 0xd56041e4, 0xa2677172, + 0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b, + 0x35b5a8fa, 0x42b2986c, 0xdbbbc9d6, 0xacbcf940, + 0x32d86ce3, 0x45df5c75, 0xdcd60dcf, 0xabd13d59, + 0x26d930ac, 0x51de003a, 0xc8d75180, 0xbfd06116, + 0x21b4f4b5, 0x56b3c423, 0xcfba9599, 0xb8bda50f, + 0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924, + 0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d, + 0x76dc4190, 0x01db7106, 0x98d220bc, 0xefd5102a, + 0x71b18589, 0x06b6b51f, 0x9fbfe4a5, 0xe8b8d433, + 0x7807c9a2, 0x0f00f934, 0x9609a88e, 0xe10e9818, + 0x7f6a0dbb, 0x086d3d2d, 0x91646c97, 0xe6635c01, + 0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e, + 0x6c0695ed, 0x1b01a57b, 0x8208f4c1, 0xf50fc457, + 0x65b0d9c6, 0x12b7e950, 0x8bbeb8ea, 0xfcb9887c, + 0x62dd1ddf, 0x15da2d49, 0x8cd37cf3, 0xfbd44c65, + 0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2, + 0x4adfa541, 0x3dd895d7, 0xa4d1c46d, 0xd3d6f4fb, + 0x4369e96a, 0x346ed9fc, 0xad678846, 0xda60b8d0, + 0x44042d73, 0x33031de5, 0xaa0a4c5f, 0xdd0d7cc9, + 0x5005713c, 0x270241aa, 0xbe0b1010, 0xc90c2086, + 0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f, + 0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4, + 0x59b33d17, 0x2eb40d81, 0xb7bd5c3b, 0xc0ba6cad, + 0xedb88320, 0x9abfb3b6, 0x03b6e20c, 0x74b1d29a, + 0xead54739, 0x9dd277af, 0x04db2615, 0x73dc1683, + 0xe3630b12, 0x94643b84, 0x0d6d6a3e, 0x7a6a5aa8, + 0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1, + 0xf00f9344, 0x8708a3d2, 0x1e01f268, 0x6906c2fe, + 0xf762575d, 0x806567cb, 0x196c3671, 0x6e6b06e7, + 0xfed41b76, 0x89d32be0, 0x10da7a5a, 0x67dd4acc, + 0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5, + 0xd6d6a3e8, 0xa1d1937e, 0x38d8c2c4, 0x4fdff252, + 0xd1bb67f1, 0xa6bc5767, 0x3fb506dd, 0x48b2364b, + 0xd80d2bda, 0xaf0a1b4c, 0x36034af6, 0x41047a60, + 0xdf60efc3, 0xa867df55, 0x316e8eef, 0x4669be79, + 0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236, + 0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f, + 0xc5ba3bbe, 0xb2bd0b28, 0x2bb45a92, 0x5cb36a04, + 0xc2d7ffa7, 0xb5d0cf31, 0x2cd99e8b, 0x5bdeae1d, + 0x9b64c2b0, 0xec63f226, 0x756aa39c, 0x026d930a, + 0x9c0906a9, 0xeb0e363f, 0x72076785, 0x05005713, + 0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38, + 0x92d28e9b, 0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21, + 0x86d3d2d4, 0xf1d4e242, 0x68ddb3f8, 0x1fda836e, + 0x81be16cd, 0xf6b9265b, 0x6fb077e1, 0x18b74777, + 0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c, + 0x8f659eff, 0xf862ae69, 0x616bffd3, 0x166ccf45, + 0xa00ae278, 0xd70dd2ee, 0x4e048354, 0x3903b3c2, + 0xa7672661, 0xd06016f7, 0x4969474d, 0x3e6e77db, + 0xaed16a4a, 0xd9d65adc, 0x40df0b66, 0x37d83bf0, + 0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9, + 0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6, + 0xbad03605, 0xcdd70693, 0x54de5729, 0x23d967bf, + 0xb3667a2e, 0xc4614ab8, 0x5d681b02, 0x2a6f2b94, + 0xb40bbe37, 0xc30c8ea1, 0x5a05df1b, 0x2d02ef8d +}; + +__device__ static u32x round_crc32 (u32x a, const u32x v) +{ + const u32x k = (a ^ v) & 0xff; + + const u32x s = a >> 8; + + #ifdef VECT_SIZE1 + a = crc32tab[k]; + #endif + + #ifdef VECT_SIZE2 + a.x = crc32tab[k.x]; + a.y = crc32tab[k.y]; + #endif + + #ifdef VECT_SIZE4 + a.x = crc32tab[k.x]; + a.y = crc32tab[k.y]; + a.z = crc32tab[k.z]; + a.w = crc32tab[k.w]; + #endif + + a ^= s; + + return a; +} + +__device__ static u32x crc32 (const u32x w[16], const u32 pw_len, const u32 iv) +{ + u32x a = iv ^ ~0; + + if (pw_len >= 1) a = round_crc32 (a, w[0] >> 0); + if (pw_len >= 2) a = round_crc32 (a, w[0] >> 8); + if (pw_len >= 3) a = round_crc32 (a, w[0] >> 16); + if (pw_len >= 4) a = round_crc32 (a, w[0] >> 24); + + for (u32 i = 4, j = 1; i < pw_len; i += 4, j += 1) + { + if (pw_len >= (i + 1)) a = round_crc32 (a, w[j] >> 0); + if (pw_len >= (i + 2)) a = round_crc32 (a, w[j] >> 8); + if (pw_len >= (i + 3)) a = round_crc32 (a, w[j] >> 16); + if (pw_len >= (i + 4)) a = round_crc32 (a, w[j] >> 24); + } + + return ~a; +} + +__device__ __constant__ gpu_rule_t c_rules[1024]; + +extern "C" __global__ void __launch_bounds__ (256, 1) m11500_m04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + /** + * digest + */ + + const u32 iv = salt_bufs[salt_pos].salt_buf[0]; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + u32x pw_buf1[4]; + + pw_buf1[0] = pws[gid].i[ 4]; + pw_buf1[1] = pws[gid].i[ 5]; + pw_buf1[2] = pws[gid].i[ 6]; + pw_buf1[3] = pws[gid].i[ 7]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + + w0[0] = pw_buf0[0]; + w0[1] = pw_buf0[1]; + w0[2] = pw_buf0[2]; + w0[3] = pw_buf0[3]; + + u32x w1[4]; + + w1[0] = pw_buf1[0]; + w1[1] = pw_buf1[1]; + w1[2] = pw_buf1[2]; + w1[3] = pw_buf1[3]; + + const u32 out_len = apply_rules (c_rules[il_pos].cmds, w0, w1, pw_len); + + u32x w_t[16]; + + w_t[ 0] = w0[0]; + w_t[ 1] = w0[1]; + w_t[ 2] = w0[2]; + w_t[ 3] = w0[3]; + w_t[ 4] = w1[0]; + w_t[ 5] = w1[1]; + w_t[ 6] = w1[2]; + w_t[ 7] = w1[3]; + w_t[ 8] = 0; + w_t[ 9] = 0; + w_t[10] = 0; + w_t[11] = 0; + w_t[12] = 0; + w_t[13] = 0; + w_t[14] = 0; + w_t[15] = 0; + + u32x a = crc32 (w_t, out_len, iv); + u32x b = 0; + + const u32x r0 = a; + const u32x r1 = b; + const u32x r2 = 0; + const u32x r3 = 0; + + #include VECT_COMPARE_M + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m11500_m08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m11500_m16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m11500_s04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + u32x pw_buf1[4]; + + pw_buf1[0] = pws[gid].i[ 4]; + pw_buf1[1] = pws[gid].i[ 5]; + pw_buf1[2] = pws[gid].i[ 6]; + pw_buf1[3] = pws[gid].i[ 7]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * digest + */ + + const u32 iv = salt_bufs[salt_pos].salt_buf[0]; + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + + w0[0] = pw_buf0[0]; + w0[1] = pw_buf0[1]; + w0[2] = pw_buf0[2]; + w0[3] = pw_buf0[3]; + + u32x w1[4]; + + w1[0] = pw_buf1[0]; + w1[1] = pw_buf1[1]; + w1[2] = pw_buf1[2]; + w1[3] = pw_buf1[3]; + + const u32 out_len = apply_rules (c_rules[il_pos].cmds, w0, w1, pw_len); + + u32x w_t[16]; + + w_t[ 0] = w0[0]; + w_t[ 1] = w0[1]; + w_t[ 2] = w0[2]; + w_t[ 3] = w0[3]; + w_t[ 4] = w1[0]; + w_t[ 5] = w1[1]; + w_t[ 6] = w1[2]; + w_t[ 7] = w1[3]; + w_t[ 8] = 0; + w_t[ 9] = 0; + w_t[10] = 0; + w_t[11] = 0; + w_t[12] = 0; + w_t[13] = 0; + w_t[14] = 0; + w_t[15] = 0; + + u32x a = crc32 (w_t, out_len, iv); + u32x b = 0; + + const u32x r0 = a; + const u32x r1 = b; + const u32x r2 = 0; + const u32x r3 = 0; + + #include VECT_COMPARE_S + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m11500_s08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m11500_s16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/nv/m11500_a1.cu b/nv/m11500_a1.cu new file mode 100644 index 0000000000..e3afdd83c4 --- /dev/null +++ b/nv/m11500_a1.cu @@ -0,0 +1,444 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _CRC32_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW2 +#define VECT_SIZE4 +#endif + +#define DGST_R0 0 +#define DGST_R1 1 +#define DGST_R2 2 +#define DGST_R3 3 + +#include "include/kernel_functions.c" +#include "types_nv.c" +#include "common_nv.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +__device__ const u32 crc32tab[0x100] = +{ + 0x00000000, 0x77073096, 0xee0e612c, 0x990951ba, + 0x076dc419, 0x706af48f, 0xe963a535, 0x9e6495a3, + 0x0edb8832, 0x79dcb8a4, 0xe0d5e91e, 0x97d2d988, + 0x09b64c2b, 0x7eb17cbd, 0xe7b82d07, 0x90bf1d91, + 0x1db71064, 0x6ab020f2, 0xf3b97148, 0x84be41de, + 0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7, + 0x136c9856, 0x646ba8c0, 0xfd62f97a, 0x8a65c9ec, + 0x14015c4f, 0x63066cd9, 0xfa0f3d63, 0x8d080df5, + 0x3b6e20c8, 0x4c69105e, 0xd56041e4, 0xa2677172, + 0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b, + 0x35b5a8fa, 0x42b2986c, 0xdbbbc9d6, 0xacbcf940, + 0x32d86ce3, 0x45df5c75, 0xdcd60dcf, 0xabd13d59, + 0x26d930ac, 0x51de003a, 0xc8d75180, 0xbfd06116, + 0x21b4f4b5, 0x56b3c423, 0xcfba9599, 0xb8bda50f, + 0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924, + 0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d, + 0x76dc4190, 0x01db7106, 0x98d220bc, 0xefd5102a, + 0x71b18589, 0x06b6b51f, 0x9fbfe4a5, 0xe8b8d433, + 0x7807c9a2, 0x0f00f934, 0x9609a88e, 0xe10e9818, + 0x7f6a0dbb, 0x086d3d2d, 0x91646c97, 0xe6635c01, + 0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e, + 0x6c0695ed, 0x1b01a57b, 0x8208f4c1, 0xf50fc457, + 0x65b0d9c6, 0x12b7e950, 0x8bbeb8ea, 0xfcb9887c, + 0x62dd1ddf, 0x15da2d49, 0x8cd37cf3, 0xfbd44c65, + 0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2, + 0x4adfa541, 0x3dd895d7, 0xa4d1c46d, 0xd3d6f4fb, + 0x4369e96a, 0x346ed9fc, 0xad678846, 0xda60b8d0, + 0x44042d73, 0x33031de5, 0xaa0a4c5f, 0xdd0d7cc9, + 0x5005713c, 0x270241aa, 0xbe0b1010, 0xc90c2086, + 0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f, + 0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4, + 0x59b33d17, 0x2eb40d81, 0xb7bd5c3b, 0xc0ba6cad, + 0xedb88320, 0x9abfb3b6, 0x03b6e20c, 0x74b1d29a, + 0xead54739, 0x9dd277af, 0x04db2615, 0x73dc1683, + 0xe3630b12, 0x94643b84, 0x0d6d6a3e, 0x7a6a5aa8, + 0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1, + 0xf00f9344, 0x8708a3d2, 0x1e01f268, 0x6906c2fe, + 0xf762575d, 0x806567cb, 0x196c3671, 0x6e6b06e7, + 0xfed41b76, 0x89d32be0, 0x10da7a5a, 0x67dd4acc, + 0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5, + 0xd6d6a3e8, 0xa1d1937e, 0x38d8c2c4, 0x4fdff252, + 0xd1bb67f1, 0xa6bc5767, 0x3fb506dd, 0x48b2364b, + 0xd80d2bda, 0xaf0a1b4c, 0x36034af6, 0x41047a60, + 0xdf60efc3, 0xa867df55, 0x316e8eef, 0x4669be79, + 0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236, + 0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f, + 0xc5ba3bbe, 0xb2bd0b28, 0x2bb45a92, 0x5cb36a04, + 0xc2d7ffa7, 0xb5d0cf31, 0x2cd99e8b, 0x5bdeae1d, + 0x9b64c2b0, 0xec63f226, 0x756aa39c, 0x026d930a, + 0x9c0906a9, 0xeb0e363f, 0x72076785, 0x05005713, + 0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38, + 0x92d28e9b, 0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21, + 0x86d3d2d4, 0xf1d4e242, 0x68ddb3f8, 0x1fda836e, + 0x81be16cd, 0xf6b9265b, 0x6fb077e1, 0x18b74777, + 0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c, + 0x8f659eff, 0xf862ae69, 0x616bffd3, 0x166ccf45, + 0xa00ae278, 0xd70dd2ee, 0x4e048354, 0x3903b3c2, + 0xa7672661, 0xd06016f7, 0x4969474d, 0x3e6e77db, + 0xaed16a4a, 0xd9d65adc, 0x40df0b66, 0x37d83bf0, + 0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9, + 0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6, + 0xbad03605, 0xcdd70693, 0x54de5729, 0x23d967bf, + 0xb3667a2e, 0xc4614ab8, 0x5d681b02, 0x2a6f2b94, + 0xb40bbe37, 0xc30c8ea1, 0x5a05df1b, 0x2d02ef8d +}; + +__device__ static u32x round_crc32 (u32x a, const u32x v) +{ + const u32x k = (a ^ v) & 0xff; + + const u32x s = a >> 8; + + #ifdef VECT_SIZE1 + a = crc32tab[k]; + #endif + + #ifdef VECT_SIZE2 + a.x = crc32tab[k.x]; + a.y = crc32tab[k.y]; + #endif + + #ifdef VECT_SIZE4 + a.x = crc32tab[k.x]; + a.y = crc32tab[k.y]; + a.z = crc32tab[k.z]; + a.w = crc32tab[k.w]; + #endif + + a ^= s; + + return a; +} + +__device__ static u32x crc32 (const u32x w[16], const u32 pw_len, const u32 iv) +{ + u32x a = iv ^ ~0; + + if (pw_len >= 1) a = round_crc32 (a, w[0] >> 0); + if (pw_len >= 2) a = round_crc32 (a, w[0] >> 8); + if (pw_len >= 3) a = round_crc32 (a, w[0] >> 16); + if (pw_len >= 4) a = round_crc32 (a, w[0] >> 24); + + for (u32 i = 4, j = 1; i < pw_len; i += 4, j += 1) + { + if (pw_len >= (i + 1)) a = round_crc32 (a, w[j] >> 0); + if (pw_len >= (i + 2)) a = round_crc32 (a, w[j] >> 8); + if (pw_len >= (i + 3)) a = round_crc32 (a, w[j] >> 16); + if (pw_len >= (i + 4)) a = round_crc32 (a, w[j] >> 24); + } + + return ~a; +} + +__device__ __constant__ comb_t c_combs[1024]; + +extern "C" __global__ void __launch_bounds__ (256, 1) m11500_m04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + /** + * digest + */ + + const u32 iv = salt_bufs[salt_pos].salt_buf[0]; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, c_combs[0].pw_len); + } + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = c_combs[il_pos].pw_len; + + const u32 pw_len = pw_l_len + pw_r_len; + + u32 wordr0[4]; + + wordr0[0] = c_combs[il_pos].i[0]; + wordr0[1] = c_combs[il_pos].i[1]; + wordr0[2] = c_combs[il_pos].i[2]; + wordr0[3] = c_combs[il_pos].i[3]; + + u32 wordr1[4]; + + wordr1[0] = c_combs[il_pos].i[4]; + wordr1[1] = c_combs[il_pos].i[5]; + wordr1[2] = c_combs[il_pos].i[6]; + wordr1[3] = c_combs[il_pos].i[7]; + + u32 wordr2[4]; + + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + + u32 wordr3[4]; + + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + u32x w_t[16]; + + w_t[ 0] = wordl0[0] | wordr0[0]; + w_t[ 1] = wordl0[1] | wordr0[1]; + w_t[ 2] = wordl0[2] | wordr0[2]; + w_t[ 3] = wordl0[3] | wordr0[3]; + w_t[ 4] = wordl1[0] | wordr1[0]; + w_t[ 5] = wordl1[1] | wordr1[1]; + w_t[ 6] = wordl1[2] | wordr1[2]; + w_t[ 7] = wordl1[3] | wordr1[3]; + w_t[ 8] = wordl2[0] | wordr2[0]; + w_t[ 9] = wordl2[1] | wordr2[1]; + w_t[10] = wordl2[2] | wordr2[2]; + w_t[11] = wordl2[3] | wordr2[3]; + w_t[12] = wordl3[0] | wordr3[0]; + w_t[13] = wordl3[1] | wordr3[1]; + w_t[14] = wordl3[2] | wordr3[2]; + w_t[15] = 0; + + u32x a = crc32 (w_t, pw_len, iv); + u32x b = 0; + + const u32x r0 = a; + const u32x r1 = b; + const u32x r2 = 0; + const u32x r3 = 0; + + #include VECT_COMPARE_M + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m11500_m08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m11500_m16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m11500_s04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, c_combs[0].pw_len); + } + + /** + * digest + */ + + const u32 iv = salt_bufs[salt_pos].salt_buf[0]; + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = c_combs[il_pos].pw_len; + + const u32 pw_len = pw_l_len + pw_r_len; + + u32 wordr0[4]; + + wordr0[0] = c_combs[il_pos].i[0]; + wordr0[1] = c_combs[il_pos].i[1]; + wordr0[2] = c_combs[il_pos].i[2]; + wordr0[3] = c_combs[il_pos].i[3]; + + u32 wordr1[4]; + + wordr1[0] = c_combs[il_pos].i[4]; + wordr1[1] = c_combs[il_pos].i[5]; + wordr1[2] = c_combs[il_pos].i[6]; + wordr1[3] = c_combs[il_pos].i[7]; + + u32 wordr2[4]; + + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + + u32 wordr3[4]; + + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + u32x w_t[16]; + + w_t[ 0] = wordl0[0] | wordr0[0]; + w_t[ 1] = wordl0[1] | wordr0[1]; + w_t[ 2] = wordl0[2] | wordr0[2]; + w_t[ 3] = wordl0[3] | wordr0[3]; + w_t[ 4] = wordl1[0] | wordr1[0]; + w_t[ 5] = wordl1[1] | wordr1[1]; + w_t[ 6] = wordl1[2] | wordr1[2]; + w_t[ 7] = wordl1[3] | wordr1[3]; + w_t[ 8] = wordl2[0] | wordr2[0]; + w_t[ 9] = wordl2[1] | wordr2[1]; + w_t[10] = wordl2[2] | wordr2[2]; + w_t[11] = wordl2[3] | wordr2[3]; + w_t[12] = wordl3[0] | wordr3[0]; + w_t[13] = wordl3[1] | wordr3[1]; + w_t[14] = wordl3[2] | wordr3[2]; + w_t[15] = 0; + + u32x a = crc32 (w_t, pw_len, iv); + u32x b = 0; + + const u32x r0 = a; + const u32x r1 = b; + const u32x r2 = 0; + const u32x r3 = 0; + + #include VECT_COMPARE_S + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m11500_s08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m11500_s16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/nv/m11500_a3.cu b/nv/m11500_a3.cu new file mode 100644 index 0000000000..8427626d99 --- /dev/null +++ b/nv/m11500_a3.cu @@ -0,0 +1,516 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _CRC32_ +#define _SCALAR_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW2 +#define VECT_SIZE4 +#endif + +#define DGST_R0 0 +#define DGST_R1 1 +#define DGST_R2 2 +#define DGST_R3 3 + +#include "include/kernel_functions.c" +#include "types_nv.c" +#include "common_nv.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4_warp.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4_warp.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4_warp.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4_warp.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4_warp.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4_warp.c" +#endif + +__device__ const u32 crc32tab[0x100] = +{ + 0x00000000, 0x77073096, 0xee0e612c, 0x990951ba, + 0x076dc419, 0x706af48f, 0xe963a535, 0x9e6495a3, + 0x0edb8832, 0x79dcb8a4, 0xe0d5e91e, 0x97d2d988, + 0x09b64c2b, 0x7eb17cbd, 0xe7b82d07, 0x90bf1d91, + 0x1db71064, 0x6ab020f2, 0xf3b97148, 0x84be41de, + 0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7, + 0x136c9856, 0x646ba8c0, 0xfd62f97a, 0x8a65c9ec, + 0x14015c4f, 0x63066cd9, 0xfa0f3d63, 0x8d080df5, + 0x3b6e20c8, 0x4c69105e, 0xd56041e4, 0xa2677172, + 0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b, + 0x35b5a8fa, 0x42b2986c, 0xdbbbc9d6, 0xacbcf940, + 0x32d86ce3, 0x45df5c75, 0xdcd60dcf, 0xabd13d59, + 0x26d930ac, 0x51de003a, 0xc8d75180, 0xbfd06116, + 0x21b4f4b5, 0x56b3c423, 0xcfba9599, 0xb8bda50f, + 0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924, + 0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d, + 0x76dc4190, 0x01db7106, 0x98d220bc, 0xefd5102a, + 0x71b18589, 0x06b6b51f, 0x9fbfe4a5, 0xe8b8d433, + 0x7807c9a2, 0x0f00f934, 0x9609a88e, 0xe10e9818, + 0x7f6a0dbb, 0x086d3d2d, 0x91646c97, 0xe6635c01, + 0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e, + 0x6c0695ed, 0x1b01a57b, 0x8208f4c1, 0xf50fc457, + 0x65b0d9c6, 0x12b7e950, 0x8bbeb8ea, 0xfcb9887c, + 0x62dd1ddf, 0x15da2d49, 0x8cd37cf3, 0xfbd44c65, + 0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2, + 0x4adfa541, 0x3dd895d7, 0xa4d1c46d, 0xd3d6f4fb, + 0x4369e96a, 0x346ed9fc, 0xad678846, 0xda60b8d0, + 0x44042d73, 0x33031de5, 0xaa0a4c5f, 0xdd0d7cc9, + 0x5005713c, 0x270241aa, 0xbe0b1010, 0xc90c2086, + 0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f, + 0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4, + 0x59b33d17, 0x2eb40d81, 0xb7bd5c3b, 0xc0ba6cad, + 0xedb88320, 0x9abfb3b6, 0x03b6e20c, 0x74b1d29a, + 0xead54739, 0x9dd277af, 0x04db2615, 0x73dc1683, + 0xe3630b12, 0x94643b84, 0x0d6d6a3e, 0x7a6a5aa8, + 0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1, + 0xf00f9344, 0x8708a3d2, 0x1e01f268, 0x6906c2fe, + 0xf762575d, 0x806567cb, 0x196c3671, 0x6e6b06e7, + 0xfed41b76, 0x89d32be0, 0x10da7a5a, 0x67dd4acc, + 0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5, + 0xd6d6a3e8, 0xa1d1937e, 0x38d8c2c4, 0x4fdff252, + 0xd1bb67f1, 0xa6bc5767, 0x3fb506dd, 0x48b2364b, + 0xd80d2bda, 0xaf0a1b4c, 0x36034af6, 0x41047a60, + 0xdf60efc3, 0xa867df55, 0x316e8eef, 0x4669be79, + 0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236, + 0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f, + 0xc5ba3bbe, 0xb2bd0b28, 0x2bb45a92, 0x5cb36a04, + 0xc2d7ffa7, 0xb5d0cf31, 0x2cd99e8b, 0x5bdeae1d, + 0x9b64c2b0, 0xec63f226, 0x756aa39c, 0x026d930a, + 0x9c0906a9, 0xeb0e363f, 0x72076785, 0x05005713, + 0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38, + 0x92d28e9b, 0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21, + 0x86d3d2d4, 0xf1d4e242, 0x68ddb3f8, 0x1fda836e, + 0x81be16cd, 0xf6b9265b, 0x6fb077e1, 0x18b74777, + 0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c, + 0x8f659eff, 0xf862ae69, 0x616bffd3, 0x166ccf45, + 0xa00ae278, 0xd70dd2ee, 0x4e048354, 0x3903b3c2, + 0xa7672661, 0xd06016f7, 0x4969474d, 0x3e6e77db, + 0xaed16a4a, 0xd9d65adc, 0x40df0b66, 0x37d83bf0, + 0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9, + 0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6, + 0xbad03605, 0xcdd70693, 0x54de5729, 0x23d967bf, + 0xb3667a2e, 0xc4614ab8, 0x5d681b02, 0x2a6f2b94, + 0xb40bbe37, 0xc30c8ea1, 0x5a05df1b, 0x2d02ef8d +}; + +__device__ static u32x round_crc32 (u32x a, const u32x v) +{ + const u32x k = (a ^ v) & 0xff; + + const u32x s = a >> 8; + + #ifdef VECT_SIZE1 + a = crc32tab[k]; + #endif + + #ifdef VECT_SIZE2 + a.x = crc32tab[k.x]; + a.y = crc32tab[k.y]; + #endif + + #ifdef VECT_SIZE4 + a.x = crc32tab[k.x]; + a.y = crc32tab[k.y]; + a.z = crc32tab[k.z]; + a.w = crc32tab[k.w]; + #endif + + a ^= s; + + return a; +} + +__device__ static u32x crc32 (const u32x w[16], const u32 pw_len, const u32 iv) +{ + u32x a = iv ^ ~0; + + if (pw_len >= 1) a = round_crc32 (a, w[0] >> 0); + if (pw_len >= 2) a = round_crc32 (a, w[0] >> 8); + if (pw_len >= 3) a = round_crc32 (a, w[0] >> 16); + if (pw_len >= 4) a = round_crc32 (a, w[0] >> 24); + + for (u32 i = 4, j = 1; i < pw_len; i += 4, j += 1) + { + if (pw_len >= (i + 1)) a = round_crc32 (a, w[j] >> 0); + if (pw_len >= (i + 2)) a = round_crc32 (a, w[j] >> 8); + if (pw_len >= (i + 3)) a = round_crc32 (a, w[j] >> 16); + if (pw_len >= (i + 4)) a = round_crc32 (a, w[j] >> 24); + } + + return ~a; +} + +__device__ __constant__ u32x c_bfs[1024]; + +__device__ static void m11500m (u32 w[16], const u32 pw_len, const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const u32x *words_buf_r, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset) +{ + /** + * modifier + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + const u32 lid = threadIdx.x; + + + /** + * digest + */ + + const u32 iv = salt_bufs[salt_pos].salt_buf[0]; + + /** + * loop + */ + + const u32 bf_loops = ceil ((float) bfs_cnt / VECT_DIV); + + u32x w0l = w[0]; + + for (u32 il_pos = 0; il_pos < bf_loops; il_pos++) + { + const u32x w0r = c_bfs[il_pos]; + + const u32x w0 = w0l | w0r; + + u32x w_t[16]; + + w_t[ 0] = w0; + w_t[ 1] = w[ 1]; + w_t[ 2] = w[ 2]; + w_t[ 3] = w[ 3]; + w_t[ 4] = w[ 4]; + w_t[ 5] = w[ 5]; + w_t[ 6] = w[ 6]; + w_t[ 7] = w[ 7]; + w_t[ 8] = w[ 8]; + w_t[ 9] = w[ 9]; + w_t[10] = w[10]; + w_t[11] = w[11]; + w_t[12] = w[12]; + w_t[13] = w[13]; + w_t[14] = w[14]; + w_t[15] = w[15]; + + u32x a = crc32 (w_t, pw_len, iv); + u32x b = 0; + + const u32x r0 = a; + const u32x r1 = b; + const u32x r2 = 0; + const u32x r3 = 0; + + #include VECT_COMPARE_M + } +} + +__device__ static void m11500s (u32 w[16], const u32 pw_len, const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const u32x *words_buf_r, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset) +{ + /** + * modifier + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + const u32 lid = threadIdx.x; + + /** + * digest + */ + + const u32 iv = salt_bufs[salt_pos].salt_buf[0]; + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * loop + */ + + const u32 bf_loops = ceil ((float) bfs_cnt / VECT_DIV); + + u32x w0l = w[0]; + + for (u32 il_pos = 0; il_pos < bf_loops; il_pos++) + { + const u32x w0r = c_bfs[il_pos]; + + const u32x w0 = w0l | w0r; + + u32x w_t[16]; + + w_t[ 0] = w0; + w_t[ 1] = w[ 1]; + w_t[ 2] = w[ 2]; + w_t[ 3] = w[ 3]; + w_t[ 4] = w[ 4]; + w_t[ 5] = w[ 5]; + w_t[ 6] = w[ 6]; + w_t[ 7] = w[ 7]; + w_t[ 8] = w[ 8]; + w_t[ 9] = w[ 9]; + w_t[10] = w[10]; + w_t[11] = w[11]; + w_t[12] = w[12]; + w_t[13] = w[13]; + w_t[14] = w[14]; + w_t[15] = w[15]; + + u32x a = crc32 (w_t, pw_len, iv); + u32x b = 0; + + const u32x r0 = a; + const u32x r1 = b; + const u32x r2 = 0; + const u32x r3 = 0; + + #include VECT_COMPARE_S + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m11500_m04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const u32x *words_buf_r, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32 w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = 0; + w[ 5] = 0; + w[ 6] = 0; + w[ 7] = 0; + w[ 8] = 0; + w[ 9] = 0; + w[10] = 0; + w[11] = 0; + w[12] = 0; + w[13] = 0; + w[14] = 0; + w[15] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m11500m (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m11500_m08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const u32x *words_buf_r, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32 w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = pws[gid].i[ 4]; + w[ 5] = pws[gid].i[ 5]; + w[ 6] = pws[gid].i[ 6]; + w[ 7] = pws[gid].i[ 7]; + w[ 8] = 0; + w[ 9] = 0; + w[10] = 0; + w[11] = 0; + w[12] = 0; + w[13] = 0; + w[14] = 0; + w[15] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m11500m (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m11500_m16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const u32x *words_buf_r, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32 w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = pws[gid].i[ 4]; + w[ 5] = pws[gid].i[ 5]; + w[ 6] = pws[gid].i[ 6]; + w[ 7] = pws[gid].i[ 7]; + w[ 8] = pws[gid].i[ 8]; + w[ 9] = pws[gid].i[ 9]; + w[10] = pws[gid].i[10]; + w[11] = pws[gid].i[11]; + w[12] = pws[gid].i[12]; + w[13] = pws[gid].i[13]; + w[14] = pws[gid].i[14]; + w[15] = pws[gid].i[15]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m11500m (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m11500_s04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const u32x *words_buf_r, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32 w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = 0; + w[ 5] = 0; + w[ 6] = 0; + w[ 7] = 0; + w[ 8] = 0; + w[ 9] = 0; + w[10] = 0; + w[11] = 0; + w[12] = 0; + w[13] = 0; + w[14] = 0; + w[15] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m11500s (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m11500_s08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const u32x *words_buf_r, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32 w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = pws[gid].i[ 4]; + w[ 5] = pws[gid].i[ 5]; + w[ 6] = pws[gid].i[ 6]; + w[ 7] = pws[gid].i[ 7]; + w[ 8] = 0; + w[ 9] = 0; + w[10] = 0; + w[11] = 0; + w[12] = 0; + w[13] = 0; + w[14] = 0; + w[15] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m11500s (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m11500_s16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const u32x *words_buf_r, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32 w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = pws[gid].i[ 4]; + w[ 5] = pws[gid].i[ 5]; + w[ 6] = pws[gid].i[ 6]; + w[ 7] = pws[gid].i[ 7]; + w[ 8] = pws[gid].i[ 8]; + w[ 9] = pws[gid].i[ 9]; + w[10] = pws[gid].i[10]; + w[11] = pws[gid].i[11]; + w[12] = pws[gid].i[12]; + w[13] = pws[gid].i[13]; + w[14] = pws[gid].i[14]; + w[15] = pws[gid].i[15]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * main + */ + + m11500s (w, pw_len, pws, rules_buf, combs_buf, words_buf_r, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} diff --git a/nv/m11600.cu b/nv/m11600.cu new file mode 100644 index 0000000000..3880034023 --- /dev/null +++ b/nv/m11600.cu @@ -0,0 +1,1923 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _SEVEN_ZIP_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW2 +#define VECT_SIZE1 +#endif + +#define DGST_R0 0 +#define DGST_R1 1 +#define DGST_R2 2 +#define DGST_R3 3 + +#include "include/kernel_functions.c" +#include "types_nv.c" +#include "common_nv.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +__device__ __constant__ u32 te0[256] = +{ + 0xc66363a5, 0xf87c7c84, 0xee777799, 0xf67b7b8d, + 0xfff2f20d, 0xd66b6bbd, 0xde6f6fb1, 0x91c5c554, + 0x60303050, 0x02010103, 0xce6767a9, 0x562b2b7d, + 0xe7fefe19, 0xb5d7d762, 0x4dababe6, 0xec76769a, + 0x8fcaca45, 0x1f82829d, 0x89c9c940, 0xfa7d7d87, + 0xeffafa15, 0xb25959eb, 0x8e4747c9, 0xfbf0f00b, + 0x41adadec, 0xb3d4d467, 0x5fa2a2fd, 0x45afafea, + 0x239c9cbf, 0x53a4a4f7, 0xe4727296, 0x9bc0c05b, + 0x75b7b7c2, 0xe1fdfd1c, 0x3d9393ae, 0x4c26266a, + 0x6c36365a, 0x7e3f3f41, 0xf5f7f702, 0x83cccc4f, + 0x6834345c, 0x51a5a5f4, 0xd1e5e534, 0xf9f1f108, + 0xe2717193, 0xabd8d873, 0x62313153, 0x2a15153f, + 0x0804040c, 0x95c7c752, 0x46232365, 0x9dc3c35e, + 0x30181828, 0x379696a1, 0x0a05050f, 0x2f9a9ab5, + 0x0e070709, 0x24121236, 0x1b80809b, 0xdfe2e23d, + 0xcdebeb26, 0x4e272769, 0x7fb2b2cd, 0xea75759f, + 0x1209091b, 0x1d83839e, 0x582c2c74, 0x341a1a2e, + 0x361b1b2d, 0xdc6e6eb2, 0xb45a5aee, 0x5ba0a0fb, + 0xa45252f6, 0x763b3b4d, 0xb7d6d661, 0x7db3b3ce, + 0x5229297b, 0xdde3e33e, 0x5e2f2f71, 0x13848497, + 0xa65353f5, 0xb9d1d168, 0x00000000, 0xc1eded2c, + 0x40202060, 0xe3fcfc1f, 0x79b1b1c8, 0xb65b5bed, + 0xd46a6abe, 0x8dcbcb46, 0x67bebed9, 0x7239394b, + 0x944a4ade, 0x984c4cd4, 0xb05858e8, 0x85cfcf4a, + 0xbbd0d06b, 0xc5efef2a, 0x4faaaae5, 0xedfbfb16, + 0x864343c5, 0x9a4d4dd7, 0x66333355, 0x11858594, + 0x8a4545cf, 0xe9f9f910, 0x04020206, 0xfe7f7f81, + 0xa05050f0, 0x783c3c44, 0x259f9fba, 0x4ba8a8e3, + 0xa25151f3, 0x5da3a3fe, 0x804040c0, 0x058f8f8a, + 0x3f9292ad, 0x219d9dbc, 0x70383848, 0xf1f5f504, + 0x63bcbcdf, 0x77b6b6c1, 0xafdada75, 0x42212163, + 0x20101030, 0xe5ffff1a, 0xfdf3f30e, 0xbfd2d26d, + 0x81cdcd4c, 0x180c0c14, 0x26131335, 0xc3ecec2f, + 0xbe5f5fe1, 0x359797a2, 0x884444cc, 0x2e171739, + 0x93c4c457, 0x55a7a7f2, 0xfc7e7e82, 0x7a3d3d47, + 0xc86464ac, 0xba5d5de7, 0x3219192b, 0xe6737395, + 0xc06060a0, 0x19818198, 0x9e4f4fd1, 0xa3dcdc7f, + 0x44222266, 0x542a2a7e, 0x3b9090ab, 0x0b888883, + 0x8c4646ca, 0xc7eeee29, 0x6bb8b8d3, 0x2814143c, + 0xa7dede79, 0xbc5e5ee2, 0x160b0b1d, 0xaddbdb76, + 0xdbe0e03b, 0x64323256, 0x743a3a4e, 0x140a0a1e, + 0x924949db, 0x0c06060a, 0x4824246c, 0xb85c5ce4, + 0x9fc2c25d, 0xbdd3d36e, 0x43acacef, 0xc46262a6, + 0x399191a8, 0x319595a4, 0xd3e4e437, 0xf279798b, + 0xd5e7e732, 0x8bc8c843, 0x6e373759, 0xda6d6db7, + 0x018d8d8c, 0xb1d5d564, 0x9c4e4ed2, 0x49a9a9e0, + 0xd86c6cb4, 0xac5656fa, 0xf3f4f407, 0xcfeaea25, + 0xca6565af, 0xf47a7a8e, 0x47aeaee9, 0x10080818, + 0x6fbabad5, 0xf0787888, 0x4a25256f, 0x5c2e2e72, + 0x381c1c24, 0x57a6a6f1, 0x73b4b4c7, 0x97c6c651, + 0xcbe8e823, 0xa1dddd7c, 0xe874749c, 0x3e1f1f21, + 0x964b4bdd, 0x61bdbddc, 0x0d8b8b86, 0x0f8a8a85, + 0xe0707090, 0x7c3e3e42, 0x71b5b5c4, 0xcc6666aa, + 0x904848d8, 0x06030305, 0xf7f6f601, 0x1c0e0e12, + 0xc26161a3, 0x6a35355f, 0xae5757f9, 0x69b9b9d0, + 0x17868691, 0x99c1c158, 0x3a1d1d27, 0x279e9eb9, + 0xd9e1e138, 0xebf8f813, 0x2b9898b3, 0x22111133, + 0xd26969bb, 0xa9d9d970, 0x078e8e89, 0x339494a7, + 0x2d9b9bb6, 0x3c1e1e22, 0x15878792, 0xc9e9e920, + 0x87cece49, 0xaa5555ff, 0x50282878, 0xa5dfdf7a, + 0x038c8c8f, 0x59a1a1f8, 0x09898980, 0x1a0d0d17, + 0x65bfbfda, 0xd7e6e631, 0x844242c6, 0xd06868b8, + 0x824141c3, 0x299999b0, 0x5a2d2d77, 0x1e0f0f11, + 0x7bb0b0cb, 0xa85454fc, 0x6dbbbbd6, 0x2c16163a, +}; + +__device__ __constant__ u32 te1[256] = +{ + 0xa5c66363, 0x84f87c7c, 0x99ee7777, 0x8df67b7b, + 0x0dfff2f2, 0xbdd66b6b, 0xb1de6f6f, 0x5491c5c5, + 0x50603030, 0x03020101, 0xa9ce6767, 0x7d562b2b, + 0x19e7fefe, 0x62b5d7d7, 0xe64dabab, 0x9aec7676, + 0x458fcaca, 0x9d1f8282, 0x4089c9c9, 0x87fa7d7d, + 0x15effafa, 0xebb25959, 0xc98e4747, 0x0bfbf0f0, + 0xec41adad, 0x67b3d4d4, 0xfd5fa2a2, 0xea45afaf, + 0xbf239c9c, 0xf753a4a4, 0x96e47272, 0x5b9bc0c0, + 0xc275b7b7, 0x1ce1fdfd, 0xae3d9393, 0x6a4c2626, + 0x5a6c3636, 0x417e3f3f, 0x02f5f7f7, 0x4f83cccc, + 0x5c683434, 0xf451a5a5, 0x34d1e5e5, 0x08f9f1f1, + 0x93e27171, 0x73abd8d8, 0x53623131, 0x3f2a1515, + 0x0c080404, 0x5295c7c7, 0x65462323, 0x5e9dc3c3, + 0x28301818, 0xa1379696, 0x0f0a0505, 0xb52f9a9a, + 0x090e0707, 0x36241212, 0x9b1b8080, 0x3ddfe2e2, + 0x26cdebeb, 0x694e2727, 0xcd7fb2b2, 0x9fea7575, + 0x1b120909, 0x9e1d8383, 0x74582c2c, 0x2e341a1a, + 0x2d361b1b, 0xb2dc6e6e, 0xeeb45a5a, 0xfb5ba0a0, + 0xf6a45252, 0x4d763b3b, 0x61b7d6d6, 0xce7db3b3, + 0x7b522929, 0x3edde3e3, 0x715e2f2f, 0x97138484, + 0xf5a65353, 0x68b9d1d1, 0x00000000, 0x2cc1eded, + 0x60402020, 0x1fe3fcfc, 0xc879b1b1, 0xedb65b5b, + 0xbed46a6a, 0x468dcbcb, 0xd967bebe, 0x4b723939, + 0xde944a4a, 0xd4984c4c, 0xe8b05858, 0x4a85cfcf, + 0x6bbbd0d0, 0x2ac5efef, 0xe54faaaa, 0x16edfbfb, + 0xc5864343, 0xd79a4d4d, 0x55663333, 0x94118585, + 0xcf8a4545, 0x10e9f9f9, 0x06040202, 0x81fe7f7f, + 0xf0a05050, 0x44783c3c, 0xba259f9f, 0xe34ba8a8, + 0xf3a25151, 0xfe5da3a3, 0xc0804040, 0x8a058f8f, + 0xad3f9292, 0xbc219d9d, 0x48703838, 0x04f1f5f5, + 0xdf63bcbc, 0xc177b6b6, 0x75afdada, 0x63422121, + 0x30201010, 0x1ae5ffff, 0x0efdf3f3, 0x6dbfd2d2, + 0x4c81cdcd, 0x14180c0c, 0x35261313, 0x2fc3ecec, + 0xe1be5f5f, 0xa2359797, 0xcc884444, 0x392e1717, + 0x5793c4c4, 0xf255a7a7, 0x82fc7e7e, 0x477a3d3d, + 0xacc86464, 0xe7ba5d5d, 0x2b321919, 0x95e67373, + 0xa0c06060, 0x98198181, 0xd19e4f4f, 0x7fa3dcdc, + 0x66442222, 0x7e542a2a, 0xab3b9090, 0x830b8888, + 0xca8c4646, 0x29c7eeee, 0xd36bb8b8, 0x3c281414, + 0x79a7dede, 0xe2bc5e5e, 0x1d160b0b, 0x76addbdb, + 0x3bdbe0e0, 0x56643232, 0x4e743a3a, 0x1e140a0a, + 0xdb924949, 0x0a0c0606, 0x6c482424, 0xe4b85c5c, + 0x5d9fc2c2, 0x6ebdd3d3, 0xef43acac, 0xa6c46262, + 0xa8399191, 0xa4319595, 0x37d3e4e4, 0x8bf27979, + 0x32d5e7e7, 0x438bc8c8, 0x596e3737, 0xb7da6d6d, + 0x8c018d8d, 0x64b1d5d5, 0xd29c4e4e, 0xe049a9a9, + 0xb4d86c6c, 0xfaac5656, 0x07f3f4f4, 0x25cfeaea, + 0xafca6565, 0x8ef47a7a, 0xe947aeae, 0x18100808, + 0xd56fbaba, 0x88f07878, 0x6f4a2525, 0x725c2e2e, + 0x24381c1c, 0xf157a6a6, 0xc773b4b4, 0x5197c6c6, + 0x23cbe8e8, 0x7ca1dddd, 0x9ce87474, 0x213e1f1f, + 0xdd964b4b, 0xdc61bdbd, 0x860d8b8b, 0x850f8a8a, + 0x90e07070, 0x427c3e3e, 0xc471b5b5, 0xaacc6666, + 0xd8904848, 0x05060303, 0x01f7f6f6, 0x121c0e0e, + 0xa3c26161, 0x5f6a3535, 0xf9ae5757, 0xd069b9b9, + 0x91178686, 0x5899c1c1, 0x273a1d1d, 0xb9279e9e, + 0x38d9e1e1, 0x13ebf8f8, 0xb32b9898, 0x33221111, + 0xbbd26969, 0x70a9d9d9, 0x89078e8e, 0xa7339494, + 0xb62d9b9b, 0x223c1e1e, 0x92158787, 0x20c9e9e9, + 0x4987cece, 0xffaa5555, 0x78502828, 0x7aa5dfdf, + 0x8f038c8c, 0xf859a1a1, 0x80098989, 0x171a0d0d, + 0xda65bfbf, 0x31d7e6e6, 0xc6844242, 0xb8d06868, + 0xc3824141, 0xb0299999, 0x775a2d2d, 0x111e0f0f, + 0xcb7bb0b0, 0xfca85454, 0xd66dbbbb, 0x3a2c1616, +}; + +__device__ __constant__ u32 te2[256] = +{ + 0x63a5c663, 0x7c84f87c, 0x7799ee77, 0x7b8df67b, + 0xf20dfff2, 0x6bbdd66b, 0x6fb1de6f, 0xc55491c5, + 0x30506030, 0x01030201, 0x67a9ce67, 0x2b7d562b, + 0xfe19e7fe, 0xd762b5d7, 0xabe64dab, 0x769aec76, + 0xca458fca, 0x829d1f82, 0xc94089c9, 0x7d87fa7d, + 0xfa15effa, 0x59ebb259, 0x47c98e47, 0xf00bfbf0, + 0xadec41ad, 0xd467b3d4, 0xa2fd5fa2, 0xafea45af, + 0x9cbf239c, 0xa4f753a4, 0x7296e472, 0xc05b9bc0, + 0xb7c275b7, 0xfd1ce1fd, 0x93ae3d93, 0x266a4c26, + 0x365a6c36, 0x3f417e3f, 0xf702f5f7, 0xcc4f83cc, + 0x345c6834, 0xa5f451a5, 0xe534d1e5, 0xf108f9f1, + 0x7193e271, 0xd873abd8, 0x31536231, 0x153f2a15, + 0x040c0804, 0xc75295c7, 0x23654623, 0xc35e9dc3, + 0x18283018, 0x96a13796, 0x050f0a05, 0x9ab52f9a, + 0x07090e07, 0x12362412, 0x809b1b80, 0xe23ddfe2, + 0xeb26cdeb, 0x27694e27, 0xb2cd7fb2, 0x759fea75, + 0x091b1209, 0x839e1d83, 0x2c74582c, 0x1a2e341a, + 0x1b2d361b, 0x6eb2dc6e, 0x5aeeb45a, 0xa0fb5ba0, + 0x52f6a452, 0x3b4d763b, 0xd661b7d6, 0xb3ce7db3, + 0x297b5229, 0xe33edde3, 0x2f715e2f, 0x84971384, + 0x53f5a653, 0xd168b9d1, 0x00000000, 0xed2cc1ed, + 0x20604020, 0xfc1fe3fc, 0xb1c879b1, 0x5bedb65b, + 0x6abed46a, 0xcb468dcb, 0xbed967be, 0x394b7239, + 0x4ade944a, 0x4cd4984c, 0x58e8b058, 0xcf4a85cf, + 0xd06bbbd0, 0xef2ac5ef, 0xaae54faa, 0xfb16edfb, + 0x43c58643, 0x4dd79a4d, 0x33556633, 0x85941185, + 0x45cf8a45, 0xf910e9f9, 0x02060402, 0x7f81fe7f, + 0x50f0a050, 0x3c44783c, 0x9fba259f, 0xa8e34ba8, + 0x51f3a251, 0xa3fe5da3, 0x40c08040, 0x8f8a058f, + 0x92ad3f92, 0x9dbc219d, 0x38487038, 0xf504f1f5, + 0xbcdf63bc, 0xb6c177b6, 0xda75afda, 0x21634221, + 0x10302010, 0xff1ae5ff, 0xf30efdf3, 0xd26dbfd2, + 0xcd4c81cd, 0x0c14180c, 0x13352613, 0xec2fc3ec, + 0x5fe1be5f, 0x97a23597, 0x44cc8844, 0x17392e17, + 0xc45793c4, 0xa7f255a7, 0x7e82fc7e, 0x3d477a3d, + 0x64acc864, 0x5de7ba5d, 0x192b3219, 0x7395e673, + 0x60a0c060, 0x81981981, 0x4fd19e4f, 0xdc7fa3dc, + 0x22664422, 0x2a7e542a, 0x90ab3b90, 0x88830b88, + 0x46ca8c46, 0xee29c7ee, 0xb8d36bb8, 0x143c2814, + 0xde79a7de, 0x5ee2bc5e, 0x0b1d160b, 0xdb76addb, + 0xe03bdbe0, 0x32566432, 0x3a4e743a, 0x0a1e140a, + 0x49db9249, 0x060a0c06, 0x246c4824, 0x5ce4b85c, + 0xc25d9fc2, 0xd36ebdd3, 0xacef43ac, 0x62a6c462, + 0x91a83991, 0x95a43195, 0xe437d3e4, 0x798bf279, + 0xe732d5e7, 0xc8438bc8, 0x37596e37, 0x6db7da6d, + 0x8d8c018d, 0xd564b1d5, 0x4ed29c4e, 0xa9e049a9, + 0x6cb4d86c, 0x56faac56, 0xf407f3f4, 0xea25cfea, + 0x65afca65, 0x7a8ef47a, 0xaee947ae, 0x08181008, + 0xbad56fba, 0x7888f078, 0x256f4a25, 0x2e725c2e, + 0x1c24381c, 0xa6f157a6, 0xb4c773b4, 0xc65197c6, + 0xe823cbe8, 0xdd7ca1dd, 0x749ce874, 0x1f213e1f, + 0x4bdd964b, 0xbddc61bd, 0x8b860d8b, 0x8a850f8a, + 0x7090e070, 0x3e427c3e, 0xb5c471b5, 0x66aacc66, + 0x48d89048, 0x03050603, 0xf601f7f6, 0x0e121c0e, + 0x61a3c261, 0x355f6a35, 0x57f9ae57, 0xb9d069b9, + 0x86911786, 0xc15899c1, 0x1d273a1d, 0x9eb9279e, + 0xe138d9e1, 0xf813ebf8, 0x98b32b98, 0x11332211, + 0x69bbd269, 0xd970a9d9, 0x8e89078e, 0x94a73394, + 0x9bb62d9b, 0x1e223c1e, 0x87921587, 0xe920c9e9, + 0xce4987ce, 0x55ffaa55, 0x28785028, 0xdf7aa5df, + 0x8c8f038c, 0xa1f859a1, 0x89800989, 0x0d171a0d, + 0xbfda65bf, 0xe631d7e6, 0x42c68442, 0x68b8d068, + 0x41c38241, 0x99b02999, 0x2d775a2d, 0x0f111e0f, + 0xb0cb7bb0, 0x54fca854, 0xbbd66dbb, 0x163a2c16, +}; + +__device__ __constant__ u32 te3[256] = +{ + 0x6363a5c6, 0x7c7c84f8, 0x777799ee, 0x7b7b8df6, + 0xf2f20dff, 0x6b6bbdd6, 0x6f6fb1de, 0xc5c55491, + 0x30305060, 0x01010302, 0x6767a9ce, 0x2b2b7d56, + 0xfefe19e7, 0xd7d762b5, 0xababe64d, 0x76769aec, + 0xcaca458f, 0x82829d1f, 0xc9c94089, 0x7d7d87fa, + 0xfafa15ef, 0x5959ebb2, 0x4747c98e, 0xf0f00bfb, + 0xadadec41, 0xd4d467b3, 0xa2a2fd5f, 0xafafea45, + 0x9c9cbf23, 0xa4a4f753, 0x727296e4, 0xc0c05b9b, + 0xb7b7c275, 0xfdfd1ce1, 0x9393ae3d, 0x26266a4c, + 0x36365a6c, 0x3f3f417e, 0xf7f702f5, 0xcccc4f83, + 0x34345c68, 0xa5a5f451, 0xe5e534d1, 0xf1f108f9, + 0x717193e2, 0xd8d873ab, 0x31315362, 0x15153f2a, + 0x04040c08, 0xc7c75295, 0x23236546, 0xc3c35e9d, + 0x18182830, 0x9696a137, 0x05050f0a, 0x9a9ab52f, + 0x0707090e, 0x12123624, 0x80809b1b, 0xe2e23ddf, + 0xebeb26cd, 0x2727694e, 0xb2b2cd7f, 0x75759fea, + 0x09091b12, 0x83839e1d, 0x2c2c7458, 0x1a1a2e34, + 0x1b1b2d36, 0x6e6eb2dc, 0x5a5aeeb4, 0xa0a0fb5b, + 0x5252f6a4, 0x3b3b4d76, 0xd6d661b7, 0xb3b3ce7d, + 0x29297b52, 0xe3e33edd, 0x2f2f715e, 0x84849713, + 0x5353f5a6, 0xd1d168b9, 0x00000000, 0xeded2cc1, + 0x20206040, 0xfcfc1fe3, 0xb1b1c879, 0x5b5bedb6, + 0x6a6abed4, 0xcbcb468d, 0xbebed967, 0x39394b72, + 0x4a4ade94, 0x4c4cd498, 0x5858e8b0, 0xcfcf4a85, + 0xd0d06bbb, 0xefef2ac5, 0xaaaae54f, 0xfbfb16ed, + 0x4343c586, 0x4d4dd79a, 0x33335566, 0x85859411, + 0x4545cf8a, 0xf9f910e9, 0x02020604, 0x7f7f81fe, + 0x5050f0a0, 0x3c3c4478, 0x9f9fba25, 0xa8a8e34b, + 0x5151f3a2, 0xa3a3fe5d, 0x4040c080, 0x8f8f8a05, + 0x9292ad3f, 0x9d9dbc21, 0x38384870, 0xf5f504f1, + 0xbcbcdf63, 0xb6b6c177, 0xdada75af, 0x21216342, + 0x10103020, 0xffff1ae5, 0xf3f30efd, 0xd2d26dbf, + 0xcdcd4c81, 0x0c0c1418, 0x13133526, 0xecec2fc3, + 0x5f5fe1be, 0x9797a235, 0x4444cc88, 0x1717392e, + 0xc4c45793, 0xa7a7f255, 0x7e7e82fc, 0x3d3d477a, + 0x6464acc8, 0x5d5de7ba, 0x19192b32, 0x737395e6, + 0x6060a0c0, 0x81819819, 0x4f4fd19e, 0xdcdc7fa3, + 0x22226644, 0x2a2a7e54, 0x9090ab3b, 0x8888830b, + 0x4646ca8c, 0xeeee29c7, 0xb8b8d36b, 0x14143c28, + 0xdede79a7, 0x5e5ee2bc, 0x0b0b1d16, 0xdbdb76ad, + 0xe0e03bdb, 0x32325664, 0x3a3a4e74, 0x0a0a1e14, + 0x4949db92, 0x06060a0c, 0x24246c48, 0x5c5ce4b8, + 0xc2c25d9f, 0xd3d36ebd, 0xacacef43, 0x6262a6c4, + 0x9191a839, 0x9595a431, 0xe4e437d3, 0x79798bf2, + 0xe7e732d5, 0xc8c8438b, 0x3737596e, 0x6d6db7da, + 0x8d8d8c01, 0xd5d564b1, 0x4e4ed29c, 0xa9a9e049, + 0x6c6cb4d8, 0x5656faac, 0xf4f407f3, 0xeaea25cf, + 0x6565afca, 0x7a7a8ef4, 0xaeaee947, 0x08081810, + 0xbabad56f, 0x787888f0, 0x25256f4a, 0x2e2e725c, + 0x1c1c2438, 0xa6a6f157, 0xb4b4c773, 0xc6c65197, + 0xe8e823cb, 0xdddd7ca1, 0x74749ce8, 0x1f1f213e, + 0x4b4bdd96, 0xbdbddc61, 0x8b8b860d, 0x8a8a850f, + 0x707090e0, 0x3e3e427c, 0xb5b5c471, 0x6666aacc, + 0x4848d890, 0x03030506, 0xf6f601f7, 0x0e0e121c, + 0x6161a3c2, 0x35355f6a, 0x5757f9ae, 0xb9b9d069, + 0x86869117, 0xc1c15899, 0x1d1d273a, 0x9e9eb927, + 0xe1e138d9, 0xf8f813eb, 0x9898b32b, 0x11113322, + 0x6969bbd2, 0xd9d970a9, 0x8e8e8907, 0x9494a733, + 0x9b9bb62d, 0x1e1e223c, 0x87879215, 0xe9e920c9, + 0xcece4987, 0x5555ffaa, 0x28287850, 0xdfdf7aa5, + 0x8c8c8f03, 0xa1a1f859, 0x89898009, 0x0d0d171a, + 0xbfbfda65, 0xe6e631d7, 0x4242c684, 0x6868b8d0, + 0x4141c382, 0x9999b029, 0x2d2d775a, 0x0f0f111e, + 0xb0b0cb7b, 0x5454fca8, 0xbbbbd66d, 0x16163a2c, +}; + +__device__ __constant__ u32 te4[256] = +{ + 0x63636363, 0x7c7c7c7c, 0x77777777, 0x7b7b7b7b, + 0xf2f2f2f2, 0x6b6b6b6b, 0x6f6f6f6f, 0xc5c5c5c5, + 0x30303030, 0x01010101, 0x67676767, 0x2b2b2b2b, + 0xfefefefe, 0xd7d7d7d7, 0xabababab, 0x76767676, + 0xcacacaca, 0x82828282, 0xc9c9c9c9, 0x7d7d7d7d, + 0xfafafafa, 0x59595959, 0x47474747, 0xf0f0f0f0, + 0xadadadad, 0xd4d4d4d4, 0xa2a2a2a2, 0xafafafaf, + 0x9c9c9c9c, 0xa4a4a4a4, 0x72727272, 0xc0c0c0c0, + 0xb7b7b7b7, 0xfdfdfdfd, 0x93939393, 0x26262626, + 0x36363636, 0x3f3f3f3f, 0xf7f7f7f7, 0xcccccccc, + 0x34343434, 0xa5a5a5a5, 0xe5e5e5e5, 0xf1f1f1f1, + 0x71717171, 0xd8d8d8d8, 0x31313131, 0x15151515, + 0x04040404, 0xc7c7c7c7, 0x23232323, 0xc3c3c3c3, + 0x18181818, 0x96969696, 0x05050505, 0x9a9a9a9a, + 0x07070707, 0x12121212, 0x80808080, 0xe2e2e2e2, + 0xebebebeb, 0x27272727, 0xb2b2b2b2, 0x75757575, + 0x09090909, 0x83838383, 0x2c2c2c2c, 0x1a1a1a1a, + 0x1b1b1b1b, 0x6e6e6e6e, 0x5a5a5a5a, 0xa0a0a0a0, + 0x52525252, 0x3b3b3b3b, 0xd6d6d6d6, 0xb3b3b3b3, + 0x29292929, 0xe3e3e3e3, 0x2f2f2f2f, 0x84848484, + 0x53535353, 0xd1d1d1d1, 0x00000000, 0xedededed, + 0x20202020, 0xfcfcfcfc, 0xb1b1b1b1, 0x5b5b5b5b, + 0x6a6a6a6a, 0xcbcbcbcb, 0xbebebebe, 0x39393939, + 0x4a4a4a4a, 0x4c4c4c4c, 0x58585858, 0xcfcfcfcf, + 0xd0d0d0d0, 0xefefefef, 0xaaaaaaaa, 0xfbfbfbfb, + 0x43434343, 0x4d4d4d4d, 0x33333333, 0x85858585, + 0x45454545, 0xf9f9f9f9, 0x02020202, 0x7f7f7f7f, + 0x50505050, 0x3c3c3c3c, 0x9f9f9f9f, 0xa8a8a8a8, + 0x51515151, 0xa3a3a3a3, 0x40404040, 0x8f8f8f8f, + 0x92929292, 0x9d9d9d9d, 0x38383838, 0xf5f5f5f5, + 0xbcbcbcbc, 0xb6b6b6b6, 0xdadadada, 0x21212121, + 0x10101010, 0xffffffff, 0xf3f3f3f3, 0xd2d2d2d2, + 0xcdcdcdcd, 0x0c0c0c0c, 0x13131313, 0xecececec, + 0x5f5f5f5f, 0x97979797, 0x44444444, 0x17171717, + 0xc4c4c4c4, 0xa7a7a7a7, 0x7e7e7e7e, 0x3d3d3d3d, + 0x64646464, 0x5d5d5d5d, 0x19191919, 0x73737373, + 0x60606060, 0x81818181, 0x4f4f4f4f, 0xdcdcdcdc, + 0x22222222, 0x2a2a2a2a, 0x90909090, 0x88888888, + 0x46464646, 0xeeeeeeee, 0xb8b8b8b8, 0x14141414, + 0xdededede, 0x5e5e5e5e, 0x0b0b0b0b, 0xdbdbdbdb, + 0xe0e0e0e0, 0x32323232, 0x3a3a3a3a, 0x0a0a0a0a, + 0x49494949, 0x06060606, 0x24242424, 0x5c5c5c5c, + 0xc2c2c2c2, 0xd3d3d3d3, 0xacacacac, 0x62626262, + 0x91919191, 0x95959595, 0xe4e4e4e4, 0x79797979, + 0xe7e7e7e7, 0xc8c8c8c8, 0x37373737, 0x6d6d6d6d, + 0x8d8d8d8d, 0xd5d5d5d5, 0x4e4e4e4e, 0xa9a9a9a9, + 0x6c6c6c6c, 0x56565656, 0xf4f4f4f4, 0xeaeaeaea, + 0x65656565, 0x7a7a7a7a, 0xaeaeaeae, 0x08080808, + 0xbabababa, 0x78787878, 0x25252525, 0x2e2e2e2e, + 0x1c1c1c1c, 0xa6a6a6a6, 0xb4b4b4b4, 0xc6c6c6c6, + 0xe8e8e8e8, 0xdddddddd, 0x74747474, 0x1f1f1f1f, + 0x4b4b4b4b, 0xbdbdbdbd, 0x8b8b8b8b, 0x8a8a8a8a, + 0x70707070, 0x3e3e3e3e, 0xb5b5b5b5, 0x66666666, + 0x48484848, 0x03030303, 0xf6f6f6f6, 0x0e0e0e0e, + 0x61616161, 0x35353535, 0x57575757, 0xb9b9b9b9, + 0x86868686, 0xc1c1c1c1, 0x1d1d1d1d, 0x9e9e9e9e, + 0xe1e1e1e1, 0xf8f8f8f8, 0x98989898, 0x11111111, + 0x69696969, 0xd9d9d9d9, 0x8e8e8e8e, 0x94949494, + 0x9b9b9b9b, 0x1e1e1e1e, 0x87878787, 0xe9e9e9e9, + 0xcececece, 0x55555555, 0x28282828, 0xdfdfdfdf, + 0x8c8c8c8c, 0xa1a1a1a1, 0x89898989, 0x0d0d0d0d, + 0xbfbfbfbf, 0xe6e6e6e6, 0x42424242, 0x68686868, + 0x41414141, 0x99999999, 0x2d2d2d2d, 0x0f0f0f0f, + 0xb0b0b0b0, 0x54545454, 0xbbbbbbbb, 0x16161616, +}; + +__device__ __constant__ u32 td0[256] = +{ + 0x51f4a750, 0x7e416553, 0x1a17a4c3, 0x3a275e96, + 0x3bab6bcb, 0x1f9d45f1, 0xacfa58ab, 0x4be30393, + 0x2030fa55, 0xad766df6, 0x88cc7691, 0xf5024c25, + 0x4fe5d7fc, 0xc52acbd7, 0x26354480, 0xb562a38f, + 0xdeb15a49, 0x25ba1b67, 0x45ea0e98, 0x5dfec0e1, + 0xc32f7502, 0x814cf012, 0x8d4697a3, 0x6bd3f9c6, + 0x038f5fe7, 0x15929c95, 0xbf6d7aeb, 0x955259da, + 0xd4be832d, 0x587421d3, 0x49e06929, 0x8ec9c844, + 0x75c2896a, 0xf48e7978, 0x99583e6b, 0x27b971dd, + 0xbee14fb6, 0xf088ad17, 0xc920ac66, 0x7dce3ab4, + 0x63df4a18, 0xe51a3182, 0x97513360, 0x62537f45, + 0xb16477e0, 0xbb6bae84, 0xfe81a01c, 0xf9082b94, + 0x70486858, 0x8f45fd19, 0x94de6c87, 0x527bf8b7, + 0xab73d323, 0x724b02e2, 0xe31f8f57, 0x6655ab2a, + 0xb2eb2807, 0x2fb5c203, 0x86c57b9a, 0xd33708a5, + 0x302887f2, 0x23bfa5b2, 0x02036aba, 0xed16825c, + 0x8acf1c2b, 0xa779b492, 0xf307f2f0, 0x4e69e2a1, + 0x65daf4cd, 0x0605bed5, 0xd134621f, 0xc4a6fe8a, + 0x342e539d, 0xa2f355a0, 0x058ae132, 0xa4f6eb75, + 0x0b83ec39, 0x4060efaa, 0x5e719f06, 0xbd6e1051, + 0x3e218af9, 0x96dd063d, 0xdd3e05ae, 0x4de6bd46, + 0x91548db5, 0x71c45d05, 0x0406d46f, 0x605015ff, + 0x1998fb24, 0xd6bde997, 0x894043cc, 0x67d99e77, + 0xb0e842bd, 0x07898b88, 0xe7195b38, 0x79c8eedb, + 0xa17c0a47, 0x7c420fe9, 0xf8841ec9, 0x00000000, + 0x09808683, 0x322bed48, 0x1e1170ac, 0x6c5a724e, + 0xfd0efffb, 0x0f853856, 0x3daed51e, 0x362d3927, + 0x0a0fd964, 0x685ca621, 0x9b5b54d1, 0x24362e3a, + 0x0c0a67b1, 0x9357e70f, 0xb4ee96d2, 0x1b9b919e, + 0x80c0c54f, 0x61dc20a2, 0x5a774b69, 0x1c121a16, + 0xe293ba0a, 0xc0a02ae5, 0x3c22e043, 0x121b171d, + 0x0e090d0b, 0xf28bc7ad, 0x2db6a8b9, 0x141ea9c8, + 0x57f11985, 0xaf75074c, 0xee99ddbb, 0xa37f60fd, + 0xf701269f, 0x5c72f5bc, 0x44663bc5, 0x5bfb7e34, + 0x8b432976, 0xcb23c6dc, 0xb6edfc68, 0xb8e4f163, + 0xd731dcca, 0x42638510, 0x13972240, 0x84c61120, + 0x854a247d, 0xd2bb3df8, 0xaef93211, 0xc729a16d, + 0x1d9e2f4b, 0xdcb230f3, 0x0d8652ec, 0x77c1e3d0, + 0x2bb3166c, 0xa970b999, 0x119448fa, 0x47e96422, + 0xa8fc8cc4, 0xa0f03f1a, 0x567d2cd8, 0x223390ef, + 0x87494ec7, 0xd938d1c1, 0x8ccaa2fe, 0x98d40b36, + 0xa6f581cf, 0xa57ade28, 0xdab78e26, 0x3fadbfa4, + 0x2c3a9de4, 0x5078920d, 0x6a5fcc9b, 0x547e4662, + 0xf68d13c2, 0x90d8b8e8, 0x2e39f75e, 0x82c3aff5, + 0x9f5d80be, 0x69d0937c, 0x6fd52da9, 0xcf2512b3, + 0xc8ac993b, 0x10187da7, 0xe89c636e, 0xdb3bbb7b, + 0xcd267809, 0x6e5918f4, 0xec9ab701, 0x834f9aa8, + 0xe6956e65, 0xaaffe67e, 0x21bccf08, 0xef15e8e6, + 0xbae79bd9, 0x4a6f36ce, 0xea9f09d4, 0x29b07cd6, + 0x31a4b2af, 0x2a3f2331, 0xc6a59430, 0x35a266c0, + 0x744ebc37, 0xfc82caa6, 0xe090d0b0, 0x33a7d815, + 0xf104984a, 0x41ecdaf7, 0x7fcd500e, 0x1791f62f, + 0x764dd68d, 0x43efb04d, 0xccaa4d54, 0xe49604df, + 0x9ed1b5e3, 0x4c6a881b, 0xc12c1fb8, 0x4665517f, + 0x9d5eea04, 0x018c355d, 0xfa877473, 0xfb0b412e, + 0xb3671d5a, 0x92dbd252, 0xe9105633, 0x6dd64713, + 0x9ad7618c, 0x37a10c7a, 0x59f8148e, 0xeb133c89, + 0xcea927ee, 0xb761c935, 0xe11ce5ed, 0x7a47b13c, + 0x9cd2df59, 0x55f2733f, 0x1814ce79, 0x73c737bf, + 0x53f7cdea, 0x5ffdaa5b, 0xdf3d6f14, 0x7844db86, + 0xcaaff381, 0xb968c43e, 0x3824342c, 0xc2a3405f, + 0x161dc372, 0xbce2250c, 0x283c498b, 0xff0d9541, + 0x39a80171, 0x080cb3de, 0xd8b4e49c, 0x6456c190, + 0x7bcb8461, 0xd532b670, 0x486c5c74, 0xd0b85742, +}; + +__device__ __constant__ u32 td1[256] = +{ + 0x5051f4a7, 0x537e4165, 0xc31a17a4, 0x963a275e, + 0xcb3bab6b, 0xf11f9d45, 0xabacfa58, 0x934be303, + 0x552030fa, 0xf6ad766d, 0x9188cc76, 0x25f5024c, + 0xfc4fe5d7, 0xd7c52acb, 0x80263544, 0x8fb562a3, + 0x49deb15a, 0x6725ba1b, 0x9845ea0e, 0xe15dfec0, + 0x02c32f75, 0x12814cf0, 0xa38d4697, 0xc66bd3f9, + 0xe7038f5f, 0x9515929c, 0xebbf6d7a, 0xda955259, + 0x2dd4be83, 0xd3587421, 0x2949e069, 0x448ec9c8, + 0x6a75c289, 0x78f48e79, 0x6b99583e, 0xdd27b971, + 0xb6bee14f, 0x17f088ad, 0x66c920ac, 0xb47dce3a, + 0x1863df4a, 0x82e51a31, 0x60975133, 0x4562537f, + 0xe0b16477, 0x84bb6bae, 0x1cfe81a0, 0x94f9082b, + 0x58704868, 0x198f45fd, 0x8794de6c, 0xb7527bf8, + 0x23ab73d3, 0xe2724b02, 0x57e31f8f, 0x2a6655ab, + 0x07b2eb28, 0x032fb5c2, 0x9a86c57b, 0xa5d33708, + 0xf2302887, 0xb223bfa5, 0xba02036a, 0x5ced1682, + 0x2b8acf1c, 0x92a779b4, 0xf0f307f2, 0xa14e69e2, + 0xcd65daf4, 0xd50605be, 0x1fd13462, 0x8ac4a6fe, + 0x9d342e53, 0xa0a2f355, 0x32058ae1, 0x75a4f6eb, + 0x390b83ec, 0xaa4060ef, 0x065e719f, 0x51bd6e10, + 0xf93e218a, 0x3d96dd06, 0xaedd3e05, 0x464de6bd, + 0xb591548d, 0x0571c45d, 0x6f0406d4, 0xff605015, + 0x241998fb, 0x97d6bde9, 0xcc894043, 0x7767d99e, + 0xbdb0e842, 0x8807898b, 0x38e7195b, 0xdb79c8ee, + 0x47a17c0a, 0xe97c420f, 0xc9f8841e, 0x00000000, + 0x83098086, 0x48322bed, 0xac1e1170, 0x4e6c5a72, + 0xfbfd0eff, 0x560f8538, 0x1e3daed5, 0x27362d39, + 0x640a0fd9, 0x21685ca6, 0xd19b5b54, 0x3a24362e, + 0xb10c0a67, 0x0f9357e7, 0xd2b4ee96, 0x9e1b9b91, + 0x4f80c0c5, 0xa261dc20, 0x695a774b, 0x161c121a, + 0x0ae293ba, 0xe5c0a02a, 0x433c22e0, 0x1d121b17, + 0x0b0e090d, 0xadf28bc7, 0xb92db6a8, 0xc8141ea9, + 0x8557f119, 0x4caf7507, 0xbbee99dd, 0xfda37f60, + 0x9ff70126, 0xbc5c72f5, 0xc544663b, 0x345bfb7e, + 0x768b4329, 0xdccb23c6, 0x68b6edfc, 0x63b8e4f1, + 0xcad731dc, 0x10426385, 0x40139722, 0x2084c611, + 0x7d854a24, 0xf8d2bb3d, 0x11aef932, 0x6dc729a1, + 0x4b1d9e2f, 0xf3dcb230, 0xec0d8652, 0xd077c1e3, + 0x6c2bb316, 0x99a970b9, 0xfa119448, 0x2247e964, + 0xc4a8fc8c, 0x1aa0f03f, 0xd8567d2c, 0xef223390, + 0xc787494e, 0xc1d938d1, 0xfe8ccaa2, 0x3698d40b, + 0xcfa6f581, 0x28a57ade, 0x26dab78e, 0xa43fadbf, + 0xe42c3a9d, 0x0d507892, 0x9b6a5fcc, 0x62547e46, + 0xc2f68d13, 0xe890d8b8, 0x5e2e39f7, 0xf582c3af, + 0xbe9f5d80, 0x7c69d093, 0xa96fd52d, 0xb3cf2512, + 0x3bc8ac99, 0xa710187d, 0x6ee89c63, 0x7bdb3bbb, + 0x09cd2678, 0xf46e5918, 0x01ec9ab7, 0xa8834f9a, + 0x65e6956e, 0x7eaaffe6, 0x0821bccf, 0xe6ef15e8, + 0xd9bae79b, 0xce4a6f36, 0xd4ea9f09, 0xd629b07c, + 0xaf31a4b2, 0x312a3f23, 0x30c6a594, 0xc035a266, + 0x37744ebc, 0xa6fc82ca, 0xb0e090d0, 0x1533a7d8, + 0x4af10498, 0xf741ecda, 0x0e7fcd50, 0x2f1791f6, + 0x8d764dd6, 0x4d43efb0, 0x54ccaa4d, 0xdfe49604, + 0xe39ed1b5, 0x1b4c6a88, 0xb8c12c1f, 0x7f466551, + 0x049d5eea, 0x5d018c35, 0x73fa8774, 0x2efb0b41, + 0x5ab3671d, 0x5292dbd2, 0x33e91056, 0x136dd647, + 0x8c9ad761, 0x7a37a10c, 0x8e59f814, 0x89eb133c, + 0xeecea927, 0x35b761c9, 0xede11ce5, 0x3c7a47b1, + 0x599cd2df, 0x3f55f273, 0x791814ce, 0xbf73c737, + 0xea53f7cd, 0x5b5ffdaa, 0x14df3d6f, 0x867844db, + 0x81caaff3, 0x3eb968c4, 0x2c382434, 0x5fc2a340, + 0x72161dc3, 0x0cbce225, 0x8b283c49, 0x41ff0d95, + 0x7139a801, 0xde080cb3, 0x9cd8b4e4, 0x906456c1, + 0x617bcb84, 0x70d532b6, 0x74486c5c, 0x42d0b857, +}; + +__device__ __constant__ u32 td2[256] = +{ + 0xa75051f4, 0x65537e41, 0xa4c31a17, 0x5e963a27, + 0x6bcb3bab, 0x45f11f9d, 0x58abacfa, 0x03934be3, + 0xfa552030, 0x6df6ad76, 0x769188cc, 0x4c25f502, + 0xd7fc4fe5, 0xcbd7c52a, 0x44802635, 0xa38fb562, + 0x5a49deb1, 0x1b6725ba, 0x0e9845ea, 0xc0e15dfe, + 0x7502c32f, 0xf012814c, 0x97a38d46, 0xf9c66bd3, + 0x5fe7038f, 0x9c951592, 0x7aebbf6d, 0x59da9552, + 0x832dd4be, 0x21d35874, 0x692949e0, 0xc8448ec9, + 0x896a75c2, 0x7978f48e, 0x3e6b9958, 0x71dd27b9, + 0x4fb6bee1, 0xad17f088, 0xac66c920, 0x3ab47dce, + 0x4a1863df, 0x3182e51a, 0x33609751, 0x7f456253, + 0x77e0b164, 0xae84bb6b, 0xa01cfe81, 0x2b94f908, + 0x68587048, 0xfd198f45, 0x6c8794de, 0xf8b7527b, + 0xd323ab73, 0x02e2724b, 0x8f57e31f, 0xab2a6655, + 0x2807b2eb, 0xc2032fb5, 0x7b9a86c5, 0x08a5d337, + 0x87f23028, 0xa5b223bf, 0x6aba0203, 0x825ced16, + 0x1c2b8acf, 0xb492a779, 0xf2f0f307, 0xe2a14e69, + 0xf4cd65da, 0xbed50605, 0x621fd134, 0xfe8ac4a6, + 0x539d342e, 0x55a0a2f3, 0xe132058a, 0xeb75a4f6, + 0xec390b83, 0xefaa4060, 0x9f065e71, 0x1051bd6e, + 0x8af93e21, 0x063d96dd, 0x05aedd3e, 0xbd464de6, + 0x8db59154, 0x5d0571c4, 0xd46f0406, 0x15ff6050, + 0xfb241998, 0xe997d6bd, 0x43cc8940, 0x9e7767d9, + 0x42bdb0e8, 0x8b880789, 0x5b38e719, 0xeedb79c8, + 0x0a47a17c, 0x0fe97c42, 0x1ec9f884, 0x00000000, + 0x86830980, 0xed48322b, 0x70ac1e11, 0x724e6c5a, + 0xfffbfd0e, 0x38560f85, 0xd51e3dae, 0x3927362d, + 0xd9640a0f, 0xa621685c, 0x54d19b5b, 0x2e3a2436, + 0x67b10c0a, 0xe70f9357, 0x96d2b4ee, 0x919e1b9b, + 0xc54f80c0, 0x20a261dc, 0x4b695a77, 0x1a161c12, + 0xba0ae293, 0x2ae5c0a0, 0xe0433c22, 0x171d121b, + 0x0d0b0e09, 0xc7adf28b, 0xa8b92db6, 0xa9c8141e, + 0x198557f1, 0x074caf75, 0xddbbee99, 0x60fda37f, + 0x269ff701, 0xf5bc5c72, 0x3bc54466, 0x7e345bfb, + 0x29768b43, 0xc6dccb23, 0xfc68b6ed, 0xf163b8e4, + 0xdccad731, 0x85104263, 0x22401397, 0x112084c6, + 0x247d854a, 0x3df8d2bb, 0x3211aef9, 0xa16dc729, + 0x2f4b1d9e, 0x30f3dcb2, 0x52ec0d86, 0xe3d077c1, + 0x166c2bb3, 0xb999a970, 0x48fa1194, 0x642247e9, + 0x8cc4a8fc, 0x3f1aa0f0, 0x2cd8567d, 0x90ef2233, + 0x4ec78749, 0xd1c1d938, 0xa2fe8cca, 0x0b3698d4, + 0x81cfa6f5, 0xde28a57a, 0x8e26dab7, 0xbfa43fad, + 0x9de42c3a, 0x920d5078, 0xcc9b6a5f, 0x4662547e, + 0x13c2f68d, 0xb8e890d8, 0xf75e2e39, 0xaff582c3, + 0x80be9f5d, 0x937c69d0, 0x2da96fd5, 0x12b3cf25, + 0x993bc8ac, 0x7da71018, 0x636ee89c, 0xbb7bdb3b, + 0x7809cd26, 0x18f46e59, 0xb701ec9a, 0x9aa8834f, + 0x6e65e695, 0xe67eaaff, 0xcf0821bc, 0xe8e6ef15, + 0x9bd9bae7, 0x36ce4a6f, 0x09d4ea9f, 0x7cd629b0, + 0xb2af31a4, 0x23312a3f, 0x9430c6a5, 0x66c035a2, + 0xbc37744e, 0xcaa6fc82, 0xd0b0e090, 0xd81533a7, + 0x984af104, 0xdaf741ec, 0x500e7fcd, 0xf62f1791, + 0xd68d764d, 0xb04d43ef, 0x4d54ccaa, 0x04dfe496, + 0xb5e39ed1, 0x881b4c6a, 0x1fb8c12c, 0x517f4665, + 0xea049d5e, 0x355d018c, 0x7473fa87, 0x412efb0b, + 0x1d5ab367, 0xd25292db, 0x5633e910, 0x47136dd6, + 0x618c9ad7, 0x0c7a37a1, 0x148e59f8, 0x3c89eb13, + 0x27eecea9, 0xc935b761, 0xe5ede11c, 0xb13c7a47, + 0xdf599cd2, 0x733f55f2, 0xce791814, 0x37bf73c7, + 0xcdea53f7, 0xaa5b5ffd, 0x6f14df3d, 0xdb867844, + 0xf381caaf, 0xc43eb968, 0x342c3824, 0x405fc2a3, + 0xc372161d, 0x250cbce2, 0x498b283c, 0x9541ff0d, + 0x017139a8, 0xb3de080c, 0xe49cd8b4, 0xc1906456, + 0x84617bcb, 0xb670d532, 0x5c74486c, 0x5742d0b8, +}; + +__device__ __constant__ u32 td3[256] = +{ + 0xf4a75051, 0x4165537e, 0x17a4c31a, 0x275e963a, + 0xab6bcb3b, 0x9d45f11f, 0xfa58abac, 0xe303934b, + 0x30fa5520, 0x766df6ad, 0xcc769188, 0x024c25f5, + 0xe5d7fc4f, 0x2acbd7c5, 0x35448026, 0x62a38fb5, + 0xb15a49de, 0xba1b6725, 0xea0e9845, 0xfec0e15d, + 0x2f7502c3, 0x4cf01281, 0x4697a38d, 0xd3f9c66b, + 0x8f5fe703, 0x929c9515, 0x6d7aebbf, 0x5259da95, + 0xbe832dd4, 0x7421d358, 0xe0692949, 0xc9c8448e, + 0xc2896a75, 0x8e7978f4, 0x583e6b99, 0xb971dd27, + 0xe14fb6be, 0x88ad17f0, 0x20ac66c9, 0xce3ab47d, + 0xdf4a1863, 0x1a3182e5, 0x51336097, 0x537f4562, + 0x6477e0b1, 0x6bae84bb, 0x81a01cfe, 0x082b94f9, + 0x48685870, 0x45fd198f, 0xde6c8794, 0x7bf8b752, + 0x73d323ab, 0x4b02e272, 0x1f8f57e3, 0x55ab2a66, + 0xeb2807b2, 0xb5c2032f, 0xc57b9a86, 0x3708a5d3, + 0x2887f230, 0xbfa5b223, 0x036aba02, 0x16825ced, + 0xcf1c2b8a, 0x79b492a7, 0x07f2f0f3, 0x69e2a14e, + 0xdaf4cd65, 0x05bed506, 0x34621fd1, 0xa6fe8ac4, + 0x2e539d34, 0xf355a0a2, 0x8ae13205, 0xf6eb75a4, + 0x83ec390b, 0x60efaa40, 0x719f065e, 0x6e1051bd, + 0x218af93e, 0xdd063d96, 0x3e05aedd, 0xe6bd464d, + 0x548db591, 0xc45d0571, 0x06d46f04, 0x5015ff60, + 0x98fb2419, 0xbde997d6, 0x4043cc89, 0xd99e7767, + 0xe842bdb0, 0x898b8807, 0x195b38e7, 0xc8eedb79, + 0x7c0a47a1, 0x420fe97c, 0x841ec9f8, 0x00000000, + 0x80868309, 0x2bed4832, 0x1170ac1e, 0x5a724e6c, + 0x0efffbfd, 0x8538560f, 0xaed51e3d, 0x2d392736, + 0x0fd9640a, 0x5ca62168, 0x5b54d19b, 0x362e3a24, + 0x0a67b10c, 0x57e70f93, 0xee96d2b4, 0x9b919e1b, + 0xc0c54f80, 0xdc20a261, 0x774b695a, 0x121a161c, + 0x93ba0ae2, 0xa02ae5c0, 0x22e0433c, 0x1b171d12, + 0x090d0b0e, 0x8bc7adf2, 0xb6a8b92d, 0x1ea9c814, + 0xf1198557, 0x75074caf, 0x99ddbbee, 0x7f60fda3, + 0x01269ff7, 0x72f5bc5c, 0x663bc544, 0xfb7e345b, + 0x4329768b, 0x23c6dccb, 0xedfc68b6, 0xe4f163b8, + 0x31dccad7, 0x63851042, 0x97224013, 0xc6112084, + 0x4a247d85, 0xbb3df8d2, 0xf93211ae, 0x29a16dc7, + 0x9e2f4b1d, 0xb230f3dc, 0x8652ec0d, 0xc1e3d077, + 0xb3166c2b, 0x70b999a9, 0x9448fa11, 0xe9642247, + 0xfc8cc4a8, 0xf03f1aa0, 0x7d2cd856, 0x3390ef22, + 0x494ec787, 0x38d1c1d9, 0xcaa2fe8c, 0xd40b3698, + 0xf581cfa6, 0x7ade28a5, 0xb78e26da, 0xadbfa43f, + 0x3a9de42c, 0x78920d50, 0x5fcc9b6a, 0x7e466254, + 0x8d13c2f6, 0xd8b8e890, 0x39f75e2e, 0xc3aff582, + 0x5d80be9f, 0xd0937c69, 0xd52da96f, 0x2512b3cf, + 0xac993bc8, 0x187da710, 0x9c636ee8, 0x3bbb7bdb, + 0x267809cd, 0x5918f46e, 0x9ab701ec, 0x4f9aa883, + 0x956e65e6, 0xffe67eaa, 0xbccf0821, 0x15e8e6ef, + 0xe79bd9ba, 0x6f36ce4a, 0x9f09d4ea, 0xb07cd629, + 0xa4b2af31, 0x3f23312a, 0xa59430c6, 0xa266c035, + 0x4ebc3774, 0x82caa6fc, 0x90d0b0e0, 0xa7d81533, + 0x04984af1, 0xecdaf741, 0xcd500e7f, 0x91f62f17, + 0x4dd68d76, 0xefb04d43, 0xaa4d54cc, 0x9604dfe4, + 0xd1b5e39e, 0x6a881b4c, 0x2c1fb8c1, 0x65517f46, + 0x5eea049d, 0x8c355d01, 0x877473fa, 0x0b412efb, + 0x671d5ab3, 0xdbd25292, 0x105633e9, 0xd647136d, + 0xd7618c9a, 0xa10c7a37, 0xf8148e59, 0x133c89eb, + 0xa927eece, 0x61c935b7, 0x1ce5ede1, 0x47b13c7a, + 0xd2df599c, 0xf2733f55, 0x14ce7918, 0xc737bf73, + 0xf7cdea53, 0xfdaa5b5f, 0x3d6f14df, 0x44db8678, + 0xaff381ca, 0x68c43eb9, 0x24342c38, 0xa3405fc2, + 0x1dc37216, 0xe2250cbc, 0x3c498b28, 0x0d9541ff, + 0xa8017139, 0x0cb3de08, 0xb4e49cd8, 0x56c19064, + 0xcb84617b, 0x32b670d5, 0x6c5c7448, 0xb85742d0, +}; + +__device__ __constant__ u32 td4[256] = +{ + 0x52525252, 0x09090909, 0x6a6a6a6a, 0xd5d5d5d5, + 0x30303030, 0x36363636, 0xa5a5a5a5, 0x38383838, + 0xbfbfbfbf, 0x40404040, 0xa3a3a3a3, 0x9e9e9e9e, + 0x81818181, 0xf3f3f3f3, 0xd7d7d7d7, 0xfbfbfbfb, + 0x7c7c7c7c, 0xe3e3e3e3, 0x39393939, 0x82828282, + 0x9b9b9b9b, 0x2f2f2f2f, 0xffffffff, 0x87878787, + 0x34343434, 0x8e8e8e8e, 0x43434343, 0x44444444, + 0xc4c4c4c4, 0xdededede, 0xe9e9e9e9, 0xcbcbcbcb, + 0x54545454, 0x7b7b7b7b, 0x94949494, 0x32323232, + 0xa6a6a6a6, 0xc2c2c2c2, 0x23232323, 0x3d3d3d3d, + 0xeeeeeeee, 0x4c4c4c4c, 0x95959595, 0x0b0b0b0b, + 0x42424242, 0xfafafafa, 0xc3c3c3c3, 0x4e4e4e4e, + 0x08080808, 0x2e2e2e2e, 0xa1a1a1a1, 0x66666666, + 0x28282828, 0xd9d9d9d9, 0x24242424, 0xb2b2b2b2, + 0x76767676, 0x5b5b5b5b, 0xa2a2a2a2, 0x49494949, + 0x6d6d6d6d, 0x8b8b8b8b, 0xd1d1d1d1, 0x25252525, + 0x72727272, 0xf8f8f8f8, 0xf6f6f6f6, 0x64646464, + 0x86868686, 0x68686868, 0x98989898, 0x16161616, + 0xd4d4d4d4, 0xa4a4a4a4, 0x5c5c5c5c, 0xcccccccc, + 0x5d5d5d5d, 0x65656565, 0xb6b6b6b6, 0x92929292, + 0x6c6c6c6c, 0x70707070, 0x48484848, 0x50505050, + 0xfdfdfdfd, 0xedededed, 0xb9b9b9b9, 0xdadadada, + 0x5e5e5e5e, 0x15151515, 0x46464646, 0x57575757, + 0xa7a7a7a7, 0x8d8d8d8d, 0x9d9d9d9d, 0x84848484, + 0x90909090, 0xd8d8d8d8, 0xabababab, 0x00000000, + 0x8c8c8c8c, 0xbcbcbcbc, 0xd3d3d3d3, 0x0a0a0a0a, + 0xf7f7f7f7, 0xe4e4e4e4, 0x58585858, 0x05050505, + 0xb8b8b8b8, 0xb3b3b3b3, 0x45454545, 0x06060606, + 0xd0d0d0d0, 0x2c2c2c2c, 0x1e1e1e1e, 0x8f8f8f8f, + 0xcacacaca, 0x3f3f3f3f, 0x0f0f0f0f, 0x02020202, + 0xc1c1c1c1, 0xafafafaf, 0xbdbdbdbd, 0x03030303, + 0x01010101, 0x13131313, 0x8a8a8a8a, 0x6b6b6b6b, + 0x3a3a3a3a, 0x91919191, 0x11111111, 0x41414141, + 0x4f4f4f4f, 0x67676767, 0xdcdcdcdc, 0xeaeaeaea, + 0x97979797, 0xf2f2f2f2, 0xcfcfcfcf, 0xcececece, + 0xf0f0f0f0, 0xb4b4b4b4, 0xe6e6e6e6, 0x73737373, + 0x96969696, 0xacacacac, 0x74747474, 0x22222222, + 0xe7e7e7e7, 0xadadadad, 0x35353535, 0x85858585, + 0xe2e2e2e2, 0xf9f9f9f9, 0x37373737, 0xe8e8e8e8, + 0x1c1c1c1c, 0x75757575, 0xdfdfdfdf, 0x6e6e6e6e, + 0x47474747, 0xf1f1f1f1, 0x1a1a1a1a, 0x71717171, + 0x1d1d1d1d, 0x29292929, 0xc5c5c5c5, 0x89898989, + 0x6f6f6f6f, 0xb7b7b7b7, 0x62626262, 0x0e0e0e0e, + 0xaaaaaaaa, 0x18181818, 0xbebebebe, 0x1b1b1b1b, + 0xfcfcfcfc, 0x56565656, 0x3e3e3e3e, 0x4b4b4b4b, + 0xc6c6c6c6, 0xd2d2d2d2, 0x79797979, 0x20202020, + 0x9a9a9a9a, 0xdbdbdbdb, 0xc0c0c0c0, 0xfefefefe, + 0x78787878, 0xcdcdcdcd, 0x5a5a5a5a, 0xf4f4f4f4, + 0x1f1f1f1f, 0xdddddddd, 0xa8a8a8a8, 0x33333333, + 0x88888888, 0x07070707, 0xc7c7c7c7, 0x31313131, + 0xb1b1b1b1, 0x12121212, 0x10101010, 0x59595959, + 0x27272727, 0x80808080, 0xecececec, 0x5f5f5f5f, + 0x60606060, 0x51515151, 0x7f7f7f7f, 0xa9a9a9a9, + 0x19191919, 0xb5b5b5b5, 0x4a4a4a4a, 0x0d0d0d0d, + 0x2d2d2d2d, 0xe5e5e5e5, 0x7a7a7a7a, 0x9f9f9f9f, + 0x93939393, 0xc9c9c9c9, 0x9c9c9c9c, 0xefefefef, + 0xa0a0a0a0, 0xe0e0e0e0, 0x3b3b3b3b, 0x4d4d4d4d, + 0xaeaeaeae, 0x2a2a2a2a, 0xf5f5f5f5, 0xb0b0b0b0, + 0xc8c8c8c8, 0xebebebeb, 0xbbbbbbbb, 0x3c3c3c3c, + 0x83838383, 0x53535353, 0x99999999, 0x61616161, + 0x17171717, 0x2b2b2b2b, 0x04040404, 0x7e7e7e7e, + 0xbabababa, 0x77777777, 0xd6d6d6d6, 0x26262626, + 0xe1e1e1e1, 0x69696969, 0x14141414, 0x63636363, + 0x55555555, 0x21212121, 0x0c0c0c0c, 0x7d7d7d7d, +}; + +__device__ __constant__ u32 rcon[] = +{ + 0x01000000, 0x02000000, 0x04000000, 0x08000000, + 0x10000000, 0x20000000, 0x40000000, 0x80000000, + 0x1b000000, 0x36000000, +}; + +__device__ static void AES256_ExpandKey (u32 *userkey, u32 *rek, u32 s_te0[256], u32 s_te1[256], u32 s_te2[256], u32 s_te3[256], u32 s_te4[256]) +{ + rek[0] = userkey[0]; + rek[1] = userkey[1]; + rek[2] = userkey[2]; + rek[3] = userkey[3]; + rek[4] = userkey[4]; + rek[5] = userkey[5]; + rek[6] = userkey[6]; + rek[7] = userkey[7]; + + int i; + int j; + + i = 0; + j = 0; + + u32 run = 1; + + while (run) + { + u32 temp = rek[j + 7]; + + rek[j + 8] = rek[j + 0] + ^ (s_te2[(temp >> 16) & 0xff] & 0xff000000) + ^ (s_te3[(temp >> 8) & 0xff] & 0x00ff0000) + ^ (s_te0[(temp >> 0) & 0xff] & 0x0000ff00) + ^ (s_te1[(temp >> 24) & 0xff] & 0x000000ff) + ^ rcon[i]; + + rek[j + 9] = rek[j + 1] ^ rek[j + 8]; + rek[j + 10] = rek[j + 2] ^ rek[j + 9]; + rek[j + 11] = rek[j + 3] ^ rek[j + 10]; + + if (++i == 7) + { + run = 0; + continue; + } + + temp = rek[j + 11]; + + rek[j + 12] = rek[j + 4] + ^ (s_te2[(temp >> 24) & 0xff] & 0xff000000) + ^ (s_te3[(temp >> 16) & 0xff] & 0x00ff0000) + ^ (s_te0[(temp >> 8) & 0xff] & 0x0000ff00) + ^ (s_te1[(temp >> 0) & 0xff] & 0x000000ff); + + rek[j + 13] = rek[j + 5] ^ rek[j + 12]; + rek[j + 14] = rek[j + 6] ^ rek[j + 13]; + rek[j + 15] = rek[j + 7] ^ rek[j + 14]; + + j += 8; + } +} + +__device__ static void AES256_InvertKey (u32 *rdk, u32 s_td0[256], u32 s_td1[256], u32 s_td2[256], u32 s_td3[256], u32 s_td4[256], u32 s_te0[256], u32 s_te1[256], u32 s_te2[256], u32 s_te3[256], u32 s_te4[256]) +{ + for (u32 i = 0, j = 56; i < j; i += 4, j -= 4) + { + u32 temp; + + temp = rdk[i + 0]; rdk[i + 0] = rdk[j + 0]; rdk[j + 0] = temp; + temp = rdk[i + 1]; rdk[i + 1] = rdk[j + 1]; rdk[j + 1] = temp; + temp = rdk[i + 2]; rdk[i + 2] = rdk[j + 2]; rdk[j + 2] = temp; + temp = rdk[i + 3]; rdk[i + 3] = rdk[j + 3]; rdk[j + 3] = temp; + } + + for (u32 i = 1, j = 4; i < 14; i += 1, j += 4) + { + rdk[j + 0] = + s_td0[s_te1[(rdk[j + 0] >> 24) & 0xff] & 0xff] ^ + s_td1[s_te1[(rdk[j + 0] >> 16) & 0xff] & 0xff] ^ + s_td2[s_te1[(rdk[j + 0] >> 8) & 0xff] & 0xff] ^ + s_td3[s_te1[(rdk[j + 0] >> 0) & 0xff] & 0xff]; + + rdk[j + 1] = + s_td0[s_te1[(rdk[j + 1] >> 24) & 0xff] & 0xff] ^ + s_td1[s_te1[(rdk[j + 1] >> 16) & 0xff] & 0xff] ^ + s_td2[s_te1[(rdk[j + 1] >> 8) & 0xff] & 0xff] ^ + s_td3[s_te1[(rdk[j + 1] >> 0) & 0xff] & 0xff]; + + rdk[j + 2] = + s_td0[s_te1[(rdk[j + 2] >> 24) & 0xff] & 0xff] ^ + s_td1[s_te1[(rdk[j + 2] >> 16) & 0xff] & 0xff] ^ + s_td2[s_te1[(rdk[j + 2] >> 8) & 0xff] & 0xff] ^ + s_td3[s_te1[(rdk[j + 2] >> 0) & 0xff] & 0xff]; + + rdk[j + 3] = + s_td0[s_te1[(rdk[j + 3] >> 24) & 0xff] & 0xff] ^ + s_td1[s_te1[(rdk[j + 3] >> 16) & 0xff] & 0xff] ^ + s_td2[s_te1[(rdk[j + 3] >> 8) & 0xff] & 0xff] ^ + s_td3[s_te1[(rdk[j + 3] >> 0) & 0xff] & 0xff]; + } +} + +__device__ static void AES256_decrypt (const u32 *in, u32 *out, const u32 *rdk, u32 s_td0[256], u32 s_td1[256], u32 s_td2[256], u32 s_td3[256], u32 s_td4[256]) +{ + u32 s0 = in[0] ^ rdk[0]; + u32 s1 = in[1] ^ rdk[1]; + u32 s2 = in[2] ^ rdk[2]; + u32 s3 = in[3] ^ rdk[3]; + + u32 t0; + u32 t1; + u32 t2; + u32 t3; + + t0 = s_td0[s0 >> 24] ^ s_td1[(s3 >> 16) & 0xff] ^ s_td2[(s2 >> 8) & 0xff] ^ s_td3[s1 & 0xff] ^ rdk[ 4]; + t1 = s_td0[s1 >> 24] ^ s_td1[(s0 >> 16) & 0xff] ^ s_td2[(s3 >> 8) & 0xff] ^ s_td3[s2 & 0xff] ^ rdk[ 5]; + t2 = s_td0[s2 >> 24] ^ s_td1[(s1 >> 16) & 0xff] ^ s_td2[(s0 >> 8) & 0xff] ^ s_td3[s3 & 0xff] ^ rdk[ 6]; + t3 = s_td0[s3 >> 24] ^ s_td1[(s2 >> 16) & 0xff] ^ s_td2[(s1 >> 8) & 0xff] ^ s_td3[s0 & 0xff] ^ rdk[ 7]; + s0 = s_td0[t0 >> 24] ^ s_td1[(t3 >> 16) & 0xff] ^ s_td2[(t2 >> 8) & 0xff] ^ s_td3[t1 & 0xff] ^ rdk[ 8]; + s1 = s_td0[t1 >> 24] ^ s_td1[(t0 >> 16) & 0xff] ^ s_td2[(t3 >> 8) & 0xff] ^ s_td3[t2 & 0xff] ^ rdk[ 9]; + s2 = s_td0[t2 >> 24] ^ s_td1[(t1 >> 16) & 0xff] ^ s_td2[(t0 >> 8) & 0xff] ^ s_td3[t3 & 0xff] ^ rdk[10]; + s3 = s_td0[t3 >> 24] ^ s_td1[(t2 >> 16) & 0xff] ^ s_td2[(t1 >> 8) & 0xff] ^ s_td3[t0 & 0xff] ^ rdk[11]; + t0 = s_td0[s0 >> 24] ^ s_td1[(s3 >> 16) & 0xff] ^ s_td2[(s2 >> 8) & 0xff] ^ s_td3[s1 & 0xff] ^ rdk[12]; + t1 = s_td0[s1 >> 24] ^ s_td1[(s0 >> 16) & 0xff] ^ s_td2[(s3 >> 8) & 0xff] ^ s_td3[s2 & 0xff] ^ rdk[13]; + t2 = s_td0[s2 >> 24] ^ s_td1[(s1 >> 16) & 0xff] ^ s_td2[(s0 >> 8) & 0xff] ^ s_td3[s3 & 0xff] ^ rdk[14]; + t3 = s_td0[s3 >> 24] ^ s_td1[(s2 >> 16) & 0xff] ^ s_td2[(s1 >> 8) & 0xff] ^ s_td3[s0 & 0xff] ^ rdk[15]; + s0 = s_td0[t0 >> 24] ^ s_td1[(t3 >> 16) & 0xff] ^ s_td2[(t2 >> 8) & 0xff] ^ s_td3[t1 & 0xff] ^ rdk[16]; + s1 = s_td0[t1 >> 24] ^ s_td1[(t0 >> 16) & 0xff] ^ s_td2[(t3 >> 8) & 0xff] ^ s_td3[t2 & 0xff] ^ rdk[17]; + s2 = s_td0[t2 >> 24] ^ s_td1[(t1 >> 16) & 0xff] ^ s_td2[(t0 >> 8) & 0xff] ^ s_td3[t3 & 0xff] ^ rdk[18]; + s3 = s_td0[t3 >> 24] ^ s_td1[(t2 >> 16) & 0xff] ^ s_td2[(t1 >> 8) & 0xff] ^ s_td3[t0 & 0xff] ^ rdk[19]; + t0 = s_td0[s0 >> 24] ^ s_td1[(s3 >> 16) & 0xff] ^ s_td2[(s2 >> 8) & 0xff] ^ s_td3[s1 & 0xff] ^ rdk[20]; + t1 = s_td0[s1 >> 24] ^ s_td1[(s0 >> 16) & 0xff] ^ s_td2[(s3 >> 8) & 0xff] ^ s_td3[s2 & 0xff] ^ rdk[21]; + t2 = s_td0[s2 >> 24] ^ s_td1[(s1 >> 16) & 0xff] ^ s_td2[(s0 >> 8) & 0xff] ^ s_td3[s3 & 0xff] ^ rdk[22]; + t3 = s_td0[s3 >> 24] ^ s_td1[(s2 >> 16) & 0xff] ^ s_td2[(s1 >> 8) & 0xff] ^ s_td3[s0 & 0xff] ^ rdk[23]; + s0 = s_td0[t0 >> 24] ^ s_td1[(t3 >> 16) & 0xff] ^ s_td2[(t2 >> 8) & 0xff] ^ s_td3[t1 & 0xff] ^ rdk[24]; + s1 = s_td0[t1 >> 24] ^ s_td1[(t0 >> 16) & 0xff] ^ s_td2[(t3 >> 8) & 0xff] ^ s_td3[t2 & 0xff] ^ rdk[25]; + s2 = s_td0[t2 >> 24] ^ s_td1[(t1 >> 16) & 0xff] ^ s_td2[(t0 >> 8) & 0xff] ^ s_td3[t3 & 0xff] ^ rdk[26]; + s3 = s_td0[t3 >> 24] ^ s_td1[(t2 >> 16) & 0xff] ^ s_td2[(t1 >> 8) & 0xff] ^ s_td3[t0 & 0xff] ^ rdk[27]; + t0 = s_td0[s0 >> 24] ^ s_td1[(s3 >> 16) & 0xff] ^ s_td2[(s2 >> 8) & 0xff] ^ s_td3[s1 & 0xff] ^ rdk[28]; + t1 = s_td0[s1 >> 24] ^ s_td1[(s0 >> 16) & 0xff] ^ s_td2[(s3 >> 8) & 0xff] ^ s_td3[s2 & 0xff] ^ rdk[29]; + t2 = s_td0[s2 >> 24] ^ s_td1[(s1 >> 16) & 0xff] ^ s_td2[(s0 >> 8) & 0xff] ^ s_td3[s3 & 0xff] ^ rdk[30]; + t3 = s_td0[s3 >> 24] ^ s_td1[(s2 >> 16) & 0xff] ^ s_td2[(s1 >> 8) & 0xff] ^ s_td3[s0 & 0xff] ^ rdk[31]; + s0 = s_td0[t0 >> 24] ^ s_td1[(t3 >> 16) & 0xff] ^ s_td2[(t2 >> 8) & 0xff] ^ s_td3[t1 & 0xff] ^ rdk[32]; + s1 = s_td0[t1 >> 24] ^ s_td1[(t0 >> 16) & 0xff] ^ s_td2[(t3 >> 8) & 0xff] ^ s_td3[t2 & 0xff] ^ rdk[33]; + s2 = s_td0[t2 >> 24] ^ s_td1[(t1 >> 16) & 0xff] ^ s_td2[(t0 >> 8) & 0xff] ^ s_td3[t3 & 0xff] ^ rdk[34]; + s3 = s_td0[t3 >> 24] ^ s_td1[(t2 >> 16) & 0xff] ^ s_td2[(t1 >> 8) & 0xff] ^ s_td3[t0 & 0xff] ^ rdk[35]; + t0 = s_td0[s0 >> 24] ^ s_td1[(s3 >> 16) & 0xff] ^ s_td2[(s2 >> 8) & 0xff] ^ s_td3[s1 & 0xff] ^ rdk[36]; + t1 = s_td0[s1 >> 24] ^ s_td1[(s0 >> 16) & 0xff] ^ s_td2[(s3 >> 8) & 0xff] ^ s_td3[s2 & 0xff] ^ rdk[37]; + t2 = s_td0[s2 >> 24] ^ s_td1[(s1 >> 16) & 0xff] ^ s_td2[(s0 >> 8) & 0xff] ^ s_td3[s3 & 0xff] ^ rdk[38]; + t3 = s_td0[s3 >> 24] ^ s_td1[(s2 >> 16) & 0xff] ^ s_td2[(s1 >> 8) & 0xff] ^ s_td3[s0 & 0xff] ^ rdk[39]; + s0 = s_td0[t0 >> 24] ^ s_td1[(t3 >> 16) & 0xff] ^ s_td2[(t2 >> 8) & 0xff] ^ s_td3[t1 & 0xff] ^ rdk[40]; + s1 = s_td0[t1 >> 24] ^ s_td1[(t0 >> 16) & 0xff] ^ s_td2[(t3 >> 8) & 0xff] ^ s_td3[t2 & 0xff] ^ rdk[41]; + s2 = s_td0[t2 >> 24] ^ s_td1[(t1 >> 16) & 0xff] ^ s_td2[(t0 >> 8) & 0xff] ^ s_td3[t3 & 0xff] ^ rdk[42]; + s3 = s_td0[t3 >> 24] ^ s_td1[(t2 >> 16) & 0xff] ^ s_td2[(t1 >> 8) & 0xff] ^ s_td3[t0 & 0xff] ^ rdk[43]; + t0 = s_td0[s0 >> 24] ^ s_td1[(s3 >> 16) & 0xff] ^ s_td2[(s2 >> 8) & 0xff] ^ s_td3[s1 & 0xff] ^ rdk[44]; + t1 = s_td0[s1 >> 24] ^ s_td1[(s0 >> 16) & 0xff] ^ s_td2[(s3 >> 8) & 0xff] ^ s_td3[s2 & 0xff] ^ rdk[45]; + t2 = s_td0[s2 >> 24] ^ s_td1[(s1 >> 16) & 0xff] ^ s_td2[(s0 >> 8) & 0xff] ^ s_td3[s3 & 0xff] ^ rdk[46]; + t3 = s_td0[s3 >> 24] ^ s_td1[(s2 >> 16) & 0xff] ^ s_td2[(s1 >> 8) & 0xff] ^ s_td3[s0 & 0xff] ^ rdk[47]; + s0 = s_td0[t0 >> 24] ^ s_td1[(t3 >> 16) & 0xff] ^ s_td2[(t2 >> 8) & 0xff] ^ s_td3[t1 & 0xff] ^ rdk[48]; + s1 = s_td0[t1 >> 24] ^ s_td1[(t0 >> 16) & 0xff] ^ s_td2[(t3 >> 8) & 0xff] ^ s_td3[t2 & 0xff] ^ rdk[49]; + s2 = s_td0[t2 >> 24] ^ s_td1[(t1 >> 16) & 0xff] ^ s_td2[(t0 >> 8) & 0xff] ^ s_td3[t3 & 0xff] ^ rdk[50]; + s3 = s_td0[t3 >> 24] ^ s_td1[(t2 >> 16) & 0xff] ^ s_td2[(t1 >> 8) & 0xff] ^ s_td3[t0 & 0xff] ^ rdk[51]; + t0 = s_td0[s0 >> 24] ^ s_td1[(s3 >> 16) & 0xff] ^ s_td2[(s2 >> 8) & 0xff] ^ s_td3[s1 & 0xff] ^ rdk[52]; + t1 = s_td0[s1 >> 24] ^ s_td1[(s0 >> 16) & 0xff] ^ s_td2[(s3 >> 8) & 0xff] ^ s_td3[s2 & 0xff] ^ rdk[53]; + t2 = s_td0[s2 >> 24] ^ s_td1[(s1 >> 16) & 0xff] ^ s_td2[(s0 >> 8) & 0xff] ^ s_td3[s3 & 0xff] ^ rdk[54]; + t3 = s_td0[s3 >> 24] ^ s_td1[(s2 >> 16) & 0xff] ^ s_td2[(s1 >> 8) & 0xff] ^ s_td3[s0 & 0xff] ^ rdk[55]; + + out[0] = (s_td4[(t0 >> 24) & 0xff] & 0xff000000) + ^ (s_td4[(t3 >> 16) & 0xff] & 0x00ff0000) + ^ (s_td4[(t2 >> 8) & 0xff] & 0x0000ff00) + ^ (s_td4[(t1 >> 0) & 0xff] & 0x000000ff) + ^ rdk[56]; + + out[1] = (s_td4[(t1 >> 24) & 0xff] & 0xff000000) + ^ (s_td4[(t0 >> 16) & 0xff] & 0x00ff0000) + ^ (s_td4[(t3 >> 8) & 0xff] & 0x0000ff00) + ^ (s_td4[(t2 >> 0) & 0xff] & 0x000000ff) + ^ rdk[57]; + + out[2] = (s_td4[(t2 >> 24) & 0xff] & 0xff000000) + ^ (s_td4[(t1 >> 16) & 0xff] & 0x00ff0000) + ^ (s_td4[(t0 >> 8) & 0xff] & 0x0000ff00) + ^ (s_td4[(t3 >> 0) & 0xff] & 0x000000ff) + ^ rdk[58]; + + out[3] = (s_td4[(t3 >> 24) & 0xff] & 0xff000000) + ^ (s_td4[(t2 >> 16) & 0xff] & 0x00ff0000) + ^ (s_td4[(t1 >> 8) & 0xff] & 0x0000ff00) + ^ (s_td4[(t0 >> 0) & 0xff] & 0x000000ff) + ^ rdk[59]; +} + +__device__ __constant__ u32 k_sha256[64] = +{ + SHA256C00, SHA256C01, SHA256C02, SHA256C03, + SHA256C04, SHA256C05, SHA256C06, SHA256C07, + SHA256C08, SHA256C09, SHA256C0a, SHA256C0b, + SHA256C0c, SHA256C0d, SHA256C0e, SHA256C0f, + SHA256C10, SHA256C11, SHA256C12, SHA256C13, + SHA256C14, SHA256C15, SHA256C16, SHA256C17, + SHA256C18, SHA256C19, SHA256C1a, SHA256C1b, + SHA256C1c, SHA256C1d, SHA256C1e, SHA256C1f, + SHA256C20, SHA256C21, SHA256C22, SHA256C23, + SHA256C24, SHA256C25, SHA256C26, SHA256C27, + SHA256C28, SHA256C29, SHA256C2a, SHA256C2b, + SHA256C2c, SHA256C2d, SHA256C2e, SHA256C2f, + SHA256C30, SHA256C31, SHA256C32, SHA256C33, + SHA256C34, SHA256C35, SHA256C36, SHA256C37, + SHA256C38, SHA256C39, SHA256C3a, SHA256C3b, + SHA256C3c, SHA256C3d, SHA256C3e, SHA256C3f, +}; + +__device__ static void sha256_transform (const u32x w[16], u32x digest[8]) +{ + u32x a = digest[0]; + u32x b = digest[1]; + u32x c = digest[2]; + u32x d = digest[3]; + u32x e = digest[4]; + u32x f = digest[5]; + u32x g = digest[6]; + u32x h = digest[7]; + + u32x w0_t = swap_workaround (w[ 0]); + u32x w1_t = swap_workaround (w[ 1]); + u32x w2_t = swap_workaround (w[ 2]); + u32x w3_t = swap_workaround (w[ 3]); + u32x w4_t = swap_workaround (w[ 4]); + u32x w5_t = swap_workaround (w[ 5]); + u32x w6_t = swap_workaround (w[ 6]); + u32x w7_t = swap_workaround (w[ 7]); + u32x w8_t = swap_workaround (w[ 8]); + u32x w9_t = swap_workaround (w[ 9]); + u32x wa_t = swap_workaround (w[10]); + u32x wb_t = swap_workaround (w[11]); + u32x wc_t = swap_workaround (w[12]); + u32x wd_t = swap_workaround (w[13]); + u32x we_t = swap_workaround (w[14]); + u32x wf_t = swap_workaround (w[15]); + + #define ROUND_EXPAND() \ + { \ + w0_t = SHA256_EXPAND (we_t, w9_t, w1_t, w0_t); \ + w1_t = SHA256_EXPAND (wf_t, wa_t, w2_t, w1_t); \ + w2_t = SHA256_EXPAND (w0_t, wb_t, w3_t, w2_t); \ + w3_t = SHA256_EXPAND (w1_t, wc_t, w4_t, w3_t); \ + w4_t = SHA256_EXPAND (w2_t, wd_t, w5_t, w4_t); \ + w5_t = SHA256_EXPAND (w3_t, we_t, w6_t, w5_t); \ + w6_t = SHA256_EXPAND (w4_t, wf_t, w7_t, w6_t); \ + w7_t = SHA256_EXPAND (w5_t, w0_t, w8_t, w7_t); \ + w8_t = SHA256_EXPAND (w6_t, w1_t, w9_t, w8_t); \ + w9_t = SHA256_EXPAND (w7_t, w2_t, wa_t, w9_t); \ + wa_t = SHA256_EXPAND (w8_t, w3_t, wb_t, wa_t); \ + wb_t = SHA256_EXPAND (w9_t, w4_t, wc_t, wb_t); \ + wc_t = SHA256_EXPAND (wa_t, w5_t, wd_t, wc_t); \ + wd_t = SHA256_EXPAND (wb_t, w6_t, we_t, wd_t); \ + we_t = SHA256_EXPAND (wc_t, w7_t, wf_t, we_t); \ + wf_t = SHA256_EXPAND (wd_t, w8_t, w0_t, wf_t); \ + } + + #define ROUND_STEP(i) \ + { \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, k_sha256[i + 0]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, k_sha256[i + 1]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, k_sha256[i + 2]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, k_sha256[i + 3]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, k_sha256[i + 4]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, k_sha256[i + 5]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, k_sha256[i + 6]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, k_sha256[i + 7]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, k_sha256[i + 8]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, k_sha256[i + 9]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, k_sha256[i + 10]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, k_sha256[i + 11]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, k_sha256[i + 12]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, k_sha256[i + 13]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, k_sha256[i + 14]); \ + SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, k_sha256[i + 15]); \ + } + + ROUND_STEP (0); + + for (int i = 16; i < 64; i += 16) + { + ROUND_EXPAND (); ROUND_STEP (i); + } + + digest[0] += a; + digest[1] += b; + digest[2] += c; + digest[3] += d; + digest[4] += e; + digest[5] += f; + digest[6] += g; + digest[7] += h; +} + +__device__ const u32 crc32tab[0x100] = +{ + 0x00000000, 0x77073096, 0xee0e612c, 0x990951ba, + 0x076dc419, 0x706af48f, 0xe963a535, 0x9e6495a3, + 0x0edb8832, 0x79dcb8a4, 0xe0d5e91e, 0x97d2d988, + 0x09b64c2b, 0x7eb17cbd, 0xe7b82d07, 0x90bf1d91, + 0x1db71064, 0x6ab020f2, 0xf3b97148, 0x84be41de, + 0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7, + 0x136c9856, 0x646ba8c0, 0xfd62f97a, 0x8a65c9ec, + 0x14015c4f, 0x63066cd9, 0xfa0f3d63, 0x8d080df5, + 0x3b6e20c8, 0x4c69105e, 0xd56041e4, 0xa2677172, + 0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b, + 0x35b5a8fa, 0x42b2986c, 0xdbbbc9d6, 0xacbcf940, + 0x32d86ce3, 0x45df5c75, 0xdcd60dcf, 0xabd13d59, + 0x26d930ac, 0x51de003a, 0xc8d75180, 0xbfd06116, + 0x21b4f4b5, 0x56b3c423, 0xcfba9599, 0xb8bda50f, + 0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924, + 0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d, + 0x76dc4190, 0x01db7106, 0x98d220bc, 0xefd5102a, + 0x71b18589, 0x06b6b51f, 0x9fbfe4a5, 0xe8b8d433, + 0x7807c9a2, 0x0f00f934, 0x9609a88e, 0xe10e9818, + 0x7f6a0dbb, 0x086d3d2d, 0x91646c97, 0xe6635c01, + 0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e, + 0x6c0695ed, 0x1b01a57b, 0x8208f4c1, 0xf50fc457, + 0x65b0d9c6, 0x12b7e950, 0x8bbeb8ea, 0xfcb9887c, + 0x62dd1ddf, 0x15da2d49, 0x8cd37cf3, 0xfbd44c65, + 0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2, + 0x4adfa541, 0x3dd895d7, 0xa4d1c46d, 0xd3d6f4fb, + 0x4369e96a, 0x346ed9fc, 0xad678846, 0xda60b8d0, + 0x44042d73, 0x33031de5, 0xaa0a4c5f, 0xdd0d7cc9, + 0x5005713c, 0x270241aa, 0xbe0b1010, 0xc90c2086, + 0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f, + 0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4, + 0x59b33d17, 0x2eb40d81, 0xb7bd5c3b, 0xc0ba6cad, + 0xedb88320, 0x9abfb3b6, 0x03b6e20c, 0x74b1d29a, + 0xead54739, 0x9dd277af, 0x04db2615, 0x73dc1683, + 0xe3630b12, 0x94643b84, 0x0d6d6a3e, 0x7a6a5aa8, + 0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1, + 0xf00f9344, 0x8708a3d2, 0x1e01f268, 0x6906c2fe, + 0xf762575d, 0x806567cb, 0x196c3671, 0x6e6b06e7, + 0xfed41b76, 0x89d32be0, 0x10da7a5a, 0x67dd4acc, + 0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5, + 0xd6d6a3e8, 0xa1d1937e, 0x38d8c2c4, 0x4fdff252, + 0xd1bb67f1, 0xa6bc5767, 0x3fb506dd, 0x48b2364b, + 0xd80d2bda, 0xaf0a1b4c, 0x36034af6, 0x41047a60, + 0xdf60efc3, 0xa867df55, 0x316e8eef, 0x4669be79, + 0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236, + 0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f, + 0xc5ba3bbe, 0xb2bd0b28, 0x2bb45a92, 0x5cb36a04, + 0xc2d7ffa7, 0xb5d0cf31, 0x2cd99e8b, 0x5bdeae1d, + 0x9b64c2b0, 0xec63f226, 0x756aa39c, 0x026d930a, + 0x9c0906a9, 0xeb0e363f, 0x72076785, 0x05005713, + 0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38, + 0x92d28e9b, 0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21, + 0x86d3d2d4, 0xf1d4e242, 0x68ddb3f8, 0x1fda836e, + 0x81be16cd, 0xf6b9265b, 0x6fb077e1, 0x18b74777, + 0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c, + 0x8f659eff, 0xf862ae69, 0x616bffd3, 0x166ccf45, + 0xa00ae278, 0xd70dd2ee, 0x4e048354, 0x3903b3c2, + 0xa7672661, 0xd06016f7, 0x4969474d, 0x3e6e77db, + 0xaed16a4a, 0xd9d65adc, 0x40df0b66, 0x37d83bf0, + 0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9, + 0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6, + 0xbad03605, 0xcdd70693, 0x54de5729, 0x23d967bf, + 0xb3667a2e, 0xc4614ab8, 0x5d681b02, 0x2a6f2b94, + 0xb40bbe37, 0xc30c8ea1, 0x5a05df1b, 0x2d02ef8d +}; + +__device__ static u32x round_crc32 (u32x a, const u32x v) +{ + const u32x k = (a ^ v) & 0xff; + + const u32x s = a >> 8; + + #ifdef VECT_SIZE1 + a = crc32tab[k]; + #endif + + #ifdef VECT_SIZE2 + a.x = crc32tab[k.x]; + a.y = crc32tab[k.y]; + #endif + + #ifdef VECT_SIZE4 + a.x = crc32tab[k.x]; + a.y = crc32tab[k.y]; + a.z = crc32tab[k.z]; + a.w = crc32tab[k.w]; + #endif + + a ^= s; + + return a; +} + +__device__ static u32x crc32 (const u32x w[16], const u32 pw_len, const u32 iv) +{ + u32x a = iv ^ ~0; + + if (pw_len >= 1) a = round_crc32 (a, w[0] >> 0); + if (pw_len >= 2) a = round_crc32 (a, w[0] >> 8); + if (pw_len >= 3) a = round_crc32 (a, w[0] >> 16); + if (pw_len >= 4) a = round_crc32 (a, w[0] >> 24); + + for (u32 i = 4, j = 1; i < pw_len; i += 4, j += 1) + { + if (pw_len >= (i + 1)) a = round_crc32 (a, w[j] >> 0); + if (pw_len >= (i + 2)) a = round_crc32 (a, w[j] >> 8); + if (pw_len >= (i + 3)) a = round_crc32 (a, w[j] >> 16); + if (pw_len >= (i + 4)) a = round_crc32 (a, w[j] >> 24); + } + + return ~a; +} + +__device__ static void bzero16 (u32x block[16]) +{ + block[ 0] = 0; + block[ 1] = 0; + block[ 2] = 0; + block[ 3] = 0; + block[ 4] = 0; + block[ 5] = 0; + block[ 6] = 0; + block[ 7] = 0; + block[ 8] = 0; + block[ 9] = 0; + block[10] = 0; + block[11] = 0; + block[12] = 0; + block[13] = 0; + block[14] = 0; + block[15] = 0; +} + +__device__ static u32 memcat8c (u32x block[16], const u32 block_len, const u32x append[4], const u32 append_len, u32x digest[8]) +{ + const u32 div = block_len / 4; + + u32x tmp0; + u32x tmp1; + u32x tmp2; + + #if __CUDA_ARCH__ >= 200 + + const int offset_minus_4 = 4 - (block_len & 3); + + const int selector = (0x76543210 >> (offset_minus_4 * 4)) & 0xffff; + + tmp0 = __byte_perm ( 0, append[0], selector); + tmp1 = __byte_perm (append[0], append[1], selector); + tmp2 = __byte_perm (append[1], 0, selector); + + #endif + + u32x carry[2] = { 0, 0 }; + + switch (div) + { + case 0: block[ 0] |= tmp0; + block[ 1] = tmp1; + block[ 2] = tmp2; + break; + case 1: block[ 1] |= tmp0; + block[ 2] = tmp1; + block[ 3] = tmp2; + break; + case 2: block[ 2] |= tmp0; + block[ 3] = tmp1; + block[ 4] = tmp2; + break; + case 3: block[ 3] |= tmp0; + block[ 4] = tmp1; + block[ 5] = tmp2; + break; + case 4: block[ 4] |= tmp0; + block[ 5] = tmp1; + block[ 6] = tmp2; + break; + case 5: block[ 5] |= tmp0; + block[ 6] = tmp1; + block[ 7] = tmp2; + break; + case 6: block[ 6] |= tmp0; + block[ 7] = tmp1; + block[ 8] = tmp2; + break; + case 7: block[ 7] |= tmp0; + block[ 8] = tmp1; + block[ 9] = tmp2; + break; + case 8: block[ 8] |= tmp0; + block[ 9] = tmp1; + block[10] = tmp2; + break; + case 9: block[ 9] |= tmp0; + block[10] = tmp1; + block[11] = tmp2; + break; + case 10: block[10] |= tmp0; + block[11] = tmp1; + block[12] = tmp2; + break; + case 11: block[11] |= tmp0; + block[12] = tmp1; + block[13] = tmp2; + break; + case 12: block[12] |= tmp0; + block[13] = tmp1; + block[14] = tmp2; + break; + case 13: block[13] |= tmp0; + block[14] = tmp1; + block[15] = tmp2; + break; + case 14: block[14] |= tmp0; + block[15] = tmp1; + carry[ 0] = tmp2; + break; + case 15: block[15] |= tmp0; + carry[ 0] = tmp1; + carry[ 1] = tmp2; + break; + } + + u32 new_len = block_len + append_len; + + if (new_len >= 64) + { + new_len -= 64; + + sha256_transform (block, digest); + + bzero16 (block); + + block[0] = carry[0]; + block[1] = carry[1]; + } + + return new_len; +} + +__device__ static u32 memcat32c (u32x block[16], const u32 block_len, const u32x append[4], const u32 append_len, u32x digest[8]) +{ + const u32 div = block_len / 4; + + u32x tmp0; + u32x tmp1; + u32x tmp2; + u32x tmp3; + u32x tmp4; + u32x tmp5; + u32x tmp6; + u32x tmp7; + u32x tmp8; + + #if __CUDA_ARCH__ >= 200 + + const int offset_minus_4 = 4 - (block_len & 3); + + const int selector = (0x76543210 >> (offset_minus_4 * 4)) & 0xffff; + + tmp0 = __byte_perm ( 0, append[0], selector); + tmp1 = __byte_perm (append[0], append[1], selector); + tmp2 = __byte_perm (append[1], append[2], selector); + tmp3 = __byte_perm (append[2], append[3], selector); + tmp4 = __byte_perm (append[3], append[4], selector); + tmp5 = __byte_perm (append[4], append[5], selector); + tmp6 = __byte_perm (append[5], append[6], selector); + tmp7 = __byte_perm (append[6], append[7], selector); + tmp8 = __byte_perm (append[7], 0, selector); + + #endif + + u32x carry[8] = { 0, 0, 0, 0, 0, 0, 0, 0 }; + + switch (div) + { + case 0: block[ 0] |= tmp0; + block[ 1] = tmp1; + block[ 2] = tmp2; + block[ 3] = tmp3; + block[ 4] = tmp4; + block[ 5] = tmp5; + block[ 6] = tmp6; + block[ 7] = tmp7; + block[ 8] = tmp8; + break; + case 1: block[ 1] |= tmp0; + block[ 2] = tmp1; + block[ 3] = tmp2; + block[ 4] = tmp3; + block[ 5] = tmp4; + block[ 6] = tmp5; + block[ 7] = tmp6; + block[ 8] = tmp7; + block[ 9] = tmp8; + break; + case 2: block[ 2] |= tmp0; + block[ 3] = tmp1; + block[ 4] = tmp2; + block[ 5] = tmp3; + block[ 6] = tmp4; + block[ 7] = tmp5; + block[ 8] = tmp6; + block[ 9] = tmp7; + block[10] = tmp8; + break; + case 3: block[ 3] |= tmp0; + block[ 4] = tmp1; + block[ 5] = tmp2; + block[ 6] = tmp3; + block[ 7] = tmp4; + block[ 8] = tmp5; + block[ 9] = tmp6; + block[10] = tmp7; + block[11] = tmp8; + break; + case 4: block[ 4] |= tmp0; + block[ 5] = tmp1; + block[ 6] = tmp2; + block[ 7] = tmp3; + block[ 8] = tmp4; + block[ 9] = tmp5; + block[10] = tmp6; + block[11] = tmp7; + block[12] = tmp8; + break; + case 5: block[ 5] |= tmp0; + block[ 6] = tmp1; + block[ 7] = tmp2; + block[ 8] = tmp3; + block[ 9] = tmp4; + block[10] = tmp5; + block[11] = tmp6; + block[12] = tmp7; + block[13] = tmp8; + break; + case 6: block[ 6] |= tmp0; + block[ 7] = tmp1; + block[ 8] = tmp2; + block[ 9] = tmp3; + block[10] = tmp4; + block[11] = tmp5; + block[12] = tmp6; + block[13] = tmp7; + block[14] = tmp8; + break; + case 7: block[ 7] |= tmp0; + block[ 8] = tmp1; + block[ 9] = tmp2; + block[10] = tmp3; + block[11] = tmp4; + block[12] = tmp5; + block[13] = tmp6; + block[14] = tmp7; + block[15] = tmp8; + break; + case 8: block[ 8] |= tmp0; + block[ 9] = tmp1; + block[10] = tmp2; + block[11] = tmp3; + block[12] = tmp4; + block[13] = tmp5; + block[14] = tmp6; + block[15] = tmp7; + carry[ 0] = tmp8; + break; + case 9: block[ 9] |= tmp0; + block[10] = tmp1; + block[11] = tmp2; + block[12] = tmp3; + block[13] = tmp4; + block[14] = tmp5; + block[15] = tmp6; + carry[ 0] = tmp7; + carry[ 1] = tmp8; + break; + case 10: block[10] |= tmp0; + block[11] = tmp1; + block[12] = tmp2; + block[13] = tmp3; + block[14] = tmp4; + block[15] = tmp5; + carry[ 0] = tmp6; + carry[ 1] = tmp7; + carry[ 2] = tmp8; + break; + case 11: block[11] |= tmp0; + block[12] = tmp1; + block[13] = tmp2; + block[14] = tmp3; + block[15] = tmp4; + carry[ 0] = tmp5; + carry[ 1] = tmp6; + carry[ 2] = tmp7; + carry[ 3] = tmp8; + break; + case 12: block[12] |= tmp0; + block[13] = tmp1; + block[14] = tmp2; + block[15] = tmp3; + carry[ 0] = tmp4; + carry[ 1] = tmp5; + carry[ 2] = tmp6; + carry[ 3] = tmp7; + carry[ 4] = tmp8; + break; + case 13: block[13] |= tmp0; + block[14] = tmp1; + block[15] = tmp2; + carry[ 0] = tmp3; + carry[ 1] = tmp4; + carry[ 2] = tmp5; + carry[ 3] = tmp6; + carry[ 4] = tmp7; + carry[ 5] = tmp8; + break; + case 14: block[14] |= tmp0; + block[15] = tmp1; + carry[ 0] = tmp2; + carry[ 1] = tmp3; + carry[ 2] = tmp4; + carry[ 3] = tmp5; + carry[ 4] = tmp6; + carry[ 5] = tmp7; + carry[ 6] = tmp8; + break; + case 15: block[15] |= tmp0; + carry[ 0] = tmp1; + carry[ 1] = tmp2; + carry[ 2] = tmp3; + carry[ 3] = tmp4; + carry[ 4] = tmp5; + carry[ 5] = tmp6; + carry[ 6] = tmp7; + carry[ 7] = tmp8; + break; + } + + u32 new_len = block_len + append_len; + + if (new_len >= 64) + { + new_len -= 64; + + sha256_transform (block, digest); + + bzero16 (block); + + block[0] = carry[0]; + block[1] = carry[1]; + block[2] = carry[2]; + block[3] = carry[3]; + block[4] = carry[4]; + block[5] = carry[5]; + block[6] = carry[6]; + block[7] = carry[7]; + } + + return new_len; +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m11600_init (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, seven_zip_tmp_t *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const seven_zip_t *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + /** + * algo starts here already + */ + + u32x dgst[8]; + + dgst[0] = SHA256M_A; + dgst[1] = SHA256M_B; + dgst[2] = SHA256M_C; + dgst[3] = SHA256M_D; + dgst[4] = SHA256M_E; + dgst[5] = SHA256M_F; + dgst[6] = SHA256M_G; + dgst[7] = SHA256M_H; + + u32x block[16]; + + bzero16 (block); + + u32 block_len = 0; + u32 final_len = 0; + + /** + * context save + */ + + tmps[gid].dgst[0] = dgst[0]; + tmps[gid].dgst[1] = dgst[1]; + tmps[gid].dgst[2] = dgst[2]; + tmps[gid].dgst[3] = dgst[3]; + tmps[gid].dgst[4] = dgst[4]; + tmps[gid].dgst[5] = dgst[5]; + tmps[gid].dgst[6] = dgst[6]; + tmps[gid].dgst[7] = dgst[7]; + + tmps[gid].block[ 0] = block[ 0]; + tmps[gid].block[ 1] = block[ 1]; + tmps[gid].block[ 2] = block[ 2]; + tmps[gid].block[ 3] = block[ 3]; + tmps[gid].block[ 4] = block[ 4]; + tmps[gid].block[ 5] = block[ 5]; + tmps[gid].block[ 6] = block[ 6]; + tmps[gid].block[ 7] = block[ 7]; + tmps[gid].block[ 8] = block[ 8]; + tmps[gid].block[ 9] = block[ 9]; + tmps[gid].block[10] = block[10]; + tmps[gid].block[11] = block[11]; + tmps[gid].block[12] = block[12]; + tmps[gid].block[13] = block[13]; + tmps[gid].block[14] = block[14]; + tmps[gid].block[15] = block[15]; + + tmps[gid].block_len = block_len; + tmps[gid].final_len = final_len; +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m11600_loop (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, seven_zip_tmp_t *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const seven_zip_t *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x pw[8]; + + pw[0] = pws[gid].i[ 0]; + pw[1] = pws[gid].i[ 1]; + pw[2] = pws[gid].i[ 2]; + pw[3] = pws[gid].i[ 3]; + pw[4] = 0; + pw[5] = 0; + pw[6] = 0; + pw[7] = 0; + + u32 pw_len = pws[gid].pw_len; + + make_unicode (&pw[0], &pw[0], &pw[4]); + + pw_len *= 2; + + /** + * context load + */ + + u32x dgst[8]; + + dgst[0] = tmps[gid].dgst[0]; + dgst[1] = tmps[gid].dgst[1]; + dgst[2] = tmps[gid].dgst[2]; + dgst[3] = tmps[gid].dgst[3]; + dgst[4] = tmps[gid].dgst[4]; + dgst[5] = tmps[gid].dgst[5]; + dgst[6] = tmps[gid].dgst[6]; + dgst[7] = tmps[gid].dgst[7]; + + u32x block[16]; + + block[ 0] = tmps[gid].block[ 0]; + block[ 1] = tmps[gid].block[ 1]; + block[ 2] = tmps[gid].block[ 2]; + block[ 3] = tmps[gid].block[ 3]; + block[ 4] = tmps[gid].block[ 4]; + block[ 5] = tmps[gid].block[ 5]; + block[ 6] = tmps[gid].block[ 6]; + block[ 7] = tmps[gid].block[ 7]; + block[ 8] = tmps[gid].block[ 8]; + block[ 9] = tmps[gid].block[ 9]; + block[10] = tmps[gid].block[10]; + block[11] = tmps[gid].block[11]; + block[12] = tmps[gid].block[12]; + block[13] = tmps[gid].block[13]; + block[14] = tmps[gid].block[14]; + block[15] = tmps[gid].block[15]; + + u32 block_len = tmps[gid].block_len; + u32 final_len = tmps[gid].final_len; + + /** + * base + */ + + for (u32 i = 0, j = loop_pos; i < loop_cnt; i++, j++) + { + u32 it[2]; + + it[0] = j; + it[1] = 0; + + block_len = memcat32c (block, block_len, pw, pw_len, dgst); final_len += pw_len; + block_len = memcat8c (block, block_len, it, 8, dgst); final_len += 8; + } + + /** + * context save + */ + + tmps[gid].dgst[0] = dgst[0]; + tmps[gid].dgst[1] = dgst[1]; + tmps[gid].dgst[2] = dgst[2]; + tmps[gid].dgst[3] = dgst[3]; + tmps[gid].dgst[4] = dgst[4]; + tmps[gid].dgst[5] = dgst[5]; + tmps[gid].dgst[6] = dgst[6]; + tmps[gid].dgst[7] = dgst[7]; + + tmps[gid].block[ 0] = block[ 0]; + tmps[gid].block[ 1] = block[ 1]; + tmps[gid].block[ 2] = block[ 2]; + tmps[gid].block[ 3] = block[ 3]; + tmps[gid].block[ 4] = block[ 4]; + tmps[gid].block[ 5] = block[ 5]; + tmps[gid].block[ 6] = block[ 6]; + tmps[gid].block[ 7] = block[ 7]; + tmps[gid].block[ 8] = block[ 8]; + tmps[gid].block[ 9] = block[ 9]; + tmps[gid].block[10] = block[10]; + tmps[gid].block[11] = block[11]; + tmps[gid].block[12] = block[12]; + tmps[gid].block[13] = block[13]; + tmps[gid].block[14] = block[14]; + tmps[gid].block[15] = block[15]; + + tmps[gid].block_len = block_len; + tmps[gid].final_len = final_len; +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m11600_comp (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, seven_zip_tmp_t *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const seven_zip_t *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + const u32 lid = threadIdx.x; + + /** + * aes shared + */ + + __shared__ u32 s_td0[256]; + __shared__ u32 s_td1[256]; + __shared__ u32 s_td2[256]; + __shared__ u32 s_td3[256]; + __shared__ u32 s_td4[256]; + + __shared__ u32 s_te0[256]; + __shared__ u32 s_te1[256]; + __shared__ u32 s_te2[256]; + __shared__ u32 s_te3[256]; + __shared__ u32 s_te4[256]; + + s_td0[lid] = td0[lid]; + s_td1[lid] = td1[lid]; + s_td2[lid] = td2[lid]; + s_td3[lid] = td3[lid]; + s_td4[lid] = td4[lid]; + + s_te0[lid] = te0[lid]; + s_te1[lid] = te1[lid]; + s_te2[lid] = te2[lid]; + s_te3[lid] = te3[lid]; + s_te4[lid] = te4[lid]; + + __syncthreads (); + + if (gid >= gid_max) return; + + /** + * context load + */ + + u32x dgst[8]; + + dgst[0] = tmps[gid].dgst[0]; + dgst[1] = tmps[gid].dgst[1]; + dgst[2] = tmps[gid].dgst[2]; + dgst[3] = tmps[gid].dgst[3]; + dgst[4] = tmps[gid].dgst[4]; + dgst[5] = tmps[gid].dgst[5]; + dgst[6] = tmps[gid].dgst[6]; + dgst[7] = tmps[gid].dgst[7]; + + u32x block[16]; + + block[ 0] = tmps[gid].block[ 0]; + block[ 1] = tmps[gid].block[ 1]; + block[ 2] = tmps[gid].block[ 2]; + block[ 3] = tmps[gid].block[ 3]; + block[ 4] = tmps[gid].block[ 4]; + block[ 5] = tmps[gid].block[ 5]; + block[ 6] = tmps[gid].block[ 6]; + block[ 7] = tmps[gid].block[ 7]; + block[ 8] = tmps[gid].block[ 8]; + block[ 9] = tmps[gid].block[ 9]; + block[10] = tmps[gid].block[10]; + block[11] = tmps[gid].block[11]; + block[12] = tmps[gid].block[12]; + block[13] = tmps[gid].block[13]; + block[14] = tmps[gid].block[14]; + block[15] = tmps[gid].block[15]; + + u32 block_len = tmps[gid].block_len; + u32 final_len = tmps[gid].final_len; + + append_0x80_4 (block, block_len); + + if (block_len >= 56) + { + sha256_transform (block, dgst); + + bzero16 (block); + } + + block[15] = swap_workaround (final_len * 8); + + sha256_transform (block, dgst); + + /** + * final key operations + */ + + u32 iv[4]; + + iv[0] = esalt_bufs[salt_pos].iv_buf[0]; + iv[1] = esalt_bufs[salt_pos].iv_buf[1]; + iv[2] = esalt_bufs[salt_pos].iv_buf[2]; + iv[3] = esalt_bufs[salt_pos].iv_buf[3]; + + u32x ukey[8]; + + ukey[0] = dgst[0]; + ukey[1] = dgst[1]; + ukey[2] = dgst[2]; + ukey[3] = dgst[3]; + ukey[4] = dgst[4]; + ukey[5] = dgst[5]; + ukey[6] = dgst[6]; + ukey[7] = dgst[7]; + + #define KEYLEN 60 + + u32 rk[KEYLEN]; + + AES256_ExpandKey (ukey, rk, s_te0, s_te1, s_te2, s_te3, s_te4); + + AES256_InvertKey (rk, s_td0, s_td1, s_td2, s_td3, s_td4, s_te0, s_te1, s_te2, s_te3, s_te4); + + u32 crc = 0; + + int data_len = esalt_bufs[salt_pos].data_len; + int unpack_size = esalt_bufs[salt_pos].unpack_size; + + int i; + int j; + + for (i = 0, j = 0; i < data_len - 16; i += 16, j += 4) + { + u32 data[4]; + + data[0] = swap_workaround (esalt_bufs[salt_pos].data_buf[j + 0]); + data[1] = swap_workaround (esalt_bufs[salt_pos].data_buf[j + 1]); + data[2] = swap_workaround (esalt_bufs[salt_pos].data_buf[j + 2]); + data[3] = swap_workaround (esalt_bufs[salt_pos].data_buf[j + 3]); + + u32 out[4]; + + AES256_decrypt (data, out, rk, s_td0, s_td1, s_td2, s_td3, s_td4); + + out[0] ^= iv[0]; + out[1] ^= iv[1]; + out[2] ^= iv[2]; + out[3] ^= iv[3]; + + iv[0] = data[0]; + iv[1] = data[1]; + iv[2] = data[2]; + iv[3] = data[3]; + + out[0] = swap_workaround (out[0]); + out[1] = swap_workaround (out[1]); + out[2] = swap_workaround (out[2]); + out[3] = swap_workaround (out[3]); + + crc = crc32 (out, 16, crc); + } + + u32 data[4]; + + data[0] = swap_workaround (esalt_bufs[salt_pos].data_buf[j + 0]); + data[1] = swap_workaround (esalt_bufs[salt_pos].data_buf[j + 1]); + data[2] = swap_workaround (esalt_bufs[salt_pos].data_buf[j + 2]); + data[3] = swap_workaround (esalt_bufs[salt_pos].data_buf[j + 3]); + + u32 out[4]; + + AES256_decrypt (data, out, rk, s_td0, s_td1, s_td2, s_td3, s_td4); + + out[0] ^= iv[0]; + out[1] ^= iv[1]; + out[2] ^= iv[2]; + out[3] ^= iv[3]; + + iv[0] = data[0]; + iv[1] = data[1]; + iv[2] = data[2]; + iv[3] = data[3]; + + out[0] = swap_workaround (out[0]); + out[1] = swap_workaround (out[1]); + out[2] = swap_workaround (out[2]); + out[3] = swap_workaround (out[3]); + + const u32 margin = data_len - unpack_size; + + const u32 left = 16 - margin; + + crc = crc32 (out, left, crc); + + // use padding attack in that case + + if (margin >= 4) + { + switch (margin) + { + case 15: out[0] &= 0xffffff00; + break; + case 14: out[0] &= 0xffff0000; + break; + case 13: out[0] &= 0xff000000; + break; + case 12: out[0] = 0; + break; + case 11: out[0] = 0; + out[1] &= 0xffffff00; + break; + case 10: out[0] = 0; + out[1] &= 0xffff0000; + break; + case 9: out[0] = 0; + out[1] &= 0xff000000; + break; + case 8: out[0] = 0; + out[1] = 0; + break; + case 7: out[0] = 0; + out[1] = 0; + out[2] &= 0xffffff00; + break; + case 6: out[0] = 0; + out[1] = 0; + out[2] &= 0xffff0000; + break; + case 5: out[0] = 0; + out[1] = 0; + out[2] &= 0xff000000; + break; + case 4: out[0] = 0; + out[1] = 0; + out[2] = 0; + break; + case 3: out[0] = 0; + out[1] = 0; + out[2] = 0; + out[3] &= 0xffffff00; + break; + case 2: out[0] = 0; + out[1] = 0; + out[2] = 0; + out[3] &= 0xffff0000; + break; + case 1: out[0] = 0; + out[1] = 0; + out[2] = 0; + out[3] &= 0xff000000; + break; + } + + if ((out[0] == 0) && (out[1] == 0) && (out[2] == 0) && (out[3] == 0)) + { + mark_hash_s0 (plains_buf, hashes_shown, digests_offset + 0, gid, 0); + + d_return_buf[lid] = 1; + } + } + + const u32x r0 = crc; + const u32x r1 = 0; + const u32x r2 = 0; + const u32x r3 = 0; + + #define il_pos 0 + + #include VECT_COMPARE_M +} diff --git a/nv/m11700_a0.cu b/nv/m11700_a0.cu new file mode 100644 index 0000000000..5a69197f65 --- /dev/null +++ b/nv/m11700_a0.cu @@ -0,0 +1,2675 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _GOST2012_256_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW2 +#define VECT_SIZE1 +#endif + +#define DGST_R0 0 +#define DGST_R1 1 +#define DGST_R2 2 +#define DGST_R3 3 + +#include "include/kernel_functions.c" +#include "types_nv.c" +#include "common_nv.c" +#include "include/rp_gpu.h" +#include "rp_nv.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +#define INITVAL 0x0101010101010101 + +#define SBOG_LPSti64 \ + s_sbob_sl64[0][(t[0] >> (i * 8)) & 0xff] ^ \ + s_sbob_sl64[1][(t[1] >> (i * 8)) & 0xff] ^ \ + s_sbob_sl64[2][(t[2] >> (i * 8)) & 0xff] ^ \ + s_sbob_sl64[3][(t[3] >> (i * 8)) & 0xff] ^ \ + s_sbob_sl64[4][(t[4] >> (i * 8)) & 0xff] ^ \ + s_sbob_sl64[5][(t[5] >> (i * 8)) & 0xff] ^ \ + s_sbob_sl64[6][(t[6] >> (i * 8)) & 0xff] ^ \ + s_sbob_sl64[7][(t[7] >> (i * 8)) & 0xff] + +// constants + +__device__ const u64 sbob_sl64[8][256] = +{ + { + 0xd031c397ce553fe6, + 0x16ba5b01b006b525, + 0xa89bade6296e70c8, + 0x6a1f525d77d3435b, + 0x6e103570573dfa0b, + 0x660efb2a17fc95ab, + 0x76327a9e97634bf6, + 0x4bad9d6462458bf5, + 0xf1830caedbc3f748, + 0xc5c8f542669131ff, + 0x95044a1cdc48b0cb, + 0x892962df3cf8b866, + 0xb0b9e208e930c135, + 0xa14fb3f0611a767c, + 0x8d2605f21c160136, + 0xd6b71922fecc549e, + 0x37089438a5907d8b, + 0x0b5da38e5803d49c, + 0x5a5bcc9cea6f3cbc, + 0xedae246d3b73ffe5, + 0xd2b87e0fde22edce, + 0x5e54abb1ca8185ec, + 0x1de7f88fe80561b9, + 0xad5e1a870135a08c, + 0x2f2adbd665cecc76, + 0x5780b5a782f58358, + 0x3edc8a2eede47b3f, + 0xc9d95c3506bee70f, + 0x83be111d6c4e05ee, + 0xa603b90959367410, + 0x103c81b4809fde5d, + 0x2c69b6027d0c774a, + 0x399080d7d5c87953, + 0x09d41e16487406b4, + 0xcdd63b1826505e5f, + 0xf99dc2f49b0298e8, + 0x9cd0540a943cb67f, + 0xbca84b7f891f17c5, + 0x723d1db3b78df2a6, + 0x78aa6e71e73b4f2e, + 0x1433e699a071670d, + 0x84f21be454620782, + 0x98df3327b4d20f2f, + 0xf049dce2d3769e5c, + 0xdb6c60199656eb7a, + 0x648746b2078b4783, + 0x32cd23598dcbadcf, + 0x1ea4955bf0c7da85, + 0xe9a143401b9d46b5, + 0xfd92a5d9bbec21b8, + 0xc8138c790e0b8e1b, + 0x2ee00b9a6d7ba562, + 0xf85712b893b7f1fc, + 0xeb28fed80bea949d, + 0x564a65eb8a40ea4c, + 0x6c9988e8474a2823, + 0x4535898b121d8f2d, + 0xabd8c03231accbf4, + 0xba2e91cab9867cbd, + 0x7960be3def8e263a, + 0x0c11a977602fd6f0, + 0xcb50e1ad16c93527, + 0xeae22e94035ffd89, + 0x2866d12f5de2ce1a, + 0xff1b1841ab9bf390, + 0x9f9339de8cfe0d43, + 0x964727c8c48a0bf7, + 0x524502c6aaae531c, + 0x9b9c5ef3ac10b413, + 0x4fa2fa4942ab32a5, + 0x3f165a62e551122b, + 0xc74148da76e6e3d7, + 0x924840e5e464b2a7, + 0xd372ae43d69784da, + 0x233b72a105e11a86, + 0xa48a04914941a638, + 0xb4b68525c9de7865, + 0xddeabaaca6cf8002, + 0x0a9773c250b6bd88, + 0xc284ffbb5ebd3393, + 0x8ba0df472c8f6a4e, + 0x2aef6cb74d951c32, + 0x427983722a318d41, + 0x73f7cdffbf389bb2, + 0x074c0af9382c026c, + 0x8a6a0f0b243a035a, + 0x6fdae53c5f88931f, + 0xc68b98967e538ac3, + 0x44ff59c71aa8e639, + 0xe2fce0ce439e9229, + 0xa20cde2479d8cd40, + 0x19e89fa2c8ebd8e9, + 0xf446bbcff398270c, + 0x43b3533e2284e455, + 0xd82f0dcd8e945046, + 0x51066f12b26ce820, + 0xe73957af6bc5426d, + 0x081ece5a40c16fa0, + 0x3b193d4fc5bfab7b, + 0x7fe66488df174d42, + 0x0e9814ef705804d8, + 0x8137ac857c39d7c6, + 0xb1733244e185a821, + 0x695c3f896f11f867, + 0xf6cf0657e3eff524, + 0x1aabf276d02963d5, + 0x2da3664e75b91e5e, + 0x0289bd981077d228, + 0x90c1fd7df413608f, + 0x3c5537b6fd93a917, + 0xaa12107e3919a2e0, + 0x0686dab530996b78, + 0xdaa6b0559ee3826e, + 0xc34e2ff756085a87, + 0x6d5358a44fff4137, + 0xfc587595b35948ac, + 0x7ca5095cc7d5f67e, + 0xfb147f6c8b754ac0, + 0xbfeb26ab91ddacf9, + 0x6896efc567a49173, + 0xca9a31e11e7c5c33, + 0xbbe44186b13315a9, + 0x0ddb793b689abfe4, + 0x70b4a02ba7fa208e, + 0xe47a3a7b7307f951, + 0x8cecd5be14a36822, + 0xeeed49b923b144d9, + 0x17708b4db8b3dc31, + 0x6088219f2765fed3, + 0xb3fa8fdcf1f27a09, + 0x910b2d31fca6099b, + 0x0f52c4a378ed6dcc, + 0x50ccbf5ebad98134, + 0x6bd582117f662a4f, + 0x94ce9a50d4fdd9df, + 0x2b25bcfb45207526, + 0x67c42b661f49fcbf, + 0x492420fc723259dd, + 0x03436dd418c2bb3c, + 0x1f6e4517f872b391, + 0xa08563bc69af1f68, + 0xd43ea4baeebb86b6, + 0x01cad04c08b56914, + 0xac94cacb0980c998, + 0x54c3d8739a373864, + 0x26fec5c02dbacac2, + 0xdea9d778be0d3b3e, + 0x040f672d20eeb950, + 0xe5b0ea377bb29045, + 0xf30ab136cbb42560, + 0x62019c0737122cfb, + 0xe86b930c13282fa1, + 0xcc1ceb542ee5374b, + 0x538fd28aa21b3a08, + 0x1b61223ad89c0ac1, + 0x36c24474ad25149f, + 0x7a23d3e9f74c9d06, + 0xbe21f6e79968c5ed, + 0xcf5f868036278c77, + 0xf705d61beb5a9c30, + 0x4d2b47d152dce08d, + 0x5f9e7bfdc234ecf8, + 0x247778583dcd18ea, + 0x867ba67c4415d5aa, + 0x4ce1979d5a698999, + 0x0000000000000000, + 0xec64f42133c696f1, + 0xb57c5569c16b1171, + 0xc1c7926f467f88af, + 0x654d96fe0f3e2e97, + 0x15f936d5a8c40e19, + 0xb8a72c52a9f1ae95, + 0xa9517daa21db19dc, + 0x58d27104fa18ee94, + 0x5918a148f2ad8780, + 0x5cdd1629daf657c4, + 0x8274c15164fb6cfa, + 0xd1fb13dbc6e056f2, + 0x7d6fd910cf609f6a, + 0xb63f38bdd9a9aa4d, + 0x3d9fe7faf526c003, + 0x74bbc706871499de, + 0xdf630734b6b8522a, + 0x3ad3ed03cd0ac26f, + 0xfadeaf2083c023d4, + 0xc00d42234ecae1bb, + 0x8538cba85cd76e96, + 0xc402250e6e2458eb, + 0x47bc3413026a5d05, + 0xafd7a71f114272a4, + 0x978df784cc3f62e3, + 0xb96dfc1ea144c781, + 0x21b2cf391596c8ae, + 0x318e4e8d950916f3, + 0xce9556cc3e92e563, + 0x385a509bdd7d1047, + 0x358129a0b5e7afa3, + 0xe6f387e363702b79, + 0xe0755d5653e94001, + 0x7be903a5fff9f412, + 0x12b53c2c90e80c75, + 0x3307f315857ec4db, + 0x8fafb86a0c61d31e, + 0xd9e5dd8186213952, + 0x77f8aad29fd622e2, + 0x25bda814357871fe, + 0x7571174a8fa1f0ca, + 0x137fec60985d6561, + 0x30449ec19dbc7fe7, + 0xa540d4dd41f4cf2c, + 0xdc206ae0ae7ae916, + 0x5b911cd0e2da55a8, + 0xb2305f90f947131d, + 0x344bf9ecbd52c6b7, + 0x5d17c665d2433ed0, + 0x18224feec05eb1fd, + 0x9e59e992844b6457, + 0x9a568ebfa4a5dd07, + 0xa3c60e68716da454, + 0x7e2cb4c4d7a22456, + 0x87b176304ca0bcbe, + 0x413aeea632f3367d, + 0x9915e36bbc67663b, + 0x40f03eea3a465f69, + 0x1c2d28c3e0b008ad, + 0x4e682a054a1e5bb1, + 0x05c5b761285bd044, + 0xe1bf8d1a5b5c2915, + 0xf2c0617ac3014c74, + 0xb7f5e8f1d11cc359, + 0x63cb4c4b3fa745ef, + 0x9d1a84469c89df6b, + 0xe33630824b2bfb3d, + 0xd5f474f6e60eefa2, + 0xf58c6b83fb2d4e18, + 0x4676e45f0adf3411, + 0x20781f751d23a1ba, + 0xbd629b3381aa7ed1, + 0xae1d775319f71bb0, + 0xfed1c80da32e9a84, + 0x5509083f92825170, + 0x29ac01635557a70e, + 0xa7c9694551831d04, + 0x8e65682604d4ba0a, + 0x11f651f8882ab749, + 0xd77dc96ef6793d8a, + 0xef2799f52b042dcd, + 0x48eef0b07a8730c9, + 0x22f1a2ed0d547392, + 0x6142f1d32fd097c7, + 0x4a674d286af0e2e1, + 0x80fd7cc9748cbed2, + 0x717e7067af4f499a, + 0x938290a9ecd1dbb3, + 0x88e3b293344dd172, + 0x2734158c250fa3d6, + }, + { + 0x7e37e62dfc7d40c3, + 0x776f25a4ee939e5b, + 0xe045c850dd8fb5ad, + 0x86ed5ba711ff1952, + 0xe91d0bd9cf616b35, + 0x37e0ab256e408ffb, + 0x9607f6c031025a7a, + 0x0b02f5e116d23c9d, + 0xf3d8486bfb50650c, + 0x621cff27c40875f5, + 0x7d40cb71fa5fd34a, + 0x6daa6616daa29062, + 0x9f5f354923ec84e2, + 0xec847c3dc507c3b3, + 0x025a3668043ce205, + 0xa8bf9e6c4dac0b19, + 0xfa808be2e9bebb94, + 0xb5b99c5277c74fa3, + 0x78d9bc95f0397bcc, + 0xe332e50cdbad2624, + 0xc74fce129332797e, + 0x1729eceb2ea709ab, + 0xc2d6b9f69954d1f8, + 0x5d898cbfbab8551a, + 0x859a76fb17dd8adb, + 0x1be85886362f7fb5, + 0xf6413f8ff136cd8a, + 0xd3110fa5bbb7e35c, + 0x0a2feed514cc4d11, + 0xe83010edcd7f1ab9, + 0xa1e75de55f42d581, + 0xeede4a55c13b21b6, + 0xf2f5535ff94e1480, + 0x0cc1b46d1888761e, + 0xbce15fdb6529913b, + 0x2d25e8975a7181c2, + 0x71817f1ce2d7a554, + 0x2e52c5cb5c53124b, + 0xf9f7a6beef9c281d, + 0x9e722e7d21f2f56e, + 0xce170d9b81dca7e6, + 0x0e9b82051cb4941b, + 0x1e712f623c49d733, + 0x21e45cfa42f9f7dc, + 0xcb8e7a7f8bba0f60, + 0x8e98831a010fb646, + 0x474ccf0d8e895b23, + 0xa99285584fb27a95, + 0x8cc2b57205335443, + 0x42d5b8e984eff3a5, + 0x012d1b34021e718c, + 0x57a6626aae74180b, + 0xff19fc06e3d81312, + 0x35ba9d4d6a7c6dfe, + 0xc9d44c178f86ed65, + 0x506523e6a02e5288, + 0x03772d5c06229389, + 0x8b01f4fe0b691ec0, + 0xf8dabd8aed825991, + 0x4c4e3aec985b67be, + 0xb10df0827fbf96a9, + 0x6a69279ad4f8dae1, + 0xe78689dcd3d5ff2e, + 0x812e1a2b1fa553d1, + 0xfbad90d6eba0ca18, + 0x1ac543b234310e39, + 0x1604f7df2cb97827, + 0xa6241c6951189f02, + 0x753513cceaaf7c5e, + 0x64f2a59fc84c4efa, + 0x247d2b1e489f5f5a, + 0xdb64d718ab474c48, + 0x79f4a7a1f2270a40, + 0x1573da832a9bebae, + 0x3497867968621c72, + 0x514838d2a2302304, + 0xf0af6537fd72f685, + 0x1d06023e3a6b44ba, + 0x678588c3ce6edd73, + 0x66a893f7cc70acff, + 0xd4d24e29b5eda9df, + 0x3856321470ea6a6c, + 0x07c3418c0e5a4a83, + 0x2bcbb22f5635bacd, + 0x04b46cd00878d90a, + 0x06ee5ab80c443b0f, + 0x3b211f4876c8f9e5, + 0x0958c38912eede98, + 0xd14b39cdbf8b0159, + 0x397b292072f41be0, + 0x87c0409313e168de, + 0xad26e98847caa39f, + 0x4e140c849c6785bb, + 0xd5ff551db7f3d853, + 0xa0ca46d15d5ca40d, + 0xcd6020c787fe346f, + 0x84b76dcf15c3fb57, + 0xdefda0fca121e4ce, + 0x4b8d7b6096012d3d, + 0x9ac642ad298a2c64, + 0x0875d8bd10f0af14, + 0xb357c6ea7b8374ac, + 0x4d6321d89a451632, + 0xeda96709c719b23f, + 0xf76c24bbf328bc06, + 0xc662d526912c08f2, + 0x3ce25ec47892b366, + 0xb978283f6f4f39bd, + 0xc08c8f9e9d6833fd, + 0x4f3917b09e79f437, + 0x593de06fb2c08c10, + 0xd6887841b1d14bda, + 0x19b26eee32139db0, + 0xb494876675d93e2f, + 0x825937771987c058, + 0x90e9ac783d466175, + 0xf1827e03ff6c8709, + 0x945dc0a8353eb87f, + 0x4516f9658ab5b926, + 0x3f9573987eb020ef, + 0xb855330b6d514831, + 0x2ae6a91b542bcb41, + 0x6331e413c6160479, + 0x408f8e8180d311a0, + 0xeff35161c325503a, + 0xd06622f9bd9570d5, + 0x8876d9a20d4b8d49, + 0xa5533135573a0c8b, + 0xe168d364df91c421, + 0xf41b09e7f50a2f8f, + 0x12b09b0f24c1a12d, + 0xda49cc2ca9593dc4, + 0x1f5c34563e57a6bf, + 0x54d14f36a8568b82, + 0xaf7cdfe043f6419a, + 0xea6a2685c943f8bc, + 0xe5dcbfb4d7e91d2b, + 0xb27addde799d0520, + 0x6b443caed6e6ab6d, + 0x7bae91c9f61be845, + 0x3eb868ac7cae5163, + 0x11c7b65322e332a4, + 0xd23c1491b9a992d0, + 0x8fb5982e0311c7ca, + 0x70ac6428e0c9d4d8, + 0x895bc2960f55fcc5, + 0x76423e90ec8defd7, + 0x6ff0507ede9e7267, + 0x3dcf45f07a8cc2ea, + 0x4aa06054941f5cb1, + 0x5810fb5bb0defd9c, + 0x5efea1e3bc9ac693, + 0x6edd4b4adc8003eb, + 0x741808f8e8b10dd2, + 0x145ec1b728859a22, + 0x28bc9f7350172944, + 0x270a06424ebdccd3, + 0x972aedf4331c2bf6, + 0x059977e40a66a886, + 0x2550302a4a812ed6, + 0xdd8a8da0a7037747, + 0xc515f87a970e9b7b, + 0x3023eaa9601ac578, + 0xb7e3aa3a73fbada6, + 0x0fb699311eaae597, + 0x0000000000000000, + 0x310ef19d6204b4f4, + 0x229371a644db6455, + 0x0decaf591a960792, + 0x5ca4978bb8a62496, + 0x1c2b190a38753536, + 0x41a295b582cd602c, + 0x3279dcc16426277d, + 0xc1a194aa9f764271, + 0x139d803b26dfd0a1, + 0xae51c4d441e83016, + 0xd813fa44ad65dfc1, + 0xac0bf2bc45d4d213, + 0x23be6a9246c515d9, + 0x49d74d08923dcf38, + 0x9d05032127d066e7, + 0x2f7fdeff5e4d63c7, + 0xa47e2a0155247d07, + 0x99b16ff12fa8bfed, + 0x4661d4398c972aaf, + 0xdfd0bbc8a33f9542, + 0xdca79694a51d06cb, + 0xb020ebb67da1e725, + 0xba0f0563696daa34, + 0xe4f1a480d5f76ca7, + 0xc438e34e9510eaf7, + 0x939e81243b64f2fc, + 0x8defae46072d25cf, + 0x2c08f3a3586ff04e, + 0xd7a56375b3cf3a56, + 0x20c947ce40e78650, + 0x43f8a3dd86f18229, + 0x568b795eac6a6987, + 0x8003011f1dbb225d, + 0xf53612d3f7145e03, + 0x189f75da300dec3c, + 0x9570db9c3720c9f3, + 0xbb221e576b73dbb8, + 0x72f65240e4f536dd, + 0x443be25188abc8aa, + 0xe21ffe38d9b357a8, + 0xfd43ca6ee7e4f117, + 0xcaa3614b89a47eec, + 0xfe34e732e1c6629e, + 0x83742c431b99b1d4, + 0xcf3a16af83c2d66a, + 0xaae5a8044990e91c, + 0x26271d764ca3bd5f, + 0x91c4b74c3f5810f9, + 0x7c6dd045f841a2c6, + 0x7f1afd19fe63314f, + 0xc8f957238d989ce9, + 0xa709075d5306ee8e, + 0x55fc5402aa48fa0e, + 0x48fa563c9023beb4, + 0x65dfbeabca523f76, + 0x6c877d22d8bce1ee, + 0xcc4d3bf385e045e3, + 0xbebb69b36115733e, + 0x10eaad6720fd4328, + 0xb6ceb10e71e5dc2a, + 0xbdcc44ef6737e0b7, + 0x523f158ea412b08d, + 0x989c74c52db6ce61, + 0x9beb59992b945de8, + 0x8a2cefca09776f4c, + 0xa3bd6b8d5b7e3784, + 0xeb473db1cb5d8930, + 0xc3fba2c29b4aa074, + 0x9c28181525ce176b, + 0x683311f2d0c438e4, + 0x5fd3bad7be84b71f, + 0xfc6ed15ae5fa809b, + 0x36cdb0116c5efe77, + 0x29918447520958c8, + 0xa29070b959604608, + 0x53120ebaa60cc101, + 0x3a0c047c74d68869, + 0x691e0ac6d2da4968, + 0x73db4974e6eb4751, + 0x7a838afdf40599c9, + 0x5a4acd33b4e21f99, + 0x6046c94fc03497f0, + 0xe6ab92e8d1cb8ea2, + 0x3354c7f5663856f1, + 0xd93ee170af7bae4d, + 0x616bd27bc22ae67c, + 0x92b39a10397a8370, + 0xabc8b3304b8e9890, + 0xbf967287630b02b2, + 0x5b67d607b6fc6e15, + }, + { + 0x8ab0a96846e06a6d, + 0x43c7e80b4bf0b33a, + 0x08c9b3546b161ee5, + 0x39f1c235eba990be, + 0xc1bef2376606c7b2, + 0x2c209233614569aa, + 0xeb01523b6fc3289a, + 0x946953ab935acedd, + 0x272838f63e13340e, + 0x8b0455eca12ba052, + 0x77a1b2c4978ff8a2, + 0xa55122ca13e54086, + 0x2276135862d3f1cd, + 0xdb8ddfde08b76cfe, + 0x5d1e12c89e4a178a, + 0x0e56816b03969867, + 0xee5f79953303ed59, + 0xafed748bab78d71d, + 0x6d929f2df93e53ee, + 0xf5d8a8f8ba798c2a, + 0xf619b1698e39cf6b, + 0x95ddaf2f749104e2, + 0xec2a9c80e0886427, + 0xce5c8fd8825b95ea, + 0xc4e0d9993ac60271, + 0x4699c3a5173076f9, + 0x3d1b151f50a29f42, + 0x9ed505ea2bc75946, + 0x34665acfdc7f4b98, + 0x61b1fb53292342f7, + 0xc721c0080e864130, + 0x8693cd1696fd7b74, + 0x872731927136b14b, + 0xd3446c8a63a1721b, + 0x669a35e8a6680e4a, + 0xcab658f239509a16, + 0xa4e5de4ef42e8ab9, + 0x37a7435ee83f08d9, + 0x134e6239e26c7f96, + 0x82791a3c2df67488, + 0x3f6ef00a8329163c, + 0x8e5a7e42fdeb6591, + 0x5caaee4c7981ddb5, + 0x19f234785af1e80d, + 0x255ddde3ed98bd70, + 0x50898a32a99cccac, + 0x28ca4519da4e6656, + 0xae59880f4cb31d22, + 0x0d9798fa37d6db26, + 0x32f968f0b4ffcd1a, + 0xa00f09644f258545, + 0xfa3ad5175e24de72, + 0xf46c547c5db24615, + 0x713e80fbff0f7e20, + 0x7843cf2b73d2aafa, + 0xbd17ea36aedf62b4, + 0xfd111bacd16f92cf, + 0x4abaa7dbc72d67e0, + 0xb3416b5dad49fad3, + 0xbca316b24914a88b, + 0x15d150068aecf914, + 0xe27c1debe31efc40, + 0x4fe48c759beda223, + 0x7edcfd141b522c78, + 0x4e5070f17c26681c, + 0xe696cac15815f3bc, + 0x35d2a64b3bb481a7, + 0x800cff29fe7dfdf6, + 0x1ed9fac3d5baa4b0, + 0x6c2663a91ef599d1, + 0x03c1199134404341, + 0xf7ad4ded69f20554, + 0xcd9d9649b61bd6ab, + 0xc8c3bde7eadb1368, + 0xd131899fb02afb65, + 0x1d18e352e1fae7f1, + 0xda39235aef7ca6c1, + 0xa1bbf5e0a8ee4f7a, + 0x91377805cf9a0b1e, + 0x3138716180bf8e5b, + 0xd9f83acbdb3ce580, + 0x0275e515d38b897e, + 0x472d3f21f0fbbcc6, + 0x2d946eb7868ea395, + 0xba3c248d21942e09, + 0xe7223645bfde3983, + 0xff64feb902e41bb1, + 0xc97741630d10d957, + 0xc3cb1722b58d4ecc, + 0xa27aec719cae0c3b, + 0x99fecb51a48c15fb, + 0x1465ac826d27332b, + 0xe1bd047ad75ebf01, + 0x79f733af941960c5, + 0x672ec96c41a3c475, + 0xc27feba6524684f3, + 0x64efd0fd75e38734, + 0xed9e60040743ae18, + 0xfb8e2993b9ef144d, + 0x38453eb10c625a81, + 0x6978480742355c12, + 0x48cf42ce14a6ee9e, + 0x1cac1fd606312dce, + 0x7b82d6ba4792e9bb, + 0x9d141c7b1f871a07, + 0x5616b80dc11c4a2e, + 0xb849c198f21fa777, + 0x7ca91801c8d9a506, + 0xb1348e487ec273ad, + 0x41b20d1e987b3a44, + 0x7460ab55a3cfbbe3, + 0x84e628034576f20a, + 0x1b87d16d897a6173, + 0x0fe27defe45d5258, + 0x83cde6b8ca3dbeb7, + 0x0c23647ed01d1119, + 0x7a362a3ea0592384, + 0xb61f40f3f1893f10, + 0x75d457d1440471dc, + 0x4558da34237035b8, + 0xdca6116587fc2043, + 0x8d9b67d3c9ab26d0, + 0x2b0b5c88ee0e2517, + 0x6fe77a382ab5da90, + 0x269cc472d9d8fe31, + 0x63c41e46faa8cb89, + 0xb7abbc771642f52f, + 0x7d1de4852f126f39, + 0xa8c6ba3024339ba0, + 0x600507d7cee888c8, + 0x8fee82c61a20afae, + 0x57a2448926d78011, + 0xfca5e72836a458f0, + 0x072bcebb8f4b4cbd, + 0x497bbe4af36d24a1, + 0x3cafe99bb769557d, + 0x12fa9ebd05a7b5a9, + 0xe8c04baa5b836bdb, + 0x4273148fac3b7905, + 0x908384812851c121, + 0xe557d3506c55b0fd, + 0x72ff996acb4f3d61, + 0x3eda0c8e64e2dc03, + 0xf0868356e6b949e9, + 0x04ead72abb0b0ffc, + 0x17a4b5135967706a, + 0xe3c8e16f04d5367f, + 0xf84f30028daf570c, + 0x1846c8fcbd3a2232, + 0x5b8120f7f6ca9108, + 0xd46fa231ecea3ea6, + 0x334d947453340725, + 0x58403966c28ad249, + 0xbed6f3a79a9f21f5, + 0x68ccb483a5fe962d, + 0xd085751b57e1315a, + 0xfed0023de52fd18e, + 0x4b0e5b5f20e6addf, + 0x1a332de96eb1ab4c, + 0xa3ce10f57b65c604, + 0x108f7ba8d62c3cd7, + 0xab07a3a11073d8e1, + 0x6b0dad1291bed56c, + 0xf2f366433532c097, + 0x2e557726b2cee0d4, + 0x0000000000000000, + 0xcb02a476de9b5029, + 0xe4e32fd48b9e7ac2, + 0x734b65ee2c84f75e, + 0x6e5386bccd7e10af, + 0x01b4fc84e7cbca3f, + 0xcfe8735c65905fd5, + 0x3613bfda0ff4c2e6, + 0x113b872c31e7f6e8, + 0x2fe18ba255052aeb, + 0xe974b72ebc48a1e4, + 0x0abc5641b89d979b, + 0xb46aa5e62202b66e, + 0x44ec26b0c4bbff87, + 0xa6903b5b27a503c7, + 0x7f680190fc99e647, + 0x97a84a3aa71a8d9c, + 0xdd12ede16037ea7c, + 0xc554251ddd0dc84e, + 0x88c54c7d956be313, + 0x4d91696048662b5d, + 0xb08072cc9909b992, + 0xb5de5962c5c97c51, + 0x81b803ad19b637c9, + 0xb2f597d94a8230ec, + 0x0b08aac55f565da4, + 0xf1327fd2017283d6, + 0xad98919e78f35e63, + 0x6ab9519676751f53, + 0x24e921670a53774f, + 0xb9fd3d1c15d46d48, + 0x92f66194fbda485f, + 0x5a35dc7311015b37, + 0xded3f4705477a93d, + 0xc00a0eb381cd0d8d, + 0xbb88d809c65fe436, + 0x16104997beacba55, + 0x21b70ac95693b28c, + 0x59f4c5e225411876, + 0xd5db5eb50b21f499, + 0x55d7a19cf55c096f, + 0xa97246b4c3f8519f, + 0x8552d487a2bd3835, + 0x54635d181297c350, + 0x23c2efdc85183bf2, + 0x9f61f96ecc0c9379, + 0x534893a39ddc8fed, + 0x5edf0b59aa0a54cb, + 0xac2c6d1a9f38945c, + 0xd7aebba0d8aa7de7, + 0x2abfa00c09c5ef28, + 0xd84cc64f3cf72fbf, + 0x2003f64db15878b3, + 0xa724c7dfc06ec9f8, + 0x069f323f68808682, + 0xcc296acd51d01c94, + 0x055e2bae5cc0c5c3, + 0x6270e2c21d6301b6, + 0x3b842720382219c0, + 0xd2f0900e846ab824, + 0x52fc6f277a1745d2, + 0xc6953c8ce94d8b0f, + 0xe009f8fe3095753e, + 0x655b2c7992284d0b, + 0x984a37d54347dfc4, + 0xeab5aebf8808e2a5, + 0x9a3fd2c090cc56ba, + 0x9ca0e0fff84cd038, + 0x4c2595e4afade162, + 0xdf6708f4b3bc6302, + 0xbf620f237d54ebca, + 0x93429d101c118260, + 0x097d4fd08cddd4da, + 0x8c2f9b572e60ecef, + 0x708a7c7f18c4b41f, + 0x3a30dba4dfe9d3ff, + 0x4006f19a7fb0f07b, + 0x5f6bf7dd4dc19ef4, + 0x1f6d064732716e8f, + 0xf9fbcc866a649d33, + 0x308c8de567744464, + 0x8971b0f972a0292c, + 0xd61a47243f61b7d8, + 0xefeb8511d4c82766, + 0x961cb6be40d147a3, + 0xaab35f25f7b812de, + 0x76154e407044329d, + 0x513d76b64e570693, + 0xf3479ac7d2f90aa8, + 0x9b8b2e4477079c85, + 0x297eb99d3d85ac69, + }, + { + 0x3ef29d249b2c0a19, + 0xe9e16322b6f8622f, + 0x5536994047757f7a, + 0x9f4d56d5a47b0b33, + 0x822567466aa1174c, + 0xb8f5057deb082fb2, + 0xcc48c10bf4475f53, + 0x373088d4275dec3a, + 0x968f4325180aed10, + 0x173d232cf7016151, + 0xae4ed09f946fcc13, + 0xfd4b4741c4539873, + 0x1b5b3f0dd9933765, + 0x2ffcb0967b644052, + 0xe02376d20a89840c, + 0xa3ae3a70329b18d7, + 0x419cbd2335de8526, + 0xfafebf115b7c3199, + 0x0397074f85aa9b0d, + 0xc58ad4fb4836b970, + 0xbec60be3fc4104a8, + 0x1eff36dc4b708772, + 0x131fdc33ed8453b6, + 0x0844e33e341764d3, + 0x0ff11b6eab38cd39, + 0x64351f0a7761b85a, + 0x3b5694f509cfba0e, + 0x30857084b87245d0, + 0x47afb3bd2297ae3c, + 0xf2ba5c2f6f6b554a, + 0x74bdc4761f4f70e1, + 0xcfdfc64471edc45e, + 0xe610784c1dc0af16, + 0x7aca29d63c113f28, + 0x2ded411776a859af, + 0xac5f211e99a3d5ee, + 0xd484f949a87ef33b, + 0x3ce36ca596e013e4, + 0xd120f0983a9d432c, + 0x6bc40464dc597563, + 0x69d5f5e5d1956c9e, + 0x9ae95f043698bb24, + 0xc9ecc8da66a4ef44, + 0xd69508c8a5b2eac6, + 0xc40c2235c0503b80, + 0x38c193ba8c652103, + 0x1ceec75d46bc9e8f, + 0xd331011937515ad1, + 0xd8e2e56886eca50f, + 0xb137108d5779c991, + 0x709f3b6905ca4206, + 0x4feb50831680caef, + 0xec456af3241bd238, + 0x58d673afe181abbe, + 0x242f54e7cad9bf8c, + 0x0211f1810dcc19fd, + 0x90bc4dbb0f43c60a, + 0x9518446a9da0761d, + 0xa1bfcbf13f57012a, + 0x2bde4f8961e172b5, + 0x27b853a84f732481, + 0xb0b1e643df1f4b61, + 0x18cc38425c39ac68, + 0xd2b7f7d7bf37d821, + 0x3103864a3014c720, + 0x14aa246372abfa5c, + 0x6e600db54ebac574, + 0x394765740403a3f3, + 0x09c215f0bc71e623, + 0x2a58b947e987f045, + 0x7b4cdf18b477bdd8, + 0x9709b5eb906c6fe0, + 0x73083c268060d90b, + 0xfedc400e41f9037e, + 0x284948c6e44be9b8, + 0x728ecae808065bfb, + 0x06330e9e17492b1a, + 0x5950856169e7294e, + 0xbae4f4fce6c4364f, + 0xca7bcf95e30e7449, + 0x7d7fd186a33e96c2, + 0x52836110d85ad690, + 0x4dfaa1021b4cd312, + 0x913abb75872544fa, + 0xdd46ecb9140f1518, + 0x3d659a6b1e869114, + 0xc23f2cabd719109a, + 0xd713fe062dd46836, + 0xd0a60656b2fbc1dc, + 0x221c5a79dd909496, + 0xefd26dbca1b14935, + 0x0e77eda0235e4fc9, + 0xcbfd395b6b68f6b9, + 0x0de0eaefa6f4d4c4, + 0x0422ff1f1a8532e7, + 0xf969b85eded6aa94, + 0x7f6e2007aef28f3f, + 0x3ad0623b81a938fe, + 0x6624ee8b7aada1a7, + 0xb682e8ddc856607b, + 0xa78cc56f281e2a30, + 0xc79b257a45faa08d, + 0x5b4174e0642b30b3, + 0x5f638bff7eae0254, + 0x4bc9af9c0c05f808, + 0xce59308af98b46ae, + 0x8fc58da9cc55c388, + 0x803496c7676d0eb1, + 0xf33caae1e70dd7ba, + 0xbb6202326ea2b4bf, + 0xd5020f87201871cb, + 0x9d5ca754a9b712ce, + 0x841669d87de83c56, + 0x8a6184785eb6739f, + 0x420bba6cb0741e2b, + 0xf12d5b60eac1ce47, + 0x76ac35f71283691c, + 0x2c6bb7d9fecedb5f, + 0xfccdb18f4c351a83, + 0x1f79c012c3160582, + 0xf0abadae62a74cb7, + 0xe1a5801c82ef06fc, + 0x67a21845f2cb2357, + 0x5114665f5df04d9d, + 0xbf40fd2d74278658, + 0xa0393d3fb73183da, + 0x05a409d192e3b017, + 0xa9fb28cf0b4065f9, + 0x25a9a22942bf3d7c, + 0xdb75e22703463e02, + 0xb326e10c5ab5d06c, + 0xe7968e8295a62de6, + 0xb973f3b3636ead42, + 0xdf571d3819c30ce5, + 0xee549b7229d7cbc5, + 0x12992afd65e2d146, + 0xf8ef4e9056b02864, + 0xb7041e134030e28b, + 0xc02edd2adad50967, + 0x932b4af48ae95d07, + 0x6fe6fb7bc6dc4784, + 0x239aacb755f61666, + 0x401a4bedbdb807d6, + 0x485ea8d389af6305, + 0xa41bc220adb4b13d, + 0x753b32b89729f211, + 0x997e584bb3322029, + 0x1d683193ceda1c7f, + 0xff5ab6c0c99f818e, + 0x16bbd5e27f67e3a1, + 0xa59d34ee25d233cd, + 0x98f8ae853b54a2d9, + 0x6df70afacb105e79, + 0x795d2e99b9bba425, + 0x8e437b6744334178, + 0x0186f6ce886682f0, + 0xebf092a3bb347bd2, + 0xbcd7fa62f18d1d55, + 0xadd9d7d011c5571e, + 0x0bd3e471b1bdffde, + 0xaa6c2f808eeafef4, + 0x5ee57d31f6c880a4, + 0xf50fa47ff044fca0, + 0x1addc9c351f5b595, + 0xea76646d3352f922, + 0x0000000000000000, + 0x85909f16f58ebea6, + 0x46294573aaf12ccc, + 0x0a5512bf39db7d2e, + 0x78dbd85731dd26d5, + 0x29cfbe086c2d6b48, + 0x218b5d36583a0f9b, + 0x152cd2adfacd78ac, + 0x83a39188e2c795bc, + 0xc3b9da655f7f926a, + 0x9ecba01b2c1d89c3, + 0x07b5f8509f2fa9ea, + 0x7ee8d6c926940dcf, + 0x36b67e1aaf3b6eca, + 0x86079859702425ab, + 0xfb7849dfd31ab369, + 0x4c7c57cc932a51e2, + 0xd96413a60e8a27ff, + 0x263ea566c715a671, + 0x6c71fc344376dc89, + 0x4a4f595284637af8, + 0xdaf314e98b20bcf2, + 0x572768c14ab96687, + 0x1088db7c682ec8bb, + 0x887075f9537a6a62, + 0x2e7a4658f302c2a2, + 0x619116dbe582084d, + 0xa87dde018326e709, + 0xdcc01a779c6997e8, + 0xedc39c3dac7d50c8, + 0xa60a33a1a078a8c0, + 0xc1a82be452b38b97, + 0x3f746bea134a88e9, + 0xa228ccbebafd9a27, + 0xabead94e068c7c04, + 0xf48952b178227e50, + 0x5cf48cb0fb049959, + 0x6017e0156de48abd, + 0x4438b4f2a73d3531, + 0x8c528ae649ff5885, + 0xb515ef924dfcfb76, + 0x0c661c212e925634, + 0xb493195cc59a7986, + 0x9cda519a21d1903e, + 0x32948105b5be5c2d, + 0x194ace8cd45f2e98, + 0x438d4ca238129cdb, + 0x9b6fa9cabefe39d4, + 0x81b26009ef0b8c41, + 0xded1ebf691a58e15, + 0x4e6da64d9ee6481f, + 0x54b06f8ecf13fd8a, + 0x49d85e1d01c9e1f5, + 0xafc826511c094ee3, + 0xf698a33075ee67ad, + 0x5ac7822eec4db243, + 0x8dd47c28c199da75, + 0x89f68337db1ce892, + 0xcdce37c57c21dda3, + 0x530597de503c5460, + 0x6a42f2aa543ff793, + 0x5d727a7e73621ba9, + 0xe232875307459df1, + 0x56a19e0fc2dfe477, + 0xc61dd3b4cd9c227d, + 0xe5877f03986a341b, + 0x949eb2a415c6f4ed, + 0x6206119460289340, + 0x6380e75ae84e11b0, + 0x8be772b6d6d0f16f, + 0x50929091d596cf6d, + 0xe86795ec3e9ee0df, + 0x7cf927482b581432, + 0xc86a3e14eec26db4, + 0x7119cda78dacc0f6, + 0xe40189cd100cb6eb, + 0x92adbc3a028fdff7, + 0xb2a017c2d2d3529c, + 0x200dabf8d05c8d6b, + 0x34a78f9ba2f77737, + 0xe3b4719d8f231f01, + 0x45be423c2f5bb7c1, + 0xf71e55fefd88e55d, + 0x6853032b59f3ee6e, + 0x65b3e9c4ff073aaa, + 0x772ac3399ae5ebec, + 0x87816e97f842a75b, + 0x110e2db2e0484a4b, + 0x331277cb3dd8dedd, + 0xbd510cac79eb9fa5, + 0x352179552a91f5c7, + }, + { + 0x05ba7bc82c9b3220, + 0x31a54665f8b65e4f, + 0xb1b651f77547f4d4, + 0x8bfa0d857ba46682, + 0x85a96c5aa16a98bb, + 0x990faef908eb79c9, + 0xa15e37a247f4a62d, + 0x76857dcd5d27741e, + 0xf8c50b800a1820bc, + 0xbe65dcb201f7a2b4, + 0x666d1b986f9426e7, + 0x4cc921bf53c4e648, + 0x95410a0f93d9ca42, + 0x20cdccaa647ba4ef, + 0x429a4060890a1871, + 0x0c4ea4f69b32b38b, + 0xccda362dde354cd3, + 0x96dc23bc7c5b2fa9, + 0xc309bb68aa851ab3, + 0xd26131a73648e013, + 0x021dc52941fc4db2, + 0xcd5adab7704be48a, + 0xa77965d984ed71e6, + 0x32386fd61734bba4, + 0xe82d6dd538ab7245, + 0x5c2147ea6177b4b1, + 0x5da1ab70cf091ce8, + 0xac907fce72b8bdff, + 0x57c85dfd972278a8, + 0xa4e44c6a6b6f940d, + 0x3851995b4f1fdfe4, + 0x62578ccaed71bc9e, + 0xd9882bb0c01d2c0a, + 0x917b9d5d113c503b, + 0xa2c31e11a87643c6, + 0xe463c923a399c1ce, + 0xf71686c57ea876dc, + 0x87b4a973e096d509, + 0xaf0d567d9d3a5814, + 0xb40c2a3f59dcc6f4, + 0x3602f88495d121dd, + 0xd3e1dd3d9836484a, + 0xf945e71aa46688e5, + 0x7518547eb2a591f5, + 0x9366587450c01d89, + 0x9ea81018658c065b, + 0x4f54080cbc4603a3, + 0x2d0384c65137bf3d, + 0xdc325078ec861e2a, + 0xea30a8fc79573ff7, + 0x214d2030ca050cb6, + 0x65f0322b8016c30c, + 0x69be96dd1b247087, + 0xdb95ee9981e161b8, + 0xd1fc1814d9ca05f8, + 0x820ed2bbcc0de729, + 0x63d76050430f14c7, + 0x3bccb0e8a09d3a0f, + 0x8e40764d573f54a2, + 0x39d175c1e16177bd, + 0x12f5a37c734f1f4b, + 0xab37c12f1fdfc26d, + 0x5648b167395cd0f1, + 0x6c04ed1537bf42a7, + 0xed97161d14304065, + 0x7d6c67daab72b807, + 0xec17fa87ba4ee83c, + 0xdfaf79cb0304fbc1, + 0x733f060571bc463e, + 0x78d61c1287e98a27, + 0xd07cf48e77b4ada1, + 0xb9c262536c90dd26, + 0xe2449b5860801605, + 0x8fc09ad7f941fcfb, + 0xfad8cea94be46d0e, + 0xa343f28b0608eb9f, + 0x9b126bd04917347b, + 0x9a92874ae7699c22, + 0x1b017c42c4e69ee0, + 0x3a4c5c720ee39256, + 0x4b6e9f5e3ea399da, + 0x6ba353f45ad83d35, + 0xe7fee0904c1b2425, + 0x22d009832587e95d, + 0x842980c00f1430e2, + 0xc6b3c0a0861e2893, + 0x087433a419d729f2, + 0x341f3dadd42d6c6f, + 0xee0a3faefbb2a58e, + 0x4aee73c490dd3183, + 0xaab72db5b1a16a34, + 0xa92a04065e238fdf, + 0x7b4b35a1686b6fcc, + 0x6a23bf6ef4a6956c, + 0x191cb96b851ad352, + 0x55d598d4d6de351a, + 0xc9604de5f2ae7ef3, + 0x1ca6c2a3a981e172, + 0xde2f9551ad7a5398, + 0x3025aaff56c8f616, + 0x15521d9d1e2860d9, + 0x506fe31cfa45073a, + 0x189c55f12b647b0b, + 0x0180ec9aae7ea859, + 0x7cec8b40050c105e, + 0x2350e5198bf94104, + 0xef8ad33455cc0dd7, + 0x07a7bee16d677f92, + 0xe5e325b90de76997, + 0x5a061591a26e637a, + 0xb611ef1618208b46, + 0x09f4df3eb7a981ab, + 0x1ebb078ae87dacc0, + 0xb791038cb65e231f, + 0x0fd38d4574b05660, + 0x67edf702c1ea8ebe, + 0xba5f4be0831238cd, + 0xe3c477c2cefebe5c, + 0x0dce486c354c1bd2, + 0x8c5db36416c31910, + 0x26ea9ed1a7627324, + 0x039d29b3ef82e5eb, + 0x9f28fc82cbf2ae02, + 0xa8aae89cf05d2786, + 0x431aacfa2774b028, + 0xcf471f9e31b7a938, + 0x581bd0b8e3922ec8, + 0xbc78199b400bef06, + 0x90fb71c7bf42f862, + 0x1f3beb1046030499, + 0x683e7a47b55ad8de, + 0x988f4263a695d190, + 0xd808c72a6e638453, + 0x0627527bc319d7cb, + 0xebb04466d72997ae, + 0xe67e0c0ae2658c7c, + 0x14d2f107b056c880, + 0x7122c32c30400b8c, + 0x8a7ae11fd5dacedb, + 0xa0dedb38e98a0e74, + 0xad109354dcc615a6, + 0x0be91a17f655cc19, + 0x8ddd5ffeb8bdb149, + 0xbfe53028af890aed, + 0xd65ba6f5b4ad7a6a, + 0x7956f0882997227e, + 0x10e8665532b352f9, + 0x0e5361dfdacefe39, + 0xcec7f3049fc90161, + 0xff62b561677f5f2e, + 0x975ccf26d22587f0, + 0x51ef0f86543baf63, + 0x2f1e41ef10cbf28f, + 0x52722635bbb94a88, + 0xae8dbae73344f04d, + 0x410769d36688fd9a, + 0xb3ab94de34bbb966, + 0x801317928df1aa9b, + 0xa564a0f0c5113c54, + 0xf131d4bebdb1a117, + 0x7f71a2f3ea8ef5b5, + 0x40878549c8f655c3, + 0x7ef14e6944f05dec, + 0xd44663dcf55137d8, + 0xf2acfd0d523344fc, + 0x0000000000000000, + 0x5fbc6e598ef5515a, + 0x16cf342ef1aa8532, + 0xb036bd6ddb395c8d, + 0x13754fe6dd31b712, + 0xbbdfa77a2d6c9094, + 0x89e7c8ac3a582b30, + 0x3c6b0e09cdfa459d, + 0xc4ae0589c7e26521, + 0x49735a777f5fd468, + 0xcafd64561d2c9b18, + 0xda1502032f9fc9e1, + 0x8867243694268369, + 0x3782141e3baf8984, + 0x9cb5d53124704be9, + 0xd7db4a6f1ad3d233, + 0xa6f989432a93d9bf, + 0x9d3539ab8a0ee3b0, + 0x53f2caaf15c7e2d1, + 0x6e19283c76430f15, + 0x3debe2936384edc4, + 0x5e3c82c3208bf903, + 0x33b8834cb94a13fd, + 0x6470deb12e686b55, + 0x359fd1377a53c436, + 0x61caa57902f35975, + 0x043a975282e59a79, + 0xfd7f70482683129c, + 0xc52ee913699ccd78, + 0x28b9ff0e7dac8d1d, + 0x5455744e78a09d43, + 0xcb7d88ccb3523341, + 0x44bd121b4a13cfba, + 0x4d49cd25fdba4e11, + 0x3e76cb208c06082f, + 0x3ff627ba2278a076, + 0xc28957f204fbb2ea, + 0x453dfe81e46d67e3, + 0x94c1e6953da7621b, + 0x2c83685cff491764, + 0xf32c1197fc4deca5, + 0x2b24d6bd922e68f6, + 0xb22b78449ac5113f, + 0x48f3b6edd1217c31, + 0x2e9ead75beb55ad6, + 0x174fd8b45fd42d6b, + 0x4ed4e4961238abfa, + 0x92e6b4eefebeb5d0, + 0x46a0d7320bef8208, + 0x47203ba8a5912a51, + 0x24f75bf8e69e3e96, + 0xf0b1382413cf094e, + 0xfee259fbc901f777, + 0x276a724b091cdb7d, + 0xbdf8f501ee75475f, + 0x599b3c224dec8691, + 0x6d84018f99c1eafe, + 0x7498b8e41cdb39ac, + 0xe0595e71217c5bb7, + 0x2aa43a273c50c0af, + 0xf50b43ec3f543b6e, + 0x838e3e2162734f70, + 0xc09492db4507ff58, + 0x72bfea9fdfc2ee67, + 0x11688acf9ccdfaa0, + 0x1a8190d86a9836b9, + 0x7acbd93bc615c795, + 0xc7332c3a286080ca, + 0x863445e94ee87d50, + 0xf6966a5fd0d6de85, + 0xe9ad814f96d5da1c, + 0x70a22fb69e3ea3d5, + 0x0a69f68d582b6440, + 0xb8428ec9c2ee757f, + 0x604a49e3ac8df12c, + 0x5b86f90b0c10cb23, + 0xe1d9b2eb8f02f3ee, + 0x29391394d3d22544, + 0xc8e0a17f5cd0d6aa, + 0xb58cc6a5f7a26ead, + 0x8193fb08238f02c2, + 0xd5c68f465b2f9f81, + 0xfcff9cd288fdbac5, + 0x77059157f359dc47, + 0x1d262e3907ff492b, + 0xfb582233e59ac557, + 0xddb2bce242f8b673, + 0x2577b76248e096cf, + 0x6f99c4a6d83da74c, + 0xc1147e41eb795701, + 0xf48baf76912a9337, + }, + { + 0x45b268a93acde4cc, + 0xaf7f0be884549d08, + 0x048354b3c1468263, + 0x925435c2c80efed2, + 0xee4e37f27fdffba7, + 0x167a33920c60f14d, + 0xfb123b52ea03e584, + 0x4a0cab53fdbb9007, + 0x9deaf6380f788a19, + 0xcb48ec558f0cb32a, + 0xb59dc4b2d6fef7e0, + 0xdcdbca22f4f3ecb6, + 0x11df5813549a9c40, + 0xe33fdedf568aced3, + 0xa0c1c8124322e9c3, + 0x07a56b8158fa6d0d, + 0x77279579b1e1f3dd, + 0xd9b18b74422ac004, + 0xb8ec2d9fffabc294, + 0xf4acf8a82d75914f, + 0x7bbf69b1ef2b6878, + 0xc4f62faf487ac7e1, + 0x76ce809cc67e5d0c, + 0x6711d88f92e4c14c, + 0x627b99d9243dedfe, + 0x234aa5c3dfb68b51, + 0x909b1f15262dbf6d, + 0x4f66ea054b62bcb5, + 0x1ae2cf5a52aa6ae8, + 0xbea053fbd0ce0148, + 0xed6808c0e66314c9, + 0x43fe16cd15a82710, + 0xcd049231a06970f6, + 0xe7bc8a6c97cc4cb0, + 0x337ce835fcb3b9c0, + 0x65def2587cc780f3, + 0x52214ede4132bb50, + 0x95f15e4390f493df, + 0x870839625dd2e0f1, + 0x41313c1afb8b66af, + 0x91720af051b211bc, + 0x477d427ed4eea573, + 0x2e3b4ceef6e3be25, + 0x82627834eb0bcc43, + 0x9c03e3dd78e724c8, + 0x2877328ad9867df9, + 0x14b51945e243b0f2, + 0x574b0f88f7eb97e2, + 0x88b6fa989aa4943a, + 0x19c4f068cb168586, + 0x50ee6409af11faef, + 0x7df317d5c04eaba4, + 0x7a567c5498b4c6a9, + 0xb6bbfb804f42188e, + 0x3cc22bcf3bc5cd0b, + 0xd04336eaaa397713, + 0xf02fac1bec33132c, + 0x2506dba7f0d3488d, + 0xd7e65d6bf2c31a1e, + 0x5eb9b2161ff820f5, + 0x842e0650c46e0f9f, + 0x716beb1d9e843001, + 0xa933758cab315ed4, + 0x3fe414fda2792265, + 0x27c9f1701ef00932, + 0x73a4c1ca70a771be, + 0x94184ba6e76b3d0e, + 0x40d829ff8c14c87e, + 0x0fbec3fac77674cb, + 0x3616a9634a6a9572, + 0x8f139119c25ef937, + 0xf545ed4d5aea3f9e, + 0xe802499650ba387b, + 0x6437e7bd0b582e22, + 0xe6559f89e053e261, + 0x80ad52e305288dfc, + 0x6dc55a23e34b9935, + 0xde14e0f51ad0ad09, + 0xc6390578a659865e, + 0x96d7617109487cb1, + 0xe2d6cb3a21156002, + 0x01e915e5779faed1, + 0xadb0213f6a77dcb7, + 0x9880b76eb9a1a6ab, + 0x5d9f8d248644cf9b, + 0xfd5e4536c5662658, + 0xf1c6b9fe9bacbdfd, + 0xeacd6341be9979c4, + 0xefa7221708405576, + 0x510771ecd88e543e, + 0xc2ba51cb671f043d, + 0x0ad482ac71af5879, + 0xfe787a045cdac936, + 0xb238af338e049aed, + 0xbd866cc94972ee26, + 0x615da6ebbd810290, + 0x3295fdd08b2c1711, + 0xf834046073bf0aea, + 0xf3099329758ffc42, + 0x1caeb13e7dcfa934, + 0xba2307481188832b, + 0x24efce42874ce65c, + 0x0e57d61fb0e9da1a, + 0xb3d1bad6f99b343c, + 0xc0757b1c893c4582, + 0x2b510db8403a9297, + 0x5c7698c1f1db614a, + 0x3e0d0118d5e68cb4, + 0xd60f488e855cb4cf, + 0xae961e0df3cb33d9, + 0x3a8e55ab14a00ed7, + 0x42170328623789c1, + 0x838b6dd19c946292, + 0x895fef7ded3b3aeb, + 0xcfcbb8e64e4a3149, + 0x064c7e642f65c3dc, + 0x3d2b3e2a4c5a63da, + 0x5bd3f340a9210c47, + 0xb474d157a1615931, + 0xac5934da1de87266, + 0x6ee365117af7765b, + 0xc86ed36716b05c44, + 0x9ba6885c201d49c5, + 0xb905387a88346c45, + 0x131072c4bab9ddff, + 0xbf49461ea751af99, + 0xd52977bc1ce05ba1, + 0xb0f785e46027db52, + 0x546d30ba6e57788c, + 0x305ad707650f56ae, + 0xc987c682612ff295, + 0xa5ab8944f5fbc571, + 0x7ed528e759f244ca, + 0x8ddcbbce2c7db888, + 0xaa154abe328db1ba, + 0x1e619be993ece88b, + 0x09f2bd9ee813b717, + 0x7401aa4b285d1cb3, + 0x21858f143195caee, + 0x48c381841398d1b8, + 0xfcb750d3b2f98889, + 0x39a86a998d1ce1b9, + 0x1f888e0ce473465a, + 0x7899568376978716, + 0x02cf2ad7ee2341bf, + 0x85c713b5b3f1a14e, + 0xff916fe12b4567e7, + 0x7c1a0230b7d10575, + 0x0c98fcc85eca9ba5, + 0xa3e7f720da9e06ad, + 0x6a6031a2bbb1f438, + 0x973e74947ed7d260, + 0x2cf4663918c0ff9a, + 0x5f50a7f368678e24, + 0x34d983b4a449d4cd, + 0x68af1b755592b587, + 0x7f3c3d022e6dea1b, + 0xabfc5f5b45121f6b, + 0x0d71e92d29553574, + 0xdffdf5106d4f03d8, + 0x081ba87b9f8c19c6, + 0xdb7ea1a3ac0981bb, + 0xbbca12ad66172dfa, + 0x79704366010829c7, + 0x179326777bff5f9c, + 0x0000000000000000, + 0xeb2476a4c906d715, + 0x724dd42f0738df6f, + 0xb752ee6538ddb65f, + 0x37ffbc863df53ba3, + 0x8efa84fcb5c157e6, + 0xe9eb5c73272596aa, + 0x1b0bdabf2535c439, + 0x86e12c872a4d4e20, + 0x9969a28bce3e087a, + 0xfafb2eb79d9c4b55, + 0x056a4156b6d92cb2, + 0x5a3ae6a5debea296, + 0x22a3b026a8292580, + 0x53c85b3b36ad1581, + 0xb11e900117b87583, + 0xc51f3a4a3fe56930, + 0xe019e1edcf3621bd, + 0xec811d2591fcba18, + 0x445b7d4c4d524a1d, + 0xa8da6069dcaef005, + 0x58f5cc72309de329, + 0xd4c062596b7ff570, + 0xce22ad0339d59f98, + 0x591cd99747024df8, + 0x8b90c5aa03187b54, + 0xf663d27fc356d0f0, + 0xd8589e9135b56ed5, + 0x35309651d3d67a1c, + 0x12f96721cd26732e, + 0xd28c1c3d441a36ac, + 0x492a946164077f69, + 0x2d1d73dc6f5f514b, + 0x6f0a70f40d68d88a, + 0x60b4b30eca1eac41, + 0xd36509d83385987d, + 0x0b3d97490630f6a8, + 0x9eccc90a96c46577, + 0xa20ee2c5ad01a87c, + 0xe49ab55e0e70a3de, + 0xa4429ca182646ba0, + 0xda97b446db962f6a, + 0xcced87d4d7f6de27, + 0x2ab8185d37a53c46, + 0x9f25dcefe15bcba6, + 0xc19c6ef9fea3eb53, + 0xa764a3931bd884ce, + 0x2fd2590b817c10f4, + 0x56a21a6d80743933, + 0xe573a0bb79ef0d0f, + 0x155c0ca095dc1e23, + 0x6c2c4fc694d437e4, + 0x10364df623053291, + 0xdd32dfc7836c4267, + 0x03263f3299bcef6e, + 0x66f8cd6ae57b6f9d, + 0x8c35ae2b5be21659, + 0x31b3c2e21290f87f, + 0x93bd2027bf915003, + 0x69460e90220d1b56, + 0x299e276fae19d328, + 0x63928c3c53a2432f, + 0x7082fef8e91b9ed0, + 0xbc6f792c3eed40f7, + 0x4c40d537d2de53db, + 0x75e8bfae5fc2b262, + 0x4da9c0d2a541fd0a, + 0x4e8fffe03cfd1264, + 0x2620e495696fa7e3, + 0xe1f0f408b8a98f6c, + 0xd1aa230fdda6d9c2, + 0xc7d0109dd1c6288f, + 0x8a79d04f7487d585, + 0x4694579ba3710ba2, + 0x38417f7cfa834f68, + 0x1d47a4db0a5007e5, + 0x206c9af1460a643f, + 0xa128ddf734bd4712, + 0x8144470672b7232d, + 0xf2e086cc02105293, + 0x182de58dbc892b57, + 0xcaa1f9b0f8931dfb, + 0x6b892447cc2e5ae9, + 0xf9dd11850420a43b, + 0x4be5beb68a243ed6, + 0x5584255f19c8d65d, + 0x3b67404e633fa006, + 0xa68db6766c472a1f, + 0xf78ac79ab4c97e21, + 0xc353442e1080aaec, + 0x9a4f9db95782e714, + }, + { + 0xc811a8058c3f55de, + 0x65f5b43196b50619, + 0xf74f96b1d6706e43, + 0x859d1e8bcb43d336, + 0x5aab8a85ccfa3d84, + 0xf9c7bf99c295fcfd, + 0xa21fd5a1de4b630f, + 0xcdb3ef763b8b456d, + 0x803f59f87cf7c385, + 0xb27c73be5f31913c, + 0x98e3ac6633b04821, + 0xbf61674c26b8f818, + 0x0ffbc995c4c130c8, + 0xaaa0862010761a98, + 0x6057f342210116aa, + 0xf63c760c0654cc35, + 0x2ddb45cc667d9042, + 0xbcf45a964bd40382, + 0x68e8a0c3ef3c6f3d, + 0xa7bd92d269ff73bc, + 0x290ae20201ed2287, + 0xb7de34cde885818f, + 0xd901eea7dd61059b, + 0xd6fa273219a03553, + 0xd56f1ae874cccec9, + 0xea31245c2e83f554, + 0x7034555da07be499, + 0xce26d2ac56e7bef7, + 0xfd161857a5054e38, + 0x6a0e7da4527436d1, + 0x5bd86a381cde9ff2, + 0xcaf7756231770c32, + 0xb09aaed9e279c8d0, + 0x5def1091c60674db, + 0x111046a2515e5045, + 0x23536ce4729802fc, + 0xc50cbcf7f5b63cfa, + 0x73a16887cd171f03, + 0x7d2941afd9f28dbd, + 0x3f5e3eb45a4f3b9d, + 0x84eefe361b677140, + 0x3db8e3d3e7076271, + 0x1a3a28f9f20fd248, + 0x7ebc7c75b49e7627, + 0x74e5f293c7eb565c, + 0x18dcf59e4f478ba4, + 0x0c6ef44fa9adcb52, + 0xc699812d98dac760, + 0x788b06dc6e469d0e, + 0xfc65f8ea7521ec4e, + 0x30a5f7219e8e0b55, + 0x2bec3f65bca57b6b, + 0xddd04969baf1b75e, + 0x99904cdbe394ea57, + 0x14b201d1e6ea40f6, + 0xbbb0c08241284add, + 0x50f20463bf8f1dff, + 0xe8d7f93b93cbacb8, + 0x4d8cb68e477c86e8, + 0xc1dd1b3992268e3f, + 0x7c5aa11209d62fcb, + 0x2f3d98abdb35c9ae, + 0x671369562bfd5ff5, + 0x15c1e16c36cee280, + 0x1d7eb2edf8f39b17, + 0xda94d37db00dfe01, + 0x877bc3ec760b8ada, + 0xcb8495dfe153ae44, + 0x05a24773b7b410b3, + 0x12857b783c32abdf, + 0x8eb770d06812513b, + 0x536739b9d2e3e665, + 0x584d57e271b26468, + 0xd789c78fc9849725, + 0xa935bbfa7d1ae102, + 0x8b1537a3dfa64188, + 0xd0cd5d9bc378de7a, + 0x4ac82c9a4d80cfb7, + 0x42777f1b83bdb620, + 0x72d2883a1d33bd75, + 0x5e7a2d4bab6a8f41, + 0xf4daab6bbb1c95d9, + 0x905cffe7fd8d31b6, + 0x83aa6422119b381f, + 0xc0aefb8442022c49, + 0xa0f908c663033ae3, + 0xa428af0804938826, + 0xade41c341a8a53c7, + 0xae7121ee77e6a85d, + 0xc47f5c4a25929e8c, + 0xb538e9aa55cdd863, + 0x06377aa9dad8eb29, + 0xa18ae87bb3279895, + 0x6edfda6a35e48414, + 0x6b7d9d19825094a7, + 0xd41cfa55a4e86cbf, + 0xe5caedc9ea42c59c, + 0xa36c351c0e6fc179, + 0x5181e4de6fabbf89, + 0xfff0c530184d17d4, + 0x9d41eb1584045892, + 0x1c0d525028d73961, + 0xf178ec180ca8856a, + 0x9a0571018ef811cd, + 0x4091a27c3ef5efcc, + 0x19af15239f6329d2, + 0x347450eff91eb990, + 0xe11b4a078dd27759, + 0xb9561de5fc601331, + 0x912f1f5a2da993c0, + 0x1654dcb65ba2191a, + 0x3e2dde098a6b99eb, + 0x8a66d71e0f82e3fe, + 0x8c51adb7d55a08d7, + 0x4533e50f8941ff7f, + 0x02e6dd67bd4859ec, + 0xe068aaba5df6d52f, + 0xc24826e3ff4a75a5, + 0x6c39070d88acddf8, + 0x6486548c4691a46f, + 0xd1bebd26135c7c0c, + 0xb30f93038f15334a, + 0x82d9849fc1bf9a69, + 0x9c320ba85420fae4, + 0xfa528243aff90767, + 0x9ed4d6cfe968a308, + 0xb825fd582c44b147, + 0x9b7691bc5edcb3bb, + 0xc7ea619048fe6516, + 0x1063a61f817af233, + 0x47d538683409a693, + 0x63c2ce984c6ded30, + 0x2a9fdfd86c81d91d, + 0x7b1e3b06032a6694, + 0x666089ebfbd9fd83, + 0x0a598ee67375207b, + 0x07449a140afc495f, + 0x2ca8a571b6593234, + 0x1f986f8a45bbc2fb, + 0x381aa4a050b372c2, + 0x5423a3add81faf3a, + 0x17273c0b8b86bb6c, + 0xfe83258dc869b5a2, + 0x287902bfd1c980f1, + 0xf5a94bd66b3837af, + 0x88800a79b2caba12, + 0x55504310083b0d4c, + 0xdf36940e07b9eeb2, + 0x04d1a7ce6790b2c5, + 0x612413fff125b4dc, + 0x26f12b97c52c124f, + 0x86082351a62f28ac, + 0xef93632f9937e5e7, + 0x3507b052293a1be6, + 0xe72c30ae570a9c70, + 0xd3586041ae1425e0, + 0xde4574b3d79d4cc4, + 0x92ba228040c5685a, + 0xf00b0ca5dc8c271c, + 0xbe1287f1f69c5a6e, + 0xf39e317fb1e0dc86, + 0x495d114020ec342d, + 0x699b407e3f18cd4b, + 0xdca3a9d46ad51528, + 0x0d1d14f279896924, + 0x0000000000000000, + 0x593eb75fa196c61e, + 0x2e4e78160b116bd8, + 0x6d4ae7b058887f8e, + 0xe65fd013872e3e06, + 0x7a6ddbbbd30ec4e2, + 0xac97fc89caaef1b1, + 0x09ccb33c1e19dbe1, + 0x89f3eac462ee1864, + 0x7770cf49aa87adc6, + 0x56c57eca6557f6d6, + 0x03953dda6d6cfb9a, + 0x36928d884456e07c, + 0x1eeb8f37959f608d, + 0x31d6179c4eaaa923, + 0x6fac3ad7e5c02662, + 0x43049fa653991456, + 0xabd3669dc052b8ee, + 0xaf02c153a7c20a2b, + 0x3ccb036e3723c007, + 0x93c9c23d90e1ca2c, + 0xc33bc65e2f6ed7d3, + 0x4cff56339758249e, + 0xb1e94e64325d6aa6, + 0x37e16d359472420a, + 0x79f8e661be623f78, + 0x5214d90402c74413, + 0x482ef1fdf0c8965b, + 0x13f69bc5ec1609a9, + 0x0e88292814e592be, + 0x4e198b542a107d72, + 0xccc00fcbebafe71b, + 0x1b49c844222b703e, + 0x2564164da840e9d5, + 0x20c6513e1ff4f966, + 0xbac3203f910ce8ab, + 0xf2edd1c261c47ef0, + 0x814cb945acd361f3, + 0x95feb8944a392105, + 0x5c9cf02c1622d6ad, + 0x971865f3f77178e9, + 0xbd87ba2b9bf0a1f4, + 0x444005b259655d09, + 0xed75be48247fbc0b, + 0x7596122e17cff42a, + 0xb44b091785e97a15, + 0x966b854e2755da9f, + 0xeee0839249134791, + 0x32432a4623c652b9, + 0xa8465b47ad3e4374, + 0xf8b45f2412b15e8b, + 0x2417f6f078644ba3, + 0xfb2162fe7fdda511, + 0x4bbbcc279da46dc1, + 0x0173e0bdd024a276, + 0x22208c59a2bca08a, + 0x8fc4906db836f34d, + 0xe4b90d743a6667ea, + 0x7147b5e0705f46ef, + 0x2782cb2a1508b039, + 0xec065ef5f45b1e7d, + 0x21b5b183cfd05b10, + 0xdbe733c060295c77, + 0x9fa73672394c017e, + 0xcf55321186c31c81, + 0xd8720e1a0d45a7ed, + 0x3b8f997a3ddf8958, + 0x3afc79c7edfb2b2e, + 0xe9a4198643ef0ece, + 0x5f09cdf67b4e2d37, + 0x4f6a6be9fa34df04, + 0xb6add47038a123f9, + 0x8d224d0a057eaaa1, + 0xc96248b85c1bf7a8, + 0xe3fd9760309a2eb5, + 0x0b2a6e5ba351820d, + 0xeb42c4e1fea75722, + 0x948d58299a1d8373, + 0x7fcf9cc864bad451, + 0xa55b4fb5d4b72a50, + 0x08bf5381ce3d7997, + 0x46a6d8d5e42d04e5, + 0xd22b80fc7e308796, + 0x57b69e77b57354a0, + 0x3969441d8097d0b4, + 0x3330cafbf3e2f0cf, + 0xe28e77dde0be8cc3, + 0x62b12e259c494f46, + 0xa6ce726fb9dbd1ca, + 0x41e242c1eed14dba, + 0x76032ff47aa30fb0, + }, + { + 0xe6f87e5c5b711fd0, + 0x258377800924fa16, + 0xc849e07e852ea4a8, + 0x5b4686a18f06c16a, + 0x0b32e9a2d77b416e, + 0xabda37a467815c66, + 0xf61796a81a686676, + 0xf5dc0b706391954b, + 0x4862f38db7e64bf1, + 0xff5c629a68bd85c5, + 0xcb827da6fcd75795, + 0x66d36daf69b9f089, + 0x356c9f74483d83b0, + 0x7cbcecb1238c99a1, + 0x36a702ac31c4708d, + 0x9eb6a8d02fbcdfd6, + 0x8b19fa51e5b3ae37, + 0x9ccfb5408a127d0b, + 0xbc0c78b508208f5a, + 0xe533e3842288eced, + 0xcec2c7d377c15fd2, + 0xec7817b6505d0f5e, + 0xb94cc2c08336871d, + 0x8c205db4cb0b04ad, + 0x763c855b28a0892f, + 0x588d1b79f6ff3257, + 0x3fecf69e4311933e, + 0x0fc0d39f803a18c9, + 0xee010a26f5f3ad83, + 0x10efe8f4411979a6, + 0x5dcda10c7de93a10, + 0x4a1bee1d1248e92c, + 0x53bff2db21847339, + 0xb4f50ccfa6a23d09, + 0x5fb4bc9cd84798cd, + 0xe88a2d8b071c56f9, + 0x7f7771695a756a9c, + 0xc5f02e71a0ba1ebc, + 0xa663f9ab4215e672, + 0x2eb19e22de5fbb78, + 0x0db9ce0f2594ba14, + 0x82520e6397664d84, + 0x2f031e6a0208ea98, + 0x5c7f2144a1be6bf0, + 0x7a37cb1cd16362db, + 0x83e08e2b4b311c64, + 0xcf70479bab960e32, + 0x856ba986b9dee71e, + 0xb5478c877af56ce9, + 0xb8fe42885f61d6fd, + 0x1bdd0156966238c8, + 0x622157923ef8a92e, + 0xfc97ff42114476f8, + 0x9d7d350856452ceb, + 0x4c90c9b0e0a71256, + 0x2308502dfbcb016c, + 0x2d7a03faa7a64845, + 0xf46e8b38bfc6c4ab, + 0xbdbef8fdd477deba, + 0x3aac4cebc8079b79, + 0xf09cb105e8879d0c, + 0x27fa6a10ac8a58cb, + 0x8960e7c1401d0cea, + 0x1a6f811e4a356928, + 0x90c4fb0773d196ff, + 0x43501a2f609d0a9f, + 0xf7a516e0c63f3796, + 0x1ce4a6b3b8da9252, + 0x1324752c38e08a9b, + 0xa5a864733bec154f, + 0x2bf124575549b33f, + 0xd766db15440dc5c7, + 0xa7d179e39e42b792, + 0xdadf151a61997fd3, + 0x86a0345ec0271423, + 0x38d5517b6da939a4, + 0x6518f077104003b4, + 0x02791d90a5aea2dd, + 0x88d267899c4a5d0a, + 0x930f66df0a2865c2, + 0x4ee9d4204509b08b, + 0x325538916685292a, + 0x412907bfc533a842, + 0xb27e2b62544dc673, + 0x6c5304456295e007, + 0x5af406e95351908a, + 0x1f2f3b6bc123616f, + 0xc37b09dc5255e5c6, + 0x3967d133b1fe6844, + 0x298839c7f0e711e2, + 0x409b87f71964f9a2, + 0xe938adc3db4b0719, + 0x0c0b4e47f9c3ebf4, + 0x5534d576d36b8843, + 0x4610a05aeb8b02d8, + 0x20c3cdf58232f251, + 0x6de1840dbec2b1e7, + 0xa0e8de06b0fa1d08, + 0x7b854b540d34333b, + 0x42e29a67bcca5b7f, + 0xd8a6088ac437dd0e, + 0xc63bb3a9d943ed81, + 0x21714dbd5e65a3b1, + 0x6761ede7b5eea169, + 0x2431f7c8d573abf6, + 0xd51fc685e1a3671a, + 0x5e063cd40410c92d, + 0x283ab98f2cb04002, + 0x8febc06cb2f2f790, + 0x17d64f116fa1d33c, + 0xe07359f1a99ee4aa, + 0x784ed68c74cdc006, + 0x6e2a19d5c73b42da, + 0x8712b4161c7045c3, + 0x371582e4ed93216d, + 0xace390414939f6fc, + 0x7ec5f12186223b7c, + 0xc0b094042bac16fb, + 0xf9d745379a527ebf, + 0x737c3f2ea3b68168, + 0x33e7b8d9bad278ca, + 0xa9a32a34c22ffebb, + 0xe48163ccfedfbd0d, + 0x8e5940246ea5a670, + 0x51c6ef4b842ad1e4, + 0x22bad065279c508c, + 0xd91488c218608cee, + 0x319ea5491f7cda17, + 0xd394e128134c9c60, + 0x094bf43272d5e3b3, + 0x9bf612a5a4aad791, + 0xccbbda43d26ffd0f, + 0x34de1f3c946ad250, + 0x4f5b5468995ee16b, + 0xdf9faf6fea8f7794, + 0x2648ea5870dd092b, + 0xbfc7e56d71d97c67, + 0xdde6b2ff4f21d549, + 0x3c276b463ae86003, + 0x91767b4faf86c71f, + 0x68a13e7835d4b9a0, + 0xb68c115f030c9fd4, + 0x141dd2c916582001, + 0x983d8f7ddd5324ac, + 0x64aa703fcc175254, + 0xc2c989948e02b426, + 0x3e5e76d69f46c2de, + 0x50746f03587d8004, + 0x45db3d829272f1e5, + 0x60584a029b560bf3, + 0xfbae58a73ffcdc62, + 0xa15a5e4e6cad4ce8, + 0x4ba96e55ce1fb8cc, + 0x08f9747aae82b253, + 0xc102144cf7fb471b, + 0x9f042898f3eb8e36, + 0x068b27adf2effb7a, + 0xedca97fe8c0a5ebe, + 0x778e0513f4f7d8cf, + 0x302c2501c32b8bf7, + 0x8d92ddfc175c554d, + 0xf865c57f46052f5f, + 0xeaf3301ba2b2f424, + 0xaa68b7ecbbd60d86, + 0x998f0f350104754c, + 0x0000000000000000, + 0xf12e314d34d0ccec, + 0x710522be061823b5, + 0xaf280d9930c005c1, + 0x97fd5ce25d693c65, + 0x19a41cc633cc9a15, + 0x95844172f8c79eb8, + 0xdc5432b7937684a9, + 0x9436c13a2490cf58, + 0x802b13f332c8ef59, + 0xc442ae397ced4f5c, + 0xfa1cd8efe3ab8d82, + 0xf2e5ac954d293fd1, + 0x6ad823e8907a1b7d, + 0x4d2249f83cf043b6, + 0x03cb9dd879f9f33d, + 0xde2d2f2736d82674, + 0x2a43a41f891ee2df, + 0x6f98999d1b6c133a, + 0xd4ad46cd3df436fa, + 0xbb35df50269825c0, + 0x964fdcaa813e6d85, + 0xeb41b0537ee5a5c4, + 0x0540ba758b160847, + 0xa41ae43be7bb44af, + 0xe3b8c429d0671797, + 0x819993bbee9fbeb9, + 0xae9a8dd1ec975421, + 0xf3572cdd917e6e31, + 0x6393d7dae2aff8ce, + 0x47a2201237dc5338, + 0xa32343dec903ee35, + 0x79fc56c4a89a91e6, + 0x01b28048dc5751e0, + 0x1296f564e4b7db7b, + 0x75f7188351597a12, + 0xdb6d9552bdce2e33, + 0x1e9dbb231d74308f, + 0x520d7293fdd322d9, + 0xe20a44610c304677, + 0xfeeee2d2b4ead425, + 0xca30fdee20800675, + 0x61eaca4a47015a13, + 0xe74afe1487264e30, + 0x2cc883b27bf119a5, + 0x1664cf59b3f682dc, + 0xa811aa7c1e78af5b, + 0x1d5626fb648dc3b2, + 0xb73e9117df5bce34, + 0xd05f7cf06ab56f5d, + 0xfd257f0acd132718, + 0x574dc8e676c52a9e, + 0x0739a7e52eb8aa9a, + 0x5486553e0f3cd9a3, + 0x56ff48aeaa927b7e, + 0xbe756525ad8e2d87, + 0x7d0e6cf9ffdbc841, + 0x3b1ecca31450ca99, + 0x6913be30e983e840, + 0xad511009956ea71c, + 0xb1b5b6ba2db4354e, + 0x4469bdca4e25a005, + 0x15af5281ca0f71e1, + 0x744598cb8d0e2bf2, + 0x593f9b312aa863b7, + 0xefb38a6e29a4fc63, + 0x6b6aa3a04c2d4a9d, + 0x3d95eb0ee6bf31e3, + 0xa291c3961554bfd5, + 0x18169c8eef9bcbf5, + 0x115d68bc9d4e2846, + 0xba875f18facf7420, + 0xd1edfcb8b6e23ebd, + 0xb00736f2f1e364ae, + 0x84d929ce6589b6fe, + 0x70b7a2f6da4f7255, + 0x0e7253d75c6d4929, + 0x04f23a3d574159a7, + 0x0a8069ea0b2c108e, + 0x49d073c56bb11a11, + 0x8aab7a1939e4ffd7, + 0xcd095a0b0e38acef, + 0xc9fb60365979f548, + 0x92bde697d67f3422, + 0xc78933e10514bc61, + 0xe1c1d9b975c9b54a, + 0xd2266160cf1bcd80, + 0x9a4492ed78fd8671, + 0xb3ccab2a881a9793, + 0x72cebf667fe1d088, + 0xd6d45b5d985a9427, + }, +}; + +__device__ const u64 sbob_rc64[12][8] = +{ + { + 0xe9daca1eda5b08b1, + 0x1f7c65c0812fcbeb, + 0x16d0452e43766a2f, + 0xfcc485758db84e71, + 0x0169679291e07c4b, + 0x15d360a4082a42a2, + 0x234d74cc36747605, + 0x0745a6f2596580dd, + }, + { + 0x1a2f9da98ab5a36f, + 0xd7b5700f469de34f, + 0x982b230a72eafef3, + 0x3101b5160f5ed561, + 0x5899d6126b17b59a, + 0xcaa70adbc261b55c, + 0x56cdcbd71ba2dd55, + 0xb79bb121700479e6, + }, + { + 0xc72fce2bacdc74f5, + 0x35843d6a28fc390a, + 0x8b1f9c525f5ef106, + 0x7b7b29b11475eaf2, + 0xb19e3590e40fe2d3, + 0x09db6260373ac9c1, + 0x31db7a8643f4b6c2, + 0xb20aba0af5961e99, + }, + { + 0xd26615e8b3df1fef, + 0xdde4715da0e148f9, + 0x7d3c5c337e858e48, + 0x3f355e68ad1c729d, + 0x75d603ed822cd7a9, + 0xbe0352933313b7d8, + 0xf137e893a1ea5334, + 0x2ed1e384bcbe0c22, + }, + { + 0x994747adac6bea4b, + 0x6323a96c0c413f9a, + 0x4a1086161f1c157f, + 0xbdff0f80d7359e35, + 0xa3f53a254717cdbf, + 0x161a2723b700ffdf, + 0xf563eaa97ea2567a, + 0x57fe6c7cfd581760, + }, + { + 0xd9d33a1daeae4fae, + 0xc039307a3bc3a46f, + 0x6ca44251f9c4662d, + 0xc68ef09ab49a7f18, + 0xb4b79a1cb7a6facf, + 0xb6c6bec2661ff20a, + 0x354f903672c571bf, + 0x6e7d64467a4068fa, + }, + { + 0xecc5aaee160ec7f4, + 0x540924bffe86ac51, + 0xc987bfe6c7c69e39, + 0xc9937a19333e47d3, + 0x372c822dc5ab9209, + 0x04054a2883694706, + 0xf34a3ca24c451735, + 0x93d4143a4d568688, + }, + { + 0xa7c9934d425b1f9b, + 0x41416e0c02aae703, + 0x1ede369c71f8b74e, + 0x9ac4db4d3b44b489, + 0x90069b92cb2b89f4, + 0x2fc4a5d12b8dd169, + 0xd9a8515935c2ac36, + 0x1ee702bfd40d7fa4, + }, + { + 0x9b223116545a8f37, + 0xde5f16ecd89a4c94, + 0x244289251b3a7d3a, + 0x84090de0b755d93c, + 0xb1ceb2db0b440a80, + 0x549c07a69a8a2b7b, + 0x602a1fcb92dc380e, + 0xdb5a238351446172, + }, + { + 0x526f0580a6debeab, + 0xf3f3e4b248e52a38, + 0xdb788aff1ce74189, + 0x0361331b8ae1ff1f, + 0x4b3369af0267e79f, + 0xf452763b306c1e7a, + 0xc3b63b15d1fa9836, + 0xed9c4598fbc7b474, + }, + { + 0xfb89c8efd09ecd7b, + 0x94fe5a63cdc60230, + 0x6107abebbb6bfad8, + 0x7966841421800120, + 0xcab948eaef711d8a, + 0x986e477d1dcdbaef, + 0x5dd86fc04a59a2de, + 0x1b2df381cda4ca6b, + }, + { + 0xba3116f167e78e37, + 0x7ab14904b08013d2, + 0x771ddfbc323ca4cd, + 0x9b9f2130d41220f8, + 0x86cc91189def805d, + 0x5228e188aaa41de7, + 0x991bb2d9d517f4fa, + 0x20d71bf14a92bc48, + }, +}; + +__device__ static void streebog_g (u64 h[8], const u64 m[8], u64 s_sbob_sl64[8][256]) +{ + u64 k[8]; + u64 s[8]; + u64 t[8]; + + #pragma unroll + for (int i = 0; i < 8; i++) + { + t[i] = h[i]; + } + + for (int i = 0; i < 8; i++) + { + k[i] = SBOG_LPSti64; + } + + #pragma unroll + for (int i = 0; i < 8; i++) + { + s[i] = m[i]; + } + + for (int r = 0; r < 12; r++) + { + #pragma unroll + for (int i = 0; i < 8; i++) + { + t[i] = s[i] ^ k[i]; + } + + #pragma unroll + for (int i = 0; i < 8; i++) + { + s[i] = SBOG_LPSti64; + } + + for (int i = 0; i < 8; i++) + { + t[i] = k[i] ^ sbob_rc64[r][i]; + } + + #pragma unroll + for (int i = 0; i < 8; i++) + { + k[i] = SBOG_LPSti64; + } + } + + #pragma unroll + for (int i = 0; i < 8; i++) + { + h[i] ^= s[i] ^ k[i] ^ m[i]; + } +} + +__device__ __constant__ gpu_rule_t c_rules[1024]; + +extern "C" __global__ void __launch_bounds__ (256, 1) m11700_m04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + /** + * shared lookup table + */ + + __shared__ u64 s_sbob_sl64[8][256]; + + if (lid < 64) + { + const u32 lid4 = lid * 4; + + s_sbob_sl64[0][lid4 + 0] = sbob_sl64[0][lid4 + 0]; + s_sbob_sl64[0][lid4 + 1] = sbob_sl64[0][lid4 + 1]; + s_sbob_sl64[0][lid4 + 2] = sbob_sl64[0][lid4 + 2]; + s_sbob_sl64[0][lid4 + 3] = sbob_sl64[0][lid4 + 3]; + s_sbob_sl64[1][lid4 + 0] = sbob_sl64[1][lid4 + 0]; + s_sbob_sl64[1][lid4 + 1] = sbob_sl64[1][lid4 + 1]; + s_sbob_sl64[1][lid4 + 2] = sbob_sl64[1][lid4 + 2]; + s_sbob_sl64[1][lid4 + 3] = sbob_sl64[1][lid4 + 3]; + s_sbob_sl64[2][lid4 + 0] = sbob_sl64[2][lid4 + 0]; + s_sbob_sl64[2][lid4 + 1] = sbob_sl64[2][lid4 + 1]; + s_sbob_sl64[2][lid4 + 2] = sbob_sl64[2][lid4 + 2]; + s_sbob_sl64[2][lid4 + 3] = sbob_sl64[2][lid4 + 3]; + s_sbob_sl64[3][lid4 + 0] = sbob_sl64[3][lid4 + 0]; + s_sbob_sl64[3][lid4 + 1] = sbob_sl64[3][lid4 + 1]; + s_sbob_sl64[3][lid4 + 2] = sbob_sl64[3][lid4 + 2]; + s_sbob_sl64[3][lid4 + 3] = sbob_sl64[3][lid4 + 3]; + s_sbob_sl64[4][lid4 + 0] = sbob_sl64[4][lid4 + 0]; + s_sbob_sl64[4][lid4 + 1] = sbob_sl64[4][lid4 + 1]; + s_sbob_sl64[4][lid4 + 2] = sbob_sl64[4][lid4 + 2]; + s_sbob_sl64[4][lid4 + 3] = sbob_sl64[4][lid4 + 3]; + s_sbob_sl64[5][lid4 + 0] = sbob_sl64[5][lid4 + 0]; + s_sbob_sl64[5][lid4 + 1] = sbob_sl64[5][lid4 + 1]; + s_sbob_sl64[5][lid4 + 2] = sbob_sl64[5][lid4 + 2]; + s_sbob_sl64[5][lid4 + 3] = sbob_sl64[5][lid4 + 3]; + s_sbob_sl64[6][lid4 + 0] = sbob_sl64[6][lid4 + 0]; + s_sbob_sl64[6][lid4 + 1] = sbob_sl64[6][lid4 + 1]; + s_sbob_sl64[6][lid4 + 2] = sbob_sl64[6][lid4 + 2]; + s_sbob_sl64[6][lid4 + 3] = sbob_sl64[6][lid4 + 3]; + s_sbob_sl64[7][lid4 + 0] = sbob_sl64[7][lid4 + 0]; + s_sbob_sl64[7][lid4 + 1] = sbob_sl64[7][lid4 + 1]; + s_sbob_sl64[7][lid4 + 2] = sbob_sl64[7][lid4 + 2]; + s_sbob_sl64[7][lid4 + 3] = sbob_sl64[7][lid4 + 3]; + } + + __syncthreads (); + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + u32x pw_buf1[4]; + + pw_buf1[0] = pws[gid].i[ 4]; + pw_buf1[1] = pws[gid].i[ 5]; + pw_buf1[2] = pws[gid].i[ 6]; + pw_buf1[3] = pws[gid].i[ 7]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w[16]; + + w[ 0] = pw_buf0[0]; + w[ 1] = pw_buf0[1]; + w[ 2] = pw_buf0[2]; + w[ 3] = pw_buf0[3]; + w[ 4] = pw_buf1[0]; + w[ 5] = pw_buf1[1]; + w[ 6] = pw_buf1[2]; + w[ 7] = pw_buf1[3]; + w[ 8] = 0; + w[ 9] = 0; + w[10] = 0; + w[11] = 0; + w[12] = 0; + w[13] = 0; + w[14] = 0; + w[15] = 0; + + const u32 out_len = apply_rules (c_rules[il_pos].cmds, &w[0], &w[1], pw_len); + + append_0x01_2 (&w[0], &w[1], out_len); + + /** + * reverse message block + */ + + u64 m[8]; + + m[0] = hl32_to_64 (w[15], w[14]); + m[1] = hl32_to_64 (w[13], w[12]); + m[2] = hl32_to_64 (w[11], w[10]); + m[3] = hl32_to_64 (w[ 9], w[ 8]); + m[4] = hl32_to_64 (w[ 7], w[ 6]); + m[5] = hl32_to_64 (w[ 5], w[ 4]); + m[6] = hl32_to_64 (w[ 3], w[ 2]); + m[7] = hl32_to_64 (w[ 1], w[ 0]); + + m[0] = swap_workaround (m[0]); + m[1] = swap_workaround (m[1]); + m[2] = swap_workaround (m[2]); + m[3] = swap_workaround (m[3]); + m[4] = swap_workaround (m[4]); + m[5] = swap_workaround (m[5]); + m[6] = swap_workaround (m[6]); + m[7] = swap_workaround (m[7]); + + // state buffer (hash) + + u64 h[8]; + + h[0] = INITVAL; + h[1] = INITVAL; + h[2] = INITVAL; + h[3] = INITVAL; + h[4] = INITVAL; + h[5] = INITVAL; + h[6] = INITVAL; + h[7] = INITVAL; + + streebog_g (h, m, s_sbob_sl64); + + u64 z[8]; + + z[0] = 0; + z[1] = 0; + z[2] = 0; + z[3] = 0; + z[4] = 0; + z[5] = 0; + z[6] = 0; + z[7] = swap_workaround ((u64) (out_len * 8)); + + streebog_g (h, z, s_sbob_sl64); + streebog_g (h, m, s_sbob_sl64); + + const u32 r0 = l32_from_64 (h[0]); + const u32 r1 = h32_from_64 (h[0]); + const u32 r2 = l32_from_64 (h[1]); + const u32 r3 = h32_from_64 (h[1]); + + #include VECT_COMPARE_M + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m11700_m08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m11700_m16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m11700_s04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + + /** + * shared lookup table + */ + + + __shared__ u64 s_sbob_sl64[8][256]; + + const u32 lid4 = lid * 4; + + if (lid < 64) + { + s_sbob_sl64[0][lid4 + 0] = sbob_sl64[0][lid4 + 0]; + s_sbob_sl64[0][lid4 + 1] = sbob_sl64[0][lid4 + 1]; + s_sbob_sl64[0][lid4 + 2] = sbob_sl64[0][lid4 + 2]; + s_sbob_sl64[0][lid4 + 3] = sbob_sl64[0][lid4 + 3]; + s_sbob_sl64[1][lid4 + 0] = sbob_sl64[1][lid4 + 0]; + s_sbob_sl64[1][lid4 + 1] = sbob_sl64[1][lid4 + 1]; + s_sbob_sl64[1][lid4 + 2] = sbob_sl64[1][lid4 + 2]; + s_sbob_sl64[1][lid4 + 3] = sbob_sl64[1][lid4 + 3]; + s_sbob_sl64[2][lid4 + 0] = sbob_sl64[2][lid4 + 0]; + s_sbob_sl64[2][lid4 + 1] = sbob_sl64[2][lid4 + 1]; + s_sbob_sl64[2][lid4 + 2] = sbob_sl64[2][lid4 + 2]; + s_sbob_sl64[2][lid4 + 3] = sbob_sl64[2][lid4 + 3]; + s_sbob_sl64[3][lid4 + 0] = sbob_sl64[3][lid4 + 0]; + s_sbob_sl64[3][lid4 + 1] = sbob_sl64[3][lid4 + 1]; + s_sbob_sl64[3][lid4 + 2] = sbob_sl64[3][lid4 + 2]; + s_sbob_sl64[3][lid4 + 3] = sbob_sl64[3][lid4 + 3]; + s_sbob_sl64[4][lid4 + 0] = sbob_sl64[4][lid4 + 0]; + s_sbob_sl64[4][lid4 + 1] = sbob_sl64[4][lid4 + 1]; + s_sbob_sl64[4][lid4 + 2] = sbob_sl64[4][lid4 + 2]; + s_sbob_sl64[4][lid4 + 3] = sbob_sl64[4][lid4 + 3]; + s_sbob_sl64[5][lid4 + 0] = sbob_sl64[5][lid4 + 0]; + s_sbob_sl64[5][lid4 + 1] = sbob_sl64[5][lid4 + 1]; + s_sbob_sl64[5][lid4 + 2] = sbob_sl64[5][lid4 + 2]; + s_sbob_sl64[5][lid4 + 3] = sbob_sl64[5][lid4 + 3]; + s_sbob_sl64[6][lid4 + 0] = sbob_sl64[6][lid4 + 0]; + s_sbob_sl64[6][lid4 + 1] = sbob_sl64[6][lid4 + 1]; + s_sbob_sl64[6][lid4 + 2] = sbob_sl64[6][lid4 + 2]; + s_sbob_sl64[6][lid4 + 3] = sbob_sl64[6][lid4 + 3]; + s_sbob_sl64[7][lid4 + 0] = sbob_sl64[7][lid4 + 0]; + s_sbob_sl64[7][lid4 + 1] = sbob_sl64[7][lid4 + 1]; + s_sbob_sl64[7][lid4 + 2] = sbob_sl64[7][lid4 + 2]; + s_sbob_sl64[7][lid4 + 3] = sbob_sl64[7][lid4 + 3]; + } + + __syncthreads (); + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + u32x pw_buf1[4]; + + pw_buf1[0] = pws[gid].i[ 4]; + pw_buf1[1] = pws[gid].i[ 5]; + pw_buf1[2] = pws[gid].i[ 6]; + pw_buf1[3] = pws[gid].i[ 7]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w[16]; + + w[ 0] = pw_buf0[0]; + w[ 1] = pw_buf0[1]; + w[ 2] = pw_buf0[2]; + w[ 3] = pw_buf0[3]; + w[ 4] = pw_buf1[0]; + w[ 5] = pw_buf1[1]; + w[ 6] = pw_buf1[2]; + w[ 7] = pw_buf1[3]; + w[ 8] = 0; + w[ 9] = 0; + w[10] = 0; + w[11] = 0; + w[12] = 0; + w[13] = 0; + w[14] = 0; + w[15] = 0; + + const u32 out_len = apply_rules (c_rules[il_pos].cmds, &w[0], &w[1], pw_len); + + append_0x01_2 (&w[0], &w[1], out_len); + + /** + * reverse message block + */ + + u64 m[8]; + + m[0] = hl32_to_64 (w[15], w[14]); + m[1] = hl32_to_64 (w[13], w[12]); + m[2] = hl32_to_64 (w[11], w[10]); + m[3] = hl32_to_64 (w[ 9], w[ 8]); + m[4] = hl32_to_64 (w[ 7], w[ 6]); + m[5] = hl32_to_64 (w[ 5], w[ 4]); + m[6] = hl32_to_64 (w[ 3], w[ 2]); + m[7] = hl32_to_64 (w[ 1], w[ 0]); + + m[0] = swap_workaround (m[0]); + m[1] = swap_workaround (m[1]); + m[2] = swap_workaround (m[2]); + m[3] = swap_workaround (m[3]); + m[4] = swap_workaround (m[4]); + m[5] = swap_workaround (m[5]); + m[6] = swap_workaround (m[6]); + m[7] = swap_workaround (m[7]); + + // state buffer (hash) + + u64 h[8]; + + h[0] = INITVAL; + h[1] = INITVAL; + h[2] = INITVAL; + h[3] = INITVAL; + h[4] = INITVAL; + h[5] = INITVAL; + h[6] = INITVAL; + h[7] = INITVAL; + + streebog_g (h, m, s_sbob_sl64); + + u64 z[8]; + + z[0] = 0; + z[1] = 0; + z[2] = 0; + z[3] = 0; + z[4] = 0; + z[5] = 0; + z[6] = 0; + z[7] = swap_workaround ((u64) (out_len * 8)); + + streebog_g (h, z, s_sbob_sl64); + streebog_g (h, m, s_sbob_sl64); + + const u32 r0 = l32_from_64 (h[0]); + const u32 r1 = h32_from_64 (h[0]); + const u32 r2 = l32_from_64 (h[1]); + const u32 r3 = h32_from_64 (h[1]); + + #include VECT_COMPARE_S + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m11700_s08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m11700_s16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/nv/m11700_a1.cu b/nv/m11700_a1.cu new file mode 100644 index 0000000000..c2c5b900e2 --- /dev/null +++ b/nv/m11700_a1.cu @@ -0,0 +1,2783 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _GOST2012_256_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW2 +#define VECT_SIZE1 +#endif + +#define DGST_R0 0 +#define DGST_R1 1 +#define DGST_R2 2 +#define DGST_R3 3 + +#include "include/kernel_functions.c" +#include "types_nv.c" +#include "common_nv.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +#define INITVAL 0x0101010101010101 + +#define SBOG_LPSti64 \ + s_sbob_sl64[0][(t[0] >> (i * 8)) & 0xff] ^ \ + s_sbob_sl64[1][(t[1] >> (i * 8)) & 0xff] ^ \ + s_sbob_sl64[2][(t[2] >> (i * 8)) & 0xff] ^ \ + s_sbob_sl64[3][(t[3] >> (i * 8)) & 0xff] ^ \ + s_sbob_sl64[4][(t[4] >> (i * 8)) & 0xff] ^ \ + s_sbob_sl64[5][(t[5] >> (i * 8)) & 0xff] ^ \ + s_sbob_sl64[6][(t[6] >> (i * 8)) & 0xff] ^ \ + s_sbob_sl64[7][(t[7] >> (i * 8)) & 0xff] + +// constants + +__device__ __constant__ u64 sbob_sl64[8][256] = +{ + { + 0xd031c397ce553fe6, + 0x16ba5b01b006b525, + 0xa89bade6296e70c8, + 0x6a1f525d77d3435b, + 0x6e103570573dfa0b, + 0x660efb2a17fc95ab, + 0x76327a9e97634bf6, + 0x4bad9d6462458bf5, + 0xf1830caedbc3f748, + 0xc5c8f542669131ff, + 0x95044a1cdc48b0cb, + 0x892962df3cf8b866, + 0xb0b9e208e930c135, + 0xa14fb3f0611a767c, + 0x8d2605f21c160136, + 0xd6b71922fecc549e, + 0x37089438a5907d8b, + 0x0b5da38e5803d49c, + 0x5a5bcc9cea6f3cbc, + 0xedae246d3b73ffe5, + 0xd2b87e0fde22edce, + 0x5e54abb1ca8185ec, + 0x1de7f88fe80561b9, + 0xad5e1a870135a08c, + 0x2f2adbd665cecc76, + 0x5780b5a782f58358, + 0x3edc8a2eede47b3f, + 0xc9d95c3506bee70f, + 0x83be111d6c4e05ee, + 0xa603b90959367410, + 0x103c81b4809fde5d, + 0x2c69b6027d0c774a, + 0x399080d7d5c87953, + 0x09d41e16487406b4, + 0xcdd63b1826505e5f, + 0xf99dc2f49b0298e8, + 0x9cd0540a943cb67f, + 0xbca84b7f891f17c5, + 0x723d1db3b78df2a6, + 0x78aa6e71e73b4f2e, + 0x1433e699a071670d, + 0x84f21be454620782, + 0x98df3327b4d20f2f, + 0xf049dce2d3769e5c, + 0xdb6c60199656eb7a, + 0x648746b2078b4783, + 0x32cd23598dcbadcf, + 0x1ea4955bf0c7da85, + 0xe9a143401b9d46b5, + 0xfd92a5d9bbec21b8, + 0xc8138c790e0b8e1b, + 0x2ee00b9a6d7ba562, + 0xf85712b893b7f1fc, + 0xeb28fed80bea949d, + 0x564a65eb8a40ea4c, + 0x6c9988e8474a2823, + 0x4535898b121d8f2d, + 0xabd8c03231accbf4, + 0xba2e91cab9867cbd, + 0x7960be3def8e263a, + 0x0c11a977602fd6f0, + 0xcb50e1ad16c93527, + 0xeae22e94035ffd89, + 0x2866d12f5de2ce1a, + 0xff1b1841ab9bf390, + 0x9f9339de8cfe0d43, + 0x964727c8c48a0bf7, + 0x524502c6aaae531c, + 0x9b9c5ef3ac10b413, + 0x4fa2fa4942ab32a5, + 0x3f165a62e551122b, + 0xc74148da76e6e3d7, + 0x924840e5e464b2a7, + 0xd372ae43d69784da, + 0x233b72a105e11a86, + 0xa48a04914941a638, + 0xb4b68525c9de7865, + 0xddeabaaca6cf8002, + 0x0a9773c250b6bd88, + 0xc284ffbb5ebd3393, + 0x8ba0df472c8f6a4e, + 0x2aef6cb74d951c32, + 0x427983722a318d41, + 0x73f7cdffbf389bb2, + 0x074c0af9382c026c, + 0x8a6a0f0b243a035a, + 0x6fdae53c5f88931f, + 0xc68b98967e538ac3, + 0x44ff59c71aa8e639, + 0xe2fce0ce439e9229, + 0xa20cde2479d8cd40, + 0x19e89fa2c8ebd8e9, + 0xf446bbcff398270c, + 0x43b3533e2284e455, + 0xd82f0dcd8e945046, + 0x51066f12b26ce820, + 0xe73957af6bc5426d, + 0x081ece5a40c16fa0, + 0x3b193d4fc5bfab7b, + 0x7fe66488df174d42, + 0x0e9814ef705804d8, + 0x8137ac857c39d7c6, + 0xb1733244e185a821, + 0x695c3f896f11f867, + 0xf6cf0657e3eff524, + 0x1aabf276d02963d5, + 0x2da3664e75b91e5e, + 0x0289bd981077d228, + 0x90c1fd7df413608f, + 0x3c5537b6fd93a917, + 0xaa12107e3919a2e0, + 0x0686dab530996b78, + 0xdaa6b0559ee3826e, + 0xc34e2ff756085a87, + 0x6d5358a44fff4137, + 0xfc587595b35948ac, + 0x7ca5095cc7d5f67e, + 0xfb147f6c8b754ac0, + 0xbfeb26ab91ddacf9, + 0x6896efc567a49173, + 0xca9a31e11e7c5c33, + 0xbbe44186b13315a9, + 0x0ddb793b689abfe4, + 0x70b4a02ba7fa208e, + 0xe47a3a7b7307f951, + 0x8cecd5be14a36822, + 0xeeed49b923b144d9, + 0x17708b4db8b3dc31, + 0x6088219f2765fed3, + 0xb3fa8fdcf1f27a09, + 0x910b2d31fca6099b, + 0x0f52c4a378ed6dcc, + 0x50ccbf5ebad98134, + 0x6bd582117f662a4f, + 0x94ce9a50d4fdd9df, + 0x2b25bcfb45207526, + 0x67c42b661f49fcbf, + 0x492420fc723259dd, + 0x03436dd418c2bb3c, + 0x1f6e4517f872b391, + 0xa08563bc69af1f68, + 0xd43ea4baeebb86b6, + 0x01cad04c08b56914, + 0xac94cacb0980c998, + 0x54c3d8739a373864, + 0x26fec5c02dbacac2, + 0xdea9d778be0d3b3e, + 0x040f672d20eeb950, + 0xe5b0ea377bb29045, + 0xf30ab136cbb42560, + 0x62019c0737122cfb, + 0xe86b930c13282fa1, + 0xcc1ceb542ee5374b, + 0x538fd28aa21b3a08, + 0x1b61223ad89c0ac1, + 0x36c24474ad25149f, + 0x7a23d3e9f74c9d06, + 0xbe21f6e79968c5ed, + 0xcf5f868036278c77, + 0xf705d61beb5a9c30, + 0x4d2b47d152dce08d, + 0x5f9e7bfdc234ecf8, + 0x247778583dcd18ea, + 0x867ba67c4415d5aa, + 0x4ce1979d5a698999, + 0x0000000000000000, + 0xec64f42133c696f1, + 0xb57c5569c16b1171, + 0xc1c7926f467f88af, + 0x654d96fe0f3e2e97, + 0x15f936d5a8c40e19, + 0xb8a72c52a9f1ae95, + 0xa9517daa21db19dc, + 0x58d27104fa18ee94, + 0x5918a148f2ad8780, + 0x5cdd1629daf657c4, + 0x8274c15164fb6cfa, + 0xd1fb13dbc6e056f2, + 0x7d6fd910cf609f6a, + 0xb63f38bdd9a9aa4d, + 0x3d9fe7faf526c003, + 0x74bbc706871499de, + 0xdf630734b6b8522a, + 0x3ad3ed03cd0ac26f, + 0xfadeaf2083c023d4, + 0xc00d42234ecae1bb, + 0x8538cba85cd76e96, + 0xc402250e6e2458eb, + 0x47bc3413026a5d05, + 0xafd7a71f114272a4, + 0x978df784cc3f62e3, + 0xb96dfc1ea144c781, + 0x21b2cf391596c8ae, + 0x318e4e8d950916f3, + 0xce9556cc3e92e563, + 0x385a509bdd7d1047, + 0x358129a0b5e7afa3, + 0xe6f387e363702b79, + 0xe0755d5653e94001, + 0x7be903a5fff9f412, + 0x12b53c2c90e80c75, + 0x3307f315857ec4db, + 0x8fafb86a0c61d31e, + 0xd9e5dd8186213952, + 0x77f8aad29fd622e2, + 0x25bda814357871fe, + 0x7571174a8fa1f0ca, + 0x137fec60985d6561, + 0x30449ec19dbc7fe7, + 0xa540d4dd41f4cf2c, + 0xdc206ae0ae7ae916, + 0x5b911cd0e2da55a8, + 0xb2305f90f947131d, + 0x344bf9ecbd52c6b7, + 0x5d17c665d2433ed0, + 0x18224feec05eb1fd, + 0x9e59e992844b6457, + 0x9a568ebfa4a5dd07, + 0xa3c60e68716da454, + 0x7e2cb4c4d7a22456, + 0x87b176304ca0bcbe, + 0x413aeea632f3367d, + 0x9915e36bbc67663b, + 0x40f03eea3a465f69, + 0x1c2d28c3e0b008ad, + 0x4e682a054a1e5bb1, + 0x05c5b761285bd044, + 0xe1bf8d1a5b5c2915, + 0xf2c0617ac3014c74, + 0xb7f5e8f1d11cc359, + 0x63cb4c4b3fa745ef, + 0x9d1a84469c89df6b, + 0xe33630824b2bfb3d, + 0xd5f474f6e60eefa2, + 0xf58c6b83fb2d4e18, + 0x4676e45f0adf3411, + 0x20781f751d23a1ba, + 0xbd629b3381aa7ed1, + 0xae1d775319f71bb0, + 0xfed1c80da32e9a84, + 0x5509083f92825170, + 0x29ac01635557a70e, + 0xa7c9694551831d04, + 0x8e65682604d4ba0a, + 0x11f651f8882ab749, + 0xd77dc96ef6793d8a, + 0xef2799f52b042dcd, + 0x48eef0b07a8730c9, + 0x22f1a2ed0d547392, + 0x6142f1d32fd097c7, + 0x4a674d286af0e2e1, + 0x80fd7cc9748cbed2, + 0x717e7067af4f499a, + 0x938290a9ecd1dbb3, + 0x88e3b293344dd172, + 0x2734158c250fa3d6, + }, + { + 0x7e37e62dfc7d40c3, + 0x776f25a4ee939e5b, + 0xe045c850dd8fb5ad, + 0x86ed5ba711ff1952, + 0xe91d0bd9cf616b35, + 0x37e0ab256e408ffb, + 0x9607f6c031025a7a, + 0x0b02f5e116d23c9d, + 0xf3d8486bfb50650c, + 0x621cff27c40875f5, + 0x7d40cb71fa5fd34a, + 0x6daa6616daa29062, + 0x9f5f354923ec84e2, + 0xec847c3dc507c3b3, + 0x025a3668043ce205, + 0xa8bf9e6c4dac0b19, + 0xfa808be2e9bebb94, + 0xb5b99c5277c74fa3, + 0x78d9bc95f0397bcc, + 0xe332e50cdbad2624, + 0xc74fce129332797e, + 0x1729eceb2ea709ab, + 0xc2d6b9f69954d1f8, + 0x5d898cbfbab8551a, + 0x859a76fb17dd8adb, + 0x1be85886362f7fb5, + 0xf6413f8ff136cd8a, + 0xd3110fa5bbb7e35c, + 0x0a2feed514cc4d11, + 0xe83010edcd7f1ab9, + 0xa1e75de55f42d581, + 0xeede4a55c13b21b6, + 0xf2f5535ff94e1480, + 0x0cc1b46d1888761e, + 0xbce15fdb6529913b, + 0x2d25e8975a7181c2, + 0x71817f1ce2d7a554, + 0x2e52c5cb5c53124b, + 0xf9f7a6beef9c281d, + 0x9e722e7d21f2f56e, + 0xce170d9b81dca7e6, + 0x0e9b82051cb4941b, + 0x1e712f623c49d733, + 0x21e45cfa42f9f7dc, + 0xcb8e7a7f8bba0f60, + 0x8e98831a010fb646, + 0x474ccf0d8e895b23, + 0xa99285584fb27a95, + 0x8cc2b57205335443, + 0x42d5b8e984eff3a5, + 0x012d1b34021e718c, + 0x57a6626aae74180b, + 0xff19fc06e3d81312, + 0x35ba9d4d6a7c6dfe, + 0xc9d44c178f86ed65, + 0x506523e6a02e5288, + 0x03772d5c06229389, + 0x8b01f4fe0b691ec0, + 0xf8dabd8aed825991, + 0x4c4e3aec985b67be, + 0xb10df0827fbf96a9, + 0x6a69279ad4f8dae1, + 0xe78689dcd3d5ff2e, + 0x812e1a2b1fa553d1, + 0xfbad90d6eba0ca18, + 0x1ac543b234310e39, + 0x1604f7df2cb97827, + 0xa6241c6951189f02, + 0x753513cceaaf7c5e, + 0x64f2a59fc84c4efa, + 0x247d2b1e489f5f5a, + 0xdb64d718ab474c48, + 0x79f4a7a1f2270a40, + 0x1573da832a9bebae, + 0x3497867968621c72, + 0x514838d2a2302304, + 0xf0af6537fd72f685, + 0x1d06023e3a6b44ba, + 0x678588c3ce6edd73, + 0x66a893f7cc70acff, + 0xd4d24e29b5eda9df, + 0x3856321470ea6a6c, + 0x07c3418c0e5a4a83, + 0x2bcbb22f5635bacd, + 0x04b46cd00878d90a, + 0x06ee5ab80c443b0f, + 0x3b211f4876c8f9e5, + 0x0958c38912eede98, + 0xd14b39cdbf8b0159, + 0x397b292072f41be0, + 0x87c0409313e168de, + 0xad26e98847caa39f, + 0x4e140c849c6785bb, + 0xd5ff551db7f3d853, + 0xa0ca46d15d5ca40d, + 0xcd6020c787fe346f, + 0x84b76dcf15c3fb57, + 0xdefda0fca121e4ce, + 0x4b8d7b6096012d3d, + 0x9ac642ad298a2c64, + 0x0875d8bd10f0af14, + 0xb357c6ea7b8374ac, + 0x4d6321d89a451632, + 0xeda96709c719b23f, + 0xf76c24bbf328bc06, + 0xc662d526912c08f2, + 0x3ce25ec47892b366, + 0xb978283f6f4f39bd, + 0xc08c8f9e9d6833fd, + 0x4f3917b09e79f437, + 0x593de06fb2c08c10, + 0xd6887841b1d14bda, + 0x19b26eee32139db0, + 0xb494876675d93e2f, + 0x825937771987c058, + 0x90e9ac783d466175, + 0xf1827e03ff6c8709, + 0x945dc0a8353eb87f, + 0x4516f9658ab5b926, + 0x3f9573987eb020ef, + 0xb855330b6d514831, + 0x2ae6a91b542bcb41, + 0x6331e413c6160479, + 0x408f8e8180d311a0, + 0xeff35161c325503a, + 0xd06622f9bd9570d5, + 0x8876d9a20d4b8d49, + 0xa5533135573a0c8b, + 0xe168d364df91c421, + 0xf41b09e7f50a2f8f, + 0x12b09b0f24c1a12d, + 0xda49cc2ca9593dc4, + 0x1f5c34563e57a6bf, + 0x54d14f36a8568b82, + 0xaf7cdfe043f6419a, + 0xea6a2685c943f8bc, + 0xe5dcbfb4d7e91d2b, + 0xb27addde799d0520, + 0x6b443caed6e6ab6d, + 0x7bae91c9f61be845, + 0x3eb868ac7cae5163, + 0x11c7b65322e332a4, + 0xd23c1491b9a992d0, + 0x8fb5982e0311c7ca, + 0x70ac6428e0c9d4d8, + 0x895bc2960f55fcc5, + 0x76423e90ec8defd7, + 0x6ff0507ede9e7267, + 0x3dcf45f07a8cc2ea, + 0x4aa06054941f5cb1, + 0x5810fb5bb0defd9c, + 0x5efea1e3bc9ac693, + 0x6edd4b4adc8003eb, + 0x741808f8e8b10dd2, + 0x145ec1b728859a22, + 0x28bc9f7350172944, + 0x270a06424ebdccd3, + 0x972aedf4331c2bf6, + 0x059977e40a66a886, + 0x2550302a4a812ed6, + 0xdd8a8da0a7037747, + 0xc515f87a970e9b7b, + 0x3023eaa9601ac578, + 0xb7e3aa3a73fbada6, + 0x0fb699311eaae597, + 0x0000000000000000, + 0x310ef19d6204b4f4, + 0x229371a644db6455, + 0x0decaf591a960792, + 0x5ca4978bb8a62496, + 0x1c2b190a38753536, + 0x41a295b582cd602c, + 0x3279dcc16426277d, + 0xc1a194aa9f764271, + 0x139d803b26dfd0a1, + 0xae51c4d441e83016, + 0xd813fa44ad65dfc1, + 0xac0bf2bc45d4d213, + 0x23be6a9246c515d9, + 0x49d74d08923dcf38, + 0x9d05032127d066e7, + 0x2f7fdeff5e4d63c7, + 0xa47e2a0155247d07, + 0x99b16ff12fa8bfed, + 0x4661d4398c972aaf, + 0xdfd0bbc8a33f9542, + 0xdca79694a51d06cb, + 0xb020ebb67da1e725, + 0xba0f0563696daa34, + 0xe4f1a480d5f76ca7, + 0xc438e34e9510eaf7, + 0x939e81243b64f2fc, + 0x8defae46072d25cf, + 0x2c08f3a3586ff04e, + 0xd7a56375b3cf3a56, + 0x20c947ce40e78650, + 0x43f8a3dd86f18229, + 0x568b795eac6a6987, + 0x8003011f1dbb225d, + 0xf53612d3f7145e03, + 0x189f75da300dec3c, + 0x9570db9c3720c9f3, + 0xbb221e576b73dbb8, + 0x72f65240e4f536dd, + 0x443be25188abc8aa, + 0xe21ffe38d9b357a8, + 0xfd43ca6ee7e4f117, + 0xcaa3614b89a47eec, + 0xfe34e732e1c6629e, + 0x83742c431b99b1d4, + 0xcf3a16af83c2d66a, + 0xaae5a8044990e91c, + 0x26271d764ca3bd5f, + 0x91c4b74c3f5810f9, + 0x7c6dd045f841a2c6, + 0x7f1afd19fe63314f, + 0xc8f957238d989ce9, + 0xa709075d5306ee8e, + 0x55fc5402aa48fa0e, + 0x48fa563c9023beb4, + 0x65dfbeabca523f76, + 0x6c877d22d8bce1ee, + 0xcc4d3bf385e045e3, + 0xbebb69b36115733e, + 0x10eaad6720fd4328, + 0xb6ceb10e71e5dc2a, + 0xbdcc44ef6737e0b7, + 0x523f158ea412b08d, + 0x989c74c52db6ce61, + 0x9beb59992b945de8, + 0x8a2cefca09776f4c, + 0xa3bd6b8d5b7e3784, + 0xeb473db1cb5d8930, + 0xc3fba2c29b4aa074, + 0x9c28181525ce176b, + 0x683311f2d0c438e4, + 0x5fd3bad7be84b71f, + 0xfc6ed15ae5fa809b, + 0x36cdb0116c5efe77, + 0x29918447520958c8, + 0xa29070b959604608, + 0x53120ebaa60cc101, + 0x3a0c047c74d68869, + 0x691e0ac6d2da4968, + 0x73db4974e6eb4751, + 0x7a838afdf40599c9, + 0x5a4acd33b4e21f99, + 0x6046c94fc03497f0, + 0xe6ab92e8d1cb8ea2, + 0x3354c7f5663856f1, + 0xd93ee170af7bae4d, + 0x616bd27bc22ae67c, + 0x92b39a10397a8370, + 0xabc8b3304b8e9890, + 0xbf967287630b02b2, + 0x5b67d607b6fc6e15, + }, + { + 0x8ab0a96846e06a6d, + 0x43c7e80b4bf0b33a, + 0x08c9b3546b161ee5, + 0x39f1c235eba990be, + 0xc1bef2376606c7b2, + 0x2c209233614569aa, + 0xeb01523b6fc3289a, + 0x946953ab935acedd, + 0x272838f63e13340e, + 0x8b0455eca12ba052, + 0x77a1b2c4978ff8a2, + 0xa55122ca13e54086, + 0x2276135862d3f1cd, + 0xdb8ddfde08b76cfe, + 0x5d1e12c89e4a178a, + 0x0e56816b03969867, + 0xee5f79953303ed59, + 0xafed748bab78d71d, + 0x6d929f2df93e53ee, + 0xf5d8a8f8ba798c2a, + 0xf619b1698e39cf6b, + 0x95ddaf2f749104e2, + 0xec2a9c80e0886427, + 0xce5c8fd8825b95ea, + 0xc4e0d9993ac60271, + 0x4699c3a5173076f9, + 0x3d1b151f50a29f42, + 0x9ed505ea2bc75946, + 0x34665acfdc7f4b98, + 0x61b1fb53292342f7, + 0xc721c0080e864130, + 0x8693cd1696fd7b74, + 0x872731927136b14b, + 0xd3446c8a63a1721b, + 0x669a35e8a6680e4a, + 0xcab658f239509a16, + 0xa4e5de4ef42e8ab9, + 0x37a7435ee83f08d9, + 0x134e6239e26c7f96, + 0x82791a3c2df67488, + 0x3f6ef00a8329163c, + 0x8e5a7e42fdeb6591, + 0x5caaee4c7981ddb5, + 0x19f234785af1e80d, + 0x255ddde3ed98bd70, + 0x50898a32a99cccac, + 0x28ca4519da4e6656, + 0xae59880f4cb31d22, + 0x0d9798fa37d6db26, + 0x32f968f0b4ffcd1a, + 0xa00f09644f258545, + 0xfa3ad5175e24de72, + 0xf46c547c5db24615, + 0x713e80fbff0f7e20, + 0x7843cf2b73d2aafa, + 0xbd17ea36aedf62b4, + 0xfd111bacd16f92cf, + 0x4abaa7dbc72d67e0, + 0xb3416b5dad49fad3, + 0xbca316b24914a88b, + 0x15d150068aecf914, + 0xe27c1debe31efc40, + 0x4fe48c759beda223, + 0x7edcfd141b522c78, + 0x4e5070f17c26681c, + 0xe696cac15815f3bc, + 0x35d2a64b3bb481a7, + 0x800cff29fe7dfdf6, + 0x1ed9fac3d5baa4b0, + 0x6c2663a91ef599d1, + 0x03c1199134404341, + 0xf7ad4ded69f20554, + 0xcd9d9649b61bd6ab, + 0xc8c3bde7eadb1368, + 0xd131899fb02afb65, + 0x1d18e352e1fae7f1, + 0xda39235aef7ca6c1, + 0xa1bbf5e0a8ee4f7a, + 0x91377805cf9a0b1e, + 0x3138716180bf8e5b, + 0xd9f83acbdb3ce580, + 0x0275e515d38b897e, + 0x472d3f21f0fbbcc6, + 0x2d946eb7868ea395, + 0xba3c248d21942e09, + 0xe7223645bfde3983, + 0xff64feb902e41bb1, + 0xc97741630d10d957, + 0xc3cb1722b58d4ecc, + 0xa27aec719cae0c3b, + 0x99fecb51a48c15fb, + 0x1465ac826d27332b, + 0xe1bd047ad75ebf01, + 0x79f733af941960c5, + 0x672ec96c41a3c475, + 0xc27feba6524684f3, + 0x64efd0fd75e38734, + 0xed9e60040743ae18, + 0xfb8e2993b9ef144d, + 0x38453eb10c625a81, + 0x6978480742355c12, + 0x48cf42ce14a6ee9e, + 0x1cac1fd606312dce, + 0x7b82d6ba4792e9bb, + 0x9d141c7b1f871a07, + 0x5616b80dc11c4a2e, + 0xb849c198f21fa777, + 0x7ca91801c8d9a506, + 0xb1348e487ec273ad, + 0x41b20d1e987b3a44, + 0x7460ab55a3cfbbe3, + 0x84e628034576f20a, + 0x1b87d16d897a6173, + 0x0fe27defe45d5258, + 0x83cde6b8ca3dbeb7, + 0x0c23647ed01d1119, + 0x7a362a3ea0592384, + 0xb61f40f3f1893f10, + 0x75d457d1440471dc, + 0x4558da34237035b8, + 0xdca6116587fc2043, + 0x8d9b67d3c9ab26d0, + 0x2b0b5c88ee0e2517, + 0x6fe77a382ab5da90, + 0x269cc472d9d8fe31, + 0x63c41e46faa8cb89, + 0xb7abbc771642f52f, + 0x7d1de4852f126f39, + 0xa8c6ba3024339ba0, + 0x600507d7cee888c8, + 0x8fee82c61a20afae, + 0x57a2448926d78011, + 0xfca5e72836a458f0, + 0x072bcebb8f4b4cbd, + 0x497bbe4af36d24a1, + 0x3cafe99bb769557d, + 0x12fa9ebd05a7b5a9, + 0xe8c04baa5b836bdb, + 0x4273148fac3b7905, + 0x908384812851c121, + 0xe557d3506c55b0fd, + 0x72ff996acb4f3d61, + 0x3eda0c8e64e2dc03, + 0xf0868356e6b949e9, + 0x04ead72abb0b0ffc, + 0x17a4b5135967706a, + 0xe3c8e16f04d5367f, + 0xf84f30028daf570c, + 0x1846c8fcbd3a2232, + 0x5b8120f7f6ca9108, + 0xd46fa231ecea3ea6, + 0x334d947453340725, + 0x58403966c28ad249, + 0xbed6f3a79a9f21f5, + 0x68ccb483a5fe962d, + 0xd085751b57e1315a, + 0xfed0023de52fd18e, + 0x4b0e5b5f20e6addf, + 0x1a332de96eb1ab4c, + 0xa3ce10f57b65c604, + 0x108f7ba8d62c3cd7, + 0xab07a3a11073d8e1, + 0x6b0dad1291bed56c, + 0xf2f366433532c097, + 0x2e557726b2cee0d4, + 0x0000000000000000, + 0xcb02a476de9b5029, + 0xe4e32fd48b9e7ac2, + 0x734b65ee2c84f75e, + 0x6e5386bccd7e10af, + 0x01b4fc84e7cbca3f, + 0xcfe8735c65905fd5, + 0x3613bfda0ff4c2e6, + 0x113b872c31e7f6e8, + 0x2fe18ba255052aeb, + 0xe974b72ebc48a1e4, + 0x0abc5641b89d979b, + 0xb46aa5e62202b66e, + 0x44ec26b0c4bbff87, + 0xa6903b5b27a503c7, + 0x7f680190fc99e647, + 0x97a84a3aa71a8d9c, + 0xdd12ede16037ea7c, + 0xc554251ddd0dc84e, + 0x88c54c7d956be313, + 0x4d91696048662b5d, + 0xb08072cc9909b992, + 0xb5de5962c5c97c51, + 0x81b803ad19b637c9, + 0xb2f597d94a8230ec, + 0x0b08aac55f565da4, + 0xf1327fd2017283d6, + 0xad98919e78f35e63, + 0x6ab9519676751f53, + 0x24e921670a53774f, + 0xb9fd3d1c15d46d48, + 0x92f66194fbda485f, + 0x5a35dc7311015b37, + 0xded3f4705477a93d, + 0xc00a0eb381cd0d8d, + 0xbb88d809c65fe436, + 0x16104997beacba55, + 0x21b70ac95693b28c, + 0x59f4c5e225411876, + 0xd5db5eb50b21f499, + 0x55d7a19cf55c096f, + 0xa97246b4c3f8519f, + 0x8552d487a2bd3835, + 0x54635d181297c350, + 0x23c2efdc85183bf2, + 0x9f61f96ecc0c9379, + 0x534893a39ddc8fed, + 0x5edf0b59aa0a54cb, + 0xac2c6d1a9f38945c, + 0xd7aebba0d8aa7de7, + 0x2abfa00c09c5ef28, + 0xd84cc64f3cf72fbf, + 0x2003f64db15878b3, + 0xa724c7dfc06ec9f8, + 0x069f323f68808682, + 0xcc296acd51d01c94, + 0x055e2bae5cc0c5c3, + 0x6270e2c21d6301b6, + 0x3b842720382219c0, + 0xd2f0900e846ab824, + 0x52fc6f277a1745d2, + 0xc6953c8ce94d8b0f, + 0xe009f8fe3095753e, + 0x655b2c7992284d0b, + 0x984a37d54347dfc4, + 0xeab5aebf8808e2a5, + 0x9a3fd2c090cc56ba, + 0x9ca0e0fff84cd038, + 0x4c2595e4afade162, + 0xdf6708f4b3bc6302, + 0xbf620f237d54ebca, + 0x93429d101c118260, + 0x097d4fd08cddd4da, + 0x8c2f9b572e60ecef, + 0x708a7c7f18c4b41f, + 0x3a30dba4dfe9d3ff, + 0x4006f19a7fb0f07b, + 0x5f6bf7dd4dc19ef4, + 0x1f6d064732716e8f, + 0xf9fbcc866a649d33, + 0x308c8de567744464, + 0x8971b0f972a0292c, + 0xd61a47243f61b7d8, + 0xefeb8511d4c82766, + 0x961cb6be40d147a3, + 0xaab35f25f7b812de, + 0x76154e407044329d, + 0x513d76b64e570693, + 0xf3479ac7d2f90aa8, + 0x9b8b2e4477079c85, + 0x297eb99d3d85ac69, + }, + { + 0x3ef29d249b2c0a19, + 0xe9e16322b6f8622f, + 0x5536994047757f7a, + 0x9f4d56d5a47b0b33, + 0x822567466aa1174c, + 0xb8f5057deb082fb2, + 0xcc48c10bf4475f53, + 0x373088d4275dec3a, + 0x968f4325180aed10, + 0x173d232cf7016151, + 0xae4ed09f946fcc13, + 0xfd4b4741c4539873, + 0x1b5b3f0dd9933765, + 0x2ffcb0967b644052, + 0xe02376d20a89840c, + 0xa3ae3a70329b18d7, + 0x419cbd2335de8526, + 0xfafebf115b7c3199, + 0x0397074f85aa9b0d, + 0xc58ad4fb4836b970, + 0xbec60be3fc4104a8, + 0x1eff36dc4b708772, + 0x131fdc33ed8453b6, + 0x0844e33e341764d3, + 0x0ff11b6eab38cd39, + 0x64351f0a7761b85a, + 0x3b5694f509cfba0e, + 0x30857084b87245d0, + 0x47afb3bd2297ae3c, + 0xf2ba5c2f6f6b554a, + 0x74bdc4761f4f70e1, + 0xcfdfc64471edc45e, + 0xe610784c1dc0af16, + 0x7aca29d63c113f28, + 0x2ded411776a859af, + 0xac5f211e99a3d5ee, + 0xd484f949a87ef33b, + 0x3ce36ca596e013e4, + 0xd120f0983a9d432c, + 0x6bc40464dc597563, + 0x69d5f5e5d1956c9e, + 0x9ae95f043698bb24, + 0xc9ecc8da66a4ef44, + 0xd69508c8a5b2eac6, + 0xc40c2235c0503b80, + 0x38c193ba8c652103, + 0x1ceec75d46bc9e8f, + 0xd331011937515ad1, + 0xd8e2e56886eca50f, + 0xb137108d5779c991, + 0x709f3b6905ca4206, + 0x4feb50831680caef, + 0xec456af3241bd238, + 0x58d673afe181abbe, + 0x242f54e7cad9bf8c, + 0x0211f1810dcc19fd, + 0x90bc4dbb0f43c60a, + 0x9518446a9da0761d, + 0xa1bfcbf13f57012a, + 0x2bde4f8961e172b5, + 0x27b853a84f732481, + 0xb0b1e643df1f4b61, + 0x18cc38425c39ac68, + 0xd2b7f7d7bf37d821, + 0x3103864a3014c720, + 0x14aa246372abfa5c, + 0x6e600db54ebac574, + 0x394765740403a3f3, + 0x09c215f0bc71e623, + 0x2a58b947e987f045, + 0x7b4cdf18b477bdd8, + 0x9709b5eb906c6fe0, + 0x73083c268060d90b, + 0xfedc400e41f9037e, + 0x284948c6e44be9b8, + 0x728ecae808065bfb, + 0x06330e9e17492b1a, + 0x5950856169e7294e, + 0xbae4f4fce6c4364f, + 0xca7bcf95e30e7449, + 0x7d7fd186a33e96c2, + 0x52836110d85ad690, + 0x4dfaa1021b4cd312, + 0x913abb75872544fa, + 0xdd46ecb9140f1518, + 0x3d659a6b1e869114, + 0xc23f2cabd719109a, + 0xd713fe062dd46836, + 0xd0a60656b2fbc1dc, + 0x221c5a79dd909496, + 0xefd26dbca1b14935, + 0x0e77eda0235e4fc9, + 0xcbfd395b6b68f6b9, + 0x0de0eaefa6f4d4c4, + 0x0422ff1f1a8532e7, + 0xf969b85eded6aa94, + 0x7f6e2007aef28f3f, + 0x3ad0623b81a938fe, + 0x6624ee8b7aada1a7, + 0xb682e8ddc856607b, + 0xa78cc56f281e2a30, + 0xc79b257a45faa08d, + 0x5b4174e0642b30b3, + 0x5f638bff7eae0254, + 0x4bc9af9c0c05f808, + 0xce59308af98b46ae, + 0x8fc58da9cc55c388, + 0x803496c7676d0eb1, + 0xf33caae1e70dd7ba, + 0xbb6202326ea2b4bf, + 0xd5020f87201871cb, + 0x9d5ca754a9b712ce, + 0x841669d87de83c56, + 0x8a6184785eb6739f, + 0x420bba6cb0741e2b, + 0xf12d5b60eac1ce47, + 0x76ac35f71283691c, + 0x2c6bb7d9fecedb5f, + 0xfccdb18f4c351a83, + 0x1f79c012c3160582, + 0xf0abadae62a74cb7, + 0xe1a5801c82ef06fc, + 0x67a21845f2cb2357, + 0x5114665f5df04d9d, + 0xbf40fd2d74278658, + 0xa0393d3fb73183da, + 0x05a409d192e3b017, + 0xa9fb28cf0b4065f9, + 0x25a9a22942bf3d7c, + 0xdb75e22703463e02, + 0xb326e10c5ab5d06c, + 0xe7968e8295a62de6, + 0xb973f3b3636ead42, + 0xdf571d3819c30ce5, + 0xee549b7229d7cbc5, + 0x12992afd65e2d146, + 0xf8ef4e9056b02864, + 0xb7041e134030e28b, + 0xc02edd2adad50967, + 0x932b4af48ae95d07, + 0x6fe6fb7bc6dc4784, + 0x239aacb755f61666, + 0x401a4bedbdb807d6, + 0x485ea8d389af6305, + 0xa41bc220adb4b13d, + 0x753b32b89729f211, + 0x997e584bb3322029, + 0x1d683193ceda1c7f, + 0xff5ab6c0c99f818e, + 0x16bbd5e27f67e3a1, + 0xa59d34ee25d233cd, + 0x98f8ae853b54a2d9, + 0x6df70afacb105e79, + 0x795d2e99b9bba425, + 0x8e437b6744334178, + 0x0186f6ce886682f0, + 0xebf092a3bb347bd2, + 0xbcd7fa62f18d1d55, + 0xadd9d7d011c5571e, + 0x0bd3e471b1bdffde, + 0xaa6c2f808eeafef4, + 0x5ee57d31f6c880a4, + 0xf50fa47ff044fca0, + 0x1addc9c351f5b595, + 0xea76646d3352f922, + 0x0000000000000000, + 0x85909f16f58ebea6, + 0x46294573aaf12ccc, + 0x0a5512bf39db7d2e, + 0x78dbd85731dd26d5, + 0x29cfbe086c2d6b48, + 0x218b5d36583a0f9b, + 0x152cd2adfacd78ac, + 0x83a39188e2c795bc, + 0xc3b9da655f7f926a, + 0x9ecba01b2c1d89c3, + 0x07b5f8509f2fa9ea, + 0x7ee8d6c926940dcf, + 0x36b67e1aaf3b6eca, + 0x86079859702425ab, + 0xfb7849dfd31ab369, + 0x4c7c57cc932a51e2, + 0xd96413a60e8a27ff, + 0x263ea566c715a671, + 0x6c71fc344376dc89, + 0x4a4f595284637af8, + 0xdaf314e98b20bcf2, + 0x572768c14ab96687, + 0x1088db7c682ec8bb, + 0x887075f9537a6a62, + 0x2e7a4658f302c2a2, + 0x619116dbe582084d, + 0xa87dde018326e709, + 0xdcc01a779c6997e8, + 0xedc39c3dac7d50c8, + 0xa60a33a1a078a8c0, + 0xc1a82be452b38b97, + 0x3f746bea134a88e9, + 0xa228ccbebafd9a27, + 0xabead94e068c7c04, + 0xf48952b178227e50, + 0x5cf48cb0fb049959, + 0x6017e0156de48abd, + 0x4438b4f2a73d3531, + 0x8c528ae649ff5885, + 0xb515ef924dfcfb76, + 0x0c661c212e925634, + 0xb493195cc59a7986, + 0x9cda519a21d1903e, + 0x32948105b5be5c2d, + 0x194ace8cd45f2e98, + 0x438d4ca238129cdb, + 0x9b6fa9cabefe39d4, + 0x81b26009ef0b8c41, + 0xded1ebf691a58e15, + 0x4e6da64d9ee6481f, + 0x54b06f8ecf13fd8a, + 0x49d85e1d01c9e1f5, + 0xafc826511c094ee3, + 0xf698a33075ee67ad, + 0x5ac7822eec4db243, + 0x8dd47c28c199da75, + 0x89f68337db1ce892, + 0xcdce37c57c21dda3, + 0x530597de503c5460, + 0x6a42f2aa543ff793, + 0x5d727a7e73621ba9, + 0xe232875307459df1, + 0x56a19e0fc2dfe477, + 0xc61dd3b4cd9c227d, + 0xe5877f03986a341b, + 0x949eb2a415c6f4ed, + 0x6206119460289340, + 0x6380e75ae84e11b0, + 0x8be772b6d6d0f16f, + 0x50929091d596cf6d, + 0xe86795ec3e9ee0df, + 0x7cf927482b581432, + 0xc86a3e14eec26db4, + 0x7119cda78dacc0f6, + 0xe40189cd100cb6eb, + 0x92adbc3a028fdff7, + 0xb2a017c2d2d3529c, + 0x200dabf8d05c8d6b, + 0x34a78f9ba2f77737, + 0xe3b4719d8f231f01, + 0x45be423c2f5bb7c1, + 0xf71e55fefd88e55d, + 0x6853032b59f3ee6e, + 0x65b3e9c4ff073aaa, + 0x772ac3399ae5ebec, + 0x87816e97f842a75b, + 0x110e2db2e0484a4b, + 0x331277cb3dd8dedd, + 0xbd510cac79eb9fa5, + 0x352179552a91f5c7, + }, + { + 0x05ba7bc82c9b3220, + 0x31a54665f8b65e4f, + 0xb1b651f77547f4d4, + 0x8bfa0d857ba46682, + 0x85a96c5aa16a98bb, + 0x990faef908eb79c9, + 0xa15e37a247f4a62d, + 0x76857dcd5d27741e, + 0xf8c50b800a1820bc, + 0xbe65dcb201f7a2b4, + 0x666d1b986f9426e7, + 0x4cc921bf53c4e648, + 0x95410a0f93d9ca42, + 0x20cdccaa647ba4ef, + 0x429a4060890a1871, + 0x0c4ea4f69b32b38b, + 0xccda362dde354cd3, + 0x96dc23bc7c5b2fa9, + 0xc309bb68aa851ab3, + 0xd26131a73648e013, + 0x021dc52941fc4db2, + 0xcd5adab7704be48a, + 0xa77965d984ed71e6, + 0x32386fd61734bba4, + 0xe82d6dd538ab7245, + 0x5c2147ea6177b4b1, + 0x5da1ab70cf091ce8, + 0xac907fce72b8bdff, + 0x57c85dfd972278a8, + 0xa4e44c6a6b6f940d, + 0x3851995b4f1fdfe4, + 0x62578ccaed71bc9e, + 0xd9882bb0c01d2c0a, + 0x917b9d5d113c503b, + 0xa2c31e11a87643c6, + 0xe463c923a399c1ce, + 0xf71686c57ea876dc, + 0x87b4a973e096d509, + 0xaf0d567d9d3a5814, + 0xb40c2a3f59dcc6f4, + 0x3602f88495d121dd, + 0xd3e1dd3d9836484a, + 0xf945e71aa46688e5, + 0x7518547eb2a591f5, + 0x9366587450c01d89, + 0x9ea81018658c065b, + 0x4f54080cbc4603a3, + 0x2d0384c65137bf3d, + 0xdc325078ec861e2a, + 0xea30a8fc79573ff7, + 0x214d2030ca050cb6, + 0x65f0322b8016c30c, + 0x69be96dd1b247087, + 0xdb95ee9981e161b8, + 0xd1fc1814d9ca05f8, + 0x820ed2bbcc0de729, + 0x63d76050430f14c7, + 0x3bccb0e8a09d3a0f, + 0x8e40764d573f54a2, + 0x39d175c1e16177bd, + 0x12f5a37c734f1f4b, + 0xab37c12f1fdfc26d, + 0x5648b167395cd0f1, + 0x6c04ed1537bf42a7, + 0xed97161d14304065, + 0x7d6c67daab72b807, + 0xec17fa87ba4ee83c, + 0xdfaf79cb0304fbc1, + 0x733f060571bc463e, + 0x78d61c1287e98a27, + 0xd07cf48e77b4ada1, + 0xb9c262536c90dd26, + 0xe2449b5860801605, + 0x8fc09ad7f941fcfb, + 0xfad8cea94be46d0e, + 0xa343f28b0608eb9f, + 0x9b126bd04917347b, + 0x9a92874ae7699c22, + 0x1b017c42c4e69ee0, + 0x3a4c5c720ee39256, + 0x4b6e9f5e3ea399da, + 0x6ba353f45ad83d35, + 0xe7fee0904c1b2425, + 0x22d009832587e95d, + 0x842980c00f1430e2, + 0xc6b3c0a0861e2893, + 0x087433a419d729f2, + 0x341f3dadd42d6c6f, + 0xee0a3faefbb2a58e, + 0x4aee73c490dd3183, + 0xaab72db5b1a16a34, + 0xa92a04065e238fdf, + 0x7b4b35a1686b6fcc, + 0x6a23bf6ef4a6956c, + 0x191cb96b851ad352, + 0x55d598d4d6de351a, + 0xc9604de5f2ae7ef3, + 0x1ca6c2a3a981e172, + 0xde2f9551ad7a5398, + 0x3025aaff56c8f616, + 0x15521d9d1e2860d9, + 0x506fe31cfa45073a, + 0x189c55f12b647b0b, + 0x0180ec9aae7ea859, + 0x7cec8b40050c105e, + 0x2350e5198bf94104, + 0xef8ad33455cc0dd7, + 0x07a7bee16d677f92, + 0xe5e325b90de76997, + 0x5a061591a26e637a, + 0xb611ef1618208b46, + 0x09f4df3eb7a981ab, + 0x1ebb078ae87dacc0, + 0xb791038cb65e231f, + 0x0fd38d4574b05660, + 0x67edf702c1ea8ebe, + 0xba5f4be0831238cd, + 0xe3c477c2cefebe5c, + 0x0dce486c354c1bd2, + 0x8c5db36416c31910, + 0x26ea9ed1a7627324, + 0x039d29b3ef82e5eb, + 0x9f28fc82cbf2ae02, + 0xa8aae89cf05d2786, + 0x431aacfa2774b028, + 0xcf471f9e31b7a938, + 0x581bd0b8e3922ec8, + 0xbc78199b400bef06, + 0x90fb71c7bf42f862, + 0x1f3beb1046030499, + 0x683e7a47b55ad8de, + 0x988f4263a695d190, + 0xd808c72a6e638453, + 0x0627527bc319d7cb, + 0xebb04466d72997ae, + 0xe67e0c0ae2658c7c, + 0x14d2f107b056c880, + 0x7122c32c30400b8c, + 0x8a7ae11fd5dacedb, + 0xa0dedb38e98a0e74, + 0xad109354dcc615a6, + 0x0be91a17f655cc19, + 0x8ddd5ffeb8bdb149, + 0xbfe53028af890aed, + 0xd65ba6f5b4ad7a6a, + 0x7956f0882997227e, + 0x10e8665532b352f9, + 0x0e5361dfdacefe39, + 0xcec7f3049fc90161, + 0xff62b561677f5f2e, + 0x975ccf26d22587f0, + 0x51ef0f86543baf63, + 0x2f1e41ef10cbf28f, + 0x52722635bbb94a88, + 0xae8dbae73344f04d, + 0x410769d36688fd9a, + 0xb3ab94de34bbb966, + 0x801317928df1aa9b, + 0xa564a0f0c5113c54, + 0xf131d4bebdb1a117, + 0x7f71a2f3ea8ef5b5, + 0x40878549c8f655c3, + 0x7ef14e6944f05dec, + 0xd44663dcf55137d8, + 0xf2acfd0d523344fc, + 0x0000000000000000, + 0x5fbc6e598ef5515a, + 0x16cf342ef1aa8532, + 0xb036bd6ddb395c8d, + 0x13754fe6dd31b712, + 0xbbdfa77a2d6c9094, + 0x89e7c8ac3a582b30, + 0x3c6b0e09cdfa459d, + 0xc4ae0589c7e26521, + 0x49735a777f5fd468, + 0xcafd64561d2c9b18, + 0xda1502032f9fc9e1, + 0x8867243694268369, + 0x3782141e3baf8984, + 0x9cb5d53124704be9, + 0xd7db4a6f1ad3d233, + 0xa6f989432a93d9bf, + 0x9d3539ab8a0ee3b0, + 0x53f2caaf15c7e2d1, + 0x6e19283c76430f15, + 0x3debe2936384edc4, + 0x5e3c82c3208bf903, + 0x33b8834cb94a13fd, + 0x6470deb12e686b55, + 0x359fd1377a53c436, + 0x61caa57902f35975, + 0x043a975282e59a79, + 0xfd7f70482683129c, + 0xc52ee913699ccd78, + 0x28b9ff0e7dac8d1d, + 0x5455744e78a09d43, + 0xcb7d88ccb3523341, + 0x44bd121b4a13cfba, + 0x4d49cd25fdba4e11, + 0x3e76cb208c06082f, + 0x3ff627ba2278a076, + 0xc28957f204fbb2ea, + 0x453dfe81e46d67e3, + 0x94c1e6953da7621b, + 0x2c83685cff491764, + 0xf32c1197fc4deca5, + 0x2b24d6bd922e68f6, + 0xb22b78449ac5113f, + 0x48f3b6edd1217c31, + 0x2e9ead75beb55ad6, + 0x174fd8b45fd42d6b, + 0x4ed4e4961238abfa, + 0x92e6b4eefebeb5d0, + 0x46a0d7320bef8208, + 0x47203ba8a5912a51, + 0x24f75bf8e69e3e96, + 0xf0b1382413cf094e, + 0xfee259fbc901f777, + 0x276a724b091cdb7d, + 0xbdf8f501ee75475f, + 0x599b3c224dec8691, + 0x6d84018f99c1eafe, + 0x7498b8e41cdb39ac, + 0xe0595e71217c5bb7, + 0x2aa43a273c50c0af, + 0xf50b43ec3f543b6e, + 0x838e3e2162734f70, + 0xc09492db4507ff58, + 0x72bfea9fdfc2ee67, + 0x11688acf9ccdfaa0, + 0x1a8190d86a9836b9, + 0x7acbd93bc615c795, + 0xc7332c3a286080ca, + 0x863445e94ee87d50, + 0xf6966a5fd0d6de85, + 0xe9ad814f96d5da1c, + 0x70a22fb69e3ea3d5, + 0x0a69f68d582b6440, + 0xb8428ec9c2ee757f, + 0x604a49e3ac8df12c, + 0x5b86f90b0c10cb23, + 0xe1d9b2eb8f02f3ee, + 0x29391394d3d22544, + 0xc8e0a17f5cd0d6aa, + 0xb58cc6a5f7a26ead, + 0x8193fb08238f02c2, + 0xd5c68f465b2f9f81, + 0xfcff9cd288fdbac5, + 0x77059157f359dc47, + 0x1d262e3907ff492b, + 0xfb582233e59ac557, + 0xddb2bce242f8b673, + 0x2577b76248e096cf, + 0x6f99c4a6d83da74c, + 0xc1147e41eb795701, + 0xf48baf76912a9337, + }, + { + 0x45b268a93acde4cc, + 0xaf7f0be884549d08, + 0x048354b3c1468263, + 0x925435c2c80efed2, + 0xee4e37f27fdffba7, + 0x167a33920c60f14d, + 0xfb123b52ea03e584, + 0x4a0cab53fdbb9007, + 0x9deaf6380f788a19, + 0xcb48ec558f0cb32a, + 0xb59dc4b2d6fef7e0, + 0xdcdbca22f4f3ecb6, + 0x11df5813549a9c40, + 0xe33fdedf568aced3, + 0xa0c1c8124322e9c3, + 0x07a56b8158fa6d0d, + 0x77279579b1e1f3dd, + 0xd9b18b74422ac004, + 0xb8ec2d9fffabc294, + 0xf4acf8a82d75914f, + 0x7bbf69b1ef2b6878, + 0xc4f62faf487ac7e1, + 0x76ce809cc67e5d0c, + 0x6711d88f92e4c14c, + 0x627b99d9243dedfe, + 0x234aa5c3dfb68b51, + 0x909b1f15262dbf6d, + 0x4f66ea054b62bcb5, + 0x1ae2cf5a52aa6ae8, + 0xbea053fbd0ce0148, + 0xed6808c0e66314c9, + 0x43fe16cd15a82710, + 0xcd049231a06970f6, + 0xe7bc8a6c97cc4cb0, + 0x337ce835fcb3b9c0, + 0x65def2587cc780f3, + 0x52214ede4132bb50, + 0x95f15e4390f493df, + 0x870839625dd2e0f1, + 0x41313c1afb8b66af, + 0x91720af051b211bc, + 0x477d427ed4eea573, + 0x2e3b4ceef6e3be25, + 0x82627834eb0bcc43, + 0x9c03e3dd78e724c8, + 0x2877328ad9867df9, + 0x14b51945e243b0f2, + 0x574b0f88f7eb97e2, + 0x88b6fa989aa4943a, + 0x19c4f068cb168586, + 0x50ee6409af11faef, + 0x7df317d5c04eaba4, + 0x7a567c5498b4c6a9, + 0xb6bbfb804f42188e, + 0x3cc22bcf3bc5cd0b, + 0xd04336eaaa397713, + 0xf02fac1bec33132c, + 0x2506dba7f0d3488d, + 0xd7e65d6bf2c31a1e, + 0x5eb9b2161ff820f5, + 0x842e0650c46e0f9f, + 0x716beb1d9e843001, + 0xa933758cab315ed4, + 0x3fe414fda2792265, + 0x27c9f1701ef00932, + 0x73a4c1ca70a771be, + 0x94184ba6e76b3d0e, + 0x40d829ff8c14c87e, + 0x0fbec3fac77674cb, + 0x3616a9634a6a9572, + 0x8f139119c25ef937, + 0xf545ed4d5aea3f9e, + 0xe802499650ba387b, + 0x6437e7bd0b582e22, + 0xe6559f89e053e261, + 0x80ad52e305288dfc, + 0x6dc55a23e34b9935, + 0xde14e0f51ad0ad09, + 0xc6390578a659865e, + 0x96d7617109487cb1, + 0xe2d6cb3a21156002, + 0x01e915e5779faed1, + 0xadb0213f6a77dcb7, + 0x9880b76eb9a1a6ab, + 0x5d9f8d248644cf9b, + 0xfd5e4536c5662658, + 0xf1c6b9fe9bacbdfd, + 0xeacd6341be9979c4, + 0xefa7221708405576, + 0x510771ecd88e543e, + 0xc2ba51cb671f043d, + 0x0ad482ac71af5879, + 0xfe787a045cdac936, + 0xb238af338e049aed, + 0xbd866cc94972ee26, + 0x615da6ebbd810290, + 0x3295fdd08b2c1711, + 0xf834046073bf0aea, + 0xf3099329758ffc42, + 0x1caeb13e7dcfa934, + 0xba2307481188832b, + 0x24efce42874ce65c, + 0x0e57d61fb0e9da1a, + 0xb3d1bad6f99b343c, + 0xc0757b1c893c4582, + 0x2b510db8403a9297, + 0x5c7698c1f1db614a, + 0x3e0d0118d5e68cb4, + 0xd60f488e855cb4cf, + 0xae961e0df3cb33d9, + 0x3a8e55ab14a00ed7, + 0x42170328623789c1, + 0x838b6dd19c946292, + 0x895fef7ded3b3aeb, + 0xcfcbb8e64e4a3149, + 0x064c7e642f65c3dc, + 0x3d2b3e2a4c5a63da, + 0x5bd3f340a9210c47, + 0xb474d157a1615931, + 0xac5934da1de87266, + 0x6ee365117af7765b, + 0xc86ed36716b05c44, + 0x9ba6885c201d49c5, + 0xb905387a88346c45, + 0x131072c4bab9ddff, + 0xbf49461ea751af99, + 0xd52977bc1ce05ba1, + 0xb0f785e46027db52, + 0x546d30ba6e57788c, + 0x305ad707650f56ae, + 0xc987c682612ff295, + 0xa5ab8944f5fbc571, + 0x7ed528e759f244ca, + 0x8ddcbbce2c7db888, + 0xaa154abe328db1ba, + 0x1e619be993ece88b, + 0x09f2bd9ee813b717, + 0x7401aa4b285d1cb3, + 0x21858f143195caee, + 0x48c381841398d1b8, + 0xfcb750d3b2f98889, + 0x39a86a998d1ce1b9, + 0x1f888e0ce473465a, + 0x7899568376978716, + 0x02cf2ad7ee2341bf, + 0x85c713b5b3f1a14e, + 0xff916fe12b4567e7, + 0x7c1a0230b7d10575, + 0x0c98fcc85eca9ba5, + 0xa3e7f720da9e06ad, + 0x6a6031a2bbb1f438, + 0x973e74947ed7d260, + 0x2cf4663918c0ff9a, + 0x5f50a7f368678e24, + 0x34d983b4a449d4cd, + 0x68af1b755592b587, + 0x7f3c3d022e6dea1b, + 0xabfc5f5b45121f6b, + 0x0d71e92d29553574, + 0xdffdf5106d4f03d8, + 0x081ba87b9f8c19c6, + 0xdb7ea1a3ac0981bb, + 0xbbca12ad66172dfa, + 0x79704366010829c7, + 0x179326777bff5f9c, + 0x0000000000000000, + 0xeb2476a4c906d715, + 0x724dd42f0738df6f, + 0xb752ee6538ddb65f, + 0x37ffbc863df53ba3, + 0x8efa84fcb5c157e6, + 0xe9eb5c73272596aa, + 0x1b0bdabf2535c439, + 0x86e12c872a4d4e20, + 0x9969a28bce3e087a, + 0xfafb2eb79d9c4b55, + 0x056a4156b6d92cb2, + 0x5a3ae6a5debea296, + 0x22a3b026a8292580, + 0x53c85b3b36ad1581, + 0xb11e900117b87583, + 0xc51f3a4a3fe56930, + 0xe019e1edcf3621bd, + 0xec811d2591fcba18, + 0x445b7d4c4d524a1d, + 0xa8da6069dcaef005, + 0x58f5cc72309de329, + 0xd4c062596b7ff570, + 0xce22ad0339d59f98, + 0x591cd99747024df8, + 0x8b90c5aa03187b54, + 0xf663d27fc356d0f0, + 0xd8589e9135b56ed5, + 0x35309651d3d67a1c, + 0x12f96721cd26732e, + 0xd28c1c3d441a36ac, + 0x492a946164077f69, + 0x2d1d73dc6f5f514b, + 0x6f0a70f40d68d88a, + 0x60b4b30eca1eac41, + 0xd36509d83385987d, + 0x0b3d97490630f6a8, + 0x9eccc90a96c46577, + 0xa20ee2c5ad01a87c, + 0xe49ab55e0e70a3de, + 0xa4429ca182646ba0, + 0xda97b446db962f6a, + 0xcced87d4d7f6de27, + 0x2ab8185d37a53c46, + 0x9f25dcefe15bcba6, + 0xc19c6ef9fea3eb53, + 0xa764a3931bd884ce, + 0x2fd2590b817c10f4, + 0x56a21a6d80743933, + 0xe573a0bb79ef0d0f, + 0x155c0ca095dc1e23, + 0x6c2c4fc694d437e4, + 0x10364df623053291, + 0xdd32dfc7836c4267, + 0x03263f3299bcef6e, + 0x66f8cd6ae57b6f9d, + 0x8c35ae2b5be21659, + 0x31b3c2e21290f87f, + 0x93bd2027bf915003, + 0x69460e90220d1b56, + 0x299e276fae19d328, + 0x63928c3c53a2432f, + 0x7082fef8e91b9ed0, + 0xbc6f792c3eed40f7, + 0x4c40d537d2de53db, + 0x75e8bfae5fc2b262, + 0x4da9c0d2a541fd0a, + 0x4e8fffe03cfd1264, + 0x2620e495696fa7e3, + 0xe1f0f408b8a98f6c, + 0xd1aa230fdda6d9c2, + 0xc7d0109dd1c6288f, + 0x8a79d04f7487d585, + 0x4694579ba3710ba2, + 0x38417f7cfa834f68, + 0x1d47a4db0a5007e5, + 0x206c9af1460a643f, + 0xa128ddf734bd4712, + 0x8144470672b7232d, + 0xf2e086cc02105293, + 0x182de58dbc892b57, + 0xcaa1f9b0f8931dfb, + 0x6b892447cc2e5ae9, + 0xf9dd11850420a43b, + 0x4be5beb68a243ed6, + 0x5584255f19c8d65d, + 0x3b67404e633fa006, + 0xa68db6766c472a1f, + 0xf78ac79ab4c97e21, + 0xc353442e1080aaec, + 0x9a4f9db95782e714, + }, + { + 0xc811a8058c3f55de, + 0x65f5b43196b50619, + 0xf74f96b1d6706e43, + 0x859d1e8bcb43d336, + 0x5aab8a85ccfa3d84, + 0xf9c7bf99c295fcfd, + 0xa21fd5a1de4b630f, + 0xcdb3ef763b8b456d, + 0x803f59f87cf7c385, + 0xb27c73be5f31913c, + 0x98e3ac6633b04821, + 0xbf61674c26b8f818, + 0x0ffbc995c4c130c8, + 0xaaa0862010761a98, + 0x6057f342210116aa, + 0xf63c760c0654cc35, + 0x2ddb45cc667d9042, + 0xbcf45a964bd40382, + 0x68e8a0c3ef3c6f3d, + 0xa7bd92d269ff73bc, + 0x290ae20201ed2287, + 0xb7de34cde885818f, + 0xd901eea7dd61059b, + 0xd6fa273219a03553, + 0xd56f1ae874cccec9, + 0xea31245c2e83f554, + 0x7034555da07be499, + 0xce26d2ac56e7bef7, + 0xfd161857a5054e38, + 0x6a0e7da4527436d1, + 0x5bd86a381cde9ff2, + 0xcaf7756231770c32, + 0xb09aaed9e279c8d0, + 0x5def1091c60674db, + 0x111046a2515e5045, + 0x23536ce4729802fc, + 0xc50cbcf7f5b63cfa, + 0x73a16887cd171f03, + 0x7d2941afd9f28dbd, + 0x3f5e3eb45a4f3b9d, + 0x84eefe361b677140, + 0x3db8e3d3e7076271, + 0x1a3a28f9f20fd248, + 0x7ebc7c75b49e7627, + 0x74e5f293c7eb565c, + 0x18dcf59e4f478ba4, + 0x0c6ef44fa9adcb52, + 0xc699812d98dac760, + 0x788b06dc6e469d0e, + 0xfc65f8ea7521ec4e, + 0x30a5f7219e8e0b55, + 0x2bec3f65bca57b6b, + 0xddd04969baf1b75e, + 0x99904cdbe394ea57, + 0x14b201d1e6ea40f6, + 0xbbb0c08241284add, + 0x50f20463bf8f1dff, + 0xe8d7f93b93cbacb8, + 0x4d8cb68e477c86e8, + 0xc1dd1b3992268e3f, + 0x7c5aa11209d62fcb, + 0x2f3d98abdb35c9ae, + 0x671369562bfd5ff5, + 0x15c1e16c36cee280, + 0x1d7eb2edf8f39b17, + 0xda94d37db00dfe01, + 0x877bc3ec760b8ada, + 0xcb8495dfe153ae44, + 0x05a24773b7b410b3, + 0x12857b783c32abdf, + 0x8eb770d06812513b, + 0x536739b9d2e3e665, + 0x584d57e271b26468, + 0xd789c78fc9849725, + 0xa935bbfa7d1ae102, + 0x8b1537a3dfa64188, + 0xd0cd5d9bc378de7a, + 0x4ac82c9a4d80cfb7, + 0x42777f1b83bdb620, + 0x72d2883a1d33bd75, + 0x5e7a2d4bab6a8f41, + 0xf4daab6bbb1c95d9, + 0x905cffe7fd8d31b6, + 0x83aa6422119b381f, + 0xc0aefb8442022c49, + 0xa0f908c663033ae3, + 0xa428af0804938826, + 0xade41c341a8a53c7, + 0xae7121ee77e6a85d, + 0xc47f5c4a25929e8c, + 0xb538e9aa55cdd863, + 0x06377aa9dad8eb29, + 0xa18ae87bb3279895, + 0x6edfda6a35e48414, + 0x6b7d9d19825094a7, + 0xd41cfa55a4e86cbf, + 0xe5caedc9ea42c59c, + 0xa36c351c0e6fc179, + 0x5181e4de6fabbf89, + 0xfff0c530184d17d4, + 0x9d41eb1584045892, + 0x1c0d525028d73961, + 0xf178ec180ca8856a, + 0x9a0571018ef811cd, + 0x4091a27c3ef5efcc, + 0x19af15239f6329d2, + 0x347450eff91eb990, + 0xe11b4a078dd27759, + 0xb9561de5fc601331, + 0x912f1f5a2da993c0, + 0x1654dcb65ba2191a, + 0x3e2dde098a6b99eb, + 0x8a66d71e0f82e3fe, + 0x8c51adb7d55a08d7, + 0x4533e50f8941ff7f, + 0x02e6dd67bd4859ec, + 0xe068aaba5df6d52f, + 0xc24826e3ff4a75a5, + 0x6c39070d88acddf8, + 0x6486548c4691a46f, + 0xd1bebd26135c7c0c, + 0xb30f93038f15334a, + 0x82d9849fc1bf9a69, + 0x9c320ba85420fae4, + 0xfa528243aff90767, + 0x9ed4d6cfe968a308, + 0xb825fd582c44b147, + 0x9b7691bc5edcb3bb, + 0xc7ea619048fe6516, + 0x1063a61f817af233, + 0x47d538683409a693, + 0x63c2ce984c6ded30, + 0x2a9fdfd86c81d91d, + 0x7b1e3b06032a6694, + 0x666089ebfbd9fd83, + 0x0a598ee67375207b, + 0x07449a140afc495f, + 0x2ca8a571b6593234, + 0x1f986f8a45bbc2fb, + 0x381aa4a050b372c2, + 0x5423a3add81faf3a, + 0x17273c0b8b86bb6c, + 0xfe83258dc869b5a2, + 0x287902bfd1c980f1, + 0xf5a94bd66b3837af, + 0x88800a79b2caba12, + 0x55504310083b0d4c, + 0xdf36940e07b9eeb2, + 0x04d1a7ce6790b2c5, + 0x612413fff125b4dc, + 0x26f12b97c52c124f, + 0x86082351a62f28ac, + 0xef93632f9937e5e7, + 0x3507b052293a1be6, + 0xe72c30ae570a9c70, + 0xd3586041ae1425e0, + 0xde4574b3d79d4cc4, + 0x92ba228040c5685a, + 0xf00b0ca5dc8c271c, + 0xbe1287f1f69c5a6e, + 0xf39e317fb1e0dc86, + 0x495d114020ec342d, + 0x699b407e3f18cd4b, + 0xdca3a9d46ad51528, + 0x0d1d14f279896924, + 0x0000000000000000, + 0x593eb75fa196c61e, + 0x2e4e78160b116bd8, + 0x6d4ae7b058887f8e, + 0xe65fd013872e3e06, + 0x7a6ddbbbd30ec4e2, + 0xac97fc89caaef1b1, + 0x09ccb33c1e19dbe1, + 0x89f3eac462ee1864, + 0x7770cf49aa87adc6, + 0x56c57eca6557f6d6, + 0x03953dda6d6cfb9a, + 0x36928d884456e07c, + 0x1eeb8f37959f608d, + 0x31d6179c4eaaa923, + 0x6fac3ad7e5c02662, + 0x43049fa653991456, + 0xabd3669dc052b8ee, + 0xaf02c153a7c20a2b, + 0x3ccb036e3723c007, + 0x93c9c23d90e1ca2c, + 0xc33bc65e2f6ed7d3, + 0x4cff56339758249e, + 0xb1e94e64325d6aa6, + 0x37e16d359472420a, + 0x79f8e661be623f78, + 0x5214d90402c74413, + 0x482ef1fdf0c8965b, + 0x13f69bc5ec1609a9, + 0x0e88292814e592be, + 0x4e198b542a107d72, + 0xccc00fcbebafe71b, + 0x1b49c844222b703e, + 0x2564164da840e9d5, + 0x20c6513e1ff4f966, + 0xbac3203f910ce8ab, + 0xf2edd1c261c47ef0, + 0x814cb945acd361f3, + 0x95feb8944a392105, + 0x5c9cf02c1622d6ad, + 0x971865f3f77178e9, + 0xbd87ba2b9bf0a1f4, + 0x444005b259655d09, + 0xed75be48247fbc0b, + 0x7596122e17cff42a, + 0xb44b091785e97a15, + 0x966b854e2755da9f, + 0xeee0839249134791, + 0x32432a4623c652b9, + 0xa8465b47ad3e4374, + 0xf8b45f2412b15e8b, + 0x2417f6f078644ba3, + 0xfb2162fe7fdda511, + 0x4bbbcc279da46dc1, + 0x0173e0bdd024a276, + 0x22208c59a2bca08a, + 0x8fc4906db836f34d, + 0xe4b90d743a6667ea, + 0x7147b5e0705f46ef, + 0x2782cb2a1508b039, + 0xec065ef5f45b1e7d, + 0x21b5b183cfd05b10, + 0xdbe733c060295c77, + 0x9fa73672394c017e, + 0xcf55321186c31c81, + 0xd8720e1a0d45a7ed, + 0x3b8f997a3ddf8958, + 0x3afc79c7edfb2b2e, + 0xe9a4198643ef0ece, + 0x5f09cdf67b4e2d37, + 0x4f6a6be9fa34df04, + 0xb6add47038a123f9, + 0x8d224d0a057eaaa1, + 0xc96248b85c1bf7a8, + 0xe3fd9760309a2eb5, + 0x0b2a6e5ba351820d, + 0xeb42c4e1fea75722, + 0x948d58299a1d8373, + 0x7fcf9cc864bad451, + 0xa55b4fb5d4b72a50, + 0x08bf5381ce3d7997, + 0x46a6d8d5e42d04e5, + 0xd22b80fc7e308796, + 0x57b69e77b57354a0, + 0x3969441d8097d0b4, + 0x3330cafbf3e2f0cf, + 0xe28e77dde0be8cc3, + 0x62b12e259c494f46, + 0xa6ce726fb9dbd1ca, + 0x41e242c1eed14dba, + 0x76032ff47aa30fb0, + }, + { + 0xe6f87e5c5b711fd0, + 0x258377800924fa16, + 0xc849e07e852ea4a8, + 0x5b4686a18f06c16a, + 0x0b32e9a2d77b416e, + 0xabda37a467815c66, + 0xf61796a81a686676, + 0xf5dc0b706391954b, + 0x4862f38db7e64bf1, + 0xff5c629a68bd85c5, + 0xcb827da6fcd75795, + 0x66d36daf69b9f089, + 0x356c9f74483d83b0, + 0x7cbcecb1238c99a1, + 0x36a702ac31c4708d, + 0x9eb6a8d02fbcdfd6, + 0x8b19fa51e5b3ae37, + 0x9ccfb5408a127d0b, + 0xbc0c78b508208f5a, + 0xe533e3842288eced, + 0xcec2c7d377c15fd2, + 0xec7817b6505d0f5e, + 0xb94cc2c08336871d, + 0x8c205db4cb0b04ad, + 0x763c855b28a0892f, + 0x588d1b79f6ff3257, + 0x3fecf69e4311933e, + 0x0fc0d39f803a18c9, + 0xee010a26f5f3ad83, + 0x10efe8f4411979a6, + 0x5dcda10c7de93a10, + 0x4a1bee1d1248e92c, + 0x53bff2db21847339, + 0xb4f50ccfa6a23d09, + 0x5fb4bc9cd84798cd, + 0xe88a2d8b071c56f9, + 0x7f7771695a756a9c, + 0xc5f02e71a0ba1ebc, + 0xa663f9ab4215e672, + 0x2eb19e22de5fbb78, + 0x0db9ce0f2594ba14, + 0x82520e6397664d84, + 0x2f031e6a0208ea98, + 0x5c7f2144a1be6bf0, + 0x7a37cb1cd16362db, + 0x83e08e2b4b311c64, + 0xcf70479bab960e32, + 0x856ba986b9dee71e, + 0xb5478c877af56ce9, + 0xb8fe42885f61d6fd, + 0x1bdd0156966238c8, + 0x622157923ef8a92e, + 0xfc97ff42114476f8, + 0x9d7d350856452ceb, + 0x4c90c9b0e0a71256, + 0x2308502dfbcb016c, + 0x2d7a03faa7a64845, + 0xf46e8b38bfc6c4ab, + 0xbdbef8fdd477deba, + 0x3aac4cebc8079b79, + 0xf09cb105e8879d0c, + 0x27fa6a10ac8a58cb, + 0x8960e7c1401d0cea, + 0x1a6f811e4a356928, + 0x90c4fb0773d196ff, + 0x43501a2f609d0a9f, + 0xf7a516e0c63f3796, + 0x1ce4a6b3b8da9252, + 0x1324752c38e08a9b, + 0xa5a864733bec154f, + 0x2bf124575549b33f, + 0xd766db15440dc5c7, + 0xa7d179e39e42b792, + 0xdadf151a61997fd3, + 0x86a0345ec0271423, + 0x38d5517b6da939a4, + 0x6518f077104003b4, + 0x02791d90a5aea2dd, + 0x88d267899c4a5d0a, + 0x930f66df0a2865c2, + 0x4ee9d4204509b08b, + 0x325538916685292a, + 0x412907bfc533a842, + 0xb27e2b62544dc673, + 0x6c5304456295e007, + 0x5af406e95351908a, + 0x1f2f3b6bc123616f, + 0xc37b09dc5255e5c6, + 0x3967d133b1fe6844, + 0x298839c7f0e711e2, + 0x409b87f71964f9a2, + 0xe938adc3db4b0719, + 0x0c0b4e47f9c3ebf4, + 0x5534d576d36b8843, + 0x4610a05aeb8b02d8, + 0x20c3cdf58232f251, + 0x6de1840dbec2b1e7, + 0xa0e8de06b0fa1d08, + 0x7b854b540d34333b, + 0x42e29a67bcca5b7f, + 0xd8a6088ac437dd0e, + 0xc63bb3a9d943ed81, + 0x21714dbd5e65a3b1, + 0x6761ede7b5eea169, + 0x2431f7c8d573abf6, + 0xd51fc685e1a3671a, + 0x5e063cd40410c92d, + 0x283ab98f2cb04002, + 0x8febc06cb2f2f790, + 0x17d64f116fa1d33c, + 0xe07359f1a99ee4aa, + 0x784ed68c74cdc006, + 0x6e2a19d5c73b42da, + 0x8712b4161c7045c3, + 0x371582e4ed93216d, + 0xace390414939f6fc, + 0x7ec5f12186223b7c, + 0xc0b094042bac16fb, + 0xf9d745379a527ebf, + 0x737c3f2ea3b68168, + 0x33e7b8d9bad278ca, + 0xa9a32a34c22ffebb, + 0xe48163ccfedfbd0d, + 0x8e5940246ea5a670, + 0x51c6ef4b842ad1e4, + 0x22bad065279c508c, + 0xd91488c218608cee, + 0x319ea5491f7cda17, + 0xd394e128134c9c60, + 0x094bf43272d5e3b3, + 0x9bf612a5a4aad791, + 0xccbbda43d26ffd0f, + 0x34de1f3c946ad250, + 0x4f5b5468995ee16b, + 0xdf9faf6fea8f7794, + 0x2648ea5870dd092b, + 0xbfc7e56d71d97c67, + 0xdde6b2ff4f21d549, + 0x3c276b463ae86003, + 0x91767b4faf86c71f, + 0x68a13e7835d4b9a0, + 0xb68c115f030c9fd4, + 0x141dd2c916582001, + 0x983d8f7ddd5324ac, + 0x64aa703fcc175254, + 0xc2c989948e02b426, + 0x3e5e76d69f46c2de, + 0x50746f03587d8004, + 0x45db3d829272f1e5, + 0x60584a029b560bf3, + 0xfbae58a73ffcdc62, + 0xa15a5e4e6cad4ce8, + 0x4ba96e55ce1fb8cc, + 0x08f9747aae82b253, + 0xc102144cf7fb471b, + 0x9f042898f3eb8e36, + 0x068b27adf2effb7a, + 0xedca97fe8c0a5ebe, + 0x778e0513f4f7d8cf, + 0x302c2501c32b8bf7, + 0x8d92ddfc175c554d, + 0xf865c57f46052f5f, + 0xeaf3301ba2b2f424, + 0xaa68b7ecbbd60d86, + 0x998f0f350104754c, + 0x0000000000000000, + 0xf12e314d34d0ccec, + 0x710522be061823b5, + 0xaf280d9930c005c1, + 0x97fd5ce25d693c65, + 0x19a41cc633cc9a15, + 0x95844172f8c79eb8, + 0xdc5432b7937684a9, + 0x9436c13a2490cf58, + 0x802b13f332c8ef59, + 0xc442ae397ced4f5c, + 0xfa1cd8efe3ab8d82, + 0xf2e5ac954d293fd1, + 0x6ad823e8907a1b7d, + 0x4d2249f83cf043b6, + 0x03cb9dd879f9f33d, + 0xde2d2f2736d82674, + 0x2a43a41f891ee2df, + 0x6f98999d1b6c133a, + 0xd4ad46cd3df436fa, + 0xbb35df50269825c0, + 0x964fdcaa813e6d85, + 0xeb41b0537ee5a5c4, + 0x0540ba758b160847, + 0xa41ae43be7bb44af, + 0xe3b8c429d0671797, + 0x819993bbee9fbeb9, + 0xae9a8dd1ec975421, + 0xf3572cdd917e6e31, + 0x6393d7dae2aff8ce, + 0x47a2201237dc5338, + 0xa32343dec903ee35, + 0x79fc56c4a89a91e6, + 0x01b28048dc5751e0, + 0x1296f564e4b7db7b, + 0x75f7188351597a12, + 0xdb6d9552bdce2e33, + 0x1e9dbb231d74308f, + 0x520d7293fdd322d9, + 0xe20a44610c304677, + 0xfeeee2d2b4ead425, + 0xca30fdee20800675, + 0x61eaca4a47015a13, + 0xe74afe1487264e30, + 0x2cc883b27bf119a5, + 0x1664cf59b3f682dc, + 0xa811aa7c1e78af5b, + 0x1d5626fb648dc3b2, + 0xb73e9117df5bce34, + 0xd05f7cf06ab56f5d, + 0xfd257f0acd132718, + 0x574dc8e676c52a9e, + 0x0739a7e52eb8aa9a, + 0x5486553e0f3cd9a3, + 0x56ff48aeaa927b7e, + 0xbe756525ad8e2d87, + 0x7d0e6cf9ffdbc841, + 0x3b1ecca31450ca99, + 0x6913be30e983e840, + 0xad511009956ea71c, + 0xb1b5b6ba2db4354e, + 0x4469bdca4e25a005, + 0x15af5281ca0f71e1, + 0x744598cb8d0e2bf2, + 0x593f9b312aa863b7, + 0xefb38a6e29a4fc63, + 0x6b6aa3a04c2d4a9d, + 0x3d95eb0ee6bf31e3, + 0xa291c3961554bfd5, + 0x18169c8eef9bcbf5, + 0x115d68bc9d4e2846, + 0xba875f18facf7420, + 0xd1edfcb8b6e23ebd, + 0xb00736f2f1e364ae, + 0x84d929ce6589b6fe, + 0x70b7a2f6da4f7255, + 0x0e7253d75c6d4929, + 0x04f23a3d574159a7, + 0x0a8069ea0b2c108e, + 0x49d073c56bb11a11, + 0x8aab7a1939e4ffd7, + 0xcd095a0b0e38acef, + 0xc9fb60365979f548, + 0x92bde697d67f3422, + 0xc78933e10514bc61, + 0xe1c1d9b975c9b54a, + 0xd2266160cf1bcd80, + 0x9a4492ed78fd8671, + 0xb3ccab2a881a9793, + 0x72cebf667fe1d088, + 0xd6d45b5d985a9427, + }, +}; + +__device__ __constant__ u64 sbob_rc64[12][8] = +{ + { + 0xe9daca1eda5b08b1, + 0x1f7c65c0812fcbeb, + 0x16d0452e43766a2f, + 0xfcc485758db84e71, + 0x0169679291e07c4b, + 0x15d360a4082a42a2, + 0x234d74cc36747605, + 0x0745a6f2596580dd, + }, + { + 0x1a2f9da98ab5a36f, + 0xd7b5700f469de34f, + 0x982b230a72eafef3, + 0x3101b5160f5ed561, + 0x5899d6126b17b59a, + 0xcaa70adbc261b55c, + 0x56cdcbd71ba2dd55, + 0xb79bb121700479e6, + }, + { + 0xc72fce2bacdc74f5, + 0x35843d6a28fc390a, + 0x8b1f9c525f5ef106, + 0x7b7b29b11475eaf2, + 0xb19e3590e40fe2d3, + 0x09db6260373ac9c1, + 0x31db7a8643f4b6c2, + 0xb20aba0af5961e99, + }, + { + 0xd26615e8b3df1fef, + 0xdde4715da0e148f9, + 0x7d3c5c337e858e48, + 0x3f355e68ad1c729d, + 0x75d603ed822cd7a9, + 0xbe0352933313b7d8, + 0xf137e893a1ea5334, + 0x2ed1e384bcbe0c22, + }, + { + 0x994747adac6bea4b, + 0x6323a96c0c413f9a, + 0x4a1086161f1c157f, + 0xbdff0f80d7359e35, + 0xa3f53a254717cdbf, + 0x161a2723b700ffdf, + 0xf563eaa97ea2567a, + 0x57fe6c7cfd581760, + }, + { + 0xd9d33a1daeae4fae, + 0xc039307a3bc3a46f, + 0x6ca44251f9c4662d, + 0xc68ef09ab49a7f18, + 0xb4b79a1cb7a6facf, + 0xb6c6bec2661ff20a, + 0x354f903672c571bf, + 0x6e7d64467a4068fa, + }, + { + 0xecc5aaee160ec7f4, + 0x540924bffe86ac51, + 0xc987bfe6c7c69e39, + 0xc9937a19333e47d3, + 0x372c822dc5ab9209, + 0x04054a2883694706, + 0xf34a3ca24c451735, + 0x93d4143a4d568688, + }, + { + 0xa7c9934d425b1f9b, + 0x41416e0c02aae703, + 0x1ede369c71f8b74e, + 0x9ac4db4d3b44b489, + 0x90069b92cb2b89f4, + 0x2fc4a5d12b8dd169, + 0xd9a8515935c2ac36, + 0x1ee702bfd40d7fa4, + }, + { + 0x9b223116545a8f37, + 0xde5f16ecd89a4c94, + 0x244289251b3a7d3a, + 0x84090de0b755d93c, + 0xb1ceb2db0b440a80, + 0x549c07a69a8a2b7b, + 0x602a1fcb92dc380e, + 0xdb5a238351446172, + }, + { + 0x526f0580a6debeab, + 0xf3f3e4b248e52a38, + 0xdb788aff1ce74189, + 0x0361331b8ae1ff1f, + 0x4b3369af0267e79f, + 0xf452763b306c1e7a, + 0xc3b63b15d1fa9836, + 0xed9c4598fbc7b474, + }, + { + 0xfb89c8efd09ecd7b, + 0x94fe5a63cdc60230, + 0x6107abebbb6bfad8, + 0x7966841421800120, + 0xcab948eaef711d8a, + 0x986e477d1dcdbaef, + 0x5dd86fc04a59a2de, + 0x1b2df381cda4ca6b, + }, + { + 0xba3116f167e78e37, + 0x7ab14904b08013d2, + 0x771ddfbc323ca4cd, + 0x9b9f2130d41220f8, + 0x86cc91189def805d, + 0x5228e188aaa41de7, + 0x991bb2d9d517f4fa, + 0x20d71bf14a92bc48, + }, +}; + +__device__ static void streebog_g (u64 h[8], const u64 m[8], u64 s_sbob_sl64[8][256]) +{ + u64 k[8]; + u64 s[8]; + u64 t[8]; + + #pragma unroll + for (int i = 0; i < 8; i++) + { + t[i] = h[i]; + } + + for (int i = 0; i < 8; i++) + { + k[i] = SBOG_LPSti64; + } + + #pragma unroll + for (int i = 0; i < 8; i++) + { + s[i] = m[i]; + } + + for (int r = 0; r < 12; r++) + { + #pragma unroll + for (int i = 0; i < 8; i++) + { + t[i] = s[i] ^ k[i]; + } + + #pragma unroll + for (int i = 0; i < 8; i++) + { + s[i] = SBOG_LPSti64; + } + + for (int i = 0; i < 8; i++) + { + t[i] = k[i] ^ sbob_rc64[r][i]; + } + + #pragma unroll + for (int i = 0; i < 8; i++) + { + k[i] = SBOG_LPSti64; + } + } + + #pragma unroll + for (int i = 0; i < 8; i++) + { + h[i] ^= s[i] ^ k[i] ^ m[i]; + } +} + +__device__ __constant__ comb_t c_combs[1024]; + +extern "C" __global__ void __launch_bounds__ (256, 1) m11700_m04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + /** + * shared lookup table + */ + + __shared__ u64 s_sbob_sl64[8][256]; + + if (lid < 64) + { + const u32 lid4 = lid * 4; + + s_sbob_sl64[0][lid4 + 0] = sbob_sl64[0][lid4 + 0]; + s_sbob_sl64[0][lid4 + 1] = sbob_sl64[0][lid4 + 1]; + s_sbob_sl64[0][lid4 + 2] = sbob_sl64[0][lid4 + 2]; + s_sbob_sl64[0][lid4 + 3] = sbob_sl64[0][lid4 + 3]; + s_sbob_sl64[1][lid4 + 0] = sbob_sl64[1][lid4 + 0]; + s_sbob_sl64[1][lid4 + 1] = sbob_sl64[1][lid4 + 1]; + s_sbob_sl64[1][lid4 + 2] = sbob_sl64[1][lid4 + 2]; + s_sbob_sl64[1][lid4 + 3] = sbob_sl64[1][lid4 + 3]; + s_sbob_sl64[2][lid4 + 0] = sbob_sl64[2][lid4 + 0]; + s_sbob_sl64[2][lid4 + 1] = sbob_sl64[2][lid4 + 1]; + s_sbob_sl64[2][lid4 + 2] = sbob_sl64[2][lid4 + 2]; + s_sbob_sl64[2][lid4 + 3] = sbob_sl64[2][lid4 + 3]; + s_sbob_sl64[3][lid4 + 0] = sbob_sl64[3][lid4 + 0]; + s_sbob_sl64[3][lid4 + 1] = sbob_sl64[3][lid4 + 1]; + s_sbob_sl64[3][lid4 + 2] = sbob_sl64[3][lid4 + 2]; + s_sbob_sl64[3][lid4 + 3] = sbob_sl64[3][lid4 + 3]; + s_sbob_sl64[4][lid4 + 0] = sbob_sl64[4][lid4 + 0]; + s_sbob_sl64[4][lid4 + 1] = sbob_sl64[4][lid4 + 1]; + s_sbob_sl64[4][lid4 + 2] = sbob_sl64[4][lid4 + 2]; + s_sbob_sl64[4][lid4 + 3] = sbob_sl64[4][lid4 + 3]; + s_sbob_sl64[5][lid4 + 0] = sbob_sl64[5][lid4 + 0]; + s_sbob_sl64[5][lid4 + 1] = sbob_sl64[5][lid4 + 1]; + s_sbob_sl64[5][lid4 + 2] = sbob_sl64[5][lid4 + 2]; + s_sbob_sl64[5][lid4 + 3] = sbob_sl64[5][lid4 + 3]; + s_sbob_sl64[6][lid4 + 0] = sbob_sl64[6][lid4 + 0]; + s_sbob_sl64[6][lid4 + 1] = sbob_sl64[6][lid4 + 1]; + s_sbob_sl64[6][lid4 + 2] = sbob_sl64[6][lid4 + 2]; + s_sbob_sl64[6][lid4 + 3] = sbob_sl64[6][lid4 + 3]; + s_sbob_sl64[7][lid4 + 0] = sbob_sl64[7][lid4 + 0]; + s_sbob_sl64[7][lid4 + 1] = sbob_sl64[7][lid4 + 1]; + s_sbob_sl64[7][lid4 + 2] = sbob_sl64[7][lid4 + 2]; + s_sbob_sl64[7][lid4 + 3] = sbob_sl64[7][lid4 + 3]; + } + + __syncthreads (); + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + append_0x80_2 (wordl0, wordl1, pw_l_len); + + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, c_combs[0].pw_len); + } + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = c_combs[il_pos].pw_len; + + const u32 pw_len = pw_l_len + pw_r_len; + + u32 wordr0[4]; + + wordr0[0] = c_combs[il_pos].i[0]; + wordr0[1] = c_combs[il_pos].i[1]; + wordr0[2] = c_combs[il_pos].i[2]; + wordr0[3] = c_combs[il_pos].i[3]; + + u32 wordr1[4]; + + wordr1[0] = c_combs[il_pos].i[4]; + wordr1[1] = c_combs[il_pos].i[5]; + wordr1[2] = c_combs[il_pos].i[6]; + wordr1[3] = c_combs[il_pos].i[7]; + + u32 wordr2[4]; + + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + + u32 wordr3[4]; + + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + u32x w[16]; + + w[ 0] = wordl0[0] | wordr0[0]; + w[ 1] = wordl0[1] | wordr0[1]; + w[ 2] = wordl0[2] | wordr0[2]; + w[ 3] = wordl0[3] | wordr0[3]; + w[ 4] = wordl1[0] | wordr1[0]; + w[ 5] = wordl1[1] | wordr1[1]; + w[ 6] = wordl1[2] | wordr1[2]; + w[ 7] = wordl1[3] | wordr1[3]; + w[ 8] = wordl2[0] | wordr2[0]; + w[ 9] = wordl2[1] | wordr2[1]; + w[10] = wordl2[2] | wordr2[2]; + w[11] = wordl2[3] | wordr2[3]; + w[12] = wordl3[0] | wordr3[0]; + w[13] = wordl3[1] | wordr3[1]; + w[14] = wordl3[1] | wordr3[1]; + w[15] = wordl3[1] | wordr3[1]; + + append_0x01_4 (&w[0], &w[1], &w[2], &w[3], pw_len); + + /** + * reverse message block + */ + + u64 m[8]; + + m[0] = hl32_to_64 (w[15], w[14]); + m[1] = hl32_to_64 (w[13], w[12]); + m[2] = hl32_to_64 (w[11], w[10]); + m[3] = hl32_to_64 (w[ 9], w[ 8]); + m[4] = hl32_to_64 (w[ 7], w[ 6]); + m[5] = hl32_to_64 (w[ 5], w[ 4]); + m[6] = hl32_to_64 (w[ 3], w[ 2]); + m[7] = hl32_to_64 (w[ 1], w[ 0]); + + m[0] = swap_workaround (m[0]); + m[1] = swap_workaround (m[1]); + m[2] = swap_workaround (m[2]); + m[3] = swap_workaround (m[3]); + m[4] = swap_workaround (m[4]); + m[5] = swap_workaround (m[5]); + m[6] = swap_workaround (m[6]); + m[7] = swap_workaround (m[7]); + + // state buffer (hash) + + u64 h[8]; + + h[0] = INITVAL; + h[1] = INITVAL; + h[2] = INITVAL; + h[3] = INITVAL; + h[4] = INITVAL; + h[5] = INITVAL; + h[6] = INITVAL; + h[7] = INITVAL; + + streebog_g (h, m, s_sbob_sl64); + + u64 z[8]; + + z[0] = 0; + z[1] = 0; + z[2] = 0; + z[3] = 0; + z[4] = 0; + z[5] = 0; + z[6] = 0; + z[7] = swap_workaround ((u64) (pw_len * 8)); + + streebog_g (h, z, s_sbob_sl64); + streebog_g (h, m, s_sbob_sl64); + + const u32 r0 = l32_from_64 (h[0]); + const u32 r1 = h32_from_64 (h[0]); + const u32 r2 = l32_from_64 (h[1]); + const u32 r3 = h32_from_64 (h[1]); + + #include VECT_COMPARE_M + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m11700_m08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m11700_m16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m11700_s04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + /** + * shared lookup table + */ + + __shared__ u64 s_sbob_sl64[8][256]; + + if (lid < 64) + { + const u32 lid4 = lid * 4; + + s_sbob_sl64[0][lid4 + 0] = sbob_sl64[0][lid4 + 0]; + s_sbob_sl64[0][lid4 + 1] = sbob_sl64[0][lid4 + 1]; + s_sbob_sl64[0][lid4 + 2] = sbob_sl64[0][lid4 + 2]; + s_sbob_sl64[0][lid4 + 3] = sbob_sl64[0][lid4 + 3]; + s_sbob_sl64[1][lid4 + 0] = sbob_sl64[1][lid4 + 0]; + s_sbob_sl64[1][lid4 + 1] = sbob_sl64[1][lid4 + 1]; + s_sbob_sl64[1][lid4 + 2] = sbob_sl64[1][lid4 + 2]; + s_sbob_sl64[1][lid4 + 3] = sbob_sl64[1][lid4 + 3]; + s_sbob_sl64[2][lid4 + 0] = sbob_sl64[2][lid4 + 0]; + s_sbob_sl64[2][lid4 + 1] = sbob_sl64[2][lid4 + 1]; + s_sbob_sl64[2][lid4 + 2] = sbob_sl64[2][lid4 + 2]; + s_sbob_sl64[2][lid4 + 3] = sbob_sl64[2][lid4 + 3]; + s_sbob_sl64[3][lid4 + 0] = sbob_sl64[3][lid4 + 0]; + s_sbob_sl64[3][lid4 + 1] = sbob_sl64[3][lid4 + 1]; + s_sbob_sl64[3][lid4 + 2] = sbob_sl64[3][lid4 + 2]; + s_sbob_sl64[3][lid4 + 3] = sbob_sl64[3][lid4 + 3]; + s_sbob_sl64[4][lid4 + 0] = sbob_sl64[4][lid4 + 0]; + s_sbob_sl64[4][lid4 + 1] = sbob_sl64[4][lid4 + 1]; + s_sbob_sl64[4][lid4 + 2] = sbob_sl64[4][lid4 + 2]; + s_sbob_sl64[4][lid4 + 3] = sbob_sl64[4][lid4 + 3]; + s_sbob_sl64[5][lid4 + 0] = sbob_sl64[5][lid4 + 0]; + s_sbob_sl64[5][lid4 + 1] = sbob_sl64[5][lid4 + 1]; + s_sbob_sl64[5][lid4 + 2] = sbob_sl64[5][lid4 + 2]; + s_sbob_sl64[5][lid4 + 3] = sbob_sl64[5][lid4 + 3]; + s_sbob_sl64[6][lid4 + 0] = sbob_sl64[6][lid4 + 0]; + s_sbob_sl64[6][lid4 + 1] = sbob_sl64[6][lid4 + 1]; + s_sbob_sl64[6][lid4 + 2] = sbob_sl64[6][lid4 + 2]; + s_sbob_sl64[6][lid4 + 3] = sbob_sl64[6][lid4 + 3]; + s_sbob_sl64[7][lid4 + 0] = sbob_sl64[7][lid4 + 0]; + s_sbob_sl64[7][lid4 + 1] = sbob_sl64[7][lid4 + 1]; + s_sbob_sl64[7][lid4 + 2] = sbob_sl64[7][lid4 + 2]; + s_sbob_sl64[7][lid4 + 3] = sbob_sl64[7][lid4 + 3]; + } + + __syncthreads (); + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + append_0x80_2 (wordl0, wordl1, pw_l_len); + + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, c_combs[0].pw_len); + } + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = c_combs[il_pos].pw_len; + + const u32 pw_len = pw_l_len + pw_r_len; + + u32 wordr0[4]; + + wordr0[0] = c_combs[il_pos].i[0]; + wordr0[1] = c_combs[il_pos].i[1]; + wordr0[2] = c_combs[il_pos].i[2]; + wordr0[3] = c_combs[il_pos].i[3]; + + u32 wordr1[4]; + + wordr1[0] = c_combs[il_pos].i[4]; + wordr1[1] = c_combs[il_pos].i[5]; + wordr1[2] = c_combs[il_pos].i[6]; + wordr1[3] = c_combs[il_pos].i[7]; + + u32 wordr2[4]; + + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + + u32 wordr3[4]; + + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + u32x w[16]; + + w[ 0] = wordl0[0] | wordr0[0]; + w[ 1] = wordl0[1] | wordr0[1]; + w[ 2] = wordl0[2] | wordr0[2]; + w[ 3] = wordl0[3] | wordr0[3]; + w[ 4] = wordl1[0] | wordr1[0]; + w[ 5] = wordl1[1] | wordr1[1]; + w[ 6] = wordl1[2] | wordr1[2]; + w[ 7] = wordl1[3] | wordr1[3]; + w[ 8] = wordl2[0] | wordr2[0]; + w[ 9] = wordl2[1] | wordr2[1]; + w[10] = wordl2[2] | wordr2[2]; + w[11] = wordl2[3] | wordr2[3]; + w[12] = wordl3[0] | wordr3[0]; + w[13] = wordl3[1] | wordr3[1]; + w[14] = wordl3[1] | wordr3[1]; + w[15] = wordl3[1] | wordr3[1]; + + append_0x01_4 (&w[0], &w[1], &w[2], &w[3], pw_len); + + /** + * reverse message block + */ + + u64 m[8]; + + m[0] = hl32_to_64 (w[15], w[14]); + m[1] = hl32_to_64 (w[13], w[12]); + m[2] = hl32_to_64 (w[11], w[10]); + m[3] = hl32_to_64 (w[ 9], w[ 8]); + m[4] = hl32_to_64 (w[ 7], w[ 6]); + m[5] = hl32_to_64 (w[ 5], w[ 4]); + m[6] = hl32_to_64 (w[ 3], w[ 2]); + m[7] = hl32_to_64 (w[ 1], w[ 0]); + + m[0] = swap_workaround (m[0]); + m[1] = swap_workaround (m[1]); + m[2] = swap_workaround (m[2]); + m[3] = swap_workaround (m[3]); + m[4] = swap_workaround (m[4]); + m[5] = swap_workaround (m[5]); + m[6] = swap_workaround (m[6]); + m[7] = swap_workaround (m[7]); + + // state buffer (hash) + + u64 h[8]; + + h[0] = INITVAL; + h[1] = INITVAL; + h[2] = INITVAL; + h[3] = INITVAL; + h[4] = INITVAL; + h[5] = INITVAL; + h[6] = INITVAL; + h[7] = INITVAL; + + streebog_g (h, m, s_sbob_sl64); + + u64 z[8]; + + z[0] = 0; + z[1] = 0; + z[2] = 0; + z[3] = 0; + z[4] = 0; + z[5] = 0; + z[6] = 0; + z[7] = swap_workaround ((u64) (pw_len * 8)); + + streebog_g (h, z, s_sbob_sl64); + streebog_g (h, m, s_sbob_sl64); + + const u32 r0 = l32_from_64 (h[0]); + const u32 r1 = h32_from_64 (h[0]); + const u32 r2 = l32_from_64 (h[1]); + const u32 r3 = h32_from_64 (h[1]); + + #include VECT_COMPARE_S + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m11700_s08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m11700_s16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/nv/m11700_a3.cu b/nv/m11700_a3.cu new file mode 100644 index 0000000000..f2175ea3d0 --- /dev/null +++ b/nv/m11700_a3.cu @@ -0,0 +1,2993 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _GOST2012_256_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW2 +#define VECT_SIZE1 +#endif + +#define DGST_R0 0 +#define DGST_R1 1 +#define DGST_R2 2 +#define DGST_R3 3 + +#include "include/kernel_functions.c" +#include "types_nv.c" +#include "common_nv.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +#define INITVAL 0x0101010101010101 + +#define SBOG_LPSti64 \ + s_sbob_sl64[0][(t[0] >> (i * 8)) & 0xff] ^ \ + s_sbob_sl64[1][(t[1] >> (i * 8)) & 0xff] ^ \ + s_sbob_sl64[2][(t[2] >> (i * 8)) & 0xff] ^ \ + s_sbob_sl64[3][(t[3] >> (i * 8)) & 0xff] ^ \ + s_sbob_sl64[4][(t[4] >> (i * 8)) & 0xff] ^ \ + s_sbob_sl64[5][(t[5] >> (i * 8)) & 0xff] ^ \ + s_sbob_sl64[6][(t[6] >> (i * 8)) & 0xff] ^ \ + s_sbob_sl64[7][(t[7] >> (i * 8)) & 0xff] + +// constants + +__device__ __constant__ u64 sbob_sl64[8][256] = +{ + { + 0xd031c397ce553fe6, + 0x16ba5b01b006b525, + 0xa89bade6296e70c8, + 0x6a1f525d77d3435b, + 0x6e103570573dfa0b, + 0x660efb2a17fc95ab, + 0x76327a9e97634bf6, + 0x4bad9d6462458bf5, + 0xf1830caedbc3f748, + 0xc5c8f542669131ff, + 0x95044a1cdc48b0cb, + 0x892962df3cf8b866, + 0xb0b9e208e930c135, + 0xa14fb3f0611a767c, + 0x8d2605f21c160136, + 0xd6b71922fecc549e, + 0x37089438a5907d8b, + 0x0b5da38e5803d49c, + 0x5a5bcc9cea6f3cbc, + 0xedae246d3b73ffe5, + 0xd2b87e0fde22edce, + 0x5e54abb1ca8185ec, + 0x1de7f88fe80561b9, + 0xad5e1a870135a08c, + 0x2f2adbd665cecc76, + 0x5780b5a782f58358, + 0x3edc8a2eede47b3f, + 0xc9d95c3506bee70f, + 0x83be111d6c4e05ee, + 0xa603b90959367410, + 0x103c81b4809fde5d, + 0x2c69b6027d0c774a, + 0x399080d7d5c87953, + 0x09d41e16487406b4, + 0xcdd63b1826505e5f, + 0xf99dc2f49b0298e8, + 0x9cd0540a943cb67f, + 0xbca84b7f891f17c5, + 0x723d1db3b78df2a6, + 0x78aa6e71e73b4f2e, + 0x1433e699a071670d, + 0x84f21be454620782, + 0x98df3327b4d20f2f, + 0xf049dce2d3769e5c, + 0xdb6c60199656eb7a, + 0x648746b2078b4783, + 0x32cd23598dcbadcf, + 0x1ea4955bf0c7da85, + 0xe9a143401b9d46b5, + 0xfd92a5d9bbec21b8, + 0xc8138c790e0b8e1b, + 0x2ee00b9a6d7ba562, + 0xf85712b893b7f1fc, + 0xeb28fed80bea949d, + 0x564a65eb8a40ea4c, + 0x6c9988e8474a2823, + 0x4535898b121d8f2d, + 0xabd8c03231accbf4, + 0xba2e91cab9867cbd, + 0x7960be3def8e263a, + 0x0c11a977602fd6f0, + 0xcb50e1ad16c93527, + 0xeae22e94035ffd89, + 0x2866d12f5de2ce1a, + 0xff1b1841ab9bf390, + 0x9f9339de8cfe0d43, + 0x964727c8c48a0bf7, + 0x524502c6aaae531c, + 0x9b9c5ef3ac10b413, + 0x4fa2fa4942ab32a5, + 0x3f165a62e551122b, + 0xc74148da76e6e3d7, + 0x924840e5e464b2a7, + 0xd372ae43d69784da, + 0x233b72a105e11a86, + 0xa48a04914941a638, + 0xb4b68525c9de7865, + 0xddeabaaca6cf8002, + 0x0a9773c250b6bd88, + 0xc284ffbb5ebd3393, + 0x8ba0df472c8f6a4e, + 0x2aef6cb74d951c32, + 0x427983722a318d41, + 0x73f7cdffbf389bb2, + 0x074c0af9382c026c, + 0x8a6a0f0b243a035a, + 0x6fdae53c5f88931f, + 0xc68b98967e538ac3, + 0x44ff59c71aa8e639, + 0xe2fce0ce439e9229, + 0xa20cde2479d8cd40, + 0x19e89fa2c8ebd8e9, + 0xf446bbcff398270c, + 0x43b3533e2284e455, + 0xd82f0dcd8e945046, + 0x51066f12b26ce820, + 0xe73957af6bc5426d, + 0x081ece5a40c16fa0, + 0x3b193d4fc5bfab7b, + 0x7fe66488df174d42, + 0x0e9814ef705804d8, + 0x8137ac857c39d7c6, + 0xb1733244e185a821, + 0x695c3f896f11f867, + 0xf6cf0657e3eff524, + 0x1aabf276d02963d5, + 0x2da3664e75b91e5e, + 0x0289bd981077d228, + 0x90c1fd7df413608f, + 0x3c5537b6fd93a917, + 0xaa12107e3919a2e0, + 0x0686dab530996b78, + 0xdaa6b0559ee3826e, + 0xc34e2ff756085a87, + 0x6d5358a44fff4137, + 0xfc587595b35948ac, + 0x7ca5095cc7d5f67e, + 0xfb147f6c8b754ac0, + 0xbfeb26ab91ddacf9, + 0x6896efc567a49173, + 0xca9a31e11e7c5c33, + 0xbbe44186b13315a9, + 0x0ddb793b689abfe4, + 0x70b4a02ba7fa208e, + 0xe47a3a7b7307f951, + 0x8cecd5be14a36822, + 0xeeed49b923b144d9, + 0x17708b4db8b3dc31, + 0x6088219f2765fed3, + 0xb3fa8fdcf1f27a09, + 0x910b2d31fca6099b, + 0x0f52c4a378ed6dcc, + 0x50ccbf5ebad98134, + 0x6bd582117f662a4f, + 0x94ce9a50d4fdd9df, + 0x2b25bcfb45207526, + 0x67c42b661f49fcbf, + 0x492420fc723259dd, + 0x03436dd418c2bb3c, + 0x1f6e4517f872b391, + 0xa08563bc69af1f68, + 0xd43ea4baeebb86b6, + 0x01cad04c08b56914, + 0xac94cacb0980c998, + 0x54c3d8739a373864, + 0x26fec5c02dbacac2, + 0xdea9d778be0d3b3e, + 0x040f672d20eeb950, + 0xe5b0ea377bb29045, + 0xf30ab136cbb42560, + 0x62019c0737122cfb, + 0xe86b930c13282fa1, + 0xcc1ceb542ee5374b, + 0x538fd28aa21b3a08, + 0x1b61223ad89c0ac1, + 0x36c24474ad25149f, + 0x7a23d3e9f74c9d06, + 0xbe21f6e79968c5ed, + 0xcf5f868036278c77, + 0xf705d61beb5a9c30, + 0x4d2b47d152dce08d, + 0x5f9e7bfdc234ecf8, + 0x247778583dcd18ea, + 0x867ba67c4415d5aa, + 0x4ce1979d5a698999, + 0x0000000000000000, + 0xec64f42133c696f1, + 0xb57c5569c16b1171, + 0xc1c7926f467f88af, + 0x654d96fe0f3e2e97, + 0x15f936d5a8c40e19, + 0xb8a72c52a9f1ae95, + 0xa9517daa21db19dc, + 0x58d27104fa18ee94, + 0x5918a148f2ad8780, + 0x5cdd1629daf657c4, + 0x8274c15164fb6cfa, + 0xd1fb13dbc6e056f2, + 0x7d6fd910cf609f6a, + 0xb63f38bdd9a9aa4d, + 0x3d9fe7faf526c003, + 0x74bbc706871499de, + 0xdf630734b6b8522a, + 0x3ad3ed03cd0ac26f, + 0xfadeaf2083c023d4, + 0xc00d42234ecae1bb, + 0x8538cba85cd76e96, + 0xc402250e6e2458eb, + 0x47bc3413026a5d05, + 0xafd7a71f114272a4, + 0x978df784cc3f62e3, + 0xb96dfc1ea144c781, + 0x21b2cf391596c8ae, + 0x318e4e8d950916f3, + 0xce9556cc3e92e563, + 0x385a509bdd7d1047, + 0x358129a0b5e7afa3, + 0xe6f387e363702b79, + 0xe0755d5653e94001, + 0x7be903a5fff9f412, + 0x12b53c2c90e80c75, + 0x3307f315857ec4db, + 0x8fafb86a0c61d31e, + 0xd9e5dd8186213952, + 0x77f8aad29fd622e2, + 0x25bda814357871fe, + 0x7571174a8fa1f0ca, + 0x137fec60985d6561, + 0x30449ec19dbc7fe7, + 0xa540d4dd41f4cf2c, + 0xdc206ae0ae7ae916, + 0x5b911cd0e2da55a8, + 0xb2305f90f947131d, + 0x344bf9ecbd52c6b7, + 0x5d17c665d2433ed0, + 0x18224feec05eb1fd, + 0x9e59e992844b6457, + 0x9a568ebfa4a5dd07, + 0xa3c60e68716da454, + 0x7e2cb4c4d7a22456, + 0x87b176304ca0bcbe, + 0x413aeea632f3367d, + 0x9915e36bbc67663b, + 0x40f03eea3a465f69, + 0x1c2d28c3e0b008ad, + 0x4e682a054a1e5bb1, + 0x05c5b761285bd044, + 0xe1bf8d1a5b5c2915, + 0xf2c0617ac3014c74, + 0xb7f5e8f1d11cc359, + 0x63cb4c4b3fa745ef, + 0x9d1a84469c89df6b, + 0xe33630824b2bfb3d, + 0xd5f474f6e60eefa2, + 0xf58c6b83fb2d4e18, + 0x4676e45f0adf3411, + 0x20781f751d23a1ba, + 0xbd629b3381aa7ed1, + 0xae1d775319f71bb0, + 0xfed1c80da32e9a84, + 0x5509083f92825170, + 0x29ac01635557a70e, + 0xa7c9694551831d04, + 0x8e65682604d4ba0a, + 0x11f651f8882ab749, + 0xd77dc96ef6793d8a, + 0xef2799f52b042dcd, + 0x48eef0b07a8730c9, + 0x22f1a2ed0d547392, + 0x6142f1d32fd097c7, + 0x4a674d286af0e2e1, + 0x80fd7cc9748cbed2, + 0x717e7067af4f499a, + 0x938290a9ecd1dbb3, + 0x88e3b293344dd172, + 0x2734158c250fa3d6, + }, + { + 0x7e37e62dfc7d40c3, + 0x776f25a4ee939e5b, + 0xe045c850dd8fb5ad, + 0x86ed5ba711ff1952, + 0xe91d0bd9cf616b35, + 0x37e0ab256e408ffb, + 0x9607f6c031025a7a, + 0x0b02f5e116d23c9d, + 0xf3d8486bfb50650c, + 0x621cff27c40875f5, + 0x7d40cb71fa5fd34a, + 0x6daa6616daa29062, + 0x9f5f354923ec84e2, + 0xec847c3dc507c3b3, + 0x025a3668043ce205, + 0xa8bf9e6c4dac0b19, + 0xfa808be2e9bebb94, + 0xb5b99c5277c74fa3, + 0x78d9bc95f0397bcc, + 0xe332e50cdbad2624, + 0xc74fce129332797e, + 0x1729eceb2ea709ab, + 0xc2d6b9f69954d1f8, + 0x5d898cbfbab8551a, + 0x859a76fb17dd8adb, + 0x1be85886362f7fb5, + 0xf6413f8ff136cd8a, + 0xd3110fa5bbb7e35c, + 0x0a2feed514cc4d11, + 0xe83010edcd7f1ab9, + 0xa1e75de55f42d581, + 0xeede4a55c13b21b6, + 0xf2f5535ff94e1480, + 0x0cc1b46d1888761e, + 0xbce15fdb6529913b, + 0x2d25e8975a7181c2, + 0x71817f1ce2d7a554, + 0x2e52c5cb5c53124b, + 0xf9f7a6beef9c281d, + 0x9e722e7d21f2f56e, + 0xce170d9b81dca7e6, + 0x0e9b82051cb4941b, + 0x1e712f623c49d733, + 0x21e45cfa42f9f7dc, + 0xcb8e7a7f8bba0f60, + 0x8e98831a010fb646, + 0x474ccf0d8e895b23, + 0xa99285584fb27a95, + 0x8cc2b57205335443, + 0x42d5b8e984eff3a5, + 0x012d1b34021e718c, + 0x57a6626aae74180b, + 0xff19fc06e3d81312, + 0x35ba9d4d6a7c6dfe, + 0xc9d44c178f86ed65, + 0x506523e6a02e5288, + 0x03772d5c06229389, + 0x8b01f4fe0b691ec0, + 0xf8dabd8aed825991, + 0x4c4e3aec985b67be, + 0xb10df0827fbf96a9, + 0x6a69279ad4f8dae1, + 0xe78689dcd3d5ff2e, + 0x812e1a2b1fa553d1, + 0xfbad90d6eba0ca18, + 0x1ac543b234310e39, + 0x1604f7df2cb97827, + 0xa6241c6951189f02, + 0x753513cceaaf7c5e, + 0x64f2a59fc84c4efa, + 0x247d2b1e489f5f5a, + 0xdb64d718ab474c48, + 0x79f4a7a1f2270a40, + 0x1573da832a9bebae, + 0x3497867968621c72, + 0x514838d2a2302304, + 0xf0af6537fd72f685, + 0x1d06023e3a6b44ba, + 0x678588c3ce6edd73, + 0x66a893f7cc70acff, + 0xd4d24e29b5eda9df, + 0x3856321470ea6a6c, + 0x07c3418c0e5a4a83, + 0x2bcbb22f5635bacd, + 0x04b46cd00878d90a, + 0x06ee5ab80c443b0f, + 0x3b211f4876c8f9e5, + 0x0958c38912eede98, + 0xd14b39cdbf8b0159, + 0x397b292072f41be0, + 0x87c0409313e168de, + 0xad26e98847caa39f, + 0x4e140c849c6785bb, + 0xd5ff551db7f3d853, + 0xa0ca46d15d5ca40d, + 0xcd6020c787fe346f, + 0x84b76dcf15c3fb57, + 0xdefda0fca121e4ce, + 0x4b8d7b6096012d3d, + 0x9ac642ad298a2c64, + 0x0875d8bd10f0af14, + 0xb357c6ea7b8374ac, + 0x4d6321d89a451632, + 0xeda96709c719b23f, + 0xf76c24bbf328bc06, + 0xc662d526912c08f2, + 0x3ce25ec47892b366, + 0xb978283f6f4f39bd, + 0xc08c8f9e9d6833fd, + 0x4f3917b09e79f437, + 0x593de06fb2c08c10, + 0xd6887841b1d14bda, + 0x19b26eee32139db0, + 0xb494876675d93e2f, + 0x825937771987c058, + 0x90e9ac783d466175, + 0xf1827e03ff6c8709, + 0x945dc0a8353eb87f, + 0x4516f9658ab5b926, + 0x3f9573987eb020ef, + 0xb855330b6d514831, + 0x2ae6a91b542bcb41, + 0x6331e413c6160479, + 0x408f8e8180d311a0, + 0xeff35161c325503a, + 0xd06622f9bd9570d5, + 0x8876d9a20d4b8d49, + 0xa5533135573a0c8b, + 0xe168d364df91c421, + 0xf41b09e7f50a2f8f, + 0x12b09b0f24c1a12d, + 0xda49cc2ca9593dc4, + 0x1f5c34563e57a6bf, + 0x54d14f36a8568b82, + 0xaf7cdfe043f6419a, + 0xea6a2685c943f8bc, + 0xe5dcbfb4d7e91d2b, + 0xb27addde799d0520, + 0x6b443caed6e6ab6d, + 0x7bae91c9f61be845, + 0x3eb868ac7cae5163, + 0x11c7b65322e332a4, + 0xd23c1491b9a992d0, + 0x8fb5982e0311c7ca, + 0x70ac6428e0c9d4d8, + 0x895bc2960f55fcc5, + 0x76423e90ec8defd7, + 0x6ff0507ede9e7267, + 0x3dcf45f07a8cc2ea, + 0x4aa06054941f5cb1, + 0x5810fb5bb0defd9c, + 0x5efea1e3bc9ac693, + 0x6edd4b4adc8003eb, + 0x741808f8e8b10dd2, + 0x145ec1b728859a22, + 0x28bc9f7350172944, + 0x270a06424ebdccd3, + 0x972aedf4331c2bf6, + 0x059977e40a66a886, + 0x2550302a4a812ed6, + 0xdd8a8da0a7037747, + 0xc515f87a970e9b7b, + 0x3023eaa9601ac578, + 0xb7e3aa3a73fbada6, + 0x0fb699311eaae597, + 0x0000000000000000, + 0x310ef19d6204b4f4, + 0x229371a644db6455, + 0x0decaf591a960792, + 0x5ca4978bb8a62496, + 0x1c2b190a38753536, + 0x41a295b582cd602c, + 0x3279dcc16426277d, + 0xc1a194aa9f764271, + 0x139d803b26dfd0a1, + 0xae51c4d441e83016, + 0xd813fa44ad65dfc1, + 0xac0bf2bc45d4d213, + 0x23be6a9246c515d9, + 0x49d74d08923dcf38, + 0x9d05032127d066e7, + 0x2f7fdeff5e4d63c7, + 0xa47e2a0155247d07, + 0x99b16ff12fa8bfed, + 0x4661d4398c972aaf, + 0xdfd0bbc8a33f9542, + 0xdca79694a51d06cb, + 0xb020ebb67da1e725, + 0xba0f0563696daa34, + 0xe4f1a480d5f76ca7, + 0xc438e34e9510eaf7, + 0x939e81243b64f2fc, + 0x8defae46072d25cf, + 0x2c08f3a3586ff04e, + 0xd7a56375b3cf3a56, + 0x20c947ce40e78650, + 0x43f8a3dd86f18229, + 0x568b795eac6a6987, + 0x8003011f1dbb225d, + 0xf53612d3f7145e03, + 0x189f75da300dec3c, + 0x9570db9c3720c9f3, + 0xbb221e576b73dbb8, + 0x72f65240e4f536dd, + 0x443be25188abc8aa, + 0xe21ffe38d9b357a8, + 0xfd43ca6ee7e4f117, + 0xcaa3614b89a47eec, + 0xfe34e732e1c6629e, + 0x83742c431b99b1d4, + 0xcf3a16af83c2d66a, + 0xaae5a8044990e91c, + 0x26271d764ca3bd5f, + 0x91c4b74c3f5810f9, + 0x7c6dd045f841a2c6, + 0x7f1afd19fe63314f, + 0xc8f957238d989ce9, + 0xa709075d5306ee8e, + 0x55fc5402aa48fa0e, + 0x48fa563c9023beb4, + 0x65dfbeabca523f76, + 0x6c877d22d8bce1ee, + 0xcc4d3bf385e045e3, + 0xbebb69b36115733e, + 0x10eaad6720fd4328, + 0xb6ceb10e71e5dc2a, + 0xbdcc44ef6737e0b7, + 0x523f158ea412b08d, + 0x989c74c52db6ce61, + 0x9beb59992b945de8, + 0x8a2cefca09776f4c, + 0xa3bd6b8d5b7e3784, + 0xeb473db1cb5d8930, + 0xc3fba2c29b4aa074, + 0x9c28181525ce176b, + 0x683311f2d0c438e4, + 0x5fd3bad7be84b71f, + 0xfc6ed15ae5fa809b, + 0x36cdb0116c5efe77, + 0x29918447520958c8, + 0xa29070b959604608, + 0x53120ebaa60cc101, + 0x3a0c047c74d68869, + 0x691e0ac6d2da4968, + 0x73db4974e6eb4751, + 0x7a838afdf40599c9, + 0x5a4acd33b4e21f99, + 0x6046c94fc03497f0, + 0xe6ab92e8d1cb8ea2, + 0x3354c7f5663856f1, + 0xd93ee170af7bae4d, + 0x616bd27bc22ae67c, + 0x92b39a10397a8370, + 0xabc8b3304b8e9890, + 0xbf967287630b02b2, + 0x5b67d607b6fc6e15, + }, + { + 0x8ab0a96846e06a6d, + 0x43c7e80b4bf0b33a, + 0x08c9b3546b161ee5, + 0x39f1c235eba990be, + 0xc1bef2376606c7b2, + 0x2c209233614569aa, + 0xeb01523b6fc3289a, + 0x946953ab935acedd, + 0x272838f63e13340e, + 0x8b0455eca12ba052, + 0x77a1b2c4978ff8a2, + 0xa55122ca13e54086, + 0x2276135862d3f1cd, + 0xdb8ddfde08b76cfe, + 0x5d1e12c89e4a178a, + 0x0e56816b03969867, + 0xee5f79953303ed59, + 0xafed748bab78d71d, + 0x6d929f2df93e53ee, + 0xf5d8a8f8ba798c2a, + 0xf619b1698e39cf6b, + 0x95ddaf2f749104e2, + 0xec2a9c80e0886427, + 0xce5c8fd8825b95ea, + 0xc4e0d9993ac60271, + 0x4699c3a5173076f9, + 0x3d1b151f50a29f42, + 0x9ed505ea2bc75946, + 0x34665acfdc7f4b98, + 0x61b1fb53292342f7, + 0xc721c0080e864130, + 0x8693cd1696fd7b74, + 0x872731927136b14b, + 0xd3446c8a63a1721b, + 0x669a35e8a6680e4a, + 0xcab658f239509a16, + 0xa4e5de4ef42e8ab9, + 0x37a7435ee83f08d9, + 0x134e6239e26c7f96, + 0x82791a3c2df67488, + 0x3f6ef00a8329163c, + 0x8e5a7e42fdeb6591, + 0x5caaee4c7981ddb5, + 0x19f234785af1e80d, + 0x255ddde3ed98bd70, + 0x50898a32a99cccac, + 0x28ca4519da4e6656, + 0xae59880f4cb31d22, + 0x0d9798fa37d6db26, + 0x32f968f0b4ffcd1a, + 0xa00f09644f258545, + 0xfa3ad5175e24de72, + 0xf46c547c5db24615, + 0x713e80fbff0f7e20, + 0x7843cf2b73d2aafa, + 0xbd17ea36aedf62b4, + 0xfd111bacd16f92cf, + 0x4abaa7dbc72d67e0, + 0xb3416b5dad49fad3, + 0xbca316b24914a88b, + 0x15d150068aecf914, + 0xe27c1debe31efc40, + 0x4fe48c759beda223, + 0x7edcfd141b522c78, + 0x4e5070f17c26681c, + 0xe696cac15815f3bc, + 0x35d2a64b3bb481a7, + 0x800cff29fe7dfdf6, + 0x1ed9fac3d5baa4b0, + 0x6c2663a91ef599d1, + 0x03c1199134404341, + 0xf7ad4ded69f20554, + 0xcd9d9649b61bd6ab, + 0xc8c3bde7eadb1368, + 0xd131899fb02afb65, + 0x1d18e352e1fae7f1, + 0xda39235aef7ca6c1, + 0xa1bbf5e0a8ee4f7a, + 0x91377805cf9a0b1e, + 0x3138716180bf8e5b, + 0xd9f83acbdb3ce580, + 0x0275e515d38b897e, + 0x472d3f21f0fbbcc6, + 0x2d946eb7868ea395, + 0xba3c248d21942e09, + 0xe7223645bfde3983, + 0xff64feb902e41bb1, + 0xc97741630d10d957, + 0xc3cb1722b58d4ecc, + 0xa27aec719cae0c3b, + 0x99fecb51a48c15fb, + 0x1465ac826d27332b, + 0xe1bd047ad75ebf01, + 0x79f733af941960c5, + 0x672ec96c41a3c475, + 0xc27feba6524684f3, + 0x64efd0fd75e38734, + 0xed9e60040743ae18, + 0xfb8e2993b9ef144d, + 0x38453eb10c625a81, + 0x6978480742355c12, + 0x48cf42ce14a6ee9e, + 0x1cac1fd606312dce, + 0x7b82d6ba4792e9bb, + 0x9d141c7b1f871a07, + 0x5616b80dc11c4a2e, + 0xb849c198f21fa777, + 0x7ca91801c8d9a506, + 0xb1348e487ec273ad, + 0x41b20d1e987b3a44, + 0x7460ab55a3cfbbe3, + 0x84e628034576f20a, + 0x1b87d16d897a6173, + 0x0fe27defe45d5258, + 0x83cde6b8ca3dbeb7, + 0x0c23647ed01d1119, + 0x7a362a3ea0592384, + 0xb61f40f3f1893f10, + 0x75d457d1440471dc, + 0x4558da34237035b8, + 0xdca6116587fc2043, + 0x8d9b67d3c9ab26d0, + 0x2b0b5c88ee0e2517, + 0x6fe77a382ab5da90, + 0x269cc472d9d8fe31, + 0x63c41e46faa8cb89, + 0xb7abbc771642f52f, + 0x7d1de4852f126f39, + 0xa8c6ba3024339ba0, + 0x600507d7cee888c8, + 0x8fee82c61a20afae, + 0x57a2448926d78011, + 0xfca5e72836a458f0, + 0x072bcebb8f4b4cbd, + 0x497bbe4af36d24a1, + 0x3cafe99bb769557d, + 0x12fa9ebd05a7b5a9, + 0xe8c04baa5b836bdb, + 0x4273148fac3b7905, + 0x908384812851c121, + 0xe557d3506c55b0fd, + 0x72ff996acb4f3d61, + 0x3eda0c8e64e2dc03, + 0xf0868356e6b949e9, + 0x04ead72abb0b0ffc, + 0x17a4b5135967706a, + 0xe3c8e16f04d5367f, + 0xf84f30028daf570c, + 0x1846c8fcbd3a2232, + 0x5b8120f7f6ca9108, + 0xd46fa231ecea3ea6, + 0x334d947453340725, + 0x58403966c28ad249, + 0xbed6f3a79a9f21f5, + 0x68ccb483a5fe962d, + 0xd085751b57e1315a, + 0xfed0023de52fd18e, + 0x4b0e5b5f20e6addf, + 0x1a332de96eb1ab4c, + 0xa3ce10f57b65c604, + 0x108f7ba8d62c3cd7, + 0xab07a3a11073d8e1, + 0x6b0dad1291bed56c, + 0xf2f366433532c097, + 0x2e557726b2cee0d4, + 0x0000000000000000, + 0xcb02a476de9b5029, + 0xe4e32fd48b9e7ac2, + 0x734b65ee2c84f75e, + 0x6e5386bccd7e10af, + 0x01b4fc84e7cbca3f, + 0xcfe8735c65905fd5, + 0x3613bfda0ff4c2e6, + 0x113b872c31e7f6e8, + 0x2fe18ba255052aeb, + 0xe974b72ebc48a1e4, + 0x0abc5641b89d979b, + 0xb46aa5e62202b66e, + 0x44ec26b0c4bbff87, + 0xa6903b5b27a503c7, + 0x7f680190fc99e647, + 0x97a84a3aa71a8d9c, + 0xdd12ede16037ea7c, + 0xc554251ddd0dc84e, + 0x88c54c7d956be313, + 0x4d91696048662b5d, + 0xb08072cc9909b992, + 0xb5de5962c5c97c51, + 0x81b803ad19b637c9, + 0xb2f597d94a8230ec, + 0x0b08aac55f565da4, + 0xf1327fd2017283d6, + 0xad98919e78f35e63, + 0x6ab9519676751f53, + 0x24e921670a53774f, + 0xb9fd3d1c15d46d48, + 0x92f66194fbda485f, + 0x5a35dc7311015b37, + 0xded3f4705477a93d, + 0xc00a0eb381cd0d8d, + 0xbb88d809c65fe436, + 0x16104997beacba55, + 0x21b70ac95693b28c, + 0x59f4c5e225411876, + 0xd5db5eb50b21f499, + 0x55d7a19cf55c096f, + 0xa97246b4c3f8519f, + 0x8552d487a2bd3835, + 0x54635d181297c350, + 0x23c2efdc85183bf2, + 0x9f61f96ecc0c9379, + 0x534893a39ddc8fed, + 0x5edf0b59aa0a54cb, + 0xac2c6d1a9f38945c, + 0xd7aebba0d8aa7de7, + 0x2abfa00c09c5ef28, + 0xd84cc64f3cf72fbf, + 0x2003f64db15878b3, + 0xa724c7dfc06ec9f8, + 0x069f323f68808682, + 0xcc296acd51d01c94, + 0x055e2bae5cc0c5c3, + 0x6270e2c21d6301b6, + 0x3b842720382219c0, + 0xd2f0900e846ab824, + 0x52fc6f277a1745d2, + 0xc6953c8ce94d8b0f, + 0xe009f8fe3095753e, + 0x655b2c7992284d0b, + 0x984a37d54347dfc4, + 0xeab5aebf8808e2a5, + 0x9a3fd2c090cc56ba, + 0x9ca0e0fff84cd038, + 0x4c2595e4afade162, + 0xdf6708f4b3bc6302, + 0xbf620f237d54ebca, + 0x93429d101c118260, + 0x097d4fd08cddd4da, + 0x8c2f9b572e60ecef, + 0x708a7c7f18c4b41f, + 0x3a30dba4dfe9d3ff, + 0x4006f19a7fb0f07b, + 0x5f6bf7dd4dc19ef4, + 0x1f6d064732716e8f, + 0xf9fbcc866a649d33, + 0x308c8de567744464, + 0x8971b0f972a0292c, + 0xd61a47243f61b7d8, + 0xefeb8511d4c82766, + 0x961cb6be40d147a3, + 0xaab35f25f7b812de, + 0x76154e407044329d, + 0x513d76b64e570693, + 0xf3479ac7d2f90aa8, + 0x9b8b2e4477079c85, + 0x297eb99d3d85ac69, + }, + { + 0x3ef29d249b2c0a19, + 0xe9e16322b6f8622f, + 0x5536994047757f7a, + 0x9f4d56d5a47b0b33, + 0x822567466aa1174c, + 0xb8f5057deb082fb2, + 0xcc48c10bf4475f53, + 0x373088d4275dec3a, + 0x968f4325180aed10, + 0x173d232cf7016151, + 0xae4ed09f946fcc13, + 0xfd4b4741c4539873, + 0x1b5b3f0dd9933765, + 0x2ffcb0967b644052, + 0xe02376d20a89840c, + 0xa3ae3a70329b18d7, + 0x419cbd2335de8526, + 0xfafebf115b7c3199, + 0x0397074f85aa9b0d, + 0xc58ad4fb4836b970, + 0xbec60be3fc4104a8, + 0x1eff36dc4b708772, + 0x131fdc33ed8453b6, + 0x0844e33e341764d3, + 0x0ff11b6eab38cd39, + 0x64351f0a7761b85a, + 0x3b5694f509cfba0e, + 0x30857084b87245d0, + 0x47afb3bd2297ae3c, + 0xf2ba5c2f6f6b554a, + 0x74bdc4761f4f70e1, + 0xcfdfc64471edc45e, + 0xe610784c1dc0af16, + 0x7aca29d63c113f28, + 0x2ded411776a859af, + 0xac5f211e99a3d5ee, + 0xd484f949a87ef33b, + 0x3ce36ca596e013e4, + 0xd120f0983a9d432c, + 0x6bc40464dc597563, + 0x69d5f5e5d1956c9e, + 0x9ae95f043698bb24, + 0xc9ecc8da66a4ef44, + 0xd69508c8a5b2eac6, + 0xc40c2235c0503b80, + 0x38c193ba8c652103, + 0x1ceec75d46bc9e8f, + 0xd331011937515ad1, + 0xd8e2e56886eca50f, + 0xb137108d5779c991, + 0x709f3b6905ca4206, + 0x4feb50831680caef, + 0xec456af3241bd238, + 0x58d673afe181abbe, + 0x242f54e7cad9bf8c, + 0x0211f1810dcc19fd, + 0x90bc4dbb0f43c60a, + 0x9518446a9da0761d, + 0xa1bfcbf13f57012a, + 0x2bde4f8961e172b5, + 0x27b853a84f732481, + 0xb0b1e643df1f4b61, + 0x18cc38425c39ac68, + 0xd2b7f7d7bf37d821, + 0x3103864a3014c720, + 0x14aa246372abfa5c, + 0x6e600db54ebac574, + 0x394765740403a3f3, + 0x09c215f0bc71e623, + 0x2a58b947e987f045, + 0x7b4cdf18b477bdd8, + 0x9709b5eb906c6fe0, + 0x73083c268060d90b, + 0xfedc400e41f9037e, + 0x284948c6e44be9b8, + 0x728ecae808065bfb, + 0x06330e9e17492b1a, + 0x5950856169e7294e, + 0xbae4f4fce6c4364f, + 0xca7bcf95e30e7449, + 0x7d7fd186a33e96c2, + 0x52836110d85ad690, + 0x4dfaa1021b4cd312, + 0x913abb75872544fa, + 0xdd46ecb9140f1518, + 0x3d659a6b1e869114, + 0xc23f2cabd719109a, + 0xd713fe062dd46836, + 0xd0a60656b2fbc1dc, + 0x221c5a79dd909496, + 0xefd26dbca1b14935, + 0x0e77eda0235e4fc9, + 0xcbfd395b6b68f6b9, + 0x0de0eaefa6f4d4c4, + 0x0422ff1f1a8532e7, + 0xf969b85eded6aa94, + 0x7f6e2007aef28f3f, + 0x3ad0623b81a938fe, + 0x6624ee8b7aada1a7, + 0xb682e8ddc856607b, + 0xa78cc56f281e2a30, + 0xc79b257a45faa08d, + 0x5b4174e0642b30b3, + 0x5f638bff7eae0254, + 0x4bc9af9c0c05f808, + 0xce59308af98b46ae, + 0x8fc58da9cc55c388, + 0x803496c7676d0eb1, + 0xf33caae1e70dd7ba, + 0xbb6202326ea2b4bf, + 0xd5020f87201871cb, + 0x9d5ca754a9b712ce, + 0x841669d87de83c56, + 0x8a6184785eb6739f, + 0x420bba6cb0741e2b, + 0xf12d5b60eac1ce47, + 0x76ac35f71283691c, + 0x2c6bb7d9fecedb5f, + 0xfccdb18f4c351a83, + 0x1f79c012c3160582, + 0xf0abadae62a74cb7, + 0xe1a5801c82ef06fc, + 0x67a21845f2cb2357, + 0x5114665f5df04d9d, + 0xbf40fd2d74278658, + 0xa0393d3fb73183da, + 0x05a409d192e3b017, + 0xa9fb28cf0b4065f9, + 0x25a9a22942bf3d7c, + 0xdb75e22703463e02, + 0xb326e10c5ab5d06c, + 0xe7968e8295a62de6, + 0xb973f3b3636ead42, + 0xdf571d3819c30ce5, + 0xee549b7229d7cbc5, + 0x12992afd65e2d146, + 0xf8ef4e9056b02864, + 0xb7041e134030e28b, + 0xc02edd2adad50967, + 0x932b4af48ae95d07, + 0x6fe6fb7bc6dc4784, + 0x239aacb755f61666, + 0x401a4bedbdb807d6, + 0x485ea8d389af6305, + 0xa41bc220adb4b13d, + 0x753b32b89729f211, + 0x997e584bb3322029, + 0x1d683193ceda1c7f, + 0xff5ab6c0c99f818e, + 0x16bbd5e27f67e3a1, + 0xa59d34ee25d233cd, + 0x98f8ae853b54a2d9, + 0x6df70afacb105e79, + 0x795d2e99b9bba425, + 0x8e437b6744334178, + 0x0186f6ce886682f0, + 0xebf092a3bb347bd2, + 0xbcd7fa62f18d1d55, + 0xadd9d7d011c5571e, + 0x0bd3e471b1bdffde, + 0xaa6c2f808eeafef4, + 0x5ee57d31f6c880a4, + 0xf50fa47ff044fca0, + 0x1addc9c351f5b595, + 0xea76646d3352f922, + 0x0000000000000000, + 0x85909f16f58ebea6, + 0x46294573aaf12ccc, + 0x0a5512bf39db7d2e, + 0x78dbd85731dd26d5, + 0x29cfbe086c2d6b48, + 0x218b5d36583a0f9b, + 0x152cd2adfacd78ac, + 0x83a39188e2c795bc, + 0xc3b9da655f7f926a, + 0x9ecba01b2c1d89c3, + 0x07b5f8509f2fa9ea, + 0x7ee8d6c926940dcf, + 0x36b67e1aaf3b6eca, + 0x86079859702425ab, + 0xfb7849dfd31ab369, + 0x4c7c57cc932a51e2, + 0xd96413a60e8a27ff, + 0x263ea566c715a671, + 0x6c71fc344376dc89, + 0x4a4f595284637af8, + 0xdaf314e98b20bcf2, + 0x572768c14ab96687, + 0x1088db7c682ec8bb, + 0x887075f9537a6a62, + 0x2e7a4658f302c2a2, + 0x619116dbe582084d, + 0xa87dde018326e709, + 0xdcc01a779c6997e8, + 0xedc39c3dac7d50c8, + 0xa60a33a1a078a8c0, + 0xc1a82be452b38b97, + 0x3f746bea134a88e9, + 0xa228ccbebafd9a27, + 0xabead94e068c7c04, + 0xf48952b178227e50, + 0x5cf48cb0fb049959, + 0x6017e0156de48abd, + 0x4438b4f2a73d3531, + 0x8c528ae649ff5885, + 0xb515ef924dfcfb76, + 0x0c661c212e925634, + 0xb493195cc59a7986, + 0x9cda519a21d1903e, + 0x32948105b5be5c2d, + 0x194ace8cd45f2e98, + 0x438d4ca238129cdb, + 0x9b6fa9cabefe39d4, + 0x81b26009ef0b8c41, + 0xded1ebf691a58e15, + 0x4e6da64d9ee6481f, + 0x54b06f8ecf13fd8a, + 0x49d85e1d01c9e1f5, + 0xafc826511c094ee3, + 0xf698a33075ee67ad, + 0x5ac7822eec4db243, + 0x8dd47c28c199da75, + 0x89f68337db1ce892, + 0xcdce37c57c21dda3, + 0x530597de503c5460, + 0x6a42f2aa543ff793, + 0x5d727a7e73621ba9, + 0xe232875307459df1, + 0x56a19e0fc2dfe477, + 0xc61dd3b4cd9c227d, + 0xe5877f03986a341b, + 0x949eb2a415c6f4ed, + 0x6206119460289340, + 0x6380e75ae84e11b0, + 0x8be772b6d6d0f16f, + 0x50929091d596cf6d, + 0xe86795ec3e9ee0df, + 0x7cf927482b581432, + 0xc86a3e14eec26db4, + 0x7119cda78dacc0f6, + 0xe40189cd100cb6eb, + 0x92adbc3a028fdff7, + 0xb2a017c2d2d3529c, + 0x200dabf8d05c8d6b, + 0x34a78f9ba2f77737, + 0xe3b4719d8f231f01, + 0x45be423c2f5bb7c1, + 0xf71e55fefd88e55d, + 0x6853032b59f3ee6e, + 0x65b3e9c4ff073aaa, + 0x772ac3399ae5ebec, + 0x87816e97f842a75b, + 0x110e2db2e0484a4b, + 0x331277cb3dd8dedd, + 0xbd510cac79eb9fa5, + 0x352179552a91f5c7, + }, + { + 0x05ba7bc82c9b3220, + 0x31a54665f8b65e4f, + 0xb1b651f77547f4d4, + 0x8bfa0d857ba46682, + 0x85a96c5aa16a98bb, + 0x990faef908eb79c9, + 0xa15e37a247f4a62d, + 0x76857dcd5d27741e, + 0xf8c50b800a1820bc, + 0xbe65dcb201f7a2b4, + 0x666d1b986f9426e7, + 0x4cc921bf53c4e648, + 0x95410a0f93d9ca42, + 0x20cdccaa647ba4ef, + 0x429a4060890a1871, + 0x0c4ea4f69b32b38b, + 0xccda362dde354cd3, + 0x96dc23bc7c5b2fa9, + 0xc309bb68aa851ab3, + 0xd26131a73648e013, + 0x021dc52941fc4db2, + 0xcd5adab7704be48a, + 0xa77965d984ed71e6, + 0x32386fd61734bba4, + 0xe82d6dd538ab7245, + 0x5c2147ea6177b4b1, + 0x5da1ab70cf091ce8, + 0xac907fce72b8bdff, + 0x57c85dfd972278a8, + 0xa4e44c6a6b6f940d, + 0x3851995b4f1fdfe4, + 0x62578ccaed71bc9e, + 0xd9882bb0c01d2c0a, + 0x917b9d5d113c503b, + 0xa2c31e11a87643c6, + 0xe463c923a399c1ce, + 0xf71686c57ea876dc, + 0x87b4a973e096d509, + 0xaf0d567d9d3a5814, + 0xb40c2a3f59dcc6f4, + 0x3602f88495d121dd, + 0xd3e1dd3d9836484a, + 0xf945e71aa46688e5, + 0x7518547eb2a591f5, + 0x9366587450c01d89, + 0x9ea81018658c065b, + 0x4f54080cbc4603a3, + 0x2d0384c65137bf3d, + 0xdc325078ec861e2a, + 0xea30a8fc79573ff7, + 0x214d2030ca050cb6, + 0x65f0322b8016c30c, + 0x69be96dd1b247087, + 0xdb95ee9981e161b8, + 0xd1fc1814d9ca05f8, + 0x820ed2bbcc0de729, + 0x63d76050430f14c7, + 0x3bccb0e8a09d3a0f, + 0x8e40764d573f54a2, + 0x39d175c1e16177bd, + 0x12f5a37c734f1f4b, + 0xab37c12f1fdfc26d, + 0x5648b167395cd0f1, + 0x6c04ed1537bf42a7, + 0xed97161d14304065, + 0x7d6c67daab72b807, + 0xec17fa87ba4ee83c, + 0xdfaf79cb0304fbc1, + 0x733f060571bc463e, + 0x78d61c1287e98a27, + 0xd07cf48e77b4ada1, + 0xb9c262536c90dd26, + 0xe2449b5860801605, + 0x8fc09ad7f941fcfb, + 0xfad8cea94be46d0e, + 0xa343f28b0608eb9f, + 0x9b126bd04917347b, + 0x9a92874ae7699c22, + 0x1b017c42c4e69ee0, + 0x3a4c5c720ee39256, + 0x4b6e9f5e3ea399da, + 0x6ba353f45ad83d35, + 0xe7fee0904c1b2425, + 0x22d009832587e95d, + 0x842980c00f1430e2, + 0xc6b3c0a0861e2893, + 0x087433a419d729f2, + 0x341f3dadd42d6c6f, + 0xee0a3faefbb2a58e, + 0x4aee73c490dd3183, + 0xaab72db5b1a16a34, + 0xa92a04065e238fdf, + 0x7b4b35a1686b6fcc, + 0x6a23bf6ef4a6956c, + 0x191cb96b851ad352, + 0x55d598d4d6de351a, + 0xc9604de5f2ae7ef3, + 0x1ca6c2a3a981e172, + 0xde2f9551ad7a5398, + 0x3025aaff56c8f616, + 0x15521d9d1e2860d9, + 0x506fe31cfa45073a, + 0x189c55f12b647b0b, + 0x0180ec9aae7ea859, + 0x7cec8b40050c105e, + 0x2350e5198bf94104, + 0xef8ad33455cc0dd7, + 0x07a7bee16d677f92, + 0xe5e325b90de76997, + 0x5a061591a26e637a, + 0xb611ef1618208b46, + 0x09f4df3eb7a981ab, + 0x1ebb078ae87dacc0, + 0xb791038cb65e231f, + 0x0fd38d4574b05660, + 0x67edf702c1ea8ebe, + 0xba5f4be0831238cd, + 0xe3c477c2cefebe5c, + 0x0dce486c354c1bd2, + 0x8c5db36416c31910, + 0x26ea9ed1a7627324, + 0x039d29b3ef82e5eb, + 0x9f28fc82cbf2ae02, + 0xa8aae89cf05d2786, + 0x431aacfa2774b028, + 0xcf471f9e31b7a938, + 0x581bd0b8e3922ec8, + 0xbc78199b400bef06, + 0x90fb71c7bf42f862, + 0x1f3beb1046030499, + 0x683e7a47b55ad8de, + 0x988f4263a695d190, + 0xd808c72a6e638453, + 0x0627527bc319d7cb, + 0xebb04466d72997ae, + 0xe67e0c0ae2658c7c, + 0x14d2f107b056c880, + 0x7122c32c30400b8c, + 0x8a7ae11fd5dacedb, + 0xa0dedb38e98a0e74, + 0xad109354dcc615a6, + 0x0be91a17f655cc19, + 0x8ddd5ffeb8bdb149, + 0xbfe53028af890aed, + 0xd65ba6f5b4ad7a6a, + 0x7956f0882997227e, + 0x10e8665532b352f9, + 0x0e5361dfdacefe39, + 0xcec7f3049fc90161, + 0xff62b561677f5f2e, + 0x975ccf26d22587f0, + 0x51ef0f86543baf63, + 0x2f1e41ef10cbf28f, + 0x52722635bbb94a88, + 0xae8dbae73344f04d, + 0x410769d36688fd9a, + 0xb3ab94de34bbb966, + 0x801317928df1aa9b, + 0xa564a0f0c5113c54, + 0xf131d4bebdb1a117, + 0x7f71a2f3ea8ef5b5, + 0x40878549c8f655c3, + 0x7ef14e6944f05dec, + 0xd44663dcf55137d8, + 0xf2acfd0d523344fc, + 0x0000000000000000, + 0x5fbc6e598ef5515a, + 0x16cf342ef1aa8532, + 0xb036bd6ddb395c8d, + 0x13754fe6dd31b712, + 0xbbdfa77a2d6c9094, + 0x89e7c8ac3a582b30, + 0x3c6b0e09cdfa459d, + 0xc4ae0589c7e26521, + 0x49735a777f5fd468, + 0xcafd64561d2c9b18, + 0xda1502032f9fc9e1, + 0x8867243694268369, + 0x3782141e3baf8984, + 0x9cb5d53124704be9, + 0xd7db4a6f1ad3d233, + 0xa6f989432a93d9bf, + 0x9d3539ab8a0ee3b0, + 0x53f2caaf15c7e2d1, + 0x6e19283c76430f15, + 0x3debe2936384edc4, + 0x5e3c82c3208bf903, + 0x33b8834cb94a13fd, + 0x6470deb12e686b55, + 0x359fd1377a53c436, + 0x61caa57902f35975, + 0x043a975282e59a79, + 0xfd7f70482683129c, + 0xc52ee913699ccd78, + 0x28b9ff0e7dac8d1d, + 0x5455744e78a09d43, + 0xcb7d88ccb3523341, + 0x44bd121b4a13cfba, + 0x4d49cd25fdba4e11, + 0x3e76cb208c06082f, + 0x3ff627ba2278a076, + 0xc28957f204fbb2ea, + 0x453dfe81e46d67e3, + 0x94c1e6953da7621b, + 0x2c83685cff491764, + 0xf32c1197fc4deca5, + 0x2b24d6bd922e68f6, + 0xb22b78449ac5113f, + 0x48f3b6edd1217c31, + 0x2e9ead75beb55ad6, + 0x174fd8b45fd42d6b, + 0x4ed4e4961238abfa, + 0x92e6b4eefebeb5d0, + 0x46a0d7320bef8208, + 0x47203ba8a5912a51, + 0x24f75bf8e69e3e96, + 0xf0b1382413cf094e, + 0xfee259fbc901f777, + 0x276a724b091cdb7d, + 0xbdf8f501ee75475f, + 0x599b3c224dec8691, + 0x6d84018f99c1eafe, + 0x7498b8e41cdb39ac, + 0xe0595e71217c5bb7, + 0x2aa43a273c50c0af, + 0xf50b43ec3f543b6e, + 0x838e3e2162734f70, + 0xc09492db4507ff58, + 0x72bfea9fdfc2ee67, + 0x11688acf9ccdfaa0, + 0x1a8190d86a9836b9, + 0x7acbd93bc615c795, + 0xc7332c3a286080ca, + 0x863445e94ee87d50, + 0xf6966a5fd0d6de85, + 0xe9ad814f96d5da1c, + 0x70a22fb69e3ea3d5, + 0x0a69f68d582b6440, + 0xb8428ec9c2ee757f, + 0x604a49e3ac8df12c, + 0x5b86f90b0c10cb23, + 0xe1d9b2eb8f02f3ee, + 0x29391394d3d22544, + 0xc8e0a17f5cd0d6aa, + 0xb58cc6a5f7a26ead, + 0x8193fb08238f02c2, + 0xd5c68f465b2f9f81, + 0xfcff9cd288fdbac5, + 0x77059157f359dc47, + 0x1d262e3907ff492b, + 0xfb582233e59ac557, + 0xddb2bce242f8b673, + 0x2577b76248e096cf, + 0x6f99c4a6d83da74c, + 0xc1147e41eb795701, + 0xf48baf76912a9337, + }, + { + 0x45b268a93acde4cc, + 0xaf7f0be884549d08, + 0x048354b3c1468263, + 0x925435c2c80efed2, + 0xee4e37f27fdffba7, + 0x167a33920c60f14d, + 0xfb123b52ea03e584, + 0x4a0cab53fdbb9007, + 0x9deaf6380f788a19, + 0xcb48ec558f0cb32a, + 0xb59dc4b2d6fef7e0, + 0xdcdbca22f4f3ecb6, + 0x11df5813549a9c40, + 0xe33fdedf568aced3, + 0xa0c1c8124322e9c3, + 0x07a56b8158fa6d0d, + 0x77279579b1e1f3dd, + 0xd9b18b74422ac004, + 0xb8ec2d9fffabc294, + 0xf4acf8a82d75914f, + 0x7bbf69b1ef2b6878, + 0xc4f62faf487ac7e1, + 0x76ce809cc67e5d0c, + 0x6711d88f92e4c14c, + 0x627b99d9243dedfe, + 0x234aa5c3dfb68b51, + 0x909b1f15262dbf6d, + 0x4f66ea054b62bcb5, + 0x1ae2cf5a52aa6ae8, + 0xbea053fbd0ce0148, + 0xed6808c0e66314c9, + 0x43fe16cd15a82710, + 0xcd049231a06970f6, + 0xe7bc8a6c97cc4cb0, + 0x337ce835fcb3b9c0, + 0x65def2587cc780f3, + 0x52214ede4132bb50, + 0x95f15e4390f493df, + 0x870839625dd2e0f1, + 0x41313c1afb8b66af, + 0x91720af051b211bc, + 0x477d427ed4eea573, + 0x2e3b4ceef6e3be25, + 0x82627834eb0bcc43, + 0x9c03e3dd78e724c8, + 0x2877328ad9867df9, + 0x14b51945e243b0f2, + 0x574b0f88f7eb97e2, + 0x88b6fa989aa4943a, + 0x19c4f068cb168586, + 0x50ee6409af11faef, + 0x7df317d5c04eaba4, + 0x7a567c5498b4c6a9, + 0xb6bbfb804f42188e, + 0x3cc22bcf3bc5cd0b, + 0xd04336eaaa397713, + 0xf02fac1bec33132c, + 0x2506dba7f0d3488d, + 0xd7e65d6bf2c31a1e, + 0x5eb9b2161ff820f5, + 0x842e0650c46e0f9f, + 0x716beb1d9e843001, + 0xa933758cab315ed4, + 0x3fe414fda2792265, + 0x27c9f1701ef00932, + 0x73a4c1ca70a771be, + 0x94184ba6e76b3d0e, + 0x40d829ff8c14c87e, + 0x0fbec3fac77674cb, + 0x3616a9634a6a9572, + 0x8f139119c25ef937, + 0xf545ed4d5aea3f9e, + 0xe802499650ba387b, + 0x6437e7bd0b582e22, + 0xe6559f89e053e261, + 0x80ad52e305288dfc, + 0x6dc55a23e34b9935, + 0xde14e0f51ad0ad09, + 0xc6390578a659865e, + 0x96d7617109487cb1, + 0xe2d6cb3a21156002, + 0x01e915e5779faed1, + 0xadb0213f6a77dcb7, + 0x9880b76eb9a1a6ab, + 0x5d9f8d248644cf9b, + 0xfd5e4536c5662658, + 0xf1c6b9fe9bacbdfd, + 0xeacd6341be9979c4, + 0xefa7221708405576, + 0x510771ecd88e543e, + 0xc2ba51cb671f043d, + 0x0ad482ac71af5879, + 0xfe787a045cdac936, + 0xb238af338e049aed, + 0xbd866cc94972ee26, + 0x615da6ebbd810290, + 0x3295fdd08b2c1711, + 0xf834046073bf0aea, + 0xf3099329758ffc42, + 0x1caeb13e7dcfa934, + 0xba2307481188832b, + 0x24efce42874ce65c, + 0x0e57d61fb0e9da1a, + 0xb3d1bad6f99b343c, + 0xc0757b1c893c4582, + 0x2b510db8403a9297, + 0x5c7698c1f1db614a, + 0x3e0d0118d5e68cb4, + 0xd60f488e855cb4cf, + 0xae961e0df3cb33d9, + 0x3a8e55ab14a00ed7, + 0x42170328623789c1, + 0x838b6dd19c946292, + 0x895fef7ded3b3aeb, + 0xcfcbb8e64e4a3149, + 0x064c7e642f65c3dc, + 0x3d2b3e2a4c5a63da, + 0x5bd3f340a9210c47, + 0xb474d157a1615931, + 0xac5934da1de87266, + 0x6ee365117af7765b, + 0xc86ed36716b05c44, + 0x9ba6885c201d49c5, + 0xb905387a88346c45, + 0x131072c4bab9ddff, + 0xbf49461ea751af99, + 0xd52977bc1ce05ba1, + 0xb0f785e46027db52, + 0x546d30ba6e57788c, + 0x305ad707650f56ae, + 0xc987c682612ff295, + 0xa5ab8944f5fbc571, + 0x7ed528e759f244ca, + 0x8ddcbbce2c7db888, + 0xaa154abe328db1ba, + 0x1e619be993ece88b, + 0x09f2bd9ee813b717, + 0x7401aa4b285d1cb3, + 0x21858f143195caee, + 0x48c381841398d1b8, + 0xfcb750d3b2f98889, + 0x39a86a998d1ce1b9, + 0x1f888e0ce473465a, + 0x7899568376978716, + 0x02cf2ad7ee2341bf, + 0x85c713b5b3f1a14e, + 0xff916fe12b4567e7, + 0x7c1a0230b7d10575, + 0x0c98fcc85eca9ba5, + 0xa3e7f720da9e06ad, + 0x6a6031a2bbb1f438, + 0x973e74947ed7d260, + 0x2cf4663918c0ff9a, + 0x5f50a7f368678e24, + 0x34d983b4a449d4cd, + 0x68af1b755592b587, + 0x7f3c3d022e6dea1b, + 0xabfc5f5b45121f6b, + 0x0d71e92d29553574, + 0xdffdf5106d4f03d8, + 0x081ba87b9f8c19c6, + 0xdb7ea1a3ac0981bb, + 0xbbca12ad66172dfa, + 0x79704366010829c7, + 0x179326777bff5f9c, + 0x0000000000000000, + 0xeb2476a4c906d715, + 0x724dd42f0738df6f, + 0xb752ee6538ddb65f, + 0x37ffbc863df53ba3, + 0x8efa84fcb5c157e6, + 0xe9eb5c73272596aa, + 0x1b0bdabf2535c439, + 0x86e12c872a4d4e20, + 0x9969a28bce3e087a, + 0xfafb2eb79d9c4b55, + 0x056a4156b6d92cb2, + 0x5a3ae6a5debea296, + 0x22a3b026a8292580, + 0x53c85b3b36ad1581, + 0xb11e900117b87583, + 0xc51f3a4a3fe56930, + 0xe019e1edcf3621bd, + 0xec811d2591fcba18, + 0x445b7d4c4d524a1d, + 0xa8da6069dcaef005, + 0x58f5cc72309de329, + 0xd4c062596b7ff570, + 0xce22ad0339d59f98, + 0x591cd99747024df8, + 0x8b90c5aa03187b54, + 0xf663d27fc356d0f0, + 0xd8589e9135b56ed5, + 0x35309651d3d67a1c, + 0x12f96721cd26732e, + 0xd28c1c3d441a36ac, + 0x492a946164077f69, + 0x2d1d73dc6f5f514b, + 0x6f0a70f40d68d88a, + 0x60b4b30eca1eac41, + 0xd36509d83385987d, + 0x0b3d97490630f6a8, + 0x9eccc90a96c46577, + 0xa20ee2c5ad01a87c, + 0xe49ab55e0e70a3de, + 0xa4429ca182646ba0, + 0xda97b446db962f6a, + 0xcced87d4d7f6de27, + 0x2ab8185d37a53c46, + 0x9f25dcefe15bcba6, + 0xc19c6ef9fea3eb53, + 0xa764a3931bd884ce, + 0x2fd2590b817c10f4, + 0x56a21a6d80743933, + 0xe573a0bb79ef0d0f, + 0x155c0ca095dc1e23, + 0x6c2c4fc694d437e4, + 0x10364df623053291, + 0xdd32dfc7836c4267, + 0x03263f3299bcef6e, + 0x66f8cd6ae57b6f9d, + 0x8c35ae2b5be21659, + 0x31b3c2e21290f87f, + 0x93bd2027bf915003, + 0x69460e90220d1b56, + 0x299e276fae19d328, + 0x63928c3c53a2432f, + 0x7082fef8e91b9ed0, + 0xbc6f792c3eed40f7, + 0x4c40d537d2de53db, + 0x75e8bfae5fc2b262, + 0x4da9c0d2a541fd0a, + 0x4e8fffe03cfd1264, + 0x2620e495696fa7e3, + 0xe1f0f408b8a98f6c, + 0xd1aa230fdda6d9c2, + 0xc7d0109dd1c6288f, + 0x8a79d04f7487d585, + 0x4694579ba3710ba2, + 0x38417f7cfa834f68, + 0x1d47a4db0a5007e5, + 0x206c9af1460a643f, + 0xa128ddf734bd4712, + 0x8144470672b7232d, + 0xf2e086cc02105293, + 0x182de58dbc892b57, + 0xcaa1f9b0f8931dfb, + 0x6b892447cc2e5ae9, + 0xf9dd11850420a43b, + 0x4be5beb68a243ed6, + 0x5584255f19c8d65d, + 0x3b67404e633fa006, + 0xa68db6766c472a1f, + 0xf78ac79ab4c97e21, + 0xc353442e1080aaec, + 0x9a4f9db95782e714, + }, + { + 0xc811a8058c3f55de, + 0x65f5b43196b50619, + 0xf74f96b1d6706e43, + 0x859d1e8bcb43d336, + 0x5aab8a85ccfa3d84, + 0xf9c7bf99c295fcfd, + 0xa21fd5a1de4b630f, + 0xcdb3ef763b8b456d, + 0x803f59f87cf7c385, + 0xb27c73be5f31913c, + 0x98e3ac6633b04821, + 0xbf61674c26b8f818, + 0x0ffbc995c4c130c8, + 0xaaa0862010761a98, + 0x6057f342210116aa, + 0xf63c760c0654cc35, + 0x2ddb45cc667d9042, + 0xbcf45a964bd40382, + 0x68e8a0c3ef3c6f3d, + 0xa7bd92d269ff73bc, + 0x290ae20201ed2287, + 0xb7de34cde885818f, + 0xd901eea7dd61059b, + 0xd6fa273219a03553, + 0xd56f1ae874cccec9, + 0xea31245c2e83f554, + 0x7034555da07be499, + 0xce26d2ac56e7bef7, + 0xfd161857a5054e38, + 0x6a0e7da4527436d1, + 0x5bd86a381cde9ff2, + 0xcaf7756231770c32, + 0xb09aaed9e279c8d0, + 0x5def1091c60674db, + 0x111046a2515e5045, + 0x23536ce4729802fc, + 0xc50cbcf7f5b63cfa, + 0x73a16887cd171f03, + 0x7d2941afd9f28dbd, + 0x3f5e3eb45a4f3b9d, + 0x84eefe361b677140, + 0x3db8e3d3e7076271, + 0x1a3a28f9f20fd248, + 0x7ebc7c75b49e7627, + 0x74e5f293c7eb565c, + 0x18dcf59e4f478ba4, + 0x0c6ef44fa9adcb52, + 0xc699812d98dac760, + 0x788b06dc6e469d0e, + 0xfc65f8ea7521ec4e, + 0x30a5f7219e8e0b55, + 0x2bec3f65bca57b6b, + 0xddd04969baf1b75e, + 0x99904cdbe394ea57, + 0x14b201d1e6ea40f6, + 0xbbb0c08241284add, + 0x50f20463bf8f1dff, + 0xe8d7f93b93cbacb8, + 0x4d8cb68e477c86e8, + 0xc1dd1b3992268e3f, + 0x7c5aa11209d62fcb, + 0x2f3d98abdb35c9ae, + 0x671369562bfd5ff5, + 0x15c1e16c36cee280, + 0x1d7eb2edf8f39b17, + 0xda94d37db00dfe01, + 0x877bc3ec760b8ada, + 0xcb8495dfe153ae44, + 0x05a24773b7b410b3, + 0x12857b783c32abdf, + 0x8eb770d06812513b, + 0x536739b9d2e3e665, + 0x584d57e271b26468, + 0xd789c78fc9849725, + 0xa935bbfa7d1ae102, + 0x8b1537a3dfa64188, + 0xd0cd5d9bc378de7a, + 0x4ac82c9a4d80cfb7, + 0x42777f1b83bdb620, + 0x72d2883a1d33bd75, + 0x5e7a2d4bab6a8f41, + 0xf4daab6bbb1c95d9, + 0x905cffe7fd8d31b6, + 0x83aa6422119b381f, + 0xc0aefb8442022c49, + 0xa0f908c663033ae3, + 0xa428af0804938826, + 0xade41c341a8a53c7, + 0xae7121ee77e6a85d, + 0xc47f5c4a25929e8c, + 0xb538e9aa55cdd863, + 0x06377aa9dad8eb29, + 0xa18ae87bb3279895, + 0x6edfda6a35e48414, + 0x6b7d9d19825094a7, + 0xd41cfa55a4e86cbf, + 0xe5caedc9ea42c59c, + 0xa36c351c0e6fc179, + 0x5181e4de6fabbf89, + 0xfff0c530184d17d4, + 0x9d41eb1584045892, + 0x1c0d525028d73961, + 0xf178ec180ca8856a, + 0x9a0571018ef811cd, + 0x4091a27c3ef5efcc, + 0x19af15239f6329d2, + 0x347450eff91eb990, + 0xe11b4a078dd27759, + 0xb9561de5fc601331, + 0x912f1f5a2da993c0, + 0x1654dcb65ba2191a, + 0x3e2dde098a6b99eb, + 0x8a66d71e0f82e3fe, + 0x8c51adb7d55a08d7, + 0x4533e50f8941ff7f, + 0x02e6dd67bd4859ec, + 0xe068aaba5df6d52f, + 0xc24826e3ff4a75a5, + 0x6c39070d88acddf8, + 0x6486548c4691a46f, + 0xd1bebd26135c7c0c, + 0xb30f93038f15334a, + 0x82d9849fc1bf9a69, + 0x9c320ba85420fae4, + 0xfa528243aff90767, + 0x9ed4d6cfe968a308, + 0xb825fd582c44b147, + 0x9b7691bc5edcb3bb, + 0xc7ea619048fe6516, + 0x1063a61f817af233, + 0x47d538683409a693, + 0x63c2ce984c6ded30, + 0x2a9fdfd86c81d91d, + 0x7b1e3b06032a6694, + 0x666089ebfbd9fd83, + 0x0a598ee67375207b, + 0x07449a140afc495f, + 0x2ca8a571b6593234, + 0x1f986f8a45bbc2fb, + 0x381aa4a050b372c2, + 0x5423a3add81faf3a, + 0x17273c0b8b86bb6c, + 0xfe83258dc869b5a2, + 0x287902bfd1c980f1, + 0xf5a94bd66b3837af, + 0x88800a79b2caba12, + 0x55504310083b0d4c, + 0xdf36940e07b9eeb2, + 0x04d1a7ce6790b2c5, + 0x612413fff125b4dc, + 0x26f12b97c52c124f, + 0x86082351a62f28ac, + 0xef93632f9937e5e7, + 0x3507b052293a1be6, + 0xe72c30ae570a9c70, + 0xd3586041ae1425e0, + 0xde4574b3d79d4cc4, + 0x92ba228040c5685a, + 0xf00b0ca5dc8c271c, + 0xbe1287f1f69c5a6e, + 0xf39e317fb1e0dc86, + 0x495d114020ec342d, + 0x699b407e3f18cd4b, + 0xdca3a9d46ad51528, + 0x0d1d14f279896924, + 0x0000000000000000, + 0x593eb75fa196c61e, + 0x2e4e78160b116bd8, + 0x6d4ae7b058887f8e, + 0xe65fd013872e3e06, + 0x7a6ddbbbd30ec4e2, + 0xac97fc89caaef1b1, + 0x09ccb33c1e19dbe1, + 0x89f3eac462ee1864, + 0x7770cf49aa87adc6, + 0x56c57eca6557f6d6, + 0x03953dda6d6cfb9a, + 0x36928d884456e07c, + 0x1eeb8f37959f608d, + 0x31d6179c4eaaa923, + 0x6fac3ad7e5c02662, + 0x43049fa653991456, + 0xabd3669dc052b8ee, + 0xaf02c153a7c20a2b, + 0x3ccb036e3723c007, + 0x93c9c23d90e1ca2c, + 0xc33bc65e2f6ed7d3, + 0x4cff56339758249e, + 0xb1e94e64325d6aa6, + 0x37e16d359472420a, + 0x79f8e661be623f78, + 0x5214d90402c74413, + 0x482ef1fdf0c8965b, + 0x13f69bc5ec1609a9, + 0x0e88292814e592be, + 0x4e198b542a107d72, + 0xccc00fcbebafe71b, + 0x1b49c844222b703e, + 0x2564164da840e9d5, + 0x20c6513e1ff4f966, + 0xbac3203f910ce8ab, + 0xf2edd1c261c47ef0, + 0x814cb945acd361f3, + 0x95feb8944a392105, + 0x5c9cf02c1622d6ad, + 0x971865f3f77178e9, + 0xbd87ba2b9bf0a1f4, + 0x444005b259655d09, + 0xed75be48247fbc0b, + 0x7596122e17cff42a, + 0xb44b091785e97a15, + 0x966b854e2755da9f, + 0xeee0839249134791, + 0x32432a4623c652b9, + 0xa8465b47ad3e4374, + 0xf8b45f2412b15e8b, + 0x2417f6f078644ba3, + 0xfb2162fe7fdda511, + 0x4bbbcc279da46dc1, + 0x0173e0bdd024a276, + 0x22208c59a2bca08a, + 0x8fc4906db836f34d, + 0xe4b90d743a6667ea, + 0x7147b5e0705f46ef, + 0x2782cb2a1508b039, + 0xec065ef5f45b1e7d, + 0x21b5b183cfd05b10, + 0xdbe733c060295c77, + 0x9fa73672394c017e, + 0xcf55321186c31c81, + 0xd8720e1a0d45a7ed, + 0x3b8f997a3ddf8958, + 0x3afc79c7edfb2b2e, + 0xe9a4198643ef0ece, + 0x5f09cdf67b4e2d37, + 0x4f6a6be9fa34df04, + 0xb6add47038a123f9, + 0x8d224d0a057eaaa1, + 0xc96248b85c1bf7a8, + 0xe3fd9760309a2eb5, + 0x0b2a6e5ba351820d, + 0xeb42c4e1fea75722, + 0x948d58299a1d8373, + 0x7fcf9cc864bad451, + 0xa55b4fb5d4b72a50, + 0x08bf5381ce3d7997, + 0x46a6d8d5e42d04e5, + 0xd22b80fc7e308796, + 0x57b69e77b57354a0, + 0x3969441d8097d0b4, + 0x3330cafbf3e2f0cf, + 0xe28e77dde0be8cc3, + 0x62b12e259c494f46, + 0xa6ce726fb9dbd1ca, + 0x41e242c1eed14dba, + 0x76032ff47aa30fb0, + }, + { + 0xe6f87e5c5b711fd0, + 0x258377800924fa16, + 0xc849e07e852ea4a8, + 0x5b4686a18f06c16a, + 0x0b32e9a2d77b416e, + 0xabda37a467815c66, + 0xf61796a81a686676, + 0xf5dc0b706391954b, + 0x4862f38db7e64bf1, + 0xff5c629a68bd85c5, + 0xcb827da6fcd75795, + 0x66d36daf69b9f089, + 0x356c9f74483d83b0, + 0x7cbcecb1238c99a1, + 0x36a702ac31c4708d, + 0x9eb6a8d02fbcdfd6, + 0x8b19fa51e5b3ae37, + 0x9ccfb5408a127d0b, + 0xbc0c78b508208f5a, + 0xe533e3842288eced, + 0xcec2c7d377c15fd2, + 0xec7817b6505d0f5e, + 0xb94cc2c08336871d, + 0x8c205db4cb0b04ad, + 0x763c855b28a0892f, + 0x588d1b79f6ff3257, + 0x3fecf69e4311933e, + 0x0fc0d39f803a18c9, + 0xee010a26f5f3ad83, + 0x10efe8f4411979a6, + 0x5dcda10c7de93a10, + 0x4a1bee1d1248e92c, + 0x53bff2db21847339, + 0xb4f50ccfa6a23d09, + 0x5fb4bc9cd84798cd, + 0xe88a2d8b071c56f9, + 0x7f7771695a756a9c, + 0xc5f02e71a0ba1ebc, + 0xa663f9ab4215e672, + 0x2eb19e22de5fbb78, + 0x0db9ce0f2594ba14, + 0x82520e6397664d84, + 0x2f031e6a0208ea98, + 0x5c7f2144a1be6bf0, + 0x7a37cb1cd16362db, + 0x83e08e2b4b311c64, + 0xcf70479bab960e32, + 0x856ba986b9dee71e, + 0xb5478c877af56ce9, + 0xb8fe42885f61d6fd, + 0x1bdd0156966238c8, + 0x622157923ef8a92e, + 0xfc97ff42114476f8, + 0x9d7d350856452ceb, + 0x4c90c9b0e0a71256, + 0x2308502dfbcb016c, + 0x2d7a03faa7a64845, + 0xf46e8b38bfc6c4ab, + 0xbdbef8fdd477deba, + 0x3aac4cebc8079b79, + 0xf09cb105e8879d0c, + 0x27fa6a10ac8a58cb, + 0x8960e7c1401d0cea, + 0x1a6f811e4a356928, + 0x90c4fb0773d196ff, + 0x43501a2f609d0a9f, + 0xf7a516e0c63f3796, + 0x1ce4a6b3b8da9252, + 0x1324752c38e08a9b, + 0xa5a864733bec154f, + 0x2bf124575549b33f, + 0xd766db15440dc5c7, + 0xa7d179e39e42b792, + 0xdadf151a61997fd3, + 0x86a0345ec0271423, + 0x38d5517b6da939a4, + 0x6518f077104003b4, + 0x02791d90a5aea2dd, + 0x88d267899c4a5d0a, + 0x930f66df0a2865c2, + 0x4ee9d4204509b08b, + 0x325538916685292a, + 0x412907bfc533a842, + 0xb27e2b62544dc673, + 0x6c5304456295e007, + 0x5af406e95351908a, + 0x1f2f3b6bc123616f, + 0xc37b09dc5255e5c6, + 0x3967d133b1fe6844, + 0x298839c7f0e711e2, + 0x409b87f71964f9a2, + 0xe938adc3db4b0719, + 0x0c0b4e47f9c3ebf4, + 0x5534d576d36b8843, + 0x4610a05aeb8b02d8, + 0x20c3cdf58232f251, + 0x6de1840dbec2b1e7, + 0xa0e8de06b0fa1d08, + 0x7b854b540d34333b, + 0x42e29a67bcca5b7f, + 0xd8a6088ac437dd0e, + 0xc63bb3a9d943ed81, + 0x21714dbd5e65a3b1, + 0x6761ede7b5eea169, + 0x2431f7c8d573abf6, + 0xd51fc685e1a3671a, + 0x5e063cd40410c92d, + 0x283ab98f2cb04002, + 0x8febc06cb2f2f790, + 0x17d64f116fa1d33c, + 0xe07359f1a99ee4aa, + 0x784ed68c74cdc006, + 0x6e2a19d5c73b42da, + 0x8712b4161c7045c3, + 0x371582e4ed93216d, + 0xace390414939f6fc, + 0x7ec5f12186223b7c, + 0xc0b094042bac16fb, + 0xf9d745379a527ebf, + 0x737c3f2ea3b68168, + 0x33e7b8d9bad278ca, + 0xa9a32a34c22ffebb, + 0xe48163ccfedfbd0d, + 0x8e5940246ea5a670, + 0x51c6ef4b842ad1e4, + 0x22bad065279c508c, + 0xd91488c218608cee, + 0x319ea5491f7cda17, + 0xd394e128134c9c60, + 0x094bf43272d5e3b3, + 0x9bf612a5a4aad791, + 0xccbbda43d26ffd0f, + 0x34de1f3c946ad250, + 0x4f5b5468995ee16b, + 0xdf9faf6fea8f7794, + 0x2648ea5870dd092b, + 0xbfc7e56d71d97c67, + 0xdde6b2ff4f21d549, + 0x3c276b463ae86003, + 0x91767b4faf86c71f, + 0x68a13e7835d4b9a0, + 0xb68c115f030c9fd4, + 0x141dd2c916582001, + 0x983d8f7ddd5324ac, + 0x64aa703fcc175254, + 0xc2c989948e02b426, + 0x3e5e76d69f46c2de, + 0x50746f03587d8004, + 0x45db3d829272f1e5, + 0x60584a029b560bf3, + 0xfbae58a73ffcdc62, + 0xa15a5e4e6cad4ce8, + 0x4ba96e55ce1fb8cc, + 0x08f9747aae82b253, + 0xc102144cf7fb471b, + 0x9f042898f3eb8e36, + 0x068b27adf2effb7a, + 0xedca97fe8c0a5ebe, + 0x778e0513f4f7d8cf, + 0x302c2501c32b8bf7, + 0x8d92ddfc175c554d, + 0xf865c57f46052f5f, + 0xeaf3301ba2b2f424, + 0xaa68b7ecbbd60d86, + 0x998f0f350104754c, + 0x0000000000000000, + 0xf12e314d34d0ccec, + 0x710522be061823b5, + 0xaf280d9930c005c1, + 0x97fd5ce25d693c65, + 0x19a41cc633cc9a15, + 0x95844172f8c79eb8, + 0xdc5432b7937684a9, + 0x9436c13a2490cf58, + 0x802b13f332c8ef59, + 0xc442ae397ced4f5c, + 0xfa1cd8efe3ab8d82, + 0xf2e5ac954d293fd1, + 0x6ad823e8907a1b7d, + 0x4d2249f83cf043b6, + 0x03cb9dd879f9f33d, + 0xde2d2f2736d82674, + 0x2a43a41f891ee2df, + 0x6f98999d1b6c133a, + 0xd4ad46cd3df436fa, + 0xbb35df50269825c0, + 0x964fdcaa813e6d85, + 0xeb41b0537ee5a5c4, + 0x0540ba758b160847, + 0xa41ae43be7bb44af, + 0xe3b8c429d0671797, + 0x819993bbee9fbeb9, + 0xae9a8dd1ec975421, + 0xf3572cdd917e6e31, + 0x6393d7dae2aff8ce, + 0x47a2201237dc5338, + 0xa32343dec903ee35, + 0x79fc56c4a89a91e6, + 0x01b28048dc5751e0, + 0x1296f564e4b7db7b, + 0x75f7188351597a12, + 0xdb6d9552bdce2e33, + 0x1e9dbb231d74308f, + 0x520d7293fdd322d9, + 0xe20a44610c304677, + 0xfeeee2d2b4ead425, + 0xca30fdee20800675, + 0x61eaca4a47015a13, + 0xe74afe1487264e30, + 0x2cc883b27bf119a5, + 0x1664cf59b3f682dc, + 0xa811aa7c1e78af5b, + 0x1d5626fb648dc3b2, + 0xb73e9117df5bce34, + 0xd05f7cf06ab56f5d, + 0xfd257f0acd132718, + 0x574dc8e676c52a9e, + 0x0739a7e52eb8aa9a, + 0x5486553e0f3cd9a3, + 0x56ff48aeaa927b7e, + 0xbe756525ad8e2d87, + 0x7d0e6cf9ffdbc841, + 0x3b1ecca31450ca99, + 0x6913be30e983e840, + 0xad511009956ea71c, + 0xb1b5b6ba2db4354e, + 0x4469bdca4e25a005, + 0x15af5281ca0f71e1, + 0x744598cb8d0e2bf2, + 0x593f9b312aa863b7, + 0xefb38a6e29a4fc63, + 0x6b6aa3a04c2d4a9d, + 0x3d95eb0ee6bf31e3, + 0xa291c3961554bfd5, + 0x18169c8eef9bcbf5, + 0x115d68bc9d4e2846, + 0xba875f18facf7420, + 0xd1edfcb8b6e23ebd, + 0xb00736f2f1e364ae, + 0x84d929ce6589b6fe, + 0x70b7a2f6da4f7255, + 0x0e7253d75c6d4929, + 0x04f23a3d574159a7, + 0x0a8069ea0b2c108e, + 0x49d073c56bb11a11, + 0x8aab7a1939e4ffd7, + 0xcd095a0b0e38acef, + 0xc9fb60365979f548, + 0x92bde697d67f3422, + 0xc78933e10514bc61, + 0xe1c1d9b975c9b54a, + 0xd2266160cf1bcd80, + 0x9a4492ed78fd8671, + 0xb3ccab2a881a9793, + 0x72cebf667fe1d088, + 0xd6d45b5d985a9427, + }, +}; + +__device__ __constant__ u64 sbob_rc64[12][8] = +{ + { + 0xe9daca1eda5b08b1, + 0x1f7c65c0812fcbeb, + 0x16d0452e43766a2f, + 0xfcc485758db84e71, + 0x0169679291e07c4b, + 0x15d360a4082a42a2, + 0x234d74cc36747605, + 0x0745a6f2596580dd, + }, + { + 0x1a2f9da98ab5a36f, + 0xd7b5700f469de34f, + 0x982b230a72eafef3, + 0x3101b5160f5ed561, + 0x5899d6126b17b59a, + 0xcaa70adbc261b55c, + 0x56cdcbd71ba2dd55, + 0xb79bb121700479e6, + }, + { + 0xc72fce2bacdc74f5, + 0x35843d6a28fc390a, + 0x8b1f9c525f5ef106, + 0x7b7b29b11475eaf2, + 0xb19e3590e40fe2d3, + 0x09db6260373ac9c1, + 0x31db7a8643f4b6c2, + 0xb20aba0af5961e99, + }, + { + 0xd26615e8b3df1fef, + 0xdde4715da0e148f9, + 0x7d3c5c337e858e48, + 0x3f355e68ad1c729d, + 0x75d603ed822cd7a9, + 0xbe0352933313b7d8, + 0xf137e893a1ea5334, + 0x2ed1e384bcbe0c22, + }, + { + 0x994747adac6bea4b, + 0x6323a96c0c413f9a, + 0x4a1086161f1c157f, + 0xbdff0f80d7359e35, + 0xa3f53a254717cdbf, + 0x161a2723b700ffdf, + 0xf563eaa97ea2567a, + 0x57fe6c7cfd581760, + }, + { + 0xd9d33a1daeae4fae, + 0xc039307a3bc3a46f, + 0x6ca44251f9c4662d, + 0xc68ef09ab49a7f18, + 0xb4b79a1cb7a6facf, + 0xb6c6bec2661ff20a, + 0x354f903672c571bf, + 0x6e7d64467a4068fa, + }, + { + 0xecc5aaee160ec7f4, + 0x540924bffe86ac51, + 0xc987bfe6c7c69e39, + 0xc9937a19333e47d3, + 0x372c822dc5ab9209, + 0x04054a2883694706, + 0xf34a3ca24c451735, + 0x93d4143a4d568688, + }, + { + 0xa7c9934d425b1f9b, + 0x41416e0c02aae703, + 0x1ede369c71f8b74e, + 0x9ac4db4d3b44b489, + 0x90069b92cb2b89f4, + 0x2fc4a5d12b8dd169, + 0xd9a8515935c2ac36, + 0x1ee702bfd40d7fa4, + }, + { + 0x9b223116545a8f37, + 0xde5f16ecd89a4c94, + 0x244289251b3a7d3a, + 0x84090de0b755d93c, + 0xb1ceb2db0b440a80, + 0x549c07a69a8a2b7b, + 0x602a1fcb92dc380e, + 0xdb5a238351446172, + }, + { + 0x526f0580a6debeab, + 0xf3f3e4b248e52a38, + 0xdb788aff1ce74189, + 0x0361331b8ae1ff1f, + 0x4b3369af0267e79f, + 0xf452763b306c1e7a, + 0xc3b63b15d1fa9836, + 0xed9c4598fbc7b474, + }, + { + 0xfb89c8efd09ecd7b, + 0x94fe5a63cdc60230, + 0x6107abebbb6bfad8, + 0x7966841421800120, + 0xcab948eaef711d8a, + 0x986e477d1dcdbaef, + 0x5dd86fc04a59a2de, + 0x1b2df381cda4ca6b, + }, + { + 0xba3116f167e78e37, + 0x7ab14904b08013d2, + 0x771ddfbc323ca4cd, + 0x9b9f2130d41220f8, + 0x86cc91189def805d, + 0x5228e188aaa41de7, + 0x991bb2d9d517f4fa, + 0x20d71bf14a92bc48, + }, +}; + +__device__ static void streebog_g (u64 h[8], const u64 m[8], u64 s_sbob_sl64[8][256]) +{ + u64 k[8]; + u64 s[8]; + u64 t[8]; + + #pragma unroll + for (int i = 0; i < 8; i++) + { + t[i] = h[i]; + } + + for (int i = 0; i < 8; i++) + { + k[i] = SBOG_LPSti64; + } + + #pragma unroll + for (int i = 0; i < 8; i++) + { + s[i] = m[i]; + } + + for (int r = 0; r < 12; r++) + { + #pragma unroll + for (int i = 0; i < 8; i++) + { + t[i] = s[i] ^ k[i]; + } + + #pragma unroll + for (int i = 0; i < 8; i++) + { + s[i] = SBOG_LPSti64; + } + + for (int i = 0; i < 8; i++) + { + t[i] = k[i] ^ sbob_rc64[r][i]; + } + + #pragma unroll + for (int i = 0; i < 8; i++) + { + k[i] = SBOG_LPSti64; + } + } + + #pragma unroll + for (int i = 0; i < 8; i++) + { + h[i] ^= s[i] ^ k[i] ^ m[i]; + } +} + +__device__ __constant__ bf_t c_bfs[1024]; + +__device__ static void m11700m (u64 s_sbob_sl64[8][256], u32 w[16], const u32 pw_len, const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset) +{ + /** + * modifier + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + const u32 lid = threadIdx.x; + + /** + * loop + */ + + u32x w0l = w[0]; + + for (u32 il_pos = 0; il_pos < bfs_cnt; il_pos++) + { + const u32 w0r = c_bfs[il_pos].i; + + w[0] = w0l | w0r; + + /** + * reverse message block + */ + + u64 m[8]; + + m[0] = hl32_to_64 (w[15], w[14]); + m[1] = hl32_to_64 (w[13], w[12]); + m[2] = hl32_to_64 (w[11], w[10]); + m[3] = hl32_to_64 (w[ 9], w[ 8]); + m[4] = hl32_to_64 (w[ 7], w[ 6]); + m[5] = hl32_to_64 (w[ 5], w[ 4]); + m[6] = hl32_to_64 (w[ 3], w[ 2]); + m[7] = hl32_to_64 (w[ 1], w[ 0]); + + m[0] = swap_workaround (m[0]); + m[1] = swap_workaround (m[1]); + m[2] = swap_workaround (m[2]); + m[3] = swap_workaround (m[3]); + m[4] = swap_workaround (m[4]); + m[5] = swap_workaround (m[5]); + m[6] = swap_workaround (m[6]); + m[7] = swap_workaround (m[7]); + + // state buffer (hash) + + u64 h[8]; + + h[0] = INITVAL; + h[1] = INITVAL; + h[2] = INITVAL; + h[3] = INITVAL; + h[4] = INITVAL; + h[5] = INITVAL; + h[6] = INITVAL; + h[7] = INITVAL; + + streebog_g (h, m, s_sbob_sl64); + + u64 z[8]; + + z[0] = 0; + z[1] = 0; + z[2] = 0; + z[3] = 0; + z[4] = 0; + z[5] = 0; + z[6] = 0; + z[7] = swap_workaround ((u64) (pw_len * 8)); + + streebog_g (h, z, s_sbob_sl64); + streebog_g (h, m, s_sbob_sl64); + + const u32 r0 = l32_from_64 (h[0]); + const u32 r1 = h32_from_64 (h[0]); + const u32 r2 = l32_from_64 (h[1]); + const u32 r3 = h32_from_64 (h[1]); + + #include VECT_COMPARE_M + } +} + +__device__ static void m11700s (u64 s_sbob_sl64[8][256], u32 w[16], const u32 pw_len, const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset) +{ + /** + * modifier + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + const u32 lid = threadIdx.x; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * loop + */ + + u32x w0l = w[0]; + + for (u32 il_pos = 0; il_pos < bfs_cnt; il_pos++) + { + const u32 w0r = c_bfs[il_pos].i; + + w[0] = w0l | w0r; + + /** + * reverse message block + */ + + u64 m[8]; + + m[0] = hl32_to_64 (w[15], w[14]); + m[1] = hl32_to_64 (w[13], w[12]); + m[2] = hl32_to_64 (w[11], w[10]); + m[3] = hl32_to_64 (w[ 9], w[ 8]); + m[4] = hl32_to_64 (w[ 7], w[ 6]); + m[5] = hl32_to_64 (w[ 5], w[ 4]); + m[6] = hl32_to_64 (w[ 3], w[ 2]); + m[7] = hl32_to_64 (w[ 1], w[ 0]); + + m[0] = swap_workaround (m[0]); + m[1] = swap_workaround (m[1]); + m[2] = swap_workaround (m[2]); + m[3] = swap_workaround (m[3]); + m[4] = swap_workaround (m[4]); + m[5] = swap_workaround (m[5]); + m[6] = swap_workaround (m[6]); + m[7] = swap_workaround (m[7]); + + // state buffer (hash) + + u64 h[8]; + + h[0] = INITVAL; + h[1] = INITVAL; + h[2] = INITVAL; + h[3] = INITVAL; + h[4] = INITVAL; + h[5] = INITVAL; + h[6] = INITVAL; + h[7] = INITVAL; + + streebog_g (h, m, s_sbob_sl64); + + u64 z[8]; + + z[0] = 0; + z[1] = 0; + z[2] = 0; + z[3] = 0; + z[4] = 0; + z[5] = 0; + z[6] = 0; + z[7] = swap_workaround ((u64) (pw_len * 8)); + + streebog_g (h, z, s_sbob_sl64); + streebog_g (h, m, s_sbob_sl64); + + const u32 r0 = l32_from_64 (h[0]); + const u32 r1 = h32_from_64 (h[0]); + const u32 r2 = l32_from_64 (h[1]); + const u32 r3 = h32_from_64 (h[1]); + + #include VECT_COMPARE_S + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m11700_m04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + const u32 lid = threadIdx.x; + + u32x w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = 0; + w[ 5] = 0; + w[ 6] = 0; + w[ 7] = 0; + w[ 8] = 0; + w[ 9] = 0; + w[10] = 0; + w[11] = 0; + w[12] = 0; + w[13] = 0; + w[14] = 0; + w[15] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * shared lookup table + */ + + __shared__ u64 s_sbob_sl64[8][256]; + + if (lid < 64) + { + const u32 lid4 = lid * 4; + + s_sbob_sl64[0][lid4 + 0] = sbob_sl64[0][lid4 + 0]; + s_sbob_sl64[0][lid4 + 1] = sbob_sl64[0][lid4 + 1]; + s_sbob_sl64[0][lid4 + 2] = sbob_sl64[0][lid4 + 2]; + s_sbob_sl64[0][lid4 + 3] = sbob_sl64[0][lid4 + 3]; + s_sbob_sl64[1][lid4 + 0] = sbob_sl64[1][lid4 + 0]; + s_sbob_sl64[1][lid4 + 1] = sbob_sl64[1][lid4 + 1]; + s_sbob_sl64[1][lid4 + 2] = sbob_sl64[1][lid4 + 2]; + s_sbob_sl64[1][lid4 + 3] = sbob_sl64[1][lid4 + 3]; + s_sbob_sl64[2][lid4 + 0] = sbob_sl64[2][lid4 + 0]; + s_sbob_sl64[2][lid4 + 1] = sbob_sl64[2][lid4 + 1]; + s_sbob_sl64[2][lid4 + 2] = sbob_sl64[2][lid4 + 2]; + s_sbob_sl64[2][lid4 + 3] = sbob_sl64[2][lid4 + 3]; + s_sbob_sl64[3][lid4 + 0] = sbob_sl64[3][lid4 + 0]; + s_sbob_sl64[3][lid4 + 1] = sbob_sl64[3][lid4 + 1]; + s_sbob_sl64[3][lid4 + 2] = sbob_sl64[3][lid4 + 2]; + s_sbob_sl64[3][lid4 + 3] = sbob_sl64[3][lid4 + 3]; + s_sbob_sl64[4][lid4 + 0] = sbob_sl64[4][lid4 + 0]; + s_sbob_sl64[4][lid4 + 1] = sbob_sl64[4][lid4 + 1]; + s_sbob_sl64[4][lid4 + 2] = sbob_sl64[4][lid4 + 2]; + s_sbob_sl64[4][lid4 + 3] = sbob_sl64[4][lid4 + 3]; + s_sbob_sl64[5][lid4 + 0] = sbob_sl64[5][lid4 + 0]; + s_sbob_sl64[5][lid4 + 1] = sbob_sl64[5][lid4 + 1]; + s_sbob_sl64[5][lid4 + 2] = sbob_sl64[5][lid4 + 2]; + s_sbob_sl64[5][lid4 + 3] = sbob_sl64[5][lid4 + 3]; + s_sbob_sl64[6][lid4 + 0] = sbob_sl64[6][lid4 + 0]; + s_sbob_sl64[6][lid4 + 1] = sbob_sl64[6][lid4 + 1]; + s_sbob_sl64[6][lid4 + 2] = sbob_sl64[6][lid4 + 2]; + s_sbob_sl64[6][lid4 + 3] = sbob_sl64[6][lid4 + 3]; + s_sbob_sl64[7][lid4 + 0] = sbob_sl64[7][lid4 + 0]; + s_sbob_sl64[7][lid4 + 1] = sbob_sl64[7][lid4 + 1]; + s_sbob_sl64[7][lid4 + 2] = sbob_sl64[7][lid4 + 2]; + s_sbob_sl64[7][lid4 + 3] = sbob_sl64[7][lid4 + 3]; + } + + __syncthreads (); + + if (gid >= gid_max) return; + + /** + * main + */ + + m11700m (s_sbob_sl64, w, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m11700_m08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + const u32 lid = threadIdx.x; + + u32x w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = pws[gid].i[ 4]; + w[ 5] = pws[gid].i[ 5]; + w[ 6] = pws[gid].i[ 6]; + w[ 7] = pws[gid].i[ 7]; + w[ 8] = 0; + w[ 9] = 0; + w[10] = 0; + w[11] = 0; + w[12] = 0; + w[13] = 0; + w[14] = 0; + w[15] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * shared lookup table + */ + + __shared__ u64 s_sbob_sl64[8][256]; + + if (lid < 64) + { + const u32 lid4 = lid * 4; + + s_sbob_sl64[0][lid4 + 0] = sbob_sl64[0][lid4 + 0]; + s_sbob_sl64[0][lid4 + 1] = sbob_sl64[0][lid4 + 1]; + s_sbob_sl64[0][lid4 + 2] = sbob_sl64[0][lid4 + 2]; + s_sbob_sl64[0][lid4 + 3] = sbob_sl64[0][lid4 + 3]; + s_sbob_sl64[1][lid4 + 0] = sbob_sl64[1][lid4 + 0]; + s_sbob_sl64[1][lid4 + 1] = sbob_sl64[1][lid4 + 1]; + s_sbob_sl64[1][lid4 + 2] = sbob_sl64[1][lid4 + 2]; + s_sbob_sl64[1][lid4 + 3] = sbob_sl64[1][lid4 + 3]; + s_sbob_sl64[2][lid4 + 0] = sbob_sl64[2][lid4 + 0]; + s_sbob_sl64[2][lid4 + 1] = sbob_sl64[2][lid4 + 1]; + s_sbob_sl64[2][lid4 + 2] = sbob_sl64[2][lid4 + 2]; + s_sbob_sl64[2][lid4 + 3] = sbob_sl64[2][lid4 + 3]; + s_sbob_sl64[3][lid4 + 0] = sbob_sl64[3][lid4 + 0]; + s_sbob_sl64[3][lid4 + 1] = sbob_sl64[3][lid4 + 1]; + s_sbob_sl64[3][lid4 + 2] = sbob_sl64[3][lid4 + 2]; + s_sbob_sl64[3][lid4 + 3] = sbob_sl64[3][lid4 + 3]; + s_sbob_sl64[4][lid4 + 0] = sbob_sl64[4][lid4 + 0]; + s_sbob_sl64[4][lid4 + 1] = sbob_sl64[4][lid4 + 1]; + s_sbob_sl64[4][lid4 + 2] = sbob_sl64[4][lid4 + 2]; + s_sbob_sl64[4][lid4 + 3] = sbob_sl64[4][lid4 + 3]; + s_sbob_sl64[5][lid4 + 0] = sbob_sl64[5][lid4 + 0]; + s_sbob_sl64[5][lid4 + 1] = sbob_sl64[5][lid4 + 1]; + s_sbob_sl64[5][lid4 + 2] = sbob_sl64[5][lid4 + 2]; + s_sbob_sl64[5][lid4 + 3] = sbob_sl64[5][lid4 + 3]; + s_sbob_sl64[6][lid4 + 0] = sbob_sl64[6][lid4 + 0]; + s_sbob_sl64[6][lid4 + 1] = sbob_sl64[6][lid4 + 1]; + s_sbob_sl64[6][lid4 + 2] = sbob_sl64[6][lid4 + 2]; + s_sbob_sl64[6][lid4 + 3] = sbob_sl64[6][lid4 + 3]; + s_sbob_sl64[7][lid4 + 0] = sbob_sl64[7][lid4 + 0]; + s_sbob_sl64[7][lid4 + 1] = sbob_sl64[7][lid4 + 1]; + s_sbob_sl64[7][lid4 + 2] = sbob_sl64[7][lid4 + 2]; + s_sbob_sl64[7][lid4 + 3] = sbob_sl64[7][lid4 + 3]; + } + + __syncthreads (); + + if (gid >= gid_max) return; + + /** + * main + */ + + m11700m (s_sbob_sl64, w, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m11700_m16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + const u32 lid = threadIdx.x; + + u32x w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = pws[gid].i[ 4]; + w[ 5] = pws[gid].i[ 5]; + w[ 6] = pws[gid].i[ 6]; + w[ 7] = pws[gid].i[ 7]; + w[ 8] = pws[gid].i[ 8]; + w[ 9] = pws[gid].i[ 9]; + w[10] = pws[gid].i[10]; + w[11] = pws[gid].i[11]; + w[12] = pws[gid].i[12]; + w[13] = pws[gid].i[13]; + w[14] = pws[gid].i[14]; + w[15] = pws[gid].i[15]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * shared lookup table + */ + + __shared__ u64 s_sbob_sl64[8][256]; + + if (lid < 64) + { + const u32 lid4 = lid * 4; + + s_sbob_sl64[0][lid4 + 0] = sbob_sl64[0][lid4 + 0]; + s_sbob_sl64[0][lid4 + 1] = sbob_sl64[0][lid4 + 1]; + s_sbob_sl64[0][lid4 + 2] = sbob_sl64[0][lid4 + 2]; + s_sbob_sl64[0][lid4 + 3] = sbob_sl64[0][lid4 + 3]; + s_sbob_sl64[1][lid4 + 0] = sbob_sl64[1][lid4 + 0]; + s_sbob_sl64[1][lid4 + 1] = sbob_sl64[1][lid4 + 1]; + s_sbob_sl64[1][lid4 + 2] = sbob_sl64[1][lid4 + 2]; + s_sbob_sl64[1][lid4 + 3] = sbob_sl64[1][lid4 + 3]; + s_sbob_sl64[2][lid4 + 0] = sbob_sl64[2][lid4 + 0]; + s_sbob_sl64[2][lid4 + 1] = sbob_sl64[2][lid4 + 1]; + s_sbob_sl64[2][lid4 + 2] = sbob_sl64[2][lid4 + 2]; + s_sbob_sl64[2][lid4 + 3] = sbob_sl64[2][lid4 + 3]; + s_sbob_sl64[3][lid4 + 0] = sbob_sl64[3][lid4 + 0]; + s_sbob_sl64[3][lid4 + 1] = sbob_sl64[3][lid4 + 1]; + s_sbob_sl64[3][lid4 + 2] = sbob_sl64[3][lid4 + 2]; + s_sbob_sl64[3][lid4 + 3] = sbob_sl64[3][lid4 + 3]; + s_sbob_sl64[4][lid4 + 0] = sbob_sl64[4][lid4 + 0]; + s_sbob_sl64[4][lid4 + 1] = sbob_sl64[4][lid4 + 1]; + s_sbob_sl64[4][lid4 + 2] = sbob_sl64[4][lid4 + 2]; + s_sbob_sl64[4][lid4 + 3] = sbob_sl64[4][lid4 + 3]; + s_sbob_sl64[5][lid4 + 0] = sbob_sl64[5][lid4 + 0]; + s_sbob_sl64[5][lid4 + 1] = sbob_sl64[5][lid4 + 1]; + s_sbob_sl64[5][lid4 + 2] = sbob_sl64[5][lid4 + 2]; + s_sbob_sl64[5][lid4 + 3] = sbob_sl64[5][lid4 + 3]; + s_sbob_sl64[6][lid4 + 0] = sbob_sl64[6][lid4 + 0]; + s_sbob_sl64[6][lid4 + 1] = sbob_sl64[6][lid4 + 1]; + s_sbob_sl64[6][lid4 + 2] = sbob_sl64[6][lid4 + 2]; + s_sbob_sl64[6][lid4 + 3] = sbob_sl64[6][lid4 + 3]; + s_sbob_sl64[7][lid4 + 0] = sbob_sl64[7][lid4 + 0]; + s_sbob_sl64[7][lid4 + 1] = sbob_sl64[7][lid4 + 1]; + s_sbob_sl64[7][lid4 + 2] = sbob_sl64[7][lid4 + 2]; + s_sbob_sl64[7][lid4 + 3] = sbob_sl64[7][lid4 + 3]; + } + + __syncthreads (); + + if (gid >= gid_max) return; + + /** + * main + */ + + m11700m (s_sbob_sl64, w, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m11700_s04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + const u32 lid = threadIdx.x; + + u32x w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = 0; + w[ 5] = 0; + w[ 6] = 0; + w[ 7] = 0; + w[ 8] = 0; + w[ 9] = 0; + w[10] = 0; + w[11] = 0; + w[12] = 0; + w[13] = 0; + w[14] = 0; + w[15] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * shared lookup table + */ + + __shared__ u64 s_sbob_sl64[8][256]; + + if (lid < 64) + { + const u32 lid4 = lid * 4; + + s_sbob_sl64[0][lid4 + 0] = sbob_sl64[0][lid4 + 0]; + s_sbob_sl64[0][lid4 + 1] = sbob_sl64[0][lid4 + 1]; + s_sbob_sl64[0][lid4 + 2] = sbob_sl64[0][lid4 + 2]; + s_sbob_sl64[0][lid4 + 3] = sbob_sl64[0][lid4 + 3]; + s_sbob_sl64[1][lid4 + 0] = sbob_sl64[1][lid4 + 0]; + s_sbob_sl64[1][lid4 + 1] = sbob_sl64[1][lid4 + 1]; + s_sbob_sl64[1][lid4 + 2] = sbob_sl64[1][lid4 + 2]; + s_sbob_sl64[1][lid4 + 3] = sbob_sl64[1][lid4 + 3]; + s_sbob_sl64[2][lid4 + 0] = sbob_sl64[2][lid4 + 0]; + s_sbob_sl64[2][lid4 + 1] = sbob_sl64[2][lid4 + 1]; + s_sbob_sl64[2][lid4 + 2] = sbob_sl64[2][lid4 + 2]; + s_sbob_sl64[2][lid4 + 3] = sbob_sl64[2][lid4 + 3]; + s_sbob_sl64[3][lid4 + 0] = sbob_sl64[3][lid4 + 0]; + s_sbob_sl64[3][lid4 + 1] = sbob_sl64[3][lid4 + 1]; + s_sbob_sl64[3][lid4 + 2] = sbob_sl64[3][lid4 + 2]; + s_sbob_sl64[3][lid4 + 3] = sbob_sl64[3][lid4 + 3]; + s_sbob_sl64[4][lid4 + 0] = sbob_sl64[4][lid4 + 0]; + s_sbob_sl64[4][lid4 + 1] = sbob_sl64[4][lid4 + 1]; + s_sbob_sl64[4][lid4 + 2] = sbob_sl64[4][lid4 + 2]; + s_sbob_sl64[4][lid4 + 3] = sbob_sl64[4][lid4 + 3]; + s_sbob_sl64[5][lid4 + 0] = sbob_sl64[5][lid4 + 0]; + s_sbob_sl64[5][lid4 + 1] = sbob_sl64[5][lid4 + 1]; + s_sbob_sl64[5][lid4 + 2] = sbob_sl64[5][lid4 + 2]; + s_sbob_sl64[5][lid4 + 3] = sbob_sl64[5][lid4 + 3]; + s_sbob_sl64[6][lid4 + 0] = sbob_sl64[6][lid4 + 0]; + s_sbob_sl64[6][lid4 + 1] = sbob_sl64[6][lid4 + 1]; + s_sbob_sl64[6][lid4 + 2] = sbob_sl64[6][lid4 + 2]; + s_sbob_sl64[6][lid4 + 3] = sbob_sl64[6][lid4 + 3]; + s_sbob_sl64[7][lid4 + 0] = sbob_sl64[7][lid4 + 0]; + s_sbob_sl64[7][lid4 + 1] = sbob_sl64[7][lid4 + 1]; + s_sbob_sl64[7][lid4 + 2] = sbob_sl64[7][lid4 + 2]; + s_sbob_sl64[7][lid4 + 3] = sbob_sl64[7][lid4 + 3]; + } + + __syncthreads (); + + if (gid >= gid_max) return; + + /** + * main + */ + + m11700s (s_sbob_sl64, w, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m11700_s08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + const u32 lid = threadIdx.x; + + u32x w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = pws[gid].i[ 4]; + w[ 5] = pws[gid].i[ 5]; + w[ 6] = pws[gid].i[ 6]; + w[ 7] = pws[gid].i[ 7]; + w[ 8] = 0; + w[ 9] = 0; + w[10] = 0; + w[11] = 0; + w[12] = 0; + w[13] = 0; + w[14] = 0; + w[15] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * shared lookup table + */ + + __shared__ u64 s_sbob_sl64[8][256]; + + if (lid < 64) + { + const u32 lid4 = lid * 4; + + s_sbob_sl64[0][lid4 + 0] = sbob_sl64[0][lid4 + 0]; + s_sbob_sl64[0][lid4 + 1] = sbob_sl64[0][lid4 + 1]; + s_sbob_sl64[0][lid4 + 2] = sbob_sl64[0][lid4 + 2]; + s_sbob_sl64[0][lid4 + 3] = sbob_sl64[0][lid4 + 3]; + s_sbob_sl64[1][lid4 + 0] = sbob_sl64[1][lid4 + 0]; + s_sbob_sl64[1][lid4 + 1] = sbob_sl64[1][lid4 + 1]; + s_sbob_sl64[1][lid4 + 2] = sbob_sl64[1][lid4 + 2]; + s_sbob_sl64[1][lid4 + 3] = sbob_sl64[1][lid4 + 3]; + s_sbob_sl64[2][lid4 + 0] = sbob_sl64[2][lid4 + 0]; + s_sbob_sl64[2][lid4 + 1] = sbob_sl64[2][lid4 + 1]; + s_sbob_sl64[2][lid4 + 2] = sbob_sl64[2][lid4 + 2]; + s_sbob_sl64[2][lid4 + 3] = sbob_sl64[2][lid4 + 3]; + s_sbob_sl64[3][lid4 + 0] = sbob_sl64[3][lid4 + 0]; + s_sbob_sl64[3][lid4 + 1] = sbob_sl64[3][lid4 + 1]; + s_sbob_sl64[3][lid4 + 2] = sbob_sl64[3][lid4 + 2]; + s_sbob_sl64[3][lid4 + 3] = sbob_sl64[3][lid4 + 3]; + s_sbob_sl64[4][lid4 + 0] = sbob_sl64[4][lid4 + 0]; + s_sbob_sl64[4][lid4 + 1] = sbob_sl64[4][lid4 + 1]; + s_sbob_sl64[4][lid4 + 2] = sbob_sl64[4][lid4 + 2]; + s_sbob_sl64[4][lid4 + 3] = sbob_sl64[4][lid4 + 3]; + s_sbob_sl64[5][lid4 + 0] = sbob_sl64[5][lid4 + 0]; + s_sbob_sl64[5][lid4 + 1] = sbob_sl64[5][lid4 + 1]; + s_sbob_sl64[5][lid4 + 2] = sbob_sl64[5][lid4 + 2]; + s_sbob_sl64[5][lid4 + 3] = sbob_sl64[5][lid4 + 3]; + s_sbob_sl64[6][lid4 + 0] = sbob_sl64[6][lid4 + 0]; + s_sbob_sl64[6][lid4 + 1] = sbob_sl64[6][lid4 + 1]; + s_sbob_sl64[6][lid4 + 2] = sbob_sl64[6][lid4 + 2]; + s_sbob_sl64[6][lid4 + 3] = sbob_sl64[6][lid4 + 3]; + s_sbob_sl64[7][lid4 + 0] = sbob_sl64[7][lid4 + 0]; + s_sbob_sl64[7][lid4 + 1] = sbob_sl64[7][lid4 + 1]; + s_sbob_sl64[7][lid4 + 2] = sbob_sl64[7][lid4 + 2]; + s_sbob_sl64[7][lid4 + 3] = sbob_sl64[7][lid4 + 3]; + } + + __syncthreads (); + + if (gid >= gid_max) return; + + /** + * main + */ + + m11700s (s_sbob_sl64, w, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m11700_s16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + const u32 lid = threadIdx.x; + + u32x w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = pws[gid].i[ 4]; + w[ 5] = pws[gid].i[ 5]; + w[ 6] = pws[gid].i[ 6]; + w[ 7] = pws[gid].i[ 7]; + w[ 8] = pws[gid].i[ 8]; + w[ 9] = pws[gid].i[ 9]; + w[10] = pws[gid].i[10]; + w[11] = pws[gid].i[11]; + w[12] = pws[gid].i[12]; + w[13] = pws[gid].i[13]; + w[14] = pws[gid].i[14]; + w[15] = pws[gid].i[15]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * shared lookup table + */ + + __shared__ u64 s_sbob_sl64[8][256]; + + if (lid < 64) + { + const u32 lid4 = lid * 4; + + s_sbob_sl64[0][lid4 + 0] = sbob_sl64[0][lid4 + 0]; + s_sbob_sl64[0][lid4 + 1] = sbob_sl64[0][lid4 + 1]; + s_sbob_sl64[0][lid4 + 2] = sbob_sl64[0][lid4 + 2]; + s_sbob_sl64[0][lid4 + 3] = sbob_sl64[0][lid4 + 3]; + s_sbob_sl64[1][lid4 + 0] = sbob_sl64[1][lid4 + 0]; + s_sbob_sl64[1][lid4 + 1] = sbob_sl64[1][lid4 + 1]; + s_sbob_sl64[1][lid4 + 2] = sbob_sl64[1][lid4 + 2]; + s_sbob_sl64[1][lid4 + 3] = sbob_sl64[1][lid4 + 3]; + s_sbob_sl64[2][lid4 + 0] = sbob_sl64[2][lid4 + 0]; + s_sbob_sl64[2][lid4 + 1] = sbob_sl64[2][lid4 + 1]; + s_sbob_sl64[2][lid4 + 2] = sbob_sl64[2][lid4 + 2]; + s_sbob_sl64[2][lid4 + 3] = sbob_sl64[2][lid4 + 3]; + s_sbob_sl64[3][lid4 + 0] = sbob_sl64[3][lid4 + 0]; + s_sbob_sl64[3][lid4 + 1] = sbob_sl64[3][lid4 + 1]; + s_sbob_sl64[3][lid4 + 2] = sbob_sl64[3][lid4 + 2]; + s_sbob_sl64[3][lid4 + 3] = sbob_sl64[3][lid4 + 3]; + s_sbob_sl64[4][lid4 + 0] = sbob_sl64[4][lid4 + 0]; + s_sbob_sl64[4][lid4 + 1] = sbob_sl64[4][lid4 + 1]; + s_sbob_sl64[4][lid4 + 2] = sbob_sl64[4][lid4 + 2]; + s_sbob_sl64[4][lid4 + 3] = sbob_sl64[4][lid4 + 3]; + s_sbob_sl64[5][lid4 + 0] = sbob_sl64[5][lid4 + 0]; + s_sbob_sl64[5][lid4 + 1] = sbob_sl64[5][lid4 + 1]; + s_sbob_sl64[5][lid4 + 2] = sbob_sl64[5][lid4 + 2]; + s_sbob_sl64[5][lid4 + 3] = sbob_sl64[5][lid4 + 3]; + s_sbob_sl64[6][lid4 + 0] = sbob_sl64[6][lid4 + 0]; + s_sbob_sl64[6][lid4 + 1] = sbob_sl64[6][lid4 + 1]; + s_sbob_sl64[6][lid4 + 2] = sbob_sl64[6][lid4 + 2]; + s_sbob_sl64[6][lid4 + 3] = sbob_sl64[6][lid4 + 3]; + s_sbob_sl64[7][lid4 + 0] = sbob_sl64[7][lid4 + 0]; + s_sbob_sl64[7][lid4 + 1] = sbob_sl64[7][lid4 + 1]; + s_sbob_sl64[7][lid4 + 2] = sbob_sl64[7][lid4 + 2]; + s_sbob_sl64[7][lid4 + 3] = sbob_sl64[7][lid4 + 3]; + } + + __syncthreads (); + + if (gid >= gid_max) return; + + /** + * main + */ + + m11700s (s_sbob_sl64, w, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} diff --git a/nv/m11800_a0.cu b/nv/m11800_a0.cu new file mode 100644 index 0000000000..b0429072c6 --- /dev/null +++ b/nv/m11800_a0.cu @@ -0,0 +1,2674 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _GOST2012_512_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW2 +#define VECT_SIZE1 +#endif + +#define DGST_R0 0 +#define DGST_R1 1 +#define DGST_R2 2 +#define DGST_R3 3 + +#include "include/kernel_functions.c" +#include "types_nv.c" +#include "common_nv.c" +#include "include/rp_gpu.h" +#include "rp_nv.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +#define INITVAL 0 + +#define SBOG_LPSti64 \ + s_sbob_sl64[0][(t[0] >> (i * 8)) & 0xff] ^ \ + s_sbob_sl64[1][(t[1] >> (i * 8)) & 0xff] ^ \ + s_sbob_sl64[2][(t[2] >> (i * 8)) & 0xff] ^ \ + s_sbob_sl64[3][(t[3] >> (i * 8)) & 0xff] ^ \ + s_sbob_sl64[4][(t[4] >> (i * 8)) & 0xff] ^ \ + s_sbob_sl64[5][(t[5] >> (i * 8)) & 0xff] ^ \ + s_sbob_sl64[6][(t[6] >> (i * 8)) & 0xff] ^ \ + s_sbob_sl64[7][(t[7] >> (i * 8)) & 0xff] + +// constants + +__device__ const u64 sbob_sl64[8][256] = +{ + { + 0xd031c397ce553fe6, + 0x16ba5b01b006b525, + 0xa89bade6296e70c8, + 0x6a1f525d77d3435b, + 0x6e103570573dfa0b, + 0x660efb2a17fc95ab, + 0x76327a9e97634bf6, + 0x4bad9d6462458bf5, + 0xf1830caedbc3f748, + 0xc5c8f542669131ff, + 0x95044a1cdc48b0cb, + 0x892962df3cf8b866, + 0xb0b9e208e930c135, + 0xa14fb3f0611a767c, + 0x8d2605f21c160136, + 0xd6b71922fecc549e, + 0x37089438a5907d8b, + 0x0b5da38e5803d49c, + 0x5a5bcc9cea6f3cbc, + 0xedae246d3b73ffe5, + 0xd2b87e0fde22edce, + 0x5e54abb1ca8185ec, + 0x1de7f88fe80561b9, + 0xad5e1a870135a08c, + 0x2f2adbd665cecc76, + 0x5780b5a782f58358, + 0x3edc8a2eede47b3f, + 0xc9d95c3506bee70f, + 0x83be111d6c4e05ee, + 0xa603b90959367410, + 0x103c81b4809fde5d, + 0x2c69b6027d0c774a, + 0x399080d7d5c87953, + 0x09d41e16487406b4, + 0xcdd63b1826505e5f, + 0xf99dc2f49b0298e8, + 0x9cd0540a943cb67f, + 0xbca84b7f891f17c5, + 0x723d1db3b78df2a6, + 0x78aa6e71e73b4f2e, + 0x1433e699a071670d, + 0x84f21be454620782, + 0x98df3327b4d20f2f, + 0xf049dce2d3769e5c, + 0xdb6c60199656eb7a, + 0x648746b2078b4783, + 0x32cd23598dcbadcf, + 0x1ea4955bf0c7da85, + 0xe9a143401b9d46b5, + 0xfd92a5d9bbec21b8, + 0xc8138c790e0b8e1b, + 0x2ee00b9a6d7ba562, + 0xf85712b893b7f1fc, + 0xeb28fed80bea949d, + 0x564a65eb8a40ea4c, + 0x6c9988e8474a2823, + 0x4535898b121d8f2d, + 0xabd8c03231accbf4, + 0xba2e91cab9867cbd, + 0x7960be3def8e263a, + 0x0c11a977602fd6f0, + 0xcb50e1ad16c93527, + 0xeae22e94035ffd89, + 0x2866d12f5de2ce1a, + 0xff1b1841ab9bf390, + 0x9f9339de8cfe0d43, + 0x964727c8c48a0bf7, + 0x524502c6aaae531c, + 0x9b9c5ef3ac10b413, + 0x4fa2fa4942ab32a5, + 0x3f165a62e551122b, + 0xc74148da76e6e3d7, + 0x924840e5e464b2a7, + 0xd372ae43d69784da, + 0x233b72a105e11a86, + 0xa48a04914941a638, + 0xb4b68525c9de7865, + 0xddeabaaca6cf8002, + 0x0a9773c250b6bd88, + 0xc284ffbb5ebd3393, + 0x8ba0df472c8f6a4e, + 0x2aef6cb74d951c32, + 0x427983722a318d41, + 0x73f7cdffbf389bb2, + 0x074c0af9382c026c, + 0x8a6a0f0b243a035a, + 0x6fdae53c5f88931f, + 0xc68b98967e538ac3, + 0x44ff59c71aa8e639, + 0xe2fce0ce439e9229, + 0xa20cde2479d8cd40, + 0x19e89fa2c8ebd8e9, + 0xf446bbcff398270c, + 0x43b3533e2284e455, + 0xd82f0dcd8e945046, + 0x51066f12b26ce820, + 0xe73957af6bc5426d, + 0x081ece5a40c16fa0, + 0x3b193d4fc5bfab7b, + 0x7fe66488df174d42, + 0x0e9814ef705804d8, + 0x8137ac857c39d7c6, + 0xb1733244e185a821, + 0x695c3f896f11f867, + 0xf6cf0657e3eff524, + 0x1aabf276d02963d5, + 0x2da3664e75b91e5e, + 0x0289bd981077d228, + 0x90c1fd7df413608f, + 0x3c5537b6fd93a917, + 0xaa12107e3919a2e0, + 0x0686dab530996b78, + 0xdaa6b0559ee3826e, + 0xc34e2ff756085a87, + 0x6d5358a44fff4137, + 0xfc587595b35948ac, + 0x7ca5095cc7d5f67e, + 0xfb147f6c8b754ac0, + 0xbfeb26ab91ddacf9, + 0x6896efc567a49173, + 0xca9a31e11e7c5c33, + 0xbbe44186b13315a9, + 0x0ddb793b689abfe4, + 0x70b4a02ba7fa208e, + 0xe47a3a7b7307f951, + 0x8cecd5be14a36822, + 0xeeed49b923b144d9, + 0x17708b4db8b3dc31, + 0x6088219f2765fed3, + 0xb3fa8fdcf1f27a09, + 0x910b2d31fca6099b, + 0x0f52c4a378ed6dcc, + 0x50ccbf5ebad98134, + 0x6bd582117f662a4f, + 0x94ce9a50d4fdd9df, + 0x2b25bcfb45207526, + 0x67c42b661f49fcbf, + 0x492420fc723259dd, + 0x03436dd418c2bb3c, + 0x1f6e4517f872b391, + 0xa08563bc69af1f68, + 0xd43ea4baeebb86b6, + 0x01cad04c08b56914, + 0xac94cacb0980c998, + 0x54c3d8739a373864, + 0x26fec5c02dbacac2, + 0xdea9d778be0d3b3e, + 0x040f672d20eeb950, + 0xe5b0ea377bb29045, + 0xf30ab136cbb42560, + 0x62019c0737122cfb, + 0xe86b930c13282fa1, + 0xcc1ceb542ee5374b, + 0x538fd28aa21b3a08, + 0x1b61223ad89c0ac1, + 0x36c24474ad25149f, + 0x7a23d3e9f74c9d06, + 0xbe21f6e79968c5ed, + 0xcf5f868036278c77, + 0xf705d61beb5a9c30, + 0x4d2b47d152dce08d, + 0x5f9e7bfdc234ecf8, + 0x247778583dcd18ea, + 0x867ba67c4415d5aa, + 0x4ce1979d5a698999, + 0x0000000000000000, + 0xec64f42133c696f1, + 0xb57c5569c16b1171, + 0xc1c7926f467f88af, + 0x654d96fe0f3e2e97, + 0x15f936d5a8c40e19, + 0xb8a72c52a9f1ae95, + 0xa9517daa21db19dc, + 0x58d27104fa18ee94, + 0x5918a148f2ad8780, + 0x5cdd1629daf657c4, + 0x8274c15164fb6cfa, + 0xd1fb13dbc6e056f2, + 0x7d6fd910cf609f6a, + 0xb63f38bdd9a9aa4d, + 0x3d9fe7faf526c003, + 0x74bbc706871499de, + 0xdf630734b6b8522a, + 0x3ad3ed03cd0ac26f, + 0xfadeaf2083c023d4, + 0xc00d42234ecae1bb, + 0x8538cba85cd76e96, + 0xc402250e6e2458eb, + 0x47bc3413026a5d05, + 0xafd7a71f114272a4, + 0x978df784cc3f62e3, + 0xb96dfc1ea144c781, + 0x21b2cf391596c8ae, + 0x318e4e8d950916f3, + 0xce9556cc3e92e563, + 0x385a509bdd7d1047, + 0x358129a0b5e7afa3, + 0xe6f387e363702b79, + 0xe0755d5653e94001, + 0x7be903a5fff9f412, + 0x12b53c2c90e80c75, + 0x3307f315857ec4db, + 0x8fafb86a0c61d31e, + 0xd9e5dd8186213952, + 0x77f8aad29fd622e2, + 0x25bda814357871fe, + 0x7571174a8fa1f0ca, + 0x137fec60985d6561, + 0x30449ec19dbc7fe7, + 0xa540d4dd41f4cf2c, + 0xdc206ae0ae7ae916, + 0x5b911cd0e2da55a8, + 0xb2305f90f947131d, + 0x344bf9ecbd52c6b7, + 0x5d17c665d2433ed0, + 0x18224feec05eb1fd, + 0x9e59e992844b6457, + 0x9a568ebfa4a5dd07, + 0xa3c60e68716da454, + 0x7e2cb4c4d7a22456, + 0x87b176304ca0bcbe, + 0x413aeea632f3367d, + 0x9915e36bbc67663b, + 0x40f03eea3a465f69, + 0x1c2d28c3e0b008ad, + 0x4e682a054a1e5bb1, + 0x05c5b761285bd044, + 0xe1bf8d1a5b5c2915, + 0xf2c0617ac3014c74, + 0xb7f5e8f1d11cc359, + 0x63cb4c4b3fa745ef, + 0x9d1a84469c89df6b, + 0xe33630824b2bfb3d, + 0xd5f474f6e60eefa2, + 0xf58c6b83fb2d4e18, + 0x4676e45f0adf3411, + 0x20781f751d23a1ba, + 0xbd629b3381aa7ed1, + 0xae1d775319f71bb0, + 0xfed1c80da32e9a84, + 0x5509083f92825170, + 0x29ac01635557a70e, + 0xa7c9694551831d04, + 0x8e65682604d4ba0a, + 0x11f651f8882ab749, + 0xd77dc96ef6793d8a, + 0xef2799f52b042dcd, + 0x48eef0b07a8730c9, + 0x22f1a2ed0d547392, + 0x6142f1d32fd097c7, + 0x4a674d286af0e2e1, + 0x80fd7cc9748cbed2, + 0x717e7067af4f499a, + 0x938290a9ecd1dbb3, + 0x88e3b293344dd172, + 0x2734158c250fa3d6, + }, + { + 0x7e37e62dfc7d40c3, + 0x776f25a4ee939e5b, + 0xe045c850dd8fb5ad, + 0x86ed5ba711ff1952, + 0xe91d0bd9cf616b35, + 0x37e0ab256e408ffb, + 0x9607f6c031025a7a, + 0x0b02f5e116d23c9d, + 0xf3d8486bfb50650c, + 0x621cff27c40875f5, + 0x7d40cb71fa5fd34a, + 0x6daa6616daa29062, + 0x9f5f354923ec84e2, + 0xec847c3dc507c3b3, + 0x025a3668043ce205, + 0xa8bf9e6c4dac0b19, + 0xfa808be2e9bebb94, + 0xb5b99c5277c74fa3, + 0x78d9bc95f0397bcc, + 0xe332e50cdbad2624, + 0xc74fce129332797e, + 0x1729eceb2ea709ab, + 0xc2d6b9f69954d1f8, + 0x5d898cbfbab8551a, + 0x859a76fb17dd8adb, + 0x1be85886362f7fb5, + 0xf6413f8ff136cd8a, + 0xd3110fa5bbb7e35c, + 0x0a2feed514cc4d11, + 0xe83010edcd7f1ab9, + 0xa1e75de55f42d581, + 0xeede4a55c13b21b6, + 0xf2f5535ff94e1480, + 0x0cc1b46d1888761e, + 0xbce15fdb6529913b, + 0x2d25e8975a7181c2, + 0x71817f1ce2d7a554, + 0x2e52c5cb5c53124b, + 0xf9f7a6beef9c281d, + 0x9e722e7d21f2f56e, + 0xce170d9b81dca7e6, + 0x0e9b82051cb4941b, + 0x1e712f623c49d733, + 0x21e45cfa42f9f7dc, + 0xcb8e7a7f8bba0f60, + 0x8e98831a010fb646, + 0x474ccf0d8e895b23, + 0xa99285584fb27a95, + 0x8cc2b57205335443, + 0x42d5b8e984eff3a5, + 0x012d1b34021e718c, + 0x57a6626aae74180b, + 0xff19fc06e3d81312, + 0x35ba9d4d6a7c6dfe, + 0xc9d44c178f86ed65, + 0x506523e6a02e5288, + 0x03772d5c06229389, + 0x8b01f4fe0b691ec0, + 0xf8dabd8aed825991, + 0x4c4e3aec985b67be, + 0xb10df0827fbf96a9, + 0x6a69279ad4f8dae1, + 0xe78689dcd3d5ff2e, + 0x812e1a2b1fa553d1, + 0xfbad90d6eba0ca18, + 0x1ac543b234310e39, + 0x1604f7df2cb97827, + 0xa6241c6951189f02, + 0x753513cceaaf7c5e, + 0x64f2a59fc84c4efa, + 0x247d2b1e489f5f5a, + 0xdb64d718ab474c48, + 0x79f4a7a1f2270a40, + 0x1573da832a9bebae, + 0x3497867968621c72, + 0x514838d2a2302304, + 0xf0af6537fd72f685, + 0x1d06023e3a6b44ba, + 0x678588c3ce6edd73, + 0x66a893f7cc70acff, + 0xd4d24e29b5eda9df, + 0x3856321470ea6a6c, + 0x07c3418c0e5a4a83, + 0x2bcbb22f5635bacd, + 0x04b46cd00878d90a, + 0x06ee5ab80c443b0f, + 0x3b211f4876c8f9e5, + 0x0958c38912eede98, + 0xd14b39cdbf8b0159, + 0x397b292072f41be0, + 0x87c0409313e168de, + 0xad26e98847caa39f, + 0x4e140c849c6785bb, + 0xd5ff551db7f3d853, + 0xa0ca46d15d5ca40d, + 0xcd6020c787fe346f, + 0x84b76dcf15c3fb57, + 0xdefda0fca121e4ce, + 0x4b8d7b6096012d3d, + 0x9ac642ad298a2c64, + 0x0875d8bd10f0af14, + 0xb357c6ea7b8374ac, + 0x4d6321d89a451632, + 0xeda96709c719b23f, + 0xf76c24bbf328bc06, + 0xc662d526912c08f2, + 0x3ce25ec47892b366, + 0xb978283f6f4f39bd, + 0xc08c8f9e9d6833fd, + 0x4f3917b09e79f437, + 0x593de06fb2c08c10, + 0xd6887841b1d14bda, + 0x19b26eee32139db0, + 0xb494876675d93e2f, + 0x825937771987c058, + 0x90e9ac783d466175, + 0xf1827e03ff6c8709, + 0x945dc0a8353eb87f, + 0x4516f9658ab5b926, + 0x3f9573987eb020ef, + 0xb855330b6d514831, + 0x2ae6a91b542bcb41, + 0x6331e413c6160479, + 0x408f8e8180d311a0, + 0xeff35161c325503a, + 0xd06622f9bd9570d5, + 0x8876d9a20d4b8d49, + 0xa5533135573a0c8b, + 0xe168d364df91c421, + 0xf41b09e7f50a2f8f, + 0x12b09b0f24c1a12d, + 0xda49cc2ca9593dc4, + 0x1f5c34563e57a6bf, + 0x54d14f36a8568b82, + 0xaf7cdfe043f6419a, + 0xea6a2685c943f8bc, + 0xe5dcbfb4d7e91d2b, + 0xb27addde799d0520, + 0x6b443caed6e6ab6d, + 0x7bae91c9f61be845, + 0x3eb868ac7cae5163, + 0x11c7b65322e332a4, + 0xd23c1491b9a992d0, + 0x8fb5982e0311c7ca, + 0x70ac6428e0c9d4d8, + 0x895bc2960f55fcc5, + 0x76423e90ec8defd7, + 0x6ff0507ede9e7267, + 0x3dcf45f07a8cc2ea, + 0x4aa06054941f5cb1, + 0x5810fb5bb0defd9c, + 0x5efea1e3bc9ac693, + 0x6edd4b4adc8003eb, + 0x741808f8e8b10dd2, + 0x145ec1b728859a22, + 0x28bc9f7350172944, + 0x270a06424ebdccd3, + 0x972aedf4331c2bf6, + 0x059977e40a66a886, + 0x2550302a4a812ed6, + 0xdd8a8da0a7037747, + 0xc515f87a970e9b7b, + 0x3023eaa9601ac578, + 0xb7e3aa3a73fbada6, + 0x0fb699311eaae597, + 0x0000000000000000, + 0x310ef19d6204b4f4, + 0x229371a644db6455, + 0x0decaf591a960792, + 0x5ca4978bb8a62496, + 0x1c2b190a38753536, + 0x41a295b582cd602c, + 0x3279dcc16426277d, + 0xc1a194aa9f764271, + 0x139d803b26dfd0a1, + 0xae51c4d441e83016, + 0xd813fa44ad65dfc1, + 0xac0bf2bc45d4d213, + 0x23be6a9246c515d9, + 0x49d74d08923dcf38, + 0x9d05032127d066e7, + 0x2f7fdeff5e4d63c7, + 0xa47e2a0155247d07, + 0x99b16ff12fa8bfed, + 0x4661d4398c972aaf, + 0xdfd0bbc8a33f9542, + 0xdca79694a51d06cb, + 0xb020ebb67da1e725, + 0xba0f0563696daa34, + 0xe4f1a480d5f76ca7, + 0xc438e34e9510eaf7, + 0x939e81243b64f2fc, + 0x8defae46072d25cf, + 0x2c08f3a3586ff04e, + 0xd7a56375b3cf3a56, + 0x20c947ce40e78650, + 0x43f8a3dd86f18229, + 0x568b795eac6a6987, + 0x8003011f1dbb225d, + 0xf53612d3f7145e03, + 0x189f75da300dec3c, + 0x9570db9c3720c9f3, + 0xbb221e576b73dbb8, + 0x72f65240e4f536dd, + 0x443be25188abc8aa, + 0xe21ffe38d9b357a8, + 0xfd43ca6ee7e4f117, + 0xcaa3614b89a47eec, + 0xfe34e732e1c6629e, + 0x83742c431b99b1d4, + 0xcf3a16af83c2d66a, + 0xaae5a8044990e91c, + 0x26271d764ca3bd5f, + 0x91c4b74c3f5810f9, + 0x7c6dd045f841a2c6, + 0x7f1afd19fe63314f, + 0xc8f957238d989ce9, + 0xa709075d5306ee8e, + 0x55fc5402aa48fa0e, + 0x48fa563c9023beb4, + 0x65dfbeabca523f76, + 0x6c877d22d8bce1ee, + 0xcc4d3bf385e045e3, + 0xbebb69b36115733e, + 0x10eaad6720fd4328, + 0xb6ceb10e71e5dc2a, + 0xbdcc44ef6737e0b7, + 0x523f158ea412b08d, + 0x989c74c52db6ce61, + 0x9beb59992b945de8, + 0x8a2cefca09776f4c, + 0xa3bd6b8d5b7e3784, + 0xeb473db1cb5d8930, + 0xc3fba2c29b4aa074, + 0x9c28181525ce176b, + 0x683311f2d0c438e4, + 0x5fd3bad7be84b71f, + 0xfc6ed15ae5fa809b, + 0x36cdb0116c5efe77, + 0x29918447520958c8, + 0xa29070b959604608, + 0x53120ebaa60cc101, + 0x3a0c047c74d68869, + 0x691e0ac6d2da4968, + 0x73db4974e6eb4751, + 0x7a838afdf40599c9, + 0x5a4acd33b4e21f99, + 0x6046c94fc03497f0, + 0xe6ab92e8d1cb8ea2, + 0x3354c7f5663856f1, + 0xd93ee170af7bae4d, + 0x616bd27bc22ae67c, + 0x92b39a10397a8370, + 0xabc8b3304b8e9890, + 0xbf967287630b02b2, + 0x5b67d607b6fc6e15, + }, + { + 0x8ab0a96846e06a6d, + 0x43c7e80b4bf0b33a, + 0x08c9b3546b161ee5, + 0x39f1c235eba990be, + 0xc1bef2376606c7b2, + 0x2c209233614569aa, + 0xeb01523b6fc3289a, + 0x946953ab935acedd, + 0x272838f63e13340e, + 0x8b0455eca12ba052, + 0x77a1b2c4978ff8a2, + 0xa55122ca13e54086, + 0x2276135862d3f1cd, + 0xdb8ddfde08b76cfe, + 0x5d1e12c89e4a178a, + 0x0e56816b03969867, + 0xee5f79953303ed59, + 0xafed748bab78d71d, + 0x6d929f2df93e53ee, + 0xf5d8a8f8ba798c2a, + 0xf619b1698e39cf6b, + 0x95ddaf2f749104e2, + 0xec2a9c80e0886427, + 0xce5c8fd8825b95ea, + 0xc4e0d9993ac60271, + 0x4699c3a5173076f9, + 0x3d1b151f50a29f42, + 0x9ed505ea2bc75946, + 0x34665acfdc7f4b98, + 0x61b1fb53292342f7, + 0xc721c0080e864130, + 0x8693cd1696fd7b74, + 0x872731927136b14b, + 0xd3446c8a63a1721b, + 0x669a35e8a6680e4a, + 0xcab658f239509a16, + 0xa4e5de4ef42e8ab9, + 0x37a7435ee83f08d9, + 0x134e6239e26c7f96, + 0x82791a3c2df67488, + 0x3f6ef00a8329163c, + 0x8e5a7e42fdeb6591, + 0x5caaee4c7981ddb5, + 0x19f234785af1e80d, + 0x255ddde3ed98bd70, + 0x50898a32a99cccac, + 0x28ca4519da4e6656, + 0xae59880f4cb31d22, + 0x0d9798fa37d6db26, + 0x32f968f0b4ffcd1a, + 0xa00f09644f258545, + 0xfa3ad5175e24de72, + 0xf46c547c5db24615, + 0x713e80fbff0f7e20, + 0x7843cf2b73d2aafa, + 0xbd17ea36aedf62b4, + 0xfd111bacd16f92cf, + 0x4abaa7dbc72d67e0, + 0xb3416b5dad49fad3, + 0xbca316b24914a88b, + 0x15d150068aecf914, + 0xe27c1debe31efc40, + 0x4fe48c759beda223, + 0x7edcfd141b522c78, + 0x4e5070f17c26681c, + 0xe696cac15815f3bc, + 0x35d2a64b3bb481a7, + 0x800cff29fe7dfdf6, + 0x1ed9fac3d5baa4b0, + 0x6c2663a91ef599d1, + 0x03c1199134404341, + 0xf7ad4ded69f20554, + 0xcd9d9649b61bd6ab, + 0xc8c3bde7eadb1368, + 0xd131899fb02afb65, + 0x1d18e352e1fae7f1, + 0xda39235aef7ca6c1, + 0xa1bbf5e0a8ee4f7a, + 0x91377805cf9a0b1e, + 0x3138716180bf8e5b, + 0xd9f83acbdb3ce580, + 0x0275e515d38b897e, + 0x472d3f21f0fbbcc6, + 0x2d946eb7868ea395, + 0xba3c248d21942e09, + 0xe7223645bfde3983, + 0xff64feb902e41bb1, + 0xc97741630d10d957, + 0xc3cb1722b58d4ecc, + 0xa27aec719cae0c3b, + 0x99fecb51a48c15fb, + 0x1465ac826d27332b, + 0xe1bd047ad75ebf01, + 0x79f733af941960c5, + 0x672ec96c41a3c475, + 0xc27feba6524684f3, + 0x64efd0fd75e38734, + 0xed9e60040743ae18, + 0xfb8e2993b9ef144d, + 0x38453eb10c625a81, + 0x6978480742355c12, + 0x48cf42ce14a6ee9e, + 0x1cac1fd606312dce, + 0x7b82d6ba4792e9bb, + 0x9d141c7b1f871a07, + 0x5616b80dc11c4a2e, + 0xb849c198f21fa777, + 0x7ca91801c8d9a506, + 0xb1348e487ec273ad, + 0x41b20d1e987b3a44, + 0x7460ab55a3cfbbe3, + 0x84e628034576f20a, + 0x1b87d16d897a6173, + 0x0fe27defe45d5258, + 0x83cde6b8ca3dbeb7, + 0x0c23647ed01d1119, + 0x7a362a3ea0592384, + 0xb61f40f3f1893f10, + 0x75d457d1440471dc, + 0x4558da34237035b8, + 0xdca6116587fc2043, + 0x8d9b67d3c9ab26d0, + 0x2b0b5c88ee0e2517, + 0x6fe77a382ab5da90, + 0x269cc472d9d8fe31, + 0x63c41e46faa8cb89, + 0xb7abbc771642f52f, + 0x7d1de4852f126f39, + 0xa8c6ba3024339ba0, + 0x600507d7cee888c8, + 0x8fee82c61a20afae, + 0x57a2448926d78011, + 0xfca5e72836a458f0, + 0x072bcebb8f4b4cbd, + 0x497bbe4af36d24a1, + 0x3cafe99bb769557d, + 0x12fa9ebd05a7b5a9, + 0xe8c04baa5b836bdb, + 0x4273148fac3b7905, + 0x908384812851c121, + 0xe557d3506c55b0fd, + 0x72ff996acb4f3d61, + 0x3eda0c8e64e2dc03, + 0xf0868356e6b949e9, + 0x04ead72abb0b0ffc, + 0x17a4b5135967706a, + 0xe3c8e16f04d5367f, + 0xf84f30028daf570c, + 0x1846c8fcbd3a2232, + 0x5b8120f7f6ca9108, + 0xd46fa231ecea3ea6, + 0x334d947453340725, + 0x58403966c28ad249, + 0xbed6f3a79a9f21f5, + 0x68ccb483a5fe962d, + 0xd085751b57e1315a, + 0xfed0023de52fd18e, + 0x4b0e5b5f20e6addf, + 0x1a332de96eb1ab4c, + 0xa3ce10f57b65c604, + 0x108f7ba8d62c3cd7, + 0xab07a3a11073d8e1, + 0x6b0dad1291bed56c, + 0xf2f366433532c097, + 0x2e557726b2cee0d4, + 0x0000000000000000, + 0xcb02a476de9b5029, + 0xe4e32fd48b9e7ac2, + 0x734b65ee2c84f75e, + 0x6e5386bccd7e10af, + 0x01b4fc84e7cbca3f, + 0xcfe8735c65905fd5, + 0x3613bfda0ff4c2e6, + 0x113b872c31e7f6e8, + 0x2fe18ba255052aeb, + 0xe974b72ebc48a1e4, + 0x0abc5641b89d979b, + 0xb46aa5e62202b66e, + 0x44ec26b0c4bbff87, + 0xa6903b5b27a503c7, + 0x7f680190fc99e647, + 0x97a84a3aa71a8d9c, + 0xdd12ede16037ea7c, + 0xc554251ddd0dc84e, + 0x88c54c7d956be313, + 0x4d91696048662b5d, + 0xb08072cc9909b992, + 0xb5de5962c5c97c51, + 0x81b803ad19b637c9, + 0xb2f597d94a8230ec, + 0x0b08aac55f565da4, + 0xf1327fd2017283d6, + 0xad98919e78f35e63, + 0x6ab9519676751f53, + 0x24e921670a53774f, + 0xb9fd3d1c15d46d48, + 0x92f66194fbda485f, + 0x5a35dc7311015b37, + 0xded3f4705477a93d, + 0xc00a0eb381cd0d8d, + 0xbb88d809c65fe436, + 0x16104997beacba55, + 0x21b70ac95693b28c, + 0x59f4c5e225411876, + 0xd5db5eb50b21f499, + 0x55d7a19cf55c096f, + 0xa97246b4c3f8519f, + 0x8552d487a2bd3835, + 0x54635d181297c350, + 0x23c2efdc85183bf2, + 0x9f61f96ecc0c9379, + 0x534893a39ddc8fed, + 0x5edf0b59aa0a54cb, + 0xac2c6d1a9f38945c, + 0xd7aebba0d8aa7de7, + 0x2abfa00c09c5ef28, + 0xd84cc64f3cf72fbf, + 0x2003f64db15878b3, + 0xa724c7dfc06ec9f8, + 0x069f323f68808682, + 0xcc296acd51d01c94, + 0x055e2bae5cc0c5c3, + 0x6270e2c21d6301b6, + 0x3b842720382219c0, + 0xd2f0900e846ab824, + 0x52fc6f277a1745d2, + 0xc6953c8ce94d8b0f, + 0xe009f8fe3095753e, + 0x655b2c7992284d0b, + 0x984a37d54347dfc4, + 0xeab5aebf8808e2a5, + 0x9a3fd2c090cc56ba, + 0x9ca0e0fff84cd038, + 0x4c2595e4afade162, + 0xdf6708f4b3bc6302, + 0xbf620f237d54ebca, + 0x93429d101c118260, + 0x097d4fd08cddd4da, + 0x8c2f9b572e60ecef, + 0x708a7c7f18c4b41f, + 0x3a30dba4dfe9d3ff, + 0x4006f19a7fb0f07b, + 0x5f6bf7dd4dc19ef4, + 0x1f6d064732716e8f, + 0xf9fbcc866a649d33, + 0x308c8de567744464, + 0x8971b0f972a0292c, + 0xd61a47243f61b7d8, + 0xefeb8511d4c82766, + 0x961cb6be40d147a3, + 0xaab35f25f7b812de, + 0x76154e407044329d, + 0x513d76b64e570693, + 0xf3479ac7d2f90aa8, + 0x9b8b2e4477079c85, + 0x297eb99d3d85ac69, + }, + { + 0x3ef29d249b2c0a19, + 0xe9e16322b6f8622f, + 0x5536994047757f7a, + 0x9f4d56d5a47b0b33, + 0x822567466aa1174c, + 0xb8f5057deb082fb2, + 0xcc48c10bf4475f53, + 0x373088d4275dec3a, + 0x968f4325180aed10, + 0x173d232cf7016151, + 0xae4ed09f946fcc13, + 0xfd4b4741c4539873, + 0x1b5b3f0dd9933765, + 0x2ffcb0967b644052, + 0xe02376d20a89840c, + 0xa3ae3a70329b18d7, + 0x419cbd2335de8526, + 0xfafebf115b7c3199, + 0x0397074f85aa9b0d, + 0xc58ad4fb4836b970, + 0xbec60be3fc4104a8, + 0x1eff36dc4b708772, + 0x131fdc33ed8453b6, + 0x0844e33e341764d3, + 0x0ff11b6eab38cd39, + 0x64351f0a7761b85a, + 0x3b5694f509cfba0e, + 0x30857084b87245d0, + 0x47afb3bd2297ae3c, + 0xf2ba5c2f6f6b554a, + 0x74bdc4761f4f70e1, + 0xcfdfc64471edc45e, + 0xe610784c1dc0af16, + 0x7aca29d63c113f28, + 0x2ded411776a859af, + 0xac5f211e99a3d5ee, + 0xd484f949a87ef33b, + 0x3ce36ca596e013e4, + 0xd120f0983a9d432c, + 0x6bc40464dc597563, + 0x69d5f5e5d1956c9e, + 0x9ae95f043698bb24, + 0xc9ecc8da66a4ef44, + 0xd69508c8a5b2eac6, + 0xc40c2235c0503b80, + 0x38c193ba8c652103, + 0x1ceec75d46bc9e8f, + 0xd331011937515ad1, + 0xd8e2e56886eca50f, + 0xb137108d5779c991, + 0x709f3b6905ca4206, + 0x4feb50831680caef, + 0xec456af3241bd238, + 0x58d673afe181abbe, + 0x242f54e7cad9bf8c, + 0x0211f1810dcc19fd, + 0x90bc4dbb0f43c60a, + 0x9518446a9da0761d, + 0xa1bfcbf13f57012a, + 0x2bde4f8961e172b5, + 0x27b853a84f732481, + 0xb0b1e643df1f4b61, + 0x18cc38425c39ac68, + 0xd2b7f7d7bf37d821, + 0x3103864a3014c720, + 0x14aa246372abfa5c, + 0x6e600db54ebac574, + 0x394765740403a3f3, + 0x09c215f0bc71e623, + 0x2a58b947e987f045, + 0x7b4cdf18b477bdd8, + 0x9709b5eb906c6fe0, + 0x73083c268060d90b, + 0xfedc400e41f9037e, + 0x284948c6e44be9b8, + 0x728ecae808065bfb, + 0x06330e9e17492b1a, + 0x5950856169e7294e, + 0xbae4f4fce6c4364f, + 0xca7bcf95e30e7449, + 0x7d7fd186a33e96c2, + 0x52836110d85ad690, + 0x4dfaa1021b4cd312, + 0x913abb75872544fa, + 0xdd46ecb9140f1518, + 0x3d659a6b1e869114, + 0xc23f2cabd719109a, + 0xd713fe062dd46836, + 0xd0a60656b2fbc1dc, + 0x221c5a79dd909496, + 0xefd26dbca1b14935, + 0x0e77eda0235e4fc9, + 0xcbfd395b6b68f6b9, + 0x0de0eaefa6f4d4c4, + 0x0422ff1f1a8532e7, + 0xf969b85eded6aa94, + 0x7f6e2007aef28f3f, + 0x3ad0623b81a938fe, + 0x6624ee8b7aada1a7, + 0xb682e8ddc856607b, + 0xa78cc56f281e2a30, + 0xc79b257a45faa08d, + 0x5b4174e0642b30b3, + 0x5f638bff7eae0254, + 0x4bc9af9c0c05f808, + 0xce59308af98b46ae, + 0x8fc58da9cc55c388, + 0x803496c7676d0eb1, + 0xf33caae1e70dd7ba, + 0xbb6202326ea2b4bf, + 0xd5020f87201871cb, + 0x9d5ca754a9b712ce, + 0x841669d87de83c56, + 0x8a6184785eb6739f, + 0x420bba6cb0741e2b, + 0xf12d5b60eac1ce47, + 0x76ac35f71283691c, + 0x2c6bb7d9fecedb5f, + 0xfccdb18f4c351a83, + 0x1f79c012c3160582, + 0xf0abadae62a74cb7, + 0xe1a5801c82ef06fc, + 0x67a21845f2cb2357, + 0x5114665f5df04d9d, + 0xbf40fd2d74278658, + 0xa0393d3fb73183da, + 0x05a409d192e3b017, + 0xa9fb28cf0b4065f9, + 0x25a9a22942bf3d7c, + 0xdb75e22703463e02, + 0xb326e10c5ab5d06c, + 0xe7968e8295a62de6, + 0xb973f3b3636ead42, + 0xdf571d3819c30ce5, + 0xee549b7229d7cbc5, + 0x12992afd65e2d146, + 0xf8ef4e9056b02864, + 0xb7041e134030e28b, + 0xc02edd2adad50967, + 0x932b4af48ae95d07, + 0x6fe6fb7bc6dc4784, + 0x239aacb755f61666, + 0x401a4bedbdb807d6, + 0x485ea8d389af6305, + 0xa41bc220adb4b13d, + 0x753b32b89729f211, + 0x997e584bb3322029, + 0x1d683193ceda1c7f, + 0xff5ab6c0c99f818e, + 0x16bbd5e27f67e3a1, + 0xa59d34ee25d233cd, + 0x98f8ae853b54a2d9, + 0x6df70afacb105e79, + 0x795d2e99b9bba425, + 0x8e437b6744334178, + 0x0186f6ce886682f0, + 0xebf092a3bb347bd2, + 0xbcd7fa62f18d1d55, + 0xadd9d7d011c5571e, + 0x0bd3e471b1bdffde, + 0xaa6c2f808eeafef4, + 0x5ee57d31f6c880a4, + 0xf50fa47ff044fca0, + 0x1addc9c351f5b595, + 0xea76646d3352f922, + 0x0000000000000000, + 0x85909f16f58ebea6, + 0x46294573aaf12ccc, + 0x0a5512bf39db7d2e, + 0x78dbd85731dd26d5, + 0x29cfbe086c2d6b48, + 0x218b5d36583a0f9b, + 0x152cd2adfacd78ac, + 0x83a39188e2c795bc, + 0xc3b9da655f7f926a, + 0x9ecba01b2c1d89c3, + 0x07b5f8509f2fa9ea, + 0x7ee8d6c926940dcf, + 0x36b67e1aaf3b6eca, + 0x86079859702425ab, + 0xfb7849dfd31ab369, + 0x4c7c57cc932a51e2, + 0xd96413a60e8a27ff, + 0x263ea566c715a671, + 0x6c71fc344376dc89, + 0x4a4f595284637af8, + 0xdaf314e98b20bcf2, + 0x572768c14ab96687, + 0x1088db7c682ec8bb, + 0x887075f9537a6a62, + 0x2e7a4658f302c2a2, + 0x619116dbe582084d, + 0xa87dde018326e709, + 0xdcc01a779c6997e8, + 0xedc39c3dac7d50c8, + 0xa60a33a1a078a8c0, + 0xc1a82be452b38b97, + 0x3f746bea134a88e9, + 0xa228ccbebafd9a27, + 0xabead94e068c7c04, + 0xf48952b178227e50, + 0x5cf48cb0fb049959, + 0x6017e0156de48abd, + 0x4438b4f2a73d3531, + 0x8c528ae649ff5885, + 0xb515ef924dfcfb76, + 0x0c661c212e925634, + 0xb493195cc59a7986, + 0x9cda519a21d1903e, + 0x32948105b5be5c2d, + 0x194ace8cd45f2e98, + 0x438d4ca238129cdb, + 0x9b6fa9cabefe39d4, + 0x81b26009ef0b8c41, + 0xded1ebf691a58e15, + 0x4e6da64d9ee6481f, + 0x54b06f8ecf13fd8a, + 0x49d85e1d01c9e1f5, + 0xafc826511c094ee3, + 0xf698a33075ee67ad, + 0x5ac7822eec4db243, + 0x8dd47c28c199da75, + 0x89f68337db1ce892, + 0xcdce37c57c21dda3, + 0x530597de503c5460, + 0x6a42f2aa543ff793, + 0x5d727a7e73621ba9, + 0xe232875307459df1, + 0x56a19e0fc2dfe477, + 0xc61dd3b4cd9c227d, + 0xe5877f03986a341b, + 0x949eb2a415c6f4ed, + 0x6206119460289340, + 0x6380e75ae84e11b0, + 0x8be772b6d6d0f16f, + 0x50929091d596cf6d, + 0xe86795ec3e9ee0df, + 0x7cf927482b581432, + 0xc86a3e14eec26db4, + 0x7119cda78dacc0f6, + 0xe40189cd100cb6eb, + 0x92adbc3a028fdff7, + 0xb2a017c2d2d3529c, + 0x200dabf8d05c8d6b, + 0x34a78f9ba2f77737, + 0xe3b4719d8f231f01, + 0x45be423c2f5bb7c1, + 0xf71e55fefd88e55d, + 0x6853032b59f3ee6e, + 0x65b3e9c4ff073aaa, + 0x772ac3399ae5ebec, + 0x87816e97f842a75b, + 0x110e2db2e0484a4b, + 0x331277cb3dd8dedd, + 0xbd510cac79eb9fa5, + 0x352179552a91f5c7, + }, + { + 0x05ba7bc82c9b3220, + 0x31a54665f8b65e4f, + 0xb1b651f77547f4d4, + 0x8bfa0d857ba46682, + 0x85a96c5aa16a98bb, + 0x990faef908eb79c9, + 0xa15e37a247f4a62d, + 0x76857dcd5d27741e, + 0xf8c50b800a1820bc, + 0xbe65dcb201f7a2b4, + 0x666d1b986f9426e7, + 0x4cc921bf53c4e648, + 0x95410a0f93d9ca42, + 0x20cdccaa647ba4ef, + 0x429a4060890a1871, + 0x0c4ea4f69b32b38b, + 0xccda362dde354cd3, + 0x96dc23bc7c5b2fa9, + 0xc309bb68aa851ab3, + 0xd26131a73648e013, + 0x021dc52941fc4db2, + 0xcd5adab7704be48a, + 0xa77965d984ed71e6, + 0x32386fd61734bba4, + 0xe82d6dd538ab7245, + 0x5c2147ea6177b4b1, + 0x5da1ab70cf091ce8, + 0xac907fce72b8bdff, + 0x57c85dfd972278a8, + 0xa4e44c6a6b6f940d, + 0x3851995b4f1fdfe4, + 0x62578ccaed71bc9e, + 0xd9882bb0c01d2c0a, + 0x917b9d5d113c503b, + 0xa2c31e11a87643c6, + 0xe463c923a399c1ce, + 0xf71686c57ea876dc, + 0x87b4a973e096d509, + 0xaf0d567d9d3a5814, + 0xb40c2a3f59dcc6f4, + 0x3602f88495d121dd, + 0xd3e1dd3d9836484a, + 0xf945e71aa46688e5, + 0x7518547eb2a591f5, + 0x9366587450c01d89, + 0x9ea81018658c065b, + 0x4f54080cbc4603a3, + 0x2d0384c65137bf3d, + 0xdc325078ec861e2a, + 0xea30a8fc79573ff7, + 0x214d2030ca050cb6, + 0x65f0322b8016c30c, + 0x69be96dd1b247087, + 0xdb95ee9981e161b8, + 0xd1fc1814d9ca05f8, + 0x820ed2bbcc0de729, + 0x63d76050430f14c7, + 0x3bccb0e8a09d3a0f, + 0x8e40764d573f54a2, + 0x39d175c1e16177bd, + 0x12f5a37c734f1f4b, + 0xab37c12f1fdfc26d, + 0x5648b167395cd0f1, + 0x6c04ed1537bf42a7, + 0xed97161d14304065, + 0x7d6c67daab72b807, + 0xec17fa87ba4ee83c, + 0xdfaf79cb0304fbc1, + 0x733f060571bc463e, + 0x78d61c1287e98a27, + 0xd07cf48e77b4ada1, + 0xb9c262536c90dd26, + 0xe2449b5860801605, + 0x8fc09ad7f941fcfb, + 0xfad8cea94be46d0e, + 0xa343f28b0608eb9f, + 0x9b126bd04917347b, + 0x9a92874ae7699c22, + 0x1b017c42c4e69ee0, + 0x3a4c5c720ee39256, + 0x4b6e9f5e3ea399da, + 0x6ba353f45ad83d35, + 0xe7fee0904c1b2425, + 0x22d009832587e95d, + 0x842980c00f1430e2, + 0xc6b3c0a0861e2893, + 0x087433a419d729f2, + 0x341f3dadd42d6c6f, + 0xee0a3faefbb2a58e, + 0x4aee73c490dd3183, + 0xaab72db5b1a16a34, + 0xa92a04065e238fdf, + 0x7b4b35a1686b6fcc, + 0x6a23bf6ef4a6956c, + 0x191cb96b851ad352, + 0x55d598d4d6de351a, + 0xc9604de5f2ae7ef3, + 0x1ca6c2a3a981e172, + 0xde2f9551ad7a5398, + 0x3025aaff56c8f616, + 0x15521d9d1e2860d9, + 0x506fe31cfa45073a, + 0x189c55f12b647b0b, + 0x0180ec9aae7ea859, + 0x7cec8b40050c105e, + 0x2350e5198bf94104, + 0xef8ad33455cc0dd7, + 0x07a7bee16d677f92, + 0xe5e325b90de76997, + 0x5a061591a26e637a, + 0xb611ef1618208b46, + 0x09f4df3eb7a981ab, + 0x1ebb078ae87dacc0, + 0xb791038cb65e231f, + 0x0fd38d4574b05660, + 0x67edf702c1ea8ebe, + 0xba5f4be0831238cd, + 0xe3c477c2cefebe5c, + 0x0dce486c354c1bd2, + 0x8c5db36416c31910, + 0x26ea9ed1a7627324, + 0x039d29b3ef82e5eb, + 0x9f28fc82cbf2ae02, + 0xa8aae89cf05d2786, + 0x431aacfa2774b028, + 0xcf471f9e31b7a938, + 0x581bd0b8e3922ec8, + 0xbc78199b400bef06, + 0x90fb71c7bf42f862, + 0x1f3beb1046030499, + 0x683e7a47b55ad8de, + 0x988f4263a695d190, + 0xd808c72a6e638453, + 0x0627527bc319d7cb, + 0xebb04466d72997ae, + 0xe67e0c0ae2658c7c, + 0x14d2f107b056c880, + 0x7122c32c30400b8c, + 0x8a7ae11fd5dacedb, + 0xa0dedb38e98a0e74, + 0xad109354dcc615a6, + 0x0be91a17f655cc19, + 0x8ddd5ffeb8bdb149, + 0xbfe53028af890aed, + 0xd65ba6f5b4ad7a6a, + 0x7956f0882997227e, + 0x10e8665532b352f9, + 0x0e5361dfdacefe39, + 0xcec7f3049fc90161, + 0xff62b561677f5f2e, + 0x975ccf26d22587f0, + 0x51ef0f86543baf63, + 0x2f1e41ef10cbf28f, + 0x52722635bbb94a88, + 0xae8dbae73344f04d, + 0x410769d36688fd9a, + 0xb3ab94de34bbb966, + 0x801317928df1aa9b, + 0xa564a0f0c5113c54, + 0xf131d4bebdb1a117, + 0x7f71a2f3ea8ef5b5, + 0x40878549c8f655c3, + 0x7ef14e6944f05dec, + 0xd44663dcf55137d8, + 0xf2acfd0d523344fc, + 0x0000000000000000, + 0x5fbc6e598ef5515a, + 0x16cf342ef1aa8532, + 0xb036bd6ddb395c8d, + 0x13754fe6dd31b712, + 0xbbdfa77a2d6c9094, + 0x89e7c8ac3a582b30, + 0x3c6b0e09cdfa459d, + 0xc4ae0589c7e26521, + 0x49735a777f5fd468, + 0xcafd64561d2c9b18, + 0xda1502032f9fc9e1, + 0x8867243694268369, + 0x3782141e3baf8984, + 0x9cb5d53124704be9, + 0xd7db4a6f1ad3d233, + 0xa6f989432a93d9bf, + 0x9d3539ab8a0ee3b0, + 0x53f2caaf15c7e2d1, + 0x6e19283c76430f15, + 0x3debe2936384edc4, + 0x5e3c82c3208bf903, + 0x33b8834cb94a13fd, + 0x6470deb12e686b55, + 0x359fd1377a53c436, + 0x61caa57902f35975, + 0x043a975282e59a79, + 0xfd7f70482683129c, + 0xc52ee913699ccd78, + 0x28b9ff0e7dac8d1d, + 0x5455744e78a09d43, + 0xcb7d88ccb3523341, + 0x44bd121b4a13cfba, + 0x4d49cd25fdba4e11, + 0x3e76cb208c06082f, + 0x3ff627ba2278a076, + 0xc28957f204fbb2ea, + 0x453dfe81e46d67e3, + 0x94c1e6953da7621b, + 0x2c83685cff491764, + 0xf32c1197fc4deca5, + 0x2b24d6bd922e68f6, + 0xb22b78449ac5113f, + 0x48f3b6edd1217c31, + 0x2e9ead75beb55ad6, + 0x174fd8b45fd42d6b, + 0x4ed4e4961238abfa, + 0x92e6b4eefebeb5d0, + 0x46a0d7320bef8208, + 0x47203ba8a5912a51, + 0x24f75bf8e69e3e96, + 0xf0b1382413cf094e, + 0xfee259fbc901f777, + 0x276a724b091cdb7d, + 0xbdf8f501ee75475f, + 0x599b3c224dec8691, + 0x6d84018f99c1eafe, + 0x7498b8e41cdb39ac, + 0xe0595e71217c5bb7, + 0x2aa43a273c50c0af, + 0xf50b43ec3f543b6e, + 0x838e3e2162734f70, + 0xc09492db4507ff58, + 0x72bfea9fdfc2ee67, + 0x11688acf9ccdfaa0, + 0x1a8190d86a9836b9, + 0x7acbd93bc615c795, + 0xc7332c3a286080ca, + 0x863445e94ee87d50, + 0xf6966a5fd0d6de85, + 0xe9ad814f96d5da1c, + 0x70a22fb69e3ea3d5, + 0x0a69f68d582b6440, + 0xb8428ec9c2ee757f, + 0x604a49e3ac8df12c, + 0x5b86f90b0c10cb23, + 0xe1d9b2eb8f02f3ee, + 0x29391394d3d22544, + 0xc8e0a17f5cd0d6aa, + 0xb58cc6a5f7a26ead, + 0x8193fb08238f02c2, + 0xd5c68f465b2f9f81, + 0xfcff9cd288fdbac5, + 0x77059157f359dc47, + 0x1d262e3907ff492b, + 0xfb582233e59ac557, + 0xddb2bce242f8b673, + 0x2577b76248e096cf, + 0x6f99c4a6d83da74c, + 0xc1147e41eb795701, + 0xf48baf76912a9337, + }, + { + 0x45b268a93acde4cc, + 0xaf7f0be884549d08, + 0x048354b3c1468263, + 0x925435c2c80efed2, + 0xee4e37f27fdffba7, + 0x167a33920c60f14d, + 0xfb123b52ea03e584, + 0x4a0cab53fdbb9007, + 0x9deaf6380f788a19, + 0xcb48ec558f0cb32a, + 0xb59dc4b2d6fef7e0, + 0xdcdbca22f4f3ecb6, + 0x11df5813549a9c40, + 0xe33fdedf568aced3, + 0xa0c1c8124322e9c3, + 0x07a56b8158fa6d0d, + 0x77279579b1e1f3dd, + 0xd9b18b74422ac004, + 0xb8ec2d9fffabc294, + 0xf4acf8a82d75914f, + 0x7bbf69b1ef2b6878, + 0xc4f62faf487ac7e1, + 0x76ce809cc67e5d0c, + 0x6711d88f92e4c14c, + 0x627b99d9243dedfe, + 0x234aa5c3dfb68b51, + 0x909b1f15262dbf6d, + 0x4f66ea054b62bcb5, + 0x1ae2cf5a52aa6ae8, + 0xbea053fbd0ce0148, + 0xed6808c0e66314c9, + 0x43fe16cd15a82710, + 0xcd049231a06970f6, + 0xe7bc8a6c97cc4cb0, + 0x337ce835fcb3b9c0, + 0x65def2587cc780f3, + 0x52214ede4132bb50, + 0x95f15e4390f493df, + 0x870839625dd2e0f1, + 0x41313c1afb8b66af, + 0x91720af051b211bc, + 0x477d427ed4eea573, + 0x2e3b4ceef6e3be25, + 0x82627834eb0bcc43, + 0x9c03e3dd78e724c8, + 0x2877328ad9867df9, + 0x14b51945e243b0f2, + 0x574b0f88f7eb97e2, + 0x88b6fa989aa4943a, + 0x19c4f068cb168586, + 0x50ee6409af11faef, + 0x7df317d5c04eaba4, + 0x7a567c5498b4c6a9, + 0xb6bbfb804f42188e, + 0x3cc22bcf3bc5cd0b, + 0xd04336eaaa397713, + 0xf02fac1bec33132c, + 0x2506dba7f0d3488d, + 0xd7e65d6bf2c31a1e, + 0x5eb9b2161ff820f5, + 0x842e0650c46e0f9f, + 0x716beb1d9e843001, + 0xa933758cab315ed4, + 0x3fe414fda2792265, + 0x27c9f1701ef00932, + 0x73a4c1ca70a771be, + 0x94184ba6e76b3d0e, + 0x40d829ff8c14c87e, + 0x0fbec3fac77674cb, + 0x3616a9634a6a9572, + 0x8f139119c25ef937, + 0xf545ed4d5aea3f9e, + 0xe802499650ba387b, + 0x6437e7bd0b582e22, + 0xe6559f89e053e261, + 0x80ad52e305288dfc, + 0x6dc55a23e34b9935, + 0xde14e0f51ad0ad09, + 0xc6390578a659865e, + 0x96d7617109487cb1, + 0xe2d6cb3a21156002, + 0x01e915e5779faed1, + 0xadb0213f6a77dcb7, + 0x9880b76eb9a1a6ab, + 0x5d9f8d248644cf9b, + 0xfd5e4536c5662658, + 0xf1c6b9fe9bacbdfd, + 0xeacd6341be9979c4, + 0xefa7221708405576, + 0x510771ecd88e543e, + 0xc2ba51cb671f043d, + 0x0ad482ac71af5879, + 0xfe787a045cdac936, + 0xb238af338e049aed, + 0xbd866cc94972ee26, + 0x615da6ebbd810290, + 0x3295fdd08b2c1711, + 0xf834046073bf0aea, + 0xf3099329758ffc42, + 0x1caeb13e7dcfa934, + 0xba2307481188832b, + 0x24efce42874ce65c, + 0x0e57d61fb0e9da1a, + 0xb3d1bad6f99b343c, + 0xc0757b1c893c4582, + 0x2b510db8403a9297, + 0x5c7698c1f1db614a, + 0x3e0d0118d5e68cb4, + 0xd60f488e855cb4cf, + 0xae961e0df3cb33d9, + 0x3a8e55ab14a00ed7, + 0x42170328623789c1, + 0x838b6dd19c946292, + 0x895fef7ded3b3aeb, + 0xcfcbb8e64e4a3149, + 0x064c7e642f65c3dc, + 0x3d2b3e2a4c5a63da, + 0x5bd3f340a9210c47, + 0xb474d157a1615931, + 0xac5934da1de87266, + 0x6ee365117af7765b, + 0xc86ed36716b05c44, + 0x9ba6885c201d49c5, + 0xb905387a88346c45, + 0x131072c4bab9ddff, + 0xbf49461ea751af99, + 0xd52977bc1ce05ba1, + 0xb0f785e46027db52, + 0x546d30ba6e57788c, + 0x305ad707650f56ae, + 0xc987c682612ff295, + 0xa5ab8944f5fbc571, + 0x7ed528e759f244ca, + 0x8ddcbbce2c7db888, + 0xaa154abe328db1ba, + 0x1e619be993ece88b, + 0x09f2bd9ee813b717, + 0x7401aa4b285d1cb3, + 0x21858f143195caee, + 0x48c381841398d1b8, + 0xfcb750d3b2f98889, + 0x39a86a998d1ce1b9, + 0x1f888e0ce473465a, + 0x7899568376978716, + 0x02cf2ad7ee2341bf, + 0x85c713b5b3f1a14e, + 0xff916fe12b4567e7, + 0x7c1a0230b7d10575, + 0x0c98fcc85eca9ba5, + 0xa3e7f720da9e06ad, + 0x6a6031a2bbb1f438, + 0x973e74947ed7d260, + 0x2cf4663918c0ff9a, + 0x5f50a7f368678e24, + 0x34d983b4a449d4cd, + 0x68af1b755592b587, + 0x7f3c3d022e6dea1b, + 0xabfc5f5b45121f6b, + 0x0d71e92d29553574, + 0xdffdf5106d4f03d8, + 0x081ba87b9f8c19c6, + 0xdb7ea1a3ac0981bb, + 0xbbca12ad66172dfa, + 0x79704366010829c7, + 0x179326777bff5f9c, + 0x0000000000000000, + 0xeb2476a4c906d715, + 0x724dd42f0738df6f, + 0xb752ee6538ddb65f, + 0x37ffbc863df53ba3, + 0x8efa84fcb5c157e6, + 0xe9eb5c73272596aa, + 0x1b0bdabf2535c439, + 0x86e12c872a4d4e20, + 0x9969a28bce3e087a, + 0xfafb2eb79d9c4b55, + 0x056a4156b6d92cb2, + 0x5a3ae6a5debea296, + 0x22a3b026a8292580, + 0x53c85b3b36ad1581, + 0xb11e900117b87583, + 0xc51f3a4a3fe56930, + 0xe019e1edcf3621bd, + 0xec811d2591fcba18, + 0x445b7d4c4d524a1d, + 0xa8da6069dcaef005, + 0x58f5cc72309de329, + 0xd4c062596b7ff570, + 0xce22ad0339d59f98, + 0x591cd99747024df8, + 0x8b90c5aa03187b54, + 0xf663d27fc356d0f0, + 0xd8589e9135b56ed5, + 0x35309651d3d67a1c, + 0x12f96721cd26732e, + 0xd28c1c3d441a36ac, + 0x492a946164077f69, + 0x2d1d73dc6f5f514b, + 0x6f0a70f40d68d88a, + 0x60b4b30eca1eac41, + 0xd36509d83385987d, + 0x0b3d97490630f6a8, + 0x9eccc90a96c46577, + 0xa20ee2c5ad01a87c, + 0xe49ab55e0e70a3de, + 0xa4429ca182646ba0, + 0xda97b446db962f6a, + 0xcced87d4d7f6de27, + 0x2ab8185d37a53c46, + 0x9f25dcefe15bcba6, + 0xc19c6ef9fea3eb53, + 0xa764a3931bd884ce, + 0x2fd2590b817c10f4, + 0x56a21a6d80743933, + 0xe573a0bb79ef0d0f, + 0x155c0ca095dc1e23, + 0x6c2c4fc694d437e4, + 0x10364df623053291, + 0xdd32dfc7836c4267, + 0x03263f3299bcef6e, + 0x66f8cd6ae57b6f9d, + 0x8c35ae2b5be21659, + 0x31b3c2e21290f87f, + 0x93bd2027bf915003, + 0x69460e90220d1b56, + 0x299e276fae19d328, + 0x63928c3c53a2432f, + 0x7082fef8e91b9ed0, + 0xbc6f792c3eed40f7, + 0x4c40d537d2de53db, + 0x75e8bfae5fc2b262, + 0x4da9c0d2a541fd0a, + 0x4e8fffe03cfd1264, + 0x2620e495696fa7e3, + 0xe1f0f408b8a98f6c, + 0xd1aa230fdda6d9c2, + 0xc7d0109dd1c6288f, + 0x8a79d04f7487d585, + 0x4694579ba3710ba2, + 0x38417f7cfa834f68, + 0x1d47a4db0a5007e5, + 0x206c9af1460a643f, + 0xa128ddf734bd4712, + 0x8144470672b7232d, + 0xf2e086cc02105293, + 0x182de58dbc892b57, + 0xcaa1f9b0f8931dfb, + 0x6b892447cc2e5ae9, + 0xf9dd11850420a43b, + 0x4be5beb68a243ed6, + 0x5584255f19c8d65d, + 0x3b67404e633fa006, + 0xa68db6766c472a1f, + 0xf78ac79ab4c97e21, + 0xc353442e1080aaec, + 0x9a4f9db95782e714, + }, + { + 0xc811a8058c3f55de, + 0x65f5b43196b50619, + 0xf74f96b1d6706e43, + 0x859d1e8bcb43d336, + 0x5aab8a85ccfa3d84, + 0xf9c7bf99c295fcfd, + 0xa21fd5a1de4b630f, + 0xcdb3ef763b8b456d, + 0x803f59f87cf7c385, + 0xb27c73be5f31913c, + 0x98e3ac6633b04821, + 0xbf61674c26b8f818, + 0x0ffbc995c4c130c8, + 0xaaa0862010761a98, + 0x6057f342210116aa, + 0xf63c760c0654cc35, + 0x2ddb45cc667d9042, + 0xbcf45a964bd40382, + 0x68e8a0c3ef3c6f3d, + 0xa7bd92d269ff73bc, + 0x290ae20201ed2287, + 0xb7de34cde885818f, + 0xd901eea7dd61059b, + 0xd6fa273219a03553, + 0xd56f1ae874cccec9, + 0xea31245c2e83f554, + 0x7034555da07be499, + 0xce26d2ac56e7bef7, + 0xfd161857a5054e38, + 0x6a0e7da4527436d1, + 0x5bd86a381cde9ff2, + 0xcaf7756231770c32, + 0xb09aaed9e279c8d0, + 0x5def1091c60674db, + 0x111046a2515e5045, + 0x23536ce4729802fc, + 0xc50cbcf7f5b63cfa, + 0x73a16887cd171f03, + 0x7d2941afd9f28dbd, + 0x3f5e3eb45a4f3b9d, + 0x84eefe361b677140, + 0x3db8e3d3e7076271, + 0x1a3a28f9f20fd248, + 0x7ebc7c75b49e7627, + 0x74e5f293c7eb565c, + 0x18dcf59e4f478ba4, + 0x0c6ef44fa9adcb52, + 0xc699812d98dac760, + 0x788b06dc6e469d0e, + 0xfc65f8ea7521ec4e, + 0x30a5f7219e8e0b55, + 0x2bec3f65bca57b6b, + 0xddd04969baf1b75e, + 0x99904cdbe394ea57, + 0x14b201d1e6ea40f6, + 0xbbb0c08241284add, + 0x50f20463bf8f1dff, + 0xe8d7f93b93cbacb8, + 0x4d8cb68e477c86e8, + 0xc1dd1b3992268e3f, + 0x7c5aa11209d62fcb, + 0x2f3d98abdb35c9ae, + 0x671369562bfd5ff5, + 0x15c1e16c36cee280, + 0x1d7eb2edf8f39b17, + 0xda94d37db00dfe01, + 0x877bc3ec760b8ada, + 0xcb8495dfe153ae44, + 0x05a24773b7b410b3, + 0x12857b783c32abdf, + 0x8eb770d06812513b, + 0x536739b9d2e3e665, + 0x584d57e271b26468, + 0xd789c78fc9849725, + 0xa935bbfa7d1ae102, + 0x8b1537a3dfa64188, + 0xd0cd5d9bc378de7a, + 0x4ac82c9a4d80cfb7, + 0x42777f1b83bdb620, + 0x72d2883a1d33bd75, + 0x5e7a2d4bab6a8f41, + 0xf4daab6bbb1c95d9, + 0x905cffe7fd8d31b6, + 0x83aa6422119b381f, + 0xc0aefb8442022c49, + 0xa0f908c663033ae3, + 0xa428af0804938826, + 0xade41c341a8a53c7, + 0xae7121ee77e6a85d, + 0xc47f5c4a25929e8c, + 0xb538e9aa55cdd863, + 0x06377aa9dad8eb29, + 0xa18ae87bb3279895, + 0x6edfda6a35e48414, + 0x6b7d9d19825094a7, + 0xd41cfa55a4e86cbf, + 0xe5caedc9ea42c59c, + 0xa36c351c0e6fc179, + 0x5181e4de6fabbf89, + 0xfff0c530184d17d4, + 0x9d41eb1584045892, + 0x1c0d525028d73961, + 0xf178ec180ca8856a, + 0x9a0571018ef811cd, + 0x4091a27c3ef5efcc, + 0x19af15239f6329d2, + 0x347450eff91eb990, + 0xe11b4a078dd27759, + 0xb9561de5fc601331, + 0x912f1f5a2da993c0, + 0x1654dcb65ba2191a, + 0x3e2dde098a6b99eb, + 0x8a66d71e0f82e3fe, + 0x8c51adb7d55a08d7, + 0x4533e50f8941ff7f, + 0x02e6dd67bd4859ec, + 0xe068aaba5df6d52f, + 0xc24826e3ff4a75a5, + 0x6c39070d88acddf8, + 0x6486548c4691a46f, + 0xd1bebd26135c7c0c, + 0xb30f93038f15334a, + 0x82d9849fc1bf9a69, + 0x9c320ba85420fae4, + 0xfa528243aff90767, + 0x9ed4d6cfe968a308, + 0xb825fd582c44b147, + 0x9b7691bc5edcb3bb, + 0xc7ea619048fe6516, + 0x1063a61f817af233, + 0x47d538683409a693, + 0x63c2ce984c6ded30, + 0x2a9fdfd86c81d91d, + 0x7b1e3b06032a6694, + 0x666089ebfbd9fd83, + 0x0a598ee67375207b, + 0x07449a140afc495f, + 0x2ca8a571b6593234, + 0x1f986f8a45bbc2fb, + 0x381aa4a050b372c2, + 0x5423a3add81faf3a, + 0x17273c0b8b86bb6c, + 0xfe83258dc869b5a2, + 0x287902bfd1c980f1, + 0xf5a94bd66b3837af, + 0x88800a79b2caba12, + 0x55504310083b0d4c, + 0xdf36940e07b9eeb2, + 0x04d1a7ce6790b2c5, + 0x612413fff125b4dc, + 0x26f12b97c52c124f, + 0x86082351a62f28ac, + 0xef93632f9937e5e7, + 0x3507b052293a1be6, + 0xe72c30ae570a9c70, + 0xd3586041ae1425e0, + 0xde4574b3d79d4cc4, + 0x92ba228040c5685a, + 0xf00b0ca5dc8c271c, + 0xbe1287f1f69c5a6e, + 0xf39e317fb1e0dc86, + 0x495d114020ec342d, + 0x699b407e3f18cd4b, + 0xdca3a9d46ad51528, + 0x0d1d14f279896924, + 0x0000000000000000, + 0x593eb75fa196c61e, + 0x2e4e78160b116bd8, + 0x6d4ae7b058887f8e, + 0xe65fd013872e3e06, + 0x7a6ddbbbd30ec4e2, + 0xac97fc89caaef1b1, + 0x09ccb33c1e19dbe1, + 0x89f3eac462ee1864, + 0x7770cf49aa87adc6, + 0x56c57eca6557f6d6, + 0x03953dda6d6cfb9a, + 0x36928d884456e07c, + 0x1eeb8f37959f608d, + 0x31d6179c4eaaa923, + 0x6fac3ad7e5c02662, + 0x43049fa653991456, + 0xabd3669dc052b8ee, + 0xaf02c153a7c20a2b, + 0x3ccb036e3723c007, + 0x93c9c23d90e1ca2c, + 0xc33bc65e2f6ed7d3, + 0x4cff56339758249e, + 0xb1e94e64325d6aa6, + 0x37e16d359472420a, + 0x79f8e661be623f78, + 0x5214d90402c74413, + 0x482ef1fdf0c8965b, + 0x13f69bc5ec1609a9, + 0x0e88292814e592be, + 0x4e198b542a107d72, + 0xccc00fcbebafe71b, + 0x1b49c844222b703e, + 0x2564164da840e9d5, + 0x20c6513e1ff4f966, + 0xbac3203f910ce8ab, + 0xf2edd1c261c47ef0, + 0x814cb945acd361f3, + 0x95feb8944a392105, + 0x5c9cf02c1622d6ad, + 0x971865f3f77178e9, + 0xbd87ba2b9bf0a1f4, + 0x444005b259655d09, + 0xed75be48247fbc0b, + 0x7596122e17cff42a, + 0xb44b091785e97a15, + 0x966b854e2755da9f, + 0xeee0839249134791, + 0x32432a4623c652b9, + 0xa8465b47ad3e4374, + 0xf8b45f2412b15e8b, + 0x2417f6f078644ba3, + 0xfb2162fe7fdda511, + 0x4bbbcc279da46dc1, + 0x0173e0bdd024a276, + 0x22208c59a2bca08a, + 0x8fc4906db836f34d, + 0xe4b90d743a6667ea, + 0x7147b5e0705f46ef, + 0x2782cb2a1508b039, + 0xec065ef5f45b1e7d, + 0x21b5b183cfd05b10, + 0xdbe733c060295c77, + 0x9fa73672394c017e, + 0xcf55321186c31c81, + 0xd8720e1a0d45a7ed, + 0x3b8f997a3ddf8958, + 0x3afc79c7edfb2b2e, + 0xe9a4198643ef0ece, + 0x5f09cdf67b4e2d37, + 0x4f6a6be9fa34df04, + 0xb6add47038a123f9, + 0x8d224d0a057eaaa1, + 0xc96248b85c1bf7a8, + 0xe3fd9760309a2eb5, + 0x0b2a6e5ba351820d, + 0xeb42c4e1fea75722, + 0x948d58299a1d8373, + 0x7fcf9cc864bad451, + 0xa55b4fb5d4b72a50, + 0x08bf5381ce3d7997, + 0x46a6d8d5e42d04e5, + 0xd22b80fc7e308796, + 0x57b69e77b57354a0, + 0x3969441d8097d0b4, + 0x3330cafbf3e2f0cf, + 0xe28e77dde0be8cc3, + 0x62b12e259c494f46, + 0xa6ce726fb9dbd1ca, + 0x41e242c1eed14dba, + 0x76032ff47aa30fb0, + }, + { + 0xe6f87e5c5b711fd0, + 0x258377800924fa16, + 0xc849e07e852ea4a8, + 0x5b4686a18f06c16a, + 0x0b32e9a2d77b416e, + 0xabda37a467815c66, + 0xf61796a81a686676, + 0xf5dc0b706391954b, + 0x4862f38db7e64bf1, + 0xff5c629a68bd85c5, + 0xcb827da6fcd75795, + 0x66d36daf69b9f089, + 0x356c9f74483d83b0, + 0x7cbcecb1238c99a1, + 0x36a702ac31c4708d, + 0x9eb6a8d02fbcdfd6, + 0x8b19fa51e5b3ae37, + 0x9ccfb5408a127d0b, + 0xbc0c78b508208f5a, + 0xe533e3842288eced, + 0xcec2c7d377c15fd2, + 0xec7817b6505d0f5e, + 0xb94cc2c08336871d, + 0x8c205db4cb0b04ad, + 0x763c855b28a0892f, + 0x588d1b79f6ff3257, + 0x3fecf69e4311933e, + 0x0fc0d39f803a18c9, + 0xee010a26f5f3ad83, + 0x10efe8f4411979a6, + 0x5dcda10c7de93a10, + 0x4a1bee1d1248e92c, + 0x53bff2db21847339, + 0xb4f50ccfa6a23d09, + 0x5fb4bc9cd84798cd, + 0xe88a2d8b071c56f9, + 0x7f7771695a756a9c, + 0xc5f02e71a0ba1ebc, + 0xa663f9ab4215e672, + 0x2eb19e22de5fbb78, + 0x0db9ce0f2594ba14, + 0x82520e6397664d84, + 0x2f031e6a0208ea98, + 0x5c7f2144a1be6bf0, + 0x7a37cb1cd16362db, + 0x83e08e2b4b311c64, + 0xcf70479bab960e32, + 0x856ba986b9dee71e, + 0xb5478c877af56ce9, + 0xb8fe42885f61d6fd, + 0x1bdd0156966238c8, + 0x622157923ef8a92e, + 0xfc97ff42114476f8, + 0x9d7d350856452ceb, + 0x4c90c9b0e0a71256, + 0x2308502dfbcb016c, + 0x2d7a03faa7a64845, + 0xf46e8b38bfc6c4ab, + 0xbdbef8fdd477deba, + 0x3aac4cebc8079b79, + 0xf09cb105e8879d0c, + 0x27fa6a10ac8a58cb, + 0x8960e7c1401d0cea, + 0x1a6f811e4a356928, + 0x90c4fb0773d196ff, + 0x43501a2f609d0a9f, + 0xf7a516e0c63f3796, + 0x1ce4a6b3b8da9252, + 0x1324752c38e08a9b, + 0xa5a864733bec154f, + 0x2bf124575549b33f, + 0xd766db15440dc5c7, + 0xa7d179e39e42b792, + 0xdadf151a61997fd3, + 0x86a0345ec0271423, + 0x38d5517b6da939a4, + 0x6518f077104003b4, + 0x02791d90a5aea2dd, + 0x88d267899c4a5d0a, + 0x930f66df0a2865c2, + 0x4ee9d4204509b08b, + 0x325538916685292a, + 0x412907bfc533a842, + 0xb27e2b62544dc673, + 0x6c5304456295e007, + 0x5af406e95351908a, + 0x1f2f3b6bc123616f, + 0xc37b09dc5255e5c6, + 0x3967d133b1fe6844, + 0x298839c7f0e711e2, + 0x409b87f71964f9a2, + 0xe938adc3db4b0719, + 0x0c0b4e47f9c3ebf4, + 0x5534d576d36b8843, + 0x4610a05aeb8b02d8, + 0x20c3cdf58232f251, + 0x6de1840dbec2b1e7, + 0xa0e8de06b0fa1d08, + 0x7b854b540d34333b, + 0x42e29a67bcca5b7f, + 0xd8a6088ac437dd0e, + 0xc63bb3a9d943ed81, + 0x21714dbd5e65a3b1, + 0x6761ede7b5eea169, + 0x2431f7c8d573abf6, + 0xd51fc685e1a3671a, + 0x5e063cd40410c92d, + 0x283ab98f2cb04002, + 0x8febc06cb2f2f790, + 0x17d64f116fa1d33c, + 0xe07359f1a99ee4aa, + 0x784ed68c74cdc006, + 0x6e2a19d5c73b42da, + 0x8712b4161c7045c3, + 0x371582e4ed93216d, + 0xace390414939f6fc, + 0x7ec5f12186223b7c, + 0xc0b094042bac16fb, + 0xf9d745379a527ebf, + 0x737c3f2ea3b68168, + 0x33e7b8d9bad278ca, + 0xa9a32a34c22ffebb, + 0xe48163ccfedfbd0d, + 0x8e5940246ea5a670, + 0x51c6ef4b842ad1e4, + 0x22bad065279c508c, + 0xd91488c218608cee, + 0x319ea5491f7cda17, + 0xd394e128134c9c60, + 0x094bf43272d5e3b3, + 0x9bf612a5a4aad791, + 0xccbbda43d26ffd0f, + 0x34de1f3c946ad250, + 0x4f5b5468995ee16b, + 0xdf9faf6fea8f7794, + 0x2648ea5870dd092b, + 0xbfc7e56d71d97c67, + 0xdde6b2ff4f21d549, + 0x3c276b463ae86003, + 0x91767b4faf86c71f, + 0x68a13e7835d4b9a0, + 0xb68c115f030c9fd4, + 0x141dd2c916582001, + 0x983d8f7ddd5324ac, + 0x64aa703fcc175254, + 0xc2c989948e02b426, + 0x3e5e76d69f46c2de, + 0x50746f03587d8004, + 0x45db3d829272f1e5, + 0x60584a029b560bf3, + 0xfbae58a73ffcdc62, + 0xa15a5e4e6cad4ce8, + 0x4ba96e55ce1fb8cc, + 0x08f9747aae82b253, + 0xc102144cf7fb471b, + 0x9f042898f3eb8e36, + 0x068b27adf2effb7a, + 0xedca97fe8c0a5ebe, + 0x778e0513f4f7d8cf, + 0x302c2501c32b8bf7, + 0x8d92ddfc175c554d, + 0xf865c57f46052f5f, + 0xeaf3301ba2b2f424, + 0xaa68b7ecbbd60d86, + 0x998f0f350104754c, + 0x0000000000000000, + 0xf12e314d34d0ccec, + 0x710522be061823b5, + 0xaf280d9930c005c1, + 0x97fd5ce25d693c65, + 0x19a41cc633cc9a15, + 0x95844172f8c79eb8, + 0xdc5432b7937684a9, + 0x9436c13a2490cf58, + 0x802b13f332c8ef59, + 0xc442ae397ced4f5c, + 0xfa1cd8efe3ab8d82, + 0xf2e5ac954d293fd1, + 0x6ad823e8907a1b7d, + 0x4d2249f83cf043b6, + 0x03cb9dd879f9f33d, + 0xde2d2f2736d82674, + 0x2a43a41f891ee2df, + 0x6f98999d1b6c133a, + 0xd4ad46cd3df436fa, + 0xbb35df50269825c0, + 0x964fdcaa813e6d85, + 0xeb41b0537ee5a5c4, + 0x0540ba758b160847, + 0xa41ae43be7bb44af, + 0xe3b8c429d0671797, + 0x819993bbee9fbeb9, + 0xae9a8dd1ec975421, + 0xf3572cdd917e6e31, + 0x6393d7dae2aff8ce, + 0x47a2201237dc5338, + 0xa32343dec903ee35, + 0x79fc56c4a89a91e6, + 0x01b28048dc5751e0, + 0x1296f564e4b7db7b, + 0x75f7188351597a12, + 0xdb6d9552bdce2e33, + 0x1e9dbb231d74308f, + 0x520d7293fdd322d9, + 0xe20a44610c304677, + 0xfeeee2d2b4ead425, + 0xca30fdee20800675, + 0x61eaca4a47015a13, + 0xe74afe1487264e30, + 0x2cc883b27bf119a5, + 0x1664cf59b3f682dc, + 0xa811aa7c1e78af5b, + 0x1d5626fb648dc3b2, + 0xb73e9117df5bce34, + 0xd05f7cf06ab56f5d, + 0xfd257f0acd132718, + 0x574dc8e676c52a9e, + 0x0739a7e52eb8aa9a, + 0x5486553e0f3cd9a3, + 0x56ff48aeaa927b7e, + 0xbe756525ad8e2d87, + 0x7d0e6cf9ffdbc841, + 0x3b1ecca31450ca99, + 0x6913be30e983e840, + 0xad511009956ea71c, + 0xb1b5b6ba2db4354e, + 0x4469bdca4e25a005, + 0x15af5281ca0f71e1, + 0x744598cb8d0e2bf2, + 0x593f9b312aa863b7, + 0xefb38a6e29a4fc63, + 0x6b6aa3a04c2d4a9d, + 0x3d95eb0ee6bf31e3, + 0xa291c3961554bfd5, + 0x18169c8eef9bcbf5, + 0x115d68bc9d4e2846, + 0xba875f18facf7420, + 0xd1edfcb8b6e23ebd, + 0xb00736f2f1e364ae, + 0x84d929ce6589b6fe, + 0x70b7a2f6da4f7255, + 0x0e7253d75c6d4929, + 0x04f23a3d574159a7, + 0x0a8069ea0b2c108e, + 0x49d073c56bb11a11, + 0x8aab7a1939e4ffd7, + 0xcd095a0b0e38acef, + 0xc9fb60365979f548, + 0x92bde697d67f3422, + 0xc78933e10514bc61, + 0xe1c1d9b975c9b54a, + 0xd2266160cf1bcd80, + 0x9a4492ed78fd8671, + 0xb3ccab2a881a9793, + 0x72cebf667fe1d088, + 0xd6d45b5d985a9427, + }, +}; + +__device__ const u64 sbob_rc64[12][8] = +{ + { + 0xe9daca1eda5b08b1, + 0x1f7c65c0812fcbeb, + 0x16d0452e43766a2f, + 0xfcc485758db84e71, + 0x0169679291e07c4b, + 0x15d360a4082a42a2, + 0x234d74cc36747605, + 0x0745a6f2596580dd, + }, + { + 0x1a2f9da98ab5a36f, + 0xd7b5700f469de34f, + 0x982b230a72eafef3, + 0x3101b5160f5ed561, + 0x5899d6126b17b59a, + 0xcaa70adbc261b55c, + 0x56cdcbd71ba2dd55, + 0xb79bb121700479e6, + }, + { + 0xc72fce2bacdc74f5, + 0x35843d6a28fc390a, + 0x8b1f9c525f5ef106, + 0x7b7b29b11475eaf2, + 0xb19e3590e40fe2d3, + 0x09db6260373ac9c1, + 0x31db7a8643f4b6c2, + 0xb20aba0af5961e99, + }, + { + 0xd26615e8b3df1fef, + 0xdde4715da0e148f9, + 0x7d3c5c337e858e48, + 0x3f355e68ad1c729d, + 0x75d603ed822cd7a9, + 0xbe0352933313b7d8, + 0xf137e893a1ea5334, + 0x2ed1e384bcbe0c22, + }, + { + 0x994747adac6bea4b, + 0x6323a96c0c413f9a, + 0x4a1086161f1c157f, + 0xbdff0f80d7359e35, + 0xa3f53a254717cdbf, + 0x161a2723b700ffdf, + 0xf563eaa97ea2567a, + 0x57fe6c7cfd581760, + }, + { + 0xd9d33a1daeae4fae, + 0xc039307a3bc3a46f, + 0x6ca44251f9c4662d, + 0xc68ef09ab49a7f18, + 0xb4b79a1cb7a6facf, + 0xb6c6bec2661ff20a, + 0x354f903672c571bf, + 0x6e7d64467a4068fa, + }, + { + 0xecc5aaee160ec7f4, + 0x540924bffe86ac51, + 0xc987bfe6c7c69e39, + 0xc9937a19333e47d3, + 0x372c822dc5ab9209, + 0x04054a2883694706, + 0xf34a3ca24c451735, + 0x93d4143a4d568688, + }, + { + 0xa7c9934d425b1f9b, + 0x41416e0c02aae703, + 0x1ede369c71f8b74e, + 0x9ac4db4d3b44b489, + 0x90069b92cb2b89f4, + 0x2fc4a5d12b8dd169, + 0xd9a8515935c2ac36, + 0x1ee702bfd40d7fa4, + }, + { + 0x9b223116545a8f37, + 0xde5f16ecd89a4c94, + 0x244289251b3a7d3a, + 0x84090de0b755d93c, + 0xb1ceb2db0b440a80, + 0x549c07a69a8a2b7b, + 0x602a1fcb92dc380e, + 0xdb5a238351446172, + }, + { + 0x526f0580a6debeab, + 0xf3f3e4b248e52a38, + 0xdb788aff1ce74189, + 0x0361331b8ae1ff1f, + 0x4b3369af0267e79f, + 0xf452763b306c1e7a, + 0xc3b63b15d1fa9836, + 0xed9c4598fbc7b474, + }, + { + 0xfb89c8efd09ecd7b, + 0x94fe5a63cdc60230, + 0x6107abebbb6bfad8, + 0x7966841421800120, + 0xcab948eaef711d8a, + 0x986e477d1dcdbaef, + 0x5dd86fc04a59a2de, + 0x1b2df381cda4ca6b, + }, + { + 0xba3116f167e78e37, + 0x7ab14904b08013d2, + 0x771ddfbc323ca4cd, + 0x9b9f2130d41220f8, + 0x86cc91189def805d, + 0x5228e188aaa41de7, + 0x991bb2d9d517f4fa, + 0x20d71bf14a92bc48, + }, +}; + +__device__ static void streebog_g (u64 h[8], const u64 m[8], u64 s_sbob_sl64[8][256]) +{ + u64 k[8]; + u64 s[8]; + u64 t[8]; + + #pragma unroll + for (int i = 0; i < 8; i++) + { + t[i] = h[i]; + } + + for (int i = 0; i < 8; i++) + { + k[i] = SBOG_LPSti64; + } + + #pragma unroll + for (int i = 0; i < 8; i++) + { + s[i] = m[i]; + } + + for (int r = 0; r < 12; r++) + { + #pragma unroll + for (int i = 0; i < 8; i++) + { + t[i] = s[i] ^ k[i]; + } + + #pragma unroll + for (int i = 0; i < 8; i++) + { + s[i] = SBOG_LPSti64; + } + + for (int i = 0; i < 8; i++) + { + t[i] = k[i] ^ sbob_rc64[r][i]; + } + + #pragma unroll + for (int i = 0; i < 8; i++) + { + k[i] = SBOG_LPSti64; + } + } + + #pragma unroll + for (int i = 0; i < 8; i++) + { + h[i] ^= s[i] ^ k[i] ^ m[i]; + } +} + +__device__ __constant__ gpu_rule_t c_rules[1024]; + +extern "C" __global__ void __launch_bounds__ (256, 1) m11800_m04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + /** + * shared lookup table + */ + + __shared__ u64 s_sbob_sl64[8][256]; + + if (lid < 64) + { + const u32 lid4 = lid * 4; + + s_sbob_sl64[0][lid4 + 0] = sbob_sl64[0][lid4 + 0]; + s_sbob_sl64[0][lid4 + 1] = sbob_sl64[0][lid4 + 1]; + s_sbob_sl64[0][lid4 + 2] = sbob_sl64[0][lid4 + 2]; + s_sbob_sl64[0][lid4 + 3] = sbob_sl64[0][lid4 + 3]; + s_sbob_sl64[1][lid4 + 0] = sbob_sl64[1][lid4 + 0]; + s_sbob_sl64[1][lid4 + 1] = sbob_sl64[1][lid4 + 1]; + s_sbob_sl64[1][lid4 + 2] = sbob_sl64[1][lid4 + 2]; + s_sbob_sl64[1][lid4 + 3] = sbob_sl64[1][lid4 + 3]; + s_sbob_sl64[2][lid4 + 0] = sbob_sl64[2][lid4 + 0]; + s_sbob_sl64[2][lid4 + 1] = sbob_sl64[2][lid4 + 1]; + s_sbob_sl64[2][lid4 + 2] = sbob_sl64[2][lid4 + 2]; + s_sbob_sl64[2][lid4 + 3] = sbob_sl64[2][lid4 + 3]; + s_sbob_sl64[3][lid4 + 0] = sbob_sl64[3][lid4 + 0]; + s_sbob_sl64[3][lid4 + 1] = sbob_sl64[3][lid4 + 1]; + s_sbob_sl64[3][lid4 + 2] = sbob_sl64[3][lid4 + 2]; + s_sbob_sl64[3][lid4 + 3] = sbob_sl64[3][lid4 + 3]; + s_sbob_sl64[4][lid4 + 0] = sbob_sl64[4][lid4 + 0]; + s_sbob_sl64[4][lid4 + 1] = sbob_sl64[4][lid4 + 1]; + s_sbob_sl64[4][lid4 + 2] = sbob_sl64[4][lid4 + 2]; + s_sbob_sl64[4][lid4 + 3] = sbob_sl64[4][lid4 + 3]; + s_sbob_sl64[5][lid4 + 0] = sbob_sl64[5][lid4 + 0]; + s_sbob_sl64[5][lid4 + 1] = sbob_sl64[5][lid4 + 1]; + s_sbob_sl64[5][lid4 + 2] = sbob_sl64[5][lid4 + 2]; + s_sbob_sl64[5][lid4 + 3] = sbob_sl64[5][lid4 + 3]; + s_sbob_sl64[6][lid4 + 0] = sbob_sl64[6][lid4 + 0]; + s_sbob_sl64[6][lid4 + 1] = sbob_sl64[6][lid4 + 1]; + s_sbob_sl64[6][lid4 + 2] = sbob_sl64[6][lid4 + 2]; + s_sbob_sl64[6][lid4 + 3] = sbob_sl64[6][lid4 + 3]; + s_sbob_sl64[7][lid4 + 0] = sbob_sl64[7][lid4 + 0]; + s_sbob_sl64[7][lid4 + 1] = sbob_sl64[7][lid4 + 1]; + s_sbob_sl64[7][lid4 + 2] = sbob_sl64[7][lid4 + 2]; + s_sbob_sl64[7][lid4 + 3] = sbob_sl64[7][lid4 + 3]; + } + + __syncthreads (); + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + u32x pw_buf1[4]; + + pw_buf1[0] = pws[gid].i[ 4]; + pw_buf1[1] = pws[gid].i[ 5]; + pw_buf1[2] = pws[gid].i[ 6]; + pw_buf1[3] = pws[gid].i[ 7]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w[16]; + + w[ 0] = pw_buf0[0]; + w[ 1] = pw_buf0[1]; + w[ 2] = pw_buf0[2]; + w[ 3] = pw_buf0[3]; + w[ 4] = pw_buf1[0]; + w[ 5] = pw_buf1[1]; + w[ 6] = pw_buf1[2]; + w[ 7] = pw_buf1[3]; + w[ 8] = 0; + w[ 9] = 0; + w[10] = 0; + w[11] = 0; + w[12] = 0; + w[13] = 0; + w[14] = 0; + w[15] = 0; + + const u32 out_len = apply_rules (c_rules[il_pos].cmds, &w[0], &w[1], pw_len); + + append_0x01_2 (&w[0], &w[1], out_len); + + /** + * reverse message block + */ + + u64 m[8]; + + m[0] = hl32_to_64 (w[15], w[14]); + m[1] = hl32_to_64 (w[13], w[12]); + m[2] = hl32_to_64 (w[11], w[10]); + m[3] = hl32_to_64 (w[ 9], w[ 8]); + m[4] = hl32_to_64 (w[ 7], w[ 6]); + m[5] = hl32_to_64 (w[ 5], w[ 4]); + m[6] = hl32_to_64 (w[ 3], w[ 2]); + m[7] = hl32_to_64 (w[ 1], w[ 0]); + + m[0] = swap_workaround (m[0]); + m[1] = swap_workaround (m[1]); + m[2] = swap_workaround (m[2]); + m[3] = swap_workaround (m[3]); + m[4] = swap_workaround (m[4]); + m[5] = swap_workaround (m[5]); + m[6] = swap_workaround (m[6]); + m[7] = swap_workaround (m[7]); + + // state buffer (hash) + + u64 h[8]; + + h[0] = INITVAL; + h[1] = INITVAL; + h[2] = INITVAL; + h[3] = INITVAL; + h[4] = INITVAL; + h[5] = INITVAL; + h[6] = INITVAL; + h[7] = INITVAL; + + streebog_g (h, m, s_sbob_sl64); + + u64 z[8]; + + z[0] = 0; + z[1] = 0; + z[2] = 0; + z[3] = 0; + z[4] = 0; + z[5] = 0; + z[6] = 0; + z[7] = swap_workaround ((u64) (out_len * 8)); + + streebog_g (h, z, s_sbob_sl64); + streebog_g (h, m, s_sbob_sl64); + + const u32 r0 = l32_from_64 (h[0]); + const u32 r1 = h32_from_64 (h[0]); + const u32 r2 = l32_from_64 (h[1]); + const u32 r3 = h32_from_64 (h[1]); + + #include VECT_COMPARE_M + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m11800_m08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m11800_m16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m11800_s04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + + /** + * shared lookup table + */ + + __shared__ u64 s_sbob_sl64[8][256]; + + if (lid < 64) + { + const u32 lid4 = lid * 4; + + s_sbob_sl64[0][lid4 + 0] = sbob_sl64[0][lid4 + 0]; + s_sbob_sl64[0][lid4 + 1] = sbob_sl64[0][lid4 + 1]; + s_sbob_sl64[0][lid4 + 2] = sbob_sl64[0][lid4 + 2]; + s_sbob_sl64[0][lid4 + 3] = sbob_sl64[0][lid4 + 3]; + s_sbob_sl64[1][lid4 + 0] = sbob_sl64[1][lid4 + 0]; + s_sbob_sl64[1][lid4 + 1] = sbob_sl64[1][lid4 + 1]; + s_sbob_sl64[1][lid4 + 2] = sbob_sl64[1][lid4 + 2]; + s_sbob_sl64[1][lid4 + 3] = sbob_sl64[1][lid4 + 3]; + s_sbob_sl64[2][lid4 + 0] = sbob_sl64[2][lid4 + 0]; + s_sbob_sl64[2][lid4 + 1] = sbob_sl64[2][lid4 + 1]; + s_sbob_sl64[2][lid4 + 2] = sbob_sl64[2][lid4 + 2]; + s_sbob_sl64[2][lid4 + 3] = sbob_sl64[2][lid4 + 3]; + s_sbob_sl64[3][lid4 + 0] = sbob_sl64[3][lid4 + 0]; + s_sbob_sl64[3][lid4 + 1] = sbob_sl64[3][lid4 + 1]; + s_sbob_sl64[3][lid4 + 2] = sbob_sl64[3][lid4 + 2]; + s_sbob_sl64[3][lid4 + 3] = sbob_sl64[3][lid4 + 3]; + s_sbob_sl64[4][lid4 + 0] = sbob_sl64[4][lid4 + 0]; + s_sbob_sl64[4][lid4 + 1] = sbob_sl64[4][lid4 + 1]; + s_sbob_sl64[4][lid4 + 2] = sbob_sl64[4][lid4 + 2]; + s_sbob_sl64[4][lid4 + 3] = sbob_sl64[4][lid4 + 3]; + s_sbob_sl64[5][lid4 + 0] = sbob_sl64[5][lid4 + 0]; + s_sbob_sl64[5][lid4 + 1] = sbob_sl64[5][lid4 + 1]; + s_sbob_sl64[5][lid4 + 2] = sbob_sl64[5][lid4 + 2]; + s_sbob_sl64[5][lid4 + 3] = sbob_sl64[5][lid4 + 3]; + s_sbob_sl64[6][lid4 + 0] = sbob_sl64[6][lid4 + 0]; + s_sbob_sl64[6][lid4 + 1] = sbob_sl64[6][lid4 + 1]; + s_sbob_sl64[6][lid4 + 2] = sbob_sl64[6][lid4 + 2]; + s_sbob_sl64[6][lid4 + 3] = sbob_sl64[6][lid4 + 3]; + s_sbob_sl64[7][lid4 + 0] = sbob_sl64[7][lid4 + 0]; + s_sbob_sl64[7][lid4 + 1] = sbob_sl64[7][lid4 + 1]; + s_sbob_sl64[7][lid4 + 2] = sbob_sl64[7][lid4 + 2]; + s_sbob_sl64[7][lid4 + 3] = sbob_sl64[7][lid4 + 3]; + } + + __syncthreads (); + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + u32x pw_buf1[4]; + + pw_buf1[0] = pws[gid].i[ 4]; + pw_buf1[1] = pws[gid].i[ 5]; + pw_buf1[2] = pws[gid].i[ 6]; + pw_buf1[3] = pws[gid].i[ 7]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w[16]; + + w[ 0] = pw_buf0[0]; + w[ 1] = pw_buf0[1]; + w[ 2] = pw_buf0[2]; + w[ 3] = pw_buf0[3]; + w[ 4] = pw_buf1[0]; + w[ 5] = pw_buf1[1]; + w[ 6] = pw_buf1[2]; + w[ 7] = pw_buf1[3]; + w[ 8] = 0; + w[ 9] = 0; + w[10] = 0; + w[11] = 0; + w[12] = 0; + w[13] = 0; + w[14] = 0; + w[15] = 0; + + const u32 out_len = apply_rules (c_rules[il_pos].cmds, &w[0], &w[1], pw_len); + + append_0x01_2 (&w[0], &w[1], out_len); + + /** + * reverse message block + */ + + u64 m[8]; + + m[0] = hl32_to_64 (w[15], w[14]); + m[1] = hl32_to_64 (w[13], w[12]); + m[2] = hl32_to_64 (w[11], w[10]); + m[3] = hl32_to_64 (w[ 9], w[ 8]); + m[4] = hl32_to_64 (w[ 7], w[ 6]); + m[5] = hl32_to_64 (w[ 5], w[ 4]); + m[6] = hl32_to_64 (w[ 3], w[ 2]); + m[7] = hl32_to_64 (w[ 1], w[ 0]); + + m[0] = swap_workaround (m[0]); + m[1] = swap_workaround (m[1]); + m[2] = swap_workaround (m[2]); + m[3] = swap_workaround (m[3]); + m[4] = swap_workaround (m[4]); + m[5] = swap_workaround (m[5]); + m[6] = swap_workaround (m[6]); + m[7] = swap_workaround (m[7]); + + // state buffer (hash) + + u64 h[8]; + + h[0] = INITVAL; + h[1] = INITVAL; + h[2] = INITVAL; + h[3] = INITVAL; + h[4] = INITVAL; + h[5] = INITVAL; + h[6] = INITVAL; + h[7] = INITVAL; + + streebog_g (h, m, s_sbob_sl64); + + u64 z[8]; + + z[0] = 0; + z[1] = 0; + z[2] = 0; + z[3] = 0; + z[4] = 0; + z[5] = 0; + z[6] = 0; + z[7] = swap_workaround ((u64) (out_len * 8)); + + streebog_g (h, z, s_sbob_sl64); + streebog_g (h, m, s_sbob_sl64); + + const u32 r0 = l32_from_64 (h[0]); + const u32 r1 = h32_from_64 (h[0]); + const u32 r2 = l32_from_64 (h[1]); + const u32 r3 = h32_from_64 (h[1]); + + #include VECT_COMPARE_S + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m11800_s08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m11800_s16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/nv/m11800_a1.cu b/nv/m11800_a1.cu new file mode 100644 index 0000000000..b251a51c86 --- /dev/null +++ b/nv/m11800_a1.cu @@ -0,0 +1,2785 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _GOST2012_512_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW2 +#define VECT_SIZE1 +#endif + +#define DGST_R0 0 +#define DGST_R1 1 +#define DGST_R2 2 +#define DGST_R3 3 + +#include "include/kernel_functions.c" +#include "types_nv.c" +#include "common_nv.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + + +#define INITVAL 0 + +#define SBOG_LPSti64 \ + s_sbob_sl64[0][(t[0] >> (i * 8)) & 0xff] ^ \ + s_sbob_sl64[1][(t[1] >> (i * 8)) & 0xff] ^ \ + s_sbob_sl64[2][(t[2] >> (i * 8)) & 0xff] ^ \ + s_sbob_sl64[3][(t[3] >> (i * 8)) & 0xff] ^ \ + s_sbob_sl64[4][(t[4] >> (i * 8)) & 0xff] ^ \ + s_sbob_sl64[5][(t[5] >> (i * 8)) & 0xff] ^ \ + s_sbob_sl64[6][(t[6] >> (i * 8)) & 0xff] ^ \ + s_sbob_sl64[7][(t[7] >> (i * 8)) & 0xff] + +// constants + +__device__ __constant__ u64 sbob_sl64[8][256] = +{ + { + 0xd031c397ce553fe6, + 0x16ba5b01b006b525, + 0xa89bade6296e70c8, + 0x6a1f525d77d3435b, + 0x6e103570573dfa0b, + 0x660efb2a17fc95ab, + 0x76327a9e97634bf6, + 0x4bad9d6462458bf5, + 0xf1830caedbc3f748, + 0xc5c8f542669131ff, + 0x95044a1cdc48b0cb, + 0x892962df3cf8b866, + 0xb0b9e208e930c135, + 0xa14fb3f0611a767c, + 0x8d2605f21c160136, + 0xd6b71922fecc549e, + 0x37089438a5907d8b, + 0x0b5da38e5803d49c, + 0x5a5bcc9cea6f3cbc, + 0xedae246d3b73ffe5, + 0xd2b87e0fde22edce, + 0x5e54abb1ca8185ec, + 0x1de7f88fe80561b9, + 0xad5e1a870135a08c, + 0x2f2adbd665cecc76, + 0x5780b5a782f58358, + 0x3edc8a2eede47b3f, + 0xc9d95c3506bee70f, + 0x83be111d6c4e05ee, + 0xa603b90959367410, + 0x103c81b4809fde5d, + 0x2c69b6027d0c774a, + 0x399080d7d5c87953, + 0x09d41e16487406b4, + 0xcdd63b1826505e5f, + 0xf99dc2f49b0298e8, + 0x9cd0540a943cb67f, + 0xbca84b7f891f17c5, + 0x723d1db3b78df2a6, + 0x78aa6e71e73b4f2e, + 0x1433e699a071670d, + 0x84f21be454620782, + 0x98df3327b4d20f2f, + 0xf049dce2d3769e5c, + 0xdb6c60199656eb7a, + 0x648746b2078b4783, + 0x32cd23598dcbadcf, + 0x1ea4955bf0c7da85, + 0xe9a143401b9d46b5, + 0xfd92a5d9bbec21b8, + 0xc8138c790e0b8e1b, + 0x2ee00b9a6d7ba562, + 0xf85712b893b7f1fc, + 0xeb28fed80bea949d, + 0x564a65eb8a40ea4c, + 0x6c9988e8474a2823, + 0x4535898b121d8f2d, + 0xabd8c03231accbf4, + 0xba2e91cab9867cbd, + 0x7960be3def8e263a, + 0x0c11a977602fd6f0, + 0xcb50e1ad16c93527, + 0xeae22e94035ffd89, + 0x2866d12f5de2ce1a, + 0xff1b1841ab9bf390, + 0x9f9339de8cfe0d43, + 0x964727c8c48a0bf7, + 0x524502c6aaae531c, + 0x9b9c5ef3ac10b413, + 0x4fa2fa4942ab32a5, + 0x3f165a62e551122b, + 0xc74148da76e6e3d7, + 0x924840e5e464b2a7, + 0xd372ae43d69784da, + 0x233b72a105e11a86, + 0xa48a04914941a638, + 0xb4b68525c9de7865, + 0xddeabaaca6cf8002, + 0x0a9773c250b6bd88, + 0xc284ffbb5ebd3393, + 0x8ba0df472c8f6a4e, + 0x2aef6cb74d951c32, + 0x427983722a318d41, + 0x73f7cdffbf389bb2, + 0x074c0af9382c026c, + 0x8a6a0f0b243a035a, + 0x6fdae53c5f88931f, + 0xc68b98967e538ac3, + 0x44ff59c71aa8e639, + 0xe2fce0ce439e9229, + 0xa20cde2479d8cd40, + 0x19e89fa2c8ebd8e9, + 0xf446bbcff398270c, + 0x43b3533e2284e455, + 0xd82f0dcd8e945046, + 0x51066f12b26ce820, + 0xe73957af6bc5426d, + 0x081ece5a40c16fa0, + 0x3b193d4fc5bfab7b, + 0x7fe66488df174d42, + 0x0e9814ef705804d8, + 0x8137ac857c39d7c6, + 0xb1733244e185a821, + 0x695c3f896f11f867, + 0xf6cf0657e3eff524, + 0x1aabf276d02963d5, + 0x2da3664e75b91e5e, + 0x0289bd981077d228, + 0x90c1fd7df413608f, + 0x3c5537b6fd93a917, + 0xaa12107e3919a2e0, + 0x0686dab530996b78, + 0xdaa6b0559ee3826e, + 0xc34e2ff756085a87, + 0x6d5358a44fff4137, + 0xfc587595b35948ac, + 0x7ca5095cc7d5f67e, + 0xfb147f6c8b754ac0, + 0xbfeb26ab91ddacf9, + 0x6896efc567a49173, + 0xca9a31e11e7c5c33, + 0xbbe44186b13315a9, + 0x0ddb793b689abfe4, + 0x70b4a02ba7fa208e, + 0xe47a3a7b7307f951, + 0x8cecd5be14a36822, + 0xeeed49b923b144d9, + 0x17708b4db8b3dc31, + 0x6088219f2765fed3, + 0xb3fa8fdcf1f27a09, + 0x910b2d31fca6099b, + 0x0f52c4a378ed6dcc, + 0x50ccbf5ebad98134, + 0x6bd582117f662a4f, + 0x94ce9a50d4fdd9df, + 0x2b25bcfb45207526, + 0x67c42b661f49fcbf, + 0x492420fc723259dd, + 0x03436dd418c2bb3c, + 0x1f6e4517f872b391, + 0xa08563bc69af1f68, + 0xd43ea4baeebb86b6, + 0x01cad04c08b56914, + 0xac94cacb0980c998, + 0x54c3d8739a373864, + 0x26fec5c02dbacac2, + 0xdea9d778be0d3b3e, + 0x040f672d20eeb950, + 0xe5b0ea377bb29045, + 0xf30ab136cbb42560, + 0x62019c0737122cfb, + 0xe86b930c13282fa1, + 0xcc1ceb542ee5374b, + 0x538fd28aa21b3a08, + 0x1b61223ad89c0ac1, + 0x36c24474ad25149f, + 0x7a23d3e9f74c9d06, + 0xbe21f6e79968c5ed, + 0xcf5f868036278c77, + 0xf705d61beb5a9c30, + 0x4d2b47d152dce08d, + 0x5f9e7bfdc234ecf8, + 0x247778583dcd18ea, + 0x867ba67c4415d5aa, + 0x4ce1979d5a698999, + 0x0000000000000000, + 0xec64f42133c696f1, + 0xb57c5569c16b1171, + 0xc1c7926f467f88af, + 0x654d96fe0f3e2e97, + 0x15f936d5a8c40e19, + 0xb8a72c52a9f1ae95, + 0xa9517daa21db19dc, + 0x58d27104fa18ee94, + 0x5918a148f2ad8780, + 0x5cdd1629daf657c4, + 0x8274c15164fb6cfa, + 0xd1fb13dbc6e056f2, + 0x7d6fd910cf609f6a, + 0xb63f38bdd9a9aa4d, + 0x3d9fe7faf526c003, + 0x74bbc706871499de, + 0xdf630734b6b8522a, + 0x3ad3ed03cd0ac26f, + 0xfadeaf2083c023d4, + 0xc00d42234ecae1bb, + 0x8538cba85cd76e96, + 0xc402250e6e2458eb, + 0x47bc3413026a5d05, + 0xafd7a71f114272a4, + 0x978df784cc3f62e3, + 0xb96dfc1ea144c781, + 0x21b2cf391596c8ae, + 0x318e4e8d950916f3, + 0xce9556cc3e92e563, + 0x385a509bdd7d1047, + 0x358129a0b5e7afa3, + 0xe6f387e363702b79, + 0xe0755d5653e94001, + 0x7be903a5fff9f412, + 0x12b53c2c90e80c75, + 0x3307f315857ec4db, + 0x8fafb86a0c61d31e, + 0xd9e5dd8186213952, + 0x77f8aad29fd622e2, + 0x25bda814357871fe, + 0x7571174a8fa1f0ca, + 0x137fec60985d6561, + 0x30449ec19dbc7fe7, + 0xa540d4dd41f4cf2c, + 0xdc206ae0ae7ae916, + 0x5b911cd0e2da55a8, + 0xb2305f90f947131d, + 0x344bf9ecbd52c6b7, + 0x5d17c665d2433ed0, + 0x18224feec05eb1fd, + 0x9e59e992844b6457, + 0x9a568ebfa4a5dd07, + 0xa3c60e68716da454, + 0x7e2cb4c4d7a22456, + 0x87b176304ca0bcbe, + 0x413aeea632f3367d, + 0x9915e36bbc67663b, + 0x40f03eea3a465f69, + 0x1c2d28c3e0b008ad, + 0x4e682a054a1e5bb1, + 0x05c5b761285bd044, + 0xe1bf8d1a5b5c2915, + 0xf2c0617ac3014c74, + 0xb7f5e8f1d11cc359, + 0x63cb4c4b3fa745ef, + 0x9d1a84469c89df6b, + 0xe33630824b2bfb3d, + 0xd5f474f6e60eefa2, + 0xf58c6b83fb2d4e18, + 0x4676e45f0adf3411, + 0x20781f751d23a1ba, + 0xbd629b3381aa7ed1, + 0xae1d775319f71bb0, + 0xfed1c80da32e9a84, + 0x5509083f92825170, + 0x29ac01635557a70e, + 0xa7c9694551831d04, + 0x8e65682604d4ba0a, + 0x11f651f8882ab749, + 0xd77dc96ef6793d8a, + 0xef2799f52b042dcd, + 0x48eef0b07a8730c9, + 0x22f1a2ed0d547392, + 0x6142f1d32fd097c7, + 0x4a674d286af0e2e1, + 0x80fd7cc9748cbed2, + 0x717e7067af4f499a, + 0x938290a9ecd1dbb3, + 0x88e3b293344dd172, + 0x2734158c250fa3d6, + }, + { + 0x7e37e62dfc7d40c3, + 0x776f25a4ee939e5b, + 0xe045c850dd8fb5ad, + 0x86ed5ba711ff1952, + 0xe91d0bd9cf616b35, + 0x37e0ab256e408ffb, + 0x9607f6c031025a7a, + 0x0b02f5e116d23c9d, + 0xf3d8486bfb50650c, + 0x621cff27c40875f5, + 0x7d40cb71fa5fd34a, + 0x6daa6616daa29062, + 0x9f5f354923ec84e2, + 0xec847c3dc507c3b3, + 0x025a3668043ce205, + 0xa8bf9e6c4dac0b19, + 0xfa808be2e9bebb94, + 0xb5b99c5277c74fa3, + 0x78d9bc95f0397bcc, + 0xe332e50cdbad2624, + 0xc74fce129332797e, + 0x1729eceb2ea709ab, + 0xc2d6b9f69954d1f8, + 0x5d898cbfbab8551a, + 0x859a76fb17dd8adb, + 0x1be85886362f7fb5, + 0xf6413f8ff136cd8a, + 0xd3110fa5bbb7e35c, + 0x0a2feed514cc4d11, + 0xe83010edcd7f1ab9, + 0xa1e75de55f42d581, + 0xeede4a55c13b21b6, + 0xf2f5535ff94e1480, + 0x0cc1b46d1888761e, + 0xbce15fdb6529913b, + 0x2d25e8975a7181c2, + 0x71817f1ce2d7a554, + 0x2e52c5cb5c53124b, + 0xf9f7a6beef9c281d, + 0x9e722e7d21f2f56e, + 0xce170d9b81dca7e6, + 0x0e9b82051cb4941b, + 0x1e712f623c49d733, + 0x21e45cfa42f9f7dc, + 0xcb8e7a7f8bba0f60, + 0x8e98831a010fb646, + 0x474ccf0d8e895b23, + 0xa99285584fb27a95, + 0x8cc2b57205335443, + 0x42d5b8e984eff3a5, + 0x012d1b34021e718c, + 0x57a6626aae74180b, + 0xff19fc06e3d81312, + 0x35ba9d4d6a7c6dfe, + 0xc9d44c178f86ed65, + 0x506523e6a02e5288, + 0x03772d5c06229389, + 0x8b01f4fe0b691ec0, + 0xf8dabd8aed825991, + 0x4c4e3aec985b67be, + 0xb10df0827fbf96a9, + 0x6a69279ad4f8dae1, + 0xe78689dcd3d5ff2e, + 0x812e1a2b1fa553d1, + 0xfbad90d6eba0ca18, + 0x1ac543b234310e39, + 0x1604f7df2cb97827, + 0xa6241c6951189f02, + 0x753513cceaaf7c5e, + 0x64f2a59fc84c4efa, + 0x247d2b1e489f5f5a, + 0xdb64d718ab474c48, + 0x79f4a7a1f2270a40, + 0x1573da832a9bebae, + 0x3497867968621c72, + 0x514838d2a2302304, + 0xf0af6537fd72f685, + 0x1d06023e3a6b44ba, + 0x678588c3ce6edd73, + 0x66a893f7cc70acff, + 0xd4d24e29b5eda9df, + 0x3856321470ea6a6c, + 0x07c3418c0e5a4a83, + 0x2bcbb22f5635bacd, + 0x04b46cd00878d90a, + 0x06ee5ab80c443b0f, + 0x3b211f4876c8f9e5, + 0x0958c38912eede98, + 0xd14b39cdbf8b0159, + 0x397b292072f41be0, + 0x87c0409313e168de, + 0xad26e98847caa39f, + 0x4e140c849c6785bb, + 0xd5ff551db7f3d853, + 0xa0ca46d15d5ca40d, + 0xcd6020c787fe346f, + 0x84b76dcf15c3fb57, + 0xdefda0fca121e4ce, + 0x4b8d7b6096012d3d, + 0x9ac642ad298a2c64, + 0x0875d8bd10f0af14, + 0xb357c6ea7b8374ac, + 0x4d6321d89a451632, + 0xeda96709c719b23f, + 0xf76c24bbf328bc06, + 0xc662d526912c08f2, + 0x3ce25ec47892b366, + 0xb978283f6f4f39bd, + 0xc08c8f9e9d6833fd, + 0x4f3917b09e79f437, + 0x593de06fb2c08c10, + 0xd6887841b1d14bda, + 0x19b26eee32139db0, + 0xb494876675d93e2f, + 0x825937771987c058, + 0x90e9ac783d466175, + 0xf1827e03ff6c8709, + 0x945dc0a8353eb87f, + 0x4516f9658ab5b926, + 0x3f9573987eb020ef, + 0xb855330b6d514831, + 0x2ae6a91b542bcb41, + 0x6331e413c6160479, + 0x408f8e8180d311a0, + 0xeff35161c325503a, + 0xd06622f9bd9570d5, + 0x8876d9a20d4b8d49, + 0xa5533135573a0c8b, + 0xe168d364df91c421, + 0xf41b09e7f50a2f8f, + 0x12b09b0f24c1a12d, + 0xda49cc2ca9593dc4, + 0x1f5c34563e57a6bf, + 0x54d14f36a8568b82, + 0xaf7cdfe043f6419a, + 0xea6a2685c943f8bc, + 0xe5dcbfb4d7e91d2b, + 0xb27addde799d0520, + 0x6b443caed6e6ab6d, + 0x7bae91c9f61be845, + 0x3eb868ac7cae5163, + 0x11c7b65322e332a4, + 0xd23c1491b9a992d0, + 0x8fb5982e0311c7ca, + 0x70ac6428e0c9d4d8, + 0x895bc2960f55fcc5, + 0x76423e90ec8defd7, + 0x6ff0507ede9e7267, + 0x3dcf45f07a8cc2ea, + 0x4aa06054941f5cb1, + 0x5810fb5bb0defd9c, + 0x5efea1e3bc9ac693, + 0x6edd4b4adc8003eb, + 0x741808f8e8b10dd2, + 0x145ec1b728859a22, + 0x28bc9f7350172944, + 0x270a06424ebdccd3, + 0x972aedf4331c2bf6, + 0x059977e40a66a886, + 0x2550302a4a812ed6, + 0xdd8a8da0a7037747, + 0xc515f87a970e9b7b, + 0x3023eaa9601ac578, + 0xb7e3aa3a73fbada6, + 0x0fb699311eaae597, + 0x0000000000000000, + 0x310ef19d6204b4f4, + 0x229371a644db6455, + 0x0decaf591a960792, + 0x5ca4978bb8a62496, + 0x1c2b190a38753536, + 0x41a295b582cd602c, + 0x3279dcc16426277d, + 0xc1a194aa9f764271, + 0x139d803b26dfd0a1, + 0xae51c4d441e83016, + 0xd813fa44ad65dfc1, + 0xac0bf2bc45d4d213, + 0x23be6a9246c515d9, + 0x49d74d08923dcf38, + 0x9d05032127d066e7, + 0x2f7fdeff5e4d63c7, + 0xa47e2a0155247d07, + 0x99b16ff12fa8bfed, + 0x4661d4398c972aaf, + 0xdfd0bbc8a33f9542, + 0xdca79694a51d06cb, + 0xb020ebb67da1e725, + 0xba0f0563696daa34, + 0xe4f1a480d5f76ca7, + 0xc438e34e9510eaf7, + 0x939e81243b64f2fc, + 0x8defae46072d25cf, + 0x2c08f3a3586ff04e, + 0xd7a56375b3cf3a56, + 0x20c947ce40e78650, + 0x43f8a3dd86f18229, + 0x568b795eac6a6987, + 0x8003011f1dbb225d, + 0xf53612d3f7145e03, + 0x189f75da300dec3c, + 0x9570db9c3720c9f3, + 0xbb221e576b73dbb8, + 0x72f65240e4f536dd, + 0x443be25188abc8aa, + 0xe21ffe38d9b357a8, + 0xfd43ca6ee7e4f117, + 0xcaa3614b89a47eec, + 0xfe34e732e1c6629e, + 0x83742c431b99b1d4, + 0xcf3a16af83c2d66a, + 0xaae5a8044990e91c, + 0x26271d764ca3bd5f, + 0x91c4b74c3f5810f9, + 0x7c6dd045f841a2c6, + 0x7f1afd19fe63314f, + 0xc8f957238d989ce9, + 0xa709075d5306ee8e, + 0x55fc5402aa48fa0e, + 0x48fa563c9023beb4, + 0x65dfbeabca523f76, + 0x6c877d22d8bce1ee, + 0xcc4d3bf385e045e3, + 0xbebb69b36115733e, + 0x10eaad6720fd4328, + 0xb6ceb10e71e5dc2a, + 0xbdcc44ef6737e0b7, + 0x523f158ea412b08d, + 0x989c74c52db6ce61, + 0x9beb59992b945de8, + 0x8a2cefca09776f4c, + 0xa3bd6b8d5b7e3784, + 0xeb473db1cb5d8930, + 0xc3fba2c29b4aa074, + 0x9c28181525ce176b, + 0x683311f2d0c438e4, + 0x5fd3bad7be84b71f, + 0xfc6ed15ae5fa809b, + 0x36cdb0116c5efe77, + 0x29918447520958c8, + 0xa29070b959604608, + 0x53120ebaa60cc101, + 0x3a0c047c74d68869, + 0x691e0ac6d2da4968, + 0x73db4974e6eb4751, + 0x7a838afdf40599c9, + 0x5a4acd33b4e21f99, + 0x6046c94fc03497f0, + 0xe6ab92e8d1cb8ea2, + 0x3354c7f5663856f1, + 0xd93ee170af7bae4d, + 0x616bd27bc22ae67c, + 0x92b39a10397a8370, + 0xabc8b3304b8e9890, + 0xbf967287630b02b2, + 0x5b67d607b6fc6e15, + }, + { + 0x8ab0a96846e06a6d, + 0x43c7e80b4bf0b33a, + 0x08c9b3546b161ee5, + 0x39f1c235eba990be, + 0xc1bef2376606c7b2, + 0x2c209233614569aa, + 0xeb01523b6fc3289a, + 0x946953ab935acedd, + 0x272838f63e13340e, + 0x8b0455eca12ba052, + 0x77a1b2c4978ff8a2, + 0xa55122ca13e54086, + 0x2276135862d3f1cd, + 0xdb8ddfde08b76cfe, + 0x5d1e12c89e4a178a, + 0x0e56816b03969867, + 0xee5f79953303ed59, + 0xafed748bab78d71d, + 0x6d929f2df93e53ee, + 0xf5d8a8f8ba798c2a, + 0xf619b1698e39cf6b, + 0x95ddaf2f749104e2, + 0xec2a9c80e0886427, + 0xce5c8fd8825b95ea, + 0xc4e0d9993ac60271, + 0x4699c3a5173076f9, + 0x3d1b151f50a29f42, + 0x9ed505ea2bc75946, + 0x34665acfdc7f4b98, + 0x61b1fb53292342f7, + 0xc721c0080e864130, + 0x8693cd1696fd7b74, + 0x872731927136b14b, + 0xd3446c8a63a1721b, + 0x669a35e8a6680e4a, + 0xcab658f239509a16, + 0xa4e5de4ef42e8ab9, + 0x37a7435ee83f08d9, + 0x134e6239e26c7f96, + 0x82791a3c2df67488, + 0x3f6ef00a8329163c, + 0x8e5a7e42fdeb6591, + 0x5caaee4c7981ddb5, + 0x19f234785af1e80d, + 0x255ddde3ed98bd70, + 0x50898a32a99cccac, + 0x28ca4519da4e6656, + 0xae59880f4cb31d22, + 0x0d9798fa37d6db26, + 0x32f968f0b4ffcd1a, + 0xa00f09644f258545, + 0xfa3ad5175e24de72, + 0xf46c547c5db24615, + 0x713e80fbff0f7e20, + 0x7843cf2b73d2aafa, + 0xbd17ea36aedf62b4, + 0xfd111bacd16f92cf, + 0x4abaa7dbc72d67e0, + 0xb3416b5dad49fad3, + 0xbca316b24914a88b, + 0x15d150068aecf914, + 0xe27c1debe31efc40, + 0x4fe48c759beda223, + 0x7edcfd141b522c78, + 0x4e5070f17c26681c, + 0xe696cac15815f3bc, + 0x35d2a64b3bb481a7, + 0x800cff29fe7dfdf6, + 0x1ed9fac3d5baa4b0, + 0x6c2663a91ef599d1, + 0x03c1199134404341, + 0xf7ad4ded69f20554, + 0xcd9d9649b61bd6ab, + 0xc8c3bde7eadb1368, + 0xd131899fb02afb65, + 0x1d18e352e1fae7f1, + 0xda39235aef7ca6c1, + 0xa1bbf5e0a8ee4f7a, + 0x91377805cf9a0b1e, + 0x3138716180bf8e5b, + 0xd9f83acbdb3ce580, + 0x0275e515d38b897e, + 0x472d3f21f0fbbcc6, + 0x2d946eb7868ea395, + 0xba3c248d21942e09, + 0xe7223645bfde3983, + 0xff64feb902e41bb1, + 0xc97741630d10d957, + 0xc3cb1722b58d4ecc, + 0xa27aec719cae0c3b, + 0x99fecb51a48c15fb, + 0x1465ac826d27332b, + 0xe1bd047ad75ebf01, + 0x79f733af941960c5, + 0x672ec96c41a3c475, + 0xc27feba6524684f3, + 0x64efd0fd75e38734, + 0xed9e60040743ae18, + 0xfb8e2993b9ef144d, + 0x38453eb10c625a81, + 0x6978480742355c12, + 0x48cf42ce14a6ee9e, + 0x1cac1fd606312dce, + 0x7b82d6ba4792e9bb, + 0x9d141c7b1f871a07, + 0x5616b80dc11c4a2e, + 0xb849c198f21fa777, + 0x7ca91801c8d9a506, + 0xb1348e487ec273ad, + 0x41b20d1e987b3a44, + 0x7460ab55a3cfbbe3, + 0x84e628034576f20a, + 0x1b87d16d897a6173, + 0x0fe27defe45d5258, + 0x83cde6b8ca3dbeb7, + 0x0c23647ed01d1119, + 0x7a362a3ea0592384, + 0xb61f40f3f1893f10, + 0x75d457d1440471dc, + 0x4558da34237035b8, + 0xdca6116587fc2043, + 0x8d9b67d3c9ab26d0, + 0x2b0b5c88ee0e2517, + 0x6fe77a382ab5da90, + 0x269cc472d9d8fe31, + 0x63c41e46faa8cb89, + 0xb7abbc771642f52f, + 0x7d1de4852f126f39, + 0xa8c6ba3024339ba0, + 0x600507d7cee888c8, + 0x8fee82c61a20afae, + 0x57a2448926d78011, + 0xfca5e72836a458f0, + 0x072bcebb8f4b4cbd, + 0x497bbe4af36d24a1, + 0x3cafe99bb769557d, + 0x12fa9ebd05a7b5a9, + 0xe8c04baa5b836bdb, + 0x4273148fac3b7905, + 0x908384812851c121, + 0xe557d3506c55b0fd, + 0x72ff996acb4f3d61, + 0x3eda0c8e64e2dc03, + 0xf0868356e6b949e9, + 0x04ead72abb0b0ffc, + 0x17a4b5135967706a, + 0xe3c8e16f04d5367f, + 0xf84f30028daf570c, + 0x1846c8fcbd3a2232, + 0x5b8120f7f6ca9108, + 0xd46fa231ecea3ea6, + 0x334d947453340725, + 0x58403966c28ad249, + 0xbed6f3a79a9f21f5, + 0x68ccb483a5fe962d, + 0xd085751b57e1315a, + 0xfed0023de52fd18e, + 0x4b0e5b5f20e6addf, + 0x1a332de96eb1ab4c, + 0xa3ce10f57b65c604, + 0x108f7ba8d62c3cd7, + 0xab07a3a11073d8e1, + 0x6b0dad1291bed56c, + 0xf2f366433532c097, + 0x2e557726b2cee0d4, + 0x0000000000000000, + 0xcb02a476de9b5029, + 0xe4e32fd48b9e7ac2, + 0x734b65ee2c84f75e, + 0x6e5386bccd7e10af, + 0x01b4fc84e7cbca3f, + 0xcfe8735c65905fd5, + 0x3613bfda0ff4c2e6, + 0x113b872c31e7f6e8, + 0x2fe18ba255052aeb, + 0xe974b72ebc48a1e4, + 0x0abc5641b89d979b, + 0xb46aa5e62202b66e, + 0x44ec26b0c4bbff87, + 0xa6903b5b27a503c7, + 0x7f680190fc99e647, + 0x97a84a3aa71a8d9c, + 0xdd12ede16037ea7c, + 0xc554251ddd0dc84e, + 0x88c54c7d956be313, + 0x4d91696048662b5d, + 0xb08072cc9909b992, + 0xb5de5962c5c97c51, + 0x81b803ad19b637c9, + 0xb2f597d94a8230ec, + 0x0b08aac55f565da4, + 0xf1327fd2017283d6, + 0xad98919e78f35e63, + 0x6ab9519676751f53, + 0x24e921670a53774f, + 0xb9fd3d1c15d46d48, + 0x92f66194fbda485f, + 0x5a35dc7311015b37, + 0xded3f4705477a93d, + 0xc00a0eb381cd0d8d, + 0xbb88d809c65fe436, + 0x16104997beacba55, + 0x21b70ac95693b28c, + 0x59f4c5e225411876, + 0xd5db5eb50b21f499, + 0x55d7a19cf55c096f, + 0xa97246b4c3f8519f, + 0x8552d487a2bd3835, + 0x54635d181297c350, + 0x23c2efdc85183bf2, + 0x9f61f96ecc0c9379, + 0x534893a39ddc8fed, + 0x5edf0b59aa0a54cb, + 0xac2c6d1a9f38945c, + 0xd7aebba0d8aa7de7, + 0x2abfa00c09c5ef28, + 0xd84cc64f3cf72fbf, + 0x2003f64db15878b3, + 0xa724c7dfc06ec9f8, + 0x069f323f68808682, + 0xcc296acd51d01c94, + 0x055e2bae5cc0c5c3, + 0x6270e2c21d6301b6, + 0x3b842720382219c0, + 0xd2f0900e846ab824, + 0x52fc6f277a1745d2, + 0xc6953c8ce94d8b0f, + 0xe009f8fe3095753e, + 0x655b2c7992284d0b, + 0x984a37d54347dfc4, + 0xeab5aebf8808e2a5, + 0x9a3fd2c090cc56ba, + 0x9ca0e0fff84cd038, + 0x4c2595e4afade162, + 0xdf6708f4b3bc6302, + 0xbf620f237d54ebca, + 0x93429d101c118260, + 0x097d4fd08cddd4da, + 0x8c2f9b572e60ecef, + 0x708a7c7f18c4b41f, + 0x3a30dba4dfe9d3ff, + 0x4006f19a7fb0f07b, + 0x5f6bf7dd4dc19ef4, + 0x1f6d064732716e8f, + 0xf9fbcc866a649d33, + 0x308c8de567744464, + 0x8971b0f972a0292c, + 0xd61a47243f61b7d8, + 0xefeb8511d4c82766, + 0x961cb6be40d147a3, + 0xaab35f25f7b812de, + 0x76154e407044329d, + 0x513d76b64e570693, + 0xf3479ac7d2f90aa8, + 0x9b8b2e4477079c85, + 0x297eb99d3d85ac69, + }, + { + 0x3ef29d249b2c0a19, + 0xe9e16322b6f8622f, + 0x5536994047757f7a, + 0x9f4d56d5a47b0b33, + 0x822567466aa1174c, + 0xb8f5057deb082fb2, + 0xcc48c10bf4475f53, + 0x373088d4275dec3a, + 0x968f4325180aed10, + 0x173d232cf7016151, + 0xae4ed09f946fcc13, + 0xfd4b4741c4539873, + 0x1b5b3f0dd9933765, + 0x2ffcb0967b644052, + 0xe02376d20a89840c, + 0xa3ae3a70329b18d7, + 0x419cbd2335de8526, + 0xfafebf115b7c3199, + 0x0397074f85aa9b0d, + 0xc58ad4fb4836b970, + 0xbec60be3fc4104a8, + 0x1eff36dc4b708772, + 0x131fdc33ed8453b6, + 0x0844e33e341764d3, + 0x0ff11b6eab38cd39, + 0x64351f0a7761b85a, + 0x3b5694f509cfba0e, + 0x30857084b87245d0, + 0x47afb3bd2297ae3c, + 0xf2ba5c2f6f6b554a, + 0x74bdc4761f4f70e1, + 0xcfdfc64471edc45e, + 0xe610784c1dc0af16, + 0x7aca29d63c113f28, + 0x2ded411776a859af, + 0xac5f211e99a3d5ee, + 0xd484f949a87ef33b, + 0x3ce36ca596e013e4, + 0xd120f0983a9d432c, + 0x6bc40464dc597563, + 0x69d5f5e5d1956c9e, + 0x9ae95f043698bb24, + 0xc9ecc8da66a4ef44, + 0xd69508c8a5b2eac6, + 0xc40c2235c0503b80, + 0x38c193ba8c652103, + 0x1ceec75d46bc9e8f, + 0xd331011937515ad1, + 0xd8e2e56886eca50f, + 0xb137108d5779c991, + 0x709f3b6905ca4206, + 0x4feb50831680caef, + 0xec456af3241bd238, + 0x58d673afe181abbe, + 0x242f54e7cad9bf8c, + 0x0211f1810dcc19fd, + 0x90bc4dbb0f43c60a, + 0x9518446a9da0761d, + 0xa1bfcbf13f57012a, + 0x2bde4f8961e172b5, + 0x27b853a84f732481, + 0xb0b1e643df1f4b61, + 0x18cc38425c39ac68, + 0xd2b7f7d7bf37d821, + 0x3103864a3014c720, + 0x14aa246372abfa5c, + 0x6e600db54ebac574, + 0x394765740403a3f3, + 0x09c215f0bc71e623, + 0x2a58b947e987f045, + 0x7b4cdf18b477bdd8, + 0x9709b5eb906c6fe0, + 0x73083c268060d90b, + 0xfedc400e41f9037e, + 0x284948c6e44be9b8, + 0x728ecae808065bfb, + 0x06330e9e17492b1a, + 0x5950856169e7294e, + 0xbae4f4fce6c4364f, + 0xca7bcf95e30e7449, + 0x7d7fd186a33e96c2, + 0x52836110d85ad690, + 0x4dfaa1021b4cd312, + 0x913abb75872544fa, + 0xdd46ecb9140f1518, + 0x3d659a6b1e869114, + 0xc23f2cabd719109a, + 0xd713fe062dd46836, + 0xd0a60656b2fbc1dc, + 0x221c5a79dd909496, + 0xefd26dbca1b14935, + 0x0e77eda0235e4fc9, + 0xcbfd395b6b68f6b9, + 0x0de0eaefa6f4d4c4, + 0x0422ff1f1a8532e7, + 0xf969b85eded6aa94, + 0x7f6e2007aef28f3f, + 0x3ad0623b81a938fe, + 0x6624ee8b7aada1a7, + 0xb682e8ddc856607b, + 0xa78cc56f281e2a30, + 0xc79b257a45faa08d, + 0x5b4174e0642b30b3, + 0x5f638bff7eae0254, + 0x4bc9af9c0c05f808, + 0xce59308af98b46ae, + 0x8fc58da9cc55c388, + 0x803496c7676d0eb1, + 0xf33caae1e70dd7ba, + 0xbb6202326ea2b4bf, + 0xd5020f87201871cb, + 0x9d5ca754a9b712ce, + 0x841669d87de83c56, + 0x8a6184785eb6739f, + 0x420bba6cb0741e2b, + 0xf12d5b60eac1ce47, + 0x76ac35f71283691c, + 0x2c6bb7d9fecedb5f, + 0xfccdb18f4c351a83, + 0x1f79c012c3160582, + 0xf0abadae62a74cb7, + 0xe1a5801c82ef06fc, + 0x67a21845f2cb2357, + 0x5114665f5df04d9d, + 0xbf40fd2d74278658, + 0xa0393d3fb73183da, + 0x05a409d192e3b017, + 0xa9fb28cf0b4065f9, + 0x25a9a22942bf3d7c, + 0xdb75e22703463e02, + 0xb326e10c5ab5d06c, + 0xe7968e8295a62de6, + 0xb973f3b3636ead42, + 0xdf571d3819c30ce5, + 0xee549b7229d7cbc5, + 0x12992afd65e2d146, + 0xf8ef4e9056b02864, + 0xb7041e134030e28b, + 0xc02edd2adad50967, + 0x932b4af48ae95d07, + 0x6fe6fb7bc6dc4784, + 0x239aacb755f61666, + 0x401a4bedbdb807d6, + 0x485ea8d389af6305, + 0xa41bc220adb4b13d, + 0x753b32b89729f211, + 0x997e584bb3322029, + 0x1d683193ceda1c7f, + 0xff5ab6c0c99f818e, + 0x16bbd5e27f67e3a1, + 0xa59d34ee25d233cd, + 0x98f8ae853b54a2d9, + 0x6df70afacb105e79, + 0x795d2e99b9bba425, + 0x8e437b6744334178, + 0x0186f6ce886682f0, + 0xebf092a3bb347bd2, + 0xbcd7fa62f18d1d55, + 0xadd9d7d011c5571e, + 0x0bd3e471b1bdffde, + 0xaa6c2f808eeafef4, + 0x5ee57d31f6c880a4, + 0xf50fa47ff044fca0, + 0x1addc9c351f5b595, + 0xea76646d3352f922, + 0x0000000000000000, + 0x85909f16f58ebea6, + 0x46294573aaf12ccc, + 0x0a5512bf39db7d2e, + 0x78dbd85731dd26d5, + 0x29cfbe086c2d6b48, + 0x218b5d36583a0f9b, + 0x152cd2adfacd78ac, + 0x83a39188e2c795bc, + 0xc3b9da655f7f926a, + 0x9ecba01b2c1d89c3, + 0x07b5f8509f2fa9ea, + 0x7ee8d6c926940dcf, + 0x36b67e1aaf3b6eca, + 0x86079859702425ab, + 0xfb7849dfd31ab369, + 0x4c7c57cc932a51e2, + 0xd96413a60e8a27ff, + 0x263ea566c715a671, + 0x6c71fc344376dc89, + 0x4a4f595284637af8, + 0xdaf314e98b20bcf2, + 0x572768c14ab96687, + 0x1088db7c682ec8bb, + 0x887075f9537a6a62, + 0x2e7a4658f302c2a2, + 0x619116dbe582084d, + 0xa87dde018326e709, + 0xdcc01a779c6997e8, + 0xedc39c3dac7d50c8, + 0xa60a33a1a078a8c0, + 0xc1a82be452b38b97, + 0x3f746bea134a88e9, + 0xa228ccbebafd9a27, + 0xabead94e068c7c04, + 0xf48952b178227e50, + 0x5cf48cb0fb049959, + 0x6017e0156de48abd, + 0x4438b4f2a73d3531, + 0x8c528ae649ff5885, + 0xb515ef924dfcfb76, + 0x0c661c212e925634, + 0xb493195cc59a7986, + 0x9cda519a21d1903e, + 0x32948105b5be5c2d, + 0x194ace8cd45f2e98, + 0x438d4ca238129cdb, + 0x9b6fa9cabefe39d4, + 0x81b26009ef0b8c41, + 0xded1ebf691a58e15, + 0x4e6da64d9ee6481f, + 0x54b06f8ecf13fd8a, + 0x49d85e1d01c9e1f5, + 0xafc826511c094ee3, + 0xf698a33075ee67ad, + 0x5ac7822eec4db243, + 0x8dd47c28c199da75, + 0x89f68337db1ce892, + 0xcdce37c57c21dda3, + 0x530597de503c5460, + 0x6a42f2aa543ff793, + 0x5d727a7e73621ba9, + 0xe232875307459df1, + 0x56a19e0fc2dfe477, + 0xc61dd3b4cd9c227d, + 0xe5877f03986a341b, + 0x949eb2a415c6f4ed, + 0x6206119460289340, + 0x6380e75ae84e11b0, + 0x8be772b6d6d0f16f, + 0x50929091d596cf6d, + 0xe86795ec3e9ee0df, + 0x7cf927482b581432, + 0xc86a3e14eec26db4, + 0x7119cda78dacc0f6, + 0xe40189cd100cb6eb, + 0x92adbc3a028fdff7, + 0xb2a017c2d2d3529c, + 0x200dabf8d05c8d6b, + 0x34a78f9ba2f77737, + 0xe3b4719d8f231f01, + 0x45be423c2f5bb7c1, + 0xf71e55fefd88e55d, + 0x6853032b59f3ee6e, + 0x65b3e9c4ff073aaa, + 0x772ac3399ae5ebec, + 0x87816e97f842a75b, + 0x110e2db2e0484a4b, + 0x331277cb3dd8dedd, + 0xbd510cac79eb9fa5, + 0x352179552a91f5c7, + }, + { + 0x05ba7bc82c9b3220, + 0x31a54665f8b65e4f, + 0xb1b651f77547f4d4, + 0x8bfa0d857ba46682, + 0x85a96c5aa16a98bb, + 0x990faef908eb79c9, + 0xa15e37a247f4a62d, + 0x76857dcd5d27741e, + 0xf8c50b800a1820bc, + 0xbe65dcb201f7a2b4, + 0x666d1b986f9426e7, + 0x4cc921bf53c4e648, + 0x95410a0f93d9ca42, + 0x20cdccaa647ba4ef, + 0x429a4060890a1871, + 0x0c4ea4f69b32b38b, + 0xccda362dde354cd3, + 0x96dc23bc7c5b2fa9, + 0xc309bb68aa851ab3, + 0xd26131a73648e013, + 0x021dc52941fc4db2, + 0xcd5adab7704be48a, + 0xa77965d984ed71e6, + 0x32386fd61734bba4, + 0xe82d6dd538ab7245, + 0x5c2147ea6177b4b1, + 0x5da1ab70cf091ce8, + 0xac907fce72b8bdff, + 0x57c85dfd972278a8, + 0xa4e44c6a6b6f940d, + 0x3851995b4f1fdfe4, + 0x62578ccaed71bc9e, + 0xd9882bb0c01d2c0a, + 0x917b9d5d113c503b, + 0xa2c31e11a87643c6, + 0xe463c923a399c1ce, + 0xf71686c57ea876dc, + 0x87b4a973e096d509, + 0xaf0d567d9d3a5814, + 0xb40c2a3f59dcc6f4, + 0x3602f88495d121dd, + 0xd3e1dd3d9836484a, + 0xf945e71aa46688e5, + 0x7518547eb2a591f5, + 0x9366587450c01d89, + 0x9ea81018658c065b, + 0x4f54080cbc4603a3, + 0x2d0384c65137bf3d, + 0xdc325078ec861e2a, + 0xea30a8fc79573ff7, + 0x214d2030ca050cb6, + 0x65f0322b8016c30c, + 0x69be96dd1b247087, + 0xdb95ee9981e161b8, + 0xd1fc1814d9ca05f8, + 0x820ed2bbcc0de729, + 0x63d76050430f14c7, + 0x3bccb0e8a09d3a0f, + 0x8e40764d573f54a2, + 0x39d175c1e16177bd, + 0x12f5a37c734f1f4b, + 0xab37c12f1fdfc26d, + 0x5648b167395cd0f1, + 0x6c04ed1537bf42a7, + 0xed97161d14304065, + 0x7d6c67daab72b807, + 0xec17fa87ba4ee83c, + 0xdfaf79cb0304fbc1, + 0x733f060571bc463e, + 0x78d61c1287e98a27, + 0xd07cf48e77b4ada1, + 0xb9c262536c90dd26, + 0xe2449b5860801605, + 0x8fc09ad7f941fcfb, + 0xfad8cea94be46d0e, + 0xa343f28b0608eb9f, + 0x9b126bd04917347b, + 0x9a92874ae7699c22, + 0x1b017c42c4e69ee0, + 0x3a4c5c720ee39256, + 0x4b6e9f5e3ea399da, + 0x6ba353f45ad83d35, + 0xe7fee0904c1b2425, + 0x22d009832587e95d, + 0x842980c00f1430e2, + 0xc6b3c0a0861e2893, + 0x087433a419d729f2, + 0x341f3dadd42d6c6f, + 0xee0a3faefbb2a58e, + 0x4aee73c490dd3183, + 0xaab72db5b1a16a34, + 0xa92a04065e238fdf, + 0x7b4b35a1686b6fcc, + 0x6a23bf6ef4a6956c, + 0x191cb96b851ad352, + 0x55d598d4d6de351a, + 0xc9604de5f2ae7ef3, + 0x1ca6c2a3a981e172, + 0xde2f9551ad7a5398, + 0x3025aaff56c8f616, + 0x15521d9d1e2860d9, + 0x506fe31cfa45073a, + 0x189c55f12b647b0b, + 0x0180ec9aae7ea859, + 0x7cec8b40050c105e, + 0x2350e5198bf94104, + 0xef8ad33455cc0dd7, + 0x07a7bee16d677f92, + 0xe5e325b90de76997, + 0x5a061591a26e637a, + 0xb611ef1618208b46, + 0x09f4df3eb7a981ab, + 0x1ebb078ae87dacc0, + 0xb791038cb65e231f, + 0x0fd38d4574b05660, + 0x67edf702c1ea8ebe, + 0xba5f4be0831238cd, + 0xe3c477c2cefebe5c, + 0x0dce486c354c1bd2, + 0x8c5db36416c31910, + 0x26ea9ed1a7627324, + 0x039d29b3ef82e5eb, + 0x9f28fc82cbf2ae02, + 0xa8aae89cf05d2786, + 0x431aacfa2774b028, + 0xcf471f9e31b7a938, + 0x581bd0b8e3922ec8, + 0xbc78199b400bef06, + 0x90fb71c7bf42f862, + 0x1f3beb1046030499, + 0x683e7a47b55ad8de, + 0x988f4263a695d190, + 0xd808c72a6e638453, + 0x0627527bc319d7cb, + 0xebb04466d72997ae, + 0xe67e0c0ae2658c7c, + 0x14d2f107b056c880, + 0x7122c32c30400b8c, + 0x8a7ae11fd5dacedb, + 0xa0dedb38e98a0e74, + 0xad109354dcc615a6, + 0x0be91a17f655cc19, + 0x8ddd5ffeb8bdb149, + 0xbfe53028af890aed, + 0xd65ba6f5b4ad7a6a, + 0x7956f0882997227e, + 0x10e8665532b352f9, + 0x0e5361dfdacefe39, + 0xcec7f3049fc90161, + 0xff62b561677f5f2e, + 0x975ccf26d22587f0, + 0x51ef0f86543baf63, + 0x2f1e41ef10cbf28f, + 0x52722635bbb94a88, + 0xae8dbae73344f04d, + 0x410769d36688fd9a, + 0xb3ab94de34bbb966, + 0x801317928df1aa9b, + 0xa564a0f0c5113c54, + 0xf131d4bebdb1a117, + 0x7f71a2f3ea8ef5b5, + 0x40878549c8f655c3, + 0x7ef14e6944f05dec, + 0xd44663dcf55137d8, + 0xf2acfd0d523344fc, + 0x0000000000000000, + 0x5fbc6e598ef5515a, + 0x16cf342ef1aa8532, + 0xb036bd6ddb395c8d, + 0x13754fe6dd31b712, + 0xbbdfa77a2d6c9094, + 0x89e7c8ac3a582b30, + 0x3c6b0e09cdfa459d, + 0xc4ae0589c7e26521, + 0x49735a777f5fd468, + 0xcafd64561d2c9b18, + 0xda1502032f9fc9e1, + 0x8867243694268369, + 0x3782141e3baf8984, + 0x9cb5d53124704be9, + 0xd7db4a6f1ad3d233, + 0xa6f989432a93d9bf, + 0x9d3539ab8a0ee3b0, + 0x53f2caaf15c7e2d1, + 0x6e19283c76430f15, + 0x3debe2936384edc4, + 0x5e3c82c3208bf903, + 0x33b8834cb94a13fd, + 0x6470deb12e686b55, + 0x359fd1377a53c436, + 0x61caa57902f35975, + 0x043a975282e59a79, + 0xfd7f70482683129c, + 0xc52ee913699ccd78, + 0x28b9ff0e7dac8d1d, + 0x5455744e78a09d43, + 0xcb7d88ccb3523341, + 0x44bd121b4a13cfba, + 0x4d49cd25fdba4e11, + 0x3e76cb208c06082f, + 0x3ff627ba2278a076, + 0xc28957f204fbb2ea, + 0x453dfe81e46d67e3, + 0x94c1e6953da7621b, + 0x2c83685cff491764, + 0xf32c1197fc4deca5, + 0x2b24d6bd922e68f6, + 0xb22b78449ac5113f, + 0x48f3b6edd1217c31, + 0x2e9ead75beb55ad6, + 0x174fd8b45fd42d6b, + 0x4ed4e4961238abfa, + 0x92e6b4eefebeb5d0, + 0x46a0d7320bef8208, + 0x47203ba8a5912a51, + 0x24f75bf8e69e3e96, + 0xf0b1382413cf094e, + 0xfee259fbc901f777, + 0x276a724b091cdb7d, + 0xbdf8f501ee75475f, + 0x599b3c224dec8691, + 0x6d84018f99c1eafe, + 0x7498b8e41cdb39ac, + 0xe0595e71217c5bb7, + 0x2aa43a273c50c0af, + 0xf50b43ec3f543b6e, + 0x838e3e2162734f70, + 0xc09492db4507ff58, + 0x72bfea9fdfc2ee67, + 0x11688acf9ccdfaa0, + 0x1a8190d86a9836b9, + 0x7acbd93bc615c795, + 0xc7332c3a286080ca, + 0x863445e94ee87d50, + 0xf6966a5fd0d6de85, + 0xe9ad814f96d5da1c, + 0x70a22fb69e3ea3d5, + 0x0a69f68d582b6440, + 0xb8428ec9c2ee757f, + 0x604a49e3ac8df12c, + 0x5b86f90b0c10cb23, + 0xe1d9b2eb8f02f3ee, + 0x29391394d3d22544, + 0xc8e0a17f5cd0d6aa, + 0xb58cc6a5f7a26ead, + 0x8193fb08238f02c2, + 0xd5c68f465b2f9f81, + 0xfcff9cd288fdbac5, + 0x77059157f359dc47, + 0x1d262e3907ff492b, + 0xfb582233e59ac557, + 0xddb2bce242f8b673, + 0x2577b76248e096cf, + 0x6f99c4a6d83da74c, + 0xc1147e41eb795701, + 0xf48baf76912a9337, + }, + { + 0x45b268a93acde4cc, + 0xaf7f0be884549d08, + 0x048354b3c1468263, + 0x925435c2c80efed2, + 0xee4e37f27fdffba7, + 0x167a33920c60f14d, + 0xfb123b52ea03e584, + 0x4a0cab53fdbb9007, + 0x9deaf6380f788a19, + 0xcb48ec558f0cb32a, + 0xb59dc4b2d6fef7e0, + 0xdcdbca22f4f3ecb6, + 0x11df5813549a9c40, + 0xe33fdedf568aced3, + 0xa0c1c8124322e9c3, + 0x07a56b8158fa6d0d, + 0x77279579b1e1f3dd, + 0xd9b18b74422ac004, + 0xb8ec2d9fffabc294, + 0xf4acf8a82d75914f, + 0x7bbf69b1ef2b6878, + 0xc4f62faf487ac7e1, + 0x76ce809cc67e5d0c, + 0x6711d88f92e4c14c, + 0x627b99d9243dedfe, + 0x234aa5c3dfb68b51, + 0x909b1f15262dbf6d, + 0x4f66ea054b62bcb5, + 0x1ae2cf5a52aa6ae8, + 0xbea053fbd0ce0148, + 0xed6808c0e66314c9, + 0x43fe16cd15a82710, + 0xcd049231a06970f6, + 0xe7bc8a6c97cc4cb0, + 0x337ce835fcb3b9c0, + 0x65def2587cc780f3, + 0x52214ede4132bb50, + 0x95f15e4390f493df, + 0x870839625dd2e0f1, + 0x41313c1afb8b66af, + 0x91720af051b211bc, + 0x477d427ed4eea573, + 0x2e3b4ceef6e3be25, + 0x82627834eb0bcc43, + 0x9c03e3dd78e724c8, + 0x2877328ad9867df9, + 0x14b51945e243b0f2, + 0x574b0f88f7eb97e2, + 0x88b6fa989aa4943a, + 0x19c4f068cb168586, + 0x50ee6409af11faef, + 0x7df317d5c04eaba4, + 0x7a567c5498b4c6a9, + 0xb6bbfb804f42188e, + 0x3cc22bcf3bc5cd0b, + 0xd04336eaaa397713, + 0xf02fac1bec33132c, + 0x2506dba7f0d3488d, + 0xd7e65d6bf2c31a1e, + 0x5eb9b2161ff820f5, + 0x842e0650c46e0f9f, + 0x716beb1d9e843001, + 0xa933758cab315ed4, + 0x3fe414fda2792265, + 0x27c9f1701ef00932, + 0x73a4c1ca70a771be, + 0x94184ba6e76b3d0e, + 0x40d829ff8c14c87e, + 0x0fbec3fac77674cb, + 0x3616a9634a6a9572, + 0x8f139119c25ef937, + 0xf545ed4d5aea3f9e, + 0xe802499650ba387b, + 0x6437e7bd0b582e22, + 0xe6559f89e053e261, + 0x80ad52e305288dfc, + 0x6dc55a23e34b9935, + 0xde14e0f51ad0ad09, + 0xc6390578a659865e, + 0x96d7617109487cb1, + 0xe2d6cb3a21156002, + 0x01e915e5779faed1, + 0xadb0213f6a77dcb7, + 0x9880b76eb9a1a6ab, + 0x5d9f8d248644cf9b, + 0xfd5e4536c5662658, + 0xf1c6b9fe9bacbdfd, + 0xeacd6341be9979c4, + 0xefa7221708405576, + 0x510771ecd88e543e, + 0xc2ba51cb671f043d, + 0x0ad482ac71af5879, + 0xfe787a045cdac936, + 0xb238af338e049aed, + 0xbd866cc94972ee26, + 0x615da6ebbd810290, + 0x3295fdd08b2c1711, + 0xf834046073bf0aea, + 0xf3099329758ffc42, + 0x1caeb13e7dcfa934, + 0xba2307481188832b, + 0x24efce42874ce65c, + 0x0e57d61fb0e9da1a, + 0xb3d1bad6f99b343c, + 0xc0757b1c893c4582, + 0x2b510db8403a9297, + 0x5c7698c1f1db614a, + 0x3e0d0118d5e68cb4, + 0xd60f488e855cb4cf, + 0xae961e0df3cb33d9, + 0x3a8e55ab14a00ed7, + 0x42170328623789c1, + 0x838b6dd19c946292, + 0x895fef7ded3b3aeb, + 0xcfcbb8e64e4a3149, + 0x064c7e642f65c3dc, + 0x3d2b3e2a4c5a63da, + 0x5bd3f340a9210c47, + 0xb474d157a1615931, + 0xac5934da1de87266, + 0x6ee365117af7765b, + 0xc86ed36716b05c44, + 0x9ba6885c201d49c5, + 0xb905387a88346c45, + 0x131072c4bab9ddff, + 0xbf49461ea751af99, + 0xd52977bc1ce05ba1, + 0xb0f785e46027db52, + 0x546d30ba6e57788c, + 0x305ad707650f56ae, + 0xc987c682612ff295, + 0xa5ab8944f5fbc571, + 0x7ed528e759f244ca, + 0x8ddcbbce2c7db888, + 0xaa154abe328db1ba, + 0x1e619be993ece88b, + 0x09f2bd9ee813b717, + 0x7401aa4b285d1cb3, + 0x21858f143195caee, + 0x48c381841398d1b8, + 0xfcb750d3b2f98889, + 0x39a86a998d1ce1b9, + 0x1f888e0ce473465a, + 0x7899568376978716, + 0x02cf2ad7ee2341bf, + 0x85c713b5b3f1a14e, + 0xff916fe12b4567e7, + 0x7c1a0230b7d10575, + 0x0c98fcc85eca9ba5, + 0xa3e7f720da9e06ad, + 0x6a6031a2bbb1f438, + 0x973e74947ed7d260, + 0x2cf4663918c0ff9a, + 0x5f50a7f368678e24, + 0x34d983b4a449d4cd, + 0x68af1b755592b587, + 0x7f3c3d022e6dea1b, + 0xabfc5f5b45121f6b, + 0x0d71e92d29553574, + 0xdffdf5106d4f03d8, + 0x081ba87b9f8c19c6, + 0xdb7ea1a3ac0981bb, + 0xbbca12ad66172dfa, + 0x79704366010829c7, + 0x179326777bff5f9c, + 0x0000000000000000, + 0xeb2476a4c906d715, + 0x724dd42f0738df6f, + 0xb752ee6538ddb65f, + 0x37ffbc863df53ba3, + 0x8efa84fcb5c157e6, + 0xe9eb5c73272596aa, + 0x1b0bdabf2535c439, + 0x86e12c872a4d4e20, + 0x9969a28bce3e087a, + 0xfafb2eb79d9c4b55, + 0x056a4156b6d92cb2, + 0x5a3ae6a5debea296, + 0x22a3b026a8292580, + 0x53c85b3b36ad1581, + 0xb11e900117b87583, + 0xc51f3a4a3fe56930, + 0xe019e1edcf3621bd, + 0xec811d2591fcba18, + 0x445b7d4c4d524a1d, + 0xa8da6069dcaef005, + 0x58f5cc72309de329, + 0xd4c062596b7ff570, + 0xce22ad0339d59f98, + 0x591cd99747024df8, + 0x8b90c5aa03187b54, + 0xf663d27fc356d0f0, + 0xd8589e9135b56ed5, + 0x35309651d3d67a1c, + 0x12f96721cd26732e, + 0xd28c1c3d441a36ac, + 0x492a946164077f69, + 0x2d1d73dc6f5f514b, + 0x6f0a70f40d68d88a, + 0x60b4b30eca1eac41, + 0xd36509d83385987d, + 0x0b3d97490630f6a8, + 0x9eccc90a96c46577, + 0xa20ee2c5ad01a87c, + 0xe49ab55e0e70a3de, + 0xa4429ca182646ba0, + 0xda97b446db962f6a, + 0xcced87d4d7f6de27, + 0x2ab8185d37a53c46, + 0x9f25dcefe15bcba6, + 0xc19c6ef9fea3eb53, + 0xa764a3931bd884ce, + 0x2fd2590b817c10f4, + 0x56a21a6d80743933, + 0xe573a0bb79ef0d0f, + 0x155c0ca095dc1e23, + 0x6c2c4fc694d437e4, + 0x10364df623053291, + 0xdd32dfc7836c4267, + 0x03263f3299bcef6e, + 0x66f8cd6ae57b6f9d, + 0x8c35ae2b5be21659, + 0x31b3c2e21290f87f, + 0x93bd2027bf915003, + 0x69460e90220d1b56, + 0x299e276fae19d328, + 0x63928c3c53a2432f, + 0x7082fef8e91b9ed0, + 0xbc6f792c3eed40f7, + 0x4c40d537d2de53db, + 0x75e8bfae5fc2b262, + 0x4da9c0d2a541fd0a, + 0x4e8fffe03cfd1264, + 0x2620e495696fa7e3, + 0xe1f0f408b8a98f6c, + 0xd1aa230fdda6d9c2, + 0xc7d0109dd1c6288f, + 0x8a79d04f7487d585, + 0x4694579ba3710ba2, + 0x38417f7cfa834f68, + 0x1d47a4db0a5007e5, + 0x206c9af1460a643f, + 0xa128ddf734bd4712, + 0x8144470672b7232d, + 0xf2e086cc02105293, + 0x182de58dbc892b57, + 0xcaa1f9b0f8931dfb, + 0x6b892447cc2e5ae9, + 0xf9dd11850420a43b, + 0x4be5beb68a243ed6, + 0x5584255f19c8d65d, + 0x3b67404e633fa006, + 0xa68db6766c472a1f, + 0xf78ac79ab4c97e21, + 0xc353442e1080aaec, + 0x9a4f9db95782e714, + }, + { + 0xc811a8058c3f55de, + 0x65f5b43196b50619, + 0xf74f96b1d6706e43, + 0x859d1e8bcb43d336, + 0x5aab8a85ccfa3d84, + 0xf9c7bf99c295fcfd, + 0xa21fd5a1de4b630f, + 0xcdb3ef763b8b456d, + 0x803f59f87cf7c385, + 0xb27c73be5f31913c, + 0x98e3ac6633b04821, + 0xbf61674c26b8f818, + 0x0ffbc995c4c130c8, + 0xaaa0862010761a98, + 0x6057f342210116aa, + 0xf63c760c0654cc35, + 0x2ddb45cc667d9042, + 0xbcf45a964bd40382, + 0x68e8a0c3ef3c6f3d, + 0xa7bd92d269ff73bc, + 0x290ae20201ed2287, + 0xb7de34cde885818f, + 0xd901eea7dd61059b, + 0xd6fa273219a03553, + 0xd56f1ae874cccec9, + 0xea31245c2e83f554, + 0x7034555da07be499, + 0xce26d2ac56e7bef7, + 0xfd161857a5054e38, + 0x6a0e7da4527436d1, + 0x5bd86a381cde9ff2, + 0xcaf7756231770c32, + 0xb09aaed9e279c8d0, + 0x5def1091c60674db, + 0x111046a2515e5045, + 0x23536ce4729802fc, + 0xc50cbcf7f5b63cfa, + 0x73a16887cd171f03, + 0x7d2941afd9f28dbd, + 0x3f5e3eb45a4f3b9d, + 0x84eefe361b677140, + 0x3db8e3d3e7076271, + 0x1a3a28f9f20fd248, + 0x7ebc7c75b49e7627, + 0x74e5f293c7eb565c, + 0x18dcf59e4f478ba4, + 0x0c6ef44fa9adcb52, + 0xc699812d98dac760, + 0x788b06dc6e469d0e, + 0xfc65f8ea7521ec4e, + 0x30a5f7219e8e0b55, + 0x2bec3f65bca57b6b, + 0xddd04969baf1b75e, + 0x99904cdbe394ea57, + 0x14b201d1e6ea40f6, + 0xbbb0c08241284add, + 0x50f20463bf8f1dff, + 0xe8d7f93b93cbacb8, + 0x4d8cb68e477c86e8, + 0xc1dd1b3992268e3f, + 0x7c5aa11209d62fcb, + 0x2f3d98abdb35c9ae, + 0x671369562bfd5ff5, + 0x15c1e16c36cee280, + 0x1d7eb2edf8f39b17, + 0xda94d37db00dfe01, + 0x877bc3ec760b8ada, + 0xcb8495dfe153ae44, + 0x05a24773b7b410b3, + 0x12857b783c32abdf, + 0x8eb770d06812513b, + 0x536739b9d2e3e665, + 0x584d57e271b26468, + 0xd789c78fc9849725, + 0xa935bbfa7d1ae102, + 0x8b1537a3dfa64188, + 0xd0cd5d9bc378de7a, + 0x4ac82c9a4d80cfb7, + 0x42777f1b83bdb620, + 0x72d2883a1d33bd75, + 0x5e7a2d4bab6a8f41, + 0xf4daab6bbb1c95d9, + 0x905cffe7fd8d31b6, + 0x83aa6422119b381f, + 0xc0aefb8442022c49, + 0xa0f908c663033ae3, + 0xa428af0804938826, + 0xade41c341a8a53c7, + 0xae7121ee77e6a85d, + 0xc47f5c4a25929e8c, + 0xb538e9aa55cdd863, + 0x06377aa9dad8eb29, + 0xa18ae87bb3279895, + 0x6edfda6a35e48414, + 0x6b7d9d19825094a7, + 0xd41cfa55a4e86cbf, + 0xe5caedc9ea42c59c, + 0xa36c351c0e6fc179, + 0x5181e4de6fabbf89, + 0xfff0c530184d17d4, + 0x9d41eb1584045892, + 0x1c0d525028d73961, + 0xf178ec180ca8856a, + 0x9a0571018ef811cd, + 0x4091a27c3ef5efcc, + 0x19af15239f6329d2, + 0x347450eff91eb990, + 0xe11b4a078dd27759, + 0xb9561de5fc601331, + 0x912f1f5a2da993c0, + 0x1654dcb65ba2191a, + 0x3e2dde098a6b99eb, + 0x8a66d71e0f82e3fe, + 0x8c51adb7d55a08d7, + 0x4533e50f8941ff7f, + 0x02e6dd67bd4859ec, + 0xe068aaba5df6d52f, + 0xc24826e3ff4a75a5, + 0x6c39070d88acddf8, + 0x6486548c4691a46f, + 0xd1bebd26135c7c0c, + 0xb30f93038f15334a, + 0x82d9849fc1bf9a69, + 0x9c320ba85420fae4, + 0xfa528243aff90767, + 0x9ed4d6cfe968a308, + 0xb825fd582c44b147, + 0x9b7691bc5edcb3bb, + 0xc7ea619048fe6516, + 0x1063a61f817af233, + 0x47d538683409a693, + 0x63c2ce984c6ded30, + 0x2a9fdfd86c81d91d, + 0x7b1e3b06032a6694, + 0x666089ebfbd9fd83, + 0x0a598ee67375207b, + 0x07449a140afc495f, + 0x2ca8a571b6593234, + 0x1f986f8a45bbc2fb, + 0x381aa4a050b372c2, + 0x5423a3add81faf3a, + 0x17273c0b8b86bb6c, + 0xfe83258dc869b5a2, + 0x287902bfd1c980f1, + 0xf5a94bd66b3837af, + 0x88800a79b2caba12, + 0x55504310083b0d4c, + 0xdf36940e07b9eeb2, + 0x04d1a7ce6790b2c5, + 0x612413fff125b4dc, + 0x26f12b97c52c124f, + 0x86082351a62f28ac, + 0xef93632f9937e5e7, + 0x3507b052293a1be6, + 0xe72c30ae570a9c70, + 0xd3586041ae1425e0, + 0xde4574b3d79d4cc4, + 0x92ba228040c5685a, + 0xf00b0ca5dc8c271c, + 0xbe1287f1f69c5a6e, + 0xf39e317fb1e0dc86, + 0x495d114020ec342d, + 0x699b407e3f18cd4b, + 0xdca3a9d46ad51528, + 0x0d1d14f279896924, + 0x0000000000000000, + 0x593eb75fa196c61e, + 0x2e4e78160b116bd8, + 0x6d4ae7b058887f8e, + 0xe65fd013872e3e06, + 0x7a6ddbbbd30ec4e2, + 0xac97fc89caaef1b1, + 0x09ccb33c1e19dbe1, + 0x89f3eac462ee1864, + 0x7770cf49aa87adc6, + 0x56c57eca6557f6d6, + 0x03953dda6d6cfb9a, + 0x36928d884456e07c, + 0x1eeb8f37959f608d, + 0x31d6179c4eaaa923, + 0x6fac3ad7e5c02662, + 0x43049fa653991456, + 0xabd3669dc052b8ee, + 0xaf02c153a7c20a2b, + 0x3ccb036e3723c007, + 0x93c9c23d90e1ca2c, + 0xc33bc65e2f6ed7d3, + 0x4cff56339758249e, + 0xb1e94e64325d6aa6, + 0x37e16d359472420a, + 0x79f8e661be623f78, + 0x5214d90402c74413, + 0x482ef1fdf0c8965b, + 0x13f69bc5ec1609a9, + 0x0e88292814e592be, + 0x4e198b542a107d72, + 0xccc00fcbebafe71b, + 0x1b49c844222b703e, + 0x2564164da840e9d5, + 0x20c6513e1ff4f966, + 0xbac3203f910ce8ab, + 0xf2edd1c261c47ef0, + 0x814cb945acd361f3, + 0x95feb8944a392105, + 0x5c9cf02c1622d6ad, + 0x971865f3f77178e9, + 0xbd87ba2b9bf0a1f4, + 0x444005b259655d09, + 0xed75be48247fbc0b, + 0x7596122e17cff42a, + 0xb44b091785e97a15, + 0x966b854e2755da9f, + 0xeee0839249134791, + 0x32432a4623c652b9, + 0xa8465b47ad3e4374, + 0xf8b45f2412b15e8b, + 0x2417f6f078644ba3, + 0xfb2162fe7fdda511, + 0x4bbbcc279da46dc1, + 0x0173e0bdd024a276, + 0x22208c59a2bca08a, + 0x8fc4906db836f34d, + 0xe4b90d743a6667ea, + 0x7147b5e0705f46ef, + 0x2782cb2a1508b039, + 0xec065ef5f45b1e7d, + 0x21b5b183cfd05b10, + 0xdbe733c060295c77, + 0x9fa73672394c017e, + 0xcf55321186c31c81, + 0xd8720e1a0d45a7ed, + 0x3b8f997a3ddf8958, + 0x3afc79c7edfb2b2e, + 0xe9a4198643ef0ece, + 0x5f09cdf67b4e2d37, + 0x4f6a6be9fa34df04, + 0xb6add47038a123f9, + 0x8d224d0a057eaaa1, + 0xc96248b85c1bf7a8, + 0xe3fd9760309a2eb5, + 0x0b2a6e5ba351820d, + 0xeb42c4e1fea75722, + 0x948d58299a1d8373, + 0x7fcf9cc864bad451, + 0xa55b4fb5d4b72a50, + 0x08bf5381ce3d7997, + 0x46a6d8d5e42d04e5, + 0xd22b80fc7e308796, + 0x57b69e77b57354a0, + 0x3969441d8097d0b4, + 0x3330cafbf3e2f0cf, + 0xe28e77dde0be8cc3, + 0x62b12e259c494f46, + 0xa6ce726fb9dbd1ca, + 0x41e242c1eed14dba, + 0x76032ff47aa30fb0, + }, + { + 0xe6f87e5c5b711fd0, + 0x258377800924fa16, + 0xc849e07e852ea4a8, + 0x5b4686a18f06c16a, + 0x0b32e9a2d77b416e, + 0xabda37a467815c66, + 0xf61796a81a686676, + 0xf5dc0b706391954b, + 0x4862f38db7e64bf1, + 0xff5c629a68bd85c5, + 0xcb827da6fcd75795, + 0x66d36daf69b9f089, + 0x356c9f74483d83b0, + 0x7cbcecb1238c99a1, + 0x36a702ac31c4708d, + 0x9eb6a8d02fbcdfd6, + 0x8b19fa51e5b3ae37, + 0x9ccfb5408a127d0b, + 0xbc0c78b508208f5a, + 0xe533e3842288eced, + 0xcec2c7d377c15fd2, + 0xec7817b6505d0f5e, + 0xb94cc2c08336871d, + 0x8c205db4cb0b04ad, + 0x763c855b28a0892f, + 0x588d1b79f6ff3257, + 0x3fecf69e4311933e, + 0x0fc0d39f803a18c9, + 0xee010a26f5f3ad83, + 0x10efe8f4411979a6, + 0x5dcda10c7de93a10, + 0x4a1bee1d1248e92c, + 0x53bff2db21847339, + 0xb4f50ccfa6a23d09, + 0x5fb4bc9cd84798cd, + 0xe88a2d8b071c56f9, + 0x7f7771695a756a9c, + 0xc5f02e71a0ba1ebc, + 0xa663f9ab4215e672, + 0x2eb19e22de5fbb78, + 0x0db9ce0f2594ba14, + 0x82520e6397664d84, + 0x2f031e6a0208ea98, + 0x5c7f2144a1be6bf0, + 0x7a37cb1cd16362db, + 0x83e08e2b4b311c64, + 0xcf70479bab960e32, + 0x856ba986b9dee71e, + 0xb5478c877af56ce9, + 0xb8fe42885f61d6fd, + 0x1bdd0156966238c8, + 0x622157923ef8a92e, + 0xfc97ff42114476f8, + 0x9d7d350856452ceb, + 0x4c90c9b0e0a71256, + 0x2308502dfbcb016c, + 0x2d7a03faa7a64845, + 0xf46e8b38bfc6c4ab, + 0xbdbef8fdd477deba, + 0x3aac4cebc8079b79, + 0xf09cb105e8879d0c, + 0x27fa6a10ac8a58cb, + 0x8960e7c1401d0cea, + 0x1a6f811e4a356928, + 0x90c4fb0773d196ff, + 0x43501a2f609d0a9f, + 0xf7a516e0c63f3796, + 0x1ce4a6b3b8da9252, + 0x1324752c38e08a9b, + 0xa5a864733bec154f, + 0x2bf124575549b33f, + 0xd766db15440dc5c7, + 0xa7d179e39e42b792, + 0xdadf151a61997fd3, + 0x86a0345ec0271423, + 0x38d5517b6da939a4, + 0x6518f077104003b4, + 0x02791d90a5aea2dd, + 0x88d267899c4a5d0a, + 0x930f66df0a2865c2, + 0x4ee9d4204509b08b, + 0x325538916685292a, + 0x412907bfc533a842, + 0xb27e2b62544dc673, + 0x6c5304456295e007, + 0x5af406e95351908a, + 0x1f2f3b6bc123616f, + 0xc37b09dc5255e5c6, + 0x3967d133b1fe6844, + 0x298839c7f0e711e2, + 0x409b87f71964f9a2, + 0xe938adc3db4b0719, + 0x0c0b4e47f9c3ebf4, + 0x5534d576d36b8843, + 0x4610a05aeb8b02d8, + 0x20c3cdf58232f251, + 0x6de1840dbec2b1e7, + 0xa0e8de06b0fa1d08, + 0x7b854b540d34333b, + 0x42e29a67bcca5b7f, + 0xd8a6088ac437dd0e, + 0xc63bb3a9d943ed81, + 0x21714dbd5e65a3b1, + 0x6761ede7b5eea169, + 0x2431f7c8d573abf6, + 0xd51fc685e1a3671a, + 0x5e063cd40410c92d, + 0x283ab98f2cb04002, + 0x8febc06cb2f2f790, + 0x17d64f116fa1d33c, + 0xe07359f1a99ee4aa, + 0x784ed68c74cdc006, + 0x6e2a19d5c73b42da, + 0x8712b4161c7045c3, + 0x371582e4ed93216d, + 0xace390414939f6fc, + 0x7ec5f12186223b7c, + 0xc0b094042bac16fb, + 0xf9d745379a527ebf, + 0x737c3f2ea3b68168, + 0x33e7b8d9bad278ca, + 0xa9a32a34c22ffebb, + 0xe48163ccfedfbd0d, + 0x8e5940246ea5a670, + 0x51c6ef4b842ad1e4, + 0x22bad065279c508c, + 0xd91488c218608cee, + 0x319ea5491f7cda17, + 0xd394e128134c9c60, + 0x094bf43272d5e3b3, + 0x9bf612a5a4aad791, + 0xccbbda43d26ffd0f, + 0x34de1f3c946ad250, + 0x4f5b5468995ee16b, + 0xdf9faf6fea8f7794, + 0x2648ea5870dd092b, + 0xbfc7e56d71d97c67, + 0xdde6b2ff4f21d549, + 0x3c276b463ae86003, + 0x91767b4faf86c71f, + 0x68a13e7835d4b9a0, + 0xb68c115f030c9fd4, + 0x141dd2c916582001, + 0x983d8f7ddd5324ac, + 0x64aa703fcc175254, + 0xc2c989948e02b426, + 0x3e5e76d69f46c2de, + 0x50746f03587d8004, + 0x45db3d829272f1e5, + 0x60584a029b560bf3, + 0xfbae58a73ffcdc62, + 0xa15a5e4e6cad4ce8, + 0x4ba96e55ce1fb8cc, + 0x08f9747aae82b253, + 0xc102144cf7fb471b, + 0x9f042898f3eb8e36, + 0x068b27adf2effb7a, + 0xedca97fe8c0a5ebe, + 0x778e0513f4f7d8cf, + 0x302c2501c32b8bf7, + 0x8d92ddfc175c554d, + 0xf865c57f46052f5f, + 0xeaf3301ba2b2f424, + 0xaa68b7ecbbd60d86, + 0x998f0f350104754c, + 0x0000000000000000, + 0xf12e314d34d0ccec, + 0x710522be061823b5, + 0xaf280d9930c005c1, + 0x97fd5ce25d693c65, + 0x19a41cc633cc9a15, + 0x95844172f8c79eb8, + 0xdc5432b7937684a9, + 0x9436c13a2490cf58, + 0x802b13f332c8ef59, + 0xc442ae397ced4f5c, + 0xfa1cd8efe3ab8d82, + 0xf2e5ac954d293fd1, + 0x6ad823e8907a1b7d, + 0x4d2249f83cf043b6, + 0x03cb9dd879f9f33d, + 0xde2d2f2736d82674, + 0x2a43a41f891ee2df, + 0x6f98999d1b6c133a, + 0xd4ad46cd3df436fa, + 0xbb35df50269825c0, + 0x964fdcaa813e6d85, + 0xeb41b0537ee5a5c4, + 0x0540ba758b160847, + 0xa41ae43be7bb44af, + 0xe3b8c429d0671797, + 0x819993bbee9fbeb9, + 0xae9a8dd1ec975421, + 0xf3572cdd917e6e31, + 0x6393d7dae2aff8ce, + 0x47a2201237dc5338, + 0xa32343dec903ee35, + 0x79fc56c4a89a91e6, + 0x01b28048dc5751e0, + 0x1296f564e4b7db7b, + 0x75f7188351597a12, + 0xdb6d9552bdce2e33, + 0x1e9dbb231d74308f, + 0x520d7293fdd322d9, + 0xe20a44610c304677, + 0xfeeee2d2b4ead425, + 0xca30fdee20800675, + 0x61eaca4a47015a13, + 0xe74afe1487264e30, + 0x2cc883b27bf119a5, + 0x1664cf59b3f682dc, + 0xa811aa7c1e78af5b, + 0x1d5626fb648dc3b2, + 0xb73e9117df5bce34, + 0xd05f7cf06ab56f5d, + 0xfd257f0acd132718, + 0x574dc8e676c52a9e, + 0x0739a7e52eb8aa9a, + 0x5486553e0f3cd9a3, + 0x56ff48aeaa927b7e, + 0xbe756525ad8e2d87, + 0x7d0e6cf9ffdbc841, + 0x3b1ecca31450ca99, + 0x6913be30e983e840, + 0xad511009956ea71c, + 0xb1b5b6ba2db4354e, + 0x4469bdca4e25a005, + 0x15af5281ca0f71e1, + 0x744598cb8d0e2bf2, + 0x593f9b312aa863b7, + 0xefb38a6e29a4fc63, + 0x6b6aa3a04c2d4a9d, + 0x3d95eb0ee6bf31e3, + 0xa291c3961554bfd5, + 0x18169c8eef9bcbf5, + 0x115d68bc9d4e2846, + 0xba875f18facf7420, + 0xd1edfcb8b6e23ebd, + 0xb00736f2f1e364ae, + 0x84d929ce6589b6fe, + 0x70b7a2f6da4f7255, + 0x0e7253d75c6d4929, + 0x04f23a3d574159a7, + 0x0a8069ea0b2c108e, + 0x49d073c56bb11a11, + 0x8aab7a1939e4ffd7, + 0xcd095a0b0e38acef, + 0xc9fb60365979f548, + 0x92bde697d67f3422, + 0xc78933e10514bc61, + 0xe1c1d9b975c9b54a, + 0xd2266160cf1bcd80, + 0x9a4492ed78fd8671, + 0xb3ccab2a881a9793, + 0x72cebf667fe1d088, + 0xd6d45b5d985a9427, + }, +}; + +__device__ __constant__ u64 sbob_rc64[12][8] = +{ + { + 0xe9daca1eda5b08b1, + 0x1f7c65c0812fcbeb, + 0x16d0452e43766a2f, + 0xfcc485758db84e71, + 0x0169679291e07c4b, + 0x15d360a4082a42a2, + 0x234d74cc36747605, + 0x0745a6f2596580dd, + }, + { + 0x1a2f9da98ab5a36f, + 0xd7b5700f469de34f, + 0x982b230a72eafef3, + 0x3101b5160f5ed561, + 0x5899d6126b17b59a, + 0xcaa70adbc261b55c, + 0x56cdcbd71ba2dd55, + 0xb79bb121700479e6, + }, + { + 0xc72fce2bacdc74f5, + 0x35843d6a28fc390a, + 0x8b1f9c525f5ef106, + 0x7b7b29b11475eaf2, + 0xb19e3590e40fe2d3, + 0x09db6260373ac9c1, + 0x31db7a8643f4b6c2, + 0xb20aba0af5961e99, + }, + { + 0xd26615e8b3df1fef, + 0xdde4715da0e148f9, + 0x7d3c5c337e858e48, + 0x3f355e68ad1c729d, + 0x75d603ed822cd7a9, + 0xbe0352933313b7d8, + 0xf137e893a1ea5334, + 0x2ed1e384bcbe0c22, + }, + { + 0x994747adac6bea4b, + 0x6323a96c0c413f9a, + 0x4a1086161f1c157f, + 0xbdff0f80d7359e35, + 0xa3f53a254717cdbf, + 0x161a2723b700ffdf, + 0xf563eaa97ea2567a, + 0x57fe6c7cfd581760, + }, + { + 0xd9d33a1daeae4fae, + 0xc039307a3bc3a46f, + 0x6ca44251f9c4662d, + 0xc68ef09ab49a7f18, + 0xb4b79a1cb7a6facf, + 0xb6c6bec2661ff20a, + 0x354f903672c571bf, + 0x6e7d64467a4068fa, + }, + { + 0xecc5aaee160ec7f4, + 0x540924bffe86ac51, + 0xc987bfe6c7c69e39, + 0xc9937a19333e47d3, + 0x372c822dc5ab9209, + 0x04054a2883694706, + 0xf34a3ca24c451735, + 0x93d4143a4d568688, + }, + { + 0xa7c9934d425b1f9b, + 0x41416e0c02aae703, + 0x1ede369c71f8b74e, + 0x9ac4db4d3b44b489, + 0x90069b92cb2b89f4, + 0x2fc4a5d12b8dd169, + 0xd9a8515935c2ac36, + 0x1ee702bfd40d7fa4, + }, + { + 0x9b223116545a8f37, + 0xde5f16ecd89a4c94, + 0x244289251b3a7d3a, + 0x84090de0b755d93c, + 0xb1ceb2db0b440a80, + 0x549c07a69a8a2b7b, + 0x602a1fcb92dc380e, + 0xdb5a238351446172, + }, + { + 0x526f0580a6debeab, + 0xf3f3e4b248e52a38, + 0xdb788aff1ce74189, + 0x0361331b8ae1ff1f, + 0x4b3369af0267e79f, + 0xf452763b306c1e7a, + 0xc3b63b15d1fa9836, + 0xed9c4598fbc7b474, + }, + { + 0xfb89c8efd09ecd7b, + 0x94fe5a63cdc60230, + 0x6107abebbb6bfad8, + 0x7966841421800120, + 0xcab948eaef711d8a, + 0x986e477d1dcdbaef, + 0x5dd86fc04a59a2de, + 0x1b2df381cda4ca6b, + }, + { + 0xba3116f167e78e37, + 0x7ab14904b08013d2, + 0x771ddfbc323ca4cd, + 0x9b9f2130d41220f8, + 0x86cc91189def805d, + 0x5228e188aaa41de7, + 0x991bb2d9d517f4fa, + 0x20d71bf14a92bc48, + }, +}; + +__device__ static void streebog_g (u64 h[8], const u64 m[8], u64 s_sbob_sl64[8][256]) +{ + u64 k[8]; + u64 s[8]; + u64 t[8]; + + #pragma unroll + for (int i = 0; i < 8; i++) + { + t[i] = h[i]; + } + + for (int i = 0; i < 8; i++) + { + k[i] = SBOG_LPSti64; + } + + #pragma unroll + for (int i = 0; i < 8; i++) + { + s[i] = m[i]; + } + + for (int r = 0; r < 12; r++) + { + #pragma unroll + for (int i = 0; i < 8; i++) + { + t[i] = s[i] ^ k[i]; + } + + #pragma unroll + for (int i = 0; i < 8; i++) + { + s[i] = SBOG_LPSti64; + } + + for (int i = 0; i < 8; i++) + { + t[i] = k[i] ^ sbob_rc64[r][i]; + } + + #pragma unroll + for (int i = 0; i < 8; i++) + { + k[i] = SBOG_LPSti64; + } + } + + #pragma unroll + for (int i = 0; i < 8; i++) + { + h[i] ^= s[i] ^ k[i] ^ m[i]; + } +} + +__device__ __constant__ comb_t c_combs[1024]; + +extern "C" __global__ void __launch_bounds__ (256, 1) m11800_m04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + /** + * shared lookup table + */ + + __shared__ u64 s_sbob_sl64[8][256]; + + if (lid < 64) + { + const u32 lid4 = lid * 4; + + s_sbob_sl64[0][lid4 + 0] = sbob_sl64[0][lid4 + 0]; + s_sbob_sl64[0][lid4 + 1] = sbob_sl64[0][lid4 + 1]; + s_sbob_sl64[0][lid4 + 2] = sbob_sl64[0][lid4 + 2]; + s_sbob_sl64[0][lid4 + 3] = sbob_sl64[0][lid4 + 3]; + s_sbob_sl64[1][lid4 + 0] = sbob_sl64[1][lid4 + 0]; + s_sbob_sl64[1][lid4 + 1] = sbob_sl64[1][lid4 + 1]; + s_sbob_sl64[1][lid4 + 2] = sbob_sl64[1][lid4 + 2]; + s_sbob_sl64[1][lid4 + 3] = sbob_sl64[1][lid4 + 3]; + s_sbob_sl64[2][lid4 + 0] = sbob_sl64[2][lid4 + 0]; + s_sbob_sl64[2][lid4 + 1] = sbob_sl64[2][lid4 + 1]; + s_sbob_sl64[2][lid4 + 2] = sbob_sl64[2][lid4 + 2]; + s_sbob_sl64[2][lid4 + 3] = sbob_sl64[2][lid4 + 3]; + s_sbob_sl64[3][lid4 + 0] = sbob_sl64[3][lid4 + 0]; + s_sbob_sl64[3][lid4 + 1] = sbob_sl64[3][lid4 + 1]; + s_sbob_sl64[3][lid4 + 2] = sbob_sl64[3][lid4 + 2]; + s_sbob_sl64[3][lid4 + 3] = sbob_sl64[3][lid4 + 3]; + s_sbob_sl64[4][lid4 + 0] = sbob_sl64[4][lid4 + 0]; + s_sbob_sl64[4][lid4 + 1] = sbob_sl64[4][lid4 + 1]; + s_sbob_sl64[4][lid4 + 2] = sbob_sl64[4][lid4 + 2]; + s_sbob_sl64[4][lid4 + 3] = sbob_sl64[4][lid4 + 3]; + s_sbob_sl64[5][lid4 + 0] = sbob_sl64[5][lid4 + 0]; + s_sbob_sl64[5][lid4 + 1] = sbob_sl64[5][lid4 + 1]; + s_sbob_sl64[5][lid4 + 2] = sbob_sl64[5][lid4 + 2]; + s_sbob_sl64[5][lid4 + 3] = sbob_sl64[5][lid4 + 3]; + s_sbob_sl64[6][lid4 + 0] = sbob_sl64[6][lid4 + 0]; + s_sbob_sl64[6][lid4 + 1] = sbob_sl64[6][lid4 + 1]; + s_sbob_sl64[6][lid4 + 2] = sbob_sl64[6][lid4 + 2]; + s_sbob_sl64[6][lid4 + 3] = sbob_sl64[6][lid4 + 3]; + s_sbob_sl64[7][lid4 + 0] = sbob_sl64[7][lid4 + 0]; + s_sbob_sl64[7][lid4 + 1] = sbob_sl64[7][lid4 + 1]; + s_sbob_sl64[7][lid4 + 2] = sbob_sl64[7][lid4 + 2]; + s_sbob_sl64[7][lid4 + 3] = sbob_sl64[7][lid4 + 3]; + } + + __syncthreads (); + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + append_0x80_2 (wordl0, wordl1, pw_l_len); + + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, c_combs[0].pw_len); + } + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = c_combs[il_pos].pw_len; + + const u32 pw_len = pw_l_len + pw_r_len; + + u32 wordr0[4]; + + wordr0[0] = c_combs[il_pos].i[0]; + wordr0[1] = c_combs[il_pos].i[1]; + wordr0[2] = c_combs[il_pos].i[2]; + wordr0[3] = c_combs[il_pos].i[3]; + + u32 wordr1[4]; + + wordr1[0] = c_combs[il_pos].i[4]; + wordr1[1] = c_combs[il_pos].i[5]; + wordr1[2] = c_combs[il_pos].i[6]; + wordr1[3] = c_combs[il_pos].i[7]; + + u32 wordr2[4]; + + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + + u32 wordr3[4]; + + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + u32x w[16]; + + w[ 0] = wordl0[0] | wordr0[0]; + w[ 1] = wordl0[1] | wordr0[1]; + w[ 2] = wordl0[2] | wordr0[2]; + w[ 3] = wordl0[3] | wordr0[3]; + w[ 4] = wordl1[0] | wordr1[0]; + w[ 5] = wordl1[1] | wordr1[1]; + w[ 6] = wordl1[2] | wordr1[2]; + w[ 7] = wordl1[3] | wordr1[3]; + w[ 8] = wordl2[0] | wordr2[0]; + w[ 9] = wordl2[1] | wordr2[1]; + w[10] = wordl2[2] | wordr2[2]; + w[11] = wordl2[3] | wordr2[3]; + w[12] = wordl3[0] | wordr3[0]; + w[13] = wordl3[1] | wordr3[1]; + w[14] = wordl3[1] | wordr3[1]; + w[15] = wordl3[1] | wordr3[1]; + + append_0x01_4 (&w[0], &w[1], &w[2], &w[3], pw_len); + + /** + * reverse message block + */ + + u64 m[8]; + + m[0] = hl32_to_64 (w[15], w[14]); + m[1] = hl32_to_64 (w[13], w[12]); + m[2] = hl32_to_64 (w[11], w[10]); + m[3] = hl32_to_64 (w[ 9], w[ 8]); + m[4] = hl32_to_64 (w[ 7], w[ 6]); + m[5] = hl32_to_64 (w[ 5], w[ 4]); + m[6] = hl32_to_64 (w[ 3], w[ 2]); + m[7] = hl32_to_64 (w[ 1], w[ 0]); + + m[0] = swap_workaround (m[0]); + m[1] = swap_workaround (m[1]); + m[2] = swap_workaround (m[2]); + m[3] = swap_workaround (m[3]); + m[4] = swap_workaround (m[4]); + m[5] = swap_workaround (m[5]); + m[6] = swap_workaround (m[6]); + m[7] = swap_workaround (m[7]); + + // state buffer (hash) + + u64 h[8]; + + h[0] = INITVAL; + h[1] = INITVAL; + h[2] = INITVAL; + h[3] = INITVAL; + h[4] = INITVAL; + h[5] = INITVAL; + h[6] = INITVAL; + h[7] = INITVAL; + + streebog_g (h, m, s_sbob_sl64); + + u64 z[8]; + + z[0] = 0; + z[1] = 0; + z[2] = 0; + z[3] = 0; + z[4] = 0; + z[5] = 0; + z[6] = 0; + z[7] = swap_workaround ((u64) (pw_len * 8)); + + streebog_g (h, z, s_sbob_sl64); + streebog_g (h, m, s_sbob_sl64); + + const u32 r0 = l32_from_64 (h[0]); + const u32 r1 = h32_from_64 (h[0]); + const u32 r2 = l32_from_64 (h[1]); + const u32 r3 = h32_from_64 (h[1]); + + #include VECT_COMPARE_M + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m11800_m08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m11800_m16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m11800_s04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + + /** + * shared lookup table + */ + + __shared__ u64 s_sbob_sl64[8][256]; + + if (lid < 64) + { + const u32 lid4 = lid * 4; + + s_sbob_sl64[0][lid4 + 0] = sbob_sl64[0][lid4 + 0]; + s_sbob_sl64[0][lid4 + 1] = sbob_sl64[0][lid4 + 1]; + s_sbob_sl64[0][lid4 + 2] = sbob_sl64[0][lid4 + 2]; + s_sbob_sl64[0][lid4 + 3] = sbob_sl64[0][lid4 + 3]; + s_sbob_sl64[1][lid4 + 0] = sbob_sl64[1][lid4 + 0]; + s_sbob_sl64[1][lid4 + 1] = sbob_sl64[1][lid4 + 1]; + s_sbob_sl64[1][lid4 + 2] = sbob_sl64[1][lid4 + 2]; + s_sbob_sl64[1][lid4 + 3] = sbob_sl64[1][lid4 + 3]; + s_sbob_sl64[2][lid4 + 0] = sbob_sl64[2][lid4 + 0]; + s_sbob_sl64[2][lid4 + 1] = sbob_sl64[2][lid4 + 1]; + s_sbob_sl64[2][lid4 + 2] = sbob_sl64[2][lid4 + 2]; + s_sbob_sl64[2][lid4 + 3] = sbob_sl64[2][lid4 + 3]; + s_sbob_sl64[3][lid4 + 0] = sbob_sl64[3][lid4 + 0]; + s_sbob_sl64[3][lid4 + 1] = sbob_sl64[3][lid4 + 1]; + s_sbob_sl64[3][lid4 + 2] = sbob_sl64[3][lid4 + 2]; + s_sbob_sl64[3][lid4 + 3] = sbob_sl64[3][lid4 + 3]; + s_sbob_sl64[4][lid4 + 0] = sbob_sl64[4][lid4 + 0]; + s_sbob_sl64[4][lid4 + 1] = sbob_sl64[4][lid4 + 1]; + s_sbob_sl64[4][lid4 + 2] = sbob_sl64[4][lid4 + 2]; + s_sbob_sl64[4][lid4 + 3] = sbob_sl64[4][lid4 + 3]; + s_sbob_sl64[5][lid4 + 0] = sbob_sl64[5][lid4 + 0]; + s_sbob_sl64[5][lid4 + 1] = sbob_sl64[5][lid4 + 1]; + s_sbob_sl64[5][lid4 + 2] = sbob_sl64[5][lid4 + 2]; + s_sbob_sl64[5][lid4 + 3] = sbob_sl64[5][lid4 + 3]; + s_sbob_sl64[6][lid4 + 0] = sbob_sl64[6][lid4 + 0]; + s_sbob_sl64[6][lid4 + 1] = sbob_sl64[6][lid4 + 1]; + s_sbob_sl64[6][lid4 + 2] = sbob_sl64[6][lid4 + 2]; + s_sbob_sl64[6][lid4 + 3] = sbob_sl64[6][lid4 + 3]; + s_sbob_sl64[7][lid4 + 0] = sbob_sl64[7][lid4 + 0]; + s_sbob_sl64[7][lid4 + 1] = sbob_sl64[7][lid4 + 1]; + s_sbob_sl64[7][lid4 + 2] = sbob_sl64[7][lid4 + 2]; + s_sbob_sl64[7][lid4 + 3] = sbob_sl64[7][lid4 + 3]; + } + + __syncthreads (); + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + append_0x80_2 (wordl0, wordl1, pw_l_len); + + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, c_combs[0].pw_len); + } + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = c_combs[il_pos].pw_len; + + const u32 pw_len = pw_l_len + pw_r_len; + + u32 wordr0[4]; + + wordr0[0] = c_combs[il_pos].i[0]; + wordr0[1] = c_combs[il_pos].i[1]; + wordr0[2] = c_combs[il_pos].i[2]; + wordr0[3] = c_combs[il_pos].i[3]; + + u32 wordr1[4]; + + wordr1[0] = c_combs[il_pos].i[4]; + wordr1[1] = c_combs[il_pos].i[5]; + wordr1[2] = c_combs[il_pos].i[6]; + wordr1[3] = c_combs[il_pos].i[7]; + + u32 wordr2[4]; + + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + + u32 wordr3[4]; + + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + u32x w[16]; + + w[ 0] = wordl0[0] | wordr0[0]; + w[ 1] = wordl0[1] | wordr0[1]; + w[ 2] = wordl0[2] | wordr0[2]; + w[ 3] = wordl0[3] | wordr0[3]; + w[ 4] = wordl1[0] | wordr1[0]; + w[ 5] = wordl1[1] | wordr1[1]; + w[ 6] = wordl1[2] | wordr1[2]; + w[ 7] = wordl1[3] | wordr1[3]; + w[ 8] = wordl2[0] | wordr2[0]; + w[ 9] = wordl2[1] | wordr2[1]; + w[10] = wordl2[2] | wordr2[2]; + w[11] = wordl2[3] | wordr2[3]; + w[12] = wordl3[0] | wordr3[0]; + w[13] = wordl3[1] | wordr3[1]; + w[14] = wordl3[1] | wordr3[1]; + w[15] = wordl3[1] | wordr3[1]; + + append_0x01_4 (&w[0], &w[1], &w[2], &w[3], pw_len); + + /** + * reverse message block + */ + + u64 m[8]; + + m[0] = hl32_to_64 (w[15], w[14]); + m[1] = hl32_to_64 (w[13], w[12]); + m[2] = hl32_to_64 (w[11], w[10]); + m[3] = hl32_to_64 (w[ 9], w[ 8]); + m[4] = hl32_to_64 (w[ 7], w[ 6]); + m[5] = hl32_to_64 (w[ 5], w[ 4]); + m[6] = hl32_to_64 (w[ 3], w[ 2]); + m[7] = hl32_to_64 (w[ 1], w[ 0]); + + m[0] = swap_workaround (m[0]); + m[1] = swap_workaround (m[1]); + m[2] = swap_workaround (m[2]); + m[3] = swap_workaround (m[3]); + m[4] = swap_workaround (m[4]); + m[5] = swap_workaround (m[5]); + m[6] = swap_workaround (m[6]); + m[7] = swap_workaround (m[7]); + + // state buffer (hash) + + u64 h[8]; + + h[0] = INITVAL; + h[1] = INITVAL; + h[2] = INITVAL; + h[3] = INITVAL; + h[4] = INITVAL; + h[5] = INITVAL; + h[6] = INITVAL; + h[7] = INITVAL; + + streebog_g (h, m, s_sbob_sl64); + + u64 z[8]; + + z[0] = 0; + z[1] = 0; + z[2] = 0; + z[3] = 0; + z[4] = 0; + z[5] = 0; + z[6] = 0; + z[7] = swap_workaround ((u64) (pw_len * 8)); + + streebog_g (h, z, s_sbob_sl64); + streebog_g (h, m, s_sbob_sl64); + + const u32 r0 = l32_from_64 (h[0]); + const u32 r1 = h32_from_64 (h[0]); + const u32 r2 = l32_from_64 (h[1]); + const u32 r3 = h32_from_64 (h[1]); + + #include VECT_COMPARE_S + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m11800_s08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m11800_s16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/nv/m11800_a3.cu b/nv/m11800_a3.cu new file mode 100644 index 0000000000..5b6d1f7e9b --- /dev/null +++ b/nv/m11800_a3.cu @@ -0,0 +1,2993 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _GOST2012_512_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW2 +#define VECT_SIZE1 +#endif + +#define DGST_R0 0 +#define DGST_R1 1 +#define DGST_R2 2 +#define DGST_R3 3 + +#include "include/kernel_functions.c" +#include "types_nv.c" +#include "common_nv.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +#define INITVAL 0 + +#define SBOG_LPSti64 \ + s_sbob_sl64[0][(t[0] >> (i * 8)) & 0xff] ^ \ + s_sbob_sl64[1][(t[1] >> (i * 8)) & 0xff] ^ \ + s_sbob_sl64[2][(t[2] >> (i * 8)) & 0xff] ^ \ + s_sbob_sl64[3][(t[3] >> (i * 8)) & 0xff] ^ \ + s_sbob_sl64[4][(t[4] >> (i * 8)) & 0xff] ^ \ + s_sbob_sl64[5][(t[5] >> (i * 8)) & 0xff] ^ \ + s_sbob_sl64[6][(t[6] >> (i * 8)) & 0xff] ^ \ + s_sbob_sl64[7][(t[7] >> (i * 8)) & 0xff] + +// constants + +__device__ __constant__ u64 sbob_sl64[8][256] = +{ + { + 0xd031c397ce553fe6, + 0x16ba5b01b006b525, + 0xa89bade6296e70c8, + 0x6a1f525d77d3435b, + 0x6e103570573dfa0b, + 0x660efb2a17fc95ab, + 0x76327a9e97634bf6, + 0x4bad9d6462458bf5, + 0xf1830caedbc3f748, + 0xc5c8f542669131ff, + 0x95044a1cdc48b0cb, + 0x892962df3cf8b866, + 0xb0b9e208e930c135, + 0xa14fb3f0611a767c, + 0x8d2605f21c160136, + 0xd6b71922fecc549e, + 0x37089438a5907d8b, + 0x0b5da38e5803d49c, + 0x5a5bcc9cea6f3cbc, + 0xedae246d3b73ffe5, + 0xd2b87e0fde22edce, + 0x5e54abb1ca8185ec, + 0x1de7f88fe80561b9, + 0xad5e1a870135a08c, + 0x2f2adbd665cecc76, + 0x5780b5a782f58358, + 0x3edc8a2eede47b3f, + 0xc9d95c3506bee70f, + 0x83be111d6c4e05ee, + 0xa603b90959367410, + 0x103c81b4809fde5d, + 0x2c69b6027d0c774a, + 0x399080d7d5c87953, + 0x09d41e16487406b4, + 0xcdd63b1826505e5f, + 0xf99dc2f49b0298e8, + 0x9cd0540a943cb67f, + 0xbca84b7f891f17c5, + 0x723d1db3b78df2a6, + 0x78aa6e71e73b4f2e, + 0x1433e699a071670d, + 0x84f21be454620782, + 0x98df3327b4d20f2f, + 0xf049dce2d3769e5c, + 0xdb6c60199656eb7a, + 0x648746b2078b4783, + 0x32cd23598dcbadcf, + 0x1ea4955bf0c7da85, + 0xe9a143401b9d46b5, + 0xfd92a5d9bbec21b8, + 0xc8138c790e0b8e1b, + 0x2ee00b9a6d7ba562, + 0xf85712b893b7f1fc, + 0xeb28fed80bea949d, + 0x564a65eb8a40ea4c, + 0x6c9988e8474a2823, + 0x4535898b121d8f2d, + 0xabd8c03231accbf4, + 0xba2e91cab9867cbd, + 0x7960be3def8e263a, + 0x0c11a977602fd6f0, + 0xcb50e1ad16c93527, + 0xeae22e94035ffd89, + 0x2866d12f5de2ce1a, + 0xff1b1841ab9bf390, + 0x9f9339de8cfe0d43, + 0x964727c8c48a0bf7, + 0x524502c6aaae531c, + 0x9b9c5ef3ac10b413, + 0x4fa2fa4942ab32a5, + 0x3f165a62e551122b, + 0xc74148da76e6e3d7, + 0x924840e5e464b2a7, + 0xd372ae43d69784da, + 0x233b72a105e11a86, + 0xa48a04914941a638, + 0xb4b68525c9de7865, + 0xddeabaaca6cf8002, + 0x0a9773c250b6bd88, + 0xc284ffbb5ebd3393, + 0x8ba0df472c8f6a4e, + 0x2aef6cb74d951c32, + 0x427983722a318d41, + 0x73f7cdffbf389bb2, + 0x074c0af9382c026c, + 0x8a6a0f0b243a035a, + 0x6fdae53c5f88931f, + 0xc68b98967e538ac3, + 0x44ff59c71aa8e639, + 0xe2fce0ce439e9229, + 0xa20cde2479d8cd40, + 0x19e89fa2c8ebd8e9, + 0xf446bbcff398270c, + 0x43b3533e2284e455, + 0xd82f0dcd8e945046, + 0x51066f12b26ce820, + 0xe73957af6bc5426d, + 0x081ece5a40c16fa0, + 0x3b193d4fc5bfab7b, + 0x7fe66488df174d42, + 0x0e9814ef705804d8, + 0x8137ac857c39d7c6, + 0xb1733244e185a821, + 0x695c3f896f11f867, + 0xf6cf0657e3eff524, + 0x1aabf276d02963d5, + 0x2da3664e75b91e5e, + 0x0289bd981077d228, + 0x90c1fd7df413608f, + 0x3c5537b6fd93a917, + 0xaa12107e3919a2e0, + 0x0686dab530996b78, + 0xdaa6b0559ee3826e, + 0xc34e2ff756085a87, + 0x6d5358a44fff4137, + 0xfc587595b35948ac, + 0x7ca5095cc7d5f67e, + 0xfb147f6c8b754ac0, + 0xbfeb26ab91ddacf9, + 0x6896efc567a49173, + 0xca9a31e11e7c5c33, + 0xbbe44186b13315a9, + 0x0ddb793b689abfe4, + 0x70b4a02ba7fa208e, + 0xe47a3a7b7307f951, + 0x8cecd5be14a36822, + 0xeeed49b923b144d9, + 0x17708b4db8b3dc31, + 0x6088219f2765fed3, + 0xb3fa8fdcf1f27a09, + 0x910b2d31fca6099b, + 0x0f52c4a378ed6dcc, + 0x50ccbf5ebad98134, + 0x6bd582117f662a4f, + 0x94ce9a50d4fdd9df, + 0x2b25bcfb45207526, + 0x67c42b661f49fcbf, + 0x492420fc723259dd, + 0x03436dd418c2bb3c, + 0x1f6e4517f872b391, + 0xa08563bc69af1f68, + 0xd43ea4baeebb86b6, + 0x01cad04c08b56914, + 0xac94cacb0980c998, + 0x54c3d8739a373864, + 0x26fec5c02dbacac2, + 0xdea9d778be0d3b3e, + 0x040f672d20eeb950, + 0xe5b0ea377bb29045, + 0xf30ab136cbb42560, + 0x62019c0737122cfb, + 0xe86b930c13282fa1, + 0xcc1ceb542ee5374b, + 0x538fd28aa21b3a08, + 0x1b61223ad89c0ac1, + 0x36c24474ad25149f, + 0x7a23d3e9f74c9d06, + 0xbe21f6e79968c5ed, + 0xcf5f868036278c77, + 0xf705d61beb5a9c30, + 0x4d2b47d152dce08d, + 0x5f9e7bfdc234ecf8, + 0x247778583dcd18ea, + 0x867ba67c4415d5aa, + 0x4ce1979d5a698999, + 0x0000000000000000, + 0xec64f42133c696f1, + 0xb57c5569c16b1171, + 0xc1c7926f467f88af, + 0x654d96fe0f3e2e97, + 0x15f936d5a8c40e19, + 0xb8a72c52a9f1ae95, + 0xa9517daa21db19dc, + 0x58d27104fa18ee94, + 0x5918a148f2ad8780, + 0x5cdd1629daf657c4, + 0x8274c15164fb6cfa, + 0xd1fb13dbc6e056f2, + 0x7d6fd910cf609f6a, + 0xb63f38bdd9a9aa4d, + 0x3d9fe7faf526c003, + 0x74bbc706871499de, + 0xdf630734b6b8522a, + 0x3ad3ed03cd0ac26f, + 0xfadeaf2083c023d4, + 0xc00d42234ecae1bb, + 0x8538cba85cd76e96, + 0xc402250e6e2458eb, + 0x47bc3413026a5d05, + 0xafd7a71f114272a4, + 0x978df784cc3f62e3, + 0xb96dfc1ea144c781, + 0x21b2cf391596c8ae, + 0x318e4e8d950916f3, + 0xce9556cc3e92e563, + 0x385a509bdd7d1047, + 0x358129a0b5e7afa3, + 0xe6f387e363702b79, + 0xe0755d5653e94001, + 0x7be903a5fff9f412, + 0x12b53c2c90e80c75, + 0x3307f315857ec4db, + 0x8fafb86a0c61d31e, + 0xd9e5dd8186213952, + 0x77f8aad29fd622e2, + 0x25bda814357871fe, + 0x7571174a8fa1f0ca, + 0x137fec60985d6561, + 0x30449ec19dbc7fe7, + 0xa540d4dd41f4cf2c, + 0xdc206ae0ae7ae916, + 0x5b911cd0e2da55a8, + 0xb2305f90f947131d, + 0x344bf9ecbd52c6b7, + 0x5d17c665d2433ed0, + 0x18224feec05eb1fd, + 0x9e59e992844b6457, + 0x9a568ebfa4a5dd07, + 0xa3c60e68716da454, + 0x7e2cb4c4d7a22456, + 0x87b176304ca0bcbe, + 0x413aeea632f3367d, + 0x9915e36bbc67663b, + 0x40f03eea3a465f69, + 0x1c2d28c3e0b008ad, + 0x4e682a054a1e5bb1, + 0x05c5b761285bd044, + 0xe1bf8d1a5b5c2915, + 0xf2c0617ac3014c74, + 0xb7f5e8f1d11cc359, + 0x63cb4c4b3fa745ef, + 0x9d1a84469c89df6b, + 0xe33630824b2bfb3d, + 0xd5f474f6e60eefa2, + 0xf58c6b83fb2d4e18, + 0x4676e45f0adf3411, + 0x20781f751d23a1ba, + 0xbd629b3381aa7ed1, + 0xae1d775319f71bb0, + 0xfed1c80da32e9a84, + 0x5509083f92825170, + 0x29ac01635557a70e, + 0xa7c9694551831d04, + 0x8e65682604d4ba0a, + 0x11f651f8882ab749, + 0xd77dc96ef6793d8a, + 0xef2799f52b042dcd, + 0x48eef0b07a8730c9, + 0x22f1a2ed0d547392, + 0x6142f1d32fd097c7, + 0x4a674d286af0e2e1, + 0x80fd7cc9748cbed2, + 0x717e7067af4f499a, + 0x938290a9ecd1dbb3, + 0x88e3b293344dd172, + 0x2734158c250fa3d6, + }, + { + 0x7e37e62dfc7d40c3, + 0x776f25a4ee939e5b, + 0xe045c850dd8fb5ad, + 0x86ed5ba711ff1952, + 0xe91d0bd9cf616b35, + 0x37e0ab256e408ffb, + 0x9607f6c031025a7a, + 0x0b02f5e116d23c9d, + 0xf3d8486bfb50650c, + 0x621cff27c40875f5, + 0x7d40cb71fa5fd34a, + 0x6daa6616daa29062, + 0x9f5f354923ec84e2, + 0xec847c3dc507c3b3, + 0x025a3668043ce205, + 0xa8bf9e6c4dac0b19, + 0xfa808be2e9bebb94, + 0xb5b99c5277c74fa3, + 0x78d9bc95f0397bcc, + 0xe332e50cdbad2624, + 0xc74fce129332797e, + 0x1729eceb2ea709ab, + 0xc2d6b9f69954d1f8, + 0x5d898cbfbab8551a, + 0x859a76fb17dd8adb, + 0x1be85886362f7fb5, + 0xf6413f8ff136cd8a, + 0xd3110fa5bbb7e35c, + 0x0a2feed514cc4d11, + 0xe83010edcd7f1ab9, + 0xa1e75de55f42d581, + 0xeede4a55c13b21b6, + 0xf2f5535ff94e1480, + 0x0cc1b46d1888761e, + 0xbce15fdb6529913b, + 0x2d25e8975a7181c2, + 0x71817f1ce2d7a554, + 0x2e52c5cb5c53124b, + 0xf9f7a6beef9c281d, + 0x9e722e7d21f2f56e, + 0xce170d9b81dca7e6, + 0x0e9b82051cb4941b, + 0x1e712f623c49d733, + 0x21e45cfa42f9f7dc, + 0xcb8e7a7f8bba0f60, + 0x8e98831a010fb646, + 0x474ccf0d8e895b23, + 0xa99285584fb27a95, + 0x8cc2b57205335443, + 0x42d5b8e984eff3a5, + 0x012d1b34021e718c, + 0x57a6626aae74180b, + 0xff19fc06e3d81312, + 0x35ba9d4d6a7c6dfe, + 0xc9d44c178f86ed65, + 0x506523e6a02e5288, + 0x03772d5c06229389, + 0x8b01f4fe0b691ec0, + 0xf8dabd8aed825991, + 0x4c4e3aec985b67be, + 0xb10df0827fbf96a9, + 0x6a69279ad4f8dae1, + 0xe78689dcd3d5ff2e, + 0x812e1a2b1fa553d1, + 0xfbad90d6eba0ca18, + 0x1ac543b234310e39, + 0x1604f7df2cb97827, + 0xa6241c6951189f02, + 0x753513cceaaf7c5e, + 0x64f2a59fc84c4efa, + 0x247d2b1e489f5f5a, + 0xdb64d718ab474c48, + 0x79f4a7a1f2270a40, + 0x1573da832a9bebae, + 0x3497867968621c72, + 0x514838d2a2302304, + 0xf0af6537fd72f685, + 0x1d06023e3a6b44ba, + 0x678588c3ce6edd73, + 0x66a893f7cc70acff, + 0xd4d24e29b5eda9df, + 0x3856321470ea6a6c, + 0x07c3418c0e5a4a83, + 0x2bcbb22f5635bacd, + 0x04b46cd00878d90a, + 0x06ee5ab80c443b0f, + 0x3b211f4876c8f9e5, + 0x0958c38912eede98, + 0xd14b39cdbf8b0159, + 0x397b292072f41be0, + 0x87c0409313e168de, + 0xad26e98847caa39f, + 0x4e140c849c6785bb, + 0xd5ff551db7f3d853, + 0xa0ca46d15d5ca40d, + 0xcd6020c787fe346f, + 0x84b76dcf15c3fb57, + 0xdefda0fca121e4ce, + 0x4b8d7b6096012d3d, + 0x9ac642ad298a2c64, + 0x0875d8bd10f0af14, + 0xb357c6ea7b8374ac, + 0x4d6321d89a451632, + 0xeda96709c719b23f, + 0xf76c24bbf328bc06, + 0xc662d526912c08f2, + 0x3ce25ec47892b366, + 0xb978283f6f4f39bd, + 0xc08c8f9e9d6833fd, + 0x4f3917b09e79f437, + 0x593de06fb2c08c10, + 0xd6887841b1d14bda, + 0x19b26eee32139db0, + 0xb494876675d93e2f, + 0x825937771987c058, + 0x90e9ac783d466175, + 0xf1827e03ff6c8709, + 0x945dc0a8353eb87f, + 0x4516f9658ab5b926, + 0x3f9573987eb020ef, + 0xb855330b6d514831, + 0x2ae6a91b542bcb41, + 0x6331e413c6160479, + 0x408f8e8180d311a0, + 0xeff35161c325503a, + 0xd06622f9bd9570d5, + 0x8876d9a20d4b8d49, + 0xa5533135573a0c8b, + 0xe168d364df91c421, + 0xf41b09e7f50a2f8f, + 0x12b09b0f24c1a12d, + 0xda49cc2ca9593dc4, + 0x1f5c34563e57a6bf, + 0x54d14f36a8568b82, + 0xaf7cdfe043f6419a, + 0xea6a2685c943f8bc, + 0xe5dcbfb4d7e91d2b, + 0xb27addde799d0520, + 0x6b443caed6e6ab6d, + 0x7bae91c9f61be845, + 0x3eb868ac7cae5163, + 0x11c7b65322e332a4, + 0xd23c1491b9a992d0, + 0x8fb5982e0311c7ca, + 0x70ac6428e0c9d4d8, + 0x895bc2960f55fcc5, + 0x76423e90ec8defd7, + 0x6ff0507ede9e7267, + 0x3dcf45f07a8cc2ea, + 0x4aa06054941f5cb1, + 0x5810fb5bb0defd9c, + 0x5efea1e3bc9ac693, + 0x6edd4b4adc8003eb, + 0x741808f8e8b10dd2, + 0x145ec1b728859a22, + 0x28bc9f7350172944, + 0x270a06424ebdccd3, + 0x972aedf4331c2bf6, + 0x059977e40a66a886, + 0x2550302a4a812ed6, + 0xdd8a8da0a7037747, + 0xc515f87a970e9b7b, + 0x3023eaa9601ac578, + 0xb7e3aa3a73fbada6, + 0x0fb699311eaae597, + 0x0000000000000000, + 0x310ef19d6204b4f4, + 0x229371a644db6455, + 0x0decaf591a960792, + 0x5ca4978bb8a62496, + 0x1c2b190a38753536, + 0x41a295b582cd602c, + 0x3279dcc16426277d, + 0xc1a194aa9f764271, + 0x139d803b26dfd0a1, + 0xae51c4d441e83016, + 0xd813fa44ad65dfc1, + 0xac0bf2bc45d4d213, + 0x23be6a9246c515d9, + 0x49d74d08923dcf38, + 0x9d05032127d066e7, + 0x2f7fdeff5e4d63c7, + 0xa47e2a0155247d07, + 0x99b16ff12fa8bfed, + 0x4661d4398c972aaf, + 0xdfd0bbc8a33f9542, + 0xdca79694a51d06cb, + 0xb020ebb67da1e725, + 0xba0f0563696daa34, + 0xe4f1a480d5f76ca7, + 0xc438e34e9510eaf7, + 0x939e81243b64f2fc, + 0x8defae46072d25cf, + 0x2c08f3a3586ff04e, + 0xd7a56375b3cf3a56, + 0x20c947ce40e78650, + 0x43f8a3dd86f18229, + 0x568b795eac6a6987, + 0x8003011f1dbb225d, + 0xf53612d3f7145e03, + 0x189f75da300dec3c, + 0x9570db9c3720c9f3, + 0xbb221e576b73dbb8, + 0x72f65240e4f536dd, + 0x443be25188abc8aa, + 0xe21ffe38d9b357a8, + 0xfd43ca6ee7e4f117, + 0xcaa3614b89a47eec, + 0xfe34e732e1c6629e, + 0x83742c431b99b1d4, + 0xcf3a16af83c2d66a, + 0xaae5a8044990e91c, + 0x26271d764ca3bd5f, + 0x91c4b74c3f5810f9, + 0x7c6dd045f841a2c6, + 0x7f1afd19fe63314f, + 0xc8f957238d989ce9, + 0xa709075d5306ee8e, + 0x55fc5402aa48fa0e, + 0x48fa563c9023beb4, + 0x65dfbeabca523f76, + 0x6c877d22d8bce1ee, + 0xcc4d3bf385e045e3, + 0xbebb69b36115733e, + 0x10eaad6720fd4328, + 0xb6ceb10e71e5dc2a, + 0xbdcc44ef6737e0b7, + 0x523f158ea412b08d, + 0x989c74c52db6ce61, + 0x9beb59992b945de8, + 0x8a2cefca09776f4c, + 0xa3bd6b8d5b7e3784, + 0xeb473db1cb5d8930, + 0xc3fba2c29b4aa074, + 0x9c28181525ce176b, + 0x683311f2d0c438e4, + 0x5fd3bad7be84b71f, + 0xfc6ed15ae5fa809b, + 0x36cdb0116c5efe77, + 0x29918447520958c8, + 0xa29070b959604608, + 0x53120ebaa60cc101, + 0x3a0c047c74d68869, + 0x691e0ac6d2da4968, + 0x73db4974e6eb4751, + 0x7a838afdf40599c9, + 0x5a4acd33b4e21f99, + 0x6046c94fc03497f0, + 0xe6ab92e8d1cb8ea2, + 0x3354c7f5663856f1, + 0xd93ee170af7bae4d, + 0x616bd27bc22ae67c, + 0x92b39a10397a8370, + 0xabc8b3304b8e9890, + 0xbf967287630b02b2, + 0x5b67d607b6fc6e15, + }, + { + 0x8ab0a96846e06a6d, + 0x43c7e80b4bf0b33a, + 0x08c9b3546b161ee5, + 0x39f1c235eba990be, + 0xc1bef2376606c7b2, + 0x2c209233614569aa, + 0xeb01523b6fc3289a, + 0x946953ab935acedd, + 0x272838f63e13340e, + 0x8b0455eca12ba052, + 0x77a1b2c4978ff8a2, + 0xa55122ca13e54086, + 0x2276135862d3f1cd, + 0xdb8ddfde08b76cfe, + 0x5d1e12c89e4a178a, + 0x0e56816b03969867, + 0xee5f79953303ed59, + 0xafed748bab78d71d, + 0x6d929f2df93e53ee, + 0xf5d8a8f8ba798c2a, + 0xf619b1698e39cf6b, + 0x95ddaf2f749104e2, + 0xec2a9c80e0886427, + 0xce5c8fd8825b95ea, + 0xc4e0d9993ac60271, + 0x4699c3a5173076f9, + 0x3d1b151f50a29f42, + 0x9ed505ea2bc75946, + 0x34665acfdc7f4b98, + 0x61b1fb53292342f7, + 0xc721c0080e864130, + 0x8693cd1696fd7b74, + 0x872731927136b14b, + 0xd3446c8a63a1721b, + 0x669a35e8a6680e4a, + 0xcab658f239509a16, + 0xa4e5de4ef42e8ab9, + 0x37a7435ee83f08d9, + 0x134e6239e26c7f96, + 0x82791a3c2df67488, + 0x3f6ef00a8329163c, + 0x8e5a7e42fdeb6591, + 0x5caaee4c7981ddb5, + 0x19f234785af1e80d, + 0x255ddde3ed98bd70, + 0x50898a32a99cccac, + 0x28ca4519da4e6656, + 0xae59880f4cb31d22, + 0x0d9798fa37d6db26, + 0x32f968f0b4ffcd1a, + 0xa00f09644f258545, + 0xfa3ad5175e24de72, + 0xf46c547c5db24615, + 0x713e80fbff0f7e20, + 0x7843cf2b73d2aafa, + 0xbd17ea36aedf62b4, + 0xfd111bacd16f92cf, + 0x4abaa7dbc72d67e0, + 0xb3416b5dad49fad3, + 0xbca316b24914a88b, + 0x15d150068aecf914, + 0xe27c1debe31efc40, + 0x4fe48c759beda223, + 0x7edcfd141b522c78, + 0x4e5070f17c26681c, + 0xe696cac15815f3bc, + 0x35d2a64b3bb481a7, + 0x800cff29fe7dfdf6, + 0x1ed9fac3d5baa4b0, + 0x6c2663a91ef599d1, + 0x03c1199134404341, + 0xf7ad4ded69f20554, + 0xcd9d9649b61bd6ab, + 0xc8c3bde7eadb1368, + 0xd131899fb02afb65, + 0x1d18e352e1fae7f1, + 0xda39235aef7ca6c1, + 0xa1bbf5e0a8ee4f7a, + 0x91377805cf9a0b1e, + 0x3138716180bf8e5b, + 0xd9f83acbdb3ce580, + 0x0275e515d38b897e, + 0x472d3f21f0fbbcc6, + 0x2d946eb7868ea395, + 0xba3c248d21942e09, + 0xe7223645bfde3983, + 0xff64feb902e41bb1, + 0xc97741630d10d957, + 0xc3cb1722b58d4ecc, + 0xa27aec719cae0c3b, + 0x99fecb51a48c15fb, + 0x1465ac826d27332b, + 0xe1bd047ad75ebf01, + 0x79f733af941960c5, + 0x672ec96c41a3c475, + 0xc27feba6524684f3, + 0x64efd0fd75e38734, + 0xed9e60040743ae18, + 0xfb8e2993b9ef144d, + 0x38453eb10c625a81, + 0x6978480742355c12, + 0x48cf42ce14a6ee9e, + 0x1cac1fd606312dce, + 0x7b82d6ba4792e9bb, + 0x9d141c7b1f871a07, + 0x5616b80dc11c4a2e, + 0xb849c198f21fa777, + 0x7ca91801c8d9a506, + 0xb1348e487ec273ad, + 0x41b20d1e987b3a44, + 0x7460ab55a3cfbbe3, + 0x84e628034576f20a, + 0x1b87d16d897a6173, + 0x0fe27defe45d5258, + 0x83cde6b8ca3dbeb7, + 0x0c23647ed01d1119, + 0x7a362a3ea0592384, + 0xb61f40f3f1893f10, + 0x75d457d1440471dc, + 0x4558da34237035b8, + 0xdca6116587fc2043, + 0x8d9b67d3c9ab26d0, + 0x2b0b5c88ee0e2517, + 0x6fe77a382ab5da90, + 0x269cc472d9d8fe31, + 0x63c41e46faa8cb89, + 0xb7abbc771642f52f, + 0x7d1de4852f126f39, + 0xa8c6ba3024339ba0, + 0x600507d7cee888c8, + 0x8fee82c61a20afae, + 0x57a2448926d78011, + 0xfca5e72836a458f0, + 0x072bcebb8f4b4cbd, + 0x497bbe4af36d24a1, + 0x3cafe99bb769557d, + 0x12fa9ebd05a7b5a9, + 0xe8c04baa5b836bdb, + 0x4273148fac3b7905, + 0x908384812851c121, + 0xe557d3506c55b0fd, + 0x72ff996acb4f3d61, + 0x3eda0c8e64e2dc03, + 0xf0868356e6b949e9, + 0x04ead72abb0b0ffc, + 0x17a4b5135967706a, + 0xe3c8e16f04d5367f, + 0xf84f30028daf570c, + 0x1846c8fcbd3a2232, + 0x5b8120f7f6ca9108, + 0xd46fa231ecea3ea6, + 0x334d947453340725, + 0x58403966c28ad249, + 0xbed6f3a79a9f21f5, + 0x68ccb483a5fe962d, + 0xd085751b57e1315a, + 0xfed0023de52fd18e, + 0x4b0e5b5f20e6addf, + 0x1a332de96eb1ab4c, + 0xa3ce10f57b65c604, + 0x108f7ba8d62c3cd7, + 0xab07a3a11073d8e1, + 0x6b0dad1291bed56c, + 0xf2f366433532c097, + 0x2e557726b2cee0d4, + 0x0000000000000000, + 0xcb02a476de9b5029, + 0xe4e32fd48b9e7ac2, + 0x734b65ee2c84f75e, + 0x6e5386bccd7e10af, + 0x01b4fc84e7cbca3f, + 0xcfe8735c65905fd5, + 0x3613bfda0ff4c2e6, + 0x113b872c31e7f6e8, + 0x2fe18ba255052aeb, + 0xe974b72ebc48a1e4, + 0x0abc5641b89d979b, + 0xb46aa5e62202b66e, + 0x44ec26b0c4bbff87, + 0xa6903b5b27a503c7, + 0x7f680190fc99e647, + 0x97a84a3aa71a8d9c, + 0xdd12ede16037ea7c, + 0xc554251ddd0dc84e, + 0x88c54c7d956be313, + 0x4d91696048662b5d, + 0xb08072cc9909b992, + 0xb5de5962c5c97c51, + 0x81b803ad19b637c9, + 0xb2f597d94a8230ec, + 0x0b08aac55f565da4, + 0xf1327fd2017283d6, + 0xad98919e78f35e63, + 0x6ab9519676751f53, + 0x24e921670a53774f, + 0xb9fd3d1c15d46d48, + 0x92f66194fbda485f, + 0x5a35dc7311015b37, + 0xded3f4705477a93d, + 0xc00a0eb381cd0d8d, + 0xbb88d809c65fe436, + 0x16104997beacba55, + 0x21b70ac95693b28c, + 0x59f4c5e225411876, + 0xd5db5eb50b21f499, + 0x55d7a19cf55c096f, + 0xa97246b4c3f8519f, + 0x8552d487a2bd3835, + 0x54635d181297c350, + 0x23c2efdc85183bf2, + 0x9f61f96ecc0c9379, + 0x534893a39ddc8fed, + 0x5edf0b59aa0a54cb, + 0xac2c6d1a9f38945c, + 0xd7aebba0d8aa7de7, + 0x2abfa00c09c5ef28, + 0xd84cc64f3cf72fbf, + 0x2003f64db15878b3, + 0xa724c7dfc06ec9f8, + 0x069f323f68808682, + 0xcc296acd51d01c94, + 0x055e2bae5cc0c5c3, + 0x6270e2c21d6301b6, + 0x3b842720382219c0, + 0xd2f0900e846ab824, + 0x52fc6f277a1745d2, + 0xc6953c8ce94d8b0f, + 0xe009f8fe3095753e, + 0x655b2c7992284d0b, + 0x984a37d54347dfc4, + 0xeab5aebf8808e2a5, + 0x9a3fd2c090cc56ba, + 0x9ca0e0fff84cd038, + 0x4c2595e4afade162, + 0xdf6708f4b3bc6302, + 0xbf620f237d54ebca, + 0x93429d101c118260, + 0x097d4fd08cddd4da, + 0x8c2f9b572e60ecef, + 0x708a7c7f18c4b41f, + 0x3a30dba4dfe9d3ff, + 0x4006f19a7fb0f07b, + 0x5f6bf7dd4dc19ef4, + 0x1f6d064732716e8f, + 0xf9fbcc866a649d33, + 0x308c8de567744464, + 0x8971b0f972a0292c, + 0xd61a47243f61b7d8, + 0xefeb8511d4c82766, + 0x961cb6be40d147a3, + 0xaab35f25f7b812de, + 0x76154e407044329d, + 0x513d76b64e570693, + 0xf3479ac7d2f90aa8, + 0x9b8b2e4477079c85, + 0x297eb99d3d85ac69, + }, + { + 0x3ef29d249b2c0a19, + 0xe9e16322b6f8622f, + 0x5536994047757f7a, + 0x9f4d56d5a47b0b33, + 0x822567466aa1174c, + 0xb8f5057deb082fb2, + 0xcc48c10bf4475f53, + 0x373088d4275dec3a, + 0x968f4325180aed10, + 0x173d232cf7016151, + 0xae4ed09f946fcc13, + 0xfd4b4741c4539873, + 0x1b5b3f0dd9933765, + 0x2ffcb0967b644052, + 0xe02376d20a89840c, + 0xa3ae3a70329b18d7, + 0x419cbd2335de8526, + 0xfafebf115b7c3199, + 0x0397074f85aa9b0d, + 0xc58ad4fb4836b970, + 0xbec60be3fc4104a8, + 0x1eff36dc4b708772, + 0x131fdc33ed8453b6, + 0x0844e33e341764d3, + 0x0ff11b6eab38cd39, + 0x64351f0a7761b85a, + 0x3b5694f509cfba0e, + 0x30857084b87245d0, + 0x47afb3bd2297ae3c, + 0xf2ba5c2f6f6b554a, + 0x74bdc4761f4f70e1, + 0xcfdfc64471edc45e, + 0xe610784c1dc0af16, + 0x7aca29d63c113f28, + 0x2ded411776a859af, + 0xac5f211e99a3d5ee, + 0xd484f949a87ef33b, + 0x3ce36ca596e013e4, + 0xd120f0983a9d432c, + 0x6bc40464dc597563, + 0x69d5f5e5d1956c9e, + 0x9ae95f043698bb24, + 0xc9ecc8da66a4ef44, + 0xd69508c8a5b2eac6, + 0xc40c2235c0503b80, + 0x38c193ba8c652103, + 0x1ceec75d46bc9e8f, + 0xd331011937515ad1, + 0xd8e2e56886eca50f, + 0xb137108d5779c991, + 0x709f3b6905ca4206, + 0x4feb50831680caef, + 0xec456af3241bd238, + 0x58d673afe181abbe, + 0x242f54e7cad9bf8c, + 0x0211f1810dcc19fd, + 0x90bc4dbb0f43c60a, + 0x9518446a9da0761d, + 0xa1bfcbf13f57012a, + 0x2bde4f8961e172b5, + 0x27b853a84f732481, + 0xb0b1e643df1f4b61, + 0x18cc38425c39ac68, + 0xd2b7f7d7bf37d821, + 0x3103864a3014c720, + 0x14aa246372abfa5c, + 0x6e600db54ebac574, + 0x394765740403a3f3, + 0x09c215f0bc71e623, + 0x2a58b947e987f045, + 0x7b4cdf18b477bdd8, + 0x9709b5eb906c6fe0, + 0x73083c268060d90b, + 0xfedc400e41f9037e, + 0x284948c6e44be9b8, + 0x728ecae808065bfb, + 0x06330e9e17492b1a, + 0x5950856169e7294e, + 0xbae4f4fce6c4364f, + 0xca7bcf95e30e7449, + 0x7d7fd186a33e96c2, + 0x52836110d85ad690, + 0x4dfaa1021b4cd312, + 0x913abb75872544fa, + 0xdd46ecb9140f1518, + 0x3d659a6b1e869114, + 0xc23f2cabd719109a, + 0xd713fe062dd46836, + 0xd0a60656b2fbc1dc, + 0x221c5a79dd909496, + 0xefd26dbca1b14935, + 0x0e77eda0235e4fc9, + 0xcbfd395b6b68f6b9, + 0x0de0eaefa6f4d4c4, + 0x0422ff1f1a8532e7, + 0xf969b85eded6aa94, + 0x7f6e2007aef28f3f, + 0x3ad0623b81a938fe, + 0x6624ee8b7aada1a7, + 0xb682e8ddc856607b, + 0xa78cc56f281e2a30, + 0xc79b257a45faa08d, + 0x5b4174e0642b30b3, + 0x5f638bff7eae0254, + 0x4bc9af9c0c05f808, + 0xce59308af98b46ae, + 0x8fc58da9cc55c388, + 0x803496c7676d0eb1, + 0xf33caae1e70dd7ba, + 0xbb6202326ea2b4bf, + 0xd5020f87201871cb, + 0x9d5ca754a9b712ce, + 0x841669d87de83c56, + 0x8a6184785eb6739f, + 0x420bba6cb0741e2b, + 0xf12d5b60eac1ce47, + 0x76ac35f71283691c, + 0x2c6bb7d9fecedb5f, + 0xfccdb18f4c351a83, + 0x1f79c012c3160582, + 0xf0abadae62a74cb7, + 0xe1a5801c82ef06fc, + 0x67a21845f2cb2357, + 0x5114665f5df04d9d, + 0xbf40fd2d74278658, + 0xa0393d3fb73183da, + 0x05a409d192e3b017, + 0xa9fb28cf0b4065f9, + 0x25a9a22942bf3d7c, + 0xdb75e22703463e02, + 0xb326e10c5ab5d06c, + 0xe7968e8295a62de6, + 0xb973f3b3636ead42, + 0xdf571d3819c30ce5, + 0xee549b7229d7cbc5, + 0x12992afd65e2d146, + 0xf8ef4e9056b02864, + 0xb7041e134030e28b, + 0xc02edd2adad50967, + 0x932b4af48ae95d07, + 0x6fe6fb7bc6dc4784, + 0x239aacb755f61666, + 0x401a4bedbdb807d6, + 0x485ea8d389af6305, + 0xa41bc220adb4b13d, + 0x753b32b89729f211, + 0x997e584bb3322029, + 0x1d683193ceda1c7f, + 0xff5ab6c0c99f818e, + 0x16bbd5e27f67e3a1, + 0xa59d34ee25d233cd, + 0x98f8ae853b54a2d9, + 0x6df70afacb105e79, + 0x795d2e99b9bba425, + 0x8e437b6744334178, + 0x0186f6ce886682f0, + 0xebf092a3bb347bd2, + 0xbcd7fa62f18d1d55, + 0xadd9d7d011c5571e, + 0x0bd3e471b1bdffde, + 0xaa6c2f808eeafef4, + 0x5ee57d31f6c880a4, + 0xf50fa47ff044fca0, + 0x1addc9c351f5b595, + 0xea76646d3352f922, + 0x0000000000000000, + 0x85909f16f58ebea6, + 0x46294573aaf12ccc, + 0x0a5512bf39db7d2e, + 0x78dbd85731dd26d5, + 0x29cfbe086c2d6b48, + 0x218b5d36583a0f9b, + 0x152cd2adfacd78ac, + 0x83a39188e2c795bc, + 0xc3b9da655f7f926a, + 0x9ecba01b2c1d89c3, + 0x07b5f8509f2fa9ea, + 0x7ee8d6c926940dcf, + 0x36b67e1aaf3b6eca, + 0x86079859702425ab, + 0xfb7849dfd31ab369, + 0x4c7c57cc932a51e2, + 0xd96413a60e8a27ff, + 0x263ea566c715a671, + 0x6c71fc344376dc89, + 0x4a4f595284637af8, + 0xdaf314e98b20bcf2, + 0x572768c14ab96687, + 0x1088db7c682ec8bb, + 0x887075f9537a6a62, + 0x2e7a4658f302c2a2, + 0x619116dbe582084d, + 0xa87dde018326e709, + 0xdcc01a779c6997e8, + 0xedc39c3dac7d50c8, + 0xa60a33a1a078a8c0, + 0xc1a82be452b38b97, + 0x3f746bea134a88e9, + 0xa228ccbebafd9a27, + 0xabead94e068c7c04, + 0xf48952b178227e50, + 0x5cf48cb0fb049959, + 0x6017e0156de48abd, + 0x4438b4f2a73d3531, + 0x8c528ae649ff5885, + 0xb515ef924dfcfb76, + 0x0c661c212e925634, + 0xb493195cc59a7986, + 0x9cda519a21d1903e, + 0x32948105b5be5c2d, + 0x194ace8cd45f2e98, + 0x438d4ca238129cdb, + 0x9b6fa9cabefe39d4, + 0x81b26009ef0b8c41, + 0xded1ebf691a58e15, + 0x4e6da64d9ee6481f, + 0x54b06f8ecf13fd8a, + 0x49d85e1d01c9e1f5, + 0xafc826511c094ee3, + 0xf698a33075ee67ad, + 0x5ac7822eec4db243, + 0x8dd47c28c199da75, + 0x89f68337db1ce892, + 0xcdce37c57c21dda3, + 0x530597de503c5460, + 0x6a42f2aa543ff793, + 0x5d727a7e73621ba9, + 0xe232875307459df1, + 0x56a19e0fc2dfe477, + 0xc61dd3b4cd9c227d, + 0xe5877f03986a341b, + 0x949eb2a415c6f4ed, + 0x6206119460289340, + 0x6380e75ae84e11b0, + 0x8be772b6d6d0f16f, + 0x50929091d596cf6d, + 0xe86795ec3e9ee0df, + 0x7cf927482b581432, + 0xc86a3e14eec26db4, + 0x7119cda78dacc0f6, + 0xe40189cd100cb6eb, + 0x92adbc3a028fdff7, + 0xb2a017c2d2d3529c, + 0x200dabf8d05c8d6b, + 0x34a78f9ba2f77737, + 0xe3b4719d8f231f01, + 0x45be423c2f5bb7c1, + 0xf71e55fefd88e55d, + 0x6853032b59f3ee6e, + 0x65b3e9c4ff073aaa, + 0x772ac3399ae5ebec, + 0x87816e97f842a75b, + 0x110e2db2e0484a4b, + 0x331277cb3dd8dedd, + 0xbd510cac79eb9fa5, + 0x352179552a91f5c7, + }, + { + 0x05ba7bc82c9b3220, + 0x31a54665f8b65e4f, + 0xb1b651f77547f4d4, + 0x8bfa0d857ba46682, + 0x85a96c5aa16a98bb, + 0x990faef908eb79c9, + 0xa15e37a247f4a62d, + 0x76857dcd5d27741e, + 0xf8c50b800a1820bc, + 0xbe65dcb201f7a2b4, + 0x666d1b986f9426e7, + 0x4cc921bf53c4e648, + 0x95410a0f93d9ca42, + 0x20cdccaa647ba4ef, + 0x429a4060890a1871, + 0x0c4ea4f69b32b38b, + 0xccda362dde354cd3, + 0x96dc23bc7c5b2fa9, + 0xc309bb68aa851ab3, + 0xd26131a73648e013, + 0x021dc52941fc4db2, + 0xcd5adab7704be48a, + 0xa77965d984ed71e6, + 0x32386fd61734bba4, + 0xe82d6dd538ab7245, + 0x5c2147ea6177b4b1, + 0x5da1ab70cf091ce8, + 0xac907fce72b8bdff, + 0x57c85dfd972278a8, + 0xa4e44c6a6b6f940d, + 0x3851995b4f1fdfe4, + 0x62578ccaed71bc9e, + 0xd9882bb0c01d2c0a, + 0x917b9d5d113c503b, + 0xa2c31e11a87643c6, + 0xe463c923a399c1ce, + 0xf71686c57ea876dc, + 0x87b4a973e096d509, + 0xaf0d567d9d3a5814, + 0xb40c2a3f59dcc6f4, + 0x3602f88495d121dd, + 0xd3e1dd3d9836484a, + 0xf945e71aa46688e5, + 0x7518547eb2a591f5, + 0x9366587450c01d89, + 0x9ea81018658c065b, + 0x4f54080cbc4603a3, + 0x2d0384c65137bf3d, + 0xdc325078ec861e2a, + 0xea30a8fc79573ff7, + 0x214d2030ca050cb6, + 0x65f0322b8016c30c, + 0x69be96dd1b247087, + 0xdb95ee9981e161b8, + 0xd1fc1814d9ca05f8, + 0x820ed2bbcc0de729, + 0x63d76050430f14c7, + 0x3bccb0e8a09d3a0f, + 0x8e40764d573f54a2, + 0x39d175c1e16177bd, + 0x12f5a37c734f1f4b, + 0xab37c12f1fdfc26d, + 0x5648b167395cd0f1, + 0x6c04ed1537bf42a7, + 0xed97161d14304065, + 0x7d6c67daab72b807, + 0xec17fa87ba4ee83c, + 0xdfaf79cb0304fbc1, + 0x733f060571bc463e, + 0x78d61c1287e98a27, + 0xd07cf48e77b4ada1, + 0xb9c262536c90dd26, + 0xe2449b5860801605, + 0x8fc09ad7f941fcfb, + 0xfad8cea94be46d0e, + 0xa343f28b0608eb9f, + 0x9b126bd04917347b, + 0x9a92874ae7699c22, + 0x1b017c42c4e69ee0, + 0x3a4c5c720ee39256, + 0x4b6e9f5e3ea399da, + 0x6ba353f45ad83d35, + 0xe7fee0904c1b2425, + 0x22d009832587e95d, + 0x842980c00f1430e2, + 0xc6b3c0a0861e2893, + 0x087433a419d729f2, + 0x341f3dadd42d6c6f, + 0xee0a3faefbb2a58e, + 0x4aee73c490dd3183, + 0xaab72db5b1a16a34, + 0xa92a04065e238fdf, + 0x7b4b35a1686b6fcc, + 0x6a23bf6ef4a6956c, + 0x191cb96b851ad352, + 0x55d598d4d6de351a, + 0xc9604de5f2ae7ef3, + 0x1ca6c2a3a981e172, + 0xde2f9551ad7a5398, + 0x3025aaff56c8f616, + 0x15521d9d1e2860d9, + 0x506fe31cfa45073a, + 0x189c55f12b647b0b, + 0x0180ec9aae7ea859, + 0x7cec8b40050c105e, + 0x2350e5198bf94104, + 0xef8ad33455cc0dd7, + 0x07a7bee16d677f92, + 0xe5e325b90de76997, + 0x5a061591a26e637a, + 0xb611ef1618208b46, + 0x09f4df3eb7a981ab, + 0x1ebb078ae87dacc0, + 0xb791038cb65e231f, + 0x0fd38d4574b05660, + 0x67edf702c1ea8ebe, + 0xba5f4be0831238cd, + 0xe3c477c2cefebe5c, + 0x0dce486c354c1bd2, + 0x8c5db36416c31910, + 0x26ea9ed1a7627324, + 0x039d29b3ef82e5eb, + 0x9f28fc82cbf2ae02, + 0xa8aae89cf05d2786, + 0x431aacfa2774b028, + 0xcf471f9e31b7a938, + 0x581bd0b8e3922ec8, + 0xbc78199b400bef06, + 0x90fb71c7bf42f862, + 0x1f3beb1046030499, + 0x683e7a47b55ad8de, + 0x988f4263a695d190, + 0xd808c72a6e638453, + 0x0627527bc319d7cb, + 0xebb04466d72997ae, + 0xe67e0c0ae2658c7c, + 0x14d2f107b056c880, + 0x7122c32c30400b8c, + 0x8a7ae11fd5dacedb, + 0xa0dedb38e98a0e74, + 0xad109354dcc615a6, + 0x0be91a17f655cc19, + 0x8ddd5ffeb8bdb149, + 0xbfe53028af890aed, + 0xd65ba6f5b4ad7a6a, + 0x7956f0882997227e, + 0x10e8665532b352f9, + 0x0e5361dfdacefe39, + 0xcec7f3049fc90161, + 0xff62b561677f5f2e, + 0x975ccf26d22587f0, + 0x51ef0f86543baf63, + 0x2f1e41ef10cbf28f, + 0x52722635bbb94a88, + 0xae8dbae73344f04d, + 0x410769d36688fd9a, + 0xb3ab94de34bbb966, + 0x801317928df1aa9b, + 0xa564a0f0c5113c54, + 0xf131d4bebdb1a117, + 0x7f71a2f3ea8ef5b5, + 0x40878549c8f655c3, + 0x7ef14e6944f05dec, + 0xd44663dcf55137d8, + 0xf2acfd0d523344fc, + 0x0000000000000000, + 0x5fbc6e598ef5515a, + 0x16cf342ef1aa8532, + 0xb036bd6ddb395c8d, + 0x13754fe6dd31b712, + 0xbbdfa77a2d6c9094, + 0x89e7c8ac3a582b30, + 0x3c6b0e09cdfa459d, + 0xc4ae0589c7e26521, + 0x49735a777f5fd468, + 0xcafd64561d2c9b18, + 0xda1502032f9fc9e1, + 0x8867243694268369, + 0x3782141e3baf8984, + 0x9cb5d53124704be9, + 0xd7db4a6f1ad3d233, + 0xa6f989432a93d9bf, + 0x9d3539ab8a0ee3b0, + 0x53f2caaf15c7e2d1, + 0x6e19283c76430f15, + 0x3debe2936384edc4, + 0x5e3c82c3208bf903, + 0x33b8834cb94a13fd, + 0x6470deb12e686b55, + 0x359fd1377a53c436, + 0x61caa57902f35975, + 0x043a975282e59a79, + 0xfd7f70482683129c, + 0xc52ee913699ccd78, + 0x28b9ff0e7dac8d1d, + 0x5455744e78a09d43, + 0xcb7d88ccb3523341, + 0x44bd121b4a13cfba, + 0x4d49cd25fdba4e11, + 0x3e76cb208c06082f, + 0x3ff627ba2278a076, + 0xc28957f204fbb2ea, + 0x453dfe81e46d67e3, + 0x94c1e6953da7621b, + 0x2c83685cff491764, + 0xf32c1197fc4deca5, + 0x2b24d6bd922e68f6, + 0xb22b78449ac5113f, + 0x48f3b6edd1217c31, + 0x2e9ead75beb55ad6, + 0x174fd8b45fd42d6b, + 0x4ed4e4961238abfa, + 0x92e6b4eefebeb5d0, + 0x46a0d7320bef8208, + 0x47203ba8a5912a51, + 0x24f75bf8e69e3e96, + 0xf0b1382413cf094e, + 0xfee259fbc901f777, + 0x276a724b091cdb7d, + 0xbdf8f501ee75475f, + 0x599b3c224dec8691, + 0x6d84018f99c1eafe, + 0x7498b8e41cdb39ac, + 0xe0595e71217c5bb7, + 0x2aa43a273c50c0af, + 0xf50b43ec3f543b6e, + 0x838e3e2162734f70, + 0xc09492db4507ff58, + 0x72bfea9fdfc2ee67, + 0x11688acf9ccdfaa0, + 0x1a8190d86a9836b9, + 0x7acbd93bc615c795, + 0xc7332c3a286080ca, + 0x863445e94ee87d50, + 0xf6966a5fd0d6de85, + 0xe9ad814f96d5da1c, + 0x70a22fb69e3ea3d5, + 0x0a69f68d582b6440, + 0xb8428ec9c2ee757f, + 0x604a49e3ac8df12c, + 0x5b86f90b0c10cb23, + 0xe1d9b2eb8f02f3ee, + 0x29391394d3d22544, + 0xc8e0a17f5cd0d6aa, + 0xb58cc6a5f7a26ead, + 0x8193fb08238f02c2, + 0xd5c68f465b2f9f81, + 0xfcff9cd288fdbac5, + 0x77059157f359dc47, + 0x1d262e3907ff492b, + 0xfb582233e59ac557, + 0xddb2bce242f8b673, + 0x2577b76248e096cf, + 0x6f99c4a6d83da74c, + 0xc1147e41eb795701, + 0xf48baf76912a9337, + }, + { + 0x45b268a93acde4cc, + 0xaf7f0be884549d08, + 0x048354b3c1468263, + 0x925435c2c80efed2, + 0xee4e37f27fdffba7, + 0x167a33920c60f14d, + 0xfb123b52ea03e584, + 0x4a0cab53fdbb9007, + 0x9deaf6380f788a19, + 0xcb48ec558f0cb32a, + 0xb59dc4b2d6fef7e0, + 0xdcdbca22f4f3ecb6, + 0x11df5813549a9c40, + 0xe33fdedf568aced3, + 0xa0c1c8124322e9c3, + 0x07a56b8158fa6d0d, + 0x77279579b1e1f3dd, + 0xd9b18b74422ac004, + 0xb8ec2d9fffabc294, + 0xf4acf8a82d75914f, + 0x7bbf69b1ef2b6878, + 0xc4f62faf487ac7e1, + 0x76ce809cc67e5d0c, + 0x6711d88f92e4c14c, + 0x627b99d9243dedfe, + 0x234aa5c3dfb68b51, + 0x909b1f15262dbf6d, + 0x4f66ea054b62bcb5, + 0x1ae2cf5a52aa6ae8, + 0xbea053fbd0ce0148, + 0xed6808c0e66314c9, + 0x43fe16cd15a82710, + 0xcd049231a06970f6, + 0xe7bc8a6c97cc4cb0, + 0x337ce835fcb3b9c0, + 0x65def2587cc780f3, + 0x52214ede4132bb50, + 0x95f15e4390f493df, + 0x870839625dd2e0f1, + 0x41313c1afb8b66af, + 0x91720af051b211bc, + 0x477d427ed4eea573, + 0x2e3b4ceef6e3be25, + 0x82627834eb0bcc43, + 0x9c03e3dd78e724c8, + 0x2877328ad9867df9, + 0x14b51945e243b0f2, + 0x574b0f88f7eb97e2, + 0x88b6fa989aa4943a, + 0x19c4f068cb168586, + 0x50ee6409af11faef, + 0x7df317d5c04eaba4, + 0x7a567c5498b4c6a9, + 0xb6bbfb804f42188e, + 0x3cc22bcf3bc5cd0b, + 0xd04336eaaa397713, + 0xf02fac1bec33132c, + 0x2506dba7f0d3488d, + 0xd7e65d6bf2c31a1e, + 0x5eb9b2161ff820f5, + 0x842e0650c46e0f9f, + 0x716beb1d9e843001, + 0xa933758cab315ed4, + 0x3fe414fda2792265, + 0x27c9f1701ef00932, + 0x73a4c1ca70a771be, + 0x94184ba6e76b3d0e, + 0x40d829ff8c14c87e, + 0x0fbec3fac77674cb, + 0x3616a9634a6a9572, + 0x8f139119c25ef937, + 0xf545ed4d5aea3f9e, + 0xe802499650ba387b, + 0x6437e7bd0b582e22, + 0xe6559f89e053e261, + 0x80ad52e305288dfc, + 0x6dc55a23e34b9935, + 0xde14e0f51ad0ad09, + 0xc6390578a659865e, + 0x96d7617109487cb1, + 0xe2d6cb3a21156002, + 0x01e915e5779faed1, + 0xadb0213f6a77dcb7, + 0x9880b76eb9a1a6ab, + 0x5d9f8d248644cf9b, + 0xfd5e4536c5662658, + 0xf1c6b9fe9bacbdfd, + 0xeacd6341be9979c4, + 0xefa7221708405576, + 0x510771ecd88e543e, + 0xc2ba51cb671f043d, + 0x0ad482ac71af5879, + 0xfe787a045cdac936, + 0xb238af338e049aed, + 0xbd866cc94972ee26, + 0x615da6ebbd810290, + 0x3295fdd08b2c1711, + 0xf834046073bf0aea, + 0xf3099329758ffc42, + 0x1caeb13e7dcfa934, + 0xba2307481188832b, + 0x24efce42874ce65c, + 0x0e57d61fb0e9da1a, + 0xb3d1bad6f99b343c, + 0xc0757b1c893c4582, + 0x2b510db8403a9297, + 0x5c7698c1f1db614a, + 0x3e0d0118d5e68cb4, + 0xd60f488e855cb4cf, + 0xae961e0df3cb33d9, + 0x3a8e55ab14a00ed7, + 0x42170328623789c1, + 0x838b6dd19c946292, + 0x895fef7ded3b3aeb, + 0xcfcbb8e64e4a3149, + 0x064c7e642f65c3dc, + 0x3d2b3e2a4c5a63da, + 0x5bd3f340a9210c47, + 0xb474d157a1615931, + 0xac5934da1de87266, + 0x6ee365117af7765b, + 0xc86ed36716b05c44, + 0x9ba6885c201d49c5, + 0xb905387a88346c45, + 0x131072c4bab9ddff, + 0xbf49461ea751af99, + 0xd52977bc1ce05ba1, + 0xb0f785e46027db52, + 0x546d30ba6e57788c, + 0x305ad707650f56ae, + 0xc987c682612ff295, + 0xa5ab8944f5fbc571, + 0x7ed528e759f244ca, + 0x8ddcbbce2c7db888, + 0xaa154abe328db1ba, + 0x1e619be993ece88b, + 0x09f2bd9ee813b717, + 0x7401aa4b285d1cb3, + 0x21858f143195caee, + 0x48c381841398d1b8, + 0xfcb750d3b2f98889, + 0x39a86a998d1ce1b9, + 0x1f888e0ce473465a, + 0x7899568376978716, + 0x02cf2ad7ee2341bf, + 0x85c713b5b3f1a14e, + 0xff916fe12b4567e7, + 0x7c1a0230b7d10575, + 0x0c98fcc85eca9ba5, + 0xa3e7f720da9e06ad, + 0x6a6031a2bbb1f438, + 0x973e74947ed7d260, + 0x2cf4663918c0ff9a, + 0x5f50a7f368678e24, + 0x34d983b4a449d4cd, + 0x68af1b755592b587, + 0x7f3c3d022e6dea1b, + 0xabfc5f5b45121f6b, + 0x0d71e92d29553574, + 0xdffdf5106d4f03d8, + 0x081ba87b9f8c19c6, + 0xdb7ea1a3ac0981bb, + 0xbbca12ad66172dfa, + 0x79704366010829c7, + 0x179326777bff5f9c, + 0x0000000000000000, + 0xeb2476a4c906d715, + 0x724dd42f0738df6f, + 0xb752ee6538ddb65f, + 0x37ffbc863df53ba3, + 0x8efa84fcb5c157e6, + 0xe9eb5c73272596aa, + 0x1b0bdabf2535c439, + 0x86e12c872a4d4e20, + 0x9969a28bce3e087a, + 0xfafb2eb79d9c4b55, + 0x056a4156b6d92cb2, + 0x5a3ae6a5debea296, + 0x22a3b026a8292580, + 0x53c85b3b36ad1581, + 0xb11e900117b87583, + 0xc51f3a4a3fe56930, + 0xe019e1edcf3621bd, + 0xec811d2591fcba18, + 0x445b7d4c4d524a1d, + 0xa8da6069dcaef005, + 0x58f5cc72309de329, + 0xd4c062596b7ff570, + 0xce22ad0339d59f98, + 0x591cd99747024df8, + 0x8b90c5aa03187b54, + 0xf663d27fc356d0f0, + 0xd8589e9135b56ed5, + 0x35309651d3d67a1c, + 0x12f96721cd26732e, + 0xd28c1c3d441a36ac, + 0x492a946164077f69, + 0x2d1d73dc6f5f514b, + 0x6f0a70f40d68d88a, + 0x60b4b30eca1eac41, + 0xd36509d83385987d, + 0x0b3d97490630f6a8, + 0x9eccc90a96c46577, + 0xa20ee2c5ad01a87c, + 0xe49ab55e0e70a3de, + 0xa4429ca182646ba0, + 0xda97b446db962f6a, + 0xcced87d4d7f6de27, + 0x2ab8185d37a53c46, + 0x9f25dcefe15bcba6, + 0xc19c6ef9fea3eb53, + 0xa764a3931bd884ce, + 0x2fd2590b817c10f4, + 0x56a21a6d80743933, + 0xe573a0bb79ef0d0f, + 0x155c0ca095dc1e23, + 0x6c2c4fc694d437e4, + 0x10364df623053291, + 0xdd32dfc7836c4267, + 0x03263f3299bcef6e, + 0x66f8cd6ae57b6f9d, + 0x8c35ae2b5be21659, + 0x31b3c2e21290f87f, + 0x93bd2027bf915003, + 0x69460e90220d1b56, + 0x299e276fae19d328, + 0x63928c3c53a2432f, + 0x7082fef8e91b9ed0, + 0xbc6f792c3eed40f7, + 0x4c40d537d2de53db, + 0x75e8bfae5fc2b262, + 0x4da9c0d2a541fd0a, + 0x4e8fffe03cfd1264, + 0x2620e495696fa7e3, + 0xe1f0f408b8a98f6c, + 0xd1aa230fdda6d9c2, + 0xc7d0109dd1c6288f, + 0x8a79d04f7487d585, + 0x4694579ba3710ba2, + 0x38417f7cfa834f68, + 0x1d47a4db0a5007e5, + 0x206c9af1460a643f, + 0xa128ddf734bd4712, + 0x8144470672b7232d, + 0xf2e086cc02105293, + 0x182de58dbc892b57, + 0xcaa1f9b0f8931dfb, + 0x6b892447cc2e5ae9, + 0xf9dd11850420a43b, + 0x4be5beb68a243ed6, + 0x5584255f19c8d65d, + 0x3b67404e633fa006, + 0xa68db6766c472a1f, + 0xf78ac79ab4c97e21, + 0xc353442e1080aaec, + 0x9a4f9db95782e714, + }, + { + 0xc811a8058c3f55de, + 0x65f5b43196b50619, + 0xf74f96b1d6706e43, + 0x859d1e8bcb43d336, + 0x5aab8a85ccfa3d84, + 0xf9c7bf99c295fcfd, + 0xa21fd5a1de4b630f, + 0xcdb3ef763b8b456d, + 0x803f59f87cf7c385, + 0xb27c73be5f31913c, + 0x98e3ac6633b04821, + 0xbf61674c26b8f818, + 0x0ffbc995c4c130c8, + 0xaaa0862010761a98, + 0x6057f342210116aa, + 0xf63c760c0654cc35, + 0x2ddb45cc667d9042, + 0xbcf45a964bd40382, + 0x68e8a0c3ef3c6f3d, + 0xa7bd92d269ff73bc, + 0x290ae20201ed2287, + 0xb7de34cde885818f, + 0xd901eea7dd61059b, + 0xd6fa273219a03553, + 0xd56f1ae874cccec9, + 0xea31245c2e83f554, + 0x7034555da07be499, + 0xce26d2ac56e7bef7, + 0xfd161857a5054e38, + 0x6a0e7da4527436d1, + 0x5bd86a381cde9ff2, + 0xcaf7756231770c32, + 0xb09aaed9e279c8d0, + 0x5def1091c60674db, + 0x111046a2515e5045, + 0x23536ce4729802fc, + 0xc50cbcf7f5b63cfa, + 0x73a16887cd171f03, + 0x7d2941afd9f28dbd, + 0x3f5e3eb45a4f3b9d, + 0x84eefe361b677140, + 0x3db8e3d3e7076271, + 0x1a3a28f9f20fd248, + 0x7ebc7c75b49e7627, + 0x74e5f293c7eb565c, + 0x18dcf59e4f478ba4, + 0x0c6ef44fa9adcb52, + 0xc699812d98dac760, + 0x788b06dc6e469d0e, + 0xfc65f8ea7521ec4e, + 0x30a5f7219e8e0b55, + 0x2bec3f65bca57b6b, + 0xddd04969baf1b75e, + 0x99904cdbe394ea57, + 0x14b201d1e6ea40f6, + 0xbbb0c08241284add, + 0x50f20463bf8f1dff, + 0xe8d7f93b93cbacb8, + 0x4d8cb68e477c86e8, + 0xc1dd1b3992268e3f, + 0x7c5aa11209d62fcb, + 0x2f3d98abdb35c9ae, + 0x671369562bfd5ff5, + 0x15c1e16c36cee280, + 0x1d7eb2edf8f39b17, + 0xda94d37db00dfe01, + 0x877bc3ec760b8ada, + 0xcb8495dfe153ae44, + 0x05a24773b7b410b3, + 0x12857b783c32abdf, + 0x8eb770d06812513b, + 0x536739b9d2e3e665, + 0x584d57e271b26468, + 0xd789c78fc9849725, + 0xa935bbfa7d1ae102, + 0x8b1537a3dfa64188, + 0xd0cd5d9bc378de7a, + 0x4ac82c9a4d80cfb7, + 0x42777f1b83bdb620, + 0x72d2883a1d33bd75, + 0x5e7a2d4bab6a8f41, + 0xf4daab6bbb1c95d9, + 0x905cffe7fd8d31b6, + 0x83aa6422119b381f, + 0xc0aefb8442022c49, + 0xa0f908c663033ae3, + 0xa428af0804938826, + 0xade41c341a8a53c7, + 0xae7121ee77e6a85d, + 0xc47f5c4a25929e8c, + 0xb538e9aa55cdd863, + 0x06377aa9dad8eb29, + 0xa18ae87bb3279895, + 0x6edfda6a35e48414, + 0x6b7d9d19825094a7, + 0xd41cfa55a4e86cbf, + 0xe5caedc9ea42c59c, + 0xa36c351c0e6fc179, + 0x5181e4de6fabbf89, + 0xfff0c530184d17d4, + 0x9d41eb1584045892, + 0x1c0d525028d73961, + 0xf178ec180ca8856a, + 0x9a0571018ef811cd, + 0x4091a27c3ef5efcc, + 0x19af15239f6329d2, + 0x347450eff91eb990, + 0xe11b4a078dd27759, + 0xb9561de5fc601331, + 0x912f1f5a2da993c0, + 0x1654dcb65ba2191a, + 0x3e2dde098a6b99eb, + 0x8a66d71e0f82e3fe, + 0x8c51adb7d55a08d7, + 0x4533e50f8941ff7f, + 0x02e6dd67bd4859ec, + 0xe068aaba5df6d52f, + 0xc24826e3ff4a75a5, + 0x6c39070d88acddf8, + 0x6486548c4691a46f, + 0xd1bebd26135c7c0c, + 0xb30f93038f15334a, + 0x82d9849fc1bf9a69, + 0x9c320ba85420fae4, + 0xfa528243aff90767, + 0x9ed4d6cfe968a308, + 0xb825fd582c44b147, + 0x9b7691bc5edcb3bb, + 0xc7ea619048fe6516, + 0x1063a61f817af233, + 0x47d538683409a693, + 0x63c2ce984c6ded30, + 0x2a9fdfd86c81d91d, + 0x7b1e3b06032a6694, + 0x666089ebfbd9fd83, + 0x0a598ee67375207b, + 0x07449a140afc495f, + 0x2ca8a571b6593234, + 0x1f986f8a45bbc2fb, + 0x381aa4a050b372c2, + 0x5423a3add81faf3a, + 0x17273c0b8b86bb6c, + 0xfe83258dc869b5a2, + 0x287902bfd1c980f1, + 0xf5a94bd66b3837af, + 0x88800a79b2caba12, + 0x55504310083b0d4c, + 0xdf36940e07b9eeb2, + 0x04d1a7ce6790b2c5, + 0x612413fff125b4dc, + 0x26f12b97c52c124f, + 0x86082351a62f28ac, + 0xef93632f9937e5e7, + 0x3507b052293a1be6, + 0xe72c30ae570a9c70, + 0xd3586041ae1425e0, + 0xde4574b3d79d4cc4, + 0x92ba228040c5685a, + 0xf00b0ca5dc8c271c, + 0xbe1287f1f69c5a6e, + 0xf39e317fb1e0dc86, + 0x495d114020ec342d, + 0x699b407e3f18cd4b, + 0xdca3a9d46ad51528, + 0x0d1d14f279896924, + 0x0000000000000000, + 0x593eb75fa196c61e, + 0x2e4e78160b116bd8, + 0x6d4ae7b058887f8e, + 0xe65fd013872e3e06, + 0x7a6ddbbbd30ec4e2, + 0xac97fc89caaef1b1, + 0x09ccb33c1e19dbe1, + 0x89f3eac462ee1864, + 0x7770cf49aa87adc6, + 0x56c57eca6557f6d6, + 0x03953dda6d6cfb9a, + 0x36928d884456e07c, + 0x1eeb8f37959f608d, + 0x31d6179c4eaaa923, + 0x6fac3ad7e5c02662, + 0x43049fa653991456, + 0xabd3669dc052b8ee, + 0xaf02c153a7c20a2b, + 0x3ccb036e3723c007, + 0x93c9c23d90e1ca2c, + 0xc33bc65e2f6ed7d3, + 0x4cff56339758249e, + 0xb1e94e64325d6aa6, + 0x37e16d359472420a, + 0x79f8e661be623f78, + 0x5214d90402c74413, + 0x482ef1fdf0c8965b, + 0x13f69bc5ec1609a9, + 0x0e88292814e592be, + 0x4e198b542a107d72, + 0xccc00fcbebafe71b, + 0x1b49c844222b703e, + 0x2564164da840e9d5, + 0x20c6513e1ff4f966, + 0xbac3203f910ce8ab, + 0xf2edd1c261c47ef0, + 0x814cb945acd361f3, + 0x95feb8944a392105, + 0x5c9cf02c1622d6ad, + 0x971865f3f77178e9, + 0xbd87ba2b9bf0a1f4, + 0x444005b259655d09, + 0xed75be48247fbc0b, + 0x7596122e17cff42a, + 0xb44b091785e97a15, + 0x966b854e2755da9f, + 0xeee0839249134791, + 0x32432a4623c652b9, + 0xa8465b47ad3e4374, + 0xf8b45f2412b15e8b, + 0x2417f6f078644ba3, + 0xfb2162fe7fdda511, + 0x4bbbcc279da46dc1, + 0x0173e0bdd024a276, + 0x22208c59a2bca08a, + 0x8fc4906db836f34d, + 0xe4b90d743a6667ea, + 0x7147b5e0705f46ef, + 0x2782cb2a1508b039, + 0xec065ef5f45b1e7d, + 0x21b5b183cfd05b10, + 0xdbe733c060295c77, + 0x9fa73672394c017e, + 0xcf55321186c31c81, + 0xd8720e1a0d45a7ed, + 0x3b8f997a3ddf8958, + 0x3afc79c7edfb2b2e, + 0xe9a4198643ef0ece, + 0x5f09cdf67b4e2d37, + 0x4f6a6be9fa34df04, + 0xb6add47038a123f9, + 0x8d224d0a057eaaa1, + 0xc96248b85c1bf7a8, + 0xe3fd9760309a2eb5, + 0x0b2a6e5ba351820d, + 0xeb42c4e1fea75722, + 0x948d58299a1d8373, + 0x7fcf9cc864bad451, + 0xa55b4fb5d4b72a50, + 0x08bf5381ce3d7997, + 0x46a6d8d5e42d04e5, + 0xd22b80fc7e308796, + 0x57b69e77b57354a0, + 0x3969441d8097d0b4, + 0x3330cafbf3e2f0cf, + 0xe28e77dde0be8cc3, + 0x62b12e259c494f46, + 0xa6ce726fb9dbd1ca, + 0x41e242c1eed14dba, + 0x76032ff47aa30fb0, + }, + { + 0xe6f87e5c5b711fd0, + 0x258377800924fa16, + 0xc849e07e852ea4a8, + 0x5b4686a18f06c16a, + 0x0b32e9a2d77b416e, + 0xabda37a467815c66, + 0xf61796a81a686676, + 0xf5dc0b706391954b, + 0x4862f38db7e64bf1, + 0xff5c629a68bd85c5, + 0xcb827da6fcd75795, + 0x66d36daf69b9f089, + 0x356c9f74483d83b0, + 0x7cbcecb1238c99a1, + 0x36a702ac31c4708d, + 0x9eb6a8d02fbcdfd6, + 0x8b19fa51e5b3ae37, + 0x9ccfb5408a127d0b, + 0xbc0c78b508208f5a, + 0xe533e3842288eced, + 0xcec2c7d377c15fd2, + 0xec7817b6505d0f5e, + 0xb94cc2c08336871d, + 0x8c205db4cb0b04ad, + 0x763c855b28a0892f, + 0x588d1b79f6ff3257, + 0x3fecf69e4311933e, + 0x0fc0d39f803a18c9, + 0xee010a26f5f3ad83, + 0x10efe8f4411979a6, + 0x5dcda10c7de93a10, + 0x4a1bee1d1248e92c, + 0x53bff2db21847339, + 0xb4f50ccfa6a23d09, + 0x5fb4bc9cd84798cd, + 0xe88a2d8b071c56f9, + 0x7f7771695a756a9c, + 0xc5f02e71a0ba1ebc, + 0xa663f9ab4215e672, + 0x2eb19e22de5fbb78, + 0x0db9ce0f2594ba14, + 0x82520e6397664d84, + 0x2f031e6a0208ea98, + 0x5c7f2144a1be6bf0, + 0x7a37cb1cd16362db, + 0x83e08e2b4b311c64, + 0xcf70479bab960e32, + 0x856ba986b9dee71e, + 0xb5478c877af56ce9, + 0xb8fe42885f61d6fd, + 0x1bdd0156966238c8, + 0x622157923ef8a92e, + 0xfc97ff42114476f8, + 0x9d7d350856452ceb, + 0x4c90c9b0e0a71256, + 0x2308502dfbcb016c, + 0x2d7a03faa7a64845, + 0xf46e8b38bfc6c4ab, + 0xbdbef8fdd477deba, + 0x3aac4cebc8079b79, + 0xf09cb105e8879d0c, + 0x27fa6a10ac8a58cb, + 0x8960e7c1401d0cea, + 0x1a6f811e4a356928, + 0x90c4fb0773d196ff, + 0x43501a2f609d0a9f, + 0xf7a516e0c63f3796, + 0x1ce4a6b3b8da9252, + 0x1324752c38e08a9b, + 0xa5a864733bec154f, + 0x2bf124575549b33f, + 0xd766db15440dc5c7, + 0xa7d179e39e42b792, + 0xdadf151a61997fd3, + 0x86a0345ec0271423, + 0x38d5517b6da939a4, + 0x6518f077104003b4, + 0x02791d90a5aea2dd, + 0x88d267899c4a5d0a, + 0x930f66df0a2865c2, + 0x4ee9d4204509b08b, + 0x325538916685292a, + 0x412907bfc533a842, + 0xb27e2b62544dc673, + 0x6c5304456295e007, + 0x5af406e95351908a, + 0x1f2f3b6bc123616f, + 0xc37b09dc5255e5c6, + 0x3967d133b1fe6844, + 0x298839c7f0e711e2, + 0x409b87f71964f9a2, + 0xe938adc3db4b0719, + 0x0c0b4e47f9c3ebf4, + 0x5534d576d36b8843, + 0x4610a05aeb8b02d8, + 0x20c3cdf58232f251, + 0x6de1840dbec2b1e7, + 0xa0e8de06b0fa1d08, + 0x7b854b540d34333b, + 0x42e29a67bcca5b7f, + 0xd8a6088ac437dd0e, + 0xc63bb3a9d943ed81, + 0x21714dbd5e65a3b1, + 0x6761ede7b5eea169, + 0x2431f7c8d573abf6, + 0xd51fc685e1a3671a, + 0x5e063cd40410c92d, + 0x283ab98f2cb04002, + 0x8febc06cb2f2f790, + 0x17d64f116fa1d33c, + 0xe07359f1a99ee4aa, + 0x784ed68c74cdc006, + 0x6e2a19d5c73b42da, + 0x8712b4161c7045c3, + 0x371582e4ed93216d, + 0xace390414939f6fc, + 0x7ec5f12186223b7c, + 0xc0b094042bac16fb, + 0xf9d745379a527ebf, + 0x737c3f2ea3b68168, + 0x33e7b8d9bad278ca, + 0xa9a32a34c22ffebb, + 0xe48163ccfedfbd0d, + 0x8e5940246ea5a670, + 0x51c6ef4b842ad1e4, + 0x22bad065279c508c, + 0xd91488c218608cee, + 0x319ea5491f7cda17, + 0xd394e128134c9c60, + 0x094bf43272d5e3b3, + 0x9bf612a5a4aad791, + 0xccbbda43d26ffd0f, + 0x34de1f3c946ad250, + 0x4f5b5468995ee16b, + 0xdf9faf6fea8f7794, + 0x2648ea5870dd092b, + 0xbfc7e56d71d97c67, + 0xdde6b2ff4f21d549, + 0x3c276b463ae86003, + 0x91767b4faf86c71f, + 0x68a13e7835d4b9a0, + 0xb68c115f030c9fd4, + 0x141dd2c916582001, + 0x983d8f7ddd5324ac, + 0x64aa703fcc175254, + 0xc2c989948e02b426, + 0x3e5e76d69f46c2de, + 0x50746f03587d8004, + 0x45db3d829272f1e5, + 0x60584a029b560bf3, + 0xfbae58a73ffcdc62, + 0xa15a5e4e6cad4ce8, + 0x4ba96e55ce1fb8cc, + 0x08f9747aae82b253, + 0xc102144cf7fb471b, + 0x9f042898f3eb8e36, + 0x068b27adf2effb7a, + 0xedca97fe8c0a5ebe, + 0x778e0513f4f7d8cf, + 0x302c2501c32b8bf7, + 0x8d92ddfc175c554d, + 0xf865c57f46052f5f, + 0xeaf3301ba2b2f424, + 0xaa68b7ecbbd60d86, + 0x998f0f350104754c, + 0x0000000000000000, + 0xf12e314d34d0ccec, + 0x710522be061823b5, + 0xaf280d9930c005c1, + 0x97fd5ce25d693c65, + 0x19a41cc633cc9a15, + 0x95844172f8c79eb8, + 0xdc5432b7937684a9, + 0x9436c13a2490cf58, + 0x802b13f332c8ef59, + 0xc442ae397ced4f5c, + 0xfa1cd8efe3ab8d82, + 0xf2e5ac954d293fd1, + 0x6ad823e8907a1b7d, + 0x4d2249f83cf043b6, + 0x03cb9dd879f9f33d, + 0xde2d2f2736d82674, + 0x2a43a41f891ee2df, + 0x6f98999d1b6c133a, + 0xd4ad46cd3df436fa, + 0xbb35df50269825c0, + 0x964fdcaa813e6d85, + 0xeb41b0537ee5a5c4, + 0x0540ba758b160847, + 0xa41ae43be7bb44af, + 0xe3b8c429d0671797, + 0x819993bbee9fbeb9, + 0xae9a8dd1ec975421, + 0xf3572cdd917e6e31, + 0x6393d7dae2aff8ce, + 0x47a2201237dc5338, + 0xa32343dec903ee35, + 0x79fc56c4a89a91e6, + 0x01b28048dc5751e0, + 0x1296f564e4b7db7b, + 0x75f7188351597a12, + 0xdb6d9552bdce2e33, + 0x1e9dbb231d74308f, + 0x520d7293fdd322d9, + 0xe20a44610c304677, + 0xfeeee2d2b4ead425, + 0xca30fdee20800675, + 0x61eaca4a47015a13, + 0xe74afe1487264e30, + 0x2cc883b27bf119a5, + 0x1664cf59b3f682dc, + 0xa811aa7c1e78af5b, + 0x1d5626fb648dc3b2, + 0xb73e9117df5bce34, + 0xd05f7cf06ab56f5d, + 0xfd257f0acd132718, + 0x574dc8e676c52a9e, + 0x0739a7e52eb8aa9a, + 0x5486553e0f3cd9a3, + 0x56ff48aeaa927b7e, + 0xbe756525ad8e2d87, + 0x7d0e6cf9ffdbc841, + 0x3b1ecca31450ca99, + 0x6913be30e983e840, + 0xad511009956ea71c, + 0xb1b5b6ba2db4354e, + 0x4469bdca4e25a005, + 0x15af5281ca0f71e1, + 0x744598cb8d0e2bf2, + 0x593f9b312aa863b7, + 0xefb38a6e29a4fc63, + 0x6b6aa3a04c2d4a9d, + 0x3d95eb0ee6bf31e3, + 0xa291c3961554bfd5, + 0x18169c8eef9bcbf5, + 0x115d68bc9d4e2846, + 0xba875f18facf7420, + 0xd1edfcb8b6e23ebd, + 0xb00736f2f1e364ae, + 0x84d929ce6589b6fe, + 0x70b7a2f6da4f7255, + 0x0e7253d75c6d4929, + 0x04f23a3d574159a7, + 0x0a8069ea0b2c108e, + 0x49d073c56bb11a11, + 0x8aab7a1939e4ffd7, + 0xcd095a0b0e38acef, + 0xc9fb60365979f548, + 0x92bde697d67f3422, + 0xc78933e10514bc61, + 0xe1c1d9b975c9b54a, + 0xd2266160cf1bcd80, + 0x9a4492ed78fd8671, + 0xb3ccab2a881a9793, + 0x72cebf667fe1d088, + 0xd6d45b5d985a9427, + }, +}; + +__device__ __constant__ u64 sbob_rc64[12][8] = +{ + { + 0xe9daca1eda5b08b1, + 0x1f7c65c0812fcbeb, + 0x16d0452e43766a2f, + 0xfcc485758db84e71, + 0x0169679291e07c4b, + 0x15d360a4082a42a2, + 0x234d74cc36747605, + 0x0745a6f2596580dd, + }, + { + 0x1a2f9da98ab5a36f, + 0xd7b5700f469de34f, + 0x982b230a72eafef3, + 0x3101b5160f5ed561, + 0x5899d6126b17b59a, + 0xcaa70adbc261b55c, + 0x56cdcbd71ba2dd55, + 0xb79bb121700479e6, + }, + { + 0xc72fce2bacdc74f5, + 0x35843d6a28fc390a, + 0x8b1f9c525f5ef106, + 0x7b7b29b11475eaf2, + 0xb19e3590e40fe2d3, + 0x09db6260373ac9c1, + 0x31db7a8643f4b6c2, + 0xb20aba0af5961e99, + }, + { + 0xd26615e8b3df1fef, + 0xdde4715da0e148f9, + 0x7d3c5c337e858e48, + 0x3f355e68ad1c729d, + 0x75d603ed822cd7a9, + 0xbe0352933313b7d8, + 0xf137e893a1ea5334, + 0x2ed1e384bcbe0c22, + }, + { + 0x994747adac6bea4b, + 0x6323a96c0c413f9a, + 0x4a1086161f1c157f, + 0xbdff0f80d7359e35, + 0xa3f53a254717cdbf, + 0x161a2723b700ffdf, + 0xf563eaa97ea2567a, + 0x57fe6c7cfd581760, + }, + { + 0xd9d33a1daeae4fae, + 0xc039307a3bc3a46f, + 0x6ca44251f9c4662d, + 0xc68ef09ab49a7f18, + 0xb4b79a1cb7a6facf, + 0xb6c6bec2661ff20a, + 0x354f903672c571bf, + 0x6e7d64467a4068fa, + }, + { + 0xecc5aaee160ec7f4, + 0x540924bffe86ac51, + 0xc987bfe6c7c69e39, + 0xc9937a19333e47d3, + 0x372c822dc5ab9209, + 0x04054a2883694706, + 0xf34a3ca24c451735, + 0x93d4143a4d568688, + }, + { + 0xa7c9934d425b1f9b, + 0x41416e0c02aae703, + 0x1ede369c71f8b74e, + 0x9ac4db4d3b44b489, + 0x90069b92cb2b89f4, + 0x2fc4a5d12b8dd169, + 0xd9a8515935c2ac36, + 0x1ee702bfd40d7fa4, + }, + { + 0x9b223116545a8f37, + 0xde5f16ecd89a4c94, + 0x244289251b3a7d3a, + 0x84090de0b755d93c, + 0xb1ceb2db0b440a80, + 0x549c07a69a8a2b7b, + 0x602a1fcb92dc380e, + 0xdb5a238351446172, + }, + { + 0x526f0580a6debeab, + 0xf3f3e4b248e52a38, + 0xdb788aff1ce74189, + 0x0361331b8ae1ff1f, + 0x4b3369af0267e79f, + 0xf452763b306c1e7a, + 0xc3b63b15d1fa9836, + 0xed9c4598fbc7b474, + }, + { + 0xfb89c8efd09ecd7b, + 0x94fe5a63cdc60230, + 0x6107abebbb6bfad8, + 0x7966841421800120, + 0xcab948eaef711d8a, + 0x986e477d1dcdbaef, + 0x5dd86fc04a59a2de, + 0x1b2df381cda4ca6b, + }, + { + 0xba3116f167e78e37, + 0x7ab14904b08013d2, + 0x771ddfbc323ca4cd, + 0x9b9f2130d41220f8, + 0x86cc91189def805d, + 0x5228e188aaa41de7, + 0x991bb2d9d517f4fa, + 0x20d71bf14a92bc48, + }, +}; + +__device__ static void streebog_g (u64 h[8], const u64 m[8], u64 s_sbob_sl64[8][256]) +{ + u64 k[8]; + u64 s[8]; + u64 t[8]; + + #pragma unroll + for (int i = 0; i < 8; i++) + { + t[i] = h[i]; + } + + for (int i = 0; i < 8; i++) + { + k[i] = SBOG_LPSti64; + } + + #pragma unroll + for (int i = 0; i < 8; i++) + { + s[i] = m[i]; + } + + for (int r = 0; r < 12; r++) + { + #pragma unroll + for (int i = 0; i < 8; i++) + { + t[i] = s[i] ^ k[i]; + } + + #pragma unroll + for (int i = 0; i < 8; i++) + { + s[i] = SBOG_LPSti64; + } + + for (int i = 0; i < 8; i++) + { + t[i] = k[i] ^ sbob_rc64[r][i]; + } + + #pragma unroll + for (int i = 0; i < 8; i++) + { + k[i] = SBOG_LPSti64; + } + } + + #pragma unroll + for (int i = 0; i < 8; i++) + { + h[i] ^= s[i] ^ k[i] ^ m[i]; + } +} + +__device__ __constant__ bf_t c_bfs[1024]; + +__device__ static void m11800m (u64 s_sbob_sl64[8][256], u32 w[16], const u32 pw_len, const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset) +{ + /** + * modifier + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + const u32 lid = threadIdx.x; + + /** + * loop + */ + + u32x w0l = w[0]; + + for (u32 il_pos = 0; il_pos < bfs_cnt; il_pos++) + { + const u32 w0r = c_bfs[il_pos].i; + + w[0] = w0l | w0r; + + /** + * reverse message block + */ + + u64 m[8]; + + m[0] = hl32_to_64 (w[15], w[14]); + m[1] = hl32_to_64 (w[13], w[12]); + m[2] = hl32_to_64 (w[11], w[10]); + m[3] = hl32_to_64 (w[ 9], w[ 8]); + m[4] = hl32_to_64 (w[ 7], w[ 6]); + m[5] = hl32_to_64 (w[ 5], w[ 4]); + m[6] = hl32_to_64 (w[ 3], w[ 2]); + m[7] = hl32_to_64 (w[ 1], w[ 0]); + + m[0] = swap_workaround (m[0]); + m[1] = swap_workaround (m[1]); + m[2] = swap_workaround (m[2]); + m[3] = swap_workaround (m[3]); + m[4] = swap_workaround (m[4]); + m[5] = swap_workaround (m[5]); + m[6] = swap_workaround (m[6]); + m[7] = swap_workaround (m[7]); + + // state buffer (hash) + + u64 h[8]; + + h[0] = INITVAL; + h[1] = INITVAL; + h[2] = INITVAL; + h[3] = INITVAL; + h[4] = INITVAL; + h[5] = INITVAL; + h[6] = INITVAL; + h[7] = INITVAL; + + streebog_g (h, m, s_sbob_sl64); + + u64 z[8]; + + z[0] = 0; + z[1] = 0; + z[2] = 0; + z[3] = 0; + z[4] = 0; + z[5] = 0; + z[6] = 0; + z[7] = swap_workaround ((u64) (pw_len * 8)); + + streebog_g (h, z, s_sbob_sl64); + streebog_g (h, m, s_sbob_sl64); + + const u32 r0 = l32_from_64 (h[0]); + const u32 r1 = h32_from_64 (h[0]); + const u32 r2 = l32_from_64 (h[1]); + const u32 r3 = h32_from_64 (h[1]); + + #include VECT_COMPARE_M + } +} + +__device__ static void m11800s (u64 s_sbob_sl64[8][256], u32 w[16], const u32 pw_len, const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset) +{ + /** + * modifier + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + const u32 lid = threadIdx.x; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * loop + */ + + u32x w0l = w[0]; + + for (u32 il_pos = 0; il_pos < bfs_cnt; il_pos++) + { + const u32 w0r = c_bfs[il_pos].i; + + w[0] = w0l | w0r; + + /** + * reverse message block + */ + + u64 m[8]; + + m[0] = hl32_to_64 (w[15], w[14]); + m[1] = hl32_to_64 (w[13], w[12]); + m[2] = hl32_to_64 (w[11], w[10]); + m[3] = hl32_to_64 (w[ 9], w[ 8]); + m[4] = hl32_to_64 (w[ 7], w[ 6]); + m[5] = hl32_to_64 (w[ 5], w[ 4]); + m[6] = hl32_to_64 (w[ 3], w[ 2]); + m[7] = hl32_to_64 (w[ 1], w[ 0]); + + m[0] = swap_workaround (m[0]); + m[1] = swap_workaround (m[1]); + m[2] = swap_workaround (m[2]); + m[3] = swap_workaround (m[3]); + m[4] = swap_workaround (m[4]); + m[5] = swap_workaround (m[5]); + m[6] = swap_workaround (m[6]); + m[7] = swap_workaround (m[7]); + + // state buffer (hash) + + u64 h[8]; + + h[0] = INITVAL; + h[1] = INITVAL; + h[2] = INITVAL; + h[3] = INITVAL; + h[4] = INITVAL; + h[5] = INITVAL; + h[6] = INITVAL; + h[7] = INITVAL; + + streebog_g (h, m, s_sbob_sl64); + + u64 z[8]; + + z[0] = 0; + z[1] = 0; + z[2] = 0; + z[3] = 0; + z[4] = 0; + z[5] = 0; + z[6] = 0; + z[7] = swap_workaround ((u64) (pw_len * 8)); + + streebog_g (h, z, s_sbob_sl64); + streebog_g (h, m, s_sbob_sl64); + + const u32 r0 = l32_from_64 (h[0]); + const u32 r1 = h32_from_64 (h[0]); + const u32 r2 = l32_from_64 (h[1]); + const u32 r3 = h32_from_64 (h[1]); + + #include VECT_COMPARE_S + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m11800_m04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + const u32 lid = threadIdx.x; + + u32x w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = 0; + w[ 5] = 0; + w[ 6] = 0; + w[ 7] = 0; + w[ 8] = 0; + w[ 9] = 0; + w[10] = 0; + w[11] = 0; + w[12] = 0; + w[13] = 0; + w[14] = 0; + w[15] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * shared lookup table + */ + + __shared__ u64 s_sbob_sl64[8][256]; + + if (lid < 64) + { + const u32 lid4 = lid * 4; + + s_sbob_sl64[0][lid4 + 0] = sbob_sl64[0][lid4 + 0]; + s_sbob_sl64[0][lid4 + 1] = sbob_sl64[0][lid4 + 1]; + s_sbob_sl64[0][lid4 + 2] = sbob_sl64[0][lid4 + 2]; + s_sbob_sl64[0][lid4 + 3] = sbob_sl64[0][lid4 + 3]; + s_sbob_sl64[1][lid4 + 0] = sbob_sl64[1][lid4 + 0]; + s_sbob_sl64[1][lid4 + 1] = sbob_sl64[1][lid4 + 1]; + s_sbob_sl64[1][lid4 + 2] = sbob_sl64[1][lid4 + 2]; + s_sbob_sl64[1][lid4 + 3] = sbob_sl64[1][lid4 + 3]; + s_sbob_sl64[2][lid4 + 0] = sbob_sl64[2][lid4 + 0]; + s_sbob_sl64[2][lid4 + 1] = sbob_sl64[2][lid4 + 1]; + s_sbob_sl64[2][lid4 + 2] = sbob_sl64[2][lid4 + 2]; + s_sbob_sl64[2][lid4 + 3] = sbob_sl64[2][lid4 + 3]; + s_sbob_sl64[3][lid4 + 0] = sbob_sl64[3][lid4 + 0]; + s_sbob_sl64[3][lid4 + 1] = sbob_sl64[3][lid4 + 1]; + s_sbob_sl64[3][lid4 + 2] = sbob_sl64[3][lid4 + 2]; + s_sbob_sl64[3][lid4 + 3] = sbob_sl64[3][lid4 + 3]; + s_sbob_sl64[4][lid4 + 0] = sbob_sl64[4][lid4 + 0]; + s_sbob_sl64[4][lid4 + 1] = sbob_sl64[4][lid4 + 1]; + s_sbob_sl64[4][lid4 + 2] = sbob_sl64[4][lid4 + 2]; + s_sbob_sl64[4][lid4 + 3] = sbob_sl64[4][lid4 + 3]; + s_sbob_sl64[5][lid4 + 0] = sbob_sl64[5][lid4 + 0]; + s_sbob_sl64[5][lid4 + 1] = sbob_sl64[5][lid4 + 1]; + s_sbob_sl64[5][lid4 + 2] = sbob_sl64[5][lid4 + 2]; + s_sbob_sl64[5][lid4 + 3] = sbob_sl64[5][lid4 + 3]; + s_sbob_sl64[6][lid4 + 0] = sbob_sl64[6][lid4 + 0]; + s_sbob_sl64[6][lid4 + 1] = sbob_sl64[6][lid4 + 1]; + s_sbob_sl64[6][lid4 + 2] = sbob_sl64[6][lid4 + 2]; + s_sbob_sl64[6][lid4 + 3] = sbob_sl64[6][lid4 + 3]; + s_sbob_sl64[7][lid4 + 0] = sbob_sl64[7][lid4 + 0]; + s_sbob_sl64[7][lid4 + 1] = sbob_sl64[7][lid4 + 1]; + s_sbob_sl64[7][lid4 + 2] = sbob_sl64[7][lid4 + 2]; + s_sbob_sl64[7][lid4 + 3] = sbob_sl64[7][lid4 + 3]; + } + + __syncthreads (); + + if (gid >= gid_max) return; + + /** + * main + */ + + m11800m (s_sbob_sl64, w, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m11800_m08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + const u32 lid = threadIdx.x; + + u32x w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = pws[gid].i[ 4]; + w[ 5] = pws[gid].i[ 5]; + w[ 6] = pws[gid].i[ 6]; + w[ 7] = pws[gid].i[ 7]; + w[ 8] = 0; + w[ 9] = 0; + w[10] = 0; + w[11] = 0; + w[12] = 0; + w[13] = 0; + w[14] = 0; + w[15] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * shared lookup table + */ + + __shared__ u64 s_sbob_sl64[8][256]; + + if (lid < 64) + { + const u32 lid4 = lid * 4; + + s_sbob_sl64[0][lid4 + 0] = sbob_sl64[0][lid4 + 0]; + s_sbob_sl64[0][lid4 + 1] = sbob_sl64[0][lid4 + 1]; + s_sbob_sl64[0][lid4 + 2] = sbob_sl64[0][lid4 + 2]; + s_sbob_sl64[0][lid4 + 3] = sbob_sl64[0][lid4 + 3]; + s_sbob_sl64[1][lid4 + 0] = sbob_sl64[1][lid4 + 0]; + s_sbob_sl64[1][lid4 + 1] = sbob_sl64[1][lid4 + 1]; + s_sbob_sl64[1][lid4 + 2] = sbob_sl64[1][lid4 + 2]; + s_sbob_sl64[1][lid4 + 3] = sbob_sl64[1][lid4 + 3]; + s_sbob_sl64[2][lid4 + 0] = sbob_sl64[2][lid4 + 0]; + s_sbob_sl64[2][lid4 + 1] = sbob_sl64[2][lid4 + 1]; + s_sbob_sl64[2][lid4 + 2] = sbob_sl64[2][lid4 + 2]; + s_sbob_sl64[2][lid4 + 3] = sbob_sl64[2][lid4 + 3]; + s_sbob_sl64[3][lid4 + 0] = sbob_sl64[3][lid4 + 0]; + s_sbob_sl64[3][lid4 + 1] = sbob_sl64[3][lid4 + 1]; + s_sbob_sl64[3][lid4 + 2] = sbob_sl64[3][lid4 + 2]; + s_sbob_sl64[3][lid4 + 3] = sbob_sl64[3][lid4 + 3]; + s_sbob_sl64[4][lid4 + 0] = sbob_sl64[4][lid4 + 0]; + s_sbob_sl64[4][lid4 + 1] = sbob_sl64[4][lid4 + 1]; + s_sbob_sl64[4][lid4 + 2] = sbob_sl64[4][lid4 + 2]; + s_sbob_sl64[4][lid4 + 3] = sbob_sl64[4][lid4 + 3]; + s_sbob_sl64[5][lid4 + 0] = sbob_sl64[5][lid4 + 0]; + s_sbob_sl64[5][lid4 + 1] = sbob_sl64[5][lid4 + 1]; + s_sbob_sl64[5][lid4 + 2] = sbob_sl64[5][lid4 + 2]; + s_sbob_sl64[5][lid4 + 3] = sbob_sl64[5][lid4 + 3]; + s_sbob_sl64[6][lid4 + 0] = sbob_sl64[6][lid4 + 0]; + s_sbob_sl64[6][lid4 + 1] = sbob_sl64[6][lid4 + 1]; + s_sbob_sl64[6][lid4 + 2] = sbob_sl64[6][lid4 + 2]; + s_sbob_sl64[6][lid4 + 3] = sbob_sl64[6][lid4 + 3]; + s_sbob_sl64[7][lid4 + 0] = sbob_sl64[7][lid4 + 0]; + s_sbob_sl64[7][lid4 + 1] = sbob_sl64[7][lid4 + 1]; + s_sbob_sl64[7][lid4 + 2] = sbob_sl64[7][lid4 + 2]; + s_sbob_sl64[7][lid4 + 3] = sbob_sl64[7][lid4 + 3]; + } + + __syncthreads (); + + if (gid >= gid_max) return; + + /** + * main + */ + + m11800m (s_sbob_sl64, w, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m11800_m16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + const u32 lid = threadIdx.x; + + u32x w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = pws[gid].i[ 4]; + w[ 5] = pws[gid].i[ 5]; + w[ 6] = pws[gid].i[ 6]; + w[ 7] = pws[gid].i[ 7]; + w[ 8] = pws[gid].i[ 8]; + w[ 9] = pws[gid].i[ 9]; + w[10] = pws[gid].i[10]; + w[11] = pws[gid].i[11]; + w[12] = pws[gid].i[12]; + w[13] = pws[gid].i[13]; + w[14] = pws[gid].i[14]; + w[15] = pws[gid].i[15]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * shared lookup table + */ + + __shared__ u64 s_sbob_sl64[8][256]; + + if (lid < 64) + { + const u32 lid4 = lid * 4; + + s_sbob_sl64[0][lid4 + 0] = sbob_sl64[0][lid4 + 0]; + s_sbob_sl64[0][lid4 + 1] = sbob_sl64[0][lid4 + 1]; + s_sbob_sl64[0][lid4 + 2] = sbob_sl64[0][lid4 + 2]; + s_sbob_sl64[0][lid4 + 3] = sbob_sl64[0][lid4 + 3]; + s_sbob_sl64[1][lid4 + 0] = sbob_sl64[1][lid4 + 0]; + s_sbob_sl64[1][lid4 + 1] = sbob_sl64[1][lid4 + 1]; + s_sbob_sl64[1][lid4 + 2] = sbob_sl64[1][lid4 + 2]; + s_sbob_sl64[1][lid4 + 3] = sbob_sl64[1][lid4 + 3]; + s_sbob_sl64[2][lid4 + 0] = sbob_sl64[2][lid4 + 0]; + s_sbob_sl64[2][lid4 + 1] = sbob_sl64[2][lid4 + 1]; + s_sbob_sl64[2][lid4 + 2] = sbob_sl64[2][lid4 + 2]; + s_sbob_sl64[2][lid4 + 3] = sbob_sl64[2][lid4 + 3]; + s_sbob_sl64[3][lid4 + 0] = sbob_sl64[3][lid4 + 0]; + s_sbob_sl64[3][lid4 + 1] = sbob_sl64[3][lid4 + 1]; + s_sbob_sl64[3][lid4 + 2] = sbob_sl64[3][lid4 + 2]; + s_sbob_sl64[3][lid4 + 3] = sbob_sl64[3][lid4 + 3]; + s_sbob_sl64[4][lid4 + 0] = sbob_sl64[4][lid4 + 0]; + s_sbob_sl64[4][lid4 + 1] = sbob_sl64[4][lid4 + 1]; + s_sbob_sl64[4][lid4 + 2] = sbob_sl64[4][lid4 + 2]; + s_sbob_sl64[4][lid4 + 3] = sbob_sl64[4][lid4 + 3]; + s_sbob_sl64[5][lid4 + 0] = sbob_sl64[5][lid4 + 0]; + s_sbob_sl64[5][lid4 + 1] = sbob_sl64[5][lid4 + 1]; + s_sbob_sl64[5][lid4 + 2] = sbob_sl64[5][lid4 + 2]; + s_sbob_sl64[5][lid4 + 3] = sbob_sl64[5][lid4 + 3]; + s_sbob_sl64[6][lid4 + 0] = sbob_sl64[6][lid4 + 0]; + s_sbob_sl64[6][lid4 + 1] = sbob_sl64[6][lid4 + 1]; + s_sbob_sl64[6][lid4 + 2] = sbob_sl64[6][lid4 + 2]; + s_sbob_sl64[6][lid4 + 3] = sbob_sl64[6][lid4 + 3]; + s_sbob_sl64[7][lid4 + 0] = sbob_sl64[7][lid4 + 0]; + s_sbob_sl64[7][lid4 + 1] = sbob_sl64[7][lid4 + 1]; + s_sbob_sl64[7][lid4 + 2] = sbob_sl64[7][lid4 + 2]; + s_sbob_sl64[7][lid4 + 3] = sbob_sl64[7][lid4 + 3]; + } + + __syncthreads (); + + if (gid >= gid_max) return; + + /** + * main + */ + + m11800m (s_sbob_sl64, w, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m11800_s04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + const u32 lid = threadIdx.x; + + u32x w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = 0; + w[ 5] = 0; + w[ 6] = 0; + w[ 7] = 0; + w[ 8] = 0; + w[ 9] = 0; + w[10] = 0; + w[11] = 0; + w[12] = 0; + w[13] = 0; + w[14] = 0; + w[15] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * shared lookup table + */ + + __shared__ u64 s_sbob_sl64[8][256]; + + if (lid < 64) + { + const u32 lid4 = lid * 4; + + s_sbob_sl64[0][lid4 + 0] = sbob_sl64[0][lid4 + 0]; + s_sbob_sl64[0][lid4 + 1] = sbob_sl64[0][lid4 + 1]; + s_sbob_sl64[0][lid4 + 2] = sbob_sl64[0][lid4 + 2]; + s_sbob_sl64[0][lid4 + 3] = sbob_sl64[0][lid4 + 3]; + s_sbob_sl64[1][lid4 + 0] = sbob_sl64[1][lid4 + 0]; + s_sbob_sl64[1][lid4 + 1] = sbob_sl64[1][lid4 + 1]; + s_sbob_sl64[1][lid4 + 2] = sbob_sl64[1][lid4 + 2]; + s_sbob_sl64[1][lid4 + 3] = sbob_sl64[1][lid4 + 3]; + s_sbob_sl64[2][lid4 + 0] = sbob_sl64[2][lid4 + 0]; + s_sbob_sl64[2][lid4 + 1] = sbob_sl64[2][lid4 + 1]; + s_sbob_sl64[2][lid4 + 2] = sbob_sl64[2][lid4 + 2]; + s_sbob_sl64[2][lid4 + 3] = sbob_sl64[2][lid4 + 3]; + s_sbob_sl64[3][lid4 + 0] = sbob_sl64[3][lid4 + 0]; + s_sbob_sl64[3][lid4 + 1] = sbob_sl64[3][lid4 + 1]; + s_sbob_sl64[3][lid4 + 2] = sbob_sl64[3][lid4 + 2]; + s_sbob_sl64[3][lid4 + 3] = sbob_sl64[3][lid4 + 3]; + s_sbob_sl64[4][lid4 + 0] = sbob_sl64[4][lid4 + 0]; + s_sbob_sl64[4][lid4 + 1] = sbob_sl64[4][lid4 + 1]; + s_sbob_sl64[4][lid4 + 2] = sbob_sl64[4][lid4 + 2]; + s_sbob_sl64[4][lid4 + 3] = sbob_sl64[4][lid4 + 3]; + s_sbob_sl64[5][lid4 + 0] = sbob_sl64[5][lid4 + 0]; + s_sbob_sl64[5][lid4 + 1] = sbob_sl64[5][lid4 + 1]; + s_sbob_sl64[5][lid4 + 2] = sbob_sl64[5][lid4 + 2]; + s_sbob_sl64[5][lid4 + 3] = sbob_sl64[5][lid4 + 3]; + s_sbob_sl64[6][lid4 + 0] = sbob_sl64[6][lid4 + 0]; + s_sbob_sl64[6][lid4 + 1] = sbob_sl64[6][lid4 + 1]; + s_sbob_sl64[6][lid4 + 2] = sbob_sl64[6][lid4 + 2]; + s_sbob_sl64[6][lid4 + 3] = sbob_sl64[6][lid4 + 3]; + s_sbob_sl64[7][lid4 + 0] = sbob_sl64[7][lid4 + 0]; + s_sbob_sl64[7][lid4 + 1] = sbob_sl64[7][lid4 + 1]; + s_sbob_sl64[7][lid4 + 2] = sbob_sl64[7][lid4 + 2]; + s_sbob_sl64[7][lid4 + 3] = sbob_sl64[7][lid4 + 3]; + } + + __syncthreads (); + + if (gid >= gid_max) return; + + /** + * main + */ + + m11800s (s_sbob_sl64, w, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m11800_s08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + const u32 lid = threadIdx.x; + + u32x w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = pws[gid].i[ 4]; + w[ 5] = pws[gid].i[ 5]; + w[ 6] = pws[gid].i[ 6]; + w[ 7] = pws[gid].i[ 7]; + w[ 8] = 0; + w[ 9] = 0; + w[10] = 0; + w[11] = 0; + w[12] = 0; + w[13] = 0; + w[14] = 0; + w[15] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * shared lookup table + */ + + __shared__ u64 s_sbob_sl64[8][256]; + + if (lid < 64) + { + const u32 lid4 = lid * 4; + + s_sbob_sl64[0][lid4 + 0] = sbob_sl64[0][lid4 + 0]; + s_sbob_sl64[0][lid4 + 1] = sbob_sl64[0][lid4 + 1]; + s_sbob_sl64[0][lid4 + 2] = sbob_sl64[0][lid4 + 2]; + s_sbob_sl64[0][lid4 + 3] = sbob_sl64[0][lid4 + 3]; + s_sbob_sl64[1][lid4 + 0] = sbob_sl64[1][lid4 + 0]; + s_sbob_sl64[1][lid4 + 1] = sbob_sl64[1][lid4 + 1]; + s_sbob_sl64[1][lid4 + 2] = sbob_sl64[1][lid4 + 2]; + s_sbob_sl64[1][lid4 + 3] = sbob_sl64[1][lid4 + 3]; + s_sbob_sl64[2][lid4 + 0] = sbob_sl64[2][lid4 + 0]; + s_sbob_sl64[2][lid4 + 1] = sbob_sl64[2][lid4 + 1]; + s_sbob_sl64[2][lid4 + 2] = sbob_sl64[2][lid4 + 2]; + s_sbob_sl64[2][lid4 + 3] = sbob_sl64[2][lid4 + 3]; + s_sbob_sl64[3][lid4 + 0] = sbob_sl64[3][lid4 + 0]; + s_sbob_sl64[3][lid4 + 1] = sbob_sl64[3][lid4 + 1]; + s_sbob_sl64[3][lid4 + 2] = sbob_sl64[3][lid4 + 2]; + s_sbob_sl64[3][lid4 + 3] = sbob_sl64[3][lid4 + 3]; + s_sbob_sl64[4][lid4 + 0] = sbob_sl64[4][lid4 + 0]; + s_sbob_sl64[4][lid4 + 1] = sbob_sl64[4][lid4 + 1]; + s_sbob_sl64[4][lid4 + 2] = sbob_sl64[4][lid4 + 2]; + s_sbob_sl64[4][lid4 + 3] = sbob_sl64[4][lid4 + 3]; + s_sbob_sl64[5][lid4 + 0] = sbob_sl64[5][lid4 + 0]; + s_sbob_sl64[5][lid4 + 1] = sbob_sl64[5][lid4 + 1]; + s_sbob_sl64[5][lid4 + 2] = sbob_sl64[5][lid4 + 2]; + s_sbob_sl64[5][lid4 + 3] = sbob_sl64[5][lid4 + 3]; + s_sbob_sl64[6][lid4 + 0] = sbob_sl64[6][lid4 + 0]; + s_sbob_sl64[6][lid4 + 1] = sbob_sl64[6][lid4 + 1]; + s_sbob_sl64[6][lid4 + 2] = sbob_sl64[6][lid4 + 2]; + s_sbob_sl64[6][lid4 + 3] = sbob_sl64[6][lid4 + 3]; + s_sbob_sl64[7][lid4 + 0] = sbob_sl64[7][lid4 + 0]; + s_sbob_sl64[7][lid4 + 1] = sbob_sl64[7][lid4 + 1]; + s_sbob_sl64[7][lid4 + 2] = sbob_sl64[7][lid4 + 2]; + s_sbob_sl64[7][lid4 + 3] = sbob_sl64[7][lid4 + 3]; + } + + __syncthreads (); + + if (gid >= gid_max) return; + + /** + * main + */ + + m11800s (s_sbob_sl64, w, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m11800_s16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + const u32 lid = threadIdx.x; + + u32x w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = pws[gid].i[ 4]; + w[ 5] = pws[gid].i[ 5]; + w[ 6] = pws[gid].i[ 6]; + w[ 7] = pws[gid].i[ 7]; + w[ 8] = pws[gid].i[ 8]; + w[ 9] = pws[gid].i[ 9]; + w[10] = pws[gid].i[10]; + w[11] = pws[gid].i[11]; + w[12] = pws[gid].i[12]; + w[13] = pws[gid].i[13]; + w[14] = pws[gid].i[14]; + w[15] = pws[gid].i[15]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * shared lookup table + */ + + __shared__ u64 s_sbob_sl64[8][256]; + + if (lid < 64) + { + const u32 lid4 = lid * 4; + + s_sbob_sl64[0][lid4 + 0] = sbob_sl64[0][lid4 + 0]; + s_sbob_sl64[0][lid4 + 1] = sbob_sl64[0][lid4 + 1]; + s_sbob_sl64[0][lid4 + 2] = sbob_sl64[0][lid4 + 2]; + s_sbob_sl64[0][lid4 + 3] = sbob_sl64[0][lid4 + 3]; + s_sbob_sl64[1][lid4 + 0] = sbob_sl64[1][lid4 + 0]; + s_sbob_sl64[1][lid4 + 1] = sbob_sl64[1][lid4 + 1]; + s_sbob_sl64[1][lid4 + 2] = sbob_sl64[1][lid4 + 2]; + s_sbob_sl64[1][lid4 + 3] = sbob_sl64[1][lid4 + 3]; + s_sbob_sl64[2][lid4 + 0] = sbob_sl64[2][lid4 + 0]; + s_sbob_sl64[2][lid4 + 1] = sbob_sl64[2][lid4 + 1]; + s_sbob_sl64[2][lid4 + 2] = sbob_sl64[2][lid4 + 2]; + s_sbob_sl64[2][lid4 + 3] = sbob_sl64[2][lid4 + 3]; + s_sbob_sl64[3][lid4 + 0] = sbob_sl64[3][lid4 + 0]; + s_sbob_sl64[3][lid4 + 1] = sbob_sl64[3][lid4 + 1]; + s_sbob_sl64[3][lid4 + 2] = sbob_sl64[3][lid4 + 2]; + s_sbob_sl64[3][lid4 + 3] = sbob_sl64[3][lid4 + 3]; + s_sbob_sl64[4][lid4 + 0] = sbob_sl64[4][lid4 + 0]; + s_sbob_sl64[4][lid4 + 1] = sbob_sl64[4][lid4 + 1]; + s_sbob_sl64[4][lid4 + 2] = sbob_sl64[4][lid4 + 2]; + s_sbob_sl64[4][lid4 + 3] = sbob_sl64[4][lid4 + 3]; + s_sbob_sl64[5][lid4 + 0] = sbob_sl64[5][lid4 + 0]; + s_sbob_sl64[5][lid4 + 1] = sbob_sl64[5][lid4 + 1]; + s_sbob_sl64[5][lid4 + 2] = sbob_sl64[5][lid4 + 2]; + s_sbob_sl64[5][lid4 + 3] = sbob_sl64[5][lid4 + 3]; + s_sbob_sl64[6][lid4 + 0] = sbob_sl64[6][lid4 + 0]; + s_sbob_sl64[6][lid4 + 1] = sbob_sl64[6][lid4 + 1]; + s_sbob_sl64[6][lid4 + 2] = sbob_sl64[6][lid4 + 2]; + s_sbob_sl64[6][lid4 + 3] = sbob_sl64[6][lid4 + 3]; + s_sbob_sl64[7][lid4 + 0] = sbob_sl64[7][lid4 + 0]; + s_sbob_sl64[7][lid4 + 1] = sbob_sl64[7][lid4 + 1]; + s_sbob_sl64[7][lid4 + 2] = sbob_sl64[7][lid4 + 2]; + s_sbob_sl64[7][lid4 + 3] = sbob_sl64[7][lid4 + 3]; + } + + __syncthreads (); + + if (gid >= gid_max) return; + + /** + * main + */ + + m11800s (s_sbob_sl64, w, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} diff --git a/nv/m11900.cu b/nv/m11900.cu new file mode 100644 index 0000000000..718bc4ab41 --- /dev/null +++ b/nv/m11900.cu @@ -0,0 +1,417 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _PBKDF2_MD5_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW2 +#define VECT_SIZE1 +#endif + +#define DGST_R0 0 +#define DGST_R1 1 +#define DGST_R2 2 +#define DGST_R3 3 + +#include "include/kernel_functions.c" + +#include "types_nv.c" +#include "common_nv.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +__device__ static void md5_transform (const u32x w0[4], const u32x w1[4], const u32x w2[4], const u32x w3[4], u32x digest[4]) +{ + u32x a = digest[0]; + u32x b = digest[1]; + u32x c = digest[2]; + u32x d = digest[3]; + + u32x w0_t = w0[0]; + u32x w1_t = w0[1]; + u32x w2_t = w0[2]; + u32x w3_t = w0[3]; + u32x w4_t = w1[0]; + u32x w5_t = w1[1]; + u32x w6_t = w1[2]; + u32x w7_t = w1[3]; + u32x w8_t = w2[0]; + u32x w9_t = w2[1]; + u32x wa_t = w2[2]; + u32x wb_t = w2[3]; + u32x wc_t = w3[0]; + u32x wd_t = w3[1]; + u32x we_t = w3[2]; + u32x wf_t = w3[3]; + + u32x tmp2; + + MD5_STEP (MD5_Fo, a, b, c, d, w0_t, MD5C00, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w1_t, MD5C01, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w2_t, MD5C02, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w3_t, MD5C03, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w4_t, MD5C04, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w5_t, MD5C05, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, w6_t, MD5C06, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, w7_t, MD5C07, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, w8_t, MD5C08, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, w9_t, MD5C09, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, wa_t, MD5C0a, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, wb_t, MD5C0b, MD5S03); + MD5_STEP (MD5_Fo, a, b, c, d, wc_t, MD5C0c, MD5S00); + MD5_STEP (MD5_Fo, d, a, b, c, wd_t, MD5C0d, MD5S01); + MD5_STEP (MD5_Fo, c, d, a, b, we_t, MD5C0e, MD5S02); + MD5_STEP (MD5_Fo, b, c, d, a, wf_t, MD5C0f, MD5S03); + + MD5_STEP (MD5_Go, a, b, c, d, w1_t, MD5C10, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w6_t, MD5C11, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, wb_t, MD5C12, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w0_t, MD5C13, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w5_t, MD5C14, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, wa_t, MD5C15, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, wf_t, MD5C16, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w4_t, MD5C17, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, w9_t, MD5C18, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, we_t, MD5C19, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w3_t, MD5C1a, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, w8_t, MD5C1b, MD5S13); + MD5_STEP (MD5_Go, a, b, c, d, wd_t, MD5C1c, MD5S10); + MD5_STEP (MD5_Go, d, a, b, c, w2_t, MD5C1d, MD5S11); + MD5_STEP (MD5_Go, c, d, a, b, w7_t, MD5C1e, MD5S12); + MD5_STEP (MD5_Go, b, c, d, a, wc_t, MD5C1f, MD5S13); + + MD5_STEP (MD5_H1, a, b, c, d, w5_t, MD5C20, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w8_t, MD5C21, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, wb_t, MD5C22, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, we_t, MD5C23, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w1_t, MD5C24, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w4_t, MD5C25, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w7_t, MD5C26, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, wa_t, MD5C27, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, wd_t, MD5C28, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, w0_t, MD5C29, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, w3_t, MD5C2a, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w6_t, MD5C2b, MD5S23); + MD5_STEP (MD5_H1, a, b, c, d, w9_t, MD5C2c, MD5S20); + MD5_STEP (MD5_H2, d, a, b, c, wc_t, MD5C2d, MD5S21); + MD5_STEP (MD5_H1, c, d, a, b, wf_t, MD5C2e, MD5S22); + MD5_STEP (MD5_H2, b, c, d, a, w2_t, MD5C2f, MD5S23); + + MD5_STEP (MD5_I , a, b, c, d, w0_t, MD5C30, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w7_t, MD5C31, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, we_t, MD5C32, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w5_t, MD5C33, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, wc_t, MD5C34, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, w3_t, MD5C35, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, wa_t, MD5C36, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w1_t, MD5C37, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w8_t, MD5C38, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, wf_t, MD5C39, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w6_t, MD5C3a, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, wd_t, MD5C3b, MD5S33); + MD5_STEP (MD5_I , a, b, c, d, w4_t, MD5C3c, MD5S30); + MD5_STEP (MD5_I , d, a, b, c, wb_t, MD5C3d, MD5S31); + MD5_STEP (MD5_I , c, d, a, b, w2_t, MD5C3e, MD5S32); + MD5_STEP (MD5_I , b, c, d, a, w9_t, MD5C3f, MD5S33); + + digest[0] += a; + digest[1] += b; + digest[2] += c; + digest[3] += d; +} + +__device__ static void hmac_md5_pad (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], u32x ipad[4], u32x opad[4]) +{ + w0[0] = w0[0] ^ 0x36363636; + w0[1] = w0[1] ^ 0x36363636; + w0[2] = w0[2] ^ 0x36363636; + w0[3] = w0[3] ^ 0x36363636; + w1[0] = w1[0] ^ 0x36363636; + w1[1] = w1[1] ^ 0x36363636; + w1[2] = w1[2] ^ 0x36363636; + w1[3] = w1[3] ^ 0x36363636; + w2[0] = w2[0] ^ 0x36363636; + w2[1] = w2[1] ^ 0x36363636; + w2[2] = w2[2] ^ 0x36363636; + w2[3] = w2[3] ^ 0x36363636; + w3[0] = w3[0] ^ 0x36363636; + w3[1] = w3[1] ^ 0x36363636; + w3[2] = w3[2] ^ 0x36363636; + w3[3] = w3[3] ^ 0x36363636; + + ipad[0] = MD5M_A; + ipad[1] = MD5M_B; + ipad[2] = MD5M_C; + ipad[3] = MD5M_D; + + md5_transform (w0, w1, w2, w3, ipad); + + w0[0] = w0[0] ^ 0x6a6a6a6a; + w0[1] = w0[1] ^ 0x6a6a6a6a; + w0[2] = w0[2] ^ 0x6a6a6a6a; + w0[3] = w0[3] ^ 0x6a6a6a6a; + w1[0] = w1[0] ^ 0x6a6a6a6a; + w1[1] = w1[1] ^ 0x6a6a6a6a; + w1[2] = w1[2] ^ 0x6a6a6a6a; + w1[3] = w1[3] ^ 0x6a6a6a6a; + w2[0] = w2[0] ^ 0x6a6a6a6a; + w2[1] = w2[1] ^ 0x6a6a6a6a; + w2[2] = w2[2] ^ 0x6a6a6a6a; + w2[3] = w2[3] ^ 0x6a6a6a6a; + w3[0] = w3[0] ^ 0x6a6a6a6a; + w3[1] = w3[1] ^ 0x6a6a6a6a; + w3[2] = w3[2] ^ 0x6a6a6a6a; + w3[3] = w3[3] ^ 0x6a6a6a6a; + + opad[0] = MD5M_A; + opad[1] = MD5M_B; + opad[2] = MD5M_C; + opad[3] = MD5M_D; + + md5_transform (w0, w1, w2, w3, opad); +} + +__device__ static void hmac_md5_run (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], u32x ipad[4], u32x opad[4], u32x digest[4]) +{ + digest[0] = ipad[0]; + digest[1] = ipad[1]; + digest[2] = ipad[2]; + digest[3] = ipad[3]; + + md5_transform (w0, w1, w2, w3, digest); + + w0[0] = digest[0]; + w0[1] = digest[1]; + w0[2] = digest[2]; + w0[3] = digest[3]; + w1[0] = 0x80; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + w3[0] = 0; + w3[1] = 0; + w3[2] = (64 + 16) * 8; + w3[3] = 0; + + digest[0] = opad[0]; + digest[1] = opad[1]; + digest[2] = opad[2]; + digest[3] = opad[3]; + + md5_transform (w0, w1, w2, w3, digest); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m11900_init (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, pbkdf2_md5_tmp_t *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const pbkdf2_md5_t *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = pws[gid].i[ 8]; + w2[1] = pws[gid].i[ 9]; + w2[2] = pws[gid].i[10]; + w2[3] = pws[gid].i[11]; + + u32x w3[4]; + + w3[0] = pws[gid].i[12]; + w3[1] = pws[gid].i[13]; + w3[2] = pws[gid].i[14]; + w3[3] = pws[gid].i[15]; + + /** + * salt + */ + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + u32 esalt_buf0[4]; + u32 esalt_buf1[4]; + u32 esalt_buf2[4]; + u32 esalt_buf3[4]; + + esalt_buf0[0] = esalt_bufs[salt_pos].salt_buf[ 0]; + esalt_buf0[1] = esalt_bufs[salt_pos].salt_buf[ 1]; + esalt_buf0[2] = esalt_bufs[salt_pos].salt_buf[ 2]; + esalt_buf0[3] = esalt_bufs[salt_pos].salt_buf[ 3]; + esalt_buf1[0] = esalt_bufs[salt_pos].salt_buf[ 4]; + esalt_buf1[1] = esalt_bufs[salt_pos].salt_buf[ 5]; + esalt_buf1[2] = esalt_bufs[salt_pos].salt_buf[ 6]; + esalt_buf1[3] = esalt_bufs[salt_pos].salt_buf[ 7]; + esalt_buf2[0] = esalt_bufs[salt_pos].salt_buf[ 8]; + esalt_buf2[1] = esalt_bufs[salt_pos].salt_buf[ 9]; + esalt_buf2[2] = esalt_bufs[salt_pos].salt_buf[10]; + esalt_buf2[3] = esalt_bufs[salt_pos].salt_buf[11]; + esalt_buf3[0] = esalt_bufs[salt_pos].salt_buf[12]; + esalt_buf3[1] = esalt_bufs[salt_pos].salt_buf[13]; + esalt_buf3[2] = (64 + salt_len + 4) * 8; + esalt_buf3[3] = 0; + + u32 ipad[4]; + u32 opad[4]; + + hmac_md5_pad (w0, w1, w2, w3, ipad, opad); + + tmps[gid].ipad[0] = ipad[0]; + tmps[gid].ipad[1] = ipad[1]; + tmps[gid].ipad[2] = ipad[2]; + tmps[gid].ipad[3] = ipad[3]; + + tmps[gid].opad[0] = opad[0]; + tmps[gid].opad[1] = opad[1]; + tmps[gid].opad[2] = opad[2]; + tmps[gid].opad[3] = opad[3]; + + for (u32 i = 0, j = 1; i < 4; i += 4, j += 1) + { + u32 dgst[4]; + + hmac_md5_run (esalt_buf0, esalt_buf1, esalt_buf2, esalt_buf3, ipad, opad, dgst); + + tmps[gid].dgst[i + 0] = dgst[0]; + tmps[gid].dgst[i + 1] = dgst[1]; + tmps[gid].dgst[i + 2] = dgst[2]; + tmps[gid].dgst[i + 3] = dgst[3]; + + tmps[gid].out[i + 0] = dgst[0]; + tmps[gid].out[i + 1] = dgst[1]; + tmps[gid].out[i + 2] = dgst[2]; + tmps[gid].out[i + 3] = dgst[3]; + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m11900_loop (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, pbkdf2_md5_tmp_t *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const pbkdf2_md5_t *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32 ipad[4]; + + ipad[0] = tmps[gid].ipad[0]; + ipad[1] = tmps[gid].ipad[1]; + ipad[2] = tmps[gid].ipad[2]; + ipad[3] = tmps[gid].ipad[3]; + + u32 opad[4]; + + opad[0] = tmps[gid].opad[0]; + opad[1] = tmps[gid].opad[1]; + opad[2] = tmps[gid].opad[2]; + opad[3] = tmps[gid].opad[3]; + + for (u32 i = 0; i < 4; i += 4) + { + u32 dgst[4]; + + dgst[0] = tmps[gid].dgst[i + 0]; + dgst[1] = tmps[gid].dgst[i + 1]; + dgst[2] = tmps[gid].dgst[i + 2]; + dgst[3] = tmps[gid].dgst[i + 3]; + + u32 out[4]; + + out[0] = tmps[gid].out[i + 0]; + out[1] = tmps[gid].out[i + 1]; + out[2] = tmps[gid].out[i + 2]; + out[3] = tmps[gid].out[i + 3]; + + for (u32 j = 0; j < loop_cnt; j++) + { + u32 w0[4]; + u32 w1[4]; + u32 w2[4]; + u32 w3[4]; + + w0[0] = dgst[0]; + w0[1] = dgst[1]; + w0[2] = dgst[2]; + w0[3] = dgst[3]; + w1[0] = 0x80; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + w3[0] = 0; + w3[1] = 0; + w3[2] = (64 + 16) * 8; + w3[3] = 0; + + hmac_md5_run (w0, w1, w2, w3, ipad, opad, dgst); + + out[0] ^= dgst[0]; + out[1] ^= dgst[1]; + out[2] ^= dgst[2]; + out[3] ^= dgst[3]; + } + + tmps[gid].dgst[i + 0] = dgst[0]; + tmps[gid].dgst[i + 1] = dgst[1]; + tmps[gid].dgst[i + 2] = dgst[2]; + tmps[gid].dgst[i + 3] = dgst[3]; + + tmps[gid].out[i + 0] = out[0]; + tmps[gid].out[i + 1] = out[1]; + tmps[gid].out[i + 2] = out[2]; + tmps[gid].out[i + 3] = out[3]; + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m11900_comp (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, pbkdf2_md5_tmp_t *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const pbkdf2_md5_t *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + const u32 lid = threadIdx.x; + + const u32x r0 = tmps[gid].out[DGST_R0]; + const u32x r1 = tmps[gid].out[DGST_R1]; + const u32x r2 = tmps[gid].out[DGST_R2]; + const u32x r3 = tmps[gid].out[DGST_R3]; + + #define il_pos 0 + + #include VECT_COMPARE_M +} diff --git a/nv/m12000.cu b/nv/m12000.cu new file mode 100644 index 0000000000..e947cd5f8f --- /dev/null +++ b/nv/m12000.cu @@ -0,0 +1,460 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _PBKDF2_SHA1_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW2 +#define VECT_SIZE1 +#endif + +#define DGST_R0 0 +#define DGST_R1 1 +#define DGST_R2 2 +#define DGST_R3 3 + +#include "include/kernel_functions.c" + +#include "types_nv.c" +#include "common_nv.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +__device__ static void sha1_transform (const u32x w0[4], const u32x w1[4], const u32x w2[4], const u32x w3[4], u32x digest[5]) +{ + u32x A = digest[0]; + u32x B = digest[1]; + u32x C = digest[2]; + u32x D = digest[3]; + u32x E = digest[4]; + + u32x w0_t = w0[0]; + u32x w1_t = w0[1]; + u32x w2_t = w0[2]; + u32x w3_t = w0[3]; + u32x w4_t = w1[0]; + u32x w5_t = w1[1]; + u32x w6_t = w1[2]; + u32x w7_t = w1[3]; + u32x w8_t = w2[0]; + u32x w9_t = w2[1]; + u32x wa_t = w2[2]; + u32x wb_t = w2[3]; + u32x wc_t = w3[0]; + u32x wd_t = w3[1]; + u32x we_t = w3[2]; + u32x wf_t = w3[3]; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, A, B, C, D, E, w0_t); + SHA1_STEP (SHA1_F0o, E, A, B, C, D, w1_t); + SHA1_STEP (SHA1_F0o, D, E, A, B, C, w2_t); + SHA1_STEP (SHA1_F0o, C, D, E, A, B, w3_t); + SHA1_STEP (SHA1_F0o, B, C, D, E, A, w4_t); + SHA1_STEP (SHA1_F0o, A, B, C, D, E, w5_t); + SHA1_STEP (SHA1_F0o, E, A, B, C, D, w6_t); + SHA1_STEP (SHA1_F0o, D, E, A, B, C, w7_t); + SHA1_STEP (SHA1_F0o, C, D, E, A, B, w8_t); + SHA1_STEP (SHA1_F0o, B, C, D, E, A, w9_t); + SHA1_STEP (SHA1_F0o, A, B, C, D, E, wa_t); + SHA1_STEP (SHA1_F0o, E, A, B, C, D, wb_t); + SHA1_STEP (SHA1_F0o, D, E, A, B, C, wc_t); + SHA1_STEP (SHA1_F0o, C, D, E, A, B, wd_t); + SHA1_STEP (SHA1_F0o, B, C, D, E, A, we_t); + SHA1_STEP (SHA1_F0o, A, B, C, D, E, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F0o, E, A, B, C, D, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F0o, D, E, A, B, C, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F0o, C, D, E, A, B, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F0o, B, C, D, E, A, w3_t); + + #undef K + #define K SHA1C01 + + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w7_t); + + #undef K + #define K SHA1C02 + + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, wb_t); + + #undef K + #define K SHA1C03 + + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, wf_t); + + digest[0] += A; + digest[1] += B; + digest[2] += C; + digest[3] += D; + digest[4] += E; +} + +__device__ static void hmac_sha1_pad (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], u32x ipad[5], u32x opad[5]) +{ + w0[0] = w0[0] ^ 0x36363636; + w0[1] = w0[1] ^ 0x36363636; + w0[2] = w0[2] ^ 0x36363636; + w0[3] = w0[3] ^ 0x36363636; + w1[0] = w1[0] ^ 0x36363636; + w1[1] = w1[1] ^ 0x36363636; + w1[2] = w1[2] ^ 0x36363636; + w1[3] = w1[3] ^ 0x36363636; + w2[0] = w2[0] ^ 0x36363636; + w2[1] = w2[1] ^ 0x36363636; + w2[2] = w2[2] ^ 0x36363636; + w2[3] = w2[3] ^ 0x36363636; + w3[0] = w3[0] ^ 0x36363636; + w3[1] = w3[1] ^ 0x36363636; + w3[2] = w3[2] ^ 0x36363636; + w3[3] = w3[3] ^ 0x36363636; + + ipad[0] = SHA1M_A; + ipad[1] = SHA1M_B; + ipad[2] = SHA1M_C; + ipad[3] = SHA1M_D; + ipad[4] = SHA1M_E; + + sha1_transform (w0, w1, w2, w3, ipad); + + w0[0] = w0[0] ^ 0x6a6a6a6a; + w0[1] = w0[1] ^ 0x6a6a6a6a; + w0[2] = w0[2] ^ 0x6a6a6a6a; + w0[3] = w0[3] ^ 0x6a6a6a6a; + w1[0] = w1[0] ^ 0x6a6a6a6a; + w1[1] = w1[1] ^ 0x6a6a6a6a; + w1[2] = w1[2] ^ 0x6a6a6a6a; + w1[3] = w1[3] ^ 0x6a6a6a6a; + w2[0] = w2[0] ^ 0x6a6a6a6a; + w2[1] = w2[1] ^ 0x6a6a6a6a; + w2[2] = w2[2] ^ 0x6a6a6a6a; + w2[3] = w2[3] ^ 0x6a6a6a6a; + w3[0] = w3[0] ^ 0x6a6a6a6a; + w3[1] = w3[1] ^ 0x6a6a6a6a; + w3[2] = w3[2] ^ 0x6a6a6a6a; + w3[3] = w3[3] ^ 0x6a6a6a6a; + + opad[0] = SHA1M_A; + opad[1] = SHA1M_B; + opad[2] = SHA1M_C; + opad[3] = SHA1M_D; + opad[4] = SHA1M_E; + + sha1_transform (w0, w1, w2, w3, opad); +} + +__device__ static void hmac_sha1_run (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], u32x ipad[5], u32x opad[5], u32x digest[5]) +{ + digest[0] = ipad[0]; + digest[1] = ipad[1]; + digest[2] = ipad[2]; + digest[3] = ipad[3]; + digest[4] = ipad[4]; + + sha1_transform (w0, w1, w2, w3, digest); + + w0[0] = digest[0]; + w0[1] = digest[1]; + w0[2] = digest[2]; + w0[3] = digest[3]; + w1[0] = digest[4]; + w1[1] = 0x80000000; + w1[2] = 0; + w1[3] = 0; + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = (64 + 20) * 8; + + digest[0] = opad[0]; + digest[1] = opad[1]; + digest[2] = opad[2]; + digest[3] = opad[3]; + digest[4] = opad[4]; + + sha1_transform (w0, w1, w2, w3, digest); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m12000_init (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, pbkdf2_sha1_tmp_t *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const pbkdf2_sha1_t *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = swap_workaround (pws[gid].i[ 0]); + w0[1] = swap_workaround (pws[gid].i[ 1]); + w0[2] = swap_workaround (pws[gid].i[ 2]); + w0[3] = swap_workaround (pws[gid].i[ 3]); + + u32x w1[4]; + + w1[0] = swap_workaround (pws[gid].i[ 4]); + w1[1] = swap_workaround (pws[gid].i[ 5]); + w1[2] = swap_workaround (pws[gid].i[ 6]); + w1[3] = swap_workaround (pws[gid].i[ 7]); + + u32x w2[4]; + + w2[0] = swap_workaround (pws[gid].i[ 8]); + w2[1] = swap_workaround (pws[gid].i[ 9]); + w2[2] = swap_workaround (pws[gid].i[10]); + w2[3] = swap_workaround (pws[gid].i[11]); + + u32x w3[4]; + + w3[0] = swap_workaround (pws[gid].i[12]); + w3[1] = swap_workaround (pws[gid].i[13]); + w3[2] = swap_workaround (pws[gid].i[14]); + w3[3] = swap_workaround (pws[gid].i[15]); + + /** + * salt + */ + + const u32 salt_len = salt_bufs[salt_pos].salt_len; + + u32 esalt_buf0[4]; + u32 esalt_buf1[4]; + u32 esalt_buf2[4]; + u32 esalt_buf3[4]; + + esalt_buf0[0] = swap_workaround (esalt_bufs[salt_pos].salt_buf[ 0]); + esalt_buf0[1] = swap_workaround (esalt_bufs[salt_pos].salt_buf[ 1]); + esalt_buf0[2] = swap_workaround (esalt_bufs[salt_pos].salt_buf[ 2]); + esalt_buf0[3] = swap_workaround (esalt_bufs[salt_pos].salt_buf[ 3]); + esalt_buf1[0] = swap_workaround (esalt_bufs[salt_pos].salt_buf[ 4]); + esalt_buf1[1] = swap_workaround (esalt_bufs[salt_pos].salt_buf[ 5]); + esalt_buf1[2] = swap_workaround (esalt_bufs[salt_pos].salt_buf[ 6]); + esalt_buf1[3] = swap_workaround (esalt_bufs[salt_pos].salt_buf[ 7]); + esalt_buf2[0] = swap_workaround (esalt_bufs[salt_pos].salt_buf[ 8]); + esalt_buf2[1] = swap_workaround (esalt_bufs[salt_pos].salt_buf[ 9]); + esalt_buf2[2] = swap_workaround (esalt_bufs[salt_pos].salt_buf[10]); + esalt_buf2[3] = swap_workaround (esalt_bufs[salt_pos].salt_buf[11]); + esalt_buf3[0] = swap_workaround (esalt_bufs[salt_pos].salt_buf[12]); + esalt_buf3[1] = swap_workaround (esalt_bufs[salt_pos].salt_buf[13]); + esalt_buf3[2] = 0; + esalt_buf3[3] = (64 + salt_len + 4) * 8; + + u32 ipad[5]; + u32 opad[5]; + + hmac_sha1_pad (w0, w1, w2, w3, ipad, opad); + + tmps[gid].ipad[0] = ipad[0]; + tmps[gid].ipad[1] = ipad[1]; + tmps[gid].ipad[2] = ipad[2]; + tmps[gid].ipad[3] = ipad[3]; + tmps[gid].ipad[4] = ipad[4]; + + tmps[gid].opad[0] = opad[0]; + tmps[gid].opad[1] = opad[1]; + tmps[gid].opad[2] = opad[2]; + tmps[gid].opad[3] = opad[3]; + tmps[gid].opad[4] = opad[4]; + + for (u32 i = 0, j = 1; i < 5; i += 5, j += 1) + { + u32 dgst[5]; + + hmac_sha1_run (esalt_buf0, esalt_buf1, esalt_buf2, esalt_buf3, ipad, opad, dgst); + + tmps[gid].dgst[i + 0] = dgst[0]; + tmps[gid].dgst[i + 1] = dgst[1]; + tmps[gid].dgst[i + 2] = dgst[2]; + tmps[gid].dgst[i + 3] = dgst[3]; + tmps[gid].dgst[i + 4] = dgst[4]; + + tmps[gid].out[i + 0] = dgst[0]; + tmps[gid].out[i + 1] = dgst[1]; + tmps[gid].out[i + 2] = dgst[2]; + tmps[gid].out[i + 3] = dgst[3]; + tmps[gid].out[i + 4] = dgst[4]; + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m12000_loop (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, pbkdf2_sha1_tmp_t *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const pbkdf2_sha1_t *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32 ipad[5]; + + ipad[0] = tmps[gid].ipad[0]; + ipad[1] = tmps[gid].ipad[1]; + ipad[2] = tmps[gid].ipad[2]; + ipad[3] = tmps[gid].ipad[3]; + ipad[4] = tmps[gid].ipad[4]; + + u32 opad[5]; + + opad[0] = tmps[gid].opad[0]; + opad[1] = tmps[gid].opad[1]; + opad[2] = tmps[gid].opad[2]; + opad[3] = tmps[gid].opad[3]; + opad[4] = tmps[gid].opad[4]; + + for (u32 i = 0; i < 5; i += 5) + { + u32 dgst[5]; + + dgst[0] = tmps[gid].dgst[i + 0]; + dgst[1] = tmps[gid].dgst[i + 1]; + dgst[2] = tmps[gid].dgst[i + 2]; + dgst[3] = tmps[gid].dgst[i + 3]; + dgst[4] = tmps[gid].dgst[i + 4]; + + u32 out[5]; + + out[0] = tmps[gid].out[i + 0]; + out[1] = tmps[gid].out[i + 1]; + out[2] = tmps[gid].out[i + 2]; + out[3] = tmps[gid].out[i + 3]; + out[4] = tmps[gid].out[i + 4]; + + for (u32 j = 0; j < loop_cnt; j++) + { + u32 w0[4]; + u32 w1[4]; + u32 w2[4]; + u32 w3[4]; + + w0[0] = dgst[0]; + w0[1] = dgst[1]; + w0[2] = dgst[2]; + w0[3] = dgst[3]; + w1[0] = dgst[4]; + w1[1] = 0x80000000; + w1[2] = 0; + w1[3] = 0; + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = (64 + 20) * 8; + + hmac_sha1_run (w0, w1, w2, w3, ipad, opad, dgst); + + out[0] ^= dgst[0]; + out[1] ^= dgst[1]; + out[2] ^= dgst[2]; + out[3] ^= dgst[3]; + out[4] ^= dgst[4]; + } + + tmps[gid].dgst[i + 0] = dgst[0]; + tmps[gid].dgst[i + 1] = dgst[1]; + tmps[gid].dgst[i + 2] = dgst[2]; + tmps[gid].dgst[i + 3] = dgst[3]; + tmps[gid].dgst[i + 4] = dgst[4]; + + tmps[gid].out[i + 0] = out[0]; + tmps[gid].out[i + 1] = out[1]; + tmps[gid].out[i + 2] = out[2]; + tmps[gid].out[i + 3] = out[3]; + tmps[gid].out[i + 4] = out[4]; + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m12000_comp (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, pbkdf2_sha1_tmp_t *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const pbkdf2_sha1_t *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + const u32 lid = threadIdx.x; + + const u32x r0 = tmps[gid].out[DGST_R0]; + const u32x r1 = tmps[gid].out[DGST_R1]; + const u32x r2 = tmps[gid].out[DGST_R2]; + const u32x r3 = tmps[gid].out[DGST_R3]; + + #define il_pos 0 + + #include VECT_COMPARE_M +} diff --git a/nv/m12200.cu b/nv/m12200.cu new file mode 100644 index 0000000000..cd910aed84 --- /dev/null +++ b/nv/m12200.cu @@ -0,0 +1,335 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _SHA512_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW2 +#define VECT_SIZE1 +#endif + +#define DGST_R0 0 +#define DGST_R1 1 +#define DGST_R2 2 +#define DGST_R3 3 + +#include "include/kernel_functions.c" +#include "types_nv.c" +#include "common_nv.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +__device__ __constant__ u64 k[80] = +{ + SHA512C00, SHA512C01, SHA512C02, SHA512C03, + SHA512C04, SHA512C05, SHA512C06, SHA512C07, + SHA512C08, SHA512C09, SHA512C0a, SHA512C0b, + SHA512C0c, SHA512C0d, SHA512C0e, SHA512C0f, + SHA512C10, SHA512C11, SHA512C12, SHA512C13, + SHA512C14, SHA512C15, SHA512C16, SHA512C17, + SHA512C18, SHA512C19, SHA512C1a, SHA512C1b, + SHA512C1c, SHA512C1d, SHA512C1e, SHA512C1f, + SHA512C20, SHA512C21, SHA512C22, SHA512C23, + SHA512C24, SHA512C25, SHA512C26, SHA512C27, + SHA512C28, SHA512C29, SHA512C2a, SHA512C2b, + SHA512C2c, SHA512C2d, SHA512C2e, SHA512C2f, + SHA512C30, SHA512C31, SHA512C32, SHA512C33, + SHA512C34, SHA512C35, SHA512C36, SHA512C37, + SHA512C38, SHA512C39, SHA512C3a, SHA512C3b, + SHA512C3c, SHA512C3d, SHA512C3e, SHA512C3f, + SHA512C40, SHA512C41, SHA512C42, SHA512C43, + SHA512C44, SHA512C45, SHA512C46, SHA512C47, + SHA512C48, SHA512C49, SHA512C4a, SHA512C4b, + SHA512C4c, SHA512C4d, SHA512C4e, SHA512C4f, +}; + +#define ROUND_EXPAND() \ +{ \ + w0_t = SHA512_EXPAND (we_t, w9_t, w1_t, w0_t); \ + w1_t = SHA512_EXPAND (wf_t, wa_t, w2_t, w1_t); \ + w2_t = SHA512_EXPAND (w0_t, wb_t, w3_t, w2_t); \ + w3_t = SHA512_EXPAND (w1_t, wc_t, w4_t, w3_t); \ + w4_t = SHA512_EXPAND (w2_t, wd_t, w5_t, w4_t); \ + w5_t = SHA512_EXPAND (w3_t, we_t, w6_t, w5_t); \ + w6_t = SHA512_EXPAND (w4_t, wf_t, w7_t, w6_t); \ + w7_t = SHA512_EXPAND (w5_t, w0_t, w8_t, w7_t); \ + w8_t = SHA512_EXPAND (w6_t, w1_t, w9_t, w8_t); \ + w9_t = SHA512_EXPAND (w7_t, w2_t, wa_t, w9_t); \ + wa_t = SHA512_EXPAND (w8_t, w3_t, wb_t, wa_t); \ + wb_t = SHA512_EXPAND (w9_t, w4_t, wc_t, wb_t); \ + wc_t = SHA512_EXPAND (wa_t, w5_t, wd_t, wc_t); \ + wd_t = SHA512_EXPAND (wb_t, w6_t, we_t, wd_t); \ + we_t = SHA512_EXPAND (wc_t, w7_t, wf_t, we_t); \ + wf_t = SHA512_EXPAND (wd_t, w8_t, w0_t, wf_t); \ +} + +#define ROUND_STEP(i) \ +{ \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, a, b, c, d, e, f, g, h, w0_t, k[i + 0]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, h, a, b, c, d, e, f, g, w1_t, k[i + 1]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, g, h, a, b, c, d, e, f, w2_t, k[i + 2]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, f, g, h, a, b, c, d, e, w3_t, k[i + 3]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, e, f, g, h, a, b, c, d, w4_t, k[i + 4]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, d, e, f, g, h, a, b, c, w5_t, k[i + 5]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, c, d, e, f, g, h, a, b, w6_t, k[i + 6]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, b, c, d, e, f, g, h, a, w7_t, k[i + 7]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, a, b, c, d, e, f, g, h, w8_t, k[i + 8]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, h, a, b, c, d, e, f, g, w9_t, k[i + 9]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, g, h, a, b, c, d, e, f, wa_t, k[i + 10]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, f, g, h, a, b, c, d, e, wb_t, k[i + 11]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, e, f, g, h, a, b, c, d, wc_t, k[i + 12]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, d, e, f, g, h, a, b, c, wd_t, k[i + 13]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, c, d, e, f, g, h, a, b, we_t, k[i + 14]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, b, c, d, e, f, g, h, a, wf_t, k[i + 15]); \ +} + +__device__ static void sha512_transform (const u64 w[16], u64 dgst[8]) +{ + u64 a = dgst[0]; + u64 b = dgst[1]; + u64 c = dgst[2]; + u64 d = dgst[3]; + u64 e = dgst[4]; + u64 f = dgst[5]; + u64 g = dgst[6]; + u64 h = dgst[7]; + + u64 w0_t = w[ 0]; + u64 w1_t = w[ 1]; + u64 w2_t = w[ 2]; + u64 w3_t = w[ 3]; + u64 w4_t = w[ 4]; + u64 w5_t = w[ 5]; + u64 w6_t = w[ 6]; + u64 w7_t = w[ 7]; + u64 w8_t = w[ 8]; + u64 w9_t = w[ 9]; + u64 wa_t = w[10]; + u64 wb_t = w[11]; + u64 wc_t = w[12]; + u64 wd_t = w[13]; + u64 we_t = w[14]; + u64 wf_t = w[15]; + + ROUND_STEP (0); + + for (int i = 16; i < 80; i += 16) + { + ROUND_EXPAND (); ROUND_STEP (i); + } + + dgst[0] += a; + dgst[1] += b; + dgst[2] += c; + dgst[3] += d; + dgst[4] += e; + dgst[5] += f; + dgst[6] += g; + dgst[7] += h; +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m12200_init (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, ecryptfs_tmp_t *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = pws[gid].i[ 8]; + w2[1] = pws[gid].i[ 9]; + w2[2] = pws[gid].i[10]; + w2[3] = pws[gid].i[11]; + + u32x w3[4]; + + w3[0] = pws[gid].i[12]; + w3[1] = pws[gid].i[13]; + w3[2] = pws[gid].i[14]; + w3[3] = pws[gid].i[15]; + + u32 pw_len = pws[gid].pw_len; + + append_0x80_4 (w0, w1, w2, w3, pw_len); + + w0[0] = swap_workaround (w0[0]); + w0[1] = swap_workaround (w0[1]); + w0[2] = swap_workaround (w0[2]); + w0[3] = swap_workaround (w0[3]); + w1[0] = swap_workaround (w1[0]); + w1[1] = swap_workaround (w1[1]); + w1[2] = swap_workaround (w1[2]); + w1[3] = swap_workaround (w1[3]); + w2[0] = swap_workaround (w2[0]); + w2[1] = swap_workaround (w2[1]); + w2[2] = swap_workaround (w2[2]); + w2[3] = swap_workaround (w2[3]); + w3[0] = swap_workaround (w3[0]); + w3[1] = swap_workaround (w3[1]); + w3[2] = swap_workaround (w3[2]); + w3[3] = swap_workaround (w3[3]); + + /** + * salt + */ + + u32 s0[2]; + + s0[0] = salt_bufs[salt_pos].salt_buf[0]; + s0[1] = salt_bufs[salt_pos].salt_buf[1]; + + u32 salt_len = salt_bufs[salt_pos].salt_len; + + u64 w[16]; + + w[ 0] = hl32_to_64 (s0[0], s0[1]); + w[ 1] = hl32_to_64 (w0[0], w0[1]); + w[ 2] = hl32_to_64 (w0[2], w0[3]); + w[ 3] = hl32_to_64 (w1[0], w1[1]); + w[ 4] = hl32_to_64 (w1[2], w1[3]); + w[ 5] = hl32_to_64 (w2[0], w2[1]); + w[ 6] = hl32_to_64 (w2[2], w2[3]); + w[ 7] = hl32_to_64 (w3[0], w3[1]); + w[ 8] = hl32_to_64 (w3[2], w3[3]); + w[ 9] = 0; + w[10] = 0; + w[11] = 0; + w[12] = 0; + w[13] = 0; + w[14] = 0; + w[15] = (salt_len + pw_len) * 8; + + u64 dgst[8]; + + dgst[0] = SHA512M_A; + dgst[1] = SHA512M_B; + dgst[2] = SHA512M_C; + dgst[3] = SHA512M_D; + dgst[4] = SHA512M_E; + dgst[5] = SHA512M_F; + dgst[6] = SHA512M_G; + dgst[7] = SHA512M_H; + + sha512_transform (w, dgst); + + tmps[gid].out[0] = dgst[0]; + tmps[gid].out[1] = dgst[1]; + tmps[gid].out[2] = dgst[2]; + tmps[gid].out[3] = dgst[3]; + tmps[gid].out[4] = dgst[4]; + tmps[gid].out[5] = dgst[5]; + tmps[gid].out[6] = dgst[6]; + tmps[gid].out[7] = dgst[7]; +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m12200_loop (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, ecryptfs_tmp_t *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u64 dgst[8]; + + dgst[0] = tmps[gid].out[0]; + dgst[1] = tmps[gid].out[1]; + dgst[2] = tmps[gid].out[2]; + dgst[3] = tmps[gid].out[3]; + dgst[4] = tmps[gid].out[4]; + dgst[5] = tmps[gid].out[5]; + dgst[6] = tmps[gid].out[6]; + dgst[7] = tmps[gid].out[7]; + + for (u32 i = 0; i < loop_cnt; i++) + { + u64 w[16]; + + w[ 0] = dgst[0]; + w[ 1] = dgst[1]; + w[ 2] = dgst[2]; + w[ 3] = dgst[3]; + w[ 4] = dgst[4]; + w[ 5] = dgst[5]; + w[ 6] = dgst[6]; + w[ 7] = dgst[7]; + w[ 8] = 0x8000000000000000; + w[ 9] = 0; + w[10] = 0; + w[11] = 0; + w[12] = 0; + w[13] = 0; + w[14] = 0; + w[15] = 64 * 8; + + dgst[0] = SHA512M_A; + dgst[1] = SHA512M_B; + dgst[2] = SHA512M_C; + dgst[3] = SHA512M_D; + dgst[4] = SHA512M_E; + dgst[5] = SHA512M_F; + dgst[6] = SHA512M_G; + dgst[7] = SHA512M_H; + + sha512_transform (w, dgst); + } + + tmps[gid].out[0] = dgst[0]; + tmps[gid].out[1] = dgst[1]; + tmps[gid].out[2] = dgst[2]; + tmps[gid].out[3] = dgst[3]; + tmps[gid].out[4] = dgst[4]; + tmps[gid].out[5] = dgst[5]; + tmps[gid].out[6] = dgst[6]; + tmps[gid].out[7] = dgst[7]; +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m12200_comp (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, ecryptfs_tmp_t *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + const u32 lid = threadIdx.x; + + const u64x a = tmps[gid].out[0]; + + const u32x r0 = h32_from_64 (a); + const u32x r1 = l32_from_64 (a); + const u32x r2 = 0; + const u32x r3 = 0; + + #define il_pos 0 + + #include VECT_COMPARE_M +} diff --git a/nv/m12300.cu b/nv/m12300.cu new file mode 100644 index 0000000000..97a3ce504a --- /dev/null +++ b/nv/m12300.cu @@ -0,0 +1,530 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _PBKDF2_SHA512_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW2 +#define VECT_SIZE1 +#endif + +#define DGST_R0 0 +#define DGST_R1 1 +#define DGST_R2 2 +#define DGST_R3 3 + +#include "include/kernel_functions.c" +#include "types_nv.c" +#include "common_nv.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +__device__ __constant__ u64 k[80] = +{ + SHA512C00, SHA512C01, SHA512C02, SHA512C03, + SHA512C04, SHA512C05, SHA512C06, SHA512C07, + SHA512C08, SHA512C09, SHA512C0a, SHA512C0b, + SHA512C0c, SHA512C0d, SHA512C0e, SHA512C0f, + SHA512C10, SHA512C11, SHA512C12, SHA512C13, + SHA512C14, SHA512C15, SHA512C16, SHA512C17, + SHA512C18, SHA512C19, SHA512C1a, SHA512C1b, + SHA512C1c, SHA512C1d, SHA512C1e, SHA512C1f, + SHA512C20, SHA512C21, SHA512C22, SHA512C23, + SHA512C24, SHA512C25, SHA512C26, SHA512C27, + SHA512C28, SHA512C29, SHA512C2a, SHA512C2b, + SHA512C2c, SHA512C2d, SHA512C2e, SHA512C2f, + SHA512C30, SHA512C31, SHA512C32, SHA512C33, + SHA512C34, SHA512C35, SHA512C36, SHA512C37, + SHA512C38, SHA512C39, SHA512C3a, SHA512C3b, + SHA512C3c, SHA512C3d, SHA512C3e, SHA512C3f, + SHA512C40, SHA512C41, SHA512C42, SHA512C43, + SHA512C44, SHA512C45, SHA512C46, SHA512C47, + SHA512C48, SHA512C49, SHA512C4a, SHA512C4b, + SHA512C4c, SHA512C4d, SHA512C4e, SHA512C4f, +}; + +#define ROUND_EXPAND() \ +{ \ + w0_t = SHA512_EXPAND (we_t, w9_t, w1_t, w0_t); \ + w1_t = SHA512_EXPAND (wf_t, wa_t, w2_t, w1_t); \ + w2_t = SHA512_EXPAND (w0_t, wb_t, w3_t, w2_t); \ + w3_t = SHA512_EXPAND (w1_t, wc_t, w4_t, w3_t); \ + w4_t = SHA512_EXPAND (w2_t, wd_t, w5_t, w4_t); \ + w5_t = SHA512_EXPAND (w3_t, we_t, w6_t, w5_t); \ + w6_t = SHA512_EXPAND (w4_t, wf_t, w7_t, w6_t); \ + w7_t = SHA512_EXPAND (w5_t, w0_t, w8_t, w7_t); \ + w8_t = SHA512_EXPAND (w6_t, w1_t, w9_t, w8_t); \ + w9_t = SHA512_EXPAND (w7_t, w2_t, wa_t, w9_t); \ + wa_t = SHA512_EXPAND (w8_t, w3_t, wb_t, wa_t); \ + wb_t = SHA512_EXPAND (w9_t, w4_t, wc_t, wb_t); \ + wc_t = SHA512_EXPAND (wa_t, w5_t, wd_t, wc_t); \ + wd_t = SHA512_EXPAND (wb_t, w6_t, we_t, wd_t); \ + we_t = SHA512_EXPAND (wc_t, w7_t, wf_t, we_t); \ + wf_t = SHA512_EXPAND (wd_t, w8_t, w0_t, wf_t); \ +} + +#define ROUND_STEP(i) \ +{ \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, a, b, c, d, e, f, g, h, w0_t, k[i + 0]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, h, a, b, c, d, e, f, g, w1_t, k[i + 1]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, g, h, a, b, c, d, e, f, w2_t, k[i + 2]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, f, g, h, a, b, c, d, e, w3_t, k[i + 3]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, e, f, g, h, a, b, c, d, w4_t, k[i + 4]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, d, e, f, g, h, a, b, c, w5_t, k[i + 5]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, c, d, e, f, g, h, a, b, w6_t, k[i + 6]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, b, c, d, e, f, g, h, a, w7_t, k[i + 7]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, a, b, c, d, e, f, g, h, w8_t, k[i + 8]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, h, a, b, c, d, e, f, g, w9_t, k[i + 9]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, g, h, a, b, c, d, e, f, wa_t, k[i + 10]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, f, g, h, a, b, c, d, e, wb_t, k[i + 11]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, e, f, g, h, a, b, c, d, wc_t, k[i + 12]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, d, e, f, g, h, a, b, c, wd_t, k[i + 13]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, c, d, e, f, g, h, a, b, we_t, k[i + 14]); \ + SHA512_STEP (SHA512_F0o, SHA512_F1o, b, c, d, e, f, g, h, a, wf_t, k[i + 15]); \ +} + +__device__ static void sha512_transform (const u64 w[16], u64 dgst[8]) +{ + u64 a = dgst[0]; + u64 b = dgst[1]; + u64 c = dgst[2]; + u64 d = dgst[3]; + u64 e = dgst[4]; + u64 f = dgst[5]; + u64 g = dgst[6]; + u64 h = dgst[7]; + + u64 w0_t = w[ 0]; + u64 w1_t = w[ 1]; + u64 w2_t = w[ 2]; + u64 w3_t = w[ 3]; + u64 w4_t = w[ 4]; + u64 w5_t = w[ 5]; + u64 w6_t = w[ 6]; + u64 w7_t = w[ 7]; + u64 w8_t = w[ 8]; + u64 w9_t = w[ 9]; + u64 wa_t = w[10]; + u64 wb_t = w[11]; + u64 wc_t = w[12]; + u64 wd_t = w[13]; + u64 we_t = w[14]; + u64 wf_t = w[15]; + + ROUND_STEP (0); + + for (int i = 16; i < 80; i += 16) + { + ROUND_EXPAND (); ROUND_STEP (i); + } + + dgst[0] += a; + dgst[1] += b; + dgst[2] += c; + dgst[3] += d; + dgst[4] += e; + dgst[5] += f; + dgst[6] += g; + dgst[7] += h; +} + +__device__ static void hmac_run (const u64 w1[16], const u64 ipad[8], const u64 opad[8], u64 dgst[8]) +{ + dgst[0] = ipad[0]; + dgst[1] = ipad[1]; + dgst[2] = ipad[2]; + dgst[3] = ipad[3]; + dgst[4] = ipad[4]; + dgst[5] = ipad[5]; + dgst[6] = ipad[6]; + dgst[7] = ipad[7]; + + sha512_transform (w1, dgst); + + u64 w[16]; + + w[ 0] = dgst[0]; + w[ 1] = dgst[1]; + w[ 2] = dgst[2]; + w[ 3] = dgst[3]; + w[ 4] = dgst[4]; + w[ 5] = dgst[5]; + w[ 6] = dgst[6]; + w[ 7] = dgst[7]; + w[ 8] = 0x8000000000000000; + w[ 9] = 0; + w[10] = 0; + w[11] = 0; + w[12] = 0; + w[13] = 0; + w[14] = 0; + w[15] = (128 + 64) * 8; + + dgst[0] = opad[0]; + dgst[1] = opad[1]; + dgst[2] = opad[2]; + dgst[3] = opad[3]; + dgst[4] = opad[4]; + dgst[5] = opad[5]; + dgst[6] = opad[6]; + dgst[7] = opad[7]; + + sha512_transform (w, dgst); +} + +__device__ static void hmac_init (u64 w[16], u64 ipad[8], u64 opad[8]) +{ + w[ 0] ^= 0x3636363636363636; + w[ 1] ^= 0x3636363636363636; + w[ 2] ^= 0x3636363636363636; + w[ 3] ^= 0x3636363636363636; + w[ 4] ^= 0x3636363636363636; + w[ 5] ^= 0x3636363636363636; + w[ 6] ^= 0x3636363636363636; + w[ 7] ^= 0x3636363636363636; + w[ 8] ^= 0x3636363636363636; + w[ 9] ^= 0x3636363636363636; + w[10] ^= 0x3636363636363636; + w[11] ^= 0x3636363636363636; + w[12] ^= 0x3636363636363636; + w[13] ^= 0x3636363636363636; + w[14] ^= 0x3636363636363636; + w[15] ^= 0x3636363636363636; + + ipad[0] = SHA512M_A; + ipad[1] = SHA512M_B; + ipad[2] = SHA512M_C; + ipad[3] = SHA512M_D; + ipad[4] = SHA512M_E; + ipad[5] = SHA512M_F; + ipad[6] = SHA512M_G; + ipad[7] = SHA512M_H; + + sha512_transform (w, ipad); + + w[ 0] ^= 0x6a6a6a6a6a6a6a6a; + w[ 1] ^= 0x6a6a6a6a6a6a6a6a; + w[ 2] ^= 0x6a6a6a6a6a6a6a6a; + w[ 3] ^= 0x6a6a6a6a6a6a6a6a; + w[ 4] ^= 0x6a6a6a6a6a6a6a6a; + w[ 5] ^= 0x6a6a6a6a6a6a6a6a; + w[ 6] ^= 0x6a6a6a6a6a6a6a6a; + w[ 7] ^= 0x6a6a6a6a6a6a6a6a; + w[ 8] ^= 0x6a6a6a6a6a6a6a6a; + w[ 9] ^= 0x6a6a6a6a6a6a6a6a; + w[10] ^= 0x6a6a6a6a6a6a6a6a; + w[11] ^= 0x6a6a6a6a6a6a6a6a; + w[12] ^= 0x6a6a6a6a6a6a6a6a; + w[13] ^= 0x6a6a6a6a6a6a6a6a; + w[14] ^= 0x6a6a6a6a6a6a6a6a; + w[15] ^= 0x6a6a6a6a6a6a6a6a; + + opad[0] = SHA512M_A; + opad[1] = SHA512M_B; + opad[2] = SHA512M_C; + opad[3] = SHA512M_D; + opad[4] = SHA512M_E; + opad[5] = SHA512M_F; + opad[6] = SHA512M_G; + opad[7] = SHA512M_H; + + sha512_transform (w, opad); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m12300_init (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, oraclet_tmp_t *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = swap_workaround (pws[gid].i[ 0]); + w0[1] = swap_workaround (pws[gid].i[ 1]); + w0[2] = swap_workaround (pws[gid].i[ 2]); + w0[3] = swap_workaround (pws[gid].i[ 3]); + + u32x w1[4]; + + w1[0] = swap_workaround (pws[gid].i[ 4]); + w1[1] = swap_workaround (pws[gid].i[ 5]); + w1[2] = swap_workaround (pws[gid].i[ 6]); + w1[3] = swap_workaround (pws[gid].i[ 7]); + + u32x w2[4]; + + w2[0] = swap_workaround (pws[gid].i[ 8]); + w2[1] = swap_workaround (pws[gid].i[ 9]); + w2[2] = swap_workaround (pws[gid].i[10]); + w2[3] = swap_workaround (pws[gid].i[11]); + + u32x w3[4]; + + w3[0] = swap_workaround (pws[gid].i[12]); + w3[1] = swap_workaround (pws[gid].i[13]); + w3[2] = swap_workaround (pws[gid].i[14]); + w3[3] = swap_workaround (pws[gid].i[15]); + + /** + * salt + */ + + u64 data[16]; + + data[ 0] = hl32_to_64 (salt_bufs[salt_pos].salt_buf[0], salt_bufs[salt_pos].salt_buf[1]); + data[ 1] = hl32_to_64 (salt_bufs[salt_pos].salt_buf[2], salt_bufs[salt_pos].salt_buf[3]); + data[ 2] = 0x415554485f50424b; + data[ 3] = 0x4446325f53504545; + data[ 4] = 0x44595f4b45590000; + data[ 5] = 0x0001800000000000; + data[ 6] = 0; + data[ 7] = 0; + data[ 8] = 0; + data[ 9] = 0; + data[10] = 0; + data[11] = 0; + data[12] = 0; + data[13] = 0; + data[14] = 0; + data[15] = (128 + 16 + 22 + 4) * 8; + + u64 w[16]; + + w[ 0] = hl32_to_64 (w0[0], w0[1]); + w[ 1] = hl32_to_64 (w0[2], w0[3]); + w[ 2] = hl32_to_64 (w1[0], w1[1]); + w[ 3] = hl32_to_64 (w1[2], w1[3]); + w[ 4] = hl32_to_64 (w2[0], w2[1]); + w[ 5] = hl32_to_64 (w2[2], w2[3]); + w[ 6] = hl32_to_64 (w3[0], w3[1]); + w[ 7] = hl32_to_64 (w3[2], w3[3]); + w[ 8] = 0; + w[ 9] = 0; + w[10] = 0; + w[11] = 0; + w[12] = 0; + w[13] = 0; + w[14] = 0; + w[15] = 0; + + u64 ipad[8]; + u64 opad[8]; + + hmac_init (w, ipad, opad); + + tmps[gid].ipad[0] = ipad[0]; + tmps[gid].ipad[1] = ipad[1]; + tmps[gid].ipad[2] = ipad[2]; + tmps[gid].ipad[3] = ipad[3]; + tmps[gid].ipad[4] = ipad[4]; + tmps[gid].ipad[5] = ipad[5]; + tmps[gid].ipad[6] = ipad[6]; + tmps[gid].ipad[7] = ipad[7]; + + tmps[gid].opad[0] = opad[0]; + tmps[gid].opad[1] = opad[1]; + tmps[gid].opad[2] = opad[2]; + tmps[gid].opad[3] = opad[3]; + tmps[gid].opad[4] = opad[4]; + tmps[gid].opad[5] = opad[5]; + tmps[gid].opad[6] = opad[6]; + tmps[gid].opad[7] = opad[7]; + + for (u32 i = 0, j = 1; i < 8; i += 8, j += 1) + { + u64 dgst[8]; + + hmac_run (data, ipad, opad, dgst); + + tmps[gid].dgst[i + 0] = dgst[0]; + tmps[gid].dgst[i + 1] = dgst[1]; + tmps[gid].dgst[i + 2] = dgst[2]; + tmps[gid].dgst[i + 3] = dgst[3]; + tmps[gid].dgst[i + 4] = dgst[4]; + tmps[gid].dgst[i + 5] = dgst[5]; + tmps[gid].dgst[i + 6] = dgst[6]; + tmps[gid].dgst[i + 7] = dgst[7]; + + tmps[gid].out[i + 0] = dgst[0]; + tmps[gid].out[i + 1] = dgst[1]; + tmps[gid].out[i + 2] = dgst[2]; + tmps[gid].out[i + 3] = dgst[3]; + tmps[gid].out[i + 4] = dgst[4]; + tmps[gid].out[i + 5] = dgst[5]; + tmps[gid].out[i + 6] = dgst[6]; + tmps[gid].out[i + 7] = dgst[7]; + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m12300_loop (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, oraclet_tmp_t *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u64 ipad[8]; + + ipad[0] = tmps[gid].ipad[0]; + ipad[1] = tmps[gid].ipad[1]; + ipad[2] = tmps[gid].ipad[2]; + ipad[3] = tmps[gid].ipad[3]; + ipad[4] = tmps[gid].ipad[4]; + ipad[5] = tmps[gid].ipad[5]; + ipad[6] = tmps[gid].ipad[6]; + ipad[7] = tmps[gid].ipad[7]; + + u64 opad[8]; + + opad[0] = tmps[gid].opad[0]; + opad[1] = tmps[gid].opad[1]; + opad[2] = tmps[gid].opad[2]; + opad[3] = tmps[gid].opad[3]; + opad[4] = tmps[gid].opad[4]; + opad[5] = tmps[gid].opad[5]; + opad[6] = tmps[gid].opad[6]; + opad[7] = tmps[gid].opad[7]; + + for (u32 i = 0; i < 8; i += 8) + { + u64 dgst[8]; + + dgst[0] = tmps[gid].dgst[i + 0]; + dgst[1] = tmps[gid].dgst[i + 1]; + dgst[2] = tmps[gid].dgst[i + 2]; + dgst[3] = tmps[gid].dgst[i + 3]; + dgst[4] = tmps[gid].dgst[i + 4]; + dgst[5] = tmps[gid].dgst[i + 5]; + dgst[6] = tmps[gid].dgst[i + 6]; + dgst[7] = tmps[gid].dgst[i + 7]; + + u64 out[8]; + + out[0] = tmps[gid].out[i + 0]; + out[1] = tmps[gid].out[i + 1]; + out[2] = tmps[gid].out[i + 2]; + out[3] = tmps[gid].out[i + 3]; + out[4] = tmps[gid].out[i + 4]; + out[5] = tmps[gid].out[i + 5]; + out[6] = tmps[gid].out[i + 6]; + out[7] = tmps[gid].out[i + 7]; + + for (u32 j = 0; j < loop_cnt; j++) + { + u64 w[16]; + + w[ 0] = dgst[0]; + w[ 1] = dgst[1]; + w[ 2] = dgst[2]; + w[ 3] = dgst[3]; + w[ 4] = dgst[4]; + w[ 5] = dgst[5]; + w[ 6] = dgst[6]; + w[ 7] = dgst[7]; + w[ 8] = 0x8000000000000000; + w[ 9] = 0; + w[10] = 0; + w[11] = 0; + w[12] = 0; + w[13] = 0; + w[14] = 0; + w[15] = (128 + 64) * 8; + + hmac_run (w, ipad, opad, dgst); + + out[0] ^= dgst[0]; + out[1] ^= dgst[1]; + out[2] ^= dgst[2]; + out[3] ^= dgst[3]; + out[4] ^= dgst[4]; + out[5] ^= dgst[5]; + out[6] ^= dgst[6]; + out[7] ^= dgst[7]; + } + + tmps[gid].dgst[i + 0] = dgst[0]; + tmps[gid].dgst[i + 1] = dgst[1]; + tmps[gid].dgst[i + 2] = dgst[2]; + tmps[gid].dgst[i + 3] = dgst[3]; + tmps[gid].dgst[i + 4] = dgst[4]; + tmps[gid].dgst[i + 5] = dgst[5]; + tmps[gid].dgst[i + 6] = dgst[6]; + tmps[gid].dgst[i + 7] = dgst[7]; + + tmps[gid].out[i + 0] = out[0]; + tmps[gid].out[i + 1] = out[1]; + tmps[gid].out[i + 2] = out[2]; + tmps[gid].out[i + 3] = out[3]; + tmps[gid].out[i + 4] = out[4]; + tmps[gid].out[i + 5] = out[5]; + tmps[gid].out[i + 6] = out[6]; + tmps[gid].out[i + 7] = out[7]; + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m12300_comp (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, oraclet_tmp_t *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + const u32 lid = threadIdx.x; + + u64 w[16]; + + w[ 0] = tmps[gid].out[0]; + w[ 1] = tmps[gid].out[1]; + w[ 2] = tmps[gid].out[2]; + w[ 3] = tmps[gid].out[3]; + w[ 4] = tmps[gid].out[4]; + w[ 5] = tmps[gid].out[5]; + w[ 6] = tmps[gid].out[6]; + w[ 7] = tmps[gid].out[7]; + w[ 8] = hl32_to_64 (salt_bufs[salt_pos].salt_buf[0], salt_bufs[salt_pos].salt_buf[1]); + w[ 9] = hl32_to_64 (salt_bufs[salt_pos].salt_buf[2], salt_bufs[salt_pos].salt_buf[3]); + w[10] = 0x8000000000000000; + w[11] = 0; + w[12] = 0; + w[13] = 0; + w[14] = 0; + w[15] = (64 + 16) * 8; + + u64 dgst[8]; + + dgst[0] = SHA512M_A; + dgst[1] = SHA512M_B; + dgst[2] = SHA512M_C; + dgst[3] = SHA512M_D; + dgst[4] = SHA512M_E; + dgst[5] = SHA512M_F; + dgst[6] = SHA512M_G; + dgst[7] = SHA512M_H; + + sha512_transform (w, dgst); + + const u32x r0 = h32_from_64 (dgst[0]); + const u32x r1 = l32_from_64 (dgst[0]); + const u32x r2 = h32_from_64 (dgst[1]); + const u32x r3 = l32_from_64 (dgst[1]); + + #define il_pos 0 + + #include VECT_COMPARE_M +} diff --git a/nv/m12400.cu b/nv/m12400.cu new file mode 100644 index 0000000000..63e0c48308 --- /dev/null +++ b/nv/m12400.cu @@ -0,0 +1,778 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _DES_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW2 +#define VECT_SIZE1 +#endif + +#define DGST_R0 0 +#define DGST_R1 1 +#define DGST_R2 2 +#define DGST_R3 3 + +#include "include/kernel_functions.c" +#include "types_nv.c" +#include "common_nv.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#define PERM_OP(a,b,tt,n,m) \ +{ \ + tt = a >> n; \ + tt = tt ^ b; \ + tt = tt & m; \ + b = b ^ tt; \ + tt = tt << n; \ + a = a ^ tt; \ +} + +#define HPERM_OP(a,tt,n,m) \ +{ \ + tt = a << (16 + n); \ + tt = tt ^ a; \ + tt = tt & m; \ + a = a ^ tt; \ + tt = tt >> (16 + n); \ + a = a ^ tt; \ +} + +#define IP(l,r,tt) \ +{ \ + PERM_OP (r, l, tt, 4, 0x0f0f0f0f); \ + PERM_OP (l, r, tt, 16, 0x0000ffff); \ + PERM_OP (r, l, tt, 2, 0x33333333); \ + PERM_OP (l, r, tt, 8, 0x00ff00ff); \ + PERM_OP (r, l, tt, 1, 0x55555555); \ +} + +#define FP(l,r,tt) \ +{ \ + PERM_OP (l, r, tt, 1, 0x55555555); \ + PERM_OP (r, l, tt, 8, 0x00ff00ff); \ + PERM_OP (l, r, tt, 2, 0x33333333); \ + PERM_OP (r, l, tt, 16, 0x0000ffff); \ + PERM_OP (l, r, tt, 4, 0x0f0f0f0f); \ +} + +__device__ __constant__ u32 c_SPtrans[8][64] = +{ + /* nibble 0 */ + 0x00820200, 0x00020000, 0x80800000, 0x80820200, + 0x00800000, 0x80020200, 0x80020000, 0x80800000, + 0x80020200, 0x00820200, 0x00820000, 0x80000200, + 0x80800200, 0x00800000, 0x00000000, 0x80020000, + 0x00020000, 0x80000000, 0x00800200, 0x00020200, + 0x80820200, 0x00820000, 0x80000200, 0x00800200, + 0x80000000, 0x00000200, 0x00020200, 0x80820000, + 0x00000200, 0x80800200, 0x80820000, 0x00000000, + 0x00000000, 0x80820200, 0x00800200, 0x80020000, + 0x00820200, 0x00020000, 0x80000200, 0x00800200, + 0x80820000, 0x00000200, 0x00020200, 0x80800000, + 0x80020200, 0x80000000, 0x80800000, 0x00820000, + 0x80820200, 0x00020200, 0x00820000, 0x80800200, + 0x00800000, 0x80000200, 0x80020000, 0x00000000, + 0x00020000, 0x00800000, 0x80800200, 0x00820200, + 0x80000000, 0x80820000, 0x00000200, 0x80020200, + /* nibble 1 */ + 0x10042004, 0x00000000, 0x00042000, 0x10040000, + 0x10000004, 0x00002004, 0x10002000, 0x00042000, + 0x00002000, 0x10040004, 0x00000004, 0x10002000, + 0x00040004, 0x10042000, 0x10040000, 0x00000004, + 0x00040000, 0x10002004, 0x10040004, 0x00002000, + 0x00042004, 0x10000000, 0x00000000, 0x00040004, + 0x10002004, 0x00042004, 0x10042000, 0x10000004, + 0x10000000, 0x00040000, 0x00002004, 0x10042004, + 0x00040004, 0x10042000, 0x10002000, 0x00042004, + 0x10042004, 0x00040004, 0x10000004, 0x00000000, + 0x10000000, 0x00002004, 0x00040000, 0x10040004, + 0x00002000, 0x10000000, 0x00042004, 0x10002004, + 0x10042000, 0x00002000, 0x00000000, 0x10000004, + 0x00000004, 0x10042004, 0x00042000, 0x10040000, + 0x10040004, 0x00040000, 0x00002004, 0x10002000, + 0x10002004, 0x00000004, 0x10040000, 0x00042000, + /* nibble 2 */ + 0x41000000, 0x01010040, 0x00000040, 0x41000040, + 0x40010000, 0x01000000, 0x41000040, 0x00010040, + 0x01000040, 0x00010000, 0x01010000, 0x40000000, + 0x41010040, 0x40000040, 0x40000000, 0x41010000, + 0x00000000, 0x40010000, 0x01010040, 0x00000040, + 0x40000040, 0x41010040, 0x00010000, 0x41000000, + 0x41010000, 0x01000040, 0x40010040, 0x01010000, + 0x00010040, 0x00000000, 0x01000000, 0x40010040, + 0x01010040, 0x00000040, 0x40000000, 0x00010000, + 0x40000040, 0x40010000, 0x01010000, 0x41000040, + 0x00000000, 0x01010040, 0x00010040, 0x41010000, + 0x40010000, 0x01000000, 0x41010040, 0x40000000, + 0x40010040, 0x41000000, 0x01000000, 0x41010040, + 0x00010000, 0x01000040, 0x41000040, 0x00010040, + 0x01000040, 0x00000000, 0x41010000, 0x40000040, + 0x41000000, 0x40010040, 0x00000040, 0x01010000, + /* nibble 3 */ + 0x00100402, 0x04000400, 0x00000002, 0x04100402, + 0x00000000, 0x04100000, 0x04000402, 0x00100002, + 0x04100400, 0x04000002, 0x04000000, 0x00000402, + 0x04000002, 0x00100402, 0x00100000, 0x04000000, + 0x04100002, 0x00100400, 0x00000400, 0x00000002, + 0x00100400, 0x04000402, 0x04100000, 0x00000400, + 0x00000402, 0x00000000, 0x00100002, 0x04100400, + 0x04000400, 0x04100002, 0x04100402, 0x00100000, + 0x04100002, 0x00000402, 0x00100000, 0x04000002, + 0x00100400, 0x04000400, 0x00000002, 0x04100000, + 0x04000402, 0x00000000, 0x00000400, 0x00100002, + 0x00000000, 0x04100002, 0x04100400, 0x00000400, + 0x04000000, 0x04100402, 0x00100402, 0x00100000, + 0x04100402, 0x00000002, 0x04000400, 0x00100402, + 0x00100002, 0x00100400, 0x04100000, 0x04000402, + 0x00000402, 0x04000000, 0x04000002, 0x04100400, + /* nibble 4 */ + 0x02000000, 0x00004000, 0x00000100, 0x02004108, + 0x02004008, 0x02000100, 0x00004108, 0x02004000, + 0x00004000, 0x00000008, 0x02000008, 0x00004100, + 0x02000108, 0x02004008, 0x02004100, 0x00000000, + 0x00004100, 0x02000000, 0x00004008, 0x00000108, + 0x02000100, 0x00004108, 0x00000000, 0x02000008, + 0x00000008, 0x02000108, 0x02004108, 0x00004008, + 0x02004000, 0x00000100, 0x00000108, 0x02004100, + 0x02004100, 0x02000108, 0x00004008, 0x02004000, + 0x00004000, 0x00000008, 0x02000008, 0x02000100, + 0x02000000, 0x00004100, 0x02004108, 0x00000000, + 0x00004108, 0x02000000, 0x00000100, 0x00004008, + 0x02000108, 0x00000100, 0x00000000, 0x02004108, + 0x02004008, 0x02004100, 0x00000108, 0x00004000, + 0x00004100, 0x02004008, 0x02000100, 0x00000108, + 0x00000008, 0x00004108, 0x02004000, 0x02000008, + /* nibble 5 */ + 0x20000010, 0x00080010, 0x00000000, 0x20080800, + 0x00080010, 0x00000800, 0x20000810, 0x00080000, + 0x00000810, 0x20080810, 0x00080800, 0x20000000, + 0x20000800, 0x20000010, 0x20080000, 0x00080810, + 0x00080000, 0x20000810, 0x20080010, 0x00000000, + 0x00000800, 0x00000010, 0x20080800, 0x20080010, + 0x20080810, 0x20080000, 0x20000000, 0x00000810, + 0x00000010, 0x00080800, 0x00080810, 0x20000800, + 0x00000810, 0x20000000, 0x20000800, 0x00080810, + 0x20080800, 0x00080010, 0x00000000, 0x20000800, + 0x20000000, 0x00000800, 0x20080010, 0x00080000, + 0x00080010, 0x20080810, 0x00080800, 0x00000010, + 0x20080810, 0x00080800, 0x00080000, 0x20000810, + 0x20000010, 0x20080000, 0x00080810, 0x00000000, + 0x00000800, 0x20000010, 0x20000810, 0x20080800, + 0x20080000, 0x00000810, 0x00000010, 0x20080010, + /* nibble 6 */ + 0x00001000, 0x00000080, 0x00400080, 0x00400001, + 0x00401081, 0x00001001, 0x00001080, 0x00000000, + 0x00400000, 0x00400081, 0x00000081, 0x00401000, + 0x00000001, 0x00401080, 0x00401000, 0x00000081, + 0x00400081, 0x00001000, 0x00001001, 0x00401081, + 0x00000000, 0x00400080, 0x00400001, 0x00001080, + 0x00401001, 0x00001081, 0x00401080, 0x00000001, + 0x00001081, 0x00401001, 0x00000080, 0x00400000, + 0x00001081, 0x00401000, 0x00401001, 0x00000081, + 0x00001000, 0x00000080, 0x00400000, 0x00401001, + 0x00400081, 0x00001081, 0x00001080, 0x00000000, + 0x00000080, 0x00400001, 0x00000001, 0x00400080, + 0x00000000, 0x00400081, 0x00400080, 0x00001080, + 0x00000081, 0x00001000, 0x00401081, 0x00400000, + 0x00401080, 0x00000001, 0x00001001, 0x00401081, + 0x00400001, 0x00401080, 0x00401000, 0x00001001, + /* nibble 7 */ + 0x08200020, 0x08208000, 0x00008020, 0x00000000, + 0x08008000, 0x00200020, 0x08200000, 0x08208020, + 0x00000020, 0x08000000, 0x00208000, 0x00008020, + 0x00208020, 0x08008020, 0x08000020, 0x08200000, + 0x00008000, 0x00208020, 0x00200020, 0x08008000, + 0x08208020, 0x08000020, 0x00000000, 0x00208000, + 0x08000000, 0x00200000, 0x08008020, 0x08200020, + 0x00200000, 0x00008000, 0x08208000, 0x00000020, + 0x00200000, 0x00008000, 0x08000020, 0x08208020, + 0x00008020, 0x08000000, 0x00000000, 0x00208000, + 0x08200020, 0x08008020, 0x08008000, 0x00200020, + 0x08208000, 0x00000020, 0x00200020, 0x08008000, + 0x08208020, 0x00200000, 0x08200000, 0x08000020, + 0x00208000, 0x00008020, 0x08008020, 0x08200000, + 0x00000020, 0x08208000, 0x00208020, 0x00000000, + 0x08000000, 0x08200020, 0x00008000, 0x00208020 +}; + +__device__ __constant__ u32 c_skb[8][64] = +{ + /* for C bits (numbered as per FIPS 46) 1 2 3 4 5 6 */ + 0x00000000, 0x00000010, 0x20000000, 0x20000010, + 0x00010000, 0x00010010, 0x20010000, 0x20010010, + 0x00000800, 0x00000810, 0x20000800, 0x20000810, + 0x00010800, 0x00010810, 0x20010800, 0x20010810, + 0x00000020, 0x00000030, 0x20000020, 0x20000030, + 0x00010020, 0x00010030, 0x20010020, 0x20010030, + 0x00000820, 0x00000830, 0x20000820, 0x20000830, + 0x00010820, 0x00010830, 0x20010820, 0x20010830, + 0x00080000, 0x00080010, 0x20080000, 0x20080010, + 0x00090000, 0x00090010, 0x20090000, 0x20090010, + 0x00080800, 0x00080810, 0x20080800, 0x20080810, + 0x00090800, 0x00090810, 0x20090800, 0x20090810, + 0x00080020, 0x00080030, 0x20080020, 0x20080030, + 0x00090020, 0x00090030, 0x20090020, 0x20090030, + 0x00080820, 0x00080830, 0x20080820, 0x20080830, + 0x00090820, 0x00090830, 0x20090820, 0x20090830, + /* for C bits (numbered as per FIPS 46) 7 8 10 11 12 13 */ + 0x00000000, 0x02000000, 0x00002000, 0x02002000, + 0x00200000, 0x02200000, 0x00202000, 0x02202000, + 0x00000004, 0x02000004, 0x00002004, 0x02002004, + 0x00200004, 0x02200004, 0x00202004, 0x02202004, + 0x00000400, 0x02000400, 0x00002400, 0x02002400, + 0x00200400, 0x02200400, 0x00202400, 0x02202400, + 0x00000404, 0x02000404, 0x00002404, 0x02002404, + 0x00200404, 0x02200404, 0x00202404, 0x02202404, + 0x10000000, 0x12000000, 0x10002000, 0x12002000, + 0x10200000, 0x12200000, 0x10202000, 0x12202000, + 0x10000004, 0x12000004, 0x10002004, 0x12002004, + 0x10200004, 0x12200004, 0x10202004, 0x12202004, + 0x10000400, 0x12000400, 0x10002400, 0x12002400, + 0x10200400, 0x12200400, 0x10202400, 0x12202400, + 0x10000404, 0x12000404, 0x10002404, 0x12002404, + 0x10200404, 0x12200404, 0x10202404, 0x12202404, + /* for C bits (numbered as per FIPS 46) 14 15 16 17 19 20 */ + 0x00000000, 0x00000001, 0x00040000, 0x00040001, + 0x01000000, 0x01000001, 0x01040000, 0x01040001, + 0x00000002, 0x00000003, 0x00040002, 0x00040003, + 0x01000002, 0x01000003, 0x01040002, 0x01040003, + 0x00000200, 0x00000201, 0x00040200, 0x00040201, + 0x01000200, 0x01000201, 0x01040200, 0x01040201, + 0x00000202, 0x00000203, 0x00040202, 0x00040203, + 0x01000202, 0x01000203, 0x01040202, 0x01040203, + 0x08000000, 0x08000001, 0x08040000, 0x08040001, + 0x09000000, 0x09000001, 0x09040000, 0x09040001, + 0x08000002, 0x08000003, 0x08040002, 0x08040003, + 0x09000002, 0x09000003, 0x09040002, 0x09040003, + 0x08000200, 0x08000201, 0x08040200, 0x08040201, + 0x09000200, 0x09000201, 0x09040200, 0x09040201, + 0x08000202, 0x08000203, 0x08040202, 0x08040203, + 0x09000202, 0x09000203, 0x09040202, 0x09040203, + /* for C bits (numbered as per FIPS 46) 21 23 24 26 27 28 */ + 0x00000000, 0x00100000, 0x00000100, 0x00100100, + 0x00000008, 0x00100008, 0x00000108, 0x00100108, + 0x00001000, 0x00101000, 0x00001100, 0x00101100, + 0x00001008, 0x00101008, 0x00001108, 0x00101108, + 0x04000000, 0x04100000, 0x04000100, 0x04100100, + 0x04000008, 0x04100008, 0x04000108, 0x04100108, + 0x04001000, 0x04101000, 0x04001100, 0x04101100, + 0x04001008, 0x04101008, 0x04001108, 0x04101108, + 0x00020000, 0x00120000, 0x00020100, 0x00120100, + 0x00020008, 0x00120008, 0x00020108, 0x00120108, + 0x00021000, 0x00121000, 0x00021100, 0x00121100, + 0x00021008, 0x00121008, 0x00021108, 0x00121108, + 0x04020000, 0x04120000, 0x04020100, 0x04120100, + 0x04020008, 0x04120008, 0x04020108, 0x04120108, + 0x04021000, 0x04121000, 0x04021100, 0x04121100, + 0x04021008, 0x04121008, 0x04021108, 0x04121108, + /* for D bits (numbered as per FIPS 46) 1 2 3 4 5 6 */ + 0x00000000, 0x10000000, 0x00010000, 0x10010000, + 0x00000004, 0x10000004, 0x00010004, 0x10010004, + 0x20000000, 0x30000000, 0x20010000, 0x30010000, + 0x20000004, 0x30000004, 0x20010004, 0x30010004, + 0x00100000, 0x10100000, 0x00110000, 0x10110000, + 0x00100004, 0x10100004, 0x00110004, 0x10110004, + 0x20100000, 0x30100000, 0x20110000, 0x30110000, + 0x20100004, 0x30100004, 0x20110004, 0x30110004, + 0x00001000, 0x10001000, 0x00011000, 0x10011000, + 0x00001004, 0x10001004, 0x00011004, 0x10011004, + 0x20001000, 0x30001000, 0x20011000, 0x30011000, + 0x20001004, 0x30001004, 0x20011004, 0x30011004, + 0x00101000, 0x10101000, 0x00111000, 0x10111000, + 0x00101004, 0x10101004, 0x00111004, 0x10111004, + 0x20101000, 0x30101000, 0x20111000, 0x30111000, + 0x20101004, 0x30101004, 0x20111004, 0x30111004, + /* for D bits (numbered as per FIPS 46) 8 9 11 12 13 14 */ + 0x00000000, 0x08000000, 0x00000008, 0x08000008, + 0x00000400, 0x08000400, 0x00000408, 0x08000408, + 0x00020000, 0x08020000, 0x00020008, 0x08020008, + 0x00020400, 0x08020400, 0x00020408, 0x08020408, + 0x00000001, 0x08000001, 0x00000009, 0x08000009, + 0x00000401, 0x08000401, 0x00000409, 0x08000409, + 0x00020001, 0x08020001, 0x00020009, 0x08020009, + 0x00020401, 0x08020401, 0x00020409, 0x08020409, + 0x02000000, 0x0A000000, 0x02000008, 0x0A000008, + 0x02000400, 0x0A000400, 0x02000408, 0x0A000408, + 0x02020000, 0x0A020000, 0x02020008, 0x0A020008, + 0x02020400, 0x0A020400, 0x02020408, 0x0A020408, + 0x02000001, 0x0A000001, 0x02000009, 0x0A000009, + 0x02000401, 0x0A000401, 0x02000409, 0x0A000409, + 0x02020001, 0x0A020001, 0x02020009, 0x0A020009, + 0x02020401, 0x0A020401, 0x02020409, 0x0A020409, + /* for D bits (numbered as per FIPS 46) 16 17 18 19 20 21 */ + 0x00000000, 0x00000100, 0x00080000, 0x00080100, + 0x01000000, 0x01000100, 0x01080000, 0x01080100, + 0x00000010, 0x00000110, 0x00080010, 0x00080110, + 0x01000010, 0x01000110, 0x01080010, 0x01080110, + 0x00200000, 0x00200100, 0x00280000, 0x00280100, + 0x01200000, 0x01200100, 0x01280000, 0x01280100, + 0x00200010, 0x00200110, 0x00280010, 0x00280110, + 0x01200010, 0x01200110, 0x01280010, 0x01280110, + 0x00000200, 0x00000300, 0x00080200, 0x00080300, + 0x01000200, 0x01000300, 0x01080200, 0x01080300, + 0x00000210, 0x00000310, 0x00080210, 0x00080310, + 0x01000210, 0x01000310, 0x01080210, 0x01080310, + 0x00200200, 0x00200300, 0x00280200, 0x00280300, + 0x01200200, 0x01200300, 0x01280200, 0x01280300, + 0x00200210, 0x00200310, 0x00280210, 0x00280310, + 0x01200210, 0x01200310, 0x01280210, 0x01280310, + /* for D bits (numbered as per FIPS 46) 22 23 24 25 27 28 */ + 0x00000000, 0x04000000, 0x00040000, 0x04040000, + 0x00000002, 0x04000002, 0x00040002, 0x04040002, + 0x00002000, 0x04002000, 0x00042000, 0x04042000, + 0x00002002, 0x04002002, 0x00042002, 0x04042002, + 0x00000020, 0x04000020, 0x00040020, 0x04040020, + 0x00000022, 0x04000022, 0x00040022, 0x04040022, + 0x00002020, 0x04002020, 0x00042020, 0x04042020, + 0x00002022, 0x04002022, 0x00042022, 0x04042022, + 0x00000800, 0x04000800, 0x00040800, 0x04040800, + 0x00000802, 0x04000802, 0x00040802, 0x04040802, + 0x00002800, 0x04002800, 0x00042800, 0x04042800, + 0x00002802, 0x04002802, 0x00042802, 0x04042802, + 0x00000820, 0x04000820, 0x00040820, 0x04040820, + 0x00000822, 0x04000822, 0x00040822, 0x04040822, + 0x00002820, 0x04002820, 0x00042820, 0x04042820, + 0x00002822, 0x04002822, 0x00042822, 0x04042822 +}; + +#ifdef VECT_SIZE1 +#define BOX(i,n,S) (u32x) ((S)[(n)][(i)]) +#endif + +#ifdef VECT_SIZE2 +#define BOX(i,n,S) (u32x) ((S)[(n)][(i).s0], (S)[(n)][(i).s1]) +#endif + +#ifdef VECT_SIZE4 +#define BOX(i,n,S) (u32x) ((S)[(n)][(i).s0], (S)[(n)][(i).s1], (S)[(n)][(i).s2], (S)[(n)][(i).s3]) +#endif + +__device__ static void _des_crypt_keysetup (u32x c, u32x d, u32x Kc[16], u32x Kd[16], u32 s_skb[8][64]) +{ + u32x tt; + + PERM_OP (d, c, tt, 4, 0x0f0f0f0f); + HPERM_OP (c, tt, 2, 0xcccc0000); + HPERM_OP (d, tt, 2, 0xcccc0000); + PERM_OP (d, c, tt, 1, 0x55555555); + PERM_OP (c, d, tt, 8, 0x00ff00ff); + PERM_OP (d, c, tt, 1, 0x55555555); + + d = ((d & 0x000000ff) << 16) + | ((d & 0x0000ff00) << 0) + | ((d & 0x00ff0000) >> 16) + | ((c & 0xf0000000) >> 4); + + c = c & 0x0fffffff; + + #pragma unroll + for (u32 i = 0; i < 16; i++) + { + const u32 shifts3s0[16] = { 1, 1, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 1 }; + const u32 shifts3s1[16] = { 27, 27, 26, 26, 26, 26, 26, 26, 27, 26, 26, 26, 26, 26, 26, 27 }; + + c = c >> shifts3s0[i] | c << shifts3s1[i]; + d = d >> shifts3s0[i] | d << shifts3s1[i]; + + c = c & 0x0fffffff; + d = d & 0x0fffffff; + + const u32x c00 = (c >> 0) & 0x0000003f; + const u32x c06 = (c >> 6) & 0x00383003; + const u32x c07 = (c >> 7) & 0x0000003c; + const u32x c13 = (c >> 13) & 0x0000060f; + const u32x c20 = (c >> 20) & 0x00000001; + + u32x s = BOX (((c00 >> 0) & 0xff), 0, s_skb) + | BOX (((c06 >> 0) & 0xff) + |((c07 >> 0) & 0xff), 1, s_skb) + | BOX (((c13 >> 0) & 0xff) + |((c06 >> 8) & 0xff), 2, s_skb) + | BOX (((c20 >> 0) & 0xff) + |((c13 >> 8) & 0xff) + |((c06 >> 16) & 0xff), 3, s_skb); + + const u32x d00 = (d >> 0) & 0x00003c3f; + const u32x d07 = (d >> 7) & 0x00003f03; + const u32x d21 = (d >> 21) & 0x0000000f; + const u32x d22 = (d >> 22) & 0x00000030; + + u32x t = BOX (((d00 >> 0) & 0xff), 4, s_skb) + | BOX (((d07 >> 0) & 0xff) + |((d00 >> 8) & 0xff), 5, s_skb) + | BOX (((d07 >> 8) & 0xff), 6, s_skb) + | BOX (((d21 >> 0) & 0xff) + |((d22 >> 0) & 0xff), 7, s_skb); + + Kc[i] = ((t << 16) | (s & 0x0000ffff)); + Kd[i] = ((s >> 16) | (t & 0xffff0000)); + } +} + +__device__ static void _des_crypt_encrypt (u32x iv[2], u32 mask, u32 rounds, u32x Kc[16], u32x Kd[16], u32 s_SPtrans[8][64]) +{ + u32x tt; + + const u32 E0 = ((mask >> 0) & 0x003f) + | ((mask >> 4) & 0x3f00); + const u32 E1 = ((mask >> 2) & 0x03f0) + | ((mask >> 6) & 0xf000) + | ((mask >> 22) & 0x0003); + + u32x r = iv[0]; + u32x l = iv[1]; + + for (u32 i = 0; i < rounds; i++) + { + #pragma unroll + for (u32 j = 0; j < 16; j++) + { + /* sbox */ + u32x t = r ^ (r >> 16); + + u32x u = t; + + // u + u = u & E0; + + tt = (u << 16); + + u = u ^ r; + u = u ^ tt; + u = u ^ Kc[j]; + + // t + + t = t & E1; + + tt = (t << 16); + + t = t ^ r; + t = t ^ tt; + t = rotl32 (t, 28u); + t = t ^ Kd[j]; + + const u32x um = u & 0x3f3f3f3f; + const u32x tm = t & 0x3f3f3f3f; + + l ^= BOX (((um >> 0) & 0xff), 0, s_SPtrans) + | BOX (((um >> 8) & 0xff), 2, s_SPtrans) + | BOX (((um >> 16) & 0xff), 4, s_SPtrans) + | BOX (((um >> 24) & 0xff), 6, s_SPtrans) + | BOX (((tm >> 0) & 0xff), 1, s_SPtrans) + | BOX (((tm >> 8) & 0xff), 3, s_SPtrans) + | BOX (((tm >> 16) & 0xff), 5, s_SPtrans) + | BOX (((tm >> 24) & 0xff), 7, s_SPtrans); + + tt = l; + l = r; + r = tt; + } + + tt = l; + l = r; + r = tt; + } + + iv[0] = r; + iv[1] = l; +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m12400_init (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, bsdicrypt_tmp_t *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + const u32 lid = threadIdx.x; + + /** + * sbox + */ + + __shared__ u32 s_skb[8][64]; + __shared__ u32 s_SPtrans[8][64]; + + if (lid < 64) + { + s_skb[0][lid] = c_skb[0][lid]; + s_skb[1][lid] = c_skb[1][lid]; + s_skb[2][lid] = c_skb[2][lid]; + s_skb[3][lid] = c_skb[3][lid]; + s_skb[4][lid] = c_skb[4][lid]; + s_skb[5][lid] = c_skb[5][lid]; + s_skb[6][lid] = c_skb[6][lid]; + s_skb[7][lid] = c_skb[7][lid]; + + s_SPtrans[0][lid] = c_SPtrans[0][lid]; + s_SPtrans[1][lid] = c_SPtrans[1][lid]; + s_SPtrans[2][lid] = c_SPtrans[2][lid]; + s_SPtrans[3][lid] = c_SPtrans[3][lid]; + s_SPtrans[4][lid] = c_SPtrans[4][lid]; + s_SPtrans[5][lid] = c_SPtrans[5][lid]; + s_SPtrans[6][lid] = c_SPtrans[6][lid]; + s_SPtrans[7][lid] = c_SPtrans[7][lid]; + } + + __syncthreads (); + + if (gid >= gid_max) return; + + /** + * word + */ + + u32x w[16]; + + w[ 0] = pws[gid].i[ 0]; + w[ 1] = pws[gid].i[ 1]; + w[ 2] = pws[gid].i[ 2]; + w[ 3] = pws[gid].i[ 3]; + w[ 4] = pws[gid].i[ 4]; + w[ 5] = pws[gid].i[ 5]; + w[ 6] = pws[gid].i[ 6]; + w[ 7] = pws[gid].i[ 7]; + w[ 8] = pws[gid].i[ 8]; + w[ 9] = pws[gid].i[ 9]; + w[10] = pws[gid].i[10]; + w[11] = pws[gid].i[11]; + w[12] = pws[gid].i[12]; + w[13] = pws[gid].i[13]; + w[14] = pws[gid].i[14]; + w[15] = pws[gid].i[15]; + + u32 pw_len = pws[gid].pw_len; + + u32 tt; + + u32 Kc[16]; + u32 Kd[16]; + + + u32 out[2]; + + out[0] = (w[0] << 1) & 0xfefefefe; + out[1] = (w[1] << 1) & 0xfefefefe; + + for (u32 i = 8, j = 2; i < pw_len; i += 8, j += 2) + { + _des_crypt_keysetup (out[0], out[1], Kc, Kd, s_skb); + + IP (out[0], out[1], tt); + + out[0] = rotr32 (out[0], 31); + out[1] = rotr32 (out[1], 31); + + _des_crypt_encrypt (out, 0, 1, Kc, Kd, s_SPtrans); + + out[0] = rotl32 (out[0], 31); + out[1] = rotl32 (out[1], 31); + + FP (out[1], out[0], tt); + + const u32 R = (w[j + 0] << 1) & 0xfefefefe; + const u32 L = (w[j + 1] << 1) & 0xfefefefe; + + out[0] ^= R; + out[1] ^= L; + } + + /* + out[0] = (out[0] & 0xfefefefe) >> 1; + out[1] = (out[1] & 0xfefefefe) >> 1; + + out[0] = (out[0] << 1) & 0xfefefefe; + out[1] = (out[1] << 1) & 0xfefefefe; + */ + + _des_crypt_keysetup (out[0], out[1], Kc, Kd, s_skb); + + tmps[gid].Kc[ 0] = Kc[ 0]; + tmps[gid].Kc[ 1] = Kc[ 1]; + tmps[gid].Kc[ 2] = Kc[ 2]; + tmps[gid].Kc[ 3] = Kc[ 3]; + tmps[gid].Kc[ 4] = Kc[ 4]; + tmps[gid].Kc[ 5] = Kc[ 5]; + tmps[gid].Kc[ 6] = Kc[ 6]; + tmps[gid].Kc[ 7] = Kc[ 7]; + tmps[gid].Kc[ 8] = Kc[ 8]; + tmps[gid].Kc[ 9] = Kc[ 9]; + tmps[gid].Kc[10] = Kc[10]; + tmps[gid].Kc[11] = Kc[11]; + tmps[gid].Kc[12] = Kc[12]; + tmps[gid].Kc[13] = Kc[13]; + tmps[gid].Kc[14] = Kc[14]; + tmps[gid].Kc[15] = Kc[15]; + + tmps[gid].Kd[ 0] = Kd[ 0]; + tmps[gid].Kd[ 1] = Kd[ 1]; + tmps[gid].Kd[ 2] = Kd[ 2]; + tmps[gid].Kd[ 3] = Kd[ 3]; + tmps[gid].Kd[ 4] = Kd[ 4]; + tmps[gid].Kd[ 5] = Kd[ 5]; + tmps[gid].Kd[ 6] = Kd[ 6]; + tmps[gid].Kd[ 7] = Kd[ 7]; + tmps[gid].Kd[ 8] = Kd[ 8]; + tmps[gid].Kd[ 9] = Kd[ 9]; + tmps[gid].Kd[10] = Kd[10]; + tmps[gid].Kd[11] = Kd[11]; + tmps[gid].Kd[12] = Kd[12]; + tmps[gid].Kd[13] = Kd[13]; + tmps[gid].Kd[14] = Kd[14]; + tmps[gid].Kd[15] = Kd[15]; + + tmps[gid].iv[0] = 0; + tmps[gid].iv[1] = 0; +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m12400_loop (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, bsdicrypt_tmp_t *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + const u32 lid = threadIdx.x; + + /** + * sbox + */ + + __shared__ u32 s_SPtrans[8][64]; + + if (lid < 64) + { + s_SPtrans[0][lid] = c_SPtrans[0][lid]; + s_SPtrans[1][lid] = c_SPtrans[1][lid]; + s_SPtrans[2][lid] = c_SPtrans[2][lid]; + s_SPtrans[3][lid] = c_SPtrans[3][lid]; + s_SPtrans[4][lid] = c_SPtrans[4][lid]; + s_SPtrans[5][lid] = c_SPtrans[5][lid]; + s_SPtrans[6][lid] = c_SPtrans[6][lid]; + s_SPtrans[7][lid] = c_SPtrans[7][lid]; + } + + __syncthreads (); + + if (gid >= gid_max) return; + + u32 Kc[16]; + + Kc[ 0] = tmps[gid].Kc[ 0]; + Kc[ 1] = tmps[gid].Kc[ 1]; + Kc[ 2] = tmps[gid].Kc[ 2]; + Kc[ 3] = tmps[gid].Kc[ 3]; + Kc[ 4] = tmps[gid].Kc[ 4]; + Kc[ 5] = tmps[gid].Kc[ 5]; + Kc[ 6] = tmps[gid].Kc[ 6]; + Kc[ 7] = tmps[gid].Kc[ 7]; + Kc[ 8] = tmps[gid].Kc[ 8]; + Kc[ 9] = tmps[gid].Kc[ 9]; + Kc[10] = tmps[gid].Kc[10]; + Kc[11] = tmps[gid].Kc[11]; + Kc[12] = tmps[gid].Kc[12]; + Kc[13] = tmps[gid].Kc[13]; + Kc[14] = tmps[gid].Kc[14]; + Kc[15] = tmps[gid].Kc[15]; + + u32 Kd[16]; + + Kd[ 0] = tmps[gid].Kd[ 0]; + Kd[ 1] = tmps[gid].Kd[ 1]; + Kd[ 2] = tmps[gid].Kd[ 2]; + Kd[ 3] = tmps[gid].Kd[ 3]; + Kd[ 4] = tmps[gid].Kd[ 4]; + Kd[ 5] = tmps[gid].Kd[ 5]; + Kd[ 6] = tmps[gid].Kd[ 6]; + Kd[ 7] = tmps[gid].Kd[ 7]; + Kd[ 8] = tmps[gid].Kd[ 8]; + Kd[ 9] = tmps[gid].Kd[ 9]; + Kd[10] = tmps[gid].Kd[10]; + Kd[11] = tmps[gid].Kd[11]; + Kd[12] = tmps[gid].Kd[12]; + Kd[13] = tmps[gid].Kd[13]; + Kd[14] = tmps[gid].Kd[14]; + Kd[15] = tmps[gid].Kd[15]; + + u32 iv[2]; + + iv[0] = tmps[gid].iv[0]; + iv[1] = tmps[gid].iv[1]; + + const u32 mask = salt_bufs[salt_pos].salt_buf[0]; + + _des_crypt_encrypt (iv, mask, loop_cnt, Kc, Kd, s_SPtrans); + + tmps[gid].Kc[ 0] = Kc[ 0]; + tmps[gid].Kc[ 1] = Kc[ 1]; + tmps[gid].Kc[ 2] = Kc[ 2]; + tmps[gid].Kc[ 3] = Kc[ 3]; + tmps[gid].Kc[ 4] = Kc[ 4]; + tmps[gid].Kc[ 5] = Kc[ 5]; + tmps[gid].Kc[ 6] = Kc[ 6]; + tmps[gid].Kc[ 7] = Kc[ 7]; + tmps[gid].Kc[ 8] = Kc[ 8]; + tmps[gid].Kc[ 9] = Kc[ 9]; + tmps[gid].Kc[10] = Kc[10]; + tmps[gid].Kc[11] = Kc[11]; + tmps[gid].Kc[12] = Kc[12]; + tmps[gid].Kc[13] = Kc[13]; + tmps[gid].Kc[14] = Kc[14]; + tmps[gid].Kc[15] = Kc[15]; + + tmps[gid].Kd[ 0] = Kd[ 0]; + tmps[gid].Kd[ 1] = Kd[ 1]; + tmps[gid].Kd[ 2] = Kd[ 2]; + tmps[gid].Kd[ 3] = Kd[ 3]; + tmps[gid].Kd[ 4] = Kd[ 4]; + tmps[gid].Kd[ 5] = Kd[ 5]; + tmps[gid].Kd[ 6] = Kd[ 6]; + tmps[gid].Kd[ 7] = Kd[ 7]; + tmps[gid].Kd[ 8] = Kd[ 8]; + tmps[gid].Kd[ 9] = Kd[ 9]; + tmps[gid].Kd[10] = Kd[10]; + tmps[gid].Kd[11] = Kd[11]; + tmps[gid].Kd[12] = Kd[12]; + tmps[gid].Kd[13] = Kd[13]; + tmps[gid].Kd[14] = Kd[14]; + tmps[gid].Kd[15] = Kd[15]; + + tmps[gid].iv[0] = iv[0]; + tmps[gid].iv[1] = iv[1]; +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m12400_comp (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, bsdicrypt_tmp_t *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + const u32 lid = threadIdx.x; + + const u32x r0 = tmps[gid].iv[0]; + const u32x r1 = tmps[gid].iv[1]; + const u32x r2 = 0; + const u32x r3 = 0; + + #define il_pos 0 + + #include VECT_COMPARE_M +} diff --git a/nv/m12500.cu b/nv/m12500.cu new file mode 100644 index 0000000000..5804475477 --- /dev/null +++ b/nv/m12500.cu @@ -0,0 +1,1307 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _RAR3_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW2 +#define VECT_SIZE1 +#endif + +#define DGST_R0 0 +#define DGST_R1 1 +#define DGST_R2 2 +#define DGST_R3 3 + +#include "include/kernel_functions.c" + +#include "types_nv.c" +#include "common_nv.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#define ROUNDS 0x40000 + +#define PUTCHAR(a,p,c) ((u8 *)(a))[(p)] = (u8) (c) +#define GETCHAR(a,p) ((u8 *)(a))[(p)] + +#define PUTCHAR_BE(a,p,c) ((u8 *)(a))[(p) ^ 3] = (u8) (c) +#define GETCHAR_BE(a,p) ((u8 *)(a))[(p) ^ 3] + +__device__ __constant__ u32 te0[256] = +{ + 0xc66363a5, 0xf87c7c84, 0xee777799, 0xf67b7b8d, + 0xfff2f20d, 0xd66b6bbd, 0xde6f6fb1, 0x91c5c554, + 0x60303050, 0x02010103, 0xce6767a9, 0x562b2b7d, + 0xe7fefe19, 0xb5d7d762, 0x4dababe6, 0xec76769a, + 0x8fcaca45, 0x1f82829d, 0x89c9c940, 0xfa7d7d87, + 0xeffafa15, 0xb25959eb, 0x8e4747c9, 0xfbf0f00b, + 0x41adadec, 0xb3d4d467, 0x5fa2a2fd, 0x45afafea, + 0x239c9cbf, 0x53a4a4f7, 0xe4727296, 0x9bc0c05b, + 0x75b7b7c2, 0xe1fdfd1c, 0x3d9393ae, 0x4c26266a, + 0x6c36365a, 0x7e3f3f41, 0xf5f7f702, 0x83cccc4f, + 0x6834345c, 0x51a5a5f4, 0xd1e5e534, 0xf9f1f108, + 0xe2717193, 0xabd8d873, 0x62313153, 0x2a15153f, + 0x0804040c, 0x95c7c752, 0x46232365, 0x9dc3c35e, + 0x30181828, 0x379696a1, 0x0a05050f, 0x2f9a9ab5, + 0x0e070709, 0x24121236, 0x1b80809b, 0xdfe2e23d, + 0xcdebeb26, 0x4e272769, 0x7fb2b2cd, 0xea75759f, + 0x1209091b, 0x1d83839e, 0x582c2c74, 0x341a1a2e, + 0x361b1b2d, 0xdc6e6eb2, 0xb45a5aee, 0x5ba0a0fb, + 0xa45252f6, 0x763b3b4d, 0xb7d6d661, 0x7db3b3ce, + 0x5229297b, 0xdde3e33e, 0x5e2f2f71, 0x13848497, + 0xa65353f5, 0xb9d1d168, 0x00000000, 0xc1eded2c, + 0x40202060, 0xe3fcfc1f, 0x79b1b1c8, 0xb65b5bed, + 0xd46a6abe, 0x8dcbcb46, 0x67bebed9, 0x7239394b, + 0x944a4ade, 0x984c4cd4, 0xb05858e8, 0x85cfcf4a, + 0xbbd0d06b, 0xc5efef2a, 0x4faaaae5, 0xedfbfb16, + 0x864343c5, 0x9a4d4dd7, 0x66333355, 0x11858594, + 0x8a4545cf, 0xe9f9f910, 0x04020206, 0xfe7f7f81, + 0xa05050f0, 0x783c3c44, 0x259f9fba, 0x4ba8a8e3, + 0xa25151f3, 0x5da3a3fe, 0x804040c0, 0x058f8f8a, + 0x3f9292ad, 0x219d9dbc, 0x70383848, 0xf1f5f504, + 0x63bcbcdf, 0x77b6b6c1, 0xafdada75, 0x42212163, + 0x20101030, 0xe5ffff1a, 0xfdf3f30e, 0xbfd2d26d, + 0x81cdcd4c, 0x180c0c14, 0x26131335, 0xc3ecec2f, + 0xbe5f5fe1, 0x359797a2, 0x884444cc, 0x2e171739, + 0x93c4c457, 0x55a7a7f2, 0xfc7e7e82, 0x7a3d3d47, + 0xc86464ac, 0xba5d5de7, 0x3219192b, 0xe6737395, + 0xc06060a0, 0x19818198, 0x9e4f4fd1, 0xa3dcdc7f, + 0x44222266, 0x542a2a7e, 0x3b9090ab, 0x0b888883, + 0x8c4646ca, 0xc7eeee29, 0x6bb8b8d3, 0x2814143c, + 0xa7dede79, 0xbc5e5ee2, 0x160b0b1d, 0xaddbdb76, + 0xdbe0e03b, 0x64323256, 0x743a3a4e, 0x140a0a1e, + 0x924949db, 0x0c06060a, 0x4824246c, 0xb85c5ce4, + 0x9fc2c25d, 0xbdd3d36e, 0x43acacef, 0xc46262a6, + 0x399191a8, 0x319595a4, 0xd3e4e437, 0xf279798b, + 0xd5e7e732, 0x8bc8c843, 0x6e373759, 0xda6d6db7, + 0x018d8d8c, 0xb1d5d564, 0x9c4e4ed2, 0x49a9a9e0, + 0xd86c6cb4, 0xac5656fa, 0xf3f4f407, 0xcfeaea25, + 0xca6565af, 0xf47a7a8e, 0x47aeaee9, 0x10080818, + 0x6fbabad5, 0xf0787888, 0x4a25256f, 0x5c2e2e72, + 0x381c1c24, 0x57a6a6f1, 0x73b4b4c7, 0x97c6c651, + 0xcbe8e823, 0xa1dddd7c, 0xe874749c, 0x3e1f1f21, + 0x964b4bdd, 0x61bdbddc, 0x0d8b8b86, 0x0f8a8a85, + 0xe0707090, 0x7c3e3e42, 0x71b5b5c4, 0xcc6666aa, + 0x904848d8, 0x06030305, 0xf7f6f601, 0x1c0e0e12, + 0xc26161a3, 0x6a35355f, 0xae5757f9, 0x69b9b9d0, + 0x17868691, 0x99c1c158, 0x3a1d1d27, 0x279e9eb9, + 0xd9e1e138, 0xebf8f813, 0x2b9898b3, 0x22111133, + 0xd26969bb, 0xa9d9d970, 0x078e8e89, 0x339494a7, + 0x2d9b9bb6, 0x3c1e1e22, 0x15878792, 0xc9e9e920, + 0x87cece49, 0xaa5555ff, 0x50282878, 0xa5dfdf7a, + 0x038c8c8f, 0x59a1a1f8, 0x09898980, 0x1a0d0d17, + 0x65bfbfda, 0xd7e6e631, 0x844242c6, 0xd06868b8, + 0x824141c3, 0x299999b0, 0x5a2d2d77, 0x1e0f0f11, + 0x7bb0b0cb, 0xa85454fc, 0x6dbbbbd6, 0x2c16163a, +}; + +__device__ __constant__ u32 te1[256] = +{ + 0xa5c66363, 0x84f87c7c, 0x99ee7777, 0x8df67b7b, + 0x0dfff2f2, 0xbdd66b6b, 0xb1de6f6f, 0x5491c5c5, + 0x50603030, 0x03020101, 0xa9ce6767, 0x7d562b2b, + 0x19e7fefe, 0x62b5d7d7, 0xe64dabab, 0x9aec7676, + 0x458fcaca, 0x9d1f8282, 0x4089c9c9, 0x87fa7d7d, + 0x15effafa, 0xebb25959, 0xc98e4747, 0x0bfbf0f0, + 0xec41adad, 0x67b3d4d4, 0xfd5fa2a2, 0xea45afaf, + 0xbf239c9c, 0xf753a4a4, 0x96e47272, 0x5b9bc0c0, + 0xc275b7b7, 0x1ce1fdfd, 0xae3d9393, 0x6a4c2626, + 0x5a6c3636, 0x417e3f3f, 0x02f5f7f7, 0x4f83cccc, + 0x5c683434, 0xf451a5a5, 0x34d1e5e5, 0x08f9f1f1, + 0x93e27171, 0x73abd8d8, 0x53623131, 0x3f2a1515, + 0x0c080404, 0x5295c7c7, 0x65462323, 0x5e9dc3c3, + 0x28301818, 0xa1379696, 0x0f0a0505, 0xb52f9a9a, + 0x090e0707, 0x36241212, 0x9b1b8080, 0x3ddfe2e2, + 0x26cdebeb, 0x694e2727, 0xcd7fb2b2, 0x9fea7575, + 0x1b120909, 0x9e1d8383, 0x74582c2c, 0x2e341a1a, + 0x2d361b1b, 0xb2dc6e6e, 0xeeb45a5a, 0xfb5ba0a0, + 0xf6a45252, 0x4d763b3b, 0x61b7d6d6, 0xce7db3b3, + 0x7b522929, 0x3edde3e3, 0x715e2f2f, 0x97138484, + 0xf5a65353, 0x68b9d1d1, 0x00000000, 0x2cc1eded, + 0x60402020, 0x1fe3fcfc, 0xc879b1b1, 0xedb65b5b, + 0xbed46a6a, 0x468dcbcb, 0xd967bebe, 0x4b723939, + 0xde944a4a, 0xd4984c4c, 0xe8b05858, 0x4a85cfcf, + 0x6bbbd0d0, 0x2ac5efef, 0xe54faaaa, 0x16edfbfb, + 0xc5864343, 0xd79a4d4d, 0x55663333, 0x94118585, + 0xcf8a4545, 0x10e9f9f9, 0x06040202, 0x81fe7f7f, + 0xf0a05050, 0x44783c3c, 0xba259f9f, 0xe34ba8a8, + 0xf3a25151, 0xfe5da3a3, 0xc0804040, 0x8a058f8f, + 0xad3f9292, 0xbc219d9d, 0x48703838, 0x04f1f5f5, + 0xdf63bcbc, 0xc177b6b6, 0x75afdada, 0x63422121, + 0x30201010, 0x1ae5ffff, 0x0efdf3f3, 0x6dbfd2d2, + 0x4c81cdcd, 0x14180c0c, 0x35261313, 0x2fc3ecec, + 0xe1be5f5f, 0xa2359797, 0xcc884444, 0x392e1717, + 0x5793c4c4, 0xf255a7a7, 0x82fc7e7e, 0x477a3d3d, + 0xacc86464, 0xe7ba5d5d, 0x2b321919, 0x95e67373, + 0xa0c06060, 0x98198181, 0xd19e4f4f, 0x7fa3dcdc, + 0x66442222, 0x7e542a2a, 0xab3b9090, 0x830b8888, + 0xca8c4646, 0x29c7eeee, 0xd36bb8b8, 0x3c281414, + 0x79a7dede, 0xe2bc5e5e, 0x1d160b0b, 0x76addbdb, + 0x3bdbe0e0, 0x56643232, 0x4e743a3a, 0x1e140a0a, + 0xdb924949, 0x0a0c0606, 0x6c482424, 0xe4b85c5c, + 0x5d9fc2c2, 0x6ebdd3d3, 0xef43acac, 0xa6c46262, + 0xa8399191, 0xa4319595, 0x37d3e4e4, 0x8bf27979, + 0x32d5e7e7, 0x438bc8c8, 0x596e3737, 0xb7da6d6d, + 0x8c018d8d, 0x64b1d5d5, 0xd29c4e4e, 0xe049a9a9, + 0xb4d86c6c, 0xfaac5656, 0x07f3f4f4, 0x25cfeaea, + 0xafca6565, 0x8ef47a7a, 0xe947aeae, 0x18100808, + 0xd56fbaba, 0x88f07878, 0x6f4a2525, 0x725c2e2e, + 0x24381c1c, 0xf157a6a6, 0xc773b4b4, 0x5197c6c6, + 0x23cbe8e8, 0x7ca1dddd, 0x9ce87474, 0x213e1f1f, + 0xdd964b4b, 0xdc61bdbd, 0x860d8b8b, 0x850f8a8a, + 0x90e07070, 0x427c3e3e, 0xc471b5b5, 0xaacc6666, + 0xd8904848, 0x05060303, 0x01f7f6f6, 0x121c0e0e, + 0xa3c26161, 0x5f6a3535, 0xf9ae5757, 0xd069b9b9, + 0x91178686, 0x5899c1c1, 0x273a1d1d, 0xb9279e9e, + 0x38d9e1e1, 0x13ebf8f8, 0xb32b9898, 0x33221111, + 0xbbd26969, 0x70a9d9d9, 0x89078e8e, 0xa7339494, + 0xb62d9b9b, 0x223c1e1e, 0x92158787, 0x20c9e9e9, + 0x4987cece, 0xffaa5555, 0x78502828, 0x7aa5dfdf, + 0x8f038c8c, 0xf859a1a1, 0x80098989, 0x171a0d0d, + 0xda65bfbf, 0x31d7e6e6, 0xc6844242, 0xb8d06868, + 0xc3824141, 0xb0299999, 0x775a2d2d, 0x111e0f0f, + 0xcb7bb0b0, 0xfca85454, 0xd66dbbbb, 0x3a2c1616, +}; + +__device__ __constant__ u32 te2[256] = +{ + 0x63a5c663, 0x7c84f87c, 0x7799ee77, 0x7b8df67b, + 0xf20dfff2, 0x6bbdd66b, 0x6fb1de6f, 0xc55491c5, + 0x30506030, 0x01030201, 0x67a9ce67, 0x2b7d562b, + 0xfe19e7fe, 0xd762b5d7, 0xabe64dab, 0x769aec76, + 0xca458fca, 0x829d1f82, 0xc94089c9, 0x7d87fa7d, + 0xfa15effa, 0x59ebb259, 0x47c98e47, 0xf00bfbf0, + 0xadec41ad, 0xd467b3d4, 0xa2fd5fa2, 0xafea45af, + 0x9cbf239c, 0xa4f753a4, 0x7296e472, 0xc05b9bc0, + 0xb7c275b7, 0xfd1ce1fd, 0x93ae3d93, 0x266a4c26, + 0x365a6c36, 0x3f417e3f, 0xf702f5f7, 0xcc4f83cc, + 0x345c6834, 0xa5f451a5, 0xe534d1e5, 0xf108f9f1, + 0x7193e271, 0xd873abd8, 0x31536231, 0x153f2a15, + 0x040c0804, 0xc75295c7, 0x23654623, 0xc35e9dc3, + 0x18283018, 0x96a13796, 0x050f0a05, 0x9ab52f9a, + 0x07090e07, 0x12362412, 0x809b1b80, 0xe23ddfe2, + 0xeb26cdeb, 0x27694e27, 0xb2cd7fb2, 0x759fea75, + 0x091b1209, 0x839e1d83, 0x2c74582c, 0x1a2e341a, + 0x1b2d361b, 0x6eb2dc6e, 0x5aeeb45a, 0xa0fb5ba0, + 0x52f6a452, 0x3b4d763b, 0xd661b7d6, 0xb3ce7db3, + 0x297b5229, 0xe33edde3, 0x2f715e2f, 0x84971384, + 0x53f5a653, 0xd168b9d1, 0x00000000, 0xed2cc1ed, + 0x20604020, 0xfc1fe3fc, 0xb1c879b1, 0x5bedb65b, + 0x6abed46a, 0xcb468dcb, 0xbed967be, 0x394b7239, + 0x4ade944a, 0x4cd4984c, 0x58e8b058, 0xcf4a85cf, + 0xd06bbbd0, 0xef2ac5ef, 0xaae54faa, 0xfb16edfb, + 0x43c58643, 0x4dd79a4d, 0x33556633, 0x85941185, + 0x45cf8a45, 0xf910e9f9, 0x02060402, 0x7f81fe7f, + 0x50f0a050, 0x3c44783c, 0x9fba259f, 0xa8e34ba8, + 0x51f3a251, 0xa3fe5da3, 0x40c08040, 0x8f8a058f, + 0x92ad3f92, 0x9dbc219d, 0x38487038, 0xf504f1f5, + 0xbcdf63bc, 0xb6c177b6, 0xda75afda, 0x21634221, + 0x10302010, 0xff1ae5ff, 0xf30efdf3, 0xd26dbfd2, + 0xcd4c81cd, 0x0c14180c, 0x13352613, 0xec2fc3ec, + 0x5fe1be5f, 0x97a23597, 0x44cc8844, 0x17392e17, + 0xc45793c4, 0xa7f255a7, 0x7e82fc7e, 0x3d477a3d, + 0x64acc864, 0x5de7ba5d, 0x192b3219, 0x7395e673, + 0x60a0c060, 0x81981981, 0x4fd19e4f, 0xdc7fa3dc, + 0x22664422, 0x2a7e542a, 0x90ab3b90, 0x88830b88, + 0x46ca8c46, 0xee29c7ee, 0xb8d36bb8, 0x143c2814, + 0xde79a7de, 0x5ee2bc5e, 0x0b1d160b, 0xdb76addb, + 0xe03bdbe0, 0x32566432, 0x3a4e743a, 0x0a1e140a, + 0x49db9249, 0x060a0c06, 0x246c4824, 0x5ce4b85c, + 0xc25d9fc2, 0xd36ebdd3, 0xacef43ac, 0x62a6c462, + 0x91a83991, 0x95a43195, 0xe437d3e4, 0x798bf279, + 0xe732d5e7, 0xc8438bc8, 0x37596e37, 0x6db7da6d, + 0x8d8c018d, 0xd564b1d5, 0x4ed29c4e, 0xa9e049a9, + 0x6cb4d86c, 0x56faac56, 0xf407f3f4, 0xea25cfea, + 0x65afca65, 0x7a8ef47a, 0xaee947ae, 0x08181008, + 0xbad56fba, 0x7888f078, 0x256f4a25, 0x2e725c2e, + 0x1c24381c, 0xa6f157a6, 0xb4c773b4, 0xc65197c6, + 0xe823cbe8, 0xdd7ca1dd, 0x749ce874, 0x1f213e1f, + 0x4bdd964b, 0xbddc61bd, 0x8b860d8b, 0x8a850f8a, + 0x7090e070, 0x3e427c3e, 0xb5c471b5, 0x66aacc66, + 0x48d89048, 0x03050603, 0xf601f7f6, 0x0e121c0e, + 0x61a3c261, 0x355f6a35, 0x57f9ae57, 0xb9d069b9, + 0x86911786, 0xc15899c1, 0x1d273a1d, 0x9eb9279e, + 0xe138d9e1, 0xf813ebf8, 0x98b32b98, 0x11332211, + 0x69bbd269, 0xd970a9d9, 0x8e89078e, 0x94a73394, + 0x9bb62d9b, 0x1e223c1e, 0x87921587, 0xe920c9e9, + 0xce4987ce, 0x55ffaa55, 0x28785028, 0xdf7aa5df, + 0x8c8f038c, 0xa1f859a1, 0x89800989, 0x0d171a0d, + 0xbfda65bf, 0xe631d7e6, 0x42c68442, 0x68b8d068, + 0x41c38241, 0x99b02999, 0x2d775a2d, 0x0f111e0f, + 0xb0cb7bb0, 0x54fca854, 0xbbd66dbb, 0x163a2c16, +}; + +__device__ __constant__ u32 te3[256] = +{ + 0x6363a5c6, 0x7c7c84f8, 0x777799ee, 0x7b7b8df6, + 0xf2f20dff, 0x6b6bbdd6, 0x6f6fb1de, 0xc5c55491, + 0x30305060, 0x01010302, 0x6767a9ce, 0x2b2b7d56, + 0xfefe19e7, 0xd7d762b5, 0xababe64d, 0x76769aec, + 0xcaca458f, 0x82829d1f, 0xc9c94089, 0x7d7d87fa, + 0xfafa15ef, 0x5959ebb2, 0x4747c98e, 0xf0f00bfb, + 0xadadec41, 0xd4d467b3, 0xa2a2fd5f, 0xafafea45, + 0x9c9cbf23, 0xa4a4f753, 0x727296e4, 0xc0c05b9b, + 0xb7b7c275, 0xfdfd1ce1, 0x9393ae3d, 0x26266a4c, + 0x36365a6c, 0x3f3f417e, 0xf7f702f5, 0xcccc4f83, + 0x34345c68, 0xa5a5f451, 0xe5e534d1, 0xf1f108f9, + 0x717193e2, 0xd8d873ab, 0x31315362, 0x15153f2a, + 0x04040c08, 0xc7c75295, 0x23236546, 0xc3c35e9d, + 0x18182830, 0x9696a137, 0x05050f0a, 0x9a9ab52f, + 0x0707090e, 0x12123624, 0x80809b1b, 0xe2e23ddf, + 0xebeb26cd, 0x2727694e, 0xb2b2cd7f, 0x75759fea, + 0x09091b12, 0x83839e1d, 0x2c2c7458, 0x1a1a2e34, + 0x1b1b2d36, 0x6e6eb2dc, 0x5a5aeeb4, 0xa0a0fb5b, + 0x5252f6a4, 0x3b3b4d76, 0xd6d661b7, 0xb3b3ce7d, + 0x29297b52, 0xe3e33edd, 0x2f2f715e, 0x84849713, + 0x5353f5a6, 0xd1d168b9, 0x00000000, 0xeded2cc1, + 0x20206040, 0xfcfc1fe3, 0xb1b1c879, 0x5b5bedb6, + 0x6a6abed4, 0xcbcb468d, 0xbebed967, 0x39394b72, + 0x4a4ade94, 0x4c4cd498, 0x5858e8b0, 0xcfcf4a85, + 0xd0d06bbb, 0xefef2ac5, 0xaaaae54f, 0xfbfb16ed, + 0x4343c586, 0x4d4dd79a, 0x33335566, 0x85859411, + 0x4545cf8a, 0xf9f910e9, 0x02020604, 0x7f7f81fe, + 0x5050f0a0, 0x3c3c4478, 0x9f9fba25, 0xa8a8e34b, + 0x5151f3a2, 0xa3a3fe5d, 0x4040c080, 0x8f8f8a05, + 0x9292ad3f, 0x9d9dbc21, 0x38384870, 0xf5f504f1, + 0xbcbcdf63, 0xb6b6c177, 0xdada75af, 0x21216342, + 0x10103020, 0xffff1ae5, 0xf3f30efd, 0xd2d26dbf, + 0xcdcd4c81, 0x0c0c1418, 0x13133526, 0xecec2fc3, + 0x5f5fe1be, 0x9797a235, 0x4444cc88, 0x1717392e, + 0xc4c45793, 0xa7a7f255, 0x7e7e82fc, 0x3d3d477a, + 0x6464acc8, 0x5d5de7ba, 0x19192b32, 0x737395e6, + 0x6060a0c0, 0x81819819, 0x4f4fd19e, 0xdcdc7fa3, + 0x22226644, 0x2a2a7e54, 0x9090ab3b, 0x8888830b, + 0x4646ca8c, 0xeeee29c7, 0xb8b8d36b, 0x14143c28, + 0xdede79a7, 0x5e5ee2bc, 0x0b0b1d16, 0xdbdb76ad, + 0xe0e03bdb, 0x32325664, 0x3a3a4e74, 0x0a0a1e14, + 0x4949db92, 0x06060a0c, 0x24246c48, 0x5c5ce4b8, + 0xc2c25d9f, 0xd3d36ebd, 0xacacef43, 0x6262a6c4, + 0x9191a839, 0x9595a431, 0xe4e437d3, 0x79798bf2, + 0xe7e732d5, 0xc8c8438b, 0x3737596e, 0x6d6db7da, + 0x8d8d8c01, 0xd5d564b1, 0x4e4ed29c, 0xa9a9e049, + 0x6c6cb4d8, 0x5656faac, 0xf4f407f3, 0xeaea25cf, + 0x6565afca, 0x7a7a8ef4, 0xaeaee947, 0x08081810, + 0xbabad56f, 0x787888f0, 0x25256f4a, 0x2e2e725c, + 0x1c1c2438, 0xa6a6f157, 0xb4b4c773, 0xc6c65197, + 0xe8e823cb, 0xdddd7ca1, 0x74749ce8, 0x1f1f213e, + 0x4b4bdd96, 0xbdbddc61, 0x8b8b860d, 0x8a8a850f, + 0x707090e0, 0x3e3e427c, 0xb5b5c471, 0x6666aacc, + 0x4848d890, 0x03030506, 0xf6f601f7, 0x0e0e121c, + 0x6161a3c2, 0x35355f6a, 0x5757f9ae, 0xb9b9d069, + 0x86869117, 0xc1c15899, 0x1d1d273a, 0x9e9eb927, + 0xe1e138d9, 0xf8f813eb, 0x9898b32b, 0x11113322, + 0x6969bbd2, 0xd9d970a9, 0x8e8e8907, 0x9494a733, + 0x9b9bb62d, 0x1e1e223c, 0x87879215, 0xe9e920c9, + 0xcece4987, 0x5555ffaa, 0x28287850, 0xdfdf7aa5, + 0x8c8c8f03, 0xa1a1f859, 0x89898009, 0x0d0d171a, + 0xbfbfda65, 0xe6e631d7, 0x4242c684, 0x6868b8d0, + 0x4141c382, 0x9999b029, 0x2d2d775a, 0x0f0f111e, + 0xb0b0cb7b, 0x5454fca8, 0xbbbbd66d, 0x16163a2c, +}; + +__device__ __constant__ u32 te4[256] = +{ + 0x63636363, 0x7c7c7c7c, 0x77777777, 0x7b7b7b7b, + 0xf2f2f2f2, 0x6b6b6b6b, 0x6f6f6f6f, 0xc5c5c5c5, + 0x30303030, 0x01010101, 0x67676767, 0x2b2b2b2b, + 0xfefefefe, 0xd7d7d7d7, 0xabababab, 0x76767676, + 0xcacacaca, 0x82828282, 0xc9c9c9c9, 0x7d7d7d7d, + 0xfafafafa, 0x59595959, 0x47474747, 0xf0f0f0f0, + 0xadadadad, 0xd4d4d4d4, 0xa2a2a2a2, 0xafafafaf, + 0x9c9c9c9c, 0xa4a4a4a4, 0x72727272, 0xc0c0c0c0, + 0xb7b7b7b7, 0xfdfdfdfd, 0x93939393, 0x26262626, + 0x36363636, 0x3f3f3f3f, 0xf7f7f7f7, 0xcccccccc, + 0x34343434, 0xa5a5a5a5, 0xe5e5e5e5, 0xf1f1f1f1, + 0x71717171, 0xd8d8d8d8, 0x31313131, 0x15151515, + 0x04040404, 0xc7c7c7c7, 0x23232323, 0xc3c3c3c3, + 0x18181818, 0x96969696, 0x05050505, 0x9a9a9a9a, + 0x07070707, 0x12121212, 0x80808080, 0xe2e2e2e2, + 0xebebebeb, 0x27272727, 0xb2b2b2b2, 0x75757575, + 0x09090909, 0x83838383, 0x2c2c2c2c, 0x1a1a1a1a, + 0x1b1b1b1b, 0x6e6e6e6e, 0x5a5a5a5a, 0xa0a0a0a0, + 0x52525252, 0x3b3b3b3b, 0xd6d6d6d6, 0xb3b3b3b3, + 0x29292929, 0xe3e3e3e3, 0x2f2f2f2f, 0x84848484, + 0x53535353, 0xd1d1d1d1, 0x00000000, 0xedededed, + 0x20202020, 0xfcfcfcfc, 0xb1b1b1b1, 0x5b5b5b5b, + 0x6a6a6a6a, 0xcbcbcbcb, 0xbebebebe, 0x39393939, + 0x4a4a4a4a, 0x4c4c4c4c, 0x58585858, 0xcfcfcfcf, + 0xd0d0d0d0, 0xefefefef, 0xaaaaaaaa, 0xfbfbfbfb, + 0x43434343, 0x4d4d4d4d, 0x33333333, 0x85858585, + 0x45454545, 0xf9f9f9f9, 0x02020202, 0x7f7f7f7f, + 0x50505050, 0x3c3c3c3c, 0x9f9f9f9f, 0xa8a8a8a8, + 0x51515151, 0xa3a3a3a3, 0x40404040, 0x8f8f8f8f, + 0x92929292, 0x9d9d9d9d, 0x38383838, 0xf5f5f5f5, + 0xbcbcbcbc, 0xb6b6b6b6, 0xdadadada, 0x21212121, + 0x10101010, 0xffffffff, 0xf3f3f3f3, 0xd2d2d2d2, + 0xcdcdcdcd, 0x0c0c0c0c, 0x13131313, 0xecececec, + 0x5f5f5f5f, 0x97979797, 0x44444444, 0x17171717, + 0xc4c4c4c4, 0xa7a7a7a7, 0x7e7e7e7e, 0x3d3d3d3d, + 0x64646464, 0x5d5d5d5d, 0x19191919, 0x73737373, + 0x60606060, 0x81818181, 0x4f4f4f4f, 0xdcdcdcdc, + 0x22222222, 0x2a2a2a2a, 0x90909090, 0x88888888, + 0x46464646, 0xeeeeeeee, 0xb8b8b8b8, 0x14141414, + 0xdededede, 0x5e5e5e5e, 0x0b0b0b0b, 0xdbdbdbdb, + 0xe0e0e0e0, 0x32323232, 0x3a3a3a3a, 0x0a0a0a0a, + 0x49494949, 0x06060606, 0x24242424, 0x5c5c5c5c, + 0xc2c2c2c2, 0xd3d3d3d3, 0xacacacac, 0x62626262, + 0x91919191, 0x95959595, 0xe4e4e4e4, 0x79797979, + 0xe7e7e7e7, 0xc8c8c8c8, 0x37373737, 0x6d6d6d6d, + 0x8d8d8d8d, 0xd5d5d5d5, 0x4e4e4e4e, 0xa9a9a9a9, + 0x6c6c6c6c, 0x56565656, 0xf4f4f4f4, 0xeaeaeaea, + 0x65656565, 0x7a7a7a7a, 0xaeaeaeae, 0x08080808, + 0xbabababa, 0x78787878, 0x25252525, 0x2e2e2e2e, + 0x1c1c1c1c, 0xa6a6a6a6, 0xb4b4b4b4, 0xc6c6c6c6, + 0xe8e8e8e8, 0xdddddddd, 0x74747474, 0x1f1f1f1f, + 0x4b4b4b4b, 0xbdbdbdbd, 0x8b8b8b8b, 0x8a8a8a8a, + 0x70707070, 0x3e3e3e3e, 0xb5b5b5b5, 0x66666666, + 0x48484848, 0x03030303, 0xf6f6f6f6, 0x0e0e0e0e, + 0x61616161, 0x35353535, 0x57575757, 0xb9b9b9b9, + 0x86868686, 0xc1c1c1c1, 0x1d1d1d1d, 0x9e9e9e9e, + 0xe1e1e1e1, 0xf8f8f8f8, 0x98989898, 0x11111111, + 0x69696969, 0xd9d9d9d9, 0x8e8e8e8e, 0x94949494, + 0x9b9b9b9b, 0x1e1e1e1e, 0x87878787, 0xe9e9e9e9, + 0xcececece, 0x55555555, 0x28282828, 0xdfdfdfdf, + 0x8c8c8c8c, 0xa1a1a1a1, 0x89898989, 0x0d0d0d0d, + 0xbfbfbfbf, 0xe6e6e6e6, 0x42424242, 0x68686868, + 0x41414141, 0x99999999, 0x2d2d2d2d, 0x0f0f0f0f, + 0xb0b0b0b0, 0x54545454, 0xbbbbbbbb, 0x16161616, +}; + +__device__ __constant__ u32 td0[256] = +{ + 0x51f4a750, 0x7e416553, 0x1a17a4c3, 0x3a275e96, + 0x3bab6bcb, 0x1f9d45f1, 0xacfa58ab, 0x4be30393, + 0x2030fa55, 0xad766df6, 0x88cc7691, 0xf5024c25, + 0x4fe5d7fc, 0xc52acbd7, 0x26354480, 0xb562a38f, + 0xdeb15a49, 0x25ba1b67, 0x45ea0e98, 0x5dfec0e1, + 0xc32f7502, 0x814cf012, 0x8d4697a3, 0x6bd3f9c6, + 0x038f5fe7, 0x15929c95, 0xbf6d7aeb, 0x955259da, + 0xd4be832d, 0x587421d3, 0x49e06929, 0x8ec9c844, + 0x75c2896a, 0xf48e7978, 0x99583e6b, 0x27b971dd, + 0xbee14fb6, 0xf088ad17, 0xc920ac66, 0x7dce3ab4, + 0x63df4a18, 0xe51a3182, 0x97513360, 0x62537f45, + 0xb16477e0, 0xbb6bae84, 0xfe81a01c, 0xf9082b94, + 0x70486858, 0x8f45fd19, 0x94de6c87, 0x527bf8b7, + 0xab73d323, 0x724b02e2, 0xe31f8f57, 0x6655ab2a, + 0xb2eb2807, 0x2fb5c203, 0x86c57b9a, 0xd33708a5, + 0x302887f2, 0x23bfa5b2, 0x02036aba, 0xed16825c, + 0x8acf1c2b, 0xa779b492, 0xf307f2f0, 0x4e69e2a1, + 0x65daf4cd, 0x0605bed5, 0xd134621f, 0xc4a6fe8a, + 0x342e539d, 0xa2f355a0, 0x058ae132, 0xa4f6eb75, + 0x0b83ec39, 0x4060efaa, 0x5e719f06, 0xbd6e1051, + 0x3e218af9, 0x96dd063d, 0xdd3e05ae, 0x4de6bd46, + 0x91548db5, 0x71c45d05, 0x0406d46f, 0x605015ff, + 0x1998fb24, 0xd6bde997, 0x894043cc, 0x67d99e77, + 0xb0e842bd, 0x07898b88, 0xe7195b38, 0x79c8eedb, + 0xa17c0a47, 0x7c420fe9, 0xf8841ec9, 0x00000000, + 0x09808683, 0x322bed48, 0x1e1170ac, 0x6c5a724e, + 0xfd0efffb, 0x0f853856, 0x3daed51e, 0x362d3927, + 0x0a0fd964, 0x685ca621, 0x9b5b54d1, 0x24362e3a, + 0x0c0a67b1, 0x9357e70f, 0xb4ee96d2, 0x1b9b919e, + 0x80c0c54f, 0x61dc20a2, 0x5a774b69, 0x1c121a16, + 0xe293ba0a, 0xc0a02ae5, 0x3c22e043, 0x121b171d, + 0x0e090d0b, 0xf28bc7ad, 0x2db6a8b9, 0x141ea9c8, + 0x57f11985, 0xaf75074c, 0xee99ddbb, 0xa37f60fd, + 0xf701269f, 0x5c72f5bc, 0x44663bc5, 0x5bfb7e34, + 0x8b432976, 0xcb23c6dc, 0xb6edfc68, 0xb8e4f163, + 0xd731dcca, 0x42638510, 0x13972240, 0x84c61120, + 0x854a247d, 0xd2bb3df8, 0xaef93211, 0xc729a16d, + 0x1d9e2f4b, 0xdcb230f3, 0x0d8652ec, 0x77c1e3d0, + 0x2bb3166c, 0xa970b999, 0x119448fa, 0x47e96422, + 0xa8fc8cc4, 0xa0f03f1a, 0x567d2cd8, 0x223390ef, + 0x87494ec7, 0xd938d1c1, 0x8ccaa2fe, 0x98d40b36, + 0xa6f581cf, 0xa57ade28, 0xdab78e26, 0x3fadbfa4, + 0x2c3a9de4, 0x5078920d, 0x6a5fcc9b, 0x547e4662, + 0xf68d13c2, 0x90d8b8e8, 0x2e39f75e, 0x82c3aff5, + 0x9f5d80be, 0x69d0937c, 0x6fd52da9, 0xcf2512b3, + 0xc8ac993b, 0x10187da7, 0xe89c636e, 0xdb3bbb7b, + 0xcd267809, 0x6e5918f4, 0xec9ab701, 0x834f9aa8, + 0xe6956e65, 0xaaffe67e, 0x21bccf08, 0xef15e8e6, + 0xbae79bd9, 0x4a6f36ce, 0xea9f09d4, 0x29b07cd6, + 0x31a4b2af, 0x2a3f2331, 0xc6a59430, 0x35a266c0, + 0x744ebc37, 0xfc82caa6, 0xe090d0b0, 0x33a7d815, + 0xf104984a, 0x41ecdaf7, 0x7fcd500e, 0x1791f62f, + 0x764dd68d, 0x43efb04d, 0xccaa4d54, 0xe49604df, + 0x9ed1b5e3, 0x4c6a881b, 0xc12c1fb8, 0x4665517f, + 0x9d5eea04, 0x018c355d, 0xfa877473, 0xfb0b412e, + 0xb3671d5a, 0x92dbd252, 0xe9105633, 0x6dd64713, + 0x9ad7618c, 0x37a10c7a, 0x59f8148e, 0xeb133c89, + 0xcea927ee, 0xb761c935, 0xe11ce5ed, 0x7a47b13c, + 0x9cd2df59, 0x55f2733f, 0x1814ce79, 0x73c737bf, + 0x53f7cdea, 0x5ffdaa5b, 0xdf3d6f14, 0x7844db86, + 0xcaaff381, 0xb968c43e, 0x3824342c, 0xc2a3405f, + 0x161dc372, 0xbce2250c, 0x283c498b, 0xff0d9541, + 0x39a80171, 0x080cb3de, 0xd8b4e49c, 0x6456c190, + 0x7bcb8461, 0xd532b670, 0x486c5c74, 0xd0b85742, +}; + +__device__ __constant__ u32 td1[256] = +{ + 0x5051f4a7, 0x537e4165, 0xc31a17a4, 0x963a275e, + 0xcb3bab6b, 0xf11f9d45, 0xabacfa58, 0x934be303, + 0x552030fa, 0xf6ad766d, 0x9188cc76, 0x25f5024c, + 0xfc4fe5d7, 0xd7c52acb, 0x80263544, 0x8fb562a3, + 0x49deb15a, 0x6725ba1b, 0x9845ea0e, 0xe15dfec0, + 0x02c32f75, 0x12814cf0, 0xa38d4697, 0xc66bd3f9, + 0xe7038f5f, 0x9515929c, 0xebbf6d7a, 0xda955259, + 0x2dd4be83, 0xd3587421, 0x2949e069, 0x448ec9c8, + 0x6a75c289, 0x78f48e79, 0x6b99583e, 0xdd27b971, + 0xb6bee14f, 0x17f088ad, 0x66c920ac, 0xb47dce3a, + 0x1863df4a, 0x82e51a31, 0x60975133, 0x4562537f, + 0xe0b16477, 0x84bb6bae, 0x1cfe81a0, 0x94f9082b, + 0x58704868, 0x198f45fd, 0x8794de6c, 0xb7527bf8, + 0x23ab73d3, 0xe2724b02, 0x57e31f8f, 0x2a6655ab, + 0x07b2eb28, 0x032fb5c2, 0x9a86c57b, 0xa5d33708, + 0xf2302887, 0xb223bfa5, 0xba02036a, 0x5ced1682, + 0x2b8acf1c, 0x92a779b4, 0xf0f307f2, 0xa14e69e2, + 0xcd65daf4, 0xd50605be, 0x1fd13462, 0x8ac4a6fe, + 0x9d342e53, 0xa0a2f355, 0x32058ae1, 0x75a4f6eb, + 0x390b83ec, 0xaa4060ef, 0x065e719f, 0x51bd6e10, + 0xf93e218a, 0x3d96dd06, 0xaedd3e05, 0x464de6bd, + 0xb591548d, 0x0571c45d, 0x6f0406d4, 0xff605015, + 0x241998fb, 0x97d6bde9, 0xcc894043, 0x7767d99e, + 0xbdb0e842, 0x8807898b, 0x38e7195b, 0xdb79c8ee, + 0x47a17c0a, 0xe97c420f, 0xc9f8841e, 0x00000000, + 0x83098086, 0x48322bed, 0xac1e1170, 0x4e6c5a72, + 0xfbfd0eff, 0x560f8538, 0x1e3daed5, 0x27362d39, + 0x640a0fd9, 0x21685ca6, 0xd19b5b54, 0x3a24362e, + 0xb10c0a67, 0x0f9357e7, 0xd2b4ee96, 0x9e1b9b91, + 0x4f80c0c5, 0xa261dc20, 0x695a774b, 0x161c121a, + 0x0ae293ba, 0xe5c0a02a, 0x433c22e0, 0x1d121b17, + 0x0b0e090d, 0xadf28bc7, 0xb92db6a8, 0xc8141ea9, + 0x8557f119, 0x4caf7507, 0xbbee99dd, 0xfda37f60, + 0x9ff70126, 0xbc5c72f5, 0xc544663b, 0x345bfb7e, + 0x768b4329, 0xdccb23c6, 0x68b6edfc, 0x63b8e4f1, + 0xcad731dc, 0x10426385, 0x40139722, 0x2084c611, + 0x7d854a24, 0xf8d2bb3d, 0x11aef932, 0x6dc729a1, + 0x4b1d9e2f, 0xf3dcb230, 0xec0d8652, 0xd077c1e3, + 0x6c2bb316, 0x99a970b9, 0xfa119448, 0x2247e964, + 0xc4a8fc8c, 0x1aa0f03f, 0xd8567d2c, 0xef223390, + 0xc787494e, 0xc1d938d1, 0xfe8ccaa2, 0x3698d40b, + 0xcfa6f581, 0x28a57ade, 0x26dab78e, 0xa43fadbf, + 0xe42c3a9d, 0x0d507892, 0x9b6a5fcc, 0x62547e46, + 0xc2f68d13, 0xe890d8b8, 0x5e2e39f7, 0xf582c3af, + 0xbe9f5d80, 0x7c69d093, 0xa96fd52d, 0xb3cf2512, + 0x3bc8ac99, 0xa710187d, 0x6ee89c63, 0x7bdb3bbb, + 0x09cd2678, 0xf46e5918, 0x01ec9ab7, 0xa8834f9a, + 0x65e6956e, 0x7eaaffe6, 0x0821bccf, 0xe6ef15e8, + 0xd9bae79b, 0xce4a6f36, 0xd4ea9f09, 0xd629b07c, + 0xaf31a4b2, 0x312a3f23, 0x30c6a594, 0xc035a266, + 0x37744ebc, 0xa6fc82ca, 0xb0e090d0, 0x1533a7d8, + 0x4af10498, 0xf741ecda, 0x0e7fcd50, 0x2f1791f6, + 0x8d764dd6, 0x4d43efb0, 0x54ccaa4d, 0xdfe49604, + 0xe39ed1b5, 0x1b4c6a88, 0xb8c12c1f, 0x7f466551, + 0x049d5eea, 0x5d018c35, 0x73fa8774, 0x2efb0b41, + 0x5ab3671d, 0x5292dbd2, 0x33e91056, 0x136dd647, + 0x8c9ad761, 0x7a37a10c, 0x8e59f814, 0x89eb133c, + 0xeecea927, 0x35b761c9, 0xede11ce5, 0x3c7a47b1, + 0x599cd2df, 0x3f55f273, 0x791814ce, 0xbf73c737, + 0xea53f7cd, 0x5b5ffdaa, 0x14df3d6f, 0x867844db, + 0x81caaff3, 0x3eb968c4, 0x2c382434, 0x5fc2a340, + 0x72161dc3, 0x0cbce225, 0x8b283c49, 0x41ff0d95, + 0x7139a801, 0xde080cb3, 0x9cd8b4e4, 0x906456c1, + 0x617bcb84, 0x70d532b6, 0x74486c5c, 0x42d0b857, +}; + +__device__ __constant__ u32 td2[256] = +{ + 0xa75051f4, 0x65537e41, 0xa4c31a17, 0x5e963a27, + 0x6bcb3bab, 0x45f11f9d, 0x58abacfa, 0x03934be3, + 0xfa552030, 0x6df6ad76, 0x769188cc, 0x4c25f502, + 0xd7fc4fe5, 0xcbd7c52a, 0x44802635, 0xa38fb562, + 0x5a49deb1, 0x1b6725ba, 0x0e9845ea, 0xc0e15dfe, + 0x7502c32f, 0xf012814c, 0x97a38d46, 0xf9c66bd3, + 0x5fe7038f, 0x9c951592, 0x7aebbf6d, 0x59da9552, + 0x832dd4be, 0x21d35874, 0x692949e0, 0xc8448ec9, + 0x896a75c2, 0x7978f48e, 0x3e6b9958, 0x71dd27b9, + 0x4fb6bee1, 0xad17f088, 0xac66c920, 0x3ab47dce, + 0x4a1863df, 0x3182e51a, 0x33609751, 0x7f456253, + 0x77e0b164, 0xae84bb6b, 0xa01cfe81, 0x2b94f908, + 0x68587048, 0xfd198f45, 0x6c8794de, 0xf8b7527b, + 0xd323ab73, 0x02e2724b, 0x8f57e31f, 0xab2a6655, + 0x2807b2eb, 0xc2032fb5, 0x7b9a86c5, 0x08a5d337, + 0x87f23028, 0xa5b223bf, 0x6aba0203, 0x825ced16, + 0x1c2b8acf, 0xb492a779, 0xf2f0f307, 0xe2a14e69, + 0xf4cd65da, 0xbed50605, 0x621fd134, 0xfe8ac4a6, + 0x539d342e, 0x55a0a2f3, 0xe132058a, 0xeb75a4f6, + 0xec390b83, 0xefaa4060, 0x9f065e71, 0x1051bd6e, + 0x8af93e21, 0x063d96dd, 0x05aedd3e, 0xbd464de6, + 0x8db59154, 0x5d0571c4, 0xd46f0406, 0x15ff6050, + 0xfb241998, 0xe997d6bd, 0x43cc8940, 0x9e7767d9, + 0x42bdb0e8, 0x8b880789, 0x5b38e719, 0xeedb79c8, + 0x0a47a17c, 0x0fe97c42, 0x1ec9f884, 0x00000000, + 0x86830980, 0xed48322b, 0x70ac1e11, 0x724e6c5a, + 0xfffbfd0e, 0x38560f85, 0xd51e3dae, 0x3927362d, + 0xd9640a0f, 0xa621685c, 0x54d19b5b, 0x2e3a2436, + 0x67b10c0a, 0xe70f9357, 0x96d2b4ee, 0x919e1b9b, + 0xc54f80c0, 0x20a261dc, 0x4b695a77, 0x1a161c12, + 0xba0ae293, 0x2ae5c0a0, 0xe0433c22, 0x171d121b, + 0x0d0b0e09, 0xc7adf28b, 0xa8b92db6, 0xa9c8141e, + 0x198557f1, 0x074caf75, 0xddbbee99, 0x60fda37f, + 0x269ff701, 0xf5bc5c72, 0x3bc54466, 0x7e345bfb, + 0x29768b43, 0xc6dccb23, 0xfc68b6ed, 0xf163b8e4, + 0xdccad731, 0x85104263, 0x22401397, 0x112084c6, + 0x247d854a, 0x3df8d2bb, 0x3211aef9, 0xa16dc729, + 0x2f4b1d9e, 0x30f3dcb2, 0x52ec0d86, 0xe3d077c1, + 0x166c2bb3, 0xb999a970, 0x48fa1194, 0x642247e9, + 0x8cc4a8fc, 0x3f1aa0f0, 0x2cd8567d, 0x90ef2233, + 0x4ec78749, 0xd1c1d938, 0xa2fe8cca, 0x0b3698d4, + 0x81cfa6f5, 0xde28a57a, 0x8e26dab7, 0xbfa43fad, + 0x9de42c3a, 0x920d5078, 0xcc9b6a5f, 0x4662547e, + 0x13c2f68d, 0xb8e890d8, 0xf75e2e39, 0xaff582c3, + 0x80be9f5d, 0x937c69d0, 0x2da96fd5, 0x12b3cf25, + 0x993bc8ac, 0x7da71018, 0x636ee89c, 0xbb7bdb3b, + 0x7809cd26, 0x18f46e59, 0xb701ec9a, 0x9aa8834f, + 0x6e65e695, 0xe67eaaff, 0xcf0821bc, 0xe8e6ef15, + 0x9bd9bae7, 0x36ce4a6f, 0x09d4ea9f, 0x7cd629b0, + 0xb2af31a4, 0x23312a3f, 0x9430c6a5, 0x66c035a2, + 0xbc37744e, 0xcaa6fc82, 0xd0b0e090, 0xd81533a7, + 0x984af104, 0xdaf741ec, 0x500e7fcd, 0xf62f1791, + 0xd68d764d, 0xb04d43ef, 0x4d54ccaa, 0x04dfe496, + 0xb5e39ed1, 0x881b4c6a, 0x1fb8c12c, 0x517f4665, + 0xea049d5e, 0x355d018c, 0x7473fa87, 0x412efb0b, + 0x1d5ab367, 0xd25292db, 0x5633e910, 0x47136dd6, + 0x618c9ad7, 0x0c7a37a1, 0x148e59f8, 0x3c89eb13, + 0x27eecea9, 0xc935b761, 0xe5ede11c, 0xb13c7a47, + 0xdf599cd2, 0x733f55f2, 0xce791814, 0x37bf73c7, + 0xcdea53f7, 0xaa5b5ffd, 0x6f14df3d, 0xdb867844, + 0xf381caaf, 0xc43eb968, 0x342c3824, 0x405fc2a3, + 0xc372161d, 0x250cbce2, 0x498b283c, 0x9541ff0d, + 0x017139a8, 0xb3de080c, 0xe49cd8b4, 0xc1906456, + 0x84617bcb, 0xb670d532, 0x5c74486c, 0x5742d0b8, +}; + +__device__ __constant__ u32 td3[256] = +{ + 0xf4a75051, 0x4165537e, 0x17a4c31a, 0x275e963a, + 0xab6bcb3b, 0x9d45f11f, 0xfa58abac, 0xe303934b, + 0x30fa5520, 0x766df6ad, 0xcc769188, 0x024c25f5, + 0xe5d7fc4f, 0x2acbd7c5, 0x35448026, 0x62a38fb5, + 0xb15a49de, 0xba1b6725, 0xea0e9845, 0xfec0e15d, + 0x2f7502c3, 0x4cf01281, 0x4697a38d, 0xd3f9c66b, + 0x8f5fe703, 0x929c9515, 0x6d7aebbf, 0x5259da95, + 0xbe832dd4, 0x7421d358, 0xe0692949, 0xc9c8448e, + 0xc2896a75, 0x8e7978f4, 0x583e6b99, 0xb971dd27, + 0xe14fb6be, 0x88ad17f0, 0x20ac66c9, 0xce3ab47d, + 0xdf4a1863, 0x1a3182e5, 0x51336097, 0x537f4562, + 0x6477e0b1, 0x6bae84bb, 0x81a01cfe, 0x082b94f9, + 0x48685870, 0x45fd198f, 0xde6c8794, 0x7bf8b752, + 0x73d323ab, 0x4b02e272, 0x1f8f57e3, 0x55ab2a66, + 0xeb2807b2, 0xb5c2032f, 0xc57b9a86, 0x3708a5d3, + 0x2887f230, 0xbfa5b223, 0x036aba02, 0x16825ced, + 0xcf1c2b8a, 0x79b492a7, 0x07f2f0f3, 0x69e2a14e, + 0xdaf4cd65, 0x05bed506, 0x34621fd1, 0xa6fe8ac4, + 0x2e539d34, 0xf355a0a2, 0x8ae13205, 0xf6eb75a4, + 0x83ec390b, 0x60efaa40, 0x719f065e, 0x6e1051bd, + 0x218af93e, 0xdd063d96, 0x3e05aedd, 0xe6bd464d, + 0x548db591, 0xc45d0571, 0x06d46f04, 0x5015ff60, + 0x98fb2419, 0xbde997d6, 0x4043cc89, 0xd99e7767, + 0xe842bdb0, 0x898b8807, 0x195b38e7, 0xc8eedb79, + 0x7c0a47a1, 0x420fe97c, 0x841ec9f8, 0x00000000, + 0x80868309, 0x2bed4832, 0x1170ac1e, 0x5a724e6c, + 0x0efffbfd, 0x8538560f, 0xaed51e3d, 0x2d392736, + 0x0fd9640a, 0x5ca62168, 0x5b54d19b, 0x362e3a24, + 0x0a67b10c, 0x57e70f93, 0xee96d2b4, 0x9b919e1b, + 0xc0c54f80, 0xdc20a261, 0x774b695a, 0x121a161c, + 0x93ba0ae2, 0xa02ae5c0, 0x22e0433c, 0x1b171d12, + 0x090d0b0e, 0x8bc7adf2, 0xb6a8b92d, 0x1ea9c814, + 0xf1198557, 0x75074caf, 0x99ddbbee, 0x7f60fda3, + 0x01269ff7, 0x72f5bc5c, 0x663bc544, 0xfb7e345b, + 0x4329768b, 0x23c6dccb, 0xedfc68b6, 0xe4f163b8, + 0x31dccad7, 0x63851042, 0x97224013, 0xc6112084, + 0x4a247d85, 0xbb3df8d2, 0xf93211ae, 0x29a16dc7, + 0x9e2f4b1d, 0xb230f3dc, 0x8652ec0d, 0xc1e3d077, + 0xb3166c2b, 0x70b999a9, 0x9448fa11, 0xe9642247, + 0xfc8cc4a8, 0xf03f1aa0, 0x7d2cd856, 0x3390ef22, + 0x494ec787, 0x38d1c1d9, 0xcaa2fe8c, 0xd40b3698, + 0xf581cfa6, 0x7ade28a5, 0xb78e26da, 0xadbfa43f, + 0x3a9de42c, 0x78920d50, 0x5fcc9b6a, 0x7e466254, + 0x8d13c2f6, 0xd8b8e890, 0x39f75e2e, 0xc3aff582, + 0x5d80be9f, 0xd0937c69, 0xd52da96f, 0x2512b3cf, + 0xac993bc8, 0x187da710, 0x9c636ee8, 0x3bbb7bdb, + 0x267809cd, 0x5918f46e, 0x9ab701ec, 0x4f9aa883, + 0x956e65e6, 0xffe67eaa, 0xbccf0821, 0x15e8e6ef, + 0xe79bd9ba, 0x6f36ce4a, 0x9f09d4ea, 0xb07cd629, + 0xa4b2af31, 0x3f23312a, 0xa59430c6, 0xa266c035, + 0x4ebc3774, 0x82caa6fc, 0x90d0b0e0, 0xa7d81533, + 0x04984af1, 0xecdaf741, 0xcd500e7f, 0x91f62f17, + 0x4dd68d76, 0xefb04d43, 0xaa4d54cc, 0x9604dfe4, + 0xd1b5e39e, 0x6a881b4c, 0x2c1fb8c1, 0x65517f46, + 0x5eea049d, 0x8c355d01, 0x877473fa, 0x0b412efb, + 0x671d5ab3, 0xdbd25292, 0x105633e9, 0xd647136d, + 0xd7618c9a, 0xa10c7a37, 0xf8148e59, 0x133c89eb, + 0xa927eece, 0x61c935b7, 0x1ce5ede1, 0x47b13c7a, + 0xd2df599c, 0xf2733f55, 0x14ce7918, 0xc737bf73, + 0xf7cdea53, 0xfdaa5b5f, 0x3d6f14df, 0x44db8678, + 0xaff381ca, 0x68c43eb9, 0x24342c38, 0xa3405fc2, + 0x1dc37216, 0xe2250cbc, 0x3c498b28, 0x0d9541ff, + 0xa8017139, 0x0cb3de08, 0xb4e49cd8, 0x56c19064, + 0xcb84617b, 0x32b670d5, 0x6c5c7448, 0xb85742d0, +}; + +__device__ __constant__ u32 td4[256] = +{ + 0x52525252, 0x09090909, 0x6a6a6a6a, 0xd5d5d5d5, + 0x30303030, 0x36363636, 0xa5a5a5a5, 0x38383838, + 0xbfbfbfbf, 0x40404040, 0xa3a3a3a3, 0x9e9e9e9e, + 0x81818181, 0xf3f3f3f3, 0xd7d7d7d7, 0xfbfbfbfb, + 0x7c7c7c7c, 0xe3e3e3e3, 0x39393939, 0x82828282, + 0x9b9b9b9b, 0x2f2f2f2f, 0xffffffff, 0x87878787, + 0x34343434, 0x8e8e8e8e, 0x43434343, 0x44444444, + 0xc4c4c4c4, 0xdededede, 0xe9e9e9e9, 0xcbcbcbcb, + 0x54545454, 0x7b7b7b7b, 0x94949494, 0x32323232, + 0xa6a6a6a6, 0xc2c2c2c2, 0x23232323, 0x3d3d3d3d, + 0xeeeeeeee, 0x4c4c4c4c, 0x95959595, 0x0b0b0b0b, + 0x42424242, 0xfafafafa, 0xc3c3c3c3, 0x4e4e4e4e, + 0x08080808, 0x2e2e2e2e, 0xa1a1a1a1, 0x66666666, + 0x28282828, 0xd9d9d9d9, 0x24242424, 0xb2b2b2b2, + 0x76767676, 0x5b5b5b5b, 0xa2a2a2a2, 0x49494949, + 0x6d6d6d6d, 0x8b8b8b8b, 0xd1d1d1d1, 0x25252525, + 0x72727272, 0xf8f8f8f8, 0xf6f6f6f6, 0x64646464, + 0x86868686, 0x68686868, 0x98989898, 0x16161616, + 0xd4d4d4d4, 0xa4a4a4a4, 0x5c5c5c5c, 0xcccccccc, + 0x5d5d5d5d, 0x65656565, 0xb6b6b6b6, 0x92929292, + 0x6c6c6c6c, 0x70707070, 0x48484848, 0x50505050, + 0xfdfdfdfd, 0xedededed, 0xb9b9b9b9, 0xdadadada, + 0x5e5e5e5e, 0x15151515, 0x46464646, 0x57575757, + 0xa7a7a7a7, 0x8d8d8d8d, 0x9d9d9d9d, 0x84848484, + 0x90909090, 0xd8d8d8d8, 0xabababab, 0x00000000, + 0x8c8c8c8c, 0xbcbcbcbc, 0xd3d3d3d3, 0x0a0a0a0a, + 0xf7f7f7f7, 0xe4e4e4e4, 0x58585858, 0x05050505, + 0xb8b8b8b8, 0xb3b3b3b3, 0x45454545, 0x06060606, + 0xd0d0d0d0, 0x2c2c2c2c, 0x1e1e1e1e, 0x8f8f8f8f, + 0xcacacaca, 0x3f3f3f3f, 0x0f0f0f0f, 0x02020202, + 0xc1c1c1c1, 0xafafafaf, 0xbdbdbdbd, 0x03030303, + 0x01010101, 0x13131313, 0x8a8a8a8a, 0x6b6b6b6b, + 0x3a3a3a3a, 0x91919191, 0x11111111, 0x41414141, + 0x4f4f4f4f, 0x67676767, 0xdcdcdcdc, 0xeaeaeaea, + 0x97979797, 0xf2f2f2f2, 0xcfcfcfcf, 0xcececece, + 0xf0f0f0f0, 0xb4b4b4b4, 0xe6e6e6e6, 0x73737373, + 0x96969696, 0xacacacac, 0x74747474, 0x22222222, + 0xe7e7e7e7, 0xadadadad, 0x35353535, 0x85858585, + 0xe2e2e2e2, 0xf9f9f9f9, 0x37373737, 0xe8e8e8e8, + 0x1c1c1c1c, 0x75757575, 0xdfdfdfdf, 0x6e6e6e6e, + 0x47474747, 0xf1f1f1f1, 0x1a1a1a1a, 0x71717171, + 0x1d1d1d1d, 0x29292929, 0xc5c5c5c5, 0x89898989, + 0x6f6f6f6f, 0xb7b7b7b7, 0x62626262, 0x0e0e0e0e, + 0xaaaaaaaa, 0x18181818, 0xbebebebe, 0x1b1b1b1b, + 0xfcfcfcfc, 0x56565656, 0x3e3e3e3e, 0x4b4b4b4b, + 0xc6c6c6c6, 0xd2d2d2d2, 0x79797979, 0x20202020, + 0x9a9a9a9a, 0xdbdbdbdb, 0xc0c0c0c0, 0xfefefefe, + 0x78787878, 0xcdcdcdcd, 0x5a5a5a5a, 0xf4f4f4f4, + 0x1f1f1f1f, 0xdddddddd, 0xa8a8a8a8, 0x33333333, + 0x88888888, 0x07070707, 0xc7c7c7c7, 0x31313131, + 0xb1b1b1b1, 0x12121212, 0x10101010, 0x59595959, + 0x27272727, 0x80808080, 0xecececec, 0x5f5f5f5f, + 0x60606060, 0x51515151, 0x7f7f7f7f, 0xa9a9a9a9, + 0x19191919, 0xb5b5b5b5, 0x4a4a4a4a, 0x0d0d0d0d, + 0x2d2d2d2d, 0xe5e5e5e5, 0x7a7a7a7a, 0x9f9f9f9f, + 0x93939393, 0xc9c9c9c9, 0x9c9c9c9c, 0xefefefef, + 0xa0a0a0a0, 0xe0e0e0e0, 0x3b3b3b3b, 0x4d4d4d4d, + 0xaeaeaeae, 0x2a2a2a2a, 0xf5f5f5f5, 0xb0b0b0b0, + 0xc8c8c8c8, 0xebebebeb, 0xbbbbbbbb, 0x3c3c3c3c, + 0x83838383, 0x53535353, 0x99999999, 0x61616161, + 0x17171717, 0x2b2b2b2b, 0x04040404, 0x7e7e7e7e, + 0xbabababa, 0x77777777, 0xd6d6d6d6, 0x26262626, + 0xe1e1e1e1, 0x69696969, 0x14141414, 0x63636363, + 0x55555555, 0x21212121, 0x0c0c0c0c, 0x7d7d7d7d, +}; + +__device__ __constant__ u32 rcon[] = +{ + 0x01000000, 0x02000000, 0x04000000, 0x08000000, + 0x10000000, 0x20000000, 0x40000000, 0x80000000, + 0x1b000000, 0x36000000, +}; + +__device__ static void AES128_ExpandKey (u32 *userkey, u32 *rek, u32 s_te0[256], u32 s_te1[256], u32 s_te2[256], u32 s_te3[256], u32 s_te4[256]) +{ + rek[0] = userkey[0]; + rek[1] = userkey[1]; + rek[2] = userkey[2]; + rek[3] = userkey[3]; + + #pragma unroll 10 + for (u32 i = 0, j = 0; i < 10; i += 1, j += 4) + { + u32 temp = rek[j + 3]; + + temp = (s_te2[(temp >> 16) & 0xff] & 0xff000000) + ^ (s_te3[(temp >> 8) & 0xff] & 0x00ff0000) + ^ (s_te0[(temp >> 0) & 0xff] & 0x0000ff00) + ^ (s_te1[(temp >> 24) & 0xff] & 0x000000ff); + + rek[j + 4] = rek[j + 0] + ^ temp + ^ rcon[i]; + + rek[j + 5] = rek[j + 1] ^ rek[j + 4]; + rek[j + 6] = rek[j + 2] ^ rek[j + 5]; + rek[j + 7] = rek[j + 3] ^ rek[j + 6]; + } +} + +__device__ static void AES128_InvertKey (u32 *rdk, u32 s_td0[256], u32 s_td1[256], u32 s_td2[256], u32 s_td3[256], u32 s_td4[256], u32 s_te0[256], u32 s_te1[256], u32 s_te2[256], u32 s_te3[256], u32 s_te4[256]) +{ + for (u32 i = 0, j = 40; i < j; i += 4, j -= 4) + { + u32 temp; + + temp = rdk[i + 0]; rdk[i + 0] = rdk[j + 0]; rdk[j + 0] = temp; + temp = rdk[i + 1]; rdk[i + 1] = rdk[j + 1]; rdk[j + 1] = temp; + temp = rdk[i + 2]; rdk[i + 2] = rdk[j + 2]; rdk[j + 2] = temp; + temp = rdk[i + 3]; rdk[i + 3] = rdk[j + 3]; rdk[j + 3] = temp; + } + + for (u32 i = 1, j = 4; i < 10; i += 1, j += 4) + { + rdk[j + 0] = + s_td0[s_te1[(rdk[j + 0] >> 24) & 0xff] & 0xff] ^ + s_td1[s_te1[(rdk[j + 0] >> 16) & 0xff] & 0xff] ^ + s_td2[s_te1[(rdk[j + 0] >> 8) & 0xff] & 0xff] ^ + s_td3[s_te1[(rdk[j + 0] >> 0) & 0xff] & 0xff]; + + rdk[j + 1] = + s_td0[s_te1[(rdk[j + 1] >> 24) & 0xff] & 0xff] ^ + s_td1[s_te1[(rdk[j + 1] >> 16) & 0xff] & 0xff] ^ + s_td2[s_te1[(rdk[j + 1] >> 8) & 0xff] & 0xff] ^ + s_td3[s_te1[(rdk[j + 1] >> 0) & 0xff] & 0xff]; + + rdk[j + 2] = + s_td0[s_te1[(rdk[j + 2] >> 24) & 0xff] & 0xff] ^ + s_td1[s_te1[(rdk[j + 2] >> 16) & 0xff] & 0xff] ^ + s_td2[s_te1[(rdk[j + 2] >> 8) & 0xff] & 0xff] ^ + s_td3[s_te1[(rdk[j + 2] >> 0) & 0xff] & 0xff]; + + rdk[j + 3] = + s_td0[s_te1[(rdk[j + 3] >> 24) & 0xff] & 0xff] ^ + s_td1[s_te1[(rdk[j + 3] >> 16) & 0xff] & 0xff] ^ + s_td2[s_te1[(rdk[j + 3] >> 8) & 0xff] & 0xff] ^ + s_td3[s_te1[(rdk[j + 3] >> 0) & 0xff] & 0xff]; + } +} + +__device__ static void AES128_decrypt (const u32 *in, u32 *out, const u32 *rdk, u32 s_td0[256], u32 s_td1[256], u32 s_td2[256], u32 s_td3[256], u32 s_td4[256]) +{ + u32 s0 = in[0] ^ rdk[0]; + u32 s1 = in[1] ^ rdk[1]; + u32 s2 = in[2] ^ rdk[2]; + u32 s3 = in[3] ^ rdk[3]; + + u32 t0; + u32 t1; + u32 t2; + u32 t3; + + t0 = s_td0[s0 >> 24] ^ s_td1[(s3 >> 16) & 0xff] ^ s_td2[(s2 >> 8) & 0xff] ^ s_td3[s1 & 0xff] ^ rdk[ 4]; + t1 = s_td0[s1 >> 24] ^ s_td1[(s0 >> 16) & 0xff] ^ s_td2[(s3 >> 8) & 0xff] ^ s_td3[s2 & 0xff] ^ rdk[ 5]; + t2 = s_td0[s2 >> 24] ^ s_td1[(s1 >> 16) & 0xff] ^ s_td2[(s0 >> 8) & 0xff] ^ s_td3[s3 & 0xff] ^ rdk[ 6]; + t3 = s_td0[s3 >> 24] ^ s_td1[(s2 >> 16) & 0xff] ^ s_td2[(s1 >> 8) & 0xff] ^ s_td3[s0 & 0xff] ^ rdk[ 7]; + s0 = s_td0[t0 >> 24] ^ s_td1[(t3 >> 16) & 0xff] ^ s_td2[(t2 >> 8) & 0xff] ^ s_td3[t1 & 0xff] ^ rdk[ 8]; + s1 = s_td0[t1 >> 24] ^ s_td1[(t0 >> 16) & 0xff] ^ s_td2[(t3 >> 8) & 0xff] ^ s_td3[t2 & 0xff] ^ rdk[ 9]; + s2 = s_td0[t2 >> 24] ^ s_td1[(t1 >> 16) & 0xff] ^ s_td2[(t0 >> 8) & 0xff] ^ s_td3[t3 & 0xff] ^ rdk[10]; + s3 = s_td0[t3 >> 24] ^ s_td1[(t2 >> 16) & 0xff] ^ s_td2[(t1 >> 8) & 0xff] ^ s_td3[t0 & 0xff] ^ rdk[11]; + t0 = s_td0[s0 >> 24] ^ s_td1[(s3 >> 16) & 0xff] ^ s_td2[(s2 >> 8) & 0xff] ^ s_td3[s1 & 0xff] ^ rdk[12]; + t1 = s_td0[s1 >> 24] ^ s_td1[(s0 >> 16) & 0xff] ^ s_td2[(s3 >> 8) & 0xff] ^ s_td3[s2 & 0xff] ^ rdk[13]; + t2 = s_td0[s2 >> 24] ^ s_td1[(s1 >> 16) & 0xff] ^ s_td2[(s0 >> 8) & 0xff] ^ s_td3[s3 & 0xff] ^ rdk[14]; + t3 = s_td0[s3 >> 24] ^ s_td1[(s2 >> 16) & 0xff] ^ s_td2[(s1 >> 8) & 0xff] ^ s_td3[s0 & 0xff] ^ rdk[15]; + s0 = s_td0[t0 >> 24] ^ s_td1[(t3 >> 16) & 0xff] ^ s_td2[(t2 >> 8) & 0xff] ^ s_td3[t1 & 0xff] ^ rdk[16]; + s1 = s_td0[t1 >> 24] ^ s_td1[(t0 >> 16) & 0xff] ^ s_td2[(t3 >> 8) & 0xff] ^ s_td3[t2 & 0xff] ^ rdk[17]; + s2 = s_td0[t2 >> 24] ^ s_td1[(t1 >> 16) & 0xff] ^ s_td2[(t0 >> 8) & 0xff] ^ s_td3[t3 & 0xff] ^ rdk[18]; + s3 = s_td0[t3 >> 24] ^ s_td1[(t2 >> 16) & 0xff] ^ s_td2[(t1 >> 8) & 0xff] ^ s_td3[t0 & 0xff] ^ rdk[19]; + t0 = s_td0[s0 >> 24] ^ s_td1[(s3 >> 16) & 0xff] ^ s_td2[(s2 >> 8) & 0xff] ^ s_td3[s1 & 0xff] ^ rdk[20]; + t1 = s_td0[s1 >> 24] ^ s_td1[(s0 >> 16) & 0xff] ^ s_td2[(s3 >> 8) & 0xff] ^ s_td3[s2 & 0xff] ^ rdk[21]; + t2 = s_td0[s2 >> 24] ^ s_td1[(s1 >> 16) & 0xff] ^ s_td2[(s0 >> 8) & 0xff] ^ s_td3[s3 & 0xff] ^ rdk[22]; + t3 = s_td0[s3 >> 24] ^ s_td1[(s2 >> 16) & 0xff] ^ s_td2[(s1 >> 8) & 0xff] ^ s_td3[s0 & 0xff] ^ rdk[23]; + s0 = s_td0[t0 >> 24] ^ s_td1[(t3 >> 16) & 0xff] ^ s_td2[(t2 >> 8) & 0xff] ^ s_td3[t1 & 0xff] ^ rdk[24]; + s1 = s_td0[t1 >> 24] ^ s_td1[(t0 >> 16) & 0xff] ^ s_td2[(t3 >> 8) & 0xff] ^ s_td3[t2 & 0xff] ^ rdk[25]; + s2 = s_td0[t2 >> 24] ^ s_td1[(t1 >> 16) & 0xff] ^ s_td2[(t0 >> 8) & 0xff] ^ s_td3[t3 & 0xff] ^ rdk[26]; + s3 = s_td0[t3 >> 24] ^ s_td1[(t2 >> 16) & 0xff] ^ s_td2[(t1 >> 8) & 0xff] ^ s_td3[t0 & 0xff] ^ rdk[27]; + t0 = s_td0[s0 >> 24] ^ s_td1[(s3 >> 16) & 0xff] ^ s_td2[(s2 >> 8) & 0xff] ^ s_td3[s1 & 0xff] ^ rdk[28]; + t1 = s_td0[s1 >> 24] ^ s_td1[(s0 >> 16) & 0xff] ^ s_td2[(s3 >> 8) & 0xff] ^ s_td3[s2 & 0xff] ^ rdk[29]; + t2 = s_td0[s2 >> 24] ^ s_td1[(s1 >> 16) & 0xff] ^ s_td2[(s0 >> 8) & 0xff] ^ s_td3[s3 & 0xff] ^ rdk[30]; + t3 = s_td0[s3 >> 24] ^ s_td1[(s2 >> 16) & 0xff] ^ s_td2[(s1 >> 8) & 0xff] ^ s_td3[s0 & 0xff] ^ rdk[31]; + s0 = s_td0[t0 >> 24] ^ s_td1[(t3 >> 16) & 0xff] ^ s_td2[(t2 >> 8) & 0xff] ^ s_td3[t1 & 0xff] ^ rdk[32]; + s1 = s_td0[t1 >> 24] ^ s_td1[(t0 >> 16) & 0xff] ^ s_td2[(t3 >> 8) & 0xff] ^ s_td3[t2 & 0xff] ^ rdk[33]; + s2 = s_td0[t2 >> 24] ^ s_td1[(t1 >> 16) & 0xff] ^ s_td2[(t0 >> 8) & 0xff] ^ s_td3[t3 & 0xff] ^ rdk[34]; + s3 = s_td0[t3 >> 24] ^ s_td1[(t2 >> 16) & 0xff] ^ s_td2[(t1 >> 8) & 0xff] ^ s_td3[t0 & 0xff] ^ rdk[35]; + t0 = s_td0[s0 >> 24] ^ s_td1[(s3 >> 16) & 0xff] ^ s_td2[(s2 >> 8) & 0xff] ^ s_td3[s1 & 0xff] ^ rdk[36]; + t1 = s_td0[s1 >> 24] ^ s_td1[(s0 >> 16) & 0xff] ^ s_td2[(s3 >> 8) & 0xff] ^ s_td3[s2 & 0xff] ^ rdk[37]; + t2 = s_td0[s2 >> 24] ^ s_td1[(s1 >> 16) & 0xff] ^ s_td2[(s0 >> 8) & 0xff] ^ s_td3[s3 & 0xff] ^ rdk[38]; + t3 = s_td0[s3 >> 24] ^ s_td1[(s2 >> 16) & 0xff] ^ s_td2[(s1 >> 8) & 0xff] ^ s_td3[s0 & 0xff] ^ rdk[39]; + + out[0] = (s_td4[(t0 >> 24) & 0xff] & 0xff000000) + ^ (s_td4[(t3 >> 16) & 0xff] & 0x00ff0000) + ^ (s_td4[(t2 >> 8) & 0xff] & 0x0000ff00) + ^ (s_td4[(t1 >> 0) & 0xff] & 0x000000ff) + ^ rdk[40]; + + out[1] = (s_td4[(t1 >> 24) & 0xff] & 0xff000000) + ^ (s_td4[(t0 >> 16) & 0xff] & 0x00ff0000) + ^ (s_td4[(t3 >> 8) & 0xff] & 0x0000ff00) + ^ (s_td4[(t2 >> 0) & 0xff] & 0x000000ff) + ^ rdk[41]; + + out[2] = (s_td4[(t2 >> 24) & 0xff] & 0xff000000) + ^ (s_td4[(t1 >> 16) & 0xff] & 0x00ff0000) + ^ (s_td4[(t0 >> 8) & 0xff] & 0x0000ff00) + ^ (s_td4[(t3 >> 0) & 0xff] & 0x000000ff) + ^ rdk[42]; + + out[3] = (s_td4[(t3 >> 24) & 0xff] & 0xff000000) + ^ (s_td4[(t2 >> 16) & 0xff] & 0x00ff0000) + ^ (s_td4[(t1 >> 8) & 0xff] & 0x0000ff00) + ^ (s_td4[(t0 >> 0) & 0xff] & 0x000000ff) + ^ rdk[43]; +} + +__device__ static void sha1_transform (const u32x w[16], u32x digest[5]) +{ + u32x A = digest[0]; + u32x B = digest[1]; + u32x C = digest[2]; + u32x D = digest[3]; + u32x E = digest[4]; + + u32x w0_t = w[ 0]; + u32x w1_t = w[ 1]; + u32x w2_t = w[ 2]; + u32x w3_t = w[ 3]; + u32x w4_t = w[ 4]; + u32x w5_t = w[ 5]; + u32x w6_t = w[ 6]; + u32x w7_t = w[ 7]; + u32x w8_t = w[ 8]; + u32x w9_t = w[ 9]; + u32x wa_t = w[10]; + u32x wb_t = w[11]; + u32x wc_t = w[12]; + u32x wd_t = w[13]; + u32x we_t = w[14]; + u32x wf_t = w[15]; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, A, B, C, D, E, w0_t); + SHA1_STEP (SHA1_F0o, E, A, B, C, D, w1_t); + SHA1_STEP (SHA1_F0o, D, E, A, B, C, w2_t); + SHA1_STEP (SHA1_F0o, C, D, E, A, B, w3_t); + SHA1_STEP (SHA1_F0o, B, C, D, E, A, w4_t); + SHA1_STEP (SHA1_F0o, A, B, C, D, E, w5_t); + SHA1_STEP (SHA1_F0o, E, A, B, C, D, w6_t); + SHA1_STEP (SHA1_F0o, D, E, A, B, C, w7_t); + SHA1_STEP (SHA1_F0o, C, D, E, A, B, w8_t); + SHA1_STEP (SHA1_F0o, B, C, D, E, A, w9_t); + SHA1_STEP (SHA1_F0o, A, B, C, D, E, wa_t); + SHA1_STEP (SHA1_F0o, E, A, B, C, D, wb_t); + SHA1_STEP (SHA1_F0o, D, E, A, B, C, wc_t); + SHA1_STEP (SHA1_F0o, C, D, E, A, B, wd_t); + SHA1_STEP (SHA1_F0o, B, C, D, E, A, we_t); + SHA1_STEP (SHA1_F0o, A, B, C, D, E, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F0o, E, A, B, C, D, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F0o, D, E, A, B, C, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F0o, C, D, E, A, B, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F0o, B, C, D, E, A, w3_t); + + #undef K + #define K SHA1C01 + + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w7_t); + + #undef K + #define K SHA1C02 + + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, wb_t); + + #undef K + #define K SHA1C03 + + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, wf_t); + + digest[0] += A; + digest[1] += B; + digest[2] += C; + digest[3] += D; + digest[4] += E; +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m12500_init (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, rar3_tmp_t *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + tmps[gid].dgst[0][0] = SHA1M_A; + tmps[gid].dgst[0][1] = SHA1M_B; + tmps[gid].dgst[0][2] = SHA1M_C; + tmps[gid].dgst[0][3] = SHA1M_D; + tmps[gid].dgst[0][4] = SHA1M_E; +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m12500_loop (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, rar3_tmp_t *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32 pw_buf[5]; + + pw_buf[0] = pws[gid].i[0]; + pw_buf[1] = pws[gid].i[1]; + pw_buf[2] = pws[gid].i[2]; + pw_buf[3] = pws[gid].i[3]; + pw_buf[4] = pws[gid].i[4]; + + const u32 pw_len = pws[gid].pw_len; + + u32 salt_buf[2]; + + salt_buf[0] = salt_bufs[salt_pos].salt_buf[0]; + salt_buf[1] = salt_bufs[salt_pos].salt_buf[1]; + + const u32 salt_len = 8; + + // this is large enough to hold all possible w[] arrays for 64 iterations + + #define LARGEBLOCK_ELEMS ((40 + 8 + 3) * 16) + + u32 largeblock[LARGEBLOCK_ELEMS]; + + for (u32 i = 0; i < LARGEBLOCK_ELEMS; i++) largeblock[i] = 0; + + for (u32 i = 0, p = 0; i < 64; i++) + { + for (u32 j = 0; j < pw_len; j++, p += 2) + { + PUTCHAR_BE (largeblock, p, GETCHAR (pw_buf, j)); + } + + for (u32 j = 0; j < salt_len; j++, p += 1) + { + PUTCHAR_BE (largeblock, p, GETCHAR (salt_buf, j)); + } + + PUTCHAR_BE (largeblock, p + 2, (loop_pos >> 16) & 0xff); + + p += 3; + } + + const u32 p3 = (pw_len * 2) + salt_len + 3; + + const u32 init_pos = loop_pos / (ROUNDS / 16); + + u32 dgst[5]; + + dgst[0] = tmps[gid].dgst[init_pos][0]; + dgst[1] = tmps[gid].dgst[init_pos][1]; + dgst[2] = tmps[gid].dgst[init_pos][2]; + dgst[3] = tmps[gid].dgst[init_pos][3]; + dgst[4] = tmps[gid].dgst[init_pos][4]; + + u32 iter = loop_pos; + + for (u32 i = 0; i < 256; i += 4) + { + for (u32 j = 0; j < 64; j++) + { + const u32 p = ((j + 1) * p3) - 2; + + PUTCHAR_BE (largeblock, p, iter >> 8); + } + + for (u32 k = 0; k < 4; k++) + { + for (u32 j = 0; j < 64; j++) + { + const u32 p = ((j + 1) * p3) - 3; + + PUTCHAR_BE (largeblock, p, iter >> 0); + + iter++; + } + + for (u32 j = 0; j < p3; j++) + { + const u32 j16 = j * 16; + + sha1_transform (&largeblock[j16], dgst); + } + } + } + + tmps[gid].dgst[init_pos + 1][0] = dgst[0]; + tmps[gid].dgst[init_pos + 1][1] = dgst[1]; + tmps[gid].dgst[init_pos + 1][2] = dgst[2]; + tmps[gid].dgst[init_pos + 1][3] = dgst[3]; + tmps[gid].dgst[init_pos + 1][4] = dgst[4]; +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m12500_comp (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, rar3_tmp_t *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + const u32 lid = threadIdx.x; + + /** + * aes shared + */ + + __shared__ u32 s_td0[256]; + __shared__ u32 s_td1[256]; + __shared__ u32 s_td2[256]; + __shared__ u32 s_td3[256]; + __shared__ u32 s_td4[256]; + + __shared__ u32 s_te0[256]; + __shared__ u32 s_te1[256]; + __shared__ u32 s_te2[256]; + __shared__ u32 s_te3[256]; + __shared__ u32 s_te4[256]; + + s_td0[lid] = td0[lid]; + s_td1[lid] = td1[lid]; + s_td2[lid] = td2[lid]; + s_td3[lid] = td3[lid]; + s_td4[lid] = td4[lid]; + + s_te0[lid] = te0[lid]; + s_te1[lid] = te1[lid]; + s_te2[lid] = te2[lid]; + s_te3[lid] = te3[lid]; + s_te4[lid] = te4[lid]; + + __syncthreads (); + + if (gid >= gid_max) return; + + const u32 pw_len = pws[gid].pw_len; + + const u32 salt_len = 8; + + const u32 p3 = (pw_len * 2) + salt_len + 3; + + u32x w_buf[16]; + + w_buf[ 0] = 0x80000000; + w_buf[ 1] = 0; + w_buf[ 2] = 0; + w_buf[ 3] = 0; + w_buf[ 4] = 0; + w_buf[ 5] = 0; + w_buf[ 6] = 0; + w_buf[ 7] = 0; + w_buf[ 8] = 0; + w_buf[ 9] = 0; + w_buf[10] = 0; + w_buf[11] = 0; + w_buf[12] = 0; + w_buf[13] = 0; + w_buf[14] = 0; + w_buf[15] = (p3 * ROUNDS) * 8; + + u32 dgst[5]; + + dgst[0] = tmps[gid].dgst[16][0]; + dgst[1] = tmps[gid].dgst[16][1]; + dgst[2] = tmps[gid].dgst[16][2]; + dgst[3] = tmps[gid].dgst[16][3]; + dgst[4] = tmps[gid].dgst[16][4]; + + sha1_transform (w_buf, dgst); + + u32x rk[60]; + + u32 data[4]; + + data[0] = salt_bufs[salt_pos].salt_buf[2]; + data[1] = salt_bufs[salt_pos].salt_buf[3]; + data[2] = salt_bufs[salt_pos].salt_buf[4]; + data[3] = salt_bufs[salt_pos].salt_buf[5]; + + u32x ukeyx[4]; + + ukeyx[0] = swap_workaround (dgst[0]); + ukeyx[1] = swap_workaround (dgst[1]); + ukeyx[2] = swap_workaround (dgst[2]); + ukeyx[3] = swap_workaround (dgst[3]); + + AES128_ExpandKey (ukeyx, rk, s_te0, s_te1, s_te2, s_te3, s_te4); + + AES128_InvertKey (rk, s_td0, s_td1, s_td2, s_td3, s_td4, s_te0, s_te1, s_te2, s_te3, s_te4); + + u32 out[4]; + + AES128_decrypt (data, out, rk, s_td0, s_td1, s_td2, s_td3, s_td4); + + u32 iv[4]; + + iv[0] = 0; + iv[1] = 0; + iv[2] = 0; + iv[3] = 0; + + for (int i = 0; i < 16; i++) + { + u32 pw_buf[5]; + + pw_buf[0] = pws[gid].i[0]; + pw_buf[1] = pws[gid].i[1]; + pw_buf[2] = pws[gid].i[2]; + pw_buf[3] = pws[gid].i[3]; + pw_buf[4] = pws[gid].i[4]; + + const u32 pw_len = pws[gid].pw_len; + + u32 salt_buf[2]; + + salt_buf[0] = salt_bufs[salt_pos].salt_buf[0]; + salt_buf[1] = salt_bufs[salt_pos].salt_buf[1]; + + const u32 salt_len = 8; + + const u32 p3 = (pw_len * 2) + salt_len + 3; + + u32x w[16]; + + w[ 0] = 0; + w[ 1] = 0; + w[ 2] = 0; + w[ 3] = 0; + w[ 4] = 0; + w[ 5] = 0; + w[ 6] = 0; + w[ 7] = 0; + w[ 8] = 0; + w[ 9] = 0; + w[10] = 0; + w[11] = 0; + w[12] = 0; + w[13] = 0; + w[14] = 0; + w[15] = 0; + + u32 p = 0; + + for (u32 j = 0; j < pw_len; j++, p += 2) + { + PUTCHAR_BE (w, p, GETCHAR (pw_buf, j)); + } + + for (u32 j = 0; j < salt_len; j++, p += 1) + { + PUTCHAR_BE (w, p, GETCHAR (salt_buf, j)); + } + + const u32 iter_pos = i * (ROUNDS / 16); + + PUTCHAR_BE (w, p + 0, (iter_pos >> 0) & 0xff); + PUTCHAR_BE (w, p + 1, (iter_pos >> 8) & 0xff); + PUTCHAR_BE (w, p + 2, (iter_pos >> 16) & 0xff); + + PUTCHAR_BE (w, p3, 0x80); + + w[15] = ((iter_pos + 1) * p3) * 8; + + u32 dgst[5]; + + dgst[0] = tmps[gid].dgst[i][0]; + dgst[1] = tmps[gid].dgst[i][1]; + dgst[2] = tmps[gid].dgst[i][2]; + dgst[3] = tmps[gid].dgst[i][3]; + dgst[4] = tmps[gid].dgst[i][4]; + + sha1_transform (w, dgst); + + PUTCHAR (iv, i, dgst[4] & 0xff); + } + + out[0] ^= swap_workaround (iv[0]); + out[1] ^= swap_workaround (iv[1]); + out[2] ^= swap_workaround (iv[2]); + out[3] ^= swap_workaround (iv[3]); + + const u32x r0 = out[0]; + const u32x r1 = out[1]; + const u32x r2 = 0; + const u32x r3 = 0; + + #define il_pos 0 + + #include VECT_COMPARE_M +} diff --git a/nv/m12600_a0.cu b/nv/m12600_a0.cu new file mode 100644 index 0000000000..9190123cf8 --- /dev/null +++ b/nv/m12600_a0.cu @@ -0,0 +1,797 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _SHA256_SHA1_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW2 +#define VECT_SIZE1 +#endif + +#define DGST_R0 3 +#define DGST_R1 7 +#define DGST_R2 2 +#define DGST_R3 6 + +#include "include/kernel_functions.c" +#include "types_nv.c" +#include "common_nv.c" +#include "include/rp_gpu.h" +#include "rp_nv.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +#ifdef VECT_SIZE1 +#define uint_to_hex_upper8(i) l_bin2asc[(i)] +#endif + +#ifdef VECT_SIZE2 +#define uint_to_hex_upper8(i) u32x (l_bin2asc[(i).x], l_bin2asc[(i).y]) +#endif + +#ifdef VECT_SIZE4 +#define uint_to_hex_upper8(i) u32x (l_bin2asc[(i).x], l_bin2asc[(i).y], l_bin2asc[(i).z], l_bin2asc[(i).w]) +#endif + +__device__ __constant__ char c_bin2asc[16] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' }; + +__device__ __shared__ short l_bin2asc[256]; + +__device__ __constant__ gpu_rule_t c_rules[1024]; + +extern "C" __global__ void __launch_bounds__ (256, 1) m12600_m04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + u32x pw_buf1[4]; + + pw_buf1[0] = pws[gid].i[ 4]; + pw_buf1[1] = pws[gid].i[ 5]; + pw_buf1[2] = pws[gid].i[ 6]; + pw_buf1[3] = pws[gid].i[ 7]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * salt + */ + + u32 pc256[8]; + + pc256[0] = salt_bufs[salt_pos].salt_buf_pc[0]; + pc256[1] = salt_bufs[salt_pos].salt_buf_pc[1]; + pc256[2] = salt_bufs[salt_pos].salt_buf_pc[2]; + pc256[3] = salt_bufs[salt_pos].salt_buf_pc[3]; + pc256[4] = salt_bufs[salt_pos].salt_buf_pc[4]; + pc256[5] = salt_bufs[salt_pos].salt_buf_pc[5]; + pc256[6] = salt_bufs[salt_pos].salt_buf_pc[6]; + pc256[7] = salt_bufs[salt_pos].salt_buf_pc[7]; + + /** + * bin2asc table + */ + + l_bin2asc[lid] = c_bin2asc[(lid >> 0) & 15] << 8 + | c_bin2asc[(lid >> 4) & 15] << 0; + + __syncthreads (); + + if (gid >= gid_max) return; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + + w0[0] = pw_buf0[0]; + w0[1] = pw_buf0[1]; + w0[2] = pw_buf0[2]; + w0[3] = pw_buf0[3]; + + u32x w1[4]; + + w1[0] = pw_buf1[0]; + w1[1] = pw_buf1[1]; + w1[2] = pw_buf1[2]; + w1[3] = pw_buf1[3]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 out_len = apply_rules (c_rules[il_pos].cmds, w0, w1, pw_len); + + append_0x80_2 (w0, w1, out_len); + + /** + * sha1 + */ + + u32x w0_t = swap_workaround (w0[0]); + u32x w1_t = swap_workaround (w0[1]); + u32x w2_t = swap_workaround (w0[2]); + u32x w3_t = swap_workaround (w0[3]); + u32x w4_t = swap_workaround (w1[0]); + u32x w5_t = swap_workaround (w1[1]); + u32x w6_t = swap_workaround (w1[2]); + u32x w7_t = swap_workaround (w1[3]); + u32x w8_t = swap_workaround (w2[0]); + u32x w9_t = swap_workaround (w2[1]); + u32x wa_t = swap_workaround (w2[2]); + u32x wb_t = swap_workaround (w2[3]); + u32x wc_t = swap_workaround (w3[0]); + u32x wd_t = swap_workaround (w3[1]); + u32x we_t = 0; + u32x wf_t = out_len * 8; + + u32x a = SHA1M_A; + u32x b = SHA1M_B; + u32x c = SHA1M_C; + u32x d = SHA1M_D; + u32x e = SHA1M_E; + u32x f = 0; + u32x g = 0; + u32x h = 0; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w0_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w1_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w2_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w3_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w4_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w5_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w6_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w7_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w8_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w9_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wa_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, wb_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, wc_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, wd_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, we_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F0o, e, a, b, c, d, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F0o, d, e, a, b, c, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F0o, c, d, e, a, b, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F0o, b, c, d, e, a, w3_t); + + #undef K + #define K SHA1C01 + + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w7_t); + + #undef K + #define K SHA1C02 + + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wb_t); + + #undef K + #define K SHA1C03 + + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wf_t); + + a += SHA1M_A; + b += SHA1M_B; + c += SHA1M_C; + d += SHA1M_D; + e += SHA1M_E; + + /** + * sha256 + */ + + w0_t = uint_to_hex_upper8 ((a >> 24) & 255) << 0 + | uint_to_hex_upper8 ((a >> 16) & 255) << 16; + w1_t = uint_to_hex_upper8 ((a >> 8) & 255) << 0 + | uint_to_hex_upper8 ((a >> 0) & 255) << 16; + w2_t = uint_to_hex_upper8 ((b >> 24) & 255) << 0 + | uint_to_hex_upper8 ((b >> 16) & 255) << 16; + w3_t = uint_to_hex_upper8 ((b >> 8) & 255) << 0 + | uint_to_hex_upper8 ((b >> 0) & 255) << 16; + w4_t = uint_to_hex_upper8 ((c >> 24) & 255) << 0 + | uint_to_hex_upper8 ((c >> 16) & 255) << 16; + w5_t = uint_to_hex_upper8 ((c >> 8) & 255) << 0 + | uint_to_hex_upper8 ((c >> 0) & 255) << 16; + w6_t = uint_to_hex_upper8 ((d >> 24) & 255) << 0 + | uint_to_hex_upper8 ((d >> 16) & 255) << 16; + w7_t = uint_to_hex_upper8 ((d >> 8) & 255) << 0 + | uint_to_hex_upper8 ((d >> 0) & 255) << 16; + w8_t = uint_to_hex_upper8 ((e >> 24) & 255) << 0 + | uint_to_hex_upper8 ((e >> 16) & 255) << 16; + w9_t = uint_to_hex_upper8 ((e >> 8) & 255) << 0 + | uint_to_hex_upper8 ((e >> 0) & 255) << 16; + + w0_t = swap_workaround (w0_t); + w1_t = swap_workaround (w1_t); + w2_t = swap_workaround (w2_t); + w3_t = swap_workaround (w3_t); + w4_t = swap_workaround (w4_t); + w5_t = swap_workaround (w5_t); + w6_t = swap_workaround (w6_t); + w7_t = swap_workaround (w7_t); + w8_t = swap_workaround (w8_t); + w9_t = swap_workaround (w9_t); + wa_t = 0x80000000; + wb_t = 0; + wc_t = 0; + wd_t = 0; + we_t = 0; + wf_t = (64 + 40) * 8; + + a = pc256[0]; + b = pc256[1]; + c = pc256[2]; + d = pc256[3]; + e = pc256[4]; + f = pc256[5]; + g = pc256[6]; + h = pc256[7]; + + SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C00); + SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C01); + SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C02); + SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C03); + SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C04); + SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C05); + SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C06); + SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C07); + SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C08); + SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C09); + SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C0a); + SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C0b); + SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C0c); + SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C0d); + SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C0e); + SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C0f); + + w0_t = SHA256_EXPAND (we_t, w9_t, w1_t, w0_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C10); + w1_t = SHA256_EXPAND (wf_t, wa_t, w2_t, w1_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C11); + w2_t = SHA256_EXPAND (w0_t, wb_t, w3_t, w2_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C12); + w3_t = SHA256_EXPAND (w1_t, wc_t, w4_t, w3_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C13); + w4_t = SHA256_EXPAND (w2_t, wd_t, w5_t, w4_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C14); + w5_t = SHA256_EXPAND (w3_t, we_t, w6_t, w5_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C15); + w6_t = SHA256_EXPAND (w4_t, wf_t, w7_t, w6_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C16); + w7_t = SHA256_EXPAND (w5_t, w0_t, w8_t, w7_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C17); + w8_t = SHA256_EXPAND (w6_t, w1_t, w9_t, w8_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C18); + w9_t = SHA256_EXPAND (w7_t, w2_t, wa_t, w9_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C19); + wa_t = SHA256_EXPAND (w8_t, w3_t, wb_t, wa_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C1a); + wb_t = SHA256_EXPAND (w9_t, w4_t, wc_t, wb_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C1b); + wc_t = SHA256_EXPAND (wa_t, w5_t, wd_t, wc_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C1c); + wd_t = SHA256_EXPAND (wb_t, w6_t, we_t, wd_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C1d); + we_t = SHA256_EXPAND (wc_t, w7_t, wf_t, we_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C1e); + wf_t = SHA256_EXPAND (wd_t, w8_t, w0_t, wf_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C1f); + + w0_t = SHA256_EXPAND (we_t, w9_t, w1_t, w0_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C20); + w1_t = SHA256_EXPAND (wf_t, wa_t, w2_t, w1_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C21); + w2_t = SHA256_EXPAND (w0_t, wb_t, w3_t, w2_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C22); + w3_t = SHA256_EXPAND (w1_t, wc_t, w4_t, w3_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C23); + w4_t = SHA256_EXPAND (w2_t, wd_t, w5_t, w4_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C24); + w5_t = SHA256_EXPAND (w3_t, we_t, w6_t, w5_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C25); + w6_t = SHA256_EXPAND (w4_t, wf_t, w7_t, w6_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C26); + w7_t = SHA256_EXPAND (w5_t, w0_t, w8_t, w7_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C27); + w8_t = SHA256_EXPAND (w6_t, w1_t, w9_t, w8_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C28); + w9_t = SHA256_EXPAND (w7_t, w2_t, wa_t, w9_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C29); + wa_t = SHA256_EXPAND (w8_t, w3_t, wb_t, wa_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C2a); + wb_t = SHA256_EXPAND (w9_t, w4_t, wc_t, wb_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C2b); + wc_t = SHA256_EXPAND (wa_t, w5_t, wd_t, wc_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C2c); + wd_t = SHA256_EXPAND (wb_t, w6_t, we_t, wd_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C2d); + we_t = SHA256_EXPAND (wc_t, w7_t, wf_t, we_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C2e); + wf_t = SHA256_EXPAND (wd_t, w8_t, w0_t, wf_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C2f); + + w0_t = SHA256_EXPAND (we_t, w9_t, w1_t, w0_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C30); + w1_t = SHA256_EXPAND (wf_t, wa_t, w2_t, w1_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C31); + w2_t = SHA256_EXPAND (w0_t, wb_t, w3_t, w2_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C32); + w3_t = SHA256_EXPAND (w1_t, wc_t, w4_t, w3_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C33); + w4_t = SHA256_EXPAND (w2_t, wd_t, w5_t, w4_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C34); + w5_t = SHA256_EXPAND (w3_t, we_t, w6_t, w5_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C35); + w6_t = SHA256_EXPAND (w4_t, wf_t, w7_t, w6_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C36); + w7_t = SHA256_EXPAND (w5_t, w0_t, w8_t, w7_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C37); + w8_t = SHA256_EXPAND (w6_t, w1_t, w9_t, w8_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C38); + w9_t = SHA256_EXPAND (w7_t, w2_t, wa_t, w9_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C39); + wa_t = SHA256_EXPAND (w8_t, w3_t, wb_t, wa_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C3a); + wb_t = SHA256_EXPAND (w9_t, w4_t, wc_t, wb_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C3b); + wc_t = SHA256_EXPAND (wa_t, w5_t, wd_t, wc_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C3c); + wd_t = SHA256_EXPAND (wb_t, w6_t, we_t, wd_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C3d); + we_t = SHA256_EXPAND (wc_t, w7_t, wf_t, we_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C3e); + wf_t = SHA256_EXPAND (wd_t, w8_t, w0_t, wf_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C3f); + + const u32x r0 = d; + const u32x r1 = h; + const u32x r2 = c; + const u32x r3 = g; + + #include VECT_COMPARE_M + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m12600_m08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m12600_m16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m12600_s04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + u32x pw_buf0[4]; + + pw_buf0[0] = pws[gid].i[ 0]; + pw_buf0[1] = pws[gid].i[ 1]; + pw_buf0[2] = pws[gid].i[ 2]; + pw_buf0[3] = pws[gid].i[ 3]; + + u32x pw_buf1[4]; + + pw_buf1[0] = pws[gid].i[ 4]; + pw_buf1[1] = pws[gid].i[ 5]; + pw_buf1[2] = pws[gid].i[ 6]; + pw_buf1[3] = pws[gid].i[ 7]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * salt + */ + + u32 pc256[8]; + + pc256[0] = salt_bufs[salt_pos].salt_buf_pc[0]; + pc256[1] = salt_bufs[salt_pos].salt_buf_pc[1]; + pc256[2] = salt_bufs[salt_pos].salt_buf_pc[2]; + pc256[3] = salt_bufs[salt_pos].salt_buf_pc[3]; + pc256[4] = salt_bufs[salt_pos].salt_buf_pc[4]; + pc256[5] = salt_bufs[salt_pos].salt_buf_pc[5]; + pc256[6] = salt_bufs[salt_pos].salt_buf_pc[6]; + pc256[7] = salt_bufs[salt_pos].salt_buf_pc[7]; + + /** + * bin2asc table + */ + + l_bin2asc[lid] = c_bin2asc[(lid >> 0) & 15] << 8 + | c_bin2asc[(lid >> 4) & 15] << 0; + + __syncthreads (); + + if (gid >= gid_max) return; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < rules_cnt; il_pos++) + { + u32x w0[4]; + + w0[0] = pw_buf0[0]; + w0[1] = pw_buf0[1]; + w0[2] = pw_buf0[2]; + w0[3] = pw_buf0[3]; + + u32x w1[4]; + + w1[0] = pw_buf1[0]; + w1[1] = pw_buf1[1]; + w1[2] = pw_buf1[2]; + w1[3] = pw_buf1[3]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 out_len = apply_rules (c_rules[il_pos].cmds, w0, w1, pw_len); + + append_0x80_2 (w0, w1, out_len); + + /** + * sha1 + */ + + u32x w0_t = swap_workaround (w0[0]); + u32x w1_t = swap_workaround (w0[1]); + u32x w2_t = swap_workaround (w0[2]); + u32x w3_t = swap_workaround (w0[3]); + u32x w4_t = swap_workaround (w1[0]); + u32x w5_t = swap_workaround (w1[1]); + u32x w6_t = swap_workaround (w1[2]); + u32x w7_t = swap_workaround (w1[3]); + u32x w8_t = swap_workaround (w2[0]); + u32x w9_t = swap_workaround (w2[1]); + u32x wa_t = swap_workaround (w2[2]); + u32x wb_t = swap_workaround (w2[3]); + u32x wc_t = swap_workaround (w3[0]); + u32x wd_t = swap_workaround (w3[1]); + u32x we_t = 0; + u32x wf_t = out_len * 8; + + u32x a = SHA1M_A; + u32x b = SHA1M_B; + u32x c = SHA1M_C; + u32x d = SHA1M_D; + u32x e = SHA1M_E; + u32x f = 0; + u32x g = 0; + u32x h = 0; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w0_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w1_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w2_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w3_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w4_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w5_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w6_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w7_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w8_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w9_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wa_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, wb_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, wc_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, wd_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, we_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F0o, e, a, b, c, d, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F0o, d, e, a, b, c, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F0o, c, d, e, a, b, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F0o, b, c, d, e, a, w3_t); + + #undef K + #define K SHA1C01 + + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w7_t); + + #undef K + #define K SHA1C02 + + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wb_t); + + #undef K + #define K SHA1C03 + + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wf_t); + + a += SHA1M_A; + b += SHA1M_B; + c += SHA1M_C; + d += SHA1M_D; + e += SHA1M_E; + + /** + * sha256 + */ + + w0_t = uint_to_hex_upper8 ((a >> 24) & 255) << 0 + | uint_to_hex_upper8 ((a >> 16) & 255) << 16; + w1_t = uint_to_hex_upper8 ((a >> 8) & 255) << 0 + | uint_to_hex_upper8 ((a >> 0) & 255) << 16; + w2_t = uint_to_hex_upper8 ((b >> 24) & 255) << 0 + | uint_to_hex_upper8 ((b >> 16) & 255) << 16; + w3_t = uint_to_hex_upper8 ((b >> 8) & 255) << 0 + | uint_to_hex_upper8 ((b >> 0) & 255) << 16; + w4_t = uint_to_hex_upper8 ((c >> 24) & 255) << 0 + | uint_to_hex_upper8 ((c >> 16) & 255) << 16; + w5_t = uint_to_hex_upper8 ((c >> 8) & 255) << 0 + | uint_to_hex_upper8 ((c >> 0) & 255) << 16; + w6_t = uint_to_hex_upper8 ((d >> 24) & 255) << 0 + | uint_to_hex_upper8 ((d >> 16) & 255) << 16; + w7_t = uint_to_hex_upper8 ((d >> 8) & 255) << 0 + | uint_to_hex_upper8 ((d >> 0) & 255) << 16; + w8_t = uint_to_hex_upper8 ((e >> 24) & 255) << 0 + | uint_to_hex_upper8 ((e >> 16) & 255) << 16; + w9_t = uint_to_hex_upper8 ((e >> 8) & 255) << 0 + | uint_to_hex_upper8 ((e >> 0) & 255) << 16; + + w0_t = swap_workaround (w0_t); + w1_t = swap_workaround (w1_t); + w2_t = swap_workaround (w2_t); + w3_t = swap_workaround (w3_t); + w4_t = swap_workaround (w4_t); + w5_t = swap_workaround (w5_t); + w6_t = swap_workaround (w6_t); + w7_t = swap_workaround (w7_t); + w8_t = swap_workaround (w8_t); + w9_t = swap_workaround (w9_t); + wa_t = 0x80000000; + wb_t = 0; + wc_t = 0; + wd_t = 0; + we_t = 0; + wf_t = (64 + 40) * 8; + + a = pc256[0]; + b = pc256[1]; + c = pc256[2]; + d = pc256[3]; + e = pc256[4]; + f = pc256[5]; + g = pc256[6]; + h = pc256[7]; + + SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C00); + SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C01); + SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C02); + SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C03); + SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C04); + SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C05); + SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C06); + SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C07); + SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C08); + SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C09); + SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C0a); + SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C0b); + SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C0c); + SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C0d); + SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C0e); + SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C0f); + + w0_t = SHA256_EXPAND (we_t, w9_t, w1_t, w0_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C10); + w1_t = SHA256_EXPAND (wf_t, wa_t, w2_t, w1_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C11); + w2_t = SHA256_EXPAND (w0_t, wb_t, w3_t, w2_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C12); + w3_t = SHA256_EXPAND (w1_t, wc_t, w4_t, w3_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C13); + w4_t = SHA256_EXPAND (w2_t, wd_t, w5_t, w4_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C14); + w5_t = SHA256_EXPAND (w3_t, we_t, w6_t, w5_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C15); + w6_t = SHA256_EXPAND (w4_t, wf_t, w7_t, w6_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C16); + w7_t = SHA256_EXPAND (w5_t, w0_t, w8_t, w7_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C17); + w8_t = SHA256_EXPAND (w6_t, w1_t, w9_t, w8_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C18); + w9_t = SHA256_EXPAND (w7_t, w2_t, wa_t, w9_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C19); + wa_t = SHA256_EXPAND (w8_t, w3_t, wb_t, wa_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C1a); + wb_t = SHA256_EXPAND (w9_t, w4_t, wc_t, wb_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C1b); + wc_t = SHA256_EXPAND (wa_t, w5_t, wd_t, wc_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C1c); + wd_t = SHA256_EXPAND (wb_t, w6_t, we_t, wd_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C1d); + we_t = SHA256_EXPAND (wc_t, w7_t, wf_t, we_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C1e); + wf_t = SHA256_EXPAND (wd_t, w8_t, w0_t, wf_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C1f); + + w0_t = SHA256_EXPAND (we_t, w9_t, w1_t, w0_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C20); + w1_t = SHA256_EXPAND (wf_t, wa_t, w2_t, w1_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C21); + w2_t = SHA256_EXPAND (w0_t, wb_t, w3_t, w2_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C22); + w3_t = SHA256_EXPAND (w1_t, wc_t, w4_t, w3_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C23); + w4_t = SHA256_EXPAND (w2_t, wd_t, w5_t, w4_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C24); + w5_t = SHA256_EXPAND (w3_t, we_t, w6_t, w5_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C25); + w6_t = SHA256_EXPAND (w4_t, wf_t, w7_t, w6_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C26); + w7_t = SHA256_EXPAND (w5_t, w0_t, w8_t, w7_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C27); + w8_t = SHA256_EXPAND (w6_t, w1_t, w9_t, w8_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C28); + w9_t = SHA256_EXPAND (w7_t, w2_t, wa_t, w9_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C29); + wa_t = SHA256_EXPAND (w8_t, w3_t, wb_t, wa_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C2a); + wb_t = SHA256_EXPAND (w9_t, w4_t, wc_t, wb_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C2b); + wc_t = SHA256_EXPAND (wa_t, w5_t, wd_t, wc_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C2c); + wd_t = SHA256_EXPAND (wb_t, w6_t, we_t, wd_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C2d); + we_t = SHA256_EXPAND (wc_t, w7_t, wf_t, we_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C2e); + wf_t = SHA256_EXPAND (wd_t, w8_t, w0_t, wf_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C2f); + + w0_t = SHA256_EXPAND (we_t, w9_t, w1_t, w0_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C30); + w1_t = SHA256_EXPAND (wf_t, wa_t, w2_t, w1_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C31); + w2_t = SHA256_EXPAND (w0_t, wb_t, w3_t, w2_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C32); + w3_t = SHA256_EXPAND (w1_t, wc_t, w4_t, w3_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C33); + w4_t = SHA256_EXPAND (w2_t, wd_t, w5_t, w4_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C34); + w5_t = SHA256_EXPAND (w3_t, we_t, w6_t, w5_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C35); + w6_t = SHA256_EXPAND (w4_t, wf_t, w7_t, w6_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C36); + w7_t = SHA256_EXPAND (w5_t, w0_t, w8_t, w7_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C37); + w8_t = SHA256_EXPAND (w6_t, w1_t, w9_t, w8_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C38); + w9_t = SHA256_EXPAND (w7_t, w2_t, wa_t, w9_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C39); + wa_t = SHA256_EXPAND (w8_t, w3_t, wb_t, wa_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C3a); + wb_t = SHA256_EXPAND (w9_t, w4_t, wc_t, wb_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C3b); + wc_t = SHA256_EXPAND (wa_t, w5_t, wd_t, wc_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C3c); + wd_t = SHA256_EXPAND (wb_t, w6_t, we_t, wd_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C3d); + we_t = SHA256_EXPAND (wc_t, w7_t, wf_t, we_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C3e); + wf_t = SHA256_EXPAND (wd_t, w8_t, w0_t, wf_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C3f); + + const u32x r0 = d; + const u32x r1 = h; + const u32x r2 = c; + const u32x r3 = g; + + #include VECT_COMPARE_S + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m12600_s08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m12600_s16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/nv/m12600_a1.cu b/nv/m12600_a1.cu new file mode 100644 index 0000000000..80e66b5b42 --- /dev/null +++ b/nv/m12600_a1.cu @@ -0,0 +1,907 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _SHA256_SHA1_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW2 +#define VECT_SIZE1 +#endif + +#define DGST_R0 3 +#define DGST_R1 7 +#define DGST_R2 2 +#define DGST_R3 6 + +#include "include/kernel_functions.c" +#include "types_nv.c" +#include "common_nv.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +#ifdef VECT_SIZE1 +#define uint_to_hex_upper8(i) l_bin2asc[(i)] +#endif + +#ifdef VECT_SIZE2 +#define uint_to_hex_upper8(i) u32x (l_bin2asc[(i).x], l_bin2asc[(i).y]) +#endif + +#ifdef VECT_SIZE4 +#define uint_to_hex_upper8(i) u32x (l_bin2asc[(i).x], l_bin2asc[(i).y], l_bin2asc[(i).z], l_bin2asc[(i).w]) +#endif + +__device__ __constant__ char c_bin2asc[16] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' }; + +__device__ __shared__ short l_bin2asc[256]; + +__device__ __constant__ comb_t c_combs[1024]; + +extern "C" __global__ void __launch_bounds__ (256, 1) m12600_m04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + append_0x80_2 (wordl0, wordl1, pw_l_len); + + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, c_combs[0].pw_len); + } + + /** + * salt + */ + + u32 pc256[8]; + + pc256[0] = salt_bufs[salt_pos].salt_buf_pc[0]; + pc256[1] = salt_bufs[salt_pos].salt_buf_pc[1]; + pc256[2] = salt_bufs[salt_pos].salt_buf_pc[2]; + pc256[3] = salt_bufs[salt_pos].salt_buf_pc[3]; + pc256[4] = salt_bufs[salt_pos].salt_buf_pc[4]; + pc256[5] = salt_bufs[salt_pos].salt_buf_pc[5]; + pc256[6] = salt_bufs[salt_pos].salt_buf_pc[6]; + pc256[7] = salt_bufs[salt_pos].salt_buf_pc[7]; + + /** + * bin2asc table + */ + + l_bin2asc[lid] = c_bin2asc[(lid >> 0) & 15] << 8 + | c_bin2asc[(lid >> 4) & 15] << 0; + + __syncthreads (); + + if (gid >= gid_max) return; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = c_combs[il_pos].pw_len; + + const u32 pw_len = pw_l_len + pw_r_len; + + u32 wordr0[4]; + + wordr0[0] = c_combs[il_pos].i[0]; + wordr0[1] = c_combs[il_pos].i[1]; + wordr0[2] = c_combs[il_pos].i[2]; + wordr0[3] = c_combs[il_pos].i[3]; + + u32 wordr1[4]; + + wordr1[0] = c_combs[il_pos].i[4]; + wordr1[1] = c_combs[il_pos].i[5]; + wordr1[2] = c_combs[il_pos].i[6]; + wordr1[3] = c_combs[il_pos].i[7]; + + u32 wordr2[4]; + + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + + u32 wordr3[4]; + + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + append_0x80_2 (wordr0, wordr1, pw_r_len); + + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + u32x w0[4]; + + w0[0] = wordl0[0] | wordr0[0]; + w0[1] = wordl0[1] | wordr0[1]; + w0[2] = wordl0[2] | wordr0[2]; + w0[3] = wordl0[3] | wordr0[3]; + + u32x w1[4]; + + w1[0] = wordl1[0] | wordr1[0]; + w1[1] = wordl1[1] | wordr1[1]; + w1[2] = wordl1[2] | wordr1[2]; + w1[3] = wordl1[3] | wordr1[3]; + + u32x w2[4]; + + w2[0] = wordl2[0] | wordr2[0]; + w2[1] = wordl2[1] | wordr2[1]; + w2[2] = wordl2[2] | wordr2[2]; + w2[3] = wordl2[3] | wordr2[3]; + + u32x w3[4]; + + w3[0] = wordl3[0] | wordr3[0]; + w3[1] = wordl3[1] | wordr3[1]; + w3[2] = 0; + w3[3] = 0; + + /** + * sha1 + */ + + u32x w0_t = swap_workaround (w0[0]); + u32x w1_t = swap_workaround (w0[1]); + u32x w2_t = swap_workaround (w0[2]); + u32x w3_t = swap_workaround (w0[3]); + u32x w4_t = swap_workaround (w1[0]); + u32x w5_t = swap_workaround (w1[1]); + u32x w6_t = swap_workaround (w1[2]); + u32x w7_t = swap_workaround (w1[3]); + u32x w8_t = swap_workaround (w2[0]); + u32x w9_t = swap_workaround (w2[1]); + u32x wa_t = swap_workaround (w2[2]); + u32x wb_t = swap_workaround (w2[3]); + u32x wc_t = swap_workaround (w3[0]); + u32x wd_t = swap_workaround (w3[1]); + u32x we_t = 0; + u32x wf_t = pw_len * 8; + + u32x a = SHA1M_A; + u32x b = SHA1M_B; + u32x c = SHA1M_C; + u32x d = SHA1M_D; + u32x e = SHA1M_E; + u32x f = 0; + u32x g = 0; + u32x h = 0; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w0_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w1_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w2_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w3_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w4_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w5_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w6_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w7_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w8_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w9_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wa_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, wb_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, wc_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, wd_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, we_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F0o, e, a, b, c, d, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F0o, d, e, a, b, c, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F0o, c, d, e, a, b, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F0o, b, c, d, e, a, w3_t); + + #undef K + #define K SHA1C01 + + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w7_t); + + #undef K + #define K SHA1C02 + + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wb_t); + + #undef K + #define K SHA1C03 + + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wf_t); + + a += SHA1M_A; + b += SHA1M_B; + c += SHA1M_C; + d += SHA1M_D; + e += SHA1M_E; + + /** + * sha256 + */ + + w0_t = uint_to_hex_upper8 ((a >> 24) & 255) << 0 + | uint_to_hex_upper8 ((a >> 16) & 255) << 16; + w1_t = uint_to_hex_upper8 ((a >> 8) & 255) << 0 + | uint_to_hex_upper8 ((a >> 0) & 255) << 16; + w2_t = uint_to_hex_upper8 ((b >> 24) & 255) << 0 + | uint_to_hex_upper8 ((b >> 16) & 255) << 16; + w3_t = uint_to_hex_upper8 ((b >> 8) & 255) << 0 + | uint_to_hex_upper8 ((b >> 0) & 255) << 16; + w4_t = uint_to_hex_upper8 ((c >> 24) & 255) << 0 + | uint_to_hex_upper8 ((c >> 16) & 255) << 16; + w5_t = uint_to_hex_upper8 ((c >> 8) & 255) << 0 + | uint_to_hex_upper8 ((c >> 0) & 255) << 16; + w6_t = uint_to_hex_upper8 ((d >> 24) & 255) << 0 + | uint_to_hex_upper8 ((d >> 16) & 255) << 16; + w7_t = uint_to_hex_upper8 ((d >> 8) & 255) << 0 + | uint_to_hex_upper8 ((d >> 0) & 255) << 16; + w8_t = uint_to_hex_upper8 ((e >> 24) & 255) << 0 + | uint_to_hex_upper8 ((e >> 16) & 255) << 16; + w9_t = uint_to_hex_upper8 ((e >> 8) & 255) << 0 + | uint_to_hex_upper8 ((e >> 0) & 255) << 16; + + w0_t = swap_workaround (w0_t); + w1_t = swap_workaround (w1_t); + w2_t = swap_workaround (w2_t); + w3_t = swap_workaround (w3_t); + w4_t = swap_workaround (w4_t); + w5_t = swap_workaround (w5_t); + w6_t = swap_workaround (w6_t); + w7_t = swap_workaround (w7_t); + w8_t = swap_workaround (w8_t); + w9_t = swap_workaround (w9_t); + wa_t = 0x80000000; + wb_t = 0; + wc_t = 0; + wd_t = 0; + we_t = 0; + wf_t = (64 + 40) * 8; + + a = pc256[0]; + b = pc256[1]; + c = pc256[2]; + d = pc256[3]; + e = pc256[4]; + f = pc256[5]; + g = pc256[6]; + h = pc256[7]; + + SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C00); + SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C01); + SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C02); + SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C03); + SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C04); + SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C05); + SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C06); + SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C07); + SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C08); + SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C09); + SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C0a); + SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C0b); + SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C0c); + SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C0d); + SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C0e); + SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C0f); + + w0_t = SHA256_EXPAND (we_t, w9_t, w1_t, w0_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C10); + w1_t = SHA256_EXPAND (wf_t, wa_t, w2_t, w1_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C11); + w2_t = SHA256_EXPAND (w0_t, wb_t, w3_t, w2_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C12); + w3_t = SHA256_EXPAND (w1_t, wc_t, w4_t, w3_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C13); + w4_t = SHA256_EXPAND (w2_t, wd_t, w5_t, w4_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C14); + w5_t = SHA256_EXPAND (w3_t, we_t, w6_t, w5_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C15); + w6_t = SHA256_EXPAND (w4_t, wf_t, w7_t, w6_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C16); + w7_t = SHA256_EXPAND (w5_t, w0_t, w8_t, w7_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C17); + w8_t = SHA256_EXPAND (w6_t, w1_t, w9_t, w8_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C18); + w9_t = SHA256_EXPAND (w7_t, w2_t, wa_t, w9_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C19); + wa_t = SHA256_EXPAND (w8_t, w3_t, wb_t, wa_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C1a); + wb_t = SHA256_EXPAND (w9_t, w4_t, wc_t, wb_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C1b); + wc_t = SHA256_EXPAND (wa_t, w5_t, wd_t, wc_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C1c); + wd_t = SHA256_EXPAND (wb_t, w6_t, we_t, wd_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C1d); + we_t = SHA256_EXPAND (wc_t, w7_t, wf_t, we_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C1e); + wf_t = SHA256_EXPAND (wd_t, w8_t, w0_t, wf_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C1f); + + w0_t = SHA256_EXPAND (we_t, w9_t, w1_t, w0_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C20); + w1_t = SHA256_EXPAND (wf_t, wa_t, w2_t, w1_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C21); + w2_t = SHA256_EXPAND (w0_t, wb_t, w3_t, w2_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C22); + w3_t = SHA256_EXPAND (w1_t, wc_t, w4_t, w3_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C23); + w4_t = SHA256_EXPAND (w2_t, wd_t, w5_t, w4_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C24); + w5_t = SHA256_EXPAND (w3_t, we_t, w6_t, w5_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C25); + w6_t = SHA256_EXPAND (w4_t, wf_t, w7_t, w6_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C26); + w7_t = SHA256_EXPAND (w5_t, w0_t, w8_t, w7_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C27); + w8_t = SHA256_EXPAND (w6_t, w1_t, w9_t, w8_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C28); + w9_t = SHA256_EXPAND (w7_t, w2_t, wa_t, w9_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C29); + wa_t = SHA256_EXPAND (w8_t, w3_t, wb_t, wa_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C2a); + wb_t = SHA256_EXPAND (w9_t, w4_t, wc_t, wb_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C2b); + wc_t = SHA256_EXPAND (wa_t, w5_t, wd_t, wc_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C2c); + wd_t = SHA256_EXPAND (wb_t, w6_t, we_t, wd_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C2d); + we_t = SHA256_EXPAND (wc_t, w7_t, wf_t, we_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C2e); + wf_t = SHA256_EXPAND (wd_t, w8_t, w0_t, wf_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C2f); + + w0_t = SHA256_EXPAND (we_t, w9_t, w1_t, w0_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C30); + w1_t = SHA256_EXPAND (wf_t, wa_t, w2_t, w1_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C31); + w2_t = SHA256_EXPAND (w0_t, wb_t, w3_t, w2_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C32); + w3_t = SHA256_EXPAND (w1_t, wc_t, w4_t, w3_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C33); + w4_t = SHA256_EXPAND (w2_t, wd_t, w5_t, w4_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C34); + w5_t = SHA256_EXPAND (w3_t, we_t, w6_t, w5_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C35); + w6_t = SHA256_EXPAND (w4_t, wf_t, w7_t, w6_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C36); + w7_t = SHA256_EXPAND (w5_t, w0_t, w8_t, w7_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C37); + w8_t = SHA256_EXPAND (w6_t, w1_t, w9_t, w8_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C38); + w9_t = SHA256_EXPAND (w7_t, w2_t, wa_t, w9_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C39); + wa_t = SHA256_EXPAND (w8_t, w3_t, wb_t, wa_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C3a); + wb_t = SHA256_EXPAND (w9_t, w4_t, wc_t, wb_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C3b); + wc_t = SHA256_EXPAND (wa_t, w5_t, wd_t, wc_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C3c); + wd_t = SHA256_EXPAND (wb_t, w6_t, we_t, wd_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C3d); + we_t = SHA256_EXPAND (wc_t, w7_t, wf_t, we_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C3e); + wf_t = SHA256_EXPAND (wd_t, w8_t, w0_t, wf_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C3f); + + const u32x r0 = d; + const u32x r1 = h; + const u32x r2 = c; + const u32x r3 = g; + + #include VECT_COMPARE_M + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m12600_m08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m12600_m16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m12600_s04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 combs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + u32x wordl0[4]; + + wordl0[0] = pws[gid].i[ 0]; + wordl0[1] = pws[gid].i[ 1]; + wordl0[2] = pws[gid].i[ 2]; + wordl0[3] = pws[gid].i[ 3]; + + u32x wordl1[4]; + + wordl1[0] = pws[gid].i[ 4]; + wordl1[1] = pws[gid].i[ 5]; + wordl1[2] = pws[gid].i[ 6]; + wordl1[3] = pws[gid].i[ 7]; + + u32x wordl2[4]; + + wordl2[0] = 0; + wordl2[1] = 0; + wordl2[2] = 0; + wordl2[3] = 0; + + u32x wordl3[4]; + + wordl3[0] = 0; + wordl3[1] = 0; + wordl3[2] = 0; + wordl3[3] = 0; + + const u32 pw_l_len = pws[gid].pw_len; + + if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + append_0x80_2 (wordl0, wordl1, pw_l_len); + + switch_buffer_by_offset (wordl0, wordl1, wordl2, wordl3, c_combs[0].pw_len); + } + + /** + * salt + */ + + u32 pc256[8]; + + pc256[0] = salt_bufs[salt_pos].salt_buf_pc[0]; + pc256[1] = salt_bufs[salt_pos].salt_buf_pc[1]; + pc256[2] = salt_bufs[salt_pos].salt_buf_pc[2]; + pc256[3] = salt_bufs[salt_pos].salt_buf_pc[3]; + pc256[4] = salt_bufs[salt_pos].salt_buf_pc[4]; + pc256[5] = salt_bufs[salt_pos].salt_buf_pc[5]; + pc256[6] = salt_bufs[salt_pos].salt_buf_pc[6]; + pc256[7] = salt_bufs[salt_pos].salt_buf_pc[7]; + + /** + * bin2asc table + */ + + l_bin2asc[lid] = c_bin2asc[(lid >> 0) & 15] << 8 + | c_bin2asc[(lid >> 4) & 15] << 0; + + __syncthreads (); + + if (gid >= gid_max) return; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * loop + */ + + for (u32 il_pos = 0; il_pos < combs_cnt; il_pos++) + { + const u32 pw_r_len = c_combs[il_pos].pw_len; + + const u32 pw_len = pw_l_len + pw_r_len; + + u32 wordr0[4]; + + wordr0[0] = c_combs[il_pos].i[0]; + wordr0[1] = c_combs[il_pos].i[1]; + wordr0[2] = c_combs[il_pos].i[2]; + wordr0[3] = c_combs[il_pos].i[3]; + + u32 wordr1[4]; + + wordr1[0] = c_combs[il_pos].i[4]; + wordr1[1] = c_combs[il_pos].i[5]; + wordr1[2] = c_combs[il_pos].i[6]; + wordr1[3] = c_combs[il_pos].i[7]; + + u32 wordr2[4]; + + wordr2[0] = 0; + wordr2[1] = 0; + wordr2[2] = 0; + wordr2[3] = 0; + + u32 wordr3[4]; + + wordr3[0] = 0; + wordr3[1] = 0; + wordr3[2] = 0; + wordr3[3] = 0; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + append_0x80_2 (wordr0, wordr1, pw_r_len); + + switch_buffer_by_offset (wordr0, wordr1, wordr2, wordr3, pw_l_len); + } + + u32x w0[4]; + + w0[0] = wordl0[0] | wordr0[0]; + w0[1] = wordl0[1] | wordr0[1]; + w0[2] = wordl0[2] | wordr0[2]; + w0[3] = wordl0[3] | wordr0[3]; + + u32x w1[4]; + + w1[0] = wordl1[0] | wordr1[0]; + w1[1] = wordl1[1] | wordr1[1]; + w1[2] = wordl1[2] | wordr1[2]; + w1[3] = wordl1[3] | wordr1[3]; + + u32x w2[4]; + + w2[0] = wordl2[0] | wordr2[0]; + w2[1] = wordl2[1] | wordr2[1]; + w2[2] = wordl2[2] | wordr2[2]; + w2[3] = wordl2[3] | wordr2[3]; + + u32x w3[4]; + + w3[0] = wordl3[0] | wordr3[0]; + w3[1] = wordl3[1] | wordr3[1]; + w3[2] = 0; + w3[3] = 0; + + /** + * sha1 + */ + + u32x w0_t = swap_workaround (w0[0]); + u32x w1_t = swap_workaround (w0[1]); + u32x w2_t = swap_workaround (w0[2]); + u32x w3_t = swap_workaround (w0[3]); + u32x w4_t = swap_workaround (w1[0]); + u32x w5_t = swap_workaround (w1[1]); + u32x w6_t = swap_workaround (w1[2]); + u32x w7_t = swap_workaround (w1[3]); + u32x w8_t = swap_workaround (w2[0]); + u32x w9_t = swap_workaround (w2[1]); + u32x wa_t = swap_workaround (w2[2]); + u32x wb_t = swap_workaround (w2[3]); + u32x wc_t = swap_workaround (w3[0]); + u32x wd_t = swap_workaround (w3[1]); + u32x we_t = 0; + u32x wf_t = pw_len * 8; + + u32x a = SHA1M_A; + u32x b = SHA1M_B; + u32x c = SHA1M_C; + u32x d = SHA1M_D; + u32x e = SHA1M_E; + u32x f = 0; + u32x g = 0; + u32x h = 0; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w0_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w1_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w2_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w3_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w4_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w5_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w6_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w7_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w8_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w9_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wa_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, wb_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, wc_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, wd_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, we_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F0o, e, a, b, c, d, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F0o, d, e, a, b, c, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F0o, c, d, e, a, b, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F0o, b, c, d, e, a, w3_t); + + #undef K + #define K SHA1C01 + + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w7_t); + + #undef K + #define K SHA1C02 + + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wb_t); + + #undef K + #define K SHA1C03 + + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wf_t); + + a += SHA1M_A; + b += SHA1M_B; + c += SHA1M_C; + d += SHA1M_D; + e += SHA1M_E; + + /** + * sha256 + */ + + w0_t = uint_to_hex_upper8 ((a >> 24) & 255) << 0 + | uint_to_hex_upper8 ((a >> 16) & 255) << 16; + w1_t = uint_to_hex_upper8 ((a >> 8) & 255) << 0 + | uint_to_hex_upper8 ((a >> 0) & 255) << 16; + w2_t = uint_to_hex_upper8 ((b >> 24) & 255) << 0 + | uint_to_hex_upper8 ((b >> 16) & 255) << 16; + w3_t = uint_to_hex_upper8 ((b >> 8) & 255) << 0 + | uint_to_hex_upper8 ((b >> 0) & 255) << 16; + w4_t = uint_to_hex_upper8 ((c >> 24) & 255) << 0 + | uint_to_hex_upper8 ((c >> 16) & 255) << 16; + w5_t = uint_to_hex_upper8 ((c >> 8) & 255) << 0 + | uint_to_hex_upper8 ((c >> 0) & 255) << 16; + w6_t = uint_to_hex_upper8 ((d >> 24) & 255) << 0 + | uint_to_hex_upper8 ((d >> 16) & 255) << 16; + w7_t = uint_to_hex_upper8 ((d >> 8) & 255) << 0 + | uint_to_hex_upper8 ((d >> 0) & 255) << 16; + w8_t = uint_to_hex_upper8 ((e >> 24) & 255) << 0 + | uint_to_hex_upper8 ((e >> 16) & 255) << 16; + w9_t = uint_to_hex_upper8 ((e >> 8) & 255) << 0 + | uint_to_hex_upper8 ((e >> 0) & 255) << 16; + + w0_t = swap_workaround (w0_t); + w1_t = swap_workaround (w1_t); + w2_t = swap_workaround (w2_t); + w3_t = swap_workaround (w3_t); + w4_t = swap_workaround (w4_t); + w5_t = swap_workaround (w5_t); + w6_t = swap_workaround (w6_t); + w7_t = swap_workaround (w7_t); + w8_t = swap_workaround (w8_t); + w9_t = swap_workaround (w9_t); + wa_t = 0x80000000; + wb_t = 0; + wc_t = 0; + wd_t = 0; + we_t = 0; + wf_t = (64 + 40) * 8; + + a = pc256[0]; + b = pc256[1]; + c = pc256[2]; + d = pc256[3]; + e = pc256[4]; + f = pc256[5]; + g = pc256[6]; + h = pc256[7]; + + SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C00); + SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C01); + SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C02); + SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C03); + SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C04); + SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C05); + SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C06); + SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C07); + SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C08); + SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C09); + SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C0a); + SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C0b); + SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C0c); + SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C0d); + SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C0e); + SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C0f); + + w0_t = SHA256_EXPAND (we_t, w9_t, w1_t, w0_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C10); + w1_t = SHA256_EXPAND (wf_t, wa_t, w2_t, w1_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C11); + w2_t = SHA256_EXPAND (w0_t, wb_t, w3_t, w2_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C12); + w3_t = SHA256_EXPAND (w1_t, wc_t, w4_t, w3_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C13); + w4_t = SHA256_EXPAND (w2_t, wd_t, w5_t, w4_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C14); + w5_t = SHA256_EXPAND (w3_t, we_t, w6_t, w5_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C15); + w6_t = SHA256_EXPAND (w4_t, wf_t, w7_t, w6_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C16); + w7_t = SHA256_EXPAND (w5_t, w0_t, w8_t, w7_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C17); + w8_t = SHA256_EXPAND (w6_t, w1_t, w9_t, w8_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C18); + w9_t = SHA256_EXPAND (w7_t, w2_t, wa_t, w9_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C19); + wa_t = SHA256_EXPAND (w8_t, w3_t, wb_t, wa_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C1a); + wb_t = SHA256_EXPAND (w9_t, w4_t, wc_t, wb_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C1b); + wc_t = SHA256_EXPAND (wa_t, w5_t, wd_t, wc_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C1c); + wd_t = SHA256_EXPAND (wb_t, w6_t, we_t, wd_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C1d); + we_t = SHA256_EXPAND (wc_t, w7_t, wf_t, we_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C1e); + wf_t = SHA256_EXPAND (wd_t, w8_t, w0_t, wf_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C1f); + + w0_t = SHA256_EXPAND (we_t, w9_t, w1_t, w0_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C20); + w1_t = SHA256_EXPAND (wf_t, wa_t, w2_t, w1_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C21); + w2_t = SHA256_EXPAND (w0_t, wb_t, w3_t, w2_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C22); + w3_t = SHA256_EXPAND (w1_t, wc_t, w4_t, w3_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C23); + w4_t = SHA256_EXPAND (w2_t, wd_t, w5_t, w4_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C24); + w5_t = SHA256_EXPAND (w3_t, we_t, w6_t, w5_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C25); + w6_t = SHA256_EXPAND (w4_t, wf_t, w7_t, w6_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C26); + w7_t = SHA256_EXPAND (w5_t, w0_t, w8_t, w7_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C27); + w8_t = SHA256_EXPAND (w6_t, w1_t, w9_t, w8_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C28); + w9_t = SHA256_EXPAND (w7_t, w2_t, wa_t, w9_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C29); + wa_t = SHA256_EXPAND (w8_t, w3_t, wb_t, wa_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C2a); + wb_t = SHA256_EXPAND (w9_t, w4_t, wc_t, wb_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C2b); + wc_t = SHA256_EXPAND (wa_t, w5_t, wd_t, wc_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C2c); + wd_t = SHA256_EXPAND (wb_t, w6_t, we_t, wd_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C2d); + we_t = SHA256_EXPAND (wc_t, w7_t, wf_t, we_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C2e); + wf_t = SHA256_EXPAND (wd_t, w8_t, w0_t, wf_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C2f); + + w0_t = SHA256_EXPAND (we_t, w9_t, w1_t, w0_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C30); + w1_t = SHA256_EXPAND (wf_t, wa_t, w2_t, w1_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C31); + w2_t = SHA256_EXPAND (w0_t, wb_t, w3_t, w2_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C32); + w3_t = SHA256_EXPAND (w1_t, wc_t, w4_t, w3_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C33); + w4_t = SHA256_EXPAND (w2_t, wd_t, w5_t, w4_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C34); + w5_t = SHA256_EXPAND (w3_t, we_t, w6_t, w5_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C35); + w6_t = SHA256_EXPAND (w4_t, wf_t, w7_t, w6_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C36); + w7_t = SHA256_EXPAND (w5_t, w0_t, w8_t, w7_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C37); + w8_t = SHA256_EXPAND (w6_t, w1_t, w9_t, w8_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C38); + w9_t = SHA256_EXPAND (w7_t, w2_t, wa_t, w9_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C39); + wa_t = SHA256_EXPAND (w8_t, w3_t, wb_t, wa_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C3a); + wb_t = SHA256_EXPAND (w9_t, w4_t, wc_t, wb_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C3b); + wc_t = SHA256_EXPAND (wa_t, w5_t, wd_t, wc_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C3c); + wd_t = SHA256_EXPAND (wb_t, w6_t, we_t, wd_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C3d); + we_t = SHA256_EXPAND (wc_t, w7_t, wf_t, we_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C3e); + wf_t = SHA256_EXPAND (wd_t, w8_t, w0_t, wf_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C3f); + + const u32x r0 = d; + const u32x r1 = h; + const u32x r2 = c; + const u32x r3 = g; + + #include VECT_COMPARE_S + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m12600_s08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m12600_s16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ +} diff --git a/nv/m12600_a3.cu b/nv/m12600_a3.cu new file mode 100644 index 0000000000..1617a8a522 --- /dev/null +++ b/nv/m12600_a3.cu @@ -0,0 +1,1036 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _SHA256_SHA1_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW2 +#define VECT_SIZE1 +#endif + +#define DGST_R0 3 +#define DGST_R1 7 +#define DGST_R2 2 +#define DGST_R3 6 + +#include "include/kernel_functions.c" +#include "types_nv.c" +#include "common_nv.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_S "check_single_vect1_comp4.c" +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_S "check_single_vect2_comp4.c" +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + +#ifdef VECT_SIZE4 +#define VECT_COMPARE_S "check_single_vect4_comp4.c" +#define VECT_COMPARE_M "check_multi_vect4_comp4.c" +#endif + +#ifdef VECT_SIZE1 +#define uint_to_hex_upper8(i) l_bin2asc[(i)] +#endif + +#ifdef VECT_SIZE2 +#define uint_to_hex_upper8(i) u32x (l_bin2asc[(i).x], l_bin2asc[(i).y]) +#endif + +#ifdef VECT_SIZE4 +#define uint_to_hex_upper8(i) u32x (l_bin2asc[(i).x], l_bin2asc[(i).y], l_bin2asc[(i).z], l_bin2asc[(i).w]) +#endif + +__device__ __constant__ char c_bin2asc[16] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' }; + +__device__ __shared__ short l_bin2asc[256]; + +__device__ __constant__ bf_t c_bfs[1024]; + +__device__ static void m12600m (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], const u32 pw_len, const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset) +{ + /** + * modifier + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + const u32 lid = threadIdx.x; + + /** + * salt + */ + + u32 pc256[8]; + + pc256[0] = salt_bufs[salt_pos].salt_buf_pc[0]; + pc256[1] = salt_bufs[salt_pos].salt_buf_pc[1]; + pc256[2] = salt_bufs[salt_pos].salt_buf_pc[2]; + pc256[3] = salt_bufs[salt_pos].salt_buf_pc[3]; + pc256[4] = salt_bufs[salt_pos].salt_buf_pc[4]; + pc256[5] = salt_bufs[salt_pos].salt_buf_pc[5]; + pc256[6] = salt_bufs[salt_pos].salt_buf_pc[6]; + pc256[7] = salt_bufs[salt_pos].salt_buf_pc[7]; + + /** + * loop + */ + + u32x w0l = w0[0]; + + for (u32 il_pos = 0; il_pos < bfs_cnt; il_pos++) + { + const u32 w0r = c_bfs[il_pos].i; + + w0[0] = w0l | w0r; + + /** + * sha1 + */ + + u32x w0_t = w0[0]; + u32x w1_t = w0[1]; + u32x w2_t = w0[2]; + u32x w3_t = w0[3]; + u32x w4_t = w1[0]; + u32x w5_t = w1[1]; + u32x w6_t = w1[2]; + u32x w7_t = w1[3]; + u32x w8_t = w2[0]; + u32x w9_t = w2[1]; + u32x wa_t = w2[2]; + u32x wb_t = w2[3]; + u32x wc_t = w3[0]; + u32x wd_t = w3[1]; + u32x we_t = 0; + u32x wf_t = pw_len * 8; + + u32x a = SHA1M_A; + u32x b = SHA1M_B; + u32x c = SHA1M_C; + u32x d = SHA1M_D; + u32x e = SHA1M_E; + u32x f = 0; + u32x g = 0; + u32x h = 0; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w0_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w1_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w2_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w3_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w4_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w5_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w6_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w7_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w8_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w9_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wa_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, wb_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, wc_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, wd_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, we_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F0o, e, a, b, c, d, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F0o, d, e, a, b, c, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F0o, c, d, e, a, b, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F0o, b, c, d, e, a, w3_t); + + #undef K + #define K SHA1C01 + + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w7_t); + + #undef K + #define K SHA1C02 + + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wb_t); + + #undef K + #define K SHA1C03 + + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wf_t); + + a += SHA1M_A; + b += SHA1M_B; + c += SHA1M_C; + d += SHA1M_D; + e += SHA1M_E; + + /** + * sha256 + */ + + w0_t = uint_to_hex_upper8 ((a >> 24) & 255) << 0 + | uint_to_hex_upper8 ((a >> 16) & 255) << 16; + w1_t = uint_to_hex_upper8 ((a >> 8) & 255) << 0 + | uint_to_hex_upper8 ((a >> 0) & 255) << 16; + w2_t = uint_to_hex_upper8 ((b >> 24) & 255) << 0 + | uint_to_hex_upper8 ((b >> 16) & 255) << 16; + w3_t = uint_to_hex_upper8 ((b >> 8) & 255) << 0 + | uint_to_hex_upper8 ((b >> 0) & 255) << 16; + w4_t = uint_to_hex_upper8 ((c >> 24) & 255) << 0 + | uint_to_hex_upper8 ((c >> 16) & 255) << 16; + w5_t = uint_to_hex_upper8 ((c >> 8) & 255) << 0 + | uint_to_hex_upper8 ((c >> 0) & 255) << 16; + w6_t = uint_to_hex_upper8 ((d >> 24) & 255) << 0 + | uint_to_hex_upper8 ((d >> 16) & 255) << 16; + w7_t = uint_to_hex_upper8 ((d >> 8) & 255) << 0 + | uint_to_hex_upper8 ((d >> 0) & 255) << 16; + w8_t = uint_to_hex_upper8 ((e >> 24) & 255) << 0 + | uint_to_hex_upper8 ((e >> 16) & 255) << 16; + w9_t = uint_to_hex_upper8 ((e >> 8) & 255) << 0 + | uint_to_hex_upper8 ((e >> 0) & 255) << 16; + + w0_t = swap_workaround (w0_t); + w1_t = swap_workaround (w1_t); + w2_t = swap_workaround (w2_t); + w3_t = swap_workaround (w3_t); + w4_t = swap_workaround (w4_t); + w5_t = swap_workaround (w5_t); + w6_t = swap_workaround (w6_t); + w7_t = swap_workaround (w7_t); + w8_t = swap_workaround (w8_t); + w9_t = swap_workaround (w9_t); + wa_t = 0x80000000; + wb_t = 0; + wc_t = 0; + wd_t = 0; + we_t = 0; + wf_t = (64 + 40) * 8; + + a = pc256[0]; + b = pc256[1]; + c = pc256[2]; + d = pc256[3]; + e = pc256[4]; + f = pc256[5]; + g = pc256[6]; + h = pc256[7]; + + SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C00); + SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C01); + SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C02); + SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C03); + SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C04); + SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C05); + SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C06); + SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C07); + SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C08); + SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C09); + SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C0a); + SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C0b); + SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C0c); + SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C0d); + SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C0e); + SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C0f); + + w0_t = SHA256_EXPAND (we_t, w9_t, w1_t, w0_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C10); + w1_t = SHA256_EXPAND (wf_t, wa_t, w2_t, w1_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C11); + w2_t = SHA256_EXPAND (w0_t, wb_t, w3_t, w2_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C12); + w3_t = SHA256_EXPAND (w1_t, wc_t, w4_t, w3_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C13); + w4_t = SHA256_EXPAND (w2_t, wd_t, w5_t, w4_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C14); + w5_t = SHA256_EXPAND (w3_t, we_t, w6_t, w5_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C15); + w6_t = SHA256_EXPAND (w4_t, wf_t, w7_t, w6_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C16); + w7_t = SHA256_EXPAND (w5_t, w0_t, w8_t, w7_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C17); + w8_t = SHA256_EXPAND (w6_t, w1_t, w9_t, w8_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C18); + w9_t = SHA256_EXPAND (w7_t, w2_t, wa_t, w9_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C19); + wa_t = SHA256_EXPAND (w8_t, w3_t, wb_t, wa_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C1a); + wb_t = SHA256_EXPAND (w9_t, w4_t, wc_t, wb_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C1b); + wc_t = SHA256_EXPAND (wa_t, w5_t, wd_t, wc_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C1c); + wd_t = SHA256_EXPAND (wb_t, w6_t, we_t, wd_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C1d); + we_t = SHA256_EXPAND (wc_t, w7_t, wf_t, we_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C1e); + wf_t = SHA256_EXPAND (wd_t, w8_t, w0_t, wf_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C1f); + + w0_t = SHA256_EXPAND (we_t, w9_t, w1_t, w0_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C20); + w1_t = SHA256_EXPAND (wf_t, wa_t, w2_t, w1_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C21); + w2_t = SHA256_EXPAND (w0_t, wb_t, w3_t, w2_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C22); + w3_t = SHA256_EXPAND (w1_t, wc_t, w4_t, w3_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C23); + w4_t = SHA256_EXPAND (w2_t, wd_t, w5_t, w4_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C24); + w5_t = SHA256_EXPAND (w3_t, we_t, w6_t, w5_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C25); + w6_t = SHA256_EXPAND (w4_t, wf_t, w7_t, w6_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C26); + w7_t = SHA256_EXPAND (w5_t, w0_t, w8_t, w7_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C27); + w8_t = SHA256_EXPAND (w6_t, w1_t, w9_t, w8_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C28); + w9_t = SHA256_EXPAND (w7_t, w2_t, wa_t, w9_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C29); + wa_t = SHA256_EXPAND (w8_t, w3_t, wb_t, wa_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C2a); + wb_t = SHA256_EXPAND (w9_t, w4_t, wc_t, wb_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C2b); + wc_t = SHA256_EXPAND (wa_t, w5_t, wd_t, wc_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C2c); + wd_t = SHA256_EXPAND (wb_t, w6_t, we_t, wd_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C2d); + we_t = SHA256_EXPAND (wc_t, w7_t, wf_t, we_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C2e); + wf_t = SHA256_EXPAND (wd_t, w8_t, w0_t, wf_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C2f); + + w0_t = SHA256_EXPAND (we_t, w9_t, w1_t, w0_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C30); + w1_t = SHA256_EXPAND (wf_t, wa_t, w2_t, w1_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C31); + w2_t = SHA256_EXPAND (w0_t, wb_t, w3_t, w2_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C32); + w3_t = SHA256_EXPAND (w1_t, wc_t, w4_t, w3_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C33); + w4_t = SHA256_EXPAND (w2_t, wd_t, w5_t, w4_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C34); + w5_t = SHA256_EXPAND (w3_t, we_t, w6_t, w5_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C35); + w6_t = SHA256_EXPAND (w4_t, wf_t, w7_t, w6_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C36); + w7_t = SHA256_EXPAND (w5_t, w0_t, w8_t, w7_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C37); + w8_t = SHA256_EXPAND (w6_t, w1_t, w9_t, w8_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C38); + w9_t = SHA256_EXPAND (w7_t, w2_t, wa_t, w9_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C39); + wa_t = SHA256_EXPAND (w8_t, w3_t, wb_t, wa_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C3a); + wb_t = SHA256_EXPAND (w9_t, w4_t, wc_t, wb_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C3b); + wc_t = SHA256_EXPAND (wa_t, w5_t, wd_t, wc_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C3c); + wd_t = SHA256_EXPAND (wb_t, w6_t, we_t, wd_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C3d); + we_t = SHA256_EXPAND (wc_t, w7_t, wf_t, we_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C3e); + wf_t = SHA256_EXPAND (wd_t, w8_t, w0_t, wf_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C3f); + + const u32x r0 = d; + const u32x r1 = h; + const u32x r2 = c; + const u32x r3 = g; + + #include VECT_COMPARE_M + } +} + +__device__ static void m12600s (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], const u32 pw_len, const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset) +{ + /** + * modifier + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + const u32 lid = threadIdx.x; + + /** + * salt + */ + + u32 pc256[8]; + + pc256[0] = salt_bufs[salt_pos].salt_buf_pc[0]; + pc256[1] = salt_bufs[salt_pos].salt_buf_pc[1]; + pc256[2] = salt_bufs[salt_pos].salt_buf_pc[2]; + pc256[3] = salt_bufs[salt_pos].salt_buf_pc[3]; + pc256[4] = salt_bufs[salt_pos].salt_buf_pc[4]; + pc256[5] = salt_bufs[salt_pos].salt_buf_pc[5]; + pc256[6] = salt_bufs[salt_pos].salt_buf_pc[6]; + pc256[7] = salt_bufs[salt_pos].salt_buf_pc[7]; + + /** + * digest + */ + + const u32 search[4] = + { + digests_buf[digests_offset].digest_buf[DGST_R0], + digests_buf[digests_offset].digest_buf[DGST_R1], + digests_buf[digests_offset].digest_buf[DGST_R2], + digests_buf[digests_offset].digest_buf[DGST_R3] + }; + + /** + * loop + */ + + u32x w0l = w0[0]; + + for (u32 il_pos = 0; il_pos < bfs_cnt; il_pos++) + { + const u32 w0r = c_bfs[il_pos].i; + + w0[0] = w0l | w0r; + + /** + * sha1 + */ + + u32x w0_t = w0[0]; + u32x w1_t = w0[1]; + u32x w2_t = w0[2]; + u32x w3_t = w0[3]; + u32x w4_t = w1[0]; + u32x w5_t = w1[1]; + u32x w6_t = w1[2]; + u32x w7_t = w1[3]; + u32x w8_t = w2[0]; + u32x w9_t = w2[1]; + u32x wa_t = w2[2]; + u32x wb_t = w2[3]; + u32x wc_t = w3[0]; + u32x wd_t = w3[1]; + u32x we_t = 0; + u32x wf_t = pw_len * 8; + + u32x a = SHA1M_A; + u32x b = SHA1M_B; + u32x c = SHA1M_C; + u32x d = SHA1M_D; + u32x e = SHA1M_E; + u32x f = 0; + u32x g = 0; + u32x h = 0; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w0_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w1_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w2_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w3_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w4_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, w5_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, w6_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, w7_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, w8_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, w9_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wa_t); + SHA1_STEP (SHA1_F0o, e, a, b, c, d, wb_t); + SHA1_STEP (SHA1_F0o, d, e, a, b, c, wc_t); + SHA1_STEP (SHA1_F0o, c, d, e, a, b, wd_t); + SHA1_STEP (SHA1_F0o, b, c, d, e, a, we_t); + SHA1_STEP (SHA1_F0o, a, b, c, d, e, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F0o, e, a, b, c, d, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F0o, d, e, a, b, c, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F0o, c, d, e, a, b, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F0o, b, c, d, e, a, w3_t); + + #undef K + #define K SHA1C01 + + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w7_t); + + #undef K + #define K SHA1C02 + + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F2o, a, b, c, d, e, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, e, a, b, c, d, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, d, e, a, b, c, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, c, d, e, a, b, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, b, c, d, e, a, wb_t); + + #undef K + #define K SHA1C03 + + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, a, b, c, d, e, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, e, a, b, c, d, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, d, e, a, b, c, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, c, d, e, a, b, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, b, c, d, e, a, wf_t); + + a += SHA1M_A; + b += SHA1M_B; + c += SHA1M_C; + d += SHA1M_D; + e += SHA1M_E; + + /** + * sha256 + */ + + w0_t = uint_to_hex_upper8 ((a >> 24) & 255) << 0 + | uint_to_hex_upper8 ((a >> 16) & 255) << 16; + w1_t = uint_to_hex_upper8 ((a >> 8) & 255) << 0 + | uint_to_hex_upper8 ((a >> 0) & 255) << 16; + w2_t = uint_to_hex_upper8 ((b >> 24) & 255) << 0 + | uint_to_hex_upper8 ((b >> 16) & 255) << 16; + w3_t = uint_to_hex_upper8 ((b >> 8) & 255) << 0 + | uint_to_hex_upper8 ((b >> 0) & 255) << 16; + w4_t = uint_to_hex_upper8 ((c >> 24) & 255) << 0 + | uint_to_hex_upper8 ((c >> 16) & 255) << 16; + w5_t = uint_to_hex_upper8 ((c >> 8) & 255) << 0 + | uint_to_hex_upper8 ((c >> 0) & 255) << 16; + w6_t = uint_to_hex_upper8 ((d >> 24) & 255) << 0 + | uint_to_hex_upper8 ((d >> 16) & 255) << 16; + w7_t = uint_to_hex_upper8 ((d >> 8) & 255) << 0 + | uint_to_hex_upper8 ((d >> 0) & 255) << 16; + w8_t = uint_to_hex_upper8 ((e >> 24) & 255) << 0 + | uint_to_hex_upper8 ((e >> 16) & 255) << 16; + w9_t = uint_to_hex_upper8 ((e >> 8) & 255) << 0 + | uint_to_hex_upper8 ((e >> 0) & 255) << 16; + + w0_t = swap_workaround (w0_t); + w1_t = swap_workaround (w1_t); + w2_t = swap_workaround (w2_t); + w3_t = swap_workaround (w3_t); + w4_t = swap_workaround (w4_t); + w5_t = swap_workaround (w5_t); + w6_t = swap_workaround (w6_t); + w7_t = swap_workaround (w7_t); + w8_t = swap_workaround (w8_t); + w9_t = swap_workaround (w9_t); + wa_t = 0x80000000; + wb_t = 0; + wc_t = 0; + wd_t = 0; + we_t = 0; + wf_t = (64 + 40) * 8; + + a = pc256[0]; + b = pc256[1]; + c = pc256[2]; + d = pc256[3]; + e = pc256[4]; + f = pc256[5]; + g = pc256[6]; + h = pc256[7]; + + SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C00); + SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C01); + SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C02); + SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C03); + SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C04); + SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C05); + SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C06); + SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C07); + SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C08); + SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C09); + SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C0a); + SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C0b); + SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C0c); + SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C0d); + SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C0e); + SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C0f); + + w0_t = SHA256_EXPAND (we_t, w9_t, w1_t, w0_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C10); + w1_t = SHA256_EXPAND (wf_t, wa_t, w2_t, w1_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C11); + w2_t = SHA256_EXPAND (w0_t, wb_t, w3_t, w2_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C12); + w3_t = SHA256_EXPAND (w1_t, wc_t, w4_t, w3_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C13); + w4_t = SHA256_EXPAND (w2_t, wd_t, w5_t, w4_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C14); + w5_t = SHA256_EXPAND (w3_t, we_t, w6_t, w5_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C15); + w6_t = SHA256_EXPAND (w4_t, wf_t, w7_t, w6_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C16); + w7_t = SHA256_EXPAND (w5_t, w0_t, w8_t, w7_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C17); + w8_t = SHA256_EXPAND (w6_t, w1_t, w9_t, w8_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C18); + w9_t = SHA256_EXPAND (w7_t, w2_t, wa_t, w9_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C19); + wa_t = SHA256_EXPAND (w8_t, w3_t, wb_t, wa_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C1a); + wb_t = SHA256_EXPAND (w9_t, w4_t, wc_t, wb_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C1b); + wc_t = SHA256_EXPAND (wa_t, w5_t, wd_t, wc_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C1c); + wd_t = SHA256_EXPAND (wb_t, w6_t, we_t, wd_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C1d); + we_t = SHA256_EXPAND (wc_t, w7_t, wf_t, we_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C1e); + wf_t = SHA256_EXPAND (wd_t, w8_t, w0_t, wf_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C1f); + + w0_t = SHA256_EXPAND (we_t, w9_t, w1_t, w0_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C20); + w1_t = SHA256_EXPAND (wf_t, wa_t, w2_t, w1_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C21); + w2_t = SHA256_EXPAND (w0_t, wb_t, w3_t, w2_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C22); + w3_t = SHA256_EXPAND (w1_t, wc_t, w4_t, w3_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C23); + w4_t = SHA256_EXPAND (w2_t, wd_t, w5_t, w4_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C24); + w5_t = SHA256_EXPAND (w3_t, we_t, w6_t, w5_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C25); + w6_t = SHA256_EXPAND (w4_t, wf_t, w7_t, w6_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C26); + w7_t = SHA256_EXPAND (w5_t, w0_t, w8_t, w7_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C27); + w8_t = SHA256_EXPAND (w6_t, w1_t, w9_t, w8_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C28); + w9_t = SHA256_EXPAND (w7_t, w2_t, wa_t, w9_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C29); + wa_t = SHA256_EXPAND (w8_t, w3_t, wb_t, wa_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C2a); + wb_t = SHA256_EXPAND (w9_t, w4_t, wc_t, wb_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C2b); + wc_t = SHA256_EXPAND (wa_t, w5_t, wd_t, wc_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C2c); + wd_t = SHA256_EXPAND (wb_t, w6_t, we_t, wd_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C2d); + we_t = SHA256_EXPAND (wc_t, w7_t, wf_t, we_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C2e); + wf_t = SHA256_EXPAND (wd_t, w8_t, w0_t, wf_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C2f); + + w0_t = SHA256_EXPAND (we_t, w9_t, w1_t, w0_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C30); + w1_t = SHA256_EXPAND (wf_t, wa_t, w2_t, w1_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C31); + w2_t = SHA256_EXPAND (w0_t, wb_t, w3_t, w2_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C32); + w3_t = SHA256_EXPAND (w1_t, wc_t, w4_t, w3_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C33); + w4_t = SHA256_EXPAND (w2_t, wd_t, w5_t, w4_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C34); + w5_t = SHA256_EXPAND (w3_t, we_t, w6_t, w5_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C35); + w6_t = SHA256_EXPAND (w4_t, wf_t, w7_t, w6_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C36); + w7_t = SHA256_EXPAND (w5_t, w0_t, w8_t, w7_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C37); + w8_t = SHA256_EXPAND (w6_t, w1_t, w9_t, w8_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C38); + w9_t = SHA256_EXPAND (w7_t, w2_t, wa_t, w9_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C39); + wa_t = SHA256_EXPAND (w8_t, w3_t, wb_t, wa_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C3a); + wb_t = SHA256_EXPAND (w9_t, w4_t, wc_t, wb_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C3b); + wc_t = SHA256_EXPAND (wa_t, w5_t, wd_t, wc_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C3c); + wd_t = SHA256_EXPAND (wb_t, w6_t, we_t, wd_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C3d); + we_t = SHA256_EXPAND (wc_t, w7_t, wf_t, we_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C3e); + wf_t = SHA256_EXPAND (wd_t, w8_t, w0_t, wf_t); SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C3f); + + const u32x r0 = d; + const u32x r1 = h; + const u32x r2 = c; + const u32x r3 = g; + + #include VECT_COMPARE_S + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m12600_m04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = pws[gid].i[15]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * bin2asc table + */ + + l_bin2asc[lid] = c_bin2asc[(lid >> 0) & 15] << 8 + | c_bin2asc[(lid >> 4) & 15] << 0; + + __syncthreads (); + + if (gid >= gid_max) return; + + /** + * main + */ + + m12600m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m12600_m08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = pws[gid].i[15]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * bin2asc table + */ + + l_bin2asc[lid] = c_bin2asc[(lid >> 0) & 15] << 8 + | c_bin2asc[(lid >> 4) & 15] << 0; + + __syncthreads (); + + if (gid >= gid_max) return; + + /** + * main + */ + + m12600m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m12600_m16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = pws[gid].i[ 8]; + w2[1] = pws[gid].i[ 9]; + w2[2] = pws[gid].i[10]; + w2[3] = pws[gid].i[11]; + + u32x w3[4]; + + w3[0] = pws[gid].i[12]; + w3[1] = pws[gid].i[13]; + w3[2] = pws[gid].i[14]; + w3[3] = pws[gid].i[15]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * bin2asc table + */ + + l_bin2asc[lid] = c_bin2asc[(lid >> 0) & 15] << 8 + | c_bin2asc[(lid >> 4) & 15] << 0; + + __syncthreads (); + + if (gid >= gid_max) return; + + /** + * main + */ + + m12600m (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m12600_s04 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = pws[gid].i[15]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * bin2asc table + */ + + l_bin2asc[lid] = c_bin2asc[(lid >> 0) & 15] << 8 + | c_bin2asc[(lid >> 4) & 15] << 0; + + __syncthreads (); + + if (gid >= gid_max) return; + + /** + * main + */ + + m12600s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m12600_s08 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = pws[gid].i[15]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * bin2asc table + */ + + l_bin2asc[lid] = c_bin2asc[(lid >> 0) & 15] << 8 + | c_bin2asc[(lid >> 4) & 15] << 0; + + __syncthreads (); + + if (gid >= gid_max) return; + + /** + * main + */ + + m12600s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m12600_s16 (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, const void *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 bfs_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + /** + * modifier + */ + + const u32 lid = threadIdx.x; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = pws[gid].i[ 8]; + w2[1] = pws[gid].i[ 9]; + w2[2] = pws[gid].i[10]; + w2[3] = pws[gid].i[11]; + + u32x w3[4]; + + w3[0] = pws[gid].i[12]; + w3[1] = pws[gid].i[13]; + w3[2] = pws[gid].i[14]; + w3[3] = pws[gid].i[15]; + + const u32 pw_len = pws[gid].pw_len; + + /** + * bin2asc table + */ + + l_bin2asc[lid] = c_bin2asc[(lid >> 0) & 15] << 8 + | c_bin2asc[(lid >> 4) & 15] << 0; + + __syncthreads (); + + if (gid >= gid_max) return; + + /** + * main + */ + + m12600s (w0, w1, w2, w3, pw_len, pws, rules_buf, combs_buf, bfs_buf, tmps, hooks, bitmaps_buf_s1_a, bitmaps_buf_s1_b, bitmaps_buf_s1_c, bitmaps_buf_s1_d, bitmaps_buf_s2_a, bitmaps_buf_s2_b, bitmaps_buf_s2_c, bitmaps_buf_s2_d, plains_buf, digests_buf, hashes_shown, salt_bufs, esalt_bufs, d_return_buf, d_scryptV_buf, bitmap_mask, bitmap_shift1, bitmap_shift2, salt_pos, loop_pos, loop_cnt, bfs_cnt, digests_cnt, digests_offset); +} diff --git a/nv/m12700.cu b/nv/m12700.cu new file mode 100644 index 0000000000..a7c2a3ad74 --- /dev/null +++ b/nv/m12700.cu @@ -0,0 +1,1557 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _SHA1_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW2 +#define VECT_SIZE1 +#endif + +#define DGST_R0 0 +#define DGST_R1 1 +#define DGST_R2 2 +#define DGST_R3 3 + +#include "include/kernel_functions.c" +#include "types_nv.c" +#include "common_nv.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE2 +#define VECT_COMPARE_M "check_multi_vect2_comp4.c" +#endif + + +__device__ __constant__ u32 te0[256] = +{ + 0xc66363a5, 0xf87c7c84, 0xee777799, 0xf67b7b8d, + 0xfff2f20d, 0xd66b6bbd, 0xde6f6fb1, 0x91c5c554, + 0x60303050, 0x02010103, 0xce6767a9, 0x562b2b7d, + 0xe7fefe19, 0xb5d7d762, 0x4dababe6, 0xec76769a, + 0x8fcaca45, 0x1f82829d, 0x89c9c940, 0xfa7d7d87, + 0xeffafa15, 0xb25959eb, 0x8e4747c9, 0xfbf0f00b, + 0x41adadec, 0xb3d4d467, 0x5fa2a2fd, 0x45afafea, + 0x239c9cbf, 0x53a4a4f7, 0xe4727296, 0x9bc0c05b, + 0x75b7b7c2, 0xe1fdfd1c, 0x3d9393ae, 0x4c26266a, + 0x6c36365a, 0x7e3f3f41, 0xf5f7f702, 0x83cccc4f, + 0x6834345c, 0x51a5a5f4, 0xd1e5e534, 0xf9f1f108, + 0xe2717193, 0xabd8d873, 0x62313153, 0x2a15153f, + 0x0804040c, 0x95c7c752, 0x46232365, 0x9dc3c35e, + 0x30181828, 0x379696a1, 0x0a05050f, 0x2f9a9ab5, + 0x0e070709, 0x24121236, 0x1b80809b, 0xdfe2e23d, + 0xcdebeb26, 0x4e272769, 0x7fb2b2cd, 0xea75759f, + 0x1209091b, 0x1d83839e, 0x582c2c74, 0x341a1a2e, + 0x361b1b2d, 0xdc6e6eb2, 0xb45a5aee, 0x5ba0a0fb, + 0xa45252f6, 0x763b3b4d, 0xb7d6d661, 0x7db3b3ce, + 0x5229297b, 0xdde3e33e, 0x5e2f2f71, 0x13848497, + 0xa65353f5, 0xb9d1d168, 0x00000000, 0xc1eded2c, + 0x40202060, 0xe3fcfc1f, 0x79b1b1c8, 0xb65b5bed, + 0xd46a6abe, 0x8dcbcb46, 0x67bebed9, 0x7239394b, + 0x944a4ade, 0x984c4cd4, 0xb05858e8, 0x85cfcf4a, + 0xbbd0d06b, 0xc5efef2a, 0x4faaaae5, 0xedfbfb16, + 0x864343c5, 0x9a4d4dd7, 0x66333355, 0x11858594, + 0x8a4545cf, 0xe9f9f910, 0x04020206, 0xfe7f7f81, + 0xa05050f0, 0x783c3c44, 0x259f9fba, 0x4ba8a8e3, + 0xa25151f3, 0x5da3a3fe, 0x804040c0, 0x058f8f8a, + 0x3f9292ad, 0x219d9dbc, 0x70383848, 0xf1f5f504, + 0x63bcbcdf, 0x77b6b6c1, 0xafdada75, 0x42212163, + 0x20101030, 0xe5ffff1a, 0xfdf3f30e, 0xbfd2d26d, + 0x81cdcd4c, 0x180c0c14, 0x26131335, 0xc3ecec2f, + 0xbe5f5fe1, 0x359797a2, 0x884444cc, 0x2e171739, + 0x93c4c457, 0x55a7a7f2, 0xfc7e7e82, 0x7a3d3d47, + 0xc86464ac, 0xba5d5de7, 0x3219192b, 0xe6737395, + 0xc06060a0, 0x19818198, 0x9e4f4fd1, 0xa3dcdc7f, + 0x44222266, 0x542a2a7e, 0x3b9090ab, 0x0b888883, + 0x8c4646ca, 0xc7eeee29, 0x6bb8b8d3, 0x2814143c, + 0xa7dede79, 0xbc5e5ee2, 0x160b0b1d, 0xaddbdb76, + 0xdbe0e03b, 0x64323256, 0x743a3a4e, 0x140a0a1e, + 0x924949db, 0x0c06060a, 0x4824246c, 0xb85c5ce4, + 0x9fc2c25d, 0xbdd3d36e, 0x43acacef, 0xc46262a6, + 0x399191a8, 0x319595a4, 0xd3e4e437, 0xf279798b, + 0xd5e7e732, 0x8bc8c843, 0x6e373759, 0xda6d6db7, + 0x018d8d8c, 0xb1d5d564, 0x9c4e4ed2, 0x49a9a9e0, + 0xd86c6cb4, 0xac5656fa, 0xf3f4f407, 0xcfeaea25, + 0xca6565af, 0xf47a7a8e, 0x47aeaee9, 0x10080818, + 0x6fbabad5, 0xf0787888, 0x4a25256f, 0x5c2e2e72, + 0x381c1c24, 0x57a6a6f1, 0x73b4b4c7, 0x97c6c651, + 0xcbe8e823, 0xa1dddd7c, 0xe874749c, 0x3e1f1f21, + 0x964b4bdd, 0x61bdbddc, 0x0d8b8b86, 0x0f8a8a85, + 0xe0707090, 0x7c3e3e42, 0x71b5b5c4, 0xcc6666aa, + 0x904848d8, 0x06030305, 0xf7f6f601, 0x1c0e0e12, + 0xc26161a3, 0x6a35355f, 0xae5757f9, 0x69b9b9d0, + 0x17868691, 0x99c1c158, 0x3a1d1d27, 0x279e9eb9, + 0xd9e1e138, 0xebf8f813, 0x2b9898b3, 0x22111133, + 0xd26969bb, 0xa9d9d970, 0x078e8e89, 0x339494a7, + 0x2d9b9bb6, 0x3c1e1e22, 0x15878792, 0xc9e9e920, + 0x87cece49, 0xaa5555ff, 0x50282878, 0xa5dfdf7a, + 0x038c8c8f, 0x59a1a1f8, 0x09898980, 0x1a0d0d17, + 0x65bfbfda, 0xd7e6e631, 0x844242c6, 0xd06868b8, + 0x824141c3, 0x299999b0, 0x5a2d2d77, 0x1e0f0f11, + 0x7bb0b0cb, 0xa85454fc, 0x6dbbbbd6, 0x2c16163a, +}; + +__device__ __constant__ u32 te1[256] = +{ + 0xa5c66363, 0x84f87c7c, 0x99ee7777, 0x8df67b7b, + 0x0dfff2f2, 0xbdd66b6b, 0xb1de6f6f, 0x5491c5c5, + 0x50603030, 0x03020101, 0xa9ce6767, 0x7d562b2b, + 0x19e7fefe, 0x62b5d7d7, 0xe64dabab, 0x9aec7676, + 0x458fcaca, 0x9d1f8282, 0x4089c9c9, 0x87fa7d7d, + 0x15effafa, 0xebb25959, 0xc98e4747, 0x0bfbf0f0, + 0xec41adad, 0x67b3d4d4, 0xfd5fa2a2, 0xea45afaf, + 0xbf239c9c, 0xf753a4a4, 0x96e47272, 0x5b9bc0c0, + 0xc275b7b7, 0x1ce1fdfd, 0xae3d9393, 0x6a4c2626, + 0x5a6c3636, 0x417e3f3f, 0x02f5f7f7, 0x4f83cccc, + 0x5c683434, 0xf451a5a5, 0x34d1e5e5, 0x08f9f1f1, + 0x93e27171, 0x73abd8d8, 0x53623131, 0x3f2a1515, + 0x0c080404, 0x5295c7c7, 0x65462323, 0x5e9dc3c3, + 0x28301818, 0xa1379696, 0x0f0a0505, 0xb52f9a9a, + 0x090e0707, 0x36241212, 0x9b1b8080, 0x3ddfe2e2, + 0x26cdebeb, 0x694e2727, 0xcd7fb2b2, 0x9fea7575, + 0x1b120909, 0x9e1d8383, 0x74582c2c, 0x2e341a1a, + 0x2d361b1b, 0xb2dc6e6e, 0xeeb45a5a, 0xfb5ba0a0, + 0xf6a45252, 0x4d763b3b, 0x61b7d6d6, 0xce7db3b3, + 0x7b522929, 0x3edde3e3, 0x715e2f2f, 0x97138484, + 0xf5a65353, 0x68b9d1d1, 0x00000000, 0x2cc1eded, + 0x60402020, 0x1fe3fcfc, 0xc879b1b1, 0xedb65b5b, + 0xbed46a6a, 0x468dcbcb, 0xd967bebe, 0x4b723939, + 0xde944a4a, 0xd4984c4c, 0xe8b05858, 0x4a85cfcf, + 0x6bbbd0d0, 0x2ac5efef, 0xe54faaaa, 0x16edfbfb, + 0xc5864343, 0xd79a4d4d, 0x55663333, 0x94118585, + 0xcf8a4545, 0x10e9f9f9, 0x06040202, 0x81fe7f7f, + 0xf0a05050, 0x44783c3c, 0xba259f9f, 0xe34ba8a8, + 0xf3a25151, 0xfe5da3a3, 0xc0804040, 0x8a058f8f, + 0xad3f9292, 0xbc219d9d, 0x48703838, 0x04f1f5f5, + 0xdf63bcbc, 0xc177b6b6, 0x75afdada, 0x63422121, + 0x30201010, 0x1ae5ffff, 0x0efdf3f3, 0x6dbfd2d2, + 0x4c81cdcd, 0x14180c0c, 0x35261313, 0x2fc3ecec, + 0xe1be5f5f, 0xa2359797, 0xcc884444, 0x392e1717, + 0x5793c4c4, 0xf255a7a7, 0x82fc7e7e, 0x477a3d3d, + 0xacc86464, 0xe7ba5d5d, 0x2b321919, 0x95e67373, + 0xa0c06060, 0x98198181, 0xd19e4f4f, 0x7fa3dcdc, + 0x66442222, 0x7e542a2a, 0xab3b9090, 0x830b8888, + 0xca8c4646, 0x29c7eeee, 0xd36bb8b8, 0x3c281414, + 0x79a7dede, 0xe2bc5e5e, 0x1d160b0b, 0x76addbdb, + 0x3bdbe0e0, 0x56643232, 0x4e743a3a, 0x1e140a0a, + 0xdb924949, 0x0a0c0606, 0x6c482424, 0xe4b85c5c, + 0x5d9fc2c2, 0x6ebdd3d3, 0xef43acac, 0xa6c46262, + 0xa8399191, 0xa4319595, 0x37d3e4e4, 0x8bf27979, + 0x32d5e7e7, 0x438bc8c8, 0x596e3737, 0xb7da6d6d, + 0x8c018d8d, 0x64b1d5d5, 0xd29c4e4e, 0xe049a9a9, + 0xb4d86c6c, 0xfaac5656, 0x07f3f4f4, 0x25cfeaea, + 0xafca6565, 0x8ef47a7a, 0xe947aeae, 0x18100808, + 0xd56fbaba, 0x88f07878, 0x6f4a2525, 0x725c2e2e, + 0x24381c1c, 0xf157a6a6, 0xc773b4b4, 0x5197c6c6, + 0x23cbe8e8, 0x7ca1dddd, 0x9ce87474, 0x213e1f1f, + 0xdd964b4b, 0xdc61bdbd, 0x860d8b8b, 0x850f8a8a, + 0x90e07070, 0x427c3e3e, 0xc471b5b5, 0xaacc6666, + 0xd8904848, 0x05060303, 0x01f7f6f6, 0x121c0e0e, + 0xa3c26161, 0x5f6a3535, 0xf9ae5757, 0xd069b9b9, + 0x91178686, 0x5899c1c1, 0x273a1d1d, 0xb9279e9e, + 0x38d9e1e1, 0x13ebf8f8, 0xb32b9898, 0x33221111, + 0xbbd26969, 0x70a9d9d9, 0x89078e8e, 0xa7339494, + 0xb62d9b9b, 0x223c1e1e, 0x92158787, 0x20c9e9e9, + 0x4987cece, 0xffaa5555, 0x78502828, 0x7aa5dfdf, + 0x8f038c8c, 0xf859a1a1, 0x80098989, 0x171a0d0d, + 0xda65bfbf, 0x31d7e6e6, 0xc6844242, 0xb8d06868, + 0xc3824141, 0xb0299999, 0x775a2d2d, 0x111e0f0f, + 0xcb7bb0b0, 0xfca85454, 0xd66dbbbb, 0x3a2c1616, +}; + +__device__ __constant__ u32 te2[256] = +{ + 0x63a5c663, 0x7c84f87c, 0x7799ee77, 0x7b8df67b, + 0xf20dfff2, 0x6bbdd66b, 0x6fb1de6f, 0xc55491c5, + 0x30506030, 0x01030201, 0x67a9ce67, 0x2b7d562b, + 0xfe19e7fe, 0xd762b5d7, 0xabe64dab, 0x769aec76, + 0xca458fca, 0x829d1f82, 0xc94089c9, 0x7d87fa7d, + 0xfa15effa, 0x59ebb259, 0x47c98e47, 0xf00bfbf0, + 0xadec41ad, 0xd467b3d4, 0xa2fd5fa2, 0xafea45af, + 0x9cbf239c, 0xa4f753a4, 0x7296e472, 0xc05b9bc0, + 0xb7c275b7, 0xfd1ce1fd, 0x93ae3d93, 0x266a4c26, + 0x365a6c36, 0x3f417e3f, 0xf702f5f7, 0xcc4f83cc, + 0x345c6834, 0xa5f451a5, 0xe534d1e5, 0xf108f9f1, + 0x7193e271, 0xd873abd8, 0x31536231, 0x153f2a15, + 0x040c0804, 0xc75295c7, 0x23654623, 0xc35e9dc3, + 0x18283018, 0x96a13796, 0x050f0a05, 0x9ab52f9a, + 0x07090e07, 0x12362412, 0x809b1b80, 0xe23ddfe2, + 0xeb26cdeb, 0x27694e27, 0xb2cd7fb2, 0x759fea75, + 0x091b1209, 0x839e1d83, 0x2c74582c, 0x1a2e341a, + 0x1b2d361b, 0x6eb2dc6e, 0x5aeeb45a, 0xa0fb5ba0, + 0x52f6a452, 0x3b4d763b, 0xd661b7d6, 0xb3ce7db3, + 0x297b5229, 0xe33edde3, 0x2f715e2f, 0x84971384, + 0x53f5a653, 0xd168b9d1, 0x00000000, 0xed2cc1ed, + 0x20604020, 0xfc1fe3fc, 0xb1c879b1, 0x5bedb65b, + 0x6abed46a, 0xcb468dcb, 0xbed967be, 0x394b7239, + 0x4ade944a, 0x4cd4984c, 0x58e8b058, 0xcf4a85cf, + 0xd06bbbd0, 0xef2ac5ef, 0xaae54faa, 0xfb16edfb, + 0x43c58643, 0x4dd79a4d, 0x33556633, 0x85941185, + 0x45cf8a45, 0xf910e9f9, 0x02060402, 0x7f81fe7f, + 0x50f0a050, 0x3c44783c, 0x9fba259f, 0xa8e34ba8, + 0x51f3a251, 0xa3fe5da3, 0x40c08040, 0x8f8a058f, + 0x92ad3f92, 0x9dbc219d, 0x38487038, 0xf504f1f5, + 0xbcdf63bc, 0xb6c177b6, 0xda75afda, 0x21634221, + 0x10302010, 0xff1ae5ff, 0xf30efdf3, 0xd26dbfd2, + 0xcd4c81cd, 0x0c14180c, 0x13352613, 0xec2fc3ec, + 0x5fe1be5f, 0x97a23597, 0x44cc8844, 0x17392e17, + 0xc45793c4, 0xa7f255a7, 0x7e82fc7e, 0x3d477a3d, + 0x64acc864, 0x5de7ba5d, 0x192b3219, 0x7395e673, + 0x60a0c060, 0x81981981, 0x4fd19e4f, 0xdc7fa3dc, + 0x22664422, 0x2a7e542a, 0x90ab3b90, 0x88830b88, + 0x46ca8c46, 0xee29c7ee, 0xb8d36bb8, 0x143c2814, + 0xde79a7de, 0x5ee2bc5e, 0x0b1d160b, 0xdb76addb, + 0xe03bdbe0, 0x32566432, 0x3a4e743a, 0x0a1e140a, + 0x49db9249, 0x060a0c06, 0x246c4824, 0x5ce4b85c, + 0xc25d9fc2, 0xd36ebdd3, 0xacef43ac, 0x62a6c462, + 0x91a83991, 0x95a43195, 0xe437d3e4, 0x798bf279, + 0xe732d5e7, 0xc8438bc8, 0x37596e37, 0x6db7da6d, + 0x8d8c018d, 0xd564b1d5, 0x4ed29c4e, 0xa9e049a9, + 0x6cb4d86c, 0x56faac56, 0xf407f3f4, 0xea25cfea, + 0x65afca65, 0x7a8ef47a, 0xaee947ae, 0x08181008, + 0xbad56fba, 0x7888f078, 0x256f4a25, 0x2e725c2e, + 0x1c24381c, 0xa6f157a6, 0xb4c773b4, 0xc65197c6, + 0xe823cbe8, 0xdd7ca1dd, 0x749ce874, 0x1f213e1f, + 0x4bdd964b, 0xbddc61bd, 0x8b860d8b, 0x8a850f8a, + 0x7090e070, 0x3e427c3e, 0xb5c471b5, 0x66aacc66, + 0x48d89048, 0x03050603, 0xf601f7f6, 0x0e121c0e, + 0x61a3c261, 0x355f6a35, 0x57f9ae57, 0xb9d069b9, + 0x86911786, 0xc15899c1, 0x1d273a1d, 0x9eb9279e, + 0xe138d9e1, 0xf813ebf8, 0x98b32b98, 0x11332211, + 0x69bbd269, 0xd970a9d9, 0x8e89078e, 0x94a73394, + 0x9bb62d9b, 0x1e223c1e, 0x87921587, 0xe920c9e9, + 0xce4987ce, 0x55ffaa55, 0x28785028, 0xdf7aa5df, + 0x8c8f038c, 0xa1f859a1, 0x89800989, 0x0d171a0d, + 0xbfda65bf, 0xe631d7e6, 0x42c68442, 0x68b8d068, + 0x41c38241, 0x99b02999, 0x2d775a2d, 0x0f111e0f, + 0xb0cb7bb0, 0x54fca854, 0xbbd66dbb, 0x163a2c16, +}; + +__device__ __constant__ u32 te3[256] = +{ + 0x6363a5c6, 0x7c7c84f8, 0x777799ee, 0x7b7b8df6, + 0xf2f20dff, 0x6b6bbdd6, 0x6f6fb1de, 0xc5c55491, + 0x30305060, 0x01010302, 0x6767a9ce, 0x2b2b7d56, + 0xfefe19e7, 0xd7d762b5, 0xababe64d, 0x76769aec, + 0xcaca458f, 0x82829d1f, 0xc9c94089, 0x7d7d87fa, + 0xfafa15ef, 0x5959ebb2, 0x4747c98e, 0xf0f00bfb, + 0xadadec41, 0xd4d467b3, 0xa2a2fd5f, 0xafafea45, + 0x9c9cbf23, 0xa4a4f753, 0x727296e4, 0xc0c05b9b, + 0xb7b7c275, 0xfdfd1ce1, 0x9393ae3d, 0x26266a4c, + 0x36365a6c, 0x3f3f417e, 0xf7f702f5, 0xcccc4f83, + 0x34345c68, 0xa5a5f451, 0xe5e534d1, 0xf1f108f9, + 0x717193e2, 0xd8d873ab, 0x31315362, 0x15153f2a, + 0x04040c08, 0xc7c75295, 0x23236546, 0xc3c35e9d, + 0x18182830, 0x9696a137, 0x05050f0a, 0x9a9ab52f, + 0x0707090e, 0x12123624, 0x80809b1b, 0xe2e23ddf, + 0xebeb26cd, 0x2727694e, 0xb2b2cd7f, 0x75759fea, + 0x09091b12, 0x83839e1d, 0x2c2c7458, 0x1a1a2e34, + 0x1b1b2d36, 0x6e6eb2dc, 0x5a5aeeb4, 0xa0a0fb5b, + 0x5252f6a4, 0x3b3b4d76, 0xd6d661b7, 0xb3b3ce7d, + 0x29297b52, 0xe3e33edd, 0x2f2f715e, 0x84849713, + 0x5353f5a6, 0xd1d168b9, 0x00000000, 0xeded2cc1, + 0x20206040, 0xfcfc1fe3, 0xb1b1c879, 0x5b5bedb6, + 0x6a6abed4, 0xcbcb468d, 0xbebed967, 0x39394b72, + 0x4a4ade94, 0x4c4cd498, 0x5858e8b0, 0xcfcf4a85, + 0xd0d06bbb, 0xefef2ac5, 0xaaaae54f, 0xfbfb16ed, + 0x4343c586, 0x4d4dd79a, 0x33335566, 0x85859411, + 0x4545cf8a, 0xf9f910e9, 0x02020604, 0x7f7f81fe, + 0x5050f0a0, 0x3c3c4478, 0x9f9fba25, 0xa8a8e34b, + 0x5151f3a2, 0xa3a3fe5d, 0x4040c080, 0x8f8f8a05, + 0x9292ad3f, 0x9d9dbc21, 0x38384870, 0xf5f504f1, + 0xbcbcdf63, 0xb6b6c177, 0xdada75af, 0x21216342, + 0x10103020, 0xffff1ae5, 0xf3f30efd, 0xd2d26dbf, + 0xcdcd4c81, 0x0c0c1418, 0x13133526, 0xecec2fc3, + 0x5f5fe1be, 0x9797a235, 0x4444cc88, 0x1717392e, + 0xc4c45793, 0xa7a7f255, 0x7e7e82fc, 0x3d3d477a, + 0x6464acc8, 0x5d5de7ba, 0x19192b32, 0x737395e6, + 0x6060a0c0, 0x81819819, 0x4f4fd19e, 0xdcdc7fa3, + 0x22226644, 0x2a2a7e54, 0x9090ab3b, 0x8888830b, + 0x4646ca8c, 0xeeee29c7, 0xb8b8d36b, 0x14143c28, + 0xdede79a7, 0x5e5ee2bc, 0x0b0b1d16, 0xdbdb76ad, + 0xe0e03bdb, 0x32325664, 0x3a3a4e74, 0x0a0a1e14, + 0x4949db92, 0x06060a0c, 0x24246c48, 0x5c5ce4b8, + 0xc2c25d9f, 0xd3d36ebd, 0xacacef43, 0x6262a6c4, + 0x9191a839, 0x9595a431, 0xe4e437d3, 0x79798bf2, + 0xe7e732d5, 0xc8c8438b, 0x3737596e, 0x6d6db7da, + 0x8d8d8c01, 0xd5d564b1, 0x4e4ed29c, 0xa9a9e049, + 0x6c6cb4d8, 0x5656faac, 0xf4f407f3, 0xeaea25cf, + 0x6565afca, 0x7a7a8ef4, 0xaeaee947, 0x08081810, + 0xbabad56f, 0x787888f0, 0x25256f4a, 0x2e2e725c, + 0x1c1c2438, 0xa6a6f157, 0xb4b4c773, 0xc6c65197, + 0xe8e823cb, 0xdddd7ca1, 0x74749ce8, 0x1f1f213e, + 0x4b4bdd96, 0xbdbddc61, 0x8b8b860d, 0x8a8a850f, + 0x707090e0, 0x3e3e427c, 0xb5b5c471, 0x6666aacc, + 0x4848d890, 0x03030506, 0xf6f601f7, 0x0e0e121c, + 0x6161a3c2, 0x35355f6a, 0x5757f9ae, 0xb9b9d069, + 0x86869117, 0xc1c15899, 0x1d1d273a, 0x9e9eb927, + 0xe1e138d9, 0xf8f813eb, 0x9898b32b, 0x11113322, + 0x6969bbd2, 0xd9d970a9, 0x8e8e8907, 0x9494a733, + 0x9b9bb62d, 0x1e1e223c, 0x87879215, 0xe9e920c9, + 0xcece4987, 0x5555ffaa, 0x28287850, 0xdfdf7aa5, + 0x8c8c8f03, 0xa1a1f859, 0x89898009, 0x0d0d171a, + 0xbfbfda65, 0xe6e631d7, 0x4242c684, 0x6868b8d0, + 0x4141c382, 0x9999b029, 0x2d2d775a, 0x0f0f111e, + 0xb0b0cb7b, 0x5454fca8, 0xbbbbd66d, 0x16163a2c, +}; + +__device__ __constant__ u32 te4[256] = +{ + 0x63636363, 0x7c7c7c7c, 0x77777777, 0x7b7b7b7b, + 0xf2f2f2f2, 0x6b6b6b6b, 0x6f6f6f6f, 0xc5c5c5c5, + 0x30303030, 0x01010101, 0x67676767, 0x2b2b2b2b, + 0xfefefefe, 0xd7d7d7d7, 0xabababab, 0x76767676, + 0xcacacaca, 0x82828282, 0xc9c9c9c9, 0x7d7d7d7d, + 0xfafafafa, 0x59595959, 0x47474747, 0xf0f0f0f0, + 0xadadadad, 0xd4d4d4d4, 0xa2a2a2a2, 0xafafafaf, + 0x9c9c9c9c, 0xa4a4a4a4, 0x72727272, 0xc0c0c0c0, + 0xb7b7b7b7, 0xfdfdfdfd, 0x93939393, 0x26262626, + 0x36363636, 0x3f3f3f3f, 0xf7f7f7f7, 0xcccccccc, + 0x34343434, 0xa5a5a5a5, 0xe5e5e5e5, 0xf1f1f1f1, + 0x71717171, 0xd8d8d8d8, 0x31313131, 0x15151515, + 0x04040404, 0xc7c7c7c7, 0x23232323, 0xc3c3c3c3, + 0x18181818, 0x96969696, 0x05050505, 0x9a9a9a9a, + 0x07070707, 0x12121212, 0x80808080, 0xe2e2e2e2, + 0xebebebeb, 0x27272727, 0xb2b2b2b2, 0x75757575, + 0x09090909, 0x83838383, 0x2c2c2c2c, 0x1a1a1a1a, + 0x1b1b1b1b, 0x6e6e6e6e, 0x5a5a5a5a, 0xa0a0a0a0, + 0x52525252, 0x3b3b3b3b, 0xd6d6d6d6, 0xb3b3b3b3, + 0x29292929, 0xe3e3e3e3, 0x2f2f2f2f, 0x84848484, + 0x53535353, 0xd1d1d1d1, 0x00000000, 0xedededed, + 0x20202020, 0xfcfcfcfc, 0xb1b1b1b1, 0x5b5b5b5b, + 0x6a6a6a6a, 0xcbcbcbcb, 0xbebebebe, 0x39393939, + 0x4a4a4a4a, 0x4c4c4c4c, 0x58585858, 0xcfcfcfcf, + 0xd0d0d0d0, 0xefefefef, 0xaaaaaaaa, 0xfbfbfbfb, + 0x43434343, 0x4d4d4d4d, 0x33333333, 0x85858585, + 0x45454545, 0xf9f9f9f9, 0x02020202, 0x7f7f7f7f, + 0x50505050, 0x3c3c3c3c, 0x9f9f9f9f, 0xa8a8a8a8, + 0x51515151, 0xa3a3a3a3, 0x40404040, 0x8f8f8f8f, + 0x92929292, 0x9d9d9d9d, 0x38383838, 0xf5f5f5f5, + 0xbcbcbcbc, 0xb6b6b6b6, 0xdadadada, 0x21212121, + 0x10101010, 0xffffffff, 0xf3f3f3f3, 0xd2d2d2d2, + 0xcdcdcdcd, 0x0c0c0c0c, 0x13131313, 0xecececec, + 0x5f5f5f5f, 0x97979797, 0x44444444, 0x17171717, + 0xc4c4c4c4, 0xa7a7a7a7, 0x7e7e7e7e, 0x3d3d3d3d, + 0x64646464, 0x5d5d5d5d, 0x19191919, 0x73737373, + 0x60606060, 0x81818181, 0x4f4f4f4f, 0xdcdcdcdc, + 0x22222222, 0x2a2a2a2a, 0x90909090, 0x88888888, + 0x46464646, 0xeeeeeeee, 0xb8b8b8b8, 0x14141414, + 0xdededede, 0x5e5e5e5e, 0x0b0b0b0b, 0xdbdbdbdb, + 0xe0e0e0e0, 0x32323232, 0x3a3a3a3a, 0x0a0a0a0a, + 0x49494949, 0x06060606, 0x24242424, 0x5c5c5c5c, + 0xc2c2c2c2, 0xd3d3d3d3, 0xacacacac, 0x62626262, + 0x91919191, 0x95959595, 0xe4e4e4e4, 0x79797979, + 0xe7e7e7e7, 0xc8c8c8c8, 0x37373737, 0x6d6d6d6d, + 0x8d8d8d8d, 0xd5d5d5d5, 0x4e4e4e4e, 0xa9a9a9a9, + 0x6c6c6c6c, 0x56565656, 0xf4f4f4f4, 0xeaeaeaea, + 0x65656565, 0x7a7a7a7a, 0xaeaeaeae, 0x08080808, + 0xbabababa, 0x78787878, 0x25252525, 0x2e2e2e2e, + 0x1c1c1c1c, 0xa6a6a6a6, 0xb4b4b4b4, 0xc6c6c6c6, + 0xe8e8e8e8, 0xdddddddd, 0x74747474, 0x1f1f1f1f, + 0x4b4b4b4b, 0xbdbdbdbd, 0x8b8b8b8b, 0x8a8a8a8a, + 0x70707070, 0x3e3e3e3e, 0xb5b5b5b5, 0x66666666, + 0x48484848, 0x03030303, 0xf6f6f6f6, 0x0e0e0e0e, + 0x61616161, 0x35353535, 0x57575757, 0xb9b9b9b9, + 0x86868686, 0xc1c1c1c1, 0x1d1d1d1d, 0x9e9e9e9e, + 0xe1e1e1e1, 0xf8f8f8f8, 0x98989898, 0x11111111, + 0x69696969, 0xd9d9d9d9, 0x8e8e8e8e, 0x94949494, + 0x9b9b9b9b, 0x1e1e1e1e, 0x87878787, 0xe9e9e9e9, + 0xcececece, 0x55555555, 0x28282828, 0xdfdfdfdf, + 0x8c8c8c8c, 0xa1a1a1a1, 0x89898989, 0x0d0d0d0d, + 0xbfbfbfbf, 0xe6e6e6e6, 0x42424242, 0x68686868, + 0x41414141, 0x99999999, 0x2d2d2d2d, 0x0f0f0f0f, + 0xb0b0b0b0, 0x54545454, 0xbbbbbbbb, 0x16161616, +}; + +__device__ __constant__ u32 td0[256] = +{ + 0x51f4a750, 0x7e416553, 0x1a17a4c3, 0x3a275e96, + 0x3bab6bcb, 0x1f9d45f1, 0xacfa58ab, 0x4be30393, + 0x2030fa55, 0xad766df6, 0x88cc7691, 0xf5024c25, + 0x4fe5d7fc, 0xc52acbd7, 0x26354480, 0xb562a38f, + 0xdeb15a49, 0x25ba1b67, 0x45ea0e98, 0x5dfec0e1, + 0xc32f7502, 0x814cf012, 0x8d4697a3, 0x6bd3f9c6, + 0x038f5fe7, 0x15929c95, 0xbf6d7aeb, 0x955259da, + 0xd4be832d, 0x587421d3, 0x49e06929, 0x8ec9c844, + 0x75c2896a, 0xf48e7978, 0x99583e6b, 0x27b971dd, + 0xbee14fb6, 0xf088ad17, 0xc920ac66, 0x7dce3ab4, + 0x63df4a18, 0xe51a3182, 0x97513360, 0x62537f45, + 0xb16477e0, 0xbb6bae84, 0xfe81a01c, 0xf9082b94, + 0x70486858, 0x8f45fd19, 0x94de6c87, 0x527bf8b7, + 0xab73d323, 0x724b02e2, 0xe31f8f57, 0x6655ab2a, + 0xb2eb2807, 0x2fb5c203, 0x86c57b9a, 0xd33708a5, + 0x302887f2, 0x23bfa5b2, 0x02036aba, 0xed16825c, + 0x8acf1c2b, 0xa779b492, 0xf307f2f0, 0x4e69e2a1, + 0x65daf4cd, 0x0605bed5, 0xd134621f, 0xc4a6fe8a, + 0x342e539d, 0xa2f355a0, 0x058ae132, 0xa4f6eb75, + 0x0b83ec39, 0x4060efaa, 0x5e719f06, 0xbd6e1051, + 0x3e218af9, 0x96dd063d, 0xdd3e05ae, 0x4de6bd46, + 0x91548db5, 0x71c45d05, 0x0406d46f, 0x605015ff, + 0x1998fb24, 0xd6bde997, 0x894043cc, 0x67d99e77, + 0xb0e842bd, 0x07898b88, 0xe7195b38, 0x79c8eedb, + 0xa17c0a47, 0x7c420fe9, 0xf8841ec9, 0x00000000, + 0x09808683, 0x322bed48, 0x1e1170ac, 0x6c5a724e, + 0xfd0efffb, 0x0f853856, 0x3daed51e, 0x362d3927, + 0x0a0fd964, 0x685ca621, 0x9b5b54d1, 0x24362e3a, + 0x0c0a67b1, 0x9357e70f, 0xb4ee96d2, 0x1b9b919e, + 0x80c0c54f, 0x61dc20a2, 0x5a774b69, 0x1c121a16, + 0xe293ba0a, 0xc0a02ae5, 0x3c22e043, 0x121b171d, + 0x0e090d0b, 0xf28bc7ad, 0x2db6a8b9, 0x141ea9c8, + 0x57f11985, 0xaf75074c, 0xee99ddbb, 0xa37f60fd, + 0xf701269f, 0x5c72f5bc, 0x44663bc5, 0x5bfb7e34, + 0x8b432976, 0xcb23c6dc, 0xb6edfc68, 0xb8e4f163, + 0xd731dcca, 0x42638510, 0x13972240, 0x84c61120, + 0x854a247d, 0xd2bb3df8, 0xaef93211, 0xc729a16d, + 0x1d9e2f4b, 0xdcb230f3, 0x0d8652ec, 0x77c1e3d0, + 0x2bb3166c, 0xa970b999, 0x119448fa, 0x47e96422, + 0xa8fc8cc4, 0xa0f03f1a, 0x567d2cd8, 0x223390ef, + 0x87494ec7, 0xd938d1c1, 0x8ccaa2fe, 0x98d40b36, + 0xa6f581cf, 0xa57ade28, 0xdab78e26, 0x3fadbfa4, + 0x2c3a9de4, 0x5078920d, 0x6a5fcc9b, 0x547e4662, + 0xf68d13c2, 0x90d8b8e8, 0x2e39f75e, 0x82c3aff5, + 0x9f5d80be, 0x69d0937c, 0x6fd52da9, 0xcf2512b3, + 0xc8ac993b, 0x10187da7, 0xe89c636e, 0xdb3bbb7b, + 0xcd267809, 0x6e5918f4, 0xec9ab701, 0x834f9aa8, + 0xe6956e65, 0xaaffe67e, 0x21bccf08, 0xef15e8e6, + 0xbae79bd9, 0x4a6f36ce, 0xea9f09d4, 0x29b07cd6, + 0x31a4b2af, 0x2a3f2331, 0xc6a59430, 0x35a266c0, + 0x744ebc37, 0xfc82caa6, 0xe090d0b0, 0x33a7d815, + 0xf104984a, 0x41ecdaf7, 0x7fcd500e, 0x1791f62f, + 0x764dd68d, 0x43efb04d, 0xccaa4d54, 0xe49604df, + 0x9ed1b5e3, 0x4c6a881b, 0xc12c1fb8, 0x4665517f, + 0x9d5eea04, 0x018c355d, 0xfa877473, 0xfb0b412e, + 0xb3671d5a, 0x92dbd252, 0xe9105633, 0x6dd64713, + 0x9ad7618c, 0x37a10c7a, 0x59f8148e, 0xeb133c89, + 0xcea927ee, 0xb761c935, 0xe11ce5ed, 0x7a47b13c, + 0x9cd2df59, 0x55f2733f, 0x1814ce79, 0x73c737bf, + 0x53f7cdea, 0x5ffdaa5b, 0xdf3d6f14, 0x7844db86, + 0xcaaff381, 0xb968c43e, 0x3824342c, 0xc2a3405f, + 0x161dc372, 0xbce2250c, 0x283c498b, 0xff0d9541, + 0x39a80171, 0x080cb3de, 0xd8b4e49c, 0x6456c190, + 0x7bcb8461, 0xd532b670, 0x486c5c74, 0xd0b85742, +}; + +__device__ __constant__ u32 td1[256] = +{ + 0x5051f4a7, 0x537e4165, 0xc31a17a4, 0x963a275e, + 0xcb3bab6b, 0xf11f9d45, 0xabacfa58, 0x934be303, + 0x552030fa, 0xf6ad766d, 0x9188cc76, 0x25f5024c, + 0xfc4fe5d7, 0xd7c52acb, 0x80263544, 0x8fb562a3, + 0x49deb15a, 0x6725ba1b, 0x9845ea0e, 0xe15dfec0, + 0x02c32f75, 0x12814cf0, 0xa38d4697, 0xc66bd3f9, + 0xe7038f5f, 0x9515929c, 0xebbf6d7a, 0xda955259, + 0x2dd4be83, 0xd3587421, 0x2949e069, 0x448ec9c8, + 0x6a75c289, 0x78f48e79, 0x6b99583e, 0xdd27b971, + 0xb6bee14f, 0x17f088ad, 0x66c920ac, 0xb47dce3a, + 0x1863df4a, 0x82e51a31, 0x60975133, 0x4562537f, + 0xe0b16477, 0x84bb6bae, 0x1cfe81a0, 0x94f9082b, + 0x58704868, 0x198f45fd, 0x8794de6c, 0xb7527bf8, + 0x23ab73d3, 0xe2724b02, 0x57e31f8f, 0x2a6655ab, + 0x07b2eb28, 0x032fb5c2, 0x9a86c57b, 0xa5d33708, + 0xf2302887, 0xb223bfa5, 0xba02036a, 0x5ced1682, + 0x2b8acf1c, 0x92a779b4, 0xf0f307f2, 0xa14e69e2, + 0xcd65daf4, 0xd50605be, 0x1fd13462, 0x8ac4a6fe, + 0x9d342e53, 0xa0a2f355, 0x32058ae1, 0x75a4f6eb, + 0x390b83ec, 0xaa4060ef, 0x065e719f, 0x51bd6e10, + 0xf93e218a, 0x3d96dd06, 0xaedd3e05, 0x464de6bd, + 0xb591548d, 0x0571c45d, 0x6f0406d4, 0xff605015, + 0x241998fb, 0x97d6bde9, 0xcc894043, 0x7767d99e, + 0xbdb0e842, 0x8807898b, 0x38e7195b, 0xdb79c8ee, + 0x47a17c0a, 0xe97c420f, 0xc9f8841e, 0x00000000, + 0x83098086, 0x48322bed, 0xac1e1170, 0x4e6c5a72, + 0xfbfd0eff, 0x560f8538, 0x1e3daed5, 0x27362d39, + 0x640a0fd9, 0x21685ca6, 0xd19b5b54, 0x3a24362e, + 0xb10c0a67, 0x0f9357e7, 0xd2b4ee96, 0x9e1b9b91, + 0x4f80c0c5, 0xa261dc20, 0x695a774b, 0x161c121a, + 0x0ae293ba, 0xe5c0a02a, 0x433c22e0, 0x1d121b17, + 0x0b0e090d, 0xadf28bc7, 0xb92db6a8, 0xc8141ea9, + 0x8557f119, 0x4caf7507, 0xbbee99dd, 0xfda37f60, + 0x9ff70126, 0xbc5c72f5, 0xc544663b, 0x345bfb7e, + 0x768b4329, 0xdccb23c6, 0x68b6edfc, 0x63b8e4f1, + 0xcad731dc, 0x10426385, 0x40139722, 0x2084c611, + 0x7d854a24, 0xf8d2bb3d, 0x11aef932, 0x6dc729a1, + 0x4b1d9e2f, 0xf3dcb230, 0xec0d8652, 0xd077c1e3, + 0x6c2bb316, 0x99a970b9, 0xfa119448, 0x2247e964, + 0xc4a8fc8c, 0x1aa0f03f, 0xd8567d2c, 0xef223390, + 0xc787494e, 0xc1d938d1, 0xfe8ccaa2, 0x3698d40b, + 0xcfa6f581, 0x28a57ade, 0x26dab78e, 0xa43fadbf, + 0xe42c3a9d, 0x0d507892, 0x9b6a5fcc, 0x62547e46, + 0xc2f68d13, 0xe890d8b8, 0x5e2e39f7, 0xf582c3af, + 0xbe9f5d80, 0x7c69d093, 0xa96fd52d, 0xb3cf2512, + 0x3bc8ac99, 0xa710187d, 0x6ee89c63, 0x7bdb3bbb, + 0x09cd2678, 0xf46e5918, 0x01ec9ab7, 0xa8834f9a, + 0x65e6956e, 0x7eaaffe6, 0x0821bccf, 0xe6ef15e8, + 0xd9bae79b, 0xce4a6f36, 0xd4ea9f09, 0xd629b07c, + 0xaf31a4b2, 0x312a3f23, 0x30c6a594, 0xc035a266, + 0x37744ebc, 0xa6fc82ca, 0xb0e090d0, 0x1533a7d8, + 0x4af10498, 0xf741ecda, 0x0e7fcd50, 0x2f1791f6, + 0x8d764dd6, 0x4d43efb0, 0x54ccaa4d, 0xdfe49604, + 0xe39ed1b5, 0x1b4c6a88, 0xb8c12c1f, 0x7f466551, + 0x049d5eea, 0x5d018c35, 0x73fa8774, 0x2efb0b41, + 0x5ab3671d, 0x5292dbd2, 0x33e91056, 0x136dd647, + 0x8c9ad761, 0x7a37a10c, 0x8e59f814, 0x89eb133c, + 0xeecea927, 0x35b761c9, 0xede11ce5, 0x3c7a47b1, + 0x599cd2df, 0x3f55f273, 0x791814ce, 0xbf73c737, + 0xea53f7cd, 0x5b5ffdaa, 0x14df3d6f, 0x867844db, + 0x81caaff3, 0x3eb968c4, 0x2c382434, 0x5fc2a340, + 0x72161dc3, 0x0cbce225, 0x8b283c49, 0x41ff0d95, + 0x7139a801, 0xde080cb3, 0x9cd8b4e4, 0x906456c1, + 0x617bcb84, 0x70d532b6, 0x74486c5c, 0x42d0b857, +}; + +__device__ __constant__ u32 td2[256] = +{ + 0xa75051f4, 0x65537e41, 0xa4c31a17, 0x5e963a27, + 0x6bcb3bab, 0x45f11f9d, 0x58abacfa, 0x03934be3, + 0xfa552030, 0x6df6ad76, 0x769188cc, 0x4c25f502, + 0xd7fc4fe5, 0xcbd7c52a, 0x44802635, 0xa38fb562, + 0x5a49deb1, 0x1b6725ba, 0x0e9845ea, 0xc0e15dfe, + 0x7502c32f, 0xf012814c, 0x97a38d46, 0xf9c66bd3, + 0x5fe7038f, 0x9c951592, 0x7aebbf6d, 0x59da9552, + 0x832dd4be, 0x21d35874, 0x692949e0, 0xc8448ec9, + 0x896a75c2, 0x7978f48e, 0x3e6b9958, 0x71dd27b9, + 0x4fb6bee1, 0xad17f088, 0xac66c920, 0x3ab47dce, + 0x4a1863df, 0x3182e51a, 0x33609751, 0x7f456253, + 0x77e0b164, 0xae84bb6b, 0xa01cfe81, 0x2b94f908, + 0x68587048, 0xfd198f45, 0x6c8794de, 0xf8b7527b, + 0xd323ab73, 0x02e2724b, 0x8f57e31f, 0xab2a6655, + 0x2807b2eb, 0xc2032fb5, 0x7b9a86c5, 0x08a5d337, + 0x87f23028, 0xa5b223bf, 0x6aba0203, 0x825ced16, + 0x1c2b8acf, 0xb492a779, 0xf2f0f307, 0xe2a14e69, + 0xf4cd65da, 0xbed50605, 0x621fd134, 0xfe8ac4a6, + 0x539d342e, 0x55a0a2f3, 0xe132058a, 0xeb75a4f6, + 0xec390b83, 0xefaa4060, 0x9f065e71, 0x1051bd6e, + 0x8af93e21, 0x063d96dd, 0x05aedd3e, 0xbd464de6, + 0x8db59154, 0x5d0571c4, 0xd46f0406, 0x15ff6050, + 0xfb241998, 0xe997d6bd, 0x43cc8940, 0x9e7767d9, + 0x42bdb0e8, 0x8b880789, 0x5b38e719, 0xeedb79c8, + 0x0a47a17c, 0x0fe97c42, 0x1ec9f884, 0x00000000, + 0x86830980, 0xed48322b, 0x70ac1e11, 0x724e6c5a, + 0xfffbfd0e, 0x38560f85, 0xd51e3dae, 0x3927362d, + 0xd9640a0f, 0xa621685c, 0x54d19b5b, 0x2e3a2436, + 0x67b10c0a, 0xe70f9357, 0x96d2b4ee, 0x919e1b9b, + 0xc54f80c0, 0x20a261dc, 0x4b695a77, 0x1a161c12, + 0xba0ae293, 0x2ae5c0a0, 0xe0433c22, 0x171d121b, + 0x0d0b0e09, 0xc7adf28b, 0xa8b92db6, 0xa9c8141e, + 0x198557f1, 0x074caf75, 0xddbbee99, 0x60fda37f, + 0x269ff701, 0xf5bc5c72, 0x3bc54466, 0x7e345bfb, + 0x29768b43, 0xc6dccb23, 0xfc68b6ed, 0xf163b8e4, + 0xdccad731, 0x85104263, 0x22401397, 0x112084c6, + 0x247d854a, 0x3df8d2bb, 0x3211aef9, 0xa16dc729, + 0x2f4b1d9e, 0x30f3dcb2, 0x52ec0d86, 0xe3d077c1, + 0x166c2bb3, 0xb999a970, 0x48fa1194, 0x642247e9, + 0x8cc4a8fc, 0x3f1aa0f0, 0x2cd8567d, 0x90ef2233, + 0x4ec78749, 0xd1c1d938, 0xa2fe8cca, 0x0b3698d4, + 0x81cfa6f5, 0xde28a57a, 0x8e26dab7, 0xbfa43fad, + 0x9de42c3a, 0x920d5078, 0xcc9b6a5f, 0x4662547e, + 0x13c2f68d, 0xb8e890d8, 0xf75e2e39, 0xaff582c3, + 0x80be9f5d, 0x937c69d0, 0x2da96fd5, 0x12b3cf25, + 0x993bc8ac, 0x7da71018, 0x636ee89c, 0xbb7bdb3b, + 0x7809cd26, 0x18f46e59, 0xb701ec9a, 0x9aa8834f, + 0x6e65e695, 0xe67eaaff, 0xcf0821bc, 0xe8e6ef15, + 0x9bd9bae7, 0x36ce4a6f, 0x09d4ea9f, 0x7cd629b0, + 0xb2af31a4, 0x23312a3f, 0x9430c6a5, 0x66c035a2, + 0xbc37744e, 0xcaa6fc82, 0xd0b0e090, 0xd81533a7, + 0x984af104, 0xdaf741ec, 0x500e7fcd, 0xf62f1791, + 0xd68d764d, 0xb04d43ef, 0x4d54ccaa, 0x04dfe496, + 0xb5e39ed1, 0x881b4c6a, 0x1fb8c12c, 0x517f4665, + 0xea049d5e, 0x355d018c, 0x7473fa87, 0x412efb0b, + 0x1d5ab367, 0xd25292db, 0x5633e910, 0x47136dd6, + 0x618c9ad7, 0x0c7a37a1, 0x148e59f8, 0x3c89eb13, + 0x27eecea9, 0xc935b761, 0xe5ede11c, 0xb13c7a47, + 0xdf599cd2, 0x733f55f2, 0xce791814, 0x37bf73c7, + 0xcdea53f7, 0xaa5b5ffd, 0x6f14df3d, 0xdb867844, + 0xf381caaf, 0xc43eb968, 0x342c3824, 0x405fc2a3, + 0xc372161d, 0x250cbce2, 0x498b283c, 0x9541ff0d, + 0x017139a8, 0xb3de080c, 0xe49cd8b4, 0xc1906456, + 0x84617bcb, 0xb670d532, 0x5c74486c, 0x5742d0b8, +}; + +__device__ __constant__ u32 td3[256] = +{ + 0xf4a75051, 0x4165537e, 0x17a4c31a, 0x275e963a, + 0xab6bcb3b, 0x9d45f11f, 0xfa58abac, 0xe303934b, + 0x30fa5520, 0x766df6ad, 0xcc769188, 0x024c25f5, + 0xe5d7fc4f, 0x2acbd7c5, 0x35448026, 0x62a38fb5, + 0xb15a49de, 0xba1b6725, 0xea0e9845, 0xfec0e15d, + 0x2f7502c3, 0x4cf01281, 0x4697a38d, 0xd3f9c66b, + 0x8f5fe703, 0x929c9515, 0x6d7aebbf, 0x5259da95, + 0xbe832dd4, 0x7421d358, 0xe0692949, 0xc9c8448e, + 0xc2896a75, 0x8e7978f4, 0x583e6b99, 0xb971dd27, + 0xe14fb6be, 0x88ad17f0, 0x20ac66c9, 0xce3ab47d, + 0xdf4a1863, 0x1a3182e5, 0x51336097, 0x537f4562, + 0x6477e0b1, 0x6bae84bb, 0x81a01cfe, 0x082b94f9, + 0x48685870, 0x45fd198f, 0xde6c8794, 0x7bf8b752, + 0x73d323ab, 0x4b02e272, 0x1f8f57e3, 0x55ab2a66, + 0xeb2807b2, 0xb5c2032f, 0xc57b9a86, 0x3708a5d3, + 0x2887f230, 0xbfa5b223, 0x036aba02, 0x16825ced, + 0xcf1c2b8a, 0x79b492a7, 0x07f2f0f3, 0x69e2a14e, + 0xdaf4cd65, 0x05bed506, 0x34621fd1, 0xa6fe8ac4, + 0x2e539d34, 0xf355a0a2, 0x8ae13205, 0xf6eb75a4, + 0x83ec390b, 0x60efaa40, 0x719f065e, 0x6e1051bd, + 0x218af93e, 0xdd063d96, 0x3e05aedd, 0xe6bd464d, + 0x548db591, 0xc45d0571, 0x06d46f04, 0x5015ff60, + 0x98fb2419, 0xbde997d6, 0x4043cc89, 0xd99e7767, + 0xe842bdb0, 0x898b8807, 0x195b38e7, 0xc8eedb79, + 0x7c0a47a1, 0x420fe97c, 0x841ec9f8, 0x00000000, + 0x80868309, 0x2bed4832, 0x1170ac1e, 0x5a724e6c, + 0x0efffbfd, 0x8538560f, 0xaed51e3d, 0x2d392736, + 0x0fd9640a, 0x5ca62168, 0x5b54d19b, 0x362e3a24, + 0x0a67b10c, 0x57e70f93, 0xee96d2b4, 0x9b919e1b, + 0xc0c54f80, 0xdc20a261, 0x774b695a, 0x121a161c, + 0x93ba0ae2, 0xa02ae5c0, 0x22e0433c, 0x1b171d12, + 0x090d0b0e, 0x8bc7adf2, 0xb6a8b92d, 0x1ea9c814, + 0xf1198557, 0x75074caf, 0x99ddbbee, 0x7f60fda3, + 0x01269ff7, 0x72f5bc5c, 0x663bc544, 0xfb7e345b, + 0x4329768b, 0x23c6dccb, 0xedfc68b6, 0xe4f163b8, + 0x31dccad7, 0x63851042, 0x97224013, 0xc6112084, + 0x4a247d85, 0xbb3df8d2, 0xf93211ae, 0x29a16dc7, + 0x9e2f4b1d, 0xb230f3dc, 0x8652ec0d, 0xc1e3d077, + 0xb3166c2b, 0x70b999a9, 0x9448fa11, 0xe9642247, + 0xfc8cc4a8, 0xf03f1aa0, 0x7d2cd856, 0x3390ef22, + 0x494ec787, 0x38d1c1d9, 0xcaa2fe8c, 0xd40b3698, + 0xf581cfa6, 0x7ade28a5, 0xb78e26da, 0xadbfa43f, + 0x3a9de42c, 0x78920d50, 0x5fcc9b6a, 0x7e466254, + 0x8d13c2f6, 0xd8b8e890, 0x39f75e2e, 0xc3aff582, + 0x5d80be9f, 0xd0937c69, 0xd52da96f, 0x2512b3cf, + 0xac993bc8, 0x187da710, 0x9c636ee8, 0x3bbb7bdb, + 0x267809cd, 0x5918f46e, 0x9ab701ec, 0x4f9aa883, + 0x956e65e6, 0xffe67eaa, 0xbccf0821, 0x15e8e6ef, + 0xe79bd9ba, 0x6f36ce4a, 0x9f09d4ea, 0xb07cd629, + 0xa4b2af31, 0x3f23312a, 0xa59430c6, 0xa266c035, + 0x4ebc3774, 0x82caa6fc, 0x90d0b0e0, 0xa7d81533, + 0x04984af1, 0xecdaf741, 0xcd500e7f, 0x91f62f17, + 0x4dd68d76, 0xefb04d43, 0xaa4d54cc, 0x9604dfe4, + 0xd1b5e39e, 0x6a881b4c, 0x2c1fb8c1, 0x65517f46, + 0x5eea049d, 0x8c355d01, 0x877473fa, 0x0b412efb, + 0x671d5ab3, 0xdbd25292, 0x105633e9, 0xd647136d, + 0xd7618c9a, 0xa10c7a37, 0xf8148e59, 0x133c89eb, + 0xa927eece, 0x61c935b7, 0x1ce5ede1, 0x47b13c7a, + 0xd2df599c, 0xf2733f55, 0x14ce7918, 0xc737bf73, + 0xf7cdea53, 0xfdaa5b5f, 0x3d6f14df, 0x44db8678, + 0xaff381ca, 0x68c43eb9, 0x24342c38, 0xa3405fc2, + 0x1dc37216, 0xe2250cbc, 0x3c498b28, 0x0d9541ff, + 0xa8017139, 0x0cb3de08, 0xb4e49cd8, 0x56c19064, + 0xcb84617b, 0x32b670d5, 0x6c5c7448, 0xb85742d0, +}; + +__device__ __constant__ u32 td4[256] = +{ + 0x52525252, 0x09090909, 0x6a6a6a6a, 0xd5d5d5d5, + 0x30303030, 0x36363636, 0xa5a5a5a5, 0x38383838, + 0xbfbfbfbf, 0x40404040, 0xa3a3a3a3, 0x9e9e9e9e, + 0x81818181, 0xf3f3f3f3, 0xd7d7d7d7, 0xfbfbfbfb, + 0x7c7c7c7c, 0xe3e3e3e3, 0x39393939, 0x82828282, + 0x9b9b9b9b, 0x2f2f2f2f, 0xffffffff, 0x87878787, + 0x34343434, 0x8e8e8e8e, 0x43434343, 0x44444444, + 0xc4c4c4c4, 0xdededede, 0xe9e9e9e9, 0xcbcbcbcb, + 0x54545454, 0x7b7b7b7b, 0x94949494, 0x32323232, + 0xa6a6a6a6, 0xc2c2c2c2, 0x23232323, 0x3d3d3d3d, + 0xeeeeeeee, 0x4c4c4c4c, 0x95959595, 0x0b0b0b0b, + 0x42424242, 0xfafafafa, 0xc3c3c3c3, 0x4e4e4e4e, + 0x08080808, 0x2e2e2e2e, 0xa1a1a1a1, 0x66666666, + 0x28282828, 0xd9d9d9d9, 0x24242424, 0xb2b2b2b2, + 0x76767676, 0x5b5b5b5b, 0xa2a2a2a2, 0x49494949, + 0x6d6d6d6d, 0x8b8b8b8b, 0xd1d1d1d1, 0x25252525, + 0x72727272, 0xf8f8f8f8, 0xf6f6f6f6, 0x64646464, + 0x86868686, 0x68686868, 0x98989898, 0x16161616, + 0xd4d4d4d4, 0xa4a4a4a4, 0x5c5c5c5c, 0xcccccccc, + 0x5d5d5d5d, 0x65656565, 0xb6b6b6b6, 0x92929292, + 0x6c6c6c6c, 0x70707070, 0x48484848, 0x50505050, + 0xfdfdfdfd, 0xedededed, 0xb9b9b9b9, 0xdadadada, + 0x5e5e5e5e, 0x15151515, 0x46464646, 0x57575757, + 0xa7a7a7a7, 0x8d8d8d8d, 0x9d9d9d9d, 0x84848484, + 0x90909090, 0xd8d8d8d8, 0xabababab, 0x00000000, + 0x8c8c8c8c, 0xbcbcbcbc, 0xd3d3d3d3, 0x0a0a0a0a, + 0xf7f7f7f7, 0xe4e4e4e4, 0x58585858, 0x05050505, + 0xb8b8b8b8, 0xb3b3b3b3, 0x45454545, 0x06060606, + 0xd0d0d0d0, 0x2c2c2c2c, 0x1e1e1e1e, 0x8f8f8f8f, + 0xcacacaca, 0x3f3f3f3f, 0x0f0f0f0f, 0x02020202, + 0xc1c1c1c1, 0xafafafaf, 0xbdbdbdbd, 0x03030303, + 0x01010101, 0x13131313, 0x8a8a8a8a, 0x6b6b6b6b, + 0x3a3a3a3a, 0x91919191, 0x11111111, 0x41414141, + 0x4f4f4f4f, 0x67676767, 0xdcdcdcdc, 0xeaeaeaea, + 0x97979797, 0xf2f2f2f2, 0xcfcfcfcf, 0xcececece, + 0xf0f0f0f0, 0xb4b4b4b4, 0xe6e6e6e6, 0x73737373, + 0x96969696, 0xacacacac, 0x74747474, 0x22222222, + 0xe7e7e7e7, 0xadadadad, 0x35353535, 0x85858585, + 0xe2e2e2e2, 0xf9f9f9f9, 0x37373737, 0xe8e8e8e8, + 0x1c1c1c1c, 0x75757575, 0xdfdfdfdf, 0x6e6e6e6e, + 0x47474747, 0xf1f1f1f1, 0x1a1a1a1a, 0x71717171, + 0x1d1d1d1d, 0x29292929, 0xc5c5c5c5, 0x89898989, + 0x6f6f6f6f, 0xb7b7b7b7, 0x62626262, 0x0e0e0e0e, + 0xaaaaaaaa, 0x18181818, 0xbebebebe, 0x1b1b1b1b, + 0xfcfcfcfc, 0x56565656, 0x3e3e3e3e, 0x4b4b4b4b, + 0xc6c6c6c6, 0xd2d2d2d2, 0x79797979, 0x20202020, + 0x9a9a9a9a, 0xdbdbdbdb, 0xc0c0c0c0, 0xfefefefe, + 0x78787878, 0xcdcdcdcd, 0x5a5a5a5a, 0xf4f4f4f4, + 0x1f1f1f1f, 0xdddddddd, 0xa8a8a8a8, 0x33333333, + 0x88888888, 0x07070707, 0xc7c7c7c7, 0x31313131, + 0xb1b1b1b1, 0x12121212, 0x10101010, 0x59595959, + 0x27272727, 0x80808080, 0xecececec, 0x5f5f5f5f, + 0x60606060, 0x51515151, 0x7f7f7f7f, 0xa9a9a9a9, + 0x19191919, 0xb5b5b5b5, 0x4a4a4a4a, 0x0d0d0d0d, + 0x2d2d2d2d, 0xe5e5e5e5, 0x7a7a7a7a, 0x9f9f9f9f, + 0x93939393, 0xc9c9c9c9, 0x9c9c9c9c, 0xefefefef, + 0xa0a0a0a0, 0xe0e0e0e0, 0x3b3b3b3b, 0x4d4d4d4d, + 0xaeaeaeae, 0x2a2a2a2a, 0xf5f5f5f5, 0xb0b0b0b0, + 0xc8c8c8c8, 0xebebebeb, 0xbbbbbbbb, 0x3c3c3c3c, + 0x83838383, 0x53535353, 0x99999999, 0x61616161, + 0x17171717, 0x2b2b2b2b, 0x04040404, 0x7e7e7e7e, + 0xbabababa, 0x77777777, 0xd6d6d6d6, 0x26262626, + 0xe1e1e1e1, 0x69696969, 0x14141414, 0x63636363, + 0x55555555, 0x21212121, 0x0c0c0c0c, 0x7d7d7d7d, +}; + +__device__ __constant__ u32 rcon[] = +{ + 0x01000000, 0x02000000, 0x04000000, 0x08000000, + 0x10000000, 0x20000000, 0x40000000, 0x80000000, + 0x1b000000, 0x36000000, +}; + +__device__ static void AES256_ExpandKey (u32 *userkey, u32 *rek, u32 s_te0[256], u32 s_te1[256], u32 s_te2[256], u32 s_te3[256], u32 s_te4[256]) +{ + rek[0] = userkey[0]; + rek[1] = userkey[1]; + rek[2] = userkey[2]; + rek[3] = userkey[3]; + rek[4] = userkey[4]; + rek[5] = userkey[5]; + rek[6] = userkey[6]; + rek[7] = userkey[7]; + + int i; + int j; + + i = 0; + j = 0; + + u32 run = 1; + + while (run) + { + u32 temp = rek[j + 7]; + + rek[j + 8] = rek[j + 0] + ^ (s_te2[(temp >> 16) & 0xff] & 0xff000000) + ^ (s_te3[(temp >> 8) & 0xff] & 0x00ff0000) + ^ (s_te0[(temp >> 0) & 0xff] & 0x0000ff00) + ^ (s_te1[(temp >> 24) & 0xff] & 0x000000ff) + ^ rcon[i]; + + rek[j + 9] = rek[j + 1] ^ rek[j + 8]; + rek[j + 10] = rek[j + 2] ^ rek[j + 9]; + rek[j + 11] = rek[j + 3] ^ rek[j + 10]; + + if (++i == 7) + { + run = 0; + continue; + } + + temp = rek[j + 11]; + + rek[j + 12] = rek[j + 4] + ^ (s_te2[(temp >> 24) & 0xff] & 0xff000000) + ^ (s_te3[(temp >> 16) & 0xff] & 0x00ff0000) + ^ (s_te0[(temp >> 8) & 0xff] & 0x0000ff00) + ^ (s_te1[(temp >> 0) & 0xff] & 0x000000ff); + + rek[j + 13] = rek[j + 5] ^ rek[j + 12]; + rek[j + 14] = rek[j + 6] ^ rek[j + 13]; + rek[j + 15] = rek[j + 7] ^ rek[j + 14]; + + j += 8; + } +} + +__device__ static void AES256_InvertKey (u32 *rdk, u32 s_td0[256], u32 s_td1[256], u32 s_td2[256], u32 s_td3[256], u32 s_td4[256], u32 s_te0[256], u32 s_te1[256], u32 s_te2[256], u32 s_te3[256], u32 s_te4[256]) +{ + for (u32 i = 0, j = 56; i < j; i += 4, j -= 4) + { + u32 temp; + + temp = rdk[i + 0]; rdk[i + 0] = rdk[j + 0]; rdk[j + 0] = temp; + temp = rdk[i + 1]; rdk[i + 1] = rdk[j + 1]; rdk[j + 1] = temp; + temp = rdk[i + 2]; rdk[i + 2] = rdk[j + 2]; rdk[j + 2] = temp; + temp = rdk[i + 3]; rdk[i + 3] = rdk[j + 3]; rdk[j + 3] = temp; + } + + for (u32 i = 1, j = 4; i < 14; i += 1, j += 4) + { + rdk[j + 0] = + s_td0[s_te1[(rdk[j + 0] >> 24) & 0xff] & 0xff] ^ + s_td1[s_te1[(rdk[j + 0] >> 16) & 0xff] & 0xff] ^ + s_td2[s_te1[(rdk[j + 0] >> 8) & 0xff] & 0xff] ^ + s_td3[s_te1[(rdk[j + 0] >> 0) & 0xff] & 0xff]; + + rdk[j + 1] = + s_td0[s_te1[(rdk[j + 1] >> 24) & 0xff] & 0xff] ^ + s_td1[s_te1[(rdk[j + 1] >> 16) & 0xff] & 0xff] ^ + s_td2[s_te1[(rdk[j + 1] >> 8) & 0xff] & 0xff] ^ + s_td3[s_te1[(rdk[j + 1] >> 0) & 0xff] & 0xff]; + + rdk[j + 2] = + s_td0[s_te1[(rdk[j + 2] >> 24) & 0xff] & 0xff] ^ + s_td1[s_te1[(rdk[j + 2] >> 16) & 0xff] & 0xff] ^ + s_td2[s_te1[(rdk[j + 2] >> 8) & 0xff] & 0xff] ^ + s_td3[s_te1[(rdk[j + 2] >> 0) & 0xff] & 0xff]; + + rdk[j + 3] = + s_td0[s_te1[(rdk[j + 3] >> 24) & 0xff] & 0xff] ^ + s_td1[s_te1[(rdk[j + 3] >> 16) & 0xff] & 0xff] ^ + s_td2[s_te1[(rdk[j + 3] >> 8) & 0xff] & 0xff] ^ + s_td3[s_te1[(rdk[j + 3] >> 0) & 0xff] & 0xff]; + } +} + +__device__ static void AES256_decrypt (const u32 *in, u32 *out, const u32 *rdk, u32 s_td0[256], u32 s_td1[256], u32 s_td2[256], u32 s_td3[256], u32 s_td4[256]) +{ + u32 s0 = in[0] ^ rdk[0]; + u32 s1 = in[1] ^ rdk[1]; + u32 s2 = in[2] ^ rdk[2]; + u32 s3 = in[3] ^ rdk[3]; + + u32 t0; + u32 t1; + u32 t2; + u32 t3; + + t0 = s_td0[s0 >> 24] ^ s_td1[(s3 >> 16) & 0xff] ^ s_td2[(s2 >> 8) & 0xff] ^ s_td3[s1 & 0xff] ^ rdk[ 4]; + t1 = s_td0[s1 >> 24] ^ s_td1[(s0 >> 16) & 0xff] ^ s_td2[(s3 >> 8) & 0xff] ^ s_td3[s2 & 0xff] ^ rdk[ 5]; + t2 = s_td0[s2 >> 24] ^ s_td1[(s1 >> 16) & 0xff] ^ s_td2[(s0 >> 8) & 0xff] ^ s_td3[s3 & 0xff] ^ rdk[ 6]; + t3 = s_td0[s3 >> 24] ^ s_td1[(s2 >> 16) & 0xff] ^ s_td2[(s1 >> 8) & 0xff] ^ s_td3[s0 & 0xff] ^ rdk[ 7]; + s0 = s_td0[t0 >> 24] ^ s_td1[(t3 >> 16) & 0xff] ^ s_td2[(t2 >> 8) & 0xff] ^ s_td3[t1 & 0xff] ^ rdk[ 8]; + s1 = s_td0[t1 >> 24] ^ s_td1[(t0 >> 16) & 0xff] ^ s_td2[(t3 >> 8) & 0xff] ^ s_td3[t2 & 0xff] ^ rdk[ 9]; + s2 = s_td0[t2 >> 24] ^ s_td1[(t1 >> 16) & 0xff] ^ s_td2[(t0 >> 8) & 0xff] ^ s_td3[t3 & 0xff] ^ rdk[10]; + s3 = s_td0[t3 >> 24] ^ s_td1[(t2 >> 16) & 0xff] ^ s_td2[(t1 >> 8) & 0xff] ^ s_td3[t0 & 0xff] ^ rdk[11]; + t0 = s_td0[s0 >> 24] ^ s_td1[(s3 >> 16) & 0xff] ^ s_td2[(s2 >> 8) & 0xff] ^ s_td3[s1 & 0xff] ^ rdk[12]; + t1 = s_td0[s1 >> 24] ^ s_td1[(s0 >> 16) & 0xff] ^ s_td2[(s3 >> 8) & 0xff] ^ s_td3[s2 & 0xff] ^ rdk[13]; + t2 = s_td0[s2 >> 24] ^ s_td1[(s1 >> 16) & 0xff] ^ s_td2[(s0 >> 8) & 0xff] ^ s_td3[s3 & 0xff] ^ rdk[14]; + t3 = s_td0[s3 >> 24] ^ s_td1[(s2 >> 16) & 0xff] ^ s_td2[(s1 >> 8) & 0xff] ^ s_td3[s0 & 0xff] ^ rdk[15]; + s0 = s_td0[t0 >> 24] ^ s_td1[(t3 >> 16) & 0xff] ^ s_td2[(t2 >> 8) & 0xff] ^ s_td3[t1 & 0xff] ^ rdk[16]; + s1 = s_td0[t1 >> 24] ^ s_td1[(t0 >> 16) & 0xff] ^ s_td2[(t3 >> 8) & 0xff] ^ s_td3[t2 & 0xff] ^ rdk[17]; + s2 = s_td0[t2 >> 24] ^ s_td1[(t1 >> 16) & 0xff] ^ s_td2[(t0 >> 8) & 0xff] ^ s_td3[t3 & 0xff] ^ rdk[18]; + s3 = s_td0[t3 >> 24] ^ s_td1[(t2 >> 16) & 0xff] ^ s_td2[(t1 >> 8) & 0xff] ^ s_td3[t0 & 0xff] ^ rdk[19]; + t0 = s_td0[s0 >> 24] ^ s_td1[(s3 >> 16) & 0xff] ^ s_td2[(s2 >> 8) & 0xff] ^ s_td3[s1 & 0xff] ^ rdk[20]; + t1 = s_td0[s1 >> 24] ^ s_td1[(s0 >> 16) & 0xff] ^ s_td2[(s3 >> 8) & 0xff] ^ s_td3[s2 & 0xff] ^ rdk[21]; + t2 = s_td0[s2 >> 24] ^ s_td1[(s1 >> 16) & 0xff] ^ s_td2[(s0 >> 8) & 0xff] ^ s_td3[s3 & 0xff] ^ rdk[22]; + t3 = s_td0[s3 >> 24] ^ s_td1[(s2 >> 16) & 0xff] ^ s_td2[(s1 >> 8) & 0xff] ^ s_td3[s0 & 0xff] ^ rdk[23]; + s0 = s_td0[t0 >> 24] ^ s_td1[(t3 >> 16) & 0xff] ^ s_td2[(t2 >> 8) & 0xff] ^ s_td3[t1 & 0xff] ^ rdk[24]; + s1 = s_td0[t1 >> 24] ^ s_td1[(t0 >> 16) & 0xff] ^ s_td2[(t3 >> 8) & 0xff] ^ s_td3[t2 & 0xff] ^ rdk[25]; + s2 = s_td0[t2 >> 24] ^ s_td1[(t1 >> 16) & 0xff] ^ s_td2[(t0 >> 8) & 0xff] ^ s_td3[t3 & 0xff] ^ rdk[26]; + s3 = s_td0[t3 >> 24] ^ s_td1[(t2 >> 16) & 0xff] ^ s_td2[(t1 >> 8) & 0xff] ^ s_td3[t0 & 0xff] ^ rdk[27]; + t0 = s_td0[s0 >> 24] ^ s_td1[(s3 >> 16) & 0xff] ^ s_td2[(s2 >> 8) & 0xff] ^ s_td3[s1 & 0xff] ^ rdk[28]; + t1 = s_td0[s1 >> 24] ^ s_td1[(s0 >> 16) & 0xff] ^ s_td2[(s3 >> 8) & 0xff] ^ s_td3[s2 & 0xff] ^ rdk[29]; + t2 = s_td0[s2 >> 24] ^ s_td1[(s1 >> 16) & 0xff] ^ s_td2[(s0 >> 8) & 0xff] ^ s_td3[s3 & 0xff] ^ rdk[30]; + t3 = s_td0[s3 >> 24] ^ s_td1[(s2 >> 16) & 0xff] ^ s_td2[(s1 >> 8) & 0xff] ^ s_td3[s0 & 0xff] ^ rdk[31]; + s0 = s_td0[t0 >> 24] ^ s_td1[(t3 >> 16) & 0xff] ^ s_td2[(t2 >> 8) & 0xff] ^ s_td3[t1 & 0xff] ^ rdk[32]; + s1 = s_td0[t1 >> 24] ^ s_td1[(t0 >> 16) & 0xff] ^ s_td2[(t3 >> 8) & 0xff] ^ s_td3[t2 & 0xff] ^ rdk[33]; + s2 = s_td0[t2 >> 24] ^ s_td1[(t1 >> 16) & 0xff] ^ s_td2[(t0 >> 8) & 0xff] ^ s_td3[t3 & 0xff] ^ rdk[34]; + s3 = s_td0[t3 >> 24] ^ s_td1[(t2 >> 16) & 0xff] ^ s_td2[(t1 >> 8) & 0xff] ^ s_td3[t0 & 0xff] ^ rdk[35]; + t0 = s_td0[s0 >> 24] ^ s_td1[(s3 >> 16) & 0xff] ^ s_td2[(s2 >> 8) & 0xff] ^ s_td3[s1 & 0xff] ^ rdk[36]; + t1 = s_td0[s1 >> 24] ^ s_td1[(s0 >> 16) & 0xff] ^ s_td2[(s3 >> 8) & 0xff] ^ s_td3[s2 & 0xff] ^ rdk[37]; + t2 = s_td0[s2 >> 24] ^ s_td1[(s1 >> 16) & 0xff] ^ s_td2[(s0 >> 8) & 0xff] ^ s_td3[s3 & 0xff] ^ rdk[38]; + t3 = s_td0[s3 >> 24] ^ s_td1[(s2 >> 16) & 0xff] ^ s_td2[(s1 >> 8) & 0xff] ^ s_td3[s0 & 0xff] ^ rdk[39]; + s0 = s_td0[t0 >> 24] ^ s_td1[(t3 >> 16) & 0xff] ^ s_td2[(t2 >> 8) & 0xff] ^ s_td3[t1 & 0xff] ^ rdk[40]; + s1 = s_td0[t1 >> 24] ^ s_td1[(t0 >> 16) & 0xff] ^ s_td2[(t3 >> 8) & 0xff] ^ s_td3[t2 & 0xff] ^ rdk[41]; + s2 = s_td0[t2 >> 24] ^ s_td1[(t1 >> 16) & 0xff] ^ s_td2[(t0 >> 8) & 0xff] ^ s_td3[t3 & 0xff] ^ rdk[42]; + s3 = s_td0[t3 >> 24] ^ s_td1[(t2 >> 16) & 0xff] ^ s_td2[(t1 >> 8) & 0xff] ^ s_td3[t0 & 0xff] ^ rdk[43]; + t0 = s_td0[s0 >> 24] ^ s_td1[(s3 >> 16) & 0xff] ^ s_td2[(s2 >> 8) & 0xff] ^ s_td3[s1 & 0xff] ^ rdk[44]; + t1 = s_td0[s1 >> 24] ^ s_td1[(s0 >> 16) & 0xff] ^ s_td2[(s3 >> 8) & 0xff] ^ s_td3[s2 & 0xff] ^ rdk[45]; + t2 = s_td0[s2 >> 24] ^ s_td1[(s1 >> 16) & 0xff] ^ s_td2[(s0 >> 8) & 0xff] ^ s_td3[s3 & 0xff] ^ rdk[46]; + t3 = s_td0[s3 >> 24] ^ s_td1[(s2 >> 16) & 0xff] ^ s_td2[(s1 >> 8) & 0xff] ^ s_td3[s0 & 0xff] ^ rdk[47]; + s0 = s_td0[t0 >> 24] ^ s_td1[(t3 >> 16) & 0xff] ^ s_td2[(t2 >> 8) & 0xff] ^ s_td3[t1 & 0xff] ^ rdk[48]; + s1 = s_td0[t1 >> 24] ^ s_td1[(t0 >> 16) & 0xff] ^ s_td2[(t3 >> 8) & 0xff] ^ s_td3[t2 & 0xff] ^ rdk[49]; + s2 = s_td0[t2 >> 24] ^ s_td1[(t1 >> 16) & 0xff] ^ s_td2[(t0 >> 8) & 0xff] ^ s_td3[t3 & 0xff] ^ rdk[50]; + s3 = s_td0[t3 >> 24] ^ s_td1[(t2 >> 16) & 0xff] ^ s_td2[(t1 >> 8) & 0xff] ^ s_td3[t0 & 0xff] ^ rdk[51]; + t0 = s_td0[s0 >> 24] ^ s_td1[(s3 >> 16) & 0xff] ^ s_td2[(s2 >> 8) & 0xff] ^ s_td3[s1 & 0xff] ^ rdk[52]; + t1 = s_td0[s1 >> 24] ^ s_td1[(s0 >> 16) & 0xff] ^ s_td2[(s3 >> 8) & 0xff] ^ s_td3[s2 & 0xff] ^ rdk[53]; + t2 = s_td0[s2 >> 24] ^ s_td1[(s1 >> 16) & 0xff] ^ s_td2[(s0 >> 8) & 0xff] ^ s_td3[s3 & 0xff] ^ rdk[54]; + t3 = s_td0[s3 >> 24] ^ s_td1[(s2 >> 16) & 0xff] ^ s_td2[(s1 >> 8) & 0xff] ^ s_td3[s0 & 0xff] ^ rdk[55]; + + out[0] = (s_td4[(t0 >> 24) & 0xff] & 0xff000000) + ^ (s_td4[(t3 >> 16) & 0xff] & 0x00ff0000) + ^ (s_td4[(t2 >> 8) & 0xff] & 0x0000ff00) + ^ (s_td4[(t1 >> 0) & 0xff] & 0x000000ff) + ^ rdk[56]; + + out[1] = (s_td4[(t1 >> 24) & 0xff] & 0xff000000) + ^ (s_td4[(t0 >> 16) & 0xff] & 0x00ff0000) + ^ (s_td4[(t3 >> 8) & 0xff] & 0x0000ff00) + ^ (s_td4[(t2 >> 0) & 0xff] & 0x000000ff) + ^ rdk[57]; + + out[2] = (s_td4[(t2 >> 24) & 0xff] & 0xff000000) + ^ (s_td4[(t1 >> 16) & 0xff] & 0x00ff0000) + ^ (s_td4[(t0 >> 8) & 0xff] & 0x0000ff00) + ^ (s_td4[(t3 >> 0) & 0xff] & 0x000000ff) + ^ rdk[58]; + + out[3] = (s_td4[(t3 >> 24) & 0xff] & 0xff000000) + ^ (s_td4[(t2 >> 16) & 0xff] & 0x00ff0000) + ^ (s_td4[(t1 >> 8) & 0xff] & 0x0000ff00) + ^ (s_td4[(t0 >> 0) & 0xff] & 0x000000ff) + ^ rdk[59]; +} + +__device__ static void sha1_transform (const u32x w0[4], const u32x w1[4], const u32x w2[4], const u32x w3[4], u32x digest[5]) +{ + u32x A = digest[0]; + u32x B = digest[1]; + u32x C = digest[2]; + u32x D = digest[3]; + u32x E = digest[4]; + + u32x w0_t = w0[0]; + u32x w1_t = w0[1]; + u32x w2_t = w0[2]; + u32x w3_t = w0[3]; + u32x w4_t = w1[0]; + u32x w5_t = w1[1]; + u32x w6_t = w1[2]; + u32x w7_t = w1[3]; + u32x w8_t = w2[0]; + u32x w9_t = w2[1]; + u32x wa_t = w2[2]; + u32x wb_t = w2[3]; + u32x wc_t = w3[0]; + u32x wd_t = w3[1]; + u32x we_t = w3[2]; + u32x wf_t = w3[3]; + + #undef K + #define K SHA1C00 + + SHA1_STEP (SHA1_F0o, A, B, C, D, E, w0_t); + SHA1_STEP (SHA1_F0o, E, A, B, C, D, w1_t); + SHA1_STEP (SHA1_F0o, D, E, A, B, C, w2_t); + SHA1_STEP (SHA1_F0o, C, D, E, A, B, w3_t); + SHA1_STEP (SHA1_F0o, B, C, D, E, A, w4_t); + SHA1_STEP (SHA1_F0o, A, B, C, D, E, w5_t); + SHA1_STEP (SHA1_F0o, E, A, B, C, D, w6_t); + SHA1_STEP (SHA1_F0o, D, E, A, B, C, w7_t); + SHA1_STEP (SHA1_F0o, C, D, E, A, B, w8_t); + SHA1_STEP (SHA1_F0o, B, C, D, E, A, w9_t); + SHA1_STEP (SHA1_F0o, A, B, C, D, E, wa_t); + SHA1_STEP (SHA1_F0o, E, A, B, C, D, wb_t); + SHA1_STEP (SHA1_F0o, D, E, A, B, C, wc_t); + SHA1_STEP (SHA1_F0o, C, D, E, A, B, wd_t); + SHA1_STEP (SHA1_F0o, B, C, D, E, A, we_t); + SHA1_STEP (SHA1_F0o, A, B, C, D, E, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F0o, E, A, B, C, D, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F0o, D, E, A, B, C, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F0o, C, D, E, A, B, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F0o, B, C, D, E, A, w3_t); + + #undef K + #define K SHA1C01 + + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w7_t); + + #undef K + #define K SHA1C02 + + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F2o, A, B, C, D, E, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F2o, E, A, B, C, D, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F2o, D, E, A, B, C, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F2o, C, D, E, A, B, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F2o, B, C, D, E, A, wb_t); + + #undef K + #define K SHA1C03 + + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, wf_t); + w0_t = rotl32 ((wd_t ^ w8_t ^ w2_t ^ w0_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w0_t); + w1_t = rotl32 ((we_t ^ w9_t ^ w3_t ^ w1_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w1_t); + w2_t = rotl32 ((wf_t ^ wa_t ^ w4_t ^ w2_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w2_t); + w3_t = rotl32 ((w0_t ^ wb_t ^ w5_t ^ w3_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w3_t); + w4_t = rotl32 ((w1_t ^ wc_t ^ w6_t ^ w4_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w4_t); + w5_t = rotl32 ((w2_t ^ wd_t ^ w7_t ^ w5_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, w5_t); + w6_t = rotl32 ((w3_t ^ we_t ^ w8_t ^ w6_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, w6_t); + w7_t = rotl32 ((w4_t ^ wf_t ^ w9_t ^ w7_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, w7_t); + w8_t = rotl32 ((w5_t ^ w0_t ^ wa_t ^ w8_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, w8_t); + w9_t = rotl32 ((w6_t ^ w1_t ^ wb_t ^ w9_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, w9_t); + wa_t = rotl32 ((w7_t ^ w2_t ^ wc_t ^ wa_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, wa_t); + wb_t = rotl32 ((w8_t ^ w3_t ^ wd_t ^ wb_t), 1u); SHA1_STEP (SHA1_F1, A, B, C, D, E, wb_t); + wc_t = rotl32 ((w9_t ^ w4_t ^ we_t ^ wc_t), 1u); SHA1_STEP (SHA1_F1, E, A, B, C, D, wc_t); + wd_t = rotl32 ((wa_t ^ w5_t ^ wf_t ^ wd_t), 1u); SHA1_STEP (SHA1_F1, D, E, A, B, C, wd_t); + we_t = rotl32 ((wb_t ^ w6_t ^ w0_t ^ we_t), 1u); SHA1_STEP (SHA1_F1, C, D, E, A, B, we_t); + wf_t = rotl32 ((wc_t ^ w7_t ^ w1_t ^ wf_t), 1u); SHA1_STEP (SHA1_F1, B, C, D, E, A, wf_t); + + digest[0] += A; + digest[1] += B; + digest[2] += C; + digest[3] += D; + digest[4] += E; +} + +__device__ static void hmac_sha1_pad (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], u32x ipad[5], u32x opad[5]) +{ + w0[0] = w0[0] ^ 0x36363636; + w0[1] = w0[1] ^ 0x36363636; + w0[2] = w0[2] ^ 0x36363636; + w0[3] = w0[3] ^ 0x36363636; + w1[0] = w1[0] ^ 0x36363636; + w1[1] = w1[1] ^ 0x36363636; + w1[2] = w1[2] ^ 0x36363636; + w1[3] = w1[3] ^ 0x36363636; + w2[0] = w2[0] ^ 0x36363636; + w2[1] = w2[1] ^ 0x36363636; + w2[2] = w2[2] ^ 0x36363636; + w2[3] = w2[3] ^ 0x36363636; + w3[0] = w3[0] ^ 0x36363636; + w3[1] = w3[1] ^ 0x36363636; + w3[2] = w3[2] ^ 0x36363636; + w3[3] = w3[3] ^ 0x36363636; + + ipad[0] = SHA1M_A; + ipad[1] = SHA1M_B; + ipad[2] = SHA1M_C; + ipad[3] = SHA1M_D; + ipad[4] = SHA1M_E; + + sha1_transform (w0, w1, w2, w3, ipad); + + w0[0] = w0[0] ^ 0x6a6a6a6a; + w0[1] = w0[1] ^ 0x6a6a6a6a; + w0[2] = w0[2] ^ 0x6a6a6a6a; + w0[3] = w0[3] ^ 0x6a6a6a6a; + w1[0] = w1[0] ^ 0x6a6a6a6a; + w1[1] = w1[1] ^ 0x6a6a6a6a; + w1[2] = w1[2] ^ 0x6a6a6a6a; + w1[3] = w1[3] ^ 0x6a6a6a6a; + w2[0] = w2[0] ^ 0x6a6a6a6a; + w2[1] = w2[1] ^ 0x6a6a6a6a; + w2[2] = w2[2] ^ 0x6a6a6a6a; + w2[3] = w2[3] ^ 0x6a6a6a6a; + w3[0] = w3[0] ^ 0x6a6a6a6a; + w3[1] = w3[1] ^ 0x6a6a6a6a; + w3[2] = w3[2] ^ 0x6a6a6a6a; + w3[3] = w3[3] ^ 0x6a6a6a6a; + + opad[0] = SHA1M_A; + opad[1] = SHA1M_B; + opad[2] = SHA1M_C; + opad[3] = SHA1M_D; + opad[4] = SHA1M_E; + + sha1_transform (w0, w1, w2, w3, opad); +} + +__device__ static void hmac_sha1_run (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], u32x ipad[5], u32x opad[5], u32x digest[5]) +{ + digest[0] = ipad[0]; + digest[1] = ipad[1]; + digest[2] = ipad[2]; + digest[3] = ipad[3]; + digest[4] = ipad[4]; + + sha1_transform (w0, w1, w2, w3, digest); + + w0[0] = digest[0]; + w0[1] = digest[1]; + w0[2] = digest[2]; + w0[3] = digest[3]; + w1[0] = digest[4]; + w1[1] = 0x80000000; + w1[2] = 0; + w1[3] = 0; + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = (64 + 20) * 8; + + digest[0] = opad[0]; + digest[1] = opad[1]; + digest[2] = opad[2]; + digest[3] = opad[3]; + digest[4] = opad[4]; + + sha1_transform (w0, w1, w2, w3, digest); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m12700_init (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, mywallet_tmp_t *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x w0[4]; + + w0[0] = pws[gid].i[ 0]; + w0[1] = pws[gid].i[ 1]; + w0[2] = pws[gid].i[ 2]; + w0[3] = pws[gid].i[ 3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[ 4]; + w1[1] = pws[gid].i[ 5]; + w1[2] = pws[gid].i[ 6]; + w1[3] = pws[gid].i[ 7]; + + u32x w2[4]; + + w2[0] = pws[gid].i[ 8]; + w2[1] = pws[gid].i[ 9]; + w2[2] = pws[gid].i[10]; + w2[3] = pws[gid].i[11]; + + u32x w3[4]; + + w3[0] = pws[gid].i[12]; + w3[1] = pws[gid].i[13]; + w3[2] = pws[gid].i[14]; + w3[3] = pws[gid].i[15]; + + /** + * salt + */ + + u32 salt_len = 16; + + u32 salt_buf[4]; + + salt_buf[0] = salt_bufs[salt_pos].salt_buf[0]; + salt_buf[1] = salt_bufs[salt_pos].salt_buf[1]; + salt_buf[2] = salt_bufs[salt_pos].salt_buf[2]; + salt_buf[3] = salt_bufs[salt_pos].salt_buf[3]; + + /** + * pads + */ + + w0[0] = swap_workaround (w0[0]); + w0[1] = swap_workaround (w0[1]); + w0[2] = swap_workaround (w0[2]); + w0[3] = swap_workaround (w0[3]); + w1[0] = swap_workaround (w1[0]); + w1[1] = swap_workaround (w1[1]); + w1[2] = swap_workaround (w1[2]); + w1[3] = swap_workaround (w1[3]); + w2[0] = swap_workaround (w2[0]); + w2[1] = swap_workaround (w2[1]); + w2[2] = swap_workaround (w2[2]); + w2[3] = swap_workaround (w2[3]); + w3[0] = swap_workaround (w3[0]); + w3[1] = swap_workaround (w3[1]); + w3[2] = swap_workaround (w3[2]); + w3[3] = swap_workaround (w3[3]); + + u32x ipad[5]; + u32x opad[5]; + + hmac_sha1_pad (w0, w1, w2, w3, ipad, opad); + + tmps[gid].ipad[0] = ipad[0]; + tmps[gid].ipad[1] = ipad[1]; + tmps[gid].ipad[2] = ipad[2]; + tmps[gid].ipad[3] = ipad[3]; + tmps[gid].ipad[4] = ipad[4]; + + tmps[gid].opad[0] = opad[0]; + tmps[gid].opad[1] = opad[1]; + tmps[gid].opad[2] = opad[2]; + tmps[gid].opad[3] = opad[3]; + tmps[gid].opad[4] = opad[4]; + + // first 160 bits + + { + w0[0] = salt_buf[0]; + w0[1] = salt_buf[1]; + w0[2] = salt_buf[2]; + w0[3] = salt_buf[3]; + w1[0] = 0x00000001; + w1[1] = 0x80000000; + w1[2] = 0; + w1[3] = 0; + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = (64 + salt_len + 4) * 8; + + u32x dgst1[5]; + + hmac_sha1_run (w0, w1, w2, w3, ipad, opad, dgst1); + + tmps[gid].dgst1[0] = dgst1[0]; + tmps[gid].dgst1[1] = dgst1[1]; + tmps[gid].dgst1[2] = dgst1[2]; + tmps[gid].dgst1[3] = dgst1[3]; + tmps[gid].dgst1[4] = dgst1[4]; + + tmps[gid].out1[0] = dgst1[0]; + tmps[gid].out1[1] = dgst1[1]; + tmps[gid].out1[2] = dgst1[2]; + tmps[gid].out1[3] = dgst1[3]; + tmps[gid].out1[4] = dgst1[4]; + } + + // second 160 bits + + { + w0[0] = salt_buf[0]; + w0[1] = salt_buf[1]; + w0[2] = salt_buf[2]; + w0[3] = salt_buf[3]; + w1[0] = 0x00000002; + w1[1] = 0x80000000; + w1[2] = 0; + w1[3] = 0; + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = (64 + salt_len + 4) * 8; + + u32x dgst2[5]; + + hmac_sha1_run (w0, w1, w2, w3, ipad, opad, dgst2); + + tmps[gid].dgst2[0] = dgst2[0]; + tmps[gid].dgst2[1] = dgst2[1]; + tmps[gid].dgst2[2] = dgst2[2]; + tmps[gid].dgst2[3] = dgst2[3]; + tmps[gid].dgst2[4] = dgst2[4]; + + tmps[gid].out2[0] = dgst2[0]; + tmps[gid].out2[1] = dgst2[1]; + tmps[gid].out2[2] = dgst2[2]; + tmps[gid].out2[3] = dgst2[3]; + tmps[gid].out2[4] = dgst2[4]; + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m12700_loop (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, mywallet_tmp_t *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32x ipad[5]; + u32x opad[5]; + + ipad[0] = tmps[gid].ipad[0]; + ipad[1] = tmps[gid].ipad[1]; + ipad[2] = tmps[gid].ipad[2]; + ipad[3] = tmps[gid].ipad[3]; + ipad[4] = tmps[gid].ipad[4]; + + opad[0] = tmps[gid].opad[0]; + opad[1] = tmps[gid].opad[1]; + opad[2] = tmps[gid].opad[2]; + opad[3] = tmps[gid].opad[3]; + opad[4] = tmps[gid].opad[4]; + + // first 160 bits + + { + u32x dgst1[5]; + u32x out1[5]; + + dgst1[0] = tmps[gid].dgst1[0]; + dgst1[1] = tmps[gid].dgst1[1]; + dgst1[2] = tmps[gid].dgst1[2]; + dgst1[3] = tmps[gid].dgst1[3]; + dgst1[4] = tmps[gid].dgst1[4]; + + out1[0] = tmps[gid].out1[0]; + out1[1] = tmps[gid].out1[1]; + out1[2] = tmps[gid].out1[2]; + out1[3] = tmps[gid].out1[3]; + out1[4] = tmps[gid].out1[4]; + + for (u32 j = 0; j < loop_cnt; j++) + { + u32x w0[4]; + u32x w1[4]; + u32x w2[4]; + u32x w3[4]; + + w0[0] = dgst1[0]; + w0[1] = dgst1[1]; + w0[2] = dgst1[2]; + w0[3] = dgst1[3]; + w1[0] = dgst1[4]; + w1[1] = 0x80000000; + w1[2] = 0; + w1[3] = 0; + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = (64 + 20) * 8; + + hmac_sha1_run (w0, w1, w2, w3, ipad, opad, dgst1); + + out1[0] ^= dgst1[0]; + out1[1] ^= dgst1[1]; + out1[2] ^= dgst1[2]; + out1[3] ^= dgst1[3]; + out1[4] ^= dgst1[4]; + } + + tmps[gid].dgst1[0] = dgst1[0]; + tmps[gid].dgst1[1] = dgst1[1]; + tmps[gid].dgst1[2] = dgst1[2]; + tmps[gid].dgst1[3] = dgst1[3]; + tmps[gid].dgst1[4] = dgst1[4]; + + tmps[gid].out1[0] = out1[0]; + tmps[gid].out1[1] = out1[1]; + tmps[gid].out1[2] = out1[2]; + tmps[gid].out1[3] = out1[3]; + tmps[gid].out1[4] = out1[4]; + } + + // second 160 bits + + { + u32x dgst2[5]; + u32x out2[5]; + + dgst2[0] = tmps[gid].dgst2[0]; + dgst2[1] = tmps[gid].dgst2[1]; + dgst2[2] = tmps[gid].dgst2[2]; + dgst2[3] = tmps[gid].dgst2[3]; + dgst2[4] = tmps[gid].dgst2[4]; + + out2[0] = tmps[gid].out2[0]; + out2[1] = tmps[gid].out2[1]; + out2[2] = tmps[gid].out2[2]; + out2[3] = tmps[gid].out2[3]; + out2[4] = tmps[gid].out2[4]; + + for (u32 j = 0; j < loop_cnt; j++) + { + u32x w0[4]; + u32x w1[4]; + u32x w2[4]; + u32x w3[4]; + + w0[0] = dgst2[0]; + w0[1] = dgst2[1]; + w0[2] = dgst2[2]; + w0[3] = dgst2[3]; + w1[0] = dgst2[4]; + w1[1] = 0x80000000; + w1[2] = 0; + w1[3] = 0; + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = (64 + 20) * 8; + + hmac_sha1_run (w0, w1, w2, w3, ipad, opad, dgst2); + + out2[0] ^= dgst2[0]; + out2[1] ^= dgst2[1]; + out2[2] ^= dgst2[2]; + out2[3] ^= dgst2[3]; + out2[4] ^= dgst2[4]; + } + + tmps[gid].dgst2[0] = dgst2[0]; + tmps[gid].dgst2[1] = dgst2[1]; + tmps[gid].dgst2[2] = dgst2[2]; + tmps[gid].dgst2[3] = dgst2[3]; + tmps[gid].dgst2[4] = dgst2[4]; + + tmps[gid].out2[0] = out2[0]; + tmps[gid].out2[1] = out2[1]; + tmps[gid].out2[2] = out2[2]; + tmps[gid].out2[3] = out2[3]; + tmps[gid].out2[4] = out2[4]; + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m12700_comp (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, mywallet_tmp_t *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const void *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + const u32 lid = threadIdx.x; + + /** + * aes shared + */ + + __shared__ u32 s_td0[256]; + __shared__ u32 s_td1[256]; + __shared__ u32 s_td2[256]; + __shared__ u32 s_td3[256]; + __shared__ u32 s_td4[256]; + + __shared__ u32 s_te0[256]; + __shared__ u32 s_te1[256]; + __shared__ u32 s_te2[256]; + __shared__ u32 s_te3[256]; + __shared__ u32 s_te4[256]; + + s_td0[lid] = td0[lid]; + s_td1[lid] = td1[lid]; + s_td2[lid] = td2[lid]; + s_td3[lid] = td3[lid]; + s_td4[lid] = td4[lid]; + + s_te0[lid] = te0[lid]; + s_te1[lid] = te1[lid]; + s_te2[lid] = te2[lid]; + s_te3[lid] = te3[lid]; + s_te4[lid] = te4[lid]; + + __syncthreads (); + + if (gid >= gid_max) return; + + /** + * AES part + */ + + const u32 iv[4] = + { + salt_bufs[salt_pos].salt_buf[0], + salt_bufs[salt_pos].salt_buf[1], + salt_bufs[salt_pos].salt_buf[2], + salt_bufs[salt_pos].salt_buf[3] + }; + + const u32 data[4] = + { + salt_bufs[salt_pos].salt_buf[4], + salt_bufs[salt_pos].salt_buf[5], + salt_bufs[salt_pos].salt_buf[6], + salt_bufs[salt_pos].salt_buf[7] + }; + + u32x ukey[8]; + + ukey[0] = tmps[gid].out1[0]; + ukey[1] = tmps[gid].out1[1]; + ukey[2] = tmps[gid].out1[2]; + ukey[3] = tmps[gid].out1[3]; + ukey[4] = tmps[gid].out1[4]; + ukey[5] = tmps[gid].out2[0]; + ukey[6] = tmps[gid].out2[1]; + ukey[7] = tmps[gid].out2[2]; + + #define KEYLEN 60 + + u32 rk[KEYLEN]; + + AES256_ExpandKey (ukey, rk, s_te0, s_te1, s_te2, s_te3, s_te4); + + AES256_InvertKey (rk, s_td0, s_td1, s_td2, s_td3, s_td4, s_te0, s_te1, s_te2, s_te3, s_te4); + + u32 out[4]; + + AES256_decrypt (data, out, rk, s_td0, s_td1, s_td2, s_td3, s_td4); + + out[0] ^= iv[0]; + out[1] ^= iv[1]; + out[2] ^= iv[2]; + out[3] ^= iv[3]; + + out[0] = swap_workaround (out[0]); + out[1] = swap_workaround (out[1]); + out[2] = swap_workaround (out[2]); + out[3] = swap_workaround (out[3]); + + if ((out[0] & 0xff) != '{') return; + + char *pt = (char *) out; + + for (int i = 1; i < 16 - 6; i++) + { + if (pt[i + 0] != '"') continue; + if (pt[i + 1] != 'g') continue; + if (pt[i + 2] != 'u') continue; + if (pt[i + 3] != 'i') continue; + if (pt[i + 4] != 'd') continue; + if (pt[i + 5] != '"') continue; + + const u32x r0 = data[0]; + const u32x r1 = data[1]; + const u32x r2 = data[2]; + const u32x r3 = data[3]; + + #define il_pos 0 + + #include VECT_COMPARE_M + } +} diff --git a/nv/m12800.cu b/nv/m12800.cu new file mode 100644 index 0000000000..db65b4f53c --- /dev/null +++ b/nv/m12800.cu @@ -0,0 +1,631 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define _MS_DRSR_ + +#include "include/constants.h" +#include "include/kernel_vendor.h" + +#ifdef VLIW1 +#define VECT_SIZE1 +#endif + +#ifdef VLIW2 +#define VECT_SIZE1 +#endif + +#define DGST_R0 0 +#define DGST_R1 1 +#define DGST_R2 2 +#define DGST_R3 3 + +#include "include/kernel_functions.c" + +#include "types_nv.c" +#include "common_nv.c" + +#ifdef VECT_SIZE1 +#define VECT_COMPARE_M "check_multi_vect1_comp4.c" +#endif + +#ifdef VECT_SIZE1 +#define uint_to_hex_lower8(i) l_bin2asc[(i)] +#endif + +__device__ __constant__ char c_bin2asc[16] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' }; + +__device__ __shared__ short l_bin2asc[256]; + +__device__ static void md4_transform (const u32x w0[4], const u32x w1[4], const u32x w2[4], const u32x w3[4], u32x digest[4]) +{ + u32x a = digest[0]; + u32x b = digest[1]; + u32x c = digest[2]; + u32x d = digest[3]; + + MD4_STEP (MD4_Fo, a, b, c, d, w0[0], MD4C00, MD4S00); + MD4_STEP (MD4_Fo, d, a, b, c, w0[1], MD4C00, MD4S01); + MD4_STEP (MD4_Fo, c, d, a, b, w0[2], MD4C00, MD4S02); + MD4_STEP (MD4_Fo, b, c, d, a, w0[3], MD4C00, MD4S03); + MD4_STEP (MD4_Fo, a, b, c, d, w1[0], MD4C00, MD4S00); + MD4_STEP (MD4_Fo, d, a, b, c, w1[1], MD4C00, MD4S01); + MD4_STEP (MD4_Fo, c, d, a, b, w1[2], MD4C00, MD4S02); + MD4_STEP (MD4_Fo, b, c, d, a, w1[3], MD4C00, MD4S03); + MD4_STEP (MD4_Fo, a, b, c, d, w2[0], MD4C00, MD4S00); + MD4_STEP (MD4_Fo, d, a, b, c, w2[1], MD4C00, MD4S01); + MD4_STEP (MD4_Fo, c, d, a, b, w2[2], MD4C00, MD4S02); + MD4_STEP (MD4_Fo, b, c, d, a, w2[3], MD4C00, MD4S03); + MD4_STEP (MD4_Fo, a, b, c, d, w3[0], MD4C00, MD4S00); + MD4_STEP (MD4_Fo, d, a, b, c, w3[1], MD4C00, MD4S01); + MD4_STEP (MD4_Fo, c, d, a, b, w3[2], MD4C00, MD4S02); + MD4_STEP (MD4_Fo, b, c, d, a, w3[3], MD4C00, MD4S03); + + MD4_STEP (MD4_Go, a, b, c, d, w0[0], MD4C01, MD4S10); + MD4_STEP (MD4_Go, d, a, b, c, w1[0], MD4C01, MD4S11); + MD4_STEP (MD4_Go, c, d, a, b, w2[0], MD4C01, MD4S12); + MD4_STEP (MD4_Go, b, c, d, a, w3[0], MD4C01, MD4S13); + MD4_STEP (MD4_Go, a, b, c, d, w0[1], MD4C01, MD4S10); + MD4_STEP (MD4_Go, d, a, b, c, w1[1], MD4C01, MD4S11); + MD4_STEP (MD4_Go, c, d, a, b, w2[1], MD4C01, MD4S12); + MD4_STEP (MD4_Go, b, c, d, a, w3[1], MD4C01, MD4S13); + MD4_STEP (MD4_Go, a, b, c, d, w0[2], MD4C01, MD4S10); + MD4_STEP (MD4_Go, d, a, b, c, w1[2], MD4C01, MD4S11); + MD4_STEP (MD4_Go, c, d, a, b, w2[2], MD4C01, MD4S12); + MD4_STEP (MD4_Go, b, c, d, a, w3[2], MD4C01, MD4S13); + MD4_STEP (MD4_Go, a, b, c, d, w0[3], MD4C01, MD4S10); + MD4_STEP (MD4_Go, d, a, b, c, w1[3], MD4C01, MD4S11); + MD4_STEP (MD4_Go, c, d, a, b, w2[3], MD4C01, MD4S12); + MD4_STEP (MD4_Go, b, c, d, a, w3[3], MD4C01, MD4S13); + + MD4_STEP (MD4_H , a, b, c, d, w0[0], MD4C02, MD4S20); + MD4_STEP (MD4_H , d, a, b, c, w2[0], MD4C02, MD4S21); + MD4_STEP (MD4_H , c, d, a, b, w1[0], MD4C02, MD4S22); + MD4_STEP (MD4_H , b, c, d, a, w3[0], MD4C02, MD4S23); + MD4_STEP (MD4_H , a, b, c, d, w0[2], MD4C02, MD4S20); + MD4_STEP (MD4_H , d, a, b, c, w2[2], MD4C02, MD4S21); + MD4_STEP (MD4_H , c, d, a, b, w1[2], MD4C02, MD4S22); + MD4_STEP (MD4_H , b, c, d, a, w3[2], MD4C02, MD4S23); + MD4_STEP (MD4_H , a, b, c, d, w0[1], MD4C02, MD4S20); + MD4_STEP (MD4_H , d, a, b, c, w2[1], MD4C02, MD4S21); + MD4_STEP (MD4_H , c, d, a, b, w1[1], MD4C02, MD4S22); + MD4_STEP (MD4_H , b, c, d, a, w3[1], MD4C02, MD4S23); + MD4_STEP (MD4_H , a, b, c, d, w0[3], MD4C02, MD4S20); + MD4_STEP (MD4_H , d, a, b, c, w2[3], MD4C02, MD4S21); + MD4_STEP (MD4_H , c, d, a, b, w1[3], MD4C02, MD4S22); + MD4_STEP (MD4_H , b, c, d, a, w3[3], MD4C02, MD4S23); + + digest[0] += a; + digest[1] += b; + digest[2] += c; + digest[3] += d; +} + +__device__ static void sha256_transform (const u32x w0[4], const u32x w1[4], const u32x w2[4], const u32x w3[4], u32x digest[8]) +{ + u32x a = digest[0]; + u32x b = digest[1]; + u32x c = digest[2]; + u32x d = digest[3]; + u32x e = digest[4]; + u32x f = digest[5]; + u32x g = digest[6]; + u32x h = digest[7]; + + u32x w0_t = w0[0]; + u32x w1_t = w0[1]; + u32x w2_t = w0[2]; + u32x w3_t = w0[3]; + u32x w4_t = w1[0]; + u32x w5_t = w1[1]; + u32x w6_t = w1[2]; + u32x w7_t = w1[3]; + u32x w8_t = w2[0]; + u32x w9_t = w2[1]; + u32x wa_t = w2[2]; + u32x wb_t = w2[3]; + u32x wc_t = w3[0]; + u32x wd_t = w3[1]; + u32x we_t = w3[2]; + u32x wf_t = w3[3]; + + SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C00); + SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C01); + SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C02); + SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C03); + SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C04); + SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C05); + SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C06); + SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C07); + SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C08); + SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C09); + SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C0a); + SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C0b); + SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C0c); + SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C0d); + SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C0e); + SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C0f); + w0_t = SHA256_S1(we_t) + w9_t + SHA256_S0(w1_t) + w0_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C10); + w1_t = SHA256_S1(wf_t) + wa_t + SHA256_S0(w2_t) + w1_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C11); + w2_t = SHA256_S1(w0_t) + wb_t + SHA256_S0(w3_t) + w2_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C12); + w3_t = SHA256_S1(w1_t) + wc_t + SHA256_S0(w4_t) + w3_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C13); + w4_t = SHA256_S1(w2_t) + wd_t + SHA256_S0(w5_t) + w4_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C14); + w5_t = SHA256_S1(w3_t) + we_t + SHA256_S0(w6_t) + w5_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C15); + w6_t = SHA256_S1(w4_t) + wf_t + SHA256_S0(w7_t) + w6_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C16); + w7_t = SHA256_S1(w5_t) + w0_t + SHA256_S0(w8_t) + w7_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C17); + w8_t = SHA256_S1(w6_t) + w1_t + SHA256_S0(w9_t) + w8_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C18); + w9_t = SHA256_S1(w7_t) + w2_t + SHA256_S0(wa_t) + w9_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C19); + wa_t = SHA256_S1(w8_t) + w3_t + SHA256_S0(wb_t) + wa_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C1a); + wb_t = SHA256_S1(w9_t) + w4_t + SHA256_S0(wc_t) + wb_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C1b); + wc_t = SHA256_S1(wa_t) + w5_t + SHA256_S0(wd_t) + wc_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C1c); + wd_t = SHA256_S1(wb_t) + w6_t + SHA256_S0(we_t) + wd_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C1d); + we_t = SHA256_S1(wc_t) + w7_t + SHA256_S0(wf_t) + we_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C1e); + wf_t = SHA256_S1(wd_t) + w8_t + SHA256_S0(w0_t) + wf_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C1f); + w0_t = SHA256_S1(we_t) + w9_t + SHA256_S0(w1_t) + w0_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C20); + w1_t = SHA256_S1(wf_t) + wa_t + SHA256_S0(w2_t) + w1_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C21); + w2_t = SHA256_S1(w0_t) + wb_t + SHA256_S0(w3_t) + w2_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C22); + w3_t = SHA256_S1(w1_t) + wc_t + SHA256_S0(w4_t) + w3_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C23); + w4_t = SHA256_S1(w2_t) + wd_t + SHA256_S0(w5_t) + w4_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C24); + w5_t = SHA256_S1(w3_t) + we_t + SHA256_S0(w6_t) + w5_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C25); + w6_t = SHA256_S1(w4_t) + wf_t + SHA256_S0(w7_t) + w6_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C26); + w7_t = SHA256_S1(w5_t) + w0_t + SHA256_S0(w8_t) + w7_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C27); + w8_t = SHA256_S1(w6_t) + w1_t + SHA256_S0(w9_t) + w8_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C28); + w9_t = SHA256_S1(w7_t) + w2_t + SHA256_S0(wa_t) + w9_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C29); + wa_t = SHA256_S1(w8_t) + w3_t + SHA256_S0(wb_t) + wa_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C2a); + wb_t = SHA256_S1(w9_t) + w4_t + SHA256_S0(wc_t) + wb_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C2b); + wc_t = SHA256_S1(wa_t) + w5_t + SHA256_S0(wd_t) + wc_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C2c); + wd_t = SHA256_S1(wb_t) + w6_t + SHA256_S0(we_t) + wd_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C2d); + we_t = SHA256_S1(wc_t) + w7_t + SHA256_S0(wf_t) + we_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C2e); + wf_t = SHA256_S1(wd_t) + w8_t + SHA256_S0(w0_t) + wf_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C2f); + w0_t = SHA256_S1(we_t) + w9_t + SHA256_S0(w1_t) + w0_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w0_t, SHA256C30); + w1_t = SHA256_S1(wf_t) + wa_t + SHA256_S0(w2_t) + w1_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w1_t, SHA256C31); + w2_t = SHA256_S1(w0_t) + wb_t + SHA256_S0(w3_t) + w2_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, w2_t, SHA256C32); + w3_t = SHA256_S1(w1_t) + wc_t + SHA256_S0(w4_t) + w3_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, w3_t, SHA256C33); + w4_t = SHA256_S1(w2_t) + wd_t + SHA256_S0(w5_t) + w4_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, w4_t, SHA256C34); + w5_t = SHA256_S1(w3_t) + we_t + SHA256_S0(w6_t) + w5_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, w5_t, SHA256C35); + w6_t = SHA256_S1(w4_t) + wf_t + SHA256_S0(w7_t) + w6_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, w6_t, SHA256C36); + w7_t = SHA256_S1(w5_t) + w0_t + SHA256_S0(w8_t) + w7_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, w7_t, SHA256C37); + w8_t = SHA256_S1(w6_t) + w1_t + SHA256_S0(w9_t) + w8_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, a, b, c, d, e, f, g, h, w8_t, SHA256C38); + w9_t = SHA256_S1(w7_t) + w2_t + SHA256_S0(wa_t) + w9_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, h, a, b, c, d, e, f, g, w9_t, SHA256C39); + wa_t = SHA256_S1(w8_t) + w3_t + SHA256_S0(wb_t) + wa_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, g, h, a, b, c, d, e, f, wa_t, SHA256C3a); + wb_t = SHA256_S1(w9_t) + w4_t + SHA256_S0(wc_t) + wb_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, f, g, h, a, b, c, d, e, wb_t, SHA256C3b); + wc_t = SHA256_S1(wa_t) + w5_t + SHA256_S0(wd_t) + wc_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, e, f, g, h, a, b, c, d, wc_t, SHA256C3c); + wd_t = SHA256_S1(wb_t) + w6_t + SHA256_S0(we_t) + wd_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, d, e, f, g, h, a, b, c, wd_t, SHA256C3d); + we_t = SHA256_S1(wc_t) + w7_t + SHA256_S0(wf_t) + we_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, c, d, e, f, g, h, a, b, we_t, SHA256C3e); + wf_t = SHA256_S1(wd_t) + w8_t + SHA256_S0(w0_t) + wf_t; SHA256_STEP (SHA256_F0o, SHA256_F1o, b, c, d, e, f, g, h, a, wf_t, SHA256C3f); + + digest[0] += a; + digest[1] += b; + digest[2] += c; + digest[3] += d; + digest[4] += e; + digest[5] += f; + digest[6] += g; + digest[7] += h; +} + +__device__ static void hmac_sha256_pad (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], u32x ipad[8], u32x opad[8]) +{ + w0[0] = w0[0] ^ 0x36363636; + w0[1] = w0[1] ^ 0x36363636; + w0[2] = w0[2] ^ 0x36363636; + w0[3] = w0[3] ^ 0x36363636; + w1[0] = w1[0] ^ 0x36363636; + w1[1] = w1[1] ^ 0x36363636; + w1[2] = w1[2] ^ 0x36363636; + w1[3] = w1[3] ^ 0x36363636; + w2[0] = w2[0] ^ 0x36363636; + w2[1] = w2[1] ^ 0x36363636; + w2[2] = w2[2] ^ 0x36363636; + w2[3] = w2[3] ^ 0x36363636; + w3[0] = w3[0] ^ 0x36363636; + w3[1] = w3[1] ^ 0x36363636; + w3[2] = w3[2] ^ 0x36363636; + w3[3] = w3[3] ^ 0x36363636; + + ipad[0] = SHA256M_A; + ipad[1] = SHA256M_B; + ipad[2] = SHA256M_C; + ipad[3] = SHA256M_D; + ipad[4] = SHA256M_E; + ipad[5] = SHA256M_F; + ipad[6] = SHA256M_G; + ipad[7] = SHA256M_H; + + sha256_transform (w0, w1, w2, w3, ipad); + + w0[0] = w0[0] ^ 0x6a6a6a6a; + w0[1] = w0[1] ^ 0x6a6a6a6a; + w0[2] = w0[2] ^ 0x6a6a6a6a; + w0[3] = w0[3] ^ 0x6a6a6a6a; + w1[0] = w1[0] ^ 0x6a6a6a6a; + w1[1] = w1[1] ^ 0x6a6a6a6a; + w1[2] = w1[2] ^ 0x6a6a6a6a; + w1[3] = w1[3] ^ 0x6a6a6a6a; + w2[0] = w2[0] ^ 0x6a6a6a6a; + w2[1] = w2[1] ^ 0x6a6a6a6a; + w2[2] = w2[2] ^ 0x6a6a6a6a; + w2[3] = w2[3] ^ 0x6a6a6a6a; + w3[0] = w3[0] ^ 0x6a6a6a6a; + w3[1] = w3[1] ^ 0x6a6a6a6a; + w3[2] = w3[2] ^ 0x6a6a6a6a; + w3[3] = w3[3] ^ 0x6a6a6a6a; + + opad[0] = SHA256M_A; + opad[1] = SHA256M_B; + opad[2] = SHA256M_C; + opad[3] = SHA256M_D; + opad[4] = SHA256M_E; + opad[5] = SHA256M_F; + opad[6] = SHA256M_G; + opad[7] = SHA256M_H; + + sha256_transform (w0, w1, w2, w3, opad); +} + +__device__ static void hmac_sha256_run (u32x w0[4], u32x w1[4], u32x w2[4], u32x w3[4], u32x ipad[8], u32x opad[8], u32x digest[8]) +{ + digest[0] = ipad[0]; + digest[1] = ipad[1]; + digest[2] = ipad[2]; + digest[3] = ipad[3]; + digest[4] = ipad[4]; + digest[5] = ipad[5]; + digest[6] = ipad[6]; + digest[7] = ipad[7]; + + sha256_transform (w0, w1, w2, w3, digest); + + w0[0] = digest[0]; + w0[1] = digest[1]; + w0[2] = digest[2]; + w0[3] = digest[3]; + w1[0] = digest[4]; + w1[1] = digest[5]; + w1[2] = digest[6]; + w1[3] = digest[7]; + w2[0] = 0x80000000; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = (64 + 32) * 8; + + digest[0] = opad[0]; + digest[1] = opad[1]; + digest[2] = opad[2]; + digest[3] = opad[3]; + digest[4] = opad[4]; + digest[5] = opad[5]; + digest[6] = opad[6]; + digest[7] = opad[7]; + + sha256_transform (w0, w1, w2, w3, digest); +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m12800_init (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, pbkdf2_sha256_tmp_t *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const pbkdf2_sha256_t *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + const u32 lid = threadIdx.x; + + /** + * lookup ascii table + */ + + l_bin2asc[lid] = c_bin2asc[(lid >> 0) & 15] << 8 + | c_bin2asc[(lid >> 4) & 15] << 0; + + __syncthreads (); + + if (gid >= gid_max) return; + + /** + * base + */ + + u32x w0[4]; + + w0[0] = pws[gid].i[0]; + w0[1] = pws[gid].i[1]; + w0[2] = pws[gid].i[2]; + w0[3] = pws[gid].i[3]; + + u32x w1[4]; + + w1[0] = pws[gid].i[4]; + w1[1] = pws[gid].i[5]; + w1[2] = 0; + w1[3] = 0; + + u32x w2[4]; + + w2[0] = 0; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + + u32x w3[4]; + + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = 0; + + const u32 pw_len = pws[gid].pw_len; + + /** + * salt + */ + + u32 salt_len = salt_bufs[salt_pos].salt_len; + + u32 salt_buf0[4]; + + salt_buf0[0] = swap_workaround (salt_bufs[salt_pos].salt_buf[0]); + salt_buf0[1] = swap_workaround (salt_bufs[salt_pos].salt_buf[1]); + salt_buf0[2] = swap_workaround (salt_bufs[salt_pos].salt_buf[2]); + salt_buf0[3] = swap_workaround (salt_bufs[salt_pos].salt_buf[3]); + + u32 salt_buf1[4]; + + salt_buf1[0] = 0; + salt_buf1[1] = 0; + salt_buf1[2] = 0; + salt_buf1[3] = 0; + + u32 salt_buf2[4]; + + salt_buf2[0] = 0; + salt_buf2[1] = 0; + salt_buf2[2] = 0; + salt_buf2[3] = 0; + + u32 salt_buf3[4]; + + salt_buf3[0] = 0; + salt_buf3[1] = 0; + salt_buf3[2] = 0; + salt_buf3[3] = (64 + salt_len + 4) * 8; + + /** + * generate nthash + */ + + append_0x80_2 (w0, w1, pw_len); + + make_unicode (w1, w2, w3); + make_unicode (w0, w0, w1); + + w3[2] = pw_len * 2 * 8; + + u32x digest_md4[4]; + + digest_md4[0] = MD4M_A; + digest_md4[1] = MD4M_B; + digest_md4[2] = MD4M_C; + digest_md4[3] = MD4M_D; + + md4_transform (w0, w1, w2, w3, digest_md4); + + w0[0] = uint_to_hex_lower8 ((digest_md4[0] >> 0) & 255) << 0 + | uint_to_hex_lower8 ((digest_md4[0] >> 8) & 255) << 16; + w0[1] = uint_to_hex_lower8 ((digest_md4[0] >> 16) & 255) << 0 + | uint_to_hex_lower8 ((digest_md4[0] >> 24) & 255) << 16; + w0[2] = uint_to_hex_lower8 ((digest_md4[1] >> 0) & 255) << 0 + | uint_to_hex_lower8 ((digest_md4[1] >> 8) & 255) << 16; + w0[3] = uint_to_hex_lower8 ((digest_md4[1] >> 16) & 255) << 0 + | uint_to_hex_lower8 ((digest_md4[1] >> 24) & 255) << 16; + w1[0] = uint_to_hex_lower8 ((digest_md4[2] >> 0) & 255) << 0 + | uint_to_hex_lower8 ((digest_md4[2] >> 8) & 255) << 16; + w1[1] = uint_to_hex_lower8 ((digest_md4[2] >> 16) & 255) << 0 + | uint_to_hex_lower8 ((digest_md4[2] >> 24) & 255) << 16; + w1[2] = uint_to_hex_lower8 ((digest_md4[3] >> 0) & 255) << 0 + | uint_to_hex_lower8 ((digest_md4[3] >> 8) & 255) << 16; + w1[3] = uint_to_hex_lower8 ((digest_md4[3] >> 16) & 255) << 0 + | uint_to_hex_lower8 ((digest_md4[3] >> 24) & 255) << 16; + + make_unicode (w1, w2, w3); + make_unicode (w0, w0, w1); + + w0[0] = swap_workaround (w0[0]); + w0[1] = swap_workaround (w0[1]); + w0[2] = swap_workaround (w0[2]); + w0[3] = swap_workaround (w0[3]); + w1[0] = swap_workaround (w1[0]); + w1[1] = swap_workaround (w1[1]); + w1[2] = swap_workaround (w1[2]); + w1[3] = swap_workaround (w1[3]); + w2[0] = swap_workaround (w2[0]); + w2[1] = swap_workaround (w2[1]); + w2[2] = swap_workaround (w2[2]); + w2[3] = swap_workaround (w2[3]); + w3[0] = swap_workaround (w3[0]); + w3[1] = swap_workaround (w3[1]); + w3[2] = swap_workaround (w3[2]); + w3[3] = swap_workaround (w3[3]); + + u32 ipad[8]; + u32 opad[8]; + + hmac_sha256_pad (w0, w1, w2, w3, ipad, opad); + + tmps[gid].ipad[0] = ipad[0]; + tmps[gid].ipad[1] = ipad[1]; + tmps[gid].ipad[2] = ipad[2]; + tmps[gid].ipad[3] = ipad[3]; + tmps[gid].ipad[4] = ipad[4]; + tmps[gid].ipad[5] = ipad[5]; + tmps[gid].ipad[6] = ipad[6]; + tmps[gid].ipad[7] = ipad[7]; + + tmps[gid].opad[0] = opad[0]; + tmps[gid].opad[1] = opad[1]; + tmps[gid].opad[2] = opad[2]; + tmps[gid].opad[3] = opad[3]; + tmps[gid].opad[4] = opad[4]; + tmps[gid].opad[5] = opad[5]; + tmps[gid].opad[6] = opad[6]; + tmps[gid].opad[7] = opad[7]; + + for (u32 i = 0, j = 1; i < 8; i += 8, j += 1) + { + u32 dgst[8]; + + hmac_sha256_run (salt_buf0, salt_buf1, salt_buf2, salt_buf3, ipad, opad, dgst); + + tmps[gid].dgst[i + 0] = dgst[0]; + tmps[gid].dgst[i + 1] = dgst[1]; + tmps[gid].dgst[i + 2] = dgst[2]; + tmps[gid].dgst[i + 3] = dgst[3]; + tmps[gid].dgst[i + 4] = dgst[4]; + tmps[gid].dgst[i + 5] = dgst[5]; + tmps[gid].dgst[i + 6] = dgst[6]; + tmps[gid].dgst[i + 7] = dgst[7]; + + tmps[gid].out[i + 0] = dgst[0]; + tmps[gid].out[i + 1] = dgst[1]; + tmps[gid].out[i + 2] = dgst[2]; + tmps[gid].out[i + 3] = dgst[3]; + tmps[gid].out[i + 4] = dgst[4]; + tmps[gid].out[i + 5] = dgst[5]; + tmps[gid].out[i + 6] = dgst[6]; + tmps[gid].out[i + 7] = dgst[7]; + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m12800_loop (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, pbkdf2_sha256_tmp_t *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const pbkdf2_sha256_t *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32 ipad[8]; + + ipad[0] = tmps[gid].ipad[0]; + ipad[1] = tmps[gid].ipad[1]; + ipad[2] = tmps[gid].ipad[2]; + ipad[3] = tmps[gid].ipad[3]; + ipad[4] = tmps[gid].ipad[4]; + ipad[5] = tmps[gid].ipad[5]; + ipad[6] = tmps[gid].ipad[6]; + ipad[7] = tmps[gid].ipad[7]; + + u32 opad[8]; + + opad[0] = tmps[gid].opad[0]; + opad[1] = tmps[gid].opad[1]; + opad[2] = tmps[gid].opad[2]; + opad[3] = tmps[gid].opad[3]; + opad[4] = tmps[gid].opad[4]; + opad[5] = tmps[gid].opad[5]; + opad[6] = tmps[gid].opad[6]; + opad[7] = tmps[gid].opad[7]; + + for (u32 i = 0; i < 8; i += 8) + { + u32 dgst[8]; + + dgst[0] = tmps[gid].dgst[i + 0]; + dgst[1] = tmps[gid].dgst[i + 1]; + dgst[2] = tmps[gid].dgst[i + 2]; + dgst[3] = tmps[gid].dgst[i + 3]; + dgst[4] = tmps[gid].dgst[i + 4]; + dgst[5] = tmps[gid].dgst[i + 5]; + dgst[6] = tmps[gid].dgst[i + 6]; + dgst[7] = tmps[gid].dgst[i + 7]; + + u32 out[8]; + + out[0] = tmps[gid].out[i + 0]; + out[1] = tmps[gid].out[i + 1]; + out[2] = tmps[gid].out[i + 2]; + out[3] = tmps[gid].out[i + 3]; + out[4] = tmps[gid].out[i + 4]; + out[5] = tmps[gid].out[i + 5]; + out[6] = tmps[gid].out[i + 6]; + out[7] = tmps[gid].out[i + 7]; + + for (u32 j = 0; j < loop_cnt; j++) + { + u32 w0[4]; + u32 w1[4]; + u32 w2[4]; + u32 w3[4]; + + w0[0] = dgst[0]; + w0[1] = dgst[1]; + w0[2] = dgst[2]; + w0[3] = dgst[3]; + w1[0] = dgst[4]; + w1[1] = dgst[5]; + w1[2] = dgst[6]; + w1[3] = dgst[7]; + w2[0] = 0x80000000; + w2[1] = 0; + w2[2] = 0; + w2[3] = 0; + w3[0] = 0; + w3[1] = 0; + w3[2] = 0; + w3[3] = (64 + 32) * 8; + + hmac_sha256_run (w0, w1, w2, w3, ipad, opad, dgst); + + out[0] ^= dgst[0]; + out[1] ^= dgst[1]; + out[2] ^= dgst[2]; + out[3] ^= dgst[3]; + out[4] ^= dgst[4]; + out[5] ^= dgst[5]; + out[6] ^= dgst[6]; + out[7] ^= dgst[7]; + } + + tmps[gid].dgst[i + 0] = dgst[0]; + tmps[gid].dgst[i + 1] = dgst[1]; + tmps[gid].dgst[i + 2] = dgst[2]; + tmps[gid].dgst[i + 3] = dgst[3]; + tmps[gid].dgst[i + 4] = dgst[4]; + tmps[gid].dgst[i + 5] = dgst[5]; + tmps[gid].dgst[i + 6] = dgst[6]; + tmps[gid].dgst[i + 7] = dgst[7]; + + tmps[gid].out[i + 0] = out[0]; + tmps[gid].out[i + 1] = out[1]; + tmps[gid].out[i + 2] = out[2]; + tmps[gid].out[i + 3] = out[3]; + tmps[gid].out[i + 4] = out[4]; + tmps[gid].out[i + 5] = out[5]; + tmps[gid].out[i + 6] = out[6]; + tmps[gid].out[i + 7] = out[7]; + } +} + +extern "C" __global__ void __launch_bounds__ (256, 1) m12800_comp (const pw_t *pws, const gpu_rule_t *rules_buf, const comb_t *combs_buf, const bf_t *bfs_buf, pbkdf2_sha256_tmp_t *tmps, void *hooks, const u32 *bitmaps_buf_s1_a, const u32 *bitmaps_buf_s1_b, const u32 *bitmaps_buf_s1_c, const u32 *bitmaps_buf_s1_d, const u32 *bitmaps_buf_s2_a, const u32 *bitmaps_buf_s2_b, const u32 *bitmaps_buf_s2_c, const u32 *bitmaps_buf_s2_d, plain_t *plains_buf, const digest_t *digests_buf, u32 *hashes_shown, const salt_t *salt_bufs, const pbkdf2_sha256_t *esalt_bufs, u32 *d_return_buf, u32 *d_scryptV_buf, const u32 bitmap_mask, const u32 bitmap_shift1, const u32 bitmap_shift2, const u32 salt_pos, const u32 loop_pos, const u32 loop_cnt, const u32 rules_cnt, const u32 digests_cnt, const u32 digests_offset, const u32 combs_mode, const u32 gid_max) +{ + /** + * base + */ + + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + const u32 lid = threadIdx.x; + + const u32x r0 = tmps[gid].out[DGST_R0]; + const u32x r1 = tmps[gid].out[DGST_R1]; + const u32x r2 = tmps[gid].out[DGST_R2]; + const u32x r3 = tmps[gid].out[DGST_R3]; + + #define il_pos 0 + + #include VECT_COMPARE_M +} diff --git a/nv/markov_be_v1.cu b/nv/markov_be_v1.cu new file mode 100644 index 0000000000..ab6f993c1b --- /dev/null +++ b/nv/markov_be_v1.cu @@ -0,0 +1,127 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define CHARSIZ 256 + +#define VECT_SIZE1 + +#include "types_nv.c" + +__device__ static void generate_pw (u32 pw_buf[16], cs_t *root_css_buf, cs_t *markov_css_buf, const u32 pw_l_len, const u32 pw_r_len, const u32 mask80, const u32 bits14, const u32 bits15, u64 val) +{ + pw_buf[ 0] = 0; + pw_buf[ 1] = 0; + pw_buf[ 2] = 0; + pw_buf[ 3] = 0; + pw_buf[ 4] = 0; + pw_buf[ 5] = 0; + pw_buf[ 6] = 0; + pw_buf[ 7] = 0; + pw_buf[ 8] = 0; + pw_buf[ 9] = 0; + pw_buf[10] = 0; + pw_buf[11] = 0; + pw_buf[12] = 0; + pw_buf[13] = 0; + pw_buf[14] = 0; + pw_buf[15] = 0; + + cs_t *cs = &root_css_buf[pw_r_len]; + + u32 i; + u32 j; + + for (i = 0, j = pw_r_len; i < pw_l_len; i++, j++) + { + const u32 len = cs->cs_len; + + const u64 next = val / len; + const u64 pos = val % len; + + val = next; + + const u32 key = cs->cs_buf[pos]; + + const u32 jd4 = j / 4; + const u32 jm4 = j % 4; + + pw_buf[jd4] |= key << ((3 - jm4) * 8); + + cs = &markov_css_buf[(j * CHARSIZ) + key]; + } + + const u32 jd4 = j / 4; + const u32 jm4 = j % 4; + + pw_buf[jd4] |= (0xff << ((3 - jm4) * 8)) & mask80; + + if (bits14) pw_buf[14] = (pw_l_len + pw_r_len) * 8; + if (bits15) pw_buf[15] = (pw_l_len + pw_r_len) * 8; +} + +extern "C" __global__ void __launch_bounds__ (256, 1) l_markov (pw_t *pws_buf_l, cs_t *root_css_buf, cs_t *markov_css_buf, const u64 off, const u32 pw_l_len, const u32 pw_r_len, const u32 mask80, const u32 bits14, const u32 bits15, const u32 gid_max) +{ + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32 pw_buf[16]; + + generate_pw (pw_buf, root_css_buf, markov_css_buf, pw_l_len, pw_r_len, mask80, bits14, bits15, off + gid); + + pws_buf_l[gid].i[ 0] = pw_buf[ 0]; + pws_buf_l[gid].i[ 1] = pw_buf[ 1]; + pws_buf_l[gid].i[ 2] = pw_buf[ 2]; + pws_buf_l[gid].i[ 3] = pw_buf[ 3]; + pws_buf_l[gid].i[ 4] = pw_buf[ 4]; + pws_buf_l[gid].i[ 5] = pw_buf[ 5]; + pws_buf_l[gid].i[ 6] = pw_buf[ 6]; + pws_buf_l[gid].i[ 7] = pw_buf[ 7]; + pws_buf_l[gid].i[ 8] = pw_buf[ 8]; + pws_buf_l[gid].i[ 9] = pw_buf[ 9]; + pws_buf_l[gid].i[10] = pw_buf[10]; + pws_buf_l[gid].i[11] = pw_buf[11]; + pws_buf_l[gid].i[12] = pw_buf[12]; + pws_buf_l[gid].i[13] = pw_buf[13]; + pws_buf_l[gid].i[14] = pw_buf[14]; + pws_buf_l[gid].i[15] = pw_buf[15]; + + pws_buf_l[gid].pw_len = pw_l_len + pw_r_len; +} + +extern "C" __global__ void __launch_bounds__ (256, 1) r_markov (bf_t *pws_buf_r, cs_t *root_css_buf, cs_t *markov_css_buf, const u64 off, const u32 pw_r_len, const u32 mask80, const u32 bits14, const u32 bits15, const u32 gid_max) +{ + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32 pw_buf[16]; + + generate_pw (pw_buf, root_css_buf, markov_css_buf, pw_r_len, 0, 0, 0, 0, off + gid); + + pws_buf_r[gid].i = pw_buf[0]; +} + +extern "C" __global__ void __launch_bounds__ (256, 1) C_markov (comb_t *pws_buf, cs_t *root_css_buf, cs_t *markov_css_buf, const u64 off, const u32 pw_len, const u32 mask80, const u32 bits14, const u32 bits15, const u32 gid_max) +{ + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32 pw_buf[16]; + + generate_pw (pw_buf, root_css_buf, markov_css_buf, pw_len, 0, mask80, bits14, bits15, off + gid); + + pws_buf[gid].i[ 0] = pw_buf[ 0]; + pws_buf[gid].i[ 1] = pw_buf[ 1]; + pws_buf[gid].i[ 2] = pw_buf[ 2]; + pws_buf[gid].i[ 3] = pw_buf[ 3]; + pws_buf[gid].i[ 4] = pw_buf[ 4]; + pws_buf[gid].i[ 5] = pw_buf[ 5]; + pws_buf[gid].i[ 6] = pw_buf[ 6]; + pws_buf[gid].i[ 7] = pw_buf[ 7]; + + pws_buf[gid].pw_len = pw_len; +} diff --git a/nv/markov_be_v2.cu b/nv/markov_be_v2.cu new file mode 100644 index 0000000000..892306e1ba --- /dev/null +++ b/nv/markov_be_v2.cu @@ -0,0 +1,142 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define CHARSIZ 256 + +#define VECT_SIZE2 + +#include "types_nv.c" + +__device__ static void generate_pw (u32 pw_buf[16], cs_t *root_css_buf, cs_t *markov_css_buf, const u32 pw_l_len, const u32 pw_r_len, const u32 mask80, const u32 bits14, const u32 bits15, u64 val) +{ + pw_buf[ 0] = 0; + pw_buf[ 1] = 0; + pw_buf[ 2] = 0; + pw_buf[ 3] = 0; + pw_buf[ 4] = 0; + pw_buf[ 5] = 0; + pw_buf[ 6] = 0; + pw_buf[ 7] = 0; + pw_buf[ 8] = 0; + pw_buf[ 9] = 0; + pw_buf[10] = 0; + pw_buf[11] = 0; + pw_buf[12] = 0; + pw_buf[13] = 0; + pw_buf[14] = 0; + pw_buf[15] = 0; + + cs_t *cs = &root_css_buf[pw_r_len]; + + u32 i; + u32 j; + + for (i = 0, j = pw_r_len; i < pw_l_len; i++, j++) + { + const u32 len = cs->cs_len; + + const u64 next = val / len; + const u64 pos = val % len; + + val = next; + + const u32 key = cs->cs_buf[pos]; + + const u32 jd4 = j / 4; + const u32 jm4 = j % 4; + + pw_buf[jd4] |= key << ((3 - jm4) * 8); + + cs = &markov_css_buf[(j * CHARSIZ) + key]; + } + + const u32 jd4 = j / 4; + const u32 jm4 = j % 4; + + pw_buf[jd4] |= (0xff << ((3 - jm4) * 8)) & mask80; + + if (bits14) pw_buf[14] = (pw_l_len + pw_r_len) * 8; + if (bits15) pw_buf[15] = (pw_l_len + pw_r_len) * 8; +} + +extern "C" __global__ void __launch_bounds__ (256, 1) l_markov (pw_t *pws_buf_l, cs_t *root_css_buf, cs_t *markov_css_buf, const u64 off, const u32 pw_l_len, const u32 pw_r_len, const u32 mask80, const u32 bits14, const u32 bits15, const u32 gid_max) +{ + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + const u32 gid2 = gid * 2; + + u32 pw_buf0[16]; + u32 pw_buf1[16]; + + generate_pw (pw_buf0, root_css_buf, markov_css_buf, pw_l_len, pw_r_len, mask80, bits14, bits15, off + gid2 + 0); + generate_pw (pw_buf1, root_css_buf, markov_css_buf, pw_l_len, pw_r_len, mask80, bits14, bits15, off + gid2 + 1); + + #pragma unroll 16 + for (int i = 0; i < 16; i++) + { + pws_buf_l[gid].i[i].x = pw_buf0[i]; + pws_buf_l[gid].i[i].y = pw_buf1[i]; + } + + pws_buf_l[gid].pw_len = pw_l_len + pw_r_len; +} + +extern "C" __global__ void __launch_bounds__ (256, 1) r_markov (bf_t *pws_buf_r, cs_t *root_css_buf, cs_t *markov_css_buf, const u64 off, const u32 pw_r_len, const u32 mask80, const u32 bits14, const u32 bits15, const u32 gid_max) +{ + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + const u32 gid2 = gid * 2; + + u32 pw_buf[16]; + + generate_pw (pw_buf, root_css_buf, markov_css_buf, pw_r_len, 0, 0, 0, 0, off + gid2 + 0); + + pws_buf_r[gid2 + 0].i = pw_buf[0]; + + generate_pw (pw_buf, root_css_buf, markov_css_buf, pw_r_len, 0, 0, 0, 0, off + gid2 + 1); + + pws_buf_r[gid2 + 1].i = pw_buf[0]; +} + +extern "C" __global__ void __launch_bounds__ (256, 1) C_markov (comb_t *pws_buf, cs_t *root_css_buf, cs_t *markov_css_buf, const u64 off, const u32 pw_len, const u32 mask80, const u32 bits14, const u32 bits15, const u32 gid_max) +{ + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + const u32 gid2 = gid * 2; + + u32 pw_buf[16]; + + generate_pw (pw_buf, root_css_buf, markov_css_buf, pw_len, 0, mask80, bits14, bits15, off + gid2 + 0); + + pws_buf[gid2 + 0].i[ 0] = pw_buf[ 0]; + pws_buf[gid2 + 0].i[ 1] = pw_buf[ 1]; + pws_buf[gid2 + 0].i[ 2] = pw_buf[ 2]; + pws_buf[gid2 + 0].i[ 3] = pw_buf[ 3]; + pws_buf[gid2 + 0].i[ 4] = pw_buf[ 4]; + pws_buf[gid2 + 0].i[ 5] = pw_buf[ 5]; + pws_buf[gid2 + 0].i[ 6] = pw_buf[ 6]; + pws_buf[gid2 + 0].i[ 7] = pw_buf[ 7]; + + pws_buf[gid2 + 0].pw_len = pw_len; + + generate_pw (pw_buf, root_css_buf, markov_css_buf, pw_len, 0, mask80, bits14, bits15, off + gid2 + 1); + + pws_buf[gid2 + 1].i[ 0] = pw_buf[ 0]; + pws_buf[gid2 + 1].i[ 1] = pw_buf[ 1]; + pws_buf[gid2 + 1].i[ 2] = pw_buf[ 2]; + pws_buf[gid2 + 1].i[ 3] = pw_buf[ 3]; + pws_buf[gid2 + 1].i[ 4] = pw_buf[ 4]; + pws_buf[gid2 + 1].i[ 5] = pw_buf[ 5]; + pws_buf[gid2 + 1].i[ 6] = pw_buf[ 6]; + pws_buf[gid2 + 1].i[ 7] = pw_buf[ 7]; + + pws_buf[gid2 + 1].pw_len = pw_len; +} diff --git a/nv/markov_be_v4.cu b/nv/markov_be_v4.cu new file mode 100644 index 0000000000..13cee2abeb --- /dev/null +++ b/nv/markov_be_v4.cu @@ -0,0 +1,182 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define CHARSIZ 256 + +#define VECT_SIZE4 + +#include "types_nv.c" + +__device__ static void generate_pw (u32 pw_buf[16], cs_t *root_css_buf, cs_t *markov_css_buf, const u32 pw_l_len, const u32 pw_r_len, const u32 mask80, const u32 bits14, const u32 bits15, u64 val) +{ + pw_buf[ 0] = 0; + pw_buf[ 1] = 0; + pw_buf[ 2] = 0; + pw_buf[ 3] = 0; + pw_buf[ 4] = 0; + pw_buf[ 5] = 0; + pw_buf[ 6] = 0; + pw_buf[ 7] = 0; + pw_buf[ 8] = 0; + pw_buf[ 9] = 0; + pw_buf[10] = 0; + pw_buf[11] = 0; + pw_buf[12] = 0; + pw_buf[13] = 0; + pw_buf[14] = 0; + pw_buf[15] = 0; + + cs_t *cs = &root_css_buf[pw_r_len]; + + u32 i; + u32 j; + + for (i = 0, j = pw_r_len; i < pw_l_len; i++, j++) + { + const u32 len = cs->cs_len; + + const u64 next = val / len; + const u64 pos = val % len; + + val = next; + + const u32 key = cs->cs_buf[pos]; + + const u32 jd4 = j / 4; + const u32 jm4 = j % 4; + + pw_buf[jd4] |= key << ((3 - jm4) * 8); + + cs = &markov_css_buf[(j * CHARSIZ) + key]; + } + + const u32 jd4 = j / 4; + const u32 jm4 = j % 4; + + pw_buf[jd4] |= (0xff << ((3 - jm4) * 8)) & mask80; + + if (bits14) pw_buf[14] = (pw_l_len + pw_r_len) * 8; + if (bits15) pw_buf[15] = (pw_l_len + pw_r_len) * 8; +} + +extern "C" __global__ void __launch_bounds__ (256, 1) l_markov (pw_t *pws_buf_l, cs_t *root_css_buf, cs_t *markov_css_buf, const u64 off, const u32 pw_l_len, const u32 pw_r_len, const u32 mask80, const u32 bits14, const u32 bits15, const u32 gid_max) +{ + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + const u32 gid4 = gid * 4; + + u32 pw_buf0[16]; + u32 pw_buf1[16]; + u32 pw_buf2[16]; + u32 pw_buf3[16]; + + generate_pw (pw_buf0, root_css_buf, markov_css_buf, pw_l_len, pw_r_len, mask80, bits14, bits15, off + gid4 + 0); + generate_pw (pw_buf1, root_css_buf, markov_css_buf, pw_l_len, pw_r_len, mask80, bits14, bits15, off + gid4 + 1); + generate_pw (pw_buf2, root_css_buf, markov_css_buf, pw_l_len, pw_r_len, mask80, bits14, bits15, off + gid4 + 2); + generate_pw (pw_buf3, root_css_buf, markov_css_buf, pw_l_len, pw_r_len, mask80, bits14, bits15, off + gid4 + 3); + + #pragma unroll 16 + for (int i = 0; i < 16; i++) + { + pws_buf_l[gid].i[i].x = pw_buf0[i]; + pws_buf_l[gid].i[i].y = pw_buf1[i]; + pws_buf_l[gid].i[i].z = pw_buf2[i]; + pws_buf_l[gid].i[i].w = pw_buf3[i]; + } + + pws_buf_l[gid].pw_len = pw_l_len + pw_r_len; +} + +extern "C" __global__ void __launch_bounds__ (256, 1) r_markov (bf_t *pws_buf_r, cs_t *root_css_buf, cs_t *markov_css_buf, const u64 off, const u32 pw_r_len, const u32 mask80, const u32 bits14, const u32 bits15, const u32 gid_max) +{ + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + const u32 gid4 = gid * 4; + + u32 pw_buf[16]; + + generate_pw (pw_buf, root_css_buf, markov_css_buf, pw_r_len, 0, 0, 0, 0, off + gid4 + 0); + + pws_buf_r[gid4 + 0].i = pw_buf[0]; + + generate_pw (pw_buf, root_css_buf, markov_css_buf, pw_r_len, 0, 0, 0, 0, off + gid4 + 1); + + pws_buf_r[gid4 + 1].i = pw_buf[0]; + + generate_pw (pw_buf, root_css_buf, markov_css_buf, pw_r_len, 0, 0, 0, 0, off + gid4 + 2); + + pws_buf_r[gid4 + 2].i = pw_buf[0]; + + generate_pw (pw_buf, root_css_buf, markov_css_buf, pw_r_len, 0, 0, 0, 0, off + gid4 + 3); + + pws_buf_r[gid4 + 3].i = pw_buf[0]; +} + +extern "C" __global__ void __launch_bounds__ (256, 1) C_markov (comb_t *pws_buf, cs_t *root_css_buf, cs_t *markov_css_buf, const u64 off, const u32 pw_len, const u32 mask80, const u32 bits14, const u32 bits15, const u32 gid_max) +{ + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + const u32 gid4 = gid * 4; + + u32 pw_buf[16]; + + generate_pw (pw_buf, root_css_buf, markov_css_buf, pw_len, 0, mask80, bits14, bits15, off + gid4 + 0); + + pws_buf[gid4 + 0].i[ 0] = pw_buf[ 0]; + pws_buf[gid4 + 0].i[ 1] = pw_buf[ 1]; + pws_buf[gid4 + 0].i[ 2] = pw_buf[ 2]; + pws_buf[gid4 + 0].i[ 3] = pw_buf[ 3]; + pws_buf[gid4 + 0].i[ 4] = pw_buf[ 4]; + pws_buf[gid4 + 0].i[ 5] = pw_buf[ 5]; + pws_buf[gid4 + 0].i[ 6] = pw_buf[ 6]; + pws_buf[gid4 + 0].i[ 7] = pw_buf[ 7]; + + pws_buf[gid4 + 0].pw_len = pw_len; + + generate_pw (pw_buf, root_css_buf, markov_css_buf, pw_len, 0, mask80, bits14, bits15, off + gid4 + 1); + + pws_buf[gid4 + 1].i[ 0] = pw_buf[ 0]; + pws_buf[gid4 + 1].i[ 1] = pw_buf[ 1]; + pws_buf[gid4 + 1].i[ 2] = pw_buf[ 2]; + pws_buf[gid4 + 1].i[ 3] = pw_buf[ 3]; + pws_buf[gid4 + 1].i[ 4] = pw_buf[ 4]; + pws_buf[gid4 + 1].i[ 5] = pw_buf[ 5]; + pws_buf[gid4 + 1].i[ 6] = pw_buf[ 6]; + pws_buf[gid4 + 1].i[ 7] = pw_buf[ 7]; + + pws_buf[gid4 + 1].pw_len = pw_len; + + generate_pw (pw_buf, root_css_buf, markov_css_buf, pw_len, 0, mask80, bits14, bits15, off + gid4 + 2); + + pws_buf[gid4 + 2].i[ 0] = pw_buf[ 0]; + pws_buf[gid4 + 2].i[ 1] = pw_buf[ 1]; + pws_buf[gid4 + 2].i[ 2] = pw_buf[ 2]; + pws_buf[gid4 + 2].i[ 3] = pw_buf[ 3]; + pws_buf[gid4 + 2].i[ 4] = pw_buf[ 4]; + pws_buf[gid4 + 2].i[ 5] = pw_buf[ 5]; + pws_buf[gid4 + 2].i[ 6] = pw_buf[ 6]; + pws_buf[gid4 + 2].i[ 7] = pw_buf[ 7]; + + pws_buf[gid4 + 2].pw_len = pw_len; + + generate_pw (pw_buf, root_css_buf, markov_css_buf, pw_len, 0, mask80, bits14, bits15, off + gid4 + 3); + + pws_buf[gid4 + 3].i[ 0] = pw_buf[ 0]; + pws_buf[gid4 + 3].i[ 1] = pw_buf[ 1]; + pws_buf[gid4 + 3].i[ 2] = pw_buf[ 2]; + pws_buf[gid4 + 3].i[ 3] = pw_buf[ 3]; + pws_buf[gid4 + 3].i[ 4] = pw_buf[ 4]; + pws_buf[gid4 + 3].i[ 5] = pw_buf[ 5]; + pws_buf[gid4 + 3].i[ 6] = pw_buf[ 6]; + pws_buf[gid4 + 3].i[ 7] = pw_buf[ 7]; + + pws_buf[gid4 + 3].pw_len = pw_len; +} diff --git a/nv/markov_le_v1.cu b/nv/markov_le_v1.cu new file mode 100644 index 0000000000..c090bb2c34 --- /dev/null +++ b/nv/markov_le_v1.cu @@ -0,0 +1,127 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define CHARSIZ 256 + +#define VECT_SIZE1 + +#include "types_nv.c" + +__device__ static void generate_pw (u32 pw_buf[16], cs_t *root_css_buf, cs_t *markov_css_buf, const u32 pw_l_len, const u32 pw_r_len, const u32 mask80, const u32 bits14, const u32 bits15, u64 val) +{ + pw_buf[ 0] = 0; + pw_buf[ 1] = 0; + pw_buf[ 2] = 0; + pw_buf[ 3] = 0; + pw_buf[ 4] = 0; + pw_buf[ 5] = 0; + pw_buf[ 6] = 0; + pw_buf[ 7] = 0; + pw_buf[ 8] = 0; + pw_buf[ 9] = 0; + pw_buf[10] = 0; + pw_buf[11] = 0; + pw_buf[12] = 0; + pw_buf[13] = 0; + pw_buf[14] = 0; + pw_buf[15] = 0; + + cs_t *cs = &root_css_buf[pw_r_len]; + + u32 i; + u32 j; + + for (i = 0, j = pw_r_len; i < pw_l_len; i++, j++) + { + const u32 len = cs->cs_len; + + const u64 next = val / len; + const u64 pos = val % len; + + val = next; + + const u32 key = cs->cs_buf[pos]; + + const u32 jd4 = j / 4; + const u32 jm4 = j % 4; + + pw_buf[jd4] |= key << (jm4 * 8); + + cs = &markov_css_buf[(j * CHARSIZ) + key]; + } + + const u32 jd4 = j / 4; + const u32 jm4 = j % 4; + + pw_buf[jd4] |= (0xff << (jm4 * 8)) & mask80; + + if (bits14) pw_buf[14] = (pw_l_len + pw_r_len) * 8; + if (bits15) pw_buf[15] = (pw_l_len + pw_r_len) * 8; +} + +extern "C" __global__ void __launch_bounds__ (256, 1) l_markov (pw_t *pws_buf_l, cs_t *root_css_buf, cs_t *markov_css_buf, const u64 off, const u32 pw_l_len, const u32 pw_r_len, const u32 mask80, const u32 bits14, const u32 bits15, const u32 gid_max) +{ + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32 pw_buf[16]; + + generate_pw (pw_buf, root_css_buf, markov_css_buf, pw_l_len, pw_r_len, mask80, bits14, bits15, off + gid); + + pws_buf_l[gid].i[ 0] = pw_buf[ 0]; + pws_buf_l[gid].i[ 1] = pw_buf[ 1]; + pws_buf_l[gid].i[ 2] = pw_buf[ 2]; + pws_buf_l[gid].i[ 3] = pw_buf[ 3]; + pws_buf_l[gid].i[ 4] = pw_buf[ 4]; + pws_buf_l[gid].i[ 5] = pw_buf[ 5]; + pws_buf_l[gid].i[ 6] = pw_buf[ 6]; + pws_buf_l[gid].i[ 7] = pw_buf[ 7]; + pws_buf_l[gid].i[ 8] = pw_buf[ 8]; + pws_buf_l[gid].i[ 9] = pw_buf[ 9]; + pws_buf_l[gid].i[10] = pw_buf[10]; + pws_buf_l[gid].i[11] = pw_buf[11]; + pws_buf_l[gid].i[12] = pw_buf[12]; + pws_buf_l[gid].i[13] = pw_buf[13]; + pws_buf_l[gid].i[14] = pw_buf[14]; + pws_buf_l[gid].i[15] = pw_buf[15]; + + pws_buf_l[gid].pw_len = pw_l_len + pw_r_len; +} + +extern "C" __global__ void __launch_bounds__ (256, 1) r_markov (bf_t *pws_buf_r, cs_t *root_css_buf, cs_t *markov_css_buf, const u64 off, const u32 pw_r_len, const u32 mask80, const u32 bits14, const u32 bits15, const u32 gid_max) +{ + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32 pw_buf[16]; + + generate_pw (pw_buf, root_css_buf, markov_css_buf, pw_r_len, 0, 0, 0, 0, off + gid); + + pws_buf_r[gid].i = pw_buf[0]; +} + +extern "C" __global__ void __launch_bounds__ (256, 1) C_markov (comb_t *pws_buf, cs_t *root_css_buf, cs_t *markov_css_buf, const u64 off, const u32 pw_len, const u32 mask80, const u32 bits14, const u32 bits15, const u32 gid_max) +{ + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + u32 pw_buf[16]; + + generate_pw (pw_buf, root_css_buf, markov_css_buf, pw_len, 0, mask80, bits14, bits15, off + gid); + + pws_buf[gid].i[ 0] = pw_buf[ 0]; + pws_buf[gid].i[ 1] = pw_buf[ 1]; + pws_buf[gid].i[ 2] = pw_buf[ 2]; + pws_buf[gid].i[ 3] = pw_buf[ 3]; + pws_buf[gid].i[ 4] = pw_buf[ 4]; + pws_buf[gid].i[ 5] = pw_buf[ 5]; + pws_buf[gid].i[ 6] = pw_buf[ 6]; + pws_buf[gid].i[ 7] = pw_buf[ 7]; + + pws_buf[gid].pw_len = pw_len; +} diff --git a/nv/markov_le_v2.cu b/nv/markov_le_v2.cu new file mode 100644 index 0000000000..23503c9489 --- /dev/null +++ b/nv/markov_le_v2.cu @@ -0,0 +1,142 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define CHARSIZ 256 + +#define VECT_SIZE2 + +#include "types_nv.c" + +__device__ static void generate_pw (u32 pw_buf[16], cs_t *root_css_buf, cs_t *markov_css_buf, const u32 pw_l_len, const u32 pw_r_len, const u32 mask80, const u32 bits14, const u32 bits15, u64 val) +{ + pw_buf[ 0] = 0; + pw_buf[ 1] = 0; + pw_buf[ 2] = 0; + pw_buf[ 3] = 0; + pw_buf[ 4] = 0; + pw_buf[ 5] = 0; + pw_buf[ 6] = 0; + pw_buf[ 7] = 0; + pw_buf[ 8] = 0; + pw_buf[ 9] = 0; + pw_buf[10] = 0; + pw_buf[11] = 0; + pw_buf[12] = 0; + pw_buf[13] = 0; + pw_buf[14] = 0; + pw_buf[15] = 0; + + cs_t *cs = &root_css_buf[pw_r_len]; + + u32 i; + u32 j; + + for (i = 0, j = pw_r_len; i < pw_l_len; i++, j++) + { + const u32 len = cs->cs_len; + + const u64 next = val / len; + const u64 pos = val % len; + + val = next; + + const u32 key = cs->cs_buf[pos]; + + const u32 jd4 = j / 4; + const u32 jm4 = j % 4; + + pw_buf[jd4] |= key << (jm4 * 8); + + cs = &markov_css_buf[(j * CHARSIZ) + key]; + } + + const u32 jd4 = j / 4; + const u32 jm4 = j % 4; + + pw_buf[jd4] |= (0xff << (jm4 * 8)) & mask80; + + if (bits14) pw_buf[14] = (pw_l_len + pw_r_len) * 8; + if (bits15) pw_buf[15] = (pw_l_len + pw_r_len) * 8; +} + +extern "C" __global__ void __launch_bounds__ (256, 1) l_markov (pw_t *pws_buf_l, cs_t *root_css_buf, cs_t *markov_css_buf, const u64 off, const u32 pw_l_len, const u32 pw_r_len, const u32 mask80, const u32 bits14, const u32 bits15, const u32 gid_max) +{ + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + const u32 gid2 = gid * 2; + + u32 pw_buf0[16]; + u32 pw_buf1[16]; + + generate_pw (pw_buf0, root_css_buf, markov_css_buf, pw_l_len, pw_r_len, mask80, bits14, bits15, off + gid2 + 0); + generate_pw (pw_buf1, root_css_buf, markov_css_buf, pw_l_len, pw_r_len, mask80, bits14, bits15, off + gid2 + 1); + + #pragma unroll 16 + for (int i = 0; i < 16; i++) + { + pws_buf_l[gid].i[i].x = pw_buf0[i]; + pws_buf_l[gid].i[i].y = pw_buf1[i]; + } + + pws_buf_l[gid].pw_len = pw_l_len + pw_r_len; +} + +extern "C" __global__ void __launch_bounds__ (256, 1) r_markov (bf_t *pws_buf_r, cs_t *root_css_buf, cs_t *markov_css_buf, const u64 off, const u32 pw_r_len, const u32 mask80, const u32 bits14, const u32 bits15, const u32 gid_max) +{ + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + const u32 gid2 = gid * 2; + + u32 pw_buf[16]; + + generate_pw (pw_buf, root_css_buf, markov_css_buf, pw_r_len, 0, 0, 0, 0, off + gid2 + 0); + + pws_buf_r[gid2 + 0].i = pw_buf[0]; + + generate_pw (pw_buf, root_css_buf, markov_css_buf, pw_r_len, 0, 0, 0, 0, off + gid2 + 1); + + pws_buf_r[gid2 + 1].i = pw_buf[0]; +} + +extern "C" __global__ void __launch_bounds__ (256, 1) C_markov (comb_t *pws_buf, cs_t *root_css_buf, cs_t *markov_css_buf, const u64 off, const u32 pw_len, const u32 mask80, const u32 bits14, const u32 bits15, const u32 gid_max) +{ + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + const u32 gid2 = gid * 2; + + u32 pw_buf[16]; + + generate_pw (pw_buf, root_css_buf, markov_css_buf, pw_len, 0, mask80, bits14, bits15, off + gid2 + 0); + + pws_buf[gid2 + 0].i[ 0] = pw_buf[ 0]; + pws_buf[gid2 + 0].i[ 1] = pw_buf[ 1]; + pws_buf[gid2 + 0].i[ 2] = pw_buf[ 2]; + pws_buf[gid2 + 0].i[ 3] = pw_buf[ 3]; + pws_buf[gid2 + 0].i[ 4] = pw_buf[ 4]; + pws_buf[gid2 + 0].i[ 5] = pw_buf[ 5]; + pws_buf[gid2 + 0].i[ 6] = pw_buf[ 6]; + pws_buf[gid2 + 0].i[ 7] = pw_buf[ 7]; + + pws_buf[gid2 + 0].pw_len = pw_len; + + generate_pw (pw_buf, root_css_buf, markov_css_buf, pw_len, 0, mask80, bits14, bits15, off + gid2 + 1); + + pws_buf[gid2 + 1].i[ 0] = pw_buf[ 0]; + pws_buf[gid2 + 1].i[ 1] = pw_buf[ 1]; + pws_buf[gid2 + 1].i[ 2] = pw_buf[ 2]; + pws_buf[gid2 + 1].i[ 3] = pw_buf[ 3]; + pws_buf[gid2 + 1].i[ 4] = pw_buf[ 4]; + pws_buf[gid2 + 1].i[ 5] = pw_buf[ 5]; + pws_buf[gid2 + 1].i[ 6] = pw_buf[ 6]; + pws_buf[gid2 + 1].i[ 7] = pw_buf[ 7]; + + pws_buf[gid2 + 1].pw_len = pw_len; +} diff --git a/nv/markov_le_v4.cu b/nv/markov_le_v4.cu new file mode 100644 index 0000000000..d41244ad35 --- /dev/null +++ b/nv/markov_le_v4.cu @@ -0,0 +1,182 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#define CHARSIZ 256 + +#define VECT_SIZE4 + +#include "types_nv.c" + +__device__ static void generate_pw (u32 pw_buf[16], cs_t *root_css_buf, cs_t *markov_css_buf, const u32 pw_l_len, const u32 pw_r_len, const u32 mask80, const u32 bits14, const u32 bits15, u64 val) +{ + pw_buf[ 0] = 0; + pw_buf[ 1] = 0; + pw_buf[ 2] = 0; + pw_buf[ 3] = 0; + pw_buf[ 4] = 0; + pw_buf[ 5] = 0; + pw_buf[ 6] = 0; + pw_buf[ 7] = 0; + pw_buf[ 8] = 0; + pw_buf[ 9] = 0; + pw_buf[10] = 0; + pw_buf[11] = 0; + pw_buf[12] = 0; + pw_buf[13] = 0; + pw_buf[14] = 0; + pw_buf[15] = 0; + + cs_t *cs = &root_css_buf[pw_r_len]; + + u32 i; + u32 j; + + for (i = 0, j = pw_r_len; i < pw_l_len; i++, j++) + { + const u32 len = cs->cs_len; + + const u64 next = val / len; + const u64 pos = val % len; + + val = next; + + const u32 key = cs->cs_buf[pos]; + + const u32 jd4 = j / 4; + const u32 jm4 = j % 4; + + pw_buf[jd4] |= key << (jm4 * 8); + + cs = &markov_css_buf[(j * CHARSIZ) + key]; + } + + const u32 jd4 = j / 4; + const u32 jm4 = j % 4; + + pw_buf[jd4] |= (0xff << (jm4 * 8)) & mask80; + + if (bits14) pw_buf[14] = (pw_l_len + pw_r_len) * 8; + if (bits15) pw_buf[15] = (pw_l_len + pw_r_len) * 8; +} + +extern "C" __global__ void __launch_bounds__ (256, 1) l_markov (pw_t *pws_buf_l, cs_t *root_css_buf, cs_t *markov_css_buf, const u64 off, const u32 pw_l_len, const u32 pw_r_len, const u32 mask80, const u32 bits14, const u32 bits15, const u32 gid_max) +{ + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + const u32 gid4 = gid * 4; + + u32 pw_buf0[16]; + u32 pw_buf1[16]; + u32 pw_buf2[16]; + u32 pw_buf3[16]; + + generate_pw (pw_buf0, root_css_buf, markov_css_buf, pw_l_len, pw_r_len, mask80, bits14, bits15, off + gid4 + 0); + generate_pw (pw_buf1, root_css_buf, markov_css_buf, pw_l_len, pw_r_len, mask80, bits14, bits15, off + gid4 + 1); + generate_pw (pw_buf2, root_css_buf, markov_css_buf, pw_l_len, pw_r_len, mask80, bits14, bits15, off + gid4 + 2); + generate_pw (pw_buf3, root_css_buf, markov_css_buf, pw_l_len, pw_r_len, mask80, bits14, bits15, off + gid4 + 3); + + #pragma unroll 16 + for (int i = 0; i < 16; i++) + { + pws_buf_l[gid].i[i].x = pw_buf0[i]; + pws_buf_l[gid].i[i].y = pw_buf1[i]; + pws_buf_l[gid].i[i].z = pw_buf2[i]; + pws_buf_l[gid].i[i].w = pw_buf3[i]; + } + + pws_buf_l[gid].pw_len = pw_l_len + pw_r_len; +} + +extern "C" __global__ void __launch_bounds__ (256, 1) r_markov (bf_t *pws_buf_r, cs_t *root_css_buf, cs_t *markov_css_buf, const u64 off, const u32 pw_r_len, const u32 mask80, const u32 bits14, const u32 bits15, const u32 gid_max) +{ + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + const u32 gid4 = gid * 4; + + u32 pw_buf[16]; + + generate_pw (pw_buf, root_css_buf, markov_css_buf, pw_r_len, 0, 0, 0, 0, off + gid4 + 0); + + pws_buf_r[gid4 + 0].i = pw_buf[0]; + + generate_pw (pw_buf, root_css_buf, markov_css_buf, pw_r_len, 0, 0, 0, 0, off + gid4 + 1); + + pws_buf_r[gid4 + 1].i = pw_buf[0]; + + generate_pw (pw_buf, root_css_buf, markov_css_buf, pw_r_len, 0, 0, 0, 0, off + gid4 + 2); + + pws_buf_r[gid4 + 2].i = pw_buf[0]; + + generate_pw (pw_buf, root_css_buf, markov_css_buf, pw_r_len, 0, 0, 0, 0, off + gid4 + 3); + + pws_buf_r[gid4 + 3].i = pw_buf[0]; +} + +extern "C" __global__ void __launch_bounds__ (256, 1) C_markov (comb_t *pws_buf, cs_t *root_css_buf, cs_t *markov_css_buf, const u64 off, const u32 pw_len, const u32 mask80, const u32 bits14, const u32 bits15, const u32 gid_max) +{ + const u32 gid = (blockIdx.x * blockDim.x) + threadIdx.x; + + if (gid >= gid_max) return; + + const u32 gid4 = gid * 4; + + u32 pw_buf[16]; + + generate_pw (pw_buf, root_css_buf, markov_css_buf, pw_len, 0, mask80, bits14, bits15, off + gid4 + 0); + + pws_buf[gid4 + 0].i[ 0] = pw_buf[ 0]; + pws_buf[gid4 + 0].i[ 1] = pw_buf[ 1]; + pws_buf[gid4 + 0].i[ 2] = pw_buf[ 2]; + pws_buf[gid4 + 0].i[ 3] = pw_buf[ 3]; + pws_buf[gid4 + 0].i[ 4] = pw_buf[ 4]; + pws_buf[gid4 + 0].i[ 5] = pw_buf[ 5]; + pws_buf[gid4 + 0].i[ 6] = pw_buf[ 6]; + pws_buf[gid4 + 0].i[ 7] = pw_buf[ 7]; + + pws_buf[gid4 + 0].pw_len = pw_len; + + generate_pw (pw_buf, root_css_buf, markov_css_buf, pw_len, 0, mask80, bits14, bits15, off + gid4 + 1); + + pws_buf[gid4 + 1].i[ 0] = pw_buf[ 0]; + pws_buf[gid4 + 1].i[ 1] = pw_buf[ 1]; + pws_buf[gid4 + 1].i[ 2] = pw_buf[ 2]; + pws_buf[gid4 + 1].i[ 3] = pw_buf[ 3]; + pws_buf[gid4 + 1].i[ 4] = pw_buf[ 4]; + pws_buf[gid4 + 1].i[ 5] = pw_buf[ 5]; + pws_buf[gid4 + 1].i[ 6] = pw_buf[ 6]; + pws_buf[gid4 + 1].i[ 7] = pw_buf[ 7]; + + pws_buf[gid4 + 1].pw_len = pw_len; + + generate_pw (pw_buf, root_css_buf, markov_css_buf, pw_len, 0, mask80, bits14, bits15, off + gid4 + 2); + + pws_buf[gid4 + 2].i[ 0] = pw_buf[ 0]; + pws_buf[gid4 + 2].i[ 1] = pw_buf[ 1]; + pws_buf[gid4 + 2].i[ 2] = pw_buf[ 2]; + pws_buf[gid4 + 2].i[ 3] = pw_buf[ 3]; + pws_buf[gid4 + 2].i[ 4] = pw_buf[ 4]; + pws_buf[gid4 + 2].i[ 5] = pw_buf[ 5]; + pws_buf[gid4 + 2].i[ 6] = pw_buf[ 6]; + pws_buf[gid4 + 2].i[ 7] = pw_buf[ 7]; + + pws_buf[gid4 + 2].pw_len = pw_len; + + generate_pw (pw_buf, root_css_buf, markov_css_buf, pw_len, 0, mask80, bits14, bits15, off + gid4 + 3); + + pws_buf[gid4 + 3].i[ 0] = pw_buf[ 0]; + pws_buf[gid4 + 3].i[ 1] = pw_buf[ 1]; + pws_buf[gid4 + 3].i[ 2] = pw_buf[ 2]; + pws_buf[gid4 + 3].i[ 3] = pw_buf[ 3]; + pws_buf[gid4 + 3].i[ 4] = pw_buf[ 4]; + pws_buf[gid4 + 3].i[ 5] = pw_buf[ 5]; + pws_buf[gid4 + 3].i[ 6] = pw_buf[ 6]; + pws_buf[gid4 + 3].i[ 7] = pw_buf[ 7]; + + pws_buf[gid4 + 3].pw_len = pw_len; +} diff --git a/nv/rp_nv.c b/nv/rp_nv.c new file mode 100644 index 0000000000..f63a1f79cc --- /dev/null +++ b/nv/rp_nv.c @@ -0,0 +1,4508 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +__device__ static u32x generate_cmask (u32x buf) +{ + const u32x rmask = ((buf & 0x40404040) >> 1) + & ~((buf & 0x80808080) >> 2); + + const u32x hmask = (buf & 0x1f1f1f1f) + 0x05050505; + const u32x lmask = (buf & 0x1f1f1f1f) + 0x1f1f1f1f; + + return rmask & ~hmask & lmask; +} + +__device__ static void truncate_right (u32x w0[4], u32x w1[4], const u32 len) +{ + const u32 tmp = (1 << ((len % 4) * 8)) - 1; + + switch (len / 4) + { + case 0: w0[0] &= tmp; + w0[1] = 0; + w0[2] = 0; + w0[3] = 0; + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + break; + case 1: w0[1] &= tmp; + w0[2] = 0; + w0[3] = 0; + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + break; + case 2: w0[2] &= tmp; + w0[3] = 0; + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + break; + case 3: w0[3] &= tmp; + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + break; + case 4: w1[0] &= tmp; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + break; + case 5: w1[1] &= tmp; + w1[2] = 0; + w1[3] = 0; + break; + case 6: w1[2] &= tmp; + w1[3] = 0; + break; + case 7: w1[3] &= tmp; + break; + } +} + +__device__ static void truncate_left (u32x w0[4], u32x w1[4], const u32 len) +{ + const u32 tmp = ~((1 << ((len % 4) * 8)) - 1); + + switch (len / 4) + { + case 0: w0[0] &= tmp; + break; + case 1: w0[0] = 0; + w0[1] &= tmp; + break; + case 2: w0[0] = 0; + w0[1] = 0; + w0[2] &= tmp; + break; + case 3: w0[0] = 0; + w0[1] = 0; + w0[2] = 0; + w0[3] &= tmp; + break; + case 4: w0[0] = 0; + w0[1] = 0; + w0[2] = 0; + w0[3] = 0; + w1[0] &= tmp; + break; + case 5: w0[0] = 0; + w0[1] = 0; + w0[2] = 0; + w0[3] = 0; + w1[0] = 0; + w1[1] &= tmp; + break; + case 6: w0[0] = 0; + w0[1] = 0; + w0[2] = 0; + w0[3] = 0; + w1[0] = 0; + w1[1] = 0; + w1[2] &= tmp; + break; + case 7: w0[0] = 0; + w0[1] = 0; + w0[2] = 0; + w0[3] = 0; + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] &= tmp; + break; + } +} + +__device__ static void lshift_block (const u32x in0[4], const u32x in1[4], u32x out0[4], u32x out1[4]) +{ + #if __CUDA_ARCH__ >= 200 + + out0[0] = __byte_perm (in0[0], in0[1], 0x4321); + out0[1] = __byte_perm (in0[1], in0[2], 0x4321); + out0[2] = __byte_perm (in0[2], in0[3], 0x4321); + out0[3] = __byte_perm (in0[3], in1[0], 0x4321); + out1[0] = __byte_perm (in1[0], in1[1], 0x4321); + out1[1] = __byte_perm (in1[1], in1[2], 0x4321); + out1[2] = __byte_perm (in1[2], in1[3], 0x4321); + out1[3] = __byte_perm (in1[3], 0, 0x4321); + + #else + + out0[0] = in0[0] >> 8 | in0[1] << 24; + out0[1] = in0[1] >> 8 | in0[2] << 24; + out0[2] = in0[2] >> 8 | in0[3] << 24; + out0[3] = in0[3] >> 8 | in1[0] << 24; + out1[0] = in1[0] >> 8 | in1[1] << 24; + out1[1] = in1[1] >> 8 | in1[2] << 24; + out1[2] = in1[2] >> 8 | in1[3] << 24; + out1[3] = in1[3] >> 8; + + #endif +} + +__device__ static void rshift_block (const u32x in0[4], const u32x in1[4], u32x out0[4], u32x out1[4]) +{ + #if __CUDA_ARCH__ >= 200 + + out1[3] = __byte_perm (in1[2], in1[3], 0x6543); + out1[2] = __byte_perm (in1[1], in1[2], 0x6543); + out1[1] = __byte_perm (in1[0], in1[1], 0x6543); + out1[0] = __byte_perm (in0[3], in1[0], 0x6543); + out0[3] = __byte_perm (in0[2], in0[3], 0x6543); + out0[2] = __byte_perm (in0[1], in0[2], 0x6543); + out0[1] = __byte_perm (in0[0], in0[1], 0x6543); + out0[0] = __byte_perm ( 0, in0[0], 0x6543); + + #else + + out1[3] = in1[3] << 8 | in1[2] >> 24; + out1[2] = in1[2] << 8 | in1[1] >> 24; + out1[1] = in1[1] << 8 | in1[0] >> 24; + out1[0] = in1[0] << 8 | in0[3] >> 24; + out0[3] = in0[3] << 8 | in0[2] >> 24; + out0[2] = in0[2] << 8 | in0[1] >> 24; + out0[1] = in0[1] << 8 | in0[0] >> 24; + out0[0] = in0[0] << 8; + + #endif +} + +__device__ static void rshift_block_N (const u32x in0[4], const u32x in1[4], u32x out0[4], u32x out1[4], const u32 num) +{ + #if __CUDA_ARCH__ >= 200 + + switch (num) + { + case 0: out1[3] = in1[3]; + out1[2] = in1[2]; + out1[1] = in1[1]; + out1[0] = in1[0]; + out0[3] = in0[3]; + out0[2] = in0[2]; + out0[1] = in0[1]; + out0[0] = in0[0]; + break; + case 1: out1[3] = __byte_perm (in1[2], in1[3], 0x6543); + out1[2] = __byte_perm (in1[1], in1[2], 0x6543); + out1[1] = __byte_perm (in1[0], in1[1], 0x6543); + out1[0] = __byte_perm (in0[3], in1[0], 0x6543); + out0[3] = __byte_perm (in0[2], in0[3], 0x6543); + out0[2] = __byte_perm (in0[1], in0[2], 0x6543); + out0[1] = __byte_perm (in0[0], in0[1], 0x6543); + out0[0] = __byte_perm ( 0, in0[0], 0x6543); + break; + case 2: out1[3] = __byte_perm (in1[2], in1[3], 0x5432); + out1[2] = __byte_perm (in1[1], in1[2], 0x5432); + out1[1] = __byte_perm (in1[0], in1[1], 0x5432); + out1[0] = __byte_perm (in0[3], in1[0], 0x5432); + out0[3] = __byte_perm (in0[2], in0[3], 0x5432); + out0[2] = __byte_perm (in0[1], in0[2], 0x5432); + out0[1] = __byte_perm (in0[0], in0[1], 0x5432); + out0[0] = __byte_perm ( 0, in0[0], 0x5432); + break; + case 3: out1[3] = __byte_perm (in1[2], in1[3], 0x4321); + out1[2] = __byte_perm (in1[1], in1[2], 0x4321); + out1[1] = __byte_perm (in1[0], in1[1], 0x4321); + out1[0] = __byte_perm (in0[3], in1[0], 0x4321); + out0[3] = __byte_perm (in0[2], in0[3], 0x4321); + out0[2] = __byte_perm (in0[1], in0[2], 0x4321); + out0[1] = __byte_perm (in0[0], in0[1], 0x4321); + out0[0] = __byte_perm ( 0, in0[0], 0x4321); + break; + case 4: out1[3] = in1[2]; + out1[2] = in1[1]; + out1[1] = in1[0]; + out1[0] = in0[3]; + out0[3] = in0[2]; + out0[2] = in0[1]; + out0[1] = in0[0]; + out0[0] = 0; + break; + case 5: out1[3] = __byte_perm (in1[1], in1[2], 0x6543); + out1[2] = __byte_perm (in1[0], in1[1], 0x6543); + out1[1] = __byte_perm (in0[3], in1[0], 0x6543); + out1[0] = __byte_perm (in0[2], in0[3], 0x6543); + out0[3] = __byte_perm (in0[1], in0[2], 0x6543); + out0[2] = __byte_perm (in0[0], in0[1], 0x6543); + out0[1] = __byte_perm ( 0, in0[0], 0x6543); + out0[0] = 0; + break; + case 6: out1[3] = __byte_perm (in1[1], in1[2], 0x5432); + out1[2] = __byte_perm (in1[0], in1[1], 0x5432); + out1[1] = __byte_perm (in0[3], in1[0], 0x5432); + out1[0] = __byte_perm (in0[2], in0[3], 0x5432); + out0[3] = __byte_perm (in0[1], in0[2], 0x5432); + out0[2] = __byte_perm (in0[0], in0[1], 0x5432); + out0[1] = __byte_perm ( 0, in0[0], 0x5432); + out0[0] = 0; + break; + case 7: out1[3] = __byte_perm (in1[1], in1[2], 0x4321); + out1[2] = __byte_perm (in1[0], in1[1], 0x4321); + out1[1] = __byte_perm (in0[3], in1[0], 0x4321); + out1[0] = __byte_perm (in0[2], in0[3], 0x4321); + out0[3] = __byte_perm (in0[1], in0[2], 0x4321); + out0[2] = __byte_perm (in0[0], in0[1], 0x4321); + out0[1] = __byte_perm ( 0, in0[0], 0x4321); + out0[0] = 0; + break; + case 8: out1[3] = in1[1]; + out1[2] = in1[0]; + out1[1] = in0[3]; + out1[0] = in0[2]; + out0[3] = in0[1]; + out0[2] = in0[0]; + out0[1] = 0; + out0[0] = 0; + break; + case 9: out1[3] = __byte_perm (in1[0], in1[1], 0x6543); + out1[2] = __byte_perm (in0[3], in1[0], 0x6543); + out1[1] = __byte_perm (in0[2], in0[3], 0x6543); + out1[0] = __byte_perm (in0[1], in0[2], 0x6543); + out0[3] = __byte_perm (in0[0], in0[1], 0x6543); + out0[2] = __byte_perm ( 0, in0[0], 0x6543); + out0[1] = 0; + out0[0] = 0; + break; + case 10: out1[3] = __byte_perm (in1[0], in1[1], 0x5432); + out1[2] = __byte_perm (in0[3], in1[0], 0x5432); + out1[1] = __byte_perm (in0[2], in0[3], 0x5432); + out1[0] = __byte_perm (in0[1], in0[2], 0x5432); + out0[3] = __byte_perm (in0[0], in0[1], 0x5432); + out0[2] = __byte_perm ( 0, in0[0], 0x5432); + out0[1] = 0; + out0[0] = 0; + break; + case 11: out1[3] = __byte_perm (in1[0], in1[1], 0x4321); + out1[2] = __byte_perm (in0[3], in1[0], 0x4321); + out1[1] = __byte_perm (in0[2], in0[3], 0x4321); + out1[0] = __byte_perm (in0[1], in0[2], 0x4321); + out0[3] = __byte_perm (in0[0], in0[1], 0x4321); + out0[2] = __byte_perm ( 0, in0[0], 0x4321); + out0[1] = 0; + out0[0] = 0; + break; + case 12: out1[3] = in1[0]; + out1[2] = in0[3]; + out1[1] = in0[2]; + out1[0] = in0[1]; + out0[3] = in0[0]; + out0[2] = 0; + out0[1] = 0; + out0[0] = 0; + break; + case 13: out1[3] = __byte_perm (in0[3], in1[0], 0x6543); + out1[2] = __byte_perm (in0[2], in0[3], 0x6543); + out1[1] = __byte_perm (in0[1], in0[2], 0x6543); + out1[0] = __byte_perm (in0[0], in0[1], 0x6543); + out0[3] = __byte_perm ( 0, in0[0], 0x6543); + out0[2] = 0; + out0[1] = 0; + out0[0] = 0; + break; + case 14: out1[3] = __byte_perm (in0[3], in1[0], 0x5432); + out1[2] = __byte_perm (in0[2], in0[3], 0x5432); + out1[1] = __byte_perm (in0[1], in0[2], 0x5432); + out1[0] = __byte_perm (in0[0], in0[1], 0x5432); + out0[3] = __byte_perm ( 0, in0[0], 0x5432); + out0[2] = 0; + out0[1] = 0; + out0[0] = 0; + break; + case 15: out1[3] = __byte_perm (in0[3], in1[0], 0x4321); + out1[2] = __byte_perm (in0[2], in0[3], 0x4321); + out1[1] = __byte_perm (in0[1], in0[2], 0x4321); + out1[0] = __byte_perm (in0[0], in0[1], 0x4321); + out0[3] = __byte_perm ( 0, in0[0], 0x4321); + out0[2] = 0; + out0[1] = 0; + out0[0] = 0; + break; + case 16: out1[3] = in0[3]; + out1[2] = in0[2]; + out1[1] = in0[1]; + out1[0] = in0[0]; + out0[3] = 0; + out0[2] = 0; + out0[1] = 0; + out0[0] = 0; + break; + case 17: out1[3] = __byte_perm (in0[2], in0[3], 0x6543); + out1[2] = __byte_perm (in0[1], in0[2], 0x6543); + out1[1] = __byte_perm (in0[0], in0[1], 0x6543); + out1[0] = __byte_perm ( 0, in0[0], 0x6543); + out0[3] = 0; + out0[2] = 0; + out0[1] = 0; + out0[0] = 0; + break; + case 18: out1[3] = __byte_perm (in0[2], in0[3], 0x5432); + out1[2] = __byte_perm (in0[1], in0[2], 0x5432); + out1[1] = __byte_perm (in0[0], in0[1], 0x5432); + out1[0] = __byte_perm ( 0, in0[0], 0x5432); + out0[3] = 0; + out0[2] = 0; + out0[1] = 0; + out0[0] = 0; + break; + case 19: out1[3] = __byte_perm (in0[2], in0[3], 0x4321); + out1[2] = __byte_perm (in0[1], in0[2], 0x4321); + out1[1] = __byte_perm (in0[0], in0[1], 0x4321); + out1[0] = __byte_perm ( 0, in0[0], 0x4321); + out0[3] = 0; + out0[2] = 0; + out0[1] = 0; + out0[0] = 0; + break; + case 20: out1[3] = in0[2]; + out1[2] = in0[1]; + out1[1] = in0[0]; + out1[0] = 0; + out0[3] = 0; + out0[2] = 0; + out0[1] = 0; + out0[0] = 0; + break; + case 21: out1[3] = __byte_perm (in0[1], in0[2], 0x6543); + out1[2] = __byte_perm (in0[0], in0[1], 0x6543); + out1[1] = __byte_perm ( 0, in0[0], 0x6543); + out1[0] = 0; + out0[3] = 0; + out0[2] = 0; + out0[1] = 0; + out0[0] = 0; + break; + case 22: out1[3] = __byte_perm (in0[1], in0[2], 0x5432); + out1[2] = __byte_perm (in0[0], in0[1], 0x5432); + out1[1] = __byte_perm ( 0, in0[0], 0x5432); + out1[0] = 0; + out0[3] = 0; + out0[2] = 0; + out0[1] = 0; + out0[0] = 0; + break; + case 23: out1[3] = __byte_perm (in0[1], in0[2], 0x4321); + out1[2] = __byte_perm (in0[0], in0[1], 0x4321); + out1[1] = __byte_perm ( 0, in0[0], 0x4321); + out1[0] = 0; + out0[3] = 0; + out0[2] = 0; + out0[1] = 0; + out0[0] = 0; + break; + case 24: out1[3] = in0[1]; + out1[2] = in0[0]; + out1[1] = 0; + out1[0] = 0; + out0[3] = 0; + out0[2] = 0; + out0[1] = 0; + out0[0] = 0; + break; + case 25: out1[3] = __byte_perm (in0[0], in0[1], 0x6543); + out1[2] = __byte_perm ( 0, in0[0], 0x6543); + out1[1] = 0; + out1[0] = 0; + out0[3] = 0; + out0[2] = 0; + out0[1] = 0; + out0[0] = 0; + break; + case 26: out1[3] = __byte_perm (in0[0], in0[1], 0x5432); + out1[2] = __byte_perm ( 0, in0[0], 0x5432); + out1[1] = 0; + out1[0] = 0; + out0[3] = 0; + out0[2] = 0; + out0[1] = 0; + out0[0] = 0; + break; + case 27: out1[3] = __byte_perm (in0[0], in0[1], 0x4321); + out1[2] = __byte_perm ( 0, in0[0], 0x4321); + out1[1] = 0; + out1[0] = 0; + out0[3] = 0; + out0[2] = 0; + out0[1] = 0; + out0[0] = 0; + break; + case 28: out1[3] = in0[0]; + out1[2] = 0; + out1[1] = 0; + out1[0] = 0; + out0[3] = 0; + out0[2] = 0; + out0[1] = 0; + out0[0] = 0; + break; + case 29: out1[3] = __byte_perm ( 0, in0[0], 0x6543); + out1[2] = 0; + out1[1] = 0; + out1[0] = 0; + out0[3] = 0; + out0[2] = 0; + out0[1] = 0; + out0[0] = 0; + break; + case 30: out1[3] = __byte_perm ( 0, in0[0], 0x5432); + out1[2] = 0; + out1[1] = 0; + out1[0] = 0; + out0[3] = 0; + out0[2] = 0; + out0[1] = 0; + out0[0] = 0; + break; + case 31: out1[3] = __byte_perm ( 0, in0[0], 0x4321); + out1[2] = 0; + out1[1] = 0; + out1[0] = 0; + out0[3] = 0; + out0[2] = 0; + out0[1] = 0; + out0[0] = 0; + break; + } + + #else + + switch (num) + { + case 0: out1[3] = in1[3]; + out1[2] = in1[2]; + out1[1] = in1[1]; + out1[0] = in1[0]; + out0[3] = in0[3]; + out0[2] = in0[2]; + out0[1] = in0[1]; + out0[0] = in0[0]; + break; + case 1: out1[3] = in1[3] << 8 | in1[2] >> 24; + out1[2] = in1[2] << 8 | in1[1] >> 24; + out1[1] = in1[1] << 8 | in1[0] >> 24; + out1[0] = in1[0] << 8 | in0[3] >> 24; + out0[3] = in0[3] << 8 | in0[2] >> 24; + out0[2] = in0[2] << 8 | in0[1] >> 24; + out0[1] = in0[1] << 8 | in0[0] >> 24; + out0[0] = in0[0] << 8; + break; + case 2: out1[3] = in1[3] << 16 | in1[2] >> 16; + out1[2] = in1[2] << 16 | in1[1] >> 16; + out1[1] = in1[1] << 16 | in1[0] >> 16; + out1[0] = in1[0] << 16 | in0[3] >> 16; + out0[3] = in0[3] << 16 | in0[2] >> 16; + out0[2] = in0[2] << 16 | in0[1] >> 16; + out0[1] = in0[1] << 16 | in0[0] >> 16; + out0[0] = in0[0] << 16; + break; + case 3: out1[3] = in1[3] << 24 | in1[2] >> 8; + out1[2] = in1[2] << 24 | in1[1] >> 8; + out1[1] = in1[1] << 24 | in1[0] >> 8; + out1[0] = in1[0] << 24 | in0[3] >> 8; + out0[3] = in0[3] << 24 | in0[2] >> 8; + out0[2] = in0[2] << 24 | in0[1] >> 8; + out0[1] = in0[1] << 24 | in0[0] >> 8; + out0[0] = in0[0] << 24; + break; + case 4: out1[3] = in1[2]; + out1[2] = in1[1]; + out1[1] = in1[0]; + out1[0] = in0[3]; + out0[3] = in0[2]; + out0[2] = in0[1]; + out0[1] = in0[0]; + out0[0] = 0; + break; + case 5: out1[3] = in1[2] << 8 | in1[1] >> 24; + out1[2] = in1[1] << 8 | in1[0] >> 24; + out1[1] = in1[0] << 8 | in0[3] >> 24; + out1[0] = in0[3] << 8 | in0[2] >> 24; + out0[3] = in0[2] << 8 | in0[1] >> 24; + out0[2] = in0[1] << 8 | in0[0] >> 24; + out0[1] = in0[0] << 8; + out0[0] = 0; + break; + case 6: out1[3] = in1[2] << 16 | in1[1] >> 16; + out1[2] = in1[1] << 16 | in1[0] >> 16; + out1[1] = in1[0] << 16 | in0[3] >> 16; + out1[0] = in0[3] << 16 | in0[2] >> 16; + out0[3] = in0[2] << 16 | in0[1] >> 16; + out0[2] = in0[1] << 16 | in0[0] >> 16; + out0[1] = in0[0] << 16; + out0[0] = 0; + break; + case 7: out1[3] = in1[2] << 24 | in1[1] >> 8; + out1[2] = in1[1] << 24 | in1[0] >> 8; + out1[1] = in1[0] << 24 | in0[3] >> 8; + out1[0] = in0[3] << 24 | in0[2] >> 8; + out0[3] = in0[2] << 24 | in0[1] >> 8; + out0[2] = in0[1] << 24 | in0[0] >> 8; + out0[1] = in0[0] << 24; + out0[0] = 0; + break; + case 8: out1[3] = in1[1]; + out1[2] = in1[0]; + out1[1] = in0[3]; + out1[0] = in0[2]; + out0[3] = in0[1]; + out0[2] = in0[0]; + out0[1] = 0; + out0[0] = 0; + break; + case 9: out1[3] = in1[1] << 8 | in1[0] >> 24; + out1[2] = in1[0] << 8 | in0[3] >> 24; + out1[1] = in0[3] << 8 | in0[2] >> 24; + out1[0] = in0[2] << 8 | in0[1] >> 24; + out0[3] = in0[1] << 8 | in0[0] >> 24; + out0[2] = in0[0] << 8; + out0[1] = 0; + out0[0] = 0; + break; + case 10: out1[3] = in1[1] << 16 | in1[0] >> 16; + out1[2] = in1[0] << 16 | in0[3] >> 16; + out1[1] = in0[3] << 16 | in0[2] >> 16; + out1[0] = in0[2] << 16 | in0[1] >> 16; + out0[3] = in0[1] << 16 | in0[0] >> 16; + out0[2] = in0[0] << 16; + out0[1] = 0; + out0[0] = 0; + break; + case 11: out1[3] = in1[1] << 24 | in1[0] >> 8; + out1[2] = in1[0] << 24 | in0[3] >> 8; + out1[1] = in0[3] << 24 | in0[2] >> 8; + out1[0] = in0[2] << 24 | in0[1] >> 8; + out0[3] = in0[1] << 24 | in0[0] >> 8; + out0[2] = in0[0] << 24; + out0[1] = 0; + out0[0] = 0; + break; + case 12: out1[3] = in1[0]; + out1[2] = in0[3]; + out1[1] = in0[2]; + out1[0] = in0[1]; + out0[3] = in0[0]; + out0[2] = 0; + out0[1] = 0; + out0[0] = 0; + break; + case 13: out1[3] = in1[0] << 8 | in0[3] >> 24; + out1[2] = in0[3] << 8 | in0[2] >> 24; + out1[1] = in0[2] << 8 | in0[1] >> 24; + out1[0] = in0[1] << 8 | in0[0] >> 24; + out0[3] = in0[0] << 8; + out0[2] = 0; + out0[1] = 0; + out0[0] = 0; + break; + case 14: out1[3] = in1[0] << 16 | in0[3] >> 16; + out1[2] = in0[3] << 16 | in0[2] >> 16; + out1[1] = in0[2] << 16 | in0[1] >> 16; + out1[0] = in0[1] << 16 | in0[0] >> 16; + out0[3] = in0[0] << 16; + out0[2] = 0; + out0[1] = 0; + out0[0] = 0; + break; + case 15: out1[3] = in1[0] << 24 | in0[3] >> 8; + out1[2] = in0[3] << 24 | in0[2] >> 8; + out1[1] = in0[2] << 24 | in0[1] >> 8; + out1[0] = in0[1] << 24 | in0[0] >> 8; + out0[3] = in0[0] << 24; + out0[2] = 0; + out0[1] = 0; + out0[0] = 0; + break; + case 16: out1[3] = in0[3]; + out1[2] = in0[2]; + out1[1] = in0[1]; + out1[0] = in0[0]; + out0[3] = 0; + out0[2] = 0; + out0[1] = 0; + out0[0] = 0; + break; + case 17: out1[3] = in0[3] << 8 | in0[2] >> 24; + out1[2] = in0[2] << 8 | in0[1] >> 24; + out1[1] = in0[1] << 8 | in0[0] >> 24; + out1[0] = in0[0] << 8; + out0[3] = 0; + out0[2] = 0; + out0[1] = 0; + out0[0] = 0; + break; + case 18: out1[3] = in0[3] << 16 | in0[2] >> 16; + out1[2] = in0[2] << 16 | in0[1] >> 16; + out1[1] = in0[1] << 16 | in0[0] >> 16; + out1[0] = in0[0] << 16; + out0[3] = 0; + out0[2] = 0; + out0[1] = 0; + out0[0] = 0; + break; + case 19: out1[3] = in0[3] << 24 | in0[2] >> 8; + out1[2] = in0[2] << 24 | in0[1] >> 8; + out1[1] = in0[1] << 24 | in0[0] >> 8; + out1[0] = in0[0] << 24; + out0[3] = 0; + out0[2] = 0; + out0[1] = 0; + out0[0] = 0; + break; + case 20: out1[3] = in0[2]; + out1[2] = in0[1]; + out1[1] = in0[0]; + out1[0] = 0; + out0[3] = 0; + out0[2] = 0; + out0[1] = 0; + out0[0] = 0; + break; + case 21: out1[3] = in0[2] << 8 | in0[1] >> 24; + out1[2] = in0[1] << 8 | in0[0] >> 24; + out1[1] = in0[0] << 8; + out1[0] = 0; + out0[3] = 0; + out0[2] = 0; + out0[1] = 0; + out0[0] = 0; + break; + case 22: out1[3] = in0[2] << 16 | in0[1] >> 16; + out1[2] = in0[1] << 16 | in0[0] >> 16; + out1[1] = in0[0] << 16; + out1[0] = 0; + out0[3] = 0; + out0[2] = 0; + out0[1] = 0; + out0[0] = 0; + break; + case 23: out1[3] = in0[2] << 24 | in0[1] >> 8; + out1[2] = in0[1] << 24 | in0[0] >> 8; + out1[1] = in0[0] << 24; + out1[0] = 0; + out0[3] = 0; + out0[2] = 0; + out0[1] = 0; + out0[0] = 0; + break; + case 24: out1[3] = in0[1]; + out1[2] = in0[0]; + out1[1] = 0; + out1[0] = 0; + out0[3] = 0; + out0[2] = 0; + out0[1] = 0; + out0[0] = 0; + break; + case 25: out1[3] = in0[1] << 8 | in0[0] >> 24; + out1[2] = in0[0] << 8; + out1[1] = 0; + out1[0] = 0; + out0[3] = 0; + out0[2] = 0; + out0[1] = 0; + out0[0] = 0; + break; + case 26: out1[3] = in0[1] << 16 | in0[0] >> 16; + out1[2] = in0[0] << 16; + out1[1] = 0; + out1[0] = 0; + out0[3] = 0; + out0[2] = 0; + out0[1] = 0; + out0[0] = 0; + break; + case 27: out1[3] = in0[1] << 24 | in0[0] >> 8; + out1[2] = in0[0] << 24; + out1[1] = 0; + out1[0] = 0; + out0[3] = 0; + out0[2] = 0; + out0[1] = 0; + out0[0] = 0; + break; + case 28: out1[3] = in0[0]; + out1[2] = 0; + out1[1] = 0; + out1[0] = 0; + out0[3] = 0; + out0[2] = 0; + out0[1] = 0; + out0[0] = 0; + break; + case 29: out1[3] = in0[0] << 8; + out1[2] = 0; + out1[1] = 0; + out1[0] = 0; + out0[3] = 0; + out0[2] = 0; + out0[1] = 0; + out0[0] = 0; + break; + case 30: out1[3] = in0[0] << 16; + out1[2] = 0; + out1[1] = 0; + out1[0] = 0; + out0[3] = 0; + out0[2] = 0; + out0[1] = 0; + out0[0] = 0; + break; + case 31: out1[3] = in0[0] << 24; + out1[2] = 0; + out1[1] = 0; + out1[0] = 0; + out0[3] = 0; + out0[2] = 0; + out0[1] = 0; + out0[0] = 0; + break; + } + + #endif +} + +__device__ static void lshift_block_N (const u32x in0[4], const u32x in1[4], u32x out0[4], u32x out1[4], const u32 num) +{ + #if __CUDA_ARCH__ >= 200 + + switch (num) + { + case 0: out0[0] = in0[0]; + out0[1] = in0[1]; + out0[2] = in0[2]; + out0[3] = in0[3]; + out1[0] = in1[0]; + out1[1] = in1[1]; + out1[2] = in1[2]; + out1[3] = in1[3]; + break; + case 1: out0[0] = __byte_perm (in0[0], in0[1], 0x4321); + out0[1] = __byte_perm (in0[1], in0[2], 0x4321); + out0[2] = __byte_perm (in0[2], in0[3], 0x4321); + out0[3] = __byte_perm (in0[3], in1[0], 0x4321); + out1[0] = __byte_perm (in1[0], in1[1], 0x4321); + out1[1] = __byte_perm (in1[1], in1[2], 0x4321); + out1[2] = __byte_perm (in1[2], in1[3], 0x4321); + out1[3] = __byte_perm (in1[3], 0, 0x4321); + break; + case 2: out0[0] = __byte_perm (in0[0], in0[1], 0x5432); + out0[1] = __byte_perm (in0[1], in0[2], 0x5432); + out0[2] = __byte_perm (in0[2], in0[3], 0x5432); + out0[3] = __byte_perm (in0[3], in1[0], 0x5432); + out1[0] = __byte_perm (in1[0], in1[1], 0x5432); + out1[1] = __byte_perm (in1[1], in1[2], 0x5432); + out1[2] = __byte_perm (in1[2], in1[3], 0x5432); + out1[3] = __byte_perm (in1[3], 0, 0x5432); + break; + case 3: out0[0] = __byte_perm (in0[0], in0[1], 0x6543); + out0[1] = __byte_perm (in0[1], in0[2], 0x6543); + out0[2] = __byte_perm (in0[2], in0[3], 0x6543); + out0[3] = __byte_perm (in0[3], in1[0], 0x6543); + out1[0] = __byte_perm (in1[0], in1[1], 0x6543); + out1[1] = __byte_perm (in1[1], in1[2], 0x6543); + out1[2] = __byte_perm (in1[2], in1[3], 0x6543); + out1[3] = __byte_perm (in1[3], 0, 0x6543); + break; + case 4: out0[0] = in0[1]; + out0[1] = in0[2]; + out0[2] = in0[3]; + out0[3] = in1[0]; + out1[0] = in1[1]; + out1[1] = in1[2]; + out1[2] = in1[3]; + out1[3] = 0; + break; + case 5: out0[0] = __byte_perm (in0[1], in0[2], 0x4321); + out0[1] = __byte_perm (in0[2], in0[3], 0x4321); + out0[2] = __byte_perm (in0[3], in1[0], 0x4321); + out0[3] = __byte_perm (in1[0], in1[1], 0x4321); + out1[0] = __byte_perm (in1[1], in1[2], 0x4321); + out1[1] = __byte_perm (in1[2], in1[3], 0x4321); + out1[2] = __byte_perm (in1[3], 0, 0x4321); + out1[3] = 0; + break; + case 6: out0[0] = __byte_perm (in0[1], in0[2], 0x5432); + out0[1] = __byte_perm (in0[2], in0[3], 0x5432); + out0[2] = __byte_perm (in0[3], in1[0], 0x5432); + out0[3] = __byte_perm (in1[0], in1[1], 0x5432); + out1[0] = __byte_perm (in1[1], in1[2], 0x5432); + out1[1] = __byte_perm (in1[2], in1[3], 0x5432); + out1[2] = __byte_perm (in1[3], 0, 0x5432); + out1[3] = 0; + break; + case 7: out0[0] = __byte_perm (in0[1], in0[2], 0x6543); + out0[1] = __byte_perm (in0[2], in0[3], 0x6543); + out0[2] = __byte_perm (in0[3], in1[0], 0x6543); + out0[3] = __byte_perm (in1[0], in1[1], 0x6543); + out1[0] = __byte_perm (in1[1], in1[2], 0x6543); + out1[1] = __byte_perm (in1[2], in1[3], 0x6543); + out1[2] = __byte_perm (in1[3], 0, 0x6543); + out1[3] = 0; + break; + case 8: out0[0] = in0[2]; + out0[1] = in0[3]; + out0[2] = in1[0]; + out0[3] = in1[1]; + out1[0] = in1[2]; + out1[1] = in1[3]; + out1[2] = 0; + out1[3] = 0; + break; + case 9: out0[0] = __byte_perm (in0[2], in0[3], 0x4321); + out0[1] = __byte_perm (in0[3], in1[0], 0x4321); + out0[2] = __byte_perm (in1[0], in1[1], 0x4321); + out0[3] = __byte_perm (in1[1], in1[2], 0x4321); + out1[0] = __byte_perm (in1[2], in1[3], 0x4321); + out1[1] = __byte_perm (in1[3], 0, 0x4321); + out1[2] = 0; + out1[3] = 0; + break; + case 10: out0[0] = __byte_perm (in0[2], in0[3], 0x5432); + out0[1] = __byte_perm (in0[3], in1[0], 0x5432); + out0[2] = __byte_perm (in1[0], in1[1], 0x5432); + out0[3] = __byte_perm (in1[1], in1[2], 0x5432); + out1[0] = __byte_perm (in1[2], in1[3], 0x5432); + out1[1] = __byte_perm (in1[3], 0, 0x5432); + out1[2] = 0; + out1[3] = 0; + break; + case 11: out0[0] = __byte_perm (in0[2], in0[3], 0x6543); + out0[1] = __byte_perm (in0[3], in1[0], 0x6543); + out0[2] = __byte_perm (in1[0], in1[1], 0x6543); + out0[3] = __byte_perm (in1[1], in1[2], 0x6543); + out1[0] = __byte_perm (in1[2], in1[3], 0x6543); + out1[1] = __byte_perm (in1[3], 0, 0x6543); + out1[2] = 0; + out1[3] = 0; + break; + case 12: out0[0] = in0[3]; + out0[1] = in1[0]; + out0[2] = in1[1]; + out0[3] = in1[2]; + out1[0] = in1[3]; + out1[1] = 0; + out1[2] = 0; + out1[3] = 0; + break; + case 13: + out0[0] = __byte_perm (in0[3], in1[0], 0x4321); + out0[1] = __byte_perm (in1[0], in1[1], 0x4321); + out0[2] = __byte_perm (in1[1], in1[2], 0x4321); + out0[3] = __byte_perm (in1[2], in1[3], 0x4321); + out1[0] = __byte_perm (in1[3], 0, 0x4321); + out1[1] = 0; + out1[2] = 0; + out1[3] = 0; + break; + case 14: out0[0] = __byte_perm (in0[3], in1[0], 0x5432); + out0[1] = __byte_perm (in1[0], in1[1], 0x5432); + out0[2] = __byte_perm (in1[1], in1[2], 0x5432); + out0[3] = __byte_perm (in1[2], in1[3], 0x5432); + out1[0] = __byte_perm (in1[3], 0, 0x5432); + out1[1] = 0; + out1[2] = 0; + out1[3] = 0; + break; + case 15: out0[0] = __byte_perm (in0[3], in1[0], 0x6543); + out0[1] = __byte_perm (in1[0], in1[1], 0x6543); + out0[2] = __byte_perm (in1[1], in1[2], 0x6543); + out0[3] = __byte_perm (in1[2], in1[3], 0x6543); + out1[0] = __byte_perm (in1[3], 0, 0x6543); + out1[1] = 0; + out1[2] = 0; + out1[3] = 0; + break; + case 16: out0[0] = in1[0]; + out0[1] = in1[1]; + out0[2] = in1[2]; + out0[3] = in1[3]; + out1[0] = 0; + out1[1] = 0; + out1[2] = 0; + out1[3] = 0; + break; + case 17: out0[0] = __byte_perm (in1[0], in1[1], 0x4321); + out0[1] = __byte_perm (in1[1], in1[2], 0x4321); + out0[2] = __byte_perm (in1[2], in1[3], 0x4321); + out0[3] = __byte_perm (in1[3], 0, 0x4321); + out1[0] = 0; + out1[1] = 0; + out1[2] = 0; + out1[3] = 0; + break; + case 18: out0[0] = __byte_perm (in1[0], in1[1], 0x5432); + out0[1] = __byte_perm (in1[1], in1[2], 0x5432); + out0[2] = __byte_perm (in1[2], in1[3], 0x5432); + out0[3] = __byte_perm (in1[3], 0, 0x5432); + out1[0] = 0; + out1[1] = 0; + out1[2] = 0; + out1[3] = 0; + break; + case 19: out0[0] = __byte_perm (in1[0], in1[1], 0x6543); + out0[1] = __byte_perm (in1[1], in1[2], 0x6543); + out0[2] = __byte_perm (in1[2], in1[3], 0x6543); + out0[3] = __byte_perm (in1[3], 0, 0x6543); + out1[0] = 0; + out1[1] = 0; + out1[2] = 0; + out1[3] = 0; + break; + case 20: out0[0] = in1[1]; + out0[1] = in1[2]; + out0[2] = in1[3]; + out0[3] = 0; + out1[0] = 0; + out1[1] = 0; + out1[2] = 0; + out1[3] = 0; + break; + case 21: out0[0] = __byte_perm (in1[1], in1[2], 0x4321); + out0[1] = __byte_perm (in1[2], in1[3], 0x4321); + out0[2] = __byte_perm (in1[3], 0, 0x4321); + out0[3] = 0; + out1[0] = 0; + out1[1] = 0; + out1[2] = 0; + out1[3] = 0; + break; + case 22: out0[0] = __byte_perm (in1[1], in1[2], 0x5432); + out0[1] = __byte_perm (in1[2], in1[3], 0x5432); + out0[2] = __byte_perm (in1[3], 0, 0x5432); + out0[3] = 0; + out1[0] = 0; + out1[1] = 0; + out1[2] = 0; + out1[3] = 0; + break; + case 23: out0[0] = __byte_perm (in1[1], in1[2], 0x6543); + out0[1] = __byte_perm (in1[2], in1[3], 0x6543); + out0[2] = __byte_perm (in1[3], 0, 0x6543); + out0[3] = 0; + out1[0] = 0; + out1[1] = 0; + out1[2] = 0; + out1[3] = 0; + break; + case 24: out0[0] = in1[2]; + out0[1] = in1[3]; + out0[2] = 0; + out0[3] = 0; + out1[0] = 0; + out1[1] = 0; + out1[2] = 0; + out1[3] = 0; + break; + case 25: out0[0] = __byte_perm (in1[2], in1[3], 0x4321); + out0[1] = __byte_perm (in1[3], 0, 0x4321); + out0[2] = 0; + out0[3] = 0; + out1[0] = 0; + out1[1] = 0; + out1[2] = 0; + out1[3] = 0; + break; + case 26: out0[0] = __byte_perm (in1[2], in1[3], 0x5432); + out0[1] = __byte_perm (in1[3], 0, 0x5432); + out0[2] = 0; + out0[3] = 0; + out1[0] = 0; + out1[1] = 0; + out1[2] = 0; + out1[3] = 0; + break; + case 27: out0[0] = __byte_perm (in1[2], in1[3], 0x6543); + out0[1] = __byte_perm (in1[3], 0, 0x6543); + out0[2] = 0; + out0[3] = 0; + out1[0] = 0; + out1[1] = 0; + out1[2] = 0; + out1[3] = 0; + break; + case 28: out0[0] = in1[3]; + out0[1] = 0; + out0[2] = 0; + out0[3] = 0; + out1[0] = 0; + out1[1] = 0; + out1[2] = 0; + out1[3] = 0; + break; + case 29: out0[0] = __byte_perm (in1[3], 0, 0x4321); + out0[1] = 0; + out0[2] = 0; + out0[3] = 0; + out1[0] = 0; + out1[1] = 0; + out1[2] = 0; + out1[3] = 0; + break; + case 30: out0[0] = __byte_perm (in1[3], 0, 0x5432); + out0[1] = 0; + out0[2] = 0; + out0[3] = 0; + out1[0] = 0; + out1[1] = 0; + out1[2] = 0; + out1[3] = 0; + break; + case 31: out0[0] = __byte_perm (in1[3], 0, 0x6543); + out0[1] = 0; + out0[2] = 0; + out0[3] = 0; + out1[0] = 0; + out1[1] = 0; + out1[2] = 0; + out1[3] = 0; + break; + } + + #else + + switch (num) + { + case 0: out0[0] = in0[0]; + out0[1] = in0[1]; + out0[2] = in0[2]; + out0[3] = in0[3]; + out1[0] = in1[0]; + out1[1] = in1[1]; + out1[2] = in1[2]; + out1[3] = in1[3]; + break; + case 1: out0[0] = in0[0] >> 8 | in0[1] << 24; + out0[1] = in0[1] >> 8 | in0[2] << 24; + out0[2] = in0[2] >> 8 | in0[3] << 24; + out0[3] = in0[3] >> 8 | in1[0] << 24; + out1[0] = in1[0] >> 8 | in1[1] << 24; + out1[1] = in1[1] >> 8 | in1[2] << 24; + out1[2] = in1[2] >> 8 | in1[3] << 24; + out1[3] = in1[3] >> 8; + break; + case 2: out0[0] = in0[0] >> 16 | in0[1] << 16; + out0[1] = in0[1] >> 16 | in0[2] << 16; + out0[2] = in0[2] >> 16 | in0[3] << 16; + out0[3] = in0[3] >> 16 | in1[0] << 16; + out1[0] = in1[0] >> 16 | in1[1] << 16; + out1[1] = in1[1] >> 16 | in1[2] << 16; + out1[2] = in1[2] >> 16 | in1[3] << 16; + out1[3] = in1[3] >> 16; + break; + case 3: out0[0] = in0[0] >> 24 | in0[1] << 8; + out0[1] = in0[1] >> 24 | in0[2] << 8; + out0[2] = in0[2] >> 24 | in0[3] << 8; + out0[3] = in0[3] >> 24 | in1[0] << 8; + out1[0] = in1[0] >> 24 | in1[1] << 8; + out1[1] = in1[1] >> 24 | in1[2] << 8; + out1[2] = in1[2] >> 24 | in1[3] << 8; + out1[3] = in1[3] >> 24; + break; + case 4: out0[0] = in0[1]; + out0[1] = in0[2]; + out0[2] = in0[3]; + out0[3] = in1[0]; + out1[0] = in1[1]; + out1[1] = in1[2]; + out1[2] = in1[3]; + out1[3] = 0; + break; + case 5: out0[0] = in0[1] >> 8 | in0[2] << 24; + out0[1] = in0[2] >> 8 | in0[3] << 24; + out0[2] = in0[3] >> 8 | in1[0] << 24; + out0[3] = in1[0] >> 8 | in1[1] << 24; + out1[0] = in1[1] >> 8 | in1[2] << 24; + out1[1] = in1[2] >> 8 | in1[3] << 24; + out1[2] = in1[3] >> 8; + out1[3] = 0; + break; + case 6: out0[0] = in0[1] >> 16 | in0[2] << 16; + out0[1] = in0[2] >> 16 | in0[3] << 16; + out0[2] = in0[3] >> 16 | in1[0] << 16; + out0[3] = in1[0] >> 16 | in1[1] << 16; + out1[0] = in1[1] >> 16 | in1[2] << 16; + out1[1] = in1[2] >> 16 | in1[3] << 16; + out1[2] = in1[3] >> 16; + out1[3] = 0; + break; + case 7: out0[0] = in0[1] >> 24 | in0[2] << 8; + out0[1] = in0[2] >> 24 | in0[3] << 8; + out0[2] = in0[3] >> 24 | in1[0] << 8; + out0[3] = in1[0] >> 24 | in1[1] << 8; + out1[0] = in1[1] >> 24 | in1[2] << 8; + out1[1] = in1[2] >> 24 | in1[3] << 8; + out1[2] = in1[3] >> 24; + out1[3] = 0; + break; + case 8: out0[0] = in0[2]; + out0[1] = in0[3]; + out0[2] = in1[0]; + out0[3] = in1[1]; + out1[0] = in1[2]; + out1[1] = in1[3]; + out1[2] = 0; + out1[3] = 0; + break; + case 9: out0[0] = in0[2] >> 8 | in0[3] << 24; + out0[1] = in0[3] >> 8 | in1[0] << 24; + out0[2] = in1[0] >> 8 | in1[1] << 24; + out0[3] = in1[1] >> 8 | in1[2] << 24; + out1[0] = in1[2] >> 8 | in1[3] << 24; + out1[1] = in1[3] >> 8; + out1[2] = 0; + out1[3] = 0; + break; + case 10: out0[0] = in0[2] >> 16 | in0[3] << 16; + out0[1] = in0[3] >> 16 | in1[0] << 16; + out0[2] = in1[0] >> 16 | in1[1] << 16; + out0[3] = in1[1] >> 16 | in1[2] << 16; + out1[0] = in1[2] >> 16 | in1[3] << 16; + out1[1] = in1[3] >> 16; + out1[2] = 0; + out1[3] = 0; + break; + case 11: out0[0] = in0[2] >> 24 | in0[3] << 8; + out0[1] = in0[3] >> 24 | in1[0] << 8; + out0[2] = in1[0] >> 24 | in1[1] << 8; + out0[3] = in1[1] >> 24 | in1[2] << 8; + out1[0] = in1[2] >> 24 | in1[3] << 8; + out1[1] = in1[3] >> 24; + out1[2] = 0; + out1[3] = 0; + break; + case 12: out0[0] = in0[3]; + out0[1] = in1[0]; + out0[2] = in1[1]; + out0[3] = in1[2]; + out1[0] = in1[3]; + out1[1] = 0; + out1[2] = 0; + out1[3] = 0; + break; + case 13: + out0[0] = in0[3] >> 8 | in1[0] << 24; + out0[1] = in1[0] >> 8 | in1[1] << 24; + out0[2] = in1[1] >> 8 | in1[2] << 24; + out0[3] = in1[2] >> 8 | in1[3] << 24; + out1[0] = in1[3] >> 8; + out1[1] = 0; + out1[2] = 0; + out1[3] = 0; + break; + case 14: out0[0] = in0[3] >> 16 | in1[0] << 16; + out0[1] = in1[0] >> 16 | in1[1] << 16; + out0[2] = in1[1] >> 16 | in1[2] << 16; + out0[3] = in1[2] >> 16 | in1[3] << 16; + out1[0] = in1[3] >> 16; + out1[1] = 0; + out1[2] = 0; + out1[3] = 0; + break; + case 15: out0[0] = in0[3] >> 24 | in1[0] << 8; + out0[1] = in1[0] >> 24 | in1[1] << 8; + out0[2] = in1[1] >> 24 | in1[2] << 8; + out0[3] = in1[2] >> 24 | in1[3] << 8; + out1[0] = in1[3] >> 24; + out1[1] = 0; + out1[2] = 0; + out1[3] = 0; + break; + case 16: out0[0] = in1[0]; + out0[1] = in1[1]; + out0[2] = in1[2]; + out0[3] = in1[3]; + out1[0] = 0; + out1[1] = 0; + out1[2] = 0; + out1[3] = 0; + break; + case 17: out0[0] = in1[0] >> 8 | in1[1] << 24; + out0[1] = in1[1] >> 8 | in1[2] << 24; + out0[2] = in1[2] >> 8 | in1[3] << 24; + out0[3] = in1[3] >> 8; + out1[0] = 0; + out1[1] = 0; + out1[2] = 0; + out1[3] = 0; + break; + case 18: out0[0] = in1[0] >> 16 | in1[1] << 16; + out0[1] = in1[1] >> 16 | in1[2] << 16; + out0[2] = in1[2] >> 16 | in1[3] << 16; + out0[3] = in1[3] >> 16; + out1[0] = 0; + out1[1] = 0; + out1[2] = 0; + out1[3] = 0; + break; + case 19: out0[0] = in1[0] >> 24 | in1[1] << 8; + out0[1] = in1[1] >> 24 | in1[2] << 8; + out0[2] = in1[2] >> 24 | in1[3] << 8; + out0[3] = in1[3] >> 24; + out1[0] = 0; + out1[1] = 0; + out1[2] = 0; + out1[3] = 0; + break; + case 20: out0[0] = in1[1]; + out0[1] = in1[2]; + out0[2] = in1[3]; + out0[3] = 0; + out1[0] = 0; + out1[1] = 0; + out1[2] = 0; + out1[3] = 0; + break; + case 21: out0[0] = in1[1] >> 8 | in1[2] << 24; + out0[1] = in1[2] >> 8 | in1[3] << 24; + out0[2] = in1[3] >> 8; + out0[3] = 0; + out1[0] = 0; + out1[1] = 0; + out1[2] = 0; + out1[3] = 0; + break; + case 22: out0[0] = in1[1] >> 16 | in1[2] << 16; + out0[1] = in1[2] >> 16 | in1[3] << 16; + out0[2] = in1[3] >> 16; + out0[3] = 0; + out1[0] = 0; + out1[1] = 0; + out1[2] = 0; + out1[3] = 0; + break; + case 23: out0[0] = in1[1] >> 24 | in1[2] << 8; + out0[1] = in1[2] >> 24 | in1[3] << 8; + out0[2] = in1[3] >> 24; + out0[3] = 0; + out1[0] = 0; + out1[1] = 0; + out1[2] = 0; + out1[3] = 0; + break; + case 24: out0[0] = in1[2]; + out0[1] = in1[3]; + out0[2] = 0; + out0[3] = 0; + out1[0] = 0; + out1[1] = 0; + out1[2] = 0; + out1[3] = 0; + break; + case 25: out0[0] = in1[2] >> 8 | in1[3] << 24; + out0[1] = in1[3] >> 8; + out0[2] = 0; + out0[3] = 0; + out1[0] = 0; + out1[1] = 0; + out1[2] = 0; + out1[3] = 0; + break; + case 26: out0[0] = in1[2] >> 16 | in1[3] << 16; + out0[1] = in1[3] >> 16; + out0[2] = 0; + out0[3] = 0; + out1[0] = 0; + out1[1] = 0; + out1[2] = 0; + out1[3] = 0; + break; + case 27: out0[0] = in1[2] >> 24 | in1[3] << 8; + out0[1] = in1[3] >> 24; + out0[2] = 0; + out0[3] = 0; + out1[0] = 0; + out1[1] = 0; + out1[2] = 0; + out1[3] = 0; + break; + case 28: out0[0] = in1[3]; + out0[1] = 0; + out0[2] = 0; + out0[3] = 0; + out1[0] = 0; + out1[1] = 0; + out1[2] = 0; + out1[3] = 0; + break; + case 29: out0[0] = in1[3] >> 8; + out0[1] = 0; + out0[2] = 0; + out0[3] = 0; + out1[0] = 0; + out1[1] = 0; + out1[2] = 0; + out1[3] = 0; + break; + case 30: out0[0] = in1[3] >> 16; + out0[1] = 0; + out0[2] = 0; + out0[3] = 0; + out1[0] = 0; + out1[1] = 0; + out1[2] = 0; + out1[3] = 0; + break; + case 31: out0[0] = in1[3] >> 24; + out0[1] = 0; + out0[2] = 0; + out0[3] = 0; + out1[0] = 0; + out1[1] = 0; + out1[2] = 0; + out1[3] = 0; + break; + } + + #endif +} + +__device__ static void append_block1 (const u32 offset, u32x dst0[4], u32x dst1[4], const u32x src_r0) +{ + u32x tmp[2]; + + switch (offset & 3) + { + case 0: tmp[0] = src_r0; + tmp[1] = 0; + break; + case 1: tmp[0] = src_r0 << 8; + tmp[1] = src_r0 >> 24; + break; + case 2: tmp[0] = src_r0 << 16; + tmp[1] = src_r0 >> 16; + break; + case 3: tmp[0] = src_r0 << 24; + tmp[1] = src_r0 >> 8; + break; + } + + switch (offset / 4) + { + case 0: dst0[0] |= tmp[0]; + dst0[1] = tmp[1]; + break; + case 1: dst0[1] |= tmp[0]; + dst0[2] = tmp[1]; + break; + case 2: dst0[2] |= tmp[0]; + dst0[3] = tmp[1]; + break; + case 3: dst0[3] |= tmp[0]; + dst1[0] = tmp[1]; + break; + case 4: dst1[0] |= tmp[0]; + dst1[1] = tmp[1]; + break; + case 5: dst1[1] |= tmp[0]; + dst1[2] = tmp[1]; + break; + case 6: dst1[2] |= tmp[0]; + dst1[3] = tmp[1]; + break; + case 7: dst1[3] |= tmp[0]; + break; + } +} + +__device__ static void append_block8 (const u32 offset, u32x dst0[4], u32x dst1[4], const u32x src_l0[4], const u32x src_l1[4], const u32x src_r0[4], const u32x src_r1[4]) +{ + #if __CUDA_ARCH__ >= 200 + + switch (offset) + { + case 0: + dst0[0] = src_r0[0]; + dst0[1] = src_r0[1]; + dst0[2] = src_r0[2]; + dst0[3] = src_r0[3]; + dst1[0] = src_r1[0]; + dst1[1] = src_r1[1]; + dst1[2] = src_r1[2]; + dst1[3] = src_r1[3]; + break; + + case 1: + dst0[0] = __byte_perm (src_l0[0], src_r0[0], 0x6540); + dst0[1] = __byte_perm (src_r0[0], src_r0[1], 0x6543); + dst0[2] = __byte_perm (src_r0[1], src_r0[2], 0x6543); + dst0[3] = __byte_perm (src_r0[2], src_r0[3], 0x6543); + dst1[0] = __byte_perm (src_r0[3], src_r1[0], 0x6543); + dst1[1] = __byte_perm (src_r1[0], src_r1[1], 0x6543); + dst1[2] = __byte_perm (src_r1[1], src_r1[2], 0x6543); + dst1[3] = __byte_perm (src_r1[2], src_r1[3], 0x6543); + break; + + case 2: + dst0[0] = __byte_perm (src_l0[0], src_r0[0], 0x5410); + dst0[1] = __byte_perm (src_r0[0], src_r0[1], 0x5432); + dst0[2] = __byte_perm (src_r0[1], src_r0[2], 0x5432); + dst0[3] = __byte_perm (src_r0[2], src_r0[3], 0x5432); + dst1[0] = __byte_perm (src_r0[3], src_r1[0], 0x5432); + dst1[1] = __byte_perm (src_r1[0], src_r1[1], 0x5432); + dst1[2] = __byte_perm (src_r1[1], src_r1[2], 0x5432); + dst1[3] = __byte_perm (src_r1[2], src_r1[3], 0x5432); + break; + + case 3: + dst0[0] = __byte_perm (src_l0[0], src_r0[0], 0x4210); + dst0[1] = __byte_perm (src_r0[0], src_r0[1], 0x4321); + dst0[2] = __byte_perm (src_r0[1], src_r0[2], 0x4321); + dst0[3] = __byte_perm (src_r0[2], src_r0[3], 0x4321); + dst1[0] = __byte_perm (src_r0[3], src_r1[0], 0x4321); + dst1[1] = __byte_perm (src_r1[0], src_r1[1], 0x4321); + dst1[2] = __byte_perm (src_r1[1], src_r1[2], 0x4321); + dst1[3] = __byte_perm (src_r1[2], src_r1[3], 0x4321); + break; + + case 4: + dst0[1] = src_r0[0]; + dst0[2] = src_r0[1]; + dst0[3] = src_r0[2]; + dst1[0] = src_r0[3]; + dst1[1] = src_r1[0]; + dst1[2] = src_r1[1]; + dst1[3] = src_r1[2]; + break; + + case 5: + dst0[1] = __byte_perm (src_l0[1], src_r0[0], 0x6540); + dst0[2] = __byte_perm (src_r0[0], src_r0[1], 0x6543); + dst0[3] = __byte_perm (src_r0[1], src_r0[2], 0x6543); + dst1[0] = __byte_perm (src_r0[2], src_r0[3], 0x6543); + dst1[1] = __byte_perm (src_r0[3], src_r1[0], 0x6543); + dst1[2] = __byte_perm (src_r1[0], src_r1[1], 0x6543); + dst1[3] = __byte_perm (src_r1[1], src_r1[2], 0x6543); + break; + + case 6: + dst0[1] = __byte_perm (src_l0[1], src_r0[0], 0x5410); + dst0[2] = __byte_perm (src_r0[0], src_r0[1], 0x5432); + dst0[3] = __byte_perm (src_r0[1], src_r0[2], 0x5432); + dst1[0] = __byte_perm (src_r0[2], src_r0[3], 0x5432); + dst1[1] = __byte_perm (src_r0[3], src_r1[0], 0x5432); + dst1[2] = __byte_perm (src_r1[0], src_r1[1], 0x5432); + dst1[3] = __byte_perm (src_r1[1], src_r1[2], 0x5432); + break; + + case 7: + dst0[1] = __byte_perm (src_l0[1], src_r0[0], 0x4210); + dst0[2] = __byte_perm (src_r0[0], src_r0[1], 0x4321); + dst0[3] = __byte_perm (src_r0[1], src_r0[2], 0x4321); + dst1[0] = __byte_perm (src_r0[2], src_r0[3], 0x4321); + dst1[1] = __byte_perm (src_r0[3], src_r1[0], 0x4321); + dst1[2] = __byte_perm (src_r1[0], src_r1[1], 0x4321); + dst1[3] = __byte_perm (src_r1[1], src_r1[2], 0x4321); + break; + + case 8: + dst0[2] = src_r0[0]; + dst0[3] = src_r0[1]; + dst1[0] = src_r0[2]; + dst1[1] = src_r0[3]; + dst1[2] = src_r1[0]; + dst1[3] = src_r1[1]; + break; + + case 9: + dst0[2] = __byte_perm (src_l0[2], src_r0[0], 0x6540); + dst0[3] = __byte_perm (src_r0[0], src_r0[1], 0x6543); + dst1[0] = __byte_perm (src_r0[1], src_r0[2], 0x6543); + dst1[1] = __byte_perm (src_r0[2], src_r0[3], 0x6543); + dst1[2] = __byte_perm (src_r0[3], src_r1[0], 0x6543); + dst1[3] = __byte_perm (src_r1[0], src_r1[1], 0x6543); + break; + + case 10: + dst0[2] = __byte_perm (src_l0[2], src_r0[0], 0x5410); + dst0[3] = __byte_perm (src_r0[0], src_r0[1], 0x5432); + dst1[0] = __byte_perm (src_r0[1], src_r0[2], 0x5432); + dst1[1] = __byte_perm (src_r0[2], src_r0[3], 0x5432); + dst1[2] = __byte_perm (src_r0[3], src_r1[0], 0x5432); + dst1[3] = __byte_perm (src_r1[0], src_r1[1], 0x5432); + break; + + case 11: + dst0[2] = __byte_perm (src_l0[2], src_r0[0], 0x4210); + dst0[3] = __byte_perm (src_r0[0], src_r0[1], 0x4321); + dst1[0] = __byte_perm (src_r0[1], src_r0[2], 0x4321); + dst1[1] = __byte_perm (src_r0[2], src_r0[3], 0x4321); + dst1[2] = __byte_perm (src_r0[3], src_r1[0], 0x4321); + dst1[3] = __byte_perm (src_r1[0], src_r1[1], 0x4321); + break; + + case 12: + dst0[3] = src_r0[0]; + dst1[0] = src_r0[1]; + dst1[1] = src_r0[2]; + dst1[2] = src_r0[3]; + dst1[3] = src_r1[0]; + break; + + case 13: + dst0[3] = __byte_perm (src_l0[3], src_r0[0], 0x6540); + dst1[0] = __byte_perm (src_r0[0], src_r0[1], 0x6543); + dst1[1] = __byte_perm (src_r0[1], src_r0[2], 0x6543); + dst1[2] = __byte_perm (src_r0[2], src_r0[3], 0x6543); + dst1[3] = __byte_perm (src_r0[3], src_r1[0], 0x6543); + break; + + case 14: + dst0[3] = __byte_perm (src_l0[3], src_r0[0], 0x5410); + dst1[0] = __byte_perm (src_r0[0], src_r0[1], 0x5432); + dst1[1] = __byte_perm (src_r0[1], src_r0[2], 0x5432); + dst1[2] = __byte_perm (src_r0[2], src_r0[3], 0x5432); + dst1[3] = __byte_perm (src_r0[3], src_r1[0], 0x5432); + break; + + case 15: + dst0[3] = __byte_perm (src_l0[3], src_r0[0], 0x4210); + dst1[0] = __byte_perm (src_r0[0], src_r0[1], 0x4321); + dst1[1] = __byte_perm (src_r0[1], src_r0[2], 0x4321); + dst1[2] = __byte_perm (src_r0[2], src_r0[3], 0x4321); + dst1[3] = __byte_perm (src_r0[3], src_r1[0], 0x4321); + break; + + case 16: + dst1[0] = src_r0[0]; + dst1[1] = src_r0[1]; + dst1[2] = src_r0[2]; + dst1[3] = src_r0[3]; + break; + + case 17: + dst1[0] = __byte_perm (src_l1[0], src_r0[0], 0x6540); + dst1[1] = __byte_perm (src_r0[0], src_r0[1], 0x6543); + dst1[2] = __byte_perm (src_r0[1], src_r0[2], 0x6543); + dst1[3] = __byte_perm (src_r0[2], src_r0[3], 0x6543); + break; + + case 18: + dst1[0] = __byte_perm (src_l1[0], src_r0[0], 0x5410); + dst1[1] = __byte_perm (src_r0[0], src_r0[1], 0x5432); + dst1[2] = __byte_perm (src_r0[1], src_r0[2], 0x5432); + dst1[3] = __byte_perm (src_r0[2], src_r0[3], 0x5432); + break; + + case 19: + dst1[0] = __byte_perm (src_l1[0], src_r0[0], 0x4210); + dst1[1] = __byte_perm (src_r0[0], src_r0[1], 0x4321); + dst1[2] = __byte_perm (src_r0[1], src_r0[2], 0x4321); + dst1[3] = __byte_perm (src_r0[2], src_r0[3], 0x4321); + break; + + case 20: + dst1[1] = src_r0[0]; + dst1[2] = src_r0[1]; + dst1[3] = src_r0[2]; + break; + + case 21: + dst1[1] = __byte_perm (src_l1[1], src_r0[0], 0x6540); + dst1[2] = __byte_perm (src_r0[0], src_r0[1], 0x6543); + dst1[3] = __byte_perm (src_r0[1], src_r0[2], 0x6543); + break; + + case 22: + dst1[1] = __byte_perm (src_l1[1], src_r0[0], 0x5410); + dst1[2] = __byte_perm (src_r0[0], src_r0[1], 0x5432); + dst1[3] = __byte_perm (src_r0[1], src_r0[2], 0x5432); + break; + + case 23: + dst1[1] = __byte_perm (src_l1[1], src_r0[0], 0x4210); + dst1[2] = __byte_perm (src_r0[0], src_r0[1], 0x4321); + dst1[3] = __byte_perm (src_r0[1], src_r0[2], 0x4321); + break; + + case 24: + dst1[2] = src_r0[0]; + dst1[3] = src_r0[1]; + break; + + case 25: + dst1[2] = __byte_perm (src_l1[2], src_r0[0], 0x6540); + dst1[3] = __byte_perm (src_r0[0], src_r0[1], 0x6543); + break; + + case 26: + dst1[2] = __byte_perm (src_l1[2], src_r0[0], 0x5410); + dst1[3] = __byte_perm (src_r0[0], src_r0[1], 0x5432); + break; + + case 27: + dst1[2] = __byte_perm (src_l1[2], src_r0[0], 0x4210); + dst1[3] = __byte_perm (src_r0[0], src_r0[1], 0x4321); + break; + + case 28: + dst1[3] = src_r0[0]; + break; + + case 29: + dst1[3] = __byte_perm (src_l1[3], src_r0[0], 0x6540); + break; + + case 30: + dst1[3] = __byte_perm (src_l1[3], src_r0[0], 0x5410); + break; + + case 31: + dst1[3] = __byte_perm (src_l1[3], src_r0[0], 0x4210); + break; + } + + #else + + switch (offset) + { + case 0: + dst0[0] = src_r0[0]; + dst0[1] = src_r0[1]; + dst0[2] = src_r0[2]; + dst0[3] = src_r0[3]; + dst1[0] = src_r1[0]; + dst1[1] = src_r1[1]; + dst1[2] = src_r1[2]; + dst1[3] = src_r1[3]; + break; + + case 1: + dst0[0] = src_l0[0] | src_r0[0] << 8; + dst0[1] = src_r0[0] >> 24 | src_r0[1] << 8; + dst0[2] = src_r0[1] >> 24 | src_r0[2] << 8; + dst0[3] = src_r0[2] >> 24 | src_r0[3] << 8; + dst1[0] = src_r0[3] >> 24 | src_r1[0] << 8; + dst1[1] = src_r1[0] >> 24 | src_r1[1] << 8; + dst1[2] = src_r1[1] >> 24 | src_r1[2] << 8; + dst1[3] = src_r1[2] >> 24 | src_r1[3] << 8; + break; + + case 2: + dst0[0] = src_l0[0] | src_r0[0] << 16; + dst0[1] = src_r0[0] >> 16 | src_r0[1] << 16; + dst0[2] = src_r0[1] >> 16 | src_r0[2] << 16; + dst0[3] = src_r0[2] >> 16 | src_r0[3] << 16; + dst1[0] = src_r0[3] >> 16 | src_r1[0] << 16; + dst1[1] = src_r1[0] >> 16 | src_r1[1] << 16; + dst1[2] = src_r1[1] >> 16 | src_r1[2] << 16; + dst1[3] = src_r1[2] >> 16 | src_r1[3] << 16; + break; + + case 3: + dst0[0] = src_l0[0] | src_r0[0] << 24; + dst0[1] = src_r0[0] >> 8 | src_r0[1] << 24; + dst0[2] = src_r0[1] >> 8 | src_r0[2] << 24; + dst0[3] = src_r0[2] >> 8 | src_r0[3] << 24; + dst1[0] = src_r0[3] >> 8 | src_r1[0] << 24; + dst1[1] = src_r1[0] >> 8 | src_r1[1] << 24; + dst1[2] = src_r1[1] >> 8 | src_r1[2] << 24; + dst1[3] = src_r1[2] >> 8 | src_r1[3] << 24; + break; + + case 4: + dst0[1] = src_r0[0]; + dst0[2] = src_r0[1]; + dst0[3] = src_r0[2]; + dst1[0] = src_r0[3]; + dst1[1] = src_r1[0]; + dst1[2] = src_r1[1]; + dst1[3] = src_r1[2]; + break; + + case 5: + dst0[1] = src_l0[1] | src_r0[0] << 8; + dst0[2] = src_r0[0] >> 24 | src_r0[1] << 8; + dst0[3] = src_r0[1] >> 24 | src_r0[2] << 8; + dst1[0] = src_r0[2] >> 24 | src_r0[3] << 8; + dst1[1] = src_r0[3] >> 24 | src_r1[0] << 8; + dst1[2] = src_r1[0] >> 24 | src_r1[1] << 8; + dst1[3] = src_r1[1] >> 24 | src_r1[2] << 8; + break; + + case 6: + dst0[1] = src_l0[1] | src_r0[0] << 16; + dst0[2] = src_r0[0] >> 16 | src_r0[1] << 16; + dst0[3] = src_r0[1] >> 16 | src_r0[2] << 16; + dst1[0] = src_r0[2] >> 16 | src_r0[3] << 16; + dst1[1] = src_r0[3] >> 16 | src_r1[0] << 16; + dst1[2] = src_r1[0] >> 16 | src_r1[1] << 16; + dst1[3] = src_r1[1] >> 16 | src_r1[2] << 16; + break; + + case 7: + dst0[1] = src_l0[1] | src_r0[0] << 24; + dst0[2] = src_r0[0] >> 8 | src_r0[1] << 24; + dst0[3] = src_r0[1] >> 8 | src_r0[2] << 24; + dst1[0] = src_r0[2] >> 8 | src_r0[3] << 24; + dst1[1] = src_r0[3] >> 8 | src_r1[0] << 24; + dst1[2] = src_r1[0] >> 8 | src_r1[1] << 24; + dst1[3] = src_r1[1] >> 8 | src_r1[2] << 24; + break; + + case 8: + dst0[2] = src_r0[0]; + dst0[3] = src_r0[1]; + dst1[0] = src_r0[2]; + dst1[1] = src_r0[3]; + dst1[2] = src_r1[0]; + dst1[3] = src_r1[1]; + break; + + case 9: + dst0[2] = src_l0[2] | src_r0[0] << 8; + dst0[3] = src_r0[0] >> 24 | src_r0[1] << 8; + dst1[0] = src_r0[1] >> 24 | src_r0[2] << 8; + dst1[1] = src_r0[2] >> 24 | src_r0[3] << 8; + dst1[2] = src_r0[3] >> 24 | src_r1[0] << 8; + dst1[3] = src_r1[0] >> 24 | src_r1[1] << 8; + break; + + case 10: + dst0[2] = src_l0[2] | src_r0[0] << 16; + dst0[3] = src_r0[0] >> 16 | src_r0[1] << 16; + dst1[0] = src_r0[1] >> 16 | src_r0[2] << 16; + dst1[1] = src_r0[2] >> 16 | src_r0[3] << 16; + dst1[2] = src_r0[3] >> 16 | src_r1[0] << 16; + dst1[3] = src_r1[0] >> 16 | src_r1[1] << 16; + break; + + case 11: + dst0[2] = src_l0[2] | src_r0[0] << 24; + dst0[3] = src_r0[0] >> 8 | src_r0[1] << 24; + dst1[0] = src_r0[1] >> 8 | src_r0[2] << 24; + dst1[1] = src_r0[2] >> 8 | src_r0[3] << 24; + dst1[2] = src_r0[3] >> 8 | src_r1[0] << 24; + dst1[3] = src_r1[0] >> 8 | src_r1[1] << 24; + break; + + case 12: + dst0[3] = src_r0[0]; + dst1[0] = src_r0[1]; + dst1[1] = src_r0[2]; + dst1[2] = src_r0[3]; + dst1[3] = src_r1[0]; + break; + + case 13: + dst0[3] = src_l0[3] | src_r0[0] << 8; + dst1[0] = src_r0[0] >> 24 | src_r0[1] << 8; + dst1[1] = src_r0[1] >> 24 | src_r0[2] << 8; + dst1[2] = src_r0[2] >> 24 | src_r0[3] << 8; + dst1[3] = src_r0[3] >> 24 | src_r1[0] << 8; + break; + + case 14: + dst0[3] = src_l0[3] | src_r0[0] << 16; + dst1[0] = src_r0[0] >> 16 | src_r0[1] << 16; + dst1[1] = src_r0[1] >> 16 | src_r0[2] << 16; + dst1[2] = src_r0[2] >> 16 | src_r0[3] << 16; + dst1[3] = src_r0[3] >> 16 | src_r1[0] << 16; + break; + + case 15: + dst0[3] = src_l0[3] | src_r0[0] << 24; + dst1[0] = src_r0[0] >> 8 | src_r0[1] << 24; + dst1[1] = src_r0[1] >> 8 | src_r0[2] << 24; + dst1[2] = src_r0[2] >> 8 | src_r0[3] << 24; + dst1[3] = src_r0[3] >> 8 | src_r1[0] << 24; + break; + + case 16: + dst1[0] = src_r0[0]; + dst1[1] = src_r0[1]; + dst1[2] = src_r0[2]; + dst1[3] = src_r0[3]; + break; + + case 17: + dst1[0] = src_l1[0] | src_r0[0] << 8; + dst1[1] = src_r0[0] >> 24 | src_r0[1] << 8; + dst1[2] = src_r0[1] >> 24 | src_r0[2] << 8; + dst1[3] = src_r0[2] >> 24 | src_r0[3] << 8; + break; + + case 18: + dst1[0] = src_l1[0] | src_r0[0] << 16; + dst1[1] = src_r0[0] >> 16 | src_r0[1] << 16; + dst1[2] = src_r0[1] >> 16 | src_r0[2] << 16; + dst1[3] = src_r0[2] >> 16 | src_r0[3] << 16; + break; + + case 19: + dst1[0] = src_l1[0] | src_r0[0] << 24; + dst1[1] = src_r0[0] >> 8 | src_r0[1] << 24; + dst1[2] = src_r0[1] >> 8 | src_r0[2] << 24; + dst1[3] = src_r0[2] >> 8 | src_r0[3] << 24; + break; + + case 20: + dst1[1] = src_r0[0]; + dst1[2] = src_r0[1]; + dst1[3] = src_r0[2]; + break; + + case 21: + dst1[1] = src_l1[1] | src_r0[0] << 8; + dst1[2] = src_r0[0] >> 24 | src_r0[1] << 8; + dst1[3] = src_r0[1] >> 24 | src_r0[2] << 8; + break; + + case 22: + dst1[1] = src_l1[1] | src_r0[0] << 16; + dst1[2] = src_r0[0] >> 16 | src_r0[1] << 16; + dst1[3] = src_r0[1] >> 16 | src_r0[2] << 16; + break; + + case 23: + dst1[1] = src_l1[1] | src_r0[0] << 24; + dst1[2] = src_r0[0] >> 8 | src_r0[1] << 24; + dst1[3] = src_r0[1] >> 8 | src_r0[2] << 24; + break; + + case 24: + dst1[2] = src_r0[0]; + dst1[3] = src_r0[1]; + break; + + case 25: + dst1[2] = src_l1[2] | src_r0[0] << 8; + dst1[3] = src_r0[0] >> 24 | src_r0[1] << 8; + break; + + case 26: + dst1[2] = src_l1[2] | src_r0[0] << 16; + dst1[3] = src_r0[0] >> 16 | src_r0[1] << 16; + break; + + case 27: + dst1[2] = src_l1[2] | src_r0[0] << 24; + dst1[3] = src_r0[0] >> 8 | src_r0[1] << 24; + break; + + case 28: + dst1[3] = src_r0[0]; + break; + + case 29: + dst1[3] = src_l1[3] | src_r0[0] << 8; + break; + + case 30: + dst1[3] = src_l1[3] | src_r0[0] << 16; + break; + + case 31: + dst1[3] = src_l1[3] | src_r0[0] << 24; + break; + } + + #endif +} + +__device__ static void reverse_block (u32x in0[4], u32x in1[4], u32x out0[4], u32x out1[4], const u32 len) +{ + rshift_block_N (in0, in1, out0, out1, 32 - len); + + u32x tib40[4]; + u32x tib41[4]; + + tib40[0] = out1[3]; + tib40[1] = out1[2]; + tib40[2] = out1[1]; + tib40[3] = out1[0]; + tib41[0] = out0[3]; + tib41[1] = out0[2]; + tib41[2] = out0[1]; + tib41[3] = out0[0]; + + out0[0] = swap_workaround (tib40[0]); + out0[1] = swap_workaround (tib40[1]); + out0[2] = swap_workaround (tib40[2]); + out0[3] = swap_workaround (tib40[3]); + out1[0] = swap_workaround (tib41[0]); + out1[1] = swap_workaround (tib41[1]); + out1[2] = swap_workaround (tib41[2]); + out1[3] = swap_workaround (tib41[3]); +} + +__device__ static u32 rule_op_mangle_lrest (const u32 p0, const u32 p1, u32x buf0[4], u32x buf1[4], const u32 in_len) +{ + buf0[0] |= (generate_cmask (buf0[0])); + buf0[1] |= (generate_cmask (buf0[1])); + buf0[2] |= (generate_cmask (buf0[2])); + buf0[3] |= (generate_cmask (buf0[3])); + buf1[0] |= (generate_cmask (buf1[0])); + buf1[1] |= (generate_cmask (buf1[1])); + buf1[2] |= (generate_cmask (buf1[2])); + buf1[3] |= (generate_cmask (buf1[3])); + + return in_len; +} + +__device__ static u32 rule_op_mangle_urest (const u32 p0, const u32 p1, u32x buf0[4], u32x buf1[4], const u32 in_len) +{ + buf0[0] &= ~(generate_cmask (buf0[0])); + buf0[1] &= ~(generate_cmask (buf0[1])); + buf0[2] &= ~(generate_cmask (buf0[2])); + buf0[3] &= ~(generate_cmask (buf0[3])); + buf1[0] &= ~(generate_cmask (buf1[0])); + buf1[1] &= ~(generate_cmask (buf1[1])); + buf1[2] &= ~(generate_cmask (buf1[2])); + buf1[3] &= ~(generate_cmask (buf1[3])); + + return in_len; +} + +__device__ static u32 rule_op_mangle_lrest_ufirst (const u32 p0, const u32 p1, u32x buf0[4], u32x buf1[4], const u32 in_len) +{ + rule_op_mangle_lrest (p0, p1, buf0, buf1, in_len); + + buf0[0] &= ~(0x00000020 & generate_cmask (buf0[0])); + + return in_len; +} + +__device__ static u32 rule_op_mangle_urest_lfirst (const u32 p0, const u32 p1, u32x buf0[4], u32x buf1[4], const u32 in_len) +{ + rule_op_mangle_urest (p0, p1, buf0, buf1, in_len); + + buf0[0] |= (0x00000020 & generate_cmask (buf0[0])); + + return in_len; +} + +__device__ static u32 rule_op_mangle_trest (const u32 p0, const u32 p1, u32x buf0[4], u32x buf1[4], const u32 in_len) +{ + buf0[0] ^= (generate_cmask (buf0[0])); + buf0[1] ^= (generate_cmask (buf0[1])); + buf0[2] ^= (generate_cmask (buf0[2])); + buf0[3] ^= (generate_cmask (buf0[3])); + buf1[0] ^= (generate_cmask (buf1[0])); + buf1[1] ^= (generate_cmask (buf1[1])); + buf1[2] ^= (generate_cmask (buf1[2])); + buf1[3] ^= (generate_cmask (buf1[3])); + + return in_len; +} + +__device__ static u32 rule_op_mangle_toggle_at (const u32 p0, const u32 p1, u32x buf0[4], u32x buf1[4], const u32 in_len) +{ + if (p0 >= in_len) return (in_len); + + const u32 tmp = 0x20 << ((p0 & 3) * 8); + + switch (p0 / 4) + { + case 0: buf0[0] ^= (tmp & generate_cmask (buf0[0])); break; + case 1: buf0[1] ^= (tmp & generate_cmask (buf0[1])); break; + case 2: buf0[2] ^= (tmp & generate_cmask (buf0[2])); break; + case 3: buf0[3] ^= (tmp & generate_cmask (buf0[3])); break; + case 4: buf1[0] ^= (tmp & generate_cmask (buf1[0])); break; + case 5: buf1[1] ^= (tmp & generate_cmask (buf1[1])); break; + case 6: buf1[2] ^= (tmp & generate_cmask (buf1[2])); break; + case 7: buf1[3] ^= (tmp & generate_cmask (buf1[3])); break; + } + + return in_len; +} + +__device__ static u32 rule_op_mangle_reverse (const u32 p0, const u32 p1, u32x buf0[4], u32x buf1[4], const u32 in_len) +{ + reverse_block (buf0, buf1, buf0, buf1, in_len); + + return in_len; +} + +__device__ static u32 rule_op_mangle_dupeword (const u32 p0, const u32 p1, u32x buf0[4], u32x buf1[4], const u32 in_len) +{ + if ((in_len + in_len) >= 32) return (in_len); + + u32 out_len = in_len; + + u32x tib40[4]; + u32x tib41[4]; + + tib40[0] = buf0[0]; + tib40[1] = buf0[1]; + tib40[2] = buf0[2]; + tib40[3] = buf0[3]; + tib41[0] = buf1[0]; + tib41[1] = buf1[1]; + tib41[2] = buf1[2]; + tib41[3] = buf1[3]; + + append_block8 (out_len, buf0, buf1, buf0, buf1, tib40, tib41); + + out_len += in_len; + + return out_len; +} + +__device__ static u32 rule_op_mangle_dupeword_times (const u32 p0, const u32 p1, u32x buf0[4], u32x buf1[4], const u32 in_len) +{ + if (((in_len * p0) + in_len) >= 32) return (in_len); + + u32 out_len = in_len; + + u32x tib40[4]; + u32x tib41[4]; + + tib40[0] = buf0[0]; + tib40[1] = buf0[1]; + tib40[2] = buf0[2]; + tib40[3] = buf0[3]; + tib41[0] = buf1[0]; + tib41[1] = buf1[1]; + tib41[2] = buf1[2]; + tib41[3] = buf1[3]; + + for (u32 i = 0; i < p0; i++) + { + append_block8 (out_len, buf0, buf1, buf0, buf1, tib40, tib41); + + out_len += in_len; + } + + return out_len; +} + +__device__ static u32 rule_op_mangle_reflect (const u32 p0, const u32 p1, u32x buf0[4], u32x buf1[4], const u32 in_len) +{ + if ((in_len + in_len) >= 32) return (in_len); + + u32 out_len = in_len; + + u32x tib40[4]; + u32x tib41[4]; + + reverse_block (buf0, buf1, tib40, tib41, out_len); + + append_block8 (out_len, buf0, buf1, buf0, buf1, tib40, tib41); + + out_len += in_len; + + return out_len; +} + +__device__ static u32 rule_op_mangle_append (const u32 p0, const u32 p1, u32x buf0[4], u32x buf1[4], const u32 in_len) +{ + if ((in_len + 1) >= 32) return (in_len); + + u32 out_len = in_len; + + append_block1 (out_len, buf0, buf1, p0); + + out_len++; + + return out_len; +} + +__device__ static u32 rule_op_mangle_prepend (const u32 p0, const u32 p1, u32x buf0[4], u32x buf1[4], const u32 in_len) +{ + if ((in_len + 1) >= 32) return (in_len); + + u32 out_len = in_len; + + rshift_block (buf0, buf1, buf0, buf1); + + buf0[0] = buf0[0] | p0; + + out_len++; + + return out_len; +} + +__device__ static u32 rule_op_mangle_rotate_left (const u32 p0, const u32 p1, u32x buf0[4], u32x buf1[4], const u32 in_len) +{ + if (in_len == 0) return (in_len); + + const u32 in_len1 = in_len - 1; + + const u32 sh = (in_len1 & 3) * 8; + + const u32x tmp = (buf0[0] & 0xff) << sh; + + lshift_block (buf0, buf1, buf0, buf1); + + switch (in_len1 / 4) + { + case 0: buf0[0] |= tmp; break; + case 1: buf0[1] |= tmp; break; + case 2: buf0[2] |= tmp; break; + case 3: buf0[3] |= tmp; break; + case 4: buf1[0] |= tmp; break; + case 5: buf1[1] |= tmp; break; + case 6: buf1[2] |= tmp; break; + case 7: buf1[3] |= tmp; break; + } + + return in_len; +} + +__device__ static u32 rule_op_mangle_rotate_right (const u32 p0, const u32 p1, u32x buf0[4], u32x buf1[4], const u32 in_len) +{ + if (in_len == 0) return (in_len); + + const u32 in_len1 = in_len - 1; + + const u32 sh = (in_len1 & 3) * 8; + + u32x tmp = 0; + + switch (in_len1 / 4) + { + case 0: tmp = (buf0[0] >> sh) & 0xff; break; + case 1: tmp = (buf0[1] >> sh) & 0xff; break; + case 2: tmp = (buf0[2] >> sh) & 0xff; break; + case 3: tmp = (buf0[3] >> sh) & 0xff; break; + case 4: tmp = (buf1[0] >> sh) & 0xff; break; + case 5: tmp = (buf1[1] >> sh) & 0xff; break; + case 6: tmp = (buf1[2] >> sh) & 0xff; break; + case 7: tmp = (buf1[3] >> sh) & 0xff; break; + } + + rshift_block (buf0, buf1, buf0, buf1); + + buf0[0] |= tmp; + + truncate_right (buf0, buf1, in_len); + + return in_len; +} + +__device__ static u32 rule_op_mangle_delete_first (const u32 p0, const u32 p1, u32x buf0[4], u32x buf1[4], const u32 in_len) +{ + if (in_len == 0) return (in_len); + + const u32 in_len1 = in_len - 1; + + lshift_block (buf0, buf1, buf0, buf1); + + return in_len1; +} + +__device__ static u32 rule_op_mangle_delete_last (const u32 p0, const u32 p1, u32x buf0[4], u32x buf1[4], const u32 in_len) +{ + if (in_len == 0) return (in_len); + + const u32 in_len1 = in_len - 1; + + const u32 tmp = (1 << ((in_len1 & 3) * 8)) - 1; + + switch (in_len1 / 4) + { + case 0: buf0[0] &= tmp; break; + case 1: buf0[1] &= tmp; break; + case 2: buf0[2] &= tmp; break; + case 3: buf0[3] &= tmp; break; + case 4: buf1[0] &= tmp; break; + case 5: buf1[1] &= tmp; break; + case 6: buf1[2] &= tmp; break; + case 7: buf1[3] &= tmp; break; + } + + return in_len1; +} + +__device__ static u32 rule_op_mangle_delete_at (const u32 p0, const u32 p1, u32x buf0[4], u32x buf1[4], const u32 in_len) +{ + if (p0 >= in_len) return (in_len); + + u32 out_len = in_len; + + u32x tib40[4]; + u32x tib41[4]; + + lshift_block (buf0, buf1, tib40, tib41); + + const u32 ml = (1 << ((p0 & 3) * 8)) - 1; + const u32 mr = ~ml; + + switch (p0 / 4) + { + case 0: buf0[0] = (buf0[0] & ml) + | (tib40[0] & mr); + buf0[1] = tib40[1]; + buf0[2] = tib40[2]; + buf0[3] = tib40[3]; + buf1[0] = tib41[0]; + buf1[1] = tib41[1]; + buf1[2] = tib41[2]; + buf1[3] = tib41[3]; + break; + case 1: buf0[1] = (buf0[1] & ml) + | (tib40[1] & mr); + buf0[2] = tib40[2]; + buf0[3] = tib40[3]; + buf1[0] = tib41[0]; + buf1[1] = tib41[1]; + buf1[2] = tib41[2]; + buf1[3] = tib41[3]; + break; + case 2: buf0[2] = (buf0[2] & ml) + | (tib40[2] & mr); + buf0[3] = tib40[3]; + buf1[0] = tib41[0]; + buf1[1] = tib41[1]; + buf1[2] = tib41[2]; + buf1[3] = tib41[3]; + break; + case 3: buf0[3] = (buf0[3] & ml) + | (tib40[3] & mr); + buf1[0] = tib41[0]; + buf1[1] = tib41[1]; + buf1[2] = tib41[2]; + buf1[3] = tib41[3]; + break; + case 4: buf1[0] = (buf1[0] & ml) + | (tib41[0] & mr); + buf1[1] = tib41[1]; + buf1[2] = tib41[2]; + buf1[3] = tib41[3]; + break; + case 5: buf1[1] = (buf1[1] & ml) + | (tib41[1] & mr); + buf1[2] = tib41[2]; + buf1[3] = tib41[3]; + break; + case 6: buf1[2] = (buf1[2] & ml) + | (tib41[2] & mr); + buf1[3] = tib41[3]; + break; + case 7: buf1[3] = (buf1[3] & ml) + | (tib41[3] & mr); + break; + } + + out_len--; + + return out_len; +} + +__device__ static u32 rule_op_mangle_extract (const u32 p0, const u32 p1, u32x buf0[4], u32x buf1[4], const u32 in_len) +{ + if (p0 >= in_len) return (in_len); + + if ((p0 + p1) > in_len) return (in_len); + + u32 out_len = p1; + + lshift_block_N (buf0, buf1, buf0, buf1, p0); + + truncate_right (buf0, buf1, out_len); + + return out_len; +} + +__device__ static u32 rule_op_mangle_omit (const u32 p0, const u32 p1, u32x buf0[4], u32x buf1[4], const u32 in_len) +{ + if (p0 >= in_len) return (in_len); + + if ((p0 + p1) > in_len) return (in_len); + + u32 out_len = in_len; + + u32x tib40[4]; + u32x tib41[4]; + + tib40[0] = 0; + tib40[1] = 0; + tib40[2] = 0; + tib40[3] = 0; + tib41[0] = 0; + tib41[1] = 0; + tib41[2] = 0; + tib41[3] = 0; + + lshift_block_N (buf0, buf1, tib40, tib41, p1); + + const u32 ml = (1 << ((p0 & 3) * 8)) - 1; + const u32 mr = ~ml; + + switch (p0 / 4) + { + case 0: buf0[0] = (buf0[0] & ml) + | (tib40[0] & mr); + buf0[1] = tib40[1]; + buf0[2] = tib40[2]; + buf0[3] = tib40[3]; + buf1[0] = tib41[0]; + buf1[1] = tib41[1]; + buf1[2] = tib41[2]; + buf1[3] = tib41[3]; + break; + case 1: buf0[1] = (buf0[1] & ml) + | (tib40[1] & mr); + buf0[2] = tib40[2]; + buf0[3] = tib40[3]; + buf1[0] = tib41[0]; + buf1[1] = tib41[1]; + buf1[2] = tib41[2]; + buf1[3] = tib41[3]; + break; + case 2: buf0[2] = (buf0[2] & ml) + | (tib40[2] & mr); + buf0[3] = tib40[3]; + buf1[0] = tib41[0]; + buf1[1] = tib41[1]; + buf1[2] = tib41[2]; + buf1[3] = tib41[3]; + break; + case 3: buf0[3] = (buf0[3] & ml) + | (tib40[3] & mr); + buf1[0] = tib41[0]; + buf1[1] = tib41[1]; + buf1[2] = tib41[2]; + buf1[3] = tib41[3]; + break; + case 4: buf1[0] = (buf1[0] & ml) + | (tib41[0] & mr); + buf1[1] = tib41[1]; + buf1[2] = tib41[2]; + buf1[3] = tib41[3]; + break; + case 5: buf1[1] = (buf1[1] & ml) + | (tib41[1] & mr); + buf1[2] = tib41[2]; + buf1[3] = tib41[3]; + break; + case 6: buf1[2] = (buf1[2] & ml) + | (tib41[2] & mr); + buf1[3] = tib41[3]; + break; + case 7: buf1[3] = (buf1[3] & ml) + | (tib41[3] & mr); + break; + } + + out_len -= p1; + + return out_len; +} + +__device__ static u32 rule_op_mangle_insert (const u32 p0, const u32 p1, u32x buf0[4], u32x buf1[4], const u32 in_len) +{ + if (p0 > in_len) return (in_len); + + if ((in_len + 1) >= 32) return (in_len); + + u32 out_len = in_len; + + u32x tib40[4]; + u32x tib41[4]; + + rshift_block (buf0, buf1, tib40, tib41); + + const u32 p1n = p1 << ((p0 & 3) * 8); + + const u32 ml = (1 << ((p0 & 3) * 8)) - 1; + + const u32 mr = 0xffffff00 << ((p0 & 3) * 8); + + switch (p0 / 4) + { + case 0: buf0[0] = (buf0[0] & ml) | p1n | (tib40[0] & mr); + buf0[1] = tib40[1]; + buf0[2] = tib40[2]; + buf0[3] = tib40[3]; + buf1[0] = tib41[0]; + buf1[1] = tib41[1]; + buf1[2] = tib41[2]; + buf1[3] = tib41[3]; + break; + case 1: buf0[1] = (buf0[1] & ml) | p1n | (tib40[1] & mr); + buf0[2] = tib40[2]; + buf0[3] = tib40[3]; + buf1[0] = tib41[0]; + buf1[1] = tib41[1]; + buf1[2] = tib41[2]; + buf1[3] = tib41[3]; + break; + case 2: buf0[2] = (buf0[2] & ml) | p1n | (tib40[2] & mr); + buf0[3] = tib40[3]; + buf1[0] = tib41[0]; + buf1[1] = tib41[1]; + buf1[2] = tib41[2]; + buf1[3] = tib41[3]; + break; + case 3: buf0[3] = (buf0[3] & ml) | p1n | (tib40[3] & mr); + buf1[0] = tib41[0]; + buf1[1] = tib41[1]; + buf1[2] = tib41[2]; + buf1[3] = tib41[3]; + break; + case 4: buf1[0] = (buf1[0] & ml) | p1n | (tib41[0] & mr); + buf1[1] = tib41[1]; + buf1[2] = tib41[2]; + buf1[3] = tib41[3]; + break; + case 5: buf1[1] = (buf1[1] & ml) | p1n | (tib41[1] & mr); + buf1[2] = tib41[2]; + buf1[3] = tib41[3]; + break; + case 6: buf1[2] = (buf1[2] & ml) | p1n | (tib41[2] & mr); + buf1[3] = tib41[3]; + break; + case 7: buf1[3] = (buf1[3] & ml) | p1n | (tib41[3] & mr); + break; + } + + out_len++; + + return out_len; +} + +__device__ static u32 rule_op_mangle_overstrike (const u32 p0, const u32 p1, u32x buf0[4], u32x buf1[4], const u32 in_len) +{ + if (p0 >= in_len) return (in_len); + + const u32 p1n = p1 << ((p0 & 3) * 8); + + const u32 m = ~(0xff << ((p0 & 3) * 8)); + + switch (p0 / 4) + { + case 0: buf0[0] = (buf0[0] & m) | p1n; break; + case 1: buf0[1] = (buf0[1] & m) | p1n; break; + case 2: buf0[2] = (buf0[2] & m) | p1n; break; + case 3: buf0[3] = (buf0[3] & m) | p1n; break; + case 4: buf1[0] = (buf1[0] & m) | p1n; break; + case 5: buf1[1] = (buf1[1] & m) | p1n; break; + case 6: buf1[2] = (buf1[2] & m) | p1n; break; + case 7: buf1[3] = (buf1[3] & m) | p1n; break; + } + + return in_len; +} + +__device__ static u32 rule_op_mangle_truncate_at (const u32 p0, const u32 p1, u32x buf0[4], u32x buf1[4], const u32 in_len) +{ + if (p0 >= in_len) return (in_len); + + truncate_right (buf0, buf1, p0); + + return p0; +} + +__device__ static u32 rule_op_mangle_replace (const u32 p0, const u32 p1, u32x buf0[4], u32x buf1[4], const u32 in_len) +{ + + + #ifdef VECT_SIZE1 + + for (u32 i = 0; i < in_len; i++) + { + switch (i) + { + case 0: if ((__byte_perm (buf0[0], 0, 0x6540)) == p0) buf0[0] = __byte_perm (p1, buf0[0], 0x7650); + break; + case 1: if ((__byte_perm (buf0[0], 0, 0x6541)) == p0) buf0[0] = __byte_perm (p1, buf0[0], 0x7604); + break; + case 2: if ((__byte_perm (buf0[0], 0, 0x6542)) == p0) buf0[0] = __byte_perm (p1, buf0[0], 0x7054); + break; + case 3: if ((__byte_perm (buf0[0], 0, 0x6543)) == p0) buf0[0] = __byte_perm (p1, buf0[0], 0x0654); + break; + case 4: if ((__byte_perm (buf0[1], 0, 0x6540)) == p0) buf0[1] = __byte_perm (p1, buf0[1], 0x7650); + break; + case 5: if ((__byte_perm (buf0[1], 0, 0x6541)) == p0) buf0[1] = __byte_perm (p1, buf0[1], 0x7604); + break; + case 6: if ((__byte_perm (buf0[1], 0, 0x6542)) == p0) buf0[1] = __byte_perm (p1, buf0[1], 0x7054); + break; + case 7: if ((__byte_perm (buf0[1], 0, 0x6543)) == p0) buf0[1] = __byte_perm (p1, buf0[1], 0x0654); + break; + case 8: if ((__byte_perm (buf0[2], 0, 0x6540)) == p0) buf0[2] = __byte_perm (p1, buf0[2], 0x7650); + break; + case 9: if ((__byte_perm (buf0[2], 0, 0x6541)) == p0) buf0[2] = __byte_perm (p1, buf0[2], 0x7604); + break; + case 10: if ((__byte_perm (buf0[2], 0, 0x6542)) == p0) buf0[2] = __byte_perm (p1, buf0[2], 0x7054); + break; + case 11: if ((__byte_perm (buf0[2], 0, 0x6543)) == p0) buf0[2] = __byte_perm (p1, buf0[2], 0x0654); + break; + case 12: if ((__byte_perm (buf0[3], 0, 0x6540)) == p0) buf0[3] = __byte_perm (p1, buf0[3], 0x7650); + break; + case 13: if ((__byte_perm (buf0[3], 0, 0x6541)) == p0) buf0[3] = __byte_perm (p1, buf0[3], 0x7604); + break; + case 14: if ((__byte_perm (buf0[3], 0, 0x6542)) == p0) buf0[3] = __byte_perm (p1, buf0[3], 0x7054); + break; + case 15: if ((__byte_perm (buf0[3], 0, 0x6543)) == p0) buf0[3] = __byte_perm (p1, buf0[3], 0x0654); + break; + case 16: if ((__byte_perm (buf1[0], 0, 0x6540)) == p0) buf1[0] = __byte_perm (p1, buf1[0], 0x7650); + break; + case 17: if ((__byte_perm (buf1[0], 0, 0x6541)) == p0) buf1[0] = __byte_perm (p1, buf1[0], 0x7604); + break; + case 18: if ((__byte_perm (buf1[0], 0, 0x6542)) == p0) buf1[0] = __byte_perm (p1, buf1[0], 0x7054); + break; + case 19: if ((__byte_perm (buf1[0], 0, 0x6543)) == p0) buf1[0] = __byte_perm (p1, buf1[0], 0x0654); + break; + case 20: if ((__byte_perm (buf1[1], 0, 0x6540)) == p0) buf1[1] = __byte_perm (p1, buf1[1], 0x7650); + break; + case 21: if ((__byte_perm (buf1[1], 0, 0x6541)) == p0) buf1[1] = __byte_perm (p1, buf1[1], 0x7604); + break; + case 22: if ((__byte_perm (buf1[1], 0, 0x6542)) == p0) buf1[1] = __byte_perm (p1, buf1[1], 0x7054); + break; + case 23: if ((__byte_perm (buf1[1], 0, 0x6543)) == p0) buf1[1] = __byte_perm (p1, buf1[1], 0x0654); + break; + case 24: if ((__byte_perm (buf1[2], 0, 0x6540)) == p0) buf1[2] = __byte_perm (p1, buf1[2], 0x7650); + break; + case 25: if ((__byte_perm (buf1[2], 0, 0x6541)) == p0) buf1[2] = __byte_perm (p1, buf1[2], 0x7604); + break; + case 26: if ((__byte_perm (buf1[2], 0, 0x6542)) == p0) buf1[2] = __byte_perm (p1, buf1[2], 0x7054); + break; + case 27: if ((__byte_perm (buf1[2], 0, 0x6543)) == p0) buf1[2] = __byte_perm (p1, buf1[2], 0x0654); + break; + case 28: if ((__byte_perm (buf1[3], 0, 0x6540)) == p0) buf1[3] = __byte_perm (p1, buf1[3], 0x7650); + break; + case 29: if ((__byte_perm (buf1[3], 0, 0x6541)) == p0) buf1[3] = __byte_perm (p1, buf1[3], 0x7604); + break; + case 30: if ((__byte_perm (buf1[3], 0, 0x6542)) == p0) buf1[3] = __byte_perm (p1, buf1[3], 0x7054); + break; + case 31: if ((__byte_perm (buf1[3], 0, 0x6543)) == p0) buf1[3] = __byte_perm (p1, buf1[3], 0x0654); + break; + } + } + + #endif + + #ifdef VECT_SIZE2 + + for (u32 i = 0; i < in_len; i++) + { + switch (i) + { + case 0: if ((__byte_perm (buf0[0].x, 0, 0x6540)) == p0) buf0[0].x = __byte_perm (p1, buf0[0].x, 0x7650); + if ((__byte_perm (buf0[0].y, 0, 0x6540)) == p0) buf0[0].y = __byte_perm (p1, buf0[0].y, 0x7650); + break; + case 1: if ((__byte_perm (buf0[0].x, 0, 0x6541)) == p0) buf0[0].x = __byte_perm (p1, buf0[0].x, 0x7604); + if ((__byte_perm (buf0[0].y, 0, 0x6541)) == p0) buf0[0].y = __byte_perm (p1, buf0[0].y, 0x7604); + break; + case 2: if ((__byte_perm (buf0[0].x, 0, 0x6542)) == p0) buf0[0].x = __byte_perm (p1, buf0[0].x, 0x7054); + if ((__byte_perm (buf0[0].y, 0, 0x6542)) == p0) buf0[0].y = __byte_perm (p1, buf0[0].y, 0x7054); + break; + case 3: if ((__byte_perm (buf0[0].x, 0, 0x6543)) == p0) buf0[0].x = __byte_perm (p1, buf0[0].x, 0x0654); + if ((__byte_perm (buf0[0].y, 0, 0x6543)) == p0) buf0[0].y = __byte_perm (p1, buf0[0].y, 0x0654); + break; + case 4: if ((__byte_perm (buf0[1].x, 0, 0x6540)) == p0) buf0[1].x = __byte_perm (p1, buf0[1].x, 0x7650); + if ((__byte_perm (buf0[1].y, 0, 0x6540)) == p0) buf0[1].y = __byte_perm (p1, buf0[1].y, 0x7650); + break; + case 5: if ((__byte_perm (buf0[1].x, 0, 0x6541)) == p0) buf0[1].x = __byte_perm (p1, buf0[1].x, 0x7604); + if ((__byte_perm (buf0[1].y, 0, 0x6541)) == p0) buf0[1].y = __byte_perm (p1, buf0[1].y, 0x7604); + break; + case 6: if ((__byte_perm (buf0[1].x, 0, 0x6542)) == p0) buf0[1].x = __byte_perm (p1, buf0[1].x, 0x7054); + if ((__byte_perm (buf0[1].y, 0, 0x6542)) == p0) buf0[1].y = __byte_perm (p1, buf0[1].y, 0x7054); + break; + case 7: if ((__byte_perm (buf0[1].x, 0, 0x6543)) == p0) buf0[1].x = __byte_perm (p1, buf0[1].x, 0x0654); + if ((__byte_perm (buf0[1].y, 0, 0x6543)) == p0) buf0[1].y = __byte_perm (p1, buf0[1].y, 0x0654); + break; + case 8: if ((__byte_perm (buf0[2].x, 0, 0x6540)) == p0) buf0[2].x = __byte_perm (p1, buf0[2].x, 0x7650); + if ((__byte_perm (buf0[2].y, 0, 0x6540)) == p0) buf0[2].y = __byte_perm (p1, buf0[2].y, 0x7650); + break; + case 9: if ((__byte_perm (buf0[2].x, 0, 0x6541)) == p0) buf0[2].x = __byte_perm (p1, buf0[2].x, 0x7604); + if ((__byte_perm (buf0[2].y, 0, 0x6541)) == p0) buf0[2].y = __byte_perm (p1, buf0[2].y, 0x7604); + break; + case 10: if ((__byte_perm (buf0[2].x, 0, 0x6542)) == p0) buf0[2].x = __byte_perm (p1, buf0[2].x, 0x7054); + if ((__byte_perm (buf0[2].y, 0, 0x6542)) == p0) buf0[2].y = __byte_perm (p1, buf0[2].y, 0x7054); + break; + case 11: if ((__byte_perm (buf0[2].x, 0, 0x6543)) == p0) buf0[2].x = __byte_perm (p1, buf0[2].x, 0x0654); + if ((__byte_perm (buf0[2].y, 0, 0x6543)) == p0) buf0[2].y = __byte_perm (p1, buf0[2].y, 0x0654); + break; + case 12: if ((__byte_perm (buf0[3].x, 0, 0x6540)) == p0) buf0[3].x = __byte_perm (p1, buf0[3].x, 0x7650); + if ((__byte_perm (buf0[3].y, 0, 0x6540)) == p0) buf0[3].y = __byte_perm (p1, buf0[3].y, 0x7650); + break; + case 13: if ((__byte_perm (buf0[3].x, 0, 0x6541)) == p0) buf0[3].x = __byte_perm (p1, buf0[3].x, 0x7604); + if ((__byte_perm (buf0[3].y, 0, 0x6541)) == p0) buf0[3].y = __byte_perm (p1, buf0[3].y, 0x7604); + break; + case 14: if ((__byte_perm (buf0[3].x, 0, 0x6542)) == p0) buf0[3].x = __byte_perm (p1, buf0[3].x, 0x7054); + if ((__byte_perm (buf0[3].y, 0, 0x6542)) == p0) buf0[3].y = __byte_perm (p1, buf0[3].y, 0x7054); + break; + case 15: if ((__byte_perm (buf0[3].x, 0, 0x6543)) == p0) buf0[3].x = __byte_perm (p1, buf0[3].x, 0x0654); + if ((__byte_perm (buf0[3].y, 0, 0x6543)) == p0) buf0[3].y = __byte_perm (p1, buf0[3].y, 0x0654); + break; + case 16: if ((__byte_perm (buf1[0].x, 0, 0x6540)) == p0) buf1[0].x = __byte_perm (p1, buf1[0].x, 0x7650); + if ((__byte_perm (buf1[0].y, 0, 0x6540)) == p0) buf1[0].y = __byte_perm (p1, buf1[0].y, 0x7650); + break; + case 17: if ((__byte_perm (buf1[0].x, 0, 0x6541)) == p0) buf1[0].x = __byte_perm (p1, buf1[0].x, 0x7604); + if ((__byte_perm (buf1[0].y, 0, 0x6541)) == p0) buf1[0].y = __byte_perm (p1, buf1[0].y, 0x7604); + break; + case 18: if ((__byte_perm (buf1[0].x, 0, 0x6542)) == p0) buf1[0].x = __byte_perm (p1, buf1[0].x, 0x7054); + if ((__byte_perm (buf1[0].y, 0, 0x6542)) == p0) buf1[0].y = __byte_perm (p1, buf1[0].y, 0x7054); + break; + case 19: if ((__byte_perm (buf1[0].x, 0, 0x6543)) == p0) buf1[0].x = __byte_perm (p1, buf1[0].x, 0x0654); + if ((__byte_perm (buf1[0].y, 0, 0x6543)) == p0) buf1[0].y = __byte_perm (p1, buf1[0].y, 0x0654); + break; + case 20: if ((__byte_perm (buf1[1].x, 0, 0x6540)) == p0) buf1[1].x = __byte_perm (p1, buf1[1].x, 0x7650); + if ((__byte_perm (buf1[1].y, 0, 0x6540)) == p0) buf1[1].y = __byte_perm (p1, buf1[1].y, 0x7650); + break; + case 21: if ((__byte_perm (buf1[1].x, 0, 0x6541)) == p0) buf1[1].x = __byte_perm (p1, buf1[1].x, 0x7604); + if ((__byte_perm (buf1[1].y, 0, 0x6541)) == p0) buf1[1].y = __byte_perm (p1, buf1[1].y, 0x7604); + break; + case 22: if ((__byte_perm (buf1[1].x, 0, 0x6542)) == p0) buf1[1].x = __byte_perm (p1, buf1[1].x, 0x7054); + if ((__byte_perm (buf1[1].y, 0, 0x6542)) == p0) buf1[1].y = __byte_perm (p1, buf1[1].y, 0x7054); + break; + case 23: if ((__byte_perm (buf1[1].x, 0, 0x6543)) == p0) buf1[1].x = __byte_perm (p1, buf1[1].x, 0x0654); + if ((__byte_perm (buf1[1].y, 0, 0x6543)) == p0) buf1[1].y = __byte_perm (p1, buf1[1].y, 0x0654); + break; + case 24: if ((__byte_perm (buf1[2].x, 0, 0x6540)) == p0) buf1[2].x = __byte_perm (p1, buf1[2].x, 0x7650); + if ((__byte_perm (buf1[2].y, 0, 0x6540)) == p0) buf1[2].y = __byte_perm (p1, buf1[2].y, 0x7650); + break; + case 25: if ((__byte_perm (buf1[2].x, 0, 0x6541)) == p0) buf1[2].x = __byte_perm (p1, buf1[2].x, 0x7604); + if ((__byte_perm (buf1[2].y, 0, 0x6541)) == p0) buf1[2].y = __byte_perm (p1, buf1[2].y, 0x7604); + break; + case 26: if ((__byte_perm (buf1[2].x, 0, 0x6542)) == p0) buf1[2].x = __byte_perm (p1, buf1[2].x, 0x7054); + if ((__byte_perm (buf1[2].y, 0, 0x6542)) == p0) buf1[2].y = __byte_perm (p1, buf1[2].y, 0x7054); + break; + case 27: if ((__byte_perm (buf1[2].x, 0, 0x6543)) == p0) buf1[2].x = __byte_perm (p1, buf1[2].x, 0x0654); + if ((__byte_perm (buf1[2].y, 0, 0x6543)) == p0) buf1[2].y = __byte_perm (p1, buf1[2].y, 0x0654); + break; + case 28: if ((__byte_perm (buf1[3].x, 0, 0x6540)) == p0) buf1[3].x = __byte_perm (p1, buf1[3].x, 0x7650); + if ((__byte_perm (buf1[3].y, 0, 0x6540)) == p0) buf1[3].y = __byte_perm (p1, buf1[3].y, 0x7650); + break; + case 29: if ((__byte_perm (buf1[3].x, 0, 0x6541)) == p0) buf1[3].x = __byte_perm (p1, buf1[3].x, 0x7604); + if ((__byte_perm (buf1[3].y, 0, 0x6541)) == p0) buf1[3].y = __byte_perm (p1, buf1[3].y, 0x7604); + break; + case 30: if ((__byte_perm (buf1[3].x, 0, 0x6542)) == p0) buf1[3].x = __byte_perm (p1, buf1[3].x, 0x7054); + if ((__byte_perm (buf1[3].y, 0, 0x6542)) == p0) buf1[3].y = __byte_perm (p1, buf1[3].y, 0x7054); + break; + case 31: if ((__byte_perm (buf1[3].x, 0, 0x6543)) == p0) buf1[3].x = __byte_perm (p1, buf1[3].x, 0x0654); + if ((__byte_perm (buf1[3].y, 0, 0x6543)) == p0) buf1[3].y = __byte_perm (p1, buf1[3].y, 0x0654); + break; + } + } + + #endif + + #ifdef VECT_SIZE4 + + for (u32 i = 0; i < in_len; i++) + { + switch (i) + { + case 0: if ((__byte_perm (buf0[0].x, 0, 0x6540)) == p0) buf0[0].x = __byte_perm (p1, buf0[0].x, 0x7650); + if ((__byte_perm (buf0[0].y, 0, 0x6540)) == p0) buf0[0].y = __byte_perm (p1, buf0[0].y, 0x7650); + if ((__byte_perm (buf0[0].z, 0, 0x6540)) == p0) buf0[0].z = __byte_perm (p1, buf0[0].z, 0x7650); + if ((__byte_perm (buf0[0].w, 0, 0x6540)) == p0) buf0[0].w = __byte_perm (p1, buf0[0].w, 0x7650); + break; + case 1: if ((__byte_perm (buf0[0].x, 0, 0x6541)) == p0) buf0[0].x = __byte_perm (p1, buf0[0].x, 0x7604); + if ((__byte_perm (buf0[0].y, 0, 0x6541)) == p0) buf0[0].y = __byte_perm (p1, buf0[0].y, 0x7604); + if ((__byte_perm (buf0[0].z, 0, 0x6541)) == p0) buf0[0].z = __byte_perm (p1, buf0[0].z, 0x7604); + if ((__byte_perm (buf0[0].w, 0, 0x6541)) == p0) buf0[0].w = __byte_perm (p1, buf0[0].w, 0x7604); + break; + case 2: if ((__byte_perm (buf0[0].x, 0, 0x6542)) == p0) buf0[0].x = __byte_perm (p1, buf0[0].x, 0x7054); + if ((__byte_perm (buf0[0].y, 0, 0x6542)) == p0) buf0[0].y = __byte_perm (p1, buf0[0].y, 0x7054); + if ((__byte_perm (buf0[0].z, 0, 0x6542)) == p0) buf0[0].z = __byte_perm (p1, buf0[0].z, 0x7054); + if ((__byte_perm (buf0[0].w, 0, 0x6542)) == p0) buf0[0].w = __byte_perm (p1, buf0[0].w, 0x7054); + break; + case 3: if ((__byte_perm (buf0[0].x, 0, 0x6543)) == p0) buf0[0].x = __byte_perm (p1, buf0[0].x, 0x0654); + if ((__byte_perm (buf0[0].y, 0, 0x6543)) == p0) buf0[0].y = __byte_perm (p1, buf0[0].y, 0x0654); + if ((__byte_perm (buf0[0].z, 0, 0x6543)) == p0) buf0[0].z = __byte_perm (p1, buf0[0].z, 0x0654); + if ((__byte_perm (buf0[0].w, 0, 0x6543)) == p0) buf0[0].w = __byte_perm (p1, buf0[0].w, 0x0654); + break; + case 4: if ((__byte_perm (buf0[1].x, 0, 0x6540)) == p0) buf0[1].x = __byte_perm (p1, buf0[1].x, 0x7650); + if ((__byte_perm (buf0[1].y, 0, 0x6540)) == p0) buf0[1].y = __byte_perm (p1, buf0[1].y, 0x7650); + if ((__byte_perm (buf0[1].z, 0, 0x6540)) == p0) buf0[1].z = __byte_perm (p1, buf0[1].z, 0x7650); + if ((__byte_perm (buf0[1].w, 0, 0x6540)) == p0) buf0[1].w = __byte_perm (p1, buf0[1].w, 0x7650); + break; + case 5: if ((__byte_perm (buf0[1].x, 0, 0x6541)) == p0) buf0[1].x = __byte_perm (p1, buf0[1].x, 0x7604); + if ((__byte_perm (buf0[1].y, 0, 0x6541)) == p0) buf0[1].y = __byte_perm (p1, buf0[1].y, 0x7604); + if ((__byte_perm (buf0[1].z, 0, 0x6541)) == p0) buf0[1].z = __byte_perm (p1, buf0[1].z, 0x7604); + if ((__byte_perm (buf0[1].w, 0, 0x6541)) == p0) buf0[1].w = __byte_perm (p1, buf0[1].w, 0x7604); + break; + case 6: if ((__byte_perm (buf0[1].x, 0, 0x6542)) == p0) buf0[1].x = __byte_perm (p1, buf0[1].x, 0x7054); + if ((__byte_perm (buf0[1].y, 0, 0x6542)) == p0) buf0[1].y = __byte_perm (p1, buf0[1].y, 0x7054); + if ((__byte_perm (buf0[1].z, 0, 0x6542)) == p0) buf0[1].z = __byte_perm (p1, buf0[1].z, 0x7054); + if ((__byte_perm (buf0[1].w, 0, 0x6542)) == p0) buf0[1].w = __byte_perm (p1, buf0[1].w, 0x7054); + break; + case 7: if ((__byte_perm (buf0[1].x, 0, 0x6543)) == p0) buf0[1].x = __byte_perm (p1, buf0[1].x, 0x0654); + if ((__byte_perm (buf0[1].y, 0, 0x6543)) == p0) buf0[1].y = __byte_perm (p1, buf0[1].y, 0x0654); + if ((__byte_perm (buf0[1].z, 0, 0x6543)) == p0) buf0[1].z = __byte_perm (p1, buf0[1].z, 0x0654); + if ((__byte_perm (buf0[1].w, 0, 0x6543)) == p0) buf0[1].w = __byte_perm (p1, buf0[1].w, 0x0654); + break; + case 8: if ((__byte_perm (buf0[2].x, 0, 0x6540)) == p0) buf0[2].x = __byte_perm (p1, buf0[2].x, 0x7650); + if ((__byte_perm (buf0[2].y, 0, 0x6540)) == p0) buf0[2].y = __byte_perm (p1, buf0[2].y, 0x7650); + if ((__byte_perm (buf0[2].z, 0, 0x6540)) == p0) buf0[2].z = __byte_perm (p1, buf0[2].z, 0x7650); + if ((__byte_perm (buf0[2].w, 0, 0x6540)) == p0) buf0[2].w = __byte_perm (p1, buf0[2].w, 0x7650); + break; + case 9: if ((__byte_perm (buf0[2].x, 0, 0x6541)) == p0) buf0[2].x = __byte_perm (p1, buf0[2].x, 0x7604); + if ((__byte_perm (buf0[2].y, 0, 0x6541)) == p0) buf0[2].y = __byte_perm (p1, buf0[2].y, 0x7604); + if ((__byte_perm (buf0[2].z, 0, 0x6541)) == p0) buf0[2].z = __byte_perm (p1, buf0[2].z, 0x7604); + if ((__byte_perm (buf0[2].w, 0, 0x6541)) == p0) buf0[2].w = __byte_perm (p1, buf0[2].w, 0x7604); + break; + case 10: if ((__byte_perm (buf0[2].x, 0, 0x6542)) == p0) buf0[2].x = __byte_perm (p1, buf0[2].x, 0x7054); + if ((__byte_perm (buf0[2].y, 0, 0x6542)) == p0) buf0[2].y = __byte_perm (p1, buf0[2].y, 0x7054); + if ((__byte_perm (buf0[2].z, 0, 0x6542)) == p0) buf0[2].z = __byte_perm (p1, buf0[2].z, 0x7054); + if ((__byte_perm (buf0[2].w, 0, 0x6542)) == p0) buf0[2].w = __byte_perm (p1, buf0[2].w, 0x7054); + break; + case 11: if ((__byte_perm (buf0[2].x, 0, 0x6543)) == p0) buf0[2].x = __byte_perm (p1, buf0[2].x, 0x0654); + if ((__byte_perm (buf0[2].y, 0, 0x6543)) == p0) buf0[2].y = __byte_perm (p1, buf0[2].y, 0x0654); + if ((__byte_perm (buf0[2].z, 0, 0x6543)) == p0) buf0[2].z = __byte_perm (p1, buf0[2].z, 0x0654); + if ((__byte_perm (buf0[2].w, 0, 0x6543)) == p0) buf0[2].w = __byte_perm (p1, buf0[2].w, 0x0654); + break; + case 12: if ((__byte_perm (buf0[3].x, 0, 0x6540)) == p0) buf0[3].x = __byte_perm (p1, buf0[3].x, 0x7650); + if ((__byte_perm (buf0[3].y, 0, 0x6540)) == p0) buf0[3].y = __byte_perm (p1, buf0[3].y, 0x7650); + if ((__byte_perm (buf0[3].z, 0, 0x6540)) == p0) buf0[3].z = __byte_perm (p1, buf0[3].z, 0x7650); + if ((__byte_perm (buf0[3].w, 0, 0x6540)) == p0) buf0[3].w = __byte_perm (p1, buf0[3].w, 0x7650); + break; + case 13: if ((__byte_perm (buf0[3].x, 0, 0x6541)) == p0) buf0[3].x = __byte_perm (p1, buf0[3].x, 0x7604); + if ((__byte_perm (buf0[3].y, 0, 0x6541)) == p0) buf0[3].y = __byte_perm (p1, buf0[3].y, 0x7604); + if ((__byte_perm (buf0[3].z, 0, 0x6541)) == p0) buf0[3].z = __byte_perm (p1, buf0[3].z, 0x7604); + if ((__byte_perm (buf0[3].w, 0, 0x6541)) == p0) buf0[3].w = __byte_perm (p1, buf0[3].w, 0x7604); + break; + case 14: if ((__byte_perm (buf0[3].x, 0, 0x6542)) == p0) buf0[3].x = __byte_perm (p1, buf0[3].x, 0x7054); + if ((__byte_perm (buf0[3].y, 0, 0x6542)) == p0) buf0[3].y = __byte_perm (p1, buf0[3].y, 0x7054); + if ((__byte_perm (buf0[3].z, 0, 0x6542)) == p0) buf0[3].z = __byte_perm (p1, buf0[3].z, 0x7054); + if ((__byte_perm (buf0[3].w, 0, 0x6542)) == p0) buf0[3].w = __byte_perm (p1, buf0[3].w, 0x7054); + break; + case 15: if ((__byte_perm (buf0[3].x, 0, 0x6543)) == p0) buf0[3].x = __byte_perm (p1, buf0[3].x, 0x0654); + if ((__byte_perm (buf0[3].y, 0, 0x6543)) == p0) buf0[3].y = __byte_perm (p1, buf0[3].y, 0x0654); + if ((__byte_perm (buf0[3].z, 0, 0x6543)) == p0) buf0[3].z = __byte_perm (p1, buf0[3].z, 0x0654); + if ((__byte_perm (buf0[3].w, 0, 0x6543)) == p0) buf0[3].w = __byte_perm (p1, buf0[3].w, 0x0654); + break; + case 16: if ((__byte_perm (buf1[0].x, 0, 0x6540)) == p0) buf1[0].x = __byte_perm (p1, buf1[0].x, 0x7650); + if ((__byte_perm (buf1[0].y, 0, 0x6540)) == p0) buf1[0].y = __byte_perm (p1, buf1[0].y, 0x7650); + if ((__byte_perm (buf1[0].z, 0, 0x6540)) == p0) buf1[0].z = __byte_perm (p1, buf1[0].z, 0x7650); + if ((__byte_perm (buf1[0].w, 0, 0x6540)) == p0) buf1[0].w = __byte_perm (p1, buf1[0].w, 0x7650); + break; + case 17: if ((__byte_perm (buf1[0].x, 0, 0x6541)) == p0) buf1[0].x = __byte_perm (p1, buf1[0].x, 0x7604); + if ((__byte_perm (buf1[0].y, 0, 0x6541)) == p0) buf1[0].y = __byte_perm (p1, buf1[0].y, 0x7604); + if ((__byte_perm (buf1[0].z, 0, 0x6541)) == p0) buf1[0].z = __byte_perm (p1, buf1[0].z, 0x7604); + if ((__byte_perm (buf1[0].w, 0, 0x6541)) == p0) buf1[0].w = __byte_perm (p1, buf1[0].w, 0x7604); + break; + case 18: if ((__byte_perm (buf1[0].x, 0, 0x6542)) == p0) buf1[0].x = __byte_perm (p1, buf1[0].x, 0x7054); + if ((__byte_perm (buf1[0].y, 0, 0x6542)) == p0) buf1[0].y = __byte_perm (p1, buf1[0].y, 0x7054); + if ((__byte_perm (buf1[0].z, 0, 0x6542)) == p0) buf1[0].z = __byte_perm (p1, buf1[0].z, 0x7054); + if ((__byte_perm (buf1[0].w, 0, 0x6542)) == p0) buf1[0].w = __byte_perm (p1, buf1[0].w, 0x7054); + break; + case 19: if ((__byte_perm (buf1[0].x, 0, 0x6543)) == p0) buf1[0].x = __byte_perm (p1, buf1[0].x, 0x0654); + if ((__byte_perm (buf1[0].y, 0, 0x6543)) == p0) buf1[0].y = __byte_perm (p1, buf1[0].y, 0x0654); + if ((__byte_perm (buf1[0].z, 0, 0x6543)) == p0) buf1[0].z = __byte_perm (p1, buf1[0].z, 0x0654); + if ((__byte_perm (buf1[0].w, 0, 0x6543)) == p0) buf1[0].w = __byte_perm (p1, buf1[0].w, 0x0654); + break; + case 20: if ((__byte_perm (buf1[1].x, 0, 0x6540)) == p0) buf1[1].x = __byte_perm (p1, buf1[1].x, 0x7650); + if ((__byte_perm (buf1[1].y, 0, 0x6540)) == p0) buf1[1].y = __byte_perm (p1, buf1[1].y, 0x7650); + if ((__byte_perm (buf1[1].z, 0, 0x6540)) == p0) buf1[1].z = __byte_perm (p1, buf1[1].z, 0x7650); + if ((__byte_perm (buf1[1].w, 0, 0x6540)) == p0) buf1[1].w = __byte_perm (p1, buf1[1].w, 0x7650); + break; + case 21: if ((__byte_perm (buf1[1].x, 0, 0x6541)) == p0) buf1[1].x = __byte_perm (p1, buf1[1].x, 0x7604); + if ((__byte_perm (buf1[1].y, 0, 0x6541)) == p0) buf1[1].y = __byte_perm (p1, buf1[1].y, 0x7604); + if ((__byte_perm (buf1[1].z, 0, 0x6541)) == p0) buf1[1].z = __byte_perm (p1, buf1[1].z, 0x7604); + if ((__byte_perm (buf1[1].w, 0, 0x6541)) == p0) buf1[1].w = __byte_perm (p1, buf1[1].w, 0x7604); + break; + case 22: if ((__byte_perm (buf1[1].x, 0, 0x6542)) == p0) buf1[1].x = __byte_perm (p1, buf1[1].x, 0x7054); + if ((__byte_perm (buf1[1].y, 0, 0x6542)) == p0) buf1[1].y = __byte_perm (p1, buf1[1].y, 0x7054); + if ((__byte_perm (buf1[1].z, 0, 0x6542)) == p0) buf1[1].z = __byte_perm (p1, buf1[1].z, 0x7054); + if ((__byte_perm (buf1[1].w, 0, 0x6542)) == p0) buf1[1].w = __byte_perm (p1, buf1[1].w, 0x7054); + break; + case 23: if ((__byte_perm (buf1[1].x, 0, 0x6543)) == p0) buf1[1].x = __byte_perm (p1, buf1[1].x, 0x0654); + if ((__byte_perm (buf1[1].y, 0, 0x6543)) == p0) buf1[1].y = __byte_perm (p1, buf1[1].y, 0x0654); + if ((__byte_perm (buf1[1].z, 0, 0x6543)) == p0) buf1[1].z = __byte_perm (p1, buf1[1].z, 0x0654); + if ((__byte_perm (buf1[1].w, 0, 0x6543)) == p0) buf1[1].w = __byte_perm (p1, buf1[1].w, 0x0654); + break; + case 24: if ((__byte_perm (buf1[2].x, 0, 0x6540)) == p0) buf1[2].x = __byte_perm (p1, buf1[2].x, 0x7650); + if ((__byte_perm (buf1[2].y, 0, 0x6540)) == p0) buf1[2].y = __byte_perm (p1, buf1[2].y, 0x7650); + if ((__byte_perm (buf1[2].z, 0, 0x6540)) == p0) buf1[2].z = __byte_perm (p1, buf1[2].z, 0x7650); + if ((__byte_perm (buf1[2].w, 0, 0x6540)) == p0) buf1[2].w = __byte_perm (p1, buf1[2].w, 0x7650); + break; + case 25: if ((__byte_perm (buf1[2].x, 0, 0x6541)) == p0) buf1[2].x = __byte_perm (p1, buf1[2].x, 0x7604); + if ((__byte_perm (buf1[2].y, 0, 0x6541)) == p0) buf1[2].y = __byte_perm (p1, buf1[2].y, 0x7604); + if ((__byte_perm (buf1[2].z, 0, 0x6541)) == p0) buf1[2].z = __byte_perm (p1, buf1[2].z, 0x7604); + if ((__byte_perm (buf1[2].w, 0, 0x6541)) == p0) buf1[2].w = __byte_perm (p1, buf1[2].w, 0x7604); + break; + case 26: if ((__byte_perm (buf1[2].x, 0, 0x6542)) == p0) buf1[2].x = __byte_perm (p1, buf1[2].x, 0x7054); + if ((__byte_perm (buf1[2].y, 0, 0x6542)) == p0) buf1[2].y = __byte_perm (p1, buf1[2].y, 0x7054); + if ((__byte_perm (buf1[2].z, 0, 0x6542)) == p0) buf1[2].z = __byte_perm (p1, buf1[2].z, 0x7054); + if ((__byte_perm (buf1[2].w, 0, 0x6542)) == p0) buf1[2].w = __byte_perm (p1, buf1[2].w, 0x7054); + break; + case 27: if ((__byte_perm (buf1[2].x, 0, 0x6543)) == p0) buf1[2].x = __byte_perm (p1, buf1[2].x, 0x0654); + if ((__byte_perm (buf1[2].y, 0, 0x6543)) == p0) buf1[2].y = __byte_perm (p1, buf1[2].y, 0x0654); + if ((__byte_perm (buf1[2].z, 0, 0x6543)) == p0) buf1[2].z = __byte_perm (p1, buf1[2].z, 0x0654); + if ((__byte_perm (buf1[2].w, 0, 0x6543)) == p0) buf1[2].w = __byte_perm (p1, buf1[2].w, 0x0654); + break; + case 28: if ((__byte_perm (buf1[3].x, 0, 0x6540)) == p0) buf1[3].x = __byte_perm (p1, buf1[3].x, 0x7650); + if ((__byte_perm (buf1[3].y, 0, 0x6540)) == p0) buf1[3].y = __byte_perm (p1, buf1[3].y, 0x7650); + if ((__byte_perm (buf1[3].z, 0, 0x6540)) == p0) buf1[3].z = __byte_perm (p1, buf1[3].z, 0x7650); + if ((__byte_perm (buf1[3].w, 0, 0x6540)) == p0) buf1[3].w = __byte_perm (p1, buf1[3].w, 0x7650); + break; + case 29: if ((__byte_perm (buf1[3].x, 0, 0x6541)) == p0) buf1[3].x = __byte_perm (p1, buf1[3].x, 0x7604); + if ((__byte_perm (buf1[3].y, 0, 0x6541)) == p0) buf1[3].y = __byte_perm (p1, buf1[3].y, 0x7604); + if ((__byte_perm (buf1[3].z, 0, 0x6541)) == p0) buf1[3].z = __byte_perm (p1, buf1[3].z, 0x7604); + if ((__byte_perm (buf1[3].w, 0, 0x6541)) == p0) buf1[3].w = __byte_perm (p1, buf1[3].w, 0x7604); + break; + case 30: if ((__byte_perm (buf1[3].x, 0, 0x6542)) == p0) buf1[3].x = __byte_perm (p1, buf1[3].x, 0x7054); + if ((__byte_perm (buf1[3].y, 0, 0x6542)) == p0) buf1[3].y = __byte_perm (p1, buf1[3].y, 0x7054); + if ((__byte_perm (buf1[3].z, 0, 0x6542)) == p0) buf1[3].z = __byte_perm (p1, buf1[3].z, 0x7054); + if ((__byte_perm (buf1[3].w, 0, 0x6542)) == p0) buf1[3].w = __byte_perm (p1, buf1[3].w, 0x7054); + break; + case 31: if ((__byte_perm (buf1[3].x, 0, 0x6543)) == p0) buf1[3].x = __byte_perm (p1, buf1[3].x, 0x0654); + if ((__byte_perm (buf1[3].y, 0, 0x6543)) == p0) buf1[3].y = __byte_perm (p1, buf1[3].y, 0x0654); + if ((__byte_perm (buf1[3].z, 0, 0x6543)) == p0) buf1[3].z = __byte_perm (p1, buf1[3].z, 0x0654); + if ((__byte_perm (buf1[3].w, 0, 0x6543)) == p0) buf1[3].w = __byte_perm (p1, buf1[3].w, 0x0654); + break; + } + } + + #endif + + + return in_len; +} + +__device__ static u32 rule_op_mangle_purgechar (const u32 p0, const u32 p1, u32x buf0[4], u32x buf1[4], const u32 in_len) +{ + // TODO + return in_len; +} + +__device__ static u32 rule_op_mangle_togglecase_rec (const u32 p0, const u32 p1, u32x buf0[4], u32x buf1[4], const u32 in_len) +{ + // TODO + return in_len; +} + +__device__ static u32 rule_op_mangle_dupechar_first (const u32 p0, const u32 p1, u32x buf0[4], u32x buf1[4], const u32 in_len) +{ + if ( in_len == 0) return (in_len); + if ((in_len + p0) >= 32) return (in_len); + + u32 out_len = in_len; + + const u32x tmp = buf0[0] & 0xFF; + + rshift_block_N (buf0, buf1, buf0, buf1, p0); + + #if __CUDA_ARCH__ >= 200 + + switch (p0) + { + case 1: buf0[0] |= tmp; + break; + case 2: buf0[0] |= __byte_perm (tmp, 0, 0x5400); + break; + case 3: buf0[0] |= __byte_perm (tmp, 0, 0x4000); + break; + case 4: buf0[0] |= __byte_perm (tmp, 0, 0x0000); + break; + case 5: buf0[0] |= __byte_perm (tmp, 0, 0x0000); + buf0[1] |= tmp; + break; + case 6: buf0[0] |= __byte_perm (tmp, 0, 0x0000); + buf0[1] |= __byte_perm (tmp, 0, 0x5400); + break; + case 7: buf0[0] |= __byte_perm (tmp, 0, 0x0000); + buf0[1] |= __byte_perm (tmp, 0, 0x4000); + break; + case 8: buf0[0] |= __byte_perm (tmp, 0, 0x0000); + buf0[1] |= __byte_perm (tmp, 0, 0x0000); + break; + case 9: buf0[0] |= __byte_perm (tmp, 0, 0x0000); + buf0[1] |= __byte_perm (tmp, 0, 0x0000); + buf0[2] |= tmp; + break; + case 10: buf0[0] |= __byte_perm (tmp, 0, 0x0000); + buf0[1] |= __byte_perm (tmp, 0, 0x0000); + buf0[2] |= __byte_perm (tmp, 0, 0x5400); + break; + case 11: buf0[0] |= __byte_perm (tmp, 0, 0x0000); + buf0[1] |= __byte_perm (tmp, 0, 0x0000); + buf0[2] |= __byte_perm (tmp, 0, 0x4000); + break; + case 12: buf0[0] |= __byte_perm (tmp, 0, 0x0000); + buf0[1] |= __byte_perm (tmp, 0, 0x0000); + buf0[2] |= __byte_perm (tmp, 0, 0x0000); + break; + case 13: buf0[0] |= __byte_perm (tmp, 0, 0x0000); + buf0[1] |= __byte_perm (tmp, 0, 0x0000); + buf0[2] |= __byte_perm (tmp, 0, 0x0000); + buf0[3] |= tmp; + break; + case 14: buf0[0] |= __byte_perm (tmp, 0, 0x0000); + buf0[1] |= __byte_perm (tmp, 0, 0x0000); + buf0[2] |= __byte_perm (tmp, 0, 0x0000); + buf0[3] |= __byte_perm (tmp, 0, 0x5400); + break; + case 15: buf0[0] |= __byte_perm (tmp, 0, 0x0000); + buf0[1] |= __byte_perm (tmp, 0, 0x0000); + buf0[2] |= __byte_perm (tmp, 0, 0x0000); + buf0[3] |= __byte_perm (tmp, 0, 0x4000); + break; + case 16: buf0[0] |= __byte_perm (tmp, 0, 0x0000); + buf0[1] |= __byte_perm (tmp, 0, 0x0000); + buf0[2] |= __byte_perm (tmp, 0, 0x0000); + buf0[3] |= __byte_perm (tmp, 0, 0x0000); + break; + case 17: buf0[0] |= __byte_perm (tmp, 0, 0x0000); + buf0[1] |= __byte_perm (tmp, 0, 0x0000); + buf0[2] |= __byte_perm (tmp, 0, 0x0000); + buf0[3] |= __byte_perm (tmp, 0, 0x0000); + buf1[0] |= tmp; + break; + case 18: buf0[0] |= __byte_perm (tmp, 0, 0x0000); + buf0[1] |= __byte_perm (tmp, 0, 0x0000); + buf0[2] |= __byte_perm (tmp, 0, 0x0000); + buf0[3] |= __byte_perm (tmp, 0, 0x0000); + buf1[0] |= __byte_perm (tmp, 0, 0x5400); + break; + case 19: buf0[0] |= __byte_perm (tmp, 0, 0x0000); + buf0[1] |= __byte_perm (tmp, 0, 0x0000); + buf0[2] |= __byte_perm (tmp, 0, 0x0000); + buf0[3] |= __byte_perm (tmp, 0, 0x0000); + buf1[0] |= __byte_perm (tmp, 0, 0x4000); + break; + case 20: buf0[0] |= __byte_perm (tmp, 0, 0x0000); + buf0[1] |= __byte_perm (tmp, 0, 0x0000); + buf0[2] |= __byte_perm (tmp, 0, 0x0000); + buf0[3] |= __byte_perm (tmp, 0, 0x0000); + buf1[0] |= __byte_perm (tmp, 0, 0x0000); + break; + case 21: buf0[0] |= __byte_perm (tmp, 0, 0x0000); + buf0[1] |= __byte_perm (tmp, 0, 0x0000); + buf0[2] |= __byte_perm (tmp, 0, 0x0000); + buf0[3] |= __byte_perm (tmp, 0, 0x0000); + buf1[0] |= __byte_perm (tmp, 0, 0x0000); + buf1[1] |= tmp; + break; + case 22: buf0[0] |= __byte_perm (tmp, 0, 0x0000); + buf0[1] |= __byte_perm (tmp, 0, 0x0000); + buf0[2] |= __byte_perm (tmp, 0, 0x0000); + buf0[3] |= __byte_perm (tmp, 0, 0x0000); + buf1[0] |= __byte_perm (tmp, 0, 0x0000); + buf1[1] |= __byte_perm (tmp, 0, 0x5400); + break; + case 23: buf0[0] |= __byte_perm (tmp, 0, 0x0000); + buf0[1] |= __byte_perm (tmp, 0, 0x0000); + buf0[2] |= __byte_perm (tmp, 0, 0x0000); + buf0[3] |= __byte_perm (tmp, 0, 0x0000); + buf1[0] |= __byte_perm (tmp, 0, 0x0000); + buf1[1] |= __byte_perm (tmp, 0, 0x4000); + break; + case 24: buf0[0] |= __byte_perm (tmp, 0, 0x0000); + buf0[1] |= __byte_perm (tmp, 0, 0x0000); + buf0[2] |= __byte_perm (tmp, 0, 0x0000); + buf0[3] |= __byte_perm (tmp, 0, 0x0000); + buf1[0] |= __byte_perm (tmp, 0, 0x0000); + buf1[1] |= __byte_perm (tmp, 0, 0x0000); + break; + case 25: buf0[0] |= __byte_perm (tmp, 0, 0x0000); + buf0[1] |= __byte_perm (tmp, 0, 0x0000); + buf0[2] |= __byte_perm (tmp, 0, 0x0000); + buf0[3] |= __byte_perm (tmp, 0, 0x0000); + buf1[0] |= __byte_perm (tmp, 0, 0x0000); + buf1[1] |= __byte_perm (tmp, 0, 0x0000); + buf1[2] |= tmp; + break; + case 26: buf0[0] |= __byte_perm (tmp, 0, 0x0000); + buf0[1] |= __byte_perm (tmp, 0, 0x0000); + buf0[2] |= __byte_perm (tmp, 0, 0x0000); + buf0[3] |= __byte_perm (tmp, 0, 0x0000); + buf1[0] |= __byte_perm (tmp, 0, 0x0000); + buf1[1] |= __byte_perm (tmp, 0, 0x0000); + buf1[2] |= __byte_perm (tmp, 0, 0x5400); + break; + case 27: buf0[0] |= __byte_perm (tmp, 0, 0x0000); + buf0[1] |= __byte_perm (tmp, 0, 0x0000); + buf0[2] |= __byte_perm (tmp, 0, 0x0000); + buf0[3] |= __byte_perm (tmp, 0, 0x0000); + buf1[0] |= __byte_perm (tmp, 0, 0x0000); + buf1[1] |= __byte_perm (tmp, 0, 0x0000); + buf1[2] |= __byte_perm (tmp, 0, 0x4000); + break; + case 28: buf0[0] |= __byte_perm (tmp, 0, 0x0000); + buf0[1] |= __byte_perm (tmp, 0, 0x0000); + buf0[2] |= __byte_perm (tmp, 0, 0x0000); + buf0[3] |= __byte_perm (tmp, 0, 0x0000); + buf1[0] |= __byte_perm (tmp, 0, 0x0000); + buf1[1] |= __byte_perm (tmp, 0, 0x0000); + buf1[2] |= __byte_perm (tmp, 0, 0x0000); + break; + case 29: buf0[0] |= __byte_perm (tmp, 0, 0x0000); + buf0[1] |= __byte_perm (tmp, 0, 0x0000); + buf0[2] |= __byte_perm (tmp, 0, 0x0000); + buf0[3] |= __byte_perm (tmp, 0, 0x0000); + buf1[0] |= __byte_perm (tmp, 0, 0x0000); + buf1[1] |= __byte_perm (tmp, 0, 0x0000); + buf1[2] |= __byte_perm (tmp, 0, 0x0000); + buf1[3] |= tmp; + break; + case 30: buf0[0] |= __byte_perm (tmp, 0, 0x0000); + buf0[1] |= __byte_perm (tmp, 0, 0x0000); + buf0[2] |= __byte_perm (tmp, 0, 0x0000); + buf0[3] |= __byte_perm (tmp, 0, 0x0000); + buf1[0] |= __byte_perm (tmp, 0, 0x0000); + buf1[1] |= __byte_perm (tmp, 0, 0x0000); + buf1[2] |= __byte_perm (tmp, 0, 0x0000); + buf1[3] |= __byte_perm (tmp, 0, 0x5400); + break; + case 31: buf0[0] |= __byte_perm (tmp, 0, 0x0000); + buf0[1] |= __byte_perm (tmp, 0, 0x0000); + buf0[2] |= __byte_perm (tmp, 0, 0x0000); + buf0[3] |= __byte_perm (tmp, 0, 0x0000); + buf1[0] |= __byte_perm (tmp, 0, 0x0000); + buf1[1] |= __byte_perm (tmp, 0, 0x0000); + buf1[2] |= __byte_perm (tmp, 0, 0x0000); + buf1[3] |= __byte_perm (tmp, 0, 0x4000); + break; + } + + #else + + switch (p0) + { + case 1: buf0[0] |= tmp << 0; + break; + case 2: buf0[0] |= tmp << 0 | tmp << 8; + break; + case 3: buf0[0] |= tmp << 0 | tmp << 8 | tmp << 16; + break; + case 4: buf0[0] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24; + break; + case 5: buf0[0] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24; + buf0[1] |= tmp << 0; + break; + case 6: buf0[0] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24; + buf0[1] |= tmp << 0 | tmp << 8; + break; + case 7: buf0[0] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24; + buf0[1] |= tmp << 0 | tmp << 8 | tmp << 16; + break; + case 8: buf0[0] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24; + buf0[1] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24; + break; + case 9: buf0[0] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24; + buf0[1] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24; + buf0[2] |= tmp << 0; + break; + case 10: buf0[0] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24; + buf0[1] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24; + buf0[2] |= tmp << 0 | tmp << 8; + break; + case 11: buf0[0] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24; + buf0[1] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24; + buf0[2] |= tmp << 0 | tmp << 8 | tmp << 16; + break; + case 12: buf0[0] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24; + buf0[1] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24; + buf0[2] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24; + break; + case 13: buf0[0] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24; + buf0[1] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24; + buf0[2] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24; + buf0[3] |= tmp << 0; + break; + case 14: buf0[0] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24; + buf0[1] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24; + buf0[2] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24; + buf0[3] |= tmp << 0 | tmp << 8; + break; + case 15: buf0[0] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24; + buf0[1] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24; + buf0[2] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24; + buf0[3] |= tmp << 0 | tmp << 8 | tmp << 16; + break; + case 16: buf0[0] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24; + buf0[1] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24; + buf0[2] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24; + buf0[3] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24; + break; + case 17: buf0[0] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24; + buf0[1] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24; + buf0[2] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24; + buf0[3] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24; + buf1[0] |= tmp << 0; + break; + case 18: buf0[0] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24; + buf0[1] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24; + buf0[2] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24; + buf0[3] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24; + buf1[0] |= tmp << 0 | tmp << 8; + break; + case 19: buf0[0] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24; + buf0[1] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24; + buf0[2] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24; + buf0[3] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24; + buf1[0] |= tmp << 0 | tmp << 8 | tmp << 16; + break; + case 20: buf0[0] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24; + buf0[1] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24; + buf0[2] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24; + buf0[3] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24; + buf1[0] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24; + break; + case 21: buf0[0] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24; + buf0[1] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24; + buf0[2] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24; + buf0[3] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24; + buf1[0] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24; + buf1[1] |= tmp << 0; + break; + case 22: buf0[0] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24; + buf0[1] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24; + buf0[2] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24; + buf0[3] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24; + buf1[0] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24; + buf1[1] |= tmp << 0 | tmp << 8; + break; + case 23: buf0[0] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24; + buf0[1] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24; + buf0[2] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24; + buf0[3] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24; + buf1[0] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24; + buf1[1] |= tmp << 0 | tmp << 8 | tmp << 16; + break; + case 24: buf0[0] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24; + buf0[1] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24; + buf0[2] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24; + buf0[3] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24; + buf1[0] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24; + buf1[1] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24; + break; + case 25: buf0[0] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24; + buf0[1] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24; + buf0[2] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24; + buf0[3] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24; + buf1[0] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24; + buf1[1] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24; + buf1[2] |= tmp << 0; + break; + case 26: buf0[0] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24; + buf0[1] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24; + buf0[2] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24; + buf0[3] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24; + buf1[0] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24; + buf1[1] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24; + buf1[2] |= tmp << 0 | tmp << 8; + break; + case 27: buf0[0] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24; + buf0[1] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24; + buf0[2] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24; + buf0[3] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24; + buf1[0] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24; + buf1[1] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24; + buf1[2] |= tmp << 0 | tmp << 8 | tmp << 16; + break; + case 28: buf0[0] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24; + buf0[1] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24; + buf0[2] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24; + buf0[3] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24; + buf1[0] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24; + buf1[1] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24; + buf1[2] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24; + break; + case 29: buf0[0] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24; + buf0[1] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24; + buf0[2] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24; + buf0[3] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24; + buf1[0] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24; + buf1[1] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24; + buf1[2] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24; + buf1[3] |= tmp << 0; + break; + case 30: buf0[0] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24; + buf0[1] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24; + buf0[2] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24; + buf0[3] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24; + buf1[0] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24; + buf1[1] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24; + buf1[2] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24; + buf1[3] |= tmp << 0 | tmp << 8; + break; + case 31: buf0[0] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24; + buf0[1] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24; + buf0[2] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24; + buf0[3] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24; + buf1[0] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24; + buf1[1] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24; + buf1[2] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24; + buf1[3] |= tmp << 0 | tmp << 8 | tmp << 16; + break; + } + + #endif + + out_len += p0; + + return out_len; +} + +__device__ static u32 rule_op_mangle_dupechar_last (const u32 p0, const u32 p1, u32x buf0[4], u32x buf1[4], const u32 in_len) +{ + if ( in_len == 0) return (in_len); + if ((in_len + p0) >= 32) return (in_len); + + const u32 in_len1 = in_len - 1; + + const u32 sh = (in_len1 & 3) * 8; + + u32x tmp = 0; + + switch (in_len1 / 4) + { + case 0: tmp = (buf0[0] >> sh) & 0xff; break; + case 1: tmp = (buf0[1] >> sh) & 0xff; break; + case 2: tmp = (buf0[2] >> sh) & 0xff; break; + case 3: tmp = (buf0[3] >> sh) & 0xff; break; + case 4: tmp = (buf1[0] >> sh) & 0xff; break; + case 5: tmp = (buf1[1] >> sh) & 0xff; break; + case 6: tmp = (buf1[2] >> sh) & 0xff; break; + case 7: tmp = (buf1[3] >> sh) & 0xff; break; + } + + u32 out_len = in_len; + + for (u32 i = 0; i < p0; i++) + { + append_block1 (out_len, buf0, buf1, tmp); + + out_len++; + } + + return out_len; +} + +__device__ static u32 rule_op_mangle_dupechar_all (const u32 p0, const u32 p1, u32x buf0[4], u32x buf1[4], const u32 in_len) +{ + if ( in_len == 0) return (in_len); + if ((in_len + in_len) >= 32) return (in_len); + + u32 out_len = in_len; + + u32x tib40[4]; + u32x tib41[4]; + + #if __CUDA_ARCH__ >= 200 + + tib40[0] = __byte_perm (buf0[0], 0, 0x1100); + tib40[1] = __byte_perm (buf0[0], 0, 0x3322); + tib40[2] = __byte_perm (buf0[1], 0, 0x1100); + tib40[3] = __byte_perm (buf0[1], 0, 0x3322); + tib41[0] = __byte_perm (buf0[2], 0, 0x1100); + tib41[1] = __byte_perm (buf0[2], 0, 0x3322); + tib41[2] = __byte_perm (buf0[3], 0, 0x1100); + tib41[3] = __byte_perm (buf0[3], 0, 0x3322); + + buf0[0] = tib40[0]; + buf0[1] = tib40[1]; + buf0[2] = tib40[2]; + buf0[3] = tib40[3]; + buf1[0] = tib41[0]; + buf1[1] = tib41[1]; + buf1[2] = tib41[2]; + buf1[3] = tib41[3]; + + #else + + tib40[0] = ((buf0[0] & 0x000000FF) << 0) | ((buf0[0] & 0x0000FF00) << 8); + tib40[1] = ((buf0[0] & 0x00FF0000) >> 16) | ((buf0[0] & 0xFF000000) >> 8); + tib40[2] = ((buf0[1] & 0x000000FF) << 0) | ((buf0[1] & 0x0000FF00) << 8); + tib40[3] = ((buf0[1] & 0x00FF0000) >> 16) | ((buf0[1] & 0xFF000000) >> 8); + tib41[0] = ((buf0[2] & 0x000000FF) << 0) | ((buf0[2] & 0x0000FF00) << 8); + tib41[1] = ((buf0[2] & 0x00FF0000) >> 16) | ((buf0[2] & 0xFF000000) >> 8); + tib41[2] = ((buf0[3] & 0x000000FF) << 0) | ((buf0[3] & 0x0000FF00) << 8); + tib41[3] = ((buf0[3] & 0x00FF0000) >> 16) | ((buf0[3] & 0xFF000000) >> 8); + + buf0[0] = tib40[0] | (tib40[0] << 8); + buf0[1] = tib40[1] | (tib40[1] << 8); + buf0[2] = tib40[2] | (tib40[2] << 8); + buf0[3] = tib40[3] | (tib40[3] << 8); + buf1[0] = tib41[0] | (tib41[0] << 8); + buf1[1] = tib41[1] | (tib41[1] << 8); + buf1[2] = tib41[2] | (tib41[2] << 8); + buf1[3] = tib41[3] | (tib41[3] << 8); + + #endif + + out_len = out_len + out_len; + + return out_len; +} + +__device__ static u32 rule_op_mangle_switch_first (const u32 p0, const u32 p1, u32x buf0[4], u32x buf1[4], const u32 in_len) +{ + if (in_len < 2) return (in_len); + + #if __CUDA_ARCH__ >= 200 + + buf0[0] = __byte_perm (buf0[0], 0, 0x3201); + + #else + + buf0[0] = (buf0[0] & 0xFFFF0000) | ((buf0[0] << 8) & 0x0000FF00) | ((buf0[0] >> 8) & 0x000000FF); + + #endif + + return in_len; +} + +__device__ static u32 rule_op_mangle_switch_last (const u32 p0, const u32 p1, u32x buf0[4], u32x buf1[4], const u32 in_len) +{ + if (in_len < 2) return (in_len); + + #if __CUDA_ARCH__ >= 200 + + switch (in_len) + { + case 2: buf0[0] = __byte_perm (buf0[0], 0, 0x5401); + break; + case 3: buf0[0] = __byte_perm (buf0[0], 0, 0x4120); + break; + case 4: buf0[0] = __byte_perm (buf0[0], 0, 0x2310); + break; + case 5: buf0[1] = __byte_perm (buf0[1], buf0[0], 0x7210); + buf0[0] = __byte_perm (buf0[0], buf0[1], 0x4210); + buf0[1] = __byte_perm (buf0[1], 0, 0x6543); + break; + case 6: buf0[1] = __byte_perm (buf0[1], 0, 0x5401); + break; + case 7: buf0[1] = __byte_perm (buf0[1], 0, 0x4120); + break; + case 8: buf0[1] = __byte_perm (buf0[1], 0, 0x2310); + break; + case 9: buf0[2] = __byte_perm (buf0[2], buf0[1], 0x7210); + buf0[1] = __byte_perm (buf0[1], buf0[2], 0x4210); + buf0[2] = __byte_perm (buf0[2], 0, 0x6543); + break; + case 10: buf0[2] = __byte_perm (buf0[2], 0, 0x5401); + break; + case 11: buf0[2] = __byte_perm (buf0[2], 0, 0x4120); + break; + case 12: buf0[2] = __byte_perm (buf0[2], 0, 0x2310); + break; + case 13: buf0[3] = __byte_perm (buf0[3], buf0[2], 0x7210); + buf0[2] = __byte_perm (buf0[2], buf0[3], 0x4210); + buf0[3] = __byte_perm (buf0[3], 0, 0x6543); + break; + case 14: buf0[3] = __byte_perm (buf0[3], 0, 0x5401); + break; + case 15: buf0[3] = __byte_perm (buf0[3], 0, 0x4120); + break; + case 16: buf0[3] = __byte_perm (buf0[3], 0, 0x2310); + break; + case 17: buf1[0] = __byte_perm (buf1[0], buf0[3], 0x7210); + buf0[3] = __byte_perm (buf0[3], buf1[0], 0x4210); + buf1[0] = __byte_perm (buf1[0], 0, 0x6543); + break; + case 18: buf1[0] = __byte_perm (buf1[0], 0, 0x5401); + break; + case 19: buf1[0] = __byte_perm (buf1[0], 0, 0x4120); + break; + case 20: buf1[0] = __byte_perm (buf1[0], 0, 0x2310); + break; + case 21: buf1[1] = __byte_perm (buf1[1], buf1[0], 0x7210); + buf1[0] = __byte_perm (buf1[0], buf1[1], 0x4210); + buf1[1] = __byte_perm (buf1[1], 0, 0x6543); + break; + case 22: buf1[1] = __byte_perm (buf1[1], 0, 0x5401); + break; + case 23: buf1[1] = __byte_perm (buf1[1], 0, 0x4120); + break; + case 24: buf1[1] = __byte_perm (buf1[1], 0, 0x2310); + break; + case 25: buf1[2] = __byte_perm (buf1[2], buf1[1], 0x7210); + buf1[1] = __byte_perm (buf1[1], buf1[2], 0x4210); + buf1[2] = __byte_perm (buf1[2], 0, 0x6543); + break; + case 26: buf1[2] = __byte_perm (buf1[2], 0, 0x5401); + break; + case 27: buf1[2] = __byte_perm (buf1[2], 0, 0x4120); + break; + case 28: buf1[2] = __byte_perm (buf1[2], 0, 0x2310); + break; + case 29: buf1[3] = __byte_perm (buf1[3], buf1[2], 0x7210); + buf1[2] = __byte_perm (buf1[2], buf1[3], 0x4210); + buf1[3] = __byte_perm (buf1[3], 0, 0x6543); + break; + case 30: buf1[3] = __byte_perm (buf1[3], 0, 0x5401); + break; + case 31: buf1[3] = __byte_perm (buf1[3], 0, 0x4120); + break; + } + + #else + + switch (in_len) + { + case 2: buf0[0] = ((buf0[0] << 8) & 0x0000FF00) | ((buf0[0] >> 8) & 0x000000FF); + break; + case 3: buf0[0] = (buf0[0] & 0x000000FF) | ((buf0[0] << 8) & 0x00FF0000) | ((buf0[0] >> 8) & 0x0000FF00); + break; + case 4: buf0[0] = (buf0[0] & 0x0000FFFF) | ((buf0[0] << 8) & 0xFF000000) | ((buf0[0] >> 8) & 0x00FF0000); + break; + case 5: buf0[1] = (buf0[0] & 0xFF000000) | buf0[1]; + buf0[0] = (buf0[0] & 0x00FFFFFF) | (buf0[1] << 24); + buf0[1] = (buf0[1] >> 24); + break; + case 6: buf0[1] = ((buf0[1] << 8) & 0x0000FF00) | ((buf0[1] >> 8) & 0x000000FF); + break; + case 7: buf0[1] = (buf0[1] & 0x000000FF) | ((buf0[1] << 8) & 0x00FF0000) | ((buf0[1] >> 8) & 0x0000FF00); + break; + case 8: buf0[1] = (buf0[1] & 0x0000FFFF) | ((buf0[1] << 8) & 0xFF000000) | ((buf0[1] >> 8) & 0x00FF0000); + break; + case 9: buf0[2] = (buf0[1] & 0xFF000000) | buf0[2]; + buf0[1] = (buf0[1] & 0x00FFFFFF) | (buf0[2] << 24); + buf0[2] = (buf0[2] >> 24); + break; + case 10: buf0[2] = ((buf0[2] << 8) & 0x0000FF00) | ((buf0[2] >> 8) & 0x000000FF); + break; + case 11: buf0[2] = (buf0[2] & 0x000000FF) | ((buf0[2] << 8) & 0x00FF0000) | ((buf0[2] >> 8) & 0x0000FF00); + break; + case 12: buf0[2] = (buf0[2] & 0x0000FFFF) | ((buf0[2] << 8) & 0xFF000000) | ((buf0[2] >> 8) & 0x00FF0000); + break; + case 13: buf0[3] = (buf0[2] & 0xFF000000) | buf0[3]; + buf0[2] = (buf0[2] & 0x00FFFFFF) | (buf0[3] << 24); + buf0[3] = (buf0[3] >> 24); + break; + case 14: buf0[3] = ((buf0[3] << 8) & 0x0000FF00) | ((buf0[3] >> 8) & 0x000000FF); + break; + case 15: buf0[3] = (buf0[3] & 0x000000FF) | ((buf0[3] << 8) & 0x00FF0000) | ((buf0[3] >> 8) & 0x0000FF00); + break; + case 16: buf0[3] = (buf0[3] & 0x0000FFFF) | ((buf0[3] << 8) & 0xFF000000) | ((buf0[3] >> 8) & 0x00FF0000); + break; + case 17: buf1[0] = (buf0[3] & 0xFF000000) | buf1[0]; + buf0[3] = (buf0[3] & 0x00FFFFFF) | (buf1[0] << 24); + buf1[0] = (buf1[0] >> 24); + break; + case 18: buf1[0] = ((buf1[0] << 8) & 0x0000FF00) | ((buf1[0] >> 8) & 0x000000FF); + break; + case 19: buf1[0] = (buf1[0] & 0x000000FF) | ((buf1[0] << 8) & 0x00FF0000) | ((buf1[0] >> 8) & 0x0000FF00); + break; + case 20: buf1[0] = (buf1[0] & 0x0000FFFF) | ((buf1[0] << 8) & 0xFF000000) | ((buf1[0] >> 8) & 0x00FF0000); + break; + case 21: buf1[1] = (buf1[0] & 0xFF000000) | buf1[1]; + buf1[0] = (buf1[0] & 0x00FFFFFF) | (buf1[1] << 24); + buf1[1] = (buf1[1] >> 24); + break; + case 22: buf1[1] = ((buf1[1] << 8) & 0x0000FF00) | ((buf1[1] >> 8) & 0x000000FF); + break; + case 23: buf1[1] = (buf1[1] & 0x000000FF) | ((buf1[1] << 8) & 0x00FF0000) | ((buf1[1] >> 8) & 0x0000FF00); + break; + case 24: buf1[1] = (buf1[1] & 0x0000FFFF) | ((buf1[1] << 8) & 0xFF000000) | ((buf1[1] >> 8) & 0x00FF0000); + break; + case 25: buf1[2] = (buf1[1] & 0xFF000000) | buf1[2]; + buf1[1] = (buf1[1] & 0x00FFFFFF) | (buf1[2] << 24); + buf1[2] = (buf1[2] >> 24); + break; + case 26: buf1[2] = ((buf1[2] << 8) & 0x0000FF00) | ((buf1[2] >> 8) & 0x000000FF); + break; + case 27: buf1[2] = (buf1[2] & 0x000000FF) | ((buf1[2] << 8) & 0x00FF0000) | ((buf1[2] >> 8) & 0x0000FF00); + break; + case 28: buf1[2] = (buf1[2] & 0x0000FFFF) | ((buf1[2] << 8) & 0xFF000000) | ((buf1[2] >> 8) & 0x00FF0000); + break; + case 29: buf1[3] = (buf1[2] & 0xFF000000) | buf1[3]; + buf1[2] = (buf1[2] & 0x00FFFFFF) | (buf1[3] << 24); + buf1[3] = (buf1[3] >> 24); + break; + case 30: buf1[3] = ((buf1[3] << 8) & 0x0000FF00) | ((buf1[3] >> 8) & 0x000000FF); + break; + case 31: buf1[3] = (buf1[3] & 0x000000FF) | ((buf1[3] << 8) & 0x00FF0000) | ((buf1[3] >> 8) & 0x0000FF00); + break; + } + + #endif + + return in_len; +} + +__device__ static u32 rule_op_mangle_switch_at (const u32 p0, const u32 p1, u32x buf0[4], u32x buf1[4], const u32 in_len) +{ + if (p0 >= in_len) return (in_len); + if (p1 >= in_len) return (in_len); + + u32x tmp0 = 0; + u32x tmp1 = 0; + + #if __CUDA_ARCH__ >= 200 + + switch (p0) + { + case 0: tmp0 = __byte_perm (buf0[0], 0, 0x6540); + break; + case 1: tmp0 = __byte_perm (buf0[0], 0, 0x6541); + break; + case 2: tmp0 = __byte_perm (buf0[0], 0, 0x6542); + break; + case 3: tmp0 = __byte_perm (buf0[0], 0, 0x6543); + break; + case 4: tmp0 = __byte_perm (buf0[1], 0, 0x6540); + break; + case 5: tmp0 = __byte_perm (buf0[1], 0, 0x6541); + break; + case 6: tmp0 = __byte_perm (buf0[1], 0, 0x6542); + break; + case 7: tmp0 = __byte_perm (buf0[1], 0, 0x6543); + break; + case 8: tmp0 = __byte_perm (buf0[2], 0, 0x6540); + break; + case 9: tmp0 = __byte_perm (buf0[2], 0, 0x6541); + break; + case 10: tmp0 = __byte_perm (buf0[2], 0, 0x6542); + break; + case 11: tmp0 = __byte_perm (buf0[2], 0, 0x6543); + break; + case 12: tmp0 = __byte_perm (buf0[3], 0, 0x6540); + break; + case 13: tmp0 = __byte_perm (buf0[3], 0, 0x6541); + break; + case 14: tmp0 = __byte_perm (buf0[3], 0, 0x6542); + break; + case 15: tmp0 = __byte_perm (buf0[3], 0, 0x6543); + break; + case 16: tmp0 = __byte_perm (buf1[0], 0, 0x6540); + break; + case 17: tmp0 = __byte_perm (buf1[0], 0, 0x6541); + break; + case 18: tmp0 = __byte_perm (buf1[0], 0, 0x6542); + break; + case 19: tmp0 = __byte_perm (buf1[0], 0, 0x6543); + break; + case 20: tmp0 = __byte_perm (buf1[1], 0, 0x6540); + break; + case 21: tmp0 = __byte_perm (buf1[1], 0, 0x6541); + break; + case 22: tmp0 = __byte_perm (buf1[1], 0, 0x6542); + break; + case 23: tmp0 = __byte_perm (buf1[1], 0, 0x6543); + break; + case 24: tmp0 = __byte_perm (buf1[2], 0, 0x6540); + break; + case 25: tmp0 = __byte_perm (buf1[2], 0, 0x6541); + break; + case 26: tmp0 = __byte_perm (buf1[2], 0, 0x6542); + break; + case 27: tmp0 = __byte_perm (buf1[2], 0, 0x6543); + break; + case 28: tmp0 = __byte_perm (buf1[3], 0, 0x6540); + break; + case 29: tmp0 = __byte_perm (buf1[3], 0, 0x6541); + break; + case 30: tmp0 = __byte_perm (buf1[3], 0, 0x6542); + break; + case 31: tmp0 = __byte_perm (buf1[3], 0, 0x6543); + break; + } + + switch (p1) + { + case 0: tmp1 = __byte_perm (buf0[0], 0, 0x6540); + buf0[0] = __byte_perm (tmp0, buf0[0], 0x7650); + break; + case 1: tmp1 = __byte_perm (buf0[0], 0, 0x6541); + buf0[0] = __byte_perm (tmp0, buf0[0], 0x7604); + break; + case 2: tmp1 = __byte_perm (buf0[0], 0, 0x6542); + buf0[0] = __byte_perm (tmp0, buf0[0], 0x7054); + break; + case 3: tmp1 = __byte_perm (buf0[0], 0, 0x6543); + buf0[0] = __byte_perm (tmp0, buf0[0], 0x0654); + break; + case 4: tmp1 = __byte_perm (buf0[1], 0, 0x6540); + buf0[1] = __byte_perm (tmp0, buf0[1], 0x7650); + break; + case 5: tmp1 = __byte_perm (buf0[1], 0, 0x6541); + buf0[1] = __byte_perm (tmp0, buf0[1], 0x7604); + break; + case 6: tmp1 = __byte_perm (buf0[1], 0, 0x6542); + buf0[1] = __byte_perm (tmp0, buf0[1], 0x7054); + break; + case 7: tmp1 = __byte_perm (buf0[1], 0, 0x6543); + buf0[1] = __byte_perm (tmp0, buf0[1], 0x0654); + break; + case 8: tmp1 = __byte_perm (buf0[2], 0, 0x6540); + buf0[2] = __byte_perm (tmp0, buf0[2], 0x7650); + break; + case 9: tmp1 = __byte_perm (buf0[2], 0, 0x6541); + buf0[2] = __byte_perm (tmp0, buf0[2], 0x7604); + break; + case 10: tmp1 = __byte_perm (buf0[2], 0, 0x6542); + buf0[2] = __byte_perm (tmp0, buf0[2], 0x7054); + break; + case 11: tmp1 = __byte_perm (buf0[2], 0, 0x6543); + buf0[2] = __byte_perm (tmp0, buf0[2], 0x0654); + break; + case 12: tmp1 = __byte_perm (buf0[3], 0, 0x6540); + buf0[3] = __byte_perm (tmp0, buf0[3], 0x7650); + break; + case 13: tmp1 = __byte_perm (buf0[3], 0, 0x6541); + buf0[3] = __byte_perm (tmp0, buf0[3], 0x7604); + break; + case 14: tmp1 = __byte_perm (buf0[3], 0, 0x6542); + buf0[3] = __byte_perm (tmp0, buf0[3], 0x7054); + break; + case 15: tmp1 = __byte_perm (buf0[3], 0, 0x6543); + buf0[3] = __byte_perm (tmp0, buf0[3], 0x0654); + break; + case 16: tmp1 = __byte_perm (buf1[0], 0, 0x6540); + buf1[0] = __byte_perm (tmp0, buf1[0], 0x7650); + break; + case 17: tmp1 = __byte_perm (buf1[0], 0, 0x6541); + buf1[0] = __byte_perm (tmp0, buf1[0], 0x7604); + break; + case 18: tmp1 = __byte_perm (buf1[0], 0, 0x6542); + buf1[0] = __byte_perm (tmp0, buf1[0], 0x7054); + break; + case 19: tmp1 = __byte_perm (buf1[0], 0, 0x6543); + buf1[0] = __byte_perm (tmp0, buf1[0], 0x0654); + break; + case 20: tmp1 = __byte_perm (buf1[1], 0, 0x6540); + buf1[1] = __byte_perm (tmp0, buf1[1], 0x7650); + break; + case 21: tmp1 = __byte_perm (buf1[1], 0, 0x6541); + buf1[1] = __byte_perm (tmp0, buf1[1], 0x7604); + break; + case 22: tmp1 = __byte_perm (buf1[1], 0, 0x6542); + buf1[1] = __byte_perm (tmp0, buf1[1], 0x7054); + break; + case 23: tmp1 = __byte_perm (buf1[1], 0, 0x6543); + buf1[1] = __byte_perm (tmp0, buf1[1], 0x0654); + break; + case 24: tmp1 = __byte_perm (buf1[2], 0, 0x6540); + buf1[2] = __byte_perm (tmp0, buf1[2], 0x7650); + break; + case 25: tmp1 = __byte_perm (buf1[2], 0, 0x6541); + buf1[2] = __byte_perm (tmp0, buf1[2], 0x7604); + break; + case 26: tmp1 = __byte_perm (buf1[2], 0, 0x6542); + buf1[2] = __byte_perm (tmp0, buf1[2], 0x7054); + break; + case 27: tmp1 = __byte_perm (buf1[2], 0, 0x6543); + buf1[2] = __byte_perm (tmp0, buf1[2], 0x0654); + break; + case 28: tmp1 = __byte_perm (buf1[3], 0, 0x6540); + buf1[3] = __byte_perm (tmp0, buf1[3], 0x7650); + break; + case 29: tmp1 = __byte_perm (buf1[3], 0, 0x6541); + buf1[3] = __byte_perm (tmp0, buf1[3], 0x7604); + break; + case 30: tmp1 = __byte_perm (buf1[3], 0, 0x6542); + buf1[3] = __byte_perm (tmp0, buf1[3], 0x7054); + break; + case 31: tmp1 = __byte_perm (buf1[3], 0, 0x6543); + buf1[3] = __byte_perm (tmp0, buf1[3], 0x0654); + break; + } + + switch (p0) + { + case 0: buf0[0] = __byte_perm (tmp1, buf0[0], 0x7650); + break; + case 1: buf0[0] = __byte_perm (tmp1, buf0[0], 0x7604); + break; + case 2: buf0[0] = __byte_perm (tmp1, buf0[0], 0x7054); + break; + case 3: buf0[0] = __byte_perm (tmp1, buf0[0], 0x0654); + break; + case 4: buf0[1] = __byte_perm (tmp1, buf0[1], 0x7650); + break; + case 5: buf0[1] = __byte_perm (tmp1, buf0[1], 0x7604); + break; + case 6: buf0[1] = __byte_perm (tmp1, buf0[1], 0x7054); + break; + case 7: buf0[1] = __byte_perm (tmp1, buf0[1], 0x0654); + break; + case 8: buf0[2] = __byte_perm (tmp1, buf0[2], 0x7650); + break; + case 9: buf0[2] = __byte_perm (tmp1, buf0[2], 0x7604); + break; + case 10: buf0[2] = __byte_perm (tmp1, buf0[2], 0x7054); + break; + case 11: buf0[2] = __byte_perm (tmp1, buf0[2], 0x0654); + break; + case 12: buf0[3] = __byte_perm (tmp1, buf0[3], 0x7650); + break; + case 13: buf0[3] = __byte_perm (tmp1, buf0[3], 0x7604); + break; + case 14: buf0[3] = __byte_perm (tmp1, buf0[3], 0x7054); + break; + case 15: buf0[3] = __byte_perm (tmp1, buf0[3], 0x0654); + break; + case 16: buf1[0] = __byte_perm (tmp1, buf1[0], 0x7650); + break; + case 17: buf1[0] = __byte_perm (tmp1, buf1[0], 0x7604); + break; + case 18: buf1[0] = __byte_perm (tmp1, buf1[0], 0x7054); + break; + case 19: buf1[0] = __byte_perm (tmp1, buf1[0], 0x0654); + break; + case 20: buf1[1] = __byte_perm (tmp1, buf1[1], 0x7650); + break; + case 21: buf1[1] = __byte_perm (tmp1, buf1[1], 0x7604); + break; + case 22: buf1[1] = __byte_perm (tmp1, buf1[1], 0x7054); + break; + case 23: buf1[1] = __byte_perm (tmp1, buf1[1], 0x0654); + break; + case 24: buf1[2] = __byte_perm (tmp1, buf1[2], 0x7650); + break; + case 25: buf1[2] = __byte_perm (tmp1, buf1[2], 0x7604); + break; + case 26: buf1[2] = __byte_perm (tmp1, buf1[2], 0x7054); + break; + case 27: buf1[2] = __byte_perm (tmp1, buf1[2], 0x0654); + break; + case 28: buf1[3] = __byte_perm (tmp1, buf1[3], 0x7650); + break; + case 29: buf1[3] = __byte_perm (tmp1, buf1[3], 0x7604); + break; + case 30: buf1[3] = __byte_perm (tmp1, buf1[3], 0x7054); + break; + case 31: buf1[3] = __byte_perm (tmp1, buf1[3], 0x0654); + break; + } + + #else + + switch (p0) + { + case 0: tmp0 = (buf0[0] >> 0) & 0xFF; + break; + case 1: tmp0 = (buf0[0] >> 8) & 0xFF; + break; + case 2: tmp0 = (buf0[0] >> 16) & 0xFF; + break; + case 3: tmp0 = (buf0[0] >> 24) & 0xFF; + break; + case 4: tmp0 = (buf0[1] >> 0) & 0xFF; + break; + case 5: tmp0 = (buf0[1] >> 8) & 0xFF; + break; + case 6: tmp0 = (buf0[1] >> 16) & 0xFF; + break; + case 7: tmp0 = (buf0[1] >> 24) & 0xFF; + break; + case 8: tmp0 = (buf0[2] >> 0) & 0xFF; + break; + case 9: tmp0 = (buf0[2] >> 8) & 0xFF; + break; + case 10: tmp0 = (buf0[2] >> 16) & 0xFF; + break; + case 11: tmp0 = (buf0[2] >> 24) & 0xFF; + break; + case 12: tmp0 = (buf0[3] >> 0) & 0xFF; + break; + case 13: tmp0 = (buf0[3] >> 8) & 0xFF; + break; + case 14: tmp0 = (buf0[3] >> 16) & 0xFF; + break; + case 15: tmp0 = (buf0[3] >> 24) & 0xFF; + break; + case 16: tmp0 = (buf1[0] >> 0) & 0xFF; + break; + case 17: tmp0 = (buf1[0] >> 8) & 0xFF; + break; + case 18: tmp0 = (buf1[0] >> 16) & 0xFF; + break; + case 19: tmp0 = (buf1[0] >> 24) & 0xFF; + break; + case 20: tmp0 = (buf1[1] >> 0) & 0xFF; + break; + case 21: tmp0 = (buf1[1] >> 8) & 0xFF; + break; + case 22: tmp0 = (buf1[1] >> 16) & 0xFF; + break; + case 23: tmp0 = (buf1[1] >> 24) & 0xFF; + break; + case 24: tmp0 = (buf1[2] >> 0) & 0xFF; + break; + case 25: tmp0 = (buf1[2] >> 8) & 0xFF; + break; + case 26: tmp0 = (buf1[2] >> 16) & 0xFF; + break; + case 27: tmp0 = (buf1[2] >> 24) & 0xFF; + break; + case 28: tmp0 = (buf1[3] >> 0) & 0xFF; + break; + case 29: tmp0 = (buf1[3] >> 8) & 0xFF; + break; + case 30: tmp0 = (buf1[3] >> 16) & 0xFF; + break; + case 31: tmp0 = (buf1[3] >> 24) & 0xFF; + break; + } + + switch (p1) + { + case 0: tmp1 = (buf0[0] >> 0) & 0xff; + buf0[0] = (buf0[0] & 0xffffff00) | tmp0 << 0; + break; + case 1: tmp1 = (buf0[0] >> 8) & 0xff; + buf0[0] = (buf0[0] & 0xffff00ff) | tmp0 << 8; + break; + case 2: tmp1 = (buf0[0] >> 16) & 0xff; + buf0[0] = (buf0[0] & 0xff00ffff) | tmp0 << 16; + break; + case 3: tmp1 = (buf0[0] >> 24) & 0xff; + buf0[0] = (buf0[0] & 0x00ffffff) | tmp0 << 24; + break; + case 4: tmp1 = (buf0[1] >> 0) & 0xff; + buf0[1] = (buf0[1] & 0xffffff00) | tmp0 << 0; + break; + case 5: tmp1 = (buf0[1] >> 8) & 0xff; + buf0[1] = (buf0[1] & 0xffff00ff) | tmp0 << 8; + break; + case 6: tmp1 = (buf0[1] >> 16) & 0xff; + buf0[1] = (buf0[1] & 0xff00ffff) | tmp0 << 16; + break; + case 7: tmp1 = (buf0[1] >> 24) & 0xff; + buf0[1] = (buf0[1] & 0x00ffffff) | tmp0 << 24; + break; + case 8: tmp1 = (buf0[2] >> 0) & 0xff; + buf0[2] = (buf0[2] & 0xffffff00) | tmp0 << 0; + break; + case 9: tmp1 = (buf0[2] >> 8) & 0xff; + buf0[2] = (buf0[2] & 0xffff00ff) | tmp0 << 8; + break; + case 10: tmp1 = (buf0[2] >> 16) & 0xff; + buf0[2] = (buf0[2] & 0xff00ffff) | tmp0 << 16; + break; + case 11: tmp1 = (buf0[2] >> 24) & 0xff; + buf0[2] = (buf0[2] & 0x00ffffff) | tmp0 << 24; + break; + case 12: tmp1 = (buf0[3] >> 0) & 0xff; + buf0[3] = (buf0[3] & 0xffffff00) | tmp0 << 0; + break; + case 13: tmp1 = (buf0[3] >> 8) & 0xff; + buf0[3] = (buf0[3] & 0xffff00ff) | tmp0 << 8; + break; + case 14: tmp1 = (buf0[3] >> 16) & 0xff; + buf0[3] = (buf0[3] & 0xff00ffff) | tmp0 << 16; + break; + case 15: tmp1 = (buf0[3] >> 24) & 0xff; + buf0[3] = (buf0[3] & 0x00ffffff) | tmp0 << 24; + break; + case 16: tmp1 = (buf1[0] >> 0) & 0xff; + buf1[0] = (buf1[0] & 0xffffff00) | tmp0 << 0; + break; + case 17: tmp1 = (buf1[0] >> 8) & 0xff; + buf1[0] = (buf1[0] & 0xffff00ff) | tmp0 << 8; + break; + case 18: tmp1 = (buf1[0] >> 16) & 0xff; + buf1[0] = (buf1[0] & 0xff00ffff) | tmp0 << 16; + break; + case 19: tmp1 = (buf1[0] >> 24) & 0xff; + buf1[0] = (buf1[0] & 0x00ffffff) | tmp0 << 24; + break; + case 20: tmp1 = (buf1[1] >> 0) & 0xff; + buf1[1] = (buf1[1] & 0xffffff00) | tmp0 << 0; + break; + case 21: tmp1 = (buf1[1] >> 8) & 0xff; + buf1[1] = (buf1[1] & 0xffff00ff) | tmp0 << 8; + break; + case 22: tmp1 = (buf1[1] >> 16) & 0xff; + buf1[1] = (buf1[1] & 0xff00ffff) | tmp0 << 16; + break; + case 23: tmp1 = (buf1[1] >> 24) & 0xff; + buf1[1] = (buf1[1] & 0x00ffffff) | tmp0 << 24; + break; + case 24: tmp1 = (buf1[2] >> 0) & 0xff; + buf1[2] = (buf1[2] & 0xffffff00) | tmp0 << 0; + break; + case 25: tmp1 = (buf1[2] >> 8) & 0xff; + buf1[2] = (buf1[2] & 0xffff00ff) | tmp0 << 8; + break; + case 26: tmp1 = (buf1[2] >> 16) & 0xff; + buf1[2] = (buf1[2] & 0xff00ffff) | tmp0 << 16; + break; + case 27: tmp1 = (buf1[2] >> 24) & 0xff; + buf1[2] = (buf1[2] & 0x00ffffff) | tmp0 << 24; + break; + case 28: tmp1 = (buf1[3] >> 0) & 0xff; + buf1[3] = (buf1[3] & 0xffffff00) | tmp0 << 0; + break; + case 29: tmp1 = (buf1[3] >> 8) & 0xff; + buf1[3] = (buf1[3] & 0xffff00ff) | tmp0 << 8; + break; + case 30: tmp1 = (buf1[3] >> 16) & 0xff; + buf1[3] = (buf1[3] & 0xff00ffff) | tmp0 << 16; + break; + case 31: tmp1 = (buf1[3] >> 24) & 0xff; + buf1[3] = (buf1[3] & 0x00ffffff) | tmp0 << 24; + break; + } + + switch (p0) + { + case 0: buf0[0] = (buf0[0] & 0xffffff00) | tmp1 << 0; + break; + case 1: buf0[0] = (buf0[0] & 0xffff00ff) | tmp1 << 8; + break; + case 2: buf0[0] = (buf0[0] & 0xff00ffff) | tmp1 << 16; + break; + case 3: buf0[0] = (buf0[0] & 0x00ffffff) | tmp1 << 24; + break; + case 4: buf0[1] = (buf0[1] & 0xffffff00) | tmp1 << 0; + break; + case 5: buf0[1] = (buf0[1] & 0xffff00ff) | tmp1 << 8; + break; + case 6: buf0[1] = (buf0[1] & 0xff00ffff) | tmp1 << 16; + break; + case 7: buf0[1] = (buf0[1] & 0x00ffffff) | tmp1 << 24; + break; + case 8: buf0[2] = (buf0[2] & 0xffffff00) | tmp1 << 0; + break; + case 9: buf0[2] = (buf0[2] & 0xffff00ff) | tmp1 << 8; + break; + case 10: buf0[2] = (buf0[2] & 0xff00ffff) | tmp1 << 16; + break; + case 11: buf0[2] = (buf0[2] & 0x00ffffff) | tmp1 << 24; + break; + case 12: buf0[3] = (buf0[3] & 0xffffff00) | tmp1 << 0; + break; + case 13: buf0[3] = (buf0[3] & 0xffff00ff) | tmp1 << 8; + break; + case 14: buf0[3] = (buf0[3] & 0xff00ffff) | tmp1 << 16; + break; + case 15: buf0[3] = (buf0[3] & 0x00ffffff) | tmp1 << 24; + break; + case 16: buf1[0] = (buf1[0] & 0xffffff00) | tmp1 << 0; + break; + case 17: buf1[0] = (buf1[0] & 0xffff00ff) | tmp1 << 8; + break; + case 18: buf1[0] = (buf1[0] & 0xff00ffff) | tmp1 << 16; + break; + case 19: buf1[0] = (buf1[0] & 0x00ffffff) | tmp1 << 24; + break; + case 20: buf1[1] = (buf1[1] & 0xffffff00) | tmp1 << 0; + break; + case 21: buf1[1] = (buf1[1] & 0xffff00ff) | tmp1 << 8; + break; + case 22: buf1[1] = (buf1[1] & 0xff00ffff) | tmp1 << 16; + break; + case 23: buf1[1] = (buf1[1] & 0x00ffffff) | tmp1 << 24; + break; + case 24: buf1[2] = (buf1[2] & 0xffffff00) | tmp1 << 0; + break; + case 25: buf1[2] = (buf1[2] & 0xffff00ff) | tmp1 << 8; + break; + case 26: buf1[2] = (buf1[2] & 0xff00ffff) | tmp1 << 16; + break; + case 27: buf1[2] = (buf1[2] & 0x00ffffff) | tmp1 << 24; + break; + case 28: buf1[3] = (buf1[3] & 0xffffff00) | tmp1 << 0; + break; + case 29: buf1[3] = (buf1[3] & 0xffff00ff) | tmp1 << 8; + break; + case 30: buf1[3] = (buf1[3] & 0xff00ffff) | tmp1 << 16; + break; + case 31: buf1[3] = (buf1[3] & 0x00ffffff) | tmp1 << 24; + break; + } + + #endif + + return in_len; +} + +__device__ static u32 rule_op_mangle_chr_shiftl (const u32 p0, const u32 p1, u32x buf0[4], u32x buf1[4], const u32 in_len) +{ + if (p0 >= in_len) return (in_len); + + const u32 mr = 0xff << ((p0 & 3) * 8); + const u32 ml = ~mr; + + switch (p0 / 4) + { + case 0: buf0[0] = (buf0[0] & ml) | (((buf0[0] & mr) << 1) & mr); break; + case 1: buf0[1] = (buf0[1] & ml) | (((buf0[1] & mr) << 1) & mr); break; + case 2: buf0[2] = (buf0[2] & ml) | (((buf0[2] & mr) << 1) & mr); break; + case 3: buf0[3] = (buf0[3] & ml) | (((buf0[3] & mr) << 1) & mr); break; + case 4: buf1[0] = (buf1[0] & ml) | (((buf1[0] & mr) << 1) & mr); break; + case 5: buf1[1] = (buf1[1] & ml) | (((buf1[1] & mr) << 1) & mr); break; + case 6: buf1[2] = (buf1[2] & ml) | (((buf1[2] & mr) << 1) & mr); break; + case 7: buf1[3] = (buf1[3] & ml) | (((buf1[3] & mr) << 1) & mr); break; + } + + return in_len; +} + +__device__ static u32 rule_op_mangle_chr_shiftr (const u32 p0, const u32 p1, u32x buf0[4], u32x buf1[4], const u32 in_len) +{ + if (p0 >= in_len) return (in_len); + + const u32 mr = 0xff << ((p0 & 3) * 8); + const u32 ml = ~mr; + + switch (p0 / 4) + { + case 0: buf0[0] = (buf0[0] & ml) | (((buf0[0] & mr) >> 1) & mr); break; + case 1: buf0[1] = (buf0[1] & ml) | (((buf0[1] & mr) >> 1) & mr); break; + case 2: buf0[2] = (buf0[2] & ml) | (((buf0[2] & mr) >> 1) & mr); break; + case 3: buf0[3] = (buf0[3] & ml) | (((buf0[3] & mr) >> 1) & mr); break; + case 4: buf1[0] = (buf1[0] & ml) | (((buf1[0] & mr) >> 1) & mr); break; + case 5: buf1[1] = (buf1[1] & ml) | (((buf1[1] & mr) >> 1) & mr); break; + case 6: buf1[2] = (buf1[2] & ml) | (((buf1[2] & mr) >> 1) & mr); break; + case 7: buf1[3] = (buf1[3] & ml) | (((buf1[3] & mr) >> 1) & mr); break; + } + + return in_len; +} + +__device__ static u32 rule_op_mangle_chr_incr (const u32 p0, const u32 p1, u32x buf0[4], u32x buf1[4], const u32 in_len) +{ + if (p0 >= in_len) return (in_len); + + const u32 mr = 0xff << ((p0 & 3) * 8); + const u32 ml = ~mr; + + const u32 n = 0x01010101 & mr; + + switch (p0 / 4) + { + case 0: buf0[0] = (buf0[0] & ml) | (((buf0[0] & mr) + n) & mr); break; + case 1: buf0[1] = (buf0[1] & ml) | (((buf0[1] & mr) + n) & mr); break; + case 2: buf0[2] = (buf0[2] & ml) | (((buf0[2] & mr) + n) & mr); break; + case 3: buf0[3] = (buf0[3] & ml) | (((buf0[3] & mr) + n) & mr); break; + case 4: buf1[0] = (buf1[0] & ml) | (((buf1[0] & mr) + n) & mr); break; + case 5: buf1[1] = (buf1[1] & ml) | (((buf1[1] & mr) + n) & mr); break; + case 6: buf1[2] = (buf1[2] & ml) | (((buf1[2] & mr) + n) & mr); break; + case 7: buf1[3] = (buf1[3] & ml) | (((buf1[3] & mr) + n) & mr); break; + } + + return in_len; +} + +__device__ static u32 rule_op_mangle_chr_decr (const u32 p0, const u32 p1, u32x buf0[4], u32x buf1[4], const u32 in_len) +{ + if (p0 >= in_len) return (in_len); + + const u32 mr = 0xff << ((p0 & 3) * 8); + const u32 ml = ~mr; + + const u32 n = 0x01010101 & mr; + + switch (p0 / 4) + { + case 0: buf0[0] = (buf0[0] & ml) | (((buf0[0] & mr) - n) & mr); break; + case 1: buf0[1] = (buf0[1] & ml) | (((buf0[1] & mr) - n) & mr); break; + case 2: buf0[2] = (buf0[2] & ml) | (((buf0[2] & mr) - n) & mr); break; + case 3: buf0[3] = (buf0[3] & ml) | (((buf0[3] & mr) - n) & mr); break; + case 4: buf1[0] = (buf1[0] & ml) | (((buf1[0] & mr) - n) & mr); break; + case 5: buf1[1] = (buf1[1] & ml) | (((buf1[1] & mr) - n) & mr); break; + case 6: buf1[2] = (buf1[2] & ml) | (((buf1[2] & mr) - n) & mr); break; + case 7: buf1[3] = (buf1[3] & ml) | (((buf1[3] & mr) - n) & mr); break; + } + + return in_len; +} + +__device__ static u32 rule_op_mangle_replace_np1 (const u32 p0, const u32 p1, u32x buf0[4], u32x buf1[4], const u32 in_len) +{ + if ((p0 + 1) >= in_len) return (in_len); + + u32x tib40[4]; + u32x tib41[4]; + + lshift_block (buf0, buf1, tib40, tib41); + + const u32 mr = 0xff << ((p0 & 3) * 8); + const u32 ml = ~mr; + + switch (p0 / 4) + { + case 0: buf0[0] = (buf0[0] & ml) | (tib40[0] & mr); break; + case 1: buf0[1] = (buf0[1] & ml) | (tib40[1] & mr); break; + case 2: buf0[2] = (buf0[2] & ml) | (tib40[2] & mr); break; + case 3: buf0[3] = (buf0[3] & ml) | (tib40[3] & mr); break; + case 4: buf1[0] = (buf1[0] & ml) | (tib41[0] & mr); break; + case 5: buf1[1] = (buf1[1] & ml) | (tib41[1] & mr); break; + case 6: buf1[2] = (buf1[2] & ml) | (tib41[2] & mr); break; + case 7: buf1[3] = (buf1[3] & ml) | (tib41[3] & mr); break; + } + + return in_len; +} + +__device__ static u32 rule_op_mangle_replace_nm1 (const u32 p0, const u32 p1, u32x buf0[4], u32x buf1[4], const u32 in_len) +{ + if (p0 == 0) return (in_len); + + if (p0 >= in_len) return (in_len); + + u32x tib40[4]; + u32x tib41[4]; + + rshift_block (buf0, buf1, tib40, tib41); + + const u32 mr = 0xff << ((p0 & 3) * 8); + const u32 ml = ~mr; + + switch (p0 / 4) + { + case 0: buf0[0] = (buf0[0] & ml) | (tib40[0] & mr); break; + case 1: buf0[1] = (buf0[1] & ml) | (tib40[1] & mr); break; + case 2: buf0[2] = (buf0[2] & ml) | (tib40[2] & mr); break; + case 3: buf0[3] = (buf0[3] & ml) | (tib40[3] & mr); break; + case 4: buf1[0] = (buf1[0] & ml) | (tib41[0] & mr); break; + case 5: buf1[1] = (buf1[1] & ml) | (tib41[1] & mr); break; + case 6: buf1[2] = (buf1[2] & ml) | (tib41[2] & mr); break; + case 7: buf1[3] = (buf1[3] & ml) | (tib41[3] & mr); break; + } + + return in_len; +} + +__device__ static u32 rule_op_mangle_dupeblock_first (const u32 p0, const u32 p1, u32x buf0[4], u32x buf1[4], const u32 in_len) +{ + if (p0 > in_len) return (in_len); + + if ((in_len + p0) >= 32) return (in_len); + + u32 out_len = in_len; + + u32x tib40[4]; + u32x tib41[4]; + + tib40[0] = buf0[0]; + tib40[1] = buf0[1]; + tib40[2] = buf0[2]; + tib40[3] = buf0[3]; + tib41[0] = buf1[0]; + tib41[1] = buf1[1]; + tib41[2] = buf1[2]; + tib41[3] = buf1[3]; + + truncate_right (tib40, tib41, p0); + + rshift_block_N (buf0, buf1, buf0, buf1, p0); + + buf0[0] |= tib40[0]; + buf0[1] |= tib40[1]; + buf0[2] |= tib40[2]; + buf0[3] |= tib40[3]; + buf1[0] |= tib41[0]; + buf1[1] |= tib41[1]; + buf1[2] |= tib41[2]; + buf1[3] |= tib41[3]; + + out_len += p0; + + return out_len; +} + +__device__ static u32 rule_op_mangle_dupeblock_last (const u32 p0, const u32 p1, u32x buf0[4], u32x buf1[4], const u32 in_len) +{ + if (p0 > in_len) return (in_len); + + if ((in_len + p0) >= 32) return (in_len); + + u32 out_len = in_len; + + u32x tib40[4]; + u32x tib41[4]; + + rshift_block_N (buf0, buf1, tib40, tib41, p0); + + truncate_left (tib40, tib41, out_len); + + buf0[0] |= tib40[0]; + buf0[1] |= tib40[1]; + buf0[2] |= tib40[2]; + buf0[3] |= tib40[3]; + buf1[0] |= tib41[0]; + buf1[1] |= tib41[1]; + buf1[2] |= tib41[2]; + buf1[3] |= tib41[3]; + + out_len += p0; + + return out_len; +} + +__device__ static u32 rule_op_mangle_title (const u32 p0, const u32 p1, u32x buf0[4], u32x buf1[4], const u32 in_len) +{ + buf0[0] |= (generate_cmask (buf0[0])); + buf0[1] |= (generate_cmask (buf0[1])); + buf0[2] |= (generate_cmask (buf0[2])); + buf0[3] |= (generate_cmask (buf0[3])); + buf1[0] |= (generate_cmask (buf1[0])); + buf1[1] |= (generate_cmask (buf1[1])); + buf1[2] |= (generate_cmask (buf1[2])); + buf1[3] |= (generate_cmask (buf1[3])); + + buf0[0] &= ~(0x00000020 & generate_cmask (buf0[0])); + + + + for (u32 i = 0; i < in_len; i++) + { + u32x tmp0; + u32x tmp1; + + switch (i) + { + case 0: tmp0 = __byte_perm (buf0[0], 0, 0x6540); + tmp1 = ~(0x00002000 & generate_cmask (buf0[0])); break; + case 1: tmp0 = __byte_perm (buf0[0], 0, 0x6541); + tmp1 = ~(0x00200000 & generate_cmask (buf0[0])); break; + case 2: tmp0 = __byte_perm (buf0[0], 0, 0x6542); + tmp1 = ~(0x20000000 & generate_cmask (buf0[0])); break; + case 3: tmp0 = __byte_perm (buf0[0], 0, 0x6543); + tmp1 = ~(0x00000020 & generate_cmask (buf0[1])); break; + case 4: tmp0 = __byte_perm (buf0[1], 0, 0x6540); + tmp1 = ~(0x00002000 & generate_cmask (buf0[1])); break; + case 5: tmp0 = __byte_perm (buf0[1], 0, 0x6541); + tmp1 = ~(0x00200000 & generate_cmask (buf0[1])); break; + case 6: tmp0 = __byte_perm (buf0[1], 0, 0x6542); + tmp1 = ~(0x20000000 & generate_cmask (buf0[1])); break; + case 7: tmp0 = __byte_perm (buf0[1], 0, 0x6543); + tmp1 = ~(0x00000020 & generate_cmask (buf0[2])); break; + case 8: tmp0 = __byte_perm (buf0[2], 0, 0x6540); + tmp1 = ~(0x00002000 & generate_cmask (buf0[2])); break; + case 9: tmp0 = __byte_perm (buf0[2], 0, 0x6541); + tmp1 = ~(0x00200000 & generate_cmask (buf0[2])); break; + case 10: tmp0 = __byte_perm (buf0[2], 0, 0x6542); + tmp1 = ~(0x20000000 & generate_cmask (buf0[2])); break; + case 11: tmp0 = __byte_perm (buf0[2], 0, 0x6543); + tmp1 = ~(0x00000020 & generate_cmask (buf0[3])); break; + case 12: tmp0 = __byte_perm (buf0[3], 0, 0x6540); + tmp1 = ~(0x00002000 & generate_cmask (buf0[3])); break; + case 13: tmp0 = __byte_perm (buf0[3], 0, 0x6541); + tmp1 = ~(0x00200000 & generate_cmask (buf0[3])); break; + case 14: tmp0 = __byte_perm (buf0[3], 0, 0x6542); + tmp1 = ~(0x20000000 & generate_cmask (buf0[3])); break; + case 15: tmp0 = __byte_perm (buf0[3], 0, 0x6543); + tmp1 = ~(0x00000020 & generate_cmask (buf1[0])); break; + case 16: tmp0 = __byte_perm (buf1[0], 0, 0x6540); + tmp1 = ~(0x00002000 & generate_cmask (buf1[0])); break; + case 17: tmp0 = __byte_perm (buf1[0], 0, 0x6541); + tmp1 = ~(0x00200000 & generate_cmask (buf1[0])); break; + case 18: tmp0 = __byte_perm (buf1[0], 0, 0x6542); + tmp1 = ~(0x20000000 & generate_cmask (buf1[0])); break; + case 19: tmp0 = __byte_perm (buf1[0], 0, 0x6543); + tmp1 = ~(0x00000020 & generate_cmask (buf1[1])); break; + case 20: tmp0 = __byte_perm (buf1[1], 0, 0x6540); + tmp1 = ~(0x00002000 & generate_cmask (buf1[1])); break; + case 21: tmp0 = __byte_perm (buf1[1], 0, 0x6541); + tmp1 = ~(0x00200000 & generate_cmask (buf1[1])); break; + case 22: tmp0 = __byte_perm (buf1[1], 0, 0x6542); + tmp1 = ~(0x20000000 & generate_cmask (buf1[1])); break; + case 23: tmp0 = __byte_perm (buf1[1], 0, 0x6543); + tmp1 = ~(0x00000020 & generate_cmask (buf1[2])); break; + case 24: tmp0 = __byte_perm (buf1[2], 0, 0x6540); + tmp1 = ~(0x00002000 & generate_cmask (buf1[2])); break; + case 25: tmp0 = __byte_perm (buf1[2], 0, 0x6541); + tmp1 = ~(0x00200000 & generate_cmask (buf1[2])); break; + case 26: tmp0 = __byte_perm (buf1[2], 0, 0x6542); + tmp1 = ~(0x20000000 & generate_cmask (buf1[2])); break; + case 27: tmp0 = __byte_perm (buf1[2], 0, 0x6543); + tmp1 = ~(0x00000020 & generate_cmask (buf1[3])); break; + case 28: tmp0 = __byte_perm (buf1[3], 0, 0x6540); + tmp1 = ~(0x00002000 & generate_cmask (buf1[3])); break; + case 29: tmp0 = __byte_perm (buf1[3], 0, 0x6541); + tmp1 = ~(0x00200000 & generate_cmask (buf1[3])); break; + case 30: tmp0 = __byte_perm (buf1[3], 0, 0x6542); + tmp1 = ~(0x20000000 & generate_cmask (buf1[3])); break; + } + + #ifdef VECT_SIZE1 + if (i < 3) + { + if (tmp0 == ' ') buf0[0] &= tmp1 ; + } + else if (i < 7) + { + if (tmp0 == ' ') buf0[1] &= tmp1 ; + } + else if (i < 11) + { + if (tmp0 == ' ') buf0[2] &= tmp1 ; + } + else if (i < 15) + { + if (tmp0 == ' ') buf0[3] &= tmp1 ; + } + else if (i < 19) + { + if (tmp0 == ' ') buf1[0] &= tmp1 ; + } + else if (i < 23) + { + if (tmp0 == ' ') buf1[1] &= tmp1 ; + } + else if (i < 27) + { + if (tmp0 == ' ') buf1[2] &= tmp1 ; + } + else if (i < 31) + { + if (tmp0 == ' ') buf1[3] &= tmp1 ; + } + #endif + + #ifdef VECT_SIZE2 + if (i < 3) + { + if (tmp0.x == ' ') buf0[0].x &= tmp1.x; + if (tmp0.y == ' ') buf0[0].y &= tmp1.y; + } + else if (i < 7) + { + if (tmp0.x == ' ') buf0[1].x &= tmp1.x; + if (tmp0.y == ' ') buf0[1].y &= tmp1.y; + } + else if (i < 11) + { + if (tmp0.x == ' ') buf0[2].x &= tmp1.x; + if (tmp0.y == ' ') buf0[2].y &= tmp1.y; + } + else if (i < 15) + { + if (tmp0.x == ' ') buf0[3].x &= tmp1.x; + if (tmp0.y == ' ') buf0[3].y &= tmp1.y; + } + else if (i < 19) + { + if (tmp0.x == ' ') buf1[0].x &= tmp1.x; + if (tmp0.y == ' ') buf1[0].y &= tmp1.y; + } + else if (i < 23) + { + if (tmp0.x == ' ') buf1[1].x &= tmp1.x; + if (tmp0.y == ' ') buf1[1].y &= tmp1.y; + } + else if (i < 27) + { + if (tmp0.x == ' ') buf1[2].x &= tmp1.x; + if (tmp0.y == ' ') buf1[2].y &= tmp1.y; + } + else if (i < 31) + { + if (tmp0.x == ' ') buf1[3].x &= tmp1.x; + if (tmp0.y == ' ') buf1[3].y &= tmp1.y; + } + #endif + + #ifdef VECT_SIZE4 + if (i < 3) + { + if (tmp0.x == ' ') buf0[0].x &= tmp1.x; + if (tmp0.y == ' ') buf0[0].y &= tmp1.y; + if (tmp0.z == ' ') buf0[0].z &= tmp1.z; + if (tmp0.w == ' ') buf0[0].w &= tmp1.w; + } + else if (i < 7) + { + if (tmp0.x == ' ') buf0[1].x &= tmp1.x; + if (tmp0.y == ' ') buf0[1].y &= tmp1.y; + if (tmp0.z == ' ') buf0[1].z &= tmp1.z; + if (tmp0.w == ' ') buf0[1].w &= tmp1.w; + } + else if (i < 11) + { + if (tmp0.x == ' ') buf0[2].x &= tmp1.x; + if (tmp0.y == ' ') buf0[2].y &= tmp1.y; + if (tmp0.z == ' ') buf0[2].z &= tmp1.z; + if (tmp0.w == ' ') buf0[2].w &= tmp1.w; + } + else if (i < 15) + { + if (tmp0.x == ' ') buf0[3].x &= tmp1.x; + if (tmp0.y == ' ') buf0[3].y &= tmp1.y; + if (tmp0.z == ' ') buf0[3].z &= tmp1.z; + if (tmp0.w == ' ') buf0[3].w &= tmp1.w; + } + else if (i < 19) + { + if (tmp0.x == ' ') buf1[0].x &= tmp1.x; + if (tmp0.y == ' ') buf1[0].y &= tmp1.y; + if (tmp0.z == ' ') buf1[0].z &= tmp1.z; + if (tmp0.w == ' ') buf1[0].w &= tmp1.w; + } + else if (i < 23) + { + if (tmp0.x == ' ') buf1[1].x &= tmp1.x; + if (tmp0.y == ' ') buf1[1].y &= tmp1.y; + if (tmp0.z == ' ') buf1[1].z &= tmp1.z; + if (tmp0.w == ' ') buf1[1].w &= tmp1.w; + } + else if (i < 27) + { + if (tmp0.x == ' ') buf1[2].x &= tmp1.x; + if (tmp0.y == ' ') buf1[2].y &= tmp1.y; + if (tmp0.z == ' ') buf1[2].z &= tmp1.z; + if (tmp0.w == ' ') buf1[2].w &= tmp1.w; + } + else if (i < 31) + { + if (tmp0.x == ' ') buf1[3].x &= tmp1.x; + if (tmp0.y == ' ') buf1[3].y &= tmp1.y; + if (tmp0.z == ' ') buf1[3].z &= tmp1.z; + if (tmp0.w == ' ') buf1[3].w &= tmp1.w; + } + #endif + } + + + + return in_len; +} + +__device__ static u32 apply_rule (const u32 name, const u32 p0, const u32 p1, u32x buf0[4], u32x buf1[4], const u32 in_len) +{ + u32 out_len = in_len; + + switch (name) + { + case RULE_OP_MANGLE_LREST: out_len = rule_op_mangle_lrest (p0, p1, buf0, buf1, out_len); break; + case RULE_OP_MANGLE_UREST: out_len = rule_op_mangle_urest (p0, p1, buf0, buf1, out_len); break; + case RULE_OP_MANGLE_LREST_UFIRST: out_len = rule_op_mangle_lrest_ufirst (p0, p1, buf0, buf1, out_len); break; + case RULE_OP_MANGLE_UREST_LFIRST: out_len = rule_op_mangle_urest_lfirst (p0, p1, buf0, buf1, out_len); break; + case RULE_OP_MANGLE_TREST: out_len = rule_op_mangle_trest (p0, p1, buf0, buf1, out_len); break; + case RULE_OP_MANGLE_TOGGLE_AT: out_len = rule_op_mangle_toggle_at (p0, p1, buf0, buf1, out_len); break; + case RULE_OP_MANGLE_REVERSE: out_len = rule_op_mangle_reverse (p0, p1, buf0, buf1, out_len); break; + case RULE_OP_MANGLE_DUPEWORD: out_len = rule_op_mangle_dupeword (p0, p1, buf0, buf1, out_len); break; + case RULE_OP_MANGLE_DUPEWORD_TIMES: out_len = rule_op_mangle_dupeword_times (p0, p1, buf0, buf1, out_len); break; + case RULE_OP_MANGLE_REFLECT: out_len = rule_op_mangle_reflect (p0, p1, buf0, buf1, out_len); break; + case RULE_OP_MANGLE_APPEND: out_len = rule_op_mangle_append (p0, p1, buf0, buf1, out_len); break; + case RULE_OP_MANGLE_PREPEND: out_len = rule_op_mangle_prepend (p0, p1, buf0, buf1, out_len); break; + case RULE_OP_MANGLE_ROTATE_LEFT: out_len = rule_op_mangle_rotate_left (p0, p1, buf0, buf1, out_len); break; + case RULE_OP_MANGLE_ROTATE_RIGHT: out_len = rule_op_mangle_rotate_right (p0, p1, buf0, buf1, out_len); break; + case RULE_OP_MANGLE_DELETE_FIRST: out_len = rule_op_mangle_delete_first (p0, p1, buf0, buf1, out_len); break; + case RULE_OP_MANGLE_DELETE_LAST: out_len = rule_op_mangle_delete_last (p0, p1, buf0, buf1, out_len); break; + case RULE_OP_MANGLE_DELETE_AT: out_len = rule_op_mangle_delete_at (p0, p1, buf0, buf1, out_len); break; + case RULE_OP_MANGLE_EXTRACT: out_len = rule_op_mangle_extract (p0, p1, buf0, buf1, out_len); break; + case RULE_OP_MANGLE_OMIT: out_len = rule_op_mangle_omit (p0, p1, buf0, buf1, out_len); break; + case RULE_OP_MANGLE_INSERT: out_len = rule_op_mangle_insert (p0, p1, buf0, buf1, out_len); break; + case RULE_OP_MANGLE_OVERSTRIKE: out_len = rule_op_mangle_overstrike (p0, p1, buf0, buf1, out_len); break; + case RULE_OP_MANGLE_TRUNCATE_AT: out_len = rule_op_mangle_truncate_at (p0, p1, buf0, buf1, out_len); break; + case RULE_OP_MANGLE_REPLACE: out_len = rule_op_mangle_replace (p0, p1, buf0, buf1, out_len); break; + //case RULE_OP_MANGLE_PURGECHAR: out_len = rule_op_mangle_purgechar (p0, p1, buf0, buf1, out_len); break; + //case RULE_OP_MANGLE_TOGGLECASE_REC: out_len = rule_op_mangle_togglecase_rec (p0, p1, buf0, buf1, out_len); break; + case RULE_OP_MANGLE_DUPECHAR_FIRST: out_len = rule_op_mangle_dupechar_first (p0, p1, buf0, buf1, out_len); break; + case RULE_OP_MANGLE_DUPECHAR_LAST: out_len = rule_op_mangle_dupechar_last (p0, p1, buf0, buf1, out_len); break; + case RULE_OP_MANGLE_DUPECHAR_ALL: out_len = rule_op_mangle_dupechar_all (p0, p1, buf0, buf1, out_len); break; + case RULE_OP_MANGLE_SWITCH_FIRST: out_len = rule_op_mangle_switch_first (p0, p1, buf0, buf1, out_len); break; + case RULE_OP_MANGLE_SWITCH_LAST: out_len = rule_op_mangle_switch_last (p0, p1, buf0, buf1, out_len); break; + case RULE_OP_MANGLE_SWITCH_AT: out_len = rule_op_mangle_switch_at (p0, p1, buf0, buf1, out_len); break; + case RULE_OP_MANGLE_CHR_SHIFTL: out_len = rule_op_mangle_chr_shiftl (p0, p1, buf0, buf1, out_len); break; + case RULE_OP_MANGLE_CHR_SHIFTR: out_len = rule_op_mangle_chr_shiftr (p0, p1, buf0, buf1, out_len); break; + case RULE_OP_MANGLE_CHR_INCR: out_len = rule_op_mangle_chr_incr (p0, p1, buf0, buf1, out_len); break; + case RULE_OP_MANGLE_CHR_DECR: out_len = rule_op_mangle_chr_decr (p0, p1, buf0, buf1, out_len); break; + case RULE_OP_MANGLE_REPLACE_NP1: out_len = rule_op_mangle_replace_np1 (p0, p1, buf0, buf1, out_len); break; + case RULE_OP_MANGLE_REPLACE_NM1: out_len = rule_op_mangle_replace_nm1 (p0, p1, buf0, buf1, out_len); break; + case RULE_OP_MANGLE_DUPEBLOCK_FIRST: out_len = rule_op_mangle_dupeblock_first (p0, p1, buf0, buf1, out_len); break; + case RULE_OP_MANGLE_DUPEBLOCK_LAST: out_len = rule_op_mangle_dupeblock_last (p0, p1, buf0, buf1, out_len); break; + case RULE_OP_MANGLE_TITLE: out_len = rule_op_mangle_title (p0, p1, buf0, buf1, out_len); break; + } + + return out_len; +} + +__device__ static u32 apply_rules (u32 *cmds, u32x buf0[4], u32x buf1[4], const u32 len) +{ + u32 out_len = len; + + for (u32 i = 0; cmds[i] != 0; i++) + { + const u32 cmd = cmds[i]; + + const u32 name = (cmd >> 0) & 0xff; + const u32 p0 = (cmd >> 8) & 0xff; + const u32 p1 = (cmd >> 16) & 0xff; + + out_len = apply_rule (name, p0, p1, buf0, buf1, out_len); + } + + return out_len; +} diff --git a/nv/types_nv.c b/nv/types_nv.c new file mode 100644 index 0000000000..1482f7a2b3 --- /dev/null +++ b/nv/types_nv.c @@ -0,0 +1,1402 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#include + +typedef uint8_t u8; +typedef uint16_t u16; +typedef uint32_t u32; +typedef uint64_t u64; + +__device__ static u32 lut3_2d (const u32 a, const u32 b, const u32 c) +{ + u32 r; + + asm ("lop3.b32 %0, %1, %2, %3, 0x2d;" : "=r" (r) : "r" (a), "r" (b), "r" (c)); + + return r; +} + +__device__ static u32 lut3_39 (const u32 a, const u32 b, const u32 c) +{ + u32 r; + + asm ("lop3.b32 %0, %1, %2, %3, 0x39;" : "=r" (r) : "r" (a), "r" (b), "r" (c)); + + return r; +} + +__device__ static u32 lut3_59 (const u32 a, const u32 b, const u32 c) +{ + u32 r; + + asm ("lop3.b32 %0, %1, %2, %3, 0x59;" : "=r" (r) : "r" (a), "r" (b), "r" (c)); + + return r; +} + +__device__ static u32 lut3_96 (const u32 a, const u32 b, const u32 c) +{ + u32 r; + + asm ("lop3.b32 %0, %1, %2, %3, 0x96;" : "=r" (r) : "r" (a), "r" (b), "r" (c)); + + return r; +} + +__device__ static u32 lut3_e4 (const u32 a, const u32 b, const u32 c) +{ + u32 r; + + asm ("lop3.b32 %0, %1, %2, %3, 0xe4;" : "=r" (r) : "r" (a), "r" (b), "r" (c)); + + return r; +} + +__device__ static u32 lut3_e8 (const u32 a, const u32 b, const u32 c) +{ + u32 r; + + asm ("lop3.b32 %0, %1, %2, %3, 0xe8;" : "=r" (r) : "r" (a), "r" (b), "r" (c)); + + return r; +} + +__device__ static u32 lut3_ca (const u32 a, const u32 b, const u32 c) +{ + u32 r; + + asm ("lop3.b32 %0, %1, %2, %3, 0xca;" : "=r" (r) : "r" (a), "r" (b), "r" (c)); + + return r; +} + +#if __CUDA_ARCH__ >= 350 + +__device__ static u32 rotr32 (const u32 a, const u32 n) +{ + return __funnelshift_r (a, a, n); +} + +__device__ static u32 rotl32 (const u32 a, const u32 n) +{ + return rotr32 (a, 32 - n); +} + +__device__ static u64 rotr64 (const u64 a, const u32 n) +{ + u32 il; + u32 ir; + + asm ("mov.b64 {%0, %1}, %2;" : "=r"(il), "=r"(ir) : "l"(a)); + + u32 tl; + u32 tr; + + if (n >= 32) + { + asm ("shf.r.wrap.b32 %0, %1, %2, %3;" : "=r"(tl) : "r"(ir), "r"(il), "r"(n - 32)); + asm ("shf.r.wrap.b32 %0, %1, %2, %3;" : "=r"(tr) : "r"(il), "r"(ir), "r"(n - 32)); + } + else + { + asm ("shf.r.wrap.b32 %0, %1, %2, %3;" : "=r"(tl) : "r"(il), "r"(ir), "r"(n)); + asm ("shf.r.wrap.b32 %0, %1, %2, %3;" : "=r"(tr) : "r"(ir), "r"(il), "r"(n)); + } + + u64 r; + + asm ("mov.b64 %0, {%1, %2};" : "=l"(r) : "r"(tl), "r"(tr)); + + return r; +} + +__device__ static u64 rotl64 (const u64 a, const u32 n) +{ + return rotr64 (a, 64 - n); +} + +#else + +__device__ static u32 rotr32 (const u32 a, const u32 n) +{ + return (((a) >> (n)) + ((a) << (32 - (n)))); +} + +__device__ static u32 rotl32 (const u32 a, const u32 n) +{ + return rotr32 (a, 32 - n); +} + +__device__ static u64 rotr64 (const u64 a, const u32 n) +{ + return (((a) >> (n)) + ((a) << (64 - (n)))); +} + +__device__ static u64 rotl64 (const u64 a, const u32 n) +{ + return rotr64 (a, 64 - n); +} + + +#endif + +#ifdef VECT_SIZE1 +#define VECT_SHIFT 0 +#define VECT_DIV 1 + +typedef u8 u8x; +typedef u16 u16x; +typedef u32 u32x; +typedef u64 u64x; + +__device__ static u32 l32_from_64 (u64 a) +{ + const u32 r = (u32) a; + + return r; +} + +__device__ static u32 h32_from_64 (u64 a) +{ + a >>= 32; + + const u32 r = (u32) a; + + return r; +} + +__device__ static u64 hl32_to_64 (const u32x a, const u32x b) +{ + u64 r; + + asm ("mov.b64 %0, {%1, %2};" : "=l"(r) : "r"(b), "r"(a)); + + return r; +} + +#endif + +#ifdef VECT_SIZE2 +#define VECT_SHIFT 1 +#define VECT_DIV 2 + +class u8x +{ + private: + public: + + u8 x; + u8 y; + + inline __device__ u8x (const u8 a, const u8 b) : x(a), y(b) { } + inline __device__ u8x (const u8 a) : x(a), y(a) { } + + inline __device__ u8x (void) { } + inline __device__ ~u8x (void) { } +}; + +class u16x +{ + private: + public: + + u16 x; + u16 y; + + inline __device__ u16x (const u16 a, const u16 b) : x(a), y(b) { } + inline __device__ u16x (const u16 a) : x(a), y(a) { } + + inline __device__ u16x (void) { } + inline __device__ ~u16x (void) { } +}; + +class u32x +{ + private: + public: + + u32 x; + u32 y; + + inline __device__ u32x (const u32 a, const u32 b) : x(a), y(b) { } + inline __device__ u32x (const u32 a) : x(a), y(a) { } + + inline __device__ u32x (void) { } + inline __device__ ~u32x (void) { } +}; + +class u64x +{ + private: + public: + + u64 x; + u64 y; + + inline __device__ u64x (const u32x a) : x(a.x), y(a.y) { } + + inline __device__ u64x (const u64 a, const u64 b) : x(a), y(b) { } + inline __device__ u64x (const u64 a) : x(a), y(a) { } + + inline __device__ u64x (void) { } + inline __device__ ~u64x (void) { } +}; + +inline __device__ bool operator != (const u32x a, const u32 b) { return ((a.x != b ) && (a.y != b )); } +inline __device__ bool operator != (const u32x a, const u32x b) { return ((a.x != b.x) && (a.y != b.y)); } + +inline __device__ void operator ^= (u32x &a, const u32 b) { a.x ^= b; a.y ^= b; } +inline __device__ void operator ^= (u32x &a, const u32x b) { a.x ^= b.x; a.y ^= b.y; } + +inline __device__ void operator |= (u32x &a, const u32 b) { a.x |= b; a.y |= b; } +inline __device__ void operator |= (u32x &a, const u32x b) { a.x |= b.x; a.y |= b.y; } + +inline __device__ void operator &= (u32x &a, const u32 b) { a.x &= b; a.y &= b; } +inline __device__ void operator &= (u32x &a, const u32x b) { a.x &= b.x; a.y &= b.y; } + +inline __device__ void operator += (u32x &a, const u32 b) { a.x += b; a.y += b; } +inline __device__ void operator += (u32x &a, const u32x b) { a.x += b.x; a.y += b.y; } + +inline __device__ void operator -= (u32x &a, const u32 b) { a.x -= b; a.y -= b; } +inline __device__ void operator -= (u32x &a, const u32x b) { a.x -= b.x; a.y -= b.y; } + +inline __device__ u32x operator << (const u32x a, const u32 b) { return u32x ((a.x << b ), (a.y << b )); } +inline __device__ u32x operator << (const u32x a, const u32x b) { return u32x ((a.x << b.x), (a.y << b.y)); } + +inline __device__ u32x operator >> (const u32x a, const u32 b) { return u32x ((a.x >> b ), (a.y >> b )); } +inline __device__ u32x operator >> (const u32x a, const u32x b) { return u32x ((a.x >> b.x), (a.y >> b.y)); } + +inline __device__ u32x operator ^ (const u32x a, const u32 b) { return u32x ((a.x ^ b ), (a.y ^ b )); } +inline __device__ u32x operator ^ (const u32x a, const u32x b) { return u32x ((a.x ^ b.x), (a.y ^ b.y)); } + +inline __device__ u32x operator | (const u32x a, const u32 b) { return u32x ((a.x | b ), (a.y | b )); } +inline __device__ u32x operator | (const u32x a, const u32x b) { return u32x ((a.x | b.x), (a.y | b.y)); } + +inline __device__ u32x operator & (const u32x a, const u32 b) { return u32x ((a.x & b ), (a.y & b )); } +inline __device__ u32x operator & (const u32x a, const u32x b) { return u32x ((a.x & b.x), (a.y & b.y)); } + +inline __device__ u32x operator + (const u32x a, const u32 b) { return u32x ((a.x + b ), (a.y + b )); } +inline __device__ u32x operator + (const u32x a, const u32x b) { return u32x ((a.x + b.x), (a.y + b.y)); } + +inline __device__ u32x operator - (const u32x a, const u32 b) { return u32x ((a.x - b ), (a.y - b )); } +inline __device__ u32x operator - (const u32x a, const u32x b) { return u32x ((a.x - b.x), (a.y - b.y)); } + +inline __device__ u32x operator * (const u32x a, const u32 b) { return u32x ((a.x * b ), (a.y * b )); } +inline __device__ u32x operator * (const u32x a, const u32x b) { return u32x ((a.x * b.x), (a.y * b.y)); } + +inline __device__ u32x operator ~ (const u32x a) { return u32x (~a.x, ~a.y); } + +inline __device__ bool operator != (const u64x a, const u64 b) { return ((a.x != b ) && (a.y != b )); } +inline __device__ bool operator != (const u64x a, const u64x b) { return ((a.x != b.x) && (a.y != b.y)); } + +inline __device__ void operator ^= (u64x &a, const u64 b) { a.x ^= b; a.y ^= b; } +inline __device__ void operator ^= (u64x &a, const u64x b) { a.x ^= b.x; a.y ^= b.y; } + +inline __device__ void operator |= (u64x &a, const u64 b) { a.x |= b; a.y |= b; } +inline __device__ void operator |= (u64x &a, const u64x b) { a.x |= b.x; a.y |= b.y; } + +inline __device__ void operator &= (u64x &a, const u64 b) { a.x &= b; a.y &= b; } +inline __device__ void operator &= (u64x &a, const u64x b) { a.x &= b.x; a.y &= b.y; } + +inline __device__ void operator += (u64x &a, const u64 b) { a.x += b; a.y += b; } +inline __device__ void operator += (u64x &a, const u64x b) { a.x += b.x; a.y += b.y; } + +inline __device__ void operator -= (u64x &a, const u64 b) { a.x -= b; a.y -= b; } +inline __device__ void operator -= (u64x &a, const u64x b) { a.x -= b.x; a.y -= b.y; } + +inline __device__ u64x operator << (const u64x a, const u64 b) { return u64x ((a.x << b ), (a.y << b )); } +inline __device__ u64x operator << (const u64x a, const u64x b) { return u64x ((a.x << b.x), (a.y << b.y)); } + +inline __device__ u64x operator >> (const u64x a, const u64 b) { return u64x ((a.x >> b ), (a.y >> b )); } +inline __device__ u64x operator >> (const u64x a, const u64x b) { return u64x ((a.x >> b.x), (a.y >> b.y)); } + +inline __device__ u64x operator ^ (const u64x a, const u64 b) { return u64x ((a.x ^ b ), (a.y ^ b )); } +inline __device__ u64x operator ^ (const u64x a, const u64x b) { return u64x ((a.x ^ b.x), (a.y ^ b.y)); } + +inline __device__ u64x operator | (const u64x a, const u64 b) { return u64x ((a.x | b ), (a.y | b )); } +inline __device__ u64x operator | (const u64x a, const u64x b) { return u64x ((a.x | b.x), (a.y | b.y)); } + +inline __device__ u64x operator & (const u64x a, const u64 b) { return u64x ((a.x & b ), (a.y & b )); } +inline __device__ u64x operator & (const u64x a, const u64x b) { return u64x ((a.x & b.x), (a.y & b.y)); } + +inline __device__ u64x operator + (const u64x a, const u64 b) { return u64x ((a.x + b ), (a.y + b )); } +inline __device__ u64x operator + (const u64x a, const u64x b) { return u64x ((a.x + b.x), (a.y + b.y)); } + +inline __device__ u64x operator - (const u64x a, const u64 b) { return u64x ((a.x - b ), (a.y - b )); } +inline __device__ u64x operator - (const u64x a, const u64x b) { return u64x ((a.x - b.x), (a.y - b.y)); } + +inline __device__ u64x operator ~ (const u64x a) { return u64x (~a.x, ~a.y); } + +__device__ static u32x lut3_2d (const u32x a, const u32x b, const u32x c) +{ + return u32x (lut3_2d (a.x, b.x, c.x), + lut3_2d (a.y, b.y, c.y)); +} + +__device__ static u32x lut3_39 (const u32x a, const u32x b, const u32x c) +{ + return u32x (lut3_39 (a.x, b.x, c.x), + lut3_39 (a.y, b.y, c.y)); +} + +__device__ static u32x lut3_59 (const u32x a, const u32x b, const u32x c) +{ + return u32x (lut3_59 (a.x, b.x, c.x), + lut3_59 (a.y, b.y, c.y)); +} + +__device__ static u32x lut3_96 (const u32x a, const u32x b, const u32x c) +{ + return u32x (lut3_96 (a.x, b.x, c.x), + lut3_96 (a.y, b.y, c.y)); +} + +__device__ static u32x lut3_e4 (const u32x a, const u32x b, const u32x c) +{ + return u32x (lut3_e4 (a.x, b.x, c.x), + lut3_e4 (a.y, b.y, c.y)); +} + +__device__ static u32x lut3_e8 (const u32x a, const u32x b, const u32x c) +{ + return u32x (lut3_e8 (a.x, b.x, c.x), + lut3_e8 (a.y, b.y, c.y)); +} + +__device__ static u32x lut3_ca (const u32x a, const u32x b, const u32x c) +{ + return u32x (lut3_ca (a.x, b.x, c.x), + lut3_ca (a.y, b.y, c.y)); +} + +__device__ static u32x rotl32(const u32x a, const u32 n) +{ + return u32x (rotl32 (a.x, n), + rotl32 (a.y, n)); +} + +__device__ static u32x rotr32(const u32x a, const u32 n) +{ + return u32x (rotr32 (a.x, n), + rotr32 (a.y, n)); +} + +__device__ static u64x rotl64(const u64x a, const u32 n) +{ + return u64x (rotl64 (a.x, n), + rotl64 (a.y, n)); +} + +__device__ static u64x rotr64(const u64x a, const u32 n) +{ + return u64x (rotr64 (a.x, n), + rotr64 (a.y, n)); +} + +__device__ static u32x __byte_perm (const u32x a, const u32x b, const u32 c) +{ + return u32x (__byte_perm (a.x, b.x, c), + __byte_perm (a.y, b.y, c)); +} + +#endif + +#ifdef VECT_SIZE4 +#define VECT_SHIFT 2 +#define VECT_DIV 4 + +class u8x +{ + private: + public: + + u8 x; + u8 y; + u8 z; + u8 w; + + inline __device__ u8x (const u8 a, const u8 b, const u8 c, const u8 d) : x(a), y(b), z(c), w(d) { } + inline __device__ u8x (const u8 a) : x(a), y(a), z(a), w(a) { } + + inline __device__ u8x (void) { } + inline __device__ ~u8x (void) { } +}; + +class u16x +{ + private: + public: + + u16 x; + u16 y; + u16 z; + u16 w; + + inline __device__ u16x (const u16 a, const u16 b, const u16 c, const u16 d) : x(a), y(b), z(c), w(d) { } + inline __device__ u16x (const u16 a) : x(a), y(a), z(a), w(a) { } + + inline __device__ u16x (void) { } + inline __device__ ~u16x (void) { } +}; + +class u32x +{ + private: + public: + + u32 x; + u32 y; + u32 z; + u32 w; + + inline __device__ u32x (const u32 a, const u32 b, const u32 c, const u32 d) : x(a), y(b), z(c), w(d) { } + inline __device__ u32x (const u32 a) : x(a), y(a), z(a), w(a) { } + + inline __device__ u32x (void) { } + inline __device__ ~u32x (void) { } +}; + +class u64x +{ + private: + public: + + u64 x; + u64 y; + u64 z; + u64 w; + + inline __device__ u64x (const u32x a) : x(a.x), y(a.y), z(a.z), w(a.w) { } + + inline __device__ u64x (const u64 a, const u64 b, const u64 c, const u64 d) : x(a), y(b), z(c), w(d) { } + inline __device__ u64x (const u64 a) : x(a), y(a), z(a), w(a) { } + + inline __device__ u64x (void) { } + inline __device__ ~u64x (void) { } +}; + +inline __device__ bool operator != (const u32x a, const u32 b) { return ((a.x != b ) && (a.y != b ) && (a.z != b ) && (a.w != b )); } +inline __device__ bool operator != (const u32x a, const u32x b) { return ((a.x != b.x) && (a.y != b.y) && (a.z != b.z) && (a.w != b.w)); } + +inline __device__ void operator ^= (u32x &a, const u32 b) { a.x ^= b; a.y ^= b; a.z ^= b; a.w ^= b; } +inline __device__ void operator ^= (u32x &a, const u32x b) { a.x ^= b.x; a.y ^= b.y; a.z ^= b.z; a.w ^= b.w; } + +inline __device__ void operator |= (u32x &a, const u32 b) { a.x |= b; a.y |= b; a.z |= b; a.w |= b; } +inline __device__ void operator |= (u32x &a, const u32x b) { a.x |= b.x; a.y |= b.y; a.z |= b.z; a.w |= b.w; } + +inline __device__ void operator &= (u32x &a, const u32 b) { a.x &= b; a.y &= b; a.z &= b; a.w &= b; } +inline __device__ void operator &= (u32x &a, const u32x b) { a.x &= b.x; a.y &= b.y; a.z &= b.z; a.w &= b.w; } + +inline __device__ void operator += (u32x &a, const u32 b) { a.x += b; a.y += b; a.z += b; a.w += b; } +inline __device__ void operator += (u32x &a, const u32x b) { a.x += b.x; a.y += b.y; a.z += b.z; a.w += b.w; } + +inline __device__ void operator -= (u32x &a, const u32 b) { a.x -= b; a.y -= b; a.z -= b; a.w -= b; } +inline __device__ void operator -= (u32x &a, const u32x b) { a.x -= b.x; a.y -= b.y; a.z -= b.z; a.w -= b.w; } + +inline __device__ u32x operator << (const u32x a, const u32 b) { return u32x ((a.x << b ), (a.y << b ), (a.z << b ), (a.w << b )); } +inline __device__ u32x operator << (const u32x a, const u32x b) { return u32x ((a.x << b.x), (a.y << b.y), (a.z << b.z), (a.w << b.w)); } + +inline __device__ u32x operator >> (const u32x a, const u32 b) { return u32x ((a.x >> b ), (a.y >> b ), (a.z >> b ), (a.w >> b )); } +inline __device__ u32x operator >> (const u32x a, const u32x b) { return u32x ((a.x >> b.x), (a.y >> b.y), (a.z >> b.z), (a.w >> b.w)); } + +inline __device__ u32x operator ^ (const u32x a, const u32 b) { return u32x ((a.x ^ b ), (a.y ^ b ), (a.z ^ b ), (a.w ^ b )); } +inline __device__ u32x operator ^ (const u32x a, const u32x b) { return u32x ((a.x ^ b.x), (a.y ^ b.y), (a.z ^ b.z), (a.w ^ b.w)); } + +inline __device__ u32x operator | (const u32x a, const u32 b) { return u32x ((a.x | b ), (a.y | b ), (a.z | b ), (a.w | b )); } +inline __device__ u32x operator | (const u32x a, const u32x b) { return u32x ((a.x | b.x), (a.y | b.y), (a.z | b.z), (a.w | b.w)); } + +inline __device__ u32x operator & (const u32x a, const u32 b) { return u32x ((a.x & b ), (a.y & b ), (a.z & b ), (a.w & b )); } +inline __device__ u32x operator & (const u32x a, const u32x b) { return u32x ((a.x & b.x), (a.y & b.y), (a.z & b.z), (a.w & b.w)); } + +inline __device__ u32x operator + (const u32x a, const u32 b) { return u32x ((a.x + b ), (a.y + b ), (a.z + b ), (a.w + b )); } +inline __device__ u32x operator + (const u32x a, const u32x b) { return u32x ((a.x + b.x), (a.y + b.y), (a.z + b.z), (a.w + b.w)); } + +inline __device__ u32x operator - (const u32x a, const u32 b) { return u32x ((a.x - b ), (a.y - b ), (a.z - b ), (a.w - b )); } +inline __device__ u32x operator - (const u32x a, const u32x b) { return u32x ((a.x - b.x), (a.y - b.y), (a.z - b.z), (a.w - b.w)); } + +inline __device__ u32x operator * (const u32x a, const u32 b) { return u32x ((a.x * b ), (a.y * b ), (a.z * b ), (a.w * b )); } +inline __device__ u32x operator * (const u32x a, const u32x b) { return u32x ((a.x * b.x), (a.y * b.y), (a.z * b.z), (a.w * b.w)); } + +inline __device__ u32x operator ~ (const u32x a) { return u32x (~a.x, ~a.y, ~a.z, ~a.w); } + +inline __device__ bool operator != (const u64x a, const u64 b) { return ((a.x != b ) && (a.y != b ) && (a.z != b ) && (a.w != b )); } +inline __device__ bool operator != (const u64x a, const u64x b) { return ((a.x != b.x) && (a.y != b.y) && (a.z != b.z) && (a.w != b.w)); } + +inline __device__ void operator ^= (u64x &a, const u64 b) { a.x ^= b; a.y ^= b; a.z ^= b; a.w ^= b; } +inline __device__ void operator ^= (u64x &a, const u64x b) { a.x ^= b.x; a.y ^= b.y; a.z ^= b.z; a.w ^= b.w; } + +inline __device__ void operator |= (u64x &a, const u64 b) { a.x |= b; a.y |= b; a.z |= b; a.w |= b; } +inline __device__ void operator |= (u64x &a, const u64x b) { a.x |= b.x; a.y |= b.y; a.z |= b.z; a.w |= b.w; } + +inline __device__ void operator &= (u64x &a, const u64 b) { a.x &= b; a.y &= b; a.z &= b; a.w &= b; } +inline __device__ void operator &= (u64x &a, const u64x b) { a.x &= b.x; a.y &= b.y; a.z &= b.z; a.w &= b.w; } + +inline __device__ void operator += (u64x &a, const u64 b) { a.x += b; a.y += b; a.z += b; a.w += b; } +inline __device__ void operator += (u64x &a, const u64x b) { a.x += b.x; a.y += b.y; a.z += b.z; a.w += b.w; } + +inline __device__ void operator -= (u64x &a, const u64 b) { a.x -= b; a.y -= b; a.z -= b; a.w -= b; } +inline __device__ void operator -= (u64x &a, const u64x b) { a.x -= b.x; a.y -= b.y; a.z -= b.z; a.w -= b.w; } + +inline __device__ u64x operator << (const u64x a, const u64 b) { return u64x ((a.x << b ), (a.y << b ), (a.z << b ), (a.w << b )); } +inline __device__ u64x operator << (const u64x a, const u64x b) { return u64x ((a.x << b.x), (a.y << b.y), (a.z << b.z), (a.w << b.w)); } + +inline __device__ u64x operator >> (const u64x a, const u64 b) { return u64x ((a.x >> b ), (a.y >> b ), (a.z >> b ), (a.w >> b )); } +inline __device__ u64x operator >> (const u64x a, const u64x b) { return u64x ((a.x >> b.x), (a.y >> b.y), (a.z >> b.z), (a.w >> b.w)); } + +inline __device__ u64x operator ^ (const u64x a, const u64 b) { return u64x ((a.x ^ b ), (a.y ^ b ), (a.z ^ b ), (a.w ^ b )); } +inline __device__ u64x operator ^ (const u64x a, const u64x b) { return u64x ((a.x ^ b.x), (a.y ^ b.y), (a.z ^ b.z), (a.w ^ b.w)); } + +inline __device__ u64x operator | (const u64x a, const u64 b) { return u64x ((a.x | b ), (a.y | b ), (a.z | b ), (a.w | b )); } +inline __device__ u64x operator | (const u64x a, const u64x b) { return u64x ((a.x | b.x), (a.y | b.y), (a.z | b.z), (a.w | b.w)); } + +inline __device__ u64x operator & (const u64x a, const u64 b) { return u64x ((a.x & b ), (a.y & b ), (a.z & b ), (a.w & b )); } +inline __device__ u64x operator & (const u64x a, const u64x b) { return u64x ((a.x & b.x), (a.y & b.y), (a.z & b.z), (a.w & b.w)); } + +inline __device__ u64x operator + (const u64x a, const u64 b) { return u64x ((a.x + b ), (a.y + b ), (a.z + b ), (a.w + b )); } +inline __device__ u64x operator + (const u64x a, const u64x b) { return u64x ((a.x + b.x), (a.y + b.y), (a.z + b.z), (a.w + b.w)); } + +inline __device__ u64x operator - (const u64x a, const u64 b) { return u64x ((a.x - b ), (a.y - b ), (a.z - b ), (a.w - b )); } +inline __device__ u64x operator - (const u64x a, const u64x b) { return u64x ((a.x - b.x), (a.y - b.y), (a.z - b.z), (a.w - b.w)); } + +inline __device__ u64x operator * (const u64x a, const u64 b) { return u64x ((a.x * b ), (a.y * b ), (a.z * b ), (a.w * b )); } +inline __device__ u64x operator * (const u64x a, const u64x b) { return u64x ((a.x * b.x), (a.y * b.y), (a.z * b.z), (a.w * b.w)); } + +inline __device__ u64x operator ~ (const u64x a) { return u64x (~a.x, ~a.y, ~a.z, ~a.w); } + +__device__ static u32x lut3_2d (const u32x a, const u32x b, const u32x c) +{ + return u32x (lut3_2d(a.x, b.x, c.x), + lut3_2d (a.y, b.y, c.y), + lut3_2d (a.z, b.z, c.z), + lut3_2d (a.w, b.w, c.w)); +} + +__device__ static u32x lut3_39 (const u32x a, const u32x b, const u32x c) +{ + return u32x (lut3_39 (a.x, b.x, c.x), + lut3_39 (a.y, b.y, c.y), + lut3_39 (a.z, b.z, c.z), + lut3_39 (a.w, b.w, c.w)); +} + +__device__ static u32x lut3_59 (const u32x a, const u32x b, const u32x c) +{ + return u32x (lut3_59 (a.x, b.x, c.x), + lut3_59 (a.y, b.y, c.y), + lut3_59 (a.z, b.z, c.z), + lut3_59 (a.w, b.w, c.w)); +} + +__device__ static u32x lut3_96 (const u32x a, const u32x b, const u32x c) +{ + return u32x (lut3_96 (a.x, b.x, c.x), + lut3_96 (a.y, b.y, c.y), + lut3_96 (a.z, b.z, c.z), + lut3_96 (a.w, b.w, c.w)); +} + +__device__ static u32x lut3_e4 (const u32x a, const u32x b, const u32x c) +{ + return u32x (lut3_e4 (a.x, b.x, c.x), + lut3_e4 (a.y, b.y, c.y), + lut3_e4 (a.z, b.z, c.z), + lut3_e4 (a.w, b.w, c.w)); +} + +__device__ static u32x lut3_e8 (const u32x a, const u32x b, const u32x c) +{ + return u32x (lut3_e8 (a.x, b.x, c.x), + lut3_e8 (a.y, b.y, c.y), + lut3_e8 (a.z, b.z, c.z), + lut3_e8 (a.w, b.w, c.w)); +} + +__device__ static u32x lut3_ca (const u32x a, const u32x b, const u32x c) +{ + return u32x (lut3_ca (a.x, b.x, c.x), + lut3_ca (a.y, b.y, c.y), + lut3_ca (a.z, b.z, c.z), + lut3_ca (a.w, b.w, c.w)); +} + +__device__ static u32x rotl32(const u32x a, const u32 n) +{ + return u32x (rotl32 (a.x, n), + rotl32 (a.y, n), + rotl32 (a.z, n), + rotl32 (a.w, n)); +} + +__device__ static u32x rotr32(const u32x a, const u32 n) +{ + return u32x (rotr32 (a.x, n), + rotr32 (a.y, n), + rotr32 (a.z, n), + rotr32 (a.w, n)); +} + +__device__ static u64x rotl64(const u64x a, const u32 n) +{ + return u64x (rotl64 (a.x, n), + rotl64 (a.y, n), + rotl64 (a.z, n), + rotl64 (a.w, n)); +} + +__device__ static u64x rotr64(const u64x a, const u32 n) +{ + return u64x (rotr64 (a.x, n), + rotr64 (a.y, n), + rotr64 (a.z, n), + rotr64 (a.w, n)); +} + +__device__ static u32x __byte_perm (const u32x a, const u32x b, const u32 c) +{ + return u32x (__byte_perm (a.x, b.x, c), + __byte_perm (a.y, b.y, c), + __byte_perm (a.z, b.z, c), + __byte_perm (a.w, b.w, c)); +} + +#endif + +typedef struct +{ + #if defined _DES_ + u32 digest_buf[4]; + #elif defined _MD4_ + u32 digest_buf[4]; + #elif defined _MD5_ + u32 digest_buf[4]; + #elif defined _MD5H_ + u32 digest_buf[4]; + #elif defined _SHA1_ + u32 digest_buf[5]; + #elif defined _BCRYPT_ + u32 digest_buf[6]; + #elif defined _SHA256_ + u32 digest_buf[8]; + #elif defined _SHA384_ + u32 digest_buf[16]; + #elif defined _SHA512_ + u32 digest_buf[16]; + #elif defined _KECCAK_ + u32 digest_buf[50]; + #elif defined _RIPEMD160_ + u32 digest_buf[5]; + #elif defined _WHIRLPOOL_ + u32 digest_buf[16]; + #elif defined _GOST_ + u32 digest_buf[8]; + #elif defined _GOST2012_256_ + u32 digest_buf[8]; + #elif defined _GOST2012_512_ + u32 digest_buf[16]; + #elif defined _SAPB_ + u32 digest_buf[4]; + #elif defined _SAPG_ + u32 digest_buf[5]; + #elif defined _MYSQL323_ + u32 digest_buf[4]; + #elif defined _LOTUS5_ + u32 digest_buf[4]; + #elif defined _LOTUS6_ + u32 digest_buf[4]; + #elif defined _SCRYPT_ + u32 digest_buf[8]; + #elif defined _LOTUS8_ + u32 digest_buf[4]; + #elif defined _OFFICE2007_ + u32 digest_buf[4]; + #elif defined _OFFICE2010_ + u32 digest_buf[4]; + #elif defined _OFFICE2013_ + u32 digest_buf[4]; + #elif defined _OLDOFFICE01_ + u32 digest_buf[4]; + #elif defined _OLDOFFICE34_ + u32 digest_buf[4]; + #elif defined _SIPHASH_ + u32 digest_buf[4]; + #elif defined _PBKDF2_MD5_ + u32 digest_buf[32]; + #elif defined _PBKDF2_SHA1_ + u32 digest_buf[32]; + #elif defined _PBKDF2_SHA256_ + u32 digest_buf[32]; + #elif defined _PBKDF2_SHA512_ + u32 digest_buf[32]; + #elif defined _PDF17L8_ + u32 digest_buf[8]; + #elif defined _CRC32_ + u32 digest_buf[4]; + #elif defined _SEVEN_ZIP_ + u32 digest_buf[4]; + #elif defined _ANDROIDFDE_ + u32 digest_buf[4]; + #elif defined _DCC2_ + u32 digest_buf[4]; + #elif defined _WPA_ + u32 digest_buf[4]; + #elif defined _MD5_SHA1_ + u32 digest_buf[4]; + #elif defined _SHA1_MD5_ + u32 digest_buf[5]; + #elif defined _NETNTLMV2_ + u32 digest_buf[4]; + #elif defined _KRB5PA_ + u32 digest_buf[4]; + #elif defined _CLOUDKEY_ + u32 digest_buf[8]; + #elif defined _SCRYPT_ + u32 digest_buf[4]; + #elif defined _PSAFE2_ + u32 digest_buf[5]; + #elif defined _LOTUS8_ + u32 digest_buf[4]; + #elif defined _RAR3_ + u32 digest_buf[4]; + #elif defined _SHA256_SHA1_ + u32 digest_buf[8]; + #elif defined _MS_DRSR_ + u32 digest_buf[8]; + #endif + +} digest_t; + +typedef struct +{ + u32 salt_buf[16]; + u32 salt_buf_pc[8]; + + u32 salt_len; + u32 salt_iter; + u32 salt_sign[2]; + + u32 keccak_mdlen; + u32 truecrypt_mdlen; + + u32 digests_cnt; + u32 digests_done; + + u32 digests_offset; + + u32 scrypt_N; + u32 scrypt_r; + u32 scrypt_p; + u32 scrypt_tmto; + u32 scrypt_phy; + +} salt_t; + +typedef struct +{ + int V; + int R; + int P; + + int enc_md; + + u32 id_buf[8]; + u32 u_buf[32]; + u32 o_buf[32]; + + int id_len; + int o_len; + int u_len; + + u32 rc4key[2]; + u32 rc4data[2]; + +} pdf_t; + +typedef struct +{ + u32 pke[25]; + u32 eapol[64]; + int eapol_size; + int keyver; + +} wpa_t; + +typedef struct +{ + u32 cry_master_buf[64]; + u32 ckey_buf[64]; + u32 public_key_buf[64]; + + u32 cry_master_len; + u32 ckey_len; + u32 public_key_len; + +} bitcoin_wallet_t; + +typedef struct +{ + u32 salt_buf[30]; + u32 salt_len; + + u32 esalt_buf[38]; + u32 esalt_len; + +} sip_t; + +typedef struct +{ + u32 data[384]; + +} androidfde_t; + +typedef struct +{ + u32 nr_buf[16]; + u32 nr_len; + + u32 msg_buf[128]; + u32 msg_len; + +} ikepsk_t; + +typedef struct +{ + u32 user_len; + u32 domain_len; + u32 srvchall_len; + u32 clichall_len; + + u32 userdomain_buf[64]; + u32 chall_buf[256]; + +} netntlm_t; + +typedef struct +{ + u32 user[16]; + u32 realm[16]; + u32 salt[32]; + u32 timestamp[16]; + u32 checksum[4]; + +} krb5pa_t; + +typedef struct +{ + u32 salt_buf[16]; + u32 data_buf[112]; + u32 keyfile_buf[16]; + +} tc_t; + +typedef struct +{ + u32 salt_buf[16]; + +} pbkdf2_md5_t; + +typedef struct +{ + u32 salt_buf[16]; + +} pbkdf2_sha1_t; + +typedef struct +{ + u32 salt_buf[16]; + +} pbkdf2_sha256_t; + +typedef struct +{ + u32 salt_buf[32]; + +} pbkdf2_sha512_t; + +typedef struct +{ + u32 salt_buf[128]; + u32 salt_len; + +} rakp_t; + +typedef struct +{ + u32 data_len; + u32 data_buf[512]; + +} cloudkey_t; + +typedef struct +{ + u32 encryptedVerifier[4]; + u32 encryptedVerifierHash[5]; + + u32 keySize; + +} office2007_t; + +typedef struct +{ + u32 encryptedVerifier[4]; + u32 encryptedVerifierHash[8]; + +} office2010_t; + +typedef struct +{ + u32 encryptedVerifier[4]; + u32 encryptedVerifierHash[8]; + +} office2013_t; + +typedef struct +{ + u32 version; + u32 encryptedVerifier[4]; + u32 encryptedVerifierHash[4]; + u32 rc4key[2]; + +} oldoffice01_t; + +typedef struct +{ + u32 version; + u32 encryptedVerifier[4]; + u32 encryptedVerifierHash[5]; + u32 rc4key[2]; + +} oldoffice34_t; + +typedef struct +{ + u32x digest[4]; + u32x out[4]; + +} pdf14_tmp_t; + +typedef struct +{ + union + { + u32 dgst32[16]; + u64 dgst64[8]; + }; + + u32 dgst_len; + u32 W_len; + +} pdf17l8_tmp_t; + +typedef struct +{ + u32x digest_buf[4]; + +} phpass_tmp_t; + +typedef struct +{ + u32x digest_buf[4]; + +} md5crypt_tmp_t; + +typedef struct +{ + u32x alt_result[8]; + + u32x p_bytes[4]; + u32x s_bytes[4]; + +} sha256crypt_tmp_t; + +typedef struct +{ + u64x l_alt_result[8]; + + u64x l_p_bytes[2]; + u64x l_s_bytes[2]; + +} sha512crypt_tmp_t; + +typedef struct +{ + u32x ipad[5]; + u32x opad[5]; + + u32x dgst[10]; + u32x out[10]; + +} wpa_tmp_t; + +typedef struct +{ + u64x dgst[8]; + +} bitcoin_wallet_tmp_t; + +typedef struct +{ + u32x ipad[5]; + u32x opad[5]; + + u32x dgst[5]; + u32x out[4]; + +} dcc2_tmp_t; + +typedef struct +{ + u32x P[18]; + + u32x S0[256]; + u32x S1[256]; + u32x S2[256]; + u32x S3[256]; + +} bcrypt_tmp_t; + +typedef struct +{ + u32x digest[2]; + + u32x P[18]; + + u32x S0[256]; + u32x S1[256]; + u32x S2[256]; + u32x S3[256]; + +} pwsafe2_tmp_t; + +typedef struct +{ + u32x digest_buf[8]; + +} pwsafe3_tmp_t; + +typedef struct +{ + u32x digest_buf[5]; + +} androidpin_tmp_t; + +typedef struct +{ + u32x ipad[5]; + u32x opad[5]; + + u32x dgst[10]; + u32x out[10]; + +} androidfde_tmp_t; + +typedef struct +{ + u32x ipad[16]; + u32x opad[16]; + + u32x dgst[64]; + u32x out[64]; + +} tc_tmp_t; + +typedef struct +{ + u64x ipad[8]; + u64x opad[8]; + + u64x dgst[32]; + u64x out[32]; + +} tc64_tmp_t; + +typedef struct +{ + u32x ipad[4]; + u32x opad[4]; + + u32x dgst[32]; + u32x out[32]; + +} pbkdf2_md5_tmp_t; + +typedef struct +{ + u32x ipad[5]; + u32x opad[5]; + + u32x dgst[32]; + u32x out[32]; + +} pbkdf2_sha1_tmp_t; + +typedef struct +{ + u32x ipad[8]; + u32x opad[8]; + + u32x dgst[32]; + u32x out[32]; + +} pbkdf2_sha256_tmp_t; + +typedef struct +{ + u64x ipad[8]; + u64x opad[8]; + + u64x dgst[16]; + u64x out[16]; + +} pbkdf2_sha512_tmp_t; + +typedef struct +{ + u64x out[8]; + +} ecryptfs_tmp_t; + +typedef struct +{ + u64x ipad[8]; + u64x opad[8]; + + u64x dgst[16]; + u64x out[16]; + +} oraclet_tmp_t; + +typedef struct +{ + u32x ipad[5]; + u32x opad[5]; + + u32x dgst[5]; + u32x out[5]; + +} agilekey_tmp_t; + +typedef struct +{ + u32 ipad[5]; + u32 opad[5]; + + u32 dgst1[5]; + u32 out1[5]; + + u32 dgst2[5]; + u32 out2[5]; + +} mywallet_tmp_t; + +typedef struct +{ + u32x ipad[5]; + u32x opad[5]; + + u32x dgst[5]; + u32x out[5]; + +} sha1aix_tmp_t; + +typedef struct +{ + u32x ipad[8]; + u32x opad[8]; + + u32x dgst[8]; + u32x out[8]; + +} sha256aix_tmp_t; + +typedef struct +{ + u64x ipad[8]; + u64x opad[8]; + + u64x dgst[8]; + u64x out[8]; + +} sha512aix_tmp_t; + +typedef struct +{ + u32x ipad[8]; + u32x opad[8]; + + u32x dgst[8]; + u32x out[8]; + +} lastpass_tmp_t; + +typedef struct +{ + u64x digest_buf[8]; + +} drupal7_tmp_t; + +typedef struct +{ + u32x ipad[5]; + u32x opad[5]; + + u32x dgst[5]; + u32x out[5]; + +} lotus8_tmp_t; + +typedef struct +{ + u32x out[5]; + +} office2007_tmp_t; + +typedef struct +{ + u32x out[5]; + +} office2010_tmp_t; + +typedef struct +{ + u64x out[8]; + +} office2013_tmp_t; + +typedef struct +{ + u32x digest_buf[5]; + +} saph_sha1_tmp_t; + +typedef struct +{ + u32x block[16]; + + u32x dgst[8]; + + u32x block_len; + u32x final_len; + +} seven_zip_tmp_t; + +typedef struct +{ + u32x Kc[16]; + u32x Kd[16]; + + u32x iv[2]; + +} bsdicrypt_tmp_t; + +typedef struct +{ + u32 dgst[17][5]; + +} rar3_tmp_t; + +typedef struct +{ + u32 user[16]; + +} cram_md5_t; + +typedef struct +{ + u32 iv_buf[4]; + u32 iv_len; + + u32 salt_buf[4]; + u32 salt_len; + + u32 crc; + + u32 data_buf[96]; + u32 data_len; + + u32 unpack_size; + +} seven_zip_t; + +typedef struct +{ + u32 key; + u64 val; + +} hcstat_table_t; + +typedef struct +{ + u32 cs_buf[0x100]; + u32 cs_len; + +} cs_t; + +typedef struct +{ + u32 cmds[15]; + +} gpu_rule_t; + +/* +typedef struct +{ + u32 plain_buf[16]; + u32 plailen; + +} plain_t; +*/ + +typedef struct +{ + u32 gidvid; + u32 il_pos; + +} plain_t; + +typedef struct +{ + #ifdef _SCALAR_ + u32 i[64]; + #else + #ifdef VECT_SIZE4 + u32x i[16]; + #endif + + #ifdef VECT_SIZE2 + u32x i[32]; + #endif + + #ifdef VECT_SIZE1 + u32x i[64]; + #endif + #endif + + u32 pw_len; + u32 alignment_placeholder_1; + u32 alignment_placeholder_2; + u32 alignment_placeholder_3; + +} pw_t; + +typedef struct +{ + u32 i; + +} bf_t; + +typedef struct +{ + u32 i[8]; + + u32 pw_len; + +} comb_t; + +typedef struct +{ + u32 b[32]; + +} bs_word_t; diff --git a/obj/.lock b/obj/.lock new file mode 100644 index 0000000000..e69de29bb2 diff --git a/oclExample0.cmd b/oclExample0.cmd new file mode 100644 index 0000000000..7b948c1d15 --- /dev/null +++ b/oclExample0.cmd @@ -0,0 +1,2 @@ +oclHashcat64.exe -t 32 -a 7 example0.hash ?a?a?a?a example.dict +pause diff --git a/oclExample0.sh b/oclExample0.sh new file mode 100755 index 0000000000..8227431b4f --- /dev/null +++ b/oclExample0.sh @@ -0,0 +1 @@ +./oclHashcat64.bin -t 32 -a 7 example0.hash ?a?a?a?a example.dict diff --git a/oclExample400.cmd b/oclExample400.cmd new file mode 100644 index 0000000000..0c12ffa2a7 --- /dev/null +++ b/oclExample400.cmd @@ -0,0 +1,2 @@ +type example.dict | oclHashcat64.exe -m 400 example400.hash +pause diff --git a/oclExample400.sh b/oclExample400.sh new file mode 100755 index 0000000000..e0c4dc1e35 --- /dev/null +++ b/oclExample400.sh @@ -0,0 +1 @@ +cat example.dict | ./oclHashcat64.bin -m 400 example400.hash diff --git a/oclExample500.cmd b/oclExample500.cmd new file mode 100644 index 0000000000..24531c78cb --- /dev/null +++ b/oclExample500.cmd @@ -0,0 +1,2 @@ +oclHashcat64.exe -m 500 example500.hash example.dict +pause diff --git a/oclExample500.sh b/oclExample500.sh new file mode 100755 index 0000000000..40be27c324 --- /dev/null +++ b/oclExample500.sh @@ -0,0 +1 @@ +./oclHashcat64.bin -m 500 example500.hash example.dict diff --git a/rules/Incisive-leetspeak.rule b/rules/Incisive-leetspeak.rule new file mode 100644 index 0000000000..010a618e1f --- /dev/null +++ b/rules/Incisive-leetspeak.rule @@ -0,0 +1,15487 @@ +sa@ +sa@sb6 +sa@sb6sc{ +sa@sb6sc{se3 +sa@sb6sc{se3sg9 +sa@sb6sc{se3sg9si! +sa@sb6sc{se3sg9si!so0 +sa@sb6sc{se3sg9si!so0sq9 +sa@sb6sc{se3sg9si!so0sq9ss$ +sa@sb6sc{se3sg9si!so0sq9ss$st+ +sa@sb6sc{se3sg9si!so0sq9ss$st+sx% +sa@sb6sc{se3sg9si!so0sq9ss$st7 +sa@sb6sc{se3sg9si!so0sq9ss$st7sx% +sa@sb6sc{se3sg9si!so0sq9ss$sx% +sa@sb6sc{se3sg9si!so0sq9ss5 +sa@sb6sc{se3sg9si!so0sq9ss5st+ +sa@sb6sc{se3sg9si!so0sq9ss5st+sx% +sa@sb6sc{se3sg9si!so0sq9ss5st7 +sa@sb6sc{se3sg9si!so0sq9ss5st7sx% +sa@sb6sc{se3sg9si!so0sq9ss5sx% +sa@sb6sc{se3sg9si!so0sq9st+ +sa@sb6sc{se3sg9si!so0sq9st+sx% +sa@sb6sc{se3sg9si!so0sq9st7 +sa@sb6sc{se3sg9si!so0sq9st7sx% +sa@sb6sc{se3sg9si!so0sq9sx% +sa@sb6sc{se3sg9si!so0ss$ +sa@sb6sc{se3sg9si!so0ss$st+ +sa@sb6sc{se3sg9si!so0ss$st+sx% +sa@sb6sc{se3sg9si!so0ss$st7 +sa@sb6sc{se3sg9si!so0ss$st7sx% +sa@sb6sc{se3sg9si!so0ss$sx% +sa@sb6sc{se3sg9si!so0ss5 +sa@sb6sc{se3sg9si!so0ss5st+ +sa@sb6sc{se3sg9si!so0ss5st+sx% +sa@sb6sc{se3sg9si!so0ss5st7 +sa@sb6sc{se3sg9si!so0ss5st7sx% +sa@sb6sc{se3sg9si!so0ss5sx% +sa@sb6sc{se3sg9si!so0st+ +sa@sb6sc{se3sg9si!so0st+sx% +sa@sb6sc{se3sg9si!so0st7 +sa@sb6sc{se3sg9si!so0st7sx% +sa@sb6sc{se3sg9si!so0sx% +sa@sb6sc{se3sg9si!sq9 +sa@sb6sc{se3sg9si!sq9ss$ +sa@sb6sc{se3sg9si!sq9ss$st+ +sa@sb6sc{se3sg9si!sq9ss$st+sx% +sa@sb6sc{se3sg9si!sq9ss$st7 +sa@sb6sc{se3sg9si!sq9ss$st7sx% +sa@sb6sc{se3sg9si!sq9ss$sx% +sa@sb6sc{se3sg9si!sq9ss5 +sa@sb6sc{se3sg9si!sq9ss5st+ +sa@sb6sc{se3sg9si!sq9ss5st+sx% +sa@sb6sc{se3sg9si!sq9ss5st7 +sa@sb6sc{se3sg9si!sq9ss5st7sx% +sa@sb6sc{se3sg9si!sq9ss5sx% +sa@sb6sc{se3sg9si!sq9st+ +sa@sb6sc{se3sg9si!sq9st+sx% +sa@sb6sc{se3sg9si!sq9st7 +sa@sb6sc{se3sg9si!sq9st7sx% +sa@sb6sc{se3sg9si!sq9sx% +sa@sb6sc{se3sg9si!ss$ +sa@sb6sc{se3sg9si!ss$st+ +sa@sb6sc{se3sg9si!ss$st+sx% +sa@sb6sc{se3sg9si!ss$st7 +sa@sb6sc{se3sg9si!ss$st7sx% +sa@sb6sc{se3sg9si!ss$sx% +sa@sb6sc{se3sg9si!ss5 +sa@sb6sc{se3sg9si!ss5st+ +sa@sb6sc{se3sg9si!ss5st+sx% +sa@sb6sc{se3sg9si!ss5st7 +sa@sb6sc{se3sg9si!ss5st7sx% +sa@sb6sc{se3sg9si!ss5sx% +sa@sb6sc{se3sg9si!st+ +sa@sb6sc{se3sg9si!st+sx% +sa@sb6sc{se3sg9si!st7 +sa@sb6sc{se3sg9si!st7sx% +sa@sb6sc{se3sg9si!sx% +sa@sb6sc{se3sg9si1 +sa@sb6sc{se3sg9si1so0 +sa@sb6sc{se3sg9si1so0sq9 +sa@sb6sc{se3sg9si1so0sq9ss$ +sa@sb6sc{se3sg9si1so0sq9ss$st+ +sa@sb6sc{se3sg9si1so0sq9ss$st+sx% +sa@sb6sc{se3sg9si1so0sq9ss$st7 +sa@sb6sc{se3sg9si1so0sq9ss$st7sx% +sa@sb6sc{se3sg9si1so0sq9ss$sx% +sa@sb6sc{se3sg9si1so0sq9ss5 +sa@sb6sc{se3sg9si1so0sq9ss5st+ +sa@sb6sc{se3sg9si1so0sq9ss5st+sx% +sa@sb6sc{se3sg9si1so0sq9ss5st7 +sa@sb6sc{se3sg9si1so0sq9ss5st7sx% +sa@sb6sc{se3sg9si1so0sq9ss5sx% +sa@sb6sc{se3sg9si1so0sq9st+ +sa@sb6sc{se3sg9si1so0sq9st+sx% +sa@sb6sc{se3sg9si1so0sq9st7 +sa@sb6sc{se3sg9si1so0sq9st7sx% +sa@sb6sc{se3sg9si1so0sq9sx% +sa@sb6sc{se3sg9si1so0ss$ +sa@sb6sc{se3sg9si1so0ss$st+ +sa@sb6sc{se3sg9si1so0ss$st+sx% +sa@sb6sc{se3sg9si1so0ss$st7 +sa@sb6sc{se3sg9si1so0ss$st7sx% +sa@sb6sc{se3sg9si1so0ss$sx% +sa@sb6sc{se3sg9si1so0ss5 +sa@sb6sc{se3sg9si1so0ss5st+ +sa@sb6sc{se3sg9si1so0ss5st+sx% +sa@sb6sc{se3sg9si1so0ss5st7 +sa@sb6sc{se3sg9si1so0ss5st7sx% +sa@sb6sc{se3sg9si1so0ss5sx% +sa@sb6sc{se3sg9si1so0st+ +sa@sb6sc{se3sg9si1so0st+sx% +sa@sb6sc{se3sg9si1so0st7 +sa@sb6sc{se3sg9si1so0st7sx% +sa@sb6sc{se3sg9si1so0sx% +sa@sb6sc{se3sg9si1sq9 +sa@sb6sc{se3sg9si1sq9ss$ +sa@sb6sc{se3sg9si1sq9ss$st+ +sa@sb6sc{se3sg9si1sq9ss$st+sx% +sa@sb6sc{se3sg9si1sq9ss$st7 +sa@sb6sc{se3sg9si1sq9ss$st7sx% +sa@sb6sc{se3sg9si1sq9ss$sx% +sa@sb6sc{se3sg9si1sq9ss5 +sa@sb6sc{se3sg9si1sq9ss5st+ +sa@sb6sc{se3sg9si1sq9ss5st+sx% +sa@sb6sc{se3sg9si1sq9ss5st7 +sa@sb6sc{se3sg9si1sq9ss5st7sx% +sa@sb6sc{se3sg9si1sq9ss5sx% +sa@sb6sc{se3sg9si1sq9st+ +sa@sb6sc{se3sg9si1sq9st+sx% +sa@sb6sc{se3sg9si1sq9st7 +sa@sb6sc{se3sg9si1sq9st7sx% +sa@sb6sc{se3sg9si1sq9sx% +sa@sb6sc{se3sg9si1ss$ +sa@sb6sc{se3sg9si1ss$st+ +sa@sb6sc{se3sg9si1ss$st+sx% +sa@sb6sc{se3sg9si1ss$st7 +sa@sb6sc{se3sg9si1ss$st7sx% +sa@sb6sc{se3sg9si1ss$sx% +sa@sb6sc{se3sg9si1ss5 +sa@sb6sc{se3sg9si1ss5st+ +sa@sb6sc{se3sg9si1ss5st+sx% +sa@sb6sc{se3sg9si1ss5st7 +sa@sb6sc{se3sg9si1ss5st7sx% +sa@sb6sc{se3sg9si1ss5sx% +sa@sb6sc{se3sg9si1st+ +sa@sb6sc{se3sg9si1st+sx% +sa@sb6sc{se3sg9si1st7 +sa@sb6sc{se3sg9si1st7sx% +sa@sb6sc{se3sg9si1sx% +sa@sb6sc{se3sg9so0 +sa@sb6sc{se3sg9so0sq9 +sa@sb6sc{se3sg9so0sq9ss$ +sa@sb6sc{se3sg9so0sq9ss$st+ +sa@sb6sc{se3sg9so0sq9ss$st+sx% +sa@sb6sc{se3sg9so0sq9ss$st7 +sa@sb6sc{se3sg9so0sq9ss$st7sx% +sa@sb6sc{se3sg9so0sq9ss$sx% +sa@sb6sc{se3sg9so0sq9ss5 +sa@sb6sc{se3sg9so0sq9ss5st+ +sa@sb6sc{se3sg9so0sq9ss5st+sx% +sa@sb6sc{se3sg9so0sq9ss5st7 +sa@sb6sc{se3sg9so0sq9ss5st7sx% +sa@sb6sc{se3sg9so0sq9ss5sx% +sa@sb6sc{se3sg9so0sq9st+ +sa@sb6sc{se3sg9so0sq9st+sx% +sa@sb6sc{se3sg9so0sq9st7 +sa@sb6sc{se3sg9so0sq9st7sx% +sa@sb6sc{se3sg9so0sq9sx% +sa@sb6sc{se3sg9so0ss$ +sa@sb6sc{se3sg9so0ss$st+ +sa@sb6sc{se3sg9so0ss$st+sx% +sa@sb6sc{se3sg9so0ss$st7 +sa@sb6sc{se3sg9so0ss$st7sx% +sa@sb6sc{se3sg9so0ss$sx% +sa@sb6sc{se3sg9so0ss5 +sa@sb6sc{se3sg9so0ss5st+ +sa@sb6sc{se3sg9so0ss5st+sx% +sa@sb6sc{se3sg9so0ss5st7 +sa@sb6sc{se3sg9so0ss5st7sx% +sa@sb6sc{se3sg9so0ss5sx% +sa@sb6sc{se3sg9so0st+ +sa@sb6sc{se3sg9so0st+sx% +sa@sb6sc{se3sg9so0st7 +sa@sb6sc{se3sg9so0st7sx% +sa@sb6sc{se3sg9so0sx% +sa@sb6sc{se3sg9sq9 +sa@sb6sc{se3sg9sq9ss$ +sa@sb6sc{se3sg9sq9ss$st+ +sa@sb6sc{se3sg9sq9ss$st+sx% +sa@sb6sc{se3sg9sq9ss$st7 +sa@sb6sc{se3sg9sq9ss$st7sx% +sa@sb6sc{se3sg9sq9ss$sx% +sa@sb6sc{se3sg9sq9ss5 +sa@sb6sc{se3sg9sq9ss5st+ +sa@sb6sc{se3sg9sq9ss5st+sx% +sa@sb6sc{se3sg9sq9ss5st7 +sa@sb6sc{se3sg9sq9ss5st7sx% +sa@sb6sc{se3sg9sq9ss5sx% +sa@sb6sc{se3sg9sq9st+ +sa@sb6sc{se3sg9sq9st+sx% +sa@sb6sc{se3sg9sq9st7 +sa@sb6sc{se3sg9sq9st7sx% +sa@sb6sc{se3sg9sq9sx% +sa@sb6sc{se3sg9ss$ +sa@sb6sc{se3sg9ss$st+ +sa@sb6sc{se3sg9ss$st+sx% +sa@sb6sc{se3sg9ss$st7 +sa@sb6sc{se3sg9ss$st7sx% +sa@sb6sc{se3sg9ss$sx% +sa@sb6sc{se3sg9ss5 +sa@sb6sc{se3sg9ss5st+ +sa@sb6sc{se3sg9ss5st+sx% +sa@sb6sc{se3sg9ss5st7 +sa@sb6sc{se3sg9ss5st7sx% +sa@sb6sc{se3sg9ss5sx% +sa@sb6sc{se3sg9st+ +sa@sb6sc{se3sg9st+sx% +sa@sb6sc{se3sg9st7 +sa@sb6sc{se3sg9st7sx% +sa@sb6sc{se3sg9sx% +sa@sb6sc{se3si! +sa@sb6sc{se3si!so0 +sa@sb6sc{se3si!so0sq9 +sa@sb6sc{se3si!so0sq9ss$ +sa@sb6sc{se3si!so0sq9ss$st+ +sa@sb6sc{se3si!so0sq9ss$st+sx% +sa@sb6sc{se3si!so0sq9ss$st7 +sa@sb6sc{se3si!so0sq9ss$st7sx% +sa@sb6sc{se3si!so0sq9ss$sx% +sa@sb6sc{se3si!so0sq9ss5 +sa@sb6sc{se3si!so0sq9ss5st+ +sa@sb6sc{se3si!so0sq9ss5st+sx% +sa@sb6sc{se3si!so0sq9ss5st7 +sa@sb6sc{se3si!so0sq9ss5st7sx% +sa@sb6sc{se3si!so0sq9ss5sx% +sa@sb6sc{se3si!so0sq9st+ +sa@sb6sc{se3si!so0sq9st+sx% +sa@sb6sc{se3si!so0sq9st7 +sa@sb6sc{se3si!so0sq9st7sx% +sa@sb6sc{se3si!so0sq9sx% +sa@sb6sc{se3si!so0ss$ +sa@sb6sc{se3si!so0ss$st+ +sa@sb6sc{se3si!so0ss$st+sx% +sa@sb6sc{se3si!so0ss$st7 +sa@sb6sc{se3si!so0ss$st7sx% +sa@sb6sc{se3si!so0ss$sx% +sa@sb6sc{se3si!so0ss5 +sa@sb6sc{se3si!so0ss5st+ +sa@sb6sc{se3si!so0ss5st+sx% +sa@sb6sc{se3si!so0ss5st7 +sa@sb6sc{se3si!so0ss5st7sx% +sa@sb6sc{se3si!so0ss5sx% +sa@sb6sc{se3si!so0st+ +sa@sb6sc{se3si!so0st+sx% +sa@sb6sc{se3si!so0st7 +sa@sb6sc{se3si!so0st7sx% +sa@sb6sc{se3si!so0sx% +sa@sb6sc{se3si!sq9 +sa@sb6sc{se3si!sq9ss$ +sa@sb6sc{se3si!sq9ss$st+ +sa@sb6sc{se3si!sq9ss$st+sx% +sa@sb6sc{se3si!sq9ss$st7 +sa@sb6sc{se3si!sq9ss$st7sx% +sa@sb6sc{se3si!sq9ss$sx% +sa@sb6sc{se3si!sq9ss5 +sa@sb6sc{se3si!sq9ss5st+ +sa@sb6sc{se3si!sq9ss5st+sx% +sa@sb6sc{se3si!sq9ss5st7 +sa@sb6sc{se3si!sq9ss5st7sx% +sa@sb6sc{se3si!sq9ss5sx% +sa@sb6sc{se3si!sq9st+ +sa@sb6sc{se3si!sq9st+sx% +sa@sb6sc{se3si!sq9st7 +sa@sb6sc{se3si!sq9st7sx% +sa@sb6sc{se3si!sq9sx% +sa@sb6sc{se3si!ss$ +sa@sb6sc{se3si!ss$st+ +sa@sb6sc{se3si!ss$st+sx% +sa@sb6sc{se3si!ss$st7 +sa@sb6sc{se3si!ss$st7sx% +sa@sb6sc{se3si!ss$sx% +sa@sb6sc{se3si!ss5 +sa@sb6sc{se3si!ss5st+ +sa@sb6sc{se3si!ss5st+sx% +sa@sb6sc{se3si!ss5st7 +sa@sb6sc{se3si!ss5st7sx% +sa@sb6sc{se3si!ss5sx% +sa@sb6sc{se3si!st+ +sa@sb6sc{se3si!st+sx% +sa@sb6sc{se3si!st7 +sa@sb6sc{se3si!st7sx% +sa@sb6sc{se3si!sx% +sa@sb6sc{se3si1 +sa@sb6sc{se3si1so0 +sa@sb6sc{se3si1so0sq9 +sa@sb6sc{se3si1so0sq9ss$ +sa@sb6sc{se3si1so0sq9ss$st+ +sa@sb6sc{se3si1so0sq9ss$st+sx% +sa@sb6sc{se3si1so0sq9ss$st7 +sa@sb6sc{se3si1so0sq9ss$st7sx% +sa@sb6sc{se3si1so0sq9ss$sx% +sa@sb6sc{se3si1so0sq9ss5 +sa@sb6sc{se3si1so0sq9ss5st+ +sa@sb6sc{se3si1so0sq9ss5st+sx% +sa@sb6sc{se3si1so0sq9ss5st7 +sa@sb6sc{se3si1so0sq9ss5st7sx% +sa@sb6sc{se3si1so0sq9ss5sx% +sa@sb6sc{se3si1so0sq9st+ +sa@sb6sc{se3si1so0sq9st+sx% +sa@sb6sc{se3si1so0sq9st7 +sa@sb6sc{se3si1so0sq9st7sx% +sa@sb6sc{se3si1so0sq9sx% +sa@sb6sc{se3si1so0ss$ +sa@sb6sc{se3si1so0ss$st+ +sa@sb6sc{se3si1so0ss$st+sx% +sa@sb6sc{se3si1so0ss$st7 +sa@sb6sc{se3si1so0ss$st7sx% +sa@sb6sc{se3si1so0ss$sx% +sa@sb6sc{se3si1so0ss5 +sa@sb6sc{se3si1so0ss5st+ +sa@sb6sc{se3si1so0ss5st+sx% +sa@sb6sc{se3si1so0ss5st7 +sa@sb6sc{se3si1so0ss5st7sx% +sa@sb6sc{se3si1so0ss5sx% +sa@sb6sc{se3si1so0st+ +sa@sb6sc{se3si1so0st+sx% +sa@sb6sc{se3si1so0st7 +sa@sb6sc{se3si1so0st7sx% +sa@sb6sc{se3si1so0sx% +sa@sb6sc{se3si1sq9 +sa@sb6sc{se3si1sq9ss$ +sa@sb6sc{se3si1sq9ss$st+ +sa@sb6sc{se3si1sq9ss$st+sx% +sa@sb6sc{se3si1sq9ss$st7 +sa@sb6sc{se3si1sq9ss$st7sx% +sa@sb6sc{se3si1sq9ss$sx% +sa@sb6sc{se3si1sq9ss5 +sa@sb6sc{se3si1sq9ss5st+ +sa@sb6sc{se3si1sq9ss5st+sx% +sa@sb6sc{se3si1sq9ss5st7 +sa@sb6sc{se3si1sq9ss5st7sx% +sa@sb6sc{se3si1sq9ss5sx% +sa@sb6sc{se3si1sq9st+ +sa@sb6sc{se3si1sq9st+sx% +sa@sb6sc{se3si1sq9st7 +sa@sb6sc{se3si1sq9st7sx% +sa@sb6sc{se3si1sq9sx% +sa@sb6sc{se3si1ss$ +sa@sb6sc{se3si1ss$st+ +sa@sb6sc{se3si1ss$st+sx% +sa@sb6sc{se3si1ss$st7 +sa@sb6sc{se3si1ss$st7sx% +sa@sb6sc{se3si1ss$sx% +sa@sb6sc{se3si1ss5 +sa@sb6sc{se3si1ss5st+ +sa@sb6sc{se3si1ss5st+sx% +sa@sb6sc{se3si1ss5st7 +sa@sb6sc{se3si1ss5st7sx% +sa@sb6sc{se3si1ss5sx% +sa@sb6sc{se3si1st+ +sa@sb6sc{se3si1st+sx% +sa@sb6sc{se3si1st7 +sa@sb6sc{se3si1st7sx% +sa@sb6sc{se3si1sx% +sa@sb6sc{se3so0 +sa@sb6sc{se3so0sq9 +sa@sb6sc{se3so0sq9ss$ +sa@sb6sc{se3so0sq9ss$st+ +sa@sb6sc{se3so0sq9ss$st+sx% +sa@sb6sc{se3so0sq9ss$st7 +sa@sb6sc{se3so0sq9ss$st7sx% +sa@sb6sc{se3so0sq9ss$sx% +sa@sb6sc{se3so0sq9ss5 +sa@sb6sc{se3so0sq9ss5st+ +sa@sb6sc{se3so0sq9ss5st+sx% +sa@sb6sc{se3so0sq9ss5st7 +sa@sb6sc{se3so0sq9ss5st7sx% +sa@sb6sc{se3so0sq9ss5sx% +sa@sb6sc{se3so0sq9st+ +sa@sb6sc{se3so0sq9st+sx% +sa@sb6sc{se3so0sq9st7 +sa@sb6sc{se3so0sq9st7sx% +sa@sb6sc{se3so0sq9sx% +sa@sb6sc{se3so0ss$ +sa@sb6sc{se3so0ss$st+ +sa@sb6sc{se3so0ss$st+sx% +sa@sb6sc{se3so0ss$st7 +sa@sb6sc{se3so0ss$st7sx% +sa@sb6sc{se3so0ss$sx% +sa@sb6sc{se3so0ss5 +sa@sb6sc{se3so0ss5st+ +sa@sb6sc{se3so0ss5st+sx% +sa@sb6sc{se3so0ss5st7 +sa@sb6sc{se3so0ss5st7sx% +sa@sb6sc{se3so0ss5sx% +sa@sb6sc{se3so0st+ +sa@sb6sc{se3so0st+sx% +sa@sb6sc{se3so0st7 +sa@sb6sc{se3so0st7sx% +sa@sb6sc{se3so0sx% +sa@sb6sc{se3sq9 +sa@sb6sc{se3sq9ss$ +sa@sb6sc{se3sq9ss$st+ +sa@sb6sc{se3sq9ss$st+sx% +sa@sb6sc{se3sq9ss$st7 +sa@sb6sc{se3sq9ss$st7sx% +sa@sb6sc{se3sq9ss$sx% +sa@sb6sc{se3sq9ss5 +sa@sb6sc{se3sq9ss5st+ +sa@sb6sc{se3sq9ss5st+sx% +sa@sb6sc{se3sq9ss5st7 +sa@sb6sc{se3sq9ss5st7sx% +sa@sb6sc{se3sq9ss5sx% +sa@sb6sc{se3sq9st+ +sa@sb6sc{se3sq9st+sx% +sa@sb6sc{se3sq9st7 +sa@sb6sc{se3sq9st7sx% +sa@sb6sc{se3sq9sx% +sa@sb6sc{se3ss$ +sa@sb6sc{se3ss$st+ +sa@sb6sc{se3ss$st+sx% +sa@sb6sc{se3ss$st7 +sa@sb6sc{se3ss$st7sx% +sa@sb6sc{se3ss$sx% +sa@sb6sc{se3ss5 +sa@sb6sc{se3ss5st+ +sa@sb6sc{se3ss5st+sx% +sa@sb6sc{se3ss5st7 +sa@sb6sc{se3ss5st7sx% +sa@sb6sc{se3ss5sx% +sa@sb6sc{se3st+ +sa@sb6sc{se3st+sx% +sa@sb6sc{se3st7 +sa@sb6sc{se3st7sx% +sa@sb6sc{se3sx% +sa@sb6sc{sg9 +sa@sb6sc{sg9si! +sa@sb6sc{sg9si!so0 +sa@sb6sc{sg9si!so0sq9 +sa@sb6sc{sg9si!so0sq9ss$ +sa@sb6sc{sg9si!so0sq9ss$st+ +sa@sb6sc{sg9si!so0sq9ss$st+sx% +sa@sb6sc{sg9si!so0sq9ss$st7 +sa@sb6sc{sg9si!so0sq9ss$st7sx% +sa@sb6sc{sg9si!so0sq9ss$sx% +sa@sb6sc{sg9si!so0sq9ss5 +sa@sb6sc{sg9si!so0sq9ss5st+ +sa@sb6sc{sg9si!so0sq9ss5st+sx% +sa@sb6sc{sg9si!so0sq9ss5st7 +sa@sb6sc{sg9si!so0sq9ss5st7sx% +sa@sb6sc{sg9si!so0sq9ss5sx% +sa@sb6sc{sg9si!so0sq9st+ +sa@sb6sc{sg9si!so0sq9st+sx% +sa@sb6sc{sg9si!so0sq9st7 +sa@sb6sc{sg9si!so0sq9st7sx% +sa@sb6sc{sg9si!so0sq9sx% +sa@sb6sc{sg9si!so0ss$ +sa@sb6sc{sg9si!so0ss$st+ +sa@sb6sc{sg9si!so0ss$st+sx% +sa@sb6sc{sg9si!so0ss$st7 +sa@sb6sc{sg9si!so0ss$st7sx% +sa@sb6sc{sg9si!so0ss$sx% +sa@sb6sc{sg9si!so0ss5 +sa@sb6sc{sg9si!so0ss5st+ +sa@sb6sc{sg9si!so0ss5st+sx% +sa@sb6sc{sg9si!so0ss5st7 +sa@sb6sc{sg9si!so0ss5st7sx% +sa@sb6sc{sg9si!so0ss5sx% +sa@sb6sc{sg9si!so0st+ +sa@sb6sc{sg9si!so0st+sx% +sa@sb6sc{sg9si!so0st7 +sa@sb6sc{sg9si!so0st7sx% +sa@sb6sc{sg9si!so0sx% +sa@sb6sc{sg9si!sq9 +sa@sb6sc{sg9si!sq9ss$ +sa@sb6sc{sg9si!sq9ss$st+ +sa@sb6sc{sg9si!sq9ss$st+sx% +sa@sb6sc{sg9si!sq9ss$st7 +sa@sb6sc{sg9si!sq9ss$st7sx% +sa@sb6sc{sg9si!sq9ss$sx% +sa@sb6sc{sg9si!sq9ss5 +sa@sb6sc{sg9si!sq9ss5st+ +sa@sb6sc{sg9si!sq9ss5st+sx% +sa@sb6sc{sg9si!sq9ss5st7 +sa@sb6sc{sg9si!sq9ss5st7sx% +sa@sb6sc{sg9si!sq9ss5sx% +sa@sb6sc{sg9si!sq9st+ +sa@sb6sc{sg9si!sq9st+sx% +sa@sb6sc{sg9si!sq9st7 +sa@sb6sc{sg9si!sq9st7sx% +sa@sb6sc{sg9si!sq9sx% +sa@sb6sc{sg9si!ss$ +sa@sb6sc{sg9si!ss$st+ +sa@sb6sc{sg9si!ss$st+sx% +sa@sb6sc{sg9si!ss$st7 +sa@sb6sc{sg9si!ss$st7sx% +sa@sb6sc{sg9si!ss$sx% +sa@sb6sc{sg9si!ss5 +sa@sb6sc{sg9si!ss5st+ +sa@sb6sc{sg9si!ss5st+sx% +sa@sb6sc{sg9si!ss5st7 +sa@sb6sc{sg9si!ss5st7sx% +sa@sb6sc{sg9si!ss5sx% +sa@sb6sc{sg9si!st+ +sa@sb6sc{sg9si!st+sx% +sa@sb6sc{sg9si!st7 +sa@sb6sc{sg9si!st7sx% +sa@sb6sc{sg9si!sx% +sa@sb6sc{sg9si1 +sa@sb6sc{sg9si1so0 +sa@sb6sc{sg9si1so0sq9 +sa@sb6sc{sg9si1so0sq9ss$ +sa@sb6sc{sg9si1so0sq9ss$st+ +sa@sb6sc{sg9si1so0sq9ss$st+sx% +sa@sb6sc{sg9si1so0sq9ss$st7 +sa@sb6sc{sg9si1so0sq9ss$st7sx% +sa@sb6sc{sg9si1so0sq9ss$sx% +sa@sb6sc{sg9si1so0sq9ss5 +sa@sb6sc{sg9si1so0sq9ss5st+ +sa@sb6sc{sg9si1so0sq9ss5st+sx% +sa@sb6sc{sg9si1so0sq9ss5st7 +sa@sb6sc{sg9si1so0sq9ss5st7sx% +sa@sb6sc{sg9si1so0sq9ss5sx% +sa@sb6sc{sg9si1so0sq9st+ +sa@sb6sc{sg9si1so0sq9st+sx% +sa@sb6sc{sg9si1so0sq9st7 +sa@sb6sc{sg9si1so0sq9st7sx% +sa@sb6sc{sg9si1so0sq9sx% +sa@sb6sc{sg9si1so0ss$ +sa@sb6sc{sg9si1so0ss$st+ +sa@sb6sc{sg9si1so0ss$st+sx% +sa@sb6sc{sg9si1so0ss$st7 +sa@sb6sc{sg9si1so0ss$st7sx% +sa@sb6sc{sg9si1so0ss$sx% +sa@sb6sc{sg9si1so0ss5 +sa@sb6sc{sg9si1so0ss5st+ +sa@sb6sc{sg9si1so0ss5st+sx% +sa@sb6sc{sg9si1so0ss5st7 +sa@sb6sc{sg9si1so0ss5st7sx% +sa@sb6sc{sg9si1so0ss5sx% +sa@sb6sc{sg9si1so0st+ +sa@sb6sc{sg9si1so0st+sx% +sa@sb6sc{sg9si1so0st7 +sa@sb6sc{sg9si1so0st7sx% +sa@sb6sc{sg9si1so0sx% +sa@sb6sc{sg9si1sq9 +sa@sb6sc{sg9si1sq9ss$ +sa@sb6sc{sg9si1sq9ss$st+ +sa@sb6sc{sg9si1sq9ss$st+sx% +sa@sb6sc{sg9si1sq9ss$st7 +sa@sb6sc{sg9si1sq9ss$st7sx% +sa@sb6sc{sg9si1sq9ss$sx% +sa@sb6sc{sg9si1sq9ss5 +sa@sb6sc{sg9si1sq9ss5st+ +sa@sb6sc{sg9si1sq9ss5st+sx% +sa@sb6sc{sg9si1sq9ss5st7 +sa@sb6sc{sg9si1sq9ss5st7sx% +sa@sb6sc{sg9si1sq9ss5sx% +sa@sb6sc{sg9si1sq9st+ +sa@sb6sc{sg9si1sq9st+sx% +sa@sb6sc{sg9si1sq9st7 +sa@sb6sc{sg9si1sq9st7sx% +sa@sb6sc{sg9si1sq9sx% +sa@sb6sc{sg9si1ss$ +sa@sb6sc{sg9si1ss$st+ +sa@sb6sc{sg9si1ss$st+sx% +sa@sb6sc{sg9si1ss$st7 +sa@sb6sc{sg9si1ss$st7sx% +sa@sb6sc{sg9si1ss$sx% +sa@sb6sc{sg9si1ss5 +sa@sb6sc{sg9si1ss5st+ +sa@sb6sc{sg9si1ss5st+sx% +sa@sb6sc{sg9si1ss5st7 +sa@sb6sc{sg9si1ss5st7sx% +sa@sb6sc{sg9si1ss5sx% +sa@sb6sc{sg9si1st+ +sa@sb6sc{sg9si1st+sx% +sa@sb6sc{sg9si1st7 +sa@sb6sc{sg9si1st7sx% +sa@sb6sc{sg9si1sx% +sa@sb6sc{sg9so0 +sa@sb6sc{sg9so0sq9 +sa@sb6sc{sg9so0sq9ss$ +sa@sb6sc{sg9so0sq9ss$st+ +sa@sb6sc{sg9so0sq9ss$st+sx% +sa@sb6sc{sg9so0sq9ss$st7 +sa@sb6sc{sg9so0sq9ss$st7sx% +sa@sb6sc{sg9so0sq9ss$sx% +sa@sb6sc{sg9so0sq9ss5 +sa@sb6sc{sg9so0sq9ss5st+ +sa@sb6sc{sg9so0sq9ss5st+sx% +sa@sb6sc{sg9so0sq9ss5st7 +sa@sb6sc{sg9so0sq9ss5st7sx% +sa@sb6sc{sg9so0sq9ss5sx% +sa@sb6sc{sg9so0sq9st+ +sa@sb6sc{sg9so0sq9st+sx% +sa@sb6sc{sg9so0sq9st7 +sa@sb6sc{sg9so0sq9st7sx% +sa@sb6sc{sg9so0sq9sx% +sa@sb6sc{sg9so0ss$ +sa@sb6sc{sg9so0ss$st+ +sa@sb6sc{sg9so0ss$st+sx% +sa@sb6sc{sg9so0ss$st7 +sa@sb6sc{sg9so0ss$st7sx% +sa@sb6sc{sg9so0ss$sx% +sa@sb6sc{sg9so0ss5 +sa@sb6sc{sg9so0ss5st+ +sa@sb6sc{sg9so0ss5st+sx% +sa@sb6sc{sg9so0ss5st7 +sa@sb6sc{sg9so0ss5st7sx% +sa@sb6sc{sg9so0ss5sx% +sa@sb6sc{sg9so0st+ +sa@sb6sc{sg9so0st+sx% +sa@sb6sc{sg9so0st7 +sa@sb6sc{sg9so0st7sx% +sa@sb6sc{sg9so0sx% +sa@sb6sc{sg9sq9 +sa@sb6sc{sg9sq9ss$ +sa@sb6sc{sg9sq9ss$st+ +sa@sb6sc{sg9sq9ss$st+sx% +sa@sb6sc{sg9sq9ss$st7 +sa@sb6sc{sg9sq9ss$st7sx% +sa@sb6sc{sg9sq9ss$sx% +sa@sb6sc{sg9sq9ss5 +sa@sb6sc{sg9sq9ss5st+ +sa@sb6sc{sg9sq9ss5st+sx% +sa@sb6sc{sg9sq9ss5st7 +sa@sb6sc{sg9sq9ss5st7sx% +sa@sb6sc{sg9sq9ss5sx% +sa@sb6sc{sg9sq9st+ +sa@sb6sc{sg9sq9st+sx% +sa@sb6sc{sg9sq9st7 +sa@sb6sc{sg9sq9st7sx% +sa@sb6sc{sg9sq9sx% +sa@sb6sc{sg9ss$ +sa@sb6sc{sg9ss$st+ +sa@sb6sc{sg9ss$st+sx% +sa@sb6sc{sg9ss$st7 +sa@sb6sc{sg9ss$st7sx% +sa@sb6sc{sg9ss$sx% +sa@sb6sc{sg9ss5 +sa@sb6sc{sg9ss5st+ +sa@sb6sc{sg9ss5st+sx% +sa@sb6sc{sg9ss5st7 +sa@sb6sc{sg9ss5st7sx% +sa@sb6sc{sg9ss5sx% +sa@sb6sc{sg9st+ +sa@sb6sc{sg9st+sx% +sa@sb6sc{sg9st7 +sa@sb6sc{sg9st7sx% +sa@sb6sc{sg9sx% +sa@sb6sc{si! +sa@sb6sc{si!so0 +sa@sb6sc{si!so0sq9 +sa@sb6sc{si!so0sq9ss$ +sa@sb6sc{si!so0sq9ss$st+ +sa@sb6sc{si!so0sq9ss$st+sx% +sa@sb6sc{si!so0sq9ss$st7 +sa@sb6sc{si!so0sq9ss$st7sx% +sa@sb6sc{si!so0sq9ss$sx% +sa@sb6sc{si!so0sq9ss5 +sa@sb6sc{si!so0sq9ss5st+ +sa@sb6sc{si!so0sq9ss5st+sx% +sa@sb6sc{si!so0sq9ss5st7 +sa@sb6sc{si!so0sq9ss5st7sx% +sa@sb6sc{si!so0sq9ss5sx% +sa@sb6sc{si!so0sq9st+ +sa@sb6sc{si!so0sq9st+sx% +sa@sb6sc{si!so0sq9st7 +sa@sb6sc{si!so0sq9st7sx% +sa@sb6sc{si!so0sq9sx% +sa@sb6sc{si!so0ss$ +sa@sb6sc{si!so0ss$st+ +sa@sb6sc{si!so0ss$st+sx% +sa@sb6sc{si!so0ss$st7 +sa@sb6sc{si!so0ss$st7sx% +sa@sb6sc{si!so0ss$sx% +sa@sb6sc{si!so0ss5 +sa@sb6sc{si!so0ss5st+ +sa@sb6sc{si!so0ss5st+sx% +sa@sb6sc{si!so0ss5st7 +sa@sb6sc{si!so0ss5st7sx% +sa@sb6sc{si!so0ss5sx% +sa@sb6sc{si!so0st+ +sa@sb6sc{si!so0st+sx% +sa@sb6sc{si!so0st7 +sa@sb6sc{si!so0st7sx% +sa@sb6sc{si!so0sx% +sa@sb6sc{si!sq9 +sa@sb6sc{si!sq9ss$ +sa@sb6sc{si!sq9ss$st+ +sa@sb6sc{si!sq9ss$st+sx% +sa@sb6sc{si!sq9ss$st7 +sa@sb6sc{si!sq9ss$st7sx% +sa@sb6sc{si!sq9ss$sx% +sa@sb6sc{si!sq9ss5 +sa@sb6sc{si!sq9ss5st+ +sa@sb6sc{si!sq9ss5st+sx% +sa@sb6sc{si!sq9ss5st7 +sa@sb6sc{si!sq9ss5st7sx% +sa@sb6sc{si!sq9ss5sx% +sa@sb6sc{si!sq9st+ +sa@sb6sc{si!sq9st+sx% +sa@sb6sc{si!sq9st7 +sa@sb6sc{si!sq9st7sx% +sa@sb6sc{si!sq9sx% +sa@sb6sc{si!ss$ +sa@sb6sc{si!ss$st+ +sa@sb6sc{si!ss$st+sx% +sa@sb6sc{si!ss$st7 +sa@sb6sc{si!ss$st7sx% +sa@sb6sc{si!ss$sx% +sa@sb6sc{si!ss5 +sa@sb6sc{si!ss5st+ +sa@sb6sc{si!ss5st+sx% +sa@sb6sc{si!ss5st7 +sa@sb6sc{si!ss5st7sx% +sa@sb6sc{si!ss5sx% +sa@sb6sc{si!st+ +sa@sb6sc{si!st+sx% +sa@sb6sc{si!st7 +sa@sb6sc{si!st7sx% +sa@sb6sc{si!sx% +sa@sb6sc{si1 +sa@sb6sc{si1so0 +sa@sb6sc{si1so0sq9 +sa@sb6sc{si1so0sq9ss$ +sa@sb6sc{si1so0sq9ss$st+ +sa@sb6sc{si1so0sq9ss$st+sx% +sa@sb6sc{si1so0sq9ss$st7 +sa@sb6sc{si1so0sq9ss$st7sx% +sa@sb6sc{si1so0sq9ss$sx% +sa@sb6sc{si1so0sq9ss5 +sa@sb6sc{si1so0sq9ss5st+ +sa@sb6sc{si1so0sq9ss5st+sx% +sa@sb6sc{si1so0sq9ss5st7 +sa@sb6sc{si1so0sq9ss5st7sx% +sa@sb6sc{si1so0sq9ss5sx% +sa@sb6sc{si1so0sq9st+ +sa@sb6sc{si1so0sq9st+sx% +sa@sb6sc{si1so0sq9st7 +sa@sb6sc{si1so0sq9st7sx% +sa@sb6sc{si1so0sq9sx% +sa@sb6sc{si1so0ss$ +sa@sb6sc{si1so0ss$st+ +sa@sb6sc{si1so0ss$st+sx% +sa@sb6sc{si1so0ss$st7 +sa@sb6sc{si1so0ss$st7sx% +sa@sb6sc{si1so0ss$sx% +sa@sb6sc{si1so0ss5 +sa@sb6sc{si1so0ss5st+ +sa@sb6sc{si1so0ss5st+sx% +sa@sb6sc{si1so0ss5st7 +sa@sb6sc{si1so0ss5st7sx% +sa@sb6sc{si1so0ss5sx% +sa@sb6sc{si1so0st+ +sa@sb6sc{si1so0st+sx% +sa@sb6sc{si1so0st7 +sa@sb6sc{si1so0st7sx% +sa@sb6sc{si1so0sx% +sa@sb6sc{si1sq9 +sa@sb6sc{si1sq9ss$ +sa@sb6sc{si1sq9ss$st+ +sa@sb6sc{si1sq9ss$st+sx% +sa@sb6sc{si1sq9ss$st7 +sa@sb6sc{si1sq9ss$st7sx% +sa@sb6sc{si1sq9ss$sx% +sa@sb6sc{si1sq9ss5 +sa@sb6sc{si1sq9ss5st+ +sa@sb6sc{si1sq9ss5st+sx% +sa@sb6sc{si1sq9ss5st7 +sa@sb6sc{si1sq9ss5st7sx% +sa@sb6sc{si1sq9ss5sx% +sa@sb6sc{si1sq9st+ +sa@sb6sc{si1sq9st+sx% +sa@sb6sc{si1sq9st7 +sa@sb6sc{si1sq9st7sx% +sa@sb6sc{si1sq9sx% +sa@sb6sc{si1ss$ +sa@sb6sc{si1ss$st+ +sa@sb6sc{si1ss$st+sx% +sa@sb6sc{si1ss$st7 +sa@sb6sc{si1ss$st7sx% +sa@sb6sc{si1ss$sx% +sa@sb6sc{si1ss5 +sa@sb6sc{si1ss5st+ +sa@sb6sc{si1ss5st+sx% +sa@sb6sc{si1ss5st7 +sa@sb6sc{si1ss5st7sx% +sa@sb6sc{si1ss5sx% +sa@sb6sc{si1st+ +sa@sb6sc{si1st+sx% +sa@sb6sc{si1st7 +sa@sb6sc{si1st7sx% +sa@sb6sc{si1sx% +sa@sb6sc{so0 +sa@sb6sc{so0sq9 +sa@sb6sc{so0sq9ss$ +sa@sb6sc{so0sq9ss$st+ +sa@sb6sc{so0sq9ss$st+sx% +sa@sb6sc{so0sq9ss$st7 +sa@sb6sc{so0sq9ss$st7sx% +sa@sb6sc{so0sq9ss$sx% +sa@sb6sc{so0sq9ss5 +sa@sb6sc{so0sq9ss5st+ +sa@sb6sc{so0sq9ss5st+sx% +sa@sb6sc{so0sq9ss5st7 +sa@sb6sc{so0sq9ss5st7sx% +sa@sb6sc{so0sq9ss5sx% +sa@sb6sc{so0sq9st+ +sa@sb6sc{so0sq9st+sx% +sa@sb6sc{so0sq9st7 +sa@sb6sc{so0sq9st7sx% +sa@sb6sc{so0sq9sx% +sa@sb6sc{so0ss$ +sa@sb6sc{so0ss$st+ +sa@sb6sc{so0ss$st+sx% +sa@sb6sc{so0ss$st7 +sa@sb6sc{so0ss$st7sx% +sa@sb6sc{so0ss$sx% +sa@sb6sc{so0ss5 +sa@sb6sc{so0ss5st+ +sa@sb6sc{so0ss5st+sx% +sa@sb6sc{so0ss5st7 +sa@sb6sc{so0ss5st7sx% +sa@sb6sc{so0ss5sx% +sa@sb6sc{so0st+ +sa@sb6sc{so0st+sx% +sa@sb6sc{so0st7 +sa@sb6sc{so0st7sx% +sa@sb6sc{so0sx% +sa@sb6sc{sq9 +sa@sb6sc{sq9ss$ +sa@sb6sc{sq9ss$st+ +sa@sb6sc{sq9ss$st+sx% +sa@sb6sc{sq9ss$st7 +sa@sb6sc{sq9ss$st7sx% +sa@sb6sc{sq9ss$sx% +sa@sb6sc{sq9ss5 +sa@sb6sc{sq9ss5st+ +sa@sb6sc{sq9ss5st+sx% +sa@sb6sc{sq9ss5st7 +sa@sb6sc{sq9ss5st7sx% +sa@sb6sc{sq9ss5sx% +sa@sb6sc{sq9st+ +sa@sb6sc{sq9st+sx% +sa@sb6sc{sq9st7 +sa@sb6sc{sq9st7sx% +sa@sb6sc{sq9sx% +sa@sb6sc{ss$ +sa@sb6sc{ss$st+ +sa@sb6sc{ss$st+sx% +sa@sb6sc{ss$st7 +sa@sb6sc{ss$st7sx% +sa@sb6sc{ss$sx% +sa@sb6sc{ss5 +sa@sb6sc{ss5st+ +sa@sb6sc{ss5st+sx% +sa@sb6sc{ss5st7 +sa@sb6sc{ss5st7sx% +sa@sb6sc{ss5sx% +sa@sb6sc{st+ +sa@sb6sc{st+sx% +sa@sb6sc{st7 +sa@sb6sc{st7sx% +sa@sb6sc{sx% +sa@sb6sc< +sa@sb6sc^> +$?^? +$@^@ +$A^A +$B^B +$C^C +$D^D +$E^E +$F^F +$G^G +$H^H +$I^I +$J^J +$K^K +$L^L +$M^M +$N^N +$O^O +$P^P +$Q^Q +$R^R +$S^S +$T^T +$U^U +$V^V +$W^W +$X^X +$Y^Y +$Z^Z +$[^[ +$\^\ +$]^] +$^^^ +$_^_ +$`^` +$a^a +$b^b +$c^c +$d^d +$e^e +$f^f +$g^g +$h^h +$i^i +$j^j +$k^k +$l^l +$m^m +$n^n +$o^o +$p^p +$q^q +$r^r +$s^s +$t^t +$u^u +$v^v +$w^w +$x^x +$y^y +$z^z +${^{ +$|^| +$}^} +$~^~ + +d$0 +d$1 +d$2 +d$3 +d$4 +d$5 +d$6 +d$7 +d$8 +d$9 + +p3$0 +p3$1 +p3$2 +p3$3 +p3$4 +p3$5 +p3$6 +p3$7 +p3$8 +p3$9 + +p4$0 +p4$1 +p4$2 +p4$3 +p4$4 +p4$5 +p4$6 +p4$7 +p4$8 +p4$9 + +^1$2$3 +^2^1$3 +^1$2$3$4 +^2^1$3$4 +^3^2^1$4 +^1$2$3$4$5 +^2^1$3$4$5 +^3^2^1$4$5 +^4^3^2^1$5 + +$0d +$1d +$2d +$3d +$4d +$5d +$6d +$7d +$8d +$9d + +c$0d +c$1d +c$2d +c$3d +c$4d +c$5d +c$6d +c$7d +c$8d +c$9d + +cT2d +cT3d +cT4d +cT5d +cT6d +cT7d +cT8d +cT9d + +$0r +$1r +$2r +$3r +$4r +$5r +$6r +$7r +$8r +$9r + +$0f +$1f +$2f +$3f +$4f +$5f +$6f +$7f +$8f +$9f + +^0d +^1d +^2d +^3d +^4d +^5d +^6d +^7d +^8d +^9d + +c^0d +c^1d +c^2d +c^3d +c^4d +c^5d +c^6d +c^7d +c^8d +c^9d + +[$0 +[$1 +[$2 +[$3 +[$4 +[$5 +[$6 +[$7 +[$8 +[$9 + +[[$0 +[[$1 +[[$2 +[[$3 +[[$4 +[[$5 +[[$6 +[[$7 +[[$8 +[[$9 + +]^0 +]^1 +]^2 +]^3 +]^4 +]^5 +]^6 +]^7 +]^8 +]^9 + +]]^0 +]]^1 +]]^2 +]]^3 +]]^4 +]]^5 +]]^6 +]]^7 +]]^8 +]]^9 + +^!$@$# +^@^!$# + +^!$@$#$$ +^@^!$#$$ +^#^@^!$$ + +^!$@$#$$$% +^@^!$#$$$% +^#^@^!$$$% +^$^#^@^!$% + +^!$@$#$$$%$^ +^@^!$#$$$%$^ +^#^@^!$$$%$^ +^$^#^@^!$%$^ +^%^$^#^@^!$^ + +i2.i4. +i2.i4.i6. +i2.i4.i6.i8. +i2.i4.i6.i8.iA. +i2.i4.i6.i8.iA.iC. +i2.i4.i6.i8.iA.iC.iE. +i2.i4.i6.i8.iA.iC.iE.iG. + +i2-i4- +i2-i4-i6- +i2-i4-i6-i8- +i2-i4-i6-i8-iA- +i2-i4-i6-i8-iA-iC- +i2-i4-i6-i8-iA-iC-iE- +i2-i4-i6-i8-iA-iC-iE-iG- + +i2_i4_ +i2_i4_i6_ +i2_i4_i6_i8_ +i2_i4_i6_i8_iA_ +i2_i4_i6_i8_iA_iC_ +i2_i4_i6_i8_iA_iC_iE_ +i2_i4_i6_i8_iA_iC_iE_iG_ + +i2.i4.$. +i2.i4.i6.$. +i2.i4.i6.i8.$. +i2.i4.i6.i8.iA.$. +i2.i4.i6.i8.iA.iC.$. +i2.i4.i6.i8.iA.iC.iE.$. +i2.i4.i6.i8.iA.iC.iE.iG.$. + +i2.i4.^. +i2.i4.i6.^. +i2.i4.i6.i8.^. +i2.i4.i6.i8.iA.^. +i2.i4.i6.i8.iA.iC.^. +i2.i4.i6.i8.iA.iC.iE.^. +i2.i4.i6.i8.iA.iC.iE.iG.^. + +sa@ +so0 +si1 +su4 +se3 + +si! +ss5 +ss$ +sl1 +sg9 +st7 +sb5 +sb8 +ss3 +sa4 + +sa@so0 +sa@si1 +sa@su4 +sa@se3 +so0si1 +so0su4 +so0se3 +si1su4 +si1se3 +su4se3 + +csa@ +cso0 +csi1 +csu4 +cse3 + +csi! +css5 +css$ +csl1 +csg9 +cst7 +csb5 +csb8 +css3 +csa4 + +csa@so0 +csa@si1 +csa@su4 +csa@se3 +cso0si1 +cso0su4 +cso0se3 +csi1su4 +csi1se3 +csu4se3 + +Sa@ +So0 +Si1 +Su4 +Se3 + +Si! +Ss5 +Ss$ +Sl1 +Sg9 +St7 +Sb5 +Sb8 +Ss3 +Sa4 + +Sa@So0 +Sa@Si1 +Sa@Su4 +Sa@Se3 +So0Si1 +So0Su4 +So0Se3 +Si1Su4 +Si1Se3 +Su4Se3 + +si!sa@ +si!so0 +si!su4 +si!se3 +ss5sa@ +ss5so0 +ss5si1 +ss5su4 +ss5se3 +ss$sa@ +ss$so0 +ss$si1 +ss$su4 +ss$se3 +sl1sa@ +sl1so0 +sl1si1 +sl1su4 +sl1se3 +sg9sa@ +sg9so0 +sg9si1 +sg9su4 +sg9se3 +st7sa@ +st7so0 +st7si1 +st7su4 +st7se3 +sb5sa@ +sb5so0 +sb5si1 +sb5su4 +sb5se3 +sb8sa@ +sb8so0 +sb8si1 +sb8su4 +sb8se3 +ss3sa@ +ss3so0 +ss3si1 +ss3su4 +ss3se3 +sa4so0 +sa4si1 +sa4su4 +sa4se3 + +sa@u +so0u +si1u +su4u +se3u + +si!u +ss5u +ss$u +sl1u +sg9u +st7u +sb5u +sb8u +ss3u +sa4u + +sa@d +so0d +si1d +su4d +se3d + +si!d +ss5d +ss$d +sl1d +sg9d +st7d +sb5d +sb8d +ss3d +sa4d + +sa@so0si1 +su4so0si1 +se3so0si1 +ss$so0si1 + +sa@so0si! +su4so0si! +se3so0si! +ss$so0si! + +sa@si1su4 +so0si1su4 +se3si1su4 +ss$si1su4 + +sa@si!su4 +so0si!su4 +se3si!su4 +ss$si!su4 + +sa@su4se3 +so0su4se3 +si1su4se3 +si!su4se3 +ss$su4se3 + +sa@se3si1 +so0se3si1 +su4se3si1 +ss$se3si1 + +sa@se3si! +so0se3si! +su4se3si! +ss$se3si! + +sa@si1ss$ +so0si1ss$ +su4si1ss$ +se3si1ss$ + +sa@si!ss$ +so0si!ss$ +su4si!ss$ +se3si!ss$ + +sa@so0si1su4 +so0si1su4se3 +si1su4se3ss$ +sa@so0si1su4se3 +so0si1su4se3ss$ +sa@so0si1su4se3ss$ + +sa@so0si!su4 +so0si!su4se3 +si!su4se3ss$ +sa@so0si!su4se3 +so0si!su4se3ss$ +sa@so0si!su4se3ss$ + +csa@so0si1 +csu4so0si1 +cse3so0si1 +css$so0si1 + +csa@so0si! +csu4so0si! +cse3so0si! +css$so0si! + +csa@si1su4 +cso0si1su4 +cse3si1su4 +css$si1su4 + +csa@si!su4 +cso0si!su4 +cse3si!su4 +css$si!su4 + +csa@su4se3 +cso0su4se3 +csi1su4se3 +csi!su4se3 +css$su4se3 + +csa@se3si1 +cso0se3si1 +csu4se3si1 +css$se3si1 + +csa@se3si! +cso0se3si! +csu4se3si! +css$se3si! + +csa@si1ss$ +cso0si1ss$ +csu4si1ss$ +cse3si1ss$ + +csa@si!ss$ +cso0si!ss$ +csu4si!ss$ +cse3si!ss$ + +sa@T1 +so0T1 +si1T1 +su4T1 +se3T1 +si!T1 +ss5T1 +ss$T1 +sl1T1 +sg9T1 +st7T1 +sb5T1 +sb8T1 +ss3T1 +sa4T1 + +sa@T2 +so0T2 +si1T2 +su4T2 +se3T2 +si!T2 +ss5T2 +ss$T2 +sl1T2 +sg9T2 +st7T2 +sb5T2 +sb8T2 +ss3T2 +sa4T2 + +sa@T3 +so0T3 +si1T3 +su4T3 +se3T3 +si!T3 +ss5T3 +ss$T3 +sl1T3 +sg9T3 +st7T3 +sb5T3 +sb8T3 +ss3T3 +sa4T3 + +sa@T4 +so0T4 +si1T4 +su4T4 +se3T4 +si!T4 +ss5T4 +ss$T4 +sl1T4 +sg9T4 +st7T4 +sb5T4 +sb8T4 +ss3T4 +sa4T4 + +sa@T5 +so0T5 +si1T5 +su4T5 +se3T5 +si!T5 +ss5T5 +ss$T5 +sl1T5 +sg9T5 +st7T5 +sb5T5 +sb8T5 +ss3T5 +sa4T5 + +sa@T6 +so0T6 +si1T6 +su4T6 +se3T6 +si!T6 +ss5T6 +ss$T6 +sl1T6 +sg9T6 +st7T6 +sb5T6 +sb8T6 +ss3T6 +sa4T6 + +sa@T7 +so0T7 +si1T7 +su4T7 +se3T7 +si!T7 +ss5T7 +ss$T7 +sl1T7 +sg9T7 +st7T7 +sb5T7 +sb8T7 +ss3T7 +sa4T7 + +sa@T8 +so0T8 +si1T8 +su4T8 +se3T8 +si!T8 +ss5T8 +ss$T8 +sl1T8 +sg9T8 +st7T8 +sb5T8 +sb8T8 +ss3T8 +sa4T8 + +sa@T9 +so0T9 +si1T9 +su4T9 +se3T9 +si!T9 +ss5T9 +ss$T9 +sl1T9 +sg9T9 +st7T9 +sb5T9 +sb8T9 +ss3T9 +sa4T9 + +# $.Rules + +$ +$! +$" +$# +$$ +$% +$& +$' +$( +$) +$* +$+ +$, +$- +$. +$/ +$0 +$1 +$2 +$3 +$4 +$5 +$6 +$7 +$8 +$9 +$: +$; +$< +$= +$> +$? +$@ +$A +$B +$C +$D +$E +$F +$G +$H +$I +$J +$K +$L +$M +$N +$O +$P +$Q +$R +$S +$T +$U +$V +$W +$X +$Y +$Z +$[ +$\ +$] +$^ +$_ +$` +$a +$b +$c +$d +$e +$f +$g +$h +$i +$j +$k +$l +$m +$n +$o +$p +$q +$r +$s +$t +$u +$v +$w +$x +$y +$z +${ +$| +$} +$~ + +$0$0 +$1$0 +$2$0 +$3$0 +$4$0 +$5$0 +$6$0 +$7$0 +$8$0 +$9$0 +$0$1 +$1$1 +$2$1 +$3$1 +$4$1 +$5$1 +$6$1 +$7$1 +$8$1 +$9$1 +$0$2 +$1$2 +$2$2 +$3$2 +$4$2 +$5$2 +$6$2 +$7$2 +$8$2 +$9$2 +$0$3 +$1$3 +$2$3 +$3$3 +$4$3 +$5$3 +$6$3 +$7$3 +$8$3 +$9$3 +$0$4 +$1$4 +$2$4 +$3$4 +$4$4 +$5$4 +$6$4 +$7$4 +$8$4 +$9$4 +$0$5 +$1$5 +$2$5 +$3$5 +$4$5 +$5$5 +$6$5 +$7$5 +$8$5 +$9$5 +$0$6 +$1$6 +$2$6 +$3$6 +$4$6 +$5$6 +$6$6 +$7$6 +$8$6 +$9$6 +$0$7 +$1$7 +$2$7 +$3$7 +$4$7 +$5$7 +$6$7 +$7$7 +$8$7 +$9$7 +$0$8 +$1$8 +$2$8 +$3$8 +$4$8 +$5$8 +$6$8 +$7$8 +$8$8 +$9$8 +$0$9 +$1$9 +$2$9 +$3$9 +$4$9 +$5$9 +$6$9 +$7$9 +$8$9 +$9$9 + +$0$0$0 +$1$1$1 +$2$2$2 +$3$3$3 +$4$4$4 +$5$5$5 +$6$6$6 +$7$7$7 +$8$8$8 +$9$9$9 + +$1$2$3 +$2$3$4 +$3$4$5 +$4$5$6 +$5$6$7 +$6$7$8 +$7$8$9 + +$1$0$0$0 +$1$9$6$0 +$1$9$6$1 +$1$9$6$2 +$1$9$6$3 +$1$9$6$4 +$1$9$6$5 +$1$9$6$6 +$1$9$6$7 +$1$9$6$8 +$1$9$6$9 +$1$9$7$0 +$1$9$7$1 +$1$9$7$2 +$1$9$7$3 +$1$9$7$4 +$1$9$7$5 +$1$9$7$6 +$1$9$7$7 +$1$9$7$8 +$1$9$7$9 +$1$9$8$0 +$1$9$8$1 +$1$9$8$2 +$1$9$8$3 +$1$9$8$4 +$1$9$8$5 +$1$9$8$6 +$1$9$8$7 +$1$9$8$8 +$1$9$8$9 +$1$9$9$0 +$1$9$9$1 +$1$9$9$2 +$1$9$9$3 +$1$9$9$4 +$1$9$9$5 +$1$9$9$6 +$1$9$9$7 +$1$9$9$8 +$1$9$9$9 +$2$0$0$0 +$2$0$0$1 +$2$0$0$2 +$2$0$0$3 +$2$0$0$4 +$2$0$0$5 +$2$0$0$6 +$2$0$0$7 +$2$0$0$8 +$2$0$0$9 +$2$0$1$0 +$2$0$1$1 +$2$0$1$2 +$2$0$1$3 +$2$0$1$4 +$2$0$1$5 +$2$0$1$6 +$2$0$1$7 +$2$0$1$8 +$2$0$1$9 +$2$0$2$0 +$3$0$0$0 +$4$0$0$0 +$5$0$0$0 +$6$0$0$0 +$7$0$0$0 +$8$0$0$0 +$9$0$0$0 + +$1$2$3$4 +$1$2$3$4$5 +$1$2$3$4$5$6 +$1$2$3$4$5$6$7 +$1$2$3$4$5$6$7$8 +$1$2$3$4$5$6$7$8$9 +$1$2$3$4$5$6$7$8$9$0 + +$0$0$0$0 +$1$1$1$1 +$2$2$2$2 +$3$3$3$3 +$4$4$4$4 +$5$5$5$5 +$6$6$6$6 +$7$7$7$7 +$8$8$8$8 +$9$9$9$9 + +$0$0$0$0$0 +$1$1$1$1$1 +$2$2$2$2$2 +$3$3$3$3$3 +$4$4$4$4$4 +$5$5$5$5$5 +$6$6$6$6$6 +$7$7$7$7$7 +$8$8$8$8$8 +$9$9$9$9$9 + +$0$0$0$0$0$0 +$1$1$1$1$1$1 +$2$2$2$2$2$2 +$3$3$3$3$3$3 +$4$4$4$4$4$4 +$5$5$5$5$5$5 +$6$6$6$6$6$6 +$7$7$7$7$7$7 +$8$8$8$8$8$8 +$9$9$9$9$9$9 + +c$ +c$! +c$" +c$# +c$$ +c$% +c$& +c$' +c$( +c$) +c$* +c$+ +c$, +c$- +c$. +c$/ +c$0 +c$1 +c$2 +c$3 +c$4 +c$5 +c$6 +c$7 +c$8 +c$9 +c$: +c$; +c$< +c$= +c$> +c$? +c$@ +c$A +c$B +c$C +c$D +c$E +c$F +c$G +c$H +c$I +c$J +c$K +c$L +c$M +c$N +c$O +c$P +c$Q +c$R +c$S +c$T +c$U +c$V +c$W +c$X +c$Y +c$Z +c$[ +c$\ +c$] +c$^ +c$_ +c$` +c$a +c$b +c$c +c$d +c$e +c$f +c$g +c$h +c$i +c$j +c$k +c$l +c$m +c$n +c$o +c$p +c$q +c$r +c$s +c$t +c$u +c$v +c$w +c$x +c$y +c$z +c${ +c$| +c$} +c$~ + +c$0$0 +c$1$0 +c$2$0 +c$3$0 +c$4$0 +c$5$0 +c$6$0 +c$7$0 +c$8$0 +c$9$0 +c$0$1 +c$1$1 +c$2$1 +c$3$1 +c$4$1 +c$5$1 +c$6$1 +c$7$1 +c$8$1 +c$9$1 +c$0$2 +c$1$2 +c$2$2 +c$3$2 +c$4$2 +c$5$2 +c$6$2 +c$7$2 +c$8$2 +c$9$2 +c$0$3 +c$1$3 +c$2$3 +c$3$3 +c$4$3 +c$5$3 +c$6$3 +c$7$3 +c$8$3 +c$9$3 +c$0$4 +c$1$4 +c$2$4 +c$3$4 +c$4$4 +c$5$4 +c$6$4 +c$7$4 +c$8$4 +c$9$4 +c$0$5 +c$1$5 +c$2$5 +c$3$5 +c$4$5 +c$5$5 +c$6$5 +c$7$5 +c$8$5 +c$9$5 +c$0$6 +c$1$6 +c$2$6 +c$3$6 +c$4$6 +c$5$6 +c$6$6 +c$7$6 +c$8$6 +c$9$6 +c$0$7 +c$1$7 +c$2$7 +c$3$7 +c$4$7 +c$5$7 +c$6$7 +c$7$7 +c$8$7 +c$9$7 +c$0$8 +c$1$8 +c$2$8 +c$3$8 +c$4$8 +c$5$8 +c$6$8 +c$7$8 +c$8$8 +c$9$8 +c$0$9 +c$1$9 +c$2$9 +c$3$9 +c$4$9 +c$5$9 +c$6$9 +c$7$9 +c$8$9 +c$9$9 + +c$0$0$0 +c$1$1$1 +c$2$2$2 +c$3$3$3 +c$4$4$4 +c$5$5$5 +c$6$6$6 +c$7$7$7 +c$8$8$8 +c$9$9$9 + +c$1$2$3 +c$2$3$4 +c$3$4$5 +c$4$5$6 +c$5$6$7 +c$6$7$8 +c$7$8$9 + +c$1$0$0$0 +c$1$9$6$0 +c$1$9$6$1 +c$1$9$6$2 +c$1$9$6$3 +c$1$9$6$4 +c$1$9$6$5 +c$1$9$6$6 +c$1$9$6$7 +c$1$9$6$8 +c$1$9$6$9 +c$1$9$7$0 +c$1$9$7$1 +c$1$9$7$2 +c$1$9$7$3 +c$1$9$7$4 +c$1$9$7$5 +c$1$9$7$6 +c$1$9$7$7 +c$1$9$7$8 +c$1$9$7$9 +c$1$9$8$0 +c$1$9$8$1 +c$1$9$8$2 +c$1$9$8$3 +c$1$9$8$4 +c$1$9$8$5 +c$1$9$8$6 +c$1$9$8$7 +c$1$9$8$8 +c$1$9$8$9 +c$1$9$9$0 +c$1$9$9$1 +c$1$9$9$2 +c$1$9$9$3 +c$1$9$9$4 +c$1$9$9$5 +c$1$9$9$6 +c$1$9$9$7 +c$1$9$9$8 +c$1$9$9$9 +c$2$0$0$0 +c$2$0$0$1 +c$2$0$0$2 +c$2$0$0$3 +c$2$0$0$4 +c$2$0$0$5 +c$2$0$0$6 +c$2$0$0$7 +c$2$0$0$8 +c$2$0$0$9 +c$2$0$1$0 +c$2$0$1$1 +c$2$0$1$2 +c$2$0$1$3 +c$2$0$1$4 +c$2$0$1$5 +c$2$0$1$6 +c$2$0$1$7 +c$2$0$1$8 +c$2$0$1$9 +c$2$0$2$0 +c$3$0$0$0 +c$4$0$0$0 +c$5$0$0$0 +c$6$0$0$0 +c$7$0$0$0 +c$8$0$0$0 +c$9$0$0$0 + +c$1$2$3$4 +c$1$2$3$4$5 +c$1$2$3$4$5$6 +c$1$2$3$4$5$6$7 +c$1$2$3$4$5$6$7$8 +c$1$2$3$4$5$6$7$8$9 +c$1$2$3$4$5$6$7$8$9$0 + +c$0$0$0$0 +c$1$1$1$1 +c$2$2$2$2 +c$3$3$3$3 +c$4$4$4$4 +c$5$5$5$5 +c$6$6$6$6 +c$7$7$7$7 +c$8$8$8$8 +c$9$9$9$9 + +c$0$0$0$0$0 +c$1$1$1$1$1 +c$2$2$2$2$2 +c$3$3$3$3$3 +c$4$4$4$4$4 +c$5$5$5$5$5 +c$6$6$6$6$6 +c$7$7$7$7$7 +c$8$8$8$8$8 +c$9$9$9$9$9 + +c$0$0$0$0$0$0 +c$1$1$1$1$1$1 +c$2$2$2$2$2$2 +c$3$3$3$3$3$3 +c$4$4$4$4$4$4 +c$5$5$5$5$5$5 +c$6$6$6$6$6$6 +c$7$7$7$7$7$7 +c$8$8$8$8$8$8 +c$9$9$9$9$9$9 + +u$ +u$! +u$" +u$# +u$$ +u$% +u$& +u$' +u$( +u$) +u$* +u$+ +u$, +u$- +u$. +u$/ +u$0 +u$1 +u$2 +u$3 +u$4 +u$5 +u$6 +u$7 +u$8 +u$9 +u$: +u$; +u$< +u$= +u$> +u$? +u$@ +u$A +u$B +u$C +u$D +u$E +u$F +u$G +u$H +u$I +u$J +u$K +u$L +u$M +u$N +u$O +u$P +u$Q +u$R +u$S +u$T +u$U +u$V +u$W +u$X +u$Y +u$Z +u$[ +u$\ +u$] +u$^ +u$_ +u$` +u$a +u$b +u$c +u$d +u$e +u$f +u$g +u$h +u$i +u$j +u$k +u$l +u$m +u$n +u$o +u$p +u$q +u$r +u$s +u$t +u$u +u$v +u$w +u$x +u$y +u$z +u${ +u$| +u$} +u$~ + +u$0$0 +u$1$0 +u$2$0 +u$3$0 +u$4$0 +u$5$0 +u$6$0 +u$7$0 +u$8$0 +u$9$0 +u$0$1 +u$1$1 +u$2$1 +u$3$1 +u$4$1 +u$5$1 +u$6$1 +u$7$1 +u$8$1 +u$9$1 +u$0$2 +u$1$2 +u$2$2 +u$3$2 +u$4$2 +u$5$2 +u$6$2 +u$7$2 +u$8$2 +u$9$2 +u$0$3 +u$1$3 +u$2$3 +u$3$3 +u$4$3 +u$5$3 +u$6$3 +u$7$3 +u$8$3 +u$9$3 +u$0$4 +u$1$4 +u$2$4 +u$3$4 +u$4$4 +u$5$4 +u$6$4 +u$7$4 +u$8$4 +u$9$4 +u$0$5 +u$1$5 +u$2$5 +u$3$5 +u$4$5 +u$5$5 +u$6$5 +u$7$5 +u$8$5 +u$9$5 +u$0$6 +u$1$6 +u$2$6 +u$3$6 +u$4$6 +u$5$6 +u$6$6 +u$7$6 +u$8$6 +u$9$6 +u$0$7 +u$1$7 +u$2$7 +u$3$7 +u$4$7 +u$5$7 +u$6$7 +u$7$7 +u$8$7 +u$9$7 +u$0$8 +u$1$8 +u$2$8 +u$3$8 +u$4$8 +u$5$8 +u$6$8 +u$7$8 +u$8$8 +u$9$8 +u$0$9 +u$1$9 +u$2$9 +u$3$9 +u$4$9 +u$5$9 +u$6$9 +u$7$9 +u$8$9 +u$9$9 + +u$0$0$0 +u$1$1$1 +u$2$2$2 +u$3$3$3 +u$4$4$4 +u$5$5$5 +u$6$6$6 +u$7$7$7 +u$8$8$8 +u$9$9$9 + +u$1$2$3 +u$2$3$4 +u$3$4$5 +u$4$5$6 +u$5$6$7 +u$6$7$8 +u$7$8$9 + +u$1$0$0$0 +u$1$9$6$0 +u$1$9$6$1 +u$1$9$6$2 +u$1$9$6$3 +u$1$9$6$4 +u$1$9$6$5 +u$1$9$6$6 +u$1$9$6$7 +u$1$9$6$8 +u$1$9$6$9 +u$1$9$7$0 +u$1$9$7$1 +u$1$9$7$2 +u$1$9$7$3 +u$1$9$7$4 +u$1$9$7$5 +u$1$9$7$6 +u$1$9$7$7 +u$1$9$7$8 +u$1$9$7$9 +u$1$9$8$0 +u$1$9$8$1 +u$1$9$8$2 +u$1$9$8$3 +u$1$9$8$4 +u$1$9$8$5 +u$1$9$8$6 +u$1$9$8$7 +u$1$9$8$8 +u$1$9$8$9 +u$1$9$9$0 +u$1$9$9$1 +u$1$9$9$2 +u$1$9$9$3 +u$1$9$9$4 +u$1$9$9$5 +u$1$9$9$6 +u$1$9$9$7 +u$1$9$9$8 +u$1$9$9$9 +u$2$0$0$0 +u$2$0$0$1 +u$2$0$0$2 +u$2$0$0$3 +u$2$0$0$4 +u$2$0$0$5 +u$2$0$0$6 +u$2$0$0$7 +u$2$0$0$8 +u$2$0$0$9 +u$2$0$1$0 +u$2$0$1$1 +u$2$0$1$2 +u$2$0$1$3 +u$2$0$1$4 +u$2$0$1$5 +u$2$0$1$6 +u$2$0$1$7 +u$2$0$1$8 +u$2$0$1$9 +u$2$0$2$0 +u$3$0$0$0 +u$4$0$0$0 +u$5$0$0$0 +u$6$0$0$0 +u$7$0$0$0 +u$8$0$0$0 +u$9$0$0$0 + +u$1$2$3$4 +u$1$2$3$4$5 +u$1$2$3$4$5$6 +u$1$2$3$4$5$6$7 +u$1$2$3$4$5$6$7$8 +u$1$2$3$4$5$6$7$8$9 +u$1$2$3$4$5$6$7$8$9$0 + +u$0$0$0$0 +u$1$1$1$1 +u$2$2$2$2 +u$3$3$3$3 +u$4$4$4$4 +u$5$5$5$5 +u$6$6$6$6 +u$7$7$7$7 +u$8$8$8$8 +u$9$9$9$9 + +u$0$0$0$0$0 +u$1$1$1$1$1 +u$2$2$2$2$2 +u$3$3$3$3$3 +u$4$4$4$4$4 +u$5$5$5$5$5 +u$6$6$6$6$6 +u$7$7$7$7$7 +u$8$8$8$8$8 +u$9$9$9$9$9 + +u$0$0$0$0$0$0 +u$1$1$1$1$1$1 +u$2$2$2$2$2$2 +u$3$3$3$3$3$3 +u$4$4$4$4$4$4 +u$5$5$5$5$5$5 +u$6$6$6$6$6$6 +u$7$7$7$7$7$7 +u$8$8$8$8$8$8 +u$9$9$9$9$9$9 + +$2$u +$4$u +$2$k +$:$) +$;$) +$m$e +$x$x$x +$1$s$t +$2$m$e +$4$u$s +$4$m$y +$4$m$e +$4$a$l$l +$4$e$v$e$r +$4$l$i$f$e +$4$f$r$e$e + +c$2$u +c$4$u +c$2$k +c$:$) +c$;$) +c$m$e +c$x$x$x +c$1$s$t +c$2$m$e +c$4$u$s +c$4$m$y +c$4$m$e +c$4$a$l$l +c$4$e$v$e$r +c$4$l$i$f$e +c$4$f$r$e$e + +$!$@ +$!$@$# +$!$@$#$$ +$!$@$#$$$% +$!$@$#$$$%$^ +$!$@$#$$$%$^$& +$!$@$#$$$%$^$&$* + +c$!$@ +c$!$@$# +c$!$@$#$$ +c$!$@$#$$$% +c$!$@$#$$$%$^ +c$!$@$#$$$%$^$& +c$!$@$#$$$%$^$&$* + +$a$b +$a$b$c +$a$b$c$d +$a$b$c$d$e + +c$a$b +c$a$b$c +c$a$b$c$d +c$a$b$c$d$e + +$1$2$a$b +$1$2$3$a$b$c +$1$2$3$4$a$b$c$d + +$.$c$o$m +$.$n$e$t +$.$o$r$g +$.$g$o$v +$.$i$n$f$o +$.$b$i$z +$.$r$u +$.$u$s +$.$d$e +$.$f$r +$.$u$k + +$@$g$m$a$i$l$.$c$o$m +$@$g$m$x$.$d$e +$@$m$a$i$l$.$r$u +$@$y$a$n$d$e$x$.$r$u +$@$m$s$n$.$c$o$m +$@$y$a$h$o$o$.$c$o$m + +# ^.Rules + +^ +^! +^" +^# +^$ +^% +^& +^' +^( +^) +^* +^+ +^, +^- +^. +^/ +^0 +^1 +^2 +^3 +^4 +^5 +^6 +^7 +^8 +^9 +^: +^; +^< +^= +^> +^? +^@ +^A +^B +^C +^D +^E +^F +^G +^H +^I +^J +^K +^L +^M +^N +^O +^P +^Q +^R +^S +^T +^U +^V +^W +^X +^Y +^Z +^[ +^\ +^] +^^ +^_ +^` +^a +^b +^c +^d +^e +^f +^g +^h +^i +^j +^k +^l +^m +^n +^o +^p +^q +^r +^s +^t +^u +^v +^w +^x +^y +^z +^{ +^| +^} +^~ + +^0^0 +^1^0 +^2^0 +^3^0 +^4^0 +^5^0 +^6^0 +^7^0 +^8^0 +^9^0 +^0^1 +^1^1 +^2^1 +^3^1 +^4^1 +^5^1 +^6^1 +^7^1 +^8^1 +^9^1 +^0^2 +^1^2 +^2^2 +^3^2 +^4^2 +^5^2 +^6^2 +^7^2 +^8^2 +^9^2 +^0^3 +^1^3 +^2^3 +^3^3 +^4^3 +^5^3 +^6^3 +^7^3 +^8^3 +^9^3 +^0^4 +^1^4 +^2^4 +^3^4 +^4^4 +^5^4 +^6^4 +^7^4 +^8^4 +^9^4 +^0^5 +^1^5 +^2^5 +^3^5 +^4^5 +^5^5 +^6^5 +^7^5 +^8^5 +^9^5 +^0^6 +^1^6 +^2^6 +^3^6 +^4^6 +^5^6 +^6^6 +^7^6 +^8^6 +^9^6 +^0^7 +^1^7 +^2^7 +^3^7 +^4^7 +^5^7 +^6^7 +^7^7 +^8^7 +^9^7 +^0^8 +^1^8 +^2^8 +^3^8 +^4^8 +^5^8 +^6^8 +^7^8 +^8^8 +^9^8 +^0^9 +^1^9 +^2^9 +^3^9 +^4^9 +^5^9 +^6^9 +^7^9 +^8^9 +^9^9 + +^0^6^9^1 +^1^6^9^1 +^2^6^9^1 +^3^6^9^1 +^4^6^9^1 +^5^6^9^1 +^6^6^9^1 +^7^6^9^1 +^8^6^9^1 +^9^6^9^1 +^0^7^9^1 +^1^7^9^1 +^2^7^9^1 +^3^7^9^1 +^4^7^9^1 +^5^7^9^1 +^6^7^9^1 +^7^7^9^1 +^8^7^9^1 +^9^7^9^1 +^0^8^9^1 +^1^8^9^1 +^2^8^9^1 +^3^8^9^1 +^4^8^9^1 +^5^8^9^1 +^6^8^9^1 +^7^8^9^1 +^8^8^9^1 +^9^8^9^1 +^0^9^9^1 +^1^9^9^1 +^2^9^9^1 +^3^9^9^1 +^4^9^9^1 +^5^9^9^1 +^6^9^9^1 +^7^9^9^1 +^8^9^9^1 +^9^9^9^1 +^0^0^0^2 +^1^0^0^2 +^2^0^0^2 +^3^0^0^2 +^4^0^0^2 +^5^0^0^2 +^6^0^0^2 +^7^0^0^2 +^8^0^0^2 +^9^0^0^2 +^0^1^0^2 +^1^1^0^2 +^2^1^0^2 +^3^1^0^2 +^4^1^0^2 +^5^1^0^2 +^6^1^0^2 +^7^1^0^2 +^8^1^0^2 +^9^1^0^2 +^0^2^0^2 + +^3^2^1 +^4^3^2^1 +^5^4^3^2^1 +^6^5^4^3^2^1 +^7^6^5^4^3^2^1 +^8^7^6^5^4^3^2^1 +^9^8^7^6^5^4^3^2^1 + +c^ +c^! +c^" +c^# +c^$ +c^% +c^& +c^' +c^( +c^) +c^* +c^+ +c^, +c^- +c^. +c^/ +c^0 +c^1 +c^2 +c^3 +c^4 +c^5 +c^6 +c^7 +c^8 +c^9 +c^: +c^; +c^< +c^= +c^> +c^? +c^@ +c^A +c^B +c^C +c^D +c^E +c^F +c^G +c^H +c^I +c^J +c^K +c^L +c^M +c^N +c^O +c^P +c^Q +c^R +c^S +c^T +c^U +c^V +c^W +c^X +c^Y +c^Z +c^[ +c^\ +c^] +c^^ +c^_ +c^` +c^a +c^b +c^c +c^d +c^e +c^f +c^g +c^h +c^i +c^j +c^k +c^l +c^m +c^n +c^o +c^p +c^q +c^r +c^s +c^t +c^u +c^v +c^w +c^x +c^y +c^z +c^{ +c^| +c^} +c^~ + +c^0^0 +c^1^0 +c^2^0 +c^3^0 +c^4^0 +c^5^0 +c^6^0 +c^7^0 +c^8^0 +c^9^0 +c^0^1 +c^1^1 +c^2^1 +c^3^1 +c^4^1 +c^5^1 +c^6^1 +c^7^1 +c^8^1 +c^9^1 +c^0^2 +c^1^2 +c^2^2 +c^3^2 +c^4^2 +c^5^2 +c^6^2 +c^7^2 +c^8^2 +c^9^2 +c^0^3 +c^1^3 +c^2^3 +c^3^3 +c^4^3 +c^5^3 +c^6^3 +c^7^3 +c^8^3 +c^9^3 +c^0^4 +c^1^4 +c^2^4 +c^3^4 +c^4^4 +c^5^4 +c^6^4 +c^7^4 +c^8^4 +c^9^4 +c^0^5 +c^1^5 +c^2^5 +c^3^5 +c^4^5 +c^5^5 +c^6^5 +c^7^5 +c^8^5 +c^9^5 +c^0^6 +c^1^6 +c^2^6 +c^3^6 +c^4^6 +c^5^6 +c^6^6 +c^7^6 +c^8^6 +c^9^6 +c^0^7 +c^1^7 +c^2^7 +c^3^7 +c^4^7 +c^5^7 +c^6^7 +c^7^7 +c^8^7 +c^9^7 +c^0^8 +c^1^8 +c^2^8 +c^3^8 +c^4^8 +c^5^8 +c^6^8 +c^7^8 +c^8^8 +c^9^8 +c^0^9 +c^1^9 +c^2^9 +c^3^9 +c^4^9 +c^5^9 +c^6^9 +c^7^9 +c^8^9 +c^9^9 + +c^0^6^9^1 +c^1^6^9^1 +c^2^6^9^1 +c^3^6^9^1 +c^4^6^9^1 +c^5^6^9^1 +c^6^6^9^1 +c^7^6^9^1 +c^8^6^9^1 +c^9^6^9^1 +c^0^7^9^1 +c^1^7^9^1 +c^2^7^9^1 +c^3^7^9^1 +c^4^7^9^1 +c^5^7^9^1 +c^6^7^9^1 +c^7^7^9^1 +c^8^7^9^1 +c^9^7^9^1 +c^0^8^9^1 +c^1^8^9^1 +c^2^8^9^1 +c^3^8^9^1 +c^4^8^9^1 +c^5^8^9^1 +c^6^8^9^1 +c^7^8^9^1 +c^8^8^9^1 +c^9^8^9^1 +c^0^9^9^1 +c^1^9^9^1 +c^2^9^9^1 +c^3^9^9^1 +c^4^9^9^1 +c^5^9^9^1 +c^6^9^9^1 +c^7^9^9^1 +c^8^9^9^1 +c^9^9^9^1 +c^0^0^0^2 +c^1^0^0^2 +c^2^0^0^2 +c^3^0^0^2 +c^4^0^0^2 +c^5^0^0^2 +c^6^0^0^2 +c^7^0^0^2 +c^8^0^0^2 +c^9^0^0^2 +c^0^1^0^2 +c^1^1^0^2 +c^2^1^0^2 +c^3^1^0^2 +c^4^1^0^2 +c^5^1^0^2 +c^6^1^0^2 +c^7^1^0^2 +c^8^1^0^2 +c^9^1^0^2 +c^0^2^0^2 + +c^3^2^1 +c^4^3^2^1 +c^5^4^3^2^1 +c^6^5^4^3^2^1 +c^7^6^5^4^3^2^1 +c^8^7^6^5^4^3^2^1 +c^9^8^7^6^5^4^3^2^1 + +u^ +u^! +u^" +u^# +u^$ +u^% +u^& +u^' +u^( +u^) +u^* +u^+ +u^, +u^- +u^. +u^/ +u^0 +u^1 +u^2 +u^3 +u^4 +u^5 +u^6 +u^7 +u^8 +u^9 +u^: +u^; +u^< +u^= +u^> +u^? +u^@ +u^A +u^B +u^C +u^D +u^E +u^F +u^G +u^H +u^I +u^J +u^K +u^L +u^M +u^N +u^O +u^P +u^Q +u^R +u^S +u^T +u^U +u^V +u^W +u^X +u^Y +u^Z +u^[ +u^\ +u^] +u^^ +u^_ +u^` +u^a +u^b +u^c +u^d +u^e +u^f +u^g +u^h +u^i +u^j +u^k +u^l +u^m +u^n +u^o +u^p +u^q +u^r +u^s +u^t +u^u +u^v +u^w +u^x +u^y +u^z +u^{ +u^| +u^} +u^~ + +u^0^0 +u^1^0 +u^2^0 +u^3^0 +u^4^0 +u^5^0 +u^6^0 +u^7^0 +u^8^0 +u^9^0 +u^0^1 +u^1^1 +u^2^1 +u^3^1 +u^4^1 +u^5^1 +u^6^1 +u^7^1 +u^8^1 +u^9^1 +u^0^2 +u^1^2 +u^2^2 +u^3^2 +u^4^2 +u^5^2 +u^6^2 +u^7^2 +u^8^2 +u^9^2 +u^0^3 +u^1^3 +u^2^3 +u^3^3 +u^4^3 +u^5^3 +u^6^3 +u^7^3 +u^8^3 +u^9^3 +u^0^4 +u^1^4 +u^2^4 +u^3^4 +u^4^4 +u^5^4 +u^6^4 +u^7^4 +u^8^4 +u^9^4 +u^0^5 +u^1^5 +u^2^5 +u^3^5 +u^4^5 +u^5^5 +u^6^5 +u^7^5 +u^8^5 +u^9^5 +u^0^6 +u^1^6 +u^2^6 +u^3^6 +u^4^6 +u^5^6 +u^6^6 +u^7^6 +u^8^6 +u^9^6 +u^0^7 +u^1^7 +u^2^7 +u^3^7 +u^4^7 +u^5^7 +u^6^7 +u^7^7 +u^8^7 +u^9^7 +u^0^8 +u^1^8 +u^2^8 +u^3^8 +u^4^8 +u^5^8 +u^6^8 +u^7^8 +u^8^8 +u^9^8 +u^0^9 +u^1^9 +u^2^9 +u^3^9 +u^4^9 +u^5^9 +u^6^9 +u^7^9 +u^8^9 +u^9^9 + +u^0^6^9^1 +u^1^6^9^1 +u^2^6^9^1 +u^3^6^9^1 +u^4^6^9^1 +u^5^6^9^1 +u^6^6^9^1 +u^7^6^9^1 +u^8^6^9^1 +u^9^6^9^1 +u^0^7^9^1 +u^1^7^9^1 +u^2^7^9^1 +u^3^7^9^1 +u^4^7^9^1 +u^5^7^9^1 +u^6^7^9^1 +u^7^7^9^1 +u^8^7^9^1 +u^9^7^9^1 +u^0^8^9^1 +u^1^8^9^1 +u^2^8^9^1 +u^3^8^9^1 +u^4^8^9^1 +u^5^8^9^1 +u^6^8^9^1 +u^7^8^9^1 +u^8^8^9^1 +u^9^8^9^1 +u^0^9^9^1 +u^1^9^9^1 +u^2^9^9^1 +u^3^9^9^1 +u^4^9^9^1 +u^5^9^9^1 +u^6^9^9^1 +u^7^9^9^1 +u^8^9^9^1 +u^9^9^9^1 +u^0^0^0^2 +u^1^0^0^2 +u^2^0^0^2 +u^3^0^0^2 +u^4^0^0^2 +u^5^0^0^2 +u^6^0^0^2 +u^7^0^0^2 +u^8^0^0^2 +u^9^0^0^2 +u^0^1^0^2 +u^1^1^0^2 +u^2^1^0^2 +u^3^1^0^2 +u^4^1^0^2 +u^5^1^0^2 +u^6^1^0^2 +u^7^1^0^2 +u^8^1^0^2 +u^9^1^0^2 +u^0^2^0^2 + +u^3^2^1 +u^4^3^2^1 +u^5^4^3^2^1 +u^6^5^4^3^2^1 +u^7^6^5^4^3^2^1 +u^8^7^6^5^4^3^2^1 +u^9^8^7^6^5^4^3^2^1 + +^k^2 +^y^m +^y^m^4 +^m^a^i +^e^v^o^l +^e^v^o^l^i +^e^h^t^e^v^o^l^i +^y^m^e^v^o^l^i +^e^h^t +^1^e^h^t +^l^l^a^4 +^t^s^1 + +c^k^2 +c^y^m +c^y^m^4 +c^m^a^i +c^e^v^o^l +c^e^v^o^l^i +c^e^h^t^e^v^o^l^i +c^y^m^e^v^o^l^i +c^e^h^t +c^1^e^h^t +c^l^l^a^4 +c^t^s^1 + +^@^! +^#^@^! +^$^#^@^! +^%^$^#^@^! +^^^%^$^#^@^! +^&^^^%^$^#^@^! +^*^&^^^%^$^#^@^! + +c^@^! +c^#^@^! +c^$^#^@^! +c^%^$^#^@^! +c^^^%^$^#^@^! +c^&^^^%^$^#^@^! +c^*^&^^^%^$^#^@^! + +# IO.Rules + +i1 +i1! +i1" +i1# +i1$ +i1% +i1& +i1' +i1( +i1) +i1* +i1+ +i1, +i1- +i1. +i1/ +i10 +i11 +i12 +i13 +i14 +i15 +i16 +i17 +i18 +i19 +i1: +i1; +i1< +i1= +i1> +i1? +i1@ +i1A +i1B +i1C +i1D +i1E +i1F +i1G +i1H +i1I +i1J +i1K +i1L +i1M +i1N +i1O +i1P +i1Q +i1R +i1S +i1T +i1U +i1V +i1W +i1X +i1Y +i1Z +i1[ +i1\ +i1] +i1^ +i1_ +i1` +i1a +i1b +i1c +i1d +i1e +i1f +i1g +i1h +i1i +i1j +i1k +i1l +i1m +i1n +i1o +i1p +i1q +i1r +i1s +i1t +i1u +i1v +i1w +i1x +i1y +i1z +i1{ +i1| +i1} +i1~ + +i2 +i2! +i2" +i2# +i2$ +i2% +i2& +i2' +i2( +i2) +i2* +i2+ +i2, +i2- +i2. +i2/ +i20 +i21 +i22 +i23 +i24 +i25 +i26 +i27 +i28 +i29 +i2: +i2; +i2< +i2= +i2> +i2? +i2@ +i2A +i2B +i2C +i2D +i2E +i2F +i2G +i2H +i2I +i2J +i2K +i2L +i2M +i2N +i2O +i2P +i2Q +i2R +i2S +i2T +i2U +i2V +i2W +i2X +i2Y +i2Z +i2[ +i2\ +i2] +i2^ +i2_ +i2` +i2a +i2b +i2c +i2d +i2e +i2f +i2g +i2h +i2i +i2j +i2k +i2l +i2m +i2n +i2o +i2p +i2q +i2r +i2s +i2t +i2u +i2v +i2w +i2x +i2y +i2z +i2{ +i2| +i2} +i2~ + +i3 +i3! +i3" +i3# +i3$ +i3% +i3& +i3' +i3( +i3) +i3* +i3+ +i3, +i3- +i3. +i3/ +i30 +i31 +i32 +i33 +i34 +i35 +i36 +i37 +i38 +i39 +i3: +i3; +i3< +i3= +i3> +i3? +i3@ +i3A +i3B +i3C +i3D +i3E +i3F +i3G +i3H +i3I +i3J +i3K +i3L +i3M +i3N +i3O +i3P +i3Q +i3R +i3S +i3T +i3U +i3V +i3W +i3X +i3Y +i3Z +i3[ +i3\ +i3] +i3^ +i3_ +i3` +i3a +i3b +i3c +i3d +i3e +i3f +i3g +i3h +i3i +i3j +i3k +i3l +i3m +i3n +i3o +i3p +i3q +i3r +i3s +i3t +i3u +i3v +i3w +i3x +i3y +i3z +i3{ +i3| +i3} +i3~ + +i4 +i4! +i4" +i4# +i4$ +i4% +i4& +i4' +i4( +i4) +i4* +i4+ +i4, +i4- +i4. +i4/ +i40 +i41 +i42 +i43 +i44 +i45 +i46 +i47 +i48 +i49 +i4: +i4; +i4< +i4= +i4> +i4? +i4@ +i4A +i4B +i4C +i4D +i4E +i4F +i4G +i4H +i4I +i4J +i4K +i4L +i4M +i4N +i4O +i4P +i4Q +i4R +i4S +i4T +i4U +i4V +i4W +i4X +i4Y +i4Z +i4[ +i4\ +i4] +i4^ +i4_ +i4` +i4a +i4b +i4c +i4d +i4e +i4f +i4g +i4h +i4i +i4j +i4k +i4l +i4m +i4n +i4o +i4p +i4q +i4r +i4s +i4t +i4u +i4v +i4w +i4x +i4y +i4z +i4{ +i4| +i4} +i4~ + +i5 +i5! +i5" +i5# +i5$ +i5% +i5& +i5' +i5( +i5) +i5* +i5+ +i5, +i5- +i5. +i5/ +i50 +i51 +i52 +i53 +i54 +i55 +i56 +i57 +i58 +i59 +i5: +i5; +i5< +i5= +i5> +i5? +i5@ +i5A +i5B +i5C +i5D +i5E +i5F +i5G +i5H +i5I +i5J +i5K +i5L +i5M +i5N +i5O +i5P +i5Q +i5R +i5S +i5T +i5U +i5V +i5W +i5X +i5Y +i5Z +i5[ +i5\ +i5] +i5^ +i5_ +i5` +i5a +i5b +i5c +i5d +i5e +i5f +i5g +i5h +i5i +i5j +i5k +i5l +i5m +i5n +i5o +i5p +i5q +i5r +i5s +i5t +i5u +i5v +i5w +i5x +i5y +i5z +i5{ +i5| +i5} +i5~ + +i6 +i6! +i6" +i6# +i6$ +i6% +i6& +i6' +i6( +i6) +i6* +i6+ +i6, +i6- +i6. +i6/ +i60 +i61 +i62 +i63 +i64 +i65 +i66 +i67 +i68 +i69 +i6: +i6; +i6< +i6= +i6> +i6? +i6@ +i6A +i6B +i6C +i6D +i6E +i6F +i6G +i6H +i6I +i6J +i6K +i6L +i6M +i6N +i6O +i6P +i6Q +i6R +i6S +i6T +i6U +i6V +i6W +i6X +i6Y +i6Z +i6[ +i6\ +i6] +i6^ +i6_ +i6` +i6a +i6b +i6c +i6d +i6e +i6f +i6g +i6h +i6i +i6j +i6k +i6l +i6m +i6n +i6o +i6p +i6q +i6r +i6s +i6t +i6u +i6v +i6w +i6x +i6y +i6z +i6{ +i6| +i6} +i6~ + +i7 +i7! +i7" +i7# +i7$ +i7% +i7& +i7' +i7( +i7) +i7* +i7+ +i7, +i7- +i7. +i7/ +i70 +i71 +i72 +i73 +i74 +i75 +i76 +i77 +i78 +i79 +i7: +i7; +i7< +i7= +i7> +i7? +i7@ +i7A +i7B +i7C +i7D +i7E +i7F +i7G +i7H +i7I +i7J +i7K +i7L +i7M +i7N +i7O +i7P +i7Q +i7R +i7S +i7T +i7U +i7V +i7W +i7X +i7Y +i7Z +i7[ +i7\ +i7] +i7^ +i7_ +i7` +i7a +i7b +i7c +i7d +i7e +i7f +i7g +i7h +i7i +i7j +i7k +i7l +i7m +i7n +i7o +i7p +i7q +i7r +i7s +i7t +i7u +i7v +i7w +i7x +i7y +i7z +i7{ +i7| +i7} +i7~ + +i8 +i8! +i8" +i8# +i8$ +i8% +i8& +i8' +i8( +i8) +i8* +i8+ +i8, +i8- +i8. +i8/ +i80 +i81 +i82 +i83 +i84 +i85 +i86 +i87 +i88 +i89 +i8: +i8; +i8< +i8= +i8> +i8? +i8@ +i8A +i8B +i8C +i8D +i8E +i8F +i8G +i8H +i8I +i8J +i8K +i8L +i8M +i8N +i8O +i8P +i8Q +i8R +i8S +i8T +i8U +i8V +i8W +i8X +i8Y +i8Z +i8[ +i8\ +i8] +i8^ +i8_ +i8` +i8a +i8b +i8c +i8d +i8e +i8f +i8g +i8h +i8i +i8j +i8k +i8l +i8m +i8n +i8o +i8p +i8q +i8r +i8s +i8t +i8u +i8v +i8w +i8x +i8y +i8z +i8{ +i8| +i8} +i8~ + +i9 +i9! +i9" +i9# +i9$ +i9% +i9& +i9' +i9( +i9) +i9* +i9+ +i9, +i9- +i9. +i9/ +i90 +i91 +i92 +i93 +i94 +i95 +i96 +i97 +i98 +i99 +i9: +i9; +i9< +i9= +i9> +i9? +i9@ +i9A +i9B +i9C +i9D +i9E +i9F +i9G +i9H +i9I +i9J +i9K +i9L +i9M +i9N +i9O +i9P +i9Q +i9R +i9S +i9T +i9U +i9V +i9W +i9X +i9Y +i9Z +i9[ +i9\ +i9] +i9^ +i9_ +i9` +i9a +i9b +i9c +i9d +i9e +i9f +i9g +i9h +i9i +i9j +i9k +i9l +i9m +i9n +i9o +i9p +i9q +i9r +i9s +i9t +i9u +i9v +i9w +i9x +i9y +i9z +i9{ +i9| +i9} +i9~ + +iA +iA! +iA" +iA# +iA$ +iA% +iA& +iA' +iA( +iA) +iA* +iA+ +iA, +iA- +iA. +iA/ +iA0 +iA1 +iA2 +iA3 +iA4 +iA5 +iA6 +iA7 +iA8 +iA9 +iA: +iA; +iA< +iA= +iA> +iA? +iA@ +iAA +iAB +iAC +iAD +iAE +iAF +iAG +iAH +iAI +iAJ +iAK +iAL +iAM +iAN +iAO +iAP +iAQ +iAR +iAS +iAT +iAU +iAV +iAW +iAX +iAY +iAZ +iA[ +iA\ +iA] +iA^ +iA_ +iA` +iAa +iAb +iAc +iAd +iAe +iAf +iAg +iAh +iAi +iAj +iAk +iAl +iAm +iAn +iAo +iAp +iAq +iAr +iAs +iAt +iAu +iAv +iAw +iAx +iAy +iAz +iA{ +iA| +iA} +iA~ + +iB +iB! +iB" +iB# +iB$ +iB% +iB& +iB' +iB( +iB) +iB* +iB+ +iB, +iB- +iB. +iB/ +iB0 +iB1 +iB2 +iB3 +iB4 +iB5 +iB6 +iB7 +iB8 +iB9 +iB: +iB; +iB< +iB= +iB> +iB? +iB@ +iBA +iBB +iBC +iBD +iBE +iBF +iBG +iBH +iBI +iBJ +iBK +iBL +iBM +iBN +iBO +iBP +iBQ +iBR +iBS +iBT +iBU +iBV +iBW +iBX +iBY +iBZ +iB[ +iB\ +iB] +iB^ +iB_ +iB` +iBa +iBb +iBc +iBd +iBe +iBf +iBg +iBh +iBi +iBj +iBk +iBl +iBm +iBn +iBo +iBp +iBq +iBr +iBs +iBt +iBu +iBv +iBw +iBx +iBy +iBz +iB{ +iB| +iB} +iB~ + +iC +iC! +iC" +iC# +iC$ +iC% +iC& +iC' +iC( +iC) +iC* +iC+ +iC, +iC- +iC. +iC/ +iC0 +iC1 +iC2 +iC3 +iC4 +iC5 +iC6 +iC7 +iC8 +iC9 +iC: +iC; +iC< +iC= +iC> +iC? +iC@ +iCA +iCB +iCC +iCD +iCE +iCF +iCG +iCH +iCI +iCJ +iCK +iCL +iCM +iCN +iCO +iCP +iCQ +iCR +iCS +iCT +iCU +iCV +iCW +iCX +iCY +iCZ +iC[ +iC\ +iC] +iC^ +iC_ +iC` +iCa +iCb +iCc +iCd +iCe +iCf +iCg +iCh +iCi +iCj +iCk +iCl +iCm +iCn +iCo +iCp +iCq +iCr +iCs +iCt +iCu +iCv +iCw +iCx +iCy +iCz +iC{ +iC| +iC} +iC~ + +iD +iD! +iD" +iD# +iD$ +iD% +iD& +iD' +iD( +iD) +iD* +iD+ +iD, +iD- +iD. +iD/ +iD0 +iD1 +iD2 +iD3 +iD4 +iD5 +iD6 +iD7 +iD8 +iD9 +iD: +iD; +iD< +iD= +iD> +iD? +iD@ +iDA +iDB +iDC +iDD +iDE +iDF +iDG +iDH +iDI +iDJ +iDK +iDL +iDM +iDN +iDO +iDP +iDQ +iDR +iDS +iDT +iDU +iDV +iDW +iDX +iDY +iDZ +iD[ +iD\ +iD] +iD^ +iD_ +iD` +iDa +iDb +iDc +iDd +iDe +iDf +iDg +iDh +iDi +iDj +iDk +iDl +iDm +iDn +iDo +iDp +iDq +iDr +iDs +iDt +iDu +iDv +iDw +iDx +iDy +iDz +iD{ +iD| +iD} +iD~ + +iE +iE! +iE" +iE# +iE$ +iE% +iE& +iE' +iE( +iE) +iE* +iE+ +iE, +iE- +iE. +iE/ +iE0 +iE1 +iE2 +iE3 +iE4 +iE5 +iE6 +iE7 +iE8 +iE9 +iE: +iE; +iE< +iE= +iE> +iE? +iE@ +iEA +iEB +iEC +iED +iEE +iEF +iEG +iEH +iEI +iEJ +iEK +iEL +iEM +iEN +iEO +iEP +iEQ +iER +iES +iET +iEU +iEV +iEW +iEX +iEY +iEZ +iE[ +iE\ +iE] +iE^ +iE_ +iE` +iEa +iEb +iEc +iEd +iEe +iEf +iEg +iEh +iEi +iEj +iEk +iEl +iEm +iEn +iEo +iEp +iEq +iEr +iEs +iEt +iEu +iEv +iEw +iEx +iEy +iEz +iE{ +iE| +iE} +iE~ + +iF +iF! +iF" +iF# +iF$ +iF% +iF& +iF' +iF( +iF) +iF* +iF+ +iF, +iF- +iF. +iF/ +iF0 +iF1 +iF2 +iF3 +iF4 +iF5 +iF6 +iF7 +iF8 +iF9 +iF: +iF; +iF< +iF= +iF> +iF? +iF@ +iFA +iFB +iFC +iFD +iFE +iFF +iFG +iFH +iFI +iFJ +iFK +iFL +iFM +iFN +iFO +iFP +iFQ +iFR +iFS +iFT +iFU +iFV +iFW +iFX +iFY +iFZ +iF[ +iF\ +iF] +iF^ +iF_ +iF` +iFa +iFb +iFc +iFd +iFe +iFf +iFg +iFh +iFi +iFj +iFk +iFl +iFm +iFn +iFo +iFp +iFq +iFr +iFs +iFt +iFu +iFv +iFw +iFx +iFy +iFz +iF{ +iF| +iF} +iF~ + +iG +iG! +iG" +iG# +iG$ +iG% +iG& +iG' +iG( +iG) +iG* +iG+ +iG, +iG- +iG. +iG/ +iG0 +iG1 +iG2 +iG3 +iG4 +iG5 +iG6 +iG7 +iG8 +iG9 +iG: +iG; +iG< +iG= +iG> +iG? +iG@ +iGA +iGB +iGC +iGD +iGE +iGF +iGG +iGH +iGI +iGJ +iGK +iGL +iGM +iGN +iGO +iGP +iGQ +iGR +iGS +iGT +iGU +iGV +iGW +iGX +iGY +iGZ +iG[ +iG\ +iG] +iG^ +iG_ +iG` +iGa +iGb +iGc +iGd +iGe +iGf +iGg +iGh +iGi +iGj +iGk +iGl +iGm +iGn +iGo +iGp +iGq +iGr +iGs +iGt +iGu +iGv +iGw +iGx +iGy +iGz +iG{ +iG| +iG} +iG~ + +o1 +o1! +o1" +o1# +o1$ +o1% +o1& +o1' +o1( +o1) +o1* +o1+ +o1, +o1- +o1. +o1/ +o10 +o11 +o12 +o13 +o14 +o15 +o16 +o17 +o18 +o19 +o1: +o1; +o1< +o1= +o1> +o1? +o1@ +o1A +o1B +o1C +o1D +o1E +o1F +o1G +o1H +o1I +o1J +o1K +o1L +o1M +o1N +o1O +o1P +o1Q +o1R +o1S +o1T +o1U +o1V +o1W +o1X +o1Y +o1Z +o1[ +o1\ +o1] +o1^ +o1_ +o1` +o1a +o1b +o1c +o1d +o1e +o1f +o1g +o1h +o1i +o1j +o1k +o1l +o1m +o1n +o1o +o1p +o1q +o1r +o1s +o1t +o1u +o1v +o1w +o1x +o1y +o1z +o1{ +o1| +o1} +o1~ + +o2 +o2! +o2" +o2# +o2$ +o2% +o2& +o2' +o2( +o2) +o2* +o2+ +o2, +o2- +o2. +o2/ +o20 +o21 +o22 +o23 +o24 +o25 +o26 +o27 +o28 +o29 +o2: +o2; +o2< +o2= +o2> +o2? +o2@ +o2A +o2B +o2C +o2D +o2E +o2F +o2G +o2H +o2I +o2J +o2K +o2L +o2M +o2N +o2O +o2P +o2Q +o2R +o2S +o2T +o2U +o2V +o2W +o2X +o2Y +o2Z +o2[ +o2\ +o2] +o2^ +o2_ +o2` +o2a +o2b +o2c +o2d +o2e +o2f +o2g +o2h +o2i +o2j +o2k +o2l +o2m +o2n +o2o +o2p +o2q +o2r +o2s +o2t +o2u +o2v +o2w +o2x +o2y +o2z +o2{ +o2| +o2} +o2~ + +o3 +o3! +o3" +o3# +o3$ +o3% +o3& +o3' +o3( +o3) +o3* +o3+ +o3, +o3- +o3. +o3/ +o30 +o31 +o32 +o33 +o34 +o35 +o36 +o37 +o38 +o39 +o3: +o3; +o3< +o3= +o3> +o3? +o3@ +o3A +o3B +o3C +o3D +o3E +o3F +o3G +o3H +o3I +o3J +o3K +o3L +o3M +o3N +o3O +o3P +o3Q +o3R +o3S +o3T +o3U +o3V +o3W +o3X +o3Y +o3Z +o3[ +o3\ +o3] +o3^ +o3_ +o3` +o3a +o3b +o3c +o3d +o3e +o3f +o3g +o3h +o3i +o3j +o3k +o3l +o3m +o3n +o3o +o3p +o3q +o3r +o3s +o3t +o3u +o3v +o3w +o3x +o3y +o3z +o3{ +o3| +o3} +o3~ + +o4 +o4! +o4" +o4# +o4$ +o4% +o4& +o4' +o4( +o4) +o4* +o4+ +o4, +o4- +o4. +o4/ +o40 +o41 +o42 +o43 +o44 +o45 +o46 +o47 +o48 +o49 +o4: +o4; +o4< +o4= +o4> +o4? +o4@ +o4A +o4B +o4C +o4D +o4E +o4F +o4G +o4H +o4I +o4J +o4K +o4L +o4M +o4N +o4O +o4P +o4Q +o4R +o4S +o4T +o4U +o4V +o4W +o4X +o4Y +o4Z +o4[ +o4\ +o4] +o4^ +o4_ +o4` +o4a +o4b +o4c +o4d +o4e +o4f +o4g +o4h +o4i +o4j +o4k +o4l +o4m +o4n +o4o +o4p +o4q +o4r +o4s +o4t +o4u +o4v +o4w +o4x +o4y +o4z +o4{ +o4| +o4} +o4~ + +o5 +o5! +o5" +o5# +o5$ +o5% +o5& +o5' +o5( +o5) +o5* +o5+ +o5, +o5- +o5. +o5/ +o50 +o51 +o52 +o53 +o54 +o55 +o56 +o57 +o58 +o59 +o5: +o5; +o5< +o5= +o5> +o5? +o5@ +o5A +o5B +o5C +o5D +o5E +o5F +o5G +o5H +o5I +o5J +o5K +o5L +o5M +o5N +o5O +o5P +o5Q +o5R +o5S +o5T +o5U +o5V +o5W +o5X +o5Y +o5Z +o5[ +o5\ +o5] +o5^ +o5_ +o5` +o5a +o5b +o5c +o5d +o5e +o5f +o5g +o5h +o5i +o5j +o5k +o5l +o5m +o5n +o5o +o5p +o5q +o5r +o5s +o5t +o5u +o5v +o5w +o5x +o5y +o5z +o5{ +o5| +o5} +o5~ + +o6 +o6! +o6" +o6# +o6$ +o6% +o6& +o6' +o6( +o6) +o6* +o6+ +o6, +o6- +o6. +o6/ +o60 +o61 +o62 +o63 +o64 +o65 +o66 +o67 +o68 +o69 +o6: +o6; +o6< +o6= +o6> +o6? +o6@ +o6A +o6B +o6C +o6D +o6E +o6F +o6G +o6H +o6I +o6J +o6K +o6L +o6M +o6N +o6O +o6P +o6Q +o6R +o6S +o6T +o6U +o6V +o6W +o6X +o6Y +o6Z +o6[ +o6\ +o6] +o6^ +o6_ +o6` +o6a +o6b +o6c +o6d +o6e +o6f +o6g +o6h +o6i +o6j +o6k +o6l +o6m +o6n +o6o +o6p +o6q +o6r +o6s +o6t +o6u +o6v +o6w +o6x +o6y +o6z +o6{ +o6| +o6} +o6~ + +o7 +o7! +o7" +o7# +o7$ +o7% +o7& +o7' +o7( +o7) +o7* +o7+ +o7, +o7- +o7. +o7/ +o70 +o71 +o72 +o73 +o74 +o75 +o76 +o77 +o78 +o79 +o7: +o7; +o7< +o7= +o7> +o7? +o7@ +o7A +o7B +o7C +o7D +o7E +o7F +o7G +o7H +o7I +o7J +o7K +o7L +o7M +o7N +o7O +o7P +o7Q +o7R +o7S +o7T +o7U +o7V +o7W +o7X +o7Y +o7Z +o7[ +o7\ +o7] +o7^ +o7_ +o7` +o7a +o7b +o7c +o7d +o7e +o7f +o7g +o7h +o7i +o7j +o7k +o7l +o7m +o7n +o7o +o7p +o7q +o7r +o7s +o7t +o7u +o7v +o7w +o7x +o7y +o7z +o7{ +o7| +o7} +o7~ + +o8 +o8! +o8" +o8# +o8$ +o8% +o8& +o8' +o8( +o8) +o8* +o8+ +o8, +o8- +o8. +o8/ +o80 +o81 +o82 +o83 +o84 +o85 +o86 +o87 +o88 +o89 +o8: +o8; +o8< +o8= +o8> +o8? +o8@ +o8A +o8B +o8C +o8D +o8E +o8F +o8G +o8H +o8I +o8J +o8K +o8L +o8M +o8N +o8O +o8P +o8Q +o8R +o8S +o8T +o8U +o8V +o8W +o8X +o8Y +o8Z +o8[ +o8\ +o8] +o8^ +o8_ +o8` +o8a +o8b +o8c +o8d +o8e +o8f +o8g +o8h +o8i +o8j +o8k +o8l +o8m +o8n +o8o +o8p +o8q +o8r +o8s +o8t +o8u +o8v +o8w +o8x +o8y +o8z +o8{ +o8| +o8} +o8~ + +o9 +o9! +o9" +o9# +o9$ +o9% +o9& +o9' +o9( +o9) +o9* +o9+ +o9, +o9- +o9. +o9/ +o90 +o91 +o92 +o93 +o94 +o95 +o96 +o97 +o98 +o99 +o9: +o9; +o9< +o9= +o9> +o9? +o9@ +o9A +o9B +o9C +o9D +o9E +o9F +o9G +o9H +o9I +o9J +o9K +o9L +o9M +o9N +o9O +o9P +o9Q +o9R +o9S +o9T +o9U +o9V +o9W +o9X +o9Y +o9Z +o9[ +o9\ +o9] +o9^ +o9_ +o9` +o9a +o9b +o9c +o9d +o9e +o9f +o9g +o9h +o9i +o9j +o9k +o9l +o9m +o9n +o9o +o9p +o9q +o9r +o9s +o9t +o9u +o9v +o9w +o9x +o9y +o9z +o9{ +o9| +o9} +o9~ + +oA +oA! +oA" +oA# +oA$ +oA% +oA& +oA' +oA( +oA) +oA* +oA+ +oA, +oA- +oA. +oA/ +oA0 +oA1 +oA2 +oA3 +oA4 +oA5 +oA6 +oA7 +oA8 +oA9 +oA: +oA; +oA< +oA= +oA> +oA? +oA@ +oAA +oAB +oAC +oAD +oAE +oAF +oAG +oAH +oAI +oAJ +oAK +oAL +oAM +oAN +oAO +oAP +oAQ +oAR +oAS +oAT +oAU +oAV +oAW +oAX +oAY +oAZ +oA[ +oA\ +oA] +oA^ +oA_ +oA` +oAa +oAb +oAc +oAd +oAe +oAf +oAg +oAh +oAi +oAj +oAk +oAl +oAm +oAn +oAo +oAp +oAq +oAr +oAs +oAt +oAu +oAv +oAw +oAx +oAy +oAz +oA{ +oA| +oA} +oA~ + +oB +oB! +oB" +oB# +oB$ +oB% +oB& +oB' +oB( +oB) +oB* +oB+ +oB, +oB- +oB. +oB/ +oB0 +oB1 +oB2 +oB3 +oB4 +oB5 +oB6 +oB7 +oB8 +oB9 +oB: +oB; +oB< +oB= +oB> +oB? +oB@ +oBA +oBB +oBC +oBD +oBE +oBF +oBG +oBH +oBI +oBJ +oBK +oBL +oBM +oBN +oBO +oBP +oBQ +oBR +oBS +oBT +oBU +oBV +oBW +oBX +oBY +oBZ +oB[ +oB\ +oB] +oB^ +oB_ +oB` +oBa +oBb +oBc +oBd +oBe +oBf +oBg +oBh +oBi +oBj +oBk +oBl +oBm +oBn +oBo +oBp +oBq +oBr +oBs +oBt +oBu +oBv +oBw +oBx +oBy +oBz +oB{ +oB| +oB} +oB~ + +oC +oC! +oC" +oC# +oC$ +oC% +oC& +oC' +oC( +oC) +oC* +oC+ +oC, +oC- +oC. +oC/ +oC0 +oC1 +oC2 +oC3 +oC4 +oC5 +oC6 +oC7 +oC8 +oC9 +oC: +oC; +oC< +oC= +oC> +oC? +oC@ +oCA +oCB +oCC +oCD +oCE +oCF +oCG +oCH +oCI +oCJ +oCK +oCL +oCM +oCN +oCO +oCP +oCQ +oCR +oCS +oCT +oCU +oCV +oCW +oCX +oCY +oCZ +oC[ +oC\ +oC] +oC^ +oC_ +oC` +oCa +oCb +oCc +oCd +oCe +oCf +oCg +oCh +oCi +oCj +oCk +oCl +oCm +oCn +oCo +oCp +oCq +oCr +oCs +oCt +oCu +oCv +oCw +oCx +oCy +oCz +oC{ +oC| +oC} +oC~ + +oD +oD! +oD" +oD# +oD$ +oD% +oD& +oD' +oD( +oD) +oD* +oD+ +oD, +oD- +oD. +oD/ +oD0 +oD1 +oD2 +oD3 +oD4 +oD5 +oD6 +oD7 +oD8 +oD9 +oD: +oD; +oD< +oD= +oD> +oD? +oD@ +oDA +oDB +oDC +oDD +oDE +oDF +oDG +oDH +oDI +oDJ +oDK +oDL +oDM +oDN +oDO +oDP +oDQ +oDR +oDS +oDT +oDU +oDV +oDW +oDX +oDY +oDZ +oD[ +oD\ +oD] +oD^ +oD_ +oD` +oDa +oDb +oDc +oDd +oDe +oDf +oDg +oDh +oDi +oDj +oDk +oDl +oDm +oDn +oDo +oDp +oDq +oDr +oDs +oDt +oDu +oDv +oDw +oDx +oDy +oDz +oD{ +oD| +oD} +oD~ + +oE +oE! +oE" +oE# +oE$ +oE% +oE& +oE' +oE( +oE) +oE* +oE+ +oE, +oE- +oE. +oE/ +oE0 +oE1 +oE2 +oE3 +oE4 +oE5 +oE6 +oE7 +oE8 +oE9 +oE: +oE; +oE< +oE= +oE> +oE? +oE@ +oEA +oEB +oEC +oED +oEE +oEF +oEG +oEH +oEI +oEJ +oEK +oEL +oEM +oEN +oEO +oEP +oEQ +oER +oES +oET +oEU +oEV +oEW +oEX +oEY +oEZ +oE[ +oE\ +oE] +oE^ +oE_ +oE` +oEa +oEb +oEc +oEd +oEe +oEf +oEg +oEh +oEi +oEj +oEk +oEl +oEm +oEn +oEo +oEp +oEq +oEr +oEs +oEt +oEu +oEv +oEw +oEx +oEy +oEz +oE{ +oE| +oE} +oE~ + +oF +oF! +oF" +oF# +oF$ +oF% +oF& +oF' +oF( +oF) +oF* +oF+ +oF, +oF- +oF. +oF/ +oF0 +oF1 +oF2 +oF3 +oF4 +oF5 +oF6 +oF7 +oF8 +oF9 +oF: +oF; +oF< +oF= +oF> +oF? +oF@ +oFA +oFB +oFC +oFD +oFE +oFF +oFG +oFH +oFI +oFJ +oFK +oFL +oFM +oFN +oFO +oFP +oFQ +oFR +oFS +oFT +oFU +oFV +oFW +oFX +oFY +oFZ +oF[ +oF\ +oF] +oF^ +oF_ +oF` +oFa +oFb +oFc +oFd +oFe +oFf +oFg +oFh +oFi +oFj +oFk +oFl +oFm +oFn +oFo +oFp +oFq +oFr +oFs +oFt +oFu +oFv +oFw +oFx +oFy +oFz +oF{ +oF| +oF} +oF~ + +oG +oG! +oG" +oG# +oG$ +oG% +oG& +oG' +oG( +oG) +oG* +oG+ +oG, +oG- +oG. +oG/ +oG0 +oG1 +oG2 +oG3 +oG4 +oG5 +oG6 +oG7 +oG8 +oG9 +oG: +oG; +oG< +oG= +oG> +oG? +oG@ +oGA +oGB +oGC +oGD +oGE +oGF +oGG +oGH +oGI +oGJ +oGK +oGL +oGM +oGN +oGO +oGP +oGQ +oGR +oGS +oGT +oGU +oGV +oGW +oGX +oGY +oGZ +oG[ +oG\ +oG] +oG^ +oG_ +oG` +oGa +oGb +oGc +oGd +oGe +oGf +oGg +oGh +oGi +oGj +oGk +oGl +oGm +oGn +oGo +oGp +oGq +oGr +oGs +oGt +oGu +oGv +oGw +oGx +oGy +oGz +oG{ +oG| +oG} +oG~ diff --git a/rules/InsidePro-PasswordsPro.rule b/rules/InsidePro-PasswordsPro.rule new file mode 100644 index 0000000000..9ea5e99db6 --- /dev/null +++ b/rules/InsidePro-PasswordsPro.rule @@ -0,0 +1,3275 @@ +## rule: default rules from PasswordsPro v2.5.5.0 +## limits: +## example: +## extras: + +: +l +u +c +r +d +cd +p3 +cp3 +up3 +p4 +cp4 +up4 +p5 +cp5 +up5 + +z1 +z2 +z3 +Z1 +Z2 +Z3 +q + +$0 +$1 +$2 +$3 +$4 +$5 +$6 +$7 +$8 +$9 +$0$0 +$1$0 +$2$0 +$3$0 +$4$0 +$5$0 +$6$0 +$7$0 +$8$0 +$9$0 +$0$1 +$1$1 +$2$1 +$3$1 +$4$1 +$5$1 +$6$1 +$7$1 +$8$1 +$9$1 +$0$2 +$1$2 +$2$2 +$3$2 +$4$2 +$5$2 +$6$2 +$7$2 +$8$2 +$9$2 +$0$3 +$1$3 +$2$3 +$3$3 +$4$3 +$5$3 +$6$3 +$7$3 +$8$3 +$9$3 +$0$4 +$1$4 +$2$4 +$3$4 +$4$4 +$5$4 +$6$4 +$7$4 +$8$4 +$9$4 +$0$5 +$1$5 +$2$5 +$3$5 +$4$5 +$5$5 +$6$5 +$7$5 +$8$5 +$9$5 +$0$6 +$1$6 +$2$6 +$3$6 +$4$6 +$5$6 +$6$6 +$7$6 +$8$6 +$9$6 +$0$7 +$1$7 +$2$7 +$3$7 +$4$7 +$5$7 +$6$7 +$7$7 +$8$7 +$9$7 +$0$8 +$1$8 +$2$8 +$3$8 +$4$8 +$5$8 +$6$8 +$7$8 +$8$8 +$9$8 +$0$9 +$1$9 +$2$9 +$3$9 +$4$9 +$5$9 +$6$9 +$7$9 +$8$9 +$9$9 + +c$0 +c$1 +c$2 +c$3 +c$4 +c$5 +c$6 +c$7 +c$8 +c$9 +c$0$0 +c$1$0 +c$2$0 +c$3$0 +c$4$0 +c$5$0 +c$6$0 +c$7$0 +c$8$0 +c$9$0 +c$0$1 +c$1$1 +c$2$1 +c$3$1 +c$4$1 +c$5$1 +c$6$1 +c$7$1 +c$8$1 +c$9$1 +c$0$2 +c$1$2 +c$2$2 +c$3$2 +c$4$2 +c$5$2 +c$6$2 +c$7$2 +c$8$2 +c$9$2 +c$0$3 +c$1$3 +c$2$3 +c$3$3 +c$4$3 +c$5$3 +c$6$3 +c$7$3 +c$8$3 +c$9$3 +c$0$4 +c$1$4 +c$2$4 +c$3$4 +c$4$4 +c$5$4 +c$6$4 +c$7$4 +c$8$4 +c$9$4 +c$0$5 +c$1$5 +c$2$5 +c$3$5 +c$4$5 +c$5$5 +c$6$5 +c$7$5 +c$8$5 +c$9$5 +c$0$6 +c$1$6 +c$2$6 +c$3$6 +c$4$6 +c$5$6 +c$6$6 +c$7$6 +c$8$6 +c$9$6 +c$0$7 +c$1$7 +c$2$7 +c$3$7 +c$4$7 +c$5$7 +c$6$7 +c$7$7 +c$8$7 +c$9$7 +c$0$8 +c$1$8 +c$2$8 +c$3$8 +c$4$8 +c$5$8 +c$6$8 +c$7$8 +c$8$8 +c$9$8 +c$0$9 +c$1$9 +c$2$9 +c$3$9 +c$4$9 +c$5$9 +c$6$9 +c$7$9 +c$8$9 +c$9$9 + +u$0 +u$1 +u$2 +u$3 +u$4 +u$5 +u$6 +u$7 +u$8 +u$9 + +u$0$0 +u$1$0 +u$2$0 +u$3$0 +u$4$0 +u$5$0 +u$6$0 +u$7$0 +u$8$0 +u$9$0 +u$0$1 +u$1$1 +u$2$1 +u$3$1 +u$4$1 +u$5$1 +u$6$1 +u$7$1 +u$8$1 +u$9$1 +u$0$2 +u$1$2 +u$2$2 +u$3$2 +u$4$2 +u$5$2 +u$6$2 +u$7$2 +u$8$2 +u$9$2 +u$0$3 +u$1$3 +u$2$3 +u$3$3 +u$4$3 +u$5$3 +u$6$3 +u$7$3 +u$8$3 +u$9$3 +u$0$4 +u$1$4 +u$2$4 +u$3$4 +u$4$4 +u$5$4 +u$6$4 +u$7$4 +u$8$4 +u$9$4 +u$0$5 +u$1$5 +u$2$5 +u$3$5 +u$4$5 +u$5$5 +u$6$5 +u$7$5 +u$8$5 +u$9$5 +u$0$6 +u$1$6 +u$2$6 +u$3$6 +u$4$6 +u$5$6 +u$6$6 +u$7$6 +u$8$6 +u$9$6 +u$0$7 +u$1$7 +u$2$7 +u$3$7 +u$4$7 +u$5$7 +u$6$7 +u$7$7 +u$8$7 +u$9$7 +u$0$8 +u$1$8 +u$2$8 +u$3$8 +u$4$8 +u$5$8 +u$6$8 +u$7$8 +u$8$8 +u$9$8 +u$0$9 +u$1$9 +u$2$9 +u$3$9 +u$4$9 +u$5$9 +u$6$9 +u$7$9 +u$8$9 +u$9$9 + +{ +{{ +{{{ +{{{{ +{{{{{ +} +}} +}}} +}}}} +}}}}} + +{c +{{c +{{{c +{{{{c +{{{{{c +}c +}}c +}}}c +}}}}c +}}}}}c + +[ +[[ +[[[ +[[[[ +[[[[[ +] +]] +]]] +]]]] +]]]]] + +[c +[[c +[[[c +[[[[c +[[[[[c +]c +]]c +]]]c +]]]]c +]]]]]c + +i10 +i11 +i12 +i13 +i14 +i15 +i16 +i17 +i18 +i19 +i1- +i1! +i1@ +i1# +i1$ +i1& +i1* +i1_ +i1+ +i1. +i1' +i20 +i21 +i22 +i23 +i24 +i25 +i26 +i27 +i28 +i29 +i2- +i2! +i2@ +i2# +i2$ +i2& +i2* +i2_ +i2+ +i2. +i2' +i30 +i31 +i32 +i33 +i34 +i35 +i36 +i37 +i38 +i39 +i3- +i3! +i3@ +i3# +i3$ +i3& +i3* +i3_ +i3+ +i3. +i3' +i40 +i41 +i42 +i43 +i44 +i45 +i46 +i47 +i48 +i49 +i4- +i4! +i4@ +i4# +i4$ +i4& +i4* +i4_ +i4+ +i4. +i4' +i50 +i51 +i52 +i53 +i54 +i55 +i56 +i57 +i58 +i59 +i5- +i5! +i5@ +i5# +i5$ +i5& +i5* +i5_ +i5+ +i5. +i5' +i60 +i61 +i62 +i63 +i64 +i65 +i66 +i67 +i68 +i69 +i6- +i6! +i6@ +i6# +i6$ +i6& +i6* +i6_ +i6+ +i6. +i6' +i70 +i71 +i72 +i73 +i74 +i75 +i76 +i77 +i78 +i79 +i7- +i7! +i7@ +i7# +i7$ +i7& +i7* +i7_ +i7+ +i7. +i7' +i80 +i81 +i82 +i83 +i84 +i85 +i86 +i87 +i88 +i89 +i8- +i8! +i8@ +i8# +i8$ +i8& +i8* +i8_ +i8+ +i8. +i8' + +ci10 +ci11 +ci12 +ci13 +ci14 +ci15 +ci16 +ci17 +ci18 +ci19 +ci1- +ci1! +ci1@ +ci1# +ci1$ +ci1& +ci1* +ci1_ +ci1+ +ci1. +ci1' +ci20 +ci21 +ci22 +ci23 +ci24 +ci25 +ci26 +ci27 +ci28 +ci29 +ci2- +ci2! +ci2@ +ci2# +ci2$ +ci2& +ci2* +ci2_ +ci2+ +ci2. +ci2' +ci30 +ci31 +ci32 +ci33 +ci34 +ci35 +ci36 +ci37 +ci38 +ci39 +ci3- +ci3! +ci3@ +ci3# +ci3$ +ci3& +ci3* +ci3_ +ci3+ +ci3. +ci3' +ci40 +ci41 +ci42 +ci43 +ci44 +ci45 +ci46 +ci47 +ci48 +ci49 +ci4- +ci4! +ci4@ +ci4# +ci4$ +ci4& +ci4* +ci4_ +ci4+ +ci4. +ci4' +ci50 +ci51 +ci52 +ci53 +ci54 +ci55 +ci56 +ci57 +ci58 +ci59 +ci5- +ci5! +ci5@ +ci5# +ci5$ +ci5& +ci5* +ci5_ +ci5+ +ci5. +ci5' +ci60 +ci61 +ci62 +ci63 +ci64 +ci65 +ci66 +ci67 +ci68 +ci69 +ci6- +ci6! +ci6@ +ci6# +ci6$ +ci6& +ci6* +ci6_ +ci6+ +ci6. +ci6' +ci70 +ci71 +ci72 +ci73 +ci74 +ci75 +ci76 +ci77 +ci78 +ci79 +ci7- +ci7! +ci7@ +ci7# +ci7$ +ci7& +ci7* +ci7_ +ci7+ +ci7. +ci7' +ci80 +ci81 +ci82 +ci83 +ci84 +ci85 +ci86 +ci87 +ci88 +ci89 +ci8- +ci8! +ci8@ +ci8# +ci8$ +ci8& +ci8* +ci8_ +ci8+ +ci8. +ci8' + +ui10 +ui11 +ui12 +ui13 +ui14 +ui15 +ui16 +ui17 +ui18 +ui19 +ui1- +ui1! +ui1@ +ui1# +ui1$ +ui1& +ui1* +ui1_ +ui1+ +ui1. +ui1' +ui20 +ui21 +ui22 +ui23 +ui24 +ui25 +ui26 +ui27 +ui28 +ui29 +ui2- +ui2! +ui2@ +ui2# +ui2$ +ui2& +ui2* +ui2_ +ui2+ +ui2. +ui2' +ui30 +ui31 +ui32 +ui33 +ui34 +ui35 +ui36 +ui37 +ui38 +ui39 +ui3- +ui3! +ui3@ +ui3# +ui3$ +ui3& +ui3* +ui3_ +ui3+ +ui3. +ui3' +ui40 +ui41 +ui42 +ui43 +ui44 +ui45 +ui46 +ui47 +ui48 +ui49 +ui4- +ui4! +ui4@ +ui4# +ui4$ +ui4& +ui4* +ui4_ +ui4+ +ui4. +ui4' +ui50 +ui51 +ui52 +ui53 +ui54 +ui55 +ui56 +ui57 +ui58 +ui59 +ui5- +ui5! +ui5@ +ui5# +ui5$ +ui5& +ui5* +ui5_ +ui5+ +ui5. +ui5' +ui60 +ui61 +ui62 +ui63 +ui64 +ui65 +ui66 +ui67 +ui68 +ui69 +ui6- +ui6! +ui6@ +ui6# +ui6$ +ui6& +ui6* +ui6_ +ui6+ +ui6. +ui6' + +o10 +o11 +o12 +o13 +o14 +o15 +o16 +o17 +o18 +o19 +o1- +o1! +o1@ +o1# +o1$ +o1& +o1* +o1_ +o1+ +o1. +o20 +o21 +o22 +o23 +o24 +o25 +o26 +o27 +o28 +o29 +o2- +o2! +o2@ +o2# +o2$ +o2& +o2* +o2_ +o2+ +o2. +o30 +o31 +o32 +o33 +o34 +o35 +o36 +o37 +o38 +o39 +o3- +o3! +o3@ +o3# +o3$ +o3& +o3* +o3_ +o3+ +o3. +o40 +o41 +o42 +o43 +o44 +o45 +o46 +o47 +o48 +o49 +o4- +o4! +o4@ +o4# +o4$ +o4& +o4* +o4_ +o4+ +o4. +o50 +o51 +o52 +o53 +o54 +o55 +o56 +o57 +o58 +o59 +o5- +o5! +o5@ +o5# +o5$ +o5& +o5* +o5_ +o5+ +o5. +o60 +o61 +o62 +o63 +o64 +o65 +o66 +o67 +o68 +o69 +o6- +o6! +o6@ +o6# +o6$ +o6& +o6* +o6_ +o6+ +o6. +o70 +o71 +o72 +o73 +o74 +o75 +o76 +o77 +o78 +o79 +o7- +o7! +o7@ +o7# +o7$ +o7& +o7* +o7_ +o7+ +o7. +o80 +o81 +o82 +o83 +o84 +o85 +o86 +o87 +o88 +o89 +o8- +o8! +o8@ +o8# +o8$ +o8& +o8* +o8_ +o8+ +o8. +o90 +o91 +o92 +o93 +o94 +o95 +o96 +o97 +o98 +o99 +o9- +o9! +o9@ +o9# +o9$ +o9& +o9* +o9_ +o9+ +o9. + +co10 +co11 +co12 +co13 +co14 +co15 +co16 +co17 +co18 +co19 +co1- +co1! +co1@ +co1# +co1$ +co1& +co1* +co1_ +co1+ +co1. +co20 +co21 +co22 +co23 +co24 +co25 +co26 +co27 +co28 +co29 +co2- +co2! +co2@ +co2# +co2$ +co2& +co2* +co2_ +co2+ +co2. +co30 +co31 +co32 +co33 +co34 +co35 +co36 +co37 +co38 +co39 +co3- +co3! +co3@ +co3# +co3$ +co3& +co3* +co3_ +co3+ +co3. +co40 +co41 +co42 +co43 +co44 +co45 +co46 +co47 +co48 +co49 +co4- +co4! +co4@ +co4# +co4$ +co4& +co4* +co4_ +co4+ +co4. +co50 +co51 +co52 +co53 +co54 +co55 +co56 +co57 +co58 +co59 +co5- +co5! +co5@ +co5# +co5$ +co5& +co5* +co5_ +co5+ +co5. +co60 +co61 +co62 +co63 +co64 +co65 +co66 +co67 +co68 +co69 +co6- +co6! +co6@ +co6# +co6$ +co6& +co6* +co6_ +co6+ +co6. +co70 +co71 +co72 +co73 +co74 +co75 +co76 +co77 +co78 +co79 +co7- +co7! +co7@ +co7# +co7$ +co7& +co7* +co7_ +co7+ +co7. +co80 +co81 +co82 +co83 +co84 +co85 +co86 +co87 +co88 +co89 +co8- +co8! +co8@ +co8# +co8$ +co8& +co8* +co8_ +co8+ +co8. +co90 +co91 +co92 +co93 +co94 +co95 +co96 +co97 +co98 +co99 +co9- +co9! +co9@ +co9# +co9$ +co9& +co9* +co9_ +co9+ +co9. + +$1$9$6$0 +$1$9$6$1 +$1$9$6$2 +$1$9$6$3 +$1$9$6$4 +$1$9$6$5 +$1$9$6$6 +$1$9$6$7 +$1$9$6$8 +$1$9$6$9 +$1$9$7$0 +$1$9$7$1 +$1$9$7$2 +$1$9$7$3 +$1$9$7$4 +$1$9$7$5 +$1$9$7$6 +$1$9$7$7 +$1$9$7$8 +$1$9$7$9 +$1$9$8$0 +$1$9$8$1 +$1$9$8$2 +$1$9$8$3 +$1$9$8$4 +$1$9$8$5 +$1$9$8$6 +$1$9$8$7 +$1$9$8$8 +$1$9$8$9 +$1$9$9$0 +$1$9$9$1 +$1$9$9$2 +$1$9$9$3 +$1$9$9$4 +$1$9$9$5 +$1$9$9$6 +$1$9$9$7 +$1$9$9$8 +$1$9$9$9 +$2$0$0$0 +$2$0$0$1 +$2$0$0$2 +$2$0$0$3 +$2$0$0$4 +$2$0$0$5 +$2$0$0$6 +$2$0$0$7 +$2$0$0$8 +$2$0$0$9 +$2$0$1$0 +$3$0$0$0 +$4$0$0$0 +$5$0$0$0 +$6$0$0$0 +$7$0$0$0 +$8$0$0$0 +$9$0$0$0 + +c$1$9$6$0 +c$1$9$6$1 +c$1$9$6$2 +c$1$9$6$3 +c$1$9$6$4 +c$1$9$6$5 +c$1$9$6$6 +c$1$9$6$7 +c$1$9$6$8 +c$1$9$6$9 +c$1$9$7$0 +c$1$9$7$1 +c$1$9$7$2 +c$1$9$7$3 +c$1$9$7$4 +c$1$9$7$5 +c$1$9$7$6 +c$1$9$7$7 +c$1$9$7$8 +c$1$9$7$9 +c$1$9$8$0 +c$1$9$8$1 +c$1$9$8$2 +c$1$9$8$3 +c$1$9$8$4 +c$1$9$8$5 +c$1$9$8$6 +c$1$9$8$7 +c$1$9$8$8 +c$1$9$8$9 +c$1$9$9$0 +c$1$9$9$1 +c$1$9$9$2 +c$1$9$9$3 +c$1$9$9$4 +c$1$9$9$5 +c$1$9$9$6 +c$1$9$9$7 +c$1$9$9$8 +c$1$9$9$9 +c$2$0$0$0 +c$2$0$0$1 +c$2$0$0$2 +c$2$0$0$3 +c$2$0$0$4 +c$2$0$0$5 +c$2$0$0$6 +c$2$0$0$7 +c$2$0$0$8 +c$2$0$0$9 +c$2$0$1$0 + +u$1$9$6$0 +u$1$9$6$1 +u$1$9$6$2 +u$1$9$6$3 +u$1$9$6$4 +u$1$9$6$5 +u$1$9$6$6 +u$1$9$6$7 +u$1$9$6$8 +u$1$9$6$9 +u$1$9$7$0 +u$1$9$7$1 +u$1$9$7$2 +u$1$9$7$3 +u$1$9$7$4 +u$1$9$7$5 +u$1$9$7$6 +u$1$9$7$7 +u$1$9$7$8 +u$1$9$7$9 +u$1$9$8$0 +u$1$9$8$1 +u$1$9$8$2 +u$1$9$8$3 +u$1$9$8$4 +u$1$9$8$5 +u$1$9$8$6 +u$1$9$8$7 +u$1$9$8$8 +u$1$9$8$9 +u$1$9$9$0 +u$1$9$9$1 +u$1$9$9$2 +u$1$9$9$3 +u$1$9$9$4 +u$1$9$9$5 +u$1$9$9$6 +u$1$9$9$7 +u$1$9$9$8 +u$1$9$9$9 +u$2$0$0$0 +u$2$0$0$1 +u$2$0$0$2 +u$2$0$0$3 +u$2$0$0$4 +u$2$0$0$5 +u$2$0$0$6 +u$2$0$0$7 +u$2$0$0$8 +u$2$0$0$9 +u$2$0$1$0 + +^0^6^9^1 +^1^6^9^1 +^2^6^9^1 +^3^6^9^1 +^4^6^9^1 +^5^6^9^1 +^6^6^9^1 +^7^6^9^1 +^8^6^9^1 +^9^6^9^1 +^0^7^9^1 +^1^7^9^1 +^2^7^9^1 +^3^7^9^1 +^4^7^9^1 +^5^7^9^1 +^6^7^9^1 +^7^7^9^1 +^8^7^9^1 +^9^7^9^1 +^0^8^9^1 +^1^8^9^1 +^2^8^9^1 +^3^8^9^1 +^4^8^9^1 +^5^8^9^1 +^6^8^9^1 +^7^8^9^1 +^8^8^9^1 +^9^8^9^1 +^0^9^9^1 +^1^9^9^1 +^2^9^9^1 +^3^9^9^1 +^4^9^9^1 +^5^9^9^1 +^6^9^9^1 +^7^9^9^1 +^8^9^9^1 +^9^9^9^1 +^0^0^0^2 +^1^0^0^2 +^2^0^0^2 +^3^0^0^2 +^4^0^0^2 +^5^0^0^2 +^6^0^0^2 +^7^0^0^2 +^8^0^0^2 +^9^0^0^2 +^0^1^0^2 + +c^0^6^9^1 +c^1^6^9^1 +c^2^6^9^1 +c^3^6^9^1 +c^4^6^9^1 +c^5^6^9^1 +c^6^6^9^1 +c^7^6^9^1 +c^8^6^9^1 +c^9^6^9^1 +c^0^7^9^1 +c^1^7^9^1 +c^2^7^9^1 +c^3^7^9^1 +c^4^7^9^1 +c^5^7^9^1 +c^6^7^9^1 +c^7^7^9^1 +c^8^7^9^1 +c^9^7^9^1 +c^0^8^9^1 +c^1^8^9^1 +c^2^8^9^1 +c^3^8^9^1 +c^4^8^9^1 +c^5^8^9^1 +c^6^8^9^1 +c^7^8^9^1 +c^8^8^9^1 +c^9^8^9^1 +c^0^9^9^1 +c^1^9^9^1 +c^2^9^9^1 +c^3^9^9^1 +c^4^9^9^1 +c^5^9^9^1 +c^6^9^9^1 +c^7^9^9^1 +c^8^9^9^1 +c^9^9^9^1 +c^0^0^0^2 +c^1^0^0^2 +c^2^0^0^2 +c^3^0^0^2 +c^4^0^0^2 +c^5^0^0^2 +c^6^0^0^2 +c^7^0^0^2 +c^8^0^0^2 +c^9^0^0^2 +c^0^1^0^2 + +u^0^6^9^1 +u^1^6^9^1 +u^2^6^9^1 +u^3^6^9^1 +u^4^6^9^1 +u^5^6^9^1 +u^6^6^9^1 +u^7^6^9^1 +u^8^6^9^1 +u^9^6^9^1 +u^0^7^9^1 +u^1^7^9^1 +u^2^7^9^1 +u^3^7^9^1 +u^4^7^9^1 +u^5^7^9^1 +u^6^7^9^1 +u^7^7^9^1 +u^8^7^9^1 +u^9^7^9^1 +u^0^8^9^1 +u^1^8^9^1 +u^2^8^9^1 +u^3^8^9^1 +u^4^8^9^1 +u^5^8^9^1 +u^6^8^9^1 +u^7^8^9^1 +u^8^8^9^1 +u^9^8^9^1 +u^0^9^9^1 +u^1^9^9^1 +u^2^9^9^1 +u^3^9^9^1 +u^4^9^9^1 +u^5^9^9^1 +u^6^9^9^1 +u^7^9^9^1 +u^8^9^9^1 +u^9^9^9^1 +u^0^0^0^2 +u^1^0^0^2 +u^2^0^0^2 +u^3^0^0^2 +u^4^0^0^2 +u^5^0^0^2 +u^6^0^0^2 +u^7^0^0^2 +u^8^0^0^2 +u^9^0^0^2 +u^0^1^0^2 + +^0 +^1 +^2 +^3 +^4 +^5 +^6 +^7 +^8 +^9 +^0^0 +^1^0 +^2^0 +^3^0 +^4^0 +^5^0 +^6^0 +^7^0 +^8^0 +^9^0 +^0^1 +^1^1 +^2^1 +^3^1 +^4^1 +^5^1 +^6^1 +^7^1 +^8^1 +^9^1 +^0^2 +^1^2 +^2^2 +^3^2 +^4^2 +^5^2 +^6^2 +^7^2 +^8^2 +^9^2 +^0^3 +^1^3 +^2^3 +^3^3 +^4^3 +^5^3 +^6^3 +^7^3 +^8^3 +^9^3 +^0^4 +^1^4 +^2^4 +^3^4 +^4^4 +^5^4 +^6^4 +^7^4 +^8^4 +^9^4 +^0^5 +^1^5 +^2^5 +^3^5 +^4^5 +^5^5 +^6^5 +^7^5 +^8^5 +^9^5 +^0^6 +^1^6 +^2^6 +^3^6 +^4^6 +^5^6 +^6^6 +^7^6 +^8^6 +^9^6 +^0^7 +^1^7 +^2^7 +^3^7 +^4^7 +^5^7 +^6^7 +^7^7 +^8^7 +^9^7 +^0^8 +^1^8 +^2^8 +^3^8 +^4^8 +^5^8 +^6^8 +^7^8 +^8^8 +^9^8 +^0^9 +^1^9 +^2^9 +^3^9 +^4^9 +^5^9 +^6^9 +^7^9 +^8^9 +^9^9 + +c^0 +c^1 +c^2 +c^3 +c^4 +c^5 +c^6 +c^7 +c^8 +c^9 +c^0^0 +c^1^0 +c^2^0 +c^3^0 +c^4^0 +c^5^0 +c^6^0 +c^7^0 +c^8^0 +c^9^0 +c^0^1 +c^1^1 +c^2^1 +c^3^1 +c^4^1 +c^5^1 +c^6^1 +c^7^1 +c^8^1 +c^9^1 +c^0^2 +c^1^2 +c^2^2 +c^3^2 +c^4^2 +c^5^2 +c^6^2 +c^7^2 +c^8^2 +c^9^2 +c^0^3 +c^1^3 +c^2^3 +c^3^3 +c^4^3 +c^5^3 +c^6^3 +c^7^3 +c^8^3 +c^9^3 +c^0^4 +c^1^4 +c^2^4 +c^3^4 +c^4^4 +c^5^4 +c^6^4 +c^7^4 +c^8^4 +c^9^4 +c^0^5 +c^1^5 +c^2^5 +c^3^5 +c^4^5 +c^5^5 +c^6^5 +c^7^5 +c^8^5 +c^9^5 +c^0^6 +c^1^6 +c^2^6 +c^3^6 +c^4^6 +c^5^6 +c^6^6 +c^7^6 +c^8^6 +c^9^6 +c^0^7 +c^1^7 +c^2^7 +c^3^7 +c^4^7 +c^5^7 +c^6^7 +c^7^7 +c^8^7 +c^9^7 +c^0^8 +c^1^8 +c^2^8 +c^3^8 +c^4^8 +c^5^8 +c^6^8 +c^7^8 +c^8^8 +c^9^8 +c^0^9 +c^1^9 +c^2^9 +c^3^9 +c^4^9 +c^5^9 +c^6^9 +c^7^9 +c^8^9 +c^9^9 + +u^0 +u^1 +u^2 +u^3 +u^4 +u^5 +u^6 +u^7 +u^8 +u^9 + +$1$2$3 +$1$2$3$4 +$1$2$3$4$5 +$1$2$3$4$5$6 +c$1$2$3 +c$1$2$3$4 +c$1$2$3$4$5 +c$1$2$3$4$5$6 +u$1$2$3 +u$1$2$3$4 +u$1$2$3$4$5 +u$1$2$3$4$5$6 + +$6$5$4$3$2$1 +$5$4$3$2$1 +$4$3$2$1 +$3$2$1 +c$6$5$4$3$2$1 +c$5$4$3$2$1 +c$4$3$2$1 +c$3$2$1 +u$6$5$4$3$2$1 +u$5$4$3$2$1 +u$4$3$2$1 +u$3$2$1 + +^6^5^4^3^2^1 +^5^4^3^2^1 +^4^3^2^1 +^3^2^1 +c^6^5^4^3^2^1 +c^5^4^3^2^1 +c^4^3^2^1 +c^3^2^1 +u^6^5^4^3^2^1 +u^5^4^3^2^1 +u^4^3^2^1 +u^3^2^1 + +$0$0$0 +$0$0$1 +$0$0$7 +$1$1$1 +$2$2$2 +$3$3$3 +$4$4$4 +$5$5$5 +$6$6$6 +$7$7$7 +$8$8$8 +$9$9$9 +$2$3$4 +$3$4$5 +$4$5$6 +$5$6$7 +$6$7$8 +$7$8$9 + +c$0$0$0 +c$0$0$1 +c$0$0$7 +c$1$1$1 +c$2$2$2 +c$3$3$3 +c$4$4$4 +c$5$5$5 +c$6$6$6 +c$7$7$7 +c$8$8$8 +c$9$9$9 +c$2$3$4 +c$3$4$5 +c$4$5$6 +c$5$6$7 +c$6$7$8 +c$7$8$9 + +u$0$0$0 +u$0$0$1 +u$0$0$7 +u$1$1$1 +u$2$2$2 +u$3$3$3 +u$4$4$4 +u$5$5$5 +u$6$6$6 +u$7$7$7 +u$8$8$8 +u$9$9$9 +u$2$3$4 +u$3$4$5 +u$4$5$6 +u$5$6$7 +u$6$7$8 +u$7$8$9 + +$a +$b +$c +$d +$e +$f +$g +$h +$i +$j +$k +$l +$m +$n +$o +$p +$q +$r +$s +$t +$u +$v +$w +$x +$y +$z + +$A +$B +$C +$D +$E +$F +$G +$H +$I +$J +$K +$L +$M +$N +$O +$P +$Q +$R +$S +$T +$U +$V +$W +$X +$Y +$Z + +^a +^b +^c +^d +^e +^f +^g +^h +^i +^j +^k +^l +^m +^n +^o +^p +^q +^r +^s +^t +^u +^v +^w +^x +^y +^z + +^A +^B +^C +^D +^E +^F +^G +^H +^I +^J +^K +^L +^M +^N +^O +^P +^Q +^R +^S +^T +^U +^V +^W +^X +^Y +^Z + +^+$+ +^*$* +^0$0 +^1$1 +^1$2 +^2$2 +^3$3 +^4$4 +^5$5 +^6$6 +^7$7 +^8$8 +^9$9 +^x$x +^=$= +^-$- +^_$_ +^$$$ +^#$# +^<$> +^!$! +^@$@ +^($) +^[$] +^{$} +^"$" + +c^+$+ +c^*$* +c^0$0 +c^1$1 +c^1$2 +c^2$2 +c^3$3 +c^4$4 +c^5$5 +c^6$6 +c^7$7 +c^8$8 +c^9$9 +c^=$= +c^-$- +c^_$_ +c^$$$ +c^#$# +c^<$> +c^!$! +c^@$@ +c^($) +c^[$] +c^{$} +c^"$" + +$1$! +$!$1 +$2$u +$4$u +$2$k +$:$) +$;$) +$m$e +$x$x$x +$1$s$t +$2$m$e +$4$u$s +$4$m$y +$4$m$e +$4$M$e +$4$a$l$l +$4$e$v$e$r +$4$l$i$f$e +$4$f$r$e$e + +^k^2 +^y^m +^y^m^4 +^m^a^i +^e^v^o^l^i +^e^h^t^e^v^o^l^i +^y^m^e^v^o^l^i +^e^h^t +^1^e^h^t +^l^l^a^4 +^t^s^1 + +c$1$! +c$!$1 +c$2$u +c$4$u +c$4$U +c$2$k +c$:$) +c$m$e +c$x$x$x +c$1$s$t +c$2$m$e +c$4$u$s +c$4$m$y +c$4$m$e +c$4$M$e +c$4$a$l$l +c$4$e$v$e$r +c$4$l$i$f$e +c$4$f$r$e$e + +c^k^2 +c^y^m +c^y^M +c^y^m^4 +c^m^a^i +c^m^a^I +c^e^v^o^l^i +c^e^h^t^e^v^o^l^i +c^e^v^o^l^I +c^e^h^t +c^e^h^T +c^1^e^h^t +c^1^e^h^T +c^l^l^a^4 +c^t^s^1 + +^@^! +^#^@^! +^$^#^@^! +^%^$^#^@^! +$!$@ +$!$@$# +$!$@$#$$ +$!$@$#$$$% + +c^@^! +c^#^@^! +c^$^#^@^! +c^%^$^#^@^! +c$!$@ +c$!$@$# +c$!$@$#$$ +c$!$@$#$$$% + +$0$9$8 +$0$9$8$7 +$0$9$8$7$6 +$0$9$8$7$6$5 +c$0$9$8 +c$0$9$8$7 +c$0$9$8$7$6 +c$0$9$8$7$6$5 + +$a$b +$a$b$c +$a$b$c$d +$a$b$c$d$e +c$a$b +c$a$b$c +c$a$b$c$d +c$a$b$c$d$e + +d$0 +d$1 +d$2 +d$3 +d$4 +d$5 +d$6 +d$7 +d$8 +d$9 + +p3$0 +p3$1 +p3$2 +p3$3 +p3$4 +p3$5 +p3$6 +p3$7 +p3$8 +p3$9 + +i11i32 +i11i32i53 +i11i32i53i74 +i11i32i53i74i95 +i11i32i53i74i95iB6 +i11i32i53i74i95iB6iD7 +i11i31 +i11i31i51 +i11i31i51i71 +i11i31i51i71i91 +i11i31i51i71i91iB1 +i10i31 +i10i31i52 +i10i31i52i73 +i10i31i52i73i94 +i11i31 +i11i31i51 +i11i31i51i71 +i11i31i51i71i91 + +ci11i32 +ci11i32i53 +ci11i32i53i74 +ci11i32i53i74i95 +ci11i32i53i74i95iB6 +ci11i32i53i74i95iB6iD7 +ci11i31 +ci11i31i51 +ci11i31i51i71 +ci11i31i51i71i91 +ci11i31i51i71i91iB1 +ci10i31 +ci10i31i52 +ci10i31i52i73 +ci10i31i52i73i94 +ci11i31 +ci11i31i51 +ci11i31i51i71 +ci11i31i51i71i91 + +ui11i32 +ui11i32i53 +ui11i32i53i74 +ui11i32i53i74i95 +ui11i32i53i74i95iB6 +ui11i32i53i74i95iB6iD7 +ui11i31 +ui11i31i51 +ui11i31i51i71 +ui11i31i51i71i91 +ui11i31i51i71i91iB1 +ui10i31 +ui10i31i52 +ui10i31i52i73 +ui10i31i52i73i94 +ui11i31 +ui11i31i51 +ui11i31i51i71 +ui11i31i51i71i91 + +$1$2$a$b +$1$2$3$a$b$c +c$1$2$a$b +c$1$2$3$a$b$c +u$1$2$a$b +u$1$2$3$a$b$c + +$.$c$o$m +$.$n$e$t +$.$o$r$g +$.$g$o$v +$.$i$n$f$o +$.$b$i$z +$.$r$u +$.$u$s +$.$d$e +$.$f$r + +$@$g$m$a$i$l$.$c$o$m +$@$g$m$x$.$d$e +$@$m$a$i$l$.$r$u +$@$y$a$n$d$e$x$.$r$u +$@$m$s$n$.$c$o$m + +D0 +D1 +D2 +D3 +D4 +D5 +D6 +D7 +D8 +D9 +DA + +T1 +T2 +T3 +T4 +T5 +T6 +T7 +T8 +T9 +TA +TB +TC +TD + +cT1 +cT2 +cT3 +cT4 +cT5 +cT6 +cT7 +cT8 +cT9 +cTA +cTB + +cT1i1- +cT2i2- +cT3i3- +cT4i4- +cT5i5- +cT6i6- +cT7i7- +cT8i8- +cT9i9- +cTAiA- +cTBiB- + +cT1i1_ +cT2i2_ +cT3i3_ +cT4i4_ +cT5i5_ +cT6i6_ +cT7i7_ +cT8i8_ +cT9i9_ +cTAiA_ +cTBiB_ + +cT1i1. +cT2i2. +cT3i3. +cT4i4. +cT5i5. +cT6i6. +cT7i7. +cT8i8. +cT9i9. +cTAiA. +cTBiB. + +cT1i1+ +cT2i2+ +cT3i3+ +cT4i4+ +cT5i5+ +cT6i6+ +cT7i7+ +cT8i8+ +cT9i9+ +cTAiA+ +cTBiB+ + +cT1i1& +cT2i2& +cT3i3& +cT4i4& +cT5i5& +cT6i6& +cT7i7& +cT8i8& +cT9i9& +cTAiA& +cTBiB& + +cT1T2 +cT1T2T3 +cT1T2T4T5 +cT1T2T4T5T6 + +^2^1$3 +^1$2$3 +^2^1$3$4 +^3^2^1$4$5 +^2^1$3$4$5 +^3^2^1$3$2$1 +^3^2^1$4$5$6 + +i13i24^2^1 +i23i34^2^1 +i33i44^2^1 +i43i54^2^1 +i53i64^2^1 + +$1$2$!$@ +$1$2$3$!$@$# + +T1T3 +T1T3T5 +T1T3T5T7 +T1T3T5T7T9 +T1T3T5T7T9TB + +cT2T4 +cT2T4T6 +cT2T4T6T8 +cT2T4T6T8TA +cT2T4T6T8TATC + +i11i22 +i11i22i33 +i21i32 +i21i32i43 +i31i42 +i31i42i53 +i41i52 +i41i52i63 +i51i62 +i51i62i73 + +$0d +$1d +$2d +$3d +$4d +$5d +$6d +$7d +$8d +$9d + +c$0d +c$1d +c$2d +c$3d +c$4d +c$5d +c$6d +c$7d +c$8d +c$9d + +cT1d +cT2d +cT3d +cT4d +cT5d + +cT1f +cT2f +cT3f + +$. +^. +$+ +^+ +$$ +^$ +$! +^! +$@ +^@ +$# +^# +$& +^& +$* +^* +$? +^? +$_ +^_ +$- +^- + +c$. +c^. +c$+ +c^+ +c$$ +c^$ +c$! +c^! +c$@ +c^@ +c$# +c^# +c$& +c^& +c$* +c^* +c$? +c^? +c$_ +c^_ +c$- +c^- + +u$. +u^. +u$* +u^* +u$+ +u^+ +u$$ +u^$ +u$! +u^! +u$@ +u^@ +u$# +u^# +u$& +u^& +u$* +u^* +u$? +u^? +u$_ +u^_ +u$- +u^- + +^0d +^1d +^2d +^3d +^4d +^5d +^6d +^7d +^8d +^9d + +c^0d +c^1d +c^2d +c^3d +c^4d +c^5d +c^6d +c^7d +c^8d +c^9d + +i1.i3. +cT1T2i1.i3. +cT1i1. +cT2i2. +cT3i3. +cT4i4. +cT5i5. + +$0d] +$1d] +$2d] +$3d] +$4d] +$5d] +$6d] +$7d] +$8d] +$9d] +$.d] +$*d] +$-d] +$+d] +$!d] +$&d] +$_d] + +c$0d] +c$1d] +c$2d] +c$3d] +c$4d] +c$5d] +c$6d] +c$7d] +c$8d] +c$9d] +c$.d] +c$*d] +c$-d] +c$+d] +c$!d] +c$&d] +c$_d] + +u$0d] +u$1d] +u$2d] +u$3d] +u$4d] +u$5d] +u$6d] +u$7d] +u$8d] +u$9d] +u$.d] +u$*d] +u$-d] +u$+d] +u$!d] +u$&d] +u$_d] + +$1$2d]] +$1$2$3d]]] +$1$2$3$4d]]]] +$1$2$3$4$5d]]]]] + +^@^!$@$! +^#^@^!$#$@$! +^$^#^@^!$$$#$@$! +^@^!$!$@ +^#^@^!$!$@$# +^$^#^@^!$!$@$#$$ + +i1-i3- +i1-i3-i5- +i1-i3-i5-i7- +i1-i3-i5-i7-i9- + +i1.i3.$. +i1.i3.i5. +i1.i3.i5.$. +i1.i3.i5.i7. +i1.i3.i5.i7.$. +i1.i3.i5.i7.i9. +i1.i3.i5.i7.i9.$. + +ui1.i3. +ui1.i3.$. +ui1.i3.i5. +ui1.i3.i5.$. +ui1.i3.i5.i7. +ui1.i3.i5.i7.$. +ui1.i3.i5.i7.i9. +ui1.i3.i5.i7.i9.$. + +st7 +sg9 +sb5 +sb8 +ss5 +ss3 +sa4 +su4 +sa@ +so0 +si1 +se3 +si! +ss$ +sl1 + +sa@so0 +sa@si1 +sa@se3 +sa@si! +sa@ss$ +sa@sl1 +so0si1 +so0se3 +so0si! +so0ss$ +so0sl1 +si1se3 +si1ss$ +se3si! +se3ss$ +se3sl1 +si!ss$ +si!sl1 +ss$sl1 + +cst7 +csg9 +csb5 +csb8 +css5 +css3 +csa4 +csu4 +csa@ +cso0 +csi1 +cse3 +csi! +css$ +csl1 + +csa@so0 +csa@si1 +csa@se3 +csa@si! +csa@ss$ +csa@sl1 +cso0si1 +cso0se3 +cso0si! +cso0ss$ +cso0sl1 +csi1se3 +csi1ss$ +cse3si! +cse3ss$ +cse3sl1 +csi!ss$ +csi!sl1 +css$sl1 + +sa@so0si1 +sa@so0se3 +so0se3si1 +sa@se3si1 +sa@so0si! +sa@so0se3 +so0se3si! +sa@se3si! +sa@so0ss$ +sa@se3ss$ +sa@si1ss$ +so0se3ss$ +so0si1ss$ +se3si1ss$ +sa@si!ss$ +so0si!ss$ +se3si!ss$ + +sa@so0si1se3 +sa@so0si!se3 +sa@so0si1se3su4 +sa@so0si!se3su4 + +csa@so0si1 +csa@so0se3 +cso0se3si1 +csa@se3si1 +csa@so0si! +csa@so0se3 +cso0se3si! +csa@se3si! +csa@so0ss$ +csa@se3ss$ +csa@si1ss$ +cso0se3ss$ +cso0si1ss$ +cse3si1ss$ +csa@si!ss$ +cso0si!ss$ +cse3si!ss$ + +csa@so0si1se3 +csa@so0si!se3 +csa@so0si1se3su4 +csa@so0si!se3su4 + +st7u +sg9u +sb5u +sb8u +ss5u +ss3u +sa4u +su4u +sa@u +so0u +si1u +se3u +si!u +ss$u +sl1u + +sa@so0u +sa@si1u +sa@se3u +sa@si!u +sa@ss$u +sa@sl1u +so0si1u +so0se3u +so0si!u +so0ss$u +so0sl1u +si1se3u +si1ss$u +se3si!u +se3ss$u +se3sl1u +si!ss$u +si!sl1u +ss$sl1u + +st7d +sg9d +sb5d +sb8d +ss5d +ss3d +sa4d +su4d +sa@d +so0d +si1d +se3d +si!d +ss$d +sl1d + +cst7d +csg9d +csb5d +csb8d +css5d +css3d +csa4d +csu4d +csa@d +cso0d +csi1d +cse3d +csi!d +css$d +csl1d + +^$^$ +^*^* +$!$!^$^$ +$*$*^*^* +^1^! +^!^1 + +c^$^$ +c^*^* +c$!$!^$^$ +c$*$*^*^* +c^1^! +c^!^1 + +$.d +^.d +$+d +^+d +$$d +^$d +$!d +^!d +$@d +^@d +$#d +^#d +$&d +^&d +$*d +^*d +$_d +^_d +$-d +^-d + +c$.d +c^.d +c$+d +c^+d +c$$d +c^$d +c$!d +c^!d +c$@d +c^@d +c$#d +c^#d +c$&d +c^&d +c$*d +c^*d +c$_d +c^_d +c$-d +c^-d + +$0dD4 +$1dD4 +$2dD4 +$3dD4 +$4dD4 +$5dD4 +$6dD4 +$7dD4 +$8dD4 +$9dD4 + +$0dD5 +$1dD5 +$2dD5 +$3dD5 +$4dD5 +$5dD5 +$6dD5 +$7dD5 +$8dD5 +$9dD5 + +$0dD6 +$1dD6 +$2dD6 +$3dD6 +$4dD6 +$5dD6 +$6dD6 +$7dD6 +$8dD6 +$9dD6 + +$0dD7 +$1dD7 +$2dD7 +$3dD7 +$4dD7 +$5dD7 +$6dD7 +$7dD7 +$8dD7 +$9dD7 + +d$. +d$+ +d$$ +d$! +d$@ +d$# +d$& +d$* +d$_ +d$- + +ss5se3 +css5se3 +so0sa4 +cso0sa4 + +cst7$! +csg9$! +csb5$! +csb8$! +css5$! +css3$! +csa4$! +csu4$! +csa@$! +cso0$! +csi1$! +cse3$! +csi!$! +css$$! +csl1$! + +sa@T1 +so0T1 +si1T1 +se3T1 +si!T1 +ss$T1 +sl1T1 + +sa@T2 +so0T2 +si1T2 +se3T2 +si!T2 +ss$T2 +sl1T2 + +sa@T3 +so0T3 +si1T3 +se3T3 +si!T3 +ss$T3 +sl1T3 + +sa@T4 +so0T4 +si1T4 +se3T4 +si!T4 +ss$T4 +sl1T4 + +sa@T5 +so0T5 +si1T5 +se3T5 +si!T5 +ss$T5 +sl1T5 + +sa@T6 +so0T6 +si1T6 +se3T6 +si!T6 +ss$T6 +sl1T6 + +sa@T7 +so0T7 +si1T7 +se3T7 +si!T7 +ss$T7 +sl1T7 + +sa@T8 +so0T8 +si1T8 +se3T8 +si!T8 +ss$T8 +sl1T8 + +csa@T1 +cso0T1 +csi1T1 +cse3T1 +csi!T1 +css$T1 +csl1T1 + +csa@T2 +cso0T2 +csi1T2 +cse3T2 +csi!T2 +css$T2 +csl1T2 + +csa@T3 +cso0T3 +csi1T3 +cse3T3 +csi!T3 +css$T3 +csl1T3 + +csa@T4 +cso0T4 +csi1T4 +cse3T4 +csi!T4 +css$T4 +csl1T4 + +csa@T5 +cso0T5 +csi1T5 +cse3T5 +csi!T5 +css$T5 +csl1T5 + +csa@T6 +cso0T6 +csi1T6 +cse3T6 +csi!T6 +css$T6 +csl1T6 + +csa@T7 +cso0T7 +csi1T7 +cse3T7 +csi!T7 +css$T7 +csl1T7 + +cT1$1 +cT2$1 +cT3$1 +cT4$1 +cT5$1 +cT6$1 +cT7$1 +cT8$1 +cT9$1 +cTA$1 +cTB$1 + +$.$. +$.$.$. + +i11T2 +i12T2 +i13T2 +i14T2 +i15T2 +i16T2 +i17T2 +i18T2 +i19T2 +i10T2 +i21T3 +i22T3 +i23T3 +i24T3 +i25T3 +i26T3 +i27T3 +i28T3 +i29T3 +i20T3 +i31T4 +i32T4 +i33T4 +i34T4 +i35T4 +i36T4 +i37T4 +i38T4 +i39T4 +i30T4 +i41T5 +i42T5 +i43T5 +i44T5 +i45T5 +i46T5 +i47T5 +i48T5 +i49T5 +i40T5 +i51T6 +i52T6 +i53T6 +i54T6 +i55T6 +i56T6 +i57T6 +i58T6 +i59T6 +i50T6 + +ci11T2 +ci12T2 +ci13T2 +ci14T2 +ci15T2 +ci16T2 +ci17T2 +ci18T2 +ci19T2 +ci10T2 +ci21T3 +ci22T3 +ci23T3 +ci24T3 +ci25T3 +ci26T3 +ci27T3 +ci28T3 +ci29T3 +ci20T3 +ci31T4 +ci32T4 +ci33T4 +ci34T4 +ci35T4 +ci36T4 +ci37T4 +ci38T4 +ci39T4 +ci30T4 +ci41T5 +ci42T5 +ci43T5 +ci44T5 +ci45T5 +ci46T5 +ci47T5 +ci48T5 +ci49T5 +ci40T5 +ci51T6 +ci52T6 +ci53T6 +ci54T6 +ci55T6 +ci56T6 +ci57T6 +ci58T6 +ci59T6 +ci50T6 +ci61T7 +ci62T7 +ci63T7 +ci64T7 +ci65T7 +ci66T7 +ci67T7 +ci68T7 +ci69T7 +ci60T7 + +cT1i1.i2Ai3. +cT1i1.i2Bi3. +cT1i1.i2Ci3. +cT1i1.i2Di3. +cT1i1.i2Ei3. +cT1i1.i2Fi3. +cT1i1.i2Gi3. +cT1i1.i2Hi3. +cT1i1.i2Ii3. +cT1i1.i2Ji3. +cT1i1.i2Ki3. +cT1i1.i2Li3. +cT1i1.i2Mi3. +cT1i1.i2Ni3. +cT1i1.i2Oi3. +cT1i1.i2Pi3. +cT1i1.i2Qi3. +cT1i1.i2Ri3. +cT1i1.i2Si3. +cT1i1.i2Ti3. +cT1i1.i2Ui3. +cT1i1.i2Vi3. +cT1i1.i2Wi3. +cT1i1.i2Xi3. +cT1i1.i2Yi3. +cT1i1.i2Zi3. + +i1a +i1e +i1u +i1o +i2a +i2e +i2u +i2o +i3a +i3e +i3u +i3o +i4a +i4e +i4u +i4o +i5a +i5e +i5u +i5o +i6a +i6e +i6u +i6o +i7a +i7e +i7u +i7o +i8a +i8e +i8u +i8o + +ci1a +ci1e +ci1u +ci1o +ci2a +ci2e +ci2u +ci2o +ci3a +ci3e +ci3u +ci3o +ci4a +ci4e +ci4u +ci4o +ci5a +ci5e +ci5u +ci5o +ci6a +ci6e +ci6u +ci6o +ci7a +ci7e +ci7u +ci7o +ci8a +ci8e +ci8u +ci8o diff --git a/rules/Ninja-leetspeak.rule b/rules/Ninja-leetspeak.rule new file mode 100644 index 0000000000..13b6c68cfd --- /dev/null +++ b/rules/Ninja-leetspeak.rule @@ -0,0 +1,2049 @@ +## common leetspeak rules +## written by Unix-Ninja +sa4 +sa4sb6 +sa4sb6sc< +sa4sb6sc +i1> +i2> +i3> +i4> +i5> +i6> +i7> +i8> +i9> +iA> +iB> +iC> +iD> +iE> +iF> +i0< +i1< +i2< +i3< +i4< +i5< +i6< +i7< +i8< +i9< +iA< +iB< +iC< +iD< +iE< +iF< +i0= +i1= +i2= +i3= +i4= +i5= +i6= +i7= +i8= +i9= +iA= +iB= +iC= +iD= +iE= +iF= +i0? +i1? +i2? +i3? +i4? +i5? +i6? +i7? +i8? +i9? +iA? +iB? +iC? +iD? +iE? +iF? +i0] +i1] +i2] +i3] +i4] +i5] +i6] +i7] +i8] +i9] +iA] +iB] +iC] +iD] +iE] +iF] +i0[ +i1[ +i2[ +i3[ +i4[ +i5[ +i6[ +i7[ +i8[ +i9[ +iA[ +iB[ +iC[ +iD[ +iE[ +iF[ +i0` +i1` +i2` +i3` +i4` +i5` +i6` +i7` +i8` +i9` +iA` +iB` +iC` +iD` +iE` +iF` +i0{ +i1{ +i2{ +i3{ +i4{ +i5{ +i6{ +i7{ +i8{ +i9{ +iA{ +iB{ +iC{ +iD{ +iE{ +iF{ +i0} +i1} +i2} +i3} +i4} +i5} +i6} +i7} +i8} +i9} +iA} +iB} +iC} +iD} +iE} +iF} +i0| +i1| +i2| +i3| +i4| +i5| +i6| +i7| +i8| +i9| +iA| +iB| +iC| +iD| +iE| +iF| +i0~ +i1~ +i2~ +i3~ +i4~ +i5~ +i6~ +i7~ +i8~ +i9~ +iA~ +iB~ +iC~ +iD~ +iE~ +iF~ \ No newline at end of file diff --git a/rules/T0XlC-insert_top_100_passwords_1_G.rule b/rules/T0XlC-insert_top_100_passwords_1_G.rule new file mode 100644 index 0000000000..c1e382076c --- /dev/null +++ b/rules/T0XlC-insert_top_100_passwords_1_G.rule @@ -0,0 +1,1604 @@ +# Created by: T0XlC +# TOP 100 words shifted from position 0 to position 18 +# In memory of d3ad0ne +: +i11i22i33 +i11i22i33i44 +i11i22i33i44i55 +i10i20i30i40i50i60 +i11i20i31i40i51i60 +i11i20i32i40i53i60 +i11i21i31i41i51i61 +i11i21i32i42i53i63 +i11i22i31i42i51i62 +i11i22i33i41i52i63 +i11i22i33i43i52i61 +i11i22i33i44i55i66 +i11i22i33i46i55i64 +i11i22i33i4ai5bi6c +i11i22i33i4qi5wi6e +i11i23i31i43i51i63 +i11i24i37i42i55i68 +i11i25i39i43i55i67 +i11i25i39i47i55i63 +i11i2qi32i4wi53i6e +i12i22i32i42i52i62 +i12i23i32i43i52i63 +i13i23i33i43i53i63 +i15i25i35i45i55i65 +i16i25i34i43i52i61 +i16i26i36i46i56i66 +i17i27i37i47i57i67 +i17i28i39i44i55i66 +i18i28i38i48i58i68 +i19i28i37i46i55i64 +i19i29i39i49i59i69 +i1ai2ai3ai4ai5ai6a +i1ai2bi3ci41i52i63 +i1ai2si3di41i52i63 +i1ai2si3di4ai5si6d +i1ai2si3di4fi5gi6h +i1bi2ai3ti4mi5ai6n +i1ci2oi3mi4pi5ai6q +i1di2ai3ni4ii5ei6l +i1di2ri3ai4gi5oi6n +i1ei2mi3ii4ni5ei6m +i1gi2oi3oi4gi5li6e +i1hi2ai3hi4ai5hi6a +i1ji2oi3ri4di5ai6n +i1ki2ii3li4li5ei6r +i1mi2ai3ri4ti5ii6n +i1mi2ai3si4ti5ei6r +i1mi2ai3ti4ri5ii6x +i1mi2oi3ni4ki5ei6y +i1qi21i3wi42i5ei63 +i1qi2ai3zi4wi5si6x +i1qi2wi3ei41i52i63 +i1qi2wi3ei4ai5si6d +i1qi2wi3ei4ri5ti6y +i1ri2oi3bi4ei5ri6t +i1si2hi3ai4di5oi6w +i11i22i33i44i55i66i77 +i11i22i33i44i55i66i7a +i17i27i37i47i57i67i77 +i1fi2ri3ei4ei5di6oi7m +i1fi2ui3ci4ki5yi6oi7u +i1ji2ei3si4si5ii6ci7a +i1li2ei3ti4mi5ei6ii7n +i1mi2ii3ci4hi5ai6ei7l +i1pi2oi3ki4ei5mi6oi7n +i1si2ai3mi4si5ui6ni7g +i1wi2ei3li4ci5oi6mi7e +i1zi2xi3ci4vi5bi6ni7m +i11i21i31i41i51i61i71i81 +i11i22i33i44i51i62i73i84 +i11i22i33i44i55i66i77i88 +i11i22i33i44i5qi6wi7ei8r +i11i2qi32i4wi53i6ei74i8r +i11i2qi3ai4zi52i6wi7si8x +i18i28i38i48i58i68i78i88 +i1ai2bi3ci4di51i62i73i84 +i1ai2si3di4fi51i62i73i84 +i1ai2si3di4fi5ai6si7di8f +i1ci2oi3ci4ai5ci6oi7li8a +i1ci2oi3mi4pi5ui6ti7ei8r +i1fi2oi3oi4ti5bi6ai7li8l +i1ii2li3oi4vi5ei6yi7oi8u +i1ii2ni3ti4ei5ri6ni7ei8t +i1pi2ai3si4si5wi6oi7ri8d +i1qi21i3wi42i5ei63i7ri84 +i1qi2wi3ei4ri51i62i73i84 +i1si2ti3ai4ri5wi6ai7ri8s +i1si2ui3ni4si5hi6ii7ni8e +i1si2ui3pi4ei5ri6mi7ai8n +i1ti2ri3ui4si5ti6ni7oi81 +i11i22i33i41i52i63i71i82i93 +i11i22i33i44i55i66i77i88i99 +i19i28i37i46i55i64i73i82i91 +i1ai2li3ei4xi5ai6ni7di8ei9r +i1ai2si3di4fi5gi6hi7ji8ki9l +i1mi2ei3ti4ai5li6li7ii8ci9a +i1pi2ai3si4si5wi6oi7ri8di91 +i1qi2wi3ei4ri5ti6yi71i82i93 +i11i22i33i44i55i66i77i88i99iA0 +i1qi2wi3ei4ri5ti6yi7ui8ii9oiAp +i21i32i43 +i21i32i43i54 +i21i32i43i54i65 +i20i30i40i50i60i70 +i21i30i41i50i61i70 +i21i30i42i50i63i70 +i21i31i41i51i61i71 +i21i31i42i52i63i73 +i21i32i41i52i61i72 +i21i32i43i51i62i73 +i21i32i43i53i62i71 +i21i32i43i54i65i76 +i21i32i43i56i65i74 +i21i32i43i5ai6bi7c +i21i32i43i5qi6wi7e +i21i33i41i53i61i73 +i21i34i47i52i65i78 +i21i35i49i53i65i77 +i21i35i49i57i65i73 +i21i3qi42i5wi63i7e +i22i32i42i52i62i72 +i22i33i42i53i62i73 +i23i33i43i53i63i73 +i25i35i45i55i65i75 +i26i35i44i53i62i71 +i26i36i46i56i66i76 +i27i37i47i57i67i77 +i27i38i49i54i65i76 +i28i38i48i58i68i78 +i29i38i47i56i65i74 +i29i39i49i59i69i79 +i2ai3ai4ai5ai6ai7a +i2ai3bi4ci51i62i73 +i2ai3si4di51i62i73 +i2ai3si4di5ai6si7d +i2ai3si4di5fi6gi7h +i2bi3ai4ti5mi6ai7n +i2ci3oi4mi5pi6ai7q +i2di3ai4ni5ii6ei7l +i2di3ri4ai5gi6oi7n +i2ei3mi4ii5ni6ei7m +i2gi3oi4oi5gi6li7e +i2hi3ai4hi5ai6hi7a +i2ji3oi4ri5di6ai7n +i2ki3ii4li5li6ei7r +i2mi3ai4ri5ti6ii7n +i2mi3ai4si5ti6ei7r +i2mi3ai4ti5ri6ii7x +i2mi3oi4ni5ki6ei7y +i2qi31i4wi52i6ei73 +i2qi3ai4zi5wi6si7x +i2qi3wi4ei51i62i73 +i2qi3wi4ei5ai6si7d +i2qi3wi4ei5ri6ti7y +i2ri3oi4bi5ei6ri7t +i2si3hi4ai5di6oi7w +i21i32i43i54i65i76i87 +i21i32i43i54i65i76i8a +i27i37i47i57i67i77i87 +i2fi3ri4ei5ei6di7oi8m +i2fi3ui4ci5ki6yi7oi8u +i2ji3ei4si5si6ii7ci8a +i2li3ei4ti5mi6ei7ii8n +i2mi3ii4ci5hi6ai7ei8l +i2pi3oi4ki5ei6mi7oi8n +i2si3ai4mi5si6ui7ni8g +i2wi3ei4li5ci6oi7mi8e +i2zi3xi4ci5vi6bi7ni8m +i21i31i41i51i61i71i81i91 +i21i32i43i54i61i72i83i94 +i21i32i43i54i65i76i87i98 +i21i32i43i54i6qi7wi8ei9r +i21i3qi42i5wi63i7ei84i9r +i21i3qi4ai5zi62i7wi8si9x +i28i38i48i58i68i78i88i98 +i2ai3bi4ci5di61i72i83i94 +i2ai3si4di5fi61i72i83i94 +i2ai3si4di5fi6ai7si8di9f +i2ci3oi4ci5ai6ci7oi8li9a +i2ci3oi4mi5pi6ui7ti8ei9r +i2fi3oi4oi5ti6bi7ai8li9l +i2ii3li4oi5vi6ei7yi8oi9u +i2ii3ni4ti5ei6ri7ni8ei9t +i2pi3ai4si5si6wi7oi8ri9d +i2qi31i4wi52i6ei73i8ri94 +i2qi3wi4ei5ri61i72i83i94 +i2si3ti4ai5ri6wi7ai8ri9s +i2si3ui4ni5si6hi7ii8ni9e +i2si3ui4pi5ei6ri7mi8ai9n +i2ti3ri4ui5si6ti7ni8oi91 +i21i32i43i51i62i73i81i92iA3 +i21i32i43i54i65i76i87i98iA9 +i29i38i47i56i65i74i83i92iA1 +i2ai3li4ei5xi6ai7ni8di9eiAr +i2ai3si4di5fi6gi7hi8ji9kiAl +i2mi3ei4ti5ai6li7li8ii9ciAa +i2pi3ai4si5si6wi7oi8ri9diA1 +i2qi3wi4ei5ri6ti7yi81i92iA3 +i21i32i43i54i65i76i87i98iA9iB0 +i2qi3wi4ei5ri6ti7yi8ui9iiAoiBp +i31i42i53 +i31i42i53i64 +i31i42i53i64i75 +i30i40i50i60i70i80 +i31i40i51i60i71i80 +i31i40i52i60i73i80 +i31i41i51i61i71i81 +i31i41i52i62i73i83 +i31i42i51i62i71i82 +i31i42i53i61i72i83 +i31i42i53i63i72i81 +i31i42i53i64i75i86 +i31i42i53i66i75i84 +i31i42i53i6ai7bi8c +i31i42i53i6qi7wi8e +i31i43i51i63i71i83 +i31i44i57i62i75i88 +i31i45i59i63i75i87 +i31i45i59i67i75i83 +i31i4qi52i6wi73i8e +i32i42i52i62i72i82 +i32i43i52i63i72i83 +i33i43i53i63i73i83 +i35i45i55i65i75i85 +i36i45i54i63i72i81 +i36i46i56i66i76i86 +i37i47i57i67i77i87 +i37i48i59i64i75i86 +i38i48i58i68i78i88 +i39i48i57i66i75i84 +i39i49i59i69i79i89 +i3ai4ai5ai6ai7ai8a +i3ai4bi5ci61i72i83 +i3ai4si5di61i72i83 +i3ai4si5di6ai7si8d +i3ai4si5di6fi7gi8h +i3bi4ai5ti6mi7ai8n +i3ci4oi5mi6pi7ai8q +i3di4ai5ni6ii7ei8l +i3di4ri5ai6gi7oi8n +i3ei4mi5ii6ni7ei8m +i3gi4oi5oi6gi7li8e +i3hi4ai5hi6ai7hi8a +i3ji4oi5ri6di7ai8n +i3ki4ii5li6li7ei8r +i3mi4ai5ri6ti7ii8n +i3mi4ai5si6ti7ei8r +i3mi4ai5ti6ri7ii8x +i3mi4oi5ni6ki7ei8y +i3qi41i5wi62i7ei83 +i3qi4ai5zi6wi7si8x +i3qi4wi5ei61i72i83 +i3qi4wi5ei6ai7si8d +i3qi4wi5ei6ri7ti8y +i3ri4oi5bi6ei7ri8t +i3si4hi5ai6di7oi8w +i31i42i53i64i75i86i97 +i31i42i53i64i75i86i9a +i37i47i57i67i77i87i97 +i3fi4ri5ei6ei7di8oi9m +i3fi4ui5ci6ki7yi8oi9u +i3ji4ei5si6si7ii8ci9a +i3li4ei5ti6mi7ei8ii9n +i3mi4ii5ci6hi7ai8ei9l +i3pi4oi5ki6ei7mi8oi9n +i3si4ai5mi6si7ui8ni9g +i3wi4ei5li6ci7oi8mi9e +i3zi4xi5ci6vi7bi8ni9m +i31i41i51i61i71i81i91iA1 +i31i42i53i64i71i82i93iA4 +i31i42i53i64i75i86i97iA8 +i31i42i53i64i7qi8wi9eiAr +i31i4qi52i6wi73i8ei94iAr +i31i4qi5ai6zi72i8wi9siAx +i38i48i58i68i78i88i98iA8 +i3ai4bi5ci6di71i82i93iA4 +i3ai4si5di6fi71i82i93iA4 +i3ai4si5di6fi7ai8si9diAf +i3ci4oi5ci6ai7ci8oi9liAa +i3ci4oi5mi6pi7ui8ti9eiAr +i3fi4oi5oi6ti7bi8ai9liAl +i3ii4li5oi6vi7ei8yi9oiAu +i3ii4ni5ti6ei7ri8ni9eiAt +i3pi4ai5si6si7wi8oi9riAd +i3qi41i5wi62i7ei83i9riA4 +i3qi4wi5ei6ri71i82i93iA4 +i3si4ti5ai6ri7wi8ai9riAs +i3si4ui5ni6si7hi8ii9niAe +i3si4ui5pi6ei7ri8mi9aiAn +i3ti4ri5ui6si7ti8ni9oiA1 +i31i42i53i61i72i83i91iA2iB3 +i31i42i53i64i75i86i97iA8iB9 +i39i48i57i66i75i84i93iA2iB1 +i3ai4li5ei6xi7ai8ni9diAeiBr +i3ai4si5di6fi7gi8hi9jiAkiBl +i3mi4ei5ti6ai7li8li9iiAciBa +i3pi4ai5si6si7wi8oi9riAdiB1 +i3qi4wi5ei6ri7ti8yi91iA2iB3 +i31i42i53i64i75i86i97iA8iB9iC0 +i3qi4wi5ei6ri7ti8yi9uiAiiBoiCp +i41i52i63 +i41i52i63i74 +i41i52i63i74i85 +i40i50i60i70i80i90 +i41i50i61i70i81i90 +i41i50i62i70i83i90 +i41i51i61i71i81i91 +i41i51i62i72i83i93 +i41i52i61i72i81i92 +i41i52i63i71i82i93 +i41i52i63i73i82i91 +i41i52i63i74i85i96 +i41i52i63i76i85i94 +i41i52i63i7ai8bi9c +i41i52i63i7qi8wi9e +i41i53i61i73i81i93 +i41i54i67i72i85i98 +i41i55i69i73i85i97 +i41i55i69i77i85i93 +i41i5qi62i7wi83i9e +i42i52i62i72i82i92 +i42i53i62i73i82i93 +i43i53i63i73i83i93 +i45i55i65i75i85i95 +i46i55i64i73i82i91 +i46i56i66i76i86i96 +i47i57i67i77i87i97 +i47i58i69i74i85i96 +i48i58i68i78i88i98 +i49i58i67i76i85i94 +i49i59i69i79i89i99 +i4ai5ai6ai7ai8ai9a +i4ai5bi6ci71i82i93 +i4ai5si6di71i82i93 +i4ai5si6di7ai8si9d +i4ai5si6di7fi8gi9h +i4bi5ai6ti7mi8ai9n +i4ci5oi6mi7pi8ai9q +i4di5ai6ni7ii8ei9l +i4di5ri6ai7gi8oi9n +i4ei5mi6ii7ni8ei9m +i4gi5oi6oi7gi8li9e +i4hi5ai6hi7ai8hi9a +i4ji5oi6ri7di8ai9n +i4ki5ii6li7li8ei9r +i4mi5ai6ri7ti8ii9n +i4mi5ai6si7ti8ei9r +i4mi5ai6ti7ri8ii9x +i4mi5oi6ni7ki8ei9y +i4qi51i6wi72i8ei93 +i4qi5ai6zi7wi8si9x +i4qi5wi6ei71i82i93 +i4qi5wi6ei7ai8si9d +i4qi5wi6ei7ri8ti9y +i4ri5oi6bi7ei8ri9t +i4si5hi6ai7di8oi9w +i41i52i63i74i85i96iA7 +i41i52i63i74i85i96iAa +i47i57i67i77i87i97iA7 +i4fi5ri6ei7ei8di9oiAm +i4fi5ui6ci7ki8yi9oiAu +i4ji5ei6si7si8ii9ciAa +i4li5ei6ti7mi8ei9iiAn +i4mi5ii6ci7hi8ai9eiAl +i4pi5oi6ki7ei8mi9oiAn +i4si5ai6mi7si8ui9niAg +i4wi5ei6li7ci8oi9miAe +i4zi5xi6ci7vi8bi9niAm +i41i51i61i71i81i91iA1iB1 +i41i52i63i74i81i92iA3iB4 +i41i52i63i74i85i96iA7iB8 +i41i52i63i74i8qi9wiAeiBr +i41i5qi62i7wi83i9eiA4iBr +i41i5qi6ai7zi82i9wiAsiBx +i48i58i68i78i88i98iA8iB8 +i4ai5bi6ci7di81i92iA3iB4 +i4ai5si6di7fi81i92iA3iB4 +i4ai5si6di7fi8ai9siAdiBf +i4ci5oi6ci7ai8ci9oiAliBa +i4ci5oi6mi7pi8ui9tiAeiBr +i4fi5oi6oi7ti8bi9aiAliBl +i4ii5li6oi7vi8ei9yiAoiBu +i4ii5ni6ti7ei8ri9niAeiBt +i4pi5ai6si7si8wi9oiAriBd +i4qi51i6wi72i8ei93iAriB4 +i4qi5wi6ei7ri81i92iA3iB4 +i4si5ti6ai7ri8wi9aiAriBs +i4si5ui6ni7si8hi9iiAniBe +i4si5ui6pi7ei8ri9miAaiBn +i4ti5ri6ui7si8ti9niAoiB1 +i41i52i63i71i82i93iA1iB2iC3 +i41i52i63i74i85i96iA7iB8iC9 +i49i58i67i76i85i94iA3iB2iC1 +i4ai5li6ei7xi8ai9niAdiBeiCr +i4ai5si6di7fi8gi9hiAjiBkiCl +i4mi5ei6ti7ai8li9liAiiBciCa +i4pi5ai6si7si8wi9oiAriBdiC1 +i4qi5wi6ei7ri8ti9yiA1iB2iC3 +i41i52i63i74i85i96iA7iB8iC9iD0 +i4qi5wi6ei7ri8ti9yiAuiBiiCoiDp +i51i62i73 +i51i62i73i84 +i51i62i73i84i95 +i50i60i70i80i90iA0 +i51i60i71i80i91iA0 +i51i60i72i80i93iA0 +i51i61i71i81i91iA1 +i51i61i72i82i93iA3 +i51i62i71i82i91iA2 +i51i62i73i81i92iA3 +i51i62i73i83i92iA1 +i51i62i73i84i95iA6 +i51i62i73i86i95iA4 +i51i62i73i8ai9biAc +i51i62i73i8qi9wiAe +i51i63i71i83i91iA3 +i51i64i77i82i95iA8 +i51i65i79i83i95iA7 +i51i65i79i87i95iA3 +i51i6qi72i8wi93iAe +i52i62i72i82i92iA2 +i52i63i72i83i92iA3 +i53i63i73i83i93iA3 +i55i65i75i85i95iA5 +i56i65i74i83i92iA1 +i56i66i76i86i96iA6 +i57i67i77i87i97iA7 +i57i68i79i84i95iA6 +i58i68i78i88i98iA8 +i59i68i77i86i95iA4 +i59i69i79i89i99iA9 +i5ai6ai7ai8ai9aiAa +i5ai6bi7ci81i92iA3 +i5ai6si7di81i92iA3 +i5ai6si7di8ai9siAd +i5ai6si7di8fi9giAh +i5bi6ai7ti8mi9aiAn +i5ci6oi7mi8pi9aiAq +i5di6ai7ni8ii9eiAl +i5di6ri7ai8gi9oiAn +i5ei6mi7ii8ni9eiAm +i5gi6oi7oi8gi9liAe +i5hi6ai7hi8ai9hiAa +i5ji6oi7ri8di9aiAn +i5ki6ii7li8li9eiAr +i5mi6ai7ri8ti9iiAn +i5mi6ai7si8ti9eiAr +i5mi6ai7ti8ri9iiAx +i5mi6oi7ni8ki9eiAy +i5qi61i7wi82i9eiA3 +i5qi6ai7zi8wi9siAx +i5qi6wi7ei81i92iA3 +i5qi6wi7ei8ai9siAd +i5qi6wi7ei8ri9tiAy +i5ri6oi7bi8ei9riAt +i5si6hi7ai8di9oiAw +i51i62i73i84i95iA6iB7 +i51i62i73i84i95iA6iBa +i57i67i77i87i97iA7iB7 +i5fi6ri7ei8ei9diAoiBm +i5fi6ui7ci8ki9yiAoiBu +i5ji6ei7si8si9iiAciBa +i5li6ei7ti8mi9eiAiiBn +i5mi6ii7ci8hi9aiAeiBl +i5pi6oi7ki8ei9miAoiBn +i5si6ai7mi8si9uiAniBg +i5wi6ei7li8ci9oiAmiBe +i5zi6xi7ci8vi9biAniBm +i51i61i71i81i91iA1iB1iC1 +i51i62i73i84i91iA2iB3iC4 +i51i62i73i84i95iA6iB7iC8 +i51i62i73i84i9qiAwiBeiCr +i51i6qi72i8wi93iAeiB4iCr +i51i6qi7ai8zi92iAwiBsiCx +i58i68i78i88i98iA8iB8iC8 +i5ai6bi7ci8di91iA2iB3iC4 +i5ai6si7di8fi91iA2iB3iC4 +i5ai6si7di8fi9aiAsiBdiCf +i5ci6oi7ci8ai9ciAoiBliCa +i5ci6oi7mi8pi9uiAtiBeiCr +i5fi6oi7oi8ti9biAaiBliCl +i5ii6li7oi8vi9eiAyiBoiCu +i5ii6ni7ti8ei9riAniBeiCt +i5pi6ai7si8si9wiAoiBriCd +i5qi61i7wi82i9eiA3iBriC4 +i5qi6wi7ei8ri91iA2iB3iC4 +i5si6ti7ai8ri9wiAaiBriCs +i5si6ui7ni8si9hiAiiBniCe +i5si6ui7pi8ei9riAmiBaiCn +i5ti6ri7ui8si9tiAniBoiC1 +i51i62i73i81i92iA3iB1iC2iD3 +i51i62i73i84i95iA6iB7iC8iD9 +i59i68i77i86i95iA4iB3iC2iD1 +i5ai6li7ei8xi9aiAniBdiCeiDr +i5ai6si7di8fi9giAhiBjiCkiDl +i5mi6ei7ti8ai9liAliBiiCciDa +i5pi6ai7si8si9wiAoiBriCdiD1 +i5qi6wi7ei8ri9tiAyiB1iC2iD3 +i51i62i73i84i95iA6iB7iC8iD9iE0 +i5qi6wi7ei8ri9tiAyiBuiCiiDoiEp +i61i72i83 +i61i72i83i94 +i61i72i83i94iA5 +i60i70i80i90iA0iB0 +i61i70i81i90iA1iB0 +i61i70i82i90iA3iB0 +i61i71i81i91iA1iB1 +i61i71i82i92iA3iB3 +i61i72i81i92iA1iB2 +i61i72i83i91iA2iB3 +i61i72i83i93iA2iB1 +i61i72i83i94iA5iB6 +i61i72i83i96iA5iB4 +i61i72i83i9aiAbiBc +i61i72i83i9qiAwiBe +i61i73i81i93iA1iB3 +i61i74i87i92iA5iB8 +i61i75i89i93iA5iB7 +i61i75i89i97iA5iB3 +i61i7qi82i9wiA3iBe +i62i72i82i92iA2iB2 +i62i73i82i93iA2iB3 +i63i73i83i93iA3iB3 +i65i75i85i95iA5iB5 +i66i75i84i93iA2iB1 +i66i76i86i96iA6iB6 +i67i77i87i97iA7iB7 +i67i78i89i94iA5iB6 +i68i78i88i98iA8iB8 +i69i78i87i96iA5iB4 +i69i79i89i99iA9iB9 +i6ai7ai8ai9aiAaiBa +i6ai7bi8ci91iA2iB3 +i6ai7si8di91iA2iB3 +i6ai7si8di9aiAsiBd +i6ai7si8di9fiAgiBh +i6bi7ai8ti9miAaiBn +i6ci7oi8mi9piAaiBq +i6di7ai8ni9iiAeiBl +i6di7ri8ai9giAoiBn +i6ei7mi8ii9niAeiBm +i6gi7oi8oi9giAliBe +i6hi7ai8hi9aiAhiBa +i6ji7oi8ri9diAaiBn +i6ki7ii8li9liAeiBr +i6mi7ai8ri9tiAiiBn +i6mi7ai8si9tiAeiBr +i6mi7ai8ti9riAiiBx +i6mi7oi8ni9kiAeiBy +i6qi71i8wi92iAeiB3 +i6qi7ai8zi9wiAsiBx +i6qi7wi8ei91iA2iB3 +i6qi7wi8ei9aiAsiBd +i6qi7wi8ei9riAtiBy +i6ri7oi8bi9eiAriBt +i6si7hi8ai9diAoiBw +i61i72i83i94iA5iB6iC7 +i61i72i83i94iA5iB6iCa +i67i77i87i97iA7iB7iC7 +i6fi7ri8ei9eiAdiBoiCm +i6fi7ui8ci9kiAyiBoiCu +i6ji7ei8si9siAiiBciCa +i6li7ei8ti9miAeiBiiCn +i6mi7ii8ci9hiAaiBeiCl +i6pi7oi8ki9eiAmiBoiCn +i6si7ai8mi9siAuiBniCg +i6wi7ei8li9ciAoiBmiCe +i6zi7xi8ci9viAbiBniCm +i61i71i81i91iA1iB1iC1iD1 +i61i72i83i94iA1iB2iC3iD4 +i61i72i83i94iA5iB6iC7iD8 +i61i72i83i94iAqiBwiCeiDr +i61i7qi82i9wiA3iBeiC4iDr +i61i7qi8ai9ziA2iBwiCsiDx +i68i78i88i98iA8iB8iC8iD8 +i6ai7bi8ci9diA1iB2iC3iD4 +i6ai7si8di9fiA1iB2iC3iD4 +i6ai7si8di9fiAaiBsiCdiDf +i6ci7oi8ci9aiAciBoiCliDa +i6ci7oi8mi9piAuiBtiCeiDr +i6fi7oi8oi9tiAbiBaiCliDl +i6ii7li8oi9viAeiByiCoiDu +i6ii7ni8ti9eiAriBniCeiDt +i6pi7ai8si9siAwiBoiCriDd +i6qi71i8wi92iAeiB3iCriD4 +i6qi7wi8ei9riA1iB2iC3iD4 +i6si7ti8ai9riAwiBaiCriDs +i6si7ui8ni9siAhiBiiCniDe +i6si7ui8pi9eiAriBmiCaiDn +i6ti7ri8ui9siAtiBniCoiD1 +i61i72i83i91iA2iB3iC1iD2iE3 +i61i72i83i94iA5iB6iC7iD8iE9 +i69i78i87i96iA5iB4iC3iD2iE1 +i6ai7li8ei9xiAaiBniCdiDeiEr +i6ai7si8di9fiAgiBhiCjiDkiEl +i6mi7ei8ti9aiAliBliCiiDciEa +i6pi7ai8si9siAwiBoiCriDdiE1 +i6qi7wi8ei9riAtiByiC1iD2iE3 +i61i72i83i94iA5iB6iC7iD8iE9iF0 +i6qi7wi8ei9riAtiByiCuiDiiEoiFp +i71i82i93 +i71i82i93iA4 +i71i82i93iA4iB5 +i70i80i90iA0iB0iC0 +i71i80i91iA0iB1iC0 +i71i80i92iA0iB3iC0 +i71i81i91iA1iB1iC1 +i71i81i92iA2iB3iC3 +i71i82i91iA2iB1iC2 +i71i82i93iA1iB2iC3 +i71i82i93iA3iB2iC1 +i71i82i93iA4iB5iC6 +i71i82i93iA6iB5iC4 +i71i82i93iAaiBbiCc +i71i82i93iAqiBwiCe +i71i83i91iA3iB1iC3 +i71i84i97iA2iB5iC8 +i71i85i99iA3iB5iC7 +i71i85i99iA7iB5iC3 +i71i8qi92iAwiB3iCe +i72i82i92iA2iB2iC2 +i72i83i92iA3iB2iC3 +i73i83i93iA3iB3iC3 +i75i85i95iA5iB5iC5 +i76i85i94iA3iB2iC1 +i76i86i96iA6iB6iC6 +i77i87i97iA7iB7iC7 +i77i88i99iA4iB5iC6 +i78i88i98iA8iB8iC8 +i79i88i97iA6iB5iC4 +i79i89i99iA9iB9iC9 +i7ai8ai9aiAaiBaiCa +i7ai8bi9ciA1iB2iC3 +i7ai8si9diA1iB2iC3 +i7ai8si9diAaiBsiCd +i7ai8si9diAfiBgiCh +i7bi8ai9tiAmiBaiCn +i7ci8oi9miApiBaiCq +i7di8ai9niAiiBeiCl +i7di8ri9aiAgiBoiCn +i7ei8mi9iiAniBeiCm +i7gi8oi9oiAgiBliCe +i7hi8ai9hiAaiBhiCa +i7ji8oi9riAdiBaiCn +i7ki8ii9liAliBeiCr +i7mi8ai9riAtiBiiCn +i7mi8ai9siAtiBeiCr +i7mi8ai9tiAriBiiCx +i7mi8oi9niAkiBeiCy +i7qi81i9wiA2iBeiC3 +i7qi8ai9ziAwiBsiCx +i7qi8wi9eiA1iB2iC3 +i7qi8wi9eiAaiBsiCd +i7qi8wi9eiAriBtiCy +i7ri8oi9biAeiBriCt +i7si8hi9aiAdiBoiCw +i71i82i93iA4iB5iC6iD7 +i71i82i93iA4iB5iC6iDa +i77i87i97iA7iB7iC7iD7 +i7fi8ri9eiAeiBdiCoiDm +i7fi8ui9ciAkiByiCoiDu +i7ji8ei9siAsiBiiCciDa +i7li8ei9tiAmiBeiCiiDn +i7mi8ii9ciAhiBaiCeiDl +i7pi8oi9kiAeiBmiCoiDn +i7si8ai9miAsiBuiCniDg +i7wi8ei9liAciBoiCmiDe +i7zi8xi9ciAviBbiCniDm +i71i81i91iA1iB1iC1iD1iE1 +i71i82i93iA4iB1iC2iD3iE4 +i71i82i93iA4iB5iC6iD7iE8 +i71i82i93iA4iBqiCwiDeiEr +i71i8qi92iAwiB3iCeiD4iEr +i71i8qi9aiAziB2iCwiDsiEx +i78i88i98iA8iB8iC8iD8iE8 +i7ai8bi9ciAdiB1iC2iD3iE4 +i7ai8si9diAfiB1iC2iD3iE4 +i7ai8si9diAfiBaiCsiDdiEf +i7ci8oi9ciAaiBciCoiDliEa +i7ci8oi9miApiBuiCtiDeiEr +i7fi8oi9oiAtiBbiCaiDliEl +i7ii8li9oiAviBeiCyiDoiEu +i7ii8ni9tiAeiBriCniDeiEt +i7pi8ai9siAsiBwiCoiDriEd +i7qi81i9wiA2iBeiC3iDriE4 +i7qi8wi9eiAriB1iC2iD3iE4 +i7si8ti9aiAriBwiCaiDriEs +i7si8ui9niAsiBhiCiiDniEe +i7si8ui9piAeiBriCmiDaiEn +i7ti8ri9uiAsiBtiCniDoiE1 +i71i82i93iA1iB2iC3iD1iE2iF3 +i71i82i93iA4iB5iC6iD7iE8iF9 +i79i88i97iA6iB5iC4iD3iE2iF1 +i7ai8li9eiAxiBaiCniDdiEeiFr +i7ai8si9diAfiBgiChiDjiEkiFl +i7mi8ei9tiAaiBliCliDiiEciFa +i7pi8ai9siAsiBwiCoiDriEdiF1 +i7qi8wi9eiAriBtiCyiD1iE2iF3 +i71i82i93iA4iB5iC6iD7iE8iF9iG0 +i7qi8wi9eiAriBtiCyiDuiEiiFoiGp +i81i92iA3 +i81i92iA3iB4 +i81i92iA3iB4iC5 +i80i90iA0iB0iC0iD0 +i81i90iA1iB0iC1iD0 +i81i90iA2iB0iC3iD0 +i81i91iA1iB1iC1iD1 +i81i91iA2iB2iC3iD3 +i81i92iA1iB2iC1iD2 +i81i92iA3iB1iC2iD3 +i81i92iA3iB3iC2iD1 +i81i92iA3iB4iC5iD6 +i81i92iA3iB6iC5iD4 +i81i92iA3iBaiCbiDc +i81i92iA3iBqiCwiDe +i81i93iA1iB3iC1iD3 +i81i94iA7iB2iC5iD8 +i81i95iA9iB3iC5iD7 +i81i95iA9iB7iC5iD3 +i81i9qiA2iBwiC3iDe +i82i92iA2iB2iC2iD2 +i82i93iA2iB3iC2iD3 +i83i93iA3iB3iC3iD3 +i85i95iA5iB5iC5iD5 +i86i95iA4iB3iC2iD1 +i86i96iA6iB6iC6iD6 +i87i97iA7iB7iC7iD7 +i87i98iA9iB4iC5iD6 +i88i98iA8iB8iC8iD8 +i89i98iA7iB6iC5iD4 +i89i99iA9iB9iC9iD9 +i8ai9aiAaiBaiCaiDa +i8ai9biAciB1iC2iD3 +i8ai9siAdiB1iC2iD3 +i8ai9siAdiBaiCsiDd +i8ai9siAdiBfiCgiDh +i8bi9aiAtiBmiCaiDn +i8ci9oiAmiBpiCaiDq +i8di9aiAniBiiCeiDl +i8di9riAaiBgiCoiDn +i8ei9miAiiBniCeiDm +i8gi9oiAoiBgiCliDe +i8hi9aiAhiBaiChiDa +i8ji9oiAriBdiCaiDn +i8ki9iiAliBliCeiDr +i8mi9aiAriBtiCiiDn +i8mi9aiAsiBtiCeiDr +i8mi9aiAtiBriCiiDx +i8mi9oiAniBkiCeiDy +i8qi91iAwiB2iCeiD3 +i8qi9aiAziBwiCsiDx +i8qi9wiAeiB1iC2iD3 +i8qi9wiAeiBaiCsiDd +i8qi9wiAeiBriCtiDy +i8ri9oiAbiBeiCriDt +i8si9hiAaiBdiCoiDw +i81i92iA3iB4iC5iD6iE7 +i81i92iA3iB4iC5iD6iEa +i87i97iA7iB7iC7iD7iE7 +i8fi9riAeiBeiCdiDoiEm +i8fi9uiAciBkiCyiDoiEu +i8ji9eiAsiBsiCiiDciEa +i8li9eiAtiBmiCeiDiiEn +i8mi9iiAciBhiCaiDeiEl +i8pi9oiAkiBeiCmiDoiEn +i8si9aiAmiBsiCuiDniEg +i8wi9eiAliBciCoiDmiEe +i8zi9xiAciBviCbiDniEm +i81i91iA1iB1iC1iD1iE1iF1 +i81i92iA3iB4iC1iD2iE3iF4 +i81i92iA3iB4iC5iD6iE7iF8 +i81i92iA3iB4iCqiDwiEeiFr +i81i9qiA2iBwiC3iDeiE4iFr +i81i9qiAaiBziC2iDwiEsiFx +i88i98iA8iB8iC8iD8iE8iF8 +i8ai9biAciBdiC1iD2iE3iF4 +i8ai9siAdiBfiC1iD2iE3iF4 +i8ai9siAdiBfiCaiDsiEdiFf +i8ci9oiAciBaiCciDoiEliFa +i8ci9oiAmiBpiCuiDtiEeiFr +i8fi9oiAoiBtiCbiDaiEliFl +i8ii9liAoiBviCeiDyiEoiFu +i8ii9niAtiBeiCriDniEeiFt +i8pi9aiAsiBsiCwiDoiEriFd +i8qi91iAwiB2iCeiD3iEriF4 +i8qi9wiAeiBriC1iD2iE3iF4 +i8si9tiAaiBriCwiDaiEriFs +i8si9uiAniBsiChiDiiEniFe +i8si9uiApiBeiCriDmiEaiFn +i8ti9riAuiBsiCtiDniEoiF1 +i81i92iA3iB1iC2iD3iE1iF2iG3 +i81i92iA3iB4iC5iD6iE7iF8iG9 +i89i98iA7iB6iC5iD4iE3iF2iG1 +i8ai9liAeiBxiCaiDniEdiFeiGr +i8ai9siAdiBfiCgiDhiEjiFkiGl +i8mi9eiAtiBaiCliDliEiiFciGa +i8pi9aiAsiBsiCwiDoiEriFdiG1 +i8qi9wiAeiBriCtiDyiE1iF2iG3 +i81i92iA3iB4iC5iD6iE7iF8iG9iH0 +i8qi9wiAeiBriCtiDyiEuiFiiGoiHp +i91iA2iB3 +i91iA2iB3iC4 +i91iA2iB3iC4iD5 +i90iA0iB0iC0iD0iE0 +i91iA0iB1iC0iD1iE0 +i91iA0iB2iC0iD3iE0 +i91iA1iB1iC1iD1iE1 +i91iA1iB2iC2iD3iE3 +i91iA2iB1iC2iD1iE2 +i91iA2iB3iC1iD2iE3 +i91iA2iB3iC3iD2iE1 +i91iA2iB3iC4iD5iE6 +i91iA2iB3iC6iD5iE4 +i91iA2iB3iCaiDbiEc +i91iA2iB3iCqiDwiEe +i91iA3iB1iC3iD1iE3 +i91iA4iB7iC2iD5iE8 +i91iA5iB9iC3iD5iE7 +i91iA5iB9iC7iD5iE3 +i91iAqiB2iCwiD3iEe +i92iA2iB2iC2iD2iE2 +i92iA3iB2iC3iD2iE3 +i93iA3iB3iC3iD3iE3 +i95iA5iB5iC5iD5iE5 +i96iA5iB4iC3iD2iE1 +i96iA6iB6iC6iD6iE6 +i97iA7iB7iC7iD7iE7 +i97iA8iB9iC4iD5iE6 +i98iA8iB8iC8iD8iE8 +i99iA8iB7iC6iD5iE4 +i99iA9iB9iC9iD9iE9 +i9aiAaiBaiCaiDaiEa +i9aiAbiBciC1iD2iE3 +i9aiAsiBdiC1iD2iE3 +i9aiAsiBdiCaiDsiEd +i9aiAsiBdiCfiDgiEh +i9biAaiBtiCmiDaiEn +i9ciAoiBmiCpiDaiEq +i9diAaiBniCiiDeiEl +i9diAriBaiCgiDoiEn +i9eiAmiBiiCniDeiEm +i9giAoiBoiCgiDliEe +i9hiAaiBhiCaiDhiEa +i9jiAoiBriCdiDaiEn +i9kiAiiBliCliDeiEr +i9miAaiBriCtiDiiEn +i9miAaiBsiCtiDeiEr +i9miAaiBtiCriDiiEx +i9miAoiBniCkiDeiEy +i9qiA1iBwiC2iDeiE3 +i9qiAaiBziCwiDsiEx +i9qiAwiBeiC1iD2iE3 +i9qiAwiBeiCaiDsiEd +i9qiAwiBeiCriDtiEy +i9riAoiBbiCeiDriEt +i9siAhiBaiCdiDoiEw +i91iA2iB3iC4iD5iE6iF7 +i91iA2iB3iC4iD5iE6iFa +i97iA7iB7iC7iD7iE7iF7 +i9fiAriBeiCeiDdiEoiFm +i9fiAuiBciCkiDyiEoiFu +i9jiAeiBsiCsiDiiEciFa +i9liAeiBtiCmiDeiEiiFn +i9miAiiBciChiDaiEeiFl +i9piAoiBkiCeiDmiEoiFn +i9siAaiBmiCsiDuiEniFg +i9wiAeiBliCciDoiEmiFe +i9ziAxiBciCviDbiEniFm +i91iA1iB1iC1iD1iE1iF1iG1 +i91iA2iB3iC4iD1iE2iF3iG4 +i91iA2iB3iC4iD5iE6iF7iG8 +i91iA2iB3iC4iDqiEwiFeiGr +i91iAqiB2iCwiD3iEeiF4iGr +i91iAqiBaiCziD2iEwiFsiGx +i98iA8iB8iC8iD8iE8iF8iG8 +i9aiAbiBciCdiD1iE2iF3iG4 +i9aiAsiBdiCfiD1iE2iF3iG4 +i9aiAsiBdiCfiDaiEsiFdiGf +i9ciAoiBciCaiDciEoiFliGa +i9ciAoiBmiCpiDuiEtiFeiGr +i9fiAoiBoiCtiDbiEaiFliGl +i9iiAliBoiCviDeiEyiFoiGu +i9iiAniBtiCeiDriEniFeiGt +i9piAaiBsiCsiDwiEoiFriGd +i9qiA1iBwiC2iDeiE3iFriG4 +i9qiAwiBeiCriD1iE2iF3iG4 +i9siAtiBaiCriDwiEaiFriGs +i9siAuiBniCsiDhiEiiFniGe +i9siAuiBpiCeiDriEmiFaiGn +i9tiAriBuiCsiDtiEniFoiG1 +i91iA2iB3iC1iD2iE3iF1iG2iH3 +i91iA2iB3iC4iD5iE6iF7iG8iH9 +i99iA8iB7iC6iD5iE4iF3iG2iH1 +i9aiAliBeiCxiDaiEniFdiGeiHr +i9aiAsiBdiCfiDgiEhiFjiGkiHl +i9miAeiBtiCaiDliEliFiiGciHa +i9piAaiBsiCsiDwiEoiFriGdiH1 +i9qiAwiBeiCriDtiEyiF1iG2iH3 +i91iA2iB3iC4iD5iE6iF7iG8iH9iI0 +i9qiAwiBeiCriDtiEyiFuiGiiHoiIp +iA1iB2iC3 +iA1iB2iC3iD4 +iA1iB2iC3iD4iE5 +iA0iB0iC0iD0iE0iF0 +iA1iB0iC1iD0iE1iF0 +iA1iB0iC2iD0iE3iF0 +iA1iB1iC1iD1iE1iF1 +iA1iB1iC2iD2iE3iF3 +iA1iB2iC1iD2iE1iF2 +iA1iB2iC3iD1iE2iF3 +iA1iB2iC3iD3iE2iF1 +iA1iB2iC3iD4iE5iF6 +iA1iB2iC3iD6iE5iF4 +iA1iB2iC3iDaiEbiFc +iA1iB2iC3iDqiEwiFe +iA1iB3iC1iD3iE1iF3 +iA1iB4iC7iD2iE5iF8 +iA1iB5iC9iD3iE5iF7 +iA1iB5iC9iD7iE5iF3 +iA1iBqiC2iDwiE3iFe +iA2iB2iC2iD2iE2iF2 +iA2iB3iC2iD3iE2iF3 +iA3iB3iC3iD3iE3iF3 +iA5iB5iC5iD5iE5iF5 +iA6iB5iC4iD3iE2iF1 +iA6iB6iC6iD6iE6iF6 +iA7iB7iC7iD7iE7iF7 +iA7iB8iC9iD4iE5iF6 +iA8iB8iC8iD8iE8iF8 +iA9iB8iC7iD6iE5iF4 +iA9iB9iC9iD9iE9iF9 +iAaiBaiCaiDaiEaiFa +iAaiBbiCciD1iE2iF3 +iAaiBsiCdiD1iE2iF3 +iAaiBsiCdiDaiEsiFd +iAaiBsiCdiDfiEgiFh +iAbiBaiCtiDmiEaiFn +iAciBoiCmiDpiEaiFq +iAdiBaiCniDiiEeiFl +iAdiBriCaiDgiEoiFn +iAeiBmiCiiDniEeiFm +iAgiBoiCoiDgiEliFe +iAhiBaiChiDaiEhiFa +iAjiBoiCriDdiEaiFn +iAkiBiiCliDliEeiFr +iAmiBaiCriDtiEiiFn +iAmiBaiCsiDtiEeiFr +iAmiBaiCtiDriEiiFx +iAmiBoiCniDkiEeiFy +iAqiB1iCwiD2iEeiF3 +iAqiBaiCziDwiEsiFx +iAqiBwiCeiD1iE2iF3 +iAqiBwiCeiDaiEsiFd +iAqiBwiCeiDriEtiFy +iAriBoiCbiDeiEriFt +iAsiBhiCaiDdiEoiFw +iA1iB2iC3iD4iE5iF6iG7 +iA1iB2iC3iD4iE5iF6iGa +iA7iB7iC7iD7iE7iF7iG7 +iAfiBriCeiDeiEdiFoiGm +iAfiBuiCciDkiEyiFoiGu +iAjiBeiCsiDsiEiiFciGa +iAliBeiCtiDmiEeiFiiGn +iAmiBiiCciDhiEaiFeiGl +iApiBoiCkiDeiEmiFoiGn +iAsiBaiCmiDsiEuiFniGg +iAwiBeiCliDciEoiFmiGe +iAziBxiCciDviEbiFniGm +iA1iB1iC1iD1iE1iF1iG1iH1 +iA1iB2iC3iD4iE1iF2iG3iH4 +iA1iB2iC3iD4iE5iF6iG7iH8 +iA1iB2iC3iD4iEqiFwiGeiHr +iA1iBqiC2iDwiE3iFeiG4iHr +iA1iBqiCaiDziE2iFwiGsiHx +iA8iB8iC8iD8iE8iF8iG8iH8 +iAaiBbiCciDdiE1iF2iG3iH4 +iAaiBsiCdiDfiE1iF2iG3iH4 +iAaiBsiCdiDfiEaiFsiGdiHf +iAciBoiCciDaiEciFoiGliHa +iAciBoiCmiDpiEuiFtiGeiHr +iAfiBoiCoiDtiEbiFaiGliHl +iAiiBliCoiDviEeiFyiGoiHu +iAiiBniCtiDeiEriFniGeiHt +iApiBaiCsiDsiEwiFoiGriHd +iAqiB1iCwiD2iEeiF3iGriH4 +iAqiBwiCeiDriE1iF2iG3iH4 +iAsiBtiCaiDriEwiFaiGriHs +iAsiBuiCniDsiEhiFiiGniHe +iAsiBuiCpiDeiEriFmiGaiHn +iAtiBriCuiDsiEtiFniGoiH1 +iA1iB2iC3iD1iE2iF3iG1iH2iI3 +iA1iB2iC3iD4iE5iF6iG7iH8iI9 +iA9iB8iC7iD6iE5iF4iG3iH2iI1 +iAaiBliCeiDxiEaiFniGdiHeiIr +iAaiBsiCdiDfiEgiFhiGjiHkiIl +iAmiBeiCtiDaiEliFliGiiHciIa +iApiBaiCsiDsiEwiFoiGriHdiI1 +iAqiBwiCeiDriEtiFyiG1iH2iI3 +iA1iB2iC3iD4iE5iF6iG7iH8iI9iJ0 +iAqiBwiCeiDriEtiFyiGuiHiiIoiJp +iB1iC2iD3 +iB1iC2iD3iE4 +iB1iC2iD3iE4iF5 +iB0iC0iD0iE0iF0iG0 +iB1iC0iD1iE0iF1iG0 +iB1iC0iD2iE0iF3iG0 +iB1iC1iD1iE1iF1iG1 +iB1iC1iD2iE2iF3iG3 +iB1iC2iD1iE2iF1iG2 +iB1iC2iD3iE1iF2iG3 +iB1iC2iD3iE3iF2iG1 +iB1iC2iD3iE4iF5iG6 +iB1iC2iD3iE6iF5iG4 +iB1iC2iD3iEaiFbiGc +iB1iC2iD3iEqiFwiGe +iB1iC3iD1iE3iF1iG3 +iB1iC4iD7iE2iF5iG8 +iB1iC5iD9iE3iF5iG7 +iB1iC5iD9iE7iF5iG3 +iB1iCqiD2iEwiF3iGe +iB2iC2iD2iE2iF2iG2 +iB2iC3iD2iE3iF2iG3 +iB3iC3iD3iE3iF3iG3 +iB5iC5iD5iE5iF5iG5 +iB6iC5iD4iE3iF2iG1 +iB6iC6iD6iE6iF6iG6 +iB7iC7iD7iE7iF7iG7 +iB7iC8iD9iE4iF5iG6 +iB8iC8iD8iE8iF8iG8 +iB9iC8iD7iE6iF5iG4 +iB9iC9iD9iE9iF9iG9 +iBaiCaiDaiEaiFaiGa +iBaiCbiDciE1iF2iG3 +iBaiCsiDdiE1iF2iG3 +iBaiCsiDdiEaiFsiGd +iBaiCsiDdiEfiFgiGh +iBbiCaiDtiEmiFaiGn +iBciCoiDmiEpiFaiGq +iBdiCaiDniEiiFeiGl +iBdiCriDaiEgiFoiGn +iBeiCmiDiiEniFeiGm +iBgiCoiDoiEgiFliGe +iBhiCaiDhiEaiFhiGa +iBjiCoiDriEdiFaiGn +iBkiCiiDliEliFeiGr +iBmiCaiDriEtiFiiGn +iBmiCaiDsiEtiFeiGr +iBmiCaiDtiEriFiiGx +iBmiCoiDniEkiFeiGy +iBqiC1iDwiE2iFeiG3 +iBqiCaiDziEwiFsiGx +iBqiCwiDeiE1iF2iG3 +iBqiCwiDeiEaiFsiGd +iBqiCwiDeiEriFtiGy +iBriCoiDbiEeiFriGt +iBsiChiDaiEdiFoiGw +iB1iC2iD3iE4iF5iG6iH7 +iB1iC2iD3iE4iF5iG6iHa +iB7iC7iD7iE7iF7iG7iH7 +iBfiCriDeiEeiFdiGoiHm +iBfiCuiDciEkiFyiGoiHu +iBjiCeiDsiEsiFiiGciHa +iBliCeiDtiEmiFeiGiiHn +iBmiCiiDciEhiFaiGeiHl +iBpiCoiDkiEeiFmiGoiHn +iBsiCaiDmiEsiFuiGniHg +iBwiCeiDliEciFoiGmiHe +iBziCxiDciEviFbiGniHm +iB1iC1iD1iE1iF1iG1iH1iI1 +iB1iC2iD3iE4iF1iG2iH3iI4 +iB1iC2iD3iE4iF5iG6iH7iI8 +iB1iC2iD3iE4iFqiGwiHeiIr +iB1iCqiD2iEwiF3iGeiH4iIr +iB1iCqiDaiEziF2iGwiHsiIx +iB8iC8iD8iE8iF8iG8iH8iI8 +iBaiCbiDciEdiF1iG2iH3iI4 +iBaiCsiDdiEfiF1iG2iH3iI4 +iBaiCsiDdiEfiFaiGsiHdiIf +iBciCoiDciEaiFciGoiHliIa +iBciCoiDmiEpiFuiGtiHeiIr +iBfiCoiDoiEtiFbiGaiHliIl +iBiiCliDoiEviFeiGyiHoiIu +iBiiCniDtiEeiFriGniHeiIt +iBpiCaiDsiEsiFwiGoiHriId +iBqiC1iDwiE2iFeiG3iHriI4 +iBqiCwiDeiEriF1iG2iH3iI4 +iBsiCtiDaiEriFwiGaiHriIs +iBsiCuiDniEsiFhiGiiHniIe +iBsiCuiDpiEeiFriGmiHaiIn +iBtiCriDuiEsiFtiGniHoiI1 +iB1iC2iD3iE1iF2iG3iH1iI2iJ3 +iB1iC2iD3iE4iF5iG6iH7iI8iJ9 +iB9iC8iD7iE6iF5iG4iH3iI2iJ1 +iBaiCliDeiExiFaiGniHdiIeiJr +iBaiCsiDdiEfiFgiGhiHjiIkiJl +iBmiCeiDtiEaiFliGliHiiIciJa +iBpiCaiDsiEsiFwiGoiHriIdiJ1 +iBqiCwiDeiEriFtiGyiH1iI2iJ3 +iB1iC2iD3iE4iF5iG6iH7iI8iJ9iK0 +iBqiCwiDeiEriFtiGyiHuiIiiJoiKp +iC1iD2iE3 +iC1iD2iE3iF4 +iC1iD2iE3iF4iG5 +iC0iD0iE0iF0iG0iH0 +iC1iD0iE1iF0iG1iH0 +iC1iD0iE2iF0iG3iH0 +iC1iD1iE1iF1iG1iH1 +iC1iD1iE2iF2iG3iH3 +iC1iD2iE1iF2iG1iH2 +iC1iD2iE3iF1iG2iH3 +iC1iD2iE3iF3iG2iH1 +iC1iD2iE3iF4iG5iH6 +iC1iD2iE3iF6iG5iH4 +iC1iD2iE3iFaiGbiHc +iC1iD2iE3iFqiGwiHe +iC1iD3iE1iF3iG1iH3 +iC1iD4iE7iF2iG5iH8 +iC1iD5iE9iF3iG5iH7 +iC1iD5iE9iF7iG5iH3 +iC1iDqiE2iFwiG3iHe +iC2iD2iE2iF2iG2iH2 +iC2iD3iE2iF3iG2iH3 +iC3iD3iE3iF3iG3iH3 +iC5iD5iE5iF5iG5iH5 +iC6iD5iE4iF3iG2iH1 +iC6iD6iE6iF6iG6iH6 +iC7iD7iE7iF7iG7iH7 +iC7iD8iE9iF4iG5iH6 +iC8iD8iE8iF8iG8iH8 +iC9iD8iE7iF6iG5iH4 +iC9iD9iE9iF9iG9iH9 +iCaiDaiEaiFaiGaiHa +iCaiDbiEciF1iG2iH3 +iCaiDsiEdiF1iG2iH3 +iCaiDsiEdiFaiGsiHd +iCaiDsiEdiFfiGgiHh +iCbiDaiEtiFmiGaiHn +iCciDoiEmiFpiGaiHq +iCdiDaiEniFiiGeiHl +iCdiDriEaiFgiGoiHn +iCeiDmiEiiFniGeiHm +iCgiDoiEoiFgiGliHe +iChiDaiEhiFaiGhiHa +iCjiDoiEriFdiGaiHn +iCkiDiiEliFliGeiHr +iCmiDaiEriFtiGiiHn +iCmiDaiEsiFtiGeiHr +iCmiDaiEtiFriGiiHx +iCmiDoiEniFkiGeiHy +iCqiD1iEwiF2iGeiH3 +iCqiDaiEziFwiGsiHx +iCqiDwiEeiF1iG2iH3 +iCqiDwiEeiFaiGsiHd +iCqiDwiEeiFriGtiHy +iCriDoiEbiFeiGriHt +iCsiDhiEaiFdiGoiHw +iC1iD2iE3iF4iG5iH6iI7 +iC1iD2iE3iF4iG5iH6iIa +iC7iD7iE7iF7iG7iH7iI7 +iCfiDriEeiFeiGdiHoiIm +iCfiDuiEciFkiGyiHoiIu +iCjiDeiEsiFsiGiiHciIa +iCliDeiEtiFmiGeiHiiIn +iCmiDiiEciFhiGaiHeiIl +iCpiDoiEkiFeiGmiHoiIn +iCsiDaiEmiFsiGuiHniIg +iCwiDeiEliFciGoiHmiIe +iCziDxiEciFviGbiHniIm +iC1iD1iE1iF1iG1iH1iI1iJ1 +iC1iD2iE3iF4iG1iH2iI3iJ4 +iC1iD2iE3iF4iG5iH6iI7iJ8 +iC1iD2iE3iF4iGqiHwiIeiJr +iC1iDqiE2iFwiG3iHeiI4iJr +iC1iDqiEaiFziG2iHwiIsiJx +iC8iD8iE8iF8iG8iH8iI8iJ8 +iCaiDbiEciFdiG1iH2iI3iJ4 +iCaiDsiEdiFfiG1iH2iI3iJ4 +iCaiDsiEdiFfiGaiHsiIdiJf +iCciDoiEciFaiGciHoiIliJa +iCciDoiEmiFpiGuiHtiIeiJr +iCfiDoiEoiFtiGbiHaiIliJl +iCiiDliEoiFviGeiHyiIoiJu +iCiiDniEtiFeiGriHniIeiJt +iCpiDaiEsiFsiGwiHoiIriJd +iCqiD1iEwiF2iGeiH3iIriJ4 +iCqiDwiEeiFriG1iH2iI3iJ4 +iCsiDtiEaiFriGwiHaiIriJs +iCsiDuiEniFsiGhiHiiIniJe +iCsiDuiEpiFeiGriHmiIaiJn +iCtiDriEuiFsiGtiHniIoiJ1 +iC1iD2iE3iF1iG2iH3iI1iJ2iK3 +iC1iD2iE3iF4iG5iH6iI7iJ8iK9 +iC9iD8iE7iF6iG5iH4iI3iJ2iK1 +iCaiDliEeiFxiGaiHniIdiJeiKr +iCaiDsiEdiFfiGgiHhiIjiJkiKl +iCmiDeiEtiFaiGliHliIiiJciKa +iCpiDaiEsiFsiGwiHoiIriJdiK1 +iCqiDwiEeiFriGtiHyiI1iJ2iK3 +iC1iD2iE3iF4iG5iH6iI7iJ8iK9iL0 +iCqiDwiEeiFriGtiHyiIuiJiiKoiLp +iD1iE2iF3 +iD1iE2iF3iG4 +iD1iE2iF3iG4iH5 +iD0iE0iF0iG0iH0iI0 +iD1iE0iF1iG0iH1iI0 +iD1iE0iF2iG0iH3iI0 +iD1iE1iF1iG1iH1iI1 +iD1iE1iF2iG2iH3iI3 +iD1iE2iF1iG2iH1iI2 +iD1iE2iF3iG1iH2iI3 +iD1iE2iF3iG3iH2iI1 +iD1iE2iF3iG4iH5iI6 +iD1iE2iF3iG6iH5iI4 +iD1iE2iF3iGaiHbiIc +iD1iE2iF3iGqiHwiIe +iD1iE3iF1iG3iH1iI3 +iD1iE4iF7iG2iH5iI8 +iD1iE5iF9iG3iH5iI7 +iD1iE5iF9iG7iH5iI3 +iD1iEqiF2iGwiH3iIe +iD2iE2iF2iG2iH2iI2 +iD2iE3iF2iG3iH2iI3 +iD3iE3iF3iG3iH3iI3 +iD5iE5iF5iG5iH5iI5 +iD6iE5iF4iG3iH2iI1 +iD6iE6iF6iG6iH6iI6 +iD7iE7iF7iG7iH7iI7 +iD7iE8iF9iG4iH5iI6 +iD8iE8iF8iG8iH8iI8 +iD9iE8iF7iG6iH5iI4 +iD9iE9iF9iG9iH9iI9 +iDaiEaiFaiGaiHaiIa +iDaiEbiFciG1iH2iI3 +iDaiEsiFdiG1iH2iI3 +iDaiEsiFdiGaiHsiId +iDaiEsiFdiGfiHgiIh +iDbiEaiFtiGmiHaiIn +iDciEoiFmiGpiHaiIq +iDdiEaiFniGiiHeiIl +iDdiEriFaiGgiHoiIn +iDeiEmiFiiGniHeiIm +iDgiEoiFoiGgiHliIe +iDhiEaiFhiGaiHhiIa +iDjiEoiFriGdiHaiIn +iDkiEiiFliGliHeiIr +iDmiEaiFriGtiHiiIn +iDmiEaiFsiGtiHeiIr +iDmiEaiFtiGriHiiIx +iDmiEoiFniGkiHeiIy +iDqiE1iFwiG2iHeiI3 +iDqiEaiFziGwiHsiIx +iDqiEwiFeiG1iH2iI3 +iDqiEwiFeiGaiHsiId +iDqiEwiFeiGriHtiIy +iDriEoiFbiGeiHriIt +iDsiEhiFaiGdiHoiIw +iD1iE2iF3iG4iH5iI6iJ7 +iD1iE2iF3iG4iH5iI6iJa +iD7iE7iF7iG7iH7iI7iJ7 +iDfiEriFeiGeiHdiIoiJm +iDfiEuiFciGkiHyiIoiJu +iDjiEeiFsiGsiHiiIciJa +iDliEeiFtiGmiHeiIiiJn +iDmiEiiFciGhiHaiIeiJl +iDpiEoiFkiGeiHmiIoiJn +iDsiEaiFmiGsiHuiIniJg +iDwiEeiFliGciHoiImiJe +iDziExiFciGviHbiIniJm +iD1iE1iF1iG1iH1iI1iJ1iK1 +iD1iE2iF3iG4iH1iI2iJ3iK4 +iD1iE2iF3iG4iH5iI6iJ7iK8 +iD1iE2iF3iG4iHqiIwiJeiKr +iD1iEqiF2iGwiH3iIeiJ4iKr +iD1iEqiFaiGziH2iIwiJsiKx +iD8iE8iF8iG8iH8iI8iJ8iK8 +iDaiEbiFciGdiH1iI2iJ3iK4 +iDaiEsiFdiGfiH1iI2iJ3iK4 +iDaiEsiFdiGfiHaiIsiJdiKf +iDciEoiFciGaiHciIoiJliKa +iDciEoiFmiGpiHuiItiJeiKr +iDfiEoiFoiGtiHbiIaiJliKl +iDiiEliFoiGviHeiIyiJoiKu +iDiiEniFtiGeiHriIniJeiKt +iDpiEaiFsiGsiHwiIoiJriKd +iDqiE1iFwiG2iHeiI3iJriK4 +iDqiEwiFeiGriH1iI2iJ3iK4 +iDsiEtiFaiGriHwiIaiJriKs +iDsiEuiFniGsiHhiIiiJniKe +iDsiEuiFpiGeiHriImiJaiKn +iDtiEriFuiGsiHtiIniJoiK1 +iD1iE2iF3iG1iH2iI3iJ1iK2iL3 +iD1iE2iF3iG4iH5iI6iJ7iK8iL9 +iD9iE8iF7iG6iH5iI4iJ3iK2iL1 +iDaiEliFeiGxiHaiIniJdiKeiLr +iDaiEsiFdiGfiHgiIhiJjiKkiLl +iDmiEeiFtiGaiHliIliJiiKciLa +iDpiEaiFsiGsiHwiIoiJriKdiL1 +iDqiEwiFeiGriHtiIyiJ1iK2iL3 +iD1iE2iF3iG4iH5iI6iJ7iK8iL9iM0 +iDqiEwiFeiGriHtiIyiJuiKiiLoiMp +iE1iF2iG3 +iE1iF2iG3iH4 +iE1iF2iG3iH4iI5 +iE0iF0iG0iH0iI0iJ0 +iE1iF0iG1iH0iI1iJ0 +iE1iF0iG2iH0iI3iJ0 +iE1iF1iG1iH1iI1iJ1 +iE1iF1iG2iH2iI3iJ3 +iE1iF2iG1iH2iI1iJ2 +iE1iF2iG3iH1iI2iJ3 +iE1iF2iG3iH3iI2iJ1 +iE1iF2iG3iH4iI5iJ6 +iE1iF2iG3iH6iI5iJ4 +iE1iF2iG3iHaiIbiJc +iE1iF2iG3iHqiIwiJe +iE1iF3iG1iH3iI1iJ3 +iE1iF4iG7iH2iI5iJ8 +iE1iF5iG9iH3iI5iJ7 +iE1iF5iG9iH7iI5iJ3 +iE1iFqiG2iHwiI3iJe +iE2iF2iG2iH2iI2iJ2 +iE2iF3iG2iH3iI2iJ3 +iE3iF3iG3iH3iI3iJ3 +iE5iF5iG5iH5iI5iJ5 +iE6iF5iG4iH3iI2iJ1 +iE6iF6iG6iH6iI6iJ6 +iE7iF7iG7iH7iI7iJ7 +iE7iF8iG9iH4iI5iJ6 +iE8iF8iG8iH8iI8iJ8 +iE9iF8iG7iH6iI5iJ4 +iE9iF9iG9iH9iI9iJ9 +iEaiFaiGaiHaiIaiJa +iEaiFbiGciH1iI2iJ3 +iEaiFsiGdiH1iI2iJ3 +iEaiFsiGdiHaiIsiJd +iEaiFsiGdiHfiIgiJh +iEbiFaiGtiHmiIaiJn +iEciFoiGmiHpiIaiJq +iEdiFaiGniHiiIeiJl +iEdiFriGaiHgiIoiJn +iEeiFmiGiiHniIeiJm +iEgiFoiGoiHgiIliJe +iEhiFaiGhiHaiIhiJa +iEjiFoiGriHdiIaiJn +iEkiFiiGliHliIeiJr +iEmiFaiGriHtiIiiJn +iEmiFaiGsiHtiIeiJr +iEmiFaiGtiHriIiiJx +iEmiFoiGniHkiIeiJy +iEqiF1iGwiH2iIeiJ3 +iEqiFaiGziHwiIsiJx +iEqiFwiGeiH1iI2iJ3 +iEqiFwiGeiHaiIsiJd +iEqiFwiGeiHriItiJy +iEriFoiGbiHeiIriJt +iEsiFhiGaiHdiIoiJw +iE1iF2iG3iH4iI5iJ6iK7 +iE1iF2iG3iH4iI5iJ6iKa +iE7iF7iG7iH7iI7iJ7iK7 +iEfiFriGeiHeiIdiJoiKm +iEfiFuiGciHkiIyiJoiKu +iEjiFeiGsiHsiIiiJciKa +iEliFeiGtiHmiIeiJiiKn +iEmiFiiGciHhiIaiJeiKl +iEpiFoiGkiHeiImiJoiKn +iEsiFaiGmiHsiIuiJniKg +iEwiFeiGliHciIoiJmiKe +iEziFxiGciHviIbiJniKm +iE1iF1iG1iH1iI1iJ1iK1iL1 +iE1iF2iG3iH4iI1iJ2iK3iL4 +iE1iF2iG3iH4iI5iJ6iK7iL8 +iE1iF2iG3iH4iIqiJwiKeiLr +iE1iFqiG2iHwiI3iJeiK4iLr +iE1iFqiGaiHziI2iJwiKsiLx +iE8iF8iG8iH8iI8iJ8iK8iL8 +iEaiFbiGciHdiI1iJ2iK3iL4 +iEaiFsiGdiHfiI1iJ2iK3iL4 +iEaiFsiGdiHfiIaiJsiKdiLf +iEciFoiGciHaiIciJoiKliLa +iEciFoiGmiHpiIuiJtiKeiLr +iEfiFoiGoiHtiIbiJaiKliLl +iEiiFliGoiHviIeiJyiKoiLu +iEiiFniGtiHeiIriJniKeiLt +iEpiFaiGsiHsiIwiJoiKriLd +iEqiF1iGwiH2iIeiJ3iKriL4 +iEqiFwiGeiHriI1iJ2iK3iL4 +iEsiFtiGaiHriIwiJaiKriLs +iEsiFuiGniHsiIhiJiiKniLe +iEsiFuiGpiHeiIriJmiKaiLn +iEtiFriGuiHsiItiJniKoiL1 +iE1iF2iG3iH1iI2iJ3iK1iL2iM3 +iE1iF2iG3iH4iI5iJ6iK7iL8iM9 +iE9iF8iG7iH6iI5iJ4iK3iL2iM1 +iEaiFliGeiHxiIaiJniKdiLeiMr +iEaiFsiGdiHfiIgiJhiKjiLkiMl +iEmiFeiGtiHaiIliJliKiiLciMa +iEpiFaiGsiHsiIwiJoiKriLdiM1 +iEqiFwiGeiHriItiJyiK1iL2iM3 +iE1iF2iG3iH4iI5iJ6iK7iL8iM9iN0 +iEqiFwiGeiHriItiJyiKuiLiiMoiNp +iF1iG2iH3 +iF1iG2iH3iI4 +iF1iG2iH3iI4iJ5 +iF0iG0iH0iI0iJ0iK0 +iF1iG0iH1iI0iJ1iK0 +iF1iG0iH2iI0iJ3iK0 +iF1iG1iH1iI1iJ1iK1 +iF1iG1iH2iI2iJ3iK3 +iF1iG2iH1iI2iJ1iK2 +iF1iG2iH3iI1iJ2iK3 +iF1iG2iH3iI3iJ2iK1 +iF1iG2iH3iI4iJ5iK6 +iF1iG2iH3iI6iJ5iK4 +iF1iG2iH3iIaiJbiKc +iF1iG2iH3iIqiJwiKe +iF1iG3iH1iI3iJ1iK3 +iF1iG4iH7iI2iJ5iK8 +iF1iG5iH9iI3iJ5iK7 +iF1iG5iH9iI7iJ5iK3 +iF1iGqiH2iIwiJ3iKe +iF2iG2iH2iI2iJ2iK2 +iF2iG3iH2iI3iJ2iK3 +iF3iG3iH3iI3iJ3iK3 +iF5iG5iH5iI5iJ5iK5 +iF6iG5iH4iI3iJ2iK1 +iF6iG6iH6iI6iJ6iK6 +iF7iG7iH7iI7iJ7iK7 +iF7iG8iH9iI4iJ5iK6 +iF8iG8iH8iI8iJ8iK8 +iF9iG8iH7iI6iJ5iK4 +iF9iG9iH9iI9iJ9iK9 +iFaiGaiHaiIaiJaiKa +iFaiGbiHciI1iJ2iK3 +iFaiGsiHdiI1iJ2iK3 +iFaiGsiHdiIaiJsiKd +iFaiGsiHdiIfiJgiKh +iFbiGaiHtiImiJaiKn +iFciGoiHmiIpiJaiKq +iFdiGaiHniIiiJeiKl +iFdiGriHaiIgiJoiKn +iFeiGmiHiiIniJeiKm +iFgiGoiHoiIgiJliKe +iFhiGaiHhiIaiJhiKa +iFjiGoiHriIdiJaiKn +iFkiGiiHliIliJeiKr +iFmiGaiHriItiJiiKn +iFmiGaiHsiItiJeiKr +iFmiGaiHtiIriJiiKx +iFmiGoiHniIkiJeiKy +iFqiG1iHwiI2iJeiK3 +iFqiGaiHziIwiJsiKx +iFqiGwiHeiI1iJ2iK3 +iFqiGwiHeiIaiJsiKd +iFqiGwiHeiIriJtiKy +iFriGoiHbiIeiJriKt +iFsiGhiHaiIdiJoiKw +iF1iG2iH3iI4iJ5iK6iL7 +iF1iG2iH3iI4iJ5iK6iLa +iF7iG7iH7iI7iJ7iK7iL7 +iFfiGriHeiIeiJdiKoiLm +iFfiGuiHciIkiJyiKoiLu +iFjiGeiHsiIsiJiiKciLa +iFliGeiHtiImiJeiKiiLn +iFmiGiiHciIhiJaiKeiLl +iFpiGoiHkiIeiJmiKoiLn +iFsiGaiHmiIsiJuiKniLg +iFwiGeiHliIciJoiKmiLe +iFziGxiHciIviJbiKniLm +iF1iG1iH1iI1iJ1iK1iL1iM1 +iF1iG2iH3iI4iJ1iK2iL3iM4 +iF1iG2iH3iI4iJ5iK6iL7iM8 +iF1iG2iH3iI4iJqiKwiLeiMr +iF1iGqiH2iIwiJ3iKeiL4iMr +iF1iGqiHaiIziJ2iKwiLsiMx +iF8iG8iH8iI8iJ8iK8iL8iM8 +iFaiGbiHciIdiJ1iK2iL3iM4 +iFaiGsiHdiIfiJ1iK2iL3iM4 +iFaiGsiHdiIfiJaiKsiLdiMf +iFciGoiHciIaiJciKoiLliMa +iFciGoiHmiIpiJuiKtiLeiMr +iFfiGoiHoiItiJbiKaiLliMl +iFiiGliHoiIviJeiKyiLoiMu +iFiiGniHtiIeiJriKniLeiMt +iFpiGaiHsiIsiJwiKoiLriMd +iFqiG1iHwiI2iJeiK3iLriM4 +iFqiGwiHeiIriJ1iK2iL3iM4 +iFsiGtiHaiIriJwiKaiLriMs +iFsiGuiHniIsiJhiKiiLniMe +iFsiGuiHpiIeiJriKmiLaiMn +iFtiGriHuiIsiJtiKniLoiM1 +iF1iG2iH3iI1iJ2iK3iL1iM2iN3 +iF1iG2iH3iI4iJ5iK6iL7iM8iN9 +iF9iG8iH7iI6iJ5iK4iL3iM2iN1 +iFaiGliHeiIxiJaiKniLdiMeiNr +iFaiGsiHdiIfiJgiKhiLjiMkiNl +iFmiGeiHtiIaiJliKliLiiMciNa +iFpiGaiHsiIsiJwiKoiLriMdiN1 +iFqiGwiHeiIriJtiKyiL1iM2iN3 +iF1iG2iH3iI4iJ5iK6iL7iM8iN9iO0 +iFqiGwiHeiIriJtiKyiLuiMiiNoiOp +iG1iH2iI3 +iG1iH2iI3iJ4 +iG1iH2iI3iJ4iK5 +iG0iH0iI0iJ0iK0iL0 +iG1iH0iI1iJ0iK1iL0 +iG1iH0iI2iJ0iK3iL0 +iG1iH1iI1iJ1iK1iL1 +iG1iH1iI2iJ2iK3iL3 +iG1iH2iI1iJ2iK1iL2 +iG1iH2iI3iJ1iK2iL3 +iG1iH2iI3iJ3iK2iL1 +iG1iH2iI3iJ4iK5iL6 +iG1iH2iI3iJ6iK5iL4 +iG1iH2iI3iJaiKbiLc +iG1iH2iI3iJqiKwiLe +iG1iH3iI1iJ3iK1iL3 +iG1iH4iI7iJ2iK5iL8 +iG1iH5iI9iJ3iK5iL7 +iG1iH5iI9iJ7iK5iL3 +iG1iHqiI2iJwiK3iLe +iG2iH2iI2iJ2iK2iL2 +iG2iH3iI2iJ3iK2iL3 +iG3iH3iI3iJ3iK3iL3 +iG5iH5iI5iJ5iK5iL5 +iG6iH5iI4iJ3iK2iL1 +iG6iH6iI6iJ6iK6iL6 +iG7iH7iI7iJ7iK7iL7 +iG7iH8iI9iJ4iK5iL6 +iG8iH8iI8iJ8iK8iL8 +iG9iH8iI7iJ6iK5iL4 +iG9iH9iI9iJ9iK9iL9 +iGaiHaiIaiJaiKaiLa +iGaiHbiIciJ1iK2iL3 +iGaiHsiIdiJ1iK2iL3 +iGaiHsiIdiJaiKsiLd +iGaiHsiIdiJfiKgiLh +iGbiHaiItiJmiKaiLn +iGciHoiImiJpiKaiLq +iGdiHaiIniJiiKeiLl +iGdiHriIaiJgiKoiLn +iGeiHmiIiiJniKeiLm +iGgiHoiIoiJgiKliLe +iGhiHaiIhiJaiKhiLa +iGjiHoiIriJdiKaiLn +iGkiHiiIliJliKeiLr +iGmiHaiIriJtiKiiLn +iGmiHaiIsiJtiKeiLr +iGmiHaiItiJriKiiLx +iGmiHoiIniJkiKeiLy +iGqiH1iIwiJ2iKeiL3 +iGqiHaiIziJwiKsiLx +iGqiHwiIeiJ1iK2iL3 +iGqiHwiIeiJaiKsiLd +iGqiHwiIeiJriKtiLy +iGriHoiIbiJeiKriLt +iGsiHhiIaiJdiKoiLw +iG1iH2iI3iJ4iK5iL6iM7 +iG1iH2iI3iJ4iK5iL6iMa +iG7iH7iI7iJ7iK7iL7iM7 +iGfiHriIeiJeiKdiLoiMm +iGfiHuiIciJkiKyiLoiMu +iGjiHeiIsiJsiKiiLciMa +iGliHeiItiJmiKeiLiiMn +iGmiHiiIciJhiKaiLeiMl +iGpiHoiIkiJeiKmiLoiMn +iGsiHaiImiJsiKuiLniMg +iGwiHeiIliJciKoiLmiMe +iGziHxiIciJviKbiLniMm +iG1iH1iI1iJ1iK1iL1iM1iN1 +iG1iH2iI3iJ4iK1iL2iM3iN4 +iG1iH2iI3iJ4iK5iL6iM7iN8 +iG1iH2iI3iJ4iKqiLwiMeiNr +iG1iHqiI2iJwiK3iLeiM4iNr +iG1iHqiIaiJziK2iLwiMsiNx +iG8iH8iI8iJ8iK8iL8iM8iN8 +iGaiHbiIciJdiK1iL2iM3iN4 +iGaiHsiIdiJfiK1iL2iM3iN4 +iGaiHsiIdiJfiKaiLsiMdiNf +iGciHoiIciJaiKciLoiMliNa +iGciHoiImiJpiKuiLtiMeiNr +iGfiHoiIoiJtiKbiLaiMliNl +iGiiHliIoiJviKeiLyiMoiNu +iGiiHniItiJeiKriLniMeiNt +iGpiHaiIsiJsiKwiLoiMriNd +iGqiH1iIwiJ2iKeiL3iMriN4 +iGqiHwiIeiJriK1iL2iM3iN4 +iGsiHtiIaiJriKwiLaiMriNs +iGsiHuiIniJsiKhiLiiMniNe +iGsiHuiIpiJeiKriLmiMaiNn +iGtiHriIuiJsiKtiLniMoiN1 +iG1iH2iI3iJ1iK2iL3iM1iN2iO3 +iG1iH2iI3iJ4iK5iL6iM7iN8iO9 +iG9iH8iI7iJ6iK5iL4iM3iN2iO1 +iGaiHliIeiJxiKaiLniMdiNeiOr +iGaiHsiIdiJfiKgiLhiMjiNkiOl +iGmiHeiItiJaiKliLliMiiNciOa +iGpiHaiIsiJsiKwiLoiMriNdiO1 +iGqiHwiIeiJriKtiLyiM1iN2iO3 +iG1iH2iI3iJ4iK5iL6iM7iN8iO9iP0 +iGqiHwiIeiJriKtiLyiMuiNiiOoiPp \ No newline at end of file diff --git a/rules/T0XlC.rule b/rules/T0XlC.rule new file mode 100644 index 0000000000..8e32ebcf7c --- /dev/null +++ b/rules/T0XlC.rule @@ -0,0 +1,4089 @@ +# Created by: T0XlC +# 4086 rules that produced good results. +# In memory of d3ad0ne +} +{ +u$~$!$@$#$$ +u$z +u$y +u$x +u$w +u$v +u$u +u$t$h$e +u$t +u$s$h +u$s$e$x$y +u$s +u$r +u$q +u$p$a$s$s +u$p +u$o$n +u$o +u$n +u$m +u$l$o$o$p +u$l$e$s$s +u$l +u$k +u$j +u$i$s$m +u$i$s$h +u$i$o$n +u$i$n$g +u$i$a$n +u$i +u$h +u$g +u$f +u$e$s +u$e$n +u$e +u$d$a$y +u$d +u$c +u$b$a$b$y +u$b +u$a$n +u$a$m +u$a$l +u$a +u$S +u +ss5sa@se3si1so0 +ss5sa@sa4se3sl7si1si|so0 +ss5sa4sl7si|so0 +ss5 +so0 +sl7 +si| +si1 +se3 +sa@ +sa4 +r$~$!$@$#$$ +r$z +r$y +r$x +r$w$o$o$d +r$w$i$s$e +r$w$a$y +r$w +r$v +r$u$p +r$u$m +r$u +r$t$y +r$t$i$o$n +r$t$h$e +r$t +r$s$o$m$e +r$s$i$s +r$s$i$o$n +r$s$i$d$e +r$s$h$i$p +r$s$h +r$s$e$x$y +r$s$e$s +r$s +r$r$o$o$m +r$r +r$q +r$p$a$s$s +r$p +r$o$v$e$r +r$o$u$t +r$o$u$s +r$o$u$r +r$o$s$e +r$o$r$y +r$o$r +r$o$n +r$o$m$y +r$o$l$o$g$y +r$o$l +r$o$i$d +r$o$e$s +r$o +r$n$e$s$s +r$n +r$m$e$n$t +r$m$e$n +r$m$a$n +r$m +r$l$y +r$l$o$o$p +r$l$o$n$g +r$l$i$n$g +r$l$i$n$e +r$l$i$k$e +r$l$e$t +r$l$e$s$s +r$l$a$n$d +r$l +r$k$i$n +r$k +r$j +r$i$z$e +r$i$x +r$i$v$e +r$i$t$y +r$i$t$i$v$e +r$i$t$i$o$n +r$i$t$i$c +r$i$t$e +r$i$s$t +r$i$s$m +r$i$s$h +r$i$s$e +r$i$o$u$s +r$i$o$n +r$i$n$g +r$i$n$e +r$i$l$y +r$i$l$i$a +r$i$l$e +r$i$f$y +r$i$e$s$t +r$i$e$s +r$i$e$r +r$i$d$e +r$i$c$l$e +r$i$c$e$s +r$i$c +r$i$b$l$e +r$i$a$n +r$i$a$l +r$i +r$h$o$o$d +r$h$e$a$d +r$h +r$g$e$n$y +r$g +r$f$u$l$l$y +r$f$u$l +r$f$o$r$m +r$f +r$e$t$t$e +r$e$t +r$e$s$t +r$e$s$s +r$e$s +r$e$r$y +r$e$r +r$e$o$u$s +r$e$n$t +r$e$n$c$e +r$e$n +r$e$l$l$a +r$e$e +r$e$d +r$e$a$u +r$e +r$d$o$m$e +r$d$a$y +r$d +r$c$y +r$c +r$b$o$y +r$b$o$o$k +r$b$e$l$l +r$b$a$l$l +r$b$a$c$k +r$b$a$b$y +r$b +r$a$u$x +r$a$t$i$v$e +r$a$t$i$o$n +r$a$s$e +r$a$r$y +r$a$n$t +r$a$n$e +r$a$n$d +r$a$n$c$e +r$a$n$a +r$a$n +r$a$m +r$a$l$l$y +r$a$l +r$a$g$e +r$a$c$l$e +r$a$b$l$e +r$a +r$S +l^y^m +l^y^l^o^p +l^y^k^s +l^y^e^k +l^y^b +l^y^a^w +l^y^a^p +l^y^a^l^p +l^y^a^l +l^y^a^d^s^u^e^t +l^y^a^d^s^r^u^h^t +l^y^a^d^s^e^n^d^e^w +l^y^a^d^r^u^t^a^s +l^y^a^d^n^u^s +l^y^a^d^n^o^m +l^y^a^d^i^r^f +l^y^a^d +l^x^o +l^x^e +l^x^a^t +l^x^a +l^w^o^t +l^w^o^n^s +l^w^o^l +l^w^o^c +l^w^o^b +l^w^e^n +l^w^a^s +l^w^a^j +l^u^e +l^t^u^o +l^t^u^c +l^t^s^o^p +l^t^p^e^h +l^t^o^p +l^t^o^o^f +l^t^o^o^b +l^t^o^n^k +l^t^o^h +l^t^n^e^c +l^t^h^g^i^n +l^t^f^o^s +l^t^e^j +l^t^c^a^l +l^t^a^r +l^t^a^o^b +l^t^a^h +l^t^a^f +l^t^a^c +l^t^a^b +l^s^y^d +l^s^s^o^r^c +l^s^s^a^p +l^s^n^a^r^t +l^s^i^m +l^s^i^h^t +l^s^i^d +l^r^u^s +l^r^o^t^a^r^t^s^i^n^i^m^d^a +l^r^o^o^d +l^r^o^f +l^r^i^a^h +l^r^i^a +l^r^i +l^r^e^v^o +l^r^e^t^n^u^o^c +l^r^e^t^n^i +l^r^e^t^f^a +l^r^e^t^a^w +l^r^e^p^y^h +l^r^e^p^u^s +l^r^e^p +l^r^e^d^n^u +l^r^a^w +l^r^a^p +l^r^a^o +l^r^a^e^b +l^r^a^e +l^p^u +l^p^m^a^c +l^o^t^u^a +l^o^t^c^e +l^o^s^i +l^o^r^y^g +l^o^r^p +l^o^r^e^a +l^o^r^c^i^m +l^o^r^c^a^m +l^o^r^c^a +l^o^p^y^h +l^o^o^z +l^o^n^o^m +l^o^l^l^a +l^o^l^i^k +l^o^i^b +l^o^e^n +l^o^d^u^e^s^p +l^o^c +l^n^w^o^d +l^n^u^s +l^n^u^g +l^n^u +l^n^r^o^c +l^n^o^o^m +l^n^o^n +l^n^o^c +l^n^o +l^n^i^t +l^n^i^p +l^n^i^m^d^a +l^n^i +l^n^e^p +l^n^e +l^n^a^m +l^m^u^g +l^m^r^o^w +l^m^r^a^f +l^m^o^c +l^m^i +l^m^e +l^m^a^ ^i +l^m^'^i +l^m^'^I +l^l^o^o^w +l^l^l^o^r +l^l^l^i^p +l^l^l^i +l^l^l^a^f +l^l^i^o +l^l^i^a^t +l^l^i^a^s +l^l^i^a^r +l^l^i^a^j +l^l^i +l^l^a^o^c +l^l^a^m +l^k^r^o^w +l^k^o^o^b +l^k^n^i +l^k^l^i^m +l^k^c^a^b +l^i^x^a^m +l^i^t^n^a +l^i^t^l^u^m +l^i^r^t +l^i^p^e +l^i^n^m^o +l^i^n^i^m +l^i^m^e^s +l^i^m^e^d +l^i^l^e^h +l^i^b +l^i +l^h^t^r^a^e +l^h^t^a^b +l^h^s^i^f +l^h^s^a^w +l^h^s^a +l^h^g^i^h +l^h^c^r^a +l^g^o^l +l^g^o^d +l^g^n^o^l +l^g^n^i^w +l^g^n^i^r +l^g^n^i^k +l^g^i^p +l^g^e^l +l^f^l^e^s +l^f^l^a^h +l^f^f^o +l^e^y^e +l^e^v^a^h^i +l^e^t^n^a +l^e^s^o^n +l^e^r^p +l^e^r^o^f +l^e^r^i^f +l^e^r +l^e^n^o^t^s +l^e^n^i^l +l^e^l^e^t +l^e^e^r^f +l^e^e^n^k +l^e^d^i^s +l^e^d +l^e^c^i^v +l^e^c^i +l^e^c^a^l +l^e^c^a^f +l^e^b +l^d^u^m +l^d^r^o^w^s^s^a^p +l^d^r^o^c +l^d^r^a^h +l^d^o^o^w +l^d^o^o^g +l^d^n^i^w +l^d^n^i^h +l^d^n^a^l +l^d^n^a^h +l^d^n^a^b +l^d^l^o^g +l^d^i^m +l^d^e^r +l^d^e^e^s +l^d^e^b +l^d^d^a +l^d^a^e^l +l^d^a^e^h +l^d^a^e^d +l^d^a^b +l^c^c^a +l^b^u^s +l^b^o +l^a^r^t^l^u +l^a^n^a +l^a^i^d +l^a^g^e^m +l^a^e^t +l^a^e^s +l^9^9^9^1 +l^9^8^9^1 +l^9^7^9^1 +l^9^6^9^1 +l^9^5^9^1 +l^9^4^9^1 +l^9^1^0^2 +l^9^0^0^2 +l^8^9^9^1 +l^8^8^9^1 +l^8^7^9^1 +l^8^6^9^1 +l^8^5^9^1 +l^8^4^9^1 +l^8^1^0^2 +l^8^0^0^2 +l^7^9^9^1 +l^7^8^9^1 +l^7^7^9^1 +l^7^6^9^1 +l^7^5^9^1 +l^7^4^9^1 +l^7^1^0^2 +l^7^0^0^2 +l^6^9^9^1 +l^6^8^9^1 +l^6^7^9^1 +l^6^6^9^1 +l^6^5^9^1 +l^6^4^9^1 +l^6^1^0^2 +l^6^0^0^2 +l^5^9^9^1 +l^5^8^9^1 +l^5^7^9^1 +l^5^6^9^1 +l^5^5^9^1 +l^5^4^9^1 +l^5^1^0^2 +l^5^0^0^2 +l^4^9^9^1 +l^4^8^9^1 +l^4^7^9^1 +l^4^6^9^1 +l^4^5^9^1 +l^4^4^9^1 +l^4^1^0^2 +l^4^0^0^2 +l^3^9^9^1 +l^3^8^9^1 +l^3^7^9^1 +l^3^6^9^1 +l^3^5^9^1 +l^3^4^9^1 +l^3^2^1 +l^3^1^0^2 +l^3^0^0^2 +l^2^9^9^1 +l^2^8^9^1 +l^2^7^9^1 +l^2^6^9^1 +l^2^5^9^1 +l^2^4^9^1 +l^2^1^0^2 +l^2^0^0^2 +l^1^9^9^1 +l^1^8^9^1 +l^1^7^9^1 +l^1^6^9^1 +l^1^5^9^1 +l^1^4^9^1 +l^1^2^3 +l^1^1^0^2 +l^1^0^0^2 +l^1 +l^0^9^9^1 +l^0^8^9^1 +l^0^7^9^1 +l^0^6^9^1 +l^0^5^9^1 +l^0^4^9^1 +l^0^1^0^2 +l^0^0^0^2 +l^-^x^e +l^-^t^n^a +l^-^s^i^m +l^-^r^e^v^o +l^-^r^e^p^y^h +l^-^n^o^n +l^-^i^m^e^s +l^ ^y^m +l^ ^u^o^y^ +l^ ^u +l^ ^t^o^n^ ^m^a^ ^i +l^ ^t^n^o^d^ ^i +l^ ^t^'^n^o^d^ ^i +l^ ^s^i^ ^t^i +l^ ^s^i^ ^s^i^h^t +l^ ^s^i^ ^e^h^s +l^ ^s^i^ ^e^h +l^ ^r^ ^y^e^h^t +l^ ^r^ ^u^o^y +l^ ^r^ ^e^w +l^ ^p^o^t +l^ ^m^a^ ^i +l^ ^m^'^i +l^ ^m^'^I +l^ ^l^l^i^m +l^ ^i +l^ ^e^v^a^h^ ^i +l^ ^e^r^a^ ^y^e^h^t +l^ ^e^r^a^ ^u^o^y +l^ ^e^r^a^ ^e^w +l^ ^e^h^t +l^ ^d^n^a^s +l^ ^a^ ^m^i +l^ ^a +l^ ^I +l]$z +l]$y +l]$x +l]$w +l]$v +l]$u +l]$t +l]$s +l]$r +l]$q +l]$p +l]$o +l]$n +l]$m +l]$l +l]$k +l]$j +l]$i$n$g +l]$i +l]$h +l]$g +l]$f +l]$e$s +l]$e$d +l]$e +l]$d +l]$c +l]$b +l]$a +l]$Z +l]$Y +l]$X +l]$W +l]$V +l]$U +l]$T +l]$S +l]$R +l]$Q +l]$P +l]$O +l]$N +l]$M +l]$L +l]$K +l]$J +l]$I +l]$H +l]$G +l]$F +l]$E +l]$D +l]$C +l]$B +l]$A +l[^z +l[^y +l[^x +l[^w +l[^v +l[^u +l[^t +l[^s +l[^r +l[^q +l[^p +l[^o +l[^n +l[^m +l[^l +l[^k +l[^j +l[^i +l[^h +l[^g +l[^f +l[^d +l[^c +l[^b +l[^a +l[^Z +l[^Y +l[^X +l[^W +l[^V +l[^U +l[^T +l[^S +l[^R +l[^Q +l[^P +l[^O +l[^N +l[^M +l[^L +l[^K +l[^J +l[^I +l[^H +l[^G +l[^F +l[^E +l[^D +l[^C +l[^B +l[^A +lT1 +l$~$!$@$#$$ +l$z +l$y +l$x +l$w$o$o$d +l$w$i$s$e +l$w$a$y +l$w +l$v +l$u$p +l$u$m +l$u +l$t$y +l$t$i$o$n +l$t$h$e +l$t$e$s$t +l$t +l$s$o$m$e +l$s$m$i$t$h +l$s$i$s +l$s$i$o$n +l$s$i$d$e +l$s$h$i$p +l$s$h +l$s$e$x$y +l$s$e$s +l$s$e$r$v$e$r +l$s$a$l$a$s$a$n$a +l$s +l$r$o$o$m +l$r +l$q$w$e$r$t$y +l$q +l$p$h$p$b$b +l$p$a$s$s +l$p +l$o$v$e$r +l$o$u$t +l$o$u$s +l$o$u$r +l$o$s$e +l$o$r$y +l$o$r +l$o$n +l$o$m$y +l$o$l$o$g$y +l$o$l +l$o$i$d +l$o$e$s +l$o +l$n$e$s$s +l$n +l$m$i$k$e +l$m$i$c$h$a$e$l +l$m$e$n$t +l$m$e$n +l$m$a$n +l$m +l$l$y +l$l$o$o$p +l$l$o$n$g +l$l$i$n$g +l$l$i$n$e +l$l$i$k$e +l$l$e$t +l$l$e$s$s +l$l$e$e +l$l$a$n$d +l$l +l$k$i$n +l$k$h$a$n +l$k +l$j$o$n$e$s +l$j$o$h$n$s$o$n +l$j$o$h$n +l$j +l$i$z$e +l$i$x +l$i$v$e +l$i$t$y +l$i$t$i$v$e +l$i$t$i$o$n +l$i$t$i$c +l$i$t$e +l$i$s$t +l$i$s$m +l$i$s$h +l$i$s$e +l$i$o$u$s +l$i$o$n +l$i$n$g +l$i$n$e +l$i$l$y +l$i$l$i$a +l$i$l$e +l$i$f$y +l$i$e$s$t +l$i$e$s +l$i$e$r +l$i$d$e +l$i$c$l$e +l$i$c$e$s +l$i$c +l$i$b$l$e +l$i$a$n +l$i$a$l +l$i +l$h$o$o$d +l$h$e$a$d +l$h +l$g$e$n$y +l$g +l$f$u$l$l$y +l$f$u$l +l$f$o$r$m +l$f$a$r$m$v$i$l$l$e +l$f +l$e$t$t$e +l$e$t +l$e$s$t +l$e$s$s +l$e$s +l$e$r$y +l$e$r +l$e$o$u$s +l$e$n$t +l$e$n$c$e +l$e$n +l$e$l$l$a +l$e$e +l$e$d +l$e$a$u +l$e +l$d$o$m$e +l$d$a$y +l$d$a$v$i$d +l$d +l$c$y +l$c +l$b$r$o$w$n +l$b$o$y +l$b$o$o$k +l$b$e$l$l +l$b$a$l$l +l$b$a$c$k +l$b$a$b$y +l$b +l$a$u$x +l$a$t$i$v$e +l$a$t$i$o$n +l$a$s$e +l$a$r$y +l$a$n$t +l$a$n$e +l$a$n$d +l$a$n$c$e +l$a$n$a +l$a$n +l$a$m +l$a$l$l$y +l$a$l +l$a$g$e +l$a$c$l$e +l$a$b$l$e +l$a +l$S +l$@$z$o$h$o$.$c$o$m +l$@$y$m$a$i$l$.$c$o$m +l$@$y$a$h$o$o$.$c$o$m +l$@$y$a$h$o$o$.$c$o$.$u$k +l$@$y$a$h$o$o$.$c$o$.$i$n +l$@$y$a$h$o$o$.$c$a +l$@$w$p$.$p$l +l$@$v$e$r$i$z$o$n$.$n$e$t +l$@$m$s$n$.$c$o$m +l$@$m$a$i$l$.$r$u +l$@$m$a$i$l$.$c$o$m +l$@$l$i$v$e$.$c$o$m +l$@$l$i$v$e$.$c$o$.$u$k +l$@$i$n$b$o$x$.$r$u +l$@$h$o$t$m$a$i$l$.$c$o$m +l$@$g$m$x$.$u$s +l$@$g$m$x$.$c$o$m +l$@$g$m$a$i$l$.$c$o$m +l$@$g$a$w$a$b$.$c$o$m +l$@$f$a$s$t$m$a$i$l$.$f$m +l$@$c$o$x$.$n$e$t +l$@$c$o$m$c$a$s$t$.$n$e$t +l$@$a$o$l$.$c$o$m +l$@$a$m$e$l$e$.$c$o$m +l$9$9 +l$9$8 +l$9$7 +l$9$6 +l$9$5 +l$9$4 +l$9$3 +l$9$2 +l$9$1 +l$9$0 +l$9 +l$8$9 +l$8$8 +l$8$7 +l$8$6 +l$8$5 +l$8$4 +l$8$3 +l$8$2 +l$8$1 +l$8$0 +l$8 +l$7$9 +l$7$8 +l$7$7 +l$7$6 +l$7$5 +l$7$4 +l$7$3 +l$7$2 +l$7$1 +l$7$0 +l$7 +l$6$9 +l$6$8 +l$6$7 +l$6$6 +l$6$5 +l$6$4 +l$6$3 +l$6$2 +l$6$1 +l$6$0 +l$6 +l$5$9 +l$5$8 +l$5$7 +l$5$6 +l$5$5 +l$5$4 +l$5$3 +l$5$2 +l$5$1 +l$5$0 +l$5 +l$4$9 +l$4$8 +l$4$7 +l$4$6 +l$4$5 +l$4$4 +l$4$3 +l$4$2 +l$4$1 +l$4$0 +l$4 +l$3$9 +l$3$8 +l$3$7 +l$3$6 +l$3$5 +l$3$4 +l$3$3 +l$3$2 +l$3$1 +l$3$0 +l$3 +l$2$9 +l$2$8 +l$2$7 +l$2$6 +l$2$5 +l$2$4 +l$2$3 +l$2$2 +l$2$1 +l$2$0$1$3$~ +l$2$0$1$3$| +l$2$0$1$3$` +l$2$0$1$3$_ +l$2$0$1$3$^ +l$2$0$1$3$@ +l$2$0$1$3$? +l$2$0$1$3$= +l$2$0$1$3$. +l$2$0$1$3$- +l$2$0$1$3$+ +l$2$0$1$3$* +l$2$0$1$3$) +l$2$0$1$3$( +l$2$0$1$3$& +l$2$0$1$3$% +l$2$0$1$3$$ +l$2$0$1$3$# +l$2$0$1$3$! +l$2$0$1$2$~ +l$2$0$1$2$| +l$2$0$1$2$` +l$2$0$1$2$_ +l$2$0$1$2$^ +l$2$0$1$2$@ +l$2$0$1$2$? +l$2$0$1$2$= +l$2$0$1$2$. +l$2$0$1$2$- +l$2$0$1$2$+ +l$2$0$1$2$* +l$2$0$1$2$) +l$2$0$1$2$( +l$2$0$1$2$& +l$2$0$1$2$% +l$2$0$1$2$$ +l$2$0$1$2$# +l$2$0$1$2$! +l$2$0$1$1$~ +l$2$0$1$1$| +l$2$0$1$1$` +l$2$0$1$1$_ +l$2$0$1$1$^ +l$2$0$1$1$@ +l$2$0$1$1$? +l$2$0$1$1$= +l$2$0$1$1$. +l$2$0$1$1$- +l$2$0$1$1$+ +l$2$0$1$1$* +l$2$0$1$1$) +l$2$0$1$1$( +l$2$0$1$1$& +l$2$0$1$1$% +l$2$0$1$1$$ +l$2$0$1$1$# +l$2$0$1$1$! +l$2$0$1$0$~ +l$2$0$1$0$| +l$2$0$1$0$` +l$2$0$1$0$_ +l$2$0$1$0$^ +l$2$0$1$0$@ +l$2$0$1$0$? +l$2$0$1$0$= +l$2$0$1$0$. +l$2$0$1$0$- +l$2$0$1$0$+ +l$2$0$1$0$* +l$2$0$1$0$) +l$2$0$1$0$( +l$2$0$1$0$& +l$2$0$1$0$% +l$2$0$1$0$$ +l$2$0$1$0$# +l$2$0$1$0$! +l$2$0 +l$2 +l$1$9 +l$1$8 +l$1$7 +l$1$6 +l$1$5 +l$1$4 +l$1$3 +l$1$2$3$4$5$6$7$8$9$0 +l$1$2$3$4$5$6$7$8$9 +l$1$2$3$4$5$6$7$8 +l$1$2$3$4$5$6$7 +l$1$2$3$4$5$6 +l$1$2$3$4$5 +l$1$2$3$4 +l$1$2$3 +l$1$2 +l$1$1 +l$1$0 +l$1 +l$0$9 +l$0$8 +l$0$7 +l$0$6 +l$0$5 +l$0$4 +l$0$3 +l$0$2 +l$0$1$2$3$4$5$6$7$8$9 +l$0$1 +l$.$z$w +l$.$z$m +l$.$z$a +l$.$y$u +l$.$y$t +l$.$y$e +l$.$w$s +l$.$w$f +l$.$v$u +l$.$v$n +l$.$v$i +l$.$v$g +l$.$v$e +l$.$v$c +l$.$v$a +l$.$u$z +l$.$u$y +l$.$u$s +l$.$u$m +l$.$u$k +l$.$u$g +l$.$u$a +l$.$t$z +l$.$t$w +l$.$t$v +l$.$t$t +l$.$t$r$a$v$e$l +l$.$t$r +l$.$t$p +l$.$t$o +l$.$t$n +l$.$t$m +l$.$t$l +l$.$t$k +l$.$t$j +l$.$t$h +l$.$t$g +l$.$t$f +l$.$t$d +l$.$t$c +l$.$s$z +l$.$s$y +l$.$s$v +l$.$s$u +l$.$s$t +l$.$s$r +l$.$s$o +l$.$s$n +l$.$s$m +l$.$s$l +l$.$s$k +l$.$s$j +l$.$s$i +l$.$s$h +l$.$s$g +l$.$s$e +l$.$s$d +l$.$s$c +l$.$s$b +l$.$s$a +l$.$r$w +l$.$r$u +l$.$r$o$o$t +l$.$r$o +l$.$r$e +l$.$q$a +l$.$p$y +l$.$p$w +l$.$p$t +l$.$p$s +l$.$p$r$o +l$.$p$r +l$.$p$n +l$.$p$m +l$.$p$l +l$.$p$k +l$.$p$h +l$.$p$g +l$.$p$f +l$.$p$e +l$.$p$a +l$.$o$r$g +l$.$o$m +l$.$n$z +l$.$n$u +l$.$n$r +l$.$n$p +l$.$n$o +l$.$n$l +l$.$n$i +l$.$n$g +l$.$n$f +l$.$n$e$t +l$.$n$e +l$.$n$c +l$.$n$a$m$e +l$.$n$a +l$.$m$z +l$.$m$y +l$.$m$x +l$.$m$w +l$.$m$v +l$.$m$u$s$e$u$m +l$.$m$u +l$.$m$t +l$.$m$s +l$.$m$r +l$.$m$q +l$.$m$p +l$.$m$o$b$i +l$.$m$o +l$.$m$n +l$.$m$m +l$.$m$l +l$.$m$k +l$.$m$i$l +l$.$m$h +l$.$m$g +l$.$m$d +l$.$m$c +l$.$m$a +l$.$l$y +l$.$l$v +l$.$l$u +l$.$l$t +l$.$l$s +l$.$l$r +l$.$l$k +l$.$l$i +l$.$l$c +l$.$l$b +l$.$l$a +l$.$k$z +l$.$k$y +l$.$k$w +l$.$k$r +l$.$k$n +l$.$k$m +l$.$k$i +l$.$k$h +l$.$k$g +l$.$k$e +l$.$j$p +l$.$j$o$b$s +l$.$j$o +l$.$j$m +l$.$j$e +l$.$i$t +l$.$i$s +l$.$i$r +l$.$i$q +l$.$i$o +l$.$i$n$t +l$.$i$n$f$o +l$.$i$n +l$.$i$m +l$.$i$l +l$.$i$e +l$.$i$d +l$.$h$u +l$.$h$t +l$.$h$r +l$.$h$n +l$.$h$m +l$.$h$k +l$.$g$y +l$.$g$w +l$.$g$u +l$.$g$t +l$.$g$s +l$.$g$r +l$.$g$q +l$.$g$p +l$.$g$o$v +l$.$g$n +l$.$g$m +l$.$g$l +l$.$g$i +l$.$g$h +l$.$g$g +l$.$g$f +l$.$g$e +l$.$g$d +l$.$g$b +l$.$g$a +l$.$f$r +l$.$f$o +l$.$f$m +l$.$f$k +l$.$f$j +l$.$f$i +l$.$e$u +l$.$e$t +l$.$e$s +l$.$e$r +l$.$e$g +l$.$e$e +l$.$e$d$u +l$.$e$c +l$.$d$z +l$.$d$o +l$.$d$m +l$.$d$k +l$.$d$j +l$.$d$e +l$.$c$z +l$.$c$y +l$.$c$x +l$.$c$v +l$.$c$u +l$.$c$r +l$.$c$o$o$p +l$.$c$o$m +l$.$c$o +l$.$c$n +l$.$c$m +l$.$c$l +l$.$c$k +l$.$c$i +l$.$c$h +l$.$c$g +l$.$c$f +l$.$c$d +l$.$c$c +l$.$c$a$t +l$.$c$a +l$.$b$z +l$.$b$y +l$.$b$w +l$.$b$v +l$.$b$t +l$.$b$s +l$.$b$r +l$.$b$o +l$.$b$n +l$.$b$m +l$.$b$j +l$.$b$i$z +l$.$b$i +l$.$b$h +l$.$b$g +l$.$b$f +l$.$b$e +l$.$b$d +l$.$b$b +l$.$b$a +l$.$a$z +l$.$a$x +l$.$a$w +l$.$a$u +l$.$a$t +l$.$a$s +l$.$a$r$p$a +l$.$a$r +l$.$a$q +l$.$a$o +l$.$a$n +l$.$a$m +l$.$a$l +l$.$a$i +l$.$a$g +l$.$a$f +l$.$a$e$r$o +l$.$a$e +l$.$a$d +l$.$a$c +l$&$a$m$p$; +l$!$!$!$!$!$!$!$!$!$!$! +l$!$!$!$!$!$!$!$!$!$! +l$!$!$!$!$!$!$!$!$! +l$!$!$!$!$!$!$!$! +l$!$!$!$!$!$!$! +l$!$!$!$!$!$! +l$!$!$!$!$! +l$!$!$!$! +l$!$!$! +l$!$! +l$! +l +iA +i9! +i9 +i8* +i8# +i8! +i8 +i7~ +i7} +i7| +i7{ +i7_ +i7^ +i7] +i7\ +i7[ +i7? +i7> +i7= +i7< +i7; +i7: +i79 +i78 +i77 +i76 +i75 +i74 +i73 +i72 +i71i72i83i94 +i71i72i83 +i71 +i70 +i7. +i7- +i7+ +i7* +i7) +i7& +i7% +i7$ +i7# +i7 +i6~ +i6} +i6| +i6{ +i6_ +i6^ +i6] +i6\ +i6[ +i6? +i6> +i6= +i6< +i6; +i6: +i69 +i68 +i67 +i66 +i65 +i64 +i63 +i62 +i61i72i83i94 +i61i72i83 +i61 +i60 +i6. +i6- +i6+ +i6* +i6( +i6& +i6% +i6$ +i6# +i6 +i5. +i5- +i5 +i4. +i4- +i4 +i3. +i3- +i3 +i2. +i2- +i2 +i1 +d$~$!$@$#$$ +d$z +d$y +d$x +d$w$o$o$d +d$w$i$s$e +d$w$a$y +d$w +d$v +d$u$p +d$u$m +d$u +d$t$y +d$t$i$o$n +d$t$h$e +d$t +d$s$o$m$e +d$s$i$s +d$s$i$o$n +d$s$i$d$e +d$s$h$i$p +d$s$h +d$s$e$x$y +d$s$e$s +d$s +d$r$o$o$m +d$r +d$q +d$p$a$s$s +d$p +d$o$v$e$r +d$o$u$t +d$o$u$s +d$o$u$r +d$o$s$e +d$o$r$y +d$o$r +d$o$n +d$o$m$y +d$o$l$o$g$y +d$o$l +d$o$i$d +d$o$e$s +d$o +d$n$e$s$s +d$n +d$m$e$n$t +d$m$e$n +d$m$a$n +d$m +d$l$y +d$l$o$o$p +d$l$o$n$g +d$l$i$n$g +d$l$i$n$e +d$l$i$k$e +d$l$e$t +d$l$e$s$s +d$l$a$n$d +d$l +d$k$i$n +d$k +d$j$o$n$e$s +d$j +d$i$z$e +d$i$x +d$i$v$e +d$i$t$y +d$i$t$i$v$e +d$i$t$i$o$n +d$i$t$i$c +d$i$t$e +d$i$s$t +d$i$s$m +d$i$s$h +d$i$s$e +d$i$o$u$s +d$i$o$n +d$i$n$g +d$i$n$e +d$i$l$y +d$i$l$i$a +d$i$l$e +d$i$f$y +d$i$e$s$t +d$i$e$s +d$i$e$r +d$i$d$e +d$i$c$l$e +d$i$c$e$s +d$i$c +d$i$b$l$e +d$i$a$n +d$i$a$l +d$i +d$h$o$o$d +d$h$e$a$d +d$h +d$g$e$n$y +d$g +d$f$u$l$l$y +d$f$u$l +d$f$o$r$m +d$f +d$e$t$t$e +d$e$t +d$e$s$t +d$e$s$s +d$e$s +d$e$r$y +d$e$r +d$e$o$u$s +d$e$n$t +d$e$n$c$e +d$e$n +d$e$l$l$a +d$e$e +d$e$d +d$e$a$u +d$e +d$d$o$m$e +d$d$a$y +d$d +d$c$y +d$c +d$b$o$y +d$b$o$o$k +d$b$e$l$l +d$b$a$l$l +d$b$a$c$k +d$b$a$b$y +d$b +d$a$u$x +d$a$t$i$v$e +d$a$t$i$o$n +d$a$s$e +d$a$r$y +d$a$n$t +d$a$n$e +d$a$n$d +d$a$n$c$e +d$a$n$a +d$a$n +d$a$m +d$a$l$l$y +d$a$l +d$a$g$e +d$a$c$l$e +d$a$b$l$e +d$a +d$S +cl +c^z +c^y^m +c^y^l^o^p +c^y^k^s +c^y^e^k +c^y^b +c^y^a^w +c^y^a^p +c^y^a^l^p +c^y^a^l +c^y^a^d^s^u^e^t +c^y^a^d^s^r^u^h^t +c^y^a^d^s^e^n^d^e^w +c^y^a^d^r^u^t^a^s +c^y^a^d^n^u^s +c^y^a^d^n^o^m +c^y^a^d^i^r^f +c^y^a^d +c^y +c^x^o +c^x^e +c^x^a^t +c^x^a +c^x +c^w^o^t +c^w^o^n^s +c^w^o^l +c^w^o^c +c^w^o^b +c^w^e^n +c^w^a^s +c^w^a^j +c^w +c^v +c^u^e +c^u +c^t^u^o +c^t^u^c +c^t^s^o^p +c^t^p^e^h +c^t^o^p +c^t^o^o^f +c^t^o^o^b +c^t^o^n^k +c^t^o^h +c^t^n^e^c +c^t^h^g^i^n +c^t^f^o^s +c^t^e^j +c^t^c^a^l +c^t^a^r +c^t^a^o^b +c^t^a^h +c^t^a^f +c^t^a^c +c^t^a^b +c^t +c^s^y^d +c^s^s^o^r^c +c^s^s^a^p +c^s^n^a^r^t +c^s^i^m +c^s^i^h^t +c^s^i^d +c^s +c^r^u^s +c^r^o^t^a^r^t^s^i^n^i^m^d^a +c^r^o^o^d +c^r^o^f +c^r^i^a^h +c^r^i^a +c^r^i +c^r^e^v^o +c^r^e^t^n^u^o^c +c^r^e^t^n^i +c^r^e^t^f^a +c^r^e^t^a^w +c^r^e^p^y^h +c^r^e^p^u^s +c^r^e^p +c^r^e^d^n^u +c^r^a^w +c^r^a^p +c^r^a^o +c^r^a^e^b +c^r^a^e +c^r +c^q +c^p^u +c^p^m^a^c +c^p +c^o^t^u^a +c^o^t^c^e +c^o^s^i +c^o^r^y^g +c^o^r^p +c^o^r^e^a +c^o^r^c^i^m +c^o^r^c^a^m +c^o^r^c^a +c^o^p^y^h +c^o^o^z +c^o^n^o^m +c^o^l^l^a +c^o^l^i^k +c^o^i^b +c^o^e^n +c^o^d^u^e^s^p +c^o^c +c^o +c^n^w^o^d +c^n^u^s +c^n^u^g +c^n^u +c^n^r^o^c +c^n^o^o^m +c^n^o^n +c^n^o^c +c^n^o +c^n^i^t +c^n^i^p +c^n^i^m^d^a +c^n^i +c^n^e^p +c^n^e +c^n^a^m +c^n +c^m^u^g +c^m^r^o^w +c^m^r^a^f +c^m^o^c +c^m^i +c^m^e +c^m^a^ ^i +c^m^'^i +c^m^'^I +c^m +c^l^o^o^w +c^l^l^o^r +c^l^l^i^p +c^l^l^i +c^l^l^a^f +c^l^i^o +c^l^i^a^t +c^l^i^a^s +c^l^i^a^r +c^l^i^a^j +c^l^i +c^l^a^o^c +c^l^a^m +c^l +c^k^r^o^w +c^k^o^o^b +c^k^n^i +c^k^l^i^m +c^k^c^a^b +c^k +c^j +c^i^x^a^m +c^i^t^n^a +c^i^t^l^u^m +c^i^r^t +c^i^p^e +c^i^n^m^o +c^i^n^i^m +c^i^m^e^s +c^i^m^e^d +c^i^l^e^h +c^i^b +c^i +c^h^t^r^a^e +c^h^t^a^b +c^h^s^i^f +c^h^s^a^w +c^h^s^a +c^h^g^i^h +c^h^c^r^a +c^h +c^g^o^l +c^g^o^d +c^g^n^o^l +c^g^n^i^w +c^g^n^i^r +c^g^n^i^k +c^g^i^p +c^g^e^l +c^g +c^f^l^e^s +c^f^l^a^h +c^f^f^o +c^f +c^e^y^e +c^e^v^a^h^i +c^e^t^n^a +c^e^s^o^n +c^e^r^p +c^e^r^o^f +c^e^r^i^f +c^e^r +c^e^n^o^t^s +c^e^n^i^l +c^e^l^e^t +c^e^e^r^f +c^e^e^n^k +c^e^d^i^s +c^e^d +c^e^c^i^v +c^e^c^i +c^e^c^a^l +c^e^c^a^f +c^e^b +c^e +c^d^u^m +c^d^r^o^w^s^s^a^p +c^d^r^o^c +c^d^r^a^h +c^d^o^o^w +c^d^o^o^g +c^d^n^i^w +c^d^n^i^h +c^d^n^a^l +c^d^n^a^h +c^d^n^a^b +c^d^l^o^g +c^d^i^m +c^d^e^r +c^d^e^e^s +c^d^e^b +c^d^d^a +c^d^a^e^l +c^d^a^e^h +c^d^a^e^d +c^d^a^b +c^d +c^c^c^a +c^c +c^b^u^s +c^b^o +c^b +c^a^r^t^l^u +c^a^n^a +c^a^i^d +c^a^g^e^m +c^a^e^t +c^a^e^s +c^a +c^Z +c^Y +c^X +c^W +c^V +c^U +c^T +c^S +c^R +c^Q +c^P +c^O +c^N +c^M +c^L +c^K +c^J +c^I +c^H +c^G +c^F +c^E +c^D +c^C +c^B +c^A +c^9^9^9^1 +c^9^8^9^1 +c^9^7^9^1 +c^9^6^9^1 +c^9^5^9^1 +c^9^4^9^1 +c^9^1^0^2 +c^9^0^0^2 +c^8^9^9^1 +c^8^8^9^1 +c^8^7^9^1 +c^8^6^9^1 +c^8^5^9^1 +c^8^4^9^1 +c^8^1^0^2 +c^8^0^0^2 +c^7^9^9^1 +c^7^8^9^1 +c^7^7^9^1 +c^7^6^9^1 +c^7^5^9^1 +c^7^4^9^1 +c^7^1^0^2 +c^7^0^0^2 +c^6^9^9^1 +c^6^8^9^1 +c^6^7^9^1 +c^6^6^9^1 +c^6^5^9^1 +c^6^4^9^1 +c^6^1^0^2 +c^6^0^0^2 +c^5^9^9^1 +c^5^8^9^1 +c^5^7^9^1 +c^5^6^9^1 +c^5^5^9^1 +c^5^4^9^1 +c^5^1^0^2 +c^5^0^0^2 +c^4^9^9^1 +c^4^8^9^1 +c^4^7^9^1 +c^4^6^9^1 +c^4^5^9^1 +c^4^4^9^1 +c^4^1^0^2 +c^4^0^0^2 +c^3^9^9^1 +c^3^8^9^1 +c^3^7^9^1 +c^3^6^9^1 +c^3^5^9^1 +c^3^4^9^1 +c^3^2^1 +c^3^1^0^2 +c^3^0^0^2 +c^2^9^9^1 +c^2^8^9^1 +c^2^7^9^1 +c^2^6^9^1 +c^2^5^9^1 +c^2^4^9^1 +c^2^1^0^2 +c^2^0^0^2 +c^1^9^9^1 +c^1^8^9^1 +c^1^7^9^1 +c^1^6^9^1 +c^1^5^9^1 +c^1^4^9^1 +c^1^2^3 +c^1^1^0^2 +c^1^0^0^2 +c^1 +c^0^9^9^1 +c^0^8^9^1 +c^0^7^9^1 +c^0^6^9^1 +c^0^5^9^1 +c^0^4^9^1 +c^0^1^0^2 +c^0^0^0^2 +c^-^x^e +c^-^t^n^a +c^-^s^i^m +c^-^r^e^v^o +c^-^r^e^p^y^h +c^-^n^o^n +c^-^i^m^e^s +c^ ^y^m +c^ ^u^o^y +c^ ^u +c^ ^t^o^n^ ^m^a^ ^i +c^ ^t^n^o^d^ ^i +c^ ^t^'^n^o^d^ ^i +c^ ^s^i^ ^t^i +c^ ^s^i^ ^s^i^h^t +c^ ^s^i^ ^e^h^s +c^ ^s^i^ ^e^h +c^ ^r^ ^y^e^h^t +c^ ^r^ ^u^o^y +c^ ^r^ ^e^w +c^ ^p^o^t +c^ ^m^a^ ^i +c^ ^m^'^i +c^ ^m^'^I +c^ ^l^l^i^m +c^ ^i +c^ ^e^v^a^h^ ^i +c^ ^e^r^a^ ^y^e^h^t +c^ ^e^r^a^ ^u^o^y +c^ ^e^r^a^ ^e^w +c^ ^e^h^t +c^ ^d^n^a^s +c^ ^a^ ^m^i +c^ ^a +c^ ^I +c$~$!$@$#$$ +c$z +c$y +c$x +c$w$o$o$d +c$w$i$s$e +c$w$a$y +c$w +c$v +c$u$p +c$u$m +c$u +c$t$y +c$t$i$o$n +c$t$h$e +c$t$e$s$t +c$t +c$s$o$m$e +c$s$m$i$t$h +c$s$i$s +c$s$i$o$n +c$s$i$d$e +c$s$h$i$p +c$s$h +c$s$e$x$y +c$s$e$s +c$s$e$r$v$e$r +c$s$a$l$a$s$a$n$a +c$s +c$r$o$o$m +c$r +c$q$w$e$r$t$y +c$q +c$p$h$p$b$b +c$p$a$s$s +c$p +c$o$v$e$r +c$o$u$t +c$o$u$s +c$o$u$r +c$o$s$e +c$o$r$y +c$o$r +c$o$n +c$o$m$y +c$o$l$o$g$y +c$o$l +c$o$i$d +c$o$e$s +c$o +c$n$e$s$s +c$n +c$m$i$k$e +c$m$i$c$h$a$e$l +c$m$e$n$t +c$m$e$n +c$m$a$n +c$m +c$l$y +c$l$o$o$p +c$l$o$n$g +c$l$i$n$g +c$l$i$n$e +c$l$i$k$e +c$l$e$t +c$l$e$s$s +c$l$e$e +c$l$a$n$d +c$l +c$k$i$n +c$k$h$a$n +c$k +c$j$o$h$n$s$o$n +c$j$o$h$n +c$j +c$i$z$e +c$i$x +c$i$v$e +c$i$t$y +c$i$t$i$v$e +c$i$t$i$o$n +c$i$t$i$c +c$i$t$e +c$i$s$t +c$i$s$m +c$i$s$h +c$i$s$e +c$i$o$u$s +c$i$o$n +c$i$n$g +c$i$n$e +c$i$l$y +c$i$l$i$a +c$i$l$e +c$i$f$y +c$i$e$s$t +c$i$e$s +c$i$e$r +c$i$d$e +c$i$c$l$e +c$i$c$e$s +c$i$c +c$i$b$l$e +c$i$a$n +c$i$a$l +c$i +c$h$o$o$d +c$h$e$a$d +c$h +c$g$e$n$y +c$g +c$f$u$l$l$y +c$f$u$l +c$f$o$r$m +c$f$a$r$m$v$i$l$l$e +c$f +c$e$t$t$e +c$e$t +c$e$s$t +c$e$s$s +c$e$s +c$e$r$y +c$e$r +c$e$o$u$s +c$e$n$t +c$e$n$c$e +c$e$n +c$e$l$l$a +c$e$e +c$e$d +c$e$a$u +c$e +c$d$o$m$e +c$d$a$y +c$d$a$v$i$d +c$d +c$c$y +c$c +c$b$r$o$w$n +c$b$o$y +c$b$o$o$k +c$b$e$l$l +c$b$a$l$l +c$b$a$c$k +c$b$a$b$y +c$b +c$a$u$x +c$a$t$i$v$e +c$a$t$i$o$n +c$a$s$e +c$a$r$y +c$a$n$t +c$a$n$e +c$a$n$d +c$a$n$c$e +c$a$n$a +c$a$n +c$a$m +c$a$l$l$y +c$a$l +c$a$g$e +c$a$c$l$e +c$a$b$l$e +c$a +c$S +c$@$z$o$h$o$.$c$o$m +c$@$y$m$a$i$l$.$c$o$m +c$@$y$a$h$o$o$.$c$o$m +c$@$y$a$h$o$o$.$c$o$.$u$k +c$@$y$a$h$o$o$.$c$o$.$i$n +c$@$y$a$h$o$o$.$c$a +c$@$w$p$.$p$l +c$@$v$e$r$i$z$o$n$.$n$e$t +c$@$m$s$n$.$c$o$m +c$@$m$a$i$l$.$r$u +c$@$m$a$i$l$.$c$o$m +c$@$l$i$v$e$.$c$o$m +c$@$l$i$v$e$.$c$o$.$u$k +c$@$i$n$b$o$x$.$r$u +c$@$h$o$t$m$a$i$l$.$c$o$m +c$@$g$m$x$.$u$s +c$@$g$m$x$.$c$o$m +c$@$g$m$a$i$l$.$c$o$m +c$@$g$a$w$a$b$.$c$o$m +c$@$f$a$s$t$m$a$i$l$.$f$m +c$@$c$o$x$.$n$e$t +c$@$c$o$m$c$a$s$t$.$n$e$t +c$@$a$o$l$.$c$o$m +c$@$a$m$e$l$e$.$c$o$m +c$9$9 +c$9$8 +c$9$7 +c$9$6 +c$9$5 +c$9$4 +c$9$3 +c$9$2 +c$9$1 +c$9$0 +c$9 +c$8$9 +c$8$8 +c$8$7 +c$8$6 +c$8$5 +c$8$4 +c$8$3 +c$8$2 +c$8$1 +c$8$0 +c$8 +c$7$9 +c$7$8 +c$7$7 +c$7$6 +c$7$5 +c$7$4 +c$7$3 +c$7$2 +c$7$1 +c$7$0 +c$7 +c$6$9 +c$6$8 +c$6$7 +c$6$6 +c$6$5 +c$6$4 +c$6$3 +c$6$2 +c$6$1 +c$6$0 +c$6 +c$5$9 +c$5$8 +c$5$7 +c$5$6 +c$5$5 +c$5$4 +c$5$3 +c$5$2 +c$5$1 +c$5$0 +c$5 +c$4$9 +c$4$8 +c$4$7 +c$4$6 +c$4$5 +c$4$4 +c$4$3 +c$4$2 +c$4$1 +c$4$0 +c$4 +c$3$9 +c$3$8 +c$3$7 +c$3$6 +c$3$5 +c$3$4 +c$3$3 +c$3$2 +c$3$1 +c$3$0 +c$3 +c$2$9 +c$2$8 +c$2$7 +c$2$6 +c$2$5 +c$2$4 +c$2$3 +c$2$2 +c$2$1 +c$2$0$1$0$~ +c$2$0$1$0$@ +c$2$0$1$0$* +c$2$0$1$0$$ +c$2$0$1$0$! +c$2$0 +c$2 +c$1$9$9$2$~ +c$1$9$9$2$| +c$1$9$9$2$` +c$1$9$9$2$_ +c$1$9$9$2$^ +c$1$9$9$2$@ +c$1$9$9$2$? +c$1$9$9$2$= +c$1$9$9$2$. +c$1$9$9$2$- +c$1$9$9$2$+ +c$1$9$9$2$* +c$1$9$9$2$) +c$1$9$9$2$( +c$1$9$9$2$& +c$1$9$9$2$% +c$1$9$9$2$$ +c$1$9$9$2$# +c$1$9$9$2$! +c$1$9$9$1$~ +c$1$9$9$1$| +c$1$9$9$1$` +c$1$9$9$1$_ +c$1$9$9$1$^ +c$1$9$9$1$@ +c$1$9$9$1$? +c$1$9$9$1$= +c$1$9$9$1$. +c$1$9$9$1$- +c$1$9$9$1$+ +c$1$9$9$1$* +c$1$9$9$1$) +c$1$9$9$1$( +c$1$9$9$1$& +c$1$9$9$1$% +c$1$9$9$1$$ +c$1$9$9$1$# +c$1$9$9$1$! +c$1$9$9$0$~ +c$1$9$9$0$| +c$1$9$9$0$` +c$1$9$9$0$_ +c$1$9$9$0$^ +c$1$9$9$0$@ +c$1$9$9$0$? +c$1$9$9$0$= +c$1$9$9$0$. +c$1$9$9$0$- +c$1$9$9$0$+ +c$1$9$9$0$* +c$1$9$9$0$) +c$1$9$9$0$( +c$1$9$9$0$& +c$1$9$9$0$% +c$1$9$9$0$$ +c$1$9$9$0$# +c$1$9$9$0$! +c$1$9 +c$1$8 +c$1$7 +c$1$6 +c$1$5 +c$1$4 +c$1$3 +c$1$2$3$4$5$6$7$8$9$0 +c$1$2$3$4$5$6$7$8$9 +c$1$2$3$4$5$6$7$8 +c$1$2$3$4$5$6$7 +c$1$2$3$4$5$6 +c$1$2$3$4$5 +c$1$2$3$4 +c$1$2$3 +c$1$2 +c$1$1 +c$1$0 +c$1 +c$0$9 +c$0$8 +c$0$7 +c$0$6 +c$0$5 +c$0$4 +c$0$3 +c$0$2 +c$0$1$2$3$4$5$6$7$8$9 +c$0$1 +c$.$z$w +c$.$z$m +c$.$z$a +c$.$y$u +c$.$y$t +c$.$y$e +c$.$w$s +c$.$w$f +c$.$v$u +c$.$v$n +c$.$v$i +c$.$v$g +c$.$v$e +c$.$v$c +c$.$v$a +c$.$u$z +c$.$u$y +c$.$u$s +c$.$u$m +c$.$u$k +c$.$u$g +c$.$u$a +c$.$t$z +c$.$t$w +c$.$t$v +c$.$t$t +c$.$t$r +c$.$t$p +c$.$t$o +c$.$t$n +c$.$t$m +c$.$t$l +c$.$t$k +c$.$t$j +c$.$t$h +c$.$t$g +c$.$t$f +c$.$t$d +c$.$t$c +c$.$s$z +c$.$s$y +c$.$s$v +c$.$s$u +c$.$s$t +c$.$s$r +c$.$s$o +c$.$s$n +c$.$s$m +c$.$s$l +c$.$s$k +c$.$s$j +c$.$s$i +c$.$s$h +c$.$s$g +c$.$s$e +c$.$s$d +c$.$s$c +c$.$s$b +c$.$s$a +c$.$r$w +c$.$r$u +c$.$r$o +c$.$r$e +c$.$q$a +c$.$p$y +c$.$p$w +c$.$p$t +c$.$p$s +c$.$p$r$o +c$.$p$r +c$.$p$n +c$.$p$m +c$.$p$l +c$.$p$k +c$.$p$h +c$.$p$g +c$.$p$f +c$.$p$e +c$.$p$a +c$.$o$r$g +c$.$o$m +c$.$n$z +c$.$n$u +c$.$n$r +c$.$n$p +c$.$n$o +c$.$n$l +c$.$n$i +c$.$n$g +c$.$n$f +c$.$n$e$t +c$.$n$e +c$.$n$c +c$.$n$a$m$e +c$.$n$a +c$.$m$z +c$.$m$y +c$.$m$x +c$.$m$w +c$.$m$v +c$.$m$u +c$.$m$t +c$.$m$s +c$.$m$r +c$.$m$q +c$.$m$p +c$.$m$o$b$i +c$.$m$o +c$.$m$n +c$.$m$m +c$.$m$l +c$.$m$k +c$.$m$i$l +c$.$m$h +c$.$m$g +c$.$m$d +c$.$m$c +c$.$m$a +c$.$l$y +c$.$l$v +c$.$l$u +c$.$l$t +c$.$l$s +c$.$l$r +c$.$l$k +c$.$l$i +c$.$l$c +c$.$l$b +c$.$l$a +c$.$k$z +c$.$k$y +c$.$k$w +c$.$k$r +c$.$k$n +c$.$k$m +c$.$k$i +c$.$k$h +c$.$k$g +c$.$k$e +c$.$j$p +c$.$j$o$b$s +c$.$j$o +c$.$j$m +c$.$j$e +c$.$i$t +c$.$i$s +c$.$i$r +c$.$i$q +c$.$i$o +c$.$i$n$t +c$.$i$n$f$o +c$.$i$n +c$.$i$m +c$.$i$l +c$.$i$e +c$.$i$d +c$.$h$u +c$.$h$t +c$.$h$r +c$.$h$n +c$.$h$m +c$.$h$k +c$.$g$y +c$.$g$w +c$.$g$u +c$.$g$t +c$.$g$s +c$.$g$r +c$.$g$q +c$.$g$p +c$.$g$o$v +c$.$g$n +c$.$g$m +c$.$g$l +c$.$g$i +c$.$g$h +c$.$g$g +c$.$g$f +c$.$g$e +c$.$g$d +c$.$g$b +c$.$g$a +c$.$f$r +c$.$f$o +c$.$f$m +c$.$f$k +c$.$f$j +c$.$f$i +c$.$e$u +c$.$e$t +c$.$e$s +c$.$e$r +c$.$e$g +c$.$e$e +c$.$e$d$u +c$.$e$c +c$.$d$z +c$.$d$o +c$.$d$m +c$.$d$k +c$.$d$j +c$.$d$e +c$.$c$z +c$.$c$y +c$.$c$x +c$.$c$v +c$.$c$u +c$.$c$r +c$.$c$o$o$p +c$.$c$o$m +c$.$c$o +c$.$c$n +c$.$c$m +c$.$c$l +c$.$c$k +c$.$c$i +c$.$c$h +c$.$c$g +c$.$c$f +c$.$c$d +c$.$c$c +c$.$c$a$t +c$.$c$a +c$.$b$z +c$.$b$y +c$.$b$w +c$.$b$v +c$.$b$t +c$.$b$s +c$.$b$r +c$.$b$o +c$.$b$n +c$.$b$m +c$.$b$j +c$.$b$i$z +c$.$b$i +c$.$b$h +c$.$b$g +c$.$b$f +c$.$b$e +c$.$b$d +c$.$b$b +c$.$b$a +c$.$a$z +c$.$a$x +c$.$a$w +c$.$a$u +c$.$a$t +c$.$a$s +c$.$a$r$p$a +c$.$a$r +c$.$a$q +c$.$a$o +c$.$a$n +c$.$a$m +c$.$a$l +c$.$a$i +c$.$a$g +c$.$a$f +c$.$a$e$r$o +c$.$a$e +c$.$a$d +c$.$a$c +c$&$a$m$p$; +c$! +^{$} +^z +^y^m +^y^l^o^p +^y^k^s +^y^e^k +^y^b +^y^a^w +^y^a^p +^y^a^l^p +^y^a^l +^y^a^d^s^u^e^t +^y^a^d^s^r^u^h^t +^y^a^d^s^e^n^d^e^w +^y^a^d^r^u^t^a^s +^y^a^d^n^u^s +^y^a^d^n^o^m +^y^a^d^i^r^f +^y^a^d +^y +^x^o +^x^e +^x^a^t +^x^a +^x +^w^o^t +^w^o^n^s +^w^o^l +^w^o^c +^w^o^b +^w^e^n +^w^a^s +^w^a^j +^w +^v +^u^e +^u +^t^u^o +^t^u^c +^t^s^o^p +^t^p^e^h +^t^o^p +^t^o^o^f +^t^o^o^b +^t^o^n^k +^t^o^h +^t^n^e^c +^t^h^g^i^n +^t^f^o^s +^t^e^j +^t^c^a^l +^t^a^r +^t^a^o^b +^t^a^h +^t^a^f +^t^a^c +^t^a^b +^t +^s^y^d +^s^s^o^r^c +^s^s^a^p +^s^n^a^r^t +^s^i^m +^s^i^h^t +^s^i^d +^s +^r^u^s +^r^o^t^a^r^t^s^i^n^i^m^d^a +^r^o^o^d +^r^o^f +^r^i^a^h +^r^i^a +^r^i +^r^e^v^o +^r^e^t^n^u^o^c +^r^e^t^n^i +^r^e^t^f^a +^r^e^t^a^w +^r^e^p^y^h +^r^e^p^u^s +^r^e^p +^r^e^d^n^u +^r^a^w +^r^a^p +^r^a^o +^r^a^e^b +^r^a^e +^r +^q +^p^u +^p^m^a^c +^p +^o^t^u^a +^o^t^c^e +^o^s^i +^o^r^y^g +^o^r^p +^o^r^e^a +^o^r^c^i^m +^o^r^c^a^m +^o^r^c^a +^o^p^y^h +^o^o^z +^o^n^o^m +^o^l^l^a +^o^l^i^k +^o^i^b +^o^e^n +^o^d^u^e^s^p +^o^c +^o +^n^w^o^d +^n^u^s +^n^u^g +^n^u +^n^r^o^c +^n^o^o^m +^n^o^n +^n^o^c +^n^o +^n^i^t +^n^i^p +^n^i^m^d^a +^n^i +^n^e^p +^n^e +^n^a^m +^n +^m^u^g +^m^r^o^w +^m^r^a^f +^m^o^c +^m^i +^m^e +^m^a^ ^i +^m^'^i +^m^'^I +^m +^l^o^o^w +^l^l^o^r +^l^l^i^p +^l^l^i +^l^l^a^f +^l^i^o +^l^i^a^t +^l^i^a^s +^l^i^a^r +^l^i^a^j +^l^i +^l^a^o^c +^l^a^m +^l +^k^r^o^w +^k^o^o^b +^k^n^i +^k^l^i^m +^k^c^a^b +^k +^j +^i^x^a^m +^i^t^n^a +^i^t^l^u^m +^i^r^t +^i^p^e +^i^n^m^o +^i^n^i^m +^i^m^e^s +^i^m^e^d +^i^l^e^h +^i^b +^i +^h^t^r^a^e +^h^t^a^b +^h^s^i^f +^h^s^a^w +^h^s^a +^h^g^i^h +^h^c^r^a +^h +^g^o^l +^g^o^d +^g^n^o^l +^g^n^i^w +^g^n^i^r +^g^n^i^k +^g^i^p +^g^e^l +^g +^f^l^e^s +^f^l^a^h +^f^f^o +^f +^e^y^e +^e^v^a^h^i +^e^t^n^a +^e^s^o^n +^e^r^p +^e^r^o^f +^e^r^i^f +^e^r +^e^n^o^t^s +^e^n^i^l +^e^l^e^t +^e^h^t +^e^e^r^f +^e^e^n^k +^e^d^i^s +^e^d +^e^c^i^v +^e^c^i +^e^c^a^l +^e^c^a^f +^e^b +^e +^d^u^m +^d^r^o^w^s^s^a^p +^d^r^o^c +^d^r^a^h +^d^o^o^w +^d^o^o^g +^d^n^i^w +^d^n^i^h +^d^n^a^l +^d^n^a^h +^d^n^a^b +^d^l^o^g +^d^i^m +^d^e^r +^d^e^e^s +^d^e^b +^d^d^a +^d^a^e^l +^d^a^e^h +^d^a^e^d +^d^a^b +^d +^c^c^a +^c +^b^u^s +^b^o +^b +^a^r^t^l^u +^a^n^a +^a^i^d +^a^g^e^m +^a^e^t +^a^e^s +^a +^[$] +^Z +^Y +^X +^W +^V +^U +^T +^S +^R +^Q +^P +^O +^N +^M +^L +^K +^J +^I +^H +^G +^F +^E +^D +^C +^B +^A +^@ +^<$> +^9^9^9^1 +^9^8^9^1 +^9^7^9^1 +^9^6^9^1 +^9^5^9^1 +^9^4^9^1 +^9^1^0^2 +^9^0^0^2 +^8^9^9^1 +^8^8^9^1 +^8^7^9^1 +^8^6^9^1 +^8^5^9^1 +^8^4^9^1 +^8^1^0^2 +^8^0^0^2 +^7^9^9^1 +^7^8^9^1 +^7^7^9^1 +^7^6^9^1 +^7^5^9^1 +^7^4^9^1 +^7^1^0^2 +^7^0^0^2 +^6^9^9^1 +^6^8^9^1 +^6^7^9^1 +^6^6^9^1 +^6^5^9^1 +^6^4^9^1 +^6^1^0^2 +^6^0^0^2 +^5^9^9^1 +^5^8^9^1 +^5^7^9^1 +^5^6^9^1 +^5^5^9^1 +^5^4^9^1 +^5^1^0^2 +^5^0^0^2 +^4^9^9^1 +^4^8^9^1 +^4^7^9^1 +^4^6^9^1 +^4^5^9^1 +^4^4^9^1 +^4^1^0^2 +^4^0^0^2 +^3^9^9^1 +^3^8^9^1 +^3^7^9^1 +^3^6^9^1 +^3^5^9^1 +^3^4^9^1 +^3^2^1 +^3^1^0^2 +^3^0^0^2 +^2^9^9^1 +^2^8^9^1 +^2^7^9^1 +^2^6^9^1 +^2^5^9^1 +^2^4^9^1 +^2^1^0^2 +^2^0^0^2 +^1^9^9^1 +^1^8^9^1 +^1^7^9^1 +^1^6^9^1 +^1^5^9^1 +^1^4^9^1 +^1^2^3 +^1^1^0^2 +^1^0^0^2 +^1^! +^1 +^0^9^9^1 +^0^8^9^1 +^0^7^9^1 +^0^6^9^1 +^0^5^9^1 +^0^4^9^1 +^0^1^0^2 +^0^0^0^2 +^. +^-^x^e +^-^t^n^a +^-^s^i^m +^-^r^e^v^o +^-^r^e^p^y^h +^-^n^o^n +^-^i^m^e^s +^-$- +^- +^* +^($) +^# +^ ^y^m +^ ^u^o^y +^ ^u +^ ^t^o^n^ ^m^a^ ^i +^ ^t^n^o^d^ ^i +^ ^t^'^n^o^d^ ^i +^ ^s^i^ ^t^i +^ ^s^i^ ^s^i^h^t +^ ^s^i^ ^e^h^s +^ ^s^i^ ^e^h +^ ^r^ ^y^e^h^t +^ ^r^ ^u^o^y +^ ^r^ ^e^w +^ ^p^o^t +^ ^m^a^ ^i +^ ^m^'^i +^ ^m^'^I +^ ^l^l^i^m +^ ^i +^ ^e^v^a^h^ ^i +^ ^e^r^a^ ^y^e^h^t +^ ^e^r^a^ ^u^o^y +^ ^e^r^a^ ^e^w +^ ^e^h^t +^ ^d^n^a^s +^ ^a^ ^m^i +^ ^a +^ ^I +]$s +]$i$n$g +]$e$s +]$e$d +]$d +[^z +[^y +[^x +[^w +[^v +[^u +[^t +[^s +[^r +[^q +[^p +[^o +[^n +[^m +[^l +[^k +[^j +[^i +[^h +[^g +[^f +[^d +[^c +[^b +[^a +[^Z +[^Y +[^X +[^W +[^V +[^U +[^T +[^S +[^R +[^Q +[^P +[^O +[^N +[^M +[^L +[^K +[^J +[^I +[^H +[^G +[^F +[^E +[^D +[^C +[^B +[^A +T1 +C$~$!$@$#$$ +C$z +C$y +C$x +C$w$o$o$d +C$w$i$s$e +C$w$a$y +C$w +C$v +C$u$p +C$u$m +C$u +C$t$y +C$t$i$o$n +C$t$h$e +C$t +C$s$o$m$e +C$s$i$s +C$s$i$o$n +C$s$i$d$e +C$s$h$i$p +C$s$h +C$s$e$x$y +C$s$e$s +C$s +C$r$o$o$m +C$r +C$q +C$p$a$s$s +C$p +C$o$v$e$r +C$o$u$t +C$o$u$s +C$o$u$r +C$o$s$e +C$o$r$y +C$o$r +C$o$n +C$o$m$y +C$o$l$o$g$y +C$o$l +C$o$i$d +C$o$e$s +C$o +C$n$e$s$s +C$n +C$m$e$n$t +C$m$e$n +C$m$a$n +C$m +C$l$y +C$l$o$o$p +C$l$o$n$g +C$l$i$n$g +C$l$i$n$e +C$l$i$k$e +C$l$e$t +C$l$e$s$s +C$l$a$n$d +C$l +C$k$i$n +C$k +C$j +C$i$z$e +C$i$x +C$i$v$e +C$i$t$y +C$i$t$i$v$e +C$i$t$i$o$n +C$i$t$i$c +C$i$t$e +C$i$s$t +C$i$s$m +C$i$s$h +C$i$s$e +C$i$o$u$s +C$i$o$n +C$i$n$g +C$i$n$e +C$i$l$y +C$i$l$i$a +C$i$l$e +C$i$f$y +C$i$e$s$t +C$i$e$s +C$i$e$r +C$i$d$e +C$i$c$l$e +C$i$c$e$s +C$i$c +C$i$b$l$e +C$i$a$n +C$i$a$l +C$i +C$h$o$o$d +C$h$e$a$d +C$h +C$g$e$n$y +C$g +C$f$u$l$l$y +C$f$u$l +C$f$o$r$m +C$f +C$e$t$t$e +C$e$t +C$e$s$t +C$e$s$s +C$e$s +C$e$r$y +C$e$r +C$e$o$u$s +C$e$n$t +C$e$n$c$e +C$e$n +C$e$l$l$a +C$e$e +C$e$d +C$e$a$u +C$e +C$d$o$m$e +C$d$a$y +C$d +C$c$y +C$c +C$b$o$y +C$b$o$o$k +C$b$e$l$l +C$b$a$l$l +C$b$a$c$k +C$b$a$b$y +C$b +C$a$u$x +C$a$t$i$v$e +C$a$t$i$o$n +C$a$s$e +C$a$r$y +C$a$n$t +C$a$n$e +C$a$n$d +C$a$n$c$e +C$a$n$a +C$a$n +C$a$m +C$a$l$l$y +C$a$l +C$a$g$e +C$a$c$l$e +C$a$b$l$e +C$a +C$S +'A$! +'9$! +'8$* +'8$# +'8$! +'7$~ +'7$} +'7$| +'7${ +'7$_ +'7$^ +'7$] +'7$\ +'7$[ +'7$? +'7$> +'7$= +'7$< +'7$; +'7$: +'7$9 +'7$8 +'7$7 +'7$6 +'7$5 +'7$4 +'7$3 +'7$2 +'7$1$2$3$4 +'7$1$2$3 +'7$1 +'7$0 +'7$- +'7$+ +'7$* +'7$) +'7$& +'7$% +'7$$ +'7$# +'7$!$!$!$!$!$!$!$!$!$!$!$! +'7$!$!$!$!$!$!$!$!$!$! +'7$!$!$!$!$!$!$!$!$! +'7$!$!$!$!$!$!$!$! +'7$!$!$!$!$!$!$! +'7$!$!$!$!$!$! +'7$!$!$!$! +'7$!$!$! +'7$!$! +'7$! +'7 +'6$~ +'6$} +'6$| +'6${ +'6$i$2$3$4 +'6$_ +'6$^ +'6$] +'6$\ +'6$[ +'6$? +'6$> +'6$= +'6$< +'6$; +'6$: +'6$9 +'6$8 +'6$7 +'6$6 +'6$5 +'6$4 +'6$3 +'6$2 +'6$1$2$3 +'6$1 +'6$0 +'6$. +'6$- +'6$+ +'6$* +'6$( +'6$& +'6$% +'6$$ +'6$# +'6$!$!$!$!$!$!$!$!$!$!$!$! +'6$!$!$!$!$!$!$!$!$!$! +'6$!$!$!$!$!$!$!$!$! +'6$!$!$!$!$!$!$!$! +'6$!$!$!$!$!$!$! +'6$!$!$!$!$!$! +'6$!$!$!$! +'6$!$!$! +'6$!$! +'6$! +'6 +'5$. +'5 +'4$. +'4 +'3$. +'3 +'2$. +$~$!$@$#$$ +$y +$w$o$o$d +$w$i$s$e +$w$a$y +$u$p +$u$m +$t$y +$t$i$o$n +$t$h$e +$t$e$s$t +$s$o$m$e +$s$m$i$t$h +$s$i$s +$s$i$o$n +$s$i$d$e +$s$h$i$p +$s$e$s +$s$e$r$v$e$r +$s$a$l$a$s$a$n$a +$r$o$o$m +$q$w$e$r$t$y +$p$h$p$b$b +$p$a$s$s$w$o$r$d +$p$a$s$s +$o$v$e$r +$o$u$t +$o$u$s +$o$u$r +$o$s$e +$o$r$y +$o$r +$o$m$y +$o$l$o$g$y +$o$l +$o$i$d +$o$e$s +$n$e$s$s +$m$i$k$e +$m$i$c$h$a$e$l +$m$e$n$t +$m$e$n +$m$e +$m$a$n +$l$y +$l$o$n$g +$l$i$n$g +$l$i$n$e +$l$i$k$e +$l$e$t +$l$e$s$s +$l$e$e +$l$a$n$d +$k$i$n +$k$h$a$n +$j$o$n$e$s +$j$o$h$n$s$o$n +$j$o$h$n +$i$z$e +$i$x +$i$v$e +$i$t$y +$i$t$i$v$e +$i$t$i$o$n +$i$t$i$c +$i$t$e +$i$s$t +$i$s$m +$i$s$h +$i$s$e +$i$o$u$s +$i$o$n +$i$n$g +$i$n$e +$i$l$y +$i$l$i$a +$i$l$e +$i$f$y +$i$e$s$t +$i$e$s +$i$e$r +$i$d$e +$i$c$l$e +$i$c$e$s +$i$c +$i$b$l$e +$i$a$l +$i +$h$o$o$d +$h$e$a$d +$h$a$c$k$e$r +$g$e$n$y +$f$u$l$l$y +$f$u$l +$f$o$r$m +$f$a$r$m$v$i$l$l$e +$e$t$t$e +$e$t +$e$s$t +$e$s$s +$e$r$y +$e$r +$e$o$u$s +$e$n$t +$e$n$c$e +$e$n +$e$l$l$a +$e$e +$e$d +$e$a$u +$d$o$m$e +$d$a$y +$d$a$v$i$d +$c$y +$b$r$o$w$n +$b$o$y +$b$o$o$k +$b$e$l$l +$b$a$l$l +$b$a$c$k +$a$u$x +$a$t$i$v$e +$a$t$i$o$n +$a$s$e +$a$r$y +$a$n$t +$a$n$e +$a$n$d +$a$n$c$e +$a$n$a +$a$l$l$y +$a$l +$a$g$e +$a$c$l$e +$a$b$l$e +$@$z$o$h$o$.$c$o$m +$@$y$m$a$i$l$.$c$o$m +$@$y$a$h$o$o$.$c$o$m +$@$y$a$h$o$o$.$c$o$.$u$k +$@$y$a$h$o$o$.$c$o$.$i$n +$@$y$a$h$o$o$.$c$a +$@$w$p$.$p$l +$@$v$e$r$i$z$o$n$.$n$e$t +$@$m$s$n$.$c$o$m +$@$m$a$i$l$.$r$u +$@$m$a$i$l$.$c$o$m +$@$l$i$v$e$.$c$o$m +$@$l$i$v$e$.$c$o$.$u$k +$@$i$n$b$o$x$.$r$u +$@$h$o$t$m$a$i$l$.$c$o$m +$@$h$o$t$m$a$i$l$.$c$o$.$u$k +$@$g$m$x$.$u$s +$@$g$m$x$.$c$o$m +$@$g$m$a$i$l$.$c$o$m +$@$g$a$w$a$b$.$c$o$m +$@$f$a$s$t$m$a$i$l$.$f$m +$@$e$a$r$t$h$l$i$n$k$.$n$e$t +$@$c$o$x$.$n$e$t +$@$c$o$m$c$a$s$t$.$n$e$t +$@$b$i$g$s$t$r$i$n$g$.$c$o$m +$@$b$e$l$l$s$o$u$t$h$.$n$e$t +$@$a$o$l$.$c$o$m +$@$a$m$e$l$e$.$c$o$m +$@$1$2$3 +$@$1$2 +$9$9$9$9$9$9$9$9$9$9$9$9 +$9$9$9$9$9$9$9$9$9$9$9 +$9$9$9$9$9$9$9$9$9$9 +$9$9$9$9$9$9$9$9$9 +$9$9$9$9$9$9$9$9 +$9$9$9$9$9$9$9 +$9$9$9$9$9$9 +$9$9$9$9 +$9$9$9 +$9$9 +$9$8 +$9$7 +$9$6 +$9$5 +$9$4 +$9$3 +$9$2 +$9$1 +$9$0 +$9 +$8$9 +$8$8$8$8$8$8$8$8$8$8$8$8 +$8$8$8$8$8$8$8$8$8$8$8 +$8$8$8$8$8$8$8$8$8$8 +$8$8$8$8$8$8$8$8$8 +$8$8$8$8$8$8$8$8 +$8$8$8$8$8$8$8 +$8$8$8$8$8$8 +$8$8$8$8 +$8$8$8 +$8$8 +$8$7 +$8$6 +$8$5 +$8$4 +$8$3 +$8$2 +$8$1 +$8$0 +$8 +$7$9 +$7$8 +$7$7$7$7$7$7$7$7$7$7$7$7 +$7$7$7$7$7$7$7$7$7$7$7 +$7$7$7$7$7$7$7$7$7$7 +$7$7$7$7$7$7$7$7$7 +$7$7$7$7$7$7$7$7 +$7$7$7$7$7$7$7 +$7$7$7$7$7$7 +$7$7$7$7 +$7$7$7 +$7$7 +$7$6 +$7$5 +$7$4 +$7$3 +$7$2 +$7$1 +$7$0 +$7 +$6$9 +$6$8 +$6$7 +$6$6$6$6$6$6$6$6$6$6$6$6 +$6$6$6$6$6$6$6$6$6$6$6 +$6$6$6$6$6$6$6$6$6$6 +$6$6$6$6$6$6$6$6$6 +$6$6$6$6$6$6$6$6 +$6$6$6$6$6$6$6 +$6$6$6$6$6$6 +$6$6$6$6 +$6$6$6 +$6$6 +$6$5 +$6$4 +$6$3 +$6$2 +$6$1 +$6$0 +$6 +$5$9 +$5$8 +$5$7 +$5$6 +$5$5$5$5$5$5$5$5$5$5$5$5 +$5$5$5$5$5$5$5$5$5$5$5 +$5$5$5$5$5$5$5$5$5$5 +$5$5$5$5$5$5$5$5$5 +$5$5$5$5$5$5$5$5 +$5$5$5$5$5$5$5 +$5$5$5$5$5$5 +$5$5$5$5 +$5$5$5 +$5$5 +$5$4 +$5$3 +$5$2 +$5$1 +$5$0 +$5 +$4$9 +$4$8 +$4$7 +$4$6 +$4$5 +$4$4$4$4$4$4$4$4$4$4$4$4 +$4$4$4$4$4$4$4$4$4$4$4 +$4$4$4$4$4$4$4$4$4$4 +$4$4$4$4$4$4$4$4$4 +$4$4$4$4$4$4$4$4 +$4$4$4$4$4$4$4 +$4$4$4$4$4$4 +$4$4$4$4 +$4$4$4 +$4$4 +$4$3 +$4$2 +$4$1 +$4$0 +$4 +$3$e$d$c +$3$9 +$3$8 +$3$7 +$3$6 +$3$5 +$3$4 +$3$3$3$3$3$3$3$3$3$3$3$3 +$3$3$3$3$3$3$3$3$3$3$3 +$3$3$3$3$3$3$3$3$3$3 +$3$3$3$3$3$3$3$3$3 +$3$3$3$3$3$3$3$3 +$3$3$3$3$3$3$3 +$3$3$3$3$3$3 +$3$3$3$3 +$3$3$3 +$3$3 +$3$2 +$3$1 +$3$0 +$3 +$2$w$s$x +$2$9 +$2$8 +$2$7 +$2$6 +$2$5 +$2$4 +$2$3 +$2$2$2$2$2$2$2$2$2$2$2$2 +$2$2$2$2$2$2$2$2$2$2$2 +$2$2$2$2$2$2$2$2$2$2 +$2$2$2$2$2$2$2$2$2 +$2$2$2$2$2$2$2$2 +$2$2$2$2$2$2$2 +$2$2$2$2$2$2 +$2$2$2$2 +$2$2$2 +$2$2 +$2$1 +$2$0$1$3$~ +$2$0$1$3$| +$2$0$1$3$` +$2$0$1$3$_ +$2$0$1$3$^ +$2$0$1$3$@ +$2$0$1$3$? +$2$0$1$3$= +$2$0$1$3$. +$2$0$1$3$- +$2$0$1$3$+ +$2$0$1$3$* +$2$0$1$3$) +$2$0$1$3$( +$2$0$1$3$& +$2$0$1$3$% +$2$0$1$3$$ +$2$0$1$3$# +$2$0$1$3$! +$2$0$1$2$~ +$2$0$1$2$| +$2$0$1$2$` +$2$0$1$2$_ +$2$0$1$2$^ +$2$0$1$2$@ +$2$0$1$2$? +$2$0$1$2$= +$2$0$1$2$. +$2$0$1$2$- +$2$0$1$2$+ +$2$0$1$2$* +$2$0$1$2$) +$2$0$1$2$( +$2$0$1$2$& +$2$0$1$2$% +$2$0$1$2$$ +$2$0$1$2$# +$2$0$1$2$! +$2$0$1$1$~ +$2$0$1$1$| +$2$0$1$1$` +$2$0$1$1$_ +$2$0$1$1$^ +$2$0$1$1$@ +$2$0$1$1$? +$2$0$1$1$= +$2$0$1$1$. +$2$0$1$1$- +$2$0$1$1$+ +$2$0$1$1$* +$2$0$1$1$) +$2$0$1$1$( +$2$0$1$1$& +$2$0$1$1$% +$2$0$1$1$$ +$2$0$1$1$# +$2$0$1$1$! +$2$0$1$0$~ +$2$0$1$0$| +$2$0$1$0$` +$2$0$1$0$_ +$2$0$1$0$^ +$2$0$1$0$@ +$2$0$1$0$? +$2$0$1$0$= +$2$0$1$0$. +$2$0$1$0$- +$2$0$1$0$+ +$2$0$1$0$* +$2$0$1$0$) +$2$0$1$0$( +$2$0$1$0$& +$2$0$1$0$% +$2$0$1$0$$ +$2$0$1$0$# +$2$0$1$0$! +$2$0 +$2 +$1$q$a$z$2$w$s$x$3$e$d$c +$1$q$a$z$2$w$s$x +$1$q$a$z +$1$9$9$2$~ +$1$9$9$2$| +$1$9$9$2$` +$1$9$9$2$_ +$1$9$9$2$^ +$1$9$9$2$@ +$1$9$9$2$? +$1$9$9$2$= +$1$9$9$2$. +$1$9$9$2$- +$1$9$9$2$+ +$1$9$9$2$* +$1$9$9$2$) +$1$9$9$2$( +$1$9$9$2$& +$1$9$9$2$% +$1$9$9$2$$ +$1$9$9$2$# +$1$9$9$2$! +$1$9$9$1$~ +$1$9$9$1$| +$1$9$9$1$` +$1$9$9$1$_ +$1$9$9$1$^ +$1$9$9$1$@ +$1$9$9$1$? +$1$9$9$1$= +$1$9$9$1$. +$1$9$9$1$- +$1$9$9$1$+ +$1$9$9$1$* +$1$9$9$1$) +$1$9$9$1$( +$1$9$9$1$& +$1$9$9$1$% +$1$9$9$1$$ +$1$9$9$1$# +$1$9$9$1$! +$1$9$9$0$~ +$1$9$9$0$| +$1$9$9$0$` +$1$9$9$0$_ +$1$9$9$0$^ +$1$9$9$0$@ +$1$9$9$0$? +$1$9$9$0$= +$1$9$9$0$. +$1$9$9$0$- +$1$9$9$0$+ +$1$9$9$0$* +$1$9$9$0$) +$1$9$9$0$( +$1$9$9$0$& +$1$9$9$0$% +$1$9$9$0$$ +$1$9$9$0$# +$1$9$9$0$! +$1$9 +$1$8 +$1$7 +$1$6 +$1$5 +$1$4 +$1$3 +$1$2$3$4$5$6$7$8$9$0 +$1$2$3$4$5$6$7$8$9 +$1$2$3$4$5$6$7$8 +$1$2$3$4$5$6$7 +$1$2$3$4$5$6 +$1$2$3$4$5 +$1$2$3$4 +$1$2$3 +$1$2 +$1$1$1$1$1$1$1$1$1$1$1$1 +$1$1$1$1$1$1$1$1$1$1$1 +$1$1$1$1$1$1$1$1$1$1 +$1$1$1$1$1$1$1$1$1 +$1$1$1$1$1$1$1$1 +$1$1$1$1$1$1$1 +$1$1$1$1$1$1 +$1$1$1$1 +$1$1$1 +$1$1 +$1$0 +$1 +$0$9 +$0$8 +$0$7 +$0$6 +$0$5 +$0$4 +$0$3 +$0$2 +$0$1$2$3$4$5$6$7$8$9 +$0$1 +$.$z$w +$.$z$m +$.$z$a +$.$y$u +$.$y$t +$.$y$e +$.$w$s +$.$w$f +$.$v$u +$.$v$n +$.$v$i +$.$v$g +$.$v$e +$.$v$c +$.$v$a +$.$u$z +$.$u$y +$.$u$s +$.$u$m +$.$u$k +$.$u$g +$.$u$a +$.$t$z +$.$t$w +$.$t$v +$.$t$t +$.$t$r$a$v$e$l +$.$t$r +$.$t$p +$.$t$o +$.$t$n +$.$t$m +$.$t$l +$.$t$k +$.$t$j +$.$t$h +$.$t$g +$.$t$f +$.$t$d +$.$t$c +$.$s$z +$.$s$y +$.$s$v +$.$s$u +$.$s$t +$.$s$r +$.$s$o +$.$s$n +$.$s$m +$.$s$l +$.$s$k +$.$s$j +$.$s$i +$.$s$h +$.$s$g +$.$s$e +$.$s$d +$.$s$c +$.$s$b +$.$s$a +$.$r$w +$.$r$u +$.$r$o$o$t +$.$r$o +$.$r$e +$.$q$a +$.$p$y +$.$p$w +$.$p$t +$.$p$s +$.$p$r$o +$.$p$r +$.$p$n +$.$p$m +$.$p$l +$.$p$k +$.$p$h +$.$p$g +$.$p$f +$.$p$e +$.$p$a +$.$o$r$g +$.$o$m +$.$n$z +$.$n$u +$.$n$r +$.$n$p +$.$n$o +$.$n$l +$.$n$i +$.$n$g +$.$n$f +$.$n$e$t +$.$n$e +$.$n$c +$.$n$a$m$e +$.$n$a +$.$m$z +$.$m$y +$.$m$x +$.$m$w +$.$m$v +$.$m$u$s$e$u$m +$.$m$u +$.$m$t +$.$m$s +$.$m$r +$.$m$q +$.$m$p +$.$m$o$b$i +$.$m$o +$.$m$n +$.$m$m +$.$m$l +$.$m$k +$.$m$i$l +$.$m$h +$.$m$g +$.$m$d +$.$m$c +$.$m$a +$.$l$y +$.$l$v +$.$l$u +$.$l$t +$.$l$s +$.$l$r +$.$l$k +$.$l$i +$.$l$c +$.$l$b +$.$l$a +$.$k$z +$.$k$y +$.$k$w +$.$k$r +$.$k$n +$.$k$m +$.$k$i +$.$k$h +$.$k$g +$.$k$e +$.$j$p +$.$j$o$b$s +$.$j$o +$.$j$m +$.$j$e +$.$i$t +$.$i$s +$.$i$r +$.$i$q +$.$i$o +$.$i$n$t +$.$i$n$f$o +$.$i$n +$.$i$m +$.$i$l +$.$i$e +$.$i$d +$.$h$u +$.$h$t +$.$h$r +$.$h$n +$.$h$m +$.$h$k +$.$g$y +$.$g$w +$.$g$u +$.$g$t +$.$g$s +$.$g$r +$.$g$q +$.$g$p +$.$g$o$v +$.$g$n +$.$g$m +$.$g$l +$.$g$i +$.$g$h +$.$g$g +$.$g$f +$.$g$e +$.$g$d +$.$g$b +$.$g$a +$.$f$r +$.$f$o +$.$f$m +$.$f$k +$.$f$j +$.$f$i +$.$e$u +$.$e$t +$.$e$s +$.$e$r +$.$e$g +$.$e$e +$.$e$d$u +$.$e$c +$.$d$z +$.$d$o +$.$d$m +$.$d$k +$.$d$j +$.$d$e +$.$c$z +$.$c$y +$.$c$x +$.$c$v +$.$c$u +$.$c$r +$.$c$o$o$p +$.$c$o$m +$.$c$o +$.$c$n +$.$c$m +$.$c$l +$.$c$k +$.$c$i +$.$c$h +$.$c$g +$.$c$f +$.$c$d +$.$c$c +$.$c$a$t +$.$c$a +$.$b$z +$.$b$y +$.$b$w +$.$b$v +$.$b$t +$.$b$s +$.$b$r +$.$b$o +$.$b$n +$.$b$m +$.$b$j +$.$b$i$z +$.$b$i +$.$b$h +$.$b$g +$.$b$f +$.$b$e +$.$b$d +$.$b$b +$.$b$a +$.$a$z +$.$a$x +$.$a$w +$.$a$u +$.$a$t +$.$a$s +$.$a$r$p$a +$.$a$r +$.$a$q +$.$a$o +$.$a$n +$.$a$m +$.$a$l +$.$a$i +$.$a$g +$.$a$f +$.$a$e$r$o +$.$a$e +$.$a$d +$.$a$c +$. +$- +$&$a$m$p$; +$# +$!$@$# +$!$!$!$!$!$!$!$!$!$!$! +$!$!$!$!$!$!$!$!$!$! +$!$!$!$!$!$!$!$!$! +$!$!$!$!$!$!$!$! +$!$!$!$!$!$!$! +$!$!$!$!$!$! +$!$!$!$!$! +$!$!$!$! +$!$!$! +$!$! +$! +$ \ No newline at end of file diff --git a/rules/T0XlCv1.rule b/rules/T0XlCv1.rule new file mode 100644 index 0000000000..87df4103e3 --- /dev/null +++ b/rules/T0XlCv1.rule @@ -0,0 +1,12003 @@ +# Created by: T0XlC +# 12000 random rules that produced good results. +# In memory of d3ad0ne +}}}}}}}}*15'4 +}}}}}}Y4'4d +}}}}}'5'4p1 +}}}}}'5 +}}}}'4 +}}}} +}}}: +}}} +}}D1{ +}} +}x32 +}x14 +}x13 +}x04 +}x02p1 +}x02 +}]]{ +}[[ +}[$e +}[$a +}[ +}D1'4 +} } }{} +} +{{{{ +{{{ +{{ +{D3} +{D2} +{D1}] +{ [ [ } +{ +z5x15^7{ +z3x13$6 +z3x13$4 +z2 +z1 +y4Z4'8 +y4'8l +y3x25+0 +y3'6 +y2x12 +x52 +x42 +x41l$m$a$n +x41 +x32] +x32+2 +x32 +x31] +x31[ +x31Y3i7&i5vL9'4 +x31 +x23p1 +x23d +x23 +x21: +x21 +x14p2 +x14dp2'6 +x14 +x13d +x13 +x12 +x04d +x04 +x03d +x03 +x02{ +x02d +x02+2: +x02 +u$~$!$@$#$$ +u$z +u$y +u$x +u$w +u$v +u$u +u$t$h$e +u$t +u$s$h +u$s$e$x$y +u$s +u$r +u$q +u$p$a$s$s +u$p +u$o$n +u$o +u$n +u$m +u$l$o$o$p +u$l$e$s$s +u$l +u$k +u$j +u$i$s$m +u$i$s$h +u$i$o$n +u$i$n$g +u$i$a$n +u$i +u$h +u$g +u$f +u$e$s +u$e$n +u$e +u$d$a$y +u$d +u$c +u$b$a$b$y +u$b +u$a$n +u$a$m +u$a$l +u$a +u$S +u +tt +t +ss5sa@se3si1so0 +ss5sa@sa4se3sl7si1si|so0 +ss5sa4sl7si|so0 +ss5 +so0se3 +so0 +sl7 +si| +si1se3 +si1 +si1 +se3 +sck +sae +sa@sc +i9= +i9; +i9: +i99 iA9 iB9 +i99 iA9 iB8 +i99 iA9 iB7 +i99 iA9 iB6 +i99 iA9 iB5 +i99 iA9 iB4 +i99 iA9 iB3 +i99 iA9 iB2 +i99 iA9 iB1 +i99 iA9 iB0 +i99 iA9 +i99 iA8 iB9 +i99 iA8 iB8 +i99 iA8 iB7 +i99 iA8 iB5 +i99 iA8 iB1 +i99 iA8 iB0 +i99 iA8 +i99 iA7 +i99 iA6 iB3 +i99 iA6 +i99 iA5 iB1 +i99 iA5 +i99 iA4 +i99 iA3 +i99 iA2 +i99 iA1 iB2 +i99 iA1 iB1 +i99 iA1 iB0 +i99 iA1 +i99 iA0 +i99 +i98 iA9 iB0 +i98 iA9 +i98 iA8 iB8 +i98 iA8 +i98 iA7 +i98 iA6 +i98 iA5 iB2 +i98 iA5 +i98 iA4 +i98 iA3 +i98 iA2 +i98 iA1 +i98 iA0 +i98 +i97 iA9 +i97 iA8 iB9 +i97 iA8 +i97 iA7 iB7 +i97 iA7 +i97 iA6 +i97 iA5 iB3 +i97 iA5 +i97 iA4 +i97 iA3 +i97 iA2 +i97 iA1 +i97 iA0 +i97 +i96 iA9 +i96 iA8 +i96 iA7 iB8 +i96 iA7 +i96 iA6 iB6 +i96 iA6 +i96 iA5 iB4 +i96 iA5 +i96 iA4 +i96 iA3 +i96 iA2 +i96 iA1 +i96 iA0 +i96 +i95 iA9 +i95 iA8 +i95 iA7 +i95 iA6 iB7 +i95 iA6 +i95 iA5 iB5 +i95 iA5 +i95 iA4 +i95 iA3 +i95 iA2 +i95 iA1 +i95 iA0 +i95 +i94 iA9 +i94 iA8 +i94 iA7 +i94 iA6 +i94 iA5 iB6 +i94 iA5 +i94 iA4 iB4 +i94 iA4 +i94 iA3 iB2 +i94 iA3 +i94 iA2 iB0 +i94 iA2 +i94 iA1 iB2 +i94 iA1 +i94 iA0 +i94 +i93 iA9 +i93 iA8 +i93 iA7 +i93 iA6 iB9 +i93 iA6 +i93 iA5 +i93 iA4 iB5 +i93 iA4 +i93 iA3 iB3 +i93 iA3 +i93 iA2 iB1 +i93 iA2 +i93 iA1 iB3 +i93 iA1 iB2 +i93 iA1 +i93 iA0 iB0 +i93 iA0 +i93 +i92 iA9 +i92 iA8 +i92 iA7 +i92 iA6 +i92 iA5 +i92 iA4 +i92 iA3 iB4 +i92 iA3 iB3 +i92 iA3 iB2 +i92 iA3 iB1 +i92 iA3 iB0 +i92 iA3 +i92 iA2 iB2 +i92 iA2 iB1 +i92 iA2 +i92 iA1 iB4 +i92 iA1 iB3 +i92 iA1 iB2 +i92 iA1 iB1 +i92 iA1 iB0 +i92 iA1 +i92 iA0 iB1 +i92 iA0 iB0 +i92 iA0 +i92 +i91 iA9 iB9 +i91 iA9 iB8 +i91 iA9 iB7 +i91 iA9 +i91 iA8 +i91 iA7 +i91 iA6 +i91 iA5 iB9 +i91 iA5 +i91 iA4 iB7 +i91 iA4 iB3 +i91 iA4 +i91 iA3 iB2 +i91 iA3 +i91 iA2 iB3 +i91 iA2 iB2 +i91 iA2 iB1 +i91 iA2 iB0 +i91 iA2 +i91 iA1 iB3 +i91 iA1 iB2 +i91 iA1 iB1 +i91 iA1 +i91 iA0 iB2 +i91 iA0 iB1 +i91 iA0 iB0 +i91 iA0 +i91 iA! +i91 +i90 iA9 +i90 iA8 +i90 iA7 +i90 iA6 +i90 iA5 +i90 iA4 +i90 iA3 +i90 iA2 iB0 +i90 iA2 +i90 iA1 iB2 +i90 iA1 iB1 +i90 iA1 iB0 +i90 iA1 +i90 iA0 iB9 +i90 iA0 iB8 +i90 iA0 iB7 +i90 iA0 iB3 +i90 iA0 iB2 +i90 iA0 iB1 +i90 iA0 iB0 +i90 iA0 +i90 +i9/ +i9. +i9- +i9, +i9+ +i9* +i9) +i9( +i9& +i9% +i9$ +i9# +i9! +i9 +i8~ +i8z i91 iA2 +i8z i91 +i8z +i8y i99 +i8y i92 +i8y i91 iA3 +i8y i91 iA2 +i8y i91 iA1 +i8y i91 iA0 +i8y i91 +i8y +i8x i91 +i8x +i8w i9n iA1 +i8w i9e iAr +i8w i91 +i8w +i8v i9e iAr +i8v i9e iA1 +i8v i9e +i8v +i8u i9t +i8u i9s iA1 +i8u i9s +i8u i9r +i8u i9n +i8u i9l +i8u i91 iA2 +i8u i91 +i8u +i8t i9y iA1 +i8t i9y +i8t i9t +i8t i9s iA1 +i8t i9s +i8t i9o iA1 +i8t i9o +i8t i9i iAo +i8t i9i +i8t i9h iA1 +i8t i9h +i8t i9e iAr +i8t i9e iA1 +i8t i9e +i8t i9a iAs +i8t i9a iAr +i8t i9a iA1 +i8t i9a +i8t i93 +i8t i92 +i8t i91 iA2 +i8t i91 iA1 +i8t i91 iA0 +i8t i91 +i8t +i8s i9t iAe +i8s i9t iA1 +i8s i9t +i8s i9s iA1 +i8s i9s +i8s i9o iAn +i8s i9o +i8s i9i +i8s i9h iA1 +i8s i9h +i8s i9e iA1 +i8s i9e +i8s i9a iA1 +i8s i9a +i8s i99 +i8s i97 +i8s i96 +i8s i93 +i8s i92 +i8s i91 iA3 +i8s i91 iA2 +i8s i91 iA1 +i8s i91 iA0 +i8s i91 +i8s i90 +i8s +i8r i9y iA1 +i8r i9y +i8r i9u +i8r i9t iA1 +i8r i9t +i8r i9s iA1 +i8r i9s +i8r i9o iA1 +i8r i9o +i8r i9l iA1 +i8r i9l +i8r i9k iA1 +i8r i9k +i8r i9i iAo +i8r i9i +i8r i9e iA1 +i8r i9e +i8r i9d iA1 +i8r i9d +i8r i9a iA1 +i8r i9a +i8r i99 +i8r i97 +i8r i96 +i8r i95 +i8r i93 +i8r i92 +i8r i91 iA9 +i8r i91 iA3 +i8r i91 iA2 +i8r i91 iA1 +i8r i91 iA0 +i8r i91 +i8r i90 iA1 +i8r i90 +i8r +i8q +i8p i9e iAr +i8p i9e +i8p i91 iA2 +i8p i91 +i8p +i8o i9y iA1 +i8o i9y +i8o i9w iA1 +i8o i9w +i8o i9v iAe +i8o i9v +i8o i9u +i8o i9t +i8o i9s iA1 +i8o i9s +i8o i9r iAd +i8o i9r iA1 +i8o i9r +i8o i9p iA1 +i8o i9p +i8o i9o iAl +i8o i9o iAd +i8o i9o +i8o i9n iAe +i8o i9n iA2 +i8o i9n iA1 +i8o i9n +i8o i9m +i8o i9l iA1 +i8o i9l +i8o i9d iA1 +i8o i9d +i8o i9c iAk +i8o i99 +i8o i92 +i8o i91 iA2 +i8o i91 iA1 +i8o i91 iA0 +i8o i91 +i8o i90 +i8o +i8n i9y iA1 +i8n i9y +i8n i9t iA1 +i8n i9t +i8n i9s iA1 +i8n i9s +i8n i9o iA1 +i8n i9o +i8n i9n +i8n i9k +i8n i9i +i8n i9g iAe +i8n i9g iA1 +i8n i9g +i8n i9e iA1 +i8n i9e +i8n i9d iA1 +i8n i9d +i8n i9c iAe +i8n i9c +i8n i9a iA1 +i8n i9a +i8n i99 iA9 +i8n i99 +i8n i98 +i8n i97 +i8n i96 +i8n i95 +i8n i93 +i8n i92 iA0 +i8n i92 +i8n i91 iA9 +i8n i91 iA3 +i8n i91 iA2 +i8n i91 iA1 +i8n i91 iA0 +i8n i91 +i8n i90 +i8n +i8m i9o iA1 +i8m i9o +i8m i9i +i8m i9e iAs +i8m i9e iAr +i8m i9e iA1 +i8m i9e +i8m i9a iAn +i8m i9a iA1 +i8m i9a +i8m i91 iA2 +i8m i91 +i8m +i8l i9y iA1 +i8l i9y +i8l i9s iA1 +i8l i9s +i8l i9o iA1 +i8l i9o +i8l i9l iAe +i8l i9l iA2 +i8l i9l iA1 +i8l i9l +i8l i9i iAf +i8l i9i +i8l i9e iAs +i8l i9e iAr +i8l i9e iA1 +i8l i9e +i8l i9d iA1 +i8l i9d +i8l i9a iA1 +i8l i9a +i8l i99 +i8l i92 +i8l i91 iA9 +i8l i91 iA3 +i8l i91 iA2 +i8l i91 iA1 +i8l i91 iA0 +i8l i91 +i8l i90 +i8l +i8k i9s iA1 +i8k i9s +i8k i9i +i8k i9e iAy +i8k i9e iAr +i8k i9e iA1 +i8k i9e +i8k i9a iA1 +i8k i9a +i8k i92 +i8k i91 iA2 +i8k i91 +i8k +i8j +i8i i9t +i8i i9s iA1 +i8i i9s +i8i i9r iAl +i8i i9r +i8i i9o iAn +i8i i9o iA1 +i8i i9o +i8i i9n iAg +i8i i9n iAe +i8i i9n iA1 +i8i i9n +i8i i9l iAl +i8i i9l +i8i i9f iAe +i8i i9f +i8i i9e iAs +i8i i9e iA1 +i8i i9e +i8i i9d iA1 +i8i i9d +i8i i9c iA1 +i8i i9c +i8i i9a iA1 +i8i i9a +i8i i91 iA2 +i8i i91 +i8i +i8h i9t iA1 +i8h i9t +i8h i9o iA1 +i8h i9o +i8h i9i +i8h i9e iAr +i8h i9e +i8h i9a iA1 +i8h i9a +i8h i91 iA2 +i8h i91 +i8h +i8g i9o iAn +i8g i9o +i8g i9h iAt +i8g i9h +i8g i9e iAr +i8g i9e iAl +i8g i9e +i8g i9a +i8g i91 iA2 +i8g i91 +i8g +i8f i9e +i8f i91 +i8f +i8e i9y iA1 +i8e i9y +i8e i9v iAe +i8e i9v +i8e i9t iA1 +i8e i9t +i8e i9s iAt +i8e i9s iAs +i8e i9s iA2 +i8e i9s iA1 +i8e i9s +i8e i9r iAs +i8e i9r iA9 +i8e i9r iA8 +i8e i9r iA7 +i8e i9r iA6 +i8e i9r iA5 +i8e i9r iA3 +i8e i9r iA2 +i8e i9r iA1 +i8e i9r iA0 +i8e i9r +i8e i9n iAt +i8e i9n iA1 +i8e i9n +i8e i9l iAl +i8e i9l iA1 +i8e i9l +i8e i9e +i8e i9d iA1 +i8e i9d +i8e i9a +i8e i99 iA9 +i8e i99 +i8e i98 +i8e i97 +i8e i96 iA6 +i8e i96 +i8e i95 +i8e i94 +i8e i93 +i8e i92 iA3 +i8e i92 iA2 +i8e i92 iA1 +i8e i92 iA0 +i8e i92 +i8e i91 iA9 +i8e i91 iA5 +i8e i91 iA4 +i8e i91 iA3 +i8e i91 iA2 +i8e i91 iA1 +i8e i91 iA0 +i8e i91 +i8e i90 iA1 +i8e i90 iA0 +i8e i90 +i8e +i8d i9y iA1 +i8d i9y +i8d i9s +i8d i9o +i8d i9e iAr +i8d i9e iA1 +i8d i9e +i8d i9a iA1 +i8d i9a +i8d i99 +i8d i92 +i8d i91 iA2 +i8d i91 iA1 +i8d i91 +i8d +i8c i9o +i8c i9k iAs +i8c i9k iAe +i8c i9k iA1 +i8c i9k +i8c i9h iA1 +i8c i9h +i8c i9e iA1 +i8c i9e +i8c i9a iA1 +i8c i9a +i8c i91 iA2 +i8c i91 +i8c +i8b i9y iA1 +i8b i9o +i8b i9e iAr +i8b i9e +i8b i9a +i8b i91 +i8b +i8a i9y iA1 +i8a i9y +i8a i9t iA1 +i8a i9t +i8a i9s iA1 +i8a i9s +i8a i9r iAt +i8a i9r iAd +i8a i9r iA1 +i8a i9r +i8a i9n iAd +i8a i9n iA1 +i8a i9n +i8a i9m iAe +i8a i9m iA1 +i8a i9m +i8a i9l iAl +i8a i9l iA1 +i8a i9l +i8a i9k iAe +i8a i9k iA1 +i8a i9k +i8a i9d iAe +i8a i9d iA1 +i8a i9d +i8a i9c +i8a i99 +i8a i97 +i8a i96 +i8a i95 +i8a i93 +i8a i92 iA3 +i8a i92 iA2 +i8a i92 iA0 +i8a i92 +i8a i91 iA9 +i8a i91 iA3 +i8a i91 iA2 +i8a i91 iA1 +i8a i91 iA0 +i8a i91 +i8a i90 +i8a +i8` +i8_ +i8^ +i8] +i8[ +i8Z +i8Y +i8X +i8W +i8V +i8U +i8T +i8S +i8R +i8Q +i8P +i8O +i8N +i8M +i8L +i8K +i8J +i8I +i8H +i8G +i8F +i8E +i8D +i8C +i8B +i8A +i8@ +i8? +i8= +i8< +i8; +i8: +i89 i99 iA9 +i89 i99 iA8 +i89 i99 iA7 +i89 i99 iA6 +i89 i99 iA5 +i89 i99 iA4 +i89 i99 iA3 +i89 i99 iA2 +i89 i99 iA1 +i89 i99 iA0 +i89 i99 +i89 i98 iA9 +i89 i98 iA8 +i89 i98 iA7 +i89 i98 iA6 +i89 i98 iA5 +i89 i98 +i89 i97 +i89 i96 +i89 i95 +i89 i94 +i89 i93 +i89 i92 +i89 i91 iA2 +i89 i91 iA1 +i89 i91 iA0 +i89 i91 +i89 i90 iA0 +i89 i90 +i89 +i88 i99 iA0 +i88 i99 +i88 i98 iA8 +i88 i98 +i88 i97 +i88 i96 +i88 i95 +i88 i94 +i88 i93 +i88 i92 +i88 i91 +i88 i90 +i88 +i87 i99 +i87 i98 iA9 +i87 i98 +i87 i97 iA7 +i87 i97 +i87 i96 +i87 i95 +i87 i94 +i87 i93 +i87 i92 +i87 i91 +i87 i90 +i87 +i86 i99 +i86 i98 +i86 i97 iA8 +i86 i97 +i86 i96 iA6 +i86 i96 +i86 i95 +i86 i94 +i86 i93 +i86 i92 +i86 i91 +i86 i90 +i86 +i85 i99 +i85 i98 +i85 i97 +i85 i96 iA7 +i85 i96 +i85 i95 iA5 +i85 i95 +i85 i94 +i85 i93 +i85 i92 +i85 i91 +i85 i90 iA0 +i85 i90 +i85 +i84 i9e iAv +i84 i99 +i84 i98 +i84 i97 +i84 i96 +i84 i95 iA6 +i84 i95 +i84 i94 iA4 +i84 i94 +i84 i93 iA2 +i84 i93 +i84 i92 iA0 +i84 i92 +i84 i91 +i84 i90 +i84 +i83 i99 +i83 i98 +i83 i97 +i83 i96 iA9 +i83 i96 +i83 i95 +i83 i94 iA5 +i83 i94 +i83 i93 iA3 +i83 i93 +i83 i92 iA1 +i83 i92 +i83 i91 iA3 +i83 i91 iA2 +i83 i91 +i83 i90 iA0 +i83 i90 +i83 +i82 i99 +i82 i98 +i82 i97 +i82 i96 +i82 i95 +i82 i94 +i82 i93 iA4 +i82 i93 iA3 +i82 i93 iA1 +i82 i93 iA0 +i82 i93 +i82 i92 iA3 +i82 i92 iA2 +i82 i92 iA1 +i82 i92 +i82 i91 iA3 +i82 i91 iA2 +i82 i91 iA1 +i82 i91 iA0 +i82 i91 +i82 i90 iA1 +i82 i90 iA0 +i82 i90 +i82 +i81 i99 iA9 +i81 i99 iA8 +i81 i99 iA7 +i81 i99 +i81 i98 +i81 i97 +i81 i96 +i81 i95 iA9 +i81 i95 +i81 i94 iA3 +i81 i94 +i81 i93 iA2 +i81 i93 iA1 +i81 i93 +i81 i92 iA5 +i81 i92 iA3 +i81 i92 iA2 +i81 i92 iA1 +i81 i92 iA0 +i81 i92 +i81 i91 iA2 +i81 i91 iA1 +i81 i91 iA0 +i81 i91 +i81 i90 iA2 +i81 i90 iA1 +i81 i90 iA0 +i81 i90 +i81 +i80 i99 +i80 i98 +i80 i97 +i80 i96 +i80 i95 +i80 i94 +i80 i93 +i80 i92 +i80 i91 iA2 +i80 i91 iA1 +i80 i91 iA0 +i80 i91 +i80 i90 iA9 +i80 i90 iA8 +i80 i90 iA7 +i80 i90 iA4 +i80 i90 iA3 +i80 i90 iA2 +i80 i90 iA1 +i80 i90 iA0 +i80 i90 +i80 +i8/ +i8. +i8- +i8, +i8+ +i8* +i8) +i8( +i8' +i8& +i8% +i8$ +i8# +i8! +i8 +i7~ +i7} +i7| +i7{ +i7z i81 +i7z +i7y i82 +i7y i81 i92 +i7y i81 i90 +i7y i81 +i7y +i7x i81 +i7x +i7w i8e i9r +i7w i8e +i7w i81 +i7w +i7v i8e i9r +i7v i8e i91 +i7v i8e +i7v +i7u i8t +i7u i8s i91 +i7u i8s +i7u i8r +i7u i8n +i7u i8l +i7u i8e +i7u i81 i92 +i7u i81 +i7u +i7t i8y i91 +i7t i8y +i7t i8t i9y +i7t i8t i9e +i7t i8t +i7t i8s +i7t i8o i9r +i7t i8o i9n +i7t i8o i91 +i7t i8o +i7t i8i i9o +i7t i8i i9n +i7t i8i +i7t i8h i91 +i7t i8h +i7t i8e i9r +i7t i8e i91 +i7t i8e +i7t i8a i91 +i7t i8a +i7t i82 +i7t i81 i92 +i7t i81 +i7t i80 +i7t +i7s i8t i9e +i7s i8t i9a +i7s i8t i91 +i7s i8t +i7s i8s i91 +i7s i8s +i7s i8o i9n +i7s i8h i91 +i7s i8h +i7s i8e i91 +i7s i8e +i7s i8a +i7s i89 i99 +i7s i89 +i7s i88 +i7s i87 +i7s i86 +i7s i85 +i7s i84 +i7s i83 +i7s i82 i93 +i7s i82 i92 +i7s i82 i90 +i7s i82 +i7s i81 i99 +i7s i81 i93 +i7s i81 i92 +i7s i81 i91 +i7s i81 i90 +i7s i81 +i7s i80 +i7s +i7r i8y i91 +i7r i8y +i7r i8u +i7r i8t i91 +i7r i8t +i7r i8s i91 +i7r i8s +i7r i8r i9y +i7r i8r +i7r i8o i91 +i7r i8o +i7r i8l i91 +i7r i8l +i7r i8i i9o +i7r i8i +i7r i8e i91 +i7r i8e +i7r i8d i91 +i7r i8d +i7r i8a i91 +i7r i8a +i7r i89 +i7r i83 +i7r i82 +i7r i81 i99 +i7r i81 i93 +i7r i81 i92 +i7r i81 i91 +i7r i81 i90 +i7r i81 +i7r i80 +i7r +i7q +i7p i8e i9r +i7p i8e +i7p i81 i92 +i7p i81 +i7p +i7o i8y i91 +i7o i8y +i7o i8w i91 +i7o i8w +i7o i8v i9e +i7o i8v +i7o i8u +i7o i8t i91 +i7o i8t +i7o i8s i91 +i7o i8s +i7o i8r i9d +i7o i8r i91 +i7o i8r +i7o i8p +i7o i8o i9l +i7o i8o i9d +i7o i8o +i7o i8n i9e +i7o i8n i92 +i7o i8n i91 +i7o i8n +i7o i8m +i7o i8l i91 +i7o i8l +i7o i8g i91 +i7o i8g +i7o i8d i91 +i7o i8d +i7o i8c i9k +i7o i89 +i7o i82 i90 +i7o i82 +i7o i81 i99 +i7o i81 i93 +i7o i81 i92 +i7o i81 i91 +i7o i81 i90 +i7o i81 +i7o i80 +i7o +i7n i8t i9e +i7n i8t i91 +i7n i8t +i7n i8s i91 +i7n i8s +i7n i8o i91 +i7n i8o +i7n i8n +i7n i8k +i7n i8i +i7n i8g i9e +i7n i8g i91 +i7n i8g +i7n i8e i9s +i7n i8e i92 +i7n i8e i91 +i7n i8e +i7n i8d i91 +i7n i8d +i7n i8c i9e +i7n i8c +i7n i8a i91 +i7n i8a +i7n i89 +i7n i88 +i7n i87 +i7n i86 +i7n i85 +i7n i83 +i7n i82 i92 +i7n i82 i91 +i7n i82 i90 +i7n i82 +i7n i81 i99 +i7n i81 i93 +i7n i81 i92 +i7n i81 i91 +i7n i81 i90 +i7n i81 +i7n i80 +i7n +i7m i8o i9n +i7m i8o +i7m i8i +i7m i8e i91 +i7m i8e +i7m i8a i9n +i7m i8a i91 +i7m i8a +i7m i81 i92 +i7m i81 +i7m +i7l i8y i91 +i7l i8y +i7l i8o i9v +i7l i8o i91 +i7l i8o +i7l i8l i9e +i7l i8l i9a +i7l i8l i91 +i7l i8l +i7l i8i i9f +i7l i8i +i7l i8e i9s +i7l i8e i9r +i7l i8e i91 +i7l i8e +i7l i8d i91 +i7l i8d +i7l i8a i9n +i7l i8a i91 +i7l i8a +i7l i89 +i7l i82 +i7l i81 i99 +i7l i81 i93 +i7l i81 i92 +i7l i81 i91 +i7l i81 i90 +i7l i81 +i7l i80 +i7l +i7k i8s i91 +i7k i8s +i7k i8i +i7k i8e i9r +i7k i8e i91 +i7k i8e +i7k i8a +i7k i82 +i7k i81 i92 +i7k i81 +i7k +i7j +i7i i8t +i7i i8s i91 +i7i i8s +i7i i8r i9l +i7i i8r i9e +i7i i8r +i7i i8o i9p +i7i i8o i9n +i7i i8o +i7i i8n i9g +i7i i8n i9e +i7i i8n i91 +i7i i8n +i7i i8l i9l +i7i i8l i91 +i7i i8l +i7i i8g i9h +i7i i8g +i7i i8f i9e +i7i i8f +i7i i8e i91 +i7i i8e +i7i i8d +i7i i8c i9k +i7i i8c i9a +i7i i8c i91 +i7i i8c +i7i i8a i91 +i7i i8a +i7i i82 +i7i i81 i92 +i7i i81 +i7i +i7h i8t i91 +i7h i8t +i7h i8o +i7h i8i +i7h i8e i9r +i7h i8e +i7h i8a +i7h i81 i92 +i7h i81 +i7h +i7g i8o i9n +i7g i8o +i7g i8h i9t +i7g i8h +i7g i8e i9r +i7g i8e i9l +i7g i8e +i7g i8a +i7g i82 +i7g i81 i92 +i7g i81 +i7g +i7f i8e +i7f i81 +i7f +i7e i8y i91 +i7e i8y +i7e i8v i9e +i7e i8v +i7e i8t i91 +i7e i8t +i7e i8s i91 +i7e i8s +i7e i8r i9s +i7e i8r i99 +i7e i8r i93 +i7e i8r i92 +i7e i8r i91 +i7e i8r i90 +i7e i8r +i7e i8n i91 +i7e i8n +i7e i8l i9l +i7e i8l i91 +i7e i8l +i7e i8e i91 +i7e i8e +i7e i8d i91 +i7e i8d +i7e i8a i9r +i7e i8a +i7e i89 i99 +i7e i89 +i7e i88 +i7e i87 +i7e i86 i99 +i7e i86 +i7e i85 +i7e i84 +i7e i83 +i7e i82 i93 +i7e i82 i92 +i7e i82 i91 +i7e i82 i90 +i7e i82 +i7e i81 i99 +i7e i81 i94 +i7e i81 i93 +i7e i81 i92 +i7e i81 i91 +i7e i81 i90 +i7e i81 +i7e i80 i91 +i7e i80 i90 +i7e i80 +i7e +i7d i8o +i7d i8e i9r +i7d i8e i91 +i7d i8e +i7d i8a i91 +i7d i8a +i7d i89 +i7d i82 +i7d i81 i92 +i7d i81 i91 +i7d i81 i90 +i7d i81 +i7d +i7c i8o +i7c i8k i9s +i7c i8k i91 +i7c i8k +i7c i8h i91 +i7c i8h +i7c i8e i91 +i7c i8e +i7c i8a i91 +i7c i8a +i7c i81 +i7c +i7b i8o +i7b i8e i9r +i7b i8e +i7b i81 +i7b +i7a i8y i91 +i7a i8y +i7a i8t i9e +i7a i8t i91 +i7a i8t +i7a i8s i9t +i7a i8s i91 +i7a i8s +i7a i8r i9t +i7a i8r i9k +i7a i8r i9d +i7a i8r i91 +i7a i8r +i7a i8n i9g +i7a i8n i9d +i7a i8n i99 +i7a i8n i92 +i7a i8n i91 +i7a i8n +i7a i8m i9o +i7a i8m i9e +i7a i8m i91 +i7a i8m +i7a i8l i9l +i7a i8l i91 +i7a i8l +i7a i8k i9e +i7a i8k +i7a i8i +i7a i8g i9o +i7a i8g +i7a i8d i9e +i7a i8d i91 +i7a i8d +i7a i8c i9k +i7a i8c +i7a i89 i99 +i7a i89 +i7a i88 +i7a i87 +i7a i86 +i7a i83 +i7a i82 i92 +i7a i82 i91 +i7a i82 i90 +i7a i82 +i7a i81 i99 +i7a i81 i93 +i7a i81 i92 +i7a i81 i91 +i7a i81 i90 +i7a i81 +i7a i80 i91 +i7a i80 +i7a +i7` +i7_ +i7^ +i7] +i7\ +i7[ +i7Z +i7Y +i7X +i7W +i7V +i7U +i7T +i7S +i7R +i7Q +i7P +i7O +i7N +i7M +i7L +i7K +i7J +i7I +i7H +i7G +i7F +i7E +i7D +i7C +i7B +i7A +i7@ +i7? +i7> +i7= +i7< +i7; +i7: +i79 i89 i99 +i79 i89 i98 +i79 i89 i97 +i79 i89 i96 +i79 i89 i95 +i79 i89 i94 +i79 i89 i93 +i79 i89 i92 +i79 i89 i91 +i79 i89 i90 +i79 i89 +i79 i88 i99 +i79 i88 i98 +i79 i88 i97 +i79 i88 i95 +i79 i88 i90 +i79 i88 +i79 i87 +i79 i86 +i79 i85 +i79 i84 +i79 i83 +i79 i82 +i79 i81 i91 +i79 i81 +i79 i80 +i79 +i78 i89 i91 +i78 i89 i90 +i78 i89 +i78 i88 i98 +i78 i88 +i78 i87 +i78 i86 +i78 i85 +i78 i84 +i78 i83 +i78 i82 +i78 i81 +i78 i80 +i78 +i77 i89 +i77 i88 i99 +i77 i88 +i77 i87 i97 +i77 i87 +i77 i86 +i77 i85 +i77 i84 +i77 i83 +i77 i82 +i77 i81 +i77 i80 +i77 +i76 i89 +i76 i88 +i76 i87 i98 +i76 i87 +i76 i86 i96 +i76 i86 +i76 i85 +i76 i84 +i76 i83 +i76 i82 +i76 i81 +i76 i80 +i76 +i75 i89 +i75 i88 +i75 i87 +i75 i86 i97 +i75 i86 +i75 i85 i95 +i75 i85 +i75 i84 +i75 i83 +i75 i82 +i75 i81 +i75 i80 i90 +i75 i80 +i75 +i74 i89 +i74 i88 +i74 i87 +i74 i86 +i74 i85 i96 +i74 i85 +i74 i84 +i74 i83 i92 +i74 i83 +i74 i82 i90 +i74 i82 +i74 i81 +i74 i80 +i74 +i73 i89 +i73 i88 +i73 i87 +i73 i86 +i73 i85 +i73 i84 i95 +i73 i84 +i73 i83 i93 +i73 i83 +i73 i82 i91 +i73 i82 +i73 i81 i92 +i73 i81 +i73 i80 i90 +i73 i80 +i73 +i72 i89 +i72 i88 +i72 i87 +i72 i86 +i72 i85 +i72 i84 +i72 i83 i94 +i72 i83 i93 +i72 i83 i92 +i72 i83 i91 +i72 i83 i90 +i72 i83 +i72 i82 i93 +i72 i82 i92 +i72 i82 i91 +i72 i82 +i72 i81 i93 +i72 i81 i92 +i72 i81 i91 +i72 i81 i90 +i72 i81 +i72 i80 i91 +i72 i80 i90 +i72 i80 +i72 +i71i72i83i94 +i71i72i83 +i71 i89 i99 +i71 i89 i98 +i71 i89 i97 +i71 i89 +i71 i88 +i71 i87 +i71 i86 +i71 i85 i99 +i71 i85 +i71 i84 i93 +i71 i84 +i71 i83 i92 +i71 i83 i91 +i71 i83 +i71 i82 i93 +i71 i82 i92 +i71 i82 i91 +i71 i82 i90 +i71 i82 +i71 i81 i92 +i71 i81 i91 +i71 i81 +i71 i80 i92 +i71 i80 i91 +i71 i80 i90 +i71 i80 +i71 +i70 i89 +i70 i88 +i70 i87 +i70 i86 +i70 i85 +i70 i84 +i70 i83 +i70 i82 i90 +i70 i82 +i70 i81 i92 +i70 i81 i91 +i70 i81 i90 +i70 i81 +i70 i80 i99 +i70 i80 i98 +i70 i80 i97 +i70 i80 i96 +i70 i80 i94 +i70 i80 i93 +i70 i80 i92 +i70 i80 i91 +i70 i80 i90 +i70 i80 +i70 +i7/ +i7. +i7- +i7, +i7+ +i7* +i7) +i7( +i7' +i7& +i7% +i7$ +i7# +i7" +i7! +i7 +i6~ +i6} +i6| +i6{ +i6z i71 +i6z +i6y i79 +i6y i72 +i6y i71 i82 +i6y i71 i81 +i6y i71 i80 +i6y i71 +i6y +i6x i71 i82 +i6x i71 +i6x +i6w i7e i8r +i6w i7e +i6w +i6v i7e i8r +i6v i7e i81 +i6v i7e +i6v +i6u i7t +i6u i7s i81 +i6u i7s +i6u i7r +i6u i7n +i6u i7l +i6u i7i i8o +i6u i7i +i6u i7e +i6u i71 i82 +i6u i71 +i6u +i6t i7y i81 +i6t i7y +i6t i7t i8e +i6t i7t +i6t i7s +i6t i7o i8r +i6t i7o i8n +i6t i7o i81 +i6t i7o +i6t i7i i8o +i6t i7i +i6t i7h +i6t i7e i8r +i6t i7e i81 +i6t i7e +i6t i7a i8r +i6t i7a i81 +i6t i7a +i6t i72 +i6t i71 i82 +i6t i71 +i6t +i6s i7t i8e +i6s i7t i8a +i6s i7t i81 +i6s i7t +i6s i7s i81 +i6s i7s +i6s i7o i8n +i6s i7o +i6s i7i +i6s i7h i81 +i6s i7h +i6s i7e i81 +i6s i7e +i6s i7a i81 +i6s i7a +i6s i79 +i6s i77 +i6s i76 +i6s i73 +i6s i72 i80 +i6s i72 +i6s i71 i89 +i6s i71 i83 +i6s i71 i82 +i6s i71 i81 +i6s i71 i80 +i6s i71 +i6s i70 +i6s +i6r i7u +i6r i7t i81 +i6r i7t +i6r i7s i81 +i6r i7s +i6r i7o i81 +i6r i7o +i6r i7l i81 +i6r i7l +i6r i7i +i6r i7e i8a +i6r i7e i81 +i6r i7e +i6r i7d i81 +i6r i7d +i6r i7a i81 +i6r i7a +i6r i79 +i6r i73 +i6r i72 +i6r i71 i89 +i6r i71 i82 +i6r i71 i81 +i6r i71 i80 +i6r i71 +i6r i70 +i6r +i6q +i6p i7o +i6p i7e +i6p i7a +i6p i71 +i6p +i6o i7y i81 +i6o i7y +i6o i7w +i6o i7v i8e +i6o i7v +i6o i7u i81 +i6o i7u +i6o i7t i81 +i6o i7t +i6o i7s i8e +i6o i7s i81 +i6o i7s +i6o i7r i8e +i6o i7r i8d +i6o i7r i81 +i6o i7r +i6o i7p i81 +i6o i7p +i6o i7o i8l +i6o i7o i8d +i6o i7o i81 +i6o i7o +i6o i7n i8e +i6o i7n i82 +i6o i7n i81 +i6o i7n +i6o i7m +i6o i7l i81 +i6o i7l +i6o i7k +i6o i7g i81 +i6o i7g +i6o i7d +i6o i7c i8k +i6o i7c +i6o i79 +i6o i72 i80 +i6o i72 +i6o i71 i89 +i6o i71 i83 +i6o i71 i82 +i6o i71 i81 +i6o i71 i80 +i6o i71 +i6o i70 +i6o +i6n i7t i8e +i6n i7t +i6n i7s i81 +i6n i7s +i6n i7o i81 +i6n i7o +i6n i7n +i6n i7k +i6n i7i +i6n i7g i8e +i6n i7g i81 +i6n i7g +i6n i7e i82 +i6n i7e i81 +i6n i7e +i6n i7d i81 +i6n i7d +i6n i7a i81 +i6n i7a +i6n i79 i89 +i6n i79 +i6n i78 +i6n i77 +i6n i76 +i6n i75 +i6n i74 +i6n i73 +i6n i72 i83 +i6n i72 i82 +i6n i72 i80 +i6n i72 +i6n i71 i89 +i6n i71 i83 +i6n i71 i82 +i6n i71 i81 +i6n i71 i80 +i6n i71 +i6n i70 i81 +i6n i70 +i6n +i6m i7o +i6m i7i +i6m i7e i81 +i6m i7e +i6m i7a i8r +i6m i7a i8n +i6m i7a i81 +i6m i7a +i6m i71 i82 +i6m i71 +i6m +i6l i7y +i6l i7o i8v +i6l i7o i81 +i6l i7o +i6l i7l i8e +i6l i7l i8a +i6l i7l i82 +i6l i7l i81 +i6l i7l +i6l i7i i8n +i6l i7i i8f +i6l i7i +i6l i7e i8s +i6l i7e i8r +i6l i7e i81 +i6l i7e +i6l i7d +i6l i7a i8n +i6l i7a i81 +i6l i7a +i6l i72 +i6l i71 i82 +i6l i71 +i6l +i6k i7o +i6k i7i i8n +i6k i7i i81 +i6k i7i +i6k i7e i8r +i6k i7e i81 +i6k i7e +i6k i7a i81 +i6k i7a +i6k i71 i82 +i6k i71 +i6k +i6j +i6i i7t i8o +i6i i7t i8a +i6i i7t +i6i i7s i8h +i6i i7s i81 +i6i i7s +i6i i7r i8l +i6i i7r i8e +i6i i7r +i6i i7o i8n +i6i i7o i81 +i6i i7o +i6i i7n i8g +i6i i7n i8e +i6i i7n i8a +i6i i7n i81 +i6i i7n +i6i i7m +i6i i7l i8l +i6i i7l +i6i i7g i8h +i6i i7g +i6i i7f i8e +i6i i7e i81 +i6i i7e +i6i i7d i8e +i6i i7d +i6i i7c i8k +i6i i7c i8a +i6i i7c +i6i i7a i8n +i6i i7a i81 +i6i i7a +i6i i71 i82 +i6i i71 +i6i +i6h i7t +i6h i7o +i6h i7i +i6h i7e i8r +i6h i7e +i6h i7a i8n +i6h i7a i81 +i6h i7a +i6h i71 i82 +i6h i71 +i6h +i6g i7o +i6g i7i i8r +i6g i7i +i6g i7h i8t +i6g i7h +i6g i7e i8r +i6g i7e i8l +i6g i7e +i6g i7a +i6g i71 i82 +i6g i71 +i6g +i6f i7e +i6f +i6e i7y i81 +i6e i7y +i6e i7v i8e +i6e i7v +i6e i7t i81 +i6e i7t +i6e i7s i8s +i6e i7s i81 +i6e i7s +i6e i7r i8s +i6e i7r i8o +i6e i7r i89 +i6e i7r i82 +i6e i7r i81 +i6e i7r i80 +i6e i7r +i6e i7n i81 +i6e i7n +i6e i7m +i6e i7l i8l +i6e i7l i81 +i6e i7l +i6e i7k i81 +i6e i7k +i6e i7e i81 +i6e i7e +i6e i7d i81 +i6e i7d +i6e i7a i8r +i6e i7a +i6e i79 +i6e i78 +i6e i77 +i6e i76 +i6e i74 +i6e i73 +i6e i72 i83 +i6e i72 i80 +i6e i72 +i6e i71 i89 +i6e i71 i83 +i6e i71 i82 +i6e i71 i81 +i6e i71 i80 +i6e i71 +i6e i70 +i6e +i6d i7r i8a +i6d i7r +i6d i7o i8g +i6d i7o i81 +i6d i7o +i6d i7e i8r +i6d i7e i81 +i6d i7e +i6d i7a i81 +i6d i7a +i6d i72 +i6d i71 i82 +i6d i71 +i6d +i6c i7o i81 +i6c i7o +i6c i7k i8s +i6c i7k i81 +i6c i7k +i6c i7h +i6c i7e i81 +i6c i7e +i6c i7a i81 +i6c i7a +i6c i71 +i6c +i6b i7o i8y +i6b i7o +i6b i7e i8r +i6b i7e +i6b i7a i8l +i6b i7a +i6b +i6a i7y i81 +i6a i7y +i6a i7t i8e +i6a i7t i81 +i6a i7t +i6a i7s i8t +i6a i7s i8s +i6a i7s i8d +i6a i7s i81 +i6a i7s +i6a i7r i8t +i6a i7r i8i +i6a i7r i8e +i6a i7r i8d +i6a i7r i81 +i6a i7r +i6a i7p +i6a i7n i8t +i6a i7n i8g +i6a i7n i8d +i6a i7n i8a +i6a i7n i89 +i6a i7n i82 +i6a i7n i81 +i6a i7n +i6a i7m i8e +i6a i7m i81 +i6a i7m +i6a i7l i8l +i6a i7l i81 +i6a i7l +i6a i7k i8e +i6a i7k +i6a i7i +i6a i7h i81 +i6a i7h +i6a i7g +i6a i7d i8o +i6a i7d i8e +i6a i7d i81 +i6a i7d +i6a i7c i8k +i6a i7c i8e +i6a i7c +i6a i7b +i6a i79 i89 +i6a i79 +i6a i78 +i6a i77 +i6a i76 +i6a i73 +i6a i72 i82 +i6a i72 i80 +i6a i72 +i6a i71 i89 +i6a i71 i83 +i6a i71 i82 +i6a i71 i81 +i6a i71 i80 +i6a i71 +i6a i70 +i6a +i6` +i6_ +i6^ +i6] +i6\ +i6[ +i6Z +i6Y +i6X +i6W +i6V +i6U +i6T +i6S +i6R +i6Q +i6P +i6O +i6N +i6M +i6L +i6K +i6J +i6I +i6H +i6G +i6F +i6E +i6D +i6C +i6B +i6A +i6@ +i6? +i6> +i6= +i6< +i6; +i6: +i69 i79 i89 +i69 i79 i88 +i69 i79 i87 +i69 i79 i86 +i69 i79 i85 +i69 i79 i84 +i69 i79 i83 +i69 i79 i82 +i69 i79 i81 +i69 i79 i80 +i69 i79 +i69 i78 i89 +i69 i78 i88 +i69 i78 i87 +i69 i78 +i69 i77 +i69 i76 i83 +i69 i76 +i69 i75 +i69 i74 +i69 i73 +i69 i72 +i69 i71 i81 +i69 i71 +i69 i70 +i69 +i68 i79 +i68 i78 i88 +i68 i78 +i68 i77 +i68 i76 +i68 i75 i82 +i68 i75 +i68 i74 +i68 i73 +i68 i72 +i68 i71 +i68 i70 +i68 +i67 i79 +i67 i78 i89 +i67 i78 +i67 i77 i87 +i67 i77 +i67 i76 +i67 i75 +i67 i74 +i67 i73 +i67 i72 +i67 i71 +i67 i70 +i67 +i66 i79 +i66 i78 +i66 i77 i88 +i66 i77 +i66 i76 i86 +i66 i76 +i66 i75 +i66 i74 +i66 i73 +i66 i72 +i66 i71 +i66 i70 +i66 +i65 i79 +i65 i78 +i65 i77 +i65 i76 i87 +i65 i76 +i65 i75 i85 +i65 i75 +i65 i74 +i65 i73 +i65 i72 +i65 i71 +i65 i70 +i65 +i64 i79 +i64 i78 +i64 i77 +i64 i76 +i64 i75 i86 +i64 i75 +i64 i74 i84 +i64 i74 +i64 i73 i82 +i64 i73 +i64 i72 i80 +i64 i72 +i64 i71 +i64 i70 +i64 +i63 i79 +i63 i78 +i63 i77 +i63 i76 i89 +i63 i76 +i63 i75 +i63 i74 i85 +i63 i74 +i63 i73 i83 +i63 i73 +i63 i72 i81 +i63 i72 +i63 i71 i82 +i63 i71 +i63 i70 i80 +i63 i70 +i63 +i62 i79 +i62 i78 +i62 i77 +i62 i76 +i62 i75 +i62 i74 +i62 i73 i84 +i62 i73 i82 +i62 i73 i81 +i62 i73 +i62 i72 i83 +i62 i72 i82 +i62 i72 i81 +i62 i72 +i62 i71 i83 +i62 i71 i82 +i62 i71 i81 +i62 i71 i80 +i62 i71 +i62 i70 i81 +i62 i70 i80 +i62 i70 +i62 +i61i72i83i94 +i61i72i83 +i61 i79 i89 +i61 i79 i88 +i61 i79 i87 +i61 i79 i86 +i61 i79 +i61 i78 +i61 i77 +i61 i76 +i61 i75 i89 +i61 i75 +i61 i74 i87 +i61 i74 i83 +i61 i74 +i61 i73 i82 +i61 i73 i81 +i61 i73 +i61 i72 i85 +i61 i72 i84 +i61 i72 i83 +i61 i72 i82 +i61 i72 i81 +i61 i72 i80 +i61 i72 +i61 i71 i82 +i61 i71 i81 +i61 i71 i80 +i61 i71 +i61 i70 i82 +i61 i70 i81 +i61 i70 i80 +i61 i70 +i61 +i60 i79 +i60 i78 +i60 i77 +i60 i76 +i60 i75 +i60 i74 +i60 i73 +i60 i72 +i60 i71 i82 +i60 i71 i81 +i60 i71 i80 +i60 i71 +i60 i70 i89 +i60 i70 i88 +i60 i70 i87 +i60 i70 i83 +i60 i70 i82 +i60 i70 i81 +i60 i70 i80 +i60 i70 +i60 +i6/ +i6. +i6- +i6, +i6+ +i6* +i6) +i6( +i6' +i6& +i6% +i6$ +i6# +i6! +i6 +i5~ +i5z i61 +i5z +i5y'6 +i5y i6o i7u +i5y i6o +i5y i69 +i5y i63 +i5y i62 i70 +i5y i62 +i5y i61 i79 +i5y i61 i72 +i5y i61 i71 +i5y i61 i70 +i5y i61 +i5y i60 +i5y +i5x i61 i72 +i5x i61 +i5x +i5w i6a +i5w i61 i72 +i5w i61 +i5w +i5v i6e i7r +i5v i6e +i5v +i5u i6t +i5u i6s i71 +i5u i6s +i5u i6r +i5u i6n +i5u i6l +i5u i61 i72 +i5u i61 +i5u +i5t i6y +i5t i6t i7e +i5t i6t +i5t i6s +i5t i6o i7n +i5t i6o i71 +i5t i6o +i5t i6i i7n +i5t i6i i7a +i5t i6i +i5t i6h +i5t i6e i7r +i5t i6e i71 +i5t i6e +i5t i6a i7r +i5t i6a i71 +i5t i6a +i5t i62 +i5t i61 i72 +i5t i61 +i5t +i5s i6t i7e +i5s i6t i7a +i5s i6t +i5s i6s i71 +i5s i6s +i5s i6o i7n +i5s i6o +i5s i6i +i5s i6h i7a +i5s i6h +i5s i6e +i5s i6a i71 +i5s i6a +i5s i69 +i5s i63 +i5s i62 i72 +i5s i62 i70 +i5s i62 +i5s i61 i79 +i5s i61 i73 +i5s i61 i72 +i5s i61 i71 +i5s i61 i70 +i5s i61 +i5s i60 +i5s +i5r i6y i71 +i5r i6y +i5r i6u +i5r i6t +i5r i6s i71 +i5r i6s +i5r i6o i7s +i5r i6o i71 +i5r i6o +i5r i6m i7a +i5r i6m +i5r i6l +i5r i6i i7n +i5r i6i i7a +i5r i6i +i5r i6e i71 +i5r i6e +i5r i6d i71 +i5r i6d +i5r i6b +i5r i6a i71 +i5r i6a +i5r i69 +i5r i68 +i5r i67 +i5r i66 +i5r i65 +i5r i64 +i5r i63 +i5r i62 i72 +i5r i62 i70 +i5r i62 +i5r i61 i79 +i5r i61 i73 +i5r i61 i72 +i5r i61 i71 +i5r i61 i70 +i5r i61 +i5r i60 i71 +i5r i60 i70 +i5r i60 +i5r +i5q +i5p i6o +i5p i6i +i5p i6a +i5p i61 i72 +i5p i61 +i5p +i5o i6y i71 +i5o i6y +i5o i6w +i5o i6v i7e +i5o i6v +i5o i6u +i5o i6t +i5o i6s i71 +i5o i6s +i5o i6r i7e +i5o i6r i7d +i5o i6r +i5o i6p +i5o i6o i7l +i5o i6o +i5o i6n i7g +i5o i6n i7e +i5o i6n i79 +i5o i6n i72 +i5o i6n i71 +i5o i6n i70 +i5o i6n +i5o i6m +i5o i6l i7a +i5o i6l +i5o i6g +i5o i6c i7k +i5o i6c +i5o i69 +i5o i62 i70 +i5o i62 +i5o i61 i79 +i5o i61 i72 +i5o i61 i71 +i5o i61 i70 +i5o i61 +i5o i60 +i5o +i5n i6y +i5n i6t +i5n i6s i71 +i5n i6s +i5n i6o i71 +i5n i6o +i5n i6n +i5n i6i +i5n i6g i7e +i5n i6g i71 +i5n i6g +i5n i6e i7s +i5n i6e i71 +i5n i6e +i5n i6d i7r +i5n i6d i7o +i5n i6d i7e +i5n i6d i71 +i5n i6d +i5n i6a i71 +i5n i6a +i5n i69 i79 +i5n i69 +i5n i68 +i5n i67 +i5n i66 +i5n i65 +i5n i64 +i5n i63 +i5n i62 i73 +i5n i62 i72 +i5n i62 i71 +i5n i62 i70 +i5n i62 +i5n i61 i79 +i5n i61 i73 +i5n i61 i72 +i5n i61 i71 +i5n i61 i70 +i5n i61 +i5n i60 i71 +i5n i60 i70 +i5n i60 +i5n +i5m i6o i7n +i5m i6o +i5m i6i +i5m i6e i71 +i5m i6e +i5m i6a i7r +i5m i6a i7n +i5m i6a +i5m i61 i72 +i5m i61 +i5m +i5l i6o i7v +i5l i6o i71 +i5l i6o +i5l i6l i7e +i5l i6l i7a +i5l i6l i71 +i5l i6l +i5l i6i i7n +i5l i6i +i5l i6e i7s +i5l i6e i71 +i5l i6e +i5l i6a i7s +i5l i6a i7n +i5l i6a i71 +i5l i6a +i5l i62 +i5l i61 i72 +i5l i61 +i5l +i5k i6i i7n +i5k i6i +i5k i6e +i5k i6a i71 +i5k i6a +i5k i61 i72 +i5k i61 +i5k +i5j +i5i i6t i7o +i5i i6t i7a +i5i i6t +i5i i6s i71 +i5i i6s +i5i i6r i7l +i5i i6r i7e +i5i i6r +i5i i6o i7n +i5i i6o i71 +i5i i6o +i5i i6n i7g +i5i i6n i7e +i5i i6n i7a +i5i i6n i71 +i5i i6n +i5i i6m +i5i i6l i7l +i5i i6l +i5i i6k +i5i i6g i7h +i5i i6g +i5i i6f i7e +i5i i6e i71 +i5i i6e +i5i i6d i7e +i5i i6d +i5i i6c i7k +i5i i6c i7a +i5i i6c +i5i i6a i7n +i5i i6a i71 +i5i i6a +i5i i61 i72 +i5i i61 +i5i +i5h i6o +i5h i6i +i5h i6e i7r +i5h i6e +i5h i6a i7n +i5h i6a i71 +i5h i6a +i5h i61 i72 +i5h i61 +i5h +i5g i6o +i5g i6i i7r +i5g i6i +i5g i6h i7t +i5g i6h +i5g i6e +i5g i6a +i5g i61 i72 +i5g i61 +i5g +i5f +i5e i6y i71 +i5e i6y +i5e i6v i7e +i5e i6t +i5e i6s i7t +i5e i6s i7s +i5e i6s i72 +i5e i6s i71 +i5e i6s +i5e i6r i7s +i5e i6r i7o +i5e i6r i79 +i5e i6r i72 +i5e i6r i71 +i5e i6r i70 +i5e i6r +i5e i6n i71 +i5e i6n +i5e i6m +i5e i6l i7l +i5e i6l i71 +i5e i6l +i5e i6e +i5e i6d i71 +i5e i6d +i5e i6a i7r +i5e i6a i7d +i5e i6a +i5e i69 +i5e i68 +i5e i67 +i5e i66 +i5e i65 +i5e i64 +i5e i63 +i5e i62 i73 +i5e i62 i72 +i5e i62 i71 +i5e i62 i70 +i5e i62 +i5e i61 i79 +i5e i61 i73 +i5e i61 i72 +i5e i61 i71 +i5e i61 i70 +i5e i61 +i5e i60 i71 +i5e i60 i70 +i5e i60 +i5e +i5d i6o i7g +i5d i6o i71 +i5d i6o +i5d i6i +i5d i6e i7r +i5d i6e +i5d i6a i71 +i5d i6a +i5d i61 i72 +i5d i61 +i5d +i5c i6o +i5c i6k i71 +i5c i6k +i5c i6h +i5c i6e i71 +i5c i6e +i5c i6a i7t +i5c i6a i71 +i5c i6a +i5c i61 i72 +i5c i61 +i5c +i5b i6o i7y +i5b i6o +i5b i6e i7r +i5b i6e i7a +i5b i6e +i5b i6a +i5b i61 +i5b +i5a i6y i71 +i5a i6y +i5a i6t i7e +i5a i6t i71 +i5a i6t +i5a i6s i7t +i5a i6s i7s +i5a i6s i71 +i5a i6s +i5a i6r i7s +i5a i6r i7i +i5a i6r i7d +i5a i6r i71 +i5a i6r +i5a i6n i7t +i5a i6n i7i +i5a i6n i7g +i5a i6n i7d +i5a i6n i7a +i5a i6n i79 +i5a i6n i72 +i5a i6n i71 +i5a i6n +i5a i6m i7e +i5a i6m i7a +i5a i6m i71 +i5a i6m +i5a i6l i7l +i5a i6l i71 +i5a i6l +i5a i6k +i5a i6i +i5a i6h +i5a i6g +i5a i6d i7e +i5a i6d +i5a i6c i7k +i5a i6c i7e +i5a i6c +i5a i6b +i5a i69 i79 +i5a i69 +i5a i68 +i5a i67 +i5a i66 +i5a i63 +i5a i62 i72 +i5a i62 i70 +i5a i62 +i5a i61 i79 +i5a i61 i73 +i5a i61 i72 +i5a i61 i71 +i5a i61 i70 +i5a i61 +i5a i60 i71 +i5a i60 i70 +i5a i60 +i5a +i5` +i5_ +i5^ +i5] +i5\ +i5[ +i5Z +i5Y +i5X +i5W +i5V +i5U +i5T +i5S +i5R +i5Q +i5P +i5O +i5N +i5M +i5L +i5K +i5J +i5I +i5H +i5G +i5F +i5E +i5D +i5C +i5B +i5A +i5@ +i5? +i5= +i5< +i5; +i5: +i59 i69 i79 +i59 i69 i78 +i59 i69 i77 +i59 i69 i76 +i59 i69 i75 +i59 i69 i74 +i59 i69 i73 +i59 i69 i72 +i59 i69 i71 +i59 i69 i70 +i59 i69 +i59 i68 i79 +i59 i68 i78 +i59 i68 i77 +i59 i68 i76 +i59 i68 i75 +i59 i68 i74 +i59 i68 i72 +i59 i68 i71 +i59 i68 i70 +i59 i68 +i59 i67 +i59 i66 +i59 i65 +i59 i64 +i59 i63 +i59 i62 +i59 i61 i71 +i59 i61 +i59 i60 i70 +i59 i60 +i59 +i58 i69 +i58 i68 i78 +i58 i68 +i58 i67 +i58 i66 +i58 i65 +i58 i64 +i58 i63 +i58 i62 +i58 i61 +i58 i60 +i58 +i57 i69 +i57 i68 i79 +i57 i68 +i57 i67 i77 +i57 i67 +i57 i66 +i57 i65 +i57 i64 +i57 i63 +i57 i62 +i57 i61 +i57 i60 +i57 +i56 i69 +i56 i68 +i56 i67 i78 +i56 i67 +i56 i66 i76 +i56 i66 +i56 i65 +i56 i64 +i56 i63 +i56 i62 +i56 i61 i72 +i56 i61 +i56 i60 +i56 +i55 i69 +i55 i68 +i55 i67 +i55 i66 i77 +i55 i66 +i55 i65 i75 +i55 i65 +i55 i64 +i55 i63 +i55 i62 +i55 i61 +i55 i60 i70 +i55 i60 +i55 +i54 i69 +i54 i68 +i54 i67 +i54 i66 +i54 i65 i76 +i54 i65 +i54 i64 +i54 i63 i72 +i54 i63 +i54 i62 i70 +i54 i62 +i54 i61 i72 +i54 i61 +i54 i60 +i54 +i53 i69 +i53 i68 +i53 i67 +i53 i66 +i53 i65 +i53 i64 i75 +i53 i64 +i53 i63 i73 +i53 i63 +i53 i62 i71 +i53 i62 +i53 i61 i72 +i53 i61 +i53 i60 i70 +i53 i60 +i53 +i52 i69 +i52 i68 +i52 i67 +i52 i66 +i52 i65 +i52 i64 +i52 i63 i74 +i52 i63 i73 +i52 i63 i71 +i52 i63 +i52 i62 i72 +i52 i62 i71 +i52 i62 +i52 i61 i73 +i52 i61 i72 +i52 i61 i71 +i52 i61 i70 +i52 i61 +i52 i60 i71 +i52 i60 i70 +i52 i60 +i52 +i51 i69 i79 +i51 i69 i78 +i51 i69 i77 +i51 i69 i76 +i51 i69 +i51 i68 +i51 i67 +i51 i66 +i51 i65 +i51 i64 +i51 i63 i71 +i51 i63 +i51 i62 i73 +i51 i62 i72 +i51 i62 i71 +i51 i62 i70 +i51 i62 +i51 i61 i72 +i51 i61 i71 +i51 i61 i70 +i51 i61 +i51 i60 i72 +i51 i60 i71 +i51 i60 i70 +i51 i60 +i51 +i50 i69 +i50 i68 +i50 i67 +i50 i66 +i50 i65 +i50 i64 +i50 i63 +i50 i62 i70 +i50 i62 +i50 i61 i72 +i50 i61 i71 +i50 i61 i70 +i50 i61 +i50 i60 i79 +i50 i60 i78 +i50 i60 i77 +i50 i60 i76 +i50 i60 i75 +i50 i60 i74 +i50 i60 i73 +i50 i60 i72 +i50 i60 i71 +i50 i60 i70 +i50 i60 +i50 +i5/ +i5. +i5- +i5, +i5+ +i5* +i5) +i5( +i5' +i5& +i5% +i5$ +i5# +i5" +i5! +i5 +i4~ +i4|x32 +i4| +i4z +i4y'5 +i4y i5s +i4y i5o i6u +i4y i5o +i4y i5b i6o +i4y i5b +i4y i5a +i4y i59 +i4y i53 +i4y i52 i60 +i4y i52 +i4y i51 i69 +i4y i51 i62 +i4y i51 i61 +i4y i51 i60 +i4y i51 +i4y i50 +i4y +i4x +i4w i5o i6r +i4w i5o +i4w i5e +i4w i5a i6r +i4w i5a +i4w +i4v i5i +i4v i5e i6r +i4v i5e +i4v +i4u i5t +i4u i5s i61 +i4u i5s +i4u i5r +i4u i5n +i4u i5l +i4u i5i +i4u i5a +i4u i51 +i4u +i4t i5y i61 +i4t i5y +i4t i5t +i4t i5s +i4t i5r +i4t i5o i6n +i4t i5o i61 +i4t i5o +i4t i5i i6n +i4t i5i +i4t i5h i6e +i4t i5h i6a +i4t i5h +i4t i5e i6r +i4t i5e i61 +i4t i5e +i4t i5a i6r +i4t i5a i6n +i4t i5a i6l +i4t i5a i61 +i4t i5a +i4t i51 i62 +i4t i51 +i4t +i4s i5t i6o +i4s i5t i6i +i4s i5t i6e +i4s i5t i6a +i4s i5t +i4s i5s i6a +i4s i5s i61 +i4s i5s +i4s i5o i6n +i4s i5o +i4s i5i +i4s i5h i6i +i4s i5h i6a +i4s i5h +i4s i5e +i4s i5a i61 +i4s i5a +i4s i52 i60 +i4s i52 +i4s i51 i69 +i4s i51 i62 +i4s i51 +i4s +i4r i5y +i4r i5u +i4r i5t +i4r i5s i61 +i4r i5s +i4r i5o i6n +i4r i5o i6c +i4r i5o i61 +i4r i5o +i4r i5n +i4r i5m i6a +i4r i5m +i4r i5i i6n +i4r i5i i6c +i4r i5i i6a +i4r i5i +i4r i5e i6a +i4r i5e i61 +i4r i5e +i4r i5d i6o +i4r i5d +i4r i5a i61 +i4r i5a +i4r i52 +i4r i51 i69 +i4r i51 i62 +i4r i51 +i4r +i4q +i4p i5o +i4p i5i +i4p i5e i6r +i4p i5e +i4p i5a +i4p +i4o i5y i61 +i4o i5y +i4o i5w i61 +i4o i5w +i4o i5v i6e +i4o i5v +i4o i5u +i4o i5t +i4o i5s i61 +i4o i5s +i4o i5r i61 +i4o i5r +i4o i5p +i4o i5o i6n +i4o i5o i61 +i4o i5o +i4o i5n i6s +i4o i5n i6e +i4o i5n i6d +i4o i5n i6a +i4o i5n i69 +i4o i5n i62 +i4o i5n i61 +i4o i5n i60 +i4o i5n +i4o i5m i6e +i4o i5m i6a +i4o i5m i61 +i4o i5m +i4o i5l i6a +i4o i5l i61 +i4o i5l +i4o i5k +i4o i5g +i4o i5d +i4o i5c i6k +i4o i5c +i4o i59 +i4o i52 i60 +i4o i52 +i4o i51 i69 +i4o i51 i62 +i4o i51 +i4o +i4n i5t i6i +i4n i5t +i4n i5s +i4n i5o i61 +i4n i5o +i4n i5n i6a +i4n i5n +i4n i5i i6c +i4n i5i +i4n i5h +i4n i5g i61 +i4n i5g +i4n i5e i6s +i4n i5e i61 +i4n i5e +i4n i5d i6a +i4n i5d +i4n i5c +i4n i5a i62 +i4n i5a i61 +i4n i5a +i4n i52 i60 +i4n i52 +i4n i51 i69 +i4n i51 i62 +i4n i51 i61 +i4n i51 i60 +i4n i51 +i4n i50 +i4n +i4m i5o i6n +i4m i5o +i4m i5i i6n +i4m i5i +i4m i5e i61 +i4m i5e +i4m i5a i6s +i4m i5a i6r +i4m i5a i6n +i4m i5a i61 +i4m i5a +i4m i51 +i4m +i4l i5y i61 +i4l i5y +i4l i5u +i4l i5o i6v +i4l i5o i61 +i4l i5o +i4l i5l i6e +i4l i5l i6a +i4l i5l +i4l i5i i6n +i4l i5i i6f +i4l i5i i6e +i4l i5i i6a +i4l i5i +i4l i5e i6y +i4l i5e i6s +i4l i5e i6r +i4l i5e i61 +i4l i5e +i4l i5d +i4l i5a i6s +i4l i5a i6n +i4l i5a i61 +i4l i5a +i4l i51 i62 +i4l i51 +i4l +i4k i5y +i4k i5o +i4k i5i i6n +i4k i5i +i4k i5e i6r +i4k i5e i61 +i4k i5e +i4k i5a i61 +i4k i5a +i4k i51 i62 +i4k i51 +i4k +i4j i5o +i4j i5a +i4j +i4i i5t i6o +i4i i5t i6a +i4i i5t i61 +i4i i5t +i4i i5s i61 +i4i i5s +i4i i5r i6e +i4i i5r +i4i i5o i6n +i4i i5o i61 +i4i i5o +i4i i5n i6h +i4i i5n i6g +i4i i5n i6e +i4i i5n i6a +i4i i5n i62 +i4i i5n i61 +i4i i5n +i4i i5m +i4i i5l i6l +i4i i5l +i4i i5k +i4i i5g i6h +i4i i5g +i4i i5e i6s +i4i i5e i6r +i4i i5e i6l +i4i i5e i69 +i4i i5e i62 +i4i i5e i61 +i4i i5e i60 +i4i i5e +i4i i5d +i4i i5c i6k +i4i i5c i6e +i4i i5c i6a +i4i i5c +i4i i5a i6n +i4i i5a i61 +i4i i5a +i4i i51 i62 +i4i i51 +i4i +i4h i5o +i4h i5i i6n +i4h i5i +i4h i5e i6r +i4h i5e i6a +i4h i5e +i4h i5a i6n +i4h i5a i61 +i4h i5a +i4h i51 i62 +i4h i51 +i4h +i4g i5o +i4g i5i i6r +i4g i5i +i4g i5e i6r +i4g i5e +i4g i5a +i4g +i4f i5o +i4f i5i +i4f i5a +i4f +i4e i5y i6o +i4e i5y i62 +i4e i5y i61 +i4e i5y +i4e i5w +i4e i5v i6e +i4e i5v +i4e i5t i6t +i4e i5t i61 +i4e i5t +i4e i5s i6t +i4e i5s i6s +i4e i5s i62 +i4e i5s i61 +i4e i5s +i4e i5r i6t +i4e i5r i6s +i4e i5r i6o +i4e i5r i6m +i4e i5r i6i +i4e i5r i6b +i4e i5r i6a +i4e i5r i69 +i4e i5r i68 +i4e i5r i67 +i4e i5r i66 +i4e i5r i65 +i4e i5r i64 +i4e i5r i63 +i4e i5r i62 +i4e i5r i61 +i4e i5r i60 +i4e i5r +i4e i5p +i4e i5n i6t +i4e i5n i6s +i4e i5n i62 +i4e i5n i61 +i4e i5n +i4e i5m i6a +i4e i5m +i4e i5l i6o +i4e i5l i6l +i4e i5l i6i +i4e i5l i6a +i4e i5l i62 +i4e i5l i61 +i4e i5l +i4e i5k +i4e i5i +i4e i5e i61 +i4e i5e +i4e i5d i61 +i4e i5d +i4e i5c +i4e i5b +i4e i5a +i4e i59 +i4e i53 +i4e i52 i60 +i4e i52 +i4e i51 i69 +i4e i51 i62 +i4e i51 i61 +i4e i51 i60 +i4e i51 +i4e i50 +i4e +i4d i5y +i4d i5r +i4d i5o i6n +i4d i5o i6m +i4d i5o i6g +i4d i5o +i4d i5i +i4d i5e i6r +i4d i5e +i4d i5a i61 +i4d i5a +i4d i51 i62 +i4d i51 +i4d +i4c i5o +i4c i5k +i4c i5i +i4c i5h i6i +i4c i5h i6e +i4c i5h i6a +i4c i5h +i4c i5e i6s +i4c i5e +i4c i5a i6t +i4c i5a i61 +i4c i5a +i4c +i4b i5u +i4b i5o i6y +i4b i5o +i4b i5l +i4b i5i +i4b i5e i6r +i4b i5e i6a +i4b i5e +i4b i5a i6l +i4b i5a +i4b +i4a i5y i61 +i4a i5y +i4a i5t i61 +i4a i5t +i4a i5s i6t +i4a i5s i6s +i4a i5s i6h +i4a i5s i61 +i4a i5s +i4a i5r i6i +i4a i5r i6d +i4a i5r i6a +i4a i5r i61 +i4a i5r +i4a i5p +i4a i5n i6t +i4a i5n i6o +i4a i5n i6n +i4a i5n i6i +i4a i5n i6g +i4a i5n i6d +i4a i5n i6a +i4a i5n i69 +i4a i5n i62 +i4a i5n i61 +i4a i5n i60 +i4a i5n +i4a i5m i6e +i4a i5m i6a +i4a i5m i61 +i4a i5m +i4a i5l i6o +i4a i5l i6l +i4a i5l i6e +i4a i5l i61 +i4a i5l +i4a i5k +i4a i5i +i4a i5h i61 +i4a i5h +i4a i5g i6e +i4a i5g +i4a i5e i6l +i4a i5e +i4a i5d i6o +i4a i5d +i4a i5c +i4a i5b +i4a i5a +i4a i59 +i4a i52 i60 +i4a i52 +i4a i51 i69 +i4a i51 i62 +i4a i51 i61 +i4a i51 i60 +i4a i51 +i4a i50 +i4a +i4` +i4_ +i4^ +i4] +i4[ +i4Z +i4Y +i4X +i4W +i4V +i4U +i4T +i4S +i4R +i4Q +i4P +i4O +i4N +i4M +i4L +i4K +i4J +i4I +i4H +i4G +i4F +i4E +i4D +i4C +i4B +i4A +i4@ +i4? +i4= +i4< +i4; +i4: +i49 i59 i69 +i49 i59 i68 +i49 i59 i67 +i49 i59 i66 +i49 i59 i65 +i49 i59 +i49 i58 i67 +i49 i58 +i49 i57 +i49 i56 +i49 i55 +i49 i54 +i49 i53 +i49 i52 +i49 i51 +i49 i50 +i49 +i48 i59 +i48 i58 +i48 i57 +i48 i56 +i48 i55 +i48 i54 +i48 i53 +i48 i52 +i48 i51 +i48 i50 +i48 +i47 i59 +i47 i58 i69 +i47 i58 +i47 i57 i67 +i47 i57 +i47 i56 +i47 i55 +i47 i54 +i47 i53 +i47 i52 +i47 i51 +i47 i50 +i47 +i46 i59 +i46 i58 +i46 i57 +i46 i56 i66 +i46 i56 +i46 i55 +i46 i54 +i46 i53 +i46 i52 +i46 i51 +i46 i50 +i46 +i45 i59 +i45 i58 +i45 i57 +i45 i56 i67 +i45 i56 +i45 i55 i65 +i45 i55 +i45 i54 +i45 i53 +i45 i52 +i45 i51 +i45 i50 +i45 +i44 i59 +i44 i58 +i44 i57 +i44 i56 +i44 i55 i66 +i44 i55 +i44 i54 +i44 i53 i62 +i44 i53 +i44 i52 +i44 i51 +i44 i50 +i44 +i43 i59 +i43 i58 +i43 i57 +i43 i56 +i43 i55 +i43 i54 i65 +i43 i54 +i43 i53 +i43 i52 i61 +i43 i52 +i43 i51 +i43 i50 +i43 +i42 i59 +i42 i58 +i42 i57 +i42 i56 +i42 i55 i62 +i42 i55 +i42 i54 +i42 i53 i64 +i42 i53 i61 +i42 i53 +i42 i52 i62 +i42 i52 +i42 i51 i62 +i42 i51 i61 +i42 i51 i60 +i42 i51 +i42 i50 i61 +i42 i50 i60 +i42 i50 +i42 +i41 i59 i69 +i41 i59 i68 +i41 i59 i67 +i41 i59 i66 +i41 i59 i65 +i41 i59 +i41 i58 +i41 i57 +i41 i56 +i41 i55 +i41 i54 +i41 i53 i61 +i41 i53 +i41 i52 i63 +i41 i52 i62 +i41 i52 i61 +i41 i52 i60 +i41 i52 +i41 i51 i62 +i41 i51 i61 +i41 i51 i60 +i41 i51 +i41 i50 i62 +i41 i50 i61 +i41 i50 i60 +i41 i50 +i41 +i40 i59 +i40 i58 +i40 i57 +i40 i56 +i40 i55 +i40 i54 +i40 i53 +i40 i52 i60 +i40 i52 +i40 i51 i62 +i40 i51 i61 +i40 i51 i60 +i40 i51 +i40 i50 i67 +i40 i50 i61 +i40 i50 i60 +i40 i50 +i40 +i4/ +i4. +i4- +i4, +i4+ +i4* +i4) +i4( +i4' +i4& +i4% +i4$ +i4# +i4" +i4! +i4 +i3~ +i3|x33 +i3| +i3z i4y +i3z i4e +i3z i4a +i3z +i3y i4e +i3y i4b +i3y i4a +i3y i41 i52 +i3y i41 +i3y +i3x i4a i5n +i3x +i3w i4e i5r +i3w i4e +i3w i4a +i3w +i3v i4i +i3v i4e i5y +i3v i4e i5s +i3v i4e i5r +i3v i4e i5n +i3v i4e i5m +i3v i4e +i3v i4a +i3v +i3u i4t i5o +i3u i4t +i3u i4s +i3u i4r i5a +i3u i4r +i3u i4n +i3u i4l +i3u i4k i5e +i3u i4k +i3u i4e i5l +i3u i4e +i3u +i3t i4y i51 +i3t i4y +i3t i4u +i3t i4t +i3t i4s +i3t i4r i5o +i3t i4r +i3t i4o i5r +i3t i4o i5n +i3t i4o +i3t i4l i5e +i3t i4l +i3t i4i i5n +i3t i4i i5e +i3t i4i +i3t i4h i5e +i3t i4h +i3t i4e i5r +i3t i4e i5n +i3t i4e +i3t i4b i5a +i3t i4a i5r +i3t i4a i5n +i3t i4a +i3t i41 i52 +i3t i41 +i3t +i3s i4y +i3s i4w i5o +i3s i4w +i3s i4u +i3s i4t i5o +i3s i4t i5i +i3s i4t i5e +i3s i4t i5a +i3s i4t +i3s i4s +i3s i4o i5n +i3s i4o +i3s i4i i5e +i3s i4i +i3s i4h i5i +i3s i4h i5a +i3s i4h +i3s i4e i5r +i3s i4e +i3s i4a i5n +i3s i4a +i3s i41 i52 +i3s i41 +i3s +i3r i4y +i3r i4t i5y +i3r i4t +i3r i4r +i3r i4o i5n +i3r i4o +i3r i4l +i3r i4k +i3r i4i i5s +i3r i4i i5n +i3r i4i i5e +i3r i4i i5c +i3r i4i +i3r i4e i5t +i3r i4e i5s +i3r i4e i5n +i3r i4e +i3r i4d +i3r i4a i5n +i3r i4a i51 +i3r i4a +i3r i41 i52 +i3r i41 +i3r +i3q +i3p i4y +i3p i4p +i3p i4o +i3p i4l i5e +i3p i4l +i3p i4i i5e +i3p i4i +i3p i4h +i3p i4e i5r +i3p i4e +i3p i4a +i3p +i3o i4v i5e +i3o i4v +i3o i4u +i3o i4t +i3o i4s +i3o i4r +i3o i4p +i3o i4o +i3o i4n i5i +i3o i4n i5e +i3o i4n i51 +i3o i4n +i3o i4m i5e +i3o i4m i5a +i3o i4m +i3o i4l i5o +i3o i4l i5i +i3o i4l i5e +i3o i4l i5a +i3o i4l +i3o i4k +i3o i4d +i3o i4c +i3o i4b +i3o i42 i50 +i3o i42 +i3o i41 i59 +i3o i41 i52 +i3o i41 +i3o +i3n i4y i51 +i3n i4y +i3n i4t +i3n i4s +i3n i4o +i3n i4n i5a +i3n i4n +i3n i4k +i3n i4i i5s +i3n i4i i5e +i3n i4i +i3n i4g i5e +i3n i4g +i3n i4e i5y +i3n i4e i5s +i3n i4e i5r +i3n i4e i51 +i3n i4e +i3n i4d i5o +i3n i4d i5e +i3n i4d i5a +i3n i4d +i3n i4c i5e +i3n i4c +i3n i4a i5r +i3n i4a i5n +i3n i4a i51 +i3n i4a +i3n i41 i59 +i3n i41 i52 +i3n i41 +i3n +i3m i4y +i3m i4o i5n +i3m i4o +i3m i4i i5n +i3m i4i +i3m i4e i5r +i3m i4e i5n +i3m i4e +i3m i4a i5s +i3m i4a i5r +i3m i4a i5n +i3m i4a +i3m +i3l i4y i51 +i3l i4y +i3l i4s +i3l i4o i5w +i3l i4o i5v +i3l i4o i5s +i3l i4o i5r +i3l i4o i5n +i3l i4o i51 +i3l i4o +i3l i4l i5e +i3l i4l +i3l i4i i5n +i3l i4i i5e +i3l i4i i5a +i3l i4i +i3l i4e i5y +i3l i4e i5t +i3l i4e i5s +i3l i4e i5r +i3l i4e i5n +i3l i4e i51 +i3l i4e +i3l i4a i5n +i3l i4a i51 +i3l i4a +i3l i41 i52 +i3l i41 +i3l +i3k i4y i51 +i3k i4y +i3k i4s +i3k i4o +i3k i4i i5n +i3k i4i i5e +i3k i4i +i3k i4e i5y +i3k i4e i5t +i3k i4e i5r +i3k i4e i5n +i3k i4e +i3k i4a i51 +i3k i4a +i3k i41 i52 +i3k i41 +i3k +i3j i4a +i3j +i3i i4t i5o +i3i i4t i5a +i3i i4t +i3i i4s i5t +i3i i4s i5s +i3i i4s i5h +i3i i4s i51 +i3i i4s +i3i i4r +i3i i4p +i3i i4o i5n +i3i i4o +i3i i4n i5o +i3i i4n i5i +i3i i4n i5h +i3i i4n i5g +i3i i4n i5e +i3i i4n i5a +i3i i4n i51 +i3i i4n +i3i i4m i5a +i3i i4m +i3i i4l i5o +i3i i4l i5l +i3i i4l i5a +i3i i4l +i3i i4k i5a +i3i i4k +i3i i4g +i3i i4e i5r +i3i i4e i5l +i3i i4e i51 +i3i i4e +i3i i4d +i3i i4c i5a +i3i i4c +i3i i4a i5n +i3i i4a i51 +i3i i4a +i3i i42 +i3i i41 i59 +i3i i41 i52 +i3i i41 +i3i +i3h i4u +i3h i4t +i3h i4o i5n +i3h i4o +i3h i4i +i3h i4e i5r +i3h i4e i5l +i3h i4e +i3h i4a i5r +i3h i4a i5n +i3h i4a i5e +i3h i4a +i3h +i3g i4u +i3g i4o i5n +i3g i4o +i3g i4l i5e +i3g i4l +i3g i4i i5e +i3g i4i +i3g i4h i5t +i3g i4h +i3g i4e i5r +i3g i4e +i3g i4a i5n +i3g i4a +i3g +i3f i4i +i3f i4f +i3f i4e +i3f i4a i5n +i3f i4a +i3f +i3e i4y i51 +i3e i4y +i3e i4t i5a +i3e i4t +i3e i4s i5t +i3e i4s i51 +i3e i4s +i3e i4r i5t +i3e i4r i5s +i3e i4r i5o +i3e i4r i5n +i3e i4r i5m +i3e i4r i5i +i3e i4r i5a +i3e i4r i52 +i3e i4r i51 +i3e i4r +i3e i4p +i3e i4n i5t +i3e i4n i5i +i3e i4n i5d +i3e i4n i5a +i3e i4n i51 +i3e i4n +i3e i4m i5o +i3e i4m i5e +i3e i4m i5a +i3e i4m +i3e i4l i5o +i3e i4l i5l +i3e i4l i5i +i3e i4l i5e +i3e i4l i5a +i3e i4l i51 +i3e i4l +i3e i4k +i3e i4i +i3e i4f +i3e i4e +i3e i4d i5o +i3e i4d +i3e i4c +i3e i4b i5o +i3e i4b i5a +i3e i4b +i3e i4a +i3e i42 i50 +i3e i42 +i3e i41 i59 +i3e i41 i52 +i3e i41 +i3e +i3d i4y i51 +i3d i4y +i3d i4s +i3d i4r i5a +i3d i4r +i3d i4o i5w +i3d i4o i5g +i3d i4o +i3d i4l i5e +i3d i4l +i3d i4i i5e +i3d i4i +i3d i4e i5r +i3d i4e i5n +i3d i4e +i3d i4a i5n +i3d i4a i51 +i3d i4a +i3d i41 i52 +i3d i41 +i3d +i3c i4o +i3c i4k i5e +i3c i4k +i3c i4i +i3c i4h i5i +i3c i4h i5e +i3c i4h i5a +i3c i4h +i3c i4e i5r +i3c i4e i5l +i3c i4e +i3c i4a i5t +i3c i4a +i3c +i3b i4y +i3b i4u +i3b i4o i5y +i3b i4o +i3b i4l i5e +i3b i4l +i3b i4i i5e +i3b i4i +i3b i4e i5r +i3b i4e +i3b i4a +i3b +i3a i4y +i3a i4t i5o +i3a i4t i5e +i3a i4t i5a +i3a i4t +i3a i4s i5t +i3a i4s i5s +i3a i4s i5h +i3a i4s i5d +i3a i4s i51 +i3a i4s +i3a i4r i5o +i3a i4r i5i +i3a i4r i5d +i3a i4r i5a +i3a i4r i51 +i3a i4r +i3a i4p +i3a i4n i5t +i3a i4n i5o +i3a i4n i5n +i3a i4n i5i +i3a i4n i5g +i3a i4n i5e +i3a i4n i5d +i3a i4n i5a +i3a i4n i52 +i3a i4n i51 +i3a i4n +i3a i4m i5o +i3a i4m i5i +i3a i4m i5e +i3a i4m i5a +i3a i4m +i3a i4l i5l +i3a i4l i5i +i3a i4l i5d +i3a i4l i5a +i3a i4l +i3a i4k +i3a i4i +i3a i4h +i3a i4g +i3a i4d i5o +i3a i4d i5a +i3a i4d +i3a i4c i5h +i3a i4c +i3a i4b +i3a i42 i50 +i3a i42 +i3a i41 i59 +i3a i41 i52 +i3a i41 +i3a +i3` +i3_ +i3^ +i3] +i3[ +i3Z +i3Y +i3X +i3W +i3V +i3U +i3T +i3S +i3R +i3Q +i3P +i3O +i3N +i3M +i3L +i3K +i3J +i3I +i3H +i3G +i3F +i3E +i3D +i3C +i3B +i3A +i3@ +i3? +i3= +i3; +i39 i49 i59 +i39 i49 +i39 i48 i57 +i39 i48 +i39 i47 +i39 i46 +i39 i45 +i39 i44 +i39 i43 +i39 i42 +i39 i41 i59 +i39 i41 +i39 i40 +i39 +i38 i49 +i38 i48 +i38 i47 +i38 i46 +i38 i45 i52 +i38 i45 +i38 i44 +i38 i43 +i38 i42 +i38 i41 i59 +i38 i41 +i38 i40 +i38 +i37 i49 +i37 i48 i59 +i37 i48 +i37 i47 +i37 i46 +i37 i45 i53 +i37 i45 +i37 i44 +i37 i43 +i37 i42 +i37 i41 i59 +i37 i41 +i37 i40 +i37 +i36 i49 +i36 i48 +i36 i47 +i36 i46 i56 +i36 i46 +i36 i45 i54 +i36 i45 +i36 i44 +i36 i43 +i36 i42 +i36 i41 i59 +i36 i41 +i36 i40 +i36 +i35 i49 +i35 i48 +i35 i47 +i35 i46 +i35 i45 +i35 i44 +i35 i43 +i35 i42 i50 +i35 i42 +i35 i41 i59 +i35 i41 +i35 i40 +i35 +i34 i49 +i34 i48 +i34 i47 +i34 i46 +i34 i45 i56 +i34 i45 +i34 i44 +i34 i43 +i34 i42 i50 +i34 i42 +i34 i41 i59 +i34 i41 +i34 i40 +i34 +i33 i49 +i33 i48 +i33 i47 +i33 i46 +i33 i45 +i33 i44 i55 +i33 i44 +i33 i43 +i33 i42 i51 +i33 i42 i50 +i33 i42 +i33 i41 i59 +i33 i41 +i33 i40 +i33 +i32 i49 +i32 i48 +i32 i47 +i32 i46 +i32 i45 +i32 i44 +i32 i43 i54 +i32 i43 i51 +i32 i43 +i32 i42 i52 +i32 i42 i50 +i32 i42 +i32 i41 i59 +i32 i41 i52 +i32 i41 i51 +i32 i41 +i32 i40 i51 +i32 i40 i50 +i32 i40 +i32 +i31 i49 i59 +i31 i49 i58 +i31 i49 i57 +i31 i49 +i31 i48 +i31 i47 +i31 i46 +i31 i45 +i31 i44 +i31 i43 +i31 i42 i53 +i31 i42 i52 +i31 i42 i51 +i31 i42 i50 +i31 i42 +i31 i41 i59 +i31 i41 i52 +i31 i41 i51 +i31 i41 +i31 i40 i52 +i31 i40 i51 +i31 i40 i50 +i31 i40 +i31 +i30 i49 +i30 i48 +i30 i47 +i30 i46 +i30 i45 +i30 i44 +i30 i43 +i30 i42 i50 +i30 i42 +i30 i41 i59 +i30 i41 i52 +i30 i41 i51 +i30 i41 i50 +i30 i41 +i30 i40 i51 +i30 i40 i50 +i30 i40 +i30 +i3/ +i3. +i3- +i3, +i3+ +i3* +i3) +i3( +i3' +i3& +i3% +i3$ +i3# +i3" +i3! +i3 +i2~ +i2|x23 +i2| +i2z i3z i4a +i2z i3z +i2z i3a +i2z +i2y i3s +i2y i3l +i2y i3a i4n +i2y i3a +i2y +i2x i3i +i2x +i2w i3e i4r +i2w i3e +i2w i3a +i2w +i2v i3i i4n +i2v i3i i4l +i2v i3i i4d +i2v i3i +i2v i3e i4r +i2v i3e i4n +i2v i3e i4m +i2v i3e i4l +i2v i3e +i2v i3a +i2v +i2u i3t +i2u i3s +i2u i3r +i2u i3n +i2u i3l +i2u i3e +i2u +i2t i3u +i2t i3t i4y +i2t i3t i4l +i2t i3t i4i +i2t i3t i4e +i2t i3t +i2t i3s +i2t i3r i4o +i2t i3r i4i +i2t i3r +i2t i3o i4r +i2t i3o i4n +i2t i3o +i2t i3m i4a +i2t i3m +i2t i3i i4n +i2t i3i +i2t i3h i4o +i2t i3h i4i +i2t i3h i4e +i2t i3h i4a +i2t i3h +i2t i3e i4r +i2t i3e +i2t i3c i4h +i2t i3c +i2t i3a i4n +i2t i3a i4l +i2t i3a +i2t +i2s i3u i4k +i2s i3u +i2s i3t i4r +i2s i3t i4o +i2s i3t i4i +i2s i3t i4e +i2s i3t i4a +i2s i3t +i2s i3s i4y +i2s i3s i4w +i2s i3s i4i +i2s i3s i4e +i2s i3s i4a +i2s i3s +i2s i3p i4e +i2s i3o i4n +i2s i3o +i2s i3m i4i +i2s i3m +i2s i3k +i2s i3i +i2s i3h i4i +i2s i3h i4a +i2s i3h +i2s i3e i4r +i2s i3e +i2s i3c +i2s i3a i4n +i2s i3a +i2s +i2r i3u i4t +i2r i3u +i2r i3t i4i +i2r i3t i4e +i2r i3t +i2r i3s i4e +i2r i3s +i2r i3r i4y +i2r i3r i4o +i2r i3r i4i +i2r i3r i4e +i2r i3r i4a +i2r i3r +i2r i3o i4n +i2r i3o i4l +i2r i3o +i2r i3n i4e +i2r i3n i4a +i2r i3n +i2r i3m i4a +i2r i3m +i2r i3l i4o +i2r i3l i4i +i2r i3l i4e +i2r i3l +i2r i3k +i2r i3i i4s +i2r i3i i4o +i2r i3i i4n +i2r i3i i4l +i2r i3i i4e +i2r i3i i4c +i2r i3i i4a +i2r i3i +i2r i3g i4e +i2r i3g +i2r i3e i4s +i2r i3e i4n +i2r i3e +i2r i3d i4a +i2r i3d +i2r i3c i4e +i2r i3c +i2r i3b +i2r i3a i4t +i2r i3a i4n +i2r i3a i4m +i2r i3a +i2r +i2q +i2p i3p i4y +i2p i3p i4e +i2p i3p +i2p i3o +i2p i3l i4e +i2p i3l +i2p i3i +i2p i3h +i2p i3e i4r +i2p i3e +i2p i3a +i2p +i2o i3w +i2o i3v i4e +i2o i3v +i2o i3u +i2o i3t +i2o i3s i4t +i2o i3s +i2o i3r +i2o i3p +i2o i3o i4d +i2o i3o +i2o i3n i4g +i2o i3n i4e +i2o i3n +i2o i3m i4a +i2o i3m +i2o i3l +i2o i3k i4i +i2o i3k i4e +i2o i3k +i2o i3g +i2o i3d +i2o i3c i4o +i2o i3c i4k +i2o i3c +i2o i3b +i2o +i2n i3y +i2n i3u +i2n i3t i4o +i2n i3t i4i +i2n i3t i4e +i2n i3t i4a +i2n i3t +i2n i3s i4t +i2n i3s +i2n i3o +i2n i3n i4y +i2n i3n i4i +i2n i3n i4e +i2n i3n i4a +i2n i3n +i2n i3k i4i +i2n i3k i4e +i2n i3k +i2n i3j i4a +i2n i3j +i2n i3i i4t +i2n i3i i4s +i2n i3i i4e +i2n i3i i4c +i2n i3i +i2n i3g i4o +i2n i3g i4e +i2n i3g i4a +i2n i3g +i2n i3e i4y +i2n i3e i4s +i2n i3e i4r +i2n i3e i41 +i2n i3e +i2n i3d i4y +i2n i3d i4r +i2n i3d i4o +i2n i3d i4i +i2n i3d i4e +i2n i3d i4a +i2n i3d +i2n i3c i4h +i2n i3c i4e +i2n i3c +i2n i3a i4t +i2n i3a i4n +i2n i3a i4m +i2n i3a i4l +i2n i3a i41 +i2n i3a +i2n i31 +i2n +i2m i3s +i2m i3p i4i +i2m i3p +i2m i3o i4n +i2m i3o +i2m i3m i4y +i2m i3m i4e +i2m i3m +i2m i3i i4n +i2m i3i i4l +i2m i3i +i2m i3e i4s +i2m i3e i4r +i2m i3e +i2m i3b i4o +i2m i3b i4e +i2m i3b i4a +i2m i3b +i2m i3a i4s +i2m i3a i4r +i2m i3a i4n +i2m i3a +i2m +i2l i3y +i2l i3v i4e +i2l i3v +i2l i3t +i2l i3s +i2l i3o +i2l i3m +i2l i3l i4y +i2l i3l i4o +i2l i3l i4i +i2l i3l i4e +i2l i3l i4a +i2l i3l +i2l i3k +i2l i3i i4t +i2l i3i i4s +i2l i3i i4p +i2l i3i i4n +i2l i3i i4e +i2l i3i i4a +i2l i3i +i2l i3f +i2l i3e i4r +i2l i3e i4n +i2l i3e +i2l i3d i4e +i2l i3d +i2l i3a i4n +i2l i3a +i2l +i2k i3u +i2k i3o +i2k i3k +i2k i3i +i2k i3e i4r +i2k i3e i4m +i2k i3e i41 +i2k i3e +i2k i3a i4s +i2k i3a +i2k +i2j i3a +i2j +i2i i3v i4e +i2i i3v +i2i i3t i4e +i2i i3t +i2i i3s i4t +i2i i3s +i2i i3r +i2i i3p +i2i i3n i4t +i2i i3n i4k +i2i i3n i4g +i2i i3n i4e +i2i i3n i4c +i2i i3n i4a +i2i i3n +i2i i3m i4e +i2i i3m i4a +i2i i3m +i2i i3l i4l +i2i i3l i4i +i2i i3l i4e +i2i i3l +i2i i3k i4e +i2i i3k +i2i i3g i4h +i2i i3g +i2i i3e i4n +i2i i3e +i2i i3d i4e +i2i i3d +i2i i3c i4k +i2i i3c +i2i i3a i4n +i2i i3a +i2i +i2h i3o +i2h i3n +i2h i3i +i2h i3a i4n +i2h i3a +i2h +i2g i3u +i2g i3o +i2g i3i +i2g i3h i4t +i2g i3h +i2g i3g i4i +i2g i3g i4e +i2g i3g +i2g i3e i4r +i2g i3e i4n +i2g i3e i4l +i2g i3e +i2g i3a i4r +i2g i3a i4n +i2g i3a +i2g +i2f i3f +i2f i3a +i2f +i2e i3x i4a +i2e i3x +i2e i3v i4e +i2e i3v +i2e i3t +i2e i3s i4t +i2e i3s +i2e i3r i4t +i2e i3r i4r +i2e i3r i4i +i2e i3r +i2e i3p +i2e i3n i4t +i2e i3n +i2e i3m i4a +i2e i3m +i2e i3l i4l +i2e i3l i4i +i2e i3l +i2e i3k +i2e i3g i4o +i2e i3g +i2e i3e i4t +i2e i3e i4n +i2e i3e i4d +i2e i3e +i2e i3d +i2e i3c +i2e i3b +i2e i3a +i2e +i2d i3y +i2d i3r i4o +i2d i3r i4i +i2d i3r i4e +i2d i3r +i2d i3o +i2d i3i +i2d i3f +i2d i3e i4r +i2d i3e +i2d i3d i4y +i2d i3d +i2d i3a +i2d +i2c i3t i4o +i2c i3o i4l +i2c i3o +i2c i3k i4y +i2c i3k i4s +i2c i3k i4i +i2c i3k i4e +i2c i3k i41 +i2c i3k +i2c i3i +i2c i3h i4o +i2c i3h i4i +i2c i3h i4e +i2c i3h i4a +i2c i3h +i2c i3e +i2c i3c i4e +i2c i3c +i2c i3a i4s +i2c i3a i4r +i2c i3a +i2c +i2b i3y +i2b i3r i4i +i2b i3r +i2b i3o +i2b i3i +i2b i3e i4r +i2b i3e +i2b i3b i4y +i2b i3b +i2b i3a +i2b +i2a i3z +i2a i3y +i2a i3v i4e +i2a i3v +i2a i3t i4h +i2a i3t i4e +i2a i3t +i2a i3s i4t +i2a i3s i4h +i2a i3s +i2a i3r i4t +i2a i3r i4l +i2a i3r i4k +i2a i3r i4i +i2a i3r i4a +i2a i3r +i2a i3p +i2a i3n i4t +i2a i3n i4n +i2a i3n i4k +i2a i3n i4i +i2a i3n i4g +i2a i3n i4e +i2a i3n i4d +i2a i3n i4c +i2a i3n i4a +i2a i3n i41 +i2a i3n +i2a i3m i4o +i2a i3m i4e +i2a i3m i4a +i2a i3m +i2a i3l i4i +i2a i3l +i2a i3k i4e +i2a i3k +i2a i3i +i2a i3g i4o +i2a i3g +i2a i3d i4o +i2a i3d i4e +i2a i3d +i2a i3c i4k +i2a i3c i4h +i2a i3c i4e +i2a i3c +i2a i3b +i2a +i2_ +i2^ +i2] +i2[ +i2Z +i2Y +i2X +i2W +i2V +i2U +i2T +i2S +i2R +i2Q +i2P +i2O +i2N +i2M +i2L +i2K +i2J +i2I +i2H +i2G +i2F +i2E +i2D +i2C +i2B +i2A +i2@ +i2? +i2= +i2; +i2: +i29 i39 +i29 i38 +i29 i37 +i29 i36 +i29 i35 +i29 i34 +i29 i33 +i29 i32 +i29 i31 +i29 i30 +i29 +i28 i39 +i28 i38 +i28 i37 +i28 i36 +i28 i35 +i28 i34 +i28 i33 +i28 i32 +i28 i31 +i28 i30 +i28 +i27 i39 +i27 i38 +i27 i37 +i27 i36 +i27 i35 +i27 i34 +i27 i33 +i27 i32 +i27 i31 +i27 i30 +i27 +i26 i39 +i26 i38 +i26 i37 +i26 i36 +i26 i35 +i26 i34 +i26 i33 +i26 i32 +i26 i31 +i26 i30 +i26 +i25 i39 +i25 i38 +i25 i37 +i25 i36 +i25 i35 +i25 i34 +i25 i33 +i25 i32 +i25 i31 +i25 i30 +i25 +i24 i38 +i24 i37 +i24 i36 +i24 i35 +i24 i34 +i24 i33 +i24 i32 +i24 i31 +i24 i30 +i24 +i23 i39 +i23 i38 +i23 i37 +i23 i36 +i23 i35 +i23 i34 i45 +i23 i34 +i23 i33 +i23 i32 +i23 i31 i42 +i23 i31 +i23 i30 +i23 +i22 i39 +i22 i38 +i22 i37 +i22 i36 +i22 i35 +i22 i34 +i22 i33 i44 +i22 i33 +i22 i32 +i22 i31 i49 +i22 i31 +i22 i30 i41 +i22 i30 i40 +i22 i30 +i22 +i21 i39 i49 +i21 i39 i48 +i21 i39 +i21 i38 +i21 i37 +i21 i36 +i21 i35 +i21 i34 +i21 i33 i41 +i21 i33 +i21 i32 i49 +i21 i32 i43 +i21 i32 i42 +i21 i32 i41 +i21 i32 i40 +i21 i32 +i21 i31 i49 +i21 i31 i42 +i21 i31 i41 +i21 i31 i40 +i21 i31 +i21 i30 i49 +i21 i30 i42 +i21 i30 i41 +i21 i30 i40 +i21 i30 +i21 +i20 i39 i49 +i20 i39 i42 +i20 i39 i41 +i20 i39 +i20 i38 i41 +i20 i38 +i20 i37 i41 +i20 i37 +i20 i36 i41 +i20 i36 +i20 i35 i42 +i20 i35 i41 +i20 i35 i40 +i20 i35 +i20 i34 i41 +i20 i34 +i20 i33 i42 +i20 i33 i41 +i20 i33 i40 +i20 i33 +i20 i32 i42 +i20 i32 i41 +i20 i32 i40 +i20 i32 +i20 i31 i49 +i20 i31 i42 +i20 i31 i41 +i20 i31 i40 +i20 i31 +i20 i30 i40 +i20 i30 +i20 +i2/ +i2. +i2- +i2, +i2+ +i2* +i2) +i2( +i2' +i2& +i2$ +i2# +i2" +i2! +i2 +i1~ +i1| +i1z i2e +i1z +i1y i2s +i1y i2r +i1y i2n +i1y i2l i3e +i1y i2l +i1y i2a +i1y +i1x i2c +i1x +i1w i2i +i1w i2e i3r +i1w i2e i3e +i1w i2e +i1w i2a +i1w +i1v i2e +i1v i2a +i1v +i1u i2z +i1u i2t i3t +i1u i2t +i1u i2s i3t +i1u i2s +i1u i2r +i1u i2p i3e +i1u i2p +i1u i2n i3t +i1u i2n i3n +i1u i2n i3i +i1u i2n i3e +i1u i2n +i1u i2m i3m +i1u i2m i3b +i1u i2m +i1u i2l i3l +i1u i2l i3i +i1u i2l +i1u i2k +i1u i2i +i1u i2g +i1u i2f i3f +i1u i2f +i1u i2e +i1u i2d i3d +i1u i2d +i1u i2c i3k +i1u i2c i3a +i1u i2c +i1u i2b i3b +i1u i2b +i1u i2a i3n +i1u i2a +i1u +i1t i2u +i1t i2r +i1t i2o +i1t i2i +i1t i2h +i1t i2e +i1t i2a i3r +i1t i2a +i1t +i1s i2t +i1s i2s +i1s i2p +i1s i2i +i1s i2h +i1s i2d i3f +i1s i2d +i1s i2c +i1s i2a +i1s +i1r i2y +i1r i2u i3n +i1r i2u +i1r i2t +i1r i2o i3n +i1r i2o +i1r i2m +i1r i2i i3s +i1r i2i i3n +i1r i2i i3e +i1r i2i i3c +i1r i2i i3a +i1r i2i +i1r i2e i3s +i1r i2e i3n +i1r i2e i3e +i1r i2e i3d +i1r i2e i3a +i1r i2e +i1r i2c +i1r i2a i3z +i1r i2a i3n +i1r i2a i3g +i1r i2a i3c +i1r i2a +i1r +i1q i2u +i1q +i1p i2r +i1p i2p +i1p i2o +i1p i2i +i1p i2e +i1p i2a i3r +i1p i2a +i1p +i1o i2y +i1o i2x +i1o i2w i3e +i1o i2w +i1o i2v i3e +i1o i2v +i1o i2u i3r +i1o i2u i3n +i1o i2u i3l +i1o i2u +i1o i2t i3t +i1o i2t i3o +i1o i2t i3h +i1o i2t +i1o i2s i3t +i1o i2s i3h +i1o i2s i3e +i1o i2s +i1o i2r i3t +i1o i2r i3r +i1o i2r i3n +i1o i2r i3i +i1o i2r i3g +i1o i2r i3e +i1o i2r i3d +i1o i2r i3a +i1o i2r +i1o i2p i3p +i1o i2p +i1o i2o i3t +i1o i2o i3p +i1o i2o i3n +i1o i2o i3m +i1o i2o i3l +i1o i2o i3k +i1o i2o i3d +i1o i2o i3b +i1o i2o +i1o i2n i3y +i1o i2n i3t +i1o i2n i3s +i1o i2n i3n +i1o i2n i3k +i1o i2n i3i +i1o i2n i3g +i1o i2n i3e +i1o i2n i3d +i1o i2n i3a +i1o i2n +i1o i2m i3p +i1o i2m i3o +i1o i2m i3m +i1o i2m i3i +i1o i2m i3e +i1o i2m i3b +i1o i2m i3a +i1o i2m +i1o i2l i3o +i1o i2l i3l +i1o i2l i3i +i1o i2l i3f +i1o i2l i3e +i1o i2l i3d +i1o i2l i3a +i1o i2l +i1o i2k i3o +i1o i2k i3i +i1o i2k i3e +i1o i2k +i1o i2j +i1o i2i +i1o i2h i3n +i1o i2h i3a +i1o i2h +i1o i2g +i1o i2f +i1o i2e +i1o i2d +i1o i2c i3o +i1o i2c i3k +i1o i2c +i1o i2b i3o +i1o i2b i3i +i1o i2b i3e +i1o i2b i3b +i1o i2b +i1o i2a +i1o +i1n i2u +i1n i2t +i1n i2o +i1n i2n +i1n i2i i3m +i1n i2i +i1n i2g i3e +i1n i2g +i1n i2e +i1n i2d i3r +i1n i2d i3e +i1n i2d +i1n i2a +i1n +i1m i2o +i1m i2m +i1m i2i i3l +i1m i2i +i1m i2e +i1m i2b +i1m i2a i3r +i1m i2a i3n +i1m i2a +i1m +i1l i2y +i1l i2u i3e +i1l i2u +i1l i2o i3v +i1l i2o i3o +i1l i2o +i1l i2m +i1l i2l +i1l i2i +i1l i2e i3x +i1l i2e +i1l i2d +i1l i2b +i1l i2a i3y +i1l i2a i3s +i1l i2a i3n +i1l i2a i3m +i1l i2a i3d +i1l i2a i3c +i1l i2a +i1l +i1k i2y +i1k i2o +i1k i2i +i1k i2a +i1k +i1j +i1i i2z i3z +i1i i2z +i1i i2v i3e +i1i i2v +i1i i2t i3t +i1i i2t +i1i i2s i3t +i1i i2s i3s +i1i i2s i3h +i1i i2s +i1i i2r i3e +i1i i2r i3a +i1i i2r +i1i i2p i3p +i1i i2p +i1i i2o i3n +i1i i2o +i1i i2n i3t +i1i i2n i3o +i1i i2n i3n +i1i i2n i3k +i1i i2n i3i +i1i i2n i3g +i1i i2n i3e +i1i i2n i3d +i1i i2n i3a +i1i i2n +i1i i2m i3p +i1i i2m i3o +i1i i2m i3m +i1i i2m +i1i i2l i3v +i1i i2l i3l +i1i i2l i3i +i1i i2l i3e +i1i i2l i3a +i1i i2l +i1i i2k i3o +i1i i2k i3i +i1i i2k i3e +i1i i2k i3a +i1i i2k +i1i i2j +i1i i2g i3h +i1i i2g i3g +i1i i2g i3e +i1i i2g +i1i i2f +i1i i2e i3r +i1i i2e +i1i i2d +i1i i2c i3o +i1i i2c i3k +i1i i2c i3h +i1i i2c +i1i i2b +i1i i2a i3n +i1i i2a +i1i +i1h i2u +i1h i2r i3i +i1h i2r +i1h i2o +i1h i2i i3t +i1h i2i i3n +i1h i2i i3l +i1h i2i i3c +i1h i2i +i1h i2e i3r +i1h i2e i3l +i1h i2e i3e +i1h i2e +i1h i2a i3t +i1h i2a i3r +i1h i2a i3n +i1h i2a i3m +i1h i2a i3d +i1h i2a +i1h +i1g i2u +i1g +i1f +i1e i2y +i1e i2x i3y +i1e i2x +i1e i2w +i1e i2v i3i +i1e i2v i3e +i1e i2v +i1e i2u +i1e i2t i3e +i1e i2t i3a +i1e i2t +i1e i2s i3t +i1e i2s i3s +i1e i2s +i1e i2r i3t +i1e i2r i3r +i1e i2r i3o +i1e i2r i3n +i1e i2r i3m +i1e i2r i3i +i1e i2r i3e +i1e i2r i3a +i1e i2r +i1e i2p +i1e i2o i3n +i1e i2o +i1e i2n i3t +i1e i2n i3n +i1e i2n i3i +i1e i2n i3e +i1e i2n i3d +i1e i2n i3a +i1e i2n +i1e i2m i3o +i1e i2m +i1e i2l i3l +i1e i2l i3i +i1e i2l i3e +i1e i2l +i1e i2k +i1e i2i +i1e i2h +i1e i2g i3a +i1e i2g +i1e i2f +i1e i2e +i1e i2d i3r +i1e i2d +i1e i2c +i1e i2b +i1e i2a i3t +i1e i2a i3r +i1e i2a i3n +i1e i2a i3d +i1e i2a +i1e +i1d i2r +i1d i2o +i1d i2i +i1d i2e +i1d i2a +i1d +i1c i2o +i1c i2h +i1c i2e +i1c i2a +i1c +i1b i2o +i1b i2c +i1b i2a +i1b +i1a i2z +i1a i2y i3l +i1a i2y i3a +i1a i2y +i1a i2x +i1a i2w +i1a i2v i3i +i1a i2v i3e +i1a i2v i3a +i1a i2v +i1a i2u i3r +i1a i2u i3l +i1a i2u +i1a i2t i3t +i1a i2t i3r +i1a i2t i3o +i1a i2t i3i +i1a i2t i3h +i1a i2t i3e +i1a i2t i3a +i1a i2t +i1a i2s i3u +i1a i2s i3t +i1a i2s i3s +i1a i2s i3o +i1a i2s i3i +i1a i2s i3h +i1a i2s i3e +i1a i2s i3a +i1a i2s +i1a i2r i3u +i1a i2r i3t +i1a i2r i3s +i1a i2r i3r +i1a i2r i3o +i1a i2r i3m +i1a i2r i3l +i1a i2r i3k +i1a i2r i3i +i1a i2r i3e +i1a i2r i3d +i1a i2r i3c +i1a i2r i3a +i1a i2r +i1a i2p i3p +i1a i2p i3a +i1a i2p +i1a i2o +i1a i2n i3u +i1a i2n i3t +i1a i2n i3s +i1a i2n i3o +i1a i2n i3n +i1a i2n i3k +i1a i2n i3i +i1a i2n i3g +i1a i2n i3e +i1a i2n i3d +i1a i2n i3c +i1a i2n i3a +i1a i2n +i1a i2m i3s +i1a i2m i3p +i1a i2m i3o +i1a i2m i3m +i1a i2m i3i +i1a i2m i3e +i1a i2m i3b +i1a i2m i3a +i1a i2m +i1a i2l i3o +i1a i2l i3l +i1a i2l i3i +i1a i2l i3e +i1a i2l i3a +i1a i2l +i1a i2k i3u +i1a i2k i3e +i1a i2k i3a +i1a i2k +i1a i2j +i1a i2i i3n +i1a i2i i3l +i1a i2i +i1a i2h i3a +i1a i2h +i1a i2g i3a +i1a i2g +i1a i2f +i1a i2e +i1a i2d i3i +i1a i2d i3e +i1a i2d i3d +i1a i2d i3a +i1a i2d +i1a i2c i3o +i1a i2c i3k +i1a i2c i3h +i1a i2c i3a +i1a i2c +i1a i2b i3y +i1a i2b i3r +i1a i2b i3i +i1a i2b i3b +i1a i2b i3a +i1a i2b +i1a i2a +i1a i21 +i1a +i1` +i1_ +i1] +i1[ +i1Z +i1Y +i1X +i1W +i1V +i1U +i1T +i1S +i1R +i1Q +i1P +i1O +i1N +i1M +i1L +i1K +i1J +i1I +i1H +i1G +i1F +i1E +i1D +i1C +i1B +i1A i2R +i1A +i1@ +i1? +i1= +i1< +i1; +i1: +i19 i29 +i19 i28 +i19 i27 +i19 i26 +i19 i25 +i19 i24 +i19 i23 +i19 i22 +i19 i21 +i19 i20 +i19 +i18 i29 +i18 i28 +i18 i27 +i18 i26 +i18 i25 +i18 i24 +i18 i23 +i18 i22 +i18 i21 +i18 i20 +i18 +i17 i29 +i17 i28 +i17 i27 +i17 i26 +i17 i25 +i17 i24 +i17 i23 +i17 i22 +i17 i21 +i17 i20 +i17 +i16 i29 +i16 i28 +i16 i27 +i16 i26 +i16 i25 +i16 i24 +i16 i23 +i16 i22 +i16 i21 +i16 i20 +i16 +i15 i29 +i15 i28 +i15 i27 +i15 i26 +i15 i25 +i15 i24 +i15 i23 +i15 i22 +i15 i21 +i15 i20 +i15 +i14 i29 +i14 i28 +i14 i27 +i14 i26 +i14 i25 +i14 i24 +i14 i23 +i14 i22 +i14 i21 +i14 i20 +i14 +i13 i29 +i13 i28 +i13 i27 +i13 i26 +i13 i25 +i13 i24 +i13 i23 +i13 i22 +i13 i21 +i13 i20 +i13 +i12 i29 +i12 i28 +i12 i27 +i12 i26 +i12 i25 +i12 i24 +i12 i23 i34 +i12 i23 i31 +i12 i23 +i12 i22 +i12 i21 i32 +i12 i21 +i12 i20 +i12 +i11 i29 +i11 i28 +i11 i27 +i11 i26 +i11 i25 +i11 i24 +i11 i23 +i11 i22 i33 +i11 i22 i32 +i11 i22 i31 +i11 i22 +i11 i21 i32 +i11 i21 i31 +i11 i21 +i11 i20 i32 +i11 i20 i31 +i11 i20 +i11 +i10 i29 +i10 i28 +i10 i27 +i10 i26 +i10 i25 +i10 i24 +i10 i23 +i10 i22 +i10 i21 i32 +i10 i21 i31 +i10 i21 i30 +i10 i21 +i10 i20 i32 +i10 i20 i31 +i10 i20 i30 +i10 i20 +i10 +i1/ +i1. +i1- +i1, +i1+ +i1* +i1) +i1( +i1' +i1& +i1% +i1$ +i1# +i1" +i1! +i1 +i0~ +i0| +i0z i1x +i0z i1o +i0z i1i +i0z i1e +i0z i1a +i0z +i0y i1u +i0y i1o i2u +i0y i1o +i0y i1e +i0y i1a +i0y +i0x +i0w i1o i2l +i0w i1o +i0w i1i i2n +i0w i1i i2l +i0w i1i +i0w i1h +i0w i1e i2r +i0w i1e +i0w i1a i2r +i0w i1a +i0w +i0v i1o +i0v i1i +i0v i1e i2r +i0v i1e +i0v i1a i2n +i0v i1a i2l +i0v i1a +i0v +i0u i1n +i0u +i0t i1y +i0t i1w +i0t i1u +i0t i1r i2i +i0t i1r i2e +i0t i1r i2a +i0t i1r +i0t i1o i2n +i0t i1o i2m +i0t i1o +i0t i1i i2n +i0t i1i i2m +i0t i1i i2g +i0t i1i +i0t i1h i2e +i0t i1h +i0t i1e i2r +i0t i1e +i0t i1a i2n +i0t i1a +i0t +i0s i1y +i0s i1w +i0s i1u i2p +i0s i1u i2n +i0s i1u +i0s i1t i2r +i0s i1t i2e +i0s i1t i2a +i0s i1t +i0s i1p i2o +i0s i1p i2i +i0s i1p i2e +i0s i1p i2a +i0s i1p +i0s i1o i2u +i0s i1o i2n +i0s i1o i2l +i0s i1o +i0s i1n i2o +i0s i1n +i0s i1m +i0s i1l +i0s i1k +i0s i1i i2m +i0s i1i i2l +i0s i1i +i0s i1h i2o +i0s i1h i2i +i0s i1h i2e +i0s i1h i2a +i0s i1h +i0s i1e i2x +i0s i1e i2r +i0s i1e +i0s i1c i2o +i0s i1c i2h +i0s i1c +i0s i1a i2s +i0s i1a i2r +i0s i1a i2n +i0s i1a i2m +i0s i1a i2l +i0s i1a +i0s +i0r i1y +i0r i1u +i0r i1o i2s +i0r i1o i2m +i0r i1o i2c +i0r i1o i2b +i0r i1o +i0r i1i i2c +i0r i1i +i0r i1e i2n +i0r i1e i2d +i0r i1e +i0r i1a i2n +i0r i1a i2m +i0r i1a i2i +i0r i1a +i0r +i0q i1w i2e +i0q i1w +i0q i1u +i0q i1a +i0q +i0p i1u +i0p i1r i2o +i0p i1r i2i +i0p i1r i2e +i0p i1r +i0p i1o i2r +i0p i1o i2p +i0p i1o i2o +i0p i1o i2l +i0p i1o i2k +i0p i1o +i0p i1l i2a +i0p i1l +i0p i1i i2n +i0p i1i +i0p i1h +i0p i1e i2t +i0p i1e i2r +i0p i1e i2p +i0p i1e i2n +i0p i1e +i0p i1a i2t +i0p i1a i2s +i0p i1a i2r +i0p i1a i2p +i0p i1a i2n +i0p i1a i2l +i0p i1a +i0p +i0o i1s +i0o i1r +i0o i1p +i0o i1n +i0o i1m +i0o i1l +i0o +i0n i1u +i0n i1o +i0n i1i i2n +i0n i1i i2k +i0n i1i i2g +i0n i1i i2c +i0n i1i +i0n i1e i2w +i0n i1e +i0n i1a i2t +i0n i1a i2r +i0n i1a i2n +i0n i1a +i0n +i0m i1y +i0m i1u i2s +i0m i1u +i0m i1o i2r +i0m i1o i2o +i0m i1o i2n +i0m i1o i2m +i0m i1o +i0m i1i i2s +i0m i1i i2n +i0m i1i i2l +i0m i1i i2k +i0m i1i i2c +i0m i1i +i0m i1e i2t +i0m i1e i2r +i0m i1e i2l +i0m i1e i2g +i0m i1e +i0m i1c +i0m i1a i2y +i0m i1a i2x +i0m i1a i2t +i0m i1a i2s +i0m i1a i2r +i0m i1a i2n +i0m i1a i2m +i0m i1a i2l +i0m i1a i2g +i0m i1a i2d +i0m i1a i2c +i0m i1a +i0m +i0l i1u i2i +i0l i1u i2c +i0l i1u +i0l i1o i2v +i0l i1o i2r +i0l i1o i2l +i0l i1o +i0l i1i i2n +i0l i1i i2l +i0l i1i +i0l i1e i2o +i0l i1e +i0l i1a i2n +i0l i1a +i0l +i0k i1y +i0k i1u +i0k i1r +i0k i1o +i0k i1n +i0k i1l +i0k i1i i2t +i0k i1i i2n +i0k i1i i2m +i0k i1i i2l +i0k i1i i2k +i0k i1i +i0k i1h +i0k i1e i2n +i0k i1e +i0k i1a i2t +i0k i1a i2r +i0k i1a i2n +i0k i1a i2m +i0k i1a i2k +i0k i1a +i0k +i0j i1u i2s +i0j i1u i2n +i0j i1u i2l +i0j i1u +i0j i1o i2s +i0j i1o i2r +i0j i1o i2n +i0j i1o i2h +i0j i1o i2e +i0j i1o +i0j i1i +i0j i1e i2s +i0j i1e i2r +i0j i1e i2n +i0j i1e +i0j i1a i2y +i0j i1a i2s +i0j i1a i2n +i0j i1a i2m +i0j i1a i2c +i0j i1a +i0j +i0i i1t +i0i i1s +i0i i1r +i0i i1n +i0i i1m +i0i i1l i2o +i0i i1l +i0i i1c +i0i i1a i2m +i0i i1a +i0i +i0h i1u i2n +i0h i1u +i0h i1o i2t +i0h i1o i2l +i0h i1o +i0h i1i +i0h i1e i2r +i0h i1e i2l +i0h i1e i2a +i0h i1e +i0h i1a i2r +i0h i1a i2n +i0h i1a i2m +i0h i1a i2l +i0h i1a +i0h +i0g i1u i2i +i0g i1u +i0g i1r i2e +i0g i1r i2a +i0g i1r +i0g i1o i2o +i0g i1o i2l +i0g i1o i2d +i0g i1o +i0g i1l +i0g i1i +i0g i1h +i0g i1e +i0g i1a i2r +i0g i1a i2m +i0g i1a i2b +i0g i1a +i0g +i0f i1u i2c +i0f i1u +i0f i1r i2e +i0f i1r i2a +i0f i1r +i0f i1o i2r +i0f i1o +i0f i1l i2o +i0f i1l i2a +i0f i1l +i0f i1i i2r +i0f i1i +i0f i1e i2r +i0f i1e +i0f i1a i2t +i0f i1a i2r +i0f i1a +i0f +i0e i1v +i0e i1s +i0e i1r i2i +i0e i1r +i0e i1n +i0e i1m i2i +i0e i1m +i0e i1l i2i +i0e i1l +i0e i1d +i0e i1a +i0e +i0d i1u +i0d i1r i2a +i0d i1r +i0d i1o i2n +i0d i1o i2m +i0d i1o i2g +i0d i1o +i0d i1j +i0d i1i i2n +i0d i1i i2a +i0d i1i +i0d i1e i2v +i0d i1e i2s +i0d i1e i2n +i0d i1e i2m +i0d i1e i2l +i0d i1e i2a +i0d i1e +i0d i1a i2v +i0d i1a i2r +i0d i1a i2n +i0d i1a i2m +i0d i1a i2d +i0d i1a +i0d +i0c i1u +i0c i1r i2i +i0c i1r i2a +i0c i1r +i0c i1o i2r +i0c i1o i2o +i0c i1o i2n +i0c i1o i2m +i0c i1o i2l +i0c i1o i2c +i0c i1o +i0c i1l i2a +i0c i1l +i0c i1i +i0c i1h i2u +i0c i1h i2r +i0c i1h i2o +i0c i1h i2i +i0c i1h i2e +i0c i1h i2a +i0c i1h +i0c i1e +i0c i1a i2t +i0c i1a i2s +i0c i1a i2r +i0c i1a i2n +i0c i1a i2m +i0c i1a i2l +i0c i1a +i0c +i0b i1u i2b +i0b i1u +i0b i1r i2o +i0b i1r i2i +i0b i1r i2e +i0b i1r i2a +i0b i1r +i0b i1o i2o +i0b i1o i2n +i0b i1o i2b +i0b i1o +i0b i1l i2u +i0b i1l i2o +i0b i1l i2a +i0b i1l +i0b i1i i2g +i0b i1i +i0b i1e i2r +i0b i1e i2n +i0b i1e i2l +i0b i1e i2a +i0b i1e +i0b i1a i2t +i0b i1a i2s +i0b i1a i2r +i0b i1a i2n +i0b i1a i2l +i0b i1a i2b +i0b i1a +i0b +i0a i1z +i0a i1w +i0a i1v +i0a i1u +i0a i1t +i0a i1s i2s +i0a i1s i2h +i0a i1s i2d +i0a i1s +i0a i1r +i0a i1p +i0a i1n i2t +i0a i1n i2n +i0a i1n i2i +i0a i1n i2g +i0a i1n i2d +i0a i1n i2a +i0a i1n +i0a i1m i2a +i0a i1m +i0a i1l i2l +i0a i1l i2i +i0a i1l i2e +i0a i1l i2a +i0a i1l +i0a i1k +i0a i1i +i0a i1g +i0a i1d +i0a i1c +i0a i1b i2c +i0a i1b +i0a i1a +i0a i11 +i0a +i0` +i0_ +i0] +i0\ +i0[ +i0Z +i0Y +i0X +i0W +i0V +i0U +i0T +i0S i1t +i0S i1h +i0S i1a +i0S +i0R i1o +i0R i1a +i0R +i0Q +i0P i1a +i0P +i0O +i0N +i0M i1o +i0M i1i +i0M i1e +i0M i1a +i0M +i0L i1o +i0L +i0K i1i +i0K i1a +i0K +i0J i1a +i0J +i0I +i0H i1a +i0H +i0G +i0F +i0E +i0D i1r +i0D i1e +i0D i1a +i0D +i0C i1o +i0C i1h +i0C i1a +i0C +i0B i1r +i0B i1l +i0B i1a +i0B +i0A i1n +i0A i1l +i0A +i0@ +i0? +i0= +i0; +i0: +i09 i19 +i09 i18 +i09 i17 +i09 i16 +i09 i15 +i09 i14 +i09 i13 +i09 i12 +i09 i11 +i09 i10 +i09 +i08 i19 +i08 i18 +i08 i17 +i08 i16 +i08 i15 +i08 i14 +i08 i13 +i08 i12 +i08 i11 +i08 i10 +i08 +i07 i19 +i07 i18 i29 +i07 i18 +i07 i17 +i07 i16 +i07 i15 +i07 i14 +i07 i13 +i07 i12 +i07 i11 +i07 i10 +i07 +i06 i19 +i06 i18 +i06 i17 +i06 i16 +i06 i15 +i06 i14 +i06 i13 +i06 i12 +i06 i11 +i06 i10 +i06 +i05 i19 +i05 i18 +i05 i17 +i05 i16 +i05 i15 +i05 i14 +i05 i13 +i05 i12 +i05 i11 +i05 i10 +i05 +i04 i19 +i04 i18 +i04 i17 +i04 i16 +i04 i15 +i04 i14 +i04 i13 +i04 i12 +i04 i11 +i04 i10 +i04 +i03 i19 +i03 i18 +i03 i17 +i03 i16 +i03 i15 +i03 i14 +i03 i13 +i03 i12 i21 +i03 i12 +i03 i11 +i03 i10 i20 +i03 i10 +i03 +i02 i19 +i02 i18 +i02 i17 +i02 i16 i20 +i02 i16 +i02 i15 i20 +i02 i15 +i02 i14 i20 +i02 i14 +i02 i13 i20 +i02 i13 +i02 i12 i20 +i02 i12 +i02 i11 i20 +i02 i11 +i02 i10 i21 +i02 i10 i20 +i02 i10 +i02 +i01 i19 i29 +i01 i19 i28 +i01 i19 i27 +i01 i19 i20 +i01 i19 +i01 i18 i20 +i01 i18 +i01 i17 +i01 i16 i20 +i01 i16 +i01 i15 i29 +i01 i15 i20 +i01 i15 +i01 i14 i27 +i01 i14 i20 +i01 i14 +i01 i13 i21 +i01 i13 i20 +i01 i13 +i01 i12 i23 +i01 i12 i22 +i01 i12 i21 +i01 i12 i20 +i01 i12 +i01 i11 i22 +i01 i11 i21 +i01 i11 i20 +i01 i11 +i01 i10 i22 +i01 i10 i21 +i01 i10 i20 +i01 i10 +i01 +i00 i19 i21 +i00 i19 i20 +i00 i19 +i00 i18 i20 +i00 i18 +i00 i17 +i00 i16 i20 +i00 i16 +i00 i15 i20 +i00 i15 +i00 i14 i20 +i00 i14 +i00 i13 i20 +i00 i13 +i00 i12 i20 +i00 i12 +i00 i11 i22 +i00 i11 i20 +i00 i11 +i00 i10 i20 +i00 i10 +i00 +i0/ +i0. +i0- +i0, +i0+ +i0* +i0( +i0' +i0& +i0% +i0$ +i0# +i0" +i0! +i0 +f'4y4 +dx27f'4y4 +d: +d$~$!$@$#$$ +d$z +d$y +d$x +d$w$o$o$d +d$w$i$s$e +d$w$a$y +d$w +d$v +d$u$p +d$u$m +d$u +d$t$y +d$t$i$o$n +d$t$h$e +d$t +d$s$o$m$e +d$s$i$s +d$s$i$o$n +d$s$i$d$e +d$s$h$i$p +d$s$h +d$s$e$x$y +d$s$e$s +d$s +d$r$o$o$m +d$r +d$q +d$p$a$s$s +d$p +d$o$v$e$r +d$o$u$t +d$o$u$s +d$o$u$r +d$o$s$e +d$o$r$y +d$o$r +d$o$n +d$o$m$y +d$o$l$o$g$y +d$o$l +d$o$i$d +d$o$e$s +d$o +d$n$e$s$s +d$n +d$m$e$n$t +d$m$e$n +d$m$a$n +d$m +d$l$y +d$l$o$o$p +d$l$o$n$g +d$l$i$n$g +d$l$i$n$e +d$l$i$k$e +d$l$e$t +d$l$e$s$s +d$l$a$n$d +d$l +d$k$i$n +d$k +d$j$o$n$e$s +d$j +d$i$z$e +d$i$x +d$i$v$e +d$i$t$y +d$i$t$i$v$e +d$i$t$i$o$n +d$i$t$i$c +d$i$t$e +d$i$s$t +d$i$s$m +d$i$s$h +d$i$s$e +d$i$o$u$s +d$i$o$n +d$i$n$g +d$i$n$e +d$i$l$y +d$i$l$i$a +d$i$l$e +d$i$f$y +d$i$e$s$t +d$i$e$s +d$i$e$r +d$i$d$e +d$i$c$l$e +d$i$c$e$s +d$i$c +d$i$b$l$e +d$i$a$n +d$i$a$l +d$i +d$h$o$o$d +d$h$e$a$d +d$h +d$g$e$n$y +d$g +d$f$u$l$l$y +d$f$u$l +d$f$o$r$m +d$f +d$e$t$t$e +d$e$t +d$e$s$t +d$e$s$s +d$e$s +d$e$r$y +d$e$r +d$e$o$u$s +d$e$n$t +d$e$n$c$e +d$e$n +d$e$l$l$a +d$e$e +d$e$d +d$e$a$u +d$e +d$d$o$m$e +d$d$a$y +d$d +d$c$y +d$c +d$b$o$y +d$b$o$o$k +d$b$e$l$l +d$b$a$l$l +d$b$a$c$k +d$b$a$b$y +d$b +d$a$u$x +d$a$t$i$v$e +d$a$t$i$o$n +d$a$s$e +d$a$r$y +d$a$n$t +d$a$n$e +d$a$n$d +d$a$n$c$e +d$a$n$a +d$a$n +d$a$m +d$a$l$l$y +d$a$l +d$a$g$e +d$a$c$l$e +d$a$b$l$e +d$a +d$S +d +co0p +co0k +cl +c^z +c^y^m +c^y^l^o^p +c^y^k^s +c^y^e^k +c^y^b +c^y^a^w +c^y^a^p +c^y^a^l^p +c^y^a^l +c^y^a^d^s^u^e^t +c^y^a^d^s^r^u^h^t +c^y^a^d^s^e^n^d^e^w +c^y^a^d^r^u^t^a^s +c^y^a^d^n^u^s +c^y^a^d^n^o^m +c^y^a^d^i^r^f +c^y^a^d +c^y +c^x^o +c^x^e +c^x^a^t +c^x^a +c^x +c^w^o^t +c^w^o^n^s +c^w^o^l +c^w^o^c +c^w^o^b +c^w^e^n +c^w^a^s +c^w^a^j +c^w +c^v +c^u^e +c^u +c^t^u^o +c^t^u^c +c^t^s^o^p +c^t^p^e^h +c^t^o^p +c^t^o^o^f +c^t^o^o^b +c^t^o^n^k +c^t^o^h +c^t^n^e^c +c^t^h^g^i^n +c^t^f^o^s +c^t^e^j +c^t^c^a^l +c^t^a^r +c^t^a^o^b +c^t^a^h +c^t^a^f +c^t^a^c +c^t^a^b +c^t +c^s^y^d +c^s^s^o^r^c +c^s^s^a^p +c^s^n^a^r^t +c^s^i^m +c^s^i^h^t +c^s^i^d +c^s +c^r^u^s +c^r^o^t^a^r^t^s^i^n^i^m^d^a +c^r^o^o^d +c^r^o^f +c^r^i^a^h +c^r^i^a +c^r^i +c^r^e^v^o +c^r^e^t^n^u^o^c +c^r^e^t^n^i +c^r^e^t^f^a +c^r^e^t^a^w +c^r^e^p^y^h +c^r^e^p^u^s +c^r^e^p +c^r^e^d^n^u +c^r^a^w +c^r^a^p +c^r^a^o +c^r^a^e^b +c^r^a^e +c^r +c^q +c^p^u +c^p^m^a^c +c^p +c^o^t^u^a +c^o^t^c^e +c^o^s^i +c^o^r^y^g +c^o^r^p +c^o^r^e^a +c^o^r^c^i^m +c^o^r^c^a^m +c^o^r^c^a +c^o^p^y^h +c^o^o^z +c^o^n^o^m +c^o^l^l^a +c^o^l^i^k +c^o^i^b +c^o^e^n +c^o^d^u^e^s^p +c^o^c +c^o +c^n^w^o^d +c^n^u^s +c^n^u^g +c^n^u +c^n^r^o^c +c^n^o^o^m +c^n^o^n +c^n^o^c +c^n^o +c^n^i^t +c^n^i^p +c^n^i^m^d^a +c^n^i +c^n^e^p +c^n^e +c^n^a^m +c^n +c^m^u^g +c^m^r^o^w +c^m^r^a^f +c^m^o^c +c^m^i +c^m^e +c^m^a^ ^i +c^m^'^i +c^m^'^I +c^m +c^l^o^o^w +c^l^l^o^r +c^l^l^i^p +c^l^l^i +c^l^l^a^f +c^l^i^o +c^l^i^a^t +c^l^i^a^s +c^l^i^a^r +c^l^i^a^j +c^l^i +c^l^a^o^c +c^l^a^m +c^l +c^k^r^o^w +c^k^o^o^b +c^k^n^i +c^k^l^i^m +c^k^c^a^b +c^k +c^j +c^i^x^a^m +c^i^t^n^a +c^i^t^l^u^m +c^i^r^t +c^i^p^e +c^i^n^m^o +c^i^n^i^m +c^i^m^e^s +c^i^m^e^d +c^i^l^e^h +c^i^b +c^i +c^h^t^r^a^e +c^h^t^a^b +c^h^s^i^f +c^h^s^a^w +c^h^s^a +c^h^g^i^h +c^h^c^r^a +c^h +c^g^o^l +c^g^o^d +c^g^n^o^l +c^g^n^i^w +c^g^n^i^r +c^g^n^i^k +c^g^i^p +c^g^e^l +c^g +c^f^l^e^s +c^f^l^a^h +c^f^f^o +c^f +c^e^y^e +c^e^v^a^h^i +c^e^t^n^a +c^e^s^o^n +c^e^r^p +c^e^r^o^f +c^e^r^i^f +c^e^r +c^e^n^o^t^s +c^e^n^i^l +c^e^l^e^t +c^e^e^r^f +c^e^e^n^k +c^e^d^i^s +c^e^d +c^e^c^i^v +c^e^c^i +c^e^c^a^l +c^e^c^a^f +c^e^b +c^e +c^d^u^m +c^d^r^o^w^s^s^a^p +c^d^r^o^c +c^d^r^a^h +c^d^o^o^w +c^d^o^o^g +c^d^n^i^w +c^d^n^i^h +c^d^n^a^l +c^d^n^a^h +c^d^n^a^b +c^d^l^o^g +c^d^i^m +c^d^e^r +c^d^e^e^s +c^d^e^b +c^d^d^a +c^d^a^e^l +c^d^a^e^h +c^d^a^e^d +c^d^a^b +c^d +c^c^c^a +c^c +c^b^u^s +c^b^o +c^b +c^a^r^t^l^u +c^a^n^a +c^a^i^d +c^a^g^e^m +c^a^e^t +c^a^e^s +c^a +c^Z +c^Y +c^X +c^W +c^V +c^U +c^T +c^S +c^R +c^Q +c^P +c^O +c^N +c^M +c^L +c^K +c^J +c^I +c^H +c^G +c^F +c^E +c^D +c^C +c^B +c^A +c^9^9^9^1 +c^9^8^9^1 +c^9^7^9^1 +c^9^6^9^1 +c^9^5^9^1 +c^9^4^9^1 +c^9^1^0^2 +c^9^0^0^2 +c^8^9^9^1 +c^8^8^9^1 +c^8^7^9^1 +c^8^6^9^1 +c^8^5^9^1 +c^8^4^9^1 +c^8^1^0^2 +c^8^0^0^2 +c^7^9^9^1 +c^7^8^9^1 +c^7^7^9^1 +c^7^6^9^1 +c^7^5^9^1 +c^7^4^9^1 +c^7^1^0^2 +c^7^0^0^2 +c^6^9^9^1 +c^6^8^9^1 +c^6^7^9^1 +c^6^6^9^1 +c^6^5^9^1 +c^6^4^9^1 +c^6^1^0^2 +c^6^0^0^2 +c^5^9^9^1 +c^5^8^9^1 +c^5^7^9^1 +c^5^6^9^1 +c^5^5^9^1 +c^5^4^9^1 +c^5^1^0^2 +c^5^0^0^2 +c^4^9^9^1 +c^4^8^9^1 +c^4^7^9^1 +c^4^6^9^1 +c^4^5^9^1 +c^4^4^9^1 +c^4^1^0^2 +c^4^0^0^2 +c^3^9^9^1 +c^3^8^9^1 +c^3^7^9^1 +c^3^6^9^1 +c^3^5^9^1 +c^3^4^9^1 +c^3^2^1 +c^3^1^0^2 +c^3^0^0^2 +c^2^9^9^1 +c^2^8^9^1 +c^2^7^9^1 +c^2^6^9^1 +c^2^5^9^1 +c^2^4^9^1 +c^2^1^0^2 +c^2^0^0^2 +c^1^9^9^1 +c^1^8^9^1 +c^1^7^9^1 +c^1^6^9^1 +c^1^5^9^1 +c^1^4^9^1 +c^1^2^3 +c^1^1^0^2 +c^1^0^0^2 +c^1 +c^0^9^9^1 +c^0^8^9^1 +c^0^7^9^1 +c^0^6^9^1 +c^0^5^9^1 +c^0^4^9^1 +c^0^1^0^2 +c^0^0^0^2 +c^-^x^e +c^-^t^n^a +c^-^s^i^m +c^-^r^e^v^o +c^-^r^e^p^y^h +c^-^n^o^n +c^-^i^m^e^s +c^ ^y^m +c^ ^u^o^y +c^ ^u +c^ ^t^o^n^ ^m^a^ ^i +c^ ^t^n^o^d^ ^i +c^ ^t^'^n^o^d^ ^i +c^ ^s^i^ ^t^i +c^ ^s^i^ ^s^i^h^t +c^ ^s^i^ ^e^h^s +c^ ^s^i^ ^e^h +c^ ^r^ ^y^e^h^t +c^ ^r^ ^u^o^y +c^ ^r^ ^e^w +c^ ^p^o^t +c^ ^m^a^ ^i +c^ ^m^'^i +c^ ^m^'^I +c^ ^l^l^i^m +c^ ^i +c^ ^e^v^a^h^ ^i +c^ ^e^r^a^ ^y^e^h^t +c^ ^e^r^a^ ^u^o^y +c^ ^e^r^a^ ^e^w +c^ ^e^h^t +c^ ^d^n^a^s +c^ ^a^ ^m^i +c^ ^a +c^ ^I +c$~$9 +c$~$8 +c$~$7 +c$~$6 +c$~$5 +c$~$4 +c$~$3 +c$~$2 +c$~$1 +c$~$0 +c$~$!$@$#$$ +c$~ +c$}$9 +c$}$8 +c$}$7 +c$}$6 +c$}$5 +c$}$4 +c$}$3 +c$}$2 +c$}$1 +c$}$0 +c$} +c$|$9 +c$|$8 +c$|$7 +c$|$6 +c$|$5 +c$|$4 +c$|$3 +c$|$2 +c$|$1 +c$|$0 +c$| +c${$9 +c${$8 +c${$7 +c${$6 +c${$5 +c${$4 +c${$3 +c${$2 +c${$1 +c${$0 +c${ +c$z +c$y +c$x +c$w$o$o$d +c$w$i$s$e +c$w$a$y +c$w +c$v +c$u$p +c$u$m +c$u +c$t$y +c$t$i$o$n +c$t$h$e +c$t$e$s$t +c$t +c$s$o$m$e +c$s$m$i$t$h +c$s$i$s +c$s$i$o$n +c$s$i$d$e +c$s$h$i$p +c$s$h +c$s$e$x$y +c$s$e$s +c$s$e$r$v$e$r +c$s$a$l$a$s$a$n$a +c$s +c$r$o$o$m +c$r +c$q$w$e$r$t$y +c$q +c$p$h$p$b$b +c$p$a$s$s +c$p +c$o$v$e$r +c$o$u$t +c$o$u$s +c$o$u$r +c$o$s$e +c$o$r$y +c$o$r +c$o$n +c$o$m$y +c$o$l$o$g$y +c$o$l +c$o$i$d +c$o$e$s +c$o +c$n$e$s$s +c$n +c$m$i$k$e +c$m$i$c$h$a$e$l +c$m$e$n$t +c$m$e$n +c$m$a$n +c$m +c$l$y +c$l$o$o$p +c$l$o$n$g +c$l$i$n$g +c$l$i$n$e +c$l$i$k$e +c$l$e$t +c$l$e$s$s +c$l$e$e +c$l$a$n$d +c$l +c$k$i$n +c$k$h$a$n +c$k +c$j$o$h$n$s$o$n +c$j$o$h$n +c$j +c$i$z$e +c$i$x +c$i$v$e +c$i$t$y +c$i$t$i$v$e +c$i$t$i$o$n +c$i$t$i$c +c$i$t$e +c$i$s$t +c$i$s$m +c$i$s$h +c$i$s$e +c$i$o$u$s +c$i$o$n +c$i$n$g +c$i$n$e +c$i$l$y +c$i$l$i$a +c$i$l$e +c$i$f$y +c$i$e$s$t +c$i$e$s +c$i$e$r +c$i$d$e +c$i$c$l$e +c$i$c$e$s +c$i$c +c$i$b$l$e +c$i$a$n +c$i$a$l +c$i +c$h$o$o$d +c$h$e$a$d +c$h +c$g$e$n$y +c$g +c$f$u$l$l$y +c$f$u$l +c$f$o$r$m +c$f$a$r$m$v$i$l$l$e +c$f +c$e$t$t$e +c$e$t +c$e$s$t +c$e$s$s +c$e$s +c$e$r$y +c$e$r +c$e$o$u$s +c$e$n$t +c$e$n$c$e +c$e$n +c$e$l$l$a +c$e$e +c$e$d +c$e$a$u +c$e +c$d$o$m$e +c$d$a$y +c$d$a$v$i$d +c$d +c$c$y +c$c +c$b$r$o$w$n +c$b$o$y +c$b$o$o$k +c$b$e$l$l +c$b$a$l$l +c$b$a$c$k +c$b$a$b$y +c$b +c$a$u$x +c$a$t$i$v$e +c$a$t$i$o$n +c$a$s$e +c$a$r$y +c$a$n$t +c$a$n$e +c$a$n$d +c$a$n$c$e +c$a$n$a +c$a$n +c$a$m +c$a$l$l$y +c$a$l +c$a$g$e +c$a$c$l$e +c$a$b$l$e +c$a +c$`$9 +c$`$8 +c$`$7 +c$`$6 +c$`$5 +c$`$4 +c$`$3 +c$`$2 +c$`$1 +c$`$0 +c$` +c$_$9 +c$_$8 +c$_$7 +c$_$6 +c$_$5 +c$_$4 +c$_$3 +c$_$2 +c$_$1 +c$_$0 +c$_ +c$^$9 +c$^$8 +c$^$7 +c$^$6 +c$^$5 +c$^$4 +c$^$3 +c$^$2 +c$^$1 +c$^$0 +c$^ +c$]$9 +c$]$8 +c$]$7 +c$]$6 +c$]$5 +c$]$4 +c$]$3 +c$]$2 +c$]$1 +c$]$0 +c$] +c$\$9 +c$\$8 +c$\$7 +c$\$6 +c$\$5 +c$\$4 +c$\$3 +c$\$2 +c$\$1 +c$\$0 +c$\ +c$[$9 +c$[$8 +c$[$7 +c$[$6 +c$[$5 +c$[$4 +c$[$3 +c$[$2 +c$[$1 +c$[$0 +c$[ +c$S +c$@$z$o$h$o$.$c$o$m +c$@$y$m$a$i$l$.$c$o$m +c$@$y$a$h$o$o$.$c$o$m +c$@$y$a$h$o$o$.$c$o$.$u$k +c$@$y$a$h$o$o$.$c$o$.$i$n +c$@$y$a$h$o$o$.$c$a +c$@$w$p$.$p$l +c$@$v$e$r$i$z$o$n$.$n$e$t +c$@$m$s$n$.$c$o$m +c$@$m$a$i$l$.$r$u +c$@$m$a$i$l$.$c$o$m +c$@$l$i$v$e$.$c$o$m +c$@$l$i$v$e$.$c$o$.$u$k +c$@$i$n$b$o$x$.$r$u +c$@$h$o$t$m$a$i$l$.$c$o$m +c$@$g$m$x$.$u$s +c$@$g$m$x$.$c$o$m +c$@$g$m$a$i$l$.$c$o$m +c$@$g$a$w$a$b$.$c$o$m +c$@$f$a$s$t$m$a$i$l$.$f$m +c$@$c$o$x$.$n$e$t +c$@$c$o$m$c$a$s$t$.$n$e$t +c$@$a$o$l$.$c$o$m +c$@$a$m$e$l$e$.$c$o$m +c$@$9 +c$@$8 +c$@$7 +c$@$6 +c$@$5 +c$@$4 +c$@$3 +c$@$2 +c$@$1 +c$@$0 +c$@ +c$?$9 +c$?$8 +c$?$7 +c$?$6 +c$?$5 +c$?$4 +c$?$3 +c$?$2 +c$?$1 +c$?$0 +c$? +c$>$9 +c$>$8 +c$>$7 +c$>$6 +c$>$5 +c$>$4 +c$>$3 +c$>$2 +c$>$1 +c$>$0 +c$> +c$=$9 +c$=$8 +c$=$7 +c$=$6 +c$=$5 +c$=$4 +c$=$3 +c$=$2 +c$=$1 +c$=$0 +c$= +c$<$9 +c$<$8 +c$<$7 +c$<$6 +c$<$5 +c$<$4 +c$<$3 +c$<$2 +c$<$1 +c$<$0 +c$< +c$;$9 +c$;$8 +c$;$7 +c$;$6 +c$;$5 +c$;$4 +c$;$3 +c$;$2 +c$;$1 +c$;$0 +c$; +c$:$9 +c$:$8 +c$:$7 +c$:$6 +c$:$5 +c$:$4 +c$:$3 +c$:$2 +c$:$1 +c$:$0 +c$: +c$9$~ +c$9$} +c$9$| +c$9${ +c$9$` +c$9$_ +c$9$^ +c$9$] +c$9$\ +c$9$[ +c$9$@ +c$9$? +c$9$> +c$9$= +c$9$< +c$9$; +c$9$: +c$9$9 +c$9$8 +c$9$7 +c$9$6 +c$9$5 +c$9$4 +c$9$3 +c$9$2 +c$9$1 +c$9$0 +c$9$/ +c$9$. +c$9$- +c$9$, +c$9$+ +c$9$* +c$9$) +c$9$( +c$9$' +c$9$& +c$9$% +c$9$$ +c$9$# +c$9$" +c$9$! +c$9$ +c$9 +c$8$~ +c$8$} +c$8$| +c$8${ +c$8$` +c$8$_ +c$8$^ +c$8$] +c$8$\ +c$8$[ +c$8$@ +c$8$? +c$8$> +c$8$= +c$8$< +c$8$; +c$8$: +c$8$9 +c$8$8 +c$8$7 +c$8$6 +c$8$5 +c$8$4 +c$8$3 +c$8$2 +c$8$1 +c$8$0 +c$8$/ +c$8$. +c$8$- +c$8$, +c$8$+ +c$8$* +c$8$) +c$8$( +c$8$' +c$8$& +c$8$% +c$8$$ +c$8$# +c$8$" +c$8$! +c$8$ +c$8 +c$7$~ +c$7$} +c$7$| +c$7${ +c$7$` +c$7$_ +c$7$^ +c$7$] +c$7$\ +c$7$[ +c$7$@ +c$7$? +c$7$> +c$7$= +c$7$< +c$7$; +c$7$: +c$7$9 +c$7$8 +c$7$7 +c$7$6 +c$7$5 +c$7$4 +c$7$3 +c$7$2 +c$7$1 +c$7$0 +c$7$/ +c$7$. +c$7$- +c$7$, +c$7$+ +c$7$* +c$7$) +c$7$( +c$7$' +c$7$& +c$7$% +c$7$$ +c$7$# +c$7$" +c$7$! +c$7$ +c$7 +c$6$~ +c$6$} +c$6$| +c$6${ +c$6$` +c$6$_ +c$6$^ +c$6$] +c$6$\ +c$6$[ +c$6$@ +c$6$? +c$6$> +c$6$= +c$6$< +c$6$; +c$6$: +c$6$9 +c$6$8 +c$6$7 +c$6$6 +c$6$5 +c$6$4 +c$6$3 +c$6$2 +c$6$1 +c$6$0 +c$6$/ +c$6$. +c$6$- +c$6$, +c$6$+ +c$6$* +c$6$) +c$6$( +c$6$' +c$6$& +c$6$% +c$6$$ +c$6$# +c$6$" +c$6$! +c$6$ +c$6 +c$5$~ +c$5$} +c$5$| +c$5${ +c$5$` +c$5$_ +c$5$^ +c$5$] +c$5$\ +c$5$[ +c$5$@ +c$5$? +c$5$> +c$5$= +c$5$< +c$5$; +c$5$: +c$5$9 +c$5$8 +c$5$7 +c$5$6 +c$5$5 +c$5$4 +c$5$3 +c$5$2 +c$5$1 +c$5$0 +c$5$/ +c$5$. +c$5$- +c$5$, +c$5$+ +c$5$* +c$5$) +c$5$( +c$5$' +c$5$& +c$5$% +c$5$$ +c$5$# +c$5$" +c$5$! +c$5$ +c$5 +c$4$~ +c$4$} +c$4$| +c$4${ +c$4$` +c$4$_ +c$4$^ +c$4$] +c$4$\ +c$4$[ +c$4$@ +c$4$? +c$4$> +c$4$= +c$4$< +c$4$; +c$4$: +c$4$9 +c$4$8 +c$4$7 +c$4$6 +c$4$5 +c$4$4 +c$4$3 +c$4$2 +c$4$1 +c$4$0 +c$4$/ +c$4$. +c$4$- +c$4$, +c$4$+ +c$4$* +c$4$) +c$4$( +c$4$' +c$4$& +c$4$% +c$4$$ +c$4$# +c$4$" +c$4$! +c$4$ +c$4 +c$3$~ +c$3$} +c$3$| +c$3${ +c$3$` +c$3$_ +c$3$^ +c$3$] +c$3$\ +c$3$[ +c$3$@ +c$3$? +c$3$> +c$3$= +c$3$< +c$3$; +c$3$: +c$3$9 +c$3$8 +c$3$7 +c$3$6 +c$3$5 +c$3$4 +c$3$3 +c$3$2 +c$3$1 +c$3$0 +c$3$/ +c$3$. +c$3$- +c$3$, +c$3$+ +c$3$* +c$3$) +c$3$( +c$3$' +c$3$& +c$3$% +c$3$$ +c$3$# +c$3$" +c$3$! +c$3$ +c$3 +c$2$~ +c$2$} +c$2$| +c$2${ +c$2$` +c$2$_ +c$2$^ +c$2$] +c$2$\ +c$2$[ +c$2$@ +c$2$? +c$2$> +c$2$= +c$2$< +c$2$; +c$2$: +c$2$9 +c$2$8 +c$2$7 +c$2$6 +c$2$5 +c$2$4 +c$2$3 +c$2$2 +c$2$1 +c$2$0$1$0$~ +c$2$0$1$0$@ +c$2$0$1$0$* +c$2$0$1$0$$ +c$2$0$1$0$! +c$2$0 +c$2$/ +c$2$. +c$2$- +c$2$, +c$2$+ +c$2$* +c$2$) +c$2$( +c$2$' +c$2$& +c$2$% +c$2$$ +c$2$# +c$2$" +c$2$! +c$2$ +c$2 +c$1: +c$1$~ +c$1$} +c$1$| +c$1${ +c$1$` +c$1$_ +c$1$^ +c$1$] +c$1$\ +c$1$[ +c$1$@ +c$1$? +c$1$> +c$1$= +c$1$< +c$1$; +c$1$: +c$1$9$9$2$~ +c$1$9$9$2$| +c$1$9$9$2$` +c$1$9$9$2$_ +c$1$9$9$2$^ +c$1$9$9$2$@ +c$1$9$9$2$? +c$1$9$9$2$= +c$1$9$9$2$. +c$1$9$9$2$- +c$1$9$9$2$+ +c$1$9$9$2$* +c$1$9$9$2$) +c$1$9$9$2$( +c$1$9$9$2$& +c$1$9$9$2$% +c$1$9$9$2$$ +c$1$9$9$2$# +c$1$9$9$2$! +c$1$9$9$1$~ +c$1$9$9$1$| +c$1$9$9$1$` +c$1$9$9$1$_ +c$1$9$9$1$^ +c$1$9$9$1$@ +c$1$9$9$1$? +c$1$9$9$1$= +c$1$9$9$1$. +c$1$9$9$1$- +c$1$9$9$1$+ +c$1$9$9$1$* +c$1$9$9$1$) +c$1$9$9$1$( +c$1$9$9$1$& +c$1$9$9$1$% +c$1$9$9$1$$ +c$1$9$9$1$# +c$1$9$9$1$! +c$1$9$9$0$~ +c$1$9$9$0$| +c$1$9$9$0$` +c$1$9$9$0$_ +c$1$9$9$0$^ +c$1$9$9$0$@ +c$1$9$9$0$? +c$1$9$9$0$= +c$1$9$9$0$. +c$1$9$9$0$- +c$1$9$9$0$+ +c$1$9$9$0$* +c$1$9$9$0$) +c$1$9$9$0$( +c$1$9$9$0$& +c$1$9$9$0$% +c$1$9$9$0$$ +c$1$9$9$0$# +c$1$9$9$0$! +c$1$9 +c$1$8 +c$1$7 +c$1$6 +c$1$5 +c$1$4 +c$1$3 +c$1$2$3$4$5$6$7$8$9$0 +c$1$2$3$4$5$6$7$8$9 +c$1$2$3$4$5$6$7$8 +c$1$2$3$4$5$6$7 +c$1$2$3$4$5$6 +c$1$2$3$4$5 +c$1$2$3$4 +c$1$2$3 +c$1$2 +c$1$1 +c$1$0 +c$1$/ +c$1$. +c$1$- +c$1$, +c$1$+ +c$1$* +c$1$) +c$1$( +c$1$' +c$1$& +c$1$% +c$1$$ +c$1$# +c$1$" +c$1$! +c$1$ +c$1 +c$0$~ +c$0$} +c$0$| +c$0${ +c$0$` +c$0$_ +c$0$^ +c$0$] +c$0$\ +c$0$[ +c$0$@ +c$0$? +c$0$> +c$0$= +c$0$< +c$0$; +c$0$: +c$0$9 +c$0$8 +c$0$7 +c$0$6 +c$0$5 +c$0$4 +c$0$3 +c$0$2 +c$0$1$2$3$4$5$6$7$8$9 +c$0$1 +c$0$0 +c$0$/ +c$0$. +c$0$- +c$0$, +c$0$+ +c$0$* +c$0$) +c$0$( +c$0$' +c$0$& +c$0$% +c$0$$ +c$0$# +c$0$" +c$0$! +c$0$ +c$0 +c$/$9 +c$/$8 +c$/$7 +c$/$6 +c$/$5 +c$/$4 +c$/$3 +c$/$2 +c$/$1 +c$/$0 +c$/ +c$.$z$w +c$.$z$m +c$.$z$a +c$.$y$u +c$.$y$t +c$.$y$e +c$.$w$s +c$.$w$f +c$.$v$u +c$.$v$n +c$.$v$i +c$.$v$g +c$.$v$e +c$.$v$c +c$.$v$a +c$.$u$z +c$.$u$y +c$.$u$s +c$.$u$m +c$.$u$k +c$.$u$g +c$.$u$a +c$.$t$z +c$.$t$w +c$.$t$v +c$.$t$t +c$.$t$r$a$v$e$l +c$.$t$r +c$.$t$p +c$.$t$o +c$.$t$n +c$.$t$m +c$.$t$l +c$.$t$k +c$.$t$j +c$.$t$h +c$.$t$g +c$.$t$f +c$.$t$d +c$.$t$c +c$.$s$z +c$.$s$y +c$.$s$v +c$.$s$u +c$.$s$t +c$.$s$r +c$.$s$o +c$.$s$n +c$.$s$m +c$.$s$l +c$.$s$k +c$.$s$j +c$.$s$i +c$.$s$h +c$.$s$g +c$.$s$e +c$.$s$d +c$.$s$c +c$.$s$b +c$.$s$a +c$.$r$w +c$.$r$u +c$.$r$o$o$t +c$.$r$o +c$.$r$e +c$.$q$a +c$.$p$y +c$.$p$w +c$.$p$t +c$.$p$s +c$.$p$r$o +c$.$p$r +c$.$p$n +c$.$p$m +c$.$p$l +c$.$p$k +c$.$p$h +c$.$p$g +c$.$p$f +c$.$p$e +c$.$p$a +c$.$o$r$g +c$.$o$m +c$.$n$z +c$.$n$u +c$.$n$r +c$.$n$p +c$.$n$o +c$.$n$l +c$.$n$i +c$.$n$g +c$.$n$f +c$.$n$e$t +c$.$n$e +c$.$n$c +c$.$n$a$m$e +c$.$n$a +c$.$m$z +c$.$m$y +c$.$m$x +c$.$m$w +c$.$m$v +c$.$m$u +c$.$m$t +c$.$m$s +c$.$m$r +c$.$m$q +c$.$m$p +c$.$m$o$b$i +c$.$m$o +c$.$m$n +c$.$m$m +c$.$m$l +c$.$m$k +c$.$m$i$l +c$.$m$h +c$.$m$g +c$.$m$d +c$.$m$c +c$.$m$a +c$.$l$y +c$.$l$v +c$.$l$u +c$.$l$t +c$.$l$s +c$.$l$r +c$.$l$k +c$.$l$i +c$.$l$c +c$.$l$b +c$.$l$a +c$.$k$z +c$.$k$y +c$.$k$w +c$.$k$r +c$.$k$n +c$.$k$m +c$.$k$i +c$.$k$h +c$.$k$g +c$.$k$e +c$.$j$p +c$.$j$o$b$s +c$.$j$o +c$.$j$m +c$.$j$e +c$.$i$t +c$.$i$s +c$.$i$r +c$.$i$q +c$.$i$o +c$.$i$n$t +c$.$i$n$f$o +c$.$i$n +c$.$i$m +c$.$i$l +c$.$i$e +c$.$i$d +c$.$h$u +c$.$h$t +c$.$h$r +c$.$h$n +c$.$h$m +c$.$h$k +c$.$g$y +c$.$g$w +c$.$g$u +c$.$g$t +c$.$g$s +c$.$g$r +c$.$g$q +c$.$g$p +c$.$g$o$v +c$.$g$n +c$.$g$m +c$.$g$l +c$.$g$i +c$.$g$h +c$.$g$g +c$.$g$f +c$.$g$e +c$.$g$d +c$.$g$b +c$.$g$a +c$.$f$r +c$.$f$o +c$.$f$m +c$.$f$k +c$.$f$j +c$.$f$i +c$.$e$u +c$.$e$t +c$.$e$s +c$.$e$r +c$.$e$g +c$.$e$e +c$.$e$d$u +c$.$e$c +c$.$d$z +c$.$d$o +c$.$d$m +c$.$d$k +c$.$d$j +c$.$d$e +c$.$c$z +c$.$c$y +c$.$c$x +c$.$c$v +c$.$c$u +c$.$c$r +c$.$c$o$o$p +c$.$c$o$m +c$.$c$o +c$.$c$n +c$.$c$m +c$.$c$l +c$.$c$k +c$.$c$i +c$.$c$h +c$.$c$g +c$.$c$f +c$.$c$d +c$.$c$c +c$.$c$a$t +c$.$c$a +c$.$b$z +c$.$b$y +c$.$b$w +c$.$b$v +c$.$b$t +c$.$b$s +c$.$b$r +c$.$b$o +c$.$b$n +c$.$b$m +c$.$b$j +c$.$b$i$z +c$.$b$i +c$.$b$h +c$.$b$g +c$.$b$f +c$.$b$e +c$.$b$d +c$.$b$b +c$.$b$a +c$.$a$z +c$.$a$x +c$.$a$w +c$.$a$u +c$.$a$t +c$.$a$s +c$.$a$r$p$a +c$.$a$r +c$.$a$q +c$.$a$o +c$.$a$n +c$.$a$m +c$.$a$l +c$.$a$i +c$.$a$g +c$.$a$f +c$.$a$e$r$o +c$.$a$e +c$.$a$d +c$.$a$c +c$.$9 +c$.$8 +c$.$7 +c$.$6 +c$.$5 +c$.$4 +c$.$3 +c$.$2 +c$.$1 +c$.$0 +c$. +c$-$9 +c$-$8 +c$-$7 +c$-$6 +c$-$5 +c$-$4 +c$-$3 +c$-$2 +c$-$1 +c$-$0 +c$- +c$,$9 +c$,$8 +c$,$7 +c$,$6 +c$,$5 +c$,$4 +c$,$3 +c$,$2 +c$,$1 +c$,$0 +c$, +c$+$9 +c$+$8 +c$+$7 +c$+$6 +c$+$5 +c$+$4 +c$+$3 +c$+$2 +c$+$1 +c$+$0 +c$+ +c$*$9 +c$*$8 +c$*$7 +c$*$6 +c$*$5 +c$*$4 +c$*$3 +c$*$2 +c$*$1 +c$*$0 +c$* +c$)$9 +c$)$8 +c$)$7 +c$)$6 +c$)$5 +c$)$4 +c$)$3 +c$)$2 +c$)$1 +c$)$0 +c$) +c$($9 +c$($8 +c$($7 +c$($6 +c$($5 +c$($4 +c$($3 +c$($2 +c$($1 +c$($0 +c$( +c$'$9 +c$'$8 +c$'$7 +c$'$6 +c$'$5 +c$'$4 +c$'$3 +c$'$2 +c$'$1 +c$'$0 +c$' +c$&$a$m$p$; +c$&$9 +c$&$8 +c$&$7 +c$&$6 +c$&$5 +c$&$4 +c$&$3 +c$&$2 +c$&$1 +c$&$0 +c$& +c$%$9 +c$%$8 +c$%$7 +c$%$6 +c$%$5 +c$%$4 +c$%$3 +c$%$2 +c$%$1 +c$%$0 +c$% +c$$$9 +c$$$8 +c$$$7 +c$$$6 +c$$$5 +c$$$4 +c$$$3 +c$$$2 +c$$$1 +c$$$0 +c$$ +c$#$9 +c$#$8 +c$#$7 +c$#$6 +c$#$5 +c$#$4 +c$#$3 +c$#$2 +c$#$1 +c$#$0 +c$# +c$"$9 +c$"$8 +c$"$7 +c$"$6 +c$"$5 +c$"$4 +c$"$3 +c$"$2 +c$"$1 +c$"$0 +c$" +c$!$9 +c$!$8 +c$!$7 +c$!$6 +c$!$5 +c$!$4 +c$!$3 +c$!$2 +c$!$1 +c$!$0 +c$! +c$ $9 +c$ $8 +c$ $7 +c$ $6 +c$ $5 +c$ $4 +c$ $3 +c$ $2 +c$ $1 +c$ $0 +c$ +c $1 +c $0 $1 +c $0 +c +^z +^y^m +^y^l^o^p +^y^k^s +^y^e^k +^y^b +^y^a^w +^y^a^p +^y^a^l^p +^y^a^l +^y^a^d^s^u^e^t +^y^a^d^s^r^u^h^t +^y^a^d^s^e^n^d^e^w +^y^a^d^r^u^t^a^s +^y^a^d^n^u^s +^y^a^d^n^o^m +^y^a^d^i^r^f +^y^a^d +^y +^x^o +^x^e +^x^a^t +^x^a +^x +^w^o^t +^w^o^n^s +^w^o^l +^w^o^c +^w^o^b +^w^e^n +^w^a^s +^w^a^j +^w +^v +^u^e +^u +^t^u^o +^t^u^c +^t^s^o^p +^t^p^e^h +^t^o^p +^t^o^o^f +^t^o^o^b +^t^o^n^k +^t^o^h +^t^n^e^c +^t^h^g^i^n +^t^f^o^s +^t^e^j +^t^c^a^l +^t^a^r +^t^a^o^b +^t^a^h +^t^a^f +^t^a^c +^t^a^b +^t +^s^y^d +^s^s^o^r^c +^s^s^a^p +^s^n^a^r^t +^s^i^m +^s^i^h^t +^s^i^d +^s +^r^u^s +^r^o^t^a^r^t^s^i^n^i^m^d^a +^r^o^o^d +^r^o^f +^r^i^a^h +^r^i^a +^r^i +^r^e^v^o +^r^e^t^n^u^o^c +^r^e^t^n^i +^r^e^t^f^a +^r^e^t^a^w +^r^e^p^y^h +^r^e^p^u^s +^r^e^p +^r^e^d^n^u +^r^a^w +^r^a^p +^r^a^o +^r^a^e^b +^r^a^e +^r[ +^r +^q +^p^u +^p^m^a^c +^p +^o^t^u^a +^o^t^c^e +^o^s^i +^o^r^y^g +^o^r^p +^o^r^e^a +^o^r^c^i^m +^o^r^c^a^m +^o^r^c^a +^o^p^y^h +^o^o^z +^o^n^o^m +^o^l^l^a +^o^l^i^k +^o^i^b +^o^e^n +^o^d^u^e^s^p +^o^c +^o +^n^w^o^d +^n^u^s +^n^u^g +^n^u +^n^r^o^c +^n^o^o^m +^n^o^n +^n^o^c +^n^o +^n^i^t +^n^i^p +^n^i^m^d^a +^n^i +^n^e^p +^n^e +^n^a^m +^n +^m^u^g +^m^r^o^w +^m^r^a^f +^m^o^c +^m^i +^m^e +^m^a^ ^i +^m^'^i +^m^'^I +^m +^l^o^o^w +^l^l^o^r +^l^l^i^p +^l^l^i +^l^l^a^f +^l^i^o +^l^i^a^t +^l^i^a^s +^l^i^a^r +^l^i^a^j +^l^i +^l^a^o^c +^l^a^m +^l +^k^r^o^w +^k^o^o^b +^k^n^i +^k^l^i^m +^k^c^a^b +^k +^j +^i^x^a^m +^i^t^n^a +^i^t^l^u^m +^i^r^t +^i^p^e +^i^n^m^o +^i^n^i^m +^i^m^e^s +^i^m^e^d +^i^l^e^h +^i^b +^i +^h^t^r^a^e +^h^t^a^b +^h^s^i^f +^h^s^a^w +^h^s^a +^h^g^i^h +^h^c^r^a +^h +^g^o^l +^g^o^d +^g^n^o^l +^g^n^i^w +^g^n^i^r +^g^n^i^k +^g^i^p +^g^e^l +^g +^f^l^e^s +^f^l^a^h +^f^f^o +^f +^e^y^e +^e^v^a^h^i +^e^t^n^a +^e^s^o^n +^e^r^p +^e^r^o^f +^e^r^i^f +^e^r +^e^n^o^t^s +^e^n^i^l +^e^l^e^t +^e^h^t: +^e^h^t +^e^e^r^f +^e^e^n^k +^e^d^i^s +^e^d +^e^c^i^v +^e^c^i +^e^c^a^l +^e^c^a^f +^e^b +^e +^d^u^m +^d^r^o^w^s^s^a^p +^d^r^o^c +^d^r^a^h +^d^o^o^w +^d^o^o^g +^d^n^i^w +^d^n^i^h +^d^n^a^l +^d^n^a^h +^d^n^a^b +^d^l^o^g +^d^i^m +^d^e^r +^d^e^e^s +^d^e^b +^d^d^a +^d^a^e^l +^d^a^e^h +^d^a^e^d +^d^a^b +^d +^c^c^a +^c +^b^u^s +^b^o +^b^b^p^h^p]]]] +^b +^a^r^t^l^u +^a^n^a +^a^i^d +^a^g^e^m +^a^e^t +^a^e^s +^a +^Z +^Y +^X +^W +^V +^U +^T +^S +^R +^Q +^P +^O +^N +^M +^L +^K +^J +^I +^H +^G +^F +^E +^D +^C +^B +^A +^@ +^9^9^9^1 +^9^8^9^1 +^9^7^9^1 +^9^6^9^1 +^9^5^9^1 +^9^4^9^1 +^9^1^0^2 +^9^0^0^2 +^8^9^9^1 +^8^8^9^1 +^8^7^9^1 +^8^6^9^1 +^8^5^9^1 +^8^4^9^1 +^8^1^0^2 +^8^0^0^2 +^7{ +^7^9^9^1 +^7^8^9^1 +^7^7^9^1 +^7^6^9^1 +^7^5^9^1 +^7^4^9^1 +^7^1^0^2 +^7^0^0^2 +^6{ +^6^9^9^1 +^6^8^9^1 +^6^7^9^1 +^6^6^9^1 +^6^5^9^1 +^6^4^9^1 +^6^1^0^2 +^6^0^0^2 +^5{*33 +^5{ +^5^9^9^1 +^5^8^9^1 +^5^7^9^1 +^5^6^9^1 +^5^5^9^1 +^5^4^9^1 +^5^1^0^2 +^5^0^0^2 +^4^9^9^1 +^4^8^9^1 +^4^7^9^1 +^4^6^9^1 +^4^5^9^1 +^4^4^9^1 +^4^1^0^2 +^4^0^0^2 +^3^9^9^1 +^3^8^9^1 +^3^7^9^1 +^3^6^9^1 +^3^5^9^1 +^3^4^9^1 +^3^2^1 +^3^1^0^2 +^3^0^0^2 +^2^9^9^1 +^2^8^9^1 +^2^7^9^1 +^2^6^9^1 +^2^5^9^1 +^2^4^9^1 +^2^1^0^2 +^2^1 +^2^0^0^2 +^2 +^1^9^9^1 +^1^8^9^1 +^1^7^9^1 +^1^6^9^1 +^1^5^9^1 +^1^4^9^1 +^1^2^3 +^1^1^0^2 +^1^0^0^2 +^1^0 +^1 +^0^9^9^1 +^0^8^9^1 +^0^7^9^1 +^0^6^9^1 +^0^5^9^1 +^0^4^9^1 +^0^1^0^2 +^0^0^0^2 +^. +^-^x^e +^-^t^n^a +^-^s^i^m +^-^r^e^v^o +^-^r^e^p^y^h +^-^n^o^n +^-^i^m^e^s +^- +^* +^# +^! +^ ^y^m +^ ^u^o^y +^ ^u +^ ^t^o^n^ ^m^a^ ^i +^ ^t^n^o^d^ ^i +^ ^t^'^n^o^d^ ^i +^ ^s^i^ ^t^i +^ ^s^i^ ^s^i^h^t +^ ^s^i^ ^e^h^s +^ ^s^i^ ^e^h +^ ^r^ ^y^e^h^t +^ ^r^ ^u^o^y +^ ^r^ ^e^w +^ ^p^o^t +^ ^m^a^ ^i +^ ^m^'^i +^ ^m^'^I +^ ^l^l^i^m +^ ^i +^ ^e^v^a^h^ ^i +^ ^e^r^a^ ^y^e^h^t +^ ^e^r^a^ ^u^o^y +^ ^e^r^a^ ^e^w +^ ^e^h^t +^ ^d^n^a^s +^ ^a^ ^m^i +^ ^a +^ ^I +]l]$e +]l]$a +]c +]]l]$y +]]l]$o +]]]l$p$h$p$b$b +]]]d +]]]]]] +]]]]] +]]]]$p$h$p$b$b +]]]] +]]]Z1 +]]]$y +]]]$s +]]]$o +]]]$m$a$n +]]]$i +]]]$e +]]]$a +]]]$1$2$3 +]]]$1 +]]] +]]D1] +]]$y +]]$s +]]$o +]]$i$e +]]$e$r +]]$a +]]$1 +]] $1$2 +]] +][ +]Y1 +]Kx01{Z1'4 +]D1 +],1[ +]$y +]$s +]$ol +]$o +]$i$n$g +]$e$s +]$e$d +]$e +]$d]]] +]$d +]$a +]$1 +] { [ } +] ] ] ] +] ] ] $y +] ] ] $p $h $p $b $b +] ] ] $o +] ] ] $m $a $n +] ] ] $d $o $g +] ] ] +] ] K +] ] $s +] ] $i $e +] ] $e $r +] ] $a +] ] +] $0 +] +[^z +[^y +[^x +[^w +[^v +[^u +[^t +[^s +[^r +[^q +[^p +[^o +[^n +[^m +[^l +[^k +[^j +[^i +[^h +[^g +[^f: +[^f +[^d +[^c +[^b +[^a +[^Z +[^Y +[^X +[^W +[^V +[^U +[^T +[^S +[^R +[^Q +[^P +[^O +[^N +[^M +[^L +[^K +[^J +[^I +[^H +[^G +[^F +[^E +[^D +[^C +[^B +[^A +[]d +[] +[[[[[ +[[[[ +[[[$1$2$3 +[[[$1 +[[[ $1 +[[[ $1 +[[[ +[[ +[ ^k +[ ] +[ [ [ +[ [ +[ $1 +[ +Z5*75'5{x02 +Z5*75'5i01{ +Z5*75'5$Sl +Z4'8x42 +Z2o5y'6 +Z2 +Z1 +Y5i4-x28 +Y4x26 +Y3x35 +Y2*72'4 +Y1 +T5 +T1 +T0] +T0 +Kx32p2*A5'4 +K: +K*54x31'4 +K +E$sT0 +E +D5: +D5 +D4 +D3D2 +D3: +D3 +D2] +D2D4: +D2D3 +D2D2z3x13 +D2D1 +D2 D2 +D2 +D1lCl] +D1] +D1D4 +D1D3D5 +D1 +D0D3 +D0 D3 +C$~$!$@$#$$ +C$z +C$y +C$x +C$w$o$o$d +C$w$i$s$e +C$w$a$y +C$w +C$v +C$u$p +C$u$m +C$u +C$t$y +C$t$i$o$n +C$t$h$e +C$t +C$s$o$m$e +C$s$i$s +C$s$i$o$n +C$s$i$d$e +C$s$h$i$p +C$s$h +C$s$e$x$y +C$s$e$s +C$s +C$r$o$o$m +C$r +C$q +C$p$a$s$s +C$p +C$o$v$e$r +C$o$u$t +C$o$u$s +C$o$u$r +C$o$s$e +C$o$r$y +C$o$r +C$o$n +C$o$m$y +C$o$l$o$g$y +C$o$l +C$o$i$d +C$o$e$s +C$o +C$n$e$s$s +C$n +C$m$e$n$t +C$m$e$n +C$m$a$n +C$m +C$l$y +C$l$o$o$p +C$l$o$n$g +C$l$i$n$g +C$l$i$n$e +C$l$i$k$e +C$l$e$t +C$l$e$s$s +C$l$a$n$d +C$l +C$k$i$n +C$k +C$j +C$i$z$e +C$i$x +C$i$v$e +C$i$t$y +C$i$t$i$v$e +C$i$t$i$o$n +C$i$t$i$c +C$i$t$e +C$i$s$t +C$i$s$m +C$i$s$h +C$i$s$e +C$i$o$u$s +C$i$o$n +C$i$n$g +C$i$n$e +C$i$l$y +C$i$l$i$a +C$i$l$e +C$i$f$y +C$i$e$s$t +C$i$e$s +C$i$e$r +C$i$d$e +C$i$c$l$e +C$i$c$e$s +C$i$c +C$i$b$l$e +C$i$a$n +C$i$a$l +C$i +C$h$o$o$d +C$h$e$a$d +C$h +C$g$e$n$y +C$g +C$f$u$l$l$y +C$f$u$l +C$f$o$r$m +C$f +C$e$t$t$e +C$e$t +C$e$s$t +C$e$s$s +C$e$s +C$e$r$y +C$e$r +C$e$o$u$s +C$e$n$t +C$e$n$c$e +C$e$n +C$e$l$l$a +C$e$e +C$e$d +C$e$a$u +C$e +C$d$o$m$e +C$d$a$y +C$d +C$c$y +C$c +C$b$o$y +C$b$o$o$k +C$b$e$l$l +C$b$a$l$l +C$b$a$c$k +C$b$a$b$y +C$b +C$a$u$x +C$a$t$i$v$e +C$a$t$i$o$n +C$a$s$e +C$a$r$y +C$a$n$t +C$a$n$e +C$a$n$d +C$a$n$c$e +C$a$n$a +C$a$n +C$a$m +C$a$l$l$y +C$a$l +C$a$g$e +C$a$c$l$e +C$a$b$l$e +C$a +C$S +:x03l +:so0 +: +.3$J'4y4 +.2 +-0 +,3 +,2 ++5]}}}}'4 ++5 ++3x32 ++0+0+0x12 ++0+0+0+0+0+0+0+0 ++0+0 ++0 +*53l +*52 +*41x13 +*40 +*32 +*25 +*23x32 +*23 +*22se3 +*21][ +*15'4d'3p1 +*15'3y3 +*15 +*14 +*13x12 +*12'5D0 +*11$2$2 +*04+0'4l +*02 +'A$! +'9$! +'8$* +'8$# +'8$! +'7$~ +'7$} +'7$| +'7${ +'7$_ +'7$^ +'7$] +'7$\ +'7$[ +'7$? +'7$> +'7$= +'7$< +'7$; +'7$: +'7$9 +'7$8 +'7$7 +'7$6 +'7$5 +'7$4 +'7$3 +'7$2 +'7$1$2$3$4 +'7$1$2$3 +'7$1 +'7$0 +'7$- +'7$+ +'7$* +'7$) +'7$& +'7$% +'7$$ +'7$# +'7$!$!$!$!$!$!$!$!$!$!$!$! +'7$!$!$!$!$!$!$!$!$!$! +'7$!$!$!$!$!$!$!$!$! +'7$!$!$!$!$!$!$!$! +'7$!$!$!$!$!$!$! +'7$!$!$!$!$!$! +'7$!$!$!$! +'7$!$!$! +'7$!$! +'7$! +'7 +'7 +'6$~ +'6$} +'6$| +'6${ +'6$i$2$3$4 +'6$_ +'6$^ +'6$] +'6$\ +'6$[ +'6$? +'6$> +'6$= +'6$< +'6$; +'6$: +'6$9 +'6$8 +'6$7 +'6$6 +'6$5 +'6$4 +'6$3 +'6$2 +'6$1$2$3 +'6$1 +'6$0 +'6$. +'6$- +'6$+ +'6$* +'6$( +'6$& +'6$% +'6$$ +'6$# +'6$!$!$!$!$!$!$!$!$!$!$!$! +'6$!$!$!$!$!$!$!$!$!$! +'6$!$!$!$!$!$!$!$!$! +'6$!$!$!$!$!$!$!$! +'6$!$!$!$!$!$! +'6$!$!$!$! +'6$!$!$! +'6$!$! +'6$! +'6 +'6 +'5[ +'5D3 +'5D2p1 +'5D2d +'5$1 +'5$. +'5 $1 +'5 +'5 +'4y4 +'4p1 +'4i4y +'4d +'4$y +'4$. +'4 p1 +'4 d +'4 +'4 +'3d +'3$1$2$3 +'3$. +'3 d +'3 +'3 +'2$. +$~$!$@$#$$ +${x12] +$z +$y]'4p1 +$y +$x +$w$o$o$d +$w$i$s$e +$w$a$y +$u$p +$u$m +$t$y +$t$i$o$n +$t$h$e +$t$e$s$t +$s$o$m$e +$s$m$i$t$h +$s$i$s +$s$i$o$n +$s$i$d$e +$s$h$i$p +$s$e$s +$s$e$r$v$e$r +$s$a$l$a$s$a$n$a +$s +$r$o$o$m +$q$w$e$r$t$y +$p$h$p$b$b +$p$a$s$s +$o$v$e$r +$o$u$t +$o$u$s +$o$u$r +$o$s$e +$o$r$y +$o$r +$o$m$y +$o$l$o$g$y +$o$l +$o$i$d +$o$e$s +$n$e$s$s +$m$i$k$e +$m$i$c$h$a$e$l +$m$e$n$t +$m$e$n +$m$e +$m$a$n +$l$y +$l$o$n$g +$l$i$n$g +$l$i$n$e +$l$i$k$e +$l$e$t +$l$e$s$s +$l$e$e +$l$a$n$d +$k$i$n +$k$h$a$n +$j$o$n$e$s +$j$o$h$n$s$o$n +$j$o$h$n +$i$z$e +$i$x +$i$v$e +$i$t$y +$i$t$i$v$e +$i$t$i$o$n +$i$t$i$c +$i$t$e +$i$s$t +$i$s$m +$i$s$h +$i$s$e +$i$o$u$s +$i$o$n +$i$n$g +$i$n$e +$i$l$y +$i$l$i$a +$i$l$e +$i$f$y +$i$e$s$t +$i$e$s +$i$e$r +$i$d$e +$i$c$l$e +$i$c$e$s +$i$c +$i$b$l$e +$i$a$l +$i +$h$o$o$d +$h$e$a$d +$h$a$c$k$e$r +$g$e$n$y +$f$u$l$l$y +$f$u$l +$f$o$r$m +$f$a$r$m$v$i$l$l$e +$e$t$t$e +$e$t +$e$s$t +$e$s$s +$e$r$y +$e$r +$e$o$u$s +$e$n$t +$e$n$c$e +$e$n +$e$l$l$a +$e$e +$e$d +$e$a$u +$e $d +$e +$d$o$m$e +$d$o$g +$d$a$y +$d$a$v$i$d +$c$y +$b$r$o$w$n +$b$o$y +$b$o$o$k +$b$e$l$l +$b$a$l$l +$b$a$c$k +$b +$a$u$x +$a$t$i$v$e +$a$t$i$o$n +$a$s$e +$a$r$y +$a$n$t +$a$n$e +$a$n$d +$a$n$c$e +$a$n$a +$a$l$l$y +$a$l +$a$g$e +$a$c$l$e +$a$b$l$e +$a +$`'5 +$V] +$Sl +$@$z$o$h$o$.$c$o$m +$@$y$m$a$i$l$.$c$o$m +$@$y$a$h$o$o$.$c$o$m +$@$y$a$h$o$o$.$c$o$.$u$k +$@$y$a$h$o$o$.$c$o$.$i$n +$@$y$a$h$o$o$.$c$a +$@$w$p$.$p$l +$@$v$e$r$i$z$o$n$.$n$e$t +$@$m$s$n$.$c$o$m +$@$m$a$i$l$.$r$u +$@$m$a$i$l$.$c$o$m +$@$l$i$v$e$.$c$o$m +$@$l$i$v$e$.$c$o$.$u$k +$@$i$n$b$o$x$.$r$u +$@$h$o$t$m$a$i$l$.$c$o$m +$@$h$o$t$m$a$i$l$.$c$o$.$u$k +$@$g$m$x$.$u$s +$@$g$m$x$.$c$o$m +$@$g$m$a$i$l$.$c$o$m +$@$g$a$w$a$b$.$c$o$m +$@$f$a$s$t$m$a$i$l$.$f$m +$@$e$a$r$t$h$l$i$n$k$.$n$e$t +$@$c$o$x$.$n$e$t +$@$c$o$m$c$a$s$t$.$n$e$t +$@$b$i$g$s$t$r$i$n$g$.$c$o$m +$@$b$e$l$l$s$o$u$t$h$.$n$e$t +$@$a$o$l$.$c$o$m +$@$a$m$e$l$e$.$c$o$m +$9Z1 +$9$9$9$9$9$9$9$9$9$9$9$9 +$9$9$9$9$9$9$9$9$9$9$9 +$9$9$9$9$9$9$9$9$9$9 +$9$9$9$9$9$9$9$9$9 +$9$9$9$9$9$9$9$9 +$9$9$9$9$9$9$9 +$9$9$9$9$9$9 +$9$9$9$9 +$9$9$9 +$9$9 +$9$8 +$9$7 +$9$6 +$9$5 +$9$4 +$9$3 +$9$2 +$9$1 +$9$0 +$9 $9 $9 +$9 $9 +$9 +$8z3x13 +$8$9 +$8$8kk +$8$8$8$8$8$8$8$8$8$8$8$8 +$8$8$8$8$8$8$8$8$8$8$8 +$8$8$8$8$8$8$8$8$8$8 +$8$8$8$8$8$8$8$8$8 +$8$8$8$8$8$8$8$8 +$8$8$8$8$8$8$8 +$8$8$8$8$8$8 +$8$8$8$8 +$8$8$8 +$8$8 +$8$7 +$8$6 +$8$5 +$8$4 +$8$3 +$8$2 +$8$1 +$8$0 +$8 $8 +$8 +$7Y1Kz3x13 +$7$9 +$7$8 +$7$7$7$7$7$7$7$7$7$7$7$7 +$7$7$7$7$7$7$7$7$7$7$7 +$7$7$7$7$7$7$7$7$7$7 +$7$7$7$7$7$7$7$7$7 +$7$7$7$7$7$7$7$7 +$7$7$7$7$7$7$7 +$7$7$7$7$7$7 +$7$7$7$7 +$7$7$7 +$7$7 +$7$6 +$7$5 +$7$4 +$7$3 +$7$2 +$7$1 +$7$0 +$7 $7 +$7 +$6p4'5D1 +$6]]] +$6$9z5x15 +$6$9 +$6$8 +$6$7 +$6$6$6$6$6$6$6$6$6$6$6$6 +$6$6$6$6$6$6$6$6$6$6$6 +$6$6$6$6$6$6$6$6$6$6 +$6$6$6$6$6$6$6$6$6 +$6$6$6$6$6$6$6$6 +$6$6$6$6$6$6$6 +$6$6$6$6$6$6 +$6$6$6$6 +$6$6$6 +$6$6 +$6$5 +$6$4 +$6$3 +$6$2 +$6$1 +$6$0 +$6 $9 +$6 $6 $6 +$6 +$5$9 +$5$8 +$5$7 +$5$6 +$5$5$5$5$5$5$5$5$5$5$5$5 +$5$5$5$5$5$5$5$5$5$5$5 +$5$5$5$5$5$5$5$5$5$5 +$5$5$5$5$5$5$5$5$5 +$5$5$5$5$5$5$5$5 +$5$5$5$5$5$5$5 +$5$5$5$5$5$5 +$5$5$5$5 +$5$5$5 +$5$5 +$5$4 +$5$3 +$5$2 +$5$1 +$5$0 +$5 +$4$9 +$4$8 +$4$7 +$4$6 +$4$5 +$4$4$4$4$4$4$4$4$4$4$4$4 +$4$4$4$4$4$4$4$4$4$4$4 +$4$4$4$4$4$4$4$4$4$4 +$4$4$4$4$4$4$4$4$4 +$4$4$4$4$4$4$4$4 +$4$4$4$4$4$4$4 +$4$4$4$4$4$4 +$4$4$4$4 +$4$4$4 +$4$4 +$4$3 +$4$2 +$4$1 +$4$0 +$4 +$3*44 +$3$9 +$3$8 +$3$7 +$3$6 +$3$5 +$3$4 +$3$3$3$3$3$3$3$3$3$3$3$3 +$3$3$3$3$3$3$3$3$3$3$3 +$3$3$3$3$3$3$3$3$3$3 +$3$3$3$3$3$3$3$3$3 +$3$3$3$3$3$3$3$3 +$3$3$3$3$3$3$3 +$3$3$3$3$3$3 +$3$3$3$3 +$3$3$3 +$3$3 +$3$2 +$3$1 +$3$0 +$3 +$2i01{ +$2Z1 +$2$9 +$2$8 +$2$7 +$2$6 +$2$5 +$2$4 +$2$3 +$2$2$2$2$2$2$2$2$2$2$2$2 +$2$2$2$2$2$2$2$2$2$2$2 +$2$2$2$2$2$2$2$2$2$2 +$2$2$2$2$2$2$2$2$2 +$2$2$2$2$2$2$2$2 +$2$2$2$2$2$2$2 +$2$2$2$2$2$2 +$2$2$2$2 +$2$2$2 +$2$2 +$2$1'5$1 +$2$1 +$2$0$1$3$~ +$2$0$1$3$| +$2$0$1$3$` +$2$0$1$3$_ +$2$0$1$3$^ +$2$0$1$3$@ +$2$0$1$3$? +$2$0$1$3$= +$2$0$1$3$. +$2$0$1$3$- +$2$0$1$3$+ +$2$0$1$3$* +$2$0$1$3$) +$2$0$1$3$( +$2$0$1$3$& +$2$0$1$3$% +$2$0$1$3$$ +$2$0$1$3$# +$2$0$1$3$! +$2$0$1$2$~ +$2$0$1$2$| +$2$0$1$2$` +$2$0$1$2$_ +$2$0$1$2$^ +$2$0$1$2$@ +$2$0$1$2$? +$2$0$1$2$= +$2$0$1$2$. +$2$0$1$2$- +$2$0$1$2$+ +$2$0$1$2$* +$2$0$1$2$) +$2$0$1$2$( +$2$0$1$2$& +$2$0$1$2$% +$2$0$1$2$$ +$2$0$1$2$# +$2$0$1$2$! +$2$0$1$1$~ +$2$0$1$1$| +$2$0$1$1$` +$2$0$1$1$_ +$2$0$1$1$^ +$2$0$1$1$@ +$2$0$1$1$? +$2$0$1$1$= +$2$0$1$1$. +$2$0$1$1$- +$2$0$1$1$+ +$2$0$1$1$* +$2$0$1$1$) +$2$0$1$1$( +$2$0$1$1$& +$2$0$1$1$% +$2$0$1$1$$ +$2$0$1$1$# +$2$0$1$1$! +$2$0$1$0$~ +$2$0$1$0$| +$2$0$1$0$` +$2$0$1$0$_ +$2$0$1$0$^ +$2$0$1$0$@ +$2$0$1$0$? +$2$0$1$0$= +$2$0$1$0$. +$2$0$1$0$- +$2$0$1$0$+ +$2$0$1$0$* +$2$0$1$0$) +$2$0$1$0$( +$2$0$1$0$& +$2$0$1$0$% +$2$0$1$0$$ +$2$0$1$0$# +$2$0$1$0$! +$2$0 +$2 $3 +$2 $2 +$2 $1 +$2 $0 $0 $2 +$2 $0 $0 $0 +$2 +$1l +$1Z1 +$1$9$9$2$~ +$1$9$9$2$| +$1$9$9$2$` +$1$9$9$2$_ +$1$9$9$2$^ +$1$9$9$2$@ +$1$9$9$2$? +$1$9$9$2$= +$1$9$9$2$. +$1$9$9$2$- +$1$9$9$2$+ +$1$9$9$2$* +$1$9$9$2$) +$1$9$9$2$( +$1$9$9$2$& +$1$9$9$2$% +$1$9$9$2$$ +$1$9$9$2$# +$1$9$9$2$! +$1$9$9$1$~ +$1$9$9$1$| +$1$9$9$1$` +$1$9$9$1$_ +$1$9$9$1$^ +$1$9$9$1$@ +$1$9$9$1$? +$1$9$9$1$= +$1$9$9$1$. +$1$9$9$1$- +$1$9$9$1$+ +$1$9$9$1$* +$1$9$9$1$) +$1$9$9$1$( +$1$9$9$1$& +$1$9$9$1$% +$1$9$9$1$$ +$1$9$9$1$# +$1$9$9$1$! +$1$9$9$0$~ +$1$9$9$0$| +$1$9$9$0$` +$1$9$9$0$_ +$1$9$9$0$^ +$1$9$9$0$@ +$1$9$9$0$? +$1$9$9$0$= +$1$9$9$0$. +$1$9$9$0$- +$1$9$9$0$+ +$1$9$9$0$* +$1$9$9$0$) +$1$9$9$0$( +$1$9$9$0$& +$1$9$9$0$% +$1$9$9$0$$ +$1$9$9$0$# +$1$9$9$0$! +$1$9 +$1$8 +$1$7 +$1$6 +$1$5 +$1$4 +$1$3 +$1$2: +$1$2$3z3x13 +$1$2$3$4$5$6$7$8$9$0 +$1$2$3$4$5$6$7$8$9 +$1$2$3$4$5$6$7$8 +$1$2$3$4$5$6$7 +$1$2$3$4$5$6 +$1$2$3$4$5 +$1$2$3$4 +$1$2$3 +$1$2 +$1$1$1$1$1$1$1$1$1$1$1$1 +$1$1$1$1$1$1$1$1$1$1$1 +$1$1$1$1$1$1$1$1$1$1 +$1$1$1$1$1$1$1$1$1 +$1$1$1$1$1$1$1$1 +$1$1$1$1$1$1$1 +$1$1$1$1$1$1 +$1$1$1$1 +$1$1$1 +$1$1 +$1$0: +$1$0 +$1 $3 +$1 $2 $3 +$1 $2 +$1 $1 +$1 +$0Z1 +$0Y1: +$0*44 +$0$9 +$0$8 +$0$7 +$0$6 +$0$5 +$0$4 +$0$3 +$0$2 +$0$1$2$3$4$5$6$7$8$9 +$0$1 +$0$0$7}[ +$0$0 +$0 $1 +$0 $0 +$0 +$.$z$w +$.$z$m +$.$z$a +$.$y$u +$.$y$t +$.$y$e +$.$w$s +$.$w$f +$.$v$u +$.$v$n +$.$v$i +$.$v$g +$.$v$e +$.$v$c +$.$v$a +$.$u$z +$.$u$y +$.$u$s +$.$u$m +$.$u$k +$.$u$g +$.$u$a +$.$t$z +$.$t$w +$.$t$v +$.$t$t +$.$t$r$a$v$e$l +$.$t$r +$.$t$p +$.$t$o +$.$t$n +$.$t$m +$.$t$l +$.$t$k +$.$t$j +$.$t$h +$.$t$g +$.$t$f +$.$t$d +$.$t$c +$.$s$z +$.$s$y +$.$s$v +$.$s$u +$.$s$t +$.$s$r +$.$s$o +$.$s$n +$.$s$m +$.$s$l +$.$s$k +$.$s$j +$.$s$i +$.$s$h +$.$s$g +$.$s$e +$.$s$d +$.$s$c +$.$s$b +$.$s$a +$.$r$w +$.$r$u +$.$r$o$o$t +$.$r$o +$.$r$e +$.$q$a +$.$p$y +$.$p$w +$.$p$t +$.$p$s +$.$p$r$o +$.$p$r +$.$p$n +$.$p$m +$.$p$l +$.$p$k +$.$p$h +$.$p$g +$.$p$f +$.$p$e +$.$p$a +$.$o$r$g +$.$o$m +$.$n$z +$.$n$u +$.$n$r +$.$n$p +$.$n$o +$.$n$l +$.$n$i +$.$n$g +$.$n$f +$.$n$e$t +$.$n$e +$.$n$c +$.$n$a$m$e +$.$n$a +$.$m$z +$.$m$y +$.$m$x +$.$m$w +$.$m$v +$.$m$u$s$e$u$m +$.$m$u +$.$m$t +$.$m$s +$.$m$r +$.$m$q +$.$m$p +$.$m$o$b$i +$.$m$o +$.$m$n +$.$m$m +$.$m$l +$.$m$k +$.$m$i$l +$.$m$h +$.$m$g +$.$m$d +$.$m$c +$.$m$a +$.$l$y +$.$l$v +$.$l$u +$.$l$t +$.$l$s +$.$l$r +$.$l$k +$.$l$i +$.$l$c +$.$l$b +$.$l$a +$.$k$z +$.$k$y +$.$k$w +$.$k$r +$.$k$n +$.$k$m +$.$k$i +$.$k$h +$.$k$g +$.$k$e +$.$j$p +$.$j$o$b$s +$.$j$o +$.$j$m +$.$j$e +$.$i$t +$.$i$s +$.$i$r +$.$i$q +$.$i$o +$.$i$n$t +$.$i$n$f$o +$.$i$n +$.$i$m +$.$i$l +$.$i$e +$.$i$d +$.$h$u +$.$h$t +$.$h$r +$.$h$n +$.$h$m +$.$h$k +$.$g$y +$.$g$w +$.$g$u +$.$g$t +$.$g$s +$.$g$r +$.$g$q +$.$g$p +$.$g$o$v +$.$g$n +$.$g$m +$.$g$l +$.$g$i +$.$g$h +$.$g$g +$.$g$f +$.$g$e +$.$g$d +$.$g$b +$.$g$a +$.$f$r +$.$f$o +$.$f$m +$.$f$k +$.$f$j +$.$f$i +$.$e$u +$.$e$t +$.$e$s +$.$e$r +$.$e$g +$.$e$e +$.$e$d$u +$.$e$c +$.$d$z +$.$d$o +$.$d$m +$.$d$k +$.$d$j +$.$d$e +$.$c$z +$.$c$y +$.$c$x +$.$c$v +$.$c$u +$.$c$r +$.$c$o$o$p +$.$c$o$m +$.$c$o +$.$c$n +$.$c$m +$.$c$l +$.$c$k +$.$c$i +$.$c$h +$.$c$g +$.$c$f +$.$c$d +$.$c$c +$.$c$a$t +$.$c$a +$.$b$z +$.$b$y +$.$b$w +$.$b$v +$.$b$t +$.$b$s +$.$b$r +$.$b$o +$.$b$n +$.$b$m +$.$b$j +$.$b$i$z +$.$b$i +$.$b$h +$.$b$g +$.$b$f +$.$b$e +$.$b$d +$.$b$b +$.$b$a +$.$a$z +$.$a$x +$.$a$w +$.$a$u +$.$a$t +$.$a$s +$.$a$r$p$a +$.$a$r +$.$a$q +$.$a$o +$.$a$n +$.$a$m +$.$a$l +$.$a$i +$.$a$g +$.$a$f +$.$a$e$r$o +$.$a$e +$.$a$d +$.$a$c +$. +$- +$&$a$m$p$; +$# +$!$!$!$!$!$!$!$!$!$!$! +$!$!$!$!$!$!$!$!$!$! +$!$!$!$!$!$!$!$!$! +$!$!$!$!$!$!$!$! +$!$!$!$!$!$!$! +$!$!$!$!$!$! +$!$!$!$!$! +$!$!$!$! +$!$!$! +$!$! +$! +$ +^[$] +^{$} +^<$> +^($) +^^$^ +^&$& +^*$* +^@$@ +^!$! +^~$~ +^#$# +^.$. +^|$| +^\$\ +^$$$ +^%$% +^&$& +^-$- +^_$_ +^=$= +^+$+ \ No newline at end of file diff --git a/rules/best64.rule b/rules/best64.rule new file mode 100644 index 0000000000..9a053835c3 --- /dev/null +++ b/rules/best64.rule @@ -0,0 +1,102 @@ +## nothing, reverse, case... base stuff +: +r +u +T0 + +## simple number append +$0 +$1 +$2 +$3 +$4 +$5 +$6 +$7 +$8 +$9 + +## special number append +$0 $0 +$0 $1 +$0 $2 +$1 $1 +$1 $2 +$1 $3 +$2 $1 +$2 $2 +$2 $3 +$6 $9 +$7 $7 +$8 $8 +$9 $9 +$1 $2 $3 + +## high frequency append +$e +$s + +## high frequency overwrite at end +] $a +] ] $s +] ] $a +] ] $e $r +] ] $i $e +] ] ] $o +] ] ] $y +] ] ] $1 $2 $3 +] ] ] $m $a $n +] ] ] $d $o $g + +## high frequency prepend +^1 +^e ^h ^t + +## high frequency overwrite at start +o0d +o0m o1a + +## leetify +so0 +si1 +se3 + +## simple extracts +D2 +D2 D2 +D3 +D4 + +## undouble word +'5 D3 +'5 $1 + +## removes suffixes from 'strongified' passwords in dict +] +] ] +] ] ] +] ] ] d +] ] D1 ] + +## rotates ++5 ] } } } } '4 +x02 { { { { { { +} ] ] { +} } -0 x12 +} } } +} } } } '4 +} } } } } '5 +} } } } } } Y4 '4 d + +## unknown +*04 +0 '4 +*05 x03 d '3 p1 ++0 +0 +0 +0 +0 +0 +0 +0 ++0 +0 +0 x12 +Z4 '8 x42 +Z5 '6 x31 ] p1 +Z5 *75 '5 { x02 +d x28 Y4 '4 d +f *A5 '8 x14 +p2 '7 p1 x58 +x14 d p2 '6 diff --git a/rules/combinator.rule b/rules/combinator.rule new file mode 100644 index 0000000000..fc2c8636b2 --- /dev/null +++ b/rules/combinator.rule @@ -0,0 +1,59 @@ +## rule: case recovery +## limits: capitalized rules only char positions 3 to 7 +## example: annalove ---> AnnaLove +## extras: none + +: +l +c +u + +c T3 +c T4 +c T5 +c T6 +c T7 + +## rule: experienced effective +## limits: none +## example: FringeDevision ---> fringedevision2009 +## extras: lower case only + +l $1 +l $2 +l $1$2$3 +l $2$0$0$7 +l $2$0$0$8 +l $2$0$0$9 + +## rule: hyphen variety +## limits: insert at char positions 3 to 7 +## example: theobserver ---> the observer +## extras: lower case only + +l i3 +l i4 +l i5 +l i6 +l i7 +l i3& +l i4& +l i5& +l i6& +l i7& +l i3+ +l i4+ +l i5+ +l i6+ +l i7+ +l i3- +l i4- +l i5- +l i6- +l i7- +l i3. +l i4. +l i5. +l i6. +l i7. + diff --git a/rules/d3ad0ne.rule b/rules/d3ad0ne.rule new file mode 100644 index 0000000000..c7413ecd56 --- /dev/null +++ b/rules/d3ad0ne.rule @@ -0,0 +1,35406 @@ +# Created by: D3ad0ne +# V2.1 +$ $1 +$ $2 +$ $3 +$ $7 +$ $R +$ $g +$ $l +$ $m +$ $n +$ $p +$ $t +$ *03 +$ *35 +$ *47 +$ *52 +$ *84 +$ +0 +$ -0 +$ @9 +$ D1 +$ D2 +$ Z1 +$ Z2 +$ ^7 +$ ^8 +$ ^b +$ ^g +$ k +$ o7uz2 +$ p1 +$ san$g +$ t +$ x03 +$ x04 +$ x06 +$ x08 +$ x09 +$ x13 +$ x23 +$ x34 +$ x41 +$ x52 +$ x53 +$ { +$ }Z2 +$! +$!$!^$^$ +$!$& +$!$) +$!$1 +$!$2 +$!$3 +$!$@ +$!$@$# +$!$@$#$$ +$!$@$#$$$% +$!*03 +$!*04 +$!*25 +$!*36$( +$!*45 +$!*62x19 +$!*74 +$!+1 +$!+4 +$!+8 +$!-0x46 +$!-1 +$!-3i6p +$!-5 +$!C +$!D3 +$!D9 +$!T0 +$!T3 +$!T4 +$!Z1 +$!Z2 +$!Z4 +$![ +$!^% +$!^0 +$!^D +$!^cc +$!^y +$!d +$!d] +$!i4-l +$!i6= +$!i85 +$!k +$!o0F +$!o3n +$!o6o +$!p1 +$!q +$!qx35 +$!s6Z +$!sy6 +$!t$u +$!u +$!x02 +$!x06 +$!x18 +$!x21 +$!x25 +$!x32 +$!x35 +$!x53 +$!x54 +$!x61 +$!x63 +$!x6B +$!x71 +$!x76 +$!x84 +$!z2 +$" +$"$% +$"'7D1 +$"*72 +$"D0'3 +$"R4 +$"Z1 +$"Z2 +$"[ +$"i4no6l +$"i7! +$"l +$"o4e$! +$"p1 +$"s": +$"u +$"x01 +$"x21*21 +$# +$#$1 +$#$7 +$#$E +$#'8 +$#*57 +$#*97 +$#+7 +$#-6 +$#-7*45 +$#-8 +$#D3 +$#T2 +$#Z1 +$#Z2 +$#^Q +$#d +$#i4K +$#i5E +$#l +$#o0w +$#o69 +$#o9|x37 +$#r +$#s#sd +$#x01 +$#x16 +$#x18 +$#x26x32 +$#x42 +$#x45 +$#x61 +$#x62 +$#x71 +$#z2 +$$ +$$$) +$$$7 +$$*04 +$$*13i1< +$$*40 +$$*54 +$$*63z2 +$$+6 +$$+7 +$$-0 +$$-7 +$$@$ +$$@f +$$C +$$D2 +$$K +$$Z1 +$$Z2 +$$Z3 +$$^# +$$^Q +$$^U +$$d +$$i0% +$$i0* +$$i01 +$$i21 +$$iA1 +$$lZ1 +$$o0J +$$o1lk +$$o80 +$$sta +$$t +$$x02 +$$x06 +$$x14 +$$x61 +$$x64 +$$x72 +$$x73 +$% +$%$! +$%$^ +$%$d +$%$j +$%'Ai4n +$%+8 +$%Z1 +$%Z2 +$%Z4 +$%^' +$%c +$%i61 +$%se1 +$%t +$%x23 +$%x51 +$%x81 +$& +$&*18 +$&*46 +$&C +$&D1 +$&Z1 +$&Z2 +$&Z3+7 +$&Z5 +$&[ +$&] +$&^$ +$&^& +$&c +$&d +$&d] +$&i5wo81 +$&i71 +$&o1-x14 +$&o3$x32 +$&o67 +$&p1 +$&u +$' +$'*60t +$'*63 +$'+4$! +$'D0 +$'T4 +$'c +$'o4y^c +$'x19 +$'z4 +$( +$($) +$(+0 +$(Z1 +$(Z3 +$(c +$(i0* +$(u +$(x24 +$(x51 +$(x82 +$) +$)'6*23 +$)C*42 +$)D1 +$)Z3 +$)^L +$)i4( +$)syQ +$)t +$)x14Z2 +$)x61 +$* +$*$& +$*$*^*^* +$*$1 +$*$M +$*$g +$**01+0 +$**34 +$**80 +$*+7 +$*-3 +$*@*+3 +$*@5 +$*D0 +$*D5x12 +$*D7 +$*L2 +$*R4 +$*T5 +$*Z1 +$*Z2 +$*Z3 +$*Z4 +$*Z5 +$*Z5t +$*^$ +$*^+ +$*^C'B +$*^K +$*^k +$*^s +$*d +$*d] +$*i1e +$*i2e +$*i7h +$*k +$*ki5F +$*l +$*o23 +$*o87^/ +$*sde +$*sln +$*x12 +$*x37 +$*x43 +$*x45 +$*x51 +$*x54 +$*x72 +$*z1 +$*z2 +$*{ +$+ +$+$# +$+$- +$+$5 +$+*24 +$+*56 +$++7 +$+-4 +$+-5 +$+@0 +$+@3 +$+@a +$+C +$+D2 +$+D5 +$+R0^% +$+Z1 +$+Z1*05 +$+Z2 +$+Z3 +$+Z4 +$+Z5 +$+[ +$+d +$+d] +$+i2-x24 +$+k +$+o70 +$+sla +$+t^! +$+x53 +$+x81 +$+x94 +$+z1 +$+}$z +$, +$,$. +$,$0 +$,$5 +$,$6 +$,$8 +$,$jo3x +$,'8 +$,-2 +$,C +$,Z1 +$,Z2 +$,[ +$,^t +$,k +$,l +$,x02 +$,x23 +$,x82 +$,x93 +$,{ +$- +$-$+ +$-$. +$-$1 +$-$x +$-'3Z1 +$-*17 +$-*57 +$--1 +$--3 +$-@1 +$-@h+5 +$-C +$-D1 +$-D5 +$-R8$t +$-Z1 +$-Z1Z4 +$-Z2 +$-Z3 +$-Z4 +$-^+ +$-^- +$-^0 +$-d +$-d] +$-f +$-i0n +$-i42 +$-o06 +$-o2^Z1 +$-o5x +$-sgVl +$-spiZ1 +$-x12 +$-x32 +$-x52 +$-x73 +$-x82 +$-z2 +$-{ +$. +$.$. +$.$.$. +$.$9 +$.$?*21 +$.$K +$.$c$o$m +$.$d +$.$d$e +$.$f$r +$.$h +$.$n$e$t +$.$o$r$g +$.$r$u +$.$x +$.*40x14 +$.*45 +$.*92 +$.+0 +$.+1 +$.-5 +$.C +$.D1 +$.Z1 +$.Z3 +$.Z4 +$.[ +$.^. +$.^= +$.d +$.i3, +$.l +$.lZ4 +$.o0w +$.svD +$.t +$.x05 +$.x25 +$.x27 +$.x63 +$.z1ss7 +$/ +$/$1 +$/$[x13 +$/$p +$/-0 +$/D3 +$/Z1 +$/Z2 +$/Z4Z1 +$/[ +$/^u +$/c +$/f +$/l +$/p1 +$/p2 +$/r +$/s/X@8 +$/s/Ysp= +$/t +$/u +$/x52 +$/x53 +$/z2 +$/z3x18 +$/z5 +$/{ +$/}z3 +$0 +$0 +$0 $1 +$0$0 +$0$0$0 +$0$0$1 +$0$0$7 +$0$1 +$0$2 +$0$3 +$0$4 +$0$5 +$0$6 +$0$7 +$0$8 +$0$9 +$0$9$8 +$0$9$8$7 +$0$9$8$7$6 +$0$9$8$7$6$5 +$0$d +$0$s +$0*17 +$0*23 +$0*24x14 +$0*67 +$0*83 +$0*85 +$0*95 +$0+5 +$0-5 +$0-7 +$0-B +$0@9 +$0C +$0D9 +$0DB +$0R7 +$0T3 +$0T6 +$0Z2 +$0Z2x26 +$0Z3 +$0Z4 +$0Z5 +$0^2 +$0^7 +$0^X +$0^b +$0^r +$0c +$0d +$0dD4 +$0dD5 +$0dD6 +$0dD7 +$0d] +$0f +$0i1p +$0i2w +$0i2y[ +$0i4xR3 +$0i5O +$0i5` +$0i5c +$0i5k +$0kz3 +$0o0&Z1 +$0o0G +$0o5; +$0o67 +$0o87 +$0p1 +$0s9a +$0sS9 +$0sd7 +$0seu +$0snu +$0t^X +$0x05 +$0x12 +$0x14x04 +$0x15 +$0x21 +$0x23 +$0x31D2 +$0x32 +$0x51 +$0x72 +$0x82 +$0x95 +$0z1 +$0z2 +$1 +$1 +$1 $2 +$1 $2 $3 +$1$! +$1$0 +$1$1 +$1$1$1 +$1$2 +$1$2$3 +$1$2$3$!$@$# +$1$2$3$4 +$1$2$3$4$5 +$1$2$3$4$5$6 +$1$2$3$4$5d]]]]] +$1$2$3$a$b$c +$1$2$3d]]] +$1$2$a$b +$1$2d]] +$1$3 +$1$4 +$1$5 +$1$6 +$1$7 +$1$8 +$1$9 +$1$9$6$0 +$1$9$6$1 +$1$9$6$2 +$1$9$6$3 +$1$9$6$4 +$1$9$6$5 +$1$9$6$6 +$1$9$6$7 +$1$9$6$8 +$1$9$6$9 +$1$9$7$0 +$1$9$7$1 +$1$9$7$2 +$1$9$7$3 +$1$9$7$4 +$1$9$7$5 +$1$9$7$6 +$1$9$7$7 +$1$9$7$8 +$1$9$7$9 +$1$9$8$0 +$1$9$8$1 +$1$9$8$2 +$1$9$8$3 +$1$9$8$4 +$1$9$8$5 +$1$9$8$6 +$1$9$8$7 +$1$9$8$8 +$1$9$8$9 +$1$9$9$0 +$1$9$9$1 +$1$9$9$2 +$1$9$9$3 +$1$9$9$4 +$1$9$9$5 +$1$9$9$6 +$1$9$9$7 +$1$9$9$8 +$1$9$9$9 +$1$K +$1$` +$1$l +$1$s$t +$1*02 +$1*03 +$1*07x43 +$1*21 +$1*28 +$1*34 +$1*41 +$1*45 +$1*52 +$1*74 +$1*89 +$1+1Z2 +$1+6 +$1+7 +$1+8 +$1+B +$1-3 +$1-6 +$1-7 +$1-8Z3 +$1@D +$1@b +$1@k +$1@s +$1@y +$1D3 +$1DA +$1L1 +$1L7$f +$1R3 +$1T1 +$1T4Z4 +$1Z1+2 +$1Z2 +$1Z4 +$1Z5 +$1[ +$1^( +$1^: +$1^:z3 +$1^I +$1^c +$1^z +$1c +$1d +$1dD4 +$1dD5 +$1dD6 +$1dD7 +$1d] +$1i0F +$1i1U +$1i2. +$1i6 +$1i6F +$1i6e +$1i7? +$1i8: +$1i9 +$1l +$1o04 +$1o3F$J +$1o3uT8 +$1o4.'6 +$1o6c +$1o6l +$1o7l +$1o8d +$1oB8 +$1s7_ +$1say +$1smn +$1suxi35 +$1t +$1t@k +$1u +$1x21*05 +$1x26z2 +$1x41r +$1x51 +$1x53 +$1x56 +$1x58 +$1x62 +$1x72 +$1x81Z2 +$1x84 +$1xA5 +$1xB2 +$1xB3 +$1z1 +$1z1Z3 +$1z2 +$1z3 +$2 +$2 +$2 $0 $0 $0 +$2 $0 $0 $1 +$2 $0 $0 $2 +$2 $0 $0 $3 +$2 $0 $0 $4 +$2 $0 $0 $5 +$2 $0 $0 $6 +$2 $0 $0 $7 +$2 $0 $0 $8 +$2 $0 $0 $9 +$2 $0 $1 $0 +$2 $0 $1 $1 +$2 $0 $1 $2 +$2$! +$2$" +$2$% +$2$* +$2$0 +$2$0$0$0 +$2$0$0$1 +$2$0$0$2 +$2$0$0$3 +$2$0$0$4 +$2$0$0$5 +$2$0$0$6 +$2$0$0$7 +$2$0$0$8 +$2$0$0$9 +$2$0$1$0 +$2$1 +$2$2 +$2$2$2 +$2$3 +$2$3$4 +$2$4 +$2$5 +$2$6 +$2$7 +$2$8 +$2$9 +$2$U +$2$] +$2$d +$2$i +$2$k +$2$m$e +$2$o +$2$u +$2$x +$2*03$i +$2*14 +$2*30 +$2*32 +$2*52 +$2*57 +$2*68 +$2*78 +$2*81 +$2+3 +$2+4 +$2+7 +$2-3 +$2-9 +$2@u +$2C +$2D4 +$2L1 +$2L5Z1 +$2R1 +$2R3 +$2R6 +$2T0 +$2Z1 +$2Z2 +$2Z2*29 +$2Z3 +$2Z4 +$2Z5D9 +$2[z3 +$2^4 +$2^>*73 +$2^r +$2^x'6 +$2c$H +$2d +$2dD4 +$2dD5 +$2dD6 +$2dD7 +$2d] +$2i2a +$2i57 +$2i6R +$2i6a +$2i8B +$2l +$2o0p +$2o2T +$2o62 +$2o67 +$2o6F +$2o8b +$2o9 +$2q +$2r +$2sbR +$2sqrt +$2t +$2tx62 +$2x24x64 +$2x32 +$2x42x16 +$2x51 +$2x53 +$2x61 +$2x73 +$2x74x04 +$2x82 +$2xA2 +$2z3 +$2z4 +$2{ +$3 +$3 +$3$% +$3$* +$3$0 +$3$0$0$0 +$3$1 +$3$2 +$3$2$1 +$3$3 +$3$3$3 +$3$4 +$3$4$5 +$3$5 +$3$6 +$3$7 +$3$8 +$3$9 +$3$d +$3$f +$3$i +$3$j +$3$k +$3*12 +$3*57 +$3*74 +$3*97 +$3+2 +$3+5 +$3+8 +$3-8 +$3-9*57 +$3@e +$3@o +$3C +$3D2 +$3D3 +$3D4z1 +$3DA +$3L0 +$3T2 +$3Z3 +$3Z4 +$3Z5 +$3^5T7 +$3^N +$3^d +$3c +$3d +$3dD4 +$3dD5 +$3dD6 +$3dD7 +$3dZ1 +$3d] +$3dx58 +$3f +$3i1a +$3i2h*41 +$3i3f +$3i66 +$3i6@ +$3i7< +$3i7y +$3i8< +$3k +$3o4/ +$3o4g +$3o58 +$3o62 +$3o6= +$3o6z +$3r +$3s5ax12 +$3sfs +$3snk +$3srl +$3szb +$3t +$3t^q +$3ti9? +$3u +$3x02 +$3x09 +$3x28 +$3x42u +$3x61 +$3x71 +$3x92 +$3z2 +$3{ +$4 +$4 +$4$0 +$4$0$0$0 +$4$1 +$4$2 +$4$3 +$4$3$2$1 +$4$4 +$4$4$4 +$4$5 +$4$5$6 +$4$6 +$4$7 +$4$8 +$4$9 +$4$M$e +$4$a$l$l +$4$e$v$e$r +$4$f$r$e$e +$4$l$i$f$e +$4$m$e +$4$m$y +$4$u +$4$u$s +$4'8 +$4*85 +$4*86 +$4*89 +$4+0 +$4+2 +$4+8 +$4+9 +$4-7 +$4-8 +$4-9 +$4@5t +$4D7 +$4D9 +$4DA +$4L0Z1 +$4L4$q +$4R0'7 +$4T5 +$4Z3 +$4Z4 +$4Z5 +$4^& +$4^2o60 +$4^c +$4^r +$4d +$4dD4 +$4dD5 +$4dD6 +$4dD7 +$4d] +$4dx49 +$4i5- +$4i5N+7 +$4i5q*15 +$4i5r +$4i8! +$4k +$4o0E +$4o2Yx46 +$4o2o +$4o4o +$4o5dx54 +$4o5gZ3 +$4o7R +$4p1 +$4q +$4qq +$4r +$4sdr +$4sma@r +$4sr1 +$4sxm +$4t +$4x02 +$4x13 +$4x21 +$4x23 +$4x35i3b +$4x47 +$4x62 +$4x81 +$4x82 +$4z3 +$4{ +$5 +$5$0 +$5$0$0$0 +$5$1 +$5$2 +$5$3 +$5$4 +$5$4$3$2$1 +$5$5 +$5$5$5 +$5$6 +$5$6$7 +$5$7 +$5$8 +$5$9 +$5*56 +$5*57 +$5*73xA2 +$5*75x63 +$5+1 +$5+5 +$5-1 +$5-7 +$5-8 +$5@6 +$5@w +$5CZ5 +$5D8 +$5DA +$5L8+3 +$5R0 +$5R4 +$5T6 +$5Z1*30 +$5Z3 +$5Z3L4 +$5Z4 +$5Z5x56 +$5[ +$5^$ +$5^+ +$5^j +$5d +$5dD4 +$5dD5 +$5dD6 +$5dD7 +$5d] +$5fL1 +$5i2! +$5i2E +$5i5b*24 +$5i6 +$5i9% +$5l +$5o4- +$5o5l +$5o65 +$5o66 +$5o7o +$5p1x53 +$5q +$5sk1 +$5skw +$5sr#x12 +$5t +$5x21 +$5x32 +$5x41 +$5x51 +$5x52 +$5x81 +$5x91 +$5xB1xB1 +$5z1 +$5z2 +$6 +$6$- +$6$0 +$6$0$0$0 +$6$1 +$6$2 +$6$3 +$6$3sys +$6$4 +$6$5 +$6$5$4$3$2$1 +$6$6 +$6$6$6 +$6$7 +$6$7$8 +$6$8 +$6$9 +$6$B +$6$V +$6$m +$6'4Z5 +$6*05 +$6*57 +$6*9B +$6+4@k +$6+7 +$6+8 +$6-0 +$6-2 +$6-8 +$6-9 +$6@o +$6D6 +$6L1 +$6L5c +$6R1 +$6T2 +$6T3 +$6Z1 +$6Z1i4c +$6Z3 +$6Z4 +$6Z5 +$6[ +$6^6o1Q +$6^H +$6c +$6d +$6dD4 +$6dD5 +$6dD6 +$6dD7 +$6d] +$6i0D +$6i1DT4 +$6i2j +$6i39 +$6i7ao6< +$6i7g +$6i8t +$6k +$6o2Z +$6o2r +$6o4D +$6r +$6r+5 +$6s19 +$6svV +$6sw' +$6x05 +$6x16 +$6x23 +$6x26 +$6x34c +$6x53 +$6x61x62 +$6x62 +$6x73 +$6xB4 +$6z4 +$6{ +$7 +$7 +$7$0 +$7$0$0$0 +$7$1 +$7$2 +$7$3 +$7$4 +$7$5 +$7$6 +$7$7 +$7$7$7 +$7$8 +$7$8$9 +$7$9 +$7$b +$7$e-2 +$7$j +$7$n +$7'6$t +$7*47x61 +$7*51x31 +$7*64 +$7*87 +$7*98 +$7+1 +$7+3 +$7+A +$7-7 +$7@b +$7@i +$7C +$7Cc +$7D2 +$7L0 +$7L1 +$7R7 +$7Z1 +$7Z2 +$7Z3 +$7Z4 +$7Z5 +$7[ +$7^4 +$7d +$7dD4 +$7dD5 +$7dD6 +$7dD7 +$7d] +$7dx62 +$7i0x +$7i2\x03 +$7i63 +$7k +$7l-0 +$7o0Z +$7o0ksmc +$7o1A +$7o61 +$7o6T +$7p2 +$7s4_ +$7sgc +$7t+0 +$7x03*20 +$7x46'5 +$7x52 +$7x54 +$7x62 +$7x82 +$7x95 +$7xB3 +$7z1 +$7z2 +$7z5 +$7z5x08 +$8 +$8$+ +$8$/ +$8$0 +$8$0$0$0 +$8$1 +$8$2 +$8$3 +$8$4 +$8$5 +$8$6 +$8$7 +$8$8 +$8$8$8 +$8$9 +$8$d +$8$p +$8*01$? +$8*04 +$8*13 +$8*23 +$8*62 +$8*68 +$8*75 +$8*78 +$8*A5 +$8+0*43 +$8-5 +$8-7 +$8@f +$8@m +$8@y +$8D2 +$8D4 +$8DB +$8L1 +$8R1 +$8T2 +$8T8T4 +$8Z2 +$8Z3 +$8Z5 +$8^b +$8c +$8d +$8dD4 +$8dD5 +$8dD6 +$8dD7 +$8d] +$8i3N +$8i4e +$8o0dx42 +$8o1u +$8o4cL6 +$8o88 +$8q +$8r +$8s61 +$8s9a +$8t +$8u +$8x23 +$8x42 +$8x46z2 +$8x63 +$8x83 +$8x83-7 +$8x92 +$8z1c +$8z1l +$8z2 +$8z3 +$8{ +$9 +$9 +$9$% +$9$0 +$9$0$0$0 +$9$1 +$9$2 +$9$3 +$9$4 +$9$5 +$9$6 +$9$7 +$9$8 +$9$9 +$9$9$9 +$9$O +$9$g +$9$i +$9*01 +$9*04 +$9*12 +$9*14 +$9*15 +$9*20 +$9+4 +$9-4 +$9-6 +$9-8 +$9@8 +$9@g +$9D5 +$9L1 +$9R5 +$9R8 +$9T2 +$9Z2 +$9Z3 +$9Z4 +$9Z5 +$9[ +$9^# +$9^D +$9^g +$9^i +$9^l +$9d +$9dD4 +$9dD5 +$9dD6 +$9dD7 +$9d] +$9f+2 +$9i5. +$9i8k +$9i95 +$9l +$9o0% +$9o2yt +$9o5V +$9o5it +$9o76 +$9o84 +$9q +$9r +$9t +$9x04 +$9x07 +$9x25R5 +$9x53 +$9x65 +$9x72 +$9xA2 +$9xB1 +$9z1 +$9z3 +$9z3x35 +$9{ +$: +$:$) +$:$1 +$:'7 +$:+0 +$:C +$:D2 +$:D4 +$:R0 +$:T6 +$:Z1 +$:Z2 +$:c +$:d +$:o6( +$:r +$:s:%t +$; +$;$) +$;$/ +$;$7 +$;$; +$;*01 +$;*61 +$;-7 +$;D9x81 +$;R4 +$;T0 +$;Z2 +$;Z3o2% +$;[ +$;^no4w +$;o7$ +$;o7i +$;u +$;x02 +$;z4 +$< +$<$1 +$<$3 +$<$uo61 +$<'6o2& +$<*12 +$<*46 +$ +$ +$>$D*18 +$>$a +$>*27^b +$>D1 +$>Z4 +$>k +$? +$?$! +$?$2 +$?*06 +$?*34 +$?*35 +$?*47sfx +$?*62 +$?*87 +$?+5 +$?+6 +$?D5 +$?L4 +$?L8 +$?Z1 +$?Z2 +$?Z3u +$?Z4 +$?[ +$?^! +$?^n +$?^z +$?d +$?i3| +$?q +$?x26 +$?x45 +$?x52 +$?x63 +$@ +$@$g$m$a$i$l$.$c$o$m +$@$g$m$x$.$d$e +$@$m$a$i$l$.$r$u +$@$y$a$n$d$e$x$.$r$u +$@*76i2M +$@-1^t +$@@i +$@L4 +$@L6 +$@T6 +$@Z1 +$@Z2 +$@Z3 +$@c +$@d +$@i61 +$@o3bx06 +$@o58 +$@t +$@tD4 +$@x02 +$@x12 +$A +$A$Y +$A$a +$A$v +$A*54sl* +$A*58x58 +$A+7 +$ACD2 +$AD6 +$AL6 +$AR8@M +$AT2 +$AZ1 +$AZ1r +$AZ3 +$A[ +$A^< +$Ac +$Ak +$Al +$Ax16Z3 +$Ax24u +$A{ +$B +$B$1 +$B$G +$B$J +$B$e +$B*72 +$B-3 +$BL1 +$BR4x43 +$BZ1 +$BZ2 +$B^*C +$Bi0L +$Bk@8 +$Bl +$BsjBL5 +$Bx19c +$Bx46 +$C +$C$D +$C$R +$C-1 +$CZ1 +$CZ1i2G +$Ci1S +$Cr +$Cx12 +$Cx18 +$Cx91 +$Cz1 +$D +$D$E +$D$I +$D$S +$D$r +$D+0 +$DD1 +$DZ1 +$D^S +$Dc +$Di1nT5 +$Dt +$Du +$DxA3iA( +$Dz2x05 +$Dz4z5 +$E +$E*65 +$E*76o0C +$E+4 +$E-6 +$ED4-3 +$ED8 +$EZ1 +$E[c +$Eo0S +$Etx04 +$Ex25 +$Ex32 +$Ex38 +$E{$S +$F +$F$C +$F$M +$F$U +$F$m +$F*23 +$F+7 +$FL6o40 +$FR2Z1 +$F[ +$Fo7r +$Fo9w$c +$Ft +$Fu +$Fx13 +$Fx32*67 +$Fx34 +$Fx36 +$G +$G$A +$G$E +$G$R +$G*09 +$G*75 +$GC$s +$GD5 +$GR8[ +$GZ2 +$GZ5*14 +$G^2 +$Gc +$Gc-0 +$Gi6D +$Glx37 +$Gr +$Gs5D+4 +$Gss3 +$Gx02 +$H +$H$t*30 +$H+0 +$H+5 +$H-5o4L +$HD3 +$HTAx62 +$HZ1 +$H^)R5 +$Hi31Z2 +$Hls2f +$Ho0lZ3 +$HsaA +$HsmA$7 +$I +$I$! +$I$G +$I$L +$I$Qo1$ +$I$p +$I*10*24 +$I*24 +$I-3u +$I@c +$IT6 +$IZ1 +$IZ2 +$I^R +$Ic +$Ii68x34 +$Il +$Io1_ +$Io79 +$Ix08$p +$Ix27 +$Ix45 +$Ix63x31 +$J +$J$B +$J$O +$J$jl +$J*64[ +$J*80 +$J+0^f +$J+2x38 +$JL5 +$J[ +$Jo1iZ1 +$Jo1o +$Js3Y +$Jx58 +$Jx63 +$K +$K$! +$K$A +$K$Q +$K$l +$K$s +$KD0 +$KD3 +$KT5 +$KZ1 +$KZ1R2 +$K[ +$K^M +$KcoAC +$Kcx34 +$Ki6F +$Ki6V +$Kl +$Ko5B +$Kr +$KsbC +$Kt +$Ku^K +$Kx17 +$Kx18 +$Kx32 +$Kx52 +$K{T4 +$L +$L$n +$L*16 +$L+0 +$LC +$LT6 +$LZ1 +$LZ2 +$L^%z1 +$L^\ +$Lk^_ +$Lo1n} +$Lro7e +$Lt +$Lx12 +$Lx1A +$Lx63 +$Lx68 +$Lx73 +$Lz2 +$M +$M$* +$M$B +$M$L +$M$W +$M+0 +$M+7 +$MD3 +$MZ1 +$MZ2 +$M[-7 +$M^m +$Mc +$Mc@K +$Ml +$Ms2e[ +$Mx04 +$Mx12 +$Mx27 +$Mx51 +$N +$N$q*40 +$N'6^m +$N*47 +$N*65 +$N@h'7 +$ND4 +$NT0 +$Nc +$Ni3Rx04 +$Ni78 +$Nl{ +$No2F*02 +$No62 +$No8ssiu +$Nr +$Nu +$Nx27 +$N{ +$N}Z1 +$O +$O$K +$O*18 +$O*5Bx1A +$O*86 +$OD4 +$OL6 +$OZ1 +$O^3-0 +$Ox24 +$Ox45o6e +$Ox53 +$O{ +$P +$P$# +$P$D +$P$E +$P$I +$P$s +$P*36x06 +$P*43$H +$P-1$O +$PD0x17 +$PD1 +$PL9 +$PR1^a +$P^No72 +$P^^ +$Pi3zl +$Plx41 +$Po6. +$Pp1o2w +$Pq +$Px26 +$Px64 +$P{o31 +$Q +$QD3 +$QD5x14 +$QL1*40 +$QR4 +$QZ1 +$QZ3 +$Qc +$Qo2yx3B +$Qx04$1 +$Qx31T0 +$R +$R$#*03 +$R$1c +$R*06 +$R@oc +$RL0 +$RT3$O +$RZ2] +$Rc +$Ri6& +$Ru +$Rx23 +$Rx41 +$Rx92 +$Rz5 +$R}o11 +$S +$S$V +$S$y +$S*51x46 +$S-4*60 +$SD3 +$SKC +$SL5*34 +$SZ1 +$SZ1soA +$SZ2 +$S^]o0N +$S^p +$Si5' +$Sl +$Ssn8 +$SssPc +$Sx12 +$Sx74 +$S{ +$T +$T'8Z2 +$T*62 +$T*87u +$T@2 +$TC$O +$TL6 +$TZ1 +$T[ +$T^vRA +$Tl +$To0Q +$To13 +$Tp1x18 +$Tx03 +$Tx31 +$Tx32 +$Tx52 +$Tz1 +$U +$U$R +$U*27x26 +$UD5 +$UR5T6 +$UT4 +$U[ +$Uc +$Ui41 +$Uu[ +$Uz1 +$V +$V$6 +$V$8 +$V$C +$V$T +$VZ1 +$VZ1'8 +$Vc'9 +$Vi15o7H +$Vi6% +$Vl +$Vo5F^? +$Vr +$Vu +$W +$W$8 +$W$I +$W$K +$W$S +$W*65 +$WD4 +$WL8 +$WZ1 +$W^wr +$Wc +$Wl +$Wo5- +$WrK +$Wx35L2 +$Wz1 +$X +$X$2 +$X$Y +$X$x +$X*41$a +$X-7D0 +$XCC +$XZ1 +$XZ2 +$XZ3s4/ +$X[ +$X^3 +$X^S +$X^v +$Xi0:o62 +$Xo1m +$Xt +$Xx62 +$Xz1 +$Y +$Y$2 +$Y$= +$Y*67 +$Y+3l +$YL6 +$YL7 +$YL8 +$YT1 +$Y[$N +$Y^V +$Yc +$Yfz3 +$Yu[ +$Yx08 +$Yx0A$u +$Yx24C +$Yx36 +$Yx41 +$Yx42 +$Yz2x64 +$Z +$Z$3R6 +$Z$5 +$Z$9xA5 +$Z*76 +$Z*80 +$ZD2 +$ZD5 +$ZZ1 +$ZZ1T8 +$ZZ2 +$Z[ +$Z^0 +$Z^1*15 +$Z^V*26 +$Z^g$A +$Zc +$Zd +$Zi0Z +$Zo09 +$Zt +$Zx05L1 +$Zz4 +$[ +$[*05$; +$[C +$[L4 +$[Z1 +$[Z2 +$[Z4 +$[[ +$[t +$\ +$\@a +$\L2*20 +$\Z1 +$\l +$\o0J +$\t +$\u +$] +$]+1 +$]-0 +$][ +$]^?o6= +$]i3[ +$]i6: +$]o4[ +$]o55 +$]x32 +$]z1 +$^$^ +$^+9+0 +$^@j +$^R8i07 +$^Z1 +$^Z2 +$^Z2} +$^Z3 +$^i4 ^r +$^l +$^{*12 +$_ +$_$+ +$_$0 +$_$? +$_$_ +$_$i +$_$p +$_$r +$_$s +$_$t +$_$x +$_+0o6m +$_-0 +$_@0 +$_Z2 +$_Z3si? +$_[ +$_[[ +$_d +$_d] +$_i0mk +$_i1U +$_i6i +$_l +$_o96 +$_s_Y +$_smz +$_t +$_x13 +$_x25 +$_x41 +$_x53 +$_x75 +$_z3 +$_{ +$_} +$` +$`$1 +$`-1 +$`R5o5Z +$`Z1 +$`Z2 +$`c +$`l +$`o0h +$`o64z4 +$`u +$`x02 +$`x05 +$`{i2k +$a +$a$ +$a$3 +$a$6 +$a$b +$a$b$c +$a$b$c$d +$a$b$c$d$e +$a$bt +$a$f +$a$p +$a*01 +$a*16 +$a*26 +$a*28 +$a*38 +$a*73x03 +$a*81 +$a+0 +$a+0u +$a+2 +$a+3 +$a+7 +$a-5 +$aD4 +$aDA +$aR2 +$aT3 +$aT5 +$aZ1 +$aZ2 +$aZ4Z5 +$a^A +$a^D^1 +$a^kt +$af +$ai02 +$ai2q +$ai5r +$ai6p +$al +$ao1ep1 +$ao3+ +$ao3dC +$ao6E +$ao7f +$aoB8 +$ap1 +$aq +$assj +$aswc +$au +$au$3 +$aux43 +$ax02 +$ax31 +$ax45 +$ax54 +$ax67 +$ax73 +$ax85 +$ax91 +$axB1 +$axB3 +$axB4 +$az1*47 +$az2 +$az3 +$az4 +$b +$b$. +$b$1 +$b$4 +$b$a +$b$b +$b$d +$b$l +$b$t +$b$u +$b$wr +$b$y +$b*02 +$b*34 +$b*56 +$b*58 +$b*69 +$b*73 +$b+6 +$b-1 +$b@0 +$bL3o0k +$bL5 +$bL7x15 +$bT0 +$bZ1 +$bZ3 +$bZ5 +$b[ +$b[R2 +$b]$7 +$b^[s2H +$b^` +$b^a +$b^h +$b^p +$bf +$bi1r +$bi5p +$bo3b^A +$bo3t +$bp1 +$br +$brq +$bsaF +$bsbf +$bshb +$bt +$buo4# +$bx13 +$bx35 +$bx45 +$bx56 +$bx72 +$bxA3 +$bxA4 +$bz2 +$b{ +$b{i2G +$c +$c$b +$c$e +$c$t +$c$w +$c*67 +$c*72^: +$c+7 +$c+B +$cD2 +$cL6 +$cT0 +$cZ1 +$cZ2 +$c[ +$c[*56 +$c^?o3Q +$c^G$z +$c^Pk +$c^t +$cci4C +$cfc +$ci2c +$ci6h +$cl +$co1UT7 +$co4n +$co8i +$coARiBs +$csmw$4 +$ct +$cx06 +$cx24 +$cx29 +$cx36 +$cx73 +$cz1 +$cz2R0 +$cz5 +$d +$d$ +$d$. +$d$4 +$d$b +$d$k +$d$t +$d$w +$d*19 +$d*21 +$d*23 +$d*57 +$d*61 +$d*69 +$d+3 +$d+6 +$d-5 +$d@. +$d@d +$d@p +$dD1 +$dD5 +$dD6 +$dR0 +$dR3Z2 +$dZ2 +$d^d +$d^l +$dc+0 +$dcZ1 +$dd +$di0^ +$di0t +$di4 +$di7a +$dl +$do0kZ5 +$do0p +$do11 +$do41 +$do6t +$dstm +$dtu +$dx02 +$dx45p1 +$dx52 +$dx75 +$dx95 +$dx96 +$dxA6 +$dz1 +$dz4 +$d{^o +$e +$e $d +$e$c +$e$l +$e$m +$e$n +$e$q +$e$qk +$e$r +$e$w +$e*53 +$e*67 +$e*73 +$e+0 +$e+B +$e-2*34 +$eD8 +$eL8 +$eR3 +$eT2 +$eZ1 +$eZ2 +$eZ2o7- +$eZ3 +$eZ4 +$e[ +$e[u +$e^*i2> +$e^3$7 +$e^E +$e^H +$e^d +$e^g +$e^}k +$ei0p*52 +$ei9_ +$el +$eo0F +$eo0d +$eo0p +$eo4I +$eo4l +$eo5% +$eo8v +$eo9k +$eo9l +$ep1 +$er +$esm6 +$esmp +$ex02sz$ +$ex25 +$ex28i3c +$ex53 +$ex71 +$ex93 +$ez2] +$ez4 +$f +$f$1 +$f$j +$f$u +$f*25 +$f*32 +$f*34 +$f*79 +$f*96 +$f+1 +$f-3 +$f-5 +$f@t +$fK$2 +$fL6 +$fZ1 +$fZ1x57 +$fZ2 +$f^= +$f^f +$f^q'B +$f^v +$fc +$fi4u +$fi8r +$fl +$fo1e +$fo8/x01 +$fq +$fs39 +$fx05 +$fx28D3 +$fx52 +$fx62 +$fx82 +$fx91 +$fxB1 +$g +$g$N +$g$n +$g$o +$g$s +$g*36 +$g*54 +$g+4 +$g+6 +$g-0 +$gK+6 +$gZ1 +$gZ2 +$gZ3o5o +$gZ4 +$g^3 +$g^Ko0_ +$g^S +$g^U +$g^sz2 +$g^t +$g^vx31 +$gd +$gfo4# +$gi0r +$gi2p*91 +$gi2u +$gi3@i0$ +$gi5 @6 +$gi5; +$gi7VR9 +$gl +$go06 +$go0ht +$go2) +$gr +$gsaI +$gsr( +$gsutx47 +$gt +$gu +$gx34 +$gx36 +$gx37 +$gx43 +$gx52 +$gx73 +$gx83x52 +$gz2 +$gz3 +$h +$h$ +$h$5 +$h$g +$h$k +$h$x +$h$z +$h*02 +$h*37 +$h*50*25 +$h*54 +$h*71 +$h-3 +$h-5t +$hD3 +$hL8 +$hZ1i1g +$hZ2 +$hZ2L5 +$hZ3 +$h[ +$h[x13 +$h^T +$h^aslI +$hc +$hd +$hi2t +$hi4X +$hi6t*67 +$hi8% +$hi92x49 +$hl +$hlT1 +$ho1h +$hp1 +$hr +$hr$y +$hsd1 +$hx12 +$hx41 +$hx53 +$h}K +$i +$i $n $g +$i$*z1 +$i$F$F +$i$d +$i$n +$i*10x41 +$i*41 +$i*60D2 +$i*62 +$i*79 +$i*86 +$i*89 +$i*A4 +$i+3 +$i+6 +$i+6l +$i+9 +$i-0 +$i-7 +$i-9 +$i@a +$iD2 +$iR0 +$iZ1 +$iZ2x15 +$i^d +$i^ki75 +$i^p +$id +$ii3 +$ii8d +$il +$io2% +$io2S +$io5V +$iq +$ir +$it +$iu +$ix09 +$ix12 +$ix13 +$ix36 +$ix54 +$ix62 +$ix73 +$ix92 +$iz2*17 +$i{ +$j +$j$3 +$j$F +$j$o +$j*02 +$j*07 +$j*68 +$j-4^? +$j-7 +$jZ1 +$jZ2 +$j[ +$j]z2 +$j^2 +$j^k +$j^s +$jc +$ji49$u +$ji5n^0 +$jo17 +$joAn +$jp1 +$jr +$jsik +$jt +$ju +$jx12 +$jx62 +$jz2 +$jz3 +$j{ +$k +$k$4 +$k$d +$k$e +$k$k +$k$y +$k*54 +$k*57 +$k*67 +$k+0 +$k+8 +$k@5 +$k@6 +$kC +$kD3u +$kD5x26 +$kR4 +$kR7 +$kZ1 +$k[ +$k^3 +$k^D +$k^_] +$k^m +$ki5f +$ki8o +$kl +$ko78 +$ko7n +$kp1 +$kp1x26 +$ks17 +$kt +$kx13 +$kx53 +$kx73 +$kx92 +$k{ +$l +$l$g +$l$v +$l$y +$l$z +$l*23 +$l*43 +$l*53*32 +$l*57 +$l+1 +$l-0 +$l-4Z2 +$l-5 +$l-6 +$lC*21 +$lD4 +$lZ1 +$lZ2 +$lZ4 +$l[ +$l^O +$l^a +$l^b +$ld +$li78R9 +$li83 +$lk +$lo5p^k +$lq +$lu +$lu$C +$lx4B +$lx62 +$lx92 +$lz3 +$lz5 +$l{ +$m +$m$0 +$m$1c +$m$E +$m$b +$m$e +$m$oZ2 +$m$p +$m$qR7 +$m$w +$m$x +$m'Bx05 +$m*28 +$m*43 +$m*71z1 +$m*86 +$m+4 +$m+5 +$m+6 +$m-0 +$m-1 +$m-2 +$m-6 +$mCi4E +$mT0 +$mZ1 +$mZ2 +$mZ5 +$m^+ +$m^1 +$m^6 +$m^? +$m^i +$mc +$md +$mf +$mi1P*83 +$mi1\ +$mi2i +$mi7g +$mk +$ml +$ml^k +$mo0g +$mo2r +$mo37 +$mo5F +$mo8ul +$ms17 +$ms24 +$mt +$mu^C +$mx04 +$mx05 +$mx16 +$mx18 +$mx32 +$mx34 +$mx43 +$mx57 +$mx72 +$mxA4 +$mz1 +$mz4z3 +$m{k +$m{t +$n +$n$a +$n$b +$n$qx47 +$n*07 +$n*15*12 +$n*24 +$n*24Z4 +$n*27 +$n*83z4 +$n*93'4 +$n+0 +$n+7 +$n-7 +$n@0 +$nC +$nD2 +$nL1 +$nT5 +$nZ2 +$nZ3 +$nZ5x7B +$n[$z +$n[L2 +$n^C +$n^I*36 +$n^f*23 +$ni0R +$ni3+ +$ni3p +$ni5e +$nk +$nl +$no00x46 +$no2- +$no4_ +$no7l +$no9e +$nq +$nu +$nx14^3 +$nx51 +$nx65 +$nx71 +$nx82 +$nx93 +$o +$o$O +$o$h +$o$ni4Y +$o$s +$o$x +$o*03 +$o*46x43 +$o*82 +$o+4 +$o+8 +$o@1 +$o@o +$oT0 +$oT7 +$oZ1 +$oZ2 +$o^C +$o^si0c +$oc +$od +$oi1 +$oi6O +$ok +$oo0v +$oo6g +$oo6w +$or +$osbf +$ou +$ox04'5 +$ox05 +$ox12 +$ox13 +$ox15 +$ox29 +$ox42sk$ +$ox65 +$ox71 +$ox87 +$oz3 +$oz4 +$p +$p$0 +$p$k +$p$l +$p*04 +$p*05 +$p*27 +$p*34i9d +$p*42 +$p*61 +$p*64 +$p*73 +$p*86 +$p+0 +$p-4 +$pD2 +$pD3 +$pL6 +$pR1 +$pZ1 +$pZ2 +$pZ5 +$p^9 +$p^V +$pi09 +$pi4t +$pi7q +$pl +$po0b +$po29 +$pr +$psph +$pu-5 +$px4A@p +$px51[ +$px75 +$px87 +$px92 +$pz5 +$p{sdo +$q +$q$Q +$q$a +$q$w +$q*02 +$q*34 +$q+0x02 +$q+5f +$q-0 +$q-7 +$qD2 +$qKr +$qL6 +$qL7 +$qLA +$qT0@T +$qZ1 +$qZ2 +$qZ2o2+ +$qZ2u +$qZ3 +$qZ4 +$qZ5 +$q^pT6 +$qcx21 +$qd +$qi1= +$qi3JZ1 +$qk +$qkl +$qp1 +$qsq# +$qt +$qx15 +$qx31 +$qx43 +$qz1^n +$qz2 +$qz2^# +$r +$r$! +$r$0 +$r$8 +$r$a +$r$n +$r$p +$r'9 +$r*21 +$r*24 +$r*74o2V +$r*78 +$r*98 +$r*A9 +$r+0 +$r+6 +$r-1 +$r-4z2 +$r-8 +$r-A +$rL5 +$rL8 +$rR1 +$rZ1 +$rZ1T6 +$r^J +$r^p +$r^q +$ri2fZ5 +$ri4E +$ri6Do6v +$ri6n +$ri7t +$ri8jshR +$rl +$ro10 +$ro6 +$ro7- +$roAg +$rsnR +$rx31 +$rx46d +$rxB4 +$rz1 +$rz1l +$s +$s$ +$s$1 +$s$4 +$s$j +$s$m +$s$u +$s*01 +$s*17 +$s*20z3 +$s*21 +$s*31 +$s*56 +$s*68 +$s*75t +$s+3 +$s+4 +$s-1 +$s-2 +$s-5 +$s-6 +$s-7 +$s-8 +$s@y +$sC +$sD7 +$sL7s1_ +$sR7^T +$sT4 +$sZ1 +$sZ2 +$sZ3 +$s[x32 +$s]z5 +$s^1 +$s^b +$s^fr +$s^k +$sc +$si0h +$si3t +$si52 +$si6V +$siAi +$so13 +$so1bl +$so2b +$so5J +$so7m +$so9*'A +$sr +$ssr4$7 +$st +$su +$sx34 +$sx43 +$sx53 +$sx64 +$sx82 +$sx83 +$sx87 +$sx94 +$sz1 +$sz1u +$sz4z5 +$t +$t$# +$t$7 +$t$b +$t$c +$t$g +$t$h +$t*01 +$t*03 +$t*13 +$t*25 +$t*57 +$t*86 +$t*91 +$t+7 +$t+9 +$tZ1 +$tZ2 +$t^3 +$t^n +$t^p +$tc +$tco6y +$ti2$o4f +$ti4C +$ti4f +$ti7a +$tk +$to1J +$to6k +$to6w +$tsbL +$tu +$tux01 +$tx02 +$tx04 +$tx08 +$tx09c +$tx42 +$tx51 +$tx85 +$tz1 +$tz4 +$u +$u$$ +$u$8 +$u$r +$u$w +$u*30 +$u*43i4D +$u-1 +$u-6 +$u@k +$uD9 +$uL6 +$uZ1 +$uZ2 +$u[ +$u^1i36 +$u^8 +$u^? +$u^Xz2 +$u^g +$u^i +$u^l*25 +$ud +$udx58 +$ui0y +$ui5- +$ui7'x69 +$ukK +$uo1r +$uo3w +$uo4o +$uo7u +$uq +$ur +$us5,x67 +$usma +$ut +$utr +$ux12 +$ux34 +$ux39 +$ux41$= +$ux43 +$ux52 +$ux62 +$ux65 +$ux72 +$ux9B +$uz1 +$uz5-3 +$v +$v$&^I +$v$+ +$v$3u +$v$6 +$v$P +$v$i +$v$l +$v*16 +$v*43 +$v*62k +$v*81x58 +$v+0 +$v-5 +$v-6o8> +$v-7x69 +$vD3 +$vD5 +$vD7 +$vD7x21 +$vL5 +$vL6 +$vZ1 +$vZ2 +$vZ3 +$v^* +$v^> +$v^w^G +$vdx5B +$vo3s +$vp1 +$vri0r +$vstk +$vx13 +$vx24 +$vx38 +$vx83 +$vz1o6G +$w +$w$e +$w$q +$w*21 +$w*31 +$w*43 +$w*45 +$w*86 +$w+4 +$w@! +$w@g +$wC +$wD8 +$wZ1 +$wZ4 +$w[ +$wc +$wcz2 +$wi0q +$wi1I +$wi2d +$wi6q +$wi7_ +$wi9q +$wo4m +$wo6a +$wo7m +$wp1 +$wq +$wr-4 +$wsF[x36 +$wu +$wx18 +$wx37 +$wx67-4 +$wz2 +$wz3 +$w{[ +$x +$x$? +$x$g +$x$g*41 +$x$hx69 +$x$i +$x$p +$x$s +$x$t +$x$x$x +$x'AC +$x*20r +$x*31 +$x*45 +$x*62^) +$x*65 +$x*71 +$x*78 +$x+5 +$x+A*A0 +$x-6 +$x@c +$xD2 +$xD5 +$xD5t +$xD6 +$xR4-2 +$xR6 +$xZ1 +$xZ2 +$xZ3 +$xZ4 +$xZ5 +$x^! +$x^S +$x^b +$x^j +$x^o +$x^v +$xf +$xi1)o5n +$xi1H +$xi6d +$xk +$xl +$xo1m +$xp1 +$xp1o2i +$xq +$xsw0 +$xt +$xx21@v +$xx25 +$xx32 +$xx37 +$xx45 +$xx64 +$xx71 +$xx76 +$xx92 +$xx93 +$xz4 +$x{ +$y +$y$a +$y$s +$y*16*13 +$y*81 +$y+0 +$y+3 +$y+6 +$y+6T6 +$y+7 +$y@n +$y@nx07 +$y@q +$yD1 +$yD5d +$yD8 +$yL8 +$yZ1 +$yZ2 +$yZ4 +$y^i +$yf +$yi19'5 +$yi20 +$yi3R +$yi6m +$yk +$yo4f +$yo5x +$yp1 +$yq +$yt +$yx04 +$yx07 +$yx23 +$yx27i1p +$yx53 +$yz2 +$z +$z$2 +$z$dZ1 +$z$o +$z$x +$z*23 +$z*37 +$z*43 +$z*72 +$z+4z3 +$z+5 +$z-2 +$z-4 +$z@s +$zC +$zD4 +$zR0D5 +$zR5 +$zT0 +$zZ1 +$zZ2 +$zZ3 +$zZ3'6 +$zZ3Z4 +$z^- +$z^l +$z^v +$z^x +$zd +$zf +$zi1l +$zl +$zo00T0 +$zo3 +$zp1T4 +$zq +$zsAS +$zsc^ +$zsry +$zssc +$zu +$zuD2 +$zx06 +$zx24 +$zx43 +$zx63 +$zx83 +$zx95 +$zxA2 +$zxB2 +$zz1 +$zz1x36 +$zz2^o +$zz5 +$z{ +${ +${K +${L4 +${L5 +${L8 +${o70sr@ +$| +$|$* +$|L0 +$|u +$} +$}$o +$}+0 +$}+5 +$}+A +$}c +$}kx01 +$}l +$}lr +$}t +$}z2r +'1+0z4 +'1Z4 +'1Z5 +'1p3 +'1p4 +'1z4Z4 +'2+0p4 +'2L1 +'2Z3Z1 +'2Z4 +'2Z4z2 +'2Z5$o +'2[p3 +'2i0Dp2 +'2k +'2o0< +'2o0> +'2p2 +'2p3 +'2z2 +'2z3 +'2z3+2 +'2z4 +'2z5 +'3 +'3$L +'3$S +'3$g +'3+2 +'3Z2 +'3Z3 +'3Z5 +'3[ +'3[$f +'3^0^3 +'3^a +'3^p +'3d +'3p1 +'3p2 +'3q +'3qd +'3sjX +'3t +'3tq +'3us1= +'3z1 +'3z3 +'3z4 +'3z5 +'3z5z4 +'3z5} +'4 +'4$ +'4$0 +'4$m +'4$o +'4+0 +'4+1 +'4+2^! +'4@q^J +'4T2$q +'4Z1 +'4Z2 +'4Z3 +'4Z5 +'4Z5Z3 +'4[ +'4^8 +'4^L +'4^P +'4^S +'4^d +'4^l +'4c +'4d[ +'4dt +'4f +'4i0p +'4i11*02 +'4i1f +'4i2: +'4i3t +'4o0$ +'4o04 +'4o1m +'4o3' +'4o3S +'4p1 +'4p2+9 +'4q^? +'4r +'4s1* +'4s2R +'4s5? +'4uR3 +'4z1q +'4z2 +'4z4 +'4z5 +'5 +'5$& +'5$1 +'5$1@0 +'5$2 +'5$3 +'5$3L5 +'5$7 +'5$: +'5$I +'5$\*10 +'5$e-5 +'5$i +'5$kz1 +'5$r +'5$x +'5*13 +'5*14*20 +'5+3 +'5+4 +'5-1 +'5C +'5L3Z1 +'5L4x21 +'5Z1 +'5Z2@d +'5Z3 +'5Z4 +'5Z5 +'5Z5T9 +'5Z5x31 +'5[ +'5^9 +'5^F +'5^b +'5^i +'5^z +'5c$R +'5c@r +'5d +'5d^B +'5f +'5i1l +'5i2. +'5i2l +'5i3e +'5i3r +'5l +'5o0b +'5o0d +'5o0i +'5o0m +'5o1g +'5o25 +'5o2Wo21 +'5o2k +'5o2z +'5o3k +'5o4& +'5o4d +'5q +'5s1N +'5s1i +'5sL7 +'5sgm +'5shH +'5t +'5x01Z2 +'5x02 +'5z1 +'5z2 +'5z4 +'5z5 +'6 +'6$ +'6$, +'6$0 +'6$2 +'6$7 +'6$9 +'6$Q +'6$i +'6$k +'6$k^w +'6$kz3 +'6$l +'6$p +'6$r +'6*03 +'6*21u +'6*51 +'6*54 +'6+1 +'6+3 +'6+4c +'6-1 +'6@3 +'6@4 +'6@Z +'6D1 +'6D1o0K +'6D2 +'6L0 +'6L1s61 +'6L2 +'6R2sob +'6R5 +'6T0o5* +'6T1 +'6Z1 +'6Z1$} +'6Z2 +'6Z3 +'6Z4*64 +'6Z5 +'6[ +'6^2 +'6^G +'6^L +'6^O +'6^a +'6^h +'6^j +'6^lD1 +'6^p +'6^w +'6^yz3 +'6c +'6cZ1 +'6d +'6dz1 +'6fx45 +'6i1* +'6i23^, +'6i3- +'6i3m +'6i3r +'6i4g +'6i4p +'6i5% +'6i5r +'6l +'6o0*} +'6o1l +'6o3P +'6o3e +'6o3t +'6o4O +'6o5% +'6o5V +'6o5` +'6o5l +'6p1 +'6p2 +'6q +'6s0g +'6sfs +'6shb +'6sjv +'6snG +'6sqg +'6x13 +'6z1 +'6z1z3 +'6z2 +'6z3o1s +'6z4o9o +'6z5 +'7 +'7$! +'7$* +'7$*D4 +'7$. +'7$1 +'7$8 +'7$9 +'7$J +'7$P +'7$T^s +'7$U +'7$e +'7$n +'7$s +'7$t +'7*30 +'7*46 +'7+0+4 +'7+5 +'7+6 +'7-3 +'7-4 +'7-5 +'7C +'7C-5 +'7D4 +'7R5 +'7R5o2c +'7T3 +'7Z1 +'7Z1T0 +'7Z2 +'7Z3 +'7Z4 +'7Z5 +'7[*41 +'7]*14 +'7^ +'7^< +'7^@ +'7^C +'7^D +'7^T +'7^[ +'7^n +'7^tsxt +'7c +'7cx01 +'7d +'7f +'7i0Ad +'7i29 +'7i4; +'7i5_ +'7i6+ +'7l +'7o0b +'7o11-6 +'7o1n +'7o3 +'7o3g +'7o5. +'7o59 +'7o6! +'7o6w{ +'7o6z +'7q +'7s1- +'7s6/ +'7saZ +'7sat +'7sdr +'7sfn +'7srv +'7u +'7ud +'7x13$s +'7x51 +'7z4z5 +'7} +'8 +'8$, +'8$0 +'8$@ +'8$K +'8$N +'8$Q +'8$a +'8$h +'8$i +'8$s +'8$y +'8*02 +'8*12 +'8*32 +'8*56 +'8*70 +'8*74 +'8+0 +'8+3s2+ +'8+6 +'8-2 +'8-5 +'8-6 +'8@p +'8@z@g +'8Cx43 +'8D4+6 +'8Ko5p +'8L3 +'8R2 +'8T7 +'8Z1 +'8Z2 +'8Z4 +'8Z5 +'8[ +'8[L6 +'8^4 +'8^R +'8^a +'8^j'7 +'8^t +'8^|z2 +'8c +'8d +'8dz2 +'8i02 +'8i0z +'8i1. +'8i2d +'8i4_ +'8i4u +'8i4{ +'8i52 +'8i5e +'8i6P +'8i6j +'8i7_ +'8i7w +'8o0E +'8o12 +'8o2tD1 +'8o34 +'8o7/ +'8o7; +'8o7a +'8p1 +'8s 5 +'8s2<$, +'8siz +'8t +'8u +'8x51 +'8x61 +'8z1 +'8z1x12 +'9 +'9$' +'9$. +'9$1 +'9$2 +'9$B +'9$D+1 +'9$M +'9$c +'9$h +'9$k +'9$r +'9*08 +'9*53 +'9*76 +'9*83 +'9*85 +'9+0 +'9+2 +'9-2 +'9-3 +'9-4 +'9-6 +'9@a +'9D2 +'9D4 +'9R8 +'9T2 +'9T4 +'9T5 +'9T8 +'9Z1 +'9Z2 +'9Z3 +'9Z5 +'9[ +'9^1 +'9^d +'9^e@c +'9^k +'9c +'9i1t +'9i2l +'9i3n +'9i4 +'9i45 +'9i50 +'9i7w +'9i8K +'9i8e +'9i8r +'9i8t +'9l +'9o2l +'9o2z +'9o4. +'9o4h +'9o4j +'9o5j +'9o6m +'9o7n +'9o7s +'9o7y +'9q +'9r +'9sah +'9se2 +'9sfg +'9u +'9x06 +'9x43 +'9x61 +'9z2 +'A +'A$-[ +'A$7 +'A$? +'A$a +'A$e +'A$k +'A$w +'A+1 +'A+2 +'A+3 +'A+7 +'A@a +'AD1 +'AD3 +'AD7 +'AL1 +'AR9 +'AT5 +'AT8 +'AT9 +'AZ1 +'A^T +'A^t +'Ac +'Ai7s +'Ai81 +'Ai9 +'Al +'Ao3k +'Ao43 +'Ao7b +'Ao7h +'Ao7l +'Ao8ml +'Ao9q +'Ap1 +'Aq +'As97 +'At +'Ax41 +'Ax42 +'Ax43 +'Ax52 +'Ax61 +'Ax62+6 +'B +'B$4 +'B$6 +'B$8 +'B$I +'B$\*5B +'B$c +'B$e +'B$l +'B$m +'B*23 +'B*35 +'B*97 +'B+5 +'B+7 +'B+A +'B@y +'BD3 +'BD4 +'BT1 +'BT7 +'BZ1[ +'BZ2 +'B[R1 +'B^1 +'Bk +'Bl +'Bo00 +'Bo6? +'Bo6l +'Bo8f +'Bo9. +'Bo9@ +'Bo9i +'Br +'Bsoa +'Bt +'Bx36 +'Bx51 +'Bx71 +'Bx72 +'Bz5 +*01 +*01$8 +*01$f +*01*41 +*01*53R6 +*01*65R7 +*01*83 +*01+1 +*01L1 +*01L5 +*01R0 +*01Z2^g +*01[$t +*01[i6v +*01^*i3g +*01^0 +*01^J +*01^O +*01^R +*01^v +*01d$k +*01f +*01i11 +*01i3-[ +*01koBe +*01o3v+4 +*01o6! +*01o7) +*01o8s +*01s x[ +*01s81 +*01scx +*01soi +*01sx5 +*01t*51 +*01x42 +*01x61 +*01z1 +*01z2 +*01z4] +*01z5 +*01{$6 +*02 +*02$d +*02$g +*02$i +*02*06 +*02*10$K +*02*57sdl +*02*97 +*02+5 +*02+9 +*02D3 +*02L3 +*02R4 +*02T6 +*02T7 +*02Z2 +*02[ +*02^0 +*02^b +*02^f +*02^j +*02^s*24 +*02^y +*02i0s +*02i1L-2 +*02i1isih +*02i3& +*02i3\ +*02i3p +*02k*13 +*02o1a +*02o20 +*02o2w +*02o2z +*02o3a +*02o3e +*02o3m +*02o51 +*02o5_ +*02o6M +*02o7Yl +*02q +*02s0P*17 +*02scl +*02x21 +*02x24 +*02x42 +*02x63 +*02z2 +*03 +*03$c*51 +*03$r +*03$t +*03$w +*03'5 +*03*05 +*03*36 +*03*41 +*03*47 +*03+1o2r +*03CZ4 +*03D1 +*03R3 +*03T8*70 +*03Z3x07 +*03^O +*03^a +*03i1b +*03i1r +*03i3e +*03l+0 +*03o0h +*03o0l +*03o0p +*03o1! +*03o1t +*03o1y[ +*03o2P +*03o3a +*03o3t +*03o3w +*03o5_ +*03q +*03r^z +*03sbe +*03sjx +*03snti1; +*03sqt +*03x34 +*03x43 +*03z3 +*04 +*04$5 +*04$nx41 +*04$pZ1 +*04$y*53 +*04*07 +*04*17 +*04*31Z2 +*04*73 +*04+3 +*04+4 +*04+6 +*04+8D0 +*04D1 +*04T0 +*04T6 +*04Z1 +*04[ +*04^# +*04^9 +*04i01 +*04i0K*43 +*04i0m +*04i3R +*04i4t +*04l +*04li6* +*04o0`x23 +*04o0t +*04o41 +*04oAw[ +*04smv +*04son +*04sry] +*04u +*04x07p3 +*04x32 +*04z4 +*04{ +*05 +*05$@ +*05'5 +*05*12 +*05*26 +*05+3 +*05-1 +*05K +*05R1 +*05R4*06 +*05T1 +*05T6 +*05Z1 +*05Z1i5i +*05[ +*05]-5 +*05^(z1 +*05^o +*05^r +*05^y +*05c +*05d +*05i01 +*05i1y +*05i3#^` +*05l +*05o00 +*05o0r +*05o2f +*05o4i +*05o5B +*05q +*05r +*05saC +*05uD0 +*05x02 +*05x03 +*05x21 +*05x35 +*05x45 +*05x52Z1 +*05z2*39 +*06 +*06$) +*06$1 +*06$6'5 +*06'6 +*06*15 +*06*67 +*06*87 +*06+6 +*06D2 +*06D3sMf +*06R0 +*06R7 +*06T4 +*06T6 +*06^h +*06^w +*06d +*06i6y +*06l +*06o2y +*06o3m +*06o4k +*06o4m +*06o5j +*06o69 +*06s7A +*06t +*06x02 +*06x34 +*06x41 +*06z1 +*07 +*07$g +*07$p +*07*18 +*07*24T1 +*07*53x31 +*07+0 +*07-4z2 +*07D2 +*07D6 +*07R7 +*07c +*07i8b[ +*07x04x31 +*07x58 +*07z4 +*08 +*08'5 +*08D6 +*08T0*13 +*08Z1s1( +*08[ +*08i7t +*08x06 +*08x45 +*08x47 +*09 +*09'6 +*09*91 +*09*97 +*09l[ +*09o6@ +*09s86 +*09x03 +*09x34 +*0ALBx06 +*0A[ +*0At +*0Ax7A +*0Bl +*0Bx08 +*0Bx74 +*10$6{ +*10*30z3 +*10*42 +*10+4i1: +*10-8 +*10R0 +*10R1 +*10Z2d +*10^9 +*10^a +*10^q +*10c +*10i03 +*10i1b +*10i2b +*10i38 +*10i3r +*10i4{ +*10l +*10lz2 +*10o1. +*10o2Xi7; +*10o4wZ1 +*10o4z +*10rD3 +*10tx81 +*10x04@t +*10x19 +*10{c +*12 +*12$ +*12$! +*12$4 +*12$= +*12$Ku +*12$R +*12'5 +*12*68 +*12+1 +*12K +*12R3 +*12Z2 +*12[^R +*12[o6o +*12^'^, +*12^0 +*12^P +*12^k +*12dx6B +*12f +*12i0o +*12i1; +*12i1g +*12i2-*43 +*12i2p +*12i4! +*12kss2 +*12l +*12lk +*12o0D +*12o1b +*12o1j +*12o2y +*12p1 +*12s34 +*12sma +*12snp +*12uf +*12x42$v +*12x51 +*12z3 +*12} +*12}i01 +*13 +*13$8 +*13$M +*13$q +*13*04 +*13*26 +*13*42 +*13*45R1 +*13*65 +*13D1 +*13D9 +*13Kx31 +*13Z1[ +*13[p1 +*13^*i3p +*13^/*72 +*13^8 +*13^T +*13^u +*13^z +*13c +*13dx52 +*13i4y +*13i5u +*13i64 +*13k +*13o0f +*13o2- +*13o4B +*13p1 +*13s73 +*13sau +*13sbci1& +*13sc2 +*13svr +*13x03i0q +*13x12 +*13x43 +*13z1*16 +*13z2 +*13z5 +*13{i0t +*14 +*14$7 +*14'5q +*14*27] +*14*34 +*14+3i2w +*14-2 +*14-2$i +*14C +*14C*10 +*14R2 +*14R3 +*14Z1 +*14Z2 +*14Z3*36 +*14^1 +*14^f +*14^q +*14^t +*14c +*14i0m +*14i2- +*14i2v +*14o1! +*14o1X +*14o5z +*14o9z +*14q'6 +*14svm +*14x02 +*14z1i0T +*14z2+7 +*14z5 +*14} +*14}i38 +*15 +*15$' +*15$9Z1 +*15$n +*15$p +*15$t +*15$u +*15*10 +*15*23 +*15*41*43 +*15+3 +*15D1 +*15T4 +*15Z1 +*15Z2o86 +*15] +*15^H +*15^p*71 +*15f +*15i1^o7f +*15ki3u +*15o1u +*15o5 +*15p1 +*15snpr +*15ux01 +*15x04@5 +*15x13 +*15x34 +*15x42 +*15z2'6 +*15} +*16 +*16$R +*16$d +*16'7 +*16*05 +*16*05*30 +*16*23 +*16*47 +*16*48 +*16D5u +*16] +*16^1 +*16i5a +*16o1\D1 +*16o1y +*16o27 +*16o3/^C +*16o5s +*16o5w +*16r +*16snp +*16x03 +*16x04D0 +*16x43 +*16z2 +*17 +*17$y +*17'6 +*17*73 +*17+7 +*17+7z2 +*17-8 +*17Z2D1 +*17Z3 +*17Z5 +*17i13$5 +*17i5N*56 +*17r +*17x06 +*17x12 +*17x15 +*17x42 +*17x51 +*18 +*18@sx05 +*18D7 +*18D8 +*18^& +*18^} +*18l +*18o5g +*18x03 +*18x62 +*18x75 +*19 +*19$2 +*19i6Y +*19x08-4 +*19x41 +*19z3x07 +*1A'A +*1Ax03'9 +*1AxA1 +*1Bx01 +*1Bx17 +*20 +*20$$Z1 +*20$/ +*20$2 +*20$9+4 +*20'4 +*20*03 +*20*14c +*20*43 +*20*50 +*20+2 +*20-0 +*20@p*27 +*20D5 +*20Z3*71 +*20^1 +*20c +*20d$7 +*20i3i +*20o0l +*20o2. +*20o3i +*20o4 +*20o5X +*20o5s +*20o6 +*20o7R +*20oBm*A7 +*20p1 +*20p2x14 +*20r +*20s29 +*20s4q +*20s52 +*20s9! +*20slm^9 +*20sri +*20svt +*20syt +*20td +*20x05o3U +*20x18x06 +*20x23 +*20x32 +*20x41 +*20x41[ +*20x71 +*20z2 +*20z4$z +*20} +*20}u +*21 +*21*02z5 +*21*03 +*21*13 +*21*20 +*21*28 +*21*36 +*21*56 +*21*72 +*21*78 +*21+4l +*21-3 +*21C +*21D3*42 +*21R0 +*21R0[ +*21Z1} +*21Z2 +*21^ +*21^6*61 +*21^j +*21f +*21i0m +*21i4t +*21i5 +*21i50 +*21i61 +*21i8| +*21kd +*21o0m +*21o1e +*21o2g +*21o61 +*21sdEx24 +*21suo +*21x25 +*21x25^p +*21x31c +*21x41 +*21z1x42 +*21z1z3 +*21z2 +*21z4 +*23 +*23$* +*23$+i3# +*23$ir +*23$k +*23'5i1x +*23*05 +*23*31 +*23*86 +*23-6 +*23C +*23Kd +*23Z4*61 +*23^' +*23c +*23i0F +*23i1/ +*23i2-} +*23i3/$j +*23k +*23o0j +*23o1d +*23o2e +*23o3q +*23o3y +*23o4_ +*23p1 +*23t +*23x03 +*23x19i1H +*23x42 +*23x51 +*23z3 +*23z4o1= +*23} +*24 +*24$m +*24*15 +*24*30 +*24*37c +*24*70] +*24+2 +*24-0 +*24-4 +*24D2 +*24K +*24R3 +*24Z2 +*24]p1 +*24^K +*24^O +*24^d +*24co29 +*24f +*24i3Tz2 +*24i3a$p +*24i6^ +*24o2L +*24o2x +*24o31 +*24o5K +*24src +*24x14L2 +*24z2 +*25 +*25$0x63 +*25$r +*25'5 +*25*13c +*25*24*10 +*25*40 +*25*42R5 +*25*45$p +*25*54 +*25*84'7 +*25+2 +*25+5 +*25+8^0 +*25-7x03 +*25D1 +*25D4o3m +*25R5 +*25T0 +*25T5 +*25Z1[ +*25Z3 +*25^2 +*25^a +*25^d +*25^m$% +*25i5a +*25lx32 +*25o0B +*25o0m +*25o2p +*25o4C +*25ssv +*25z2 +*25z2r +*25z2x41 +*26 +*26'5 +*26*37] +*26*48 +*26+4z1 +*26-2$5 +*26D2Z2 +*26D3 +*26D6 +*26T6x15 +*26^f +*26i4 +*26l^" +*26o33 +*26o5[Z1 +*26r +*26t$< +*26u +*26x06o28 +*26x41z4 +*26x62 +*26z1 +*26z2 +*27 +*27$y +*27*65 +*27*74 +*27*76 +*27D2 +*27^2 +*27i55 +*27k +*27o2n +*27x01 +*27x07Z2 +*27x12 +*27x15f +*27x26D5 +*27x43^p +*27x52 +*27z2 +*28 +*28'7 +*28T1 +*28T2 +*28c +*28o2. +*28x05 +*28z2seb +*28z3 +*29 +*29T0x04 +*29s4wx13 +*29x03 +*29x04 +*29x04o0m +*29x14 +*2A^U +*2Ax06 +*2BDA +*2Bx14 +*30$*K +*30$z +*30*02 +*30*43 +*30+3 +*30-0 +*30-2 +*30-4 +*30-9 +*30C +*30D3T8 +*30R5 +*30R6 +*30T1 +*30Z1o59 +*30Z2 +*30[ +*30[f +*30^$ +*30^3 +*30^T +*30^g^j +*30^h +*30c +*30dK +*30f +*30i1Q +*30i2p +*30o2y +*30o82 +*30p1 +*30q +*30sdD +*30u +*30u{ +*30x01 +*30x23 +*30x26 +*30x27o4R +*30x32 +*30x41 +*30z2 +*30z2Z1 +*30z4 +*30{*35 +*30{x53 +*31 +*31$$ +*31$5x2A +*31$_ +*31$bsby +*31$r +*31'8 +*31'A +*31*20 +*31*34 +*31*74 +*31*91 +*31+2 +*31-0] +*31D2 +*31D4 +*31L6Z2 +*31T3 +*31Z3 +*31Z4 +*31Z5 +*31^i +*31^m +*31^t +*31f +*31i1a +*31i1j +*31i3& +*31i3n +*31i43 +*31i4d +*31l +*31o1u +*31o32 +*31o3^ +*31o3j +*31p1 +*31q +*31r +*31sg' +*31snsT6 +*31tk +*31x02 +*31x24 +*31x29 +*31x32 +*31z1c +*31z3L2 +*31z4 +*32 +*32$6 +*32$g*41 +*32'9 +*32*04 +*32*25 +*32*34 +*32*43*16 +*32*45 +*32*67 +*32+5 +*32+Az1 +*32-2 +*32-8 +*32D0 +*32D6 +*32D7 +*32R5 +*32T0 +*32T7 +*32Z1 +*32Z1x18 +*32Z2 +*32^3c +*32^A +*32^I +*32^s +*32d +*32dt +*32i05 +*32i1\*52 +*32i1u +*32i4s +*32i6_ +*32i7yc +*32i9n +*32k +*32l +*32o2c +*32o3h +*32o7y +*32r +*32s9* +*32x38 +*32x74 +*32z1 +*34 +*34$6 +*34$c +*34$n +*34$y +*34*62 +*34*74 +*34+0 +*34+3 +*34+5 +*34D7 +*34K} +*34]$m +*34^M +*34^Z +*34^m^, +*34^p +*34^x +*34i1R$h +*34i2 -1 +*34i3ni1| +*34i5- +*34i5T +*34i6tz1 +*34l +*34o0z +*34o2t +*34o2x +*34o3h +*34o3r +*34o4d +*34p1} +*34q +*34r +*34sd>c +*34sdg +*34sl+ +*34sm_ +*34ur +*34ux32 +*34x13stc +*34x51 +*34x52 +*34z3 +*34} +*35 +*35$9 +*35*03 +*35*04 +*35*24 +*35*31 +*35*41 +*35*50+5 +*35*54 +*35*56 +*35+1 +*35+4 +*35D2 +*35L2 +*35L3 +*35R4 +*35Z2 +*35^# +*35^& +*35^< +*35^_ +*35^c +*35^g +*35^h +*35^v$a +*35i3i +*35o0X +*35o2m +*35o3( +*35o5q +*35o6M +*35o7A +*35q +*35r +*35t +*35ti5g +*35x12 +*35x21 +*35x23 +*35x43 +*36 +*36$1x48 +*36'6 +*36*13x62 +*36*17 +*36*19 +*36*26 +*36*50 +*36+4o4z +*36+5-0 +*36D3[ +*36D5 +*36R0D3 +*36T9 +*36Z1Z1 +*36Z2*21 +*36[*05 +*36^Bl +*36^m +*36c +*36i1w +*36i5^i8- +*36o0B +*36o3g +*36o50z2 +*36o55 +*36x04 +*36x32 +*36x62 +*36z1L3 +*36{ +*37 +*37$4 +*37$A +*37$k +*37$z +*37*05 +*37*14 +*37*32 +*37*87 +*37c +*37i5<*30 +*37x12 +*37x13 +*37x25 +*37z5x32 +*37{z2 +*38 +*38'A +*38@rx32 +*38D0 +*38x23 +*38x26 +*38x57 +*39'A +*39+5 +*39+8x38 +*39D3-5 +*39L3x05 +*39o58 +*39x04 +*39x32 +*3A'8 +*3A-0x05 +*3Ax08 +*3Ax24 +*3Ax36 +*3Ax38z5 +*3B'8 +*3BTBx28 +*3Bl +*3Bx09i18 +*3Bx37 +*40 +*40$jx02 +*40$l +*40$s +*40'9 +*40*02 +*40*06 +*40*12 +*40*15 +*40*34 +*40*35z1 +*40*54 +*40*57 +*40*96 +*40D3 +*40D4 +*40D6x41 +*40Z1$h +*40^g +*40c +*40i0b +*40i4C +*40i8j +*40o0B +*40o3n +*40o5m +*40o7y +*40p1 +*40q +*40t +*40x24 +*40x27 +*40x34 +*40x34u +*40x41 +*40x42 +*40x42x61 +*40x45 +*40x75x24 +*40z1 +*40z2D5 +*40}$8 +*40}z2 +*41 +*41$) +*41$s +*41$z +*41*16 +*41*32 +*41*47 +*41*86 +*41+0^G +*41-0 +*41D1 +*41Z1*04 +*41Z2 +*41^2^k +*41^j +*41^v +*41c] +*41d +*41f +*41i0v +*41i68 +*41k{ +*41o2zu +*41o5t +*41o82 +*41q +*41x14f +*41x21 +*41x32 +*41x34 +*41x37 +*41x47 +*41z2 +*41z3 +*41z3x61 +*41z4'8 +*41z5 +*41}} +*42$0 +*42$g +*42$rZ2 +*42$s +*42*14i0Y +*42*21 +*42*41 +*42*64 +*42*B6 +*42+6 +*42R0 +*42R5 +*42R6 +*42T0 +*42Z1D1 +*42Z2 +*42]^g +*42^S +*42^f +*42^g +*42^k +*42^w +*42d +*42dc +*42li5n +*42o4aZ4 +*42r +*42skL +*42t +*42x3A +*42x46 +*42z1 +*42z3*21 +*42} +*43 +*43$" +*43$- +*43$3 +*43$a +*43$e +*43*01} +*43*12 +*43*48 +*43*52 +*43+2 +*43-0 +*43-6 +*43D2 +*43K*35 +*43R3 +*43T6 +*43[{ +*43]*20 +*43^7x18 +*43^8'5 +*43^y*23 +*43i2b +*43i2f +*43k +*43o4l +*43o9p +*43s25 +*43skC +*43suo +*43t-5 +*43t{ +*43x53 +*43z1 +*43z4 +*45 +*45$1-4 +*45$8 +*45*01 +*45*03 +*45*35 +*45*62 +*45*71 +*45-2 +*45-7 +*45-7^0 +*45D0 +*45R4 +*45Z1 +*45Z2 +*45^1 +*45^p +*45i1,Z2 +*45i8' +*45o0g +*45o0n +*45o2y +*45o39 +*45o3g +*45o4M +*45o4h +*45o69 +*45o6` +*45p1 +*45r +*45s2_ +*45sl8 +*45so9 +*45u +*45x04 +*45x08z4 +*45x32 +*45x52} +*45z1 +*45z2{ +*45{*25 +*46 +*46$_D4 +*46$d +*46$v +*46'6 +*46*16 +*46*23 +*46*25 +*46*60 +*46+4 +*46-4 +*46-7 +*46D1 +*46D4 +*46L7 +*46T0 +*46T5 +*46Z1 +*46[ +*46] +*46^P +*46i58 +*46i5L$9 +*46i5] +*46i5g +*46l +*46o2d +*46o54 +*46o7E +*46s6b +*46x05 +*46x24] +*46x34$C +*46{ +*46}'6 +*47 +*47$t +*47*34 +*47*36 +*47*58 +*47*65 +*47*67 +*47*75 +*47-9 +*47C*81 +*47Co2q +*47D4 +*47L1x06 +*47T4 +*47Z1 +*47Z1x71 +*47o4v +*47z3 +*48 +*48'6+5 +*48*08 +*48*86 +*48T7 +*48Z1 +*48[ +*48^9 +*48i2nx52 +*48l +*48tD1 +*48x01 +*48x07 +*48x43 +*48x43C +*48z1 +*49 +*49$Rx29 +*49'9 +*49^, +*49^i[ +*49swh +*49x14 +*49x24 +*49x47L4 +*49x53 +*4A +*4A*74x65 +*4Bi8/k +*4Bx16 +*4Bx19 +*4Bx63 +*50 +*50$0Z1 +*50$e +*50*02 +*50*25^_ +*50*31 +*50*41 +*50+0 +*50+2 +*50+3{ +*50-4 +*50L5 +*50R5 +*50Z1x32 +*50Z4x4B +*50cK +*50i0B +*50o0[ +*50o34 +*50o3j +*50o3l +*50o3t +*50o6L +*50to6Z +*50u +*50x16 +*50x18 +*50x23 +*50x26 +*50x32 +*50x43 +*50x51 +*50x53 +*50x56 +*50z1 +*50{ +*51$D +*51$z +*51*14 +*51*25] +*51*31 +*51*37 +*51*52 +*51*54 +*51+1 +*51-0 +*51-3 +*51C +*51D1*12 +*51D2 +*51K +*51KR6 +*51R1 +*51T6 +*51Z1x53 +*51Z3x23 +*51[ +*51^' +*51^H+7 +*51^o +*51i0d +*51i1g +*51o71D5 +*51rK +*51x32*30 +*51x35 +*51{ +*51{+6 +*52 +*52$3 +*52$9 +*52$?*63 +*52$e +*52'6 +*52*24 +*52*53u +*52*70 +*52+1 +*52+2 +*52+6 +*52L0 +*52Z1 +*52Z2 +*52[k +*52^b +*52^p +*52c] +*52d +*52i13^J +*52o3k +*52o5 +*52o5B +*52s3vD1 +*52se0 +*52shl +*52srd] +*52x04 +*52x12 +*52x13p1 +*52x56 +*52x61 +*52z1 +*53 +*53$L +*53$N +*53$` +*53$g +*53$y +*53'5saj +*53*12 +*53*12L5 +*53*20 +*53*46 +*53*50 +*53*72z2 +*53+0 +*53+8 +*53-4 +*53-7 +*53@z*35 +*53C +*53D3 +*53L7u +*53R5 +*53R6 +*53T4 +*53T5 +*53[ +*53] +*53^& +*53^d +*53f +*53i32 +*53o0z +*53o1$ +*53o15 +*53o8o +*53p1 +*53p2 +*53r +*53s5s +*53sbm +*53sbn +*53smb +*53sun +*53sur +*53t^m +*53x13 +*53x43 +*53x52T5 +*53x5B +*53xB2 +*53z1 +*54 +*54$3 +*54'B +*54*35t +*54*71'5 +*54*74 +*54*86 +*54+0 +*54+7 +*54-4 +*54-8 +*54C +*54D2 +*54D6$n +*54D7 +*54^0 +*54^9{ +*54^Z +*54^b +*54^c'7 +*54c +*54i1L +*54i35$a +*54i6t +*54l +*54o0K +*54o3 +*54o3l +*54o4q +*54o5m +*54o6h +*54o7_ +*54rZ4 +*54svN +*54syn +*54u +*54usBN +*54x12 +*54x23 +*54x52@p +*54x64 +*54} +*56 +*56$1 +*56$3 +*56$4 +*56'7 +*56'8 +*56'A +*56*12z3 +*56*13u +*56*30 +*56*76 +*56*81x03 +*56*85 +*56+4 +*56+5 +*56-4 +*56-6 +*56Cz3 +*56D0 +*56L0L5 +*56R4 +*56Z2 +*56^a +*56^l +*56l +*56o2l +*56o5d +*56o5j +*56o69 +*56o6b +*56o6q +*56r +*56s40 +*56se2 +*56sgo +*56x0Ap3 +*56}-6 +*57 +*57$% +*57$0 +*57$9 +*57$a +*57$n +*57$ox56 +*57*06 +*57*25 +*57*36] +*57*46 +*57D8 +*57T5D3 +*57Z1 +*57Z2o4( +*57c +*57cD6 +*57i3s +*57i8b +*57i9mx18 +*57o0C +*57o5R +*57o7a +*57o7s +*57p1 +*57x06 +*57x16 +*57x32 +*57} +*58 +*58'8 +*58*76 +*58D4 +*58D5s13 +*58D7 +*58]{ +*58l +*58o5M +*58x06 +*58x25Z1 +*58x91 +*59 +*59*56^_ +*59C^$ +*59D2 +*59Z1x53 +*59i6Vk +*59o0!} +*59o90 +*59x25 +*59x27 +*59x42 +*5A +*5Ax06 +*5Ax08D2 +*5Ax36 +*5Ax45Z2 +*5Ax53@M +*5Ax73 +*60 +*60$3 +*60$s +*60*01 +*60*02 +*60*07 +*60*54 +*60-1 +*60-5 +*60-8 +*60C +*60Co2k +*60D0 +*60D1 +*60D6 +*60^A +*60^S +*60^w +*60c +*60kT5 +*60o3R +*60o6l +*60x03 +*60x34u +*60x35 +*60x51 +*60x54 +*60x61 +*60z2x65 +*60}D4 +*61$[o8e +*61'4 +*61'5 +*61*21 +*61-1 +*61-4 +*61@c$] +*61D1 +*61D6 +*61T0 +*61T2 +*61^3*43 +*61^R +*61^l +*61i6n +*61o6* +*61o6O +*61o6g +*61o7u +*61sd{x52 +*61x03k +*61x12 +*61x21*13 +*61x54 +*61x61+6 +*62*46o18 +*62*52 +*62*73 +*62+2 +*62-0 +*62-2 +*62D6 +*62T9x35 +*62^Lz1 +*62i0z +*62i8q +*62l +*62o12 +*62o2k +*62o2s +*62o61} +*62r +*62x01r +*62x02 +*62x03 +*62x32 +*62x38 +*62x43D4 +*62x45 +*62x46 +*62x51 +*62z3 +*63 +*63$j +*63*63 +*63*A7'6 +*63+1 +*63+7 +*63D3 +*63D7 +*63L6x62 +*63T2 +*63Z1 +*63Z3 +*63]'5 +*63^Gi0b +*63csv# +*63i2| +*63i5"*49 +*63o1l +*63o3q +*63o4h +*63o5t +*63o6^ +*63slp +*63u +*63uo2` +*63x53 +*63} +*64 +*64$x +*64'4Z3 +*64'5 +*64*20 +*64*34 +*64*65[ +*64D0+1 +*64D1 +*64K +*64R3 +*64^cx26 +*64^j +*64^r +*64o3`$P +*64o3i +*64o66 +*64x01 +*64x43@p +*64x53 +*64x61 +*64x72 +*64x73 +*65$! +*65$n +*65'9 +*65*35 +*65*51 +*65*73 +*65*8A +*65+3 +*65-5 +*65D3 +*65R3 +*65Z3 +*65[{ +*65^+ +*65^S +*65^z +*65i4h +*65i66 +*65i7w +*65l$* +*65o0r +*65o2t*24 +*65o67 +*65o6` +*65x14Z1 +*65x42 +*65x65 +*67 +*67$1 +*67$e +*67'7scu +*67*56 +*67*86 +*67-5 +*67@b +*67D9 +*67K +*67R4 +*67T3 +*67Z2 +*67^V +*67c +*67i20i6v +*67i65 +*67i6; +*67k +*67o4Z +*67o6- +*67o75 +*67o7r +*67r +*67s- +*67s1/ +*68 +*68*20 +*68*B3*85 +*68-6 +*68D6 +*68Z1 +*68o0k +*68o6r +*68q +*68x42 +*68x43^j +*68x52{ +*69 +*69'8 +*69'A +*69o67 +*69o95 +*69x92 +*6A$Gx18 +*6AD7 +*6As70x34 +*6Ax37 +*6Ax94 +*6Bx16 +*6Bx84 +*70 +*70$"^! +*70$2 +*70'5 +*70*05 +*70*2A +*70+9x56 +*70T1L0 +*70^Q +*70i4g +*70t +*70x01 +*70x05o28 +*70x52*41 +*70x53 +*70x72 +*70z1 +*71'6 +*71'7 +*71'9 +*71*29 +*71*62 +*71-7 +*71Cl +*71D2r +*71D6 +*71Z3 +*71[ +*71c +*71cx38 +*71i7+ +*71o4= +*71o68 +*71x02 +*71x03 +*71x04 +*71x13 +*71x35 +*71x54Z3 +*72$q +*72'4 +*72'6 +*72-2 +*72-4 +*72D7 +*72i3r +*72i7sz2 +*72o3w +*72o7r +*72o8h +*72s32 +*72x03 +*72x23 +*72x28+3 +*72x39 +*72x53 +*72x59 +*72x73 +*73$_ +*73$g +*73$m +*73*02o6k +*73*72C +*73D1 +*73L5 +*73[ +*73^s +*73^z +*73o0d +*73o3m +*73o5zx03 +*73r +*73x04 +*73x21 +*73x31 +*73x38^y +*73x62 +*73x74 +*73x7A +*73x96 +*74$k +*74+4 +*74+5 +*74-3 +*74D1 +*74L5 +*74Z2 +*74Z3 +*74i57 +*74i5_ +*74i5r +*74k +*74k$8 +*74o5 +*74o85 +*74o9- +*74s6a +*74sds +*74ux72 +*74x31 +*74x34 +*74x41 +*74x54 +*74x56 +*74x64 +*74x6A +*74x6B +*75$5 +*75$m +*75@?'7 +*75D1 +*75D4 +*75D6 +*75T5 +*75[ +*75i3|^W +*75i6e +*75o0J +*75o1h +*75o6e +*75o7R +*75o87 +*75sGwx41 +*75si^ +*75t +*75u*76 +*75x47Z1 +*75x53R5 +*75x81 +*75{ +*76 +*76$5 +*76$h +*76$o +*76'8 +*76'B +*76*31 +*76*34 +*76*36 +*76*47 +*76+5 +*76+6 +*76+6x42 +*76+7 +*76+8 +*76-9 +*76]sti +*76^2 +*76d +*76i44 +*76i5 +*76i6r +*76i7e +*76i7u +*76l +*76o2r +*76o5t +*76o6F +*76o6a +*76o6g +*76o7! +*76s17 +*76s51 +*76scv +*76x1Ad +*76x21 +*76x35p1 +*76x41 +*76x42 +*76x52 +*76x63Z4 +*76x72$t +*76x74 +*76z1 +*76} +*78 +*78$6 +*78$9 +*78$a +*78$w +*78'9 +*78*31 +*78*62 +*78+6 +*78-6 +*78-A +*78T3 +*78Z1 +*78^n +*78i6k +*78o4! +*78s71 +*78x31 +*78x53 +*78x62 +*79 +*79'A +*79*95 +*79-8 +*79-9 +*79i9n +*79x36+7 +*79x81 +*7A +*7A'A +*7AD4'5 +*7Ax53 +*7Ax62 +*7Ax64 +*7Ax92 +*7Bx17 +*7Bx27 +*7Bx64 +*80'6 +*80*38 +*80Z4x47 +*80o79 +*80x04 +*80x28D3 +*80x31 +*80x36 +*80x45l +*81$f +*81'8 +*81+8 +*81T6o8$ +*81t'7 +*81tx27 +*82$:*41 +*82'A +*82T5 +*82T8x38 +*82i3l +*82l +*82o84 +*82x06 +*82x39 +*82x45 +*82x72 +*82x81 +*83 +*83'5 +*83*47 +*83+3 +*83D5 +*83Z1x54 +*83i54 +*83o1} +*83x04 +*83x54 +*83x59 +*83x64-7 +*83x81 +*84'6 +*84D8 +*84[ +*84^s'8 +*84i6c +*84o84 +*84u +*84x06 +*84x23 +*84x53 +*84x5A +*85 +*85'6 +*85'7 +*85*63 +*85+1D8 +*85+5 +*85D8 +*85Z1 +*85^"} +*85i7e +*85x23 +*85x42 +*86 +*86$3 +*86$r +*86'8 +*86*14 +*86*50 +*86*70x64 +*86*95 +*86+7 +*86D3 +*86R0 +*86o0]i3x +*86o30 +*86o5 +*86o7j +*86o8s +*86sr5 +*86x14 +*86x34 +*86x41 +*86x57-8 +*87$1 +*87*36 +*87+8 +*87c +*87i88 +*87o0p +*87o76 +*87o7z +*87o81 +*87o8A +*87s81 +*87sti +*87x26t +*87x31 +*87x72^x +*87{t +*89 +*89'5$g +*89+8 +*89-7 +*89D5 +*89Z1 +*89[ +*89^q +*89o7p +*89x18 +*89x46'9 +*89x63x04 +*89} +*8A +*8AD8 +*8AoB3 +*8As6Vx54 +*8At +*8Ax38d +*8B*BA +*8Bur +*8Bx38 +*8Bx64 +*90L0 +*90i1t*14 +*90o9D +*90x1A +*90x26 +*91*37 +*91R3 +*91R8 +*91o1a +*91oA7 +*91x43 +*91x67 +*92$g'5 +*92'9 +*92t +*92x18 +*92x46 +*92x56 +*92x57 +*92x58 +*93'9 +*93cx56 +*93x07 +*93x21 +*93x48 +*94 +*94'8 +*94*89^T +*94[*38 +*94o0t +*94ux56 +*94x06 +*94x34 +*94x61 +*94x73 +*94x85Z1 +*95*27 +*95*5A +*95*87 +*95o93 +*95uD8 +*95x19u +*95x76 +*96D7 +*96x02 +*96x15 +*96x52 +*97$q +*97*21 +*97*32x34 +*97D1 +*97c +*97i1Fx62 +*97o93 +*97o95 +*97syi +*97u +*97x07 +*97x36 +*98$ex52 +*98'9 +*98*85 +*98+0 +*98+1 +*98+9 +*98D9*32 +*98^1 +*98o7 +*98o8_ +*98x71 +*9A$3 +*9A$mx83 +*9A*89 +*9Ao9J +*9As1c +*9Ax46saC +*9Ax73 +*9B*68 +*9BL2L3 +*9B^gx2A +*9Bx62 +*A0$:DA +*A0'6 +*A0*5Ax46 +*A0-7'5 +*A0x4B +*A0x56 +*A0x69x5A +*A0{ +*A1'6 +*A1D1 +*A1RA +*A1x07 +*A1x16 +*A1x59t +*A1x83 +*A2 +*A2'8 +*A2x38z2 +*A2x49 +*A2x76 +*A3'7 +*A3i9Yx52 +*A3x06 +*A3x75 +*A3x93 +*A4'9 +*A4'A-4 +*A4R8 +*A4x05 +*A4x86 +*A5*B7'8 +*A5o2n +*A5x3A$I +*A5x76 +*A6'7 +*A6*A9 +*A6l +*A6x26 +*A6x42 +*A7'8 +*A7[ +*A7^C +*A8[ +*A8l +*A8oAe +*A8s0x +*A8x35 +*A9 +*A9'AZ2 +*A9o9n +*A9oA2 +*A9s05 +*A9x52 +*AB +*ABT7'A +*ABx68+6 +*B0$3'6 +*B0'8 +*B1'6$R +*B1x03 +*B1x45 +*B2'7 +*B2'8 +*B4'7 +*B5o8HR8 +*B5x76 +*B5xA1 +*B6'7[ +*B6^lx69 +*B7 +*B7'8 +*B7x85 +*B8*A9 +*B8f'A +*B9'A +*B9*30i4l +*B9o2o +*B9s29 +*B9x65 +*BA'7T1 +*BAD9 +*BAc +*BAiA_ +*BAx02 +*BAx83 ++0 ++0$! ++0$$ ++0$1o2k ++0$2 ++0$= ++0$C ++0$V ++0$` ++0$d ++0$e ++0$i ++0$j ++0$l ++0$s ++0'2 ++0'5 ++0'5k ++0'6 ++0'7 ++0'B ++0*05 ++0*08 ++0*18 ++0*20 ++0*31 ++0*32 ++0*32} ++0*37 ++0*58 ++0*86 ++0+0 ++0+0+0 ++0+0+0+0 ++0+1 ++0+1+2 ++0+1+2+3 ++0+3 ++0+6 ++0-1 ++0-3 ++0@t ++0@z ++0C ++0D2 ++0D3 ++0D4 ++0D8 ++0L4 ++0L5t ++0L7 ++0R1 ++0R4 ++0R6 ++0T2 ++0Z1 ++0Z2 ++0Z5@j ++0[ ++0^$ ++0^% ++0^/ ++0^1 ++0^3 ++0^9 ++0^B ++0^L ++0^N ++0^a ++0^g ++0^i ++0^p ++0^r ++0f ++0i0z ++0i1l ++0i2j ++0i4z ++0i5t ++0i6+ ++0i64x3A ++0i6J ++0i6v ++0l ++0o0t ++0o1i ++0o2q ++0o33 ++0o3v ++0o44 ++0o4i ++0o4o ++0o5P ++0o5t ++0o6& ++0o64 ++0o7n ++0o83 ++0o8m ++0p1 ++0p2'6 ++0q ++0qo3R ++0s1y+1 ++0s23 ++0s4k ++0s7S ++0sc. ++0ssW ++0t ++0x12 ++0x12R8 ++0x13 ++0x24 ++0x25 ++0x25D3 ++0x38Z4 ++0x42 ++0x51@m ++0x52 ++0x53x73 ++0x56 ++0x72 ++0x82 ++0x92 ++0xA1 ++0xB3x19 ++0z1 ++0z2 ++0z3 ++0z4 ++0z5 ++0z5@x ++0{Z3 ++0} ++0}o6Q ++1 ++1$' ++1$0 ++1$5 ++1$f ++1$h ++1$i ++1$j ++1$n ++1$p ++1$s ++1$t ++1'2 ++1'5 ++1'7 ++1'A ++1'B ++1*04slk ++1*06 ++1*14 ++1*52 ++1*91 ++1+1 ++1+1+1 ++1+1+1+1 ++1+2 ++1+2+3 ++1+2+3+4 ++1+3 ++1-4 ++1-5 ++1-8 ++1@B ++1@a ++1Cx14 ++1D4-6 ++1D4d ++1D7 ++1D9 ++1KZ2 ++1L2x29 ++1L7 ++1R0 ++1R1 ++1R4 ++1T2 ++1Z1 ++1Z1D3 ++1Z1x01 ++1Z2 ++1Z4 ++1[ ++1^= ++1^DsG! ++1^J ++1^b ++1^e ++1^l ++1^n ++1^z ++1c ++1csrD ++1du ++1f ++1i0h ++1i0i ++1i18 ++1i1l ++1i1u ++1i22 ++1i24 ++1i2g ++1i2xZ1 ++1i3}$< ++1i4X ++1i4a ++1i76 ++1l ++1li5a ++1o0& ++1o0' ++1o0A ++1o0a ++1o0b ++1o0f ++1o0r ++1o25 ++1o2b ++1o2g ++1o3o ++1o8A ++1o8wx12 ++1p1 ++1s.qo2w ++1s0Q ++1sbq ++1sel ++1skw ++1smd ++1srg ++1szl ++1t ++1x23 ++1x24 ++1x28 ++1x42-3 ++1x45 ++1x52 ++1x62 ++1x63 ++1x67[ ++1x92 ++1z1 ++1z2 ++1z3 ++1z4o69 ++1z5x82 ++1{ ++1} ++2 ++2$ ++2$+ ++2$6 ++2$7T7 ++2$Mt ++2$W ++2$f ++2$iq ++2$it ++2$w ++2$y^d ++2'4 ++2*02 ++2*30 ++2*32 ++2*62x5B ++2*75 ++2+0 ++2+2 ++2+2+2 ++2+2+2+2 ++2+3 ++2+3+4 ++2+3+4+5 ++2+5 ++2@0 ++2D1 ++2D3 ++2D5 ++2D5*79 ++2L2 ++2L5 ++2L6u ++2T1d ++2T5z3 ++2Z2 ++2Z3 ++2Z3i22 ++2^# ++2^8 ++2^h ++2^u ++2c ++2d ++2f ++2i2K ++2i2d ++2i4?*53 ++2iA5x38 ++2l ++2l$% ++2li0D ++2o0* ++2o0z ++2o1b ++2o4A ++2o71 ++2oAs ++2p1 ++2p1x23 ++2q ++2sCy ++2sGq ++2sgb ++2sui ++2t*57 ++2up1 ++2x02 ++2x39t ++2x41 ++2x57 ++2z1 ++2z2 ++2z3*08 ++2z3*57 ++2z3D4 ++2z3t ++2z4 ++2z5x81 ++3 ++3$! ++3$. ++3$1 ++3$4 ++3$4D5 ++3$7-6 ++3$Ri2D ++3$Y ++3$c} ++3$m ++3$v ++3$w ++3'9 ++3*12 ++3*34r ++3*42 ++3*62 ++3+3 ++3+3+3 ++3+3+3+3 ++3+4 ++3+4+5 ++3+4+5+6 ++3+5 ++3+6 ++3+8'6 ++3-1 ++3-2 ++3@1 ++3@t ++3@v ++3@vo33 ++3D5o5e ++3D6 ++3K ++3R4z3 ++3R5sc6 ++3T5 ++3Z1 ++3Z1R6 ++3Z2 ++3Z2o1u ++3Z4 ++3^- ++3^2 ++3^G ++3^W} ++3^b ++3^d ++3^m ++3^p ++3c ++3i04 ++3i1L ++3i1m ++3i20 ++3i2Ac ++3i2| ++3i4a ++3i4e ++3i4k ++3k*23 ++3o0c ++3o0d ++3o1O ++3o1q ++3o2+ ++3o3p ++3o4_ ++3o4i ++3o5, ++3o6e ++3o8a ++3p1 ++3r ++3s1d ++3sjLZ1 ++3sl0 ++3snz ++3soe ++3spjo6q ++3ssv ++3stg ++3suf ++3ts27 ++3u ++3x03$w ++3x06Z4 ++3x12 ++3x47 ++3x53 ++3x71 ++3z1+2 ++3z1@6 ++3z2 ++3z3o33 ++3z4 ++3z5D2 ++3{ ++3{K ++4 ++4$$u ++4$0 ++4$5 ++4$G ++4$N ++4$Zx58 ++4$_'6 ++4$a ++4$g[ ++4$k ++4$u ++4$v ++4'4l ++4'5 ++4'9 ++4*02 ++4*04z2 ++4*23 ++4*24x03 ++4*25 ++4*40 ++4*86 ++4+0 ++4+1 ++4+4 ++4+4+4 ++4+4+4+4 ++4+5 ++4+5+6 ++4+5+6+7 ++4-1Z2 ++4-2Z3 ++4@a ++4@y ++4C ++4C$O ++4D3 ++4D5 ++4L5 ++4L7 ++4R1o0L ++4T5 ++4Z1 ++4Z2 ++4Z2*52 ++4Z3 ++4Z4 ++4Z5x58 ++4[ ++4^c^S ++4c ++4d ++4i03C ++4i1lD3 ++4i2P ++4i44 ++4i4Tx01 ++4i4b ++4i4z ++4i66 ++4o0m ++4o0t ++4o0z ++4o2; ++4o3g ++4o5y ++4o97 ++4p1 ++4q ++4qx53 ++4r ++4s.z ++4sK9 ++4seg ++4so5 ++4srB ++4t ++4x03 ++4x54 ++4x57 ++4x62 ++4x74 ++4x84 ++4z1 ++4z3 ++4z4 ++4{ ++4} ++5 ++5$- ++5$4 ++5$D ++5$I ++5$`R8 ++5$g ++5$u ++5$xx06 ++5$y ++5$z^X ++5'6 ++5'8 ++5'9 ++5*35 ++5*54 ++5*60 ++5*65 ++5*78 ++5*79 ++5+0D5 ++5+0^r ++5+5 ++5+5+5 ++5+5+5+5 ++5+6 ++5+6+7 ++5+6+7+8 ++5+7 ++5-0 ++5-4 ++5-6 ++5-7 ++5@6 ++5D1 ++5D2x41 ++5D4 ++5D6 ++5L0 ++5L6 ++5T3 ++5T4 ++5T4z4 ++5T7 ++5Z1 ++5Z2 ++5Z3 ++5Z4 ++5[-2 ++5[Z4 ++5] ++5]i3x ++5^# ++5^2 ++5^6 ++5^C ++5^K ++5^] ++5^g ++5^ri2o ++5^w ++5c ++5d ++5dx75 ++5f ++5i3/Z1 ++5i3o ++5i51 ++5i5z ++5ko0j ++5l ++5o0N ++5o2q ++5o37 ++5o3k ++5o4 ++5o47 ++5o4v ++5o5^ ++5o79 ++5o94 ++5o9y ++5p1 ++5r ++5s36 ++5s6a ++5s6b ++5sfm$f ++5t ++5x01 ++5x04 ++5x61 ++5x62 ++5x63 ++5z1 ++5z1D4 ++5z2 ++5z4 ++5{ ++6 ++6$! ++6$& ++6$+ ++6$0 ++6$7 ++6$; ++6$@ ++6$A ++6$L ++6$U ++6$b ++6$e ++6$p ++6$u ++6'8 ++6'9 ++6'A ++6*02 ++6*14 ++6*43 ++6*57 ++6*60 ++6*63 ++6*73 ++6*83D3 ++6+1 ++6+4 ++6+6 ++6+6+6 ++6+6+6+6 ++6+7 ++6+7+8 ++6+7+8+9 ++6-5 ++6-7 ++6@d ++6@p ++6@u ++6D2 ++6D4 ++6D7 ++6D8 ++6R2 ++6R5 ++6T7 ++6Z1 ++6Z1i4c ++6Z2 ++6Z3 ++6Z4 ++6Z5 ++6[ ++6^*'5 ++6^- ++6^S ++6^a ++6^p ++6c ++6c^M ++6d ++6i3_ ++6i3j ++6i4. ++6i5 ++6i5m ++6i64 ++6i7u ++6iA+'8 ++6k ++6l ++6l*32 ++6o2s ++6o5w ++6o7. ++6o77 ++6o78 ++6o92 ++6s3* ++6s57 ++6s87 ++6skP ++6slK ++6slg ++6u ++6x02 ++6x06o03 ++6x12 ++6x21[ ++6x31 ++6x32 ++6x42 ++6x51 ++6x73 ++6x74 ++6x76 ++6x81 ++6z1 ++6z1{ ++6z2 ++6{ ++7 ++7$% ++7$0 ++7$3 ++7$4 ++7$P ++7$a ++7$bi18 ++7$bx4A ++7$g ++7'9 ++7*07 ++7*13+0 ++7*56[ ++7*57 ++7*59 ++7*98 ++7+7 ++7+7+7 ++7+7+7+7 ++7+7@. ++7+8 ++7+8+9 ++7-1 ++7-5 ++7-6 ++7-8 ++7-8x31 ++7@0 ++7@R ++7@k ++7@o ++7@r ++7D1 ++7D2 ++7R3 ++7R5 ++7R6 ++7T2 ++7Z1 ++7Z1*30 ++7Z1swg ++7Z2 ++7Z2L5 ++7[ ++7^, ++7^b ++7^o ++7^w ++7c ++7f ++7i1p ++7i34 ++7i4/ ++7i5j ++7i6y ++7i7& ++7i7S ++7i7_ ++7i7f ++7l ++7o3"C ++7o3< ++7o46 ++7o54 ++7o6_ ++7o6x ++7o6y ++7o83 ++7oB}*68 ++7p1 ++7r ++7r[ ++7s0sR5 ++7s7r ++7sfb ++7skD ++7u ++7x01 ++7x0BT4 ++7x12 ++7x24 ++7x27x43 ++7x32D2 ++7x41 ++7x48$u ++7x82 ++7xA2 ++7z2^) ++7z3 ++7} ++8 ++8$g ++8$m ++8'9 ++8*70 ++8*78 ++8*9A ++8+6 ++8+8 ++8+8+8 ++8+8+8+8 ++8+9 ++8+A ++8-2u ++8-6 ++8-7 ++8-9 ++8@9 ++8C+6 ++8D4 ++8R6 ++8R7 ++8T2 ++8Z1 ++8Z2 ++8^a ++8c ++8i7- ++8l ++8o0y ++8o13 ++8o4l ++8o5s ++8o6B ++8o6a ++8o7_ ++8o7b ++8s_ ++8sjs ++8spi ++8u ++8x08 ++8x17 ++8x21 ++8x26 ++8x42 ++8x47T6 ++8x52 ++8x53p1 ++8z1 ++8} ++9 ++9$8D8 ++9$B ++9$a ++9'7Z1 ++9'A ++9+0 ++9+6 ++9+7 ++9+9 ++9+9+9 ++9+9+9+9 ++9-8Z1 ++9D0+6 ++9D3 ++9D5 ++9D5z1 ++9D7 ++9D8 ++9R1 ++9Z1 ++9Z2 ++9Z2xA2 ++9[ ++9c ++9i6s$2 ++9i8d ++9i91 ++9l ++9o0Ix15 ++9o0l ++9o43 ++9o76 ++9o83 ++9o8i ++9o8j ++9u ++9x15 ++9x19 ++9x23 ++9x37Z5 ++9x45 ++9x71 ++9x72 ++9x73 ++9xA4 ++A ++A$! ++A$9 ++A*8A ++A*9A ++AD4 ++ADB ++AR5'9 ++AR9 ++AZ2 ++A^5c ++At ++Ax62 ++Ax82 ++Ax91 ++B ++B$3 ++B*9A ++B+5x0A ++B@2 ++B@8 ++BDB ++B[ ++Bl ++Bo10 ++Bx02 ++Bx62 ++Bx73 ++Bx92 +-0 +-0$) +-0$1 +-0$? +-0$E +-0$K +-0$P +-0$` +-0$a +-0$b@4 +-0$c +-0$e +-0$f +-0$n +-0$p +-0$u +-0$z +-0'4z1 +-0'7 +-0'8x41 +-0'A +-0*02 +-0*02[ +-0*04 +-0*05D0 +-0*21 +-0*31 +-0*52 +-0*63 +-0*64 +-0+2 +-0+2s1q +-0+3 +-0+6 +-0+7 +-0+8 +-0-0 +-0-0-0 +-0-0-0-0 +-0-1 +-0-1-2 +-0-1-2-3 +-0-2^B +-0-5 +-0-7 +-0@2 +-0@z +-0C +-0C*34 +-0CT0 +-0D1 +-0D7 +-0K +-0L7 +-0R3 +-0R5x12 +-0Z1 +-0Z2 +-0Z3 +-0Z3*6A +-0Z4 +-0^& +-0^+ +-0^2 +-0^5 +-0^9 +-0^; +-0^;*56 +-0^< +-0^= +-0^[ +-0^d +-0^g*02 +-0^px12 +-0^u +-0c +-0d +-0f +-0f*56 +-0i02 +-0i0C +-0i0c +-0i18 +-0i1l +-0i1r +-0i2n +-0i2t +-0i3j +-0i3t +-0i52 +-0i57t +-0i7s +-0i7}x61 +-0k +-0kD2 +-0l +-0l$; +-0lx24 +-0o0fq +-0o1wz3 +-0o2H +-0o3Z +-0o3c +-0o4=x3A +-0o4f +-0o52 +-0o6p +-0o7w +-0o7z +-0o8a +-0o9b +-0p2 +-0p4 +-0q +-0r +-0sao +-0spH +-0spm +-0ss#l +-0st2 +-0t +-0t^T +-0x12 +-0x13 +-0x16 +-0x18^e +-0x23 +-0x24 +-0x25 +-0x26 +-0x4A +-0x52sfT +-0x53 +-0x56 +-0x84 +-0z1 +-0z1u +-0z2 +-0z2z4 +-0z3 +-0z3z2 +-0z4 +-0{ +-1 +-1$3 +-1$5 +-1$7 +-1$8 +-1$; +-1$R@R +-1$q +-1$r +-1$v +-1$x +-1'7 +-1'A +-1*12 +-1*13 +-1*20 +-1*23 +-1*27 +-1*31r +-1*43 +-1*52K +-1*90 +-1*91 +-1+2 +-1-1 +-1-1-1 +-1-1-1-1 +-1-2 +-1-2-3 +-1-2-3-4 +-1-5 +-10 +-11 +-13 +-14 +-15 +-16 +-17 +-184 +-1@2 +-1@6 +-1@v +-1C +-1C-2 +-1D0 +-1DA +-1K{ +-1L0 +-1R0 +-1T2 +-1T5+6 +-1Z4 +-1Z5i05 +-1[-5 +-1[Z2 +-1[z4 +-1^0 +-1^3 +-1^8 +-1^A +-1^i +-1^n +-1c +-1d +-1i0P +-1i1l +-1i2Oi0g +-1i2R +-1i5d +-1i62 +-1i82 +-1l +-1o01 +-1o08 +-1o0T +-1o0t +-1o3P +-1o7m +-1r +-1ro3/ +-1s9s +-1sfr +-1skv +-1skx +-1sly +-1ssik +-1t +-1to3l +-1u +-1x07i1_ +-1x23 +-1x32 +-1x37^b +-1x73 +-1z1 +-1z2 +-1z3 +-1z5 +-1} +-1}*50 +-1}i5` +-2 +-2$3 +-2$4 +-2$7 +-2$8 +-2$< +-2$K +-2$c +-2$cx42 +-2$hx54 +-2'7 +-2'A +-2*05 +-2*10 +-2*23 +-2*26 +-2*52 +-2*75c +-2-2 +-2-2-2 +-2-2-2-2 +-2-3 +-2-3-4 +-2-3-4-5 +-2-6 +-2-8 +-25 +-267 +-2@1o4h +-2@6 +-2@8 +-2D0*54 +-2D1 +-2L0 +-2L1 +-2L2 +-2L3 +-2R0 +-2R1 +-2R4 +-2R4^d +-2R6 +-2T4 +-2Z1 +-2Z2 +-2Z3 +-2Z4q +-2^C +-2^c +-2^g +-2^k +-2^p +-2^s} +-2d +-2f +-2f[ +-2i0m +-2i14 +-2i2xT3 +-2i3 +-2i3b +-2i3h +-2i3l +-2i6u +-2i7b +-2l +-2l+7 +-2o04 +-2o0G +-2o0T +-2o0d +-2o0g +-2o1[ +-2o1dZ1 +-2o1k +-2o33z2 +-2o3P +-2o3j +-2o3x +-2o40 +-2o4y +-2o5a +-2o7* +-2o7A +-2o7G +-2o7r +-2p1x83 +-2q +-2q+0 +-2r +-2rz1 +-2s7i +-2scu*03 +-2sdy +-2si5 +-2sw;D2 +-2u +-2u*31 +-2x47 +-2x52 +-2x53 +-2x53z2 +-2x54swc +-2z1Z1 +-2z2 +-2{ +-3 +-3$#o86 +-3$, +-3$4 +-3$9 +-3$: +-3$=x05 +-3$I^N +-3$b +-3$k +-3$tt +-3$zi2p +-3'6 +-3'7u +-3*16 +-3*20 +-3*24 +-3*32sr1 +-3*43 +-3*45 +-3*57 +-3*64 +-3*65 +-3*82 +-3+1 +-3+2 +-3+4 +-3+6 +-3-0 +-3-1 +-3-3 +-3-3-3 +-3-3-3-3 +-3-4 +-3-4-5 +-3-4-5-6 +-3@1 +-3@3 +-3@8 +-3@g +-3D2 +-3D2u +-3D3i0F +-3D4Z2 +-3D6 +-3D7 +-3L2 +-3T3u +-3T6 +-3Z2 +-3Z3 +-3^$ +-3^8 +-3^b +-3^g +-3^oo7k +-3^r +-3^u +-3^v +-3d +-3do1f +-3fx12 +-3i18l +-3i33 +-3i34 +-3i4z*63 +-3i5/ +-3i5k +-3i5s +-3i5v +-3k +-3ks4| +-3l +-3o0G +-3o0W +-3o0a +-3o1W +-3o2a-6 +-3o4. +-3o4@ +-3o4e +-3o4i +-3o4k +-3o4s +-3o97 +-3p1x72 +-3q +-3r +-3s0b +-3sCg +-3sTB +-3sfk +-3smu +-3ssp +-3t$n +-3ui2D +-3x02 +-3x35*43 +-3x41 +-3x51 +-3x52 +-3x63$9 +-3x72 +-3x86'8 +-3xB2^9 +-3z1 +-3z2 +-3z2i0c +-3z3 +-3z4 +-3z4s/4 +-3z5'9 +-3{ +-4 +-4$! +-4$* +-4$- +-4$a{ +-4$xo6K +-4'6 +-4*02 +-4*14 +-4*26 +-4*34 +-4*40 +-4*42 +-4*42x42 +-4*45 +-4+3 +-4-0'7 +-4-1 +-4-2 +-4-4 +-4-4-4 +-4-4-4-4 +-4-5 +-4-5-6 +-4-5-6-7 +-4-8 +-4@m +-4D2 +-4D5 +-4D5L6 +-4D6 +-4D7 +-4L4 +-4L5+5 +-4Z1 +-4Z1o61 +-4Z1z2 +-4Z2x78 +-4Z3 +-4[Z5 +-4[^I +-4]-1 +-4^$ +-4^4D4 +-4^h +-4^j +-4^r +-4c +-4i0M +-4i0l +-4i27x4A +-4i5d +-4i64 +-4k +-4l +-4o05 +-4o0G +-4o0P +-4o0dz2 +-4o28 +-4o2B +-4o2t +-4o52 +-4o5k +-4o67 +-4o7e +-4p1 +-4s0M +-4s2m +-4s7 +-4se. +-4t +-4u +-4x03 +-4x12 +-4x14$m +-4x26$B +-4x31 +-4x45^D +-4x63 +-4x75 +-4x82 +-4z1 +-4z3 +-4z4 +-4} +-5 +-5$! +-5$% +-5$* +-5$1 +-5$2 +-5$3 +-5$? +-5$I} +-5$K +-5$M +-5$S +-5$j +-5$m +-5$t +-5$u +-5'6 +-5'9 +-5*16 +-5*21d +-5*25l +-5*46 +-5*50K +-5*62'6 +-5*68 +-5*74 +-5*75*56 +-5*79 +-5+2 +-5+3 +-5+4 +-5+8 +-5-5 +-5-5-5 +-5-5-5-5 +-5-6 +-5-6-7 +-5-6-7-8 +-5-9 +-5@0 +-5@3 +-5@7 +-5@a +-5C +-5D1 +-5D2 +-5D3 +-5D3sw7 +-5D4 +-5D6 +-5L0+1 +-5R3+3 +-5R5+1 +-5T0 +-5T2 +-5T3 +-5Z1 +-5Z1R6 +-5Z2 +-5Z3 +-5Z3x43 +-5Z4 +-5[ +-5[d +-5^Rx41 +-5^UsrM +-5^n +-5c +-5cZ1 +-5d +-5i19 +-5i3g +-5i4Mi0` +-5i5n +-5i5t^_ +-5i7e +-5i7o +-5k +-5l +-5o0G +-5o19 +-5o1_ +-5o2[ +-5o2bD4 +-5o3_ +-5o61 +-5o62 +-5o6= +-5o6g +-5o8* +-5r[ +-5s6v +-5sb- +-5sjy +-5srot +-5suVc +-5t +-5x02 +-5x03 +-5x05 +-5x42L4 +-5x81 +-5z2 +-5z2{ +-5z3 +-5z3Z1 +-5{ +-5} +-6 +-6$4 +-6$7 +-6$8 +-6$p-2 +-6$x +-6$z +-6'7i3i +-6'9 +-6*20 +-6*24D0 +-6*63 +-6*67 +-6*70 +-6*85 +-6+0 +-6-0x51 +-6-3 +-6-6 +-6-6-6 +-6-6-6-6 +-6-7 +-6-7-8 +-6-7-8-9 +-6-8 +-6-9 +-64 +-6@_ +-6C +-6D4 +-6L0 +-6L1o0j +-6L5 +-6L6 +-6R4 +-6R6u +-6T0 +-6T2 +-6T7 +-6Z1 +-6Z2 +-6Z2*68 +-6Z4 +-6[ +-6]x74 +-6^# +-6^& +-6^@ +-6^a +-6^k +-6^r +-6c +-6ci6f +-6d +-6dx48 +-6i06 +-6i0f'9 +-6i45 +-6i4j +-6i5, +-6i5r +-6i62 +-6i7d +-6i82 +-6ki6x +-6l +-6o3l +-6o56 +-6o5t +-6o5z +-6o7r +-6p1 +-6u +-6uL2 +-6x03 +-6x04 +-6x05 +-6x13 +-6x23 +-6x31 +-6x34T3 +-6x51 +-6x51T1 +-6x65i4u +-6x72 +-6x75 +-6x82 +-6x84 +-6z1 +-6z1x73 +-6} +-7 +-7$! +-7$% +-7$+ +-7$0 +-7$5 +-7$9 +-7$? +-7$R +-7$a +-7$b +-7$v +-7'A +-7*06u +-7*43 +-7*68 +-7*70o10 +-7*72 +-7*73 +-7*73z3 +-7*76 +-7*87 +-7+9 +-7-3 +-7-3Z1 +-7-7 +-7-7-7 +-7-7-7-7 +-7-8 +-7-8-9 +-7-9 +-7@j +-7D4 +-7D6 +-7D8 +-7R2 +-7T4 +-7Z1 +-7Z1Z1 +-7Z2 +-7Z3 +-7[ +-7^3 +-7c +-7ci6_ +-7i0j +-7i1R +-7i4; +-7i4w^7 +-7i4x +-7i59 +-7i68 +-7i7,t +-7i7ox43 +-7i7t +-7i8+x06 +-7l +-7o14 +-7o1@ +-7o5# +-7o5g +-7o6- +-7o6. +-7o69 +-7o6b +-7o77i5I +-7o8! +-7o80 +-7s4$ +-7sull +-7t +-7u +-7x03 +-7x04$B +-7x05D4 +-7x26i4s +-7x79 +-7x94 +-7z1 +-7z1D2 +-7z2 +-7{Z1 +-7} +-8 +-8$! +-8$% +-8$5+A +-8$8 +-8$Vx3A +-8$f +-8$n^O +-8$s +-8$w +-8$y +-8'8$I +-8*53 +-8*57 +-8*76 +-8*7Bx62 +-8*8A +-8*BA +-8+2 +-8+4 +-8+6 +-8+9 +-8-0 +-8-3 +-8-8 +-8-8-8 +-8-8-8-8 +-8-9 +-84 +-8@k +-8@u +-8@ux12 +-8D6 +-8D7 +-8DA +-8R7 +-8T4 +-8Z1 +-8Z2 +-8[ +-8[l +-8c +-8i2[ +-8i8Qc +-8l +-8o3b +-8o4b +-8o5d +-8o66 +-8o6b +-8o7f +-8o8_ +-8o9l +-8oB3 +-8q +-8t +-8x04 +-8x12c +-8x16 +-8x25c +-8x61 +-8x62 +-8x91 +-8z2 +-9 +-9$! +-9$5 +-9*01 +-9*56 +-9*98 +-9+0 +-9-0 +-9-4 +-9-7'8 +-9-9 +-9-9-9 +-9-9-9-9 +-9D1 +-9D4Z1 +-9D7 +-9L9 +-9R8 +-9T2 +-9Z1 +-9Z1-6 +-9Z2 +-9^1 +-9^5x64 +-9i6- +-9l +-9o64 +-9o7b +-9s09 +-9s25 +-9s4F +-9s91 +-9s9e +-9u +-9ux24 +-9x02t +-9x15o2* +-9x16^p +-9x17 +-9x25 +-9x35^f +-9x41 +-9x71 +-9x71+3 +-9x92D0 +-9x93$c +-9xA2 +-9z1[ +-9} +-A +-A*A8 +-A+9 +-ALA +-AZ1 +-Ai82 +-Ao93 +-AoB8 +-Ax01 +-Ax35 +-B +-B$3 +-B$9 +-B+A +-B-8 +-B-9 +-B-A +-BD7 +-BZ1 +-Bl +-Bs21 +-Bx28'8 +0 +1 +10 +11 +12 +13 +14 +15 +150 +16 +17 +189 +2 +200 +2401 +243 +256 +285 +3 +4 +5 +52 +553 +6 +60 +6561 +7 +8 +9 +: +@ $sx62 +@ '9 +@ t +@ x49 +@!+5 +@#o88 +@*D3 +@, +@.D6 +@.i5+ +@.t +@0 +@0$$ +@0+6R3 +@0+9 +@0-2 +@0@r +@0CC +@0D6 +@0T2 +@0Z1 +@0^4 +@0c +@0o4Y +@0o4x-7 +@0o8Fx16 +@0s3- +@0s78 +@0x32 +@1 +@1$5 +@1*9Bx92 +@1+4o1@ +@1+6 +@1-5 +@1Z2 +@1Z3^S +@1Z5r +@1^a +@1d*13 +@1l +@1o5- +@1o64 +@1s3; +@1x42 +@1z1x23 +@1z3c +@2 +@2$ +@2$1 +@2$5 +@2+2 +@2T7u +@2^7Z1 +@2^l +@2^n +@2i62u +@2l +@2l$x +@2o2e +@2o94 +@2oB9 +@2x42 +@2x71 +@2z1 +@3 +@3$9 +@3'A +@3*50 +@3-0c +@3Z1s52 +@3Z1z3 +@3i03 +@3i0y +@3o07 +@3se9 +@3z1 +@3z2 +@3z5q +@4 +@4$_ +@4'6 +@4'A +@4-7'9 +@4D5 +@4L3r +@4[ +@4^K +@4d +@4l +@4x31 +@4x35 +@4x61c +@4x63C +@5 +@5$ +@5$7 +@5+2 +@5+8'B +@5D2 +@5R3 +@5T4'8 +@5Z1L2 +@5^9 +@5^G+0 +@5^d +@5^j +@5^l +@5dx62 +@5o1e +@5o3r +@5x12Z3 +@5x25T0 +@5x43 +@6 +@6$! +@6$T'8 +@6'6 +@6*24[ +@6+8 +@6C +@6D4 +@6L2 +@6Z2 +@6i7_ +@6o57 +@6o5> +@6o5j[ +@6t +@6x31 +@7 +@7$2 +@7'9 +@7+1 +@7+6 +@7@D +@7Z2*37 +@7[ +@7i42 +@7o1b +@7o3w +@7p1 +@7s50 +@7x04u +@7x26z1 +@7z1 +@7z4 +@8 +@8'8 +@8+4s0A +@8@v +@8Z2x2A +@8^3 +@8i40 +@8i45C +@8i5V +@8o65 +@8t +@8z2 +@9 +@9$1 +@9'7 +@9D0Z3 +@9L2 +@9L4 +@9L5 +@9R1 +@9Z3 +@9[ +@9c +@9i3- +@9p1 +@9x53 +@9x65$1 +@9x92 +@9z1c +@9z4 +@@^f^7 +@BZ5 +@Do3) +@Dx34 +@Fshr +@Fx13 +@H'6^F +@H@1u +@Il +@Jc +@L[ +@Mi0D +@Mu +@N +@Ox13 +@Qt +@Xx04 +@a +@a$1 +@a$c +@a-3 +@aT0 +@ai7e +@al +@ao1g +@asw0 +@az2 +@az2x03 +@b +@b$Q +@bD1 +@b[z5 +@bcl +@bi0ex04 +@bi52 +@bs7b +@c +@c^O +@ct +@d +@d'3Z5 +@d+2 +@d-0 +@dT3 +@dZ2i2v +@d[ +@di1q +@do6# +@du+1 +@dz3 +@e +@ed +@ei6g'5 +@eo2j +@eo36i3d +@eo7k +@ex12 +@ex72 +@f +@f-2 +@fL4 +@fZ5 +@f[ +@f^# +@fd +@fz1 +@f{Z1 +@g'7 +@g*19x03 +@g*73 +@g+1 +@gC +@gD1 +@gZ2 +@gx05 +@gx61 +@h +@h$4 +@h-2 +@h-3 +@h-7 +@hZ1 +@h[ +@h^a +@h^s +@hi2Z^H +@hi6sD5 +@hlp1 +@ho4g +@hx36 +@hx41 +@hx54 +@hx63 +@i +@i$a +@i'9c +@i*06 +@iD1Z1 +@iD3 +@iR1 +@iZ1 +@ic +@il +@io4e +@itu +@ix36^g +@iz1 +@iz2x26 +@j +@j-0 +@jZ4 +@j^a +@jc +@jx32 +@k +@k*31L0 +@kD3 +@kD5 +@kR1 +@kZ1 +@kZ4t +@k^j +@k^w-1 +@kco3L +@kx46 +@kx53-3 +@kx67 +@l$c +@l'6 +@l'9 +@lT3-1 +@l^f +@li0nt +@li2E +@lx42 +@lz1 +@lz2x07 +@m +@m*27 +@m-1 +@m-4^4 +@mD2 +@mT3o2y +@mT6-2 +@mZ2L2 +@mi0T +@mi0d +@mqz4 +@mx24 +@n +@n$8Z3 +@n+3 +@n-3 +@n-5 +@nZ2 +@n[ +@n^m +@nl+7 +@np1 +@nsbd +@nx56 +@n}i7r +@o +@o$t +@o'4 +@o'7 +@o+6 +@o@i +@o^Z +@oi1s +@oi5z +@ox12 +@ox25 +@oxA2x52 +@o} +@p-2i2l +@p-3 +@px23 +@px31 +@px53 +@q +@r +@r$g +@r'5 +@r+8 +@r-7D3 +@rD2 +@r^$L9 +@r^n +@rl +@ro1s +@rx02Z3 +@rx09 +@rx16x32 +@rx41 +@rx48 +@rx71 +@s +@s*7Ax39 +@sD6 +@s^l +@si1Ho1n +@sl +@ssix +@ssux +@su +@sx07 +@sx35 +@t+3o2t +@t+8 +@t-1 +@t@d +@tR1 +@t^c +@tc$d +@tp1 +@tqx64 +@t} +@u+2[ +@uR4 +@uZ4 +@ul +@uo3c +@uo53 +@ux12 +@uz1 +@v +@v$a +@v'6 +@v+0 +@vZ1$p +@v[ +@vk^w +@vo5g +@vz2x13 +@w[ +@wd +@wx02 +@wz1 +@x +@x[ +@xc +@xx41o2X +@y +@y$rx01 +@y'5R1 +@y^"x05 +@y^G +@y^i +@yi4- +@yo3" +@yx81R8 +@z$! +@z$8 +@z*04[ +@zD5 +@zo43 +@zrx07 +@zx31 +@zx53 +@zz1 +C +C$* +C$0 +C$1 +C$2 +C$5 +C$5z4 +C$7 +C$? +C$E +C$F'8 +C$X +C$a@l +C$f^8 +C$g^9 +C$l +C$lsVu +C$m$? +C$m*15 +C$s +C$x +C'3 +C'5 +C'5u +C'7 +C*05^P +C*41 +C*54 +C*61 +C*71 +C+1 +C+2 +C+4 +C+5 +C+6 +C+7 +C+9x34 +C+Ax53 +C-1 +C-2 +C-4 +C-5 +C-7 +C-9 +C@2o2f +C@g +CCi6Z +CD3 +CD4 +CD5 +CD9-5 +CL1Z1 +CL4 +CL5 +CR0 +CR1 +CR2R8 +CR4 +CT1 +CT3 +CT3sJw +CT3t +CT4 +CT5 +CT7 +CT8 +CT8o1+ +CT9 +CTA +CZ1Z2 +CZ2 +CZ2q +CZ3 +CZ3-5 +CZ3^% +CZ4 +CZ4x38 +CZ5 +C[+6 +C^0 +C^4z2 +C^5 +C^7 +C^G +C^Hi1/ +C^S +C^To1F +C^W +C^X +C^_ +C^a +C^g +C^k +C^l'6 +C^m +C^w +C^y +C^|i3$ +Cc +Cc^9 +Cd +Cdc +Cf +Ci0& +Ci18 +Ci1s +Ci20$a +Ci21 +Ci2I[ +Ci2cr +Ci3-sY| +Ci32'A +Ci3<$E +Ci4P +Ci64 +Ci9v +CiBix37 +Ck +Ck$2 +Cl +ClZ3 +Co0P +Co0R +Co1" +Co17 +Co1K] +Co1Oc +Co1S +Co1Y +Co1a +Co1e +Co1i +Co1o +Co2 +Co2! +Co2( +Co21 +Co2V +Co2a +Co2i +Co2uz3 +Co31 +Co3D +Co3GC +Co3Sz1 +Co3d +Co4! +Co4$ +Co4( +Co4F +Co4b +Co5S +Co60 +Co6: +Co7( +Co77 +Cp1r +Cq +Cr +Cr$h +Cs.n +Cs04 +Cs29 +Cs49 +Cs4K +Cs4b +Cs5PD0 +Cs62 +Cs7?Z1 +Cs8M +CsMz +Csg5 +Csi2 +Csj'*52 +CsjyR5 +CssN +CuD9 +Cx01 +Cx01-5 +Cx02 +Cx03q +Cx04 +Cx04x19 +Cx12 +Cx12^c +Cx15 +Cx25 +Cx31[ +Cx42 +Cx42T3 +Cx48 +Cx51 +Cx52 +Cx53 +Cx73 +Cx92 +Cz1 +Cz1'8 +Cz2 +Cz2o04 +Cz2x36 +Cz3x01 +Cz3x52 +Cz3z2 +Cz4 +C} +D0 +D0$) +D0$+ +D0$D +D0$q +D0$t +D0'B +D0*01} +D0*14 +D0*16 +D0*21 +D0*30t +D0*43 +D0+6 +D0-0z5 +D0@7 +D0@8Z2 +D0@e$& +D0@x +D0D1k +D0L4D1 +D0R0Z5 +D0R2t +D0R4 +D0RA +D0T7x24 +D0Z1 +D0Z1sbj +D0Z2 +D0Z3 +D0^" +D0^/ +D0^G +D0^N +D0^V +D0^u +D0i1 +D0i1V +D0i1h +D0i2j +D0i2m +D0i3m +D0i4o +D0i5Zx3A +D0i5x +D0k +D0kt +D0l +D0o0k +D0o1M +D0o1mz3 +D0o2R +D0o2ex35 +D0o3m +D0o3n +D0o3p +D0o4+ +D0o4e +D0o6W +D0o6g +D0oB2 +D0p1 +D0p1x15 +D0p1x21 +D0p1z5 +D0p2 +D0s30 +D0s30z3 +D0s4C +D0s7b +D0s9A +D0s@# +D0se6 +D0seh +D0sfw +D0skv +D0smd +D0spe +D0u +D0u^E +D0x13 +D0x14 +D0x43 +D0x47 +D0x56 +D0x71 +D0x91c +D0z4 +D0z4o5' +D0} +D0}*54 +D1 +D1$$ +D1$0 +D1$1 +D1$3 +D1$L +D1$^[ +D1$l +D1$m +D1$r +D1$u +D1'6-3 +D1'7 +D1'A +D1*10Z2 +D1*13 +D1*21 +D1+0 +D1+3 +D1+5 +D1@o +D1C +D1D2 +D1D2^I +D1D4 +D1D5 +D1K +D1L0 +D1L1 +D1L2@9 +D1L3 +D1R0 +D1T1 +D1T2 +D1T3 +D1Z1 +D1Z2x54 +D1Z4 +D1^% +D1^0 +D1^2 +D1^4 +D1^5 +D1^7 +D1^;i2P +D1^N +D1^Q +D1^U +D1^b +D1^d +D1^g +D1^p +D1^s +D1^sz2 +D1^t +D1^u +D1^v +D1fr +D1i0/ +D1i0Z-5 +D1i0h +D1i2t +D1i3! +D1i3K +D1i4p +D1i5+ +D1i5nx53 +D1i8yx23 +D1k +D1l +D1o1d +D1o2c +D1o2g +D1o2h +D1o3O +D1o3Y +D1o4?Z1 +D1o5h +D1o79l +D1o7o +D1p1 +D1p1i4- +D1q +D1r{ +D1sds +D1si6 +D1sih +D1sn_ +D1sv[ +D1t +D1u +D1usD4 +D1x24 +D1x27 +D1x72 +D1x91 +D1z1 +D1z2 +D1z4 +D1z4@4 +D2 +D2$$ +D2$$u +D2$+D0 +D2$, +D2$. +D2$0 +D2$1 +D2$; +D2$@ +D2$IZ1 +D2$S +D2$` +D2$f +D2$l +D2$mo5: +D2$o +D2$t +D2$w +D2'6 +D2'7 +D2'A +D2*02 +D2*46 +D2*53 +D2+3 +D2+5i5# +D2-5 +D2-6 +D2@c +D2@ix32 +D2@n +D2C +D2D2 +D2D3 +D2L2 +D2R1 +D2R4 +D2R6 +D2T0 +D2T3 +D2T4 +D2T5 +D2T6 +D2T6sdy +D2Z1p1 +D2Z2 +D2Z4 +D2^, +D2^1 +D2^6 +D2^B +D2^N +D2^ar +D2^f +D2^m +D2c +D2c$N +D2cL3 +D2d +D2di1g +D2do5e +D2i49 +D2i5C +D2i6r +D2i6u +D2i7i +D2l +D2o0: +D2o0D +D2o0l +D2o1l{ +D2o1o +D2o2S +D2o4 +D2o6 +D2o6B +D2o6h +D2o6y +D2o7q +D2p1 +D2s1` +D2s3- +D2sgc +D2sgy +D2sm1 +D2soV +D2suq +D2t +D2tZ3 +D2u +D2u'4 +D2x07 +D2x14Z4 +D2x32z2 +D2x34-1 +D2x45 +D2x53 +D2x73 +D2x84 +D2z1 +D2z1u +D2z2 +D2z4 +D2z4u +D2z5x01 +D2} +D3 +D3$ +D3$* +D3$. +D3$0 +D3$2 +D3$? +D3$H +D3$X +D3$a +D3$b +D3$g +D3$w +D3$x +D3$z +D3'7 +D3'B +D3*34 +D3*4Ax06 +D3*51 +D3*56 +D3*56k +D3+1 +D3+4Z5 +D3+6 +D3+6} +D3+Ax64 +D3-1 +D3-1c +D3-6 +D3-8 +D3@6 +D3@d +D3@j^A +D3@t +D3C$1 +D3D8 +D3DBx07 +D3R0 +D3R2 +D3R3 +D3T3 +D3T5 +D3Z1o1q +D3Z3 +D3Z4^H +D3] +D3^6 +D3^8 +D3^J +D3^O +D3^c +D3^eo2. +D3^i*42 +D3^p +D3^z +D3c +D3csAl +D3d +D3d*30 +D3i0' +D3i0L +D3i0i +D3i2. +D3i24 +D3i3_ +D3i4* +D3i4k +D3i4m +D3i5n +D3k +D3l +D3l$n +D3o0N +D3o0S +D3o0b +D3o0hs!n +D3o13 +D3o1g +D3o1h +D3o1z[ +D3o2_ +D3o33[ +D3o3hd +D3o3jZ2 +D3o55 +D3o5t +D3o6n +D3o71x54 +D3o8ax72 +D3o8i +D3o8y +D3p1 +D3p1+6 +D3q +D3s3 +D3s9D +D3sao +D3sbz +D3sea +D3slWx65 +D3t +D3tZ1 +D3u$4 +D3x32C +D3x41^s +D3x47 +D3x71 +D3xA1D4 +D3xA1x54 +D3z1 +D3z2 +D3z3 +D3z3t +D3z4 +D3z4D1 +D3z5 +D4 +D4$# +D4$$ +D4$&-0 +D4$0 +D4$1 +D4$Q +D4$So1* +D4$` +D4$cc +D4$f +D4$q +D4$u +D4'7 +D4'7C +D4*14 +D4*15 +D4*21T4 +D4*25 +D4*62 +D4*85 +D4+3 +D4+4 +D4+7 +D4+9 +D4-6 +D4-7 +D4-B +D4@h +D4D1$/ +D4D2{ +D4D7 +D4L5 +D4L6 +D4R3 +D4T1 +D4T5 +D4T6 +D4Z1 +D4Z2D0 +D4Z3x32 +D4[$y +D4]o6m +D4^0*20 +D4^A +D4^K +D4^X +D4^Y +D4^p +D4^q +D4^x +D4^z +D4f +D4i20 +D4i3l +D4i4C +D4i6s +D4i7u +D4kL7 +D4l*87 +D4o0b +D4o0g +D4o0m +D4o13 +D4o2b +D4o4 +D4o4/ +D4o4@s9R +D4o4p +D4o4} +D4o5+D4 +D4o5_T0 +D4o5k +D4o7b +D4o7o +D4o83 +D4p1 +D4q +D4r +D4s.? +D4s3v +D4sahK +D4sg +D4sg- +D4sj# +D4sj9^H +D4skD +D4ssx +D4stG +D4sxp +D4t +D4t{ +D4x02 +D4x31Z5 +D4x32Z4 +D4x65 +D4xB1x04 +D4z1x62 +D4z1} +D4z2^h +D4z4i9a +D4{x21 +D4} +D5 +D5$" +D5$1 +D5$1T6 +D5$7 +D5$R +D5$a +D5$i +D5$w +D5'B +D5*12 +D5*24 +D5*41 +D5*45 +D5*46 +D5*57 +D5*65 +D5+6 +D5-1i83 +D5-4 +D5-8 +D5@9z1 +D5@i +D5@k +D5@r +D5D7 +D5DA +D5K*43 +D5K+2 +D5L4 +D5L8 +D5R1 +D5R4 +D5T0 +D5Z2*05 +D5[$z +D5^) +D5^6 +D5^: +D5^J +D5^g +D5^o +D5d +D5i0p +D5i1j +D5i2 +D5i3o-3 +D5i4B +D5i6f +D5i72 +D5i7c +D5l +D5o0- +D5o0H +D5o1a +D5o2_ +D5o3%Z1 +D5o3q +D5o4# +D5o4+ +D5o4l +D5o57R6 +D5o5 +Kz2x23 +Kz3$3 +Kz4 +K{ +K{z2 +K} +K}o5v +K}} +L0$(Z2 +L0$O[ +L0$g +L0$l +L0*13T1 +L0+1 +L0+2 +L0+3o0$ +L0+4o5K +L0-5 +L0-7 +L0L0 +L0L1 +L0L5 +L0R0 +L0T0s67 +L0T2 +L0Z1 +L0Z2Z2 +L0Z5 +L0[o78 +L0^K +L0^f +L0^h +L0^sl +L0^w +L0^z +L0c +L0dx19 +L0i0O +L0i2/$i +L0i60 +L0l'7 +L0o1. +L0o21 +L0o21z1 +L0o2a +L0o4D +L0o56 +L0o5c +L0p1 +L0s6u +L0sdu +L0u +L0x02^A +L0x05$D +L0x12 +L0x14i14 +L0x14u +L0x16 +L0x17 +L0x26 +L0x31 +L0x41 +L0x46 +L0x51 +L0x53 +L0z1 +L0z2 +L0z3i8U +L0{ +L0} +L1 +L1$3R1 +L1$M$d +L1$d +L1$xx19 +L1'3 +L1*15 +L1*62 +L1*79D6 +L1+1 +L1+7 +L1-0 +L1-2 +L1-4 +L1-7 +L1D5'9 +L1R0 +L1R1 +L1R5 +L1T0 +L1Z1+5 +L1Z5x52 +L1[ +L1^Z*45 +L1^o +L1^r*7A +L1i0L +L1i0h +L1i0z +L1i27 +L1i2f +L1i3e +L1i4d +L1o0L +L1o1+ +L1o1ti4b +L1o25 +L1o2n +L1o8`x67 +L1p1o3w +L1qz5 +L1s#U +L1sa3 +L1sw@'6 +L1t +L1x23 +L1x26 +L1x35 +L1x41 +L1x42 +L1x52 +L1z1 +L1z1*58 +L1z3z1 +L1z4^ +L1{ +L1{z4 +L2 +L2$-i4e +L2$7x26 +L2$al +L2'4z3 +L2'5i3d +L2'6 +L2*14$/ +L2*23d +L2*3Ax34 +L2+5 +L2-1 +L2@3 +L2@9 +L2@l +L2@mR3 +L2D1 +L2D3 +L2L4 +L2L7D0 +L2LAx49 +L2R2 +L2R4 +L2T1 +L2Z1 +L2Z2 +L2Z5 +L2^b +L2i2vi2s +L2i3l +L2o6`$8 +L2o7a +L2p1 +L2r +L2r$; +L2s6u +L2s9d +L2sd_C +L2sds +L2t +L2u +L2x02 +L2x02Z1 +L2x38$Q +L2z2 +L2z3 +L2} +L3 +L3$a-1 +L3$q +L3$v[ +L3*32 +L3*35 +L3*79 +L3+0'6 +L3+1 +L3+2$4 +L3+3 +L3+3$l +L3+4 +L3+5 +L3-4 +L3-4$e +L3-5 +L3-6 +L3-8x24 +L3@6 +L3@z +L3C^T +L3D0 +L3Ko3c +L3L1 +L3R3 +L3Z1 +L3Z3 +L3Z4x67 +L3[ +L3^E +L3^H +L3^J +L3c^d +L3d +L3i4; +L3i4k +L3l +L3o0[ +L3o56 +L3sb` +L3sl` +L3slkT0 +L3swjx32 +L3x02 +L3x34Z4 +L3x52 +L3x62 +L3z1 +L3z2saV +L3z4 +L3{ +L3} +L4 +L4$3 +L4'5 +L4'6 +L4*14 +L4*41 +L4+5o49 +L4-6 +L4@0 +L4D0 +L4D3 +L4L4 +L4R0 +L4T1-5 +L4Z1 +L4Z2 +L4Z3 +L4Z4 +L4[ +L4^ax16 +L4^e +L4i0X +L4i2Wo4z +L4i2a +L4l +L4o2a@< +L4r +L4tD2 +L4u +L4u$O +L4x04 +L4x37-3 +L4z1 +L5 +L5$3 +L5$j +L5$n +L5$y +L5'7 +L5*02 +L5*21 +L5*23] +L5*34 +L5*39c +L5+4 +L5-2 +L5-5 +L5@9 +L5D0 +L5L5 +L5R1 +L5R5 +L5Z1 +L5Z1x62 +L5Z2 +L5Z3 +L5^G +L5^G} +L5^d +L5c +L5d +L5i4 +1 +L5i5h +L5i5o +L5i6g +L5l +L5o0W +L5o3 z2 +L5o3d +L5o6k +L5o6s +L5seo +L5sgw +L5st6R5 +L5t +L5x04 +L5x32 +L5x62 +L5z1 +L5{*30 +L5{i5# +L6 +L6$* +L6$2 +L6$6L5 +L6$MT7 +L6$e +L6$h +L6$px17 +L6$x +L6$y +L6'9 +L6*2A +L6*50] +L6+4 +L6+6'9 +L6D3 +L6D5 +L6L7 +L6R3 +L6R6 +L6Z1 +L6Z2 +L6[ +L6^VK +L6^a +L6^u$k +L6o2g +L6o6$ +L6o6x +L6o9!Z2 +L6r +L6s61 +L6tT4 +L6x06 +L6x35$_ +L6x4B +L6x56sm2 +L6x71 +L6x72 +L6z1R0 +L7 +L7$4 +L7$j +L7$k +L7$r +L7$u +L7'8 +L7'9 +L7*03*38 +L7*13 +L7*17 +L7*47 +L7*63 +L7*67 +L7-1 +L7@3 +L7@9[ +L7R7 +L7Z1k +L7c +L7i6d +L7i75 +L7l +L7o07 +L7o6. +L7o6h +L7ri0x +L7sj=} +L7t +L7tT1 +L7x07 +L7x15 +L7x24d +L7x31 +L7x52 +L7x61 +L7x74 +L7x82 +L8 +L8$Ux45 +L8'9 +L8*08 +L8*52 +L8+8 +L8Z2 +L8i2{ +L8i8m +L8s5s +L8sp` +L8x17 +L8x21 +L8x25 +L8x31 +L8x35 +L8x61x05 +L8x92 +L8{ +L8{*78 +L9 +L9D5 +L9Z1 +L9[ +L9^jx58 +L9l +L9x24 +L9x35 +L9x42 +L9x62 +L9x6AZ1 +L9x72 +L9x82u +LA +LA*B5'8 +LAZ4x95 +LAZ5x4A +LAcx25 +LAi7ex85 +LAo4N@3 +LAx05 +LAx3BZ1 +LAx82 +LAz1'8 +LBl'A +LBshqx58 +LBx02 +LBx13x63 +LBx53 +LBx92 +R0 +R0$!*06 +R0$3 +R0$8 +R0$d +R0$m +R0$n +R0$o +R0'1 +R0'3 +R0'4 +R0*06 +R0*08 +R0*09 +R0*37 +R0+1 +R0+3 +R0+3t +R0-6 +R0-7 +R0@d +R0@e +R0C +R0D1i1I +R0D5 +R0D6 +R0K +R0L3 +R0R2 +R0T1*17 +R0Z1 +R0Z2 +R0Z4+1 +R0Z5 +R0[o58 +R0^# +R0^1 +R0^2 +R0^4 +R0^9 +R0^B +R0^D +R0^E +R0^T +R0^g +R0^s +R0^y +R0i0u +R0i1% +R0i15 +R0i16 +R0i1e +R0i2a +R0i4b +R0k*16 +R0l +R0o1 +R0o1L +R0o1r +R0o22 +R0o3$ +R0o5M +R0p1 +R0p2 +R0p5 +R0q +R0r +R0shd +R0u +R0x12$z +R0x12c +R0x13 +R0x24 +R0x26z1 +R0x35 +R0z1 +R0z1D2 +R0z2 +R0z2spt +R0z3 +R0z3C +R0z4 +R0z4+0 +R0z5 +R0z5[ +R0z5x72 +R0} +R0}*38 +R1 +R1$! +R1$$^> +R1$0 +R1$5 +R1$7 +R1$c +R1$u +R1$x*48 +R1'4 +R1'7 +R1*03 +R1*12 +R1+0 +R1+4 +R1-3 +R1-5 +R1-7 +R1@"+3 +R1@d +R1@i +R1C +R1Co0Q +R1D0 +R1D7 +R1L5i2m +R1L8k +R1R0{ +R1R2 +R1R3 +R1R4 +R1Z4 +R1Z4i4% +R1[] +R1] +R1^4 +R1^>i6l +R1^g +R1^p +R1^r +R1c +R1d +R1f +R1i01 +R1i03x49 +R1i1P +R1i3" +R1i5& +R1o07 +R1o0P +R1o0e +R1o1B +R1o2h +R1o3i +R1o4B +R1r +R1s9) +R1se< +R1sedx35 +R1sfn +R1shc +R1sx" +R1t +R1x02x76 +R1x03'5 +R1x23 +R1x28 +R1x42 +R1x53 +R1z2 +R1z3l +R1z4 +R1z5 +R1z5[ +R1}k +R2 +R2$+@6 +R2$N +R2$Z+3 +R2*24 +R2*57x15 +R2*61 +R2*70x39 +R2+1 +R2+3 +R2-9x16 +R2@9 +R2D0 +R2D2^b +R2KZ1 +R2L1 +R2L7 +R2T2 +R2Z2Z5 +R2Z2x19 +R2^ +R2^V +R2^b +R2^d +R2d +R2f +R2i00 +R2i0b +R2i28 +R2l +R2o2n^c +R2o2v +R2o4(s(1 +R2o5o +R2o5v +R2r +R2u +R2x21@p +R2x41 +R2x51 +R2x62 +R2{^7 +R2} +R3 +R3$m +R3$rx3B +R3$v +R3'4^z +R3'6 +R3*30 +R3*40 +R3+1 +R3+5 +R3+6 +R3-4 +R3-4o26 +R3-5 +R3-7 +R3@4t +R3@a +R3D5 +R3D9Z1 +R3K +R3Kd +R3L0 +R3L4 +R3Z1^M +R3Z2 +R3Z4 +R3Z5 +R3[ +R3^0 +R3^6 +R3^Wz1 +R3i1i +R3i3# +R3i4t +R3l*46 +R3o1g +R3o1t +R3o2c +R3o47 +R3p1 +R3q +R3qD6 +R3qx35 +R3s1j +R3sd<$7 +R3t +R3t-4 +R3x21 +R3x32q +R3x54 +R3x73 +R3z1 +R3z2 +R4 +R4$2 +R4$2s7Y +R4$9 +R4$?C +R4$o +R4$v +R4$x +R4'5^l +R4*30 +R4*41 +R4*45R4 +R4*64 +R4*74z2 +R4*87[ +R4+4 +R4+6-5 +R4-5 +R4-5o3o +R4@z+0 +R4D0 +R4D1 +R4D6 +R4D8x23 +R4L0R0 +R4R2 +R4R5 +R4RA +R4T0D2 +R4T5 +R4Z1 +R4Z2 +R4Z2-6 +R4Z3 +R4Z4 +R4Z4D1 +R4^T*03 +R4^Z +R4^_ +R4^e +R4^l +R4d +R4f +R4i0s +R4i2W +R4i2b +R4i2u +R4i3i +R4i45 +R4o0Yi3f +R4o27D0 +R4o2y +R4o59 +R4o7/ +R4oAk{ +R4r +R4s20 +R4s9H +R4smD +R4ss) +R4t +R4x02 +R4x04 +R4x21 +R4x39$r +R4x41@K +R4x51 +R4x53 +R4x56 +R4x57 +R4x63 +R4z1 +R4z3 +R5 +R5$! +R5$-i1( +R5$4 +R5$b +R5$n +R5$v +R5*34 +R5*41Z2 +R5*53 +R5*64x63 +R5*65K +R5+1 +R5+2 +R5-4 +R5@pl +R5D4 +R5K +R5LB +R5R6 +R5T5o64 +R5Z1 +R5Z1x21 +R5Z2 +R5Z3o6> +R5Z4 +R5Z5 +R5[x04 +R5^5i5 +R5^> +R5^_x1B +R5^k +R5^v +R5co36 +R5i1b +R5i2I +R5i2o +R5i5= +R5i5T +R5k +R5l +R5o3Bz2 +R5o3h +R5o6Y$a +R5s1n +R5s1z +R5s2* +R5sd4 +R5se7 +R5sjxz3 +R5st3 +R5st9 +R5u +R5x04 +R5x05 +R5x31 +R5x4As4a +R5x51ssS +R5x63 +R5z1 +R5z1sl2 +R5z1x67 +R5z2 +R5z4x74 +R6 +R6$-r +R6$4 +R6$z +R6*23 +R6*65 +R6*72^N +R6+4 +R6+5 +R6-3 +R6-4*07 +R6-7 +R6@. +R6C*64 +R6D1 +R6D2 +R6D5 +R6L2x62 +R6L6o55 +R6R0 +R6R2 +R6R7 +R6Z1[ +R6Z3 +R6Z4 +R6Z4C +R6[ +R6[$5 +R6^7{ +R6^P +R6^S +R6^p +R6i3a +R6i4Lx32 +R6i52 +R6i6A +R6i74 +R6o1y +R6o3g +R6o4d +R6o5: +R6o5a +R6r +R6sc4 +R6ss8 +R6t +R6uo2M +R6x06 +R6x15 +R6x21{ +R6x24 +R6x36 +R6x41 +R6x75 +R6x76 +R6z2 +R6z2*17 +R6z3x18 +R7 +R7$x +R7'8 +R7*02 +R7*56 +R7*67 +R7*85z1 +R7*97 +R7+8o7V +R7+9 +R7-5 +R7-6 +R7-Ai80 +R7@E +R7@m +R7@n +R7@v +R7Cx05 +R7D3[ +R7T0[ +R7T0z4 +R7T4 +R7Z1 +R7Z2 +R7Z3 +R7[ +R7i2F +R7i6V +R7i75 +R7l +R7o0K +R7o0Ml +R7o6 +R7o6@r +R7o6G +R7o88 +R7qx19 +R7sgs +R7syi +R7t +R7x05 +R7x08z5 +R7x12-0 +R7x14 +R7x23d +R7x34 +R7x41 +R7x43 +R7x61 +R7x81 +R7z1 +R8 +R8$1 +R8$xx72 +R8-5 +R8D1 +R8D8 +R8R7 +R8Z1 +R8i83 +R8o0a +R8o7ex25 +R8o7x +R8x04 +R8x07 +R8x07z3 +R8x16 +R8x17 +R8x25 +R8x25$3 +R8x31 +R8x32 +R8x34 +R8x43x32 +R8x63@8 +R8z2 +R9 +R9$0i2s +R9$9 +R9$yx06 +R9*25 +R9*36 +R9*39 +R9-9 +R9D7 +R9R4 +R9Z1 +R9[ +R9u +R9x02 +R9x08 +R9x14 +R9x19$r +R9x24o68 +R9x25 +RA$0 +RA+1x82 +RAD3x75 +RA[ +RAi9Xx37 +RAx73 +RAx74z1 +RAxA2x16 +RBD8*02 +RBx02 +RBx09 +RBx74 +T0 +T0$+ +T0$6 +T0$9 +T0$D +T0$V +T0$Y +T0$b^P +T0$h +T0$j +T0$k +T0$n +T0$o$s +T0$rs7# +T0$s +T0$x +T0'6 +T0'9 +T0*02 +T0*03 +T0*07x21 +T0*43 +T0*9A +T0+5 +T0+6 +T0+7 +T0-4 +T0D3 +T0D6 +T0D8D5 +T0D9 +T0L3 +T0L4 +T0L7 +T0R5 +T0T2 +T0T3 +T0T5 +T0T9 +T0[t +T0^! +T0^A +T0^D +T0^F +T0^K +T0^S +T0^e +T0d +T0d[ +T0i0? +T0i1O^u +T0i1r +T0i2!k +T0i2d +T0i2p +T0i3: +T0i3m +T0i3s +T0i3u +T0i3y +T0i5H-5 +T0i6_ +T0i7_ +T0i85 +T0i8= +T0o2@i6/ +T0o2B +T0o2M +T0o2S +T0o3L +T0o3v +T0o4O +T0o4r +T0o5q +T0o6r +T0o6s +T0o7 +T0o8C +T0o9A +T0q +T0r*06 +T0s3! +T0sM +T0se4 +T0sgK +T0so +T0spR +T0sr@ +T0st5 +T0std +T0stj +T0t +T0u +T0uo6k +T0x06 +T0x12 +T0x13^1 +T0x16 +T0x17 +T0x31 +T0x47 +T0x63 +T0x73@D +T0x74 +T0z2@0 +T0{ +T1 +T1$' +T1$2Z4 +T1$6 +T1$6x56 +T1$_$W +T1$i +T1$l*63 +T1$qR3 +T1$w +T1'6 +T1'7 +T1'8 +T1'9 +T1*01$n +T1*34o1_ +T1+0 +T1+4 +T1+6 +T1+7 +T1+Bx29 +T1-3 +T1-6l +T1@R +T1D1x35 +T1D4 +T1K +T1T0 +T1T3 +T1T3T5 +T1T3T5T7 +T1T3T5T7T9 +T1T3T5T7T9TB +T1T6 +T1T7 +T1Z1i0S +T1Z4x75 +T1Z5i8) +T1Z5sS7 +T1[ +T1^W +T1^o +T1c +T1d +T1f +T1i0@z2 +T1i3m +T1k +T1kC +T1o0' +T1o2g +T1o2w +T1o4w +T1o6- +T1o75@R +T1r +T1sAP+1 +T1sbN +T1si' +T1sr[^x +T1t +T1x15p2 +T1x42 +T1x54 +T1x57 +T1x89c +T1z1 +T1z5 +T2 +T2$! +T2$2 +T2$bo5& +T2'4 +T2'7 +T2*03 +T2*57 +T2+1 +T2-0 +T2-1 +T2@ax64 +T2CD6 +T2D1^) +T2D7 +T2T4 +T2T5 +T2T6 +T2Z1 +T2]$8 +T2^/c +T2^< +T2^Q +T2^` +T2^w +T2c +T2d +T2f +T2i00*57 +T2i3m +T2i59 +T2k +T2o06i0* +T2o0V +T2o1A'8 +T2o38 +T2o3P +T2o3o +T2o6! +T2o94u +T2r +T2s03 +T2sA8K +T2sx3 +T2t +T2x02 +T2x41o49 +T2x52*52 +T2x57 +T2x62 +T2z1 +T3 +T3$" +T3$1 +T3$4 +T3$D +T3$l +T3$t +T3'5^\ +T3'9 +T3*45^9 +T3+0 +T3-5x63 +T3D0 +T3D6 +T3D7 +T3L0 +T3L3'6 +T3R1x12 +T3T5 +T3T6 +T3T8 +T3Z2 +T3Z3 +T3[ +T3[o3i +T3[x27 +T3^! +T3^% +T3^H +T3^K-0 +T3^oz3 +T3ci4G +T3i3- +T3i3f +T3iBgx17 +T3l +T3o0p +T3o1n^t +T3o2C +T3o3iu +T3o4` +T3o71 +T3p1 +T3qL1 +T3qs7b +T3r +T3s0@ +T3si1 +T3smA +T3sr2 +T3tx27 +T3x12 +T3x43 +T3x53 +T3z2 +T3z2$9 +T3} +T4 +T4$1 +T4$3 +T4$5 +T4$y +T4'8 +T4'A +T4+2 +T4+4 +T4-5 +T4-6 +T4@6 +T4D4'A +T4D5 +T4D7 +T4R4 +T4T3 +T4T5 +T4T6T8 +T4TB +T4Z1 +T4Z2 +T4Z4 +T4Z5 +T4[ +T4^2 +T4i3"+3 +T4i4! +T4i4;^4 +T4k +T4o0H +T4o0R +T4o0n +T4o0s +T4o2s +T4o5i +T4o6t +T4o9x +T4p1 +T4r +T4rz1 +T4s2u +T4s32 +T4s3H +T4s4t +T4sIs +T4sTIR6 +T4sau +T4tr +T4u +T4x02 +T4x31^7 +T4x36 +T4x54 +T4x56u +T4z3 +T5 +T5$3 +T5$9 +T5$G +T5$e +T5$m*13 +T5$p +T5'6 +T5'B +T5*43 +T5*45 +T5*45T1 +T5*52Z3 +T5*67 +T5*71*92 +T5+6 +T5-0 +T5-3 +T5-6 +T5D1 +T5D3s85 +T5D4 +T5K +T5L5 +T5L9x13 +T5T7 +T5Z1 +T5Z2 +T5[ +T5^. +T5^6 +T5^I +T5^[ +T5^e +T5cZ3 +T5i0p +T5i11x23 +T5i6Y +T5kk +T5o0S +T5o1& +T5o2K +T5o4_ +T5o5z +T5p1r +T5s+3 +T5s0+ +T5s2b +T5shn +T5x13 +T5x25u +T5x61 +T5x62 +T5x6A +T5x71 +T5x76 +T5z1l +T5{ +T5} +T6 +T6$9 +T6$T +T6$W +T6$Y +T6$a +T6$t +T6'7 +T6'9 +T6*23 +T6*74c +T6+2o5k +T6-7 +T6@h +T6D1 +T6D8 +T6L2*20 +T6R0 +T6T0 +T6T5 +T6T7 +T6T9 +T6Z1 +T6Z1o0l +T6Z2 +T6Z3 +T6[ +T6^2 +T6^9 +T6^V] +T6cT4 +T6i0@ +T6i0N +T6o0f +T6o2m +T6o3fs4b +T6o53 +T6o56 +T6s7)@l +T6x02 +T6x12 +T6x14 +T6x24T3 +T6x71 +T6x72 +T6x83 +T7 +T7$*Z1 +T7$-$m +T7$0 +T7$3 +T7$7 +T7$_ +T7$i +T7$w[ +T7+6t +T7@8 +T7L6x74 +T7RA +T7T0 +T7T2 +T7T3 +T7T4 +T7T8 +T7^1 +T7^2 +T7^Kz1 +T7cx39 +T7i2V +T7i2z +T7o0= +T7o22 +T7o3k +T7o49 +T7o5xu +T7o5z +T7s 6 +T7s6fs4] +T7sgp +T7sjnu +T7t +T7x05 +T7x05o47 +T7x24 +T8 +T8$1 +T8$dx52 +T8'8 +T8-7D4 +T8D2 +T8D5sKp +T8D6 +T8i4 +T8o04 +T8o11l +T8o9,x62 +T8s1f +T8sdn +T8t +T8x02 +T8x31 +T8x84o7v +T8}T8 +T9 +T9*41 +T9*61 +T9T4 +T9T8 +T9i3' +T9l +T9o7f +T9o8#^v +T9o96[ +T9x13 +T9x14 +T9x23x51 +T9x27 +T9x71$1 +TA +TA'B +TARADB +TAT0 +TAZ3x05 +TAt +TAx02 +TAx25 +TAx53x41 +TAx61t +TB +TB*A1*8B +TBiBRk +TBs, +TBx05 +TBx17i4n +TBx19 +TC +Z1 +Z1$ +Z1$! +Z1$% +Z1$& +Z1$&x52 +Z1$,x54 +Z1$- +Z1$. +Z1$0 +Z1$1 +Z1$1*21 +Z1$2 +Z1$3 +Z1$3i7e +Z1$6 +Z1$7 +Z1$8 +Z1$8x16 +Z1$9 +Z1$=x16 +Z1$A +Z1$D +Z1$Wu +Z1$Xi5' +Z1$b +Z1$c +Z1$e +Z1$g +Z1$j +Z1$k +Z1$l +Z1$n +Z1$o +Z1$o^" +Z1$oi7r +Z1$p +Z1$q +Z1$w +Z1'5-3 +Z1'9+3 +Z1*04 +Z1*06 +Z1*07 +Z1*0A[ +Z1*12*24 +Z1*14$j +Z1*15o3i +Z1*21 +Z1*24 +Z1*25D3 +Z1*31 +Z1*32 +Z1*34 +Z1*35 +Z1*38 +Z1*42 +Z1*48x32 +Z1*50 +Z1*51 +Z1*52 +Z1*52K +Z1*56i5m +Z1*56ssu +Z1*57 +Z1*58 +Z1*59 +Z1*63 +Z1*68 +Z1*68i5< +Z1*69l +Z1*74 +Z1*85 +Z1*85-6 +Z1*97 +Z1*A8 +Z1+0z1 +Z1+1 +Z1+1*31 +Z1+2 +Z1+4 +Z1+5 +Z1+7D4 +Z1+7o0a +Z1+7o5- +Z1+8 +Z1+8o7u +Z1+9 +Z1+9i85 +Z1-0 +Z1-0-0 +Z1-0@t +Z1-0u +Z1-1+7 +Z1-2 +Z1-2L6 +Z1-3 +Z1-4 +Z1-4t +Z1-5 +Z1-6 +Z1-6^* +Z1-A +Z1-A+B +Z1@6-2 +Z1@a +Z1@zx04 +Z1D1R4 +Z1D3+5 +Z1D3T1 +Z1D4 +Z1D5 +Z1D7sUE +Z1L0 +Z1L4x65 +Z1L5o2l +Z1R0o1i +Z1R1 +Z1R2$c +Z1R4 +Z1R6z1 +Z1R7D4 +Z1T1 +Z1T4 +Z1T5 +Z1T5^A +Z1T6sbK +Z1Z1sCk +Z1Z1z1 +Z1Z2x34 +Z1Z4r +Z1Z5 +Z1[ +Z1[i2< +Z1[x31 +Z1^" +Z1^$ +Z1^0 +Z1^2 +Z1^4 +Z1^4D4 +Z1^7*14 +Z1^8 +Z1^9x46 +Z1^B +Z1^D +Z1^P +Z1^U +Z1^W +Z1^X +Z1^\ +Z1^c +Z1^e +Z1^g +Z1^li4b +Z1^n +Z1^o +Z1^p +Z1^q +Z1^s +Z1^v*91 +Z1^| +Z1c +Z1c*73 +Z1c+3 +Z1cD7 +Z1d +Z1dx56 +Z1dx65 +Z1dx75 +Z1fx38 +Z1fx5A +Z1i0\ +Z1i0k +Z1i13D3 +Z1i1e +Z1i1j +Z1i1l +Z1i1p +Z1i2- +Z1i21 +Z1i2Z +Z1i2a +Z1i2c +Z1i2v +Z1i38 +Z1i3: +Z1i3I +Z1i3s +Z1i41 +Z1i43 +Z1i48 +Z1i4K +Z1i4] +Z1i4a[ +Z1i4bx18 +Z1i4ex71 +Z1i4h-3 +Z1i4s +Z1i4t +Z1i4y +Z1i5! +Z1i5- +Z1i56 +Z1i58 +Z1i5= +Z1i5O +Z1i5e +Z1i5p +Z1i5t +Z1i6& +Z1i6/ +Z1i62 +Z1i64 +Z1i69 +Z1i6L +Z1i6e +Z1i6f +Z1i6x +Z1i7% +Z1i71 +Z1i7N +Z1i7R[ +Z1i7mo6M +Z1i7n +Z1i7o +Z1i7r +Z1i7t +Z1i80 +Z1i81 +Z1i88 +Z1i8j +Z1i8v +Z1i8x +Z1i91 +Z1i93 +Z1i9s +Z1iA7 +Z1k +Z1ki3v +Z1l^D +Z1o04 +Z1o07 +Z1o0E +Z1o0F +Z1o0I +Z1o0K +Z1o0] +Z1o0b +Z1o0dx32 +Z1o0qi48 +Z1o0t +Z1o0v +Z1o15$b +Z1o17 +Z1o1Lo1c +Z1o1b +Z1o2A +Z1o2` +Z1o2o +Z1o2s +Z1o2u +Z1o3! +Z1o31 +Z1o39 +Z1o3:x37 +Z1o3n +Z1o3t +Z1o3v +Z1o4! +Z1o4/ +Z1o43l +Z1o44slF +Z1o49 +Z1o4a +Z1o4h +Z1o4n +Z1o5% +Z1o5- +Z1o54 +Z1o59 +Z1o5@ +Z1o5C +Z1o5_ +Z1o5c +Z1o6= +Z1o6F +Z1o6p +Z1o6t +Z1o7,{ +Z1o75 +Z1o7Ez2 +Z1o7e +Z1o7i +Z1o7p +Z1o7z +Z1o80T0 +Z1o9?x46 +Z1o9_ +Z1p1 +Z1p2'A +Z1p2x13 +Z1q +Z1q'9 +Z1r +Z1r*24 +Z1s!T +Z1s0, +Z1s0a +Z1s2- +Z1s2^ +Z1s38 +Z1s3q +Z1s6) +Z1s64 +Z1s8* +Z1s9& +Z1s90 +Z1s@a +Z1sBHD6 +Z1sHW +Z1sa? +Z1sb+ +Z1sca +Z1sdu +Z1se7 +Z1seb +Z1seu +Z1sfjx43 +Z1sjB +Z1sjv +Z1sk +Z1slex71 +Z1smN +Z1sn. +Z1sn5 +Z1snl +Z1so' +Z1soO +Z1sou +Z1srz +Z1ss& +Z1ssB +Z1stb +Z1stn +Z1sua +Z1svb +Z1sxt +Z1syh +Z1sz7 +Z1t +Z1t[ +Z1tr +Z1tx28 +Z1u +Z1u{ +Z1x03 +Z1x05 +Z1x12spu +Z1x13f +Z1x15 +Z1x15sbg +Z1x16 +Z1x16D5 +Z1x17 +Z1x21*01 +Z1x23z3 +Z1x24 +Z1x25t +Z1x27c +Z1x28 +Z1x32 +Z1x32^r +Z1x38 +Z1x42 +Z1x42d +Z1x43 +Z1x46$m +Z1x47 +Z1x52i0Z +Z1x54 +Z1x56 +Z1x57 +Z1x57c +Z1x62 +Z1x64 +Z1x72o48 +Z1x73 +Z1x74 +Z1x85 +Z1x95x42 +Z1xA2x17 +Z1xA3 +Z1xB2 +Z1z1 +Z1z1$s +Z1z1*09 +Z1z1p1 +Z1z2D7 +Z1z3 +Z1z5x25 +Z1{ +Z1{T1 +Z1}o12 +Z2 +Z2$! +Z2$'C +Z2$* +Z2$+ +Z2$. +Z2$.[ +Z2$/ +Z2$1 +Z2$2 +Z2$3 +Z2$4 +Z2$5 +Z2$6 +Z2$7 +Z2$8 +Z2$9 +Z2$9k +Z2$<$3 +Z2$M +Z2$O +Z2$b +Z2$d +Z2$e +Z2$eR5 +Z2$f^h +Z2$h +Z2$ho5[ +Z2$k +Z2$v +Z2$x +Z2$y{ +Z2$z +Z2'4q +Z2'6i4P +Z2'8u +Z2*02 +Z2*05 +Z2*06 +Z2*14 +Z2*15o0( +Z2*16 +Z2*17 +Z2*18*49 +Z2*20x14 +Z2*23 +Z2*24 +Z2*26 +Z2*27 +Z2*30 +Z2*31*21 +Z2*31r +Z2*37 +Z2*38 +Z2*42-5 +Z2*45 +Z2*45k +Z2*47 +Z2*48D4 +Z2*4Ax05 +Z2*50[ +Z2*51 +Z2*53 +Z2*56su% +Z2*63 +Z2*63-5 +Z2*64 +Z2*64o4a +Z2*65 +Z2*67 +Z2*68 +Z2*73Z1 +Z2*74 +Z2*79o70 +Z2*82x37 +Z2*85 +Z2*90$e +Z2*93 +Z2*94 +Z2+0 +Z2+2 +Z2+3 +Z2+4 +Z2+4l +Z2+5 +Z2+6 +Z2+6} +Z2+7 +Z2+7o50 +Z2+8 +Z2+9 +Z2+AD0 +Z2-0 +Z2-2 +Z2-3 +Z2-4 +Z2-4i38 +Z2-6 +Z2-7 +Z2-7L0 +Z2-8 +Z2-9 +Z2-A +Z2-AT0 +Z2@1u +Z2@4 +Z2@5 +Z2@b*74 +Z2C +Z2CZ2 +Z2D1 +Z2D2+7 +Z2D2c +Z2D5 +Z2K +Z2L1 +Z2L2 +Z2L3 +Z2L4^3 +Z2L6 +Z2L9 +Z2R0-0 +Z2R1 +Z2R2u +Z2R3 +Z2R4 +Z2R4{ +Z2R5 +Z2R9 +Z2T0 +Z2T0o8n +Z2T2 +Z2T5 +Z2Z1x48 +Z2Z3 +Z2Z3x45 +Z2Z4r +Z2Z4x75 +Z2[ +Z2[t +Z2^$ +Z2^)*36 +Z2^, +Z2^3 +Z2^5 +Z2^6 +Z2^7x52 +Z2^@ +Z2^A +Z2^H +Z2^V +Z2^Wi3] +Z2^Y +Z2^_ +Z2^a +Z2^j +Z2^l +Z2^q +Z2^t +Z2^u +Z2^v^d +Z2^{o5& +Z2c +Z2c$z +Z2cD1 +Z2cz1 +Z2cz2 +Z2d +Z2i1Lx04 +Z2i1n +Z2i1} +Z2i2G*75 +Z2i3, +Z2i3d +Z2i3w] +Z2i3y +Z2i4- +Z2i4e +Z2i4j] +Z2i5(x27 +Z2i5f +Z2i5r +Z2i5x +Z2i6-+9 +Z2i6. +Z2i60 +Z2i6n +Z2i6x +Z2i78 +Z2i7Y +Z2i7d +Z2i7u +Z2i88 +Z2i8o +Z2i8v +Z2k +Z2k*07 +Z2l +Z2o02R8 +Z2o0D +Z2o0K +Z2o0P +Z2o0_ +Z2o0a +Z2o0d +Z2o0h +Z2o0j +Z2o0o +Z2o0po1] +Z2o1- +Z2o1n +Z2o21 +Z2o29D1 +Z2o2bx01 +Z2o2d +Z2o2m +Z2o2s-7 +Z2o2y +Z2o3 +Z2o30 +Z2o3l +Z2o3u +Z2o3u*10 +Z2o4- +Z2o46 +Z2o4H +Z2o4_ +Z2o4h +Z2o5F +Z2o5L +Z2o5\ +Z2o5b +Z2o5ml +Z2o67 +Z2o68-4 +Z2o6no4* +Z2o70 +Z2o73 +Z2o76 +Z2o7N +Z2o7s +Z2o8# +Z2o8B +Z2o8_ +Z2o8h +Z2o8n +Z2o8o +Z2o8p +Z2o8s +Z2o8t +Z2o9m +Z2oAwx24 +Z2oBhx56 +Z2r +Z2r*46 +Z2rZ2 +Z2r^3 +Z2ri67 +Z2s06 +Z2s0R +Z2s1- +Z2s1t +Z2s1z +Z2s27 +Z2s5+ +Z2s52 +Z2s59 +Z2s5C +Z2s5b +Z2s85 +Z2s9fx31 +Z2s9j +Z2sa? +Z2saI +Z2se7 +Z2sfh +Z2sft +Z2sgx +Z2sgz +Z2shql +Z2shr +Z2shv +Z2si9 +Z2sipx19 +Z2slS +Z2slx +Z2smn +Z2ss+ +Z2ss5 +Z2svwx54 +Z2t +Z2ti5N +Z2u +Z2x02 +Z2x02s8K +Z2x03 +Z2x06 +Z2x08 +Z2x12 +Z2x12Z1 +Z2x12u +Z2x12x23 +Z2x13 +Z2x14^u +Z2x21 +Z2x23 +Z2x25 +Z2x26 +Z2x27 +Z2x28 +Z2x2A +Z2x31 +Z2x32 +Z2x32se# +Z2x35 +Z2x3A +Z2x43$7 +Z2x49 +Z2x49Z4 +Z2x4B +Z2x53[ +Z2x56 +Z2x64 +Z2x72 +Z2x82 +Z2x83 +Z2x84 +Z2x93-A +Z2x94 +Z2x94D7 +Z2x95 +Z2x96 +Z2xB5 +Z2z1 +Z2z1T0 +Z2z1x25 +Z2z1x73 +Z2z2 +Z2{+4 +Z2{o13 +Z2{u +Z3 +Z3$- +Z3$0 +Z3$1 +Z3$1t +Z3$3 +Z3$5 +Z3$7 +Z3$9 +Z3$?x56 +Z3$J[ +Z3$Sx75 +Z3$br +Z3$gx62 +Z3$l +Z3$mx37 +Z3$nT2 +Z3$o*16 +Z3$q +Z3$s+4 +Z3$v +Z3$z +Z3$} +Z3'2$5 +Z3*06 +Z3*0B +Z3*13 +Z3*16 +Z3*25 +Z3*2A +Z3*30 +Z3*34 +Z3*35 +Z3*37 +Z3*38 +Z3*41o3v +Z3*49 +Z3*50 +Z3*54 +Z3*57 +Z3*59x71 +Z3*61 +Z3*63*72 +Z3*65L6 +Z3*68 +Z3*6B +Z3*70 +Z3*73 +Z3*82c +Z3*96D5 +Z3*A0 +Z3+0 +Z3+1 +Z3+2 +Z3+3l +Z3+4 +Z3+5 +Z3+5x6A +Z3+6 +Z3+7 +Z3+9 +Z3+A +Z3-0 +Z3-0x59 +Z3-1 +Z3-1r +Z3-4 +Z3-4o1A +Z3-5 +Z3-6 +Z3-6-9 +Z3-6x76 +Z3-7 +Z3-8 +Z3-9 +Z3-9xB5 +Z3-A +Z3-B +Z3@z+2 +Z3C +Z3Cx02 +Z3D1 +Z3D2 +Z3D3 +Z3D6 +Z3D7 +Z3K +Z3L1 +Z3L3 +Z3L5z1 +Z3L6 +Z3R0 +Z3R0s5p +Z3R1 +Z3R2l +Z3R5 +Z3RA +Z3T0 +Z3T1 +Z3T2 +Z3T2D1 +Z3T3*69 +Z3T3x02 +Z3T6x28 +Z3T7 +Z3TA'9 +Z3TB +Z3Z3*36 +Z3Z3x56 +Z3Z4[ +Z3Z5 +Z3Z5t +Z3[ +Z3[-9 +Z3[D3 +Z3[Z5 +Z3[^u +Z3[{ +Z3] +Z3]i7a +Z3^$} +Z3^0 +Z3^3 +Z3^3t +Z3^8 +Z3^> +Z3^J +Z3^J'7 +Z3^a +Z3^c +Z3^e +Z3^px62 +Z3^r +Z3^x*02 +Z3c +Z3c*40 +Z3cx85 +Z3cz1 +Z3d +Z3i0U +Z3i1+ +Z3i1o +Z3i2B +Z3i2S +Z3i3Q[ +Z3i3p +Z3i43 +Z3i4k*41 +Z3i4k*7B +Z3i6L +Z3i6q +Z3i7x +Z3k +Z3k*42 +Z3kZ1 +Z3k} +Z3l +Z3o0d +Z3o0i +Z3o0j +Z3o0m +Z3o14 +Z3o1U +Z3o2e +Z3o2ll +Z3o2n +Z3o2o +Z3o30 +Z3o3ui45 +Z3o4a +Z3o4l +Z3o4t +Z3o4uD5 +Z3o5. +Z3o5E +Z3o5i +Z3o5o +Z3o5s +Z3o6* +Z3o6,x46 +Z3o6C +Z3o6K +Z3o6k +Z3o6s+7 +Z3o6w +Z3o7o +Z3o92*83 +Z3o9h +Z3o9r +Z3p2 +Z3p3 +Z3r +Z3rx32 +Z3s0u +Z3s1] +Z3s39 +Z3s57[ +Z3s6T +Z3s6l +Z3s7B +Z3s9k +Z3sab +Z3scw] +Z3sdz +Z3sd|x13 +Z3segsvt +Z3sjf+4 +Z3slz +Z3sn+ +Z3soax59 +Z3soe +Z3spb +Z3ssz +Z3stf +Z3su- +Z3sy7 +Z3tx61 +Z3u +Z3u$\ +Z3uo4a +Z3ux01 +Z3x01 +Z3x03$) +Z3x03^; +Z3x04 +Z3x05 +Z3x06s1n +Z3x12x56 +Z3x13-2 +Z3x13^7 +Z3x16z3 +Z3x1B +Z3x23 +Z3x23l +Z3x2A$d +Z3x2B-4 +Z3x31 +Z3x34 +Z3x34^5 +Z3x36 +Z3x4B +Z3x51 +Z3x53 +Z3x53r +Z3x54 +Z3x57sAS +Z3x61 +Z3x63o6f +Z3x65$X +Z3x74 +Z3x75T0 +Z3x79c +Z3x83 +Z3x92 +Z3xA1 +Z3xB2 +Z3xB4 +Z3xB7$1 +Z3z3 +Z3{ +Z3} +Z4 +Z4$1 +Z4$4 +Z4$7 +Z4$9 +Z4$ +[$? +[$@ +[$A +[$B +[$D +[$E +[$L +[$N +[$V+2 +[$X +[$^ +[$` +[$a +[$a*53 +[$b +[$d +[$dz3 +[$f +[$fz4 +[$g +[$i +[$k +[$n +[$nK +[$o +[$o^? +[$r +[$ru +[$s +[$v +[$y +[$} +['4 +['5smj +['6 +['6sJc +['7 +['8 +['8T7 +['8^g +['A +[*02 +[*03 +[*05 +[*09 +[*10 +[*12 +[*16 +[*23 +[*25 +[*31 +[*32 +[*40k +[*50 +[*51*40 +[*53 +[*54+2 +[*64 +[*67 +[*70 +[*73 +[*76 +[*83 +[+0 +[+0z2 +[+1 +[+2 +[+4 +[+9 +[+A +[-0 +[-1 +[-2 +[-2o6k +[-3 +[-4u +[-5} +[-6 +[-7 +[-8 +[-9T0 +[-A +[@0 +[@4 +[@9 +[@B +[@e +[@h +[@i +[C +[Ci5y +[D0z4 +[D1 +[D3R0 +[D4 +[D4$U +[D4d +[K*15 +[L0 +[L1 +[L6 +[R0 +[R1 +[R1i0R +[R2 +[R2Z1 +[R2d +[R3 +[R3Z1 +[R3c +[R3shf +[R5 +[R7 +[T1 +[T2 +[T4 +[T5 +[T8 +[T8+7 +[T8^N +[T8si[ +[Z1 +[Z1o9q +[Z2 +[Z2R8 +[Z2Z5 +[Z2^1 +[Z2i02 +[Z2o4' +[Z3 +[Z3*52 +[Z3o56 +[Z4 +[Z4Z5 +[Z4i0k +[Z4z1 +[Z5 +[Z5o68 +[Z5z1 +[[ +[[ $1 +[[[ +[[[ $1 +[[[[ +[[[[ $1 +[[[[[ +[[[[[c +[[[[c +[[[c +[[c +[[o71 +[[x43 +[^% +[^& +[^- +[^0Z2 +[^= +[^C*31 +[^I-1 +[^L +[^Ll +[^Lx27 +[^O +[^P +[^V'6 +[^X*12 +[^a +[^g +[^g'7 +[^h+2 +[^j +[^p +[^vD1 +[^} +[c +[c$J +[c*31 +[d +[f +[fi4G +[i0Ei0E +[i0Px62 +[i0l +[i0x +[i1# +[i11 +[i15 +[i1G +[i1P +[i1Z +[i1[ +[i1d +[i1e +[i1w +[i1y +[i1z +[i21 +[i2Z +[i2a +[i2j +[i2k +[i2q +[i2x +[i3& +[i3- +[i31 +[i33 +[i39 +[i3GR7 +[i4* +[i4, +[i41D6 +[i45 +[i4= +[i4Hx29 +[i4b +[i4i +[i4l +[i4n +[i4r +[i4vZ1 +[i5 +[i5* +[i5- +[i58 +[i5i +[i5s +[i5y +[i6= +[i6A +[i6_ +[i6fl +[i6i +[i6o +[i7k +[i7p +[i7x +[i8e +[i8g +[i95 +[kR5 +[lT7 +[li1e +[lswn +[o0" +[o0/ +[o04 +[o0> +[o0F +[o0N +[o0S +[o0W +[o0d +[o0l +[o0n +[o0q +[o0z +[o1 +[o1& +[o10 +[o17 +[o1g +[o1ni3A +[o1o +[o1t +[o1y +[o2 +[o23i32 +[o2; +[o2A +[o2G +[o2WC +[o2Y +[o2d +[o2q +[o2t +[o2uZ1 +[o2v +[o2z +[o2}r +[o3 +[o3+ +[o33 +[o3I +[o3J +[o3U +[o3_ +[o3a +[o3c +[o3d +[o3j +[o3l +[o3psgs +[o3r +[o3s +[o3z +[o4 +[o4% +[o4+ +[o41 +[o4WC +[o4j +[o4s +[o4t +[o4tx23 +[o4u +[o4w +[o5) +[o56 +[o5f +[o5g +[o5i +[o5li0r +[o5n +[o5u +[o6 +[o6/ +[o68 +[o6g +[o7H +[o7i +[o7n +[o9> +[oA4} +[p1 +[p1^} +[p1sc2 +[p1x63 +[p2 +[p2x24 +[p3 +[p4 +[p5 +[q +[qo4m +[qx27 +[qx2A +[qz4 +[r +[r*20 +[rz3 +[r} +[s-g +[s07 +[s0p +[s7+ +[s8T +[s9Uo0^ +[sLe +[sWi +[sa@ +[sat +[scb +[sez +[sez$u +[sh1 +[shG +[sj6 +[slt +[snwr +[sqE +[srz +[ss? +[st +[sts +[sv9 +[swL +[sxc +[sz6 +[sz8 +[sz9 +[szp +[t*42 +[tz2 +[t} +[u +[ui2A +[uo5g +[x02z2 +[x12 +[x13$m +[x15 +[x15s6K +[x17 +[x21 +[x21d +[x23sa+ +[x24 +[x24$v +[x25 +[x26 +[x31 +[x32 +[x34 +[x34s4d +[x37x41 +[x41u +[x42 +[x43Z2 +[x45 +[x45$L +[x45z2 +[x51 +[x51o1_ +[x52$z +[x53 +[x64 +[x6A +[x71x05 +[x73 +[x74c +[x93x34 +[z1 +[z1-4 +[z1o2D +[z1z3 +[z2 +[z2^1 +[z2^k +[z2i49 +[z2l +[z3 +[z3*13 +[z3*48 +[z3*79 +[z3R0 +[z3Z2 +[z4 +[z4+5 +[z4} +[z5 +[z5*19 +[z5seb +[z5x67 +[{ +[{*35 +[{D1 +[{Z4 +[{u +[}^K +[}o3u +[}t +] +]$!Z3 +]$+ +]$: +]$C*17 +]$a{ +]$of +]$q^Q +]*10i0c +]*13 +]*13] +]*13z5 +]*16 +]*35 +]*36x43 +]*60 +]*64o5w +]*8Bx63 +]+2*26 +]-1 +]-4 +]-4} +]D0u +]D1f +]D3R0 +]K +]KD5 +]Kp1 +]Kx01 +]Kz2 +]T4 +]Z1^f +]Z2o5- +]Z3 +]Z3i6j +]Z4k +]] +]]] +]]]] +]]]]] +]]]]]c +]]]]c +]]]c +]]c +]^#u +]^( +]^5f +]^7 +]^F +]^ashm +]^nsmk +]^r +]^s +]c +]cD6 +]cT6 +]di4^ +]du +]f +]fx51 +]i00^< +]i26 +]i28*42 +]i2a +]i3'Z2 +]i31 +]i3= +]i3s +]i4_ +]iAh +]o0kz2 +]o1r +]o32Z3 +]o3W +]o3_ +]o3z +]o55d +]o56 +]o5g +]o5l +]o5r +]o5x +]o5yZ1 +]o6g +]p1 +]p2 +]p2x49 +]p2z2 +]q^z +]qd +]r +]rZ5 +]s2oK +]sau +]shW +]shf +]si7k +]sm9 +]snl +]stf +]stw +]uZ1 +]uZ5 +]uo42 +]ur +]uz5 +]x01} +]x02t +]x64+6 +]x71i0Z +]xB8Z3 +]z2 +]z3 +]z3{ +]z4 +]z4$f +]z5 +]z5+2 +]{*56 +]{r +]} +^ +^ $ +^ $Ho2* +^ *20 +^ +3^1 +^ ^ +^ ^-i1$ +^ ^OR1 +^ ^i +^ ^x +^ i1B +^ i2 +^ o4< +^ o5xT1 +^ r +^ s31 +^ x24 +^ z3 +^ z4 +^ z5 +^ } +^! +^!$! +^!$$ +^!$3T6 +^!$As!Q +^!$z +^!*40 +^!+4 +^!@6o36 +^!C +^!Z3{ +^![z3 +^!^1 +^!^\ +^!^ji7i +^!d +^!i4/ +^!i78 +^!ss\ +^!x18 +^!x71 +^!z1 +^!z2 +^!z3*38 +^!z5'A +^" +^"$" +^"$ki4Y +^"'5 +^"Cs1o +^"D4 +^"R3 +^"^\ +^"^j +^"^o] +^"i3p +^"sie$0 +^"x02 +^"x0A$= +^"z3 +^# +^#$# +^#$1 +^#$@ +^#$p +^#*24 +^#*24$1 +^#*30 +^#*57o6" +^#*B7$0 +^#+7 +^#D6 +^#R1 +^#R3^& +^#T2 +^#^)o2f +^#^+ +^#^@ +^#^@^! +^#i1k +^#i2#$j +^#l +^#r +^#scm +^#sgw +^#x52 +^#x61 +^#x75 +^#z1 +^#} +^$ +^$$$ +^$$1 +^$$9 +^$$? +^$*02 +^$+1i3l +^$-5$y +^$^#^@^! +^$^$ +^$^w-5 +^$d +^$i3l +^$o1p +^$o2D +^$p1 +^$qo4i +^$ss$ +^$tZ1 +^$tz3 +^$z4 +^$z5 +^% +^%$/ +^%$g$g +^%*01K +^%*12 +^%+6x52 +^%-1 +^%D2 +^%R4 +^%] +^%^$ +^%^$^#^@^! +^%^O +^%i4M +^%sj8 +^%ti6g +^%z1 +^%z2 +^%z5 +^& +^&$2 +^&$; +^&'6 +^&^#*72 +^&c +^&d +^&i12*58 +^&i68^4 +^&i8j +^&o9| +^&u +^&z2 +^&} +^' +^'@5 +^'R6 +^'Z4 +^'] +^'^<-7 +^'i1H +^'p2 +^'x51 +^'z1o6k +^'z3 +^( +^($#x0B +^($) +^(*25 +^(-0*48 +^(D1 +^(i3) +^(k +^(o7) +^(q +^(q[ +^(r +^(x06z1 +^(} +^) +^)$m +^)*25 +^)L6 +^)T4 +^)Z2 +^)i6ho5_ +^)x23 +^)z1 +^* +^*$* +^*$- +^**31 +^**61$v +^*+1 +^*C +^*D1l +^*K +^*R1 +^*] +^*^* +^*^^ +^*d +^*o4z +^*r +^*ss# +^*x17 +^*x51 +^*z5 +^+ +^+$+ +^+$N +^+$q +^+'3 +^+*13 +^+-4 +^+Z1 +^+Z4D9 +^+^1 +^+^a +^+^f +^+^j +^+d +^+i0m +^+i1/ +^+lq +^+sdmo5( +^+u +^+x13 +^+x23 +^+z1 +^+z2 +^+z5 +^, +^,$, +^,$z'8 +^,*28} +^,^- +^,^0o5a +^,c +^,r +^,z3 +^- +^-$, +^-$- +^-$@ +^-*63^e +^-+5$5 +^--5 +^-C +^-D3 +^-^+ +^-^4 +^-^6 +^-^A +^-^T +^-^_ +^-^b +^-^g +^-^j +^-^p +^-d +^-i1Z +^-l +^-o0wi58 +^-o7v$w +^-s-m +^-u +^-z3 +^-z4 +^-} +^. +^.$? +^.*03$p +^.-1 +^.^, +^.^1 +^.^a +^.^f +^.^t +^.d +^.i0m +^.l +^.lu +^.x16z2 +^.x26 +^.z1 +^.z2 +^.z4 +^/ +^/$/ +^/+0 +^/+2Z1 +^/^7 +^/c +^/d} +^/i1s^P +^/i2c +^/o1$ +^/r +^/x21 +^/z1 +^/z2 +^/z4 +^/z4c +^0 +^0$0 +^0$: +^0$c +^0*05 +^0*20 +^0*32*31 +^0*34 +^0*70 +^0+4 +^0-4 +^0-5 +^0@l +^0L4 +^0R5 +^0T1 +^0T4x24 +^0Z1sh> +^0Z1} +^0^0 +^0^0^0^2 +^0^1 +^0^1^0^2 +^0^2 +^0^3 +^0^4 +^0^5 +^0^6 +^0^6^9^1 +^0^7 +^0^7^9^1 +^0^8 +^0^8^9^1 +^0^9 +^0^9^9^1 +^0^J +^0^L +^0^a +^0^b +^0^c +^0^d +^0^e +^0^f +^0^k +^0^s +^0c +^0cC +^0d +^0i0a +^0k +^0l +^0lZ2 +^0o6- +^0r +^0u'9 +^0x12 +^0x63 +^0z2 +^0z3 +^0z5 +^0} +^0}z2 +^1 +^1$" +^1$* +^1$+ +^1$0 +^1$1 +^1$2 +^1$2$3 +^1$@ +^1'8 +^1'9 +^1*01$0 +^1*06 +^1*10 +^1*15 +^1*28 +^1*32 +^1*36 +^1*50 +^1*64 +^1+8^J +^1-1 +^1-1x65 +^1-3u +^1-9 +^1D4 +^1R8 +^1T5 +^1T7 +^1Z1 +^1Z3 +^1Z4 +^1^! +^1^0 +^1^0^0^2 +^1^1 +^1^2 +^1^3 +^1^4 +^1^5 +^1^6 +^1^6^9^1 +^1^7 +^1^7^9^1 +^1^7i4v +^1^8 +^1^8^9^1 +^1^9 +^1^9^9^1 +^1^a +^1^b +^1^c +^1^d +^1^e +^1^e^h^t +^1^f +^1c +^1d +^1i0r +^1i16 +^1k +^1o1f +^1o1i +^1o20 +^1o3w +^1o4C +^1o4n +^1o5l +^1o63 +^1oA%x76 +^1r*02 +^1s8x +^1x52 +^1x56 +^1x73 +^1z2 +^1z2x68 +^1z3 +^1z3-0 +^1z3} +^1z4 +^1z5 +^1{+5 +^2 +^2$$ +^2$* +^2$2 +^2$Io4q +^2*02z2 +^2*0A +^2*31 +^2*35 +^2*47 +^2*71 +^2+8D2 +^2C +^2D4 +^2D5 +^2R1 +^2Z2 +^2^0 +^2^0^0^2 +^2^1 +^2^1$3 +^2^1$3$4 +^2^1$3$4$5 +^2^2 +^2^3 +^2^4 +^2^5 +^2^6 +^2^6^9^1 +^2^7 +^2^7^9^1 +^2^8 +^2^8^9^1 +^2^9 +^2^9^9^1 +^2^A +^2^L +^2^a +^2^b +^2^c +^2^d +^2^e +^2^f +^2c +^2cD7 +^2d +^2i2K +^2i42 +^2i5d +^2i6a +^2i74t +^2o1M +^2o1Z +^2o42 +^2o4l +^2o7d@7 +^2o8} +^2x26f +^2x53 +^2x59l +^2x85 +^2z2 +^2z5 +^3 +^3$3 +^3$N +^3$j +^3*02 +^3*54 +^3*94'7 +^3-5 +^3-6 +^3@m +^3D5^, +^3R1 +^3Z1 +^3^0 +^3^0^0^2 +^3^1 +^3^2 +^3^2^1 +^3^2^1$3$2$1 +^3^2^1$4$5 +^3^2^1$4$5$6 +^3^3 +^3^4 +^3^5 +^3^6 +^3^6^9^1 +^3^7 +^3^7^9^1 +^3^8 +^3^8^9^1 +^3^9 +^3^9^9^1 +^3^< +^3^R +^3^]^e +^3^a +^3^b +^3^c +^3^d +^3^e +^3^f +^3^wsna +^3c +^3d +^3f^< +^3i0(} +^3i11 +^3i5t +^3i68 +^3l +^3o1G^i +^3o1e +^3o2x +^3r*06 +^3st^ +^3tx74 +^3x12 +^3x14 +^3x23 +^3x36 +^3x37o16 +^3x57 +^3xA5 +^3z2 +^3z4 +^3z5 +^3z5Z1 +^3{T3 +^3}$6 +^4 +^4$! +^4$4 +^4$b +^4$s +^4*14 +^4+8c +^4-8 +^4C +^4K^k +^4T1 +^4^/ +^4^0 +^4^0^0^2 +^4^1 +^4^2 +^4^3 +^4^3^2^1 +^4^4 +^4^5 +^4^6 +^4^6^9^1 +^4^7 +^4^7^9^1 +^4^8 +^4^8^9^1 +^4^9 +^4^9^9^1 +^4^I +^4^a +^4^b +^4^c +^4^d +^4^e +^4^f +^4d +^4i03 +^4i1e +^4i6/ +^4i8;o2& +^4o3x +^4o5? +^4o62 +^4rc +^4sb1 +^4sd +^4t^i +^4uD6 +^4x23 +^4x2A +^4x31 +^4x35 +^4x52u +^4x62 +^4x78 +^4z2 +^4z3 +^4{d +^4} +^5 +^5$1 +^5$4 +^5$5 +^5*31 +^5*40 +^5*41 +^5+1 +^5@3L3 +^5D7 +^5L0$q +^5R2 +^5R3 +^5R6 +^5Z1 +^5^0 +^5^0^0^2 +^5^1 +^5^2 +^5^3 +^5^4 +^5^4^3^2^1 +^5^5 +^5^6 +^5^6^9^1 +^5^7 +^5^7^9^1 +^5^8 +^5^8^9^1 +^5^9 +^5^9^9^1 +^5^9x47 +^5^U +^5^a +^5^b +^5^c +^5^d +^5^e +^5^f +^5d +^5f'9 +^5i0$ +^5i0e +^5i51o3d +^5l +^5o2BZ2 +^5o5F +^5r +^5s!f +^5s4r +^5t +^5x27o3K +^5z1 +^5z1*26 +^5z2 +^5z3 +^5z4^> +^5{ +^6 +^6$2 +^6$6 +^6$k +^6$yi1Y +^6'8 +^6*07 +^6*12 +^6*41c +^6*52 +^6-1 +^6D2 +^6K +^6L1 +^6L3*38 +^6R4 +^6T1 +^6T2 +^6Z1 +^6Z2} +^6Z3 +^6^0 +^6^0^0^2 +^6^1 +^6^2 +^6^3 +^6^4 +^6^5 +^6^5^4^3^2^1 +^6^6 +^6^6^9^1 +^6^7 +^6^7^9^1 +^6^8 +^6^8^9^1 +^6^9 +^6^9^9^1 +^6^a +^6^b +^6^c +^6^d +^6^e +^6^f +^6^o +^6d +^6i1b +^6i3 +^6i42 +^6l +^6o07@5 +^6o3a +^6t +^6t^7 +^6x12 +^6x15 +^6x42^g +^6x56 +^6z1 +^6z2 +^6z5 +^6{ +^6} +^7 +^7$+ +^7$7 +^7$fx53 +^7$h +^7'9 +^7*09 +^7*27 +^7*35 +^7*43 +^7+6 +^7-2 +^7-2$7 +^7-3 +^7@0 +^7L3Z1 +^7R3s80 +^7Z3 +^7Z3t +^7^0 +^7^0^0^2 +^7^1 +^7^2 +^7^3 +^7^4 +^7^5 +^7^6 +^7^6^9^1 +^7^7 +^7^7^9^1 +^7^8 +^7^8^9^1 +^7^9 +^7^9^9^1 +^7^a +^7^b +^7^c +^7^d +^7^e +^7^f +^7c +^7d +^7k +^7o2n +^7o3# +^7q +^7r +^7s2sl +^7s7] +^7sc% +^7tz3 +^7x21 +^7x27 +^7x32 +^7x62 +^7z1o6, +^7z1t +^7z2 +^7z4 +^7z5 +^7{ +^7} +^8 +^8$(*86 +^8$6 +^8$8 +^8$9 +^8$CT6 +^8$I +^8$j +^8$w +^8'7 +^8*41 +^8+1 +^8+3 +^8+7 +^8+8o68 +^8-9 +^8D1c +^8R1 +^8T1 +^8^0 +^8^0^0^2 +^8^1 +^8^2 +^8^3 +^8^4 +^8^5 +^8^6 +^8^6^9^1 +^8^7 +^8^7^9^1 +^8^8 +^8^8^9^1 +^8^9 +^8^9^9^1 +^8^a +^8^b +^8^c +^8^d +^8^e +^8^f +^8^i +^8d +^8i3F +^8i4d +^8k^8 +^8l +^8p1 +^8r +^8sod +^8t +^8x36 +^8x4AZ1 +^8x53 +^8x62 +^8x93 +^8z1 +^8z1@3 +^8z2 +^8z3o7x +^8z4 +^8z5 +^8} +^9 +^9$+ +^9$0 +^9$9 +^9$G +^9$x +^9*24 +^9*53 +^9+7 +^9-2 +^9L1 +^9R5R6 +^9R6i0^ +^9T5 +^9Z1 +^9^# +^9^0 +^9^0^0^2 +^9^1 +^9^2 +^9^3 +^9^4 +^9^5 +^9^6 +^9^6^9^1 +^9^7 +^9^7^9^1 +^9^8 +^9^8^9^1 +^9^9 +^9^9^9^1 +^9^a +^9^b +^9^c +^9^d +^9^e +^9^f +^9c +^9d +^9dz2 +^9i1- +^9i1b +^9i7Hx35 +^9l +^9o3a +^9o5n +^9o6s +^9o70 +^9o87 +^9q+6 +^9t +^9x31 +^9z2 +^9z2D5 +^9z4 +^: +^:$! +^:$h +^:-4t +^:C +^:Ki7T +^:L0 +^:^K +^:^T*27 +^:lr +^:o48 +^:rL2 +^:t +^:z1 +^:z4i4O +^; +^;$2Z1 +^;$; +^;*63 +^;+6Z2 +^;D6 +^;R9 +^;[ +^;^R^0 +^;^s +^;^| +^;c +^;i1> +^;p2x67 +^;soM +^;u +^;xB8x07 +^;z5 +^< +^<$2 +^<$> +^<*74T3 +^<+5+6 +^ +^>$* +^>$1o7X +^>$A +^>*03-3 +^>*15 +^>D3$j +^>D4*13 +^>Z3 +^>Z3+2 +^>Z5x64 +^>^L +^>i6u +^>o71 +^>x01 +^>x82 +^? +^?$t*53 +^?*52 +^?^k +^?i0? +^?i6kx26 +^?l +^?o02 +^?o64 +^?x21 +^?z1-6 +^?z2 +^?z3 +^@ +^@$4 +^@$@ +^@$E$s +^@$e +^@$y +^@'4 +^@'7 +^@+1 +^@-1 +^@Z3x46 +^@^! +^@^!$!$@ +^@^p +^@cZ1 +^@u +^@x15 +^@x71 +^@z1 +^@z1x15 +^@z2 +^A +^A$6 +^A'5 +^A*56 +^A+1 +^A+6 +^AD3 +^AD4 +^AK$M +^AT5 +^AZ1 +^A^? +^A^L +^A^[ +^A^`^v +^A^{o6/ +^Af +^Ai0W +^Al +^Ao01$5 +^Ao1h +^Ao8^ +^AoAa +^At +^Ax21 +^Ax32 +^Ax38 +^Ax63 +^Az1 +^Az2 +^A}^+ +^B +^B$. +^B$` +^B$j +^B+5 +^BZ1 +^B^:z1 +^B^D +^B^V +^B^[T5 +^B^n+1 +^Bd +^Bi0o +^Bo3r +^Bp1 +^Bs52 +^Bu +^Bx04z3 +^Bx32 +^Bx35 +^Bx3B +^Bx42l +^Bx67x04 +^Bz1 +^Bz2 +^C +^C'5 +^C*17-2 +^C*A6 +^C+1 +^C+2 +^CC +^CC*53 +^CZ2 +^C[ +^C] +^C^! +^Ci58 +^Ci63 +^Ci6r +^Co1a +^Co2u +^Co7\ +^Cp1 +^CscK +^Ct +^Cu +^Cx32 +^D +^D$7 +^D$m +^D'5 +^D'6 +^D*37L6 +^D*86 +^D-5 +^D@m +^DR3+4 +^DZ1D4 +^D^Fo1y +^Dd +^Di0O +^Di1j +^Do3n +^Dx43 +^Dx45 +^Dz1 +^Dz2 +^D}R3 +^E +^E*23 +^E*27 +^E*43 +^E-1 +^E-5 +^ED3 +^EZ1sl# +^E^1 +^E^D +^Ei0_i6o +^Ei1l +^Ei5px72 +^Ei6k +^Ek +^Eo1fx45 +^Eo38 +^Eo4e +^Erx06 +^Eu +^Ex06o01 +^Ex51 +^Ez2 +^E} +^F +^F'4z3 +^F*13 +^F*46 +^F-5l +^FD3 +^FT1$x +^Fcx26 +^Fi0B +^Fl +^Fo1l +^Fu +^Fx25 +^Fx28 +^Fz2 +^F} +^G +^G$R +^G+7i7' +^G-4 +^G-7 +^GD3 +^GZ2 +^G^M +^Gi5? +^Gl +^Go5i +^Gp1x58 +^Gu +^Gx57 +^Gx71 +^Gz1 +^Gz1+1 +^Gz2 +^H +^H$! +^H'7 +^H*54 +^H*63 +^H*79L1 +^H+0 +^HT4x56 +^H^C +^H^Dser +^H^R +^Hi5` +^Ho3z +^Ho6O +^Hq*63 +^Hu +^Hx14 +^Hx29 +^Hx35c +^Hx72l +^Hz1 +^H} +^I +^I'6 +^I*56 +^I-4 +^ID4 +^IZ3o5b +^I^+ +^Ii0S +^Ii5_ +^Il +^Io4m +^Io7gz1 +^Ip1x32 +^It +^Iu +^Ix18 +^Ix1B +^Ix27 +^Iz2 +^J +^J$'+3 +^J$0 +^J$w +^J'6 +^J+6 +^J-1 +^JZ1 +^JZ5 +^J^J +^Ji2) +^Jl +^Jo7N +^JuD3 +^Jz2 +^K +^K$k +^K'A +^K-2 +^KD4 +^KL4 +^KT2 +^KZ2 +^KZ2$m +^K^$ +^K^J +^K^T +^Ki03C +^Ki1e +^Ki71 +^Kk +^Kl +^Kl$Y +^Kx13 +^Kx24 +^Kx34 +^Kx42 +^Kz1 +^K}C +^L +^L$4 +^L$8 +^L$T +^L$i +^L*60 +^L+3 +^L-1 +^L@f +^LR7i3( +^L^B +^Lu +^Lx19 +^Lz1 +^L} +^M +^M$! +^M$D +^M*09 +^M*14$j +^M*46 +^M*71 +^M+1 +^M+4 +^M-1 +^M-5 +^MD4 +^MD6 +^MZ2 +^M^A +^M^G +^M^H +^M^W +^Md +^Mi6i +^Msg +^Mt +^Mx13z2 +^Mx18 +^Mx36 +^Mx42 +^Mx43 +^Mx69 +^Mz1 +^N +^N$H +^N$L +^N$h +^N*06x52 +^N+4 +^N^Z +^Ni7[ +^Nl +^No1m +^Np2'5 +^Ns8P+5 +^Nx02$x +^Nx63 +^Nz1 +^N} +^O +^O$4 +^O$i +^O*17 +^O+5 +^O+6 +^OL3*04 +^OT2 +^O^M +^Oi0}z3 +^Oi5! +^Ol +^Op1 +^Ou +^Ox52 +^Ox84 +^Oz2 +^Oz4 +^P +^P$3 +^P$9 +^P$f +^P*42 +^PD7-4 +^PR1 +^PZ2o5| +^P^4 +^P^= +^P^L +^P^M +^Pc +^Pls.y +^Po27sP. +^Po5d +^Po84 +^Px31 +^Pz1 +^P{ +^Q +^Q-2 +^QD0 +^Q^X +^Q^f{ +^Qi10 +^Qi5& +^Qi5I +^Qi6k +^Ql +^Qr +^Qt +^Qu*34 +^Qx16d +^Qx43 +^R +^R$' +^R$R +^R'2p2 +^R*18c +^R*67 +^R@3sRt +^R@z +^RD3 +^RD4 +^RD7 +^RT3 +^RZ1 +^R^D +^Rd +^Rl +^Rq +^Rx02d +^Rx25 +^Rx37 +^Rz1 +^Rz2 +^S +^S$S +^S*34x3A +^S*56L7 +^S+1 +^S+3 +^SC +^SD2 +^SR4 +^SZ1*26 +^SZ2 +^S] +^S^F +^S^J +^S^N +^Si4Sk +^SiA*x06 +^Sp1 +^SqTA +^Sr +^St +^St+8 +^Su +^Sx12 +^Sx14 +^Sx64Z1 +^Sz1 +^Sz2 +^Sz3 +^T +^T$' +^T$) +^T$1 +^T$p +^T'8x41 +^TT1 +^TZ1 +^TZ4-6 +^TZ5 +^T^C +^T^J +^T^Q +^Ti0P +^To0sD5 +^To4n +^To7tiAC +^Tx1B +^Tz1 +^U +^U'3 +^U*35+5 +^UT0 +^Ui63 +^Uk +^Ulx41 +^Uqx65 +^Ut +^Ut^v +^V +^V$R +^V$v +^V$z +^V'5 +^V'8 +^V*15o5T +^V*75^r +^V+3 +^VD4 +^VR1 +^V^= +^V^B +^Vi0i +^Vi1c +^Vx06x45 +^Vx12 +^Vx15 +^Vx31 +^Vx74x05 +^Vz3 +^W +^W$Lo01 +^W'4 +^W*14 +^W*40 +^W*52 +^W*64 +^W-3i77 +^WL3C +^WT1 +^WZ2 +^W^_ +^Wi5j +^Wi8Bx05 +^Wo0q +^Wo19K +^Wp1 +^Wx15 +^Wz1 +^Wz2 +^Wz5 +^W{ +^W} +^X +^X'7 +^X*28 +^X+5 +^X-4 +^XK$2 +^X] +^X^B*4A +^Xi4K +^Xi6r +^Xo1i +^Xo4j^i +^Xu +^Xx13+4 +^Xx31 +^Xz1 +^Y +^Y$s+A +^Y*32 +^Y*64 +^YD2 +^YL0 +^Y^_+4 +^Y^yZ1 +^Yi5f +^Yo2b +^Yo5d +^YslK^y +^Yx23 +^Yz2 +^Yz4 +^Yz5 +^Z +^Z$" +^Z$tz4 +^Z*68 +^Z+3 +^ZL0 +^ZZ4x75 +^Z^B +^Z^M +^Zi4R +^Zi4X +^Zl +^Zp1x14 +^Zsef +^Zx31 +^Zz2 +^Zz3-7 +^[$] +^['8 +^[*01 +^[*30 +^[C +^[L2{ +^[i5X-1 +^[k +^[l +^[o1oo5# +^[o7VZ1 +^[s3[ +^[s[do6a +^[z1L4 +^\ +^\D6 +^\R1 +^\R2o2j +^\Z3 +^\^' +^\o69x04 +^\sr5 +^\x32p1 +^\z1T1 +^\z3 +^\} +^] +^]$: +^]$Ll +^]$[ +^]*27t +^]-2 +^]K +^]L0 +^]t +^]x18 +^]x42 +^]z2 +^^ +^^$i +^^'5 +^^*85*35 +^^+1i6M +^^D2 +^^^Oz1 +^^i64*57 +^^sx! +^^z1 +^^z3 +^_ +^_$3 +^_$6 +^_$Q +^_$_ +^_*32 +^_-1 +^_-6 +^_T1 +^_T4 +^_T6 +^_^\ +^_^_ +^_^a +^_^z +^_d +^_i04 +^_l +^_r +^_x12 +^_x13 +^_z2 +^_z3 +^` +^`$g'6 +^`+0o18 +^`-2 +^`L0 +^`^k +^`i2! +^`o4% +^`o5di2" +^`o6!Z1 +^`q +^`t +^`z1 +^`z2 +^`} +^a +^a$6l +^a$v +^a'B +^a*15 +^a*20 +^a*24 +^a*97 +^aD9 +^aK +^aZ1 +^aZ3 +^aZ3l +^aZ4Z3 +^a^0 +^a^1 +^a^2 +^a^3 +^a^4 +^a^5 +^a^6 +^a^7 +^a^8 +^a^9 +^a^R +^a^V +^a^a +^a^b +^a^c +^a^d +^a^e +^a^f +^a^h +^a^k +^a^n +^a^p +^ad +^ai15 +^ai1; +^ai3. +^ai3l +^ai49 +^ao2i +^ao3z +^ap1 +^ax12 +^ax21 +^ax31 +^ax41 +^ax47 +^ax49 +^ax51o0t +^ax61 +^az1 +^az1} +^az2 +^az3 +^az5 +^a} +^b +^b$* +^b$j*35 +^b'A +^b*24 +^b*30 +^b*64 +^b+1 +^b-2 +^b-3 +^b-5s9l +^b-7 +^bC+6 +^bD4 +^bR8 +^bT1 +^bZ2 +^b^0 +^b^1 +^b^2 +^b^3 +^b^4 +^b^5 +^b^7 +^b^8 +^b^a +^b^b +^b^c +^b^d +^b^e +^b^f +^b^m +^bd +^bi2/o2u +^bo2n +^bo7! +^bo8* +^bs93 +^bsrz +^bx25 +^bx35 +^bx52 +^bx56 +^bz2*56 +^bz3 +^bz3c +^bz4*06 +^b{ +^c +^c$2 +^c$m +^c$z +^c'9 +^c*01+0 +^c*12 +^c*16 +^c*20 +^c*30 +^c*40{ +^c*46 +^c+1 +^c-1 +^c-7r +^cD3 +^cD5 +^cL4 +^cR4 +^cZ3^R +^c^0 +^c^1 +^c^2 +^c^3 +^c^4 +^c^5 +^c^6 +^c^7 +^c^8 +^c^9 +^c^F +^c^a +^c^b +^c^c +^c^d +^c^e +^c^f +^c^g +^c^p +^cc +^ci12 +^ci1j +^ci3t +^ci58z1 +^ci5u +^co0^ +^co5cT1 +^co6< +^cp1 +^cp2 +^ctx32 +^cu +^cx13 +^cx4B +^cx56 +^cx75 +^cx82 +^cz5 +^c{l +^c} +^d +^d$ +^d$4 +^d$D +^d$h +^d*0A +^d*40 +^d*56 +^d-3 +^d-5 +^dC +^dD4 +^dK +^dKi6k +^dL1 +^dT1 +^dZ4 +^d^0 +^d^1 +^d^2 +^d^3 +^d^4 +^d^5 +^d^6 +^d^7 +^d^8 +^d^9 +^d^a +^d^b +^d^c +^d^d +^d^e +^d^f +^d^h +^di0l +^di1l +^di1s +^di31 +^di48 +^di4=x34 +^di8d +^dl^0 +^do2. +^do3sK +^do4h +^do4r +^do64 +^dp1 +^drk +^ds4b +^dsf5 +^dt$C +^dx13 +^dx31 +^dx32 +^dx32Z2 +^dx42 +^dx51 +^dx63-6 +^dz1 +^dz2 +^dz3 +^dz5 +^e +^e$7 +^e$V +^e'8 +^e*16 +^e*25 +^e+3 +^e+6 +^e-9 +^eL2 +^eR7 +^eZ2 +^eZ4+A +^e[Z2 +^e^0 +^e^1 +^e^2 +^e^3 +^e^5 +^e^6 +^e^7 +^e^8 +^e^9 +^e^a +^e^b +^e^c +^e^d +^e^e +^e^f +^e^h^t +^e^h^t^e^v^o^l^i +^e^p +^e^v^o^l^i +^e^w +^ec +^ed +^ei09 +^ei0V +^ei0l +^ei13 +^ei6\*36 +^eo5y +^er +^eud +^ex12 +^ex21 +^ex31 +^ex45 +^ex46 +^ex51 +^ex57 +^ex71 +^ez1 +^ez2 +^e{ +^f +^f$^ +^f$b +^f$r +^f$v +^f$w[ +^f'7 +^f'7$s +^f'A +^f*08 +^f*18 +^f*21 +^f+1 +^f-1^V +^f-5 +^fD7 +^fZ1 +^fZ3 +^f^0 +^f^1 +^f^2 +^f^3 +^f^4 +^f^5 +^f^6 +^f^7 +^f^8 +^f^9 +^f^C +^f^N+7 +^f^V +^f^a +^f^b +^f^c +^f^d +^f^e +^f^f +^fd +^fi10 +^fi14 +^fi2jr +^fl +^fs62 +^fx49 +^fx51 +^fx58o2u +^fx61 +^fx75 +^fz1 +^fz2 +^fz3 +^fz4k +^fz5 +^f{*14 +^g +^g$& +^g$7 +^g$; +^g$s +^g$t +^g'4 +^g'6 +^g*05 +^g*65 +^g-6 +^g-8 +^g@a +^gD4 +^gD8 +^gL1 +^gL2 +^gT1 +^gT3s0v +^gT6i1w +^gZ3 +^g^h +^g^s +^g^w +^gi4g +^gi60^^ +^go52 +^go67 +^go78 +^gp1 +^gsSo +^gsmj +^gt +^gu +^guZ1 +^gx23 +^gx29p1 +^gx31 +^gx32 +^gx36 +^gx49 +^gx52 +^gx59 +^gx5A +^gx65 +^gz3 +^gz4 +^g{Z3 +^h +^h$ +^h$m +^h$pz1 +^h'6 +^h'9 +^h'A +^h*32 +^h+5 +^hD3 +^hD7 +^hZ1 +^hZ2$y +^h^$ +^h^P +^h^P} +^h^a +^h^m +^h^o +^h^r +^hc +^ho1c +^ho23 +^ho2h +^ho2t +^ho2y +^ho4 +^ho5. +^hr +^hsn4*31 +^ht +^hx16 +^hx34 +^hx51 +^hx62 +^hx71 +^hx91 +^hz2 +^hz4 +^h} +^i +^i*01 +^i*03 +^i*37*57 +^i*52*02 +^i*70c +^i-0^l +^i-3 +^i-5 +^i@8 +^iD6K +^iR2 +^iT3z4 +^iT4 +^iZ1 +^iZ2 +^i^M +^i^O +^i^f +^i^g +^i^m +^i^n +^i^s +^i^x +^i^{o6c +^id +^ii0N +^ii3( +^ii8u +^io0LZ3 +^io2:*31 +^io2g +^io4_ +^io57 +^ip1 +^is1l +^isv5 +^isxh +^ix12 +^ix15 +^ix21 +^ix23 +^ix25 +^ix36 +^ix54 +^iz1 +^iz2 +^iz3 +^iz5 +^i} +^j +^j$s +^j$y +^j*24 +^j*41 +^j*54 +^j*59x46 +^j+1 +^j+2 +^jR5o3l +^jZ1i2e +^jZ3 +^j^` +^j^b+2 +^j^r +^jc +^ji0h +^ji2=R1 +^jo4c +^jo51 +^jo8Jx39 +^jp1 +^jrx05 +^juz1 +^jx14 +^jx21 +^jx21T5 +^jx24i09 +^jx25'5 +^jx32 +^jx34 +^jx51 +^jx62 +^jx74+7 +^jz1 +^jz2x38 +^k +^k$$ +^k$a +^k$b +^k$t +^k'4 +^k'7 +^k*06$i +^k*13 +^k*14 +^k*78 +^k+3 +^k+6 +^k@t +^kD6 +^kL4 +^kR3 +^kZ2-3 +^k^" +^k^2 +^k^w +^kd +^ki11 +^ki1i +^ki2c +^ko1u +^ko6u +^ks1a +^ksfF +^kt +^ku +^kx13 +^kx15 +^kx32 +^kx42 +^kx46 +^kx53 +^kz1 +^kz3 +^kz4 +^k} +^l +^l$1 +^l'9 +^l*03 +^l*04 +^l*20 +^l*51 +^l*56 +^l+1 +^l+7+6 +^l-3 +^l-8 +^l@d +^lD2 +^lR8 +^lZ2 +^l] +^l^J +^l^a +^l^k +^l^l^a^4 +^l^o +^l^r +^l^s +^lc +^lcZ3 +^li3l +^li5v +^li7h +^li9n +^lo0c +^lo3 +^lo3o +^lo4h +^lx32 +^lx36 +^lx41 +^lx53 +^lz1 +^lz3 +^m +^m$X +^m$z +^m*04 +^m*06 +^m*08 +^m*34 +^m*53 +^m*63 +^m-2 +^m-4 +^m-7 +^mD4 +^mD5z1 +^mL5 +^mT5$p +^m^S +^m^a^i +^m^k +^m^m +^m^v +^mcx62 +^md +^mi1a +^mi3- +^mi6O +^mo2i +^mo3i +^mo3n +^mo4l +^mo58 +^mo85 +^msrw +^mst% +^mt +^mx12 +^mx13 +^mx15 +^mx24 +^mx31 +^mx32 +^mx58 +^mz2 +^mz3 +^mz4 +^mz5 +^n +^n$1 +^n$D*76 +^n'4 +^n*03 +^n*42Z2 +^n+0$5 +^n+3 +^n-1 +^nD2R1 +^nD4 +^nK +^nL1 +^nR2 +^nZ1 +^n^n +^n^t +^nd +^nf +^ni0b +^ni1d +^ni2^ +^ni4U{ +^nkr +^nl +^no1I +^no5,o6P +^nslo +^nstk +^nt +^nto78 +^nx25 +^nx31 +^nx32 +^nx34$G +^nz1 +^nz2 +^nz2^x +^nz3o9v +^nz5 +^n{Z1 +^o +^o$9o6n +^o$mz2 +^o$p +^o$v +^o'8 +^o*25f +^o*28x2A +^o*30 +^o*58 +^o+1 +^o+6 +^o-3 +^o-6 +^o@o +^oC^t +^oD3 +^oKo5; +^oL0 +^oL7 +^oR2 +^oZ2*10 +^oZ2{ +^o^D +^o^K +^o^^ +^o^c +^o^p +^o^s +^od +^oi1' +^oi1Dr +^oi2Y +^oi3k +^oi44u +^ok'6 +^oo98 +^os1dD4 +^osat +^oslt +^ox12 +^ox28 +^oz1 +^oz1o0G +^oz2 +^oz2o5l +^oz3*64 +^o} +^p +^p$p +^p'5 +^p'A +^p*04o0F +^p*12 +^p*20 +^p*40 +^p+9 +^p-2 +^p-7 +^p@dT2 +^p@m +^pK +^pL3 +^pR6 +^pZ2 +^p^f +^p^m +^pc +^pcz1 +^pi0$r +^pi0R +^pi2Yx36 +^po0ix52 +^po1k +^pp2sfi +^psx- +^pt +^pt^| +^pu +^px15 +^px21 +^px34 +^px52 +^px68 +^pz1 +^pz2 +^pz3 +^p} +^q +^q$2 +^q$N +^q$a +^q'5 +^q*01o0j +^q*14 +^q*57 +^q+1 +^q-3 +^qK +^qR4R4 +^qT5 +^q^g +^q^n +^qc +^qo0 +^qo5C +^qp1 +^qr +^qtx39 +^qx48 +^qz1 +^qz1$4 +^qz2 +^qz2+5 +^qz2T1 +^qz5 +^q} +^r +^r$Y +^r'5 +^r'8 +^r'B +^r*03 +^r*45 +^r*67 +^r+5 +^r-2 +^r@i +^r@k +^rD5 +^rK +^rR0 +^rZ1 +^r^`i1J +^r^x +^ri0D +^ri18 +^ri1t +^ri4f +^ri4y +^ro0ux62 +^ro81 +^rrZ3 +^rsli +^rstm +^ru +^rx16 +^rx16o2x +^rx72x38 +^rx92 +^rz2 +^s +^s$# +^s$9 +^s$b +^s$d +^s'6 +^s'A +^s*15 +^s*23 +^s*41 +^s*42 +^s*62 +^s*65 +^s+2 +^s+3skc +^s+7 +^s+7i3\ +^s-1 +^s-3 +^s@g +^s@t +^sCr +^sD4 +^sD4i38 +^sD6 +^sR3 +^sT5 +^sT6 +^sZ1 +^sZ2x26 +^sZ3 +^s^)-7 +^s^F +^s^L +^s^V +^s^Y +^s^a +^s^c +^s^gu +^si0h +^si1j +^si2a +^si87x49 +^si9y +^sl +^slc +^so2y +^sp1 +^sr +^ssl3 +^sslzz3 +^sspe +^ssr/ +^sx13 +^sx14 +^sx26 +^sx43Z1 +^sx52 +^sx63 +^sx82 +^sz1 +^s} +^t +^t$. +^t$i +^t'5 +^t'7 +^t'8 +^t*04 +^t*15 +^t*23 +^t*34 +^t*65 +^t+1 +^t+3 +^t-1 +^t-2 +^t-6x45 +^t-7+8 +^t@t +^tC +^tZ1 +^tZ3'6 +^t^/ +^t^s +^t^s^1 +^t^u +^td +^tfx08 +^ti0a +^ti5t +^tl +^to14 +^to3R +^to3^ +^tp1 +^tsd +^tsmt*21 +^tt +^tuz2 +^tx12 +^tx13 +^tx24 +^tx37 +^tx43 +^tx45 +^tz1 +^tz5 +^u +^u$+ +^u$2 +^u$4 +^u'A +^u*04 +^u*31 +^u*71 +^uD5 +^u^0 +^u^D +^u^N +^u^S +^u^n +^u^t +^u^y +^ui4P +^ul +^ur +^ux15 +^ux53 +^uz1 +^uz5 +^v +^v$5 +^v'6 +^v'9i8t +^v*27 +^v*31 +^v*54 +^v+2 +^v+7 +^v-1@5 +^v-3 +^v-6 +^v@3 +^vD3 +^vR1 +^v^S +^v^T +^v^u +^v^} +^vd +^vi0d +^vl +^vo2C +^vo48 +^vo9(x56 +^vslr[ +^vx13 +^vx14 +^vx16 +^vx49 +^vx58 +^vx62 +^vz1 +^vz1D2 +^vz2 +^vz4 +^v} +^w +^w$m +^w$w +^w*21 +^w*37 +^w*53 +^w*64^` +^w+4z2 +^w@msc6 +^wD3 +^wL1 +^wR1 +^wR6 +^w^M +^w^_ +^w^t +^w^w +^wd +^wf +^wi1r +^wi7Z +^wo2_ +^wo3I +^wsil +^wsnXx51 +^wto3B +^wx15@x +^wx34 +^wz2 +^wz2*25 +^x +^x$x +^x$y +^x$} +^x'7 +^x'8 +^x*09 +^x*17^k +^x*20 +^x+5 +^x+6s59 +^x-1 +^xD2 +^xD7 +^xR1 +^xZ1 +^x]o1o +^x]} +^x^Xo5v +^x^r +^x^{ +^xi0t +^xi2&z2 +^xi5N +^xk +^xk*35 +^xl +^xo0\i3? +^xo4m +^xp1 +^xsq3 +^xu$q +^xx13 +^xx31 +^xx4B +^xx54 +^xx58 +^xx73 +^xz1 +^xz2 +^xz3 +^xz5 +^x}u +^y +^y$j +^y$y +^y'3 +^y*07i4= +^y*57 +^y+7l +^y-2 +^yL0 +^yZ1 +^yZ1TA +^y^! +^y^T +^y^m +^y^m^4 +^y^m^e^v^o^l^i +^y^o +^y^s +^yi1@ +^yi1n +^yi3_ +^yi5wx13 +^yi6U +^yi8O +^yo1k +^yp1 +^ys5e +^yx32 +^yx41 +^yx49 +^yz1 +^yz2 +^yz5 +^y} +^z +^z$z +^z'9 +^z*13 +^z*53 +^z+6T5 +^z+7 +^z-1 +^z-6 +^z@e +^z@hT8 +^z@t +^zZ1x31 +^z^4 +^z^s +^zi4_ +^zi6T +^zi8z +^zl +^zo6R +^zr +^zx13 +^zx23 +^zx24 +^zx42 +^zx59 +^zz2 +^zz2*23 +^z{ +^z} +^{ +^{$} +^{+0 +^{R0 +^{c +^| +^|$+^Q +^|$ki4p +^|$r +^|T6 +^|T7 +^|z1*50 +^} +^}$bi0< +^}L2^- +^}[*62 +^}^BL2 +^}^O +^}i8, +^}t +^}z4 +c +c $0 $1 +c $1 $2 +c $1 $2 $3 +c T3 +c T4 +c T5 +c T6 +c T7 +c$ +c$! +c$!$1 +c$!$@ +c$!$@$# +c$!d +c$!d] +c$!o4a +c$" +c$# +c$#d +c$$ +c$$d +c$& +c$&d +c$&d] +c$) +c$* +c$*$*^*^* +c$*d +c$*d] +c$+ +c$+d +c$+d] +c$- +c$-d +c$-d] +c$. +c$0 +c$0$0 +c$0$0$0 +c$0$0$1 +c$0$0$7 +c$0$1 +c$0$2 +c$0$3 +c$0$4 +c$0$5 +c$0$6 +c$0$7 +c$0$8 +c$0$9 +c$0$9$8 +c$0$9$8$7 +c$0$9$8$7$6 +c$0$9$8$7$6$5 +c$0d +c$0d] +c$1 +c$1$! +c$1$0 +c$1$1 +c$1$1$1 +c$1$2 +c$1$2$3 +c$1$2$3$4 +c$1$2$3$4$5 +c$1$2$3$4$5$6 +c$1$2$3$a$b$c +c$1$2$a$b +c$1$3 +c$1$4 +c$1$5 +c$1$6 +c$1$7 +c$1$8 +c$1$9 +c$1$9$6$0 +c$1$9$6$1 +c$1$9$6$2 +c$1$9$6$3 +c$1$9$6$4 +c$1$9$6$5 +c$1$9$6$6 +c$1$9$6$7 +c$1$9$6$8 +c$1$9$6$9 +c$1$9$7$0 +c$1$9$7$1 +c$1$9$7$2 +c$1$9$7$3 +c$1$9$7$4 +c$1$9$7$5 +c$1$9$7$6 +c$1$9$7$7 +c$1$9$7$8 +c$1$9$7$9 +c$1$9$8$0 +c$1$9$8$1 +c$1$9$8$2 +c$1$9$8$3 +c$1$9$8$4 +c$1$9$8$5 +c$1$9$8$6 +c$1$9$8$7 +c$1$9$8$8 +c$1$9$8$9 +c$1$9$9$0 +c$1$9$9$1 +c$1$9$9$2 +c$1$9$9$3 +c$1$9$9$4 +c$1$9$9$5 +c$1$9$9$6 +c$1$9$9$7 +c$1$9$9$8 +c$1$9$9$9 +c$1$s$t +c$1d +c$1d] +c$2 +c$2$0 +c$2$0$0$0 +c$2$0$0$1 +c$2$0$0$2 +c$2$0$0$3 +c$2$0$0$4 +c$2$0$0$5 +c$2$0$0$6 +c$2$0$0$7 +c$2$0$0$8 +c$2$0$0$9 +c$2$0$1$0 +c$2$1 +c$2$2 +c$2$2$2 +c$2$3 +c$2$3$4 +c$2$4 +c$2$5 +c$2$6 +c$2$7 +c$2$8 +c$2$9 +c$2$k +c$2$m$e +c$2$u +c$2d +c$2d] +c$2z3 +c$3 +c$3$0 +c$3$1 +c$3$2 +c$3$2$1 +c$3$3 +c$3$3$3 +c$3$4 +c$3$4$5 +c$3$5 +c$3$6 +c$3$7 +c$3$8 +c$3$9 +c$3d +c$3d] +c$4 +c$4$0 +c$4$1 +c$4$2 +c$4$3 +c$4$3$2$1 +c$4$4 +c$4$4$4 +c$4$5 +c$4$5$6 +c$4$6 +c$4$7 +c$4$8 +c$4$9 +c$4$M$e +c$4$U +c$4$a$l$l +c$4$e$v$e$r +c$4$f$r$e$e +c$4$l$i$f$e +c$4$m$e +c$4$u +c$4$u$s +c$4d +c$4d] +c$5 +c$5$0 +c$5$1 +c$5$2 +c$5$3 +c$5$4 +c$5$4$3$2$1 +c$5$5 +c$5$5$5 +c$5$6 +c$5$6$7 +c$5$7 +c$5$8 +c$5$9 +c$5d +c$6 +c$6$0 +c$6$1 +c$6$2 +c$6$3 +c$6$4 +c$6$5 +c$6$5$4$3$2$1 +c$6$6 +c$6$6$6 +c$6$7 +c$6$7$8 +c$6$8 +c$6$9 +c$6d +c$6d] +c$7 +c$7$0 +c$7$1 +c$7$2 +c$7$3 +c$7$4 +c$7$5 +c$7$6 +c$7$7 +c$7$7$7 +c$7$8 +c$7$8$9 +c$7$9 +c$7T3 +c$7d +c$7d] +c$8 +c$8$0 +c$8$1 +c$8$2 +c$8$3 +c$8$4 +c$8$5 +c$8$6 +c$8$7 +c$8$8 +c$8$8$8 +c$8$9 +c$8d +c$8d] +c$9 +c$9$0 +c$9$1 +c$9$2 +c$9$3 +c$9$4 +c$9$5 +c$9$6 +c$9$7 +c$9$8 +c$9$9 +c$9$9$9 +c$9d +c$9d] +c$: +c$:$) +c$; +c$? +c$@ +c$A +c$Bl +c$D +c$G +c$H +c$I +c$L +c$M +c$N +c$R +c$U +c$X +c$Z +c$[ +c$^ +c$_ +c$_d +c$_d] +c$a$b +c$a$b$c +c$e +c$f +c$k +c$l +c$m$e +c$n +c$t +c$u +c$v +c$x +c$x$x$x +c$xc +c$y +c${ +c'3z5 +c'5 +c'7 +c'7Z1 +c'8 +c'9T3 +c'A +c'B +c*21 +c*24T0 +c*25x13 +c*40t +c*46 +c*52+0 +c*58 +c*65o65 +c*68 +c*70 +c*83 +c*8A +c*A8x86 +c+0 +c+2 +c+3 +c+4 +c+5 +c+7 +c+7L3 +c+A +c-0$= +c-1 +c-2 +c-3 +c-3'6 +c-4 +c-4T4 +c-6 +c-7 +c-8 +c-9 +c-B +c@2x14 +c@3 +c@A +c@b +c@f +c@fx23 +c@lx02 +c@m +c@q-5 +cD0D8 +cD1 +cD2 +cD4 +cD5 +cD5@k +cD6 +cD7 +cD7*05 +cD8 +cDA +cDB +cK*14 +cKi1[ +cKp1 +cL0 +cL0^p +cL0l +cL0sl( +cL5 +cL7 +cL7x05 +cR2 +cR3 +cR5z3 +cR6 +cR6C +cR7 +cT1 +cT1$1 +cT1C +cT1T2 +cT1T2T3 +cT1T2T4T5 +cT1T2T4T5T6 +cT1d +cT1f +cT1i1& +cT1i1+ +cT1i1- +cT1i1.i2Ei3. +cT1i1.i2Fi3. +cT1i1.i2Oi3. +cT1i1_ +cT2 +cT2$1 +cT2T4 +cT2T4T6 +cT2T4T6T8 +cT2T4T6T8TA +cT2T4T6T8TATC +cT2d +cT2f +cT2i2& +cT2i2+ +cT2i2- +cT2i2. +cT2i2_ +cT3 +cT3$1 +cT3d +cT3f +cT3i3& +cT3i3+ +cT3i3- +cT3i3. +cT3i3_ +cT4 +cT4$1 +cT4d +cT4i4& +cT4i4+ +cT4i4- +cT4i4. +cT4i4_ +cT5 +cT5$1 +cT5+4 +cT5i5& +cT5i5+ +cT5i5- +cT5i5. +cT5i5_ +cT6 +cT6$1 +cT6+B +cT6i6+ +cT6i6- +cT6i6_ +cT7 +cT7$1 +cT7i7- +cT7i7_ +cT8 +cT8$1 +cT8@s +cT8i8+ +cT8i8- +cT8i8_ +cT9 +cT9$1 +cT9i9+ +cT9i9- +cT9i9. +cT9i9_ +cTA +cTA$1 +cTAiA- +cTB +cTB$1 +cTBiB_ +cZ1$6 +cZ1x61 +cZ2i32 +cZ3 +cZ3x53 +cZ3x83 +c[ +c[K +c[Z1 +c[z3 +c^ +c^! +c^!$! +c^!^1 +c^!d +c^"$" +c^# +c^#$# +c^$ +c^$$$ +c^$^$ +c^& +c^( +c^($) +c^* +c^*$# +c^*$* +c^*^* +c^*d +c^+ +c^+$+ +c^+d +c^- +c^-$- +c^. +c^0 +c^0$0 +c^0^0 +c^0^0^0^2 +c^0^1 +c^0^1^0^2 +c^0^2 +c^0^3 +c^0^4 +c^0^5 +c^0^6 +c^0^6^9^1 +c^0^7 +c^0^7^9^1 +c^0^8 +c^0^8^9^1 +c^0^9 +c^0^9^9^1 +c^1 +c^1$1 +c^1$2 +c^1^! +c^1^0 +c^1^0^0^2 +c^1^1 +c^1^2 +c^1^3 +c^1^4 +c^1^5 +c^1^6 +c^1^6^9^1 +c^1^7 +c^1^7^9^1 +c^1^8 +c^1^8^9^1 +c^1^9 +c^1^9^9^1 +c^1^e^h^T +c^1^e^h^t +c^1d +c^2 +c^2$2 +c^2^0 +c^2^0^0^2 +c^2^1 +c^2^2 +c^2^3 +c^2^4 +c^2^5 +c^2^6 +c^2^6^9^1 +c^2^7 +c^2^7^9^1 +c^2^8 +c^2^8^9^1 +c^2^9 +c^2^9^9^1 +c^2d +c^3 +c^3$3 +c^3^0 +c^3^0^0^2 +c^3^1 +c^3^2 +c^3^2^1 +c^3^3 +c^3^4 +c^3^5 +c^3^6 +c^3^6^9^1 +c^3^7 +c^3^7^9^1 +c^3^8 +c^3^8^9^1 +c^3^9 +c^3^9^9^1 +c^3d +c^4 +c^4$4 +c^4^0 +c^4^0^0^2 +c^4^1 +c^4^2 +c^4^3 +c^4^3^2^1 +c^4^4 +c^4^5 +c^4^6 +c^4^6^9^1 +c^4^7 +c^4^7^9^1 +c^4^8 +c^4^8^9^1 +c^4^9 +c^4^9^9^1 +c^5 +c^5$5 +c^5^0 +c^5^0^0^2 +c^5^1 +c^5^2 +c^5^3 +c^5^4 +c^5^4^3^2^1 +c^5^5 +c^5^6 +c^5^6^9^1 +c^5^7 +c^5^7^9^1 +c^5^8 +c^5^8^9^1 +c^5^9 +c^5^9^9^1 +c^5d +c^6 +c^6$6 +c^6^0 +c^6^0^0^2 +c^6^1 +c^6^2 +c^6^3 +c^6^4 +c^6^5 +c^6^5^4^3^2^1 +c^6^6 +c^6^6^9^1 +c^6^7 +c^6^7^9^1 +c^6^8 +c^6^8^9^1 +c^6^9 +c^6^9^9^1 +c^6d +c^7 +c^7$7 +c^7^0 +c^7^0^0^2 +c^7^1 +c^7^2 +c^7^3 +c^7^4 +c^7^5 +c^7^6 +c^7^6^9^1 +c^7^7 +c^7^7^9^1 +c^7^8 +c^7^8^9^1 +c^7^9 +c^7^9^9^1 +c^8 +c^8$8 +c^8^0 +c^8^0^0^2 +c^8^1 +c^8^2 +c^8^3 +c^8^4 +c^8^5 +c^8^6 +c^8^6^9^1 +c^8^7 +c^8^7^9^1 +c^8^8 +c^8^8^9^1 +c^8^9 +c^8^9^9^1 +c^8d +c^9 +c^9$9 +c^9^0 +c^9^0^0^2 +c^9^1 +c^9^2 +c^9^3 +c^9^4 +c^9^5 +c^9^6 +c^9^6^9^1 +c^9^7 +c^9^7^9^1 +c^9^8 +c^9^8^9^1 +c^9^9 +c^9^9^9^1 +c^9d +c^;*4A +c^< +c^<$> +c^=$= +c^? +c^@ +c^@$@ +c^A +c^B +c^C +c^D +c^F +c^G +c^H +c^I +c^IT0 +c^J +c^K +c^L +c^M +c^Q +c^S +c^V +c^[ +c^[$] +c^_ +c^_$_ +c^`D4 +c^a +c^af +c^c^R +c^e^h^T +c^e^h^t +c^e^v^o^l^I +c^e^v^o^l^i +c^f +c^k^2 +c^l +c^l^l^a^4 +c^m^a^I +c^m^a^i +c^r} +c^t^s^1 +c^tz3 +c^u +c^y^M +c^y^m +c^y^m^4 +c^z +c^{$} +cc +ccsiu +cd +ci0! +ci09 +ci0: +ci0M +ci0` +ci0r +ci1! +ci1# +ci1$ +ci1% +ci1& +ci1' +ci1* +ci1+ +ci1- +ci1. +ci10 +ci10T2 +ci10i31 +ci10i31i52 +ci10i31i52i73 +ci11 +ci11T2 +ci11i31 +ci11i31i51 +ci11i31i51i71 +ci11i31i51i71i91 +ci11i31i51i71i91iB1 +ci11i32 +ci11i32i53 +ci11i32i53i74 +ci11i32i53i74i95 +ci11i32i53i74i95iB6 +ci11i32i53i74i95iB6iD7 +ci12 +ci12T2 +ci13 +ci13T2 +ci14 +ci14T2 +ci15 +ci15T2 +ci16 +ci16T2 +ci17 +ci17T2 +ci18 +ci18T2 +ci19 +ci19T2 +ci1F +ci1R +ci1W +ci1_ +ci1a +ci1c +ci1e +ci1h +ci1i +ci1o +ci1u +ci2! +ci2# +ci2$ +ci2& +ci2' +ci2* +ci2+ +ci2- +ci2. +ci2/ +ci20 +ci20T3 +ci21 +ci21T3 +ci22 +ci22T3 +ci23 +ci23T3 +ci24 +ci24T3 +ci25 +ci26 +ci26T3 +ci27 +ci27T3 +ci28 +ci28T3 +ci29 +ci2_ +ci2a +ci2e +ci2o +ci2u +ci3 +ci3! +ci3"^' +ci3# +ci3$ +ci3& +ci3' +ci3* +ci3+ +ci3- +ci3. +ci3/ +ci30 +ci30T4 +ci31 +ci31T4 +ci32 +ci32T4 +ci33 +ci33T4 +ci34 +ci34T4 +ci35 +ci35T4 +ci36 +ci36T4 +ci37 +ci37T4 +ci38 +ci38T4 +ci39 +ci3: +ci3@ +ci3C +ci3H +ci3L +ci3_ +ci3a +ci3e +ci3i +ci3o +ci3u +ci4 +ci4! +ci4# +ci4$ +ci4& +ci4' +ci4* +ci4+ +ci4- +ci4. +ci40 +ci40T5 +ci41 +ci41T5 +ci42 +ci42T5 +ci43 +ci43T5 +ci44 +ci44T5 +ci45 +ci45T5 +ci46 +ci46T5 +ci47 +ci47T5 +ci48 +ci48T5 +ci49 +ci49T5 +ci4@ +ci4_ +ci4a +ci4b +ci4e +ci4j +ci4m +ci4o +ci4u +ci5 +ci5! +ci5# +ci5$ +ci5& +ci5' +ci5* +ci5+ +ci5, +ci5- +ci5. +ci5/ +ci50 +ci50T6 +ci51 +ci51T6 +ci52 +ci52T6 +ci53 +ci53T6 +ci54 +ci54T6 +ci55 +ci55T6 +ci56 +ci56T6 +ci57 +ci57T6 +ci58 +ci58T6 +ci59 +ci59T6 +ci5K +ci5M +ci5_ +ci5a +ci5e +ci5g +ci5o +ci5p +ci5r +ci5s +ci5u +ci6! +ci6# +ci6$ +ci6& +ci6' +ci6* +ci6+ +ci6- +ci6. +ci60 +ci61 +ci61T7 +ci62 +ci62T7 +ci63 +ci63T7 +ci64 +ci64T7 +ci65 +ci65T7 +ci66 +ci66T7 +ci67 +ci67T7 +ci68 +ci69 +ci6@ +ci6C +ci6R +ci6W +ci6_ +ci6a +ci6b +ci6e +ci6h +ci6o +ci6u +ci7! +ci7# +ci7$ +ci7& +ci7' +ci7* +ci7+ +ci7- +ci7. +ci70 +ci71 +ci72 +ci73 +ci74 +ci75 +ci76 +ci77 +ci78 +ci79 +ci7@ +ci7_ +ci7a +ci7e +ci7o +ci7u +ci8 +ci8! +ci8# +ci8$ +ci8& +ci8* +ci8+ +ci8- +ci80 +ci81 +ci82 +ci83 +ci84 +ci85 +ci86 +ci87 +ci88 +ci89 +ci8_ +ci8a +ci8e +ci8i +ci8o +ci8r +ci8u +ciA2 +ck +ck*16 +cl +clL4 +co06 +co0? +co0k +co0p +co0r +co0t +co0v +co0y +co1! +co1# +co1$ +co1* +co1+ +co1- +co1. +co10 +co11 +co12 +co13 +co14 +co15 +co16 +co17 +co18 +co19 +co1@ +co1A +co1T +co1V +co1_ +co1a +co1e +co1l +co1m +co1v +co1y +co2! +co2# +co2$ +co2& +co2* +co2+ +co2- +co20 +co21 +co22 +co23 +co24 +co25 +co26 +co27 +co28 +co29 +co2@ +co2L +co2_ +co2n +co2y +co3! +co3# +co3$ +co3% +co3& +co3* +co3+ +co3, +co3- +co30 +co31 +co32 +co33 +co34 +co35 +co36 +co37 +co38 +co39 +co3@ +co3R +co3S +co3_ +co3c +co3m +co4! +co4# +co4$ +co4& +co4* +co4+ +co4- +co4. +co40 +co41 +co42 +co43 +co44 +co45 +co46 +co47 +co48 +co49 +co4@ +co4N +co4O +co4S +co4V +co4W +co4_ +co4l +co4w +co5! +co5!x74 +co5# +co5$ +co5& +co5* +co5+ +co5- +co5. +co50 +co51 +co52 +co53 +co54 +co55 +co56 +co57 +co58 +co59 +co5@ +co5F +co5J +co5W +co5X +co5_ +co5a +co6! +co6# +co6$ +co6& +co6* +co6+ +co6+i1s +co6- +co6. +co60 +co61 +co62 +co63 +co64 +co65 +co66 +co67 +co68 +co69 +co6@ +co6M +co6T +co6W +co6_ +co6e +co6o +co6q +co7! +co7# +co7$ +co7& +co7* +co7+ +co7- +co7. +co70 +co71 +co72 +co73 +co74 +co75 +co76 +co77 +co78 +co79 +co7? +co7@ +co7M +co7S +co7V +co7_ +co7e +co7o +co7r +co8! +co8# +co8$ +co8& +co8* +co8+ +co8+R7 +co8- +co8/ +co80 +co81 +co82 +co83 +co84 +co85 +co86 +co87 +co88 +co89 +co8H +co8S +co8_ +co8o +co9! +co9# +co9$ +co9* +co9+ +co9- +co90 +co91 +co92 +co93 +co94 +co95 +co96 +co97 +co98 +co99 +co9V +co9_ +coA.x25 +coA4 +coA6 +coAm +cp1 +cp3 +cp3'8 +cp4 +cp5 +cq +cr +cs$2 +cs0# +cs0I +cs0oZ5 +cs1, +cs10 +cs2* +cs2I +cs2m +cs4K +cs8! +cs87x43 +csGI +csa4 +csa4$! +csa4d +csa@ +csa@$! +csa@T4 +csa@T5 +csa@T6 +csa@d +csa@se3 +csa@se3si1 +csa@se3ss$ +csa@si! +csa@si1 +csa@si1ss$ +csa@sl1 +csa@so0 +csa@so0se3 +csa@so0si! +csa@so0si1 +csa@so0ss$ +csa@ss$ +csaw +csb1 +csb5$! +csb8 +csb8$! +csb8d +csd1 +cse3 +cse3$! +cse3T1 +cse3T2 +cse3T3 +cse3T4 +cse3T5 +cse3T6 +cse3T7 +cse3d +cse3si! +cse3si!ss$ +cse3si1ss$ +cse3sl1 +cse3ss$ +cseu +csex +csg9 +csg9$! +csgV +csi! +csi!$! +csi!T1 +csi!T2 +csi!T3 +csi!T4 +csi!T5 +csi!T6 +csi!sl1 +csi!ss$ +csi1 +csi1$! +csi1T1 +csi1T2 +csi1T3 +csi1T4 +csi1T5 +csi1T6 +csi1T7 +csi1d +csi1se3 +csi1ss$ +csiU +csiZ +csiu +csl1 +csl1$! +csl1T1 +csl1T2 +csl1T4 +csl1T5 +csl1T6 +csl1T7 +csl1d +cslt +cslz +csnj +cso&c +cso* +cso0 +cso0$! +cso0T1 +cso0T2 +cso0T3 +cso0T4 +cso0T5 +cso0T6 +cso0T7 +cso0d +cso0sa4 +cso0se3 +cso0se3si! +cso0se3si1 +cso0se3ss$ +cso0si! +cso0si!ss$ +cso0si1 +cso0si1ss$ +cso0sl1 +cso0ss$ +cspv +css$ +css$$! +css$T1 +css$T2 +css$T3 +css$T4 +css$T5 +css$T6 +css$T7 +css$d +css$sl1 +css-L7 +css3 +css3$! +css4 +css5 +css5$! +css5d +css5se3 +cssO +cst7 +cst7$! +cstC +csu4 +csu4$! +csu[ +csvz +csx,R5 +csy1 +csy2 +ct +cuZ4 +cx01 +cx02 +cx02L1 +cx03 +cx08 +cx12x28 +cx17$O +cx23 +cx24 +cx25 +cx26 +cx28 +cx31 +cx32 +cx35 +cx35q +cx36 +cx38 +cx41$" +cx43 +cx43$7 +cx52 +cx53 +cx54'7 +cx57 +cx61 +cx64 +cx65 +cx84 +cx85 +cx92 +cxA1 +cxA1x04 +cxA2 +cxB2 +cz1 +cz1$0 +cz1t +cz2 +cz2$2 +cz2$t +cz2o9o +cz2ssR +cz3 +cz3K +cz3^K +cz3x81 +cz4 +cz5x18 +cz5x1B +c{ +c} +d +d$ +d$! +d$# +d$$ +d$& +d$* +d$+ +d$- +d$. +d$0 +d$1 +d$2 +d$3 +d$4 +d$5 +d$6 +d$7 +d$7snb +d$8 +d$9 +d$=} +d$?o1( +d$@ +d$N*13 +d$P +d$Z +d$] +d$_ +d$ax7A +d$c +d$d*58 +d$g +d$h +d$ki31 +d$m +d$n +d$p +d$q +d$t +d$xD0 +d'6L5 +d'8*20 +d'8i2, +d'9 +d'A +d'B +d*03 +d*04'8 +d*05 +d*06 +d*09 +d*14 +d*15x93 +d*16 +d*19*08 +d*20 +d*26 +d*28x13 +d*32 +d*32Z1 +d*3A +d*45 +d*47x58 +d*52 +d*52R4 +d*53 +d*56 +d*57 +d*64 +d*68 +d*68t +d*70 +d*71 +d*74 +d*75 +d*7Bx73 +d*81x63 +d*83x75 +d*87 +d*92D2 +d*96x46 +d*98 +d*A9*53 +d+0 +d+1 +d+1*70 +d+2 +d+3 +d+6 +d+6t +d+7 +d+8 +d+B +d+Bx67 +d-0x92 +d-2 +d-3^ +d-3x92 +d-4 +d-5 +d-6 +d-6K +d-7 +d-A +d@3 +d@a +d@k +d@zt +dCx39 +dD0 +dD1c +dD2] +dD2o4s +dD3 +dD4^; +dD4o4w +dD5[ +dD6 +dD6t +dD7 +dK +dK{ +dL2 +dL2o8g +dL3l +dR0 +dR3i7Q +dR5 +dT0x85 +dT1 +dT2 +dT4D9 +dT5 +dT5^P +dZ1 +dZ1D3 +dZ1^! +dZ2-8 +dZ3 +d[ +d[+1 +d[^? +d[} +d]so" +d^$ +d^% +d^) +d^0 +d^1 +d^4 +d^5 +d^6 +d^7q +d^A-4 +d^C +d^Cx14 +d^T +d^ak +d^b +d^c +d^f +d^s +dc +dcsh1 +dcx58 +dd +dfx9A +di0# +di0m +di0q +di0z +di2m +di3 +di3,x07 +di3o +di3s +di4* +di4, +di44[ +di4b +di4y +di4z +di5 +di5, +di5hD7 +di5m +di5n +di5o +di5p +di5r +di6b +di6s +di6x +di7 +di7a +di7u +di8_ +dk +dkc +dko5- +dkx5A +dl +dlc +dlxB1 +do0! +do06x21 +do0:T1 +do0E +do0H +do0L +do0T +do0c +do0f +do0n +do0p +do0t +do0z +do1C +do1I +do2G +do2O +do2U +do2i +do2iu +do2o[ +do2x +do2| +do3( +do3_ +do3bo3b +do3h +do4@ +do4m +do4y +do5b +do5j +do5n +do5u +do5v +do5w +do6b +do6c +do6t[ +do6u +do6y +do79z4 +do7bc +do7l +do8Yx54 +do8i +do8k +do8o +do93 +do9i +do9vx94 +doBa +doBm +doBx +dr +drx0B +ds04 +ds0f +ds1h +ds2q +ds34x29 +ds5- +ds65C +ds9y +dsam +dsbh +dsby +dseg +dsg0 +dsgd +dsgr +dsh6 +dsir +dsjlx14 +dskz +dslY +dsmp +dspi +dsr3 +dsrw +dstp +dsvt +dsx/ +dt$Q +du +du*42 +dx02 +dx03 +dx04 +dx05 +dx06 +dx07 +dx09 +dx09$e +dx12 +dx12$q +dx13 +dx13t +dx15x63 +dx16 +dx17 +dx18$A +dx21 +dx23 +dx24 +dx25 +dx26 +dx26^R +dx27 +dx28 +dx28^Y +dx29 +dx29$z +dx29C +dx29o6| +dx31 +dx32 +dx32Z1 +dx32o6y +dx34 +dx34$m +dx34p1 +dx34x03 +dx36 +dx37 +dx37k +dx37x92 +dx38 +dx38o0B +dx38x64 +dx41 +dx42 +dx42[ +dx43 +dx45 +dx45$d +dx46 +dx46z1 +dx48 +dx48^. +dx49$L +dx51x12 +dx52 +dx53 +dx54 +dx56 +dx62 +dx62K +dx63 +dx63c +dx69 +dx6As2@ +dx71 +dx72 +dx73 +dx74 +dx75 +dx76 +dx79 +dx7Bs0k +dx81 +dx82 +dx83 +dx83x51 +dx84 +dx85 +dx85x34 +dx8A +dx94 +dx95 +dx96 +dx97 +dxA1 +dxA4 +dxA5 +dxA5x52 +dxA6 +dxA6*93 +dxA7 +dxB4 +dxB8 +dz1r +dz2 +dz3 +dz3Z1 +dz3s*p +dz3x75 +dz4 +dz4$! +dz4i11 +d{ +d}D2 +f +f$1 +f$8 +f$9 +f$F +f$P +f$V +f$a +f$d +f$e +f$ei1Z +f$f +f$go8n +f$gx76 +f$h+0 +f$l +f$m +f$n +f$no3X +f$r*01 +f$t +f$v +f$z +f'7 +f'7z4 +f'8 +f'8i5m +f'9 +f'9@l +f'9x61 +f'A +f'B +f*06x13 +f*15 +f*16 +f*20 +f*21 +f*24 +f*25] +f*31 +f*31$o +f*32$Y +f*36 +f*37 +f*51 +f*51z1 +f*60 +f*67 +f*67f +f*69x6B +f*71 +f*75x54 +f*78 +f*79 +f*86 +f*94 +f*98x27 +f*9B +f*A5'8 +f+0x16 +f+0x29 +f+2 +f+4 +f+6 +f+7 +f+9 +f-4 +f-5 +f-7x7B +f@a +fC +fCL3 +fD0 +fD1x58 +fD2 +fD3 +fD4 +fDB +fK +fKx69 +fL2 +fL3K +fL6K +fR4 +fR6iAA +fR8x29 +fT0x0A +fT4 +fT4D0 +fT6x75 +fT9x08 +fZ1 +fZ2 +fZ4*A3 +fZ5 +f[ +f[x59 +f[x75 +f] +f]*51 +f]x19 +f]x72 +f^5 +f^6x3A +f^8 +f^9 +f^T +f^c +f^h +f^m +f^n +f^o*06 +f^s +f^tx17 +f^x+4 +fc +fcD0 +fd +fi00 +fi01 +fi0v +fi3/ +fi3; +fi40 +fi41 +fi44 +fi5E +fi5n +fi60*35 +fi65 +fi6o +fi90 +fl +fo0l +fo1Q +fo1^ +fo21 +fo2e*53 +fo3P +fo4I +fo5) +fo5hk +fo68 +fr +fr+5 +frC +frD8 +fri4q +fs!g'7 +fs4k +fsnc +fss0 +fswv +fsy< +ft +fu[ +fx02 +fx03 +fx04 +fx05 +fx06 +fx08c +fx0Ad +fx13 +fx13$6 +fx14 +fx15 +fx16 +fx17*0A +fx18 +fx18*50 +fx18{ +fx19 +fx19$S +fx1A +fx23 +fx24 +fx25f +fx26 +fx27 +fx28 +fx2A +fx2B +fx31*31 +fx34 +fx34T0 +fx36 +fx36*25 +fx37 +fx38 +fx38T1 +fx39 +fx3A +fx3Ak +fx3B-2 +fx3Bi0b +fx42 +fx42*40 +fx42z3 +fx43 +fx45 +fx47 +fx47Z2 +fx48 +fx48D8 +fx48sh/ +fx49 +fx4AL5 +fx4B +fx51 +fx52 +fx53 +fx56 +fx57 +fx58 +fx59 +fx59o57 +fx5A +fx5AT0 +fx5Asts +fx5B +fx61 +fx61o3s +fx63 +fx64 +fx64L7 +fx65 +fx65t +fx67 +fx68 +fx69 +fx6A +fx6B +fx73 +fx74 +fx75 +fx75i7l +fx76 +fx78 +fx7A +fx7A+6 +fx7B +fx82 +fx83 +fx85 +fx86 +fx8Ao8a +fx8B +fx91 +fx93 +fx96 +fxA5 +fxA8 +fxB4 +fz1 +fz1'A +fz2 +fz2R1 +fz2x2A +f{ +f{*65 +f{[ +f} +f}x53 +i0 +i0 ^m +i0 l +i0 z2 +i0! +i0!o3t+0 +i0!x81 +i0" +i0# +i0$ +i0$o3s +i0$x46 +i0$z3Z2 +i0% +i0' +i0'^U +i0( +i0($g^B +i0) +i0)i5Fo9z +i0)z2 +i0*$0 +i0+ +i0+$Vo6k +i0+-0xA3 +i0+-3 +i0+x72x24 +i0, +i0,*62 +i0-D6 +i0.u +i0.z3 +i0.} +i0/ +i0/z5 +i00 +i00'4 +i00^d +i00i02 +i00o6m +i00z1 +i00z2i2^ +i01$9 +i01'B +i01TA +i01Z2 +i01c +i01i8o +i01r +i01szt +i01z4z2 +i01{ +i02 +i02$t +i02^l +i02c +i02z2 +i02z4 +i03 +i03K +i03L0 +i04'6 +i04^! +i04o5^ +i05 +i05D3 +i05^! +i05lx65 +i05p1 +i05x31T2 +i06i5t +i06l +i06z5 +i07D5 +i08 +i08x71 +i09+2 +i09^e +i09cR4 +i09x15 +i09z3 +i09} +i0:o2" +i0; +i0;i2xl +i0;i5A +i0<$uo6( +i0Z4 +i0?$! +i0?z2 +i0@*19l +i0@i3q +i0A +i0Ax13 +i0B +i0Bz1 +i0D +i0D^q*14 +i0Dr +i0Dz3 +i0E$J +i0F +i0G*19 +i0G+4 +i0G] +i0Gt +i0Gz1$5 +i0Hu +i0I +i0I+2 +i0Ix53 +i0J +i0J$M +i0J$d +i0Ji3f +i0Ll +i0Lx18d +i0Lx23 +i0M$b +i0Md +i0Mo0?su` +i0Mx71 +i0N*56i3N +i0N^=^i +i0O +i0OD3 +i0O^L +i0O^esk> +i0Ou +i0P +i0PD2 +i0P^E +i0Po1w +i0Q$"o4^ +i0Q$7 +i0Qx26 +i0Qx61^2 +i0R +i0R^W +i0S +i0SD4 +i0T +i0T^Y +i0Tx52 +i0U +i0U$5l +i0Uo4h +i0V +i0V$B +i0Vo6# +i0W +i0Y +i0Z$; +i0Z^* +i0Zz1 +i0\ +i0\$w +i0\p4 +i0]'4 +i0]+0 +i0]o73^[ +i0^z2 +i0_l +i0_s87 +i0`^Lo2I +i0`o8f +i0`r +i0a$r +i0a^K +i0ai7'*48 +i0ao6c +i0at +i0az2 +i0b*17 +i0bD5 +i0bZ1 +i0b^8 +i0bsrs +i0bz3 +i0b} +i0c*23 +i0c-6 +i0c-7 +i0co5m +i0cshk +i0cz3x31 +i0d +i0d$x +i0d+2i4' +i0dR6 +i0dZ3 +i0dZ3x18 +i0d^3 +i0d^7 +i0d^Y*52 +i0do1h +i0dz4 +i0e +i0e*21 +i0e*93x1B +i0e^h +i0esn_ +i0ez3 +i0f +i0f'8 +i0f-1 +i0f^b +i0fo15 +i0fq +i0fs9v +i0fz3x56 +i0g$r +i0g*12 +i0g*16 +i0g*70 +i0gz1 +i0h*15 +i0h*64 +i0h*67 +i0h@5 +i0hZ2 +i0h^d +i0h^e +i0h^r +i0hsli +i0hx48 +i0i +i0j*56l +i0jo0G*57 +i0jz2 +i0k +i0k$e +i0k$o +i0k+4 +i0kD4 +i0k^g +i0lR6$M +i0lsv8 +i0m +i0m*02 +i0m*62 +i0m*70 +i0mi1V +i0n +i0n$so4+ +i0n'A +i0n*49c +i0n^k +i0n^zt +i0ni5Yo7E +i0nxB6x08 +i0o+7xA1 +i0o^N +i0oz1 +i0p*80 +i0p+8 +i0pZ1 +i0qo3g +i0r$T*07 +i0rD6 +i0rl^z +i0rz4 +i0s +i0s$a +i0s*51 +i0s@a +i0sZ2T8 +i0s^X +i0sp1 +i0ss2y^p +i0t +i0t*50 +i0t+2 +i0tx04o2h +i0tz2 +i0u +i0u^c +i0uz5 +i0v'9 +i0v*07 +i0vd +i0vo4w +i0vr +i0w +i0w*30 +i0wl +i0wx23Z5 +i0wx81 +i0x +i0x*0Ax09 +i0x^C*12 +i0xs9u +i0xz3i1? +i0y$0 +i0y$c +i0y@w +i0yr +i0yz1 +i0z +i0zsiVl +i0zx04-8 +i0zz1 +i0{ +i0{K +i0{u +i0| +i0|*52 +i0}'8 +i1 +i1 C +i1 l +i1! +i1!*17 +i1!Z1*42 +i1# +i1#$h +i1$ +i1% +i1%i2U$g +i1& +i1&*46 +i1&r +i1&sso^= +i1' +i1( +i1* +i1*L9'6 +i1*x1Az5 +i1+ +i1, +i1- +i1-] +i1-d +i1-i3- +i1-i3-i5- +i1-i3-i5-i7- +i1-i3-i5-i7-i9- +i1-u +i1-x13p2 +i1. +i1.i3. +i1.i3.$. +i1.i3.i5. +i1.i3.i5.$. +i1.i3.i5.i7. +i1.i3.i5.i7.$. +i1.i3.i5.i7.i9. +i1.i3.i5.i7.i9.$. +i1.sdO +i1/ +i10 +i10d +i10i31 +i10i31i52 +i10i39 +i10r +i10z1 +i11 +i11*14r +i11+5 +i11-1^l +i11-3 +i11T2 +i11^i +i11i22 +i11i22i33 +i11i31 +i11i31i51 +i11i31i51i71 +i11i31i51i71i91 +i11i31i51i71i91iB1 +i11i32 +i11i32i53 +i11i32i53i74 +i11i32i53i74i95 +i11i32i53i74i95iB6 +i11i32i53i74i95iB6iD7 +i11s8T +i12 +i12i0f +i12o62 +i12z3 +i13 +i13*46 +i13T2 +i13^Z +i13i24^2^1 +i13o1S +i14 +i14T2 +i14[ +i14^a +i14i23 +i14t +i15 +i15$d +i15R2 +i15T2 +i15r +i15z1 +i16 +i16R0'9 +i16T2 +i16o21 +i16o2z +i16z2} +i17 +i17$+ +i17$2 +i17C +i18 +i18T2 +i18Z2x35 +i18r +i19 +i19+3 +i19T2 +i19Z1 +i19suv +i19} +i1: +i1:*27 +i1:Z3o8A +i1:sjV +i1; +i1;R5k +i1< +i1<*72$c +i1^r +i1>i3wo91 +i1? +i1?Z3 +i1?o7l +i1?z2 +i1@ +i1@o5C +i1B +i1B*18 +i1C +i1C{ +i1C{D2 +i1D +i1DR0 +i1D{ +i1ED0 +i1E^J +i1Eo8E +i1Er +i1Ez1 +i1F +i1G +i1H +i1Hc +i1Hl +i1Ho9L +i1I +i1J +i1J$e*04 +i1J*78 +i1K +i1Ko1/Z4 +i1L +i1L*91'6 +i1LC +i1L^a +i1Lu[ +i1M +i1M+8R3 +i1N +i1N[ +i1N^w +i1Ni30$6 +i1Nr +i1O +i1O@d +i1Ot +i1Ox28 +i1Oz2 +i1P +i1PZ1 +i1PuR3 +i1P{ +i1Q +i1Q-5k +i1Rl +i1Ro1J +i1Sx62 +i1T +i1T^4 +i1Ti0v*24 +i1U +i1V +i1W +i1W*27-1 +i1X +i1XC +i1X{ +i1Y +i1YL4 +i1Z +i1Zi5%o7l +i1Zt +i1[ +i1\^lR6 +i1^ +i1^^zi5m +i1^i5]$e +i1_ +i1_} +i1` +i1`$` +i1`^\*6A +i1a +i1a'5u +i1a*16 +i1a*37 +i1a*40 +i1ai7o +i1ao0H +i1b +i1b$s +i1b-2 +i1b-5 +i1b@G +i1b[^A +i1bi85x63 +i1c +i1c-6 +i1cq +i1c{ +i1d +i1d$y +i1d*65 +i1dZ1 +i1do1z +i1do3lz3 +i1e +i1eo3 +i1f +i1f-1 +i1f-5 +i1fd +i1f} +i1g +i1g-0 +i1gi5, +i1gx42 +i1gz2 +i1h +i1h^d +i1hp1 +i1i +i1i*13 +i1i-6 +i1iR2 +i1i^`R6 +i1isry +i1iz3 +i1j +i1j*23 +i1j+8 +i1jZ4 +i1j^a +i1k +i1k@b +i1kT6 +i1kZ1 +i1l +i1lx26x31 +i1l{ +i1m +i1m'5 +i1m*45 +i1mx12 +i1mx57 +i1mz4^P +i1n +i1n$7 +i1no2k +i1o +i1o*61i5N +i1o-4 +i1oR1c +i1ossN +i1ox52 +i1oz5+7 +i1p +i1p*46 +i1p+6 +i1q +i1q] +i1q{ +i1r +i1r$ +i1r-5 +i1ro70@c +i1s +i1s*13 +i1so2lT6 +i1t +i1t$b +i1t-0 +i1to4e +i1tz2R5 +i1t{ +i1u +i1u$ +i1uT4 +i1uZ3 +i1ul +i1uo3i +i1uxA1 +i1v +i1v*60 +i1v-4 +i1v^c +i2>uo22 +i2? +i2?^^i6s +i2?{ +i2@ +i2@'8 +i2@i2ac +i2A +i2AKi20 +i2A[{ +i2A^z +i2B +i2Bu +i2C +i2CD0 +i2CZ3o5r +i2C^B +i2C{ +i2D +i2D$4t +i2D*25c +i2D-4 +i2E +i2E*73 +i2El +i2F*37i3| +i2G$8x12 +i2GR6-5 +i2H +i2Hu +i2I +i2J*35o8* +i2L +i2L'5 +i2LC +i2LR7 +i2LZ2 +i2M +i2M$= +i2N +i2N$jl +i2O +i2OZ2 +i2Ol +i2Or +i2P +i2P*2A +i2R +i2Rc +i2Ri4Yx36 +i2S +i2S+1x51 +i2SZ2 +i2S[ +i2T +i2T[ +i2Tl +i2U +i2V +i2Vo5bl +i2W +i2Xi0t$9 +i2Y +i2Z +i2Z^wk +i2Zo7l +i2Zu +i2[i2S +i2[l +i2\ +i2\^6k +i2^ +i2^*51*86 +i2_ +i2_l +i2` +i2a +i2a*32 +i2a-4 +i2a-9 +i2aL6 +i2al +i2az3 +i2b +i2bDA +i2bi2T +i2bx61 +i2c +i2c*30 +i2cR4 +i2cx06ssD +i2cz1 +i2d +i2d'6 +i2d-1 +i2dR3 +i2dT4^2 +i2dz1 +i2e +i2e'7 +i2e-6 +i2e@y +i2eC +i2eT4 +i2eo7o +i2ez2 +i2f +i2f$# +i2f$4 +i2fD5 +i2fo2i+4 +i2fsua +i2g +i2g'B +i2gL1 +i2gr +i2gse +i2h +i2h$3 +i2h*42 +i2h^# +i2hl +i2hz5 +i2h} +i2i +i2i*68 +i2iL1 +i2iZ5*13 +i2io5v^z +i2isJp +i2iz4 +i2i{i5n +i2j +i2j$* +i2j*17z2 +i2j*23t +i2jK +i2jz2+0 +i2k +i2k'A +i2k+4 +i2k[ +i2ki0t +i2ki5n +i2kz4 +i2k} +i2l +i2l'5 +i2l+2 +i2l^)*38 +i2lu +i2lx61 +i2m +i2m'9 +i2mZ3 +i2md +i2mo3([ +i2mo76 +i2mx46o52 +i2n +i2n[ +i2nk +i2nscf +i2o +i2oZ1 +i2oZ2 +i2ox01 +i2ox37 +i2ox45 +i2oz1 +i2oz3 +i2oz3D9 +i2p +i2p*53 +i2pD5 +i2p[ +i2pq +i2q +i2qR7i00 +i2r +i2r$WZ1 +i2r*81x5B +i2rZ1 +i2rr +i2rt +i2rx01 +i2rz1 +i2s +i2sZ1 +i2s] +i2ssr0 +i2sx02 +i2sx32 +i2sx54 +i2t +i2t'9 +i2t*05 +i2tiAXx59 +i2tscp +i2tz3*93 +i2u +i2u$u +i2ul +i2usjc +i2ux12u +i2v +i2v*13 +i2v^\ +i2v^z} +i2vd +i2vu +i2vx01 +i2v} +i2w +i2w*03 +i2w+0^, +i2w@o +i2wT0 +i2x +i2xD1o1- +i2x^{ +i2xz4 +i2y +i2y*62 +i2yi3x +i2yl +i2z +i2zC +i2zL1 +i2zZ1 +i2zc +i2zx14o3U +i2| +i2|o2)+5 +i2}+3 +i2}+5z2 +i3 +i3 D0 +i3 T2 +i3! +i3"R4 +i3"^u +i3"skr +i3# +i3#k +i3$ +i3$o74 +i3% +i3%'A +i3%C +i3%r +i3%x51 +i3& +i3&[ +i3' +i3'Z2 +i3'i6+ +i3't +i3( +i3) +i3)*43 +i3* +i3+ +i3+*42 +i3+r +i3, +i3,{ +i3- +i3-[ +i3-r} +i3-snq +i3-u +i3. +i3.z2 +i3/ +i3/'8 +i3/*10r +i3/+4 +i3/o5H +i30 +i30z1 +i30z1*58 +i30z3l +i31 +i31T4 +i31^a +i31d +i31i42 +i31i42i53 +i31o0s +i31p1 +i31x91 +i32 +i32*81 +i32T4 +i32Z1 +i32^' +i32x43 +i33 +i33T4 +i33^7 +i33^H'4 +i33i40 +i33i44^2^1 +i33p1 +i33x67 +i34 +i34@t +i34T4 +i34[ +i35 +i35q +i36 +i36+2 +i37 +i37$v +i37T4 +i37c +i37x03 +i37z2x03 +i38 +i38-4 +i38L0 +i38T4 +i39 +i39T4 +i39i59 +i39u^) +i39}^b +i3: +i3; +i3;$l +i3;'7 +i3;'8 +i3< +i3= +i3=Cx42 +i3=x02 +i3> +i3>*20 +i3>ci2Z +i3? +i3?+4Z1 +i3?o6+ +i3?t +i3@ +i3@'8 +i3@*50 +i3@-0 +i3@t +i3A +i3A$N +i3A'4 +i3A^W +i3BT6 +i3Bc +i3Bl +i3C +i3Cl +i3CuD2 +i3Cx02T1 +i3D +i3DR5^3 +i3Dc +i3Dl] +i3E +i3Ei3' +i3Eu +i3F +i3FZ2'5 +i3G +i3G-4 +i3G^] +i3G^hl +i3H +i3Hi22 +i3Hl +i3I +i3J*56{ +i3J-4^$ +i3KT0 +i3Klst1 +i3L$a*68 +i3LiA.x27 +i3Ll +i3Lr +i3M +i3Mo6,-0 +i3Mz3[ +i3N +i3O{ +i3P +i3Q +i3R +i3RR6i6m +i3Ri2? +i3Rt +i3S +i3Si4& +i3Srl +i3Tx43 +i3U +i3UK +i3V +i3W +i3W+0slV +i3W[ +i3Wl +i3X +i3Y +i3Y*30 +i3YD0 +i3Yi4_L0 +i3Yl +i3Yx34 +i3Z +i3Z^| +i3[ +i3[*12 +i3[[ +i3[x12s73 +i3\ +i3\'5 +i3] +i3]*24oA: +i3^ +i3^@s*04 +i3^x41 +i3_ +i3_*46 +i3_+1 +i3_+5 +i3_@1 +i3` +i3a +i3a*35 +i3a-0R3 +i3ax02 +i3b +i3bZ2 +i3bk +i3bu +i3c +i3c$Fx47 +i3c'6 +i3cT0 +i3cZ1 +i3ci1i +i3ci7U +i3d +i3d*63 +i3dL1 +i3do1r +i3dx43 +i3e +i3e$3 +i3e$Z +i3e*53o2f +i3e*60 +i3eD5 +i3ei2s +i3ex43 +i3f +i3f*50 +i3f-4 +i3f^!skT +i3g +i3g$x +i3g+7 +i3g-1 +i3gL6$t +i3gT6 +i3go98 +i3gx43 +i3g{ +i3h +i3h*03 +i3hZ1 +i3hZ3 +i3h[ +i3h^k +i3ht +i3hx12 +i3h} +i3i +i3i$x +i3i*12$y +i3iZ1 +i3i[ +i3ii0Y +i3ip1 +i3ir +i3iu +i3iz1 +i3j +i3jZ1 +i3jk +i3jl +i3jr[ +i3k +i3kz2$g +i3l +i3lL7 +i3lZ2 +i3l[ +i3l]$3 +i3l^z +i3lc +i3lx03 +i3lz1 +i3m +i3m'9 +i3m*14 +i3m+2 +i3mD2o50 +i3mZ1 +i3ml +i3mt +i3mz5 +i3n +i3nZ1 +i3n^T*51 +i3nc +i3nl +i3no4dD5 +i3o +i3o$4 +i3o*20 +i3ou +i3p +i3p*03 +i3p^S +i3p^a +i3pz1 +i3p} +i3q +i3q-5 +i3q^#o1b +i3qi4d +i3qk +i3q{ +i3r +i3r*59 +i3ri01 +i3ro6h +i3rsct +i3ru +i3rx41 +i3s +i3s*87 +i3s-1 +i3sZ2 +i3sk +i3sx35sDb +i3sx43 +i3t +i3t*60 +i3t@c +i3tC +i3t[ +i3t^r +i3to0z+5 +i3to7n +i3tu +i3u +i3uc +i3up1 +i3uq +i3ussV +i3ux63 +i3v +i3vZ1 +i3vo2N +i3w +i3w*54 +i3wT1 +i3w^A +i3wc +i3wp1 +i3x +i3x@m +i3xZ4*02 +i3xd +i3xx46 +i3y +i3y*42 +i3yK +i3yx13o2D +i3yx51Z2 +i3z +i3z*56 +i3z*62 +i3zK +i3z^Z +i3zi5& +i3zr +i3{ +i3{*02 +i3| +i3}i4j +i3}o7C +i4 +i4 '6 +i4 *23 +i4 *37 +i4 +6 +i4 +7 +i4 -0 +i4 -6 +i4 D6 +i4 K} +i4 Z1 +i4 Z2 +i4 [ +i4 i7 +i4 r +i4 x12 +i4 { +i4! +i4!{ +i4"*8Ax45 +i4# +i4#$i*67 +i4#l +i4$ +i4$+8 +i4% +i4%+6 +i4%u +i4& +i4&+7 +i4&Z2 +i4&^j +i4&l +i4&o7b +i4&s1J$o +i4&x03 +i4' +i4( +i4(^% +i4* +i4+ +i4+'7 +i4+] +i4, +i4,[ +i4,s,k +i4- +i4-*30-8 +i4-^K +i4-o0e*13 +i4-x02 +i4-{^{ +i4. +i4.i5, +i4.t +i4/ +i4/'A +i4/*37 +i4/[ +i4/t +i4/x12 +i40 +i40-4 +i40D6 +i40T5 +i40^k +i40z1 +i41 +i41$2 +i41*04 +i41-7 +i41T5 +i41^-o7f +i41i2$ +i41i52 +i41i52i63 +i41r +i42 +i42-7 +i42@2 +i42C +i42T5 +i42[ +i42^z +i42sky +i43 +i43T5 +i43i54^2^1 +i43x57 +i43x73 +i43z1 +i44 +i44$h +i44*16 +i44L6*54 +i44T5 +i44sj\ +i44x15q +i45 +i45T5 +i45o1x^3 +i45o58 +i45z2T2 +i46 +i46T5 +i46Z2 +i46i42 +i46i9c +i46s57t +i47 +i47*47 +i47*61z2 +i47D7 +i47T5 +i47o1g +i47t +i48 +i48L2 +i48^Lo6x +i48l +i48x68 +i48}$6 +i49 +i49T5 +i49d +i4: +i4:c +i4:l +i4; +i4< +i4= +i4=$5 +i4=*86 +i4=Z1 +i4=x15o0s +i4> +i4? +i4?*32x01 +i4?^% +i4?x2A +i4@ +i4@-8 +i4@@7 +i4@[ +i4@o3n +i4@sL" +i4A +i4A$vt +i4At +i4B +i4BD0 +i4Bt +i4C +i4C*87'6 +i4Cz1 +i4D +i4E +i4E$1D6 +i4El +i4F +i4G +i4H +i4HcD3 +i4I +i4J$a +i4Jx02 +i4K +i4K$4 +i4K*63 +i4L +i4M +i4M$0 +i4M+0 +i4M^> +i4N +i4N*35 +i4No1A'9 +i4Nu +i4OD7 +i4P +i4P$3 +i4P*35L0 +i4Pc +i4Pl@v +i4Q +i4R +i4S +i4Sx53 +i4T +i4T-4 +i4U*29 +i4V +i4W +i4X +i4X^R+8 +i4Y +i4Yu +i4Y{ +i4[ +i4[-7 +i4[u} +i4[x04 +i4[x35 +i4\ +i4]*14 +i4]Z2 +i4^ +i4^i91x27 +i4_ +i4_'8 +i4_+5 +i4_Z1 +i4_x53 +i4_x54 +i4_x84 +i4` +i4`'Ax32 +i4`[ +i4a +i4a*36 +i4aD2 +i4a[ +i4au +i4ax52 +i4b +i4b*45$x +i4bx04d +i4bx51 +i4bz1 +i4c +i4cc +i4cd +i4ck +i4cl +i4d +i4d*04 +i4d^%o95 +i4dk +i4dz1 +i4e +i4e$a +i4e$r +i4e+3o5m +i4eZ3 +i4e^Dc +i4ei2W +i4ei52 +i4et +i4ex13 +i4f +i4f$az3 +i4f$h +i4f'5 +i4f[ +i4fp1 +i4g +i4g$# +i4gl] +i4gr +i4g} +i4h +i4h*31 +i4h*45 +i4h+7 +i4h-0 +i4hD0 +i4ho2r +i4hsfK +i4h} +i4i +i4i*64 +i4i+5 +i4i-8 +i4i-A +i4i[Z2 +i4i^>z3 +i4id +i4j +i4j$!*80 +i4j*21 +i4j*57^[ +i4jK +i4jtT4 +i4k +i4k$9 +i4k'6 +i4k'A +i4k*38Z1 +i4kD2 +i4kD5*36 +i4kZ1 +i4k[ +i4k^ +i4kx31z3 +i4l +i4l'8 +i4m +i4m*90x29 +i4m-1 +i4m-3 +i4mi4V +i4n +i4n*58r +i4n*65 +i4nT0 +i4nZ3 +i4n^k +i4ni3go6n +i4nx91 +i4o +i4o+8 +i4o-3 +i4o[ +i4ou +i4o} +i4p +i4p$s +i4p*57 +i4p-1 +i4p{ +i4q +i4q*47 +i4qo5u +i4qr +i4r +i4rD6 +i4rR1 +i4r[ +i4ri0> +i4ro5f +i4ru +i4rx91 +i4s +i4s-0 +i4s@b +i4s@h +i4sR6Z2 +i4s^: +i4t +i4t$g +i4t*04 +i4t+2 +i4t+6 +i4tD0 +i4td +i4t{*63 +i4u +i4u+0o0r +i4u+2 +i4uZ2 +i4v +i4viAo +i4vs59o44 +i4vsk3 +i4w +i4w'9 +i4w-9 +i4w] +i4w]$y +i4wc^r +i4wl +i4x +i4x^+ +i4x} +i4y +i4y+3 +i4y^& +i4yc +i4yi3g+1 +i4yi6k+7 +i4yr +i4yx52 +i4yx64 +i4z +i4z*64 +i4{ +i4| +i4|-8 +i4}^%x35 +i4}i6u +i5 +i5 $6 +i5 'A +i5 +6 +i5 -6 +i5 ^d +i5 i69 +i5 s5>x04 +i5 t +i5 {K +i5! +i5!x32 +i5" +i5"*53 +i5"Z2*16 +i5"i5] +i5# +i5#$` +i5#l +i5#x13 +i5$ +i5$@0 +i5$k +i5$lz3 +i5$r +i5% +i5%o61 +i5& +i5' +i5( +i5) +i5* +i5*$* +i5**04 +i5**73*76 +i5+ +i5+*34 +i5+l +i5, +i5,o0/ +i5- +i5-$3 +i5-'A +i5-*13L6 +i5--6 +i5-D0 +i5-D2 +i5-i2: +i5. +i5.x03 +i5/ +i5/T6 +i50 +i50$9 +i50$s +i50c +i50i4c +i50l +i51 +i51$8 +i51T6 +i51i62 +i51i62i73 +i51k +i51o4b +i52 +i52$A +i52$d +i52*16} +i52*30i3* +i52-2 +i52R2 +i52T6 +i52[ +i52k +i52x76 +i53 +i53*68 +i53*81 +i53T6 +i53i3f +i53i64^2^1 +i54 +i54'A +i54*31 +i54-6 +i54-8 +i54D1 +i54D8@s +i54T6 +i54l +i55 +i55*47 +i55+9 +i55@4 +i55T6 +i55o5i +i55r +i55u +i56 +i56+6 +i56^_ +i56i55 +i56l +i57 +i57*60^\ +i57D8 +i57T6 +i57Z2 +i57k +i57o2C$7 +i58 +i58T6 +i58[ +i58o1* +i58u +i58x23 +i58x71 +i59 +i59'8 +i59*02 +i59*54 +i59T6 +i59Z2 +i59l +i59x02 +i59x07^" +i5: +i5:+5 +i5; +i5;D4 +i5;^go87 +i5< +i5^k +i5>x81x24 +i5? +i5?i2% +i5@ +i5@*02^I +i5A +i5A*16 +i5AtD1 +i5Ax04 +i5Ax32 +i5D +i5Dl +i5E +i5Eo1r +i5F +i5G +i5H +i5I +i5Iu +i5J +i5Jc +i5K +i5KZ2 +i5Kt +i5Kx64 +i5L +i5Ll +i5M +i5M*02i6r +i5MT4 +i5Mri2i +i5N +i5N*30 +i5Nl +i5O +i5O'8 +i5P +i5Pt +i5Q +i5R +i5Ru +i5S*67 +i5Sl +i5T +i5T*85 +i5TD1 +i5U +i5Ux14[ +i5VR7 +i5Vi22 +i5W +i5X +i5Y +i5Y@ax24 +i5Z +i5Z[ +i5[ +i5\o4I +i5] +i5^ +i5^-2 +i5^D5D2 +i5^[ +i5^l +i5_ +i5_*97 +i5_[ +i5_] +i5_^u +i5_u +i5_x64 +i5_xB3'9 +i5` +i5`{ +i5a +i5a'6 +i5a*04 +i5a*56 +i5ai24x76 +i5ai27 +i5ai6n +i5az1*36 +i5b +i5c +i5c'7 +i5c*24 +i5cd +i5cs62 +i5c{ +i5d +i5d*05 +i5d[ +i5d^\ +i5e +i5e+0 +i5e-4i4c +i5eZ1 +i5ei8i +i5el +i5er +i5ex23 +i5f +i5f*03 +i5f-4 +i5fD1 +i5fr +i5fx13 +i5g +i5g@1 +i5gD6 +i5gT1 +i5gi8kx65 +i5go4a +i5gx01 +i5gz1i2{ +i5g{ +i5h +i5h*76 +i5h-8 +i5hT0 +i5hZ2x6A +i5h[ +i5hz2 +i5i +i5i$q +i5i+7 +i5i@s +i5iT0 +i5ii18^8 +i5io2Mi1S +i5i{ +i5j +i5ju +i5jx13 +i5jx45 +i5k +i5k$2 +i5k@2 +i5ko6e +i5l +i5l-6 +i5li6A +i5m +i5m*53 +i5m-0 +i5mZ1 +i5mx62 +i5mz1 +i5n +i5n'5 +i5n*76 +i5n+3 +i5nZ1 +i5n] +i5n^) +i5nx37z2 +i5o +i5oL4 +i5oL6 +i5oZ2 +i5oi5E*74 +i5ox23 +i5p +i5p^x +i5pk +i5px05 +i5px12 +i5q +i5q'4-3 +i5q{ +i5r +i5rD2 +i5ri3= +i5ri5? +i5rs9Sx51 +i5rx23l +i5s +i5s*10 +i5s-4 +i5s^T +i5sx03 +i5t +i5t[Z1 +i5tc +i5u +i5u$0 +i5u*57 +i5u*68 +i5v +i5vi1^ +i5w +i5w*57 +i5w[ +i5wx72 +i5x +i5x+2 +i5x@1 +i5xD3 +i5xl +i5xx32 +i5y +i5yi0r +i5yr +i5z +i5zl +i5zx14 +i5zz1 +i5{+7 +i6 +i6 +8 +i6 T0 +i6 c +i6! +i6!CK +i6" +i6"$j-8 +i6# +i6$ +i6% +i6%c +i6%o6f +i6%x71 +i6& +i6' +i6( +i6* +i6*xB1 +i6*} +i6+ +i6+*56o62 +i6+x18x31 +i6, +i6,x02 +i6- +i6-*78 +i6-Z1 +i6-i1" +i6-o3- +i6. +i6.T6 +i6.x12 +i6/ +i60 +i60*34 +i60*36 +i60*62 +i60Z1 +i60i2" +i60x05 +i60x13 +i60z1 +i61 +i61L3 +i61R1 +i61R4 +i61i3o +i61l +i62 +i62*27i2] +i62Z2 +i62[ +i62s2% +i63 +i63T1-4 +i63Z1 +i63t +i64 +i64R5 +i64] +i64} +i65 +i65$6 +i65'9 +i65*06 +i65*52 +i65-8 +i65R5 +i65Z3 +i65o87 +i66 +i66'7 +i66+2l +i66o2RsH3 +i66x75 +i67 +i67*13 +i67*53 +i67Z1 +i67[ +i67x42 +i67x45 +i68 +i68*68 +i68D8 +i68D8*54 +i68Z2 +i69 +i69$r +i69$x +i69+7 +i69R5 +i69x32 +i69{ +i6: +i6:*57 +i6; +i6< +i6= +i6=c +i6> +i6>o8. +i6? +i6?T7 +i6@ +i6@x02 +i6A +i6AT0 +i6Au +i6Bi8Px72 +i6D +i6D-5 +i6D^W +i6Dci0U +i6Do9. +i6E +i6E*64$k +i6ET4i1$ +i6Fx02 +i6G +i6H +i6I +i6Ix29$w +i6J +i6K +i6Kx13 +i6L +i6LuD1 +i6M +i6N +i6N$zx26 +i6Ni2b +i6Nri7r +i6O +i6P +i6Q +i6R +i6S +i6S$$t +i6Sx62T1 +i6T +i6T-6 +i6U +i6U$isU +i6U*71 +i6Ux16x35 +i6Vl +i6X +i6Xt +i6Yt +i6ZL7 +i6Zo7= +i6Zu +i6[ +i6[*52o4s +i6[-2'5 +i6[x24 +i6\ +i6^ +i6^o7X +i6_ +i6_+7 +i6_-7 +i6_D2 +i6` +i6`*01 +i6a +i6a*85 +i6a+5 +i6al +i6ax02 +i6ax05 +i6az1 +i6az2^i +i6b +i6b$oi3m +i6b+6 +i6bx71 +i6c +i6c*35 +i6cc +i6d +i6d*60 +i6d-5 +i6dlx81 +i6do2c +i6d{ +i6e +i6e[ +i6e] +i6el +i6ex94 +i6f +i6f*64 +i6f*76 +i6fl +i6g +i6gD4 +i6g^K +i6gu +i6g} +i6h +i6h'A +i6h+4 +i6hZ1 +i6hr +i6hx82 +i6hz2 +i6i +i6i$6 +i6i-3[ +i6il +i6is5c +i6isvt +i6j +i6jo81 +i6k +i6k+7 +i6kD3 +i6kD4 +i6kT0 +i6k^* +i6klz1 +i6l +i6l*83 +i6li0Z +i6lo5] +i6m +i6mZ1 +i6mx06 +i6mx76 +i6n +i6nc +i6nl +i6no7j +i6o +i6oo1p +i6ox32 +i6ox91 +i6p +i6p-7 +i6p] +i6po74 +i6ps1! +i6q +i6qri6I +i6qx39T3 +i6r +i6r$r +i6r-5 +i6rZ1 +i6rk +i6s +i6s'8c +i6s'A +i6si4? +i6sx21 +i6t +i6tx36^d +i6u +i6u*64 +i6u+5 +i6uD4 +i6ut +i6u}} +i6v +i6w +i6w$y +i6w[ +i6x +i6y +i6y-2 +i6y-8 +i6yC +i6z +i6zD4 +i6zc +i6zco5> +i6zi0s +i6zo5s +i6zx73 +i6| +i6}$rx49 +i6}x53i2K +i7 +i7 [ +i7 l +i7! +i7" +i7# +i7#c +i7$ +i7% +i7%D3 +i7& +i7' +i7'@1x09 +i7* +i7+ +i7,x25 +i7- +i7-u +i7-x43 +i7. +i7.[ +i7/ +i7/srX +i70 +i70T8 +i70t +i71 +i71+8 +i71[ +i71x25 +i72 +i72+6 +i72x45z3 +i73 +i73*79 +i73[[ +i73i49 +i73u[ +i74 +i74o3[ +i75 +i75$4 +i75Z1 +i75l+1 +i75x43 +i75x91 +i76 +i76+9 +i76D5 +i76R8 +i77 +i77$3 +i78 +i79 +i79x93 +i7; +i7< +i7x56 +i7@ +i7A +i7Ax02 +i7Ax15 +i7Ax23 +i7C +i7D +i7F'8T3 +i7G +i7Hx17^M +i7K +i7Lc +i7M +i7M*37 +i7Ml +i7NZ1+1 +i7Nc +i7P +i7Pc +i7Qx14 +i7R +i7S +i7SZ1 +i7Uu +i7V-6 +i7X +i7Xt +i7Z +i7[ +i7\ +i7_ +i7_D2 +i7a +i7aL6 +i7aZ2 +i7ax01 +i7ax21 +i7a{ +i7b +i7c +i7c+1o46 +i7cc +i7d +i7d'6@2 +i7dx91 +i7e +i7e-8 +i7eR9 +i7es17 +i7f +i7f[ +i7fc +i7g +i7gc +i7gi90 +i7h +i7h$2 +i7h-9 +i7hi7{ +i7hl +i7hx25 +i7i +i7i+3 +i7idx28 +i7ix34 +i7j +i7jR9 +i7jl +i7jsjeu +i7k +i7k+8 +i7ki7u +i7l +i7l'8 +i7lD2 +i7l^7 +i7m +i7m+8 +i7mL8 +i7mx25 +i7n +i7n[ +i7o +i7o*35 +i7oo0d +i7p +i7p*70 +i7p[ +i7px52 +i7q +i7qt +i7r +i7s +i7sR8 +i7sT0 +i7s^j +i7sl +i7sz1 +i7t +i7t$3 +i7u +i7u-8 +i7ux84 +i7v +i7vo9n +i7w +i7wl +i7wx01 +i7wx34 +i7wx49 +i7x +i7x+4*67 +i7y +i7yi3d +i7yi5_^{ +i7z +i7z} +i7|^m +i8 +i8 -9 +i8 Z1 +i8 x16 +i8! +i8# +i8#u +i8$ +i8% +i8%$@x38 +i8& +i8&D4*87 +i8&Z4x78 +i8' +i8)-9 +i8* +i8*s61 +i8+ +i8+i7I +i8, +i8- +i8-'5-1 +i8-T0 +i8-p1'9 +i8. +i8/ +i80 +i80$4 +i80D0 +i80[ +i80[z1 +i80k +i80o6. +i80r +i81 +i81C'A +i82 +i83 +i83-7 +i84 +i84+7 +i84+A +i84^1x83 +i85 +i85x23 +i85x53 +i86 +i86o9,[ +i87 +i87x61 +i88 +i89 +i89-9 +i89[ +i8; +i8;*37 +i8< +i8= +i8=x53 +i8> +i8>z1 +i8? +i8@ +i8@x16 +i8Cl +i8D +i8Dc +i8DiA-*86 +i8E +i8F +i8Il +i8JD6 +i8MZ4x67 +i8Mx53 +i8P +i8Qx57$t +i8Rl +i8U +i8UD4 +i8V +i8WD1x27 +i8X +i8XD7 +i8Zc +i8[ +i8_ +i8_Z1 +i8_l +i8a +i8a*18 +i8aD6 +i8aso3x71 +i8ax53 +i8c +i8c+1 +i8d +i8e +i8e*45R8 +i8f +i8fx05x21 +i8g +i8gx05 +i8h +i8hD5 +i8i +i8iD6 +i8j +i8k +i8k$1 +i8kD6 +i8l +i8lx07 +i8m +i8mD0 +i8n +i8nx08x43 +i8o +i8ol +i8p +i8po0/s9W +i8r +i8s +i8s'9 +i8s+7 +i8so1o +i8t +i8t$0 +i8tc +i8u +i8ul +i8vc +i8v{ +i8w +i8x +i8x'9 +i8x*14x04 +i8xD9*32 +i8y +i8yc +i8z +i8z'9 +i8zr +i8zx05 +i8zx52 +i9 +i9# +i9'Z2x65 +i9, +i9- +i9/D8 +i90 +i90c +i91 +i91T7R8 +i91l +i92 +i93 +i93TB +i93x34 +i94 +i94[C +i94x42 +i95 +i95i4|x0A +i95x71 +i96i7sx37 +i97 +i97$5 +i97D8 +i98 +i98s18 +i98x61 +i99 +i99Z1[ +i99x01 +i99x43 +i9; +i9=i0-x1A +i9A +i9B$dx92 +i9Bll +i9Ec +i9FR9'A +i9Rl +i9Sl +i9Tl +i9_ +i9a +i9ax61 +i9axA4 +i9c +i9c*04 +i9cl +i9d +i9dT0 +i9e +i9ex54 +i9f +i9g +i9h +i9hD6 +i9i +i9i'A +i9j +i9jxA3 +i9k +i9l +i9lD7 +i9m +i9mD9o7v +i9n +i9o +i9p +i9po6a'B +i9q +i9r +i9r-A +i9riAu +i9s +i9s'B +i9sx02 +i9t +i9u +i9u*13i9+ +i9wx35 +i9x +i9x-A +i9y +iA +iA!x56 +iA%T3'9 +iA&x47c +iA,x67 +iA- +iA--B +iA. +iA.x67x91 +iA/xA3 +iA/z2x37 +iA0 +iA1 +iA2 +iA3 +iA4 +iA4+B +iA5 +iA7 +iA7o95 +iA8 +iA9 +iA: +iAE$rx57 +iAG$8xA3 +iA\*B1 +iA_ +iA_o4Ax46 +iAcx78 +iAe +iAel +iAex72 +iAg +iAh +iAi +iAj +iAkx82 +iAnx64 +iAo +iAr +iAs +iAsx28 +iAt +iAt$v'B +iAu +iAx +iAxZ3x18 +iAy +iAz +iAzx82 +iA}x86T8 +iB1x37 +iB2@9 +iB4x38 +iB5 +iB9 +iB_ +iBa +iBax74 +iBd +iBe +iBi +iBiR2x25 +iBix16 +iBix65 +iBrx46 +iBs +iBux05 +iBxx65 +iBysi`x17 +k +k$! +k$) +k$1 +k$1i5t +k$8 +k$: +k$C +k$G +k$P +k$_ +k$b +k$c +k$d +k$e +k$h +k$hi4X +k$i +k$k +k$o +k$oZ1 +k$p +k$q +k$t +k$u +k$v +k$|Z2 +k'6 +k'6l +k'7 +k'9 +k*04l +k*04z3 +k*07 +k*13 +k*16 +k*17 +k*20 +k*34-1 +k*46 +k*51 +k*54 +k*54$9 +k*54R3 +k*57z2 +k*63 +k*B0 +k*B7 +k+0 +k+1f +k+2 +k+3 +k+4 +k+5 +k+5i2e +k-0 +k-3 +k-5*13 +k-7[ +kD0o5r +kD2 +kD3 +kD4 +kK*15 +kK^M +kK^P +kL2 +kR0i4y +kR1^= +kR1x41 +kR2 +kR3 +kR4 +kT5 +kZ1 +kZ1Z1 +kZ1^4 +kZ1t +kZ2 +kZ2+2 +kZ3 +kZ3+A +k[r +k[sy6 +k[z3 +k^"$V +k^1$u +k^2 +k^5 +k^8 +k^A +k^G +k^H +k^J +k^K +k^T +k^X +k^Z +k^h +k^j +k^k +k^m +k^n +k^rt +k^s +k^t +k^u +k^w +k^z +kc +kd +kf +kfT4 +ki0C +ki0b +ki0r +ki1- +ki12 +ki13[ +ki16 +ki17 +ki1UZ2 +ki1Y +ki1e +ki1h +ki1m +ki1o +ki1s +ki2v +ki2z +ki3@*74 +ki3Q*62 +ki3f +ki3h +ki4' +ki40 +ki4v +ki4z +ki5\ +ki5^ +ki5i +kk +kk^T +ko0! +ko0: +ko0E +ko0c +ko0el +ko0k +ko0p] +ko0u +ko0z +ko1- +ko10 +ko16 +ko1a +ko1f +ko21 +ko29 +ko2O +ko2d +ko2g +ko2l +ko3- +ko31 +ko3_ +ko3h +ko3lf +ko4 +ko4k +ko4o^E +ko5g +ko65 +ko6f +ko6g +ko7m +ko85 +ko91 +ko92 +koA7 +kp1 +kp1*13 +kp2x62 +kq +kqi15 +kr +kr$| +krR1 +krZ2 +ks2c +ks3H +ks52 +ks5b +ks8k +ksaj +ksbd +ksd3 +ksej +ksfpx71 +ksgd +ksir-2 +ksjt +ksmO +ksnb +ksrJ +kssL +kssy +ksuz +ksy$ +kt-3 +kuo9y +kx07 +kx07^1 +kx08sd; +kx13 +kx18 +kx23 +kx51 +kx62 +kz1 +kz1T0 +kz1l +kz1x51 +kz2 +kz2^7 +kz2z3 +kz3 +kz3C +kz4 +kz4*97 +kz5D9 +kz5i9s +kz5x06 +k{ +k{$v +k{*48 +k{C +k{x51 +k}q +k}r +k}s9" +l +l $1 +l $1$2$3 +l $2 +l $2$0$0$7 +l $2$0$0$8 +l $2$0$0$9 +l i3 +l i3& +l i3+ +l i3- +l i3. +l i4 +l i4& +l i4+ +l i4- +l i5 +l i5& +l i5- +l i5. +l i6 +l i6& +l i6+ +l i6- +l i7 +l i7+ +l i7- +l$ +l$! +l$% +l$- +l$. +l$/ +l$1f +l$3 +l$4 +l$6 +l$7 +l$8 +l$DZ1 +l$So7m +l$Sx0A +l$[ +l$^$s +l$a +l$e +l$f +l$g*32 +l$i +l$ii6R +l$j +l$kx92 +l$l +l$o +l$q +l$u +l$v +l'4c +l'5u +l'7 +l'8 +l'B +l*03 +l*12 +l*13i53 +l*20 +l*23L4 +l*23spe +l*30*64 +l*35 +l*37 +l*40 +l*41 +l*45 +l*50 +l*5B +l*63K +l*68o6y +l*74 +l*75 +l*79 +l*86 +l*87 +l*92 +l*98 +l*B9 +l+0 +l+0i5t +l+1 +l+1[ +l+2 +l+2^L +l+3 +l+3$K +l+3'7 +l+3-6 +l+4 +l+4*30 +l+5 +l+6 +l+6$j +l+9 +l+Ax45 +l+B +l-1 +l-2 +l-2^` +l-2s?9 +l-3@m +l-4 +l-5 +l-5*24 +l-7 +l-8 +l-A +l-B +l@9 +l@c +l@h +l@mD7 +l@n +l@v +l@x +lC +lD1 +lD1$_ +lD2 +lD3L5 +lD4 +lD5 +lD5i7x +lD6 +lD8 +lL1 +lL1T3 +lL2 +lL2i2m +lL5 +lL7 +lLB +lR0 +lR1 +lR3 +lR6 +lR6Z2 +lR8 +lT0 +lT1 +lT2 +lT3 +lT4 +lT5 +lT5i1p +lT6 +lT7 +lT8 +lT9+B +lZ1 +lZ1$y +lZ1o4| +lZ1x5B +lZ2 +lZ2i6z +lZ2st3 +lZ2x83 +lZ3 +lZ4 +lZ5 +lZ5x57 +l[ +l[d +l[i5q +l]d +l]z3 +l^! +l^'z3 +l^- +l^1 +l^2 +l^4 +l^5o41 +l^D +l^E +l^Ei66 +l^L +l^M +l^QD5 +l^R +l^Ui0` +l^W +l^_x58 +l^aZ2 +l^b +l^c +l^e^N +l^g +l^h +l^hz2 +l^i +l^k +l^m +l^oz1 +l^v^8 +l^y +l^zx91 +l^{ +l^}K +ld +ld$o +ldstC +lf +lfsns +lfx1B +lfx46 +li0$ +li05z5 +li09o6P +li0S +li0d +li13 +li15 +li1: +li1Q +li1_ +li1b +li1h +li1n +li2% +li2p +li3/ +li37z2 +li3a +li3k +li3r +li4 +li42 +li4; +li4_ +li4d'9 +li4h +li4n +li51 +li58 +li5e +li5t +li5u +li5zD7 +li6%+9 +li6' +li6/ +li60 +li67 +li6: +li6dx26 +li6j +li6p +li6t +li70 +li7S[ +li7e +li7k +li7v +li8 +li8a +li8t +li94 +liAb +lk +lo01x82 +lo0C +lo0E$a +lo0L +lo0c +lo0d +lo0e +lo0i +lo0p +lo0v^q +lo0z +lo19 +lo1@ +lo1V +lo1a +lo1b +lo1e +lo1i +lo21 +lo2a +lo2j +lo2o +lo2t +lo3_ +lo3c +lo3e +lo3l +lo3pu +lo3w+1 +lo42 +lo4a +lo4b +lo4g +lo4v +lo4z +lo5, +lo5- +lo5; +lo5< +lo5K$) +lo5f +lo5i +lo5n +lo5u^4 +lo6 +lo6- +lo63 +lo66 +lo68 +lo69 +lo6` +lo6g +lo6i +lo6k +lo7- +lo74 +lo7K +lo7R +lo7` +lo7e +lo7f +lo85 +lo89 +lo8d +lo8e +lo9e +lo9i +loA9 +loAf +loAk +loB1 +loBF +lp1 +lp1t +lp2z2 +lp3 +lq +lqZ3 +lqsaT +lr +lr^+ +lrz4 +ls#j +ls$8 +ls0j$9 +ls12 +ls1a +ls4+ +ls5d +ls6- +ls6p +ls70 +ls8p +lsdk +lseSo3e +lsgc +lsgj +lshj +lslh +lsmK +lsmb[ +lso1 +lsp1 +lsr[ +lss& +lss[$] +lssd +lssf +lssi +lsuy +lsys +lsz2 +lu +lu$L +lu$y +lui5C +lux03 +luxB2 +lx01 +lx05 +lx06 +lx07 +lx12 +lx13 +lx14 +lx15 +lx21i31 +lx23 +lx23$N +lx23z2 +lx24 +lx24$8 +lx26 +lx27 +lx31 +lx35-5 +lx35R1 +lx38 +lx3A^k +lx42 +lx43 +lx47 +lx48 +lx52 +lx53 +lx56 +lx56i5M +lx57 +lx58 +lx61o0H +lx61o8e +lx63 +lx69 +lx71 +lx72 +lx75 +lx76 +lx78 +lx81 +lx83D9 +lx8B +lx91 +lx92 +lx95 +lxA3 +lz1 +lz2 +lz2$5 +lz2*14 +lz3o6F +lz4 +lz5 +lz5@7 +l{ +l{*02 +l{*15 +l} +l}-1 +l}Z2 +l}^K +o0 +o0 Z5 +o0! +o0!*A9@R +o0!o2^o25 +o0!x34 +o0!z1 +o0# +o0$ +o0$*54 +o0$+2 +o0% +o0%$eq +o0& +o0&'6 +o0&-5 +o0'r +o0('7 +o0(-7 +o0({ +o0)+1z2 +o0* +o0*D2 +o0*z5 +o0+ +o0, +o0,cx02 +o0,p1 +o0- +o0-'9^L +o0-D1 +o0-R1 +o0-} +o0. +o0.x31 +o0.z1 +o0/ +o0/C +o0/T1 +o0/z1 +o00 +o00+3 +o00-5o1M +o00L1 +o00^1 +o00p1 +o00z1 +o01 +o01i07 +o01l +o01p1 +o01p3 +o01s0h +o01uZ3 +o01z1 +o01z3 +o01z4+1 +o01}{ +o02 +o02*20 +o02D5 +o02D6 +o02Z1 +o02saC +o02z1 +o03 +o03+1 +o03-1 +o03^1 +o03^< +o03^Q +o03i3a +o03r +o03x2Az3 +o04 +o04'8 +o04L1 +o04x13 +o05 +o05'8 +o05l +o05t +o05z1 +o05z5 +o06 +o06+1 +o06@r +o06Z2 +o06Z4 +o06x85 +o07 +o07*51 +o07-5Z2 +o07D2*56 +o07R2 +o07o2z +o07{u +o08 +o08$xr +o08Z1 +o08]d +o08rD5 +o08x74 +o08z2 +o08z3x64 +o09 +o09$x +o09*13 +o09*54 +o09-1 +o09L4 +o09Z4l +o09k +o0: +o0; +o0< +o0 +o0>-1 +o0?$K +o0?^! +o0?^A +o0?}i3u +o0@ +o0@x24 +o0A +o0AL1*17 +o0AZ2 +o0A^Q +o0B +o0Bz3 +o0C +o0Cp1x01 +o0Ctz2 +o0Cz1 +o0D +o0D'6 +o0D'9 +o0Di6r +o0Du^I +o0E +o0E+0 +o0EC +o0F +o0F$s +o0Fk +o0Fl +o0G +o0G@q +o0Gi0Q +o0H +o0HD8*18 +o0Hi3m +o0Hl +o0HstA +o0I +o0ID0f +o0Ik +o0I{C +o0J +o0JT5 +o0Jt +o0Jz2D2 +o0K +o0K*02 +o0KT5 +o0Ku +o0Kx23^z +o0L +o0Lp1 +o0M +o0M$n +o0M'9 +o0M*13 +o0M*43 +o0MD3 +o0ML1 +o0MZ5 +o0Md +o0Mo2N +o0Mz1 +o0N*25 +o0N*72 +o0ND8x14 +o0No4oZ2 +o0O +o0O$4z5 +o0OT2 +o0Oi3B +o0Ou +o0P +o0P$r +o0P*23 +o0PZ4 +o0Pd +o0Q +o0Q$w +o0R +o0R$A +o0R$i +o0R*31 +o0R+4 +o0Rx31 +o0Rz3D1 +o0S +o0S*45*34 +o0S^* +o0Sp1 +o0T +o0T+4 +o0TL1 +o0U +o0Uu +o0V +o0V+2 +o0VD3 +o0Vx32 +o0W +o0W$f-6 +o0W*31 +o0WC +o0WD2 +o0WT5Z2 +o0Wp1 +o0Wskt +o0Wtx43 +o0X +o0Xu +o0Xz2 +o0Y +o0Y$b +o0Y$r +o0Y*56 +o0YZ4 +o0Yx43 +o0Z +o0Z$Z +o0Z*31K +o0ZZ1 +o0Zc +o0Zz2 +o0[ +o0[x23 +o0\ +o0] +o0^ +o0^i0cZ1 +o0^p1 +o0^z1 +o0_ +o0` +o0a +o0aT2 +o0a[i2b +o0a^f +o0a^q +o0ai6; +o0ax46 +o0ax63 +o0b +o0b*02 +o0b*23*43 +o0bC +o0b^t +o0bc +o0bk +o0bl +o0bo6Bx04 +o0bp1 +o0c +o0c$0 +o0c*42 +o0c*62 +o0c*86 +o0ck +o0cscq +o0d +o0d$z +o0d+A +o0d-5 +o0d@s +o0dD5 +o0dR9 +o0d] +o0di4[ +o0dl +o0dr +o0dx37q +o0dz3 +o0d} +o0e +o0e'A +o0e-2 +o0eT6 +o0e^Kl +o0ei1s +o0ekZ1 +o0eo3l +o0esa"*61 +o0ex3A +o0ex72 +o0f +o0f$1 +o0fC^a +o0fD1 +o0fK +o0fT3 +o0f^7 +o0fo39l +o0fx12 +o0fx32 +o0g +o0g*34 +o0g+6 +o0gZ2 +o0g] +o0gd +o0gf +o0gp2 +o0gq +o0gqr +o0gt +o0gz2 +o0h +o0h*12 +o0hu +o0hx91 +o0i +o0i+1 +o0ip1 +o0it +o0iu +o0j^9 +o0j^D +o0j^v +o0jc +o0jk +o0jstg[ +o0jx31 +o0jz3 +o0jz4 +o0k +o0k*27 +o0k*30 +o0k*46 +o0k^g +o0kc +o0ko1. +o0kp1 +o0ks7c +o0ksm+ +o0kx23 +o0kx41 +o0kx61 +o0kz1 +o0l +o0l^2 +o0ld +o0ldL6 +o0lkz4 +o0lx35 +o0lx47 +o0lz4 +o0m +o0m+0 +o0mT4 +o0md +o0ml +o0mo5w +o0mz1 +o0m{ +o0n +o0n*61 +o0n*62 +o0n^n +o0no4K +o0no62 +o0nx02$A +o0nz5 +o0n} +o0o +o0o*13 +o0oZ2 +o0op1 +o0oqx26 +o0p +o0p'6 +o0p*40 +o0p+3 +o0p-1 +o0p@1 +o0pZ1 +o0pi42 +o0po3e +o0pt +o0q +o0q$5 +o0ql +o0r +o0r+4 +o0rR4 +o0rT5 +o0r[ +o0r^E +o0r^b +o0ri0p +o0ro2k +o0rswz +o0rx21 +o0rx24 +o0s +o0s+6 +o0sZ5 +o0sd +o0si39 +o0sk +o0sl +o0so3X +o0sx31 +o0sx46^i +o0t +o0t$9 +o0t$? +o0t$e +o0t'7 +o0t*54 +o0t*91 +o0t@0 +o0tD5 +o0tf +o0to3w +o0tq +o0tsPk +o0tu +o0tz1 +o0u +o0u^t +o0ui3- +o0uk +o0v +o0v'5 +o0v*23 +o0v^b +o0vi75x17 +o0vl +o0vo1- +o0vr +o0vx41 +o0w +o0w$3 +o0w$r +o0w'7Z1 +o0w*05 +o0w*14 +o0w*25 +o0w*45^Z +o0wD8 +o0wq +o0wx23 +o0wz1 +o0wz5D0 +o0x +o0xL1 +o0xZ5 +o0x] +o0y +o0y$CD0 +o0yr +o0z +o0z$q +o0z-9 +o0z-9x53 +o0z@u +o0z^I +o0zt +o0zx13 +o0zx32 +o0z} +o0{$rZ4 +o0{x17 +o0| +o0|-2C +o1 +o1 x02$o +o1 z4 +o1! +o1!T0 +o1" +o1"*53 +o1# +o1#+6 +o1#z2 +o1#{ +o1$ +o1$s0J-1 +o1%u +o1& +o1&*13 +o1' +o1( +o1(d*37 +o1(rR1 +o1) +o1)d +o1)s2) +o1* +o1+ +o1+'A +o1+D4 +o1+Z1 +o1+t +o1, +o1,$1+7 +o1,z2 +o1- +o1-'6 +o1-'8 +o1-o0B +o1. +o1.+0 +o1.^h +o1.p1 +o1.x27 +o1/ +o1/T0@1 +o1/z2 +o1/}Z5 +o10 +o10D2 +o10Z5[ +o10ls3" +o10p1 +o10uz5 +o11 +o11$/ +o11D1^O +o11R2 +o11i2 +o11k +o11o9bx81 +o11tz4 +o11z1 +o11z3 +o12 +o12$! +o12C +o12L0 +o12k^4 +o12l +o13 +o13$_ +o13-2 +o13Z1 +o13[ +o13o2S +o13o8hx73 +o13p1 +o13t +o14 +o14$C +o14-9 +o14Z1 +o14Z4 +o14^3 +o14^6 +o14l +o14p1 +o15 +o15'9 +o15Z2*85 +o15[ +o15[+5 +o15o6u +o15x24 +o16 +o16*31 +o16L8@b +o16c +o16z1$3 +o16z2 +o16z3 +o17 +o17R2 +o17T0 +o17[ +o17l +o18 +o18L9 +o18^M +o18^gi4* +o18p1 +o18sjh +o18u +o19 +o19*51 +o19D4 +o19Z4 +o19[ +o19^ix1B +o19f +o19k +o1:*37 +o1; +o1;*58 +o1;l +o1;x32 +o1<*36 +o1= +o1=*71 +o1=[ +o1={ +o1>i5J*52 +o1? +o1?x35 +o1@ +o1@-8 +o1@D0 +o1@^s +o1@x43 +o1Au +o1B +o1B*10 +o1C +o1Cu +o1Cz1 +o1Cz3D2 +o1D +o1D*21 +o1DR4 +o1Dc +o1Dz1*56 +o1E +o1ED0Z1 +o1F +o1F$1 +o1F^1 +o1Fc +o1G +o1GZ1x71 +o1H +o1H$6 +o1Hl +o1Hu +o1I +o1I+2 +o1IT2 +o1IT4 +o1I[ +o1I] +o1Il +o1Ip1 +o1Iu +o1J +o1JcZ2 +o1Jt +o1K +o1K[ +o1Kk +o1Kx35 +o1Kx47 +o1L +o1L[ +o1M +o1M^x +o1M{ +o1N +o1O +o1Oc +o1Odl +o1P +o1PrT6 +o1Pz5 +o1P{+4 +o1Q$\ +o1R +o1S +o1Sco0t +o1T +o1T^v +o1Tr +o1TtC +o1Tz2-5 +o1U +o1U@U +o1U[ +o1Ul +o1Ulstq +o1UsUQu +o1Ux53t +o1V +o1V^\+7 +o1Vk +o1W +o1Wl^1 +o1X +o1XT1 +o1Y +o1Y$p +o1Y*13sma +o1Yx31 +o1Z +o1Z*01 +o1[ +o1[Z2o5j +o1\ +o1\o7% +o1] +o1]x12o34 +o1^ +o1^$( +o1^{$2 +o1_ +o1_$z +o1_sdy +o1_z2 +o1` +o1a +o1a$$ +o1a$- +o1a-9 +o1aD2 +o1a^g +o1ai2s +o1ai4- +o1asbk +o1ax63 +o1b +o1b^w +o1bo0r +o1bs30 +o1c +o1cD6 +o1cL5 +o1ci0et +o1d +o1d$6 +o1d$b +o1dZ4 +o1do2e +o1do3? +o1dz4 +o1e +o1e$7 +o1e*31 +o1e*51^n +o1e+0 +o1eD7 +o1eL5 +o1eZ1 +o1eZ5 +o1eo2d +o1esdh +o1est3 +o1ez5 +o1f +o1f$br +o1f$w +o1f*20 +o1f+0 +o1fk +o1fp2 +o1fz2 +o1g +o1gD0^B +o1gT0 +o1gi0e +o1gp1 +o1gu +o1gx3A +o1h +o1h+0 +o1hR0 +o1h[ +o1ho7s +o1i +o1i'A +o1i^v +o1ii04 +o1j +o1j$1 +o1j*41 +o1j-2 +o1jZ1 +o1k +o1k$! +o1kL4 +o1kZ2o63 +o1k[p1 +o1k^i +o1k^s +o1kc +o1ki1u +o1kl +o1kz4 +o1l +o1l*13 +o1l*53 +o1l-2 +o1ld +o1m +o1m*21 +o1m*24[ +o1m*65 +o1m-3 +o1mD0 +o1mL2 +o1md +o1mo0e +o1mu +o1mx28 +o1n +o1n*10 +o1n*17 +o1nl +o1nu +o1n{t +o1o +o1o*13 +o1o+7 +o1o@9 +o1oD4 +o1oL0 +o1oR0 +o1oZ1x53 +o1od +o1osWt +o1ossEu +o1ox25 +o1p +o1p-2 +o1pZ2 +o1p^c +o1pz1 +o1pz3Z3 +o1p} +o1q +o1qt +o1qu +o1r +o1r[ +o1ro7t +o1rt +o1rx45 +o1s +o1s$h +o1s+0 +o1sZ1 +o1sc +o1sd +o1si0g +o1si3n +o1su +o1sz1 +o1t +o1tp1 +o1u +o1u$- +o1u$yo1u +o1up1 +o1up2xAB +o1usBm +o1u}-0 +o1v +o1v*51 +o1vC +o1w +o1w$4 +o1w$C +o1w+3 +o1w-8 +o1w@9 +o1wD5 +o1wi17 +o1wq +o1wz1 +o1x +o1xZ4 +o1x^l +o1xu +o1y +o1y*27 +o1y*43z1 +o1yT5 +o1yo4f +o1yp1 +o1ysPD +o1ysc1 +o1yx12Z4 +o1z +o1z'8 +o1zZ2 +o1z^j +o1zq +o1{z3 +o1|i1g +o1} +o2 +o2 *20i3D +o2 T0 +o2 ^4 +o2 ^t +o2 i1i +o2 u +o2 uo2a +o2! +o2!*12 +o2!i3V +o2!k +o2" +o2"^S +o2# +o2$ +o2$Z1x42 +o2$Z2 +o2$c +o2% +o2%*73 +o2& +o2' +o2'^*T3 +o2'} +o2) +o2* +o2*T3x01 +o2*d +o2*t +o2*z1 +o2+ +o2+x32 +o2, +o2,$1 +o2- +o2-*01 +o2-+4 +o2-R4 +o2-[o0J +o2-^k +o2-o1w +o2. +o2.D1 +o2/ +o2/Z2 +o2/suz +o20 +o20Z1 +o20^V +o20fx58 +o20i0K +o20z3 +o21 +o21'9 +o21D2snq +o21L6 +o21q +o21u +o21z3 +o22 +o22*32 +o22[ +o22] +o22t +o22z1 +o23 +o23R1 +o24 +o24u +o25 +o25R6 +o25p1 +o25r +o25z1 +o26 +o26'9 +o26Z3 +o26d +o26x61 +o26z2 +o27 +o27+8 +o27C +o28 +o28*12 +o28l +o28p1i3H +o28x36 +o28z1 +o29 +o29R4 +o29T4 +o29o65T2 +o29z2 +o2:*27{ +o2; +o2;*31 +o2;o0Sx16 +o2< +o2$G[ +o2? +o2?+3 +o2@ +o2@T0 +o2@oAR[ +o2A +o2A[ +o2A^1 +o2Au +o2Bl*53 +o2Bsxrl +o2C +o2C-3 +o2Co6\ +o2Ct +o2D +o2D+2 +o2Dl +o2D} +o2E +o2F +o2F+1 +o2G +o2Gl +o2Go0P +o2H +o2HT3 +o2HZ1u +o2H^H +o2H^q$7 +o2Hs0A +o2I +o2J +o2Ju +o2K +o2K*5Bk +o2K^Z +o2Kz2 +o2L@du +o2Lo75 +o2M +o2Mc +o2N +o2Nl +o2O +o2P +o2Pl +o2Px61 +o2Q +o2Q-2Z3 +o2Qu +o2Q} +o2R +o2RT0 +o2Rlx02 +o2ST1 +o2Si6GR4 +o2TZ2 +o2To33 +o2U +o2Ux53u +o2V +o2V$p*53 +o2V-3 +o2V[ +o2Vo3)$/ +o2Vt +o2W +o2Wc +o2Wu +o2Wz2 +o2XR0 +o2Y +o2Y'7 +o2Yck +o2Yt +o2Z'7 +o2ZD3 +o2Z[ +o2Z^g +o2[ +o2[L2 +o2] +o2^ +o2_ +o2_*06 +o2` +o2a +o2a'6 +o2a*32 +o2aK +o2aswr +o2a{ +o2b +o2b$u +o2b*26 +o2b*32 +o2b-0 +o2b[ +o2bx53 +o2b} +o2c +o2cD0 +o2cR4 +o2co7% +o2cx31 +o2cx41 +o2cz2 +o2cz2{ +o2c} +o2d +o2d*54 +o2d+8 +o2d-0 +o2d-8 +o2dC +o2dZ1 +o2d[ +o2dc +o2d{ +o2e +o2ek +o2eo1]o1& +o2f +o2fi45 +o2fr +o2f} +o2g +o2g$# +o2gD3 +o2gD6 +o2g^a +o2gd +o2gi4k +o2go58 +o2gx34o1& +o2gx51 +o2g{ +o2h +o2h$d*15 +o2h*26 +o2hT5 +o2hr +o2hszS +o2i +o2i$j +o2i*40 +o2iL3 +o2iT0 +o2iZ2 +o2iZ4} +o2i] +o2isaA*31 +o2j +o2j*60 +o2j-5 +o2jZ1 +o2j^8 +o2k +o2k$dZ4 +o2k$p*21 +o2k*01 +o2k[ +o2kc +o2ko2i[ +o2ksus +o2kx06Z1 +o2l +o2l$k +o2l'6 +o2l*42 +o2l-8 +o2lT0 +o2lZ1 +o2ls4f +o2lsxZx02 +o2lx31 +o2m +o2m$2 +o2mD3 +o2m^d +o2mc +o2n +o2n-4 +o2nC +o2nZ1 +o2n[ +o2ndx58 +o2nr +o2nx32 +o2nz3 +o2n} +o2o +o2o+2R5 +o2o^@ +o2o^D +o2oc +o2oi2j +o2oo0p +o2p +o2p*37 +o2p*51 +o2p+3 +o2pC +o2pD4D0 +o2px35 +o2q +o2q$4 +o2q]i3i +o2qo5r +o2q{[ +o2r +o2r$. +o2r+3x53 +o2rZ3 +o2r^v +o2rc +o2rf +o2rk +o2rq +o2rsc@ +o2rz3 +o2r}[ +o2s +o2s] +o2sc +o2sp1 +o2su +o2sx81 +o2t +o2t$e +o2t+3 +o2t+4 +o2tZ2 +o2tZ3 +o2t^P*67 +o2tk +o2to7b +o2u +o2u$# +o2uc +o2ud +o2ui3y +o2uro1d +o2v +o2v$Bi0m +o2vd +o2vz2 +o2w +o2w+4 +o2wZ1 +o2w^6 +o2w^8 +o2w^n +o2wi0_} +o2wi0j +o2wi1L +o2wk +o2wx48 +o2x +o2x*01 +o2x^xx54 +o2xr +o2y +o2yT0 +o2yk +o2yo3k +o2z +o2z$ +o2z*21 +o2zC +o2zT4 +o2zx53 +o2{ +o2{L0 +o2| +o2|$gx2A +o2|^j +o2|o8Hx15 +o2|s1z +o2}o0l +o3 +o3 *53 +o3 [ +o3 c +o3 x21 +o3 } +o3! +o3!$* +o3!-2 +o3!-4 +o3!Z1o53 +o3!i6C +o3" +o3"s"K +o3"ss/ +o3# +o3#+5 +o3#o0T +o3$ +o3$D2 +o3$Z2 +o3${ +o3% +o3%D1 +o3& +o3&-2l +o3&^1T2 +o3' +o3( +o3(Cx32 +o3) +o3* +o3*{ +o3+ +o3+D6 +o3+o0w*35 +o3, +o3,$#'5 +o3,R0 +o3- +o3-*20 +o3-Z3 +o3-[ +o3-x5B +o3-z4x07 +o3. +o3.*01 +o3/ +o3/x16u +o3/x45 +o30 +o30*63 +o30@a +o30R1 +o30r*30 +o30t +o31 +o31R7 +o31T3x61 +o32 +o32*32u +o32[ +o32i3k +o32l^c +o32p1 +o32t +o32z3 +o33 +o33-2 +o33d +o33o7@ +o33s9f +o34 +o34^M +o34l +o34s2n +o34t +o34{ +o35 +o35'5sw3 +o35Z2 +o36 +o36^j +o36o3Y +o36sa0 +o37 +o37*20 +o37@2 +o37@y +o37R0 +o37i1n +o37o11 +o38 +o38$6R3 +o38$M +o38Z2u +o38qT5 +o38x72 +o38z5o2= +o39 +o39*02 +o39*71 +o39Co3! +o39d +o3: +o3:*15^8 +o3:^s +o3; +o3;'6 +o3;*20 +o3;k +o3 +o4>z3*57 +o4? +o4?@9 +o4?o7A +o4@ +o4@$! +o4A +o4Ac +o4Ao1z +o4Ao4$ +o4B +o4C +o4Ct +o4D +o4DDA +o4Dc +o4Dx21 +o4E +o4Et +o4F +o4Fz3 +o4G +o4H +o4I +o4Ic +o4Iu +o4J +o4K +o4K'6 +o4KL5 +o4K[ +o4Kl +o4Ku +o4L +o4M +o4M$7 +o4Mu{ +o4N +o4Nt +o4O +o4OZ5 +o4O^I +o4P +o4P^0'B +o4Pl +o4Q +o4R +o4R} +o4S +o4Sl +o4T +o4T+1 +o4UZ2 +o4Uc +o4V +o4Vl +o4Wi3Q +o4X +o4Xt +o4Y +o4Y$E +o4YR2 +o4Yc +o4Z +o4Z*13i27 +o4Zo30^! +o4[ +o4[i0s} +o4[o4mr +o4\o2[T2 +o4\o3= +o4\u +o4^ +o4^l +o4_ +o4_o7s +o4_sp> +o4` +o4a +o4aZ2 +o4aZ2L6 +o4at +o4ax21 +o4b +o4b*42 +o4b@mz1 +o4bZ2 +o4b[^N +o4bz1 +o4bz2 +o4b} +o4c +o4c*67 +o4c+3 +o4c+4 +o4c^{^Q +o4cc +o4cl +o4co0@ +o4cp1 +o4cs0s+2 +o4cu +o4cx02 +o4d +o4d$k +o4d*07 +o4d*53 +o4dZ2 +o4do3j +o4dx71 +o4e +o4eD5 +o4e^j +o4ed +o4esTw +o4f +o4f$q^r +o4f$s +o4f*04 +o4fD6 +o4fo4J*20 +o4frZ1 +o4g +o4g$u +o4g-3 +o4g] +o4gu +o4h +o4h*51 +o4h*71x37 +o4hK] +o4hi8ux31 +o4i +o4iT1 +o4iZ1+4 +o4i^8z1 +o4io6! +o4ix31 +o4j +o4jR1 +o4ji2H$a +o4jo6Yc +o4jo80 +o4jp1 +o4jx31 +o4k +o4k*35 +o4k+5 +o4k+6 +o4k[ +o4ki62 +o4l +o4lD3 +o4lo1k +o4lo3r +o4lu +o4lx53 +o4m +o4m'6x32 +o4m*07 +o4m+0 +o4mqx56 +o4mx67 +o4n +o4o +o4o*03ssl +o4o*24 +o4o+6 +o4oc +o4op1 +o4or +o4p +o4pD1 +o4pk +o4p} +o4q +o4qD5 +o4q[ +o4r +o4r*10 +o4r*35t +o4r^o +o4rp1 +o4s +o4s$Ax25 +o4s*41 +o4s-0 +o4sR0 +o4sl +o4st +o4t +o4t*45 +o4t*73 +o4tC +o4tD5 +o4tR3 +o4tZ1 +o4tZ2 +o4tZ3 +o4t^M +o4t^Zu +o4t^b +o4tx21 +o4u +o4u*21 +o4u^ki2G +o4ut +o4ux02 +o4v +o4v'6 +o4v*15 +o4vi0x +o4vx59 +o4w +o4wZ1 +o4w^l +o4wi2m +o4x +o4x*46 +o4x+2 +o4x-9 +o4xZ1 +o4xZ4 +o4xc +o4xp1 +o4xx21 +o4y +o4y+0l +o4y^( +o4yo2k +o4yu +o4yz2 +o4z +o4zL8t +o4zx56 +o4z{l +o4{ +o4{-4 +o4| +o4} +o5 +o5 '6 +o5 +6 +o5 -0 +o5 D3 +o5 Z1 +o5 sdhx13 +o5 x02 +o5! +o5!'6D1 +o5!*30 +o5!Z2 +o5!i4e +o5!o2l +o5!sgd +o5"$" +o5# +o5#x62 +o5$ +o5$Z3 +o5% +o5& +o5&^B*01 +o5' +o5'+0 +o5( +o5(i5n +o5) +o5* +o5*Z2 +o5*Z3 +o5*^o +o5+ +o5+*67 +o5+o1&k +o5, +o5,@8 +o5,L2 +o5,Z2 +o5,p1 +o5,x61 +o5- +o5-'8 +o5-*40 +o5-x03 +o5-x83 +o5. +o5.@w +o5.Z2 +o5.Z4 +o5.x41 +o5/ +o5/satz3 +o50 +o50$y +o50*12 +o50-7 +o50Z1 +o50Z3 +o50^b +o50^f +o50d +o50l +o50o5!t +o51 +o51$k +o51l +o51x13 +o51z5 +o52 +o52$x +o52Z1 +o52Z3 +o52Z4 +o52l +o52o1E +o53 +o53$e +o53D8 +o53^s +o53u +o53}^g +o54 +o54*02 +o54Z3 +o54p1 +o54u +o54x41 +o55 +o55*78 +o55+6 +o55+7 +o55R0 +o55Z1 +o55Z5 +o55l +o55t +o55tZ1 +o56 +o56$6 +o56-6 +o56@w +o56L4 +o56o8s +o57 +o57$v +o57*13 +o57R4@4 +o57^l^d +o57u +o58 +o58'7 +o58*65 +o58Z4 +o58[ +o58p1 +o58z2 +o59 +o59Z2 +o59d +o5; +o5;*57*52 +o5< +o5<*14s +o5? +o5?'6 +o5?i6? +o5?kC +o5@ +o5@*24 +o5A +o5Ac +o5Al +o5B +o5Bl +o5C +o5CT6 +o5Cl +o5D +o5D*8A +o5Dx81 +o5E +o5E@0D2 +o5ED7 +o5ET3 +o5Ex02 +o5F +o5FZ1 +o5G +o5GD6 +o5H +o5Hc^4 +o5Hdl +o5Hx31 +o5I +o5I$z +o5I-4 +o5IZ1 +o5J +o5K +o5Ki3# +o5Kl +o5Ku +o5Luz1 +o5M +o5MD1 +o5N +o5N+2t +o5Nx02 +o5Nx52$: +o5O +o5O+0 +o5Oc +o5P +o5PZ2 +o5Pi2ii5} +o5Q*15 +o5Q*43 +o5Qx24T1 +o5R +o5R@1 +o5RZ1 +o5S'6 +o5T +o5Tc +o5To8gx35 +o5Tx02+1 +o5U +o5Ui3E^, +o5Uo1B +o5V +o5V^n +o5Vo8{ +o5W +o5W[ +o5Wt +o5X +o5Z +o5Zc +o5Zo5t +o5Z{o6" +o5[ +o5\o3IZ3 +o5^ +o5_ +o5_*15 +o5_*24 +o5_^Q +o5_o66 +o5_u +o5` +o5a +o5a*68 +o5a+9 +o5aD6 +o5aZ1 +o5a[ +o5a^` +o5ad +o5ax32 +o5b +o5bi62 +o5c +o5c-0 +o5cC +o5cx7Bx07 +o5cz2 +o5d +o5d'9 +o5d*87 +o5dd +o5di16 +o5dssF{ +o5dz2 +o5e +o5e$2 +o5e*37 +o5e@z +o5eK +o5eZ1 +o5ei2U +o5ex61 +o5ex67 +o5f +o5f$z +o5f-4 +o5fZ3 +o5fx74 +o5f}{ +o5g +o5g+7 +o5gZ1 +o5gx02 +o5gz1 +o5h +o5h*43 +o5hZ2 +o5hc +o5hi4% +o5hi5C +o5h{ +o5i +o5i$h +o5i'B +o5iD4 +o5iR3 +o5ii6r +o5io6n +o5j +o5j*50 +o5j+0 +o5jZ1+8 +o5k +o5k*42 +o5kD7 +o5kp1 +o5kx04 +o5kz4 +o5l +o5l+3 +o5l+4 +o5l+6 +o5lD1 +o5lZ1 +o5lc +o5li6s +o5m +o5m-6 +o5mD4C +o5mT6 +o5m^Dl +o5mi5_ +o5mk +o5n +o5n-3 +o5n@oo5u +o5nT1z1 +o5nd +o5nl-5 +o5n{ +o5o +o5o$0c +o5o*36z3 +o5o*52 +o5ot +o5oz2 +o5p +o5pC$g +o5pZ1} +o5pc +o5po1T7 +o6? +o6?*45 +o6@ +o6@$1 +o6@'8 +o6@+6 +o6A +o6AT0 +o6A[ +o6Ac +o6B +o6BD3 +o6Bx32 +o6C +o6C$sl +o6Ct +o6D +o6E +o6Eo4. +o6F +o6F+7 +o6Fx05 +o6G$B +o6Gi4=l +o6Gsy2x23 +o6HZ1k +o6I +o6I^: +o6J +o6J] +o6Jrl +o6KT6x32 +o6L +o6L*75t +o6LC +o6M +o6M$2 +o6M-7 +o6Mc$h +o6Mu +o6N +o6Nl +o6O +o6O-5 +o6OT3 +o6Oc +o6P +o6P$U +o6PD8 +o6Q +o6Q$7 +o6Q-7 +o6R +o6R+1 +o6RK +o6S+3 +o6SZ2 +o6T +o6TT7 +o6Tc +o6Tdx29 +o6Ti6Y +o6Tu +o6U+7 +o6Ux1A^Y +o6V +o6V$I +o6Vx74 +o6W +o6X +o6X$ax27 +o6Y +o6[x42 +o6^ +o6^$6^U +o6^Z1 +o6^sao +o6_ +o6_$0 +o6` +o6a +o6a*36 +o6ao4y +o6ax42 +o6b +o6b$m +o6bZ3 +o6bp1 +o6c +o6c'A +o6c[ +o6c[+5 +o6cl +o6co7fo4y +o6d +o6d+4] +o6di5S +o6dz2 +o6e +o6e*02 +o6e*86 +o6e+5 +o6e-1 +o6eZ4 +o6e[ +o6e^%i7; +o6eo2n +o6eu +o6f +o6f$+Z2 +o6f*42 +o6f-4 +o6f-4+3 +o6fo8c +o6fx13 +o6fx24 +o6fz1 +o6f{[ +o6g +o6gl$b +o6go5ou +o6h +o6h'8 +o6h*34 +o6i +o6i+8 +o6i[ +o6ic +o6id +o6ix12 +o6i{ +o6j +o6j$8 +o6j$XC +o6j'5$o +o6jD8 +o6jc+2 +o6jx02 +o6k +o6k$s +o6k[ +o6kr +o6ksk^ +o6kx12 +o6l +o6l*14 +o6l+3 +o6l-8 +o6li4zx53 +o6ll +o6lx84 +o6lz1 +o6m +o6m$. +o6m*43 +o6mZ1'8 +o6mc +o6m} +o6n +o6n$4 +o6n$y +o6n+3 +o6nD7 +o6n[ +o6no7- +o6o +o6o$d +o6o*61 +o6oC +o6oZ1 +o6od +o6ox13o3v +o6p +o6p$s +o6p*56 +o6p+9 +o6pc +o6pi3/ +o6po5l +o6pr +o6q +o6q{ +o6r +o6r'9 +o6r@k +o6r[ +o6s +o6s^A +o6sc +o6sd +o6si6#T6 +o6ssdy +o6sx01 +o6sx71 +o6t +o6t*45 +o6t-5 +o6tD4 +o6tl +o6tx02 +o6tx03 +o6t} +o6u +o6u+1 +o6u-5 +o6v +o6v*46o6G +o6vo5n +o6w +o6w+7 +o6wT2Z3 +o6w] +o6wx71 +o6x +o6xZ1 +o6xt +o6xx51 +o6y +o6y$k +o6y@s +o6yl +o6ys04 +o6ysnj +o6yx02 +o6z +o6zT1 +o6zZ3 +o6zl[ +o6{x56@i +o6|s|d +o7 +o7 LAx17 +o7 x01 +o7 x02 +o7! +o7!-5 +o7!Z1 +o7" +o7"T3 +o7# +o7#*76 +o7#Z2 +o7#u +o7#} +o7$ +o7$'8 +o7$Z2 +o7$o4Qx24 +o7$s$b +o7% +o7%x51 +o7& +o7' +o7'T9 +o7( +o7) +o7* +o7+ +o7+$,x4A +o7+D9 +o7+xB2x64 +o7, +o7,*64-5 +o7,c +o7- +o7. +o7.-2 +o7.D0 +o7.z2 +o7/ +o7/[Z3 +o7/t +o7/{ +o70 +o70$9 +o70$k +o70Z1 +o70^a +o70^i +o71 +o71$7 +o71+6 +o71-6 +o71-9 +o71Z1u +o71Z2 +o71i0{ +o71i7vZ1 +o71o1t +o71r +o72 +o72$e +o72*43 +o72D3i1c +o72Z2 +o72sln +o73 +o73$+ +o73*36 +o73[ +o73o89 +o74 +o74o85 +o74o8i +o74s3_ +o75 +o75*68 +o75-9 +o75@1'B +o75t +o75x25 +o76 +o76D4 +o76K +o76Z1 +o76] +o76^1 +o76s6z +o76sgd +o77 +o77*10 +o77*A7 +o77-1l +o77Z1 +o77^7 +o77l +o77z1 +o78 +o78$h +o79 +o79*56 +o79Z1 +o79l +o79s.n +o79t +o79x51Z4 +o7; +o7;i6x +o7< +o7<*67 +o7c +o7? +o7@ +o7A +o7A@+ +o7B +o7Bo2r +o7C +o7CCo6j +o7CL3 +o7D +o7Dx49i1v +o7E +o7F +o7G +o7GT6 +o7H +o7HD2 +o7I +o7J-0 +o7K +o7K$bx53 +o7Kt +o7Kx13 +o7L +o7L^` +o7Lx08i5f +o7L} +o7M +o7MD8 +o7Mx03 +o7M{ +o7O +o7Oux03 +o7P +o7Q +o7QZ1 +o7Qc +o7Qx36$P +o7S +o7T +o7Tr +o7U +o7Uc +o7W +o7W'9 +o7X +o7Y +o7Yl +o7Yt +o7Z +o7Z^L +o7\ +o7] +o7]i4. +o7^ +o7^o6D +o7_ +o7_T0 +o7_x12 +o7` +o7a +o7a*74 +o7a+8 +o7ao3Dx13 +o7asr3x42 +o7b +o7b$jx26 +o7b*46 +o7b+4 +o7bZ1 +o7bz2 +o7c +o7c*75 +o7cK +o7cZ1 +o7cZ4Z2 +o7co4a +o7cx34 +o7d +o7d$1 +o7d$l +o7dL4 +o7dp1l +o7e +o7e*75 +o7ex43 +o7f +o7f*23D8 +o7fsn, +o7ft +o7g +o7g$o +o7g*98 +o7g] +o7gu +o7h +o7h*56 +o7ho8i +o7i +o7i*25+3 +o7i+4 +o7ic$l +o7ii3Xx15 +o7il +o7j +o7j{ +o7k +o7k*63 +o7kr +o7ksbr +o7l +o7l-3-7 +o7lD8 +o7l^+$o +o7m +o7m$1 +o7m+8 +o7m-8 +o7mx81 +o7n +o7n$1 +o7nZ2-4 +o7nt +o7o +o7o$2D2 +o7o$to4f +o7o'A +o7o-3 +o7oi9=x86 +o7oo0dD8 +o7or +o7ox34 +o7p +o7q +o7q*67 +o7q*80T6 +o7r +o7rt +o7rx16 +o7rx41 +o7rx82 +o7rz3 +o7s +o7s*57 +o7s+2 +o7sc +o7si6t +o7sshe +o7sx51 +o7t +o7tL8 +o7tx32 +o7u +o7u$p +o7u*67 +o7uo0M +o7ux04^p +o7v +o7v[ +o7vi7t +o7w +o7w-5 +o7wZ3 +o7wt +o7x +o7x*46 +o7y +o7y*12 +o7y^j +o7yx0Bs 7 +o7z +o7zD4*56 +o7zl +o7zo8o +o7} +o7}$4 +o8 +o8 '9 +o8 *01k +o8 D7 +o8 x02 +o8 x06 +o8! +o8![ +o8" +o8# +o8#+9 +o8#D7 +o8#D9 +o8$ +o8$x74c +o8% +o8%x31 +o8& +o8&$& +o8&R8 +o8&z1x07 +o8( +o8(c +o8(x0B$r +o8) +o8)T4 +o8* +o8*K +o8+ +o8+Z1 +o8- +o8-Z1 +o8. +o8.$1 +o8/ +o80 +o80+7 +o80T0 +o80[ +o80i0* +o80o7r +o81 +o81'9 +o81*63 +o81i1e +o81scw +o81sub +o82 +o82$9 +o82*79 +o82x21 +o82} +o83 +o83*65 +o83-4 +o83o3e +o83tx64 +o83z1 +o84 +o84+6 +o84Z1 +o84o4c +o84t +o84x12 +o85 +o85*75 +o85*87 +o85*97 +o85+3 +o85o7y +o85x62 +o86 +o86T9 +o86Z2 +o87 +o87+0 +o87+6 +o87Z3 +o87x52 +o87xA2 +o88 +o88$3 +o88+9 +o88Z2 +o88o9! +o89 +o89+9 +o89Z1 +o89Z2 +o89sw:sa5 +o8: +o8; +o8< +o8<*78 +o8 +o9? +o9?x13 +o9@ +o9@ux06 +o9A[ +o9Ao0tx35 +o9C +o9E +o9El +o9Fi9nl +o9H +o9H^qx36 +o9Hl +o9I +o9JZ1 +o9Yc +o9Yl +o9] +o9_ +o9_x34 +o9` +o9a +o9ac +o9ax43 +o9b +o9c +o9cD7 +o9d +o9d$6 +o9dZ2 +o9dl +o9dx63 +o9e +o9ex63 +o9ex72 +o9f +o9g +o9h +o9i +o9i$l +o9iD0 +o9ii4i +o9io7Qx53 +o9j +o9j+8 +o9jx14 +o9k +o9kZ2 +o9ki0s +o9ko8d +o9l +o9lx52 +o9lx53 +o9m +o9mx09 +o9n +o9no7v +o9o +o9ot +o9oxA3 +o9p +o9q +o9r +o9r$i +o9rx71 +o9s +o9s$e +o9s+3 +o9sD3 +o9t +o9tu +o9tx62 +o9u +o9ux36x41 +o9v +o9w +o9wl +o9wx42 +o9x +o9xD6 +o9y +o9y*98 +o9y-5 +o9z +o9zT0 +o9|x15 +oA! +oA!x12 +oA$ +oA* +oA+ +oA.[ +oA/ +oA0 +oA1 +oA1+9 +oA1D5 +oA1D8 +oA1l +oA2 +oA2$! +oA2*87 +oA2xB2 +oA3 +oA3'B +oA3Z1 +oA4 +oA4x28 +oA5 +oA6 +oA7 +oA7u'B +oA8 +oA8x19 +oA8} +oA9 +oA9D8 +oA; +oA@ +oA@Z3L1 +oAB*74x5B +oAD +oAEx06 +oAOc +oAP +oAR +oARl +oAXx84x24 +oAZsZ. +oA[x16 +oA^ +oA_x05 +oAa +oAax02 +oAb'5[ +oAc +oAcx07 +oAd +oAe +oAg +oAgx13 +oAh +oAi +oAj +oAl'B +oAm +oAn +oAo +oAo+2x15 +oAox72 +oAp'B +oAr +oArx14 +oAs +oAsD5 +oAsl +oAsx28 +oAsx42 +oAt +oAu +oAv +oAwx14 +oAwx37 +oAx +oAy +oAyx51D5 +oAz +oAzc +oB x0A +oB!c +oB* +oB+ +oB/R5'8 +oB0 +oB0+B +oB0x47 +oB1 +oB2 +oB2D9 +oB2i6h'9 +oB3 +oB4 +oB5 +oB5*AB +oB5DA +oB6 +oB6D5 +oB7 +oB7l +oB8 +oB8Z1 +oB9 +oB9Z1 +oB9x05 +oBCx65 +oBKoBC +oBNcx48 +oBO+1x84 +oBSl +oBX +oB_x26 +oB_xB2s91 +oBa +oBc +oBcx56x14 +oBd +oBdx46 +oBe +oBf +oBfx26 +oBgx29 +oBi +oBk +oBk^Zo3H +oBn +oBn[x84 +oBnx06 +oBo +oBox36 +oBr +oBs +oBu +oBv +oBy +oByx26 +oByx38 +oBz +p1 +p1$"l +p1$- +p1$4 +p1$8 +p1$< +p1$= +p1$D +p1$I +p1$Jz5 +p1$Lo6z +p1$M +p1$a +p1$b +p1$e +p1$fx17 +p1$i +p1$j +p1$j*03 +p1$k +p1$l +p1$r +p1$s +p1$v +p1$vx73 +p1$yD2 +p1'4^! +p1'6 +p1'6Z2 +p1'6o47 +p1'7 +p1'7*32 +p1'7+1 +p1'7sk{ +p1'8 +p1'9 +p1'9[ +p1'Az1 +p1*01 +p1*12 +p1*15L3 +p1*16 +p1*17 +p1*18 +p1*2A*0B +p1*37 +p1*39x7A +p1*43 +p1*46 +p1*50x25 +p1*51 +p1*52 +p1*56i7# +p1*56u +p1*63 +p1*65i0E +p1*67 +p1*69 +p1*70 +p1*71 +p1*72 +p1*76x83 +p1*7A +p1*80 +p1*83 +p1*89x2B +p1*8B +p1*8Bx92 +p1*91 +p1*95R7 +p1*96x47 +p1*96x98 +p1*98 +p1*B6x87 +p1+0 +p1+1^t +p1+2 +p1+4 +p1+5 +p1+6x13 +p1+7 +p1+9 +p1+B +p1-1 +p1-3 +p1-4 +p1-5 +p1-6 +p1-7 +p1@2 +p1@9 +p1@9'9 +p1@a +p1@ic +p1C[ +p1D1 +p1D3'9 +p1D3-6 +p1D4o06 +p1D6 +p1D6i4, +p1D9 +p1K[ +p1Kx25 +p1L1 +p1L4 +p1LAx56 +p1R1 +p1R9 +p1T0 +p1T2xB1 +p1T6 +p1T7 +p1TB@2 +p1Z1 +p1Z1*30 +p1Z1x05 +p1Z2Z4 +p1Z4z5 +p1[x65 +p1] +p1]k +p1^ +p1^! +p1^# +p1^#z2 +p1^&^/ +p1^.c +p1^3x4A +p1^8 +p1^< +p1^IT1 +p1^P +p1^Q +p1^V +p1^] +p1^]x2A +p1^a +p1^c] +p1^d +p1^ex45 +p1^j +p1^l +p1^p +p1^| +p1c +p1cD8 +p1cx08 +p1i02 +p1i1tx41 +p1i23 +p1i2U +p1i2n +p1i4 +p1i4% +p1i4/ +p1i49 +p1i4x06 +qi0Ux2A +qi0l +qi0y +qi2&'6 +qi24 +qi2[ +qkx47 +ql +qo07 +qo0_ +qo0b +qo0s +qo1Fx26 +qo1k +qo2O +qo2y +qo4y +qo58 +qo5Yx2B +qo6e +qo7**27 +qo77 +qo7n[ +qo8S +qo9.x7A +qoBa +qq +qr +qr'6 +qr'8 +qsX* +qsbB +qsbd +qsf4 +qss! +qt +qtx52 +qux61 +qx03 +qx03^u +qx03o32 +qx04 +qx05 +qx08 +qx09 +qx09*46 +qx0B +qx12 +qx13 +qx16k +qx16x52 +qx17 +qx17-1 +qx18 +qx19 +qx1A +qx1B-2 +qx1Bz3 +qx23 +qx25 +qx26 +qx27 +qx28 +qx29 +qx29o6p +qx2A +qx34 +qx35 +qx35*70 +qx36 +qx37 +qx37$y +qx38 +qx39 +qx3A +qx3B +qx3Bz4 +qx41s21 +qx42C +qx45L3 +qx46 +qx47 +qx47x12 +qx48 +qx49^s +qx4A +qx4B +qx51+5 +qx54 +qx54C +qx56 +qx59 +qx5A +qx5B +qx62 +qx63 +qx64*07 +qx65 +qx65x31 +qx68 +qx6B +qx74 +qx78 +qx82 +qx83 +qx83] +qx83x2A +qx84 +qx85 +qx86 +qx8B +qx92x73 +qx94 +qx95 +qx96 +qxA1*0B +qxA1x81 +qxA3 +qxA5 +qxA9 +qz1 +qz1x32 +qz2 +qz3 +qz3xB1 +q{D3 +q{x18 +q{x19 +q} +q}'6 +q}*80 +r +r$! +r$$ +r$& +r$*i4V +r$+f +r$2 +r$; +r$= +r$? +r$L +r$] +r$b +r$c +r$g +r$i +r$m +r$o +r$osoU +r$p +r$qZ1 +r$r +r$w +r$z +r'2 +r'5 +r'6 +r'A +r*02 +r*02K +r*02z3 +r*05 +r*07*64 +r*09 +r*10 +r*12*60 +r*14 +r*14D5 +r*15 +r*23$j +r*30 +r*34 +r*34[ +r*35[ +r*36 +r*40z2 +r*45 +r*45] +r*45^p +r*52 +r*53 +r*56 +r*57 +r*61$R +r*65x32 +r*68 +r+0 +r+4R0 +r+5 +r+6 +r+8 +r-0c +r-1*61 +r-2 +r-2^k +r-A +r@g +r@h +rC +rC$J +rC'6 +rD2 +rD3 +rD4 +rD5R8 +rD9 +rKd +rKi5e +rKz2 +rL2 +rL2*15 +rL5 +rL5L5 +rL6^q +rL7 +rL9 +rR0 +rR2 +rR3 +rR4C +rR4} +rR6 +rR8so% +rT0 +rT1 +rT7 +rZ1L4 +rZ1k +rZ1o0O +rZ2 +rZ2*05 +rZ2D3 +rZ2^- +rZ2x73 +rZ3 +rZ3Z4 +rZ3i4W +rZ3t +rZ4 +rZ4-4 +rZ5 +rZ5x09 +r[ +r[*30 +r[*54 +r]K +r]o0v +r^! +r^$ +r^%o0c +r^%u +r^3 +r^5 +r^7T0 +r^8 +r^8{ +r^9 +r^; +r^@ +r^A^/ +r^B +r^H +r^I +r^M +r^S +r^U +r^\ +r^a +r^k +r^l +r^m +r^q +r^s +r^u +r^w +r^z +rc +rcK +rco6Q +rd*74 +rf +rfx3A +ri0% +ri06 +ri0=z3 +ri0O^R +ri1@ +ri1S +ri1T+4 +ri1f +ri1k +ri1r +ri23 +ri2P +ri2r[ +ri2sZ4 +ri2u +ri3.T4 +ri35 +ri39z2 +ri3S +ri3i +ri3q +ri3t +ri4fz1 +ri4h +ri4v +ri5: +ri5E +ri5_ +ri5f^? +ri5m$q +ri6K +ri7l +ri7u +rk^! +rkz2 +rl +rlc +ro0" +ro0*x13 +ro06 +ro07 +ro0C +ro0b +ro0e +ro0g +ro1F +ro1ip1 +ro2& +ro2f +ro3- +ro3W +ro3Y +ro3fZ4 +ro3p +ro3s +ro41 +ro43 +ro4t +ro51 +ro52 +ro6U +ro6zz2 +ro7[ +roA\ +rp1$J +rp2 +rp3T7 +rq +rqz1 +rr +rro3c +rs0+ +rs0- +rs0l +rs1 +rs9! +rsJ7 +rsa3 +rsb9 +rsbq +rsil +rspQZ1 +rsra +rstE +rstk +rstp +rswg +rt +rt*40 +rx04 +rx05 +rx06 +rx07 +rx09 +rx15 +rx32 +rx37 +rx41t +rx42 +rx51 +rx51$2 +rx51K +rx54 +rx62 +rx64 +rz1 +rz1D6 +rz1i4f +rz2 +rz3 +rz3-1 +rz3R6 +rz3T1 +rz4 +rz5D1 +r{ +r{*04 +r{D3 +r} +r}f +s $x28i2a +s - +s . +s 5 +s 5$8 +s _ +s d +s g +s l +s y +s!+ +s!- +s!. +s!0Z5 +s!2 +s!5 +s!7 +s!8 +s!I +s!J +s!L +s!Lz1 +s!X +s!^ +s!co60 +s!k +s"! +s#! +s#$z2x25 +s#' +s#* +s#- +s#-Z5 +s#. +s#/ +s#1 +s#X +s#^ +s#_T1 +s#b +s#t +s#u +s#| +s$" +s$# +s$+ +s$- +s$7 +s$@ +s$M +s$S +s$^ +s$_ +s$b +s$d +s$z +s%# +s%* +s%0u +s%1 +s%9 +s%P +s&! +s&. +s&^ +s&m +s'z +s(& +s(* +s(E +s(}o6! +s*# +s*$ +s*% +s*+ +s*. +s*4 +s*8 +s*9 +s*= +s*? +s*@ +s*A +s*^ +s*_ +s*a +s*d +s*q +s*t +s*x +s+ +s+" +s+# +s+- +s+5 +s+8 +s+= +s+G +s+L +s+b +s+d +s,1+0 +s,9 +s,rx34 +s,s +s,z +s- +s- DA +s-! +s-$ +s-% +s-& +s-* +s-/ +s-0 +s-7'8 +s-9 +s-@ +s-A +s-J +s-Qq'7 +s-T +s-^ +s-_ +s-_$1 +s-ou +s-s[ +s-z +s.$ +s.* +s., +s.- +s./ +s.6 +s.8 +s.9 +s.; +s.C +s.a$i +s.cD6 +s.e +s.f +s.g +s.l +s.m +s.o +s.p +s.x +s.x'7 +s.zlx51 +s/ +s/? +s/B +s/i +s/y +s0 +s0 q +s0 z2 +s0! +s0"'7i0B +s0#c +s0%x31 +s0& +s0) +s0*+6 +s0+ +s0+c +s0,D0 +s0,D7 +s0- +s0-+6 +s0. +s0/ +s01o17 +s02 +s03 +s03*87 +s03p1 +s04 +s05 +s05+8 +s06 +s06x29+1 +s07 +s07*13 +s08$3 +s08+7 +s09 +s09x81 +s0< +s0@ +s0A +s0B +s0C +s0D +s0E +s0F +s0Fx37 +s0Gu +s0J +s0K +s0M +s0PC +s0R@i-3 +s0S +s0SZ2l +s0T[T1 +s0UD3t +s0X +s0X'7D3 +s0Y +s0Z +s0\ +s0^ +s0^Z1 +s0_ +s0_[ +s0` +s0a +s0aT9 +s0b +s0c +s0d +s0e +s0f +s0g +s0g[ +s0h-0 +s0i +s0j +s0j*04 +s0k +s0k-4 +s0m +s0m[C +s0mp1 +s0mz2 +s0n +s0o +s0oc +s0q +s0q-4 +s0qd +s0r +s0rL1 +s0s +s0v +s0w +s0x +s0xc +s0y +s0y$a +s0z +s0zx06 +s0| +s1 +s1 [ +s1! +s1!Z2 +s1!Z2$0 +s1# +s1#'8 +s1#^d +s1$ +s1% +s1& +s1*D4 +s1+ +s1- +s1. +s1/ +s10 +s12 +s12@e +s12oA0 +s13 +s13D3 +s13Z1 +s14 +s15 +s15-2 +s15shk +s16 +s16l +s17 +s17@b +s18 +s18*85 +s18L6 +s18Z1 +s18u +s18x08$? +s18x26 +s19 +s19Z1 +s1; +s1= +s1=i04 +s1>z2 +s1? +s1?T7o0C +s1@ +s1A +s1B +s1Bt +s1D +s1E +s1F +s1I +s1K +s1Kc +s1L +s1NuZ2 +s1P +s1Rq +s1S +s1U +s1U'5@b +s1V +s1W +s1X +s1^ +s1_ +s1` +s1a +s1asgF +s1c +s1cR0 +s1d +s1e +s1eoAd +s1f'B +s1g +s1gD0 +s1h +s1i +s1k +s1kd +s1l +s1m +s1n +s1o +s1p +s1pu +s1q +s1ql +s1r +s1r^1{ +s1rz4 +s1s +s1t +s1u +s1u*37 +s1v +s1v*21 +s1w +s1w-4 +s1w-9 +s1wr +s1x +s1y +s1y{ +s1z +s2 +s2 'B +s2! +s2!Z4@c +s2!^a +s2# +s2$ +s2* +s2**5Ax43 +s2*Z2 +s2*r +s2+ +s2, +s2- +s2. +s20 +s20$! +s21 +s21*82'6 +s21p1x36 +s23 +s23Z2 +s23d +s24 +s25Z1 +s25o2_ +s25o3m +s26 +s26l +s27 +s27C +s28 +s28T0 +s28Z1 +s29 +s29$e +s2< +s2? +s2@ +s2@+0 +s2A +s2B +s2Bu +s2Ddx1A +s2F +s2Gcx51 +s2H +s2K +s2L +s2M +s2Ql +s2T +s2U^Z +s2W +s2X +s2Z +s2^ +s2_ +s2a +s2ao1f +s2b +s2c +s2c[ +s2d +s2e +s2eq +s2f +s2g +s2h +s2i +s2i^4'6 +s2j^Y^5 +s2k$h +s2k'5 +s2l +s2lc +s2p +s2s +s2t +s2ux32^1 +s2v +s2v[ +s2w +s2y +s2y$Rx46 +s2yD7D6 +s2z +s2zx61 +s3 +s3! +s3# +s3$ +s3% +s3'^2Z1 +s3+ +s3++3 +s3, +s3.Z4 +s3.u +s30 +s30*65 +s31 +s31Z2 +s31o77 +s32 +s32^i +s34 +s34$8 +s34c +s35 +s36 +s36u +s37 +s37L1 +s38 +s38+8 +s38c +s38x52 +s39 +s3?Z1 +s3@ +s3A +s3At +s3E +s3F +s3Gcx92 +s3Hz1 +s3K-5 +s3L[ +s3S +s3Tf +s3V +s3W+5D5 +s3X +s3Y +s3[ +s3^ +s3_ +s3`l +s3a +s3b +s3c +s3d} +s3e +s3e$7 +s3e+5 +s3f +s3fx03o48 +s3gx32 +s3h +s3iD7 +s3j +s3k +s3l +s3l*65 +s3m +s3o +s3q +s3qp1 +s3r +s3s[ +s3s^c +s3t +s3tr +s3u +s3ui1g +s3x +s3y +s3z +s3zi3ti0K +s3} +s3}R5 +s4 +s4 Z1 +s4 i0z*15 +s4$ +s4% +s4& +s4&i1o'7 +s4*u +s4+Z3 +s4+c +s4, +s4- +s4. +s4/Z2 +s40 +s41 +s42 +s42Z1 +s43 +s43s./ +s45 +s45s69 +s46 +s47 +s47q +s48 +s49 +s49*07 +s49o0l +s4:o5sc +s4A +s4C +s4F +s4G +s4Hx02^w +s4I +s4Mx27^V +s4O +s4R +s4X +s4\ +s4^i5mx07 +s4_ +s4_x71 +s4a +s4b +s4e +s4f +s4gZ1 +s4i +s4j +s4j-3 +s4k +s4kxA1 +s4n^M +s4no6g +s4o +s4o@9 +s4oZ2 +s4p +s4qo4e +s4r +s4rD0 +s4s +s4s*30 +s4v +s4wu +s4x +s4x$p +s4x^E +s4yD5 +s4ys.M +s4z +s5 +s5 Z5 +s5! +s5# +s5%'5+3 +s5%x41 +s5* +s5+Z1 +s5, +s5.x23 +s5/ +s50 +s51 +s52 +s52'B +s52-6 +s52o71 +s53 +s53T0 +s54 +s54-1 +s56 +s57 +s58 +s58+8 +s59 +s59q +s5=x42 +s5G +s5J +s5S +s5Z*15 +s5\i0h*56 +s5_ +s5ai7k +s5b +s5bL0 +s5c +s5d +s5do06 +s5e +s5el +s5f +s5g +s5gT7 +s5hq +s5i +s5k +s5m +s5n +s5ni4t +s5o +s5o+5 +s5qZ3 +s5r$c +s5rZ1 +s5s +s5t +s5w +s5wo45 +s5x[ +s5yx34q +s6! +s6![ +s6$[ +s6%l +s6* +s6+ +s6- +s6. +s6/ +s60 +s61 +s62 +s63 +s63-7 +s64 +s64$2 +s64T5 +s65 +s67 +s68 +s68scv +s69 +s69s71 +s6: +s6=d +s6@ +s6BT1o0w +s6Bc +s6C +s6J +s6K*25 +s6N +s6OD4 +s6SC +s6Wc +s6X +s6]*06 +s6_^|i4* +s6a +s6aslA +s6b +s6bR0 +s6cc +s6d +s6e +s6e^b +s6f +s6g +s6jZ3r +s6k +s6lZ1z1 +s6m +s6mZ2 +s6n +s6o +s6o$7 +s6p +s6po3h +s6q +s6r +s6t +s6ud +s6v*37x05 +s6w +s6y +s7 +s7 x04 +s7! +s7" +s7$ +s7%u +s7&x14z3 +s7)Z4*06 +s7+ +s7- +s7--1 +s7. +s7/ +s70 +s70Z2 +s71 +s71L1 +s72 +s72o0a +s73 +s74 +s74+8 +s74Z2 +s74[ +s75 +s75$t +s76 +s76-6 +s76L6c +s76c +s78 +s78x32 +s79 +s79$m +s79i0W +s7;*26o3N +s7= +s7C +s7D +s7D$z +s7I +s7L +s7M +s7N +s7P +s7Qq +s7V@cD0 +s7W*31 +s7Y +s7^lD2 +s7^o3o +s7a +s7b +s7bx27 +s7c +s7d +s7e +s7f +s7g +s7i +s7j +s7j$k +s7l +s7nx36i0k +s7nx56 +s7q +s7r +s7rx13 +s7s +s7v +s7x +s7| +s8! +s8# +s8$ +s8$tx46 +s8* +s8, +s8- +s8. +s8.*07-0 +s8/ +s80 +s80$n +s80+5 +s80l +s81x32d +s82 +s83o1f +s84 +s84-2R1 +s85 +s85Z2 +s86 +s86^z +s87C +s89 +s89D0 +s8:[ +s8A +s8B +s8B[s6q +s8Bc +s8D-3 +s8F +s8H +s8J +s8K +s8M*02 +s8O +s8Pc +s8Q +s8R +s8U'5 +s8Wl +s8X +s8^ +s8a +s8aR3Z3 +s8aT5 +s8bp1x39 +s8c +s8c*01 +s8cZ1 +s8csyi +s8d +s8e +s8ez3 +s8g +s8h +s8i +s8iZ1 +s8j +s8k +s8l +s8lZ2 +s8l^y +s8ll +s8m +s8mp2'7 +s8n +s8ni4r +s8nl +s8o +s8qZ1 +s8t +s8t[ +s8to23 +s8u +s8ux16$W +s8ux61 +s8vx41 +s8x +s8y +s8z +s8z+7 +s9 +s9 D4 +s9 x01 +s9! +s9" +s9"t +s9# +s9$ +s9%} +s9* +s9*z2T0 +s9,Cp2 +s9- +s9. +s9.D7 +s90 +s90$m +s90$y +s90[ +s90i0d +s91 +s92*57 +s92-5 +s93 +s94 +s94i45 +s94i75l +s95 +s95^8z3 +s97 +s97*67 +s97R3 +s97T4 +s97z1 +s98 +s9; +s9@ +s9B +s9D +s9Es8S +s9G +s9Hi3M^, +s9J +s9Lx14^m +s9Px45 +s9T +s9Z*93*43 +s9\ +s9^ +s9_ +s9_Z2 +s9_r +s9a +s9az2 +s9b +s9b+5 +s9bo4vL0 +s9bx56 +s9c +s9d +s9d*13 +s9e +s9f +s9i +s9k +s9lZ2 +s9n +s9o +s9p +s9q +s9r +s9u +s9u-7 +s9ux05 +s9w +s9x +s9y +s9z +s9{ +s;@ +s;u +s= +s=; +s?! +s@" +s@* +s@u +s_U +s_ax13 +s_i +sa +sa!r +sa' +sa)$@x01 +sa* +sa+ +sa- +sa-l +sa. +sa.x41 +sa/ +sa0 +sa0D4 +sa0l +sa1 +sa2 +sa2k +sa3 +sa3Z4 +sa3x15 +sa4 +sa4C +sa4d +sa4q +sa4u +sa5 +sa5z2 +sa6 +sa7 +sa7D6 +sa7Z2 +sa7o0b +sa8 +sa9 +sa9Z2 +sa; +sa;$a +sa= +sa=$5 +sa? +sa@ +sa@+1 +sa@T1 +sa@T3 +sa@c +sa@d +sa@se3 +sa@se3si! +sa@se3si1 +sa@si! +sa@si1 +sa@so0 +sa@so0se3 +sa@so0si! +sa@so0si1 +sa@so0u +sa@ss$ +sa@u +saA +saA+2 +saAZ2 +saCz2u +saD +saER2 +saE{ +saF +saFc +saH +saLo1Q +saO +saP +saQc +saR +saSx23 +saU +saW +saY +saZ-6 +sa[ +sa^ +sa^z2x65 +sac +sad +sad$5^q +sadx52 +sae +sae$1 +sae*74 +saeD6 +saei2m +saf +sag +sah +sai +sak +sakD6 +samD4x51 +san +sani40 +sao +saoZ4 +sap +sap$y +sap} +saq +saqZ2 +saqz1 +sar +sar-6 +sari1n +sas +sat +satt +sau +sauk +saux43 +sav +savR4 +saw +sawZ1x46 +sax +saxo3z +saxr +say +say^Az2 +sayz4 +saz +saz@p +sazx35x23 +sa| +sb c +sb! +sb# +sb$ +sb& +sb&z4 +sb)^L +sb- +sb/ +sb0 +sb0*23^t +sb0+0+4 +sb0i0D +sb1 +sb1z1 +sb2 +sb3 +sb4 +sb5 +sb5d +sb5o79 +sb5u +sb6 +sb7 +sb7R1 +sb7l +sb8 +sb8d +sb8u +sb9 +sb9R5 +sb: +sbs8= +sfB +sfF +sfFT4 +sfJ +sfK*26 +sfKx05 +sfNl +sfO +sfT +sfUR0 +sfW$! +sfX +sfZo0L +sf[ +sf_ +sfa +sfa'A +sfb +sfc +sfc^k +sfd +sfg*15z2 +sfg@g +sfgx54 +sfh +sfj +sfjz5 +sfk +sfk]] +sfkxB8 +sfm +sfn +sfn[ +sfo +sfp +sfq +sfqi0z^3 +sfr +sfrD4 +sfs +sfs$! +sfsZ2 +sfsssBu +sft +sfv*86 +sfw +sfy$o +sfz +sf{c +sg t +sg# +sg#$* +sg$ +sg- +sg1 +sg2] +sg3 +sg4 +sg4*26 +sg5 +sg6 +sg6^0 +sg8 +sg9 +sg9$f +sg9d +sg9u +sgC +sgD +sgE +sgF +sgH[ +sgJ +sgN +sgOu +sgR +sgSc +sgT +sgTu +sgU +sgU^r +sgY +sg_+4*64 +sga +sgaZ4 +sgb +sgc +sgf^r +sghl +sghx24 +sgi +sgj +sgjL5 +sgk'B +sgki6u +sgl +sgl$9 +sgll +sgml +sgn +sgn-2 +sgnT0^j +sgo +sgo'7u +sgp +sgq +sgqt +sgr +sgs +sgt +sgv +sgvo0m +sgw +sgw$7 +sgwD3 +sgwp1 +sgx +sgxo5d*13 +sgy +sgz +sgzi0m +sh*k +sh,x14 +sh-o0g +sh0} +sh2 +sh2Z2 +sh2lc +sh2x52 +sh4^2 +sh4iA0x25 +sh6 +sh7 +sh7K +sh8o2% +sh9 +sh9z3 +shBx4A +shF +shL +shM +shO +shRZ1 +shS +shT +shT+2L1 +shU +shVo6m +shW^@o09 +shXD4 +shYc +shZ +sh^ +sh_$g +sha +shao4l +shb +shbK +shc +shc$j +shd +she +she^a +shf +shg +shi-3 +shj +shk +shk*02^i +shkD7D3 +shl +shm +shm$m +shmt +shn +shn$ui3o +shpx01 +shq +shr +shrD6 +shrz5 +shs +shs$5 +sht +shu +shvZ1 +shvx46 +shx +shxc +shy +shyu +shz +shz-2x31 +shz{ +si +si l +si! +si!T1 +si!T2 +si!T3 +si!T4 +si!T5 +si!T6 +si!T8 +si!d +si!sl1 +si!ss$ +si!ss$u +si!u +si" +si$ +si* +si+ +si- +si-o1ul +si. +si1 +si1D6 +si1T1 +si1T2 +si1T3 +si1T4 +si1T5 +si1T6 +si1T7 +si1T8 +si1d +si1se3 +si1se3u +si1ss$ +si1ss$u +si1u +si2 +si2Z1 +si2x45 +si3 +si3*31 +si4 +si4$3 +si5 +si6 +si7 +si9 +si9z1 +si;*82 +si=z1 +si@x36 +siCKc +siCl +siEu +siG +siGz2 +siId +siM +siNl +siNsNk +siO +siP*61 +siRZ1 +siW +si[ +si] +si^} +sia +siaZ2 +sib*45 +sibZ1 +sic$7 +sid +sie +sieo06 +sieo6h +sifo5Wx02 +sifx26 +sih +sij +sik*41 +sil +sim +sin +sio +sioK +siox23 +sip +sipp2x4B +siqk +sir +sit +siu +siv +siw +siwx31 +six$3 +siy +siyx12 +siz +sizx01 +sj D0 +sj# +sj$ +sj% +sj%'4 +sj-{ +sj. +sj1 +sj2z2 +sj6 +sj7{+1 +sj8 +sj9 +sj? +sj@ +sjB +sjC +sjF +sjFl +sjH +sjK +sjL +sjP +sjR +sjV +sjW +sjY +sjb +sjd +sjdZ1 +sjf +sjfd +sjfx37 +sjg +sjgd +sjh +sjh$r +sjl +sjl*05x53 +sjm +sjn +sjnZ2 +sjo +sjo+3 +sjp +sjq +sjqu +sjqx28 +sjr +sjs +sjs+2o4s +sjt +sjtT1T8 +sjt[ +sjx +sjy +sjzD4[ +sk&u +sk- +sk0 +sk2 +sk4x02 +sk7Z4 +sk8 +sk9 +sk9z3^; +sk@ +skA +skB +skC +skD$! +skDdx76 +skG +skL +skL-6 +skM +skOZ2D3 +skP +skR +skT +skW +skW-7 +skZk*05 +sk[ +sk] +sk^ +sk^'A +sk_ +ska +skb +skbK +skb[x23 +skc +skc[ +skd +ske +skf +skfD9x15 +skg +skg'8 +skg^sx1A +skgo4 +skh +skho3e +skhsYc +ski +skii4z +skio2i +skl +skm +skm-5 +skmZ1 +skn@z +skn^p +skno1o +sko +skp +skpz3 +skq +skr +sks +sks^-$6 +sksz1 +sksz4 +skt +sku +skwr +skx +sky +skyD1 +skyc +skyi0n +skyx31 +skz +skz'6 +sl +sl! +sl"*94 +sl"t +sl$ +sl* +sl- +sl-x31 +sl/Z2 +sl1 +sl1T1 +sl1T2 +sl1T3 +sl1T4 +sl1T5 +sl1T6 +sl1T7 +sl1d +sl1u +sl2 +sl2z2L3 +sl4 +sl4Z5 +sl5 +sl6 +sl7 +sl7D4 +sl8 +sl8x26 +sl9 +sl; +sl;D1 +sl< +sl?o5b +sl@l +slB +slDz2x32 +slF +slGi2u +slH +slL +slM +slMT2 +slO +slP +slQ +slR +slS +slT +slU +slUx15+2 +slVi4R +slW +slXi1qk +slZl +sl] +sl^*62*16 +sl_ +sl`x41x83 +sla +slao1O +slb +slbZ2 +slbu +slbz2x18 +slc +slcD0 +sld +sld[ +sle +slf +slf*12[ +slfu +slg +slh+5 +slho10 +sli +slj +slj$u +slj{ +slk +slkZ4 +slm +slm$a +slm$w +sln +slnZ4sp! +slnx43 +slo +slo+5 +sloi2l +slou +slp +slq +slr$0^& +slrr +sls +sls^a +slt +slt*50 +sltT6 +slu +slu$7 +slv +slw +slx +slx^i +sly +slyo8( +slyx41 +slyx43 +slz'6 +sl{ +sl| +sl|o10[ +sm$ +sm$dx64 +sm$p2x34 +sm&o7H +sm+ +sm- +sm. +sm/ +sm1 +sm1$g +sm1C +sm1L6 +sm1^a'4 +sm1^e +sm2 +sm2x62 +sm3 +sm3*24 +sm4 +sm4D2 +sm5 +sm6 +sm7Z1 +sm7z4 +sm8 +sm8x21 +sm; +sm@t +smB +smC$# +smD +smG +smH-0u +smHi0s +smKuZ2 +smL +smM*32{ +smO'5 +smP +smPu +smQ +smRx31 +smSp2'4 +smW +smXo5"+6 +smZ +sm[Cc +sm]^Mx16 +sm` +smb +smc +smd +smdZ1 +smdx51 +sme +smeD1 +smf +smf^6 +smg +smg'5 +smg[ +smj +smj-3 +smk +sml +smlk +smlu +smn +smnt +smo +smo'8c +smp +smp] +smq +smr +sms +smsD5 +smt +smti6ix02 +smtz1{ +smu +smu+4 +smu-2 +smui4b +smuo1 +smv +smvi5n +smw +smw+5} +smy +smz +sn# +sn$ +sn& +sn+ +sn, +sn- +sn0 +sn1 +sn2 +sn2Z3 +sn3rL2 +sn4 +sn4-5 +sn4R6 +sn5x16 +sn6 +sn6c +sn7 +sn7d +sn7u +sn8 +sn9 +sn; +snAZ3o4y +snB +snDD2 +snGD0x67 +snGc +snH +snK*02p1 +snLc +snN +snR +snRo5C +snT +snT^H +snX +snXx08 +sn\Z1 +sn^i2Cl +sn_ +sn_l +sna +snb +snb-0 +snbo0L +snc +sncq +sncx1A+2 +snd +sndZ2 +sndx02 +sne +snf +sng +sngR0'6 +sngi3t +snh +snh$! +snh*64 +snh*84x54 +snhp1 +snii2+ +snj +snjo3v +snk +snl +snl'9 +snm +snmp1x23 +snmx53 +sno@i +snp +snq +snqr +snr +sns +snsz2 +snt +sntc +snu +snusey +snv +snw +snwL6 +snwo4< +snx +sny +snyp1 +snz +snz'7 +sn| +sn|fx3A +so! +so" +so# +so$ +so'x24 +so* +so, +so. +so0 +so0T1 +so0T2 +so0T3 +so0T4 +so0T5 +so0T6 +so0T7 +so0T8 +so0d +so0sa4 +so0se3 +so0se3si! +so0se3si1 +so0se3ss$ +so0se3u +so0si! +so0si!ss$ +so0si!u +so0si1 +so0si1ss$ +so0si1u +so0sl1 +so0sl1u +so0ss$ +so0ss$u +so0u +so1 +so1$b+4 +so1z2 +so3 +so3i4j +so3lk +so4 +so5 +so6 +so6Z5x09 +so8 +so; +so= +so> +so@ +so@x05 +soCc +soCcZ2 +soIc +soK +soN +soNi6k +soO +soQ$? +soQl +soS +soT +soY +so] +so^ +soa +soa[ +sob +soc*13 +sod +sodL2 +sod] +soe +sof +sof-5$: +sog +soh +soi +soi^t +sol +somx26 +sop +soq +sor +sor{ +sos +sot +sou +souR6 +sov +sow +soy +soyD7@u +soyp1 +soyt +sozsjA +sp)[ +sp+ +sp. +sp/-0 +sp1 +sp2 +sp5 +sp6 +sp9 +sp= +spD +spGlC +spNZ3*39 +spNx05 +spSc +spT +spT*32l +spVc +spV{i3[ +spWc +spY +spYtl +spZl +sp[ +spb +spb*50 +spc +spck +spd +spf +spg +sph +spj +spk +spl +spm +spmK +spr +sprd +sps +spt +spu +spv +spw$s +spxq +spy +spyp1 +spz +sp}o24@a +sq +sq$z3x03 +sq9 +sqb +sqcK +sqdo1l +sqgD3 +sqid +sqk +sql +sqm +sqw +sqx +sr *65 +sr x32 +sr! +sr$ +sr%L2 +sr&u +sr&x1Ap2 +sr' +sr)$/ +sr+ +sr0 +sr0x17 +sr1 +sr1$_x14 +sr2 +sr2R5 +sr2c +sr3$m +sr4 +sr5 +sr5D1 +sr6 +sr7 +sr8 +sr:} +sr>x54 +sr? +srGl +srHx21 +srI +srJ +srLqR5 +srN[ +srR +srS +srTx03 +srWC +srWdl +srXo3k +srXx32 +srY +srYu +srZ +sr\ +sra +sraD1 +sra{] +srb +srbZ2 +src+5 +src-1 +srcx23 +srd +sreD5 +srf +srfc +srf}i3X +srg +srgr +srgsny +srgz2 +srh +srid +srjx32 +srjx64 +srk +srkx23 +srl +srlZ2 +srm +srn +srn*20 +sro+4 +srp^f +srq +srs +srs$m +srssaj +srt +srt} +sru +sru} +srv^c +srw +srw^[$m +srwt +srwz3 +srx +srxT3x32 +sry +sry^l +srz +srz'4 +sr} +sr}ur +ss# +ss$ +ss$T1 +ss$T2 +ss$T3 +ss$T4 +ss$T5 +ss$T6 +ss$T7 +ss$T8 +ss$d +ss$sl1 +ss$u +ss% +ss' +ss* +ss*z4Z4 +ss+x52 +ss+} +ss, +ss- +ss. +ss0 +ss0Z2 +ss1 +ss1r +ss2 +ss2T4 +ss2t +ss3 +ss3Z2 +ss3d +ss3u +ss4 +ss4-6 +ss5 +ss5D3 +ss5d +ss5se3 +ss5u +ss6 +ss6T3 +ss7 +ss8 +ss9 +ss: +ss=u +ss> +ssB +ssBu +ssC +ssEu +ssFT3 +ssH +ssHsoBl +ssK +ssOo0| +ssS +ssT +ssTx45 +ssW +ssZ +ss\l +ss^ +ss_ +ss` +ssa +ssal +ssb +ssbk +ssc +ssdi3i +ssdx32 +ssf +ssfZ2 +ssfx04 +ssg*75 +ssh +sshk +ssi +ssj +ssjK +ssji5r +ssk +ssk-5 +sskp1 +ssl +ssm +ssm$a +ssm$m +ssn +ssn*45 +ssn^1 +ssndl +sso +ssoo8#*65 +ssop1 +ssp +ssp+7 +ssr +sst +sstt +ssu +ssuZ3x54 +ssuz2 +ssv +ssvo5x +ssw +sswi12*18 +ssxZ1 +ssxc +ssy +ssy] +ssyx32 +ssz +ssz+3 +sszo0s +st +st +0 +st!^bx23 +st# +st*R6 +st+ +st, +st/ +st1 +st1-0 +st1{t +st2o0j +st3z5'8 +st4 +st4x13 +st5Z2 +st5q +st5u +st6 +st7 +st7d +st7u +st8 +st;i4$^n +st +t$@ +t$A +t$B +t$D +t$E +t$F +t$Id +t$J +t$O +t$P +t$Pk +t$R +t$R[ +t$T +t$T*76 +t$V +t$X +t$^ +t$_$h +t$` +t$a +t$b +t$d+7 +t$f +t$i +t$r +t$s +t'4 +t'7Z1 +t'7sg7 +t'8 +t'9 +t'A +t*04k +t*05 +t*06 +t*12p1 +t*14 +t*15 +t*20 +t*21 +t*31 +t*34 +t*37 +t*46 +t*60 +t*78 +t*9A +t+0 +t+2 +t+3 +t+3u +t+4Z1 +t+4^a +t+4u +t+5^D +t+6 +t+8 +t+8o0M +t+9 +t-0 +t-3 +t-6-1 +t-7 +t-7*65 +t-7x03 +t-8 +t-A +t@# +t@1 +t@3 +t@7 +t@8x32 +t@C +t@E +t@K +t@L+7 +t@Lo1! +t@O +t@Oc +t@P +t@V +t@l +t@y +tCq +tD0 +tD1 +tD1-3 +tD1[ +tD3 +tD4sLA +tD5$` +tD7 +tD8 +tD8x24 +tDAx72 +tL4 +tL5 +tL5u +tR0 +tR1 +tR1*05 +tR3 +tR4 +tR7 +tT1 +tT1o1h +tT3 +tT4 +tT5 +tT6x58 +tT7 +tT9 +tZ1 +tZ1o26 +tZ1x45 +tZ2 +tZ3 +tZ3+8 +tZ3[ +tZ3u +tZ4 +tZ5x12 +t[ +t]{ +t^! +t^1 +t^1$2 +t^2x43 +t^6x3A +t^7 +t^FD5 +t^G +t^L +t^R+5 +t^Ss14 +t^V +t^W +t^Z +t^\ +t^b +t^d +t^e +t^f +t^j +t^o +t^p +t^q +t^t} +t^vL1 +t^wo0a +t^{^' +tcZ3 +tc^Z +tcc +td +tdxA4 +tf +tfx3B +tfx4A +tf} +ti0B +ti0Q +ti1-Z1 +ti11 +ti1M +ti1Q +ti1S +ti1au +ti1v^B +ti22 +ti2F +ti2G +ti2P +ti2c +ti2y +ti3 +ti3.o55 +ti3G +ti3K +ti3L +ti3e +ti3p +ti3z +ti4* +ti4A[ +ti4C$7 +ti4G +ti4O$5 +ti4a^Q +ti4y +ti5N +ti5e +ti5y +ti62 +ti6O +ti7B +ti7P +ti7S +ti7l +ti9N +tl+A +tld +to06 +to07x74 +to0F +to0H +to0S +to0V +to0Y +to0f +to0m +to0n +to0o +to1B +to1Cc +to1I +to1Ou +to1U +to1Z +to1y +to2 +to28o4M +to2Fx32 +to2K +to2S +to2T +to2` +to2a +to2z +to3" +to30'6 +to3Cd +to3G +to3L$e +to3Lz1 +to3Rr +to3f +to3f$1 +to3kx21 +to4# +to42 +to4E +to4T +to4` +to4oT6 +to4y +to5 +to54 +to5J +to5Tx81 +to5dD0 +to5k +to5s +to5u +to6 +to61 +to66 +to6F +to6z +to7! +to71x25 +to75 +to77 +to7K +to7S +to7X +to7_*41 +to7d +to7x +to82 +to86 +to8I +to8J +to8L +to8O +to8T +to9P +toA1x34 +tp1 +tp1*41 +tp1^u +tp1z2 +tp2 +tp2x82 +tq+5 +tqZ2 +tr +trD2 +ts0D +ts0Y +ts0e +ts0w +ts1n +ts2) +ts3e +ts4U +ts4f +ts52 +ts6b +ts6zl +ts7Kt +ts9! +tsBZ +tsF9 +tsJk +tsLH +tsLN +tsMD +tsN8 +tsNs +tsS9 +tsTc +tsTku +tsUR +tsUe +tsUnl +tsV6$Z +tsVFc +tsVG +tsXB +tsZK +tsgX +tskC +tt +tt@0 +ttp1 +tu +tui7Z +tx02x17 +tx03 +tx04 +tx04f +tx05 +tx06 +tx12 +tx12i3J +tx14x27 +tx15z1 +tx16p1 +tx17+0 +tx23 +tx24 +tx26 +tx31z1 +tx32 +tx32Z3 +tx32[ +tx34 +tx36 +tx38 +tx41 +tx41i5a +tx42 +tx45 +tx46 +tx48 +tx52 +tx54 +tx57 +tx61 +tx62 +tx62@2 +tx63^9 +tx72 +tx74 +tx81 +tx82 +tx93 +tx95'5 +txA2 +txA2c +tz1^% +tz1x07 +tz2 +tz2L2 +tz2x0B +tz2x63 +tz2z3 +tz3 +t{*54 +t} +t}k +u +u$! +u$!d] +u$# +u$$ +u$& +u$&d] +u$* +u$+ +u$+d] +u$- +u$-d] +u$. +u$0 +u$0$0 +u$0$0$0 +u$0$0$1 +u$0$0$7 +u$0$1 +u$0$2 +u$0$3 +u$0$4 +u$0$5 +u$0$6 +u$0$7 +u$0$8 +u$0$9 +u$0d] +u$1 +u$1$0 +u$1$1 +u$1$1$1 +u$1$2 +u$1$2$3 +u$1$2$3$4 +u$1$2$3$4$5 +u$1$2$3$4$5$6 +u$1$2$3$a$b$c +u$1$2$a$b +u$1$3 +u$1$4 +u$1$5 +u$1$6 +u$1$7 +u$1$8 +u$1$9 +u$1$9$6$0 +u$1$9$6$1 +u$1$9$6$2 +u$1$9$6$3 +u$1$9$6$4 +u$1$9$6$5 +u$1$9$6$6 +u$1$9$6$7 +u$1$9$6$8 +u$1$9$6$9 +u$1$9$7$0 +u$1$9$7$1 +u$1$9$7$2 +u$1$9$7$3 +u$1$9$7$4 +u$1$9$7$5 +u$1$9$7$6 +u$1$9$7$7 +u$1$9$7$8 +u$1$9$7$9 +u$1$9$8$0 +u$1$9$8$1 +u$1$9$8$2 +u$1$9$8$3 +u$1$9$8$4 +u$1$9$8$5 +u$1$9$8$6 +u$1$9$8$7 +u$1$9$8$8 +u$1$9$8$9 +u$1$9$9$0 +u$1$9$9$1 +u$1$9$9$2 +u$1$9$9$3 +u$1$9$9$4 +u$1$9$9$5 +u$1$9$9$6 +u$1$9$9$7 +u$1$9$9$8 +u$1$9$9$9 +u$1d] +u$2 +u$2$0 +u$2$0$0$0 +u$2$0$0$1 +u$2$0$0$2 +u$2$0$0$3 +u$2$0$0$4 +u$2$0$0$5 +u$2$0$0$6 +u$2$0$0$7 +u$2$0$0$8 +u$2$0$0$9 +u$2$0$1$0 +u$2$1 +u$2$2 +u$2$2$2 +u$2$3 +u$2$3$4 +u$2$4 +u$2$5 +u$2$6 +u$2$7 +u$2$8 +u$2$9 +u$2^f +u$2d] +u$3 +u$3$0 +u$3$1 +u$3$2 +u$3$2$1 +u$3$3 +u$3$3$3 +u$3$4 +u$3$4$5 +u$3$5 +u$3$6 +u$3$7 +u$3$8 +u$3$9 +u$3d] +u$4 +u$4$0 +u$4$1 +u$4$2 +u$4$3 +u$4$3$2$1 +u$4$4 +u$4$4$4 +u$4$5 +u$4$5$6 +u$4$6 +u$4$7 +u$4$8 +u$4$9 +u$4d] +u$5 +u$5$0 +u$5$1 +u$5$2 +u$5$3 +u$5$4 +u$5$4$3$2$1 +u$5$5 +u$5$5$5 +u$5$6 +u$5$6$7 +u$5$7 +u$5$8 +u$5$9 +u$5d] +u$6 +u$6$0 +u$6$1 +u$6$2 +u$6$3 +u$6$4 +u$6$5 +u$6$5$4$3$2$1 +u$6$6 +u$6$6$6 +u$6$7 +u$6$7$8 +u$6$8 +u$6$9 +u$6^\ +u$6d] +u$7 +u$7$0 +u$7$1 +u$7$2 +u$7$3 +u$7$4 +u$7$5 +u$7$6 +u$7$7 +u$7$7$7 +u$7$8 +u$7$8$9 +u$7$9 +u$7d] +u$8 +u$8$0 +u$8$1 +u$8$2 +u$8$3 +u$8$4 +u$8$5 +u$8$6 +u$8$7 +u$8$8 +u$8$8$8 +u$8$9 +u$8d] +u$9 +u$9$0 +u$9$1 +u$9$2 +u$9$3 +u$9$4 +u$9$5 +u$9$6 +u$9$7 +u$9$8 +u$9$9 +u$9$9$9 +u$9Z4 +u$9d] +u$: +u$? +u$@ +u$C +u$Fx23 +u$Fz4 +u$H +u$I$O +u$N +u$Nl +u$S^1 +u$Ux52 +u$X +u$_ +u$_d] +u$a +u$bD1 +u$i +u$j^F +u$m +u$o +u$y +u$zK +u'4 +u'6 +u'9 +u'A +u'B +u*04] +u*05-5 +u*21 +u*30i5) +u*32 +u*32+2 +u*40 +u*51o69 +u*52 +u*56 +u*67 +u*68 +u*75D5 +u+0 +u+1 +u+2 +u+4 +u+5 +u+6 +u+6^I +u+7 +u+7R7 +u+A +u-0 +u-2 +u-3^! +u-4 +u-4$g +u-5 +u-5'6 +u-6 +u-8 +u@0 +u@1sAM +u@7 +u@A +uD0+2 +uD0D7 +uD0o47 +uD2 +uD3 +uD4o3t +uD4x43 +uD5 +uD6 +uD8 +uL0 +uL1+4 +uL2 +uL2T4 +uL2r +uL2z1 +uL3 +uL4 +uL4i0Y +uR0 +uR5 +uT1 +uT1D3 +uT2 +uT5[ +uT6 +uT7 +uT8 +uZ1 +uZ1x75 +uZ3 +uZ4*27 +uZ4^z +uZ5 +uZ5$0 +uZ5x57 +u[ +u[L5 +u[T2 +u[T3 +u[^N +u]$V +u]-3 +u]^* +u^! +u^# +u^$ +u^& +u^( +u^* +u^. +u^0 +u^0^0^0^2 +u^0^1^0^2 +u^0^6^9^1 +u^0^7^9^1 +u^0^8^9^1 +u^0^9^9^1 +u^1 +u^1^0^0^2 +u^1^6^9^1 +u^1^7^9^1 +u^1^8^9^1 +u^1^9^9^1 +u^2 +u^2^0^0^2 +u^2^6^9^1 +u^2^7^9^1 +u^2^8^9^1 +u^2^9^9^1 +u^3 +u^3^0^0^2 +u^3^2^1 +u^3^6^9^1 +u^3^7^9^1 +u^3^8^9^1 +u^3^9^9^1 +u^4 +u^4^0^0^2 +u^4^3^2^1 +u^4^6^9^1 +u^4^7^9^1 +u^4^8^9^1 +u^4^9^9^1 +u^5 +u^5^0^0^2 +u^5^4^3^2^1 +u^5^6^9^1 +u^5^7^9^1 +u^5^8^9^1 +u^5^9^9^1 +u^6 +u^6^0^0^2 +u^6^5^4^3^2^1 +u^6^6^9^1 +u^6^7^9^1 +u^6^8^9^1 +u^6^9^9^1 +u^7 +u^7^0^0^2 +u^7^6^9^1 +u^7^7^9^1 +u^7^8^9^1 +u^7^9^9^1 +u^8 +u^8^0^0^2 +u^8^6^9^1 +u^8^7^9^1 +u^8^8^9^1 +u^8^9^9^1 +u^9 +u^9^0^0^2 +u^9^6^9^1 +u^9^7^9^1 +u^9^8^9^1 +u^9^9^9^1 +u^> +u^? +u^@ +u^Bi1R +u^D +u^Ex41 +u^K*15 +u^M +u^Q +u^U +u^V-1 +u^Y +u^[ +u^_ +u^b +u^e +u^ii60 +u^uc +u^x-1 +u^| +uc$D +uc@g +uc[ +uco0e +uco3Q +ud +ud'B +udx12 +uf-5 +ui0$o5V +ui0Nx16 +ui0R +ui1! +ui1& +ui1' +ui1* +ui1+ +ui1. +ui1.i3.$. +ui1.i3.i5.$. +ui10 +ui10i31i52i73 +ui11 +ui11i31 +ui11i31i51 +ui11i31i51i71 +ui11i31i51i71i91 +ui11i31i51i71i91iB1 +ui11i32 +ui11i32i53 +ui11i32i53i74 +ui11i32i53i74i95 +ui11i32i53i74i95iB6 +ui12 +ui13 +ui15 +ui16 +ui17 +ui18 +ui19 +ui1_ +ui2! +ui2$ +ui2& +ui2' +ui2* +ui2+ +ui2- +ui20 +ui21 +ui22 +ui23 +ui24 +ui25 +ui26 +ui27 +ui28 +ui29 +ui2D +ui2I +ui2W +ui2_ +ui3! +ui3# +ui3$ +ui3& +ui3' +ui3* +ui3+ +ui3- +ui3. +ui30 +ui31 +ui32 +ui33 +ui34 +ui35 +ui36 +ui37 +ui38 +ui39 +ui3B +ui3I +ui3O{ +ui3_ +ui4! +ui4# +ui4$ +ui4& +ui4' +ui4+ +ui4- +ui4. +ui40 +ui41 +ui42 +ui43 +ui44 +ui45 +ui46 +ui47 +ui48 +ui49 +ui4@ +ui4C +ui4D +ui4F +ui4J +ui4L +ui4O +ui4TL7 +ui4_ +ui4u} +ui5 +ui5! +ui5# +ui5$ +ui5& +ui5' +ui5* +ui5+ +ui5- +ui5. +ui50 +ui51 +ui52 +ui53 +ui54 +ui56 +ui57 +ui58 +ui59 +ui5E +ui5H +ui5L +ui5Q +ui5Y +ui5Z +ui5_ +ui6 +ui6! +ui6# +ui6$ +ui6& +ui6' +ui6* +ui6+ +ui6- +ui6. +ui60 +ui61 +ui62 +ui63 +ui64 +ui65 +ui66 +ui67 +ui68 +ui69 +ui6P +ui6_ +ui6r +ui7(x17 +ui7N +ui88l +ui8C +ui8N +uiB3 +ukx21 +ul +uls0? +uls0i +uo0< +uo0A +uo0B +uo0VK +uo0W +uo14 +uo1F +uo1d +uo1k +uo25t +uo2G*23 +uo2U +uo2W[ +uo2i +uo3$ +uo33 +uo3V +uo4J +uo4L +uo4Q +uo4Z +uo4Z'8 +uo4c +uo4pc +uo4z +uo4{ +uo5$ +uo5= +uo5L +uo5Lu +uo5U +uo65 +uo6A +uo6H +uo6Ro0U +uo7% +uo78 +uo7I +uo7U +uo83 +uo90 +uoA8 +up1 +up1$R +up1-5 +up2x69 +up2x76 +uqx5A +us0_@B +us0b +us1c +us1d^d +us2n +us4T +us5R +us6& +us6c +us7t +us94 +us9D +us9_ +usCK +usCY +usEs +usG! +usLH +usMK +usP= +usPC +usRN +usS!Z2 +usTG +usTzr +usVX +usX> +usYM +ut +ut$% +ut$K +ut-3 +utT7 +ux01 +ux03x46 +ux04p3 +ux0A +ux13 +ux14p1 +ux14z4 +ux15 +ux18^L +ux1A +ux1B +ux21+1 +ux21K +ux24 +ux26z2 +ux28 +ux35 +ux35Z1 +ux41 +ux42 +ux42z4 +ux46 +ux47 +ux53 +ux54 +ux58 +ux59x02 +ux64 +ux67 +ux71u +ux74 +ux75 +ux83 +uxA1 +uxA3 +uz1 +uz1$4 +uz1*31 +uz1*61 +uz1D4 +uz2 +uz2+3 +uz3 +uz3o6B +uz3q +uz4 +uz4+4 +uz5i5C +u{Z1 +u{r +u}d +u}o2E +u}o4V +x01 +x01$E +x01$N*23 +x01$j +x01$m +x01$p +x01'9 +x01*45 +x01*A0 +x01+2o42 +x01-8x54 +x01@1 +x01@H +x01@k +x01C +x01Co2G +x01D6 +x01Kd +x01L2 +x01L3 +x01T4o2N +x01Z3 +x01^2$y +x01^M +x01c$n +x01csRu +x01d +x01i4s +x01i4u +x01i8i +x01l$9 +x01lo6# +x01o0 +x01o1: +x01o1a +x01o2& +x01o2HC +x01o2[ +x01o3e +x01o42} +x01o4S +x01o4i +x01o4x +x01o5L +x01q +x01qt +x01qx0B +x01r +x01sl. +x01sry +x01sta +x01swf +x01tf +x01x0A +x01x54 +x01x93 +x01z4^J +x01z5Z1 +x01{^h +x02$" +x02$% +x02$* +x02$+ +x02$1 +x02$1Z2 +x02$6 +x02$B +x02$P +x02$f +x02$g +x02$k +x02$n +x02$q +x02$s +x02'4 +x02'5 +x02'A +x02*20 +x02*23 +x02*31 +x02+1 +x02+2 +x02+2$7 +x02+3 +x02+3*02 +x02+6 +x02+8 +x02+A +x02-4 +x02-7 +x02@0 +x02C +x02D3 +x02D5 +x02D6 +x02K{ +x02L5 +x02R5 +x02T5 +x02Z1 +x02Z1R2 +x02Z2 +x02Z4 +x02Z4suM +x02^% +x02^2 +x02^M +x02^U +x02^X +x02^b +x02^g +x02^j +x02^u +x02^v +x02^x +x02^y +x02d +x02f +x02f+0 +x02i0, +x02i0f +x02i2^ +x02i2l +x02i4f +x02i5e +x02i6| +x02i9i +x02k +x02o1. +x02o1n +x02o1p +x02o1z +x02o2 +x02o2- +x02o2v +x02o3y +x02o4# +x02o4- +x02o4h$9 +x02p1 +x02p2 +x02q +x02qz3 +x02r +x02rk +x02s51z3 +x02sAO +x02sFH +x02str +x02syl +x02t*50 +x02u +x02x13 +x02x35 +x02x46 +x02x53 +x02x63 +x02x82 +x02x91 +x02z1 +x02z1f +x02z2 +x02z3 +x02z3l +x02z5 +x02z5z2 +x02{ +x03$! +x03$# +x03$2 +x03$5 +x03$6 +x03$R +x03$^ +x03$e +x03$h +x03$i +x03$j +x03$n +x03$r +x03'6 +x03'A +x03*12*50 +x03*30 +x03*31 +x03*34 +x03+0 +x03+0sy! +x03+2 +x03+6 +x03-0 +x03-2 +x03@n +x03CsK9 +x03D1 +x03D4 +x03L6 +x03R0 +x03R1 +x03R2 +x03R3 +x03T6 +x03Z1$i +x03Z2*74 +x03Z3 +x03Z3z2 +x03Z4 +x03Z5 +x03^1 +x03^@ +x03^F +x03^L +x03^g +x03^u +x03^w +x03d +x03f +x03f] +x03i0-^U +x03i0T +x03i1B +x03i2B +x03i2t +x03i4L +x03i5G +x03k +x03l +x03o1q +x03o1y +x03o3O +x03o66 +x03o69 +x03o7@ +x03p2 +x03p3 +x03p4 +x03p5'9 +x03q +x03qz3 +x03s2 +x03sld +x03ts8a +x03x19 +x03x34 +x03x34^d +x03x35 +x03x43 +x03x48 +x03z1 +x03z1sc? +x03z1} +x03z5 +x03{K +x04$$ +x04$3 +x04$F +x04$r +x04$s +x04$v +x04$y +x04$| +x04'3 +x04'5 +x04'8 +x04*02 +x04*78 +x04+1 +x04-1$M +x04-1+2 +x04@f +x04@l +x04@p +x04C +x04D8 +x04L0 +x04L7 +x04R5 +x04T3 +x04Z1 +x04Z2 +x04Z3 +x04Z4 +x04Z5 +x04^ +x04^P +x04^a +x04^l +x04^m +x04^o +x04^q +x04^y +x04csRi +x04d +x04di0n +x04i0d +x04i1a +x04i22 +x04i3d'4 +x04i3p +x04i44 +x04i6 +x04i6_ +x04l +x04o0'Z5 +x04o10+9 +x04o2 +x04o3% +x04o51 +x04p1 +x04p2 +x04p3 +x04p4i3B +x04sN[R1 +x04sf:'7 +x04t +x04u +x04x49 +x04x61 +x04x62 +x04x74 +x04z2 +x04{ +x05$ +x05$+ +x05$/ +x05$0 +x05$4 +x05$@@3 +x05$S +x05'9 +x05'A +x05*41 +x05-2 +x05-4 +x05D3 +x05R3Z2 +x05T4 +x05Z1 +x05Z1$u +x05Z2C +x05Z4 +x05Z4C +x05Z5 +x05^# +x05^+ +x05^-q +x05^? +x05^_ +x05^h +x05^j +x05^mx64 +x05^r +x05^t@o +x05^w +x05k +x05l^3 +x05o1 +x05o1P +x05o3t +x05o4a +x05p1 +x05p1[ +x05p2 +x05p3 +x05q +x05r +x05sum +x05tZ4 +x05x41 +x05x53 +x05z2 +x05z3 +x05z5 +x06 +x06$1 +x06$H +x06$Z +x06$]p1 +x06$y +x06'9 +x06'A +x06'B +x06*20 +x06-1 +x06-3 +x06-8 +x06@9 +x06R1 +x06R4 +x06Z1 +x06Z1-0 +x06Z4l +x06^2 +x06d +x06dp3 +x06dt +x06dz2 +x06f +x06i2. +x06i2h +x06i49 +x06i62 +x06i7i +x06l +x06o2- +x06o2S +x06o3N +x06o3R +x06o99 +x06p2 +x06p2[ +x06q +x06sk@ +x06szy +x06u +x06x13 +x06x32 +x06x51 +x06z1^e +x06z3 +x06z3$0 +x06{ +x07 +x07$- +x07$1 +x07$n +x07'7 +x07+2 +x07+5 +x07-0 +x07-1 +x07-6 +x07D1 +x07D5 +x07R4 +x07T0 +x07Z1 +x07Z2 +x07Z3 +x07Z4 +x07^k +x07^s +x07^t +x07d +x07dx42 +x07i1n +x07i2H +x07k +x07o0Z +x07o2 +x07o4z +x07shv +x07slk +x07t +x07to1 +x07u$I +x07u^F +x07x21 +x07x39 +x07x74 +x07z2 +x07z4 +x07z5 +x08 +x08$6 +x08$bZ1 +x08$n +x08'8 +x08*63 +x08-5 +x08C +x08L0 +x08T2 +x08T4 +x08^Dq +x08^Q +x08^bt +x08c +x08i1a +x08i2c +x08o0, +x08p1 +x08p2 +x08p5o2V +x08s4b +x08t +x08x61 +x09 +x09L0 +x09Z1 +x09Z3 +x09Z3+5 +x09Z5 +x09^2 +x09^=d +x09^B +x09c +x09d +x09l +x09o1 +x09o2 +x09o48 +x09o6, +x09p1 +x09x21 +x09x34o0w +x09x54 +x09z5 +x0A +x0AR0 +x0AZ1 +x0Ad +x0Ai2x +x0Ax35 +x0AxB9x38 +x0B +x0B$' +x0B$h +x0BT7 +x0BZ5 +x0Bc +x0Bc^. +x0Bi8- +x0Bo2C +x0Bx46 +x0Bz5 +x12 +x12$ +x12$* +x12$. +x12$6 +x12$m +x12$r +x12$s +x12$w +x12'5D0 +x12*21 +x12*30x31 +x12*34 +x12*41 +x12*52*41 +x12+1Z1 +x12+2 +x12-1 +x12-4 +x12@c +x12D7 +x12Kl +x12L1 +x12L3 +x12R0 +x12R3 +x12T3 +x12Z1 +x12Z3*41 +x12Z3T6 +x12Z4 +x12Z5 +x12Z5z5 +x12^1o7v +x12^3 +x12^4 +x12^E +x12^[ +x12^e +x12^o +x12^p +x12^y +x12c +x12d +x12i0I +x12i1j +x12i2k +x12i3g +x12i5 +x12i5T +x12o0p +x12o1@ +x12o2 +x12o2r +x12o3l +x12o4 +x12p1 +x12p2 +x12q +x12q+8 +x12r +x12s2z +x12s81 +x12s9n +x12sf4 +x12sgo +x12shI'5 +x12shs +x12sna +x12t} +x12u +x12u'8 +x12x23 +x12x32 +x12x91 +x12z1 +x12z2T3 +x12z4 +x12z5 +x13 +x13$. +x13$0d +x13$1 +x13$4 +x13$P +x13$X@m +x13$Yc +x13$gz1 +x13$h^9 +x13$ox13 +x13$y +x13*03 +x13*03d +x13*04 +x13*21p1 +x13*34 +x13+0 +x13+1r +x13-0K +x13-2 +x13@m +x13C +x13D6 +x13D7 +x13L0 +x13R2 +x13R5 +x13T1 +x13T5svz +x13Z1 +x13Z3 +x13Z5 +x13^9*21 +x13^C +x13^S +x13^c +x13^e +x13^i +x13^s +x13^v +x13^x +x13c'7 +x13d +x13f +x13i0Gi0K +x13i0M +x13i0X +x13i0tL0 +x13i1j +x13i1r +x13i4X +x13l +x13o1? +x13o1u +x13o2y +x13o37 +x13o4Kl +x13o5e +x13o9+[ +x13p2 +x13q +x13s2f +x13s9Q +x13s9i +x13sgP +x13shF +x13sk5z1 +x13spw +x13x32 +x13z2 +x13z2s8g +x13z3R4 +x13z3z4 +x13z5 +x14 +x14$* +x14$1 +x14$3 +x14$L +x14$M +x14$g +x14$i +x14$k +x14$p +x14'4 +x14'8 +x14*50 +x14+0 +x14-1 +x14@t +x14D2$_ +x14D3 +x14L0 +x14R0 +x14R3 +x14Z1 +x14Z3 +x14Z3t +x14Z4 +x14Z5 +x14^2 +x14^2C +x14^3 +x14^M$n +x14^P +x14^g +x14^gr +x14^qq +x14^s +x14^y +x14cz5 +x14d +x14do1m +x14f*10 +x14i0T +x14i1G +x14i1t +x14i2; +x14i4+ +x14o0G +x14p1c +x14p1x83 +x14q +x14s28C +x14s6no40 +x14sa? +x14sam +x14u +x14x05Z2 +x14x24 +x14x32 +x14x34 +x14z3 +x14z4 +x14z4Z2 +x14{ +x15 +x15$- +x15$5 +x15$8u +x15$ML3 +x15$P +x15$X +x15$a +x15$k +x15$t +x15'6 +x15'8 +x15*15 +x15+0 +x15+1 +x15+2 +x15+3 +x15-4 +x15D5L2 +x15T1 +x15Z2@2 +x15Z3 +x15Z4 +x15Z5l +x15^G +x15c +x15d +x15d^i +x15f +x15i0A +x15i1r +x15i41 +x15i51 +x15lo5x +x15o0j +x15o1> +x15o3p +x15o57 +x15o5j +x15sza +x15szh +x15u +x15x41 +x15z3 +x15z3t +x15z4^V +x15z5 +x15{ +x16 +x16$: +x16$F +x16$R$v +x16$V +x16$_ +x16'9 +x16+2q +x16+3 +x16+7 +x16-1 +x16D4 +x16L1 +x16Z3 +x16Z4 +x16Z5 +x16^5 +x16^D +x16^JZ1 +x16^Sz2 +x16^a +x16i2n +x16i4bo2n +x16l +x16o0H +x16o1 +x16o3 +x16p1 +x16p2 +x16q +x16r +x16sHx +x16sb9D4 +x16t$2 +x16x23x03 +x16z4q +x16z5 +x17 +x17$1 +x17$N +x17$S +x17$o +x17$v +x17*20 +x17+1 +x17-1 +x17-4 +x17C +x17L4 +x17T2i0O +x17Z5 +x17^P +x17^c +x17^m +x17^r +x17d +x17l +x17q +x17qd +x17stP +x17u +x17x51 +x17z5 +x17{ +x18 +x18$q +x18*42 +x18+0 +x18+3 +x18+7 +x18L0 +x18R0 +x18Z2 +x18Z3 +x18Z3q +x18[^G +x18d +x18i5w +x18lZ5 +x18o3cl +x18o3i+4 +x18o6{-6 +x18p1'3 +x18p2 +x18t +x18x51 +x18x53 +x18x64 +x18z1x71 +x18z4 +x18z4x43 +x19$@ +x19+3 +x19@l$z +x19D4 +x19Z5 +x19^dz1 +x19i0jo21 +x19p2 +x19q +x19qd +x19r +x19uD5 +x1A$s +x1AZ1 +x1A[$J +x1A^pz2 +x1Ai15 +x1Ai1rp2 +x1B +x1B+3 +x1B+5 +x1BR2 +x1B[d +x1B^1R1 +x1Bd$v +x1Bi1P +x1Bo1* +x21$6 +x21$X[ +x21$g +x21$k +x21$k+2 +x21'5 +x21'9 +x21*25 +x21*30 +x21*68 +x21+1 +x21+2 +x21+6 +x21-0 +x21@Y +x21@o +x21@s +x21@y +x21C +x21D7 +x21R1o1x +x21R2 +x21R5D4 +x21R7 +x21^3 +x21^7 +x21^L +x21^cz3 +x21^l +x21^q-3 +x21^r +x21^t +x21di3n +x21f +x21i0k +x21i1*x34 +x21i11 +x21i42 +x21i5^ +x21i6e +x21i81 +x21kR0 +x21l +x21o0C +x21o0y +x21o1^ +x21o1b +x21o1n +x21o2? +x21o2i +x21o34 +x21o3j +x21o7Il +x21p1x54 +x21p2 +x21q +x21s&X +x21s., +x21s5 +x21scZ +x21scs +x21sm0 +x21sobi1* +x21stkp1 +x21stl +x21syu +x21x24s6+ +x21x45 +x21x46 +x21x52 +x21z3i1* +x21z5 +x21{l +x23 +x23$# +x23$*[ +x23$. +x23$? +x23$I +x23$f'6 +x23$g +x23$j +x23$l +x23$r +x23$t +x23'7 +x23*23{ +x23+0 +x23+9 +x23-2$d +x23-2o28 +x23-8 +x23@h +x23C +x23D0 +x23D3 +x23K +x23L4 +x23L5 +x23R3 +x23Z1 +x23Z1s1R +x23Z2 +x23Z3 +x23Z4 +x23Z5 +x23^( +x23^6 +x23^D +x23^V +x23^m +x23^s +x23f +x23i1K +x23i1b +x23i2i +x23i3x +x23i4i +x23i57 +x23l$! +x23o13 +x23o19 +x23o2n +x23o36 +x23o3@x12 +x23p1 +x23p1+0 +x23p1x03 +x23p2x82 +x23q +x23q*82 +x23r +x23sLo +x23sdgZ1 +x23siL +x23z1 +x23z1^b +x23z2 +x23z2Z1 +x23z3 +x23z5o2$ +x24 +x24$. +x24$6 +x24$7 +x24$_ +x24$g +x24$h +x24$i +x24$r +x24'6 +x24'8 +x24*20p1 +x24*36 +x24+2 +x24+5 +x24-0 +x24-3 +x24@1i4b +x24@hZ3 +x24K$p +x24L2 +x24L6 +x24Z2 +x24Z3 +x24Z3*15 +x24Z5 +x24[ +x24[x25 +x24^# +x24^W +x24^g +x24^m +x24^o +x24^oD3 +x24^r +x24^z +x24d +x24f +x24i2, +x24i32 +x24kd +x24l +x24o0SZ1 +x24o21 +x24o2r +x24o2y +x24o4 +x24q +x24sa. +x24sat +x24skX +x24sod +x24sr4 +x24t*13 +x24tR1 +x24uz5 +x24x05 +x24x15Z5 +x24z3 +x24z4 +x24z5 +x25 +x25$ +x25$& +x25$0 +x25$d +x25$r +x25'6 +x25*13 +x25+2 +x25-0 +x25-1f +x25-5 +x25C +x25D4 +x25D9 +x25L1 +x25R6 +x25RA'7 +x25T6 +x25T6'5 +x25Z1 +x25Z2 +x25Z2c +x25Z3 +x25Z4 +x25Z5*70 +x25[ +x25^, +x25^U +x25^c +x25^i +x25^n +x25c +x25i3g^f +x25i3z +x25l +x25l[ +x25o1q +x25o49i4i +x25o4B +x25p1 +x25rz5 +x25s5c +x25uo3y +x25x51+2 +x25z1 +x25z4L6 +x25z5 +x26 +x26$@ +x26$F +x26$X +x26$a +x26$r +x26'6 +x26+1 +x26-5 +x26@az1 +x26R0 +x26Z1 +x26Z3 +x26^'o0Z +x26^a +x26^bskr +x26^c +x26^t +x26d +x26i1v +x26i3? +x26o4y +x26p1[ +x26p2x94 +x26qz4 +x26skf +x26sp6 +x26ssa +x26z2 +x26z5 +x26} +x27 +x27$3 +x27$i +x27'8 +x27-1^f +x27@3 +x27L4 +x27Z2 +x27Z5 +x27^8 +x27^M +x27^h +x27d +x27i2az4 +x27i4p +x27o03 +x27o0m +x27o1MZ2 +x27o1j +x27o1y +x27o57@r +x27p1z1 +x27q +x27s1q +x27z1 +x28$_D2 +x28'9 +x28+4 +x28-0 +x28^6z4 +x28^e +x28^z +x28d +x28l +x28o0d +x28o27d +x28p1 +x28q +x28x0B +x29$J +x29$y +x29-1 +x29-2 +x29T4 +x29^n +x29^{-0 +x29d +x29i0s +x29i5t +x29lo5- +x29o1j +x29x41 +x2A$. +x2A'7 +x2A^T +x2Al +x2Ao1e +x2Ax37 +x2Az1i17 +x2B$9 +x2B^i +x2Bi0fL4 +x2Bx15x08 +x31$6 +x31$8 +x31$T +x31$_ +x31$m +x31$o +x31$y +x31'4 +x31'6 +x31'7 +x31'7@7 +x31*15ssr +x31*24 +x31*26 +x31*28 +x31*54] +x31*61 +x31*80 +x31+3 +x31+4L7 +x31+4d +x31-0 +x31-2 +x31@3 +x31D1 +x31R6l +x31T2 +x31Z2 +x31Z3 +x31Z3+1 +x31Z4 +x31[ +x31[o6T +x31]p1 +x31^B +x31^^l +x31^t +x31^u +x31d +x31f +x31i0! +x31i2WT5 +x31i3g +x31i4X +x31i4w +x31i67 +x31i73'5 +x31i89x76 +x31l +x31o0D +x31o0Y +x31o0t +x31o1C +x31o2U +x31o3a +x31o4z +x31o8r +x31oA5x36 +x31p1 +x31p1[ +x31p2x25 +x31r +x31s-h +x31sar[ +x31si' +x31sl9 +x31smf +x31syT +x31x21*45 +x31x42 +x31x43 +x31x46 +x31x91 +x31z1-0 +x31z1o6e +x31z3x61 +x31z4*62 +x31} +x32 +x32$ +x32$7 +x32$8 +x32$L +x32$Y} +x32$b +x32'8 +x32*43 +x32+1 +x32+2 +x32+5 +x32+7 +x32-3 +x32-5 +x32@. +x32@k +x32@t +x32@zC +x32D1 +x32L2d +x32L4 +x32R4 +x32R5 +x32T3 +x32Z2i3H +x32Z2x35 +x32Z3 +x32Z4 +x32Z5 +x32[ +x32^$ +x32^6 +x32^I +x32^S +x32^X +x32^e +x32^o +x32c +x32c$b +x32d +x32d'6 +x32d-2 +x32i1e +x32i3$ +x32i3: +x32k +x32kp1 +x32l +x32o0k +x32o2 +x32o20 +x32o2x +x32o3+q +x32o3@ +x32o4w +x32o55d +x32o5w +x32p1o5K +x32s7u$A +x32sG6 +x32sg* +x32sqc +x32srl +x32srs +x32t +x32u +x32x42 +x32x65sts +x32x72 +x32z1-3 +x32z2 +x32z3 +x32z4^c +x32z5 +x32} +x34 +x34$$ +x34$& +x34$3p2 +x34$Z +x34$n +x34'5 +x34*13 +x34+1 +x34+6D2 +x34+8l +x34-4 +x34-5 +x34-7 +x34@y +x34C +x34Cu +x34D6 +x34L0 +x34R4 +x34Z1 +x34Z2 +x34Z3{ +x34Z5 +x34[t +x34^4 +x34^J +x34^e +x34^p +x34^usb* +x34^x +x34c +x34d +x34fu +x34l +x34lo0k +x34o2e +x34o38q +x34o3yu +x34o65 +x34o6n +x34q +x34scf'5 +x34seB +x34sifp1 +x34somssm +x34ssp +x34svj +x34x52 +x34x63 +x34x94 +x34z1 +x34z2 +x34z3 +x34z4 +x35 +x35$! +x35$'[ +x35$* +x35$5 +x35$5R2 +x35$A +x35$C +x35$n +x35+0 +x35+0T2 +x35-1 +x35-6 +x35Z1 +x35Z2R0 +x35Z3 +x35Z4-5 +x35Z5 +x35Z5x58 +x35[ +x35^B +x35^nT4 +x35d +x35i1 +x35i33 +x35k +x35l +x35o0cq +x35o0jz2 +x35qT6 +x35sr7 +x35tT7 +x35x92x63 +x35z1 +x35z2 +x35z3 +x35z4 +x36 +x36$ +x36$# +x36$. +x36$0 +x36$2 +x36$p +x36+3 +x36Cz2 +x36D1 +x36D3C +x36L3 +x36T3 +x36Z1$f +x36Z2 +x36Z2c +x36[ +x36^2 +x36^U +x36^b +x36^z +x36d +x36i0@ +x36i5u +x36sbt +x36t^A +x36u +x36z1 +x36z3 +x37 +x37$C +x37$n +x37L5 +x37T6 +x37^C +x37d +x37i0GZ2 +x37i2A +x37i4g +x37l +x37o0V +x37o0x +x37o20 +x37p1 +x37x41 +x37z2l +x37z3 +x37z4'A +x38$7 +x38$l +x38'8 +x38+0 +x38-0 +x38R0 +x38Z2 +x38^O +x38^s +x38i3o +x38o1r +x38o3f +x38sce +x38x51 +x39 +x39$b +x39D0^0 +x39^1 +x39d +x39l +x39o3r +x39q +x39z1 +x3A +x3A^9 +x3Az2R2 +x3B +x3Bo0e +x3Bo3 +x41 +x41$+ +x41$3 +x41$4 +x41$5q +x41$9 +x41$@ +x41$G +x41$Xx91 +x41$w[ +x41'B +x41*23Z3 +x41*40 +x41*40x15 +x41*53 +x41*56C +x41*78 +x41+1*30 +x41-0 +x41@8 +x41@m +x41@t +x41D1 +x41D5 +x41L2@2 +x41R0^m +x41RA +x41T3 +x41Z3 +x41Z4 +x41[$h +x41^6 +x41^K +x41^i +x41^v +x41c +x41d +x41d-2 +x41i2o +x41i4!u +x41l +x41o0h +x41o3S +x41o7i +x41p1 +x41p2 +x41r*36 +x41sh5 +x41sjL +x41sku +x41snl +x41u +x41x54Z2 +x41x61 +x41x82 +x41x86 +x41} +x42 +x42$! +x42$% +x42$& +x42$2Z2 +x42$J +x42$k +x42$o +x42'6 +x42'B +x42*34 +x42*37Z1 +x42*53 +x42+3 +x42+9 +x42-0 +x42-4 +x42-6 +x42-7 +x42-8 +x42@4 +x42D1 +x42D1*21 +x42K$a +x42KZ1 +x42L5 +x42L6 +x42R5 +x42R6x13 +x42R7 +x42T5 +x42Z3 +x42Z4 +x42^& +x42^2 +x42^4 +x42^D +x42^I +x42^d +x42^h +x42c +x42c^h +x42d +x42d+B +x42i1ao48 +x42i2h +x42i3Ut +x42i4= +x42i4e +x42i4zL3 +x42l +x42o0j +x42o21 +x42o3D +x42o5` +x42o5d +x42p1 +x42p2 +x42p2x79 +x42r +x42s91z3 +x42sKE +x42sa +x42sdp +x42sjbD8 +x42slL +x42srz +x42t +x42t*52 +x42u +x42z1 +x42z1i0A +x42z2 +x42z2[ +x42z4+7 +x42{T6 +x42} +x43 +x43$! +x43$4D8 +x43$5 +x43$a +x43$dc +x43$e +x43$k +x43$xx31 +x43'8 +x43*04 +x43*05 +x43*42 +x43*43 +x43+2 +x43+3 +x43+4 +x43+7 +x43-9x73 +x43@7z1 +x43C +x43D7 +x43L0 +x43L4 +x43R0 +x43Z2 +x43Z3 +x43[ +x43^0 +x43^8R3 +x43^C +x43^D +x43^d +x43^i +x43d +x43f +x43i0% +x43i05 +x43i0m +x43i0w +x43i2I^# +x43i2uK +x43i4I +x43i50 +x43i76 +x43l +x43o2n +x43o4B +x43p1+0 +x43s2i +x43s6n +x43sKi +x43sbh +x43t +x43tZ1 +x43u +x43up1 +x43x41$$ +x43x41@l +x43z1 +x43z1x51 +x43z2 +x43{$a +x45 +x45$pl +x45-0Z3 +x45-3 +x45-5 +x45@oi5i +x45C +x45C^. +x45D1 +x45L4 +x45R0 +x45R1 +x45T2^l +x45Z1 +x45Z2 +x45Z5[ +x45[ +x45^7 +x45^L +x45^j +x45^m +x45c +x45i1x +x45i5$ +x45l +x45o2+ +x45o4z +x45o78 +x45oAX'9 +x45p1 +x45s2i +x45spb +x45t +x45x53 +x45z1 +x45z5 +x45{ +x46 +x46$1 +x46$nZ1 +x46'7 +x46'8l +x46+2 +x46-1 +x46-2 +x46L4 +x46T0 +x46T2 +x46Z2 +x46^U +x46d +x46i0L +x46i4Yc +x46o02 +x46o3s +x46o6f +x46x61 +x46z1 +x46z2 +x47 +x47$; +x47-4 +x47D1 +x47R1 +x47[ +x47^FR0 +x47^sx52 +x47c +x47o0_ +x47o3* +x47q +x47sge +x48 +x48$3 +x48$8 +x48$z +x48^! +x48^2x16 +x48p1 +x48sat +x48sek +x48snw +x49 +x49'6 +x49D3^2 +x49Z1 +x49Z2 +x49^1 +x49^9 +x49i4u +x49o7s +x4A$f +x4A$p +x4A-0o1j +x4Ao4m +x4A} +x4Bc +x4Bt +x51 +x51$! +x51$6 +x51$; +x51$@ +x51$S +x51$x +x51$y +x51$z +x51'9 +x51'9so +x51*04 +x51*35 +x51*68 +x51+1 +x51+2Z3 +x51+6 +x51-1 +x51-2 +x51-4^2 +x51-5d +x51-7 +x51C +x51D4x59 +x51Kse6 +x51L3 +x51L3L1 +x51R1r +x51R5x5B +x51R8 +x51T0 +x51T1 +x51T3 +x51T4 +x51Z1t +x51Z2 +x51^' +x51^1 +x51^2 +x51^S +x51^i^o +x51^n +x51^s +x51i0w*67 +x51i2T +x51i2h +x51i2o +x51i3m +x51i3q +x51i44 +x51i4A +x51i6r +x51o0- +x51o1h +x51o3L +x51o3s +x51o4N +x51p1 +x51r +x51s9u +x51sh2o6. +x51sj4 +x51sjm +x51ssa +x51t +x51x03 +x51x25i3k +x51x62 +x51x71 +x51z1 +x51z2x71 +x51z4 +x51{ +x52 +x52$$ +x52$6 +x52$7+4 +x52$9 +x52$@T0 +x52$Cu +x52$G +x52$a +x52$n +x52$p +x52$v +x52'A +x52*02 +x52*05 +x52*31 +x52*32 +x52*41 +x52*67 +x52+2 +x52+3+3 +x52+5 +x52+6i7e +x52-6 +x52@y +x52C +x52D7 +x52L4 +x52R2 +x52R3o66 +x52R4 +x52T5Z4 +x52T5x13 +x52T7l +x52Z1 +x52Z1$q +x52Z3 +x52[Z3 +x52^$ +x52^0 +x52^4 +x52^9 +x52^J +x52^O +x52^_ +x52^k +x52c +x52d +x52i01 +x52i0Q +x52i2u +x52i4r +x52i59 +x52o0C +x52o1P +x52o1dz1 +x52o23 +x52o41 +x52o4g +x52o4j +x52r +x52s0% +x52sMj +x52u +x52x02 +x52x31 +x52z1 +x52z1slI +x52z3 +x52} +x53 +x53$' +x53$H +x53$R +x53$X +x53$do4R +x53'7o0. +x53*10 +x53*96 +x53*97 +x53+9 +x53-2p1 +x53-4 +x53-9 +x53@e +x53D7 +x53L1 +x53L2@5 +x53R6s2r +x53R7 +x53T0 +x53T1 +x53T4 +x53Z1 +x53Z1sde +x53Z2 +x53Z3 +x53Z5 +x53^2 +x53^P +x53^S +x53^no3n +x53c +x53i14 +x53i1a +x53i4l +x53l +x53o2e +x53o3 +x53o6a +x53s0. +x53s1B +x53sln +x53t +x53x62 +x53z2 +x53z3 +x54 +x54$, +x54$t +x54$y +x54+A +x54-1R0 +x54-4 +x54-4+2 +x54-5 +x54@5 +x54C +x54D3 +x54R1 +x54R5 +x54R6 +x54R7 +x54T5 +x54Z1z2 +x54Z3 +x54]x21 +x54cx28 +x54i0t +x54i5t +x54i6i +x54i8i +x54l +x54o1F +x54o2P +x54o3D +x54o4/ +x54o54 +x54o6B +x54o6e +x54set +x54shCx02 +x54smBx32 +x54x04 +x54x48 +x54z1 +x54z2 +x56 +x56$/ +x56$1 +x56$@ +x56$k +x56$w +x56'8o4s +x56+5 +x56+6 +x56-2@6 +x56-3o2& +x56-6 +x56Cx04 +x56L5 +x56R1D3 +x56Z1 +x56Z2 +x56Z3[ +x56^6 +x56^Ox23 +x56^r$b +x56i3x +x56l +x56o3, +x56x01 +x56x02d +x56x14^i +x56z1 +x57 +x57$. +x57$0 +x57@0 +x57@a +x57R5 +x57Z2 +x57csti +x57i0a +x57i3- +x57p1 +x57t +x58 +x58'6i5w +x58+2 +x58+5 +x58z1 +x59$z +x59*16 +x59c+0 +x59i5l +x59to3e +x59x71 +x5A +x5Bo6m +x61 +x61$* +x61$+ +x61$1 +x61$5 +x61$= +x61$p +x61$z +x61*41 +x61*53 +x61*64 +x61*78 +x61-2 +x61@9 +x61@i +x61@m +x61C$r +x61L0 +x61R5 +x61T4 +x61T5 +x61[ +x61^. +x61^/ +x61^1 +x61^? +x61^Q^i +x61^i +x61^q +x61^z +x61i2$x13 +x61i25 +x61i3f +x61i3l +x61i3p'7 +x61i78 +x61i8k +x61i8u +x61l +x61o09 +x61o6 +x61o68 +x61o6g +x61o7w +x61o86 +x61r +x61s8m +x61sjxD4 +x61u +x61x14 +x61x21 +x61x23 +x61x53@h +x61z3 +x61{z4 +x61}-1 +x61}-9 +x62 +x62$n +x62$w +x62'8 +x62*65 +x62+0 +x62+2 +x62+5 +x62-6 +x62-8 +x62@eR1 +x62@u +x62D3 +x62D6s0l +x62D8i61 +x62T3 +x62T6 +x62Z2 +x62Z5*3A +x62[ +x62^3 +x62^H +x62^M +x62^_ +x62^a +x62^l +x62^ul +x62c +x62d +x62i0S +x62i0b^Z +x62i0s +x62i35 +x62i3d-1 +x62i5; +x62i6a +x62i6m +x62i6u +x62i7r +x62l +x62l^M +x62ll +x62o2y +x62o3t +x62o4* +x62o4j +x62o63 +x62o8s +x62r +x62s1i +x62sbd +x62se< +x62x02 +x62x13 +x62x23 +x62z5x27 +x63 +x63$K +x63$R +x63$ao00 +x63$c +x63$mT2 +x63'B +x63*34 +x63*62 +x63-1x25 +x63@h +x63@n +x63R1 +x63R5 +x63R6 +x63R7 +x63Z1 +x63Z3 +x63Z5 +x63[ +x63[x43 +x63^2 +x63c +x63d +x63i0F +x63i3so46 +x63i4s +x63i73 +x63i82T8 +x63l$r +x63o0x +x63o3z +x63p1x04 +x63r +x63scH +x63sk$ +x63sxS +x63u +x63z3$B +x64 +x64$! +x64$$ +x64$0 +x64$9 +x64$g +x64$u +x64+1 +x64+9 +x64-6 +x64-8o5m +x64T0 +x64[o5c +x64^7 +x64^g +x64i5o +x64i6< +x64i6t +x64i6w +x64l +x64o5q +x64skL +x64t +x64x23 +x64x32 +x64x91x43 +x65 +x65$+ +x65$/ +x65$c +x65$k +x65*76 +x65+6 +x65@n +x65D0 +x65R0 +x65[ +x65l +x65o0K +x65o0v +x65o1t +x65o6p +x65o91 +x65slb +x65x03 +x65x0B +x65x21 +x65x73 +x67 +x67$. +x67+7 +x67-4 +x67D2@w +x67T0 +x67i3l +x67o6ml +x68Z1 +x69 +x69$x +x69-5 +x69z1 +x6A +x6A$1 +x6B[ +x71 +x71$" +x71$2D3 +x71$9 +x71$E +x71$a +x71$k +x71'8$g +x71'B +x71*53 +x71*56 +x71*58D5 +x71+5 +x71-0c +x71-2'5 +x71@9 +x71@s +x71L7 +x71R6 +x71T2 +x71T7 +x71Z4 +x71[x41 +x71c} +x71k*64 +x71o5 +x71o6h +x71o6j +x71o81 +x71o8e +x71o8k +x71r +x71s2! +x71s2x +x71sh-x43 +x71tt +x71x04$f +x71x21 +x71z2x31 +x72 +x72$0 +x72$3 +x72$4x63 +x72$a +x72'B +x72*13 +x72+1 +x72+2T6 +x72+8 +x72-5 +x72D1 +x72R7 +x72T2 +x72T7o74 +x72Z2 +x72Z3 +x72Z5 +x72[ +x72[l +x72^2 +x72^O +x72^h +x72^l +x72^m +x72c +x72i0f +x72i62 +x72i83 +x72l +x72o0v +x72o6u +x72o7Z +x72sa1 +x72t +x72x31 +x72x42 +x72z1 +x73 +x73$4 +x73$6T6 +x73$8 +x73$C +x73$z +x73'9u +x73D8 +x73L1 +x73R4 +x73R6 +x73R8 +x73T6 +x73^S +x73^a +x73^i +x73^k +x73i6e +x73l +x73o14 +x73o64 +x73o8! +x73o8? +x73o9o +x73s23 +x73t +x73x51 +x73x84 +x74 +x74$# +x74$i +x74$y +x74'9 +x74+1 +x74+9 +x74@3 +x74D2 +x74T1 +x74i5sD1 +x74l +x74l'8 +x74o0g +x74o0rT7 +x74o4o +x74x04 +x75 +x75$1 +x75$u +x75+9 +x75D3sck +x75L0 +x75R7 +x75T0 +x75Z1 +x75i70 +x75o4z +x75o8h +x75x03 +x75x13 +x75x51 +x76 +x76+3 +x76+7 +x76[ +x76i7# +x76o6 +x76x81 +x78$5 +x78i3t +x7A+0 +x7Bc-7 +x7Bx1Ax15 +x7Bx43x2B +x81 +x81$1 +x81$9 +x81$m +x81$z +x81'9 +x81*34 +x81*91 +x81-1 +x81-6 +x81-8 +x81-9 +x81-A +x81@b+3 +x81D1 +x81D2 +x81R8 +x81T3 +x81T4 +x81T5 +x81T8 +x81[@f +x81i8ac +x81o0ux53 +x81o2e +x81o5+ +x81o8- +x81o8s +x81o93 +x81p1x6A +x81r +x81s21 +x81seo +x81sry +x81x12 +x81x25l +x81x42 +x81x61 +x81x94 +x82 +x82$6 +x82$c +x82$t +x82'A +x82*86 +x82*94'9 +x82*96 +x82*98 +x82+1 +x82-0 +x82-1 +x82-9 +x82D3 +x82D5 +x82L1 +x82R4x32 +x82R7 +x82T7 +x82Z2 +x82^1 +x82c +x82i6a +x82l +x82s45 +x82x06 +x82x17i1T +x82x34 +x82x92 +x83 +x83$! +x83$# +x83$3 +x83$7 +x83'A +x83*57 +x83L8 +x83Z1 +x83Z2 +x83Z3 +x83^+ +x83c +x83l +x83o6h +x83o7mx04 +x83sa1 +x83x02T5 +x83x04^z +x83x12 +x83x42 +x83x43 +x83x51 +x84 +x84$9 +x84*78 +x84+7 +x84-7 +x84-8 +x84L8 +x84Z1 +x84Z1x24 +x84^x +x84i8c +x84l +x84oB0 +x84x34 +x85 +x85*67 +x85D0 +x85L8 +x85l +x85x43 +x86 +x86$1 +x86$l +x86-7 +x86-8 +x86T0 +x86x23 +x86x52 +x87 +x87'8o6u +x87+2 +x87x21 +x89+9'9 +x89l +x89x62+7 +x91 +x91$9 +x91$< +x91$a +x91'B +x91+6 +x91+B +x91@dx02 +x91@t +x91R8 +x91R9 +x91i1Qx04 +x91i85 +x91o0j +x91o69 +x91o6p +x91o8_ +x91s92 +x91x06 +x91x24 +x91x51'A +x91x71 +x92 +x92$6 +x92$y +x92*87x08 +x92*98 +x92+7'A +x92+A +x92-8 +x92-9 +x92@3[ +x92Z1 +x92cx71 +x92i20 +x92u +x92x21 +x92x25 +x92x35 +x93 +x93$2 +x93*18x07 +x93-7 +x93C +x93D6 +x93L9 +x93c +x93i9e +x93l +x93x07 +x93x41 +x93x62 +x94 +x94T9o9g +x94x13 +x94x26 +x94x27R1 +x95 +x95$5 +x95o66 +x95x42 +x96 +x96'B +x96-6 +x96i16x15 +x97 +x9Al +x9Ax15 +x9Ax56x18 +x9Ax62 +xA1$yx4A +xA1'B +xA1+7 +xA1+A +xA1+A$6 +xA1-9 +xA1@gx23 +xA1D8 +xA1LA +xA1Z1'B +xA1i0Zx06 +xA1i2k +xA1o1a +xA1oA6 +xA1oB0 +xA1x15 +xA1x21 +xA1x51 +xA2 +xA2*97 +xA2+A +xA2T8x26 +xA2[ +xA2u +xA3 +xA3-A +xA3D6 +xA3c +xA4 +xA4$! +xA4$S +xA4D9u +xA4cx03 +xA4x35 +xA5x15 +xA6 +xA7x07 +xA9x57 +xABxB4x69 +xB1$1 +xB1$2 +xB1$3 +xB1-B +xB1D1'8 +xB1oB3 +xB2 +xB2$0 +xB2$4 +xB2$7 +xB2'9x04 +xB2+B +xB2iB9 +xB2l +xB2x16 +xB2x36 +xB3 +xB3$6 +xB3+9 +xB3-B +xB3Z1 +xB3[ +xB3l +xB3x04 +xB3x17 +xB4 +xB4$r +xB4x19 +xB5 +xB6x04 +xB6x46 +xB7 +z1 +z1$' +z1$* +z1$-^A +z1$1 +z1$2 +z1$3 +z1$3^l +z1$7+3 +z1$7@j +z1$; +z1$?k +z1$T +z1$bu +z1$d +z1$f +z1$h +z1$i +z1$jR4 +z1$k +z1$l +z1$lC +z1$m +z1$n +z1$o +z1$u +z1$x +z1$y-1 +z1'5+1 +z1'5z5 +z1'6$0 +z1'7^M +z1'8 +z1'9T4 +z1'A +z1*02 +z1*03 +z1*10-B +z1*13 +z1*16 +z1*23 +z1*24 +z1*28 +z1*30 +z1*31-5 +z1*3Bc +z1*45x14 +z1*46 +z1*50 +z1*51} +z1*53 +z1*60 +z1*80i1{ +z1*84 +z1*94x12 +z1+1 +z1+2 +z1+3 +z1+4 +z1+5 +z1+6 +z1+6R6 +z1+7 +z1+9 +z1-1 +z1-1sf0 +z1-3 +z1-3d +z1-4 +z1-5 +z1-5Z1 +z1-9x32 +z1@1 +z1@2 +z1@7 +z1@a@1 +z1@b +z1@e +z1@f +z1@g +z1@gT0 +z1@k +z1@m +z1@p +z1@s+7 +z1@t +z1@tz3 +z1@z +z1C +z1Co1f +z1CsHM +z1D2 +z1D4shQ +z1D9 +z1DB +z1L0$1 +z1L1 +z1L2^7 +z1L3 +z1L6 +z1R3 +z1R5 +z1R7k +z1R8 +z1RAx54 +z1T0 +z1T2 +z1T5 +z1TB[ +z1Z1*38 +z1Z1^S +z1Z1i16 +z1Z2 +z1Z2^4 +z1Z3 +z1Z3'5 +z1Z3^q +z1Z3q +z1Z4 +z1Z5 +z1[t +z1]r +z1^# +z1^)c +z1^/ +z1^0 +z1^2 +z1^4 +z1^5 +z1^7 +z1^8 +z1^9 +z1^9TB +z1^: +z1^= +z1^A +z1^D +z1^G +z1^I +z1^J +z1^L +z1^N +z1^R +z1^X +z1^^ +z1^a +z1^d +z1^e +z1^f +z1^h +z1^i +z1^j +z1^n +z1^p +z1^s +z1^w +z1^x +z1^| +z1c +z1d +z1f +z1i00 +z1i0F +z1i0F$1 +z1i0I +z1i0k +z1i0l} +z1i0u +z1i0}$7 +z1i1 +z1i1.D5 +z1i14 +z1i15 +z1i17 +z1i1; +z1i1_ +z1i1a +z1i1e +z1i1f +z1i1i +z1i1j +z1i1n +z1i1p +z1i1s +z1i1t +z1i2( +z1i28 +z1i29 +z1i2F +z1i2K-5 +z1i2R +z1i2W +z1i2_T0 +z1i2l +z1i3K +z1i3_*17 +z1i3k +z1i41 +z1i4_ +z1i4h +z1i4ssg3 +z1i5/ +z1i5Z*47 +z1i5e +z1i5f +z1i5yi6R +z1i6q +z1i7G +z1i8a +z1i8lx23 +z1i8t +z1i9H +z1iA1 +z1k +z1k^H +z1lx57 +z1o05+8 +z1o0nT4 +z1o0od +z1o0yz3 +z1o1dz5 +z1o1r +z1o2% +z1o24 +z1o2N +z1o2O +z1o2X+6 +z1o2_ +z1o2gl +z1o2y +z1o3- +z1o3No4) +z1o3_ +z1o3f +z1o3m +z1o3x +z1o3z +z1o4, +z1o49 +z1o4c +z1o4k +z1o52 +z1o56Z3 +z1o5E +z1o5Ji3? +z1o5Y +z1o5k +z1o6)x03 +z1o61 +z1o6l +z1o6w +z1o6| +z1o71 +z1o7L +z1o7f +z1o7n +z1o7p +z1o8n +z1o91 +z1o93 +z1oAs +z1p1 +z1p1'5 +z1p1-5 +z1p1z1 +z1r$i +z1r*60 +z1r^r +z1rt +z1s0Dx07 +z1s3e +z1s5pc +z1s8zx72 +z1s;| +z1sd5^v +z1sd= +z1sf* +z1shi +z1sig +z1sm/*52 +z1sm8i5n +z1sn9o0p +z1sot +z1stj +z1t +z1tD5 +z1x02o1B +z1x03p1 +z1x06^r +z1x07z2 +z1x0Ai1[ +z1x16Z2 +z1x19'7 +z1x24 +z1x27 +z1x32 +z1x34 +z1x36 +z1x36+4 +z1x37 +z1x38 +z1x42 +z1x43T2 +z1x47 +z1x51 +z1x52 +z1x52Z1 +z1x54 +z1x61 +z1x62 +z1x62l +z1x63 +z1x63l +z1x71 +z1x72 +z1x75 +z1x81 +z1x83 +z1x93 +z1xA7x23 +z1z1 +z1z1*25 +z1z1*68 +z1z1o0l +z1z2 +z1z2^M +z1z2o7m +z1z2o8n +z1z3 +z1z4 +z1z4k +z1z4o47 +z1{ +z1} +z1}$m +z1}R5 +z1}Z1 +z1}k +z1}u +z1}z1 +z2 +z2$! +z2$# +z2$- +z2$-x31 +z2$. +z2$0 +z2$1 +z2$2z2 +z2$4 +z2$5*58 +z2$6l +z2$7 +z2$8 +z2$@ +z2$A +z2$Ax2A +z2$Co80 +z2$D +z2$H +z2$Qo5f +z2$Wx36 +z2$^Z2 +z2$c +z2$c^a +z2$fc +z2$h +z2$io1L +z2$j +z2$k +z2$l +z2$o +z2$o*49 +z2$oT0 +z2$r +z2$s +z2$u +z2$wz1 +z2$y +z2$z +z2$| +z2'5 +z2'5x21 +z2'8 +z2'8d +z2'9 +z2'A +z2*03 +z2*04 +z2*07 +z2*13x02 +z2*14 +z2*15 +z2*20 +z2*23 +z2*24 +z2*25o7r +z2*31 +z2*31} +z2*36*79 +z2*36o19 +z2*39*40 +z2*47 +z2*48*48 +z2*50 +z2*61 +z2*65 +z2*71 +z2*72 +z2*73 +z2*91 +z2*96 +z2+0 +z2+0r +z2+1 +z2+2 +z2+4 +z2+4$@ +z2+5 +z2+6 +z2+7t +z2+8 +z2+9 +z2+B +z2-0 +z2-1 +z2-1{ +z2-2 +z2-2*69 +z2-3o0T +z2-4 +z2-5 +z2-8 +z2-9 +z2-A +z2@2 +z2@3 +z2@a +z2@b +z2@bt +z2@j +z2@m +z2@q +z2C +z2C*54 +z2CZ1 +z2D4^+ +z2D5Z5 +z2D7x81 +z2D8 +z2K +z2L0*53 +z2L0i2< +z2L1 +z2L3 +z2L7 +z2R0 +z2R0'7 +z2R1 +z2R2 +z2R3 +z2R4-6 +z2R5 +z2R6 +z2R9 +z2T0*45 +z2T2x38 +z2T4 +z2T4L1 +z2Z1 +z2Z2r +z2Z3x38 +z2Z5x14 +z2[ +z2[i6N +z2] +z2]u +z2^ +z2^" +z2^"C +z2^#$j +z2^*$% +z2^,k +z2^2 +z2^2i3r +z2^4 +z2^7 +z2^< +z2^A*80 +z2^AD4 +z2^W +z2^X$! +z2^[ +z2^` +z2^a +z2^b +z2^c +z2^e +z2^i +z2^ii5y +z2^k*53 +z2^m +z2^p +z2^t +z2^vz2 +z2^{^N +z2c +z2cZ1 +z2c^[ +z2co7d +z2dx82 +z2i0! +z2i0Fi4b +z2i0J +z2i1 ^h +z2i1+] +z2i14 +z2i19] +z2i1C+5 +z2i1Vc +z2i1a +z2i1k +z2i1m*13 +z2i1n +z2i1o +z2i1u +z2i2g +z2i38c +z2i3f*16 +z2i3h +z2i3l*06 +z2i3o +z2i3p +z2i3ro4k +z2i58 +z2i5Lx36 +z2i5g +z2i6gk +z2i6u +z2i73 +z2i7a +z2i7o +z2i7s +z2i7t +z2i99*36 +z2i9e +z2l +z2lr +z2lx52 +z2o0!i0f +z2o0"*06 +z2o03 +z2o05 +z2o06 +z2o0A +z2o0Z +z2o0g*15 +z2o0h +z2o0m +z2o0n +z2o1- +z2o1. +z2o1/ +z2o10 +z2o15 +z2o1H +z2o1k +z2o1l +z2o1s +z2o1u +z2o1y +z2o2- +z2o21 +z2o2P +z2o2a*07 +z2o2b +z2o2gx35 +z2o2l +z2o36 +z2o3>$2 +z2o3\i1k +z2o3mD5 +z2o3o +z2o4H +z2o4Z +z2o4qz1 +z2o59 +z2o5w +z2o6= +z2o6> +z2o6Qi7N +z2o6a +z2o6nk +z2o7.l +z2o74 +z2o7N +z2o7gz1 +z2o7l +z2o83 +z2o88 +z2o93 +z2oB9 +z2p1 +z2p2x74 +z2q +z2r +z2r-7 +z2rc +z2s.@c +z2s0Ol +z2s2b +z2s4f +z2s4x +z2s7m +z2s97 +z2s9k +z2sbq +z2scl +z2sd8 +z2si3x34 +z2siai2g +z2slMo99 +z2srtx04 +z2su% +z2sx +z2t +z2tK +z2tt +z2u +z2u+9 +z2u^0 +z2u^K +z2uo1< +z2usG0 +z2x24 +z2x27 +z2x29Z1 +z2x2A +z2x32 +z2x35*03 +z2x35T0 +z2x42 +z2x45i0E +z2x47 +z2x51 +z2x53 +z2x61 +z2x63 +z2x65l +z2x71 +z2x71k +z2x73 +z2z1i2: +z2z1i37 +z2z2 +z2z3 +z2z3o5l +z2z4 +z2{Z5 +z2} +z2}*29 +z3 +z3$+ +z3$1 +z3$3 +z3$5x51 +z3$7 +z3$7k +z3$Ak +z3$a +z3$c +z3$e +z3$ei4; +z3$el +z3$f +z3$h +z3$k +z3$n +z3$o +z3$rD9 +z3$s +z3$u[ +z3$w] +z3$y +z3'5 +z3'8 +z3'8Z4 +z3'9 +z3'9r +z3'A +z3'B*39 +z3*01 +z3*04 +z3*06 +z3*07 +z3*14 +z3*15 +z3*16*70 +z3*17 +z3*19 +z3*20 +z3*21 +z3*23 +z3*24 +z3*26 +z3*27 +z3*28 +z3*30 +z3*35 +z3*43 +z3*46 +z3*47 +z3*53 +z3*57x71 +z3*58 +z3*58o8* +z3*61 +z3*67 +z3*72T5 +z3*73 +z3*75 +z3*83 +z3*85 +z3*87 +z3*94R3 +z3*95+8 +z3*97 +z3+0 +z3+1 +z3+1x49 +z3+2 +z3+4z5 +z3+5 +z3+5x41 +z3+6 +z3+6u +z3+7 +z3+8 +z3-1 +z3-1-2 +z3-2 +z3-3 +z3-4 +z3-5-3 +z3-6 +z3-7 +z3-9 +z3@a +z3@h +z3@j +z3@k +z3@mss1 +z3C +z3D0x61 +z3D0z1 +z3D1*75 +z3D3Z2 +z3D3x2B +z3D4*59 +z3D5r +z3D7 +z3D8 +z3K +z3K$g +z3K} +z3L4x38 +z3L5 +z3R0*37 +z3R1 +z3R4 +z3R4-0 +z3R6 +z3R7 +z3T1 +z3T2 +z3T4sru +z3Z1*80 +z3Z1-0 +z3Z3 +z3Z3'8 +z3Z3+9 +z3Z4 +z3[ +z3[i44 +z3[o7i +z3[{ +z3] +z3^! +z3^"[ +z3^# +z3^' +z3^. +z3^; +z3^B +z3^D-5 +z3^G +z3^Qi0S +z3^R$` +z3^V +z3^Y +z3^Y*30 +z3^c +z3^m +z3^q +z3^q-8 +z3^ssns +z3^w^= +z3^wl +z3^x +z3c +z3c*42 +z3cK +z3cs7V +z3dx54 +z3i01^# +z3i0U +z3i0d +z3i15 +z3i1Xx01 +z3i26 +z3i28 +z3i3gx48 +z3i3r +z3i3z +z3i41 +z3i4C +z3i4l +z3i4yx36 +z3i5^ +z3i5zT4 +z3i5{ +z3i6++8 +z3i6r +z3k'7 +z3kk +z3ksgc +z3l +z3o08 +z3o0f +z3o0mZ1 +z3o0n +z3o0qo4! +z3o12 +z3o1O*84 +z3o1c +z3o2- +z3o21 +z3o23 +z3o2Lx64 +z3o2b +z3o39z2 +z3o3A +z3o3j[ +z3o3r+5 +z3o3z +z3o48L6 +z3o4J +z3o4Z +z3o4d +z3o4dD5 +z3o5Xc +z3o5b +z3o5d^' +z3o5g +z3o5l*38 +z3o6-D0 +z3o6}*2B +z3o7g +z3o8 +z3o88 +z3o8P +z3o8h +z3r +z3rsk* +z3s3lx35 +z3s8jo84 +z3sM4x24 +z3sMr +z3scl +z3scr +z3siI*26 +z3sis +z3sjW +z3srx +z3ssz*23 +z3sys +z3szd +z3t +z3tx54 +z3x01x72 +z3x02@2 +z3x02^E +z3x13 +z3x14Z4 +z3x25u +z3x27 +z3x29 +z3x29$B +z3x2A +z3x36i11 +z3x39 +z3x41 +z3x41x46 +z3x42 +z3x43 +z3x45 +z3x52 +z3x52z4 +z3x53 +z3x56 +z3x61 +z3x61{ +z3x63 +z3x63*42 +z3x72 +z3x75 +z3x84 +z3xA1*5A +z3z2 +z3z2*65 +z3z3 +z3z3*81 +z3z3C +z3z3^N +z3z4 +z3z5 +z3z5-A +z3z5x93 +z3{ +z3{-4 +z3{^' +z3{k +z3} +z3}^( +z3}i4* +z4 +z4$! +z4$0 +z4$1 +z4$2 +z4$6 +z4$=C +z4$M +z4$b +z4$e +z4$e*71 +z4$f +z4$m +z4$x +z4$x} +z4'7 +z4'9o2^ +z4*07 +z4*0A +z4*17 +z4*23 +z4*24 +z4*25 +z4*28'5 +z4*28x62 +z4*32 +z4*35'A +z4*36 +z4*36+4 +z4*49 +z4*50x54 +z4*51 +z4*54 +z4*58 +z4*59x16 +z4*60 +z4*61$3 +z4*73*59 +z4*76 +z4*78*43 +z4*78*76 +z4*81 +z4*83x61 +z4*85 +z4*95*35 +z4*98 +z4+0 +z4+0+6 +z4+1 +z4+2 +z4+5 +z4+6T2 +z4+7 +z4+9 +z4+9^+ +z4+A +z4-0 +z4-0] +z4-1 +z4-2 +z4-3 +z4-4 +z4-5 +z4-7 +z4-8x12 +z4C +z4D2[ +z4D4 +z4D6 +z4D7 +z4D8 +z4K*35 +z4L0 +z4L1 +z4L2x38 +z4L5 +z4L6x01 +z4R2 +z4R3 +z4R6+3 +z4R8*21 +z4T1 +z4T2sm5 +z4T4 +z4T5 +z4T7+4 +z4Z1 +z4Z1D2 +z4Z1x23 +z4Z1x81 +z4Z1} +z4Z2$A +z4Z3 +z4Z5 +z4[ +z4[$b +z4[C +z4[L2 +z4[o4l +z4[r +z4] +z4]{ +z4^. +z4^4D2 +z4^9 +z4^: +z4^B-8 +z4^N +z4^`*5A +z4^c +z4^i +z4^j +z4^n +z4^|o0O +z4c +z4f'9 +z4i0b +z4i11 +z4i1h +z4i2Dsrw +z4i37 +z4i4# +z4i4- +z4i47 +z4i4b +z4i4f +z4i5_ +z4i5m +z4i5y[ +z4i6c'6 +z4i6d +z4i7& +z4i8@x27 +z4i9r +z4iBd +z4k +z4lD1 +z4li4+ +z4ll +z4o2y +z4o3[ +z4o3d +z4o3h +z4o3l$1 +z4o3y +z4o3{ +z4o4> +z4o6= +z4o7d +z4o7u +z4o84c +z4o8U +z4o8z +z4oAr +z4p1x3A +z4p3 +z4r +z4r*18 +z4rK +z4rx34 +z4s0ao3f +z4sbq +z4srPT5 +z4sso +z4suy +z4sw+ +z4swv +z4t +z4t$L +z4tx34 +z4x01@e +z4x03 +z4x06$u +z4x06o3v +z4x12 +z4x12*12 +z4x14$g +z4x16i4e +z4x16o4% +z4x18+2 +z4x1AZ2 +z4x23 +z4x24i7O +z4x28u +z4x29 +z4x32R2 +z4x34} +z4x35 +z4x35f +z4x35o0N +z4x37 +z4x42o6x +z4x43 +z4x43C +z4x46 +z4x54R0 +z4x56 +z4x5A +z4x61 +z4x63z5 +z4x64 +z4x71+9 +z4x75 +z4x81 +z4x82 +z4x92c +z4z1 +z4z3 +z4z4 +z4z5 +z4z5x75 +z4{ +z4{+0 +z4{^y +z4} +z4}x28 +z5 +z5$9 +z5$; +z5$y +z5'6T4 +z5'7 +z5'8 +z5'8$o +z5'B +z5*04 +z5*05^D +z5*17 +z5*27+3 +z5*36 +z5*48 +z5*4Ai0# +z5*53 +z5*60 +z5*64 +z5*67 +z5*67k +z5*72[ +z5*74 +z5*A2x92 +z5+1 +z5+2 +z5+4 +z5+4shk +z5+5T5 +z5+6 +z5+7 +z5+7z3 +z5+8o8f +z5-0 +z5-1+2 +z5-2 +z5-6 +z5-9 +z5@3 +z5@a +z5D0 +z5D5 +z5D7-4 +z5D8 +z5K +z5L1 +z5R0 +z5R1 +z5R5 +z5T1 +z5T5 +z5T7-3 +z5Z1x27 +z5Z2x27 +z5Z4 +z5Z4^g +z5[ +z5[o4o +z5] +z5^/ +z5^3x75 +z5^6 +z5^D +z5^m +z5^nz1 +z5^w +z5^z +z5^zx76 +z5d'9 +z5i01z4 +z5i3px04 +z5i3|i6X +z5i4c +z5i57 +z5i5l +z5i69x57 +z5i6U +z5i71x34 +z5i7R +z5i7u*9B +z5i9?x57 +z5i9Zl +z5k +z5ki6d +z5kx73 +z5l +z5o0er +z5o10o3k +z5o1X +z5o1li28 +z5o3O-8 +z5o4f +z5o4{x39 +z5o6d*15 +z5o6t +z5o7e +z5o7pD8 +z5oA1i4l +z5oA3z1 +z5qx3A +z5rx34 +z5s36 +z5s36x36 +z5s5q +z5s5t +z5s9Ax1B +z5shsx38 +z5sw& +z5t*76 +z5u +z5u+3 +z5x03*42 +z5x07@p +z5x0B+5 +z5x0B^r +z5x15 +z5x17k +z5x1AZ1 +z5x23i72 +z5x24x76 +z5x25 +z5x28 +z5x29 +z5x35 +z5x35Z2 +z5x38+1 +z5x38l +z5x39 +z5x3A +z5x41^: +z5x43 +z5x45r +z5x48 +z5x49Z1 +z5x53K +z5x53^; +z5x56 +z5x5Az2 +z5x61 +z5x62 +z5x62i40 +z5x63 +z5x64 +z5x65 +z5x65D6 +z5x68 +z5x71*27 +z5x71D1 +z5x71o33 +z5x72 +z5x73 +z5x73*23 +z5x79 +z5x79$r +z5x81] +z5x84 +z5z1 +z5z1x32 +z5z2 +z5z3o7b +z5z4 +z5}x47 +{ +{$) +{$+ +{$- +{$0 +{$1 +{$2 +{$4 +{$6 +{$7 +{$8$P +{$9 +{$C +{$Pl +{$_ +{$` +{$a +{$e^` +{$g +{$i +{$j +{$k +{$l +{$n +{$oz3 +{$s +{$w +{$x +{'9 +{*03 +{*05 +{*12 +{*13 +{*16 +{*17 +{*20u +{*24 +{*25 +{*27 +{*30z1 +{*31*51 +{*32 +{*34 +{*35*13 +{*37 +{*41 +{*42 +{*42o3> +{*50 +{*51C +{*65 +{*A7 +{+1 +{+1Z2 +{+4 +{+7 +{+7*75 +{+9 +{-0 +{-0t +{-3 +{-4c +{-7 +{-8 +{C +{C[ +{Ci1R +{D1t +{D3 +{K*35 +{L1 +{L6l +{L8 +{R0 +{R0z1 +{R2 +{R3 +{R3[ +{R5 +{R7 +{R8 +{R9 +{T0 +{T2 +{T6i3X +{Z1 +{Z1'4 +{Z1*26 +{Z1o0: +{Z1s1^ +{Z1z2 +{Z2 +{Z2$0 +{Z2R5 +{Z2u +{Z3 +{Z3k +{Z4 +{Z4r +{Z5 +{[sfd +{]i2v +{^! +{^% +{^* +{^. +{^0 +{^1 +{^3 +{^7 +{^8 +{^9 +{^:D1 +{^;L0 +{^= +{^> +{^Au +{^B +{^C +{^E +{^L +{^M +{^R +{^T +{^X^Q +{^a +{^b +{^d +{^j +{^k +{^m +{^p +{^t +{^w +{^y$f +{c +{cx21 +{d +{f +{i0$ +{i0L +{i0X +{i1' +{i14 +{i15 +{i16 +{i17 +{i18 +{i1a +{i1d +{i1} +{i2+Z2 +{i2V +{i2` +{i2c +{i3-o20 +{i3N +{i3Y +{i3g +{i3w^p +{i4$ +{i4J +{i5i +{i5j +{i5r +{i65 +{i6C +{i6L +{i6W +{i6xi4+ +{iA0 +{k +{kz4 +{l +{o0D +{o0I +{o0T +{o0j +{o0m +{o0q +{o1i*13 +{o2/[ +{o2: +{o2I +{o3/ +{o46 +{o4_ +{o4b +{o4q +{o5c +{o5f+1 +{o5z +{o6**60 +{o61 +{o6t +{o7= +{o7k +{o8E +{o8O +{o8x +{oA2 +{p3 +{q +{q*65 +{qZ2 +{qu +{r +{s0a +{s19 +{s3$ +{sbu +{scs +{sei$i +{sg{ +{sn9 +{snkZ2 +{sog +{ssv +{sue +{svu +{t +{u +{x02 +{x03 +{x05Z4 +{x12 +{x21l +{x21o5n +{x21z5 +{x23 +{x24 +{x25q +{x51o8o +{x61 +{x71 +{x92 +{z1 +{z1Z1 +{z1o5K +{z2 +{z2$A +{z2*03 +{z2*63 +{z2i2> +{z2o5e +{z3 +{z3x01 +{z3{ +{z4*81 +{z5 +{{ +{{c +{{i32 +{{{ +{{{c +{{{{ +{{{{c +{{{{{ +{{{{{c +} +}$ +}$% +}$' +}$* +}$- +}$3 +}$4o0x +}$5 +}$6 +}$6*53 +}$6^& +}$7 +}$? +}$Ai13 +}$G +}$O +}$P +}$Qo5$ +}$Xx52 +}$d +}$j +}$j-4 +}$n +}$o +}$q +}$r +}$v +}$z +}${ +}'6 +}'7 +}'9 +}'A +}*01 +}*01Z3 +}*03$7 +}*14 +}*15x12 +}*23d +}*24 +}*24*74 +}*25^z +}*30 +}*30D0 +}*35'5 +}*35*50 +}*40 +}*42Z1 +}*43 +}*48 +}*54 +}*61 +}*62 +}*63 +}*75D3 +}*91 +}*A0 +}*B7L6 +}+3Z2 +}+4 +}+4} +}+9 +}-0 +}-1*53 +}-2k +}-4 +}-7o4a +}-9} +}D1 +}D1Z4 +}D4 +}D4o3y +}D8 +}L0 +}R0 +}R2 +}R4 +}T2 +}T3 +}T4 +}Z1 +}Z2 +}Z2$n +}Z2L0 +}Z2o0I +}Z2o7[ +}Z3 +}Z4 +}Z4$W +}Z4x21 +}Z5 +}Z5'7 +}[ +}[*72 +}[T6 +}[d +}[z3 +}]$g +}^" +}^$ +}^& +}^* +}^1 +}^2 +}^4 +}^6 +}^7 +}^8 +}^: +}^; +}^C +}^G +}^M +}^P +}^Q +}^Y^q +}^] +}^_-0 +}^a +}^b +}^c +}^d +}^e +}^f +}^g +}^h +}^hz5 +}^i +}^j +}^k +}^k{ +}^l +}^p +}^p*05 +}^q +}^s +}^t^K +}^v +}^w +}c +}c-2 +}c^3 +}dl +}dx04 +}f +}i0" +}i04 +}i0A +}i0S +}i0z +}i1D +}i1^ +}i1f +}i1wi74 +}i1{ +}i2/R2 +}i2b +}i30D5 +}i3G +}i3NsgO +}i3n +}i4-x34 +}i50 +}i56 +}i6" +}i6p +}i7Xx54 +}k +}k*10 +}ku +}lz4 +}o0 +}o02 +}o0G +}o0b +}o0k +}o0v +}o0x +}o18Z2 +}o1a +}o1c +}o1h +}o1o +}o2 +}o2/ +}o23^v +}o24^H +}o24i49 +}o2_ +}o3*Z1 +}o3Rr +}o3f-0 +}o3l +}o3p^k +}o3y +}o4b +}o4d +}o4r +}o4u +}o53 +}o59 +}o5ci7% +}o5x +}o6- +}o6@*67 +}o6Gc +}o6g +}o6p +}o7_^E +}o7u +}o8X +}p1 +}p1o5p +}p1x43 +}q +}q'8 +}q-7 +}q^T +}r +}r*50 +}rD0 +}s0- +}s1d +}s38 +}s5$ +}sAu +}sAy +}sRm +}san +}sc]{ +}scrK +}slc +}soi +}sro +}svr +}t^S +}u+3 +}uL7 +}uz2 +}x02 +}x02p1 +}x03 +}x04 +}x05 +}x08 +}x13 +}x14 +}x21 +}x32 +}x37 +}x41 +}x43 +}x52 +}x72 +}x91 +}z1 +}z1i1Y +}z1o5o +}z1sv# +}z2 +}z2u +}z3 +}z4 +}z4$7 +}z4z3 +}z4z5 +}z5 +}{ +}{T4 +}} +}}*80 +}}c +}}d +}}} +}}}c +}}}} +}}}}c +}}}}} +}}}}}c diff --git a/rules/dive.rule b/rules/dive.rule new file mode 100644 index 0000000000..a5ae05e4b4 --- /dev/null +++ b/rules/dive.rule @@ -0,0 +1,123289 @@ +# My current collection of rules, ordered by hits. +# Many rules were handwritten, many were generated. +# this list accounts for > 70 million hits. +# - dive +# +# ** note: this is the version with gpu-specific rules. +c +l +u +T0 +$1 +} } } } +p3 +[ +$. +] +$5 +$2 +} } } +r +$4 +$3 +$7 +$0 +$9 +$6 +$8 +} ] ] { +'7 +E +,2 +} +Y1 +D4 +D2 ++0 +0 +0 x12 ++0 x12 +0 +0 ++0 +0 x12 +0 +T5 +*42 +D3 +'8 +$1 $2 $3 +K ++0 +x14 ++2 +{ +$1 $9 $9 $5 +$1 c +^1 +'6 +$s +$? +*53 +$9 $5 ++1 +$1 $2 +l $1 +t +l $2 +$2 $3 +s15 +D2 D2 +} x02 +*06 +*13 +'9 +C +$0 $1 +} } } } '4 +$1 $1 +*21 +$e ++3 +f +c$1 +rcrT0 +$0 $0 ++7 +-4 +c $1 $2 $3 +$9 $9 +x03 +$1 $3 +'4 ++5 +*02 +^e ^h ^t ++6 +o0d +$6 $9 +o0b +*15 +'5 +$0 $2 +*10 +*25 +Y2 +$2 $1 +*43 +} } } } } +] ] +$2 $2 +*54 +*03 +x32 +se3 +D6 +k +'A +$8 $8 +so0 +p1 +.1 +] ] ] $y +-0 +s06 +si1 +x42 +*50 +*04 +: +-7 +$7 $7 +$9 $7 $2 +Z1 +$9 $7 $1 +-3 +$2 $0 $0 $0 +] $a +D0 +} '7 +o0m o1a +*30 +.0 +-2 +] ] ] $o +] ] D1 ] +] D1 ] ] +] ] ] D1 +$! +*34 +*24 { +x26 +c $1 $1 ++9 +c $2 +] $r +l $2 $0 $0 $7 +-1 +^4 +xB6u +-5 +l $2 $0 $0 $4 +uu +] ] $s +*54 *20 +*41 +D7 +*12 +.2 +] ] ] +c $2 $2 +c $1 $1 $1 +c $1 +D5 +*62 +x01 ++8 +-6 +l $2 $0 $0 $3 +D1 +c $1 $2 +x62 +d '7 +l $2 $0 $1 $2 +c $7 $7 $7 +] ] $e $r +l $2 $0 $0 $0 +^3 *50 +[ D0 +c T6 +} y1 +x04 +sKmc +c $8 $8 +] ] ] d +} } ++4 +$m +x71 +z1 +c $9 $9 +} [ $e +} $e [ +'B +$2 $0 $0 $7 +c $7 +i22 } +,3 +T6 +*35 +-9 +o03 +} ] +c $5 +k $3 +i72 +c $4 ++A +c ^1 +d +*42 x37 +Z2 +EE +x91 +y1 r +c $3 +Z4 '7 } +Z4 } '7 +x13 +d '8 +$1 $9 $9 $6 +D0 D3 +*46 +} } -0 x12 +i71 +} } x12 -0 +c $7 $7 +*63 +x24 +T3 +x51 +} o05 +} o04 +*03 .4 +o12 +x67t +u $6 +T4 +x41 +c $6 +i70 +c $8 +p4 o15 x45 +p4 x45 o15 +c $0 +$6 $6 $6 +-A +$2 $0 $0 $4 +c $0 $0 +*3AxB6t +o03 x53 +.3 *60 +cx2B +c $0 $1 +c $2 $0 $1 $0 +] ] $a +} $1 +'C +y3 ++B +u $9 +D8 +$2 $0 $0 $3 +^i +$2 $0 $0 $8 +T7 +R5 +x31 +c $3 $3 +u $3 +-8 +ts}{ +i81 i99 iA9 iB5 +i27 +c $0 $0 $0 +y5 +x05 +o0m +$1 $9 $8 $9 +Y2 D7 +o10 +,4 *06 +E $9 +*32 +$1 $9 $9 $0 +{ K +T2 +$0$1 +-B +.6 +E x83 +c x83 +x02 +'3 +c $1 $0 +R8u ++1 +3 +x53 +$1 $0 +{ [ { +^a +c $1 $9 $9 $9 +c $1 $3 +$1 $9 $9 $9 +d '9 +c $5 $5 +$R +s08 +$t +ssb +ux2A +c $6 $6 +*31 +T1 +c $1 $2 $3 $4 +$4 $e $v $e $r +c $6 $9 +*57 +,1 +c T7 +cs;g +x43 +} Z1 +c $2 $0 $0 $0 +,7 +^t +x82 +c $4 $4 +x56[ +*04 +0 '4 +*04 '4 +0 +$2 $0 $1 $0 +c $2 $3 +$r +c$2 +$o +i71 i89 i99 iA5 ++7 +7 +*6Acsjc +$9$5 +]s#[ +i3- +y2 +$a +$n +$2 $0 $0 $9 +o21 +o64 +5 +x72 +oBJu +c $1 $4 +{ x73 +c $2 $1 +xB9c +l $2 $0 $0 $8 ++C +] ] $i $e +i73 +'5 $1 +i5- +c $1 $6 +x73 +x52 +x14 '6 +'7 $1 +x21 +c $9 $6 +i4- +i75 +x23 +i79 +$1$2 +x12 +'D +sz|txA9 +R6 +o77 +$7 $7 $7 +*20 +c T5 +D4x94 +s],x2Br +x92 +} .0 +i9#t +x81 +$2 $0 $1 $1 +o20 +u $S +^L +d 'A +x08 ,2 +l $2 $0 $0 $2 +$1 $9 $9 $3 +$1 $9 $9 $7 +u $2 +} l +i81 +u $5 +l $2 $0 $0 $6 +^o +i74 +c $9 $4 +R2 +.4 +c $8 $9 +i6- +c $9 $8 +c $9 $5 +l i7. ++Bt +$2 $0 $1 $2 +x06 +l $2 $0 $0 $5 +r c r T0 +x83$! +{ { { { { +c $0 $9 +[ [ [ [ [ +uL8x69 ++0 +0 +0 +0 +$l +] $e +*87 +c $9 +i77 +i78 +i62 +t*96 +sa@ +z2 +$9 $4 ++6 +6 +6 +6 +u $4 +'8 x42 +u $7 +c T4 ++1 +1 +1 +1 +T1 T2 T4 +T1 T4 T2 +u $0 +y1 +-2 -4 +[ $q +p1 x58 +x75u*27 +T1 T3 T2 +T1 T2 T3 +o0*[ +o35 +'7 $2 +T1 T4 T3 +T1 T3 T4 +T1 T5 T2 +T1 T2 T5 +l $1 $2 $3 +c $9 $7 +$u +x02s?| +$0 $7 +{ o66 +u $8 +c $9 $3 +c $1 $9 $9 $1 +$2 $0 $0 $5 +x12x34 +$9 $3 +o0d[ +T2 T3 T4 +T2 T4 T3 +T1 T5 T3 +T1 T3 T5 +$0$0 +T1 T4 T5 +T1 T5 T4 +'E +$9 $6 +rsLmxBA +t$9 +{ [ ++5 +5 +5 +5 +c T3 +o23 +r C r T0 +$2 $0 $0 $6 +o31 +'7 $3 +T1 T6 T3 +T1 T3 T6 +i76 +c $1 $5 +Z4 '8 x42 +T1 T2 +T2 T5 T4 +T2 T4 T5 +$9 $2 ++D +T1 T2 T6 +T1 T6 T2 +$i +^3 +i61 i79 i89 i95 +T2 T5 T3 +T2 T3 T5 +'7 $0 +u $1 +T2 T6 T4 +T2 T4 T6 ++7 +7 +7 +7 +s'^$3 +,6 +}sAE +-C +T3 T5 T4 +T3 T4 T5 +c $s $e $s +Y3 +$9 $8 +r $9 $5 +$7 $8 +T1 T6 T4 +T1 T4 T6 +T1 T4 +'7 p1 x58 +$1 $4 +$2 $0 $0 $1 +T1 T6 T5 +T1 T5 T6 +c $9 $2 ++4 +4 +4 +4 +^d +'7 $7 +T2 T3 +c $1 $9 $9 $7 +$1 $2 $3 $4 +*23 +$3l +T1 T5 +*7BE +'7 $4 +i7- +T2 T6 T3 +T2 T3 T6 +l $2 $0 $0 $9 +EoBf'B +c $0 $8 +c $1 $9 $9 $8 +$1 $5 +*3A$8 +T3 T6 T5 +T3 T5 T6 ++2 +2 +2 +2 +$8 $7 +T4 T6 T5 +T4 T5 T6 +T1 T3 +c $1 $8 +T2 T5 T6 +T2 T6 T5 +T3 T6 T4 +T3 T4 T6 +o65 +$T +xA5x96E +'7 $5 +^y ^m +xB4$6 +$y +l i4- +s]Ks_S[ +p5 ] +1 +p5 +1 ] +^p +^m +T2 T4 +c $2 $4 +o02 +T3 T5 +cspd +x63 +$8 $9 +T3 T4 +c $2 $0 ++3 +3 +3 +3 +$9 $7 +$1 $7 +^c +c $8 $7 +'F +x12] +tsps +T4 T5 +ksM& +T1 T6 +c $0 $7 +T8 +sz]x02 +{sHto8O +$1 $6 +$8 $6 +c $9 $0 +c $1 $7 +l $2 $0 $1 $0 +rL9l +o87 +{ Y1 +^3 ^2 ^1 +c $1 $9 $9 $6 +c $9 $1 +$2 $0 $0 $2 +-6 -6 -6 -6 +*76 +]*A8 +,9 +o71 +T9 +$1 $8 +$0 $9 +T2 T5 +x3B$s +T3 T6 +^e +c $2 $0 $1 $1 +o0L l D4 +o0L D4 l +$1$1 +^M$5[ +^n +^u +c$7 +c$3 +c $2 $5 +c $4 $5 +$8 $5 +$1 $2 $3 $4 $5 +o80 +*24 +i21 +T2 T6 +l i5- +x34 +T5 T6 +$1$0 +i7e +$1'A +,8p1 +} k +u r +$6 $6 +*A3} +$g +T4 T6 +'7 $9 +i6t +xB8o8'$! +c$1$2 +c $7 $8 +iARD3 +l i6. +rsS? +$d +*95t +-0 -0 -0 -0 +$7 $1 +$9 $0 +r c r +c $0 $2 +*98 +*79t*37 +t*76 +-1 -1 -1 -1 +$7 $2 +$6 $5 +c $8 $6 +o7.k +d 'C +*A6D3 +-5 -5 -5 -5 +d 'B +,4 +x83 +sfgu +$z +] ] ] ] ] +c se3 +sa4 +x02iBX +y4 +[ z1 +$@ +z1 K +x42D7 +^k +c $0 $6 +*81iBi$6 +D9 +'7 $6 +C r t +C t r +*56 +^2 ^1 +^0 +R0r +xB7{ +c $2 $6 +D3s5T +.3 +*68 +'7 $8 +o70 +$h +c*86*B6 +x54 +c $1 $9 $9 $4 +o73 +o76 +i9X*2BK +o43 +c$9 +Z3 +-2 -2 -2 -2 +kx13 +-7 -7 -7 -7 +.8sU[u +-3 -3 -3 -3 +c$5 +R6{ +c $6 $6 $6 +iBq[ +{s#+TB ++E +^l +l i6- +x64 +$1 $9 $9 $4 +T0 T3 T1 +T0 T1 T3 ++8 +8 +8 +8 +$E +-D +r.9 +$9 $1 +c $2 $7 +c o14 +^r +$2 $0 +} t +TA +R3 +o1o +s)u$0 +x7Blx01 +xB2 +r T0 r +c $1 $9 +$3 $3 $3 +c $1 $9 $9 $5 +$5 $5 $5 ++7+7 +T1 T7 T3 +T1 T3 T7 +x96} +p2 '7 p1 x58 +D2 i5f +x93 +$9 $9 $9 +c $8 $5 +x37x87E +T0 T3 T2 +T0 T2 T3 ++0+0 +$1 $1 $1 +T0 T1 T4 +T0 T4 T1 +{ { { { +$eiBi +$7*39 +{ E +'G +T0 T5 T1 +T0 T1 T5 +i5e +$4 $5 +$1 $9 $9 $2 ++6+6 +} *04 +-4 -4 -4 -4 +c $3 $4 +]r +i51 +$0 $8 +c $5 $6 +T1 T7 T2 +T1 T2 T7 +T0 T2 T5 +T0 T5 T2 +$3 $3 +$5 $5 +x21 p4 +] o7v +i5a +c $1 $9 $9 $3 +T1 T5 T7 +T1 T7 T5 +siut +$3 $2 $1 +x84 +c $2 $8 +s-+x51 +x35 +T0 T4 T3 +T0 T3 T4 +'5 D3 +c $3 $1 +*09EsWQ +c $8 $4 +c $7 $6 +T0 T5 T3 +T0 T3 T5 +} o0v ++Bc +T0 T6 T2 +T0 T2 T6 +$1 $! +$4 $u +x26 ssb +$2 $4 +T0 T6 T1 +T0 T1 T6 +T0 T1 T2 +T0 T2 T1 +c $8 $3 +i5. +c $1 $9 $9 $2 +$8i9{ +^2 +T1 T4 T7 +ss5 +T1 T7 T4 +$2$3 +l i3- +x08 +c $0 $3 +,5 +x91D9,B +T0 T5 T4 +T0 T4 T5 +sAI{ +oAU*64*21 +T2 T4 T7 +T2 T7 T4 +^b +} u +l $2 $0 $0 $1 +T0 T4 T2 +T0 T2 T4 +c $0 $5 +c $s +T0 T6 T4 +T0 T4 T6 +x02x39 +o0n +R0 +T3 T5 T7 +T3 T7 T5 +T1 T6 T7 +T1 T7 T6 +T0 T3 T6 +T0 T6 T3 +^y +*67 +x42 $9 +iAPY1x39 +*79 +c $6 $7 +$1 $9 +c$0 +c $3 $0 +D6l ++0o7g +T2 T7 T3 +T2 T3 T7 +'4 d +*3A$3 +i6. +$1 $9 $9 $1 +$5 $6 +T2 T7 T6 +T2 T6 T7 +*91 +tx81 +.5 +T2 T5 T7 +T2 T7 T5 +i3e +'8+0 +o14 +c $3 $2 +c$1x8B +L8^a +d '6 +c so0 +*86 +T4 T7 T6 +T4 T6 T7 +$$ +T3 T7 T6 +T3 T6 T7 +$1$3 +*17 +} x12 -0 +} -0 x12 +T3 T7 T4 +T3 T4 T7 +rR5 +i0i i1a i2m +$2 $5 +.7 +c $5 $9 +*65 +T0 T5 T6 +T0 T6 T5 +c $2 $0 $0 $6 +^h +$5 c +T5 T7 T6 +T5 T6 T7 +i79 i79 +*AB-0x67 +T4 T5 T7 +T4 T7 T5 +i7a +c$4 +*05 +T1 T7 +x23sD> ++F ++5+5 +*45 +*59$? +x45 +$0 $6 +c$6 +$1 $9 $8 $8 +o9a$7s.B +.B^i +x25 +*14 +xA2 +x91$n +c$8 +o3t +*35 Z1 +o7kx61r +$9$9 +x75 +c ^3 ^2 ^1 ++6+7 +c $8 $2 +i8p +i1a +[c +x93E +*8Ax43 +cs'e +-8 -8 -8 -8 ++0 E +f t +Y1s^o,7 +} x12 } -0 +f *A5 '8 x14 +c $0 $4 ++0 +0 +x15 +x61 +T2 T7 +xA1 +{ ^m +T6 T7 +$4 $4 +Y5 +T5 T7 +}*79} +T3 T7 +,8 +r y1 +$0 $3 +u*92x86 +x73*2A-1 +to9*$8 +oA(kR0 +$7 $4 +{ -0 +y3 x52 +*12,B +c o71 +s81 +i8- +} *05 +i79 i71 +c $4 $2 +x27 +x51 o63 +$0$9 +^5 +^g +Ex7A +$8 $8 $8 +^x +rR8 +'H +xBAk +c $2 $9 +R7 +'8.8 +$3 $4 +x16 +c $8 $1 +$0 $5 +*23x56sTi +$= +s&^-2 +$isP} +Z1x78 +lE +c $1 $9 $9 $0 +c $6 $4 +DA +^9 i2+ x19 +s*No7?$6 +$2$2 +{ x03 +$2 $7 +^nx81 +T4 T7 +l i5. +T0RB +*51 +$9 $1 $1 +-E +si! se3 +xA6t +c $8 $0 +$6 $7 +x65+5R0 +.1 Z1 +x31x1B +x28x17R3 +x74 +^s +} x01 x24 +-1*96 +^Mx04s(B +]-1] +*52 +$2 $6 +-0-0 +s)2Z1} +*53-0x69 +c o31 +sSXx45x86 +Z1}*A8 +c $4 $2 $0 +s)M+0 +r] +i3a +i7. +*76 +6 +$4 $4 $4 +i52 +} x24 x01 +sl1 +'6sWJ +-7-7 +c $5 $4 +*76 +7 +sm`D7 +RAx85i0e +.8 +sDWr ++0 -3 +c $1 $9 $8 $5 +o59 +$8 $4 +$7 $3 +$0$7 +x9AD5 +x65 +T6s4` +iBbp2'7 +^5 z1 +cs.\oB. +s?Js!PK +o0t ++8+8 +$0 $4 +} z2 +$2$1 +x37 +$1$4 +c $3 $5 +c $7 $9 +sa@ se3 +T0 T2 +o0g +$3 $0 +L8] +$3 $1 +c '8 $1 +c $6 $2 +^T +sZQ*45x52 +x43*67*5A +o1a +$2 $8 +$4 $5 $6 +l $2 $0 $1 $1 +$A +se3 si1 +$9$8 +{ ^d +l i7- ++9 +9 +$e $s ++8 +8 +$8 $0 +$8 $3 +c $7 $4 +} c +Z1 l +*B3o0i +$1$5 +$1 $1 $1 $1 +x98u +x45D3sKs +*84'B+1 +$7 $6 +c $1 $9 $8 $9 +s32+5 +*68o4ioAJ +xB2^5r +Y1 -5 +$3 $2 +T0 T1 +R0*25 +x94R2 +*87R2 +D6o7V*AB +c $6 $8 +$8 $2 +c $2 $0 $0 $2 +c$1$3 +i4. +*78 +c $7 $5 +i1e +$j +c$1$0 +cx61 +Y4 +x3B*B7R2 +*37 +-5 t +c $5 $0 +*6Bt +E $8 +x28 d +$5 $0 +x28 Y4 +c $5 $7 +} ^f +^8 +x47 +$0$8 +D1 l +rCrT0 +$5 $4 +c $7 $2 +$b +i50 +[ i39 +rk +,9+5{ +l*50x56 +*10 Y2 +^S +o9m^t +o7n ++5+7 +-F +} D2 +} } } '4 } +i8csie +soisy% +c$4$2$0 +x78x5B^l ++2+2 +$2 $2 $2 +*30 x2B +$8 $1 +sdk x03 +c$1$1 +-0+7*94 +T0 $2 +x81i9T +-3 D9 +ss5 se3 +[ [ [ +KT0 +R0se5s5& +$4$5 +$6$9 +i54 +$9$6 +} $e +$1$8 +T0 T7 T1 +T0 T1 T7 +c $2 $0 $1 $2 +} x31 +sy&c +-7 -7 +xA6} ++9 +9 +9 +9 +[o8/ +^A +$7 $8 $9 ++9R3saS +$1$7 +$9$3 +i0a +$9 $9 $5 +o1x +x9Bo6>*20 +c-8 +c $6 $5 +} ^p +^x ^e +$7 $9 +[ c +$6 $8 +i70 i72 +i4n +o0z +x02R6R0 +$4 $6 +$1$9$9$7 +$* +cu +[^l +i60 +s[0{ +$6 $4 +o2j +s5@x61 +T0 T3 T7 +T0 T7 T3 +c se3 so0 ++5+6 +c so0 se3 +T0 T2 T7 +T0 T7 T2 +R5+B +$5 $9 +x64 x24 +$9$4 +i72 i71 +c $3 $6 +'I +i1d +c $1 $9 $8 $8 +i7zR2 ++6-7 +DBi6e +K x06 +x85 +$F +$4Z1 +$8$8 +s'Jx8BR0 +$1$6 +$2 $9 +$7$7 +x0AT6ss7 +$3 $5 +KD2 +D4D7l +$5 $2 +} +8 +T0x34sRa +-0 -0 +D9^r +$k +iB^*08} +*41*36 +$7 $5 +cxA3 +o82s"yr +-8 -8 +c $6 $0 +$9$7 +$8$9 +sa4 si1 +-1*1ARA +*28i6s +^boA{ +$w +c $4 $7 +RA$l +c $7 $1 +T5 x41 +x07 +x94 +$4 $2 +D7D5c +*81 +T0 T7 T5 +T0 T5 T7 +-6$y +T0 T4 T7 +T0 T7 T4 +$9$2 +d E +x59$9 +c $3 $8 +$8$7 +$c +[^h +} } i1o +o2o +T0 T7 T6 +T0 T6 T7 +$x +sv`k +R4 +xA1*B0 +[ ^S +x14 p2 '6 +x14 d '6 +i0i +x61-3 +$5 $8 +} '8 ] +l i4. +$6 u +c $7 $3 +L9*31 +i78 i79 +*71 +$7$8 +D4s*]xA9 +$3$3 +cx48sK< +{ l +c $5 $1 +$6 $1 +$6 $0 +$2$0 +-6-6 ++9+9 ++A +A +[ [ +^! +x58T0 +$7 $0 +} K +[ ^D +sa@ so0 ++4+4 +c $6 $3 +$1$9 +$1$9$9$8 +$5 $7 +s +c] +$6 Z2 +q +c $4 $0 ++1+1 +si! ++2 +2 +p2 +[ ^s +s$vli6n +^* $* +$4$4 +$2$5 +xB4^y +o2u +y1x57s?v +$4 $7 ++6 +6 +*4Az1 +} *80 +*47 +^e ^d +^j +o0e +x57 +-2x48*09 +*12*5B ++0+1 +s-hx5Ac +*18R5*27 +,4*A2s$d +$5 $1 +-4*39 +i4t +$6 $3 +$3 $6 +i4i +sFI*20 +y2 -6 +xB9D2 +R6oAZL7 +i72x89 +T0tc +i39 +i4a +*54sUO +o2i +^l i0a +[ ^t +] ] ] ] +o7MR2D3 +c $4 $6 ++6x56 +$4 $0 ++5-7 +c $7 $0 +^7 +i3c +} +6 +d 'D +$3 $8 +^6 +'6 $1 +-1sBk +K*04 +$4s6#x28 +$0$6 +*54 l +[ +2 +o52 +$_ +uD6 +$1xBADB +o1yx59+9 +i3s +-BT0 +*64+0 +t*91 +oA5^t +s@yE*37 +$1 $5 $9 +$4 $1 +x59u +[k +*36-0+4 +i0b +o62 +T0 T3 +c $4 $1 +'8*45 +TBs;mx61 +c $5 $2 +$5 $3 +i62iA< +x58o2c +sRwD6x93 +^l*01 +i4tiAf +o2e +c $2 $0 $0 $1 +$6$6 +{ k +$4 $3 +^kiAs +s9A-3 +{x6A*AB +c $6 $1 +-8-8 +{ *AB +x84i99s`8 +$5$6 +-9 -9 -9 -9 +s>e'6 +cd +lx65+2 +^yR9 +c $5 $8 +i4s +$0$5 +u $9 $5 +*78o1r +{ x52 +^9 +$1 $9 $8 $6 +i71 i70 +x46 +c ^2 ^1 +$8$5 +'8sr> +s^pc +c$0$1 +-8+2 +^x ^x $x $x +^x $x $x ^x +x3A*04 +^x $x ^x $x +^e ^b +-6-7 +Es,Rd +^r ^e ^p ^u ^s +T0 T5 +sa@ si1 +s/Pro8< +z5 +[ ^k +$2$7 +$e $r +s}x+4 +tf +D3svys94 +i1b +x42*49 +$8$6 +$3 $7 +x56 r +i92 +i61 +s},s'-^h +$i $n +*03-9slU +.6y1*96 +$)K'7 +o0o +-6 -6 +o79 +tx7A +c $4 $3 +*97 +syCT7ssg +i67 +i18 +$0 $0 $7 ++Bd +*13*19iBw +[ ^l +x86 +} ^A +x41*59 +x36 ++0+2 +$msGu +s`V +^ps2{ +p2 } x46 +i2i +d ] +o51 +i3d +R9c +$4x6B ++6 -5 +i0h +R6s2**A5 +{ -5 +^fi9E +[ ^c +$1$2$3 +} i6i +-6+7 +*18 +c $2 $0 $0 $8 +*89 +x64sEW*63 +} ,1 +-2 -2 +iB(x3A+2 ++B +B +i70 i71 ++1 +1 +x92$z,0 +i9s +c o19 +'J +L8K*24 +sCfR1 +c$9$9 +sa@sc0$. +c $1 $! +'6 $1 $2 $3 ++5-6 +Y3 x21 +x09 +to9U +^x $x +*32s4Tc +Kto8o +'6 ] x31 p1 +'6 x31 ] p1 +*94 +c T5 $1 +c $1 T5 +coA)*98 +^a ^d +[^cx48 +rs!j +-5 -5 +c '7 $1 +c $1 $9 $8 $1 +$1u +$2$6 +xA5$0 +-0 -0 -0 +sT--3 +*01 +[ '6 +iAp*04 +{ R9 +i57 +u i8? +iA- +^E +$0 $0 $1 +o6. +s2'x43 +o19 +x6AD4 +[ ^g +*13 +3 +{ Y2 +o4diA0 +o6+*50 +D2RB,6 +$2$8 +$1$9$9$4 +$N +c $5 $3 ++8 +9 +d 'F +x7B$? +E*2BsR, +^M +*62d +sUB+7 +c$1$4 +$4 $2 $0 +*B1*15*63 +} i1p +Esyv +$!$! +sKk*13*48 +$- +i51 i69 i79 i85 +oA7 +c$2$3 +x43x09i6a +] [ +x95^o +sO9*2AT7 +$3$1 +p1 x08 +s|,i4ei9[ +xB7x53*7A +i4b +-4-4 +R7szV +$2$0$0$9 +i94s5d +LA$2 +$R u +$6$7 +C $1 +^w +i71 i71 +i0! +c$2$1 +o0B +i56 +*B9s1mD6 +*40svh +^r K +,2sC+t +*75 +T7$c +} i0W +x8B +sfK^p +.3 Y1 +o58 +K+6o7y +x02^c ++6+8 +st|y5x08 +x62s{k +o74 +-1 -1 +$M +o5y +l $e +$o $n +xA3 ++7 +7 +7 +r T0 +[ [ [ [ +s>s} +} -2 ++3 +3 +*61 +o53 +u[] ++0 +1 +} ^G +$5$0 +-A -A +c '9 $1 +Z2x71 +z5 ^= x0A ++7s!k +*06} +$8sza +$3$0 +oA3 +^0 ^1 +Z4 +c $4 $8 +^( +c$1$5 +ux21 +o1tx4Bl +x73o3fx89 +^D +i1m +$2$0$1$1 +[ ^h +} ,2 +-3iA' +sPdT6$i +i3. +st3 +RA +} D9 +i77 i79 +],9 +l i3. +]] +*70 +i34 +{ { [ +skd +-3-3 +u $6 $6 $6 +*B7K +R5sF_ +[ ^f +Escos3A +i58 +$8$0 +sdtx45sQs ++4 +4 +$9$7$2 +i91 +xAB*6Bu +iAxd +.7^x +$0 Z2 ++8 -9 +$1$9$9$9 +]cspL +sIE+Af +} *64 +*19 ++2 t +o7c +$4 Z1 ++7 +8 +^b ^a +x12Y1 +$o*30x81 +c $9 $9 $9 +x56 +R7$c +o55 +x29 c +x81sk i9* +x86-4 +s&KTA +EK ++0-2 +*7A} +c $1 $9 $8 $7 +} o6u +$3$2 +so0 se3 ++5 +5 +5 +[ ^v +.Ax37T7 +c $3 $9 +sAC'6 +$2$9 +KRA +o56 +*30 [ +x59KxB5 +.BR5 +^J +[ ^T +.9r +$9$7$1 +L6*04} +*A5 '8 x14 +$+ +s68x12 +i73 i72 +o1l +-6 -6 -6 ++0+7 ++3sts +sgo +2 +-0-2 +x31RBs ' +^R +r C r +$m $a +i7d +} x74 +-7+8 +c$6$9 +$S +$t $o +o1i*61 +*20*97-3 ++2 +2 +2 ++4+6 +[ ^n +x75x27$e +fl ++6s*4 +$a $l $l +R7c.7 +$?x94 +i3u +-6 E +*03*23 +ET1 +EsS}$9 +f c +'7su1 +c$9$8 +Z1sK8 +xB1 +-5+7 +-9-9 ++0+3 +sfa$2 ++1x6B +s/?x01 +sai +$1$9$9$3 +'6*0A +i7? t +o54 +$8$2 +Ks6u +$5$9 +x43'9 +]E +,Bx93 +uc +i2- +[ ^w +x67$c +$7$6 +$a $r $t ++0-1 ++9 -8 +[ ^a +*24sS9 +o00 +u[ +-3 -3 +u.3swP +x9B-BiA3 +$u $s +*23s$0 +{*69 +$p $r $o +$i $t +$3$5 +$8$1 +x6By2 +x57*64 +i44 x02 +o3@ +'9*6B +$6$8 +$3 $6 $0 +x98o1rs*C +o7as+,s\G +$3x37 +i71 i72 +sa0.6 +x54*72$3 +$7$5 +i0tx94 +c$1$7 +iB+u +o8asC($x +i6y*BA +x14 x45 +Z1sZm +i7c ++9 -A +-7s!. +oB5-8*2A +txA5 +]f +x6B*7A*21 +-1 -1 -1 +*14sw\ +up1s|X +p5t +{ i5k +o30 *81 +Y2sD6 +o6b +x7BY1 +*AB^h +x54$6o9O +s)ai2d +o4c +x82s;/ +xB4Y2 +^4 ^3 ^2 ^1 +c$1$8 +srh*27 +o3r +*26 +$m $e +-5 -5 -5 +^a ^A +E+8 +$bx53x57 +[ ^m +x79^wsM, +*A3c +$5$2 +c ^2 ^2 +x67}sz' +$jx0B +c$9$3 +xB7x02 +*53*63 +$1$9$9$1 +} *15 +tx47 +*A1*47$f +xA2*68$7 +[ ^F +s@zZ1 +$a $d +Y3 D4 +^@ +'6 $3 +'6 $2 +*36 +$8xA5 +^1 ^1 +sa@ se3 si1 +sa@ si1 se3 +*56^jT6 +$1$9$9$5 ++8*8Bs*r +{ o41 +ksPgx96 +[*B8 +-7 -8 +$'x71o6? +o5a +Z4x56x75 +c $1 $9 $7 $7 +[ t +o7s +[ ^H +R3 p4 +}scP +$e $l $l +$4$6 +uD0sv% +Y1t +t*86 +} $j +i5c +$D +$5sD> +x18*4B*21 +us7E*47 +LB*50s/} +$b $o $y +-7-8 +^a ^c +Z4 x42 +o7! +x71s%F +i0e +o84 +i76 i79 +.9 +o2c ++4s zx81 +^0 ^5 +sXtsQi$v +} u x32 +} x32 u +i5d +o9Hx72s]q +$6$4 +} *62 +i2z +Ex82 +*24'9 +o5. +*01oA( +-6s2w +c $1 $9 $8 $4 +$7$0 ++7sB=K +]s[) +$l $e $e +l $9 $5 +l $2 $0 $1 $4 +$.$. +x47 *31 +lr +$4$3 +$3$7 +k ^z +i3b ++9 D8 +^d ^e ^r +{RA^m +^7 ^9 ^9 ^1 +$As/#T7 +$4$0 +L9*54 +*89R4TB ++A +B ++1 +2 +*4By2 +s +c $2 $0 $0 $3 +p1x8A +si1 so0 +sP8E +$5$1 +oB`o2k*B5 +c '7 $2 +*93 +*58$i +$8E +i32 +sec{ +i7b +csHlK +*73 +o8s +[D7 +lRAo81 +xA4 +x38 +*B9K +s>'sis ++A -9 +-4 -4 -4 +i9Ki0S +sb8 +-3 -3 -3 +} *36 +c ^0 ^1 +i64 ++8-9 +*83 +$5$3 +x1Bx43 +*38 +i85,B +x02 { { { { { { +d x28 d +$) +]*86smy +$7x8B +c$2$5 +-8 -8 -8 +^I +$8*81x81 +^N +$y $o $u +o3z +$, +{ { { +d x28 Y4 +] $i +i1dsG2 +$a $1 +$l $a $w +oBi +iA5 +R7x02 +^1 ^2 +$a $t +KLB*43 +$5x39sLN +o4bsT&-5 +$4$1 +-1-1 +x5Ao9Gu +i6a +x76 +T7.9 +$2 { +c $1 $9 $8 $2 +$5*B0oAA +c$9$2 +szR$6 +x84$6 ++0 -1 +*46L8 +$1 $0 $1 +*45] +^6 ^9 ^9 ^1 +[ ^o +i8H,9r +$9 $7 $3 +c$0$9 +R8i7!i69 +R1 +$1$9$9$0 +c $1 $9 $8 $3 +,4sJN +$n $o +} p1 ++0 x21 +KsdC*94 +l $4 $4 ++0+6 +Y1D6 +]s]+*86 +$3 $6 $5 +*16 +i67sB- +x8B*76 +i4_ +^0 ^2 +s)y$3 ++D +D +o4_ +c $1 $9 $8 $0 +u '6 $5 ++9+A +*07 +*5BT3 +s()Cx95 +svExB2D0 +,8Y1 +o23 -7 +oA"t +$2 $0 $1 $4 +iB>*83k +$e $1 +o6! +D3x9Bi9y +ED9 +$1 DA ++0+4 +xB3 +s\JY1 +^3 ^1 +o6c +*64*A1 ++0 +2 +$5sFKoAt +x48 +i01 +i72 i73 +o06 +^x^x$x$x +o9oK +c$1$9 +*39$b*28 +u '6 $6 +^v +$3$8 +^g ^n ^i ^k ++9 +9 +9 +*87$1 +c$2$0 +x6Ao7(Z1 +$*$* +}}i1o +x7Au +[ ^E +x42-0i9@ +s%MD8 +[ $1 $2 $3 +TBT0 +x71.6 +^P +x25R7s]= +$1 $0 $0 +x35sp$Y1 +p1x9A +-A-A ++6s[oiBr +-5x14 +i7Ax41d +*A9 +o60*1A +$l } +$o $r +^5 ^9 ^9 ^1 +oAsrTA +sp6*96 +i2g +o6j +*A9*42x94 +o2bsr/ +'L +sGExA2.4 +]$9 +x03s32 +i70 i79 +saor +$d $a ++3+7 +C $1 $2 +} x73 +*1B{ +c o75 +ssDi1u +$1 $9 $7 $7 +$6sQg ++5 +6 +lc +D2] +$6DB +x8Ax42 +c$7$7 +r $1 +*05xA1su8 +l $2 $0 $1 $3 +o73svt +*49 +sdx*53s4] +-7oBG +*38D0 +$5x81 +LAx21 +x76o0C +s#M*19$! +*78ur +$0x5Ax57 +lD6 +Y2}x83 +s{<+9 +o6AsjYr ++0-7 +iBMs_xx63 +x63*81 +-8cxA4 +*07*34 +x5A+7*48 +D7+AT0 +x97i2k*01 +iA4x52r +$+ R6 R6 +$t $s +sfx-B$2 ++7 -6 +*9A '6 xA7 +s04 +c$8$9 +'7 $1 $2 $3 +sXc-7 +*7Bx04 ++4-7 +$9x1B +^C +,6.6 +i75 i72 +o6t^us2X ++4-5 +x92$8 +o7i*32 +*39o0dsRZ +ux09sAL ++3x08 +x61c +$3$6 +c $1 $9 $7 $1 +*06{ +ko3o[ ++9swS +$d $o +ss5 se3 sa@ +ss5 sa@ se3 +o6- +*51o5u +{ RA ^m +o0c +L6 +i2j +$! $! $! +]x69*03 +i73 i73 +u '6 $3 +o6zLB +x68 +*39 +u '6 $7 +$s $o +]K +'9*B7*B1 ++7*76 +i79 i70 +o3ys 6 +u $1 $9 $9 $3 +{ ,4 +*21 x28 +c$9$1 +x24*B2,B +$2$0$1$2 +$& +*26*50 +c D0 +$c $a +uK +] $k +i4e +o1y +^li0a +s0Jr +o7i +sbQxA5-6 ++6lx71 +x31 p1 +*12Z1 +z3 +i3f +o7t +o7s-B*78 +i74 i72 +[ ^W +c$0$0 +}x31 +c '7 $3 +*76s%5s|O +^5 ^1 +o4e +]o8jo2d +]*75 +Ksf]*A2 +$9 $8 $9 +oB7 +*3AoAU*76 +o0L +*20] +C $1 $1 +D6f'6 +$l $o +*75r +u T5 +$4$8 +o4- +i70 i73 +$j $e $s $u $s +o88 +fx7Bsm2 +{ Z5 +^6 ^1 ^0 +,5sz, +r{ +o6? +-9 -A +^6 ^1 +Z1s9_x4A +*68Y5 +Y1*6A +suy +$m $a $n +[[ +Kx92 +^4 ^9 ^9 ^1 +sep*12 +*23^m +o4j +^9 ^1 +^q +{x47*79 ++B -A +-Brsn& +tshi*9A +D7-7 +o4M +{ d +cx8B +] $o +TAx81sN- +i03 +*32*13 +*93Kx28 +i12 +d x28 '4 Y4 +d x28 '4 d +Y2*1A +sV>i1i*13 +sbj +o9. +o22 +-7^a +{*20 +x14 d +t*12 +$1$9$8$7 +[ ^i +x79 +$&,7 +c $2 $0 $0 $5 +-8s0% +D6*5B +$w*4B +$2sr% +s=vc +'9i9t*A2 +^2 ^1 ^0 +$m $i +i75 i74 +x17 +o0P +z3 x0A +$i $d +$1xB5 +,6*B4o9n +*3AT5 ++7 *84 *30 ++7 *30 *84 +ts_v +x62r +o1U +kc +x0AD7 +sf(*05 +o0l +*43x63E +$1$9$8$9 +-7*94 +c$3$3 +$u $m +sBq*8Ax62 +} z4 +^9 ^9 ^9 ^1 +D6s5^ +D0y2 +o7. +u '6 $2 +sy6oB` +$!tt +{ +5 +2 +{ +2 +5 +^0 ^0 ^0 ^2 +sP=+6 +x96 +i6o +{ z5 +sBx$1 +x95x13 +]Z1 +x53$1 +i9- +T8xB5 +i71 i73 +} Y2 +K] +,2*9B +-C -C +u-1x17 +$Q +x17 ,4 +o6mx03x92 +$1 $9 $8 $5 +$/ +o70 -5 +i2v +t*92 +]]] +c$9$0 +sT6$s +^5 ^2 +*64 +$5s[.sc9 +$f $u $n +i72 i70 +o4. +{ ^r *30 +Z1sg8 +^0 ^3 +.A+7 +i5h +,8xB1o7h +x71x2A +L0 +i94 +s.<+9 +x71+B +$b $a +K*A3x79 +Ki9G +i75 i79 +o5@ +o4z +^W +iA|$x +o0w +s\IC +i79 i78 +^a ^b +$fx19sZ# +D4 +1 +o41 ++8x37 +sGuK +] $e $d +^ux96sbd +x32 x08 +^2^1 +o2- +sZxt +*2Ax93+2 +i76 i76 +^d ^b +s%MxB5x71 +o5].5 +t f +p3 o68 +-0+1 +i2w +i79 i76 +$a ^A +o82 ++0 -2 +o2js@l +^2 ^5 ++4 +5 +o1e +$O +i70 i75 ++2+6 +o5- ++F +F +*A5i2h +svy*70*A4 +^w p5 +oAm +u '6 $9 +$L +o7v +$4$9 +sac+B,B ++8 u +i8e{i8/ +$2 $4 $7 +x05x83 +'9.6 +c$2$7 +$p $a $s $s +-9 -9 -9 +}iBt +*A3*57 +i78 i71 +i6H$p +o72x6B +x03 p2 +D0x74-5 +Es3% +i6_ +$4*87 +Z1E] +i5ysg1 +*02*B5x18 +o99 +-8+9 +o1zR8 +i4z +^Mx48 +$9+B*B4 +u '7 $3 +c '7 $9 ++4-6 +$3$9 +x39oAX^i +o0T +Cx03 +o67 +c $2 $0 $0 $4 +c o1@ +i1g +*17o0ox36 +i6w +-2-3 +^9 ^0 ^0 ^2 +$a $l $e +sGB+7s[n ++0 +3 +*7By1 +c o54 +-0-3 +} } } } c +i73] +^4 ^1 +$0 $0 $0 +x32*69E +o6i^g +o2p +i71 i79 +s$bC +r*67x93 +^3 x09 +u '6 $8 +x9Bo2m +o7S*12 +KoAZ +{s`' +i47 [ +iB*u +$C +x52d +c $1 $9 $6 $9 +i10 +o9$x96'8 +^1 ^0 +*60 +D4+6 +x87 +$t $i +.4L8 +ui9n.A +} Y3 x04 +o1u +} T2 +,3xB7l ++7+9 +s/_sj9 +$1$9$8$8 +t +0 +ss? +$b $e +^8 ^1 +.A +i33 +s{csJ^o5i +u-Ax87 +s-. +x91s`2 +i0b i1i i2g +i77 i71 +,5o8Ox64 +-1 -2 +Cr +*87] +o6Wl +*2Bx82 +i11 +$2 $0 $1 $3 +o7z ++0-6 +$b $o $x +$h $o +*62x53'6 +x54i5t +$m $e $n +,3*1B +x34y2 +,8*75 +f '8 x14 +sEK,7 +$h $e +TA*23 +CC +x97 +-2 -3 +*76DA +^1 ^9 +*19i8. +xA5 +-0+3 +-4-6 +} x04 Y3 +^- +^8 ^0 ^0 ^2 +o25 +fsm>iBV +xB2sWB +} DB +o8m +o39 +u '7 $7 +-0+7 +c 'A $1 +^x$x +c$2$6 ++3 +4 +r $0 +.Ay2x3B +i76 i71 +$I +c$0$8 +sgyi94D9 +u '7 $6 +s;+x83 +xB4 +i75 i75 +u '7 $9 +sC7stj +sgvY1szF +*A2sTWz1 ++9-A +p5E ++7sZHx3B +o5! +o7? +s{?'9y1 +y3[ +i78 i70 +x41s.h +x36r +iA;,B-6 +x01] +*34^m +u '6 $1 +i5s +$% +L9x41x81 +sO-s}TD5 +$2$0$0$2 ++Ax75 +c $5 $5 $5 $5 +soi +o40 +x57] +^4x57 +^7 ^1 +^' +*05 x03 '3 d +*05 x03 '3 p1 +o71*7A +^lsx$+6 +$b $a $r +x09{u +o2l +sdf +x24*1Bx75 +^1 ^0 ^0 ^2 +x12*31 +i0es=q*B3 ++2+7 +x32] +Et +i5>x46 +x59 +^9 ^6 +c$0$7 +T1*0AR8 +s\+x81 ++2+5 +c ^9 ^9 ++B +C +u '7 +x96sT|^7 +-5 -6 +*B7y5 +o1! +tT8 ++0+5 +i7k +x71x26 +o1- +$8s`| +d '5 +*13 r +^4 ^2 +$r $s +$1$9$8$6 +$fx7Ashl +$u $p +^2 ^0 +u '7 $5 +x04u +l ^y ^m +shy +x85^D +-7csrM +sma*B2 +$; +-6+BE +iBP$3 +$h $i +$i $s $m +o3- +iB-]i0m +}*15 +-3 t +KR3 +o89 +x96x94+6 +lx84 +i19 +^Cx18 +u $4 $4 +Y1*18 +Z1x01+A +o4+ +$e $m +c $1 $9 $7 $8 +i7s +i30 +*0B-7sL$ +*4Bu +$s $h +-4+6 +.7$5 +$a $y +$1 $A +i3'x04T7 +r $7 +'M +c ^0 ^0 +o72s+L +^2 ^3 +du +p3 +2 +$1 $4 $4 +] .1 ++1 -0 +-0K +i8! +*16-0l ++1+3 +*A5o1bs<) +i78 i77 +$9 $9 $1 +-D -D +x5As2`.3 +i0n ++B+B +c $4 $u +i3_ +$5 $6 $6 +*19s Kx28 +c '8 $3 +^e ^c +i77 i77 +$2$0$0$7 +x51x02 +^1 ^5 +*AB +*A7,9T2 +^5 ^0 +c$5$5 +c Y2 +i08 +i5f +*86^1 ++0-4 +^2 ^9 ^9 ^1 +^8 ^2 +}+6 +*05E +-9*06 +*6A*06 +x39 +u '7 $0 +$p $a +,7sC} +-0-1 +'9D3 +i3t +o1i +-3u +c $1 $0 $1 +o3b +o95,7 +]oB's*s +*5B]st% +o3i +*18s-)t +-6+8 +y5uscf +$K +*3A{*01 ++E +E +xAB-7'8 +$3 $d +^3 ^9 ^9 ^1 +o8. +T1x75s7A +Y1s*H[ +i74 i73 +T3sFq +^6 ^9 +*53o9T +sY7*36,0 +-4+7 +$9 $9 $6 +$px02 +i70 i78 +x58 +^9 ^0 ++1+2 +^8 ^9 +x35^T +u $3 $3 +ls^O +^9 ^2 +c$2$8 ++2+4 +oB)sB0x25 +-4+5 +s9E^Ac +-8-9 +i77 i70 +x72]T9 +i7_ +c ^4 ^1 +i0c +u '7 $4 +*29T3*8A +o6? u +^6 ^0 +l i7+ +i73 i70 +*56s<-sSe +C $2 $2 +o3_ +x72*7B +i14 +$c $a $t +*B5u +K,7k +i7f +$" +lx0B +c $1 $9 $7 $6 +*41+5 +x28 '4 d +x28 '4 Y4 +$c $a $r +$c $e +{ [ -9 +$9*BAsv* +^a ^f +*94T2*7B +x93*21 +^2 ^0 ^0 ^2 +-0-7 +$1 $9 $9 $8 +c$0$2 +[[[c +i79 i72 +o8! +i6g +s13 +^F +sTk +i70 i76 +x14 d p2 '6 +^Do8b +-B,7 +*B3T1 +-2+3 +o0C +T4sE`*47 +E ^3 +$a $g $e +s)aD6xB7 +^1 ^9 ^9 ^1 +Y1,4 +s9Ci61*37 +$P +C-B +i77 i72 +$@$@ +xA7 +$e $e +$t $a $r +o78 +x1Ax91 +RAx47 +^7 ^8 ^0 +i8#o13 +sR<+4 +^f ^a +*56 D7 +*06+A +{ *80 +^* +s@%-8 +Z2sN& +o5e ++5+8 +x9Bo68 +$B +^9{xB6 +T1s0W +-9 -8 ++2 -0 +u $5 $5 +-0 -2 +o8d +o7usL? +s) +sjm +srI +u '7 $8 +$1$9$8$5 ++6 +8 +s^`c.6 +*B0x93*64 +c d +x82]$7 +c $4 $4 $4 +,6*90 +x84i4ooAp +rY1 +]$rs'C +o0k +$e $x +[R9 +i78 i72 +o0osa} +c '7 $7 +$3 $0 $0 $0 ++2E +o97 ++8 +A +i71 i74 +*15 { x52 +sh;+9 +ss5 se3 so0 +$1xAB +*10,1 +ss5 so0 se3 +$9 $6 $6 +c '8 $5 +*84 +i8_K +-6K +$0 $0 $3 ++1-2 +*40s'I +i70 i77 ++3+4 +^8 ^8 +^a x43 +u x37 +'9cs-D +$d $a $y +i74 i79 +x61xB1E +*8B,4i9? ++7 +9 +c '8 $9 +$2$0$0$6 +x43x57 +sbh +sdRs+sx31 +o4es#fs1N +^w*13 +x31x69 +o60 +x92*64 ++6 -8 +x74s?L +i76 i72 +Y2t +c '8 $2 +o2y ++B*63 +R8s>q +r $6 +^4s-q +u '8 $6 +x3BL8*13 +*35*78c +c $0 $0 $1 +$3 o62 +$8 DB +sPt[*8B +*16*B2iAi +o1@ +r $9 +^c ^a +Cs47 +^0*90s/= +s#U$5 +$. $c $o $m +o5o +*69u +*09 +*06x5B +i2n*96 +$3 DA +Z1s93 +sl}u +u '6 $0 +c$3$1 ++0 *01 +$$$$ +^a ^a +D5D0 +^0 ^1 ^0 ^2 +^c ^d +$1$9$8$4 +x2B +o2f +s#kz1 +x24iA* +x37] ++C -B +c $1 $9 $7 $5 +r $2 +,5s0. +r $8 +x43oADy4 +-5^g*36 +x6AZ1*67 +sTW*15x14 +$m *26 +x92x61x19 +i79 i75 +*51x47 +*96 ++7 -9 +^7 ^0 ^0 ^2 ++0+8 +o5x +^5 ^3 +*56s7E ++1+7 +o8jz1 +coBOZ1 +c '7 $6 +-9T8 +^!+B +iBp-8 +Y1+7 +^Z +R0t +} *73 +x64-3} +x86y3 +$p $l $a $y +-4 -5 +i52 i51 +$t $o $p +c d $1 +c '8 $4 +i76 i75 +c ^5 ^1 +*B8sq(d +c $1 $9 $7 $4 +C $2 +^3 ^0 +i71 i75 +u '8 $4 +c $2 $2 $2 +spn +x3B*42 +^6 ^0 ^0 ^2 +u '8 $0 +i72 i79 +x12 ^5 +$a $c ++2 -3 +*72i7a^k +o6@ +T8s=# +D0x3A*A4 +i63 +oB`x69T2 +^7 ^7 +i35 i34 +u $1 $1 +i8;z1 +t sB8 +x74sjU +-7*82 +.8Z2 +x8BZ2 +o29 +^_ +$! $! +$5 DA +sW4[ +DBy3xB5 +c$0$6 +i0M i1a +x83li1f +x31x0A +sy[[ +sPH*56 +^0 ^1 ^0 +^4 ^4 +^c ^e +dtsyG +c '7 $8 +i75 i70 +i81*90*5A +kxB5 +$b $o $b +Z3*B5] +xA4T5 +sk[*01s=B +kRB ++7 *03 +$m $s ++7-9 +^9 ^8 ^0 +*8A] +*A5*56s06 +x82i79 +i72 i74 +LB*57 +$1 $3 $3 ++5 -6 +x94+Bx74 +c$5$9 +o5l +oAkx48 +[*97x57 +x51xB2*B0 +^b ^b +^0 ^0 ^1 +$Ex86 +c$3$4 ++9 +B +i71 i78 +T1'9 +sp1x59T2 +*A3y3 +x51*25 +-4-5 +$2 $3 $3 +l $5 $5 +^9 ^8 +*05sXR +s1#T5 +xA5s}tx51 +]]]] +[[[ +-Ai88 +o0Z +$2$0$0$5 +$n$y +i8r +^e ^e +$9 xB1 +D5scv +$0 $1 $2 +$s $u $n +i71 i76 +{*4BE +^5 ^9 +$d $o $c +o3[x25iA[ +-3 -4 +^m x05 +Y1Y1 +i76 i70 +*7Bx52 +x43iAP,3 +$r $e $d +-8iA( +o8q x15 +.AiAn +$1$9$8$0 +u '8 $5 +x62saDu +c i4- +EY2x76 +^4 ^5 +i73 i79 +$h $u $b +$o $f $t +*B7*B0,7 +^C*B4s]H +]$A +]Y2 +*53sAgx74 +i1. +sgeo4n +$9 $9 $4 +$a $t $e +^8 ^7 +u '8 $7 +^3 ^8 ^0 +^2 ^8 +-Bl +i5u +s.!sEtT3 +LBE +s12 +$s $o $n +} '4 } } } +oAZx93 +l $8 $5 +s39 +$n $e $w +^7 ^8 +T6$nx65 +i3h +'7 $! $! $! +^7 ^0 +[xB5T9 +}s.wo7H +} +9 t +^7 ^3 ++3-5 +} t +9 +sh4o5rs!\ +uc] +k$! +s(-'9*62 +D6o9BRA +x89 +l $6 $6 +.6smSx28 +-9s".x1B +^o ^c +iB&CiB/ +} ss9 +*52x79 +o5+ +$o $w +*0A+5 +K.6 +$5*76 +t p5 ] +c$6$6 +dtx7A +i42 +-3o0wiB` +$f $a $n +i95 +c$2$9 +o4i +*30 o48 *17 +*30 *17 o48 +*90^!x97 ++2-4 +*80T5D9 +$0 $0 $4 +o8@ +c '9 $3 +K-9oA0 +^9 ^9 +i72 i75 +ui6us}Z +$e $7 +*86sth^P +$i $n $n +]R9 +D2s[k +i5_ +s21 +]i60 +^0 ^0 ^2 +-2 +0 +s(#Z2 +[ *71 ++BY1 +l $6 $5 +^4 ^6 +x62{*36 +'A[ +D2*34x56 +l $3 $3 +C $9 $9 +u '8 $8 +s.7 +*B5[ +syt +u '8 $9 +$h $i $p +}Y5x75 +c $1 $9 $7 $3 +Y1sMk ++8 -A +$s $e $x +x5Bx43 +^5 ^8 ^0 +u $1 $2 $3 +^zsPo +x38x73 +td +{i5k +sDQR4 +sHi-2 +D0*B7*03 +L2 +^0 ^9 +x34i1viAm +L9C*79 ++3 -2 +l $8 $7 +$X +i0s +u $9 $9 ++7 *17 ++A*6BZ2 +,1{ +^CsBo +sqQx62 +^2 ^4 +xB7p2'5 +c ^8 ^1 +iA2 +*B9Z2x4A +$p $r $o $o $f +]s;K +sv1*81 +^H +,3$7sU; +^2 ^9 +$a $h +r $4 +*48]$3 +i74 i75 +o0M +*80z1 +{x98*3A +y3o3nx45 +KZ1l +$1$9$8$2 +-9+A +$! c +o3d +i0K +^1 ^4 +o87DB +i1@ +-7sdg +T1*B0 +Y2E +-4-7 +*05 D5 +-7E +sHGr +^6 ^8 ^0 +[ ,3 ++3+5 ++3-7 +sQ/y2 +*B9} +t $1 +*A9swc.6 +z3 x23 +x76s z +u $6 $6 +o0oT0 +si4x8BY1 +o0R +{ Z4 +'5*03o6f +$1$9$8$3 +^5 ^8 ++8iB/ +^bsx. +r $3 +sj{*92T4 +D0'AE +slisU.*86 +$9 $9 $3 +Z1x21 +c$7$8 +.7 *03 +s?.^2 +*67sf.s12 +o1. +u '8 $2 +$S l +-7xA6 +$e $8 +o7R +i3ui81 +o2n +*58 +^0 ^8 +^8 ^5 +^9 ^5 +-5 p5 +r TA +s. +.6i9p +syqZ1o9y +.7-7 +o7Y,3 +s\-D7 +s4VsJb} +$t $o $n +^Y +Z1*28*39 +^" +o2r +u '9 $9 +^3 ^8 +x9AK*6A +*09s?"y3 +x31sbUE +o9a +i3l +*34 K +y2] +o1I +x25s8. +D2x31E +Z1o97 +c $1 ^1 +c ^1 $1 +l ^x $x ^x $x +l ^x $x $x ^x +c '9 $9 +l $x ^x $x ^x +^7 ^1 ^0 +l $x ^x ^x $x +$J +]*16 +l ^x ^x $x $x +l $x $x ^x ^x +$8 $1 $8 ++2-6 +] x01 +*8A +,Ax72s#d +x78f +^PoB- +^ST8 +}x74 +[^O +*51*A8x83 +-7s2eY2 +ExB2*53 +^b ^f +$8 $9 $9 +$d $1 +s_b[ +u x01 +} *79 } +Ex49 +^X +}sS@ +D8+8*B9 +,8l +x41 *21 +c r +*52ux86 +s#tLB*65 +u '9 $8 ++9*9Asjy +*B0xA3$. +^4 ^3 ++A +C +*76x3A +$5 $0 $5 +.3x18s)z +^6 ^1 ^1 +^c ^C +x73t-B +} y4 +$y $e +i76 i73 +s|*$8 +i15 +x06s#Y +o34sN! ++2 +4 +x24 $i +i74 i77 +i75 i76 +$!x49i7V +$_ $1 +iB- +lsaH +$p $a $t +x96o22 +x96Y2 +c$0$5 +c ^7 ^7 +}s)7 +'N +o8z +Y1*36 +Y2x9A +$2$0$0$4 +r $4 $4 +i71s!1 +o5d +}$1 +*6A$Ax93 +k x81 x48 +i6<^1*B3 +l $9 $2 +x73*96 +sVLEo5v +]ss6 +^r ^o ^f ++A -8 +i32 i31 +i72 i76 +s/A'5x5B +o0Y +x71sx, ++1z1 +Y1} +l $9 $3 +fcsBz +s(y} +o9! +o7u +o68 +c$7$6 +o7Zx65 +s>C+6K +$m $a $p +iA>T3 +-3 o94 +$w $e +E]Y1 +$5 $9 $5 +] r +^Cx81 +$k $e $y +r*56 +*31l +x34sGT[ ++6i8a +ss_o63 +$e $6 +*61+6x25 +s01] +$l $s +x81x3A +}x69xB3 +c $_ $1 +xA5*75 +s29 +^8 ^0 +$i $c $e +} x95 +oA2 +y3 E +T7s&2x19 +D7T6 +^l ^A +c '8 $7 +$k $i $n +c ^0 ^2 +i72 i77 +o11 +^0 ^1 ^1 +s0v +$e $3 +p3'8LB +$3 $5 $0 +Y1Z1E +-2-5 +s45 t +D1$p ++5 -4 +^e ^a +x49 +o2w +x43c +$p $i +'8,6x67 +i73 i74 +i75 i78 +c$3$2 +$9 $6 $3 +i38 +o6Isij +^1 ^1 ^0 ^2 ++8 ,9 u +c '9 $6 +i77 i76 ++8 u ,9 +*4A*63 +x53 $0 +$4 $1 $9 +} o1N +o1d +ss5 sa@ si1 +o69 +ss5 si1 sa@ +i71 i89 i99 iA4 +$b $a $y +i69 +'6 $6 +*94Z3] +i5is;_u +o2s +^f ^c +*08 +^0^1 +x93^Ai8\ +*62sMrx9B +$3 $9 $9 +x59Y1 +c $4 $5 $6 +*85 +o0D +^1*6B +Ex31 +,6x03*1A +x03iAJ +$5o9V +^e ^f +^0 ^0 +$b $u $y +x62Z1T8 +o2m +i8a +-8T0x61 +cx28 +sbu x13 +i35 +*A6^!iBA +x38x02 +l $7 $8 ++A-B +c$8$4 ++8+A +i72 i78 ++8x7A +^c t ++4 +6 +c $2 $0 $2 $0 +i88 +p5 o6o +i73 i75 +o4a +x37 t +$7 $4 $7 +o8u +o6`xB2t +u $0 $7 +E o40 +o2t +$k $s +i61 i79 i88 i99 +sao +sS1Y1 +o0y +i61 i79 i89 i94 +o7+ +$5 $4 $3 +$2 $3 $1 +$yx84 +$p $e $t +i81 i99 iA8 iB9 ++5 -7 +i6x*28 +.6 E +$3s*Ho5j +s<@Z2s[_ +-B -C +x81s18 +i2c +$p $a $d +$s $k $i +sAI +i81 i99 iA9 iB6 +$o $h +*87 x41 +i71 i89 i99 iA2 +c $1 $9 $6 $1 +o60 t +$y $o +$c $a $m +T8x71 +o8r.4*A5 +o8- +*95^niBm +*76x21 +C*43u +x84xA9o0T +l $a +sL[x62 +$e $5 +i81 i99 iA9 iB4 +$h $i $t +-A^8s^U ++3-6 +svU,8 +$5 $2 $5 +i8nx91 +$f $e +*6BsNn+8 +o9@ +s,\D1 +$4 $0 $4 +-8 -A +i2l +s1-swf +^1 ^7 +i81 i99 iA9 iB0 +DB x91 ++D -C ++0 -4 +c T2 T1 +s\%s!3x62 +c T1 T2 +Y1+6oAl +*90'7$7 +$t $a $n +o2$ +$6 $1 $8 +sosL9 +sT9*62^f +$8 $1 $5 +]]]]] +$^$^ +*B3*12 +^c ^b +c $2 $3 $2 $3 +$r $u $l $e $s +^qx96-A +i7m*4A +$d $c +-3 -5 +i79 i73 ++0 +1 +2 +i2f +^0 ^5 ^0 +y5 *96 x15 ++0 +2 +1 +^9 ^3 +l $9 $4 +i71 i89 i98 iA9 +x5B +o5eEsm/ +i4r +*5B*84] +so!*0B +,A^G +sMLt +'9 $2 +x0B*01 +$6 $1 $0 +$a $i $d +x78-7^4 +i78 i75 +T0sr; +^0 ^8 ^0 +$V +c$3$5 +i2r +$5 $7 $7 +^5 ^4 +*A3i0r +i2u +*34 p3 +$6 $1 $5 +uT6 +KRBx87 +c ^4 ^2 +c $5 $0 $0 +*4B^a +i8s +lsLX$9 +[x91*18 +-0xA2 +s7e*A0K +D7x49x3A +[ E +o05 +c $3 $0 $0 +^s y1 +L5+9i3s +$5K*A7 +syf +$o $x +t*52*9A +^e ^v ^o ^l ^i +c '8 +[s.Nc +[ C +$f $i $t +$3 $0 $0 +$m $i $x +*54o6w +*16x39 +R0x73+5 +^ksp7 +^lt +^b ^c +d r +x23s61 +c 'A $5 +o8? +}xB4 ++4x41 +s83 +*72 +i2. +}} +$7 $0 $3 +s.6x62 +i3i +i50 i51 +x07^1 +u $6 $5 +x31+6 +^0 ^6 ^3 +c$5$6 +i75 i77 +s31 +x02 y2 +C $0 $1 +x94x72 +i76 i74 +sFAx05s$C +i76 i77 +x8A +r[o3d +R4k*16 ++8Y1*A5 +$c $c +^m ^i +i81 i99 iA9 iB2 +L8x9AD3 +$4 ^7 +*93,6 ++A*54 +^3 ^3 +i71 i89 i99 iA6 +i6@ +$k $i $t +i61 i79 i89 i92 +xB1,7sQ} +x62x68E +$i $r $i $s $h +-3+7 +z4 +*30sl$x35 +x75[sWE ++3 -0 +*67c +o8r +o1O +-0*47 +s TEx8A ++4 -5 +RBE +-3-4 +i0a i1d +D0 ^6 +$5 $1 $7 +i36 +Kx43x56 +L6x64 +{ { { { c +sp>*68o26 +Y3R9 +^5 ^6 +oB +p5 +$5 $0 $9 +*15x8B +i31 i72 +i79 i74 +i81 i99 iA9 iB3 +$7 $1 $6 +i77 i74 +Y5s(ux36 ++3 -4 ++1+4 +{l +i61 i79 i89 i90 +i0r i1o i2b +$5 $7 $8 ++8sUc +o0h +c$4$2 +.0L8 ++6-9 +$^ +$3 $0 $4 +u 'A $5 +^1 ^9 ^0 +y1s)X +u $4 $6 +i61 i79 i89 i93 +} c } } } +} } } c } +x34s`1] +$o $f +C $1 $0 +$j $o $y +$d $o $n +oBNY1x7B +$5 $4 $5 +i0L +$9 $1 $0 +$} +$5 $0 $7 +x81*5B*4A +^qTA +s38*B1^M +i31 i31 +u $8 $8 +$b $o $o +sq/-0 +$p $u $b ++0-8 +K R1 +i71 i89 i99 iA0 +c o7@ +$3 $0 $6 +^EsG5s2A +o4o +$b $y +o2G +u d '8 +-0 -3 +s9\x65 +[ x12 +i4y +x9AK +$7 $5 $0 +x1B +$4 $2 $6 +[ [ [ [ c +sUI[,2 +x92x59 +t [ +i6vx43E +i1H l +o7x +c ^9 ^6 +$7 $2 $8 +xA7*A4s25 +x4A +$3 $0 $9 +xA6 +-0+5 +^8 ^3 +^7^9^9^1 +*6A^0szQ +x05*B1x95 +^6 ^6 +*15usG/ +$e $n $d +soa +iATEs$d +-5 -7 +s93 +o34 +$7 $1 $5 +u '8 $1 +$2 $8 $6 +-0-5 +D2TA +x32sOj +.7xB1 +^1 ^0 ^0 +x15c.6 +$~ +c 'A $3 +i76 i78 +x45+5 +i61 i79 i89 i96 +*7B.7 ++1 -3 +x65^9 +$o $u $r +o92 +^1^1 +srY*90Y1 +$5 $4 $0 +^0 ^2 ^2 +^8^9^9^1 +'5$c +$1$9$7$3 +$1 $1 $4 +}x95 +^JiB8o8E +$1 $4 $0 +c$0$4 +sQ+^0*6B +i8D x82 +-2-7 +iA"Z1 +$o $i $l +up4 +$4 $4 $5 +o08 t +i7n +o6* +$2 $4 $5 +c $2 $0 $0 +c ^5 ^2 +$9 $3 $0 +x81.5 +o0F +Z2spM +,8sxn +$g $a $y +i77 i75 +u $9 $8 +xA5,8} +o4j*37-1 +lY3xA1 +fsYA +sTe$@xB1 +z1l*16 +^3 ^9 +o6n +x81s(} +u $9 $6 +$e $a +^1 ^5 ^9 ^1 +c $1 $@ +$4 $3 $7 +u $7 $8 +o0r +$6 $4 $2 +*3A,8 +$8 $0 $0 +sa>^! +x62*2A +x38k +x02x7Ax07 +c $0 $0 $9 +l i5+ +lY1x92 +^9 ^9 ^9 +$7 $6 $7 +i74 i76 +ss5 so0 si1 +$w $i $n +z1k +'8 $1 +u $1 $9 $7 $2 +ss5 si1 so0 +c '6 $9 +$t $o $o +$1 DB +$m $a $r +i0R i1a +l -3 +$t $e $e +i9$D9x65 +i05 i11 +*18 +0 +sQWx9BD1 +o7r +u $9 $3 +s71 +o4@ ++4 -3 +o1U l +*69R7o90 +x06x78x09 +^U ++4 -6 +$2 $9 $3 +i73 i78 +ri8Ax1B +$< +o90 +'BD1 +u $9 $4 +$g $s +s64 +-3+4 +ux9A*7B +i71 i89 i99 iA3 +s/n*14*26 +o2@ +ss5 si1 so0 se3 +saUx6BD7 +ss5 se3 si1 so0 +ss5 so0 se3 si1 +{Y1 +szis6/*79 +$f $l $y +ss5 se3 so0 si1 +ss5 si1 se3 so0 +ss5 so0 si1 se3 +snCZ1 +^2 ^6 +^2 ^1 ^1 +y3 x09 +*A8 +x05*01 +i5vR1 +D3*09] +o45 +$t $e $n +o6a +*82$)o5m +$a $2 +c $1 $9 $6 $8 +Es!( +x64x7A +$2 $5 $3 +$r $a $n +$p $o $p +u 'A $7 +Z1 D3 +T0x7B,5 +s4$x72$! +} $$ +$i $o $n +i5ps+1 +$A l +$m $y +$6s8Wl +oB(o90 +oAz[^R +x42sGz +*7AtxB9 +u '9 $1 +s3pi0isvm +smyD2 +o42i60 +s=oR7s+% +o7_ +$5 $6 $0 +u $0 $0 +'AszO +o8Fu +c T4 T2 +c T2 T4 +$p $e $n +$6 $5 $7 +sJ$T4x2B +l] +{R9 +*24x24 +$8 $2 $5 +i68 ++2-5 +u $8 $7 +$6 $6 $7 +l$u*A3 +x21i4v +,7$ex98 +*17D6 +-0sH( +sKJ.5 +$a $u $d $i $o +$3 $4 $1 +$a $b ++7 -5 +sk!l +*6A-9 +*82,6 +^l ^a +x67iBe +}saB +-0+8 +c $. $1 +*8Ai97 +^7 ^6 +^; +-1+2 +$4 $7 $4 +,2'7 +i74 i78 +i6l +s ''5 +i0J +T8.7 +i3dx8Bc ++1-7 +o6u +D8 c +} } c } } +^TxB5s&@ +^e ^D +rx61sb- +l +4 +} '4 +$7 $0 $4 +u $1 $6 +c$8$0 +'2 +c 'B $1 +x96sg9 +$t $o $r +$i $n $s +-4 -6 +i78 i76 +x29x2B +'As\1 +o1t +$3 $2 $9 +-7-9 +o3y +.0z1 +Z1*14s%t +u ] +^5 ^5 +'Ax89,A +$d $b +u $3 $5 +$8l +i30 i31 +x21*89 +kxA2$6 +c i01 i12 +sMEd +$3 $0 $7 +^b ^d +x51o6q +o6k +i0a i1m +Y3x53 +i8e +o3n +o2v +s S*28T5 +o12 *81 +$3 $4 $0 +DA,9} +c $7 $8 $9 +c $1 $9 $6 $7 +$5 $4 $9 +*B0.5 +C $0 $0 +^8 ^1 ^1 +u $0 $6 +$osZw +$8 $0 $3 +i09 i19 +C $7 $7 +o9_ +cDB +c '9 $2 +Z1sc@D5 ++3 -5 +^c ^f +p5 -9 +c '8 $8 +o3S +K -9 +$?$? +x31 $8 +^j x14 +*6B-0x65 +T5sW{ +*41z1 +,7x01 +$c $s +*39T1x96 +c $1 $5 $9 +o4I ++0 +6 +,4xA8 +rdx4B +i3p +$] +x5A,7 +^1^5 +sI4T4 +$p $a $l +,0Z5x67 ++1+5 +$6 $5 $2 +*49.0xA4 +T4*B3 +x39x34 +,7x42 +o8+ +$E*48 +$7 $9 $3 +$e $r $a ++A +A +A +$2 $2 $5 +o6l +$5 l +l$* +x3A*15 +l Z2 +-2^w +sNbx81 +$Nx38 +$Rs)| +sd4i42T8 +^4 ^1 ^1 +.6,6 +c ^4 ^4 +y1 x45 +D5L8 +Y1 ,9 +s85 ++2 -4 +^hx63 +o4s +]i09 +i0f +$2 $2 $0 +Kx97T6 +C $8 $8 +sae +u 'A $2 +i73 i77 +^fD9*05 +k$? +,7.5 +^7 ^8 ^9 ^1 +i17 +^x^x$x$xl +p2 '6 +ss$ +x52xA7sqm +x1A +o5u +c $< $3 +str*3B$. +^9 ^8 ^9 ^1 +Y4*87x86 +i78 i73 +^6 ^8 ^9 ^1 +$-$- +o1A +C x03 +u $9 $2 +s/OT1sZL +x28^w +$f $i $x +o4t +$1$9$7$5 +s\=*76 +i50 i52 +u $6 $3 +{ sp- +$1 $0 $3 +^0 ^6 ^0 +u $0 $8 +$0Z1 +$!$@ ++8o4a +c$3$8 +u $1 $4 +u $0 $9 +DA*65x89 +$d $a $d +$7 $0 $0 +o6d +KsNh +u $7 $5 +u $8 $6 +L3 +x31 ] p1 +c ] +$c $h $i +x36 L1 +txA7 +,6T3sXa +i82-9 +x7A}s/A ++5 -3 +s8aT6 +x62xA7 +o66 +*08*6Bsfv +o0N +c s'e +u 'A $0 ++B -9 +i73 i76 +$a $x +$4 $0 $0 +u 'A $8 +c 'A $6 +i53 i52 +o72 +u $5 $3 +$a $i $l +sRso0H +$m $u +c$5$4 +u 'A $4 +$e $0 +$# d s#s +$a $7 +$# s#s d +o8c +*72x46 +T5RB +$a $n $i +$1 $7 $6 +ss5 so0 +^3 ^7 +$g $o $d +u $8 $5 +-0 -5 +L8 +T4o7F-1 +$2 $7 $8 +*61$3 +o7+ c +*B7*1B-8 +$6 $0 $0 +-2+6 +iA/ xA3 +} x32 +x07xAB*10 +i31 i30 +i65 +i97E +$g $a $t $e ++1 +4 +]*79 +sPMx35*BA +-3-5 +x17i7?t +} Z2 +x67x91 +$9 $4 $6 +$w $o $o +x49,6 +u $6 $9 +o5t +c$5$7 +u $4 $1 +k x81 ++0+9 +^0 ^0 ^4 +C $1 $3 +x52T8x4A +o3w +$r $u $n +^9 ^4 ++1 +5 ++AE +*0B +$b $c +$f $f +o4d +x09D5x95 +C $3 +*94x35f +^b ^e +i02 i13 +o3. +^7 ^5 +'8 $8 +o8u$z +iB7xA6s/Y +i1d i1a +s[)'6 +-5+8 +x42x71 +$2 $3 $4 ++1+6 +$a $s $h +i71 i89 i99 iA1 +x01 ] +*13oBy*4A ++2 -5 +i2a +$)*0Bx72 +-Bs;mo0A +[ [ x04 +[ x04 [ +l $8 $9 ++3 -1 +^a ^e +u $1 $0 +$@ $1 $2 $3 +u $2 $5 +u $9 $7 +$9 $4 $9 +-2 -5 +c$8$2 +s4xT4 +*13 -8 +$3 $1 $2 +-3+5 +*84^I +.4{r +i2s +^6^9^9^1 +i53 i51 +^4E +i44 +^i ^M +o25s)U +st7 +i6i +o63*4B +iAs +$t $h $e +^4 ^1 ^0 +DBo78.7 +$s $e $e +s*`,8 +i1b i1a +i0= r x72 +,3} +i69i0w +-9 -B +[ x45 +*A6-6*0B +*31 *49 +i5n +'5u +-0RB*A0 +s(jx61x51 +sub +o1x *50 +xA1+4 +stm+A +c$6$4 +$w $o $w +*52srF +i0y +$1$9$7$6 +T6x78 +l $0 $8 +Y2sLQsBf +*03[ +^2 ^7 +*1Aswz*98 +u $1 $8 ++1 -4 +$a $c $e +} z4 x87 +dx7A +*78i68o76 +i4u +x03*94 +$1 $7 $2 +x91D3 +$9 $4 $8 ++3 +6 +sB4x31 +i8_ +o7$ +x83s&0x8B +x79K +c$8$1 +x7BR6x63 +i78 i74 +i0A i1n +c '6 $3 +u $7 $1 +k Z1 +*86x81 +x98 +u $3 $6 +*80 +c $1 $1 $7 +y2 Z2 +-1-3 +l $0 $9 +o7d +i1l +x73.7 +K.6sx9 +s/_Y1sH] ++1oBi +l $7 $3 +-A'8 +$1$9$7$0 +$f $c +c$7$4 +$t $w $o +$9 $3 $7 +$8 $7 $3 +T5x6B +i09x6A +c$1$2$3$. +i0J i1a +i19 i19 +c $1 $9 $6 $4 ++8-A +i02 i12 +$a $r $k +ssmsYtT5 +$b $b +slr +DB x92 +i81 i99 iA9 iB1 +C $7 +o0S +^8 ^8 ^9 ^1 +x91i84 +-C -D +sg\sVux71 +x93oAG +tx3B +x87i73 +i96x84s%s +E.B +i6' +o4y +l $9 $0 +o0E *03 +$7 $6 $3 +u $0 $5 +} Y3 +u $1 $5 +l $0 $5 +c 'A $4 ++6 -4 +x21*21 +$1 $2 $2 +$! $1 $9 $9 $5 +sRGx72 +-3-6 +]x53} +D0 'B +u $3 $9 +s45x29 +$e $b +s17oA& +u $5 $2 +x79i2p +Y2T8 +l $3 $0 +c$7$5 +i7+ +o79 K +u $7 $0 +x02sN9 +$o $r $e +Z1+7 +$s $p $a ++D +E +ts&H +o36 +i01 i13 +dx5A +i0a ^K +l $0 $6 +cr +s|;[] +$h $a $m ++8 +0 +$7 $5 $4 +i3o +x92{oAU +[ 'A +sw%s8Lx42 +{ x79 +$v $a $n +u $6 $7 +o0n c +sbo +u $1 $7 +$9 $8 $2 +'4*72$4 +l $4 $5 ++7Y2 +Y2x52 +*35^e ++A -C +c $1 $9 $6 $5 +^4 ^7 +o33 +^5 ^0 ^1 +l $8 $4 +*9B^psmW +*75*7B +s#Pi0ec +x2Ask]T4 +u $5 $9 +u $4 $5 +$r $a $y +$1 $1 $5 +*8Ax1AT6 +-1-2 +i8@ +$1$9$7$7 +c o52 +u*63x93 +$e $h +u $2 $9 +i8. +u d '9 +*84 *83 +$9 $4 $7 +*24Y1 +u $5 $7 +i90 +$> +o5S sS2 +o70x5AiAw +u $2 $7 +u $4 $3 +$s $i $n +oB7]x35 +o1h +T2*0B +o1k +s_@i99 +u $5 $8 +c ^5 ^5 +o1e [ +x1Ax7Bo0g +*4B*67 +i5k +$1 $9 $9 ++0 '4 +o1J +o8b +o6oR6 +*69 +i59 i51 +c '7 $4 +u $5 $6 +l $0 $0 +o30 +$6 $9 $6 +^7 ^1 ^1 +^1 ^0 ^1 +s[ix36+0 +*83$kDA +$c $a $p ++D -E +i3g +$1 $0 $7 +{ x02 +u $6 $1 +i51 i52 +u $5 $4 +skK +l $7 $4 +u $6 $8 +$1 $6 $2 +s]z*75iAH +i8$$z +}x02x6A +-A -A -A +sKzs3`{ +kZ1 +l ] $e +xB3s#" +i00 +$h $a $t +iAWT7 +i2+ x16 +Z4 l +o9iu ++9l +*BAD2 +*75s q +^4 ^9 ^9 +i39 i39 +$7 $7 $5 +$p $e $r +T7s3d +i0G +x58-5 +i1c i1a +xA4x86,6 +$6 $7 $4 +D4o0b +o4o c +t Y2 +^8 ^8 ^8 +u $3 $4 +$t $e $a +u $6 $0 +[sqY*76 +o98x8A +$l $o $c $k +iA! +r x79 +$uiBjsZ5 +$1$9$7$2 +u $0 $3 +i4d +*B5] +$i.9 +KY2 +D8Z1 +u $3 $7 +$5 x81 +$1 $1 $8 +i0m +i0P i1a +u $7 $6 +c $3 $6 $0 +o81 +$yoAS +$o $v $a +*06sCQ +o1z +i59 i59 +$1$9$7$4 +o96xB5 +ssy +u '9 +o2T +$p $i $n +^0 ^9 ^0 +^9^9 +u $3 $0 +o6$ +i92*8A +i61 i79 i89 i91 +c $! $1 +$t $a $g +$r $o $d +s)e*26*B8 ++9+B +iBr +s[%o4!*97 +s61 +sIu*01 +$2 $0 $5 +$e [ +$7 $8 $3 +$h $e $r +c ^x $x ^x $x +c$7$2 +c $x ^x ^x $x +sU6i0N +l i4+ +c ^x $x $x ^x +c $x ^x $x ^x +u $9 $0 +c $x $x ^x ^x +c ^x ^x $x $x +T5oA1s_G +oBMx03oA= +o61-9 +i51 i50 +i7o +*26{ +$6 $1 $9 +svU +'O +u $6 $2 +sot*BA +$e $a $r ++4 -2 +x29 +t*15 +f u +c '7 $0 +x05i6! +i77 i73 +i79sxk +$i $t $s +x43u*41 ++2 +6 +-A,9x75 +$El +'9[ +T6xB4 +$2 $1 $1 +s8s +u $3 $8 +szn{s7s +u $7 $4 +u $7 $2 +i8w +uskYE +o0GsZ2 +D0T9 +$l $o $t +u $5 $1 +^+ +*14$h +[ D4 +$c $u $p +u $4 $0 +l $3 $2 +$p $o $d +u $2 $4 +^3^2 ++5 -0 +i0CxB7 +x42 .1 +$h $u $t +.B'8 +l $8 $1 +$ts[, +*16T3 +i7)$o +p5 $P iA$ +x89T5 +xA2T5 +i6> x08 +i6e i7d +}x27 +z1 E +$s $e $t +p4 o38 +o4m +so9xA6x63 +i90 iA0 iB7 +C $2 $3 +u d '7 +$1 $1 $6 +l $7 +$o $w $n +^d ^D +u $8 $2 +u $2 $6 +c$7$9 +$5 $5 $3 +c$5$0 +*75skY +x1A-2 +DAx84 ++0 -6 +{ L5 +i0l i1e +i0x +s5w-5 +s92 +^x ^X $x $X +*52 o0B +$1 $9 $8 +-2+5 +^Bs0gD1 +sfpsVZk +u $7 $3 ++2 -6 +^x $x ^X $X +^x $x $X ^X +s^"x41T3 +i5@ +l $4 $8 +T2x78 +o6sx97 +sI7$wx7A +$A*6A +-7o97 +^0 ^0 ^0 +o8;$N +$1 $5 $5 +-3*26sIT +$3 $4 $5 +u $3 $1 +z1*76x31 +sjf*58sq+ +D9*86x56 +sa4 se3 +i5ey2 +^1 ^2 ^3 +,0.3 +^ns,| +]-7 +*89*B1x85 +$1 $2 $5 +*9Az2x91 +-A*26 +'7Z1 +u $8 $9 +$s $o $l +y1^y +x51Y2 +$a $8 +D8$* +sp3R4 +u $9 $1 +u $0 $1 +d 'H +$l $o $w +*75x72 +T2s8' +s91 +l $3 $4 +$0 Z5 +u $4 $7 +x7Bx91 +iBo'3 +s+v*57sI% +-5-8 +o61 +x51sy1 +i9? K +iAEx65 +x28 d Y4 +l $3 $7 +u $8 $4 +$b $r $a +D4i4i +x2AZ2 ++8c +^d ^A +$j $a $m ++0 +7 +$e $a $t +,7 -8 +o6z +$3 $1 $1 +l $5 $7 +o2I +l $4 $6 +.5sJ3L9 +l $4 $0 +$" c +x51[ +$i $r $e +l $6 $4 +oBe +xB8 +o9Zs$C+2 +$g $u $n +c $9 $9 $5 +s17 +x1Bx41sEL +x12'B*B2 +s%]z2sVn ++4 -0 +x86*B2 +i07 +$zx71xA8 +T0 ,9 +} sAE +sLNx85R9 +$a $9 +*32*8Bx54 +l $5 $0 +o9c$s*57 +$r $a $t +{ C +^1r*83 +Ksexo1k +i3r +} Y4 +o8e +^2^2 +$A $1 +xA8Y1D4 +-0s=M +$0 $1 $1 +$b $d +c $@ +s38 +{sjoY2 +C $3 $3 +i2e +$1 $4 $7 +*0Ati8t +i1r +$Ax98 +c ^6 ^2 +$z $e $r $o +^a ^D +i1o +xB1y1 +i6j +u 'A $9 +xB2'8 +l $7 $5 +$[ +$\ +l $5 $3 +i4& +*93k +i5l +c ^9 ^9 ^9 ^1 +l $3 $5 +iBao29l +^l] +l $9 $1 +x7Bx73 +^ds>2 +^7 ^7 ^7 +y1E +s|'T8 +ksH0 +i41 +p2x49 +} x03 +i5r +l $7 $6 +^0 ^2 ^1 +c $9 $0 $0 +.8x8A +s#kDAiA6 +$@$# +*25s$jLA +^0 ^0 ^8 +l $6 $2 +x87^O +^9^9^9^1 +i8S +$o $l $d +x97+2*A8 +x21s0K +i1a i3a +i0j +*74*81 +E D6 +i5S l +s/2 +[x82 +L8z1 +x3A +$b $e $t +Ex64 +$a $r $c +Z1E +i02 i17 +s8t{ +^6 ^1 ^0 ^2 +o8$ +$< $3 +$u $s $e +u $D +{x03*29 +u*95$D +$t $a $x +TC +*B6*68 +^3 ^8 ^9 ^1 +sDLi93D8 +l $1 $0 +o6S ++4*76*6B +^0 ^8 ^9 ^1 +s7g +l $5 $6 +iA8 +x83K +i9S l +*10Y1 +o1es2v +z1E +^!smI*47 ++E -D +l $4 $9 +i9' ++C+C +c $1 $9 $6 $3 +o5j +l $0 $3 +Y2x29 +i7)T1 +o0f +o48 +l $1 $1 +$1 $1 $2 +*7A +7 +T0 $n +x87-6 +sHntp1 +x98x01 +^4 ^8 ^9 +i5e i5d +sKm$n +i8b x78 +]]]]]] +c i6e +i0m i1a i2d +Y2x38xA1 +s|g*16 +*65 y2 +x01o2r +Y1oAm +p1 i91 +i54 i51 +$0 $1 $0 ++8 +9 +9 +Kx53x69 +x56s(O +$l $e $d +l $4 $2 +sO]-0sAZ +sUs ++7 +8 +8 +sq#x3Bp1 +c$3$6 +o8Qx81*A8 +^AsOl +siE +s|vo5s +^2^5 +^4^2 +$r $a $m +$k $e $n +x94xB3 +L8Z1Z2 +s/xsF?iA1 +x7Ap2 +E*75 +i94} +$.$, +x42 [ +*BAx21Y1 +$9 $8 $8 +c $9 $8 $7 +^l ^J ++5 -2 +$_$_ +l $3 $1 +s\bD1x91 +skc +i33 i31 +o3$ ++B +D +skj +x63sVr +*63^6 +x48 D6 +^&[*86 +o1S +s6Vo0D +o5k +y2c +i5) o5p +D3x27 +-2sA= +Z3c +sweo9Mo3a +p2s&e +o7* +*63x14 +$0 $0 $9 +o6m +p5 i5_ +c $1 $4 $7 +-5sz? +*34.6 +u $2 $0 +sou +x35$_ +Y1oBY$1 +T1x58 ++3 +7 +x72$. +o3s +i05 +l i3+ +o5$ +oB/T2 +$f $e $e +^9 ^9 ^1 +i5o +sy\fu +,5p4x15 +o4aslB ++4+8 +$i $f +] ] ] $s +y5c +$b $i $d +$,$. +y3x05 +o4r +sr^$5 +t '6 +i9. +sk*T9*90 +^s ^a +i3e i3d +Y5$w +c} +cK +Z4s(qx82 +$7 $1 $1 +^4x28s

+c $9 $7 $2 +i6sDA +c ^a ^1 +*85t +swn]E +c ^8 ^2 +i33 i32 +t x03 +^ms+" +u x02 +^f ^e +*02 x21 +c$4$1 +i39 i36 +^4 $2 +uc*26 +*92Z5x45 +K *48 +^9 ^1 ^0 +-5x87*7A +o0x +i2d +i3d i3a +c $0 $4 $0 $4 +$a $r $m +$1 $2 $8 +sT%srou +.7*1B +svn +o6tx32 +o3c +x45s/4 +l $2 $8 +T4iA' +^e ^e ^r ^f +x8B}oAJ +^4 ^5 ^0 +c $1 $8 $1 $8 +p2sbB +l ^d ^e ^r +u T2 +]c +^d ^r ^a ^h +o2_ +i50 i50 +$p $i $g +$b $i $n +u $4 $2 +[[[[ +s}++5 +-A-B +x76*56 +*B5T7 +$t $i $c +xA8 +sao r +x82s"IoBp +-0] +set.7x5B +swV +$m $i $l +^A l +T0 o68 +^w z2 +x59o4a ++1 D0 +o3k +o70s`1 +Z1*72 +y1,B*23 +l i6& +o96 +sQV +,5 z1 +i04 i15 +^w ^e ^n +o6D +$g $e $e +^1 ^2 ^2 +x37tp2 +$l [ +^6 ^2 ^2 +o6e +$2$0$2$0 +,6*30 +s.@^W +u 'B $0 +y3x07oB/ +u $1 $9 +Z2*6Bx53 +*A3C +$d $a $m ++8x72 +i0k +x21o9Ox71 +s4k K +i55 i52 +s3A +^8 ^2 ^0 +-3 -7 +u K +c $1 $1 $0 +iA?.A +o9+ +-C-C +s4`.6+0 +*6A*50 +Ex89oA0 +i05 i16 +oA&$k +d x67 +$d $2 +,5s.Y +r $8 $6 +o5(x53*5A +i03 i14 +^m x09 +Y2 Y2 +o38 +*91*B5^A +DB $4 +i57 i57 +^3 ^1 ^0 +$ $1 +s67 +iBwi5s +$5 $1 $1 +i55 i54 +$9$7$3 +[ $r +x43*9B +x0Bx78^Z +$n $y +'B $6 +[ x15 +$8 $9 $0 +c '9 $8 +'P +i5d i5a +-5 -8 +*94p2 +o7wf +D9,5 +sg`*A0^0 +i13 i12 +c $2 $3 $4 +^6 ^7 ^9 ^1 +x8Bx61sfB +'6 $7 +i51 i69 i79 i84 +^yT9 +$2 $9 $9 +i6h +TA+A +,3E +s40 +$0 $9 $9 +-1-4 +KxA4 +R9T6+A +'6 $5 +^7 ^9 ^6 +o01sd2 +^1 ^1 ^9 +c$4$3 +i52i7k*08 +$1$9$6$8 +tsgD +-3 -6 +x43[ +^7^2 +*56*BAp1 +[sp@ +^1^9 +$2 $8 $8 +st$R5 +o9-E +c $0 $0 $2 +^3 ^3 ^3 +c$7$0 +*86x69 +Y2stP +$I$1x71 +D7t +sbli00 +y4 x82 +l $1 $2 $3 $4 +^d ^B +^4s24 +*64z2 +^7 ^8 ^9 +Ep4 +} x01 +sKL'5Z3 +^5 ^5 ^1 ++0[^r +]*A7 +o7B +$3o8k +c$5$2 +E.2 +i8o*86*0B +suek +$p*B2 +$n $a $p +x32{ +$7 $4 $1 +C*91,9 +r $1 $8 +C $4 $4 +$0 $0 $2 +$4 D9 +s2X +o9>^p +scUx51 +r $2 $3 +^0 ^4 ^4 +i64ske] +y4s_4x43 +sq$xB1 +o59i9p +stVx98x5A +*A9s25+8 +l $* +o2h +$1 $2 $3 $! +c $6 $0 $0 +,4TB[ +i01 i11 +*93 [ +*23x81 +i59 i55 +i0C +i59 i56 +oBv +DB D0 +oB3 ++5 -1 +^E x05 +sH=K +^9 ^6 ^9 ^1 +*B6D2$e +^1 ^7 ^9 ^1 +sIm.8 +K f ++8 -7 -7 +^h x24 +C $6 $6 +$voA7 ++4 +5 +6 +] ] c ] ] +] ] ] ] c +c '6 $4 +c $1 $2 $3 $@ +Y1sSw*9B +^7^7 +c $0 $0 $5 +*65o72 +s20 ++4 +6 +5 +]C +] c ] ] ] +y2 l +$6 $7 $8 +] ] ] c ] +*73 -1 +o7k +^0^0 +^rx25 +$ps]#E +^8^1 +$w*75 +i38 i38 +i57 i52 +-6+9 +i7e i7d +*89iB}o1e +o0v ^h +^6 ^6 ^0 +$2 $b +x8Ai8A +*67E +*02 ,1 +$s $i $s +i3Ax13 +^4 ^2 ^0 +$1 xB2 +p5r +z2 x3B +-1-7 ++4-8 +x74o74 +p1lx76 +c$5$3 +^4 ^9 ^6 +$1shS*4B +T6x9B +soFx95x74 +x1B$1L6 +{ o0Q +Z2x58 +-8i61 +T9*36 +^6 ^2 ^1 +D2 k +*17z2 +*10c*93 +$- $1 +^X $X +i3n +-8o0axA3 +sz=T9 +$?*BAoA5 +oBj[ +i7Ps}nx69 +i07 i12 +sa1Z2 +$M $n +$fx29 +^8 ^7 ^9 ^1 +} } } c +$z $a $p +$b $1 +^6^0 +Y1x72x59 +$d $i $n +o6M +$h $i $m +$m $o $b +R0*67.2 +L5 +$l $a $y +iB9 +s`*iA0 +^7 ^0 ^1 +Y3 ] +l i7& +x21k +o9l +$1 $9 $5 +x2A Y2 +i2_ +$5 D8 +i09 +^0^3 +$0 $3 $3 +x0B]$@ +$m $e $s +sYix91 +^4 ^7 ^9 ^1 +$o $w $l +s56 +c $0 $1 $0 +$1$9$6$7 +o7K+5'7 +^9 ^2 ^1 +s7? +skG[ ++6sMu-2 +*68s|T*78 +$e $t $a +i9Mo3b +c $8 $0 $8 +,5sEs8' +^0 ^7 ^7 +$g $o $o +^3 ^4 ^1 +xA8$* +'8 $3 +T6*B9sk& +c '6 $6 +c 'A $2 +$1 $7 $7 +d '8 $1 +i40 i50 i67 +$1$9$6$5 +LA^MK +^0 ^2 ^5 +Y4xB1 +$($) +^0 ^0 ^5 +E*32 +'8 $7 +y5'5r +x4B +z1*A2o8= +$j $a $y +u 'A +ss5 si1 so0 sa@ +$A i0a +ss5 so0 sa@ si1 +i4@ +'B,9 +*24.BY1 +^6^2 +$2 xA2 +ss5 sa@ so0 si1 +$m $e $t ++5*5B ++7 -3 +ss5 so0 si1 sa@ +i1b i1e +ss5 si1 sa@ so0 +^2 ^5 ^0 +ss5 sa@ si1 so0 +x4BT1] +l $6 +y4u +$2 $5 $5 +{ sz? +o02 p3 +D0 o0k +i9,Y4 +^0 ^5 ^9 ^1 +l $7 $7 +x8Bx08 +*92T7 +x15.6d +,4x96Y1 +*29K +s49x69sJf +$p $a $r +$a $0 +-By2K +C $8 +^E i1l +c ^8 ^0 +^l x17 +ss5 sa@ so0 si1 se3 +ss5 se3 so0 sa@ si1 +ss5 so0 sa@ se3 si1 +s45 +'8 $2 +ss5 se3 si1 sa@ so0 +ss5 so0 se3 si1 sa@ +ss5 si1 so0 sa@ se3 +ss5 sa@ so0 se3 si1 +ss5 sa@ si1 so0 se3 +^8^9 +Y5 x47 +2 +ss5 si1 sa@ so0 se3 +*80T2*5B +ss5 sa@ se3 so0 si1 +*68oA' +ss5 si1 se3 sa@ so0 +i4a x31 +ss5 si1 so0 se3 sa@ +ss5 se3 so0 si1 sa@ +c '6 $0 +[ K +ss5 se3 sa@ si1 so0 +ss5 so0 sa@ si1 se3 +o2r [ +ss5 se3 si1 so0 sa@ +ss5 so0 si1 se3 sa@ ++B -D +Y5 +2 x47 +$3 $5 $7 +*50 y3 +ss5 si1 se3 so0 sa@ +]-8 +ss5 so0 si1 sa@ se3 +ss5 si1 sa@ se3 so0 +ss5 sa@ si1 se3 so0 +ss5 se3 sa@ so0 si1 +ss5 so0 se3 sa@ si1 +^ysVn +s'{x8A*32 ++2 -7 +^f } +$2 $4 $4 +o1s +$3 $6 $6 +*03iA5D2 +D1 o1- +{ [ [ } +*1Bx42K +s#\*71x34 +'9p1 +Ex16 +^a ] +$1 $1 $3 +r $8 $8 +c $2 $0 $1 $5 +s^U$6 +o0ns $o7X +o6g +x05o9q +*40$6 +o27 +^U D1 +c ^9 ^0 +smGxB1c +lZ1 +i0t +,7stG+8 +d 'I +o4w +]x27r +x07 x16 +i01sP\ +iBs +x83s@7 +i35 i35 +xA7*73 +*31 *20 +x23$r +l [ ^M +lx64T4 +^1 ^2 ^0 +o5z +^2 ^a +o6' +c $3 $0 $3 +x42Z1 +{ DB +$1 $2 $1 +^9 ^0 ^1 +$4 $8 $8 +sHWseos25 +$f $b +xA9s0/se@ +c$1$2$3$$ +y4 x32 c +s8'x12 +s1U +i00 i10 +D5c ++7 *49 +-1 -7 +i5sx78 +Z3*58'8 +i09 i17 +s^$l +$1 $5 $0 +i0i i2m i1a +y4 c x32 +i5"sU4o5_ +,9scU +x87xA2 +sr(x32 +$n $o $t +xA6^p +i56 i51 +'6 $4 +^5 ^2 ^0 +KR5i9C +$4 $9 $9 +i6c +D7 D7 +siDK +$# $1 +sK$y4 +*14 r +i8L$ks9z +]*28+5 ++8 -5 +i3a i7a +syi +$T l +o3h +o0E +l -1 +y1R1x3B +i0J i1a i2n +iBN*78i72 +oB5 +i1y +*5B$3 +s18 +sA.x83 +x25xB3 +*78T4s}E +x34s*xt +} $U +'8 $9 +$r $a $w +^0 ^0 ^9 +x98y5x28 +c ^3 ^9 +^d ^f +DB $6 +sXe*31 +i03 i18 +-E -F +^2 ^9 ^9 +$7+B +*9A,3*0A +^7 ^2 ^7 +o5B +RAx74E +.5*16xB5 +D4sk/i71 +$5 $9 $9 +$9 $2 $2 +} .7 +$0 $5 $5 +c $1 $0 $2 $0 +i4m +,4D3 +^4 ^1 ^1 ^1 +o0@ +$7 $2 $2 ++9 -A -A +^3^3 +i06 i15 +^7 ^9 ^9 +i5h l +i85xA1 +s]6Y1 +z1EiAo +o3_x23 +D2 o1o +$/$/ +^a ^x +^7 ^9 ^1 +l ] $a +D1*20 +x03sc> +sco +$i $d $s +^4 ^5 ^9 ^1 +^9 ^6 ^0 +$b $e $d +{ *79 +o9vx82 +^n ^a ^m +i54 i52 +x6B +c i01 i13 +s}(D0x76 +i01 i12 i21 +$1 $3 $5 +i5a i5b ++0 -1 -1 +$4 $6 $6 +i97 +C $4 +i6o i7n +$4 $2 $2 +o0r i0p +c $a $1 +$Ol +o3G +,3siz ++0 +9 +$d $o $s +x02 ^j +i4y x52 +sv-s"xx42 +$t $a $b +$1$9$6$4 +*A3^cE +^4 ^c +*9A+1 +^8 ^6 ^9 ^1 +xB3s04+3 +sr2*86 +l $o +iB0sbs +xA3+6 +i59 i50 +C $1 $5 +i7'*A7x96 +x25 z2 ++3 -8 +u d '9 $9 +x94$4*AB +str +$3 $5 $5 +$f $1 +*05 x03 d '3 p1 +c ^6 ^0 +sb[Y4 +i05 i17 +*19T6x41 +$5 $4 $4 +^a ^B +x98p2sbT +D2Y1 +*36LB^x +y3D6-B +s+@ +i07 i14 +o4g +C*4B*B8 +x9B +i52 i50 ++4*90 +i39 i31 +x83x65*B3 +i6Eso+ +i06 i17 +*69s&5} +tx85 +i2k +i97 iA7 iB7 +D3Z1 +i2- u +o6, +-7 '8 +i7x +o2H c +x52 x13 +D7 D0 +E.Bp5 +D4L9 +i4a i5n i6d +o6i +Z1Z2x97 +xB6i51 +rx24x97 ++5xB4smk +s}'iA8 +^3 ^5 ^9 ^1 +^7 ^2 ^0 +c $0 $0 $3 +$h $a $w ++1 D9 ++1 i23 +$h $o $e +^3 ^9 ^9 +^4 ^7 ^0 ++A -9 -9 +^0^5 +x82*32+7 +x58^h +] c +^6^6 +$9 $0 $9 +c $2 $0 $1 $3 +sAex47R0 +*67$9 +$r $i $g +$o $d $e +i1A +i2Wdx0A +l y3 +^6 ^3 ^1 +^3 ^9 ^0 +*23sf+s[m +o4Kc*0A +D8 'A +rsz; +$1$9$6$3 +T1s)M +c $0 $1 $1 +i3b i3a +i9vY2 +c ^3 ^0 +$c $a $d +i82 +K$4 +^8^2 +$5 $2 $1 +z2}*A5 +l ] $k +^3 ^5 ^0 +i0O ++1 -7 +x21*5A +u oB? +c $9 $0 $9 +^9 ^2 ^2 +c i01 i10 +Y1oAeE +c $1 $4 $3 +*4A*81x32 +*03 x34 +,4 D3 +*04 x25 +o0W +s%@k,1 +i51 i69 i79 i82 +]*43*40 +^9 ^5 ^9 ^1 +$k $c +^gx09 +*7Bx57 +i7a i7d +'6 $9 +x63x87 +-2+8 +o0( +ff'A +x25y2 +l*03 +p1sZf +*51$. +^6 ^6 ^9 ^1 +^0 ^7 ^9 ^1 +^5 ^0 ^5 +i6z +ExB9+A +^a ^F +o1g +i8m +s)\s9bp1 ++4x49*82 +c '6 $2 +^- s-m +$1 x71 +c $1 $6 $1 $6 +RBx58 +^0 ^8 ^1 +R8x54 +y1x8B +i5D l +*05 x03 p1 +cx42 +D6 t +L4 +c $1 $2 $3 $! +'8 $4 +$0 $2 $2 +i8W*B6-2 +sdk*74+5 +s-[Ex84 +s1qY1} +-0 $? +T1 { +$i $t $e +s4g*2BC +i0J y4 +i54 i54 +C $0 +*1B^t +i58 i51 +s14 +i4+ +si4 +}EsLP +x43o5l +s$cY2sSc ++0-9 +$b $u $d +'8 $0 +.2sBKx48 +o1? +$6 $5 $5 +c $3 $6 $9 +^9^1 +i0g +*34$0 +i6D +c $1 $9 $5 $1 +$5 $8 $8 +[ r +i56 i59 +$s $p $y +^0 ^4 ^1 +c $2 $1 $2 +D6 xA1 +o3f$o +c ^4 ^9 +x01 t +sSXsM!x65 +sdgo7a +*03 x12 +i58 i58 +K z1 +oA0x58x71 +Z2'B +$w $i $z +*32sJ. +*72o0e +^2^9 +d '7 $1 +i9u +o1R +$5 $2 $2 +x8Ax03 +*72$0 +$a $s $k +i3H l +xA1xBA +RBi6o +i3Ll +x1BxB4*23 +sE/supT3 +$6 $3 $3 +x41*01 +^^ u +x97sau +^8 ^5 ^9 ^1 +-8-A +$1 $9 $6 $9 +xA1,6 +l $8 +x28T2*58 +^8 ^1 ^0 +i5d i5e +^6 ^5 ^5 +s}t*91$2 ++7-A +]*14 +'8*1AxB1 +^3^9^9^1 +o3rsQ) +o0u ++1+9 +-4iAlsF} +c ^9 ^8 +^3 ^6 ^9 ^1 +i8u +i34 i31 +x87o3ax13 +c ^4 ^3 ^2 ^1 +o9pstE +} ssO +o0AT8x19 +]]]]]]] +$6 $2 $2 +-Ai61 +s*Nl +i93 +rt +[s[RK +*20 l +xA4o91 +k{ +]]c +xAB*02 +$b $u $m +x96D1 +s39.7 +*B4K +Y1x8A,8 +s38s}6 +$6*3A +K D7 +,3su) +o4Y +$2 $1 $2 +^6 ^5 ^1 +xABx23y3 +i4p +R6*17 +$5 xB1 xB1 +[ [ [ $1 +u d '9 $3 +x12TB +$8 $5 $2 +*49+5oA? +x9B*9A +$d $3 +^e ^w +^0 ^6 ^9 ^1 +o9r +i6~ +^x$xl +i0M +EKx45 ++7+A +$f $a $t +i06 i12 +oAu +i35 i32 +*54 x84 +^0 ^2 ^0 +c T6 T2 T4 +E*B7*34 +$9 Z1 +x08Z4 +c $1 $9 $4 $5 +$m*24 +]^u +c T2 T4 T6 +*68Y4oBb +*83Z1.5 +sC_*21sY! +$b $u $r +sjO*32 +c T4 T2 T6 +o42 +x72Z1 +x14 p1 c +iB3$w +'A $7 +s`Uo2i +c T2 T6 T4 +c T6 T4 T2 +o4lD6 +*9A*65*34 +c T4 T6 T2 +$E $d +$r $i $m +$l $i $e +^UsmV[ +*49x27 +i09 i13 +c $8 $0 $0 +$c $o $o +x38Y5t +,2i9E +*05 x03 d +u $_ +o7?x45 ++2sAW +i0s i1h +u 'B $1 +D1 ^s +-0 -1 -1 +{ *69 +-9lsQu +o8a +s47 +*21oB_ +$d $6 +$r $e $v +^t.0 +i8s x82 +$t $i $e +i04 i19 +C $9 $6 +*A3sc3x43 +o2o*B7 +^7 ^4 ^1 +i54 i53 +*B8o7! +c $e $1 +i51 i53 +-4+8 +c ^5 ^9 +tKx6A +^1 ^5 ^5 +$H l +y5 x47 +{ y2 +tK +o4? +$0 $7 $7 +x02 ^w +^0 ^5 ^1 +o9i*32 +s57 +x56sZIo53 ++1 [ +[ $1 [ [ +c $0 ^0 +[ [ $1 [ +x72 ] +$e $g $o +u d '8 $3 +-9 -A -A +Y5x63*98 +*A5*72 +^9 ^4 ^9 ^1 +x63{ ++0x73D6 +-6x89soh +^5^5 +c ^0 $0 +^2 ^5 ^5 +[[[[[[[ +x9A s9^ Y2 +s/z-5 +xB1xB6*B3 +i41 i59 i69 i75 +T8^f +$0 $0 $6 +o2O +s_++8sD@ +i02 i10 i21 i30 +$r $o $b ++2-0 +KD7{ +o6s +^6 ^4 ^9 ^1 +.2*B6 +^0 ^4 ^9 ^1 +] $t +'B $e +] $i $n $g +x35 u +i8t +o11D7sDW +y1x04*2B +.6*B6*16 +[ ^L l +r $0 $2 +^3 ^4 ^9 ^1 +-9i9n +^5 ^4 ^9 ^1 +^7 ^2 ^2 +x61 d ++BxA2 +^6 ^5 ^9 ^1 +lsaC +c $3 $4 $5 +*B8$6 +s+dsSZ$5 +x86*6Bx32 +$m $o $d +^4 ^4 ^9 ^1 +dx9A +^6 ^5 ^4 +^1 ^4 ^0 +]]]]]]]] +u*3B$V +c $6 $2 $6 +] ^a ++7 *30 +$u $h +q ] $6 +o6# +x14^m +$vx73x93 ++5$y +^b ^2 +i26 p4 +o5I +i34 i32 +$d $9 +^8 ^2 ^1 +x61-8 +Z1sN6 +y2x14 +-0+9 ++5s7N +ExA1 +i51 i69 i78 i89 +xB2x19p2 +$9 $4 $4 +xA8^3x87 +cx83 +c $4 $m $e +]x34 +sp*Y3xB2 +^6^9 +*B1*47 +x32o2.xB6 +i1R l +D1 -1 +*A0 +$8 $7 $7 +s[0+6 +s10 +i1f i1a +^a ^n +*36Y3 +*7A +$7 $5 $3 +^2 ^5 ^9 ^1 +i50 i59 +s%O+B +swDZ2 ++0 D2 +i7i +^9 ^0 ^8 +i6H*80u +^2 ^b +o8w +o9rxA4 +xA7x32^t +-2*23 +c $- $1 +sC!DA +^4^9 +$Ys_;*49 +o2P +i07 i13 +$0 $8 $8 +*01x58 +Z1 R3 +*76 x52 +x71 $1 ++B-C +c^0^2^4 +C $0 $9 +^t ^s +x41*56 +^3 ^0 ^0 +*12 { $g ++6 *16 +i7p +^2 ^0 ^0 +'7xB3Y2 +s0bx83seu +$8 $6 $6 +$p $a $s +Y5E +^2 ^0 ^5 +*0A +R5iA{-5 +$1 $9 $8 $1 +T4siUx5A +i3a i3b +o9@k +^2 ^4 ^9 ^1 +o4D +i99y2 +$0 $1 $3 +s\J$h +-1+7 +DBs6& +^7 ^3 ^1 +s n$Hi9O ++0 +2 +1 +3 ++6 -7 -7 +^8 ^2 ^2 +i5N l +D1 D0 +o5v ++0 +1 +3 +2 +$2 $7 $7 +o26D2$4 +^a ^p ++0 +3 +2 +1 +i8o ++0 -8 +^N l +iB7 +y4'8sB3 ++0 +2 +3 +1 +$0 $9 $5 +^3 ^5 ^5 +$2 $1 $4 ++0 +1 +2 +3 +y4x48k +c.2 ++0 +3 +1 +2 +*21x2B +^t x14 +Y1y1 +$b $a $d +^7 ^5 ^9 ^1 +$1 D3 +i6h'3R0 +sFI$I +x57*7B+1 +oB4 +*7ACs;y +i7\ +TAo3t +o6VT1 +i4j +-6 -9 +i51 i69 i79 i83 +} Z5 +x25*79 +x8B*84T2 +'9x37s,7 +^0^9 +o8;o0T +s17x61 +c ^5 ^4 +D4*85E +c R1 +ExA9sU_ +T1i5ec +i4jx23c +^1 ^9 ^9 +o4E l +TAx83 +$4 $0 $0 $0 ++2-8 +sLM +c $7 $0 $0 +c 'C $1 +D3 o0T +i55 i59 +l $! +sK+^* +xA4sf,.2 +$_ $9 $6 +K-6 +saS +*75*90x85 +^[ +$d $f +i3d i3e +$_x2B +i51 i69 i79 i80 +syj +o3yx71 +sh@D9 +$1 $2 $4 +l [ ^B +^4 ^6 ^9 ^1 +^2 ^6 ^0 +] } +soAl +xB3o6a +*91$@D7 +ElLB +^7 ^4 ^9 ^1 +sPB ++B+C +$3 $1 $6 +{ L1 ++4svE +*0Ay2 +^o ^s +p1x05 +^5 ^9 ^0 +^6^1 +y5 x73 E +o2Bc +Y1x35 +^9 ^0 ^0 +sYdz1o59 +x35*71*26 +*32x6B +o4loBU +x36*9Ad +^p x12 +o5m +[ k +y5 E x73 +i52 i53 +D2 D3 +$f $i $n +r $7 $7 +C $2 $5 +-Ak +{ x47 +DA D5 +*7A,9+0 +i8n +x91x87$" +$s $h $e +p4 $u +xB3*43 +$j $a $r +^3 ^c +,3sxz +^6 ^5 ^0 ++0 +A +$e x02 +o5A l +$d $8 +D4*12 +^1 ^1 ^4 +i3a i3c +l $. $c $o $m +^3 ^2 ^0 +x86.Br +$r $a $g +x92s?y +^i ^m +$3 $8 $8 +x54-5 +xA6*13 +s89 +$1 $3 $2 +^6^5 +s4t*30*6B +x84l*09 +o3? +i6 oBEs?, +$8 $2 $2 +*82 +$| +^e ^A +l ^e ^e ^r ^f +x64sis ++3 +8 +^K i1e +*61$isen +xA7i64*93 +i30 i32 +D0EZ2 +-6-9 +c$1$2$3 +s]>*73 +L8x45i8s +C $9 $8 +o6_s!-ss" +x94+B +$c $o $p +x81*12 +x9AZ5x58 ++1-8 +sJ"^J +o0s x31 +$M ^m +^5 ^6 ^9 ^1 +*82-7oBp +Z1i3c +$e p2 +c ^4 ^0 +y1s%rc +-2*34y4 +*49$A +i5R D1 x27 +Y1*7Bs[b +Ks " +x02sGh +T1x56*A1 +$3 $4 $4 +s2x*47$j +*42,A +c $5 $6 $7 +^P x12 +'6 $8 +d '9 $1 +*54s;coAz +o0pZ1 +*71^m^b +soP^Y +$7 $3 $3 +*78 x62 +l $1 $9 +^8 ^1 ^5 +-Ac*B7 +xA5$2sD3 +o4i x31 +o2W +o1h +0 +i6m +s34 +.4c ++7*84 +c $1 $9 $5 $8 +,3 +3 +r d +i8E +DAx61Y1 +i1u +^0 ^3 ^0 +o0s ^S +Z3 ] +o1T +$m $a $y +x01$2 +o0H l +*B0x83 +oASx57 +x31 x05 +D2*8A$- +x04s&h +-A -C +$8 $4 $4 ++5 +6 +7 +s35 +x52 -4 +-4-8 +spF +-1-5 +$r $u $m +^1 ^3 ^3 +c $9 $9 $8 ++5 +7 +6 +$2 $1 $5 +o0! +Y5fxA1 +i5& +^4 ^5 ^1 +t D9 +0 +D8*12 +D0K +^1 ^6 ^9 ^1 ++1 +2 +3 +i6& +i10 i10 +Z1x47 +t +0 D9 +Z3x23 +x76EDB ++1 +3 +2 +x12L8 +$r $e $p +x16 k +x62iA{ +^ ^1 +*30,7*5B +-3+8 +-2*92 +xA3oB_ +c$3$9 +$p $o $l +i53 i59 +K Z3 +'A $e +x52x19o7b +c ^1 ^9 +^8 ^0 ^5 +o8)+4x7A +R4D2 +c i01 i11 +^2^9^9^1 +o1j +$1 $2 $6 ++2 *02 +$1 $0 $2 +^4 ^1 ^5 +$9 l +y1l+0 +i0a i1l i2l +o0m +0 +$1 $0 $5 +x02 D5 +DB] +i4h *45 +i7' +$9 $7 $7 +i37 i31 +c $1 $1 $! $! +^1^3 +[ x31 +*65x47 +u d '9 $6 +^1 ^4 ^9 ^1 +D7xA9 +sj;*56 +$r $a $n $k ++7s$k*0A +c $! +^6 ^1 ^9 +^6 ^8 ^9 +c $2 $0 $1 $4 +s/xiB! +^3 ^0 ^5 +u $a +-3s+W +-2D3 ++7 -0 +i6d +i57 i50 +*2AY2 +s7Mo5ssx9 +[x37y4 +$r d +kswn +p3 ] +s)o^5oB3 +^8 ^6 ^0 +$s D7 +-9+B +c $2 $2 $0 ++7 +9 +9 +-B T0 +o5asEJsMU +x58Y4sG= +$d $4 ++7 -6 -6 +$8 $5 $5 +coAb +*12s\1'B +[*24 +o5rxB1 +$3 $7 $7 +xA8i2l +x48x47soa +sWSx63 +$t $h $o +x04 -1 +^9 ^7 ^0 +D1 +0 +i7h +^8 ^8 ^9 +p1 D5 +Y2x45 +sZM*23x75 +x93$o*65 +oAnx26,0 +$s $o $s +o8k +o01 +x91 c +i5L l +^5 ^5 ^9 ^1 +$w $a $g +sKf*7B+6 +sCki0S +K*38E +sG6o83 +ud*61 +Z1TB +o64D7L9 +$2 $9 $5 +C*0A*A2 ++1s'] +xBA{y4 +o2pxA1s*B +u 'B $9 +o09 +o0g x36 +o4yx0B +c '6 $1 +^5^3 +i3<.3 +sP-*12 +i50 i53 +o0ToB\ +i6f +oAa +svpx74xA4 +x31+9 +$0 $4 $4 +$_ $9 $5 +i57 i59 +i50 i70 +$b $o $o $k +sz9i3w +c $2 $5 $8 +i6% +x57s5? +c $3 $3 $7 +C $1 $6 +y2 x54 +$t $a $t +$3 $1 $5 +$7 $5 $5 +*49x95i97 +sep ++5+9 +$2 $A +D4 D7 +*74x54sSc +r $3 $3 +[ D5 +$.xA1 +p1*68 +x91 +0 +*20 +2 +$0 -B +o0WT6 +i8h +} y2 $d +} x51 +k -9 +$1 $4 $5 +D0cx31 +T5R8sz< +^u ^e +siDx32 +c $3 $5 $7 ++7 -2 +xB6x56 +} x08 p3 +s5}x73E +s)Dx65s2? +^d ^4 +} $d y2 +^8 ^4 ^9 ^1 +o9z +$t $r $y +x76.BsPT +*60 x21 +*21sd] +$n $i $x +$8 $0 $8 +.1 k +iBM'4Y4 +o10o8$ +{ Z2 ++3 -1 -1 +KoBq+0 +i56 i55 +^2 ^3 ^0 +$h [ +tx12 +o1p +xB3o1ax5A +i51 i69 i79 i86 +$1 $0 $8 +E '8 +c$4$8 +]i3k +r $5 $5 +x14*61 +i3a i1a +i4v +$3 $1 $3 +x61 E +s1o +^. ^1 +u d '8 $6 +^4^4 +] $x +x01x13 +x32*38 +i2x ++6 -1 +o4$ t +$7o9'skd +i4x +^8^0 +$g $e $m +*B4E,7 +x04*A3,B +^l ] +^9 ^5 ^1 +o4S l ++5s{/ +*79s!8i64 +x23o9< +x5A k +,5o8C +D8.4 +$d $o $g +c*92] +^m x12 +$7 $9 $9 +^D i1j +D5*76.5 +c $0 $0 $6 +^8 ^3 ^0 +x2Bsy{x35 +sca +c ^7 ^9 +^3 ^7 ^0 +*ABx45 +Ko7K*29 +^2 ^2 ^0 +o4p +o6w +x19o1o +u $9 $4 $4 +oA7sCq +$f $o $r $m $s ++6 +7 +7 ++1 +3 +3 +^h ^P +*43*B2*0A +^1 ^3 ^0 +$5 $3 $3 ++3 -5 -5 +o0p$xsfc +x74x34 +o9$ +s{^x09 +i2o +i8l +^9^2 +*28.2 +^2 ^6 ^9 ^1 +i5a i71 +t x91 +$J $b +D3 +2 +^0^0^0^2 +*58s!O*5A +[^K +Z2i2%x13 +s0z +^8 ^7 ^9 +x03Z2 +$7 $9 $5 +s2ao1i +cZ1 +'8 -3 +i2jx03 +^6 ^1 ^4 +c $7 $4 $1 +^2 ^c +$HxB9*3A +o2C K ++0 +8 +i38 i30 +$5 $1 $0 +x4B+A +u d '8 $9 +sQP$s +D1x3A +o0r x21 +-7 -9 -9 +^9 ^5 ^5 +x42 z3 +o7p +sCyp1 +$tssu +^$ +*31.9 ++8 +8 -9 +TAx6B +^C o1a +$9 $5 $5 +oAy +$7 [ +s^0o41 +$4 $9 $5 +*34 x12 +xA2s6.s&% +R8$l +x94i0j +-2 -7 +$z $i $p ++8 -9 +8 +x54 $6 +*B7*19*32 +dx2A +$9 $9 $8 +*3Ao1k +c ^4 ^3 +i40 +sbex03$7 +^0 ^7 ^1 +D7 t +R5-A*01 +o6t +x47T8o7E +C [ +*60x15 +sjK*70 +xA4x1B +$2 $5 $6 +x3A^x +*A9T7$3 +x76x94 +C]C +c K +${o8p +] $d +x5As59 +i56 i56 +oAYR7 +c 'C $5 +y5x5A +i1c i1e +$2 $5 $0 +[ i0x +s3^,6 ++7*A9 +r} +^ri9y +x98q +i3. *32 +x54*9BxAB +l [ ^R +c $7 $1 $1 +ss! +o4b +$e $e $l +x57$*LB +c $6 $7 $8 +i7vr ++8 -7 +8 +ls6k+9 +c $5 $0 $5 +r $6 $6 +K +5 +*23-0x41 +Y3TB ++8 +8 -7 +o7c$8 +D5 ] +x14x32s`v +i0o ^N +iB. +i51 i71 +x97i92 +i31 i71 +iBKsK[o0p +c $6 $5 $4 +^8 ^3 ^1 +x53s2> +T6p4 +xA7$5.9 +o6r +^6 ^3 ^2 +^( $) +se|].6 +T3*1A +,5E +$a $h $a +s$O*26i7t +Y1+5 +o0GT5l +*65 x42 +s?Di3o +iD- +i56 i50 +$w $i $t +^5 ^6 ^0 +y4x82 +R9x94 +^9 ^8 ^7 +x42$4 +$0 $1 $7 +i2T l +$9 $5 $1 +x91 $0 +c ^2 ^9 +} x04 ++7 -9 -9 +^9 ^3 ^2 +x72 { +i35 i31 +i7& +Z1 *74 +}o0v +$c $b +[ [ [ c +x63Z1 +c $9 $9 $0 +-0}iBN +*84 k +l T5 +i56 i52 +^2 ^2 ^2 +$4 $7 $7 +^7 ^8 ^1 +$s $u $i $t +c $8 $5 $2 +i5i u +^3 ^a ++9 +9 -8 ++9 -8 +9 +d '8 $8 +.3y4'8 +$1$9$6$0 +o5LT3 +c ^0 ^2 ^4 +$+$- +$3 $0 $3 +sIqTA'9 +$j $u $n $k +^7 ^7 ^0 +^9^8 +u d 'A +Kx21 +oB9 +*45x38c +o7I +sau +p5o5e +i47 +u 'C $4 +i38 i39 +c $2 $4 $7 +sg5kr +*8B] +.1spmi8& +i1a i5a +x82skJ +i58 i50 +x45x23 +$1 $9 $7 $8 +c $1 $8 $7 +{ Y3 +-BxB2 +z2 c +iA@ +x23oA( +-5 -9 +^1 ^3 ^1 ++4 +8 +l [ ^S +$9 $9 $7 ++3sE3 +$h $u $g +l $2 $3 +^4 ^5 ^5 +^2^3 +*03 *34 x12 +^7^3 +o07 +i4a x52 +EiB7 +c sa4 +,4x6Bsb2 +$r $o $t +$1 $9 $0 +c*68K +o0G +c '6 $8 +s'?T7 +c $9 $9 $7 +$1 $1 $9 +oBko3i +s"S+6K +i7d i7a +^c ^B +*A0*45{ +i00 i17 +i5c i5a +sXV$4 +s3SR0 +{ R3 +l [ ^K +i58 i57 +i8m i9e +se0T2s+T +o5w +*89sN- +C $2 $4 +$u $r $n +c 'A $7 +x54x53t +*51 ] +i0B +o3p +^4 ^1 ^2 +C $9 $7 +l+9 +x31 ] +D1 D4 +sk)*B8-2 +l [ ^A +$r $i $d +x98i63 +Y1 x12 y2 +$4 $3 $3 +^5^4 +^7 ^0 ^5 +^0 ^3 ^2 +i5wp2 +$1 $0 $4 +i37 i32 +i9_ x74 +^7 ^6 ^0 +s2. +-6.2 +c ^0 ^5 +*56D2x41 +k *94 +f s0! +sq+o2bsD& +C +7 x02 +^7 ^9 ^0 +*9AxB2 +$1 $3 $0 +$5 $4 $3 $2 $1 +co41 +-2-8 +iA? +^4 ^0 ^0 +i3y +*46$R*A0 +i54 i59 +i52 i55 +x83 $! +^5^9 +^9 ^0 ^5 +D0 $t +T8 $1 +i7a i7c +$1 +B +i3Ics.r +xB6sPNDB +^0^1^0^2 +*B2^h +]xB1y1 +-9-B +$0 $2 $0 +*67 x16 +{ ^r +o6_D5 +$A ^a ++Bs9B +[ o1y +^8^7 +c ^1 ^9 ^9 ^1 +$8 $0 $0 $0 +i59 i58 +s[,o0h +x41*36 +$9 $3 $3 +^6 ^0 ^5 +x42{ +^6^8 +-1 -3 -3 +^a x12 +x32+2 +t x41 +s%|*20D0 +]}.8 +^b z1 +-3 -0 +oA. +c $2 $2 $5 +sDL +] spr +^4 ^3 ^2 +^2^8 +o9n +*9Ax74sTl +u 'C $2 +x02 D3 +o4v +o1B +$-$_ +x89$0 +o5* +i36 i32 +y5x24 +D0 D8 +$s $a $t +^a ^t +x03 +0 +$l $o $p +c ^6 ^9 +i1e i3e +[ o1o +x71s9U +^9 ^6 ^3 +i8bx63 +x13i9A +o5r*94 +o7@*B7x58 +^3 ^5 ^1 +^4 ^9 ^0 +l*41 +.6K[ +s#u*97 +o80sy3 +^H*0B +shZ+1 +-2 x32 +]y5 +'A $9 +i51 i69 i79 i81 +C $1 $8 +y1u +xB5oAqY3 +$3 $3 $7 +$l $a $p +-0 *31 +^J D6 +^soAlx82 +o5C l +i9@ +$8 $9 $5 +$0 $2 $1 +T0 -0 +$1 $5 $4 +c $l +$6 $7 $7 +{ y1 i5n +x81+8xB6 ++C +E ++0 *12 +c $1 $9 $5 $7 +oA8 +c $1 $9 $5 $6 +$l $i $t +s4sT0o68 +^0 ^5 ^5 +c $1 $1 $8 +[ ^R +^3 ^0 ^2 +o1L D4 +o2g +-B+C +sHoy5 +'8p1 +-3-8 +^0^8 +$b $o $w +o5# +i4E l +o3I +T6 T8 T7 +$1 $0 $9 +x35x17 +$f $a $r +E ^( +T6 T7 T8 +sIYx42 +^9 ^1 ^6 +$1 $9 $7 $4 +i2s x02 +x6B*16o7I +$l $a $g +s/4*43 +^0 ^5 ^2 +^5 ^4 ^1 +*70+1 +x04*20 +*59*02o0R +K *7A DA +Y2D7 +$0 $1 $4 +i3e i3c +$2 $0 $2 +-9Z1 +^4 ^3 ^3 +s23 +^2^4 +x4Bk +x63]y5 +x63 x14 +^9^5 +iBi ++6 +9 +x03*89 +^3 ^b +$ssXu +iA2 l +{ o5& +^0 ^6 ^6 +^5 ^3 ^3 +o3O l +^4 ^0 ^6 +c ^2 ^3 +o9i +D6E +$,$, +$o $d $d +$u [ +*45T4L9 +*B7-1 +i41x24TB +x3Bx2A*43 +$0 $6 $6 +l $0 $1 +x81 x06 +^3 ^e +*54x75x0B +^2i9F*36 +^2 ^d ++0 -9 +'8 $6 +} C ^A +i3Y l +*96t +^4 ^a +o5B l +o9p +y2x64 +x71 o6s +i07x83T0 +^2^7 +z5 ^q x08 +o2x +$M l +i8Kx42 ++3 +4 +5 +o3S l +^1 ^5 ^0 ++3 +5 +4 +$` u +^5 ^0 ^3 +i0n i1a +i5e i71 +*30o6, +i3+ +]Y2sRE +^3 ^3 ^1 ++3+9 ++9 -6 +^9 ^0 ^2 +o0x*86 +u 'C $8 +[ t D0 +x6B [ +o1noAV +*75o72 +u $5 $4 $5 +$7 $6 $6 ++C +C +C +s0W +x04x07k +k ^s +x86*02 +sS]x23 +i9l +.5x27*6A +z1x21 +i2r x01 +D8x53 +*13x3A*A8 +o58 K +c $0 $1 $0 $0 +^6 ^0 ^2 +x41i0j*83 +^2 ^e +$i $m $p +^3 ^d +$w $e $n +[ D0 t +^4 ^2 ^3 +i82 i90 iA0 iB3 +i4q +^6 ^3 ^3 +$0 $9 $0 +D7 D8 +x82 'A +c ^' +o05sv} +-1+8 +c 'A $0 +Y3x5B +slt +^1^6 +'Q +*6A+2 +i60xA1 +$a $n $y +$0 $1 $9 +[ Z4 +-3 +2 +^5^8 +i5e i5c +*83s%0K +k E +T1 ] +^4 ^e ++0 x12 +KY4x83 +-3*91 +u 'C $0 +^2 ^1 ^3 +$2 $2 $3 +$5 $1 $5 +sx,sszo9M +i48 +$m $u $m +i3L l +^8 ^2 ^3 +$o $a $k +.3*3B ++2 -1 -1 +xABx07 +$. l +*60ssz$R +$d $0 +o6SsLR +c $1 $9 $4 $9 ++1 -3 -3 +x13Z3 +^2 ^3 ^3 +} p2 +scs +x31 o0t +-Ao2b +x7Acx34 +y5x08 +$1$9$6$2 ++7 Z2 +^i ^s +i82 i90 iA1 iB2 +-2 [ +Eo6ismo +o6I +i4L +$c $o $x ++7 -1 +^4 ^b +o0Q +i9n +$v $s +*84-4.9 +D2x41 +*59i4dsYz +xA1 ] +i6S +s5cY1y1 +.2sJN +^9^3 +$1 $. +o2K +i3& +i4N +$a $g $o +E ,2 ++0 -A +Z1tx94 +$s $a $p +$! $1 +^4^3 +i36 i36 +$. p1 +i0W +c $9 $6 $3 +i1_ +*85-4 +x26*6BsO' +x61sj\x63 +sp-p2sTe +*10x54 +o0e ^K l +o5O +.5^u +$0 $8 $0 +D2x46 +[ o0l ++6o0l} +]{r +x42x83 +i32 i30 ++2 D3 +*92sz}i7e +$2 $0 $4 +x8A$q +d d +sxts"p +x71C ++3 -9 +*43*A9 +^4 ^0 ^5 ++8 +9 +8 ++8 +8 +9 +i00 i12 +^0 ^1 ^9 +$2i70 +x31*95*76 +^8 ^0 ^8 +^0^6 +x95 i9y x95 +o2IT5 +^N +4 +c $2 $4 $2 +o7E +c $0 $9 $0 +c $9 $8 $9 +c $1 $2 $0 +$l $a $d +c $6 $9 $6 +$1$1$7 +,4x9B +[ o0d +i6u +x97i4ax31 +o92slGsdO +$7 Z1 +Es\m +c $@ $2 +$2 $0 $9 +$1 $a +^5 ^0 ^8 +i58 i52 +i51 i70 +^3^9 +^9 ^9 ^0 +T9*97 +i38 i32 ++0+A +s)S*A1C +] *86 +$6 $9 $5 +^5 ^1 ^0 +uZ4x48 +sok$p +^1 ^0 ^2 +$h $a $s +$u $g $h ++B $3 +c ^8 ^9 ^9 ^1 +*78sYQ +x68$ri8U +sG)iA7 +i61Y1E +CT9 +R0-9 +x36*93i42 +s28*23 +*15*05*5A +sh2 +$d $5 +^3 ^6 ^1 +y4oB= +$2 $4 $6 +$2 $3 $0 +$e $l +x0Asz\D3 ++5 +9 +i25 +$1 [ +^1 ^8 ^1 +^d ^2 +iB0 +i1w +s07 +o4x +$1 $5 $6 +d '3 +$b $u $t +l [ ^J +$1 $9 $7 $6 +o5o*4Ax8B +x63Y5 +i9o +^2 ^8 ^9 +x03sb' +x47^7 +$l $e $g +$l $e $a +$t $u $n +^0 ^2 ^3 +} ^- +^R l +^0 ^1 ^3 +i36 i31 +y1 +0 +o4y*2B-7 +^s ^L +c T1 +o1Y +o8# +s<|+6 +sx[D9 +i8I l +x2AK[ +o3A +^x^X^x$x$X$xl +usRPT5 +*78 u r +$m sms +*87x9B$4 +i1a i3e +^9 ^3 ^1 +*78 r u +$2 $2 $1 +$3 $0 $5 +*01x06 +^w ^M +^4^5 +-1 D0 +^5 ^7 ^1 +c ^5 ^0 +c $2 $0 $2 +$@R7 +$3 $2 $0 +s#|x82l +o8y +s_XZ1 +$0 $3 $1 +^4 ^7 ^9 +^DsEU +*0B-5 +Y3sv$'7 +] $z +i5e i5b +c $4 $1 $1 +o5G +oA<'Bx14 +s"2*35 ++0 +1 +1 +xBA*46y4 +'8 $5 +$1 $8 $0 +^0 ^9 ^1 +} x84 +u 'C $5 +$q $u $a +$9 $8 $6 +C $4 $5 +$7 $6 $5 +i0Mx3A +^8 ^5 ^2 +x08xB2 +R0*A7 +$/ t +s-vi3i +$2 $1 $7 +i0d i1r +x23Z2 +x65x61 +t ^B +o3H K +o7U x01 +R9Y1 +o8D +$1$9$6$1 +,2sNC*4A +oAy[ +s30 +x15 u +*12 x31 +$d $i $g +o8E +o1m +C r +-0-9 +iB3 +D4*17 +scl,9 +iAi ++9xB7 +sL1 +$2 $0 $3 +$4 $e +x21r+3 +c-9scD +c i51 +sb%x28 +'9 u +$i $l $k +$3 $2 $3 +$7 $4 $4 +*2Bo4h+7 ++3 +9 +l $1 $3 +i4m[ +^8 ^8 ^0 +xA2$_x25 +^9^0 +$d $i $s +su? +i7f^4x35 +i6$ +o8M +x65*15 +^3 ^9 ^6 +^8^6 +$b $u $t $t $s +sbx +c o11 +*52 R0 +oBJD5x45 +R0 ] +$#$$ +o2M +c $1 $5 $0 +^8 ^7 ^0 +x02 $n +*92x26$v +$1 $0 $6 +*28 +^psHf +*B8.7sJu +$2 $0 $6 +o43o6% +$1 ^@ +*45*7A +oB1 +x05 p5 +C $0 $7 +y2R8 +'B $4 +k $M +^5 ^2 ^4 +o5L +^0 ^6 ^1 +*67s1. +{ ^O +s4V +$6x64 +x72*61*12 +] ] ] c +$8 Y1 +] ] c ] +i85 +^4 ^6 ^6 +i9`D1xB1 +ty5o5' +*49*4Ax36 +u 'C $7 +^8 ^3 ^3 +c $2 $1 $1 ++7 +7 -8 +xA6$5*18 +^6 ^8 ^7 ++7 -8 +7 +i60 x57 +^2^6 +Z2sD{*62 +D0 -3 +DAxA9s7D +$1 $2 $7 +c $2 $3 $2 +*25*03 +o3i*8B +*53sko +i97l +i1e i5e +c $8 $9 $0 +] c ] ] ++B^u*A1 +i7d i7e +o47 +$bx0Bs3G +^r ^e ^p +s$.i5asF0 +*27se5 +x02 $s ++6 -9 +i8>Ex95 +^EEs$' +x61 $4 +k +2 +Y2Y2 +x18,Bq +}ui9@ +]]]c +^r ^P +^8^5 +sH*$iR7 +i55 o5i +C $0 $8 +x73*04 +$f $x +i54 i50 +$0 Y1 +i52 i72 +T8*9Ax57 +x63*A5 +.9*79 +i5c i5e +^1 ^0 ^5 +^4 ^3 ^1 +DB+1[ +i38 i37 +$s $u $e +^4 ^4 ^9 +] E +qsRsx65 +$3 $9 $5 +'8 x14 +i7! +$5 $1 $8 +$0 $2 $5 +$4 $1 $4 +Z1x36 +*A9spR +r $0 $0 +lo9h ++2 +9 +c ^7 ^9 ^9 ^1 +KiA+ +*27 x15 +$g $a $p +D0 $Q +.0 *15 +x64o3e +$2 $3 $2 +*A3x62x03 ++Bo0Z +o1J[ +$1 $6 $0 +$1 $3 $4 +$h $a $d +slu,2 +si' +x09 r +x72 K +x73x0A +c $1 $3 $5 +o9o K +$&$& +$7 $0 $7 +i8A +u $4 $2 $0 +$w $h $o +$vE +$s $a $w +o2E +}t+9 +*58+2 +} x72 +o0u k +^d ^i ^m +^9 ^5 ^0 +^1 ^5 ^2 +^6^3 +x31 [ +*8Br +xA7i2l +o9e +x74xA5 +^9 ^7 ^2 +s0A +$2 $1 $6 +i7A +y4 o8A +K x53 +sF[$2 +i3c i3e +*23x3B +$@$! +o1o D4 +i82 i90 iA0 iB7 +$1 $7 $0 +o15 +xB6o5yx4B +o5p +$3 $1 $7 +^8 ^5 ^5 +i8" +*5B*31 +*B6-5] +x53o5|Y5 +$1shW[ +s02 +svFx62 +$8 $3 $3 +$2 $3 $5 +x59^A +$5 $6 $4 +u 'B +.8$&s[# +^7 ^5 ^1 +*86*B6 +^1 ^6 ^6 +c $7 $4 $7 +c $1 $9 $5 $4 +*83Z2-9 +'Bkx78 +i38 i31 +$1 $7 $8 +i52 i71 +xB6i7- +x32 +2 +CsmH +x87*B7o65 +*37o5l +x91D6 +*5B-2o8z +i51 i59 +$2 $0 $7 +i79 i52 +iA.l+6 +$9 $8 $0 +$B $e +$S c +^8^3 +x35l +x65csVU +o0Ox02 +i5w +^1^9^9^1 +RB.1c +^yo71 +^1^7 +x12*0Br +xA9'6i8i +^4 E +DB x71 +$ax97 +^t x12 +l T1 +y3x98 +x46,5 +$p $e $a $r +s gx34sM3 +l [ ^P +i0g i1o +T3 T2 +l $! $! $! +^0 ^4 ^2 +-8 -9 -8 +}Y4 +cx32+9 +-8 -8 -9 +.9*A3$) +^ex58 +c i41 +-0 -3 -3 +$8 $1 $2 +K L9 +$g $i $n +sU]x02.3 +^2 ^1 ^5 +^2 ^1 $3 $4 +d Y4 +i31 i42 i53 +o0r ^b +x95lx96 +$[$] +Cs@ZsH* +x39s)r*79 +} x94 k +c $6 $6 $6 $! +*A4su8 +^5 ^9 ^1 +i4a*50 +$e x93 +i2o x01 +$a $i $m +oAP-2sp% +i39 i30 +^2 $3 ^1 $4 +x15Y1s}T +^2 $3 $4 ^1 +} k x94 ++0 x42 +^7^6 +i4ns%8 +sDUKD2 +*43'9 +$5 $4 $6 +C $2 $0 +xB5*8Bu +'AD3Y1 +TBx93 +Z1 i0J +} $` +^4 ^3 ^0 +i5z +$e $o $n +^1^0^0^2 +s03 ++D -B +o7g +i9io6a +o22 E +^l ^s +$r Z1 T6 +ks*hxB6 +^c ^r ^a ^M +i3r*0B +R0x5A +C *02 +D0 x71 +x51-8 +$=xB3] +o0$ +*30 x21 +*63 x42 +$c $o $t +c $1 $2 $3 $. +$3 $1 $0 +i3a i71 +o8GsgtoA2 +i3e i7e +$t $u $b ++8 -4 +^5 ^1 ^3 +^5 ^1 ^2 +o8t +$1 $3 $7 +y2-1 +x06 $$ +*45 x32 +i8y +$5 $3 $0 +'5x69 +C $6 +^9 ^3 ^3 +xB7o8f +$7 $1 $7 +s)j+Ay4 +o9w +$9*91*BA +i64 i73 i82 +$2 $2 $4 +s0m +i18 i19 +,5sp) +u Z1 +s5%*30$. +i52 i59 +i8A x63 +LBxA2 +*12*B1 +c o10 +$7 $1 $0 +i37 i30 +i7u x09 +^i *01 +c ^7 ^8 ++2 +4 +3 +i55 i50 +^l xA2 +l $0 $2 +*78.1x58 ++2 +3 +4 +cY5sG| +sN^.1 +*31 o3p +s^v-2-2 ++0 *31 +l ^r ^o ^f +s'ic+7 +o88spx*34 +-5 -6 -7 +sd1 +i3z +s37 +iBjD0 +o2msy= +^4 ^0 ^2 +$4 $1 $2 +^6 ^7 ^1 +i9* +-0o0D-6 +i0e i1l i2i +i50*86 +^3 ^0 ^3 +c$l +-4 -8 +Z1+5 +$ki7R +i7a i7a +$3 $2 $4 +$3 $2 $6 +-5 -7 -6 +o5=t +*70^G +^3 ^6 ^0 +C $9 $4 +loAmsQR +*BAx87se$ +c ^4 ^9 ^9 ^1 +*54s;Ms`p +^0 ^2 ^9 +c $7 $0 $7 +^5 ^0 ^2 +C $8 $9 +-7 -7 -8 +T0 T4 T3 T2 T1 +$4 $3 $2 +T0 T4 T1 T3 T2 +KT9 +$3 $1 $8 +E.5 +T0 T3 T4 T2 T1 +^8 ^1 ^2 +T0 T2 T1 T3 T4 +T0 T2 T4 T1 T3 +T0 T1 T2 T4 T3 +-3 -9 +$s $i $c +T0 T1 T4 T2 T3 +T0 T3 T2 T1 T4 +T0 T4 T2 T3 T1 +x2BD3 +^5 ^8 ^9 +Z3] +T0 T4 T2 T1 T3 +o9c +T0 T1 T3 T2 T4 +$1 $7 $1 +T0 T3 T1 T4 T2 +T0 T1 T3 T4 T2 +^9 ^2 ^3 +T0 T2 T1 T4 T3 +T0 T3 T2 T4 T1 +T0 T1 T2 T3 T4 +i35 i36 +T0 T2 T3 T1 T4 ++2 +8 +-7 -8 -7 +T2oA8 +iBgxA4 +T0 T4 T1 T2 T3 +T0 T3 T4 T1 T2 +T0 T2 T4 T3 T1 +$1 $4 $1 +T0 T3 T1 T2 T4 +T0 T4 T3 T1 T2 +$- c +T0 T1 T4 T3 T2 +d '9 $9 +i33 i30 +,3s.o +T0 T2 T3 T4 T1 +oABc +$5 $8 $7 +*35TB +i00 i16 ++9 -3 +Y5Y5 +s[=x25 +$-sbC +i34 i33 +$vo6A +]d +Y1'9x83 +$1 $5 $1 +$K sK1 $6 +$K $6 sK1 +$6 $1 $6 +$5 $8 $9 +^4^7 +^1^8 +^5^7 +^1 ^1 ^2 +$!$? +^r$9[ +$s $a $d +x97i50s]w +i52 i56 +i5b i5a +$s $e $a +$\ oBe +*86,5*1B +y2 *43 +[ y2 +x01 '9 +sgc +^5 ^4 ^3 ^2 ^1 +$1 Z3 +$e D8 +xA2x63 +s _ +o4S +i2s x32 +'7Z3 +[ $a +o2? +^j*50t +i11 i32 i53 i74 i95 +i69 E +$3 $3 $0 +c $6 $6 $7 +^2 ^4 ^0 +$1 $5 $3 ++6 x51 +s28 +o5A +$2 $2 $7 ++2 ^R +} $} +k o0c +xB9xA9 +{^ds52 +*B4x65 +x25x63xA4 +^5 ^0 ^9 +D1 z2 +T5*1BK +i72 i80 i90 iA7 +E,5 +x54Y5 +s53 ++2 -3 -3 +c $3 $1 $1 +*49^S +x8As\boA1 +c ^0 ^9 +$9 $1 $9 +[*04y1 +.2x72 +[ $4 +*2BR0 +s32 +$2 $0 $1 $0 $* +$9 $8 $5 +$0 $3 $0 +l T6 +$1 $8 $9 +} ,2 x46 +$5 Y1 +iA{t +c ^7 $7 +i5a i7a +$f $a $x +$8 $1 $0 +c ^2 $2 +^8 D1 +T0 D6 +c $7 ^7 +^7 ^a +$a $y $e +i1e i3d +p5 o5e +sgo +s68 +$p $a $w $n +i00 i19 +[] +]x06 +-8E +l [ ^D +*56$3 +*8B +c $2 ^2 +tiB]K +i1s +*59D0o5t +[ Y1 +,6 o1o +} x46 ,2 +^d ^C +$t $a $m +^9^7 +$1 l +^8 ^5 ^0 ++8x75-5 +u $s +i3e i3b +s,gD5 +xB7x73 +oA$o0j +i3a i5a +D0xA4K +c $1 $4 $1 +i5N +i34 i74 +sJ8,7xB6 +$1 $1 $! $! +[o0T +C $3 $4 +Z4x34 +i3@ +xB2^T +[ o0o +s'VdxA3 +]x16^h +*89*A5sS' +-0 *02 +c $1 $7 $1 +ucY5 +*20i7j +$<$> +^4 ^1 ^3 +-BsM.4i7( +i50 i54 +c ^0 ^4 +-1+4 +*06o8s$q +$y $a $k +$#x65xB6 +$4 $2 $5 +lx81 +$4 $1 $6 +*20o7?l +$2 $5 $9 +o8? x52 +$6 $5 $0 +$4 $4 $1 +$2 $4 $0 +$4 $m $e +*54xA5 +$0 $6 $0 +o6A +D6 $4 +o5' +$5 $5 $0 +$2 $5 $2 +^1 ^d +c$1$2$3$# +i00 i14 +-1oAi +i3nx42 +s%7i3n +$e $r $g +^0 ^5 ^9 +^0 ^8 ^9 +s]fZ1 +s`h]T1 +D3o3n +l ] $A +c $5 $1 $5 ++B -A -A +*8B*53 +^7^5 +$1 $9 $6 $7 +c ^6 ^8 +$2 $5 $7 +x46o7/s5^ +so"DB +^6 ^4 ^0 +s1=-As>^ +D1i4e +$2 $8 $2 +^3^4 +^0 ^0 ^6 +$1 $4 $8 +i9! l +sdt +*79 ^p +^5 ^6 ^6 +$3 $4 $7 +i5a *56 +u $b +-6sF( +x48i7T$H +i34 i30 +i56 i54 +i75 i55 +$5 $2 $6 +l $6 $9 +p1^Kx07 +x58*A2Y3 +c $1 $2 $2 +$e $m $s +] Z1 +$1 $3 $6 +*02 D3 +^3 ^4 ^2 +i62 i70 i80 i97 +D0R5 +s.a$q +^7 ^4 ^0 +c $5 $2 $5 +$a*79.3 +sf|lx23 +^2 ^1 ^9 +s#[o5A +^4 ^f +-C -C -C +o4}ELB +^6 ^2 ^5 +,0x68xA2 ++8+B +^9 ^0 ^9 +x41 E +*32s,\ +y3x62x2A +$4 $5 $2 +*02*3A +$u $p $s +$2 $7 $0 +{ $n +$9 $1 $8 +x91+A +$8 $0 $1 +i82oB% +$5 $1 $6 +$?$! +sy]y3s"? +$0 $1 $6 +T0,7x0B +-4 -6 -5 +u 'B $3 +$8 $2 $8 +i56 i57 +s^ho21 +i09-9 +-4 -5 -6 +c $x $1 +{*03 +sRex64 +$7 $1 $8 +ky1 +$8 $7 $6 +u [ +^e x12 +*21 *13 +st3x2A,A +l ] $o +,A^q +x42 E p3 ++6*7B +$g $u $t +x42 p3 E +$4 $8 $7 +^x^X$x$X +x72'Bl +x41 p5 +-2 -9 +$7 $9 $8 +i30 i35 +Y3 xA1 +$1 $2 $3 $@ +[ i1y +[ $2 +$9 $0 $7 +x15iA. +x98o0G +^5 ^c +^5 ^a +c si1 se3 +o7e +$9 $6 $9 +[ x21 +*67*B4 +$8 $0 $9 +$f $l $y $e $r +*7B*54 +$6 $6 $5 +*32o9o +r $2 $1 +oAMx8Ar +Kx59l +^2 ^3 ^2 +*24sE( +^7 ^3 ^3 +s/"*65x42 +$Y o62 +i0M i1a i2y +oBz +K,6 +Y3x07k +y2sEeE +i37 L3 +s71s}i ++8 -0 +i0E +^1 ^8 ^8 ++6 i5l +i0d +fiAD'7 ++5 swV +$4 +9 +c se3 si1 +x87i78iB) +$-iB,x96 +$5 $0 $3 +s-Ki9n$@ +s60 +i51 i73 +$0$0$7 +^7 ^5 ^3 +c d $3 +] x85 +i7c i7a +K ^a +$4 t +c $1 $5 $1 +*57c +d '8 $2 +c $1 $8 $2 +Y3] +*08i75 +$0 $6 $9 +[ [ c +o7wl,7 +-0 +3 +^5^6 +c $1 $9 $5 $2 +u ^X $X +T1 R8 +iAQ .A +^a ^1 +s73 ++0 i1l +i32 i34 +c $1 $9 $5 $3 +D1 +2 +o5L T3 +$9 $8 $4 +$a*30s/O +T5R7 +i73 i51 +x54$asKj +s#/^Mx69 +i3w +c $0 $1 $2 +$o $w $e +K*28*65 +$y $o $n +$1 $8 $6 +c $1 $2 $5 +i51 i58 +^0 ^1 ^4 +{ p2 +u $X ^X ++Bx65 +^7 ^5 ^7 +C $1 $7 +*6B-Bx72 +^9 ^2 ^5 +i5a i6n +x4B-3'A +i2A +*13 x12 +*4A +ssn +*A6x61*BA +^4 ^4 ^1 +x72f +o8@s&I*21 +^6 ^2 ^3 +$7 $2 $0 +d-4x18 +s]9Y1 +c $9 $5 $1 +$mo7[ +D4 x02 +$A*8B +i6n*5B +$5 $0 $6 +x23Y2 ++4 -8 +c $1 $9 $1 +$1 $8 $5 +$0 $5 $0 +$4 $2 $7 +x14cx19 +i71 i5e +l [ ^N +-1+5 +.7sY% +c d $0 +T4s3b +x25x67$u +^6 ^4 ^4 +i3a i1e ++8 -6 -6 +*35sI7 +Y2 K +x95x16.B +^8 ^5 ^1 +*61u +s52 +$6 $0 $0 $0 +s4n +^2 ^8 ^8 +t K +kx05x98 +$8 t +x21Z1 +x28x31Z1 +*A0x0B-6 +$x $x +c $2 $@ +o1m o0e +o3v +$8 $2 $0 +*82cx56 +x17 i2i +x13x07TB +$e $k $e +o0r o2k +*87s$C +i5e i5e +suhxA2K +c ^x $x +oAMx83 +o7Y l +i5i*B6 +i8j +^i ^n +o5i D4 +$-x4B*2A +$6 $1 $3 +s;?p5DA +iA\ +s=Xs&no0h +i0l i1a +$3*13 +sL!o67sJq +x4ADA +^7^4 +D2lTB +]D0 +$4 $7 $8 +.0.6*A5 +o04 +$4 $3 $1 +o8n +*02 [ +x12 o0p +$5 $6 $5 +$2$0$1$4 +[x64 +*31 x02 +$5 $8 $5 +sS&{ +i6Y +c $x ^x +$6 $0 $2 +$0 $7 $8 +$2 $8 $9 ++1 +8 +i49 +o3u D2 +KsjK +x82s$YsB# +c $4 $1 $4 +i4Sx45*2A +^6 ^4 ^2 +o3R +o5E +[ { +o5a D6 +r $9 $8 ++9 -7 -7 +c $1 $9 $9 +$1 $4 $6 +$1 $6 $1 +c $6 $1 $6 +^8 ^0 ^3 +o2N l +^8 ^4 ^1 +spm +sKF$ZsG] +*35R2 +^8 ^6 ^6 +stA*46 +^3^6 +ssl +oB$ +^7 ^5 ^5 +c*80+3 +tx56 +o1h [ +*20 o0l +$7 $7 $8 +sem +*B4xAB^9 +$b Y1 +$6 $1 $7 +iA%rR8 +*34*90 +i0' +$1 $9 $1 +$m $u $d +^6 ^0 ^0 +c $2 $2 $8 +x85,9 +s^KZ5E +^5 ^f +x71 c +C $9 $3 +.6E*68 +t *86 +T4*29 +^7 ^c +u d '7 $9 +ci3o +l*83 +-7 E +oAk*02 +^T'Bs#S +$l $i $b +]spH[ +^n i1d +$5 $2 $8 +,1+0 +x32l +x86 $d +s70 +E.8 +$4 $1 $8 +^0 ^3 ^9 +,4} +$0 $8 $6 +x6Ao59 +i7y +i2b +i6Z +x02 C +$4 $1 $3 +$1 $8 $1 +R1oA" +} x43 +$2 $0 $8 +i7c i8o +$4T7 +*05 *10 +sE8*37y2 +$b xA3 +*92iAs +o0fY1 +i3A +i2n [ +$n $a +o3M +^m x13 +sL!f +c ^5 ^9 ^9 ^1 +l ^i +^b x3B +o86 ++2 +3 +3 +oBs +$6 $0 $8 +] K +-9]s94 +p3 Y1 +x01 x82 +DA$" +C $1 $9 +x24 $3 +x36so$ +$=$) +y2 o0m +*90o6$ +i2v x01 +i0? +sEm*24^e +x82^D +} scP +.0x53 +i9A +D2 o0l +$6 $2 $0 +x52Y5x76 +$s $u $b +*B3-6 +i70 i52 +^2^0 +c $1 $5 $5 +$9 $2 $5 +l ] d +lx51 +$c [ +i39 i32 +^5 ^2 ^9 +} } d +^p *12 +.0s+.z1 +^6 ^1 ^2 +-3 -1 +s0* +c $1 $9 $4 $2 +-B -A +cEx39 +*18^q +-9*A9 +*02 o3e +c $3 $6 $5 +$t x02 +$1 $5 $2 +i55 i53 +^9^0^0^2 +^2 ^9 ^1 ++0 ^p +i36 i30 +'9 $5 +o71sV3sLm +*02y5x82 +*43} +.9r$x +} d } +D2 c +Y3T0 +u x05 +o3K +.7$4 +s)_p2 +o3C +^9 ^5 ^4 +o0k x41 +^s x13 +tx71x9A +$4$5$6 +x24 *3A ++6-5 +[[[[[[[c +^a ^3 +R8x98 +o9=o2u +$d $i $m +^0 ^2 ^8 +u*31s;` +^8x94 +^3 ^f +s[P$E +x35 -0 +i0s i1u +.2*47o0l +o8b*79,5 +$1 $3 $9 +^7 ^8 ^8 +i1'*1A +x35 *17 +T3i59 +*87+2 +LB*17 +u $V +^4 ^7 ^7 +$s $i $t +i34 i35 +o2m D3 +$8 $8 $9 +i6i i7d +y4E +c $4 $5 $5 +^2 ^7 ^1 +c $4 $5 $4 +,9x45.B +k i0r +[ +1 +i01 i12 i23 i34 +'6 Z2 +i72 i52 +o0V +uz5 +$* Z2 +x52 +3 +3 +]*8A +$4 $6 $5 +$3 $0 $2 +ux26 +x56d +,5oB+ +$x $x $x +$7 $1 $2 +p5o6r +^l z1 +$1$6$8 +$2 $8 $1 +xA5sGji3s +[ i1e +i57 i58 ++7-6 +$1 $2 $3 $. +D2R7 +i6K +^0^9^9^1 +[ i1z +$w } +*0Bi2rs5t +l [ ^C +o2g,Asj, +.3D5 +$2 $4 $3 +$n $a $g +Y4o2yx14 +c $2 $5 $2 +u d '7 $3 +lx3B +$1 $7 $5 +$5 $9 $0 +i69 x56 +$s $a $y +$0 $9 $1 +Y2x02 +s6T*67 +^Mx38 +i36 i35 +x56^L +^1 ^9 ^1 +[ -2 +'9s5yx78 +i02 i10 i21 i32 +$#$!x92 +$4 $4 $7 +*48o4ao5A +sarR8s-. +^4 ^6 ^1 +i67xA5snx +$aKk +^w *21 +x74*0A-7 +$h $o $g +i7g +T6xB2xB9 +i7e i7c ++4 D3 +$3 $5 $4 +si`y2 +$h $i $s +^4 ^d +*03 o0p +$6 $2 $4 ++4szJ +t +6 +}iBOK +s/P^y} +i3e i1a +*72*5A*92 +$2 $5 $1 +^6 ^6 ^9 +'5 $J +Y2 *06 +sm/-7Z2 +-6s*2*69 +i3B +o4F ++8 -2 +o9S +scV +^t +1 +D0 i1h +x75C] +$3 $4 $3 +o0f D1 +$1 $4 $9 +} } c } ++7 +8 +9 +} L7 +Ex93Z2 +^1^4 +^6 ^0 ^3 +$b $u $n +$0 $8 $9 +i0Ts`Z +$1 ^! +$3 $1 $9 +^p ^l +d Y4 x28 +i71 i5a +o63*97 +$4 $5 $8 ++7 +9 +8 +.3 l +tx48+6 +$9 $8 $1 +s4R +$4 $9 $0 +sPA r +c '9 +Ex87*42 +^0 ^c +x93i0VLB +x08sCnx84 +i0d i1o i2m +c $1 $1 $3 +T9*45T6 +^a ^4 +i7; +dx3B +x87iAv +$9 $2 $0 +*B3-5 +iBbo4u +i51 i5e +s-Sx56 +$n $o $r +c d $4 +^6 ^4 ^3 +$0 $5 $6 +i5` +K k +c,3 +^3 ^8 ^9 +l ^. r +^6 ^8 ^3 +x26sD#t +o2G l +$9 $0 $8 +x87'6i5p +*56-BsKU +x02 ^g +*95,5 +DB*2B +x21 o2i +*12*48 +i30 *21 +x04 d +R9x3A +t x81 +x24*96 +$5 $2 $3 +i2qx31 +T6i5q$5 +]Y1*56 +*62EY4 +x01*B2 +'Al +$6 $5 $6 +]D1 +$9 $0 $5 +i50 i56 +$6 $0 $9 +$2 $6 $7 +$9 $1 $7 +x05s[*x4A +*43x12 +$6x63 +'5o7&d +sZ$xA2 +D6sq7Z2 +*8Ax72 +i82R4'8 +$8T5 +$k [ +oB>*64 +^J l +$4 $3 $2 $1 +^2 ^5 ^2 +x09xB7*51 +$3s*4 +i70 i51 ++2 x41 +o5c +o1c +KiA" +$R $1 c +T7+6 +$4 $8 $6 +$4 $6 $8 +$h $e $s +$l $u $x $e +i9i iAt +{ t +o1' +x21 Z1 +l $b $o $o $k +,2x34*46 +} Y2 sdt +$d $e $w +} sdt Y2 +} y5 ++3-2 +x21LAy2 +$R c $1 +s81x1A +i72 i80 i91 iA2 +$S [ +^3 ^8 ^1 +i62 i70 i80 i94 +^9 ^b +c ^6 ^5 +} x53 +siu +$6 $0 $4 +x12 i0B +D5i5- +o4K l +c $0 $9 $9 +$4 $4 $2 +x27T7 +i3e i71 +^8 ^a +$.$- +$1 $6 $9 +z1 i1n +D5 l +sd3x7B^A +*04 x32 +$> c +K } } +$3 $5 $6 +d '8 $3 +iAr +i5b i5e +x14-0 +i32 i33 +D5 D7 +i72 i80 i90 iA4 +$f $l $u ++8 -A -A +^1 ^3 ^2 +xA1ED9 +*18 .3 +$. $1 ++2 x02 +$5 $2 $9 +^3^5 +o2a +xB5-1 +^6 ^7 ^2 +$4 $5 $1 +x01 ^y +*31o9?c +s62 +^4 ^5 ^2 +$0 $9 $4 +^0 ^8 ^2 +u 'C $9 +$f $u $r +$5 $5 $1 +x83l +x91Z2 +iA3 +s16 +i54 i57 +$4 $5 $7 +Y3iB5 +*98 D9 +^by1 +'6stbi7x ++4 -9 +^2 ^4 ^1 +i11 i11 +$4 $0 $5 +^9 ^0 ^6 +o7S +^f D2 +o2D l +T7 $1 +$7 $0 $1 +i0` +$o $r $b +$6 $7 $1 +.5^w*B2 +rp1 +s"ix65 +x24Z2s/n +iE- +$l $v +rx19sie +oBd +Z1 o2j +x02 ^x +xB7i09 +$2 $@ +'9o4@sI{ +^0 ^7 ^9 +} ^M +i7/ +,3*B0*26 +-2 *10 +^3 ^1 ^5 +$4 $0 $7 +y3Es8d +^2 ^4 ^4 +$7 $8 $5 +c sl1 +oA5 +k +0 +i63 i76 i89 +$h $o $b $o +s&v[-7 +i6ysgA ++1*8Ax4A +} x46 $j +x43y5s>P +u $1 $0 $0 +x94rZ1 +c $1 $9 $4 $1 +x04x57 +[ i1w +$-$+ +x97*32*4A +xB7^T +c ^6 ^7 +^1 ^b +sRW +$m $u $g +$2 $6 $4 +o0* +$0 $2 $8 +$3 $3 $2 +c ^5 ^3 +-5 +4 +^3^8 +T7 T8 +x03R2*19 +o2m*7A +c i02 i11 +ro6yT9 +$v $i $a +} $j x46 +o2ms)^*70 +Y2,B +s'%o9",3 +$2 $4 $8 +i8* +s7e*21*04 +*68 D6 +*67sFBx81 +x69i4- +i37 i39 +i7j +s49 +} x05 +u 'C $6 +o6J +c ^5 ^8 +$r $u $b +i3v +$2 $9 $8 +c $8 $1 $8 +^1 ^4 ^9 +i37 i36 +$4 $0 $2 +*10x69siu +x42 o0j +i06 +x63 i6n +x68o7- +i9P*A3*43 +^\ +$6 $4 $5 +i3-s63s}# +$1*84 +k*30 +s0o c +i2M +p4 o9e +x61 $8 +slOsOZ +$! ^1 +^0 ^1 ^8 +i62 i70 i81 i92 +$3 +8 +i1a i5e +^d x13 +$5 $8 $6 +s6f$? +us\h^K +sg|K +^N $s +x02 ^y +$d $r $y +^6 ^2 ^6 +$! $@ $# +$8 $8 $7 +x19-8 +c $3 ^3 +i2E l +] $y +^8 ^8 ^7 +$d $u $o +*93r +$8 $7 $8 +$4 $8 $9 +o8g +^9 ^1 ^9 +o5R +x31 +2 +$1 $8 $4 +c ^3 $3 +k ^m +i35 i37 +^5 ^6 ^2 +x32 o0k +$4 $4 $0 +x73o1yx93 +d '8 $4 +o0' +*81 x72 +$2 $6 $8 +$s $a $c +^9 ^4 ^0 +u d '8 $7 +i2p [ +-8 -A -A +o0b *02 +^9 ^6 ^6 +d x07 +-3 -8 -8 +'R +c $1 $2 $2 $7 +*B3x19xB6 +-A{ +o6Kc +^7 ^4 ^4 +o2b'B +s41 +$2 $6 $3 +.2 x41 +[Y5 +$l $a $x +x91x53*70 +^9 ^7 ^9 ++3 -8 -8 ++0 -7 -7 +*31 '9 +sSDTA$Q +i50 i71 +-9^6 +^9 ^6 ^2 +Ex36 +i20,2 +x71x84*65 +^A ^1 +RAxB8RB +$8 $5 $0 +$4 $8 $0 +$p $a $w +$s $i $r +] $@ ++1 +7 +7 +i36 i39 +.5sJaY1 +*B6y5 +sCP +*A8*35DB +*21 o0m +x62 i6a +^t *21 +i74 i51 ++6szr*3B +c $2 $2 $4 +$6 $6 $8 +$C $b +i1a i1d +x02 +1 +^2 ^7 ^7 +Z2xA3-7 +$6 $6 $9 ++4+9 +x05k*61 +$0 $4 $5 +^J o07 +^2 ^1 ^7 +sTH +oB7x69s&k ++4o6? ++8-B +C $2 $8 +$6 $8 $7 +scz +$D $o +Z2x72$u +^l D2 +Z3E +$1 $9 $2 +x95 x57 +^8 ^1 ^9 +^8 ^7 ^6 +} R9 +$8 $9 $8 +$4 $7 $1 +sMv*B2*24 +$9 $1 $3 +o0Ls,OL9 +i0F +^s +2 +c ^6 ^3 +sGs*01 +Z5 '6 x31 ] p1 +xA1$+ +[ ^v D1 +i19 L1 +-4 *34 +x69^lc +k Y3 +$9 $5 $6 +$Dx85 +$5 $5 $9 +l r +c 'D $1 +$8 $0 $2 +l x42 +i3! +^3 ^3 ^2 +C $7 $8 +*B4-2 +*24sEk +o7' +p5$A +Cx32E +o0X +-0 -9 +i1' +{k +sP?lo4+ +$2 $4 $9 +$5 $9 $8 +-7*8A +$3 $9 $2 +ss4^2 +d '8 $6 ++9 -A +9 +x14suk +^zo7o +o6Wo6t +i50*49 +^B*96 +xA4o3@sNL +rx72 ++6 +7 +6 +shc +^a ^k +i51 i57 +r $9 $7 +*43 D2 +$9 $2 $1 +s-=x37i73 +$8 $4 $2 +u 'D $5 +i4f ++6 +6 +7 +x58T5*06 +$3 $6 $3 +x03 ^g +x81 x15 +Z3'5C +sog +$3 $9 $0 +$2 $7 $4 +o8e -8 +D8 x43 +,6x71 +$2 $6 $9 +D2 $1 ++4 -5 -5 ++3 -9 -9 +o16 *31 +syH x35 x67 +$5 $6 $8 +[[[[[[[[ +x32lx97 +x2AoA6 +$h $o $s +c ^4 ^5 ++9 +9 -A +$. $n $e $t +Kx32 +$4 $2 $4 +$8 $9 $7 +x35 E +x7B[ +^3 ^2 ^3 +^5 ^2 ^3 +s42 +c $3 $2 $3 +$8 $8 $0 +sX1x57 +T7*84spF ++A -7 +o17 +o2Y +$1 $6 $7 +$3 $3 $5 +i57 i54 +^7 ^1 ^3 +c $1 $8 $1 +i72 i7a +$7 $6 $0 +skG +iA3T8Z2 +sDT +c $1 $4 $5 +$3$6$5 +i31 i33 +$5 $2 $4 +^1 ^5 ^9 +$1oB- +$c $r $y +$y $e $t +$2 $6 $0 +*29 +snp-4 +ssz +c $1 $3 $0 +$8 $1 $9 +^# $# +.1 ^M +*31 o1u +^2 ^0 ^3 +xA6i4gx15 +$7 $5 $7 +*14 x02 +$8 $0 $5 +D6 x03 +KxB2 +sch +$1 $7 $4 +^5i8@ +$a $x $e ++As8Z +y2E +$4 $6 $4 ++Bk +R4o8=o8q +i1h +$4 $6 $0 ++A +A -9 +s5"$? +i9!xA9xA6 +*01s'Q +i5@ x37 +s1? +^2 ^0 ^9 +^6 ^2 ^9 +T7d +^s z1 +sb6 +D7x58y2 +$3 x92 +*B3o8r +ssc +$)TB +iBao8c'B +s48 +Y2o4ei8I +.6 ] +s1Ex32 ++A -9 +A +Y3.8 ++2 o0z +.9 ] +$1 $6 $4 +*81^J +x81}*96 +xB9$_ +u d '8 $8 ++5 -3 -3 ++0 *32 +c ^3 +x2AsyIoBS +$1 $9 $6 +o9k +^S x52 +l ^5 ^5 ^9 ^1 ++3 C +$4 $2 $3 +y4sV> +^8 ^3 ^2 +o2P l +sy_o96 +o8f +D9 D4 +xAB$R*2B +c $1 $1 $9 +{ { { c { +C $3 $1 ++8sSmx04 +Y1 *12 D0 +^6 ^c +^0 ^3 ^5 +^8 ^7 ^1 +-B-C +$5 $4 $1 +$d $u $b +^T D5 o0s +o1f +x03 D4 +sX+ ++9 -0 +^5 ^6 ^8 +^T o0s D5 +T6 $1 +$g $i $g +x95s-8oBV +*69'9 ++6s-# +-2 -8 +^5 ^8 ^8 +*31sgp +i40-1 +c $3 $3 $0 +iA,i6n*5B +*04 sai +^8 ^2 ^6 +x23Y3 +^L*A4 +i4Zo4zo8} +$2 $8 $7 +$6 $4 $6 +i3S +c $5 $5 $6 ++8 +A +A +^5 ^8 ^7 +$5 $2 $7 +o0pxB6 +i7u i8n +$7 $5 $2 +y3 x62 +i3D +i6b +$9 $0 $2 +$3 $7 $9 +^1 ^# +^d $D +i2l +2 +-0 { +i3E +-8i5bsXP +i1a i3d +$1 $7 $9 +$0 $2 $9 +x03 ^w +^b ^8 +c ^4 +.8$L*2A +^8 ^6 ^9 +y5 x1B +^5 ^1 ^4 +sJRD7s0; +t .2 +i5a i3a +x45 o15 +s2j*34 +^8 ^6 ^4 +^4 ^9 ^2 +$8 $4 $8 +^4 ^0 ^4 +^0 ^7 ^2 +$8 $9 $1 +^e ^h ^T +^5 ^5 ^2 +$7 $2 $4 +$6 $2 $8 +$9 $5 $9 +o2n x32 +^8x0Asvo +EZ3 +o2S +x34*A0 +^c ^7 +^j +1 +d x43 +^i x53 +k { +i1a i71 +$3 t +l [ ^T +T4*9B +^8 ^4 ^2 +^5 ^9 ^7 +$6 $9 $1 +o3x +$=$= +C $5 $6 +i3Y x34 +i36 i37 +^Es<* +t k +c x81 +^f ^6 +^6 ^4 ^1 +$8 $5 $6 +x5AiA1 +i5G +*03Y5*3B +Y2K*9A +i53 i55 +Z3xBA +c $2 $2 $7 +^4 ^7 ^1 +c $7 $1 $7 +^u ^y +^b ^4 +sI5*40x05 +R7x63 ++1 i1u +$c $u $e +^9 ^7 ^1 +$mT6 +x21 C +x94$) +$7 $5 $9 +*35 +1 +[T0x73 +*B0 +sK,o42 ++7 -3 -3 +i78sS+ ++7 $a +^8 ^0 ^2 +slg+7,A +x02 k +i1v +d $0 +iAE x65 +]]]]c +^9 ^6 ^9 +^o ^K +^1 ^2 ^5 +y5E +'9 $7 +R4s=%LA +$0 $3 $5 +i4l*74 +$5 $8 $2 +^Y l +o5M +^4 ^8 ^8 +^1 ^4 ^4 +$w $a $s +x81} +{ts f +Z3,1x04 +i55 i75 +$y $a $p +$8 $1 $6 +$p $u $s +c $2 $0 $9 +c $0 $3 $0 +o7/ +C $2 $9 +u ^K +o9L^A*A3 +$9 $7 $9 +L9^B +$9 $7 $0 +c $3 $3 $1 +$7 $1 $9 +cx8A} +$3 $5 $2 +$9 $4 $0 +-7+A +i28 [ +D3 -1 +x98-5x52 +$a $s $p ++8 x52 +k o16 +$a $d $z +-1-8 +$1-2 +sXR*42 +s90 +o0u ^t +$6 $8 $5 +s1l +$2 $8 $5 +*57cx49 +s36 +$-c +s;NT9 +^2 ^8 ^1 +$>c +i0co5- +s72 +i4E +$t $o $t +syaxA7x82 +$8 $1 $3 +i6r i7a +^6 ^4 ^6 +^1 ^7 ^9 ++9 -5 +i35 i39 +$! T0 +-2 r +E{ +$4 $3 $5 +$7 $3 $7 +x54*65*A2 +$5 $6 $1 +*3B$` +$x $d +^2 ^5 ^1 +^d ^7 +$6 $9 $0 +$9 $2 $9 +$8 $2 $7 +R0sn!xB9 +o3l +^c ^4 +T2,2 +^c ^6 +i33 i73 +c $1 $0 $8 +x73 x07 +Y1 D4 +*2AD6 +$y $e $n +y4 } +c $2 $2 $6 +x6A-6 +*20 o3i +^x ^f +C '7 $1 +sz6t +o3N +c ^1 ^2 ^3 +$V l +o6zx9A +D2 +3 +$.x03 +*21 *20 +^1 ^6 ^5 ++1i9f +$4 $0 $3 +i71 i89 i97 iA1 ++6 -4 -4 ++A -0 +rx05sf! +i5v +^2 ^8 ^2 +o4P +-7 -9 -8 +^9 ^4 ^2 +}z1x58 +c $8 $9 $8 +x47-2 +u d '9 $8 +o3q +c Z2 +c o64 +^3 ^6 ^6 +$7 $1 $4 +x5B *87 sGf +$2 $7 $9 +c $5 $4 $5 +^k x13 +-7 -8 -9 +i0k i1i +c d $6 +x42oB= +$6 $4 $0 +sSei0G +$3 $8 $0 +[ o0z ++AsrN ++9 -3 -3 +.6 x24 +^7 ^2 ^3 +,9*3B +$0 $6 $5 +i71 i3e +o0i +1 +-0 +2 +$4 $0 $6 +i6@x1AK +x02 { +u*86K +i30 i34 +D3 k +Y2sUY +x84ssb +^7*76 +c $3 $4 $3 +*28*A8o35 +xA3i82 +*18x51 +$g $a $b +$2 $6 $1 +^0 ^1 ^6 +i5a i7d +i8, +^0 ^9 ^2 +T3+B +$e x71 +tsn(*94 +E iB7 x53 +^6 ^a +s]"x05 +$7 $0 $2 +$1 T1 +i50 i60 i71 +d { +o1q +o6O +*45iBV +,3*56 +*7Bx74 +[[[[[c +i8R l +$d $i $p +$6 $3 $6 +oBoy3o5s ++5-9 +$6 $3 $2 +$0 $4 $7 +'9 $0 +c*24 +^c ^2 +D4sVP+4 +R8R1i5M +s09 +$3 $A +o2B l +s.- +$w $e $t +o4q +z5E +i5a i1a +x41 x61 +o7T +*B6-6K +'8K +o5C +i58 i53 +^8 ^6 ^5 +s19 +xA7*06*31 +$s*94x8B +scxz2sr4 +$3 $8 $6 +$0 $3 $2 +$2 $9 $1 +$4 $8 $3 +[ $3 +$i $r $k +$7 $3 $1 +i5a i5f +$! Y1 +] DB +$8 $2 $4 +^2 ^7 ^9 +$9 $4 $5 +*37 r D6 +$0 $6 $3 +o1f +0 +^e ^4 +$8 $7 $9 +o8N +^5 ^1 ^9 +^0 ^0 ^7 +$3 $7 $6 +K x96 +Z2o9t +$6 $2 $7 +u d '9 $7 +^6 ^6 ^5 +$7 $0 $5 +$9 $1 $5 +sGQ^GE ++7 +A ++3 +3 -1 +.6*8A +D0 i2m +c $9 $9 $4 +$2 $6 $2 +$7 $4 $0 +i4i i5s ++3 -1 +3 +c $5 $6 $5 +$9 $0 $6 +$8 $6 $2 +^9 ^1 ^2 +x46fx73 +x06 'A +] x03 +c ^8 ^3 +c ^7 ^6 +^2^0^0^2 +x12 i0B u +x12 u i0B +i1e i71 +*78x6A +i8s i92 +o5&x47 +sGQZ1oBc +sJP +} -0 +c $6 $9 $9 +^9 ^a +*30 +3 +{ x92 x72 +c $2 $4 $0 $4 +^s T4 x01 +sK`x53 +$5 Z4 +u .2 +o0hl +*48$*T6 +c ^1 ^1 ^0 ^2 +*46x78 +^6 ^8 ^5 +o2C +$2 $0 $1 $1 $. +x25x34 +f o2u +^c x13 +xAB +$d $u $n +^7 ^f +.A{Z1 +y2x41 +saA +^1 ^1 ^5 +^8 ^8 ^1 +i0p i1a i2l +T5 $1 +D1 ^t +*87 k +K Z1 +*54 -4 +$9 $0 $3 +o1| +$4 $7 $5 +TAx61x52 +o0m { +D0i09 +o3y [ +D6 $s +^5 ^e +Z4x47Y1 +o2i [ +k Z1 l +C $5 $9 +o9m +u d '9 $5 +$9 $2 $6 +^a ^9 ++3.B +sm" +$3 $4 $6 +d '9 $2 +$6 $0 $3 ++0 ^a ++7 +7 -6 +$2 $9 $7 ++1 +9 +sd4 +$R x92 +x93 K +smf +*05 x02 +i7a i7b +oAn +x64o8( +c $7 $8 $6 +i4\ +'Ax3A$D +^2 x14 +i30 i38 +$2 $8 $3 +$0 $5 $8 +^0 ^7 ^8 +} z3 +'6$2i6T +*79x7B'A +^3 ^< ^i +^4 ^0 ^3 +c $1 $4 $0 +x02 ^u ++0 +B +spt +c i02 i12 +Z5x6B +$5 $5 $8 +i71 i3a +u d '8 $4 +$i $v $y +$4 $5 $3 +c D2 +i51 i78 +s9]i4r ++7 -6 +7 +l ^m ^i +$9 $2 $8 +^0 ^6 ^2 +$4 $7 $0 +C $9 $1 +c $9 $9 $6 +o1M ++0 -2 -2 +} } D1 { +$6 $2 $1 +^0 ^5 ^3 +f x9A +Y2 x43 $0 +x02 o3y +rsSjc +^9 ^7 ^7 +^m ^a ^i +^6 ^2 ^8 +^2 ^6 ^3 +i38 i35 +*96x83 +$8 $4 $5 +i34 i3e +-1 -5 -5 +$3 $5 $1 +u d '8 $5 +$9 $6 $8 +$0 $5 $4 +$1 $7 $3 +$p $u $n +s[ai4a +cx14x58 +^6 ^6 ^1 +r $l +*21 o1e +i11 i12 +x04 y4 +i4A +'9 [ +o1gx16 +^foA"+8 +c d $7 +$t $h $y +$5 $6 $2 +^7 ^5 ^0 +-2 -3 -3 +^2 ^2 ^3 +i72 i7e +D4] +o5U +^1 ^4 ^2 +Y2 $0 x43 +] ] $1 $2 +^4 ^8 ^5 +sT"x43 +s83 +2 +c si1 so0 +l o1i +y2 ] +^9 ^5 ^3 +^5 ^3 ^2 +^7 ^1 ^4 +*53x74-1 +DBz2 +D7*23 +$yo45T5 +d '8 $5 +x36+0sT6 +x03 q +c so0 si1 +$1o3c +o6N +x27x95$A +*29o70 +x41$1 +$5 $8 $4 +*50-8 +x65x96 ++0 ^g +^4 ^1 ^9 +u d '8 $1 +^6 ^0 ^4 +$s x83 +$9 $8 $3 +u *54 +iBa +i5ox7A +^9 ^f +i6p +o6d.9sX{ +-3 -6 -6 +$s $w $i $f $t +szxY3 +u d '9 $1 +$7 $7 $0 +i0t i1a +snt +]Y4 +-1 +3 +i6t-B +c $2 $3 $1 +-1 l +$4 $4 $8 +i4, s,k +i3e i3e +iBe +C *03 +D1 ^p +i57 i55 ++5 D4 +i3b i3e +i7M l +c ^4 ^8 +Z1 $e +i55 i56 +*7ArsFr +oAA +o9* +^8 ^d +$1 $8 $3 +^o ^D +Y3sNBxA9 +r '6 +$9 $1 $4 +^Rx57 +x56 u +*29.6 +$4 $9 $8 +o1e o2d +,8saO +-D-D +^0 ^4 ^5 +^9 ^3 ^0 +o1O'7R9 +$8 $8 $6 +-0 -A +c $3 $1 $2 +*7Ao9v$a +x84{ +Z5y3x17 +$7 $0 $8 +-1 +2 +$5 $9 $1 +x28-5] +$6 $0 $7 +u d '9 $4 +$5 $5 $4 +u d '8 $2 ++BxB3shB +-1 *13 +$5 $7 $5 +D0 ^c +o9Y l +o0, +x94 -8 +x09 $4 +KE*7B +lZ5x4A +$4 $5 $9 +o9=sKX-3 +u d '9 $2 +^u ^D +$2 $9 $2 +$6 $9 $8 +^. i0m +,4s+j +^7 ^1 ^5 +^d ^8 +i4iiAcs&{ +Z2*67sWx +$6 $7 $5 +x67o1ii6o +^s -1 +s69 +^0 ^f +x18i79 +$9 $5 $0 +*07$Gsk! +^9 ^5 ^2 +i20 +C $3 $0 +k*20o0f +$0 $5 $2 +st>R6 +'9 $8 +oA%srt +o8/ +,3 [ ++4 +9 +$p $e $a +$c*B8+5 +K*A2[ +o7f +*95'A +$9 $5 $2 ++A+C +^5 ^8 ^2 +i8$ +$6 $7 $9 +$3 $2 $7 +$5 $3 $5 +x53x92 +c d '7 $1 +$6 $7 $0 +$8 $3 $0 ++5 -1 -1 +o0RD7s*M +c $9 $9 $1 +u d '8 $0 +s>D *79 +c ^4 ^6 +-6*90 +^qT9sbh +{*15R9 +^1 ^7 ^7 +$0 $8 $5 +c $8 $8 $9 +C $8 $6 +*0B$@ +c $6 $0 $6 +-1 -8 +$7 $5 $8 +^8 ^6 ^2 +L5fx25 +ts&yy4 +$$xA8 +x14Y3 +i3j +$8 s61 +Y1o86x82 +*20 x32 +$3$6$0 +D7 T0 +^e ^9 ++9 -4 +^0 ^a +s8D^d-6 +i0@ +i71 i1a +i71 i7d +i6b x71 +sx`xA2 +$6 $3 $1 +$3 $4 $2 ++1 +2 +2 +x62s2xd +uT7 +^0 ^3 ^8 +^3 ^7 ^9 +c $3 $1 $0 +$5 $7 $1 +xA9+1+9 +,9 s06 +oAo +$9 $0 $4 +s`Q'5,2 +i6A +i6! +*30x93 +i0Ar*93 ++4 D5 +$y $a ++1 o0r +o1P +skm +p1*82xA8 +Y2 o6_ +xA7^AT6 +i30 i33 +s97 +L9y3c +$0 $3 $8 +c ^6 $6 +$5 $9 $3 +$3 $3 $6 +$3 $5 $8 +.7R8sdA +^9^8^9^1 +^7 ^e +^9 ^8 ^2 +^9 ^5 ^6 +u d '6 $5 +$w $o $n +o0K o1o +$7 $6 $8 +c $4 $5 $0 +l D6 +z2sZu +x27 *12 +^0 ^7 ^4 +*6B +x01x1B +r c +^2 ^5 ^8 +sDAZ1 +$5 $8 $1 +c $6 ^6 +$0 $3 $7 +$7 $2 $9 +$3 $7 $0 +$5 $4 $7 +$D $r +o71 -6 +x91 $7 +-B -D +D3 sao +i2B +$6 $3 $9 +$0 $2 $6 +$Wx59 +i1ex87 +i32 i37 +iB(o2h +^2 ^6 ^5 +*30 x32 +.1x39{ +$8 $9 $6 +s4Ix28 +p4 *24 LB +^0 ^4 ^9 +p4 LB *24 +$7xA2*58 +$6 $6 $1 +^p i0b +d x69 +^CoABx2B +$3 $8 $1 +[} +i8z +x53 $1 +$a x91 +$r $i $b +$4 $0 $9 +^9 ^4 ^3 +i56 i58 +si1 sa@ +$2*7AT6 +o4c x02 +$h $u $m +c $3 $3 $5 +o9Ql +s';x38} +-9 -9 -A +o6zsBK +o5/ +i76 i51 ++4-0 +Y5x36 +ssR +D8 o7t +^b ^m +x91 i1Q x04 +[srv +Co2a +$3 $9 $7 +s]b*24 +c $5 ^5 +$8 $6 $9 +.B +$1 $9 $4 +i6u i7r +-5+9 +c $. +-0 -8 +x06s(sc +$. ^1 +$7 $6 $1 +$8 $1 $7 +^6 ^4 ^5 +kR0 +i59 i79 +oBy +^a ^5 +x02 +2 +^d ^o ^o ^g +^6 ^8 ^1 +r ^J +$6 $3 $8 +o1F +u d 'B +i0d i1a i2d +^9 ^d +-A -B -B +}x86l +^7^8^9^1 ++0 -5 -5 +c ^5 $5 +$7 $7 $9 +o6p +c $1 $9 $4 $8 +$y D8 +-9 -A -9 ++8 -6 +8 +{+5+2 +c ^5 ^7 +[ $y +i52 i73 +o2o o0p +c $0 $5 $1 $0 +-3 -5 -4 +-3 -4 -5 +$0 $8 $7 +i3t [ +]t +y4 x93 D8 +$n $i $l +scS ++8 +8 -6 +y5 iBA +o0. +^3 ^1 ^9 +K,8 +Y3*15 +o0kk*73 +$4 $8 $5 +y2 -1 +i12 i11 +i8n x91 +o6N l +$6 Z1 +smIx04x29 ++3 *12 +rz1 +o08 +^6 ^7 ^8 +^8 ^6 ^8 +^3 ^0 ^4 +o3n [ +i4t i5o +$4 $8 $4 +skJ +*0Ai6ls%7 +i0m i1a i2x +c i02 i10 +$7 $2 $3 +x42 -0 +lT8 +^3 ^7 ^1 +,2*62r +sc$*14 +^6 ^5 ^9 +l o1e +$7 $8 $1 +*96*40 +$5 $4 $8 +o7fx04 +] x15 +x5At{ +*A2$! +$5 $6 $3 +x21 +1 +*B0Z2 +^Q x05 +o8Gf +$t $o $w ++C -E +^s x14 +x37o3a+9 +^s o2y +$0 $9 $2 +xBA +i9o iAn iBe +^1 ^6 ^1 +cY1 +$5 $3 $4 +^9 ^c +$w $h $y +u 'D $2 +$4 $9 $6 +c $f +$7 $4 $3 +i0I +i6bx63[ +$rx76^A +i71 i52 +$9 $7 $5 +^5 ^7 ^9 +sgNK +^c ^p +$8 Z2 +i1a i1e +u $1 $9 $9 $5 +-BiB6 +k +1 +^2 ^9 ^6 +u -A ++9 u +-7 -A +] x37 +i39 i35 +x81 .2 t +d '8 $0 +c ^9 ^5 +$4 $6 $7 +c $4 $2 $4 +c $1 $1 $6 +x36p2 +$n $i $t +$6 $9 $4 +Ex12x62 +$6 $9 $3 +-4 -9 +o5b +$8 $8 $1 +-5 +2 +$%$% +^2 ^6 ^1 +*A0x69*29 +x48$_ +x41Z1s_5 +snz +o98s6U +^f ^7 +x45L5z2 +$2 $0 $1 $0 $$ +$2 $8 $4 ++0 +C +x81 t .2 +s0s +i78 i52 +-1 -2 -3 +i3K l +^8 ^1 ^8 +uo64 +*38 D0 +*BAs%+xBA +*24sP> +dx1A +$8 $2 $6 +^s D4 +u $5 $1 $9 +,5x03 +l [ ^G +x34 *73 +$t $i $t +$_ $a +$2 $7 $6 +^7 ^0 ^2 +-4xAB +-1 -3 -2 +$2 $7 $3 +^8o63 +$l $u $g +x84 x52 +i4-s"d +o66l +l $b $a $b $y +$6 -9 +C $0 $5 +^1 ^2 ^9 +$3 $5 $3 +s6{*B8,2 +^5 ^0 ^4 +$6 $8 $3 +o5i o6n +o9s +x35o6.x59 +^2 ^6 ^2 +^f ^2 +$7 $8 $2 +*BAiB>x73 +$y $u $m +sTYk +$5 $9 $7 +T1 TA +o0S x51 +$!x9B +i53 i54 +i2s*B8R6 +i3x +$6 $5 $1 +-9 o87 +C $7 $6 ++0 o33 +*A2.1 +^4 ^8 ^2 +i58 i56 +x59x72K +$Hx47 +^5 ^8 ^4 +i7s i8t +] z1 +$n $i $p +o2R l x02 +$*o9. +^9 ^1 ^5 +$9 $6 $1 +oBHi3a +i3a i5e +o2R x02 l +-2 o0d +i5$sq<^! ++D+D +$9 $6 $0 +$3 $8 $5 +D4 o0g +s"[TB +x72 $1 +*34 x52 ++6 D7 +$7 $3 $0 +[[[[c +D5 c +sa4 si1 se3 +^e x3A +^7 ^1 ^2 +-4sC! +*02 o1a +s-So92$S +sa4 se3 si1 +i5o i6u +$5 $7 $6 +} sD5 l +$8 $0 $6 +$0 $4 $6 +-5L6TB +^0 ^8 ^7 +c $2 $1 $3 +o0f x12 +x21 ^a ++5.B +$9 $2 $3 +$s $o $y +^j +2 +i79 i88 i97 +xA2 x96 +x15x68k +x04 ,2 +^0 ^5 ^8 +o2D +$3 $7 $1 +'9 $r +$m $e $g +^8 ^c +$8 $3 $2 +^JxB6oA\ +x02 ^M +i6ExA5-5 +x23 ^s +i3a i3a +c ^9 $9 +*91sP6x35 +^! ^1 +$n x71 +$0 $4 $3 +L6c*87 +$e $l $m +*02 i0s +i4w +T5x09i4e +$r $e $f +x02 *20 +*9B^B +$l $y +s59 +oB!o6z +smvo7+ ++D +D +D +$s $l $y +sF=$e +D1o45 +'5^4o8r ++7 -5 -5 +,3-3sw) +^7 ^7 ^1 +$h $a $h +xAB*70 +u d '6 $6 ++5 D6 +s!no78 +$+sbu +$s+5 +o0t D5 +c $1 $9 $4 $7 +$4 $4 $6 +o2V +x05y5 +$3 $6 $7 +c $6 $1 $1 ++5 $d +u k +*29.0s'} +*13 *04 +x23^K +$2 x61 +sk@s@{oB8 +^8 ^1 ^3 +o0r c +[ o2z +o2a.B +i53 i58 +x61 x72 +o2n [ +CZ1 +$7 $0 $6 +u d '6 $3 +slp +D1 i0h +i68 o76 +x54 $w +u d '7 $2 +c $9 ^9 +^4 ^6 ^5 +^3 ^8 ^8 +o0b o1l o3e o2u +x8BR1sw] +-5 +3 +$8 $2 $1 +$6 $3 $0 +i5f i5a +o0k *30 +x23x5B +$3 $8 $9 +^2 ^4 ^2 +x38 [ +seGY3sU. +$7 $8 $0 +o0b o2u o3e o1l +c ^1 ^4 ++9 -2 ++2 +A +}-2 +o0b o3e o2u o1l ++5 *75 +*AB*15x97 +i3p *03 +^8 ^7 ^4 +$$$% +scl*56^7 +$+sGp +y3 c +-2 *BA +i3f i3a +i3a i5d +^e ^p +o3L*29c +i30 i39 +K [ +^K { T0 +$0 $5 $1 +i5c i6a +x83x47 +i7e i7b +o0P p5 +$8 $1 $4 +o6cs*ps?% +$6 $7 $6 +o0b o2u o1l o3e +*86^wx52 +c ^1 ^8 +.2s&l +$8 $4 $3 +^8 ^9 ^8 +i41 i52 i63 +$o $s +$f $d +C $0 $3 +i55 i58 +^8^4 +*24*A3 +i6M +i56 i76 +x92x7A +$3 $7 $8 +i2D +$6 $8 $0 +^3 ^5 ^7 +*A7x8A} +$0 $3 $6 +$l $e $i +$8 $5 $3 +o0b o1l o2u o3e +o7I]c +C $9 $0 +o0b o3e o1l o2u +$9 $2 $4 +$y t +*62 x45 +sX]iA%o6x +^9 ^4 ^4 ++1-9 +D0 D1 k +o1a D2 +$b $2 +$@*58 +$9 $5 $7 +^5 ^8 ^1 +^b ^1 +$9 $3 $6 +x28 x8A x17 +$7 $9 $7 +$4 $9 $3 +^1 ^8 ^2 +^7 ^0 ^4 +shm ++4 +5 +5 +x62 r +-1 -6 -6 +$6 $6 $6 $! +oBw +^9 ^4 ^9 +x53 u +Z1x98 +x65sbH +$0 $5 $7 +x76o4A +sNH +s}%+7o9' +$4 $6 $3 +$4 $6 $9 +$x $3 +} c } } +o1u D3 +$3 $7 $5 +x14i8[sEb +$0 $3 $4 +c 'B $3 +x21 +2 +$3 $4 $9 +iA*r$l +$9 $6 $5 +C $8 $7 +^7 ^8 ^2 +-4 x31 +*78 x53 +o4T +$7 $8 $4 +$0 $7 $1 +*65E +d x05 +Ex25 +i8O +$5 $9 $2 +c $2 $3 $3 +$5 $9 $6 +i0h ] +o1p -2 +$r $e $t $e +x29s!> +-3 D2 +] ^n +iA6 +c $0 $5 $1 $1 ++1 +3 +1 +oAl{ +$3 $7 $3 +R3Y1 +^5 ^0 ^6 +E x31 +$8 $8 $2 +x09*94o73 +$6 $4 $3 +-0 u +c $_ $2 +*04*91^0 +sKgi3p +]scC +i61 i79 i87 i92 +$0 $8 $3 +-7Y2 +c $1 $2 $6 +$4 $6 $1 +c $2 $4 $0 +^z ^s ++1 +1 +3 ++4 +0 +R1o59D5 +$7 $7 $1 +*54o3h +sJ,u +i1a i1a +$0 $8 $4 +c ^4 ^7 +$5 $7 $0 +$6 $0 $5 +^6 ^3 ^0 +x13 o1u +svu$B +i0Es?5 +*70 ] +c $2 $0 $1 $6 +$0 $7 $9 +D3 x71 +$7 $4 $5 +o0< +o1n *10 +i8' +u d '7 $4 +p1'3 +*37*0A*56 +$6 $5 $8 +$6 $8 $2 +x61x32 +$f $i $g +^0 ^b ++5 *32 +$4 $7 $9 +y4 x58 +$2 $9 $6 +^6 ^1 ^5 +u d 'A $6 +x75 x42 +*24x1B*28 +^6 ^1 ^6 +R2-1x0B +i52 i57 +$8 $5 $8 ++7 -A +c $? +o9u +^a ^6 +s=/$q*27 +o9/x93 +$3 $8 $3 +sBF{ +$h $a $g +*41*8A +^hl +]xA3 +y3 x65 +K*0A,7 +$9 $6 $7 +sm? sZg x81 +$6 $4 $8 +$3 $4 $8 ++1 o0a +$9 $5 $8 +$3 $8 $7 +$2 $a +c $1 $6 $1 ++1 -9 +-3 x41 +i5e i5f ++7 -8 -9 +$@ $2 $0 $1 $2 +-7 D6 +'9E +xB8i0D +x04 z1 +sqg +^5 ^4 ^5 +$6 $6 $0 +u*34 +^7 ^3 ^2 ++7 -9 -8 +i1w x06 +T8] +^8 ^e +^3 ^9 ^8 +-6 -8 -7 +i7a R6 L6 +[ o2t +$7 $2 $5 +i9ix54 +$$x1Bx3B +x95 K +^3 ^3 ^9 +saU +^4 ^3 ^9 +D9 D6 +*34s-x*3B +$8 $2 $9 +D5 'B +c $2 $6 $2 +x91 x14 +*15 x42 +^7 ^7 ^8 +D6 x31 +s9S +^4 ^8 ^3 +oAeL6 +o0v x41 +^1 ^0 ^4 +-6 -7 -8 +i0z i1a +s"ro4@ +i9u iAs +C $3 $2 +i0a i1z +^3 ^4 ^5 +tsZ"} +c $1 $1 $! +^f ^3 ++A -8 -8 +i4* +s@z^Dx63 +T9sgQx03 +$p $o $i +o2l x31 +c $1 $9 $4 $6 +D7 D3 +*87Y1x38 +$5 x91 +sd- +^1 ^0 ^9 +i55 i57 +D7 D9 ++7-5 +Z1t +t i0V +x03 ^J +x14xBAsMd +x83*69 +i76 i87 i98 +p4 i7t +srm +c 'B $2 +$4 $9 $2 +$3 $8 $4 +p4 $k +^N D3 +^0 ^3 ^6 +o43 E +^3 ^6 ^3 +,6d +'9kl +^@ ^1 +^fsaW.B +i0] +i0. +o0Ss@Tx51 +c ^8 +sre +se^*64o0Z +*76*50 +*7Bx56 +Ex61 +{^r*30 +RA*B9l +rx65 +x6B^X +sFw-6 +{Z5 +i52 i58 +r $0 $9 +d '9 $3 +$m $i $d +c ^2 ^5 +C $9 $2 +$c $2 +$f $i $x $e $r +i39 i37 +T7Y5 +Y4lx68 +$$sc" +sli ++C+D +,3s(P.6 +'7*38$o +o4J +y2 D2 +i1D +x03y3sq] +$?x58 +K*79 +} z1 +^9 ^2 ^8 +$0 $5 $9 +$4 $4 $3 +$9 $5 $4 +$6 $9 $7 +^4 ^4 ^2 +$7 $3 $9 +^7 ^8 ^7 +^4 ^1 ^7 +$0 $6 $1 +^1 ^6 ^8 +$9 $4 $1 +^2 ^0 ^4 +$9 $6 $4 +^1 ^4 ^7 +^5 ^7 ^2 +^9 ^9 ^6 +^9 ^9 ^8 +$5 $3 $2 +$4 $6 $2 +i7b i7a +o3K l +c o81 +T4 T5 T6 T7 +T4 T6 T7 T5 +T4 T7 T6 T5 +T4 T5 T7 T6 +T4 T7 T5 T6 +T4 T6 T5 T7 +D0 ^u +^4 ^8 ^1 +sfs +x32 *32 +x13 ^s +'A ,9 +x63 x72 +*03 D1 +se- +c $2 $! +c i02 i13 +o3W +^. ^a +^w D3 +o4f +$1 $9 $6 $8 +iA0 +$6 s19 +o1N +i5}y2xA4 ++0 +1 -3 +$d $i $g $i $t +xA7i6!-6 +u d '6 $4 +$f $r $o +i3W l +*53x5Bs7/ +] { +.3 -6 +^6 ^6 ^8 +x42 +3 +$8 $4 $0 +-0 -3 -2 -1 +] ] c +u *34 +$4 +8 +i3e x43 +D7 D6 +p1 x26 +] c ] +c ^7 ^4 +sGM,6 +^9 ^1 ^4 +i55 i72 +i34 i37 +$1 d +^b ^0 +r $2 $0 +i3l [ ++5 +6 +6 +c $. $c $o $m +$BE +*46 D4 ++5 -7 -7 +s9{]o7n +i5A +T0sDp +$8 $8 $4 +sh3 +^5 ^4 ^6 +*23 x03 +*6B^E +-0 -1 -3 -2 +R5Z1 +i4h D0 +c $3 $2 $0 +^2 ^4 ^3 +i75 i51 +$7 $5 $6 +TD +Z1*87 +$3 $9 $6 +-0 -1 -2 -3 +^0 ^6 ^4 +-0 -3 -1 -2 +^p *20 +i72 i31 +i50 i57 +^4 ^9 ^1 +$4 $3 $6 +^8 ^7 ^3 +Z3oA;l +Y5x4Ax62 ++0 -3 +1 +o6B +$w $i $n $s +$0 $9 $3 +-0 -2 -3 -1 +i50 i72 +iAxZ1i1c +oA.D9 +c 'A +C $6 $7 +D5sfF +o0Ss}s!'o79 +u 'C $3 +s2ii7 s`$ +^Hx78 +x34*74p2 +*3B[ +u 'D $8 +x25sL/Z5 +$4 $3 $9 +$7 $9 $0 +-3 x02 +$7 $9 $2 +^3 ^9 ^1 +x49'4Y2 +c Y5 +$s $i $p +$8 $0 $7 +$7 $4 $2 +^4 ^2 ^9 ++2 -0 -0 +i69 $4 +o1RD9 +*50 x13 +Y2s`X +Y3xB1 +x56{-B +s`}*B0o3* +p4 D5 +c $1 $4 $4 +c $2 $3 $0 +[ [ $1 [ [ +x95Y4 +k l Z1 +$s x53 +i6a i7s i8d +^F l +$6$6$6 +i3l x03 +s]#iB? +[ [ [ $1 [ +o0? +y3 x32 x34 +y3 x34 x32 +c ^0 ^1 ^0 ^2 +$c $o $d +^6 ^d +$4 $8 $1 +$5 $3 $8 +$5 $3 $7 +$0 $7 $6 +$6 $5 $3 +$3 $9 $3 +^u ^n +u d '7 $7 +^6 ^5 ^3 +c o51 +$0 $9 $7 +*03 o3a +oAh +x96i7x +x01 i4s +$7 $7 $4 +$7 $2 $6 +^1 ^9 ^5 +c 'E $1 +i3' +iA& x95 +^a ^2 +c ^1 ^7 +c $9 $2 $9 +-A oB8 +sf\x48 +-5 -7 -7 +*8B^E +$3 $7 $4 +D1 ^d ++5 -6 -6 +$4 $7 $6 +[ $1 [ [ [ +$0 $4 $2 +o1k i1u +^SD6x2A +$7 $9 $6 +u 'D $0 +c o5_ +[ [ [ [ $1 +sMT +$d x02 +sDHRAx78 +*06x79*2B +i30 i36 +^2 ^1 ^4 +x65i6tsYD +Y1 x02 +x15Z1 +*A0$0 +] p5 *01 +*04 o0t +i32 i38 +c 'D $6 +*02 o3a +sd+ +]x41 +] Y2 +c $1 $1 $1 $! +$y $a $m +i3k +o0d ^S +$w $i $g +$1 x51 +i11 i32 +$s $q $u $i $d +^5 ^6 ^5 +D4 +3 +$7 $4 $8 +LBy4 +stjs/Zx56 +o77 -1 +K $9 +o4hs G ++6-4 +o3D +Kx17 +^t ^o ^h +'B $l +z5tp5 +$s $h $y +*5B[x05 +o11 k +cD6*36 +.1T9*94 +i5i i6s +$6 $7 $2 +^2 ^9 ^5 +$yK+5 +^e ^2 +c ^3 ^8 +o0s k +x34*78 +] xA6 +^4 ^6 ^2 +u d '7 $5 +^X$X +^9 ^4 ^6 +u d '6 $0 +^Jsd'x56 +iB5c +$9 $5 $3 +$0 $4 $1 +$6 $4 $1 +i7s T0 +i02 i10 i22 i30 +x92o0E +s|^,6 +] ] K +$0 $8 $2 +-7xA4 +o0R -2 +r $? +$8 $2 $3 +$6 $6 $3 +DB$0 +o5f +r $2 $4 +o9e x72 +o6ix35Z5 +x36o1fu +D4 o0b +Z1 $i +$_s7j +r $2 $7 +*AB-7'8 +$4 $9 $1 +i0W'B +[ i1d +$6 $6 $2 +$6 $1 $4 +^0 ^1 ^7 +^c ^5 +$9 $3 $1 +i7*x81 +EY2 +^e ^6 +o7K +i3c i5a +*01 *34 K +^8 ^1 ^4 +$3 $8 $2 +$6 $2 $9 +$0 $8 $1 +^1 ^6 ^9 +,3x63 +^8 ^0 ^6 +*A7$ToBE +*2A*52*5A +^4 ^1 ^4 +$1 $- ++A x91 +^6 ^0 ^6 +k o0k +iB,{ +iBT*45x64 +^3 ^1 ^8 +$r $u $t +^e ^0 +$t $a $d +$9 $2 $7 +$2 $9 $4 +^5 ^6 ^1 ++5-3 +d E D6 +L0 ^K +*56sHa +*02-4E +$9 $6 $2 +$6 $6 $4 +^4 ^2 ^0 ^2 +i71 i1e +c $3 $8 $0 +c $5 $5 $4 ++3D5 ++4 o0t +^7 ^b +c $1 $1 $4 +s!. +xA3,Bz2 +^q*4A +s-Do0O.9 +$0 $6 $8 +$8 $6 $8 +c $i $t $e +i31 i3e +c $1 $3 $3 +^6 ^e +{^xoAR +*57s"7x51 +^6 ^7 ^9 +c $1 $2 $! +x24x67 +c ^3 ^9 ^9 ^1 +xB1oBai7x +i5yT8 +^8^0^0^2 +u $3 $2 $7 +o8C +[ Y2 +^f ^B +s3K +ssa +.6E*4A +i4/ +r.3L8 +o6oxB2o2x +^3 ^< +i51 i75 +*02 ^s *24 +$a DA +x51 D7 +i79 i59 +^8 ^f ++6 p3 +o5. x41 +d D6 E +sckiAu$+ +xA8o6+ +*49 p3 +{ D3 } +x48s1< ++1-0 +c $Q +'7$7 +o6( +LAx72l +$s $t $y +i2t +*A5R6 +i6l i7o +^5 ^9 ^8 +^7 ^6 ^5 +^7 ^5 ^2 +^2 ^5 ^6 +$0 $6 $2 +,6R9sum +oB>x61*37 +T1 T2 T4 T3 +T1 T4 T2 T3 +T1 T2 T3 T4 +^s +3 +*B6D8*67 ++2+9 +x2AY4 +i3f i3e +xB9s}SL7 +sh(*4B,4 +^a ^8 +$P} +$1 $9 $6 $5 +u 'D $7 +$0 $7 $3 +x71 x21 +s3n^C +o0h+9soI +i31 i37 +C x12 +i54x86T7 +i52 i75 +-5 D6 +L6s,o +[{ +$9 [ +kY2 +x13$xx2A +i0z +i0k i1e +ss9*8B*02 +x5Bs\Ex75 +sq8l$6 +o6-s|3 +sP3i35 +K *65 +sd Y1DA +x03x8By5 +saZst",8 +c ^2 ^7 +sd[ +sgk +] p1 +^9 ^2 ^6 +i35 i33 +^0 ^8 ^3 +Y5o1sx07 +^s -3 +^0 ^6 ^5 +i5a i5e +$7 $9 $4 +$6 $9 $2 +i9n${ +$7 $3 $2 +^8 ^2 ^5 +$8 $4 $9 +sv@ +$4 $9 $4 +$8 $9 $4 +^3 ^2 ^5 +o2q +o7; +i37 i34 ++0 $1 +D2 *02 +$3 $5 $9 +^5 ^1 ^6 +^6 ^9 ^6 +^6 ^3 ^9 +$8 $5 $4 +^m t +Y1 } +^8 ^7 ^2 +y1 E +^5 ^7 ^8 +$3 $9 $8 +^7 ^6 ^1 +$5 $3 $6 +^2 ^6 ^9 +sF4x14 +c ^5 +x2BZ1 +$3 $6 $4 +x45x93 +s.Vx36 +o0t o1h o2e +d i2m x23 +o0t o2e o1h +c $! $2 +i7a i3a +Eu*54 +*54 x14 k +T1 T3 T2 T4 +T1 T3 T4 T2 +T1 T4 T3 T2 ++2 +5 +3 +4 +c $0 $1 $0 $4 +o7ysq{sD7 ++0 i1O +*31 D2 +$* $1 $9 $9 $5 +t y3 x56 +i54 i74 +f E +.0*AB +^3i6w +'B $9 +^2 ^0 ^6 +z1x07y3 +sp3 ++2 +3 +5 +4 +^_ ^a +$6 $8 $4 +$@ $2 +$7 Z2 +lc*34 +$5 $7 $2 +^4 ^7 ^2 +c $0 $2 $0 $4 +'A $6 +o3i x02 +^K l +x92^(x7A ++2 +3 +4 +5 +l $x ^x +$a $p $t +$2 $0 $1 $0 $- ++2 +4 +5 +3 +T6 T0 +i1i +^k o1u +l x52 +o4i]xAB +c $5 $2 $0 +[x62Y5 +x26*A9i6% +l ^x $x +x03 'A +$5 $3 $9 +^3 ^3 ^0 +^2 ^5 ^3 +x02 o1p +d '7 $7 +o4P l +i6i*27 +i32 i35 +$5 $4 $2 +c ^2 ^8 ++2 +4 +3 +5 +$s x64 +^7 ^3 ^0 +$7 $9 $1 +$6 $3 $5 +u d '6 $9 +$)$) +^9 ^8 ^5 +.5R1{ +'A l +$9 $4 $2 +^z x13 +D2 ^r +i9d +c ^7 ^5 +^3 ^2 ^9 +$4 $4 $9 +d '8 $9 +Z1sw(iB) +,0x4Bx85 +^9 ^8 ^1 +D2o18*41 +c $3 $0 $5 +^0 ^5 ^7 +$8 $7 $0 +$2 $! +^6 ^7 ^3 +^2 ^3 ^5 +-5 -9 -9 +^c ^0 +$9 $3 $9 +p1 s19 +c $7 $7 $5 ++2 +5 +4 +3 +Y4x1By4 +o3t o0b +o7q +D1 ^2 +c ^1 ^6 +s'"xA1K +^3 ^6 ^5 +^2 ^3 ^9 +x42 -4 +$8 $4 $1 ++7 x82 +u d '6 $1 +$b p4 +Z2x75 +o6k*7B +x74R3L9 +o3w *32 +[d*0A +^7 ^6 ^9 +$n x82 +^LRB +o9O +c $5 $1 $0 +x72 x6B +^x ^a +i31 i38 +-9 *98 +c $ $2 +x4B^I ++0 o4i +*A0Z3x25 +c *21 +o8K +i7m i8a i9n +*35 D3 ++4smqZ3 +o8Ko2N +c $1 $5 $6 +z5 x06 ^s +{ D2 } +R2 q +^- $- +i51 i76 +i61 E Y1 +i61 Y1 E +i7( +u $5 $2 $9 +$f $r $y +^Ds,W +s-Ui8HR2 +$j $a $w +-7 -6 +R7x45o9a +xBAo6d +s}z^L +se@ +o4' +c $1 $9 $0 $3 +i52 i79 +^@.9 +d 'A $1 +*84Y3K +$0 $7 $5 +oB3sbs +x04 ^y +-7i3hx71 +D0sSaT6 +$4 $3 $4 +usj?x75 +$ $2 +d 'K +i5a i6m +$0 $9 $6 +i5e i72 +-1 -1 -3 +^2 ^1 ^8 +i38 i36 +^2 ^4 ^6 +x6By3 +o9f +'9 $4 +oAE^F +$6 $2 $3 +o3E +^e ^7 +^8 ^5 ^4 +KxB9Y2 +^6 ^7 ^6 +^6 ^0 ^9 +^c ^8 +Y2*76 +$8 $6 $1 +cx53o5u +i2n k +d x54 +*36 *67 +i6b +6 +i54 i56 +^0 ^5 ^6 +-1 -3 -1 +^4 ^5 ^9 +c ^9 ^7 +[ o1t +o8, +c $1 $3 $2 +$4 $7 $2 +$4 $7 $3 +x61 $7 +x16Y2c +s9! +-7 -3 +*52 x12 +$e $b $b +oAk +^u ^A +sdk +^9 ^e +o3l -0 -0 +*A7 +c $1 $9 $4 $0 +D8*3AZ3 ++3x06i7i +o6oK +*76s*v +o26 +^A x12 +i4H +c i42 ++5 +9 +9 +-6 x51 +^v x13 +^6 ^5 ^6 +^7 ^0 ^6 +p3 oA} x61 +xB9oAIY4 +i54 i72 +x21Z2 +-4i7h +sFg*54*B4 +c $8 $8 $0 +$7$7$7 +sEdxA4 +$9 $4 $3 +$a x42 +0 ++9 +B +B +^7 ^0 ^3 +x02x2B +x52s1g +^0 ^2 ^6 +T3 T1 T2 +^9 ^8 ^3 +'6 $! $! $! +'7 $1 $2 $3 $4 +r x01 +o6bfx62 +l s70 +*32 -2 +-0+A +$8 $3 $4 +x23 +3 +^u ^t +^2 ^2 ^0 ^2 +iF- +DB x37 ++3 -6 -6 +-0 -5 -5 +i14 L1 +u d 'C +D1 ^g +T3 T2 T1 +$Jx73$$ +sb}'9 +i32 i3e +i4dx34 +i37 i38 +$6 $8 $1 +-4 -6 -6 +x03 ^e +s0x +o33 -2 +-0 k +l s0? +-2 -8 -8 +$a +0 x42 +o0w x23 +i9S +^6 ^6 ^7 +c $9 $9 $2 +i3t i4o +^1 ^! +l $0 +Z5 x49 +[ o2d +$_ $7 +*24x67o8. +o3I*1AxAB +^2 ^0 ^7 +sETi8uo0C +*09l$- +i64] +$w $e $l $c $h +i2k [ +x76'9 +y3x73T3 +sn]f*2A +c i02 i15 +o9h +*1A +i79 i54 +y3c +D7$" +i4l i5i +^C*A3*7B +] $P ++0+B +i53 i72 +syJ +^k i1i +i1i i2s +x36 p4 +0 +$o $s $e +o4k [ +$w $e $d +i7* +i0t +2 +^- ^1 +$9 $3 $4 +r C +$8 $9 $2 ++8 [ +i99*9BiA5 +[ o1g +-2 -3 -4 +$7 $6 $9 +^3 ^8 ^2 +^f ^1 +$4 $2 $9 +^f ^5 +$8 $7 $1 +$8 $7 $5 +$8 $7 $4 +^f ^4 +se3 sa@ +x0Ao3fr +$D'B ++0 $s +$s $o $x +^5 ^1 ^5 +si?s]W'8 +^Jsr_ +-2 -4 -3 +D1^4 +^urT6 +Y1i8? +C $8 $5 +^1 ^0 ^8 +*40 x42 +$g $o $t +[ o3s +$0 $7 $2 +^9 ^6 ^5 +-7$Tk +$h $e $m +$c $o $b +$_sZx +x83[z3 +E ^S +sY{*14 +i6U +i9t +*35 x23 +sU`Y5s;m +$1 $9 $6 $4 +c $1 $0 $2 +o8Y l +x28$x +^b ^6 +o1a,4x89 +R5oB] +'8o3c +c $3 $6 $6 +^4 ^6 ^9 +x63k +z1 t +i79 i55 +^4 ^6 ^8 +o43srl +$8 $0 $4 +^2 ^2 ^9 +f ^n +z1x42sVY +o69 K +si- +$e $l $k +c $9 $9 $3 +Y1.4u +E o6r +Y3DB +c ,7 +c $7 $3 $7 +-0 D1 +-7 D8 +s\Ml +^u ^S +i1e i1c +o5H +^x x13 +i54 i58 +^7 ^1 ^6 +i9T l +^f ^0 +i6R +c ^5 ^6 +$0 $3 $9 +u 'D $4 +o0z x32 +c $2 $2 $9 +^s *15 +x2Ax56t +c $0 $5 $0 +sdl +*A6x37R6 +^4 ^1 ^6 +u d $0 +^0 ^3 ^4 +c $1 $2 $4 +'A $3 +'A $2 +$0 $6 $4 +$W E +*87tx79 +i4C +i0N +c i00 i11 +c 'B $7 +Y3x8Ax96 +x05 x25 +s,ao7f$O +u xB1 +*35 *24 ++0 +5 +5 ++4 +1 +,7 x05 +-2 *23 +o7zsI+ +o0p +3 +^0 ^2 ^7 +^5 ^9 ^6 +D6*13 +i7p x52 +-5 -8 -8 +x09x29r +^4 ^4 ^5 +scg +^3 ^7 ^3 +^6 ^9 ^5 +i2J +c $2 $4 $4 +'9x76 +Es+P +i9c +y5l +c ^2 ^0 ^0 ^2 +c $2 $6 $6 +]Y1 +Ex46*86 +x23 *14 ++1 -2 -2 +-4 +3 +$4 $8 $2 +$m $o $o $t $h +^9 ^2 ^9 +i79 i7e +$1 $9 $6 $2 +p4 D7 +^8 ^9 ^3 +d '7 $2 +*A2o6ts!( +stp +p3 se! +^4 ^2 ^7 +*41,0 +$6 $5 $9 +p5 x5A o2S +Ex82T0 +f'A +d x79 +i6* +-0 -1 -3 +p2 sbB +^1 ^7 ^4 +o8l +i38 i34 +*01 ^v +$/$* +i3e i3f +$3 $9 $4 +i34 i36 +*0Bi3k +$8 $3 $5 +x82i1j +c ^8 ^6 +^c ^9 +s[+o69 +^6 ^5 ^8 +i57 i53 +c $1 T4 +'9 $! +*A7-6 ++6 x42 +i6> +$8 $6 $0 +*4A$zsV| +i56 i79 +c +7 +$8 $8 $3 +y1E*59 +[ -6 +^M ] +y1+Az4 +^o ^r ^p +u d '6 $7 +^4 ^5 ^4 +*50 x51 +c $* $1 +s0a +o1O c +c T4 $1 +$8 $6 $4 +*21oA} +liB{ ++0-A +i55 i73 +$h $i $d +$8 $5 $7 +*BA D9 +^6 ^f +$@ ^1 +Y3x78 +*58o5t +siy +^Rx67 +$o $a $t +c $1 $8 $0 +^7 ^3 ^9 +i33 i34 +p5 o2S x5A +-3c +^3 ^1 ^4 +i27 [ +$s $u $m +k t +]Y5 +i5q +^3 ^0 ^6 +$8 $5 $9 +$0 $6 $7 +o3L +x56c +^3 ^7 ^2 +u d 'A $3 +c ^0 ^8 +K o7t +Y1c +x32i5' +-0 -3 -1 +] x97 +x03 $i +x03 o1y +i4' +x13 i1j +sDP'4*48 +i35 i75 +y3r +{ i0K +o3* +[ z5 +^9 ^7 ^3 +} x08 ++1 -3 +1 ++3 i4a +iBsE +-D -D -D +o58i3_*72 +p1 x6A ++0 +0 +1 ++6+A +^4 ^0 ^9 +Y2*A7 +-6x26 +s?]i0R ++0 +1 +0 ++1 +5 +5 ++1 +1 -3 +x57.7 +o1X T1 +-3 -9 -9 +^6 ^3 ^6 +r K +oA\o9S*35 +i7- x43 +^2 ^4 ^9 +*B7sW'x03 +K*43 +*15+A} +o6Y ++9 -0 -0 +^6 ^8 ^2 +-5Z1oBb +D2 p2 +*76 x42 +$w $a $d +x96s"m} +$4 $3 $8 +x56 ^n +u ^0 ^2 ^4 ++7 +7 +9 +^9 ^9 ^4 +D6 +6 +^6^8^9^1 +x03 '9 +o5_xBA +^O l +D8 o7h +-B$) +seu +iBzo6?u +^8 ^5 ^6 ++7 +9 +7 +sFG +y5 x02 +x46cZ2 +l k +x34 p2 +o4mrx3B +sf}i76+8 +x43d +D2 sRE +l ^x ^X $x $X +^* $* ^* $* +x19$I +sJXq +l ^x $x ^X $X +l $x $X ^x ^X +lsi/ +l ^x $x $X ^X +l $x ^x $X ^X +l $x ^x ^X $X +x09 x04 +s8R +i2np1x4A +i0Wx7B +]sU2^E +^* $* $* ^* +sqVo2e +^5 ^d +^r } +i79 i53 +^I*9B +sc< +*03 [ +u d '7 $8 +i3h x12 +$2 $c +o5 +y5x76 +D9s3- +$8 $7 $2 +^8 ^2 ^9 +i3a i3f ++A-C +-7 +1 +*97*87 +$9*31xA4 +-4 x12 +^k t ++6-0 +*A0D6 ++1 +3 -0 +,Bx6A$Q ++3 +5 +6 +4 +$f $e $d +E ^T +o4l D3 +x03 d '3 p1 +c $1 $5 $3 +sy7*51} +^8 ^7 ^8 +c ^3 ^7 +i4e x13 +c$1$2$3$? +'Ao0X +o9]*14 +oAu+A +i73 i53 +x28 d '4 Y4 ++3 +4 +5 +6 ++3 +6 +5 +4 +^7 ^6 ^3 +{ c +^2 ^3 ^7 +^2 ^3 ^6 +*64 x53 +$a $f $t +i3e i7a +^7 ^7 ^2 +^5 ^9 ^5 +-6 -3 +cZ2 +c $0 $! +x72x41 +^8 ^4 ^6 +u d '7 $1 +x03 p1 '3 d +^1 ^2 ^8 ++3 +6 +4 +5 +$8 $3 $7 +i59 i57 +k ^n +*30 -0 +$.x81 +i3a i3e +D0 } ++2 -A +o0r ^E +D3 o0b +^6 ^6 ^3 +^3 ^8 ^3 +i73 i52 +} ^a ++3 +5 +4 +6 +^1 ^6 ^2 +i8a D6 +x51x72D9 ++6Z1 +z5 x25 +o3X l +k x12 +EY4 +sdr*96$1 +L4R3 +o5$xA8 +$5 $7 $4 +i7i x34 +[ *31 +$1 $9 $6 $0 +$2 $0 $1 $5 +{ i7` +$6 $4 $7 +i72 i5e +$n $u $n ++3 +4 +6 +5 +o6/ +l o3e +i33 i39 +x19s$^skt ++1 -0 +3 +{ c { +tY4 +o7Z +o2k [ +[ i4l +R5*58 +x3A$^ +*51x43*B8 +DA -A +i9m +*10o0M +i34 i39 +-3 *43 +x5A^" +D8Y1T5 +$2x42 +xB5 ] +T9u'5 +Y1C +z4 $u x06 +*54Y5 +-6 -6 -7 +c $5 $4 $3 +x34 .3 +sG'.3 +^7 ^9 ^5 +-5-9 +L1 o0L +*41 x21 ++3 +8 +8 +i5c i71 +^9 ^0 ^4 +c $3 $5 $3 +$r x73 +^7 ^2 ^6 +'9 $c +x61D3xA4 +s%}c-3 +o1g D0 ^B +s5- +T0*76 +i0d o1h +sbp +s}\*85*0B +sYv+6E +.1 +2 +sgp +-6 +0 +$3 $3 $8 +i5* ++5 -8 -8 +$4 $a $l $l +p4 [ +$n $t $h +c 'C $9 +$2 $0 $1 $0 $+ +ux97 +*B1*02x62 ++7 -0 -0 +c ^2 ^9 ^9 ^1 +i4! +z4 x06 $u +c i67 +E $W +i9 $1 +^6 ^8 ^4 +o6T +c $1 $2 $3 $$ +i32 i39 +-6 -7 -6 +sG|'7L7 ++B x92 +c $0 $7 $0 +[i0pTA +o3rsZ"x91 +$8 $4 $7 ++B +C +C +^5 ^6 ^4 +R8D3 +c $4 $8 $8 +y5^b +^Xx37 +'8 Y3 ++Ax9Ap5 +^3 ^2 ^6 +$1Z5 +i87 +i51 i74 +o5t]x9B +^d i4= x34 +$6 $3 $4 +o2r k ++0 -6 -6 ++4 +6 +6 +^1 ^8 ^3 +$c $u $r +o0k x61 +$b $o $p ++1 -3 -0 +x61x87 +^6 ^2 ^4 +*B4-6 +x0B} +{ s-> +sTbi7mRB +s!I +,7D3 +^6 ^1 ^7 +c $1 $0 $5 +$m $u $s +T0 T8 +sxp +c $3 $2 $5 +i5M +*82^L +*31 x32 +p2 x52 D7 +o6s x71 +$cp5 +soz +^at +^9 ^6 ^8 ++6 -7 +6 +^xsxM +^2 ^2 ^4 +i31 i3a +CKs"W +^8^8^9^1 +x03 $n +x12'BY1 +^3 ^5 ^4 +x48 [ +i3a i4n +*32 ^s +svTsWw +^2 ^4 ^5 +o6v +^Zx06 +$5 $9 $4 +s9z$$xA1 +i10 i11 +^6 ^6 ^2 +*B9{t +.2 x63 +o6C +-0^h +$e o9l ++6 +6 -7 +$n $u $b +RA$`u ++1 -0 -3 +^2 ^3 ^4 +,7,5 +s'*s2x +$F $m +l ^w ^e ^n +x13 i1r +s)yx28^( +i61 i79 i88 i94 +i4q o5u +-0-A +i2l i3i +^d ^6 +i59 i54 +i0Z ++1 o0A +s1t +i81 i99 iA7 iB1 +*13 D1 +'A $0 +o5S*93s>I +x75 +6 +s`B*89i7! +^9 ^7 ^8 +x45o5E +D6^MD9 +o8q +^e ^5 +o1j -2 +o0p -1 +i3a x02 +i6J +DA $s +i79 i58 +$1 +8 +c $2 $0 $5 ++9 i91 +^8 ^5 ^3 +oAx +sN>z2 +x57sJb +x17*65D0 +tsf> +DAY1 +i79 i56 +i0J i1u i2n +lZ1xA8 +sH2x05 +x34x64 +x61 $1 +*89loB& +'9o9l$B +i56 i71 +x46 u +*04*02 +o9?xB5 +-0 +1 +x86o5b +p1x64x4A +c $5 $3 $5 +c o5c +k ^h +c $2 $0 $1 +sZT^2x4B +i0(sX. +o3H +sM/*95Z3 +c $2 $8 $2 +s{XscE +z3*A2 +c ^3 ^5 +i2i x5A +$1 $0 $2 $0 +*80D3 +c $6 $8 $6 +o0Xx7BsYf +s;w^Lo93 +'5 Z1 +^s *41 +s0+x61 +^8 ^2 ^8 +c $6 $6 $9 +i89 +c $7 $5 $7 +c $3 $3 $9 +q -7 +c $3 $3 $6 +c $2 $7 $0 +-3 .4 +x21 ^t +Y5o9ix5B +d '9 $4 +s,aT0{ ++1 ^l +o4y +0 +$W l +$0 c ++A x82 +x94 x06 +y1 +0 l +$7 $4 $6 +i9_ +^7 ^9 ^2 +$T^l[ +y1 l +0 +i70 i50 +$_ { +x95^X +D3 o0h ++0 i0z +R1+0 +o09 k +i59 i76 ++0 ^i +^0 ^e +x59*48 ++8 l +i39 i34 +oB#Z5 +o7l D8 +o3G l +*31 +2 +t T1 +$5 $5 $5 $5 +d x63 ++5 x62 +o6= +x75 $e +o1J [ +s=C'5Z2 +$8 $5 $1 +] ] ] $a +c $. $2 +^5 ^5 ^6 +y3 x45 o3n +$o $a $r +[ ^h +2 +*47*91 +$s x94 +s84 +s82 +c o63 +y3 o3n x45 +^1 ^4 ^5 +[ i2k +r D1 +s Jx92 ++3 -0 -0 +x24 $5 +x05 ^j +sE@+3iAr +x01 o3e +-4 *45 +Z1 $A +i5= +oA@ +oBA +i7X +^9 ^4 ^5 ++B +B -A +o3t ^s +c $6 $1 $0 +*9A x73 +x32 i1e +Z3*76x53 +i2V +^9 ^6 ^4 +i7msBS +oAHx76 +$@$$ +{$0 +x67l +-5 *65 +*32 c +-7 l ++1+A +[ o3z +y2 x43 +y4$yx94 +i52 i60 i70 i87 +c so0 sa4 +^f ^9 +x6BR6 +z5 x27 ++B -A +B +'A x41 +*57x76 +x02 o1z +^TsAk +Z4x24 +D2x48D2 +$4 $d +o3( +o4& +$b u +$a x73 +o5mK +o8>Z1[ +C '8 $1 +i0g *12 +Ex15oAP +x62^G.A +^1 ^4 ^3 +u $g +^5 ^7 ^6 +y3 +0 x25 +^5 ^7 ^4 +*B0^,sgw +y3 x25 +0 +DB l +i5j x45 +^3 ^9 ^3 +i31 i39 +i52 c +o74 *97 +^A c +c sa4 so0 +scfT6xB9 +*02 x42 +oBli6mx91 +i5e i7e +*24}o5R +^8 ^3 ^4 +s)Cy3 +dx47 +i37 i33 +x42.6] +c $1 $0 $7 +i9S x76 +x61 -6 +x21 -0 +$3 D3 +-7 *73 +o76 s6z +s@(x26 +c $2 $1 $4 +oAz +$6 xB4 +z2x86 +^9 ^5 ^8 +*5B^zE +'A $4 +c $6 $2 $2 +^i*31 +c $0 $1 $3 +*41ss5 +p1*58 +oA_ +^2 ^7 ^3 +'6 $! $! +i5r x23 +i4r [ +x71 x15 t +$7 $3 $6 +*64*19 +C $6 $2 +i61 i79 i88 i90 +sjt-8 +*6Bx49x62 +*68 u x03 +c $7 $7 $6 +s9Ks vZ2 +$7 $7 $3 +c ^0 ^7 +x02 ^b +$,-B +c $5 $5 $2 +^1 ^0 ^6 +$1 $_ +u T4 +c $1 $6 $6 +o6; ++9 -7 -8 +i0m *02 +*04R7*91 +$t Z1 +i4O +E r ++4 -3 -3 ++9 -8 -7 +r $1 $9 +-3 o0A +i7s i83 +i1o i2t +s +-3 -5 -3 +Z2x84*17 +-6 soh +*30 *21 +x01 z5 +^a ^h +*46x6A +c $3 $9 $3 +T7i2rx43 +i1vx72 +[ x32 +l ^d ^o ^o ^g +o5a x32 +$1 $9 $9 $1 $! +shk+7 +k ^j +.3 p1 +*14sa\DA +x82o1t +i7Q*43z1 +x15*BAE +l $2$0$0$9 +*8A D8 +'A $8 +*87x63 +c $9 $7 $3 +'B t +o0p o3e +x21 i0k +o3i *16 +^x ^A +-2 i3h +]]]]]c +^0 ^9 ^3 +c $4 $6 $4 +^8 ^2 ^4 ++C-D +^8 ^9 ^5 +^7 ^1 ^8 +^d ^1 +^# ^@ ^! +s`9y4 ++5 l +KsCu +s-kx73oAn +-4 -1 +^5 ^2 ^0 ^2 +^d ^9 +i0( +o3T +i61 i79 +i61 i79 i88 i92 +^9 ^3 ^7 +c $3 $4 $7 +i71 i50 ++0 +7 +7 +i53 i76 +^! $! +^4 ^5 ^3 +t ^L +s6@ +c $3 $8 $8 +i37 i77 +$a $u $k +i38 i33 +o8p +i8F +i52 i74 +s76 c +*53T5*31 +i5i T0 +$Rx79sb( +i4T +-2 -7 -7 +y2sJR +-8 '9 Z1 +*90u +*35 x43 +i7s l +x31 o3a +T6x37p2 +^4 ^5 ^8 +^X^x$X$x +i33 i37 +x03x64 +o81 '9 +,3*A5 +o3g *30 +$d $u $e +x83 K +x58xB9 +[ $v +x65.8s"P +$b [ +x28co7x +x12 i1j +*40 *15 +^4 ^3 ^5 +o13 -3 +x6B,B +o2t k +z3x74*6A +Cs^G] +}iBBx82 +s[&o6 s0n +-0 +7 +x03.7 +*93^J*78 ++A -B +A +^5 ^9 ^2 +^2 ^2 ^6 +$n $a $y +i71 i89 i98 iA4 +^5 ^1 ^8 +xA2i96] +y3 ] +i1F +x65+BY1 +iAQ*74 +Z2E +i1e i1a +s'r*73 +x41*1AR3 +i3d*B0 +sumZ4s&( +*74 x32 +^4 ^0 ^7 +x95 x47 +t x52 ++A +A -B +^b ^E +c $0 $1 $7 +*57 o7a +$6 $7 $3 +R6o6! +^Ex16 +x31*23 +^5 ^3 ^9 +$!$" +D1 ^b +x03 i2t +R1D1 +$l x62 +i6_ -7 +i7T +Y1DA ++3-9 +] $p +,BszCs3G +^xT0 +x69*78 +oBL +^RiB* +*81] +i9r +^CZ1 +i29 +sisx69 +x17y1 +Z2 s27 +i39 L3 +x7B*51$! +-3 ^J +$Gx59 +c $0 $1 $! +[ *23 +R7xB6 ++3 -9 -8 ++3 -8 -9 +{R3 +s!O^J +*53 *46 +xA9y2 +*09'5 +$c $4 +smdoB$ +$N { l +$x $1 +x74x74*B8 +x04 x31 +^5^8^9^1 +] R3 +${s6A +-3 +7 +$N l { +D1 o2c +i4d i5i +T0 i7_ +i0b i1a i2l +,7-7s | +o4E +^3 ^2 ^4 +^3 ^2 ^8 +{s )x27 +T9{ +x62 +0 +$l { +o3f [ +$.$/ +xB2*7B*02 +^2 ^6 ^4 +x59 t +x01 ^E +c $3 $9 $9 +$1y4 +x1AR9 +i46$7 +c $2 $4 $5 +*36 x32 +i5f i5e +o5Z +c $5 $5 $9 +o36 -3 +$F $c +*B4 x29 +i6N +c $1 $6 $0 +D2 x41 +c $9 $2 $2 +i6W +-9 -0 +o0t o0b +i0r +$c $t +$e x53 +-1 *12 +i4i i5n i6g +^n k +i0c i1a i2r +o8M l +$3$4$5 ++8sV7 +EKxA6 +i29 -0 L2 +$9 $8 $7 $6 +Y2T0 +D6 ^s +-1 -2 -2 +i5e i1e +$2$0$1$5 +,6*46 +^1 ^7 ^8 +-7 -7 -9 +^5 ^8 ^3 +x45R1 ++3 +3 +5 +^6 ^8 ^6 +iAi t ++D +F +^1 ^5 ^4 ++B+7 ++3 +5 +3 +^SxB3 +$Bx46 +*47fx76 +-7 -9 -7 +x61 x21 +i4l i5i i6n +^p -2 +-0 ^d +i8?.0 +r $3 $4 +^4 ^3 ^4 +K x41 +^m D4 +o0t *54 +^8 ^6 ^7 +x13T0 +Y3 t x4A +*23 -0 +^9 ^1 ^3 +s%,k +^2 ^9 ^7 +^4 ^6 ^4 +sBH +Y3 x4A t ++6 [ +o1K [ +i6_ +7 +s2- +tz1 +*20^rs9J +u x45 +^L.Asj+ +*27$6*6B +o1br +i9R +z1 +1 +$1 $2 $! $! +$2 $d +y1*A2 +o0M D3 +c i00 i10 +i5e i3e +o4ax3Bl +x16y5 +i29 L2 -0 +c i06 i19 +*34 o3h +*25.8x0A +^s+B'A +}x7B +x84x53u +-B s21 +iB0x78*09 +LAiAu +i4nx14Y1 +^d K +i59 i73 +t *76 +i3b*75i9" +x1B$] ++5 o37 +i34 i38 +i5e i1a +oB4iB8L6 +,2sw2{ +x43 [ +^s x52 ++9+C +l o5i +x64x39 +o95sB? +C*98 +*49 ,8 +x03 -0 +s{`^X +q xA9 +^t -2 +l D8 +$o $p $t +*67 o7r +$f $a $d +x42*28si! +$s $a $g +$s $a $x +$f $o $g +c $6 $6 $0 +d x8A +d x82 +^0 ^2 ^0 ^2 +i0e c +o76 K +-1 ^n +$n +1 u +iAt +c $0 $1 $4 +*4A$/t +i33 i35 +sgd ++0 x32 +$p $i $p +x68sdo +-0 -0 -3 +[[[[[[c +s3E +s];k +c $1 $3 $! +x34 'A +d '9 $5 +s50 +,6i6? +T0 i3s +x31 Z3 +i7| +x93R8$L +T8 t +$h $i $e +^6] +x48 x45 +k '6 +-6 +3 +*8ALBsK, +i8N +^9 ^8 ^4 +^v+5 +i1U +-6 +7 ++9 +0 +^3 ^8 ^5 +i7Pi40 +oBr +oBS l +c $2 $1 $6 ++5-0 +$Xs{6 +$+ $+ +x23x76 +T4*53r +c z1 +c $2 $3 $6 +c $1 $2 $8 +$JskS +$1 $s $t +T9xA3 +sNu*A8 +i6ds$#c +i79 i89 i95 +$k x73 +ds]Nx5B +^4 ^7 ^4 +*54 +0 +D1 +3 +o3kR1 +*B3y3 +Ex12 +i59 i77 +$n u +1 +c $8 $! +Z1x73 +i78s)wo0K +}$$ +l $- +$$ $1 +$b $a $h +.8o7z +^7 ^6 ^4 +-3 o4e +$aE +D8L6 +Z2 +7 +*03 o0l +i1d o1z +^c ^F +$w [ +x23 u +c $4 $1 $5 +o6Uc +*40 [ +*43i7VK +^9 ^1 ^8 +i0a i1l +s{-x6A +^@ $@ +x43x0A +-0 -3 -0 +$i x62 +x23 i2i +x85 -7 +o5L u +ssd +oAR l +f,3 +*13 *42 +c $2 $9 $0 +*49xB4o3h +iBh x65 +x02 o1n +]^R +i1X +sip +o9_oB#*98 +spb +T6 T4 +$rsIS +o5y x01 +i1o i2r i3d +^3^0^0^2 +c $3 $0 $6 ++0 +2 +2 ++7 -8 +9 +^8 ^5 ^7 +E$Es7- +$6 c +Y2x12sR( +D0 o3m +$_ $8 +l ^X $X +i11 i32 i53 i74 +i5k i6e +*23 o0j +x73s'F*29 +x32s[. ++6 +8 +6 +sbF +c $8 $8 $1 +^a o0t x51 +ss8T1x98 +*93 .7 -1 +^1 ^9 ^6 +*57$5Z1 +] $A +o0h *12 +^"s!- +iB$iA$y3 +$UR9*B1 +*BA xB4 +o0s ^i +*30 x23 +o9b +^6 ^4 ^7 ++4-9 +-4 -7 -7 +*01s6'*63 +c $4 $9 $4 +^mEo8. +-7 o14 ++7 +6 +^a x51 o0t +^3 ^4 ^9 +C $8 $3 +i7a i19 +x02 *23 +-1 -7 -6 +s8)^H +o5u x61 +$9$9$8 +$8 $6 $7 +$j $a $g +$a $w $e +sv8.4sFQ +^4 ^8 ^1 ^1 +spl +$5 $5 $6 $6 +o1m *24 [ +.Ax4A +se9z2*3A +s6@s"\s,q +z3 x15 +t +5 +^j x32 +$- d ] +^4 ^1 ^8 +i8W +x15T8 +c i08 i18 +o7P +D6 x72 ++6 +6 +8 +c $6 $4 $6 +]o6h +i3o *20 +i55 i70 +^A o1h +*14y4*37 +{ s`' +l $X ^X +$`,5s`d +-1 -6 -7 +*74,As't +-3 o4i +d x76 +c $2 $0 $1 $9 +i7H +o8$s@xx3B +oAR +D1 ^u +d x96 +d '9 $6 +*93 -1 .7 +spe +i0- +soT +sU$x3Bx73 +iB6 +i53 i57 +*31 o32 +i5- D0 +$t $o $e +o0j k +$j $i $b +Z2x65 +i8l i9a +^7 ^4 ^9 +p1 x05 +^7 ^7 ^9 ++6 -7 -8 +y5 } +sac +o8Fo6T*19 +} o0g +*01 x42 +s})$= +c $1 $0 $6 +i0e i1l +sHT ++7 +9 -8 +*A4Y1 +x03 $r +*10p2x1B +$3 x61 ++6 -8 -7 +i0s*30 +c $2 $2 $! +^o ^t ^u ^a +i53 i75 +i7# +^3 ^6 ^8 ++3 +4 +4 +sMhoBe$P +c $7 $8 $8 +p1l +iA4^C +*42s+Sx97 +-1 k +K^oo6d +-0 -1 -0 +*68Z3x67 +*B2+6[ +^3 ^3 ^4 +oBo +T5 T7 T8 T6 +Kx91y2 ++7sUI*79 +$e $w $e +Z3*A6x27 +^0 ^8 ^5 ++0 l ++2 o1b +i0P o1w ++3 *23 k +$8 D9 +x57p1 +$2 $0 $1 $6 +s?-*A9 +R7$, +x86 x51 +*43 k +$+x48r +*91o9[i1c +c ^9 ^4 +x05*89 +^3 ^4 ^8 +i1e i5a +$s u +sw, +$2 D4 +i2P +qx08T7 +[ i2x +*24 x03 +*9Ax47 +^7 ^3 ^6 +i19 i59 +x46 i1a k +*03 *41 +*50L6 +c ^6 ^4 +x92+6*4B +C'8 +^5 ^5 ^7 +^1 ^1 ^7 +^2 ^7 ^4 +o5s l +c $2 $0 $1 $8 +o5vsf6 +*74sI[ +T5 T7 T6 T8 +o1D +u .0 +}saT +$l$u +-8 +9 +co7@sI. ++0 +3 +1 +o8G l +$b $i $b +i4J +T5 T6 T8 T7 +C $7 $2 +$)$( +T5 T8 T7 T6 +^3 ^7 ^5 +R5*95 ++0s)Tx28 +i4i i5n +i3nx06,8 +i2pc +$9$9$9 +o6Go9#x64 +o4w u +$n x93 +l*32 +^0 ^4 ^7 +x17sbl +T5 T6 T7 T8 +x21 ^r +so0 si1 +s0I,6 +i2s k +i7c i7e +so! xA2 +*B2+8 +^6 ^4 ^9 ++0 +1 +3 +o6E +x12 ^p ++0 o4o ++0 -7 -1 +^5 ^2 ^6 +i8> +T5 T8 T6 T7 +s;NR5 +D5Z2 +i66 i76 i86 +c $9 $0 $1 +c $0 $8 $9 +-0 -0 -1 ++6 x32 +c*21 +-2 x39 ++3 k *23 +*45 *35 +^0 ^8 ^6 +o1l -2 +o6\ +i58 i54 ++0 -1 -7 +$=sKa +i0Ao6,x2B +i7w +$m $p +i2e i3l +^7 ^4 ^7 +*86-1 ++5 o0N +k o1a +d x75 +[ o4u +d x45 +o1f k +$m $o $p +-2 +3 +^b ^9 +z4 x37 +i19 i37 +$1 $9 $9 $2 $! +i34 i3a +x76 Y4 x85 +^Jx91D7 +i6i i7e +x61'9x2A +*18sIsC +c $1 T6 +x51 x03 +i70 i55 +$c Z1 +*9AE$7 +s|4o5M +c $2 $6 $1 $0 +$t x51 +-3 +6 +i58 i72 +^x c $x r +i0R +iAHu*28 +{ sHt +{ Y2 sjo +{ sjo Y2 +c ^9 ^3 +x37$+ ++3 +2 +z2TAx05 +uoAh +c $4 $! +x96*94r ++As7z +^Dy3x34 +c $9 $8 $8 +x42 *53 +o5; +c T6 $1 +'Bx69 +^h i0N +o4t x21 +skp +o7Y +i9*sfy +$7 c +o0p *40 +^g+Asg* +^w ^t +s {iBs +k i1e +,1o0C +CK +^1 ^8 ^4 ++0 -1 +0 ++B -9 -9 ++0 +0 -1 +s3}$OsQ= +s8QD9 +x12 *13 +^8 ^4 ^5 +^0 ^7 ^5 +-4 -5 -5 +i89 i91 iA1 +$% l +c $1 $8 $9 +o0k x23 +^7 ^5 ^6 +^0 ^3 ^7 +'A $5 +^HsbS ++0*32 +c i44 +'9 $k +x08y5x92 +K x52 +,6x95 +r $2 $6 +i59 i70 +^1 ^5 ^3 +^FsWix79 +*34xA9E +$a r +]sP\o8W +o8P l +$h $e $y +-6 -A +^4 ^8 ^4 ++B -C -C +i89 i99 iA9 +'5 x02 { +i61i79i89i97 +lx7Bx54 +D3 l ++4 -A +i61i79i89i96 +^5 ^6 ^7 +*56 l +d '9 $7 +^x $x c r +c $1 $2 $3 $* +s80 l +D0 o4e +o7= +d 'A $3 +i4o [ ++0 -1 -3 +$1 i0F +^5 ^3 ^8 +C $8 $2 +c $9 $6 $6 +[ o4s +Kk +]p2*9A +{o9Z +Z2s0A +'8 $y +y1 x24 x32 +x91t} +c $8 $1 $0 +$DiBx +c $8 $1 $1 +*A9^O +D5 i3o -3 +*98 x71 +*23 o2e +o4&x09*49 +c $2 $1 $7 +$1 Y3 +i51 i62 i73 +l ^i ^n ^i ^m +}p1s1? +C $6 $4 ++0 -3 -1 +-6 o56 +$>$< +sk1sG)*68 +i6ox49 +i62 i70 i81 i90 +c $9 $0 $8 +*36 x04 +svi +o67 o75 +*46 -4 +f o1S +C R0 +D7 o8i +[*B6C +o3y x71 +i70 i7a +^7 ^5 ^4 +x64*02*A9 +x62 +3 +T0 T3 T8 +[ o3l +$. ^. +i72 i3a ++7 o0S +i76 i86 i96 +[ x42 +D1 D5 +c $5 $4 $6 +{ l x74 +o2b -0 +x31 -0 +$4 +0 +^4 ^9 ^3 +.6-9-5 +i74 i52 +slfx0B +i3C +*03 o0h +-4-9 +i3e *43 +x06'9o3q +DB p3 +i6zshc +i33 i36 +i10 i15 +x6Bi3f*B2 +i31-5smO +x65^lc +*8AsqZ +^v D3 +^6 ^6 ^4 ++0 *05 +D9*93t +p2 D9 +c $1 $9 $4 $3 +x81 E +D3 ^p +o0c scq +o3_ D4 +c $9 $8 $0 +E+1 +^1 ^3 ^6 +i1y x42 +$@$. +i76 i52 +o1w +3 +c $2 $3 $0 $7 +^1 ^9 ^8 +i6.xA7x91 +o03 +1 +o8ix7Bsm# +*BA x83 +l D5 +o1$ +o03 -1 +s5x +scd +t o9U +^7 ^3 ^5 +c $1 $5 $8 +^0^8^9^1 +*AB.As.] +*24 +2 +x92C +-8,8 +sgt +*39o7c +o5` +o55 +6 +$z x83 +'9 Z1 +$!x56 +$? u +^c ^1 +x45-9+5 +x36Y3 +x02 *31 +^3 ^9 ^5 +*A6*74 +sC;x73 +x71 ^5 +sLV +sL*i4@ +d 'L +s;py1 +Z1 [ +c $1 $6 $8 +x67y1xA1 +$8 $A +D0 o3n +*74*21 +*54 i6t +$!$# +-0 i1l +^2 ^9 ^2 +sIii0Z +i39 i79 +oAh p4 +T0 T8 T3 +p2 *02 +i79 i50 ++1 ^e +^7 ^0 ^9 +$p $e $g +c i66 +x74o3q +x86p1*53 +^9 ^3 ^5 ++3 o4i +*02 i1i sih +i59 i78 +Z5y5x59 +o6] +i2R +$s $o $d +T1o1b +^6 ^0 ^8 +d x37 +*43 *52 +o6F +$q $w +i77 i52 +c $0 $1 $9 +sMK +x7A,2s62 +^1 ^6 ^3 +i73 i50 +*A1 x18 +{ x74 l +Z5x4A +^1 ^6 ^4 +r '8 +T9-2 +.3s;" +srh +c $1 $0 $! +i6_uT2 +i68*93 ++1 +2 +3 +4 +o28 +i1O +c $a $n $d +c i02 i17 +lxA1 +x15-8oBa +^8 ^9 ^4 +sMA^I +sAH,6 +x9BR7 +o4N +{ +2 +^3 ^3 ^6 +*30t +i2Rl +i8+ +i01 i19 i29 i38 +x6AsQ4*35 +r $3 $0 +soyc +i61 i79 i88 i93 +l i5t ++7i8Ix58 +sDM +$Go9nsG_ +o3o +2 +i7a i7f +y5 x92 +o0d ] +E *54 +i72 i1a +i9*${x31 +^m.At +*43 o4l +*76 o6a +.1se+*B8 +-6 D4 +'9 i8r +^3 ^8 ^7 +$* ^* ++1 +4 +3 +2 +o1C ++0 +0 +3 +^8 ^8 ^2 +i01o8A +*05 o0r ++5 -0 -0 ++5 +3 +*ABo16 +s]|-8 +$7snm +i1a i72 +$l $o $x +c i31 +}*A4l +t x12 ++1 i2g +^K x13 +o3V +*8AxB5 +sT^x2BTA +lY3 +d '9 $0 +i10 i12 ++0 +3 +0 +l o7e +saCx69 +sls ++3 -A +x96i92x05 +$1 $0 $1 $0 +i7b i7b +i7b i7e +o1R D0 ++2 -7 -7 +^c +1 +KslQ +x26,9x0B +p1x68 +*19Y1o4? +D2 ^m ++0 -C +l [ ^W +$p E +y5x06 +o35 C +c ^2 ^1 ^0 ^2 +o9> +$5$2$0 +i3d c +$;$; +c $1 $$ +i6i l +s'n$, +sa4 se3 so0 +x5BY1t +s0. +{ *15 +s0o +-0 ,3 +i0n i1o +p2 u +i1o i2l i3l +sa4 so0 se3 +o4c +4 +i9! +,0i6h +$d $y $e +$s Z1 +so! +*21 o2g ++1 +2 +4 +3 +i3e D5 +$u $r ++1 +4 +2 +3 +c $5 $8 $5 +c $4 $5 $2 +c $3 $3 $8 +o8$^H*B4 +^8 ^3 ^6 +c $6 $3 $3 +c $9 $3 $3 ++1 +3 +2 +4 +c $6 $6 $4 ++1 +3 +4 +2 +T3 T8 +$_ $9 +*43 +2 +$o $h $o +l ] ++7 *73 +sX3'9 +xB8z3oBj +c $1 $3 $8 +-1 *20 +x19y2 +]i43s9| +i7e i3e +x54 o8n +ru +^1 ^4 ^6 +x59R1 +D4 o4p +lo8L +o2d -0 ++4 o0m +i11 i13 +$0setK +^9 ^2 ^7 +s96 +'B +A +-0$? +^l x32 ++5 +A +c $6 $5 $0 +s^rxA2[ +l ^o ^t ^u ^a +y4sI7sU] +-5 o0G +i02 i10 i20 i30 +DBy4 +l *76 +c ^e +ti9k +u$> +-3+9 +k x51 +^i x23 +*90^N +$Jx3As!* +l-9*B7 +xA2 x54 +LA p2 x76 +^3 ^9 ^7 +x43 Y3 +i55 i77 +i7S +c i01 i15 +^7 ^8 ^6 +^4^8^9^1 +i5b i7b +r $4 $6 +s"`*ABo7* +sCxslZ*18 +$s t +$f $a $g +c $2 $8 $9 +*40 D3 +*59o5j +sVl-2 +$UsTs +i61 i79 i87 i95 +] i34 +x48Z2D4 +^4 ^6 ^7 +c $2 $0 $4 +-7 *76 +i01 i19 i29 i37 +^1 ^9 ^7 +$e Z1 +*04 [ +[ i4r +xBALAx84 +*30 $. +$1 *89 +*15 o1u +i3e i3a +$1 x62 +$p $e $p +o5g +'9 l +k i1s +l o2o +o0j c +i2c *30 +o71 t +i59 i74 +*17 x42 +sOjo1z +i5e x23 +r $5 $9 +c $3 $0 $9 +i41iA0s&) +sUSi4c +^4 ^9 ^8 +C ] +c $2 $5 $1 +Y3*3B +,6Z5x19 +^m -2 +sa4 so0 +o9g +*20 *43 +^7 ^6 ^8 +^r -2 +sr1*32 +c $5 $3 $1 +^1 ^4 ^8 +i60o9r +i71 i3d +*35 *54 +*50 *41 +^5 r +L6oB@D6 +i9k +$*$! +E ^P +sae D6 +*85 D8 +x05*23 +]x43 +*39,7*A1 +c ^e ^h ^T +*05 [ +i7nx81 +$h $k +*81o1d +d x94 +o1s c +^U .0 x45 +'9 C +z1 $y +D5i0T +-8.B +^2 ^8 ^7 +x62 i6m +T4 T8 +-3 t *64 +s0 +E$Y +D3 o1h +*B2,7 +^3 $2 ^2 $3 +C $6 $5 +i3a *35 +^2^8^9^1 ++7 -9 +8 +^\ x04 ^B +o2" +[ -3 +o3J l +-8x86 +s.r^m +i72 i50 +D3 *34 +x21 o1n +i57x3A +y5 x76 +x47y4 +x56L7 +x4B$!xB4 +c $5 $2 $1 +^*s)# +i1i i2s i3t +c $2 $0 $7 +sxHx36*12 +*75*1B+8 +i3, +$8 $3 $6 +sLN +^3 $2 $3 ^2 +^9 ^6 ^7 +c $3 $2 $7 +^4 ^2 ^8 +^2 ^2 ^8 ++3 +3 -0 +i7a i7e +-3 *64 t +-3 -A +d $2 +u i7r +c $4 $4 $1 +x52 -6 +i3h [ +i3c i71 +i3C x02 T1 +x3AD7Z3 +o4= +c o60 +$_ $0 +Y2oB6y2 ++1 o2w +o7ox76.6 +s{`*79 +co6g +i71 i53 +i7oxB9 +^5^0^0^2 +c $5 $0 $1 +*A7$o +'B o9i +^1 ^9 ^4 +^1 ^9 ^2 +o03 ^< +x41 $9 ++8 -7 -6 +$3 x71 +C $5 $7 +D0 i2j +.A*12 +x75$= ++8 -6 -7 +$_R9 +$1 $b +^7 ^9 ^4 +'9 i8e +$bY1 +iB5 +*79+8t +c $2 $0 $6 +x62 x02 ++3 -0 +3 +*04 +4 +x59$xx93 ++7 +8 -9 +sTd*20 +x37i0Jx41 +T9x61 +x28i3i +i52 i60 i70 i83 +^U x45 .0 +sAi$^ +^l +1 +o0w *05 +y4 x32 +skq +$T+8 +$4 x81 +R6x91 +^8 ^2 ^7 +*41 x32 +L7x1B +$t $u $x +*02 +5 +y5 x67 +C $3 $8 +*06$1 +LBo4$t +i72 i5a +i2l i3o +u [ ] +d x29 +s - +$r ^A +x08y4 +x12*4B.B +i75 i7a +i32 i36 +] ] $o +D7 -7 +$*$/ +x1As x^m +.2Y2 +x84 $6 +r $8 $4 +iAJ$/ +i61i79i89i98 +'8x1B*43 +c ^8 ^5 +y5 y1 +u ] [ +C $4 $2 +C $3 $5 +i5Y +i1e i7e +x74sP{ +[Y3E +x58 T0 +-8+B +*28 x42 +$5 *76 +i3b i71 +D1 p1 +i55 i79 +$L*2B +^TD2 +o0wx39x68 +i7c i7b +^o D3 +i9B l +RBx82*B2 +*AB+3 +,Asbdi9G +i1J +sW/.8 +p3 .3 +i57 i72 +i30 i37 +t x92 +x68s&# +t x42 +.AxB5 +$#s^K +x17c +$|x79 +^& +smw^K +,5i6j +x7B,2 +loBB +xB6$1^q +sJM ++2-1 +xB6} +^1x93,A +-4 -3 +dx64sC. +x57.6 +*79x9B +s$b^Y +^3 ^0 ^8 +^3 ^0 ^7 +^GsJ@ +o3< +^8 ^4 ^8 +^3 ^8 ^4 +^4 ^5 ^7 +^8 ^8 ^6 +^8 ^3 ^8 +x49+2i0p +toA"x7A +TAZ2 +l [ ^I +sMg^- +*34 +0 +z1 i0u +i5g D6 +] $n +^e x31 +i0b i1e i2n +c $7 $1 $0 +c $6 $9 $0 +sD+x48^W +*3A^V +o80 T0 +T2sZ] +i7a i5a +*67 o51 +} i0S +x98 x46 +s78 +[ *20 +x42xB5 +x78 $m +,3 *37 +y2sG[l +*36 x62 ++3 -1 -0 ++3 -0 -1 +x98x67 ++5 +5 -3 +^Rx3Aspm +-0 i0c ++5 -3 +5 +*12 k ++A DB +D8 o85 +$8 c +o6kxB4 +i61 i79 i87 i96 +-7 o69 +i0f -1 +*36 D4 +^l ^o +k +3 +-5 x02 +*03 o1y [ +o5q +*21 -3 ++1 o2g +o1k ^s +Z1 x03 +$2 +7 +$k $e +^s ^c +t $d +7 +p2 x35 +^m x24 +[ i4n +s7Uy1 +x25z2 +x74i8ms'* +x02 o1. +x37y3*17 +^7 ^3 ^4 +^n ^i +o6'x49 +i56 i74 +i6i i7n +^3 ^7 ^6 ++1 -0 +1 +i0g i1u i2i +s1s +x08i3! +-3 +5 +^2 ^6 ^7 +D6x54 +$0 $6 $0 $6 +o0+ ++3 +3 -8 +*9A x54 +sr.x65 +t^L +i6a +5 +s6Asx] +*86 o8s +p5 *39 ,8 ++8 +8 +A ++4 k +$5 x52 +^3 ^6 ^4 +i1e i1b +$a xB3 +i1lszksy{ +c $9 $7 $7 +o4Q +Ks8K +c $0 $8 $0 $7 +i5R +'8 +0 +i4s *06 +E } +D0 Z2 +$dsfM +i61 i79 i88 i96 +i1Y +^m $1 +^1 ^5 ^7 +rx69^f +*32p1 +^4 ^0 ^8 +y3x67K +i5a i3e +o0w *14 +c -7 +s5Uo0I +sHB +$U*0B +*53 -4 +s9dsgl ++3 *31 +t $z +xB1sBP +x43 y4 +*32E +R8x74 +p5 ,8 *39 +$j $u $g +c $3 $1 $5 +x03 ^u +$]x7A +sID +T8+8o0j +} +4 } +^x *20 +{ $a +$Jo8; +^8 ^7 ^5 +ssp +o2' +$9 D5 +$Eo9* +x78$= +i32 i3a +-1-9 +^1 ^2 ^0 ^2 +C $5 $2 ++1 +1 -0 +^S D2 +o33 *31 +$@.6 +$w $o $k +o0[*1A +sCri4@ +o2y T0 +i61 i72 i83 i94 +^Rsfy +c $8 $8 $6 +^m x32 +]$RsI] +c $8 $7 $6 +$G c +c $4 $3 $2 +s`5i8].5 +^a 'B +c $8 $8 $7 +-C -E +c$v +*87xA1 +-8 -3 +x46*B7 +xBA$s +z1 p2 +] i3k +r p2 +D5 *65 +oAc +i56 i77 +K Z2 +p5 o1g ++3 -8 +3 +s01 +^s *42 +s/Zx94x75 +$f $5 +[ *43 ++8 -1 +c $7 $5 $0 +x01 o2r +s^Y,A +*30 *17 ++0 -B ++6 $A +$u D9 +x25*14*41 +u $o +d '6 $1 +L5*03 +^Zx47 +o3- *20 +slf ++7 -6 +8 +$8 $! +^= ++3 o0c +$h $e $w +$Kx94x58 +o2( +x21 o1x +D0 i3m +i6^ ++7 +8 -6 +so0 $! +o8V l +d xB4 +c$1$2$3$_ +$1 +7 +^5 ^1 ^7 +{L5 +i3e i5d +r $3 $2 ++8 +A +8 +i52 i60 i70 i84 +r $0 $8 +c $2 $6 $0 +i8esSW +L5$Rx93 +std*B5 +c $9 $5 $9 +] d u ++8 -A -9 +^d x32 +s}7x25o0C +^8sHc-9 +$1 $* +c $$ $1 +i1T +T8sQvo9/ +x79o64 +z1 i1_ +[$4 +i8as\e +s3e +c 'B $6 ++9t +cs)xx46 +$!x97 +-B $3 +D1{ +Y2x86 +$7 x52 +oB5 DA +y5sW; +u xB2 +*32 *34 +^m o3i +i6h i7e i8r +i71 i3c +*03 o3w +*35 +4 +D7 x87 +*56 -4 +x73T6.1 +l $s +x9A p2 +i48+7x6B +^3 ^7 ^4 +$msDY +.5*A1 +^6 ^3 ^7 +o8f p3 +lR9 +x59$} +ses +u 'D $9 +*02 o3m +-9 s09 +^7 ^2 ^5 +^7 ^9 ^8 +r $5 $6 +^y x41 +] Y1 +o7& +$v $a $t +i1i i2c i3k +$ $5 +Z4iA2x29 +x59o5g +o2R -4 +xB2*49$< +sv,y1 +i2n i3d i4a +*27+6 +-5 '7 +^% +o8P +i31 i36 +.1*79 +o2+*97 +^l x41 +-3 D6 +] u d +y2xA7 +l x72 ++3 -7 +3 +x03 y2 +D6o6QR5 +sen +z5 x26 +c o44 +oBt +D1 o2g +s28 T0 +*57o9Ko5s +DAszmsysrmE +R6'8s!8 +i5- 'A +Z3szM ++3 -2 -2 +K +1 +i58 i79 +i4o -3 +d x84 +o2yi92 +$/s(5 +i4r D6 +$2 $0 $1 $0 $_ +oB+ +x41x01 +^axA2 +f*05 +o9%.6 +$9$9$6 +.1x27 +sGK-8 +-3 -6 -3 +s?<.2 +i71 i89 i98 iA6 +*51 [ +^9 ^2 ^0 ^2 +*57-8 +[ o0S +Z1 { +u d $2 +Ck[ +o3/ T4 +3 +c $3 $0 $4 +i75 i50 +c $_ $9 +T1 o08 +C*86x72 +o6J '8 +$s x43 +$$$! +c $3 $0 $1 +o3/ +3 T4 ++6 -8 +6 +i9< x82 +o2w k +$h p2 +^7 ^4 ^8 +'8 $s +o1S c o0t +-3 -3 -6 +i1a i3b +^VRA +o3m x41 +*10 o0M +$%s2\ ++7 *84 +x42 t +o62 +5 +,4s&n +c $4 $7 $7 +.4 Y1 +-0 -7 -3 +o4a x21 +u +2 +.AsuJ +T7Y1 +^9 ^5 ^7 +i50 i79 +o8G +c ^. ^1 +snr +D4 ^x +$1 $E +x54s%g +^`sC"l +c o24 +i4a i5k ++A$W*B6 +l [ ^O +p1x29 +^Jo9G*0A ++1 +1 +7 +Z2i7C +T5 T4 +i81 i99 iA8 iB4 +o44 o55 +$8 D4 +*68y2 +i72 i80 i91 iA0 +o55 +7 +i51 i5b +*98x72 +o3p *35 +$Z $9 xA5 +$# l +[ o0N +.1 .0 +D9$0*74 +o0t ^B +T4 siU +i19 i35 +i9E +i19 i36 +^N*48 +$y u +^9 ^3 ^4 +x04 ^l +i5a i3d +s8?^! +x7Bx14 +z1 l ++8 +9 +A +R5^S +*13sw&s'? +o9bsy! ++6 +7 -8 +c $3 $2 $8 +o10x54 +k o1- +i6@ D9 ++1 +2 -3 +c $0 $2 $5 +Y1'9 +*B0x61 +*54*67,8 +R8^sx83 +si!x32 +o0s +6 +s1z +i2A [ { +x01+0*79 +^8 ^8 ^4 +] $c +$4 x21 +o0e i1s +x4Ai1u +i61 i79 i86 i95 +c $3 $9 $0 +$_$@ +sdwsI3 +$v $i $d $a $l +k o34 ++8 +A +9 +RAo86o1! +-2 Z1 +d x62 +sRtx47 +Y1x76x78 +-8T1 +o8A +x84 *78 +x12 ^e +*50 x43 +oAg +*A4 +i2x*48 +i54 i71 +x81D0 ++8 *78 +swIc +-4T7i0d +x34Y3 +x25o5qr +k o2g +u -6 +sOz$C +R4*89Y1 +^9 ^4 ^8 +scj +$4 D7 +sfb[Y5 +d x04 +^2 ^8 ^4 +o7_ *76 +xA1*6AD8 +xB5 x83 +x14 ^s +y2 *14 +u d $1 +D0{ +i3f i3f +Z4x38x8A +i5e i70 +^c *12 +*23 D1 +i7z +*A6R6 +*45 D0 +x82 *81 +o5w x02 +^9 ^1 ^7 +sMD +shw +E -0 +li8Ox47 +-5 *53 +^3 ^2 ^7 +$KsDS +^6 ^2 ^7 +i7k i8a +stj +^d D4 +-2 x52 +*72^Gs=) +*90 ] +*34 l +x74 f x39 +^.s+r +.7s*6 ++2 D5 +i57 i71 +^Zx49 +qx1A +$_ $- +-4 o2t +i5d i7a ++3 *52 ++1 +7 +1 +x65i8Q +$o $h $m +y1[^O +R6o9v +$,x59 ++9-C +iAV] ++6 -8 +7 +$aD6 ++5+A +i0N i1o i2v +i0k D4 +i61 i79 i87 i94 +c $5 $8 $0 +o3z l +T6 T5 ++1 -3 +2 +i62 i70 i81 i97 +$2 $0 $1 $0 $? +i97 E +sdn +$A $v +sWiss.+9 +s9k +$i*B9 +u ^x $x ^x $x +c $5 $6 $2 +i11 i17 +*15 x52 { +u $x ^x ^x $x +x34D5*B4 +i41 i59 i68 i79 +$n x51 +x12 E $l +i7E +T2 y2 +RBK +c $2 $4 $1 +sL^$A +x13 ^m +c $2 $4 $3 +x95o6l +i55 E +Y5 x63 +^1 ^1 ^8 ++4 +5 +6 +7 +*23 D4 +z5 x16 +u $x $x ^x ^x +u $x ^x $x ^x +x84-5 +$B E ++4 +5 +7 +6 +c $2 $7 $2 +-3 *20 +o0`sbMx75 +-4 D5 +i9g +i52 i77 +*49sO,*78 +o3s -0 +c $2 $2 $! $! +c $_ $3 +{ TA +*A1 +i71 i89 i98 iA5 +x61 $5 +u ^x ^x $x $x +*92E^( +} -7 +u D6 +o4i x59 +-6s'w +o2c x31 +i59] +i78 i55 +'7DB*1A +o57R8 +s_'oA"L6 +i78 i53 +$2 x82 +x59 x03 +D7 D5 c +ks^oo21 +{R7 +c $3 $1 $7 +D3 o0S +[Cx84 +i53 i79 +x43*32 +c $1 $5 $2 +t -3 +Z1 $y +i5a i73 +[d +i98 +-3 -9 -3 +i7f i7f +xA5 K +-1 o01 +*61 t x23 +s9* +^0 ^4 ^6 ++4 +7 +5 +6 ++4 +6 +7 +5 +D0 i4o +^5 ^2 ^7 +s0! +] $m +s . +i3a i5c +} o0b +x32 ^e +$s o7m ++1 x52 +i2i i3l +.2iA'y4 +*5Ai4u +$1 $2 $2 $7 +d x34 +,6x45 +^8 ^9 ^2 +ktx93 +KC +z1 i1_ x28 +i8i i9e iAs +D7 c D5 +i2U +c $7 $9 $9 +c r T0 +u ^x $x $x ^x +*25 ^j +s*;*A2i5q +i5e i3a +x48o2gx27 +$,sNq +*23 *05 +ssgsH| +i42 i53 +-A -A -B +T0 T5 T8 ++4 +6 +5 +7 +k c +'9 i8t +Y2*9A +*82E*54 +x85s|`c +-3 -3 -9 +$2 $0 $1 $9 +c $3 $4 $2 +i61 i79 i87 i90 +*85 x42 +c $4 $8 $4 +sDZ ++1 ^z +^n x31 +*58 *30 ++5 -4 -4 +o2t +3 +^c *01 +0 +KsBRL7 +R3snC +o6s ^A +o0B i64 +c $9 $9 $! $! +T0 i6_ +seo +i0No8Q +T0 T8 T5 +^y o0r +[ $4 K ++0 o44 +*23 x42 +*64 x61 +snul +*61 x23 t +i10 i19 +$! [ +[D4s % +x61*AB +c +3 +^t *15 +sgy +i32i40i51i60 +i57 i73 +z4 *59 x16 ++4 +7 +6 +5 +i4k D2 +o3K *02 +*B8^Hx82 ++8 -5 -5 +*B8$Ks"t ++3 +A +x32 k +-A -B -A +Ks1Ss<_ +x51 [ +s0px51 +q*54 +.2i3r +o11 -6 +i7f i7a +-1 -9 +-5 x14 +{ T7 +c $0 $0 $! +x71xB4 +x9BR7Y1 +iAjsx] +x41 D1 +sbj 'A +$zs-? +T1 T3 T5 T7 +i53 i78 +o0Zx6B +*68 i6_ +*56 o6b +T1*46 +y4 [ +y3xB9 +$l $i $n $e +r $3 $1 +$, x93 +i55 i74 +T1 T7 T3 T5 +i71 i5c +sr?y2*A0 +$1 $C +D0 x23 *30 +] x51 ++8 +A -9 +o1H +i42i50i61i70 +dx31 +D1 $3 +i9# +sa)i9. +]*78 +x74xA7 +o5n -5 l +c $4 $8 $0 +^9^7^9^1 +sEQt +i6n l +T3 D6 +D8*52 +i59 i75 +*47 D4 +c $4 $2 $6 +x41 T3 +iB! +o6L +$p x92 ++1 ^J +c s10 +[ ^y +]x06*38 +i7c i7c +x54 i5t ++1 i1l +k x43 +c $, $1 ++5 -A +i41i59i69i77 +c ,3 +r*94{ +d x27 +d '7 $3 ++By1 +k o2d +E $Y +^y ^a ^l ^p +x32 [ +.4 [ +$. *41 +x61 i78 +c 'E $4 +$w $a $l $t $z +s16 l +o53 ,3 +T1 T8 +x12 *31 +x71 o6h +i6e l +Z2 x43 +i0y i1o i2u +,2 ,1 *02 +c$1$2$3$% +c $2 $. +T1 T5 T7 T3 +] i66 +'B $m +x47*9At +*75 D4 +o4u x02 +y3y5'4 +c $2 $0 $1 $7 +i55 i78 +i51 i5d +$d $u $d +i01 i19 i29 i34 +sv3 +o8R ++E+E +^7 ^8 ^5 +c $4 $0 $5 +o65 +3 +*5B$% +] $l +$0Z5 +-3 o0G +sS$Z3 +i57 i75 +o5n l -5 ++8 -9 +A +*29x06,B +$5 T6 +i8qz3 +*04x21f +o1O l d +o4H +x06^u +i2l x48 +c 'E $0 +x87 y2 x05 +x04 i0d +y1 *21 +f] +x7BRB +T1 T5 T3 T7 +Z4x04 +{i7` +^3 ^3 ^7 +^Io7bsFR +T1 T7 T5 T3 +,5x41 +rd +c $9 $0 $5 +sJN +$]o9J +k ^M +i70 i56 +-5xA2 +*8Al.5 +} y5 '7 ++7 o6_ +i71 i80 i90 +c $4 $0 $8 +i4isal +c 'B $8 +^3^8^9^1 +rY4s7H +-7xB3E +r } +D4+5 +$1 +6 +{ Y4 +i81 i99 iA8 iB0 +o8= +c $5 $0 $9 +^d x31 +D7 T6 +T4 $1 +T1 T3 T7 T5 +o4t D5 +*32 i4s +D0 D1 +$'sQg +x01 i4u +o5( +x02 $g +o0cy3 +*25 +2 +c $1 $3 $6 +s6Q +slS +$z $x +x43i4@xB3 +D1 $1 +i3b i1a +*A0[ +p4 x31 +LAEsn9 +*30 x41 +*65 c +i78 i56 +o1O d l +i5_ [ +i41 i59 i69 i71 +D7 o5v +-6-A +} ^d +i54 i77 +*76$\x09 +*30 o2y +*42EsO< +[x21*29 +c i02 i19 +x02 i5e +*25toB" +o5j *50 +sgj +-2 +5 +^f *21 +^3 p3 +y2x39 +c $_ $8 +o6[ +c T6 T8 T2 T4 +^k ^o ^o ^b +*B2i56 +sa4 so0 si1 +Y5 x91 +c T2 T8 T6 T4 +o0- +DA *BA +$2 $2 $3 $3 +*7A x92 +c $7 $8 $5 +c T2 T8 T4 T6 +Z2*4BxA1 +*35 i3i +*20 x41 +-9 l +i8x '9 +c $9 $4 $4 +c $7 $7 $9 +i13 i13 +iBAkp1 +c T8 T6 T4 T2 +C $5 $8 +c d '9 $1 +x93 c +*10R5 +} ^j +o5% +[s\e +*20 p2 x14 +*78x38*18 ++5-A +c $5 $6 $4 +E -2 +c $8 $4 $4 +i0a i1l i2i +l ^u ^e +c $1 $9 $5 +i8K,B} +^q +1 +ssXs4o +i6a l +$Ex83 +c T8 T2 T4 T6 +^5 ^7 ^5 +i11 i14 +^2 ^5 ^7 +o5k D7 +p5x68 +^2 ^8 ^6 +c T4 T6 T8 T2 +^4 ^3 ^8 +o70i7z+8 +^9 ^3 ^8 +*15 +3 +sl% +sl@ +t -7 +c T8 T6 T2 T4 +s"-Y3*A8 +$e l +o8r x71 +i2Z +c T8 T2 T6 T4 +'8$#sU- +*32 -0 +i12 i34 +r $7 $4 +i41i59i69i75 +^7 ^5 ^8 +c T6 T2 T4 T8 +i9q ++8s-v +i24{ +^Tls @ +o4NsYx*8B +.8x02x1B +[ i15 +.4o6K +svp +*72x42o68 +c T4 T8 T6 T2 +c T2 T4 T6 T8 +*A5x67x97 +*38o10o9H +D2^J*89 +]qsqj +$<$k] +iAt 'B +i0l +x63 i18 +x05 ^w +x01{x3B +'8 $h +{ p1 y4 +i3\ +$m K +x65*01 +x71 K +c T4 T6 T2 T8 +C*25 +s";.5 +i1a i2i i3n +*87o4x +i32 i73 +c T2 T4 T8 T6 +c T4 T2 T6 T8 +l ] $x +-6 [ +$B $d +x2Ay4*0B +$1 $9 $9 $0 $@ +$w+B +Y1 x73 +$4 -9 +c T8 T4 T2 T6 +x42 *13 +o75 t +Z1i9j +c T2 T6 T8 T4 +iAk x82 +c T8 T4 T6 T2 +D6*B7 +c T4 T2 T8 T6 +u $p ++8t*90 +D3*02 +.B*8Asb= +-6 x82 +c T6 T8 T4 T2 +$y $u $k +-Bs$_$T ++1 o0b +x26x46i1j +*14 ^t ++5 s36 +$` l +^1*18 +-4 Z1 +x9Ax15 +sqkDA ++F +F +F +c T2 T6 T4 T8 +,1s}% +qx18sQX ++0 -9 +1 +sa4 si1 so0 +xABx34 +x91i2k +$1 $1 $0 $9 +$a $n $a +c T6 T2 T8 T4 +c T6 T4 T8 T2 +i8b ++1 -8 -8 +$2*59x96 +*B7qx8A ++8 -3 -3 +o7_s>1 +-E-E +Z1 o0K ++0 -1 +9 +sdfDB ++0 +1 -9 +o6A*94 +s0AsXGs-y ++0 -2 +0 +x06p2 ++0 +9 -1 +,3 *31 Z1 +sSZ ,3 +uY1*89 ++0 +0 -2 +x97^i +Y4x16 +,3 Z1 *31 +i61 i79 i89 i97 +k i13 [ +-2 k t +i32 L3 +c T4 T8 T2 T6 +rx02 +i62 i70 i81 i96 +-2 t k +i8V +R7*90 +i41 i59 i69 i73 +c T6 T4 T2 T8 +xB5o1L +x01x43*A2 +y3x5A +x9A[*67 +i1s i2p +x49se1 ++B l +.4 k +,2 *34 +$9$9$7 +cY3 +{ o0G +i1Z +i58 i78 +o7> +d x95 +uls,h +x12$s*27 +l*B5*B5 ++5 -1 -0 +$.xAB +i0M x71 +l T4 +-2 -5 -3 -4 +o3o D5 +D0 Z2 E +sG=xA4i74 +o6u -5 +-2 -3 -5 -4 +u T8 +i57 i79 +,8xA1o5n +x86i7H +s8@ +*46*92*A8 +slFi77 +o88 +9 +sc[^V +^y x32 ++5 Z1 +^7 ^0 ^8 +^1 ^1 ^6 +*81 x63 +siks];D9 +] [ k +$#$! ++4 *23 +^4 ^7 ^3 +L7c +i5_ ] +i5S +] $0 +u 'E $5 +i72i80i91iA0 +i36 L3 +o6*sbDo6t +D2 ^f ++8 '9 +$3 $b +^A +1 +Y3iBR +i72 i59 +i6Rs"/ +-A+C +*79o1r +sZ\x36*53 +s0- ++5 -0 -1 +.5*78 +C $7 $3 +sm)sbex69 +c $4 $5 $1 +d x56 +*79 x21 +i31i49i59i65 +p5 $G +o9# +i72 i80 i90 iA0 +s\9o7xs]3 +u .3 +x52 Y5 x76 +-2 -4 -3 -5 +*51sqx +$c x73 +Ex15 +-2 -4 -5 -3 +o08 D9 t +*1B +sSB +-2 -3 -4 -5 +L6p1 +$6 *9B +o8TsT@ +x02 ^A +c $8 $0 $9 ++2 i2d +*54 x23 +*43s?. +sk6*81] +$p $a $p +^7 ^3 ^8 +i2y i3a +-A +9 +Y2 .5 +x56o7l +c $6 $2 $0 +o54 *02 +i0t i1o i2m +*7B x19 +-2 o1k +o6& +x24 y4 +o08 t D9 +$6 x53 +^1 ^0 ^7 +D8 o7_ +o2L +r $0 $3 +D0 E Z2 +svYx45 ++0 +7 -1 +*31 D4 +R1$.x07 +y1 D6 [ +'8 ^a +s!7 +*A2Y3xA5 +i59 i68 i71 +c $4 $0 $1 +l x53 +c $1 $+ +$c $5 +T7-1 +-3Z1 +Z1x36o60 +*79i2x,6 +iBb +oBmo0c +x18 ] +p3 i4c +xA5*04 +C $6 $8 +$1 $D +o2p D4 D0 +i30 i3a +i3n l +*62 x03 +$6 $^ +c $1 $2 $7 ++Bz3 +i7a i5e +o7H +*03iAT +d '7 $9 +*86sgo*69 +,7 x42 +c ] Z2 +sso +K $X +s^YTA$D +$s $e $w +x62p1 +-2 -5 -4 -3 +i61 i79 i87 i99 +x13Z1 +sfa $2 +i74 i7e ++0 -1 +7 +^4 ^7 ^6 +c $1 $2 $9 +o67 +8 +x19Z5 +i71 i89 i97 iA6 +c $0 $2 $6 +o4A c +i72 i80 i92 iA0 ++5 x01 +smz +*97s\xi4h +$2$4$7 +*65 -5 +R0sONi0i +d x06 +-1 i1l +s'Sx15 +^1 x17 +o6@ $1 +*46 +4 +y5 x0A z1 +x8A*A6o2+ +d 'A $2 +o2o i2j +o2b [ +u $? +s|0}st2 +.5s0a +u d $8 +t o70 +T2 o02 +i97xA3Y1 +i71i89i99iA7 +s-1^Ks5c +r x41 +^d *64 +i2q +D9 o7a +o0z x13 +s@3o3l +T5o5b +x62x72s^; +f *02 +x23 Y3 +o5P +x42 D5 +i1a i3f +Z5 '5 { x02 ++6 x02 +so0 T1 +c i71 +s>ql$J +x43oBU+5 ++7 -8 -6 +*73 x52 +C $5 $1 ++A -8 +A +x34 t +k o2l +i81 i99 iA8 iB3 +i84T4 +c $5 $4 $0 +s.7*7B.1 +^B l x42 +i7e i5a +o4m +0 +[ o1d +c o0p +$5 -8 +*40 *89 +*52 +3 +c $2 $2 $2 $4 +x08 E $9 +^B x42 l +$4y1l +o8i*7A +x08 $9 E +i54 i5a +T1 +0 +l $7 $7 $7 +^7^0^0^2 +*BAx94$h +$2 $0 $1 $7 +c $7 $1 $3 +qs{cx48 ++1 x23 +*B7^g +so0 se3 si1 +$9 $9 $! $! +$k $e $g +[ $. +c $4 $4 $3 +s1i*82 +*B9 'A ++0 i2j +c $9 $7 $8 +*76i0- +o25R4oA! +l $6 $6 $6 +c $x ^x ^X $X +y1xA4 +i1u i2n i3t +^1^8^9^1 +^Ls^!*78 +{i7Ep2 ++3 -4 -4 +i62 i70 i81 i95 +i41 i59 i69 i74 +c $0 $9 $1 +i2W +i71 i89 i96 iA0 +i2L +,9y5 +i7a i8r i9t +d i3, x07 +i6a i7r i8t +-Ai3y ++6 +1 +c $8 $9 $9 +s0H +i13 i11 +o2c x41 +c $x $X ^x ^X +-2 l +$f $9 +spksa_*B9 +x25 p2 +x61 i76 +Kx28 +r ^o +c ^x ^X $x $X +TA +3 s^i +C $7 $1 +o06 +1 +i7= +i3B l +$8 $* +,9Y3i4m +$d+9 +T0 T7 T8 +[ i5i +x52 *41 +l ^d ^i ^m +*74 x54 +x39*15 +*16x13 +s.9 +l $8 $8 $8 +x43 i4@ +sDM[ +l $3 $3 $3 +c ^x $x $X ^X +i5c i7a +*98x95 +sue +i78 i50 +*10 ^a +$c $6 +[ i6i +$7 D2 +^2 ^4 ^8 +D9 x81 +9 +o8_*39y5 +*8AZ3sim +sP(z2 +x12 i2k +K.5szM ++0 i4z +^M +1 +} ^P +c i02 i18 ++7*67 +c $6 $6 $2 +Y1sJ&l +*93 x61 ] +c $6 $7 $7 +^4 ^8 ^6 +o2l T0 +i71 i89 i97 iA3 +} ^l +^1 ^3 ^7 +ss9snl*36 +sUH*7AxB4 +x95 i9y +*91 o1a +i3Y +x45 *12 +i01 i19 i29 i35 +o2wso0 +T0 T8 T7 +$1 $5 $1 $5 +i61 i79 i88 i91 +x54p1x9A +s1A +Z2 T0 +x3Ati0V +i5d i5d +c $9 ^6 +x07Z2 +$2 $4 $0 $4 +c ^1 ^0 ^0 ^2 +x52 D9 +o6P +*90*04 +*93 ] x61 +$t $u $g +Y2 x61 +*56 o5d +x05*B5Z2 +o4C ++2K +c $x ^x $X ^X +o4( +so0 si1 se3 +Y5KxB7 +-Ao6h ++A +A -8 +c $. $3 +o7?^O*82 +Y2x15s Q +Y3x86 +s%9y5 +$f $4 +o37 o11 +o6l slD +$o-9 +i4t i5h i6e +i7D +i62 i70 i80 i91 +C $3 $6 +c ^6 $9 ++9 +A -8 +-5*82 +s5Mx14 +$Bs]{ +x15'3 +^2 +8 D2 +Z2 l +i6e ] +c ^x $x ^X $X +c $3 $3 $3 $6 +*24 -0 +x28 x17 +^o D4 ++9 -8 +A +*57 o0K +i7Is!W +-4 x03 ++7 l +*24 *01 +s52 -6 +^2 ^7 ^6 +z1 ^i +x86x48 ++7 -6 -8 +-C -D -D +D7x04y4 +si/ +s+0*3B$^ +c 'C +c $4 $5 $8 +x92Z3 ++2-9 +-6+A +].4 +} $D } +x7Ai8l +$x x71 +i0a i1r +x12 *21 +^7 ^9 ^7 +x03 +2 +$j $a $b +*32 +5 +$0 $1 $0 $9 +EKsv> ++9 D7 +syUsWGs8c +i5c i3a +T9s6;i7h +iB]Z1 +$p Z1 +xA1 i0Z x06 +.6T2 +oB"ss.sWf +KZ2Z1 +D6 E +*01,B$l +^I*0B ++5 -2 +5 +^G E +i5b i5b +^j x51 +o6p $s +-0 i2t +x32snY-4 +i1A x41 *34 +$z*89 +sLG +*02 i3p +[s=dx67 +$2x63 +i50 i73 +c $2 $0 $8 +*63[i7< +$, $1 +T0 $6 +$ $3 +u $t +u$4$2$0 +sKG'B +^C -4 +o4X +$2 $0 $1 $8 +oB"o8e +o13 t +*2B^Msr1 +$f $8 ++0 +D +$k x92 +Z1szIiB2 +y3xA1 ++D -F +c $2 $3 $9 +x93 x82 x96 +*95}o3r +i19 i33 +D7}x58 +,5x25 +x13 ^e +^c x05 +*76 x74 +c $3 $0 $7 +*51{,A +x01 o1a +*18x0B +-3 -9 -5 +}K +Cx51 +i0o*A9'4 +xB9x15x82 +i3c i5e +D2 y1 +o32 *32 +x35o0k +$2sTL +u 'D $3 ++2 +3 -0 +y1 ^i +$d $i $d +^l}^z +i6!*56 +x81 o8s ++9 o8i +c $5 $3 $0 +o4V ++4 x03 +^x z1 +^3^7^9^1 +,5y3sJ% +z2*28 +i0m i1e +xA5$_ +i73 i7a +s!V^ZTA +o4, +$1 $9 $0 $3 +*10 o1. +$c $o $g +x31ts5( +y2 x64 +*98 +9 +i3a i4c +i41 i59 i69 i70 +z1 i1i +DBD6 +-8 -9 -A +x52 p3 +r $2 $9 +y1*0Ai7w +dx35 +o9D],2 +y3 x45 +i1S +i4-$h +-8 -A -9 +K .1 ++2 -0 +3 +^9 ^4 ^7 +xABL8scj +E $o +D5 *45 +-9+8 +^6 ^9 ^8 +^y$0 +$1 ^. +^d ^h +T5 } +s/,y4 +R6^F +^8 ^3 ^5 +y3x63 +o6.*A6s'\ +-4 *02 ++4 x62 +i64 ] +x93 x08 +i79 i5e +-3 -5 -9 +o7$ s$b +,6Es]v +i19 i39 +i61 i79 i86 i94 +*02 ^y +D6 ^t +c $4 $6 $8 +*67 o7c +^c D5 +} x06 +*34 o2t ++5 +5 -2 +o8u D7 +o48K.9 +o37 *20 +s2A$\ +^a *20 +^S +1 ++0 -1 +2 +z1s6G +-5 *75 *56 +^Mx85*68 +o9rsbm +x41Y2 ++3 *42 +x28s( +5 +Z1 p5 *A9 +x21 *21 +,A*45 +*31 x46 +*52 x04 +c $1 $_ +T2 T3 T8 +x35 Z2 +^ux12 +$t $c +i73 i5a ++7 x02 +'B*85shl +u 'E $8 +r *40 +D5 $7 +} x56 +r $4 $2 +^U l x41 +x35xBA$X +y5xB1s4T +y4 x87 +i1. i3. i5. i7. i9. +$b $3 +$0 $5 $1 $1 +{sT, ++3 ^p +sk? +-0 *04 +*53 o15 +.6 p3 +*68 x42 +x4B^vx61 +p2 x29 +*02scB +D3 sea +i6i i7c i8a +^t x43 +x51 Y2 +c $1 ^! +^U x41 l +$a $E +c i11 +^3 ^2 ^0 ^2 +xA9D6 +C $3 $7 +o6X +$1 x53 +-1 -2 -1 ++9 'A +^h D3 +s-_ +*10 *42 +C $p +*76 o6g +$@x05 +$ksS^ +*34 o0z +$>sf,o8% +^3 ^6 ^7 +o5< +i5p,7 +i1a i1c +^1 ^8 ^5 +i5U ++3 +7 -6 +Y5s7+x14 +*76 l ++6-2 +x21x01spb +*10$c*28 +c o0t +Z2 $1 +^g.1 +^v ^S +xA7x37.2 +s9ylZ1 ++9 -1 +*59*43 +i2$ x05 +d 'A $9 +p1c +^A D7 +$WRB +i56 i73 +x35 o0w +s8_ +sEgxA2o8y +[ ,2 ++1 +3 +9 +i61 i79 i88 i98 +sT]*07} +*51 -3 +c $0 $1 $1 $5 +$A { ++6 -3 -3 +oB&so1 +*A8x59 +*52T6] +$!$$ +,9$m +$(sA[ +s2a +*74 ^y x05 +.3*A9K +]lszZ +*72+9s(? +i0m i1a +*A4^m +-9 +8 +*86]l +-1 -1 -2 +-3 x52 +$Cs = +i5V$x +Y5] +i0u ^c ++3 -6 +7 +} *96 ++1 -8 +1 +$l $y $e +c i01 i19 +[ o3_ +r $7 $5 +[ o3c +$1 $9 $4 $9 +x23 o2n +i4w x03 +dswG +-7 z1 D2 +i9i iAe +o60*24 +i9l iAa +fx83 +s15 sxq +y4 x26 +s5R +i62 i70 i82 i96 +d x6A +c $5 $0 $3 +i0s i1t +D2 $4 ++4 -8 -8 +*61x62 +p1x4A +c $1 $# ++1 +1 -8 +c ^! $1 +*57 D8 +l ] $t ++1 +9 +3 ++0 +2 -1 +c $9 $! +i1G +s2jx83 +c $. $0 +$5 p4 x96 +x71*07 +xA9R5 +i1e i2e +^h ^m +T2 T8 T3 +sPD +i0e *21 +{ -7 +x41 'B +,6o6R +c $2 $7 $5 +c $1 $7 $8 +c ^7 ^7 ^9 ^1 +$1 $d +o13iA+ +i2s i3o +i11 i19 +o6l l +*79 x81 +c $4 $7 $8 +i5a i79 +l [ +Z1o6O] +i3e i4b +x12 Y2 +i58 i65 +D4 d +u]*B3 +iBk +$CxBA +^g x23 +o8Z +c i34 +sik +s80 +5 +] i7p +s26 l +x42 *34 +T7 T9 T8 +*89D6 ++2 +3 +2 +'5 z1 +R0*87$u +*8A]s&s +[ o4t +$1 $? ++8-6 +snv +*30 ,2 +i7R x3B k +^5^7^9^1 +*75 D6 +} x02 x6A +c i06 +s5a ++1 -6 +3 +x65xA8 +.6D4 +z2 o1u +i78 i59 +i5a i70 +-5 -7 -5 +x47 p3 +i26 +] $h +,1x14 +$n ^M +*67 -5 +x61t +i57 i78 +*25i4E +Y4 x14 ++0 +2 -3 +D9 l +stZ +Y5Y5x39 +-1 -2 -3 -4 +-5 -5 -7 +z3siGR8 +o5\ +y5*BA ++A -8 -9 +-1 -2 -4 -3 +} -9 } +*61$7 +[ o5u +*71 x03 +^j z1 +i7R k x3B +*0BiB. ++0 -3 +2 +q ] [ +i75 i59 +x07cs+@ +i7v +.5 -3 +x63 y3 +]iBH +ux48 +sfj +Z3 x23 +^r} +$4 $! +$3 K +} ^e +x23 ^m +$k { ++7-4 +^7 ^3 ^7 +$l $u $m $p +t $h +o6y l +*78*20s2j +k i2v +i5e i74 +$Cx62 +i1a i2k i3e +*01 i3- [ +c $5 $0 $4 ++1^kc ++7 *65 +z1 x08 +i61 i79 i86 i93 +k -6 +*38i33'5 +sfF +$f $3 +^x k +*34 o4d +o3h D2 +*0Asbl +i1n u +^1 ^9 ^3 +-1 -3 -4 -2 +x67cx41 +$! $@ +R9snf +i7d i73 +*A7y3 +i65L8o9t +sRvTAo2E +sbn +d x38 x64 +-0 +6 +c $@ $7 ++8 -B +-0 -B +o2g x51 +i5s c +^n -1 +o2k *01 +]$H ++5 -7 -6 +i51 i3a +o9H l ++5 -6 -7 +i81 i99 iA8 iB6 +x63 { +T7 T8 T9 +Kc +^7 ^2 ^8 +T9y3 +i3d i7d +^d i1s +D3 ^z +i56 i78 +K}^5 +i0j i1a i2n +x6Az3 +q [ ] +$m x72 ++A -9 -8 +i5b i7a +*60 D6 +i62i70i81i90 +R5o8rE +o62 *56 +-1 -3 -2 -4 +r $8 $3 +$1 x72 +x05-6^H +iBo ++3 ^A +o6t l +y3 D6 +{ p5 Z1 +$-$. +$)*73 +x04 ^r +.2 *12 +{T2 +*25 x02 +-1 -4 -2 -3 ++Blx23 +l o5n +s7tkx61 +i3d i1a +-1 -4 -3 -2 +o4Y c +^1 T7 +*8A+8o6S +sm? ++1 +3 -6 +] $g +z1 *02 +sNLty3 +i5_ x64 ++2 +2 +3 +$Csq. +x49$[ ++8-7 +D3 Y2 +RBi7*,A +*56 D2 x41 +-1 $b +*23 *31 +K+0 +$d $u $h +,1E +*43 E +D8 ,3 x43 +i31 i3d +x82 -5 ++1 x31 +Z1 x36 +T8sgvR7 +$f $6 +d x97 +x04 x28 +T3 T4 T5 T6 +^O*91x97 +$w { [ +-2-9 +*0Bo2zx79 +c $1 $7 $0 $3 +T0 T5 TA +R8$S +i7U +i78 i7e +x74+7 +xB1sue +c $7 $9 $8 +$U*7Bx1B +i1s *13 +$m $a $w +*58D5 +i4, +snp +[sY4o8- +D0 x43 +$bsZr*12 +c $2 $8 $0 +-9 -1 +D8 x43 ,3 +x2BT7o13 +sl`s-po9Y +i50 i77 +iA_ +s2? +s6iusM= +$7 *03 [ +c $5 $5 $8 +o0s l +$5 *75 x63 +-1 -9 -1 +D3 ^c +^h o2y +u d 'A $8 +sDQy3 +u d 'A $1 +r $! +-1 -1 -9 ++9 [ +x12 ^3 +$e $r $i $c $k +$n $o $d +-B -C -C +i0z z1 +x43 r ++3 -6 +3 +$z xA2 +Y3x62 +o22 *32 +i7L +sEW +sie +$a Y1 +i71 i89 i97 iA4 +x74x71 +x62 o2y +c $2 $4 $8 +-5 -6 -5 +$3 $a +x02 Z1 +z2 o1. +D7 o7. +$&x54 +t { o1a +^7 ^8 ^3 +$r $y $e +smr +*42 sAB +*34 o39 +$Qs$F +c 'E $9 +s\)$isn\ +i4o i5n ++5 D1 +$h $e $p +^4 ^4 ^7 +c $7 $7 $! +^R -3 +p3 [ +$y $e $a +o0# +*0Bsdp +s!8 +s6. +i64*B0 +D7 o4e +i6a i7s ++0 +8 +8 +i7P u +} o0k +$l $e $s $s +f x93 +.4 ,6 +*54E+4 +i7C +x04+A +,9 o6h +Z5x5Bx8A +c ^1 ^# +i6hx7B +i58 i70 +,9o4. +*30 *43 +r $7 $9 +i5e i3d +T8 ] +*AB^s +*32 $1 +l ] $h +-5RA +$z $e $d +.7q +s5S +o8z D7 ++B -0 +D3x62 +x54x62 +c i00 i16 +suo +Ci0R +o6 *BAi9? +xA1 } +^j x34 +x42 ^K +c $0 $8 $8 +'5 d +*05 +3 +s%1x73+8 +o8) +szs +$q*53x8A +c $0 $3 $3 +ER5 +c o20 +] o5l +] x17 +$( $) ++9 +6 +i5e l +r $8 $2 +i9hY5 +x58 [ ++C -D -D +[ *53 +x82 $t +x52] +c ^9 ^0 ^0 ^2 +x71 *58 D5 +*81L9D1 +i3t i4y +-A-C +*56 *76 +s"6Ek +^6^7^9^1 +D2 ] +i5L +'7 r ^J +x79o3@*39 +x52 *02 +sB-*58 +o17*67 +ko6>x43 +s!+$F +oBk +x94*3Bo64 +l ^X ^X $X $X +l $X ^X ^X $X +Y2 u +x41 [ +i3Yx2Bp2 +-5 -5 -6 +$k $y +$s $u $p +l ^X $X ^X $X +*7A x62 +T0 TA T5 +*76 +6 x42 +i1o i2o i3k +i5u p3 +-8 -A -8 +$1 $2 $3 $* +*10 i2b +L3 *63 +i96 ] +i8s i9o iAn +T3 T6 T4 T5 +r $m +T3 T5 T6 T4 +$r $o $e +o47*59 +$2 x53 +i71i89i99iA8 ++3 +3 -6 +l $X ^X $X ^X +^< +T3 T6 T5 T4 +-8 -8 -A +T3 T4 T6 T5 +T3 T5 T4 T6 +Y1 C +$0 x51 ++1 +C +l $X $X ^X ^X +*31-6 +i0m i1c +*B5,AsOP +l ^X $X $X ^X +i3yx0B +oAosDH +Z5 y3 x48 +i71 i89 i97 iA5 +*9Bi6u +{ $l +*17 +7 +$1$1$4 +x81 -8 +qx8Ax65 ++9 +B -A +i41 i59 i69 i76 +$.,8xB7 +i41i59i69i76 +$u x62 +x78*45{ +$3 D7 ++9 l +sy)LAo31 +saR +c $1 $4 $8 +^2 ^9 ^4 ^1 +i9jy1 +D3 i0i +RA-9i7m +^Z E ++3 -7 -0 ++9 -A +B ++4xA6s2' +x07 i5 x27 +L6 *32 +i0u +*53*89 +C $8 $0 +[ i0P x62 +o9K +s*|Z3*1B +*36 D5 +snc +c i07 i17 +d x36 +E ^F +i10 i17 +i0m i1i +dx16 +-1 +9 +o9r$E +c $9 $8 $1 +p1 x8A +*43 *12 +$;$) +i77 i7e +] Z1 -2 +c $5 $4 $2 +.8Z1 +i12 i32 ++7-0 +^Jx63 +sL$,B$. +o3i c ++6x01 +.7x41 +$=x74s;x +-8 l +*50 $5 +D0 iA4 +i71 i89 i99 iA7 +Y3x54 +$s $o $p +{R9c +i78 i58 +i01 i19 i29 i33 ++7 -1 +7 +i19 i32 +o19 k +i78 i54 +i86 i96 iA6 +^p x15 +c $1 $9 $6 +*71 x02 +$7$5$3 ++3 -0 -7 +*A5z3y3 +o50 Z1 +i4- x02 +x34i5]y5 +i11 i18 +sBR +scx ++1 -3 x42 +o5g x02 +i52 i60 i70 i80 +y1 Z2 x04 +t o7d +]iB(*98 +o7, +stQo8B+5 +^n D4 ++1 x42 -3 +-0 +9 +i02 i10 i21 i36 +o7E t +i3* +t x62 +i7i i8n +p5 $| +} ^g +^, ^, +*45 x52 +-8 +4 +i0h i1i ++A -5 +o39 *71 ++A -6 ++5 -4 +5 +x71 o8e +$4 $6 $4 $6 +c 'B +k -3 +^v +2 +i64 i76 +x02 +3 +$a +0 +c $4 $1 $3 +x82i7b +o5hx95 +'6 i5p +o4z*18x2A +c i02 i16 +c $5 $1 $6 +k *20 ++1 ^k c +]sG"*7B +i5k o6e +$5 Z2 +i71 i89 i96 iA6 +-5x76 +o6w x71 +c $5 $2 $8 +$2$3$4 +'A D7 +sJG +$7 $. +x61 D3 +[ o0q +c $. $7 +i77 i59 +i1a i1b +] -2 Z1 +y1 x04 Z2 +i1o x52 +x12Y1y5 +i31i49i59i66 +iAh +$3 $2 $1 $! +*65 *67 +o43'A +sjY +c +5 +*08 [ +{*95TB +'B $1 +*24 -4 +o2t +4 +x21 *30 +-Bi0O +o1L [ +$1 ^* +u d $3 ++7 i7_ +]{} +so0 sa4 +i5i i6n +iBd +*80i72 +i0QK +,7i9M +o4l D6 +*68 -6 +*13l +d x83 +[ ^d +l $' +*80+5seS +*B9 x83 ++5 -7 +5 ++5 +5 -7 +sSZ +.2 ,4 +*31 ^t ++7 +7 -1 +i53 x04 +$6 { ++8 +6 ++5 +5 -4 +x38 p5 +i9p +k *21 +$.$? +p4tx35 +x12 +2 +kz1 +c 'E $3 +.7^a +$rxB7 +^4 ^9 ^7 +^Vx48 +o0T L1 +-2 ^p +x63 o9u +x35x75 +sdp +c o73 +r $7 $2 +i7e i74 +i5e i3c +*43{ +-1 x32 +x71 Y2 T0 +i5x x32 +*67 o75 +t +9 +*49,Ay1 +i2l i3e i4n +l o5f +^d x42 +i12 i33 +u 'E $2 +x13q +*14c.A +i3f i71 +$A D6 ++5 .3 +soi sph +*12sW's +i0j i1a i2y +$w*76k ++1 +3 -2 +d 'A $0 +i7e i5e +d 'A $7 +c $2 $5 $4 +'8 +6 +^j *41 +o73 *76 +i3e i72 +o10 o8$ +i1e i3b +.5Y1s$/ +*14]f +i73 i55 +i10 i16 +swx+8 +*57 o7s +i7k i7u +sA`xA9o52 +o94 c +l o2a +f 'A +^C,8x24 +$6 D6 +k ^t ++2 l +sK{x54o55 ++2 Y1 +*A1 x56 +T1r ++3 -2 +5 ++0 o24 +$c $8 +EY3 +x04 ^o +i3a i5b ++7 -5 -6 +,1 y1 +c $4 $6 $5 +c $0 $1 $8 +-0 -8 -8 +x6Ax31 +i6H ++B -8 +D5 i72 +.3i6x +*61 x12 +cx75 +-C+D +fu +$c $o $y +cs8d +c $4 $3 $4 +c $1 $2 $! $! ++2 -3 -0 ++1 -2 +3 +^g D4 +k *46 +*A8 oAe +i52 i60 i71 i80 +i4f [ +Z1 T1 +Z5*36x3A +i14 i12 +$a $p +*94o5ri9$ +k i0b ++4 -0 -0 +c $2 $9 $8 ++3 +5 -2 +cs6(Y4 +r $4 $3 +$e ^d +c $8 $1 $5 +i5a i77 +o2m.6x83 ++6 o77 +i11 i31 +o6. Z1 +o7i 'B +i54 i5e +T1*53 +o7% +*23Z4x6B +Y2o0m +^y*39 +$5$6$7 +c $8 $6 $8 +*14 *08 +] ^L ] ++6 *64 +c $1 $4 $2 +$1 $8 $1 $8 +o6vxB9x49 +t o1y +i51 i69 i78 i87 +i51 i69 i78 i84 +] ] ^L +i81 i99 iA8 iB7 +D5 +6 +i61 i79 i86 i96 +i8a i9r iAt +i61 i79 i86 i90 +x03E{ +*23x41 +c $# $2 +o8J +^a Z1 +$Zx31 +i81 i99 iA7 iB8 +$b $a $b $y +c st7 +k i1h +,3l*71 +-9*78x69 +,1 *71 +x52 +2 +x13 ^c +x13 ^v +,1 *16 +[ -8 +s0e ++2f +z1 -1 +i67 i70 +^3 x12 +$-*37 +*06 K p5 +l i3a +p3 i2- +c $5 $1 $9 +d o0c +$+ $- +*A0shRsCR +K Y1 ++2 -1 -3 +i58 i71 +[i9"Z1 +$3 o62 *18 +l ] $E +x24 o2y +x62 +2 +x42x29y3 ++4 o5y +i4ZL9E +i58 i76 +Y4xA9 +i1s i2c +$ so` +i32 i71 +c $3 $2 $9 +d x85 +c $1 $6 $3 +c $1 $9 $2 +o6. x73 +t ,8 +*02 ^j +i7f i7e +o6t x02 +c $6 $3 $0 +i51 i69 i77 i82 +i51 i69 i77 i81 +^h ^r +o7H^K +o0C x52 +i4$*93*92 +^gZ5x39 +x12 o2r +^e ^r ^i ^f ++6 +6 -5 +$`$` +p5 s06 +i31 i41 +D1 *13 ++2 -3 -1 +^1 ^6 ^7 +lsNho7T +c $7 $1 $8 +T5*B0T6 +o9P +T1 T0 +o99 T0 +xABT0 +*50 x23 +x02 $1 +x95T0s{y +i3hs]7 +i4o i5k +^S ] ++1 +1 -6 +sTM +Y2s7u$h +i59 L5 ++1 -6 +1 +uz1x47 +^1 ^2 ^7 +spd +-0 -0 -6 +l '8 +i72 i55 +i7Ed*83 +-5 -A +c $5 $! +s'e +-0 -6 -0 +i15 i12 +sLJ +$y $a $w +i10 i18 +,A*45.6 +i81 i99 iA7 iB4 +c $2 $5 $3 +r $3 $8 +*43x42 +i1a i31 +-2 o0T +c $1 $8 $6 ++9*03x31 +-4 -A +^i ^g +$& s&X l +xA5$!*49 +c o65 ++4 +2 +,1 { +T2 T8 T5 +$3 *18 o62 +x62 ^G +^E o2d +$z x43 +fx3A +i0j i1o i2e +$- x72 ++1 i0h +} o1h +*97sBA +c $1 $0 $9 $4 +i0m i1o i2n +$.$! +i71 i5d +l o2t ++6 l x71 +c o57 ++0*64 ++5x9B +r $0 $6 +i4i *64 +c $1 $3 $4 ++9 -A -8 +E $E +x1AT1x07 +^e x51 +x53*68d +iA*sPt +T2 T5 T8 +i53 i77 +-0 +5 +c o0r +o1, +x52p1 +$- { +c $3 $7 $5 +$r *78 +s8p$T +R5 +4 ++9 -8 -A +^2 ^7 ^5 +x71 .6 +i5r D2 +^1 ^7 ^6 +x71 $` +sn2 +o0R x31 +i3l i4i i5n +x61,2^t +sw3i1|sb) ++6 *57 +x13 ^S +x61 i2$ x13 +o3E c +^[ $] +$y x53 +*0Ax89o56 +^cs[S +y2cK +L6E +i54 i78 +sGD[*96 +uT9s=u ++6 -5 +6 +$p $l $y +D1 *20 +*58 '8 +D6 i1i +^3 ^5 ^8 +i2gsHQs)p +q x08 T7 +i50 i78 +c i6_ +y2x72 +*64 x72 +D2 ^1 ++6-A ++6 D2 +i71 i89 i98 iA7 +o0c *42 +i71 i7f +$= $) +o4U +*B2TB*58 +iAu +^1 ^3 ^4 +s=ti4I +c 'E $6 +i0d i1a i2n +x15Y1*47 +sbf +[ o0F +o9G +x12 x84 x15 +i39 i33 +i5d i3a +sgv +sE=DAx51 +o0a *B0 x38 +i76 i53 +-7 *87 +i7G +i01 r +.2 .0 +i70 i54 +^4^0^0^2 +*67 [ +*6B*B2+0 +-4 *42 x42 +s;>o6f} +*ABy4 +*26x53 +o0b l +$8$7$0 +C $6 $3 +u x41 +$8 x71 +-4 *40 +i6H u +sty +o1. +0 +c $4 $7 $0 +K $S +y5 '8 +x92*52 +T1Y1*67 +o51 o66 +x12 ^K +i1e i7a +x32 -4 +x03 z1 +^0xA5 +o22+0xA7 +x82*06 +-2Y3 +*17 [ +.5 x21 +p2 r +i81 i99 iA8 iB2 +i5d i7e ++6 x71 l +o6Yx47 +x56Z1 +-0 sao +^a o2i +i7a i1a +xA4x69y5 +p1 s94 +i0a i1s i2d +iAF$#s'J +c $_ $5 +TBsSGxBA +x51 o3s +i7= L7 +c $1 $, +x76s@R +^@ ^! +D5 *41 +^p ^m +TBo6^o6Z +$8 x92 +i54 i76 +i54 i79 +*41 *32 +*14 c +si1 T1 +-0 l +$s +4 +x68xB1 +o0m z1 +D2 x31 E +s6! +] i0m +i72 i53 ++6 i7u +d '7 $4 +'B $8 +r $0 $4 +c i7# +o6_ $0 +x63 p1 x04 +q xA1 x81 +x35*A1s0_ +x14 ^g +d x52 +[ DA +i4l i5a i6n +d xA4 +slb +Z1 $o +$b $4 +r $5 $4 +$0 $9 $8 $7 ++0 o5t +$_.BE +p1x59*54 +T0 o4r +i5Oy5x3B +C $6 $0 +o0" +D8 x05 +$m $b +.Ao9Hi7d +,4[+8 +L9R6*84 +i2t i3h i4a +i4i +5 +i49 i55 +i6B +$n $i $k $k $o +sob +*35 o2m +i2I +$8$8$8 +i8Sy4 +[ *64 ++4 o0z +i0m i1a i2y +i36 i46 i56 +Z1[ +c $0 $0 $! $! +x53 c +$5Ko5! +*43*54 +^l ^k +x21 ^3 +k *13 +'Bx63o4" +c $0 $0 $7 $! +s3ssOm*0B +d '6 $2 +i21i39i49i57 +c $1 $0 $1 $! +o1& +xB2xA9k +rl*A7 +x26 ,5 +c $1 $3 $2 $4 +q x81 xA1 +u $1 $9 $9 $1 +.B^N +lx36E +[s2G*A9 +s5Psmo +-0 ^g *02 +o0r +2 +i71 i89 i98 iA2 +o0Kp5 +sAG ++9 +7 +x24y5 +*32 *45 +^E D4 +sW`^2 +i7Z +i61 i79 i87 i97 +i62 i70 i82 i97 +i62 i70 i82 i94 +o6A r +i62 i70 i81 i98 +i02 i10 i20 i31 +i02 i10 i20 i36 +$7 -7 +s98 +s94 +i72 i80 i91 iA9 +sh}*04 +i2g*30s0( +i17 L1 +D5 *57 +-F -F -F +,4s{I +-9$= ++1 -9 -0 +o7W${ +x52 x02 +c $8 $* +o5u T0 ++1 +1 +5 ++2 +3 +5 +Z1 x43 +sqPs?%o4. ++0 +5 +3 +-7*43 ++9 +B +9 +'Ao48 ++2 +5 +3 ++1 +5 +1 +iAz x82 +D2 E x31 +cx7B +Cs6E +$2sDX +DACx7A +-B Z1 ++6 -5 -5 ++5 -2 -3 +o0M *43 +{ s9X x52 +*56 D0 +{ x52 s9X +} sPo +i21i39i49i56 +^h x51 ++5 -3 -2 +$g $a $g +i50 i75 +x19*1AD6 ++1 -0 -9 +*07$!sz0 +o28 *12 ++0 +3 +5 +o6x x51 +o1i+6 +$x Y1 ++9 -2 -2 ++9 +9 +B +c $x $2 +s34 c +i0m i1r +*8Bx34p2 +^Ax17 +*30 -2 +-4 D2 +i3d x43 +o1W o0b t +*56 ] +i6O +o4j x31 +c i5- +i5e i7d +x71 f xB8 +^^sOPu +i3G +*56 *64 +o7>*06x09 +o2d c +$4 $f $r $e $e +x29o7z +$ps[Zs@t +$8$0$8 +sxN$g*20 +] sau +x48 $h +i0A r +u d $6 +x49*84ss! +[ x23 +$3 D2 +Es_SR9 +y4 c +.6*13 +i8? +T0$n +.B*50 +*37x48s%m +$b $e $g +D4x26x74 +*39x21K +c $1 $7 $5 +c $4 $4 $8 +d 'A $5 +o0[ +^zs&5+1 +u d 'B $6 +c $5 $6 $3 +$(x09 +c $7 $9 $0 +c $7 $2 $5 ++8$@ +c $2 $5 $9 +o2* +*51 sF_ +y2 x38 +$Dx1B +c $5 $0 $2 +t i7c +]oA' +c $9 $3 $9 +o0r +4 ++A t +c $8 $8 $3 +c $4 $8 $9 +^h ^o +sMC +c $7 $3 $3 +x24p1o82 +t $c +c $8 $1 $3 +s2ei86 +$1$6$3 +x48Y4 +c $6 $8 $8 +c $4 $5 $3 +c $6 $2 $5 +c $4 $1 $7 +i9v ++2 +1 +^2^7^9^1 +$9$9$0 +iAz +s+D*27 +o2M x02 +o3u o0p +i13 i37 +*74 x34 +x03 ^L ++0sZJ +p4x65x49 +i5zqx6A +c $6 $5 $7 +$) ^( +c ^y ^M +i8|$a +x61 o6g +T4'8s7t +i1fD9K ++3 -8 -1 ++3 +4 +3 ++3 +4 -5 +x62 $A +i3d i3d +c $0 $1 $6 +o7D +*56R5 +c $5 $1 $4 +T2 ] $8 +i68 i76 +o2, +c i1h +i72 i3e +l Z3 +x91Y4x85 +o4O +i01 i19 i28 i37 ++3 +3 +4 +sKMx0A +sYfsfut +$1 ^1 +-0 o1j +x71 T1 ++1 T2 +s!jxA7i1L +sl2 +p5,9 +$5 $d +.4 +7 +$Rx47 +i1a i7e +s+Y^W +i6, +smG +i33 i43 +o9j +-8 o9l +[ $1 [ ++1 -7 -6 +$m Z1 +'A +7 +Z1$3 +s9_skjd +sqY*B1*96 +z1 i1j +i32i40i51i61 +*63z2x92 +*54 x32 +$xx63x71 +}D2 +sGsKl +RAs.Yx52 +d x03 +*20 x41 [ +$4 ^M +y3sSc +r x81 +o5& +x63sj{ +x94xA7 +,7 *17 +D3sCi*25 +-8 *93 +t[ +*73*93E +T0 T8 T6 +i47 K +srl +o6% +i4K E +$4 $a +o8=sMl$Q +$. x07 +x14 x53 ++4x94 +c $1 $0 $2 $6 +c $2 $9 $3 +xB8x38 +^> +sI3 +*12 ^k +i32 i43 +$3$1$5 +D6 i5s +$0$0$1 +ss3 +K o9n ++3 -5 +4 +x04 i1a +-7 -2 +$r Z1 +} *09 +*76 $t x72 +.5o8R*39 +o1p ^c +'A o7l +D9 $r +^s } +d t x7A +i31 i1a +c i3o +*87x67} +o0m l +,1y1 +x1A x04 +sahiB#x56 +.5L5 +R4T0 +sms +Y3 x62 +c $8 $3 $1 +o6Z +-0*51 +i19 i38 +sBP +x13*76 +i72 i1e +T0 T6 T8 +i0O i1c i2t +i83 +c $2 $4 $9 +,B*04T4 +$d $e $p +] *34 +i62 i70 i82 i95 +x61 D4 +s$S +sST +D4 ^z +K t +o6) +i41 i59 i69 i72 +o6s.5 +t ,5 +] i3s +$1$0$0 +i3q +^8 ^3 ^7 +$_ $s +*76 x72 $t +D9x51o8F +c $0 $2 $7 +c $4 $6 $9 +sM-ux71 +r $7 $6 +cY1*51 +$u x72 +$z x63 +i7a x01 +i2r i3r i4a +s!6 +o8ZD6 +i3y u +d x7A t +c $2 $3 $5 +$s -7 +o4o [ ++1 -6 -7 +-8 -B +]s1m +c i57 +i0. } +*13 x03 i0q +i62 i70 i82 i99 +[ [ $1 +$/x74 +oBf$% +o1f *20 +c $4 $0 $7 +c $6 $0 $1 +*53 x13 +o2/ +c $0 $2 $4 +i1e i72 +l i4_ +*A4s'Ou +*26 x62 +o4/ +'9 ^d +x02 d +i3m +2 +l$z +c $# $3 +*13 o0f +]*76 +$g x52 +o1x ^l +c $9 $4 $5 +*51 +1 +stM$P +^t *23 +o8v D7 +x62 [ +^.,7 +L6x68 +s)dY4 +s +x6By2 +sjQE*71 +i12 i52 +i32 i40 i51 i60 +i3v i4i +c $4 $9 $0 +c $2 $6 $7 ++A -2 +'9 o7s +D3 T5 +i3g x43 +*13 k +D5 x12 +C $4 $7 +i76 i55 +*16El +[ *05 +i3s k +o5s Y2 D6 +c $2 $3 $8 +i01 i19 i29 i39 +*30 D3 +D4 i6s +-2 *52 +$GsHr +$6$1$6 +i7e i7a +y2x52s}p +x12 ^y +s3Q{*49 +o00 ^1 +^7 ^8 ^4 +x37s40 +-5 o61 +i15 i55 +c $6 $0 $9 +x82x98Z2 +smy +^K D4 +D2 *53 +*42t +o0p] +x51 x02 +i5a i75 +sup +kY5sdS +i70 i58 +^Tx37 +o5i i6r +*B4$@ +,3 } +i8i D6 +'A x61 +i77 i50 +x31o4_ ++3 -1 -8 +*6A +Z1*12RA +i5b i7e +i7% +i82 i90 iA1 iB0 +$9$0$7 +o8R*21sX` +-3 -5 -4 -6 ++2 +5 -3 +sh. ++7 K +c i04 i14 +s"j*90T1 +c $3 $7 $7 +-5 -9 -5 +c i03 i10 +y1 z3 x08 +x02Y2x57 +$3 $D +^Dx35 +^a x31 +u d $7 ++0 +1 -2 ++2 -3 +5 +$j $F +o9L*12sI& +c o1y +x95i2e +l $t $e $s $t +$4$8$0 +$@ $7 +.6*35 +LA ++0 -5 -3 +x0B$Lx95 +$tY1 +{ $s +i0A +c $9 $1 $4 +o2Q +x39 x13 +i9s x02 +c o62 +$m $a $y $1 +o54 x41 ++0 -2 +1 +$S { +c $5 $7 $7 +x89 ] +s5ts@0*02 +*80 *30 +i71 i89 i97 iA0 +E sco +o6n D7 +o1i *61 +x43 i6a +$5$8$7 +oAUsB2$o +-5 T0 +x32 ^o +-7o4e*B7 +i9Ms(E ++3 -6 -1 +$F*A2 +*90$Rx9A +*1A^a +z1 } +i51i69i79i86 +$/*1Asu* +Y5 ] ++0 -3 -5 +shp +u 'E $0 +*67 *86 ++1 +6 +6 +$3i8_xA1 +$9$7$6 +$2$0$1$6 +*65i3@*B0 +c $3 $4 $8 +$lx2B +c $6 $5 $5 +x71 o6j +o4I c +*45 o3g +i7F +-3 -4 -6 -5 +i0D +^n x32 +x05 x65 +$3$8$6 +-4 o0P ++1 *14 ++3 -1 -6 +c $2 $8 $7 +$s $m +p1'B +[ i5. +c $2 $6 $4 +o7Vx76 +-5 -5 -9 +c $8 $8 $5 +d '7 $8 +-3 -6 -5 -4 +Y3sPTx42 +-6 *67 +o2. D1 +lx96-3 +o7M +o3Y c +$! +A +Y1T3swF +$c $9 +$7$0$7 +D8 o1! +dx9A.9 ++C +D +D +$7 $@ +^o ^i ^b +^R E +i8z '9 +*21 x41 ++5 x59 +*98s;1 +o7j p3 +,4 k ++7 -4 -4 +o7g ] ++5x91 +T1o1co8{ +*94 x15 +R2xABL2 +c $6 $1 $7 +s(Eo4f +o65 -7 +d '4 Y4 +o3xs?o +d '4 d +-3 -6 -4 -5 +i6z x73 +r x05 +x04Y1 +iBt +i62i70i81i91 +i32i40i50i69 +*5A x67 +sk|x21x3A +x54*25 +xA1 x04 +R7*89R8 +$8 x63 +oBP}-7 +^Qs?W +^1 ^8 ^6 +c $2 $9 $1 +$2 $3 $2 $3 +i71i89i99iA9 +*23 x51 +x74*91 +i6e [ +i0f i1e i2r +.5TA +i79 i5a +^7^6^9^1 +*32 *13 +*24 i12 +*2Ay5 +*23 k +$8$6$8 ++5 -3 -0 +i5o i6n ++3 +3 +9 +D0 k t +i3e i4l i5l +iB6s"rso| ++5 +7 +5 +x47i4d +$6$1$0 +x81$' +-8 .3 +y2o00 ++7 $3 +$1 $q $a $z +i0i i1t ++3 i4k +i9a xA4 +set +$r +6 +^6 ^2 ^0 ^2 +sL.i7* +$! $2 +oBu +{ D1 } ] +-3 -5 -6 -4 +$z $i $t +*98s0( +c { +i4u x34 +l ] $S +D2 T0 +o4# +sh'o4Y +x81 i81 +$x $2 +u d 'A $0 +x26 .0 +*12 i2p +*12 l +xA5 $0 +*30 -4 +-3 *24 +o03 ^1 +sR2sU",1 +$6$0$7 +soLq +D5 i0T +c $6 $1 $3 ++5 +5 +7 +$7$2$0 +x91d +i2gtx0A +$o Z1 +t x47 +$0$0$0 +d 'B $1 +x42 -7 +-3 -4 -4 +*20 c +x25 y3 +*86 x34 +xB4s;S +z2 o1y +s!* +*16 D1 +i4e i5r +D0 t k +$i *89 +*A0.9o1s +slfo5d*96 +$i $f $s +y4x7A +so5T7 ++7 -3 -1 ++3 +9 +3 +-3 -4 -5 -6 +$2 $0 $2 $3 ++7 -1 -3 +-1 +5 ++A -3 +i1u i2b i3b +s7S ++4 -2 -2 +^4 ^4 ^8 +x13 o2y +i5d [ +T0 ,5 +i71 i11 +i1u o3i ++1 ^b +[ $@ +o9S.A ++5 -0 -3 +^3 ^3 ^8 +$2 D0 ++0 $2 +x58,1 +^2 ^4 ^7 +x7A p2 +$9 -8 +*61 x47 +s&^-6 +*63 D3 +c $@ $3 +T1 $7 +c $@ $9 +*81^R +C ^g +-0 x32 +$9$9$2 +x56sFe +x3Al ++0 +3 +9 +,6 x71 ++7 -1 -0 +T0 T2 T8 ++B *9A +^0[x8A +,6x04 +T3.1s%( +i53 i5e +k D4 +x8Bsar +r $3 $5 +c so0 $! ++2 +2 -0 ++6-3 +*53 -5 +*45 x04 ++0 -3 -7 +o54 +7 +c $4 $0 $6 +t x32 +c $! so0 +x35 ^c t +x03 d +o4y*A6i6$ +x9Ax35xB1 ++2 -0 +2 +} s.w +i81 i99 iA7 iB5 +o2u c +x03 i0T +,8s*8 +se} +^J +6 +oA|kz2 +c $7 $2 $6 +l o0c +x6AiA* +c i46 +x61Y1 +sEyC*64 +*B6iB3$K +$8$4$4 +x62 +7 +Z2D9 +p5-1 +DA l ++3 -0 +7 +C $5 $3 +i2p D5 +i0s ^p ++0 -6 -1 +$1 ^- +*9Ax7A'A +-2 o40 +*ABsu$ +i5h T0 +u ^C +x05 ^h +o9~ +c $0 $2 $9 +i62 i70 i80 i92 +x47*03*80 +*25RB +*24^q +qsnh +i61i79i89i95 ++1 *87 +c $1 $4 $6 ++8 +9 -A +*04 x12 +i32i40i50i60 +*A7sCo +^( D1 ++0 +9 +3 +$9$9$5 +-4 ^r ++7 -0 -1 +i4D +,1x63 +ssi +R6oBf +l o4z +Z5x64 +*40 *02 +i9x .9 +sbs +R1 l +p5x53x7A +c $1 $2 $3 $+ +[ i4b +i9o x63 +$9$9$4 +$4$8$7 +sdx +l o0d +o30 *63 +o3& +z2p5 +D7 x12 +c Y3 +c o0k ++7 -5 +7 +c o55 +D4 D3 +sgs +iBt f +i6Dc +u 'E $1 +*24 -2 +l [ ^E +c $7 $2 $1 +i10 i30 ++0 -7 -3 +x84sqA +D3 o0N +[ $r u +o2uR3xA2 +o9D +*20 '9 l +i71 i82 i93 +^b D4 +i7hx98 +D0*2A ++1x24Z5 +$3 $. +K]s,c +] $M +]*68,B ++7-2 +i81 i99 iA6 iB4 +*52 ,3 +sm` +i2G +T0*78spq +$t x85 +i1a i2u i3l +z2'8 +Eo9A +i5a i3c +*31 r +x72 $t +i2l x61 +-5 *24 +-3x03*18 +i6 x2A +i82 i90 iA2 iB8 +c xB1 +i73 i5e +x04 $7 +ss4 +c i00 i17 +*60 x03 +sdh ++3 +7 -0 +'7 $e +D1 ^N +i4s -0 +i5a i3b +-2 o3J +Z2o9Q +$6lx19 ++8 t +t ^t } ++5p1 +sbJ +C} +p2 x34 +[+7 +r $0 $5 +D3 i5n +$k ,A +D5 *54 +*20 l '9 +sva +x3Bl+7 +'7,A +o4EsZM +x34Y4 +c $6 $9 $! +^1^7^9^1 +Z3 x54 +$7 $A +x46i2| +x34 q +o0Uo8> +D8 oA1 +l o89 ++0 -1 -6 +s!?{ +x01 o4x +iB8$`*4B +s3a +s1* +$j $o $t +$s -6 +$p $i $n $c $h +y5 x7B +o1U [ ++8 -A +9 +i4i i5n i6a +Y1Z4x83 +i6` +c si! +D2 -5 +spM +r o0H +c $_ $0 +i0s i1e i2x +z1 T2 +oBAo3" +$5 -7 +^B*B8 +r $5 $2 +$b $u +i76 i50 +c $3 $9 $6 +'B $7 +x03 $5 ++7 o83 +$. $5 +xB1 $3 +}ssO*1A +i31 i1e +scf +z1 ^a +T0 T8 T2 +c i05 i10 +*45 o0n +x52 +5 +c i05 i15 +u d 'B $9 +l *41 +E k ++7 +7 -5 +*32 o2G +D5 x54 +d '7 $5 +x06 p2 [ +spC ++0 *35 +sDJ +x45 *30 +l$J +^7 r +^v *31 +z1s/ysN5 +o11i9, +i5f i5f +sgp*A7 +i71 i89 i98 iA1 +o9y +iB1 +i1C +i51 i1a +$5$8$0 +l $b $a $l $l +c o40 +$N c +-1 +7 +i50 i5e +x82 $b +$, $. +$3 $3 $3 $3 +$m $x +svRD4x63 +i5a i76 +'A l o8m +$h { +i4KE +T4 T8 T5 +d 'A $6 +*4Bq +^G l +} ^k +^!LA +$9y4 +^Z l +i58 i74 +D2 $e +$? x94 +l $! $! $! $! +T1*75 +x91 $9 +i7u x84 +D3 *02 +D0 T6 +sQHiAMse3 +*57o56xB5 +,0+5 +[ x45 r +i3d i1e +o1e D7 +'A o8m l +*89*B0y5 +$3 ^S +*3B*37] +*31 i3n +l o6k +x37i9E*47 +$p $l +i4= o0s x15 +o3u l +i4U +x03 *31 +y4 x37 +o1I [ +x64 *10 t +xBAD8 +-3-9 +i5a i7c +d xA5 +-6$r] +c $3 $5 $8 +$J $j l +x26x93x91 +$msn} +i15 i15 +^-sH4] +$d $a $b +o49E +[ *24 +i61i79i89i94 +$Us'? +*59 iAd x67 +xB1 -B +^C +1 +k x23 +[ $h +o3, +y5x73E +$a +7 +i2dx79 +$n +7 +y5DA ++1 -4 -4 +iA#D7^P +$8$9$5 +,3 +0 +o5k x04 +x79$n +^O ^H +-5 *75 +${ x65 +$,x2B ++C -9 +$m *76 +i62i70i81i92 +T8 T6 +$0 ^0 +c $9 $1 $5 +x64 t *10 +T4 T5 T8 +$7$3$7 +x85xB1i2y +i77 i53 +sa@ x54 +c $2 $2 $@ $@ +^KshU +o5d'5o9x +c $6 $! +$6 +8 +*40 *34 +D6i5s +^M x42 +i82 i90 iA0 iB9 +c $5 $5 $5 $! +R5x94 +c ^8 ^0 ^0 ^2 +-9.1 +$dx8A +i6o x32 +*4Ax6A +^8^7^9^1 +T2 T8 T6 +$A [ r +-2 -4 -4 +$7 *98 +*30sZS +{ { c +$2 $0 $2 $2 +z2,8Z2 +$2 $0 $2 $4 +x12 ^o +K T6 +i5, +-7s)t +i42 i50 i61 i71 +u T9 +skos}. +*34 D7 +c i5_ +$]+7 +i0c i1h +T4 +3 ++0 +3 -5 ++0 +3 -6 +i5e i3b +$\'3x64 +spg +*2Ay2 +*32 D0 +Y1 c +i8c +oBY +$6$1$9 ++3 K +coBrY2 +x21l +$5 x21 +s#DY2[ +*75 o0J +s,Hss6 +i41 i52 +i71 i89 i98 iA0 +i4h o2r +i2t i3u +y2 x41 +C ^s x02 +i81 i99 iA7 iB0 +Z4D4 +.0 -5 +Z1x91,9 +sDBsR^i0t +i51 i63 +i3e i5c +x04 p4 +x81 *78 +x31 *24 +x31 K +c *86 +i3b i5a +d x25 +$3 Y1 +i3b i5b +i5c i7e +^m o2i ++0 o2q +*46x35 +l $0 $0 $0 +}skj +^i *03 +c $. $9 +d '6 $6 +$4 x62 +f x68 +^6^0^0^2 ++9 p4 +o0w *25 +slNy2 +i57 i74 +l o8e +*8AY3x21 +$ToAr +-E -E -E +o64,8Z1 +c ^M +sri +i9mz2 +o3o i3k +x15q +-8 +2 +c $2 $8 $1 +^h o2t +x62Y2 +z1 x51 +$Uo7| +$9$7$8 +x43 i50 +sjp +iAf$b +-0 -4 -4 +i0d i1i +c 'C $2 +s3r+5K ++0 +7 -6 ++0 -5 +3 +^js!< +T2 T6 T8 +$2k +Y3{ +o6k [ +^7 ^7 ^5 +r $6 $1 +*20 D5 +s^"'7 +*31 *24 +$J l $j +d x4A +x93 E +$5$1$8 +o5lx98sJ/ +i9e x54 +$9$2$0 ++0 -6 +3 +-8 -0 ++0 -6 +7 +*A1snu +T0 o3v +c $9 $2 $1 +c $x $x +z4 x06 o3v +D6shs +i33 i40 +k ] +i0j i1o +*40 D6 x41 +i0p i1e i2t +x02 x94 +d x02 +i4= x15 o0s +D4 i63 +Z3 x53 +$3 +5 +y3xB3 ++3 -4 +3 +x19sQI +} sD5 +i4e i5n i6s ++6 -3 +6 +*87oA# +c $4 $8 $6 +u $i +-0*57 +-3 k +-9q*69 +x56 xA3 xB7 +xB3$Ki9% +o80 +7 +i8vx5Ax85 +y2D8 +x61 D9 +c T3 $1 +Y4 x02 +x02 i9i +o42x74 +T1 T6 T8 +sbt +*01 E +^Zsg6sxJ +xB1[ +*53 +0 ++1 o2b +^7 ] +^c i1j +^t l +i1k$m] +x17Z4 +x51 i6r +'AsFU +o72 .1 +i0t i1h +]]]]]]c +syu +$7$4$1 +-4 o0G +o0e -2 +*19x23p1 +sbl +*7Ai11 +x12 $l E +*25 o0m +T7 $3 +o49 E +x61 $0 +$b $7 +s1. +^m ^m +*69 x92 +i7{ +*02 k *13 +i5e i75 +i76 i59 +syn +[ ,1 +sfn +R8+B +xB1 *87 +x54]$M +ss5 sa4 +sfCE +*14,5 +'8 K T6 +x06i0Zx0B +x7AiBh +^< $> +x92 $y +$tx89 +$s $o $w +o5D +i8So9F +$r i7t +saq +{ x45 t +T1 T8 T6 +x42z2 +c $ $3 +]l +*5A$X +{ TB +}s@k +Cx85*BA +i3d i5d ++4 x54 +y5 x0A q +,3 $7 +k ^A +DA o2f +i81 i99 iA6 iB8 +,7 -6 +c $5 $9 $1 +p5 i2K +i21 i32 i43 +oB2Y3*8A +tE^@ +o7s *57 +snws@) +c $8 $5 $0 +o4; +*15x9A ++1 +3 -5 +[ x92 +p1s(a +o17 [ +sdh*46 +i7Yx36 +c $1 $2 $3 $# +i7O +Z1 +9 +D2 -6 +i77 i55 +x31[Y5 +i4_ x54 +*69$G +-1 -1 -8 +p5-0 +i5t i6o +^A x21 +T3p5 +sys +o0_ +o0b c +-5 [ +skh +*48x83 +-2^2 +x02 i4f +o34 t +c $- $2 +'B $c +D6 D5 +sAO +}x59i6i +CC'9 +r $3 $6 +xA4 x51 +xA4x87 +*6BY1 +c $_ $4 +sCfssh +o2c sck +-B $9 +c $5 $8 $9 +sTG +x86R8 +i1h i2i i3n +z4 x16 i4e +x13^W*97 +y2]s^W +$ax29x63 +*87x21*4A +$3 x23 +i8Y +qx16'A +i5d i6e +i54 i70 +*74+6 +[ o3r +[ E K +srgxB3 +C $7 $0 +^a x41 +o0m^a +i5a *04 ++5sk9*29 +*9A *89 +*54K*A3 +*16x07z3 +*41 D1 +*65iBBsr< +s{8^.x1B +$2 $0 $2 $9 ++7 *57 +s#al*48 +$9$0$9 +o7u *67 ++6 +6 -3 +i51 i1e +[ K E +i74 i54 +stYsvp +i3e i5b +$4$6$3 +$^ Z1 +i14 i54 +c $0 $2 $3 +x2A*85 +-2 o4y +T4D5 +o1B *10 +*50 x32 +*74 *65 +i6E +c $4 $6 $0 +*A0x56^j +x21 o34 ++3 +5 -0 +i52i60i71i80 +-0 K +x35*46 +i57 i76 +c $4 $$ +c $5 $0 $7 +r $5 $0 +s6osW( +c $4 $8 $7 +*10 i3r +^- } +i51 i69 i78 i83 +i77 i56 +i81 i99 iA9 iB8 +^d ^l ^o ^g +x84 -9 +i34 i42 i50 +c $2 $9 $5 +x23 +1 +i73 i59 +.3 E +-5 D1 +sk]d +x41 $4 +D0Z2 +K x97 +siJ +i6% o6f +T1 $8 +*95^2 +^r i1t +^4 c +o58 *65 +o3r x42 +*ABz2 +^b +1 ++3 -0 +5 +-1 -8 -1 +x72 o6u +s<}R4 +*A8.6$| +xA3^Q +l o8d +] -2 +*53 +5 ++3 +3 -4 +]u +o89 +9 +[x57K +s?K*40D4 +i0p i1a +*59seZ +{ t x45 +cs,.+5 +$>$= +c $1 T3 +i60t +$1 *54 +*68u +'B o6l +i45 i55 +uxA3s(= +$x x92 +o4E t +o8Q ++1 -5 +3 +[x91i5. +snh +s{J^Q +[dR9 +x04 Y1 +*16 x03 +sbM +x23*A8 +C $4 $6 +] $R +i3e i4y +^T x13 +^0 ^3 ^0 ^2 +oB+Z1+4 +o0h*82xA1 ++1 +5 +3 +i7xx9Ao8G +i0r i2b i1o +] T2 p4 +c $& $1 +s7axA1 +D1 $m +$A [ +-7 x51 +o3k E +*15 o0s +s5t +$2 $0 $1 $0 $# +u 'D $6 +,8y4r +*14 r *63 +*25 D1 +^d x51 +o3l +1 +$o *65 +x97^6*35 +i58 i77 +x18 u +i19 i30 +i50 i63 +o1s i0g +x14 ^y +i2a i3n +$nsL@ +s_. +l [ ^Z +u *75 +Z5 u +sXb^yi3q +$6$2$0 +.5.2 +$+ x94 +xA3xA4 +i9l D7 +^M x31 +s9s +-5 l ++1 -3 -2 +'B D3 +o6C l $s +*74.8x97 +i34 T4 +o1e *31 ++1 +7 -0 ++7 *13 +0 +xB1] +},B +*B9 x65 +c $4 $1 $8 +Y4 'B +D5 *32 +^s *65 +*58 D7 +$4$8$6 ++1 +3 +5 +c $8 $8 $2 +[ o3j +'A i7s +sMA ++5 -1 -3 +u ,7 +i1L Z1 +-6 *20 +$x D6 +s!5 +c $5 $4 $8 +[ i31 +x9Bx3BD7 +z2 o0m +*50Y2 +l o3c +-2 -A ++4 *25 +o9e x63 +i17 i14 ++9 +A +B +i3e i79 +xA1 D9 E +i2j i3a +cxAB,7 +scK +^V x12 +*34 +5 +$s D1 +x03 x84 +i91$n +-0 -5 -3 +$f $A +xA1 E D9 +*89i1m +$AsUpiAk +C '9 $1 +$n $e $s $s ++4 *02 +c $4 $8 $0 $0 ++3 +6 +3 +Y3 x35 +c $5 $0 $6 +^7 ^6 ^7 +o4< +*01 *41 +Z5x1A +$u x52 ++2 -1 +3 +skWs!* +o6C $s l +*50 +0 +$5$8$2 +z2 *31 ++1 -2 -3 +D3 p4 +Y5Y2 +$1 $9 $9 $1 $@ +o6` t +c $5 $1 $3 +smp +$k i8o +Y5xA3 +i61 i70 i80 +*58s_R +xB5L6 +$7$5$6 +x12 $l +^m *34 +T0 D8 D5 +*21 ^j +p2oAFs+# +y5 x43 +x04 $s +-3 +8 +c $2 $8 $6 +$t $o $g +i15 i14 +$j $a ++1 i0i +x2B.7*08 +sh[^e +[x15 +*17$s ++D+E +]o1h +i52 i60 i70 i88 +-0 -0 -7 +p3 *68 ++0-B +-4 o67 ++0 +0 +5 +^d i1l +$d $u $g +{ $0 +c o1e +,7 +0 +i77 i54 +o1Hs[. +i71 i89 i96 iA8 +c $1 $8 $4 +$4 x28 +i61 i70 i81 +'A D3 +C 'A ++5 -2 -2 +i71 i3b +i4z x53 +o2z *21 +D5 D4 +i89s)'*17 +o1K k +x42 *20 ++A x62 +o2p +3 +o6o *61 ++C -B -B ++3 +3 +6 +o2l *42 +l ] $B +i0b i1a i2r +o3U +x05 i6! +,2 x31 +siR*20Y3 +$8$2$8 +c $8 $9 $7 +i32 i42 +o3s c ++5 '9 +$8$6$0 +i7D o6a +i3I c ++7 +0 *13 +$0 +5 +$w $o $o $d +c $a $a +l $l $a $n $d ++6 -5 +7 +c $1 $& +$* $* ^* ^* +i6T +$a D4 +l^U +^z *13 +*60 o6l +i5g x01 +l o3l +^3 x07 $d +i5c i5c +i82 i90 iA0 iB0 +o8% +c x02 +o33x74 +o2o c +x51 $6 +iA/ +.A x64 ++9 +B +A +i13 i14 +i5e i78 +*61 { +-0 -3 -5 +-2kt +i14 i34 +$1 $2 $* $* +*53 -0 +R3x7Bs'D +i4h'A +i1e i5d +$s $o $t +*96 x52 +i3Px31x91 +D1iAq +C $4 $1 +o6e +5 ++0 -9 -1 +$7 o61 +*15xA9 +x24sp>sYl ++0 -1 -9 +$3$0$5 +x67$^ +^2 i85 +sck x61 +o3- [ +$%sLHl +c $0 $. +$6$7$8 +sB#sKW*15 ++5 -3 -1 +xA9 xA3 +i11 i51 +$2 $0 $2 $7 +C $4 $3 +c sa@ so0 +x51 $! +i62i70i80i91 ++0 +5 +0 +$5$9$0 +$l ^a +o15 [ +i2y l +x56s `R8 +i6f *64 +-7 +8 +c so0 sa@ +$x Z1 +k +5 +x43q +$* ^* ^* $* +EsJ^ +i7do5v +k $x +c $4 $4 $9 ++6 +7 -5 ++1 -0 +7 +D2 x51 +^A D4 +Z1 o5_ +]s\o +$_$! +x14x1B +$0 $4 $0 $4 +-0 -7 -0 +$$$# +^3 $d x07 +DA^' +c $2 $1 $! +c $5 $9 $7 +i3- [ +^4 s6P +x02s\No0a +$* ^* $* ^* +$p $r $y ++1 -0 -5 +o6`xB2 +i32 i1e ++1 -5 -0 +K o56 +$2$0$2$1 +s0S +$6$3$5 ++2 +3 -1 +K o7- +]TAx6A +i0t i1o +x12 $s +i5a i74 +C ^w +^0i5y +c $. $5 +*38*65 +u d 'A $5 +iA5$Ki8] ++0 +5 +1 +i7e i3a +u d 'B $3 +o5a [ +c ^1 $. +$m $o $t $e +*53 o0z +$A $x ++1 -2 +1 +o4c.9 +.2'4*0B +*43k*60 +c $. ^1 +DA*38 +} ^F +$5$6$8 +^0 $0 +^pi0b ++1 +9 +1 +$9 xA2 +LAxBAi7? +,8xB7T5 +o6c [ +c $4 $1 $6 +xA8C +s13 Z1 +x61x62 +D3 o2_ +$2 $0 $2 $5 ++9 -8 -1 +*21 i0m ++0 +1 +5 +[ i6o +,4 *04 .1 +*41 -0 +i1! ++9 -1 -8 ++1 +1 -2 +$= $1 +sW"x39^h +^x i0t +i54 i62 i70 +i3g i4e i5r +-3 -4 -3 +*76l$P +R1z1 +] o2d +*A0o2jo9l +E o5v +o6` +i5X +o7s x51 +$8$9$8 +^1 ^@ +skjo7+s f +c $3 $8 $9 ++3 -5 -2 +*78x45*71 +i32 i3d +*56 o5j +$5$6$0 +sck x21 +c ^ ^1 +o8+l +DB$5 +o3d $1 +^s x82 +o19 [ +}xABx51 +$9 $8 $! +-8sdU ++3 -2 -5 +s4)sykxB7 +i67 i78 +x64 ] +,1 -8 E +i6Y t +$8 -7 x83 +i75 i53 +TE +^o } +c $3 $8 $7 +*79 -9 +i10 i14 +-5 i5n +$. $9 +x02 $A +T6 T8 ++7 $4 +,7 p5 +x75 o59 sQF +D1K +i4d i5e +$8$2$0 +i12 i35 +D5 *24 +*B0i6N +sUyY2 +o8.l +Z1 x32 +Z4 xB6 +*50 x53 +c$f +o3J +$1 $8 $0 $5 +y3 x37 +*24 x02 +*B7^U +i31 i40 +p2 x62 '8 +i01 i19 i28 i36 +^!s7j +$f Z1 +i11 i16 +D6 *82 x82 +TBo1R +,0$o +i02 i10 i20 i35 +$3 { +o6s c +i78 o0K +^R D7 +x13 -2 +x64x91Y2 +] o6n +^a x61 +o0J *76 +i3n c +i77 i57 +o3s [ p2 +oB! +sbq +o1z*59sJV +i4L .4 +*52s/6 +[Y1$h +*81y4 +i50 i74 +D6 ^m +*98x63sag +y2Ki7R +i5e i5a +sio +x64 Y4 +i3d i7a +i3b p4 +'7 l +*5A +r*8A +-8s9' +s\Jx45x75 +D4 o2b +$8 x83 -7 +i3b i5e +t i5y +i8a i9n iAd +x06^X*B4 +i32i40i50i68 +[ ^Y o1i +i7c i7d +*36 D3 [ +iA(syP$m +x53 t +i82 i90 iA1 iB5 +x73 l +*B5 'B +i82 i90 iA2 iB7 +} -1 +,4 .1 *04 +o8c 'B +$b x72 +$3$4$8 +l x23 +o8( +^f +1 +c o85 +i4y +3 +^0 x21 +sKN +^_ $_ +-0 o3c +$3 $c +$2 ^@ +x28t +.6sk} +$3$2$1 +i9? x93 *87 +Y4 x87 +'B $3 +c $6 $5 $1 +i0m i1a i2c +$8$1$0 +LB^!x4A +i58 i64 +i31 i73 +f ,1 x29 +-2 i3l +x25Z1 +i72 i80 i92 iA9 +cT3 +o3g *02 +$7 $a +'7s<) +i72 i58 +*A6x31T1 +x9A*69 +$1 -7 +,1 E -8 +i9? *87 x93 +f x29 ,1 +^S t +iB5 c +x4B,5o5B +i6u D4 +f x86 +sf`s#OsD{ +o8#RA +$c $0 +o4cK +$s iAi +$y $s +x95 x49 +x47 *30 +i3c i7c +i74 i7a +*54 o0K +$po1r +*38,A +x14 ^m +Y2y2*96 +$6$8$5 +.7Y2 +o6e [ +$h $e $x ++4i7S +c $9 $0 $3 +o3w *31 +p4s_;x32 +] o7n +[ ^L +o3nY5 +x91 $k +*12 o1j +u$1$2$3 +i5e i77 +$7$3$0 +i71 i89 i97 iA9 +o45c +i44 i52 i60 +*24l +^j ^r +x56EZ5 +l o4b +i5d i1e +]Y1TB +x12 *30 x31 +$8$1$8 +$1 $1 $! +xA1 $6 +A +c i32 +ux45$_ +-0-B +-3 -3 -4 +D1 ^5 +c s8! +x91 D6 +i5- D2 +*54 x12 +l i6n +-9 xA2 +i4n T0 +$1 $e +x42 K +t xB5 +*51x68x84 +ko3% +Y4 .5 +s z*93y1 +*34 o2x ++1 +1 +9 +D4 t +$9$1$8 +$1 $9 $5 $8 +s*Hi8i ++5 x63 +[ *01 +o7K t +x32 o2. +x87i9l +^. r +x23,6y1 +i89 -9 +} ^b +$3$2$5 +i0l i1i i2l ++7 +4 +T7Z5 +^d ^o ^o ^w +$NsWp +di3Jx29 +p4'B +i2a l +*19 i4s +Cs`" +uZ3 +x03 $7 +o77 D6 +-6 T0 +*A2o0i +o7s c +o5) +T7*64 +D2 ^b +i2i i3t i4e +i82 i90 iA2 iB5 +k *30 +-0s6_K +y1 -2 +x14 C ++8x54s#! +c ^c ^1 +-8 x04 +] ] ] $i +l o6g +x42 Y4 +$7$2$4 +i3W +x36L7 +s1j +x52 c +x63 $5 +Y5 x14 +c $4 $4 $9 $0 +Y2x64 +.1 +6 +-7 i7o x43 +sAT ++4 -6 +4 +$>$> +i81 i99 iA9 iB7 +-5 '6 +k i1m +*68o5bRA +sSP +c $1 $4 $9 +$2$9$2 +-8 DA ++8 x42 +*13 $A ++1 +2 -0 +$ux2A +o7pxA4 +$1 $+ +i14 i11 +srEK +$9$3$3 +i0r i1o +c i03 i13 +$7$9$7 +]Z3Z1 +c $2 $8 $0 $3 +^g x32 +*02 ^b +$5$3$2 +x13 ^C +D5 $i +Y4x36o3v +x02 $6 +^g ^o ^d +$!D6 +s1Jx91.9 ++0 ^1 +i10 i50 +i0k i1i i2m ++8cx7B +z1 ^j +o5j +0 +D6 o2w +D8EsT; +i5{o6S^d +$i x12 +'7y3 +i51i69i79i87 +ux67x2A +o6oc[ ++3 +3 +8 +Y5 i4- x28 +c o30 +i4A t +*5AseLo5s +x65Z4 +^9^6^9^1 +$7$3$4 +,0y5 ++2 o71 +i18 i58 +$3Z1 +s>}'9 +shv +x02 ^X +i79 i19 +T7 ^1 +xA9^o +i01 i19 i28 i39 ++8 o6a +^El +o1l *13 +c $8 $8 $! $! +t i4y +^7 ^2 ^0 ^2 +$- $m +x04 *02 +oAf ++7 -0 -3 +i9J +] ] ] $d $o $g +-6 x04 +t,5 +^Cszx +s3Xtsi! +*34 +1 +$o $r $e $o +i4m i5a i6n +i1bo9Zc +i6O K +T5Z1*87 +T0 o6s +s3U +i5e i76 +$8$1$9 +$b $a $l $l +*03x78 +c $3 $d +*01 $t [ +$5$9$2 +,7 t +0 +x13,7 +'6 *54 +$4 $5 $1 $2 ++2 +2 -3 +y3*69*68 +i35xB5xB6 +*32 *42 +^' ^( +x95o9{ +iAJ +x94*64x3A +stl +oA1 l +i02 i10 i20 i32 +y5x4Ax45 +^LxB3s{" +x93 t +^2 D5 +r $5 $8 +c i00 i18 +x31 T1 +*40 x34 +x7A,6 +.1 o0L p5 +[ o0T +kd +$K t ++0 -2 +3 +o5v D0 +*80y5 +$s *31 +i81 i99 iA6 iB3 +$K r ++5 +5 +6 +x91 D5 ++2 -5 -5 +*32s2Ts?d +$- ^- +s1\$<'8 ++0 +3 -2 +D5 -4 +*B1x6A$7 +x54 c +shj +x67*BA +*67*0B$x +$h $o $b +,7 +0 t +sHP +stf +i15 i11 +K } +Y5x8Bd +iBa x74 +T2[ +o8QsYjx1B +,Bs]x ++3 +8 +3 +x14i4yk +$9$0$6 +x18i4y +-7 x03 +o3ii65 +l i6t +$0 $5 $1 $0 +oAmi5& +.6L9s>i ++6 c +x52 o4g +$iiBH +i7;s_>s,q +,5{ +-5 D3 +o6Os9" +t o0S +o30 o62 +*26 D6 +x02 x82 +u *30 +-0 $a +x23 ^K +i45 i56 +L8$/ +$C*4B*B6 +o0g ] +o8x +o0b k +iBK[ +o1* +i56 i70 +i3R +$. $f $r +i71 i89 i96 iA5 +c $3 $9 $8 +x02 o4- +[ z3 +'B $0 +} o1c +i6#xB5 ++7 -3 -0 +D6-8 +*32 i1u +d 'A $4 +l $S +$csGZ +x21 x52 +y1 o0q +-4 +5 +^g ^s +s|7x61*87 +D2x2Ay3 +i6i x02 +D6s#X +x54 $3 ++4 +4 -6 +c $7 $7 $4 +$v D7 +-2 i3b +c $8 $0 $1 +xA6*3B +l x12 +$9$8$9 +i0Y +k o3o [ +x49*15 +o2n -4 +Z1.1 +i5i x31 +^E*10 +l o4v ++A -4 +-1 -4 -4 +*50 +2 ++1 -0 +2 +*76 +8 +C $3 $9 +i6H $p +sKCx47x38 +} ^s +i71 i89 i98 iA8 +*31 i1a +Ei8x +x01 $p +c $9 $3 $6 +E -5 +ci06 +l ^n ^a ^m +D8 +8 +}x8A +i3n D5 o4d +i3n o4d D5 +Z1 c +si)T6i0! +c $8 $9 $1 +sjc ++2 -3 +2 +c $6 $6 $3 +i57 D8 +$b $o $s $c $h ++5 +6 +5 +*79 'A +*01 [ $t +c $5 $0 $8 +$2 x32 +Z3TBx62 +$_ d ] +*78x6AD7 +i1Qk +^~ +skn o1o +c $1 $7 $6 +$6$5$6 +l x92 +$x D5 +o21x2BsmH +R5 ^S +r ^S +o7h o8i +*21 x25 ^p +t -6 -1 +i21i39i49i55 +[Y5x36 +sci +-4 -6 -5 -7 +x75sik^R +o0y,8 +o3B +o2b *32 +x12 r +u $r +D5TB +D2 *54 ++8 D4 +{ $P l +i01 i19 i28 i35 +*98p5 +i81 i99 iA6 iB7 +Y4 x24 +i01 i19 i29 i31 +o4fsDV +D7 p4 +D6oBmy4 ++6 x73 +Ei31 +sAExA6 +i72 i80 i91 iA8 +i72 i80 i91 iA7 +*15 .1 +D8 ,8 +*A8x04iBz +sOIx07 +so=i3l.A +i01 i19 i29 i30 ++2 -8 -9 +x71 'B +o65 t ++0 -1 +5 +sA2 +] o6g +*94.2x05 ++9 +9 -3 +t -1 -6 +^Psp6 +p4 *16 +sae i2m +i4d i5o i6n +^P +3 +$7$3$5 +x93sO|Y1 +csP;} ++0 -2 +5 +k o3- ++6 -1 +7 +sXwx45sTL +] i4_ +x71 } +$6 +7 ++0 +1 -6 +i0S D4 +-8 -2 ++9 -B -A +sslsAd +se3 $! +*62 x42 +i91 iA! +c i00 i19 +c $@ $5 +iB5*28 +i72 i80 i92 iA4 ++1 -6 -0 +-5 -8 -5 +*35 r +i34 i45 i56 +sXa oA_ +R5x62 +s/cp1*73 +.BR4 +x39K +*52 o1A +$E u +o5?*64 +^e ^n ^u ^J +i6m i7a i8r +-0 -0 -5 +D2 l +^M +7 +c i09 i12 +i12 i13 +s'}sB`*8A +$s $y $r $u $p +oBf +^A +6 +} *41 ss9 +$5$1$4 +*76 o5t +*02r +} ss9 *41 ++5 +5 -6 +-4 -5 -7 -6 +-3 o92 +$6$4$0 +*40 x24 +oA#$sx57 ++9 -A -B +o2x *01 +u $B +*85o0d ++6 +7 -1 +s%} ,2 *64 ++1 -0 -6 +'8 K +] Z1 T6 ++2 -9 -8 ++0 +5 -2 ++0 +5 -1 +*69 *86 x34 ++5 -6 +5 +$j { +*53 x62 +i72 i80 i92 iA6 +i71i89i99iA6 +d x28 +.8*60 +sg7 +*42 o0D +y3x03*64 +$d x52 +Z1 -A +-5 -5 -8 ++6 Y1 +s(=^\ +-B D7 +i0P D2 +snks27 +o4R +o3x *23 +$2 $1 $! +$d ^l +i3c i7a +o87 x52 +$1$1$0 +$5$0$9 +$3$9$0 +$4$7$0 ++0+C +se3 T1 +i3@sZDxB8 +o8O ++6 $@ +szu +$4$4$5 +-0 -5 -0 +c $0 $2 $8 +'B soa ++9 -3 +9 +$3 -8 +o7e x43 ++3 D6 +$9 { ++0 -6 +1 +x29*69x5A +i7a i72 +x19*0A +iAasT,'B +D1 K +u d 'A $7 +K x84 -9 +i5e x62 +x24 x51 +$9$4$1 +i6m ] +x49+3} ++2+1 +$1 x36 +C $4 $0 +d x23 i2m +c $@ $4 +C $4 $8 +c $6 $8 $9 +s5Zx91o7s +*35 D2 +i8_ l +-5 *46 +$5$0$3 +$5$0$4 +*82Y4 +$5$9$4 +o0w z1 +K +2 +$4$3$8 +$2$6$5 +^C +2 +C $6 $1 +x92$m +Y1l +'9 o7y +i1r i2e i3s +l ^d ^r ^a ^h +y4 Y1 ++5+B +iAm +x04 $3 +^g .1 +xB3 d +^a'4sO' +] x38 +o0t ^D +$m D9 +x03 f +$6$8$7 +$6$8$2 +D4 +6 +-4 -6 -7 -5 +$8$7$5 +$/ $1 +o7C +sjZ^^{ +$9$2$8 +^a ^g ^n ^a ^m +^y -2 ++1+B +i77 i7a ++1 $s +oBg +sU}sgpx24 +c $9 $5 $0 +-4 -7 -5 -6 +c $1 $6 $9 +-3 ^r +D1 $l +*27 o2n +spWsxz +x21 i6e +*06 +6 +o60l +$$ x72 +,7 ,6 +y3 x32 +$s c +$b { +x17*86Z2 +i74 i55 +Es{J*52 +s31 o77 +$4$9$3 +o4x x21 +T3x13sz_ +i2r i3l i4i +o8; +$3$6$1 +l o74 +o3u *21 +[ T2 +$5$6$4 +D8 $2 +t $w +x18^Z +*25 x32 +$x+0 +-4 -5 -6 -7 +*60]E +c $1 $7 $3 +i82 i90 iA0 iB2 +l $i $t $e +o7_ T0 +i3f i7f +Y4 x73 +$($( +$s $o $b +$9$4$3 +x41 ^i +^a ^n ^a +c $1 $2 $3 $? +i62 i70 i82 i98 +stD x02 +Ei9msPD +s,Rs`Ei42 +$z D4 +[ o5g +$6$3$7 +z2 o1k +'7 $! +std +*78 '9 +-8st7 +i7h l +^3 ^4 ^7 +c $1 $9 $3 +$8$2$4 +*20 *50 +-1 i4a x43 +K x32 +E Z5 +d xA3 +'7x36*31 +$s ^k +-4 -7 -6 -5 +$8 $a +i5c i5f +k *20 o0f +$k ^D +T4Z4 +*8Ap5x19 +x41 $1 +x31D4-6 +D2 o0D +i40 i51 +x26sh{ +-0 x41 +o4rY1x6B +o32 t +r $6 $4 +*5A*57$! +*73^B +$tx95 +i3M -7 +s1L +c o1l +Y2*B6 +x48D3 +i1t -0 +$7 ^7 +$3$8$1 +r $7 $1 +c $9 $0 $4 +s!P*69 +c $9 $@ +u $2 $0 $0 $0 +i2C +o3u ^m +x48sS&^0 +$6$9$6 +$8$3$3 +ki9dt +o4o *24 +^H L1 +o93 +8 +] ^R +^!,A +i0f i1l i2o ++5 -0 +5 +*62 x32 +^y o1k +} i1f +c o58 +$a x54 +i7m x25 +i8C +-3 l +x0A.5 +i73 i56 +Z1x72 +p3 *16 +D3 i4k +i9;s0k +o6c [ +5 +i5z x14 +$5$1$5 +*59o8_ +o5{ +c $4 $5 $9 +^a ^g ^e ^m +*58 D5 +$"$" +t ,4 +$s -5 +c $7 $0 $5 +c $3 $4 $1 +x07 p3 +^R D3 +i7bE +K*50 ++1 -2 +5 +*68 o6r +c i50 +{ r +$c *67 +c $5 $8 $7 +su}i6" +sU}]*53 +,1T6 +x81 $9 +Z1x53 +$r $h $o ++0 i5t +o44,5 +$5$4$9 +f [ +$4$9$0 ++5 [ -2 +i0$xB9*28 +x21 o0C +$a $s $u $s +D6 -5 +t ^e +i19 i34 +T3 T8 T4 +c$1$2$3$, +Z1*35 +^y ^k ^s +p2 xB3 +s+vZ5 +i6R D0 +c $6 $1 $8 +l'Br +[ o5i ++5 -1 -2 +x32-4 +o9)x15 +D0 *14 +i6k T0 +i5f x13 +'8 i4_ +$3*47 +i42i50i60i70 +x12 } +^]u[ +x62 ^M +i81 i99 iA7 iB9 +$7 $7 $7 $7 +i50 i76 +o8m x93 +-0 -5 -1 +[ o5n +c $2 $1 $2 $5 +y2D6 +$6$2$9 +*70 x01 +c $1 $6 $4 +$3$5$7 +D0 x13 +x52 i5@ x52 +$2 $6 $0 $4 +i7jxB2 +i0s $a +$3$5$4 +-7 o6. +RB$p +i0f i1r i2e +o3h [ +snu +D9 -A +i70 i10 +$- -4 +sCR +t o77 +sezd +T0 x74 +suP +o81*4BDB +c ^1 ^8 ^9 ^1 ++5 +5 -0 +c $2 $3 $! +i51 i3e +$r *A9 +*A8z1 +T3 T4 T8 +$d D5 +^d *40 +s2w*20 +*62 +2 +*30Z1 +,6*19 +*64s;4 +*40s9B +x61 ^i +$L r ++B +C +B +-6 l +i4xs^{x92 +o8~ +r $6 $0 +-0 -8 -0 +c $_ $6 +*49saxsWk +c $2 $9 $7 +*03 ^a +-0 x52 +$9$9$3 +x51 C +*31 *34 +*45 x67 +i71 i54 +} x7B ++1 +1 +6 +*2B*9A*46 +Y1 x75 +o0D ,7 +i01 i19 i29 i32 +TBi6j +$b $5 +-0 -0 -8 +Y4 x32 +so9 +$5$0$5 +x42 i3J +-4x13RA +^f i1y ++3 -1 -2 +i51 i69 i78 i85 +$0 $1 $! $! +] $B +sD1Z3c +s4A +subxA2 +L0 z1 +Y2x96u +i2v *13 ++2 -0 -1 +o1a -9 +oAb ++3 -2 -1 +i0L x23 +sig +i6k D4 +u $7 $7 $7 +i5d i54 +l i4h +$a .3 +*68 *78 +-0i8A +i6F +svm +o1o x71 +x43 o2n +[*92Z2 +x31 o0D +o0t z1 +*62 o2s +s0j +i37 i3e +l ] $R +*68*46 +$7$0$5 +xA1 D8 ++2 -3 -5 +x1A^q ++1 x21 +}D8s/e +i75 i7e +i6s x21 +^$ $$ +i4z *64 +-7 +9 +i4X +*4A}^9 +c i09 i13 +$e o8v +i58 i73 +$* $* +c $3 $@ +i30 i3e +} ^1 +s_f +c $1 $3 $! $! +i71i89i99iA5 +$6$7$9 +i3a i4s i5h +i0X +.6x08 +x5Ao8c +i2c i3h i4i +o8o l +xB1 $2 ++2 -5 -3 ++0 -5 +0 +$i Z1 +o5'xAB ++2 -1 -0 +-3 x51 +x01 x83 ++6 -0 -0 +iAn x64 +i72i80i91iA1 +i5a i78 +*15 x13 +D2 x07 +$nx79*A4 +smW ++B +B +C +i5f i5d +i51 i69 i78 i81 +[ x01 +xA1 +A +i4btx43 +x4Ai5u +x21 .5 +CxB2 +i1e i1f +i5o i6g +t *63 +c $6 $8 $0 +[ srz +c $3 $5 $2 +xB8$Y +*87x92s1M ++1 +5 -2 +$b $a $a +,1 D3 +$=$- ++5 -2 -1 ++0 +0 +9 +i01 i19 i28 i38 +i5b i6o i7y +$7$6$2 +-0 -1 -5 +o2h*A2 +^mk +$! $! $! $! ++0 +0 -5 +'7 D4 +i5r l x23 +D1 ^0 +Y3u +snl +Cx3AxA1 +o2< +sTB +iAk +o6~ +c $2 $6 $8 +snw +c $7 $@ +[ -4 +$6$5$3 +sgR +c $9 $3 $1 +i74 i53 +i5r x23 l +x21 ^l +D6 x97 +*08i2u +'B +7 +^l *03 +*67 o6- +D6 +7 +'9 o4. +'7 $s +oAix98o8e +Y2 x43 +*67 *56 +*13 i4y +i41 i59 ++0 +9 +0 +TAu$b ++1 +6 +1 +Z5s`j +i0v i1i +$4$1$9 +i1e i3c +$8$2$6 +sc| +r *36 +p5 $l *A1 +sal +D1 o2h +-1 *43 +x23D8 +p2 { x94 +sme +sGi$8 +i0b i2g i1i +c i72 +.1$n +x15 o0j +x02 *02 +3 +sjGcs!K +-0 ^J +D2 x59 +x71 $a +i4t +2 +$n l +^E k +r ^f +{ $k +$8$4$0 +c $8 $1 $7 +r $5 $7 +TAx49 +^u *31 +c $8 $9 $! +k i3h +^h l +$s -8 +sv=i1hx29 +i72i80i90iA1 +c $2 $8 $3 +i0a i1n +o7z l +i70 x21 +x31x83 +D3 D4 +c $ $7 +-2 i0m +i6i i7n i8g +sRvi2' +o7~ +^6} +x02 +3 *02 +Y4x2Bx13 +-4 -6 -4 +D7 D4 +-2 ^k +x03 +6 +xA1saeD0 +o2n ^c +s1gx7A +*86 -8 +-2 -9 -3 +c $7 $6 $0 +x12 i3g +^k +3 +$e $w +c $X ^X $x ^x +i4- $h +l Z1 $y ++3$?s^s +r ^M +x52 Y5 E +i4c l ++9 D5 +sUG^0 +$9$6$8 +^s i1j +*9Bsu,i1c +i76 D5 +i70 R6 L6 +oA? +Z1x71sA` ++6 o39 +i21 i32 i43 i54 +*31E +[ i33 +o6t x03 +$8$5$2 +$D r +x24 ^m +$9 $5 $! +s$bo4lsuO +r $7 $3 +xA5i9v +sah +x13 o0C +*52swJ +$5$2$8 +sFS +$5$3$0 +o7( s(1 +*18 p3 *48 +u ^x $x +c $1 $4 $! +$3$8$2 +i7q +$6$9$5 +$a xB4 +l ^o ^r ^p ++4 o3g +} x59 i6i +c $X $x ^X ^x +sbk ++2} +r $4 $7 +i18 i18 +sYhZ3 +Y2 o9i +*28] +x39 -1 +p1 xA5 x07 +$4$2$5 +$8$7$9 +i4n *65 +xABo3- +u $x ^x +r x63 +-0 } +r $4 $1 +$3$4$4 +*87 .1 +i68 i79 +*87.4 +$8$9$6 +l ^o ^i ^b +o5v l +-6 $y +p3 o19 +-0 $1 +E *13 +y2x91 +D5 ^e +i6r i7e +xA6z1o4V +$_ ^1 +i7a i78 +*05 x03 +s5s +x51 i44 +i16 i11 +[ ^b +y2 E +i8Z .8 +Cx04x19 +syk +c*18K +*47 *65 +sq@s){ +z1xB5E +R1*A7K +R9Y5 +c $9 $2 $6 +$8$1$6 +*68^a +c $4 $2 $5 +c $8 $7 $9 +c o79 +p4 o0x *9A ++0 ^B +$r *98 +p5so0 +]D5 +x67x98 +Z2 sp% +$o x65 +] o1r +$4$1$5 +$@ i61 +ssm +iB< x34 x56 +$- $x +x32 $7 +i71 i56 +-5 +7 +t s9! +x78^- +-4 -4 -6 +o7U +i7f i7d +$7$8$6 +o65]*2A +s;.$N +$M +0 +-5*2A +$4$7$2 +$2$6$4 +] $w +D0 i5x +i0m i1o +^j $s +so3s+K.5 +s9# +sAR +.4cY2 +} d x04 +D5 *23 +$5$1$7 +*30D2 ++7 ^F +c ^X $X $x ^x +p3 K +o7a +8 +c $5 $. +i3s i4e i5r +$1 $2 $3 $_ +o8n x91 +*28.1y2 +c,7 +y2xA6 +p3 -3 +i0c i1a i2n +o9)^d +o6C t +x09 i1j +s,(+7 +'9 o7n +-2 -3 -9 +u i8, +Z1 o59 +sydxB9o1j +s$T.6x36 +p4 *9A o0x +o68 -8 +r $6 $2 +*51ss9 +x01 $x sxp +i82 i90 iA2 iB6 +x02 o2- +x62 -1 +c $8 $9 $2 +$2$6$8 +p5 *A1 $l +o97 c +^E x14 p5 +x23 p1 x03 +i2f x79 +i3o i4t +c $9 $* +i51i69i79i88 +^x ] } +$2$5$8 +c ^X ^x $X $x +i22i30i40i50 +i71 i89 i96 iA3 ++3 ^m +sh6*9Bi6Z +s1;i1a +^T D3 +i71 i89 i97 iA8 +iBu +o5$xA1 +u*08 +sJK +*30$l +$L*6B +^1o8kx95 +x73 x53 ++3 o4_ +o3/ +*1B^M +c i08 i19 ++5 *65 +^` l +} +0 +c $X ^X ^x $x +o3i *53 +-2 -2 -5 +s0)*56sAX +} c sVR +.1 [ ++6 *43 x41 ++4 i4z +o1M { +$4$0$7 +*25 *54 +$8$5$3 +sXR$9 +swy +i38 i72 +$@ ^@ +i72 i56 +x28sDU*03 +x51 ^n +i81 i99 iA6 iB6 +c ^X $X ^x $x +i31i49i59i67 +$2$9$5 +D7 o7- +Z1 $. +oAssG- +shL^t +l ^p ^u +i19 i18 +]R6 +r $6 $8 +i6"x84 +D4 x31 +*A8^0*4B +i3UEx53 +i11 i71 +-2 -5 -2 +-3 *64 +*25 o2p +-0 *05 D0 +s!2 +$9 o76 +i01 i19 i28 i33 +c $5 $2 $4 +*3B[r ++6 o78 +Y4$b +$i $c $y +C $4 $9 +d 'B $2 +$5$8$5 +$9$3$7 +i41i59i69i74 +i21i39i49i58 +$3$9$4 +s,&Z3 +o6m l +i1a i79 +$3 $* +$t x42 +} x13 +slny5 +$3$6$7 +s3M +xAB p4 +sz|^c +*78x21 +] y4 +$6$6$8 +$5 oAt +'5 $3 +-2 *05 +$5$8$6 ++D-E +i9a x61 +$9 $6 $! +c $7 $1 $5 ++0 D8 +s/Xx85 +Kx41 +^c *30 +-5.6 +}x32u +t *31 +c -3 +c $4 $9 $6 +i81 i99 iA6 iB0 +$8 { +*35 k +i0t *50 +$8$3$8 +c $8 $3 $8 +$3$7$6 +s52 o71 +x52 *31 +l o4g +x15 x52 +$7$3$3 +u $1 $9 $8 $9 +i1a i2p i3p +c $3 $1 $9 +$7$4$9 +i72 i54 +xA3*80y2 +'8E +$a $d $e $r ++6 $e +i4_ +5 +]x45^9 +t x05 +x36iBM +x62 l +i96 iA6 iB6 +$a Z1 +$p { +c $6 $0 $3 +$6$8$0 +x83+0 +-4 *42 +$6$8$3 +[ *40 k +$_ [ [ +*34,6 +c D7 +i4Y c +c d '8 ++5 -4 -6 +oB +*90^. +-C-D +*18-7 +T5 T2 ++B -9 +B +$# $3 +s0/i6@ +t ,7 +i1o -4 ++9 -3 -5 +-2s>Y +i78 i5a +$6$3$0 +$6$1$7 +$2 $3 $0 $7 +i3a i74 +x41 i2o +$4$6$8 +d x16 +*56 o69 +$1 $9 $4 $5 +T9-1,A +i67 i76 +$n o9e +} *93 +Z1 $c +u'B +i5e i6r +c i09 i14 +i3k i4o +i51 i69 i78 i82 +c i09 i18 +$o +8 +s%(c*9A +i9px57 +$1 $2 $@ $@ +*65 o0r +i0s i1a i2m +Y2 $2 E +$4$9$7 ++5x68 +*20.2 +[ o5l i0r +$7$6$8 ++D -E -E +$s *68 +*32 *25 +ciBd +^p x52 +^j *24 +p1 s12 +$h ^a +R4*7B +$5$5$5 +$6$5$7 +r $8 $1 +o0.^w +i0A i1u i2g +-Bo6{o3I +i72 i7d +x32 D1 +o8Cx35x08 +f x8A o8a +c i00 i13 +*28o01 +iAc x78 ++3 -5 -1 +i0h i1e i2l i3l i4o +DB^cs05 +$2 $0 $2 $6 +$1 ^_ +srn ++3 -1 -5 +d xA6 +c $3 $3 $! +z3 [ +,7o3r +D1 T1 +y5 { +*B5^! +c d 'A $1 +i0q +'8 C +] o2W ++2 +4 +4 +$9$6$6 +*1B$5Z2 +[*09Z2 +$4$8$4 +$4$8$5 +Z4 x38 +so0 sa@ +$9$6$3 +$4$8$9 +LB +*47*80 +x84 x98 +i5sc +i5c i1a +$r $i $k $i +^4 t +o4t *45 +$* ^1 +*91 o9r +$q$l*79 +D7 $i +x61 o5a +[ $9 +r $3 $7 +$3$0$3 +{ -0 t +x91oAkD5 ++7 D1 +$3$0$7 +$0 x21 +x62 i4N +s5=shD +i56 i66 i76 +*64 *57 +i0b D5 +D7 $1 +x0Bs3X.6 +D1 i4p +-2 *12 +0 +r $4 $0 +o7Lx1A +i51 i69 i78 i80 +c $= $1 +*52 [ k +o61 $. +*64 *34 +xB3^BD4 +s1b +*75 o6e +x42 c +Y4[x46 +D2 *24 +*51 x32 *30 ++0 s23 +$4 $c +*13 r *67 +sH5 +^8 r +i1a i5d +i3/ +o2Ssqis>L +scJ +^l '9 +$5$2$4 +c^8 +s|9rE +i42i50i61i71 +i8G +Z1Z2 ++5 -6 -4 +D1 ^B +x56$axA6 +o7bsV& +$7 x82 +x61xA1l +y1oAX +iBLR5 +sNK +i52 i60 i70 i81 +sUso9so6& +li6R +*B1 ++7+B +-5 +9 +*69i8z +x14 z3 +Y2 E $2 +K*70 +i71 i89 i96 iA7 +$9$5$8 +i5hsC6 +-4 { +xB8$m +$/x71 +*45 o0g +i71 i89 i96 iA4 +i81 i99 iA8 iB1 +i81 i99 iA8 iB8 +}$Z +s%JoA|^e +] $3 ,2 +*52 +4 +1 +*52 +1 +4 +i51 R6 +x93*83$G +D3 +1 +$7$0$4 ++2 E +i5w [ +$s $t $a $n +c $0 $9 $5 +c $9 $1 $8 +z1 r +$4$0$9 +.6 +0 +i62 i70 i81 i91 +-B l +D5 $a +x32 +5 +i5c i5b +i74 i59 +c $6 $3 $2 +x53 y2 +i81 i92 iA3 +i61 i79 i86 i91 +] ,2 $3 +$6$2$8 +sz% +,7 -1 +^s *62 +i6u *64 +c $7 $0 $2 +Z1 +6 +*A9 'A Z2 +c $2 $6 $9 +sdjsaY +c $4 $3 $5 +s^fo4v +D4y5 +c $6 $6 $8 +$i ^d +sfk*1B +c $3 $7 $8 +s!hslbZ3 +o2jo8fT8 +] K D5 +] D5 K +o41 *13 +s\>z2s$, ++0 o4u +i1g -0 +x48$&*35 +x91 o8_ +i25 i33 +'9 i5t +i70 i57 +i6f *76 +*08 +4 +-5*79R7 +i31 i49 i59 i66 +x3BcZ3 ++6 *43 +-4 +2 +y3 x07 +$7$8$7 +i5j x13 +r *10 +x28o3cT2 +{ t -0 +c $4 $2 $7 +s.)xB3 +x12 x07 +x61 -3 +i7, +[ p1 x63 +o0C*A4 ++5 o3k +i1f i1f +'6dsx0 +*03 D2 +i33 i74 +r *03 ++1 -0 +5 +i1O t +*A3 ] +$3$0$6 +] ^( +o4F x09 +-2 +7 +$3$8$0 +.1x64o8! +*8A x54 +sGWi6;o8; +.4 } +*24 x56 +l o9e +$1$6$7 +} E o78 +x72 -5 +o0r x24 +sdg +$9$0$3 +} o78 E +'7y1x69 +sBix15sxS +$a t ++2 -3 -9 +$2 T6 +i5e i54 +D6 +A +Z1x15 +z2 x0B 'A +$i x54 +$7$3$9 +,1 +3 +}x52 +Z4t +,1 i1i +$2$1$5 ++8 +8 -0 +c $9 $4 $! +i9Z +c $1 $3 $9 +i7b R7 R8 +o6Os6X +i78 R6 L6 +i41 i52 i63 i74 +$9$1$6 +slL +$C*74 +o4N *23 +o7r x82 +$5$3$4 +$8$9$3 +-4 o52 +i8_ p2 +s;qp1 +x32 ^S ++2 -9 -3 ++9 +9 -1 +o4p D1 +x24*74 +K .0 +[ ^N +o55 p4 +s19 Z1 +r p5 +c ^1 $3 +D4 ^A +$7 $! +l T8 +$7$4$2 +Y2K*1B +i5n *76 +i0f i1l +$8$5$4 +*75*12Y3 +*0Asb+ +i52 i11 +i3? ++9 -1 +9 +$5$4$0 +i3M +x34 o0k +*34 x13 +i41i59i69i78 +l ] $D +$5$4$2 +$b sbf +uoB? +'5 Y5 +$j $o $g +k xA9 Y3 +o2Y t +D1 'A +c $9 $2 $! +iA2 l x59 +d $7 +lY5 +c $6 $0 $4 +[y4 +u ^" +C*9B +l.6 +i4P +x21xA6 +*62 *73 +s2C*42*B9 +] x71 +$1o4f +x51 x62 +^d ^a ^b +*67*B3x76 +x71x05 +^r *03 +*78$r +^M -1 +i9B +D3xB5 +^q z1 +s.KY3 +c o2n +c $0 $7 $8 +oBpsgP[ +lx39$% +x71snG +'7 u +c i1i +$0 -7 +E^P +-7 c +sIC +*21 i4t +DA x31 +] $H +x84s.@ +K o14 +s^_E} +$7$8$9 +*A2$h +o3% +c $4 $6 $2 +R4*A5x67 +^dsV6*BA +$! x02 +Y2o9&,9 +o0x ] +sBT +^u { +x42 i6< o6t +i60 ] +x93 p2 +i4E E +*95]D4 +$. $, +i71 i57 +i61i79i89i93 +.4soVx37 +D7 k +^g ^n ^o ^l +^8^6^9^1 +$_ $p +c $7 $0 $4 +y3 x53 +Z5x0B +^3 { T3 +l o2j +x32 -5 +c $4 $8 $2 +c $2 $6 $3 +c $5 $9 $6 +x01z4 +s7q +$7$8$3 +*B6sk^$| +s*-*06 +D0*A1 ++0 +2 +3 +x61 *41 +i7Ex07 +*17x82+5 +^p x34 +$4$7$3 +i7ccoB) +y1*57D2 +Y3 o0F +i1p] +d '7 $0 +i5p x12 +K x93 +$m $e $w +,1oB@l +RB p2 +l '9 ++0 -2 -5 +i62 i70 i82 i93 +$s *56 ++0 -5 -2 +p2 $S K +c $9 $8 $6 +i31i49i59i69 +i5f i71 +q x36 +$9$8$0 +i2E +$e D4 +$ks"ac +'4y3 +^b o2n +x81 D1 +] *20 +sic x23 +$2$5$6 +-8Y2 +i9O +-6 -7 -9 -8 +^p o1k +i0r D6 +$a x85 +i17 i10 +x76 f ++0 +3 +2 +c]x3A +o3Q l +c $3 $6 $2 +-9 -C +D0 D2 +c $ $9 +x54 Y2 +'7 +5 +o5dsw/ +E R3 +i4i i5t +iB@ +u 'E $4 +x12Z3*90 +$5$0$0 ++8 -0 +8 +i14 i14 +z5 x17 k +x08 t +Z1 xA3 +c $3 ^1 +$5$0$8 +*24D6 +$4 x23 +oB@ +$* Z1 +T8xB4 +o6* Z1 +*A9 x24 x51 +s5Qs 2 +o7) +o6s .5 +$6$9$7 +o3l *21 +o7X +^z x24 +xA8snd +D4 -7 +r $8 $0 +i5- -6 +t -8 +i58 i60 +$9$0$8 +.As1xx27 +$5 $a +^MK +$4$0$5 +i16 i35 +*B5o0Oskr +$9$4$6 +y5x02 +iAf +-6 -8 -7 -9 +{ $e +p1 *50 +x13 $1 +$t $e $s $t +x89+5[ +lx21*74 +s=uD8iB< +$9 $@ +i6o i7n i8e +$tTB +x81 $' +$2$7$3 +-6 -9 -7 -8 +i9a iAr iBt +[ o5f +i52 i60 i72 i80 +*49-8T7 +*21x38d +^t *04 +i01 i19 i27 i34 +-6 -7 -8 -9 +s%Lx52y2 +i6n i7o i81 +c $9 $6 $! +'9 i9t +slu +*B4E$W +o9rx91[ +$2p5 +D6 *05 +i76 i5e +p4 o15 +*93^R ++5 o4v +^S r +x05 Z1 +] o5g +Y3*37 +*41x68s8l +,7 ,5 +x81 T4 +.8x04o8z +i4sss2.A +i7b R8 R7 +-6 -8 -9 -7 +*15*59 +x87$n +$9$8$4 +-8o9,sG\ +^i ^b +.8Z3 +sbH^0 +R0 R1 +o1vs,C +iBH*06 +$5$7$9 +c 'C $7 +^w x34 +Z5 x34 +iAe x72 ++1 +5 -0 +x17s+vY5 +c i00 i15 +R7d*8B +$a $b $c $d +x51 o1h +*06 x42 +i6m i7a +rsly +o6w ] +$7$5$8 +-6 -9 -8 -7 +c $3 $0 $2 +.8$J +*14 -2 +i4ksL'*39 +i72 i80 i92 iA8 +q t +s.X.0 +{ -0 p5 +s+2^4 +o2fs24ss' +sQVR7 +{ x74 +sd%o7p +^Xx89 +o7Q +i42 i50 i61 i72 +i3f i1e +x02 $f +*78y2sKS +o4fsS0 +R6 o0W +^3 z2 +r ^R p3 +*34 Z1 +k -7 [ +sYB +$_$* +$M } x16 +i58 x23 +s",o1M +$_$. +i97 x63 +*61x02slz +i42 i50 i60 i78 +-5 o62 +p4s-*xB3 +*23 -2 +i31i49i59i68 +] +6 +,4 r +sRG +*13 ,1 +i51 i69 i79 i87 +sJC +o1z ^j +[ $0 +i32 i40 i50 i60 +ko76 +$7$0$8 +i76 R6 L6 +iA]*65 +i5d i7d +r *01 +'4 y3 +c $2 $k +i52 i60 i70 i85 +D0 o6g ++B -9 -A +x12 -4 +sbex57c +$9$0$5 +.8i5j +D2 D1 +D0x37 +D4 D5 +i72[ +D8[ +*03x59 +D7 $0 +x19o6yl +x41 R3 +TAo1{o9e ++2 +8 +8 +-5 x81 +$2 $m $e +u L8 +*21 x24 +i57 L5 +x54oB`t +$1 $0 $* $* +x76*03 +'5 $5 +sr1 +$1 $1 $@ $@ +-1 o08 +*05 o4i +x36{z4 ++B -A -9 +'B [ Z1 +lx2A,4 +Ei4@ +i2R c +i5s D1 +o3v *23 +$M [ +[ $f +Y4s(\ +i1a i70 +Z1 D3 +5 +-4 -7 -4 +'A o8m +$5$4$8 +sikx38xA6 +,1 +0 +tx54 +cs0< +,4 } +smO*95i9X +i79 R6 L6 ++C +C -B +*B1*94$8 ++2 -4 -4 ++5 -1 +5 +ss# +i12 i14 +*02k +-0 -6 -1 +i12 i15 +$vx41*31 +^f } sN- +i13 i53 ++5 +5 -1 +-4 -8 -8 +-0 -1 -6 ++1 *52 +o7W +^0^7^9^1 +iA0 x73 +^s x63 +o0J t +$* i6* ++C -B +C +^4 C +i5e i6r i70 ++0sGo +-2 ^c +i0h ^d +i71i89i99iA4 +.6] +siX ++8-5 +x75 $A +$2 $. +^C p4 +^Gi6= +i78 i7a +D7 *67 +soU ++3 +6 +6 ++2 *35 +*03 o1t +x92 -9 ++9 -B +A +i4m i5e +r D6 +^G D3 ++0 -3 -2 +x64 i0k +$9$3$9 +-4 -4 -7 +$7$5$7 ++1-A ++0 -D +$s [ x32 ++9 +A -B +*69^@ +iB6Y2 +y5 x91 ++0 -2 -3 +R5 R5 +i0j i1a +c $f $1 +^s l +i3s.3 +'6 $k +o2- *01 +^o ^l +K*97 +o3t x53 +iBn x75 +5 +$Cs8e +$esfNl +$w D8 +[ slt +k K +$8$6$2 +sd{iB) +x13 *31 +x78 $u +iBn +5 x75 +^e x71 +$3$5$0 +*65 D3 +*69 '8 +xB2 x43 +x03 [ +$6$7$3 +^3 ,2 +soa [ +o3[x12*01 +D1 ] ,2 +*74 +5 +i5# +}+1 +x79 D8 +$t Y1 +c o77 +i1H +-3 *57 +$3$0$8 +,6 +3 +$6$1$4 +D1 ,2 ] +o5- x03 +R4s-vq +T7 o13 +C '7 $2 +o2r } [ +$f $u +$8$7$6 +i01 TA +z2 c x2A +syo +z1 i1t +x31 c +'5s+{Z4 +xA2 [ x1B +'9 x61 +x76i8g +x13 ^x +*21 [ +*56*12 +$6$4$8 +i4? +] $o f ++0 } +p4 ,9 +i75 i5e +l s12 +Y1 Z1 +$4$6$2 +$b $6 +i52i60i71i81 +$n x65 +$8$5$9 +$8$5$7 +i5d *05 +o0b K +$7$6$4 +x63x74] +$hsg`x87 +$5$6$2 +Y4s6} +^gx95 +o0e o3l +D6 o2d ++5 o49 ++5 o47 ++2 o75 +R5 x13 +s%<$u +R8x62 +Z1sd! +*10 +7 Y2 +-1 i0g +x14 i1t +s.8 +x69sQu +$9$4$4 +o39i1v +Z2}*01 +$3$6$6 +sAe +*54 D2 +oAl +^m -4 +o8H +$4 $b +i62 i78 +t o4y +z2 o1l +i2|o8L*9A +[DBx91 +$$ Z2 +i61i79i89i99 +i7e -8 +x31 x42 +*20*39.B +D3 -6 +*52x2A +i6mo0q +so0 T7 +t s52 +*62 x02 +Z2 o0P +x06*A7s^% +l $w $o $o $d +-9 D7 +*35 *50 +5 +*15 *23 +slU*B1 +s<`lZ1 +c $9 $7 $0 +c $9 $7 $5 +s9+x28 +c $9 $2 $5 +c $6 $0 $5 +t o0n +T0r +} o1o +D6 l +.Ax39 +'B Z1 [ +$ $m +o2V*B6 +T7x93 +p1 x82 'B +x23 y3 +$2$0$2$5 +c $8 $2 $1 +o22 +0 +^n ^u ^s +c $e $r +$GL7'7 +i2h *42 +[ $k +i6G +} ^i +^i ^n ^i ^m +c $1 $8 $3 +c ^3 ^0 ^0 ^2 +DAsR[$c +*A2D0sek +T4xA6Z1 +z2 x2A c +c i68 +x7Ax21 +s#+x52p1 +*A7-6Y1 + +*02*24y4 +D5 } +$e *67 +c $5 $8 $2 ++1 i4a +T6 o56 +x34*70 +i5a i7b +x08cd +i5z l +D8 $7 +x18z1s_P +^C*1Bx09 ++2 ^L +l ] $C +-7 o80 +sC1o6Ps}% +$x*10 +oAl 'B +i5n +3 +o6j x02 +Z1x59 +-2 +0 *12 +x28Z5 +R4^q +svf +c $6 $9 $2 +$2 ^B +c ^7 ^0 ^0 ^2 +^_E +o8a +9 +$2$9$7 +*39o0i +x43 ,3 +o0t o3w +$4$6$0 +$3$2$8 ++0 ^L +$4$1$4 +$7$1$8 +$9$4$9 +$6$0$3 +p1 x64 +*B6Ci61 +i0s i1k +$3$3$3 +sSW +i49 i59 +$4$3$0 +i0t i1i i2m +sMQsTd$u +i1d i1d +u Y1 *89 +i76 i56 +$k +8 +[ x13 +i13 i33 +*0Bsk-*A8 +D5 i7c +sJD +sJB +^cY5 ++5 *12 +y2D0 +s.1 +c o84 +l$` +$7$5$0 +s3- +$3$4$6 +o7v i7t +*48 x43 ++7 -6 -0 +$.*2Az1 +$/,9 +c o39 +$9$3$4 +-Ax79 +x43*B3$< +$3$9$6 +o1l *53 ++0 -7 +0 +*03 x43 +*06 x34 ++6 x71 +$1 $2 $3 $? +i53 i62 ++6 -4 +6 +T0 T1 T5 T4 +*47*39,9 +Y1o4nx94 +ssX ++4 -5 -6 +x2Bs7koAL +*87x13q +s%{RB +^u k +c$1$2$3$& +T0 T4 T1 T5 +i8k D6 +*B0^g +^N *06 x52 +$9$4$5 +K o53 +*1Ax83*09 +$f $o $e +{ -4 c +i5" +s^'$u ++1 ^r +i0r i1a +-3 ^v +c $5 $2 $7 +y5sfy +T0 T4 T5 T1 +y1z5 +o1u x56 +T0 x13 ^1 +-2 -8 -2 +z3 T4 +$7$9$2 +D0 Z4 +smYo7n +]p2DA +D9,A*9B +s0HL8 +$2$8$3 +c $6 $4 $0 +*8B.4TA +*B9x73^c +$6$5$8 +c $? $1 +'8 *74 +,7 D9 ++Ax06 +c 'C $8 +c $5 $1 $8 +$8$7$3 ++0 +7 +0 +x71 +5 ++0 +7 +3 +$2 $6 $1 $0 ++A -9 +B +'B*31o1! +*46 -7 +T0 T1 T4 T5 +i1o i2t i3o +Z5 xB7 +D3 i4m +x72 $a +T0 T1 T2 T3 +$3$8$7 +x07*78$l +i5g i8k x65 +u 'E $7 +$h $u $h +o2F +$3$8$4 +x03 $6 +c $2 $9 $6 +x63 +5 Y2 +$7$2$7 +$1$2$0 +i7R ++2 -1 +2 +^h ^g ^i ^h ++8 o0y +xBAi7C +i0J x41 +$6$9$0 +$6$9$3 +i71 i80 i91 +i5c i5d +-6 *23 +sus +k +4 +x72s8= +i81 i99 iA7 iB3 +Z2 c D1 +$1 $5 $1 $0 +T0 T1 T3 T2 +sdR x31 +'5*29L8 +xA1$Z +$0 $0 $7 $! +i7d i8e +[ o4w +o4f D6 +D4rx83 +$!$. +$6$1$5 ++0 x24 ++0 +3 +7 +x51 -7 +$3$1$8 +soA l +T6 $9 +r $6 $3 +[ D7 +srex5Ay3 +T0 T3 T2 T1 ++4 -6 -5 +i5m *53 +$8$0$0 +T0 T5 T1 T4 ++2 -8 +2 +r sie +c i06 i16 +*24 *15 +-2 -2 -8 +c $2 $4 $! +l ] $s +T0 T2 T1 T3 +$t x04 +x04 $r +*32x92 +smoc +x51i5N +*04 D1 +}*21 +*87$2 +T0 T5 T4 T1 +T0 T3 T1 T2 +,2 z1 +x29 +3 +^i -0 ^l +^p *40 +Y2Z1*29 +i0w *30 ++A +B -9 ++9s-"C +T0 T2 T3 T1 ++0 +0 -7 +*76Z4x02 +i2` +x51 '9 +i0k i1e i2n +i0D i1e i2v +i41 i50 +o1g i0e +i41 i51 +o0k z1 +^m ^o ^c +c $4 $0 $2 +sq5^m +i74 i50 +c $3 $9 $7 +i31i49i58i62 +-6y3l +i32 i1a +D7s=w^u +$jsXp +*58 *76 +^t ^a ^c +x32 $A +i80 i90 +c o6_ +i6u +5 +i42 i50 +*23p5 +'7.5-7 +o71o6j ++6 +6 -4 +l ^t ^o ^h +c $9 $6 $1 +*53o96*32 +x84d{ +$4$9$4 +$2 $0 $2 $1 +o2+*29*27 +i3' x04 T7 +-5 ] +iB%x59o2+ +$1 $9 $5 $6 +$6$7$2 +i65 i75 i85 +*61 x03 k +$IEy5 +i3a i4m i5o +i1c i71 +i5e i7f +^Hl +K d p3 +i51 R7 L7 +$2$1$4 +$9$6$5 +$1$0$4 +] $b +x51 } ++7 -0 -6 +K p3 d +$6$5$2 ++6 *73 +DB t ++0 +0 +7 +$8$0$3 +x07 z5 +l ^a ^g ^e ^m +i62 i70 i80 i95 +siz +x05 xA2 +DBx94 +x83o8t +o5m i5_ +$7$6$0 +$5$3$7 +x7Bs5+ +$Lx69s72 +o3.x56 +o8' +*39 +5 +x32 l +i0f i2e i1r +D9s_;^U +o60 Y1 +Kx4Au +i21i39i49i54 +$/x3AsjQ +u o8s +i19 i10 +o1A E ++C -0 +c $5 $6 $9 +Z2 D1 c +^n +3 +$1 o6c +i7Rx61 +soli31 +$1 o6l +D2 x03 K +i33 i76 +o9R +$2$7$5 +x51 i3m +c $ $8 ++8*42 +s3o +o0~ +^S i29 .2 +$8$6$3 +x25 $1 +K Y2 +c ^( $) +o3) +D2 D4 +'B $2 +D5 o7a +i75 i56 +o57 o63 ++1 ^D +*51 D2 ++7 x41 ++8 o7_ +]*59x73 +sBci3b +.6 D8 ++2 +2 -8 +^RL8*9A ++2 +2 -1 +se'.9 +-7 i7t +i6< +r i0j ++3 { +^2 D4 +-4 D6 +^1 $1 +$gsA9.5 +^D o2D +i6m x06 +i52 i60 i70 i82 +i9Rs;c +i8- T0 +*5Bi7i'9 +x73o6Y*59 +i71 i89 i96 iA2 +i5n ] +*06 i0G ++2 ^u +x72 o0v +i7N +$5 $5 $4 $4 +*A9i2g +i61 i79 i89 i99 +i5O x45 +$1 $3 $7 $7 +R5 x62 +i72 i80 i91 iA5 +x37*1AZ2 +x2B]x72 +i5d i3e +i82 i90 iA1 iB9 +i82 i90 iA1 iB8 +] .3 } +slK +i16 i19 +'A x42 +-1 ^A +$3$5$6 +D2i9^ +i01 i19 i28 i32 +i71 i31 +^t*B8 ++5 i51 +^a *24 +x91 +B +.3 K +i62i70i80i90 +$o x43 +l *86 +*41x39Z4 +D2 K x03 +-8 D6 +x03 p1 +t x71 +$7$9$8 +s1x +E ^C +i42i50i60i77 +i34 i71 +i1i -6 +] +5 +$6$0$5 +$-$* +sCF +o46skr +c $6 $4 $8 +x0A*92 +Z5D5x23 +i72 i80 i90 iA1 +^3 ^R +.1c +c 'D $9 +$2$5$5 +i0j i1u +c $7 $1 $4 +^A D3 +swn*67 +$ $! +-Bx0A^Q +i2a -4 +x43 o5l +x53 *56 +p4 o5l +c $9 $8 $5 +'A $w +i49 i58 +$5$4$6 +i6w [ +x05 f +^u x15 +^s i0h +i81 i99 iA6 iB5 +$3$7$4 +*16s@.$[ +*BAY2 +c $0 $9 $3 +$8$0$5 +i1a i73 +D7 Y3 x32 +-1u +x23C +^o *30 +*04 +3 +R9sn+ +^z x42 +s4[lxA1 +i5l -6 +$d $a $v $i $d +c $8 $2 $0 +c ^e ^d +o0w D8 +c $8 $2 $7 +]RAx1B +c $8 $2 $5 +} i1d +x42 o5! +x52 *32 +$7$4$6 +c $4 $9 $7 +i30 i71 +$8$0$6 +x82 T0 +srL +c $7 $2 $9 +$7$4$3 +$7$4$0 +$@ $3 +c $) ^( +l [ ^V +$m $o $w +$Zx3A +*18 x03 +$7$5$2 +i0m i1u +c ^9 ^7 ^9 ^1 +c $7 $9 $1 +] *75 +i39 i59 +o3x x42 +$ $7 +D6 $m +c $9 $1 $3 +c $9 $4 $9 +D6 $t +o3-xA1L8 +c $7 $9 $4 +i16 i16 +-7 ,3 +sne +*12 i0o +o5y T0 +^1 ^K +$g K +6 ++5s(6Z1 +*71 o68 +*87 +8 +z2*54 +x48o9{ +s(Osu8'A +s]|i0Ps0c +y3*8B +D1 i5n x53 +^- ^g +c $6 $7 $1 +$e $s $s +x61 o8e +d '7 $6 +y2s0W +*59 o90 +'B $5 +c ^1 ^! +c o88 ++9*35 +f x67 E +i0l i1i +c $2 $7 $9 +c o2k +i52 i60 i71 i81 +*42 *41 +$3$1$7 +i2s ] +*06 *15 +} +2 +i5x l +^x x31 +$8$2$9 +x03 D1 +c sa@ se3 +i0a i1l i2e +z2 i1o +^v } ++6 D4 +y3 +1 +{ $4 +c T7 $1 +x02 ] +T6 Z1 +x41 $3 +-5 i7e +^1 ^3 ^0 ^2 +o70 Z1 ++B+D +$1 $f +dx2B +$4$1$6 +$4$2$8 +i6m i7a i8n +$4$4$2 +i71 i89 i97 iA7 +$4$4$9 +sdcsjmx49 +$3$7$8 ++0t +^C } +c ^6 ^8 ^9 ^1 +c ^X $X $X ^X +u '6 +i38 i47 +'B Z2 +sy! +z3sVC +i1q +i31i49i59i64 +$8$8$6 +s8@sfzC +t ,9 +i72i80i90iA0 +$8$8$0 +$8$4$8 +c d 'A +*A9 o9n +$. $o $r $g +y1x5Ax38 +^h *31 +$v $e $x +k .3 +o8> +{ { c { +D0 r ++1 l +o48 K +sTDo5OsT* +t ,3 +o1b o0r +x54 p3 +x51 i3o +T0 std +'A x62 +6 +$8$5$8 +c $X $X ^X ^X +D5xA5 +$Kl +x52 i4r +i9Q +i31 i49 i59 i68 +$8$0$4 +i3I}s-t +$6$4$9 +p2 xA4 +o1L t k +i3b i32 +i34 i1a +c ^7 ^8 ^9 ^1 +q x78 +o4U c +T4 k +$3$2$9 +i41 T5 +i72 i12 +$4$7$5 +^X^X$X$X +i3d i32 +$2$8$6 +$8$1$4 +$8$1$5 +[ i45 +x71 T7 +$5 Z5 x56 +i1d i71 +z1 i1s +^PK +$8$7$8 +.5Z3 +i51 i69 i76 i87 +^rx96x5A +sas +i31 T4 +i7e i1a +c $7 $6 $8 +$6$8$9 +spvswl +*12 o1b +$]$[ +*B8ssJ ++5 { +$7$3$6 +*B0 x07 +-4 +2 $A +$8$3$7 +$8$3$4 +x02 +6 +so! $= s!= +i74 i5a +$4$5$3 +o0k *46 +$4$5$5 +i7* x62 +3 +i13 i34 +so! s!= $= +$v $i $m +^. *10 +x08 z1 +$6$6$4 +$6$6$2 +o7R D6 +$1$1$8 +c o6e +l o5- +$7$8$4 ++B x73 +c $X ^X $X ^X +*69 'A +$5$7$5 +sy- +$6$0$4 ++5 *46 +xB8 D6 +$5$9$1 +Y4 x85 +^k } +$5$9$8 +$7$0$3 +Z1 +B -A +Y2 DA +-2 sdy +sau x43 +*B1i88*64 +suiD8 +^n D1 x61 +$ksy# +$8$6$5 +c se3 sa@ +sdy +DA $v +$5$8$1 +x67Y3D1 +i9?l +$2 $2 $2 $2 +-6 *76 +*74 *65 c +r $5 $3 +l i7e +c $e $5 +c $e $3 +x64D5 +$2$5$9 +c $2 $b +s|qc*8A +^C x32 +$4$6$6 +o2& +o5K ++0 -6 +2 +x12 $6 +$4$6$4 +i49 i56 +'6 Y4 ++9 $a +c ^X ^X $X $X +$7$4$4 +y3 [ c +$t i7a ++0 -6 +0 +D6 ^p +u $9 $9 $9 +$r $p ++0 -3 -6 +$9 $9 $! +*68+3l ++9 -C +c$1$2$3$/ +$e +0 +i3t i4h i5e +i1b i1c +t o8m +$g Z1 +[^fK +l -A +Z4 l x96 +^h o1c +sa6 +i52csdD +i4a *36 +i17 i17 +i1? +xB4xA2*B7 +x21 K +-2 -8 -3 +so0 T8 +$a ^Y +soO ++1 -5 +2 +ssJ +s^4i3d +o9d x63 +xA3+5,B +$9 x53 +R5L5*B8 +x6Bd +x63 i73 +Z1 -A +B +s1S +-0 *63 ++1 +A +$v $i $n $n $y +x08[ +i2F +$4$8$2 ++2 ^h +$? $? +o0j } u +$,x82 +y2 x32 +i3c i7e ++4 -3 +6 ++2 -6 -3 ++9 -B +9 +s1i +} '8 +-2 -3 -8 +sWEx94p5 +i3i i4n ++0 -4 -4 +s\[o8Kx9A +*74 c *65 +^y ^a ^d +x03 ^1 ++4 +6 -3 +$9$9$1 +^a } +*31 x24 +{ s1) +-A -C -C ++9 *35 ++0 +4 -1 +o0o *13 +] i31 +^i } +p1 i4< x45 +$1 $9 $4 $4 +c $1 $1 $* $* +$_ $6 ++4 i4b +c i09 i15 +c } +c $5 $5 $! +^c ^r ^a ^m ++0 -6 -3 +^G *31 +i5e i60 +x0Bo9LsEY +x52Y5x8A +Z4sBW +c $1 $1 $@ $@ +$5$8$9 +s14x52 +i0j i1u i2n +k ,2 +o9u -8 ++1 +2 -5 ++0 +2 -6 +i50 i60 i77 +y5 t ++2 -3 -6 +$S Z1 ++0 $! +iB[x47 +$6 $6 $6 $6 +i3l c +^7 z2 +c $1 $0 $0 $! ++3 -5 -4 +$5$4$5 +$6 $! +x27E +$1 $9 $5 $7 +iAUty2 +i0s i1e +i0s i1o +*20 o5s +c $1 T7 +i7* +3 x62 +sF|s/Mx95 +K x21 ++3 -4 -5 ++A $9 +c ^X $X ^X $X +$3$3$7 +*4Ai7? +i41 i59 i65 +i5m i6a i7r ++1 x24 +^n ^o ^o ^m +$m *26 *76 +i5I +DA c +-5 D2 ++0 +9 -3 +r $4 $9 ++0 +4 +4 +{ ^F ++6Z2 +$3$1$0 +.9*BA +so0 T4 +i75 R6 L6 +$2$2$2 ++9 +9 -B +$+o8Ys^x +*52 *45 +i02 i10 i21 i34 +o5l*6Asi( +*14 *34 +$p x75 ++0 -3 +9 ++0 +0 -6 +Z2 xB5 +x12 T6 +$K x49 ++1 +0 +z2x2B +p1 iAh x56 ++0 -1 +4 +c $- $0 ++2x52 +k o3_ +o8S c ++D +E +E +p2 x54 +{ *06 { +x06 z4 +^S x82 +C $6 $6 $6 +i51 i5c +i72 i80 i91 iA6 +o1L k t +i82 i90 iA1 iB7 +*79 x82 +x42 +2 +*63*49 +i3d i72 +x94L5 +y4sg{ +^m ^b +-4 $A +2 +x36*A4*4B +o0j u } +sP^R8D2 +sF3o34oBn +i82 i90 iA2 iB9 +Z4 x96 l +z1 *13 +sJS p5 i9r +$2 ^2 +u $1 $9 $9 $6 +i0Fs7Zx5B +$@$* +o4Z +o5p o7n +s7OEx71 +-6 $7 +,9 } +c $5 $7 $6 +c $4 $3 $6 +$c +B +c $X ^X ^X $X +c $9 $4 $1 +$7 x62 +o6r [ +x04 ^P +T0 i3y +l $e $n $t +x52 i2u +K $e +i6q +sBmd +'7l +i51i69i79i84 ++1 *54 +D1 $p +ssg +s(Us2Ds]I +,BY1+0 +*2BR4 +,5 *43 +]k +-0+B +i3a i72 +i8_ K +xB4TB +cT8x04 +$6 $a +i5f i7a +K +0 +c ^d ^1 +*83 x54 +*A8x71x42 ++2 L6 +*6B u +x51 E +i3$ +*81 -0 ++5 r +*70iA9+9 +i77 i5e +D8 *48 +c ^a ^2 +$b $8 +Y4 [ +D5d +c 'C $0 +sRT +i30 i1a +i3b i31 +K ,3 +i1c i3a +*04*B6x34 +sqey1C +i75 i54 +oAQ +*31E*B3 +i32 i74 +x04 Z1 +d $3 +K[+A +]i0a +snRxB2 +x71 *56 +d '6 $3 +x53,7 +i71 i5b +i1a i5b +o0t *31 +i11*41 +o3= +'5 ^! +t'B +^R $5 +$ziB^o7z +i51 i3d +C,4c +x24-0L9 +s1k +sd, ++7 [ +*7Ak +.7$R +$O-A +L9s@- +*08x01 ++5Z2 +*52$vo0d +i62i70i80i99 +lxB7x54 +sISZ5 +d 'B $7 +i1a R2 L2 +$csu8 +i77 R6 L6 +x71y3x91 +o7J +E$# +oA;.1 +Y5x34 +o5dx71 +LB$z +x78dx46 +-7qx48 +i3kx26 +x04o3l^M +x32x83.5 +i70 R8 L8 +x0B*3Bp2 +i52 R6 L6 +]y4 +'Bts\| +i38 i3e +*9A x72 +*95d*60 +^x *31 +seO +$2$5$7 +s0HrY3 +'6s9[ +x31 y2 x61 +*73o59s'T +ly4 +$5$8$4 +s_\sbK-0 +k $! +[^@ +$5$9$6 +$6$7$5 +$6$7$4 +$6$6$3 +$4$3$7 +$6$0$8 +-9sQ= +$1$7$3 +$8$3$2 +$6$8$4 +o8P-2 +dsOQ +^Vx42 +c d '9 +o69oBMK +*14iA9 +Ck +$6$4$5 +$6$4$7 +$3$3$8 +$8$5$6 ++5 $y +$8$5$0 +*12x1AK +^Eo6biA) +$4$9$6 +$8$4$6 +$8$4$9 +$9$1$5 +$4$8$3 +l*B6 +$4$4$0 +^rs6;*48 +$7$1$4 +$7$1$5 +$5$2$9 +$6$3$8 +$5$4$7 +$8$2$7 +$4$0$3 +l $2$0$0$8 +rx8A*15 +*0BsRJ +.7x74 +$! Z2 +$*$+ +c $e +x31x19 +^b *02 +c $x +x19*57 +$=,8 ++9.9 +o53 ,6 +sES +$5$3$9 +$3$9$7 +$8$8$9 +$2$6$2 +$2$6$0 +$3$8$3 +$8$4$1 +$3$4$7 +$0$1$0 +$9$7$5 +$5$1$0 +$2$3$6 +$4$6$7 +$6$5$4 +$1$3$9 +$6$0$9 +$6$4$4 +iAb +o1} +$6$1$8 +c $0 $@ +i5E +$5 $! +*97i2p +i32 i41 +*8B x64 +^M *46 +i0s i1a i2n +] $j +sg]^RK +i61 i72 +$j $o $h $n +l o0z +'7 ^n +i46 i59 +*47 *75 +$8 $@ +x82 -9 +i1a i2x +i0s i1a +o69 *71 +s4a +p1 x65 +^8 o63 +i4r i5e +i3i i4s +$i $s $t +p1 x92 x97 +o4y o2k +i18 i12 +*59 x42 +x24 $6 +c $4 $2 $9 +c $5 $4 $7 +i1c i1c +i14 i35 +c $5 $2 $3 +c $5 $2 $6 +o75 -9 +i1a i32 +c $9 $8 $2 +c $1 $9 $4 +svd +i41 i55 +-0^q +$0 $! +c $8 $0 $4 +*73{x3B +sM<]y3 +Y4smP +$s $o $n $i +c $6 $9 $1 +x73 $z +c $4 $6 $3 +c $0 $4 $5 +i51 i31 +i41 $2 +$C i9o +c $6 $0 $8 +c $5 $3 $9 +i7S K +c $9 $2 $8 +*40Y4^3 +i14 i13 +sid +l ^c +[ i0G +9 +p4 K T2 +i5ri49 +r *53 +*05 x21 +sbH +x52 +4 +sD|*21 +p4 T2 K +$- $_ +i7P +o9\$/ +o9+Y4 +$`l-B +*96i6/ +i4r i5y +$A +7 ++A o6_ +*57 $A i0a +^m ^k +sPk +D7Y1 +*14 x35 +x91 K +i7l D2 +^m o3n +c sl1 so0 +i5d i53 +i31 i70 +x52 k +o6T c +x27 .3 +*5Bx13o2S +*31 o3j +swu +^b x48 +D3 o5t +Z4 x46 +i0, ^- -0 +x21 t +x21 E +x53 *64 +^m f +^t *34 +*57 i0a $A +iA2 +A +i6p -7 +$ x56 +t o5u +i78 i5e +i3d *63 +sDCx81^Y +s9coBE +i3a i73 +$5$1$9 +-0 x13 +i51 i69 i77 i83 +*42 } +*47 x71 Z1 +srt +s8Fx92 +tC*42 +-6 i5r +x51 i2o +K *25 +p1y1x39 +o9_ *98 +i7i +3 +xA1 T9 +-5s\s*07 +o3L c +x3B -3 +$4$3$3 +[ Z3 +o74 o85 +i82 i90 iA2 iB4 +i0g{ +$NE +x7A^R +d 'B $3 +^r +5 +*68s)rx21 +sld +lx97x13 +i19 i16 +$- $7 +tZ4t +i6? +$9$4$2 +x51 ^S +$1$3$5 +sFM +^q^d +$7$1$9 +'9 { ++8 -2 -2 +$d*92x0B ++A -C -C +syI +p1 x36 c +$5$2$6 +i72i80i91iA2 +^n ^o +i55 i5e +Y5,8T2 +,7x12 +s1Fx03 +T4}xA2 +$6$3$1 +T2 $1 +i0h i1o +so0 T5 +{ Z1 +$4$6$1 +*52 *24 +x42s\co5! +c $ $4 +^o ^e ^n +R6,9xB9 +K +6 o7y +$5$1$2 +x62 *65 +$9$7$9 +i6m i7e +x85x29*05 +^u D5 +i02 i10 i21 i33 +$9$7$0 +^A *26 +s'v +o2e *34 +-8 +6 +$e $n $t +x23 i2e +i0A x13 +o6" +Z3x51 +$9$5$0 +D3 x72 +o4K c +i5g o4a +[ s07 +$m +6 +} i0A +c $4 $7 $2 +$7$8$5 +i24LA +-1 T2 +*13s7y] +T3 $1 +sSO +sK!T0 +o1d o2e +i81 i92 iA3 iB4 +x42 Y3 +*7B +$9$1$0 +c ^2 $3 +i01 i19 i28 i30 +uo6} +o1i ^v +i7t i8o +c x32 +$4$0$4 +i0F *02 +'B'8 +i18 i11 +x05 ^r +o3# +o71 Z1 +*13 sau +$0*30svi +s&l^#l +snf +sgb +-7 D4 +s6b +} +1 +$5$0$7 +$z { +o4s -0 +i71 i82 i93 iA4 iB5 +^x -1 +c $2 $9 $4 +c o87 +'9 D4 +*50 *02 +$m x83 +$2$9$8 +c $3 ^2 +D7 +6 [ +$0 +0 +$1$5$8 +K o34 +z4 y4 x69 +i7r i8e +c $8 $6 $0 +i34 i3d +*42 o3b +i50 i5a +i5c i7c +{ x32 +i15 i19 +x41 $@ +x06Z5 +o0J z2 D2 +i3c i1a +y1*90 ++2 x42 +c $9 $8 $3 +.0y2x57 +sINxA9o6T +'A o7b +c $4 $0 $3 +o76 Z1 +D7,3 +o86 Z2 +o67 l +u s5R +D6 +4 +Y3 x52 +c $5 $3 $2 +$4 $. +i3e i5f +i8pD5p1 +-1 -2 -8 +y2 x61 +c $9 $5 $6 +o6wx71 +o5~ +sS9o1O +i6X t +x02 z2 +L6x27x79 +'A$esT, +*53+5 +$9$4$0 +sw1sdS +i21i39i49i53 +c $3 $8 $4 +sP| x43 R8 +o5F +sng +*37 +0 ++4 +7 -5 +sc^R2 +skv +*30sbRo0I +*58xB3 +$6$6$0 +l ^d ^o ^o ^w +i01 i12 +-6uD9 +'7 $n +D7 i4y +*25 l x32 +$9$0$4 +y3 $4 [ ++3 snz +c$1$2$3$= +i78 i57 ++2 } +$2$0$3 +y4 x67 +L7s?{ +i79 i7d +y2 x34 +k d +i51 i69 i77 i89 +xA6*A4z3 +x3Ap2 +skl +x47o7^ +x41 ^v +-0 -9 -3 +sOW-3 +-5 $1 +.Bz3x5A +sdi +s_N*71 +s&'s5L-0 ++4 +4 -8 +x25.Ax19 +r +0 +sh\ +-5 $3 +u x91 +$8$8$4 +i3f i7e +x21 ^L +^E ^D +i31i49i58i60 +D6 i42 ++8xA2i8r +$9$8$5 +$fsc) +*85sL8 +$5 +5 +$9$8$2 ++4 -8 +4 +$4 Z3 +$4 { +t o63 +c i09 i10 +*96*85xB7 +,A xB8 +s25 Z1 +$7$2$6 +T4 $3 +c i03 i12 +p1 x57 +x25x19 +D2 y3 +^B Z1 +$y +7 +.5 o1m +$9$1$9 +x18-0 +sJE]y3 +D3 ^8 +^e ^c ^i +$@ x02 ++A -B -9 +*B2o1A +i21 i39 i49 i57 ++3 +5 -6 +c $1 $5 $! +]^Yx23 +TBsWX +-3 o97 +i90 c +c $5 $8 $6 +scp +$8 -5 +i19 i11 +o5g +7 +t o54 +sTR +c i4a +^ } +i6s c +^S z1 +x14 o0G +i42 i55 +o70 $9 +x52 *25 +o9B +i2" +D0 $q +$gsb, +*34 ^p +Z1 x42 +i71 +8 +i1qx7B +^f ^V +i8A*32*14 +c ^b ^1 ++6 o2s +z1x49 +i51 i62 i73 i84 +z1 ^w +,0oA#^^ +c $0 $7 $9 +o4&xA7 +c $5 $6 $8 +$1 o4f +'9 *76 +$7$9$3 +$c o8i +x74*51 +x87 *87 +$1$4$3 +*64 o66 +$a i0f E +^i ^r ^t +$7 $* +i52 i3a +i32 i40 i50 i68 +i0l i1o +,4]i92 +i36 i79 +$d +6 +^X*89 +*13 [ +K -1 +c $0 $5 $8 +*53 [ +$6$6$7 +srF*21i0G +c $7 $. +C+8s\Z +$7$9$0 +s?&x03 +T5RBy1 +oAu*32 +i7b i72 +sMP +*63 *A4 +s6c^Q +xA8x35xB8 +c $6 $1 $4 +i57 i67 +o67$Z +i5m i6a i7n +*42 *21 +s%VscrslY +sCG +x91 x06 +i0g z1 +*21 *34 +o69 Z1 +x32 c +c $X ^X +$5$7$8 +c $2 $7 $1 ++5^" +sKZ +o3z c +c $2 $7 $6 +c $7 $5 $2 +c $2 $7 $4 +{x72 +{ $1 +o8B +i42i50i60i79 +sLD +$4$3$6 +$6$0$6 +x03 *34 +s1I +Y5swu +^S x14 +i3a i4s i5d +i2f +4 o2i +i17 i18 +,7 t +i61 i71 +i02 i10 i21 i35 +i58 x71 +swMx64 +x3B^WsD$ +x32 +7 +c $8 $0 $2 +D4 *14 +o54+7 +i1a i11 +Y5x16 +i14 i31 +spx +^r,3 +i51 R6 L6 +i6A Z1 +sWw +z2 E +s5?*7B +$g +6 +x32 y1 *86 +si8 +k *04 +i3b i3f +$2 $4 $! +x17*39x57 +i85+7xA8 +$2$4$3 ++1 +1 +4 ++4 +6 +4 +*41sL+i7x +$6$3$3 +$1$1$1 +c ^1 ^a +]i7- +$1 $6 $1 $0 +i0b i1o i2b +$2$0$2$3 +$4$9$2 +$d o6x +i8K +C *49 x67 +i8tt +$9$3$0 +$7$6$3 +c $- $7 +*32 ^A +i8v ] +'8 i0n +f x65 +x36 y2 +$5$7$0 +$4$3$9 +x09T4 +$1$7$8 +x52 $6 +$1 -6 +s,Jo9}swq +i41i59i69i73 +$CsD7 +x76+0 +$8$3$5 +x72 $. +i7Q +*52 o3k +$8$3$6 +o1o o2n +$0 -5 +y3 [ $4 +o5v]x82 +i19 i31 +c $@ $0 +$2$5$3 ++A -9 -B ++D -A +i6@ x02 +$@$_ +$s x34 +i7I +$7$3$2 +c $7 $6 $9 +sae $1 +-B -C -B +x21 i42 +D7 x05 +-6 i7d +synY4 +o6s x01 +sge o4n +u L6 ++5 x04 +-0 x21 +o2; +i2-u +i51 i69 i77 i86 ++3 -6 +5 ++4-1 +c $8 $5 $6 +c $8 $4 $3 +i19 i7a +*49 x53 +-6 *12 +*43 ^m E +i2xxA7 +i51 i61 +r $7 $0 +i6,x73 ++2 o4s +o1< +^z } ++C +D +C +c $3 $9 $1 +D5 o1a +'Bs&j +i0m i1a i2t +$n o7l +s`n'5Z5 +i31i49i59i63 +o6z [ +R0 t +s.ID2 ++5 o79 +d x8B +[ o4j ++2 +2 -5 +*65 o67 ++7 +B ++0 +0 -8 ++3-1 +^s x26 +c i33 +] *36 x43 +i14 i10 +srW +*02 ^i +i70 i1e +^B x32 +$3$9$5 +i8i i9n +Z4 x01 +i3c i31 +$4$2$4 +i81i99iA9iB9 +sSM ++0 -8 +0 +D6 $B +x93D0 +$8$2$5 +$2$6$3 +c i30 +o4)sbn +i1x o0a +] iAh +o3n *35 +$4$2$9 +swf +Z5s6Jx34 +$s +3 +o8ts(h +i4hx2B +$3$8$9 +-0 o52 +su7 +] ] $e +x34x09*02 +Z2s!7 +*01 x61 +,8xB5p5 +$J o8; +c $6 $8 $1 +*46$7 ++B [ ++1 +4 +1 +sev{ ++5 -6 +7 +*76 +5 ++8 o5s +R8 D1 +i22 i30 i41 i50 +-0 ^2 +to9l+B +$*$$ +$7$8$0 +x4A^r +*23 o1d +-B -B -C +i11 i31 i51 i71 +$ss+) +-6 *63 +c $8 $3 $0 +$b $9 +$Ht +-1 +6 +^Ql-3 +c $3 $# +T3*93f +*46 x05 +i5d i3d +s74 +8 +$o $h $s +*A2sr,z4x24 +$4$7$9 +*85 +5 +$b x53 +i79 R8 L8 +i74 R8 L8 +$3 $x ++2 -5 +2 +*3A x16 +i42 i54 +s*hxA1z3 +iB* +y1 x03 +$ { +sbR +oAv +i15 i35 +c i04 i12 +Y2 x84 +*16 x62 ++4 +4 +6 ++5 +6 -4 +c $. $4 ++8 spi ++5 -4 +6 +*39 *35 +,8*82 +c o69 +*54r*B0 +l i8a +i1P +sj0+0s\s +^ ^2 +o4o *03 +i7a x21 +x86E +$5$7$4 +*05 x35 ++C +C +D +i66 x31 +$/$. +]]]]]]]c ++3 $m +x34 y3 +^A ^L ++2 i0p +'4o5?y4 +'7 ^D +i01 i19 i26 i32 +$y i6m +i6a i7n +s#O*78 +i42i50i60i78 +i77 R8 L8 +i72 i3d +^& x03 +x81i81 ++6 *60 +x58$uD8 +t *73 +*41 x34 +xA5iASsT& +$y Z1 +oB{o6X +i51 i69 i76 i88 +c $3 $6 $4 +$1 $0 $2 $6 +*32 *67 +-2 -5 -8 +} ^w +i96 +i0b } +i0e i1r +i3a i7c +'Ap1siT +o4- *54 +$9$1$4 +D4 o5k +DB*84 +^l ^i +o5g p2 +x76 { +o6z x23 ++6 +7 +9 +8 +^9D0$6 +scA +$4$0$6 +$! x21 +$7$4$8 +x83s?` +T0 T3 T9 +} x14 +Y3 c x12 +-2to9< +i5c i3b +i1r -5 +p3 *65 +$1 o3u +i38 L3 +ssS ++B -C +B +i39 i49 +Y4x37$a +c i1o +c i1a +$i -7 +x62 x72 +z4 p3 +*16 *05 +s@Is3x +p1 x35 +*78 +6 +s7(sce +] t x02 +o7zlszM +$0 $2 $0 $4 +D2 *46 +$2$7$0 +o2M c +sjOsYis?f +$7$0$9 +i34 i1e +i8d i9e +K o1k +$3$3$6 +r o4- +$3$3$5 +o8si66 +$7$0$6 +*78 -6 ++1 +1 -4 ++6 +9 +7 +8 +C+As>s +i72 i32 +$1 $9 $9 $0 $! +D9 -7 +D6x31 +R6 L6 o55 +*B5 x27 +D5 { +i9L +i0~ +x62 ^a +*36 [ *05 +x81 $1 +x83o3r +x72 i6A ++1 +8 -9 +i56 i61 i72 +i52 i1a +$f $0 +*2A[ +$s Y1 +$5$3$5 +i52 i1e +i71 R6 L6 +-1 -3 -8 +.7C +i17 i11 +sHRE*05 +Y5y5T2 +c $9 $1 $7 +$2$4$9 +c $7 $& ++3 r +*6B]k +$1$0$1 +xB5L8 +$2$0$9 +*7B x64 +x21x25 +p1 x06 ++1 -9 +8 +$3$1$4 +o2u i3y +] x02 t +^( '4 +y5 u ++6 +7 +8 +9 +^--B +x15 Y1 +x41 i0j +i5x D3 +i34 i72 +i2h l +$6$2$5 +o4do37 +$l $a $n $d ++2 +2 +9 +r $5 $1 +$4$9$8 +*45x04 ++6 +8 +9 +7 +i52 i5d +x52 Z3 +x79x36y5 +$8$0$7 +$7$6$7 +i21i39i49i52 +o7` +l $X ^X ^x $x +$6$5$5 +o0B*0B +i74 i57 +iB".2 +c ^! ^1 +'C $7 +$4$5$8 +*46 o54 ++D -C -C +^-sj%sr\ ++0 T2 +l ^X $X ^x $x +$2$1$8 +z1 -3 +$fsO]-B +-B -9 +o9Wi1poAb +x82o0M +i5Z +$2$0$2$2 +i41 i59 i69 i78 +.7*85*4B +*68*06 ++2 +9 +2 +x89*81 +i52 i60 i70 i89 +*02 $o +DB*04 +i61 i74 i87 +*86 +7 +R5 +4 l +i41 i59 i69 i77 +-4 D7 +^d -3 +$8$8$7 +x27z5 +svYo7c +i76 i7a +^K x42 +r $3 $9 +*B8 +D8 suy +c $` $1 +^G D3 $2 +,2 Y1 +$9$5$3 +l $X $x ^X ^x +^G $2 D3 +-4 +6 +sYS +o4V K ++B +B -C +*64D7iA8 +x03 $1 +sLB +} -3 +^p } +c $6 $8 $2 +i0w i1i i2n +*25c +sP[Z4 +$0$0$9 +stP +i50 i65 +$5$9$3 +c $4 $4 $$ $$ +^5sK? +$3 $3 $3 $! ++6 -0 -3 +l ^X ^x $X $x +$1$7$0 +R5 l +4 ++4 -7 +6 +^v i0d +x63 Z1 +^b*07d +[ x61 ++4 i1l D3 +scR +$7$7$3 +s|kx38x78 +o6wo0[ +$o x42 +x07k +Z4 D3 +D5 x04 +T4Y3x12 +i7a i3e +x64 ^d +i1cs;5 +^1 ^B +l $X ^X $x ^x +z1 *50 +$_} +Z1 T4 +$4$3$1 +l ^X $X $x ^x +dx5B +o5xD2 +s3#^p +c ssO +u $1 $9 $9 $4 ++0 $* ++6 +9 +8 +7 +$p $o $x +$1 -2 +sjbEo5A +i21 i35 +o5r -7 +*54 +7 +c$$ +c $7 $6 $1 +T1skr +o0V +2 +$1$8$8 +R0 x21 x18 +.As#j +i42 i50 i60 i73 +x81 x42 +Ky2*17 +o2i ] +D3 ] +-1k +o2s c +i5i i6t +-0 ^u +D3 o1g +i5T +$#$* +x07z4say +c $4 $1 $9 +p4 x23 .B +o7&oAxx5B +xB1 $1 +'6 i3- +*34 -6 +sJt^h +c $7 $8 $2 +$6$7$6 +Y3 x12 c ++6 *54 +.3 p5 +$3$9$3 +i2/ i5/ +x81 } +sDW +i72i80i91iA9 +T5 D4 +$5$2$5 +$k *51 +o7GsLm +sqD +i3wxB7 +i6j i7a i8n +c ^C +c $8 $1 $9 +x17 x51 +o8SoAw +y3s1bx75 +-3 *03 +1 +c *65 o65 +x12 z1 +i9a iAn iBd +$Rx7A +c i04 i15 +$2 $D +}+9x61 +y4 xA2 +*35 ^B +.7*51 +Y1*A2x62 +$1 $9 $5 $0 +*05lx36 +c $1 $0 $! $! +usu0x26 +c $8 $. +^4 $4 +$1 *02 +sN4x93xB6 +$%$$ +i42i50i60i71 +i3e i2s +y2 c ^1 +-7 o5g +o8j D7 +$%$^ +d] +^bx8A +K *54 +i9Io7b +i8-sP8 +$6$3$2 +c $6 $8 $3 +^h,1 +,7-1 +$2 $3 $! $! +-3 *16 +^l ^r +$1 o04 +y4 x43 +c $b $a $b $y +i82i90iA0iB0 +x68]su? +c ^6 ^0 ^0 ^2 +R6 o55 L6 +K -0 +i76 i7e +x71Y4 +^} +-4 i5d +$2$9$3 +-7^k +D3 i24 +*89 -7 +x89*69 +T0 s3! +c $9 $9 $@ $@ +L7iB2 ++B}l +o77*16 +x59p3 +oB8^miAZ +^po1a +c ^4 ^8 ^9 ^1 +^M x06 +i1u i2z +c $0 $7 $1 +o0g *34 +sBG +$8 $8 $* $* +$i $a $n +D6 l x91 +$2$3$3 +l $e $r +'C $9 +l $1 $0 $1 $0 +x26*A5 +i62 i70 i80 i99 +x08sSd +^z o1Z +*41 ] ++8oBL[ +$! x84 +^R .5 +i31 i74 +D6 x91 l ++6 -3 -0 +c $5 $3 $6 +s2+ ++1 +B +*20 s29 +*15x12 ++5 o72 +c $2 $7 $3 +o8eRA +sgdxB5 +$2$7$8 +c $0 $3 $1 +c $1 $7 $9 $3 +$p $k +sgL +,Ax04sJl +i13 i35 +x16p2l +$2$5$4 +T4 '8 +i32i40i50i65 +x5Asi3 +^2 i0S +$N u +c $9 $2 $4 +sRJ +-A Z1 +$9$5$9 +c $2 $* +'8 T6 +c $1 $4 $2 $8 +i72 i5d +xB2Y4 +$1 $1 $* $* +i7r p5 +D7 $5 ++6 +8 +7 +9 +o0S i3x +[ [ x43 +o0n *61 ++1 -4 +1 +x46oA^ +-3 +1 *03 +{ ^9 +s($slHx18 ++0 -5 +2 +$b $t +T6 o70 +*29sg5 ++0 +6 +6 +sueD4 +$8$3$1 +u $0 $0 $7 +$2$9$6 +K ^S +i73 i3e +x03 ^5 ++4 +6 -7 +c o90 +snj +$m $y $s +o6t x32 +*7B^Z +^J D3 +i38 i3a +x62 $n +o4_ '9 +oAj +$7$3$8 ++5 +8 +8 +$9$5$4 +['9 +c $9 $5 $4 +$9$5$2 +u $2 $0 $0 $9 +o77 l +x53 o2e +o4k +6 +x07 ssu +d xB8 +oAZ +$1 $9 $9 $0 $* +$^$( +$9$3$5 +o64s"Ur +x7A$px76 +$5 x32 +c $3 $9 $4 +$9$3$8 +*9B^I +'8 k +T0 T9 T3 +$5$3$6 ++4 x81 +i1e i31 ++0 +2 -5 +D6 $9 +-2 -8 -5 +s3S +i02 i10 i22 i35 ++6i6sR0 +] o5x +[ o04 +x5A [ +i40 i59 +o7" +$2$1$7 +tx13 +s;#p1 +-1 -8 -3 +K ^g +l *98 +us+M +^t+9TA +i3d o1r +*71 ,7 +xA8r +$2$9$1 +R6x18 +i18Y5 +$9$3$2 +u $y ++1 +2 +7 ++4 +5 -6 +iA6 iB6 iC6 +Z1 r +*93i6s +.4 o5i p3 +$j x62 ++4 +4 +5 +sEG$? +i18 i17 +iB* xB5 Y1 +$A $5 +T0 i2d ++2 sui +$=o67 +x98 p4 +$9 i60 ++1 o8A +x61 i3l +.6 *13 +-5 *25 +$w $b +.6o0Z +i2k i0t +o87 +6 +x46 ^S +Y3 i4m +c o95 +D8 $b +i40 i57 +*12 x51 +-8 *53 +$m x43 +T3 T9 +i0p i1h +o1a i4- +ts3B +t o2X +$n $k +oBZ +'8 T7 +x59x98.0 +-4 o05 +so0 si! +i7o i8n +y1-2 +i0e i1s +o4b *42 +szl*B8 +sis +i10 i31 +*17+1x61 +i3a i4l i5i +Y4 x36 o3v +T8 TA T9 +D9 +6 x81 +si1 T7 +i41i59i69i79 +L9 x72 +sk/y5x04 +o44 *56 +x82 x92 +$8$1$7 +$5$5$0 +x34 ^p +$9$0$0 +}E +o8e '9 +i0a i1g +i0l i1u +x07sR0 +q x08 +i1. i3. +i3e i7d +c i81 +^h *32 +$8 $c +$8 $d +sblx39D1 +C T1 +x02 ^2 +$8$9$7 +c i47 +$3$1$3 +x81}z2 +p1 x87 +{ $i +{ $2 ++3 o6e +^9 z2 +i0Ho8O +*57 o56 +i63 i70 i80 +*54 D7 +c $@ $8 +[ i2q +$2$2$4 +*36 o3g +E K +c $4 $. +$9$8$8 +iA; +c $2 d ] +$1 $# +o8L +i5c *24 +i38 i45 +$1$4$7 +i6i i7t +i51i69i79i85 +d xA7 +i1b i3e +*15 x34 ++1 *04 +^R D4 +c $- $9 +d i7a +o4c c +^z -1 +x51 ^2 +D0 l +T8*9B +^c } +i62 i71 +c T3 T2 +o2y o3k +[ ^g '7 +d 'B $8 +*02 ^f +$6$9$2 +i51 i3b +c $5 $@ +sjPs0H +rk*B3 +$1$3$8 +o5w +7 +i3e i4l +$3$2$0 +^n ^u +i0h i1e +$@ Z2 +$k *57 +$4$6$5 +s.@ +[ x73 +l sys +$y D1 +T2 -0 +C '7 $3 +$3$4$0 +$4$2$6 +o1/ +i9j +i3c i3c +^a *15 +s38 +8 +*35 *41 +i3d i7e +$8$7$4 +$!*05 +$/i8` +$s -1 +$6$1$2 +ssV +]*79x52 +'A t +T8 T9 +i79 i1a +i7a i70 +$5$6$6 +*46 [ +x51 ] +[ '8 ^g +t -A +-6 o5t +-7 u +x81 -9 +i3b i3b +c $8 $4 $5 +i6z D4 +i37 i79 +$'$' +T1 ,7 +ls8OC +z5 x18 +o0z } +ss1 +*0Bi2v +T6o70 +^. ^t +o0g +6 +[ ^x +'8 -5 +c $8 $1 $6 +'8 -6 +D5 *46 ++5$% ++5 k o0j +o1( +x12 $r +i3.*32i80 +cD5sK\ +i52 i31 +$s i0h +-3 o4s +o9D^M*A4 +kcs*K +.3*7B] +i82i90iA1iB2 +i2n i3i i4s +$*$& +i3fs!6 +$0 o87 +i4d *04 +[ o7i +i33 i3a +s5k +*12 [ ^R +o75o4m +*A7^M +s9M +D7 ^Y +i71 i58 +i32i40i50i66 +*47 ^1 +*2AsC#-5 +c $8 $9 $5 +t+5 +$w+7y2 +i7P c +-9 Z1 +i16 i56 +sv9$p +Z1*4B.2 +^k D6 +*75i6-iB# +rx47 +xA3o7J +i31 i42 i53 i64 +i11 i72 +*46 { +,8x0B +c $0 $9 $! +o6c 'A +c $8 $2 $9 +*B6 +o6t D4 +c ^J +i5b i3a +*15 Z4 +ssL*89 +y3*74 +x34.5 +i51 T6 +$1 d ] +x08i3" +-9 $5 +i0g i1o i2d +z4 x46 +x72$$'5 +D0 D4 +c $7 $9 $6 +u xA3 +Y2^P +s26 $1 +l i4n +co81x08 +o6| +xA4sWdx1B +k ^u +u sS$ +sns +s9H-5 +k ^G +$6 $6 $0 $0 +c $5 $3 $8 ++3 $c } +sNG +*56sP% +x73 i67 +iB$ +i1d i3e +*B4*25 +i3e i70 +o6- x05 +i0K +1 +-5 o6g +i3j k +^C'9x8A +c $4 $9 $3 +T0 '6 +i3e i77 +c $3 $7 $6 +i34 i77 +T6 o53 +$5 $@ +LA^w +i7e i5b +sGK +i6e i74 +-4 o65 +x82 *98 +R5 s4a +c $7 $0 $6 +R1Y2,B +z1 x31 +[ '8 +i16 i36 +x53 ^F +sp$i9/ +$6$2$6 +x23 y4 +TBo35 +Z4 x32 +c i7@ +i0-s?T +i3R t +o3t D6 +'4i0D +o6*T6x67 +x4AY4} +i41 i59 i68 i73 +$m xA4 +^l o3o +Y1i5] +^3 $3 +*93 -1 +l *75 +o4q [ +x95Er +i62i70i80i98 +{ ^7 +i01 i19 i27 i38 +i01 i19 i27 i39 +i01 i19 i27 i36 +*73*90i13 +o3L [ +i6d x81 +x02 $* +i5d i3b +o85 x62 +$0 x82 +*53 *57 +-2 o3j +DB $e +$tD8 +$1 o1M +i0c *23 +t o2z +xA2 p2 +x27oA. +$6$9$4 +p1 x82 +o6m c +i73 i58 +i0T r +$7$1$7 +i82 i90 iA0 iB1 +x6Bp3 +iBlu +i15 i32 +o1Z +L5sEg +*39DAswj +*41K +$- $- +i62 i70 i82 i91 +$r +0 +$4$4$1 +y3rt +i51 i69 i77 i84 +D1 +5 +$k x53 +$3$7$1 +y5x52 +snOZ3 +^g x52 +i2C *20 +k^s +i02 i10 i20 i34 +y4 x65 +i82 i90 iA1 iB6 +*A0p2r +sp-x56 +$8$8$5 +$8$4$7 +D0-2s;j +r $x +t}l ++2 +4 +2 +$4$5$9 +i72 R8 L8 +*7Bo74D3 +x83s6L*50 +i77 R5 L5 +*51E +$7$6$1 ++9 +9 -0 +$4$9$5 +^yc ++2 +2 +4 ++4 +5 +4 +-0ksFK +x83 l +$f $e $z +x53]K ++7 -4 +7 +^Rx35 +$Xss, ++1 -4 -2 +$2$4$8 +$1 o8_ +Z1s>v*98 +$2 o62 +Kx57 +i1a i2s i3e +$ap5sT9 +r*57 ++A +D +D9 x81 +6 +*89 [ +$`xA8x87 +$n*85 +.Bs]!snu +x15x8B*38 +*57.5 +i11 i52 +$6$4$1 +T9-9 +i72 i7c +*30*B7 +c T2 T3 ++5 -0 -2 +i71 R8 L8 +D1 ^4 +$3$2$7 +K *56 +o6k $s +sos ++A -1 +}z2 +lu ++0 +1 +8 +$4$7$8 +x36s<& +*2AZ5*B0 +*51 K ++0 +8 +1 +$4$7$1 +$3$4$3 +o0f K +-0 -2 -6 ++9 -0 +9 +ftx5B +o8g D5 +o1o +7 +i0t x04 o2h +o5Z c +o7< +ssl } +$9$2$4 +p2 svs ++5 -2 -0 +-1 +8 +*24 o2x +x71u +i7$ ++2 *95 +si+Z5u +oBG +$5$3$3 +*A1i7R ++2 -0 +5 +'B,7 +{ iB# +-0 -6 -2 +-0 -8 -7 +o19 *51 ++9 o76 +$. $h +$. $d ++9 -3 -0 +$2D3 ++9 -0 -3 +o0m o5w +*58 x87 +-7 o10 ++9 -0 -8 ++9*36 ++5 -3 -4 +$8$3$0 +*23 t +s"4o56 +$8$3$9 +*60 x51 +*75 *67 +$L $2 D6 +i4a *50 +s;AT1 +-0 -7 -8 +sth ++3 *75 ++4 -6 +5 +o9J*06xB9 +$7$2$8 +*09lo7! +x6B-8$# +c o59 +c o5a +c^' +o4m x02 +D2D9s=} +$3$5$8 +$L D6 $2 +$! $@ $# $$ +i42 i51 +x23 D3 +T6o8]*01 +x51 -6 +o74$. +s*-p1 ++2 +B +x79 x84 +*78 x8B +o3n x41 +$2$7$6 +x92 -8 ++5 -4 -3 +i59 '8 ++7 +7 -4 +x09x9B ++1 -2 -4 +T8 T9 TA ++9 -8 -0 +sp*Y2 ++2 +5 -0 ++9i7K ++4 +B ++1 +7 +2 +$9 $* +.AsR+ +$2$2$9 +x58 D4 p5 +] D4 +$8$8$3 +T7 $7 +i0P .5 +o9-o2qTA +$a Z2 +*63 D7 +sPG +E *78 +-BiBGxA8 +i0s i1c +-5tl +$0 -2 +s;fy5 +i3e i4l i5a +oB)u +i7e x85 +*63 x53 +i7c i3c +x57c*18 +-3 x63 $9 +$x $y $z +i5B +k Y2 +c $9 $5 $! +t o3k x21 +x74o3- +x71s'% +x32 ^L +,4 o3F +l o7- +^y i1n +c $- $3 +s3L +x94xB5 +i12 i10 +x41 *40 +i8h D5 +$6$5$1 +$. +1 +^1 { +5 ++4 -3 +5 +iAg +*82 x72 +$2 $1 $0 $6 +c $- $8 +i16 i15 +o0. ^w +$3$3$4 +stn +i83 i92 iA1 +z1C +xA1 xA3 ] +-4 o5k +$4 $4 $4 $4 +$4$9$1 +x04 Z2 +$3$5$5 +,5 *03 ] +o64 l +$3$0$9 +iBl +D6 x92 +-3*14 +$3$0$0 +t y2 +u ^a ^1 +o3g -4 +$n $i $b +$3$0$4 +$3 $! +i89 i98 iA7 +$)$! +i48 i58 +i5B.1 +$8$9$2 +o5e E +o5y -3 +^s ^s ^a ^p +o8U +*61 x52 +i5d i6o i7g +x81 i79 +oBm +s%5o2Mt ++3 -0 +6 +*59 Z1 x53 +y2 [ +y4 $a ++9 suy D8 ++4 } +-3 -5 -6 +*51c +u *46 +D7 skt ++4 -0 +4 +xB6'8,9 +c i4o +} $3 +*14 *32 +-3 *32 +$2$4$6 +R0 T1 +*50 o3l +o9) +$5$9$5 +z1 x71 +^YsiI +l o6- +*36 '6 +i73 [ [ +u d 'B $7 +K *43 +x29 shp +c $7 $* +i7J +$6 $c ++3 $1 +sAzo9$ +sfKs8tD6 +i38 i48 +^k z1 +c i07 i18 +z2 x63 +$y $u $p +i2X [ +i12 L1 +p1 D3 '9 +-2 x31 +d f x9A +o5h *43 +i35 i3e ++2+A +u $2 $0 $1 $0 +i0s i1o i2l +t x58 +x74o2" +$2 $8 $0 $3 +s,!$fd +DB x05 +i2w *03 +i7d i3d +-4 '6 +x02 x63 +^t i5t +i7s-8 +T0 *78 +xA1 ] xA3 +c $7 $6 $3 +c $4 $8 $1 +x73 p2 +c $8 $4 $6 +i13 i73 +o3b *43 +$1 $2 $3 $+ +so0 T6 +z2c +o8-] +${{ +$l -5 +qz3x1A +c $$ $4 +[ i21 ++B x74 +z4 x36 +i14 i17 +x21 smb +r $c +c $9 $0 $6 +c $4 $9 $1 +srn *20 +-0*18] +$5$5$9 +$2$2$7 +$? ^1 +o79 l +-0 D5 +x41 *30 +1 +$0 $8 $0 $3 +o47 o52 +^T .5 +i25-4sg` +k o31 +KZ1*97 +szk +tRB,6 +y1 R1 +*74 x31 +s$\'A +i3c i32 +i71 i5f +i0G ] +i5e i7c +i5a '6 +o2V Z1 +^l *04 +^\x83s`> +$1 $0 $! $! +c $0 $4 $7 +x81 *21 +i4e i5n +x15 Z2 +c $3 $7 $1 +*54 o3l +i0J $d +l x24 +c $6 $1 $5 +*B7*58 +x21 *25 +s(=s0X+0 +c $2 $7 $8 $8 +[ +7 ++3 +6 -0 +*96*85srN +sko +i5D +c $0 $3 $9 +'A x52 +i9M +i72 i3c +x03C +x42[ +x84sh{ +x61 *64 +LBq +l T7 +x25{p3 +i3c i5c +z3 z4 +Y1 u +x07d+7 +o1F c +$1 $9 $5 $2 +i4W +$2$0$1$9 +[ T1 +o1w D5 +*63xA8s_l +c o83 +$1 $& +x71 $y +p1 xB6 +rx61 +^' ] +i2q x31 +s^pxA5 +*BAr +'7 Z2 +'9 +0 +,5 ] *03 +$1$0$8 +$6$2$4 +$1 $5 $! $! +$1$0$3 +k *17 +$6$2$7 +$. $7 +x52 x31 +$N*B2K +s4go2L ++3 x53 +c ^4 ^0 ^0 ^2 +o2C t +o0W { +i0s i1a i2l +c $z +xA1 { +$M [ +7 +o5Y +-1 ^i +$0 x12 +c $6 $8 $7 +^R *31 +l ] $K +o0f $1 +c $8 $5 $9 +Y1,3 +sAci1. +s1v +^M D6 +'7 Z1 +D2 z1 +$l *57 +$r $e $n $u +i31 i48 +i5d i1a +o9Ok +-8 *8A +x68d +D5 ^o +*39Z3x1A +*23D0 +*59 x53 Z1 +$f $e $y +*52s9vswm ++6 x74 +$1$7$6 +$9$3$6 +i11 i33 +i31 i7a +$4$0$8 +sdb +D5 D6 +sRlx2A +-7*46Y1 +^MsJ, +*37+Bx35 +*7A x53 +i41 i59 i68 i75 +[ o0W +-3 $9 x63 +.4s\FxA7 +i41 i59 i68 i70 ++9-8 +i31 i49 i59 i63 +i51 i69 i76 i89 +c i09 i16 +c $m +soy +$1 x43 +i7j l +$@ $# +[ sat +i01 i19 i26 i30 +o6j D8 +i02 i10 i23 i30 +-2 ^C +Y4su7 +sbks#&s3j ++5 -4 +7 +o9' +-7 K +i72 i80 i92 iA7 +i0t i1e +i61 i74 +'8 r ++5 -8 +5 +i72i80i90iA2 +'9 Z2 +i5P t +x5AlZ5 +-3 -6 -5 +x58ss_ +l ] $M +T5 $3 +i32 x43 +$2$8$4 +i7e i1e ++5 +5 -8 +-8 o6b +*84 x53 +c $9 $6 $4 +l ^d ^l ^o ^g +i6d -5 +c ^5 ^8 ^9 ^1 +$7$2$5 +$d ^d +$1 u +*05Z2o3e +i14 i15 +x71lsE} +l x31 +*31 ^m +o7r x41 +i0a i1b +$2$3$9 +z1 ^h +*23 x41 -0 +T0 ^e +i4l i5y +c $1 $2 $3 $_ +*04 l +x91 $" +y4 x26 K +$@ $4 +$4 -8 +sBL +D0 ^( +x71 *53 +z2 [ i14 +x71s.L +[ o41 +i6o x91 +c i03 i15 +-1 { +*23 -0 x41 +$6$3$4 +$6$3$6 ++4 +4 -0 +$2$6$9 +$6$6$1 +i6yx29 +$6$8$1 +-1 [ -5 +i60 i71 i82 +$A ^1 +$A $4 +.B*25x29 +o43 *57 +,6xA5 +sS2 +k^b*1A +i8$+8 +*42 ^w +z1 z1 o0l +}scN +} +4 +i4rxB2 +*94 '8 +^8 z2 +*75t +Z3T8*37 +-2*12s0; +} +9 +$2$8$5 +c $6 $5 $9 +$4$1$1 +{ x98 +*31 i4d +^2 ^3 ^0 ^2 +o2| +L4^" +T0 T9 T4 +x42y4s6. +i01 D4 +*52 +1 +o5r ,7 R5 +i3d i5c +d x26 +*05iB+*32 +c $! $3 +$4$1$7 +o55 l +TAi2u +$4$3$4 +$@ $8 +$1 o8d +,6 D3 +i7? +x41 +1 *30 +syI l +Z4 { +^i x15 +[p1sOr +^j q x49 +LBtR7 +i49 i54 ++5 i3o +] ] $1 +i5b i5d +i42 i50 i60 i70 +x81 seo +^YE +i6n c +*B9sr@ +'8 { +$9$2$7 +c^B +'7 ^C +x15i6KY3 +s2c.9*5B +k x21 +i55 i66 i77 +i1a *40 +*92s>v*04 +i1d i1b +x8Ax81+A +o4d x71 +sS}sG!Z3 +c Z3 x53 +i7a i5c +o4D c +*65 x65 ++4 +5 -3 +*32 D7 +x31 -2 +i61 i79 i86 i99 +sxP$8 +y4 K x26 +*58 D4 +suo +5 +oBki9@ +*34 ^x +c $0 $1 $! $! +o3X +x05 o0' +Z2Z3 +*58 p5 D6 +i2e i3r i4i +i31 i51 +x2As58 +D2 i8g x82 +i51 i69 i79 i88 +T0 T4 T9 +$. $h $r +i81 i99 iA6 iB2 +$4*98xA9 +c ^_ ^1 +sLxi0h +D2 $- +$5 $D +i7p [ +*76 x21 +*B6o7< +{*20s0z +o5r R5 ,7 +^B +5 +c $8 $8 $8 $! +-6 $z ++5 +7 -4 +c $8 $2 $6 +i32 i40 i50 i69 +i59 i68 i77 +*49 '9 +$7 xB3 +o9q*58s2w +i02 i10 i20 i33 ++Ax54 +$8$6$6 +x91 o6p +D3x08 +i70 i1a +$3x92 +Z1 x95 +*69 *12 +$2$7$2 +$i $e $s +^1xB6 +o3n ^k ++6 x31 +o3D l +xA1 -9 ++9 D8 suy +i77 i5a +l o9i +i3b i7a +i4YZ4x08 +sp}i8py4 +*45 ,3 +i1d i3a ++8 -4 -4 +*05 -1 +D5 ^' +i2u l +o2r c +sdQT3 +^1x45 +i12 i71 +i91 iA2 iB3 +t x54 +i28*89 +s*Co03s'k ++4 +6 +7 +i52 i60 i70 i86 +'6 *03 +o3D sD. D2 +o8Y*69 +y5 [ +sOR +-0 -6 -3 +o5" +i72 i80 i91 iA1 +c $2 $5 $8 $7 +$9$1$7 +sk[sjf*40 +$1 $9 $5 $1 +-7 [ +$9$1$3 +$4$3$5 +i6u$% +x42 .2 +i4_ '8 +c 'D $3 +*25x34 +^y ^e ^k +T2 ,5 +-5 *74 +s0HK +p1sy} +p1x9B +[D3 +$2$3$7 +dEsBj +{*18t +$0 $0 $2 $2 +l [ ^Y +i1u l +soE +u 'D ++4 *45 +*B4i7R +$s -2 +x62 i7r +-5-B +$3$5$2 ++0 x72 +K ,2 +*23 o4_ ++4 *53 +x7BsDS +o0W K +^xT1 +.5 *23 +x24T6x31 +o7o 'A +z1 L4 ++3 o1q +o7C D6 +o2m ^d +o0k o1. +o2h *26 +$9$2$6 +sg/x92Y2 +$*$. +*2Ao8k +i62 $9 +i3e R4 L4 +x14 c +i75 x43 +C +5 +o8c x51 +$4$4$8 +i0s i1w +$$ t +sSarx37 ++3 +B +$! D3 +i0s i1p +^m ^e +^-.B +$8$4$3 +$2 +4 Y1 +$3$2$6 +^0 ^0 ^8 ^1 ++2 -0 -9 ++7k +oA +x5Bs +i76 i1a +*35 c ++0i5g +xA8R4y4 +sH\ x67 } +cy1 +$0 x72 +*41 o5t +$1$8$6 +x31 Z1 +$.$* +i7K +$7$7$8 +$D [ +o1+x91 +i1e i5c +$A Z2 +o5t +2 +scq ++4 *49 +i4kk +o71 o1t +[ x25 +s'+$Yt +*19cssO +*62 $o +*65^? +$8$5$1 +d x5A +-8o8.s*; +*64 x13 +p3 .4 +$3$3$2 +$2$2$8 +x61 ^z +xB1 q x07 +i47 D7 +$6$4$6 +y1 l +$1$2$9 +$1$3$6 +x31}o84 +*02 x39 +p4 o4v x01 +o87 $j +'9 +8 +o9Py5 +DA d +x45 -1 +-3 ^g +*41 ^j +i9` +p2 x78 +i5d i79 +i4% +sun +x42 $! +$z x95 +i7a c +Y4 x7A +*7A q xA7 +$L t +k i5i +xB1 x98 ++0*43 +D4 *12 +x41 *01 +$qxA7 +*69 ] p5 +oAy xB7 +iAK x8B +.8] +o3r -5 +i77 i3e +*A2Y2 +y5 x0A +x85 xA5 +{*43 +$5$8$8 +] o5p ++3 D5 o5e +*A4 x35 +'6 $i +x93$e +$7 $D +{ ^X +$x $7 +$8 $. +u $b $b +^x ^x +$b $x +f*89 +o17 *67 +*50 -4 +i5Ni4p+B +*41 x21 [ +o3-$4 +x03 o1q +x14 -1 +x95*24x23 +i3d x53 +$n $b +*08*96 ++6 +A +A +$7 +3 +i4d $a +i7!x91 +,8*7Bs91 +x24 ^g +*89^h +k *34 -1 +shzr +x67$g +o1e*6A +s.IxA5i7a +^P x31 +sg. +$S]o98 +p1 x98 +$2 $f +K .5 +i37 i53 ++4 +7 -6 +o3c ] +$x -6 +x68-0 +$2 x24 +l i6p +-6 Y2 +sM>i0Jx65 +i0A x32 R2 +i57 i5e +*30 c +s0U +$2 $0 $1 $0 $= +-0 -7 -9 +-0 -7 -2 +Z3 Y3 x74 +Z1 +5 ++4 -9 -9 ++3 -2 +8 +$?$& ++3 +8 -2 ++4 +6 -5 +$6 x63 +K D2 +Z1 $1 ++3 -6 +4 +i1b i12 +-0 -9 -7 ++3 +5 +9 +$x x72 +{ y1 +} x94 ++4 -B +*3Bt +dxB8 +t*0B ++0 +6 -5 ++5 +5 +8 +T7 T2 +Z1 x53 +i70 R5 L5 +s9uCT2 +i0A R2 x32 +*16 x43 +sO-*B1$e +$os6/ ++5 +6 -2 +$5x4A ++4 -5 +6 +k -1 *34 +ud +i53 i7a +$s i3t +s3/ +i81i99iA9iB8 +*57 ^k ++0 $i ++5 -2 +6 +*78smC ++5 +8 +5 +c $- ^- +i54 R6 L6 +x0A^fD9 +sWCo7Q*B4 +,6i56 +*7BsAKE +Z1 o0t ++1 +4 -3 +*25 o0B ++2 +6 +6 ++3 -7 +5 +*34o0kx95 ++0 -5 +6 +DB x06 ++1 -3 +4 +o3Es4.xA6 ++3 +5 -7 +r $4 $8 +*34 x43 ++2 -3 +6 +^2 ^! +sht +$xD7 ++4 -6 +7 +roBjk +sb9i8% +-0 -2 -7 +x2B^3 +Z2D6 +$csTo ++3 +4 -6 +*85 '7 ++3 +9 +5 ++2 +6 -3 +o6w]c +x31 K .2 +T0 *02 +sWpsul +x73 o3f ++6 o5w +seoy5 +i51 i69 i77 i87 +i31 L3 +i37 i45 +*49.0 +s(vZ4 +$p $e $w +c $3 $. +i42 i50 i60 i77 +*75 .5 +i72 i80 i90 iA9 +i62 i70 i82 i92 +*70 *41 x52 +C*0Ax07 +i82 i90 iA0 iB8 +x84 l +*A8L7 +o5Sx18 +y4sqoiA& +^A *56 ++2 $M t +i01 i19 i27 i31 +,1 *02 ++1] +*82x04 +*02 { +Z1 T3 +sx@s0cx89 +sp&d +Z4s=w +x79sK+^Y +*87^a +sSC +i51 i69 i76 i83 +i31 i49 i59 i60 +i31 i49 i59 i62 +-7 o6b +i41 i59 i68 i76 +*37x4B +i32 i40 i51 i61 +i17 i35 +} ^o x0B +{ .0 +sO!$j +y1 K .2 +x53 Y3 +$0 o63 +y1 .2 K +$0 *98 +x31 $z +x12 p2 +-5-A +s0C +suxiBa +D2 *30 +i6fs}m +$qsZV +s0R +i72 i7b +sIc[x13 +x63 K +l $1 $0 $1 +x56,8 +o5- '8 +xA2+8 +$1 x46 +x29 -5 s6f +i3J +o6K +*05 f x1A +i34 i75 +sdm +*42 o5R +x21 x71 +s3Si3{x4B +Y1 *63 +^K *17 x64 +Z1 t D4 +f x64 +$z ^l +-7x51 +^H r +Z1 o0B +x01 sTK +x14 y3 +{ -6 +D0 o5N K ++4 .1 +xB7z2s>d +sNY +*23x82 +T8L5 +i76 i57 +i6 c +D5 L6 +r z1 +f -6 x7B ++6 i4. +i1e i74 +f x7B -6 +o02 *20 +*65 +3 +o4k t +i76 i5a +i32 i19 +D4 D6 +sa_ +sFI +i1e i7d +k x56 +'5 $8 +Z3iAO +p4 Z2 +$1 $3 $* $* +$9 $8 $! $! +'7 $. +rcr +c $0 $9 $! $! +$1 $9 $5 $4 ++3+A +c $9 $3 $! +$6 $9 $* $* +syf*B0 +$1 $1 $? $? +sb2 +i3_ +5 +scl +$1 $9 $4 $7 +$8 $9 $! $! +o9a $7 +x43 d +*08R4 +sPT +o0h x91 +o3Q +{ i7f { +x04 ^q +Y5 x27 +oBx +-8 L1 +i8X +-1 *52 +i32i40i50i64 +-4 Z2 +^w k +i8&s.FY3 +o4a o64 +t o1U +Y4 x26 +$) +6 +o4L +[ o2q ++8i7p +i1c i1f +*64 o3i +i9i 'A ++0 x53 +se3 T7 +$2 $x +$+$* +oAo x72 ++0 '7 +x12 D7 +*72 x03 +o6 x72 +[u +o1m D0 +^* r +o5z *02 +^s r +i8e i9s iAs +x15 i1r +$/$? +o0V K +x15 +0 +x31 $o +spK ++8 o13 +*13 x43 +,2 C +oA*D0[ +[x92 +*70 x52 *41 +$9 -6 +L0 L1 +} 'A +-3 i5s +x21 o3j +i8a i9r iAd +[ x34 +i5; +c 'E $2 +t o61 +{ *41 +Z1 D4 t +xA4*B6^t +*36 *26 +$! T4 +s2C +s2f +s,dsots]T +s7. +] o3z +i5W +*59 Y3 x86 +x91 'B +i4; +-9 o7b +sQW +*25 o3m D4 +s+po3q +i71 i3f +D3 o13 +c i5. +ssy x32 +x43 +2 +x43 +3 +i68 i78 +i12 i30 +'7x68 ++3 i1m +o9- D8 +p5^@ +i3# +*40 o3n +*51 D1 *12 +i5b i52 +$1 x84 +o3D c +iAy +s18 Z1 +i2b x61 +x81 i9T +x02 x53 +sugswkxB9 +i3w *54 ++0 x25 +$8 $b +slMT2 +-6 o7r +D3 T3 +^h x16 +-7x02 +i41i59i69i72 +x34 ^e +o14 -9 +$l -6 +Y3D8 +z1 ^A +o9F +o0v ^b +D7 o9b +s1zK +z1Y2 +o3| +DA -B +D7 *54 o5l +$oiA] +k x62 +i5a i34 +i13 i15 +$6 -0 +iAHC +$+$_ +D5 t +c ^d ^3 +x19i4DZ5 +i9h D6 +x52 o23 +Y3 x32 +z1 i1a +s i^U.B +saO +oB|sLk^o +*13 ^z +o3s *31 +^ps/T +T3 t +uo7o +c $8 $@ +c $0 $* +^w ^o ^n ^s +i7r i81 +i0f i1r +*25 D4 o3m +i0l i1i i2n +i2t i3a +i6e i7s +i4o i5r +*76 i7e +i5a i6l +i0i i1s +o4@ E +x52xAB +i95x23 +$q Z1 +x07 D5 +c i75 +tfp5 ++2 +5 -8 +i4h -0 +'C $5 +i2i i3s +o5y +2 +o2uC +*0B$w +o8OsWe +} x12 +k *37 +*42 T0 +^6 D2 +$2$1$0 +^t smt *21 +*8By3x6A +o69 s74 +$7$5$1 +x13L0 +T2 $! +$a +2 ++5 ^c T0 +$n +0 +*86Cx37 +y3 R6 +y1 x61 +D5]y4 +*32 D6 +T2 T7 T3 T6 +[ i5$ +'8 i7w +*35 t +^g ^m +o2p *51 +p3 *02 x62 +o8o^od +c $4 $7 $9 +*6A*A8i9= +xA1Y2 +c $4 $7 $3 +y3,8 +o6l -8 +i2n i3i +$7$5$4 +*35 *56 +sms D5 +i6s 'A +x35x8A ++2 -8 +5 +c x53 +5 +x05 p1 [ +x51 o7d ++2 +5 +2 +'7sqM +sT@sku +o6c l +l$gE +iA* +i2wxA5 ++6*46 +c T5 se3 +^A $6 +x62o0f +$p *86 +sez +i9fsS^o9= +i7N c +i5u *57 +$to7nxB8 +'8 i52 +c *68 K +i7s i81 +i0r i1e i2n +x63 $c +o8I +so0 u +si7 +-0 *16 +[ ^A +scbx13 +i1- ] +l ssd ++Ai8O +s0= +} -2 k +i31 i5e +$1$4$0 +,7sTQ +spyx39 +{ o5Y +oBO +i16 i12 +o87 +0 +p1 x68 +i6c c +i8p,0 +*3A^h*B0 +s"`$dT7 +$p x02 +-4 -7 -5 +-2 +8 +i1a i2r +D1 *67 +$asHc]$a +L5x59c +i61 i79 i86 i92 +o7O K +i11 i32 i53 +{ i0t +l ] $i $n $g +T2 T6 T3 T7 +[ i6A +x03 Z1 $i +sPS +i4e i5d +D2s{=c +D5i0. +r y5 y1 +i9i iAn iBg +^V{ +i3e i7c +i32i40i51i62 +i46 i56 i66 +$) x13 +s`h*67[ +T2 T3 T7 T6 +sdc +x74C ++1 +1 +8 +x12 x32 +Z1 o80 T0 +i6c i7h +sPdo7< +c $9 $4 $7 +oANo8? +y5x92 +*17 x61 +1 +*95x21C +oA`Z1D4 +syb +x52Y5E +c $8 $7 $4 +Y2 xB3 +^r ^a ^w +c $9 $1 $! +] x48 +o0V x32 +i12 i17 +i31 i49 i59 i67 +i11 i22 i33 +^-xA3 +$6 $b +i73 R8 L8 +i18 i38 +i53*92 +x48$- +] f x51 +c $1 $2 $3 $- +ti1l ++5 $g +i1a i2m +i6i -3 [ +i7a i34 +*75 o1h +^d $h +i6c i7o +c $2 $6 $! +-6 '7 i3i +T2 T7 T6 T3 ++1 +8 +1 +i36 i54 +i41 i57 +$4$8$1 +i4a i5d ++3 -0 -5 +o11 D7 +i0" l +c i05 i19 +$vspG +$2$0$2$6 +D5 o0H +i51 i69 i76 i85 +i54 i7e +x41 x82 +l *87 +sJZ$v +i5e i6s i7t +*24 o31 +$6$2$3 +$2$2$0 +x31sl4 +Z1 T0 o80 +$c +7 +i7gxA3K +K^0 +$&$? +'6 $! +y4 u +i5f i7e +*9AxB3 +D1x63 +T5 T3 +i52 i5b +s#jsPH +i51 i69 i77 i85 +Z1 z1 x25 +^fi1y +x53 *35 +c $0 $3 $2 $8 +i37 i50 ++A *8A +x01 c $n +*02 *53 +] +4 +[ +9 +o6HTB ++2 -4 -3 +x41 snl +$6Y5$5 +*5Ao5t+3 +$h x63 +s1C +^bs0& +*86sD>{ +$a o7f +i1a i2n +i7u -8 +^m o4l +x24 +2 +i7e i5d +x19D2$M +$1 ^^ +$A c +.6 $@ +^1 o20 +$@$? +R7o7& +suA l +sip*68 +,1*49Y3 +,4 Y1 +[,3 +'A o7h +i3l i4e +[ Y3 +i35 i15 ++3 -5 -0 +x04sW $- +suUT9iAL +*52 r +K D9 +kcp5 +D3 z1 +o2E *53 ++0 $l +T2 T3 T6 T7 +$1$6$5 +i47 i57 +s5bx43t +KsiK*47 +TA t +z2 z5 +xB2 p1 +u sE3 +1 +*42K +-1 -A +o48s|R +$2 *58 +sX%o8$s-M +x43 Z2 +x95*26 +x52 $a +*21 Z1 } +] $> +$4$4$6 +z2 x24 +R5x41 +i17 i15 +oA1 +9 +T2 T6 T7 T3 +c $b $o $y +-9 -A -B +*74 o41 +sjo +*65 [ +$8$9$0 ++7-3 +i66 i71 +xA7o4I +i12 i72 +*13 i5u ++2 -3 -4 +sxksIs +s4k +sn- +T4 x31 ^7 +p3 x62 *02 ++3 +4 -0 +i12 i39 +o77 *10 +i7m i8e ++6 x12 +x95i7, +i2c i3k +T2 *02 o3i +*71s"/*31 +c i4@ +Z5x13*69 +$C*90*28 +$=$] +o0w'8 +{C +se3 T3 +r ^r +{ $w +i17 i3a +i4u o0r +D5y5 +l $4 $2 $0 +,9l +$* +2 +y4] +*63 [ +{ xA3 +x64 i6t +$E k +x72 +8 +i6DK +T7 ] +sxKi8A +i54 -6 +x81 E -5 +*13^F +i38 i52 +*42 *64 +i6a x05 +sND +i1- x13 p2 +u z1 +c $* ^* ^* $* +^Yx1B +x03 *30 +i31 i49 i58 i64 +c T2 i2_ +i31 i49 i58 i66 +i73 i33 +c ss$ +x03 $! +i51 i69 i76 i86 +i51 i69 i76 i80 +i62i70i80i97 +$x *65 +$7$7$5 +L5s2GsgB +x72 $4 +$3 *97 +x52 o4j +$>xA9 +-4 +8 +l^o +$ sNw +x81 ^K +} i0z +E Z1 +*A9 .7 +c $8 $5 $! +o0WK +*63 o5t +^6 z2 +D8 D5 +o2W c +xB5y5x87 +i9W t +*05 x45 +x31 *54 ] +kl +*34Cs9Z +i41 i59 i69 i79 +D0 Z3 +Kx56 +'6 $! $! $! $! +r o2D k +$@$% +D8 i4a +p1 x03 +o6K x21 +*05 *12 +*38i5* +i14 i22 i30 +$5$4$1 +r k o2D +z5 .7 +sfp +r c Z2 +*35 ^T +i31 i49 i59 i61 +$o x12 +$1$8$9 +o89 Z1 +K -6 +C Z1 +[ T3 +xB7 q +$4$4$7 +Z3 Y4 x06 +D3 '8 +i82 i90 iA0 iB5 +L8oA8xB5 +o1O*76 +sHWspQ +i7L c +*49$< +x01 r +x04ux37 +sa4 se3 si1 so0 +i31 i59 +o50 l +sa4 si1 so0 se3 +$Fo9] ++5 +B +i37 i47 +sWB +i72 i81 +i13 i10 +i5d i3f ++2 +4 -1 +i7i i8n i9g +c i6h +*41 } } ++3 -9 -6 +i43 i50 +i8T] +o5o *52 +o6p *56 +z1 *60 +-7 i6_ +y1 x38 +K { +x81 i8a c +i0d i1u +x82 *86 +c x25 +^D y3 x34 ++0R9 +i3e *60 +o4e ^j +^b -3 +s5@*26 +]{ +sa4 so0 se3 si1 ++3 $4 +'8 o5p K +i6k i7a i81 +$5 *56 +i3a i76 +i51 $2 +^C Z1 +oA[s2dsdX +o7ns8w$x +si1 T5 +x53 i4l +sa4 si1 se3 so0 +$@$& +^D i86 +*41 [ x21 +.2o99 ++5 Y2 +^i ^t ^n ^a +o3. *01 +$1 i6e +] x5B p2 +i33 i42 i51 ++A -6 -6 +o3i u +u $5 $5 $5 +$6$6$5 ++6 $p +i55 i60 i70 +o7li8O +Es.asz0 +z1 .6 +Z4 x65 +*12 [ o6o +c 'D +l ^y ^a ^l ^p +i41 i54 ++5^cT0 +c d '8 $2 +x42 Z4 x72 +D8 o4b ++3 -2 -4 +D3 o55 +i0z *15 +$F t +$? $1 $9 $9 $5 ++0 +5 -3 +i0! +1 +sfG +x72 T2 +x63 $R +$ws@S ++6 -3 -4 +C o1a +i1o i2g +i3D*39x75 +-2 *12 +-1^L +^n ^i ^t +x81 $m +i3l i4i +i2s i3a +D0 o5t +i0s i1e i2r +i6d i7a ++0 o42 +i0n i1i i2c +x3B$= ++2 +9 +5 +o22 t +$. x81 +{ y3 ++2 -1 +4 +x61] +i2r i3e +x41 Y2 +l '7 +3 +i3a i34 +o9w x42 +^X z1 ++0 -4 +0 +*16 o1y +i3f *50 +s2s +{ $j +x57*57^B +$4$3$2 ++6 +7 -0 +s2! +sSF +$1$7$5 +$4$0$0 +E s3A +^H x72 l +stm +sSE +y2Y3 +*90D4 +'C $2 +x61 i8u +*71,7 ++7 -B +.2 i3r +$l i8e +i4e +3 o5m +t T7 +x81 -5 E +]t$X +-1 -9 -5 +Z1y2 +x15 ^G +s97 *67 +*B1x82K +u $0 $0 $0 +xB7K*7B +i8D^@ +o3Y +7 l +$1 $9 $9 $0 $- +^0 z3 +Z2 [ +i0g i1i +o6{ +c $# $4 +o73 o89 +i0p i1o i2l +*74 x64 +*74 x65 +i95 x71 +$. $i $n +o94 l +k o4k +.9sC_ +sa4 so0 si1 se3 +l *20 +x74 $y +$h xB3 +s.M^l +'8 K o5p +r x73 +*45 ^p +$1 o4. +x76x49x42 +p2 *54 +$i *86 +$2 l +o4p o5c +x81 c i8a +i62 i73 +sla +x37R8 +co2C +i9f ++1 t +c[syo +$6$1$3 +d 'B $9 +Z1 $n +i0k i1a i2n +o1j *41 +.5 K +,9 $h x63 +x31 ] *54 +o6U c +^v x16 +$*$# +-0 -8 -3 +Y4 ] +t *10 +^1 x52 ++3 -6 -9 +i3f i5a +o1a ^g +i3e i4s +,3'8 +{szOY1 +$h x53 +$&$^ +$3$4$9 +-2 -2 -9 +^S *34 +l x94 +$- Z2 +$0 $1 $0 $0 +$2$3$1 +o7$,7s.# +[ $n K +c $0 $7 $5 +o9r x71 +i52 i7e +'9 *85 +'C $1 +*65 '9 +$b $l +i3b i7e +x13'7 +*76 *31 +^F D3 +x72t +c o3m +p1 T1 +o1a ,4 +$2$5$2 +i6. x12 +$9$1$1 +$8$7$1 +i0g y1 +i5c i3c +i31i49i59i62 ++1 o3o +x12 p3 +s6j +c ^* $* $* ^* +$6$7$1 +x43x48f +*01 } +$5$0$2 +c $7 $1 $9 +x9B] +i75x36 +$1$0$5 +,0y3 +'9 o6m +[T5y2 +D2 i6r +'5 $i +'5 $x +*37i2nx49 +c $* ^* $* ^* +*65 o65 +$4$5$4 +$2$8$1 +$5$6$9 +c 'D $5 +*9Ai4l,3 +] *10 i0c ++8 -0 -0 +i72 o80 +T7 T4 +*70p1l +$n $e $h $a +i70 i3d +k *13 -5 +i31 i52 +^-xA6 +^h ^s ^a +sa4 se3 so0 si1 +l $l $o $o $p +^o ,2 +*31,7^D +c i3a +*06[ +y4oB x96 +,9 x63 $h +o3Y l +7 +o4k +5 +o0c $0 +^ko0` +*17 x12 +.8*A2iA3 +^t *65 +*61 -1 +fx4B$m +*7Ax01 +i5a x01 +x65*35 +$@ R7 +$IDA +l ] $W +y4x68 +$t +7 +-4 -7 -6 +i3b i72 +ux31 ++0 +0 -4 +i42i50i60i72 +sxm +s-]sfr +i31i49i57i68 +sS+r +CD3 +i7a i75 +'6 ^w +D4 -B +*91to7P +Z4 +8 +o2t D1 +kx28 +'8 -2 ++8sfAsrH +o5e K +s8S$5 +i7e i8r +o1V k +lD0Z2 +$ru +r Z2 c +*65 o43 +$2 sbR +o9i D0 +^c x26 +i3a R2 L2 +i36 i77 ++6 -4 -3 +$a i6p +^*x3Bx65 +-4 i0l +$y +6 +u $8 $8 $8 +c $5 $8 $4 +xA4'5d +$o ^C +o6?s5N +.8 s40 +d $9 +c $* $* ^* ^* +^.sl# +D2 $. +[-6 +z4 x29 +s@LxB3s>4 +o1e *24 +xA3.5*41 +o6a o4y +sRu$6 +i7d i5a +$5$7$6 +$1$3$0 +c ^* ^* $* $* +i0d i1o i2n +x25 ^c +i82i90iA1iB0 +LB x92 +C k +scv +so2 +x51 *04 +o6g E +RAy5[ +*43x34 +i33 i71 +ssh +i72 i7f +Z2sPb+3 +y5 x98 +s&?+9 +i48 i56 +C o0P +d C +,5*90*0B +i32 i53 +i3c i72 +l R3 ++2 +5 +9 +,6xB4 +x21y3 +$1$2$8 +c $5 $7 $3 +o1- s1a +$1 ^/ +d '6 $7 +^tt +c x23 +*31 E +x69sO- +i32i40i50i61 +o4 $1 +*93 o30 +D6 o60 +*74dx7B +$. $2 +x98x62 +l [ ^w +z1 *45 x14 +D7 o6G p3 +o6i c +Z1T3 +Ez2 +r ^O +-0 -3 -8 +^8 T2 +i4i i5e +$NsU[x64 +*87p2x87 +i72 +6 +D4x84 +$0 $0 $@ $@ +-3+A +o1n l +s8S +c $2 $2 $* $* +*05 ^r +Z3 x06 Y4 +k -5 *13 +co75 +-4 -6 -7 +i5d i1d +$0 $9 $! $! +c $9 $9 $* $* +c $0 $7 $! +o9o xA3 +c $2 $3 $! $! +*51{ +Y5-0 +o5Wsd+x41 +i12 i18 +x64 '9 +^f p3 +u$t +i1zs@N +-2 -9 -2 +^P x43 +*78 $a +kx41 +x16D4p3 ++3 -4 -2 +rx6A} +c $1 $1 $$ $$ +*39 x46 +^b x52 +c $9 $4 $6 +i62 i70 i80 i96 +i3m i4a i5r +^4Y5 +c i40 +^p x62 +i3_ +1 +$2 $3 $* $* +c $1 $= +$2 x1A +*08*19x3B +o9nx45 +x65 c +c $9 $9 $9 $! +$3$3$9 +sOP +*B2$Y +l $a $n $a +c $! $! +E R1 +c $6 $6 $! +x75x14 +*42p1sMi +c $0 $0 $1 $! +Z5 t +c $m $a $n +x59s30 +$0 $0 $! $! +lR8 +*06 } +*34 *74 +$2 $2 $* $* +o5v T0 +*34x87t +syb.0 +u d 'C $9 +-7 *68 +i22i30i41i50 +i62 [ i0G +*06 T6 +$j $a $n $1 +c $3 $3 $3 $! +$9 $6 $* $* +$1 $3 $! $! +c i03 i18 +i11 i1a +x62 o3t +i76 i54 +sZ/o9So8Q ++3 t +o7_*58i0S +s$-+9 +l $1 $9 $9 $9 ++0 x82 +x54 Z1 +p2$1 +-B+D +c $8 $8 $* $* +T8 $7 +$p *42 +x31 } +x43 i0w +$2 x63 ++E -F -F +-1 -5 -9 +$4 $$ +i32 i77 +*B7 x85 +i33 i77 +*6B} +x31 +3 +i37 c +*2B^p +l $5 $5 $5 +i55Ex91 +$. Z1 +t o0m +D4 D8 +l $2 $2 $2 +-8 o66 +o6ocC +xB9i1y +p5oA$sXN +^D Z2 x94 +c $. $8 +{ { { { r +i4e o5m +3 +*10*91 +c ^* $* ^* $* +c $0 $5 $1 ++E +F +F +x72Z5 +i7a L6 +i0n 'A +i75 R5 L5 +i5s *10 +^D Z2 +iAQ +i33 i44 +i71 R5 L5 +s20 $! +^3 ^x +^o ^l ^l ^a +*20 -3 +sNO*A4x21 +K*31 +^hs6x +i31i49i59i60 +i71 i84 i93 ++0 -3 +5 +t 'A +c $5 $3 $7 +sn_ +xB9xA3T5 +u d 'B $0 +iAR +x45Y2Y3 +*37 x05 +i46 i42 +i1e i70 +Z1 ^A +i5ax09 +x28sh(p3 +s0$ +x51 { +o8W +x09C +*50 o3j +d 'M +i4e i5t +] i2a +T4 *23 +$5$6$3 ++9 D3 +i51 i3f +] *AB +i2o x72 +^d ^x ++6 -0 +7 +*75 o0A +t x29 k +^1 $2 +x2Ap1s"Q +y1 ^y +y3 *35 +*16 ,1 +^H l x72 +$8$4$2 +i4y u +slf *12 [ +-8 o5d +o6&s[H +-2 *26 +i53 R6 L6 +$1$8$3 +$5 ^5 +$8$8$1 +^N +5 +*BA{ +L5 y1 +$$ ^$ +Z4{x93 +to1U +x61$4 +,1 K +$6 ^6 +i58 i3a +x38i2j +c i44 T5 +i31i49i56i63 +i1l { +t$y +c $2 $6 $1 +$1$5$6 +i6l i7i +$?$_ +o56 ^L +{ *03 +o72 Z1 +i6w i7e +*24 z1 +z5 stn +i5b i5c +K *21 +*76 s51 +o8,TA +t k x29 +i5l i6a +} $O +,6riB, +l +3 '7 +*68 x03 +y3 x42 +^4 $s +.7 -6 +$7$9$4 +Z3x17x69 +i42 i57 +$1$9$5 +E^F +i78 i3e ++4 -7 +5 +cx63 +iBh +Z2x01[ +o8F +*57$Ai0a +-0 ^h +'4$Y +*26oBQ +^u *04 +i9D +i1. i3. i5. +*04o51 +^k +6 +*05 x34 +x9B$t +i78 i87 +i6h i7a +so% +i6d i7o +so0 se3 sa@ +E sLs +u d 'B $2 +f x53 +x56x56 +c se3 ss5 +l i51 +s1_ +-2 *56 +i32 i5a +]D8 +$S Y1 ++3 -4 -0 +i7M +$.$_ +*67*10^T +D0 .4 +x24 $* +i0f i1u +x21y4 +{ x01 ++6 +6 -0 +o0k k +x27T0*09 +x21 T3 +i71i89i99iA2 +p4xA5x61 +$4$1$8 +$u -6 +x03$wc +x52 K +s5P ++4 i7! ++4 i75 +$t ssu +l [ ^X +$usZgoBM ++2 -B +x7BsaG +x95 K x93 +i8m D0 +*51 $. +i6J*81 +o7c *75 +$<$= +$7$2$3 +o7G +i76 i3a +i0s i1o i2u +i9b +i62i70i80i94 +i69 +7 +$1 ^` +oAw ++0+D +$m i7g +T2 T8 +} .4 ++7 i7f +i71 i89 i99 +x42 o5d +i02 i10 i22 i31 +*A2 +*93x61] +$7$2$9 +x85.5*74 +i0w i1a +x53iBGo7_ +o5 x02 +uk +$t z1 +i42 i50 i60 i71 +i8^ +oAG ++0 +5 -6 +p1 syi +x14s[4sP8 +l i2p +l ^3 ^2 ^1 +$9$0$2 +x61 *75 +u o1k +i1` +f x89 +i4n ^k ++5o4_ +l ^g ^n ^i ^k +i81 i90 iA1 +x37EsoH +l oB1 +T8 T4 T2 T6 +i1. i3. i5. i7. ++A ] +p5Z1 +-5 $m ++3 ^F +$9$0$1 +T9 TB TA +,8'8x0B +$! o0R +i0n i1a i2n +o9o t +D4 '7 +*94 x73 +Y1 $x +x53*09-A +C i0R +k o0t +*50 o3t +x21Y1x9A +cx18^e +z1 x42 ++3 -0 -4 +*B5i7` +D1 i4e +^r D2 +T0 x63 +o53 D3 +x93,2 +i0P*42 +l *03 +i22 i30 i41 i51 +] ^k +$6$9$8 +-6 $4 +Z1 x31 +u d 'B $5 +o3w k +x67T9i6p +^! z1 +ED3sGB +l ^m +i74 R6 L6 +R9R5Y4 +iA1 iB2 iC3 iD4 iE5 +*51 *14 +R6x46 +sYmsr9 +so0 T3 ++7 $g +*54 p2 -2 +i4c c +l{x12 +c $9 $7 $! +*06 x41 +i52 i62 +^r ^a ^p +o62 i51 +^6x81 +o0t o1e o3t o2s +s2$s_=sP& +x61 Y1 +x52 $n +-0 ,9 +o8KiAys|\ +^i x54 +z3oB\ +i4B +svb +{ ^3 +iBZY2x53 +x4AxA4^f +i01 i19 i26 i34 +'8 o34 +iAd +*BA D0 xA1 +l o68 +soi ^t +i22 i30 i40 i52 +i5b i7d +c $6 $9 $4 ++9 x45 +y4 k x48 +Y2 D0 +i41 i56 +o4"x78] +us%3 +x56+9 +c ss3 +o1Rs/!DA +x42x48o2b +} x81 +^s +7 +d o6t +sa&*20 +x73 $4 +x25*A8 +i58 i5a +,3 *72 ++5*56-8 +$5 $c ++6 -0 +6 ++6 i64 +*92r'7 +sk|x37E +x52x68 +i0y i1u +o9l x52 +ux41 +o5< *14 sY4 +skt +*02*57 +x8A^piBB +D4*9B*A8 +R0 x18 x21 +$1 ^= +o0; +i0t i1i ++D +D +E +i38 i7a ++6 -0 -7 +$5 *57 ++6 +9 +9 +-8 [ +$3 $@ +K .2 +sq+8 +x12 *52 *41 +$2 $* +x81 i8a +r x61 +o4X t +x54 l +o95 +8 +$y +0 +-0 i3j +[ z4 +^K x24 +-9 u +x86 x72 +c T9 +i19 i14 +x06 $1 +.5sWAK +c $9 $6 $7 +s5wR7 +*85x79 +l $2$0$0$7 +ssw +D4 ^K +r*A2 +^g *05 +*53 *63 +] TA +o5X +x73 .6 +i3e *53 o2f +c $3 $8 $1 +*43 $a +x97+8x94 +i32 i76 +o1x$q +c $l $e $e +i1d i1c +l ^a ^n ^a +c ^2 ^8 ^9 ^1 +i5a i19 +i31i49i58i61 +c i3_ +sgm +c $9 $5 $7 +$]$] +i35 i72 +^q *14 +i1c i3e +-5 $t +i0a i1v +o22 [ +t } +*21 *04 +z1 } k +rq +x28Y3 +i14 i38 +^l x53 +$k $r $i $s $h +l +1 [ +*53 *50 ++5+7x15 +i3e o2f *53 +x57iBL +i13 i30 +x51 $z +$2$9$9 +i9B x92 $d +k D0 o5r +-5 k +i3a i1b +p1x75s@M +i3e i1c +i32 x03 +c o7o +p1 { +i3m i4e +c $3 $7 $4 ++A *4A +c $8 $3 $2 +D4 *38 +$A $0 +s4. +o9n o7v +*28x05 +c o35 +^- ^e +i3= +Z2 x43 $7 +$1$1$5 +sTX +$1 $7 $9 $3 +$5$1$1 +r x62 +o4c +3 ++1 $n +i62 { +$9$8$1 +i0h i1a ++0 ^3 +[s=3d +DBx56 +i3_ *46 +i0r i1o i2m +i30 i1e ++8 x21 +T6 x72 +sF4saA +i8qx9B +o5. Z2 +i0m i1e i2g +*74i3esg@ +$! +1 +*05 ^y +$f x91 +$6$9$9 +slg +i3i i4t +^j x62 +x85sVzo9y +l i6j +x06 Z3 +$ysEb +i12 i38 +K o5p +x12 *34 +to4n +i3m i4a i5n +xA1 'B +$1 L6 ++1 *06 +i51i69i79i89 +*14 i0m +i12 i36 +*50 x16 +z5 z4 x39 +*85 x7B +CT4 +^#sA0 +^0 z2 +o7M D8 +i64 i75 +$0$0$3 +$0$0$4 +$6 x62 +*12 sma +^k x53 +t o0o +o1l o3e o2u +Z2 $7 x43 +i2v i3e +-4 x63 +i54 i63 i72 +z2L7*B0 +-6 ^a +i0v i1e i2r +$0$2$0 +[ q +x01 sry +}D2si" +i3a i54 +s"Zszk +r i1s +$3$1$2 +D1 sds +o8l -7 ++6 *14 +$_$+ +i2s i3h +$a *16 +i0b i1o +sFti4ai9. +i0h i1e i2r +$r i64 +*89 o7p +^N x02 $x +Z1*B3-4 +o4p c +oAa x02 +$1 -3 +iA1sA't +u 'E $3 +o47 l +]*97s@b +i4c k +i3f i74 +$i -9 +x6A*5BsKN +i4b i5o i6y +D6 x82 +T1 T9 +i4m i5a +si1 T6 +o25 r +i3a i79 +i10 i38 +*70xA6*7A +l*97x25 +x02 u +x0Ax94 +o3_ Z1 +Z2 o8s +r *15 +t D1 +i4s i5o i6n +*69*79^; +i1e i2t +i0s i1h i2o +i1c i5c +T0 T9 T8 +D7y4s#< +x27s_r +o5z *23 +*49$2x24 +i0p i1a i2t +i2a i3d +Z3 xB5 -9 +*34 *62 +i7l i8a +D6 $0 +x53 Y5 o5k +sly x41 +sau k +o91 *A9 +u $2 $0 $0 $4 +i6l i7i i8n +Z5 o81 +c +9 +i75 i80 i90 +x81^x +D5 i1j +*76 x41 +i0j i1a i2m +$N o8s +i3n i4a +x72 ,3 +^e ^r ^p +^c ^x +^B ^2 +u $x $x +E ^i +$1$8$1 +C D1 ^c +c $f $f +$x $c +*90$? +*57$X +^1 ^D +[ +3 +Z1*58} +c $x $0 +i3o x73 +c $2 $$ +i5d i5f +z2 -0 x43 +^x ^d +*95Y3xB1 +^x ^c +{s9UsZ7 +oBR +$A $9 +D1x5AE +l [ ^j ++0 -5 -4 +D2 o2x +K *23 +sap +x39o4astY +$b Z1 +D6 +0 +xA5*67o51 +K i0J +x6B x24 +x29o5y +saesVm +*9Bx43^Z +$8$6$9 +D3x6B +^y i1h +sY{c*86 +z2 x43 -0 +*07q +]]]]]]]]c +*B8o5_u +T3 $4 ++B -6 +z3 +0 +{d +Y1RB +*67 $1 +i3c i74 +T3x8AD6 +x51 o64 +i58 i68 i78 +x01 o21 +i4n i5n +i7*D6 +*34 *56 +K D3 +i32 i50 +iA2 x53 +*34 $0 +i9= +C o0R +x42 ,3 +xA2 x72 c +-9 *8A +o79$L +,8 *82 +$T { +D7 xA3 +c i13 +*31 '8 +Z2 s06 +Z1 +7 o0a +*32i68 +*03 o2r +1 +d '6 $5 +i33 i7a +i77 i80 +siO +*20 Z2 +o1U stq l +] -6 +-1 -4 -3 +*87sdT +oAV*74i7i +T0 T2 T3 T5 +*96skb +i0f i1e +*26 D3 +p2'9*B6 +$8$0$2 +D5 ^G +[-4p5 +x03 *13 p3 +i0v i1a +i2s C +i7d i7f +tx12i5} +*24 +0 +ut +o8%*89x98 +x0A*80 +k[*61 +c $ $6 +i1s i2t +i72 i80 i90 iA6 +*74 +6 +iB'y1*20 +lo0k*86 +f sQ, x9A +*30 D4 +E o2' +o4o K +*B0 x01 +*05x4A +z1x73 +*73 x21 +i9a iAb iBc +x51 *87 +$$ $4 +i3a x19 +*28 *95 +D4x17 +{ -8 +p3xB9x9B +'9 $b +} } $z ++3 +6 +4 +*A1D1 +o4\ +-0sy.c +spjoAk ++0 +0 +6 +i54 i64 +-0 ^e +c $2 $8 $! +i38 i75 +*21 x25 +s2ts*> +] -1 +i8OiB, +x61 $z +i54 i5b +$=x59$a +x7Bx16 +x45^e +-5 *31 +[CE +[ *41 +'5 $9 +i5m i6e +-4 -6 -A ++2lo2F +tC +Z1 o0b +x32 ^6 +i33 i41 ++7 $0 +*56s#I*A0 +i3e i1d +i8z x05 +xA2 c x72 +t *52 +-7 *20 +*2Bo7T +c i06 i14 +o0n ^n +c i08 i11 +o3l -4 +i5n i6a +*2Ao1Isz8 +t ^1 +,B-BsOu +o62 l +k x71 +z5 x1A +i31 i49 i59 i69 +^m *63 +o0o^hx75 +i2^ +C*70$T +*25 [ +o6- x04 +o64 Z1 +x23 $r +]x08^0 +D6s"R +x61 x14 +i7Psg] +p3 ^j +x43 ^d +t x64 +^9x78*8B +-9 x72 +K $g +i3d i79 +x61 ^m +Kshl +i31i49i58i63 +i31i49i58i66 +$! ^0 +T2 x02 +xA5d +y1 .5 +$AE +scm[ +{ C [ +$z[ +i6E -5 ++2 -7 -6 +i3o i4u +.3 x73 +z2 -1 +i7a i56 +sMR +sx7 +E ,8 +-9 } +,B^eo0S +*29DB +i11 i35 +c i07 i15 +i12 i37 +x12 o34 +c $* $9 +i7m i8o i9n +i4m i5a i6r +$p +0 +c $9 $0 $! +oAHo1o ++2 -0 -8 +$5 $E +x49s!hssG +$t $g +k'8 +i3h i4o i5n +szm +sk!sgF +i7F t +k *76 +i9.^ssD, +o3w +1 +s2T +o5DsBz +i18 i10 +i0z i1x +d x73 +i3` +c $5 $4 $9 +*05 { +x38s1< +*37 ] +i5a i6t +c D6 +i7l i8e +*83^A +$vls{} +i0p i1a i2n +tsBvo8m +swk +$to5G ++8 ^a +D5sE'E +$2$0$4 +i0= +stB +x62 $3 +-9o60 +l sgj +i0a i1l i2a +k x51 Y2 +$. $c $a +o7tx13 +i01 i19 i26 i37 +c ^2 $! +*18s5AK +x12D2 +o0N *25 +i0n i1i +i31i49i59i61 +*47 *67 +$1$5$0 +$d x96 +i72 i3f +$j $P c +o7^ +x8Bx24R9 +$f $o $b +i91 iA2 iB3 iC4 +$iT2 +,3x96 +$u*2A +*25o7A +E D9 +*19 z3 x07 +i01 i19 i26 i39 +-6 T2 +-1 -3 -4 +*36 i6x +o3"k +i6\ +i10 i32 ++3 +6 -2 +sO'iAQ*B1 +i0c i1o i2r +i52 i60 i72 i89 +Y2 -9 +^f ^l ^e ^s +sdf$> +*51 *42 +$w Z1 +^e^f +i81 i99 iA6 iB1 +x21x28 +i39 i44 +$l $g +{sGE +x07p3 +x82 *56 +sFW +c $! ^2 +^]x4A +^a*31 +x63 $r +'9 o4h +^n { Z1 +o4k *35 +i1c i2o +i52 i61 +$ox62 +l o69 +c $4 ^2 +D3 $* +i4d i5o i6g +t x93 +szYo6&sG$ +*B5i8n +*03 +1 o2r +i1c i5e +c i7. +x81 Y2 +x32 d +x32 x42 +x72 x31 +i58 i7a +T0 T3 T5 T2 +c ^2 $4 +K -4 +{y2 +i0k i1h +*B9y4i3q +T2 s03 +^7*51 +sVN +i34 i76 +T0 T2 T5 T3 +D8 o4c +y3 '9 +iAd]i02 +o6m '8 +o2z x53 +i16 i39 +$k $d +'9 i1t +o5w *41 +i81i99iA9iB5 +i2m i3e +i5d i5c +x94o8n +{ ,2 +] k +Y5 x09 +i85 i90 iA0 +i53 i1a +x75^#x67 +$0$9$8 +t$w ++2 -6 -7 +o8DsHq +i7H x17 ^M +Z1 x62 +{ T9 +TB T0 +i0s i1i i2m +$2$0$5 +i5u i6s +x63o3C*2B +x7Ao2E +i5d i3c +i66 i70 +c $6 $* ++1+C +T0 T5 T2 T3 +*60 D1 +*04 T4 +-0 -4 -1 +o1v *51 +i1} +x72 ^m +i69 i71 i81 +i31 i42 +oAp +f xA8 +oAr +i59 i5a +$e+A +i2_T5 +sYis9%l +$q $a +i52 i60 i72 i85 +o5_ *24 +L7 o6. +{ $7 +p1 x79 l +^ts0+sz& +i22 i30 i40 i59 +i97 D8 +^2^6^9^1 +$2$4$4 +i1u i2s i3t +stb ++3 -2 +6 +$0$2$9 +R0 oAm +x7B*43R5 +.5x2Bx83 +s}`T3 ++5 -4 -7 +o2I*03*68 ++0 +F +o1o x25 +$m $e $n $t +$1$7$2 +i37 i1a +-1*24 +,6 *46 +,0i6N +o8m l +T0 TA +xB2 $7 +ssz +3 ++0 +6 +0 ++0 +6 +1 +o53 D8 +i7w x34 +oBM-BL1 +o9C+3 +*89 k +o0H .6 +k i4v +i1i i2g +x92 u +o0W D2 +*10 r D3 +^d ^d ^a +s7xT6o5y +i3e i75 +i35 i7a +i1a i2a +i0D z1 +$t o6k +.1p3 +s1v-9 +D3i9)E +i5c i79 +^y ^o +-1i4ax43 +*90o0n*3B +Z1 ^e +s4w E +$p l +i32 i40 i50 i62 +^B D4 +$h x41 +k $1 ++0 o7n +$X $2 +c $m $e +x96$N*B5 +i73 i5c +i33 i3d +*52 -3 ^J +-0 -1 -4 +*76 i7u +T1 K +sJts&3x78 +i3d i34 +i32i40i50i63 +i61 l +u ,8 +*53 +8 +*71+2 +Z1 o0a +7 +o3L } +^Z x31 +D3z2 ++2 -8 -0 +^7s0+ +$5$2$3 +sad x52 +o68 ^K +x08^[ +c i5p +i4M E +.2 [ +i6G l +*86 x41 +i62 i79 +i56 R7 L7 +.2o8il +x32i0c +$7 o0Z +*B4^J ++3 +4 +6 +*47,6 +s-ui6f +c i2a +i1f i1c ++2 +4 +5 +x04 i3p +i4V ++2 *39 +^i x25 +x82i5M +o1J t +D8 $L ++7 D5 +t *23 +*45 Z1 +i0b i1e i2a +^n ^n +^F +7 +i75 i58 +*35xB7i8@ +i2sx53 +iBq +{ x6A +iBm +^b sx. +i02 i10 i21 i38 +s!V q +i2l i3l +Z1 o7i +y1 ^C +*31$- +sfg u +} D6 +s4J +i2k i3a ++1 $j +^f o2u +i4s i5t +$o o6g +x27^3*19 +i5l i6i +*89 x03 +o4c +2 +x42 o21 +$# $2 +u R4 +$2 x73 +o8g o9r +$5*87sCz +$8 T5 +-0 ] +*10 sMd +*76 *36 +o6 o7b +T0 T3 T2 T5 +[*65 +^M ^A +i2K +,0-7$o +i33 i7e +o0r*A6i0c +rZ1 +*69 ] +-5 i7o +$1$8$4 +-3 x21 o68 +i1o i2n +c $8 $3 $9 +sfv +$8$7$7 ++B x62 +i1a i5f +i1e i38 +y5 x63 +o0$sL0 +$P ^N o72 +y5 *BA ++8 o7b +-4 -A -6 +$3$8$8 +slZ l +$r i8j +'8$J +$f o6S +i4F +$0 *AB +i11 i36 +o4e $1 +c $6 $9 $7 +$2$6$6 ++5 -2 -4 +E$% +$1$4$2 +o0d r +xB4 D9 ++7 c +i2n i3t ++6+B +i1e i76 +x38s>. +$$$* +q}*25 +x74x1Ai7| +iA1D8$= +$2 Z1 +x4AY1] +i42 i59 +T4 o0s +p1 l x79 +s${d +^o z1 +i16 i14 +i3r i4e ++0 Z1 +i1b i11 +,5*15 +'9 D2 +$1$6$1 +l xA3 +,A^6 +i76 R5 L5 +T0 T5 T3 T2 +lo6+ +Z1 *34 +'7 -5 +o1vxA7 +i17 i37 +i71 i12 +i13 i29 +*51'5y2 +} '9 +i5a i52 +sr4R9 +*21 +4 +$)'Bl +*85 ] +$7 $0 $8 $0 +i4u i5s +s0E +*04 { +sWC$9 +]s+X +sos x06 +$1 $7 $0 $3 +i50 i3a +i0a i1s i2s +i7X t +i14 i33 +^K +6 +c $1 $7 $7 $3 +Y3 D2 +c $7 $8 $4 +sGs +y3*1B +i7d i5f +-6 i62 ++8 D5 +T4+7 +*69ssX +y3 i9@ +i57 i7a +xA4 x51 x3A +o5 Z1 +'3x56seb +u *31 +y1i2H.2 +i8'x8AR1 +-3o1gi17 +o0u i3- +c $9 $5 $8 +T6s3(iB& +i57 R7 L7 +c $9 $5 $2 +c $9 $5 $3 +o3e*A4 +*01 ^H +i6s i7t +^a ^e ^t ++3 ^b ++6 r +i3m *14 +$dsI9 +i3Z +ssa x93 +{ $B +'A i81 +$0 *67 +^h D6 +^5 z2 +x42 z1 i0A +R3 u +shPsMy ++6-1 +$d -5 +-0 i18 +o31 [ k +$n x53 +x81 p1 x6A +sym +K o3- +l ] $Z +i53 i63 i73 +$4$7$7 +sa@ u +o3' ] +i82 i90 iA0 iB6 +LBi4O +^b 'A +i83 -7 +x03 $R +*60x21'B +o6mD3 +o0d $z +c*25iAF +x04 ^x y1 +o2c E +$/*48k ++0 +1 +6 +-1 *24 +i2w T0 +l ] $z +syx +D2 ,6 +D1 $u ++6 -2 -0 +i31i49i57i64 +sgusbN ++2 +5 +4 +so0 ss$ +y4z1 +i4n x91 +i6j i6E +i7i i8s +} q '8 +Eo6r +sWbZ1 ++5 -4 -2 +^x '8 +$l $i $n $g +i1e i75 +$zY4 +x05 D8 +o08s._ +D3 y1 +Z1 D5 +$_ x25 +i5f i5b +i62i70i82i91 ++B x83 +c ^0 +$7 x31 +L8 p2 +i31 i3f +sNC +x58 ^4 +x5Bz1x71 +sSJsY7 +o1!R6i5u +i5. x03 +x21 o7I l +f x56 +} *05 *8B +i73 i83 i93 ++7o7; +*A8z1sI4 +sz\iB&.7 +sky x31 +i68 i75 i82 +i7m +8 +.0 ^O +o3p *63 ++6 -0 -2 +dx5Bx97 +Y3 x61 ++7 *47 +i52 i60 i71 i89 +i8/ +$J l +i72 R5 L5 +*09 x03 +-8 *76 +$8$9$9 +x46+3 +i5e R6 L6 +*46 *25 +]s{' +sGV +sem o0g +x91^. +$! x71 +i8= +^{ +lo0j +i22 i30 i40 i50 +*87 o7z +D2 $S +-D+E +x02 t +x02*78 +x64 Y2 +Z4x1A +'B$9 +sMz$3x64 +i94 x71 +o8HT4 +^G*43sd` +i31 i49 i58 i63 +se3 T5 +c ^3 ^< +i62 i70 i83 i90 +d o7l +x25 ^i +o5k *42 +$* $8 +^h ^s ^i ^f +[ ,4 +i47 i59 +L9s>)o3k +x61 *21 +.7 R8 +i35 i46 +i42 i50 i60 i76 +DAi5Mx06 +x51 *54 ++5 -7 -4 +{x67 +i4t i5a +'6 ^j +o1C c +s3d +x5AD1.A +$ao9}x72 +c 'D $0 +^5 z4 +i0a i1p +o2m $2 +syYEspd +s5|Z5 +^b $A ++2 .1 +x06D8x34 +*6B*16 +o79 *56 +$i +9 +x24 Y3 +i42 i50 i60 i75 ++B -4 +^P q x04 +o3d Z1 +i8s*B6 +i4e i5e i61 +sPM +i6m i7o +'9 *42 +u d 'C $0 +$1$9$3 +x68E +o8a +5 +x82-5 +x92 x21 +K i87 +c $8 ^7 +^X ] z2 +i0b i1a i2n +Z3sK;x41 +Y2 $1 +*64 t +] o5S +^E*23 +*52 x61 +i3c i73 +i1e R2 L2 +s2u +i3I +x53 D7 +s26 ^L +sJH +i3m l +x73[ +T7sp/ +^X z2 ] +i51 i60 i72 +,9 $6 +i8z x52 +seE +i8zT8 +i50 i5b +^K *17 +c ^1 $4 +*18x69 +i21 i39 i49 i53 +i0r i1a i2m +x93^# +'5^! +*42sg1 +*25 *10 *24 +xA5*62 +s$5k +i3n i4o +^J x91 D7 +^1 ^- +y4 y4 +D0 *03 +D6 x41 +Z1 x52 +'9 -4 +] -8 p5 +-1-A +*57y1.0 +$b Z2 +T4 R4 +o9L +i6Ex52x13 +s38 ^M +p1 x78 +y4 x64 +c $4 ^1 +*52.4 +*9B*9BZ3 +*37 x13 +sVK +$4 $f +*B8 x14 +*B5s4l +D7x69^j +i17 i36 +i34 i7e +'A x03 +] o55 +i17 i39 +i7a i38 +st- +c $0 $7 $4 +TA T0 +^cRA +f x8B +s0Ei03iA4 ++1 u +i3a i78 +$m *43 +i3t ^r +i4h +7 +x12 *51 ++3 -4 +8 +] R9 ++2 -8 -5 +c $8 $4 $7 +o8s*90 +sqEY2[ +-0 -4 -2 +o6f { [ +*52 } +s9Fx97D3 +Z1R1D9 +c T4 i4_ +*03 ] +*14 .3 E ++1 +4 -0 +TBo6i +$n i0R +^l i1c +sLno3a ++2 -1 -4 +{ $6 $_ +^t ^o ^o ^f +,0o9F$t +$2 t x62 +uo5r +i6e i7l i81 +z2xB1xB5 +*43x86k +E*68$e +*0Bx3A{ +K { E +^s^3 +*64 -3 +d o4y +$9 $6 $9 $7 +i5a i3f +o7fL8 +x02 -7 +*35sUEt +^R K +Ki1a +dx29 +-0 -2 -4 +*97*03Z3 +$7$6$9 +*97z4*3B +t xA2 +i4y i5o i6u +u x75 +E ^5 +$r $o $c $k $s +xB2{x14 +i5p k +i34 i50 +i74 R7 R7 +-7DA +*51 d { +D5 o2_ +i34 i5a +o83 -4 +i15 i33 +$0 i74 p5 +x12 o20 +'6 $l +sNYxB3 +s04 sPB +$* $9 +i15 i30 +l *79 +D2 D6 +sl; +p4 x23 +D8 D7 +LAo6l$[ +shl +*51 { d +uD2 +^b x23 +$3 ^@ +}$A +s3K*B3 +{ o0m +Z1 x23 +l*13 +$= ^1 +D1 D7 +i3d i70 +p2 x46 +i33 i70 +i61i79i88i99 +Y5z2*93 +{ o46 +oAb p4 +^wxAB +sIpstw +$9 $3 $! $! +c $3 $3 $! $! +s[js=8sgs +o7c x34 +$9 $4 $! $! +c $2 $2 $$ $$ +$1 $4 $! $! +i1d i5d +Z4 Y2 +$0 $9 $* $* +iARs&( +] x01 K ++6 -2 -2 +$0 $1 $@ $@ +c $8 $6 $! +{ +9 +i1& +c i07 i14 +c i07 i16 +i52i60i70i82 +'5 $6 +i3c i1c +c $1 $6 $! +c $8 $4 $! +x43] +Ko9,l +*25 *24 *10 +c 'C $6 +$2 x62 t +sFS}s0G +$1 $9 $* $* +l x14 +}}}} +$koBz +z3{.A +$d $w +p2 x6A +Es8s*28 ++4 $5 +c i04 i18 ++4 *30 +$0 $8 $! $! +c ^D +x09 ^m $1 +svU *53 +s(\]^n ++1 -4 -0 +sT+ +D8*70 +i9.t +*84 -4 +^t ^a ^f ++4 +7 +4 +i16 i38 +$8 $5 $! +$7 $x +$)$@ +x84 i8c ++C -A -A +*07s&i +$9 $9 $* $* +*47i3_ +*40i6$y1 +Z1 y4 +i1a i75 +$6 $9 $! $! ++0 -2 +4 +ss_ +.4 *56 +[ i6f +^* ^* +$1 $0 $@ $@ +$9 $x +^oswo +i4cy4 +Y3x96 +x82x13'7 +$w $r $y +^k x2B ++6 o0l } +x52s+e +x65x5B +sIEs,%i26 +-8*5Bu +,3s/+ +i2$ +z1 '7 ^M +sbN +c $9 $4 $2 +'7 +0 +4 +sfK +$x x76 +x72 *36 +lr*3B +sfgY3'8 +] D2 +$[ $] +c i08 i15 +c $a +c $3 $3 $# $# +^r i4y +o59 [ +d x37 x92 +i32 i40 +$3 $3 $! $! +i7A *30 +*16 o5s +c $9 $7 $! $! +$9 $7 $! $! +T1x27d +*BA oA1 +i13 i38 +z2cx2A +^K *46 +iAn +soZD0p4 +$k $i $b $a +*82x41 +*14 ^w +x09 $1 ^m +o4h +7 +^G x71 +T4'9 +^G -7 +D8 -5 +T3z1s7c +l ^d ^a ^b +s6Y*34 +^j x85 +-1 z1 +i6 T0 +*5B x91 x75 +^dsMWc +L4y2 +k x27 +x05 y3 +i4l '8 +l [ ^n +-5 x05 +s\iT7 +c ^_ $_ +x58 q +ux03 +x23 i3x +*58[ +i48 i59 +Z4r +^2 z3 +sa4 u +o3 x21 +*14,5*A3 +$h $g +'7 +4 +0 +s01 o17 +-1 -4 -7 +o0l x35 +$?st,x94 +s2I +o2B l *53 +i32 i40 i50 i66 +$1 say +y3 o2e +c $6 $2 $6 $0 +^gx31s.N +c ^7 $8 +i3e i51 +.4 ] +$3 T2 +c $t +d '6 $8 +^XD6 +iB* Y1 xB5 +t -4 +D2 '6 +] x41 +0 +i48 i55 +x37DA^q ++0 $d +o4N t +T7 +3 +r o6K +l '6 +T7 +1 +o1. .0 +sv, +o3y [ *62 +$x +5 +K [ $z +c $9 $x +x43 $! +x43 $5 +$k x13 +*39x95$k +*A6^M +'9 i7w +s92 -5 +svz +E*85Z4 +*02t +x72ksJX +*10 c *93 +i45 i52 +*36x04 +i79 R5 L5 +i1r i2i i3s +i9g K +s ji82 +D5 } D2 +x52 $8 +d $8 +s!S +'7 $? +} ] $g +D1 o7o +x05 $4 +y1 x16 +$+s/$ +x08*3BsKd +s*\o1I +smk +,5*52 +o2ksE" +i6c *35 +x37 i4s +i7b i71 +x61 o68 +l '7 +$A $8 +K $1 +$h*67R0 +R4 o59 +x52 +6 i7e +i10 i70 +c $0 $7 $6 +$1 x56 +ssp +7 +$m t +^i ^n ^m ^o +c $9 $6 $8 +$z Z2 +i8B +x34 o2e +x71K +y4 xA1 +D4 *62 +C,Bi8R +i7e i8t +i1c { +x59*89Y5 +l ] $Q +i3U x53 E +o5a Z1 +*41 +5 +o1v +7 +r -0 c +-3 ^u +l ] $G +^a ^e ^s +D2 z2 ++A D4 +l ] $I +o4FsU@+4 +sC#r +z2 x04 srt +sbM l *02 +Z2 -A +D2 *12 +.2p2x76 +i3U E x53 +T6,9y5 +lk +$$ ,9 +^m *06 ++9 xA4 +i9y.A +-1 -7 -4 +lx9Ax61 +k saj +o5w *75 +s*2As=N +$7$8$8 +o2riB' +i7a i8l +r o6y +[ $1 +i1c i5a +swnsWj +o2s x81 +swc ] +i37 i48 i59 +sxgszT +$4 k +-0 -5 -4 +'9 r +i8!o0O.1 +o0D Y4 +i43 i54 +*39 x14 +i0s i1t i2e +$! -5 +T0 *9A +o6m x03 +c i6u +i80 $4 +c i6b +^a x16 +swms*E +^a^a ++9 Z1 +l $l $i $n $e +'5 Z3 +o7o D8 +sat +i3t i4i +t $E +^1^a +D6 $g +[^2 +x72 *53 +iBc +$x D2 +*14 E .3 ++1 -0 +4 +i0p i1r +i4y i5a +z1+9 +y4 Y1 xA4 +'8*81{ +i2; +D3 *56 +to70 +Y1 x87 +*76 s17 ++2 -7 -0 +*64D0 +l ^h ^g ^i ^h +u $2 $0 $0 $6 +*07{ +sCno8& +syl +*15 *10 +o4l o3r +^v z1 D2 +i1m '8 +x26c +E i2b +i52 i60 i71 i85 +y2 +7 +,1 T6 +}p2sW, +x32 *35 +sTky2*57 +s9{o1C +x2B Z5 +i3a i4t +sDfx86 +*15 $n +$1 i0j +*54 o3h +*10 o4z +i2d i3e ++3 *54 +$- $9 +^, { +s2Mx38 ++1 -0 -4 +-3 ^C *54 +i5a i51 +.6 o0Z +sH2$,*04 +*45 ^M +D8R4 +i51 i68 +*9A+7*65 +Y3 x14 +$wsEP +i35 i54 +sfb +*17s9A +i60 i70 +q x18 +i41 i59 i67 i79 +D5 y5 +t o8T +c $_ ^_ +i2n i3o +y3x27 +x52 $9 +x02 $B +D5 k +o3P -6 T3 +]o5S,7 +*B9x73 +i82 i90 iA2 iB2 +o2B *53 l +x42 x71 +ux91 +Y3x37x56 +{ ^w +$1$4$1 +sRP +c $@ $6 +^v l +'4*A3+5 +.2uscg +-B ,7 +l x61 +o3` +3 +i1a i77 +sTMs]V +i52 i60 i72 i84 +*58LA +*34$8 +*14 [ +] *13 +s!, +D0 x14 +x52 o41 ++2 -0 -7 +o8ZiA5 +iB1 x62 +s1f +c *53 +i5a i57 ++1 sBr +o2xZ1 +s>6i7#sT9 +{ ^A ++2 *03 +i70 i5d +i41 i59 i67 i74 +s=&'7 +x83 $7 +s|UslW +^_ ^_ +,5 $2 +D0 ^G +i31 i49 i58 i65 +i17 i57 +^H o56 +suh +sgu +s2^ +x81 +5 +s05o8e-8 +i17 i38 +i7b i7c +o7Ws|s +o0v r +sEG +$6 x41 +y2 z4 x17 +*02 +9 +Z5 x69 o7b +x52 D7 +s8q +sDJ ] +i0g *16 +l o1@ +y3 xA2 +x96 Y2 +saD*5A +i3ux02 +$o K +x21 ^q -3 +{ $i k +i1a i2y +o8m *67 +*6B-1.2 +k .0 o8F +i55 i7a +L1Y5 +-5 *16 +s{z$g +.0 C +*15 *41 *43 +$1$5$5 +*45 x52 } +x82 -3 +*57 *25 +$9 Z1 se9 +x49^J +] x56 +x71 $g +*87 o8A +lo1c +z2 Z2 +$/ $/ +z5 x2A x27 +$x $s +E .1 +p2 $1 ++3 -4 -1 +i0m i2m i1o +x72 $! +x47sBu'9 +i50 i60 i78 ++4i8t +o4a R4 +^% $% +x83x75Z2 +sb|x76x3A +*46dx52 +o3j *21 +i52 i60 i72 i83 +*72 x62 +$)o98 +so}*75 +i3B c +o3f $o +Ko6r +} *15 x12 +$1$1$2 +'8 ,6 +o4A *12 +x59D4 +o93 D8 +x13 D6 +i1r i2i +o9E +sbv +k x34 +$0$2$8 +i32 i12 +o2- ^k ++A -C +B +c $9 $6 $0 +o84 +6 +x17 z5 x29 +i0n ^k +x46Z5 +i36 +2 +^2 ^@ +i1d i3d +^Pp2 ++6sAWp2 +-8 -C +i0k i1l +'8 *70 +i3e i78 +$2$4$0 +Z3x07sL] +i5#sJu +i78 i1e ++5 s27 +*B0i4isn" +i7a i37 +x62 i61 +] ,1 +^4^6^9^1 +$7$0$2 +i0z i1i +o44 ,5 +sdt ^v +i74 i58 +L9^s,3 +o91 D6 +l ^t ^e ^j +*89 E +x13 z1 +-6 Y1 +i7SsFts27 +d x3B +xA7*26 +i1o i2a +$*$( +x08 x61 +D5 *21 +^4,Bsu# +l *35 +se3 T6 +D4 ] o6m +i1a R8 L8 +i02 i10 i22 i39 +D8 Z1 +i20 -0 +'7Z4 +*70 x72 +x92o7J +-2 $K +.5^F +-C -C -D +$Ko7@ ++0 +4 +0 +x61 *78 +sfC +i4s i52 +i0s i1o i2n +i4 E +y1 f +s Zs@_ +D6Y1 +*53x34*17 +i5b i3b ++7 x32 D2 +o83 +4 +se3 T2 +i18 i37 +$I $p +i2? +x31 r +[ $K +x13 o3v +y5,3 +*A9C +x71 D3 $2 +i0k i1r +*68o0C +o1t l +*47iA{o7A +i9r iAu +{ k $i +i5e i32 ++3 -B +Y2xB9-5 +i31i49i57i66 +i33 i54 +i0b i1l i2u +*61 ,6 +D2*89L0 +x85 c +y5 x19 +i7w l +x62 o4j +i1e i51 ++6[ +T8C ++A +C +A +i0h i1o i2l +K o82 +Y5x53 +*57s&ry4 +$`sWE +sy|xB1 +$2 *30 +slt *50 +^n ^e +*2Ai9o +o0O .1 +sam D4 x51 +RA^A +x53 o6a +i3f i31 +Y2k +i1e i2r +$8 T4 +x54 $q ++0 +4 +6 +s9C +-0 *64 +x94s|B +i66 i79 +RBy5 +i1a i30 +Ex73y5 +y5 iBA x79 +x82 $c +i8] +{Z4 +i15 i31 +l ^r ^i ^a ^h +-1+A +c i11 i32 +x54 x02 ++2 +2 -7 +i4a i5t +i1i i2l i3l +} x83 ^- +*1A x03 +*02'3p3 +$0 $@ +c ^0 ^8 ^9 ^1 +t i9e +o30 t +*70} +y1iAGC +x31 *26 +ssr +q *51 x5A +*46 x63 +*82+Ao0! +i39 i49 i59 +*43o1p +t *9A +c $a $l +c $8 $7 $5 +-3 [ +*A4 '9 +ssA +Y2 x34 +o16s'yx65 +^u 'A +i36 i78 +u x12 +i41 i59 i66 i79 +*31c +-4 ^D +Z2 $3 +^8 L0 +sLA +c $! $5 +$1$3$1 +d x18 +$" [ +i79 i5c +^0^2^0^2 +{ $x +D6 sng +k o29 +x15 i0A +o6m $. +s3M*90 +sOL +i7a i32 +sly +$x $5 +T0 x34 +c $- $6 +s[`E,9 +$7$7$0 +{ *65 +[ -0 T0 +x61 $C +*15*70o0U +s$'stw.B +x56*93x93 +*85x13 +l ^h ^s ^i ^f ++3 -2 +4 +^nt*9A +-4 x5B +x03 sld +i0m i1e i2r +o0d +A +i15 i17 +$. $n $g +^F -5 l +x5AsV] +'8 *02 +x12 K +c ^# $# +$h D3 +z1R0 +c ^a ^5 +c $1 $2 $3 $& +t D1 -3 +i7. [ +} o1a +$. $. +T8^W +i0s i1n +i92 iA5 ++5 -0 -8 +sTA +*76 -7 +i2n i3g +fD7x78 ++4 $R +svn*86 +*65 *34 +sVf$e +s(ps/tE +o0g .1 +$h $e $a $d ++0 +6 +4 ++0 +4 -3 +D0 +6 +Z1 *A8 +*29 x03 +i2c i3a i4s +D2 x03 +-4 -4 -A +$!$% +-A o93 +sA_ +xB1s\4 +r o0Q +sdcxB1 +x18 x04 +o7k x61 r +s2@x67{ +s42 Z1 +i73 i3d +^h 'A +stH +*46 T0 +o2mx43 +i53 i3a +Z1 s90 +i1m i2a +s.6 +x42 q +.5 t +CsWE*27 +Y2 $r +*63 *53 +s.vse& +i1a i51 +o85$> +u ] T3 +o0M '9 +{ i7F +Z5*8A +i2v i3i +x03 *32 ++9 o0l +sOG +Y1L6 +i5b i7c +Z1 o0k +-3 x72 +'A +3 +-B+0,4 ++7 D2 +$2 *68 +seLx3B$y +x09o51 +{ ^j +$1$9$8 +[ Z2 +[ T0 -0 +-1 ^f ++3 +4 -2 +'8*13 +o39 *02 +*72 x71 K +i0s i1h i2e +] l +4 +i67 i77 i87 +K i9A +*53 [ ] +*19s!b ++0 +3 +4 +sGD +i3b i34 +K o5y +i7s i82 +xA4i5As"a +$t o6w +iB8i0ox1B +o84 Z1 +o65 ] +Z3 x76 ++A 'B +i5a i56 +*39 x04 +c i5r +x13 $2 +o3p ^w +$1$6$6 +sgAo58 +i8v +^1 D4 +Z2 +5 +^i -3 +^F l -5 +i9*x58-9 +K{ +x81 z1 +D2 $l +{ ^M +i38 i7e +i7a i35 +*98 .9 +iAL +$E'B +i22 i32 +iB6 iC6 iD6 +i01 'B +s3r +i61 i76 +i84 +7 +o82s"E +*53 ] [ +c $~ $1 +l $s $e $x $y +sdr +i3e i54 +y5o3t.8 +$9 se9 Z1 +i12 i7a +$@ $! +o6O -5 +i72 i80 +] *56 Y1 ++4 -5 +9 +iATcx3A +i4d i5a ++8 } +D1 x91 +*04 ,3 +$q Z2 +*25 *03 +iAD +i7w x01 +i44 i54 +srw +{ +3 +x35 l ++6 z1 { +srv +*40 x45 +E d +xB7 x17 +DAs/wsE5 +i21i39i49i50 +,4 r E +*65 *73 +i3t i4e i5r +shs +i5 +6 +x32 p2 +*62 *54 +x61 o7w +Z4x43Y3 +xA7o8/ +i2i i3n +i7d i72 +iAO +i6e i7e +-6 d x48 +o1p z1 +] i7j +T3 TA +c ^d ^a +i3w c +] T4 +$ $@ +i47 i57 i67 +^8sZN +x21x01$7 ++1-C +x43 ^i +*04 i4t +o6K c +-1 o7m +o69 *24 +*A7i07x0B +o9j +8 +$ p1 ++7 k ++6 o7y +i4l *74 +s'.*16 ++4 -0 -2 +*43 *35 K +c ^4 ^7 ^9 ^1 +rsK,x58 +x71 $2 D3 +*04{*85 +z4E +*03+3 +} *30 D0 +Y3 u +*A4s4Q +i32 i79 +i21 i39 i49 i52 +K $c +y2 '7 +k o3h +c o8o +o8zsoA +o7U c +k o8F .0 +i31 i3c +$d ^V ++3 -1 -4 +i21i39i48i57 +i1e i5f +o5st +o6^ +'B o8f +*09 ] +suoo39 +$R *45 +sVx'A^C +.A*78t +xB9x62+8 +c $9 $4 $8 +*74sD6 +i11 i37 ++1 +2 -9 +-1 -7 -8 +$2 x85 +s9y +z5 x27 x2A +q x95 +oAh*47$e +o5t o3u +z2 ] +-6x89x01 +i0p i1u +s3Is,Rl +$2 Z3 +o13 Z1 +i1\ +sbd +*14 $h +*50 *31 +sIA +{ *17 +-7 'A +i5_ *67 +x82 'B +x09s'Pi3p +i6d i7a i81 +i3d i5b +i58 i66 +x24*72 ++0 +0 +4 +-6 x51 -0 +-6 Z2 +$B Z1 +srx x32 +l ^e ^r +o0p ] +sy%spv +-6 Z1 +i31i49i57i61 +o46 o20 +i6h 'A +i8`*0B$M +*20 sri +TBx27$6 +c $0 $3 $! +i9d iAe +Y3 .5 +i70 i30 +xB8o3) +^hsguxAB +i6g D4 +CY3 +K E +x82 Y1 ++5 '8 +i75 i7c ++A +B -C +i7W +l $m $i $k $e +o8+.A +D4 *30 +i79 i3c +^4xA2 +^= $= +x45,5 +iB`ss x18 +T5i9_ +Y2sptx87 +*97^A +spJ ++0 '6 +s-WshnD1 +$0 o67 +-3 { +$d x75 +o5w c +$. x05 +sQ-Z4 +D4 o6m ] +i72i80i90iA3 +c $0 $6 $8 +o5m k +D4sO< +i39 i70 +-7 i8. +*0Bx64y1 +-B -E +c i04 i19 +^o ^o ^z +l o0i ++A +A +C +c i04 i11 +x61 +4 +c $6 $2 $9 +-2 u +] c D6 +^M *71 ++8 -1 -9 +] +4 l +s(}y3 +i77 i1a +*36 -0 +5 +*20*75 +sct +Z1 o6p +$0 Z4 +c $0 $6 $3 +i39 i78 +T2 D7 +,0}y1 +x71 D5 +o5x *52 ++0 -F +c $1 $9 $! ++2 -7 +2 +i9a iA1 +].1 +c $3 $2 $! +z4 x53 +sa@ T1 +^d o4r +i31 i49 i58 i67 +*B4 +*31 k t +-7-B +cx68 +x12 +1 Z1 +i31 i5a +*60s,zx62 +p3 *48 +D0 D5 +Z1 *63 +c i03 i16 +*30x23 +o0r o1e +x2A$*Z2 +i6y -2 +uo9 x41 +-2 i6u +x54 i0t +^W -3 +,5 $K +o2+*05 +^r ^i ^a ^h +*62 x23 +R3x74iB7 +x46Y4 +*92 x74 +i3d i73 +o9/*A4 +E$lp1 +o5l +3 +Z3t +*65*67xA6 +D4 *26 +shuRA +i0s i1h i2a +x93 $c +d 'C $7 +,5k*10 +i0a i1i +] y3 +$_ ^_ +*17iA9 +Kq +-6 -0 x51 +oAS +x71 o8k ++0 -3 +4 ++4 +9 -5 +i39 i15 +z5x45*03 +x23*A7*30 +xA1^1x97 +x71 t +sl]EZ5 +*31 t k +qr +x74+3 +^d T1 ++8$S +D4 o7o +i1e i2n +i5e i6l +d x9A +*B0 x02 +i43 i52 ++1 -9 +2 +*36 +5 -0 +i0v i1a i2l +$k i7R +x12 ^4 +^- ] +i34 i54 +x85x41 +c i1e +} c ^3 +$2$6$1 +$b x61 +s8y +i7e i71 +sak +*05 i1y +*06 o2y +c $9 $$ ++4 -2 -0 +i5a i0K +^n ^u ^g +Z2 o8_ +c $3 $$ +sfc D0 +c ^b ^2 +c $8 $6 $9 +i5f i3a +x38x52 +*25 *31 +i4y x64 +*70x63R8 +l [ ^Q +o9px09o6F +x28 k +i4" *8A x45 +^T x53 +i5A x32 ++2s)&Y2 +r o0b +{ *36 +r ^a +i34 i52 +i0e i1v +x3B x53 +x46 $1 +i1a i2t +o7n ] x31 +$> $< +^z $z +x52 *05 +t x36 +Y2 $4 +i5zo8+ +i6=x2B +,7 k +i86 i94 +*A6sis +i0p i1e ++3 x71 +*40 *54 +oB1x37x73 +y3 D5 +$. $4 +o84 t +x98o6?z5 +i3d R0 L0 +sgT +s/\cy1 +-C -D -C +o0` +i35 i78 +R8*57 +T0*89$s +] DA ++9 c +xB2sKO +i31i49i56i68 +Y2*75o7P +$! x63 +K o7K +o2d *54 +x23x85 +*12 snp +c i1c +x93} +k ^O +ss* +i5d i7b +si3 +c $0 $5 $3 +s;#^sl +*56 o2l +^2 ^K +*43 Z1 +t o1B +.3 r +^Y D2 +T0 $9 +i0t i1w +$^$_ +-A -D +D2 -4 +i82 i97 +-1 .5 +] D7 *54 +^G *43 +x23Z1*20 +x07 ^s +i3e R2 L2 +o3;$Xx0B +*03 x42 +Y2*83DA +]*89 +i46 i56 +i31i49i56i69 +d i6s +i0w i1h +] D6 c +z1l] +l $k ++5*43 +z1 $1 +x03z4 +z1 z1 +x6A+2 +u^@l +$x l +] $3 +D0 D7 +^l -3 +i0s D9 ++5 -8 -0 +*29$_o62 +,4 ,5 +sg{ +ly4sB5 +i67 i71 +u T3 ] +i17 i31 +Z5sb9 +^j+3 +i7 l +i8o i91 +$s *21 +^P $b +$6$1$1 +] *54 D7 +p3 i40 +i6n i7a +Eo94 +-0xB1 +i6n i7e +D6 Z1 [ +i9u x84 +T6 *01 +.Ai5" +.1 *51 +$s Z2 +^@ y1 +i4e i5s ++0 +4 +3 +D4 $0 +y4 x56 +*74.2*51 +i52 i60 i71 i87 +D3 D2 +i53 i64 i75 +Z1 o9y +f x1A +x67i9"s>} +o2d*08xB9 +o6S +3 +i1i i2n i3g +D6 [ Z1 +i3o i4s +*60oA0o65 +$j $u $n $1 +i6o i7r +.1 *63 +$5 Z3 +i7f i7c +-1x0By4 +i7b E +o6 x32 +so} +o1i i6o +}s0A +*09*75 +i3m i4a +] { r +i5n i6o ++7 o6F +i0d i1e i2n +-4 -A -4 ++3 $. +z1x4B +x12 Z1 +1 +sth D0 +f x48 +D7iA)i2x +-1 -8 -7 +-3 $I +slV +o56 $6 +*67 i3% x34 +c $# ^# +x62$A +$1 $x +Y1 D1 +K i5A +o7n x31 ] +x93L3 +$2 $6 $! +,4Y3s8b ++8 -9 -1 +Y1 { +[ o4m +o1AE +sHrx02D8 +$0 $3 $2 $8 +i30 i40 +sAOx72 ++6 *02 +se{ +sPZ +i7Is"7t +o2r +3 x53 +'9 T8 +z1 i1. D5 ++0x16 +^v x62 +{p1y4 +-1^TxA1 +i5b i73 +shn +sBN +i4d k +Kp5Z1 +x96sc"oAr +R5E +o05 z1 +$c L6 +c $7 $4 $3 +*57 $a +D8 +5 +x39 'A +i2o x45 +x23 Y1 +scF +*36 ,6 +i4H D3 c +x04 D8 +i3d i74 +$)$# +q x16 x52 +,3Z3D3 +x84]Z5 +c ^@ $@ +swt +[ o10 +*5A x73 ++3 +5 +6 +o4l o1k +D0 oB2 +siw +[ y2 { +*43}y4 +o4C t +i39 i73 +D6 i7x +D0^l +x34 i6- +.3*89l +$p $h $a $z $e +q r '8 +i6G +7 l +Z4*A2'9 +c Z1 x61 +i72i80i90iA6 +$1$0$6 +z2 *14 +i0v i1a i2n +^2 $2 +i31 i3b +[ sa@ +^w i1r +$D $A +i6g i7o ++4 $g [ +soc *13 ++0-C +$2 +4 +{,9*04 +$m +4 +*04 *02 +^1 *10 +*B8 *A9 +T0 $! +o73 o8N +{ { c { { +x05 Z2 Z4 +o4x c +*34 i5- +iAmxABxA5 +D2xA1 +^n x82 +i7a i52 +$a +3 +i6- *78 +^^*96 +K p5 *06 +x31 o4_ +sbe +srx +o76 ] +$. $d $e +i0j o0G *57 +p2skl +i62 $7 +x21 syu +i38 i79 +,6 r +sR($3u +i0t i1r +i8A*BA +o1= +i51 i62 i71 +x05Z4*46 +i5d i73 +sot +'8i9RL9 +$8 Z4 +^[ o6a s[d +K i3t +o1. x54 +s*\sl; +x9B*78 +*87 o76 +sG'*81xB3 +s7O +i4H c D3 +^. z1 +,8i6m +x37'6 +c ^6 ^7 ^9 ^1 +t o49 +i54 R7 L7 +x72*10 +i15 i59 +i38 i71 +Kx61 +x7B*61 +c -9 +o0] +*21 c x31 +$&$$ +o8qx32p1 +i39 i14 +i13 L1 +si[p3 +-0 ^T ++5 +7 +6 +8 +i3a R7 L7 +s}+^Oo0q +R1 +0 +*7Ax91 +i7c i5e +svy +x34 d +C $1 $2 $3 +L3 +2 +o9, +o3b xB2 +i19 i17 +T5 *06 +C $7 $7 $7 +l $a $l $l $y +i0g i1o i2l +sjf +*01 K +i1e i73 +o2t $e +^b x35 +s*mqx59 +snui0* +$g +6 K +-3 ^b +o0M $n +x63Co8. +i85 i91 +D0 y5 +u $X ^X ^x $x ++1 ^j ] +T7 -0 +d o5w +o97sm`c +*42 i5n +Y5i8rx58 +c $9 ^2 +i37 i75 +^a $v +x43 *05 +D5 +1 +f x08 c +*59 $Z x8A +i2z c +$osGd +i41 i59 i68 i71 +^k '7 +*58 $i +D6 Z1 +-6 *24 D0 +i1o i2w +o3Vx07x74 +o8u*8A +-2s\Yx5A +i0a i1w ++5 *60 +sny +x05 Z4 Z2 +$e smp +$0 x81 +i21i39i48i50 +*24 *13 +*13R7$$ +*53 o96 +x93*08 +*5A$8 +^6iAyi4r +^4x75 +*73 [ +i1a i13 +^B*39sy- +o8Z^cs>! +$0$2$4 +kD6 ++1 Z1 D3 +i91 'A +x82 i6a +x32 { +*9B x62 +Y5Z3 +i54 i3a +^m Y1 +*A4 x05 +$7$1$3 +x72 q +E*34 +*3By3 +^/ $/ +*71 x13 +xA9i0.xA2 +*45 .6 +*10 y1 +s6K +'6 Y3 +p2 ^d } +,4 [ +^Y*B0 ++1 $A *50 +i21 i39 i49 i58 +slh +5 +i35 i71 +i36 i55 +d x0B +o4dl*76 +l T9 +i69 o77 +i15 i16 +o2r x53 +3 ++1 *50 $A +l $0 $0 $1 +c $0 $6 $4 +i5d i78 +oAW*80 +^P ^J ++0 -6 -5 +$! $? +'A o3k ++5 +8 +7 +6 +s./y4 +i1d i11 +c T2 $1 +x4Ai9= +$2$0$2$9 +o9= +z1 i1f +$_ $_ +i69 i76 i83 ++1s2#x14 +sZ}x02TA +i51 i69 i79 i89 +] +7 +*45 *62 +^S *25 +$5$2$2 +i6I E +o3o i0h +^j i0h +i9{i3U +$8$1$1 +} *31 +C x02 +s2M x61 +i5d i75 +x8AsAFxA6 +srJ +se5 +D3 $g +d $e x09 +i5$ +$5$0$1 ++7 -2 -0 +o0b ^t ++5 -6 +8 +i3hY1 +*A2x39sEP +$e*89o7] +*72 x23 +i76 i3e +i0w i1i +'9 +2 +i1b i3c +c $1 ^$ +s1! p3 +Z1 -6 *85 +-5 *05 +$5$9$9 +i0a i1n i2t +x53Z5 +c $6 ^1 +$y x04 +i9, +ss5 so0 sa4 ++9 -6 -6 +C .4 ++A.3 +sbz +x72 $7 +i59 i69 +c d 'B +*37 x25 +i9c iAh +s.1s 4*0B +o7;s.q +c o25 +o3O-9x79 +skc [ +*03o2k +x32 *37 +D4 o5_ T0 +i30 i3c +$f x12 +$0$1$5 +siA +C '7 $5 +d x09 $e ++3 stg +u $X ^X $x ^x +-1 ^T +r x31 +*79 -8 +i0j *57 o0G +.1z4x68 +$n D2 +C $1 $1 $1 +x05 i3T +u x32 +i31 i79 +x41T1 +] l ] $e +-0 x24 l +sGP +o0k ^g +i31 i75 +*67 $x +i6p i7o +i7c i5d +z4x93D4 +u d 'E +$v D1 +^t ^e ^j +[ i5q +i7e i8d +,8 Z1 +C '8 ++4 -2 -6 +oA_ x05 +i54 l +c $. K +i31 i49 i58 i62 +l$ET3 +y5 o0C +o51 c +z1 o24 +o1U*A4 +x64 T0 +c ^1 $5 +sic +^P ^L +i82 i91 ++4 -6 -2 +x47y5 +i8Psd2 +*04 o2- +*43 Y4 x65 +$n x21 +sh? +i70 i7c ++0 -5 -6 +i5s i6a +i82 i93 +xA1 o1a +'BY1 +i31i49i58i64 +i51 i69 i76 i82 +$# $9 +c $5 ^1 +-1 ^8 +x42 $k +TBs,JsRP +'8 i4u +o6p c +i0msaZ +o0w $3 +^r *45 +$_EsJ{ ++5 +8 +6 +7 +$b $0 +o9i x53 +$D u +$2 -3 +i5a i53 ++3 } +u ^X ^x $X $x +-6 r +$&$= +s9Cs9W +.4xB8R4 +x63 i4s +o4) +x93*07 +i2n i3y +o7Px97 +i8i i9t +i2u i3r +$4$0$2 +r $a $n $a +$%$& +i78 i85 +D3 q +sGm+B-3 +i0a t +$t $b +*89*96*A7 +su6 +k } ++7y1 +sl7 +i74 i1e +l i67 +$H*54 +s!' +o8" +sfd +c $1 $2 $3 $, +y1 ^J +o4_ -7 +i38 i3d +i10 i71 +u ^X $X $x ^x +*9Ao6x +Y2 oA? +k,6 +i3a i7b +x83 D9 +u $1 $9 $9 $2 +o8i *57 +x42 { +*13 ^u +r $q Z1 +sU_C +-2 o1x +x74 $i +l x83 D9 +-2 +4 +'A ^e +,7 $e +[ Z5 +f x67 +i63 i73 i83 +*48 .4 +Z1 *85 -6 +*36 d +i1a i2i ++A-D +i5c i6h +i4? x24 +x53qsMJ +D3 '7 +i38 i1e +o9S t +*6A x94 +Z2 -6 +o3*i8j.A +i6a i7c i8e +$%$* +i0c i1h i2e +-1 ^b +*05sklx35 +x6Ax36*0A +$$$& +sMQ +t i3p +i01 i19 i27 i35 +s#xr +*13 K x31 +*05 l +oBA+9i59 +c *26 +^[ s[d o6a +$0$0$2 +$+ ^1 +c x61 Z1 +^j ] +$0$0$6 +i6m x76 +$2$0$2$8 ++6 i3_ +-9$r +Y1sQ?-3 +u ^X $X ^x $x +-8 $8 ++0 o83 +l ^o ^l ^l ^a +*05 Z1 x52 +u $0 $0 $1 +o5r '8 ++A +B +C +i7a i16 +*42*A5z1 +i02 i10 i21 i39 +i4r o5f +i1i i2t +i1i i2z +T3i78 +x65 *85 +$t *57 +x52 *43 +i2d i3i +i6f i7e +c $8 $6 $5 +D1 T7 +*75 o72 +i2l i3a +c $! $@ $# +^j o4c +*48 D6 +t x85 +i3f -4 +i6s i7o +o13 k +$o x05 +x42 o68 +x18i7TxA2 +*05 x52 Z1 +i5c '7 +c $1 T2 +D4 T0 o5_ +o75 *68 +$2 $0 $1 $0 $` +$?$. +i0s i1l +*76 'B +-4 -B +i59 ] +*20 '9 +i8M+7 +$3 $f +i15 i18 +i4c i5h i6i +$9$6$9 +$0 $- +u *15 +p1 *7A +i2s i3t i4a +o57 *13 +sts +i5c i7d +*73*87 +r T1 +*67 *37 +i55 i65 i75 +l $b $e $l $l +$$ Z1 ++8 o9s +i11i29i39i46 +i7oZ4Z1 ++5 +7 +8 +6 +^M*95 +i3a i51 +s5Nc$t +{ i5n y1 ++4 *86 ++6 +7 -4 +$2 x03 +i50 i61 i72 +t^c +c ^2 $9 +p1 x86 +i52 i3c +*80snc +] $a { +sYE +c i4u +o49 x21 +DB l +A +o6tT8l +^M K +syF *79 +o48 D0 +^RL5 +o7a *74 ++6 -2 +6 +i2r i3u +K ,4 +iA1 iB2 iC3 iD4 +c d '7 $7 +saz*92] +i2t scp +$/ ^1 ++2+B +$N r +i38 i46 +E[*41 +x41 *67 +i0n i1i i2n +oA0^* +^@ l +z1 i0k +o14*71 +x61 C +^k*81 +i81i99iA9iB4 +x54 *64 ++5 +6 +7 +8 +i6S x62 T1 +$k ^m +scZ +i2m i3i +$0 d +*21 x31 c +R2i3h +f x75 i7l +u $X $x ^X ^x +^i *31 +i7,y5s9F +*B1 x03 +sky i0n +s]%o3Js_1 +o63x26 +$r $e $n $z $e +^o -3 ++B -D -D +$8$2$3 +Z4 x75 +T8 x21 +i02 i10 i22 i37 +*75x05*B5 +$7$0$0 +Z2 x84 +i0y i1a +x03 $j +$ox46 +c $@ ^@ +s}'+0Y1 +^x *1B x29 +-5 $u +i0n i1a i2t +i41i59i69i71 +i1R *05 +^1 ^. +c so0 T4 +i1r i2e +'7.7L6 +i74 i33 +x31E^B +L5 -5 +x65x21 +i5b i79 +x81 sry +k o0e l +i6G l +7 +l $J +i74 i3d +i2i i3n i4g +i76 i84 +i6f l +Z1 ,4 +c d '7 +x42 *14 +sWG*09 +i1u i2s +x6B.4 +cx95 +'5 y4 +i52i60i72i81 +i76 i86 +} $* +*35 *03 +i56 i5a +i5a i11 +-0 -9 { +$. $m $a +k l o0e +i57 i67 i77 +t DA x72 +o4As73DB ++5 '7 +c o18 ++AT3Y3 +i72 i80 i92 iA2 +i39 i42 +$M D7 ++5 +6 +8 +7 +x51 o6. +c i79 ++A +4 +[ *46 +x01 *42 +t T2 ++8p5*B0 +Y2 x56 *56 +*13 x31 K +oAx0A +^l *51 +$4 $x +*A1x42 +$0 $8 $0 $7 ++9-7 +L7 [ +1 +i38 i19 +l o66 +i0l i1o i2r +x31 .2 +,3 D1 +o34 { +z3 i6N x47 +} *54 +iAzs;h +$s*78 +$h $z +r +6 +x62 Z2 +y3 '8 +Y5 *68 xA9 +T3i2zsn' +p2l +s q,8sjD +*63 .4 +o8- Z1 +i39 i46 +xA2 E +Z2 o9d +i0d i1e i2s +o10 D2 +x23 r +-6 i0F +} ^D +^g D9 ++7 *76 +-0 o4f +i9a iAl +o3sz2 +*68 .2 ++9 -6 -7 +-0 ^9 +^P o22 +sjqY3^r +$d Z1 +*3A T2 ,5 ++0 -9 -2 +x07L6 +D5 R6 o57 +*61 x21 *13 +u d 'C $1 +o28 E +i6t i7h +-5 x63 +-2 -6 -2 +x72siS +$=$( +l z2 +i0h i1a i2r +cx51 +x52 *67 +i15 i53 +p4 ^r +rst}^H +c*67 +f x18 +^v *54 +$z $a $r $i $f +l D0 +oB+shZiAF +$7$1$1 +r c K +i2a i3t +$s $7 +s7p,3T5 +i41 i59 i67 i71 +x25sM}p3 +s0@ +l suy +^2sz@s>< +x32 o4w +z2 +2 +o5* Z1 +*20 ^1 +z2 +0 +i8sxA1s>k +s Ksof +z1rsO2 +o6Cs`U +$A $A +] Y1 *56 +T7 x92 +*6B x84 +x15 c +*45 $6 +x09f ++F -E +F +sQgo1E +D3 C $1 +^s $d +i0p i1o +i63 i73 +$9$2$2 +x08k +c x68 +i1u i2c i3k +t*31sgl +x72o3! +s#_*7A +.3 *51 +i7a i51 +r x24 +skg ^s +[ x02 z2 +x89su[i8m +$. T1 +-3 o4. +{ '8 *14 +D0 x31 c +x8B siP i5e +xABp3 +x51}+B +o25 t +T7 TA T8 T9 +spWls&S ++3 +6 -8 +D9 $p +x67*A0o8> +i38 i77 +i62sJY +i5O x02 +sV-oAz +o51 C +i7a i81 +^s x21 +i62i70i82i90 +z1TBc +o4M s^u ++9 -7 -6 +i0< +i0h ^e +oB=x74 +x72 *52 +$2$4$1 ++9 -6 +9 +ss$ u ++7 *56 [ +i0@*82*3A +$2 ^r +$os,xs;L +$9$1$2 +$x i6d +i5f i7d +*84p2 +} ^8 +o2kxB6iAU +^d o4h +i3; +o6=*37 +i21i39i47i53 +*45 *01 +x21 i4v +x83 *57 +*35 ^g +*64r +x52 r +i6z o5s +i58 R7 L7 +smksln +s(HY3 +s81 x79 +o09 -1 +x62 x32 +T0 T6 T9 ++6 +8 +9 +Y1 *85 +Z2 x12 +x71 ] +iA4 +B +*86 o7j +Y4 x78 ++8 sjs +x7As2h +o7V +K ^D +x32 ,1 +soWE +i01 i19 i26 i31 +o8&Y5x1A +f x49 +*62 x72 +sgJ +c [ K +i5m i6o +i41 i59 i67 i77 +i5d i70 +s5TsRk +x13 ^A x52 +$qxA3oB, +'8,BxA7 +i6k i7i +Y3 t x23 +o6e o2n +$C *31 +^N } +y2cxB8 +i9V +i8T +l^a +l ] $l +r ^l +Y1 s1H +D1 T3 +x02 ^@ +$=$[ +l $d $a $y +x52 i59 +o53 t +oAk*70 +x41 *53 ++0 -6 -4 +$i +3 +$;$' +,5x64Y2 +D2 } +o0?*69 +i35 i53 +i6e i7m i8o +i5p ,7 +i7Q l +uC$p +sos$c +*1BdE +spc +i0d i1i i2n +$4 $u $s +$ +c i08 i13 +$y *52 +iA_ x46 +Kx3A[ +t +4 ^a +x27sEp +i7e i5f +{ oB! +x32 Z1 +-1 k ssi +x63 $K +c $2 $0 $0 $1 $! +-5 D4 o2b +i31i49i57i65 +$o x87 +i8r i9e +x75s3]C +L8o7W +i32 i58 +i1O C *03 +i21i39i49i51 +c i06 i12 ++C -B -A +i13 i7a +*75 t +x63sAFl +'B +5 ++1 -A +x04 i6_ +x31 *23 +$m Z2 +{-8Y1 +o5U } +D5 u +^T x34 +TBi5C +som +i0q i1w +i3a i53 +$UD6s*q +E[s{. +$1 $9 $4 $1 +x71sXOsV* +q x56 +[ i7l +^D ^4 +.6z4x54 +$l k +szZ*56 +*13 K +x46f +i3q x05 +x13 ^@ +[ *35 +{ *14 '8 +o5a *68 +D0 c x31 +T7 T8 TA T9 +o0?xBA +*65 i7w +oBe*45 +lRAx81 +c $2 $? +i1r i2c +-1 -4 -2 ++2 +4 +6 +*67 K +*42 $s +.A+4 +'C $0 +Z1Z2T8 +^C x24 ++0 +2 +9 +x26 Y3 r +x84K +i2k *01 +^4 i1e +-A *A9 +'8uD0 +L6 k ++0 o2k $1 +$5$5$1 +R0x43s@| +r i5_ +*41 ] *06 +^7 } +'6 ^2 +T4 T6 T8 +p1 x63 +s1!C +,4 i4k +p1 x59 x75 +o4d *53 +R1 o01 +r $S +-2 y1 +o0fsEa +i74 i3a +i72i80i92iA1 +*62*54si& +o1v [ +$0$1$2 +r x32 +iBP*62 +T0i3l +x82 -0 +y1'8'B +x0B '9 *42 +*56 $3 +^_ ^2 +T7 TA T9 T8 ++6-B +s6V ++8 +8 -5 +$0 $2 $1 $3 +iB1 iC2 iD3 iE4 +o53,3 +i1u i2n +q c +*30sK= +i5d i52 +i5_ K +*76 $o +o6f *42 +].6 +i72 i5c +sFBD2$+ +i54 D1 +y2 o00 ++1 +4 -2 +sQZ +i69 x32 +i61 i73 +i54 i34 +i79 i7b +x54 *6B +KswP*56 +c slt +*51 *54 ++5 $D +i5J*73x19 +p5x8A +i9=$fy5 +]L3T7 +kx01 +*02q +sI{smG,A +*93sX?saU +o7{ +R3,6u +-BsXA +cZ5oAT +o8^ +*52Y4 +E,8 +i2b*47t +sp$ +y2*15 +c,1x97 +*BAY4{ +*85smD +Y1z3 +s3koBa +x96uL6 +Y4^0x21 +stO +so!o8] +*89i4Y ++Ai4N +.9*02 +$,o5Q +*38i5@ +$lsF` +C{ +y3,4 +u*35*25 +snJ +D6sP. +i3F +i3) +o9#i7F +ci2cp1 +x97z4 +i6Cq +i0;x85o6r +o9V +o4_xA3 +o2$L2 +*B8Y3 ++4$Ysdv +*67C +*53ss#sIw +sf9l +'Ar +s9(z2 +o4)*5A +o2's/\ +*B0*62x42 +c d 'C +T0 T4 TA +'C $3 +'C $6 +$7 $f +u d 'C $8 +$6 $d +T3 T9 T4 +T0 TA T4 +c ^a ^9 +i3" +C '8 $0 +d '6 $0 +c d '8 $7 +T3 T4 T9 +Y1 soD +C d $1 +[ r x45 +^3^2^1 +sr9i1z +sbM+0 +x34Z5 +.8-7 +i6c*ABR9 +*81+7 +[ -7 +^bx57*02 +s-lx98x91 +i91 iA1 iB2 +*5AK +sx,,8 ++5*2B +i90 iA1 +i35 i42 +x7A*65 +o81*A3 +si;xB3 +i8d i92 +s2)-3i9' +*B8sbp +-2s'/ +*76+7 +*76+6 +.6*9B*0B +s4.*74 +s|\x95*07 +*B7*A8+A +i87 i92 +*B2^3 +sD;{ +o51 x13 +i3{i7V +iA, +*B5 +o4Q*0A +y5y1u +Z2i7\ +i0Y*B9.4 +-3i1/ +o7O$&{ +-1Z2i7M +^w *13 +Z4 x56 +i5L T6 +p1 xB2 +y1 { +x17 ^- +f c x93 +x54 *65 +sxt +*26 u +*61 *12 +i9K +i9! xA6 +o8Y +*02 ^d +f x73 +L3 x21 +Y5 o4y +o4! ^S x13 +i8* [ +x81 *12 +o1f u +k y3 +Z2 -9 +sc! p5 +r .3 +f x93 c +l i6J +x35 Y1 +.1 y2 +z1 *16 +] f +$a K k +x61 o86 +T1 x64 p5 +x61 -8 +$g *20 +x74 Z1 +*70 } +i1| +$a k K +x81 i9* +T1 '9 +,5 x03 +i8f ] +Y2 o0m +i5J ++3 l +-0 *57 +[ x64 +$c +5 +Y3 [ +*70 +1 +sd3 ^A +x43 y5 +p4 iAm +-2 D6 +s5j +$a ^2 +$k *73 +r *26 +o7s K +p5 $l +sok +sqa +z5 r +Z2 x74 +^A z1 +$x x14 +r o1g +D9 u +D7 r ^r +] y2 +Z1 x45 +z5 x57 +x76 [ +*37 t +z1 x84 +-2 L2 +D1 [ +3 +i5b } +K *15 +i0H +^F o64 +[ p1 +$B x13 +o0= +i7e L6 +i79 R8 L7 +i3f R0 L0 +i79 L7 R8 +i78 R0 L0 ++1 T8 +R4 Z3 +*16 ] +x06 -1 +K ,5 +*29 *83 x32 +D9 *79 +x94 x82 +si3 K +r $r +^s i0s ^E +r p1 +i44 x12 +*21 x31 +i2U u ] +-0 *12 +i2U ] u +*05 x23 +o5. -6 +c $1 $2 $3 $/ +c $1 $2 $3 $~ +^X ^1 $x +^X $x ^1 +c ^G +c ^P +r $a +r $i +$a $r $y +^r ^e ^t ^a ^w +c $n $e $s $s +c $d $a $y +^t ^h ^g ^i ^n +c $p $a $s $s +l ^i ^x ^a ^m +l [ ^s +l [ ^m +d $a +l ^n ^o ^n +^p ^m ^a ^c +$a $s $e +l ] $Y +c ^6 ^6 ^9 ^1 +l $. $f $r +$1$3$2 +$1$2$5 +$1$7$1 +$1$9$2 +^e^d +^b^f +^b^d +^X o1i +[ o1_ x51 +o4h *51 +sl1 u +*83 +3 +*36 o4z +x53 $R +f +6 x7A +^p ^f ++0 x25 D3 +o7l -3 -7 +^m D5 z1 +T0 se4 +x43 i76 +} *30 +xA1 +7 +'7 ^@ +s0_ +oB5 *AB +*02 o5_ +c i4_ +$1 smn +$! x06 +sln x43 +$k *54 +o52 Z1 +sio x23 +x24 $7 +*07 +0 +d [ +'8 *32 +-7 $! +i0T x52 +c $7 T3 +o4t ^b +r *02 +x52 +4 $7 +[ i7x +*52 ^p +$m x05 +*54 $n D6 +C D0 +o2i *31 +snm +sEU +^e '8 +i18 r +d o6c +i6d l x81 +i4B t +l ^h +p1 x35 D8 +Z1 ^P +t o86 +x92 *98 +Z1 sou ++A Z2 +i4j T4 t +i5 -6 +$r L8 +Z1 i5- +Z3 x75 T0 +xA1 $y +*54 x64 +k o10 +*01 soi +o5t shr +sug +i51 i62 +o1n { t +*08 x06 +R4 +4 +Z1 x12 +D5 suw ++9 o83 +{ o5c +*75 D1 +l i7v +xA3 -A +T4 x02 +*12 i1g +-5 sjy ++2 *62 +Z3 T0 x75 +^t $i +*27 x52 +*65 i4h +i0w x81 +[ ^C *31 +$f xB1 +^h +5 +Z1 *58 +^d *56 +i1h ^d +'9 o4j +-2 o04 +o7u $p +z2 x25 +s2@ +K r *46 +o1s z1 +T0 '9 +-6 o3l +^i *52 *02 +*52 +6 +*07 D2 +z3 -1 +$a i5r +-7 Z1 Z1 +Z2 o4- +*64 D0 +1 +o1t i4b +-4 z1 +o3a t +D4 *15 +k ] o0p +$t *13 +x64 -6 +i5z D7 +*86 D3 ++3 *23 +} *01 +^V '8 +c ^! +$8 *78 +i6d x81 l +{ ^1 +s1c +D3 +6 +x81 x12 +*20 syt +*56 ^l +^P z1 +Z1 o5- +7 +z3 -2 -1 +-7 *43 +*70 x64 +*57 $9 +i0h *15 +c oA4 +-9 $c +{ ^0 +swh +o08 z2 +*14 o5z +[ $L +r K *02 +z3 -1 -2 +} o3l +sld [ +Z1 o5- +o0- } +r *02 K +sck -5 +R4 R4 +*04 +6 +$x { +x04 $v +i1 l +o7l -7 -3 +-5 T2 +R5 s1z +$L o1n } +i1- i3- i5- i7- +K ^H +o2s u +oB9 Z1 +*46 ] +^b i2/ o2u ++1 $p ++1 $t +x52 $7 +4 +*24 ^d +Z1 +7 o5- +x43 +7 +src +k o0p ] +x23 ^( +sbd *50 +*25 *40 +x91 +6 +-5 $2 +sa@ sl1 +*68 o6y +[ sez +sjl +$/ Z2 +-8 o7f +D8 $f +*10 -8 +Z2 +6 +o4r ^o +*34 r +x32 ^1 +*29 x04 o0m ++4 Z1 +x03 { K +o5- x83 +o5r +1 +c o4w +i0z x04 -8 +si1 T2 +$D t +$p D3 +$p D2 +^a o3z +i0k ^g +-1 ^3 +^k x46 +o0M z1 +^a i3. +k o5g +-0 -2 ^B +d k x37 +'A o9q +x42 ^4 +sbm D7 +t o7x +} x21 +*30 x26 +o47 [ +suo l +-4 x82 +*84 o84 +o2b x53 +'B r +i3t *60 +sui *23 +o2r ^v ++1 D4 -6 +*60 *01 +o65 D1 +d x37 k +} R0 +D3 $b +D3 $4 +sax +x03 Z3 +^c '9 +^y z1 +i4g ] +*37 x12 +*43 i2f +c T3 $7 +$e ^H +c o9! ++B x02 +o6 c +Z1 i2a +*51 ^o +*68 x52 { +o61 } +l ^e ^N +^i Z1 +i1- i3- i5- +c o15 +o4g ] +*87 o81 +$7 z5 x08 +*54 D6 $n +z1 T5 +f x7A +6 +-0 i52 +*74 -3 +D5 $w +t i3e +D3 'B +o6n +3 +i8o l +'8 x51 +o0w $r +$r l +i63 Z1 +x03 x43 +-2 $7 ++3 *62 +[ x51 o1_ +s69 s71 +o6i +8 +o0z -9 +k { *48 +'6 o5l +s5! +i67 [ +o1n t { +c i3e +$D c +o5h c +*02 o7Y l +*71 x35 +D0 skv +[ { D1 +x23 p1 +*68 *20 +o4- +6 +x12 $m +i4j t T4 +Z1 x73 +t i62 +*74 x56 +o6f x24 +Z2 o7s +i8_ Z1 +t o1h +i44 T5 +$b *69 +o4Y D2 l +snL +r o7O +i8R c +o4Y l D2 +y2 +5 +*85 o8. +$v Z1 p4 +c $8 $7 $7 $1 +} C +$. x57 +i7> +,1 T8 +o3e $- +$m $e $t $a $l +$g $a $m $a +c i05 i14 +c $5 $5 $! $! +$9 $9 $@ $@ +$9 $4 $@ $@ +c $0 $0 $* $* +$1 $1 $$ $$ +c $7 $7 $@ $@ +c $1 $2 $* $* +$0 $1 $* $* +c i03 i17 +c $4 $4 $! $! +c $8 $3 $! +x29 ^6 +^Q s89 +Z2 o5L +p1 x93 +$6 $1 $9 $0 +s5Z +K $Z } +q x1A Y1 +Z3 x61 D9 +$W x31 *10 +i7k x39 Y1 +x73 Y2 +Y2 x26 +x03 *65 +*79 x42 +Z3 D9 x61 +o3M ,6 +y2 +0 +i7k Y1 x39 +q Y1 x1A +s2J +i21 x42 +^P s05 +$W *10 x31 +^A u +i32 i40 i51 i62 +,6 k +sRC +i02 i10 i22 i36 +*31 *10 +sTJ +'8 s17 +sFB +i32 i40 i50 i67 +$1 x09 +i41 i59 i66 i75 ++3 sEJ +o3N Y1 ++5 -6 -0 ++5 -6 -2 ++7 -6 +9 ++2 +2 +8 ++4 -0 -5 ++E +E -D ++0 +1 -4 ++5 -0 -6 ++5 +6 -3 ++E -D +E ++6 +8 -5 ++0 -7 -5 ++0 +5 +6 ++5 -3 +6 ++5 -2 -6 +-E -F -F ++5 +8 +6 ++2 -5 -0 ++0 +6 +5 ++4 -9 -2 ++2 +8 +2 ++7 +9 -6 ++8 -C ++0 -4 +1 ++5 +C ++B +F ++4 -5 -0 +-2 -B ++5 +6 +8 ++E -B ++2 -0 -5 ++4 +8 +4 ++4 -2 -9 ++4 +4 +8 ++6 -5 +8 +-1 -C ++0 -5 -7 +^x ^4 +c ^D ^D +$0 $x +c $e $6 +$7 $B +$c $x +sjh +xA3 +7 +o0d y3 +D8 o2r +*53 x71 +K i8t +-2 *15 +x97 p1 +E $) +x07 Y2 +'7 *25 +*B9 +9 +*6B x34 +$q x71 +xB4 Z3 x76 +x97 } +u o1A +y4 Y3 x76 +K *A7 +.5 x23 +x26 x24 +D7 ,5 +x73 x35 +,3 x03 +i3b x52 +sAS +x23 stf +scC +i1m x19 +x25 *24 +iA4 q +p1 x13 +^g z2 +-9 ^O +*31 +0 +sq9 +i0$ +i51 i1c +i36 i52 +i5c i7f +i5a i36 +i30 i19 +i7a i11 +i5d i34 +i16 i59 +$h $o $o $d +i69 i70 +i69 i75 +i4s i5e +{ D1 ] } +i5p i6a +i1a i2r i3a +i1a i2r i3c +i5t i6o i7n +i21 i31 +i4r i5a +i5c i6o +o0b o2u o1l +i3y i4a +i64 i71 +i0w i1i i2l +i6a i7s i8s +i5b i6a +c $4 $* +i6s i7t i8e +i5d i6o +i3t i4o i5n +i1i i2s i3s +{ ] D1 } +i2c i3a +i5u i6n +i5u i6l +i2r i3a +i2r i3o +i2r i3i +i38 i40 +i2m i3a +i6r i7u +i1u i2d +i1u i2l +i5o i6r +i1o i2t i3t +i63 i75 +i0b i1e i2r +i3t i4h +^o ^n ^o ^m +i2a i3m +i3s i4i +i58 i67 +i0p i1l +i0t i1y +i2n i3e +l ^d ^a ^e ^d +i45 i54 +i45 i57 +i82 i90 +^r ^i +i2k i3i +^d ^n ^a ^l +$l $o $o $p +i6s i72 +i6s i7i +i8e i9d +i0g i1h +i59 i61 +i34 i44 +i3c i4h i5i +i80 i95 +i5c i6a i7t +i0j i1e i2s +i0f i1i +i5m i6i +i5m i6a +o0b o1l o2u +^t ^o ^o ^b +i3v i4e +c $6 $@ +i3u i4l +i63 i70 +^k ^c ^a ^b +sg9 si1 +i81 i90 +i3b i4o +i0h i1a i2l +c $0 $+ +^y ^a ^p +i4t i5e +r $b $a $b $y +i43 i55 +i43 i51 +i5a i6r +i7e i8n +i0c i1i +i1o i2m +i1o i2s +$a $n $e +$7 $$ +i65 i73 +i7o i8r +i2t i3h i4e +i6n i7i +i1i i2n i3d +i87 i98 +i52 i63 +x41 $m $a $n +i7B +l ] $c +i6d i7r +^0 ^0 ^7 r +y5xA9 +sjN*57 +^BsN@ +z2x05 +x49$m +x82T0 +sprs!x +x97^K +*8AT1.7 +}sx&.0 +Y2x32 +Y1iBKC +sqJ] +$DsMt +*5Bx49*54 +R7iBw +xB4$z +soa*58 +i6@'9 +xABo0Ki9s +i8R,6 +i0s*A9 +x05i54y4 +*46*A9 +shZ +Y1xB9 +D2sk7 +o0Cs*? +i7_sh}sUR +x76D1 +slr*86 +*A4Y3 +Z2[ +x62x19'B +*6BuD8 +o4osxd +,3.9 +D0]sVm +sh9sGro7s +EZ4s(3 +,7Z3 +*A1o0W +x01Z1 +oB^x02 +x61,5 +Z3s|o +iAHE,3 +T5o8l +xA5$k +s_Tx72 +x31Y1*96 +x3B'7u +*5BusKs +.7sgR +*5B,8sLu +o4ysOD +*63-3 +rxA6 +^nD1-A +o10x39 +s^) +z2x73 +i41i59i68i78 +sme+6 ++A$T +i7fc*9B +.5*B8 +snW +ssd*94,7 +R7$3 +i9;$h +$=$. +o5c*41 +i5c i7b +i5c i74 ++BC +i78 i19 +i5d i5b +x2Ay4x39 +i82i90iA0iB8 +x53z2 +^$sZ/ +sSNx1A +Eo1Z +s;g^` +i35 i79 +*30xB7 +]Z5 +^Bx93*25 +i3d i3c +*24x5B +z1l +o8ax27 +i18 i14 +i1a i7b +i31 i15 +s7, +ss{{r +sRZ +sY%iA= +xB8x27 +CZ2oBa +i1e i77 +lxA3 +*12x52*18 +i72i80i92iA8 +}$9 +suwo5W +s3 +$*$? +T1*93o30 +x64 *62 +y2 K c +i77 ] +i4y i6s $1 +$? $1 +T7 -1 +$/ $* +y2 c K +i4y $1 i6s +-6 $1 +$6 $6 $! +$* k +i55 x91 E +^B $o +o8M x12 +c i2g +c *24 +x21 x01 +^F z1 +i0N *43 +-7 D2 z1 +K o9C +$2 x42 +o7h E +o42 i60 +z2 T4 +*43 *30 x42 +*43 x42 *30 +x05 E +T4 D5 +x21 saM +o1A C +$1 $4 $2 $8 +^J x15 +f x45 +,7 .5 +$0 $+ +$0 $* +-0 s17 +$1 $0 $9 $4 +x52 o7b +$1 $3 $2 $4 +Y2 ^J +i55 E x91 +.2 o47 +s8A L7 +c *13 +,5 o30 +*48 +8 +xA1 $6 +$7 $5 $3 $5 +$2 $5 $8 $7 +$1 ^< +c $. $. +c $! $4 +$" ^" +c $2 $- +^* ^1 +c $# $5 +c $6 $. +$7 o67 +l $1 $9 $8 $9 +D3 D7 +[[[[[[[[[ +*70 E x23 +*19 x81 +*70 x23 E +o6%x54Z2 +^m x31 +x01 d +l $1 $4 $3 +l '5 $3 +l ^1 ^9 ^9 ^1 +$6 E +^e ^v ^o ^l +x42.4 +LBs"Cx12 +*30 *68 +s^jrx53 +} [ +i65 *06 +-2 -1 ++4 -2 +6 +$6 -7 +i0y i1e +k $i +i31 i49 i57 i63 +*54 R7 +3 +s*ED1 +*54 +3 R7 +d x72 +i3b i74 +z2 ^a +sy3 E +i36 i41 ++0 +8 -2 +$2$0$3$1 +$a ,1 +-D-E +sjfs,O +^l i3l +i89 i93 +i8l i9e ++5 +9 -0 +$r z1 +i89 i90 +-0 z1 +x02 z1 +i37 i71 ++8 -4 -7 +*19x16 +$G x02 +'5 $. +Z1 i7t +]*A2^" +x08,9 ++2 D4 *43 +i7t i8e ++7s@.^D ++4 +6 -2 +i78 i18 +i1a i2i i3l +x41 .5 +x45 y5 +o68 D8 +i4i i5o i6n ++0 -8 +2 +iAHsj( +i7r i8o +c i3. +l ^y +x08T9 +*76 *47 +*79 xA1 +i33 i42 +spf +t i7S +*75 '8 +-3*60s*o +-7 -B +x03 p3 +x51 $v +o5c -0 +x31 $_ +x51 *54 E +T1 *75 +i0s i1y +x51r] +x72 Y2 +x42 *52 +s3T o7t +x46 Z2 +$8 o0d x42 +x51C ++0 *08 ++4 -A +4 +i31 i49 i57 i66 +i4vx82 +o1# +*64-3 ++6 +9 +7 +o73 [ +i0a i1n i2g +i33 i53 +-3 -9 -4 +o9JxBAi6L +oB0 +B +T5 Z1 +'Ax9Ai6N +*A9 .8 +o8w [ +-0 '7 +Z5x28s'X ++8 -0 -2 +i4i i5n i6h +i50 i31 +^a D9 +c $0 $) +K ^l +$7 -0 +oBKcT9 +s9cxB1 +o1p } +i3a i1d +o0p $x +x42 l +x64 $0 +x51 $S +$9 -4 +-3 -4 -9 +sPV +i22 i34 +*53 sbm +se3 sl1 +u o9d +sa8 ++6 o7. +i88 i99 +-2 -5 -4 +^ ^5 +i8M +$vx67 +i44 i53 +$q[ +DB { +*6Ai6b +sm7 +slm +s9?.2 +t o8L +x09^!s!o ++B -1 ++4 '9 +s )x41 +c $# $7 ++0 -2 -8 +x23 $d -2 +x02L1x04 +.4 c Y2 +sCnsoE +q x7A +^w sil +i26 i30 +i5F +i1e i2s +*54qx06 +x46 r +^e ^x +i1u i2l i3i +c ^K +i2e i3r +K *31 ++1+D +sr) +i1b c +x51 E *54 +i6QDB +i81 i94 +i7y c +-B -8 +i4" +i81 i91 +x32 $s +2 +i18 i39 +x1Bo3M +i0r i1o i2s ++0 +2 -8 +i5s i6h +i5s i6e +i0d i1a i2v +K o7G ++6 $O +y5 y1 x39 +i74 i7c +l ^r ^i ^a +x03 y3 +z2 '8 +i8s o1o +i44 i55 i66 +o1n .5 +oB/*38+B +i7n i8a +z2 *03 +*67xA2R1 +c $2 $0 $! +s39 .7 +x42 Z1 +sA8 +^@ ] +i84 T4 ++3 *34 r +c ^0 $1 +L9i9Zi31 +i13 x53 +T1 +8 +i6a i7y +D4 x21 +o0rsVh +sud +c i2l ++7 ^w +-2 x53 +x41 x01 +i6t i7e +o1k c +-0 x16 +{ +8 +x12 x23 +t o66 +x21 r +3 +-5 -8 -6 +i7u i81 +'A T1 +{x06f +i5i i6c +D5 $_ +i1e i2n i3n +x53 *10 ++8 -7 -2 +o4s *41 +x91 D3 +x62*4Ap5 ++5 *78 ++4 ^Z +*49 *36 +*6A,6 +Z2 o9t +o2@ T0 ++8 -7 -4 +o3@ D4 +i1u i2t +D2 x61 +x23 -2 $d +-3 +A +.7 *76 +t *93 +.1 x24 +i0t i1r i2a +x31 x21 *45 +'A +2 +s/F,5 +s1$p3 +z1 $f +o9z T0 +x72*9B*15 +x89 xB2 +ux4A*83 +*24*40*0B +x71Ki9V +{ *32 +.5 c +*32x96*25 +x32 T7 +i8M +7 +i3i i4a +*75 o1r +i6a i7g ++4 +4 -A +*40 x62 +.6 T2 +^k o6u +c sl1 sa@ +D1 *31 +K o3d +s9K +i2V o5b l +i3@x37 +o1z ^T +$ Z2 +T4 y3 ] +x32 o3@ +i0f i1r i2a +s9_ +*68T4 +o7r t +$! x32 +i7u i8l +i0k $e +i3u x63 +Z1 o7p +L0 o1. +^hy5 +T0 x12 +spy +*92 '9 +Z3 $S x75 +s|Wt*13 ++6 o92 +*54 ,9 +{*80sp- +xA2 x05 +i73 i3c +D0 s30 +o1)o6Rx1A +i0j i1e i2n +Z1 o5. +o6j E +*96*A3E +^x ^3 +y5 Z3 x47 +o2g o1d +x61 R5 +i6LxA5 +c i5g +x21 ^g +i5a i6l i7l +i30.A +T4 ] y3 +^B *25 +D1 ^U +i4r i5o +r i7l +i71i89i98iA7 +.9x35iA? +$# $# +*10 l +i6e i7r i8s +$A z1 +c sa@ sl1 +i3a i4t i5a +Y1sFV +i73 i3f +R7s/AE +$5*26 +sBw +x02 K { +o1s i3n +Esx?Z4 ++1 'B +o1. x27 +x87 [ +p1x0A +*46^D +sMjsQH +-B-D +$Y l +3 +i4a i5n i6t +i4- o0e *13 +x02Z2 +o9AsSex5A ++8 i7- +Y5 x71 +x53 Z3 +x67 $c +o12 $! +i1m i2a i3r +Z1x51o2r +Z2 T0 -A +se6 R3 +Z1 o6t +}D4 +x64i4o +i2. o0d +c*25E +x85 t +i82i90iA3iB0 +*31 .3 +sLTsHD +s56LBY5 +o0S x16 +y2 r +D0 x23 +-7 Z1 +sEH +$rk^f +c $e $d +sKu{x42 +i39 i18 +$3 i6@ +i33 i48 +o4y l +0 +s+ysqf*75 +*56 r +-9iA* +x45i0LY2 +D3y1 +*20 +0 +c $* $2 +o95 p5 +i5y i6o i7u +l ] $O ++7 x24 +*05 *41 +*41 *40 +l ] $N +$6 *57 +*8Bo3_K +$h -3 +c ^3 ^7 ^9 ^1 +i58 i5e +.5 x12 +^6 i1b +i3oLA*18 +i13 i1e +o1+ x91 +*A0s4q +sBjiB& +*54 o0H +^r ,3 +$@$) +x27Z5 +sVJ +o2p x35 +sh#x0BsgH +*16 o5w +$$ l Z1 +t R5 +i39 i75 +i30 i51 +i80 i91 iA2 +z1 $i +$s *57 +i16 i17 +c ^$ +i31 i49 i58 i61 +t x04 +x68x15Y4 +t o8D +*6AsV0i6$ +x21 scs +$$ ^1 +Z4 r +s'Xp4'9 +sOE { +i66 '7 +l ] $e $d +l ^y ^b +c $* +sAJxB8 +s2Ds?!o6$ +i38 i44 +c $1 ^0 +sQF +y5 q xA2 +s6Yx34 +T0 i2p +sTJ^Ts#> +E ,3 +*A9z1 +x54 $9 +$C x62 +i36 i1a +C '8 $3 +} ^q +o0d } +$A $C +x57o5j.2 +d 'D $1 +x43 ^C +$-L7 +-5 -8 -6 -7 +x67 } +*59^OiBd +$* x51 +ET4r +o7i i3X x15 +*16+5 +-5 -6 -8 -7 +i38 i54 +x76Y1] +'6 $? +sfl +sun D4 +$5 $f +ls@S +T8x15 +Y1 R5 +o3~ +$d o0p ++2 -1 +6 +c $7 $5 $3 $5 +-5E +o6k r +sckx57 +i59 i36 +q x35 +.6 *16 +x45 Z3 +iAl +-5 -6 -7 -8 +-2 $4 +c 'D $7 +i32 i40 i50 i61 ++5o0ysBH +Y2rT4 +i1W +i41i59i68i74 +o0/ +d $5 +-6,4D5 +-3 $b +i00z1*08 +o0| +$! $@ $# $$ $% +^!x69 +^y ^l ^u ^j +xA3x74 +o6h *34 +*8A x62 +*56+4 +x91sQN+2 +c ^a ^d +i67 $0 +R5 x05 +*35 *31 +i31 i49 i58 i68 +x06 Z1 +^K z1 +$x *45 +*17 x51 +x9A$E +$9 $d +[ i7p +,2 '7 +R7x21,9 +o1" +RAi6Ax36 +s17 *57 +i12 i50 +Z1 *72 +oApT4 +c ^N +s&@ +i6m i7a i8y +sTm .0 +i5b i3c +*43 t -5 +$0 $c +D6 sby +$a i02 +R4*93u +$0 $d +sx68s]e +R3 [ +o1b r +$bx73x38 +i75 i7d +Ey4s^y +T5 y3 +*97^cK +} *1A +z5 x71 c +uuZ2 +C '7 $4 +C '7 $0 +$. $b $g +o2n Z1 +} sVR c +i3d i4a +*07 -0 +$,$- +*70x53 +sumY5L5 +T5 Z2 +x14 i0T +x69 .6 +x53 x62 +xA4L9 +$*x57 +i7s i8o i9n +*48 x73 +*97 o95 +oARsx) +r sL1 '6 +*19sv? +x35]Y5 +$4 ^4 +c $1 $6 $! $! +i58 ,6 +i1c i3c +o2n } +i14 i1a ++8 *70 +x54 D3 +txB2 +kx45i1_ +*93-4sY| +i3c i1f +*14 *30 +-0 ^5 +s/Px6A +x34 Y3 +z5 c x71 +x57T3sbu +i5a i17 +*79 i9n +x84 +7 +$0$1$6 +-7$us/x +i35 i58 +s!-*61 +*76 -9 +*40 i7j +i5s i6o i7n +sjR +c i05 i18 +i3f i7d +x9A iAe +i1r i2m +z2 { p4 +}x83^- +$J +2 ++5 -3 +7 +*62s^+ +u ^3 ^2 ^1 +sjv +skP +i9r -A +i5s i6t +$k $h $a $n +s2M +x53 sln +s3y +$e o0d +*19su4 +c xB2 +$g $i $r $l +l ^r ^o ^o ^d +*57 $0 +$9$7$7 +*98 x52 $e +$2 o8b +Z1 $9 +$&$@ +i36 i73 +{ c { { +i1d i13 +T7x5B ++9 -D +*67 x34 +o7( +sDr +^/ ^1 ++E +F +E +T0 T6 T2 T4 +i2k i3a i4s +swnx87 +z5 y3 x78 +i79 R9 L9 +]L6$_ +$YK +s tz2 +i7a i39 +$bo9P*7A +i2R K +i3f i5f +o8w-8 +$z $i $l $l $a +s.AR8 +sX'*32*40 +C ^7 +x16 o6t +c $0 $4 $6 +^t ^a ^o ^b +i1I x12 $0 +Ko4Cx81 +$u Z1 +*67t +i40 i56 +i51 i33 +$9 $0 $* $* +x24T9 +o0\ +x45+Ax42 +s?_*AB$p +i3TC +i7a i8y +^_ ^5 +i59 x02 +z1 *15 +-4 [ ^I +xB1x32 +^- ^- +i2i x9A +l*02 +$d i0t +x04 o51 ++6 +6 +9 +$_ l +*18sF4 +i0m -1 +i3b i3d +{ $_ ++8 +9 -5 +c $7 $x +t$9o0F +$Go9`RA +-5 *25 l +o6oTA +sPloAF +Z4 x53 sao +s8B c +$_ $x +i7P^tx83 +i52i60i70i83 +o6p r +i74 i5c +i87 i99 +Y2 ^S ++5^` +l } +Z1 o4h +i1o i2s i3t +$a *73 x03 +c o1G +l ^t ^f ^o ^s +i7f i5e +D0 p1 x15 +i3m D2 o50 +s@Lq*39 +sIN +$3$1$1 +sgz +^" x61 +$7 s4_ +s.B +*30$)x8B +o1F R0 +x46 [ +r o0L +i78 R9 L9 +]'6Y4 +*2A +T3 o76 +y5 x39 +^! x71 +Z1 i71 +K x92 ++5 -8 -4 +o2- o1w +] x86 +i5i s1d +*76^wD7 +-0 -3 -4 +o0{ +i3k i4i +sx* +i2U D3 +*49*71L8 +i52 o79 +r $b $o $o $k +x53 -4 +iAx*BA +$1 ^c +*31 ] -0 +$. $p $l +s8DsNO +p1 x52 +x42 +2 x71 +sB$o9% +k sej +*02 *05 [ +sps +saw +^3 *02 +*20 $t +} o4d +$i $v $e +i13 i1a +i4o x21 +qx69 +o6o Z1 +sDH +o7a ,2 +i2n i3d +s*Rx92 +x46 *35 +*76+8s6b +o7Fc +K d +o6r ^C +-A*8Bx21 ++E +E +F +^l ^i ^o +k ^M K +i0k i1i i2t +*15 i6T +i13 i50 +$a $l +.4oB` +D3 sbz +x23 o2c +*65 i66 +i24 T3 +i37 z2 x03 +^s ^i ^m +i2h i3a +D1 -3 +$4 o3E +Z2 x95 +$s T4 +i5b i74 +st* +s17 x61 +^2 ^B +i9z E +'5 i2. +$Ys4# +c ^8 ^7 ^9 ^1 +i4e i5m +i49 T5 +o2@ [ ++2 *20 +s2_ +$q x31 +.1Z5 +$+$# +x52 i5@ +x31 $6 +sel +sto +s/H.B +st_ +$C D7 +} o3y D4 +x5B*32x47 +o8M x52 +s$OE +{ T1 +*57 $o ++6 +9 +6 +*53 sbn +ss$ se3 +x29$x.8 +Y2r +*24sfO +d'9 +] ^q z1 +^V -7 +'7 i1o +q x12 +i54 L5 +x7Bs%B +i8v] +i22i30i40i56 +skW +,7 x01 +i22i30i40i57 +-2-A +i32 i3f +i6t i7a i8r +x72*9A +i1v -4 +s./ +'8 z1 +i5n i6d +s4+$j +i1e i2b +${s?Mx86 +x32 } +i7A *30 '8 +[ *31 c +u x38 +i2m i3o i4n +$2 $9 $! ++9^jD8 +i47 i58 +$E D8 +*1B*31 +i31 i49 i57 i69 +sjy +x45 $A +^J k +i50 i3e +T0 T6 T4 T2 +i74 i3f +i0e i1r i2i +$I x71 $1 +R5 K +x23 Z2 +T3xB1t +c $0 $- +i1b i1f ++3 -7 +8 +x04 { +$2 *14 +c $6 $2 $2 $3 +i22 i31 +c ^1 $? +^b *64 +*54 -8 +D6 D8 +],1 +c ^( +i22 i33 +sgM +-7 x94 +i11 i7a +.3 *24 +R7 x43 +x75^D +x41 *56 +*62cx5A +D2Co4N +x84 u x53 +x53 Z1 +k i17 +*6A '9 +[ o6k -2 +'6 i5r +sPW +i71 i10 +cp5x3B +i16 i37 +i0c -6 +$b $i $j $u +l ^g ^n ^o ^l +T0 T2 T4 T6 +p2 *36 x76 +i3u i81 +i00 i18 i20 +^2 ^G +^ ^3 +i8 { +*A1{sWY +^@ x15 +[ c *31 +LBo4?x54 +T0 T2 T6 T4 +q*21+9 +-0 -9 -4 +D6 $R +$_ $i +,9 +0 +*04$Q +^fx72Y2 +.7sdK +$a $l $l $y +} $z +o34*36o00 +i3e i4m +$~$! +i39 T4 +D1 -7 +i2# ++9 Z2 xA2 +i3f i70 +*46 l +i71 i1b +-6 -6 -9 +snh *64 +x54 -4 +x54 -5 +*89D3c +$4 $8 $0 $0 +Z1 i1l +l ^m ^r ^a ^f +i0m i1o i2o +Y2,0'8 ++7 xA2 +*53 $L +^2 ^C +i7`ts?7 +o5D E +k i4z +^;x57 +l o6y +se&D2*45 +*02 $d +o97s,M*0A +LAt-3 +*61 -4 +i8p i9e iAr +c $? ^1 +$. Z3 +x81*43 +o2% +Z1 $g +i5i i6n i7a +sh.i2.x94 +p1o0isR6 +s1Y +ko8^^Z +p4 t x35 +i51 i69 +o9s $e +i1w i2i +i2e i3p +] -4 +x42 $4 +[ t } +i7a { +]z3*93 +i2e i3s +Z2 *68 +T0 T4 T6 T2 +x01$d +.9s96x72 +i7* Y1 +*02 o20 +i5t i6a +$1 -4 +^x Z1 ++5 +7 -3 +to3E +L3x07 +Z2 +3 +s]5i37 +$9R6*3B +d x14 +o1r x45 +x45 ^m +i0c i1o i2l +sHr +c ^9 $4 +i6t i7o i8n +o3i *15 +R1Z2sbg +i74 i14 +i5f i7f +x82 l +-0 -4 -9 +$= $a +^g ^j +iB#iA4 +i52 i60 ++0 Z2 +i18 i33 +i1d i1f +i0c i1h i2u +$A *26 +i74 i7d +i90 iA9 +$8 i64 +$" l +*65RBk +ky5sh$ +p4 x35 t +i1I $0 x12 +o79 $L +x82rsOs ++3 *51 +x14 ^P +i63 i72 +i4o i5m ++D -9 +$9 $7 $@ $@ +o4- -6 +u x03 +T2k^p +,5 i6j +f x42 +.4 K +i50 R7 L7 +sft +x43 *42 +*15 *43 +*70o9x,7 +k,4 +^S ^J +i5c i75 +i5c i77 +s28 *23 +i1a i1f +i7n i81 +*98 $e x52 +{ T8 +-0 spm +o9H ] +sje +i74 i3c +C x04 +l $j $o $h $n ++8sKlq +DB x13 +$4o9u +y4s_" +$1 *03 +k K ^M +DA { +^w ^a ^s +Z1*9A +z2 p4 { +i11 i3e +se! ++6 *32 +i87 *A7 +spw $s +s2F +E $f +^R *45 +s[I.0 +$0 ^@ +i7A '8 *30 +i51 i69 i76 i84 +sdq +l ^m ^o ^c +x27o3Ss&0 +*43 ^y *23 +D4 *25 +$3 r +o9% +i1h i2a i3r +i07 x83 +*53 { +x07L3 +o1c D6 +*28s7z +i72 i5f +i1a i2n i3s +s1& +x43 { $a +k Z3 +i39 i40 +$+ [ +i6XsIQxB6 +c $2 ^4 +sir +x64 i5o +o5y u +i41i59i68i75 +C T3 t +siv +i37 i40 +o5y k +o8?x52 +$b x13 +x71 D4 ^N +i71i89i99iA1 +*32 D6 *43 +}]sbB +i77 i7d +o70 i7z +8 +o0D z1 +^t x45 +o7m $1 +i0k i1o +$i $t $y +*94 x06 +i0k i1u +Y2 -2 +*32 *43 D6 +s_! +L6 $h +o4[ +*97z5 +*31 $r +T9 T4 +i01 i19 i26 i38 +i57 i64 +T0 T4 T2 T6 +i2t i3e +*61 *21 +oA1 D5 +x63 *34 +*36c +*32xB1iBp +z4.7 +x3B$n +D9D9 +o6i x12 +i61i79i88i95 +s[s$/ +*06 *31 +z5 z4 +t .5 +cy4 ++0 i6v +^N Z1 +o6p +9 +c ^2 $7 ++5 -4 -8 +L7 x52 +c $1 $6 $4 $5 +o9& +oB$*89 +x34 Z1 +x32 o5w ++5 +6 -0 +i0c i1a i2s +x04 E +$u x43 +c $+ $9 +i3f i5b +*14*65x89 +l $h $o $o $d +sa* +x92 *86 +x34 z1 +sKQ*70 +c $^ $1 +$4$2$1 +*08 x45 +t o9l +p4 i7. x83 +R7 *67 +seosd-x78 +x12 t } +Z2 +9 +sJb +*23 -6 +$& ^& +x41 T1 +i1c i7c +i3b i5f +-0 x24 +*65 [ { +o0C z1 +sg|DAi9m +o30 r *30 +o8C*A6*25 +*84o5w +$K { +^P ^M ++8 $g +t*70iB} +Z4*57 +i2d i3y +xB2k +l o9G +$nsQE +,9 x45 +o9ti7{ +i0g i1r i2e +^$x19sJY ++0 +4 +1 +$0 ^2 +x14 $1 +i1M +x69Y5 +smi +*43 o13 +xB2 $h +i1p i2o +i5 t +xB9+A +$5 $5 $3 $1 +*23 p1 ++0 +1 +4 +i52 i60 i72 i86 +x68s9I +sbM +0 +[ $a *53 +}D9 +c $7 ^2 +r f x3A +oADx58 +] i6N +*84sd"*47 +^f 'A +^V x41 +^V x42 ++0 +7 -2 +$ai9$+8 +^n ^o ^n +$!y3 +u i6_ +i75 i35 +^/ +0 +x21 $4 ++8 -2 -4 +sak D6 +^b ^x +*58c +i62 i77 +c $7 $8 $! +p1 i4a x5B +xA4rx63 +[ K *15 +^, ^1 +i4s i5i +i7u i8r +c o4l +-2 *03 +$s o13 +x2BiA"*50 +i7u i8s +*63 x64 +p3 *B9 ] +s"Wi7M +D6i0Y +i66 i75 +y1D6[ +D2 ^, +$y o1u +x7As5O$5 +x26'Ad +*13 $M +i3p i4a +i1u i2i +*4B^P{ +*1B]t +x61 $i +.3 t +TBsMW +i0a i1m i2a +i13 i39 ++6 +A +6 +*3A '8 +$I $1 x71 +$7$2$2 ++8 -5 +9 +^f ^x +i2x i3i +c sb8 +^Fo8w +i21 i38 +$z x51 +] x83 +l $M +l ^n ^u ^s +x89z5x01 +C t T3 +s@us3d +koAn-4 +^x x54 +-9 Z2 +$9 *01 +*91x48 +$g +4 +$$ x02 +i1u i2g +T7 p4 +i6m i7i +Z4 sao x53 +i7a i8s i91 +^4 $! +x26 Z5 ++8 +8 -2 +i9j xA3 +] i43 +c $3 $5 $! +oBio56$# +srs saj +i1r i2u i3n +ssb k +x12 } t +i5h -8 +c $1 $3 $8 $5 +u [ ^N +i73 i32 +o0S *34 +i0c i1u +-0 -4 -3 +i1d i3f +i39 i56 +x64D3 +^`sSBl +D4C +*21 *72 +^n i0b +y1T2 ++6 +6 +A +*76 q +$6 x73 +^Kx48 +^1LB +s>J*A7 +o51 o6b +*43 $3 +l ] $V +Y2 x64 +x39Z2 +i8 R9 +i2g i3e i4n +$h *54 +-3 i33 +^HKl +[sl9K +o8sp5 +} i56 +*86 *95 +$p *05 +[ } t +*16 *23 +xA1Y4,6 +x98 o5s +Ey3 +x91R3 +c $6 $9 $! $! ++3-A +*69 [ +i86 i95 +y3 ,4 +x59*93 +i7s i8e +i4 D6 +i34 i73 +*45 t +l [ ^z +r ^m +r x35 +*25o5x ++B x64 +*19koA@ ++C -5 +i18 i16 +*32 i6_ +D2 $o +ss6 +o25*67 +l ^o ^s ^i +ss- +i3f i5c +DB x64 +*43x59 +$qDA +z1 D4 +x27s-x +*B1$i +*A7 xA9 +i0b i1o i2o +sz1 +t*7Ai9e ++8 -2 +8 +$ $n +[$i +l ] $X +i34 i79 +-8 Z2 +o1Z *01 +x54 T5 +i78 i3a +i58 i34 +t $2 +i3g +7 ++2 c +i35 i1a +T2 oA2 +$o*08 +i7Js_D +x02 c +$2 *52 +o9tx8B +u $2 $0 $0 $8 +x47 $6 +i5e i52 +*48*36x81 +i33 i46 +*76-7 +z5 t +$R D4 +i2c i3i +$k $r $e $e +r ^I +saz +i53 i63 +D9 o89 +s1h +i52 i60 i71 i88 +T3o0f +Y3x38 +D3 $n +-1 $3 ++3 +9 -6 +l $r +C,6 +c $* $3 +x12 z2 T3 +i1L u [ +D8 ^H +Z2 x13 +i46 i51 +x03 x4B +-By5 +i61 i74 i83 +i38 i73 +$5 $7 $0 $5 +s%$i2. +i08 -0 +o19 D4 +u -9 +l $1 $9 $9 $7 +sfa +*23 ^m +$P -3 ++BY2^J +x65 o0v +{ u +i6h i7i +*08,1 +L0 Z1 +$Lr +i1e i50 +i3a i4l i5l +$2$0$2 +l $0 $0 $3 +i52 i32 +i83 i96 +i21i39i48i51 +}*1A +i09 +2 +,0^8 +i1e i2s i3t +c $1 $7 $* $* +l sdk +s#8x21 +x02 x13 +^r ^e ^v ^o +i1i i2s i3h +x91 ^f +i5K +i81i99iA9iB7 +x26 ] +-0 o7z +$p $t +i5i +7 +$di1uR6 ++0 -2 +7 +$)$% +c $1 $5 $! $! +$+ Z1 +c $= $2 +*13 su[ +sPN +u $1 $9 $7 $9 +C*70 +E p4 D6 +*60Y2 +i6t i7a +k *42 +i8Q +z5o6Jx27 +o6p o5l +K *53 x41 +-7x67 +sx;^d +^v ^u +c $0 $6 $! +s Esu*s^@ +x43x5B+8 +i2a i3b +*91Z3 +o61 -9 +]*A9 +$)$/ +i39 i76 +$0 $9 $$ $$ +o9UD1 +D0 p1 +i01 i19 i26 i35 +sHh+4 +c ^1 ^7 ^9 ^1 +^t '7 +*98 +1 +$V r +p1 t x62 +i4t i5a i6r +D5 s13 +i55 i60 +l [ ^U +T7s;c +iANx52l +$ $g +*72 '6 +l ^w ^o ^n ^s +z2 *15 +*48+8x2B +i81i99iA9iB1 +*65 +8 +[ -2 o6k +{ x34 +i1f i3e ++3 { K +$. $c $n +i2a i3c +i0! $2 +^s 'A +k x63 +{ R5 +x81 *43 +i2n i3u +c $o $n +i82 i90 iA3 iB0 +i57 T6 +p1 x62 t +L1*18 +s[K*A9o3O +x61 +6 +sov +$y { +*82 x06 ++4 c +^' t +p4 y4 +x7A^9iAz +D1 D6 +$8 $8 $@ $@ +*78 R6 p4 +Ky2 +svD u +*54 ^9 { +i3n i4i +*16x41*35 +*92R3s'9 +*B7LB*86 +*95 x82 +l $m $e $n +[iA/ +o4b x57 *57 +^a ^r ^t ^l ^u +i7o i8m +i8f x05 x21 +o3y,A +} ^Q +y5 x0B +o6% [ +x84 x53 u +Z1 *68 +'6 $. ++2 ^8 +u $7 $8 $9 +i7#iBf +o77 *16 +o87x31 +D3 ^6 +$8 Z1 +i1f i3a +$9 $1 $! $! +c $A +D3 ^i *42 +*A9 x54 +K $h +.AY3 +xB6.4 +i1b i14 +x31 T2 +i0l i1o i2v +k x31 +i1b i1d +o6R *40 +CsTyoAv +^i { +i1a R7 L7 +*68 x43 ^j ++8 -4 -2 +c i6@ +i59 i60 +$8 *75 +s7! +K T9 +*34sB! +^G $v +i1a i2g +*82 x81 +C^S +i5e i38 +,8 o7h +i3s i4o i5n +x61TBt +spl k +i33 T4 +i38 i58 +i42 i58 +l ^n ^o ^o ^m +l ^e ^e ^n ^k +o2A +$1$5$1 +.8$V,B +$m -1 +*62 *52 +s=O^k +xB9'7 +u $2 $0 $0 $5 +*84 x06 +{ svL +t$1 +s!uswj +i38 i50 +sPA +i8c i9a +o4WsM x56 +$_ i25 ++2 p2 +o3l o0H +*B4K] +R0s)V +Y2us(I +D1 D8 +i17 i7a +x15 p2 +s^co3o*0A +*40 x27 +T0 TC +s6L +,8*15i6T +c $9 ^8 +*A3saU +i14 i71 +sX-x49Z2 +i37 T4 +} D4 o3y +R4 o57 +^J x63 +-0 -D +$zs{t +u.4x74 +i38 i53 +o6m *43 +x26 c +i7t i8o i9r +c i25 +c $1 ^^ +$1 $3 $8 $5 +i8t i9e iAr +o9wi5_ +i52 [ +[ *65 +D9scs +p3 ] *B9 +o9y -3 +^r x16 +i41i59i68i77 +sma +i1o i2v +s%]*59C +Y3 o3b +-5 l *25 +o41 x02 +s]bshb] +L5xA4x9B +T0 TA T6 ++5 -0 +6 +i63 i74 +}Z2 +x4Aq +c D6 *36 +z4x56 +T2x87x19 +^W *32 +c ^8 $9 +*1B*83sTV +T4 o5i +Y1 ^e +x75 c +r '6 sL1 +-2 D0 *54 +i8e i9r iAs +D0 } *54 +D9 c +s15 -2 +x53 i1a +$2 $4 $* $* +[ *53 $a +i7c u +sy1 +z3 x02 x74 +^p $p +Z1 o3t +c ^a ^7 +c $6 $4 $8 $2 +c $8 $1 $! ++8 *87 +*06 o4k +iBJ +i53 *68 +T4 o0H +y1Z5 +i5b i70 +*54 o6w +i3d i3f +*31 -0 ] +i56 i5e +*B1}s'E +dsr5x95 +^X x62 +*83 -2 +$@$/ +*78 D4 +c ^4 $2 +K T8 +-6 -9 -6 +$w o6a +s4XD3Y4 +c 'E +x19 y4 +*08^px62 +sO0 +o1u $y +*40 *12 +i3d i33 +x62 o8s +x6Bp2 +*58x26 +o2g i4k +s&2 +*95x82se\ +i3e i56 +$2 $1 $* $* +i2g i3o +i7e L6 L8 +i34 i58 +i21 i39 i48 i59 +x79$Ex18 +iBL +i21 i39 i48 i58 +i7e L8 L6 +c i00 i14 +,AD0 ++0 'B +c ^0 ^7 ^9 ^1 +i66 i77 +i1a i2v i3e +,8Z4 +x93^U +$0 $a ++3 -6 +9 +x56$$ +i2g i3e +s5+*58s|\ +$2 $7 $! $! +C+2 +x5Bs6.L0 +*47 o7A +D7 x23 +s9, +x62 xB3 +c $4 ^9 +c ^^ $1 +y3 [ o0t +*3BxA4,3 +^1x18y1 +o7. k +x04+5 +s9J +i67 x45 +$^$$ +s6< +s}I*48D4 +o51 $9 $7 +i34 i42 +i2a *42 +*41 $s +*25 ^d +i0O D3 +i1L [ u +Y5 x62 +s18i5P +*47 x06 +c i06 i13 +T6 T9 +i4c i5i +iA|x48 +o1- '8 +i67 x82 +o5Xx19 +i70 i3f +spv +ssy ] +ssE E +i5a i58 +*48-5+B +i0s i1h i2i +D3 i93 +*03 *47 +p1 o3a +D7 +3 +*54x95x63 +$4 o0E +x98$/xA5 +,6 -0 +o1- '6 +sie o6h +$g c +T3*5BTB +*85 x62 +$X*A4*A3 +o1o x53 Z1 +o0C{ +k y1 +o3t *06 +*53 smb +*59*73 +*04$wo85 +c $7 $6 $4 +,5s>KxB9 +iA3o9e*4B +c T5 i5- +i58 i30 +i5e i6n i71 +Z2 ,4 +x14 Z1 +x62 ^3 +x83 ] +.5 *74 +$) i4( +k *07 +i21 i39 i49 i55 +s)zoBLi9b +sSDi4) +t o7P +s9. +$&$! +i7c i8a +s)X$yLB +i18 i7a +sy9 +i4c i5a +^c x82 +i34 i43 +x54 p1 +s]W]o55 +p2 x76 *36 +$?$+ ++3 +8 -7 +-3*64 +u d 'C $7 +^pD6 +T0 T6 TA +i3i i4t i5a +*47 ] +o3F { +u d 'C $5 +siw x31 +x36 *36 i6x +i22i30i40i55 +x42 K $a +R5 s1n +$y $e $p +Ki0V +D7 *68 +i19 i50 +-3 } +k +9 +x42 x71 +2 +shB +$9 $9 $? $? +^2 c +^zx73 +i7d i74 +i1a R6 L6 +i1f i12 +xA5x39T7 +i39 i53 +E *79 +x37^a +'8 u +i2l i3a i4n +RBsa4o9! +Z2 *21 +$. *45 +$1 $9 $9 $2 $+ +i1l i2a +$osG& +T4 T9 +x05 *20 +*32 T7 +D6 i8x +D6 L5 +c x14 +o5t Z1 +*A9T6 +'9 $. +sMBx93} +*9Bo9y +Z1 .1 x23 +sBk*21 +T2 k +i22i30i40i53 +i3h ^k +sp_ +D2x83 +*10 x97 +z1 *23 +i5f i1a +i6q+8 +l y4 +*1A^4o06 +D1 *21 $U +*10 x25 +o3s *51 +*36 { +o2R T0 +xB6x52 +y2 *15 +$2 $8 $1 $3 +i59 i3a +x61 ,2 ^t +c ^x +p2x7A +$2 $1 $7 $4 +i3r o6h +*15 $t +^7 x32 +x74 *14 +x72 Z1 +x32 T3 +*B9x31$M +*34 ^m +r*B1[ +o7#Ko8$ +x58cR2 +q*8B'A +T2x63$7 +$f Z2 +{ +7 *75 +x31x17y5 +^3sH| +$v *43 +^FsO8 +x89o6- +t x6A +i7s y3 x1B +$d *21 +i61i79i89i90 +x64 *63 +$/ l +*37$4,9 +i4d i5o i6m +o6m } +x09y5 +i21 i39 i47 i56 ++B +C -A +p4 o8! +l ^D +i74 i5d +szd +} xB8 +*32 x21 +z1 +5 +-5 $T +i52i60i70i86 +szn +K y3 +^Px27{ +y1l +x0Asi3x63 +DA D1 +Y5 x46 +x45 .2 +{x7Ao7r +$ziAl,0 +s5>*45 +oA; x82 +sRX +*03 -4 +s>X}K +t o2T +K o6U +s/l+1z2 +i5c i11 +x06 p2 +[y5 +Z3 x43 +o9t E +l o4+ +i21i39i48i59 +'A $? +x21 $g +o3z { +i31 i49 i57 i64 +i4r x91 +$k p5 +,A +9 +i7r*84s3x +i31 i49 i57 i68 +s8,*75^A +-4 $V +T8 o7E +s;@*27,7 +x62 y1 +^H ^C +*2B^l +*72 x16 +^E D8 +Y2 *04 { +E x12 x62 +i9g$z +TAp2 +i4a i5r +o5+ [ +Z5 x6A +x91 i84 +rx6B +xB1 o60 t +i2d i3o +i32 i51 +*41 *16 +$2 ^4 +*07 *53 x31 +$5 x73 +i4, ^f x0A +*36 *13 x62 +x5A^$ +i22 i30 i40 i51 +x34 -4 +i2T +x24 x1B +*63 x14 +i54 'A +i11 i1e +TA .8 +*60 -1 ++2 -4 +3 +i22 i30 i40 i58 +o4b -5 +-3 *60 +*18 x62 +*25$)x91 +i1b i3a +$2 k +*76 { +*56 ^a +Z4 Y1 x32 +Z1 +8 o7u +r { +D4 [ $y +sBSo9$*75 +i30 i78 +[ y4 +i61 i75 +s.m+2 +*38$r +o0Y *65 +sSrx86R6 +r o65 +o9H +*B0d +sNSs'g +i7a L6 L8 +*65x25-3 +c $L +] -7 +*47 o40 +x02sdn +z5 x35 +c $8 $& +i1, +$3 i8< +*19s^RY1 +c $1 $~ +^s x43 Z1 +*05 -5 ] +x64i57 +,9s' s1G +svP +i65 -8 +}T3 +o5 D3 +'B *23 +scL u +i7a i8i +x17x01^j +$, ^1 +x92 ^( +x17 Z2 +sdT +i8e i9n +*97$h +i1A x41 +*84 ^s '8 +] i7T x23 +$e $r $y +i3e i52 +o8d *58 +i6e x94 +} ^4 ++2 +C +i6d i7e i8r +y4x5Ay5 +Z4 x32 Y1 +T1$8 +y1 +2 +] *43 *40 +s.K +] ^u +*20 o7? +x35p2 +s.R +^h $m +u d y4 +Z1 ^c +x75 *65 +*61 x54 +.4 $K ++3s9. +*B5 x76 +C]p5 +^s Z1 x43 +-1 skv +sCZ ++5 +4 +s0I +^K *36 +i91 iA2 iB3 iC4 iD5 +i5a i1b +*17 *76 +x23 $l +^1x0A +xB1 t o60 ++3 +8 -6 +o8/s%Ri5a +$a*AB +o5g *53 +x42 *26 +i2V K +swz +*81C$a +q x89 +x93 l +o1t-4 +,A x72 +c i7u +i3c i1d +*16 -0 +^B *57 +i61i79i88i97 +$- *57 +c $n +c $0 ^9 +s^nlo3x +$r+6 +Y3 q x7B +$O *25 +c $t $y +] *59 x73 +y2 *47 +o9fsz4 +f x5A T0 +sl4 +l [ ^p +i9F +*51 Z3 x23 +$3 +2 +o9$$= +x56 K +o9B}s1W +shS [ +s60 *75 +d x35 +Kz2 +i35 i59 +$_$) +t q +]z1 +x51 o4N +*26 *37 ] +$F *35 K +^h x62 +x91o3H +x72 *61 *12 +i02 i10 i23 i32 +x41 } +oAc*37iA} +x23 x17 soe +D0 y2 +$o*2Bsj& +i33 i13 +i7f i3f +sn+ +c$.K +s"esyk*18 +D1 R0 +x64 $g +[i7D +*46 o2d ++5 c +D5 d +T1x27$t +uo0M +o32*49 +D1 $U *21 +sKfsSM ++5 sib +{ *12 +i3i i4n i5e +i4Y K +^@ ^2 +{ $, +c $e $n +i52 i62 i71 +i3t i4a i5n +c ^9 $0 +t x41 i5a +i72 i80 i92 iA1 +i52 i60 i72 i87 ++5 z1 +o3_ c +z1 { +i8e i9r +l t x42 +x63y1 +x23 soe x17 +T7^Ksix +skay3 ++5 +0 ^r +sJR$y +snb -0 +*42 i5n l +$6 Z5 +i7S,AT1 +*95x71 +x02 +8 +Y2 DB +.1 } +i53 i5c ++7 -8 -0 ++1K +i78s,| +,8$_x84 +R7d*5B +*73sCSscu +i53 i3e +$. $b $e +ss&rx1B +p2sQN*29 +x97^1c +s28se(*BA +tKs%K +y1 x73 +TAs`"f +x05 i35 +x64 *69 +d i2o +sDq.4x58 +$nsWl +x23 x17 +'9 ^k +o6o R6 +i7e i3b ++3 -6 +8 +i1l i2e +E x23 +-5 $j +*B3s%M$0 +} x59 ++4 -2 +9 +Y1 x68 +$3 o58 +sZ0snf$% +x63$i +p3 i60 D0 +D7 t $9 +iB"y5x07 +*23 +2 +.2i9( +*B0$B +'A x23 +^t ^u ^o +r o41 +i30 i3d +Z1 $j +K i4a +i1v k +oAE +^' *04 o4k +*82 x85 +x61 i8k +{x83 +-4 L4 +o69 i0m +^DR8sun +Z2 x65 +y1 K +o01-4 +^CT0 +Y2 x45 +c $5 $* +k *45 +c ^- $1 +z1 $z +*01 s81 +x87 } +x63o0A ++B +E +$*T9 +*A3*62i9' +*14 x12 +T4skY +^1K*89 +o6R +[ .1 +s 2$t*91 +.2 -8 +,7 T5 +t-7 ++4 +A +4 +R9'A,2 +sVD +x24 -3 +Y1x75 +^o slt +s>I*08$? +o94i3l +Z1 i8v +^NsCU +^E -1 ++4 +5 -8 +i6r i7e i81 +i5y r +i1i i2l +*71 -8 +x83 x51 +d T0 x85 +-1 $8 +i1i i2d +i1a i35 +*60 *54 +x17 ^m +i91 iA0 iB1 +T8 TA T9 TB +i31i49i56i67 +*23 i2- } +x49*78 +Z2-7*52 +sgY +i0A u +s"{x06 +i47 i53 +i95 x23 +d x85 T0 ++4 +4 +A +i0k i1i i2n +i8; +i83 i94 +^1 *36 +^Z x41 +-8 T0 x61 +x02 ^' +T3 D7 +*45 -4 $1 +s3f*BA +^C '9 +*45 T6 +i5o i6t +x52 } +-0 *39 +srL*7AK +x02 $q +$1 *41 +T8 TB TA T9 +x63 o0x +o8X +i4a i5s i6s +*98$W +ssx c +Z1 *01 x21 +$. $h $n +z2 E x73 +i2l i3l i4a +y3i9@x7A +x82 t +s3$.3o4e +-7 i6_ c +.9o7SoA5 +*45s") +*12p2 +Y3 *A8 +sze +i4b i5e +i4u i5n ++1Z1 +x13Cx96 +D1 Y5 C +x42 *05 +i2* +x34 ^J +$L x63 +sgV +i6u i7s +*40 x42 x61 ++3 z1 +2 +i2k i3e +$_$= +k *23 +Z2 -8 +*02*8A +o0t u +*54 *37 +L4+4x92 +^d z1 +*84$K +o60 *24 +Z2 *53 c ++3 -8 -4 +t T4 +Z1 o4a +-3 -B +$8 $/ +z2 x73 E +o6SZ1.A +}k +D2 t +T8 TB T9 TA +$* -3 +spr +R7skjK +Z4 T5 x23 +x41 -3 +l i3k +spj +] Z1 u +$m s24 +i0+ +y2 Y2 c +i70 ] i88 +^n stk +x62 *78 +D4 i20 +o0n o62 +*15 +0 +-7 c i6_ +*67 r +o4G +*41+7 +i61 i3o +y2 c Y2 +i0j *56 +$q x02 +i2v i3a +[ ] ^H +o0t o1h +c $1 $2 $3 $% +i22 i38 +i16 i33 +[ 'B +^ ^9 +i44 i52 +y1 xA1 E +x12 .1 { +o7u x04 ^p +i2S [ +o6l *60 +^ ^8 +.9*76i2h +sl_ ++4 +9 -2 +x42 -8 +i5e i6r i7s +i9o iAn +i80 i97 +$C p3 +,A*18 +s2qxA5s&u +c seu +p2 p2 +i39 i13 +*89 Z1 +*53 *31 +*51 x23 Z3 ++9 x23 +T0 stj ++D -1 +r i0p +c '5 $1 +i6h i7a i8n +$D z2 x05 +s0\ +i4t i5o i6n +i38 i43 +$a s6W ++0 C +i72 i11 +i43 x73 +o7h *56 +i1a i2n i3o +$3 $1 $! +q x96 +x13 x32 +-8 x61 T0 +i60 i71 +i60 i72 +*31 +3 *51 +$3 k +i76 +8 +,2 D3 +-5 -8 -7 +-7 x02 +i9$ +^d ^n ^a ^b +Z4x02 +$h r +^0 } ++8 $S +o72y5*83 +z1 $l +Y1 o0I +$9 ^D +srm E +i2i i3k +oB'o7bi6# +i17 i3d +o2q i3i ] +] $q ++8 $m +x61 ,5 +i8m i9a iAn +Z1 o7u +8 +i7e i12 +z1 o2y +i8k i9a +i5O *52 E +z2 T3 +*81o2i +i50 i60 i79 +D3 DB x07 ++1 $h +slk +x93 -7 +*02 *06 +R5 o64 +D1 ^O +$1 ^+ +*20 x34 +x63 Y2 +x61 -2 +i4r i5u +*21 i0G +i3d i4o i5g +'8 i5m +*24 o0O +D2 *20 +-2 $h +i0f i1o +-0 'A ++2 +5 +8 +i5t i6a i71 +T3 $7 +o8g l D5 +^e o5y +scw +D1 x72 +D8 s0a +] o5y Z1 +i5k i6a +i8Z +iB3 x02 +,2y5 +*25 ssv +i1u i2b +^z -6 +i8M x53 +i82 x32 +o6s sdy +y2 T8 +sczo1N +$D o6h +x51 T3 +i8T ] +-6 +A +Z1sKb^C +i3i i4d +i5v i6e +i8s i9a +$0 x5A x57 +$0 x57 x5A +i1N +$4 $* +i3i i4m +$?*65o4_ +i41 i52 i63 i74 i85 +{ x71 +x61 D1 +}.4 +^W *31 +TA-5C +x42 i4o +snb o0L +T8 T9 TB TA +o8[^D +o4| +*31 *51 +3 +i0k i1a i2m +^0 *20 +c i40 T5 +i20 i38 +'7 } +D3 sck +o1o x31 +x78Z1o5u +o42 ^2 +$a ,5 +Z2 c *53 +o2D +2 +T6 x83 +-9 +A +$. $b +^o sat ++0 ,4 +L3 ] +u ^2 ^1 +.5x7B^1 +^j i66 +$2 x06 +q T8 +iAux46 +i5s i62 +i7e i8r i9s +-0 $e +-A*A7$Y +x31 $m +z1 ^R +i5d i6i +^n $1 +i5> x81 x24 +-5 { +-5 } +-5 c +i19 i29 +T5 x81 +-8 $1 +T0 x84 +*35 D6 +,5$N +'6 ^m +^P K +q i5s +D3 o71 +i1n i2a +-7 $b +s!s*1Bst2 +z5 x36 +i61 Y1 +$u i5- +i1a i2r i3t +D4 $y [ +sBO +i1d i79 +^2 ^F +i0h i1a i2m +D8 ^k ++B -3 +^y +7 +o0T D3 +'Ao4* +s,3.A +oBPY1xA5 +]*A2spc +i6E k +.2 K ++2 +8 -3 +$5 ^j +i4k i5i +*04 +8 D0 +$T Z1 +^A *74 +C x82 +p3 .0 +xA3i0k +^d ^a ^e ^l +] Z1 o5y +i5O E *52 +s|9+2R7 +i3a i4s +Y2 ,3 +i2d i3a +i0j i1a i2c +x73 i6t +i1a i2t i3a +$n i5e +x1Br +i3g i4e +y1 *8A x05 +$@ D7 +$A ^5 +f T0 x5A +i70 i88 ] +i1e i2g +x53 Z2 +i6l i7a i81 +x13 o4K l +x54 $y +sn,*54 +Z1 x21 *01 +x65 $c +l ^i ^n ^m ^o +iA< +x7A^G*31 +x82 -1 +] T6 Z1 +Z2 x93 -A +$w -4 +sgl +y1 E xA1 +o0.-B,0 +x15 +2 +scD +7 +$2 $0 $1 $2 $! +i12s8( +Z1 i7r +x42 i4= +sk@ +i7x i81 +DAld +oA1Y1 +i89 i99 +i7l i8a i9n +oBK +o2q ] i3i +x23 o36 +i6e i7m +i6e i7k +t ^J +i9t iAo +i4o i5n i6e +o2g ^a +i1e i2l +xA6x1A +*42 l i5n +.3x24i76 +*43 $e +i4c i5e +s-/ +c T5 i5_ +$($? +oB7 l ++5 $4 +D4 D2 { +R5 D4 +o1o L0 +i4s i5a +$0 x32 +*03 ^z +x94 o9g +k-7^n +$A Z1 r +$x *78 +] Z2 o5- +r D2 ++7 -0 -8 +i1a i2m i3a +i4zDAZ2 +ssv ++4 +4 -1 +i6- o3- +R3 o47 +-6y4 ++3 -4 -8 +$r^0 +z4 x73 +$6$2$1 +o08s4B +*67 i65 +K x31 +*4ArT1 +Z1 } +$x $a +^4 x23 +x63 o3z +u D3 T1 +^u x53 +i52 i5f +x04}Z5 +$b -1 +o6b $m +$/ $7 +i7w x25 x51 +c o38 +$O,9 +*53 $a +o3IoAT +D7 $9 t +T2 TA +sl' +$w +4 +o7f D8 +i1r i2o +x23 K +i4c i5a i6t +i4e i5y +o3'] +*21rx85 +*1Ax5As8> +$1 ^z +i9y iAo iBu +x41 $h [ +sn' ++4 -1 +4 +$r -1 +$r -A +*19i9E +-A x35 +D0 *01 } +$! D9 +s^=x04*25 +k+7^J +^0 x12 +i7c i3a +s5@ +o7m +8 +*3BY1x42 +*35 o7A +i1o i2o +i7i i8n i91 +x7BiAH +xB2$;i6, +*04 p5 +Z1 x74 +$9 ^6 +K Y3 ++5 +8 -0 +xA7xA4sn4 +i4&x47 +i7e i51 +i58 R4 +i79 i87 +Z1 sua +o1a x63 +D2 $t +$a*73sb' +*24 src +*42 x46 +x41 [ $h +*25 *93 +i3t i4u +$2 $U ++2 -3 +8 +xB3*B8*31 +o7_z5DB +*61svI*84 +i77 R0 L0 ++B -A +C +i8a i9r +*76 ] ++2 +8 +5 +sK2x35iBr +*07r +i51 i30 +DB,3 +x21 { +i51 i67 +i1a i17 ++A-8 +D1 D2 ^I +D8 $! +i2r i3a i4n +i17 i16 +i5h i6a +cR4 +y3$4[ +i5h i6e ++0 xA1 +i14 i59 +DBx15y1 +ui8# +i5d i31 +x43 $4 +^0^a +i2c i3h i4e +*05 ] -5 ++4 -8 +5 +i31 i77 +i74 i3b +x68s/a +s`z*73 +i0m i1y +*35 ^h +$-$( +'6 i4g +^_ ^7 +i5a i39 +s[zo8U +*14*57t +s]CY5{ +K i0x z1 +^L z1 +i33 i5e +^" $" +i0p i1a i2s +i77 i3d +i21i39i46i56 +Ed +i2f i3a +x69T6u +i3e i4s i5t +i3s i4s +i3e i34 +,8 D3 +s6$ +o8o x12 +'7 -4 +i65 i79 +^y $y +i2g i3a +*81.A +*25 ^a +i2g i3h +i3z *62 +o4N x13 +$vsI6 +^e ,6 +$R x23 +to4S +i34 i59 +i5c i58 +x92T3 +i55 r +]s}/*61 +i33 i1a +i37 i3d +$=$/ +R7Y1 +^c $2 +*34sasx6A +i0p i1o i2r +$R p3 +i79 i85 +sod +i3s i4h +z1 o3_ +^6D9 +s$1shW +i0j i1i +i3s i4a +cx01Z3 +$# +0 +i68 i72 +Z4s zZ5 +xB9.A +i6w i7e i8r +i02 ^l +i0[ +i5m -0 +$Wt +i2a i3s +^f^c +sUKx06sw. +*8A-0 +i0h i1e i2l +xB3sgU +^e^b +*46 *60 +i2dx45 +*43sf1x9A +*87 $1 +KsYNo9C +s._ +s07^5sS' +^ho0.*94 +i7a L8 L6 +^Tx1BsCJ +.6f +i0b i1u +^B i1R +z1x83 +$N k +o6}s1- +T8 T9 TA TB +i4h i5a +*14o1C*68 +*17Eo9R +^-s1#'5 +kiA8q +{ *24 +spA +i84 ^1 x83 +s\Ii1H +smI +$]T8sL; +r+A +x42 i7P +o7o i9= x86 +} $o +sqb +s5>i0n ++1 ^Y ++5 -0 +8 +i53 i31 +i18 L1 +i8F{sF4 +o6h '8 +$x *54 D4 +s.0 +i1f i5e +o1) +i7e i8l i91 +x62i8? +$2 *78 +sHK +$. *40 x14 +[ i1e l +i7*Y1 +Z2,8sMs +s$%o3's a +*65 o2t *24 +$1$5$9 +KD9 +Ki9Asu0 ++8Ky2 +} o7\ +c $3 $* +i55 i5d +s=[i7NsM| +i4a i5n i6a +i7c i74 +i12 i1a +o4u *21 +'9 -2 +{ *31 +i2k i3o +Y3 r ++A K +s7M+1*52 +sSBs;4 +c $ $0 +o5d '9 +x83i14RB +i3a R1 L1 +l ^t ^a ^o ^b +T1 +6 +i1t { +d i3s +s@=C +.0*9A +r Z3 +K *62 +$+$. +k ssy +soBssU ++2 +3 -4 +smc +c $6 $7 $! +-As Ss.1 +x03 f ] +i5c i54 +^g *65 +sqds#.sI4 +Z5sJ)p4 +c TB +c TA +x73i38 +$1$2$4 +i12 i54 +i41 i59 i66 i72 +s8b +i5~ +i3o i4r +[ x51 +i36 i58 +'7 *30 +i1e R7 L7 +-0+C +.2 ,6 +T0 T9 T2 +K D7 { +R4 *45 R4 +,4x72 +T0 T2 T9 +x81 +2 +sHKTB ++7 $b +i9? +i1v i2a +u d 'D $9 +[ o7n +c d '7 $0 +^h o5. +i3e i50 +i5b i58 +c d '7 $5 +*0Ay2c +'7o9u +[ l i1e +c i89 +o52 l +q xA8 +x72*36 +s3E*18oAX +D0p1s>V +so? +$6 $e +o5] +l d '9 $1 +i7a i53 +] ^x +sCS*B7 +i1h i2a +c ^d ^4 +c ^d ^8 +i6b i7o +^E } +c $9 $3 $8 +$1 $9 $4 $6 +Z1 E +su* +xA2$6x41 +x4Ai8v +c i06 i18 +c i06 i11 +c i06 i15 +T8 x31 +x18o2Yx3A +*4A^d +siN l +i1; +x82$IK +o8g D5 l +s5(T7*93 +s_3o9n +iBy +i42 i50 i62 i77 +p5$E +t +7 $d +sMH t +-6 u +c ^3 $1 +o14 ^3 +^htxA9 +d 'B $6 +-D -F ++4 +3 +$7 *64 +c ^a ^3 +c $2 $5 $! +E^3 +o6# x51 +c ^b ^5 +*4A i8b x78 +iBksJp +c DA +R6-6 +c -6 +y5 x06 +o3^ +x28 ^( +*69 x34 +'D $7 +z2x73E +iAu,1+B +^r ^x +x52 T0 $@ +i1l i2l +i3a R0 L0 +^Ds@` +$c $w +d 'C $9 +x03 D7 +$y .4 +T8 TA TB T9 +uy5l +,3 +0 *56 +stl k D0 +o0M l +$w $o $e +*65 $n +*62 x01 r +.2 t +xA3oBqo1! +t x61 +$g*5Bx65 +r ] K +o2l -8 +sdr L6 ,0 +$6 ^H +i70 i84 +$*$@ +*69x35 +x32 ^Y +c $1 ^3 +i31 i49 i58 i60 +x59 x27 x74 +x45z2x32 +*B8s0e*74 +x63 sV* i18 +i1l i2u +szW +*84T9 +s0U sif +oAzsg} +o0Fsu+ +s2**60 +i1d i3b +i22 i36 ++2*1B ++A$ox12 +iBj$] +} ^3 c +x85 ] +x61 t +z2sg= +*45 $1 -4 +*40 x41 +i33 i56 +i1e i52 +i0o i1s +c $! sl1 +i52 i60 i73 i80 +T7 *20 +i5e i1b +x8A*07 +x38 ^I o49 +$0 *23 +$? Z2 +*36 x62 *13 +,5*15*23 +l [ ^v +x82 $6 +*16 L7 +o1i*27*B0 +i25 i32 +i0m i2d i1a +s(' i1b +'7 *03 +x23 i1b +sGa i2j +i72i80i92iA0 +.8x7B +i81 i95 +i3c i79 +]$n +x14x87y1 +l ] $U +i52 i3f +s26T5y1 +^n-A +c $1 ^- +x49 x47 +T6 x12 +o02s3O] +D4 r +{R6i92 +*02$8 +i5e i34 +x45 *50 +i6h i71 +[ x63 +k-4 +i36 i3e +i18 i36 ++9*A0 +s1M +*20 ^r +Y5 Y4 x18 +$.$# +i3e i31 +i74 i88 +^Y x12 +x53 oAJ $0 +i32 T4 +^8 *43 *A5 +c i03 i19 +D6 $j +i2i i3m +*6Bo21 +x02 p1 +'7 $U +*6BT5 +^m -7 +l ] $u +o3Fsh6 +c sl1 $! +i2n i3s +'8*89[ +i11 i7e +$\o7P +^z +1 +*60 x35 +$r *21 +Z4s.E +i92 iA1 +oARx15x7B +Z3*B7 +i8P +s;5o43 +lp4 +d x64 +,3 *56 +0 +Y2^V +i57 i1a +c i07 i19 +x52 $@ T0 +x03skK +Ex4B[ +*A9^p[ ++8d +c $% $1 ++0 p1 +i1o i2d +R6LB +y5sRBRA +o4KsRN +oBwR0 +^jx5Ax81 ++7.0 +i4K +x53Y4sw^ +^g D8 +x46 +7 +Z4 } +r i2r [ +l x42 t ++6 ^a +o6t -5 +d 'P +$a*24 +x59Y5 +i2m i3a i4r +p4x25T9 +D0 D6 +i49 i52 +s6e +i2b i3i ++0 i5g +$7 $9 $1 $0 +T3 ,1 +x31*16*26 +i6t x36 ^d +smV +*41 *43 +r $z +[ ^H ] +i41 i59 i67 i70 +T3x3Ax98 +-5 -7 -8 +sWOD9o5a +i38 i57 +$C -1 +$0 x05 +i1l i2i +$. $c $h +^R x25 +D8T2 +so0 T2 +c ^T +^S u +snN +z5 } +l ^t ^a ^c +sO]$b*94 +Z1xA7 ++5 K C +sfD +D2 x31 +z2 *34 +z2 *30 +i6g t +*50 *04 ++4 D3 i1l +i78 i7d +cs+!*36 +] u Z1 +i3b i73 +u T1 D3 +^d $s +c $4 $u $s +i66 i72 +-9 i6- +]o9B +,1 $D +i3tiA_s/C +Z2 $2 +^P Y2 +} z3 i97 +x2AZ3s/= +tsa1i0S +*40]iA8 +D1 C +*10 ^9 +x24 sa. +i53 i60 +Y4 x15 ++5 C K +,4[*96 +x64 i8! x6B +] x53 } +o4 x54 +i31 i49 i57 i60 +sY!y3 +x72k ++5 -8 -6 +x02 ^v +$^sx7+9 +sz8 +i2p c +^y ^b ^b ^o ^b +x92 $6 +ETBk +i23 i34 +T2 T7 T8 +i3b i75 +^k ^l ^i ^m +D4 R3 +$M r +*57 .6 *53 +T3x29 +i21i39i48i55 +D7 x32 Y3 +s#dLA +sku ++A +A -C +$5 x12 +k $h ++0 *32 } +swko9C +x03 R2 +^o '8 +i1i i2z i3z +C ^y +k $v +*43 *35 +*14 i2v +l i1b +o7_ x12 +o2@o0q +iAT +k $_ +$_ [ +$T -4 +C s29 +i2i i3c +x14 ^3 +o0QD9 ++2 p1 x23 +o5*Z1 +i0M i1A i2r +xB9k +srG l +srR +*06x12*B1 +i6u i7l +srb +rZ2c +$. t +s3A t +c T4 T6 +*32 $6 +src +5 +o0h i2i +z1 -5 *31 +i4c i5o ++C +C -D ++2 z1 +s03] +*61 x61 +6 ++1 -B +i1d *65 +i87 i96 +k o6g +x12 o4a +i62 i71 i82 +*21 suo +} o2_ +RB*27x13 +x14 $3 +x34 ^u +*96*37 +f x78 D7 +*89oB( ++4 +4 +9 +s12 oA0 +^s *24 +x14 $k +i69 i78 +i1o i2l i3d +i5X l +$h $e $r $e +i1o i2l i3i +i0k i1a i2r +K *43 -5 +i7e i31 +x2Ay5 ++9 -4 -4 ++A -C +A +u $3 $2 $1 +i7e i8e +^l c +i8n i9o iA1 +l ^i ^t ^n ^a +*14 +3 i2w +s 3^yxA6 +i7d i5c +[i5+ +o0E *65 +y1 ^P ++4 i7S +*15i9giBQ +o4S x52 ++0 -4 -2 +x02 $1 Z2 ++9 -4 -0 +x46 o3s +*B6o75 +i7s i84 +$f $C +*21 x36 q +i0a o6c +T0 TB +^, c +$7 $2 $! +} ^k { +s+;$P +i1c +2 +i5k $2 +s@}*94 +o14 p1 +^e ^d ^i ^s +^A x63 +l *74 +*62 x45 x35 +o74 $. +^1 ^_ +seu ^w +[ T0 -9 +x84Z3 +i7s i8a ++6 -8 -5 +*07 *34 +i82 i95 +t $$ Y1 +^5 T4 +$x $e +T6 TA T8 ++9 -0 -4 +x72 o74 +-B -D -D +k D2 +$0$2$6 +i30 i52 +c $r +u ^9 ^9 ^9 ^1 +rCr +$Ds&\ +K t *45 +$3 $4 $@ $@ +i1f } +o38 x72 +Z3u +i5r i6i +z2K +T5 D1 +$x $b +sS%xA3s2{ +$o*A6 +o0E +0 +c $0 $0 $8 $! +-2 'A +x49Y1+3 +i2n i3d i4i +'8 x61 +ssJ^k*90 +T5 D3 +x0A*35} +,6 x23 +$x $6 ++3 +4 -1 +x93s{l +^e *16 +L0 x12 +l $s $i $d $e +c o36 +*78 x31 ++0 -2 -4 +sD}z4x65 +Y3x17 +i83 i91 +i83 i93 +T5 z2 +$$ $% +$7$7$1 +} ^6 +i4e i5a +$p Z2 +Y1Y2oAs +o4qTA] +x23 ^V +$2 $0 $3 $1 +x85+2 +iA1 ^! +-0 -5 -7 +i47 i55 +^g L1 +$0$4$3 +i2k x54 +] ^5 f +*39.Ax86 +$% $5 +x19r'9 +s.m +spP ++8 -5 -7 +i2n i3a i4n +T3 T7 TB +*47 ,4 +] i0W +c $9 $9 $? $? +*43 ] *20 +[ -9 T0 +^NCx48 +x96o9BsnY +y3 } +i31i49i56i62 +i7d i16 +Y2 ^V +x31 ^c +i7f i19 +sn} +f*03.5 +i31 i13 +i2z i3z +i5a i15 +T3 $2 +o1H u +'7 o5. +u d $9 +[x95u +s#i +o8/x59x39 +sS7y5 +$k D5 +iAZRB +D7 Z3 +i48 i51 +*73 o59 +i1o i2c +o7i +3 +D7 ^n +f D7 x78 +o0p t +i79 i3d +x26 y3 +i91 iA9 +x01 sta +$1 $4 $@ $@ +i1r i2u +i88 i92 +xB4.B+4 +l shj +i5g i6a +i16 o21 +Z1 i81 +^V $8 +*50 x56 +*78 s71 +-4 *39 +o3OC +o48 K .9 +D9 [ +D5 -3 +L3*AB +-5o14Z1 +x94x32 +c ^a ^D ++8 *42 +i1o i2u +*4Bo07x12 +saj +$L Z1 +^c^c +i1b -2 +i3d i50 +'A -7 -7 +} o7u +Y1r +i3d i51 +-1 $v +*3AoB1 +x6B*83x7B +K ser +i1i i2v +^q *01 o0j +^f '7 +*1A 'A +i7r { +x5Ap1 +*46 Z1 +p4'9sGO +x06r +smZ +ssL +^BT7xB6 +$m -0 +l $6 $2 $6 +-4 } +$c $o $o $l ++7 i6y +i6t i7e i8r +-3 smu +$=sF< +sb5o2W +$f +1 +$i[ +o5;sHL +i7a i13 +*12x2B*3A +l $1 $9 $9 $3 +*21 i50 +-0 -9 -6 +i52 L5 +l $4 $4 $4 ++6 -9 +7 +i6p-9 +x53l*70 +y3 -6 +$p $a $n $d $a +$1 $9 $9 $0 $# +-4 u +*02 x35 +$>p5 +o3x x12 ++2sQAx0A +$U o8s +i2} +i4n i5g +i1b i5b +i39 i3f +iAjT4 +^* ] +x13 d +i4n i5e +x41 [ $w +LBo2FsFC +$q x43 +i7f i71 +xA2s0B,9 +o6r t ++4 i66 +c $e $s ++6 $+ +DA D9 +i36 i46 +o1&x4By4 +x32 '8 +t *02 +,4 -4 +^_ ^8 +o40 *32 +r ] *45 +*04 $p Z1 ++0 +6 +3 +C*42 +s9jY2K +o4 t +$9 o84 +c ^A ^A ++9$>,8 +csQ/*23 +l '7 $1 +D0$d +$1 $9 $9 $0 $+ +-9Z1*34 +*13*87 +i4k i5a +z3T4 +'8 o1w +[x71o5k +$E [ c ++6 $j +-2 ^s } +t o5d D0 +p4s!a +c $3 $3 $* $* +$<$+ +{ *45 +s[sy5 +*17 *73 +s7D +*81.2 +i1b i5a +,3i0` +i2c i3e +$? $! +T1 [ +z3 x63 *42 +D2 i3h +^x$xu +$p -4 +i7k i8i +-8 ,4 +lY3^k ++0 +3 +6 +ry4*2A +] i09 +o67 Z2 +*69-1Z5 +$w o4N T6 +i31 i11 +x35 p1 +x15 d +D6 x57 i1o +iA+ +i1y +7 +*57 *53 .6 +.3x82xB9 +i5h i6o +-0 sgc +Y3*85 +c o5@ +D4 $u +^3^c +}^1 +-0 -6 -9 ++7 *48 +o8] +'Bo7-scB +-0 $c +l i94 +$m ^k +x21 y4 x43 +sBZ +i12 i1e +^6*95 +i4a i5l i6l +sIH*28*31 +to64 +so0 se3 si! +skb +$l $i $k $e +s?Xi52o79 +^ms&\ +R9s/cx37 +c $7 $6 $! +t *45 +] o56 +Z1 x95 srz +i3j l +$-$! +i82i90iA0iB3 +^c^d +i52i60i70i89 ++5 +7 -8 +]*30+9 +i31i49i57i60 +D4{ +$c.B +seO u +o3[ x12 *01 +*41+1x1A +$y K +5 +^a ^i ^d +-9 -D +KsP_Z5 +i8K x42 +x83 'A +D0 -5 +i5a i13 +} soi +s6C +[t +sqGoB\^D +i27 $a +1 +c o2y +x31 o0Y +^a^c +xA8o9y +xA2 i7c +] y5 +x72 +1 +Z5'8 +$3 *12 +Y2 $Y x71 +x25 f +*A6 -6 +x2A-5L3 +c i07 i13 +[ [ [ c [ +i5a i38 ++1*B7 +t $6 +x18sn5 +-2 *63 +i6n i7a i81 ++7 r +$. $x +x51 ssS +u $3 $3 $3 +i46 i55 +i3,,3 +xA5sScx97 +i3e i38 +xB3 DA +i5e i39 +i38 i5a +'6 i4p +i7b i73 +*83 K +$%$( +$%$) +i65 i75 +l ^5 ^9 ^9 ^1 +iA> oAr +x71 '8 $g +Z1 srz x95 +$_ y4 +sbJ T2 +-2 *75 +i65 i71 +sbL +Z3*58x01 +] iB2 +C $x ^x +D5 o5N x71 +] $2 +o5o o2r +C ^x $x +*04 *07 +s7# +s20'B +x47q +i1a i2v i3i +c $5 $4 $! +c $2 $2 $# $# +*62 x43 D4 +i7b i70 +$Vo9' +]y3 +o79 -6 +x15 $5 +T1x53 +l x75 +i2fo5%x18 +Z1 -0 -0 +^_D7 +Y5'8iBn +*62 l ++6 -2 -4 +E oA3 +'7*9A +'8 *72 +i3c i4a i5t +$6 $6 $@ $@ +i3e R7 L7 +i5f i51 +x14 { +*4Bi7` +'Ao8C +^c^9 +t'7 +c $9 $6 $! $! +T2o9Q +i6a i7r i8i +$y ^i ++A -0 -0 +D7 l xA3 +i7#qs}m +s4lk*62 +x69co2k +i3c i33 +^a^6 +i5c i31 +i7o i8d +i61i79i88i91 +x62 l ^M +x92 $& +x13 l +iA# +p5 i50 +$z -4 +y4x3Ar +*59x58o0E +x23z2E +^c *40 { +seax16sza +soh +i51 i10 +sVX +^f^2 +c $4 $2 $! +*A1x07 +$6 $6 $! $! +^5^b +o6'$2x57 +i12 i3a +x46sx@D2 +,3'5^6 +y3s9V +]x3A[ +t,9xB1 +i1o i2n i3i +*83 $_ x12 ++C -D +C +.6 l +i13 i51 +{ s1h +^. ^7 +*13*46s5i +Y2 x71 $Y +o9Fs0_ +$T o13 +slY^@ +i1c i12 +i6n i7t +^5^a +*18 D8 +$? D5 +K i4a l +s!.$dx32 +x68 *34 u +x24 D3 *13 +i6n i7d +x51 K +Z1 *76 +D1y4*40 +u*76oB{ +s-(x89T3 ++0 $C +c $2 $2 $4 $1 +i31 i55 +i1i i2n i3k +Z4x6A,6 +$8 *68 +xA9ksNy +sDx$n ++5 -6 -8 +*02L2 +'8 i02 +$2 i2a +.8T6'7 +p2 -2 +i4i i5e i6s +*73 D1 +*38] +qx52 +C$f +i75 i7b +.1 *04 +oB$*0BC +i6r i7s +x89 ,6 +l i4d +*73*01 +s1y +[ o06 +$v o0J ++5 -8 +7 +T3 o2C +up1 +s%asUc$_ +s06 +1 +^mx84s^D +x03x81 +i9<-2'B +sLrs.z +i7a i5f +i76 R0 L0 +-3 D2 u +x13 ^1 +$C $4 +iBX +i6r i7i +i1a i2d +Z5x7B ++6 -0 -4 +o6#iA& +i8e i9s +*07 *3A x19 +*94x75 ++4 -6 -9 +*47 *36 +fusaj +*97$u +$j r +si3x03 +i2o i3r +o0e Z1 k +i52 i60 i72 i88 +-3-A +s9B +^ZR8RA ++3E*BA +c $0 $8 $7 $0 +i1q ] +i2o i3p +,7 *53 +x42 sdp +i8J +c ^2 $8 +i6o i7m +s9Li9_ +i05 D3 +D5 x71 o5N +p4 *32 +$9 $6 $! $! +x82 +7 +y4 x46 +x61 -1 +s7ys7) +ssZy2 +*61 u +i67 i72 +o9e K +$=$& +} $n +x37 T0 -0 +*01 i11 +c $8 ^2 +'8 i43 +x45 i0L Y2 +r $R +i67 i77 +Cx32 +C $5 $0 $0 +sasC +$b x56 +*90o2Y +l '5 $5 +s6g +$0sGk.4 +o1^ +$9 $3 $@ $@ +$A x24 +i8}i7Q +i2c i3h +,9sZ9 +c $b $a $l $l +x41 $w [ +d x17 +i2p i3e +sby +saRD0 +'B ^1 +.1] +i5b i51 +^eiA' +i1' *23 +D0 ^N +s0Y-7$g +o8B x02 +T8.9T4 +Z4xB2*83 +*53*57RB +o6i ^g +i5f i54 +}s#hi1d +i12 i73 +Z1 o5c +i7e i11 +x04 -5 +i51 i34 +xA9^h +i45 i59 +oA3 'B +xA1R0 +*56 *35 +i7c i71 +$x x45 +sHJ +i3d i7c +p5 i2F +c si! sa@ +x71 c } +i53 i33 +i38 i18 +x95i8d +'4 $6 +l ^l ^l ^o ^r +i68 i70 +o4x Z1 +o7S [ +sCS +c $5 ^3 +$j x12 +x03 ^@ +i3 D0 +x8Ao9z +i68 i71 +s1F'BsX6 +$7 $# +x82 +1 +i5c i76 +st@ +x93s8+ +-C+E +,5 ] +i5f i52 +$,$? +*18x17 +x34,B,1 +*5A,0sho +$_$^ +D2 sgc +i2b i3o +i9.s"j +^2 z2 +*8AsLJ +s?4x02 +T0 *03 +i7x *67 +4 +s7A +x84*16s!Q +i3c i3b +i21 i39 i49 i54 +K -5 *43 +x13 *03 +iAeE} +'5 Y4 +i7a i55 +{ ^k +i17 i1e +T1 +4 +x68 u *34 +r*1Ak +i2i [ +0 +-7 *03 +Z2 o9m +i3c i7d +E $R +*60ksL+ +] x01 } +i31 i49 i56 i69 +k sir -2 +$?$* +,Bx15s/9 +i15 i56 +skm -5 +x19*0B +y2 o1o +CsVqx53 +l '5 $1 +*30 ,7 +co13 +$1 $7 $! $! +sh7 +*20 } +i82 i98 +szao9vl +i39 i50 +T4p2 +]L8 +c $8 $7 $! $! +c D5 +x65 $k +^o -6 +x12 Y4 +o3K u +y3slIsrJ +D7 $D +$1 $6 $* $* +c i05 i17 +i61i79i88i98 +l $2 $1 $2 +*64 +0 +o04 x13 +c $3 $1 $! $! +r *45 ] +D6 o1f +Z2 x34 +$7 .6 +x79o95 +sL2 +$b $r $r +D5 x4B +Y5 x6A K +i41 i59 i66 i71 +i41 i59 i66 i76 +c $9 $5 $@ $@ +i21 i39 i46 i57 +s3g*3B +x89y4D9 +$* D7 +*62 D4 x43 +s2G*19 +Y3Z5x69 +x7A x72 +i51 i1b +$m z1 +$1 $5 $@ $@ +$i +6 l +c $3 $7 $! +i1a i2m i3p +o3e*68*40 +i7i i8l +s3P +.2-2 +$3 $4 $! $! +$e o0F +C 'B $1 +*13x78 +$z $1 $2 $3 $4 +srj K +o1I T2 +*71 x65 +c $6 $6 $* $* +$7 $7 $! $! +-3s8h +c ^1 $@ +l $a $b $l $e +'8 o12 +T1 o2? +x03 $w c +i38 i42 +i41 i66 o59 o78 +c $0 $9 $* $* +{koAY +*21 *56 +i2g *30 +i1_sT_ ++1 ^2 +i73 i7c +x92i8g +i7a i8g +$s *17 +i41 i66 o78 o59 +$2 $8 $! $! +i6n i7o i8v +Z1 ^W +l $0 $6 $0 $6 +'C $8 +s6ot*01 +D7 xA3 l +^Q*58 +i35 i3d +o6f o8c +$1 $8 $! $! +x51 -8 +Y5 { +sI]*27 +-6 ,7 +D5 .4 +sy$ +c $4 $7 $! +'8 o3i +o49 *13 +i6b ^G +Ky3 +z2 ^D ] +^b ^u ^s +$/ [ +i3X +sCD +i5f -4 +C '9 $8 +.0 -1 +sCY +$m x34 +o0t $! +s.-xB4oAX +*43x75 +sL@z1 +C *78 +i50 i60 +x71 o81 +-5 *40 +i54 o67 +smg [ +t *65 -7 +$f $o $p +x72 ] T9 +i16 i31 +$g r +*21p2s"V +i71 R0 L0 +skos56 +K l i4a +*52 x45 +^3 o16 +o2V [ +x15 i51 +z4x93 +c ^c ^2 +o72 o61 +i1a i52 +spD,8i0n +{ ,8 +$ +Bsm? +c ^d ^5 +i5d i76 +$9 *14 +*39 *54 +$2 $4 $$ $$ +'E $9 +i15 i72 +i15 i75 +*02,B +xB8o1y +oBN +i4l i5o +i41 o59 i66 o78 +*06[s\m +*A3Y2.5 +DA D9 x37 +x21 .6 +-2 ^w +*57i3t*A4 +cxB4TA +$2 $9 $! $! +i2s i3t +$D $S +,8 *75 +Z4 x43 Y3 +^n K ++7 sfb +xA3 ] +^9 z1 +$g l +c ^e ^8 +-1 r +c ^e ^2 +,3x37 +r y2 +-8 x16 +D8s3*^7 +i0wsK6+8 +i5e R7 L7 +i41 i59 i67 i75 +i51i69i78i89 +$3 -9 +T2 T9 +l-0s;7 +c $9 $9 $$ $$ +i7d i3e +c ^1 ^b +-6 *85 +i72 i1c +c ^3 $5 +$j $u $t +$8 $7 $* $* +'8 D4 +6 +Y1KR6 +swK +T1oB8$x +sn@+3 +sy[ +$p $y $x +z2 ] ^D +$kx83 +i6j i7u i8n +s-$ +x97$Q +smo +c $@ ^1 +ssk$l*B0 +Z1 i4e x71 +i9> +R5 Z2 ++0 *86 +i7c i73 +^a ^m ^a ^m +i32 o75 +i8D c +iBx x65 ++0 *16 +i3n i4y +'7x62 +-6 ] +i35 i51 +*02 z2 +o4i*50 +}x81 +} i30 D5 +sAB +o4t *73 +x34D2*57 +o2t o7b +c ^a ^0 +Z3-A +i56 i30 +sKY +i7"*2BZ1 +$4 $4 $! $! +i0c +o9u$E*48 +oBps_6 +T6 TC +i30 i72 +o0ux06*97 +i75 i1e +i4~ +*42 Y4 +c ^0 ^c +i89cu +x51 x25 '6 +*84p1y3 +D6 o0w +x23 $t +C $x ^x $x ^x +*43 [ { +c $3 $3 $@ $@ +x35 x1B +C $x $x ^x ^x +'D $9 ++8 Z2 +C '9 $5 +i2s i3h i4i +x45 l +x65k +iAw x26 +$($^ ++8i2z[ +Y2 { +*73'8 +iBP +i3a i37 +x31 *61 +s;xsJX +*2B x46 +$8 o1u +sh4 +T6 ,5 *43 +*71$h +i22 i30 i41 i52 +C ^x $x ^x $x +C ^x ^x $x $x +i7e i78 +*93x72 +i3e i32 +,3 i6c +i55 i3e +x68o8% +u 'E +i22 i30 i40 i56 +^E *26 +$%$! +l $1 $9 $8 $8 +C $x ^x ^x $x +D4Y2 +sCQ +i5o $k +x13 o5e +z1 l x62 +o5?.7 +C ^x $x $x ^x +srD +k R0 +x54sn|*90 +o09 *13 +$9 $1 $* $* +x3A*65D9 +$2 $6 $! $! +c D3 +i73 i89 +C T3 +sRh*02 +*03 $r +$5 $3 $5 $8 +*45o0I +$8 $8 $$ $$ +sl7 so0 +*12x54Y5 +*10c +Z3Y3 +x41 o4y +T0 $o $s +$4 $4 $$ $$ +y4x79-9 +} p1 x43 +i4r u +i93 iA1 +i0s i1i i2l +x45 *23 +c $1 $> +x19svuo5D +*29i7rl +slz '6 +r *65 x32 +z1 $n +i45 i51 +x51 i5N +x45 Y2 i0L +i67 *53 +$5 TA +$v D3 +$B p3 +i6g i7i +i4s i5t i6o +$2 $5 $@ $@ +$u D8 +} D1 +$*x45.B +i4p *57 +*63*20x96 +^PxA6 +ET4 +l $0 $0 $7 +d i5n +*34 $c +i7c i78 +,8 { +'8 *45 +c $3 $4 $! $! +*52 x05 +Y2*68xA6 +,1 x34 +*79+9 +sCU +i72i80i90iA4 +[ [ [ $1 $2 $3 +*53 *72 +o8qoAA +i1e i35 +x53 -9 +$1 $2 $# $# +$0 $7 $! $! +T4 o0n +c $0 $0 $@ $@ +$. $m $m +o0os?U.0 +i22i30i41i52 +$1 $8 $* $* +x41*63*6B +$4 *86 +i79 i83 +i02 i18 +i6t i7t +$w T6 o4N +i1b i3d +'9 *53 +suo o39 +i89 i97 +$1$2$3$4$5 +o5d *87 +i73 i5b +x98x8B +i7x +4 *67 +-0 -7 -5 +$-$? +^D o4m +x38 $6 +$6 $1 $! $! +o2n d x58 +$? Z1 +T7*97xA8 +i3u i4r +x35 $_ +*21{ +*B6x63+8 +i1c i7e +lx31sLP +i33 i49 +i0g i1a i2r +i7o *35 +s3L [ } +l ^s ^i ^m +$# ^1 +i37 i12 +$8 ^@ +K i8l +*43z1 +[ i32 o23 +*2B x94 +$8 $4 $2 $1 +L4Y1 +z1 ,6 +*35 -4 +z5x27x2A +sHPo5C +s?$*23t +.7s>'*A5 +i22 i30 i40 i53 +s+y,2i7* +i52 i39 +*35Z2x32 +K *45 t +o67RB +^@ +1 +x23 Y4 +sdh *46 +D3 E +sTP +i5f i3c +*59x96o7o +*81 *72 +T5^Tx58 +*6A D7 +-8 *7B x62 +oAF +$9 $8 $1 $0 +i3xxB3 +$1$2$3$4 +k ssS +i27 +1 $a +$s $a $h $a $b +[Y1] +s;jz2s2L +i1t i2o +*64 +8 +i5a *50 +D3 $? +x74 E +i31 i76 +[ i4* +l [ ^c +} sbB ] +i39 i52 +'5[y4 +c $7 $+ +x34 Y4 +-2 *03 scu +s!Y ++5*75*32 +,7 o1g +i8r^2r +i64 T7 +o3e *13 +-9 D1 +$1 $2 $3 $& +sy(k +i4r i5s +x01 sl. +T3 TB T7 +i31 i7d +D0o3 T7 +L6y5x79 +p1 *50 x25 +i4m i5a i6s +i19 i20 +i0j z1 +o74 D3 +i6k i7e +*32 E Y1 +i98 iA2 +*09xA2 +^x ^2 +D8 o2d +} T6 +s1+ +*89 x04 +i50 *86 +[ [ c [ [ +i50 i60 i72 +x76^LiA< +i62 i76 +t o57 *67 +Z1 *21 +*31 ^D +s01 ] +*04 r +i3i i4r +y2 o6E +z2 i1n +*1B$os#s +x23 Z1 +$7 $7 $* $* +i79 i5d +i1o i2u i3r +T6 T8 TA +o6J l r +i5;s>? +s|2i9%*26 +i3w i4e i5r +Y2+5 +s5U +x82o4ETA +i1a i2v +i3i i4l +i8s i91 +x61T2$i +^B t +i7f c +t *67 o57 +i9w +} p4 +i0L Y2 +x41 *23 +c $C $C +*43 *20 ] +R2 R3 ++6 -4 -2 ++6 -4 -0 +T2x79 +t T5 +i3f i5d +.6 *35 +i7w i8e i9r +sz9 +i32 i11 +i59 i32 +D5 +2 K +Y1D8s6\ +p1r +x13x78s$^ +c o7# +$c [ *56 +,9 T8 +o9/ ++6 +7 -9 +$m o37 +o4` +i1a i7o ++0 $E +*50 x26 +z3 x38 +D9,7 ++8 -7 -5 +i2t i3i +l ^x ^a ^t +c i04 i16 +^y ^m ^4 +s5q E +i1l i2e i3x +D7 x14 +l $2$0$1$2 +D5 .6 '8 +o71 o6j +i5i i6o +sl- x31 +i58 i32 +o7s i6t +i3i r +i1e i2n i3t +T5 T1 +x51 x3B +i79 i81 i91 +x21 $k +i8n i9o +l 'C +i32 i15 +i5i i6d +sWK +o6J r l +^#sHA +y4 $s +*87*54 +o6z Y1 +*09+4p3 +i6a i7p +*06 o3m +c $1 $2 $$ $$ +i1a i2n i3g +*58*96*62 +L0 ^w +o2p *37 +c o7r +x72 ,4 +l -6 +3 +k o4c +k o1P +i78 i88 i98 +Z2 +3 c +i5e i6y +i2t i3o i4r +i3m i4i +$!$, +r*A8.6 +{ i8V +xB2 l +i7n i8e +^Z Y1 +^e ^k ^i ^l ^i +i7n i8g +-9{sks +i7Y +i2r i3o i4n +'7 .4 +s,_i4A +[ o23 i32 +$# Z1 +-6 -C +xB2.9 +-0} +Z1 p5 +c T6 T4 +s5l p5 +i3a i4s i5s +*53 -7 +*9A $3 +i5y i6o +i8@RB*59 +*46 D7 +o71 Z2 +k -2 +s+c +l $9 $1 $1 +x01 i8i +*65*39 +,2iBG +y4 x86 +t -7 *65 +i9e iAn +R1x64 +T4 '9 +so0 si! se3 +l s1a +o86*53o9F +l i0M +z3*8A*83 +D5 '8 .6 +sbS +i6r i7s i81 +^Y x23 +Z3 x74 +i34 [ +i0c o5m +^V x31 ++D -0 +i11 i22 +'8 ^4 +T2 T8 T7 +-2 scu *03 +T3t +o4b c +x31$8 +f x39 +o8[ +'6 ^h +*13 ,7 } +c i52 +^1 r *02 +x81o5yo93 +x74Z1sw\ +o38*A8,3 +LBo70 +^G z1 +^r x16 o2x +i3n D5 +$ $_ +i8i K +k *34 +o5f $z +x21 +7 +c *25 +i5t i6e +i1a i2r i3k +z1 x62 l +i7Sx5BK +-7 $9 +r $w $o $o $d +*73 x24 +d ^a k +T5 K +q.7x79 +z1 *31 -5 +i6e $. +o5 +6 +svRi9@s=s +D1 $o +x41 +1 +i3b i4y +Z1 *31 +i2e i3t +*32 Y1 E +$6 $@ +x73 -8 +-3 '8 +$z o7z +s3H ++B -E +*05 ^o +L3 p5 +*B4sE!xA2 +x83 s&0 x8B +} ] sbB +y2 x48 +s3n +T2 '5 Y5 +z1 y2 +] o50 ++1 } +i3a i4n i5t +$3 $3 $! +rY5] +i3k i4i i5n +'6 ^p +i6p i7e +R8suis1d +xB1o60t +o2u o3e +slG +sAZ+2x41 +o0e *31 +l^A[ +xB4 ,9 +x14 D3 +i2l i3s +x25 $S ++A*34 +i8AxA5 +o4V x52 +y1 o1Q +^i o2g +T6 z1 +o9w l +$_ $* +szl +r o1a +i45 o58 +$i l +6 +xA9 x96 +D5 K +2 +sil +'9 D3 +C $e +$1 shS +shr D6 +i3a i4r +D4 +5 +i3d*18 +s8mspV +,6 t +sa3 +o99 -A +-0 $E +i7e i34 +$y x64 +] o9B +s.9f +^N $i +*58 x06 +R0 R0 +K ^y +i33 i57 +[ c [ [ [ +x54 z2 +iBf^8 +$3 $3 $# $# +s5w +c $8 $8 $$ $$ +c $1 $9 $* $* +o4i T1 +x73 o9o +*68 o0k +xABo3Ss_G +D7 o1h +$. .0 ++3 -1 +4 +i4n i5d i6a +o7o .6 +c $1 $2 $3 $= +i9Co0ax28 +xA6z3y3 +x34 *13 +D3 [ +i1b i13 +i76 i83 +} sey +i5n i6i +x54 x21 +*45 p4 +i0w i1o +*31 p5 ,5 ++6 -5 -8 +Y5 c ^4 +i71 i1f +^bsZ? +x54 $t +$3 $? +s0k +x21p1 +-3 u D2 +i8%t^b +T0 TA T3 +x74 o7S +stl l +Z3 x36 +$e +B +i2i i3d +o0z t +x15 t +iA- -B +i20 i31 +$# $$ +EL8c +c $7 ^3 +x46 x75 +sbs ^j +^W z1 +ss0 +i43 i52 i61 +c $, $3 +x51 ^i ^o +^U t +x27*80 +o59 *98 +i76 i1e +'7 $J +c D1 +[ T7 +'7 $W +c $3 $D ++1 -E +z1 i4_ +r ^% o0c +kls*K +i4i i5a +*A5 '8 +c $1 TA +i75 i3d +i57 i62 +i2t i3a i4l +i0f o15 ++1 +4 +8 +$i $e $r +*A0[-8 +D8x15 +o96 Z1 +i57 i63 +i31 i50 +$&$> ++B -A -C +c $* $7 +*71 D2 r +i7hx03 +D2 ^W ++8 o4l +,1*37[ +$/ x52 +$@ T6 +i1u i2f i3f ++3 -4 -7 +i4m i5i +$i $a $l +sO+Y4x6B +i1r i2a i3n +-5 Z1 +*63,4 +u [ T3 +Ky1 +D6 $5 +$)$^ +x67s,AY2 +*43 q +i50 l +Y4 o1u +lsex +} i40 -3 +z1 *25 +i76 i16 +l x56 +Z1 z1 +-6 K +$- *37 +'6 sND +t*70 +i7r i8r +o5r Z1 +c d '7 $9 +i6vsq} +x76'4 +o8+c +c d '7 $3 +sRe +$H Z1 +} -3 i40 ++0 D7 +^/ z1 +*64 D7 +] o11 ] +i1h i2r +{ o6t +x84Z1 +i92 iA8 +$1 [ shW +i1h i2i +i0Qi6!s=A +[ Z1 o2u +o6Wx03 +x75o2C +o7z o8o +{ x21 c +-6 k +{s;.iB# +-2 ,7 +c d '9 $7 +i36 i5a +c -B +T1 T5 T9 T3 T7 +x2A+4 +i5Q +$6 x05 +$2 $1 $2 $5 +^T i0P +oBSi8'i7r +i9r iAe +o5VsVn +$1 ^2 +t,A +i2l i3i i4n +i5n i6e +i5l i6i i7n +y5 x81 K +o72 Z2 +,5 x64 +i7r i8i i9o +i3f i1d +} o3y ++4o9" +soy t +k T3 +T0 T5 T6 T7 +sfF T4 +*65 $! +^g ^n ^i ^r +,2 *65 +i2e i3d +*92$&i9U +i59 i68 i79 +iA' +l x83 +Z2 i1L x04 +i5u *68 +i37 i42 ++1 x45 +s8. +rZ2 +x08 D2 +o1e sdh +c $! ^7 +$! i85 +s-+ +y3 o5s +$- D5 +o8P$Ct +o0t o1o +i5r i6a +*73 x69 +$5 $G +x82 Y1 $m +$k *7A x35 +f .9 +T0 T7 T5 T6 +u ^x $x ^X $X +i3m i4e i5n +i6i i7n i8a +.6 i8a +o2jk +*32 Z1 +D5 $R +sAi +*08 x47 +i38 i51 +s 'sjC +[ T9 +i4w ] +o1% +'AZ2*01 +o1e $7 +*27 x43 ^p +KiB5 +o4^ +Y3 x8A +i54 i60 +x01 x54 +y4 D8 +o0d i1o +y1 'B +*28^6 +^#*28TA +x34 l o0k +x74 o74 +$e x63 +o4CsZO*45 +L0 c k +^1 *32 +*91 x35 +*85 x23 +xABo9> +o5| +i9( +s;oL9 +s0E-9 +*1A.2shQ +*70 x56 +K *83 +T5 Y2 +*01$]t +$9 t +i57 i61 +o3d ^z +s5e +-1 *52 K +T6 '9 +-Bcy5 +$.[ +$7 $+ +iAo x96 +o9a x43 +$2 *02 +i6h Z1 +-4 $g +T0 T9 TA +T0 T5 T7 T6 +i8R ,6 +Z3 p2 +c $2 $7 $! +i1r i2a i3z +$gx98 +k p3 +5 +$8 $x +*65 D9 +c ^3 $7 +i50 i60 i70 +x73 [ +x81 x48 +L0 ^f +.8 ] +-0 -5 -6 +x62*03 +D0 'A E +*A5 *B7 '8 +i2So7v +l $f $o $r $m +t o7K +x14 i1H +[ o6/ +*21 o28 +^j c +f x26 +KsQHi7u +K *47 +o6x Z1 +*B5x58 +iAZx26Y1 +cx91 +l ^r ^a ^w +c ^d ^2 +i0F *23 +,7p2'7 +$O Z1 +i7h -9 +*76 $5 +sfH +oA4D7 +iAW +x32 o20 +c si! so0 +i7d i19 +*A7s7v +x52 Z1 $q +sm. +oA3 Z1 +R0 ^# +l Z1 +o2S T1 +sRD +i54 i5c +R0 ^B +o0m T4 +C*68 +i5s i6t i7a +*46T6 +i2l i3e i4r +i54 i5d +q '9 +K *50 +^M ^G +i3a i19 +*12 *42 +s4c +$!,6 +*04 x41 $n +$i ^H +]*62 +i8k i9e +[ { *35 +i0;sjU +x85D8$L +x48 Z1 +*27 ,7 +{ c x21 +r o0g +i1o i2c i3k +x17 ^r +[ D1 ^v +$C x12 +L7 o6h +i31 i49 i57 i65 +i42 i50 i61 i75 +o0z -9 x53 +$5 $8 $7 $4 +x34 D6 ++2 Y2 +,2x67xA1 +smj +*25 $0 x63 +c sg9 +sK@*63 +z1 x02 o1B +Z1 $b +Z1 s9_ +T2 t +i2p i3p +Y2u ++7*73 +i42 i50 i61 i76 +*41 x51 +E i6S +*24 K +^Y D3 +*50 s1- +x12 T3 +i1o i2u i3l +x82 T5 +^$ ss$ +smu +o4 i4o +s%mrY2 +i2r i3i i4s +^N x63 +o9hs\#x62 +i1_ } +$tsbk +i1o i2h +x74^2*AB +-1 i5d +p3 'B +^6 T2 +-2 -4 -6 +$1 i2. +*48 D4 ++1 srg +$5 $0 $! +x24 $. +CD1^c +D4 Z2 D0 +s1 sRC +*57 x16 +'8 o6u +D3 o33 [ +^E D3 +]$0s?R +c 'E $7 +$|$| +x91 Z2 +c ^e ^9 +.5 D3 +$G x12 +sGj*6B-A +x24 $8 +^8iB`x46 +i6a i7t i8e +si1 sa@ se3 +D5*5Ay1 +c ^e ^3 +x52 i01 +-6 L6 +i1o i2y +x84*12 +*47 o4v +stg x12 +$d +3 +$M x12 +o8Fs\o +sC[x4Ai4* +,A*61 +*02 -4 E +$v -5 ++4 $0 +*43 -6 +x61 o09 ++1CR9 +z1 '8 +T1 T5 T3 T9 T7 +c ^a ^A +*04 $n x41 +*B0 '8 ++3 +6 -A +i56 i60 +^ysoE +Z3s=* +c $7 $2 $! +s27 C +DA ^' +{Z3 +c ^e ^f ++4 $u +*42 ^f +x82 T2 +]sN4T6 +o52 $x +[ q x2A +lx13 +i5d i50 +i1Ix12$0 +ly3] +$m -2 +x61 o0H +i5p i6o +-3+B +R7K +*29 x32 +i1^ +T4 -6 +o8K c +Y2sCe*19 +*80 x36 +^C ] +*A4 x21 +Y2 *24 +sH[s\MiAT +Y5 D0 ++1 +8 +4 +o0t^B +Z5 x43 +i55 i1a +sHgs5! +$4 i5r +,2 T7 +i8a i91 +o34 *20 +c $u $p +i6a i7m +T3 i78 +o8. x31 +i3e R0 L0 +c T5 si1 +i72 i1d +i1d i7a +x98$#D9 +D3 *56 k +]+4i8J +y5s"8 +D5Z4D5 +x1A $t +f i6o +i1c R2 L2 +l i5t +0 +x36 d +$y +5 K +i8u l +z3q +D0 D0 +x13 ^4 +i0a i1n i2i +src -1 +r *23 $j +Z1 c D7 +*57^@iAR +*21 +4 l +xA4$$sPN +$1 o3c ++7 i8S +$1 -0 p4 +T1 T9 T7 T3 T5 +i4n i5i +*84s.g +syR +c $a $m +i0B*83x2B +i51 i7e +i6n i7e i81 +^*iBh+8 +o1J Z2 c +^g-0D4 +*29i3S +sGM +$6 $* +c o27 +i62t +*B1 x86 +slL '8 +i53 R4 +.8i8% +sB2*34 +oBC +i35 i13 +*B9.7^m +-0 C T0 +Y5s>%^h +$* x12 +o3k o1c +o8a $x +*84s(b +*56 'A +x72 ^2 +sy] +$l +1 +o85 *97 +T9*80Y2 +i56 i32 +sY*x01T6 +x35 i33 +x82 x32 ++A -B -C +-5 *50 K +i5d i1c +x96*18y2 +*37 *20 +T1 T7 T5 T3 T9 +sJ''Ax23 +x72 i62 +o6o $d +z1 Y1 ^G +i6s i71 i82 +o2- +4 +$5 $5 $! +$2$7$7 +i38 i70 +xB2o0q +sej +c T1 so0 +,3 ,8 +*03 sbe +i57 i66 +i3d i4y +Z1 p2 'A +i0m *70 +*25 x63 $0 +x8Ai0N +K shl +y3 ^j +,1 E *15 +^T ^J +$! ^3 +D3 k *56 +i1* +i19 i79 +T1 T5 T7 T3 T9 +c ^3 $0 +T1 T9 T3 T5 T7 ++5 d x75 +s'+ +x43 o4B +[s3w +T0 TA TB ++0 +2 +8 +} o8! +$3 *18 +o7b +4 +i1e i11 +*60 $s +svDu +i0d i1a i2m +T1 T7 T5 T9 T3 +$t u +sET$rsU- +-9 o64 +s7R +*41 o82 +^g i4g +p1svj,B +Z2 x06 +*B6 x62 +*46 $v +si1 se3 sa@ +y3 p5 s9* +-1[o3Z +Z3x6B +sJ3$ex62 +c $# $6 +i6t i7o i8r +x32sz" +x63 'B +sS8xA3 +T3 si1 +,7iBdx52 +x41 x3A +s5G E +*30 $z +x8A x54 +slio96sH$ +i39 i43 +i3o u +i3Q +c $7 $/ +o02 z1 +$o o0v +i65 *52 +*75-0 +.2 o0l +T1 T7 T3 T9 T5 +z1 *76 x31 +i6r i7l +sbi +s7L +*15 $u +$p x51 [ +$a *26 +^8 $9 +E x12 ++A-7 +c o68 +sL3*46 +^3^f +^5^1^0^2 +^x^X^x$x$X$xu +i3p i4e i5r +$l $z +o5Ss5c +$l ^b +sf$ +i0r i1a i2n +c ^7 $! +i1a i16 +l Z5 x57 +qx68*29 +x64Y4x38 +*10o1L +x18s.N.2 +C z1 +T1 T5 T7 T9 T3 +i61 i71 i80 +[ .3 +x81 t +smj -3 +$s x87 +x73,Asgo +*76 D4 +.4*61Z1 ++4 -6 -1 +C d '7 +^@ z1 x15 +$z $2 +s;5^ssiA ++4oB$seR +.1 s56 +$! $0 +i30 i3f +sKR +u $x ^x $X ^X +c $3 $0 $! +x2Ax12LA +i8= x53 +z3+0 +C '8 $5 +c R5 +[ -5 } +] +2 +x43 *67 +'B -3 +*74K +i32 i40 i50 i64 +$b *58 +i4h i5a i6n +x43,2 +c ^$ $$ +*97-8i1i +i37 i5a +i52 T6 +,1 *15 E ++7 ^e +$,$; +i3x x46 +} slc +i32 i40 i50 i65 +i5d i32 +i4j *21 +D1 D3 D5 +$m ^i +c ^R +K i4s +o1usf(,3 +-0 -6 -5 +T3DBT0 +-3 ^2 +sPJ +-6 x84 +*79[ +xB2s})i43 +sLW +x03 Z2 *74 +c ^b ^a +$n x58 +$n k ++0 -6 -8 +-1 -B +s4yx98x6B +x16 ^a +o9x D6 +xB5T7 +T1 T3 T7 T5 T9 +$,s9(*57 +sxr] +*63 o1l +T1 T7 T9 T5 T3 +-9*01x13 +c +4 +x03 *50 *12 +i41i59i68i70 +R6T7sl@ ++1 z2 +^8 x62 +o92 x21 +c ^3 ^6 ^9 ^1 +i4N u +Z2*A4u +Y2 o1y +p5 i5. +i3b i4e i5r +p2 -A +x83s$ji7K +^e .2 p5 +x41 $H +*26 K +$*xB7+2 +o08iB| +o1h o2e +c o5- ++B -C -A +x06 c +^j x18 +o8# D7 +p3 -4 t +*02 ^0 +z1 z5 +K x54 +^^sS( +R7 K +T1 T3 T9 T7 T5 +i3t i4a +x21 *68 +c T7 so0 +L9]Z5 +i72 i82 +si1 T3 +*05 K +i5d i12 +i4LxA3t +o9h s43 +*A4 'A -4 +i0O ^L +i5a i16 +scz x52 +$T x58 +smK T4 +T0 TA T9 +x74 i6i +i79 i39 +o0W t x43 +C x08 z2 +$c T0 +s-M +-4*B4*AB +x7B*12 +i0t i1o i2n +[ *70 +p2 xA3 +p2 *75 +5 +c i8i +c i5s +i79 i7c +i7i i8c +^b^a +i0c i1l i2a +*42 p1 +c $5 $+ +t Z1 ++0R2E +$x $t +[ x71 x05 +x13 $. +o9` +T0 T6 T7 T5 +i53 i3b +*21 l +4 +^b^e +x51 sjm +Z1 y1 +{ K xB5 +s g +i2m i3a i4n +x72 L0 +i1a i2c i3h ++7 } +$5 $2 $8 $8 ++5 o0j +p2 o2y x3B +'5 .3 ++5 +7 +8 +i4l i5e i6s +u $4 $5 $6 +$t *01 +s;vx85 +x61 $y .4 +i8i i9c +i3a R6 L6 +i7d i75 +^G x62 +Y1 x28 +i75 i7f +i54 i31 +i5b i57 +i02 i15 +i5b i54 +o5r R5 +$p *64 +c ^4 ^c +i7t i8i +$#$) +'8*A2 +sS%$wswa +d 'C $5 +*75se0 +tDAx29 +x72 *13 +x1Bls^d +i7d i1a +d 'C $0 +x73 ^i +d 'C $3 +$CD0 +u T7 +d 'C $2 +szc*87xB1 +*46 ^D +sZAiAh +.0 *61 +i59 i1a +i1m *45 +*4B +^v -6 +i6i i7t i8o +i7u i8s i91 +C *86 +i1e i36 +l +0 i5t +i34 i1d +x31 *76 +i30 i73 +.8 -7 +Z5x17 +xA2 *97 +i65 i77 +o4g $u +-6 ^@ +i4B ^' x57 +i28 i36 +^H x71 +$3 $3 $1 $8 +'A o8C +Y2 xB3 p4 +x34 o0k l +*BA x02 +o06 y2 ++1T8 +i1a i2m i3e +u ^x $x $X ^X +i2r i3g i4e +'7 -3 +t *78 +i3g -1 +,3.6 +i6G Z2 +i37 i76 +iB% c x94 +x28o5DZ5 +^y Z1 ++2-A +[ *A9 +i1a i2b +x1Az3 +s?x^. +R9 $0 +i21i39i48i52 +sFq{s-6 +sSL +i6l i7d +i7a i3b +o2= +-9 T8 +i39 i74 +*49 x14 +i2p *30 +x73s&2o2K +o3o i2v [ +x03 *12 *50 +$D $7 +D3 ^! *32 +^6 -1 +i32 i3c +-6 -5 +D6 *36 +x41*B7o4O +c si1 T5 +T7z1 +sh!Y1Y3 +*01 [ i6v +Y1xB8sMC +D3 t +i1o i2o i3l +sNMrx5A +x01*67,2 +*57.6 +T8 x71 +i76 i7d +x17 i7? t ++5 +8 +7 +u $1 $9 $8 $3 +*5Bo8U +p2x83 +iB@,Bl +p1xA9x7A +i7D x59 o6a +ss! p3 +t o0Y +x31 Z1 *74 +i6i i7g +i2x ,6 ++5-B +x4B,2iB2 +D4 DC +[ o2u Z1 +-5 $M +r T4 +c T2 T4 T5 +,3 $C +t o0V +i6{x62 +c $3 $1 $! +s1qx91 +i8 *7B +^F *13 +l ^y ^l ^o ^p +,3 '8 +[ x82 +i7m i8i +i1e R5 +c $6 $^ +-2 -6 -4 +o5l Z1 +^b^2 ++2 +8 -4 +T5 T9 +^- ^3 +so# +i0g i1o i2o +x02 p2 +^v +7 +syF +o47 } +*56 s40 +$/ $p +$%$@ +seV +i5O +*42 K k +$\$\ +K x48 ++0 -8 -6 +sGE +i7o i8v +Y5ssY +p1 $n +x57 ,7 +$r x76 ^A +T1 T3 T5 T9 T7 +-9 $! +i55 i63 +x57*02d +i7i i8o +z1 o3m +i0b i1r i2a +Z2s0M{ +L4 u +x98.B +D1Kk +k -2 sir +x07 i1_ +Z3 x76 -6 +tp1 +$=$$ +x41 o7i +sG9*B1Y2 +i7l i8i +$E'9 +] -3 +^2siR +^_ i04 +o0b i4o +i3c i4h +^` +0 o18 +^( x06 z1 +sow +'8 o0E +siq k +Z1 x24 +i7d i1e +x02 R0 R6 +C '8 $6 +,5+A*63 +o7axB5 +$($# +i8% +i2n x52 +x64q +^B x04 z3 +*78xA2 +]*84 +ts"(x31 +y3 s9* p5 +Z3Z5 +$RT2 +sI0 +p4 i44 +^l $1 +i3s i4o +x31 i3/ +i3u i4k +y5 p2 x19 +Z1 x54 +i5d i58 +u ^x ^X $x $X +*27up3 +c ^9 $1 +x37 -0 T0 +t T6 +D8 k +c $& $8 +T1 T3 T9 T5 T7 +D2 R1 +i0m i1i i2c +[ u +^l +6 +x73 o64 +fx87-7 +-1 K *52 ++7 -8 -5 +ssd]s1r +i81i99iA9iB2 +sS>so6 +u $x ^x ^X $X +x7B^S*25 +i75} +o0h ^s +i3b i3c +T2 oA8 +i65 o87 ++7 -5 -8 +i4- *30 +x31 sar [ +$6 ^@ +i54 i3d +s8T*09 +o9" +i51 R8 L8 +$0 x57 ++BK^w +x37*59p2 +*A9 x52 +x15 y4 +$1 z1 +i5a i6s i7s +{ T2 +p2sX-] +x02 o56 +*40 o7y +sP'*81*7A +sJO +x03Y5 +i1u xA1 +s<*[p1 +x1Bs{yz4 +s}ts.g$g +s1a +x0Az1Z3 +ssx +$. $- +$J x63 +i2h i3o +x8Ax31 +sY\sHi*89 +s<6x17 +^f^a +x35 ^B +x86 x82 +i6n i7g +sWxR6 +.3^O+A +$1 shW [ +^1s"{*0B +sjm t +*29 x13 +o29 l +*63 +7 +^H z1 +T1 T5 T3 T7 T9 +x13 R2 +[x98y4 +s_#xA1 +T9 T7 ++0 $V +x73*B0sSf ++3 -7 -4 +x54 *25 +$isw; +i9+ +x62sD@sE( ++5 *56 +^6 z5 +sK6s0f*6A +*79o9r +^l *56 +i1i i2n i3o +i19 i1a +^@ o70 +i41i59i67i78 +z3s2HL7 +i76 i7c +i5Uo0c +C o1C +$! ^2 +x63*52r +sr;i7&+A +*54 +6 k +p2 k +x31 $y +*30 x01 +*15 *73 +TA[z2 +qiBv*53 ++A -C -B +s;To5@ +y2o0Ysl/ +x84 -8 +Y1 ,7 +st8 +squ +K z2 x23 +^p -7 +*B0i5Bo8O +Y4p3x4B +D2RBsd8 +skb K +*5A x06 +K p2 +R2sX{i3c +i60 i78 +szy +*37 x62 +$5 ^@ +*19sbS*14 +sNK^b +x82 x62 *40 +[i7a +i10 i36 +i8g i9a +c^L +x23 -1 y2 +i50 i5c +c ^4 $! +i74 i80 +-9 *56 +,5y4x5A +sdj +i9E c +z1 o6C +l [ ^k +z1 *20 +c T4 T2 T5 +s-2 +s8r E +s1W +*38x23.4 +c $0 $# +sem -2 +D9*08o9& +x03x84 +y4l +i1a i2y i3a +D6 } +Esb6Y2 +'8o7% +i55 i64 +x21 x19 ++8 *63 +Z1 Y2 +i3zi9M +^U x06 d +o8b Z1 +o2w ^n +z1 C +d o5n +,5 $N +c T2 T5 T4 +oA,sEho6Y +sQA +[ i8g +i2o i3n ++4 -1 -6 +[ x72 +*42 k K +t *04 k +.5D4 +i1a R5 +*76p1E +o1@ -8 ++3 Z1 +*A2+4 +c '6 +^ED8x76 +T9E^T +i0YxA5*BA +*A5$9 +rT5 +i8g i9o +$2$0$3$2 +o2t *53 *36 +T1 T5 T9 T7 T3 +si1 ss$ +x75 i63 +T8 TA +'7 ^t +i13 i55 +o0y r +*24t +.5 *83 +i2p i3a +*86 o6c +$> ^< +i9S *A1 x83 +xB8p2oAL +'5 i2l +E i16 +T1 T7 T3 T5 T9 +s9F +i0p +8 +i12 i59 +-1 } +i75 R9 L9 +x23 ^W +i55 i35 +i1a i2s +i77 i87 i97 +^$iBF +x31s-F +o0g Z2 +sZvi4S +Z1 D7 +iAGo7j +$_ $5 $4 $5 +p3xB7x0A +z1 *71 +c ^9 $3 +sp@sGk +-4+A +D6$, +o8$+ +Z2 +A D0 +i65 $6 +T1 T9 T7 T5 T3 +u D3 +$. $r $o +x17xA3Z3 +x63 y3 c +i48 x07 x78 +$3 x37 +x54t +{ x51 o8o +i3T *32 +x92*86s+A +y3 x58 +y1x1B +x12 ] +$V { +i3d i76 +i9q$u ++1 skw +c i52 T6 +x81 -0 +i20 { +iB% x94 c +Z2x02iA_ +lx42 +i6r i71 +$3 ^d +x31 [ sar ++4x01K +x12 [ ++2 i1m +^n ^e ^p +-0 ^q +i2m i3b +i4=x73*A8 +^x ^a ^t +y3D5 +$9 $1 $3 $3 +i1d i31 +LBx39 +o0W x43 t +*79 o9r +c ^m ^i +D3 $x +T1 T7 T9 T3 T5 +*0A} +$S D3 +*42 ss- +$4$9$9 +i8x *14 x04 +T7s%H +l $i $a $n +sw8 +-3 o8k +[o5x*A2 ++4 +6 -0 +[ ^u +E^i +i0v *07 +o0v ^q ++0 +8 +7 +^, r +*02 x31 +x5B$G*27 +D5i7ciB! +i5Rx1As@! +d o9i +o7f x04 +xA1 L8 +i3i i4n i5a +x21 y3 +t i1l +x3BK +*57 $n +D2 Y3 +$4 x54 +D5 i7x +^x +5 +'8iA- +c $5 $$ +i3u i4n ++2 -4 +8 +k ^J +i44 i50 +i1- i3- i5- i7- i9- +^m o58 +sX8^k +s9Xx78z2 +sH"o4? +r x51 K +i5x +2 +s4FD6^d +s\lo5ko9B +x62 o6Z +s&UslNxA4 +*14*75s(1 +i47 T5 +i51i69i77i83 +L8s!zL0 +x6AsNJ +c T5 T2 T4 +o8t D1 +i35 i12 +D6 x36 +D4 } +^5 +1 +s%*subx72 +] ] o11 +$4 $5 $6 $! +'9 -3 +o5n { +$. $e $s +i94 x42 +y2 y1 DA +c T4 T5 T2 +sVbsi- +$# E +x06o7!x68 +o0MY3 +x01 T6 +T8Z1 +x65csZT +cszp +k i1- +i7 +sDF*85 +l [ ^y +Y3 .8 +*54 *35 t +sJRi0N*43 +^z +7 +y3 t r +i2l i3l i4o +x17*B1 +r o4t +$Qx28skX +-1 -8 -4 +i51 i1d +i1a i2z +s-t +-8 *24 +xB4 x72 +s_No8h +sb@ +x49$] +oBEx6B +i32 i13 +i32 i18 +Y2 -0 +$t i4f +o5w i3a +o1U x53 t +$s $h $e $e $p +i1a i14 +sD} +xA3loBO +o7Np1x35 +suz +o3fx36^p ++5 -9 -0 +soJ +i1a i2k +lswZ +i76 i58 +x43 t Z1 ++0 -5 +8 +] x12 +i1a i2f +l ,8 +i57 i17 +'A*15T5 +i76 i7f +K x03 p1 +x52 T5 +*47 +6 +R0 z1 D2 +Z1 *85 D2 +$+-A +,5x9B +x73*A8u +i61i79i88i90 +T8*73x43 +s1X +x03 E +.5 -1 { +i2b i3e i4r +i2s i3i +u sCK ++3 '9 +*8A*15 +Y3 x85 ++6 $u +i1a i38 +o6s*B3-2 +x23 x54 +D6 ^3 +i34 i70 +l $7 $1 $1 +x13 T3 +Y1TB +i3c i5f ++0 -6 +4 ++0 -2 -6 +^M i6i +^3 } +i0b i1r i2o +*06 o4m +^p K +-7 -A -A +i1i sih +x13,9z4 +x16 o4v +x05 r +]*81i6R +xA2 ,2 +o3Tsp< +x14 p1 +d o5b +z4 y2 +sgO +*23x86 ++D -8 +s +.5 .2 +i3p ^a +^g x36 +Z1 x32 ^r +oBKs@C +x61 Z1 +x57s'Ix65 +d E x95 +y3T3 +s3z,9 +x4AR8p2 +*28s`$+A +o7Oi8Y$n +[^v +k o91 +o3a s41 +$jx86 +,6x83r +R3 +1 +sjo +3 +s,2*41 +x92 c x71 +Y1 *89 +x43 sbh +i3e R8 L8 +s%k$C +p1x6B +*02 *17 +l D5 i7x +i5l i6o +x42} +x32 srs +T7 p3 +o1v*81+7 +i5wo9tx19 +,9 D2 +Z1 o3n +*83x73*1A +d x95 E +i2k *46 +[o6yiA* +z1 x0A +*07 D3 +Z2 o2s -7 +c$S +$6[ +-4 r +i1o i2n i3s +*96 x02 +$_ -0 +o2q p5 +xAB$9u +i71 R9 L9 +oBE^$ +r $p +i4a i5c +t y4 +*A6*59x07 +Z3Z4x07 +x29p2s-J +*56 $4 +seoRA +oA' +i6r $r +x24R8p1 +i62*84*27 +i7a R8 L8 +Z2 -7 o2s +x75 $u +sax o3z +o9]$d.B +l $1 $8 $8 +x73 *51 +$3 o6z +x02Z5 +sj5D8 +*75 *63 +x12 L1 +iAX $7 x74 +*53 *32 o96 +*71 ] +o83 t +D0 x56 +i2C D0 +i57 L5 R6 +*58 x92 p4 +i8e i9t +o6g $b +$i*69 ++5 -8 *56 +i73*A8 ++4 *82 +$Qs{w +*16 D0 x04 +}y4 +E x53 +x7Ay3 +R4 *57 +*60 $i +i5c { +TBsjd +x14 x75 +*53 o96 *32 +i74'B +xA2 x1B [ +R1 R2 +sJti85x1A +y5 x2A +'8x96 ++5 *56 -8 +Z2*B2 +*48 *68 +^t y2 +s3;o6o +x74 sdf +sbw +x07x85$5 +i2l*23x89 +i7t i8y +szfD7 +l $0 $0 $9 +*0Ax25d +i3e R1 L1 +'8 i0z +*52 shl +o1yxA3 +x51 Y1 *63 +Z2 x51 +DA x19 +stv +$h } K +*17 K +R5D8*A2 +K^D +T2 T4 T8 T6 +$w *86 +*18 D7 +x27$id +l$0 +o4b *57 +o0( '7 +i57 R6 L5 +u $1 $9 $8 $8 +t i59 +i1o i2o i3m +$T x31 +shz -2 x31 +shao6c*A4 +o82 $9 ++8 k +*12 y3 +T2 T8 T4 T6 +s?>[ +dY3l +i89s;c +l $4 $0 $4 +{ '8 ^b +*A3 +*64iB, +Z1 -1 +7 +x5AL4 +T0 T7 T8 T9 +s*ls)Ny1 +*80 '6 +sia i6e +*46x7Ax18 +$8 $7 $7 $1 +o0t $? +i8csiy +} s/e +D6 D8 q +i09z1 +sK\i8k +q x2A +,8T3s_a +o3>^c +*B3x53 +,2 -0 +o2g *75 +RA*02DA +u o0B +s=4o7y +$t c +[ $z x52 +iBv +t o9N +K o40 Z1 +i1o i2o i3p +l '7 $5 +l '7 $2 +i4e i5r i6t +KR7 +x72Ki9! +$1 $l +i0jsF"*8B +K *63 +*83 x32 +*20 Z1 +*21 *36 +x92k +srDs{c$. +*B6 'B +Z2 [ t +i6s i7t i81 +{ i61 +{ x23 +i83uD9 +$5Z2x15 +^e $t +^n } +Y5 x18 Y4 +Z2 x21 +i0s i1a i2s +sC0$h +x49Z4 +sbc^t +KL6 +i1b i85 x63 +o3d'BxA2 +x0A[-5 +f x38 +^l +6 +7 +^s ^i ^h ^t +i73 ] +sKy +o5f x74 +x63 i82 +,6 ,7 +*32 o9o +*67 s12 +i1i i2a +L3 +3 +i1i i2c +iAX x74 $7 +i7a i17 +i2e i3v i4e +z2 o0g *15 +i4` 'A x32 +i19 i52 +i38 i12 +i19 i7b +i36 i50 ++7 o54 +^q r +D2 $+ +i4x x92 +i46 D8 +x02 Y2 +o1O *76 +p2 oAL +i1e i2d i3r +^2 ^1 $3 +i5b i6e +i0P R1 +i0f i1a i2r ++1 i67 o7a +i59 i67 ++5 i3x ] +^w ^o ^b +i37 i46 +i59 i64 +s6c c +o6S Z1 +i59 i68 +T4 ^0 +-5 o1_ ++0 R4 +^A i8e +l D1 $_ +i0\ +l +4 *30 +i1k i2a +^t -6 +i4i i5m +u ^m +-4 t +i4i i5l +x14 $g +o4I u +i8b i9e +i62 i71 i81 +[ T5 y2 +szo +*04 *73 +i42 -7 +i4b i5a +srz +srd +} ^5 +f x72 ] +-4 x61 +Z2 -7 +Z2 ^C +i5o i6p +o7r *34 +i1y i2l +o0C { +i3z i4y +i1y i2r +o0v o1- +l ^l ^l ^i +r ^Y +r o0a +o9A .7 +x51 *46 ] +i82 i91 iA3 +o0P ssb +l $h $e $a $d +t i8h +s03 ] +*51 Z1 x53 +i1r i2e i3a +$s $i $d $e +] R0 T1 +'7 o6w { +i52 -2 +x07 ^k +*12 x42 $v +*43 x02 +i64 i70 +i76 i85 +z5y1 +D4 *02 +,5 $H +i1i i2r i3e +i3j c +l *30 +4 +*20 '8 +r f +-1 L0 +i1e i2t i3a +xB2ssR +D4 +4 +^K x25 +$o r +r z1 D6 +i7a i8r i9d +x13 Z3 +i0h sli +$M x51 +Z1 $7 +x41 o4O +iAG xA3 $8 +o7o D8 o0d +shL E +i0j i1u i2s +*89 [ x31 +.Bx83 +i7C +5 +$* $- +o6A c +i6l i7e i8r +^a z1 } +*48 x62 +i1a i2k i3a +i38 -4 +i4o i5l +T3 TB +x43 Y1 +Z2 T9 +i7i i8c i91 +x51 o3L +,3 r +D3 s85 +k o8N +o02 $I +T5 x91 +i9e iAr iB1 +i4p i5i +*23 $k +i60 i73 +,5 o12 ++5 o4_ +i33 i44 i55 +i1i i2c i3h +i2t i3t +o2m .6 +sgCR6*61 +^M *68 +so0 se3 si1 sa@ +sbjt +sye +Z1 +7 -1 +i6a i7h +i31 ,4 +x31 smf +o83 *65 +$D D1 +i44 i57 +i1a i2s i3t +*45 s2_ +i1a i2s i3a +$P -5 +i5h i6a i7n +D6 i66 +o7o o0d D8 +x82 ^D +i0l i1u i2i +so0 si1 sa@ se3 +D6 i0Y ++1 $0 +so0 sa@ se3 si1 +D7 T6 *54 +$s o1b +syc +spm K +*37 -4 +T1 .7 +T5 T8 +i1u i2k +[ $7 +$2 Z2 +i4E x92 E +*45 ,1 +$v d x5B +$1 +2 Z1 +i3a i4t i5e +i5t i6a i7r +i6c i7a i81 +*10 c +o9cY3 +i1s i2a +T1 T9 T5 +d K +Z2 *47 +saA +2 +z2 TA x05 +Z5 x64 +x01 ^n +s1= +i91 l +$7 $0 $0 $1 +s8! +ER4 +i4p i5a +i43 i54 i65 +^r ^u ^s +x74 i5s D1 +$f $j +x74 o0r +*83 *47 +Y1 $+ +Z2 r c +o0k *27 +,3 .6 +i09 z1 +$d $i +$4 o4o +i32 i43 i54 +x65 E +i3d i4a i5n +D1 r { +x51 ^' +i6n i7g i81 +o4!^Sx13 +x51 ] *46 +so0 se3 sa@ si1 +i5i i6k +*17 *06 +Z3 $8 +i5i i6a +i8n i9e +i6l i7o i8v +^Z *31 +$3 $k +i2t '9 +i8O { +-8 T1 +i74 i81 +s21 p1 x36 +l +1 o3w +i1V +x31 $M +so0 sa@ si1 se3 +*90p4T0 +i5e i6m +i8u i9s +i2t i3c i4h +i4e i5l i6l +i5y i61 i72 +i1l i2o +k -5 +x04 T4 +'8 $K +c $! $6 +D7 *54 T6 +i9e iAd +*86 o30 +T9 xA4 +l $i $e $s +r ] o0v +i8m i9a +u o6t +$= $= +*43 .6 +i81 i97 +^X +5 +$@ $? +i81 i96 +$o $r $y +d k x5A +i0t i1e i2r +t r D2 +i1a i2r i3o +i1a i2r i3e +$* x72 +x51 Z1 t +i65 R5 +i2m '9 +i1p ] +L5 l +^F -1 +i3b i4a +$r o7- +c o6- +-9 .1 +f x75 +K ,6 +i5v i6e i7r +i1a i2m i3s +^d ^a ^e ^h +$5 ^$ +^Y Y1 +i3a i4h +T0 $D +i3a i4m +o04 '8 +t ^v +$e $t +$b r +o4q D5 +C s47 +] stw +o1u } -0 +i3e i4d +i1e i2v +i2a i3n i4g +[ $p -7 +i2a i3n i4i +i6a i7k i8e +^_ *06 +z5 x45 +-8 o4b +i1a i2t i3t +x21Z5 +] T1 R0 +x06 *20 +^* +1 +i7w i8e +*53 sur +i6! -6 +saR D0 +^R ^D +Z1 +7 +^{ $} +i6V ] +i1e ^D +^f ^f ^o +iBnxA4x09 +i4E E x92 +c i3i +sgx +o4s '8 +o7S *34 +i7r i8a +i7r i8d +*54 *86 +i6i i7a +o0s x46 ^i +-4 ^F +T6 .1 +o48 k +so0 si1 se3 sa@ +L6 $V +$. $p $k +Z1 i7n +i4t i5i +L6 ^F +i3e i4n i5t +x64 *62 x72 +i3k i4a +o1. ^h +i3o i4l i5a +x64 x72 *62 +*29 .5 +} xB3 +l $n $e $s $s +*64 +4 x04 +i1e i2o +oAD +*17 x15 +c o80 +L3{^u +x04Z5 +o69 i2a +z3sYBsap +z1z5 +l[$7 +[ *15 K +KE*98 +$n *24 +$/$- +$^$+ +s9eZ4.9 +r D3 +$ $- +$ $, +-8 x24 +$~$^ +i45 i55 i65 +i69 i77 +,4o1.sh- +ssu +sM'x3A +o2j *60 +ssZ +-6 *70 +i69 i73 +$@ L6 +i13 i20 +sr$[ +i1o i2r i3t +i0D$8 +y5x8A +$Z Z2 +$1$9$4 +$1$9$6 +o61 i5h +i8AsFW +D8 xA4 ++0z3 +$1$4$5 +*76'7 +f x76 $g +T0p5 +'8 i6j +$k^Ys_( +p3D9x0A +sQ>R1 +i5r i6y +*3B +$. [ +x94i9v +T0 T9 T8 T7 +x78t*27 +*37x9Bx45 +*25 R5 *42 +$'xAB +shz x31 -2 +D5 R4 +s?m'5 +$FD4 +$m l o8u +x13 D7 +$ Z1 +i4e $a +}C^A +'4 p1 +sQnx41x63 +i1e i2l i3i +x07 $1 +*05*93 +$1$3$4 +iAm^^-B +^c^7 +skz +^f^9 +x58o8* +$0 $= +x15s^b +x48s|`scj +p1 l o7s +$R Z2 ] +i09 } +i5- $3 +$0$3$1 +i5a i6t i7e +$1$7$7 +D3 i2. +i9s iA2 +s@ST7 +^z x31 Z1 +o2'T7 +c $$ $3 +o3s Z1 +x24 $r +x15 o3p +D6 k o0v +*05i9d*18 +o99 Z1 +i4n i5a ++3 r *34 +Z2[r +^z Z1 x31 +sd} +sd{ +-1 Z2 [ ++AsNus}% +x71*A0 +i31 i40 i51 +^2^b +p2p1 +i7l i8l i9a +d oBm +i0b i1l i2a +x26 +1 +*53 $y +i18 i50 +i7f i74 +*53 $g +D7 x93 +l i5z D7 +l $i $s $t +s9=L2 +c i34 T4 ++7-1 +*46 *16 +i6s i7t i8a +i1m i2i +i1m i2b +snc +2 +^0^b +i12 i1d +i43 i58 +*4AT0 +i3c i7b +^g ^w ++5 ] i3x +i38 i16 +i35 i7d +i33 i5a +i3b i38 +^a^d +i2t i3a i4n +i59 i1e +^@ $4 +xA3 D6 +^w ^w +i5d i36 +D2 L2 +T0 T7 T9 T8 +l f x46 +i7h i8a +*15 ^p *71 +i3V +f $g x76 +i5a i54 +$*$% +$*$^ +i33 i1e +^2^2^0^2 +i7c i59 +i21i39i48i58 +i37 i7e +i3e i11 +^0^6^9^1 +c $7 $9 $1 $0 +i7t i8a i91 +i5e i13 +$_ x12 +i12i20i30i40 +i84 i93 iA2 +i70 i80 i93 +i1b i34 +t o0M +i5c i52 +i7l i8o +i3c i35 +so@ +i22i30i40i54 +i5c i33 +i5c i34 +^d^4 +^d^3 +i14 i7e +T0 T8 T7 T9 +i1d i14 +i11i29i39i45 +i0b *17 +c $5 $8 $4 $9 +*03RAz4 +i5{ +l ^d ^e ^e ^s +o7a x42 +i6n i7s +*A7x27 +x95[Z4 +Z2 $* +5 +$w r -4 +$]x07 +x65 +6 +o4/x8B +o7(TB +i1i i2n i3t +o2Vs8f +l i42 +i0p i1l i2a +dxB7 +Z2 +5 $* +o1j Z1 +z4s5x +o7m -8 +D0 sfw +x68sDx +i2o i3k +i4B^'x57 +svA +i2b *14 +*75x41^g +i2\ +i5El +^cY3 +i3l ^z +i90^zx31 +x12 *52 +x52 $G +i9gs6j +o7p+7 +l x38 +sV#,4i7y +^/xAB +*98sYJ +*10 *35 +l ^k ^l ^i ^m +^d^b +x3A*19xB6 +s1p +*12 $v x42 +^. x62 +sda +oA< +^d^a +i1c i2h +'6i5N^_ +L6E^C +-0 x83 +i52 i66 +} r D0 +r $w +o2j -5 +} o55 +^n ^w ^o ^d +slW.7 +r $h +^9 -2 +*60 } D4 +swG ++0 x92 +i14 i53 +i0Ax32R2 +o00 z1 +*03*41 +i5i i6n i71 +sCioAA +} *63 +i78 i80 +s@` +p3l +} z5 z4 +i0m i1a i2m +KxB2*51 +swE +]oBHZ4 +i68 i77 +i4l i5a i6s +$$L7 +i1i i2p i3p +i6a i8d i7n +$i x13 +i3h i4u +i7a i58 +$s $t $a $f $f +o2E*62x04 +l $0 $4 $0 $5 +^; ^; +x15Y2^e +$l $i $u +i3o i4p +i21i39i47i51 +$l $o $g $a $n +o3),3$T +$1$4$4 +iAZ$o*71 +z5 x48 +$s $i $m $o +i67 i79 +c $1 $1 $2 $! +x12 l K +,9*03$; +^J D3 u +$7 $4 $! $! +$0$4$4 +i3o i4l +C '7 +c $1 $8 $* $* +i56 o67 +i3o i4o +$7 $6 $! $! +$5 x39 +$0 $1 $? $? +i8d i9e iAr +TB TC +$o $a $f +o1A u +x47x2A +i5GsbWx98 +[soH +c $1 $1 $7 $! +-3D9 +c $1 $4 $* $* +x93 x62 +sJI +x71 x26 +] ^7 +^d o2. +u d 'D $6 +D5s7nx78 +D4 $2 $0 +*17 r +c $1 $2 $1 $! +$y x23 +srv ^c +i31 ,4 ,5 +Z1 ^s +i7! i69 +^, ^. +$6 $f +spZ l +c $5 $6 $! +x68 ^s +$0 $8 $$ $$ +$d $e $v +i7a i57 +$2 $7 $* $* +c ^c ^8 +i2e o7o +$1 $9 $4 $0 +*16 x04 D0 +f 'B ++1 Y2 +c $1 $5 $7 $! +T1*A8$q +c ^e ^a +i63 i77 +$0 $e +x19$y +$0 $b +xB8$(*B7 +C '8 $8 +i6j i7u i8l +i7f i54 +'B^K +o2r +3 +$1 $3 $$ $$ +-4 $a { +c $0 $4 $! +$c $h $a $n +c $1 $1 $0 $! +*59Y3x86 +$8 $6 $! $! +D1 Z1 +i8e i9r iA1 +C '8 $9 +i52 i30 +-3 $4 +^ksA({ +} z4 z5 +^p 'A +i2& +*10 i03 +srk x23 +$3 $1 $@ $@ +[ x52 $z +u $2 $0 $0 $3 +i3G l ^h +x0Bo7\i6l +c $2 $6 $! $! +'D $2 +$p *61 +$gt +i0% +$p *73 +x43 Z1 t +k^@ +iBx +i1a i78 +$1 $6 $@ $@ +c ^2 ^f +sTX*49 +suA +*16 '7 +siT*7A +i55 i61 +*37*67 +i6" +i12 i7e +i37 i74 +'8 $* +*A6i0B +sBFi9I +$*$) +i1e i56 +y1KsZ} +x06 'B +*58 s13 D5 +c ^i ^n ^i ^m +iBY^ws>W +i39 i72 +Z4 x29 Z5 +i16 i26 +iA=s;,*05 +[ $N +cx96d +iAG $8 xA3 +o1U t x53 +i1e i53 +i1e i54 +i5e i1c +Z2'7 +sGOEd +i8h i91 +l oAk +'8 i2d +i6@*5BiBk +$d *69 +c $9 $8 $@ $@ +i6o i7c i8t +*83 k r +*70 x23 +*32 x74 +c $7 $8 $9 $! +xA9 +8 +$0 $1 $$ $$ +i3m R3 +Z4 Z5 x29 +x83 x42 +$ci5Qx43 +o6w +7 +^i ] ] +f T0 x34 +c $8 $0 $! +^2 $3 ^1 +x03 R3 +i6pt +$1 Z1 +2 +x4B x43 +*14 } +$0 $0 $$ $$ +x05o5\sbq +$2 $8 $* $* +{*37x81 +$b xA4 +i73 i7b +i58 i37 +$2 $5 $* $* +o72 *43 +$4 $5 $@ $@ +$q $p +$5 $6 $* $* +l^3^2 +i0d i1e i2m +x59Z2 +l ] $m +^2 ^8 ^6 ^4 +x91l*51 +c $6 $9 $* $* +^/ ^/ +*15*41sYx +i12 i25 +i1a i2b i3a +l ^t ^o ^o ^b +i2n i3k +i2r i3b +'7 $+ +xA3RA +[ ^V +^f^5 +x34 sVc +$2 $1 $$ $$ +*02 o51 +$0 $7 $* $* +x53 ^P +c $0 $1 $* $* +^1 ^4 ^3 ^3 +c $5 $2 $! +$2 $5 $! $! +} L0 +i2r i3t +l ^r ^i +C $9 $6 $9 +lo94d +d '1 +i1p *46 +D5$ysLi +iBs$5Z4 +i5u i6r +x51 t Z1 +i9e iAr iBs +s]uxB9l +^kz2 +*A8.8 +*15 ] +*06s({x29 +i52i60i72i82 +l $_ D1 +sV,^x.7 +shn p4 L9 +*4AR2x27 +T1srz,A +D0 D9 +R4i4of +l $1 $9 $6 $9 +x13 $s +x42 *52 t +oA5Z5 +K*79x41 +i39 i1a +DE +$1 $3 $@ $@ +-9 s25 +i53 i7e +i53 i7d +Z1 d x56 +]x2A*70 +swcLA +$2 $1 $? $? +c $0 $2 $! $! +'U +c $/ $2 +t i22 +$6 $5 $* $* +$0 $6 $* $* +i7X .3 sX3 +o1[ +iBpoAei9h +$1 $8 $@ $@ +$5 $5 $! $! +s 1*A6xB2 +i5b i76 +i9a iAn +i5b i77 +D8 D9 +$5 $5 $@ $@ +s.D,3 +Y3 x37 y3 +x75tq +$5 $5 $* $* +D2 D7 +i7g i8a +c $1 $4 $! $! +sRA*A4 +c $8 $5 $! $! +s64 $2 +D2 D8 +x14,2 +*B3s3) +*68*57 +$o $v $e $r +*5B*70{ +$Z x31 +c $t $e $s $t +^z z2 +z2 s6F +lo9) +l o81 +*45 { +p3 .9 +y5 oA9 iB7 +s3G +i5li9* +,3 *56 +y5 iB7 oA9 +$3 *57 +sBU +Z2Z1 +^f ^l ^a ^h +{ i16 +x64 p3 +^e ^e ^z ^e +*21sXa^I +] smy +[ ^x ] $x +x72-B +u z2 +x42 t *52 +x2A y1 +sgv o0m +s}=s0) +p2 $5 +]o9F +$!$~ +[ ] ^x $x +*48 *47 +[ ] $x ^x +c $y +x95rC +Z5x82x09 +$r oAg +] *41 +T1 T5 T9 +i35 i74 +*98 u +sc@ +k $- +$o Z2 +i1c R0 R0 +x41 p1 +i3f i1f +^9 *24 +i5i i6a i7n +K *97 +$P k +,9^p +T0 D9 +i38 i7c +T2*03 +Z1C +.3ksHl +y2 ^N +i2p i3i +*7B^UK +i9Ax6B +*14x2A +^ s(Z +K Y5 +*38 x71 +sa@ si! +D0 p1 x21 +i20 i39 +c ^3 ^5 ^9 ^1 +$2 $6 $2 $9 +tZ3s}> +$7 $9 $8 $1 +*58 D5 s13 +'9 $B +$3 $8 $6 $1 +.0 T2 +sAK +l ^n ^o ^c +i19 i58 +-1^c+B +$5 $0 $3 $7 +$4 $0 $5 $2 +i20 D1 C +i3d i7b +x5B xA6 +i45 i50 +i30 i59 +T4 p1 ++5 ^U +x32 x72 +s5O +*3AL9 +^xi9x +*A2 '8 +C $1 $0 $0 +s.& +[,2 +i2S +sZY +sZM +i60 *36 ++6 { +Y1 ,4 +o9Z +$i $d $e +i24 *10 +shp x01 +c $2 $9 $2 +i3S*A3 +] Y5 +c $S +y3 r t +^l +7 +6 +i0Ps)N +*35x31 +i81i99iA9iB3 +Z2 o8p +i2c i3o +T3 z1 +^zsDBs`a +o5B +6 +K ^Z +i82i90iA0iB5 +R7} +i4\ $5 x3A +x73 ^S +f x87 -7 +,1 E +[ ^Y +i50 i32 +xB5 xB7 +R7 R8 +p5 i8! i5V +i5d i56 +i2z i3a +*20 y2 +x61 E xB1 +s6T +sky D1 +s6P +sTc +$u ^g +$3 *36 +*30 ^g ^j +x23 ] +s8D +$q -5 +i37 i7d +$($= +c { x65 +*B4 x65 +sUN +st7 u +i36 i1e +p5 *92 *01 +i46 i58 +*43 E x63 +sSX +oAa-9 +l $a $g $e +xB8R1s_. +i3f i75 +l [ ^h +-7 *74 *64 +xA2u +l [ ^b +i0j i1a i2s +sd Y1 +*29 x74 +i3e i55 +o6l *14 +i4\ x3A $5 +i8i i9a +i56 i3e +^l i9n +T0 T8 T9 T7 +D1 o45 +i2d '6 +sHc.B +l [ ^x +x23 p3 +ss3 o3r +*78 Z1 +^V D5 +i78 i3c +slVsY].7 +z2 D4 +^9 x72 +^OsG' +x67 o1i i6o +^Z ^M +sf2R6 +'7 o49 +$5 ^! +o3b t +*24 *03 +o3b { +*10 z1 +c .7 +u $1 $9 $7 $1 +i72 i3b +c ^y ^m +*84$b +*35 ^e +,6 T3 +c $= $3 +$+ $5 +*45 $8 +l $0 $0 $4 +*29+2s(. +T2 T6 T4 T8 +c +0 +$>*4Bc +i77 i7c +$B $Y +sr. +] ^Y x23 +x62 $w +Y1 $3 +d xA1 +*45oAlK +T5x71 +sGX +o9G u +^Z +3 +i3n i4e +i33 i12 +s}Qi6Y +.5 .6 +i71 i32 +f -7 x87 +R4D7 +c T2 so0 +st) ++5 ^g +*49.3o2z +.1^RoAA +Z2 t [ +i41i59i68i72 +s'} +'9 $M +$P *21 +*65 *01 +i51i69i78i87 +c $8 $? +p5sC?$3 ++0 d +*52 Z1 +sa. x41 +*8AsWR$u +sit +s$Asgz$- +^[ s[d +i72 i1b +l ^d ^n ^i ^w +x06 ^u +i64 p5 +-3x65 +i39 i16 ++6 sNY +$T k +$H x15 +} ^3 +$v -7 +suOs}ys]m +sW3y3 +*97i6< +i2s i3s i4e +o2M d +$4 Z5 +x63 k +i2u i3t +sA+ +$e r +DA *86 +o2V .1 +*87 E -0 +K *04 +x26 o52 +sh' +s0M +*76 ^w D7 +] i7- +i9J$< +D5 ^' E +x86 E +^X -1 +x05 Y4 +*42 p5 +x73sOoB@x3B +r y1 y5 +i14 i20 ++3 *60 +o5A o45 +*86 *57 +*24 *70 ] +x65i7C +o7E .2 +x61 xB1 E +p5 *01 *92 +'7 K +$H D3 +*0B .0 +*20i6a +s\)ss2^, +^7sP- +i77 i37 +l .5 +i5a i14 +Z2rc +dc +D9^6 +i21 i39 i48 i55 +i58 [ +sUC +i42 i50 i61 i78 +*16 R5 +s.O +sy{ +D2 [ +*A8 x35 +$! x25 +l $m $a $n +*65*36 +x83 *64 +lsMF +i28 i38 +sd3 +u *41 +-0 C +^w D7 +oA1 Y1 +k.0*61 +o0Ws^xs2v +i3a i59 +.0 y1 +iBr x46 +Z2 x04 +D7 u +T0 T9 T7 T8 +z2 *15 o0g +x75 i81 +i31 i49 i57 i61 +C x42 +sKX +xB2sg0iBg +sKj +*18x56 +t o2K +snU$. +iA& +i79 i3f +$& { +*70cx09 +iB1 iC2 iD3 +i21 i39 i47 i57 +s!--5$( +i5f i1f +Z1 +1 +o6^ Z1 +x04x38p3 +x26 t +s6s +c $2 ^! +c $- ^1 +-1 x25 +uY2sW7 +s{S{z1 +o5HKxA2 +x76x32 +x21 +3 r +T2 T6 T8 T4 +DA $b +*98i5CiA- +i75 l +T3x37 +$o x13 +o8_ x02 +o6f } +i58 i39 +D2$c +i7a i8d +c $5 ^2 +i11 i29 i39 i41 +c o5X +*95 x76 +lp5 +$1sgk$- +c ^F +i54 i63 +c $6 ^7 +c $u +k'A +i1a i2g i3a +'4 $4 +x62 sbd +^v z1 +}siGssA +x67 i6o o1i +o5> +x72 k +c ^H +d x5A k +y3+1 +x32 ^I +i54 i61 +i7c i56 +$1 *74 +{ x64 +i5Px72s|C +c $1 ^. +i7c i5b +*25 *42 R5 +i36 i53 +l [ ^r +*43 x63 E +x2AY5 +sJU +x27 -0 +i3O +0 +,6 *30 ++0 i8a K +x65$R +s&{o3P +sdcs4V[ +x16 z3 +sup x21 +i62 i70 i81 i94 +x34 i1v +*72+2 +c ^3 $4 +i21 i39 i48 i54 +i5i { +i5RsDI +x45 o5E +^`o0ts0< +x63sEv +c $9 $? +y5 x39 T3 +s9G +i77 i19 +*03 *36 +x67,1 +i3| +i0bs3{iAd +i1a *37 +sgz i0m +^O *02 +c $9 $- +x59R3 +i21 i39 i49 i51 +$4 $# +*05 E +^Nx78 +LBs,Oy4 +x63o3r +$p L6 +Z2 *20 x14 +sz0 +$u o4o +*31 sev +$4 ^$ +c $3 $+ +sCHx62 +*14 ] f +$E Z1 +i3a i4n i5e +*60s}2K +o3@ [ +c ^2 $5 +^1 $0 +c $# $8 +^L +3 +$o x81 +i10 i3a +^. ^3 +i1i i2g i3g +z2 ^v +s4\rx84 +^. ^8 +s31 Z2 +i75 i31 ++7 -4 -2 +D1 z1 +Y1x85 +o3$ x42 +iB.x8A$g +*7B x56 +T1 .3 +s6? +^5 ^+ +c o1a +R0 x13 +*83 k +i4z Z2 +^w x52 +i80 o6. +*1BTA*31 +c $2 $_ ++4 -3 -0 +D4 $Q +[ o17 ++C -F +x65 D7 +i5f i72 +^, x42 +sb@x23 +*23t ++C -6 +s`Gi7D +r o0v ] +s,9o25 +c $4 ^3 +$i -0 +*3A x05 ++4 +A +6 +^1 ^$ +i57 i19 +{x46c +o0h u +-3 -3 -A ++4 -0 -3 +s09 x81 +RAz1 +f x34 T0 +sQOx27xB6 +E z4 +-D -D -E +^1 ^` ++A +E +x63o0iswL +c ^* $* +x65 l +o5d { +y3 *81 x53 +*29x14 +] $T +$, { +d x38 o0B +i0v '9 +i3b i70 ++0 +8 -5 +oBE +i20 C D1 +D3C +^a ^r ^a ^s ++2 -4 -6 +p5$rsQR +-7 -C +x93sht +$m o8u l +sav +x05^3 +$3 ^! ++A +C -B +i7e i33 +} o6p +x05 o4a +$3 ^1 +z1 ^D +^Bx3Ax67 ++2 +8 -9 +K x72 +R4 i45 +i10 i7a +seg *54 +sSG ++5 -0 -9 +-A -A -C +$C Z1 +o6f -4 +-D -E -D +i1l i2m +T2 T8 T6 T4 +s$s +i7b i3b +$- x32 +Z1^W +x16d ++5 +6 -8 ++6 D3 y3 +y1o3a +i77 i7b +s*x +c $+ $2 +$l,8 ++9 -8 -6 ++A -B +C +x35 Y2 ,5 +-6-B +-3 -6 -A +$7 ^! +sMN +,Ao3yx0A +$!$= +c x43 ++1 +5 +4 ++9 -6 -8 +o4$s`0 +T3sgcZ2 +s$7 +*B6o9m +.0 $k +o0so7[ +t x0B ++1 z3 +i3a i11 +$$$) +x26 *01 +i71 i14 +d o0B x38 +-B -F +^m srw +i76 *04 x1B +s_T +x82 $3 +xB3 +9 +i30 i13 ++0 -6 -2 +-1 -4 -8 +-6 -B -B +i7b i1a +i5f i3f +i6i i7a i8n +s6! [ +$< ,B +$. ^9 +s8N +i3c p3 ] +x48z3x24 ++4 +6 +A +$@ t +i36 i56 +t x31 z1 +i2n i3d i4e +$6 o2r ++7 -2 -4 +scy +^- r ++1 +4 +5 +*08'9 +-0 i0C +cTBs&P +$1 *07 x43 +c so0 T7 +*9BY2 +] Y3 x95 +o1u *57 +x69*65 +x12,B +*20 [ x41 +o9s D3 +i5& x07 +c so0 T2 +u} +] i4- x03 +*3B]Y4 +i9m iAi +i00 ^6 +x06 z2 +-3 -A -6 +-3 -A -3 +i24 i38 +i20 p2 +k ^0 +z3 ] +] *64 +z1 x35 +*71 l +Z1 i6x +o3i +4 +Z1 i62 +sT2 ++2 -9 +8 +x57y5 ++0 +4 -6 +i24 i35 +o32 [ +-A -C -A ++8-C +x3BR9 +c i24 +p4 z4 +x81 x61 +x5A*15sK` +D0 o1q +Z1 $2 +sY2 ++6 -0 -5 +sQ)o2G +i32 i14 +sGB +7 +sLys_xo9c +*19sl[ +^bx14 +o8JE +l ] $g +i85 i92 +c $6 ^2 +^y ^l ^o ^p +soM +'8 o2t D1 +KE +{'B^z +s}&^9 +i2n i31 +i5e r +i77 i3c +i18 i3a +i74 i7f +$T x52 +sdXo3D +i97 iA9 +^6^e +z2 ^b +$m $a $r $1 $0 +*06 *67 +'7 *46 +$7 Z4 +i6a i7m i8e +l^9^1 +$6 x62 x61 +l^2^2 +x74D9 +i81i99iA8iB9 +z2 *71 +K *20 d +c $2 $9 $! +i98 iA4 +i58 i31 +*03 i1b +c $4 $5 $6 $! +.7x65D7 +c $7 $4 $! +*86x1B +$r $y $o $g $a +i0o i1p +x09*28x21 +i3i i4a i5n +^2 *31 +i9a iAd +l $2$0$0$6 ++7 -5 +8 +i4j x23 +i1a i2p +i1a i53 +^G o5i +*A9x57q +i3t i4i i5n +c $5 $7 $! +i62i70i82i92 +*B8*24 +$7 T3 +r z3 +i8h i9o +i9a iAs +o9* 'A +i4/xA4 +z4^yx28 +-7y1s0L +z1 o59 ++4 -9 -0 +i02 i11 +$d l +o85 *75 +i56 l +o2NsfV +o1x D9 +{ x92 +x42,0.0 +c $1 ^4 +*53 l ++3 Y2 +i36 i7d +s3_p5 +^b -7 +$s i52 +$1$! +i4a i5n i6n +xB3i0a +C T5 +o1o ] +i6g i7e +c $w +$q *02 +^) ^( +-6 x74 ] +i4p i5o +i6ZsNgx94 +R8xAB +$. $m $y +s]%u +$8 x42 Z1 +x51 i0w *67 +i70 R0 L0 +*65 *24 +-5+B ++9 Z2 +i4e i5A +x6AsdI +i1f i3d +i38 i41 +x06 '9 +sjqs@p +D1 *14 +*57oA?Y3 +x72 ^l +s0V +i1a i58 +u d 'E $5 +Y5 o5k +u d 'E $4 +K i1W +x26 i4s +u d 'E $6 +i56 i7b +i56 i7e +*45 ^r +u d 'E $3 +o9U t +^g '6 +$t *25 +i35 L3 +i1d i12 +su9 +x91 x51 +Y1x54 +-5 s6f +sra { ] +i35 i42 i50 +c ^e ^5 +iBB +x04o8K +{oAqx23 +*51 r K +x67 *14 +i3r i4a i5n +x03 o7@ +c d '9 $8 +c ^a ^f +s5wT9i6Z +sA|sFjLA +c $8 $2 $! +^f { *14 +D1 x75 +$6 x34 c +c d '8 $9 +^6 Z1 +i3d R4 L4 +C '9 $7 +se3 ] +c $4 $? +l x21 i31 +i1a i54 +i5e i37 +$i*95*76 +i52 i35 +c ^b ^8 +o3Su ++C -B +D +kxA5 +z2 *50 +*53 t ^m +c $1 $4 $3 $! +^e ^n ^u ^j +k i49 +{ o4q +i4j i5o +x43 u *41 +*86i2l +$9 $e +i19 i78 +sWH +$9 $f +*5Bi1D +*20 svt +r *45 ^p +y3skn +c ^3 ^d +-7 i4x +i12 i5e +l i0$ +sIl +x6Bs,s*62 +i21 i39 i48 i51 +i55 i1e +^r ^m +$, Z1 +'A x43 +$+$@ +i4a i5m i6a +xB3Z4 +D5 K *43 +c ^f ^8 +s2#*31i1e +i56 i35 +s6P } +*61 i6n +c $7 $9 $! +k [ *61 +$@$- +i12 i20 i30 i49 +x9AoA# +d 'E $1 +s-l +l*24o0O +-6 x75 +'9o4h +^K *15 +i1e i12 +ssT E +E x48 +T0 o2M +c ^d ^9 +s/, +^" t +iBf +o7f t +c so0 T1 +o0z o1e +Z1 ^o +[L6 +i08 i18 +*07*83x74 +i1h i2o +$! +4 +T0 T3 T2 T4 +c $3 $9 $! +i82 i90 iA1 iB3 +-2 t +} r *50 +i80 D0 +o2l Z1 +i44 x15 q +slc D0 +c so0 T3 ++3 x03 $w +Y3uD8 +*01 $f +C '9 $3 +c $3 $6 $! +d 'D $5 +x95x31 +$. $t $k +i53 i3d +D8 o1S +x9Bx95 +spT l *32 +*40 z1 +^I o49 +T2+AK +T0 T1 T9 +u 'F +i1f i71 +*A4s3B +-7 Z1 -3 +x29 Y1 +z5 [ +x21 *50 +x6Bi4C +i8o i9r +*3Ax93oAJ +x92'Bi9) +Y2Z1 +i1C { D2 +i33 i52 +svl +tY2,5 +Z2.1z1 +$0$1$4 +i39 i58 +T0 T6 T5 T4 +s7Ex98 ++AR5 +i7d i76 +$1$3$3 +$s $o $u $l +x76x52sGw +i72 i80 i91 iA4 +i15 i50 +*54 $3 +xB8i8"*A5 +i2s i3t i4e +$+$? +o1! T0 +*51 ] *25 +$1$9$7 +c i1R +o2f*27 +x5AxBA*80 +z1 *29 +x13 o37 +i3c i77 +i76 i3c +y5DB +*02 *57 +z2 -0 +$\ $' +s*O*37x79 +$0$9$9 +$0$9$2 +$] ^[ +$4 ^c +Z1 ^g +x42x94 +i3l i4y +i3h i4o +sdSx62Y2 +{svLo5& +i57 i5f +i57 i5b +i50 R4 +iAE $r x57 +R8i7+ +i1e i37 +.5^,o75 +s7RxB7xA3 +o3{ +$v L6 +i3g *02 +i7c i77 +^r '8 +oB% +i58 i61 +s'0 +i78 i86 +skB +i7c i70 +K i3m +c $3 $- +i5e R9 L9 +i26 i35 +,1^s +i41i59i67i79 +sFX$y +$a u +i7a i8t i9e +r-8-7 +*43 z1 +T0 T3 T2 T6 +sap } +D0 ^V +oB*Y2y4 +i11 i3a +i5f i50 +-6*60 +x76s8ssqS +t ,2 -5 +i27 i38 +} p5 +L8x92 +p3y2p1 +T2$u +*A2 x13 +i3j i4a +z1 -5 +i52 i67 +*30x45xB4 +i52 i65 +{ o20 +$ME +^e^e +i38 i11 +$d Z2 +R7 l +$_Z2'5 +s[Xx89 +'3cs $= +-C -F +secuK +o7. D0 ++A*37 +i74 i82 +sdv +o5m ^D l ++7 ^o +i30 i7a +$@ x06 +i5i i6e +*39 x05 +o8y T8 +Ky3+1 +o6w c ] +x82 E } +,2 *41 +$* -6 +x81 ^Y +z2 *24 +$? [ +i8n i9d +i30 i77 +T0 T4 T2 T3 +i8i i9e +-6 .2 +i4k D5 *36 +D3 o8y +$m *13 +$#xA5 +o6o K +y4 sjX +i1d i7e +i6o i71 i82 +i2- D5 +Z2 L5 +]^X +szs ^a ^t +d $! +x35T1 +$* *01 +0 +Y2 +6 +iAV +i3i i4o +i9n iAo +z2 -1 { +u T6 +D4 ,2 +o7g .6 +i6b i7a i8l +i9n iAe +st. +i6s i71 i81 +i3i i4c +iB xA4 ++2 +3 +8 +i8s i93 +$o x56 +$. $d $k +$_ .2 +L4 L4 +i8V*B2x1A +s*l +y3 x61 +s1< +} ,3 +D4 o3m +sSFsvOsc< +k '9 +i21 i37 +$S x74 +{s'D[ +i1s i2h +i1s i2i +*26 o33 +i1s i2s +i2s i3o i4n +o6@ +6 +^a .4 +*63 x12 o20 +s.=RB +l i72 +o0t } +$- ^0 +^u ^k ^a ^t ^o +i6a i7c +s04 +3 +xA2 x72 +x52 *47 +-2 $c +x45 Z2 +o42rk +k *12 +sqw +^?sK4 +c $7 ^6 +$f *96 +$. $a $s +] *53 +*08o2D +i0j i1e i2r +T7 T9 +*51 o0K +d D0 +o8g x35 +o97*14 +i7a i8n i9g +$& $7 +o64 D7 +*50 o5z D2 +l ^m ^r ^o ^w +i5i i6d i7e +Z2 x02 +z1 o2g +i1a i2s i3h +sDO +$6 c x34 +i3m '9 +i73 *79 +z1 ^H +i9c l +i1u i2p +^g -8 +i59 i5d +s`7o9',8 +Z2 x93 +] +3 +Z1 $8 +i2t i3s +o58 [ +'A T3 +i2t i3c +*24 +4 +$v r i0r +svx +i2t i3h +^0 k +i0s i1t i2a +x31 ,1 +i60 i75 +sDEZ2 +s0a D8 +,9 x32 +i5o i6m +$_ x41 Y1 +$* { +xB9*56[ +i1a i2n i3a +sjg +r *60 *12 +,B*67 +-4 se. +*65 *51 +*3Ascm +i4o i5u +'6 i3r +x62 -9 +$>$? +D6 $w +scEs#O +z3 x41 E +i4o i5d +o4t Z1 +Z2 i2% x13 +Y1 TA +y2o8>Y1 +^_ ^g +i10 i58 +-5 ,1 +^ ^7 +i3b i4i i5e +i86 i90 +*57 D3 ++3 $v +} x82 ^M +T7 x93 +Z3 $9 +o5j Z1 +Z3 $3 +x65 o6p +^c ^c ^a +T0 T9 T1 +i2e i3c +i51i69i78i85 +i51i69i78i82 +$* $/ +l-9 +*45 o0I +k $l z1 +o6x t +s.= +^m $z +i51i69i78i88 +i2e i3a +i4m i5i i6n +Z2 *53 +i55 *47 +Z1 $f +u $1 $A +^G ^M +i10 i1a +Z1 $q +i55 x91 ++1 c +i80 i91 +$m o0g +i3l ] $3 +i5e i6r i7o +x51 x05 +i38 i76 +$_ $h +lp1*80 +i7c i5c +x06 l +d x38 y3 +sl! +c.2*B1 +-4 +A +T5 o0S +x52 $@ +D5i12 +soC c ++0 $8 +*53 x52 +T0 T1 T5 T3 +$x i7y +i7s -8 +i44 i51 +i22 i35 +o6w ] c +s6z +^l x36 +k { $v +i22 i39 +s0| +c ^m ^a ^i +i2i i3g +Y1 k +i8r i9u +,3$+x15 +R2Z2 +x69^4 +i0n i1a i2r +sngo6N*0A +o5x o0k +Z2 x53 [ +p5 s83 x52 +i4k i5y +[ i6f l +sjs +2 +*57 ^B +$! *03 +i0T Z2 x37 +i8r i9a +x07s/A +x75 T6 +i0i C +i76 i80 +seg +u $H ++0 +6 -4 +o0e x72 +i0T x37 Z2 +Z1 *25 D3 +i7g c +Y1.7C +i64 i73 ++6 -5 -0 +$) $) +sMDiAD +y2 $L +xA5D3xA6 +.4x57 +$b x45 +sCv*B1sL# +T4 i4_ +^B R7 +sDUy3 +$_ Y1 x41 +Z4s(g*04 +i3a i4r i5d +i1r i2e i3e +K *98 +o8k x23 +o8K s89 ++1 i24 +i10 i77 +xB3 -B +o8` +$o x62 +$! ^7 +x63 s24 d +i2s Z1 +.2 ] +o0e *61 +i7k i8e +R4 *74 +i1y i2a +*07 D5 +*14 i2- +$2 +3 +-0 *51 +snl '9 +i1o i2s i3e +i99 iA0 +[*7BY2 +siK +D1 t +z1 T6 +x82xB8 +y1 i6d D7 +$2 $5 $2 $6 +*20 $G +T0 T3 T6 T2 +s0L +o7r x16 +k $b +k $u +-5 K *50 +y2 x36 +i9s D6 +o0t o2e ++7 +8 -5 +*B6D3] +f x03 +^Esa**1B +i1d i51 +i72 i81 i90 +saF c +p1 o5p +i6u i7n +srk +T2 *57 +o79 o5k +-2 ,5 +-2 $c x42 +i19 i21 +sck D3 +k o6f +x53 x12 +q ] x83 +$4 $4 $9 $0 +D3 z2 +} i13 $A +i4u i5t +Z1 x85 +i9& +*53svD*73 +i9/ +o6M u +x81 s18 +x14 $p +x21 i3l +swpsGPo1W +D4Z4.4 +i7b i8o ++9 D0 +6 +Z4 x85 o30 +i1k i2i +i1k i2o +i71iAV*04 +T0 T5 T1 T3 +$. $h $k +x56 c +$w i7_ +i1l x31 +*98 D9 *32 +i59 i63 ++4 -0 -9 +soy c +,7 o5s +$M y2 +o43 i66 +s.+ +p1 -0 +i2n i3j i4a +i5o i6w +seq i4' x43 +i83 i95 +*74 c +*98 *32 D9 +*12D5^F +i96 iA6 +o3e { +T0 T2 T4 T3 +s., +T1 i1_ +o0w Z1 +z3 E x41 +o4K D6 +^t y1 ] +o5n t +i47 i51 +D5 -1 +^2 i42 +x24 p3 +t o7S +r y4 x48 +T0 T6 T2 T3 +-0 -5 -8 +i6a i71 i83 +x91 o7s ++B +D +C ++0 -4 +6 +i3c i1i ++D -B +D +*17 x06 +'7 i3h +.2 ] K +i39 i17 +-3 -C +^t ^A l +i3f i19 +y5x9A*2A +$z T0 +s0k ^c ++2 -0 +8 +s.f ++A+D +T0 T5 T6 T4 ++4 -9 +6 +T0 T5 T4 T6 +li0R +i1i i2e +i7e i19 +o9a c +$/$( +xA2+7 +p5 x52 s83 +$) ^1 +i2d p4 +k '5 +,4 *6A +k x26 +i1i i2b +D0 c x91 +i0t i1r i2e +i5o i6v +D1 i8y x23 +ssW +x81 .5 +^C u +i6d o2c +Z1 i8j +$. o0w +{ *18 +t *35 +-5 *62 +i91 iA1 +x6Bs_9x83 +} p4 o7e +^NoAE +iA=ui9` +*93 x07 +x78x74K +,3 *17 +x61D1 +.9*17*0B +$_ x41 ++4+0'9 +x63 Y2 +5 +oAr+2 +$l ^3 +xA7 DA +*1B x01 +-8sTM +*32 *73 +^b srz +*64 +4 +f x96 +z1 'A +$tsX- +i77 $? +Y1 z1 +x42 i3. +sSJ +k z1 $l +$7xA4r +$k $o +C i0M +o7|^7+9 +*47 *26 ] +x49 ,5 +$kK +{ K *35 +*64 R3 +-4 xA1 +D1 l o79 +x26 d +y4^Rx34 +l '7 $7 +x63 $0 +*74 D0 +o7T r +*92o1.TA +D7 o2h +i0" +*78 -A +i10 i20 i30 +-6 ] x74 +o3m ^b +.6 C +$FspO +*B8 -7 xB6 +x08 x09 +*61 x62 +$k $4 +.4 *56 x64 +E *46 +o6jExA1 +*34y1[ +] *64 o5w +-0 -8 -5 +*18x5A^h +i75 i1b +*63 ,4 ++B +B -D +Z1 *48 x32 ++B +C +D +T0 T2 T6 T3 +^t ^u ^c +i7~ +^4o9K +i6l*97 +^bsU8 +R6 D5 +l*85{ +$$ o80 +*23 i2w +.5 x84 +sELET2 +{ $i sei +c ^4 $1 +o88 *34 +y1 z3 +oA%o1.] +Y5 x94 D4 +*6A D1 +.AsXU*31 +s |xB7R7 +*60 c +i54 i3e +{ x03 *29 +{ *43 +D4oBJ +$2 *32 +*86 D4 +Z1 p2 +.Ax83 +*A2 ] +o0Y D4 +^y-0*A4 +$p *34 +c $> $1 +i1f i3f +$3 $7 $1 $2 +x58Z1*7A +d x46 z1 +x34 T3 +ty2 +o11 z1 +sUb*64 +*07 i8b [ +x63 d s24 +u $1 $9 $8 $4 +-A -C -B +T0 T4 T5 T6 +l '6 $5 +i1o i2o i3b +$. K +o0i *46 +x98'8$s +Y2 *65 +D8 x02 +] o5w *64 +t $F +*64 ^j +x94lY2 +sCZ-2,1 +$M [ -7 +*87 c +l '6 $0 +^d l ^0 +i1t i2i +o0p k +T0 T3 T5 T1 +i70 i3b +^x p4 +$o T0 +i31 R5 R4 +^7 c +x09 i8i +*B3 x45 +x6Ar-A +$ex65 +*47 ] *26 +i3r i4y +{ i1a +*40 x59 +x34 x23 +i3r i4i +x3A R2 +*46 x24 ] +i57 i3a +spw +sZvKoBH +x71 r +i3S r l +^1 xB4 +x3Bi7h +s2$ +z1T5x61 +^b] +RAD7^K +$6 T3 +$6 T2 +l o1V +i8qi3o +[ ^O +*37s8OD1 +i0v i1e +i5a i6m i7e +*9BD4*52 +i12 i51 +i6a i7d i8e +Y4 +7 l +*35 Z2 x32 +i8c i9o +*14 o1R +d*60s,M +$ox47 +D9 .3 +.9$i +sa@ ss$ +iBw +,7 *34 +y3l +x61x24*75 +o8, D4 +t x35 +u T5 [ +K *BA +-9p1 +sZS +o5M [ +i3s i4t i5o +{ *13 +i46 $7 +y5c*B7 +x12[ ++D +D -B +i11 i29 i38 i45 +i58 i14 +f x83 +D1 o79 l +s4T +xB2 q +$9 i5. +i4k 'A +$l *51 +i51 i38 +^i *76 +R2 *72 +sJg l +y5 K x81 +.0]$8 +,1-2 +*59 D2 +*91 *04 +x84 +9 ++8 Y1 +i0j i1o i2s +Y3 Y1 +$x *20 r +$# x01 +sb. +[ iAC +c ^ ^2 +li6H +$l'A +*29 x14 +s)ho8yo3* +i02 i10 i23 i31 +c i55 T6 +y2y2 +-1 K { +i60 i71 i80 +{ ^! +sCA +$6 x61 x62 +Y1 $Z +Z1 +4 i0B +]s_x +x36i1E +*0Bo1K +iBu *B1 x06 +{ ^b +Z1 $, +*52[x37 +-1 D5 +o0bx64x31 +c $7 $$ +x61 *37 +i31 i49 i56 i65 +x94^H +i2r Z1 +c ^g ^n ^i ^k +i31 i49 i56 i68 +c y3 +q x83 ] +rr.4 +D0 ^E u +l i6d x26 +s/uD2ssK +R5*B6 +*38 x26 +^S $* +*34*9B +'A $C +^X *31 +sjG +Z1 i91 +i73 R6 +$e f x16 +,8 -4 +l '5 $4 +snG c +sej +7 +$0 x15 +ssts0< +$v x24 +x23 $g +{ x84 +$8t+7 +*76*6A +p2 c +Y4o1ps7b +x51 o6q +T2 ^K +^FxAB +i4o u +l '5 $2 +$B ,8 $d ++4 +6 -9 +i81[RA +iB8^jsX\ +o5g i7o +c $7 ^8 +l{$7 +i41i59i67i75 +D0 x91 c +o61 r +iAE x57 $r +*56 } -6 +i7f i72 +Z2 o8n T0 +^k $t +i7Ws5U +*2B+AsBC +xA2Ei9? +Z4 { x62 +sy3 +$v D7 x21 +Z1-1 +i2s i3s i4y +s8n[ +i5e i51 +Z3*43 +i2v } +oBIszti9q +xB2 t x02 +*21,1 +i2s i3s i4a +*32 sI4 +sue k +x13 i3E +i50 i67 +*68 *85 +o5z Z1 +'6 $~ +o9N*BAx29 +D1i4ap3 +*09'7sO2 +o3a Y5 +ts4% +Y1Z1 +x67i6a +r $s $e $x $y +i2s i3s i4i +l ^e ^d +o9wx37d +] ^C +x54 *45 +$v -6 +s0go5]x45 +i6i i7n i8e +x25 $u +i7a i3f +l ^n ^u +*46*34 +o6a *36 +xA4 $v +sIG K +Z4 o30 x85 +T0 T4 T3 T2 +y2.A +c*15.6 +c ^6 $7 +i3e i58 +*97t +^+ ^1 +i78 i5c +o5W x41 +R4i50 +$/ ^/ +x3A$i +i70 i1c +^Ksil+6 +T2 '8 o1A +s@1sCn +l '5 $8 +K x37 +x8B [ +x67c +$f $u $l +[ ^I +o1X +c $8 $) +i36 i12 +sOw'9s\e +^t ^a ^b +o21 Y2 +i41i59i68i71 +c $8 $+ +D8y2x4A +sdl ^S +{ i3G +sMT .5 +$* x54 +[cT0 +s4H] +*74 [ +^q z2 +$* T5 +i72i80i91iA8 +p2 } +z5 x2A +i5\ +*51 *25 ] +*46 ] x24 +z2 o1E +slO sOZ +c $D +$/$; +i71 [ +c $) +$j ^s +x06 i3K +i0,o8Y +.6 K [ +i0! x81 +o2coAq +s2j*63E +sXK +Z2u +$- K +y3} +i30 i75 +x04 $R +*B0 xB2 +svm *13 +x71 k *64 +*AB*39DB +s,hx57 +i1h-AD0 +sNk +*A5T4] +l $% +i5tsTq +^l } ^z +x03 z4 +o4> +i78 i7b +$% x52 +Y5 x23 +c q +$*-6 +*05 o11 +Y4 l +7 +T0 ^! +i4d '9 +u o0W +y4 x53 +^Gx48 +^K x64 +o2b } +[ srv +i4b i5e i6r +oAE$( +}o8! +s0w +D3sH} +^9 ^+ +$2 ^_ +y3.1'7 +y1x19{ +[ l i6f +o48*62 +so3 +i50 i13 +i6e sml +i1c i70 +xB8 D4 +i1c i72 +s7d +o3P] +i56 i34 +Y1[x25 +-0 c +$2 ^- +iAT c +i3d i4i +r ^k +D5Y5 +i78*A5 +*35 Y2 +Y5 *53 +*37 o5l +i7l i8e i9s +i5Px63*86 +l [ ^f +*34o9m +D0 x35 o2e +i71i89i98iA6 +{x28 +x72 *76 +^&cs;* +Z1 i9j ++3+C +$? x39 +x5AZ5 +-6+B +D6x31y3 +'9 snc +$5 D9 ,8 +x65 +2 +*93 x21 +.3 sgo +Z1 *14 +i55 T6 +x34 o6n +$r y3 +x15 k ++B x65 +'A $! +tx85z2 +p4ss$x87 +^qsV( +x48 $! +i31 i49 i57 i67 +i6i *27 ++0 -6 +9 +i31 i49 i57 i62 ++2 k *45 +$($- +} *32 +xB2 x02 t +t } k +c $~ +i31 R4 R5 +o61 { +T0 T1 T3 T5 +x52 Z3 [ +*31tx31 +R4 x04 +Y2 x82 +*30 +2 +x43 *41 u +l $i $o $n +Z2 s59 +-1 *61 +*12x5A +l $o $u $t +*65 ^k +i3@ x81 +c $f $u $l +u d $5 +Z3D6 +x01$nD9 +E x19 +k-2.A +o2t *53 +*B8 xB6 -7 +x02 q +i50 i33 +i73 i1d +$z i1l +x42x54 +*30 *64 +R1 -2 +sA0 +p4 oA2 +c o29 +sQlD3 +*23 } +s-E[ +Z1 i3c +T1.8 +i32 i57 +o7E { +sz|x26 +y1 '9 ++2 sgb +D3Y5 ++C +D -B +sSQ*B7 +i81i99iA9iB0 +p5Y3 +i3b R2 L2 ++8 i9O +o0f Y1 +Z2 o8o +i2n i3n i4y +*02 s@2 +o8<*7AE +i45 i58 +*A0 { +spno0# +*10-3 +x5Ak.3 +i62i70i81i99 +x51 D2 ] +-8 x12 +i4O u +i5b i56 +[ Y4 +*31 sE9 +Z1 *69 +.2*B4D8 +x71 *64 k +^n x81 +o9w*32sTE +x28 q +o8h c +i8y c +$. $1 $7 $1 +$1 $6 $3 $2 +i52 i61 i72 +Y3D7l +o4ws\2[ +i51 i7d +o72.1 +$7 $5 $5 $9 +$8 $2 $1 $8 +sy8 +x03f +} o5x +i73 i7f +i6%sZl +x74x23L9 +i59 i3e +i62 i70 i80 +sA($E +$9 $9 $5 $1 +o2W T3 +$4 *85 +*A8 l +$B $d ,8 +$9 *04 +$7 $1 $9 $1 +c $l $y +D1 x35 +Y5 K x6A +l ^g ^n ^i ^w +.Bx02 +s.8xBA +T7*54 +Z2 x24 +i53 i39 +sDv +s9_ Z2 +D9 .2 *68 +.7$S +xB4K*68 +i2d i3d i4y +c $2 ^@ +i5a i12 +o6s *51 E +$e *73 +i9a iAt +i7e i8n i91 +i8a i9d +o7z D4 *56 +i9m iAa +c slz +^i ^p ^e +i5o i6l +o0i t +i2m i3m +$. $k $h +T0 T1 TA +i6h i7e +c T3 si1 +i3a i4m i5a +i75 Z1 +i3a i4m i5e +-0 z2 +qs=f +i53 i61 +c i4e +i2p i3o +i2m i3a i4s +^d ^e ^e ^s +i50 i61 +i5i i6s i71 +i3d i4r +i3d i4o +i0o i1l +i5i i6o i7n +l $e $l $l $a +i3a i4n i5a +i3a i4n i5i +i1z i2e +i5g i6e +i1e i2r i3t +i1e i2r i3r +i1e i2r i3m +i7s i8t i9a +i88 i96 +i3t i4o i5r +i2i i3a +i2g i3e i4r +i9g iAa +i2d i3r i4e +i85 i96 +$. $j $p +i1i i2o +*13 [ Z1 +i37 i41 +^g ^n ^i ^w +i7s i8h +o11 R2 +i23 i30 +i6s i71 +i3a i4r i5a +i81 i91 iA1 +i2r i3m i4a +^i ^m ^e ^d +i1a i2n i3i +i2n i3g i4o +o7d $1 +i1a i2c i3a +i32 i42 i52 +i2y i3s +i3a i4c i5h +^^ $^ +i1t i2a i3r +i2a i3l i4i +'6sjy +*87 t x26 +o18 u +*02 ^s +$i $s $h +i1i i2o i3n +i5s i6o +i2l i3i i4a +^k ^n ^i +i3e i4k +i6i i7l +i2t i3e i4r +i6i i7r +T3sV3 +i3k i4e +i4o i5n i6a +i3w i4a +i93 iA0 iB0 +c o8+ +i69 i76 +i1a u +i88 l +o22 z1 +i69 i71 +c x24 +-2 o7r +c o34 +^x l $x ^x $x +i13 i54 +c o3c +i13 i58 +o3F D2 +i7f i59 +^x $x $x ^x l +*57 } +^x $x $x l ^x +f x8A +^E *43 +sfk ] ] +i14 i7b +^c -7 r +s8Z +*40 *57 +^4 } +^x $x ^x l $x +D5 spz +$a *38 +k ^8 +se3 ss$ +x13 $g z1 +i11 i73 +x27 ^M +-2 +7 l +i7a i33 +x06 i2h +^x l ^x $x $x +o2a { ++0 *37 +-9 s91 +x75 $1 +r $L +$d o41 +r $o +-6 i0f '9 +^x $x l ^x $x +^x $x ^x $x l +i15 i71 +^x ^x l $x $x +o3p u +*47 *58 +i3b i1f ++3 p1 +Z2 *64 o4a +i7f i51 ++4 $v +$0 Z2 x26 +^x ^x $x $x l +i1i sry +^x ^x $x l $x +i5a i59 +^x $x l $x ^x +i2k } +$f *32 +o7g *98 +x02 syl +Z2 s1t +^5 *40 +z1 i0F +T0 i5H -5 +^x l $x $x ^x +i3e i1f +i5f i31 +i1b i19 +x05Z1] +o13 o2S +*51 *37 +Cz1 +'9 x43 +*79 x8B +$Vi7? +$F o7r +^c^8 +^8^f +^7^d +^3^e +^c^0 +^c^3 +^e^0 +^e^1 +^f^4 +l $1 $9 $7 $7 +l $1 $9 $7 $9 +l $1 $9 $7 $8 +c si1 se3 sa@ +l $1 $9 $9 $8 +T7 'A +l $1 $9 $9 $0 +l $1 $9 $9 $4 +i1b $s +'4 $9 +'4 $3 +l $2 $0 $2 $0 +p1 x08 c +l $1 $9 $8 $1 +*31 +1 +c ^2 +z2 o03 +} x27 +i75 R8 R8 +i9ti1\o1t +o0/ z1 +i54 R5 R5 +i71 R8 R8 +c $3 $2 $2 +*80 Z4 x47 +,4 ,7 +-5 Z2 +c $9 $1 $9 +z2 *23 +x91 x51 'A +o0q l +*02 i4p +Z2 o8t +Z1 x86 +K $6 +x15 +1 +C $3 $2 $1 +x17 ^P +y5 x18 +c $5 $5 $0 +x28 ^b +r o0e +*01 +4 o3v +r ^z +smt z1 { +$2 ^. +$2 ^$ +z5$4 +c $7 $? +$5 ^. +c $& $2 +c i32 T4 +c $! ^8 +^n t +*13 { i0t +c $! ^3 +c $7 ^5 +c $3 ^8 +c $3 ^7 +ssd x32 +sDB ++5 t ++5 ] +c $2 ^5 +c $? $9 +k sbd +$+ o70 +*03x2AsLg +c $$ $2 +c $1 $) +*60 -8 +c $2 ^9 +c $2 ^7 +saZi1k$! +c ^9 $2 +s0_ [ +*28 '7 +c $* $5 +c $* $6 +l Z2 x83 +c $5 ^8 +c ^` $1 +r Z1 k +c $1 ^` +*46R8{ +c $1 ^7 +c $1 ^5 +c T6 i6_ +c $9 ^0 +*68 Z1 +c ^8 $5 +c ^3 $! +c $$ $8 +x07 o4z ++1 R1 ++1 R0 +r i3t +x19^; +t D8 x24 +^- ^2 +c o1T +^_ ^6 +$c o4n +^1 ^+ +Z1 t [ +c $& $6 +^6 ^+ +c ^5 $2 +c ^5 $1 +sfr D4 +c ^5 $7 +z1 ^G +z1 ^f +c ^0 $9 +z1 ^v +c $+ $5 +c $+ $3 ++2 $f +$! ^4 ++2 $6 +o3s r +*43 suo +DAi4&*16 +,9 DA +Z1 d x65 +x13 z2 +*23 spe +c ^7 $2 +c $0 $_ +$? ^? +Z1 o2s +c ^8 $3 +c ^8 $! +$1 ^0 +*01 *51 t +d t D6 +$9 ^9 +i6w $y +i2D c *25 +*61 o6g +oBmsB4 +c ^7 $1 +c ^7 $3 +x42 .0 +'7 o59 +sbM l +c ^b ^f +s04 x61 +} o78 +*83 Z1 x54 +t x15 z1 +$k ^3 +{ ssv +K l +$! -1 +E -8 o9@ +*40 $j x02 +c D0 D8 +Z1 x64 +.6 *4A +$2 $0 $3 $8 +*B4 '7 +$6 $2 $2 $3 +*21 *73 +*52 z1 +$5 $8 $1 $8 +{ o0q +o9j o79 +] .4 +*36 $1 +*51 i0d +x64 +1 +-8 *67 +Y5 x34 +*52 .4 +t *70 +$w o7m +t *30 +t x61 *43 +*62 x82 +p4 *A6 +p1 i47 +o0S *45 +x14 Y3 +] *37 +] shf +$0 *85 +y5 x38 +k o23 +*65 -7 .6 +x21 l +$3 $3 $3 $6 +x62 *74 +$0 $1 $1 $5 +$, x02 +} *35 *50 +[ o58 +o1n *17 +o6z [ l ++1 *34 +E o9@ -8 +$8 +0 +$5 $8 $4 $9 +^m z2 +t *43 x61 +*49 p5 +x24 f +$0 $s +o4j o6Y c +ssz -7 +o26 x61 +*17 E o9R +t *42 +$o *03 +d x83 x51 +i22 i30 i40 i55 +*47 ,6 +$3 *47 +x21 Z2 +$_ $7 $1 $1 +l '9 $2 +'8 i1. +x02 -6 +i7e i16 +i30 i15 +x42 d +i3q k +r *32 +-6 D5 ,4 +o3l Z1 +] -4 } +$! D6 +.3 o4e +o15 x24 +$c *51 +x13 +1 r +o9z E +o5j Z1 +8 +o3U ssa sUe +$0 .8 +xB3 x04 +sna +x91 o8H +p2 '9 +^4 x31 +C *42 ++7 ^D +T5 x71 +k ^X +,6 s91 +*4A]i6U +i0m -7 +sHN +t x46 +.0 *20 +x07 c +T0 snv +k $@ +*5B +i2|[sBS +s2z*BA +$p *13 +*15 ^H +D6 [ $f +s61 Z2 +k $c +k $d +^4 *31 +^9 z2 D5 +$8 $D +iA_y5 +k +7 ^J +'9 *08 +$i *62 +l +5 +{ o9Z +^E o33 +*75 x72 +$R *70 +s90 $m +d $a x7A +T4 i4- +sbp i7t +T3 K +^1 o1f +^x } ] +i7r *32 +Z3 Z4 x07 +$3 i8_ xA1 +o7j { +i1m *95 '8 +i8@ $5 +i82 i90 iA2 +D3 Z1 o1q +c ^* ^* +] *45 +y3 $! +x76i5LT6 +x71 C +i60 *62 +o8B D6 o6m +^1 u -3 +^E x51 +qz4 +x07 p2 +c ^e ^h ^t +^W -6 +$_ $+ +^H *63 +slx +c si1 sa@ se3 +s3q +T2 [ d +*51 D5 +x82 o2g +x36 ^b +x38}p4 ++0 Y2 +T0 st5 +$J $B +{ i0C +i4> +-6 ,4 D5 +*A5 x76 +x53 *75 +i00 sdD +$e *31 +u ^D +'7 i2h +-2 x54 +z1 ^M +smG c +D1 -8 +.8y4x94 +i01 i16 +$7 $4 $! +x83 x04 ^z +$5 $3 $8 $9 +z1 x34 +sYCx09 ++1 $A +L6 $M T7 +i2x T0 +t sBZ +^g -6 +-3 i4z *63 +{ c *76 +x54 $a +o2d x32 +i0r ^z +c se3 sa@ si1 +x63 $a +q x48 +i8v { +$7 i63 +^Z *65 +*52 o1a ++4srS +u o4s +i4b *45 $x +D2 ^6 +x02 T5 +D1 .6 +x04 Y2 -2 +Z3 x13 -2 +D1 ^Q +$Z $9 +*36 o0G +[ $J +*84z4-6 +o1e Z1 +o74 smr +*41 +1 +k ,5 +$1 $2 $3 $% +Z3 x07 Z4 +iAE $r +K o9, +$! ,6 +[ r snw +o1t -4 +z3sG2 +s1R +i0x *0A x09 +C o31 +s2ip4+A +^j } +^ ^y ^m +s9L +LAy3 +] $O +$n -1 +K *68 +x81 *34 +x21 p1 +^k $i *06 +K i1a ++0 *52 +$. ,8 +^d x63 -6 +i4b $x *45 +Z1 [ t +*57 c +C o1e +i6d { +^W } +i02 i19 +o5l D6 +$t *03 +$U c +sWs +x01 q x0B +$Hi6W +*42 D1 Z1 +o1o Z1 +o7i L6 +l o42 +^e x46 +T0 ^j +T7 x83 +Z1 -3 +$3 $5 $! +c o7$ +r i1k +'5 ^z +fY5,0 +o53 u +t $. +^d $S +$; $; +-5 *79 +p3 x65 +*90 x26 +i14 i23 +*62r +i4. t +$@ xB1 +sr] +$L -1 +y2 saR +*80x59 +$. xA1 +Y1 ^T +$. Z4 +x13 ^z +$f Z1 x57 +p3 x52 x2A +sfHoAm +s1q l +{ *76 c +x71 Y3 +o1DsYj +z2 x32 ++4 x74 +i42 *46 +x93-2Z4 +*41 i68 +K $? +$0y1 +$E -6 +'8 c +*01 t *51 +i4q *47 +*17o8h +x92 ^S +^1 -3 u +o2i Z2 +Z1 +2 +o77$.*41 +y3 T3 +stJ +o01 -4 +*23p2 +d x7A $a +x04 -2 Y2 +o4_ o7s +s14 x52 +o3e 'B +r T5 +-4 *78 +D1 i0Z -5 +o69 $+ +i0T Z2 +^a x47 +o2G o0P +L6 ^C +x82 Z1 +o0^ +$2 i6a ++3 ^2 +*63 x47 +$s x3A p3 +k R4 +x6Bx19 +} x83 +o3m o60 +*23*B3 +'8]z3 +*12 i0a +} *21 +o0f ^7 +*25 x13 +x75*65 +^I i0S +$bu +$1 r x41 +$- $. +,Ao6% +*1B^^ +*5AY5spr +x97^OsO; +o5D x81 +$.$' +o5a +9 +$/$) +x31 *28 +o5g Z1 +$?$~ ++1 i18 +$_$; +'Bo8j +*18p5 +ksovC +^Y*35L5 +x04 o10 +^s c ++9 i8d +$]$= +$?$> +$$$_ +i3*x61x71 +x12 shs +i7Ro4%s^y +p3u +i6a z1 +*78 i6k +c se3 si1 sa@ +$1$9$1 +x13 Z1 +$0 x26 Z2 +L4o2Ik +o3}L5 +^d*68 +Y4l+7 +Y3i7s*54 +y1o6K +L0 +1 +$$ $7 +o3 *53 +ksqP*26 +x45 ^j +$x k +sOW*20$G +*47 *34 +$0$5$6 +,Ax48 +i69 { +D2 sgy +K c +i9A*50^@ +x52*87 +-3 -6 o2a +sml +i15 r +R3 s1j +x05 Z1 $u +x31TA +*A6*06 +$0$1$7 +*05LAi2L +o5j*A9 +o43 $1 +t o0f +.Bo9F +c si1 ss$ +o74smr +R8i8' +*9B+9 +i4k Z1 +o8#sOH +o8o Z1 +x3Bi1W +^s ^g u +Ci58xA1 +'7 Z3 +*15 x01 +i5Ai8^ +$1$0$2 +siS +^x$p*A9 +u o1d +sd) +i0fY4 +o35 Z2 +z3 o3j [ +r +5 +Y1{ +o3U sUe ssa +.6sXv +c$1$2$3$< +c$1$2$3$> +^8 $6 +x3Bsj ,3 +o50 ^b ++B-A +L2sW.i9Y +$X [ ++8-2 +*56 R4 +*61iB@sSn +^X^x^X$X$x$X +i3c i37 +x43 $k +$_$# +$c l +$c t +i12 i1c +sBM +i3d i39 +skg +i21i39i47i55 +i21i39i47i50 +[ o2G +[ i0E i0E +i18 i57 +z2Z1 +Z3 +5 +x45 -3 +i3d i54 +'9 T5 +$H *60 l +i36 i5c +i36 i57 +^- D1 +i59 i5c +i21i39i46i57 +$,$* +$#$- +$;$. +*98 +5 +i14 i1b +$/ i53 +$1 Z4 +i37 i57 +$&$_ +$'$( +i3e i36 +s4m +o3D Y2 +i59 i33 +i32 i5d +i5d i55 +i53 i1c +x45 o4z +i1f i34 +$z *23 +i21i39i48i56 +s9% +i1b i17 +i41i59i67i73 +i1d i10 +i5e i18 +DB D3 o0T +i50 i11 +oB- +i3f i3b +i57 i35 +o3P l *12 +i31 i1c +i33 i3b +'4 q +i32i40i52i60 +i58 i3c +soG +i1e i7b +i10 i3e +i5e i36 +$%$# +i5b i34 +i5b i31 +i1e i14 +i13 i5e +$=$_ +i12i20i30i44 +i34 i7b +i3b i1d +l i58 +i5f i33 +i3f i30 +$($% +o2e *26 +*31 C +i57 i7b +i19 i57 +$$$. +i37 i16 +^9 xB1 } +i5c i13 +i5| +c $9 $2 $6 $3 +i6W*B4 +sPr +csS}Y5 +i8Mx16 +*73*30sLV +^n R1 D2 +K x36 y4 +sRb +o5x Z1 +c $5 $8 $1 $8 +o3P *12 l +*50seT +Y1o2ly3 +$q k +sc$ +iAb{*27 +sJ2,B +$X *56 +Z4 $q x65 +i7c i52 +sKRx87 +y4x97 +{ ^y +.8 *38 +c $8 $9 $5 $2 +.1o0Lp5 +Y5-Ax08 +iAX +i58 i3b +$H l *60 +.5i3dx53 +-1 K +Y4[ +y5l+5 +.0z2R8 +i4ero1! +$g-8d +se`T7*80 +c $8 $0 $4 $8 +o8I$U +sxwo8] +iBN +z1y3 +z1$7 +DB o0T D3 +sxfl +o30x27r +siGz2*30 +*50 i0B +s#s +y4 ] $n +x0A^/ +do4w +-1 *31 r +ci6T +K *85 +]*ABsw! +i7c i72 +z5 x68 +i7f i76 +,2o4u +] *13 ] +x93C*65 +x5B*95 +$ $* +sha +soKi2ds1P +Z1 o5@ +.3 x72 +lx95 +*91xB8 +$ai0fE +p2 xB7 +o5t o1j +^ul*89 +*60} +*20 c *14 +i14xA8s^G +p5z4 +sHR'B +^usEw +o3n $4 +i76 i3d +i50 i7e +i17 i1a +$c $a $k $e $s +si# +i3c i76 +-1 ^0 +t o42 +x57x3A +p5i5. +r f x43 +o1k $1 $2 +c $4 $4 $@ $@ +c $9 $0 $! $! +c $0 $7 $! $! +c o2L +u+4 +c $2 $1 $2 $! +s^'^u +$6 $7 $! $! +i8Os}I +i1c i3d +s*o-4C +x19 Y5 +$4 $5 $* $* +i5[ +T0 TB T4 +c $3 $0 $0 $! +x61 $+ +s6N t +c d '9 $0 +^8 *43 +c $5 $5 $$ $$ +i1v *60 +T0 T4 TB +i3e i59 +c $9 $5 $! $! +c $1 $1 $# $# +i1f i7a +$2 $6 $* $* +i76 i19 +*75RAsgv +$M $a $y $1 +$3 $3 $@ $@ +c $7 $7 $$ $$ +c d '7 $4 +c $4 $0 $! +s$&x74{ +c $1 $0 $* $* +$8 $7 $! $! +x7B $? +*32 o7y +C '9 $4 +$6 $9 $$ $$ +'D $5 +$1 $7 $$ $$ +$3 $1 $! $! +i6a i7u i8g +$8 $5 $@ $@ +$D $E +T0 T7 TA +'E $1 +i15 i7e +c $2 $5 $! $! +$at +x29 -5 +c $2 $0 $* $* +*57 x15 +c ^f ^f +c ^e ^4 +c ^f ^3 +ss$ sl1 +c ^f ^5 +$0 $7 $? $? +$8 $6 $@ $@ +iC_ +*78 $9 +$a $n $n $a +KR6 +-6 i4j +snIoAX +iB% +$6 $3 $* $* +i35 i11 +c $1 $6 $* $* +*0Ax06s|. +i19 i71 ++6+D ++6*A9*61 +T0 TA T7 +iA^ +c ^a ^8 +*52^Q +c ^a ^b +sZg +D0 -2 -2 +i5z ] ] +i9J*0Bi5$ +c ^b ^b +sDVo5/ +^usd0 +$G $A +o4a t +i2| +*7Ap5 +c 'F +i52 i37 +c $3 $0 $! $! +c d '8 $5 +c d '8 $0 +c d '8 $3 +i05 i15 +i1e i39 +d 'C $6 +'D $3 +o2} +'D $4 +o2) +c $0 $0 $9 $! +$7 $7 $@ $@ +u d 'E $1 +.4k +csALy5 +d 'D $3 +C '8 $4 +c si1 T3 +su3 +ciA/s5d +sE3s%@ +$9 $4 $* $* +}sou +*45 { *25 +$8 $7 $@ $@ +i55 i31 +u d 'E $7 +sP?s4I +^2 z1 +i51 i36 +i6) +$4 $4 $* $* +c $2 $2 $4 $! +z2,7x89 +z1t +$n $i $g $a $m +*A7xA2 +i5H +'7oB Z4 +$6 $9 $? $? +co71 +$5 $9 $! $! +c $0 $3 $! $! +.3x73 +iA! x56 +x81*23*16 +syoszn +^b ^b ^b ^2 +T0T5 +o27p3 +x61y3 ++4*64 +c $9 $1 $! $! +c $9 $5 $$ $$ +xA3x34o1j +l $4$5 +c $3 $4 $! +$2 $3 $? $? +^s*58 +x68^$ +i41i59i67i70 +i71 i89 +o75z4 +-1i8l +$Ay1 +i70 i5b +[ $z +*A7q +: x03 l +x28*BAZ4 +i5e i1d +i3- r } +c $9 $6 $* $* +i19 i77 +,8x45*43 +^x +6 +D1 *12 +l oAf +y2 x43 y2 +o7$ ,7 s.# +c $1 $2 $? $? +i71i89i98iA4 +i10 i25 +$Dx26sT& +i6IiAu +i56 i16 +$1 $2 $3 $4 $5 $6 +l x9A x61 +slo +5 +z2oBc +i76 i33 +^bz1 +x34sVc +z1 +3 +x29 sS{ Y1 +$8 $6 $* $* +D3sX- +*65*94 +o7do34 +r'9 +[i5d +*72xA9xA3 ++6 o74 +*80D1 +c$2$0$0$6 +u.9k +*07$c +c $3 $1 $1 $! +c $6 $4 $! +xA9o2v +c$1$1$1 +DBo1i +*49*67 +{ i65 +o61sPJs5n +i38*31o79 +$4 $6 $! $! +^6 ^5 ^4 ^3 ^2 ^1 +smFZ5si! +$2 $7 $@ $@ +c^1 +Kt +i82i90iA0iB2 +^2 ^5 ^6 ^3 +o1JxB5 +o9nY2*06 +c $8 $8 $@ $@ +l $2$0$0$4 +K o3c +i2j i3a i4n +o3P +[x47 +x74TAo5V +x74*27 +$m $a $r $1 $2 +$s $o $n $a $m +x06RB +,6o97s4f +rl*4B +*32x24$3 +$9 $2 $@ $@ +x62s;-x4A +$9 $8 $$ $$ +x3B+2 +x61sj-o7V +Z1x37+6 +sK$ o5a +c o4S +xA3x21*A7 +Z1i5k ++4 Z5 x58 +i6Z u +o77sEq*93 +sRv +T0 c o5c +Z3x26 +saisLf +i13 i7e +sVMs!\ +[D0t +s64,0 +ci6# +Z2Y1x87 +]x29*92 +x97i7#[ +i39 i3d +i52 i1d +^+ i0- +i1a i7f +o3Z'B*51 +k$U +^z}*B9 +$0 $8 $* $* +s6Ly3 +swp +i9uRB +x53x85z5 +c $5 $0 $0 $! +$6 $7 $* $* +^G$v +i3,s$b +p5*63-8 +$Y-7k +i5> +k ^r +i11 i1c +$3 $2 $! $! +Z2R1 +c $5 $6 $@ $@ +sc!p5 +o2-s,C +o1jY2R9 +c $1 $1 $? $? +o5Ri9} +^{*58stI +$3 $9 $* $* +$1 $4 $$ $$ +d 'O +y4 D7 D7 +i34 i3c +-7s+oo5Z +sWZ*B4 +c $0 $1 $$ $$ +r *56 +z2*12D9 +$? x26 +.5 *16 +o3s ^' +tz2LB +x1AY3 +$1 $4 $* $* +x36 $. +$0 $2 $! $! +oA;K*30 +R9 snf +$@$^ +$2 $2 $$ $$ +i38 i55 +$j $a $n +i4Ss?' +x85iAG*A6 +i7R x61 +s^,oAF +^7 -3 +*ABseK +z2 Z1 +$z x71 +x54 Y3 +*41Z1 +d D6 t +sKm c +C o6b +'9*08sRU +s?E +D7+1 +c oA6 +]o2!s[( +s'r +D5 i0. +*37 $R +s9Q +i3s *87 +i8! o0O .1 +x41 ] ] +i6@ K +D6x16sIK +E +4 +siC l +*0As;@sqJ +saC +saZ +x14 *61 +u i5. +o7S *12 +o6o o2x +,3 T4 { +x4B { +C o54 +x91 i0L +sYi +Z1 $U +*94 x35 f +*42 z1 +o5G D6 +stR*57 +o6t ^u +] ] *13 +Y2 y2 +*05 *32 +] p2 *9A +s^6s6I +o0c y3 +D2 smP +T4 'A +scE +l i1f +z1 i0l } +i1a i12 +$3 $7 $3 $2 +^E y5 +$9 $9 $7 $5 +$9 $1 $8 $7 +i50 i5f +] ] -1 +x05x96C +x68Y2 +u^0^2^4 +s5J +oAA x15 +i30 i55 +x63Y4 +*75 Y1 +-3T1 +$5 +3 +*16 ,6 *46 +*A3 x43 +iAE*27$Q +sN3 +i37 i55 +] xB1 t +i37 i51 +s]hsBU +,4 i7y +$4 x58 +C *0A x07 +sBC*50 +x06 z2 $A +'6 s6T +l Y5 +x17*97 +l*37x94 +$k ,4 +x06 $A z2 +sfn*A4x35 +i0rtLA +,3 [ { +^6*98 +z5o8Dy1 +C ^5 ++4t +$z ^x +i1q o1H +*17 D6 +i4G +1 +Y5$*x4B +x64 o3f +skn ^p +l +6 +i37 i70 +$I c +*58 o5t +y2 .0 +sMW { +Y3 o9i +-1-B +i3e i12 +*49 x24 +x73 -1 +su- -0 *32 +i3f i79 +*35 *51 +T8*69k +f ^t x17 +u i7R +sa5x62 +u sAL +$F ,1 +*45 ] +Z4 x65 $q +i3b i76 +C +1 +iA7o3F +*26 i7t +s93Y1^M +i71i89i98iA9 +y2 *57 +s90 Y2 +x46 d +iB4 +sWF +Z3 T3 x02 +^d.4 +$H *54 +x34 -5 +x34 -7 +*85i6/D7 +x83 Y1 +x48s1^xA3 +sY3 +su- *32 -0 +i1b i32 ++1y1 +L4 +4 +i3e i7b +z2 D5 +sVF +i5d i77 +sXT +i72 i34 +sDd-5Y4 +i2b t +o7z l szM +i1e i7f +s9^x5B +C*14-8 +xA2 ] i96 +o4K +2 +,2x87set +sCs +z3 x48 +$Z x56 +.1 y3 c +swn E ] ++4-A +*23 R6 +D9 +8 *87 +s]cR1 +i8! .1 o0O +x75 $= +r $V +$4Cx03 +sHU +x62 { *36 +o6s E *51 +$2 x94 +i74 i5b +i1e i13 +i78 i5b +] Z1 ^f +T2 i2_ +D7 +7 +*03x6A{ ++C-E +s1B '5 +x51 s5A +*20 { +sN6 +*43 x73 +sdk +5 +sM! +^l i7h +.BxB7^< +$z u +-7 x23 +x1Bz5 +*40 x02 $j +i0W o2j +shV +$v Z1 +x57 p2 +[ o19 +^Y *65 +i57 i34 +$l p1 +y1 i2H .2 +i1o i2t i3h +-4^F,B +i1c i51 +*60*72'3 +i5b i1b +{ scs ++4Z2xA4 +z1 *56 +,BD0 +,5 D8 +sKO +i61i79i88i93 +*10 d x7A +,6 { +x38 Z2 +TA 'B +*21 y4 +i4K y5 } +D5 z1 +K i5A *06 +z5x59i9L +o5Z] +sl` +i7f i56 +,8 +9 +Z1 i0U +z5 x83 +^n i17 ++6 x76 +^M ] *16 +i6V k +.B +B +*15 *54 +3 +y2 .3 +x46sM+xB7 +spY l +sfk p3 -0 +o9U +x61 Y3 +i51 i35 +i51 i32 +^9 p4 x91 +x72 Y1 +s A +cs)CL9 +y1 *23 +i8l[ +i0 *20 +i56 i1e +i11 i79 +^Z*65 +*63*47o2c +] -1 ] +sng i3t +^n D2 R1 +i52 i7b +i52 i60 i72 i81 +$?$= +*21 C +i4_ x84 +*79 x45 +*53 ^d +^ix7Az2 +Z3 x45 +x91*78*13 +o0G p1 +x73 *04 +sb+ +x36t +x56 [ ++0 x53 x73 +D0 i09 +-4 $B *56 +o5Ss2e +.8i3. +i5a i1c +sy6 +R0 r +y2 x45 +x13 z1 $g +Z1 ^' +i42 i50 i62 i75 +i7' x73 +i7b i56 +x18*06 +{ D8 +*79slI +i32 i40 i52 i61 +Z3 x21 +*05 *26 +o3Y +i56 i3c +u.4 +i58 i5d +sy' } +x39 K +p2 x05 u +i5e y2 +s0GDB +sD*DB +^r u +$9 +3 +$U $S +Y4 o1p +o6Z +5 +Y3 *61 +x23 +2 +y1^P +i6A u +p2 u x05 +x14 i1[ +o66i9g*95 +x16*2B +x17i79 +p5Y4 +]i5O +seqsKt +[ o6N *10 +.4 { r +sr$ [ +-0 o6p +$X x12 k +$@$< +i0I x53 +s1P*09 +swn ] E +T3xAB +oA& +*42 Z1 D1 +*52 ] +i52 i60 i71 i84 +i12i20i32i41 +x14 $M Z1 +*75 $m +^M *16 ] +T5 i7A +^t x37 +o3f $1 +*69i7Ns%^ +i0m-7 +p1 xA8 +d x65 x52 +] t xB1 +i31 i7c +i38 i56 +T3i2EiB" +sKI +sRMo7^ +kx16 +x34k +'8 *04 +oAJ +R2 i28 ++0y2 +*28 .2 +*15 +3 *54 +i82i90iA2iB1 +sJV +K i4S +o59 sPS +D1 L0 +o9hd +x05 -4 +*76z2 +i37 i11 +t,2 +Z4 x23 +s&_o4XTB +.0 .6 +*01 *15 *13 +.1 *60 +sM4 +$l ^O +z4Y3 +i1e i17 +.3.0 +o14 ^6 +i42 i50 i62 i74 +i21 i39 i48 i57 +$w k +o0i c +x71sar +xA2 i96 ] +i41 i59 i66 i74 +[x14 +s2V +x43 y3 +sHW +*13 Z1 [ +x52 shw +^9 i2+ +*40x73 +i7c i79 +-1 x24 +[ *10 o6N +i5f i56 +i0I +2 +i4K } y5 +] $8 +*50 ^L +i7e i77 +p1 -2 x57 +i7e i72 +spE +k *64 +oAn x26 +'6 ^Z +^L ^B +x94 i9v +x83-0*39 ++6 -1 -2 +sdg o7a +$XoBn+7 +$1 y4 +z1 $7 +[ i58 +x72 *15 +Y1 y1 +x93] +cp5smh ++7 -4 -0 +x75y3 ++0 -8 -4 ++2 +6 -5 +Y3rsCj +s1sR3 +[ Y1 $h +*2AY1x74 +^v x56 +z1 i8a +$w $q +xA7*37 +*87 i88 +*07 *18 +*37 *56 +i5y i0r +x71 c -0 +D3 $n l +D4 $# ++6 -7 -9 +smsx04i0$ +D4 $f +$b *56 +x7B$[ +i13 i70 +sfZ $l +-1 -5 -4 +i5f i74 ++C -4 +$!$^ +i7e i56 +i55 i3d +$! *45 +^d^9 +o0d o1u ++5 +8 -7 +s5% +s5, +x9Ax17x4B +i37 i52 +{ z1 Z1 +s5f +i3e i7f +*85x15 +*87 x26 t +saf +p5x57 +*27 *76 +i30 i57 +^5 y2 +K-8{ ++7 -0 -4 +t ^d +sC% +s8F*93*5A +^{ K o0I +-A$Ci9o +$6 k +i3f i73 +$u t +^Y*31 +o0=sKg +i7f i5d +-1 -4 -5 +i13 i57 +'7 o1n +D9 x23 ++2 -D ++C -E -E +o5i K +i0v o4w +L2 } ++0 $j +z1 r $i +l s7. +p2 [ +slm $a +-7 $R +^E x41 +] ssr +^a ^p ^a ^p +^u ^k ^a +-2+B +sA7 +] ^f Z1 +i5k D2 +-D -E -E +*23 i0F +i79 i3b +i7Ft*2A +i7b i77 +^a ^v ^i ^v +i51i69i77i81 +$t ^p +*31+3*51 ++A -E +$'co8L +i7e i10 ++5 +A +A +o3V*96 +*01x35 +^o ^l ^l ^e ^h ++0-D +^r ^a ^m ^m ^a ++6 -9 -7 ++5 o2q +i71 i13 +'A s97 +i1d i76 +s6w +x21 { $" ++C -A +C +i75 i3b +i75 i3f ++2 -5 -4 ++C +C -A +o0s Z2 +^BC +$ *84 +s7.r$S +so. +D2 r +s1u +*72 x73 +sqs +[x93 +*12 } ++2 -4 -5 +,4 d +-A-4u +i54 i3b +*43 l ++1 szl +^k ^a ^k ^a ^k +.9K +^# ^@ ++4 -C +*35 x52 +r ] i0Z +x61x8A$) +s'f +oAV +]rY1 +y2 x47 +i70 t +s1$ +xB2 iB9 +x24$u*3B +} ^p *05 +x05 x23 +*76,1 +'6 i5w ++4 -6 -0 +z4 x07 +xBAsCM*32 +Z1 $w ++4x92 ++6 -2 -1 +-8 T4 +i7b i78 +R1 x23 ++5 -7 +8 +*42 ,1 +^z i4_ +r i0Z ] +D0 p2 +o7xA6 +x19Cy4 +^/s6S +i4g l ] +x42 i3U t +seY +*30 Y2 +tL7 +i77 R9 L9 +-6 *96 +*04 ^P +i56 L5 R6 +c $, +x59 x76 +*23 y2 +$c $r $o $s $s +x52 y1 .2 +x36 +3 +$p $i $e $c $e +x47 } ] +$9 $! +i51 R7 R6 +T7i5P +ss2 T4 +i3c '6 ++9*56 +cs.! +sl9 +i52 R8 L8 +kEoA{ +$a *42 +o3i xA5 +*36D0 +x43R5 +-8 $w +x31,1 +y2$Yx93 +Z1 i58 +p5 $h +-2 l +7 +-8x14 +T5*A5*17 +^F u +f x71 +y5 $2 +i3d R5 L5 +D0tx36 +sqe +}s5T +Z4 -4 x95 +i8y*59 +$q x86 Y1 +i1a R3 L3 +i51 R0 L0 +Y5 xA9 +i4 Z1 +-3i2a +l $0 $9 $0 +Z4 x95 -4 +$y Z2 +-BZ1 +d '2 +x04d +$1y3 +*38$6 +D6 o3F +$@x92x83 +D6 o3t +oAo -7 +i7e R8 L8 +t ] { +sb-o0k +tT7 +l^1$1 +p2 x17 +} o53 +s/}rp1 +i4o +8 +iBzud ++3p1 +} o5v +^* z1 +i92 xA6 $4 +-0 ^I +sw8x02 +s,"x61 +s5EspK] +o8,Z3 +C$7 +'8 o4s +RBx67'9 +$rx73 +c sSa *02 +o0m*93 +*72Y2*0A +x16 x72 k +EC$d +c *02 sSa +*3Ax85o60 +,A.4 +D6 xBA +p3 $3 +l '5 $0 +Z2*B5s`O +$mDBl ++0 R2 +*67 k +-6 i3i +xA4 x03 +D6 $f [ +D1dxB6 +Z3xB5 +p3 *75 +^, x28 +*B6fs{# +D5*86 +*8Ax46Y4 +Y2uE +.6x71 +i4vo4i +s4@*65s +i62i70i83i92 +$g $n +$. ^6 +ux34 +$z z1 +Y1 x35 +Y2 *76 +suc +$l -0 +i2e i3l i4i +-2 -C +y2 -4 p4 +z1 ^x +c T6 T2 +Y1R4 +$y $e $a $h +x65T9.8 +s-kx49DB +$X E +$% ^1 +$3 ^# +x24 ^W +$Ts/nl +*13 *68 +iAp +$7 x03 *20 +x42c +x6AuY3 +o3e *17 *13 +i1b i7b +i1b i7a +i32 i16 +-2 *31 u +c ^5 $6 +i2ex2B +z1 ^8 +cy4x53 +x19s4/x67 +*67 c +} x2A +'9 R8 +D4 K sah +$a u +0 +T7*7A$h +ser +Eo0zo2v +i6i svt +T5 *67 +o5i 'B ++2 +D +^ ++3s;< +s4X +i32 i3b +-4ss]x98 +s.k +sgE +i2L*0A*32 +s7Dx12 +*32x14-8 +K y5 x48 +s'ho8B +C ^S +x24 '8 +sae *74 +D4 D9 +i3C u D2 +k} +*24 *65 +i1,sZ| +x18T5p1 ++6 u +D6 D9 +xA8s}uLA +'7 i44 i52 i60 +*75 *13 +szSi9Ki3! +c $i $c +x14 $n ^M +y5 ,3 +c i2c p1 +i2b i3e +} *51 +i0H i1e i2l i4o i3l +$6 $1 $2 $0 +$? $1 $9 $8 $9 +z3 x39 +$3 $3 $1 $9 +tsC+Z3 +Z3 x23 l +$7 $3 $9 $8 ++9s.[ +'6 i24 i32 i40 +*76.2 +u i24 +^a^4 +*32{,A +o0S sgL +Z3 xB4 +x93 D0 +sczo9. +shY +sc2 +i9# t +c $_ $7 $1 $1 +syt x8A +^v*0B +$3 $4 $8 $3 +Es[xo0* +$#$. +$O D4 +c K p1 +x16 T4 +l '5 $9 +^b^6 +i67u +o0b *43 +i2n i3c +*49 x67 +o2E *62 x04 +i19 i26 +^b^4 +*14 $7 +^O Y4 +L4R8 +o1( u +D6*A8 +-2i40scY +[ u x41 +D7 Z2 +*10 ,4 +^b^0 +i2i i3m i4e +p1sTE ++3 y1 +x23q +i38 i7b +k*86 +i7r i8o i91 +oAy x51 D5 +^0^e +D6 L6 +r $o $l +i0 +i0p i1a i2p +i6x i71 i82 +i2c r +.0x74 +$0$4$9 +$0$4$7 +$0$4$2 +i4e i5k +*68sG\ +o5? i6? +i4e i5c +$. C +*53L6y5 +x34 o3y u +i21 ^2 +i5r i6u +i5r i6t +'7x56 +x67sU\ +*A6*B5,A +$Q c +*09 x34 +o5h Z2 +[ x84 +seh +$8 *13 +*B5swf +*14cc +siz x01 +T0 T2 T7 T5 +x7As2hx3B +xB2^] +i5n i6g +] { *56 +^- ^6 +iB_*24 +$2$0$1 +o7. -2 +i1o i2r i3r +$c z1 +o07 D2 +Y2d +i04 i14 +R5 Z2 *41 +Ex7A*01 +i9)sC] +$($! +$$$+ +$+$} +i3a i4d +$;$] +i2s i3u +x51 x25 i3k +$-$/ +ssj +i3T*32sjs +x13 -0 K +T0 T5 T2 T7 +ss. +ss7 +x64 x32 +T1 T2 T8 +i8b i9e iAr +T0 T9 T1 T8 +xA1i2Dsjr +i8t c +o2a swr +$ $+ +u i5Y +i3C D2 u +s0^ Z1 +*78 *62 +$^$? +c T5 i5. +i3"*2B +i54 *31 +K } [ +i9t iAe iBr +i2s i3k +*A2*87 +Y2*06 ++Bx89s;e +x24 $g +i5a i6y +snh *84 x54 +i0o +7 +svM +-9 *01 +p2 x45 +^2r$l +$. $s $h +i5g { +oBn [ +.0LBT2 +} *23 +i6t i7y i81 +i9t iAi +o1i ^r +} *59 ++2 T6 +*42 ] ^g +*B4 x37 +i8v i9e +l ^d ^r ^o ^c +E[-6 +i1e i2l i3e +i5g T1 +y1^C +st^ +.1 x29 +] o42 +x4B[ +x28 o0d +r K i5e +} i0v +o9_ xA7 +T5 -3 +T5 -0 +sKx +i89 i94 +z2 x38 +x32 k p1 +D0 x45 +x81 -1 +T4 sIs +i9J oAo +i1e i2l i3l +i4t i5r +T0 T7 T1 T6 +s2j *63 E +x04 ^M +l $. $j $p +^M x36 ++7 *07 +$. $p $h +l o8- +i9s iAa +$. $p $s +i4a i5m i6e +i30 i48 +T3 T7 T4 T8 +x16 Y2 c +$` $` +x73 Y3 x52 +$p o0b +x43 i77 +*53 sun +K o23 +c i3- +} R7 o0A +Z2 x54 C +sgw +o6. ^t +R5 x41 +i3a i39 +r i4h +*16 ,2 +i8a i9d iAe +sry ^l +c T7 se3 +o5! o2l +o6 x13 +iA) +i1a i2d i3a +i2m i3s +^N x54 +i0Q ] +$c $y +^D ^A +D4 o3p +siE u +$U D6 +i2i i3n i4k +c o3- +i62 ^I +^1 ^e ^h ^t +x42 'B +T3 T8 T4 T7 +s3_ p5 +x64 $9 +.1 x61 +i3g i4a +$/ $2 +$/ $. +o1_ z2 +T2 i2. +[ $m x13 +T0 T1 T8 T9 +$Z y1 +f } +-0 x53 +$b t +[ o7Y +i4t i5e i6r +*50 c K +.3 C +^g C +i6i i7d i8e +s93 Y1 ^M +[ i7a +z1 +4 +i7a i8k i9e +$y o5x +^d x32 Z2 +K ^f +*34 *26 ++0 R2 E +i2t i3o i4n +K $4 +i3a i4y +D2 o7q +x46 i4Y c +y3 D7 +*31 $- +*74 K +k ^@ +Z2 C x54 +T0 T7 T5 T2 +*52 *70 +szt +i4w i5a i6r +i3a i4g +z1x91y3 +E $% +$_ -4 +*50 $e +i1a i2m i3b +i09 i15 +i36 k +i5c i12 +i11 i54 +x03 p5 '9 +l o5, +i4w i5a +l o5< +L0y5+B +$q -7 +x41 o0U +i3f i4a i5n +i3f i4a +i1o i2b i3b +i3f i4e +^e ^n ^i ^l +i3b i4i +o1JxA4 +x13 ^W +*80x51 +i1o i2b i3i +*65 ^z +-2 ,1 +i2i i3s i4t +x81 o6I +$L c +$~ $~ +i5o i6c +$5 z1 +i8m i91 +i1n i2d +i9m iAo +o62 o7_ +-7 i6. +i75 $4 +y4Y1xA4 +i81 i93 +c i9- +o6d +4 ] +D4 sah K +^1 *06 +D4 o4/ +s@_ +i8m i9i +i2r i3n i4a +o2t *24 +i3e i42 +i1a i2t i3r +c i5# +-9 iA* ++1 *04 slk +i1e i2a +t $9 +x04 $$ +-8 K +i1a i2t i3e +^Y *64 +D3 -1 c +i3i i4c i5a +T2 Y4 [ +T5 x01 +i73 i80 +c Z2 Z4 +sev +*35 $a ^v +i2l i3d +i3e i4a +z5x71c +Z1 -0 +D8 x61 +o9t u +i7n i8d +x53 .4 +i0j i2n i1o +i8u i9r +$r T4 +i1a i2y i3l +$> $> +i1e i2p +i00 z1 *08 +T7 +6 +R0 i16 +$. $@ +i1h i2a i3t +i7g i8e +i1h i2a i3d +i6l i7l i8e +o26 ] +i1o i2m i3e +i4s i5h i6i +$5 $1 $! +r o3p +i1a i2r i3r +i8n i9i +] i3r +*80z2} +Z3 $S +c .8 +i20 i32 +-0 *43 +*A6 x26 +o15 '9 +^h r +i73 i83 +x04 p2 ++1 slk *04 +i2e i3n i4t +i6d l +o1A Z3 +y2L0 ++Bx7B +$r i6n +i6o i71 i81 +c y4 x53 +i3v i4a +^=*68 +i7s ^j +so0 se3 u +T0 T6 T8 T7 +k ] i2_ +*64 o0Z +i9n iAi +o5l i6s +$R -2 +slv -7 +$. $n $l +[ o1T +l ^i ^r ^t +$4 $& +o2e Z1 +i8g i9e +Y1 $m +{ *37 +o9R ] +^m ^r ^a ^f +i21 i30 i40 +x74 o0g +i8s i9t +^l o4h +] $S +x37 l +*61 D5 +,7 x12 +i31 i49 +i6v i7e i8r +T0 TD +*05 x42 +o2s i3c +i6a i7y i81 +y2 x42 $- +*03 R3 +T7 i32 +so\ +x16 c Y2 +o1&s^3 +T0 T5 T7 T2 +x04 o3l ^M +*54 'B +Z1 l *69 +$f x57 Z1 +i22 i30 i43 i50 +i77 i85 +$S x32 +s8l ^P +x15 E +'9 *83 +$3 $9 $! +T2 T3 T6 T4 +K .6 +o6n o7- +sLfxB9 +i32 i47 +i3i i4e +$1 $2 $3 $^ +s8B +z2}LB +i4p i5e +z2 $A +i4e *34 +k K *15 +i7d i8e i9r +[ i4= +Z1 *69 l +$e x25 +x18 +0 +i0K c +1 +u i5E +$Z D2 +x02 *50 t +c Z4 Z2 +i51 i69 o78 +i4Aszxo8\ +i0f i1a +$! o6o +i3@ '8 +-2 $3 +i0d $x +T3 T4 T7 T8 +i4r i5i +i10 T2 +.3 x82 +x42 i1a o48 +T0 T3 TB +[ $u +sdr $1 +^F x25 +T0 T6 T7 T8 +i4r i5t +$o o6w +i3m i4a i5s +$. $a $u +ssg *75 +Y2 E i52 +*17 x71 +x25 x51 +2 ++0 E R2 +T2^IsY| +i80 i96 +^h y3 x12 +oAs x42 +T7 TA +i2o i3c i4k +$& $5 +i4i i5c i6e +$m i2i +$x x71 x63 +c T5 T4 +$G ,1 +D3 i2u +i8k i9i +i7T t +$4 d ] +i6a T1 +i1p i2p +dxA9 +Y2 T8 +i1p i2a +D9 D6 o3t +x42 x92 p3 +$d stm +T7 } +x63 $i +c $& $4 +y4 ] +o7^ss# +i1b i2c +f x34 +T8 DA } ++1z2*34 +i59 Z3 +^r o81 +T4 r +.2 o99 +x32 .5 +D9 o5a +i0p *40 c +o5y K +T0 T7 T6 T8 +T9 xA3 +i1e i2n i3a +x14 ^2 +Y2 $2 +Z1 o22 +Z1 i4y +Z1 i4s +o7Q x61 +*71 .6 +ss5 u +i3m i4o +'6 i3m +*21 [ ] +-7 *70 o10 +i0P s0c +*40 o58 +i4o i5w +z2 *04 +ss8 T1 +*25 o7A ++0 t +k i2_ ] +i2n i3g i4e +o1k ^i +T6 x41 +i8s xA1 +'5 $r +o1&*B2s2T +T2$8*84 +i7a ,3 +i86 i96 +i1a i2n i3k +*42 r +i0K +1 c +i7t i8e i9r +x82 c +x82 u +uR1i5B +i4( +i5e i6r i71 +$* $( ++3 z2 +-9 t x02 +D3 xA1 D4 +u o7I +^W *75 K +*40 o0B +*A7*B2 +R4 o3o -5 +u x21 +1 +xA1 i8- +R2 +1 +} o0A R7 +Ey2 +s93 ^M Y1 +i9o iAr +*9BsTs +i8a i91 iA0 +x81 +8 +$o k +l i6* +-3 *14 +o59 *30 +T2 [ Y4 +D1 ^W +E sn2 +i4i i5n i6e +-0 $) +ssa l +x92 Z1 +i1i i2l i3i +$0 $D +i7! R6 +^a ,1 +i3r i4t i5y +Y3*50 +o03 r +i6H Z1 +i4i i5a i6n +c ^1 ^e ^h ^t +^M sr1 +$h^z +i7k i8e i9r +Z2 o68 -4 ++4 o7T +x52 $O +x12 Y3 +i8g i91 +i7t i8a +i6F x02 +c se3 T7 +-9 x02 t +d c x58 +x32 $L +c i6T +i7t i8h +i22 i37 +Y2 i52 E +[ oA4 } +i22 i30 +^C ^A +o0T ^P +T0 T1 T7 T6 +^i D6 K +i7s k +i4Q +k sgd +$. $g $m +i6Ex09 +T0 T7 T6 T1 +^' x51 +i2z i3z i4a +T6 i59 +sra +l *64 *30 +c T4 T5 +$. $g $s +i0p i1e i2p +i12 i20 i31 i41 +,3 T5 +i8L $k +sbp i7! +i4u i5l +s2j E *63 +d x29 $z +D5 o5< +$+ .7 +i8l i9o +Z1 $O +i8b i9a +i1y i2n +i23 i33 +i4i i5o +x14 $i +$) $( +Y2$r +^F ^e ++0 { Z3 +^V x15 +x28z3x96 +i59 l +T2 T4 T3 T6 +i2v i3i i4n +D5 i3r +o2f p4 +x25 +2 x51 +$. $! +x62 d +i1i i2m i3p +i1u i2c i3a ++7 ^G +c x53 o5u +[ ^X *12 +p2 r x34 +*70shZ +$0 .4 ++5 D4 z1 +o7b *34 +i9K K +i83 i99 +x21 stl +y4 D7 +,4 $M +x23 ^6 +K T1 -1 +^Y *31 +'B k +o73 *52 +o12 k ^4 +i4b i5i +$v $6 +x31 o2U +y2 $- x42 +$i $z $e +*20 D1 +$f x05 +s.p +i8L +6 +'7 i3z +i7e i59 +sLs i1h +x42 r +^s $9 +$- Z3 +i7b i59 +x25 $d +^t ^n ^e ^c +i7f i17 +*76 scv +i7f i13 +i15 i57 +i10 i59 +i2r i3i i4a +-0 t *36 +o31 *70 +i71 i82 +T0 T8 T6 T7 +^s $b +$9 $4 $2 $6 +oA7 +5 +-9 o60 +Z2 ^@ +-7 smb +l $. $t $w +$3 $8 $4 $1 +x62 *27 ++9 ,8 +*95 ,5 +x27 o1j +o42 i61 i50 +$g ^t +{ x21 +o1z *59 +*34 K } +D2 o2S +-1 .2 +x82 *54 *37 +] x43 +i7s i8s +$$ $3 +i2i i3k i4e +i37 i43 +T0 T7 T8 T6 +*31 sns +i4e i5r i6o +$6 $4 $8 $2 +t o7! +i6a i7r i8d +o8i $k +Y4 *87 x86 +*45 *72 +c $$ $5 +i2r i3i i4n +p2*B2 ++2 ,4 ++A D2 +i5a i6m i7a +x84 -7 +x7Ay1k +o8ly2 +,9 +5 { +R7].8 +x05 y2 +'6 i00 +x97 c +sA6*76x57 +x04z5 ++9 *58 +Z1*64 +x04'B*78 +i8fi1lsLJ +*B6 x95 +$c Z2 +l $2 $3 $4 +D1 $0 +c $a $8 +Y4 D3 +oB7 D8 +srK +x4A*68x48 +s45x83L7 +sUC^A*B5 +*02s@Gx56 +p5 ^Z ,3 +x5A]y4 +x64 *03 +srp ^f +o7s x93 +*27 *14 +,7 K +sqZ l +sa4 sg9 +sM($z +x35 t +o6n $y +{ t *18 +svg +xA4$k +x57-1 +}x82^M +T1 -3 +o44 u +D1 $_ +l '7 $3 +*A5 x35 p1 +[D4x73 +$? +6 +$+ x53 +r o43 +x8B*24iAp +*30s;Rc +o20 Z1 +x13 +0 +$3 i66 +oBc.4 +*57 *53 +lx27^2 +c x17 +.5 o4d +^d o64 +c $d $1 +o6H +*0A x34 +-4x29 +*12 i2- *43 +*56*BA +s7- +L6*B6 +*B3L7 +R0 x25 +o0v i75 x17 +x06z2 +stz o4z +*6AL5 +$. Z2 +Z3x25 +l $. +{ *A9 +i4a i5g +Z5x46Y3 +i4a i5b +$- x52 +l *30 *64 +sPm^1*74 +i2bx14 +sd"$Px78 +iBPxA9^B +L7*3A +Y2sjc +*12y4 +i4a i5a ++Ax95$j +d i5m +{ x13 r +i1o i2o i3n +xA2 x17 +i2d ,8 +x61l +$L x73 +sjp$z +'8sfC +i8e i91 +D5iAa +T4iB& +$g*3A +o4w ^l +'A$Nl +iB1 xA2 +uY4 +,3 x96 +E x72 +l '6 $4 +*68 x21 +*80y3 +u $1 $9 $8 $2 +x21x5A +z2 x93 x0B +i6n o1- +D4L8 +x36ft +R7*0A +x23 p2 x82 +i0Gs^u +Y5 x56 x01 +$4i51oA< +*4B]u +xB5] +{ *18 t +ssBi77*08 +i4e i5r i6b +$xx79 +$V u +'8 o7/ +$8 u +x65 $+ +i5p i61 i72 +D2D9 +*B0 x36 +$8x28su- ++5 ,B +s0kx97s_< +i99 x01 +*12*A8 +T2 TB +sK#x72s4| +qseWx5B +-2 '7 +i2- } +sJWx92 +x62x35 +x25o6Ed +x36+8p1 +'7'8x83 +Y2 $p +y5 x93 +oBf x26 +$2 R6 +x81 '9 +p2 *30 +i54 R4 +i69s]ZD7 +sLoT1 +sSe] +i59 L4 +*16 r +$#x5Ax95 +*70 *61 +T9*38o7a +R9Ky4 +i36 L3 R5 +Z4 x87 +s/xxBA$d +sbpi7!s_) +^3 R1 ++9o5a +D0 ,8 +*64f +l '5 $7 +Z3 l x23 +[s]ok +x03 o48 +s-GZ2 +]*6BxA8 +Z1 i5e +y1x73l +l i0R +x86K] +x79*30 +-5]sXw +^4 i7@ +s+>$eshQ +.1 *62 +$0sqys&V +*06 ^h +i9ndspP +*52 x21 +i6esF\ +*02*90 +$n o2- +,8 *34 +fsq$ +x32 xA4 +EdxA3 +R0 x12 +x21x68Y4 +oB2+0 +*89 x51 +*41 i6s +$d ,9 +i0t z2 +sTKq,7 +*67 .8 +d*17 +sa@ c +*80 o0k +'9s.8 +x08^f +i4h } +o8G [ D6 +x94s/_x52 +DA^a +z1 x28 i1_ +.A'9$x +D5 *59 +x04 r +x52D2Y5 +x93 x41 +^j u +[ szp +xABD7x57 +$3 oAg +} o59 +Z3 [ { +y1z4 +Z1 $0 +seax38 +$7o7uxA7 +xA8 } +[ x13 $m +li3C +D3 c -1 +xA7i3Kx18 +^0oA, +$i x36 +s9v'8-8 +o86 *53 +c +0 *52 +xA2oB; +x42 *30 +o2Z [ +o8g ] +i72 R4 +D8 Z2 +*21y1x24 +i5e R0 L0 +c i1- +si1 ss5 +[y2 +[ i0g +$,{x01 +s7Vo4F +q o8m +DA *86 x84 +^/ c ++3 $w +i0b i1r i2e +sq- +*53 Y1 +x94 Z2 +p1 xBA +i72 R4 L4 +i9^l +x82 *37 *54 +-0 *36 t +$C $D +$p ,1 +i7e R9 L9 +p2x37 +x14 ^M $n +$|sLy +$u d x58 +i37 R5 L3 +ld ++7 i1p +t i5g +R5-5sjQ +o6# Z1 +i5e R8 L8 +x08 x49 ++B $t +Kx82^r +i52 R2 L2 +s3qx8BsB- +xB7 p4 +x26 p1 [ +*B7x47 +$. $u $k +[ DA f +l *68 o6y +c i12 +$4Z3 +x62 q +i5+l +y1 x32 x24 +ssh k +Y3x03z1 +KsA>t +*08x97r +i37 L3 R5 +i1a i2c +x92D0 +c i8a +x51 *48 +y4 -8 +T1s(i +o5k *21 +x75 i2x +D4^g +*30 -9 +i1f R4 L4 +*25 *45 $p +i75 R4 +i50 R4 L4 +i5a R0 L0 +] *83 +o6d ] +4 +$>x65s3b +x07 k +x45 $p l +i36 R5 L3 +i72 R3 L3 +svoo7o +i57 R4 +'9$&TA +ls|!$w +i1e R6 L6 +R5 *41 Z2 +o4Bx52 +*A1 x17 +*98x96 +xBAx03$O +s3p*89 +*2Bi9wi12 +*49x03q +u*9AT4 +x04z1sYl +x42x35 +i3b R0 L0 +*9B^N +*08sHD +R8 -5 +o7 x02 +p4 x85 ,5 +x23 z2 +x79 x68 +*18s{\ +c i8# ++9o7] +o7s she +o2P x61 +s#to8> +x51 i0w +z2 x35 *03 +i71 R4 L4 +u ^0 ^1 +D4x21 +i73 R5 +i72 R6 +*7B-2 +o6 o8o +[x39*07 +o6zx4A[ +KoBQ +i1a i2u +*12 x52 +x63 $6 +x2Ao2, +$5 $x ++8 o00 +*B3i80c +c $6 $x +*12'7E +o9w *32 +x32 $t +i6e i7y i81 +E[svq ++0 *64 +$xy3*A7 +o8-*68 +i1e R8 L8 +lKz1 +c $c $7 +i52 R4 +i2l i3l i4i +*A9{^b +swn^/ +i56 R4 +*3BD3z3 +s-o +,1y3 +u ^a ^4 +i3- c +p4 ,5 x85 +s.j] +s$RswQY5 +]^mo81 +u $D $A +T2 T3 T4 T6 ++1 q +.2 x72 +E ,9 +x93 x42 .1 +xB1p4 +d sbh +L7RA +*5A] +$1 ^& +-4 o1B +o0p i42 +i5@ p4 +T6C +o2f } +$Ws}X +smt o3p +o2f r +$r $o $c $k +^$ x12 +c $3 $e +{ i5i +c $B $2 +f *20 +sS.*21s3{ +C s04 +$C $B +$1 $k +Y4*1Ax8B +Z1 } o12 +x17 $1 +-9x18TA +rz1*42 +Z1 k +xA2 *20 +.A K +K o2- +i1t i2a +x82o3%x56 +y3x47 +x05 D1 +*0A] +x4Ai3q +^i-1 +-6 $p -2 +{ i5r +x82 x46 o2g +c ^8 $@ +sY`i6y +Z1 *56 i5m +sLP +c T5 so0 +*5Ao33 +^F ^d +o2V*2B +^2 ^x +k +6 +q x24 +z4 x84 +s5b [ +o6t o36 +KxA7 +*54 x03 +i8d i9a +*63s^4] +sDsDB +iABse- +x35*91xB1 +z1 Y2 +Y1 y4 +i1f i5f +p4 *10 *82 +$8 ^* +s9Zs+{sXo +*51 $z +D3x13^@ +c $9 $+ +*08{ +^@ ^3 +sZH*35 +c $< $1 +sVf$Q +s!/c +i61i79i87i99 +sMV +i61i79i87i95 +x16 .1 +i76 i5c +i76 i5d ++D -7 +sT\*2A] +] *72 D4 +x42,3 +$As"{^a +R2*69shx +x05 q +^B ^D +] *23 +c ^= $1 +*03 +1 +x52 y4 +l Y4 +k z1 +x61 ^q +i7e i53 +-2 o3P +s79 $m +o4w Z1 +$f l +Z2 $7 +Z3 x16 z3 +i3s Z2 +*31 $b sby +$! x76 +$- Z1 +k K ^P +f x3A k +syp ++6 s87 +'6 ^y +i0c -7 +d o1I +xB3 Z1 +$c i2c +-0 x25 +k z1 l +x42 $2 Z2 +Z2 *63 +x06 $y +x63 *62 +xB2 $0 +^w *37 +$3 $j +p1 ] +o1k $! +u i5H +c ss$ se3 +z1 i29 +C ^k +*47 Z1 +so0 ss$ u +$h i2t +x23 $. +$g u +x23 $j +T3 r +r -0 +$1 d D5 +$1 d D6 +$1 d D7 +o7i $l +} *14 +o3z *93 +i3a -0 R3 +L0 ^s l +$g x34 +Z5 x35 Z1 +x13 z4 z3 +T4 sau +sa. +o2C -3 +r *14 D5 +q i01 +x54 x21 ] +u o2U +$0 i2y [ +$w *43 +i6} x49 $r +-4 o61 Z1 +^O ^M +*56 se2 +x01 o42 +2 +^7 d +^t t +$f *79 +u ] -3 +$I Z1 +z1 t r +x12 R3 +f x65 t ++5 ^r i2o +L7 $k +k { x51 +*41 Z1 *04 +Z1 $o i7r +o0q $5 +{ *27 +Z2 D2 +7 +o57 u +i2m o76 +^h x91 +D6 $n +o4s t +i1. $. i3. i5. +$/ Z1 +c i6* +x24 sat +o4w i2m +K R4 Z1 +x42 +9 +$b $w r +K d x0B +u -3 ] +r ^q +spc k +c $U +c $X +o21 u +$z x06 +x21 x46 +z1 } z1 +sjr +^j x46 +r Z2 x73 +i2_ l +$k t +o2i $j +$Y c +o0m d +x16 ^D +*76 $t +z1 ^I +^c x32 t +$7 ^4 +x34 ^4 +i3r i01 +o0a x63 +Z1 o2o +p1 x83 *76 +*37 $k +z1 o4c +$i *10 x41 +i7v o9n +c sa@ ss$ +*40 '9 +t i5N +x01 +2 o42 +x26 i1v +x05 'A +$C $R ++0 *18 +} o4u +Z2 o0j +i0- D6 +R4 D0 +T0 d +'7 T3 +i6} $r x49 +*63 o3q +x65 $/ +x72 ^h +-8 *BA +i4w '9 +i0q o3g +k o2O +*01 L1 +*50 x32 Z1 +o9_ x34 +[ o56 +*04 *17 +i2n scf +D4 *21 T4 +l x06 +slj { +sdf +8 +^r Z1 +i31 o0s +z1 x93 +i1x x35 x32 +D4 T4 *21 +} *25 ^z +o2w Z1 +{ R8 +^q } +^h Z1 +sod ] +i1. i3. $. i5. +*53 R5 +se3 D9 +$e L8 +^8 c D1 +i14 ^a +c x64 ++5 T7 +z5 s36 x36 +^5 D7 +$G l x37 +x14 $M +o54 u ++7 i34 +srj +o94 u +k $e +-5 i19 +x06 o2- ++6 l *32 +o4c u +u o5U +{ o61 +$2 r +$q t +l $8 x24 +$o u +slR +*41 x47 +$l i78 R9 +T1 T4 T5 T2 +u sTG +*47 -9 +$v x69 +i3t u ++0 L7 +x05 z5 +x05 z3 +u ^M +L0 ^z +^W *52 +o37 i1n +p2 x14 +$B x43 +se3 si! u +o1p Z2 +*31 *74 +*20 p1 +L0 l ^s +smu i4b +o2d Z1 +o1z Z2 +'A T5 +-2 $5 +q x5A +$j ^k +o12 ^4 +k l z1 +^4 *14 +} i6p +z1 i14 +-6 o0j L1 +i4y r +o5S '6 +u i2I +p2 $4 +$u o7u +$0 i2s +*A7 '8 +x64 [ o5c +^u *71 +-0 Z2 +$4 x13 +s4s +R0 } +x31 o8r +-1 sly +$0 R7 +i2r t +Z1 i6f +x71 -0 c +$$ -0 ++7 ^b +{ +1 Z2 +i1Q +z5 x45 r +p1 x39 +i5# l +Z1 Z2 x34 +x03 R1 +o7c o4a +i1x x32 x35 +R9 x24 o68 +q x09 *46 +sIE c +*32 $g *41 +'8 ^R +x43 i4I +i3h Z1 +*98 o8_ +Z1 t -4 +f x2B +c o6M +*06 l +R2 x41 +$m $0 +$9 z1 +$% x23 +f k x3A +K ^2 +i6U sU $i +i89 [ +^H x35 +c so* +x63 -0 +-7 t +D9 x16 +D6 *9A +str ^z +'6 z2 +o2h $d *15 +d D2 ] +i4" x45 +s2* r +k suz +*25 *84 '7 +z5 x36 s36 +o2c } +Z1 seu +r D4 +ss9 +i1 C +ssk +ssT +Z2 x32 +r *40 t +*01 R0 +x06 x32 +i4w ] $y +x03 T6 +'7 srv +sdk ^v +i68 *68 +k ^P K +^* $# +i2' o5v s'k +$m { +o0s i39 +sut D7 +$W c +$x t +u x14 p1 +ssn *45 +z5 Z1 x27 +o0r swz +D6 o0( K +x14 '8 +x05 $S +$_ x53 +*95 *5A +k '8 +i1. i3. i5. $. +'7 Z5 +Z1 o1c +o1j $1 +oAO c +x25 ^, +^1 o63 +x35 z2 +r +8 ++8 x17 +*58 Z1 x25 +*51 o71 D5 +$? x63 +*52 x13 p1 +i7V -6 +D6 K o0( ++2 iA5 x38 +skf +$m t { +x45 -5 +Z5 x74 o6c +i3l z1 +$/ D3 +c $0 $4 $7 $6 +r *60 +D5 Z5 +T4 o6t +r ,8 +r o1I +D9 T8 ,1 +$2 y5 +$P y3 +s8_ x74 +szn D6 +D9 ,1 T8 +^ ^i +$+ *74 +sa@ si! so0 +c ^, +t *64 x12 +su! +iBV +.A $1 +o12 l +$0 +B +i0; k +p4 *51 +o2b p1 +R6 $3 Y1 +T1 T2 T5 T4 +D2 *27 +*15 snp r +sKu +x06 ^1 +$f -5 +i4H Z1 +C x75 +l *37 +^8 D1 c +o82 $O +^k $b +x32 sts +x54 o54 +o6i { +*21 sak +-A ^@ +x13 i0X +x52 ^0 +$v $i $l $l $e +$3 $0 $2 $3 +$s $c $a $p $e +sib *45 +$6 $f $e $e +$9 $4 $? $? +c $9 $8 $* $* +c $1 $5 $5 $! +c $9 $4 $! $! +$8 $9 $$ $$ +c i05 i13 +$m { t +xB2 x64 +T6 x24 T3 +i5j i6a i7n +^w $m +$q L6 +c $3 $6 $! $! +$6 $1 $* $* +c $1 $3 $$ $$ +c $8 $9 $! $! +$9 $1 $@ $@ +$8 $9 $* $* +$2 $9 $$ $$ +se3 si! +o66 $/ +$9 $7 $$ $$ +c $5 $3 $! +c $7 $1 $@ $@ +i4a i5p i6r +$f $e $b $1 $4 +c $9 $2 $! $! +c $0 $0 $0 $! +c $2 $0 $0 $! +c $4 $1 $1 $! +i5j i6u i7l +i5j i6u i7n +$5 $6 $! $! +i4d i5e i6c +*32 *16 *43 +c $0 $1 $0 $! +c $0 $7 $@ $@ +o8! [ +$1 $6 $! $! +c $0 $4 $! $! +c $4 $7 $! $! +$3 $3 $* $* +c $7 $4 $7 $! +$7 $7 $$ $$ +c $1 $6 $@ $@ +*57 *06 +c $7 $4 $! $! +$9 $6 $@ $@ +$m $a $r $0 $7 +$m x16 +$s $e $p $1 +*26 r +$7 $0 $! $! +c $1 $0 $3 $! +c $2 $7 $! $! +l *32 $g +$0 $3 $* $* +$1 $9 $@ $@ +c $2 $7 $* $* +c $8 $7 $8 $! +x03 o69 +c si1 T7 +c $2 $5 $$ $$ +x43 ^0 +^e ^v ^o ^N +c $4 $4 $4 $! +c $3 $1 $3 $! +c $5 $0 $! +c $6 $9 $@ $@ +$7 $9 $* $* +c $1 $8 $@ $@ +^. ^. +T0 i8= +$5 $2 $! $! +c $8 $4 $! $! +x25 +2 +c $9 $5 $* $* +i6s i7e i8p +$5 $0 $! $! +$5 $5 $% $% +$0 $3 $! $! +[ $t +L5 o3d +$5 $8 $* $* +c $8 $3 $! $! +*32 *41 $g +i0n i1o i2v +$4 $2 $* $* +c $6 $5 $! $! +c $5 $7 $! $! +$3 $5 $! $! +$1 $9 $! $! +$5 $5 $$ $$ +c $9 $7 $* $* +c $6 $5 $6 $! +o4z x56 +[ i4, +$9 $8 $# $# +$J $a $n $1 $2 +$2 $9 $* $* +$6 $8 $* $* +$3 $5 $@ $@ +c $7 $9 $! $! +i4m i5a i6y +c $1 $6 $$ $$ +c $2 $1 $@ $@ +$7 $3 $@ $@ +c $1 $2 $# $# +c $0 $3 $* $* +c $8 $8 $9 $! +$3 $1 $* $* +R6 [ $5 +$8 $2 $@ $@ +c $2 $3 $$ $$ +$0 $5 $! $! +^p *71 +$1 $3 $? $? +$5 $6 $@ $@ +c $9 $3 $! $! +$5 $4 $@ $@ +$M $a $y $1 $2 +-6 z1 +$8 $3 $! $! +$5 $1 $* $* +i03 i16 +c $4 $5 $! $! +i0a i1p i2r i3i i4l +i2m i3a i4y +c $2 $4 $$ $$ +d i4y +c $0 $1 $@ $@ +$8 $5 $? $? +$7 $8 $$ $$ +$3 $4 $$ $$ +$3 $0 $! $! +$9 $5 $@ $@ +$8 $2 $! $! +c $7 $1 $! +$0 $2 $* $* +i04 i12 +l [ smb +*34 x13 stc +i00 o6m +x52 -4 sYN +$F $c o9w +$? ^! +i3o $4 +*31 Z1 +^V z2 +i6d x26 +i5j u +s^B +^7 '9 +r x37 +k x69 +x16 D4 +spb *50 +] sP8 +sfM +c i37 T4 +^h z2 +$u i7' x69 +R0 R2 +D2 R4 +$5 $1 $0 $2 +c i02 i18 i28 +$5 $8 $0 $2 +^n k r +p2 'A +K s4G +oA2 xB2 +sa@ so0 si! +x47 Z4 +*74 $k +$U .2 +s7H +o9j x14 +$7 z1 +*24 '5 +s6Y +x43 *50 +*62 *75 +*10 $J +} *65 +s8- +*58 x13 +z5 x27 Z1 +o76 sgd +*79 x83 +p4 s2I +x64 x37 t +o6Q +0 +^M $! +x64 t x37 +*41 *04 Z1 +^x ^k +Z1 *06 +x26 -2 +^3 *70 +*76 -2 +z1 o5R +*46 $d +ssk -5 +x56 ,3 +i2g 'B +sV3 +*34 $6 +sVC +sVA +d sgr +*16 x52 +,2 z2 +x34 c +x13 x63 +p1 x7A +*86 y1 x06 +K szs +x08 Y2 +x26 sOP +^Q *12 +*83 D5 +*65 *36 +sFA *01 +$H x17 +o5K u +i95 -9 +$v Z2 +d x42 [ ++2 Y5 +Z1 i3s +i2r *81 +r +7 +i7h $2 +*05 o6U +p4 $J k +^y i3_ +*92 x46 +.4 [ x45 +*50 sMZ +p4 k $J +i42 i50 i62 i76 +^_ T1 +i1s o2l +x23 *34 +2 +$d z1 +^G Z2 +t K *04 +s1# +s1D +s1g +i21 i39 i48 i56 +sPS k +[ D4 d +R6 $5 [ +D3 i1c +i52 i60 i72 i82 +i2V p3 +*30 o82 +{ oA2 +x13 -3 +o40 r +o40 u +z1 ^W +i31 i49 i56 i62 +i31 i49 i56 i66 +sIA p3 +D1 Y5 +i21 i39 i46 i59 +x13 i5G +Z2 *10 +3 +$u i0y +i42 i50 i61 i79 +x43 -2 +x02 $" +sBE +x31 sPM +smu +4 +sIS +u o33 +sWL +seb z1 +sYP +p1 *76 x83 +x15 p3 +*43 y1 +x02 '6 +o7N +i21 i39 i47 i54 +i21 i39 i47 i52 +i21 i39 i47 i59 +sVP +x13 z3 z4 +x12 *65 +$L *60 +x23 +2 *34 +Z2 *48 D4 +z1 r t +i5V x61 +^L u +*15 r snp +x52 s1H +x07 y2 +sl1 T5 +sZI +i1I *34 +u i6- +u i61 +^3 x14 +o3L u +-4 $! +z1 x12 Y4 +,2 sOD +i11 i29 i36 i46 +i52 i60 i73 i81 +x43 *23 -2 +*63 slp +Z2 *20 +sM7 +i59 T6 +-9 x16 ^p +D1 *05 { +i62 i70 i83 i91 +i42 i50 i62 i79 +i11 i29 i38 i43 +i11 i29 i38 i46 +{ L6 l +x51 z1 +x23 y2 +*43 *63 +y3 x36 +x54 ] x21 +i62 i70 i81 i93 +Z2 +3 *10 +^V ^B +i12 i20 i31 i40 +} o36 +sls ^a +sO4 +i7Q '8 ++D -C -B ++5 z1 D4 +*BA iA_ +i1p +6 +sdp k +*3A x36 ++C +E +D +$v x21 D7 ++4 +5 +8 +*34 stc x13 +*03 r ^z +$P D0 +$P D1 ++C -3 ++C -7 +o2k sus +*80 x31 +[ t *42 ++C -D -B +Z5 Z1 x35 +$i x41 *10 +t ^f +*58 x91 ++0 +0 +A +ssj K +-9 x16 +} o6g +x65 *76 ++0 +5 +8 +*32 *43 *16 +$x x25 ++0 +A +0 +$& o67 +s*@ +l smb [ +x31 ^7 +^i K D6 +f x18 *50 ++9 -1 -4 ++0 +8 +5 +o2h *15 $d +x35 $n +sat t +o2q o5r +$c ^t +spk +spi +o0s d ++3 +A +3 +T3 D0 +i2% +D0 T7 x24 ++C -B -D +x23 o28 +'6 l +[ [ c [ +Z1 i6e +-0 -8 -4 +*36 ^B l +x28 ^e ++A -7 -7 +*23 C +*3B '8 ++3 +3 +A +*48 *86 +$d *23 +*61 o7u +f t x65 +$% Z1 +s2# ++B -8 -8 +*58 ] { +se3 sl1 u +o2L o75 +$$ +6 +} $G +^q K ++9 -4 -1 +R5 x63 +f *98 x27 +$x x06 +*A4 x86 ++C +D +E +d *83 x75 +i1x -5 ++F -0 +x24 *36 +*71 '9 +*71 '7 +o0. z1 +-0 $u +-9 x35 ^f +$n *07 ++8 -4 -5 +T1 T2 T4 T5 +x25 D4 +C o21 +-0 -4 -8 +D4 *87 l ++C +E +E +c se3 ss$ +Z2 $* ++6 +C +i2h } ++D -B -C +c T4 sa@ +siN sNk ++4 +8 +5 ++E -C -C +i4k D5 +^T ^C +i0c z3 x31 ++8 -5 -4 +-1 -D +spS c +D4 t { +-5 T3 +o4M $7 ++D -4 +u ^9 ^9 +c T1 i1_ +$G x37 l +$D $9 +*58 x25 Z1 +^C ^F +^x ^1 +c $5 $b +^D ^0 +u ^5 ^5 +u $A $A +$6 $x +L0 L0 +^c t x32 +c ^d ^C +^A ^E +$8 *23 +u ^A ^D +^4 -8 +$x $f +c $f $b +^9 ^C +u ^b ^5 +u ^b ^f +u ^a ^d +u $E $E +snm x53 +T2 o3P +u ^3 ^3 +u ^c ^1 +r i1y +i3p ^S +smd +] *05 +o0a x38 +-6 c +,7 q x5A +*07 ^a +*17 x31 +iAx [ +i9n p3 +K 'B +r *52 +x23 i1K +x05 -9 +{ Z2 +1 +*69 o95 +*54 o5l +c ss$ sa@ +*10 t x81 +Z1 o39 +Z2 x94 +i1q k +*59 [ +L6 c +*09 p4 { +Z5 o6c x74 +x65 ^6 +o61 x76 +,6 i8m +x28 i2a +*09 { p4 +*A7 p4 x67 +o2F +1 +*26 x06 R3 +-7 i68 +y1 x86 +$t x4A +snz '7 +x78 y4 x6A +$p *04 +^t f +Z2 z2 +R1 R4 +Z1 x0A +'9 x81 $6 +x13 *34 +'9 $6 x81 +$T $C +i4 -0 +xA1 *24 +-2 DB [ +R4 o2y +D3 x2A +saq x76 +x63 $h +$u -1 +$n *15 *12 +-4 o0o +s89 D0 +y3 xB1 [ +x5B Y1 +x45 x8A +{ *A5 x73 +$o ^, +T1 T5 T2 T4 +o1O u +*06 o69 +u $1 $9 $8 $6 +$s o1b l +x0B q ^e +$= x31 +suw +*03 y3 +$x $g +D4 { t +i7- u +*97 o93 +^; $; +l x24 $8 +*10 x81 t +[ c [ [ +Z3 x97 +o3j +3 +^N R0 +o04 L1 +*62 i0z +x78 x2A +*63 x83 +x4A u +-4 Z1 o61 +oBg [ +x32 x34 +i3+ R0 x13 +*84 x68 +*A6 x25 +x23 o13 +x34 E +i8r xA9 +i3+ x13 R0 +D5 *53 +*12 i2e +.5 i6y +x31 D8 +sur +p5 *24 D7 +Z1 i56 +,3 t +p5 D7 *24 +x82 r +oAo x15 +i9. xA2 +c i15 +*08 x4A +r t *40 +*13 t +$6 $V +*27 x31 +x85 $7 +x38 i5- +*32 T1 +z1 o3f +t $M +sxe +i8X t +*56 x91 +i5f *03 +$j *07 +$j *02 +x13 iA\ x59 +$n p3 +Z1 -4 t +x87 .8 +p2 xBA xA7 +Y5 iAj x85 +D4 xA2 +$v $t +r x54 +D1 *34 +l ssi +,6 *60 +o8s [ ++3 i2e +,4 i4a +-9 Y1 +x08 o0f +D7 T5 +x85 ,5 +x12 i5e +x53 .6 +p1 o8a +$8 p4 +Y3 x68 y3 +x59 *43 +'A ssf +x15 y2 +o3z k +o02 D5 +D2 T5 +D2 snq +*24 D7 +p3 sNr +^V x74 x05 +] spk R3 +r i0x +xB8 x06 +y5 o01 +^d r k +x16 p2 +f o3s x61 +K DA +s,j +-3 i34 +Z1 *24 +i2/ x02 +p1 d +xA1 oA6 +x47 '9 +r i4v +p1 x18 +c T7 si1 +c sa@ T4 +z4 l +^o ^g +o9^ +i5S *67 +o89 Z2 +o3q o4x +p5 R7 +} $X +z2 x43 +,2 *35 +d ] D2 +x32 R4 +D0 o1M +Z1 ^9 +Z1 ^8 +^1 r +Z1 ^X +x36 i0@ +siI +*30 u +*53 i1s +T2 T5 T8 T9 +T0 T2 T7 T4 +T2 T8 T5 T9 +T2 T6 TA +T0 T2 T1 T6 +$! o3n +T2 T8 T9 T5 +T1 T8 T7 +T1 T8 T3 +T1 T4 T9 +T0 T5 T3 T7 +T2 T9 T8 T5 +T0 T7 T5 T3 +T4 TA T9 +T3 T9 T6 +T0 T7 T3 T5 +T0 T7 T3 T4 +T0 T4 T2 T7 +T0 T5 T7 T3 +T2 TA T6 +T0 T7 T2 T4 +T0 T2 T4 T7 +T0 T3 T5 T7 +T0 T7 T4 T3 +T0 T3 T1 T4 +T0 T1 T6 T2 +T0 T1 T3 T4 +T0 T6 T1 T2 +T2 T5 T9 T8 +T0 T1 T2 T6 +T2 T9 T5 T8 +T0 T1 T4 T3 +T3 T6 T9 +*45 R4 +T1 T3 T8 +c T3 i3& +T1 T7 T8 +T4 T9 TA +T0 T7 T4 T2 +T0 T3 T4 T7 +T0 T3 T4 T1 +T0 T4 T1 T3 +T0 T4 T3 T7 +T0 T4 T3 T1 +T0 T3 T7 T4 +T0 T2 T6 T1 +T0 T4 T7 T2 +T0 T4 T7 T3 +T0 T6 T2 T1 +T1 T9 T4 +T0 T3 T7 T5 +c o8! +x57 i3- +$# x62 +sar i1n +k $o Z1 +D0 $) +^- ^+ +^! i78 +o1P r +o6l x84 +$z *37 +^c $m +k ^5 +i57 i1d +o2a K +i1c -6 +D3 xA1 x54 +$i *60 D2 +i2u sjc ++6 *32 l +i1c i30 +$N i3R x04 +u i42 +*12 $4 +q x3B +$_ } +-3 $9 +-3 $k +-3 $n +i5b i1d +q x38 +i3/ '8 +o2x ^x +i2c z1 +^c x56 +i3h } +i34 i17 +^m o85 +i3c i51 +i56 i5c +i1c i76 +l x26 +i59 i1d +x34 $n +$n Z5 x7B +D4 l *87 +x42 slL +o7o o0d +f x61 o3s +i7a i50 +i56 i33 +i52 i60 i89 i71 +$8 z1 +*04 D0 +f sns +*B1 x45 +sgf ^r +$6 x16 +D2 x45 +D0 x47 +} o6@ *67 +^# x52 +i54 i7b +o2n r +D3 R2 +^u r +l { *15 +i84 i92 iA0 +i17 i1d +t o1Z +{ *35 K +$u *30 +i16 i58 ++0 ^9 +i3i i4m i5a +i1o i2b i3e +i1a i2t i3i +i1a i2t i3h +f x74 +i1a i2r i3s +i9i iAs iB1 +x21 o2? +*65 o2t +$3 $% +i5i i6g +i5i i6l +r D5 *14 +i3i i4k +i3i i4p +} o3p ^k +-6 L1 o0j +l ^l ^a ^m +k p2 x62 +$J [ +i1a i2s i3i +*57 i8b +$! C +o1y [ +c $& $9 +i2y i3l +i9u iAl +i1e i2a i3r +i1i i2c i3o +$. $i $d ++1 x67 [ +i4a i5g i6e +i1a i2n i3c +i40 i50 i60 +i4a i5r i6a +i3e i4m i5o +i8g i9h +i8l i9l +i6u i7e +o3g +8 +i0k i1i i2l +i5i i6l i7l +i0k i1i i2k +i6o i7c i8k +i4a i5n i6i +i6a i71 i80 +i7g i8e i9r +i2t i3t i4i +i51 $8 +^n ^r ^o ^c +i4e i5r i6m +i2r i3e i4n +*87 sti +i1o i2n i3n +i1o i2n i3a +i2d i3r i4o +i49 i59 i69 +i2i i3r +i8r i91 +i3n i4d i5a +i3e i4l i5o +i3e i4l i5i +i6h i71 i82 +i2n i3i i4e +o1e *51 ^n +i7a i81 i92 +i3i i4n i5i +i2i i3m i4a +i50 i68 +*10 i38 +i49 i58 i67 +l $. $s $g +c $6 $& +i2r i3r +i2r i3k +i2e i3e i4d +C T7 +i38 i49 +$. $k $m +i56 i62 +d x23 +i4p i5e i6r +i5a i6t i71 +i3k i4e i5r +-7 x05 D4 +*45 z1 +i5t i6y +i5t i6t +i8u i9n +i1a i2m i3m +i5m i6o i7n +i4h i5e i6r +i36 i40 +i4d i5e i6r +i9s iA1 +$u o3w +i9a iAb +^h ^s ^a ^w +i5a i6s i7t +i8t i9o iA1 +i2n i3t i4e +i63 i79 +i18 i28 +i50 i66 +i46 i54 +i46 i52 +i6e i7v i8e +$. $b $b +$. $b $h +$f x01 +i3z i4e +i1w i2a +i5y i61 +^6 T1 +i5e i6a +i5e i6e +$d $o $m $e +i1e i2c +i7, x25 +i2n i3d i4y +i3i i4e i5r +i2o i3n i4g +i4i i5t i6o +i9s iA4 +i8h i9o iA1 +i21 i36 +l ^d ^n ^a ^b +^m ^u ^g +i3a R3 -0 +i3s i4u +i1o i2k i3e +f i41 +i7v i8e +i58 i62 +o6u +1 +i2n i3n i4e +i3e i4r i5i +i1r i2y +i2m i3m i4y +C x31 [ +i5a i6r i7d +i2v i3e i4r +$e $n $c $e +i0h i1u i2n +i9m iAa iBn +l *63 K +i8h i9e +r $o $u $t +l $. $p $r +i80 k +Z1 x34 Z2 +i1a i2u i3r +i7g i8o +l ^d ^a ^e ^h +i3o i4m +z1 *60 r +c ^" $" +i3n i4s +i2a i3k i4e +i12 i22 +i4g i5i +i5r i6i i7a +^s ^i ^d +c $) $9 +i93 iA3 iB3 +l $. $g $g +*40 Z1 $h +i28 i35 +{ l L6 +i15 i24 +i54 i65 +$. $m $h +$. $m $k +i2i i3l i4l +i8t i9a +i8t i9h +i8t i9i +i1i i2g i3h +i2c i3a i4r +i2n i3e i4r +i7d i81 +scL +i24 i37 +sc< so0 +i6s i73 +i7i i8a +i7i i8r +l $o $i $d +i2r i3d i4a +i5l i6l +i4a i5i +i4a i5m +o5u -4 i1r +i8e i9e +^h ^t ^a ^b +i3r i4d +i9l iAo +$Y x41 +l $. $t $h +x42 { T6 +Z1 i80 +i71 i83 +i1d i2r +i1d i2o +o5! t +i2v i3i i4l +i4i i5r +x74 +9 +i7b i8e +i4i i5g +i0r i1y +i5o i6o +i4u i5a +i0b i2l i1e +i3c i4h i5e +i4f i5o +r $a $n $t +c T1 T3 +i8r i9i +i8r i9d +x54 x04 +i1i i2l i3a +i8r i9s +i8r i9t +r $e $r +i44 i58 +i2e i3k +i6i i7r i8e +i2a i3n i4t +r $l $a $n $d +l ^f ^l ^e ^s +i60 i76 +i1e i2n i3d +i1o i2v i3e +i1p i2i +C i2I [ +i4i i5c i6a +*13 $q +i6e i7r i82 +i3a i4t i5o +i3r i4e i5n +l $k $i $n +d c +i2i i3d i4e +i1i i2v i3e +$0 ^7 +Z3 $5 +i30 i41 i52 +i3d i4i i5e +i8s i9e +i8s i9i +$0 ^b +^B l +i8n i9a +*50 Z1 x32 +i7n i8g i9e +i8t i9a iAr +i74 i84 +i5e i61 i70 +i6i i7c i8k +i4e i5l i6a +i3C D2 +c i14 T2 +i8p i9e +i7c i8k i9s +i2t i3i i4n +i2o i3k i4e +l ^f ^f ^o +i8m i9o +*18 x75 +i1n i2e +i1n i2t +$1 $9 $9 $2 $% +i3b i4u +i3b i4e +i31 i42 i51 +i6a i7d i8o +l $. $b $e +i5i i6r i7e +i6r i7e i8a +x13 *21 p1 +i93 iA2 +i3u i4e +i3g i4u +x53 $H +^c i5u +suk ^d +i1a i2d i3e +i1a i2d i3d +$. $e $e +i7r i8i +i75 i82 +i30 i42 +i4 +7 +i30 i41 +i30 i47 +i4 +6 +i1r i2i i3a +[ i2Z +l ^h ^s ^a ^w +i47 t +x05 *41 +i59 *02 +l ^g ^i ^p +i2g i3a i4n +syd +i43 i57 +^E u +^6 '8 +i43 x57 +$. $s $l +$. $s $d +^l ^o ^o ^w +i1l i2u i3e +i3l i4e i5s +i5s i6h i7a +i1o i2l i3a +l $. $m $t +T1 T5 T4 T2 +$s l o1b +i5n i6s +i5r i6b +i2o i3o +r $a $m +i6n i71 i83 +l $. $c $h +i2r i3r i4o +l ^l ^l ^i ^p +*43 { [ +^6^c +i56 i63 +i15 i21 +i7o i8w i91 +i4n i5t +^4^b +i29 i39 +i0a i2c i1b +i51 i66 +i5u i6t +i2r i3a i4t +i9l iAe iBr +^3^b +i0z i1o +i2c i3h i4o +i3n i4e i5s +i6o i7v i8e +i4e i5m i6a +i5l i6a i7n +i7a i8c i9k +^a^2 +i8y i91 +i1o i2o i3d +i97 iA4 +^5^f +i2s i3p i4e +i7t i8o i9n +i1o i2p i3p +^b^7 +i7o i8t +i9d iAa +^d^2 +i8o i9s iA1 +i77 i87 +i77 i86 +^5^e +i4i i5e i6r +l $. $i $n +i3r i4e i5s +i4h i5o +i6o i7g +i87 i95 +i9h iAi +i52 i68 +i52 i69 +i27 i37 +i5l i6e i7s +i68 i73 +i6o i7g i81 +$0$9$3 +i7m i8o +i3h i4a +^, ^) +$0$1$9 +o0h o5i +i5! ,6 +l o7! +o0n $8 +i36 o49 +o1u i2m +o0j $6 $6 +l $5 $1 $6 +$3 $0 $9 $9 +} o7? +xB1D4 +y4 o8h +s{wo8o +sNP +cz1 +s[}*45l +ts=).5 +x01sw]z1 +$vx38 +*B6$W +D0i3es`} +D3D6 +l ^k ^c ^a ^b +c ^2 ^4 ^9 ^1 +R9s"Qi0Q +[ ^Q +x91R8,B +y3*BA +y4sW! +R6iB? +l ] $v +-3sS$ +s1J +^RsaQ +l ^n ^e +*13x27 +l ^2 ^1 ^0 ^2 +l ^s ^i ^h ^t +i7usw% +o7li89 +c $b $e $l $l +o5pxBA +*96*01 +i7#sHhsQF +x07p1 +l ^o ^n ^o ^m +us`asV, +l $i $l $e +s%0D5-4 +T6*97 +^@x46 +x91*6B^y +i8-s"* +$. $n $o +^Nx54x7A +*A7y5 +*02sKGxA1 +^q*58 +^5x78 +[ss] ++7*05 +.4'7 +r $i $l $y +$1^a +p1*23 +x53.4 +x12svkY3 +l ^r ^e ^v ^o +iBko30sGh +l [ ^g +*53D0 +D4i1ix69 +x38D8 +x82T2*A1 +^NRB +,3c +l ^l ^o ^o ^w +s0D +l ^d ^e ^b +l $i $z $e +s[Mo5f +L5TA +sP]soKx43 +tx31 +iAwp5x92 +Y4sGY +l $b +l $j +'A*6A +T1Y1 +z2*35 +l ^r ^a ^p +l $y +y5s%Y +RBx04*A8 +Y3iB; +l $i $n $e +l ^m ^e +sJ#l +*07x28p2 +C*4Bi60 +l ^9 ^9 ^9 ^1 +c $s $e $x $y +s#"Z1o0N +L7*02 +TBx71 +[u-8 +l $l $y +seV^F*B5 +c ^a +spF*64 +$Qs0To9+ +c ^Z +*25+A +x04'B +L7*2B +Z5s<) +c $m $i $k $e +c $l $o $n $g +o7? E +$zs$tx64 +[ Z3 $a +*31*75 +*62u +i11 '9 +s_.i7u +$R ^8 +i8ax3B +^Ys*y*0A +*79s;i +{*76c +$.T4 +.5l +$gssy +sL=o9EL6 +sBC +D3i2u +xB5*73Y3 +Z2 .2 +*A1$c +$D Z1 $2 +E$x +E$* +li6! +i8HsQL +i4msW6 +^Is[l +{sV.u +i4ox21x7A +$f*96 +xA4D5,3 +*A5Z4stv +spR$hDA +*80T3oB} +x81x53s3N +^fx29 +s#&D9 +]$m +x21o8Mt +$U R7 +p5[ +R5 D6 +ty3 +Y3 o5j +*02 *61 +C] +*87 x03 +oA2z2 +i8LxA4+6 +xB9x5B$f +D8,A +*56K +D8{ +i4.s'( +Y4 x02 ] ++0z1*8A +s O^h +,4l +*70sOu^d +shLE +oB9$H +l*68 +Y4t +'7i1o +[*82r +x42 } +}x0A] +^t ,3 +,6t +i5giBLsR4 +xBA$Z +xBA$R +x54 k +xB3y4s<5 +,3*72 +dx37 +o4p K +D8x0B +Y4 ] x02 +c*43x92 +D4d +D4[ +s`Bqx19 +xA4o0X +-7i8. +i03 p1 +iB.CK +,6 ^z +lx45L6 +y3cx3B +x45 d +[^5o02 +z1 .5 { +s`D*43 +s"8^g +y2si- +x13o8* +l} +y2x39x41 +y4 r +*36 *53 +sna,3 +sLOsS"L5 +,B^Ox81 +p1x8B +}$.*39 +s\%$rT4 +*A8c*12 +x45$k +$8*35 +[ i6b +^T x84 +ly2sNK +*A1'7x78 +q ] x32 ++7-3xA8 +C*3BD8 +*75-7 +} *85 +q x32 ] +[D6 +*B9*73$t +sdmsp} +sOb.3x84 +Z1Z5 +x21Kx73 +l$N +Z3x82 +$Xs]h +ss"-2[ +z3 u +^@-B +o21x89 +y1o1Hx05 +oA#st]L6 +x92*09 +sVrx5Bo8E +sOUZ4 +i8wi6j +x17p5 +s|G-3 +se6DAy1 +$Ks2F +o8Ac +^e ] +x29$eu +sqg*A5-1 +p1x51 +Y1 p3 i8v +Y2qx68 +^3} +Y2 ,1 +*86i1e +*70o96$> +,4iB2 +x75^dx63 +o8/.0E +o1Ax91 +^ls g +K oBn +*31 z2 +sHM +x98o9$sxq +*58 +3 +.8Y1 +*64 x67 +oA(s+go0a +xB3 p4 +x06Z5i8l +u-6 +Y5x94D4 +*8Assx +si2 +x52 i3w +s;Vy4x64 +st%x83sOK +s8l^P +^ds|" +x62E*27 +qE +o92x86$Y +ti90 +sR?Ep1 +x76i3s*09 +*B6*42 +xB3-0 +o7esG2l +i6fskE ++3sUT +sJ`x04 +KY4 +x69x41 +s-Fp2 +i5jp2 +s7(q*4A +D3i9} +Z5R9 +i5d R5 R4 +x86s_>*9A +]sgr +oBtx81t +D9x29Z2 +xA3o7,] +D5*A2iB? +x14p4 +$ *89 +xA5Z1 +o9sx93$e +$7CxB7 +x1B]x59 +R8D3sRE +xB1$r +x26s4X$k +^2T8 +x78$d +^!^eD1 +Z4x46 +*A4D1 +y3xB4 +i59 R2 L2 +sF1T8 +iA?xA9[ +.6x63 +f*90c +o9GD4x87 +i74x96sIh +i7b L6 R7 +qx64 +p1KspO +s*4Y1 +L8o81 +$v'8sd4 +,2x42d +o2ixA8 +x73sw9 +]sats0$ +s`3D6xB9 +sKOx51*5A +i7gsva$o +x53y3 +i77 R2 L2 +sGsx61 +'4x2Bq +D4x5A +*58.6$g +$ls9i +x1B$o +ux56] +s2P^1x8A +x17$a +i74 R4 +s1{R6 +i1a R4 L4 +s"xx8AR6 +,4rE +q*B8 +rs3'*0A +xB8x83 +x41*08 +o0c.B +o6r*82*96 +$!x91 +y2sJy +$6-8 +i77 R6 +o6rs5[ +R7s(b ++9x7BD6 +i6isFu +*53Z4x46 +,3p3sc, +tx5AY5 +$r*74 +y2s'+ +*56*83x18 +o6rs=W +sv<$n +DB$x +Cc$, +ly4{ +Y4x01D2 +i3f R2 L2 +iBksoR +*30L8skJ +o1aC[ +i15 R0 L0 +$/T8 +i0iC*B5 +*39] +Ci8bszS +*37c +s6B +s$Ao1H +x64s 6+9 +x78iA4o7D +T2x46 +o5&*61D5 +i3a R4 R5 +i71 L6 +o1z{ +i78 R4 +i1a R9 L9 +i34 L2 L2 +$_sJ'D1 +t]scd +i14 R0 L1 +sIBs7i +o7iL6 +i6di9! +ssdx61q +[,4 +i1a L0 L0 +i59 R4 L4 +i70 R4 +i55 R6 +i55 R4 +.5,3r +i11 R0 L0 +i19 L1 R6 +-4s{Ix07 +x12qxB9 +Z2s;\+3 +C*04 +y2x42$- +c^c +sU.syR +x1Ai2q +s%+'5p2 +x12.1x25 +sw_ +i19 R6 L1 +x06*B2x31 +i56 L4 +$isj5t +'9Z3l +[soW +$,x65[ +i4f*87 +u*A9 +o0-xB8} +i79 L7 +i74 R0 L0 +i0& +x8Bo8pxA6 +i79 R5 +i79 R6 +*62T5 +sMs +i14 L1 R0 +x08z3 +o54u +i7b R7 L6 ++9Z1x16 +*A4^usO' +*05] +tR7sK4 +i74 L6 +i1d R2 L2 +i76 R4 +i3d R8 L8 +i54 R8 L8 +[oBIx04 +i9hz3sQU +i5d R4 R5 +x59k +i76 R9 L9 +xABi2?*A7 +,By1o4n +i71 R6 +sfY*60 +i53 R0 L0 +i3a R5 R4 +i58 R6 +^K*74 +*A4x87Y5 +{y3D8 +i52 L4 +i1e R3 L3 +sRdoA" +s#t +i83i6X +*63 $0 x91 +x13 i1* +sk3 +s?5oAd +snr *21 x72 +*70 *76 +.5 o4i +p3 ,A +sBh +z5 x92 +x24x71z5 +.2 d +xABs2V +s_X +^`xB9 +s7F +z5x87 +oA?RB ++7*07 +f x2A +*50 C +p4x63 +x24*12z3 +s=Hz2l +Z1s\J*63 +Z1 x15 +.0 x34 +*29Y3Z3 +y5 Z1 } +Z2o7x +x4Asu1s`$ +i3c i53 +x3Bo9xy3 +y4 o0t +Z4x07 +k x45 +K z3 +sNt +x49 Y2 +x35L4 +*86 p2 ++2 *85 +i35*08sM_ +s.l +'9 Y2 +sm! +Y4x38 +C x47 +i10 i76 +Y3 $* +i9s u +'4 ^@ +$_$( +*41i6c +s1- +i54 i32 +*08K +C ,9 +T3 x42 +i7f i70 ++2 Z2 +soEx86i2M +*46$>x93 +z4 x12 o4J +*19 ] +DAiBS +sGUsTr*B2 +Z2 ^t +$l*38xA5 +.3y1sxS +*63sz1smp +ro1lo8" +Y3 c +*61-6 +x71 *50 x43 +s{1o82R1 +i70 i31 +s{/o8Mx52 +i69 *54 +z3 s0y +*63 x91 $0 +i34 i51 +xBAstxC +[s0c*B2 +*36^sx82 +uo6tsG[ +i1@iAE +o9M D6 +sFO +oAK t +x61i5L +i17 i7e +i1d i52 +t $O +Y1o0I +i51 i1f +i33 i3f +sU|*19 +st$ry4 +-3-B +x3BslO +s16x93*06 +i51 i19 +*A8s0/ +l ^f +y4 *06 +p3 i1c +snr x72 *21 +i6* -0 x46 +z3 Z2 +i3y,6 +s24 d +iBp +x76*65 +o3e *37 +$R Y1 +suC +Y2 *56 +i1f i74 +t *58 +shzL4sD$ +E*59y5 +sDg +z2 ,7 +[ f *75 +$^$* +-2 Y2 +i53 ^v x26 +$m o8d *23 +i31 i18 +xB5z2{ +K^Y +o16 d +i79 i5f +i35 i3f +i7b i5c +E Z2 +Z1-1*21 +*A2-7*20 +-4 ^Z +sEj +sEO +K *95 +i59 i31 +x42qsXG +o1J,A ++0+E +i41i59i67i71 +Z5 p4 +s(e +i7d i79 +x54 $V +i1b i37 +$!$+ +T0L4s.5 +x51 [ Z5 +.1[*A5 +x48s@i +xB1 x34 +*03 .4 x53 +x52C.2 +$p R9 +^>sJ* ++6 y3 D3 +Y2 *02 +l L2 +*80^`x8B +} Y1 +*04srx +z1 *53 +z1 y4 p3 +K DB ++8*14sXd +*08 +7 +z2 *24 ,7 +Z2 { +o0p*62 +i7Z[sP@ +i31 i54 +i31 i56 +x74 C +x01 *50 Z2 +z1 x09 +*27$)s|o +'A ^J +*12 sos +*34o5gx0A ++3 z1 +z2 ,7 *24 +i30 i1d +i75 i30 +i3a i1f +s_` +i71 i19 +-2-B +k*47 +i51i69i78i80 +[o1T +i12 i75 +Y3T2C +D1 o7= +i30 i10 +,5 c +TB,BZ1 +^" r +*63 *83 +x89x3As!z +slT +x25 .2 ++5 Y4 +x01 Z2 *50 +^$x46i9` +s7_ +*27 Y5 x1A +x56 Z3 +*56*10 +s1` +i30 i76 +x48sLh +i75 i5d +sAy +.0 Z1 +L2 z2 +i1f i31 +sQK +[ i2J +i3a i30 +D2k,1 +i6* x46 -0 +i71i89i97iA5 +$m *23 o8d +y1 x05 +x51 Z5 [ +T8x21x0A +i1b i75 +i13 i52 +i78 i5f +o0!K +c x15 +$, x56 +s_6 +sar*27y4 +$($@ +R3 r +{se8s0m +c ,6 x23 +$. x36 +i3a i56 +i10 i1d +i10 i56 +^6^a +^8^b +i15 i70 +^6p5} +o8@x27 +i5f i77 +i1a i3l i2u +i13 i79 +Y1 *07 +sk* +skF +k i1_ +i3f i1c +i3f i1b +*37Y1+0 +i9& E +D0 x74 -5 +x21 suE +-8-C +z2 *54 +^3 x87 +$G x76 ^f +s5(i6R*84 +x15 D3 +o1? ] +oBhsCI +*4A x27 Y2 +u i9V 'A +oA-s+Q{ +swq +*71*57 ++B t +i3f i37 +r *47 +Y4 *65 +i3f i3c +x46 ,5 +,8o2V +o32o7^ +i56 i5d ++0{,1 +^,x86 +i37 i13 +$3 o5j +sbj t +i1d i3c +R4 '8 +sa$E +x73svBd +Y2 -9 -A +x05x7A+4 +sep *12 +R1 c Z1 +i0Z u +p5 *63 -8 +$i sen +T5x15-7 +c k +*12 p2 +slu ,2 +$PoAdr +*10C +d ,8 +i5c i35 +]u*48 +o4WxA8 +Z3 c +o6;sE% +i71i89i96iA9 +i58 i36 +p1 o0v o4p +i0Y $f +[ *04 y1 +i1k $! +i3d i3b +C o2x +x94 +6 +*78i1H +.2 *47 o0l +.2 o0l *47 +*80 D3 +Ki8q +{y3 +x1Ay3i3. +^y +6 +i38 *31 ++BLA +*43x72$# +sKw +sfJ +i7b i3d +y1^I +o5+ K +^?x57R9 +i2n i4s i3i +i3a i58 +i1c i77 +,3 $T +i55 i38 +,6 o9n +i77 i5f +i36 i10 +^Su +i36 i14 +i0Y .4 +x82 +7 *32 +s.S +s'>o9v +i51 i7c +*37 x45 +sZV +i35 i7c +E o2W T3 +r Y5 ] +*43 k *60 +*3BER2 +o6s *51 +*BAsS3 +i7f i34 +i71i89i99iA0 +E Y4 +i1c i10 +C *05 +*BA $h +i12 i58 +iA. +6 +p1 o4p o0v +p5 -8 *63 +l*49i4O +y3 r +i6Ux36o5e +*B7^ sgR +p4 *37 *15 +sw si; +i70 i5f +R7*A7*41 +D4y1,7 +^j t +*76oB2 ++7 { ++1*64 +i0b i2l i1a +i74 i1f +x12 x34 +z3x86 +skeZ4Z3 +T0 ,7 +D0 -5 x74 +o2p xA1 +i7f i5c +y4 ,7 +K Z1 l +E x46 +R1 Z1 c +E,2*46 +*49i6Hs3_ +o59 x21 +y2KsxZ +i78 i33 +i7a ^k +i11 i55 +Y5 -0 ++7 *79 +i61i79i88i92 +oAPoB^*9A +r .6 +Y3 xB1 +xA6 c +sGjxB4 +i1b i77 +x13 soh +i51i69i78i81 +k $6 +xA3 x12 +*30 y1 +*89 x13 +*03 $; +x51 sy1 +y1.9*03 +x63 o3C +L0sS2 +i54 i35 +}i9Z$3 +x84 Z1 +sy& c +i5e i56 +sA* +*45 T4 +$"$? +o73x92i8# +sko K +*03p5x65 +*1B*43 +i39 i10 +x96Z1Z2 +i57 i1e +,2 sdc +sv1 +,2 x34 *46 +x53 t $h +CT7Y1 +d *B5 x65 +x94 x72 +i51i69i78i86 +$_ r +-0t*36 +*43i4j +iB-Y2-1 +x74 *27 +i11 *41 +K l Z1 +sCg +sr| +i5c i59 +^i{*13 +y5svx +$r ^0 +p4 *15 *37 +x28 *42 +*30 x35 +T1 i4k +x23 z2 E +i78 i37 +i37 i18 +i37 i19 +R6 ^F +i54 i3c +K-5*02 +d -4 +$Y i91 +i71i89i98iA8 +k^@s80 +}Y5xB8 +sPl +,2 i7* +*4A Y2 x27 +i3b i79 +i71i89i98iA5 +s]A]x94 +i50 i1d +y3s,B +sc[i4/xB7 +i3f i77 +sSc +i42i50i62i70 +*78 Y2 +x35 *46 +E T3 o2W +Z1 *12 +i3e i13 +o6`soK +.5 Y1 +i3r p1 +i2l ^w +*26rx45 +*56 ss_ +i78 i11 +i78 i12 +] ] $e l +$4 y1 l +x29Y3 +i5b i78 +i0d i2a i1r +i2EoAY*69 +*32 x54 +s,ps"Z +*61 $3 +z5 y1 +}*4BZ2 +s?wi8C +x36 E +y2 ,7 +i73 i1c +Z2,3 +*89o2* +o3P ^1 +R0*10 +i76 i1d +sbI +*6BiAJ +x52$OsKB +$&$/ +$;$/ +$A T7 +] ] l $e +x94 +B x74 +*67kx82 +s{go1z^T +Y2 -A -9 +$0 y1 +x73 Y3 +*14 *70 +R8{$B +^z *61 +seL +C -1 +*05x57 +[oA!sQs +*A6*43^j +-0 i86 p4 +so\*04 +x37ss;Y3 +*26 *50 +so6 +Y2 [ +*B9tshW +i1c i15 +Y4sy7} +Kx93iBX +x83o3+*A0 +] p2 DA +$#$% +i1d i78 +C*24 +ui70 +x64 -3 } +x15 Z1 +sdI +T3sTr +]*04 +y5 ^b +i30 i54 +x01Z5 +i38 i7d +-4 ^l +x46 f x73 +iAa*89 +^M x85 +z1 Y3 +-4 i0d +i30 i7e +C ^D +*79i7q +^L o93 +y5o5d +z2x92 +rx35 +u Z4 x48 +cR2 +i3f i51 +*27 o7u +.7 $0 +*30,9 +$4 l y1 +x46Z1^m +x82 *32 +7 +sczk +D6 Z2 +$) x72 ++0 x91 +$@$; +x18 *21 +o3n Y5 ++8 o4a +*67$;*49 +i18 i74 +*B7,1*72 +*04 x21 f +Y4 *02 +.3*14K +x87*26o6d +^X^X^X$X$X$X +u^X^X$X$X +z1} +^KY5 +s(yC +^,svo +$4{ +^0z2'6 +Z1*07x15 +x06s*I +^(ssqt +s>[o2Dk +to7< +*95sxk^q +iA3Z2 +si$L2 +*69o97$% +o0#*06l +i3d i1b +DB[ +i7c i1a +i59 i10 +oAB$jx52 +i15 i54 +^+*49 +x6Ay1 +s2)*A3 +s1,i2_ +i58 i15 +o2t -8 +i58 i1e +i79 i5b +s"9s_m +ro8@Y1 +x57x67t +kZ3xB2 +}+2 +$k $o $m $a $l ++9R1 +i50 i30 +$m $o $m $o $s +s%OsgB +sq? +T7+3 +^7y1s.z +x65 x83 +i5e i33 +o4&sBu +o13-3 +$j $a $k $e $r +o4N.5 +i6Jsa&s\j +i82i90iA0iB4 +i39 i5a +*50D8 +*72^os6l +s0] +sTU +$y $u $n $i $s +o8@z4'A +*B7oAO +ss/ ++3x57k +Y1^b +^bx17x8A +i1e i57 +i56 i3d +k+5*75 +i71 i86 +s+t +i41i59i67i77 +i75 i87 +i41i59i66i74 +i41i59i66i76 +uTB +o69$+ +^2 ^e ^e ^f +i1f i3c +i12 i77 +x39 ^i +i5( +t xA5 +c d 'C $1 +i0; +c d '6 $1 +o0&s*{k +$2 $0 $1 $0 $) +d 'C $4 +u d 'D $2 +u d 'D $5 +i1= +sM&tx85 +c ^8 ^b +*96T4 +c d '8 $4 +d 'C $8 +c d 'B $2 +*2B +o3ni2k*51 +c ^b ^3 +c ^b ^7 +*5Ax04 +*73sqYZ4 ++2x07 +i19 i74 +*A7o3Wi9V +sGf ++6+C +iB( +u d 'D $8 +c ^6 ^b +i55 i5c +$..0 +i55 i1d +x97^RC +c ^1 ^d +c ^1 ^f +s9>R9 +c ^e ^c +c ^f ^7 +i14 i1c +*65k +siP i5e +u d 'D $0 +u d 'D $4 +'E $6 +c ^d ^e +c ^d ^d +i82i90iA1iB8 +sl8x45 +T6 TA +c ^c ^a +-0+D +T5 TB +i51i69i77i84 +x75 o59 +o4{ +*36+5*B9 +T0 T6 TB +c ^d ^7 +x65x43T0 +C '9 $9 +c d '7 $6 +.1o1Vx6B +x3B p1 +szw *43 +sJc +i5b i50 +i19 i5a +sO- +'E $0 +i19 i51 +sA?x84 +,9i4M +C '8 $7 +c ^2 ^a +i12 i3e +z3s)q +T0 TB T6 +i14 i58 +$P-5 +Y4R1 +sP7siT +Z5y2iA2 +^^sF@ +sL5 +sh'T7 +o3P^1 +i17 i1c +i2UD3 +i76 i31 +sDwi9)K +xA4o6(x74 +-6ksCe +$8Z4 +x3AsCA +*23^Q +o8X} +R6*B3sES +^+Y5+7 +i7a i10 +c ^7 ^e +T4iAQ$G ++3Z4 +y5^p +sg_o9F +*05Z5E +s_?x86 +ux48R4 +x03x27c +T5^z +i14 i56 +i14 i55 +i54 i11 +i7c i76 +x5A*8B +x76Y2 +i7a i1d +i1c i3b +kx34*0A +T7*63L3 +x27*A5K +^;xA1 +i30 i58 +*76$xy5 +sCRo5R-5 +D4i7>y5 +s!lo2$x74 +i5f i73 +x64x97o2Y +Y1LA +o0eZ3 +xA4sA[ +i13 i3a +x57p2 +,Ax09sz1 +sFbsz| +p1y5 +*2Az5 +$UiAi +s-sx92 +s@ZxABx48 +sRc +rx74 +i0xy2shx +Y1stgo0v +i3d i53 +oBn^$ +*29x0A +s0QsGFi6C +o0@Y5s}l +s , +cT1i0* +i7b i35 ++3*60xB2 +i71 i38 +x14Z3T3 +,2T4Z3 +i5] +,Bo1# +i11 i70 +^8^1^0^2 +i11i29i39i43 +i1b i7c +i3d i19 +i3d i14 +i5b i13 +i18 i1f +i11i29i38i40 +$+$$ +$+$/ +^5^2^0^2 +i17 i53 +i57 i12 +i5b i39 +i5b i38 +i5b i3f +$-$" +i5e i35 +i32 i1c +i17 i75 +i1d i5f +i3f i35 +i3f i36 +i56 i5b +i75 i12 +i34 i13 +i58 i7d +i3e i10 +i3e i14 +i5f i32 +i5f i39 +i1a i10 +i53 i11 +i5b i17 +$&$- +i35 i5e +i5a i18 +i5e i53 +i32 i7c +i21i39i46i55 +i21i39i46i58 +^6^1^0^2 +Z1sdF +i5a i1f +i51 i7b +i3b i30 +i5d i17 +i35 i7b +$'$? +i38 i3f +i3c i11 +i21i39i47i56 +i7e i18 +i5c i38 +$($; +i50 i38 +i31 i7b +i3d i37 +i55 i5f +i5d i38 +i18 i7b +i1c i36 +i1c i38 +i31 i1b ++8-3 +^x$xrCrT0 ++B-8 +iAit +c$1$2$3$; +$@{i7> +x93*8A +sDx.1*60 +sjcdx52 +x97x85Y1 +i5_*67 +$0$6$4 +$0$6$8 +Y3x6B +x36s,K +*83i5T +'5.4 +$0$3$0 +$0$3$9 +LAR1y3 +TA[ +o5J$ *86 +$0$7$2 +rs `*4A +oBas/8+A +$0$1$3 +o7kxB3 +sE2 +i1o,3.2 +o7w^'o2i +$0$5$4 +^X-1 +x02-6 +s ^*61 +sw;-9 +$0$4$1 +dx76 +qx31*26 +sQZc +s{Ro4Z +s/'sxixA9 +*98sQ<+A +sy$*B8 +R8x89Z1 +]sQZi3) +sj! +Z4i7NDB +i1$x0B +D7i71 +*27x96 +$%$? +$$$( +$&$( +$!$< +sD2sqZ +p3q*71 +$~$* +$$r +$ $~ +$<$! +$_$" +$_$% +$&$# +o4>i8EsBa +Y5 D2 +$^$! +$>$. +$/$% +$/$, +$/$= +.6^&iAH +k*05 +*34iB6 +^;,8 +^+-0 +x07 x54 +^u x38 +xA6 [ +Y5x31 +$s p3 +xA6 x03 p2 +Z5 x63 +} i8- +sh+xB8 +*78 i72 +L6 $r +dY2 +k slR +i3. .4 +i50 T6 +so0 si1 sa@ +x71 o4s +.6 $S +^m *42 +l -8 +iAv +s0) +s0/ +x41z5 +o02 ] +C T2 +t T8 +sjG c +o8- ] +d*7B$d +p1*34*B8 +T7 -5 +^B *63 p5 +] o9u +i3s x62 +i1o ,3 +K $t +i2d K +i07 i16 +snD +*89 x31 [ +$O o6e +y2 o0Y +^z ] +t i92 +] ^t +] ^E +o00 $a +i09 i16 +o2R o0K +y5 DA +s&v^"x61 +k +5 *75 +D2 T9 +^W *46 +$@ x92 +*23 ^Q +$s i89 +$s *53 +xA1 $Z +u L7 +$3 $1 $2 $! +[ o4L +$5 x15 Z2 +x46 Z2 c +K *30 +^E x16 +i31 ,5 +so0 sa@ si1 +i03 i12 +i03 i10 +i00 z1 +-8 $# +$= $- +smL +y5 T1 +$8 $4 $* $* +s2j E +$8 +2 +^B ^B +x45 y4 +*25 $d +^mp3 +t $8 +q x67 +,6 c +T6 ,2 +$@ *05 +$5 Z2 x15 +p5 o6y +^p o1a +o7h x81 +[ x14 +x42 y4 s6. +*20 i6a +x42 s6. y4 +s2D +o0T c +p4 i8s +o8j t +x03 ^l +q ] x4B +$. $_ +Cx86 +[ x62 i0P +s1X ] +x14i1[ +iAA Y1 +t ^b +t ^c +-0 i8A +$dC +^C Z1 { +z1o9i*56 +*30 o0I +,8 s91 +y3 T9 +[ c r +s =xA7[ +$! $$ +D4 s14 +y3 K +T7 *04 +E *46 ,2 +.0'3*2A +T5 D9 +Z2 i86 +] sKG $a +$] $[ +x03 Y2 +,7 D3 +D3 y3 $! ++5 ^a +o0Z *31 +*54 *31 +T1 *46 +c o2C +^D *41 +,4 t *51 +o6$ Z2 +.2 $R +i4v x82 +y5 xB1 +y4 $y x94 +z1 $+ +Ci5E +i6N $z +k .0 *61 +$E x21 +i0g t L7 +*67 s1. +*60 E ] +i59 o62 +*35 ^H +i52 i60 i71 +^Y +8 +$- $* +o7a x52 +T8 T4 +^Z z1 +$L s72 +$l +7 +i80 c +Y4Y1 +*0ADA +*73 *46 +o17 C +D1 i4a p3 +x0Ao5U +s5v ^R +spc *20 +$k ^Y ++2 $Z +Z2 o64 +$@ x05 +$0 $7 $! +*15 .6 +sW[y4^I +o2b i0L +x01 $d +u sKs +x21 Y4 +x35 Z5 +x64 +4 +p1 x75 +Z5 x57 +sa1 Z2 +Z1 Z2 T8 +x71 o7h ++9 D1 +*42Kk +$* $+ +,8 } +s3F +o0m ^a +i7g K +q x4B ] +^msM$Y1 +ssY*40 +sbS *14 +C $f +Z2 x25 z1 +^A ^B +E ,2 *46 +*21 o7M +x72 i0Q +l '8 $6 +,5 $5 +Y2 x53 +z5,3 +o43 $3 +x72 Y4 +i99 x71 +$n Z1 +C ^t +$J *70 +r -7 +y2 $! ++3 y4 +z5 T6 +i7S s27 +c -4 +c sjc +} i1F +i0r Y1 +$/ .1 +*59 *43 +z2*34 +^a 'A +^i ^j +D2 *45 +$8 $$ +oAxp5 +x72 T3 +x53 q +*12 D5 ^F +xB1 ] +s2B +Z5 y5 x59 +i1@ *10 o43 +x61 i8C +^w ^a ^j +s6c c Z1 +x01$Q +-4 C +,4 *51 t +x43 i2u +,2 $F +l i6H +$z x64 +x12 q +'A ^C +s6c Z1 c +x46 c Z2 +$A $B +TB x83 +-A x21 +x01 Z3 +^K *74 +,A+9 +.7 K $0 +*27 *56 +i4-y5 +^T +1 +y2 +4 +t o64 +o5d T7 +*50 $m +o4O *67 +$M y1 +D3 $! y3 +y3 x54 +i6_ c +] $a sKG +y4 x94 $y +x92 $8 +*93 x72 +i11 i29 i39 i49 +} o7K +*34 o7f +^D o8b +o7X } +*60 ] E +$2 $# ++0 x51 +i1@ o43 *10 +u +4 +x43 $7 +skS +y4 ^M +i58 i19 +i7c i19 +i59 i7c +i7d i13 +sY%Z2 +i19 i7e +i38 i13 +i33 i19 +i7e i15 +*53 *89 +sa5 +z1 x61 +*73 *30 +*45 l +*26 s75 +x41 *63 +-8 *70 +^t c +Z1 -4 +[ -7 $p +i11 x23 +sGK -8 +o54 *26 +xA1 Y2 +D5 +2 +*63 ] +{ *61 +-A +3 +-5 +B +} ,5 +p5 sPF xBA +p5 xBA sPF +*94 D2 +x62 i61 D8 +$8 $9 $5 $2 +t *60 +] *31 +D4 i1i +$1 $7 $7 $3 +^$ x64 +*24 '8 +oAT +sni +*08 D7 +x31 t +x41 *38 +$# $4 +*4A x42 +.7 *85 +,A .4 +x32 *30 +*48 ] $3 +$t D8 +x53 Y4 +x53 y3 +x24 *12 z3 +*17 .0 +*35 x64 Z2 +*51 x32 +} E sLP +o9, l +*07 .0 +*52 *74 K +-4 +B +-4 +9 +*17 +6 +*17 *05 [ +,4 *38 ++6 *46 +i2m ,8 +*61 +8 +sGE .4 +i11 i29 i39 i48 +o8T sT@ +o4s +2 ++1 *25 +*69 '9 +sin +$2 $2 $2 $4 +i41 i66 o59 +sLT +.5 ,3 r ++0 *43 +i41 o59 i66 +y4$. +x63 Y4 +*A6 ,A +$1 ^4 +c ^7 $4 +$1 ^? +$1 ^[ +$8 ^2 +$4 ^3 +$4 ^2 +$4 ^! +$4 ^. +$; ^1 +$@ ^2 +ks"d*26 +c $> $3 +c ^@ $9 +c $5 $_ +c ^. ^4 +c $5 $? +c ^# $1 +$* ^8 +$. ^3 +$. ^8 +$! ^5 +^ ^4 +c $^ $^ +^# ^1 +$0 ^* +$7 ^* +i3jTA +c $+ $0 +*73L5oBI +c ^8 $1 +z3x39 +c $, $2 +sj=o5` +c ^$ $4 +$9 ^! +^8 ^* +,9*BA +c $3 $, +^0 ^- +^3 ^+ +c $9 ^@ +c $4 $% +^4 ^@ +c $9 ^4 +.8s)Y +c $1 ^8 +c $1 ^# +c $% $5 +c $6 ^9 +c $5 ^9 +c ^# ^1 +c $* $* +c ^9 $@ +c ^9 $6 +c ^9 $8 +^= ^1 +c $@ ^9 +c ^4 $9 +c $3 $_ +c $? $7 +c $* ^1 +sD0 +c $6 $? +c $6 $- +c $8 ^9 +x3Ap5Y5 +c ^1 $* +c ^9 $5 +$@ ^7 ++0o4u +c $4 ^$ +c $4 ^7 +$9 ^* +c ^. ^7 +$$ ^4 +$$ ^2 +c $= $0 +c $7 $% +$5 ^% +c $7 $- +c $7 $_ +$# ^* +$2 ^< +$2 ^* +c $4 $1 $2 +C $5 $5 $5 +C $3 $3 $3 +C $0 $0 $0 +C $8 $8 $8 +K *89 +c $2 $5 $6 +*36 x64 +{ ^' +$/ -A +i0t *05 +c $1 $9 $8 +i6V ^u x67 +C $2 $2 $2 +f x75 *4B +*B5 x09 +i19 L1 L0 +i11 L1 R0 +i19 L0 L1 +i11 R0 L1 +} x76 +[ ^4 +Z3dD2 +l $1 $9 $8 $0 +l $1 $9 $8 $6 +l $1 $9 $8 $5 +D2 DC +D2 D9 +d 'F $1 +u $1 $9 $9 $9 +D0 DC +'6 i54 i62 i70 +'4 $8 +KE$R +D3 D9 +l $1 $9 $6 $1 +'7 i24 i32 i40 +'7 i74 i82 i90 +i9Ni5Y +l $1 $9 $7 $4 +sB- +u $1 $1 $1 +^e^8 +^e^3 +^9^c +^8^e +^d^8 +l^1^1 +l^9^0 +l^7^2 +l^7^7 +l^2^0 +l^0^2 +l^6^1 +l^4^1 +l^4^2 +$j$Pc +Z2dx86 +xB2 Z2 +iA_^yp2 +-3 x94 +sCP *43 +-1sv0 +c$e$1 +$a$1 +*46x83 +*97sv@x95 +sw.,2 +*A4,7 +D6 '9 +l $8 $8 $1 +l $3 $1 $1 +l $0 $6 $6 +u $! +l $0 $0 $2 +x03 Z5 +c $e $4 +c $e $8 ++5 x61 +-5 d +l $1 $7 $1 +l $3 $3 $7 +l $2 $5 $5 +c '5 $3 +c '5 $5 +l $1 $1 $7 +l $1 $1 $3 +o1I l +l $9 $9 $1 +l $9 $9 $9 +x01 $m ++2 p1 +^e ^F +l $1 $0 $0 +l $2 $3 $3 +c $a $2 +l $9 $8 $7 +l $8 $0 $0 +u $4 $4 $4 +x91 x71 +l $4 $4 $1 +l $5 $8 $8 +l '7 $4 +l '7 $6 +l $2 $0 $0 +l $2 $0 $2 +l $0 $2 $0 +l $0 $2 $3 +l $4 $5 $6 +l $4 $0 $0 +l '6 $2 +l $9 $0 $0 +x13 ^i +{ '9 +l $7 $8 $7 +l $4 $6 $4 +l $4 $1 $1 +l $4 $1 $2 +l $2 $8 $2 +c $6 $3 $6 +l $2 $2 $5 +l $2 $2 $1 +l $6 $1 $1 +$s $t $a $r +i77 [ +$n $i $n $e +$f $e $v $e $r +$p $e $a $c $e +$b $o $s $s +$t $h $r $e $e +$d $a $y $s +$l $i $f $e +*75 *46 +$m $a $n $i $a +c $x $x $x +l ^0 ^9 ^9 ^1 +$b $e $a $r +^d p5 +p3 snx +$l $e $v $e $l +Y2 x75 +$ o9s +i60 i74 +$d $o $o $m +$b $l $o $o $m +$d $e $e $p +$k $i $l $l +$o $n $l $y ++0 +4 d +$k $i $n $g +*13 .0 +$b $l $u $e +'9 c +Z3 D2 +^a ^g ^g ^n ^a +^y ^p ^p ^a ^h +^i ^k ^u ^u ^y +^n ^a ^p ^a ^j +^s ^g ^g ^i ^g +^m ^a ^d ^a +^y ^s ^s ^a ^s +^i ^m ^m ^o ^m +^o ^p ^p ^i ^h +^n ^a ^i ^s ^a +^y ^l ^l ^o ^d +^m ^a ^l ^a ^s +^k ^n ^i ^p +^i ^l ^l ^i ^l +^y ^m ^m ^o ^m +^o ^r ^e ^z +^i ^b ^a ^b +^n ^e ^l ^l ^a +^y ^l ^l ^i ^w +^a ^n ^n ^a +^k ^c ^a ^l ^b +^o ^j ^o ^j +^y ^x ^e ^s +^y ^f ^f ^u ^l +^n ^e ^e ^r ^g +x65s'6 +*28 i8p +q'8 +T6'8 +^h*27 +p5Y5 +R1 ^` ++5s^Y+0 +K,8E +x87.B+B +iBLo9M +}t*6A +*89-1 +$* K +sxV $g +-4*A4 +D6 *23 +[ $9 [ +x56 Z1 +q x05 +'6 sfs +T0 +8 +[ [ $9 +x03 ^j +o1y x21 +o53 -6 +o0p o2n +o81 c +o4k D0 D0 +Y2 x02 +o3b o4o +x34 [ y2 +Z2 } +$1 $0 $0 $0 +o0r D3 +i5n [ +o0k D2 +f x27 +o91 c +x62 ] ] +$n $e +x04 ] ] +x82 } } +] o6e +l ] $f +$s $e $v $e $n +$a $n $n $e +$M x04 +T1 T4 T2 T5 +smn t +^! Z3 { +^a $6 +z1 -9 x32 +^P c +o2A u +$4 o2o +o91 u +$W r K +K Z1 R4 +*21 *78 +l $g *32 +Z1 i1p +[ *42 t +k l *04 +r i2u +c T3 T1 +'6 o3t +c i5K +$h L8 +i2' s'k o5v +^s i87 x49 +sbz *04 +$i ^p +Z1 i7r $o +smP u +c $" ^" +x56 x01 +z1 o71 +*10 R1 +^v $5 +i53 T6 +Z2 o5b +^l -8 +o7# } +^1 o4n +l f x1B +R7 x34 +-0 x84 +k *04 l +c o4+ +sdb x31 +i0y r +c o45 +R3 *40 +s%Ts;j$i +u d 'D $3 +{ *16 +*65 x14 Z1 +^?sj> +s_q +*72 K x71 +x62*BA +o68 .5 ++5 -4 -A +z1 o4k +Z5 Z5 x56 +i8q Z1 +L6*16 +R6oAU*17 +] o11 +oB_sUX +f x15 +D5 y4 ] +xB3 l +^J -1 +iA] x64 +i7f i38 +D4 E +[sI7 +i4g } +-3 Z2 D4 +*8B ] +K iB5 +$. $e $c +i6D K +^Ri41 +l skL +i5e L6 +i07 D5 +i1b i31 +x0A p3 +x21sq7i0< +x41 *65 +x85 +2 +i5e L4 +c o4N +D5 $F +oB`i5l +x54 ] $M +*74x49y1 +,2 '8 +*35 ^p +smQD0 +$9 i95 +$w $i $s $e +^3 z1 +] o8W +i1a i2d i3i +K s1S +x43 y2 +{[d +Z3sP^ +iAN +{CxBA +iA2 x59 +o8P -2 +'A T5 x82 +x83^b +x93o2` +'7xB5o7g +^u ^g ^u ^A +$R r +D6 *82 ++1 T9 x21 +^9 *53 +Z1 o2r x51 +$hsB) +d o3b ++E -8 +i71i89i98iA0 +$7 k +o9F $t +*24 T1 +x41 $X +i73 i31 +$, *54 +sgCp2} +i1a i2h +sBt +o5H K +D4$e +^^ o0y +$d o59 +$b +4 +x61x8A^< +i71 i15 +p1 oB2 +Z1 z5 x25 +iAC +s4Q +x71 o7h x81 +K o6r +^- *63 ^e +^( i3) ++8*82 +i4e ] +$J $$ x73 +i58 ] +$c $r $a $f $t +s,mK +*09*80$i +sbdL3 +i59 i68 i74 +y2sgz.5 +x06 d +^s skc +3 +*43p5o92 +x24 +5 +i5fx95 +o0M x45 ] ++B-E +DB o1i +stOtR8 +snkz2E +$7 E +t *79 +T7 ssg +*34 .6 +-8 x04 z2 +i9a *69 +*A3 x62 x03 +^/x45 +T0 T8 TA +*40s!I +*70x13*79 +E x24 o3Y +*40 p1 +x67 $6 +xB2{$Z +x21 x37 +l i76 +$A iAk +s`l*70 +i6o i7c +^0 T1 +*38 'A +T0 *43 +o9D ] +$R-2 +s_?z4c +i64 R5 +sN4D5 +Z1 *07 +,9d +$ *69 +x35iA*$T +D1 x8A +*67 ^N +i7w i81 +sDvLB +i3h i4a i5r +*10 x54 +T0 T5 T3 T8 +$rl +x18R4Z5 +sl, +o88 R7 +^2 *0A +sN7 +x26 $@ +soQ l +i3t i4t +$i $s $e +sf8 +$- $/ +$e -2 +'A*4Bi3, +i6o i7y +i93 iA0 +$t $o $m $e +^w ^o ^c +T0 T8 T5 T4 +^O y1 +p4*7A +sn@ +$-$) +Y2 x58 +$I x52 y4 +$.$< +*96i55 +sPi +i3g *10 +*23 $i r +o3?xA8s#g +p2 x16 +o5t ] +o9Q +p5z4*59 +c *80 +L7 s7S +$9 ^g +x64 i57 +i2o i3g +*31 D8 +*86-6sUW +i40 T5 +x91xAB +o84 x12 +x48 u +x02*47 +^j o51 +x04 d i0n +-B -D -C +^FsS2 +T0 T3 T8 T2 +z3 $X +snG*64 +c T7 i7- +-2 -6 -A +c $5 $3 $8 $9 +x32 o3K +D1 ^` +iA1 iB2 +L5 sbL +$1 E +sxDi0xY4 +i06 i11 +T2 T7 T5 T4 +i6* -0 +o9DKo7- +x24 T1 +s7E +u $A $D +^c*1B*49 +*86 ^w x52 +i58 R0 L0 +x63 u +d xA5 x52 +o08 z3 +$m x57 +f x09 +^8 T1 +ck*5A +*34 ^Q C +z4x1Bq +^d^f +*21 $/ +oB;rDB +*53 sko +T4 [ +Z1 u +i79 i30 +y3xBA +^Z x37 +x64 T4 +sbSx94*13 +} x52 $X +i2i L1 +x28*92Z4 +i5b i12 +T0 $x +i5+ *54 +.5 ^F +x28 se\ +D0 i5Z x3A +i3d R2 L2 +i55 +9 +x81 .1 +*21 o2j *24 +L4D1z4 +o68 [ +o5I ^1 +i0a z2 +i0p i2l i1a +o4B x52 +x95 Y1 $x +o0M ] x45 +o2+ *27 +$,$# +-0 y3 +sFosME +-1 R0 +*13 o1W +x9Ax09*5A +i77 R8 L7 +*05 ^j +kZ1x71 +*50 +5 +i37 i14 +i37 i17 +*17*05[ +i53 i7c +d x06 t +sM(x02 +x76 x81 ++1-D +^8k} +i78 i30 +i39 i1b +C $* +swx +o5s Y2 +i3a i57 +xB2i3S*A6 +x38xA3z5 ++0 y3 +C o17 +i69 i0w ++B -C -D +x43 +5 +$zL8*5B +Z1 i41 +i2r i3g +x23 x62 +z2 o6n +$9 $B +*80*B7 +t *28 +kx4B*AB +x58-A +[x21q +$' E +s i +i7e i38 +d 'D $2 +[ y3 $* +x45 $p +D4 z1 x62 +l $. $l $i +$M.B$n +o73 o5O +*34 o0k +i0d i1e +*30 p1 +i16 i52 +.1 x63 +i7f i5a +Y5 x16 Y2 +l $. $b $g +^V K +^g x65 +i4A z1 +i2r i3d +xB3 $O +d $c +i11i29i39i42 +iA& x47 c ++0 *74 +i2r i3n +{ .7 +x56 ,4 +sMpx62i8J +.4 } *09 +y3 T3 x73 +Y3 o7i [ +$% +8 +x28$> +r $e ^a +i7a R7 R6 +i1b i73 +o01 l +^S x12 +.5 $& +*31 T1 +*85 K +r *14 +d 'D $6 +sSf +D6 $, +c o4V +i13 i5a +o6f -4 +3 +i5g ] +i1i i2n i3n +-3 D4 Z2 +i7P *42 +$B D1 +i2i i3l i4i ++8 c +*14 *60 +z2 o2T +^c T1 o5c +T3 '9 +$3 ^q +$r i4E +i0x19k +iBqi1y +iBT x64 *45 +soZ D0 p4 +T2 T9 T3 +x12 $s *27 +i6Ex74k +q x16 k +s6Jswfl +i5n i6t +Y5 x13 +i3b i4l +c $1 T8 +$"Y2xA8 +sJw +u TB +^F r +x4A p4 *70 +s\h*51xA7 +i12i20i31i42 +sek x75 +{ y4 +x62 i3d -1 ++7 ] +*56 Y1 +o9u x36 x41 +T0 T3 T4 T6 +T2 T3 T9 +o3a z1 +i4!T0 +i35 i3b +^x o4m +y2*8Bx15 +c T2 T1 T5 +i21 ^l +$)$+ +$F +7 +-1 -2 C +T0 T4 T3 T6 +k*27xA8 +i3u i4r i5a +T0 T2 T7 T6 +$L D2 z1 +c ^c ^B +x32 ^$ +.5 *41 +s2p +i6o o1p +*41 $z +i3y i4e +sUY +i37 i3c +i7/ *46 +i19 i54 +T0 ^K +cZ3 +^' o2i +x72^` +*7BsnQx97 +x16 d +sa@ +1 +i52 R6 +i17 i55 +$a u x43 +*49 *4A x36 +s/w +*43 o1p +D6 .5 +sRU x04 +*5A x36 +x3A ^M +K sex +T2 T9 T8 +$)$= +x61 ] k +*20 i7j +d D2 o4s +$b $b $s +x41 x83 +x1B Y2 z5 +o9J +^R L8 +^8 ^x +{ { i32 +i5! x32 +i9m x18 +T0 T5 T4 T8 +i52 i62 i72 +i5- x03 +i57 i69 +x28 *64 ++7 -4 +9 +srF +[ sxc +o6V +i76 i34 +$s ^f r +$t o4f +D9DA +[*38 +o3$lsic +s3D o4I +$b i5p +i3c i30 +$yi9+ +xA5 E +p3sP_ +sa@ so0 u +i1k [ $M +-0 y2 +c *36 +c so0 si1 se3 +x15 Y2 ^e +sjQ +i3a i4m i5i +x46 T0 +*93L5 +p4 '9 +*21 T1 +i7L $k t +sszskj +$_ $@ +t *37 +^0 x63 +$_ $. +sfk +$] o4[ +*43 K ++0 sc. +skC +x53 ^n o3n +*37o7. +Cs0W+A +-2 T5 +$3 *74 +i6+ x18 x31 +x65 *15 +^- '5 +*85 +1 D8 +xA6xB4 +i76 i30 +*63 } +sl- +sPUiBd +C x01 -5 +T3 ^H +^y C ++9szGx0A +x65 $< +$W D4 +c i7a +y4y4 +*62 C } +x42x57s*Q +i72 i80 oA7 +Z5 l x95 +c se3 si1 so0 +$L*47 +R4 *46 Y1 +'8Z5o81 +x27swo +f +0 x16 +c $a $f +l $i $v $e +x07 i1n +xB1 $9 +oBs$m +Y1 o34 +i13 i7d +x71 x81 o7h +D5 o7M ++5 smk +$. $e $d $u +i88 i94 +Z3p4*69 +o4z { +i08 i19 +i88 i95 +x84 ^c +x85D2xB2 ++5 ^# +i3P D5 +oBF +i08 i15 +i56 i1d +p4 s0T xA3 +r l +D3 o1- +^a l $6 +y2 C +$2 q +r o5H +*04 sry ] +sso *65 ++A x54 +i5b i33 ++7 *59 +o5s D6 Y2 +f x5A +i2z^js5j +i5e i58 +co4ksU\ +Y3 x34 +Z2 s1z +T7 TB T9 +i59 R6 +sl9^y +*15 i5D *50 +*03 $w +x02 R5 +{q +i41i59i66i77 +o0M Y3 +s2i*73L5 +i98 x61 +*74 $R +^b ^4 ^0 ^9 +i0@ oA2 +i8h i9i +T3o4L +y3x32 +*64 .1 +T7o2J +i81 [ +o92$l +c si1 se3 so0 +*74 k x24 +o9jsOei1a +$Ni2R] +i5e i30 +*42d*06 +} $d +t s6g +^e } +o87 x31 +R0 x21 +x59o1VsWS +-3 -A -5 +l i5n +x61 o7V +i17 i3c +stA +*57 i3t +k ^J C +$d$a +i4] +x43 K i2u +*53*10 +o8# D9 +*41 *47 ++3 i04 +iA2$P +sdl ^V +p5u +'9sDzxAB +z5 Y4 x79 +i6@ '9 +x67 c +i1u i2m i3b +y5xA2 +i7o i8r i9d ++4 { +s#c +$c $r $a $z $y +x01 k +x52 ^9 +xBAx96x39 +z2xB2Y2 +Y2 +5 +c K *68 +^tK +iAF +^f^d +x61 x32 +^7o8( +T6 i6_ +^O i9b +x21 $X [ +K i05 +*75Z3*65 +*23 x82 +Y2c*49 +*13sMz +*02Y4 +i4@ ^M +*52 x23 +$D $3 +z4x0A +x16 r +R6 z4 x07 +x56 ] +x67 k +T2 *02 +c d '7 $8 +soV +p2 i0@ +c i27 +sQjoAj +*76 i4q +} $8 +$! sw! +$; [ +i7d i14 +*06^as1l +$@ $6 +i1c i79 +Z5 x56 Z5 +scf T6 +z2 ^i +sEdl +*30*86*84 +K $d +s18 u +D6 x93 +sM2 +x31 TA +C ^4 +x69l +c $8 $# +^2 o42 +sM6 +*69p5 +x41to0> +z2 i7s +sQ{ +iC7 iD7 iE7 +TB x61 +p2 i4d +s$? +i2 E +T3 d +i18 i1e +$gs^; +E.6x03 +i10 i54 +r $e $s $t +*14 *26 ++7 -4 +8 ++B -D -C +*83s'j +o5qZ1 +$A o00 x48 +$7 -0 l +Z3 -7 +sdlZ2 +c T8 $1 +x21 { l +c T5 T2 T1 +sKc +x15 ^e Y2 +sZ9 +i31 i1d +oA` +z3 D5 +s[DY3 +s$Q +i1b i33 +x43 c $d +z5 x64 +x37*90 +o0r o2i +i9h iAo +-1 y3 +^O x48 +.7 x25 -2 +Y2 o56 +i7i i8f +$d y2 +i7i i8e +-7 c srM +o1@ ^s +i6Qx02*BA +Y5 Y2 x16 +'8y2 +Z2 x94 D7 +y1R0sP_ +-1p4x6B +T4 Y3 x12 +*36 u +i9a iAr +i4e i5l i6i +o6y x71 +s/A$gs-# +T2 T9 TA +f xA7 +i11i29i39i47 +*54 ^c '7 +x51 Z4 +i11i29i37i44 +x98x05s2m +z2 x43 z3 ++A*4AT9 +C'B*74 +o2D k +o0K *02 +-8'8K +syOxB1 +i0c i5C p3 +t x45 Z1 +*10 $0 +x72 [ l +c se3 so0 si1 +o2f s24 +*40 ^G +z1 Z5 +snM +i4a i5n i6g +^. *03 $p +oBF^wt +x61x1Ai8C +i5f i58 +iBM +y2 $Y x93 +iAM ,9 +-8+C +o3e,2p5 +o9r xA4 +DB]x41 +l ^l ^i ^o +p5 $v +T4i6D +$D *65 +*64 l +li0G+A +i1k $M [ +i7b i12 +c T2 T5 T1 +Z4s`" +i61 i72 R8 +x64 o5m -8 +*32 x95 +x24sWX +o6y snj +o82 *79 +i5f i57 +i7n i8k +s0p +Y3 $p +*93x61 +o5O +0 +c $q +x82sHFx0B +i7n i8c +i12i20i30i41 +*13 D9 +o5E x02 +o7MlTA +'4 $q T2 +k y4 +i61 i71 i81 +i12i20i30i48 +[ o0M +o5I x74 +x24o1-+B +x24 i32 +fsvh +x29Kp2 +x71 z2 x31 +Z1 o43 +T0 sr; +dx4B +T2 T6 TB T3 +o05 l +o5= K +'AiA_ +u o2i +z5 x0B +5 +}*89 +*24 x36 +{ ,4 s1) +x08 f +{ s1) ,4 +$(x65 +ssv o5x ++9 Z1 -8 +.2$o +z1 r ^r +D9 $J +Z1 s0a +s%y[D6 +o01 i07 +*B7 '8 +x91 +A +x15 *04 +i16 i77 +^a *31 +sd1$|.A +i19 i3a +i3f i38 +*21 f +x31Z1*74 +o7L k +x02 sBD Z2 +$5 *73 +.7 x41 +i76 i11 +$C $8 +$C $C +$"$_ +i1b i5d +o0c *86 +i7d i34 +svjs)5i1E +i3a i4d i5a +dstv +srh *27 +i5c i1b +iA]x64 +i7r i8d i91 +*21 .6 +R0 o1r +'6 f x45 +i8c i9e +'4 t +x91*56 +c ^6 ^c +$m $a $y $1 $4 +^>s.o +$c x36 +i34 i18 +$a $n $g $e $l +u ^E ^D +*94 D4 +^- x41 +s@2 +x17 $4 +siuy3Y3 +x91stk +i7c i51 +i8. o7l +iA$ +$. $k $g +Y5sgesSZ +i1f i73 +t ^1 $2 +T5 i5_ +i7b i5a +*59 D5 +x54 o3D +$l *53 *32 +'8 $# +o4No9'se_ +x57]x5B +^WsVL +^f^0 +i41i59i66i78 +i1b i18 +$Z *9A u +{ ,2 p2 +x17 Y3 +*45 D1 +i74 i37 +p4 T5 +seF +^L.8 +*14 -7 +x81 x25 l +c ^o ^r ^p +^i ^m ^e ^s +x95[ +i31 i17 +x24 sLO +$XZ1 +l $e $n ++7 o68 +p2 *71 x47 +^e ^c ^a ^l +o5N t +2 +i72 i13 +ts}= +Y5,5sE{ +^@ x5B +C s49 +f x05 +i3m i4o i5n +i39 i7d +x87stk +c $7 $2 $1 $! +z5 } x47 +i1h i2a i3n +^PY2 +Y3 *9B +i88 i93 +^d ^u ^m +i55 i68 +*71 *62 +i40 i50 i61 +x34 [ t +-6 i1j +*09 x54 +^i T4 +*16 *47 +i8i i9l iAl +,7 i9M +i5U x14 [ +c d '9 $6 +$d o11 +u ^e ^2 +k xA1 +D4s=QZ3 +sb/sth +*61+8 +l $. $s $k +i59 i69 i74 +p4 *17 +skcsbvsr[ +*53 i32 +o4d f +$p -1 +i55 i67 +r $b $o $y +x92 T3 +Z5 x95 l +i8n i91 +y3 *21 +o72 sln +i52 R3 L3 +Z3 [ D3 +] $! Z3 +s@Bz2 +R7 Z1 +K*23 +i4l i5o i6v +i2s i3c +D7Z3 +l $s $h $i $p +$d *61 +-0 R5 x12 +Y3sfa +shA +*75 ^A +$=xB5$e +o8[x94 +x2A t +*A3o7O^4 +*02 scB +i7c i54 +i13 i7f +x14 $L +x08-0 +$Gz4x17 +sk! +i50x41 +s9)d] +sds u +p2 x94 x4A +i36 i17 +^U t ^v +*94 x57 +$4 i5- +p2 $n +}oBJy1 +i1a i2n i3e +d t x06 +s8W c +sSI +i2s i3m +D4 $c +c i07 i10 +x14 Z3 T3 +^d^7 +o7d o34 +o14 Z1 +sdx5A +l $1 $0 $6 +c ^8 ^4 ^9 ^1 +D7 DA +^n *26 +i55 i32 +^+ x13 +se3 si1 sg9 +T0 D5 D8 +c ^b ^6 +c o5W +]y1 +sNJ +i1e i18 +i4r i5d +*B3RA +Y3 xA5 +*60 x03 p1 +o5v *20 +'4 $5 +L8^+ +'4 $7 +i59 i16 +s7h +D8 z1 +'4 $2 +^Xx78 +l -5 +i79 i38 +*A4 D1 +i1i i2t i3t +i3p i4h +i21i39i46i54 +sBD +i3p i4e +i2= x31 D3 +i52i60i73i82 +i1k .2 x42 ++6 R5 +{ -4 +o35x2A +$m $t +T3 T6 T8 +]x52 +D0 DD +Z2 $0 +i3SL6i8d +*87s_&Z4 +*68x0BsDI +Z2 o2m +D5s70 +x27 o1y +T0 T2 T3 T8 +i03 K +o6HxB7 +q x65 x31 +D2 T6 +i3i i4s i5s +L5Z1 +D3 Z5 +c $d $f +d 'H $1 +x62 *03 +^9 z4 +*46 $_ D4 +i50 i7d +'7 d +d oBs +L7C +Y1R9D9 +saX +i32 i1d +sa\ +i3i i4s i5h +o9y -5 +c $e $s $t +i1q { +i2e i3e +x61 o8g +l $i $f $y +*83 x63 +s2j +'7 i34 i42 i50 +Z1 s93 +oA1 D8 +Y4 *71 +*37 *87 +} Z2 x71 +c $8 $0 $9 $2 +Z1 +9 i85 +i78 i7f +R4 [ +s;=x21*86 +i5o i6c i7k +.B*87 +l ^r ^a ^e ^b +oAE^*i5l ++6 i3j +*41 *86 +d u +*42E +sx4R1Z4 +i1f i7f +iBu x05 +*80 t +i1f i75 +i8k i9e iAr +*07 x21 +i47 *47 +Z1 o5C ++1 *64 +l $1 $9 $8 $7 +l $1 $9 $8 $2 +r $a $l +o4~ +Esq!-3 ++7^Gs'l +i31 i5d +$y i1p +Kx08c +s5( +i57 i68 +i2@ '8 +x41 r *36 +Z2 $8 +p2 i9! +i7d i54 +x64Z5*46 +Y3 x57 +^' x32 +k } r +Ez1 +o6C x13 +i3b R1 L1 +Y2*41 +f '8 i5m +k ^q +rD5 +oBl +d ^6 +*06 x62 +xA3D7 +*B9*6A +so0 [ o6L +oBgsEG +i6n i7g i8e +i8k i9e iAy +^c o5c T1 +x32 *63 +x91 i8q +Z1 i5m +c ^. +i32 i44 +x25 p3 } +so_ +lo8-xAB +t Y1 +i2a -9 +$0 *35 +LBx16 +x67 o0T +s",^) +T5 T7 T8 +E d x04 +Z4T5x23 +s0YZ1x18 +c ^8 ^e +^2 xA2 +i7i i8l i9l +i2o i3m i4a ++4 +9 +6 +^e ^c ^9 ^4 +$Z D5 +o0b r z2 +^a $6 l +,0^p +T6 T8 T9 +^5 C +^B $. +x91 x24 +o6g $b l +x21 l { +x38 p4 +l ^f p3 +p1 o9. +$1 x81 Z2 +o0b o2u o3e +i34 i10 +c $. $f $r +sHrs-G] +ti7c +T0 T8 T3 T2 +s<9o8g +f ss0 +-9 [ +$<$, +i2a i3k +y5DB-9 +^jY5 +z3 x72 +c ^O +i7d i52 +*01 o8s +[ R2 d +x4A Z3 +Z2 x84 *17 +} x67 r +i7a i8c +} x85 +i1k x42 .2 +r *35 [ ++2 x36 .1 +'9 T4 +^1 ^x +Z2 s52 +o0D i6r +y4 $u +^i ^k ^u ^s ^t +^_ x12 +^- o24 *20 +r ^a $e +i58 R4 L4 +i6e i7r i8o +i0f i1u i2c +x35 Z3 +t $2 ^1 +oAl] +Z3 +9 +{ l x21 +Z3 +6 +T8^2*A9 +s,C$c*82 +i5k i6i i7n +s>+^Eo33 +l ^y ^a ^w +i33 i7d +R6s!l +$$ *54 +T0 T6 T7 T2 +'B *35 +x52 u +si; +^y ^a ^l +x42oBos2C +x71{ +$! $9 +T2 T4 T5 T7 +i4- o0e +D0} +Z2*B7*8B +,B^K +x31 x78 +p1 o0l +Z1L8 +l{ +o5^*29s|t +i9y iA1 +i2= D3 x31 +{^1 +*95*6A +$Hp4 +$. $i $r +E^A +d D7 +i8X D7 ++3x36i87 +p2 o8- +i39 i7b +sp9 +i8is?/ +D1 i5n +i5d i1b +i11 i29 i39 i45 +spSx1A +i7f i3e +$|iA@ +saeo0v +] o7c K +x3B[ +$! $6 +i5a i6p i7r +i5f i13 +p1 x65 x31 +i53 i36 +^x*7B +R6 x82 +t sLG +.3us!G +*65shc +^l ^l ^o ^r +u ^d ^a +*34 ,6 +o61 y1 +*20 $2 +s+0 +i3a i18 +Y1 +6 +*27 +6 +T5 *43 +p1 o0s +i3a i17 +x54+1*71 +^d z2 +K ,7 +*14-7 +i1c i17 +*41 k { +i15 i1e +i9&*43 ++1*08 +^_ ^@ +} z4 z3 +*95Z5 +x51 i4A +snM o83 +saz Z1 +*01 ^0 ++2 .1 x36 +i60st]oB> +x92 xB7 +R4 t +*B0'B +-1 i1_ +-9 oA0 +$?$) +*72s{nxB1 +s@6 +l $. $u $k +i10 R2 +x16 o0H +Z2x67 ++0 Y1 +K *17 x41 ++8o3v +i0b i2r i1a +y1 D6 x42 +s@? +Z2 *17 x84 +x62 -1 i3d +x52 *87 +xA2 K +*59 C +$b *34 +*50 x41 +i7t i8t i9e +] +9 +*07 ,6 +x14 u +iB$E +*53 *73 +Z2 o0h +i56 i18 +i6N $z x26 +so0 ] +{ '8 ++3 $Y +D5x23 +$h $u $n $k $o +i11 i74 +s}Ws>{sJ0 +i5f i75 +c $1 $0 $3 +c^x$x +T2*02o3i +xB1.A.3 +c $3 $2 $6 +snIs@/ +c *25 x13 +z5 t p5 +*86 $3 +x5B^B.2 +,7Z2 +$d $o $d $u +*64sTO +$h $e $a $r $t +} D5 i30 +s{&o2u +s5U+Au +D2 *59 ++B -D +C +sO2 +sW%o2Dy4 +dT0xA5 +y5 l +T0 T5 T8 T4 ++7 x31 +$o $e $s +i7d i15 +*52 ^s +} o4a +*34*A8 +^W x05 $2 +r $m $a $n +i3c i7f +-2 ^e +p4 *64 +,9 $s +[ o2Y +i21i39i47i52 +l $. $n $e $t +y3 o1a +$0 *74 +u $. i1. i3. i5. +i5od +$2 $$ ++4 z1 +Z1 *21 $1 +D9s 5*AB +o6I l +T1 T6 T3 T8 +sibo0Z +L0 o2a +xBA^o +i6% x71 +i2[ +,0s5v^R +udt +x54 f x84 +i13 i72 +o5ux96 +$j $u $n +*76 i67 +i1c R4 L4 +{ *31 *51 +st1 +u s6c +o2Mx02 +Y1 D8 +D7o1L +i5r i6i i7n +x43 x31 $x +i4a i5s i6t +D3*26 +x23 +9 +K *38 -0 +$J $a $n $1 +o0h $a +i4a i5s i6h +sXpsx1] +l ^i ^m ^e ^s +D3 R0 ++2 t *57 +x3Ay5 +$O { +x25 Z2 c +x91 s92 +c^P +i1e i2r i3a +c i8- +s6^RAscg +sbU +D1 ^s z2 +*13o7vs_w +$! *24 *50 +R1k +k '7 +i7U u +Z2 Y2 +o7Sx68TB +c $1 $9 $0 +o97 [ +x21 [ $X +x8Az1^I +i1o i2u i3n +*54*63 +i0w Y2 +i57 i5c +i2l i3i i4p +sJW +s]o'8 +$6 $5 $3 $7 +x82 *27 +xB8K +i3d i38 +^! +4 +*B6i9k^r +i59 R6 L5 +i1p i2r +x83 DA +sVuk*05 +o4v x01 +z1 o3z +^W $2 x05 +i3f i58 +i7a i81 i90 +i11 i29 i38 i40 +r t x41 +i42*46 +i33 p1 +ry4 +$e i7a +$d Z1 c +^iT8 +i12 i1f +-8 o5m +x72TA +*03 sjx +x62 *13 +u ^c ^a +K -0 *38 +$LoA; +.0*3A +$m ^1 +.0o4e +*19$/s-b +$Z c +c T4 -4 +x51 r ] +x76+B +^([$` +o12x48*02 +*8Ax92c +c i23 +sb3 +i7c i8k +-3 sfk +i18 i72 +s@Tx08z1 +sIZ.2R3 +T0 T8 T3 T5 +$?$" +i50 R0 L0 +o53 $e +oBZx5BE +s RT6s&Q +i6N x26 $z +*04 T6 +x63 $a o00 +i5Fx31 +$l Z1 o8c +o57 '9 +i12 i20 i31 i42 +i8xxA1sZb +i79 L5 +t Z3 +8 +d i42 +Co9k'8 +] ^> +u ^0 ^5 +u ^c ^2 +c{ +T2 TB T6 T3 +i2f i3f +*39 '7 +sDMs2Xo7F +o6U +7 +x43 $x x31 +i2o i3v i4e +D0 R4 +i9s iAe +i6a i7i +c i49 T5 +] x35 +T3 } +i5p i6i +$w o4m +o2$*B1 +$1 ^> +i4e i5r i6a +]RA +Z2 x26 +-0 o4l +c ^1 ^c +*B6z2 +*17 x23 +$g -0 +oB$Z4*24 +sIR +sacY3 +*65$+ +i1rsW5o0! +c ^7 $9 +i0s i1u i2p +$3 i9= +x21-1 +.1x46 ++8 xB4 +i8< +o1n ^t +*62 *09 x37 +p1 i44 +i3ix43 +c ^8 $6 +i8c i9h iA1 +l $l $i $k $e +i1o i2m i3b +i1h i2i i3l +i7a i30 +-3 -5 -A +-8D6*29 +Z5xA5 +u ^0 ^a +s{5^.sST +i1h i2i i3c +$8 ^. +*58D2*B8 +Y5x5B +] *01 +*05 T6 +*02 k +i1o i2m i3o +^3 '7 +*A8}*10 +c $0 $? +i30 z1 +^o z2 +L3x05 +c $0 $; +.1{ +i0f i2r i1e +^z ^2 ^a +x54 u +c $$ $0 +se3 si1 ss$ +$. ^0 +o4v '6 +x41 ^e ++A x45 +c ^5 ^d +D0 Y2 +}s|li7. +o0a x46 +^@ ^8 +o3uiBC +oBV +i1f K +x4B x04 +$x *71 +Y5'9 +i3a i4n i5o +o0o +6 +$@ ^4 +^, '8 +$2 ^/ +i3n ^T *51 +swB.8 +f x76 +T2 T7 T5 T3 +r *05 +*57 i3s +i5a i6n i7i ++8Y1 +u i8N +i1d i37 +y5Y2x26 +o0B ^0 +o1u p1 +.1*09 +$3 ^2 +z2 *61 +sfI +*04 .2 +$! *74 +-1 $5 +sI*sk7Y3 +i14 i5f +s|Yo49 +s&_*59 +*23^- +x42 z1 +i9c iAa +s`8]+9 +z3] +i3k i4i i5e +*41 d +smtx81 +K ,3 [ +[ i8j +$b $e $s $t +c ^! $8 +D2 x32 z2 +]dD5 +i2t i3m +$. ^5 +sf< ++2 $7 +p1 sbp +*89 o8e +*25 *13 c +} $X x52 +R5.8x71 +$- ^2 +$g t +z4Kq +.0 +5 x23 +i9U,B +$! ^6 +u ^4 ^a +.8cc +T2 T5 T4 T7 +snxs.6 +sFa +L6+7 +fp4*71 +l p2 K +i2t iAX x59 +i1e i2n i3i +i2n i3t i4o +$. $g $t +x71 x04 $f +^4 $b +l { *02 +r $m $e $n +x8Bx57 +-7*42 +$l $8 +D4$Y,6 +$. $t $c +x06 x45 $$ +T0 T3 T6 T4 +iAB +i1w i2e +x06 y3 *76 +i9A iA6 +$0 ^! +$% x51 +$l x35 +.5Y1 +*14 .3 +c $= $9 +*62 o12 +x51 *68 +*45 o4M +.2 o32 +^9s&_ +sg3-1 +{ *75 +T0 T7 T6 T2 +o0v +1 +o2u R3 +^B x67 x04 +i17 i5e +*40$2scN +$F $M +i72 i83 i92 +x24 -0 +$6 ^- +i0k i1a i2k +$7 ^& +$0 o6( +xB2*A4t +c ^8 ^d +T5 T8 T7 +^1 ^& +*50 o7. +i2c i3k i4s +$7 ^1 +o28 z1 +i14 i73 +x51 x71 +i54 -8 +c $I +$b *73 +-8 ,2 +oB< +c $+ $4 +z3x48 +c $+ $7 +i9e iAl iBl +u ^7 ^0 +D5 ^J +L7 ] +xB9Y3 +y5$]s@F +o4k i62 +^2 ^+ +i55 i30 +c ^6 $1 +Z4 x8A +c i41 T5 +o0h o2l +u +5 +x81 o0u x53 +i9s iAt +sxZ +o4g u +*76 p5 +i3e i4p +c ^0 $! +sxg +C x31 +D0 $D +$% $^ +^lsWR +-5 r [ +^f.Ax37 +c $1 $2 $8 $! +i4f i5a +c $) $0 +$3 ^- +Y2Z4 +sAU +oAO +{sVO+9 +o1& *13 +o4D x21 +$9 u +$. x63 +i33 i11 +s>/*A7sJY +c $! ^0 +i3b i4l i5e +c $7 ^4 +s;MxA4*24 +c $( $8 ++8 x08 +c ^% ^1 +u ^4 ^9 +-3u*29 +s`**9A$` +$0$5$3 +s(!$z +$0$8$9 +L9s$a^| +-Ax9B +i33 i17 +i4o i5v +^2 Y1 +K,A +xA1p1x8A +c $[ $1 +c ^5 $9 +^s p1 +c ^? $1 +c ^5 $0 +*62 x46 +R5 x31 +T6*45 +c ^5 $3 +} x12 k +*72 x39 +i42 i50 i60 +i1n i2i i3m +i3l i4l i5e +c $+ $8 +c $0 ^5 +i12i20i30i47 +$M $a $r $1 +o6J'8 +o4E*04 +ss1f +o32 ^c +*75'B +i2o i3n i4e +i2r i3a i4m +*68iBg +x54 $O +i0W *41 o0H +'9 i50 +Z4 *42 +] x31 +$0$7$6 +^,s&Q +sE(} +*57 o5R +$0$7$3 +$0$7$8 +i4| +^GR5x81 +D4 K +i32 i41 i52 +^9$9 +^s ^s ^i ^m +p1x82sL+ +i1m i2a i3n ++7 Y2 +-2 -A -6 +o8=x0Bz5 +R2 D3 +x72R3 +sDgZ3 +^l ^e ^g ^n ^a +i2a i3t i4e +*78 $w +x43 $d c +*50*03x27 +R2q*09 +y1*8Bx86 +R3 -5 +o2-T4x14 +i6{x24 +y1s/|f +i38 i15 +-2,5 +x62 z5 x27 +x1B z5 Y2 +i22 i30 i41 i56 +i2= +*72 x46 +C '7 $6 +iBT *45 x64 +[o37st6 +i14 i51 +i16 i78 +x02 x46 +^K o6H +y5 x75 x02 +i56 i7c +i92 iA0 +x82 x13 +l $0 $1 $3 +-1 o3P +i75 R2 L2 +Z5qx9A +x03*76Y4 +{ o5z +}^5 +i37 i44 +*15 ^p +szi } +s_R$g +^. $p *03 +i3Ji2r +s'2*4BsG3 +f,Bx87 +^a ^k ^i ^r ^e +i1b R7 L7 +iAFsP\ +$( x51 +o8X } +o4K [ +Z4xA3 +u i5- +Z2 oAw x24 +i32 i40 i53 i62 +ui9V'A +s?V +^T x53 u +*91 x67 +su-*32-0 +T2 T3 T5 T7 +x13 o2S +c oAm +-7TAx8B +r Z2 *05 +R4 D6 ++8+D +i2r i3r i4e +ssj i5r +*42i5x*34 +i5tp5 +xA6*A0} ++1+E +i54 i38 +s0S Z2 l +x81 l x25 +y4scv*20 +x07 $n +x05 c +^uD7 +i3e o2f +$d $e $v $i $l +R0 ^g +D3 t Z1 +oAQTB +[ *10 y2 +i71 R3 L3 +$0$5$7 +T2 TB T3 T6 +$% x09 +i79 i34 +$0$5$5 +-5y5 +i4Ht +$h ^z +*B0sE`s +stx l +5 +Y3x0A +s3sx07xA9 +^a ^m +se2 +Z3 [ Z4 +*42 $g +T0 x47 +T2 T3 T7 T5 +x53 $4 +o96 [ +sD_ +D3 Z1 t +r x41 t +x42 y4 ++0 z3 +i2m i3b i4a +Z3 Z3 x56 +i3b R4 L4 +$=$\ +D8 o8? +i32 R4 L4 +i14 i3c +$j $a $n $7 +*B1^$ +*87-A*20 +Y1 Y2 oAs +i1b -5 +x4A*A2C +sP.xB7 +i1d i77 +] oA1 +$h $a $y $m $o +$3 o93 +Z4*A4s1s +o41 i3H l +*39o3! +sIV +x3BxAB +l $s $i $o $n +x34i5]z4 +*4BiBc +C x01 +$1 Z2 x81 +x92 +6 +so@*A9R6 +i4n i5e i6s +{ o1i *13 +slk*87 +Z3 { +Z3 Z4 [ +'3 z5 } +o1Oi7uE +.6*03*79 +y1s}K +i39 R5 L3 +x35 $5 +svt +*9A u +i59 R3 L3 +*54 x71 +xA7^I*46 +c T1 T5 T2 +x51sMv +^p sfi p2 +*56 Z2 +o2@ o0q +*A8 +A +$^$) +*56*57 +R3 +0 +}*05 +Z5oB|D2 +^, $, +i1kx42.2 +sAws@0*70 +i5a R8 L8 +s9 D2 +$! x18 +$F D4 +i19 L1 R7 +sU"-0 +$&$) +i11 i29 i37 i40 +*59o3e +$*$> +T1 i3m +i1c i5b +*40 *35 z1 +$S +Y3 o0H +i2u x61 +*28x09 +R4Z2 +t o2F x32 +Y3r +^txA8 +i4, c +*39*56 +$w $o $l $f +i7r i8s i91 +Kp5*06 +$! $# +o5z x03 +s%7*6A +*06 ^w +T6 *97 +i0J x65 +t o0M +8 +i18xA5u +*74 *21 +^d s4b +-3 $t t +Z2 i3y +o4l u +D4u +i2r z1 +i59 L5 R6 +x38x6Az4 +y2 p3 +slt T6 +z3s=Co9e +i15 z1 +u $B *73 +o8nx02^y +i87 i91 +^9D7 +s8.i3E ++B +B +D +^# x62 +] szZ +$?$$ +$. $h $u +x41 ^7 +*67 T3 +$g i0r +T7 T9 TB +T3 o0f +*59o8TsqL +x24 K $p +R1 ^p +sAjx0A +p1 'B +*BA c +$f $a $i $r $y +se3 so0 sg9 +sCO +i01sn` +u i26 +'B*03-8 +l ^e ^n ^i ^l +xA7se+ +i21 *28 +x87 E +c ^p +s_F +*08z5r +o5p sek +o7X +0 +x02 Z2 sBD +i54 x62 +o60 *98 +se3 sg9 si1 +o71 +8 +K,7s?Y +i72 i80 i93 iA1 +i9hsiqo6U +^k ^c ^a ^j +Z5 x46 +i7f i75 +o67y3 +y2c^1 +L3 x45 +D8 T2 +*16*60 +$y $u $r $i +l i4d '9 +o7z szM +s1q +^3 ^w +o0m +2 +$h $o $r $s $e +-2 y3 +s1m +i75 i34 +i64 i77 +l $t $i $o $n +sG($v +sP8k*04 +i7k i8s i91 +s7B E +i2t i3h i4i +x73 o6Y +i07 i18 +s1K +x41 i1s +l $E +.1 xA6 +o1A '8 +i1v o5r +$4 $1 $! +o30 r +i2C*5B +o7J k +T7*69i32 +i53 i3f +o9h x62 +Y1 o5F +*85 D8 +1 +L9 l +$# +7 +^/LB +,2*83y4 +x1AiB\ +i77] +*41 +7 +y4 *20 ++9i05 +o91 Z2 +o5- *40 +Z4 x45 +*58$n +L3x56*A3 +soE o68 [ +o1k [ p1 +l x95 +D7 -8 +T4 x12 Y3 +sS+ +*87 s81 +o64 i3r +l ^x ^e +*57 $! +z3 x36 i11 +x06x13*48 +sW| +K.A +'D $8 +^f *18 +o2` +o5W x62 +p3 x03 +*61 T2 +o2[ +i08 i13 +s8G +c $1 $2 $9 $! +$w $i $f $e ++E -0 +i3c i52 +x4AsIO +oBo x36 +'AsBq +.9 r +x25 T1 +^#E +sFn +$m $a $r $i $a +o3C [ +$0 $6 $@ $@ +c $8 $8 $0 $! +c $5 $7 $$ $$ +$8 $3 $* $* +[*63 ++A -7 -6 +^e x53 +$$ T3 +D8 i8J +c $2 $5 $* $* +l ^1 ^1 ^0 ^2 +z4 x59 +C^U +$6 $5 $! $! +f x51 +l z1 +c *63 +.2 i17 +c d 'A $7 +C 'B $0 +o5h*98 +i33 r +x18z4*15 +$P x25 +suZ +suQ ++A -3 +A +i82i90iA1iB3 +c $1 $0 $# $# +suI +$9 $0 $@ $@ +$w $o $r $l $d +c $2 $7 $$ $$ +[ i2A u +o7,} +i61i79i87i96 +$l $a $r $r $y +$f $o $o $d +x92 *64 +c $7 $8 $! $! +C*08 +$f $o $o $l +o0gT6x15 +c $8 $0 $8 $! +$c $a $n $d $y +C 'C $1 +*A7 x37 +L5 p4 +c $9 $1 $* $* +s(7 +c $4 $6 $4 $! +$p $u $s $s $y +s4o] +x23x38 ++8 +D +c $2 $1 $3 $! +i3e i4e +sBQsmr +c $7 $0 $0 $! +*31 x29 +*57R6o1k +i0b Z1 +sOusOG +lsz +*24 x24 +x35 Y2 +$| K +*07$PsZ? +x57oBS +*4Bx73 +x13 $h ^9 +D5 : +*91 *37 +z2i9E +,6i5d +i3b i54 +i3b i58 +.9.0 +D6x63 +i77 i7f +s9= +x25 s5@ +*0Ax79s,z +sV@ y4 x0B +$uoA[xA7 +i2y -4 +sKn^0 +s7@ +s7N +ss5se3 +,6 L7 -6 +o2cx37 +i3f i54 +x91Z4 +$a *68 r +s2| +^l i5v +x35^ct +i81i99iA8iB3 +s7" +s*9 +*69 *68 +s*? +$2 $5 $$ $$ +x02 o4h $9 +,3 D4 *50 +sSRR4-0 +s9e +$k u D3 +} o0x $4 +s*$ +l^e^D +$2 $1 $# $# +$3 $8 $! $! +c $8 $8 $# $# +$3x23x95 +l$1$3 +i1o i2o i3t +c $1 $1 $8 $! +^n ^e ^d ^e +l $9 $0 $9 +*61 } +Z2.0 +$5 $8 $! $! +$4 $0 $@ $@ +D9*39x26 +sP>sYh +$5 $8 $@ $@ +i7b i3c +$8 $7 $% $% +i9`s+Fi5` +y1 -6 +ci2e +x06 q +x24s^V +i16*85 +x61o86 +i7v i8e i91 +i79 i35 +o51C +D2 D4 : +R4 $9 +c $1 $4 $@ $@ +i64 *65 +i75 i5b +^e ^f ^4 ^a +d*07x32 +Y2x34 +i75 i5f ++2 +7 +9 +l $5 $5 $9 +Eo2WT3 +z3 -2 ++C +C +E +u z1 *31 +^#^@^!$#$@$! +tsIt +$4 $5 $$ $$ +i4a l +]t*3B +l $8$2 +*47 $t +.4x7A +c $2 $0 $0 $6 $! +c $0 $9 $@ $@ +sQC +sQB +[i39 +T0co5c ++1 c srD +c $0 $8 $* $* +i71 i39 +k Z2 ++9 xB7 +l '6 $8 +*31o9m +$5 x83 +co31 +x87*43 +$&$+ +x2B-1 +l '6 $3 +i1a i59 +T2 '7 +s97*67 +T1 T6 T2 T7 +i96x82 +sSN +$.$~ +o0CxA5x52 +c $0 $8 $$ $$ +^$d +z5x25 +KLB +$J L5 +^ *69 +o36-3 +i1i i2j +dx65x52 +x05o43 +c $9$8 +*28-3 +s94 i75 l +l $2$8 +{-5s)8 +l $4 $0 $8 +xABL5 +$0 $5 $* $* +l $3$0 +i1P,B ++8t +LA+0z2 ++6*57 +l$1$5 +x03 *12 +l $7 $2 $1 +u$1$9$7$2 +c $5 $8 $! +y1y3so4 +x72o3G +$7 $2 $@ $@ +o98+3y1 +l $7 $2 $2 +c $6$8 +i71i89i97iA6 +s@6Y2 +x13 ,6 +c $6$6 +$6 $3 $@ $@ +{,8 +$8 $1 $* $* +y2 $f *10 +[o7Y +ds,e +y2 L4 +i13 $5 +x23 z5 +l $7 $2 $6 +o2%s`\x15 ++4x54 +x51 .9 x05 +y2*07.0 +$ p1 +x15l +^ysZfC +*54+6k +sm@ +ci4- +y2x54*A3 +ci4# +i3m i4e i5r +i7e i3f +Z2z1D8 +c $7$9 +c $7$4 +i6M i7A i8R +}$dy2 +s54 -1 +$&o96 +*28x28 +*B8C+1 +,4s\w +o0+Y3 ++6 +6 -C +x2Bs_Hi1: +x75*08D7 +o6'x19Y5 ++7*30 +*61*68x37 +c$7$7$7 +u $7 $0 $0 +s@} +l x15 +$0-2 +c $1 $0 $9 $! +s05 +8 +q ] +c $1 $3 $3 $! +c $9 $8 $7 $! +Y1+6 +i7>sLT +s3z +o7V*61*5B +x92{*92 +l $9 $1 $4 +i7f i3c +l $9 $1 $9 ++0-E +[ +4 o5o +-0 z1 u +c $d $0 +*71sv)*38 +i35 i18 +co19 +x75 sck D3 +co14 +s1Z +x5Bi34*74 +L6$r*19 +^1 -3 +x37T0-0 ++1 +1 +E +xA5*36ssr +p5 s*f +$Gc +$"s}qxAB +$@K +r*27+8 +co1@ +x08 z2 +*53] +$a $u $g +,6 -6 L7 +cso0se3 +l $1 $5 $0 +l $8 $2 $2 +l $8 $2 $6 +*52xA1 +$w -4 r +l $0 $2 $2 +si1se3 +$8o88 +l $7$8 +l $7$6 +cT2i2_ +sKh +^V^B +i34 i15 +l $0 $2 $1 +$u r +*04sai +sLlx12Z4 +l $0 $2 $9 +c o42 +i7c i1e +^4^3^2^1 +}+A +*9Bs=& +*81x72 +'7$1 +l ^r ^u ^s +C *35 +lskL +$. $i $n $t +i12,6x83 +x38s!Si1t +l $7 $4 $7 +z2 o1s +$6 r +D5slZsQm +$, [ +-6 -D +c $c $e ++0 +C +C +c $2$1 +l '7 $8 +iBGi2, +c $2$0 +[$k +x78s=kK +s8{x84 +i2t i3t i4y +d$1 +*B5Z2s#1 +R0 -6 ++E -D -D +l '7 $0 +c $5 $0 $* $* +Y3 x96 +l $3 $5 $4 +c$4$u +*71i12 +*76$/E +] q +c $1 $1 $4 $! +sBQ smr +u$7$7 +$y *16 +c $1 $8 $8 $! +$7 $2 $? $? +R7*24 +i9RskM +c $3 $2 $@ $@ +ci6e +ci6o +-8*24 +c $6 $1 $! +x76xB1i39 +sP4D1 +c $2 $9 $2 $! +i4y +1 i3g +$7 [ -2 +d x27 $@ +l $2 $6 $7 +i2TsgT +L1D2 +srw t +c $1 $e +$T *87 +p5 *45 +c $6 $7 $! $! +l $3 $3 $9 +u $6 $7 $8 +[ o6o +x43 z1 x51 +.1 s9a +*04 *53 $y +,5 } +c $1 $2 $4 $! ++A -6 -7 +$=$* +$G c -0 +c $9 $9 $8 $! +dl +Y3Z3xA7 +Z5 [ [ +l $3 $9 $3 +^2 D7 c +i8roAb +Z2 o50 +7 +]x51 +^o ^y +i40 i50 i60 ,7 +'BsU( +*7AsxW +i31 i10 +D1x75 +x14 o40 +iA7 o95 +s?e^# +l $. $r $u +c $6 $1 $9 $! +*54xA4 +T3xB3 +$4 $5 $! $! +i43*23 +$5 $1 $! $! +[ C o2W +$z*2A*85 +i2t i3t i4e +tcsOC +$3 $7 $* $* +o77 -1 l +[ u -4 +$3 $0 $* $* +sSM*49R3 +x72 l +y1kt +i7e i58 ++8 se, +i7e i50 +i42i50i61i73 +^m z1 D5 +c $0 $6 $! $! +sIpsTW +*4B *37 +A +,8^/ +xBA$Fz1 +sabsN/ +x35}*30 +R4 +6 -5 +c $5 $1 $! $! +^1 x56 +K $d k +swv +l $8 $0 $1 +x31 ssr *15 +i0v r +c $7 $7 $# $# +$j $u $l $1 +$9 $6 $$ $$ +c $0 $1 $1 $! +$3 $2 $* $* +x71 c $2 +$8 $3 $@ $@ +sg"xA3*14 +*45.8 +L8 l r +D2 o18 *41 +i2n i3e i4s +T1 T8 T7 T2 +sCH x62 +R3C +c $1 $8 $1 $! +i13 i74 +i56 i38 +c $9 $3 $? $? +o6@ '8 +*A3s3h +x67*75 +o3k R1 +i7g i8o i9n +*05 d +i5w p2 +$2 $6 $? $? +R0*5A +q*57 +'7 $$ +c $a $3 +c $a $5 +d sam +t Y4 +oBzi9` +$0 $4 $@ $@ +s20Z4 +i4o i5v i6e +Y3 *17 +iBzo9fz3 +i72i80i92iA2 +T9Y4 +cx23 +i2e '7 +R0o4| +f '7 +c $2 $3 $# $# +T1 T8 T7 T9 +x05z4 +sP[ +$1 $0 $? $? +sLZ +sqX ++5{ +i51i69i76i85 ++B*25 +L1 T0 +$j $e $s $s $e +Ci58 +$7 d x62 +D0*06x87 +{{i6w +*B3 +o4u t +o2B l sxr +$9 $8 $? $? ++0 +B +1 +i76 i1b +] t +T9o9pi9^ +,1 o3o x53 +*5B x05 [ +E swy ++B +D -C +x2Bsl6p4 +o33 $- +oB9 x05 +c $9 $0 $9 $! +$7 $8 $* $* +D6 R5 +i6a i71 i81 +*B8[Y5 +i22i30i43i51 +x35 x45 +*25sta +i1d i30 +$-$; +c $2 $3 $2 $! +s)0Y5 ++A -E -E +sa,*94 +TAi5IDA +c $4 $4 $* $* +fx18z2 +o5' +0 +-A-D +^y +7 l +*2A^b +i1d i35 +c $8 $7 $8 +o8mZ4Y4 +*79s_C +sp? +l $6 $2 $1 +*B5,9 ++C -D +E +c $0 $1 $2 $! +c s2m +z1 x72 ++1 x28 +x91xA4 +T3 srh +l $1 $8 $2 +sV&o1P +c $1 $1 $5 $! +c $3 $3 $$ $$ +xA5 $D +[$\o0P +d '3 p1 +^2 D7 +i7i i8d +i7n i8t i91 +d 'Q +^h Y2 +i1Gl +$2 $2 $# $# +xA2 .4 +*85r*68 +u^x$x +c^x^x$x$x +c $6 $3 $* $* +c^X$X +d o0p +i4j i5u i6l +c $2 $7 $@ $@ +^R*45 +i27 i37 i47 +i12 i20 i32 i40 +c $1 $7 $1 $! +c $2 $4 $2 $! +o8C x35 +Z2 +7 o50 +o6W x03 +$2 $0 $? $? +x12 *14 +] $+ +l ^t ^o ^n ^k +sp2s4{ +c $3 $4 $@ $@ +$K c +c $1 $8 $! $! +o9J *13 +oBT +*40 $6 +l $9 $9 $4 +x12 i7T +i22 *02 +Y3 o6h o0H +x05 $b +$r $8 +$r $0 +R7 [ +*01 $] t +oAVx47sPg +d x12 +o0k *73 k +x96o8( +oBH +i2n i3t i4i +L2 u +L2 K +i4? *32 x01 +i13 i3c +l $i $d $e +oB/sCu +*45 *52 +] *03 +^1 $@ +c $7 $1 $1 $! +p3 D9 x0A +*81 x32 +i12 i20 i31 i49 +*89 x63 x04 +i0Q x26 +$+ *24 +$6 $4 $@ $@ +$4 ^r +DB*94^b +o0Q sck +c $5 $5 $* $* +$@$~ +*8A x43 ++2 k +*0A } +.4 sgp +c $9 $9 $0 $! +x63 l +c $6 $6 $! $! +st +0 +i2m i3b i4o +$f $e $b $9 $5 +sHo +i8i i9n iA1 +E *05 +c x85 +i1c i53 +sfq +R1 '7 +l ^9 ^0 ^0 ^2 +i1c i50 +$R *12 +r $i $v $e +s9b +sfm +rTBx74 +k^JC +ssgs7",4 +syU +i34 i5c +L0iBNE +-2 z1 Z1 +c $b $o $o $k +o5u [ +Y5 x1A +Y3 i06 +s'; } +x24 L2 +C ^X $X $X ^X +sL6 +C $X ^X $X ^X +C $X ^X ^X $X +*52 } p2 +C ^X ^X $X $X +C ^X $X ^X $X +t o5J +x5AY2 +C $X $X ^X ^X +x1B.8^v +x23 C +sXf-4 +o2I*49 +r *05 Y1 +-5 $* +i0d i2l i1e +i11 i29 i38 i42 +Z3 xA6 +*58i92x9B +i12 i20 i30 i41 +s3I +R7,2sr( +Z2 o3u +] *62 +Z2 i78 +$Y k +sux +sLp^_ +su} +i0H i2l i1e i3l i4o +DA { x54 +i5o d +sfc ^k +i22 i30 i41 i57 +sW, +x91 iB4 +,3 Z1 +$/ x74 +sj[o3= +] ss6 +$Eo3t +*74 x41 +x95 x23 +o0W C +x47o8) +x51 x5B +*67 *B3 x76 +RAx5A^U +ci2lL8 +sf0 +l $0 $1 $4 +*50o67 +sf4 +y3 ,3 +x25 Z1 +{z1z3 +R5+4 +oBa +A +D3 *09 ] +x98RBsR# +l ^h ^s ^a +x04 k +*06 s7A +y3 x41 +x51 *57 +r o2D +i37 i48 +Z1 o3v +$> x14 +^S C +-6-D +z3oAxx87 +x61Y5 +R8} +R6 *65 +-7 o97 +i52 i60 i73 i82 +*4A}^$ +sVTs#ix8B +*04 i0K *43 +l $0 $9 $9 +] D1 f +i3* x61 +Y3o91 +*23 ^W +p2 x07 +R4 D2 +*65*15t +D5 stm ,3 +*10 o4w Z1 +sH! ++5 p1 +ri0@ +o27 p2 +L0 o21 z1 +q *03 +y1 i75 +l $5 $1 $1 +p1 x65 [ +x76 +7 +svB *15 +st6*63 +i32 i40 i53 i60 +i0g i2e i1r +*B9 K +x54 Y3 k +soB l ++B K +,8 xB1 o7h +-9 x25 +Y1 u .4 +tsXDx62 +i11 i3f +Y3i0_xB5 +y4x7B +i13 i3f +i1H i3S +o6. c +z1 o5k +i11 i29 i36 i43 +se3 R0 +i6i i7e i81 +smJt +*34sIa*52 +i74 i1b +^q *57 +*51 E +x23 l $! +i5+ l +s*D +-8*57 +DB u +sK9 +z5seS'A +sU,z1T7 +sIU d +Z2 t +p1 x15 +*75o1rsg1 +'E $5 +Z1 s2^ +o6?Ex5A +o1o *B1 +*73 { +$TsLU*91 +i30 i53 +C $y +k*50 +.4 Z4 +o12 *04 +u i68 +T7stc*04 +u $9 $8 $8 +^0 *41 +x91 *01 ^H +^4 x28 +l sz2 +l $1 $6 $8 +Y2o7u +y3$! +l $1 $1 $8 +'9 Z5 +i8n i9c iAe +slr r +d o93 +*72 i3r +u i6P +sr( x32 +$p o1r +i3b i52 +.4 K y2 +p5x37 +l $k $h $a $n +o2I k +l $1 $1 $6 +z1 i3k +x21 ] +*A6p5 +Y2 y3 +o9Y c +fs1&x53 +$I i68 x34 +i8W D1 +sZ5 +$s R7 ^T +x37 .2 +svB .0 ++3-B +oAI +i1b i15 +K *92 +sHF +c $o $l +$1 *52 +^, $z +i53 i38 +y4E*49 +i1d i73 +f x62 +i53 i34 +D8 o7= +c $1 $8 $8 +D4 Z4 .4 +x54 k Y3 +o9& x35 +i53 i3c +x31 *15 ssr +R4 x02 +l 'B +r T9 +,8 i78 +xA4 o3@ +Z2*53c +o4d iA0 +^h ,1 +x84*ABk +$#$? +*26 Z2 D2 +^i x53 Y2 +l $5 $2 $0 +x05 *23 +x02,6z5 +i52 i38 +o4z l { +i0H i1e i3l i2l i4o +x63DA +$4 $8 $0 $7 +'A r +sIg*82} +sfp k +xA1 +4 +$3 $3 $0 $8 +c $h $e $a $d +x48Y1o5F +z2 *41 +i82i90iA3iB2 +^5 c +c '5 $8 +i5f i16 +oBjx04 +*83x41*61 +i36 i7e +*14 ^q +R5t +*10 Z1 o4w +c '5 $2 +^QsrR +i0u $3 +*01 t $] +*13 d x52 +Y2 d ++4 $Y +Y2 } +i5V +*8AsQA +T1 T6 T3 T2 +scCk +l $2 $5 $6 +ko4g +$3 $2 $9 $8 +i30 i17 +*69*7Bt +l $2 $5 $2 +^C ^1 +l $3 $3 $2 +^n x82 x75 +T2 ^I +*A5i6; +Z3 Y4 +$5 $0 $6 $9 +svp x74 +iAU +x35 *26 +x42 $o +-1+C +*36 ^k +*81 +7 +x63 c y3 +sc" x27 +*20 $V +Z4 Z1 x75 +o4} E +se+ +f x4B +i3R*23 +$! $) +D9^[ +*04 $y *53 +x05Cz1 +*52z1sDL +$v *31 x41 +l $9 $2 $2 +sZT +x58 ^h +x23 Z1 sdg +l $1 $7 $8 +*89s.Ks!X +oBO x83 +si" +^q-0 +sZ= +p3 $T +t ,9 xB1 +.4 y2 K +i5f i1d +.0 x53 +l '8 $7 +Z5 x0A +*71 x56 *01 +sVQ +*25t +x1B*06r +s|1i29 +l '8 $4 +*62 ^f +*B3 x19 +*A3x27 +i0q u +[T5K +} sUO +l ^2 ^0 ^0 ^2 ++B c +z2^W +l '8 $9 +Y1 ,8 +i4b i5u +oAU +x0Bo5sZ5 +.6 x94 +*87u +*82 x56 c +sf( +$C $T +l $3 $6 $0 +i44 *54 L6 +sxi +l saC +x15 l +^d *67 +,1 x53 o3o +x84 K +$e -2 *34 +Z1 +0 z1 +^l ^l ^o ^l +*07 r +sx' +o0a T2 +l $0 $1 $1 +i81i99iA7iB2 +Z5 x65 +$q K r +.7 ^V +x43 *75 +x78 ^l +-2 Y3 +] *79 +o1K.1 +q x17 -1 +r ^s +i76 i1f +x85 ,9 +*01 x73 +} *46 +^F x19 +y2x4B-3 +x21 *A0 p4 +i9x -A +'3 p2 +x82 k [ +[+As/u +t xB1 ,9 +o2 ^t +sge +i9" +i52 i13 +$7l^m +.1 '5 +u $1 $0 $1 +sHh +x51 r +o6v u +x3A -1 +u x86 +oBM ] +s?R +Y3 x6B $v +'9 o4@ +i56 i3b +*74x48*7B +c i69 ++5sgm$_ +i23 i39 +c i61 +i1) +i7cs=. +$Y *63 +l*54 +i32 i40 i52 i69 +i32 i40 i52 i65 +*75 o5L +Z2 R1 +*68iA1 +i50 i3f +x47 [ +^y o71 +i13 i1d +$h $e $i $d $i +T2 T9 T3 T4 +T1 T6 T2 T3 +x37 Y5 +,1 f +s9O +p2 l x48 +o2Yx12 +i2| [ +sRN +T1 T8 T6 T2 +x59 T2 +i50 i34 +*16 u D5 +s7W +x67 i4E +s,M +o1/ x2A +Z1 iA7 +{s>ty1 +y2 Y3 +x71 o2E +s0v o6_ +z3 x43 +i5 x04 +*72,4x29 +i73 i17 +{+3*A5 ++9 *9A +s*R*79 +x26 -5 +-2 ^2 +squ{sAz +sUD +L0 '2 +*06 { +s4F r +x18p4 +d $d +l $0 $8 $9 +'BZ4[ +.5 ^w +o2V y4 +sGE*67sfj +$Y-9 +x41 f +D1 x14 p1 +$J .3 +l $f $u $l +s8Y +i1y i2s +i3g i4i i5e +k*08-5 +x14x51*63 +y4 k +[ x16 p5 +l $8 $9 $9 +R1*5Ax69 +x37x17s9+ +r^8 +Y3x43t +*54 *20 ,9 +r o51 +TA y2 +*B8 x47 +$& x32 +i14 i79 +*35 x71 y1 +x56 { +Y5 *1A x3B +i21 i39 i46 i58 +$% Z2 +p2 ] +i1f i15 +fi1Jx89 +x06 *35 +T0 TB T7 T3 +D7 $+ +*A7s,z ++3 sts +*31 ^@ +se8+2,9 +y5 l +5 +T2 T3 T4 T9 +o0O u +*53 d +^* x51 +x48 $_ +$J*23 +Z2Z5 +x37 z2 +l $0 $0 $5 +K z1 } +^G Y1 +{*89 +l $0 $0 $8 +$`*80 +s9R +^O*86 +i3a i4r i5i +R9T1+A +i1a i2w +p4s94 +i2B '5 +l $4 $0 $9 +E o2W +xA1T9 +*43Z2 +$k D3 u +f x6A +i71 i36 +$i Z2 x15 +sz4 +sFl ^F +x81o1v +f x69 +i72 i80 i93 iA2 +i11 i7d +Z4 x75 Z1 +xB2 x19 p2 +^t ^m +*B0x69o5V +x43 u +^o ^l ^i ^m +*82 c x56 +i1a i3e i2k +Z3 -9 +} sro +'A scZ +z2 $s +L9rZ1 +D2 Z2 +D4 .4 Z4 +x1A q +x67x87 +l $2 $6 $2 +y5 +5 l +l $o $u $s +y3 i9@ x7A +y2 *65 +d*29 +RA x52 +i1b i30 +sz1i07+7 +i50 i15 +oBLY5 +o4v i0x +sa0 .6 +x13R5 +o0` r +T3 T7 T6 T4 +D1 x54 Z2 +$h *50 *25 +x12 Y1 y5 +T0 T1 T2 T9 +i4^ +x14 f *10 +-7 o1@ +i73 i34 +l $3 $1 $3 +$0 o5; +i8~ +T2 k ^p +-7 ^4 +$v x41 *31 +T3 o0p +x25 -0 +,6 o4X +x4AZ5 +^s x1A +^b d +i51 i37 +LAsV, +sP9 +x87 L8 +L3D8 +sPf +$! x19 +R8 $3 x25 +sZM Z2 +y2 i4m +sE3 +*84o0DY4 +oAVs#D +x95 x42 +*62 x53 '6 +i5e i6a i7r +$h $a $p $p $y +^3 *63 +x67 p5 $K +*5B [ x05 +^g o08 +i71i89i98iA1 +c ^5 ^1 ^0 ^2 +i32 i40 i51 i63 +$a,5 +y1 *08 +i32 i40 i51 i66 +i32 i40 i51 i64 +,8 o7h xB1 +i97 $5 +'8 Z5 +.5 D9 +i2l i4n i3e +s9& +$. $u $s +sCv +sCx +^P o5d +$w *75 +x02sJ=Z5 +i21 i39 i48 i53 +sCn +*68 $7 +*83 x59 +Y1 *69 +x14 z1 +^t ^a ^p +.3 i76 +z3 Z2 x47 +$,$< +usa3 +^f Y2 +^!x43 +T0 $j +*A6 x61 +Z1 $s z1 +x71 o3| +x81Z4 +T0 $V +x23 *52 +y3^Z*8B +D0 K +o5, x61 +f x84 *35 +$v $a +c*06x94 +.4 d +Z4 x95 *A6 +$l $a $u $r $a +u sYU +x48i0Z +Y3 o0H o6h +sBO x02 +z2 x52 l +D3 i0' +Z1o7.y4 +*43 '9 +i1b i39 +xA3 D7 +^s ^p ^e ^e ^p +Y2 ,B +i10 i78 +^E z1 +p5 -0 Y4 +K x45 +o3e*A2*65 +slB +*38x38 +sWG +o1L sbs +Y1 .4 u +*80 x12 +p5 Y4 -0 +x4As!C +x18 $N p1 +D5 z2 +x62 o2? +Y4 { +Y4 K +L8 r l +k o0f +i3i u +i11 i5c +x36LB +*41 i7x +i4e i5n i6t +o2HDA +i0P ^E +oAH +i0H i2l i3l i1e i4o +i5i $q +i6K x13 ++2 $o y5 +iA&^Kx21 +$_ x75 +sXA +*24x23 +slo i2l +z2 ] i19 +.2 sBK +Z4 x0B +sL9 +i72 i39 +i8M x16 +$.$] +x27 $L +o1I +2 +i6s i70 +sCJ *40 +i6K u +*04 ^0 +z3,4 +iAxsc6[ +^v +5 +sGH +]*86x04 +D0 spe +ro2E +i3e i4m i5e +,3 sNU +$f$c +^< c +o0k k *73 +Y4 ^3 +$a$c +$f$a +x24 $C *31 +i99 Z1 [ +y1 Z4 x69 +sjK +ko2niBS +*81 t '7 +sTW -6 +D1 x92 +xA2 u +Y1 $^ +c i7! +s\4 +i1b i7e +i1b i7d +i3Kx0Ax85 +$0 x14 +Y3 $v x6B +x56 *50 +k *62 +{*24 +^4i9\ +i57 i30 +c$d$1 +x15 } +*81x68 +f *35 x84 +sO5 +z3 x47 Z2 +$a $b $b $y +$,$/ +stysAn +$I x05 +oAu +A +d x7A +l [ ^u +x75 *67 +*50 x82 +[ ^X +^f +8 +^X *14 +$M x27 +o7K x13 +snZ K +[ ^U +] x46 +C i5E +^b ^o +c $6 $5 $6 +*09qs?l +*72 o0e +l ^6 ^9 ^9 ^1 +i3v i4e i5r +D5 ,3 stm +x74x93y1 +*15 u +x2A $* Z2 +^G o3G +x52z4 +$a *81 +i3v i4e i5n +E*29 +o0) +o4j -1 +x34,1 +i4a i5n i6o ++8x8Br +z2 i1k +^k z2 +t d +x16sn. +*04 p1 +i7i i8g +x75 +9 +*80 x51 +*71 *01 x56 +^M x48 +Z2T1x82 +*05 k +o8[ x94 +^ x9ADA +y2$! +-5 $( +p1 o0i +x47 z1 +i70 i19 +x24 *31 $C +-0 Z3 +i4d*42x37 +o5Vs&J +c ^g ^o ^d +$l *23 +-0 x82 +$"$( +sn| +sFo u +t*05*57 +s4Is)*l +i1c i7d +T0 T1 T5 T8 +$]*B8 +^! *51 +sAq +L7 u +iBA*19 +l x01 +sV{y2*45 +-2,2s'Y +^X *04 +*38s\ux59 +svT +-2 *92 +y2 x39 +i8a i91 iA3 +$gx25 +^J R6 +x43 o5q +soAb +$I T6 +T1 T2 T6 T3 +sy1x36 +T3 T6 T8 T5 +x14 L0 +c $3 $6 $3 ++4 Z2 -1 +Kx93 +T3 T6 T8 T7 +^3 z4 D1 +T3 T8 T9 +*52 Z2 +*73 ^s +.A x02 +i4i i5k +TAx47^H +T1 T8 T2 T6 +c $3 $3 $4 +T0 T8 T2 T7 +R0 y1 +D2 i5C +C $0 $0 $1 +C $0 $0 $7 +$K oB5 +o4U t +c $3 $8 $3 +i1a i2r i3d +sms ^' +T1 T8 T2 T7 +i1g i2u +i1a i2r i3u +o2l $k +x81 x25 +i6i i7g i8h +Z2 o86 +*38 x57 +Y2 $3 +i1u i2e +o24 u +^r o2x +^1 Y4 +T0 T7 TB +^Ys`%sW' +x04 y2 Y2 +c $8 $9 $4 +x35 T2 +0 +i1o i2m i3i +-3 x59 +x24 y2 Y2 +c $2 $6 $5 +c $0 $4 $4 +o79 Y1 +c $6 $1 $2 +o5o*90*51 +*20y5 +*34 y1 +T3 T4 T6 T9 +x62 *A7 +i1u i2f +x29 i0s +$2 ^& +$2 ^3 +$2 ^5 +*13 Y2 +c ^$ $3 +c $5 $& +$2 ^^ +*75 o87 +f i62 c +$# ^3 +c ^@ $7 +^1 $^ +^r z2 +c ^! $7 +c ^! $0 +i8 R9snf +y1*BA +*82$_.2 +$5 ^# +x46 '9 +i3e i4i +$5 ^- +T0 T3 T6 T8 +x02 Y3 +-8 ,9 +$5 ^4 +x76D5q +iAA +-8*70 +T3 T5 T7 T8 +$$ ^8 +.9^S} +i2l i3v +$5 ^_ +c $- +$6 ^. +c $. $n $e $t +o1csRx +o4w .6 +i2l i3m +t^m +'5 *20 *14 +c $H +se? +i2c i3k i4e +*2As`7$f +R0 ^E +c $, ^1 +s-\$= +} ^7 +i3c i4h i5a +c $4 ^8 +o6G $B +-BsKL +c ^6 $8 +i2c i3k i4i +c ^6 $! +$EK +i0! { +c $) $4 +o7$ x24 +c $& ^1 +c $4 ^@ +sWA*03LA +R8 $N +c $! ^6 +c $! ^5 +i99 iA9 +i00sdD +$C R7 +o4m *07 +^8 R1 +] x25 +x17 { +f c i62 +c $7 ^! +o9SsaAs/U ++1 x92 +i8s i9t iAe +s`4^Co79 +c $0 ^4 +T3 T5 T7 T9 +c ^ $1 +^6 p2 +c $0 ^! +c $0 ^# +Z2c+3 +uRAR7 +x86x54 +i1a i2t i3o +x05 ^m x64 +sjq +c $0 ^@ +i4e i5s i6s +D9s]^ +c $3 ^$ +^e $7 +i3e i41 +y3 *69 *68 +$u x67 +c ^1 $& +i5t i6h +*13 c +c ^1 $, +$a o6h ++3 ^l +y5 RA +x41-3 +o8\iAQ +q x61 D8 +sjx +.4 $k +dx27.A +R9.9 +x81x24 +T0 TB T3 T7 +d K x62 +o6$L9 +R4 -5 +6 +i6t i7i i8o +o2j Z1 +c $8 ^* +z1 x83 +sl; D1 +i1r i2e i3n +c $8 ^4 +c $8 ^6 +qs(8 +'6 +5 +.Bsh8Z4 +^boBhx27 +Z4s*Q +$z *72 +i26 i34 +i71 i88 +T3 T8 T7 +c $* ^8 +z5 z2 +T0 T7 T2 T8 +c $* ^2 +$. $s $t +x6AT4+3 +c $? $8 +R1 -3 +c $? $? +$7 +0 t +$N D4 +c $? $5 +*40^s +c $^ $2 +i76 i87 +c $, $6 +x14*29 +s70 Z2 +c $1 $2 $3 $] +$4 ^8 +c ^4 $5 +i7u i8t +c ^4 $0 +s/s +c $@ ^3 +l ^i ^l ^e ^h +s/- +z3 *15 +i0( x0A +c $1 $] +c $1 $^ +l $. $v $n +i4o i5n i6d +^@ x54 +c ^_ ^7 +Z2 z1 x25 +c $1 $< +c $# ^3 +i3k i4e i5n +T5 i6Y +$5 [ *20 +z2 K -2 +scj T2 +^9 ^@ +c $2 ^8 +c o8$ +i01 Z2 +c $/ $7 +y3 x18 d +o1I T4 +i5rL8*19 +Z2 x72 +o6zlY1 +f x16 +i3k i4e i5t +c $5 ^7 +c $5 ^4 +*70spr +^t ^a ^h +i3n i4g i5e +sib Z1 +c $% $6 +Y1p5.9 +DBx12 +y2 o5c +i3s i4a i5n +o0[ x23 +^7 ^& +*A7 ,9 x45 +c $% $0 +*25 z2 +i6a i7n i82 +$x ^b +li44 +*70y2 +sxs ++8 o6B ++4 -1 Z2 +*9A^8sXT +-5y4 +x04f +L6 D5 +z4x46 +{y1i5n +c $4 $_ +^4 ^# +{ +B +i6a i7n i8t +c $4 $& +c $4 $# +c x92 +i9o iA2 +i11 i1d +$0 st1 +c $4 $+ +i15 i3d +L5 i6g +T2 TA T4 +$&K +c ^8 $4 +*3A i7! x4B +i2e i3m i4a +i5n i6d i7o +^3 c +o7bs[h*34 +*A3*98 +$# x61 +T0 T5 T8 T1 +T2 TA T3 +c ^3 $# +sml k +r]i9w +$3 ^_ +x27Z3 +c $$ $6 +c ^3 $@ +^3 ^# +^3 ^! +c o3! +z3 o0f +L8s*P*39 +c ^2 ^! +x61d +^0 ^@ +]$C +-0 u z1 +c ^1 ^* +^% ^1 +i2e i3g +Y5x71 +c $3 $/ +*59 x25 +*59 x27 +$i r +i0n c +^& ^9 +sgOq +i4n r +D9oBc +c o1! +l +A x45 +c ^2 $* +x81 d D5 +c o16 +x76s6q$< +c o17 +i5l i6l i7e +^. ^9 +r *45 +x03 x34 ^d +$u $8 +i3- .2 +i2i *68 +^- ^7 +^5 ^! +*27 x45 +sAN +t $T *76 +^5 ^@ +$7 ^_ +*19 x08 -4 +Z1sE"-0 +Z3 c x85 +^* ^5 +o7Os7T +$i t +x51 *98 +^[ ^1 +*26 D2 Z2 +i0]sZ$x69 +i86 i91 +.9x76 +x91xB5 +o3t x47 +c $2 $& +i90 iA0 +x24xB6 +sYR.8 +*14ux8B +i51 x04 +^){ +[ p2 +c $4 ^5 +L2 x02 +$u *51 +$9 ^# +}$` +$9 ^. +i1a i2k i3u +i7i i8c i9k +c $; $1 +$)x83 +^3 -5 +R5 x04 [ +q$sxA6 +i75 i1f +^1 ^< +*85 i7e +^6 ^% +Y1-0+5 +T5 { +i51 i14 +c $, $8 +f ,4 +T0 T9 TB +x53o9, +c $, $7 +x78 x81 +sgj p3 *3A +c ^* $8 +x25 x23 +$_ ^9 +sAX^PsPK +}T6 +c ^5 $4 +i76 +9 +i4o i5y +i2t i3r i4i +slx ^i +Y1iBY-4 +c ^5 $! +x53 k +iAjiA3xB7 +l ^d ^d ^a +ki2s +$i .4 +c $( $9 +c ^8 $2 +sgj [ +$3 ^* +l $e $t $t $e +$3 ^. +$3 ^5 +$3 ^= +i7d i33 +i6o i7l i81 +$g x48 +^Vx67 +x46 ^R +^1 x76 +$G -0 c +*A7k +x24f +rKT9 +$x D5 t +z2 o2g x35 +*43 R3 +-2 sna +x74 o4o +r $a $s $e ++5 [ .3 +*24 *14 +c $+ $+ +sn4 +sn0 ++3 ] y3 +T9*62 +$7 ^. +*32 Z2 +T1 T7 T8 T2 +x04 Z4 +$h o4c +$7 ^$ +$0 ^9 +$0 ^( +D1$oxA7 +o5e *37 +xB8 Y2 +R4f +i9y iAe iBr +ci4OR0 +$! ^8 +x96Y5 +i8r i9d iA1 +$- ^5 +x5A*B5 +c $7 ^@ +^$ ^4 +i5a i6n i7t +$4 x81 D7 +T3 L3 '6 ++1 r +-5 $? +o3s C +$* ^2 +,1x21 +$* ^0 +TAs=!$< +Z1 ssu *56 +T1 t +D9 +3 +c ^# $0 +c $5 $= +c ^4 $8 +T1 x54 ++6,A*01 +x41 z2 +*95i0n +s-\.3 +c $5 $- +c ^@ $0 +c ^@ $4 +x46 -2 +$(s8U +x15x68shQ +$@ ^8 +sV7D9 +$@ ^5 +$@ ^0 +Z1 $m x46 +i44 L6 *54 +'7sb)D8 +sz|i21 +$4 ^- +s0$*0B +^@ ^7 +l ^t ^u ^o +$3 Z4 +^dsB[iBH +x73 s23 +$? ^6 +-B ,8 +r$i*B1 +oBi [ +i0v z1 +$8 ^- +x82 x06 +i3s i4i i5e +x91xA3x83 +*A4*41 +x5B [ +f xB4 +Y3*61 +T0 T3 T6 T5 +c ^- ^4 +-6s+{D2 +Y3x6B$v +c ^8 $* +$. $t $t +$~ ^~ +x42*96.2 +x94 x13 +l x23 z2 +^3 ^4 ^9 ^1 ^1 +$7 x26 +x35 [ $' +i6g i7h i8t +$ *57 +c -1 +o4z { l +x35 +0 T2 +i3b i10 +c ^7 $5 +s*y^W +i6;x53] +z2 -2 K +x01 ^z d +i19 K +^{ x0B +x13D1Z2 +T1 T6 T5 T4 +] $F +$0 $4 $0 $5 +$5 -1 +,5 *92 +c sex +x41 t +t x81 o5T +x36 ^z ++9 svg +i7c$h +-6 i6f +i24 -1 +i02 ] d +Y1 o1m +] ,2 z1 +-7 *40 +^-x86 +]^Z +x45scw ++A *34 +i4l i5i i6f +x92 x35 +x13 ^9 +C i27 +i1p i2e +z2 D1 +Z1 f x38 +x27 q +*25 *74 +^m*98k +R8 x25 $3 +r +9 +x52 ^$ +smRi9K +o1n { +spu +sJt +'5q.6 +x14 ^i +iBEx76 +z1 o3x +$k ^w +i4o i5l i6a +D7 *30 +t *04 K +*82 *84 +i4o i5m i6a +*51 x69 +s8q Z1 +R1 Y2 +'8cy4 +o7g*36^% +^@i9' ++4 *92 +i11 i29 i39 i40 +c i24 T3 ++3 o0$ +*12*30 +*50 o34 +*87.B +*42LA +{ *30 +] $c *28 ++7 y1 +i2n p1 x4A +slJ-7 +,5 Y2 +r x04 +R0 ,7 s)N +R8 x31 +o0Y x43 +t R1 +i16 i1d +o31TA +D6 -6 ^5 +D2x6A^W +x76*58o5c +o69 $n +C K +i5a i6r i7i +x67i1ws+} +,6 ^g +*70 *05 +s9o*7B +*32 $9 +i4o i5c i6k +sMB } +o5v ] x82 +x51 l +i21 i39 i46 i53 +^B c +o42 i50 i61 +$6 $m +i7l i8i i9f +sRA +$R T6 +*85 Z1 +-9 -6 Z1 +syg +p3sGS +s68 x12 +l o7T +.2-8 +-0 i57 t +*83 x92 +l $T +o7=] +o1I ] +x84 x58 +x84x49x67 +u sGu +xB1 $9 o2a +s1T +x71 Y4 +Y4 x16 ++5 *29 +*50 x18 +Z5 Y4 +i31 K +z1 sot +i20 -3 +i0( +6 +D2 z2 x43 +]*A1iA2 +.5 ^1 +T1 T4 T5 T6 +^l ^i ^a ^j +*07 x71 +o1I x61 +o92 Z2 +T1 T6 T8 T2 +i11 i29 i37 i43 ++8 *82 +D3 ^i +T1 T6 T2 T8 +u i5! +u i2S +*10 s37 +o2}$? +seo s25 +o5! .1 +i1l $6 +T1 T7 T9 T8 +*6Bs)D +-7 sla +t o0H +T0 T8 T3 T6 +x6B^* +i4mo1Ys$3 +c i1W +$* z1 +$. $a $z +T0 T8 T3 T1 ++6 y2 +xBAxBA-A +Y1 ^y +^7 z1 t +*68 K +i7b i18 +i1i i2k i3i +*46 $E +i2p i3e i4r +^y l +7 +*23 z1 +*9Ai7T +*53 t +$= Z1 +x34 .1 d +*73 +0 +T3 T4 T7 T6 +]s4;$q +x03x9B*20 +^6 t +i1d Z1 +*93 k +o81 ,5 +d i5, +'9 i4r +T1 T7 T8 T9 +.3x29 +x71f +i1e i2f +u xB3 +T1 T6 T7 T2 +q x07 +s(J] +^i *02 +^M ^W +x52 { +d i5r +oA] +sTY k +$) q +*89 o1e +s2m +*15 p1 +[x81 +} *75 D3 +K D4 +t *30 *76 +R0 s)N ,7 +x67 $. +sfo +*20 x54 $t +*92 -4 +D1 *10 Z2 +fz5 +k *05 +o04.A +y4 x4A +o1m L2 +y2 x4A +o5v x82 ] +$i $c $e $s ++6 D3 +c o94 +D9 T3 +*81 ] +ls!Wz1 +c o07 +'Bs$< +-1 ^5 +x8AT9 +T7 T8 TB ++5 ,4 +y2 Y2 +$e x52 +o1m u +st% +p2 x94 { +sxr +sqn +oAO,1oBt +i1s i2d +*43 ^y +*82 l +,0*97R4 +i8e i91 iA0 +xB2 x97 +o9i *32 +}$D} +saG +x67 o6m l +x45 Z4 +*20 $t x54 +Y1 ,3 +x27 ^h +z2 x35 o2g +K $5 p5 +x53 ] +D3 -7 +i7c i1c +i4t i5i i6n +x93x4B-2 +y2 *B8 x82 +i56 i10 +-4 ^4 D4 +T8DA} +x59Y2 +sdc -0 +i0V E +cuY4 +x17 y5 x52 +*31^@ +iBK +*94 x61 +,5 *15 *23 +slwx35 +.0s\Qs[Z +D8 *52 +*79i1v +DAL8 +x68 p4 *A6 +o41 i59 i67 +i5d x72 +l ^n ^u ^g +i77 i38 +i4j K +s4y +xB2xA2l +p5 o0Q +K oA0 -9 +,5 *23 *15 +x49i48 +t ,6 +.6 *10 +Z1 i5p +x31 *16 *26 +-6 ^# +,6 *06 +$- *17 +*63 t +R3 -4 o26 +$t *28 +xA1 D9 +i3n Z1 +$L $9 +s8j +$4 o1l +x64 Z3 +D5 *76 .5 +o7/*98x75 +ssd ,7 +*64 sSN +$e p1 +*58 +7 +i3i i4s i5t +*65 *12 +l -9 +R9 -9 +$6 i7g +l $. $p $m +i7n i81 i91 +'A i7u +t x07 +Z2 o2d +i3b*68R9 +oB=s6x +D0 *06 +p1 z2 x25 +x15 x41 +sp2 +suh K ++4 .8 x52 +,3 k +x1By5 +*60 x62 +sD. +^m*42sj. +x43 D4 +*87 .4 +D7 i8* +*03 -8 +x15 l o5x +*12 *48 +,9 srv +^^*A4 +s^#x34x2A +i61 i79 i89 +] s94 +i71 i89 i98 +Z2 x14 ^u +,2 x61 +*63 smp ++1 Z2 +Z1 i5= +s7* +scL T8 +] i1m +i3p i4l +T8^Z*85 +o0n t +xB1 o2a $9 +*61 x02 +o32 *49 +*76 i40 +t ^Z +$z sry ++8[ +*53 Z4 x46 +sgl l +s0- +6 +si1 se3 u +^w*4B +-6 x32 +o0n o7X +*24 ] p1 +o9;i2M +[ D6 +x3Bsf( +i41 i66 o78 +*73 '8 +*34 *73 +[ *26 +t *76 *30 +K -9 oA0 +l i75 +i1a i2h i3a +r $$ +s3uxA8l +*03 T8 *70 +s^$x05z3 +k x15 t +*53 +A +i1e i2i +*13 o7v +i9s?Tx14 +} s0A +-1 Y2 +D7 Y4 +i68 *54 +*35 *72 c +$0 ^r +,9 T2 +sEdo3h +t+3sXh +*32[ +iB8 *AB +l ^s ^i ^d +,6x81svT +x23 .6 +x81 *98 +x81 -5 +*01+2 +Z3 x69 +l ^- ^n ^o ^n +[ *34 +iBM x63 +svs +x21[x1A +i9< s2T o9t +^8 x53 +x19 ^S +sly o0L +x21 *89 +^* +8 +i3c i19 +] scC +^Bt +i4y i5b +T3 T6 T7 T8 +s5Q +s5? +$# *45 -7 +z5iB2 +lz5 +.0 D5 +x26 ^b +$a D6 +*45 ^1 +*50 $b +x73 o6+ +i3b i15 +x82 o01 +kp3 +^5 x41 +r $h $o $o $d +T3 T6 T7 T4 +'8 ^N +Z3 *01 +*58 .6 +$. $l $u +c i6i K +x0A ^l *21 +sfP +*09p1r +l y2 +x05 x81 +x04 $- +^p*A2 +x04 Y2 y2 +x46 $r +o6PR8 +c +9 xB2 +x24 p1 +$U { +o4Rtl +x56 Z2 +o4@*A8 +*A3 x36 y2 +o1Ix94 +i8s i91 iA0 +i8s i91 iA3 +c si! sl1 +$. $> +$2 $2 $4 $1 +LAi6q +$. $l $a +$= x05 +x43 z1 +-8 +A +o5z *47 +{ iB! +i07 i17 +z1 C o1f +Y3 o0E +suI [ +i17 i7f +i8n i9y +x13 i9A +T1 T4 T6 T5 +x21 k R0 +R1 o07 +$i d +r -2 ^k +i8n i9c ++3 '7 +x6Ao8;*6A +*A0x9Bi43 +i61 x78 +*53s|>s]i +D5 ,2 +*25 o5x +t sBv +T4 } +z4 x93 D4 +x64 *81 +.3 *14 K +i11 i29 i37 i46 +i7k Y1 +Z1 Z1 +i4s i5h i6a +-3 ^$ +*A8 x71 +'B*31s;T +$w i2d +y2 o2t +-0 t i57 +R7 o3y +snP +D6 *43 +x14 $m +o6l y2 +z3 [ { +oBK c T9 +snZK +i8t i9a iA1 +$q.BiA? +i6E x52 x13 +o6V p4 +o7- } +fx65$2 +i8x xA1 +p1 +5 +u Y1 +D3 x38 +l ^l ^i ^a ^j +R0l +sblx98*26 +x85sfui5# +x43 q +-A TA +*8AsKj$g +*24 i3a $p +i8lTB +k $Z +i55 i69 +x37xB3i6M +x73 x84 +r stp +{ Z1 *26 +t i3G +} i7X x54 +s94 l i75 +o4y z2 +z1 *64 +c T4 T8 +i2Q *20 +p4 x86 $- +u -5 +*74$?x56 +u -8 +D5 o5z +-4 i7! +$2 x42 x16 +o95 ,7 +sBf+4+5 +i21 i39 i46 i55 +x54 i8i +*54*10 +*51x71 +*51xABo0K +y3 u { +T0 T8 T7 T2 +'6 ^G +$p *15 +^n ^a ^m ^m ^a +s.A +'7d +$Y k r +Y3t +i0r t +^8 l +z3 o1c +z1 Y2 x09 +$b *94 +stY +x84 -5 +$* D3 +*30*3A +us`/ +$. $k $r +x3B *16 -3 +k R3 +-2 c *75 +T0 *13 +l $i $l $y +i76.1xA7 +o0g z2 +Y4 x37 $a +}Z2x71 +x26 *54 +t}*08 +} s1d +*30 ^3 +R6 x76 +s_3-Ap1 +K x62 i6& +z2 ^y +$7 $5 $! +i7a i8d i91 +x67 c x41 +i6l i7l i82 +*07 } +$j x02 +*32 i7m +{ -5 s)8 +[i6m +u x21 k +xA9^i +$. $c $c +z4 x85 f +R6 D2 +i3g T6 +s6^ +*45 Y1 +s72 o0a +x92 o76 +^O -6 +Z1 o4n +Z4 x36 +sjRo0I +sa3 x15 +Y4x5A +*21*7B*73 +i4r i5o i6c +xAB*20D1 +xB5 k +r $a $n $e +Z1 o48 +x42 $v +i04 i13 +k Z2 +2 +R7 i75 +su\ +^0 Z1 } +*96 x83 +r ^@ +r ^g +o5G y5 +r ^3 +o6B *25 +DAo4a +l ^l ^i ^a ^s +i7n i8o +z2 x54 y1 +*52 ^b +*51 ^W +$/Y4sCZ +i42 ^z +i1f i10 +,0i6hx6A +D4 T1 +i7O Y4 x8B +i2r i3o i4l +,0x52 +[ L6 +xA2 T5 +'5 y3 o6. +l ^l ^i ^a ^r +x18 Z3 ++8 x53 p1 +i3c Z1 +i7n i82 +$B $B +D1x3Bx65 +$B $C +s\*T1o2? +.8 .9 +i92 iA4 +i3h t +t i1M +i5_ *97 +o6a ,5 +saN ++4 Y3 +.3Y2 +-7 *67 ,9 +d x62 K +$, $< +x67 x41 c +x68 Z1 +$, $- +x32s}y +R6x65 +o36 ^j +r -5 +Z1 ^r x32 +DB x41 +*46 } '6 +x16 l +T2 T3 TA +l $s $i $s +t i0S +t i0h +u o14 +o4X Z2 +t r k +o7I c ] +Y5s+Xt +$? .3 +Z2 s0G +l $. $l $u +k *18 +i7a i82 +i0c i1r i2a +o4y -7 +K *76 +o7M x03 +Y2 x57 +} *40 +z2 ^W +K L7 +x64$lx63 +$f *34 +$? *87 +xA1 K +LA x82 +*A9,Bo2e +syZ$? +i8o i9n iA1 ++4 d +$9 $2 $6 $3 +l f sns +Z1 i1j +i2o i3k i4i +svq +c -9 scD +x41x09 +s8a T6 +sb8 u +*63 *47 o2c +c *51 Y1 +^/ '8 +x83 +0 +$h T6 +*49-4*6B +*32*8B +o41 $v +*42*27z4 +$3 i3f +x56x49Y3 +^A ^C +$i x15 Z2 +T1 T3 TA +*1A+0 +x84 ^x +.3 o6@ +$3 i7y +Z2 *17 +*A1 xA8 +-0 xA8 +$o c +$~ $! +T3 T9 T8 +o0r i0c +i6!o6*o3C +$d +9 +c *15 .6 +{ i1x +i4axA6 +x81i79*A9 +^K s5c +t $9 o0F +$_ $? +o60r +x32 d -2 +T3 T9 T7 +Y3i06 +$_ $! +$% c +x56+9D1 +o1x u +$_ $) +*39} +i2d i3e i4r +i52 i18 +{ x05 Z4 +o3xx9Ax23 +*6AsyLD2 +Z2T5i4x +i2p i3l i4e +xB9i1-x13 +Z2 ss5 +T0 T7 T3 TB +i56 R0 L0 +i3u x02 +z2 i5L x36 +i1n i2g +i2o i3c i4o +]s"t +i1d R3 L3 +T2 T4 TA +p3x71siA3 +i2d i3d ++5 *79 +s*9Z5 +i2d i3f +y2 x23 o1X +,3 ^V +Z5.5 +c i0V +^- l +i3a i42 +x52s3^ +] o3W +i0b *57 +z1 *24 +-6s7p +$p $o +i54 T7 +s$;+0 +{ Z4 x05 +s@S +$5 Z1 +x61 $1 c +*60 u x34 +xB9 [ +[ [ $7 +s4_ p4 +sb"lx61 +o6s y1 +x52 ^3 K +-5 E +] +1 +i1k x42 +i9e iAr iB2 +o21 smH +oAtsn@ +R4 D5 i4y +o3` +sK>Z2s=1 +T0 T1 T8 T5 +i2a i3n i4k +T3 T8 T5 T6 +sFr,4 +l $g +y1 -3 -1 +T0 T1 T8 T3 +y1 $@ +$- $? +o0( -7 ++7sNE*48 +x91$k +*2BxA3 +i4i i5l i6l +p4 o1a o2n +o7s $* +sUex71 +o5c $7 +z1x93 +i3g i4l +^P ^4 +x45 $1 +$H x03 c +i3g i4i +*17 i8H +T3 T8 T6 T5 +x07 $. +$E $A +l d 'C +^1 x45 +s4g o2L +x06 { +T0 T5 T3 T6 +x52 i55 +D3 s94 +i1X { +x01 o5L +C i58 +i9h iA1 iB2 +i57 R0 L0 +o4i x01 +L6 +6 +o68 D2 +i39.3*91 +o2- x7B +xB2x91 +i2m i3e i4s +i2m i3e i4r +i9i x54 +} *74 +z1 x07 y3 +i3- s63 +^B D1 s0g +i38 L2 L2 +x13 ^v o18 +i8l i9i iAf +$1 *84 +Z1 o5u +'A iA_ +^s ^a ^b ^b ^a +i3t i4l i5e +xB7x53 +T3 T8 T6 T7 +i3. -3 +o63R7s%A +T3 T7 T5 T8 +i12 L1 R3 +x69-0 +*07 $p +T8 D5 +x43 ^Z +Z3 iB1 +i51 R4 L4 +r x42 +x51 o0s +T2 T3 T9 T4 +D1 y4 +$& ,7 +*65*9B +l ^o ^p ^y ^h +clR2 +i73 +6 ++A $- +o1as(m +i4d i5r ++A $T +-2 Z1 z1 +.8x6B +T3 T7 T5 T9 +o0k p1 +Z1 o75 +-6 Z2 *68 +-9 $= +o1y T5 +$C s8e +^E x06 o01 +o3A *54 +o1r Z1 +L7 *47 +o42 r k +x42 x83 +^7 y1 +i01 i19 i31 i29 +$ +$. $p $e +o8p *84 ++5 $O +x32 o2d +i2k i3k +i37 L3 L2 +x21 o8M t +s^a,7 +*63 E +i11 R3 R2 ++3s=J +x52 $e E +r*8Bs_U +^k $$ +T0 T2 T8 T7 +d x05 D5 +-7 $o +^Q D5 +[ i2A +c } $6 +$r ,8 +i1x z1 +i39 L2 L2 +^9 D7 +l $. $j $m +i53 i65 +^9 D3 +$f Y1 +xB4 TA +y2sk= +] $@ o3h +r ^F +6 +d x51 x12 +$. $b $r +i99 [ Z1 +*54s}a +$p .6 +o1D *21 +i6sx09 +D6 o0g +o0Qs|{ +^f '7 $s +p2 .5 +sZ-'AsJh +x7B$c +i6@ +A ++4 T5 +Y3 x79 o0E +i3m i4i i5n +^B s0g D1 +x21 K Y3 +r $e $t $t $e +T6 $n +sWT +Z1 $d +x21 ] k +Z1 { { +s/R*36+7 +T2 T7 TB +*73Z2 +o7I ] c +x52 K ^3 +D0 x92 [ +i8b [ +i6o i7o i8d +R0 i15 +*A9f*94 +k x71 Z1 +sdW +Y2 x42 +s8S $5 +T1 TA T3 +r *41 +ux96x03 +i9< o9t s2T +sdN +x62x0A*B9 +s2x +$nx94 ++4 +0 +4 +i5- [ +i6e i7y +z1 ^4 +} z2 u +*6B*1A +c o7M +s4@ *65 +*38 p3 +x18Y3 +x31 sbU +o0t x52 +i76 D3 +i8L xA4 +6 +T1 T5 T8 +x52 s7- +x76 Y4 +*01 sdb +$2 i57 +s2a o1f +p1 x3A +T1 T2 T8 T6 +x05 ^# +o0g*96 +x83 Z1 +Z4 x92 ,7 +R6 T7 +x32 y2 y2 +$G i6D +i8L +6 xA4 +ski i4z +$2 x04 +i6o i7y i81 +o65 +1 +^l^e*7A +$u*98 +i72 L4 +x42 i62 +o7F -1 +s-FuD9 +Z2 z1 x73 +.9q +'9s,P +*68 o0C +u^A +i2p i3l +E R3 y3 +x29 ^n +k -4 +R3 L3 +Z2 x54 +i2n i3k i4e +x14 Z3 +x14 Z5 +^r ^a ^e +i9t iAe +i4ix79 +o1u sBm +'8 $N +t $N +T3 i59 +TBx2A'7 +i2p i3h +o1d y1 +T2 TB T7 +o8)$z +i7B Y1 +u oBo +D3 +6 } +o1aY4xB8 +i9e iAs iBt +$5 $4 $* $* +i2Cx13x58 +s3 +$ $/ +l $. $c $c +$ $$ +} R2 +i3f R7 L7 +o77 -6 +i70 R4 L4 +$lp5s3k +T3 T9 T5 T7 +x13i5FE +x19 K +$J.3 +RBi4ei5A +^1 -9 +coBu +x54 $2 +s_ksOixA8 +$@$[ +p1 x5A +i6o i7v +^- i58 o0w +sw{^BZ5 +i9p iAe iBr +*2B x14 +o2W u +i1a R5 L5 +p4 $- x86 +*A7oB$ +l'2,4 +i5e} +$=$" +T0 T3 T8 T1 +$!$; +E${,2 +*43E +$!$_ +$+$< +[ i0m D5 +i9k iAi +$+$\ +] i79 .6 +K +7 +sE4 +T3 T7 T9 +i9w iAe iBr +i15 R2 R3 +Z4 x53 z1 +$}$+ +$}$( +T3 T7 T8 +$}$# +i3a i4l i5d +*45 u +s7J +i2a i3c i4h +*60 x34 u +u i39 +iBfi3NRB +L6x9BsH- +i38 L1 L1 +c$I +$%$/ +*A9 $g +i5d R4 L4 +] ] o2l +i22 $r +i7a R9 L9 ++0 x23 y2 +x42x87 +T6E{ +,4 q +sHci4\ +i19 L1 R3 +x15 o1> +$$ R7 +$x t D5 +o0K o3g +sE5oA^ +$%$= +i3o i4m i5a +Z2c*B8 +i32 i40 i51 +i55 R4 L4 +i56 i68 +*30x08^b +Z1 o3i +c -2 +x45 c +x54 x48 +-2 swc x54 +^@y1 +$u Z2 +x37.6i8Q +u,1x82 +x87$P-3 +o3M K +Y1$+ +T0 o3L +i1e R5 L5 +^b -5 +i5a R6 L6 +^- o0w i58 +y2 x04 ^w +$1$9$9 +o79 c +o5&s,++8 +q x4A +$z Z3 +*02i3y +^8^d +i42 i56 +] s2o K +^9^b +*87 +0 +T1 T2 T6 T8 +p3x52 +$- D1 +i76 L5 +p5f +^0 ^s +iAkz4x5B +i1a R3 R2 +L0 +2 +^x '7 +x82stC +i2a i3c i4e +y1s"ox74 +sm"} +i72 L8 L8 +z3x72 +*18 l +$g $a +x42 o35 +y2+5s[W +r ] ^k +s0U D3 t +i11 i23 +R6 +6 +i11 i21 +xA3$a,1 +T3 T9 T7 T5 +i3e R5 R4 +Y4x71 +Z4 x68 +o1u -0 +i78 R6 +T1 T3 T7 T2 +tx43 +i12 L0 L0 +^1 i21 +x23 $! l +l$1 +i3^k +^4^f +i73 R1 L1 +ssx Z1 +i16 L1 R2 +L3TA +i4n i5c +i16 L1 R5 +xA7*30Z1 +$0$4$5 +-8 .7 +$0$4$6 +$0$4$8 +y5x1Bi7n +D2x24x26 +$f ^q +i19 R2 L1 +l ^i ^p ^e +*70K +i38 R2 L2 +T0 T3 T8 T6 +i8a i9m +o9} +s-* +Z2 *45 +i8a i9c +i36 i48 +z1 *06 +sRf[^& +*93rx85 +$+ i2- x24 +i9^ +R0 ^9 +i19 R5 L1 +*A3sP7s!l +R0 ^4 +i29 i34 +^r $b +i8a i92 +*56 xB2 +x04 i22 +T3srh +z1 o1r +^Ey5 +^2^e +Y2 i8v +x24 Y2 y2 ++0 s4k +i6i $6 +-9Z3 +i34 R1 R2 +L0T7x3B +$2$2$1 +i16 R5 L1 +i72 L7 +i35 R2 +i2s i3h i4a +o6s $1 +p4x08^W +D1 ] +$. $q $a +rx69sqH +x36 $2 +i70 R3 L3 +i2i i3e i4n +Z1 x42 .3 +$+ E +r ^k ] +k D2 ^k +o44 $0 k +sEl +{ i3w ^p +q*62x58 +oA,^Z*07 +^s T5 +x28o5Zo1I +sC%sDu +$2 c +x18$s +i8f i9e +z1 x52 Z1 +.Al +i0h ^s +i0{ +z1 x68 +,1z5 +l$Au +i70 R6 +siXsKa +z5'8 +x03 i4m +sf-s7[ +*A1i8f +x05 $D +-9 ^5 x64 +i19 R3 L1 +sWnxBA +i41 i50 i61 +*32o9vs^E +sm5 +i35 i43 +i4i i5t i6a +i50 ,6 +[ o2W C +i19 L1 R5 +x14 y2 +x61 ] Y2 +L9x85 +*85s8H +i3z r +'4i3Y*87 +i9z iA1 +o6i [ +*15 i3u k +sfcz1 +i1m i2o +^n ^i ^m +$0$3$6 +$0$3$2 +^. -1 +t i6O +svwp5 +i4*s_W*B7 +o18 *31 +x52 ^1 +Erx49 +'5 *14 *20 +T2 T9 T4 T3 +i3p i4l i5e +*48'7*05 +]o1_ +*70 +9 +i8f] +xA6li1+ +i11 R2 R3 +i2m i3i i4l +y3s9Bt +i3b R7 L7 +o6t } +s.q +C^n +s9I*50 +i3n i4a i5n +i15 R3 R2 +sZl +u ^1 ^8 ^9 ^1 +*B0i4q +se4 Z1 x31 +i2s i3t i4o +i9s iAs +y3y1*BA +o2g { +^1^d +*14 *27 ] +*89-B +^ } +i16 R2 L1 +ro3z +Z1 i0k +sM^^} +o4Os6$*67 +xA3,8 +$2 $o +x65 D0 +i32 L1 L1 +^I*78x08 +$0$6$3 +^7^a +Y2 y3 x8A +'7 sat +i72 i86 +Z2 o73 +oAz c +o2u d +i1( +z5*24 +x25*3A +l ^e ^d ^i ^s +^\ o69 x04 +ciA- +o1F $1 +i2,-1 +*7A$[xBA +i77 R4 L4 +se1^k$w +s=D.4*98 +o0o q x26 +$# x71 +^o,2+A +DB x15 +.Bs*H +*83x54 +y1s_Z +y2x78 +sDLs)q*38 +R7 x81 +$0$8$8 +$0$8$5 +$0$8$7 +i9i iAa iBn +x48*28 +$Gx12 +p2 u x39 +T1 T5 T4 T6 +*69l ++9-5 +sr%s o +spX*6B +u ^7 ^9 +u ^7 ^2 +T3 T5 T9 T7 +Ez4s!o +Z4.7D4 +$@x5B*AB +i6m i8n i7a +i36 L2 L2 +i2 u +D0 +1 +o5ro3Y +i3i i4l i5l ++C-B ++A-6 +$a p1 +x02 $9 o4h +i6d i7r i8a +i3a i4n i5n +sA?st2xBA +se`*75 +i1b R8 L8 +$K D0 +i5t [ Z1 +*2BsPk +$4 r +i54 i19 +i32 i7b +$i $e $s $t +$l{ +i6g u +x62 ^u l +^U k +l ^c ^c ^a +T3 T7 T6 T8 +$?$- +u ^0 ^3 +i1c i3f +$ +0 +o1; l +oBy x38 +i31 i16 +i35 i1d +c spv +sicT5 +i12 i1b +^a^8 +sY+ +i74 L7 +^F } +x27 $3 +^IY1 +i0BCse) +l ^k ^n ^i +i31 i7f +$>$! +i54 i1b +i8W D1 x27 +i5f i59 +i1f i5b +i1b i38 +*16 snp +i22i30i41i53 +T0 T2 T1 T9 +u ^d ^3 +$q $u $e $e $n +i7f i52 +i0p*40c +i1a R4 +c $8 $D +sfY +sRXi6< +sRW^p +o5p Z1 } +i7g i8h i9t +*4Bx25 +u ^3 ^0 +i11 i7b +i10 i5b +i17 R2 +*85l +csnP +o0t o1e o2s +i19 i73 +Z5x51*0B +D0x48q +x85{ +x06z1 +i14 i3a +u ^d ^d +i30 i14 +u ^D ^E +'AsgO +i2a i3r i4i +i7b i1b +i37 i45 i53 +i14 L1 R2 +.2]z2 +i5d i14 +$8 d ] +i5d i10 +T1 ^x +D8$d$i +i1b R0 L0 +i2a i3r i4t +i7d i53 +Z3+5z4 +R3snu +$c{-A +i1c R0 +i31 i5c +i31 i5b +i12i20i32i40 +$1 d D4 +stbx69 +i59 i18 +i5d R7 L7 +i33 i18 +sor { +i8t i9h iA1 +i21i39i46i50 +usqrL7 +i5d i11 +i51i69i77i85 +*A5x26s$# +$;$, +f z2 x2A +}i8- +i32 i7f +i58 i5b +]o1j$+ +i1e i10 +i74 L5 ++6$O +T3 T9 T4 T6 +i35 i1c +*7Ay3'9 +sryz3 +T0 T6 T3 T5 +i3o i4m i5e +^I *03 +o0 cc +i14 i72 +i5a L4 +i19 i53 +sX.^3,8 +u ^A ^C +T0 T6 T3 T8 +T0 T7 TB T3 +i5a i35 +*48t^I +Z2ko41 +i1u i2p i3e +i38 i14 +i59 i12 +i9i iAc +c $A $0 +o5u p1 +i77 R4 +i76 R3 L3 +-4iB? +^J '7 +i34 R2 R1 +i14 R6 L1 +i5f i12 +i18 i20 +i0j i1o i2r +o1l d +i9i iA1 +u ^f ^2 +x75 *57 +i4l i5u +T0 T8 T5 T1 +i32 L2 L2 +i3c R8 L8 +i1a R2 R3 +i12 R3 L1 +o05 '8 +$[$; +i1a i19 +K -7 +sez +5 +i14 L1 R6 +i11i29i37i49 +L6 x72 +i1a i57 +i7b i5d +i51 R4 +i37 L2 L3 +i38 i5d +u ^a ^b +*3BR1 +i7b i55 +sY=*72 +c ^E ^E +i18 i23 +T1 T7 T6 T2 +i7e i55 +sRWsvU +*14 Z2 +D7sdxz5 +i18 i56 +i7o i8l +z2 +0 r +}Z5 +u ^a ^6 +u ^a ^5 +z1y2x63 +u ^b ^e +c $) $2 +z1y3*56 +*7B^< +x83$BD1 +*48s|b +^a^5 +x24xA5$S +s@is^0 +u ^b ^3 +c ^B ^F +u ^e ^e +i76 R2 L2 +$5 x71 +i4@Z3x87 +i7c i57 +x59 E +D9 Z3 +i1e i2o i3n +T0 TB T9 +i3e R4 R5 +y2lr +i30 i5d +i74 i1c +i39 i7e +i5i t +*83*96 +i1b R2 L2 +T0 TB T7 +i6i i7f i8e +i58 i5f +K i04 +T2 o1A +s#B +i79 i31 +i1f i70 +x15 ^n +sX{ +z3 { +T0 T3 T1 T8 +i4e Y1 +DB ^E +sL_ +*03 *70 T8 +s#= +*52sBw,9 +*05{ +$B $8 +o0f Z3 +^4 ^x +i33 i1c +$$$/ +s39 ^4 +y1 *40 +t -7 x03 +o7]x78 +sQ| +i39 i5c +{ i14 +i5_ u +i58 i33 +i6{ +c ^5 ^b +i18 i1b +c ^e ^e +D2 x84 +sa$ +$t $e $r $r $y +x38 o3f +i34 i5b +i3c i12 +^3^2^0^2 +Z2 Z5 +] o6= +u $C $C +^e^7 +T1 T2 T7 T3 +i18 i3e +r $s $i $s +C o1o +Z2 *05 +D9 Y3 +i54 i5f +i16 i1e +sDp +i77 i32 +C o1i +o3<.A +i11i29i38i49 +u ^A ^A +oB$iBB +i5b i37 +i56 i15 +$C $E +c $6 $5 $3 $7 +T1 T2 T7 T6 +i57 i18 +i7e i52 +k^d +Z5p4spP +T1 T2 T8 T7 +c ^C ^A +x0A f +T0 T8 T1 T5 +i17 i58 +E -A +^x t +$a $p $p $l $e +i58 i17 +p4 so7 +i54 i30 +$|$? +x0B ^_ +i14 i75 +sP"z5 +T0 T8 T1 T3 +sst [ +i7f i73 +i5d i59 +C $I +c ^c ^F +.4 Y1 stk +s#GLA +i30 i5e +x19 c +i7d i32 +i35 i3c +*47x68 +u $F $E +sh# +x35 *65 +i7b i3a +s 7 +x92s]"o2Z +s#7sX- +*53 p1 +L7 L7 +x31 R6 +x86 c +T1 T5 T6 T4 +u ^8 ^8 +T0 T2 T7 T8 +u ^8 ^6 +^f ] +i52 i7d +s s +i1c i18 +i11i29i39i44 +c x04 -5 +i7e i36 +l sns f +x75 D3 sck +*3B$} +x94.5i5X +i3a i15 +i11 i5d +i3_ x37 +i7e i54 +sp6o6\ +i11 i5e +K o6m +^/KsV( +i9b iAe +-7 ,9 *67 +y2 *10 $f +snr *21 +sOr +u $A $C +z1] +x72 } +x01 xA1 +T0 T6 T5 T3 +i0` y1 +T3 T7 T8 T6 +*24y5*46 +T1 T7 T3 T2 +[ srs +$9 D2 +s@0i8p +u ^6 ^5 +Z5 ] +sRL,8{ +C +6 +sz! +x2A*46 +f x29 +$X x62 +.2^d +s24i9TC +sJaT8*38 +^.Y3s>H +i5+DB*54 +i8_ t +sia Z2 +szh +^%s[A +Z1 syh +s#n +x45o4gi6- ++0 o1u +^k ^i ^r ^e +i7)lx3B +d $@ x27 +Z3 .3 +,6u +x82z1x15 +o4a smZ o64 +x81 Y3 +$m s1m +x28se\ +^d ^o ^o ^l ^b +s!z +DBz4sh. +i1!*5B +i2w i3a +^-} +u ^5 ^8 +sEy +^a ^h ^a ^h +iBNE +l *60 +u ^5 ^7 +sBk +u ^5 ^2 +u ^5 ^3 +y3 xA4 +i0= E +^n ^a ^a ^m +$P D5 +s?!*67i4T +^G r +u ^2 ^f +u ^1 ^5 +i1c i2e +i1c i2a +seCL6s-x +c i10 T2 +Y2 o8w +^l ^r ^a ^k +i3i Z1 +$' xAB +z1uk +z2l +^y ^g ^g ^i ^z +i78 i31 +*5A^`*85 +^C ^0 +c $b $e +x63 d +*08L3oAD +Z1$C +*31 'A +i87 i97 +o4a o64 smZ +$7 x23 +s_W +Y1 *04 +o3=*09 +x31$; +x25 -5 +^6^2^0^2 +-9^` +*16 *70 +x72 z1 +[ s0p +o1e ^n +T0o2; +p4*47 +c $2 $0 $3 $8 +x24 o49 +*97 o9o +ls-e +^a ^i ^r ^a ^m +i3c i57 +T0 T9 T2 T1 +i6o i7n i82 +^r ^e ^t ^t ^o +c $D $4 +i61i79i87i97 +x41*68x38 +^n ^i ^a ^r +D7 sem +xABiA; +p3 sDx *68 +*17 *60 +^y ^n ^o ^t ++5 ] $9 +Z1 [ q +^>x3A +x75z1 +K z2 +x75z4 +p2 x18 *51 +sUhxA8$( +t^(s|O +$j t +^y ^l ^l ^i ^b +Z4^7 +i3c i4e i5l +i27 i39 +x45{^x +sr, +x53t$h +*70s9FD4 +i58 i5c +^l ^i ^v ^e +^h ^a ^l ^l ^a +R3 o5m +L0ck +f x29 +0 +r $i $s $t +D0 ^" +x37 f +x58 +5 ++1Y3 +d o5j +*0A x23 +p5 Y5 +p3 su1 xA1 +p5o2E +$g ^3 +f D5 +x23 L4 +^}s^x3B +sLy +t i2P +.A$;o15 +$d $o $d $o +i4l} +$h $e $l $l $o +$s $h $i $t +u $1 $9 $6 $9 +s,_ +$2 R3 +$j $e $n $n $i +x04 ^p +o1U*58Y1 +$f $a $l $l $s +c si1 $! +$p $a $w $e $l ++8 -4 -0 +$d $o $u $g +sSsx47 +i1c i39 +$s $a $u $c $e +o7]iA# +l ^2 ^9 ^9 ^1 +s+g +i1c i35 +^6 o3a +i28 i33 +s8, +z2 l x52 +x49sZ+ +$2 $0 $3 $2 +$b $e $l $l $e +s5-s}li8( +^a *97 +$p $i $o +$4 o5d +$k $a $r $m $a +x83i1' +sjC +o7q *67 +$/.1 +sL! +$w $o $o $d $y +} u z2 +s1ps^.+3 +s9-*58 +$l f x68 +*2BK +szfs6MK +o8Z D6 +^R *18 +c $1 $3 $9 $! +$j ^2 +x07sl*+3 +*32 y4 +y5x02sT+ +o6s ] +i36 i3c +,3 ^p t +T0 T6 T7 T8 T9 +T0 T4 T7 T6 T5 +*31 ,7 ^D +o4qo2asX4 +y2 o91 +q *62 x58 +Y2 *04 +o8es[p +$u *02 +z1 l o2g +x7Ako9@ +^t ^s ^o ^l +o62 $1 +o4m .3 ] +uZ4 +-5 o6= +sjO p3 +i1a i2o +p4 sao +LBsG3s.A +z1 x28 -1 +sz6 +^7 $T +*92 x26 $v +$f *25 +s=1 +CoAX$8 +R1 K +*56 ^j +sik D9 +$R x0B p3 +$ *57 +$s ^[ +o2i k +o9| +*50u[ +i67 Z1 +li1R*3A +{ K ^d +'8 *14 +o1F ^1 +s.Dux62 ++5 ^j +i61 *25 +*A9*B1r +T1 T8 T9 TA +xA2i44 +i9Fl'9 +$9 o2a +o77 l -1 +i62i70i82i93 +i06 i19 +$A x98 +T0 T8 T7 T9 T6 +-6 i74 +^n ^a ^n ^o ^c +^oso" +-2 Z2 +sP$ +R2sw@ +y2 *45 +p1 o6d +o77 *20 +[ R0 +sOa +s1r +x92 C +T0 T6 T7 T4 T5 +R6 C +i5e i62 +D6sFl +o7g u +$e ^p +T5 T9 T7 T8 +spt Y2 x72 +*27*56 +$1 -0 +iBCl +s1M z1 +i8e i9s iAt +^CZ1{ ++1 d u +c $i $v $e +i2o i3w +i5Iu +*51sO? +u i2' +D3i7w +i3e i16 +T1 T8 T9 T6 ++8 +E +l ^l ^a ^o ^c +,7 D1 +D6 *01 +^H u +p4 '8 k +q x59 +sec r +x32 Z4 Z2 +i2o i3v +i5joB< +x72 y3 +xAB-0RA +*64 '8 +d x92 +y2x01 +*81E +o8Mx12 +T1 T4 T7 T3 +r *42 *53 +s4c'7 +i3c R0 +i3 -7 +i8l i91 +i3d i5g i4o +D4 o7@ o6i +.7x92f ++0sjd +{ *02 +l s6p +*35 i5l +D5u +*41 ^2 ^k +s1^ +Y2 szM +[ Y5 +'4 $o +r x28 p3 +stw } ++6 o73 +T3 T7 T5 T4 +*40y2 +x15 Y3 +i52 k +s2e i86 +u i2D +y3 $m +sK`x37i1q +*32 *40 +o1i o2n ++9+D +so+ D4 +T1 T5 T6 T7 +'7 sdr +$4 x83 +-5 [ d +^s o1p +Z2 R9 +*9B+0 +i5e i61 +*21 d +*53 ^m +-7$^*6A +i49 i59 i67 +^t o1o +^e x57 +Y5 *69 x76 +u $P +{ ^Y +{ ^P +[ *83 +i2< +x45 ^L +c r z1 +[*3B*B1 +l $7 $4 $1 +tT1o4t +z1 o91 +^i ^k ^u ^y +[ ] o27 +c $3 $6 $5 $! ++4 -D +$. $t $h +} Y4 E +sGL +l x43 K +-0 x74 +s }s4a-6 +i60 x02 +D5 ^t $e +o7k *63 +s01 *31 +c d 'E +x72 [ *32 +'3 R0 +x76,6s91 +x09 $1 +o4J*3A +Z1 f +ro4i +o4osqE +d x93 +*45,0x08 +$! $* +,8 x15 +'8 z4 +] o1j $+ +^$ $9 +T4 Z4 +c -1 x62 +^csh7 +*31siZY2 +]x76z4 +^f x72 Y2 +i12 *61 +p4spk +^f ^a ^e ^l +*15 $d +Z3 x31 +o1a *03 +xB1 x05 +i4i '8 +.Bi0> +s78*02 +$b shb +i12 i5c +*52C] +*02 sdl *57 +r $i $t $y +R3 q +T2 T4 T6 TA +$9 R8 +x83 y4 +x68 *34 +sGk +x52 $1 c +soz K +^ x82 +i3g .2 +$C *74 +$v stk +Z1 T8 +i7h i8e i9r ++6 $5 +i3HTAi28 +*01 p2 +x32 $1 D1 +i0W 'B +i7b i8e i9r +^6 i42 +x05 $2 +x08o9t +s/[x41s-8 +x79i65s\2 +sMi,3 +x7Bo48 +q x16 +E ${ +i52 $9 +us!j +^f ^t ^w +c se3 si1 ss$ +x91 } t +$LT6 +] i3i +L7Z3x0A +i53 f +^a ^k ^a ^b +-0 t ^T +u ^5 ^b +^n ^e ^y +z5 x27 Z2 +^fsP< +i3p i4i i5e +$] x32 +i3# k +^i ^a ^h +^n ^a ^v ^i +$$$1 +i51i69i76i86 +$ x52 +o0A ^Q +Y2 ^M +C oBe +^7 x84 +x35 -1 +i9A x04 +]iAY +^a ^y ^a ^s +y4 Y4 +] $^ +u ^1 ^f +] $J +T2i8N +x23Z4 +y3 x67 K +i8Gp1 +i71i89i96iA8 +x02 o51 +-3 L3 +*31 o1! +D1sCa +^n ^r ^u ^b +x14x95 +o8rsYQi1A +Y1 *10 +T2 T8 T3 T9 +l $1 $4 $7 +,0st o8n +s8(s-C$} +x42*08*58 +[ q x27 +i1f i58 +x25 u +*10 x19 +i5f x31 +p3 x0A xB7 +x12 x62 +x02 z4 +D6 x31 y3 +i5V*06 +K [ i2f +x03*32 +s6. L0 +$w $2 +-6s*[s(a +s6H +c x62 -1 +*57 D6 c +scj $z +*73 $t +Z3 D4 +i30 i49 +o59 o41 +i50 i60 i75 +p2 xA9 x05 +Z3 x46 +RA*BA +x91 R9 +i5g i6i i7r +x67 $F +x62 p1 +o3O C +i0c i1o i2o +s|lto9N +$w $e $a $k +T3 T7 T4 T5 +i5A *06 +T2Y4[ +[ o27 ] +x92 $J +x41*51Y3 +z5 x63 +T4 TC +sM? +*43 +8 +R1 R3 ++5iAx75 +.5 i5X +T1 T3 T8 T7 +u ^5 ^1 +Z3 o5. +^3 Y2 +,3*17 +*B7$k +T2 T3 T4 T7 +C 'A $8 +x39[l +T0 T2 T8 T6 +l $2 $1 $6 +sOY +sNU +{ x25 +o4a slB +x37 *01 +i4t i5t +T0 T7 T6 T8 T9 +o6o [ +sf/$| +u ^1 ^8 +p1x97*29 +Ei6S +i7a i91 i8s +Z1 $m +Z4su%s08 +s4t +o9/ T0 +c T2 T5 +i0} +c $4 $8 $! +s4f +shd*54 +Y4 k +x62RA +z5 z5 +T0 T2 T8 T5 +x03 L6 +sXV +r^5 +u ^1 ^0 +l $. $j $o +T4 T5 T8 T6 T7 +T0 T9 T2 T5 +Z3*34 +s+Ii37L3 +u ^2 ^b +-0 o2p +se3 si1 so0 sg9 +x02p2 +o62 .5 +l $8 $9 $4 +x52 o1P +sMY K +*30 o0b +o4fs9W*16 +$f c +x08 ,1 +s2@ { +*1B^$ +T0 T2 T8 T1 +c $4 $1 $2 $! +Y2 +5 t +z2 x57 +x23 sm+ +x05 o28 +D3 ^@ +^1 $2 $3 +i3x i4a i5n +o53 } ^g +i2r r +*06 $1 +c xA1 x04 +D4sV; +c $j $o $h $n +o1qD7sVG +x05 Z4 +c *46 +p2 x58 +Y3 *34 ++5$x +f ] +swp t +iBSx12 +$# x65 xB6 +*78 r +*27 x13 +o8% D6 +i3l i4o i5s +Z2*A1Y1 +o9? c +o0v *20 +K i6- Z1 +Y2 y2 x43 +o1T r +o1g u ++3^k +-8^| +y1 '8 +p2*46 +$v *81 x58 +$! x49 +$1 xBA DB +K $7 +Y2 t +5 +i77 o2n +r o3s +T0 T9 T2 T3 +o06 *46 *10 +x81R0*97 +x95 x16 +c $5 $2 $0 $! +i3r i4o i5n +o6a ,5 s43 +p3 xA9 s1G +T7 o2J +*40 -6 +o1e o2g +$1 DB xBA +y2 saE +se4 +i5Z [ +sI7 +sc5 +} x0B ^o +i51 i71 i60 +*90o0w +c i12 T2 +*12 $! +[ k -2 +T6 $i +o0m *20 +i7t i8i i9n +o38 *13 +Z1 svb +Z3 o5s ++B -A -8 +*06 x12 +sef x71 +$. $< +x32 $a +sG`^t*A4 +*57Z1q +$. $= +$. $? +sPM ,7 +se{i9&E +*09KxB7 +-6Z1 +st}o8\ +T2 T9 T3 T8 +c ^d ^e ^r +T1 T8 T6 T9 +x15 T8 +'7sT9 +i32 i40 i51 i65 +R0 i1e +x21 'A +^YsR#^O +^D ^D +l d '9 $7 +x19-5xAB +i53 i17 +c $5 $f +i2U+7$- +sNx +x54 -2 +Y1 } +5 +s4"x9As#i +i6o i7o i8l +s_j +Y3 o91 +D3s>h*87 +i47 o1g +$e R3 +c si1 ss$ se3 +i6bx4B^G +i0c i1o i2c +d r x0B +qo9{x7A +sy{ x35 +i7)x8Bx94 +^x ^9 +x24 Z2 .1 +$> $. +i0c shk +] o1* +iAJkd +x48 $8 +Z5iBK^l +xB6siJ +x73 o1y +*53 x54 +*31z2 +$K p3 +$2 Z4 +c x35 +*73 D2 +i5l C +sra D1 +T0 T6 T8 T9 T7 +sK0siH +-2 z2 +*25 *64 +s2* +*42 D6 sma +D4 sYA +T2 T7 T9 +o1m x28 +iAs*64 +i62i70i81i96 +slv-7 +-7 x42 +sVM ++B -8 -A +sou '8 +i0- x03 i2p +-4 -D +o5d d +o52'7 ++D +D -1 +sRU +$F $C +y2 x25 $p +d $t +E *76 +sdL u +sm9 +sU7o3& +T8 o5T +^S Y3 +sC0 +x15 T1 +^s ^e ^y ++8 o9s E +l $2 $0 $1 +l $. $g $m +*03 o5Q +c *65 +} $i +l ^o ^l ^i ^k +i74 R5 +x43 svy +} $9 +s30 *65 +'A o0X +*94*47 +o1T z2 -5 +c $i $o $n +Y2 ,5 +i77 i31 +,5 s0. +L9 sn2 x42 +i62i70i81i94 +sVvssQk +o0d x37 q +i38 x71 +i12i20i32i42 +*05 -4 +2 +^o ^n +T0 o2; +c o7+ +szG +K y2 +i0B *83 +$. $t $m +i73 i19 +i18 k +i71 R9 R8 +i3e i4d i5o +i42 i50 i61 i73 +o5A T7 +s1w D6 +sdE +o8P $C t +x05 x53 +Y4 *73 +p2 x85 +c $] ^[ +i4a i52 i60 +.6 $4 +i2i i4g i3n +T4 T8 T7 T5 T6 +u i5Q +}p2oA" +^bsoL +$h i92 x49 +'8 R2 +*AB x25 +Z4 x53 x03 +x05 ^_ +*5AxA3x1A +l $5 $6 $7 +i59 $7 +o1Y x31 +$r *74 +^s ^s ^o ^b +^7 $m +] ^h +*ABy3 +c $t $i $o $n +*A1x1B +Y5D1 +si2 i60 -2 o5a o79 +sga +*80 *21 +o09 *02 +T2 Z1 +*13 i64 +{ x42 +x71 l +s#6s*{ +E [ +^1 o8k +x65 x0B +x49sEo +^1 o2e r +T6 ,5 +o7/ t +xA5 iAS +*B7 x64 +oA2 x64 +sha o4l +shb ] +x62 E *27 +Y3x17Z2 +x14 Y2 +T0 T9 T8 T7 T6 +o48 *02 +i9e iAs iB1 +i3b R5 L5 +] x42 Z2 +T0 T2 TB +.9sw| +o3z p2 +i50 i39 +*60y2 +K sWw +{ o6o +s4l +^O *86 +i5< l +x03 R0 +T2 TB T9 +o0` x23 +T0 T1 T2 T8 +*13 $g +6 +z2 *07 o2a +T0 T3 T2 T9 +l $0 $2 $4 +i9h iAe +K o25 ++1 i5u ] ++6 +7 +B +x06 i49 +$/ E +o1f z2 +d ^s +$s $u $c $k +Z5 x07 k +*43 *48 +l $3 $0 $5 +c $4 $3 $2 $! ++0 i1e +c $i $d $e +$]E{ +T1 T7 T3 T8 +i1f i13 +$($_ +*01 [ s x +p5 i9r +l $1 $4 $5 +RAx26xBA +i1Usx9 +T0 T5 T7 T4 T6 +R9 $9 +i1ax04 +i72 *03 k +x65-0 +suQ c +i19 i5e +-4^l +} z3 x74 +^e ^s ^o ^r +'8 $Q +T0 T5 T2 T9 +*21 x38 d +x25$^*1B +r sie x19 ++0 +8 -4 +.2 sZ1 +oBT x05 +i0g +5 +T2 TB T5 +ssn ^1 +,2 y5 +x09[$N +Y2*A8 +z2 *73 +T4 TB TA +z1 o8= +{ o7= +s@tp3 +i5U k +x35 $5 d +RBZ4 +^6 x56 +scS stS +z4 Z2 x1A ++5 R0 +T1 T8 T6 T4 +T0 T7 T8 T6 T9 +sm2$! +o6j +2 c ++1 Y2 { +*81D1 +i9t iAs +$. $6 +sRw +L5$N +[ *04 +p2 *53 x5A +^e ^d ^o ^c +{ i3g +c o2@ +Y2 x01 k +o4d Y2 +s*& +T2 T9 T3 T6 +i8f i91 +^c -1 +i32 i40 i52 i67 +y1 i52 +^a ^u ^q ^a +] se2 +*63 T8 +u .B ] +x37*21 +$5 Z1 *30 +i5o i6v i7e +T6 *45 +i50 +2 +^0 ^x +sgqy4{ +D6i5d +R5 x21 Z1 +D1 i7_ +u ^1 ^3 +Z3 x34 ^5 +srE K +toBM +i04*2A*8A +,1 x35 +x47$V.7 +iBK*34Z5 +$= $( +$= $+ +R9x71i02 +sqZo8P +syx^u +i16 R2 R3 +D0 sbj Z1 +$= $< +k o9@ +T3 T5 T4 T7 +sJCx62sm; +s*Y$,*82 +i0# D6 +k ] ^b +k p1 +syt x59 +i7$sS|i4s +DB+5*46 +i0) +Y4 *A8 +i2a i3d i4o +i41 ,5 +*46*A0^F +o50 o34 +sne K +x08 k +c T5 i5+ +i2a i3d i4e +y5t +c o2- +i3@ D5 +{ snk Z2 +i74 i12 +D9 i4. +l $o $n +y3ds]U +R9o9[x31 +.3 i88 +iE_ +$b x73 +sa+ +*A2y4 +*82 'A +i1d i15 +s8js.}^s +x12 s2z +i40 z1 +o2c *31 +$* $& +x5Bscr +y4 oAk +p1 $f x17 +i7i i8n i9e +k x21 i0j +x0Ai5Z +i1c i52 +$f $l $a $m $e +x16 ] z3 +T4 T5 T6 T8 T7 +i03 i15 +$] x81 +^t *31 +iBPy4 +x54 $. +$v T8 +Z3 x59 +i0#Y2 +y4 s.4 +[ sC5 +Ex61sJT +r $i $o $n +o2b $u +T2 T4 T6 T5 +,7 i8g +oB7 x35 ] +*20 y3 +$g $a $n $g +i3g i4o i5n +^W*75K +i80 i98 +iAAs]VY1 +c $1 $8 $5 $! +o0Z *31 K +^< x05 sc3 +*A6 ] +l $1 $5 $4 +u D4 x43 +*13 p1 +*32 *68 +i27 i32 +i1s i2d i3f +D2 -1 x34 +^e ^c ^n ^a ^l +y3x54s}v +x19i2N +] *85 +r x05 sf! +D2xA4*59 +$@ $* +l $5 $3 $8 +T4 T7 T8 T6 T5 +qsZm +iBT +c L0 ^p +$x x19 +.8i4G +T2 T7 T9 T3 +o6;sZL +,6 $p +^_ *04 { +*B7R7 +*47 f x76 +^P L6 +c]Y5 +c se3 so0 si! +saU $i +u ^9 ^2 +x63 t +$| oAz +iB8 p4 +k srJ +y4s,zK +i9)D1 +u ^9 ^1 +Z1x91p4 +$s $a $r $i +c $6 $7 $8 $! +$n } +D7 i2v +Z2 i4j ] +i72 i33 +i1l x26 x31 +$. $s $b +Z1i5w +,4 *67 +i76 R4 L4 +T3 T5 T4 T9 +^! z1 x64 +x82 ssz +sN- +$R x04 +^J x56 +i3l i4o i5v +^4 i0w +u ^9 ^c +x74.A +sqm +}s,Z +D7 x02 +-7 -D +u ^9 ^a +x35z3 +T2 T7 T9 T4 ++0 sjd +i8t i92 +x42 $e +suU +r $i $s $e +i0s i2m i1i +i52i60i71i85 +l $. $s $d +$7 D7 +q'B +su@ +$9 .7 +z5 x38 +x43 sL0 +sbc ++2$/ +x68 $h +*73 $1 +i6L x06 o1{ +*32 o3= +u ^9 ^d +o54 o40 +sgZ +l d 'A +o7< K +^a ^i ^v +x02 i34 +T3 T7 TA T6 +T6 i0p +*4As@7 +x24 ] +f $m x4B +*24 *36 +T4 T7 T5 T8 T6 +x31 o0j +^* $0 +o6cxA9 +Z2 o1D +Y1 *65 +i4r i5e i6a +x31 o0c +T2 T7 T9 T8 +$x y3 +K si6 +*B8,1x07 +i1ux73 +C oBv +$1 x4B ^g +T1 T3 T4 T7 +i5a i62 +^l ^a ^b ^q ^i +} *24 *74 +f D9 +c $e $9 +o24 $+ x02 +i6r i71 i80 +f D7 +$s*14*97 +Z2 *67 +$r $a $v $e $n +i41 i53 o60 +s+h +o15 [ +5 +xA3sYV +Z1 *38 +*30 { *35 +x47 ^7 +-0 *18 ] +sC0 .3 +L5 t +szv+A+4 +E*52 +}d +o0W p1 +$v x36 +Z5 Y3 x46 +l $d $o $m $e +^i D6 +i10 i1e +l $9 $1 $0 +fo1tk +T0 T9 T8 T6 T7 +$. $c $k +C [ +6 +x83 *36 +L5 c ++2 -A +2 +k o50 +x35 p2 +f D0 +k*07 +o52 $0 $8 +*67 scu '7 +l $9 $1 $3 +u x34 +sg8x73-B +i73 o61 ++D -6 ++5 o61 +T2 T5 T6 T4 +i1f -5 +i52 i1c +$^ l +i5a i6k ++7 L8 ] +x05 l ^3 +i9bY3 +$G ^f +]*93i5l +s6wi9, +x71 Z2 k +o16 +3 +D8 Y1 T5 +R6 p4 +i6q x39 T3 +x5B skj +${ K +T0 T5 T6 T7 T4 +,4 .1 +z4 y4 +oB7 ] x35 +p1 x16 +o6a s43 ,5 +i5a i6h +*0At*72 +T6 TC TB +i4@ Z3 x87 +i3l ] +x68 $a +o3E -4 +$_ o62 +c o6+ +^R +A +$v -9 +c o6! +E .A +sW9 +T0 T4 T6 T7 T5 +c $5 $2 $7 $! +*73 ^y x42 +i7f i11 +*06x57$i +i5a i6b +i1i R2 +o6tt +*35 i8@ +q x29 +t o5o +^g smj +Z2*64 +oA# [ +T7CiBw +s}#i3pr +x9B$' +r sL1 ++C -E -D +z1 +A +^s o1l +o5o [ +} san +] *78 +z3 o3z +L1 [ +i2A { [ +sJm^g +T0 T7 T4 T6 T5 +i5f R8 L8 +-9 { '9 +Z4D7 +^OsOj +i8es;E +sD![*9A +x62 x03 +x27$r +T2 T7 T4 T9 +'8 *31 +c s8d +i4r i5m i6a +c o6T +i0t i2m i1i +'9 *62 +o0t o2s +^a z1 +s+a +i4G x03 +x57s\Ux9A +*05 +2 -4 +T2 T6 T9 T3 +o3h]-4 +oA2 $! +T0 T1 TA T9 +q x27 +c L2 +i7e i35 +i7f i1f +i8T *03 +Y1sMR +*03 y4 +d $B x47 +R1 r +c ^[ $] +y2 -3 +y5 x85 +skFs\Gx5A +sSLss5i4s +x42 R7 +*45 sa3 +D4 o6i o7@ +*06 t +i09 i18 +T0 T9 T1 T3 +x23 ^j +$# $0 +d 'E $2 +$8 o4c L6 +o6r $9 $7 o7a $2 +i09 i12 +.6*74Z3 +sjs +2 o4s +o4Vs!).A +Z2 D1 +Z4 o0G +s2Gx47o0e +i67 x1A $0 +-5 -6 -A +sz_ +o9`i7osiE +-5[ +x91 p2 +i62 x41 o45 +'3 z5 ++2*B3 +l $0 $1 $7 +*16s[!*57 +c $2 $1 $8 $! +T1 T3 T5 T2 +o3] +sb- +Z1 ^j +i88x64y3 +l $7 $9 $2 +x36 i0k +xB1 ] { +t i9k +o9l,8^d +T4 T6 T5 T8 T7 ++1 l i5a +x2B*07x71 +o3K x53 +i6i *54 +o3kl +z3 i2c x09 +D5Y2 +$b z2 +i3a i5e i4t +*30 t +i42i50i62i71 +l $7 $2 $8 +Z1 sn. +Z5 D5 x23 +*37Y3Z3 +D0 o2R +x07 Y2 y2 +i11 i29 i37 i49 +o0Q Y4 +o3Y $1 +i5c i16 +Y4L7 +x75 Z1 +oAP +p1 o6w +p1 D9 +p1 o6p +*19x83,6 +i0U o4h +ds=^[ +D8 ,9 +*25[ +E $= +s)ox76o2$ +*95*52o2L +.1*2BE +*16Z3 +l d 'E +o0j z2 +i6u o7s +,6 *45 +*30 { x53 +i77 R5 +$@ $5 +x25 p3 { +C x25 +T2 T7 T4 T3 +{ o8x +T1Y5x71 +i2R i4Y x36 +c $1 x8B +x06 -8 +T1 T9 T3 TA +^n ^e ^b +T0 ^A +o3N *47 +-0s5*Z5 +p1 '3 +^B ^V +f x84 +sGEi2u +i8d i9o +^k R3 +*45 T1 +szf ++7 R5 +o4I l +l ^1 $1 +'By1x02 +o9i i4i +i4m *25 +^B*63p5 +$O k +o5 x13 +l '8 $0 +^w ^k +^**B0*07 +Z1 *13 +s-V +o6L E +i81i99iA7iB9 +Y1 ^K T1 +i7FLB +i05 i14 +$;$@ +R4 o53 +T3 T8 TA +*AB +6 +$E -3 D4 +} i5M ++3RBy4 +o7d x61 +*B1c +*14 d s6, +^l ^a ^n ^i ^f +$M $a $y $9 +L1 t +*27 D4 +D5 Y3 +*36 -0 +4 +k ^y +c $7 $8 $6 $! +*26 x15 +*56 s06 +o2 k +*91*20x49 +x02 o4# +s4y D5 +sg0 o1! +i8A *14 *32 +D6 i5! +RA x37 +l $. $m $r +R5 +2 +k *54 R3 +c so0 si! se3 +xA6 y2 +s3`*53 +c*B9x71 +^M *70 +*A4x87x06 +o6s z2 +*14 svm +l '8 $3 +^/sTaxB4 +x91 o6b +l $. $m $p +t i14 +} svr +l 'A $1 +E.7*32 ++5Y4 +*73 x57 +iAR+B +K $& +xA1 oB0 +l $. $g $s +*69s+jZ2 +x07 -1 +i4 '6 +s_f*B3 +sNn +o4b o3K '8 +x59Y4 +D5o82,9 +sZ/ +R7*B4 +l $. $m $n +x09 z5 T6 +sC$LA +$s $e $p +i6m x91 +c $2 $1 $0 $! +sp[ +T1o7Vi9N +'8 o3c +l $. $m $k +sq2 +EoAP +i71i89i97iA7 +-6 $j +K *50 +1 +*AB x03 +y3 x62 ] +l $. $m $g +l $. $m $d +} r +0 +*31$2 +x71x48y2 +sP1x42T9 +x65 x03 +i71i89i97iA1 +se3 so0 si1 sg9 +T0*A1 +$E x04 t +srS Y2 +swI c +Y1 *80 +D4 -2 *13 +i71i89i97iA0 +*03y4 +x21 f +^e ^l ^a ^m +si2 i60 o79 -2 o5a +D4 y1 ,7 +p3 s1G xA9 +] o9F +^p t +$1 x05 +sb! +$s $h $o $t ++7'6i10 +T4 *54 +$( $- +$5 ^1 +L6*36D8 +spsy3 +l ^5 ^4 ^9 ^1 +o4ox29 +sXH +i8 { +sZR +$FscEo7s +q { x18 +o3x skb +D7 i1B +i8G i8g R8 +*02 *57 sdl +o1f *31 +] i5H +E*B8 +x13 z4 +y3 o0s x53 +^G u +x32 $0 $7 +] i5m +^s i9y +*82 x25 +*03x18s*S +x06 ^X +c $1 $2 $5 $! +Z2 i4e +sZj +o2m *03 +i25 o3a +x34 $w +o6* -3 +x73 ^& +z2i2h*31 +o3e [ +*52 T6 ] +r *53 *42 +$z o00 +s|<*07] +*B4sN- +^9sD8x17 +K ^0 +o30 R1 +-5 -A -6 +$o $i $d +x93 T3 +[*BAZ1 +c T5 i5& +dfx0A +r x19 sie +D7 x42 +i0p *80 +o0Z ^D +x62*92 +i4s o5h +st<[f +y4 $y +p2 x0B +^6 L3 +D4 ^g +x02 x76 +x62 +8 +{sN@ +l x32 +*4As`1s@4 +si9 +u $1 $9 $6 $2 +C y4 +*BA$8 +x26 z2 +R8 C +srv u +u x67 +i0s s2y ^p +x03x85 +T0 T7 T9 T8 T6 +*B0 '8 slL +i7A x23 +sb!y3 +T0 T7 T4 T5 T6 +r K Y5 +D2 Y4 +7 +x82 x13 '7 +$0 ^1 +oBbE +$P $D +t Z3 x32 +s!WL2 +CoBfoBv +s1P z1 +i73 [ u +K o0` +$0$9$4 +T0 T9 T3 T4 +z1 i5e +ssN$J +K ^o o6d +i51 o69 $4 +*5Ax39y4 +$? $> +$? $= +x87x71 +^7 *12 +stcx5A +T0 T8 T9 T7 T6 +iBG] +o1P r T6 +o7)i9k +i5%c +C } +x52 o1d z1 +o0m ^i +i4u ] +x19^S +T4 T5 T8 T7 T6 +smJ t +o1W ^1 l +,2 x42 d +^o *01 +x74 K +Y3 xA4 .5 +x73 x03 +Z1 k D3 +i3 -7 +i17 L1 R2 ++2 ,3 +'6 $2 i6T +slm $w +i92 $4 +smw ^K +sVQx0B^c +Y2 o7P +$1 i8a +x62 Z1 T8 +T0 T4 T7 T6 +x03sy' +^D ^B +se) +x0B c +i8o i9d +xA2i2R +K x04 *20 ++D -1 -C +*B4R0sZr +x29 K p2 ++2^tx0B +i5t i6t i7e +xB6*21q +i51 i7f +^s ^u ^s ^e ^j +i6. x72 o6o +*A0sBZ +T1 T6 T9 T2 +*34 sKY +-2 p1 +x36k +$m sOn +*32r +T5 T8 T9 T7 +i0a i2d i1s +x25 p1 +$0 LB +^y ^o ^r +^_*06 +[ $v x24 +T1 T2 T5 T3 +^T '8 x41 +$7 $6 $8 $9 +z3 $B x29 +k*60 +y3 o7t +*6Ay4Y1 +i17 L1 R0 +T0 T1 T9 T3 +Y1x1B,1 +u d +*21 x42 z1 +x42 y2 +T0 T4 T7 T1 +s*HL8 +o5g z1 +-2x68 +x03 d '9 +x89LA +f x4B $m +i11*7B +[ *59 ] +Z1 D3 k +i1_ x81 +o0m x63 +T2 T9 T6 T3 +^j p1 +R4 Z2 -6 +*13 +6 $g +sp+ +*17 +5 ++2+C +o34 o00 *36 +o1W t +^a ^n ^u ^l +^e ^e ^l +k l +$b s3G +$c $h $i $l $d +sfB +x35Y3Y1 +s}=^0 +L9 x42 sn2 +i53 D0 ,6 +i4Z Z2 +t$]sf( +TAx38x62 +p4 o0x +f -4 +l $. $g $b +T1 T2 TB +y1 +6 +^, *70 +^7 R3 +] ^0 ] +R4 l +^h ^n ^i ^l +so5 T7 +$3 $8 $6 $5 +*68 T4 +o6as43,5 +D7 +1 +D9 o8> +*59i5r +^e $* +$- x73 +t i1- Z1 +D3 s5T +sgh +y2 y2 x83 +$3 srl +s5R } +*42 sma D6 +i5g i6h +sk! l +-2 -2 -A +DB $5 +$2 ^9 +]sShx5B +x74 o3q +p5*A1 +*4A'9i6' +,5x17 +T0 TE +u o0H +s%ro2p +.1 $Y +x97+7 +o50u +x15 +3 +-9 oAi +r -4 [ +] x16 ^h +c i3H +i73 u [ +T1 T6 T9 T8 +$r $i $d $e $r +r *07 *64 +x94 T2 ++0 i64 x3A +T5 *45 +sy= +i5s i61 i70 +^' E +c i3* +,2 i2z +o24 x02 $+ +i9r iAa +sI8 +o56 $# +o2v z2 +*34i58 +T4 T6 T7 T5 T8 +i5&p4 +i7f i77 +o0}*86 +x59 Z3 +.6 $e +o4m ] .3 +.6 $m +p1 o7c +x41 *68 +^y ^n ^i ^t +x93 x03 +sxY +sas C +r +0 .4 +o0t *91 +'7 d u +sSz +o2_ *06 +xB7*43 +x47 o7E +f x69 K +T5 oA1 +^js_%*8B +i14 i77 +*24 o8. +'5p1say +^$s^riA0 +x94 x01 ^y ++5+C +t o4# +x5B*A9+0 +c o99 +} E Y4 +o52 D1 +*91 t +i3r i4i i5c +T2 o7l +T3 TA T7 +x34 C +o9> p5 +o1H $6 +^o y3 { +T3 TA T4 ++2 y5 +i9r iAs +$x x63 x71 +i77 i3b +i4l i5d +smo c +$, x01 { +i32*B6 +RBZ4t +^e z2 +,7 x02 +C d $5 +x42 sl_ +i38 R4 L4 +trk +K *12 Y2 +Z2o08 +Z2 *62 +*59s7?i5u +x51 x72 D9 +-A^5 +^isUa +Z3 t $1 +*02 o0s +R6 x42 +y1 x35 +$H x47 +[ +2 o0w +^% ^$ +t ^+ +^n ^i ^b ^o ^r +Y2 -1 +Z5iB9 +T3 TA T8 +tx86D6 +i10 i7c +z1 c +x02 i4n +[ o0w +2 +D7sMF +c '5 $6 +^5 l +i51i69i76i80 +i21 i39 i46 i54 +z1 $3 +x12 o4z +T0 T4 T3 T9 +{ s0m +c '5 $9 +'5 r +i7c i3e +smwx98L5 +o0k o1h +x07 z1 +c $1 $3 $7 +iB# +sa- l +T0 T1 T9 TA +i3r i4i i5s +*BAsOB +p4 k '8 +Y1 xB7 ++4 *03 +Z4Z1r +^s ^e ^v ^o ^l +Y3 $s +-1 *31 +^b o7! +'6 i48 +*50 t +d x64 'A +i8w i91 +y4x86 +-2 i8H +y2 *35 +*10 i27 +p2 *B5 x68 +ti92 +p3 o5y ] +x2A ^n +i2p ] +z2 +6 +^o $p +i5r i6m +i7OY4x8B +sG2x36.0 +Y1RBo34 +T0 T5 T6 T4 T7 +xB3C +$@s6M +i36 i3f +^o $v +-2 -4 -A +*A3D9o8> +L3 l +x56 $n +o1W l ^1 +x19 ^; +z2 o7. +i0S $@ $3 +Z1 r *24 +^e ^c ^i ^l ^a +o2p DB +x02 z5 +T1 T7 T6 T5 +o7i +3 *25 +o6z T1 +i0Px38R1 +.2 *51 +sWoDAx83 +sQO +sya $9 +o2n o0s +u o2B +o2I l D1 +} o7j +x52 sMj +$xx83 +z2 x0A i6_ +R5 o66 +R6 '9 +,3 o0v +T4 T6 T8 T7 T5 +q x1A z1 +i1f i30 +p4$u +*87 *7A +i06 y4 +x18 p1 +K i25 +y1 o2| +{ sKE +[ d TA +sJIi3C +^E o6b +.2 *41 +c se3 ss$ si1 +c o9$ +*26 x65 +x36 o4D +T0 T7 T6 T4 T5 +x64 x72 +$} D8 +L6$V +z2 o43 +*71*6A*40 +T4 T6 TA +T4 T8 T5 T7 T6 +T2 T8 T4 ++3 x84 +s0PZ3*06 +l *50 +i7v x68 *67 +[ [ $2 +sfu sue +$a*9AE +o6L *75 t +i5r i60 i70 +^R spm +o10 o20 +d s2@ x6A +$Y [ u +si2 -2 i60 o5a o79 +i5x i61 +i34 L3 R4 +sx-K +T5 T9 T8 T7 +c i02 i13 i23 i37 +T0 T8 T4 T3 +Z1T6Y4 +{ x87 +$G x06 +r Y3 +i1Y] +T2 T3 T7 T4 +*39*46 +*67 s1/ +o2I D1 l +*71 x37 +o6;sWk +i52 x12 +-6 i5, +i30 i7b +lD2 +Y1 +7 +} x95 o7j +$Y u [ +y1 *57 D2 +R2 x51 +tsM>l +s#W +sPE .5 +.3xB6 +} o7j x95 +o1i y5 +i30 i7c +i51i69i76i82 +^i ^t +i3c xB5 +-6 D0 +T3 TA TB +^z ^b ^d +-0 R3 +^2 i6a +i14 ^l +^T o1F +D4 ] +sZRxA8 +'9 o0q +*42 *14 i0Y +-3-C +Z1*03p1 +i8[ +Y3svM +$xi9v +i9 $1 +o3G C +T3 T9 T5 T4 +x91 x12 +} i1w i74 +r sf! x05 +*72 .4 +D5 x4A +x12 $. +$t $e $a $m +i06 i5t +$a $c $l $e +i0k i2n i1e +y1x28^o +Y1sm^TA +x16 y1 ,5 ++9sfa +*72so[ +sr. -7 +x24x19p3 +*B7i3$s"6 +qx64$. +l $2 $4 $3 +oB! c +o2x r +*01 *74 +T0 T8 T9 T6 T7 +oB(,2 +-3 i1/ +shy u +'4 d [ +i02 i10 i2D i3e i4c +L0'2 +i75 i19 ++4 L5 +T0x4BR0 +l $8 $3 $1 +$I*7Asn= +i3a R6 +T0 T9 T3 T6 +sp, +i12 *61 s93 +] ^4 ] +sdx z2 +x2Bsw= +i5gt +o70 +6 +T0 T7 T9 T6 T8 +i0t i2e i1r +*43^X +*82 x38 +x92 ^4 C +^9 +7 +o79p3 +$f s39 +$s $o $n $i $c +o0F o2V +T0 T6 T4 T7 T5 +D4 syg +s#w +z1 i28 +szl l +o0k ,3 +R4 Z1 +sFQ +^j ^a ^m +]T2p4 +'A i38 +T2^K +T1 T2 T3 T5 +*87^5 +sH2 +o0b i2r +*32$9 +$a $r $m $y +i6k x42 +c sa4 $! +.8 x62 +Z4 x63 o60 +l R1 +C 'C +y3RB +i8o i9w iA1 +c $! sa4 +s6% l +*73 o3p ++9 -2 -6 +^^ ^_ ^^ +^cE +o1y -0 +c $l $i $n $g +D4 *13 -2 +c $1 $3 $7 $! +$Z*97Y5 +}s#gy4 +Y2 x45 Y2 +*BA*B7sS, +t $T +i9qx43 +ux68d +l *63 +i3l o4o +i53 i35 +i5-x03 +Z2iBZ +rt*61 +*1Ax4A +u *52 +i71i89i96iA4 +s9K$! +i02 i12 i2M i3a i4r +oBn x06 +l $7 $1 $8 +$w $i $n $g +l $7 $1 $3 +$*$' +$'$_ +^x*94 +*50 D0 +} *90 +i8u^9 +$/$+ +$/$$ +$/$# +$>$( +o4a Z2 +^) ^= +o0s ] +s0^ +o4j +3 +uo4m*75 +l ^n ^i ^t +l ^o ^r ^y ^g +i54 i1d +Ki0AR4 +i70 L5 +$w $i $n $d +*25 *10 +i21 i39 i47 i51 +T3 T7 TA +T1 T2 T3 T8 +T1 T5 T2 T3 +'6 $_ +Z4Y5 +T4 T5 T6 T7 T8 +csCh +i0p i2t i1e +*34p5*9B +s0g +T3iB,o0` +oA@ Y3 x85 +{ *06 +$1 R3 +x86*08{ ++8 -6 -4 +s/cL1 +o4b x12 +R4 $2 +-8-D +^Q l -3 +Ki4Sx08 +iBox5B +i54 R2 L2 +*34 r u +^o ^c ^i ^r +^m ^e ^d +o03 i3a +x03 i0q +$/$\ +$/$] +-C -D -E +*ABuC +$#$( +x56 $w +*0Bx94 +*30 C +$gC+B +$_$/ +i3b R8 L8 +y1-5 +x86 T0 +iA[ +T5 -6 +xA9*59 +t $; +o3Hk +^s ^o ^a ^h ^c +.8[iAi +T4 T7 T8 T5 T6 +sMb +i51i69i77i82 +{x93T9 +xB6c +DBx27 +*73T6*B3 +^a ^n ^a ^d +i74 i10 +x23 '7 +$<$" +iBN .1 +t i4G +[ i1" +scU +$<$/ +$`$* +K $] +^l ^l ^i ^w +$<$? +sRl +C q +$<$_ +p4+0 +x82 -6 +$!$} +*37xB1*A0 +o0`x85r +C 'E $1 +z5 x47 } +o8e +1 +x02 i1w +$d $u $d $e +i0t i2n i1a +$o $m $y +f o4I +i1b R5 L5 ++8Z5sOw +ss8 +^a D3 +o2s [ +x47^Q +$@$= +c $1 T1 +sCfsW{ +s%v +Z1 *59 +$~$@ +s{Kx94i4L +cp1*14 +^E ^" +Z1 i21 +lR8+9 +u $1 $4 $3 +-2 -A -2 +D3+1$% +*74sQ4s`p +z3 +5 +T1 T4 T3 T7 +] E T5 +E ,2 ${ +Z1 d +z1 i4s +Y1 *81 +T3*97y1 +*62 '6 +s49 o0l +i15 R0 R2 +$; x02 +-7 sul l +xB3x93 ++9 x81 +i5s i6t i7e +z1 i41 +$?$| +-2 -A -4 +^k iAs +x49i9gt +$`$_ +rE +$=$@ +u$b ++7 -8 -2 +sp3 R4 +$^xB9x12 +T0 T6 T7 T5 T4 +i3c i50 +$c $l $o $u $d +$e $i $g $h $t +i17 R2 L1 +x31 $1 +shJC +i4e $r +*80y2[ +$w x37 +[ l T7 +f*63p5 +*46 o7E +y1 $T +x35 Y3 $1 +$"$/ +$+$) +,2 -3 +i13 R0 +$l $i $o $n +sS_ +o4b'8o3K +z3 x25 u +.3 D6 +$?$< +x06o99s7u +^AD7 +^m ^a ^e ^t +{$< +i6. .2 +oB7o2;x75 +$2 i6T +i11 R0 +r Y5 +o3H D8 K +*24$Lx86 ++A C +^n*2BsMr +i15 i3c +D2*70sh@ +x16 z3 ] +i7e L5 L6 +$$$= +*15 Z1 +*80 x45 l +o1N o3z +^e ^r ^d ^n ^a +^2 C +x51 o4o +*81^r +$[$, +o0Q } +i77 L5 +T9+7y4 +t i8C +E o1W +y2T1 +l $9 $0 $8 ++9$c +x53 o43 +u i65 +i1o i2e ++B+1L0 +u i66 +i3/xA9 +i2y o4e +$|$# +^i ^m ^a ^n +{x34 +$=$< +$"$# +s7U +s`L +$=$; +}{o1) +Z4 *69 x32 +*32 z1 +$'$/ +i1o i2i +$`$! +T0 T5 T8 T2 +K o7z Y1 +$"$& +o3P,6 +s/% +x97o2H +*34 u r +u i67 +i3a i4l i5a +i2- skb +i4C +8 +i81i99iA8iB8 +D3 svy +Z2o9S +D6 L1 +y2p1 +$)$$ +^k ^r ^a ^m +$%$" +r E z2 +o7w t +o3l $8 +i81i99iA8iB7 +l ^d ^n ^a ^h +u i62 +T0 T8 T7 T6 T9 +s[noBrE +st2 o0j +i7o i8c i9k +T0 T5 T7 T6 T4 +Z2 x96 +*06 y1 ^i +o73 ,4 +u ^A ^B +i16 R3 R2 +z1s2H.6 +-0-9{ +o3B +1 ++6o1K +-3 f x12 +*18$V[ +sF0 +Y4 xA2 +sr" +ssD i1u +r *70 +cszn +p5s#6$! +soETAZ1 +RBiA& +x42sfn +*71u +Z1,9 +z2 *51 +i7b i53 +t o3f $1 +^e ^t ^a ^h ^i +$h*B1 +i9g iAo +$3 .5 +l $i $a $l +l ^m ^u ^g +stj x56 +Y5 x06 +sOH +x62 i8J +o6\q{ +^*u +o53 $4 +x82 R7 +x82 Y4 +s-}oBED0 ++2 o4A +^j}TB +i56 R1 L1 +i7b i52 +y2{ +z3 ^B +x17 *20 +i1e R3 R4 +*3Bx79i4N +y5x81K +saF +^l ^r ^i ^g +^t ^h ^g ^i ^l +s*/ +x46 z2 +$' D0 +Ko51o6b +i1c R2 +p1 x19 +i11i29i36i44 +$o ^s i0c +i5d R6 R7 +T2 T4 TA T6 ++6-C +^s ^i ^s +^e ^i ^g ^n ^a +o0GxB1k +y2l +^$x64 +l $3 $2 $9 +T2 T5 T7 T8 +y3 x53 o0s +Y2 xA5 +i7f R7 R8 +soq +Z1*48oB[ +s7l +$0$9$5 +i3d i59 +L5tRA +c ^c ^f +i1e L0 +$5 K o5! +*A7 ] +xA1o5DsX< ++4s>Fx3B +y5x89*41 +o0f ] +t s6z +x85 D0 +i5d R8 L8 +^o ^k ^e ^n +i2n i3i i4t +$3 o82 ++8 o1B +$4 o54 +-2 L3 +^y ^z ^a ^r ^c +x03 i4L +o6yx71 +s#hx78 +^8^a +T0 T3 T9 T4 +oB6 D5 +i3b i53 +y3 x94 +sqF +R7 x14 +s*J +x51 z3 +[ *8A +K E { +sT& +s*X +{,1x9B +$x Z3 +$x Z4 +i3d i57 +s!E +x32 D1 $1 ++8 R7 +c ss$ si1 se3 +z4z3 +x59 T1 +L5 ^d +z2 sr4 +siZ +^v d +L5 o6k +,2 [ x51 +$! *37 +D2 +0 y2 +o3f *72 +xA2 x42 +x32 T8 +scu +^R *18 c +x52 $0 +$p i7q +$' x62 +z1 shp +skLKl +i12 s93 *61 +T0 TA T6 T3 +Z1 f x5A +xB5^(iBN +T0 T4 T5 T7 T6 +p4,0 +Z3 ^J +x24 .1 Z2 +i2o z1 +*12 z1 +LAxA2^@ +^6 l +x42 ^2 +x62 { +Y3Z2 +x92x05*84 +sqws"4 +C d 'A $1 +i3b i55 +Z2 k *07 +oB#s,a +l ^a ^i ^d +i14 i5c +o34 s2n +o0g d +$z ssc +$m d +] K Y2 +i01 i11 i22 +o06 *10 *46 +i5q $5 +*B8q +-B{ +*BAsXJ +*15 *30 +$_x08 +^i ^r ^f +x62 +5 +$0 y2 +^o ^e ^l ^c +$t ^3 +*92xA4 +siD K +o0! x34 +i1d i36 +x61 o3y +$$$^ +x38 k +*29,2i0" +x36 D4 +T4 T8 T5 T6 T7 +i7d i55 +q { o74 +*ABsIS +T2 T8 T9 T7 +xB3{iB! +] ] ^1 +] ] ^0 +$0$6$7 +T0 T9 T3 T1 +i16 L1 L4 +i4n i52 +*6Bx35 +*06o87 +c $1 T9 ++0 D3 x25 +$P*72 +*48o6/y2 +$a $l $e $x +c ^c ^7 +x34i3# +l $5 $1 $4 +i7e L6 L5 +T0 T2 T5 T9 +i78 R5 +l $a $l +o42 *54 +$d $a $n +*39x47o1> +o3D $l +{^Y +s@t +^ *20 +T1 T2 T8 T3 +.0x6B +utx17 +sa4 ] +sSg-A*05 +T1 T3 T7 T4 +i2m i3b i4e +sb}oBc +x46^& +x7Ase6 +sK; +*73iA6x32 +T1 T3 T7 T8 +T0 T3 T8 T4 +Z1 i64 +*68sl. +R8-1 +x41 Y5 x34 +*63^b] +*43x29^X +^s ^a ^m +o7i *25 +3 +c si! se3 so0 +i2u x72 +sB8 +^a ^t ^n ^i ^c +$0$4$0 +[ ^V '6 +Z2 $h +o13 o01 +xB8 *7B +[x61 +$,-5sy. +K +1 *50 +Y3 o7u +*23 o1W +i42 i53 i61 +$T *80 x08 +s(L +]o5} +x52 Z5 +^g ^d ^b +i3a R1 R2 +T6 i0N +x79oBj +-B x05 +s3(t*50 +i0j i2l i1u +sr& +T7o3ji43 +z4.8 +Y1 ^o +o3g ,6 +s@8 +T0 T5 T9 T2 +T2 T9 T8 T3 +x45 { +o0Y{ ++0 xB3 x19 +z3 u x25 +^9oB8 +*08s+= +z4i68x64 +i56 R2 L2 +^y ^h ^w +*31 *35 +^sx02L0 +ui3L +x73Y3 +$t *38 +D9kiA- +sry ] ++6 -B +7 +i0x Y4 +r .4 +0 +s8N[ +*29 p3 +^h ^t ^a ^e ^d +,4 *20 +$p *27 +T0 T2 T5 T8 +x4Ai5v +s#uo1B +}s2/ +.1x61o8o +i8o i9v +x36 ,8 T1 +i17 R0 L1 +*38sWxsq] +iA;-Bs8F +sznk +sIJ-0 +l R2 +o84o8OZ1 +s1p u +i55 D2 +] ^g +Z4 x62 { +D0 i4= +$ix56*36 +R3 i4t +x04 y3 +x08 T7 +sBb +sHx +i0@T9x35 +.7r +xA9*B1*72 +x62 -0 +] o5e +T0 T3 T8 T7 +^gsIE +'8 y1 +Z1 i6& +si- l o1u +z1 *16 l +i77 i12 +sWzu +T4 T5 T7 T6 T8 ++9 ,A +*98 DB +x16 o2n i4b +p1 .6 +x36 $0 +${*A1 +*64 -4 +tsoR +i5a R7 L7 +^r $Y +^XE +i1w^m +y1 o6u +x46*8B +s(KLB +r *63 +$0$5$1 +[ -2 k +Z5 x59 +} *A7 +srs $m +x12 xA1 +x34 skz +spO*9B +R0 ^s +oAgsdIx28 +sa4 se3 sg9 +T0 T6 T9 T7 T8 +'6 ^w $k +i7Tt +se3 x73 +T1s(URA +i77 i10 +i14 L1 R8 +x83 { +l ^- ^x ^e +$j $o $s $h +i82i90iA2iB8 +i42 i50 i63 i70 +T0 T2 T3 T9 +dx19o4O +T4 T8 T6 T7 T5 +Z3 x62 $g +x52 T8 +x74 o5V +sDMY3 +slu $7 +D7 i3, +z1 x04 *56 +i0h i2m i1a +o5T x02 +1 +T6 x02 +su5i8e +^G Y5 +] ^1 ] ++2sZtZ2 +i6j ,4 +*02 y1 o0d +^cY1 +x25 l +r $o $n +Z2 l +4 +D1 L1 +p5y3xA5 +i3+ r +-As1; +i1n $7 +*39sA= +c $3 $2 $5 $! +st4 x13 +{s`.+B +i4c y4 +t x06 +p4+Br +Y4K ++0 -A +0 +D7T3 +Y1 i98 +t *92 +^j o55 r +i01 i13 i2M i3a i4r ++3 q +o52 o1E +i3f R5 L5 +o7= x24 +D7 ^6 +i19 R0 L0 +o1w i17 +i6o i7r i8d +i3e [ +[y3x3B +sOG ^E k +K*17x41 +Z5Y1 +'E $4 +o0Z K *31 +i31 R5 L5 +^i ^r ^t ^u ^p +.2 o0g +q z1 +x21 sm0 +so= +T0 T7 T8 T9 T6 +$X C +$. $j $m +so+ +L5x8A +c T4 si1 +y3 ssD +*3BZ2[ +$D.1x75 +$ ^8 +c xA2 +R1 $. +z5 r x45 +i5a R3 L3 +u $E $1 +L4 x12 +i70 i39 +o82$" +l $0 $1 $2 +i73 R6 R8 +x32*37iAR +^i ^b ^i ^h ^c +z1 i5n +sxNo6r^C +x5Bi3Fs5| +T0 T9 TA T1 +*6B'Bs"7 +s8* +i7yi6n +E*92 +i55 +2 +fx9B +sb# +*80 l x45 +$a$h*7A +{i0C +*21 } +i3a i5o i4m +x59y5 +$Q x14 +$3 *53 x23 +xA3 $K +x03 i5G +i61 x01 +.9 +7 +^a ^r ^o ^n +Y3+B +skg +0 +s"]s!ex21 +i78 i10 +i75 R5 +$8 i4e +o4-*41 +i61i79i86i91 +^Ux04 +x06 xA8 +c ^6 ^5 ^9 ^1 +x3B*A7u +.B x83 +^e ^n ^o +-AZ3 +Z4 x47 Y1 +*BA}$x +R0 .2 +Y1 x48 +x53 $3 +i4K[ +l x35 -5 +i70 R2 +^Q t +y4s1; +ss0 Z2 +i32 i41 i59 +Y2t+5 +i70 R5 +.4 x53 +l spe *23 +s32 ^i +z3Z1 +p3 ] o5y +r s2K ++4 s.z +'7 z4 +srsr +l ^h ^t ^a ^b +*19x97k +x06 x9A +o0u ^q +i3d*A6} +o4p o3e +i54 i39 +Y1z4 +l $0 $1 $6 +*54^A^M +o8r ^2 +s}'*30xBA +^e ^n ^u ^r +sSJZ2 +$m $a $r $c +y2 R7 L7 +c $2 ^- +i78 i7c +p1 D1 snu +i4s i51 +^1 +2 +Z2 se7 +$a z1 +T2 T6 T8 T7 +c $$ ^4 +c $$ ^0 +$8 *43 +0 ++6 ^- +,6z1 +i8r i9l +c o4$ +s}hx89x61 +x81 L8 d +*B0x64o5# +x14 f +.0i44q +x03x04K +f x17 +i22 i30 i41 i59 +shG +c $5 ^0 +xA4 x09 +*73'AsT` +$Tx16x69 +c $| $1 +x43sN9y3 +^9 ^* +*21sfai56 +*47ko3b +y1sI(T8 +c $6 ^@ +o5v *71 +Z1 x79 +x97 Y2 +x54xB4 +xB1i7H +c $1 $| +*52o9] +o3o *45 D6 ++2 o0r +] o4x +i3w i4e +swf x94 +i1msMR*39 +T0 T3 T6 TA +x15 $m +i91 T7 R8 +i0#D6 +^n ^o ^m ^i ^s +*79 *48 +c ^- ^2 +c ^- ^7 +c $6 ^3 +x31 D6 +x26 $a +^+ ^7 +c ^* $2 +*40*97 +cZ2Z4 +c ss$ se3 si1 +c ^) $0 +R5 st3 +*30 x32 $t +^7 ^+ +z2 i0a +i16 L4 L1 +x57 ^4 +sz, +$o *7B +p1 ^3 x4A +^Nx39xA4 +s@# +*07.0 +$$ C +*94 o0t +T0 T3 T9 T6 +l $. $r $o +c T6 i6- +Z4 x47 +seu x14 +c $0 ^* +^f x43 +l $. $h $k +i77 R1 L1 +c $% $3 +Z3 x51 +c $1 ^+ +c $1 ^( +swj x32 +*27 x75 +x43 x85 +^= ^2 +c $1 ^& +^u ^p +Z1 R7 D4 +*ABr +R9C +y3z2l +'7 Y1 +se3 sg9 so0 si1 +i70 i87 +c ^4 $* +i0y $c +i70 i86 +^f *08 +z4x52*B1 +c $1 $5 $6 $! +^v x49 ++5c$# +o3cE +c x28 +c ^. ^3 +L1 +5 Z1 +i3o i4v +$x ^o +*A9E +T0 T7 T6 T5 T4 +sr|^Q ++E -3 +D4 q +iA\[q +i2n i3n i4i +t$< ++E -6 +[ $\ o0P +c $= ^1 +$x ^v +R4 x51 +c $d $e +iA$$Xx3B +L5 *21 +i9v iAe +^J '6 +k.1 +sH, +x74o7S +c $4 $/ +xB3p2 +T1 T9 T5 T3 +i1.*10oAB +z3 ] *64 +o98ui9* +c ^ ^9 +-2 si5 +c ^ ^4 +^e ^t ^a ^h +x74o8U ++2 $y ^d +z3 *64 ] +su?i2O +x13 i4X +-2 R1 +t sLH +c $. ^5 +$3 ^& +$- Z4 +i9f iAe +c ^* ^1 +$4 D7 x81 +stz { +^o ^y ^k +s5px18*6A +t x32 Z3 +$4 ^= +c ^3 ^# +$. $j $o +xA2 x16 +*53sL@R5 +i76 i88 +c ^0 $$ +c $^ $7 +$2 ,2 p5 +rs69 +s+%RB*74 +T2 T3 T7 T9 +s.? +i57 k +s5fD6i3o +i33 i45 +x45 z1 +o4f *84 +o8jtx98 +s'ju$K +i3a i4s i5t +*14 -2 $i +c ^4 ^! +i8l i9e iAr +u*78 +i9o iAs +i8t*49 +x09$1 +xBAL3o68 +p3 TA +x02 -5 +T0 T3 T9 T1 +T2 T9 T4 T7 +y3 ] x62 +i51 $4 o69 +LBc$j +DA x84 +o1p ] x01 +x17^O +*87sS( +^3 ^@ +p1t +c ^3 $* +c $* ^4 +,9 iB7 +T3 [ o3i +'A o43 +x85 Y1 +c $* ^3 +y3 *96 +*45xA4D3 +o6L t *75 +D1 DB +T1 T3 TA T6 +x9B*8A +c o3+ +i3n i4i i5s +-5 R3 +3 +$> ^1 +D5s8gR2 +c o3, +$> ^3 +c $2 ^* +o6p$bx35 +p3xB5*A6 +l +6 $j +^0 ^& +x07 y2 Y2 +c ^& ^1 +-4*57 +T0 T7 T2 T3 +x14 Z3 t +c $6 $% +^0 ^+ +i4i i5r i6e +l $1 $5 $9 +x34x36 +c ^2 ^@ +*12 sas +].AL5 +Y2x84 +^wsX[x95 +*48]*84 +-8 [ l +i3o i4b +^o ^m +*78 Y1 +$3 u x42 +*30 x35 sl$ +x05'7 +sZEsEd +c ^1 ^- +c ^1 ^$ +*30 $t x32 ++0 Z3 +c $; ^1 +x4BsVC$} +c $3 $% +] ^2 +L7x1Bi7/ +i2 ^k +c $8 ^@ +$. $m $r +T1 T3 T9 TA +^l E D1 +.9L9x05 +r i3q +c $3 $( +c o3$ +c $/ ^1 +l R6 Z2 +T0 T7 T2 T1 +T8 x07 +*B8x12^b +c $d $2 +c ^+ ^1 +c $3 $~ +$cxB2$9 +*19dy1 +i54 i16 +$+ ^0 +i2e i3m +$+ ^4 +-2 i2x T3 ++2 +2 -A +st2 Y3 +R0*49 +c ^@ ^3 +c o4* +x61 o3p +{*18x71 +c $8 ^5 +^o *28 +*14 z5 +c ^2 $0 +l*21 +c o3_ +u o2W [ +o3e *17 +i1e R2 +o64 *20 +] u r +c ^_ ^0 +sA1^# +c $# $0 +x56 *36 r +ssH l +o1p x01 ] +i1i i3a i2n +i76 i5f +o6n $1 +] sra +Y1x4BZ4 +c $8 ^# +i14 L1 L7 +x37 p1 +R7 x05 +*B8L6Y1 +*67 $0 +^? ^1 +T3 T7 T6 TA +p4x91oB. +-2]L0 +^gkxB7 +x04 o3} +o0w D2 +-7 *07 +i7c i30 +c o1V +*B8,Ao1* +c ^1 $; +i9i iAf iBe +x9B{K +Co2x-4 +z2sw? +*58Z4 +^n ^a ^o ^j +c ^/ ^7 +su. +i1b i78 +c ^1 $= +z5 Z2 x35 +c o1_ +$0 +6 +^5 ^_ +i6c i7k i8s +sjB +iBUx19 +s3C +^l *21 +$E t x04 +$2 x12 +^* ^2 +x45d*79 +*57 x04 +Y4Y1{ +i2G x45 +x17*96Y4 +}*23 +*56 *B1 x76 +skm Z1 +x98 *98 +s-m +i7# x39 +T1 T8 T4 T6 +R2 ^d +^* ^8 +$} ^{ +'6 D1 o0K +^8 ^$ +d x2A +y3x7B*3B +z3 o23 +o0t d +i11 i29 i38 i47 +i7Q-8 +sb7 +o8 x34y2 +xA8x42iAQ +D4 Z4 x32 +*1B*97sdq +R6 x41 +d 'E $9 +[ o0m $i $a i4o +c so0 se3 si! +*A2^vsMK +i4S x53 +c ^1 $/ +o3isA}i7& +c $2 $= +x91*78 +y4 xB3 +i0Kc+1 +r i3. T4 +T0 T8 T6 T7 T9 ++0*74 +si2 i60 -2 o79 o5a +i4a i5l i6o +,B x63 +$B x19 c +i2s R6 +*A3*53 +*0Bx15 +^q $a +Y2 D8 +^" ^\ +*05 u D0 +.9*71 +oA8 } +x07 ^t +x67s@` ++2[s@= +*20o0Fo2V +c ^6 $4 +$i $c $l $e +k *54 $9 +^m ^s +^t ^e ^g +so3 i4j +o87 u +$9 ^+ +T2 T6 T7 T8 +l $3 $1 $0 +s8^ +o53 ^s +x4Bx61s$4 +i14 L7 L1 +i1m i2i i3l +sMe +D4Z4 +x83s/, +] D1 u +c $0 ^- +s1g D0 +x08skn +^e ^n +$y x84 +^4 x62 +^1 ^= +o95 u +[ i4o $i $a o0m +x84s>* +$`i0-x85 +$| ^1 +^j*57 +i2m i3p i4i +i7c i3d +i73 R8 R6 +p1D7 +*57 Z1 ++4*54 +y4x83x12 +c $0 ^) +c $0 ^7 +*52 z2 +l x62 +i70 R2 L2 +] p2 x49 +so$ +T0,9z1 +x28slz +c $0 ^2 +-C -E -D +k i1Y +x83 +A +*03 ^O +iAa *98 +i5q { +Z2 ] i4j +z5z4x39 +$_ ^4 +o04r +c ^* $0 +kxA3 +T9 x14 +x56y3 +$_ ^2 +sFd*67 +^i R2 +Z1 *14 $j +i77 i1b +Z3 *54 +^vr +$3 d D4 +x93x91oAh +$< ^1 +z1 ^5 +p3p1 +*30$5 +T2 T6 T4 TA +z3 x29 $B +c ^5 $8 +T0 T1 T7 T4 +T4 T6 T9 +c T1 $1 +i8o i9c iAk +^t *81 D3 +q x0B +^}*83 +c ^5 $. +o67 $Z +x28o9;,1 +ro3k-0 +$u i3o +i35 i16 +T1 TA T3 T6 +*50*29 +c $( $1 +c $( $0 +o6r $9 o7a $7 $2 +ls.3 +D1 u +c $( $6 +T1 TA T3 T9 +k x54 T3 +[ $i o0m $a i4o +x35 x19 +o6V T1 +,1$D +Z2 +4 l +x16 ^5 +*01 *65 +-8 l [ +$3 ^$ +o4r p1 +srg E d +c ^@ $3 +c $! ^! +*50f.3 +i2k i3e i4m +s3b +srg sny +x24 $n +x93 D5 +saXx09 +x32 q +i9c iAo +f *AB +^i*20sjJ +sK. +c $) $8 +$. $a $m +x93 x07 +x15 o57 +^ashz +$3 ^< +x07 i5l +o1e L5 +i9c iAk +R8 $- +oAP'B +i9/s]@*A7 +$. $t $o +^2 ^= +x45s@h +d 'E $4 +Z2 slx +s6a +*18 x26 +*69$_r +c ^+ $1 ++4 *65 +D4 E *85 +c $4 ^0 +T4 T7 T6 T5 T8 +D3 ^& +l^v +^2 ^- +*5B x65 +x5Ao4F +^2 ^/ +[p1i6] +cxABk +c $4 ^6 +x07z3 +i7!R6,A +*5AR7 +T1 T2 T6 T9 +^2 ^# +c $8 $~ +i75 i13 +Z1 d x75 +s9q +^w R1 +x89 -A +Y5o1[ +c ^0 $5 +.2 D7 +x86T9 +x16 q +i7c L6 L5 +x68 -8 +$4 Z3 o5g +^r*21 +c $+ $6 +c $8 $> +Z1 $3 i7e +$. $t $j +*86x87s ` +s6q +x07 z2 +sqc K +u *98 +x15 x71 +z5 o65 +c $8 $, +s61Z2x6B +} ^z +x82 *16 +z4 +6 +0 +x12D8Y2 +c $& $3 +T0 T1 T7 T2 +qxB5 +Z2o4zs{- +$7 ^2 +kswM*34 +l $i $e $r +c $; +$x p1 +l $4 $1 $0 +i3e i4f +*02y4s%C +x23 Z1 s1R +xBA x25 +i08 i16 +c ^0 $4 +$6 ^$ +R0 i2a +x12 sf4 +x83lx53 +i0s Z3 x54 +x61 y2 +*21sHw*B1 +$0 ^. +i7c L8 +$0 ^) +i2r i3i i4c +,2 { +i1e i2u +c $" +c $= $7 +x87oA#*70 +$& ^6 +c $= $5 +$zx61 +o71 x43 +u$' +$& ^2 +T1 T9 T3 T5 +$& ^3 +x71 *70 +i7Q x14 +$5 ^9 +^G p1 x58 +oB**70*1B +$& ^8 +T0 TA T1 T9 +^b ^t +$0 ^~ +$>$& +$0 ^_ +i5 { K +T3 T5 T7 T4 +*12 $K u +sFw +i75 i10 +T0 T7 T6 T4 +T2 T4 T5 T6 +$! ^9 +*17x1B*06 +c*40*4B +d$Bx47 +$5 ^7 +o5y i60 o75 +D0 x91 +*12siN +$5 ^( +T2 T5 T4 T6 +iA% +i76 i39 +x05 ^3 l +$5 ^* +D2 x34 -1 +$! ^# +$- ^8 +^x ^e ^l ^a +x15 o5j +$- ^7 +Z1 ,A +$- ^4 +z1 o7p +x46 '8 +sy3E +$4 $A +x63 i97 +rCu +x45^k +^;o3ei3o +*41 i2e +T0 TA T3 T6 +*A8ux49 +i34 i48 +T0 T4 T5 T6 T7 +i52 R2 +D4 x32 Z4 +T0 TA T3 T7 +] u D1 +c ^! $! +i1PsQH +^# +7 +R6 +4 +o5uD7o7B +x02x03 +^& $; +^A o01 $5 +c ^3 $6 +p1i33 +smq +R5 i5= +y2 x75 +x58*3B +T0 T7 TA T3 +oBy x26 +{ ^L +l +1 +Z2 i1n +*54 x14 +r $l $i $n $e +i1e i2y +T0 T3 T6 T9 +*13 x28 t +xA4.2Z1 +x14 x34 +x75 D3 +$* ^4 +z3 x27 +c ^! $3 +$* ^9 +so0 si! ss$ +T3 TA T7 T6 ++1o5b ++5s1S,4 +c ^# $8 +s2e +i34 i45 +c*48 +$6${xA3 +*56 x03 +^q ^g +sfh]l +c ^- $2 +x78 p3 -5 +*25 $N +c ^& $1 +c ^- $0 +x54 +2 -4 +$0$6$2 +c $5 $/ +^u*0A +x43i77 +c ^. ^5 +T1 T3 T8 T2 +y5,B*94 +p1 snu D1 +c $5 $# +T2 T8 T6 T7 +p2 *15 +^4sk;^3 ++1sxv +T2 T7 T5 T8 +i4B*67 +Z1 ssu +c ^@ $6 +c ^@ $8 +$g o5p +^i ^l ^e +T4 T5 T7 T8 T6 +l ^g ^n ^i ^r +$2 ^0 +i34 i46 +s6e ^b +c ^4 $$ +T1 T6 T5 T7 +*A1i9gY3 +i9PD8s9g +$2 ^= +o5T Z1 +Y3ksGn +o04 *45 +f ^c x7A +i4m *90 +$2 ^> +x23sPV +}u +x13 c +x18 z1 +i04 i11 +i72 i83 +i1f i51 +$; ^; +ti2R +T9 t +.5 x05 u +p2 svw +sD- +i7c L5 L6 +c ^9 ^d +$! ^y +R9o1O +^V D4 ++9 -6 -2 +i0m i2g i1a +x82s,B +$4 ^5 +i6V x67 ^u +xA2{C +Z3 x37 $m +oBeo7E +p1 *96 x98 +R5 C +L8 *76 +T1 T7 T5 T6 +Y2 .4 +c $3 ^@ +y4 p3 +t.2 +i2H u +o7wY2 +z3 +1 +r ^7 +c $9 $% +c ^( $1 +c $3 ^! +$) ^8 +R5 *64 x63 +c $0 $( +c $0 $/ +x51 x8B D7 +c $0 $, +sol +c $7 $A +^et +^d l +y1]-8 +,7 xBA +c $1 $6 $5 +,2 o4x +$? ^7 +spf^b*36 +$? ^3 +$? ^2 +$8 ^& +*93 c x56 +^j i2e Z1 +x82t +i20 i31 i41 +i77 L7 +x46 x18 +soYsky +$8 ^! +{ x72 x92 +x36 T1 ,8 +T3 T4 T5 T9 +$8 ^7 +^- x53 +*9A*70C +*75sji+9 +Y4s(6s!A +iB& +i3h*9B +x25 ^U +T3 T4 T5 T7 +.Af +xA2p2K +i0X *60 +x65 x84 +c $5 $2 $9 +T1 T9 T6 T2 +i1u *50 +*14 $i -2 +o17 R2 +*A2i9{ +T4 T8 T6 T5 T7 +$8 ^_ +*A5.0LB +,9fd +y1 '5 +]z2o3C +*36 [ D3 +k R3 *54 +sPus@aTA +CoBDY4 +^R c *18 +T1 T6 T7 T5 +*13 Y4 +$( ^5 +x23 s1R Z1 +x95 x05 +x03 x01 +x31 $i +c $9 $> +K } E +s1RxB3 +sl7 D4 +u ^7 ^a +s3Xp5o0Q +f T1 +o1Y *13 +T1 T9 T6 T8 +$D x26 +$r k ^f +$9 ^= +c ^9 ^a +$1 ^5 +sx, z2 +L9x86 +$j o17 +$1 ^) +l $5 $0 $1 +C $4 $5 $6 +^m d +s`w.1 +u ^7 ^b +'C l +T7 o20 p2 +.9 l +xA4 $! +K y1 D5 +c $5 $8 $3 +i3c R1 L1 +y4$s +u ^7 ^c +x08 i2c +c ^7 $0 +i4y i59 +i2w*08^q +sBc +oAc x07 +$7 $& +sd7 +'C c +i1a i2r i3m +$@ Z3 +$o $z p3 +^o x45 +i4d z1 +i12 i20 i30 i45 +}L9x71 +x75i5, +sbM*B3 +i15 i5f +c Z1 +D5 o5f +$I $1 +i22 i30 i41 i54 +l '9 $3 +Y1x75y1 +^i ^h +c x34 +] $K +^Grx4A +x75 R7 +D1l$F +D2 x54 +x47 q +sbn^] +'B c +i61i79i87i92 +i8a c +u ^7 ^e +*84i9ds!U +*18 $V [ +c $5 $4 $1 +x56 +5 +sD-i6gY5 +$ky4'B +x68 R5 +*30y1 +*83i7P +Z1 z1 *09 +i5; D4 +o7;T8 +i58 i1b +xA2 x18 y4 +T1 T8 T2 T3 +xA4*35 +y3x45 +$. $t $r +T5 T7 T9 T8 +xA4 x87 +x62 i6K +x05i8-x91 +T9sIzs(u +T1 T4 T8 T6 +c $7 $4 $2 +s-L +u sDF +$@$+ +.Bs*w +c $3 $1 $8 +*25 .8 +DA o4a +i3+ *02 +*14 ,5 +i0p i1r i2o i3d +x57 D6 +i4K}y5 +x21s>/z4 +$d $a $r $k +c sti +*41 x75 +i4l i5i i6a +s*6 +i1Uso[ +$. $t $p +x46i8K-3 +u ^7 ^x +i7f R8 R7 +D2 *76 +-9 x71 +3 +KT6 ++1 xA3 +l*84sf5 +*B9 x09 +sbG t +sxk +*42*86 +*49 +5 +o14 x52 +*12 s34 +c $6 $2 $! +Y2 x56 +-0 +1 r +sebsHt +x12 y3 .6 +*41 K +sfa 'A +x79*B7+1 +D3 x65 +o0X R1 +x47$g +o1\ +x36 K +x34 *01 +sa@ T6 +L6 ] +$0$8$4 +Z5 x78 +*18 [ $V +x83 o1L +Z4 x13 +iBr x18 +{ D2 +o04 d +i7a i81 i91 +Y2iA7,7 +-4 *05 +x61 $* +c *83 +s96 x72 +i5t i6i i7a +[ $c +$0$8$6 +i5b i6e i7a +o5n *25 p5 +i1UxB6x7A +i10 i5f +*06 x3A p4 +*15 $9 Z1 +sh8sul +x08 $6 +T0 T2 T9 T3 +*8A K +o4k x52 +l}c +z1 } Z1 +x46z1 +i5e i6v i7e +*17x71 +i4i i6e i5r +c $7 $0 $1 +r *19 +Z5 Z5 x02 +i0j l *56 +s$f +^5 '9 +z1 ,4 +i14 R0 +*14 '5 q +.4 R8 +$& i5w o81 +{-1 +T3 T4 TA +T2 T4 T3 T7 +Y3 x54 +*17 x36 o0o +-7 o4e +T3 T5 T9 T4 +y2 scp +c ^2 ^d +T0 T8 T3 T4 +T3 T7 T6 T5 +x13i8MsH, +x57 ,6 +x32 } x08 +L7 *63 +sfJsS/ +*26*7AD0 +*40 c +$8 +0 *43 +iAg*B4sw] +u ^4 ^3 +o7c $8 +T0 o6m +o3n +2 +i11 i29 i39 i44 +x28*91i7& +*A0 *5A x46 +*59 D9 +sW8 +*97o8u$[ +x92 *37 +k x74 +i4q +2 +$N T0 +R0 z1 +x84d +i38 R5 R4 +x89o1D +so4 +i71i89i96iA2 +s=F*97 +sAN*AB*18 +*64 *42 +i72 x89 +^|x06 +x6BsrBxB9 +L0k +T0 T3 T7 T2 +i2g i3g i4e +} -7 o4a +o3l z1 +u ^4 ^7 +s90 i0d +x93 x96 x82 +sr3 +T3 T4 TB +i9rs+pz2 +sV4]$^ +i9s iAt iBa +i82 i90 iA0 +t Y3 +i34 R4 R2 +x26 Y3 +.1 D6 +oAg x13 +.Bs\kL6 +'6 z1 +-7 x71 i3h +T2 T3 T8 T9 +*54 sjc +D3p3 +T2s!(iB- +^l ^i ^a ^s +o0|xA3 +l *23 spe +sqQ +i0q i1a +i0w o0P +T0 T9 T3 T2 +o59*30 +iC* +o75i6D +^l ^i ^a ^t +.1 { +T0 T1 T4 T7 +^t ^s ^u ^d +[ $i $a o0m i4o +r $l $o $n $g +o6r o7a $9 $7 $2 +o5r R4 t +c $8 $1 $2 +sVf +o1~ +p3 R9 +*95 x71 +T7sP5y1 +x54 K +$q *53 +i82i90iA2iB6 +i6k i7e i8r ++7 u +R6 i4L x32 +x04 x1A +iC! +i1b i2o +$(s,Dy3 +*23 *97 +T0 TA T7 T3 +D6 +8 +x93i6xu +u +0 +i71 R1 L1 +x96Z2R9 +s5r Z1 +T0 T9 T6 T8 T7 +x04 y1 ^x +i0^ +R4o9) +kx98p4 +c$1$2$3$) +] p1 ^' +i2d z1 +^k D9 +^k x94 +i7t i8t i9y +$f o1e +y2 $p x25 +-6 +C +*49 -A +R6y1 +i44 q +x9Ao3; +D7 ,3 +*12 -5 +^F+7 +x32stx +s7z +R7 *97 +$Zsc[ +*67fs1$ +*A6 x53 +x97$< +i2f -3 +x51 ssa +c si1 T4 +qx4B] +T1 T9 TA T8 +sjF l +^hs7y*50 +i3f L6 L5 +$2 d D7 +i4i i5c i6k +i51 R6 R4 +$B c x19 +T0 T5 T4 T7 T6 ++4sD)*16 +-7 *82 +i6`*3A +Y3*79 +i4Qx5Ax05 +i7l i8l i9e +^l D1 E +kZ4xB2 +T7 TC +Z1 i2v +$m $o $d $e +csSb +x43 c +u ^4 ^c +D7 *29 +x2A*68 +i9\*8A +o1- o0B +Z1 *26 +i32 L6 L7 +i5b R5 R6 +x53 d +u ^4 ^b +$g $r $a $y +$2 x72 +s1E +y4 ,3 +*60 D4 +k x45 i1_ +i5b R6 R5 +d t x13 +T7 TB +i3f L5 L6 +x73 k +o6$Z2 +$. $n $p +$. $n $r +*6Ao7g +i3a L6 L0 +i9o iAm +x48 p5 +$V $0 +x63*29 +LBY1*98 +$* ^/ +i5d R7 R6 +L7 *67 +c R2 +i8m i91 iA2 +i19 R0 L1 +iB!*31 +*53uxA3 +i15 L0 L1 +sg_ +4 *64 +T1 T6 T2 T9 +x87i8"Z5 +i87 z2 x49 +D4z3 +^m ^o ^m +i1b L3 L6 +syK $8 +T0 T3 T7 TA +^z x91 +*12 s36 +i32 L7 L6 +i5t x72 +T0 T8 T3 T7 +sWF,1*7A +D4 i4C +c si1 se3 ss$ +T1 T9 T2 T6 +*83 x73 +L5 i5h +*14x71 +z1 o6w +*B6^YY1 +T0 T6 T7 T4 +T0 TA T7 T8 +x16K +*48 x53 +.6s+[ +R3 o4n +^6 K +Y3x86x9B +i79 R8 R9 +i7b L2 L1 +f x5B +$? ^P +x23 Z1 z2 +sc< so0 si1 +c $l $a $n $d +i0c i1a +^Y $w +i0S*4Bx72 +Y4sep +i0VEsc> +i1f *37 +*12 *53 x61 +l $. $m $x ++3 L8 +oB_ +} o4a -7 +sG$ +*13 ,2 +i8o i9u +k ,6 +i6n i7t i8e +$r ^p +D3 ^J +i8n i9g iAe +i1u i2d i3d +x6Bsyaf +o1w $4 +T1 T3 T5 T9 +c ^w ^e ^n +*7B x52 +T1 TB T2 +Y2iA1$1 +^Fx38 +x51 *97 x63 +D8C+B +R4 i5E +*6A -9 +$s $h $i $n $e +.6x46.5 +^qi9O +kZ4K +T2 TA T4 T6 +sRtc^Q +su4R1*43 +y5 se6 +s;Li7vs)G +i7e L1 L3 +syu +5 +o6h D7 k +x75 y1 +$K *04 +3 +T2 T7 T3 T9 +x6A k +z4x59 +x54 R5 +scx z2 +i3d i4o i5w +R7 t +L6 Z1 +z1 ,7 +o7r 'A +i77 L7 L6 +*31 x74 +o5$E +i19 L1 R0 +s #sh) +c i16 +^5 } +TA*9BsJ\ +iB7 x53 +$. $a $e +oA9 ,9 +i7c i53 +$C D0 +$=x54 +x92 C ^4 +y2sG^ +o2x Z1 +x43s,lL8 +u ^0 ^c +i15 L1 L0 +*05,0 +R3 R3 +$" u +y5u +T2 T7 T3 T4 +$. $a $n +sa4 sg9 se3 +$N*58 +i76 i3b +sCM +x91 -8 +i9a iAn iB1 +$t $a +x8A^= +$a $n $x +} x91 +l $o $r $y +T7x83sk9 +i35 i5d +,9 l +i32i40i53i60 +*89 xA6 +T3 T4 T7 T5 +c i18 +i5i i6r +i7e L3 L1 +*12 u $K +o0M ] +sDZ^^ +*60*94-1 +-8 o0a +i7b L1 L2 +*79*62*39 +$7 -8 +Z2 -5 *42 +i7f i53 +i5g i6i +z3*3B*75 +T2 T6 T4 T5 +^2 o4l +$4 d +i82i90iA1iB7 +Y2 i52 +z1+7 +Z2 ^4 +$a $c $u $t $e +s8c Z1 +i79 R9 R8 +t *34 +i78 L8 L7 +$l $i $v $e +'5 $3 L5 +r .5 +sdU u +i51 R4 R6 +s6- p3 +p1 o0b +K $5 ++1 +E +x85 ^2 +o4Vs?Rx52 +x75L9 +$t *B4 +,5 D2 +sc4 +*7B x27 +p2 x87 +K -B +^S +oB +sow i70 +i3f i53 +.9TB +i1f i50 +i3Y D0 +x43x36f +z5} +x49 DA +i18 i52 +sAbo8! +D4 'B +i54 i70 i62 +i14 i30 i22 +i7f i39 ++1 i5a l +i7f i37 +s5# +T1 T7 T8 T3 +i22 i30 i42 i58 +i7f i32 +x59snDs`- +L5 x32 +'D $6 +i10 i3f +i55 i7f +i55 i7d +D2 t Z3 +z3 x29 +*72*70z1 +s;ro4rx95 +u ^B ^A +lL3s(M +*32x49 +tL4 +i5d i18 +*6B x84 r +^o ^d +*15 x59 +[ o0m i4o $i $a +x25 $0 +i8o i9t +K+4D3 +z3 z5 +i18 i7d +o02*39,2 +sfv *86 +i7d i59 +i53 i37 +i11 i29 i37 i41 +sX}L1 +r}p5 +,5k*5A +*52 $9 +i7f i14 +,4 x65 +[ s-g +x75 *20 +o4fs+Q +$b $u $g $s +i7f i16 +Y2 $, xB3 +i2v i3e i4n +$o $p +*03x4B +] o0k z2 +i5b i18 +s0+ +i14 i76 ++A k +i18 i73 +{ z3 { +sMC Z1 +$. $d $m +i5b i19 +sEp-2z2 +i12 R0 L0 +$f d +[ i4o $i o0m $a +s9_ r +c $3 $2 $8 $! +i42 i61 i50 i70 +T1x41 +i19 i7f +l $. $t $o +x67o1C +x25 $r +Z3 -A +^RxB5*31 +T0 T7 T6 T9 T8 +i5b i14 +i7b i14 +i76 i5b +i01 i27 i19 i32 +i01 i27 i19 i38 +i3g i4l i5e +T1 T5 T7 T6 +x09 c +i6B*92 +*17] +o8=s*b +i11 i29 i36 i49 +'7 i14 i22 i30 +x25Z5xB4 +'7 u d +u x43 D4 +$_$& +$'$[ +si2 i60 o5a o79 -2 +si2 o5a i60 o79 -2 +$>$) +i7d i37 +{ R2 +i52 i14 +o1f*31 +x95 x46 +} $4 $2 $0 +.2 i8d +i15 i7d +i50 i12 +i50 i17 +o77 o69 +d 'J $1 +i21i39i46i53 +i56 i36 +i50 i19 +i19 i72 +i16 i7d +T0 TA T9 T1 +l $. $t $j +DB x76 +i5b i16 +*38Ki6l +i5d i30 +i5b i15 +sed l +i16 i75 +x21 o2t +i02 i10 i35 i21 +T4 T7 T6 T8 T5 +i17 i7b +D1 DA +i17 i70 +T4 +4 +C*B7o7" +x89 x93 -A +*48$R +T2 T7 T8 T9 +o8j Z1 +T6 i6- +*8A D1 o1- +i17 i52 +c i5M +z3 '8 +*B0sG\ +i7o i8o i9d +$\x75*94 +$Ko7. +$($/ +*52 ] srd +i7d i35 +i01 i19 i38 i27 +o9k o8d +$)$? +c ^4 ^d +i1a i2s i3s +i52 i15 +]*A0 +u o4Z +i53 i7f +ser D4 +x42 x02 +i11 i29 i38 i41 +T1 ^! +D1 $9 $5 o1d +s7I +$= x54 +x53$H +l ^w ^o ^l +D1 i5s +*14 s6, d +x42 Y2 +$I Z2 +i6c ^d +x36 Z1 $f +r*24'B +x82o2Mo4{ +s}!*7A +T3 TB TA +T0 T8 T2 T5 +Z5D6 +*14o9S +o9>s0[ +*39x03 +uy2 +*19i62^I +^w'B +r x08 +p3 Y5 +R4 T0 D2 +$c { +$^$< +t Z1 i1- +T0 T9 T1 TA +-5+C +R8 l D1 +i37 R2 R1 +D3 oAn +'5 $k z1 +i5o L6 +i32 i5b +T1 T9 T8 T6 +sRD$z +x29 p2 +*05 -5 +-7 s4$ +*13 o8b +t o3G +T1 T6 T8 T4 +x31 i0! +x34 .5 +qx78 +c $i $s $m +*61[ +T3 T6 TA T7 +D0x31Y2 +T0 T8 T2 T6 +$Y x24 +l $a $n +y2 *64 +T0 T8 T2 T1 +x82 *58 +c ^e ^c ^i +l $1 $0 $3 +o5=sDe +i4l i5e i6r +i97 iA3 +l $1 $9 $7 $0 +l $1 $9 $7 $5 +o6tx35.9 +x4B i4p +T0 T3 T2 T7 +i0V ^b +i8s i9h +se4 ^c +x05Y5 +i7P i40 +o5x D2 +u $E $A +Y1^L +i6h z2 ++7 +7 -A +i02 i21 i10 i36 +'7 i54 i62 i70 +i12 i20 i32 i48 +i5d i1f +i1u i2n i3n +^E ^F +*20 o47 +.8 $J +Co9XD5 +i12 i20 i32 i44 +i11i29i36i49 +i5e i50 +x07 D1 +u o4J +*52 $e +T0 T2 T9 T5 +o6f x23 +x78K +i3a R2 R1 +p4 *A2 +xA3 T5 +{{{{ +skD d x76 +x08 c d +$. l Z4 +R6o2p +x03 z5 +*93x39 +i14 i1d +.A.9 +sbS*81 +}sUqK +$7 x46 +L1R6 +i4s i5s i6a +d T8 +i4J x02 +'9D5 +z4 +0 +6 +i73 i86 +} scN +i1b R3 L3 +T1 T3 T6 TA +T2 T9 T7 T8 +i0m i1a i2r i3c i4h +o08Y2*80 +d o3l x74 +-5-C +i0s i1p i2i +o4# D6 +o6- i5- +D8K*6A +x14 z4 +^7 *27 +T2 T7 T6 T8 +T0 T6 TA T3 +-7i8i +*86 ,5 +si2 -2 o5a i60 o79 +i55 i10 +*21o9(*4A +u $E $2 ++D -1 +D +xA1i65} +o8z } +$b $i $t $c $h +i7S T1 +^-scy ++5 svi +^e^9 +^d .4 +i35 i1b +oB(to0j +*4B x63 +Z5 x02 Z5 +D5*B3x23 +i1u T4 +i7b i1c +T3 T6 T7 TA +T0 T7 T3 T8 +^e^2 +i71 ,8 +s$d +i9n iAg +Ci2F +T2 T9 T7 T4 +^c^6 +x15*8B +^# $1 +iAFs@h +*52 ] T6 +L0 p1 +'6i19x17 +$$ $? +T0 T6 T8 T2 +T0 T5 T2 T8 +-Bi1, +s7j $k +] x14 +i53 R3 L3 +D7*30 +D1 *56 +T8{ +i8e i9r iA0 +Z2x76 +^Y o2b +s/Lx94 +$$ $# +T1 TA T6 T3 +$s $w $o $r $d +{ q u +^7^f +x47 c +l $1 $0 $8 +{ spj +$$ $! +-1 ^T xA1 +^7^e +T2 T9 T7 T3 +T1 T6 T3 TA +T0 T7 T5 T4 T6 +o0Os\9 +T0 T6 T3 T9 +$Y *67 +i8K -3 +T1 TA T8 T9 +y4*21*84 +$m $a $r $9 +l $i $s $m +p5 i4s ] +D2 Z3 t +o7dy4 +i78 L5 +x93 i0V +D3xB6 +sSn D4 +sa9 Z2 +T2 T4 T9 +sun l +D9s*Ui5A +s0, +*97 syi +^8^c +i76 R6 +*7B *5B +i2z Z1 +s>lsP7Y5 +i7f i8e +*13 x31 +$b $l $a $s $t +c x8B $1 +l^d^d +l^d^b +l^f^4 +i5a i30 +f o21 +sx< x72 +x01 o42 } +i60u +l^d^3 +sp. +i18 i7c +^i s1l +sgi^k*96 +x04 u +x9A *9A +T0 T6 T5 T7 T4 +z5 x56 +D1 $9 o1d $5 +i1b i51 +T2 TA T6 T4 +i2r i3c i4e +o3j Z1 +i9Sc +-6 -1 [ +o7o } +i1f i16 +D3 d +l^1^4 +i4 { +x12Y2 +*6BsNC +i1f i17 +T2 T9 T3 T7 +i5jZ1o9_ +T1 T8 T3 T7 +i8y x97 +Z3$ht +*97 ^A +r $a $b $l $e +T0 T6 T3 TA +i1f i14 +x3B*78r +p5*A9 +E *87 +x82 *94 '9 +si2 i60 o5a -2 o79 +Y2 *01 +x65.8 +l^9^2 +T5 T9 T7 +suP -4 +s6x +i9i iAa +sr% +[ s8M ++4 o8y +l^5^6 ++1 ] i5u +k^Z +i2s i3t i4r +^F T4 -1 +qc +l $e $a $u +c T9 $1 +o9S ] +x23stu +x12 { +y4i9p +xA3 x04 +y4 E *49 +l $. $o $r $g +z2 T2 +$w $i $s $h +z1*36Y1 +l^b^6 +uo8s +i9i iAl +^i o1r +^F -1 T4 +i56 R4 L4 +l^b^f +l^2^a +*B9*46sU[ +Ex54 +lL6xBA +x54 o6B +D5 o2p +s,|u,7 +o1k Z2 o63 +i9o iAo +sAE*86 +c $c +[ oBr +$8 L6 o4c +*52*74K +$F z1 +l^0^9 +i92 *8A +o5Kx1Af +$a T5 +sP] +-3o1, +p1 o5s +*86 $2 +i8K -6 E +iA3 o9e +sdXp5o6y +y2 d +z5 Z2 x27 +l^8^1 +x41 o2R +^Ro42C +i34 R2 R4 +.1x48 +i31 d +L7 x82 +szOx09 +i1d R7 L7 +i54 i62 +$4 Z4 +q r +c $0 $2 $1 $! +s`>D5 +L8 s5s +l^4^0 +i72i80i92iA6 +xB9 o9l +[ i6m +Y3 +3 +d*7Bx8B +xB2x75-5 +i53 i14 +i2d .1 +T0 T7 T8 T3 +Y4 Y4 +l $1 ^1 +d spi +sEml*57 +-4s#hE +iA7-1oA7 +o6i +3 +T7 *45 +$w *31 +sJ0*25 +i4h i5e i6a +i19 i1b +^5 $4 +-8 -A -B +T3 T6 T7 T5 +$4 D3 +$0 [ i2y +x54 +A +[ o0m $i i4o $a +Z3 $g x62 +R4 *30 +l^4^8 +x72 o7Z +i1G'8x9A +i3e i37 +i18s9Q +Y1 $0 +l^8^f +,8 *49 +l^e^d +i5k i61 +R1 o0e +c o06 +C.1 +l^a^f +T2 T4 T8 +l^a^b +o8jswl +s|b*38 +*A0+B +s6a*4A +$s $u $p $e $r +T4 T8 T7 T6 T5 +i53 i1f +^cx4B +sh- o0g +T1 T8 T3 T2 +r^Gl +sdz +-A} +sd< ++0 +0 -A +]*B2o5x +l^e^0 +l^c^9 +l^c^f +l^c^d +u o83 +L6 $y +o9r c +o3t *62 +x54 o2P +k o1p +^b^5 +x16 i4b o2n +xA7x36s6@ +T1 T5 T3 T9 +i2) +$[$[ +T0 T8 T5 T2 +^L x19 +x85x94p1 +$^ $_ +u ^f ^9 +i8s i91 iA2 +$f $a $k $e +i1e R4 R3 +*73D7l +$Q D5 x14 +*53 x52 T5 +o4' Z1 } +si- o1u l +$s $p $o $r $k +$q x59 +i3n i4d i5o +i4a i51 +p5 y3 *39 +o47 y5 +^LD3 +K$Ou +i1c R6 L6 +]uz1 +*67 *59 +i4s i5e i6p +D2 x45 $? +x09 x21 +s6; +sCh c +i8osZn +} o3f -0 +u i41 +i7o i81 i99 +o8{ +r *27 c +E *96 +oBI*AB^F +T4 T9 T6 +*B7q +*2A*71 +*15*37 +*17i8H +ts/?*60 +i16 i29 +i07 i15 +T2 T4 T9 T7 +sP_ +p4*37*15 +s91 $t +] r u +c o9M +{ R3 [ +i16 i23 +*25s+Y +oA; +i8n i9s +x65 x43 T0 +i1c i5f +i1a i2n i3u +x76*76s?L +'6 D3 +x36 sbt +^R x35 +u ^f ^b +i58 R2 L2 +x42 o2b +D9s&b +.6z4x12 +^b x3B sNr +slj $u +i11i29i37i46 +Y4 -8 +$a $u $x +$c $o $m $i $c +}i9O +soS +i3d i35 +R1 u +i7m T5 +] x63 +l x27 +skX*40 +i8n i9n +*12o40^1 +o3c o0- +i4/ x12 +D8 T5 Y1 +i7A c t +smb *06 +s50 *01 D5 +T0 T6 T4 T7 +DA i9m +x91 t } +T1 T4 T6 T8 +o8s o5z +T0 T6 T4 T9 +*23*A7*75 +T4 T6 T8 T5 T7 +sZ#x47k +s3X t +$7 d D7 +p5 sDB +o4K u +^F ^B +i34 i19 +i8t i9s +sDV$y*12 +x14 Z4 +^o ^t +$/ z1 +^}*58 +T5 T7 T9 +.0oA? +T1 T9 T8 TA +r +A +z2 D5 o3m +$aZ1sl% +z1 o2g l +i7o i8w +$# x18 +^L xB3 +s3$*98^U +^3 x36 +t szg +^3 o1e +i8.x82o7l +Z1 u { +x87 $x i7y +sv. +'9y1 +i4b x04 d +i4a i5u i6g +s/_ +$3 ^j +l $6 $5 $4 +o7nz1 +Z4sr, +*02DA +y5 x26 Y2 +y3 slI +$; o7i +x58 D4 +$d $a $m $n +z4 r +i7b i54 +i18 R0 +sal x91 +s90 [ +i0 z2 +l K x43 +o0b $1 $8 +R8 D1 l +i4=*78s$] +Y3 o99 +*89 x18 +uZ5x43 +sqAZ4 +Z2 i7u +{ p4 +^7 k ++4 C +i7b i58 +xA5 -5 *65 +i91 R8 T7 +i74 R3 L3 +i8e i92 +c ^E ^F +^ZY1 +'8xA5^l +u ^a ^8 +*59 '7 ^- +T0 TA T8 T7 +o0j -5 +-1 Y2 x64 +sjt [ ++5 oAe +q xA6 +i5- u [ +sxs [ +o7Y ,3 +x31 +4 d +$5 *30 Z1 +TAi1e^D +K o5t +x23 d { +i77 i34 +sth ^P +^4 c r +*87 p2 x87 +y3 x74 +cy2 +p1 +9 ++3x01x26 +o6r $9 $7 $2 o7a +sXBp4 +*A1*B9 +o3ws+$snj +D2 $? x45 +Z3 D3 +sLg +l $a $n $e +i1> +x34 x63 +i5g i8k +x6AR8oB_ +x36 i5u +$t s81 +o0} +$^s+}Z1 +^@ *45 *43 +-A,1 +i36 R4 +$% se1 +sz; +^W T1 +i11 i20 i31 +DBo31*70 +i1c R7 L7 +^K ^s +[ $i i4o $a o0m +L4 D0 +$X +7 +p1 o7o +^M *95 +*35 t i5g +u ^a ^0 ++2 z2 +*92 *91 +^Po22 ++8 E o9s +T0 T8 T7 T3 +^4 ^k K +T0 T6 T9 T8 T7 +sgfy3 +$k p1 x26 +o8m*B0x19 +^; x46 +i5f i11 +o0- R1 +x12s5L-A +Z1 $j *14 +i3e L5 +s8wx96 +Z3 $1 t +t i3L +$k $i $d $s +stk Y1 +i16 i57 +^d-6 +T5 T7 T8 T9 +i1f i39 +s/Bo04 +svG +s\Os.W +x42 L5 +o6B D3 +i8t i9a iAs +i3N c +*81.6Y3 +] *06 +i79 i16 +i77 R8 R9 +i93L6 +x34 Y2 -5 +s=z +$K ^M +x76i07Z2 +$. $m $p +E *B8 +s'! +r'BL0 +$f *16 +] R3 spk +-4 i7h +sbF*A0'A +K i4+ +se3 si1 sg9 so0 +s_I*25*93 +R4*46Y1 +*83R4 +Es#U +*76 sti ] +^8 t +s-l x91 +s25 o3m +s'4 +x64D9 +i4e i51 i69 +*67r +*67u +i41 i52 i61 +o7H -9 +-7 *09 +o6k { +T1oA/} +i79 i15 +[ $i i4o o0m $a +R4 x21 +T6 xA3 +o7k r +T1 T3 T9 T5 +Z3 TB x62 +p3 L9 +s0n +x32 *89 +^b sNr +x18 C +T0 T7 T8 TA +$L x68 +i8b i91 +x52$eE +x51 i2T +s!0 +y2T8 +p4 o19 x21 +$6 i8t +s2w +$g $a $u $l +x85C +Z4 x52 +T1 T6 T4 T8 +Z2 -4 +sr? +o4l *35 +c o43 +^8 d +T1 TA T9 T3 +x3B $j +'6 -1 +sr2 +i5e R2 L2 +u ^b ^7 +i5- [ u +s7K *30 +*53'7 +x7Bx43c +i0v i2n i1a +c^1^0 +Y2 x06 +^w K +$ix98 +z3 o1s +x41 Z2 +c iA/ +^1^3^0^2 +s8C +s2t +K$O +Z2 *42 -5 +x03 C +^E*59 +*57 *07 +*13 *48 +D9 ^' +T0 T6 T8 T7 T9 +i7d i17 +o5Ws%Q +i39x5B +x01 *62 *82 +*31 o0Z Y1 +{ $/ +{ $Z +u x53 +T0 o8C +sYE^, +l $9 $1 $7 +k r Z2 +p5 sNB +i8Gi8gR8 +x93 R8 +x5BE+1 ++C -E +C +CsnX +] y2 *74 +*20 *56 +i22 i30 i42 i52 +T0 T3 T4 T8 +s>fi6Z +i72 i17 +*60 z2 x65 +C o1S +] sm5 +x58 ,2 +ss; ++9L7i84 +i3e R5 +*53t +$3 z1 +i2y $a $r $i $m +i7a i8d i9e +} i9@ u +*50 seT +i6l i7l i8a +si1 ss$ u +sHzx54 +sv6 Y1 +svj x52 +D6 R6 +{x37 +o0t D7 +y2 i8_ +c[ +} -0 o3f +x84x89$N +D6 ^M D9 +i8r i9o iA1 +x36 *12 +d i6b +u o4m *75 +c ^Y +x25 { p3 +sub x62 +Z4 x32 s3P +{ x83 Y3 +ss1 ^w +i7y i3d +xA9skoseV +i13 i3e +x76$I +u ^e ^c +*B0 slL '8 +l $4 $0 $7 +o6? E +D3-7T1 +o73 i8# +p2xB9] +x41 sNM *21 +s9v +*A5 [ +*73E*29 +u ^e ^9 +s%O^wo9M +*81*61y2 +x84 T3 +i33 i5b +i52 L7 +u ^e ^6 +o6m *35 +ExB6y2 +i3b *68 +u $1 $9 $6 $8 +r i3u E +o0w T1 +^g,2 +c sbY +*96 x15 +u $1 $9 $6 $7 +snc^Ks%. +i05 x65 +*74 .1 +i7e i79 +$S *51 x46 +i7? -4 +t y1 +u $D $E +i1d i16 +sW@ +u x94 +uu,2 +Z1 { u +$j $a $n $1 $0 +*34 ^k +x1A*32,A +i1d i58 +Y3x1B +i5e i19 +$? .4 +i5e i10 +t i11 +,1 s7K +Y3 x79 *34 +}xA5 +*86 sgo +u o65 +*93 *43 +sXMxA1 +d sby +x37T6 +i3* x71 +i52 i7c +x18 x06 +'9 $Y +su1 ++7 r [ +R5 $! +x74 $# +*87 T3 +x87sD< +y5csLU +*02 y5 x82 +x42 ^m ++4x67 +x82 *21 +i01 i19 i30 i26 +i11 -3 +*8B x38 +^d K i6k +$%x92 +L0 k +x23 y1 +shg +fy3 +shf +y5 x64 +o0w '8 +x15z2 +rz4 +'A ^J o07 +x57 k +x65 f +*80 T2 +^E ^3 +[ x17 +sMrso> ++7 ] L8 +iA0 x25 +sD+ +o6W *42 +D5 $e ^t +[ o0P $\ +i50 i14 +o6P R8 +x1A y2 +^k s1a +*4A$sY5 +*54 E +i70 i1f +u ^E ^B +$a E *9A +E ${ ,2 +*40 x75 x24 +i0, *62 +i50 i16 +-4 o0d z2 +T3 T4 T9 T5 +T1 y3 +}x56 +p5 sWS +$, $_ +T0 T2 T3 T7 +i34 i12 +D6 o0( +i50 i18 +y2 $Y +D6 y5 +o1> +T4 TA TB +i39 i3c +sDs x51 +sK2 +.2 sGQ +i52i60i72i89 +i4x } +sa4 o9! +y2 x49 +^,TB +iB]*24 +D7 o8R +s=.x35 +i5b i1c +*60 r +i37 i3f +stl o54 +s#;Y1*48 +DA*27 +i21i39i46i52 +x52 z1 +x9B p1 +,5r +u i6u +*36 -2 +p1xA3 +]o5E +*04 i6* +i6a i72 i82 +i5@ } +o72 $e +*42xB1 +i3s i4t i5i +r*B4 +xB4'7 +sz[ +x86 $- +Y5 z5 x8B +-7 i5A +xB7*28 +tT4 +T2 T9 TB +Y3 .5 xA4 ++3 +E +si2 o5a i60 -2 o79 +z2 o3m D5 +i2e i4i i3r +T0 i5a +i2c i3t i4o +i16 i71 +i3f i39 +c $2 $1 $8 +i0P x38 R1 +x16 c +-8 xB4 +t $1 o3f +*52 '6 +xB5 x01 +z5 x38 l +s!m +*43 *13 t +x76 o0C +D3 Y4 +p1 x17 $f +{*1B +i3a i13 +Z1 x25 t +swe +L3 t +Y1*71 +y3 K x67 +x32x81 +r Z1 +Y5 ^Y x78 +$u *04 +i59 R2 +i9l iAi iBf +-9 i9n +Z2 s0A +x05,3o7- +$3 x42 u +i8i i9o +i0s ^p s2y +o7? +7 +o3c C +x74 x43 +$n $a $m $e +x71 k Z2 +u $. +x9Bs-& +T0 T3 T1 T9 +u *68 +s'- ^h +$x$x +x91s{*-8 +D5 o57 ++1 x65 x31 +*04 ^9 +x02 i5A l +i6/o9W +i8cx48 +T0 T7 T4 T1 +'7 $_ +T2 T6 T5 T4 +i5F*69 +R0 o22 +ti8h +-7-C +s3t ^I +T7 $! +p5sv! +y1 K x36 +T0 T9 T4 T3 +i1u i2m i3m +o5t +3 +c $~ $3 +o0-D1 +T2 T4 T7 T3 +u $3 $4 $5 +c^7^1 +$9$x +x35 ^f +r s9M +q*84 +i9e iAe +R2 Z2 +'6 o0K D1 +srd ] +i12i20i30i45 +*08 x07 +$b$e +x86 $Y +T2 T8 T5 T7 +$3 xA1 i8_ +*36 ^s x82 +i9e iAl +i78 i39 +$b$c +.8x02 +K i00 +o6f z1 +c se3 si! so0 +^x z3 +T1 T3 T9 +T0 d [ +c ^3 ^f +o6l z1 +y3 '4 +ssz $R +*6As[G^s +*63x26sLJ +*21 p1 +$}${ +R6 o3g +Z1 i7e $3 +i57 i3b +i2e i3e i4n +*86 *69 +x84 o7c +*03 $c +i13 i76 +$8 x81 +*04 son +$/ x63 +Y3xA4.5 +ty4 +*B2x37 +r E i3u +$+ x15 +*76 l $P +cY5 +i0Usm+-7 ++5 ^2 ++0 -4 -A +k *60 +x34 i3# +i8isZ(x74 +i1u i2a i3n ++0 x73 +s54 '6 +i5f i55 +T0 T9 T4 T6 +i7g i8e i9l +D1o5q +c *68 +T2 $u +^D +B +x69 -5 +*38x6AK +i6Y *01 +^A i0W +dc*2A +$5 .9 +sf|x67z4 +c szp +sHk +DAs8%*42 +$t R5 +x06 i84 +o9O -7 +Z3 -5 +t o7X +$h T1 +c ^2 ^B +T8 } +x28 Y3 +i17 i79 +Y3 x37 +p1 o5f +*93 c +x51 c $1 +.3 Y2 +l $8 $0 $5 +*74 *12 +i8E R6 *67 +Z3 -8 +f xB3 +i32i40i52i65 +{y4 +$2 C +o4! x13 ^S +^b sNr x3B +x67i1T +,2 o8t +^A $5 o01 +*B5x83 +i3e i4m i5a +i12i20i32i45 +i22i30i41i59 +q*8Ax7B +sq0o2+ +o6 x15 +soK +x64 Z1 T4 +*6B x62 +*92 $v x26 +Z2 *16 +[ i4o o0m $i $a +x28 t +'A o9d +sen Z1 +$. $m $n ++1 u d +s'7o8o +i70 i37 +x13 { [ +c $8 $5 $2 $! +z5 $A +*46 $R +x28 Z4 +u oAO +x42x1Bx76 ++1 *34 scJ +x0Bs4` +s-S *59 +$J $a $n $2 $7 +*95 K o5t +] } x53 +iAF $o +.2'B +*63 u +x27 $A +c$a$2 +s#z$f +sn $2 +$i $o $u $s +x7A t +i72i80i91iA4 +T3 T5 T6 T7 +i72i80i91iA6 +i79 i14 +i0U $5 l +d x6A s2@ +d srw +sbS *13 +x91sgXo4s +x04 K +c$x$2 +D4 *85 E +x75,3xBA +'7 i4; +iAE^>sOT +o1io9@ +c i5u +*06 z1 +sl< +o17 l +x5Ay4 +qi0l +o3p *46 $d +Z4 Y1 x47 +x89.Bi1e +c$x$1 +xA2o1dy1 +x87 i7y $x +o6} +-1 ^c +$k ,4 o7H +s_FD6 +i17 i3b +Y5o2s} +D7*65*1A +u^b^0 +d xB3 +*05s0T +i3y i4b +^=k +]k^& +xAB$rLB ++C +C -E +*31^#xA7 +*2Bs!gT7 +Y4 Y4 ] +$_ $& +,2 Y4 +Z1 ^g x57 +y3x58 +] D3 R0 +i51i69i76i81 +$d $o $p $e +u $C $A +u^d^6 +i34 i1c +-5 Y4 +^_ ^b +i51i69i76i88 +i2, -1 +x15$_ +$e$x +T3sN4i8d +x15 iA. +i36 i3b +L6 +8 +y5 suf +i5< +-0$g +L4 Y1 +si! sl1 +T0 T7 T4 T6 ++7 -A +7 +i58 Z2 +ux8A{ +T2 T6 TA T4 +i5b i32 +i1n i2o +^x ^e ^s +sWS*B2 +*63 D1 +*92^k +T0 T7 T3 TA +oAR 'B +^x^e +i18 i3c +^8 x94 +i18 i3d +*63Z4l +i6csE) +o2f-A*92 +c d 'F +l iBp +$8 Z5 +c $3 $A +d$N +sc&sx< +y1s)6 +C*8B^0 +i56 i1b +c $7 $4 $1 $! +r *67 +i12i20i30i49 +i5e x03 +i1n i2u +u^c^b +*54^}*69 +i15 i79 +dx63 +x05 Z5 +D5 slZ +'6 i6T $2 +L8.5 +x64 l +D1 $9 $5 o1d -5 +i3e i4t i5a +T0 T9 T3 T7 +T7 TA TB +T2 T9 TB T4 +z1 Z2 x16 +T0 T3 TB TA +x07 slk +l o01 +l $a $u $x +i3t i4b i5a +T0 T5 T2 T1 +T3 T9 TA T4 +D0 s9A +T3 T4 T9 T7 +l $. $l $c +x37 x41 +i41 i59 i67 +$9 R5 +i2r i3i i4l +T7 TA T8 +l $. $p $r $o +R7 *02 +z3 *27 +T0 T9 T3 T5 +i9s iA1 iB3 +i9s iA1 iB0 +i44 [ +i5e i68 +T0 T5 T8 T6 +T0 T9 T3 T8 +i9s iA3 +T0 T1 T5 TB +i8v i9e iAr +T1 T5 T2 T7 +i3t i4l +o3j [ +T4 T6 TD +T0 TE T7 +T1 T9 T5 T7 +i1a i2v i3a +T0 T8 TB T4 +o2U u x53 +T3 TA T6 T8 +T0 T2 T9 T8 +T1 T8 T3 T5 +$s L7 s1_ +i2g i3h i4t +T2 TB T9 T4 +[ *98 +T2 TA T9 T6 +l ^e ^s ^o ^n +i2v i4l i3i +T1 T2 TA T3 +i1a i3a i2n +i4y i51 +f i44 +i4y i53 +i1l i2a i3s +i3o i42 +*04 T0 +T0 T6 T5 T1 +i1u x52 +T0 T6 T5 T8 +i3e i4r i5n +i2n i3n i4a +T1 T4 T6 T9 +x34 $3 p2 +i2m i3m i4e +$. $t $l +T1 T8 T3 TA +*81 +8 +$. $t $d +$. $t $z +T0 T6 T1 TA +T5 T8 T9 +T0 T8 T3 T9 +*20 +4 $9 +C -5 +i1a i3a i2m +o0b o3e o1l +*8B oAd +-3 *82 +T2 T7 T8 T4 +T2 T7 T8 T3 +i2v i3e i4l +i8e i9r iA9 +i2r i3n i4e +i0r i2c i1o +i1e $9 $9 sd1 $5 +T3 T5 T9 +T0 T8 T7 T1 +i2l i4s i3i +T0 T8 T7 T5 +T0 T8 T7 T4 +Z1 p2 x13 +i1e i3e i2l +l *13 i53 +T2 T6 TA T9 +l $t $h $e +i4y i51 i61 +T2 T6 TA T8 +o6e o7d +o0y $9 $7 i3h $1 +i1k Z1 +p2 x08 *24 +l $. $p $g +T5 TB T6 T7 +x62 ^1 +^t ^i ^r ^b +r $o $u $s +T0 T4 T8 T6 +r $d +T0 T4 T8 T7 +T0 T6 T1 T8 +T3 T8 T7 T9 +r $i $a $l +T1 T9 T3 T7 +T1 TA T5 +x07 T0 +i2i i4a i3n +T0 T6 T1 T5 +T3 TB T5 T6 +T1 TB T2 T7 +T1 T3 T5 T8 +$. $c $i +T7 TB TA +T0 TB T6 T7 +T0 T4 T8 TA +T0 T4 T8 TB +i4e i5s i61 +T1 T9 T4 TA +T1 T2 T4 T6 +T1 T4 T9 TA +.7 ] -7 +l $a $s $e +T2 T4 T8 TA +T2 T4 T8 T7 +T1 T9 T7 T5 +T1 T9 T7 T3 +^5 D6 +o1@ x43 +i72 i88 +T1 T4 T9 T6 +i1h i2e i3r +i12 i24 +i8o i91 iA2 +T2 T5 TA +T0 T1 T6 T8 +T2 T8 T7 T3 +T2 T8 T9 T6 +T0 T1 T6 T5 +T0 T2 TB TA +T0 T9 T8 T3 +T2 T8 T7 T4 +*61 *25 +i9a iAs iBy +T1 T5 T6 T9 +i14 i26 +T2 T6 T9 T5 +o0k *35 +l $. $g $d +l $. $g $a +^p ^i ^k ^s +T2 T6 T9 T8 +l $. $g $p +T0 T1 T6 TA +T4 T7 T6 TA +i6o i7r i8e +T2 T8 T6 T9 +i1e i2x i3y +x61 ,2 +T2 TB T4 T9 +i54 i68 +i54 i67 +T2 T8 T6 T5 +i9r iA1 iB2 +sBv t +T2 T7 TA T9 +$. $m $g +$. $m $w +T2 T7 TA T4 +sei y3 +i8t i9y +T3 T9 T8 T7 +o0r ^k +o0r ^g +slb u +$. $g $y +i1i i2g i3e +T2 T5 T6 T9 +T2 T5 T6 T8 +p1 o72 +i4# l +i9n iAg iB1 +i7f i81 +i4i i6l i5l +T1 TA T4 T8 +l i1p +t o5T +i4r i5o i6n +T1 TA T4 T9 +i79 +6 +T2 T8 TA T4 +T2 T8 TA T6 +l i13 +$. $k $e +T2 T7 T4 T8 +T2 T7 T4 TA +o7k sbr +oB2 D9 +x26 x27 +*A2 x49 +R3 -4 t +T0 TB T7 T6 +T0 T4 T6 TA +T0 T5 T1 T6 +T2 T4 T7 TA +i1a i2e +i9v iAe iBr +T6 T8 T7 TB +T0 T6 TB T4 +T0 T5 T1 T2 +T4 T5 TA +T0 TD T9 +T0 TD T6 +T0 TD T2 +^y ^m ^m ^o ^t +-0 o7w +^a $1 ^a ^a i4h +y1 +3 x52 +i60 Z1 +i3e i5t i4n +T2 T4 T7 T8 +T6 T7 TB T8 +T2 T9 T7 TA +x13 y2 +T2 T9 T5 T6 +R1 ] [ +i42 i51 i60 +T1 T2 TB T7 +i8e i98 +T1 T2 TB T3 +*13 z2 +T1 T7 T2 TB +T4 T9 TB +-9 u x24 +T1 T7 T2 T5 +k K o22 +T4 T9 T8 +} s21 +i3r i4l +T0 T3 T5 T9 +l ^e ^c ^i ^v +r $s $h +o0y $9 $7 $1 i3h +T0 T7 T8 T1 +l $. $q $a +T0 T7 T8 T5 +i3l i4i i5e +T0 T7 T8 T4 +T2 TA T6 T8 +i9l iAl +T0 T8 T2 T9 +T1 T2 T6 T4 +-4 ^$ +o0y $9 i3h $7 $1 +l $. $t $p +l $. $t $r +l $. $t $t +l $. $t $n +l $. $t $g +i82 i92 iA2 +$i l +T0 T8 T6 T9 +T0 T8 T6 T4 +T0 T8 T6 T5 +i9w iA1 +D3 ^s x41 +T3 T4 TA T9 +*24 R3 +T0 T8 T6 T1 +i31 i41 i52 +i31 i41 i59 +T3 TA T9 T4 +T1 TB T8 +T1 TB T9 +T1 T9 TA T4 +T3 T7 T9 T4 +^a ^a $1 ^a i4h +i2r i4l i3o +i2l i4n i3i +T2 T8 T6 TA +T3 T7 T9 T8 +l ^i ^m ^e ^d +x74 +1 +i2n i3s i4t +i4j x02 +i3l i5r i4e +i0c i2o i1h +T5 T6 T7 TB +T0 T9 T8 T2 +i4j x03 +} Z1 *42 +i4i i5d +l $. $d $j +i0s i1c i2o +T0 T7 TE +T1 T9 T6 T5 +i9s iA2 iB2 +i4u i5i +^m ^o ^t +$. $g $u +D4 o2g +T0 T6 T4 TB +T0 T1 T7 T8 +i2S +1 x51 +T0 T5 T7 T8 +$y *81 +*A6 '7 +^o D4 s1d +i8r i92 +T1 T9 T6 T4 +i8a i92 iA3 +i3i i5a i4t +i3i i5a i4l +o6r $2 i7a i89 o97 +u i7Z +i2| x23 +T2 T6 T8 T9 +T2 T6 T8 T5 +T0 TB T3 TA +i8r i9k +Y2 x24 y2 +y4 x64 x02 +$3 x09 +T0 T7 T6 TB +$x ^j +T6 T9 TA +T2 TA T8 +i2c R4 +T2 TA T5 +o3; k +$v $g +T2 TA T7 T4 +T0 T8 T4 TA +T0 T8 T4 TB +i2e i3v +sa7 i2e o6b o3c si4 +T2 T6 T5 T7 +T3 TB T6 T5 +^g x49 +T1 T8 T4 TA +sa7 i2e si4 o6b o3c +i3i i5g i4n +T2 T8 TA +i4o i5o +T2 T8 TB +i4o i5c +T0 T9 TD +i0h i2n i1a +T1 TA T3 T2 +i9c iA1 +T1 TA T3 T8 +T0 TA T4 T5 +T2 TA T8 T6 +x19 r +T2 TA T8 T4 +T0 TA T4 T7 +i9e iAl iB1 +o1e i3w o4a o5r i6e +T0 TA T4 T6 +T2 T3 T8 T7 +i2' x41 +i1e i2n i3e +T0 TA T4 T8 +^e ^e ^n ^k +c ^q +T1 T9 T5 T6 +T5 T6 TB T7 +o3j z5 x34 +T2 T7 T5 T6 +i7r i8y i91 +*BA E +o0f +2 +^P *42 +i1h i3l i2e +T5 TA +l $. $o $m +T2 T6 T8 TA +t x14 +Z2 i6- +9 +i0n i2c i1i +T1 TB T2 T3 +l $. $u $s +i9o iAd ++3 ] Y1 +T2 T7 T3 T8 +$. $a $g +T1 T7 T9 T5 +x45 Z1 +Z1 x13 f +T3 T4 T7 T9 +T0 T6 T7 T3 +i2l i4e i3i +T4 T8 T5 T6 +i9y iAe +l ^e ^c ^a ^l +T4 T8 TD +T4 T8 TC +i8r i9y iA1 +T4 T8 T9 +T4 T8 T6 T5 +s3. Z4 +T1 T5 T8 T3 +^l ^e ^v ^e ^l +sa7 i2e o6b si4 o3c +d $r +d $y +i7n i8d i91 +T1 T4 TA T8 +T1 T4 TA T9 +xA4 x35 +i1e i2m i3o +o0t o1e o3t +l $. $e $u +l $. $e $t +l $. $e $e +T0 T5 T7 T9 +T0 T2 T5 T1 +$. $d $z +l ^o ^r ^c ^a +D1 o1d $9 $5 -5 +T3 TB TC +i7o i8o i9l +l $i $c $l $e +T2 TB T6 T7 +i1u i2n i3e +T0 T6 TA T4 +T0 T6 TA T1 +L6 $2 +i9n iAd +T0 T6 T8 T1 +i7n i8t i9e +T0 T6 T8 T4 +o1e i3w i6e o4a o5r +T0 T6 T8 T5 +'7 C +T0 T6 T8 T9 +i6o i71 i89 +l $a $r $y +i9n iA2 +i1e sd1 $9 $9 $5 +o1e i3w o4a i6e o5r +L6 $e +T4 T5 T8 T6 +'7 q +i8n i9g +T1 T4 T6 T2 +T1 T6 T5 T9 +$i $k +T0 TA T8 T4 +l $. $s $c +l $. $s $i +l $. $s $h +^e ^i ^d +l $. $s $n +l $. $s $t +i3l i4o i5r +T0 T6 TD +i0@ l +x36 T3 +i5i i7o i6t +o1; x32 +T1 TA T9 T4 +i6g i7i i8r +i3a i4d i5o +^a ^a ^a i4h $1 +i0n i2g i1i +T2 T6 TB T7 +o6r $9 $7 $2 +T2 T6 T5 T8 +i7n i8n +T0 TB TA T3 +T0 TB TA T2 +i7n i87 +z3 i4y x36 +i4e i5l i6o +i1e $9 sd1 $9 $5 +T0 T5 T4 TA +*13 o2b +i7e i8r i93 +c $o $u $t +R7 -0 x12 +T2 T3 TB +i1l i2a i3y +T0 T6 T3 T7 +T0 T4 T6 TB +z1 *03 x52 +^l ^i ^v ^i ^c +K o3b +K *54 *02 +T3 T6 TB T5 +*54 ^0 +T0 T7 T3 T9 +T0 T7 T3 T6 +T3 T9 T5 +T3 T9 TA +i1n i2n +T4 TC T7 +T0 T4 T6 T8 +i7i i8f i9e +T4 TC T8 +DB s68 +o1n i0w +i3f i4f +T4 TA T5 +D1 $9 -5 o1d $5 +T3 TA T4 T9 +o0t o2s o3t +i1a i3e i2r +T0 T7 T9 T5 +T0 TA T4 T1 +T0 T8 T4 T6 +$1 x26 z2 +T0 T8 T4 T7 +l $. $b $j +l $. $b $h +l $. $b $b +l $. $b $v +T0 T7 T5 T8 +T0 T7 T5 T9 +T2 TA T7 +T0 T4 T5 TA +T2 T9 T8 T6 +T1 T4 T2 T6 +p2 x27 +T0 T1 T8 T7 +T0 T1 T8 T6 +K i65 +T0 T5 T3 T9 +T0 T3 TA TB +d o3_ +D6 x16 +T0 T8 TA T4 +i4o i5m i6e +d o3h +i3o i4b o5a i6b o7o +T2 T6 T9 +i8z i91 iA2 +x21 o3n +T3 T5 TB T6 +r D6 z1 +l ^x ^o +i0i i1l i2o +i7r i8y +i5a i7a i6m +i8u i91 iA2 +i7r i80 +z5 *72 [ +sa7 i2e si4 o3c o6b +o1e i3w i6e o5r o4a +^4 x41 +i30 i43 +*12 +2 +i30 i46 +T3 T7 T4 T9 +$. $p $y +T5 T9 T8 +$. $p $a +l ^n ^r ^o ^c +T0 T7 T1 T8 +i3e i4n i5i +i8a i9k iAe +r $w $a $y +T1 T3 T9 T7 +T2 T7 TA +i3a i5e i4m +T0 T4 T1 T9 +x03 x35 +^d ^i ^v ^a ^d +se3 sg9 +T2 T6 T9 TA +T0 T2 TD +T2 TB T8 +i2n i3k i4i +i9t iAa +i9t iAy +^t ^a ^h ^t +T2 TB T3 +sa7 i2e o3c si4 o6b +$. $s $v +-7 *45 +$. $s $i +T7 TC TD +i0s i2m i1a +i1n i2d i3e +i1n i2d i3r +i5a i69 +T0 T5 TB T1 +T2 T8 T5 T6 +*65 *8A +'7 ] *14 +T2 T7 T9 TA +i9o iAo iBl +i0t i2m i1o +i10 i22 +T0 T1 TA T4 +i6l i7i i8f +T1 T2 T7 T5 +l i6@ +T0 T9 T5 T7 +{ *31 o32 +T1 TB T7 T2 +l $. $m $u +l $. $m $s +l $. $m $m +o0t o3t o2s +i7d i8a i91 +T4 T6 T5 T8 +T1 T6 T9 T4 +T1 T2 T5 T7 +l $. $g $e +^o ^r ^y ^g +i13 i25 +t $2 i61 +T3 TC TB +T1 TB T3 T2 +i7< x83 +sa7 i2e o3c o6b si4 +i8e i9d iA1 +T3 TA T9 +$. $v $u +T0 T9 T5 T3 +l D3 L5 +T2 T5 T9 T6 +i5n i61 +i9r iA7 +T4 TA T6 T7 +y2 D3 *65 +i5r i62 +T0 TA TB T3 +T0 TA TB T2 +o0U u +x68 +6 +Y1 +2 [ +T3 T8 T9 T7 +D1 $9 -5 $5 o1d +i28 i31 +r $u $m +l $. $c $r +l $. $c $v +l $. $c $g +T0 T9 T7 T3 +*3A x08 +i3o i4b i6b o7o o5a +x56 $k +} *42 Z1 +T1 T3 TB T2 +i3q -5 +i4a i5e i6l +T1 T2 T3 TA +T1 T2 T3 TB +T1 T8 TB +T2 T7 TB T6 +i1o i2j +T0 T7 T6 T3 +T2 T5 T7 T6 +$n ^f *23 +r $i $e $s +T1 T8 T9 +T0 T9 T8 T6 +i4n i51 +T1 T3 T7 T9 +T0 T5 T9 T7 +T3 T7 T8 T9 +T0 T5 T9 T3 +i36 i47 +T0 T2 T8 T9 +T0 T6 TB T7 +T0 TA T5 T4 +i2e i3r i4t +i9t iAy iB1 +i2r i3r i4y +T0 T4 TB T8 +T4 TA T7 T6 +T5 TB T7 T6 +i35 i49 +c T1 sa@ +$2 x52 +T2 TA T6 T9 +x03 *50 +i5i i6g i7h +D1 $6 +r $c $y +T0 T9 T7 T5 +$. $a $i +D1 $9 o1d $5 -5 +i1i i2k i3o +T0 T6 T7 TB +*21 o3p +T0 T4 TA T6 +T6 T7 T8 TB +T0 T4 TA T5 +^- ^n ^o ^n +i0h i2l i1a +i27 i31 +T0 TA T3 TB +i4n i5t i6i +$. $s $y +T0 T1 T5 T6 +o1e i3w o5r i6e o4a +l ^9 ^4 ^9 ^1 +o0y i3h $9 $7 $1 +^a^9 +i0c i2e i1h +T0 T2 T1 T5 +r $o $v $e $r +i9i iBg iAn +T0 T7 T9 T3 +i2a i3r i4k +i7o i8v i9e +T3 T8 TA T6 +T0 T1 TA T6 +^n ,3 +T3 T6 TA T8 +i2i i3g i4h +i6a i8s i7s +i9i iAd +T0 T7 TB T6 +i9i iAs +l ^m ^' ^i +i9d iA2 +T0 T8 T5 T7 +T0 T8 T5 T6 +i9d iAs +^o ^n ^r ^o ^p +l $e $n $c $e +i0a i2l i1l +^d^5 +T7 TD TC +T0 TB T8 +sa7 si4 i2e o3c o6b +i2i i4t i3n +$. $w $s +T0 T9 T4 T1 +i8o i9m +i8o i9l +D4 [ p1 +i3o i4b i6b o5a o7o +i0d i2n i1e +$. $t $n +T0 T8 T1 T7 +T1 T6 T9 T5 +T0 TB T5 T1 +T2 T5 T8 T6 +i3r i4e i5t +,4 $2 +l ^d ^n ^i ^h +T1 T2 T7 TB +i0c i2l i1o +T1 T5 T3 T8 +i2o i3b +T0 T7 T4 TA +T0 T9 T2 T8 +T2 T8 T3 T7 +i1a i3o i2m +^s ^m ^a ^d ^a +k x51 +2 +l^X$X +T0 T5 TA T4 +T5 T7 TB T6 +i27 i33 +T4 T7 TC +^o ^t ^i ^t +i7a i82 i92 +i7a i82 i91 +x24 *8A +x45 o78 +*20 p4 } +i78 i89 +E Z1 xA2 +x26 k +L1 { +i0D ^! +^p ^e ^p +i2r i3l i4e +L8 s4k p2 +i2i i4e i3l +$k R4 +.0 ^y +^- ^_ ^- +*02 i3& +i11i31i51i71i91iB1 +c^1^4 +i2N $j l +*30 ^1 +i8z r +c$!$@$# +c^5^1 +}-9} ++9 -E +i73 y2 +^1 ^4 o24 r +x05 *46 K +o2] +o0m o5u +$0$7$7 +o3z r +*2A x04 +'7 *32 +o3l ^, +o4y i59 o62 +z4 +5 +z1 TB +o2k $2 +o0y $2 $6 +z5 o8D y1 +o3> +Z1 ^v +o5b $a +z1 i2X +.4 +5 +o0g i2a +y4 ,B +^0 } -0 +^2 } +x35x17l +^J x32 +sHY$!Y1 +$Zs}S +*05L9 +i42 .5 +Z1x56 +o1v*09 +x15*B4xB3 +*14$b +y3 L7 +us3,y2 +siy x61 +smN +E^NiAy +x05 K *46 +Y5Y2x16 +spNsRs +x51 R8 +T0x29*62 +xA2x9A +s0'*26R8 +z2 i9E +T9s&%s1+ +L8 p2 s4k +z3 $d +i6$ +2 +i0= K +rC +Y2^S +st1s|U +y5*64 +^h ^c ^i ^m +o4] +$)s27 +y4*24sao +y3 *34 +ss1^x +*70xA5 +*02 i1L -2 +o3A u -1 +*75+3 ++1E +$5 *32 +x36xA2 +*08x79 +*21 *02 $3 +l $i $x +[s&%sdx +T5*40sng +E xA2 Z1 +x56x94 +*20 } p4 +z4z5 +x67 +7 +^3 x37 o16 +T5 '6 +$w x36 +x13o1b +x96x02o56 +l ^t ^o ^p +*07 R7 +^d i8d +*60 o1f ++E -9 +Z4*67 +^a D6 *10 +xB7Z3o0h +}$6C +c $e $n $t +^zse^x69 +x57Y1 +x67*8A +o1xx0A ++3 -D +*89 x36 +i4Ru +lz1s?- +i8} +c ^m ^e +o9( +x64 *25 +{Y2 +l ^m ^a ^ ^i +s(Pi4wx28 +i6= x48 y2 +*4Bx14 +R5 ^k +*37sTz +y1sCJ,5 +{ *B6 +rskr +*B5Y4 +L4 o5E +R6 i74 +$p Z5 +c ^t ^a ^c +D8 z3 x36 +swe } +$Oi9W +l $u $m +R8xB3i4d +x93z4 +Y2RB +o2Y c k +}D1i9< +x56*08o7D +x82 *81 ,A +l $ { +Ex93 +c ^n ^u +^k,7su| +o0s *24 +^ ^u +oBa'9x3B +L7s0q +.5-3 +x21o4c +x8B*45D1 +svZ +x27 $i +*42smaD6 +K,2 +Y2 $0 x84 +x05sAG+7 +R6C +y2K +sjh $r +^c*34sj1 +x16Y5 +su),0sin +xA1i9f +x96s2U +xA3s|d +xA2xBA +*AB *63 +c $o $u $r +s]' +s'ix54 +.6x6Ai8a +*41x53*75 +*04s&'x06 +c ^t ^e ^j +,4*65 +KsO7Y1 +sCvoA|slv +s]h +[ soA s8M +x1Bs'"*43 +si1 c +x57co0? +sng*80 +l $s $e $s +$c Z3 x46 +*54 *64 ] +s.-o8B +r $h $e $a $d +x57f +s!4 K f +Z2qx15 +i9q s15 +sw, x45 +o2b[ +$TT4*B6 +s +}x83 +x3AY5 +o53 Z5 +^vsq_ +c x13 +*74*83 +c x12 +^Z*31sP= +s0Dx09 +*39iBHZ5 +y5 o2. x42 +o28 x36 +s&j +y4*90'9 +D4 sfK +D4s14 +i9]*17i0# +sA)x57*15 +*23kx89 +x09o6Yx92 ++6s/sC0 +^@] +c $. $d $e +CxB2^D +*60 $3 +s7>^( +p5-7 ++4 { { +RBi9b +y2o4h +l o7R +*45k +spo +^>x7B +*79y1 +i7Ns>qi9P +sby x31 ] +s29 $e +*8Bx04Y2 +$ x06 +^^*2A +'7 $# +^Ai8e +z1+9Z1 +sAO u +o87 x61 +x82 ,A *81 +^- Y2 +o8l ^4 +l oAC +sPissZ +syt x8A x59 +sC+D4*04 +soJx64 +x89x26f +l $a $m +^y x49 +C $a +i0`c +o4x -9 +x79*06 +fx45 +s4W +s4z +z2*19 +$_*61 +,4,5 +xB4Z1o5. +^yx9B +o3y *20 +xB6 x41 +s$Sl +c $i $s $t +o6ix85 +r $a $g $e +s}CsQ[o9K +$"sLmD8 +Y5 ^2 +x3B ^; +sBDsbQ +sjt*82sU| +Y4*B8 +$''9$Y +R6l*1A +o62 ] c +y1 '7 ^1 +'B x37 +x76Y4 +Z5}x18 +d[ +x15szeT8 +.0sT| +[ Z1 -7 +z5Z3x8A +sUh +i5i x12 +$Z*41r +ssr*80] +^a ^n ^n ^a ^w +x16 x48 +oBz D6 +l $o $e $s +ET9 +r $u +*17^_ +x56 i3x +x73s5}o8x +Y3 xA9 +s&_,9x53 +x64 *42 +sT$t +K x8B +]y2z3 +c ^u +s{js0i +D2 T3 +*4B*17 +x36T0 +c ^s +Z5 x16 +x37 sos +saS^ds|, +x46 x68 +ci6iK +x35Y2 +c ^f ++2o75 +o0m i1o +qs . +'8 y2 p5 +c ^l +$d *19 +E*B4$N +t*09o8u +u*B8,5 +xA3 k +x56 *47 +[ T0 +o0f +7 +*37 *51 +sn $2 +$w x54 +lo9G +$[swS +x25 Y1 { +c ^E +x8AY4] +x64 i8! +.2*13 +TBCr +r$/ +ux1A^m +[$cs39 +t i3M +x76Y1i0v +x68.1 +*25 .4 +*69i7W +x2B y2 +c ^h ^g ^i ^h +s)m]$j +o3Sx76s[Q +Z1T8 +*47xA8 +-3 o2c +x6Az2 +o3I p4 +s@e*16 +oAho4j +saYsF+$% +x1Ax1Ao0@ +^q x41 +'5y3o6. +c $l $o $o $p +*65s>?t +c $t $h $e +D8Ei0$ +l -3 D6 +x56sm\*5B +*16k +s1%oB1 +Es}`k +syV.A +*64+8*3A +x24 r Z1 +x25*9BZ2 +p2 x53 o5u +^o ^h +i61} +sYKx0B*97 +u o7" +s!Y$\ ++1 ] x4B +Y1 s19 +z4*87 +$5 Z2 x91 +i4, x82 $2 +[ +A +x36 o83 +*28x84 +sbu *06 +iA4sIXt +iA9 ssD +i1LtT6 +s9bl +$5 x91 Z2 +i3g *14 +o7hEsxz +Y3-0 +oB5*78 +x75x1A +s9l +x94 $Y +x7Ai0` +[x8AsG[ +Z2x54C +,A*06 +Y3s,yx17 +sM%sBuT8 +y1 x58 +L9}z5 +x53$Zx79 +i2Tts5{ +o3k D0 +*02$z +^j*72 +^d*B1$S ++8*60 +s*j +^U*B8 +Z5 o51 +}sHPu +$fr +z5 ^3 +t x73 r +i0Ox48s42 +i5p ^1 +p2 $d x67 +,0iA+ +*95i3v +p2 *40 *5B +^x} +-9 x45 +srvs _ +x94 R9 +o9# oA5 +i6^x73+9 +saRsSY +x42 $i +p1 x28 ,9 +x34sntx6B +*30x9A +Y4 o7c +^Yx4A +shvs{O$m +s_; +fx63 +x05sk. +{*76 +}*76+9 +xA4 x26 +fc +.4*A8^p +x38Ci11 +o7-} +^w -A +sMX +.1x45x36 +x45 DB +*47 K +i9kssUTB +Z4x38.9 +i5T u +x32*46 +s*X^v +x15 sfn ++BsCG.A +Kx23x65 +x13 sjw +C k [ ++As%8^. +k x4A +x91sTv +ci19 +i00k +$e x6B +*68 +2 +x24 E +i9ol +uD8xB7 +x85,A +x54 $v +Z2p4 +i12o9VR8 +sKn +sgA +x34z3oA# +*21 d i42 +,9Y3D0 +p2 *5B *40 +o0j o2b +x25 x79 +x02 d x04 +iAss-8 +x85 x25 +-Ax26y3 +.1 o4r +^Z*8A +xB2s.3 +*6As7- +o1h k +o45 +3 +sz|'6$d +t o2$ +svV +z5 s02 x18 ++5 x64 +*97Z1 +x95'B +x97 x6B Y2 +o8iZ5 +z1 y3 +o6,xA2 +$@ c +D4 x04 +T1i69 +y4 *21 +u *42 ++7 o0m +E *52 +xA1 o5o +x31*25*79 +z2 x67 +y4T6 +sv* +y2 *32 +x95 ,5 +^l^A +o9LxB2+9 +*26 k p3 +^#sx_ +x42.2 +p5 i6f +,6$p +y4 +5 +*98 p1 +*50 Z5 x26 +*B5*A0 +-4 z2 +p1} +iBu ] +*03 x02 +x13 x96 i4n +s}'s4uE +*B4 $g x08 +K$5p5 +R1sl3 +o5!Y1 +iAjui6U +^#x72 +{*64x72 +c $1 $2 $3 $` +{ x67 +c $1 $2 $3 $[ +*48 x86 +t ^E +T1 $' +s@ms}&L6 +o6f x42 +s9% } +x63o7_*74 +c $1 $2 $3 $; +c $1 $2 $3 $> +Y2Y4 +ti0hsU# +x52s"!s+} +sh5 +x6A k i1g +DB Y2 +Ei32 +kY1x73 +-6 *07 +si3 +0 +i92tz4 +x23 $y +,0D6 +x63t +syB +x15s^Bq +T1 $i +s0>*52 +*BA *34 +z2sW?$A +[$C +*67 x85 +-5 p3 o8W +x12 $9 +Y5 s20 +x12 *40 ^m +*57 *51 +Y2 xB6 +t$c +^q-7.6 +*B0$\ +*48sbK +o6w] +i5o i6$ x63 +K d xBA +*56 D9 +^l]x65 +T9xA4 +sl3sB4i7L +^y ^d ^d ^u ^b +s1w*1A +x04E +]x97+3 +l .0 +x42 ^b x41 +i9i x2A +*B4 x08 $g +$T p4 +x85sAQ +*21 l +*30 E +x96 d +*47^Y +*95xAB^= +*21p1 +sj9 +D1*26sF% +y2 p4 +o6FxA2 +*58z5s(5 +x41 x52 +x96 K +x1A y1 +k o3n +z2x58 +z4z4xB2 +sT|*9As0H +i9;sZ{ +sYX*87 +^fx26 +o3o i3b +^h ^t ^r ^o ^n +r D1 -3 +y4iAbx1A +$f x29 +o0z } z1 +y1 s1g { +s|c'Bz2 ++3iAt +x72 $] xA7 +st; +iBSx68sQ* +-8i3d*74 +o4m'8s37 +xA4x87s3G +x9Bz3 +x47x73*92 +^x u +st! +i38 K +^Vx41 +,9 TA +o8q.A +*96s>g*9A +z5 x18 s02 +sO4i8^ +^7*27c +*60x84 +s9d +s7#sb4 +sFL +x36 y1 +x45[Y2 +^B R0 +i0a p2 +$H $B +z1s%?.2 +z3x14Z3 +s?o +s$z +y1 *43 +sop*7B +sbn k +*10*52 +sfnsEuxB9 +x58 i4x +x43$z +x15 *61 +sy.x32 ++1 x4B ] ++0k +i5l x72 +*A1*06s*g +x93 x15 +D8 } +K x8B D9 +s|-s2a +x07$@sV/ +x87 -5 +iB; +x31 o10 +C x32 +TB T2 +x42u +x61$C +^| $| +y5s$b +*1B x74 +^l ^i ^b ^o ^m +o87 ] +c x18 x16 +x19 y2 +ux24 +] x52 +sz" +c*2Az2 +*9Bx86sKP +x39 Y2 +sfds"{ +*89 x94 +Z4 x89 +.8*30 +Ki2y +Ei9\i7H +x36sL(i9K +sLFx26 +skQR4 +,BsJgi1Y +s_N*58 +o0r x91 +Y4xB8xA6 +,1i0S +*4Bx93*79 +$R*87k +$*k +x87-A +*12-5 +K .B +$5 .7 +^y ^t ^t ^e ^p +szb+B +^t sgc +iADsl1f +x03E} +.Bs]eT8 +*31 y4 +x81o6I +i4d d +}C +,9srv +R8 x06 +$/L7 +s#RsMj*35 +z4 x28 p5 +sfMT0 +T0 o1A +o0b y2 +o0z z1 } +-2o73Y1 +^=x8B +z2 x48 +*A1i1m +*04 ,6 +i8F*15 +x63 z2 +slb Y1 +oA)s0+ +t$Fx4A +$e.2 +*A7s!#so; +-6{ +*05 o1h +s+j +y5sbyD5 +x61 ^? +o3j].6 +s+! +T0 k i2! +sG. +.6D5^n +^s ^e ^n ^o ^j +.B x74 +*27 x86 x13 +x57 $0 +*57p1p4 +[RAZ4 +^p srk +qs1jsUO +.1RAt +Z1oAh$C +x16x97 +x85 *69 +] x59 +*27 k r +p4 i64 x14 +R6 ,7 +o7r*34s]x +,9 k ++2^A +$& p4 +'BsdFi7v +C^ss^c +*13 Y3 +i9Hx2B +se_ x06 +o9e*34*73 +*23 i2f ++6{ +o4 sKT +c .1 +,7 Z2 +y5x36{ ++2D4*43 +o9y slj +l D6 -3 +srh x6A +$[sk] +x51 R1 +*A7i9%Y4 +[^! +s'D$} +sd? +z5] +Z2 *38 +sTYo2o +sd@ +x63 y5 +x49i0n +ux3B} +o9z Y1 +s/s*30x26 +] sr4 Y4 +o4bc +Y1 *50 +*85i3psJ` +r *43 +x74*9AsG, +x91 $6 +o9w [ +x75 x04 +*9Bo7vTA +p2 x67 $d +s]P^? +*09sc@ +x64s2L +Y2Z2 +{^n +sWAT0x84 +z3 -8 x93 +co0x +R7T9^] +i84 i2e +x3Bo3W +^9R9 +^h ^s ^i ^r ^i +o7S,4 +^e,2 +x5Bx05 +*8A}*04 +,9s#B +o1OsymsYm +sOeT8 +oAu.3C +x05 u +*51 y2 +x96 z1 +*68Z1 +i5c s62 +Z1 x9A +*6Bo07s^) +x59i3_*84 +[sSs +s'- +i01 i8o +*21x36q +y4 D2 k +Z1.9 +o9@ x06 u +^q*89 +y4 k D2 +*65y5 +sd*}R0 +so,x42x81 +x16 p2 z2 +*69d] +sqv +iBi x16 +c^\sP| +sxXY1$E +^y ^n ^n ^e ^d +oB= +x09i8Fx9A +$'LA +-6*25,A +K*B8$& +*A5 p2 +y5 $4 +o2e*70x59 +^y c x07 +o0z x72 +x12xA7^K +x92 p5 +x71^eu +x48o9a +o1&,1 +o9"Ki00 +*51 x29 +$nx84o5p +*89o7u*14 +.BoB'Y2 +.1 o5k +*BAx02 +K ^u +$>xB1sDj +x76xA2 +y1 -5 +s6v +*86x62f +.4 *60 +,5 DB +x01^9 +x02 +5 +^u p5 +Z1xB1x2B +z4 q x5A +x02 +0 +] Y4 sr4 +.5y5 +i6Ms^f*A8 +x67 x78 +*40o58 +,6R4 +K x96 x42 +z5Y4x94 +x87oBhs1` +sn#*AB +oB}Z5Y2 +c x18 +^r ^e ^v ^e ^n +i5Hx57 +xB8rx41 +i5axA2$a +l{z5 +s7!-7*53 +i7D x59 +s!t +x42 o1u +k o3k +i6s x73 Y1 +s7& +^HxB6x71 +*69si4i9L +y1 { s1g +s5@x63 +,6*10 +.A x54 Z1 +i3a y4 +,5 q +] +4 $1 ++8o00 +s)@o3Y +x17 ^A ^L +sH|Z1T2 +.5i5B +,7*17sQn +,8 ^y +t sdn +z3 x93 -8 +x17 ,6 +sPy l +-2 x47 +iBIt*79 +k i58 +$6o8y +sc(sr(R8 +$4 *04 +c x16 x18 +}x76 +^c x02 *07 +}sSX +*93oBOs0H +*94rx72 +y2 x68 +$}o8B +x59 c +*87 p2 +i2o x38 +.A Z1 x54 ++0 { +*B0i4I +R4 y2 +s&uscS +ts0E +*3A x92 +x24 D3 +ser *58 D4 +Y1.4z4 +]*87 +x26 ,4 +u-5s?U +c*13 +*57 *69 +x4A k +Z5x7A +x18 o3n +sTl +q } +o7P ^l +*20 ^9 +*76*34$5 +st7 x57 +*43^mE +l$j +s1X] +*B8sr5*59 +Y2 x3A +x36sj4 +x37 ^c d +*35 *15 $0 +sgD*06sdJ +o3f*78RB +z2x96x24 +^d Y2 +[ x48 +DB o0p +urz5 ++6 .1 +ci0Wx78 +t.8} +x62 ,7 +*75 *67 *98 +$4o1l*40 ++6y2 ++2*03 +z2 +3 +*96R0 +p4 o7l o6a +R7*53 +Ci8n +*72xB5k +T7*B1+1 +x76 *04 +]*31x48 +k$Z +K *59 ++BLBo1c +}-5-1 +iA9t +,0Z2o7M +*7Ascq +x78i2x +x47 xA4 +*38s(%R4 +z5 D8 x51 +o31 x65 +R0s)N,7 +x23 ,4 +s.8L9 +*03*57k +c $o $v $a +^g ^o ^b +x32i0t +rCs-2 +x76oASs.y +'Ax01T4 +o9BsO( +T7} +t x63 +qx97 +o45 *14 +}soI +k^z +k^g +sw[ss_ +D0 se6 +i6aT1*B6 +$0 Y1 x71 +D9 t +$c sgd +*19^` ++4.8x52 +i8!sbI +iBT^y +Z1*85D2 +sN-Z1*60 +x39 x65 +Y1sim^b +$4 D1 +s62[ +x03 ^$ +i8d.A +o32sqBsS0 +o8h p5 +Y2y2 +o2w d +o6! *46 +T3i8Q +o8.x31 +x71o7hx81 +$Tx83 +y5 d +.7*76s8v +*73 x62 *08 +x3B$F +R2 Z1 +o1X$Lo1o +'8i5# +i75 l +1 +f *64 +i2v p1 +] i4i ++3 +0 +i1#*7As?U +*7BT3 +o5j +8 Z1 +*B9s9C +o4psL^o7i +o2Rx69o0K +*09 l [ +Y1s@sk +sMh,A +sshsVu +*62 x38 +sfjs)E +s?Iku +Z2 o1- +.0z3 ++4 y1 +r*73 +su;iAY +*10,6 +s/r +KsPE$c +$k $a +s2c [ +$Dx0A +C x42 T3 +o2$sUV +y2 *B0 +D9*A3R4 +*75 *98 *67 +i9y x95 +*23 ^' +x2Ac*80 +i6H*A7 +s1u$, +}x85*A4 +Y5x58p2 +T3{ +-6s-_r +] i4- +*A8$F +xA8s2 *A7 +*63Z4s<$ +Z4x38 +slZ*A7x04 +c*72Z4 +T0 $b ^P +[TAy4 +sw0soK +sNMi9T +i6#.2 +xB3s2L*14 +*02 i1q +D3 u $4 +-4 *94 +iB[qs4! +T3$@ +oBpL9TA +se5x39 +*94 +8 +s!Q +*07 *08 +o8BRB +D1 o3O +*42^m +[ oAG +]$tsi^ +o7} +sCPlR5 +{ i7E p2 +s-0*A5slP +sql +} p1 s1? +d i6x +x01Y4xB9 +i62 ] +{ sp- *80 +y2 .3 x62 +x32^L +} s1? p1 +{ sYE z5 +} iBO K +*B3f +i5ps>X +^e ^g ^d ^o ^d +R6 D1 +o7Qx61 +} p2 sW, +z5 x39 +c z5 x18 +} s/e D8 +^o ^h ^w +x43 s2i +{x8BK +{ *80 sp- +} D8 s/e +T3$L +c *26 x47 +p1 $v x73 +i6N*B5ss( +o2' } +.3Z2 +s#_ +sT2x85s/O +ED2LB +x9B.7 +} sVR +^asW(y4 +Ks#/D4 +{ z5 sYE +[x96T6 +'B^1 +Z3x68 +*03$6 +Z4sV| ++1oB! +*09se1 +s[`$j +$DsJG +ED6 +o0vf +D5 o6o +sjX$$sf^ +^y ^l ^l ^e ^n +*05xA5 +o4d-9 +*39$N +-6o9> +o1k L4 +^koAx +i3L r +y4s}Z +uo2$xA1 +sBGR5sd4 +*3B]] +} sW, p2 +o58 x31 +scFx15f +fx46 +fx39.4 +[ o4% +x23x3B*2B +D2 +5 i5# +d*42 +*65 u +sdzo2a +] o7u +p3*B3 +x65-3x64 +s2oz1 +x51*48 +sFOp2 +xB4{p3 +ux74*43 +x32i7wy5 +[y3*B3 +xB8T6 +*63 x41 +D3y3x62 +s76$f +LA$t +^y ^n ^n ^a ^f +Z3x24sUE +$ox27{ +x2Ai39 +*9B-6 +l x78 +*30x92 +sE+y3 +x72xA6 +CsY7 +$0Z4 +i5iL8$t +D9'7p4 +s_v$c +x49l'8 +i35 R5 L5 +*1Ai9D] +,8K +D7+7 +*02x87 +i35 R5 L3 +'A$) +p3 x15 Z5 +sj D0 +Y4^2sa% ++7sZj +x61 p5 x72 +x64xA4 +Kx19x46 +x78*67x86 +x72 Y4 x63 +o7hi6u +c$J +*A2y5x03 +x78 y4 +L0o0hi8) +q D9 +kx68 +stax94Y3 +*46$uxB8 +*67^jsGY +x26i2p +i59 L9 L5 +x6B$2y2 +i56 L1 L1 +,6*09sV( +*B8 -7 +{s#Bo0j +x38Y4 +$hY4 +D2[x2A +s>b$c +*39.6$m +o6=Z3Y3 +*71xA6 +k t Z1 +y5i9'x93 +i34 R2 +sZL*B3i8z +x84*2B$c +s6?+5s3h +cx03x59 +sJesXa-4 +x34s6E +T4s*v +D6 -4 +x3A$y +s}JsV**57 +,4{p2 +}iBMi1f +z1^b +s!2^w +ds"l +*A5oBX[ +$"*3A +Z1*23+2 +*1B]x78 +*79^` +$ ,2,0 +i71 R4 R5 +x07s}*$b +Kx36*8B +.7$m +sE\x63oB8 +Z4,4q +^'sLG +x54*65o6r +*2B]$g +}p5 +xB6Z5 +x53o60 +iBg x17 +i5Ox53 +x2A$MsrG +-2y5sL" +i2l u +s"'*A9Z4 +'9D5iBC +*39*54 +*B9-1 +q *87 +x51z1 +-B*34sG$ +$V c +i73 L4 +qx79 +Y3x64K +*93o6yse, +$8 q +lDBi76 +.3LA +$8 r +*64x41x4B +{s]%*20 +*58 x92 ++1sSg +*4Bx42x79 +Z3Y2 +,4C +R9x65y2 +o7T+9 +,9*21x47 +sHFx73*A2 +s["x24 +,8.3*24 +oAa^h +x7AsaGp3 +o76^w +s_`+5r +$)sFU +*B8o3h +*A4s*Lx63 +Y2*B5 +x31*12 +*45xA5 +D0s80u +s.g$y +x82^e +x19*54 +o3c*95x78 +x4Ax52K +i7os{$x4A +*09}Y5 +p1x78 +syDT8 +s46x34 +*73o2fx96 +}sj{ +.7y2[ +Z2o6Px64 +.9[*A3 +y4s\! +i1e R2 R0 +x95+Ax94 +L8 x35 +i5?y4'9 +oA?'A +oB#s]7Z3 +Z1y1 +sSJ} +i72 L6 +x68.4oAZ +o0t*92x72 +'6p1 +s=sx65 +i52x19*A5 +R7 x12 -0 +x43Z5 +co33 +sIdsNGi2s +xA6^g +i14 L2 +x53sR\ +*68s?Q +*3B^wx54 +,4D8*28 +oA"x02i1r +o6gs*k*89 +o3k ^u ] +s_}x24x0B +x73x75sL\ +x5Bo2r +shOxBA-4 +i37 R5 L5 +q*80 +i16 R2 R0 +Y4x07x6B +]i5ml +Z5s&Issy +s?NK*83 +x84$j +$gx68*3B +.3sYt +i73 R4 ++2*95 +y5} +x65^HD1 +swfsokx75 +^l*12 +*79.2D9 +iBSsgdx02 +x94,3+3 +R8x76 +-6 *37 +*B8sj2*71 +Z1'B +Es89 +Y2o7fxB4 +sXPi83 +Y3o99 ++4x59 +sRi*23 +^dspPxB8 +o6ho6d +s!c$q +$.x7A +]Z3 +'B*20 +i1f R2 L2 +^r*78 +i31 R4 L3 +*89D5*86 +*84*52R6 +sufx73 +-4s5< +^ou +xA5R6 +D5p2 ++8sViY4 +sK5*14 +ly5E +,8^2 +o3m $o +i57 L5 R7 +i31 L2 L2 +*78x92x93 +*35y3$6 +^wT6y4 +K i64 +L8,3 +i1a R5 R4 +*5Bs+\d ++1y4 +Y1+A +x8A+1 +*49,8} +x78 x45 +sO1x73 +*92Z4sCI +Z2 *50 [ +DAx87^u +f .3 +x37^b +i1d R8 L8 +x04^gx78 +f .8 +x52t +s Ess%f +*B5i1fo1v +i16 R0 L1 +i59 L5 L6 +i1lo4.d +x02T4 +x92r +sK_$w +*30y4so[ +x7B p1 +,2x57*A7 +p1rs=a +sE>iAm +i2i ^z ++A*02-3 +sU['8 +*79D4o3p +sOCT8 +^Ps{R +oB^D6$w +su2 -8 +*62sR&x19 +$s Z3 +*14*A2 +*15 x95 +x0Al-8 +^7x84 +x86 -1 +sihy1x03 +Y2f +*40o0rp2 +rs;U +xB1o24 +xB7sR"-2 +s'ry4 +D6 i1o x57 +L4 t D2 +x89$; +i38 R0 L3 +s(|x75s8U +o3d z2 +Z4x32 +*A3i2e +$zxB1 +s KE +s&%D0 +qs\. +o8lY1x64 +o8&,6 +i27 $3 +x21s*yi3l +*59 *98 +sxDD7sGl +s'=*15Z2 +[p4 +,5 $a +Y2svP +*54d +['7 +x62s]F +i77o2n +^m] +xA3 x74 +x62*A3L9 +i0|{ +*2Bo80 +dx03 +x2B+3 +i17 R5 L1 +x65u ++2s$W +$7x34,9 +xB8^x +xA3x65sm` +*2A$c +y2 ^* +*23*97 +Z5D1 +^9y1 +i14 R4 L1 +z1d +s^XZ5x28 +*73$1 +Y1Kx31 +$y *A1 +i2sx59 +[sp*+0 +s[r$jxB4 +tx32 +y5x97 ++4sl(sY> +i1b Z4 +o0tT7 +x94$;x73 +z2 ^k *53 +i0csf# +uf*14 +Y3x34 +i5su +p5D9 +$vx62 +i70]i88 +s_V^b +$1x43 +T0T7 +x83 x43 +i2oxB1Y4 +syas@` +*45x52 ++6s+^x27 +$md +i5i*76 +x6Aty4 +i0eoB6s!@ +i3c R5 +p1x06 +$D-9xB8 +i38*89 ++Bo3z ++7x38 +}^a +li5r +x01y5 +Ey4sJ{ +xA4D4x97 +x3B*48x54 +y2i6ex82 +,1x45d +TBsd4 +o7s$* +x7Bo5S +.1x6A +*B5o2m +*21x19 +*BAo8i +x04sRf*81 +o3cC +*A9+B$v +skg]RB +x05 o3U +*53x62'9 +^olT9 +D5 o4+ +*7Bo3m +Y3D6 +s52Z5 +s8Uo1k +xA9.1Y1 +z2z4 +x63C +RA*AB +*56sRMx43 +p5*75 +R4oBi +$oE +y4x47 +'7*65 +*B8x65$o +oA&p3t +*84 x5A +sq-sAfo4l +uxA2 +x26*12L9 +o0Tc +s}kx63 +[ [ $3 +*35$3 +[ [ $5 +*23xBA +x0A x09 +*8Ao5f +*07+9$c +xAB^e +i0n*09 +i0] ^[ ++BD3 +*34*25 +*89tY4 +xA5 xA1 ++0*95*16 +o82xB8 +s(6,9,6 +$s*53x9A +$us;$y4 +i11 L1 R4 +s|fo1h +y2x71x3B +,7u +x34s,< +^o i1' +z3oB]s1s +*1AD2x39 +x13skSi85 +xB8 x07 +o2U x53 u +*A3x23 +i39 L2 L3 +i58 L4 +sp' +o1V*58+3 +i18 L1 L2 +s5Xx83z1 +y1T0C +c T2 i2. +^[x75 +D9 L7 +i70 R1 L1 +sOT +i5c R9 L9 +.8xB2 +*04,1s3r +x71 s2x +srL}*35 +to77 +$]sc@ +^4*31 +E.4 +s`{o45i22 +y1 xB9 o0q +x3A xB1 +i3c R4 +sVkx16} +i32 R2 R4 +i17 L1 R5 +sY? +i15 R0 +i32 R4 L3 +i3c R5 R4 +^e*72scT +T4z1.4 +i94*4BL0 +sWQ,3y2 +*26iB8s]D +Z5x17*06 +T1-8i25 +i7e R3 L3 +i16 L2 L1 +xA2k*79 +i32 R2 L2 +Z3*1A.6 +*54*3Ay2 +i19 R8 L1 +i72 R2 +D3 o3j Z2 +T0 o9A +i1e R0 R2 +{.7 +i31 L3 R5 +i79x62t +s7a +,2 u +i12 L2 +i17 R3 R2 +p1 x03 x53 +x95 $x Y1 +s#rs>) +x28z3 +i55 L4 +i19 L2 L1 +Z1 o3! +r x53 +z4 } +$t x4A *38 +i34 L3 L5 +i37 L0 L0 +^vc +i59 L2 L2 +k*09z1 +iBM*35 +sD{i8=.0 +i70 L5 L6 +iBG +soX +Co1r +x32c*98 +Y3*94x14 +i16 L5 L1 +o4gR7 +i5b R4 R5 +sJh*A5 +t +4 Z1 +i33 R2 R1 +i34 L1 L1 +*20z1x37 +*12 *68 +i36 L1 L1 +i8` +*67 y1 +x43s_}E +x26^% +$l t +i88 x32 +LAi0ao6h +*72 } +z1 *13 D5 +rY4 +x95o1E} +^no8O+7 +sn; +iB(s.X +i16 L1 L5 ++BsxG +E x49 +sp5 +*75L4 +i95 i4| x0A +i16 L1 L2 +i13 R2 R3 +y2y2TB +*52 R6 +i17 R3 L1 +i34 L5 L3 +i6m y4 x07 +.1sat*69 +-6$j +*01 t +i3c R5 L5 +*28$1 +i31 R1 R2 +i16 L1 R0 +i16 L1 R7 +s^eD2y5 +i33 L3 L7 +i5e L6 L7 +*26 +4 z1 +f x17 D5 +i35 L1 L1 +*17x42o4K +$0 p5 +iA8*BA} +x89^>T4 +i37 L1 L1 +i33 L7 L3 +i39 L3 L2 +x08 $b Z1 +Z3 o6s +7 +x48iAa +i7d R7 L6 +i51 L4 +i51 L5 +i52 L4 L5 +xA2r +x47+0x84 +*19Z1Z5 +x89$aY1 +'7 x51 +i33 R1 R2 +i70 L4 +o0Do9} +x21 ^y +i37 L3 R6 +o8p *20 +i37 R6 L3 ++5 L0 +xB7sQD +i10 R0 R2 +tx28 +Csfws$h +^tx14 +i6p o74 +i33 L4 L3 +i70 L6 +} *50 +o8[x69oAS +z4-B +i35 L3 R5 +Y4 i0i +i31 R5 L3 +i78 R2 L2 +i1e R5 R4 +i57 L5 L6 +i57 R3 L3 +s3gx2Bi2@ +L3x58 +$hT6 +Cx97o8X +$1 D6 Z1 +o9cDB +x34{ +s*r +x93iB= +D7 x27 +o6!s\$o7V +sc! +i79 R8 R6 +i3f R4 R5 +x04^mZ5 +C*03 +i37 R4 L3 +i52 L1 L1 +i57 L3 +R1 L1 +i57 L4 +o7Jx4Bk +i18 L2 L2 +i19 L1 R8 +x74 '8 l +i57 L6 L5 +i3e R0 R1 +^,*70 +-4i7!iA0 +sY'o5) +*12x93t +sw +i16 R7 L1 +o90i2E +l.3} +i39 L3 R6 +c $7 $E +*B9rR6 +^a ^d ^a ^d +i32 L3 R4 +i7Ys70*64 +i30 R4 L4 +sk6 +i38 L3 R0 +u ^7 ^f +i5b R5 R4 +x62D0 +u ^4 ^8 +*24slwo3C +^l ^a ^m ^a ^j +o31 ,4 +sc6K +.7iAs$H +{x95 +x16z1 +$A{st| +u ^7 ^8 +i53 L4 +i53 L3 +i14 L6 L1 +z4x16 +u ^7 ^3 +c$.*92 +^e ^o ^j +^/'8x9B +Y3s0Ly3 +-5xB3 +sW7ExA2 +$n ,7 R8 +i73 R2 L2 +u ^4 ^e +i7d L6 L5 +i59 L4 L5 +u ^4 ^f ++3 $7 -6 +sgX +u ^0 ^f +i79 R3 R4 +i33 L2 L2 +i6a o5r +i3d L0 L0 +*09i7| +] $a *64 +u ^c ^7 +u ^c ^0 +Z2*53*1A +Y1o9d +[i4D +*02*5Au +sv5 +u ^c ^3 +u ^c ^9 +R6*78$a +] $1 +4 +*68xA7E +u ^0 ^9 +*56x68 +u ^c ^d +*3Ao6ts|O +u ^c ^e +i5a L7 L6 +u ^3 ^b +y5Esk. +x71l +i17 R2 R3 +i5a R2 L2 +*36*29syo +*45.0o8[ +s!c +^yT5D9 +i14 L1 R4 +i1fx09 +i19 L1 L2 +u ^3 ^4 +*59x98 +i10 R0 +u ^3 ^1 +u ^3 ^2 +i52 L5 L4 +i16 R0 +saTY1s1F +ko1Px49 +i37 L3 R4 +i3i x02 +$#*03 +K*12Y2 +u $B $C +u $B $B +]*A6r +i70 L6 L5 +i55 R1 L1 +y1*24 +R2 L2 +*19x78 +i3d R1 L1 +x51 so '9 +i31 R2 R1 +u $2 $A +i59 L5 L4 +i7d L6 R7 +i59 L5 L9 +x81T3 +i17 L1 R3 +i74 L4 +u $E $C +i3d R9 L9 +*52 x51 +i4`x46 +c ^3 ^c +i32 R4 R2 +sph*12sR6 +i15 R4 R4 +^a ^R +o9=s5boBl +u $f $3 +u $5 $B +i59 L6 L5 +i3b R4 R5 +i31 L3 R4 +i76 R8 +o3b *02 +c $f $x +.8p4 +i79 R4 R3 +s-`L2 +i16 R0 R2 +sa4R2sI7 +T7 x05 +i5e R1 L1 +i32 R4 +c $A $8 +$/u +o54*26 +*A3x58x2A +i15 R2 +i51 R1 L1 +i53 L1 L1 +c $A $a +i7d L5 L6 +i13 R0 L1 +i54 R4 L4 +c $A $E +o3v^I +u ^f ^0 +i74 R3 +u ^f ^4 +*06iB9*A8 +i33 L3 L4 +i1e R4 R5 +li4V*A3 +-2 -0 +$8 -3 +i37 L2 L2 +i37 R4 +i39 R6 L3 +s[t +i71 R4 +$k x32 +i12 R5 L1 +u ^a ^9 +R5 L5 +i50 L1 L1 +Y4*58*B3 +i36 R2 +i3e L6 +i31 L0 L0 +i39 L4 L3 +*38smoq +sFU +i77 L8 L8 +D2 $1 D6 +u ^b ^6 +i3c R4 R1 +i3c R4 R5 +C*75 +u ^b ^4 +^s ^l ^l ^e ^h +i55 L1 L1 +i79 R6 R8 +i14 L2 L1 +i37 L4 L3 +^9 ^x +i71 R5 R4 +u ^e ^7 +i13 R3 R2 +u ^e ^0 +u $D $2 +u ^B ^B +Cy3 +smax78R9 +^a ^m ^m ^o ^c +Y2o5A +u ^F ^A +i58 L1 L1 +o07 y4 +^[ K +*90 Z5 Z5 +x85 { +u ^E ^C +Y4-4] +s#9 +o7t x21 +s#( +^a x31 p1 +sve +t x57 +u $F $A +u $F $F +sQc +sQn +Z1^k +p2 *87 +Y3 t +*63 T2 +[ K sw% +c ^e ^C +c ^f ^b +c ^9 ^b +z4 x7A +$5 ^x +{ o4# +D7 x85 +y4T3D5 +x08 r +u +3 +sk5 +*A7x98 +$/*25 +o5B *15 +i3y x13 o2D +oAa*94 +sE> +c $B $C +xB1y5} +L8 L9 +oBt x28 +^s ^o ^s +c ^D ^B +skM +sk] +sRno1YD7 +sL C +u ^D ^C +c ^x ^A +T2 *51 +p2 x78 i3M +c ^c ^d +c ^c ^c +o1Q +u sFS +u $F $1 +i8sZ2 +o5} +i9f} +xB7Co1Q +csev*4A +sDq +L2 '7 *53 +R0 R4 +^w k t +x47z1,5 +u ^8 ^4 +^d ^e ^t +*45s@Lo8; +Z2 ,3 +$h s+j +k*08 +L9*78 +R8D0 +D1 x36 +y5]D8 +d *67 +*21C +sczp1 +sLv +*27s`Q +*21 $W +Y3 *93 +o8}}^p +i0ay1s $a +k .1 iBN +Z2semssY +i4k R3 r ++0 +4 +A +Y3{iBP +$+ z1 +$0 *95 +xA2i5> +^w t k +x83 L8 +*64 Z5 *32 +u x54 +x39ro4? +c snj +o8< *78 ++B +E +E +sLs o5h +x39 +0 +ui5A +${ y3 oAw +l p3 ++0 -1 -A ++C -9 -9 +c x84 *63 +^y ^l ^l ^a ^r +*96 c +x43^3 +Y4+2p5 +sF< +$O K +s2D ^0 +*56 *13 u +RBi0> +sfy $o +x21q ++B +C -1 +^Jx01y4 +x05 x13 +*60 o22 +'6o60$_ ++0 +D +D +*68 sZ8 +C $2 k +R2 $6 z4 +s*l*0AT9 +K$AC +*05 z5 ++7 *30 Z1 +q x74 +C o0j +o2U u +xB1sNj +f *75 +y1 ^R +*14 i3z +iA"*93DA +o9m x25 C +i4O D7 +o7% x51 +s(i +p5 ^w -4 ++8 +F +s2D d x1A +s(J +x15-9 +so@ x05 +*26 -2 $5 +s"+ +s52 'B +x83 Y4 +Y4 .1 *52 +c $n $v +se= +s"! +$k x06 ^D +x4B*1A +-6 su5 +{ *20 u +i50 i1b +xA2 s0a D8 +s_W E +sTn +*9A s1c +i2j t *23 +p5 s*\ +*20 ^` +i1b i54 +*15 z2 +x16 $_ +-8 -F -F +s&` +s&q +-0 -C -B +$'*A0s{A +*64*A9ss/ +o3W T3 Y3 +o5>iB# +i7D z1 +*64 *32 Z5 +sBl +o0c ^s +Y1 k TA +i74 i16 +Z2 x09 { +i2 *68E +xB3*9Bx67 +*32sxf +*07lZ2 +*75 } +*01 *4A x57 +'6 q +T5 *45 T1 +{ Y5 +'6 [ +y5 *A7 +$My2 ++7 +A +A +-5 -E +p3 .A i0& +spq +sn! +i1c i73 ++C -B -0 +.9^;s-] +D6 x47 +^U ] +,6 -6 +o7, y1 +{ ,B +o0iy2 +s)+ +*A1 C x08 +z1*71 +i3d i58 +*9B x74 Z2 +}]d +-5 ^U +R7*36*93 ++0 +9 +9 +s'G +s.i y3 +^s ^u ^c ^u ^m +*0A *01 +,7 ^h ++6 +A -0 +x53 D1 *15 +s'Y +oA) +sXcs^Us^` +-C -C -E +D1 L3 +-8 -D +i7f L6 +R2 z4 $6 +-8 -E +o55 Z1 t +s'= +sx= ++2 x57 +x38 ^y +$F o9w $c ++A+0 +*63 $0 +sdY r +} u k +sr^*A4 +,8 Y1 ++0 -A -1 +sUA +L0 o56 +^e ^n ^i ^n +sN$x49 +i3S z3 +p5 s$f +c *63 x84 +x76k +l *1A +L0x27 +x08*20s)Z +*41$vT8 ++A +A -2 +'4 Y2 +R1xB5r +Z1 z4 ++C -1 -1 +R4 Z5 x67 +D9 L0 +s8z +i79 i17 +*B4*09o4; +*ABx89 +^3x04iB4 +o5p t +$t o7f +*30 o2a +x07 Z4 +i79 i1b +-0 -0 -A +z2r ++9 -C -C +$2 Z1 L5 ++D -E -C +i30 i12 +sFD p4 *6A +^u $4 +^y ^d ^d ^e +.5 z1 +R6 } l +snu t +c $k $i $s $s +i75 i36 +*21 s0I +s_G +.0 *A9 +sem x45 -2 +*19i5U +u +A +z2 '9 +*58 [ +*76 ^P +'6 *23 +s6N +$O x45 o6e +[ ^- +sFvoBV +^e ^l +i51i69i78i84 +*54 *69 x03 +x56 -6 +-D -F -F +x37 slR +$!$] +^) x14 u +x41 d -2 +i72 i10 +sye *68 +u t o25 +^SY3 +$!$> +i72 i19 ++B -1 +C +-3 -E +-2 $h x54 +*98'Bo3Z +i7e i1f +s@p +$0 k +.5i7W +sui u +swe *63 +s@k +s@" +$`$} +$`$~ +L0*83 +Z3 T1 p2 +C z3 x52 +,2 x72 +x29 -2 +-9+D +'4 Z3 +z4 D8 +^nx7A +r i7u +s9[ x08 +spb z3 +l sz; +*40 x61 x42 ++1 -D -D +z3 x49 +1 +sYT +D8L1 +s*^ +*14 *12 +Z3 o6w +s4di25t +*21 z3 +i3f i50 +s*a +R6 l } +^( *25 ++0 x86 +s9u +y1 ,9 ++1 -C +B ++1 -B -0 +s9a +s*# +s,u c +Y4 } +*97*0Au +q s0! +i7b i33 +x19 ^d z1 +R4 $v +sZW x01 +s%w +y3 .2 *42 +^l ^u ^j +t *0B ++9 +B +C +i79 i37 +Y1 TA k +x36 x41 +i2sTB^l +L0 p2 +s3G +5 +sZJz3 +Ks1+ +x82 sa_ +*75 x92 +$b ^p +sAn +i52i60i71i83 +sS? ++A -2 -2 +sdSsR^r +TAo3m^n ++0 +A +4 +p1 } ++1 +B -C +x31 i9& +*03 o5e +L2 D3 +Y1 Y5 +i6B i8P x72 +o8!x76Y5 +se@ K E +^- -2 +z4 Y1 +^$ x75 +*35*37 +z3 'B ++9 -3 -A +Z4 Y3 +sN1 +o64 t +i71i89i97iA2 +o8 x02 +o7+o6X +Z5 x51 p2 +y2 L1 +x43*86sZz +s1B t +l [ i5q +x34 ssm +i9?*63 +i1d i50 +r *83 +*9B Z2 x74 +z2 l +y3 z1 +T5 T1 *45 +sDz *32 ++F -E -E +z2 srp +c i4! ++2 -E +o7y *12 +x84 } +i81i99iA6iB0 +i81i99iA6iB7 +i81i99iA6iB8 +sNy +x87E +i1d i38 +T3 x53 +u $X +i7)sA *31 +Y4rsPR ++D -A -A ++5 +5 -C +$K q +t *36 +y2,8*03 +i74 i38 +x26 i3? ++1 +1 +B ++1 +1 +A +sP{ +s5b [ T2 +i70 i12 +s"= +i7& { +s"4 +*89 } +rs[ko8n +iA-y2T1 +s"[ +Z1 *15 +s"m +sE$ p5 x3B +s"k +*20 o5X +$$ k +o6r z1 +x38p4 +oAr K +^) u x14 +o1n u +o2,sN+*72 +p1 x72 +*1A ,9 ++8 -B +8 +*67*37*A8 +Z5 .4 +*81x19o1) +R0 -7 +s14^_ ++E -7 +x01 Z2 +sNT +y3 TA +s-Rx54^- +Z3 *74 x61 +D9 o6W +d +0 +d +7 +x14 o2e +c ^1 ^1 ^2 +*36 $1 x48 +xBAsrzr +*32 c ^3 +s5v +sS` +lz2x9A +x02 z5 z2 +*A1y1-2 +l o4! +xB1 { ] +s5I +x39^i^j +s5= ++7+C +s5' +su y3x27 +i2? r +^* i7D x29 +*20 $/ x62 +*24 t +$w $o $r $d +$|$@ +c^4^3 +c^3^3 +c^9^1 +p1o7&x6A +Z3 x57 sAS +o2k $p *21 +*10L6+6 +*53 x14 +iAl -4 ++B -4 -7 +] l ++B*A7[ +$h $o $o $k +xA4p4x48 +smG .7 +-7x89$| +[ scb +i7!x75$; +*18 *50 +sQ^z2Z2 +$l o5p ^k +*82 T5 +*13 y1 +sT% +$w $a +i7c i10 +z3 ^s +i13 i78 ++7 +A -1 +^p ^m ^i ^w +x65x23 +i8 x16 +sgn T0 ^j +D4 $` +i7c i1b +Z5 x23 D5 +-9 -F +-0 -2 -A +x35i8'*34 +$c d +$f i4u +i3f i12 +soXs\- ++A -2 +A +s*\y2s9G +Eo7`*9A ++0 +B +B +$% $3 +^y $j +*92 E o9t ++4 -7 -9 +-A -F +^t ^s ^a ^e +$j $e $l $l $y +y3 x98 +,4xB4sdN +y1 x57 +x59$}x96 +^- D3 +d x65 +K R3 +K R5 +x38 p4 } +'7 [ *41 +x02 z2 z5 +i3@D5 +K RB +i75 i16 +y1D8 +sUL ++1 -C -0 +sUW ++7 i8I +sU? +^8 *60 +${ { +Y1 y5 +i10 i3c +,Ap4 +x07 ^F u +$1 z2 +x45 D3 ++E -D -C +-4 -B -B +z1 x73 ++5 -6 -9 +x26 *45 *52 +o2w ^8 ++D -C -E +D1 *18 ++6 -0 +A +x19 $I +x4A]*0A +x19 $M +x96t +x89i7d*50 +$4 L4 $q +$- t y3 +*72xA3o3I +d o0f +i2g L1 +*71sz8x37 +Z1 sLT +}sl* +R8 $l +*12 i2- +p1 svg +i8e R8 *45 +o5n*25p5 +x05 o5\ +sy( k +^k ^r ^a ^p +^s oAl x82 +c $l $i $l $a +$u*02 +{ ,2 *73 +^y ^b ^b ^a +*69 D3 +d x1A +x31 si' +y2*19 +x08 ^[ +s)OsHQ +p1 ^y +$h $a $l $l +Y3 k +i74 i15 +$g $o $n $e +*A9*A0 +$y z2 +^n $5 +0 +k x64 ++0 x79 +^f *05 +$k $a $m $a +s(A +i6" x84 +-4-B +x02y3{ +,6 Y2 +c $g $o $o $n +*68 *06 +}Z4,0 +$s $e $e $d +x78oAZ +sIS s1Y +y1,Bx06 +o5d i16 +R0 ^O +x76 o06 +{i6& +xB8}$i +Y2 Z2 +{*89sCT +c $e $v $e $n +i77 i14 +co2er +u { +y4^M +*79 *37 t +d xB7 +x75 ^. +q xA6 $s +Y5 x29 sfl +-8^j*B2 +p4sA- +i0Z u .4 +i11 i29 i38 i48 +i11 i29 i38 i44 +$s $h $a $h +$s $i $d +su& +^Q o1x +.8 *28 +k Y2 x51 +x42 p2 +p4 $I +*53 y3 +s-9 +i9u*24 +^p ^o ^o ^p +i7d o5v +p1 .4 -3 +x4Bi5> +*B7sAV +i4IlY1 +*5B 'A +*64*A0 +i9X K +$t $o $k $y $o +i56 i7f +u x45 $_ +*86 D7 +${ o8p +y1 x36 K +,9i3D +T0 L2 +D2 x56 *34 +u i9V +D1 ^3 +sCS Y1 +s-_[ +*04sGr*9B +z2*1Au +i6E x74 k +x04^& +] x73 +o6P $U +l +2 x65 +s9S Z2 +Y3 o8R o7u +Y1 D9 +$c $u $l $l +sJ2 +s($Y5x41 +Y1 z1 .3 +,3^V +q x17 +$l $i $z $a +*A9 x17 ] +^n ^u ^j +Y5 sfl x29 +sr= +L5 *03 +o3%oBD +i0Z .4 u +i3b *75 +-B-E +d .5 +^a ^m ^a ^r +*16 ^0 x16 +Y3 $J +*35sy8R8 +s^N^] +*81,0 +o0I ^Q +*35 x69 +-9 ^1 +i1X x62 +i1Y ] +i11 i29 i36 i47 +x65 r +i9p 'B o6a +.0 x74 +s*z +*7B x04 +'4 $Y +Z2 u +c $c $l $a $w +{ *73 ,2 +Y5 o74 +Z2 k +*65 D0 +sL? r +u i69 +Y3 i0w +*51 x47 +$d $e $l $l $a +o4a^b +xA4 r x63 +*10 $c +^t ^a ^n +o0o sa} +u i6' +s0r L1 +d ,7 +^o ^n ^a ^k +.0*7A*26 +$c $h $e $n +D2 d o5e +x78 *27 t +Z3 o5i +o6C$jD3 +*9A x46 +D5 q +o4M { u +y3 x7B +$d $a $d $a +o9# s52 +E Y2 x76 +i71i89i96iA0 +i71i89i96iA3 +i11 i29 i39 i42 +$j $e $n $n $y +*74 *51 .2 +*23 o5Q +[ sgs o3p +p1 *68 +s,qs>JsO8 +o3T*72s*D +^|*0A +^o { y3 +*21o7M +'4 i3Y +K Z5 { +^k ^o ^o ^n +*A2 Y3 xA5 +*21 ^p x25 +s})t*83 +Z3 $h t +x13 x13 $o +*49 x27 +o6R*42'9 +-0 ^[ +^n ^i ^d +$i $s $a $a $c +y1x18*AB +svx t +*56 ^7 +*45 $" +p1 ^e x45 +x16t$C +^V '5 +Z2 se# x32 +u *69 x02 +Y1o6P*82 +sP0 +syC T7 +s6Ck +-0 x67 +i01 i12 i23 +x75 *27 u +x82 i1j +x86 -7 +sG2 +i1a i3e i2s +,2 s'Y +^E D8 x76 +^o ^o ^g +*10 $c *28 +^H p2 +z1 *51 } ++2+D +u.0 +*58 D6 +r x14 +r*62 +o4= x62 +Y3 o7u o8R +c $m $o $o $n +*36 ^x +i24 *42 p5 +-2 y4 +s,E +su4 R1 +p3 sNE +z5D8 +x86*82 +i3n f +sGw x41 +o5= t +D9^z +*24 sfO +*14stEr +xB2 ssR +-B+E +sXL +sXE +o0C xA5 x52 +Z1 stb +*18Cz1 +*40 s'I +*24 Y1 +o1^l +'5 $c +} i5N +iBosxQ +z1x58 +^d ^g +*70 o0U ++7 R6 +r i75 +z3 *61 ++3 y3 +Z3 *35 +K i4C +o65 x81 +i79 i18 +q ss! +u $_ x45 +u iB3 +o6B*25 +^g ^i ^g +i7f i1e +$c $h $r $i $s +Z5 x69 +i4r R1 +^-x41 +R4xB2 +x78 ^4 +sJ1 ] +^I o7b +u o3V +sAe R0 +*62 +6 +$3 i1a +x68 $r +o4n R0 +tsOFsyF +}o8Y +i72 i38 +*07oA&i0y +ss& r +*31x56i8t +i72 i37 +*2Bx14$` +c ^* +[ $0 D7 +z3 .5 +s;V +[ ,9 +Z5 D5 +^a ^l ^l ^i ^v +sbu +7 +*63 x13 +i82 i90 iA3 iB1 +x4A *14 +sDh +*4Ax86 +K RA +siu Y3 y3 +sif x26 +o5\ u +^x *35 k +y1*75 +sT9 +p5^z +^=x2A +,8 x26 +i32 i40 i52 i68 +y5 -9 +$l $y $n $n +^e ^n ^a ^k +^a ^l ^l ^i ^w +i2A '5 +c ^t ^s ^e ^t +Y5 t +x85Y3 +o1O '7 +lC$/ +$_x41Y1 +x38 t Y5 +t L4 +y3 *23 +*43$y ++2-B +x0B*41 +o1NR8,A +x09 ^! s!o +i70 i7f +^1 y1 +T4 x54 +srY u +sD6 *04 +Y1Y2l +-4 '7 -0 +y1 Z2 +8 +*65 R3 +R9 Z1 +y1 x81 +s#,Z1 +*10 *37 +x38 i1t +.1 Z1 *70 +D3o1- +*30 $) +i1Jx98R0 +sa2 k +r i2F +x58i8O{ +s8O +o5w $j +i73 i35 +*25-0y2 +xA5o0yR6 +i38 L0 +*2B xA3 +*40 svh +*14 sCP +*16 +0 +,2 p3 '8 +^6 C +^e ^v ^a ^g ^a +[ Z4 Z5 +sMg +sR$s"=i0q +$e $l $l $i $e +*06 $q +*67 *47 +su3 x21 +ko8N +smy$" +x17 Y2 +i9. x46 K +^k ^o ^o ^r +sZC +$@$| +$2 -A D0 +$s $e $n $s $e +s$+p4i8s +L1 +1 +s9Z +*05 *06 R4 +sbL l Z2 +$s $t $e $e $d +^I[$" +*73 x91 +y2 .5 +^X x37 +s*']*37 +y2 *07 .0 +*85*03*A0 +*A0xA2K +i8y*75siM +r,9 +z1 l x57 +q x52 +x45 z2 +*75 Y3 +y2 R7 +x13 $o x13 +i12 i57 ++1 z2 *34 +s1e +i4d 'B +o0q Z1 +s6N$Lp4 +u*97 +}Y2o9F +^W *03 +sbf z1 +i3@ -0 +x45ti4, +i9. K x46 +sv8 +xB2 s91 +Z2 i8v +x01 i3} { +Z2 i8o +*64 o4x u +^b ^o ^o ^b +*03 ,7 +i1b i36 +{ *40 +f sts x5A +R2 y3 x65 +sEp +sEK +.9 T1 x53 +*67 ,8 +^ kC +EL3x98 +uL5C +$m $o $e +Z2 i88 +oB3 x07 +z1 *41 +^d ^l ^o ^m +x41 o0> t +$r $o $s $s +i6R sJA +^q $4 z1 +sPK +t ^F D5 +K x13 +z5x73 +-7+C +$_ Z2 '5 +$Jo8'oA" +$8 sza +st| y5 x08 +[ D7 $0 +p1 o0v +$r*46*53 +-2 f [ +D7 R5 +$k $e $l $l $i +*32tx37 +sJX ] +sX%x0AZ2 +c $m $a $n $n +snC Z1 +i32 i40 i51 i68 +^t ^i ^m +R2 i3c +*92 o9t E +i42 i50 i63 i72 +u *35 +x15 c .6 +E*48 +x92 { +*01 Z2 +'6 D5 f +sCE +*0A DA +i88 *64 +i5r y2 +T0 $s +T0 $Y +*52C +C -4 o2x +iA$ry5 +*53 r +s#X +*02 *B5 x18 +*74 .2 *51 +${ x31 +] *A8 +,4 x65 k +Z3 t x61 +x16 *26 +*37 '8 +Z1 x25 z1 +*08*58 +r *67 x93 +sO) +^t ^i ^t +$9 s4G +*38sDnt +sOC +,2 x36 +i1c i37 +*71 D3 +o5G s3U +^o '6 k +*16 -0 l +sES[.B +.9 x53 T1 +$w $a $n $d $a +i77 i1f +sx o8+l +slX +sl$ +t i3. o55 +i4o f +$} $k +^t ^o ^b ^o ^r +sWR k +{ *18 x47 +i11 i5b +*A9 ] x17 +*31 o4; +iBf*86 +*39 o1> x47 +x35 f +Y4 *53 +*01 x56 +$s $a $r $a $h +Y5sg+x1B +i79 i13 +^p Y3 +s@siA' +$" Z1 +se9 z2 +x15 f +q $s xA6 +xA1 p1 x8A +x35 *64 +sj0 +Y5o3-x79 +x67 .2 +x69 +3 +i5E o49 +i79 i1f +$p $e $r $e $z +i9+{sNg +D4 i5D +] C +s5) +R1R2s3} +*81o4tY3 +Ez3 +i1m x57 +p3 u +x47 { +] f u +x02 R0 +i70 i38 +z3x9A,7 +x02 syV +Y1 $; +x75 u +sO_ +o5i R3 +i0e f +D9 ^7 +^y $0 +,1 *56 +x45 sO5 +i81i99iA7iB8 +x16sG5 +oA[sV$ +$n $i $n $a +y2 swz +K '6 C +rx94 +^4 x57 +E x45 K +i81i99iA7iB1 +*09 x23 +^/ x45 +} sLZ +$; u +Z3 sM3 +^s ^s ^a ^b +x67 u +c $b $o $m $b +s_7p5sJ& ++3-C +*25 x56 +sM3 +] x06 +$o x81 *30 +^I x18 +x39$| +Y1i9t +sMZ +sBq +K C '6 +sQ-tf +.5 *40 +x01 *68 +q x93 +*26 x06 o28 +Y1 i5* +Y4 '9 +'8LAL2 +r sb- x61 +sVb u +^s ^p ^a ^m +x17R6*53 ++1 { Y2 +*16 l -0 +r x02 d +ty5 +p1 -3 .4 +$z l +x25 x63 +o9@ u x06 +$z [ +$Ns`4*07 +x56 y3 +y3 +9 +^n ^o ^l +x36 Y3 +i0@oA2xB9 +sgl $9 +Z3iB1 +*A5[ +Z2 *6B x53 +sMp +Z1 -0 u +$D x85 +sPa ^k +R6 [ +ssAo0= +^n ^a ^h +*52 o0d $v +x31 x49 +sZC i3i +$a $l $a $n $a +f *13 x6B +Z1 x75 +D1 x49 Y1 +*52 $v o0d +^c i58 z1 +i72 i1f +$o *30 x81 +,4 k x65 +x41 t o0> +DB*A4 +^f $v +DA ,9 } +o4yo5VoBN ++4 srS +x1A Z4 +^b x57 +srg r +*14 ] *27 +'8 o7% +d +9 +^f r y2 +*35 y1 +i70 i17 +i70 i16 +^n ^a ^r ^a ^s +^&R8*8B +^g ^b +$U x18 +l x65 +2 +{ i07 +D6p4 +x75 K o6U +o8@{ss/ +*61 '5 +x09 o4c +x69 ,2 +sNF $0 +Y3 R5 +t ] sQV +s$k +R3*23 +Z2 o28 +y3 x69 +i92 x05 +x48 Y4 +R5 *58 +*70 $6 +x45 sBZ +x0A $8 +*15 sl4 +q x94 +D1 Y1 x49 +Y1 *38 +] ,8 ] +st| +x12 '8 +s'6 +x13 ^I z1 +*B5 x16 +^k ^e ^e ^l ^s +x75i1$ +x1B $] +z1 x28 x21 +k x38 +T5 L5 +s#LxA5 +,1 } l +^C *42 p2 +RA i0e +y5 iA% xA3 ++B+0 +*81 x27 t +C T9 +sdx *53 +x37 *74 x32 +^fZ1 +x04 *97 +*46x17*34 +^!Z2 +.8*13 +*09 '5 +R8 u +i72i80i91iA3 +sgv Y1 +$b $a $h $i $a +c $d $u $d $e +$8 *81 x81 +i5) +i51i69i76i84 +sI4 +i5$ ^! +sCp +x67 i1' +*20 $$ Z1 +-5 s6v +o5f C +xB5*A2x34 +^S t +8 +sDX ^E +^H p3 +*93sC\ +*16 *48 +^csb^ +] u f +] ] ,8 +$N K +i0M s_J +s9u -7 +L0 Y2 +s;K +x56 ,8 +o4XZ2*76 +i1Us/@ +r x0A +x78 t *27 +s*M +s/E +Z2k +-6sow +sRI Z2 +$a $l $i +x27 Z3 { +,7 -7 +$d $e $a $d +x48 z2 +l $) +sT7i3J +l $] +*93x2B +sWS +R1 z1 +o6G i5M +sD4 +$^ o9a u +^Y x3B +f x6B *13 +x18 -0 +i60 sN7 +-2DA +{*61 +y4 '7 +K p1 r +E R8 +i37 i15 +Z3 k *42 +$1 *B9 +^e ^k ^i ^b +L0 s67 T0 +y5 sLM +o8r .4 +-A K +sp@ +*73 { x59 +Z3 *05 +Y1 sm^ +$" { oA3 +x07 Z2 +p4x82,A +$M *78 +x2B f +*35 x59 +l L6 +k *81 +*72 x71 +u x17 +D2 R7 +sra*2BC +i8a *18 +x21sBxx16 +CslR$D +D4 D7 l +*52Y1y2 +^7 *76 +si/ D5 +Y4 ^! +*4Bx24 +{*95^1 +str xA5 +$l $i $s $a +ro9s*26 +p5 $! +x27 Y4 +*13 d +L6 [ +x32 x65 sts +*B5x26 +syH x35 +i6E k x74 +} sEW +$Q D4 +^h ^c ^a ^b +f *13 +s8I Z2 +[ svI ++1 d +$C x58 +o9M o3a +o4vR4 +x13 s8A +^m ^u ^b +o09 L4 +^U *07 +o1=.7x47 +z2 $6 +x68 E +x21xB8Z5 +*02 L2 +z1 x21 x28 +sEo +R6 { +*1B i2Z x26 +$s $h $a $k $a +$l $e $v $i +*39 x47 o1> +x85L3 +,2i04 +*98 K +[ x57 +Y4 sSE +o0# l ++A x06 +$w $i $l $l $s +sSs +D2 *34 x56 +$s x32 [ +r*60Z1 +x05 k *61 +i5q o21 sqA +R4 Y1 +s=* +Y1,Bo1G +^M $D +o9) x15 +s=# +D4 l D7 +$b $o $o $n +f x63 +^^sN@.7 +y5 } r +x23 R1 +Z3 -4 +$$ r +Z2 y1 +.6sqgy4 +K*0Ai8` +-1-D +x34 o65 +sT2l +$R x07 +s*wx5B +$e $m $m $a +x75 u *27 +RAl +$s $a $r $a +y3 x87 +t i62 *31 +$c $h $i $l $l +i78 i17 +^y ^b ^o ^t +$d $e $n $n $y +s5x [ +Y5 u +x26 r Y3 +saV ^J +L3 [ +sgZ *20 +i78 i1b +*73x37 +t sM> l +x38 } p4 +$P x27 +$j $a $v $a +sX* +L9 x62 +$g $r $i $n +Z2 oBh x56 +t sQV ] +i5q sqA o21 +z1-2*59 +srSY2 +x73 y4 +sXs +y1 *90 +z4 x2A +s&+xB1 +$- y3 t +$z ^v +C xA3 +p1 *82 +x59 ^H +L9s_U +z4 D9 +*07 .2 +$t $i $f $f +$^*45 +^W ^B +*05K +i76 i18 +i73 i10 +i73 i11 +$7 z5 +D3 Z2 o3j +^3 i6w +sG! +x81 *5A x08 +*85 shl +^n ^a ^i ^v ^a +xB9*89k +u x79 +s02 x45 +*46 y4 +T4 *47 +x21 s9J +R2 d +x1Adx14 +k $} $k +Z3 sQ9 +c o2$ +i1d x54 Y4 +^i ^h ^c +i6Q x02 +r i23 +sNa T4 +'7 D4 $* +x15 .6 +*01 Y4 +swY Y5 +x67 ,1 +*42 R5 +*42 R0 +$ -6 ++9y2p5 +E Z4 +shv x46 +x95 x34 +i53 i1b +r i2P +^0 Z2 +o0z xB2 +sm" } +$'*68-9 +TA *23 +$- sgV l +z3 -3 -5 +iBjs_O*96 +r x61 sb- +t *31 i62 +x73 oAn +*09 x72 +s0pZ2 +^j Y5 +Z2 .1 z1 +^e ^l ^a ^v +*AB x29 +*17 x21 +*29*3Ax38 +^8 x59 ^7 +^C sAK +x2A ^> +sOF ^U +sZ+ +D0 o5N +sZ! +x29 q +D8 *78 +x25 l [ +^i ^a ^m +^n ^a ^d +o87 o0j +s.% +x15 .6 c +i30 i56 +se$ +*79 t *37 +*41 y3 +^t ^t ^a ^m +L6*35t +$e $d $w $i $n +^s ^m ^r ^a +y1 *52 +l sd, +sQ xABshu +^3 *94 '7 +y3z3 +$,Y1 +Z2 x72 $u +c $m $i +R6 *61 +T9 *B9 +R7 $c +$8 $7 $2 $4 +-5 ^g *36 +.6 [ +*93 r x85 +$b $r +l z5 +$b $l $o $g +LBx06 +$* $1 $5 $9 +q x41 +[Y4u +*71}x49 +sW#$o*70 ++5+E +qx03y1 +set .7 +$` *03 +$y $a $c $c +$p $a $g $a $n +Y3o88*AB +suyy5x06 +x07 $l +$w{*49 +uiBS +x85*09*53 +x0A$Ad +$#$> +*62 Y4 +x48u +x48 *01 +sd6 +r R5 +$ex29u +Z1 ,B +sd/ +$a $b $y $s $s +Z1i2 *23 +i42i50i63i70 +*36 Y3 +*39z3 +i3% } +Y1 RB +^a ^v ^a +x28*54 +Y5 x2A +x5B u +sDx +s04 x86 +sO6 +sOH*A5 +o9- *97 +*41 ss5 +R6 -3 +x25 R5 +*3A,2$= +x97 C +x34$< +f o1t k +s K r d +sFos'rE +o3B*B0 +^f ^i +i66 +2 l +i2S x51 +1 +D9 ,A *9B +T1o6z +DA $u TA +*72o5! +x85 *51 +i34 *74 +*32 i05 +R8 x34 +T5K*25 +siu y3 Y3 +t $y +Z5 x7B +*B0*49s"i +C o2x -4 +y3s74 +x63 f +D6 ^[ +x15 '8 +s8t[ +-4 L5 +5 +Ks$Ss}Z +sv2 +x76 +3 +*14 *63 r +i9w x35 +.3 i6x +u *37 +x17 y1 +saw Z1 +sd4 i42 +*50 -8 +i1!*95.9 +C D3 +*06 $) +o4d o37 +T1,2$F +s'F +iAd x67 +u z5 +E x34 +*5A xA3 +s'2 +$B *72 +Y3 x12 +iB* u +x38 Y5 t +Y2*27sHx +sILl +^YY1*87 +$s $a $l $s $a +*32x3Ao3= +*03 slU +x53 -2 p1 +l i5C +so" +*09 k +xA5 D3 +*24 } o5R +x46 o6f +i2i i4e i3t +l K +iA%ry4 +D6 z2 x92 +q x61 u +z1o8H +$5 d D4 +s3) +x37 ^q +i78 i16 +$n $e $e $d +$5 d D5 +Z2 $u x72 ++7 s4V +s1U x3B +x29 i6Z +$n*80 +ER3y3 +*74 i5_ +o3Hs}S +-2 R0 +z3r +svB .0 *15 +s0Su*7B +o6ZE$E +*BAx6B +i5@ $# +x87 $Q +sbmz3x3A +$l $o $u $i $s ++5 C +$b $e $l $l $a +s|H +k z5 +$d $i $c $k +s K d r +q ^# +*02L4o63 +Z2 o30 +c sv0 +i9V x26 +se{ E +$rC +oBMs-DL0 +i56 i19 +t x78 +i01 i12 i2n i3o i4v +^aC,1 +r '5 +x42^3 +o3B k +c $9 $5 $? $? +c $3 $5 $@ $@ +c $6 $1 $1 $! +$J $a $n $0 $8 +c $0 $8 $8 $! +$0 $2 $@ $@ +c $1 $0 $4 $! +sm) +Y5x42xAB +$8 $6 $? $? +x58 o2c +c $2 $4 $@ $@ +c $2 $4 $! $! +D7sGz +c $3 $8 $! $! +c $1 $2 $6 $! +i1j i2a i3n +,1 l } +$g $e $n $e $s +o80 sy3 +oB? +c $7 $5 $@ $@ +i0j i2n i1a +$3 $2 $? $? +r x93 *67 +$4 $9 $% $% +$2 $0 $@ $@ +,2 i0" +*12 Y3 +$= $e +$Hx17 +Z4 o3u x58 +oBX +$6 $3 $! $! +$0 $3 $% $% +c $3 $7 $# $# +sNs +c $0 $1 $# $# +$a $l $l $e $n +sy& +^1 d +*57 *28 +xA3 +5 +s5Ei5s{ +$5 $0 $$ $$ +d $w +,4 i9? +Z2 .0 +^s ^g ^u ^p +$4 $6 $# $# +us!1 +y3 y1 +c $7 $3 $! $! +^e ^b ^a ^b +t x12 i3J +c^X^X$X$X +$p $e $e $k +Z5 ] x31 p1 +d 'R +$0 $3 $? $? +uo0H +$1 $5 $% $% +Z5 x31 ] p1 +z2'A +'1 +$1 $8 $? $? +x34C*94 +c $1 $0 $2 $! +$6 $0 $@ $@ +c $1 $8 $0 $! +$2 $2 $% $% +Z4} +*04z3 +*B7f +c $3 $2 $3 $! +{i8Vx49 +d i4, +sm/xA1 +$5 $4 $? $? +,3y4 +c $1 $9 $$ $$ +c $5 $4 $* $* +c $1 $5 $0 $! +$s $o $n $n $y +Z1L3*14 +o4>*02sA) +*3As( s!Q +iB4*9Ax06 +sZp*6B +$1 $8 $# $# +$/p5 +sQjiA,} +T4$(xBA +$0 $9 $@ $@ +$4 $9 $@ $@ +c $9 $2 $? $? +$t *91 +o3E*06 +o32 l ^c +^]*92'6 +c $2 $6 $* $* +$6 $8 $@ $@ +c $1 $7 $@ $@ +$7 $6 $$ $$ +c $4 $2 $* $* +$7 $5 $@ $@ +i7f i55 +skw r +c $7 $3 $* $* +ui1g +C*A8L1 +$5 $2 $? $? +i36kc +c $6 $5 $5 $! +T6f-4 +c $4 $6 $* $* +i01 i16 i2M i3a i4r +c $4 $0 $3 $! +c $3 $0 $3 $! +$6 $8 $! $! +$8 $9 $# $# +c $3 $6 $9 $! +c $0 $9 $7 $! +sPu +*87s,. +i5o L4 +iA{R6o5h +o8+*13 +o3io4K +c $5 $0 $$ $$ +$7 $9 $@ $@ +^y ^n ^e ^d +c $2 $4 $4 $! +oBQs%U +-0]i7x +.4i36 +i72 i16 +i3s i4e i5p +$6 $6 $% $% +c $5 $2 $2 $! +c $4 $7 $@ $@ +$0 $6 $$ $$ +c $1 $0 $8 $! +$Ix52y4 +x39s[2^% +*93*2Ax08 +Z1 sa? +s, +c $0 $5 $% $% +$C z1 +*07T3sF{ +c $5 $2 $! $! +x86*16y2 +$2 $8 $# $# +c $3 $9 $1 $! +c $2 $7 $3 $! +i3i $y +x08*41 +i4y i6k +7 +o0bx29p2 +c $9 $2 $5 $! +c $1 $4 $5 $! +c $2 $2 $1 $! +$3 $9 $! $! +c $4 $1 $@ $@ +c $6 $9 $6 $! +c $0 $4 $# $# +c $3 $2 $7 $! +$0 $2 $% $% +c $7 $5 $5 $! +$f $o $r $c $e +$4 $1 $? $? +i62i70i81i97 +c $9 $2 $* $* +sIs'8x3A +sF1l +o8Sy2sUe +$g $o $o $d +c $0 $1 $8 $! +c $7 $0 $7 $! +$4 $8 $* $* +c $3 $2 $2 $! +c $5 $5 $9 $! +c $2 $5 $2 $! +$7 $1 $# $# +c $3 $1 $4 $! +*28*B2 +c $6 $4 $$ $$ +c $8 $0 $6 $! +c $1 $9 $% $% +$2 $6 $$ $$ +*42,6Y5 +c $3 $1 $@ $@ +$5 $4 $! $! +$[T4 +s+f +s+b +c $5 $7 $* $* +$6 $1 $? $? +$0 $7 $@ $@ +i00 i17 i2M i3a i4r +c $2 $1 $% $% +i1Fx0B +$9 $3 $# $# +c $3 $1 $$ $$ +$m $a $l $l +Y4i1a +c $6 $2 $6 $! +^s ^m ^o ^o ^b +c $4 $0 $0 $! +$7 $4 $$ $$ +] D0 u +s8wi1^-B +$2 $9 $@ $@ +c $0 $7 $# $# +c $3 $6 $6 $! +z1 $x +x59 t o3e +$P *36 x06 +$4 $8 $? $? +c $1 $7 $5 $! +c $7 $1 $! $! +sV. +sV, +$3 $9 $@ $@ +i01 i14 i2M i3a i4r +c $5 $6 $! $! +$3 $7 $@ $@ +c $3 $7 $3 $! +i02 i15 i2M i3a i4r +i03 i11 i2J i3u i4l +y1x8A*18 +s4B*34o7f +c $8 $4 $* $* +-5+D +c $3 $4 $0 $! +^l ^e ^e ^r +$N $o $v $1 $1 +c $4 $9 $? $? +x1B*05 +^? ^? +c $4 $0 $7 $! +c $6 $5 $1 $! +$9 $5 $# $# +$*$] +Z4s\7r +c $9 $8 $% $% +c $3 $8 $5 $! +^u ^n ^a ^j +*56z1xA4 +u^H*8A +c $9 $5 $% $% +c $7 $8 $* $* +c $3 $0 $5 $! +c $3 $4 $5 $! +c $6 $4 $* $* +sZg x81 +^m RA +c $0 $6 $$ $$ +c $1 $6 $? $? +$9 $6 $% $% +c d 'A $3 +^t ^p ^e ^s +$6 $4 $* $* +$7 $5 $* $* +i55 i36 +c $5 $7 $5 $! +[ i6v +$5 $0 $@ $@ +c $1 $0 $5 $! +$3 $8 $* $* +^y ^o ^s +o1wC +c $3 $9 $* $* +Y3.1 +s9Z[ +i01 i18 i2F i3e i4b ++7-E +i7) +c $4 $4 $3 $! +c $1 $9 $5 $! +c $4 $1 $3 $! +c $2 $4 $? $? +i02 i14 i2D i3e i4c +o7?x49Y4 +s!+ +c d '6 $8 +c $9 $0 $$ $$ +c $3 $8 $8 $! +D5 sC+ +c d 'A $5 +$J $u $n $3 +c $7 $2 $7 $! +c $7 $1 $0 $! +c d '6 $3 +i1d i2e i3c +$6 $4 $! $! +c $6 $9 $$ $$ +c $3 $0 $$ $$ +c $3 $3 $0 $! +$3 $6 $# $# +c $6 $6 $9 $! +c $6 $0 $0 $! +x63-AxB1 +^_ ^* +d 'E $0 +c $4 $2 $3 $! +x92x27Y1 +$9 $0 $? $? +$3 $7 $# $# +s;ms#l*A2 +i1a i15 +o6r*01l +c $0 $2 $$ $$ +i4T*90 +c $5 $8 $@ $@ +oAB$' +x23 x38 +x6Bry4 +^i ^r ^p ^a +$0 $5 $$ $$ +c $1 $9 $? $? +d$8x75 +^i ^r ^p ^A +$6 $7 $# $# +y1x94K +$2 $1 $% $% +$8 xA5 +i2n *96 +c $3 $7 $7 $! +$5 $0 $? $? +^l ^r ^a ^c +*34Z4 +o8bk +c $b $u $l $b +c $8 $1 $2 $! +*19 $! +r sn& +Z2o1D +c $4 $2 $8 $! +C 'D $0 +c $2 $6 $0 $! +C d '9 $1 +c $8 $6 $$ $$ +c $2 $8 $? $? +$6 $6 $? $? +p5s5t +c $0 $1 $% $% +c $6 $8 $9 $! +c $0 $0 $3 $! +$a $p $r $i $l +T2$J +c $4 $5 $$ $$ +c $2 $0 $% $% +x65Z5 +C '6 $1 +c $8 $0 $5 $! +$M $a $r $2 +$0z3,5 +c $9 $4 $# $# +c $7 $6 $* $* +$6 $0 $* $* +c $8 $2 $7 $! +T0 TC T5 +c $4 $2 $6 $! +] *1A +c $9 $1 $@ $@ +$m $a $r $0 $0 +*95RA +c $0 $7 $* $* +$4 $5 $% $% +c $1 $8 $# $# +$8 $3 $$ $$ +c $6 $8 $8 $! +c $5 $1 $5 $! +i3> +$p $i $l $l $s +c $7 $7 $1 $! +$b $e $n +c d 'B $9 +*69x48 +i3] +*30 z2 +T1 s7A +x43 x73 +c $2 $0 $2 $! +y3}^a +l d '9 $6 +i81i99iA8iB5 +*37*45+3 +sF$ +c $7 $3 $3 $! +c ^6 ^a +$2 $0 $# $# +c $4 $1 $! +i2d R3 +c $5 $6 $# $# +i5m i7r i6a +swU +^y ^n ^a +-0 d +c $7 $1 $7 $! +y1*61 +c $3 $5 $4 $! +z1*14iAs +*17.0 +$1 $9 $$ $$ +c $1 $7 $$ $$ +$l $o $l $a +-4+C +d 'E $7 +c $3 $5 $$ $$ ++5i9$$O +c $3 $2 $? $? +$3 $5 $$ $$ +$r $o $s $e $s +ly3sC( +c $9 $8 $# $# +*9A *7A u +f '9 +C d '8 $1 +^o k '6 +$c $e $l $l $o +'5 z2 +i02 i10 i2M i3a i4r +^# ^# +c $0 $3 $3 $! +^s ^a ^p +c $1 $5 $# $# +c $0 $0 $2 $! +c $3 $3 $7 $! +^a ^v +i9|*27 +c $0 $3 $$ $$ +u $1 $9 $9 $7 +s/5 +c ^d ^0 +c $9 $1 $7 $! +c $8 $0 $* $* +c $7 $5 $* $* +s/` +c ^7 ^0 ^0 +oBlsC, +s() +c $5 $1 $* $* +c $b $e $e $r +sF_ +T2Y3 +T1 s0W +$p $a $u $l +$8 $8 $# $# +sq# p1 +c $7 $2 $@ $@ +c $8 $6 $* $* +c $0 $4 $$ $$ +$t $e $d $d $y +c $0 $6 $# $# +*9A u *7A +$l $a $s $s +x39x4As*I +x76s&KC +Z3 +3 l +$t $a $n $i $a +Z2 *06 +$j $a $n $a +$\ Z1 +c $3 $5 $7 $! +c $0 $5 $! $! +$8 $4 $@ $@ +d 'D $4 +x18x36 +c $0 $6 $2 $! +^s ^m +c $9 $4 $$ $$ +c $3 $4 $$ $$ +c $0 $6 $5 $! +c d 'E $1 +c $2 $7 $# $# +l d 'D +c $8 $6 $@ $@ +i76 i12 +i76 i10 +c $9 $0 $? $? +^@ ^@ +*51} +$r $a $t $t $y +sJk +c $6 $9 $% $% +$9 $2 $$ $$ +$9 $2 $* $* +$4 $5 $? $? +C 'D $1 +c $9 $0 $@ $@ +$d $e $e +$d $e $c +c $2 $4 $7 $! +$%so|*36 +T0 T5 TC +Y4D0 +$8 $8 $% $% +C 'A $0 +^r ^a ^e ^n +c $2 $5 $8 $! +l d '9 +i0J i1U i2n +c $3 $2 $* $* +c $4 $2 $4 $! +R0 c x12 +^e ^e ^r ^t +c $3 $3 $2 $! +$q L7 +o7s -B *78 +c $1 $8 $7 $! +$8 $7 $$ $$ +c $2 $8 $2 $! +-7 *94 +c $9 $7 $@ $@ +$6 $8 $$ $$ +$0 $7 $% $% +$9 $3 $$ $$ +$s $a $a $b +c $9 $3 $9 $! +T3 sFq +sbQ{ +$2 $0 $$ $$ +$7 $8 $! $! +c $1 $2 $% $% +{*29i2x +s+gs?} +o7(-9*B1 +$,$@ +*05s%h*62 +siQ +c $3 $8 $* $* +$7 $3 $! $! +R8 i83 +$l $o $k $i +$j $a $n $1 $2 +o7s *78 -B +sUmp2x7B +R1+Ax3A +c $1 $9 $7 $! +C 'A $7 +c $3 $4 $3 $! +sVbu +$2 $4 $? $? +^(sxU +c $4 $6 $@ $@ +$0 $2 $? $? +c $8 $2 $# $# +i02 i12 i2J i3u i4l +s4ZsQv[ +c $4 $1 $5 $! +x19$ o0n +c $4 $2 $$ $$ +p1+8.6 +c $1 $4 $1 $! +c $4 $0 $4 $! +c $3 $5 $! $! +i7f i5f +}xA9$U +x28x91 +$2 L5 Z1 +*89s?_szb +s^qT6 +$6 $7 $@ $@ +c $9 $8 $$ $$ +$4 $0 $? $? +c $6 $4 $! $! +c $4 $5 $9 $! +,2o6j +$2 $0 $% $% +c $5 $4 $3 $! +^e ^f ^i ^l +-7Z4 +c $1 $9 $2 $! +$6 $2 $! $! +c $4 $0 $! $! +,A^eo3\ +i2j i3a i4N +o6fi8Rx52 +c $1 $0 $? $? +$+$^ +c $3 $4 $4 $! +$1 $3 $% $% +c $5 $2 $5 $! +{i8- +$y $o $l $o +x83Y1 +i6tz5 +x4Asb^ +sR9*1A +$qx67Y1 +$f $i $l $l $y +$p $a $n $n $i +$0 $f $e $e +^[p5 +y4o8hiA* +oBd*39 +Y3f +i92 iA0 iB1 iC3 +-9-D +i1m^y +oA3*90 +$k $a $t $z +cux57 +q] +$b $a $r $u +^ r +y1*08 +sT(sEz +x28i1J +$m $o $f $o ++6Z4 +-7sa\^d +^5l +i76 i35 +T6,2x9B +szYZ1^W +*06o39*B9 +sLe +$p $a $l $l +xB4L0l +$w p1 +*23^W +$s $a $s $h $a +Y5C +^8 s7e +[smU +*58 x94 +sJq +i57 i5d +R6 Y2 +*78 p2 +s#< +x32 o1` +*53*08 +x94 x26 +c T5 +4 +sC c +sk$ +sk> +xA7i27y2 +p1^y +o0Zr*3A +sgx *13 o5d +^i ^c +x62Ci6' +}i7s$} +sWtk +$! *A7 +R4 i3i +y1Kx36 +$X $J +sX(*60 +sU&x85sd& ++B *78 +z4 $? +'A o3D +y2s|asaR +.Ai4Z +x86x0A +x8A*1A +^r ^o ^o ^l ^f +*B0L2 +^n ^r ^o ^b +sk8 +x24y1 +o4 sl0 +z5 o8Q +,7 r *26 +u ^9 ^0 ^0 ^2 +s@f +*76o7;R9 +R3 o1t +i5ry2 +Y2*52 +$q $u +s"%*35k +p1*15*20 +s,|$7i8P +o48k +y1sZvy3 +s!h +i12 i5a +s_& +y5i2Rx13 +x53 sne +i1nq +y4sF)y2 +*31 s8v +iA@ y2 +Z4 o93 +Z2 x32 se# +$K x58 +o0b p1 +x25 *03 +*57s(i +sjds;Z} +*87i4; +sP.*1B +$t x01 u +i54 i12 +s#O +sWIo4[Z3 +$5 { +i7a i1f +o0ky5 +^m ^a ^s +Z3 iAQ +Z3 *90 +] s_K +[ z2 $e +sxF +$g $l $o $s $s +coBb +o0|x5AE +x07*42 +^h ^s +Z3 [ Z5 +$= z3 +^g ^i ^b +Z2 ^y +*92.9 +z2 i0l +*A9 $K p4 +*64o3D +sVY +R0^O +s,Bz1 +*57q +sriY5*48 +o3x y2 +L1 +7 +sC= +s5X Y3 { +^pY3 +x56LBR1 +st[ +i09 *64 +s"x +s%,Z4 +q { x19 +s_h*72x16 +*23T8q +sBt u +T4 x68 +Y3 -B p2 ++0 $] +^Yi2y +Z1i7$ +^!l$9 +x06d$) +,7 x97 +R6i9Eo0W +o5>x73 +i1{ +u o25 t +o8Ks89 +T4i2^*14 +i9Qz4 +s+1 +^Zz1 +D7 ^Y E +s-4 +*96o7 *92 +qp5s4. +syK$8 +^n ^o ^r ^i +$j u +$j c +$m $o $o $r +y5^,*9A +.7^Ck +*82[z1 +^u ^r ^e ^p +y4 x49 z3 +xB1sP0'8 +*94 D3 +*17C +o1Dp5 +$D$o +p1*B3o7c +$0Y2 +*8Ao7=x24 +^m ^a ^d +^/x62 +*5BR2*56 +.7 C +o7m s5i +*35 [ +$g $r $o $s $s +y3o9gx89 +c x97 +*64 *70 +x08,Ax65 +s,!o4Ri0a +*36{ +x68 *67 +sB"x58*28 +z5z2 +Z3 *A7 +oA.R0*71 +$a $d $d $l $e +sv( +sR$ +$d $a $v $e +T9Cx6B +x2Bs&q +$m $c $g $e $e +sFk +soxi6] +o3Ao7K*93 ++1 Y1 ^8 +s`7sZq +i9ZL4 +s_< +sCQ*71z5 +^n ^r ^a ^d +p3 *14 +o8oZ2*42 +sYb +si% +z1 o5w +Csj2 +di1b +^YrD1 +x28*78C +*83 *39 +*84x09 +o6T d x29 +s'qiB/ +^n ^e ^k +Y3*17 +s\A*79si" +*02 sdl +Z2 r Z2 +p2*25 +oANx14x85 +^n ^e ^g +o4>T7 +t^6Y2 +^-$7 +q Z5 x26 +$y s8R +s\p*38 +{ i4+ +*96sMN +T2 xB4 +sP6 +T8 +5 +o7^p3k +Y1 p1 +*75z3T0 +Y1qsa* +^s ^i ^r ^i +x63p5 +^W*03 +i0B x48 +o0ofu +*78x6AY2 +i35 *86 +sXysNs +i53 i7b +i5c i1f +$#$^ +i5c i10 +^d x91 +ssx *26 +i12i20i30i43 +,5 x92 +i2> o22 u +C oAd +i7c i37 +i7c i31 +i51 i16 +$m $i $s $s $y +$($$ +*3A x49 +^M d +i52 i7f ++4+C +^i ^g ^a ^m +i18 i1d +i5e i59 +i22i30i41i54 +i11i29i36i45 +i2j *23 t +i11i29i38i46 +$=$# +i10 i1c +i57 i15 +i5c i30 +sI? ++4 D3 *71 +i17 i5b +q x26 Z5 +i17 i3e +x13 spw +$<$# +i33 i1f +i11i29i38i41 +i11i29i38i45 +$h $e $l $e $n +soY +i34 i5f +i15 i1b +i51i69i76i83 +$l $i $b $r $a +.6x6B*10 +xA3 o2H c +y5 $d +i18 i1c +^0^3^0^2 +i17 i73 +$t $e $r $r $a +i17 i7d +i11i29i37i47 +i1d i5b +i12i20i30i46 +i78 i3b +$t $a $m $i +s$3 +i19 i3d +i19 i3b +i56 i37 +i1c i54 +i1e i19 +i73 i38 +$a $g $a $i $n +i73 i36 +i73 i37 +o3P l +x16$6p3 +^Q y4 +i41i59i66i72 +i3e i18 +$a $r $c $h +o3[ o1c +i5f i30 +i5f i36 +i5f i38 +i33 i5c +x47 i6f +p2 '6 Z2 +i1f i35 +i1f i33 +o3#sF*$P +[ $e z2 ++1 ^8 Y1 +i73 i18 +o4`s(P +^# r +c $b $u $t $t +i56 i5f +t Z1 +4 +i58 i7f +i58 i7b +T4 iB7 +$'$] +$;$* +i11i29i36i41 +i3e i30 +i7c i32 +i5f i10 +i5f i18 +i5f i17 +o9R *69 +sNr +i22i30i42i56 +i38 i1b +D2z2 +i37 i5f +i34 i1b +i10 i75 +i32i40i52i63 +i5b i7f +i11i29i36i43 +i1e i16 +i42i50i61i75 +i79 i33 +L0 ,4 +i0$ *40 +s5g +^8^2^0^2 +i1b i16 +i74 i17 +i12 i3b +i59 i1b +i1g z2 +i22i30i42i58 +x82 ^1 +^s ^e ^y ^e +T1 ^W +i32 i1b +-6 k i6x +Z3 +7 +x45 -2 +$,$] +i35 i7f +^9^2^0^2 +$a $y $a $l $a +[ o2; +^n ^a ^d ^a +i30 i1c +i14 i3f +i37 i7c +i75 i38 +i75 i39 +i7f i3a +^m ^u +i3a i14 +i3c i16 +i61i79i86i90 +i1c i16 +i54 i7f +i1b i58 +i3b i13 +i56 i17 +i56 i11 +$IRA*56 +i7f i58 +[ o2A +sk- +^e ^g ^a ^g +i14 i3b +i1b i57 +i7d i1f +i12 i5b +$e $v $a +*01 ^O +i38 i5f +r L5 +i1f i55 +$6 x34 +i3d i30 +$8 *04 +i19 i1e +i14 i5b +o05 z5 +i18 i7e +*20 $9 +4 +i3b i59 +o7y ^j +i1c i33 +^v R1 +i10 i79 +x63 i3s o46 +o43 sax ++6 Z1 i4c +x51 Z3 +2 +$m $i $l $l $s ++8-1 +sap $y +xA8iBN +^e ^k ^i ^n ++B-6 ++B-7 +} Z4 D1 +s4V^>x0B ++C-9 +x1Bsd} +c$1$2$3$" +q x49 ^s +y5i0QY3 +Z5*20x08 +c$1$2$3$[ +^8 $w +$Y]z5 +$K c oAC ++9-4 +Y3o9i +^9 o6s +i66 l +2 +$Ws,} +$`p5 +$0$8$2 +$0$8$3 +sO}txA7 +s>tY2R9 +$Z R6 $3 +d oBx +sVWxBA +T0 i0? +z1 x23 +z1 x27 +x63t.A +.5z1s?n +z1 x57 l +x65i4= +syts-= +*3Bsi; +x5BqiBL +},B-A +R5 x04 +$n o00 +Z3 *42 k +[*67Z2 +$8 d +Z5o1h +L7x32 +T9xBA +Z2 o76 +i7z } +z3xBA +-0p3 +$0$6$5 +$r $e $a $l +xA1 x15 +[^, +Y3*7B +f x75 T6 +i6'k +u { Z1 +x08 i1a +T2s & +s&F*A4 +'7 Z4 +*64i3L*28 +R2 o5v +D2 $` +x31 sl9 +'7 *14 ] +p3x93 +r+5 +^Ci7j*37 +x89,9 +*92'3y2 +x89sI| +^u ^m +o62sNTx57 +i7T^& +^u ^l +i4= x15 +L0 $l +ri6hx6A +f *86 +Z3 x61 t +sgk 'B +]sWn +*A8o6!^| +{ u *20 +*68x15z5 +p2+0*72 +$0$7$5 +s!_^< +R0 x12 c +-9 x24 u +z5s|* +$d ^o { +^yp5 +z2 i3h +i84 +A +i4op4q +z1 } $m +u$B*73 +z3.A$d +$- [ +p5x4AR6 +sEb +sEr +Ecy2 +o9k i0s +c ^r } +o2lz2 +swa +-6Y2 +p1x67 +$u$xi43 ++9x95 +p1 s68 +s3Wi9KsHo +Z2 -5 *63 +x14 sa? +$d $a $r $e +$0$5$2 +L3x21 +p1 sl7 +x04-6 +$0 seu +^e ^t ^a ^t +L6*71 +*86s$>i8| +*01 { $6 +-7 o5# +sYrx97*B3 +},2x46 +*A3.0sr= +Z4 x58 o3u +x45 ^7 +x23 f +*75Y1 +$f ^8 ++0 x73 x53 +y5q +$9 q +^l R8 +sH=o3[ +D0z5-8 +$Y [ +$h $a $m $a $n +$0 C +$c $l $u $b +i9gs0$K +z4o2u +$w q +Y1*07 +'6 $, +o0Z*10i6P +D4*89x09 +$y L8 ++7x85 +[ Z3 o56 +$-ty3 +p5oBt*96 +'8 i6P +x86y4y5 +i6t ^d x36 +*35 R4 +ss3p5o1g +l i53 *13 +$x Z5 +^y ^n ^n ^u ^f +*65*B6 +*A7x0B +y1o6u +$)$7x4A +d^Ni6H +i1dx54Y4 +t f x4A +smt i6i x02 +sKci9Vx26 +o6w { +i4e i52 +o2H T3 +x17^- +o2o R5 +2 +sh, x14 +^k *78 +*46i1'*23 +R8 R7 +z4 *17 +sOw +s8l l +E*23o1W +sO. +sOjL6 +u i31 +$e u [ +qo0^ +,Ao8C +u i32 +Z5 D1 +EZ5q +*80i1qo1H +u i33 +u i34 +u i35 +u s9_ +} R4 +z5z5*5B +*08z2$k +Y3R5*96 +i3l Z2 +o55 R0 +k $u ^1 +d *56 +Z1 o3i *15 +p3x95*08 +d *52 +s +o07 -5 Z2 +z3 +1 x49 +s/* +s/6 +s/Z +x23 D8 +$t u x01 +k ^1 $u +p1 K x25 +x71 i3h +o8- *68 +^X ,B +$R *06 +f x37 +i7u E +x96 'B +i8& t +o4e Z2 +^I *46 +^L+3skQ +sfh ] +o43 Z1 +E i8x +sAC E +$K oBk +o4t Y3 +y5 r +*83 x64 -7 +T4 T7 T8 +z1 z1 *25 +*39saH +$= $. +$= $/ +o5s t +smR +smO +{ *A7 +o2G D4 +y5 T3 +] i2_ +s5O $5 +x76 D1 ++8 -2 u +D8 *02 +i4! T0 +o0i Z2 +i9H ] +L4 ^H +[ s0c +$6 i7a o6< +z1 .2 +.7 +0 +x05 C +D5 L8 o7M +scC k +DAo1< +[ Z3 *52 +i9- x21 +*28 D3 +Y2 R3 +l ^a Z2 +t $] +t $< +T3 i5d +Z3 ^R +o5R -5 +$/ k +z1 $y -1 +o4K *38 E +x47 z1 ,5 +D7 x04 y4 +$2 $i +q x03 ^u +x04 $F +x24 ^c +{ $v +$D x75 .1 +$i $x +$O x53 +ss5 i4s +$Y k -7 ++6 szr +$& K +seq +o3w snj +K iAE +K iA+ +Z2 L7 E +sx1 +^i '8 +o6M { +o2D y4 +o7! i0g +$Y -7 k +D1 K k +c o7? +^c d +s9 D2 +C $E +} $= +ss$ si! +i62 i70 i91 i80 +i7E x07 +$F $F +$F $E +s2G +C $s +D2 Y5 +x45 T1 +c o7_ +$e +0 c +$> $? +oBRs/K +*91 ,9 +^N x78 +*15 T4 +^L *78 +*06 L0 o7/ +$G *07 +x71 x05 +R6 x24 +u $1 $9 $8 $1 +Z1 i6n +i55 u +*02 d +l $` +f x64 *45 +i39 scB +y5 $p +L5 ] *23 +K i9G +o3j ] .6 +l 'E +sbH ^0 +T4 i6D +i15 T2 +su y3 x27 +.6 *68 E +x35 $# +o8M i8l +x35 $T ++5 o2C +Y2 o5A +i2T [ +i2m d +s4s T0 o68 +t ss- +t sa1 i0S +$I .6 +$9 $7 $2 o7a +y2 *75 D0 +*63 [ i7< +s4K +s*L +Z3 o6a +i0O s42 +o0L L9 +^z x31 +$[ $[ +$[ $- +o6o C +d *04 '8 +d $h +f x17 ^t +scr slY +.2 Y2 +T9 T7 T5 +-0 Z1 +-A $F -B +*46 T6 +d s0k +p1 o4e +x72y2T1 +i4f $h +$/ s/Y +x21 stk p1 +r *24 +x52 T5 x13 +c T4 T6 T8 +*65 x03 Y3 +*64 r ++1 y4 +K E *98 +^G R5 +i44 *16 +D4 $e +D4 $_ +'8 $J +$T x83 +^e *28 +z4 x94 +z1 DB +i3b u ++1 ^c +-0i86p4 +i3" +3 +Y1 $F +x7AL7xA9 +$d sfM +i3x d +] $N +] $I +ss4 -6 +i2k 'A +o2o +2 R5 +i20 saF -3 +y2 L0 +*67 sfj +x09x61 +R7 $x +$0 *20 +x91 o4s +[ K $e +q x19 +$) s27 +[ T5 K +^q -A +o86 o1! +$, x82 +i6U x16 x35 ++7 x85 +-2 i40 +$! $= +$! $& +$! $% +$! $. +$! $/ +*15 $i +s`K +s4< +i26 ^s { +'5 [ y4 +o5/ ] +x71 ^N D4 +o6z l Y1 +*31 ^! +*AB x46 +,B x05 +D8 s2D +y2 T0 +u i2W +t i0S sa1 +o1m Z3 +Y2 Y4 +s1N +,2 y4 +o9G D4 +-3 sr1 *32 +x03 x81 +$9 z3 x35 +i7y -2 +^2 *08 +x47 ^H +$] $] +siC +DA iBS +x19 Z5 +$# *03 +u i27 +i2T sgT +Z2 c *B8 +u i29 +*70 t +xA2 ] +D1 k K +$e .2 +$@ Z3 x84 +$, -5 +oB# +^q x31 +o8d o3c +oBQ +T4 r t +E s.a +Z2 x25 +i06 i18 +o04 r +xA2 o8u +$+ $= +$+ $! +$+ $* +$v k +C i8n +^D x87 +R2 o4( s(1 +T3 sbP +R3 t -4 +$K *76 +x38 x51 +$ep3 +s36]z3 +^x x58 +i26 *62 +u x35 +Y3p1sFS +*32 s4T c +Z3 x41 +$I u -3 +c o2i +x51 q +s50 ^c +c k o0! +i2Ei8.o2V +o6r i7a $2 i89 +o3j .6 ] +x5Bu +c *06 +$# *45 +*92 t +$, *04 +x82 E +o4K E *38 +o8/ t +x3A ^k +sew t +x25 Z2 +^e ^p ^i ^p +^K x48 +r '9 +i3o Y2 +o3k ] ^u +o0Q D9 +$< $? +T9 T5 T7 +[ o6y +$! x91 +Z1 *87 +'7 $= +o0s ^i x46 +'7 $o +o09 $x +T9 t x35 +D4 C +*08 *19 +Z2 o3h ^S +T1 k +i8*[ +s3# ^p +o5D [ +i2> u o22 ++8 o0j +i5% c +} +A +y3 x34 r +x62 D6 +o3W u +*78 $r +*78 $T +^m E o8. +*20 x14 +l r ^+ +i7i d x28 +x03 i1B +$2 $7 $# $# +*40 scN $2 +o75 i6D +i0s Z2 +D8 x18 $O +o7Q c +$i T2 +i0K *43 +s3< p5 +x61 $) +$U $R +Z2 .3 +Z2 .4 +$v k *62 +sbv ^$ +$g sut ++4 K x01 +,3 y4 +T3 ,A +E oA0 +z2 o5w +x84 r +u Z5 x57 +C o4u +x74 '8 +$@ x37 +-5 z2 +i5A T7 +x62o2? +*70 -7 +^V s1t +*40 s5k +s0E o5c +x87 $P +E s3% +i7i i91 i8s +L6 o2g +o7p ^K +x15Y3L4 +D9 *75 +^y D9 +Z5 x58 +E t ^6 +y1 *59 E +u sUa +T2 +A K +$& $> +$& $< +x24i2Z +$& $* +$& $$ +s4b +$& $@ +$? $. +^i -1 +o7= ] +^j *72 +$= $> +x97 $Q +x12 *41 Z3 +x21 q +[ s2G +o1a Y4 +D0 i3e +$# D9 +s1# '8 +*54 Z3 +x73 u +$t o5G +sbe c +dxA5 +$E $E +o1b i35 +$^x32z5 +,A x09 +k Z1 t +z1 o2N +*02 i3y +z1 o2X +s20 'B +u i3w +u i3L +.2 ^y +.2 ^d +i2r Y2 +$L *47 +$- $@ +$- $[ +$- $! +$D $C +T5 $g +s0p Z2 +i12 i20 i33 i41 +z2z5 +R6 i0H +*30 o4R +sg0 +srg +r o2E +$d x74 +p1 x23 +$e $q k +$0 $6 $! $! +o9I *09 +D4 s3v +x13 o1? +$ *69 +xB4 $z +skG [ +sYyTBk +s0k -4 +CC*52 +*65 o6r +[ T5 +$; $/ +sCk i0S +i3T C +i9/ D8 +*80 x28 D3 +i8W -2 +$9 ^i +seL o5s +^* C +s4/ +x72 K i9! +o8s p5 +y3 D8 +7 ++7 Z1 *30 +K x08 c +i00 i15 +i00 i18 +d o4m +$3 d D6 +x28 -0 +*20 s2j +i8E ,3 +$h } +Y5 o0f +s5E ] +x13 q ++6 u s2p +*21 ,5 +x62 d s2x +f i1J x89 +s/**98K +x03 x48 +k o0e +k o0! +.9LAi2X +$L x69 +o4W [ +i63 i81 i72 +x36 *53 +x63 o0C +Z2 oB@ +T4 ^7 x31 +x41 ^d +r i9D +L0 T7 ++4 +0 '9 +s,d +s,/ +*75 x41 ^g +c T6 T8 T4 +*43 ^X ++4 '9 +0 +,8 T3 +x57 c +i33 $l o7g +x82 $I K +*53 x62 '9 +K *98 E +$3 C +x61 '9 +i08 i12 +$3 d +o9@ -8 +$D .1 x75 +-5 $y +Z1 i4t +i3o y2 +$3 u +oBd x46 +T6 D1 *56 +i3g ^f +{ [ d +i36 k c +T8 *41 *78 +u o1F +p1 +6 x13 +$ $. +$ $+ +$ $! +y2 shR +x62 o0f +*39 K x21 +c $J +-7 Z2 +^h ^a ^r ^a ^s +Z2 T2 +sko s56 +o0+ Y3 +sAJ +L9 x42 +o3s^'sj, +p1 x25 K +saT Y1 +.5 $y +u ^U +Y2 ,4 +^Y$w +D3 C +sae o0v +$F o7s +^9 $d o6f +c T8 T6 T4 +p1 x73 +y3 x3B c +^t o4. +snk s27 +o3r L2 L2 +Y1 +5 -0 +x65 i7C +x38 T2 Y4 +Z1 -1 *21 +i5# x13 +s(!i5! +sYlo0& +$\ $\ +x61 R7 +*9B Z1 +i5I*70*23 +^c s05 +*12 ^F D5 +Y1 -0 +5 +x39 $b +i3C ] +^0 ^1 ^0 r +^k ^o ^o ^k +x54 scs +d -0 +s1J x91 +Y4z1 +r x74 +Z4 +7 +sb[ +*57 o6, +,6 x81 +c T4 T8 T6 +c [ Z1 +*82 ^L ++1 Z1 i2x +i71 i91 i80 +y2 o4h +$* $_ +-5 *50 +EsnM*62 +$* $# +y4 ^I +c x57 +C *68 +'A $N l +syC +y3 c x3B +K Z3 x24 +z2 .3 +D5 *05 Z2 +*89 c D3 +^p x25 +o4t R3 +c o4k +R7 *32 +y3 ,2 +x12 Z3 +o7# K +*05 Z1 i5i +s3v +s3p +s3? +x41 x86 +*04 $G +Z3 *70 +t x04 f +s(PxA9s0e +*13 $3 +^w +7 +K t i8{ +[ iA/ +iA3 Z2 +xB1 x43 +x12 s5L +$6 x64 +D5 o82 +s4V } +y4 x83 x12 +p1 o2o ++5 i0t +x74 -7 +o0"xA3sV5 +T5 +4 +-5 Y3 +$_ $= +Z1 i7$ +R9 $@ +^b Y2 +s7!xB8sr| +*65 i3@ +o8+ l +o3P ] +} L6 +c K i6i +ly2z2 +s8G ] i1m +sqS +x83 Z2 +f '9 x61 +q *92 x05 +{ *18 x71 +*46 $u +{ D5 +^c r +o8+ c +^c c +i08 i17 +i08 i11 +q x1B -2 +$u t r +^e ^n ^n ^o ^d +ssu Z3 x54 +s+_ +stK sbk +oAP 'B +*49 swh +*6A x93 $A +i3e i5i i4l +*02 y4 +x36 y5 +iA4 iB2 +$a *24 +T1 Y1 *67 +i9Z D3 +*67 C +s0E -9 +*24 *A2 '8 +i66 o2R +i3O x84 +*28p4 +*03 $F +sAO x72 +sbD o6t +xB1 ,7 +^. D3 +u x21 K +i4I Y1 l +sLi +{ K i4h +o6m D3 +$% $= +$% $& +$% $% +D3 slW +E ,B +i02 i20 i10 i31 +-7 srM +T8 T2 T4 +[ i4D +x37 E +u $- +s06 T6 *40 +^D R8 +^L z2 +s87 x43 +iA! ] +T9 *97 +K Y4 x83 +R7 .5 +o4a *04 +o4v L0 +scA *17 +u $C +T1 o0' +snu x14 +Z2 E L7 +i3p z1 +$3 x64 +i61 i79 i91 i89 +x84 D6 +C ^s +C ^0 +x06 o7! +$t $v +Z1 i1e +Y1 x83 $F +i42 i60 i50 i71 +i42 i60 i50 i72 +c T8 T4 T6 +*52 $6 ++3 $m *49 +x32 *98 c +iBS x02 +{ o1a +$, $; +D8 $O x18 +o0& k +D2 Z1 p1 +saQ +o6t ^m +T5 *7B x87 +s9A -3 +x21 y4 +o5I $z +x92 x61 +E o5A +z3 x51 +^j *57 +d i7u +*96iBE +*39 x21 K +^t K +r Y2 .2 +E *23 o1W +k ^r k +i6C q +x64 $Y +$e c +0 +^G R5 x81 +*86 x81 +*24 ] +p1 $Z +i7q z1 +R6 $; +^sR6p3 +i9n $@ +^@ .9 +x53 ^p +^C x18 +-9 Y4 +s5D l ^K +$/ .7 +z2 o0n +x62 s2x d +s8c Y4 T7 +K o4C x81 +y2 *52 +*78 o7W +i1w ^m +x71 y3 x91 +,2 o6j +*28 T5 +^# Z1 +$4 x47 +-AK +z5Z3 +s5A K +*24 i6P x72 +sk2 i3m +o0b x31 +x54 i8_ +x17 c +x17 d +x17 C +i12 i20 i32 i41 +i12 i20 i32 i49 +i04 i17 +i04 i18 ++0 y2 +D3 T1 -7 +*12 Z2 +$$ $. +^i { *13 +x82 skJ +c o4! +r i3. +o0T ^C +] T6 +x92 o7J +i4I l Y1 +-8 o9, +z3 o12 +x2As&R +z3 x65 x63 +y2 y2 TB +s6U } +R4 i0s +s4s o68 T0 +x04 o0m +x72 TA +i5f r +y3 -9 +^# x72 +R3 l *46 +o2H t +Y2 $1 iA1 +^W *75 ++7 $, +Y3 ^B +i2. x94 +Z2 o0b +i52 i71 i89 i60 +*10 siu +z1 T7 +Z2 k *45 +xB1 c +u ,2 +x03 skK +'5 c $R +x57 p2 c +$3 i7< +*34 i7C +{ $h +{ $y +x81 R0 +x7A $5 +stK +[ o5c +iAK +'7 -6 +^w T7 +xB2 x36 +Z3x4Bo2$ +i4i sal +T8 x15 +$V y4 +k i2s +k i2! +$d u D2 +^_ x51 +o8B ^1 +s_@ i99 +xA4 T5 +o6B x04 +s.[ +sfC E +x52 u $C +$c *53 +y3 +7 D8 +k ^P +szm -5 +x52 ] +i21 i39 i46 i56 +[ z2 t +t i37 +ss$ T4 +x73 T6 +-1 i82 +i02 i18 i28 +xA5 $_ +s5@ x63 +E i9? +E i9m +l ^5 { +'6 ^L +o4=x62 +xA2 x81 +u $U +^C*42p2 +*80^o +x24 x19 p3 +*A8 x71 x42 +^N *48 +sbK +^'t +$1 sgk $- +i6. x91 +Y2 iA1 $1 +,2 $c +Z5s|j} +,2 $= +t ^I +slI +D3 -7 T1 +ss$ T8 +sgv sbg +L0 Z2 Z2 +C i4i +} k u +$) $& +.5 i5B +^7 $E +D8 oA. +s8G i1m ] +[ *74 +$7 d D6 +$. $g $h +K s8K +Z2 *37 +$B x46 +t o4t T1 +i7g $o +^9 o6f $d +$7 d D4 +D0 x24 +*A4s[6 +y2 s9G +^5 L7 +s=A +z1 s6G +x01 Z1 +o3H ^5 +R3 *30 +i8,o2; +xB4i5@} ++9 x63 +d skz +s5n E +i33 i44 ^2 ^1 +sli R4 c +c i5! +c i5' +T5 x74 +o4d o3j +z3 x63 x65 +$^ $< +$^ $* +x45 scw +L8 ] $t +[ soW +.4 Y3 +*32 { +c i5$ +Z1 *15 o3i +sdO +i1K +T0 ^P $b +o9D [ +o6_ s!- +$v *81 +K x81 o4C +szp o6J +[ R3 Z1 +$h o5E +s76 $f +soW E +p1 D7 +$Y L7 +*89 D3 c +y2 D1 $I +y1 E *59 +$Y L8 +o8 x06 +{ i4h K +i61 i81 i73 +p2 x7A *07 +i32 i51 i40 i62 +o6. ^h +x91 R8 +sby ] x31 +L5y4 +^n ^a ^h ^c +$b Z3 +T7 so0 +^x } u +x92 $m +L5 $R +sni K +k i40 +x62 i8? +-2 *01 +*32 $g +i6# .2 +D5 $" +$7 ^m +x04 f +i8t t +i20 -3 saF +x85 D8 $L +ssU +x23 p2 +y5 ^t +Y1 o1Z +x13 i5F E +RB x65 +[ sdx +o1U Y1 +svR -2 +-0 st2 +i4K *63 +$$ $& +T8 T4 T2 +x75 ^D +x75 ^R +x43 $z +saz ] +^7 ^x +i62 i70 i83 i92 +*29x57 +$$ Y1 +'4 p2 +i3d -1 +D7 ^q +x72 T9 +p1.4-3 +*53 R6 +,B $. +si` +o3e C +s.$ +o4M u { +r t +-3 smH +c *9A +'5 $e -5 +sr2 R5 +l R8 +c T6 T4 T8 +o5$ E +Z2 o7x +l R0 +^1 o6Y ++0 i4 shk +s.g +^=iAb +x43 $d +L4{ +^3 o16 x37 +*1B x17 +x08 ^W +[ Z5 Z4 +*25 i4E +i16 i70 +$+$| +$]$( +^q c +i19 i70 +i1d i33 +$<$) +$<$} +i57 i16 +i5b i36 +L1 ^r +$*$; +i36 i5b +i32 i17 +i7c i38 +i53 i18 +i52 i10 +i17 i72 +i17 i74 +i16 i73 +i19 i1c +i7b i15 ++3+D +i50 i1f +i58 i10 +i36 i7f +i5f i37 +i5f i35 +i7d i36 +x15 -4 +i19 i1d +i18 i75 +${$/ +${$. +$[$& +$%$' +i58 i7c +i53 i19 +i19 i5b +i5f i19 +i75 i11 +i11 i1f +$/$_ +D0 c +i7b i13 +i55 i7c +i33 i7b +i10 i57 +i75 i33 +i7f i30 +i7f i33 +oAw [ +i15 i58 +^x $y +i56 i14 +[ Z2 ^0 +$`$+ +i7e i13 +$<$; +$'$= +i3b i56 +i3f i57 +i30 i1f +i35 i14 +i7b i32 +i59 i7e +$,$= +i14 i5d +i30 i7f +i15 i3e +$\$' +x29*62 +sY_o8E+0 +Z3 x85 +x56 $a +*39 o0d +sIY x42 +sy0 +o90 sES +D7 sGI +-5 R7 +*03 *09 +-8 z1 +-5 +C +-7 +B +*96 *46 +o55 t Z1 +$d { ^o +*31 q +sSe i0G +x12 ,7 +i4b o2n +-7 s!. +,4 i92 ] +Z3 x82 +s3e $7 +z3 x2A +iAb x52 +x18 Y3 +^B R7 E +*32 o9v +*84 i9@ +d x19 o4O +s@R +x93 R8 $L +$. $n $u +'9 *75 +^j x81 +K o6N +o7e l +sof +*9A $7 +o0y ,8 +*26 R8 +Y1 *48 +sF= -1 +,A x41 ++1 Z4 +s'3 +x16 Z5 z2 +.8 *75 +i60 xA1 +*B0 'B +x53 y2 K +*5B i7i '9 +sgv x92 +*80 *45 +.5 x83 +-0 C ,7 +*94 *47 +*79 D9 .2 +*79 .2 D9 +i4C z1 +$& $4 +xA5] +-9 Y3 +x25 s8. +*27 *06 +y4 x96 +Z2 ^a +.6 *48 -6 +svn *86 +x16 z2 Z5 +z1 ,2 +o07 *34 +Y4 x1B y4 +K o5h +C K } +$i *A4 +x41 *61 +se8 +2 +$9 $i +.7 *32 +*51 *70 ,6 +Y5 x21 +x23 *20 Z1 +sFw -6 +.6 -6 *48 +Z4 o30 +*36 D8 +Y4 x71 +x18 p4 ++8 sMW +$2 sr% +t sOF +R7 ,5 +sph *12 +x45 spb +k sPg +*35 R2 +y3 x75 s1b +i19 +3 +C *75 +x53 K y2 +s47 sis +o2m x83 .6 +x64 $l +^ z4 +^/*65*01 +*72 ,4 +l *57 +$5 x56 Z5 +-4 *60 +-8 st7 +*72 +9 +i2v x82 +R5 D8 +*52 *20 +o61 sPJ +o82 r +R6 $a +R8 -9 +*06 i6y +*92 Z5 x45 +K t x92 +,A .6 *45 +l Y2 +l *24 o0O +*01 *53 R6 +o1i *27 +*97 Z1 +o0h +9 ++5 *61 +i89 u +o3r x91 +-2 ] L0 +s96 x04 +$= [ +{ x82 +R8 +0 +x04 $q +x82 o1t +z1 D8 +$5 $1 $5 $! +sQW D1 +,9 x63 q +R2 -1 +i1o i3p i2o +i30 i59 i41 +y3 x27 +o4n o7k +*83 '8 +t ,A +] x49 +y3 *1A x54 +K o9, l +sQ! +x12 *27 $s +*38 *67 ++6 x01 ++7 *05 +] *97 +$d *87 o59 +$7 *58 +x52 R8 +Y3 i3x +*50 z1 +R7 .8 ] +*92 *23 D9 +sSQ +sSH +*95 o5t K +*91 .8 +'A o4* +u x31 +l saH +x13i3E +y4 Y2 D4 +R7 *24 +L8 x21 +*70 o9x ,7 +,A *45 .6 +o8& ,6 +y1 o9q +[ o5) +*74 *50 K +K *02 -5 +Y1 x74 Z3 +*16 x13 +x31 *12 +s18 x26 +Y2 i7l +^B E R7 +sLo T1 +szO +Z1 sHP R8 +-1 oAi +o45 i22 +R3 x21 +D7 ,6 +] *59 +T7 T5 +*04 *50 +E siL } +y5 x28 +i7i '9 +o7u *14 +i9p o6a 'B +$0 $8 $7 $0 +R5 *53 +L9 D1 +*5A '9 +*80 D0 +^9 iB3 +l i1R +*70 *02 +^R C +sli o96 +o5u D7 o7B +^Z R8 +s*O +.7 *A5 +c *48 +oAs *13 +*95 *6A +*85 x15 +sIO +'1^"sNj +Z4 D4 +*67 k x82 +x29 o1j +sPQ +3 +*29 x23 +*60 } +D2 i8o +t *94 +t *90 +*73 *03 +*56 o7n } +x42 sI@ +*89 -9 .0 +swi +R7 ] .8 +R0 -1 +sgx o5d *13 +i67 xA2 +l o0O *24 +p5x0A +-0 xA2 +*61 *84 +s98sAY ++0 x38 Z4 +sHD +Z1 R8 sHP +*67 x82 k +k syq +Y4 x86 *57 +Y4 *57 x86 +s.W +y5 D5 +sy9 K +i51 *38 +Y2 iA7 ,7 +q xB5 +R6 x15 +r *61 t +sMz +*24 o3C +Z1 *23 +2 +Z5 R9 +^y c +-7 sdg +Z4 x37 +i72 i90 i80 +z1 *94 x12 +D5 l *57 +*86 i1e +*14 *65 +sks z1 +x76 ,7 +sNM r +i0m i2n i1o +f xA5 +x42 *49 +R9 T1 +sQg o1E +L4 K +o9E *20 +*84 t +R7 *46 +d i5o +x51 *16 +.2 sJN +R4 { +d i5p +-2 L0 ] +^m ^r ^o ^w +,4 *58 +*57 x76 +-8 sTM +o6# o0T +sx1 ] +Y2 R7 +i2R l +D9 scs +{ o7r +*04 o51 +Z4 { x93 +x31 Y1 *96 +*36 sn1 +xB2 .9 +T1 srz ++5 $x +i2t i4e i3h +o2m .6 x83 +*51 z1 +*71 ,6 +$l ,8 +o73 svt +D8 *70 +*14 R2 +*14 R3 +y5 DB ++5 *5B +x41 *59 +*B5 x83 +sHR +*74 K *50 +o43 'A +-7 *8A +l s10 +s@ +9 +sCI +sCJ +$w *76 +[ s.K +x71 sar +^Y*B5 +D8 $y +l +9 R8 +i1i i3a i2l +l *68 +*73 iAm +.8 *69 +.8 xB2 +z1 -2 +y5 x97 +i5h Z2 +i5i *76 +-1 *04 +*70 ,7 o9x ++4 Z2 *52 +R1 x84 +Y1 *69 o5v +Y1 R6 +sEC +$* z2 +xA3 i82 +$1 $6 $4 $5 +x41 r +z1 *73 +l $N +sam x51 D4 +{ *60 +*12 'B +*47 k o3b +*64 x41 +DB x41 ] +D5 *57 l +*6A ,6 +D1 l $F +D3 ^O +d o63 +*92 D9 *23 +*70 i6l +t *50 +.1 sOK +l p1 x48 +*89 .0 -9 +'A svz +Y1 o6w +l ^U +l ^k +-9 *A9 +x17 Y5 +o25 *67 +i51 i62 i73 i95 i84 +*84 +1 +-A o59 +*76 .2 +Y1 *9B +R8 D2 +K *37 D6 +^b *59 +o2l s4f ++8 *8B +*52 *04 +l o1c +d *7B x8B +o81 scw +$^ $4 +,6 { x62 +Z1*20Z3 +^x k *35 ++8 *60 +*35 x64 +Y1 o5v *69 +C ,6 +i2j z2 +0 +] k *26 +x62 u +x93 sLX +K -5 *02 +K svw +.0 E +c $a $n $n $e +sux K +*82 x41 +sVZ k +,4 ] i92 +*95 C x21 +x93 $L R8 ++A *54 +*3A o60 +E } siL +x23 Z1 *20 +*14 K +x32 *38 ++1 Z5 x24 +l R8 +9 +sme +6 ++1 x24 Z5 +^6 x81 +^a ^y ^a ^m +] x91 $h +[ sz8 +x62 Z1 +$0 $4 $7 $6 +y3 s1b x75 +*50 c +*47 o3b k +x92 k +*72 +2 +.6 -5 -9 +.7 o1h +^8 k } +T7 $h +.4 *08 +,8 .3 *24 +R1 *43 +l scp +xA1 *61 +u s2n +*67 i6; +{ *51 +x02 Z1 R2 +R3 l +$2 *67 +Z4 x02 ++6 *61 +l *06 +*95 x21 C +l $| +$2 *59 +c scD -9 +[ ^a st< +Y3 o88 +x71 +B +*47 i0i +Z4 x93 { +^F E +k ,9 +x53 *47 +,6 R2 +k ,4 +LA i8e x25 +-1 s9s +'8 y4 +$9 R6 +*36 x48 $1 +i1E D0 +] *26 k +R3 *46 l +x5AZ1 +-6 +B +K x92 t +T1 *45 +c L0 +.7 xA1 +R8 $Y +*4B x42 +o37 k *06 +} o4b +sos $c +x51 y3 +D5 o82 ,9 +D7 *94 +s87 x61 +*7B o74 D3 +C $d +K l o9, +$8 $0 $9 $2 +-2 *09 +i8l [ +y4 x51 D7 +sa2 Y3 +Z3 x25 +T8 ,1 +i2z [ +E *71 +*46 sMr c +sTC +Z2 -7 *52 +sQ%i2U*25 +x43 ,2 +t } *08 +,7 o3r +x24 t *13 +*56 [ +*85 o0d +y2 u +l R9 +o60 r +y5 xA6 +r t *61 +sSZ *67 +r o9N +x67 i3l +i2t R7 +-0 ,7 C +*54 x63 +sV- +o2g ,A +*73 .3 [ +Z4 o3u +*36 R0 D3 +DB ] x41 +sJC x62 +x71 ^e u +su0 +.6 *74 Z3 +*6B .6 +o87 DB +i3/ +4 +sRL { +^] x42 +.1 *16 +t .8 } +sDN +o0z x53 +D7 i2x +*12 R3 +*63 L3 +sEK ,7 ++B D3 +-0 xB2 +t *62 +*A6 *46 +*87 *42 +c i8r +Y3 x53 +L7 i6d +i3g $x +D1 ^% +.6 -9 -5 +*83 *96 +Z4 RA +Z2 *52 -7 +*48 x83 +[ st< ^a +x21 .8 +-5 *87 +-5 *82 +siu*52 +y4 D4 Y2 +$8 *84 +.7 o3h +T4 *9B +oA4 D7 +] $h x91 +sZ. +-6 y2 +*28 $1 +$P x26 +*30 sZS +x02 sdn +-B +D +R4 -6 Z2 +i88 *12 +*86 i2l +*36 o00 +Y3 i8o +*82 spa +s3o +5 +*92 x45 Z5 +$z *85 +i41 *A4 +sLh +z3 z3 ,8 +Z3 ^5 x34 +*75 +9 +-0 xB1 +$d o59 *87 +Y2 ,7 iA7 +^8 K +x61 $y +*95 *87 +o5m -8 +y2 x01 +*51 ,6 *70 +o7r ,6 +,6 s4f ++2 d *42 +u o0M +s e +R5 K *65 +l ^O +*78 C +} x61 +R1 E +D5 *64 +Z1 x36 o60 ++B .A +sAX +x21 Y3 +,A x31 +sya +.8 Z1 +E T2 +x54 Z3 +siZ R4 y3 +i62 i70 i82 +o64 ,8 Z1 +s-8 +$Z $3 R6 +Z2 L0 -7 +$1 ^8 +$1 ^9 +oB_*6A +$1 ^3 +$9 ^? +$1 ^] +s=J+9i1Y +c ^7 $& +c $9 $= +c ^7 $* +r $& +c $. ^4 +c ^8 $/ +x46 l '8 +$e i0p *52 +c ^- ^5 +$8 ^3 +$8 ^1 +$8 ^0 +*75 { +$8 ^$ +$? ^8 +l Z2 ^a +$? ^5 +$? ^$ +c $0 $< +c $0 $= +c $0 $> +c $0 $% +o2p D0 D4 +syioA+z2 +c $< ^1 +c ^{ $} +^^ ^1 +c $> ^1 +r z1 i4f +c $_ $! +c $+ ^1 +l L4 +$4 ^0 +dxA1sP* +x45 x53 +^@ ^4 +$4 ^& +$4 ^/ +$! Z4 +$4 ^* +$; ^2 +$s s1_ L7 +-5 +1 L0 +c ^= $0 +$@ ^! +R3 o2c +c $! $? +c $> $8 +c $> $> +c ^@ $# ++9 xA2 Z2 +^i i8u +s_1*7B +syz +R5 *34 +c ^^ $5 +c ^. ^9 +c ^# $5 +c ^# $3 +c ^# $2 +i12 i0f +D4 sg- +*17 -8 +^( ^3 +$) ^0 +$. ^, +s02z3.6 +o6& $2 +$b o3t +o1f $b r +^$ ^5 +*36 D3 R0 +i3c T0 +$! ^? +^ ^0 +t o3R r +^ ^6 +^# ^2 +^# ^4 +$0 ^[ +$& ^7 +$0 ^# +$0 ^+ +$0 ^- +$0 ^< +$7 ^# +$7 ^/ +$7 ^- +$7 ^; +$7 ^` +$% ^% +$% ^5 +$= ^8 +c ^| $1 +$3 ^^ +^2 ^& +^2 ^. +^2 ^* +c ^0 $+ +^* o4z +$3 ^/ +c $8 $= +c $( $( +$I -3 u +c $( $4 +c $( $5 +s6Fr*47 +p1o4po0v +c ^5 $- +c ^5 $/ +c ^5 $% +shs $5 +K r p1 +$_ ^8 +c ^* $9 +$_ ^0 +c ^* $! +^S +8 t +x4A^W} +o3A -1 u +TBi2* +c $- $- +c $. ^9 +^1 ^{ ++3 x47 +^1 ^; +^1 ^> +^1 ^/ +c $; $0 +c $; $4 +$7 ^5 +c ^$ $2 +L4 Z2 +D0 s7b +c ^$ $9 +i5K x64 +$9 ^< +$9 ^5 +$9 ^0 +}z4x87 +$9 ^^ +$9 ^_ +^f x75 +c ^6 $2 +$9 ^` +c ^6 $5 +c $2 $; +c $_ $_ +c $< $8 +c $2 $` +c $2 $~ +c ^/ $1 +c $9 $^ +^g L2 +^8 ^- +^8 ^= +^< ^1 +^5 ^- +c ^| ^1 +^5 ^# +^h sn4 *31 +^. ^6 +c o12 +c ^2 $@ +c $# $! +c $# $# +c ^_ ^6 +c ^2 $- +c ^2 $+ +$/ ^2 +d x81 +$+ ^2 +$+ ^9 +c $/ ^5 +c $/ ^8 +c $3 $) +c ^9 ^@ +i8e *45 R8 +^! ^7 +^! ^5 +c ^1 ^. +c ^5 ^@ +c $8 $- +^0 ^_ +c $^ $5 +^0 ^( +^0 ^< +^3 ^. +c $9 $/ ++1 R4 +c $$ $9 +c $+ ^2 +c $+ ^0 +c $1 ^| +c ^0 $= +$< ^< +c $. ^. +c ^< $1 +$w u +^7 ^* +$3 ^4 +c ^, $1 +c $4 $( +c $4 $, +i3q { +c $= ^0 +c $9 ^* +c $9 ^! +c $9 ^$ +$% $! +o0D ^I +c $1 ^< +^7 ^_ +c $1 ^, +c $1 ^/ +c ^0 ^( +[ Z1 R3 +^7 ^# +^7 ^= +c $% $9 +c $6 ^! +c $5 ^# +c $5 ^6 +c ^# ^3 +c ^$ ^3 +c ^$ ^7 +c $5 ^@ +c $5 ^^ +s8$ t +L4 l +c $@ $@ +c ^. $2 +c $- ^5 +c $- ^2 +c $2 ^$ +c $/ $9 +c $2 ^# +c $/ $/ +c $# ^@ +^9 ^) +c $# ^1 +l { +p1o3a +c ^_ ^5 +oAwsk?L5 +z4o44 +c ^2 $_ +c ^- ^3 +*32 x38 +c ^- ^0 +x26 $r +^+ ^3 +^= ^0 +c $@ ^4 +c $@ ^2 +x06 Z4 +c ^. ^6 +c ^4 $. +c ^. ^8 +c ^4 $@ +$4 ^6 +c $, $5 +c $) ^1 +Z4 *10 x17 +c ^* $4 +c ^7 ^# +y2f +c $. ^3 +c ^8 ^* +c ^8 ^@ +c $^ $3 +^! *40 +c ^0 ^` +c $? $6 +c $? $0 +c ^. $. +c ^. $4 +c $% ^5 +c $% ^6 +c $* ^7 +c ^9 $! +c $2 ^. +c $/ $0 +c ^9 $. +c ^3 $. +c $2 ^6 +'6 +1 +c $} ^{ +L5 D0 +x71 x41 [ +c $8 ^0 ++5 } +c ^1 $< +c ^1 $> +c ^1 $) +c ^1 $+ +i9Cs4` +c ^1 $# +c ^! $9 +c $3 ^# +$ *47 +x3Ax95 +sR5*15sl4 +c $0 ^= +D2 suq +c $_ ^2 +c ^% ^3 +'B $I +[ o3U +^t ^a ^m +c $! ^* +[ o3I +[ o3J +c $! ^9 +c $& ^7 +c $) $7 +c $) $5 +c $7 $~ +c $4 ^* +c $4 ^. +c ^6 $% +o5N x02 +c +4 T5 +$, ^. +$, ^, +c ${ +$ ^7 +c ^0 $8 +$6 ^9 +$6 ^= +$6 ^< +$6 ^> +^)s9v +$6 ^& +c ^, ^1 +$$ ^7 +*02 *13 +^> ^1 +c $= $8 +z3 -5 -3 +$5 ^6 +c $7 $; +$# ^@ +c $7 $( +r o07 +c ^! $6 +$# ^8 +-7 Z3 +c ^@ $5 +$2 ^[ +$2 ^? +$2 ^; +$2 ^# +sfn [ +$2 ^( +$2 ^+ +*30 R5 ++3 } $c +^; c +p1 x45 .A +*06 x3A +C $9 $8 $7 +*06 p4 +x93 i41 +Z1 sca +o08 z3 x64 +*52 'A +C $5 $1 $0 +C $7 $0 $0 +C $5 $7 $7 +x6A *65 +c $0 $2 $2 +p5 .2 +C $8 $0 $0 +c $7 $5 $5 +sY7 +C $1 $5 $8 +D9 *08 +Z1 x56 +C $2 $0 $0 +C $4 $7 $7 +C $0 $3 $3 +x29 y4 p3 +D1 iAn +$g Y2 +*19 *61 K +c $4 $5 $7 +[ shf R3 +*51 ^' +c $5 $9 $0 +c $5 $7 $0 +i2Z ^w k +^@ z1 +u $3 $6 $0 +x18 ,6 p5 +x56x49r +$p x17 +xB6 x76 +x71 *7B +c $4 $4 $7 +c $4 $4 $6 +p4 i9R +c $4 $4 $0 +c $4 $6 $6 +C $1 $5 $9 +C $9 $9 $3 +*37 *45 +*03 sqt +L1 l +x75 o8h +o0Z $Z +x18 ,6 +C $7 $8 $9 +xA9 x05 +C $1 $5 $1 +C $1 $5 $7 +*61 o6O +s}Wy5z5 +c $7 $3 $0 +-6 i6x k +C $3 $0 $0 +l xB4 +l slM +C $7 $2 $7 +i2b x92 +p2 x54 i4r +*65 *74 +} i09 +u $1 $6 $1 +[ o3p sgs +$} +5 +C $1 $8 $2 +p1 l +c $4 $9 $5 +{ x37 ^' +x95 x12 +C $0 $1 $0 +C $1 $2 $1 +C $1 $2 $2 +C $1 $2 $5 +i23 Z1 *63 +z3 y4 +^^x54*42 +c $7 $7 $1 +u $1 $3 $3 +x26 q x71 +*19 K *61 +^q y2 +c $3 $4 $4 +slk x1A +C $9 $8 $9 +C $6 $2 $6 +[ R3 shf +c $1 $7 $4 +C $1 $4 $7 +x25 D0 ,5 +c $8 $5 $4 +C $3 $3 $1 +^t ^e ^l +*A1 T3 +i17 L1 L1 +i3e R4 R4 +i79 R6 R0 +i7e L7 L7 +i12 R5 R5 +i12 R5 R3 +i1f R1 R0 +i5c R8 R7 +i14 R7 R7 +i3f L6 L2 +i51 R6 R6 +i3b R4 R3 +i39 L8 R4 +i19 L1 L1 +i35 R4 R5 +i79 L7 L8 +i79 L7 L7 +i3f L2 L6 +i30 L7 R4 +i5a L0 L0 +i15 L1 R3 +i30 R4 L7 +i7f L3 L6 +i7f L3 L1 +i1d L4 L6 +i34 R8 R8 +i79 L8 L8 +i79 L8 L7 +z2 o0Z +i1a L7 L3 +i59 L3 L6 +i7d R2 R1 +i13 R0 R5 +i10 L0 L0 +i35 L6 R1 +i1a L3 L7 +i59 R8 R8 +i5d R6 R5 +i1c L5 L6 +i16 L6 L6 +i3d R8 R8 +i39 L7 L7 +i13 R5 R0 +i7d L8 R7 +i73 R9 R9 +i1a L7 L2 +i71 R8 L7 +i1e L0 L5 +i51 R0 R0 +i54 R6 R6 +i3e R0 R0 +i36 L3 R4 +i31 L8 L8 +i72 R6 L7 +i35 R1 L6 +i5d L2 L7 +i16 L7 +i15 R6 R6 +i17 L0 L0 +i56 L7 L7 +i54 L9 L2 +i3f L7 L4 +i37 L7 L7 +i7d L0 L0 +i1d L6 L4 +i72 R8 R8 +i38 R7 R5 +i34 L7 L7 +i5a R8 R8 +i5c R7 R8 +i1f L7 L6 +i52 L0 L0 +i3e L2 L7 +i56 R3 R7 +i14 L0 L0 +i1a L6 +i79 L0 L0 +i78 L7 R6 +i5a L3 L2 +i7f R5 R6 +i3c R5 R5 +i3b R3 R4 +i79 R8 R8 +i3d L2 L6 +i59 L6 L3 +i58 L5 L7 +i7d R7 L8 +i7d R7 L9 +i7d R9 R8 +i35 L1 L7 +i30 L5 L2 +i12 L2 L0 +i3d L6 L2 +i1f R0 R1 +i1a L2 L7 +i13 R7 R7 +i13 L0 L0 +i3a L4 L4 +i7e R0 R0 +i1a R5 R2 +i39 R4 L8 +i1a L6 L4 +i17 R6 R6 +i71 L7 R8 +i38 R5 R7 +i72 L7 L8 +i70 L0 L0 +i54 L7 L7 +i1e L7 L5 +i3e L1 L7 +i56 R7 R3 +i78 L6 L7 +i57 R6 R6 +i34 R9 R9 +i5d L7 L2 +i6n i7i i8e +i7d R6 R7 +i11 L7 R3 +i33 L6 L3 +i3a R0 R0 +i32 R4 R0 +i12 R2 R0 +i7f L6 L3 +i3c L7 +i72 L7 R6 +i30 R6 R6 +i10 L7 L7 ++1 i2x Z1 +i36 L4 L4 +i5e L1 L6 +i11 R3 L7 +i37 R2 +i35 L7 L1 +i1b R5 R5 +i3a L1 L7 +i35 L3 L3 +i39 R7 R7 +i52 L7 L7 +i5e L6 L1 +i12 L0 L2 +i1c L4 L6 +i72 L8 L7 +i72 L8 L6 +i1b L0 L0 +i1a L4 L6 +i30 L2 L5 +i37 L0 L4 +i35 R5 R4 +i35 R5 R2 +i3a L5 L5 +i1a R7 R7 +i31 L3 L6 +i15 L7 R3 +i12 L3 L1 +i1e L5 L7 +i1e L5 L6 +i1e L5 L0 +i7d R8 R9 +i71 L6 L6 +i74 L7 L8 +i3b R5 R5 +i16 L3 L3 +i72 R9 R9 +i1b R3 R0 +i50 R6 R6 +i78 L0 L0 +i54 L0 L0 +i5e R7 R7 +i5e R7 R8 +i73 L0 L0 +i5e R8 R7 +i74 L8 L7 +i5d R5 R6 +i37 L4 L0 +i33 R6 R6 +i58 L7 L5 +i52 R1 R3 +i7f R6 R5 +i7a R6 R6 +i78 L7 L6 +i78 L7 L7 +i78 R6 L7 +sbL Z2 l +i3e R6 R6 +sQ;*25 +i52 R0 +i50 R6 +i7d L9 R7 +i12 R0 R2 +i54 L6 L5 +i54 L2 L9 +i7d R1 R2 +i79 R0 R6 +i75 L0 L0 +i75 L8 +i75 L2 +i75 L6 +i1b R0 R1 +i1b R0 R3 +i32 L0 L0 +i54 L5 L6 +i3f L4 L7 +i3f L4 L4 +i7f L1 L3 +i3e L7 L1 +i15 R3 L7 +i3e L7 L2 +i15 R3 L1 +i14 L7 L7 +i36 R4 L3 +i50 R7 R7 +i31 L7 L7 +i15 R7 +i3a L7 L1 +i5e R6 R6 +i19 L3 L3 +i5a R0 R0 +i1f L6 L7 +i5a L2 L3 +i35 R2 R5 +i72 L6 L8 +i57 R8 L5 +i33 L7 L7 +i1c L6 L4 +i1c L6 L5 +i33 L3 L6 +i72 L5 L5 +i3a L0 L0 +i31 L6 L3 +i12 L1 L3 +i32 R0 R4 +i32 R0 R0 +i7d R7 R6 +i1e L6 L5 +i1e L6 L6 +i57 L5 R8 +i70 R8 R8 +i31 R6 R6 +i18 L0 L0 +i52 R8 R8 +i17 R0 +i1b R1 R0 +i3d R4 R4 +i12 R3 R5 +i52 R3 R1 +i50 L7 L7 +i1a R2 R5 +} y4 s^U +o2z C +} $z } +} z1 x58 +} s^U y4 +[ c ^x ] $x +[ ] C ^x $x +[ C ] ^x $x +[ ] $x c ^x +[ C ] $x ^x +[ ] c ^x $x +[ ] C $x ^x +[ c ] $x ^x +[ ] c $x ^x +[ c ] ^x $x +[ C ^x ] $x +f -2 x3B +^g o52 +c ^6 +i5t i6h i7a +i0t i1r i2i +i6l i7l +r *20 +x73 x29 +y3 K +0 +[ t z2 +y3 +0 K +$g o1o +s / +u i4F +o42 *24 +x28 y3 +Z1 x63 +i3i ] +T0 *35 +DB $n +Y1 p3 $t +o6_ y1 +p4 '8 +$o o7y p3 +y3 x72 +*68 x81 +K $+ +Y1 .4 +y3 ,7 +$3 E +^` ] +,1 ^c +y5 x94 +y3 Z1 +p1 '9 *87 +p1 *87 '9 +*24 o6c +y3 syh +z1 o3c +i64 Z1 +$0 $h ++8 K +$L u +*95 D4 +.3 o5z +^T ^V +Y2 $t +y2 y5 +y5 Y1 +z1 ^o +'8 Y2 t +$x -9 +i61 ^t +-6 y5 +[ o1n +o1d +1 +r .4 +i1w Y1 +^c x12 +x61 Y2 +o7u $n +-0 R1 +o2e ^s +s.8 p2 +} i4m p5 +.4 *63 +o55 y4 +Z1 o4c +'8 t Y2 +$s $e +o8e *58 +Y4 D5 +D3 o6t +*54 ] +*87 '9 +Y3 -8 +] x81 +} ^L x73 +$g { +Y4 x35 +] ] u +s!+^=x0B +] u ] +] ] ] T0 +] ] T0 ] +$2 -8 +] T0 ] ] +r $t $y +i4c d +D2 DB +^g p1 +i01 i19 i35 i28 +i32 i40 i51 i69 +l $2 $0 $2 $8 +'7 i34 i50 i42 +x46 '8 l +i01 i26 i19 i30 +i01 i26 i19 i39 +d 'F $9 +d 'F $7 +d 'F $3 +d 'H $0 +$4 $q L4 +D0 DA +i31 i58 i49 i62 +d 'G $5 +*92 x57 +*31 T3 +o7t L8 +i32 i40 i52 i62 +C $1 $9 $8 $8 +i01 i29 i19 i36 +i01 i19 i31 i27 +[ i3& +t ^R +5 +'6 i64 i72 i80 +i12 i20 i40 i31 +i02 i10 i38 i20 +i02 i10 i38 i22 +D9 DA +i01 i29 i39 i19 +^a ^n ^a ^d ^a +D3 DD +D3 DA +i31 i49 i66 i56 +'6 i24 i40 i32 +i01 i28 i19 i39 +i01 i28 i19 i37 +i01 i19 i37 i28 +i01 i19 i37 i29 +l $1 $9 $6 $5 +l $1 $9 $6 $8 +i01 i19 i32 i29 +i02 i10 i31 i20 +Z1 *0A [ +D5 DD +i22 i30 i42 i57 +i02 i10 i32 i22 +i02 i10 i32 i21 +i02 i22 i32 i10 +i22 i30 i42 i55 +i01 i19 i39 i29 +i01 i19 i39 i27 +i02 i10 i39 i22 +i11 i29 i37 i44 +i11 i29 i37 i45 +i2- x3A +D1 DD +x03 d p1 +i11 i29 i36 i44 +i11 i29 i36 i48 +i02 i23 i10 i31 +d 'L $1 +l ^4 ^9 ^9 ^1 +i02 i22 i10 i32 +i02 i22 i10 i36 +i12 i20 i33 i42 +i12 i20 i33 i40 +i22 i30 i43 i52 +d 'I $1 +'6 i14 i22 i30 +i31 i56 i49 i66 +i02 i10 i34 i20 +i02 i10 i34 i22 +D1 DC +i21 i39 i56 i49 +[ $4 $2 $0 +'7 i44 i60 i52 +'7 i14 i30 i22 +x03 p1 d +l ^6 ^0 ^0 ^2 +x74 l '8 +l D7 i5z +t x63 ^9 +i01 i19 i33 i28 +i01 i19 i33 i29 +i02 i21 i10 i35 +i02 i20 i10 i34 +i02 i20 i10 i36 +x4A*09 +i12 i20 i31 i46 +i12 i20 i31 i47 +i12 i20 i31 i48 +i31 i56 i66 i49 +d 'J $9 +i02 i10 i36 i21 +i01 i19 i34 i28 +i34 i50 i42 +i12 i20 i32 i42 +i12 i20 i32 i47 +i01 i29 i19 i39 +i3[ [ +x32$7 +o23 *01 +q x6A +} z5 +x03 ^k +*79 x31 +y4 x23 +*21 D4 +$0 p3 +*67 Y1 +'B r c r +Z2 +6 } +d '8 c +u $1 $5 $0 +u $1 $2 $2 +u $9 $9 $6 +u $1 $8 $6 +'6 r c r +u $1 $4 $1 +u $6 $0 $6 +'9 r c r +'8 r C r +u $5 $3 $5 +'7 r c r +u d '6 +u $9 $0 $0 +d c '8 +u '5 $9 +^d^6 +d *81 x63 +d o2G +^5^c +^0^f +-2 scu +o8x +0 +^/ ^7 +l^d^a +l^f^f +l^f^d +l^f^5 +i74i82i90 +l^1^e +l^1^b +l^3^d +l^3^7 +l^3^0 +l^1^9 +l^1^5 +x03 o3O +Z2 i6- +l^9^6 +$e k $q +l^9^9 +l^7^8 +l^7^0 +l^7^1 +l^5^4 +l^5^b +l^x$x +l^b^0 +l^9^d +l^b^c +l^b^a +l^b^e +l^0^3 +l^8^0 +l^8^6 +l^6^6 +l^4^4 +l $2$0$0$2 +l^e^e +l^4^a +l^4^c +iA4iB2iC0 +l^a^e +l^a^c +l^e^4 +l^c^4 +l^c^a +l^e^c +l $2$0$1$0 +o5M D1 +l^9^c +l^6^f +l $2$0$0$5 +C^X^x$X$x +C^x$x +Z3 Z5 +*78 *A6 +sa0 l +s(%*94 +i8U $T x73 +ssI *03 +^0 sqQ x04 +p1 $l +p1 $k +Z4 [ t +*53Z2 +o3b Y5 +y2 s/5 +,Bdq +x27 d +Y4^?LA +Z4 t [ +x0A R4 +$K c x34 +*43 o2X +y4 $4 +p1 Z1 +R0 x12 $z +s,y +z1i2X +y5+6 +^; D6 +i3q i4d +x13 R5 +^0 x04 sqQ +s'$ +swN +x14 ^2 C +x58 x0A +^T E +L1 -0 +i8U x73 $T +*03 DB +p2 *BA +Y1 i3X +D0 R2 t +*12xB9r +R0 o5I +p1 .6 p3 +] x34 z4 +sXj +D6 R1 +D6 R4 +x49ui0O ++1x85 +^n ^a ^r +x64 +9 +L7 $4 +x14 p1 x83 +*41 $) +s'_Y1*81 +c $4 $7 $4 +c^f^5 +$x$1 +$x$2 +$d$e +^3^x +$b$2 +$D$8 +c$e$7 +$f$5 +$a$9 +$a$3 +c$a$7 +$a$e +$a$x +c^b^f +u^e^8 +u^1^e +u$6$6 +c^3^1 +$8$b +c^a^2 +$7$x +$c$5 +$2$x +$2$b +$c$e +$c$a +$1$A +$1$x +u$1$9 +u$1$3 +u^3^4 +c^2^d +$e$1 +$e$e +c^0^1 +$e$f +u$2$1 +u$2$4 +u$2$8 +u$3$5 +u$3$1 +c^e^4 +c$2$b +$4 x35 i3b +*45i5# +y5x2B +^#i9}*43 +sf3sE+ +Y3x09stv +R4o3o +xA5*17 +D1f +^`'A +shR*71*85 +L0iAR +Z5xA9s<4 +x93x48*19 +x41 p2 +l $0 $4 $5 +l $5 $8 $6 +u $2 $2 $5 +u $2 $2 $4 ++8 T2 +l '9 $9 +l '9 $8 +T0 T8 T4 T2 T6 +$D $8 +T0 T2 T6 T8 T4 +T5 T7 T9 T8 T6 +T1 T4 T3 T5 T2 +T1 T4 T3 T2 T5 +p2 x28 +c $5 $6 $6 +T0 T7 T1 T5 +l $3 $4 $9 +l $3 $4 $4 +x83 o7m x04 +l $3 $4 $2 +T1 T5 T2 T4 T3 +T5 T7 T9 T6 T8 +i42 c +l $8 $8 $9 +l $8 $8 $7 +l $8 $8 $4 +l $8 $8 $5 +l $4 $9 $4 +T1 T3 T4 T5 T2 +$` $1 +o9! x61 +l $3 $1 $8 +l $3 $1 $9 +T1 T2 T5 T4 T3 +o0Z Z1 +l $6 $8 $8 +l $6 $8 $4 +T0 T2 T8 T4 T6 +T5 T6 T9 T8 T7 +l $9 $5 $8 +l $9 $5 $5 +l $9 $5 $6 +l $4 $7 $7 +l $4 $7 $8 +T0 T1 T7 T5 +t $X +^E ^4 +l $0 $5 $0 +x59 Z2 +Z2 $z +T5 T9 T7 T8 T6 +l $2 $6 $6 +Z2 $! +T0 T5 T1 T7 +*76 o6. +T5 T9 T8 T7 T6 +q $1 +l $9 $6 $5 +l $7 $4 $4 +T1 T2 T3 T5 T4 +$h *50 +^l D1 +c $0 $3 $2 +l $2 $0 $6 +l $3 $7 $1 +l $3 $7 $2 +l $3 $7 $3 +l $3 $7 $5 +l $1 $3 $1 +l $1 $3 $5 +T1 T5 T3 T4 T2 +x51 p1 +l $2 $1 $3 +l $9 $3 $4 +x64 $@ +Z2 *65 +T0 T4 T8 T6 T2 +T1 T3 T5 T2 T4 +p1 o5a +^0 x24 +x0A Z1 +^g o78 +$a $C +l $0 $8 $0 +l $0 $8 $8 +T5 $9 +l $3 $0 $3 +l $0 $7 $0 +T0 T4 T6 T8 T2 +xB2 x16 +T0 T4 T2 T8 T6 +T5 T7 T8 T6 T9 +$t k +l $1 $4 $1 +T1 T3 T5 T4 T2 +l $5 $3 $3 +l $5 $9 $5 +l $5 $9 $9 +l $2 $7 $8 +l $2 $7 $5 +c $e $a +c $e $2 +*04 $5 +T1 T2 T3 T4 T5 +x05 D3 +D2 i6@ +x63 -1 x25 +l $5 $9 $3 +l $0 $1 $0 +l $8 $4 $8 +s7$ +^b *35 $j +l $1 $2 $9 +l $1 $2 $8 +l $1 $2 $0 +l $1 $2 $4 +l '8 $2 +^0 ^B +l $1 $7 $5 +l $1 $7 $3 +s0; +l $9 $2 $4 +T0 T6 T2 T4 T8 +o0i u +l $3 $3 $8 +f-6oAG +C $2 $2 $3 +c $4 $9 $2 +^C ^2 +l $2 $7 $7 +l o6. +z2 ^p +c '5 $7 +,5 K +^D ^1 +T1 T2 T4 T3 T5 +i1H c +l d 'B +l $5 $2 $5 +l $5 $2 $1 +l $5 $2 $3 +k s52 +T0 T7 T5 T1 +u ^6 ^6 +sc< si1 +c $7 $2 $2 +c $7 $2 $3 +l $2 $4 $4 +l $2 $4 $5 +l $2 $4 $9 +^p ^i ^h ^c +Z2 o3l +u $1 $1 $9 +u $1 $1 $0 +T0 T2 T6 T4 T8 +l $7 $1 $9 +l $7 $1 $0 +x83 x02 T5 +*37 *14 +u $8 $7 $8 +T5 T6 T7 T9 T8 +} x37 +T5 T9 T7 T6 T8 +u $1 $4 $4 +l $1 $1 $4 +l $1 $1 $0 +l $1 $1 $9 +o85 } +l $1 $6 $3 +l $1 $6 $9 +u $9 $2 $2 +u $9 $8 $9 +$l i78 +o2 i1i +T1 T2 T4 T5 T3 +l $3 $2 $3 +l $3 $2 $6 +u $6 $1 $6 +x07 u ^F +T0 T6 T4 T8 T2 +^! z2 +T5 T6 T9 T7 T8 +u $8 $1 $1 +l $6 $7 $1 +l $6 $7 $8 +l $5 $1 $9 +l $5 $1 $2 +c $8 $0 $5 +l $5 $1 $7 +Z2 *56 +iA~ +^c *46 +u $D $1 +z3 x52 +s36 u +l $5 $1 $5 +l $6 $6 $9 +l $0 $9 $1 +T0 T8 T6 T2 T4 +*74 *85 +T5 T6 T8 T9 T7 +L9qoBk +u $E $5 +u $E $7 +u $5 $2 $5 +c $d $a +l $1 $5 $1 +c d '6 $2 +c $d $4 +T0 T2 T8 T6 T4 +c $9 $0 $2 +u $3 $0 $0 +c d '6 +T0 T6 T8 T4 T2 +*76 $. +z1 ^N +u ^D ^D +o2T Z2 +tz4 +*03 $t +T5 T7 T6 T9 T8 +l $2 $2 $0 +x24 o21 +u $5 $5 $7 +u $5 $5 $4 +x74 x45 +x24 z4 +l $6 $4 $1 +l $6 $4 $6 +l $5 $0 $5 +l $5 $0 $2 +c R7 +l $5 $0 $8 +T1 T4 T2 T5 T3 +x25 [ l +x34 R4 +c $^ +c $R +l $9 $9 $7 +l $9 $9 $3 +^b ^A +x74 T1 +D5 +1 x38 +T1 T4 T2 T3 T5 +u $6 $6 $9 +^0 *32 *31 +T1 T4 T5 T2 T3 +*76 *68 +i02 z2 +T5 T9 T6 T8 T7 +l $7 $2 $7 +l $7 $0 $5 +l $7 $0 $7 +l $7 $0 $0 +^e ^B +l $6 $2 $3 +R1 [ ] +l $6 $2 $7 +u $8 $2 $2 +T0 T8 T6 T4 T2 +T0 T6 T4 T2 T8 +u $3 $1 $1 +u $3 $1 $3 +u $3 $1 $4 +t -0 +l $5 $8 $2 +T0 T5 T7 T1 +l $8 $6 $4 +l $8 $6 $6 +l $8 $6 $8 +T5 T8 T7 T9 T6 +l $1 $0 $4 +u $9 $9 $8 +T0 T8 T4 T6 T2 +T5 T9 T8 T6 T7 +l $2 $3 $1 +l $2 $3 $2 +^F ^1 +Z1 R4 +l $8 $1 $8 +l $8 $1 $0 +l $8 $1 $3 +l $6 $5 $2 +^K ^J +T5 T8 T6 T7 T9 +c $a $d +c $a $9 +Z4 x53 +'5 ^F +T5 T7 T8 T9 T6 +L5 x04 +l $6 $5 $5 +Z2 $e *90 +sb6 se3 +^. i1/ +T5 T9 T6 T7 T8 +l $8 $0 $3 +l $8 $0 $8 +l ^@ +x37 .4 +l $0 $1 $5 +u $4 $4 $0 +u $1 $8 $8 +T1 T4 T5 T3 T2 +l $3 $9 $6 +Z3 D7 +u $2 $7 $2 +^< x16 +u $5 $0 $0 +u $5 $0 $1 +T5 T6 T8 T7 T9 +l $7 $3 $7 +l $4 $4 $0 +z2 ^e +l $4 $4 $6 +^t '6 +l $4 $4 $5 +l $4 $4 $8 +^# z1 +l $5 $8 $7 +u $3 $2 $3 +l $8 $7 $8 +l $8 $7 $7 +l *40 +T1 T3 T2 T4 T5 +c $h $a $h $n +z3 +2 +l '7 $9 +c $c $c +c $c $0 +c $c $2 +T0 T8 T2 T4 T6 +l $2 $0 $5 +l $2 $0 $7 +l $5 $6 $4 +l $5 $6 $6 +$j Z1 +l $0 $2 $8 +z2 ^c +l $8 $2 $5 +T0 T6 T2 T8 T4 +l $2 $1 $9 +l $4 $3 $5 +l $4 $3 $4 +x4BY3^m +l $1 $5 $7 +T0 T4 T2 T6 T8 +l $7 $5 $6 +l $7 $5 $5 +l $9 $1 $2 +o25 p1 +T5 T8 T7 T6 T9 +L4 D2 t +l $7 $7 $8 +T0 T1 T5 T7 +c $8 $8 $4 +l $3 $8 $5 +l $3 $8 $4 +u $4 $0 $4 +u $1 $9 $1 +s5n +l $7 $9 $4 +l $7 $9 $9 +l 'A $3 +l $7 $2 $3 +T1 T3 T4 T2 T5 +u $7 $2 $2 +o6O c +l $4 $5 $1 +u x42 +[ R7 +T5 T8 T6 T9 T7 +x52 $C u +o54 s4y +r z3 -1 +T0 T2 T4 T6 T8 +l $1 $9 $9 +l $1 $9 $3 +o7O x03 +[ i4v Z1 +l '6 $9 +T0 T2 T4 T8 T6 +u $2 $3 $2 +u $7 $9 $9 +l $7 $7 $0 +l $7 $7 $3 +T1 T5 T2 T3 T4 +l $6 $3 $9 +l $6 $3 $6 +l $5 $5 $7 +l $5 $5 $0 +l $5 $5 $2 +u $0 $1 $2 +u $0 $1 $0 +c $E $E +$@ k +$s k +T5 T6 T7 T8 T9 +l $0 $3 $9 +l $0 $3 $3 +l $0 $3 $2 +l $0 $3 $1 +x61 ^1 +*94 x85 Z1 +l $9 $0 $1 +u $2 $4 $6 +u $5 $6 $5 +c $7 $7 $3 +Z2 s85 +T0 T6 T8 T2 T4 +c $2 $x +i1z R0 +^# x61 +x26 Y5 +x12 sgo +l $7 $8 $8 +x12 Z3 T6 +T1 T5 T4 T2 T3 +l $4 $1 $5 +l $4 $1 $4 +l $4 $1 $7 +l $4 $1 $8 +^h '6 +l $1 $8 $3 +l $1 $8 $1 +x12 $* +Z5 *85 x83 +l $7 $6 $7 +$` Z1 +l $2 $8 $1 +l $2 $8 $3 +l $6 $0 $0 +l $6 $0 $9 +T0 T4 T8 T2 T6 +l $5 $4 $5 +l $5 $4 $4 +o50 Z3 +l $1 $5 $5 +R1 C +u $0 $0 $2 +u $0 $0 $9 +l $2 $1 $4 +l $9 $3 $6 +i31 x91 +u $8 $8 $3 +u $8 $8 $5 +T1 T2 T5 T3 T4 +T0 T8 T2 T6 T4 +x23 D0 +T5 T8 T9 T7 T6 +u ^C ^C +u $4 $8 $5 +l $3 $5 $3 +l $3 $5 $8 +l $0 $9 $2 +T5 T7 T6 T8 T9 +T1 T3 T2 T5 T4 +o4f r Z1 +l $6 $1 $2 +l 'C $1 +T1 T5 T4 T3 T2 +l $4 $8 $7 +l $4 $8 $2 +l $4 $8 $9 +x82 T7 +T0 T4 T6 T2 T8 +l $4 $2 $5 +l $4 $2 $8 +T5 T8 T9 T6 T7 +^z*61 ++6 i4c Z1 +l $2 $9 $4 +l $2 $9 $8 +T1 T5 T3 T2 T4 +l $6 $1 $6 +$0 $. +$3 ^8 +$$ $5 +c $$ $$ +$6 $. +$6 $% +^' ^\ +$2 $- +$5 ^3 +$= $0 +$+ $7 +$& $1 +$1 $/ +$9 ^1 +$1 $; +$4 ^1 +c $! ^# +$! ^@ +$! $7 +$! $5 +$* $5 +c $! $@ +c ^# $! +c $~ $~ +$6 ^3 +$- $2 +$- $3 +$5 ^8 +$5 ^2 +$; $1 +$2 ^8 +$p $o $o $h +$e $x $a $m +$c $a $l $l $s +i02 i10 i20 +$s $t $o $r $y +$t $o $o $t +$t $o $o $l +z3 x56 +$m $a $z $e +$s $o $n $g +i20 i37 +i01 i11 i20 +$h $o $b $o $s +-2 L0 +$f $r $o $s $t +c T1 i1- +-2 L1 +o34 ^M +u $1 $2 $3 $4 +$p $u $f $f $y +i67 i78 i89 +$r $e $a $d +c T7 i7_ +$r $o $b $o $t +i32 '6 y3 +D6 i4c +c i51 T6 +Z1 x95 x42 +$b $i $l $l +$g $u $r $u +$r $a $j $a +$b $l $a $z $e +$d $e $a $n +$s $t $o $p +^4 z3 +c i38 T4 +$f $i $v $e +^m *25 +$c $l $a $s $s +$b $e $e $t +$b $e $e $p +$m $o $r $e +*40 ^r +i85 i94 +$i $n $a $n $e +$t $o $d $a $y +$f $u $l $l $y +$c $r $i $m $e +$p $e $e $k $s +$d $u $s $t +$b $a $t $s +$s $k $u $n $k +i02 i15 i20 +C *51 +$4 i3b +$p $r $i $d $e +$f $l $o $r $a +$b $i $a $s +i70 i83 +$c $u $n $t +c sl1 T5 +$c $l $a $m $p +$i $v $o $r $y +$p $i $z $z $a +$a $d $e $p $t +c $1 $s $t +$f $a $c $e +$6 o4D +$l $a $y $e $r +*02 i0G +$m $e $e $t +*06 ] +$h $e $a $v $e +$h $e $a $v $y +i71 i81 i92 +i51 i69 i79 +i01 i10 i22 +$* x43 +DA k +o4"z5} +c o7! +u ^2 ^9 ^9 ^1 +$s $h $i $l $l +$t $r $e $e $s +s4M +$b $o $r $e $d +D0 o4+ +$e $m $a $i $l +$l $i $p $s +c i2o +i54 T6 +$c $o $d $e +$c $a $l $l +$w $i $l $l +$a $l $e $r $t +$r $o $u $g $e +$f $r $u $i $t +$p $l $a $t $e +$c $r $e $p $e +$t $i $a $r $a +i07 i18 i29 +$a $b $b $e $y +$h $a $t $e +$l $u $c $k +Z1 i43 +$t $e $a $r +*98 *85 +i90 iA0 iB1 +$p $a $r $t $y +$p $u $f $f +{ i5j +$s $a $b $e $r +i63 i74 i85 +x35 $* +$g $r $e $y +i02 i16 i20 +^3 ^2 $4 ^1 $5 +$s $a $l $a $d +$r $a $v $e +r i74 +$t $a $i $l +$m $a $m $b $o +$s $a $s $s $y +$m $i $l $k $y +$h $u $r $r $y +$g $u $p $p $y +$p $i $m $p +$r $i $s $k +$c $h $i $n +i70 i81 i92 +s86 ^z +$l $i $e $f +{ $8 +$d $r $u $g $s +$p $a $i $n +$s $o $f $t +i84 i95 iA6 +$l $i $e $n +] *10 +$z $o $o $m +$a $r $d $o $r +*83 y2 +^3 ^2 $4 $5 ^1 +x21 p2 +$c $r $u $s $h +Z1 x16 $8 +$b $e $a $r $s +$d $u $n $g +$s $a $l $l $y +$m $a $y $b $e +s4o Z2 +o7; L7 +Y1 D5 r +$t $e $e $n +$s $t $i $l $l +$g $i $r $l $s +i4c x16 +$q $u $i $l $l +$c $e $l $l +c so0 T6 +i95 iA8 +$m $a $y $o +$r $u $d $d $y +$g $r $e $e $n +l ^1 ^5 ^9 ^1 +x14 $* +$f $i $z $z +u t f +$c $o $l $o $n +x35 o0c q +$c $r $e $e $d +p5 s7- ++6 ^S +^* *31 +$r $o $o $f +$t $o $o $t $h +y3*43*03 +$f $l $o $o $d +$g $a $m $e +c i54 +l ^3 ^8 ^9 ^1 +c $M +^6 *07 +$l $o $v $e $s +$c $a $n $o $n +$0 d ] +x12 *35 +$b $e $a $s $t +$f $l $i $p +$t $a $r $o +Z1 $? +R5 +1 +x13 $0 d +^f ^o ^o ^r +$c $r $e $s $t +$d $u $c $k +$k p1 +$n $i $c $k +^3 $4 ^2 ^1 $5 +$p $a $s $t $a +$f $a $i $l +i80 i90 iA9 +$t $w $i $n $s +$s $w $a $g +^8 z3 +*70 r ] +*3A x52 +$p $o $r $k +Z2 o2b x01 +$h $o $p $e $s +$m $e $o $w +$m $u $s $i $c +] R0 +$% i61 +$d $o $l $l +u $1 $9 $7 $3 +$f $a $n $g +$g $l $a $d +$b $r $o $w $n +u f t +$d $a $d $d $y +u i2- +Z1 .2 +$b -B +$m $i $l $e +$a $r $r $o $w +x75 x43 +$g $e $n $r $e +x37 Y3 +$h $o $l $l $y +$w $a $v $e +$b $i $l $l $s +$g $i $f $t +$o $p $e $n +$d $e $m $o $n +c o46 +y2 k *32 +$d $r $a $m $a +$d $o $o $r +o68 x01 +$F x32 +szw D1 +c T6 so0 +s3# +i69 i78 i89 +c i3@ +$p $i $x $i $e +$d $u $d $e $s +$s $t $a $r $t +$p $i $p $i $t +$c $o $o $n +x4B t +sa@ se3 si! +^3 $4 $5 ^2 ^1 +c i58 +r $p $a $s $s +$b $o $o $k $s +$s $t $e $e $r +$i $o $t $a +$t $o $n $y +$a $g $e $n $t +$o $n $y $x +$b $o $y $s +$n $o $i $s $e +$b $e $l $l $y +^$ ^# ^@ ^! +$a $q $u $a +^3 ^2 ^1 $4 $5 +c i36 +$o $p $a $l +$m $o $o $s $e +z4 x26 +*34 c +$g $r $e $a $t +$h $a $z $e $l +$a $l $t $o +c T4 i4. +$a $r $i $a +i6n i7n +$c $u $r $s $e +l ^9 ^7 ^9 ^1 +c Z1 [ +Y3 *02 +c i1_ +c $e $l $l $a +$? *35 +i79 i80 +c $2 $u +i93 D4 +$b $a $n $g +$b $a $n $e +ssP +$j $a $z $z $y +$s $w $i $n $g +c T5 sl1 +c T2 se3 +i26 K +o0X z2 +$h $a $r $r $y +o5h i5C +$c $i $v $i $l +$s $h $i $n +$7 o15 } +$f $i $s $h $y +*29 x37 +$b $a $s $s +se3 d +-3 *32 sr1 +y2 *32 k +o4i o6! +$d $e $a $t $h +$t $i $g $e $r +$j $i $n $n +$v $e $r $s $e +$c $l $i $f $f +*15 y1 x05 +i91 iA2 +l ^5 ^8 ^9 ^1 +L4 *14 +c se3 T2 +$s $a $g $e +$p $a $p $a +$e $x $i $l $e +$s $p $e $e $d +$n $e $x $u $s +$r $o $l $l +o7n t +$p $o $t $t $y +sa@ si! se3 +$s $n $o $w +$b $a $g $g $y +$l $o $r $d +^3 $4 ^2 $5 ^1 +Z3 *06 +y2 x28 +$d $r $i $v $e +{ L6 +$n $a $n $n $y +$a $l $i $e $n +$g $e $e $k +$l $o $s $e +r $e $l $l $a +x82 y2 +i63 i71 i82 +$s $n $a $k $e +i20 $a +c T8 i8_ +d u '8 +{ z2 *70 +u $p $a $s $s +i9< +i8L +d '8 u +d '8 l +c Y4 +^a x23 +{ x27 ++1 *10 +d l '8 +Y2 x51 +'B u +[ o1r +^s ^p ^o ^p +,5 $r +x61 x42 +sg5 +T6 Z3 +[ $M +y1 i39 +c o5t +T0 Z2 +i6X x47 +*04 Y5 p4 +T8 x05 +*26 k +x64 x0A +sy* +^g x21 +*05 x24 +,2 *31 +s87 +*03 *10 +Y1 -8 D6 +p2 T8 +.5 .6 -6 +^t ^e ^w +^h ^k ^k +^u ^k ^i ^r +^e ^m ^m ^a ^s +^a ^g ^o ^o ^b +^e ^m ^m ^a ^i +^n ^a ^w +^n ^a ^a +^y ^n ^n ^u ^h +^f ^e ^i ^r ^a +^y ^n ^n ^u ^s +^a ^z ^e ^r +^n ^e ^h ^c +} q x79 +^h ^p ^e ^t ^s +^n ^e ^h ^z +^t ^a ^s +^n ^a ^t ^a ^s +^f ^f ^u ^l ^f +^n ^a ^u ^t +^s ^l ^a +$g $r $a $s $s +^f ^u ^s ^u ^y +^i ^s ^s ^e ^y +^i ^v ^i ^v +^o ^a ^c +^o ^d ^d ^i ^k +^i ^n ^o ^j +^n ^i ^o ^j +^n ^o ^v +^n ^o ^k +^a ^n ^i ^r ^i +^s ^u ^g +^e ^t ^a ^f +^m ^o ^m ^y ^m +^k ^c ^e ^h ^c +^a ^d ^n ^a ^n +^i ^k ^o ^o ^c +^y ^r ^r ^e ^g +^a ^t ^s ^i ^s +^d ^a ^a +^n ^i ^h ^s +sa4 ss5 +^h ^o ^o ^p +^i ^m ^i ^m +^a ^g ^o ^y +^e ^l ^l ^a ^m +^a ^r ^o ^s +^y ^a ^k +^i ^v ^e ^l +^k ^a ^p +^k ^a ^b +^k ^a ^a +^k ^a ^j +^o ^l ^l ^e ^m +^u ^n ^i +^o ^l ^l ^e ^b +^m ^a ^p +^e ^i ^d ^d ^a +^i ^d ^d ^a +^i ^g ^a ^s ^u +^y ^s ^s ^i ^p +^v ^u ^l +^r ^e ^s ^o ^l +^y ^r ^r ^a ^m +^i ^c ^c ^i ^r +^a ^m ^u ^y +^t ^o ^i ^d ^i +^n ^a ^v ^e +^w ^j ^j +^n ^a ^u ^j +^c ^a ^s ^s ^i +^b ^o ^c ^a ^j +^o ^y ^k ^o ^t +^l ^u ^a ^p +^y ^l ^s +^z ^y ^b ^a ^b +^y ^p ^o ^o ^l +^e ^r ^u ^z ^a +^n ^a ^k ^a ^m +^y ^b ^b ^e ^s +^e ^n ^a ^k ^a +$g i2p +^e ^k ^o ^m ^s +^o ^r ^u ^e +^y ^x ^o ^r +^o ^y ^y ^o ^s +^e ^i ^b ^a ^b +^n ^e ^r ^a ^k +^i ^w ^e ^d +^o ^p ^o ^p +^e ^m ^a ^d +^y ^d ^n ^a ^d +^l ^i ^r ^v ^a +^r ^e ^t ^n ^e +^a ^n ^e ^l ^e +sa4 si! +^o ^i ^r ^t +^u ^k ^a ^s +^e ^n ^o ^n +^e ^k ^a ^n ^s +^m ^e ^g +^n ^e ^v ^e +^s ^l ^e ^e ^h +^r ^e ^t ^s ^a +^u ^k ^o ^g +^m ^i ^h +^s ^a ^r ^a ^l +^i ^n ^a ^n +^l ^u ^o ^s +^a ^r ^a ^a ^g +x73o1m^] +^n ^y ^c +^a ^p ^p ^a ^k +$c $u $r $r $y +^m ^o ^o ^n +^e ^c ^e ^e ^r +^u ^d ^u ^d +^y ^k ^c ^u ^l +^n ^h ^o ^j +^y ^l ^o ^h +^p ^l ^l +^o ^l ^o ^l +^i ^r ^d +^a ^n ^t ^a ^r +^m ^i ^r ^g +^y ^s ^s ^e ^d +^z ^n ^e ^r +^p ^d ^m +^e ^m ^a ^y ^a +^n ^o ^t ^n ^a +^i ^b ^m ^a ^b +^h ^s ^i ^w +^a ^s ^u ^s +^y ^t ^l ^a ^s +^y ^s ^t ^a ^p +^i ^k ^k ^i ^m +$t $r $i $b $e +^y ^l ^e ^m ^e +^u ^n ^u ^n +^h ^t ^r ^i ^b +^o ^k ^a ^m +^z ^n ^a ^l +^o ^l ^o ^a ^p +^r ^a ^w ^a ^m +^r ^w ^a ^r +^n ^o ^r ^a ^a +^w ^o ^n +^u ^o ^l ^i ^l +^o ^i ^r ^a ^m +^u ^y ^u ^y +^e ^m ^o ^s +^q ^b ^b +^h ^a ^l ^a ^s +^i ^m ^a ^t +^a ^n ^u ^r ^b +^k ^n ^i ^h ^t +^k ^a ^r ^e ^n +^a ^t ^a ^g ^a +^g ^n ^e ^n +^o ^a ^h ^t +^r ^a ^m ^a ^k +^s ^s ^i ^k +^s ^i ^r ^h ^c +Z3 D3 [ +^k ^r ^a ^l ^c +^a ^v ^o ^n +^y ^c ^n ^a ^n +^l ^e ^e ^t ^s +^l ^e ^g ^n ^e +^e ^d ^r ^e ^v +^o ^b ^a ^b +$f $e $r $r $y +^i ^h ^s ^o ^y +^a ^n ^a ^h +^a ^n ^a ^j +^a ^r ^i ^k ^a +^y ^m ^m ^a ^s +^y ^m ^m ^a ^t +^f ^l ^a +^y ^s ^s ^u ^p +^c ^i ^s +^i ^l ^e ^m +^f ^w ^w +^i ^p ^e ^p +^a ^t ^i ^n +^y ^n ^n ^a +^a ^t ^i ^t +^y ^r ^r ^e ^b +^d ^i ^s +^y ^m ^m ^u ^d +^y ^m ^m ^u ^g +^d ^i ^k +^a ^l ^l ^e +^n ^a ^j ^a ^r +^r ^e ^p ^i ^v +^a ^h ^p ^l ^a +^z ^u ^l +^t ^e ^e ^w ^s +^e ^m ^m +^c ^i ^r ^e +^o ^n ^a ^n +^o ^n ^a +^l ^i ^m ^e +^e ^t ^r ^o ^m +^g ^n ^i ^l +^u ^h ^s ^u ^m +^o ^c ^o ^h ^c +^e ^i ^p +^e ^i ^l +^a ^g ^l ^o +^i ^n ^e ^r +^e ^d ^a ^j +^g ^n ^u ^h ^n +^m ^s ^m ^s +^g ^n ^a ^b +^o ^t ^t ^a ^g +^y ^o ^s ^o ^y +^y ^l ^n ^o +^o ^r ^e ^v +^i ^a ^w ^a ^k +^l ^u ^r ^u ^n +^o ^g ^e ^l +^y ^r ^a ^m +'5 *13 +^o ^l ^a ^h +^y ^n ^n ^e ^j +^s ^i ^l ^o ^l +^y ^n ^n ^e ^f +^a ^s ^s +^y ^d ^a ^d +^i ^n ^n ^e ^y +^e ^b ^e ^b +^y ^l ^i ^l +^l ^l ^a ^h +^i ^r ^r ^e ^k +^i ^b ^i ^b +^e ^t ^t ^a ^l +^y ^v ^i +^e ^d ^e ^d +^y ^t ^t ^i ^k +^a ^r ^t ^e ^p +^t ^r ^a +^u ^r ^o ^a ^k +^e ^e ^b +L4 x04 +^o ^n ^i ^d +^o ^n ^i ^n +^a ^i ^n ^o ^s +^a ^n ^n ^a ^y ++6 .0 +^s ^i ^n ^e ^p +^y ^o ^j +^e ^i ^w ^o ^b +^n ^o ^i ^n ^o +^_ ^a ^n ^e ^n +^i ^j ^u ^f +^n ^i ^a ^r ^b +^a ^r ^r ^e ^t +^a ^s ^a ^s +^e ^i ^n ^i ^m +^o ^c ^o ^c +^a ^n ^n ^e ^j +^y ^r ^g ^n ^a +^o ^y ^o ^y +sa/ +^y ^r ^r ^o ^s +^m ^a ^n +^k ^e ^e ^r ^g +^a ^n ^i +^v ^o ^n +^a ^c ^c ^u ^p +^a ^s ^s ^i ^n +^y ^e ^h +^a ^t ^i ^n ^a +^a ^s ^s ^i ^r +^h ^a ^i ^l ^a +^e ^n ^i ^f +^y ^r ^n ^e ^h +^g ^n ^a ^o ^h +^o ^m ^m ^o ^t +^a ^h ^n ^e ^s +^n ^i ^w ^d ^e +^o ^k ^i ^e ^k +^o ^d ^a ^d +^a ^i ^m +^a ^i ^n +^a ^i ^c +^n ^e ^w +^n ^a ^e ^j +^h ^j ^t +^t ^o ^o ^r +^r ^a ^t ^s +^d ^e ^e ^r ^g +^y ^t ^t ^a ^p +^y ^t ^t ^a ^m +^e ^k ^s ^a ^s +^i ^l ^i ^m ^e +^a ^r ^i ^k +^o ^o ^h ^a ^y +^y ^l ^l ^e ^j +^y ^l ^l ^e ^k +^y ^l ^l ^e ^s +^i ^r ^a ^c +^r ^a ^j ^a ^f +^h ^t ^i ^a ^f +^n ^a ^i ^x +^l ^e ^o ^n +p1 o1e +^y ^t ^s ^a ^t +^e ^k ^o ^p +$e $v $i $l +^v ^u ^l ^i +^g ^n ^o ^w +$l $i $n $e $n +^e ^t ^u ^c +s1d ^d +^y ^b ^u ^r +^o ^d ^i ^d +^e ^i ^l ^e +^n ^o ^i ^r ^o +^e ^y ^a ^f +^k ^c ^i ^r ^e +^l ^i ^b ^a ^n +^n ^i ^w ^t +^c ^o ^v ^a ^h +^c ^i ^g ^a ^m +^e ^p ^e ^p +^e ^r ^e ^h +^r ^e ^k ^o ^j +$a $z $u $r $e +u D0 D7 +^a ^r ^a ^r +^k ^c ^i ^n +^h ^c ^p +^a ^y ^a ^r ^a +^r ^a ^h ^a ^s +^i ^w ^i ^w +^t ^s ^i ^m +^x ^i ^s +^s ^i ^n ^a +^a ^n ^y ^e ^r +^y ^g ^g ^i ^p +^e ^k ^u ^l +^e ^b ^e ^i ^l +^a ^r ^y ^m +^y ^t ^r ^i ^d +^a ^l ^l ^e ^m +^a ^l ^l ^e ^c +^a ^l ^l ^e ^d +x38 o1r +^k ^c ^a ^h +^n ^e ^m ^a ^r +^y ^l ^n ^o ^l +^a ^y ^a ^y +^i ^r ^i ^r +^a ^i ^d ^a ^n +^r ^e ^b ^a ^s +^s ^b ^a +^k ^c ^o ^l ^c +^e ^d ^a +^a ^l ^a ^l +^* D1 +^e ^i ^x ^i ^d +^i ^e ^r +^g ^i ^m +^i ^e ^l +^i ^a ^k +^y ^g ^g ^u ^p +^t ^s ^e ^t +^n ^e ^z +^a ^z ^z ^i ^r +^a ^z ^z ^i ^p +^r ^e ^g +^l ^l ^e ^h +^n ^w ^a ^p ^s +^d ^s ^j +^i ^k ^u ^s +^n ^i ^j +^e ^i ^j ^o ^j +^e ^m ^m ^i ^g +^y ^e ^k ^o ^k +^a ^l ^l ^i ^b +^a ^k ^e +^r ^o ^r ^r ^e +syV ^O +i3 { +sc8 +$0 d D4 +sC* $T +f *29 +x01 o6# +Z3 xB7 $1 +*42 x3A +^},B.B +*62oAW +-7 z1 +'4x0A-5 +x76x96 +i7I.8 +'0 ^> +Kx85 +*21z3 +R7 Z2 +L6 x74 +*1AKt +s}Po8% +slj*81 +i6*iB^s7; +i6_Z4*27 +x96$A +o52[ ++3 -6 $7 +[ Z1 i4v +Z3 l +3 +r -A +Y1Y4 +k R1 $A +d *47 +*08csZy +*94 -7 +*B4x3Bs1! +*B2x4Ay3 +D3 p1 +6 +z3sZ!x79 +] ^' +*72usZ0 +.4.8*73 +D8s@H*6B +z4x53 +seQR5Y1 +*2B DA +i5Bp2x08 +L5 *02 +-2 D0 +i58o30x56 +sm` y3 x52 +i3?i6UsaB +] u D0 +x15 o5x +k $A R1 +z4srnx59 +c*36s9> +x82x47*17 +o85 o7y +C ^P +$3 d D7 +Z4 $4 +]o6u +x98[ +x82x21 +Z3y1 +i4lsx, +i2@sT9 +sC1,A*52 +$0 *73 x45 +i0H x04 $4 +D8 $0 ++2 ^q +i51 ,6 .3 +o3a ^a +x42 i3w +$3 x43 +i2i x73 +,4 o3w +x74 ] ] +[ k y1 +*54 .1 +[ k .2 +] ^f +'6 $% +x06 $2 +[ i25 +] o4s +Z1 s26 p5 +o2c { +[ ^S o2a +x03 i4h +o5b x73 +] i2u +x23 i3i +o0l -2 +x53 $g +y2 x63 +x43 i3k +i9E x73 o67 +D5 ^x +$x x42 $d +R5 o0m +o3w x61 ++3 ,2 +] o0r *42 +o4w x63 +x46 Y4 Y4 +o3p +0 +o2i .1 +x04 $0 Y1 +*05 x52 +E $9 x32 +x81 o7i +y4 ] xA1 +D5 ^7 +K o6i +D2 D6 $1 +x62 $0 +s8k +x12 o4g +] i2n +o73 -6 +r $n $e $s $s +'9 i57 +^3 Z1 +x32 $0 Y1 +^t ] +K ] ^2 +o71 ,3 +k ] *34 +o4a *21 +Y2 x32 -1 +i1y x43 +y5 i5y x74 +x02 i64 +x41 Y2 -2 +,2 x02 o58 +*03 *32 *13 +l ^1 ^8 ^9 ^1 +o51 .4 +r o35 +o10 ,3 +r o37 +x43 i1l +$1 Z1 +x41 *42 +o1s D3 +x21 *31 +o0t y2 +^p ] +-4 o3o +*01 ^7 +i43 D7 +o0p *53 +[ +1 *31 +x43 i2m +x04 o1w +i66 x01 +o1i $1 +Y1 $3 -7 +o0p .2 +$e *26 +c ] T7 +o44 ^4 +K o0w +i1S c +K o0c +D3 y4 y4 +o1d .0 +sa7 +i33 [ +o73 x52 +x24 i2d +o2T x31 E +$m D5 +o0Y l *53 ++0 k y1 +D1 o2x +k *12 i03 +i71 ] +i31 .3 k +o68 o76 +x62 *20 +] i56 +i45 ] ^8 +o16 r +] ] ^8 +$1 sea +D6 *31 +$9 Z1 E +*50 *14 *23 +i3z ] +z5 i0r x18 +o1k x21 +o5A c +f *72 x57 +x54 E +$x $d x42 +i0s *51 +p2 ] ] +K o2k +x41 -6 +.3 $@ o64 +x62 i3x +Y4 x07 z1 +x64 ^4 +i69 ] +x52 $j +suo $1 +] y2 y2 +o54 D2 +o0t *20 +x52 i4p +Y1 $1 x23 +o1A E Z1 +o3c x21 +i2o o4i +x43 y5 D9 +*36 k ++5 +1 +^I o4m +^0 -4 +Y1 -7 $3 +o15 ^6 +i85 x32 +o1e *14 +x81 D2 +i2i x63 +Y2 *27 x42 +i52 } +-4 *54 +p2 x0B x61 +K *02 *54 +] ^8 ] +o3p -4 +r +3 x52 +c *54 +o4b *24 +y5 x31 x74 +i0y D1 o1o +x21 D2 $8 +k o22 K +*71 ] x21 +x02 o13 +k .1 x41 +x41 -2 Y2 +i10 *14 +o2g x62 +o4u x62 +x32 o5y +o65 [ +i50 $9 +i2o .1 +o0m ,6 +i0w -1 +y4 x84 Z1 ++5 i53 +i52 +6 +o10 ] +Y5 x24 -5 +y2 x62 .3 +x51 o56 +-4 i5e +{ i17 +*42 *13 +*15 o48 +o67 ,5 +y1 *35 *20 +x72 *23 *24 +r D3 *50 +o3a D5 +^0 z1 } +i3g x42 +,7 *61 +o59 $3 +o1c i1s +o5c K +o52 -6 +x21 p1 stk +x52 i1o y2 +i2c x42 +i2p o3p +o70 -4 +x51 } z2 +Y1 x12 +D3 o2o +o8H R8 +Z1 +B +-7 ,8 +x27 y2 +x65 o52 +o0f D3 ++0 o23 +^e x72 +o5a -2 +$g Y4 x14 +c $8 D6 +o46 x53 +x02 i1h +p2 x92 [ +o2k +6 [ +x41 i60 +x82 -7 +r +3 o1u +i4& $o +o2j -1 -1 +$8 D5 +Y4 x53 -1 +D3 i4* +o1e *53 +i89 .7 +z3 { { +*71 x21 ] +q x25 +q x18 *20 +y1 *13 x71 +o2e o0f +^2 i09 +K o89 +sa5 x02 +{ { o0m +x15 ,1 +,4 Z1 ++0 o2d +^3 D4 +K r *42 +x52 i2y +x32 o1w +o6h [ +o0c o3m +y4 Z1 x84 +o53 K +D5 s0! +i6a x72 +y4 *95 x06 +x31 +0 +$w x41 +c o72 +x02 soa +x03 ^m +K ^s +x26 $0 +i51 .3 ,6 +o1y x23 ++2 f x26 +x13 k Y3 +o2m y3 +E T3 x71 +o1v [ i0e +o26 .0 +x04 i3k +o2s -6 +] o5q +$1 Z1 D6 +.7 -7 ] +i6u x72 +'6 c +o1m D3 ++1 *45 +[ +0 o12 +$6 +0 +o4u x51 +D3 i4x +x25 f k +-5 Z3 +i6y x12 ++1 $4 +D6 $1 +r ,1 +x61 -0 *25 +D8 ,7 +x32 u +Y2 o72 +x01 i4e +} y3 x64 +i6n o7d +o2s +0 +o5h D2 x21 +-8 R7 +i36 ] ] +^0 ] +p1 x43 +c x21 +x61 x02 y4 +o4c +0 +o2y -4 +o1o y2 +[ -2 ^s +x02 i6l +o5p ] +-5 s20 +z1 x52 *03 +o6y ] +sie x42 +K Z1 $0 +o5n *34 +o8- K +o1y +4 +o1A Z1 E +o2n *02 +x12 y2 *10 +K ^2 ] +-6 o78 +o66 *54 ++3 Y5 x53 +x31 o4i +[ srp +o2o o3s +i19 Z1 +o2m i3i +o2m i3y +D5 ^c +] +1 Y3 +o55 o67 +-7 *52 +x52 i1r +x62 Y3 +i2A l x41 +x41 ^a +D7 o4I sIu +*21 *23 +o71 D3 ++0 Y2 *73 +^t x23 +i67 x21 +{ o05 +i2A x41 l +$2 +6 +r x03 +k *34 ] +D4 $7 +-1 o24 +o2b *02 +*24 *52 +$7 Z1 D2 ++3 $s +o52 -4 +o62 o44 +o1i i1S D0 +i08 o29 +i57 .1 +o3e -0 +o2o o1a +*54 -5 +2 +x21 $8 D2 +o0s i2i +o35 x01 +] o4G l +c ,8 +o5e .4 +$1 i86 +$4 .4 +*86 *50 +o2b ,3 +D7 o3e +,8 -7 +o6u x21 +*20 o3s +o15 *13 +-4 .2 +x72 o3c +o3e D4 +i6t x04 +k x41 .1 +[ $1 $8 +.1 o0w +i65 .5 ++0 $3 +o4k x63 +D4 ^y +o5e o4r +o2r { { +^a *51 +o5h x21 D2 +o0k y2 +i2c x63 +i35 [ { +i51 ,6 +y1 x52 +3 +o91 .8 +i2p ] ] +si. +$0 x71 Y1 +K i32 +K i31 +o76 E +o1h *32 +x42 o4d +x42 +0 i4c +D2 o2d +-0 *03 +f *20 x37 +Z2 x56 +K o76 +i77 .6 +i1e x41 +o54 -2 +o46 -6 +y2 c x41 +x62 -5 +i2\ x23 $2 +o1o +6 +x02 ^t +y2 $. x72 +Z2 x43 [ +D5 -6 +x12 s81 +o06 -2 +o2K E +i2n o0w +x03 Y2 $5 +s52 -5 +D6 o42 +y2 x31 ++3 x21 +D2 o0z +i1a D5 +x72 -0 -2 +o0r k +K o5d +sE ^L +x23 ^2 { +D5 $9 +[ $3 [ +} q x46 +] *42 o0r +x13 i3l +o82 $5 +*31 o0r +o0w *34 +^k x52 +^h ^t +] ^7 ] +o0l x32 +K -5 +2 +x43 o3f +z2 *53 x61 +Z1 $9 x02 +E i51 +$5 o78 +] i72 +z1 ^9 +u i5Z +] i7r +] skp +o9m x72 +z2 x53 i1o +o51 +3 +*54 ] *64 +p3 $7 [ +D4 $3 +o0F ,3 +[ o12 +0 +^0 *05 +x61 i4k +x21 +0 +y4 x82 y4 +Y5 x06 -1 +-9 i90 ++4 .1 o2y +*67 x42 +z2 x61 *53 +i31 k .3 +E x71 T3 +o3h +7 +o62 u +x34 y3 y3 +x52 s80 +*03 *12 +.4 d x04 +p1 r +x02 i2o +o39 ,5 +] i1t +[ o3g +l { { +i18 K *36 +o88 Z2 +y2 *40 +2 +y2 x73 +Y4 -1 x53 +i3i x53 +r -4 } +x23 i2b +K ] $8 +R4 ,5 +o2v k +r *64 +T0 $1 $1 +o5y +7 +x42 i2y +o0l k +i2e ] +o65 Z2 +o18 *01 +o2n -0 ++4 '6 +o48 x71 +o2z D3 +Z1 D6 u +f x37 *20 +i8z x53 +o6i o0c +o56 +2 +k +2 x51 +^w x21 +o33 k D0 +] p2 x3B +i2a -1 +.3 +4 +o0k K *35 +o1o -0 +x72 -2 -0 +.5 $2 +x41 *35 o1i +x42 -3 +x42 -2 +i29 D7 +T1 z1 +] o5m +s86 .4 +x05 $9 +Y2 x84 $0 +o0w D3 +*20 .1 +] ^9 ] +o2c +3 +k *43 ^6 +*30 o2r +Y5 D7 x13 +o50 K +i20 *03 +i6- 'B +o3o o4t +y1 x71 *13 +r i52 Y1 +l s14 +*31 $1 +E se3 +] o0W +^s o1t +o5a *54 +si* +i3y x61 +lse3so0 +[ siy +o1I E D2 +o60 D3 +x41 o1i *35 +o1i +0 +[ i1j ++1 o00 +Z1 u D6 +i7g x23 +x03 i36 +o44 [ ++3 *40 i44 +y2 x41 c +o0Y *53 l +*34 .2 +Z1 x31 +6 +i2\ $2 x23 +Y1 x23 $1 +x71 o5a +] Y3 +1 +r ,5 y1 +o1o o0p +*53 o73 +c D6 $8 +,5 -2 +o3g -0 +o2T E x31 +i6x x03 +,3 *24 +[ *43 r +y2 +2 *40 +o1I D2 E +$1 .9 +f x67 [ +[ $5 [ +i38 { [ +x04 p1 +x21 i1i +o4j -0 +i45 ^8 ] +x02 i50 +^4 x61 +o30 +2 +o3m *03 +i50 ] +$s $i +c T7 ] +i64 o56 +$3 o85 +D4 i2i D1 +$] -0 +o62 c ] +o5u .4 +i4a $1 +x43 f +o6n ] +] -1 K +,3 } *50 +$n R8 ,7 +o1u -3 +p5 i44 ] +$S E +$g x41 +o1e *67 +i4e D1 +] K -1 +y1 *20 *35 +o2h x01 +o3p ,2 +x02 o2j +si1 x53 +o2a o0t +x52 x92 +*A6 *A9 +L7 x07 +o82 D9 +E x32 $9 +o0y +2 +i0H $4 x04 +y5 xA3 y5 +y3 [ x61 +*32 ^7 k +x04 z1 ^o +t i61 $2 +D8 x51 +o16 ] +*64 .3 *31 +*32 *46 +Y3 x02 x72 +] ^3 +o84 o79 +*53 o3l +p4 *04 o0r +*35 $0 *15 +o60 { ] +*45 o0d +o6- x32 +x12 i3k +p3 [ $7 +x03 ^m Z1 +x21 i54 +si+ +o0r *34 +^5 ] ] +o1b *01 +o3p Z1 +o5r i5a +o0j *51 +-7 o65 +-7 o63 +] ] ^5 +] ] ^7 +] ] ^9 +x63 ^r ^m +x01 ^c +[ +0 i28 +o07 D5 +^w D5 +^n +0 $5 +K Y1 .5 +*34 x01 +i6a x03 +T2 *03 +x72 i5e +o0W '8 +i58 .4 +o6c -7 +x02 i1o +x02 i1e +o3b D5 +x51 p2 x0B +i66 D1 +o0p '9 +o0w ,1 +] ^5 ] +*54 +2 -5 +o2k x52 +*35 i63 +o90 o80 +r o16 +r o14 +[ i35 D0 +x32 o0g +c sa@ T1 +o56 $5 +[ o0m y2 +,5 *41 +,5 *42 +$1 x03 +*20 o2s +R4 x54 Z2 +z1 D5 *13 +} x62 z1 +o76 o62 +o2v x51 +^m o1j +i0o i0y +r x52 +3 +o4u +5 +o0e o1i +c o66 +x43 ^x +] i68 ++8 D3 +$4 sr1 +o3m o2u +^m x13 y5 +x32 i3y +x32 i3s +s58 +8 +i0n x51 +^a *10 D6 +-4 x02 +Y2 x01 +3 +i5k x21 +o3e $4 +$1 $9 $9 $2 $* +x42 i4c +0 +Z1 x02 $9 +o4m [ *32 +x02 i1l +$m $g +p5 ] i44 +$* x53 i58 +o04 } +c +6 +x73 o6m +*24 k i18 +r Y1 i52 +Y5 x73 x41 +o2k o1u +o2k o1e +^s x51 +[ i53 +x24 o0F l +{ +4 y1 +o62 x51 +Y5 x03 +0 +s17 x31 +$d d +^l ^l ^a ^4 +*09 [ l +$$ ^# +Z3 sAS x57 +u x75 Z1 +shm $m +L0 T0 s67 +R5 $n ++8 u -2 +$7 x61 +R5 $4 +i7s R8 +Z3 o0d +u ] $V +x53 o4R $d +o3% D1 +z1 -1 $y +Z1 $8 x16 +$7 D2 Z1 +^6 d +$u x9B +c $l $a $v $a +x25 ^f i3g +o32 ^c l +x62 i4e i5l +z1 x16 Z2 +*30 ^$ +C s4b +o8p *64 +r o1i p1 +Z1 o6F +f o68 +l +2 ^L +*32 ^3 +d '8 *04 +$p $0 +o2 T0 +Z1 o6= +o5x x21 d +d sgd +u i44 +$K x34 c +o5h o6a +$= x01 +iD4 iE2 iF0 +z1 *31 +*03 o2P +u i4@ +iA. x67 x91 +*37 *05 +x06 o03 +} s5$ +*05 o5B +$e [ u +K +2 -5 +i4r x03 +D1 p1 i4- +z4 z5 x75 +Z3 +A +^t smt +R6 o5a +R7 -A i80 +iB4 iC2 iD0 +Z2 o29 D1 +Z1 o04 +*03 *51 $c +^9 o3a +$b i1r +r $] +-2 s7i +] r Z5 +*09 *97 +r i4f z1 +u Z1 x75 +q D8 +s23 Z2 +$U x26 ++6 Z3 +s5e l +D6 d +i7c i15 +i12 i3c +i7c i16 +t o06 +sn8 +i3' t +p1 o0w +Z5 x4A +z1 o6l +C k $2 +o2k *21 $p +s97 z1 +i2H $a +^o s1d D4 +^6 x15 +f T6 x75 +o75 x25 +R8 x04 +^w ^_ +r sil +i7f i31 +-7 ^3 +{ i4J +i32 i51 i40 i60 ++7 D6 +r x06 +^u ] +^R d +$u r t +C i21 +[ ^0 Z2 +i12 i20 i30 i46 +x85 *67 +sEA +'7 $* D4 +x62 s1i +*34 sm_ +i6o x74 +q u x61 +C t +i1f i56 +x78 i3t +^- ^T +L3 x02 +Z5 { +i52 i70 i60 i81 +i3d i12 +o61 o5l t +'5 ^9 +i0n x08 +i12 i20 i31 i43 +iB4 x38 +R2 ^b +o0e T6 +o5u *89 +i16 i1f +'5 i3r +'5 ^i +sem -2 x45 +o5q $n +x75 o4z +x23 R3 +i54 i17 +o2u D6 +i12 i20 i32 i45 +^l ^e ^e ^h +i66 +2 +i7y i81 i90 +i6a i7n i89 +l $. $h $u +r *05 Z2 +$n $n +c $b $u $s $s +p1 spw +^e ^c ^i ^v +x39 $y +^p x68 +l $i $l $i $a +i39 i1d +i5c i15 +z3 *17 +z3 *14 +x74 l ++0 ^/ +i4o i5n i62 +l ^b ^o +l $a $n $c $e +l $a $n $t +x02 i51 +i1i i2m i3m ++0 L5 t +i7n i8c i9e +i3i i4k i5a +T3 T6 T8 TA +T0 T5 T6 T1 +i7t i9r i8o +*05 i5i Z1 +i2l i3f +i2l i3k +i2l i3t +T2 T6 T7 T5 +i1o i2m i3a +T0 T8 T9 T6 +T2 T6 T7 TB +^y ^t +D1 o1d $9 -5 $5 +i7a i81 i99 +l $i $t $i $c +sa7 si4 i2e o6b o3c +i5t i6i i7n +T4 T6 TA T7 +i2l i3i i4t +T0 T4 TB T6 +T0 T3 T7 T6 +i8o i9r iAd +$T z1 +o3w $h +Z1 p5 s26 +i9s iAt iBe +T2 T5 T6 T7 +T0 T3 T7 T9 +T4 T7 TA T6 +*40 } $8 +$2 $0 $1 $3 $! +i1o i2l i3e +$. $n $a +o6r i7a i89 $2 o97 +i2e o6b o3c +l $. $i $n $t +o1c i39 i52 o71 +T2 TA T4 T7 +T2 TA T4 T8 +i8i i9f +T1 T9 TB +p1 i1t x41 +r $i $n $e +i8i i9o iAn +i2e o3c o6b +T0 T8 TB +T1 T5 T9 T7 +T1 T8 T5 T3 +i55 ] +l $. $a $z +l $. $a $s +l $. $a $i +l $. $a $n +l $. $a $m +l $. $a $d +T0 T4 T9 T1 +T1 TA T8 T3 +c $! o4a +i4r i5m +^a o12 o2z +T1 TA T2 T3 +T2 T7 T6 TB +^a o2z o12 +^4 x52 y1 +T2 T7 T6 T5 +i9u iAn +T1 T3 T2 TB +o6i x31 +T1 T3 T2 TA +x46 $n Z1 +i4d i6m i5o +T6 T8 TB T7 +T0 TA T6 T1 +$. $i $s +$. $i $m +$. $i $l +i4v i5e i6r +x09 Z3 +5 +i0i i1a +T1 T9 T4 T6 +^a ^s x43 +i2a i3v i4e +i98 iA6 +$. $b $s +T2 TA T9 T7 +*42 d +i3l i5t i4e +T4 T6 T8 T5 +T1 T6 T4 T9 +D1 -5 $9 $5 o1d +l ^w ^a ^s +^7 ^1 ^0 ^1 ^4 +x93 L9 +$b ^[ +T2 TB T7 T6 +T1 T6 T4 T2 +i4a i5r i6i +i7a i8r i9k +^a ^n ^i ^n +T2 T4 T9 TB +T0 T1 T5 T2 +r $l $i $k $e +T0 TB T1 T5 +i3y i41 +T0 T9 T6 T8 +i6l i8s i7e +L4 '6 +T1 T5 T7 T2 +l $. $c $a $t +T1 T5 T7 T9 +T1 T3 T8 TA +i0b i1u i2b +T6 TB T8 T7 +T2 TA T7 T9 +y4 xA1 ] +i2l i3v i4e +i4l i5l i6e +^w ^o ^t +T0 T3 T9 T5 +*02 o1o +T0 T4 T7 T8 +i4b i5l +r $a $l $l $y +i4k '6 +i4r i5i i6c +T6 TA T9 +$7 *51 x31 +T2 T3 T7 T8 +iE. +snj o3v +T0 T4 T7 TA +T0 T7 TA T4 +c $4 $] +i7i i8g i9h +i6a i71 i89 +i3o i5e i4n +r $s $i $o $n +T2 T4 TA T7 +T2 T4 TA T8 +T1 T6 T2 T4 +u K x21 +i4e i5r i64 +T0 TB T4 T8 +T0 TB T4 T6 +T1 T7 T9 T3 +i4e i5v i6e +i1a i3d i2n +T0 T4 T1 TA +o2Q u +T0 TB T8 T4 +i2n i3a i4t +i2n i3a i4l +[ sts +^0 *70 +i8d i91 +D1 -5 $9 o1d $5 +D1 $9 o1d -5 $5 +T2 T9 T4 TB +i9g iAe +*71 x4A +T0 TA T7 T4 +z1 D5 i1. +T2 T9 T6 TA +T2 T9 T6 T5 +l $. $n $u +i4s i5t i6i +T1 T7 TB T2 +i2i i3p +s2y D7 D6 +T3 T5 T6 TB +i2i i3v +T2 T9 T6 T8 +T4 TB TD +T1 T7 T3 T9 +T3 TA T6 +o6w x01 +^a ^a ^a $1 i4h +o0b o1l o3e +T0 T7 T4 T8 +i8c i9k iAe +i4r i5d i6o +i8a iAd i9n +i3n i4d i5e +$6 o2Z +p1 x73 $v +i3e i4l i5e +i8t i91 iA0 +T2 T9 T6 +l $. $c $m +T4 TB T9 +T5 T7 T6 TB +R1 +4 +i70 i88 +i3o i4n i51 +i9k iAe iBy +u *75 D5 +i3e $3 +l $i $b $l $e +i2n i3i i4c +i2a i3c i4k +T3 T9 T7 T4 +T3 T9 T7 T8 +T0 T3 T8 T9 +T1 T7 T5 T9 +T1 T7 T5 T2 +o8q c +i2t i3m i4a +i4o i52 i60 +T4 T5 T6 T8 +[ i28 +0 +x63 x25 -1 +T4 TD TB +x41 $2 +i0p i2l i1o +T4 TD T8 +r $i $l $e +T4 TD T6 +$& $a $m $p $; +i4a i6t i5n +T0 T1 T9 T4 +T0 T1 TB T5 +o7# u +T1 T5 TA +l $. $s $b +T2 T8 T4 T7 +$s $s +T4 T6 T7 TA +T1 T3 T8 T5 +i0k i2l i1i +i53 i69 +i53 i66 +c i4+ +$s $g +i2r i3l +i3o i4v i5e +T0 T6 T4 T8 +T0 TB T6 T4 +i2e i3e i4t +i1a i3a i2k +i0c i1r i2i +l ^g ^o ^l +c o4a $! +i0n i1i i2g +T6 TB T7 T8 +T2 T6 T5 T9 +T1 T5 T9 T6 +o6j +2 +$. $l $k +$. $l $r +i3l i4l +f { +T0 T5 T1 TB +x13 s2f +i3l i4s +T0 T3 T6 T7 +i1! *17 +iC1 iD2 iE3 iF4 +T0 T2 TA TB +T0 TB T2 TA +T1 T8 TA T4 +i8r i91 iA0 +x41 $a +T0 TA T2 TB +T1 T8 TA T3 +*32 i9n +T1 T9 T8 +i8a i9m iAe +i41 i59 i69 +T7 T8 TA +Y1 o5y +i21 i30 i41 +T3 T6 TA +^l ^i ^a ^r +$i $b $l $e +*A0 '6 +i5e i6s i7s +T3 T6 T5 TB +i0z siV l +T1 T3 TA T2 +c o4W +T0 TA T1 T6 +i21 i33 i41 +o0( K +T1 T3 TA T8 +T0 T1 T4 TA +T0 TA T1 T4 +T3 T4 T9 TA +i5t i61 +T3 TA T8 T6 +z2 t +7 +D5 x38 +1 +T0 T1 T4 T9 +T0 T5 T6 T8 +i1a i2m i3o +$9 E Z1 +i2a i3m i4o +i8n i97 +D1 $9 $5 -5 o1d +i4a i6a i5m +i0r i2n i1e +T0 T8 T1 T6 +^o ^p ^y ^h +i4a i6a i5r +T0 T9 T1 T4 +z1 s3e +$S ssP c +r $i $s $h +-5 o64 +T3 T9 T4 TA +i9a iA8 +T0 T6 T9 T8 +T0 T1 T2 T5 +i0g i2a i1r +x01 c sRu +i5l i6o i7v +o1e i3w o5r o4a i6e +i9i iAn iBe +i5n i62 i73 +i0m i2l i1e +D1 -5 o1d $9 $5 +T1 T4 T8 TA +T0 T3 T9 T8 +T0 T3 T9 T7 +^a x42 +T0 T4 TA T8 +i8o i90 +T0 T4 TA T1 +T0 T4 TA T7 +T2 T9 TA T6 +T2 T9 TA T7 +i0b i2s i1a +^o ^r ^c ^a +i18 i21 +i18 i25 +T3 T9 T4 T7 +i9E o67 x73 +T0 TA T6 T4 +Y2 -1 x32 +o6r i7a $2 i89 o97 +i4b i5e i6a +T0 T8 T9 T3 +T0 T8 T9 T2 +T1 TA T8 T4 +o6r i7a i89 o97 $2 +T2 T4 TB T9 +T0 T6 T4 TA +T3 T8 T6 TA +^5 s!f +i7k i82 +l $. $y $u +i1e $9 $9 $5 sd1 +i8i i9f iAe +T0 T5 T8 T7 +$. $b $f +D1 o1d -5 $9 $5 +$. $b $m +sgw $7 +$5 d +-4 -0 '7 +$p ^9 +i1o i2h i3a +i1d i2e +o0t o3t o1e +i6i i8a i7c +-0 $; +T2 T8 T4 TA +D1 sih +$a $s $h $e +y2 o44 k +ux79*81 +i5d R2 L2 +*8Bx16$b +D6 i74 o8k i9i oAd +{ i52 +*ABR6 +i9mo0] +i38 L3 R6 +$l $o $y $d +i5c R7 R6 +^e ^l ^o ^b +L1 .0 ] +s17 *34 +^t ^o ^n +*B8p3 +^c ^i ^t ^n ^a +[z4 +i18 R0 L1 +s8Gz4z3 +sXr*8AD1 +*64*80 +o3o *37 x43 +x35 z4 +o0c o2q sg2 o1j o41 +^Fsd- +^O^NZ1 +sPQ$! +*30 o59 +i32 L3 R8 +u^{ +u ^7 ^d +sF(fy2 +i10 L2 R0 +i7.y4 +L2 $- i4e +s49 *07 +i32 L3 R6 +K*91 +} +3 u +*B2 '7 +*03 -1 +p2p4 +i11 i25 +s*m*29 +i5f R0 R2 +o1(u +i20*B2u +i5Ck +^kx17 +$dxB1s8t +D7^2 ++4 o5t +^a ^n ^i ^d +i18 R4 L1 +x25 ^p +o16 K +^$ o1p +$O $5 +^Oy1 +i38 L5 L3 +i55 L5 L7 +s9zxA8 +i3f L6 R1 +^o ^r ^e ^n c +L4x27 +.Ax79 +o1i c +z4 -1 +$1 r +sS; +T3 T9 T8 T6 +i1f R0 L2 +$$ i01 +x82o3 ,4 +*3BZ3sH5 +,4*38 +x6Ai91'A +sm+ +$1 i2d +Y2 $/ x23 ++4 o56 +^k si3 o6d +2 $3 +o4j R1 +[ i6e +o5b D7 ++0i5JsXQ +sm; +x4Ax42 +*5B*76y2 +$t $i $a +*24 *02 +$Pi8Gy3 +$m $o $e $t +T0 T6 T9 TD +^|sld +i5a R1 L1 +x23 o4w Y1 +i50 R1 R2 +i11 i27 +EsZq +*72o3PLA +s}/^xs{S +x53 o0R +o98.3z3 +T8s_4 +,7y4 +se2 o59 o3f $4 sc0 +x9Bs@yp1 +i1a R4 R3 +*47 T4 +$X o8j +x93i1= ++3 x02 ^p +K $9 D2 +} i58 +o0e i8a o6a o4_ ,9 +o1i ^A +k *54 K +Y4x93*0B +tD1*B1 +$l $l $o $y $d +snm p1 x23 +$kx03$2 +cTBxB6 +x9AEsA[ +^PL6 +^`*85s6} +x16 D4 sb9 +i5e L7 +rEi3u +R4 R2 +r R0 +o2`*A8 +i5`x23c +$M $C +x82f +*7A$k +$. o2, +xA6c +p4$k +i19 L2 +skYxA9p5 +x15 Z3 +i3c R6 +^e ^e ^l ^f +[^; +x14dx89 +Z4x37sjB +$2 $g +Y3i8e*68 +'6 $Q +x84*80 +c*B5 +o2g d +*90*45z2 +spKf +i36 L3 L5 +T3 TB T6 T7 +z3sC4 +o4s -2 +*6AiA& +x48 sat +i0j i2s i1u +seo $n +^p ^a ^p +*76 *56 +o3h $r +o0Ys+m +f ^T +L8 { *78 +oAUsPz +*B6sA"sV4 +sGk$4 +xB4p5 +D2 $, +R6 ss8 +i52 L5 R8 +Y4 x42 [ +Z2 $e R5 +x49 i4u +T0 TA T9 TB +i31 L9 R4 +u +6 ^I +i36 L3 L2 +D2 $; +R6 [ Z1 +sj2x82 +o0p *34 +i59 L7 L5 +T2 TA T6 T7 +o3Qx24x5B +R2 o5o +*B7 x19 +o6f x03 +y2sxn +$L-1x36 +*A1sS@ ++8 x91 +o5c i7p +D2 Y2 y3 +^@ $y +p1 k ] +o2r Z1 +*67 D6 +L0 x31 +]iAd +$m ^C u +i3e R5 R6 +Eq +k*A8 +o63 i80 [ +sg2 ] +x6Ax28i0} +R0 L0 +p3 o2o +u i1E +i17 L0 R2 +K D2 $9 +f x43 +i5c R0 R1 +f *74 +x02x74 +*62sXOx82 +sgT u +oApc +*59 xA2 D6 +x79L6 +o4v x59 +^g ^a ^w ^s +s-\ +*43^p +*09 { +i0j i2s i1e +*37-4 +i78sVzsIH +D4 o5+ D4 ++4z2y4 +$A u x24 +i7a R0 L0 +lZ2 +-8z1 +x21 $5 +c $f $e $r +o7Kx26y2 +s+&xB1 +$0$3$5 +D6 sGM +ux05.0 +i15 R0 L2 +i54 R6 +-2 .6 +,9y1 +$ -3 E +i5c R1 L4 +i5c R1 L6 +k*37sqt +$Tx45[ +*92i9_ +^v *61 x13 +^e z1 E +d{*A3 +p4i4Xo4p +^i *52 +o0j y3 +T2 T7 TB TA +,1x24z2 +x74$` +x32 L4 +$l $e $o $n +R6 Z3 +*35*72c +iBO +kR1*84 +x94i0Wo2j +D0 y3 *35 +k{$W ++2 u p1 +]x02 +i72 R2 R1 +y1*94o2| +i12*A8 +o7y o4x x02 +f z3 +${r +z1 *04 x31 +Y5 .4 x64 +z1z2o9E +i55 R3 L3 +-7 $B x04 +'8 s 5 +*74c +i1. $. i3. i5. i7. +o0k.8iB( +s24 T0 +^a ^t ^l ^e ^d +o0i i2b i34 i4t +o2s x41 +,5 ^5 +^e ^p ^a +o9=*A4 +d *32 +i9H] +x21 $8 +s<)'3 +i19 R3 L3 +Y5 iB, x26 +${l +*14*7B +[ o0t +2 +^n ^i ^g +t*2Bx86 ++3 *50 +^6 x21 ++3 *57 +swb Z1 +y5 x7B *2A +$0$7$1 +u D2 +$f $a $i $t $h +D6o0] +T4 T7 TB TE +p4*6B +sH%x47 +*47z1*56 +srz$X,7 +*72D1 +[ $6 +i6s x23 +x04 x72 +Ci4AoA= +DBC$G +i70 R0 +*12 +0 +$s $p $u $n $k +K o2l +i8Ysgto8% +suy u +$s t *75 +D2 { +i20 r ^7 +c $c $h $a $n +$fo6S*78 +DAoBB +p1s.Wx37 +szlY5 +o5i x86 +sq/*60 +sX- +Z5*B3^U +R3 -7 +R3 -4 +i3$fx21 +,3 *12 +r L2 +*01 o6. +i54 R3 R2 +i78 R9 R8 +^a ^r ^e ^s +t i4A [ +i2Qs(g +i33 $l o7g oAe +^u ^d ^r ^u +z2 i3o +^9 o6f $d se6 su3 +i31 R0 L3 +z2 i3p +]k*26 +s5G+8E +i31 R0 L0 +y4sjX +i0d R6 +sct *45 +x86Z5 +R6^j +i31 R0 L1 +T4 T8 TA T7 +$i $n $c $a $s +$n $i $c $e +*26 T6 x15 +s3s [ +i73 R4 L4 +{sO0 +iB[p5 +x85*67 +k ^x +xA7k +*01 *83 ++0 '5 +x02 srp +o0l d +xA9T1i4k +x62 i36 +[ k $1 +sx;o5TZ1 +i30 R0 R2 +i8t i93 +Y1L0 +^y ^v ^a ^n +i17 -5 +x18 *42 +y5 p3 +oA4[^4 +x21 ^u +$k $y $l $e +*6BxB3 +r R1 +i36 L3 L1 +i1@*10o43 +ri0' +*A1o95x85 +x17'7sG^ +*95 D8 u +c*A9 +*68*15sBl +o2* z1 +q '9 x21 ++2 *43 +T4 T7 TB TA +i1C { +l i1l +qx62 +$' ,9 k +Z5i1a +s\d*89$s +r o6o +'7 R5 o2c +K ,3 *20 +k$g +k i3Q *62 +i5h Z2 x6A +ry5D9 +$m $a $r $s $h +*27p1p2 +*8Bs^X +z2 o1o +c sgV +i31 L7 R4 +i3b R0 R1 +*98y2x89 +i9j x54 +^o ^n ^u ^j +s}_*4A +D5 i4g +s=, +*06^g +RA i9X x37 +}i09T4 +o81 R7 +^l ^r ^a ^c c +o0z i6- x53 +D0 *01 t +o6c o4y +*46x52 +y3 ,1 +5 ++7 ,3 +^s ^e ^l ^o ^m +TAy3sgw +p1*41^W +*41 *52 +Co6b +i34 R1 R4 +p4 R4 +i11 R0 R4 +o59 o31 +p3$d +i7s y3 +sVusV*o1{ +L6]sH& +o2k -5 +Y5 Y2 x39 +i11 R0 R2 +s8rExB5 +z1 L0 $1 +,4*51t +*70*24 +i51 L7 +T2 T7 TA T5 +s?l +iB/i2= +$p $w +*34*26s{i +-5 i3i +x96 i16 x15 +xABx75o9v +*15 *41 *52 +'7 i1i +x71sX- +siqsLys8j +i15 L2 R0 +Z3 o7o +sWX +*5B*09 +y5T1 +T0 TC T7 T2 +x5Ai5 y2 +o8Qf +i17 R0 L2 +p5 *67 +*03 *32 +3 +[ $l +$p $6 +o0w o6p +2 o4v +] i53 +D5 R1 +^o ^w ^t +i0f ] -7 +o5e s9. +T6sVEy1 +c o2r +T5i7Ax6A +Y4] +y4^K +i4a i60 i5n +sC3 +sa2 i4e i5y sx1 +Ks@% +sWoiAF +o2c R4 +Y2p3 +o2w ,7 +$l d +o0)s\QsN( +i73 R8 R9 +o20*A0*A8 +x4BZ4 +Z2 o0( *15 +o1*R7 +y1sa(sXk +T2 TB T4 TA +$j $u $l $i $e +x95z3 +y3s'hT6 +i19 R2 L2 +^l ^l ^a ^w +c sMu +$f ^v +z4CTB +*83*A0 +i55 L7 L5 +,5d +s0Xz1s8@ +x32q +i5e L6 L4 +fx28o3p +o0z o4q $9 $7 $2 +s(W +toA]si& +$0 x45 +$O*10 +^e ^n ^i ^m +x75Cc +*A7^W*46 +o1h x42 +D6 s82 +i7c R8 L8 +i5c R1 R0 +'9 o0K +-8*93 +$x [ +'B x61 +li8m +sT$ +o0i sa1 o2w i32 $f +^m ^c +sX[sWk +r +0 } +i50 R2 R1 ++3$CZ5 +xA4ls\x +*98]^C +i57 R2 L2 +^l ^i ^a ^n +[*51 +sg9 so0 si1 +i55 R0 R1 +u$g +sba +i16 L1 L3 +i74 +6 +Z4 x64 +s&1T5T3 +.6*48-6 +oA9 DB +o2r i3g +*13o1W +i16 L1 L7 +*46 L7 +s20 Y2 +,8 .6 +o7K sK4 x43 +R5$%y5 +z3x72LA +o0D '6 +o0n Y2 x43 +xB3T7 +*07xB3 +i7 s*ny1 +Y1sPZ +s +i12 R3 R2 +y2 x71 *04 +i73 R9 R8 +s3e +5 +$o $y +^t ^i ^h +^_ o0v +sL7x81o2N +o3; '6 +x31 Y2 D1 +i18 L2 +o3Y$1 +x28 y4 *36 +iBuo9I +f c x08 +$7*40 +$n $a $s $t $y +*30x47 +^l ^e ^w ^o ^t +i2 sqt +,5*31Y5 +x65 slb +Z2lz2 +'6 sqg +$6 -5 +*34[ +{ z4 *81 +Z3 *72 *63 +,7sMDK +^g z3 +*75 Z1 +y2K*31 +s\"D4 +x97*30x56 +T0 TA T9 T3 +R8$Y +sge*3B +^4*27 +s/YR9*48 ++1 sc5 ss0 i67 o7a +sln$] +x01x43o8v +x15 u $8 +r $a $u $x +*93o26 +p1q +] .2 $r +x63 i5k +i6b i3m $o +[ x41 x37 +rsc9f +*42 y1 -0 +T6i9^r +*19s2] +*81i5x*A9 +o5sx1AsUt +s2B u +.A$Q +i6% +9 +Kx24 +Z1 x28 t +*7B] +^Qo1x +RA.5 +$P,B +x06Z2 +r x61 +4 +o1c o75 o5d o69 o3j +^-o0\x9A +$fp2 +^-o24*20 +*36s+{ +r*98xB5 +o2H Z1 u +x7A^u +x75^NsQx +E o3s +*59'7^- +s|3x5A +y2x25o2l +o3YY5x36 +Y2R6s!; +$1$EiBB +,BsK# +*35x71y1 +p4 o3z +$p*7A +.0y3 ++5z1 +] z2 +o07 ^2 +Z3s>S +*5B$"'A +ssV u +x16C +u i0N x16 +*47oB{ +T0 T9 T7 TA +.1xB3sA? +o2- o3h +*19Y1 +$7 i54 +i2L C +sn^ i2C l +*12 p1 +[Y3 +T4 T7 TB T8 +,5iA/ ++1 o2w s.q +Y1y3y3 +i84s!xo09 +L9$ZR1 +*B8y4 +x56Y3 +[Y2 +$e-2 +-8x15 +K +2 T0 +^lx35 +-2sk0*31 +i34x14 +x53sT1$- +{iBs +Z5 [ Z5 +L5 i5o +p1 o7d +x41] +T1 T5 T2 TA +sH^ +xB2$( +o5r x02 +ki2t +Z1-3si; +Z2 x37 +Cy5sNg +T2 T7 TA T8 +*8BD1 +p4x03x8B +T0*62L2 +o48 .1 +i0b-Ax56 +o1f [ +x41t +svD +*15+0 +*A7s`,+2 +*63 [ -3 +z3R1x15 +*34sf; +f x37 ] +x47x32 +*75] +d *20 '8 +*92D9*23 +d xB1 l +D0i2e +su+*87 +s*v$C +*10*36 +]^>-B +T2 TB T4 T3 ++7 swg Z1 +z1^u +i30 R2 R1 +spTxB4q +o4msvat +T2 T5 T7 TA +x64 $4 +oAr x14 +x54 R0 -1 +s,}x98 +o3j DB p2 +*26 '5 +k*20 +'B *94 +x35 *A7 +{ o6i +EsO; +x0Ai0_s]` +x5Ap2y4 +o3/ u +.7] +u } o2E +^usFp +T0 TA T9 T5 +.7i5i[ +i30 R2 R0 +Z4 xA6 .1 +} *54 *B3 +} Y5 xB8 +Y4 xA3 +i34 L3 R6 +K Z2 *58 +i14 R0 R2 +*04*50 +*15cY2 +o5c *57 +Y2 c p4 +s5u*24 +^m *21 +[ [ $0 +y2^sT0 +x21 o5k +Y3 y5 +xAB ,5 +*6B*B0sHZ +$m K slf +i5p Y5 +*0B*B4i9D +i3xxB2x24 +sJ= p3 +^Nx6A +x6A c +sn4 R6 +.2 x83 +T0 TA T9 T8 +*67x06y4 +i1f i2, +T0 T2 TC T7 +Z1z1 +l o53 o34 +x0A*79^o +cC*97 +o6e x24 *35 +^, d +i2L E +x25x64f +*95 u D8 +csAw +Y3D7 +i0jsCo +*26 ,8 +} *B3 *54 +Ktx92 +*5A x79 +} *4B +x58 o2. +R7 +3 +^s ^u ^p +^,x42 +u *05 -5 +o53 z4 +xA2 *80 +Y1 ,1 o01 +oBAr +s Ux54 +o6us;Px27 +sl'x68$f +i8o i9y +fy4 +o0ZsTp +x17d +$r $m +s`%$$*81 +o0P r +o9i^{ +x45xA8 +x21 z2 +.9*6B +$r*60 +,6c +o9?*8BsX2 +o72 k +z3 Z1 o0m +x48i29 +T2 TB T3 T7 +Z3^e +p1 *28 +.1x06Z4 +o0( o6) +*58+7 +x03x9B{ +x7Bx19*58 +Y5 .1 +} R8 +*07 *43 Y2 +[x27-B +$5 c $2 +ds4.$w +o5o Y1 +x21 i46 +iAlo7giAS +^AsF] +syo*B6 +$r $x +c T0 *07 +i3d*71 +R3 '6 +T2 TB T4 T7 +Y4 d +T4 T5 T9 TA +E *75 $_ +x48 k +} x98 +]*18 +l i06 y4 +x52 o5- +T0 T4 T1 T6 +y5 k x54 +i3u x52 +sYCR8 +sA)*1A +T2 TB T3 T8 +tZ5 +s50^c +i5v x83 +x41D5su +^0 *34 +} *76 +*4A*54x42 +*25i7_i31 +*40 r +*24 .7 +o70Z4 +i4b x02 +Y2D9 +x23 o8_ +sFTD7 +*A1E +oBE[y3 +i54 i66 +i4hs"GswR +$% ^* +} *6B +'7 o11 -6 +iE1 iF9 iG9 iH5 +^e ^s ^u ^o ^m +sgr y1 +$* ^K +*35R7x64 +,0s%a*54 +x05 c $2 +Z4 .1 xA6 +x4BC,6 +sxI +oA\+0sB1 +D1EiB$ +$t ,3 { +x98 ^4 +$y *16 *13 +Z3x95i35 +xB3^px08 +o7* o2i +s50*01D5 +*95*51] +x9B^j +s^%Z4Y5 +i5dRA +*03^z} +o3d p1 +*82 '6 +*95${ +$. $g $o $v +o7w^K +$* $% +$* $$ +o7*o2isqY +i62 i80 i70 i92 +*16 ^1 +suw o5W +]} +$au-4 +sNv +^9 o6f su3 $d se6 ++A 'B o7g +sCM c +c T3 d +s-s [ +o1g '6 ++0 i5S +,4x42x2B +.8 $& +snR ++3 s9. +^b z2 +c x31 xB7 +*89i7q +x12 .1 x25 +z2 -4 +o68 -5 +^` ] E +i4o i5o i6n +$Q x31 +o4e x13 +xB1T4 +p1 *9B +o99y5D2 +o0s x61 +*43 *A9 +{ -5 ,4 +]y1*98 +$@'8 +somp1{ +][ +^wsFqiAE +xA9]R7 +i5d *62 +*15 Y2 c +$A $D +s)G^9*69 +*20 Y3 } +*9B -A c +x03y5*9B +$Go9 +o0i y2 +x87 y4 +x42 -0 i9@ +i6< ^1 +z1 L1 +Z1 *56 T6 +L0 sdu +x13^4 +x01 y4 [ +y5z5 +*45 x87 -6 +sSe ] +x41 K +*15 x01 u +$! o0s +z4Z4ssS +Z2o3h^S +q $9 x73 +i0p i2s i1a +^h t +$l i8| +sny p1 +Z1 x16 +L6 $M +y5 o5k xA2 +x67 $g +*B4*85R4 +o65 { +s8= +s8a +o0h -3 +s8p +c d si1 +s8{ +x94.7i6i +f x05 x35 +p5 *14 r +x12 } $6 +,1d +TA x81 +E *27 +sfixB2 +T0 TC T7 T1 +.0 s6F Y1 +o4m s37 '8 +y2oBb*35 +i80 x35 +Z1 -5 +$wy5*83 +x0B Z5 +i0a i2a i1l +x03 o2e +iAO C D1 +i40 -3 +*70 s9F D4 +^v sq_ +$` $} +x04 Z5 +$` $~ +x36f +[D1x5B +*83x81 +o72 D3 i1c +Z1 xB5 $X +r o5f ,3 +^2 i5d +'B*89 +T3 TB T7 T6 +x1A { +,2*39 +y3 E s8d +]i0WoB7 +x76TA +D1 iAq +sm;{Z4 +Z2 x76 +*42d +i9@o7q +.0 o2r r +i7f i8_ +x23 x76 +x9Ax52 +x39D5 +x37i9e$S +i2] +sAl *89 +o77 i64 +]x91$h +x74 +3 +x74 +7 +D3 *41 Z3 +$J *18 +o6. Z2 x42 +$4 o5g Z3 +*04 C +o7!s6pi0g +o15 y2 +D1 i5f i69 R7 o2f +$-x75 +Z3 L6 +{ ^A u +*06 +5 K +.7 ^x +.7 ^m +o2t $s +,6,7 +] o5b +$K o7@ +sy\s]v^- +x36o2g +.1*16 +k *67 x42 +*B9i8Li6q +s}z^*$0 +Y4 T0 xB2 +x43 x48 f +*46s[c +T4 T8 T7 T6 +x51x69 +$w *76 k +s03 l +o5b D2 +i5d R9 L9 +x04 i0j R2 +o0b i37 o4e o58 o14 +s94 *12 +Y3x58x91 +TD T3 +y1 ^3 } +i0s o72 +o4w [ +o5! Y1 +f D8 +i0@ T9 x35 +K .0 *12 +E ^= +o36 sa0 +.6$S +.2x63 +t o5` +^n ^o ^m +^K o4b l +x71 x43 sh- +x68o00 +$a $S +sc[ +i7P$d +,3z4x42 +T5 *40 +*96i5Ox26 +T5 T9 T6 T7 +d *19 +o4zx0B,B +svRx59-2 +$n y3 +d *16 +s24 C +i52 +4 +^6sQN +i4s i51 i62 +Z2 spM +svF x62 +K Z5 +R4 o27 D0 +x53 ,3 +f.5 +s!v*47,4 +DA TA $u +s2usA@^h +T2 T9 T4 TA +o5lx2BD6 +i6e i81 i7k +sX% Z2 +x2A y4 +^n ^o ^r +i17 L1 R4 +-5y2] +x81 D0 +x01 q +T2 T4 T9 T6 +*34 ^3 +Y3*5B +y2*64,9 +[ i04 ^4 +-9x6A +{*16 +k swM *34 +*87sDg +^b x14 +-8s9w +o3A o7K +suH +ss# T0 +i31 i51 i40 +o5x -0 +Z4x74o4; +o5v] +sgao1g +p1 *15 +x47-2y3 +$0 i1e +Y2 stP +s7e *21 *04 +t $P k +o4a $3 +i6f skE +i7u*A9sSv +y3 s9B t +d x39 C +y3 s74 +x49x81 +x02sH1s]O +T6 y5 +^* x65 +^i D2 +x24 L9 -0 +Z5 *46 +^t d +x7BT8 +-2 sk0 *31 +^B T7 +sx&i4vL7 +*46 o3i +o78Z2t +x59 K x72 +d *14 +x64 q +i25 t +$t { +$@ { i7> +o55 .0 +o02s_* +$A d ++B x23 +o29 R4 +]iA4 +t z3 +*8A D1 +i48s`J +i38 [ { +x51 o5b +i17 L1 R6 +sMKcx76 +s0[ +$PZ2 +^t ^p ^a ^c +i44 ^1 +*BAiB9 +*45s>e*A5 +T2 T7 TB T3 +sg- +T2 T4 T6 T9 +x72sa5*B6 +Z2 i7C +i32 D7 ,4 +Z2 s!7 +x41 ^m -5 +T2 T7 TA TB +i83i3. +o82 } +x14 x24 +^C '5 +s6c ^Q ++1 o0n +^s t +x04 R0 +i3u*01 +i8(*43 +*20 s60 +[ $1 k +*40 y2 +.3 *23 k +*30 *67 +r x84 +i6a x31 +s$oy5x2A +$g .5 +xB6$} +oAo$)K +Y3 *79 +$%*2A$3 +.2 *05 +x31 ^y +$8 *43 Y1 +r ,3 o5f +$M x04 $O +D5y5xA6 +Z2o64 +x21 d *A2 +Z4 x37 sjB +Z1s;Ed +c i4& +x42 p2 x79 +^/d +,5D2xA6 +i8n x08 x43 +T1 T8 TA +^s ^y ^d +s7O x71 E +y3 c x73 +D6 R5 o6Q +i4y $4 $u o5e +o3H^5 +*BAi6Mo7S +y2 .4 u +iAV ] +i6d i9! +x48 snw +-5 L6 +o4a +0 +*14i6n +i1e $h i4a i5r $i +o0s x21 +^s ^y ^a ^r +x06 t d +i4A,4 +sy. x32 +z1 $Q x42 +snh suo +o3k *14 [ +o0l srw +^e ^k ^a ^r +.0x6Bp1 +^n ^o ^t +x03s/< +$Uux1B +c T6 T2 T8 +^c ^i ^n ^o ^t +T7 TA TB T8 +*13 *34 +Z2 [ r ++4 o10 +p2 i2) +$5 K *A7 +Z3 x8A *64 +x65 ssL +k *34 swM +i5B .1 +T7 o0K +o5q Z1 +slG sdO +-8xBAs7G +o4d i4l +i0. xA2 +s3B +srzY1 +i4T f x47 +*78 *13 +*28o3gs$l ++0y1*13 +x87 $L +p1 x6B +x91 i5? +R2-2 +x52 R3 o66 +k o4g +T1 T4 T7 T2 +i6LY2{ +x15 y1 z5 +'8 sfC +*14 i0c +k o2m +*97 *87 +L5*76 +i9} +*79x7AsQz +sZ5sr1 +i6q T3 +x43$soAR +x36D9+1 +i61 } +se1 i32 st3 sl7 o75 +^^x68s&d +spG^L*1B +Z3o6a +*38TBx95 +[ Z5 o68 +o3fY4 +x42 i9@ -0 +,3 o2J +x01 D3 r +T5 R8 +o0u ^m +x56R8 +D4 K } +D3 *4A x06 +i3x i5n i4a +Z5 l x03 +x95 $j +$j sik +o0g x74 +o1a ,4 x89 +^W K +o2t t +Y2 o7? +o2t r +o0- D3 +y3 +5 +Y2 o7f +T0 T2 TB T8 +i78s7) +s5c Y1 y1 +s3?x46 +x05 i3. +*20 o0g +[^ast< +xA7o5a +T3 y1 +sx9 +i61 i89 i75 +^s ^e ^l ^o ^p +x03Y3 +[ +1 $3 +Z4o3n.6 +x53 ^5 +i4/ xA4 +x58 Y3 +x47 R1 +Z4RAsby +i58 L5 +Z2x01 +x53 ^7 +x83 i7K +spG ^L +x21 p3 '9 +r i5e +o5c x02 $4 +z5 *36 +Y1 o4n x94 +i2i i4e i3v +u i9n .A +x61 T2 $i +$G o9n sG_ +x36 D6 +*85*04 +*91-8 +^K o1e +*9Ax9Bx67 +o92 $Y +^0 ^2 i6i o3e $r +o92 $l +x24 $/ +.8 x04 +-8 i5b +x24 $a +i1z x43 +x61 y1 x52 +T5 T1 T2 +i8` o9e +p2 iB) x78 +o4m +5 y2 +i2t ] +x72 o3G +sdF*35 +$B*96*98 +x32 x64 +LA+0 +LAo1d*68 +x21 sln +$? $@ +$( y3 +^e ^l ^o ^m +$? $( +$? $) +$? $+ +sSqx46 +x63 s71 ] +.0Y1*76 +qZ2 +x76+2-A +s;io6M +o4p *40 +u Z5 +p3x4AY2 +-6 D9 u +^- xA3 +*02 *8A +ss8 $9 x92 +*02 *89 +sue D4 +$4 s3/ +] sdX +o2j *34 +o77 ^+ +C x86 +D0 x31 Y2 +Y2*3A +x18 T0 +-7 $g +-0 c sy. +$M $O x04 +-3 d o1f +z2 x93 +xA3 DB +T1 T3 TB T7 +o60 D3 D8 +*29x23 +Z4 *05 +y2 oAJ +*89 $s +-7i6. +x75T6 +y3 x62 *76 +i7t $3 +^c -2 i3d +Z4 *06 +$p $u +C L1 +R0s8d +spR $h +$P $I +szI $i +xB7sS+ +C LA +o3h ] -4 +Y5 '9 +{ E y1 +E ] o5Y +$/ $? ++8*19 +-4 $8 x71 +$/ $5 +c *4A +sr x32 +$/ $+ +$/ $, +$/ $- +p5Z2 +^6*B5 +i4c*49 +-0 $v +y3 scf +T8 z1 +$/ $@ +sCr i4@ +o7n $x +^I *9B +s'd +c $6 } +$. $f $j +u *97 +K s1x p4 +$s z5 +o0w +2 +R5 st9 +-8 ^j +^A u *54 +*10x83*9A +R8 t +c T6 T8 T2 +iAKi49 +*21,5 ++5 $# c +*07$' +x27 ^l +c oB. +p1 x31 x65 +T8 sgv R7 +o5 x13 sdh +x8Bx34 +*8BT8s=& +i52 i71 i62 +x83 l x53 +i7f R6 R7 +*65D1x52 +^M x31 xA4 +*34 } p1 +} Y2 D2 +Z2 o29 +i7x D5 +^l ,5 +x54fx84 +K oBH +y1 o3a +i0G +A +x28 p3 +i9B *43 +x62 i6' C +$Y L6 +i7o siE +y1i0,x49 +Z1 *A7 x35 +*08 o7D +Z5,3x78 +y2 r *27 +y3x38 +i5a z1 *36 +[ o4j $7 +sB\Z1 +i5z q +Y2o7? +oA7 u +*27 $j +*32q +^- x63 +*06 s-* ++3{Y5 +x03 ^w u +$. $f $i +z3 *19 +i4z .3 +Y4 *58 +R9 D7 +.6 i8Q +[ y3 -0 +*64x73 +Y1 x94 o4n +Z2 i4- +E s89 +$y i9+ +scRx95 +^r*AB +i14 R2 R0 +C*07 +E Z2 x93 +x76 ^L +p2o9TD9 +'7o1u*20 +} s5T +y4 *38 x23 +o4?z4 +*79s;6 +*48s%2s#+ +C x92 +iAH +x62sO3 +o37 *13 +y2 *04 x71 +*32 o3x +svY +svW +svR +Y3x29 +s=ny3x59 +c ^< $> +o2! i3V +L4 *89 +o4rx53 +$` $! +f D4 +L8 x92 +s06 } +,4Y3 +^lL9{ +l D0 Z2 +*A7 x42 ^K +x52 o5q +x34x74sDe +s*2sNs^R +y5 x9B ^t +$N o3n +*75 i6- +^T *94 +x83 x53 l +^9 se6 su3 o6f $d +T1 T4 T7 T5 +*48 *20 x63 +i6Q DB +$. $c $r +i33 R4 L3 +*32 o3p +T8 T1 T5 +*32 o3s +p4 x31 *20 +p1 x2B +x23 Z4 +x02 .5 +lR6 +.1'AxB6 +o4$ $$ +c i11 i09 +x1A f +^m ^a ^ ^i +$)ssL +o1v i52 se1 i61 o73 +T0 T2 TB T4 +o4D *40 +u x74 *43 +T1 T4 T7 T8 +o6Vx09p4 +$( $% +T2 TB T4 T8 +$( $& +*0AK +iBL-5] +R0*79 +$( $* +E $8 x63 +$( $? +$( $; +x84 $c +D4 ,6 $Y +x82Z1 +] TB Y1 +$( $@ +$( $^ +^e ^r ^u ^s +sM;^i +ssm{ +x14Z2 +o1w .3 +sw&o8l +^z o3a o75 o6u +*23 *43 +T6 TA T7 +Z3 *64 x8A +s4. *74 +Y1 s1F +i4n *58 r +Z3 o0h +*B6q +y5 x78 +sjix05u +*8A T1 +K s2P +x5A c +D1 C Y5 ++3{o2w +i33 R4 L4 +*B9 x73 +x16 C +z1,2 +i7) *31 +T0D0y2 +y5 x74 -5 +x12 s9n +[p5 +T4 TC T7 TD +o3E s4. +^g sg* +A +srL } *35 +oAk iAZ +k*49x58 +x65 y2 +R3*59 +o3. x56 +f x13 +i0m saZ +$WsR8 +TA *9A +*45 -6 x87 +Y3Z1*B1 +o5r*39 +,7x75^( +x46$;sxI +[ E x81 +f $m +T6 T7 TA TB ++0 z5 +*43Y2,B +o4s ] +$) x83 +Y5z5x8B +^M x69 +o2u ^i +$y x07 +se@ E +ss;$K +*9A o6x +o1*x47 +z1 s8@ +o0w o6p o4v +2 sf4 +^x -2 x31 +i3r i5t i4e +^u $k +sRf*75'8 +D2 y2 +xA5*35D6 +i4y i6s $1 o89 o97 +$(uiBv +K $A +i4- y5 +t x42 Y1 +xA8u +o2s *30 +'Ax69 +t$[ +q s4. +o6g *02 +^/x8A +$. $u $a ++0 *03 p1 +i0vsTF +$So5l +x75 t q +y5 x02 x51 +Cx64 +sdG } +i1c x23 +*30 skJ +*32 R5 +*71-8 +^t o3^ +T3 +B +$V .7 +i39 *25 +'9 *68 +sri d +Z1o0{ +i4b +5 l +x34 -7 ] +o0DxA2 +s5@ x03 +,5 $s +x63 x04 +o2S sqi +E x76 Y2 +^t o3R +o3p } +z2 scl +uT8*56 +T5 TA T6 T9 +iB1 iC2 iD3 iE4 iF5 +o1a x89 ,4 +$/s d +k s2c +k E ^y +i48 +7 +i79 R1 L1 +x24 T6 x31 +*70 i4g +DB i9E +o0Zs(a +o7o} +'6 o5* +*A9 s5q E +T4 T8 TA TB +T7 saq +i0MxB7 +^w x23 +o5d x71 +shX D4 +*24s[F +*35 +5 +^a x13 +x54 $1 +t ^9 +o2r $7 +i8^i9dz3 +Y4s * +i4h i2i +K +3 $e +l i4V +T7 shl ] +i6Z sNg +i7V K +T1 T3 TB T8 +*72 $i +o0@ Y5 +x31 $5 +^^xA9 +T7 TA TB T9 +k ^g +z4 TA +LAp1 +s*AB +i0Sr +i2kk +T5 T7 TA T9 +o4i^4 +^v c +sea x38 +x34-7] +o2T o33 +xA6 T7 +o9joAao79 ++1 srD +$2 -0 x12 +*12 o9d +$/xB9u +o4i *02 +r-5 +o3v ^I +sz. +Z1 i27 +sik ^R +o0z $9 o4q $7 $2 +T1 T2 T7 TA +-AsnFi40 +iAO D1 C +*29z1p1 +*42x59 +-1x1B +^e *32 +i8Jy1x8A +x75*B6 +o6z sBK +Z1cx08 +o78 t Z2 +x69,2 +x07 +3 +$" $( +] siy +$" $' +$" $& +$f*87 +z2 *15 } +x63d +^k o6d $3 +2 si3 +d*69x58 +s.(-B +y2 y2 'B +^P x13 +Y4 o1w +se2 $4 o59 sc0 o3f +x54 p1 x9A +.3i4L +^K i71 +o5v ] +{ sO0 +i7$i4f +s_4 +$) xA3 +x86 o5b +o3ZsTHsXw +q$+ +i11 *14 r +$J o64 +-5*7B +^k p4 i4u +*A7 ^K x42 +r o1l +z2 -7 ] +scSstS'A +^1 R1 +.8 o5r +*57*53.6 +-0 sy. c +i7a,3x28 +xA1 ,6 +p4sy;} +x59 *48 +l $. $n $r +*75*63 +o83t +^2 z5 +p4d*A2 +*83'8sma +o2U c +sT@skRoAo +l $. $n $p +^n$oxB6 +o5c T7 +-2 $3 [ +o54 i51 +o4h +0 +^b$A +s3p i0i +sd[csnO +xB2 x75 -5 +*A5sus +.2Cc +D9 L9 x05 +o1y sl1 $f $l se2 +o2r sc@ +x73 ^n +y5 D2 +i6c x92 +D4 o6i +T2 T9 T6 T4 +Z1 iAP +x01 D3 [ +x84 $j +x23 *30 +$! x39 +Cx43 +i6e oAC +^tcx9A +D3 x13 ^@ +szY $u +i2e o7/ +o15 $7 si0 .2 $2 +T5 i5- +T5 i5. +xA2 o7p +z4Z4 +i11 R2 R0 +p2c +s20 ^Q +oA=D3Y2 +o0t -7 +R9 'A ,2 +i0h o74 +x74,2 +x16 p3 +*31 i1e +i55 R0 L3 +t o8Y D7 +i8D [ +Y2*63 +x41 i6m +$0 K set +T7saq +sp&o2fp4 +xB3f.1 +sq)f*6A +Z2 .2 x63 +L7{$2 +Z3$8 +x61s!a +i9k ssU +x23 { y3 +i3h *9B +} D5 o0d +i1* x02 scY +$, D0 +p1-AD6 +x64 i4o +.0 ] $8 +Y5rs3l +-4 x13 +x42x92p3 +$7 *40 +-3 p1 x72 +i4s x52 +i2t i4h i3c +$) y2 +^m*A0x42 +i4/^1 +R6 Z1 [ +sy xA6 +$( +0 +$ -6 +^n ^n ^y ^w +,7*53 +*9AoA%$& +uY1i1A +$& i9U +i7bxA5 +^a ^v ^i ^h ^s +o0j ^9 +ri0e*98 +xA6}o14 +*46 *36 [ +*38 o0k +T4sB1 +i5y o0r +$i iBH +o32 i27 .1 +z3 o2g +o3h *12 +$e x62 +y2 ,6 +p5y2 +x34 ] -7 +x83 ^b +]T6 +sbQ { +i2e ^A +c ] Y5 +i9< R6 +o8Gdx9A +xB2 oB! +]Z2 +*31 -7 +T5 TA T9 T8 +x53i9XsMK +x18$Iu +i5a x62 Z1 +x23 } y3 +x47y2 +x0B y2 +p1 *51 +L8 x62 ^Y +sHt +i0W x78 +spPxA3 +K o4d srp +s_)y5i5@ +xA2 s6. +x05 C z1 +R5 sd4 +i16 L3 L1 +r*17 +x63 ] +sz7 +*18sJ'+5 +syb .0 +x63 q +^E x12 +$| $! +y2 ] .4 +^a ^m ^l ^e +R7sX-^t +sj7 { +1 +i11 o62 +xB3 C +s)zx21] +^, xB1 +$5 z2 +EsBa +sBl ,A +^z ^x +[fsA# +o2y i4u i8l o6f o9m +o9B k ,2 +Z4 sjB x37 +[ T8 +$@ $_ +*52 Y4 +Y5 x64 .4 +T6 T7 TA +x23*54 +$n -0 *20 +Z4Y3 +-3 i5/ +R8 } x51 +o0J D2 +$@ $, +$@ $/ +*A8 '9 Y1 +$@ $+ +swBx83 +$@ $% +.9*6Bi9> +$f*16sOm +^z ^a +[ i41 +-7 sea +i37 i41 i59 +$| $@ +s/x +s/H +o0z i5a o3i i6d o2l +$r *34 +x45 +5 u +z2 ] -7 +*40 ,5 +z1 ,4 *40 +sCd ^b +-4 C Y1 +*17 $K +o1J +5 +xA5 $2 +o2w i0_ } +^CY2l +{x02^v +*78x8Bx7B +*74 *43 +s{Ri3X +x23 ,6 y1 +xB8x19 +T1 ,A +i3v*24 +'8 D1 +oB9 $H +sJR $y +o0d $9 D1 $5 i3b +*68 +3 +sxuo2dx32 +r s7H Y4 +x32 -4 p4 ++6 -7 } +R6 ^c +x32 i2g +*32 x92 +shv [ +i2s ^l +D5 TA [ ++1 x42 +t i4, +*41x52o70 +RA*47 +sY*$OsqF +x68 p1 +x32 i2f +o56xA4 +-8 Y2 +s6T *67 +z2p1smj +s0G +x0A l +x52 ,3 +s06 T6 +.8 C +s4Z [ +*53x8B +^g x45 +Z5 spP ++0Z4 +x32 *20 +o1y -4 +,3 sxz +sD1 c Z3 +K p4 s1x +x12 i5T +*35x68 +R4 x57 +i46 *35 +Z4 z1 x53 +] +0 K +i31 R4 L9 +x06 R1 +x01 o2G C +o4@ x56 Z3 +o1q si9 D3 o72 o6l +i42 x62 +} $m x61 +i3b +2 +k*B1u +,4}x38 +x32o56q +*5Asd8 +T0 T8 TB TA +{^P +^j -2 +*76 '7 +$Y [ $N +$j $u i49 +i4c *49 +*08 o2D +u x35 Z1 +sd&Y4 +p5y1x12 +o5f *06 +*04 o6z +*53sD#t +f *93 x48 +$+ ,A +*03 ^z } +y1 .9 +p1 x05 x94 +o0c o41 o1j o2q sg2 +y3r,5 +$Z *41 r +spG +r^3 +D6 sbk +^0 $6 sm0 so0 ,6 +s[b]z4 +^1s6f*16 +[T6*83 +x36 +1 +o44*56 +i12 R8 o9V +Z3 *37 T8 +^k -6 +$= $[ +*9B$RxA7 +$! d ] +*45 *34 +*45 *31 +*14ds6, +i50x56 +$= $& +$= $% +*23'B +i8T*03 +*20 $5 +o0i i32 $f sa1 o2w +*27 x15 f +o5( ] +i3@x29 +t y3 $1 ++0 Z4 +x31 ^5 +f +1 x37 +sla o1O +r R8 +i72 i80 iA1 i90 +o1p ^r +x43 $6 Y1 +s*ty2y1 +T3 T5 T6 TA +x81xA5 +E [ $. +*37*20 +o1d +6 +r $m -7 +q sbB +lshzz4 +o58 i3_ +T7 i2r x43 +o2y i4u o6f i8l o9m +T6 *43 +^' z2 +Z4*83 +x46 i3A +$h x52 +s%&Y1+3 +^? i0? +,7 $) +7 +oBE t +x04 z5 +i11 R3 L1 +x82 stC +f *57 +s^]^mscq +x17 $. +*56 i7X +s@u +*56 i7, +x26 '6 +o4m t +oB c +x85 *53 +{ { r +x31 ^x +i0vDBs4D +p2*6Bu +$jz1[ +-1xB7 +o0z i5a i6d o2l o3i +o0b *30 +x31 ^a +i52 i71 i60 i82 +-0 se@ +C +A +i2r s5t +$/ xA5 +lo3u*A2 +spgi7hoAN +z1 *84 +*24-A*B3 +*01 x51 ] +x8Ai9) +Z1R9 +} sRm +z1 .4 +x61 i3- +'8 ] $# +*43 C +$! s6Z +qsrsz4 +y3 i3. +i65 ] +^7 i66 ,7 o2m +^s ^a ^e ^l +o1u x54 +*B6$D +x9Ai96 +y2 o2k p4 +,2 x65 +o77 *41 $. +i11 i29 i41 i39 +^m ] +y5 *74 x75 +^J C +s{_T6sB< +o19 .0 +o43 *27 ,7 +[ K sl9 +Y2 o36 +D3*71R9 +[ sl9 K +o0x i11 i20 i41 i6f +*91so) +^e ^e ^r ^g ^a +c x92 *43 +Y2 R9 +^i o4o +i7/ *97 +y3*14 +'A^bY2 +o2f s._ +qx85D8 +Z5 Y3 +o81 x08 +c T2 T6 T8 +c R3 +*17*76 +$. $i $o +o7O*81 +D6 ^d +xA8 o9y ++2d*42 +x57 *02 d +r ^x +.4 ^p +^3 i5t +*74*50K +o93 K +t $[ +*61xA2s8N +*10 *25 +t $> +*A9x54 +*A7li0n +i5c L6 R1 +y1 K $y +*94i0n,B ++B$7*8A +x89i5*q +i7a +8 +*41 o2z u +i76 R6 R8 +s3E *18 +o5I -4 +T5 TA T9 T6 +$p x42 +Cx19 +l { $7 +x51 $d +o3W Y3 T3 +T3 T8 T9 T6 +c sSa +$c*53 +fx37xB9 +$Z ^V +i5< [ +q *51 +k x42 x62 +*24C +T0 TA TB T8 +i6Ky4 +'5 y4 [ +rx73 +E x93 Z2 +z5 Z2 x12 +Ky5 +} E { +,4 Z2 +c T9 i9- +r$cs\4 +*3Ax12 +$Y $g +x41 o52 +s$**52 +T6 TB TA T7 +^y ^a ^j +z2x07*48 +*63 stD +z1 o8H +*B7xA7^6 +^Y *35 L5 +*25 ^- +o3qs{D +T3Z4 +s`"*15 +o77 $. *41 +sT]iA4^s +-0+9se@ +x32 ^T -1 +^@ s80 +z5 seS 'A +i1e +5 [ +$e +A +{ *64 +-3sh^ +p1 o4p +oBu xA1 +T2 T9 T4 T6 +E .7 *32 +y5 x02 x75 +o1v +7 *81 +c i48 +x64sLix0B +s)ZsBr*43 +i3c i5i i4h +$) o5m +kx63-B +] x02 q +xB3 s0s +p2*57 +c *86 *B6 +LA x13 +s!]tD7 +c *43 x92 +Z2 sWx +E s5y +T2 T9 T4 T5 +y2 *19 +szn k +x16 sb9 D4 +,BsXz*73 +lEy4 +D1p4 +s{Ss.`i2k +iA4 ^C +D9 x69 $p +D5 o34 +xA6s>Bi6# +k D5 o4_ +i52 i60 i80 i71 +sjzs*e-7 +$1 o6a +-2 *54 +*3B ] +xA9s|)iBc +T5 *69 +-6 o58 +o1v *81 +7 +y5 ,B +s1I *26 +L8 x31 +$z *89 +^f D9 +^q -7 .6 +*45 x94 T4 +T8 *65 +x05 ^3 +x71 ^_ +se` *75 +x02 i2^ +x57R8*A1 +scz k +x04 o85 DA +z1 $0 *24 +x48 $u +T4 *63 +o4a $! +s@0 *02 +x92*37 +$N *07 +s.e.AK +syg o2_ +x78Z3 +.5sq3 +doAnxB8 +l o01 x82 +*20*56 +*93xA3^f +*57 T5 D3 +T4Co1h +*51 x71 +$- x75 +x07 R7 +*06o0HsPu +sxG +^z x61 +x08 -0 +D2 Y2 +i3n +2 +Z1 iB2 +r D3 i01 +^s o3R +x56 i78 +x48 ^W +i7c x12 +x12 i4E +R7 skj K +^J *78 +oAs*13 +o63 +3 +^9 se6 o6f su3 $d +p5D8LA +-4 *60 T6 +x93 o3s +xA1 $+ +z5 i0# +^s ,7 +i60p5 +^l x35 +x45 z2 x32 +x52 i2v +s4T c +*72 o7m +s_1 +Y2x35 ++5 *31 +x17 x01 ^j +T0 TA TB T9 +*63*B3stD +c o5O +i2u}x26 +{s8m +o5t o3m ] +o4l +2 +dD7 +^'*B8+B +z2*90^v +}$Bs*y +o2Z ^g +i3K l st1 +-6 +B E +^*T0 +Z1 i48 o0q +i3_ *84 +y3 -0 +RBxB9i4b +x37 o3a +Z5s7$ +x91i8q +s${*04 +x23 Y1 o4w +*A7.6 +Y4 x04 +] $; [ +.5x98 +D8x18$O +Y2 k D4 +T3x5BK +x6Bx57p4 +o0b -4 +T0 TA TB T4 +$F $D +$F $A +iAf $b +x84^r +sc?s_/ +x32 o1u +R0 +3 t +x32x72*B2 +i6U o5e +z2s@v +o1O E i7u +Y4*6B +i8F sF4 { +T7x53o5d +x63s71] +D2 $g +.6fz1 +iAZ x26 T3 +i5n '9 +]^' +T5 T2 T1 +T5 T2 T4 +o0z i6a o72 o4n o53 +CY2 +i68 o75 +$2 *7A T6 +*6AspK +i54 T7 x86 +{*20x4B +*30 x56 +$2 z4 +Z5 d x6B +o4i *23 +T4 T8 T7 TB +]o0Esy} +sdP +l $. $g $h +$> $& +$> $! +-8*67 +x41 soi +,Bx05 +x47 -2 y3 +$' $' +i0r t LA +x8Bx25 +o3c -6 ++7 ^, +i9u*75 +$"x79*9A +$; *01 +i9s iA6 +x8B [ x53 +i3oy2 +y3'7Y4 +sy1 *25 +Es3RiAU +K Y3 x51 +*42i0e +sM@x58i9o +sr, D3 +*46 *76 +D1 i0l +qs3|z2 +x07 shv +Z1 $> +o3m ] +d E sBj +i02 i21 i31 i10 +xA6*A6x53 +i3I c s.r +*34 p1 } +sBe k +y5*90 +o8?s/a +] smb +*34 ^m ^, +o1e r +c T8 T2 T4 +c T8 T2 T6 +f *06 x13 +sd9 +i1r i3s i2e +k '6 l +RBD5*34 +R1o7T +sd0 ++3p2s1' +$. $* +^rZ5 +^zspIf +*54*31 +s{%'A +Ex78 +T8 *73 x43 +oA;x68sw[ +x41*23 +.9 o5- +z1 x42 $Q ++5x59 +i1. i3. i5. $. i7. +,8 saO +o6N r +r } *42 +-4 T6 +dx54*19 +L5 +5 +D1s\] +*63xB9Y3 +*95 x26 +sc' +x05 sk. +^t *82 +T4 xA6 Z1 +xB2 iBg +.5 Y1 *36 +i51 i71 i63 +y1+1 +x3B*43 +{ Z1 x05 +x72 i9! +o23 x41 +o6# x06 +Y2 iAf +s$csW7,6 +sCM *32 +$Msi7 +x09 z5 +x01 sre +f x37 +1 +o81 y3 +-9 +B +*05 '5 +z5z5y3 +x08 p4 +o61 [ +o53 E +K i9$ +$usR# +o0b +3 +^6sP7 +d$c*72 +o0p i2k se9 i4i o85 +p3xA1 +*24 z2 +T3 DB +$@ o02 ++6 T7 +i32 R5 L5 +*A8x41Z3 +r o3Y +o9> p5 syk +^S D6 x2A +x61 *34 D7 +i0rY1 +E iB7 +o3v o2a +$t,6x28 +l $. $g $n +*05Y2*71 +i5 y2 +sb0 +x3Ao4ii7! +f*31 +o7m *61 +o5Z ] +$j s1T +^o ^g ^u ^h +u x32 k +x94 o8n +$U [ +R3 saS +spS +^g *31 ^$ +x87 o65 +z4 Z4 +Y3 .0 +Z1 xA2 x17 +T7*81*78 +o5r *94 +Y3+5*18 +x03 ^2 y1 +^"*73 +i4,c*83 +T9 y3 +T9 y4 +x06$3*86 +K x24 +i5o r [ +*43x02 +T0 T2 TB T3 +T2 TC T3 T4 +D0 t x36 +i6a i82 i7n +o9a -8 +L6 c *87 +r i01 *35 +o0N y2 l +L5 x65 $N +i7x o8G +s/J,4 +z2 'A +o5t K +o9&x35 +o4j *58 +x1B$| +s/? +^b -5 s9l +o0b o63 +o5FZ4^R +o4xDA +x53 ,5 D7 +x04 'B +Y4 xB2 T0 +*35y3u +Y4 *9B +x03 x21 +] i92 +*34 *32 ,6 +.0 o4e +x18iB=^b +o2k o4j +x41 i0j *83 +xA1 *B9 +sa@ T2 +$. $b $n +sW< +x37.A +o7r ^O +o8( [ +T9 TB +i4zsxQ +*B1x04 +E $T +^d*ABT9 +s8& $k +T8 R7 +x98sg7 +i5e +7 +o1t .0 +*67 o13 D4 +slO x32 +o0e Z3 +,5 +0 +sd& i0c +[+8 +xB2 -5 x75 +*13x3Ai97 +i9c o7K ] +uy4 +seo sd- +$,s-, +*A8+4'9 +]*B5saz +*A2*57sH% +x03 oB6 p2 +l $. $g $l +i41 i63 i52 i74 +T2 T3 TA T5 +sm`sPQ+3 +l$.t +*36iA? +f x65 $2 +i66 *63 ] +-2 [ $3 +x06 *97 +Z1 L6 -2 +*4B 'A +i1l x32 +d*27 +x94iB4 +$gsb5 +sn7y3$4 +scm [ +,9 ,6 +*85 x13 +^o Z2 *10 +kx73 +i6r o5o +'G c +xB4-7 +i1_ *43 +] sjf +[ i30 +qT0 +z2 *67 C +C$e +Y2 $ i9m +x15 s0F +spc*20*6B +T0 TA TB T6 +y4 C +-7 $u +o7up1] ++7i8S +i9@ x04 +i7a i91 i82 +TBT6 +$0 -6 +i5[ T0 x56 +sBV*87*2B +'6 Z5 +p1 *BA +-6sB\ +o76 .6 +o36 +1 +^s siA +y2x49 +y2 xA4 +,3xB9Z1 +x05 o43 +^m sj. *42 +*27C*69 +o3C l +-9 x18 +Z5 xA6 +x49p4x6A +i14 i25 +Z3 stf +z1 *14 ++4 x63 +^3 *25 *13 +-B iAB +-5 i61 +y1cR9 +T1 i0* +i6y i71 i80 +^_ D7 +s8&s\/$k +*B1*71 +,8 $/ +i81 iA1 i90 +x24 sr4 +i9/ *A7 +Z1sM{RA +o5k i6s +$6 K +i4i o5c +s9y Z1 +iF1 iG9 iH4 iI5 +y2 .4 +*4B.4} +$' k ,9 +x41i1s +$8 x28 +s'[i9( +o4@s[% +R5 '9 +R3 $r +x04 *54 +,4p5 +$y *12 +^c ^k i5w ] o3k +^| *12 +T0i7Uz2 +t ^M +su2 +RBc +sSd+2 +i5@$# +y2*52 +i3y ,6 +$+ x02 +Z2 o4a +i1o x32 +q x73 $9 +l}D8 +x0A^[ +[ o5k x71 +i62 i82 i70 i91 +D1 '6 -3 +x91 x04 +*23 Y2 +o0h l +^h *50 +*31 +5 +o0di8} +*32siz +x03 ^V +s'8x46 +x1Bo82 +t*69y3 +,3 o0n +*4BE ++B +0 +snqT6o9? +o7, -5 *64 +x54 t *01 +i32 i52 i41 +^a ^m ^l ^a +T4 -B +x45 C +tZ1$3 +x32 o3+ q +x04xB9 +s*}x57-8 +*20x76 +xA4 $n +saA *31 +L3}p4 +Y4 ^e +xA4 $$ +'7 c x01 +D2x19*24 +*08x89 +T2 x79 +*AB*29*31 +s6p i0g +i5a $a +] k ^o +i9c ] o7K +[ scR +i4 r +^n +7 +.3 sYt +i19 R0 R2 +saq y3 +s*Ux96 +^F o8w +*86x84t +T0 TA TB T7 ++1 y2 +sjisP)$* +x59 i3_ +shP +i1a sp6 o6s o32 $e +z2 l x65 +D3 $% +1 +x03 ^o +*A0 x38 $6 +r t Z3 +x03 ^s +ss!x4A +,Bx51 +s_N *71 +i7o '9 +i8-o1e +Z2 ,1 +z2*5A +^8 s0+ +iA? [ +x57,A^P +i9g $z +*24 ] *70 +d [ x73 +x21{ +o6u $n +k -0 +3 +^e ^p ^o ^d +i5r i3= +o1r T4 Z1 +i8< s4@ +s3t r +c $o $n $l $y +^xx79 +sdQ T3 +T1 T8 TB T2 +o8G oA2 +i0I ] +,3 x45 +T0*A3 +] ^e +s3b^ix94 +*51 +5 +x43 iAP ,3 +y2 *05 x61 +$!u*56 +*7A xB4 +x41^d +y1 i0, +i4& *16 +{o5t +i3r*65 +*06$y +^q i2w +sF=-1 +T8 Z2 +T8 Z1 +$) *73 +x47 i40 i55 +p5s;F ++4sfH*40 +sa1 -5 +o13 p1 +^0 $6 ,6 sm0 so0 +f ,A +s_^^S +-B $) +[ i5j +D7 *40 +dx21} +$^ L3 +D3 +1 $% +z3 ssz +i5a R1 R0 +x56D8xA5 +s.Ki6. +o2b o3s +ksrv +x02 $k k ++2*1B.5 +.8D8s2D +Ec +] $Y +s=v c +^B *39 +y5 x9A +o4a stY +-AiB.$i +$f shl +$6 x71 +] $< +] $; +L2 '5 i3d +ui2S +o7t x13 +x24 -0 L9 +o5l x98 +i4 -6 +-4x87 +i39 $6 x12 +,6x56 +r +0 x53 +x48 $- +s1m D6 +x32 i0n +i5a [ +y2 L9 +sc0 Z1 $? +x72 siS +o5m o7g D8 +{{x5B +T1 T8 TB T3 +i81 r +^T x58 +sq' '7 +o0U *56 +]s9c[ +x16 sn. +$@ $^ +^6 Z3 +i4f *87 +,2 *52 +E .5 +*04 Z3 +s9w +sao x73 +i3b R9 L9 +T3xA6 +oA. *84 +i61 i79 i96 i89 +i0U -7 +i32 R1 +i72 i91 i80 iA7 +i31 R4 R2 +i6w ,6 -0 +$@ $< +se3 T1 T4 +tx61*43 +i8p +3 +i5s -6 +xA1s'G +syP $m +L7 *02 +*71L8*41 +y1 *17 x12 +o2u x41 +s4_p4 +'A *54 +*32 T0 sb8 +T2 T3 TA T8 +i9ZD3 +*B5sNg +o4f D1 +*45 Y1 Y4 +x69 ^l c +o0p *62 +i1f R7 L7 +^4 so2 i2b o56 sa3 +D0 ] stp +x32 i0c +^G .B +x14 y2 ] +r x37 ^g +k iAA +sIdi7k +o4m '8 s37 +o4s i52 o7u i8t +sm ,3 +Z4y5 +^k u +C o3G +s& syk p5 +z2 su. +x09,6o86 +s1c R0 +i1a i3i i2v +z2 y1 x54 +'6 i4P +i3c*0B +$4 C x03 +o0s *35 +*06 $y +s@% K +5 +i36 L3 R6 +$ E -3 +t sLA D4 +x87$P +d xA6 *93 +o2m y2 +o4t o6b +p5 z4 *59 +o4q r +s.=*87 +$w { *49 +x82 o4E +{ oAJ +x21 o0d +[o9oi6I +d 'I l +^d ^n ^a ^s +^m *42 sj. +] iAY +x28+7 +i6! $! +x41i2.iA" +T4 TA T6 TB +x82 x42 +sW-x27 +s7e *04 *21 +i7Zs}bx98 +o3d *25 +sf/ $| +E s_S +*65 [ t +rx47o9N +.5 o6o +o1m Z2 +x0B{^r +K $A C +z4 ^y x28 +i2m,8 +x41 o3f +Y2 Y3 +dx57*8A +t .4 +K iBX +*57 ^x +^i*47t +*A7 x27 ^I +i1j ^k +*92{ +*42sOu +i59 L5 R0 +s1/ +snG *64 +$N x26 Y4 +z2 +4 +D1 s2b +x41 o6? +L5 y4 +*89 D5 *86 +c $1 $2 $3 $( +$R T2 +i7e R8 R9 +[ R2 Z1 +iA4 t +kx13R7 +x92s?$+B +'4 $m +T0 T8 T1 TA +i4l *32 +^N x48 C +^d ^i ^l ^o ^s +z5*10 +sB-^RsUi +Y3x69 +-2R8x17 +o46 *24 +$K { T4 +$k l +*72x32Y3 +c $0 $7 $3 +Z2 sft +i1o i3o i2t +{ -8 Y1 +x23 $z y4 +T2 T3 TA T9 +s;z*34 +o75$O +x03 Y4 +x54 L5 Z1 +o0b i37 o4e o14 o58 +iAF Y1 +xA2i5w +^h sgu ++1 { *50 +o0w +2 o4v o6p +-1 [ o3Z +s2;D1L5 +*0BxA8^D +*9B c -A +sx1*9B +o2x x52 +i1a i3i i2l +*14x28 +.3 *14 +x94 o64 +x43 Z3 y2 +i38 R5 L5 +R0 $n +^a x54 +skD $! +*32 +1 +,7oATD1 +.7o1e*02 +*A2sY. +$1 o4e +*12{*87 +$+p5 +^S xB3 +[ $2 x06 +*48qK +{*45s[0 +o1E } +u *64 +i1rx54*26 +[Y1x96 +x12Y2s5. +i9r iA6 +*63iA",0 +$@ *58 +*20 *34 +o6s -2 +iB`$l*19 +Y1o5t +i02 i21 i10 i31 +i02 i21 i10 i33 +Y1o5v*69 +o73 $t $v +^3 x57 +o2s -4 +o0e *01 D4 +y3 D5 Z1 +'9x51 +o1G *57 l +Y2 -5 *12 +i3d R6 L6 ++9T9i2p +D1xB3T7 +,8$D +y2 x81 *34 +*17i0ZskC +-2 Z4 +y1*07x58 +i4G Z1 ,4 +x32 +9 +i2r i4n i3o +o23 R3 +o0S $1 +snp -4 +.9.Bsa@ +u i3O { +x42 i3o ] +i4e*34 +Z2 x28 +Y2^j +o9p stE +*40 .5 +oAE,1 +'7i3h +i8fY2L9 +^- scy +x06 k +$=u +t o28 o4M +LAi39 ++4 sfH *40 +,5 i3k +^8 o7! +*24 o0l +^R oBy +o6& L7 +T6 o5y +*5Bx96 +o6( x74 +o3gi8wxB2 +*46 x12 +T9 x23 x51 +o7, ] +s^<*92 +$+ $< +o79 *36 +^i ^y +$+ $/ +T2 T5 T9 T7 +*B3o6, +x73 T6 .1 +i56 R3 L3 +r C '6 +T9z2 +i7e R9 R8 +^i ^l +x79i37 +*75 c o4h +C i8b +o0{ x17 +s6M K +l k *23 +Y3 +5 +*42*54x2B +,3x45 +i3a i5d i4s +o9z xB1 E +] { i2i +*24 o0k +o0z o2v +x4Bi3O +^y T5 +i17 R4 L1 +y3 D8 +3 +,2x48 +iB1 ] +o2g +6 +d*B5x65 +L6 *35 t +*87y3y2 +[ c skZ +x79xA3o1A +x15 z5 y1 +o0l i12 i3r i5a i7i +o2g +0 +o2v i3k ] +$5 x03 Y1 +x97sy5 +Z1 x62 Y3 +T2 TC TB +x21 o1u D3 +Z2i9*y2 +i6.p3 +smg^9 +T1 T7 T4 T8 +scz o1N +o33 K +q oBk +^C szx +o9S u ++5 o0y +s.D x62 +qKi9{ +l [ d +D1 o2f i5f i69 R7 +D2 y5 ++9*23 +^u ^g o2y +s!s st2 +x59 $9 +*73 o2f +i22 i30 i51 i40 +*74 $? +T7x36*45 +x48 '8 +x74 D9 +x61 +2 +1 +x74 D5 +c T0 *24 +C *07 +$2 y2 +Z2 o41 k +D6 o6Q R5 +[*26 +$W *03 +Y3 x02 t +T2 *4A +o1c o75 o69 o5d o3j +s@w$"o8K +z3Z5 +s)Mi0J +*B6 *89 +$1 *21 x02 +x16 Y2 +i7v i91 i8e +D8i6QxB3 +i5n i64 +x42 iAQ +x81 *8A +y2 s29 $F +*89u +sj2 *71 +x62 *08 +suV*36 +i0Z*A5 +o01 o1k +^1 o8k x95 +xB9x31R6 +] sgr +$z*B2D7 +x84sE(r +x78 $d +*57^m +q xAB +x78 $= +i2z t +*14 $b +T2 r +p5 +1 o2O +Y2 q x68 +D1.6 +s'.x92 +$7 C +o79 $G +*31 smb +*15 Z2 +i3s x35 sDb +i3e o0M +cspYY4 +i79 i91 i81 +s9H -5 +T3 T7 T5 TA +$M D3 +xB8 x19 +i77 o0m +z5 ^K x31 +p4Y4sfH +s0 x92 +-6 o4B +z1 *24 $0 +p4 .6 i71 +,3 *30 k +z1 o56 +i8* .7 +xABR9 +y2 $F s29 +k o49 +q*6A +*65sko +$A z4 +z1 $m } +s(lsNT ++8 o6S +x82 i79 +K x93 iBX +x57 *57 ^B +T4 T7 TC TD +o3d*A2 +i71 i97 i89 iA9 +sqco89x02 +o02 +1 +o0G ^I +o67 sxS +i0s x54 Z3 +o5q K +cxB6y1 +Z4 x97 +[ T3 ^D +*74x32 +x61 $i T2 +$lsM"slb +L3 i4; +s6C k +L0 x53 +DA T6 +.2 $o +^W*BA +x02 *27 *41 +*79i6k +x39 .3 E +x61 o4w +$u $i +sfm y2 +x43 y2 Z3 +i7,p2xA2 +^GlD8 +x63 $3 +y2o0" +p5*21Y1 +x67 z4 +y1 ,B x06 +-9 $q +*06x5A +^0 oA, +x29s5s +K oAZ +s%3+4 +y1 o4n +p2 x47 } +i3l x51 +slr *86 +$u $e +Y4+4*15 +i7, y5 +o8gx21$t +^E *59 +o67 y3 +s8t D6 +o2C s8J +*73 L5 +sbK -0 +$9 $1 $9 $! +r i3a +r i3n +$G sG_ o9n +z2o1E +o3Nx64 +s0b .4 +$i *36 +^e ^s ^r ^e ^v +L0 x51 +s9c oBE +x84 o0T +x23 y3 Y1 +^f z1 +*1B.5$y +$< $* +i7!o7) +i4*s/p +x51 *45 ++A $_ +sd&i0c +t^\ +^d T9 +^q TA +i12 L1 R8 +} x61 $m +sw; +] $_ L6 +*96T3 +*45i4U +Z2 $9 k +Y3 *A5 +T3 T4 TB TA +K*17y3 +-5 ^s +-5 ^v +,5 ] -5 +p4s2& +s +*41s89 +p5}*96 +s!q +o9#x91o6b +s5c y1 Y1 +$D iBx +Y3o0Ho6h +$u oBM +L2 t +s*G$t{ +x39 E .3 +x61 y3 *67 +*60x6A+3 +*36 ,2 +*19*07 +x52 R5 +o33 Y1 +o40 i13 +o2i x73 +o1;x0A +T4 T6 T9 T5 +*15 c Y2 +sd7+A*69 +p4x9BD9 +x81 i79 *A9 +^a p4 +x61 *02 ^1 +*24 $L +^7 i20 i38 o44 o16 +x61 o71 +T1 o30 +T4 T9 T7 TA +*51 -5 +swB x83 +$D x6A +se2 sc0 o59 o3f $4 +T6 -7 +sae -2 +^3 *35 +o0o i0d +.4 *35 +s/|sn9 +s6= d +*54 r +,6 -2 .1 +sqt +o3E *06 +*07 $g +oBboAzx8B +T3 i3& +r $u $p +Y4 $a +Y4 $b +*B5 xA1 +i12 L1 R6 +^Y r D1 +,1 ,5 +x45*03 +i3H i28 +s28 se( +i3d *71 +i3d *74 +i7o Z1 Z4 ++1 $a +skL l K +L3 i4k +x84D6x96 +x1A^m +scd $5 +scb x13 +$3 ^p +R8K +i8j y2 +x86 R8 +R8t +z3 x14 Z3 +*32x41sv[ +y1 *21 .9 +x04 ^^ +o0b i37 o58 o4e o14 +*37R1 +Y5 *13 x25 +$z o9l +,6 Z2 +s#Fi1ix64 +s5w i6Z ++BY5 +i4e [ +'B o8j +Y1$^ +^o se_ i7a o3i +^9 o7f ,6 o4e si4 +^o ,2 +A +i5I l $8 +i4& o7b +i7? '9 +oAP$- +x54 o55 +*5B x25 +p4 DA +o88 *87 +o04 $6 +i2z '8 +i18 L1 R4 +T3 T5 T7 TA +i7e i91 i8l +u s!1 +i3h x81 +x19slt +Y3s=R +o5l '9 +^k $z +sg9 si1 so0 +$4p5 +o2@TA*B8 +{ *20 s0z +i8# *84 x42 ++2 x72 ,3 +R0s+u +$i $f $y +i63 i80 i70 +T0 T3 T4 TB +$A u +-6 o11 +x72 i6j +*94 x05 +i2lu +^X *89 +x53 D7 ,5 +x94 x73 $; +p4 sA- +r *73 +x65 -3 +*72 ^o +d+0x73 +*70 -5 +T0 T3 T4 TA +D7o8R +z2 R1 +T3sbP +x57*07 +*21 *23 *41 +x59 ^A +T0 T7 T4 TB +i51*38 +^w x18 +o27 *45 +*54 *56 +x87 $Y +Y5 x78 ^Y +x41 o1e +y4 x43 i4n +x38 ^s +o0y ^d +*B2 +0 x15 +,8 $D +*16 *30 +q x82 *27 +^C i7j *37 +T4 T7 T8 TB +$J x68 +*96 Z1 +^o ^v ^l ^a ^s +x57 *76 +$ystP +r x14 p5 ++6y3 +^wx34 +soA +p4 sb. +x86 Z5 +*16 T3 +o2m s8E +'7 -6 o11 +s1F x03 +^k *81 +*31 siZ Y2 +o2z -7 +*32 sb8 T0 +*96+1i8D +i6k x02 +T8 z2 +o1d z1 +i62 i81 i70 +o2a $e +i50 o68 ++8 $7 +*48uo5B +o5f $1 +,4 ^1 +se3 si! ss$ +-3Y1 +$"xA4 +f *15 +^6s%} +sOQx64 +x82 ^e +o7.x27 +Y2 so* +o4. '6 +Z1iAP +i5j p2 +sdi Z2 +} ^l x32 +t*62 +o6e *20 ++8oBg +$& $? +o23 *02 +ko1fx6B +T1 TB T3 T8 +o07 Z2 -5 +i4r i6n i5i +*A5-9x43 +Y2 *12 +o0c o1j o41 sg2 o2q +$& $! +z3 K } +$& $_ +^V x48 +i04 .2 -4 +*20Y3} +x34x6A +E o7` +^k o69 .1 +o14 -3 +} u } +^G D5 +o6g *89 +x86sQPx41 +o7y ^! ++1*34scJ +-B iB6 +x38 Y5 +T1 TB T3 T7 +s[gx68o2+ +*10y2{ +*A7$y +Kx42 +Z5 D5 x75 +T1 T2 TC +Kscq +o92 i91 +x05 *01 +T3,A +r x12 d +o0p ,2 +-A o6N +-5x29p4 +s8&$- +r Y1 y1 +*02*13 +i1V DA +$5x25t +*63rxA3 +*97 xA3 +Ks0 x92 +r o1e +x54sQ< +d } D2 ++0 +2 ^1 +i3Ox84 +sYR +p4Y5sv- +{ oAq x23 +o1O i7u E +D6 ^^ ] +^r Z5 +i0m *63 z2 +i6n *40 +^g ,2 +y3p5s9* +T3 T8 TB +i45 ^6 +s\wi20 +oA[Z5z3 +i61 *37 +x34 ^w +T0 TB T8 T2 +rT8*50 +o8o Z2 +C $r +i3d } +p4^Kx25 +i5c R6 R7 +x54 f +x8AsfF +^e x48 +i1p *01 stz +o1c ^M +i14 R5 L1 +^1 *16 +$4 R0 +i13 i28 +D4 R4 Z2 +$w k *76 +*0B$li8| +Z3-7 +,3 ^6 +^K six +i4B *67 +sQ5p5x58 +i5v ] +o0w o3g +x94sx3*B0 +i76 R1 L1 +^kx19*41 +Z5iAYsvT +o7P*48o7f +^* ^^ ++4 i0t +Z2 *84 +i61 i79 i90 i89 +x97xA2 +s*2T7o0K +sb0 Y1 +$r Z2 +i5D *50 +-6 k sCe ++9oA)sk; +o5U y5 +.2 y4 +x74 o8U +xB7{D1 +K +6 o3e +i4i i6a i5t +x56sQPo8E +^F x38 +^t -7 +8 +,A x04 +i3u ssk +R9*76 +o1V u +s9Z [ +i6h i8r i7e +c$G +x87L9 +*97 x53 +i35 i34 i33 i32 i31 +*98 x63 +x93x04x91 +,5x57 +Z3 *A6 x27 +o9&i47 +x54 ^3 +x06 $3 +i4qy3Z2 +'A K +x72 K *31 +oBj x04 +svm l *13 +x03 E } +] c y2 +$b $a $g $s +$vo8C +*34Y4 +$/ *25 +r y1 Y1 +i44 '8 +x13 i8M +$b x0B s3G +p1i47 +i28 Z2 *35 +.6x65 +T1 T5 T6 TB +T4 TA T5 T9 +$v x38 +$2^B +] *B6 x31 +i1. i3. i5. i7. $. +*60 x84 +D6 x16 l +p5 o2O +1 +y3 x81 +sj]xA5 +.3 o13 ++7 s0s R5 ++0 D6 x73 +su> +-6 u D9 +x93 $e +x59 x72 K +o7y x05 +$o x47 +$Y -9 +T6sRJx39 +$B *96 *98 +*13 *87 +-5iA. +r -7 $m +x51 x72 ] +i6b x02 +-7 *72 +x41 *3B +$- $] +$- $" +i33 oAe o7g $l +o2ws|L +$- $) +i33 L3 R8 +*B7p5x57 +p3*95z5 +o8(xB7 +s<+'B +*53 sn7 +i17 ] +Z3,7z2 +E r i7! +^l ^e *7A +T5 $r +^r *20 +{ x65 +*21 Y5 k +[ Y5 x36 +[ Y5 x35 ++0 o3w +i33 L3 R4 +syb u +C xB2 +^y *39 +-2 Y1 +*23 $1 +i9B $d +^t ^i +tY2l +*74 *60 +[ sp@ +*72 *09 +i0O x48 s42 +Z1 i42 +o6! .5 +^b R8 +scHs%2x87 +T2 +1 +$Y s4# +.4 o68 +i4G ,4 Z1 +T1 T2 T5 T9 +t o4M o28 +$a ,6 +D2 L0 ++5 s3h +^i ^r ^a ^m +slf o5d +-5 y5 +-1svt ++0 o3z +*73*AB +$8 T2 +,5 i54 +y1 .9 *21 +T2 TC T3 T6 +*92i7dx93 +x14 c x19 +i80x02L8 +sFa D3 +^ex94 +-8 K t +o7/ *98 +x25 p3 +o6s ] u +o3P ,6 +i13 i24 +,B D2 +*B9 D1 +x82 i77 +xA5 x39 +i72 i92 i80 iA0 +^U $6 +o0i sa1 i32 $f o2w +L0 l '7 +p3 *60 +sQai6HY3 +szZ +szR +T7 R7 +*06 r +z3x65 +^l ^a ^o ^c +i01 i31 i19 i29 +x54 *01 t +{t*39 +*65 o6< +T5 i4e +i4os&Ds=d +$s $z +s0r +l ^Q D5 +p4s}pi5H +z5l +T2 TD TA T3 +o0c o2q o41 sg2 o1j +f x3B +Z4 stn +k o6m +[ T6 +q D9 x43 +K E $R +$; $' +Z5D5 +Y2 D4 k +y2*A9x08 +^8 z5 +c *05 +Y1$f +*67 Z1 +D9t +^fi1biAq +*81iB}.5 +Z5D9 +*49Kc +s/* K +x72 T4 +oApo6Rs]^ ++5 seS +sWm-4*78 +p1 o5g +Z5 x83 +oAa.4 +i2w ^q +s6^ scg +o0b i37 o14 o4e o58 +$. $l $v +$k *17 +.2 +0 +^A x98 +*A3z3shl +'8 ^b +o14 K k +*68p4x02 +x07 *10 +$9 ^l +o49 +2 +i5c R8 L8 +$/ $# +$3 *32 +o8q o0r +*17i3? +i1d R9 L9 +Z5LB.5 +s4` +s4o +xB5 T7 +suU$] +x54 y2 +i6z $O +u $5 $6 $7 +T0 T1 T6 T4 +oAw*12p3 +*17 i0Z +i5c K +$3 o21 +i5G*2AsGv +i35 R1 R2 +y3 x6A +*29T2 +i6E xB1 +y1 i75 x8A +R7 $3 +,1 ^s +Z5 Z5 [ +E $. [ +T0 TA T6 T7 +i1pstz*01 +T7 ] shl +o0x i1p +i4L t +x31 $w o3x +f i90 +*70-7 +o0w o6p o4v +2 +^T scR +x23 o2y ] +sck x57 +i3s ] +D9 x81 $V +x53*1A +o0c o41 o1j sg2 o2q +*14i0c +^g *13 +^Ko8Zss{ +*65 t [ +r i51 +seIsL# +f x25 +iA{ x67 +y5Y4y2 +,5 d +-Bx95 +^Uo7^ +o35 x95 +} k Z2 +x64 *02 *A9 +i3I s.r c +z2 +1 x62 +o1r Z1 T4 +$, *57 +soV x37 ++5 ,4 s1S +x89i0az2 +p5 $r +x68p1 +.3y5xA8 +*74 o0y K +sj.x95*29 +R5x24 +-3 o12 ++8 $f +p2^# +c*59^' +x34 *02 +o40 D1 +*58[Y1 +Z2x53 +{*60 +iB!i0cd +siZR4y3 +z5qs%S +o0l y2 +$h l +x7Bx42 +o2clE +$0 set K +x24 x31 +.0 o3J ] +*23 $y +^N C x48 +^B x12 +*24 ^q +z1 x36 +o09]p3 +$0 p5 Y3 +o9x*B6 +o8# +9 +[ $K E +s6]oA&o2h +*40+A +'7*46 +RB^lx0A +-6E*B5 +^> i6u +i51 +4 +Ep5xB2 +CsdPd +Z2 shv +o0l +3 +i78 L4 +$qsn0 +iAgs'vo7O +^t ^i ^l +x57 Y5 +o4Y c ] +$o { ++1 i27 +Ct] +s6J l +'3^zx13 +o0j i1k +i72 R1 R2 +o23 o17 +Z5z5 +i2A { +x21 [ +$+x2B.7 +x03iA2*9B +^x ^z +iAk x61 +i16 sr8 $q i3i +R6*57 +xA2 +8 +^n -A +o4m s37 +x43 +8 +i6bx02 +^n ^u ^f +x61 xB3 +$ ,2 +T1 T2 T5 TA +*21kY5 +o6i x85 +xB4 oAX +s.}$,s+' +o0 t +sr@ +srE +srV +$9 x41 T0 +K E *38 +o78 Z2 t +x68 Y2 +E i4[ +x81 o1v +T0 *76 +o73*52 +T2 Y4 +^lsc)x9A +z5Y4u +qx97'7 +x3BY1*10 +o4W q +] x65 +^0 sm0 ,6 $6 so0 +x13 k +c *A7 +^r*5B +x2AoB1} +$6 $2 $6 $0 +.Ao5' +*06 o7Z +*80 +3 +L4 $0 +$z K +x63 o0A +sds +3 +$z iAl +x63 o0i +r x21 +i53 R1 L1 +o6;o8`.A +,7 +7 $) +o3u +4 *31 +^7 x68 $E +o3$ l +Cx47*15 +p1 o5k +o3* ,4 +x16 ^q y3 +o0k x32 +,4*58*8B +soJ Y2 +sFzslOx32 +o6s^h +E xB2 *53 +L8 } +sQ\i7j +r$6 +$!*57*A8 +i31 L1 L2 +[ i1P +x52 x62 +x89 T5 +s9K $! +^x o1i +^6 ,7 +x49$% +Y3 +5 *18 +o1B ^C +$- z2 +-Bz5} +sdz o2a +D9 s3- +*5Bx92i8p +i7# [ +T0 T3 T1 T7 +i7I t +o2j k +RAsD" +x62 o1! $1 +o7M l TA +o79 x82 +i6p x24 +*43 ^p +T3 T0 DB +-0 sei -0 +s{"o6{ +] shl +*34 sas +p3 l } +sid R0 k +z3 ^w +i3J t +^P x23 y3 +k*81 +} *60 +*45Y1Y4 +i3%spK +*A4*42 +i4zsPH +x72 ^` +^5 i8@ +l Z2 D0 +s}?x46 +q o5g x14 +D3 ^# +i8t i91 iA1 +q x14 +r smn +*36 $% +x82 *BA +s6ccZ1 +z3 *28 +Kss[ +i0l i2c i1u +o5! .4 +x63 *30 +} K k +x82T5 +q s8O +o32 sqB +*41 T5 +*41so#T5 +sR=o6u +^P'Ax2B +x51 K 'B +^7'BLA +T1 i25 +,2*6A +-6 E +B +t i5* +sS) +z2 i9e +x83 D1 $B +i8v *68 +s7E *47 +x13 o9L +T4 $G +o1a C [ +^k i5n +x03s}| +l*81sl7 +i0E *38 ++9 *56 +Y3 TB +^2 sv9 ^4 o60 +x91 +2 +$3 f +t oBM +i5+ DB *54 +x12 x28 +o1G l *57 +^ex48 +^9 se6 $d su3 o6f +*14 o2b +o3\^hsHP +x3AspF +o31 +0 ++2 $/ +x25 *79 +o5r i9$ +E x63 $8 +*74 K o0y +R6 -7 +*48x91 +i82 i90 iB2 iA0 +$h x32 *25 +Z4*75 +x74i8l +sXZ*32x83 +z2 *40 *39 +dRA +x38 +0 +Z1x46y1 +^BR7E +iA\sNju +x31x04 +.0 D3 +iB(x73o2w +sny-7x91 +x02 D4 +*37x26 +T5 o8l +c T2 T8 T6 +o3z x43 +o3z x42 +.2 -5 K +r *46 +$" D1 +Y1 -A ^J +^t ^i ^f +oBxs$7x32 +i3z -2 +i50 i72 i61 +i32 R8 L3 +T1 TB T9 T8 +R1 i03 +d C x39 +o5G *50 l +x39 y3 -9 +*12s36*80 +-6 o7e +$jK*25 ++5 o22 +i5K l +$ $& +o2r i3r i7o i9a +$0 $o +,5 -5 ] +*25] +i72 i80 iA2 i91 +$ $` +$ $_ +sat r +x06 Z5 +spoo9c +T5 ^z +i39 R2 R1 +*48 o4a o5A +*91o4n +o2sZ1 +[ o3p +{ i6s +*23uE +R7 x23 d +T4 D9 +stR *57 +ss'i34 +Z5 x03 l +$3*26 +T8 *9B +*B9 t +i71 i89 iA5 i99 +[ x46 +*63 L6 +s3!Y3sxZ +*8Ai64x69 +i2j x51 +'2 p2 +*70 D4 s9F +sq.d +[ q o4m +i2n i4e i3c +*31D8 +x0B p2 +xA3 ,8 +,2x3BxB4 +x41Y1*3B +{z3 +x24 $d +T1 T5 TA T8 +i2b x32 +i9Bo6t^m +sAb +sAz +i6pi8+*B4 +-6 *60 +'D c +x01 $n +T2 T9 T3 T5 +x41 o4Y -1 +*35 *78 c +$5 o9e +spT l ++5 o2z +y5 ] t +x25 .1 +oA_^O +$L } +i46 o33 +'8cs8( +T1 T5 TA T9 +,3 z4 x42 +sgu sbN +do5Mq +x24 $_ +Y2 ,7 ++4 i47 +Y2 ,9 +x32 *69 E +y1 R9 c +i9z*85Y5 +T2 TC T3 +^h s7_ +R4x12 +s%NsbRr +E x31 T2 +T2 T6 T9 T4 +^+*62D6 +$z L8 +T2 T3 TA TD +i32 R6 L3 +i15s0} +^m o4c +RAo68 +z2 x92 +*46iB5s?N +T9*B3 +] spG +xB8Z2 +*54s'\d +$$ R6 +c T8 T6 T2 +[ i3f -1 +$9 z1 s6U +sij +o0i $f o2w sa1 i32 +*10*83 +y2*20saE +p1i6c +s%2$F +$wi8o +*A8,8 +x37 i6M +x05s?4 +-0 +E +DAx1A +K -1 T1 +x52 D2 Y5 +D5.4 +oBSq*83 +$g z3 +*03 *57 +^s i6h +r TB x74 +s;/ +i1u $e $w o4t +TB *13 +i1e i4n +T1 T7 T3 TA +oBA r +{ x05 Z1 +sS$ Z3 +x41 *31 $u +xB1 $r +^"x05 +Y4T0xB2 +D5 i1- +x64 D9 +i82 i90 iA3 iB2 +^% s%p i5c +i34 R7 L7 +${ s6A +x42 x54 +^H sbS +$m $i $t $c $h +$} ${ +s#V +Z4 $r +i8e iA0 i91 +x94 $; x73 +y3x5B +p5x3Ao5e +se1 i32 sl7 st3 o75 +[ x37 x41 +$+ $? +*16x83*8A +r *21 *05 +*08{+0 +.0 y3 +$+ $) +Y2 *30 +s2j *34 +i33 o7g $l +y3x69 +o6j xA1 +,7s+v +$L C +l$d +c oB4 +Y2 *35 +x62 Y3 [ +s2P ^1 +*86o9)sS# +i11 R3 +saz x35 x23 +Y1$n +x02C +T1 T5 T9 TA +x12 i21 +T5 T4 T2 +i2z x14 o3U +}R0 +^= r +xA1 ^1 +c $d $u $n $k +Z2xA6 +xB2x87srv +Z1 i9O +x23 x25 +i2i *27 +K Z1 Z2 +L1 x42 +D5 ^i +*30 i03 +l *23 k +o18 p1 +*19 ^h +t +B o9l +sId i2s +l $. $c $k +x23 i5y +p5x92,5 +L1 x41 +Y1 E $7 +o0/ T1 +sV(fx9A +$l $l +$/*47 +i6wTB +x05x81L8 +T1 T7 T3 TB +i2l +0 +$r *60 +o8!o7v +soJ x64 +i6K y4 +c y5 +sm2 x62 ++4 Z3 +l i0s +*16 D5 +*56 +2 +y2 Y2 x63 +*A7x27^I ++As z$- +K C $A +*57 D6 +[ i4f +sb, +i8P sd2 +x84 ] Z5 +Z4 +6 +c se3 T1 +x37*14q +$R x79 +t o4n +*6A^[ +i51 o2y +f x52 +.8x86iA_ +t o4B +y4 E x67 +T0 T2 T5 T4 +o1. ] +c $. $z $a +$v d +o53 .2 +[ R5 k +[ x41 +$. $a $t +Y4 x41 K +sqk*B8 +Z4 +2 +*0Ai4 x64 +s7n i0k +z1*25*92 +x07 y3 Y3 +i01 i12 i3a i2M i4r +-7 *57 +c x54 +i59 R1 L1 +o0Z x6B +x96 t +x71 sx, +x12 u +i5d i7g i6o +sL%i6i*54 +x91 stk +x13 o3l +$* $^ +$* $] +i4o i6a i5n +,7 *75 +s9p k +s2L l o6W +o76 ^w +o5a -2 i60 o79 +-9 *01 x13 +s92 -8 +*80o9? +u'9s]t ++5 *53 +sRGZ1*26 +x13 o3x +T4 TB T7 +stwx78 +s7 x04 +Z2*27 ++7 Z1 swg +k *24 +sy% +i3oY2 +,1p1 +*97sv".2 +se2 $4 sc0 o3f o59 +C *64 +^9sXqs>d +q s8. +T6 o0$ +r *05 *21 +syN +syM +syS +$f+2 +xB7]x83 +$# $. +x21LAx51 +susx78 +x21 r +$# $! +$# $_ +x62 ] T0 +i14 $9 $3 ss6 i35 +*24Z2Y1 +*32 x83 +C ,2 +x7A c +$8 l z1 +^x T1 +o0d $9 D1 i3b $5 +*7B 'A +o5@ $3 +o4R l +$a^Y +[ xB5 T9 +*16 i2H +$M .B $n +L1 D2 +i5kx25 ++3 o6q spj +x87o82 +R6 ^p +T0 *62 L2 +i72 i90 i80 iA2 +x32 Z2 x35 +x18 i4y +x23 s61 +o1d D2 +r i30 *31 +*65T0z5 +*02 L3 +oAqkx94 +-4iAq +z1 ,3 *25 +*9A xB2 +i9Oy4D7 +[ T9 xB5 +o3q .2 +u f +*59 o8_ +E[$. +,6 sum ++4 x92 +^PoBI +$< o61 $u +x27q +i33 si6 $b i54 +f x28 ^p +x53 o7_ +sk&o4s*80 +C T7 Y1 +o0B +3 +D1 o2e +o33 ,2 +*45 i4U +$' *63 +D7 o13 +Z3*56Z1 +l $. $c $n +s3g +Z2 k o41 +^k ^n ^i ^m +x34 T0 q +-7smb +i8t *64 +i7o ^H +T0 ,9 z1 +$w$2s<& +*04 $Q +i3h i5n i4a +o0w sf4 +2 o4v o6p +*47 *63 +*04 $w +s%N$" +] t $X +Y2 *A7 +y1*40 +D5 Y5 +'8 Y2 +^4 t ^i +ss]Y2iAf +*21 *26 +i65 .4 +Y1o2s +x09 o0w x34 +Z3 x05 x94 +z1 *31 *46 +i0$*10x89 +o4c -6 +x53,5D7 +y1 c R9 +c smk +s5@ *26 +x02 y4 +k o0d +*06 o0H +^rx63 +z1s4dxA2 +o8+x6A +^h x45 +sT2s+B^3 +i7o i99 i81 +c sd1 +Y3 D7 +Y3 D6 +s.[,B,B +i31 R4 L7 +p2*32 +] Z3 +l $. $m $h +s0Y Y2 +]x5B +i6(*49*38 +x51i6so2l +o30 sGh +-6 ,2 +sa5 x62 +i1d x05 o2g +z2 C *67 +Z4 x0B y2 +i8n i91 iA0 +x73R9$x +T8s.+ +*56 *02 +s4V [ +Y5 x14 s7+ +*31 d +Z4 -4 +,3*A0x12 +d ^b +x15 -7 +i2% k +c se3 T3 +s*l T9 +'B ,9 +c i55 +'B ,7 +,2-0 +,6 i5d +o9r $E +x62^" +scD+7 +] i40 $1 +y1*B8p2 ++9 *03 x31 +p1Z3 +p5xB6+B +k ,5 .2 +R3 '4 ^z +k -3 +6 +x81 +A +y3 x62 E +s@A r +x14x3A} +o41 o0d +'7 o2c R5 +-3 y4 x75 +^JR6 +^kx49-6 +$B *98 +o3h -4 ] +$_ $^ +o1e -3 +s-bx45 +o5ps4B +$8 x46 z2 +,9DB +$_ $, +sl] +K i0b +l 'B $4 +.0.0,9 +Z4 x35 z4 +x72R1E +$_ $' +-5*53 +s9R -9 +$_ $; +o7r x01 +$Isgn +^e ^g ^d ^e +sl" +*96p4 +$6 o1h +x62 T8 Z1 +T4 T6 TB T8 +i7v D1 +Z2 iBZ +Csuy +sX +T1 Y5 x71 +i53 R4 L4 +C sTy ++4 *52 Z2 +$l swJ +s9z $$ +o8i ] +s'@*2A*76 +Y4 z1 x07 +L8ss$x57 +i5h i7r i6e +*48 x63 *20 +Y5 s+X t +D5 o7i p5 +R1 D7 +*76 $/ +,Bx49xA2 +t*23 +$2 +8 +x71 smd +^cl +^o ^h ^o ^m +$( u +*57^x*8A +^k ,7 +T2 T9 TB T8 +} s18 +*8B *53 +x37 $n +o4i +2 +s/z -5 +-5iB;o5c +x08o0t,0 +x02 sar +z4 *36 +i22 $H x45 +D2 *70 +D6 ] ^^ +*87 $2 +x18 sn5 +^k *96 +^) i8c +sSvsi9 +s+= +o0z k +s+F +L6 +6 '9 +R3 l ^p +*26s75 +r x51 ^4 +iBM *35 +x92 c $o +qY4x97 +*02 *90 +x64 $7 +$od] +x05y3 +o9fo9s +^k *52 x12 +i62 i70 i91 i82 +$l o8- +o4N .5 +$5 x62 +*79 $- +*58x59R3 +$# $7 +i0= $1 +o1o *32 +l $. $m $v +o7a+5x52 +o4ly5 +*B4$> +.1 o8! +z4 s0D +x65 i8Q +x92 $o c +.2 z2 ] +y1 x91 +^4 ] +iB/s6' +^g*84 +*37y3 +x62 T0 ] +z1 o7g +o2v -6 ++2Z5s2` +o2v -0 +x94sFR*23 +i80 x02 L8 +DBi6Ox3A +*67s+k,A +iB, { +$@Z3x84 +iB'D9 +o2v -3 +*39*35 +*65-7.6 +i7^x7Bp3 +[ *67 Z2 +.2 p2 x76 +z1 i2R +sx[ d x98 +Kti8{ +i9k iAs +*07 o0k +x67 Y2 +y3 x41 r +x57 y5 +x2Bs&;'7 +*25Z4 +i4v o4i +s7D x12 +x35r*B6 +^9 o6f se6 $d su3 +x34 x94 +y5 -0 +o2c o7% +oAd^# +^g +A sg* +i5< *30 +*86 ^P +o9C +3 +o9'+2 +$o*14iBY +s_+o8$ +i3Z D7 l +o4no7k +$t ,6 +] o5q o2y +,2 set +i1kx35 +Z5-0 +RB x02 +*65x03Y3 +xA5y1 +T1 T5 TA T2 +*41 $v +x12s7z{ +^g*8A +i5+ *54 DB +.8.9 +*26Y1 +Z3 i1a +o09 ] p3 +^A *54 u +'4 Z5 +i1h Z1 x51 +*32 i12 +i1a o6s o32 sp6 $e +li2t +i4_*B6 +*69,8 +R7*38o3y +*14 Z1 +i9N *56 +*71*63$y +$0 oA1 +Y2 *68 +*76sqS +s$y i1H +$! *57 +x96 ^| +C y3 +o2u [ *20 +o1q u +R9 R4 +x97 T0 +-9sQU +*AB-8 +i52 i72 i60 i89 +] u o42 +Z1 z2 D7 +oAMsg8 +i18 Z2 +c $1 $2 $3 $) +x05,0Z4 +k x43 x9A +$n x94 +^@s%w +i12 i23 +^q Z1 +x0BsB9y2 +Y5D0Y5 +l $. $m $w +z2o0noB3 +'8 L2 +x5B*30 +L2 o7a +*25u +Z3 T8 *37 +i2a i4e i3v +z2 ^I +Z5 o6m +$]sw>*90 +x76 i5L +$#o9l +,3 siz +i32 i40 i61 i52 +^b ^u ^h +$a Z5 Z4 +l x61 o0H +usmV*78 +K iAf +x27 E +x41 ^4 +$Iy1Y4 +x67x54 +o9!x64 +$2 *24 +q o0s +i7v x91 +o0= r +*35 o3( +-0 o49 +*42 [ y2 +x24 o3Y +seo *54 +x4BxB3 +$% $? +T1 T2 T4 TC +$% $( +$% $. +sxu x32 o2d +o8s i66 +^z o3a o6u o75 +$% $$ +p2 ] x9A +T8 T5 T1 +y1 i1= +*10 z2 +iAR D3 +] L6 $_ +Y2*12u +o5e o6x +T1 TB T7 T5 +i02 i20 i10 i37 +z5,9y5 +C-7xA1 +sub x72 +f *53 o2e +^0 ,6 so0 $6 sm0 +Y1 $@ x74 +*14 o0z +TA RA +{T8 +o41 x52 +d xB1 +x42 q o1f +TB x71 +sCVr +x92 i4t +u*65 +*64y2 +s0I ,6 +*21 k Y5 +u $+ +T1 T2 T4 TA +ss$ T1 ++8 *14 +i03 iA4 +$Ws^2 +*03 '9 +^B Z5 ++8 *19 +s4V $g +x73x97y1 +c x32 +9 +T4p1*9B +i8ei3p +c $8 $5 $7 +x39D3sA6 +i17 R7 L1 +x93o0o +*23 x86 +p1i5o +^9Ex3A +x36 { z4 +y1^u +$ $~ +*7B'A +] spH [ +l o34 o53 +,5.3x24 +x05 $5 +o5o ,6 +*61 ,3 +x17 $o +-AtC +o07 D2 *56 +*50 Z4 x4B +C ^X $X +*23*5B +i62 i82 i71 +i7U z2 +^ x78scp +.3 *26 +,8 i0n +T9 *90 +i2s i3s i4w +sy] D0 +x39x43 +oA- { +o6v x82 +sjo$? +L6 x06 +^% *12 +R8 iAG +} o14 +l $. $m $y +q DA +T5 ^T ++8y4*40 +R4 o54 +K d u +z1 s9Z +x31 ^2 +T1 T7 T5 TB +i2m *35 +oAl { +o1P -3 c +$o $r $a +s%^D2r +i46 i36 +s_[Y3s'z +xB6T7x91 +*40 o0r p2 +s@) +scR x95 +se3 T4 T1 +C $X ^X +s13 K +o8qq*93 +y3 x73 c +i0O s42 x48 +*34 o42 +f T1 xB4 +*58 x26 +.0 ] o3J +slJ -7 +o13 i62 +x31 } y1 +T4x25 +sAB*53p5 +*74Z2 +[ $7 o4j +{ y3 D8 +.1^t*31 +z2*1A +ssN $J +xA2o8u +i11 i29 i43 i39 +$l p4 $e +oA { +} s0G +$"s7* +sfM T0 +*05 x57 +C ^n +s3u $5 +i4o i52 o6a o8h +o5H l d +$i x62 *51 +slLso@ +x01 z4 ++5 o4p +y3 $+ x74 +o9^p3 +T1 o0w +*46x72TB +*25 Z4 +i8e i9v iAe +*34 o4u +R1x95 +x84oA9 +^k[[ +Y1 *41 +i42 i60 i50 i73 +i70 i89 +i9I^Z +i42 i60 i50 i79 +saX x09 +c T8 T4 T2 +Y1 *46 +i1C D2 { +ssyp5$| +,8s{h*34 +]$j +i8'*64 +ss& +y4 +8 +l $. $m $z +*52 ,4 +x9BxB8^2 +o4y *64 +o3B x92 k +Y1 [ +4 +.6xA4$L +x61 p1 +c } *85 +$s *97 +iF; +{ o1m +x43 y3 k +y2 $f +{ o1e +o1AC +$, $+ +z5y3 +RBDA +*27 x07 Z2 +$, $! +y2 $F +sF4,5*87 +x21 o6n +$ko7.+7 +^` x08 +$, $? +*A9 E s5q +T4 $( +kY3 +$3 L0 +c T2 T8 T4 +*74 x05 ^y +x75 [ +$w i0q +y3 skn +z3 x4B t +,3 '9 +Z4'A +s;m+B +i72Kx6B +i7d *50 +^b z3 +sy7xB2 +[Y2*43 +o2e D7 +$& i5w +p3 $1 +x7BsB6^x +t o3E ++A o7g 'B +o2e D8 +-7-6 +sa, +sa> +x92 L9 +sa4 R2 +x34 i5] z4 +[ o8/ +s3$ .3 o4e +i7h x03 +oBr E +x02 x6A +Z5 x7A +^e x94 +i8TZ1i6n +^O *91 x97 +x47 Z2 o4e +i9+ { +o6| Y2 +*0A-7x67 +Z4 C +z1 o6k +x01 l $9 +*47 D6 +[Z5 +u o2$ +T0 T1 T3 TC +^E ^E +$j i49 $u +p5 .0 +c T4 T8 T2 +*86 t x84 +.4y2iBr +i34 R5 R4 +[ L1 +x01 D5 k +i0c i2a i1h +E o5P +C *14 +*40 R0 +o3i i65 +y2 .4 ] +.8 .6 +EDB +x73 syN +*86 x84 t +x13^z +o2rs{s +]{] +q $w +$- L7 +k *56 -3 +Z2 x03 z2 +^B R3 +o4& $8 +E *32 .7 +*61 ,5 +x5Bi2y +$5$G +$B $E +y3oBk +T1 TB T7 T3 +o4q o2a +d*B1 +o17x1Bsn) +s8L x42 +x43 ,3 iAP +[ R3 +x52 $e +oB= x74 +x04*54 +Y5 *19 x04 +ser*8A*32 +r K ^0 +spW l +^c *34 +T2 T8 TB T9 +*32 x37 t +] *79 x52 +x82*54*37 +i7b } y2 +x42 ^3 +sg3s|0sIu +sL5*03 +x61 $v +4 ++A oBS +$e ^3 +o2dx9B +T4s6> +'9 $x +i9ZY4x51 +'9 $& +s[^x8B +T1 x27 d +i17 $2 +R0 t +3 +T1 T4 T9 T8 +{ Y4 iBD +r $o $i $d +Y1 [ +xA4 D4 +*13 i9* x37 +[ D3 R0 +i4y i6s i89 $1 o97 +s\yEsn2 +x83 i14 +^1 *74 +i5c*8A +x17 Z3 +[T0-0 +C z1 '8 +i9P *43 +*50sX4f +x36 z3 +i70 i85 +o6fse! +oBM x03 +*86 x8B +i4hi2i +o59*98 +$? .9 +y4 *90 '9 +*9A*32 +s"PY3 +*25 syA +x35 s0_ +-3 z3 +i4b z1 +$^sLU +o5k o3n +K i5c +^n ^i ^k ^a +^w .3 +x78 -1 +K sBR L7 +*31 Y2 siZ +x45 u +5 +s?ci18*B4 +i43 i61 i52 +i69 D1 +$5 d ] +D5 p1 +Z1 i6b x14 +x83oB=sdn +,2sLe*65 +K i5w +R2 *56 +i9s iA1 iB1 +y3 *10 +$9 $0 $5 $! +Y5 s7+ x14 +i1e i3r i2a +^k si3 $3 o6d +2 +u DB +D4 T6 +Z1 o3a o4n +sHr ] +^0 i36 so5 i46 o50 +T2*B2 +xA4xBA +i0A R4 +i2a i3t i4h +i4= *78 +sJUZ4x3A +y5 } x04 +CxB3x48 +^fx62o0g +*0B^}E +i71 i89 iA1 i98 +*18k +y4 x7B +i7XZ5z3 ++5s+? +*24 c +o1Wo0bt +R1 x64 +sBd*02s%8 +-2 x54 $h +Y4slx +D7 *05 L2 +o1a*03 +Y4 x62 +-2 *31 sk0 +t^L$' +z2 o0p +T0 T3 T8 TD +R1 -7 +R3 x43 +*26*9A +o7/,6sL! +sk_}x54 +,1 d +*8A oB3 +i30 ,4 +T1 T5 TA T3 ++B $E +x49 '8 +-3 z2 +s2# x14 +s9I *50 +'7 $; +i10 i28 +'7 $> +p1 sy9 +*73 ^B +Z1x51 +x28-1 +Y2 x24 +z4 x1B q +*13 *45 R1 +xB3,0Z2 +-6 +1 +up3 +L5 T3 +.0 *76 Y1 +,Ax75x24 +^a +4 +*07 *15 +K o8$ +K Z2 Z1 +'A $D +-7 *32 +x24 *72 +K o8o +T2 T8 TB T3 +*61 $i +i02 i10 i31 i21 +o8/ i5a +lx54*BA +o1P c -3 +x95q] +x14 ] y2 +r ^+ +f { x18 +*65 { [ +$Q x31 T0 +*75T7 +i27 *16 K ++4 ,6 +D7 o3y +[ r D0 +x12R9 +dx1AsKA +o35 } +sB4Y3 +i6l ] +*B6x38o7t +y4*08 +suk +z5Z5 +s#L +i64 *04 +x85 C +i10 i21 +*20 o33 +*32 k +T0 T3 T8 TB +i4a i6l i5e +x05s]o +x65 $j +i04 i10 +s'1i0p$e +i04 i16 +} x81 L0 +x71 R6 +T1sIZ$M +*5B*43 +x7A +0 +[ y2 x81 +x07 ^1 +C *9B +$* +0 +D7 i5i +C *97 +o3N x72 *47 +xB4x32*63 +x63 ] s71 +T1 T4 T9 T5 +} $} i7s +i8m iAn i9a +LA $t +^Hz2 +*47*70TB +Z2 sem +^r^P +iD1 iE2 iF3 iG4 iH5 +x02 *34 Y1 +x14 '7 +L7 Y2 +p1 s1? +o8B +5 +i6= y2 +$> s3b +*48 o5A o4a +.0 Y1 s6F +^p ^i ^r ^t +Y2 ,A +z5 'A +y2 x34 ,3 +y5 -5 x74 +K *38 E +x06 x78 x09 +s7L ] +'A o48 +o6f [ { +Y1z3$j +LAp5 +c T2 T4 T8 +Ei0e +i2a i4g i3n +i7n i9s i8e +*45 T4 x94 +x41 -1 o4Y +D3*8Bi43 +o2g *46 +t Y1 x42 +smt -7 +*35C +i8x D9 ++4 *40 sfH +y1p4 +o0c o41 sg2 o2q o1j +c si1 d +*A8^}} +rsf*$/ +z1 *46 *31 +x35 ^T +1 +xB6TBs(B +E x21 *21 +s6I +y4 ,8 +*21 +1 +^k $3 +2 si3 o6d +[ } ^t +iB9 K +^` E ] +s6% +x42 ] i3o +] o4o $z +Z1 x59 y4 +sdk soe +DA^5x41 +s V^] +r ^0 K +D1 o3y +2 i61 +o0f o2c +-4 .5 +T0 T8 T2 TB +*38 x23 .4 +sBS *75 +x93 oAU +D3seAz1 +o1q D3 si9 o72 o6l +s5n *52 E ++8s}$u +,8 ^2 +i5/ x93 x86 +y5 E x38 +s.ps"Lx19 +s!asb8*76 +i5F x31 +} *7B z2 +^n *42 Z2 +$S ^E +x13[^2 +-9 $r +*A8] +s_N o8h +D9 $V x81 +x04 D6 +i25 x61 +T0 T1 TA T7 +srT x03 +.Bo1Psp{ +$8 x03 +*09i9U +i37 z2 +$8 x05 +o1O *86 +x9BY1xA5 +x63 $t +s14 ^_ +p4 ,3 D7 +x35 ^e { +Y4 K x41 +z1 o4V +s1v -9 +^s x32 +x29 T4 +^$ Z1 t ++5 y4 x09 +*68 sl. +Z2 x23 x12 +x23 ^o +x71 s5Z +} i7s $} +x14 y1 $3 +T2 TB TC +o97 *14 +Y3 ^F +o1c o75 o3j o5d o69 +slF i77 +sl3*2A +x02 y5 +-3 o5a +p5 sne +sDAt +stS 'A +$C $A +} o8= ^f +l i7x D5 +o9J c +s!a *76 +R0 i1% ++2 D5 *79 +i5O y5 +Y5 [ x23 +x41 ^K +x47 x73 +s0/ i6@ +*03*84} +uz2,0 +^s ^e ^c ^a ^m +} } y2 +*84 T2 +*61 $7 +p2[ +$w i8o +i4c i5k +*14dx23 +-7 $i +$L$9 +x0Asg8 +o4q y2 +] [ $; +sLc +L6 *87 c +^o +A ,2 +x82 x98 Z2 +ss% x92 +{ $t +o1a o5m i6o $a o8k +u ,5 +i7i i9n i8o +K i5, +xB1 u +y2 x93 $Y +i6t o3d +R6 x75 +*26 ] +i7P $d +x87*61 +szNxA2 +y3 *13 +u ,B +k o0k -1 +k s10 +s/;q +$r $t $y +Esrc +x87 -6 +,9D2sg2 +*14 i6n +s2U +*53 o47 +*40 *73 +o1y se2 sl1 $f $l +k R2 +{ $W +-2Z5D3 +-3 o57 +*4A x56 *76 +*80 D1 +i2s i4a i3h +x94 $4 +{ $% +flskt +{ $3 +{ $< +p3 ,1 r +p5 *67 *4A +*2B x52 +o2d Y1 o3e +i6. xA7 x91 +su$L9,3 +K L7 sBR +i5P x72 +*5A x04 +stF +stC +*3B *83 +[ t ] +stS +x53D6 +$f*96Z1 +-7 $1 +x41 ^5 +T2 T5 T3 T9 +[ o5x +K$M +x67 o5| +k o2j +o4n *40 +Kp4s1x +oBy D1 +s&<^O-6 +] xA6 *05 +x41 -3 D1 +x36 *32 +.B x71 +i78 -A +*29i1{-8 +-7 TA +D8T3i5d +x17 -5 +$b s3G x0B +^2 T8 +o9QxAB +Y3l +sea R9 +Z1 L5 o2l +} o76 +i54 x86 T7 +p1 [ K ++0 $0 +*80 x45 +*68 *15 +x72 i3o +k i2t +.8 i8% +k *27 +x59 i5l +Z5 s6J x34 +x02 k $k +sln $] +x63 y5 ] +$d T7 +^V l o3t +*90 'A +qZ1x84 +Y3 *18 +5 +*06 L0 { +Y2 *40 D4 +R1 } k +s!b +*29 x06 +o20 o1h +^x $1 +o8x p5 +p1 i6/ ++6 D4 k +i41 i52 i74 i63 i85 +o0p Z3 +iC1 iD9 iE6 iF9 +*32 t x37 +x69 i5- +ks/6,5 +T2 T5 T3 T8 +s.X +x42 ] +*03 k *57 +*B8o0/swJ +R3 ^p l +xB7 ^< +TB^Jx15 +z1 -3 d +y3 E *35 +^F *37 +sh. i2. +i2n i4l i3a +} ^9 +ss` 'B +o0b $3 +o3#sPq +y4 x82 } +} s1W +} Z2 k +o6c $e +*17*B5 +^1 x95 o8k +-1 i55 +L2 Z1 +z2+0 +i8YEx39 +ko9[L0 +$m slf K +s&@x53{ +*78D8 +o3d *45 +,3 y3 +i4a i9. +R7 K skj +i3Z l D7 +} ^r '8 +$/ *73 +*15[*85 +T0 T3 T8 TA +.3 z2 +o2g y1 +c xB4 +o6Y r ++6 o1K +$> $+ +,2 *9B +-4*01 +y2 x19 x23 +Z2 ^h $f +^x x31 -2 +f xB4 T1 +o60 $1 +u i11 i32 +*18L7sp+ +ss6 $B +x65 *35 +L0 u x14 +*84 } +i7o Z4 Z1 +sp1 T2 +x3BsKasSc +x17 k +^8 x93 +*B4i9O +*89o4G{ +sRh *02 +i23 *63 Z1 +x76 ,6 +.5 x32 +y4 i3d +z5 'A seS +o6x -7 +d *68 +p5 ,5 +x9Ax45 +i1u $e o4t $w +^9 su3 o6f se6 $d +x45 p5 +k $P +o6v*72K +o6j E xA1 +x05 z1 z4 +k $g +D4 ^f +Z2 o5s +D4 ^c +,8sDd-4 +*48 D1 t +^M *93 +$X +8 +] T2 +] T1 +x41iBV +*91 o4n +i4e i61 i5s +^7 *3B x04 +$`sQKt +T3 TB TA T8 +x75 ,2 +d l xB1 +L1CiAM +q*A6 +x01 y5 +soty4 +,A.8 +oBp p3 +i3c i5t i4a +o4N se_ +xA3 o1A +T5 Z1 *87 +*67 D4 o13 +o5z +6 +^e ^u ^s +s9u C T2 +x68 Z4 +$O oBN +o3y o2c +x52 z4 +D0 x62 +R3 E .4 +^a -6 +s2e Y2 +x98 p3 +u $K +Z4 x73 +D9 i5A +sB`Y4 +y2 x78 +*24xAB{ +^w ^o ^r ^h ^t +se2 o59 sc0 o3f $4 +^Vs4\ +s`Ms9Fx49 +Z4 *5A x65 +*ABs7ax46 +y3 *92 +xABi9x +u $' +r *65 +,Bo6Gx2B +i13 o30 +$! *05 +*A8 ,3 +u ^K *15 +*B8 $o x65 +*90 T1 +x82 o3 ,4 +i1a $e o32 o6s sp6 +s8w $x +o2u i4e i5e o3t o9p +stL +iAx E +*45sIRi7# +i8i i9n iAe +x45-6 +[ *09 +o47 $a +o0r -4 +k { $W +sdT i6j +i1e $h $i i4a i5r +T1 T4 T9 T2 +^d ^o ^p +x25Kx45 +x32 *53 -4 +o51 x21 +^3 r *06 +i9vz4Z5 +d Z1 Y1 +u i11 i31 i51 i71 +z2 x61 +l i6! +T3 TB TA T4 +q *27 x82 +i1T'7 +x58s7h +s7O E x71 +o0z i5a i6d o3i o2l +slO +i6Z o3o x65 +$' $( +Z5 x34 s6J +uxAB$y +x81 o7b +R0 shd +*80 x47 Z4 +y2 i9m +s2f$U +^m ^u ^r +sg?s4V +$v x62 +$e o6q +s>T*B1sQ3 +p4i7t +T2 T8 TB T4 +TAx5B +i85 ,B +y3 [ xB1 +i42 +7 +*28i1B +*05 i01 +z3 p1 +x68 .6 +i5P x63 *86 +C'B +{ i68 +E^=s+a +Z4 i2u sp5 +x82 [ +C i4F +y4 T6 +i61 i83 i72 +i16 *63 ] +s)Z{x62 +*56o7n} +sr3 $6 $5 sb5 o4b +$8 *35 +c T4 T2 T8 +$p*13 +x41z4sy' +$) $^ +o25 z1 ++B $O +s/A +$) $/ +s/o +T2 T4 T8 T9 +$) $% +^d ^o ^r +o9Lo9L +x32 E *69 +T3 TA T4 T6 +o83 o7v +s1R xB3 +$, *79 +i9Y*B7 +D1 i61 +2 o3y +sJWx06z4 +o1d *12 +sdi l +s}D*73 +T3 TA T4 T5 +^o ^t ^c ^e +y4 xA2 x72 +o0f i3k +$. $g $p +$. $g $a +Y2 $a +T0 TB T8 T3 +s&R +[ o5t +y2 *A9 x08 +^t -7 +usA& +ki4bs+v +y1 ^o +$TsTVoAn +^K x14 +u o0< +sl],2x61 +x75 s7A +*52 -5 +z2]xA8 +[Z1i7s +Y5D6 +-0*45RB +*60 K +c $2 $7 $8 +$/^r +z2 i4i +l $e $r $y +Y3z2,B +D0 x36 t +.0 +2 +x3A[s?b +x3Bk +sp7o6W ++3 i3d +o0M $2 +x91 xA3 +L6 '9 +6 +^b*A7i2} +T1 T6 TB T5 +*A8*21^y +*36 K +L6 +7 +*82 i3l +xA1 Y1 } +k *13 K +*60 ^c +xA3 RA +o81 [ +*56 sgo +,6x03{ +*B8 x65 $o +x56 o7D +y5^- +x02 TA +l x69 +x62 x07 +$Y $N [ +D6 ,6 +*07 $! +i5G sbW +o1G y2 +Z2 Z4 r +d $t $y +c $7 $3 $2 +o7a s\G +Y5,9p4 +-2 $i +^|xB9 +x52 ^m +D5 o1o +i79 i95 i89 +$w o0s +RB x74 +$$ i8C x2A +$w y2 +sKHs=" +i8s iA2 i91 +z2t +i6s Y1 x73 +i6i i81 i7e +$4 sxm +sr8 +4 +^u D7 +*35 y3 $6 +^c ^k o3k ] i5w +i2v x62 p1 +*1B *B2 +^" *51 +.BsVN +*94 x57 +8 +*BA K +^t ^s ^e ^f +D4 L8 +z4 +1 +slj ,3 +T6 T9 T8 TA +x71 x95 +x42 s3; i4o +su3 sk8 sa0 o5k o79 +x26 x12 +z5 x31 ^K +o1c ^p +.5 r i5c +syMsyP +x74 ,2 +$^ Z2 +d Y1 Z1 +x3A f +T1} +i0e *93 +o1o x58 +-9 ^f x35 +o0l o1c i2c ] o4b +E*61*3B +sYE*37o8% +Z4 sp5 i2u +o0f i4a +L6 *71 +*90i1_x81 +*24 x72 i6P +o0f i4k +i0i ] +*46y4sq< +x04 y2 +2 +oA/ +B +i2H *31 +x37[o4L +T2 T7 T9 T5 +$. $& +x93o94T3 +t o9l +B +$. $) +sr3 $6 sb5 $5 o4b +x59 Y2 +x59 Y1 +i2n i4r i3e +saqiAPy3 +$` *80 +p1 o0d +o7m x04 +$b $o +y2 *03 +$= *04 +.5 ^, +,3 s1* +^0 sm0 $6 ,6 so0 +i1u *52 +$^ $) +$^ $( +^J*A3 +T8 R7 sgv +o7`xA9,9 +$^ $s +o2XD9x6B +T2 T4 T8 T3 +] i4a +$9 x31 +E [ *41 +-9 x18 TA +z2*8Ay2 +sxu o2d x32 +o8$ iBv x98 +s6F r *47 +sHm +D2 o2y +$5 Y3 +z5*58 +C Y2 +,4 i49 +i9e $S +-8 t K +$h Z2 x32 +T5i9T*37 +RB]sjf +*25 *21 +r x83 '9 +x12iB? +] i4d +t o6Z +E *53 xB2 +c iA_ +o0q i2i i4s o3d o54 +i7g xA3 +.2 ] z2 +i8i iAg i9n +i9n iAe iB1 +sjI .7 +x82 oBp +i5n i7s i6e +ssZ y2 +Y4 *B8 +'8 o5p +T4 ^I +o2u +3 +o59 *34 +x05 ^m +^o .2 +o20 f x58 +Z2 sMs +-0[r +*47 T3 +o6u -7 +iBHs6i +z1 +7 +D8 y2 ,5 +x52 ^f +^4 x35 +^r x7B +t soR +i1r *26 +D8 i0$ +^l sc) +stV *10 +*32 t d +C *43 +xB2 ] -A +r *05 *34 +D4 iBn +i1* scY x02 +y5 ] D8 +x73 .1 T6 +$R *03 +Z4 i2u +T2 *58 +Y3 x38 +s|@ +*65 ^" +p4 o9x +T7 TC TB +Y2 x09 +o9d *56 +xB6 x53 *47 +f ] x04 +x31 *29 +i9u C +x76 x32 +z4 x65 +*83 $k ++8 x94 +T2 T5 T3 TA +o6j xA1 E +Z5 s7$ +L5 u +-4 s5< +L5 [ +o3s ^a .6 +*68 *40 +R5TB +o0W T6 +i82 iA0 i90 iB9 +z4Z1x76 +xB2oB! +i2- x61 +$A D2 +srz Y1 +*B3s4< +x63sday4 +c^t +s]FoBh +*14 o9S +T1 T7 T2 T4 +*40 x34 u +i0p $e +x31 Y5 [ +x58 x71 +^o u +i5JTB +D5 x01 +4 ++5 ^p { +*43 ^a +sjz ^k K +o1D *59 +Z4iB|s;E +x58 *34 +-7 *14 +sj' +s#! +q x92 x73 +s5L -0 +i54 ^+ +x29 l +T2[d +x51Y5x52 +i7q x31 +x31 o9C +*32i7m +Z2 i4x +*86 $+ +o1o $* +z3 o5h i0g +z3 $p +xA8 *A8 +fxB3 +i87 x49 z2 +x52 p5 r +Z1 $= x16 +T2 T4 T8 TB +$Q ^e +o5a i60 -2 o79 +z1$k +p3 k +x34sP? +$u xA7 +r*53 +o1CT1 +ss= u +^v sjc +{ T1 i68 +z5 ] +*48 ,3 +xA5 TA +c x65 +x06 x0B +] x59 sra +x19 ^B +sjR } +d o5- k +u Z5 x43 +*98 $W +D4 $Y ,6 +s(u*2Asy# +^ ^p ^o ^t +*59 '7 +*05 o4u +$+ Z2 +o85 $> +$, *42 +i5s o76 +z1 -2 -1 +x93 sfe +Z1 xA6 $> +i5Q x0B +{ i68 T1 +TE TD +iBC +x05 $2 c +i2j o6o D4 +x42 x42 +$+ T3 +$+ Z4 +c *18 +i4d i6n i5o +*43 y1 *13 +*49 -4 +t s-g +s2Z L1 +z5 x12 Z2 +k^O +o4i *50 +*21 sdo +DB ^W +*31 o3d +oBU x73 +K $e +3 +L2*50$E +i4y *20 +,2 T4 Z3 +T6 TA TB T7 +$? x51 +*72 *47 +o1y xA3 +y4sKYK +x92 $k +s24 +1 +*43 i7V K +i0a y1 +o63 R7 +*84*9B +sh6y3R2 +s9b p1 +y2 x38 o91 ++0r$h +oBT y3 +o4G { +so, x42 x81 +^b *36 +*32 x47 +s3Q { +s6c +^7 $E x68 +x0B x95 +Y3.0 +i3s sDb x35 +o1sp1 +i7Q -8 +^_ *32 +sfK D6 +i9. t +$^ x12 +i5Ps_D +Y2 x9B +*07 c +o5b o4o +*43 $y +i2u ^j +i9t $2 +x67 i6a +o10 o5A +o2k o5r +x0B *68 +*43 $# +s36 z3 ] +$. $s $u +x42 i4o s3; +o62 .3 +o1n k +y4 x87 x58 +T2 T8 T5 T3 +i63 i89 i76 +skA*49-A +oBE D0 +c i10 i01 +$k $i +T0 T1 T3 T7 +*B2 x15 +0 +iAh ] +i8t.9 +y2 oBb +L5 $N x65 +sPk t +o3+ x41 +Z4p5l +i0s x62 +] [ spH +Z1 o0I +} r { +$gC*3B +x67 o62 +*05 D7 +$5 oB2 +k i4' +.0 Y1 *76 +^c Y1 +^c Y3 +$1 D6 *45 +x31 i7V +o0y o5h +x97sv+*A7 +i41 i59 i68 +*35 x31 +ssO +*09 *04 +x83 $B D1 +oAp o6R +-4 ,5 +Z4 ^X +*35 $6 y3 +x26 Y2 +L3 s4c +x64 o08 +i7z^i +o0s R3 +s50 +6 +*64 o3D +^N *23 +*06 o4r +x21 [ i55 +Y1 o1G +$T x16 +o0i o3d +swisvW +x93 *07 +x82 R6 +i01 i12 i34 i23 +p3 k ,8 +DB +1 [ +c sd$ +^Z x47 +*70i74y2 +^Z x49 +$2 Z2 x23 +Z1 o0s +*34x06s&; +R1 y3 +t srR +*91 x43 +.7 D9 ++5 $7 +y3 s8d E +i17 *15 +y3 *16 x52 +x72 o5h +y1 T2 +x79 i37 +*21 ^6 *61 +$- DA +$$ $^ +*48 K +TB p2 +o0z o2l i5a o3i i6d +o2h D5 +x57 ] +$$ $) +i24 ] +$$ $* +sNrx28 +r Z2 x76 +Y2*56o4t +$/ x71 +$w { +T3 xB3 +$Y K +Y2 $6 +x75 ^N +*64 y2 +s16 'A +o3e *40 +q Y1 +z2 s2L +d x03 -5 +x32 y1 x2A +d R5 x79 +-6 sCe k +D0 *30 +k$@ +-4 Y1 C +r o0s R1 +y4 q DB +CstA] +x43 $s +x95 r +*38 x91 +x63 ] x74 +xB6 c +o1q D3 o72 si9 o6l +s-= +,2 k +*02 E +o62 *31 +x05 x12 +z3 ,4 +i32 *45 +,2 x87 +x03 iA2 +T2 $J +x41 z5 +L2o2bi0L +y4Y1 +o2y +0 +o33 o47 +i9d *18 +s+G +xAB u +q y3 x67 +o7+ s f +i2v ^z } +sa2oB;Y3 +T3 TA T9 T6 +*0Bz3$p +$w*60s)> +d^k +*01 ] x51 +^0 i36 i46 o50 so5 +x73 +8 +^9 o4e ,6 o7f si4 +x02 x43 +*74 i3R x08 +^4 s24 +x02 sfQ +^l *37 +s bo1Ou +ss_ o63 +f x48 sh/ +D0 x76 +i3i x21 *31 +q .B +T8 xB5 +y5 -5 x01 +p1 'A z1 +oB< x92 +D6 scm +^a ^l ^e ^b +DA $` +i5a y3 +-3 o4u +T2 T4 TC T6 +o0tx87^D +x03 s32 +y1 x97 ^x +i8F { sF4 +f *89 +z1 x2A *15 +^Y Y1 *87 +^N x39 +x51 Z2 Y2 +x85 iB! +Z3 TB +$ *89 +Z3 T8 +RAR5D7 +*3A x19 +o0e ^B +y3 z5 ++3 Y4 +x26 i2p +$a D5 +x98sNv +i3x xB2 x24 +x03 D6 +*60sxg*03 +x34 '5 +x01 $9 l +i2n *40 +i23 -0 ++5 s1S ,4 +o6&L7,5 +] ^w +*38 o0f +*36sY< +sae D0 ++1 ss0 i67 o7a sc5 +s.o +$d R0 +xA5 i9% +sdS x62 Y2 +[ x71 o5k +uo6F +] s1m +s.e +o0e ^s +$n x84 +x19$hx43 +^1 sjp +*75 -7 +C o8X +o1d $6 +.1 z1 x56 +-A -B $F +xA1 y4 +sn@ +3 +Y1^0 +x2A $& p1 +i8$ $z +Y1 x31 D6 +i8a C +$N [ +Z2 o7M ++8 L7 +k r .5 +K $1 -5 +x04 DA o85 +T8o5Ts0? +.3 si1 +x08 y5 +$2 T6 *7A +T1 o5E +o9n x45 +i4y $1 i6s i89 o97 +L9o6.^h +T1 T5 T2 T9 +{ s0z *20 +^d ^i ^o ^v +sfF *70 +i9i iA1 iB2 +${sWM +} i9O +z1 x67 +z4 x5A +x32.Bx13 ++5 c $# +D0 Y2 x31 +^R x3A +x45 *71 +z5 x95 +s5n E *52 +o1^ l +x02 D5 *10 +T2 x46 +$M $n .B +xA3 ,2 +sD1 Z3 c +o5c $4 x02 +i4i .5 +Z1 $0 x03 +i4M x14 o2p +D3 ^f +sm_x75 +y2 sk= +x08 ^b +x42 d t +q Z1 x84 +k D5 *35 +o0p *89 +x08 ^( +[ s.z +sk4 +c *56 i1A +sk, +o0v o4o +x51 z1 *23 +xB7 x36 ^( +^q t +o3u *31 +4 +y2 *75 +x45 -6 +}o7jx95 +Z5 x1A +*A9z2 +*35 $} +{Y4 +sc[x8A +x76 i3s +x71 sh- x43 +y5x38 +y3 x69 d +L3 -6 +i11 i56 +RBR2 +Y3z5,2 ++6-D +i70 i35 +i1b i7f +{ Z5 ] +i7c i36 +$}$} +i57 i7c +i51 i17 +$;$? +$}$> +*1B K +x08 spi -4 +} *52 -6 +i16 i3b +$)$. +.0 *38 +$($} +$($` +$($\ +-4 z2 Z1 +$+${ +$^$[ +sTf +i11 K +$]$. +k Y3 x71 +i7c i17 +$]$^ +$|$* +$|$$ +$|$& +T4 T7 TD TC +$<$~ +$=$' +i54 i37 +i15 i5d +$|$^ +$+$> +L3 -4 +*A9 *A5 +i58 i13 +i58 i12 +^v x79 +i5c i39 +$<$[ +$+$( +[ ^p $1 +o48 D1 +$!$[ +i50 +8 +$<$( +$7 +2 +i3d i4l +i61 *67 $9 +o0a o1i +i7c i12 +x02 ^k +$<$] +$<$^ +$ $= +$<$& +$\$& +i34 i16 +i13 i7b +i13 i7c +$<$- +$\$~ ++0 *56 +i5b i30 +y2 $. x73 +i3f i17 +$#$[ +i14 i7f +T3 T8 T6 T9 +i39 i5d +i18 i3f +$-$\ +x02 ^d +$%$] +i7b i31 +$%$; +i12i20i33i42 +*03 +3 +T2 TB T9 T8 +i7c i39 +i40 ^2 +i32i40i52i61 +i33 i7f +p2 x0B +4 +oA0 K +s4h.1sWX +$f Z1 +4 +$#$, +]x73 +i59 i7d +i59 i7f +i0- o7r +$n $q +i7c i14 +i37 i1b +$$$\ +p1T1 +o9s 'A +x7B R4 +i8v}xAB +$"$@ +$"$^ +i19 i3c +$`$\ +i21i39i46i51 +$"$$ +i16 i7b +i16 i7f +p3 x1A o5< +x02 ^4 +i77 i15 +i6&sqM +i15 i3a +$n ^n +i3d i15 +T2 T8 TB TA +oAVsSt*41 +x71^_ +x0A ^S +$[$" +D6 i31 +o0c o41 sg2 o1j o2q +$~$> +$~$< +$~$. +$~$] +i36 i7b +$}$- +c $i $n $a +i38 i5b +i33 i16 +$,$[ +$,$\ +R3 k +x54 +3 +i33 i5f +$,$^ +$g $7 +x39^; +*A0.4*08 +K x59 x54 +$>$~ +$>$| +$>$_ +$>$@ +i78 i13 +$>$' +$>$% +'A *87 +$^${ +o2m *57 +.0*37 +sc2xB2 +o5t ] o3m +} o42 +*65^"t +p4 o0@ D5 +i12i20i31i45 +i1f i36 +i14 i78 +i12 i79 +i12 i74 +i10 i7d +i15T2 +k Y1 i0s +i2k i3e i41 +o2z i2t +i7b i57 +i11i29i36i46 +$^$> +i59 i13 +i50 i37 +$'$, +$'$# +${$' +$2 o6e +k ^k D2 +${$- +${$, +${$= +i52i60i72i85 +i16 i5c +${$] +${$\ +i14 $9 $3 i35 ss6 +$[$+ +i3f i55 +$[$) +i0n x13 K +$[$> +T2 TB T4 +i59 i1c +$[$_ +$[${ +$'$@ +$'${ +$.${ +$'$~ +i3f i13 +$'$) +*03 o27 +$$$< +DB oA* +i19 i5c +i70 i15 +i59 i3f +T1 T2 T4 T7 +sQWs^WsHt +$&$[ +$&$] +$;$= +$;$< +i7d i30 +*35^H +k o33 +x05 z4 z1 +x62.Ax78 +^7 $7 -2 +x69x81 +x4Bx94*A7 +x09 l +Z3 y2 +i3b i18 +i75 x8B +^g*45Y4 +i35 i17 +$z D2 u +i9 +$'$; +^q ] +i36 i18 +i36 i5d +$|$( +$|$- +i59 i15 +i1f i77 +i12i20i32i48 +$V$0*B5 +x59Y5*0A +o0G Z1 +$|*20o9z +*68*71.6 +Y2 o45 -5 +i7PT8TB +i0M { +Z1 x61 +y1K$y +i55 i7e +[*25 +o0i $f i32 o2w sa1 +i33 i7c +i55 i7b +o01 ] +i18 i5b +i75 i37 +x31 o2j +i50 i7c +$I.6 +$;$} +^w ^e ^n ^a +i3a i16 +Y1 x02 *43 +] y4 [ +sqZ +s.Osul +*72 x13 +o5Du*82 +i2m +1 +s03 T3 ++9+E +i15 i5c +^9 ,6 si4 o4e o7f +$!$| +s.# +i74 i39 +$-$# +$-$% +$-$& +Z2 oB5 +$-$, +-6 ^s +$`$> +$-$} +$o $z +Z4xA7 +sgj*2Ax75 +.0 i1z +f { [ +$`$| +$^$~ +o7i +8 +i75 i14 +i1t ,9 +T2 T4 TB TA +o66 *24 +c $3 $8 $5 +Z3 t xB4 +sB's*C +y1 *02 x51 +x04 *74 +o0k o6k +sq8 +*90sHwsvS +$y x52 t +i7b i30 +x21 $a +$"$\ +l $. $v $c +i18 i79 +$y t x52 +l$| +$8 x14 +$,$> +sr3 sb5 $6 o4b $5 +^2^3^0^2 +o0o y1 ^z +x94*7B +$_$] +$?$; +$?$, +$?$^ +xA2 Z4 +iD1 iE9 iF9 iG5 +$?${ +$?$} +$;$$ +i54 i1c +lsaY +i54 i15 +x31 ^9 y1 +*59.2 +o2n[Y1 +[s{8oAx +s#o +x51 i08 +x68o9=o41 +y4 xB1 +KoAY +t i5X +x23o4l +f +7 +l *02 shu +r'8 +o4i *48 p3 +x76 ,7 *04 +i7K$j +f *95 +*21 x43 $b +L0 T2 +f xA5 x65 +x85 +5 +x41 $6 +o9` x01 +*23 *21 +p1 $y x03 +*79$oz3 +^s ^m ^i ^s +'4 ^S +r $i $c $l $e +$8 z1 l +x31 ^B +-9 *0A x72 +T0 T2 TC +i3e i42 i50 +r*BA +D6 o4k +x21 -7 +x48 D4 Z2 +*59 o7o +*56 y1 +$s $w +x42 t d +Y4-8 +sR@ +i2m sa3 i5s i66 o8o +o0i o2w i32 sa1 $f +.5 *45 +o4z -5 +.0s6FY1 +iBy x17 +^o ^c ^r ^a ^m +Y4 $1 +i3i i4n i51 +x35 x25 +T1 T2 T4 T8 +o5y x64 +*0A x76 +i69 .5 K +i31 i59 i41 +su#s[.*51 +$$ i0* +*73 'A +o0z o3i i5a i6d o2l +Y2 o8e x61 +x53y1 +s@ +9 +sUxx41 +xB9x74{ +o49 ] +*84 i6c +t +8 +,B[ss2 +i8l i91 iA1 +E *31 +^(*38 +x8A D9 +x42 i6. +o31 *21 +L0 } +sb_ $i +o81 $4 p4 +o0l ] o1c i2c o4b +o2j ^k +i6d i8r i7e +$;o9Y +$k $1 +s`Wx65st. +*56i6G +T1 T2 T4 T9 +s95x45L1 +i1o ssN +x12z5 +x12 Z1 ^x +^j Z2 +$4s<@$& +x12 '5 +*47 [ +Ci4i +*20x23x04 +-7 *38 +x32 *12 Y4 +k [ +T1 T4 T8 T2 +i1e i4a i5r $h $i +^N '5 +o61 p3 sg4 +^s ^a ^r ^k ^o +E T2 x31 +^e ^z ^a ^m +k o3o +i7b}y2 +s7o +^z x72 +x04 x81 +fx53 +sc`o4G +o2j +3 *43 ++1 i67 sc5 o7a ss0 +$js1T +iByx43xB4 +c $. $b $e +[ Z1 +5 +T7Z1*4A ++0i4 shk +x13 i3_ +o1a $a i6o o8k o5m +s$8*06o4r +l $. $l $k +x21 $h +^p ^o ^t ^s +*31 o0L +E $^ +y1Y1z2 +Z2 l o5m +*31o2y +} +0 i31 +o56 *78 +*15uiAA +o1L [ sLe +x13 i41 +i9_ x45 +i46 *61 +-3 'A +o62 ,1 +T0 T1 T9 TB +o4_-7 +-A^] +srN D3 +$1 o3o +i3v Z1 +x29 $y +-7 x04 $B +x62 x5B +xA2 p4 +x02 .6 +c*4B^; +*71 *60 +^A $5 +t f x3B +Z2 ^l +i6g x12 +Z2 ^j +$! x42 Z2 +c $p $i $n $k +T5 T9 TA +i4M +0 +o0z $c o2a *56 se0 +.2t +} o0d D5 +$w D6 +$s D4 ^w +Z5 x26 +*59 .2 +qy3 +$5 i42 +Z1 o24 +,3 .5 +R6 *57 +*54 o4z +'8 o5v +y1 x52 Y2 +o1e D4 o4c +x17 -1 +] o42 u +x31 x63 +[*05 +[*07 +Y1 x64 +y3 r x41 +^$ t Z1 +-9*68Y5 +oA0 DB +*15$i +c T8 x04 +q *53 +i71 D1 +Kx62i6& +c $b $o $l $d +-B D4 ] +o8)LB +^2 .3 +sNmp2xB3 +o6F x05 +^n ^a ^l ^i ^m +xA7 x06 +R8 $L +^w x63 +p1 ] ^c +^d ^r ^o ^c +T0 T7 T1 TC +x41 Z4 +y5 x54 k +o41 *75 $l +iBa x91 x07 +i28 ,3 +l $. $l $b +i3r x42 +x56 x47 +x46 '7 +p5 +5 o0y +y5 xA3 +$Do9_.A +o0T o1B +o9vo9u +T1 TA T5 T2 +x6BR0 +sHq*54Z3 +x13 '9 +^3 *13 *25 +i7o ,6 +k +5 o62 +t x72 D0 +y4 x67 E +DB*60 +K *03 +sbv D5 +u $2 $0 $1 $3 +x62 si4 +o0S ] +i14 i35 $9 ss6 $3 +k i0s Y1 +f x57 o5d +o0T T3 +*83^3D2 +o1a o3t i5i i6a +x1A t +x73 y5 +xB2 -A ] +x41 D6 $2 +T0 TB T7 T4 +i1a $e sp6 o32 o6s +shg Z2 +o3a k +o48 Z4 +*78 x15 +*3B*89 +smq -0 +]*02i6w +i9a iBd iAn +t Y2 ,7 +x05 x6B +*10 t +Z2 *34 +*25 i3f +shz x32 +x6B .2 K +k y2 -4 +$z *54 +x06suzs,7 +.3z2*4B +-2 i0k +x63 srw +x51 k ^r +sC>x8BR9 ++1 .0 ++3 .4 +*03x5B +x3BoA& +o41 $l *75 +sh4 iA0 x25 +o0? ^! +*31o9+*28 +-5 i2d +d seg +$0 z2 +*09sz9 +$+ o85 +}o7\ +x12 +7 +T0 T7 T1 TA +o8R *21 +i3x o5m +[ +5 k +x45R7 +iA" +] i73 +o34 o15 +$y x64 $1 +$! c x13 +-4 K +o6o E +iA- x1B R5 +x52 -0 +*45 K +^s ^e ^d ^i +o1U c +^a{xAB +T2 TB T8 TA +T2 T8 T4 TB +$9 $7 o7a $2 +x4A D0 +sfLi9V +iEt +o3$ Z2 +o0r q u +k sy$ +szosyIx59 +$k D3 +*17 Z2 D1 +x4As'pq +x17 R1 +^v*41 +o4q Y4 +o9zxB1E +xA9 +8 xB4 +$z x21 +D4 i7s +[ o1j +Cp4 +*51^W +T0 T2 T8 TA +z4D4x24 +se2 o59 $4 sc0 o3f +i2n i4i i3d +o7s *41 +[ o1z +o7a .5 +Z5o5e +[ o1x +s5l +k sfp x71 +uo4ss') +o2e i38 i5e i6a oAg +i6us@*Y2 +o54 ] +o2u o3t i4e i5e o9p +D5 $9 $4 +D2 i3b +^r ^g +sd8i7O +^4 sa3 so2 i2b o56 +z1 D4 shQ +i23 ,6 +*23 o1f +$! Z2 x42 +.2 D8 +Z3 o4a +*02 T6 +o8/iA&x34 +x06-B +s5; +Z2 r *46 +*28 c +D4 $@ +l o0H x61 +^d K o3s +s,9 +i50 i62 +^a Y3 +^t x69 sgc +i4u ] *32 ++1 i67 ss0 sc5 o7a +i68 D3 +i68 D9 x73 +p2 o3i +z1K +T2 T4 TC T3 +y2 +3 { +o06 x61 +T3 T5 TA T7 +-2 ,3 +y1 x17 ^q +,7 D5 +uKo2R +^Yx12 +xA4 Z4 ] +y2 D8 +o0z i6a o53 o4n o72 +x62 .2 ,1 +Kui1K +T5 RB +i0m o3i +-A +B +T4 TB T7 TE +Z3 o9r +i7e x12 +o6i i6v +z1,7 +^Y p5 { +i0m o3v +] Z2 x42 +x3B T2 +sCSs#* +*A2 x76 +*A3 sc3 x43 +x24 y5 +k -2 -3 +x31 *16 +T4 TB T7 TA +xB1 syl +T0 T3 TB T8 +*25 *60 +R8^wZ1 +s=hz4 +lp1x48 +y2,AZ5 +x62o1!$1 +T2 TB T8 T6 +i3i i5e i4n +K r i51 +T1 T3 T9 T2 +*08 Z1 +szEsSL +stq +i6q*03 +.5 *21 +x31 $4 +k -3 *56 +o3@ c +x42 i48 +i8Qz5 +y2cY2 +,1 -0 +r ] { +x91 o99 +$p { sdo +t $1 y3 +c $. $i $n +*94x64'7 +sEUx14 +*23 ] +skP*46u +T0 T9 T5 TA +x03 y4 *56 +o6f 'A +*91sl0 +x58*39sr5 ++2 i2r +o5g *12 +o1h $3 +i4p ] +*48,6o34 +s>hD8k +z5 *91 x46 +R7 i6j +o68 .5 K +o4t u ++0 i4a +x45 T0 $5 +i8 +o5s o44 x12 +c i4m +x6B x52 +$a $r +o49 *02 +T2 T8 T4 T9 +o3g E *54 +x58y5r +s0 K +*9Bo3+ +z3o5u +x8Bsec*B0 +i2m i5s i66 sa3 o8o +y1 x61 x84 +y2 x51 +x1AqT8 +xBA xA7 +^wxB4T7 +] x91 ] +o0c o2q o1j sg2 o41 +T1 TA T9 +s0& +i3& [ +s?j +x69 $x +sg&^# +xB4x82*BA +o2k*A6o4j +i1a o6s sp6 o32 $e +R8 o7x +x02 o5g +t o33 +o0z o4n o53 i6a o72 +i6a o3i +o1Y $p +R3 .4 E +o4a*04 +o51 T0 +R6 s/r +i4# x64 +o0o *02 +*A4 t +p3 ,8 k +i66 ] *63 +u o76 +x02 o5z +o6g [ +*23 *86 +Z4 u x64 +u o78 +s73y5 +r $w $i $s $e +$e^3 +^B i1b +x76 *04 ,7 +D2 o1t +o94 x45 +x0A z4 +i3s y3 +.8 x14 +i2z '7 +s.z l x51 +o5* .4 +*40 q +i0v^[ +*53 k +sk' x53 +R4 $5 +x83s$s{ +T1y3 +s?S +C p1 +*78 $9 $7 $1 +o3k l +*20 o20 +*34 [ +ts<+x23 +i2x '8 +*60 x56 +i2i D5 +s?!o0U*56 +K y3 x7B +z2 ^a $c +y2 o2j +y2o1Xx23 +i45 -1 +k K *54 +x45 i5$ +CsK#x23 +o2h *03 +$?.4 +y4 Z3 x58 +^a ^m ^a ^b ^o +y3 *62 +*02 *97 +sGx +*13 R1 +*6A ] +o6\y1 +$z *50 x43 +T3 TA T4 T8 +o50 d +$i x41 +sDNx2B +^xx31-2 +oBt x42 +] ^b y1 +xB8^u +D6 z3 +p4 ^^ +y2 *98 +$nz1 +x36 ^U +,1oB$K +^e ^z +,4 i2i +^p ^m ^e ^h +o68 } +{ x62 Y1 +x73 *56 +T0 TA T9 T7 +D6 z2 +E o6t +] p3 x0B +K *51 +iBx iBz +x35 ] Y5 +^n *32 +i4i i6o i5t +d f +*BA iB9 +o1o *05 +$4 $2 l +o7< ss9 +R3 +7 +TD TB +scr +so3 .5 +] i8l +xA1 DB ++2 x63 d +DB $0 +$7 o3s +ssm { +$5 K +L6 *36 D8 +Y3 *7B +*64+3TA +*4B x93 +iAu x46 +] D0 -6 +x13 -0 +z4 D4 +T5 R7 +*06 o39 +x24 $u +x23 *54 +i0< s<0 +x52 sko +i1a i3a i2d +K *05 +$! *56 u +C i18 +x16 ] +o75 o4m +x61 l +x23 Y1 y3 +*20 .2 +Z5 x45 +o89 x02 +*97 r +o3h K +] *87 +x56 o53 +$2 x23 Z2 +y4 x47 +L6 D8 *36 +y2 -2 +u o2R K +D8 *67 +*81 .5 +xB2 z1 +.3 o2z +*68 Y2 +sPU +T0 T3 TB T2 +snt r +-7 *64 +'5 p2 +y1 +A z4 +l o81 RA +x15 Y2 Z4 +x72 t +C *14 -8 +sJM D2 p2 +^l ] x65 +*53 ,2 *83 +s41 *89 +R2 *76 +*45 .8 +^9 *14 +q x16 'A +i7h *25 +Y1 DB +o3o [ +s5f D6 i3o +*49 K +o08 Y2 +*53 x41 +u o6E +s@W +i4t i6r i5e +T3 TD TB +*18 x54 +^l x65 ] +*24 y4 +Y5 *48 +se& +x91 ^y +T1 so0 +*52 *74 +Y4 x29 +*73 scu +o6s y1 sey +*37 Y1 +s*A +*25 +A +Y4 x01 D2 +t *96 +D8 oAe +o3n i2k +$p x76 +-8 *07 K +D1 *26 +*04 sik p5 +sNhi7Bz3 +l o9) +D9 ,6 +x63 Z5 +{ i2x +o23 x35 +x53 o5u +sc9 i9! +oAi o8e +x01 ^9 +y4 *71 +o1i o9@ +l RA o81 +s7e K +*10 y2 { +l $< +oAZ*51 +iA2 $P +x51 c +i8r ^2 r +*32 y3 +o5q$e +si! x32 +sw1 +sw5 +t D6 p1 +*02 '3 p3 +s!P +] ^9 x45 +i5- '8 +y2^9{ +i34 Y4 +o4o $8 ++A ,B +s5Xx12 +x34 D5 +s<_ +$9 k +D5 scv +p3 Y2 x4A +s/P +R5 D7 +*16 y2 +.9 x72 +szp +Y5 x42 +sQH +] x45 ^9 +y3 x67 +sMm Z1 +Y5 +6 +*19 x83 ,6 +x31 *15 +i1o i3a i2n +o8/ .0 +R6 ^b +x57 Y1 +K i7u +R3 *37 +$i *B9 +u K o2R +sVN -3 +x6B -5 +^/ x62 +x39 y4 +*81 D1 +x24 z5 +T1 T9 T3 T6 +R6 o5h +i6_ 'B c +] spc +T2 T4 T6 TC +x45 Y2 [ +] R7 +scl ,9 +.6 D5 ^n +.7 Y1 +*03 o2k +$. $a $d +D5 s7n +D3 *50 +o2b 'B +D3 i7w +T6i3R +i2r x43 +skg ] +l d $5 +,6 i56 +i41 i66 +*8A i97 +slM T2 +$2 x57 +i93 D8 +y3 $6 +*87 $4 +E sn9 +$4 *AB +.5 *78 +x16 K +o9z xB1 +x15 Z4 Y2 +i73 *A8 +xB1 D4 +o6s sey y1 +p2 x41 +$! u *56 +D7 *54 +T5 T9 TA T8 +*41 x52 o70 +D6 [ Y5 +u i5X +sKO x51 +i5t i7r i6a +p3 x4A Y2 +o8. l +s-E [ +C -8 *14 +DA iA6 +*19 ,6 x83 +sAQ +x23 p3 'A +o5d o0s +o1V sWS +t shi +LA $3 +i34 o5T c +x45 [ Y2 +sSY ++0 ] +l } D8 +*75 k +x02 D8 +c *67 +u ,1 +xB1 t +sKM +i59 i77 i68 +*76 s*v +-1 ^l +s+n +f p4 *71 +x94 x32 +*74 $? x56 +i5l i7n i6i +y2 x72 ++B *45 +i8t .9 +Y2 -5 o45 +t sgl +-B iA3 +Y1 *51 +x49 R6 +D6 Y5 [ +x63 i98 +y5 t ] +.8 iA3 +*30 $5 +$g x65 +i5t +0 +Z1 ,9 +x73 o2K +-5 *7B +x41 *81 +-A i88 +^4 xA2 +i4e i6a i5l +y4 sao *24 +s5+ +s73 y5 +y4 *24 sao +seu ,1 +x05 Z2 R3 +,6 R4 +x72 .8 +i21 i39 i47 i55 +*53 *83 ,2 +i4, $2 +ssg ,4 +[ x37 y4 +x95 t +^4 i2b sa3 o56 so2 +srp o4d +*41$kL7 +sUB +7 +x31 sbU E +*74 x56 $? +-8 K *07 +K R7 +t xB2 +o6i+3x38 +x26i0] +tsLG +o5?oAH +i5* ,6 +sX1sAi +x49 R5 +i3v x01 { +st5 q +y2 t *75 +*B7x64sm^ +$1 t x62 +o0c o2q o41 o1j sg2 +$1 ^; +.AR5 +i0e sn_ +*15 *52 *41 +o7 +$7 ^= +z1 ^| +o52 -4 *56 +$7 ^{ +$7 ^| +LAsC{x13 +o8x K +x54 y5 o5v +o0Z c +^e ^r ^o ^s +sb5 u +i1i -0 +^a ^v ^a ^j ++8 $8 +x36*A4 +Z2} +s6t +$% ^2 +$7 ^^ ++1 sc5 i67 ss0 o7a +s6y +$= ^4 +$= ^5 +T1 T8 T9 TB +Y1 -B +c ^! ^4 +^wx18 +$[ ^1 +o58 k +$3 ^` +c ^% $8 +o4s $1 ++3 D2 +^2 ^% +^2 ^$ +i9wsA7 +^e ^t ^i ^l ^e +x24c +] o3h +.5Y1*36 +^2 ^, +[.7,9 +$y $1 x64 +*6Ao9X +smw] +c ^0 $. +^8 ^) +o44 ] +$2 x12 -0 +uY1} +c ^0 $% +*56} +x0B -B +c ^0 $_ +*B6*62i3! +sljz1$n +L4L1 +$` ^9 +Z1 se7 +$=*B9*04 +*15x6A +sC" +l $1 Z1 +s.d x87 +i5AT7s9d +x8A q +$3 ^) +^2 ^_ +$3 ^% +o6z u +c ^0 $@ ++A$6 +c $` $8 +^2 ^` +c $ $# +x53 'A +*1A Z3 x9B +^n ^e ^i ^l ^a +x4BZ1 +sUE i32 +i3k o2r +c ^8 $0 +^9 o7f si4 o4e ,6 +Y2-0 +^k ^u +i0f x12 *31 +c $( $7 +D8 f +c $( $2 +o4x '8 +i5O l Y3 +K .1 *47 +^y ^t ^s ^i ^m +$s $c x13 +.8o0-D3 +c ^5 $+ +c ^5 $* +i34 *61 +c ^5 $$ +Ep1 +$b *21 +Z2 r +*52*7A +o4K '6 +{ k *16 +o1e x31 +*52 .2 +i6"d +^6 z1 +u o5L +oBu$) +*B4o8B +o0z o2a $c se0 *56 +*86sx8 +D5 *43 $9 +RBi8$ +o9{z1RB +Z2EL7 +c ^* $3 +iBWsvMY2 +p3 +7 o1o +o4r R5 *42 +^e ^l ^c ^n ^u +*03 ,3 *67 +c $5 $^ +c $, $4 +c ^5 $@ +Kx76 +x84i25 +y3,2 +-3 o2& +*97sC* +p4 D5 o0@ +o4i +4 Z1 +$s $f +z3i87i1O +o8u ] +i0b x13 -4 +c ^ ^7 +c $, $. +c ^7 ^* +L5x73 +c $. ^8 +o53 o33 +y1 ^q +T1 o2w +^1 ^[ +Z1 t r +^6 ^# +$% ^@ +x62 ,1 .2 +] sra x59 +Z5,9 +^6 ^) +^6 ^, +^0 ,6 sm0 $6 so0 +x41 o3n +o2e k [ +^1 ^" +,2 .A +c $& $0 +s1e oAd +[$*y3 +c $& $5 +$ x13 +$7 $- +^1 ^( +i2R*4A +-5q +^w ^h +^1 ^, +i8k}x32 +Y3 Y3 +2 +T4 T9 TA T5 +c $; $2 +c $; $5 +$e Y3 x24 +c $; $7 +c $; $8 +c ^. $0 +*57sahs#v +} D2 Y2 +^w ^s +s?= +*97r +i19 ,2 +c ^$ $6 +x12 y4 +^Q*48 +x12 y2 +$9 ^& +T0 TD T9 T3 +T5 T6 T9 T7 +*62z1 +^v D6 +c $` $5 +$9 ^> +c $` $7 +ksw4Z2 +o3Bx92k +c $` $3 +^) x03 se. +$9 ^7 +T5 TA T9 T7 +c $` $9 +$9 ^2 +c $4 ^? +$p Z1 x62 +i75 [ +o27 *23 +o0t i5l +.6 +4 +x0B ^S +o0e i8a o4_ ,9 o6a +y2 o0h +$9 ^~ +Z3 xB4 t +*5A p4 +sjYsw=r +c $~ ^4 +ui8k^' +$7 p2 +c $2 $( +c $2 $) +T0 R3 +*27 x4B +c $2 $" +c $2 $> +*91rZ2 +r Y1 *47 +x71 o5u +c ^. $7 +y4y5 +sb4 +-9 x03 +sqh -A +Z2 *15 o0( +s3. u +*5A*A8E +oAq K +x08 z4 +z3 o21 +s+_$e$x +-5 *14 +c $< $9 +-7 ^e ++6 *65 +c $2 $| +c ^. $9 +c ^/ $/ +p2 i4' +^[ ^5 +o0w sf4 o6p +2 o4v +o0A o1e +^8 ^! +^8 ^# +x23 t +^8 ^& +c ^% $5 +^8 ^+ +y4 x32 ] +DA $1 +^8 ^. +^8 ^; +T0 TD T9 T6 +^8 ^> +sqZ$; +c $4 $) +c $9 ^^ +^; ^1 +^; ^4 +^; ^9 +$1 $q +^* ^7 +o1Ix61 +^* ^3 +k r Y4 +[ i1[ +^* ^0 +*89-9.0 +$2x06 +sA` +k D2 +6 +^5 ^. +E z5 x34 +^5 ^* +R4sW@ +^5 ^) +o3z -2 +x31 p2 +^5 ^% +c ^/ ^1 +*42 k ^3 +p2^p{ +Y3Z5 +i39 x12 $6 +q sud +i88 R0 x17 ++7 *36 +i0w d +xA3o0iZ2 +c $4 $~ +^2 xA9 +^? ^3 +[u^q +o5n *45 ] +^e ^r ^o ^b +x06 ^w Y3 +x14 ^2 ^5 +p1i8i +x43 y3 +4 +xA4xA3 +o3(.A +^4 ^= +i75 *16 +*24 *32 +tx92 +c T5 ss$ +c ^_ ^9 +s,YxA3 +o3o o2c +o52 *53 +o30 x65 +Ks^U ++1 p4 xA3 +c ^_ ^3 +c ^_ ^2 +c ^] $5 +c ^] $1 +c o1- +c ^2 $# +c ^2 $, +q *14 +*2AR3 +c ^2 $/ +$ns#$^M +{ o2d +*76-2RB +*A4 xA2 +-8x03xB2 +z3 o2b +L8 [ +Y4o4TL8 +^} ^1 +D9 o9e +c ^@ ^5 +i0usg& +x65 *7A +k .4 +sntr +*45Y4 +c $~ $6 +c $~ $7 +D5*64 +$+ ^5 +T3 T7 T5 TB +$+ ^3 +Y3 +2 Y3 +^9 o70 +$+ ^8 +} i46 +^& ^3 +x94 x47 +^& ^0 +^& ^7 +x16Y1 +*0As@y +o2b L5 +qi4h +c ^9 ^. +c ^9 ^, +c $/ ^7 +c ^9 ^* +} i40 +c $/ ^4 +^R x13 +c ^9 ^# +c ^9 ^! +c $3 $] +c $/ ^/ +o0l i2e i4- i5a +*04 p5 sik +x26$.*43 +Z4p1 +] *34 x67 +o0@ x24 +z3tx4B ++4 Z2 +s$[L4*89 +o1a i5i i6a o3t +o7Z c +c $3 $; +c $3 $= +^% ^8 +^% ^4 +iA2 *98 +^% ^2 +^% ^3 +^% ^0 +i35 { [ +^! ^2 +^! ^3 ++4 s92 +^) se. x03 +c ^= ^1 +c ^= ^7 +c ^= ^8 +c $1 ^> +,3 p1 +c ^1 ^= +*46 *3A +x21 o0T +szf*71sW{ +T2 TD TA +c ^1 ^+ +.1 y4 +*06 *1A x47 +c ^1 ^~ +c ^1 ^` +o15 -0 +l *54 +^o ^r ^u ^a ^m +c ^6 ^* +c $^ $9 +*24 o4k +y1 ^x x97 +^~ ^1 +$] ^1 +c ^2 ^$ +x18*40 +kK*82 +c ^2 ^- +c ^6 ^~ +^3 d +x97 Y2 x6B +o0p *45 +^0 ^) +i33 -2 +R2x86*90 +^0 ^* +x21 i5^ +^0 ^. +^0 ^# +^0 ^$ +i9V*6B*3B +^0 ^= +T4 TA TB T8 +^0 ^> +$6 ^_ +^3 ^) +^3 ^* +*90 *05 +^3 ^, +^3 ^- +y4 x26 o69 +i42 x91 +x02 y4 E +$=*B6[ +^3 ^$ +C-4x83 +$& d ] +u t $8 +^3 ^= +c $+ ^9 +y3*13svw +o0j ss1 +i9t iAc iBh +spydt +s0x k +o4, i44 +Y1 sb8 +c ^3 $+ +scGTA +$/ ^3 +c ^^ $9 +c ^3 $$ +sj2 +c x01 +[T2 +^3 ^^ +so^,BsTA +] o8y +r R4 } +*30 x76 +c $9 $[ +Y1*64 +s,% +}z4xA5 +c ^0 $2 +x23 z2 Y2 +c ^< $2 +c ^< $3 +x21 i1d +*07*B2t +c ^( $3 +o8u D4 +$` ^2 +*60 x53 +*71x34 +K o1v +c $] $1 +^Us<|[ +] *64 $a +c $4 $= +x48 f +-ADA-B +T0 T4 T8 T2 +K x61 *54 +x12 $h +i5m x03 +i5*s[. +o97 T0 +x41z2 +k +5 -3 +o3.x4Br +*07s&Z +$} ^0 +sdi *32 +^4 ^& +Z2$@ +c ^3 ^@ +^4 ^/ +p5 $f D6 +y4 ] x32 +c $= ^2 +c $4 $` +^4 ^< +c $9 ^( +Y4 *68 x42 +c $9 ^- +i0M o1a +^b $! +Z1 *24 r +d i81 +^i o57 +x12 $5 +$ D1 +K f ] +^v ^k +sjo*0B +R6 o1y +^e ^c ^a ^r ^t +$uL7 +^w x51 snX +sY2Z2s0G +^% K *01 +i8x D9 *32 +x02 ^T +K *36 +sm4 D2 +x18sP?z3 +^C 'B +xB5 iBi +x6Bx58 +*52 *07 +{ R0 z1 +.1 o4p +suJ-0*52 +$Ai9gz4 +o1+ t +o4k D7 +sjz K ^k +K o13 +x28 l +^7 ^` +c $? $4 +K xB1 +^o ^s ^e ^p +{R0 +c $1 ^} +$3 R2 +i4e i2W +o17 *14 +xA5 Z1 +sc- xA3 +^7 ^$ +L0sQ< +o4k o3o +[ o2- o0z +o0c sea +^7 ^- +^T t ^a +c $1 ^] +x13 c '7 +Z1 ^h +T1z4 +^h x23 +i32 p3 +c $% $2 +p1iBB +o5q,1 +z1x42$Q +Z5 k x79 +c $% $4 +]cy2 +u x64 +y2 x35 y5 +o1p ,2 +c $6 ^# +c $6 ^$ +c $6 ^% +c $6 ^- +c $6 ^. +p2 o2. +c ^` $4 +L4 r +c $5 ^% +c $5 ^$ +c $5 ^! +i2H c +c $5 ^- +*93 y1 x03 +Z1*63 +*25 x75 +.2 o4c +*B1ssVz1 +s3muz4 +f x19 +[ $1 ^p +c $5 ^= +[ Z1 R2 +x36^_ +K o4c .1 +^7 i20 i38 o16 o44 +c ^# ^2 +c ^# ^9 +c ^$ ^0 +x28sE3x38 +c ^$ ^2 +i4y .2 +c ^$ ^4 +c ^$ ^5 +c saw +c ^$ ^9 +c ^$ ^# +c $$ ^8 +c $$ ^9 +i9e iAr iB7 +i7<*1A +c $$ ^3 +sa>o9Z +c $$ ^1 +c $$ ^6 +c $$ ^7 +i5/x93x86 +c $$ ^5 +c $5 ^] +c $5 ^_ +o0c o41 o2q sg2 o1j +c $2 ^< +$J ^S +K .1 o4c +K Z4 *15 +y5'7T4 +i27 +3 +$z u D2 +*61*59} +-6i1j +L1 i3e +Y2 K x52 +$6 ^~ +o2t o3u +c $- ^8 +l $. $p $w +Z5x72Z2 +c ^9 $_ +] o2y o5q +c $/ $5 +$HT6 +Z1 x16 D5 +*82o2\*71 +c ^9 $$ +}s^Uy4 +o0c o1j o2q sg2 o41 +c ^9 $+ +c ^9 $* +T4 TB T8 T9 +x34 *01 *62 +l $. $p $a +*25 $r +[i5j +xB4 Y3 +^r ^e ^g ^o ^r +^k -3 Z2 +x1A $s +s ^7 +$> ^8 +c $2 ^+ +^c R4 +c $/ $8 +] o1u +^o ^e ^l +x53 $q *24 +xA3.5 +c ^% ^7 +^6 ^@ +*B2sam} +c ^& ^2 +sy%i1LDB +*34 x04 Y1 +c $2 ^0 +o2r *21 +i3Js8"t +$| ^| +c ^9 $? +$! x13 c +c $6 $; +L5 -2 +c $6 $= +c $6 $# +^s ^n ^e ^w ^o +xA9 xB4 +8 +o77s6$o4- +c $6 $( +c $6 $) +sn6 +c $6 $, +i3b '8 +c ${ $1 +c $8 ^_ +y1-3k +z5 *A7 +c $8 ^= +z3 i28 +s8sq +ui9Ux86 +z3 i26 +t*84^M +z3Ex41 +Z1 x03 $0 +T0 *90 +x03 s14 +y3 xB3 +c $8 ^. +c $8 ^- +xA1D2 +c $8 ^( +c $8 ^% +z1 *81 +TA T5 +c $? ^2 +xB8sMT +c $? ^0 +c $? ^9 ++5 d +siU ,7 l +^q k +$W*58 +T2 TC T4 T3 +^[oA@ +,6 Z1 [ +*3B[z4 +y2C +o1zZ1y4 +[ q z4 +z3 *65 +$EY3L7 +[ o1p i2c +c ^1 $( +r $i $o $u $s +[*78x4B +s9)^kz1 +.8 x13 ,2 +*A4i65 +.8i7hs"5 +^2 *40 +^0 $4 +c ^1 $% +c ^1 $$ +o0>*A7 +i1a i2b i3b +*70*A3sok +T2 TC T4 T6 +svJ +c $7 $, +c $3 ^. +c $3 ^- +c $3 ^* +c $3 ^( +sg=*79*60 +*79 *A9 +p5^O +x43 i44 +o6e o0t +*63 *14 +c $3 ^? +c $3 ^< +x27 '8 +$a Z4 Z5 +c $0 ^& +o5bD2.7 +Z5 x79 k +c ^ $5 +c ^ $4 +R9i7` +^9 C +c $0 ^( +o4r *42 R5 +*42p1 +x85x5BsAe +$*C +*56z1 +]y5.4 +*50*2B +y2 +7 *56 +T2 T7 T8 TA +c $0 ^8 +*73sf4T4 +Z3 *50 +c ^} $1 +D9 *61 +c ^! $5 ++5*61 +Z5 x04 +$s $d +c $_ ^3 +*51 *40 +d svt +c $_ ^0 +c $7 ^~ +^` ^1 +x92Z1 +c $7 ^_ +x86 $h +c ^= $5 +c $[ $2 +c $7 ^. +c $7 ^- +c $7 ^# +$[syF +c $7 ^& +K o1a +T2 T4 TB +x03 i4q i4h +xB8 ,8 +c ^% ^2 +Z2y5 +x09 D6 +*82spa +c $7 ^0 +x51 *02 o37 +sGOs07 +o8w*87 +^ws!B^D +Y2 u $B +y2 o8v x35 +i99 iA8 iB5 +x15Y3q +Y1 [ o2k +*79s9} +x9B x36 +^n r +i4t o5h ++7 +8 K +[ sj6 +^t i02 +$# ^9 +Y2x43} +c ^6 $^ +c $2 D4 +[ ] t +c $) $6 +T3 T4 T8 TA +D1i7_scA +c $) $3 +y1^J +-9 .A [ +c $4 ^` +sK" +o15 .2 $7 si0 $2 +x14 z1 z5 +c ^6 $) +T3 T4 T8 TB +{o3m +c ^6 $$ +i14 $9 i35 ss6 $3 +x39 i4# +c ^0 ^! ++6 p1 'A +o2O u +x9B 'A +u sVX +c ^+ $2 +*87C +snRo6$ +sj!s&6 +sHCskS +oBTC,2 +x5B [ -8 +L0 o5c +z2 .4 .2 +c $, ^2 +c $. $- +x96*06 +x7A z1 +x78 *25 +c ^0 $? +^6 ^! +c $8 $< +c $# ^7 +x2A x51 +T0 T3 TB T6 +c $8 $; +$, ^7 +$, ^6 +$, ^5 +$, ^3 +$, ^2 +^%*80{ +x23 $0 +z2 .2 .4 +i5N *56 +*A0xB8 +x61 D7 *34 +^9 ^. +^Ds|,*41 +$( ^3 +$( ^6 +c ^( ^1 +$ ^2 +,Ax2Bi9= +$ ^0 +$. $e $t +$ ^6 +c ^. ^0 +c ^% ^5 +i12 i27 +c $' $1 +^6 ^_ +^e ^y ^k ^s +T4sHE*63 +'Ax82T5 +sau *57 +i2rY2sj6 +c $ ^7 +^1 ^% +c ^0 $7 +$6 ^` +^qx31 +Y2 R6 +^Z u +y2 o61 +$6 ^8 +T0 TC T2 T7 +^I ^L t +$6 ^? +T4 TA TB T7 +$6 ^0 +$6 ^2 +$6 ^5 +$6 ^7 +c o86 +$6 ^( +$6 ^+ +$0 [ +$6 ^/ +*86s@3 +$6 ^! +C$[ +i4s x02 +T4 T7 T9 T5 +c ^, ^7 ++0s{8x08 +$$ ^! +*21Y1 +$$ ^( +^7 i41 i58 o6c o1c +D3*41Z3 +$$ ^3 +*21 x61 +u Z4 *27 +i71 i72 i83 +*27 u +c $= $& +c $5 $~ +c ^% $6 +x21sj\saM +x51 o0r +[ Z2 k +R7 ^4 +o0k s7c +iAP +c $= $6 +r*65 +c $= $4 +c $> $9 +*45sa3 +$5 ^; +$5 ^< +$5 ^= +c ^> $1 +ss2 t +x0B C +z2 +5 *31 +*24 x4A +x72xA7i0Q +^]} +^8 u +Y2 $B u +$5 ^/ +.9 q +] *28 +z1 o7n +$5 ^& +{ k Z3 +c ^~ $2 +c ^~ $7 +c ^~ $# +c $7 $= +x82 o60 +c ^! $. +s9ji3jz2 +$< ^$ +] i59 +$p u -5 +x42 $1 +i5fx31 +c $7 $) +T0 T3 TB T4 +o3s *45 +},A*09 +*84 x34 o6n +o2f +0 +c $7 $] +Y2Ei52 +*B2 +^@ u +c ^~ $~ +*A9 x17 +xB5 d +$# ^7 +$# ^4 +$# ^2 +}oABy2 +$# ^0 +k ^f x32 +o2a x71 +c ^& $0 +x01s[Si7W +c ^& $7 +^! C +i2f .1 +s&ys_9sRr +*50$m +$2 ^~ +c $( ^8 +c $( ^1 +c $5 $( +srp,1x47 +$9 ^/ +R3 i2e +$9 ^( +i34 -0 +$2 ^7 +q*73 +$z E +x63 Z5 xA6 +^O u +iBdi4O +dsW<^v +i14 i35 ss6 $9 $3 +*3A T1 +^3 i11 +$2 ^% +^b ^a ^c +*46x61.A +xA8}*B1 +E o2y +p2 c o2t +$2 ^, +x92sW{*37 +y5 o5b +x42 o2d +*02 -0 +*02 -2 +*07 *06 p4 +o10 D6 +o4z ,3 *43 +o6P E +x93 r +K D5 y1 +oAb { x52 +x7B *50 +k K *13 +C $0 $8 $9 +$w x43 +*79c +i9i x2A T4 +^t ^u ^p +C $2 $1 $0 +c $4 $8 $5 +x56 x1A +c $7 $8 $0 +T2 T3 T9 T5 +d x26 x02 +^=oB_,9 +^j x09 +s!wi9JoAo +D1 i5f i69 o2f R7 +,7 *B9 +s"^,Bx04 +y1y5s)s +o20 p2 +x03 *93 +d ^M +r $f $o $r $m +^D *85 +qx84*70 +$;xA5 +E z2 +R2 k +sg. *B8 +C $0 $5 $9 +C $7 $9 $3 +x87 k +lli0; +sRy*6BL0 +x29 } +c $3 $8 $6 +u $4 $8 $6 +K *40 c +i4g i5e i6r +iBL.9L4 +i47 *30 +*05 T1 +sIP +i3m L0 +^u D3 x62 +s.* K +C $3 $6 $9 +q p1 x7A +$d o0f +t p4 +z3*AB +C TA +}*08 +D8 z1 x15 +K i62 +x4Bs!k +] x91 +,1 so1 i28 i58 o63 +D4 z1 +T7 p2 +x36 z4 +z3 *45 +D0x23 +oDa +R9seK +x71 $. +K*10 +^2 x13 +Z1 +0 *35 +x02 $0 +C $6 $2 $7 +.4Y3 +D7T6*54 +c $0 $3 $7 +D4 xA7 +K ^a x25 +C $6 $4 $3 +i6l *15 sln +x71Y5 +l*A3^p +o49 i53 +o02 o11 +C $2 $3 $6 +x61 sjx D4 +oAl x72 +*53 o5z +c $5 $1 $7 +^4 i2b so2 sa3 o56 +T1 TA T8 T7 +sh. x93 r +*86 Y1 +Y4 o63 +o0p *20 +o4! p3 +x39*2A +z1 *48 +snk i1b +o3$ [ +p2 so$ +o0p *21 +*31 ,5 +C $6 $1 $9 +x31 D1 Y2 +C $9 $2 $8 +t x12 Z5 +T0 TB T6 T5 +sY} +x56 R6 +c $6 $2 $8 +c $7 $8 $1 +[ *2A +T0 T8 TA T9 +c $7 $6 $2 +^t sgc x69 +x71 ,4 ^s +T2 T6 TA T5 +c $5 $7 $1 +[ o74 +*26 *46 +*65 c *74 +i32 ,4 D7 +c $3 $5 $4 +C $3 $4 $0 +*65 oBr +C $7 $4 $6 +C $3 $4 $5 +C $6 $3 $8 +TBZ4 +T0 T8 TA T1 +o2v xA2 +*31 R0 p3 +i32 [ +x36*32 +-7*53 +Y3 x48 +$q p1 +sH!csMg +$1 *28 +$9 *16 +sTk +{ x46 x02 +x36 xA3 +t o5U k +*64 { +T2 T4 TD +d $s +x6A u +p2 x63 y5 +Z3 x91 o6f +o8t x31 ^n +[ ^4 i04 +x06skl +c $4 $6 $1 +C $9 $4 $2 +u $5 $0 $4 +*23 o4a +*87 r +^b ^a ^g +u ^V -1 +o8x ,9 +C $8 $1 $2 +}Z2k +K o3g +-0 ^m +K o3r +D4 *42 *32 +T4 T5 TA T9 +*51 ^n +i4y .5 +s!ox72T9 +skLi2u +T0 T8 TA T2 +o7g*97.6 +Y3 x41 i0s +u $9 $1 $6 +p3 -5 +$4 x32 +c $0 $5 $6 +Y2 o62 +o0e *10 +T6 $z +$^ +0 +sdk r { +r C o0O +x45 -5 +6 +som x26 +p4 -6 o36 +C $5 $0 $1 +D2 $7 +c $0 $8 $1 +ss" +-7 x81 +x85 y3 +f *96 x34 +szX +x73*A1} +^' .2 +,3 o2k +scb Y3 +i0- p4 +o0z *56 se0 $c o2a +T0 x62 o13 +o0O i3B +K *8A x26 +Y2 x02 -3 +iBNx21p3 +K } *45 +sZc +Y2 x02 -0 +*26x5B +q *21 +C $6 $1 $3 +C $6 $0 $1 +x02 o2z +*30 o0p +s^'x1AiA& +x24 x59 +c $5 $7 $9 +f T8 +x08 $? +x03 c y2 +C $5 $6 $2 ++AR4 +sWs-7 +x73 { +Y4 p1 +p1 *80 +u $4 $7 $3 +C $7 $4 $1 +z2.3 +p2 x5B +C $8 $7 $2 +C $0 $9 $5 +C $1 $3 $5 +C $1 $0 $9 +s*T +^T o6@ +z1*73 +^m x86 +*8A C +,3 *04 +Z3 o6f x91 +i9Y E +x92 o6b +x3B o4H +u $9 $4 $0 +i33 i54 $b si6 +C $9 $1 $2 +,2 .0 +{ *92 +C $6 $9 $0 +Z1 o3q +^u*96*18 +y5 ,2 +i7* ] +E sy1 +C $0 $1 $7 +^X o3T +C $1 $3 $4 +sKq +*03 q +y1 D5 +'B Z1 r +.3 D2 +^]sq8slL +$c Z5 +C $4 $2 $0 +^z o75 o3a o6u +k [ sau +o31 } +^a ^v ^e ^n +C $1 $3 $0 +x02 *10 D5 +*83 p4 x13 +c $7 $1 $6 +d x5A swU +i33 $0 +C $1 $4 $5 +y3 E x62 +i6uD0 +C $2 $5 $1 +$* x52 -3 +*36T4 +i33 $6 +o0j D4 +$f x54 T5 +c $8 $3 $5 +c $6 $4 $7 +uy1z1 +r i20 -0 +C $0 $1 $2 +C $0 $1 $3 +c $4 $2 $8 +T0 T8 TA T3 +o34 *43 x51 +sP@[y2 +c $8 $0 $6 +D0 y3 +c $3 $4 $9 +*92o9tE +c $6 $4 $1 +x96 k p5 +^o x21 +^S xA4 +x57 x19 +t R2 +i3a iAs +lo8`*0B +*65 *74 c +^rz3 +x5A *B6 +^o x24 +s58 +3 +xA2i8x*42 +c $6 $4 $2 +L7Y2*5A +$1 r ^3 +T0 T5 T2 T4 +k$}$k +C $7 $4 $5 +i10 ^H +^d x74 +C $2 $3 $4 +sDUR1 +C $7 $5 $9 +d swU x5A +x4A Y5 +x12 ^l +o32 s59 +o1A k +o1D u +L6 o0t +c $0 $6 $9 +o3g +7 +*06TAZ4 +y4 x25 $u +Y3 $F +i3i i4a i5d o8i +Z5 Y1 u +x57Y5 +R6$; +R9 *49 +x61 *52 +i3koAgC +Z1 *B8 +*80 *A0 +*16 *62 +Z5 u Y1 +x96 -6 +sgq +7 +Z1 *28 +st/ +T0 T6 TC TD +}*2B +C $9 $1 $6 +*A4Y2i7l +c $6 $7 $9 +^1 Z2 +sbo x03 +o60 Y2 +T0 TB T6 T3 +o4| [ +x7B K +y2 *56 +7 +o1o t +c $7 $2 $0 +x71 +6 +sAp .5 +o0h .5 +C $6 $7 $8 +Y4.6 +o0h .4 +$x T1 +o14 $7 +i3e R4 R9 +t +5 .6 +i8s i9h iA1 +i31 L8 +i13 R3 R5 +i79 R6 R3 +T0 TC T2 T6 +i1e L2 L0 +i1e L2 L3 +Z2 x21 x61 +i58 L5 R8 +i76 L1 L4 +i12 R5 R4 +T0 T5 T9 T1 +xB1 $m xA1 +i1d L0 L4 +i1c L5 L3 +i7b R7 R3 +i7a L4 L0 +i56 R0 R3 +i56 R0 R4 +i72 L7 R2 +i7a L4 L8 +i36 R4 R6 +i33 R1 R6 +i1f R1 R5 +i56 L2 L7 +i56 L2 L6 +E o5Y ] +i3f R4 R7 +i56 L2 L8 +i3f R4 R1 +i51 L3 L6 +i56 L6 L7 +i36 R1 R5 +i56 L6 L2 +i1d R9 R1 +i30 R2 +i33 R4 R5 +i33 R4 R2 +i3a L7 R2 +{ ^f +i3f R1 R4 +T2 T9 T8 TB +i17 R5 R3 +i13 R3 R4 +k i2 s4; +i11 L2 L6 +i74 R5 L7 +i3f L6 L1 +i11 L2 L1 +o1c o75 o69 o3j o5d +^a ^l ^o +i76 R3 R4 +i7a L0 L4 +i58 R9 L1 +$i *51 x62 +i73 L7 L8 +i54 L5 L8 +i73 L7 L2 +i7d L2 L6 +i7d L2 L4 +i7d L2 L1 +i32 L7 L3 +i3a R2 R6 +i5f L3 L6 +i55 R6 R7 +y2 *0B x8B +i73 R1 R6 +i55 R4 R3 +i7a L9 R7 +i7f L6 R7 +s&B*1B +i5b L7 L1 +o5e [ +i7e R1 R2 +i5d L0 L7 +K *47 .1 +*A9{q +i51 R6 L0 +i14 R4 R3 +i35 R4 R0 +i35 R4 R2 +^e ^t ^n ^a +i7c R5 R6 +i75 L2 L3 +i32 L6 L3 +i5a R2 L3 +*91 p5 .B +i33 R5 +i3a L0 L5 +i79 L7 L9 +T0 TE T6 TA +i5c L1 L3 +i3b L7 L1 +i3b L7 L6 +T3 TA T5 T7 +i75 R0 L6 +i55 R7 R6 +i5e L7 R2 +i54 L3 L6 +i3f L2 L0 +i3f L2 L4 +i3f L2 L7 +T1 T4 T2 TC +i74 R6 R5 +i18 L4 +i18 L5 +i72 p3 x83 +i75 L6 R0 +i7d L6 L2 +i32 L5 L3 +i32 R2 L4 +i5a L0 L2 +x83 $2 +i71 R1 L5 +i38 R4 R6 +o0H +5 +i54 L7 L5 +i19 R7 L5 +i54 L7 L8 +i3f L1 L5 +i3f L1 L6 +i3f L1 L7 +lD3x16 +i38 L9 L8 +T1 T4 T2 TA +i79 L3 L6 +i79 L3 L2 +i1b L0 L4 +i7c L3 L1 +i7c L3 L0 +i7c L3 L6 +i7c L3 L4 +i12 R6 R3 +i7b L8 L9 +i39 L3 R1 +i15 L7 R5 +i3b R1 R2 +i11 L6 L2 +i3a R5 R6 +i39 R5 R0 +i7a L4 +i53 L3 R2 +i5b L2 R5 +sL +x16 x53 +o5d y3 +[ ] c $X ^X +[ c ] $X ^X +*45 y1 +[ l ] $x ^x +[ ] c ^X $X +[ z4 $f +y1 .4 *34 +*51xA6c +r { -1 +i6d i7r i8e +x21 ^w +*13 i2v +o6x .7 +} Z4 +p3 ,A *01 +i7l i8o i9l +k ^e +p3 *01 ,A +i52 ^4 +Z5 Y2 +o0e D4 *01 +i53 xA6 +p4 D3 +^B o1l +z1 *47 +sr,D3*2A +Y5 x74 +,8x26 +y2*75D0 +s5]f +sxg x76 +slp -6 +.0 iB_ x26 +*21 -6 +s5)o3! +} y3 *78 +o0c *15 +x61 +2 +T2 T8 TB T6 +z1 f x7B +*81 x49 +Y4 *78 +^x o2_ +x32 i5q +T0 o44 +y5 k +$) Y1 +,5 i5b +*26 $e +^k .2 +y4 o6o +x81 o5e +Y3 i0s +*63 $s +*34 y3 +i68 +4 +.6 Z4 *97 +o0i $f i32 sa1 o2w +D6 o8a +^b x24 +$n *32 +o32 c +E -B +i7B i4@ +i4y $9 $7 $1 i6s +o60 +8 +y4 *76 +szC.2$R +d p1 ^r +*60 x32 +T0 T5 T1 T9 +f *A6 x8B +-2 *42 +y4 +9 +*57 ,3 +p5 Y1 ,6 +*68 x25 +} i6n +z5 R8 +d ^U +^7 +4 +i1_ r ^' +r *12 +-7 .4 +*25 Y5 +oAh ] +k i82 +C q x12 +l $. $b $i +x92 o3w +o8e ^* +o63 [ +.6 *96 +o7e C +*24 -0 Y3 +*64 y4 +D9 san +R8 K +d *4B +-7 *BA -7 +$p $_ +x14 i0n +R5 i9t +q x0A +i5_ t +*43 $0 +i7a i9d i8n +o0p $' +p5 ,6 Y1 ++6 ,4 +o0h shk +o0r y1 +x03 y4 +'8sWh ++0 *72 +o3W d T3 +$2 -2 ++2 y3 +o3m Z2 +l D4 -2 +*60 *20 +{ o8Y +D9 x61 +i6U } +$1 T6 +[ $D +,7 x89 +-6 q +p2 xBA +$= $f +$. $z $a +y4 xA5 +D8 K +o4q Z5 Y1 +^o o3i i7a se_ +$q x61 k +y1 $7 +D9 i6= Z2 +s0H Y3 +*50 ,2 +o0k o4u o2i i5c o7c +i3y $o +i34 R4 R5 +Y5 ,6 +-7 o0w +$Z } +o5l [ +K f x24 +p4 $6 ${ +$F z2 +x28 i2g +D1 ,4 +o15 i49 +o6f [ +o3s o6r +T3 T9 T6 T8 +*65 ,8 +T5 +2 +s4x +Y2 x23 $/ +R5 Z3 +^4 *04 +] o3X +^p *40 x73 +x78 $3 +R7 ] +*24 Y3 -0 +x31 Y2 +*6B x93 +^R +3 +Y3 *81 +Z3 o7c +o0w o4s +o3G sr9 +*97 +4 +-7 -7 *BA +slw p1 +p5 o5T +K ^# +p3 x81 i70 +x47 Y3 +xA4 x52 i7W +$1 .4 +x15x69 +o6a Y2 +$b x5B { +i8e i9r iA3 +D4 o06 +*06 -7 +T1 x73 +p5 o0y +5 +syr +K ^| +i7e $T +x93 z1 +-A E +R1 ^J +x12 ^u +$. y5 ++7 p2 +o6y *64 +p1 *8B +o5s Z3 +[ *01 x23 +Y4 o9a i9s +k *03 +$0 x52 +T2 $& +L7 o5_ +y3 'A +p3 i2p +*51 ,3 ++6 Y4 +[ i0j +$y *38 +$A $H +D1 $n ^j +D0 xA1 +i8w Z2 [ +[ x23 *01 +T3 T9 T6 TA +p5 o5u +x07 Y3 +Y2 $/ +p3 +5 Y2 +y1 x43 +$_ D8 +*60 x61 +$. x51 +z3 *72 ++5 +2 -3 +*52 Z5 +Y2 D5 *43 +x38 y3 +$d $y +p1 i5/ +D8 -7 +Y2 $S +f x84 xB9 +x32 p1 T6 +x19 *08 +*43 x03 +x03 z2 +$1 *42 +x46 $r x4A +*52 -6 +x04 Y5 +*04 o4o +Z2 x63 .2 +D7 ^c +*67 Z3 +l -2 D4 +.6 o4g +.2 s52 +o4q Y1 Z5 +y2 *51 +*15 x57 +D5 Z1 +o82 ,9 +^F 'A +y5 +7 +Z2 y4 +y4 -4 +iBg*71D2 +*27 Y3 +^c *47 +o58 +4 +*01 TA +iB! $J x84 +p3 Y2 +5 +x71 +0 +^! -7 +$7 xB1 +y4 $D +*25 x42 +x01 K d +o0_ $_ +i61 o70 +.1 i3w +0 +x51 'B +Y1 s16 +*07 i4_ +i6f $R +,3 *69 +x51 i60 +*B4 x64 +se" ] +c k .0 +y2 T7 +*12 i8l +t $$ +z1 ^- +.4 y4 +.2 *20 +x91 i0z +R6 o5k +x15 ] +d xB5 -9 +Y2 i6o +[ x06 $2 +sS3 l +s32 y1 ++9 *80 +x21 ^8 +i1c x23 *64 +x32 *27 +y5 xA1 +Y4 y3 +y5 ^h +i0@ x42 +[ -2 y5 +.B oA3 ++A +5 +o0g R1 +*34 y5 +l $m $e $n $t +p1 ^d +*78 x24 Y1 +^a *A2 +Y1 +5 *64 +*54 i8D +$q k x61 +x81 o4d +sws +*78 Y1 x24 +i3T E +T2 T3 TD TB +*83i6Qx57 +*45 i7m +.1 +0 i3w +y2 *05 +k i1c +srA K +s6d { +Y4 snw +*18+4i0t +Y5 y3 'A +*42 D3 +L6sSe ++8 sfg +Y2 ^j +Y2 ,6 +$u i54 +i0.sR@ +*73 x45 +*56i7X +^E ,2 +R0 { +i8w [ Z2 +E Z4 Y4 +z3 z1 .4 +d -9 xB5 +syh +^p ^X +su3 o79 sk8 sa0 o5k +-7 i7O +D1 ^j $n +,5 ^9 +*21 Y2 +Y4 x14 ^J +i7d $4 +E i7W +.4d +y3 o3t [ +*20 *45 +x45 x51 +$a -7 +Y1 *64 +5 +y1 *03 +o7d x81 p2 +^, Z3 +srb ^, +$1 iBD +Y1 x43 +Z2 -B +E iAx +*15 D2 +'A R4 +T0 T3 TC T1 ++5 $> +Y2 } *01 +,4 i4J +o5M *46 +o4s Y3 +Z2 z1 +Y1 ,1 +p1 $% +Y2 *A8 +Z2 *07 +] xA2 +*86 *23 +Y3 L0 u +i5w Y1 +^p x73 *40 +o0k *31 +xAB c +o84 *35 +o41 -0 +x63 ^' +cxA9 +*30 x27 +Y5 scn ] +z1 *21 +Y2 +B +o5p T4 +Z1 Z5 +i1k$M[ ++9 *37 +T6 TB T7 TA +x41 o40 +$y $h +o3g K +Y4 ,3 [ +i5O $o +$u ^m +xA2ss(s,/ +Y5 ] scn +p5 [ .3 +*05 i1f +x85 .2 +c x72 +i8j +8 +T2 T4 TB T6 +i0k r +K i9. +o7f -6 +y3 o8r +^[ *56 +T3 T4 TA T6 ++7 y5 +o4" s"f +'A ^, +t iA_ +o11 x42 +-2 D4 +y5 x49 +$q k l +.5 *31 .3 +i5b sex +Y4 $8 +c i0P +^B ^J +$z i6b +*96 x17 +iB! x84 $J +f $0 +o1a x01 +o1c o69 o5d o3j o75 +*A7 x84 +i1. E +*35 *42 +$Idx39 +*0B x01 +^s o44 +*10 o42 +y4 x63 ++0 ^s +^' Z1 +Z5 .A Y2 +Z5 Y2 .A +D9 Z2 i6= +*50-A$b +o0n *24 ,2 +o4. p3 +.5 D4 *26 +y2 ^a +$h l T1 +{ .2 +{ .1 +i7- *37 K +x79 y4 +*41 Y4 +i00 K ++6 k D4 +^j ^A +*75 x02 +] T0 ] +o0R -9 +,2 i72 +i6r i72 +K ] Z1 +D6 *54 +o5m Z1 +] ] T0 +,8 -8 +i62 *12 +i2d ^2 +d x68 +p1 *83 +*B7s1G +c ^5 ^4 ^9 ^1 +c ^k +*A6^{TB +si| +c ^g +r $f +c ^2 ^7 ^9 ^1 +y3 Z1 D5 +sV^oAy +i51 i69 i87 i78 +'6 i32 i24 i40 +i12 i31 i41 i20 +l *92 +c ^j +$7 o0k smc +r i0r x12 +x34 *62 *01 +i8;s|? +c $n $e $t +$'sgE +L9sIb +o2S E +o1l [ +'AT3 +D2 DF +x4Ak*62 +i1l i2o i3v +k +6 -3 +q xA3 +$q l k +^p z3 +i7f i8e i9b +.0D3 +xA3oA. +i02 i35 i10 i20 +i0' o04 +x08 -4 spi +x17 x45 +DB DF +D8 DG +c ^n +o52 *56 -4 +*03 *67 ,3 +i82 i90 iB0 iA1 +$k x52 +i11 i29 i41 i36 +Z5u +u $1 $9 $7 $4 +i31 i57 i49 i68 +i31 i57 i49 i65 +] ] $4 $2 $0 +i01 i28 i38 i19 +'F $8 +'F $9 +'F $0 +'F $1 +'F $2 +'F $5 +'F $6 +d 'A iA4 iB2 iC0 +-0y2 +i42 i50 i72 i63 +i22 i42 i30 i53 +i21 i49 i39 i57 +D2 DA +i31 i59 i49 i66 +i31 i59 i49 i65 +$g.3 +i12 i33 i20 i40 +i01 i19 i35 i29 +D4 DA +D4 DE +i4v '9 +D4 DI +x42 .9 +*ABx25 +*16 *69 +i6r i73 +c ^d +i22 i41 i30 i59 +i22 i41 i30 i54 +i22 i41 i30 i52 +i32 i51 i40 i67 +i01 i26 i19 i37 +i01 i26 i19 i36 +i4o *31 +$S*90Z1 +r i31 +i32 i62 i40 i51 +T0 T3 TD T2 +d 'F $6 +T0 TA T4 TB +*32 x61 +E,B +o1E E +d 'F $0 +^7 *43 +y2 D4 k +L3Z2.3 +$6 x82 +d 'H $3 +d 'H $4 +y3y4sTa +d '4 $7 +x0B x87 +p3 y2 +s6n +$" i7! +*31 o2l D4 +x51 x63 +T3 T4 TA T5 +sO* +s06T6*40 +i31 i58 i49 i69 +i31 i58 i49 i63 +T2 T4 TB T7 +i31 i58 i49 i61 +'7 i24 i40 i32 +i62 i81 i70 i99 +'S $8 +{ $4 $2 $0 +i22 i30 i50 i40 +i22 i30 i50 i42 +i21 i39 i50 i49 +i02 i20 i30 i10 +DD DC +x24sw*s(_ +i12 i31 i20 i49 +i42 i60 i50 i78 +i12 i31 i20 i42 +i12 i31 i20 i44 +dxA4 +i42 i50 i76 i60 +x46 x4A $r +i12 i20 i44 i31 +d 'G $3 +d 'G $2 +T2 T4 TB T8 +d 'G $4 +-0Y5xB5 +-2 o1e +'4 $0 +iBd x17 +K o3e +6 +sei x82 +$n*04y3 +.2$V +-2 x53 z2 +i01 i19 i36 i26 +i32 i52 i62 i40 +i12 i20 i48 i30 +i12 i20 i48 i32 +i42 i50 i71 i61 +i11 i39 i29 i42 +i11 i39 i29 i43 +i11 i39 i29 i44 +i11 i39 i29 i48 +'6 i42 i34 i50 +i11 i29 i41 i37 +l $e $t +i32 i40 i52 i63 +k ^b *13 +Y3 xA3 +x17 [ +o4n { +i02 i10 i33 i22 +i22 i30 i57 i42 ++2 x01 +D7 DC +D7 DF +D7 DG +T1 TA T5 T9 +i01 i29 i19 i32 +i01 i29 i19 i33 +i01 i29 i19 i31 +i32 i52 i40 i64 +i32 i52 i40 i62 +i32 i52 i40 i69 +$1 x04 +i01 i19 i31 i28 +i41 i59 i72 i68 +i11 i38 i29 i45 +i11 i38 i29 i41 +i11 i38 i29 i49 +DN +k *67 +o2u r o1d +x79i4g +z4 *28 x62 +o1c o69 o75 o5d o3j +o64 $0 +i52 i71 i60 i80 +i73 i85 +i21 i39 i52 i46 +i02 i10 i30 i21 +i02 i10 i30 i20 +i02 i10 i30 i23 +i02 i10 i30 i22 +'E $3 +i1u y2 +i12 i20 i40 i33 +i22 i40 i50 i30 +^w +6 +^m o1g +i01 i19 i32 i26 +c o49 +^Y { p5 +,9 szm +i4# $i *67 +x04o3} +i52 i60 i83 i72 +D9 DB +x04Y2-2 +ssc ] +r x53 +0 +o49 ^g +o0s +5 +i22 i30 i58 i41 +i32 ] +D3 DB +[ [ ^0 ^2 ^4 +i73 i84 +i32 i53 i40 i61 +x14 +4 K +'6 i44 i60 i52 +i51 i78 i69 i84 +i21 i47 i39 i57 +i22 i43 i30 i50 +i51 i77 i69 i86 +i32 i40 i60 i51 +i12 i32 i20 i48 +i12 i32 i20 i44 +i73 i87 +i01 i28 i19 i38 +i01 i28 i19 i33 +i01 i28 i19 i32 +i01 i28 i19 i31 +i01 i28 i19 i30 +se1 st3 i32 o75 sl7 +i01 i28 i19 i36 +i21 i39 i47 i53 +i51 i77 i69 i82 +d 'H i94 iA2 iB0 +'8 i04 i12 i20 +i01 i19 i37 i26 +l $. $l $s +^0 ^2 o3e i6i $r +i52 i60 i86 i71 +i02 i30 i10 i23 +i02 i38 i10 i20 +i02 i39 i10 i20 +i31 i49 i65 i58 +*32 k i0s +^i *70 +l $1 $9 $6 $2 +*23 -2 *25 +l $1 $9 $6 $7 +Z1 *52 K +i5i D1 +o0v *54 ,4 +'7 i54 i70 i62 +i11 i37 i29 i48 +i11 i37 i29 i40 +d 'N $1 +i01 i19 i30 i29 +i01 i19 i30 i28 +Z1 $7 x03 +i8a i9n iA1 +*07o8( +^e ^e ^f +$"*A1 +i42 i50 i77 i61 +i41 i67 i59 i72 +i41 i67 i59 i74 +'6 i12 i04 i20 +i12 i31 i20 i41 +x17L5 +*13 +4 *15 +i01 i19 i33 i27 +d '7 i74 i82 i90 +i21 i56 i39 i49 +i1a o6s sp6 $e o32 +o5Ix34 +i32 .5 +o6k *64 +i02 i10 i32 i20 +T3dsB" +i01 i26 i36 i19 +$e K +i22 i30 i42 i59 +o5a f x0B +o3s i4w +i22 i30 i42 i54 +i22 i30 i42 i53 +i51 i77 i69 i89 +{ { $4 $2 $0 +i01 i19 i39 i28 +T0 TD T8 T3 +i01 i19 i39 i26 +Y1 *75 x23 +i42 i61 i71 i50 +i32 i40 i66 i52 +i32 i40 i66 i51 +d 'G $0 +i32 i40 i62 i52 +i32 i40 i62 i51 +i02 i10 i39 i20 +i02 i10 i39 i21 +i1a $e sp6 o6s o32 +i11 i29 i40 i38 +xA7Y3i3x +o2v ] i3k +x82 o0j +s7j +'7 i72 i64 i80 +T0 T7 TB T4 +x0Bi7% +L2y1 +xB5 x01 u +L0*A5 +T0 T9 T5 T1 +'B iB4 iC2 iD0 +i32 i50 i40 i67 +i32 i50 i40 i63 +i32 i50 i40 i68 +DA DB +i21 i48 i39 i55 +i32 i40 i68 i50 +o1a i6o o8k $a o5m +i51 i76 i69 i80 +i11 i29 i48 i37 +i5E +6 c +DE DD +i12 i20 i43 i30 +i41 i66 i59 i72 +i41 i66 i59 i78 +iA8x1A +i41 i59 i79 i66 +'6 i54 i70 i62 +i42 i61 i50 i74 +,7o1g +i42 i61 i50 i71 +'7 *16 i2H +i42 i61 i50 i78 +i01 i27 i19 i30 +^e ^e ^d +i01 i27 i19 i33 +i01 i27 i19 i36 +$ny4*B8 +i01 i27 i19 i39 +$1 D3 x31 +i11 i29 i36 i41 +i11 i29 i36 i42 +i31 i59 i69 i49 +sd8-A +r i3n x63 +Z1x79x78 +i32 i40 i67 i50 +i32 i40 i67 i51 +d 'L $8 +i02 i23 i10 i30 +i1c D4 +d 'L $5 +o1d o5b se2 i63 o77 +[ $x ^x +Z5 *96 +i02 i10 i37 i22 +i02 i10 i37 i21 +x42 o4p +i42 i50 i75 i60 +i9e [ *87 +i02 i22 i10 i31 +i02 i22 i10 i30 +i02 i22 i10 i37 +*21 y2 +i02 i22 i10 i35 +i02 i22 i10 i34 +T1 T7 T8 TA +T0 T7 T5 TA +Z2 q +i01 i32 i19 i29 +i51 i79 i69 i82 +i51 i79 i69 i80 +i51 i79 i69 i84 +i31 i49 i68 i56 +o0H *15 +i22 i30 i43 i51 +i2!l +o25 i61 +d 'I $7 +o5r ] +o23 +5 +i31 i56 i49 i61 +D4 o0p ] +i31 i56 i49 i69 +i02 i10 i35 i20 +s7i +'6 i14 i30 i22 +sSp +i62 i80 i70 i94 +d '7 i34 i42 i50 +*06 *50 +o61 *20 +,6 [ Z1 +i12 i20 i41 i30 +i12 i20 i41 i31 +i22 i40 i30 i50 +i42 i62 i50 i71 +i22 i40 i30 i56 +d 'J $4 +d 'J $5 +y1 x43 *31 +,1 o0D x86 +i7Wo9%o9N +i22 i30 i41 i53 +q *74 x7B +i32 i40 i65 i50 +i32 i40 i65 i52 +i31 i59 i49 i69 +c $9 $2 $3 +T5 TA T8 T9 +i01 i19 i38 i29 +i01 i19 i38 i28 +*B6di8a +[ ^x $x +s2g +i21 i39 i58 i46 +i41 i59 i78 i67 +i22 i30 i56 i41 +i2v i3e i4m +i32 i40 i61 i53 +o0w k +i12 i20 i30 i47 +sx1*30 +d '4 $2 +x09 *29 +i41 i59 i74 i68 +oB@x49 +^fksj2 +i21 i39 i57 i47 +{ $0 $4 $2 { +^E o4e +i42 i50 i71 i60 +Y5Z4 +]$@o3h +x03 $c +l i3/ +*31Y1o0Z +o7] i4. +i51 i69 i81 i78 +*93 '4 +i01 i31 i19 i27 +s$yi1H +z4 Y5 +o99 x35 +*20 s9! +c $i $s $e +x34 som ssm +*05 R1 +} o3R r +T1 T8 TA T5 +qx9As\4 +s@s +x07 +5 +o0/ z5 +R8}x51 +sUZ*80 +z1 o0a } +x05 R3 Z2 +$) x71 $$ +i02 i10 i31 i22 +i41 i59 i76 i69 +y2 *42 +l $o $r +i02 i21 i10 i34 +o5o x02 +o2CiAns8J +i02 i21 i10 i32 +i02 i21 i10 i38 +sav R4 +i02 i20 i10 i30 +s'l +$v $7 +o0i i32 o2w sa1 $f +i02 i20 i10 i39 +d '5 $9 +'4 i3t +d '5 $7 +x32 i3b +D6 DE +D6 DB +x32 i3x +T1 T8 TA T7 +u $8 t +o6=$>*4B +i21 i39 i56 i47 +i51 i69 i80 i78 +o15 i5g $7 o3b +d 'J $8 +Y3 t x02 +d 'J $6 +.1 *32 +o5& *87 +i82 iB0 i90 iA1 +i21 i39 i54 i47 +i4v x45 c +i01 i19 i34 i27 +i01 i19 i34 i26 +i21 i39 i54 i48 +[ ^0 ^2 ^4 +i21 i47 i57 i39 +i1t o2w +i12 i20 i32 i43 +T0 TC T3 TB +i16 sy4 $h o2j +i01 i29 i19 i38 +Z5 i2P +$2 i31 +i31 i49 i69 i57 +i31 i49 i69 i58 +i31 i49 i69 i59 +Y4*1AD9 +Z3 *49 '6 +snX c +] $. +'B Y5 x06 +x12o0p +x23 *12 +}L0 +i0s$a +.6tR5 +E s08 +{{{{{{ +x14d +*15 *45 +o4ax21 +i01r +*54-4 +*50x23 +i9OLB +o1ox25 +z2 x04 d +x92 D7 +'5^b +] *40 +srg u +x42d +i3sx43 +o4xc +^gx23 +x24^g +s)No6} +*85sj@ +'7D4 +x02+2 +x51 -3 +x54o4/ +$g$o +$sx43 +xB9 xA1 x34 ++9'A +Y1 x74 $@ +-0x13 +Z1$Ox9B +x03^g +-3*43 +l+5 +*23*05 +'6^G +^K^J +{ '6 +x9BxA8 +^o} +cx53 +$5x51 +*3Ax24 +*35*24 +x05r +'B x06 Y5 +Z5 x38 +y2 x46 +$s$u +[$9 +L4x96 +^Z L0 +x73 ^m ++4x03 +*74*65 +x72 i7g +$3c +co90 +{{ +o1mD0 +$s$1 +-7x03 +^5 R2 +l $2$0$0$3 +$7 o84 +xB1 l +^h y1 +y4 +7 +-B iA6 +^d E +*04x28 +i6e +7 +i5a L4 L6 +Y3 Y4 +i2p x42 +*12 *43 +k *30 *23 +sa3 x38 +o54 p2 +*60 i0t i0g +*01 y2 +i5a L6 L4 +C i1q +R4 p4 +p4 i73 +'6 .2 +*02 +2 +y5 y5 +*78 t +*24 o76 +x34 Z3 -3 +*10 o08 +{ *95 +o0b $b +o3P r +i13 *04 ++5 $z +.5 s06 +*40 E ++B *20 +$V x23 T0 +x08 x15 +$V T0 x23 +] *30 +x37 Z5 +l $. $f $i +u $7 $8 $3 +d u '6 +d u 'C +.6 Y1 *20 +c $0 $4 $9 +i64 i80 i72 +o3i *76 +u k x32 +u $5 $2 $0 +C $8 $6 $0 +i1a i3e i2v +*B0 u +C d '5 $4 +o0i o2w sa1 i32 $f +u $7 $3 $5 +i9i iAr iBl +u $7 $5 $8 +u $0 $9 $7 +u $5 $9 $0 +u $1 $6 $5 +u $0 $6 $9 +u $2 $3 $5 +$3 D1 +C $2 $6 $8 +u $3 $0 $9 +u $2 $5 $7 +u $9 $3 $7 +u $1 $0 $8 +o12 *43 +u $9 $2 $8 +C $6 $9 $7 +T1 T8 TA T2 +$0 o30 +i0h i1e i2a +u $9 $6 $3 +d '6 u +[ $7 i08 +u $3 $5 $7 +f ] x37 +x21 *04 +c $6 $2 $4 +u $1 $3 $0 +i84 x42 +d 'C u +u d '5 $4 +y1 *31 x43 +c $a $s $e +u '5 $2 +} i3N +C '5 $6 +]oAa +x37 o0V +} i3G +x96 z4 +{ Z2 R5 +x93o8vi5S +o9!x7B +L0 x14 u +^e^5 +D3kx69 +*15i5D*50 +*10s37 +x93 R5 +o2c z2 +o6Tx1A +oBm *A7 +^k si3 o6d $3 +2 +x81 ,9 +y3*74t +x38 o3v o2p +y3sq)s'Q +i1i i2e i3r +'As!v*94 +p2 sx) +i7'sw# +*13$g+6 +i2c o3k +o0k -5 +] i61 +.4Z4o01 +o0i $f o2w i32 sa1 +o0z *56 se0 o2a $c +sb0 +0 +4 +^n z4 +{*89sx+ +$6 r +5 +L2 ^b +*78o7W +^` L0 +-1rx68 +l^d^e +x4BxB1 +i3z z1 x03 +ss%*78*97 +o5. T4 +Y2 *15 *76 +l^f^c +l^f^a +l^f^6 +Y2 o0t +$_'BY1 +l^f^2 +l^f^1 +l^f^8 +l^d^4 +l^d^1 +l^d^0 +^k i2G +l^d^2 +l^d^9 +l^d^8 +r f x59 +iC4iD2iE0 +i7r i8r i9y +l^1^a +T5 T7 T9 T6 +l^3^f +} f x69 +l^3^e +l^3^9 +l^3^6 +x46 *56 +l^3^4 +l^3^5 +K[i2f +y3*91sG" +*4A x07 +sJe Z2 +D2 i12 +x12 ^[ +x12 y1 i0z +o0T D5 +'A i5" o5n +^a ^n ^u ^t +l^9^5 +o0m i1e i3c i4s i5c +x86*16sz> +i0n i2t i1a +i5/x91 +l^9^3 +l^9^8 +Z1 o2p +x51 ^d +l^7^9 +[ $u sez +l^7^3 +x45 $5 T0 +Z5 x75 D5 +l^7^6 +^v $a +l^7^5 +*18D2 +ui7o^H +y4 x76 R3 +l^5^5 +{ x79 sfx +l^9^a +i68 [ *31 +l^5^d +l^5^e +l^7^b +l^7^d +l^7^e +,5 t +Y4x2B +l^b^9 +l^b^8 +l^b^2 +l^b^1 +x13 Y3 D4 +o9x ^` +iB1 iC9 iD5 iE2 +T4 TA T8 +l^b^b +p2 'B +^I t +i5e i66 +l^b^d +l^0^c +l^0^b +l^2^c +l^2^b +^E s6A +l^2^e +l^2^d +l^2^9 +l^2^8 +*45u +l o7K +x43 D8 $4 +l^2^7 +l^2^6 +l^2^5 +l^2^4 +i8F*AB +*87 xB6 x41 +R6 $z +-2 *41 +,0x75 +o2* x01 +T5 T7 T9 TA +l^8^3 +l^8^2 +*74s+n +x32 o2j +l^8^9 +z3 o5b +l^6^7 +d $a $n +l^6^5 +l^6^2 +c o2b +d $a $l +l o7` +R8 x43 x32 +l^4^3 +$duD2 +l^4^9 +-2*04 +l^6^e +l^6^d +x53 *24 $q +l^8^c +l^8^b +l^8^d +$? L4 +sPU x21 +o0y .2 +l^4^d +-7 o2a +i1l E +l^x^x$x$x +*10 o2h +i94iA2iB0 +si) +^e ^d ^a ^b +*18] +*30 *20 +c o0S +R5 i60 +l^a^5 +l^a^1 +l^a^2 +p1 x02 o1- +$I $p x08 +l^e^1 +l^e^3 +*03 o3x +l^e^6 +x67*2Ai4^ +l^c^6 +l^c^7 +T1 T6 T7 T8 +l^c^5 +l^c^3 +l^c^1 +L5 { *30 +k i15 +l^c^e +l^c^b +sxn*08 +i5e i7s i6r +xB8o0) +i2e i3x i4a +s2v +t o94 +y1p1 +l $. $f $m +o0i sa1 $f o2w i32 +*53 o5v +i64i72i80 +k o4_ D5 +l o44 +o43 i65 +*31 i1l +L8 R9 +sB; +*25 syA *17 +x52 i3x +*28o3hi6i +*73 *72 C +srW C +$A T2 +xB1 *86 +s5F +x34 k +D1 -3 '6 +^a ^m ^a ^k +*48 T7 +x1A x5B +x34 ssm som +i5a i6n i72 +T1 T9 TA T2 +} ^F c +i9v{ +{ sfx x79 +p1 x74 +s,.s]g +^z y4 +i3j o2D +sg= +sGW +z3 o3r +5 +p1 *30 +oA5 T0 +z5sR( +Z2 i6z +i1a i3e i2t +x56 ^r $b +i2o i34 i4b ,7 o9a +z3,9$5 +d Z3 ++3 o5b +o1d o5b i63 o77 se2 +i0Fsi|i8L +i7c x01 x32 +]'7z5 +,Bp5 +i16 $q sr8 i3i +o4m $5 +^J $k +y2 y1 +RB*48 +sneiB9K +p5 Z1 { +'6 ${ +t i1, +-0x7A*16 +c D4 $2 +$h x6B +x64 Y5 i3g +{ i29 +o9k^"C +rxA1^o +p2 i8M *B8 +^$szo +*40^G +x32 d ^s +s?- $e +i5/ f +c ^i ^t ^n ^a +T0 T5 T4 T2 +R5 i2o +$a c k +o0w sf4 o6p o4v +2 +^lY1 +s'3s&# +D3 x43 +sv.z1 +Z2 *31 r +x4Ao1q +*73 C *72 +^@ ,B +x12 o5, +p5 *92 ++8 *B1 +*62 i8q +^0 sm0 ,6 so0 $6 +^0 so0 $6 ,6 sm0 +o5H d l +R9s$Gi7/ +Y2$4 +R6 z2 *17 +^0 $6 sm0 ,6 so0 +*01 d $k +,1 x86 o0D +y5 +B +x67z1 +T3 T6 TB +sh_ z4 u +i4f p1 +o1a o5m i6o o8k $a +x8B *62 +^e ^e ^p +,2 i8f +$w x67 -4 +x01 i54 +xA4 D9 u +^k $3 o6d si3 +2 +t D4 sLA +*87 E +s"wT4^I +T0 T4 T6 T1 +s5. x23 +sVT +xB5 u x01 +} r o3R +se2 $4 o3f o59 sc0 +R4 x63 +*43 o2X s3B +T2 T7 TB T4 +*43 s3B o2X +t*63C +} *50 K +z4sK| +x31 ^^ +-7 i8+ x06 +*52*B2 +p1 o7h +*83 r +sxko6;$G +o3e sRK +i3o i41 i52 +D4 +2 +ssc *09 +c ^t ^f ^o ^s +s7q x48 +[x82x94 +y4*12s[3 +s_e +'6 $$ +$8s7. +sd *50 x13 +f x02 +o1SsEX +L1 -4 +i3K T0 +t L7 +^n ^o ^j +Y2 $' +i7/*97 +T0 T7 T3 T1 +*80 *38 +i2r i4n i3i +s[z +x19 +1 +o4{ *24 +*25 z2 x41 +sh_ u z4 +o0qZ1 +tss- +s.0z4z2 +$# ^J +[ i21 o62 ++4 i2P +*53 u +^n ^a ^c ^e ^p +z2{ +K *8B +x35 Z1 +s8\ +shP C +*B5i3x +-1 d +i4C '6 +o0u $9 i18 $5 $8 +sX& +shy L6 +*38{ +l L4 *23 +*5B ] +sxv +6 +x14 ^q q +T3 T6 TB T7 +K o3f +i0m i2t i1a +l ^t ^a ^b +$d $u $k $e +$lx25 +i8u i9s iA1 +D5 $9 *43 +[ s | +T3 TB T8 TA +i6u x05 +i2s x43 +*06 xB2 +-3 u '7 +$b T0 +*6Aqy1 +i1U.Bx01 +sa`x89*1B +*43 *16 +srjo5+K +$^*A7 +-0$e +-5 +3 R3 +s0( +*43t*13 +c ^e ^n ^i ^l +^; p2 x67 +o0i i32 sa1 $f o2w +sW4o9r +i9e iA9 +K Z3 +B +s5b L0 +$)x89[ +D6 i74 i9i o8k oAd +T3 T6 TC +p5*6A +cL8i3w +^w t o3B +o13y5sNK +$a R2 +^k ^n ^u ^k ^s +sN!i7G +i9e iA6 +T0 T6 TE TA +x59^1 +*17$7 +$9R9Z2 +sr3 sb5 o4b $6 $5 +c $3 $7 $9 +-0*59s"| +RAo8A +*7Bi9!sfg +$\ x4B oBe +x12kx29 +c $6 $7 $0 +c^1^e +$x$d +c$4$a +p1 *43 +$1$B +o1a i4k i7a o9a ,2 +c^7^9 +sZJsQJ +$3$a +c$1$x +c^1^3 +$9$D +c$1$e +c$1$a +c^B^a +c$2$x +c^c^d +.9} +$x$4 +$x$5 +o1c o3j o75 o5d o69 +T1 T7 TC T2 +$d$1 +u^2^f +u^b^7 +c^7^f +u^0^a +u^0^c +c^5^6 +c^5^0 +u$f$d +$d$x +$T Y3 +$d$d +i9e iAv +$d$f +^1^A +$f$b +^1^F +u^0^6 +$d$A +^7^x +c$d$F +u^8^F +u^4^d +d *45 +T1 T7 T6 T8 +c$d$b +c$d$c +$D$2 +i9e iAa +$D$9 +^e^D +u^4^4 +u^4^7 +u^4^2 +$b$d +^p ^i ^z +$b$a +$D$A +u$F$d +u$F$e +u$3$E +u$F$a +u$E$E +$5$c +u$E$B +c$d$2 +c$d$3 +c$d$0 +*04*32sV\ +$D$e +c$c$a +u^8^1 +^5^B +c$a$c +c$e$5 +u$5$7 +u$5$3 +c$e$2 +}Y4y2 +z4 ^e x38 +u^f^8 +c$e$9 +c$D$9 +o0z o4n i6a o53 o72 +c$a$F +c$e$8 +T2 T3 TC +$a$5 +c^3^e +c$a$x +x45 +6 -5 +$a$0 +i1l i2a i3c +$a$2 +c$e$b +u$9$4 +u$9$9 +x14 ^e +[ k +5 +$f$x +^x Y4 +^A^1 +u$5$d +c$a$8 +c$e$C +c$e$A +D6 i74 i9i oAd o8k +$a$d +$a$f +^o ^g ^r ^a ^m +$a$b +Z1 x28 +u^3^F +c^b^e +^c ] ^k i5w o3k +l$6$4 +c$3$E +c^2^1 +$3$x +c$3$A +u$6$E +tx23 +c$x$3 +uT9 +u$0$6 +u$6$f +C D5 +c^9^e +c^9^d +sx| +$F$D +^0 $6 so0 sm0 ,6 +c$x$x +c^b^3 +C D4 +c^9^8 +u$6$1 +u$6$9 +c$b$1 +u^b^c +c$B$2 +u^f^A +[ D4 Z3 +c^d^1 +c^3^4 +u^d^b +u^d^c +c^d^8 +c^d^9 +u^f^f +c^f^1 +c^f^2 +u^f^b +c^f^7 +u^b^3 +sr@xB6 +c$B$a +u^b^5 +$f$e +c^f^a +u^f^4 +u^f^5 +c$B$B +c^3^x +o0w o4v o6p sf4 +2 +u^d^4 +$8$x +u$0$1 +$A$C +$B$9 +$B$5 +$B$0 +^2^A +$A$5 +$A$4 +$A$7 +$A$1 +$A$3 +u^F^D +$B$x +T2 T3 TD +$f$1 +c$0$e +$4$D +$4$E +$4$F +u^6^e +c$0$x +$4$e +u$b$8 +$4$x +c^x^4 +$A$8 +c$b$E +u$c$8 +c$A$E +$c$2 +u^7^c +u^0^e +$e$2 +u$c$b +z2 i7o +$7$f +$e$4 +c^5^5 +$e$5 +$c$8 +iC4 iD2 iE0 +c^x^5 +'5 d ^B +o15 si0 $7 .2 $2 +c$c$c +^c^x +u$d$3 +^a^x +$e$6 +l $. $i $o +$c$c +^a ^g ^l ^a +u^5^4 +u^A^B +u^E^4 +u^C^E +c$C$8 +c$C$2 +c^E^9 +c^B^2 +^4^F +c^B^B +$1$F +T0 TB TA T8 +c$C$B +T0 TB TA T9 +c^8^8 +c^8^9 +$c$x +c^8^2 +c^D^A +c^D^D +c^5^f +$1$d +$1$f +$1$b +u^5^1 +*82*84s$W +u^3^f +u^3^e +c^6^2 +o0y i19 o3j i40 i6o +u$1$0 +^1 $0 *01 +u$1$5 +u$1$4 +u$1$6 +c^2^4 +c^2^5 +c^2^7 +u^5^7 +c^2^2 +c^2^8 +c^2^9 +u^5^9 +$x$a +$C$3 +o15 $7 i5g o3b +u^3^3 +$2$D +u^3^1 +u^1^4 +o0w +2 o6p o4v +c^2^f +u^7^7 +c^2^a +c^2^c +c$8$D +c^0^f +c$f$1 +c^0^e +i1a i3a i2b +c^6^a +u^9^C +u$2$a +i7e i80 i90 +u^9^d +c$c$4 +$C$D +c^6^0 +c^6^1 +u$b$d +$C$9 +c^6^7 +c^0^4 +c^0^2 +c^0^0 +o5s i83 x31 +$e$a +T0 TB TA T6 +u^9^6 +u$2$2 +u$2$3 +u$2$0 +xB1 *19 +u$2$7 +sbt ,3 +u$2$5 +c$7$A +o1c o75 o5d o3j o69 +u$7$a +^D^D +$4$C +T0 TB TA T7 +^F^C +c^4^2 +c^4^1 +c^4^7 +c$4$e +c^4^F +c$F$E +$E$x +c$F$a +*25 *17 syA +c^a^b +c^A^2 +u^a^6 +u$F$7 +u^d^0 +u$8$A +c^a^3 +u$8$9 +u$8$4 +u$8$7 +c^c^1 +c$5$a +c^c^7 +^x^2 +T0 TB TA T4 +u$4$2 +c^f^9 +u^a^x +u^c^d +u^c^c +x28L0 +u^e^e +c^e^9 +c^e^7 +c^e^5 +^9 o4e o7f ,6 si4 +c$2$a +x12 '8 u +c$2$c +c^d^2 +u^c^8 +u^c^6 +u^c^2 +c^3^2 +u^a^8 +u^a^2 +c^3^6 +$0$x +$0$e +u^e^5 +u^e^4 +c^e^f +x65Cx42 +Y3xA4Y2 +x14 ^h +^9 ,6 o4e o7f si4 +'5z3 +*92*36o83 +x2A z1 i17 +o1a i4k ,2 i7a o9a +$3$b +s\2*61 +$e$d +o1L sLe [ +C -7 +dx68 +*72DBq +^zp3 +sb&o9m +st-*34o3c +x07*2AR7 +$d$3 +oA^ +^i ^d ^u ^a +sc6rsSk +x46*6A +[z3 +o2$s|R +oAL +y4 *09 x37 +s l +.Bs>s +sE/p4xB3 +T0 TA T1 T8 +*8A*9A +sby l +^e ^k ^a ^h ^s +*32 d t +x14o4< +o4m x67 +T0 TA T2 T7 +o6`*38 +^zo1Z*2A +t x17 +0 +x12 u '8 +*82x48 +szy*62 +x01i5n +^6 i56 o46 i64 o7f +^B^2 +x8Bo3p} +^4^A +*52D2 +z2 ^4 +sjez4s=K +T1o5E +x21o0U +*42 *B6 +i1xs/k*AB +i82 i90 iB3 iA2 +D4i79i9< +*09s8MY5 +i42 i70 i50 i61 +o1d i63 se2 o5b o77 +u$4$4 +t +2 +i9"}x1A +x27i5C +fx04 +{+1 +-0x16 +x67{o6` +*06^_ +i41 i59 i72 i69 +*46xB9,1 +q ^a +x6Bo1M +o77 *A7 +o4Q-9f +$a$6 +o0i i32 sa1 o2w $f +c$e$e +c$a$5 +c$a$3 +i2L '5 +$4$b +s)Ms!J +T3 T8 TB TA +$a$a +x12 ^1 o7v +x1Bx39 +D7Z5Z3 +y3.6*29 +'9 $' +o6B x32 +T0 T5 T1 T2 T7 +T0 T5 T1 T2 T8 +x56 $/ +x38Y5 +o6q { +z1 $1 L0 +c $e $A +T0 T4 T6 T5 T3 +c $1 $D +E x8B +T6 TA T8 T7 T9 +T1 T6 T5 TB +-5$y +l $0 $4 $3 +l $0 $4 $9 +i5a i6r i7s +l $5 $8 $1 +T2 T6 TB T8 +T2 T6 TB T4 +oB$sWm +T0 TA T2 T6 T8 +-3C +z1 x57 +l '9 $0 +l '9 $4 +o1c o69 o75 o3j o5d +c sGI +T0 T3 T6 T4 T5 +k oA7 +l *39 +l $9 $7 $3 +l $9 $7 $0 +l $9 $7 $8 +T0 T6 T8 TA T2 +T0 T2 T6 T8 TA +^c i12 +T0 T1 T8 T5 T2 +T0 T8 T4 T2 T5 +o22 *60 D6 +se1 i32 st3 o75 sl7 +o0O T2 +$i x09 +i5e so9 i6n i71 RA +sq&E +^a ^E +$s $h $i $m +x16*08*92 +^1 x51 +i2r i4s i3e +T1 T2 T3 T6 T5 +c $2 $c +x0A x35 +p1 $a +T0 T4 T3 T6 T5 +T0 TA T8 TB +$3 $E +$3 $B +T4 TD T7 TC +T0 T6 T5 T4 T3 +] ] x91 +p1 *32 '7 +o5. *45 +,1 i28 so1 i58 o63 +l $3 $4 $8 +}$=s&a +T0 T2 T9 TA +l $3 $4 $7 +l $3 $4 $6 +l $3 $4 $1 +*04 i2x +x49 i1v +o1q D3 o6l si9 o72 +x2B .7 +T0 T5 T3 T4 +x12 Z3 *41 +i2i x9A x5A +T0 T8 T6 TA T2 +i9r iA6 iB6 +^7 o73 } +T0 TA T2 T9 +l 'B $8 +l 'B $2 +l 'B $3 +l 'B $0 +l 'B $5 +c $8 $5 $1 +x32 x35 Z2 +xA7 x07 +z2 ^7 +r $q i5m +T1 T8 T3 TB +$. $c $l +$1 $B +T0 T8 T2 TA T6 +,Ax31 +l $4 $9 $8 +o1c o5d o69 o75 o3j +Y2 s96 +T6 TA T9 T7 T8 +Z5 *27 +^B ^7 +^B ^5 +T3 T6 T9 TA +^B ^8 +p2 x0A +x56 o4s '8 +T0 TA T2 T8 +x03 sy! +0 ++4 $$ +oAZx64 +^?sl4 +*04 $y +l $3 $1 $6 +p4 *42 r +l $3 $1 $4 +l $0 $6 $5 +d [ x42 +l $0 $6 $7 +^y l +^6 ^x +T1 T2 T5 T6 T3 +.9.7 +i7. o99 +^h ^t o2u i8i oAt +$) $$ x71 +{x42 +T0 T6 T4 T5 T3 +x91 Z1 +-1 $r +T1 TA T9 T5 +u p2 x76 +l $6 $8 $7 +l $6 $8 $1 +T0 T6 T2 TA T8 +o46 *84 +T0 T2 T8 T4 T5 +T1 TA T9 T2 +T6 T9 TA T7 T8 +Z5r +D0 ^@ o43 +s1. *57 +o0c sg2 o1j o2q o41 +l $9 $5 $0 +T0 TA T8 T9 +T0 TA T8 T2 +$3 d ] +o1r ^h +l $4 $7 $5 +l $4 $7 $9 +T0 TA T8 T3 +o0l ] i2c o4b o1c +s7n x36 i0k +d s0k x7B +t $* +z4 -3 +T1 T6 T3 T5 T2 +T0 T5 T1 T7 T2 +T0 T2 T4 T5 T8 +Y2sqW +^E ^a +^E ^C +l $0 $5 $4 +i5b i7r i6e +T0 TB T2 T3 +i4/ 'A +s>^ +T0 T6 T3 T9 T5 +i11 i3c +s>} +R9 x02 +c $4 $3 $0 +l $2 $6 $1 +i37 i1f +l $2 $6 $8 +Z2 $. +o0r o2p +usJ1oBo +'6 D2 +c ^D ^5 +x6A'B +$g $N +T0 TB T2 T4 +i2n i4s i3e +o1c o5d o75 o69 o3j +s1^ Z1 +] i3[ o3v +l $. $s $y +T0 T8 T7 T9 TA +l i15 +$B $9 +$B $3 +$B $0 +$B $7 +$B $5 +$E $7 +Y3 d +f x91 +T0 T4 T5 T3 T6 +snp{p1 +^j x39 +^3 ^A +^3 ^B +c $l $i $k $e +f Y1 +T0 T8 T5 T4 T2 +T0 T6 TA T8 T2 +l $. $s $v +o1a k +Y4D1 +Z1 z1 Z1 +i4w .5 +x26x83x56 +^^ *05 +$] o3[ +*86*7Ap4 +*64*42sF[ +T0 T4 T9 T8 +T0 T1 T2 T5 T8 +T0 T1 T2 T5 T7 +T0 T3 T6 T5 T4 +x42 ^I +^Z z2 +o19 f +T0 T5 T2 T8 T4 +T0 T5 T2 T8 T1 +C $8 $0 $6 +T0 T6 T3 T5 T9 +T0 T6 T3 T5 T4 +c ^3 ^B +l $. $s $r +D0 t *01 +c $4 $D +d *28 x13 +x7A*87u +T6 T7 TA T8 T9 +L5]o7. +l $3 $7 $0 +s0, D0 +l $. $s $o +T0 TB T3 TC +'7 x13 $s +l $6 $9 $4 +T0 T2 T8 TA T6 +T0 TA T6 T8 T2 +l $1 $3 $2 +T0 TA T8 T1 +c ^e ^r +*64^z +r stk +l $1 $3 $8 +l $1 $3 $9 +T0 TB T2 T8 +srf c +i1a o6s $e o32 sp6 +l $9 $3 $8 +l $2 $1 $5 +T2 T5 T9 +l $. $g $t +-3 '6 +l $2 $1 $0 +T1 T2 T6 T5 T3 +o2; *31 +T0 T8 TA T2 T6 +^* D1 l +xB2D0 +T6 TA T9 T8 +l $8 $9 $3 +l $8 $9 $2 +i2i i3c i4k .7 +6 +$;]i5G +o1d se2 o5b i63 o77 +LAs|O +T0 T6 T9 T3 T5 +sF. +T1 T3 T6 T2 T5 +T3 T8 TB T7 +T6 TA T7 T8 T9 +i16 $q i3i sr8 +T0 T1 T7 T2 T5 +o6/ $6 +i1a o32 o6s sp6 $e +i2~ +T0 T2 TA T7 +T1 TA TB T4 +T0 T4 T3 T5 T6 +z1 shQ D4 +Cs8qp1 ++2 p1 u +iE4 iF2 iG0 +l $3 $0 $1 +sE+iBn +o0l i2c o4b o1c ] +l $3 $0 $2 +sb,x49 +l $3 $0 $7 +l $3 $0 $6 +l $3 $0 $9 +l $3 $0 $8 +l $0 $7 $3 +l $0 $7 $1 +K D1 $7 +l $0 $7 $8 +'A *84 +T0 T8 T7 TA T9 +D1 i5f o2f i69 R7 +T0 T5 T1 T8 T2 +o0z o53 i6a o4n o72 ++4 p1 +T0 T4 T2 T8 T5 +T5 TA T6 +^/ z2 +t oA1 x34 +T6 TA T8 T9 T7 +p1 x06 x21 +c ^3 ^x +T0 T2 T8 T5 T4 +T0 T2 T8 T5 T1 +l $1 $4 $6 +c sa@ T5 +l $1 $4 $2 +u i43 +l $6 $9 $7 +l $6 $9 $5 +T0 T9 T5 T3 T6 +T0 T2 T8 T1 T5 +l $9 $4 $6 +l $9 $4 $0 +l $9 $4 $8 +T0 T2 TA T6 T8 +$. T6 +T0 T2 T5 T4 T8 +u i4! +T0 T5 T6 T9 T3 +T6 T9 T8 T7 TA +s 2sy* +s0X +u $2 $a +p4 *5A +*70iA5 +s(\i5< +^D } R3 +*16rx4B +T0 T2 TA T9 +l $5 $3 $0 +l -4 +c ^E ^C +l $5 $9 $4 +i5e i6n so9 i71 RA +su3 sk8 o5k o79 sa0 +T6 TA T9 T8 T7 +T0 T7 T5 T2 T1 +tkZ3 +^u $f $y o4o +l $2 $7 $1 +l $2 $7 $3 +T5 TA T9 +*93z1z3 +^h x71 +*21 sdE x24 +l $5 $3 $4 +T0 T4 T3 T5 +o5T x72 +x64sX5srf +c $e $x +x4B ^z +T0 T6 TA TB +^a i74 $w o8u oAo +*12 $g { +-0^%x56 +z5 o1r +'7i2h +u i4J +T0 T8 T2 T5 T1 +T0 T8 T2 T5 T4 +i9o iA1 iB1 +T0 T4 T5 T2 T8 +$F $U +T0 T6 TA TE +u ^3 ^B +T0 T5 T4 T3 T6 +s&uk +^?*2B +i0j *02 +^u o4o $f $y +,1 *50 +T3 T9 T5 T4 TA +*B4r.4 +l $5 $9 $0 +l $5 $9 $2 +o2u i4e i5e o9p o3t +^(sp% +T0 T5 T3 T4 T6 +$5 +3 L8 +i4e ,2 +l $0 $1 $8 +x85iB! +$@ L4 +l $8 $4 $6 +l $8 $4 $2 +R6 { x21 +$c $A +^C T4 +$< ^> +^T $1 +T7 TA T9 TB +l $3 $6 $2 +l $3 $6 $1 +sfSo3Cs'i +o3b x52 +l $3 $6 $8 +o1d o5b i63 se2 o77 +i1a sp6 $e o6s o32 +o0w o6p +2 o4v sf4 +z3 *06 +^0 ,6 $6 sm0 so0 +o0z se0 $c *56 o2a +T6 T8 T7 T9 TA +L5 x86 +^]Z3*51 +,7 +6 Y2 +s#0sDKx47 +T2 T8 TA T3 +RAZ2y3 +^p ^i ^t +z3 *07 +$s x13 $c +i2h i4e i73 i84 o5r +sAkkx35 +o7r,6 +l $1 $7 $6 +*98 *31 +'7 [ +T0 T4 T2 T5 +l $9 $2 $1 +l $9 $2 $3 +R3sHzi9I +c $i $v $a +l $9 $2 $7 +l $9 $2 $6 +l $9 $2 $8 +suMi4k +c $C $8 +T0 T8 T9 T7 TA +c $C $1 +c $C $4 +T0 T7 T9 T8 TA +x26 ^b skr +^c ^a ^m +c $C $B +T0 T9 T7 TA T8 +svr +i48 L2 +x07 '7 +s4& +xB4*50 +svw +o0M d +C 'B $4 +s,xi6$ +T1 T6 T5 T3 T2 +o0q i2i o3d i4s o54 +*13 R1 *45 +^2 ^4 o60 sv9 +x19^& +u $1 $6 $7 +T0 T2 T6 TA T8 +^0 ,6 so0 sm0 $6 +T0 T2 TA T8 +x68i2dK +l $1 $8 $9 +T6D1*56 +z4sR{ ++1 x84 +c ^a ^i ^d +sv] +^C ^3 +^C ^7 +s *03 -3 +*A8x9A +T6 o0@ +T0 T1 T5 T7 T2 +o0i o2w $f i32 sa1 +i8& Z4 x78 +] T0 D7 +p2 q +y3 o67 D4 +s%Dx64 +[ z4 +5 +o6m*35 +x13] +i4o i52 o8h o6a +T0 T9 T5 T6 T3 +*41 +0 +l $1 $6 $0 +i2l i4a i3l +l $1 $6 $2 +o1a i2u i4. i5s i8e +-1*82 +T2 T3 T6 TC +x5B i34 +T0 T3 T6 T5 T9 +$C $9 +Y3s'cZ3 +T1 T5 T8 TA +T0 T3 T9 T5 T6 +$a x27 +u $7 $x +T1 T3 T5 T2 T6 +c $B $1 +u $a $c +T0 TA T7 T9 T8 +c $B $F +'6 z4 +c $B $a +T3 T5 T4 T9 TA +Z2 o0o +x25 q $2 +u $0 $C +D9 r +u $0 $D +T3 TB TD +T2 TD TB T3 +*30 { u +T0 T1 T7 T5 T2 +i68 Z2 +E^n +l $3 $2 $8 +l ^w ^o ^t +f xA1 +l $3 $2 $0 +,1 i28 i58 o63 so1 +u $6 $1 $8 +*50 t o6Z +i42 i50 i79 i62 +*75C +l ^w ^o ^b +T3 T5 T9 T4 TA +sDj +i62 Z2 +'7 x01 +u $a $6 ++2 *46 +o2Z '7 +$S Z2 +c $. $m $k +u $8 $1 $4 +R7 sjb +u $a $F +^b x39 +x68Z4 +Z2 *51 +l $4 $9 $5 +T0 T5 T8 T4 T2 +l $4 $9 $0 +l $4 $9 $3 +p3sl` +^7 z4 +l $6 $7 $5 +l $6 $7 $4 +T1 T3 TA T7 +l $6 $7 $9 +i16 $h sy4 o2j +o4n k +i30 i41 i51 +l $5 $1 $3 +s0Eo5c +$K u ^K +T4 TE T7 TB +z5 *60 +T1 T9 T5 T2 +x3B o0e +x53 Z1 sde +c $7 $3 $1 +c $7 $3 $9 +c $7 $3 $8 +u $D $8 +u $D $5 +u x43 +C '6 $2 +C^t*97 +T0 T7 T9 TA T8 +$di6as{( +$7 Z5 +T0 T8 TA T6 T2 +^r '5 +$, c +o3i soP +T0 T9 T6 T5 T3 +i3a c +x6Bo5+ +$. $d $o +z5 x84 +xA9 x57 +T1 T5 T6 T3 T2 +T0 T7 TA T8 T9 +*19,1D8 +{$% +d +6 +x81 T5 +o0i sa1 $f i32 o2w +{$/ +T0 TB T4 T7 +s[z x54 +l $0 $9 $4 +o9u*8A +T0 T7 T8 T9 TA +o70 ^a +s74 Z2 +sb0 +4 +0 +L3 z2 +T1 T3 TA T5 +*63 p5 +0 +x09 d +T0 T8 T6 T2 TA +u $E $9 +l ^8 ^6 ^9 ^1 +u $E $0 +i2g x34 +T0 T5 T7 TA +u $E $6 +$9i9g +T0 T5 T2 T1 T8 +*36 $J +xA2o8\ +l $0 $1 $9 +u $E $B +u $E $D +s23 d +l $2 $4 $8 +T0 T6 T3 T4 T5 +x24 q +T6 T7 T9 T8 TA +u $1 $5 $7 +T0 T5 T9 T3 T6 +sYy +o5u $3 +l $8 $4 $5 +T0 T3 TA T4 +i94 iA0 +*4A]*45 +c $d $D +c $d $E +z1 x07 z2 +l $1 $5 $8 +x13 o2b +c *05 D7 +^@o70s%p +T5 T8 T9 TA +c $d $7 +iAO*96*40 +T1 T2 T3 T5 T6 +T2 T3 TC T6 +T0 TA T9 T7 T8 +y1 sFs +*75 $5 +T6 T8 T9 TA T7 +T0 T2 T8 T6 TA +c $9 $0 $7 +o25 *31 *65 +Kx47 +z5 x62 +T0 T3 T9 T6 T5 +Y3rK +d*B4*93 +T0 T4 T5 T8 T2 +T0 T5 T6 T3 T9 +T6 T8 T7 TA T9 +^c ^A +u $0 $2 $1 +c ^n ^i +T2 T3 TC T4 +l $. $e $g +l $8 $5 $6 +l $8 $5 $1 +l $8 $5 $3 +l $8 $5 $2 +x4A } +su3 o79 sa0 sk8 o5k +T3 T7 TB T6 +si$ +u ^D ^7 +i3v i4e i5y +u ^D ^B +T3 TA T4 T9 T5 +u $4 $7 $8 +Z3 o0j +T0 T1 T2 T8 T5 +T0 T2 T1 T5 T7 +s1w r +p1 +4 +^a x43 -B +y1 D6 +c -0 +o0z i6a o72 o53 o4n +u $6 $0 $1 +o9u c +D0y1 +T0 T9 T3 T5 T6 +s!nsW` +T0 T8 T2 T1 T5 +[ $f z4 +T0 T2 T7 T5 T1 +$4 $C +i2g x32 +x15 $8 u +xB1slqx43 +T0 T4 T5 T6 T3 +o1u xAB +c $4 $7 $5 +*ABy1o2' +EoAq ++4 q x53 +o2t i6e i7m i8o +^5 ^9 x47 +x13 '7 c +^?R9 +i0h *67 +sv' L4 +l $. $p $s +c ^o ^l ^i ^k +l $. $p $t +T1 T5 T6 T2 T3 +T3 T7 TB T5 +l $6 $4 $2 +l $6 $4 $3 +l $6 $4 $5 +T3 T7 TB T8 +l $6 $4 $7 +T0 T4 T6 T3 T5 +l $6 $4 $9 +-0 o4= +l $5 $0 $4 +l $5 $0 $3 +shi -3 +$Q*47 +i7u i8e +l $5 $0 $9 +x04 x61 +^4 sb1 +u $3 $8 $1 +^p ^i ^s +Z4 x15 +T3 T4 TA T5 T9 +*86t*4A +T3 T5 TA T9 T4 +l $u $p +T1 T6 T5 T2 T3 +x84 'A +i0Hi8$ +sd?x68 +T1 T5 T3 T6 T2 +d o0T +T0 T7 T1 T2 T5 +T4 TA T9 T5 +T0 T8 TB T7 +T0 T2 T1 T7 T5 +T1 T4 TA T2 +T1 T5 TB T7 +s6B o0w T1 +x41 i5s +$gZ1o8E +$b i18 +^s ^t ^a ^h ^w +sb< so/ +T0 T3 T4 T5 T6 +i2' s'k +^h -2 +^S $S +T0 TA T8 T9 T7 +C i4Q +T0 TA T2 T8 T6 +z2 -2 +.2o47 +o50 $y +z1 R0 +R0 z3 +T0 T5 T3 T9 T6 +o6? *45 +$d o4R +^0 ,6 $6 so0 sm0 +T0 T5 T2 T4 T8 +slW +x63 Z3 +i7r*32 +$0 $r +x01 C o2G +z1 Z3 +T1 T5 TB T6 +s8$ +saDxB7i5A +Z2 -4 i38 +^0 ,6 sm0 so0 $6 +l $7 $2 $4 +T0 T2 TA T8 T6 +u $9 $0 $5 +'7.3 +T4 TA TB T6 +l $7 $0 $4 +T1 T2 TA T9 +l $7 $0 $6 +l $7 $0 $1 +l $. $p $e ++4 l +sdW-7Z4 +o0d D1 i3b $9 $5 +d $i +l $6 $2 $0 +r $l $e $t +d $f +su3 sa0 o79 sk8 o5k +l $6 $2 $9 +T3 TB T8 +-4 $* +*45 sl8 +} *A0 +o85 *87 +i8o i9o iAd +^t ^c ^a ^l +x61 ^3 +u $3 $1 $2 +s8e +u $3 $1 $8 +s8h +xA9 z5 +T0 spR +c $u $m +x52 R3 +l $8 $6 $1 +l $8 $6 $3 +d l +l $8 $6 $5 +k Z1 ^4 +i1u i3e i2n +l $8 $6 $9 +T0 T7 T2 T1 T5 +o0* z5 +D4p5 +T0 T7 T2 T5 T1 +svN +t Z5 x12 +sUKiA+ +i9Z*1B +l $1 $0 $2 +z4 o3y +l $1 $0 $7 +z1$Pt +{ sn9 +l $1 $0 $9 +*19*81*19 +$0 sd7 +D5 i89 o6g i97 RA +sz[syF +T0 T6 T5 T3 T9 +T0 T6 T5 T3 T4 +T4 T8 T6 T7 +sB) +T3 T4 T5 T9 TA +T0 T2 T5 T8 T4 +l $2 $3 $5 +T3 T5 TA T4 T9 +l $2 $3 $6 +x61 ^B +l $2 $3 $0 +z3 +8 +T2 T3 T6 T8 +T0 T9 TA T8 T7 +u o5= +R5 ^v +T0 T7 T8 TA T9 +^FxA6t +l $5 $7 $8 +l $5 $7 $0 +l $5 $7 $6 +^F ^C +$^E +T1 T3 T5 T6 T2 +i4[ +^F ^7 +$+ $# +o9ss4%*19 +T3 TB T6 +T3 T9 T4 TA T5 +o2a o1w +l $6 $5 $8 +z3c*5A +o1c o3j o69 o5d o75 +Z3 *63 *72 +sBn +l $8 $1 $5 +^d i48 +l $8 $1 $7 +C i4* +T1 x57 +x26 z5 +Y2 x54 +T0 T1 T8 T2 T5 +T6 T7 T8 TA T9 +c $a $e +T1 T5 T8 T9 +c $a $c +c $a $D +d o7b c +sei z4 +xA2r^@ +o1m ,3 +*34 o2f +Y2 *25 +^s ^e ^o ^n +T3 TA T9 T5 T4 +*30 *2A +c $0 $a +c $0 $7 $2 +T0 T3 T5 T9 T6 +c ^h ^s ^a +l $4 $0 $3 +$v $u +u,BsUa +T0 T5 T4 T6 T3 +i1a o32 $e sp6 o6s +$s $, +i42 i50 i70 i61 +l $2 $7 $0 +T0 TA T8 T7 T9 +c ^e ^D +l $6 $5 $7 +*07 x31 +l $8 $1 $2 +l $8 $1 $4 +T0 T1 T5 T8 T2 +l $9 $8 $2 +T0 ^1 x13 +l $9 $8 $6 +{ x54 +^1 *01 $0 +su3 sk8 sa0 o79 o5k +o0L p1 +T0 T8 T5 T2 T4 +T0 T8 T5 T2 T1 +-0 f *56 +sn$ +oA)p2x3A +T3 TA T4 TB +'6 o3e +k x12 k +l $8 $0 $6 ++5y4x09 +T4 T7 T5 T9 +l $8 $0 $9 +x02 $+ +'Ax21y1 +o5* Z2 ++3 spj ++9 D0 +y1 y3 +^$ $1 +T2 T5 TA T3 +c $7 $5 $9 +$4 T5 +T1 T6 T3 T2 T5 +T3 T5 T4 TA T9 +T3 TA T5 T9 T4 +T4 T8 TA +^q 'B +^4 ^F +^4 ^B +o4. Z3 +i12 i20 i45 i30 +x08^(sbn +z3x73 +T0 T9 T8 TA T7 +i12 i20 i45 i32 +o1d D2 i5c i69 o75 +,7x02sfv +T1 T2 T6 T3 T5 +x41o6? +^m ^r ^e ^t +l $3 $9 $1 +T1 T2 TA T8 +l $3 $9 $7 +^t ^r ^i ^d +^q '5 +i4n i51 i60 +o1q D3 o72 o6l si9 +u $5 $0 $7 +i31 i58 i49 i67 +f x54 +o9\ +$` x05 +c $f $7 +c $f $5 +c $f $8 +c $f $9 +D1-8 +$9 Z5 +x83 $# +c $f $e +u ^E ^4 +u ^E ^8 +x83 $h +i7o i80 +T0 T5 T8 T2 T4 +T0 T5 T8 T2 T1 +x8Bx85 +l $7 $3 $0 +l $7 $3 $1 +i6s i8n i7o +c $a $x +o61 T5 +*36 x57 +^k $3 si3 +2 o6d +sbf Y2 +i42 i62 i50 i74 +i12 i3w o2f o6i +o2m -3 +T2 TA T5 T3 +c ^A ^D +c ^A ^C +L3si{ +c $c $y +^^k +i1e i4a $h $i i5r +d $p +c $1 $C +c $1 $B +Z3x93^R +l $5 $8 $9 +sy. x84 +-0 x4A +Z1 ^B ++A*48*47 +D4 -0 +T2 TA T5 T7 +o6@ *76 +T2 TA T5 T4 +T2 TA T5 T9 +l $8 $7 $3 +l $8 $7 $2 +LAfx29 +swm o1f +.4 x7A +Kx65 +$v $v +T7 T8 TB TA +l $2 $4 $1 +p1 *18 +s9rsE3 +k x41 R1 +L6 ] *50 +-9 -E +o77^+ +x83 sa1 +i60 ] +3 +T0 T3 TC TB +s'DK*70 +T6 T7 TA T9 T8 +^d o3s K +x0A,As*6 +c $c $1 +$. $a $c +c $c $3 +$. $a $q +c $c $4 +sdF +s1! Z2 +u $9 $4 $5 +u $3 $6 $8 +x52 L4 +T0 T1 T5 T2 T8 +T0 T1 T5 T2 T7 +T0 T8 T2 T4 T5 +T1 T4 T5 T9 +-2 i2x +u $7 $8 $6 +l $2 $6 $0 +T1 T5 T2 T6 T3 +dx09 +z2 o10 +l x3A ^k +*15 r +l $2 $0 $4 +T1 T4 T5 T7 +x85 Z1 +l $2 $0 $8 +l $5 $6 $3 +T3 T9 T5 TA T4 +T2 T8 T4 T3 +o8| +Z1 i79 +l $5 $6 $9 +l $5 $6 $8 +T0 T9 T8 T7 TA +o8} +u $7 $1 $8 +x53 R1 +o0o o1s +c $d $b +T5 '9 +T0 T5 T4 T8 T2 +*6B x16 +c $d $x +x61 y3 +o7! Z1 +T6 TA T7 T9 T8 +R9l +^k .1 o69 +x46x49R1 +l $0 $2 $6 +l $0 $2 $7 +$r $a $m $o $n +s]|Y4i8b +x21 o52 ++1 i67 ss0 o7a sc5 +} f +-0 -F +l $8 $2 $1 +^s ^t ^s ^o ^p +l $8 $2 $3 +^s ^y ^e ^k +T0 T6 T2 T8 TA +i96 i7s x37 +l $4 $3 $7 +T1 T2 TA T5 +^0 so0 sm0 ,6 $6 +l $4 $3 $2 +l $4 $3 $0 +L2 i4e $- +l $1 $5 $3 +x06sEA +o0c o41 o2q o1j sg2 +RBk{ +c $4 $0 $9 +*B5 x68 +T0 T4 T5 T3 +u $B $x +s3t +sa2 sx1 i4e i5y +x68*89 +T3 TA T9 T4 T5 +u $B $A +u $B $D +u $B $9 +s3+ +i40 c +sf2 +}p1 +l $7 $5 $2 +l $7 $5 $3 +^o i7a o3i se_ +o2b $1 +^* l D1 +o4c o0@ +l $9 $1 $5 +l $7 $5 $9 +s8X +T0 TA T8 T6 T2 +^l ^i ^m ^a ^t +s8K +x14 i1G +*3Bu^@ +u $2 $5 $8 +C L4 +T0 TA T8 T2 T6 +l $. $u $a +T0 T8 T1 T5 T2 ++0 s1y +1 +s.z x51 l +$& c +s8w +o1u o5h +T0 T8 T5 T1 T2 +$X $Y +s7c +s7b +i0G $5 z1 +[ s6q +x72 $& +$. x25 +i75 x17 +^d ^F +f*93x48 +o60 d x05 +T6 T7 T8 T9 TA +T6 T8 TA T9 T7 +u ^4 ^B +u ^4 ^1 +u $0 $7 $3 +^H ^R +T3 T9 TA T5 T4 +u $4 $7 $5 +l $3 $8 $2 +i8h i9t +T0 TA T1 T7 +T3 TA TB T4 +u '5 $0 +s0h -0 +u '5 $6 +u '5 $4 +u '5 $5 +-5 ^9 +u $1 $9 $5 +u $1 $9 $2 +Y2 x52 K +T0 T8 T1 T2 T5 +T0 T2 T1 T5 T8 +Z1 D1 R4 ++5 o3z +T0 T4 T2 T5 T8 +l $7 $9 $6 +l *23 L4 +s;Qx25 +l $7 $9 $0 +l $7 $9 $1 +l $7 $9 $8 +T3 T7 TA T5 +T6 T9 TA T8 T7 +l 'A $9 +l 'A $8 +Y1*14 +L0 o21 +^e ^s ^i ^o ^n +$Zy1 +l 'A $0 +$m ^k l +si!*98 +l 'A $4 +^8 ^e ^2 i56 o75 +$8 i3N +T0 T4 T8 T5 T2 +c $a $b $l $e +l $4 $5 $9 +l $4 $5 $8 +ssH soB l +l $4 $5 $0 +suN$yT2 +Y3y3Y4 +k o62 +5 +-5 $S +o2e -7 +} x12 Y2 +c $0 $x +c $D $9 +Z5C +l $4 $0 $6 +c $D $1 +T1 TB T2 T8 +l $4 $0 $5 +^d o2r +l $4 $0 $1 +T5 T9 TA T7 +o5F Z1 +q sbd +x03 i2B +i9c *04 +l $1 $9 $5 +l $1 $9 $7 +l $1 $9 $0 +i4r *54 o4e +o2FiBi +o4ex69T2 +y4x29i5_ +c ss- L7 +*37 c +i1*xB2 +o4t -0 +'8 Z4 +$$ x06 +d k o5- +^f ^E +T0 T2 T4 T8 T5 +i5t i6s +T6 T9 T7 T8 TA +*70 $2 +u $2 $3 $4 +i3u c +c $b $c +c $b $a +[ -1 i3f +c $3 $6 $8 +^7 q +T7 T9 TB TA +*13,7} +T1 T4 TA TB +k sy6 [ +T0 T6 T9 T5 T3 +l $8 $0 $4 +f x61 +T1 T5 T2 T3 T6 +T2 T7 T3 TB +T4 TE TB T7 +l $6 $3 $8 +l $6 $3 $0 +l $6 $3 $4 +o91 K +c $9 $A +[Z5E +T0 T9 T7 T8 TA +sp8x61 +x06 } +Z3 k +^k si3 $3 +2 o6d +T0 T2 T7 TC +sa. i3. i4a i7b ,5 +T0 T5 T6 T3 T4 +x14 R3 +u ^1 ^F +x06*A3*82 +c $E $2 +c $E $1 +c $E $0 +u $0 $2 $9 +T1 T2 TA T4 +u $0 $1 $3 +[ i0s y2 +*75 *76 u +x59 $H +*B8L8 +T5 T9 T7 TA +l $8 $3 $5 +D1 i61 o3y +2 +$@ K +o4?*B1 +-5 Y2 +T0 T5 T2 T7 T1 +i1h i3l i2i +l $0 $3 $8 +T0 TB T3 T8 +T2 TA T8 TB +u o0U o6R +l $0 $3 $4 +$$ x64 +T3 T4 T9 TA T5 +sM#i5K +T3 T4 T9 T5 TA +l d 'D $2 +T1 T6 T2 T5 T3 +T6 T8 TA T7 T9 +T0 T6 T2 TC +l ^ ^p ^o ^t +u $A $7 +^u c +d ^c +$6 $C +y3s5b[ +^NZ1 +i6ExB1 +l $9 $0 $2 +T3 T9 TA T6 +R1 ^g +l $9 $0 $7 +l $9 $0 $5 +s&3*51 +u $2 $4 $9 +u $2 $4 $8 +L0 L5 +^R c +u $2 $4 $1 +u $8 $9 $5 +x08 *63 +T0 T6 T4 T3 T5 +.6x94 +l ^t ^n ^e ^c +^)} +fx06iB# +^s ^k ^c ^o ^r ++2 -F +i4y i6s o89 o97 $1 +c$[ +o4t Z2 +T2 T3 T8 TB +T0 T5 T9 T6 T3 +^, $. +sa0 D4 +,5 *A7 D8 +o7d D8 +u $0 $9 $3 +*67D4o13 +i15 i5b +iC1 iD2 iE3 iF4 iG5 +T0 T6 T8 T2 TA +D1 $$ +u $0 $6 $5 +$R $N +*26 z1 +z4z2 +o19 Z4 +T2 T3 T8 TA +o0h D5 +D9z1 +D0R3 +*18*96sgR +R5 Z5 +$1 $F +ss^ +x42 $% +^A ^4 +^A ^8 +^A ^9 +^! $$ +l $7 $2 $0 +^@ *62 +T2 TA T3 T5 +T0 T3 T6 T9 T5 +^5 ^B +^5 ^A +^9 $d su3 o6f se6 +T0 T8 T9 TA T7 +x48 p1 +T0 T8 TA T9 T7 +i5t i62 +'7+Ay4 +'A C +o0l o1c i2c o4b ] +xB1ty5 +o2+*45 +T0 T3 T5 T4 +T0 TC T1 T7 +c $3 $a +x53 z3 ++1 $f +*13 o0j +^* ss# +] Z3 i6j +l $4 $6 $7 +l $4 $6 $2 +o58 p1 +T0 T1 T2 T7 T5 +l $4 $6 $8 +f x19 ] ++1 D4 +T2 TA T3 T9 +l $4 $1 $6 +o9bs,l +l $4 $1 $3 +slKR4*0B +T3 T4 T6 TA +*65t[ +$,*82s{8 +T0 T5 T3 T6 T4 +T0 T5 T3 T6 T9 +C ssN +^0 ^D +$/ x75 +T2 TA T3 T8 +o0w o4v sf4 o6p +2 ++1 sc5 i67 o7a ss0 +c $0 $8 $3 +l $1 $8 $6 +$4 l $2 +*48 *08 +Z4 x61 +i2l i4p i3i +*06s6/ +sbP +x14 K +4 +T0 T4 TA T3 +l $7 $6 $5 +l $7 $6 $4 +T9 [ +l $2 $8 $9 +Z5 Z5 +l $2 $8 $0 +'A q +x29 ^{ -0 +T2 T7 T5 TA +o0g r +^c ^d x49 +-9 $% +^Lr*59 +l 'E $9 ++5 -F +o1c o5d o69 o3j o75 +l $6 $0 $2 +l $6 $0 $8 +l $. $b $i $z +c ^f ^l ^a ^h +T0 T4 T8 T2 T5 +^0 ^2 i6i $r o3e +s5n*52E +l $5 $4 $8 +l $5 $4 $2 +r 'A +l $5 $4 $0 +l $5 $4 $7 +l $5 $4 $6 +o77 ^7 +T3 TA T8 T4 +T3 T9 TA T4 T5 +s%c +^7 ^D +o1c o69 o3j o5d o75 +T0 T2 T5 T1 T8 +T0 T2 T5 T1 T7 +s6b R0 +xA1 x4A $y +i4y $4 o5e $u +R1 d +i14 $9 i35 $3 ss6 +c 'G +c s2* +T0 T6 TA T2 T8 +*A8o0Dz1 +s7G*A6 +u ^F ^B +T3 TA T5 T4 T9 +u ^B ^C +T3 TA T4 T5 T9 +^+ z2 +c ^B ^C +o0q +5 +x8A*36o9w +i0n K x13 +i1d i57 +l $9 $3 $7 +T0 T9 T6 T3 T5 +^6 o46 i56 i64 o7f +T1 T3 T2 T6 T5 +T0 T7 T1 T5 T2 +T6 T9 T8 TA T7 +i16 $h o2j sy4 +^a ^t ^i ^p +Z2 s9j +sqg D3 +T1 T2 T5 T3 T6 +T0 T8 T2 T6 TA +f *87 +u $9 $1 $3 +T6 T9 T7 TA T8 +T6 TA T8 T9 +T0 T2 T5 T8 T1 +T6 T7 T9 TA T8 +o0c o2q sg2 o41 o1j +c i1F +se2 sc0 o3f $4 o59 +u ^C ^D +T0 T7 T5 T1 T2 +i14xB7 +s0*sHti1V +$. -8 +^w z2 *25 +[ c [ +s3f +K x02 +c $D $e +^h ^t i8i o2u oAt +$? Z4 +d*86 +l $3 $5 $7 +z5 i71 x34 +T2 T7 T5 T9 +l $3 $5 $0 +l $3 $5 $1 +T4 T9 T5 T7 +l $3 $5 $9 +spusi_ +o12 L0 +T4 T9 T5 T6 +s2,*9Bi4@ +xA9o8) +^W x15 +T0 T3 TB TC +T1 T3 T2 T5 T6 +T2 TA T3 TD +so> +z2 *72 +T0 T3 T5 T6 T4 +T0 T3 T5 T6 T9 +z3 *83 +T0 TA T7 T8 T9 +T0 TA T9 T8 T7 +$2 R1 +i8& x78 Z4 +T0 T3 T4 T5 +l 'C $6 +i3a i5a i4r +T1 T3 T6 T5 T2 +T3 TA T8 T7 +o43 f +T0 T7 TA T9 T8 +T0 T5 TB T6 +T6 T7 T8 TA +l $4 $8 $3 +o3f +0 +T2 T3 T8 T6 +^6 *41 +l $8 $9 $6 +T2 T3 T8 T4 +l $4 $2 $1 +l $4 $2 $3 +T2 T3 T8 T5 +l $4 $2 $7 +^4 i2b so2 o56 sa3 +T0 T2 T7 T1 T5 +i33 $l oAe o7g +T0 T5 T7 T2 T1 +T0 T2 T1 T8 T5 +u $4 $6 $5 +$m l ^k +x25z2Y3 +si9 $4 $7 i21 $8 +T0 T6 T5 T9 T3 +T0 T3 T4 T6 T5 +T0 TA T6 T2 T8 +i8aC +l $2 $9 $6 +o0l o1c ] i2c o4b +l $2 $9 $1 +,5xA2k +] Y5 x63 +T0 T9 TA T7 T8 +x3BR7 +T3 T9 T4 T5 TA +D1'8q +y3 p4 +T1 T5 T3 T2 T6 +y3x34r +c $6 $2 $1 +x81 o8- +o6|o9s +l $6 $1 $0 +l $6 $1 $7 +$g sr( +l $6 $1 $5 +l $6 $1 $9 +x17 *54 +xA3 $f +T3 T5 T9 TA T4 +^H +0 +$0 $% +$ $6 +$0 $? +c ^3 ^% +$0 $( +$/ $9 +i14 i2- i3j D7 +$3 ^0 +$0 $~ +^a +6 +$) $$ +c $$ $( +T1 T2 TA T7 +c $$ $% +$~ $9 +r '6 C +$6 $& +^y ^o ^r ^e ^l +$7 smc o0k +c ^# $* +c $( $) +c $* ^# +c $* ^_ +$^ ^^ +$2 $; +sl@ l +$2 $_ +$~ ^4 +$~ ^& +o1r ^H +$2 $i *03 +$= $5 +$8 ^6 +o1d se2 i63 o5b o77 +$+ $3 +c $/ $- +o2$ x42 Z1 +^4 ^[ +c $= ^= +$~ $7 +$_ $3 +T3 TA T8 TB +^7 ^@ +^^ ^^ +$7 ^8 +c ^_ $* +$9 ^4 +s6z l +$9 ^3 +f x82 +$> $_ +c $? ^4 +c $? ^? +^-i8Ox7A +^( ^) +c $% $@ +x01 swf +$. $0 +r f x36 +c ^? $? +$9 $. +$9 $, +Z5 l +$9 $% +$4 ^9 +c ^# ^@ +c $_ $* +T1 T7 TA T3 +$5 $_ +c $* $& +c $^ ^^ +$9 $? +$1 $` +$2 $` +c $) $( +c $@ $! +c $@ $? +$@ $0 +c ^= $= +z3oBR +$0 $& +^* ^9 +^l ^l ^a +c $# ^4 +$% $9 +^> ^- +c $! $% +c $! $# +$% $) +^> ^< +T1 T7 TA T2 +i2v i4n i3i +c ^^ $^ +$7 $% +$, ^4 +$7 $/ +c $! $~ +$7 $? +$* $0 +T4 TB T9 T8 +$* $4 +$! $~ +T2 TA T8 T3 +$* $! +Z5 q +$3 $` +$| $| +$^ $6 +*51sQvo8H +$3 $, +$3 $$ +$. ^! +$- $0 +$| $1 +$- $5 +c ^4 $# +T1 T2 TA T6 +$# $8 +^7 R3 s80 +c ^4 $? +$6 ^1 +K ^0 +0 +$! ^/ +k -1 o0k +su3 sa0 sk8 o5k o79 +$- $8 +$+ ^# +x95s?[ +^xo7, +^> ^> +$9 $( +^) ^! +c ^9 ^^ +l o5u ^4 +i21 i47 i39 i56 +$$ ^@ +$5 ^0 +T1 TA T3 T5 +x67 *24 +x2B ^i +$; $2 +$; $> +^@ ^$ +$8 $% +c ^* ^9 +c ^* ^4 +$; $] +$= ^7 +$= ^= +$= ^* +$2 $^ +c ^1 ^_ +c}$6 +T1 TA T3 T7 +t z1 +i4i i5e i62 +o0w o6p sf4 +2 o4v +$p $o $i $n $t +i0K i1i +i0K i1a +$s $k $i $e $s +i0m i2k i1i +$a $l $s $o +$w $a $d $s +i3i i5o i4n +$t $a $k $e $n +*57 ] +T0 TC T1 T3 +$m $o $a $n $s +{ z1 +o47 Z4 x95 +st t +u ^5 ^7 ^9 ^1 +$j $a $d $e +i6t i7t i8e +'6 $^ +*04sgd +T0 TA T4 T3 +i6i i7o +'6 $f +i6i i71 +$l $a $d $y +'6 $+ +T5 ^I +$s $t $o $r $m +$n $u $k $e +o15 o3b $7 i5g +$* *34 +$s $i $g $n +$b $l $a $h +$w $a $x $y +$s $p $a $n +T2 T5 T9 TA +$Vy4syo +x06 -0 Z1 +$h $e $a $t +$m $o $n $e $y +$v $i $s $e +E s7; +c T4 se3 +$t $u $b $e +z2 Z3 +^2 i2b i3u o54 +o54 Z3 +$n $o $b $l $e +i1o i3l i2o +sn2 Z3 +o0e o6a o4_ i8a ,9 +i20 i30 +i20 i34 +i72 $8 +$c $l $o $t $h +z5 x24 x76 +$w $i $t $c $h +T4 $@ sGk +^S '7 +i6c i7o i81 +$w $a $l $k +x43 p1 +0 +$f $a $r $t +C *10 +$b $a $c $o $n +$j $u $i $c $e +^ ^I +c $4 d +Z5 x26 t +Y4L6 +T1 TA T7 T2 +i7Act +r+9 +r+3 +$v $e +i6. x82 +C ^_ +c sa@ so0 si! +y4 +4 $@ +$j $o $y $s +R0 $! *06 +i0H i1a +$o $k $a $y +[ .5 +s8m +T1 TA T7 T3 +$s $t $e $i $n +y3 s9* +$a $l $t $o $s +] $q ^Q +i8% $@ x38 +$9 +8 +i1a sp6 o32 o6s $e +*83 o5s +o5W x02 +$s $h $a $d +*54 i35 $a +i2* -1 +$v $a $l $i $d +$d $a $d $o +^n ^i ^a ^p ^s +i9s iA0 iB1 +i72 i91 i82 +$+ D5 +$+ D2 +$e Z3 +o5. Y1 +Z5 $- x45 +$a $x $i $s +Z3 +0 +$r $a $c $k +,7+7$) +T4 $@ +T1 TA T7 T8 +D2R7LB +$r $i $n $g +sG&Kx26 +T1 T8 T4 T9 +Eo6I} +i32 i52 i40 i61 +$s $h $o $e $s +$w $e $n $t +i8% x38 $@ +x75 } +T9x59 +z2 L7 +i0n i2k i1i +$a $b $c $d $e +$s $w $i $s $h +xA1 o9\ +i7e i8s i91 +$t $h $a $t +.7 u +$w $h $a $l $e +D5 o6g i89 i97 RA +T1 T8 T4 T7 +*51 d +^k $3 o6d +2 si3 +st7 $! +.5 ,A +y4 R3 x76 +$v $a $l $o $r +i1e i4a $h i5r $i +$o T7 +^m ^l ^i ^f +Y2*B5sKC +$t $h $i $n $g +i5i i6c i7k +^_ $6 +L7i8h +'Bi4KxB8 +$g $e $a $r +Z2 $M +$q $u $e $s $t +.2 y3 +z2 x47 +$g $u $m $b $o +y1 y5 +$j $o $k $e +i89 i99 iA0 +o4w t +$p $a $r $k +$K ^K u +$m $o $s $t +s1= i04 +$a $m $o $k +i81 i91 iA2 +x2A ^T +*47 o54 +s)os*eoB$ +^% ^$ ^# ^@ ^! +$g $a $i $t +$p $a $c $k +D8 u +Z3 .0 +$B $1 +T4 TB T8 T7 +$b $r $a $v $o +p5 ^- Z1 +i62 i71 i83 +c $+ ^+ +$t $a $t $s +T1 T8 T4 T2 +*84 { +f x24 x9B +$3 szb +i7s i85 +T0 TD TC T6 +si3 *31 +$l $i $n $k +$h Z3 +$# x16 +c $4 $M $e +E $p +y5 x38 E +$4 i10 +i93 iA6 iB9 +i6a i7s i81 +T1 T7 TA T8 +o1, } +x42 ^x +$w $e $i $r $d +i96 iA8 +$g $o $l $d +D4 { D2 +$r $i $c $h +$r $i $c $e +c ss$ sa@ se3 +t *12 p1 +s6V x54 +y1$7 +*97 c +r u +$d $e $a $l +i76 o68 +i0d *51 +^# $@ +i6a i71 i82 +*06 Z2 +T4 TB T8 T6 +$i $c $k $y +sr3 sb5 $6 $5 o4b +Y5 x04 +^9 ,6 o4e si4 o7f +$t $a $p $e $r +$s $t $e $a $m +$h $o $t $e $l +x17 q d +x8BsU,*36 +c T5 d +$s $i $c $k +o0k o2i i5c o7c o4u +s-o u +$c $l $a $s $h +Z2 k $9 +{ Z3 k ++3 *78 +Z1 *70 +T2 T5 T9 T3 +$t $r $a $i $n +$t $r $a $i $l +T2 T5 T9 T4 +rsYN.5 +o0d R9 +$s $p $u $d +$L *41 +$e $d $g $e +i52 i61 i70 +i1a i3a i2t +T4 sGk $@ +$r $o $a $r +$p $i $c $k $s +i85 i95 +c o3& +i85 i99 +i85 i98 +-4 s2m +R8,A+0 +i2n i3a i41 +$d $a $m $s +'5 i3e +T7 TB T9 TA +Y2x98 +Y5o0fs 3 +D7 +9 +$p $r $i $s $m +^=r +.5 o0N ,4 +$w $o $m $a $n +] ^Q $q +T4 T6 T7 T8 +*98 *79 +T2 TA TB +x24 r *30 +T2 TA TD +i7l i8d i91 +T2 TA T7 TB +$h $y $e $n $a +uL6 +z2 x2B +z3 o0n +sxL +$S $V +i2v i4l i3e +sqa*91*78 +Z3 y3 +T1 T6 T8 T7 +$m $a $t $c $h +*62 o18 *46 +sXMRAsIe ++4 ^c ^S +[ $+ x1A +^t ^e ^n +z1 x2B +t o9v +L3 o56 +s0y +^5 *96 +l ^6 ^8 ^9 ^1 +$l $C u +s0` +L5 ^G } +$r $o $c $k $y +Z1 x72 o48 +i1P { +$c $l $a $n +$c $l $a $w +c i62 +skP ,3 +c i6a +i70 i82 +T2 TA T7 T5 +o2Htsj? +,3 *02 +T0 T1 T4 T6 +D4 sah +c d se3 +x31 y1 +o5R Z1 ++3 $_ [ +s@\*52x21 +x68 o72 +T3 T7 T6 TB +p1 '7 +1 +$h $a $r $t +$O $1 +i9o iAl +*21T1 +T2 TA T7 T6 +y3 o9g +i49 i53 +^9 $d se6 su3 o6f +T4 T8 T6 TB +o59 d +o0b i37 o58 o14 o4e +$w $h $i $t $e +p5 Z1 ^- +$h $o $n $e $y +o0k i5c o2i o4u o7c +i4n i5e i61 +,1 l +i5r i60 i71 +q x81 +$f $a $c $e $s +T1 x56 $6 +^W $L o01 +i8n i91 iA9 +$b $r $a $t +o4y $4 o5e $u +$w $a $t $c $h +l $f +i60 i81 i70 +T0 T8 T4 T9 +Z2 o8u +x45 *15 +o5 sdh x13 +y3 o9N +$l $o $s $e $r +.2 { +i89 i98 iA5 +$g $l $o $b $e +^S x64 Z1 +T0 T8 T4 T2 +*8A Z1 +T4 TA T8 T7 +$l u $C +r } f +$h $i $g $h +c T3 si! +r ^P +$a $r $m $s +Z5 [ x37 +c i45 +i66 i74 +o80 o7r +x25*18 +$f $i $x $e $d +*79x97 +i0G z1 $5 +o0y i19 i40 o3j i6o +x32 $Y } +o0A Z2 +^P o84 +c i67 L6 +*36i9! +$s $t $i $n $k +$s $t $i $n $g +Z1 o48 x72 +*45 -7 ^0 +$g $r $a $i $l +i16 o2j sy4 $h +i6z i71 +'8 $I +$e $n $t $r $y +^4 so2 i2b sa3 o56 +$r $u $l $e $r +$t $i $t $s +r $g $e $n $y +$n $u $d $e +x19 Y2 +$W Z1 +T0 T8 T3 TB +-2c +y2sn>+4 +$b $i $m $b $o +$dx82 +$n $g +o6V $I +R0 *06 $! +ci5# +o55 *78 +$a $g $u $e +s59 q +$l $o $c $k $s +i0I u +c x26 +$t $w $i $c $e +^j z2 +i23 i34 ^2 ^1 +^W o01 $L +i70 i80 i99 +i70 i80 i91 +$m $e $s $a +T6 T7 T8 T9 +i0b i2o i1r +i6l i7e i81 +ci5- +s4v +si! T4 +*68 ^j x43 +i7s ^t +$i $r $a $t $e +$do59*87 +$p $a $n $g +c i2* +T1 T9 T5 T4 +^k +2 $3 si3 o6d +^H '7 +L6 D3 +T0 T7 T6 TA +^8 o68 +l $. $h $n +$p $a $d $r $e +z2 i73 +,7o5s +o0k i5c o7c o2i o4u +*74 x83 +d stp +c ^4 ^1 ^0 ^2 +s?@i4- +$b $l $i $n $k +$b $l $i $n $d +o8$ E ++1 ss0 sc5 i67 o7a +i9g iAo iBn +x71o4s +i5i i6e i71 +^m ^a ^I +T3 T5 T4 TA +$r L5 +p1 x68 s68 ++5sKJ^a +i2v i3- i7a +*80-9 +x01 f t +T0 T3 T6 TB +x41 Z3 *23 +x53^p'9 +c sdl ] +c o1* +i65 i76 i87 +$p $i $n $g +x42^mx8B +^9 d z2 +D3 ^H Z4 +i3e i5e i4l +i84 i91 +i84 i93 +i84 i99 +i30 T4 +,5 u +$1$9$4$8 +i71 i80 i92 +x15 z3 t +Y1*69 +o0w o4v +2 sf4 o6p +o0w o4v sf4 +2 o6p +T2 T3 TB T7 +-3 *06 +i3t i41 i52 +$!*B0c +^0 ^q o3e o6o +o1y $f sl1 $l se2 +i1Y L4 +$w $i $l $d $s +$t $u $s $k +x15 x21 +-9oAq +$f $o $r $t $h +i5g i61 i72 +p1 spx +$s $h $o $c $k +o4KE*38 +$m $u $c $h +i6i i7o i81 +$m $a $i $n +i69 i79 i85 +^9 su3 se6 $d o6f +i6t i71 +c se3 d +o0g i2i o3t i4a +i5n i62 i72 +i6o i7t i81 +$w $i $r $e +i19 i22 ++1 p1 +c ^w ^o ^l +c $i $s $h +o1d i69 o75 D2 i5c +i90 iA0 iB2 +d -5 +$# *97 +Z4 +5 +$*Ex3B +$t $o $f $u +$M $* +'6 p5 y5 +$c $r $a $s $h +T0 TB T4 T2 +i2m x46 o52 +i63 i78 +Z3 D5 o4u +EoA! +i8x x04 +x81 sdj +$.x0BT1 +$p $i $p $e $r +se2 o3f $4 o59 sc0 +*05 *30 +i1i i2l i3e +$a $v $e $r +T8 D5 sKp +$l $i $s $t +c si! ss$ +$e $y $e $s +$g $i $z $m $o +Z5 k +i5o i61 i72 +x81 o6v +$! l i4- +$d $e $n $i $m +D4 ,3 +o2! k +q x2A x23 +$c $l $o $w $n +p1 i5@ +$f $i $l $e $s +i62 i80 i70 i96 +o2#] +c so0 sa@ si! +$h $a $l $e +^9 su3 o6f $d se6 +p4 ,3 +$v $i $l $e +^4 o62 +T1 $2 Z4 +sa. i3. i4a ,5 i7b +$s $m $i $l $e +D7 i72 +sWC +.9 +B +$. $b $v +$f $i $g $h $t +$b $y $t $e +L8 *52 +$d $u $t $y +$s $i $n $g +$r $k +$c $u $r $t +$m ^6 +$c $h $a $r $s +i25 i35 +$m $a $c $h $o +o1y z1 +T2 T5 T4 TA +*85 { +$7 L0 +i3= x42 +$7 L1 +x13sv|Y2 +Z2 o0D +k R1 +T6 T8 T7 T9 +T6 T7 T9 T8 +*12 i4! +c si! T2 +c si! T3 +*61 ,1 +c^G.B +x1B Y5 +*B6ssz-7 +i92 iA1 iB4 +p3 $q +$o $n $t $o +Z4 x28 d +u i1. $. i3. +$f $r $o $g +'6 L5 +$n $o $v $e $l +z2 i1m *13 +u ,4 +} x16 +$6 svV +i8e i9n iAt +.7 } +T5Z2 +i11 i20 i32 +^5} +$w $i $n $k +$w $i $n $e +Y3[ +o43*BAZ1 +-7 R2 +$s $l $a $s $h ++8 p4 +$o $d $o $r +Eo5P +T2 T6 T8 T3 +c o67 +$p $i $n $t $o +^q z5 +x01 t f +i4 E +$p $a $r $t $s +i1u i3b i2m +$t $r $i $o +^9 si4 ,6 o7f o4e +i32 'A +$e $o $u $s +z4 srn x59 +o1_ $z +T0 T8 T3 TA +i70 i81 i90 +^0 ^2 o3e $r i6i +p1 x51 +Z3x13 +i1i i2l i3v +$f x28 D3 +R2 i00 +$t $o $p $i $c ++0 $$ +*16 u +o14 k K +$s $c $a $b +$s $m $a $s $h +i7l i81 +o1y $f se2 sl1 $l +o15 i5g o3b $7 +z1 '6 $0 +$l $i $e $s +'6 L2 +s1k ] +$8 z1 c +'6 L0 +$2 sqr t +q t x52 +sgs c +$s $o $b $e $r +x52iAA^5 +o0c sg2 o2q o41 o1j +d o6t [ +u i7N +d *20 +^^ z1 +r $t +o2(lx58 +$t $u $r $n +i50 i75 i60 +*54 $a i35 +se2 sc0 o3f o59 $4 +c p3 '8 +$s $h $r $e $d +D3 Z4 ^H ++9 x06 +$m $e $l $o $n +^ax72iA4 +$s $h $o $p +Z1 x16 $= +i77 i88 i99 +]T1R0 +sH=o2z +$s $a $n $g +$0 x32 y5 +$TsbW +T2 T3 TB T4 +T2 T4 T6 TB +i4c s3* x16 +x51 s5# +c T2 d +$o $z $o $n $e ++1 i67 o7a sc5 ss0 +$r $o $m $a $n +c ^ ^I +$t $i $r $e +z3 Y1 +x13 p1 +i4d i51 i62 +*B2Ey5 +T2 T3 TB T8 +$p $o $r $t +T0 T9 T1 TB +Y5+6 +T2 i2& +$w $a $n $t +x73 ^5 +i8r i99 +c ] sdl +$c $o $c $k +i4a i51 i62 +$l $i $r $a +T2 TA TD T3 +$n $o $t $e +T3 T6 T9 T8 +i4y i51 i62 +x9Bo5Bx09 +i8r i93 +s23 *48 +T7 $0 +$w $e $a $r +Z3 o2l +'9 Y5 +}s?0*59 +c +B T6 +$T [ +o5H x31 +i20 i37 i41 +r $q +o0z i5a o3i o2l i6d +i1a i3t i2s +$a $j $a $r +$+ +7 +$d $. +x39 [ +D6 o3g +*8B *A8 +o1y *41 +[ x1A $+ +i34Y4,0 +$b $u $y $e $r +T0 T1 T7 TC +T0 T1 T7 TA +$? x71 +$b $i $s $o $n +$r $u $s $h +^y ^a +*70*02 +$m $i $n $d +$b $o $g $u $s +$m $i $n $t +$m $i $n $x +$l $a $t $e $r +$a $p $s $e +i3n i4k +q -A +-3 o96 +i7n i82 i91 +o0u i18 $9 $5 $8 +x24sHC +$r $a $g $e +x72.AY4 +x61y1x52 +i95 iA1 +*5A x45 +^h ^t i8i oAt o2u +o16 z2 +$zx16 +x71x25x81 +i16 '9 R0 +^3 z5 +i7c i8e +$g $u $n $s +c ^+ $+ +s0q -4 +z1 ^L +^9 o4e si4 ,6 o7f +i7n *45 +o0z o3i i5a o2l i6d +iBPsn=L9 +i0? $! +d *64 +o1y $f sl1 se2 $l +c si! so0 sa@ +$c $a $n $s +$t $i $m $e $s +T1 T7 T8 T6 +i28 i34 +i6o i7r i81 +T1 T9 T6 T3 +i15 i20 +$ox73 +'Z +$o $c $e $a $n +o0b o14 i37 o58 o4e ++Az2 +{*85 +oAt*53 +T0 T8 T3 TD +$n $a $k $e $d +i3a i5d i4n +,A*B8Z1 +z4 x59 srn +^t^a^f +sOe +^l^i ++6 ^` +x23 $* [ +o0l i2c ] o1c o4b +^9^4^9^1 +i72 i81 i92 +i72 i81 i91 +$a $c $e $s +$B -3 +T1 Z4 $2 +i1a $e o32 sp6 o6s +o0w +2 o4v o6p sf4 +] *08 +i59 i60 i70 +$s $p $a $d $e ++3 [ $_ +*56 i5f +7 +i33 i47 +$d x45 p1 +$$ o0J +$3$0$9$9 +T0 T7 T2 TC +^s^s^a^p +$l $e $g $a $l +i24 i31 +*02 ] y1 +[K$e +c i5* +$v $i $o $l $a +Z2 [ $. +$c $o $n $e +se1 sl7 i32 o75 st3 +^ ^s^i^ ^s^i^h^t +$t $o $n $e $r +*65 x32 +i94 iA5 iB6 +$h$e$a$d +l$t$e$s$t +*02 o3f +$i $r $k $e $d +T0T1T2T3T4 +u $c +*57s{q{ +k [ z3 +$r $! +i35 i41 i59 +^\l +i5n i61 i73 +^Y z2 +i89q +o1c o75 o3j o69 o5d +c sa@ ss$ se3 +$m $a $n $e +$g $r $o $w $l +^V +3 +q x23 x2A +i3a i40 o59 +i3a i40 o57 +$m $o $n $k $s +o2Y '7 +o0z o4n i6a o72 o53 +$. o7` +T1 +7 +'By3 +T0 T7 T2 TA +i16 i24 +sDTy4 +$g $u $a $r $d +.8 o2p +$m $a $t $e +K *49 +*71 ,2 +$6 y5 +$f $l $o $a $t +^k +2 si3 $3 o6d +$n $e $s $t +-BiAB +$* o23 +p1 s68 x68 +i7e i81 i91 +$j $o $h $n $s +q *26 +$l $a $t $s +$c $a $r $s +$s $c $o $p $e +$w $i $l $d +i82 i92 iA1 +.2L5 +$g $o $a $t +$b $e $a $m +i3i i5a i4n +$e $& +$r $i $t $e +$l $e $a $r $n +*74 x24 +*53 f +o2u i4e o3t i5e o9p +T0 TB T3 T4 +o64 $! +c i59 T6 +i2c i4r i3a +p1 x03 $y +xA9y4 +^o o3i se_ i7a +i83 i97 +i83 i98 +$r $i $t $e $s +c $i $l $y +Z5 z5 x28 +u D0 +i8n i9g iA1 +l $0 $8 o52 +T0 TC T3 T1 +*09 x05 +$w $i $e $l $d +p1 $O +i2s i3u i4k +sCb ++9 +E +$s $n $o $r $e +R2 $8 +$8 d D7 +$% +5 +^7 ^9 ^1 o32 +sun sjk +c i43 T5 +*04 R3 *42 +$r c +$l $o $r $d $s +d x27 '4 y4 +sl1 T1 +$l $o $t $u $s +T0 T2 T9 T4 +i62 i72 i83 +u $. i1. i3. +o3# +5 +C o77 +o0P $r +i0j i2c i1a +$c $i $r $c $a +.4 +6 +l x23 d +k ^K +$c $z $a $r +$h $e $a $d $s +$? +5 +d $m $a $n +i8c i9e iA1 +$t $r $a $p +o0e o6a i8a o4_ ,9 +$s $w $a $n +$d $r $e $w +i99 iA3 +,1 ] +o7f *23 D8 +$d $a $i $s $y +s0% x31 +o0z se0 $c o2a *56 +i82 i91 iA2 +o15 si0 .2 $7 $2 +T2 T6 T8 TB +Z5 t x26 +T0 T6 T1 T4 +$a $g $e $s +i1i i3a i2k +y4 $@ +4 +^5 o17 r +i7e i81 i90 +T0 TB T3 T6 +T7 TB T8 TA +$O [ +c d so0 +o08 $J +s9u x05 +$h $e $l $d +[ ^I -1 +$h $e $l $p +i76 i81 +x17 '6 +$l $a $i $n +R6 i3a +x54 o1F +x54 x31 +i44 i53 i62 +$p $a $l $s +i2s i4r i3e +c sa@ si! so0 +$l $i $o $n $s +R3 E +Z3 sy7 +$s $p $i $c $y +$t $h $o $n $g +,B +4 +i80 i92 +i80 i93 +o0p $i +o2j D6 o34 o7d +Z3 o4u D5 +K x78 +D4 s.? +$f $a $n $s +T4 T6 TA TB +$t $i $n $e +$v x58 +s4% +i6a i7h i81 +T1 T8 T2 TA +$k $i $n $k $y +i90 iA7 +i90 iA5 +c T6 +B +x41 *23 Z3 +i7z i81 +x26 skr ^b +*02 *79 +$v $e $i $l +c o8* +^5 ^0 r +y3 x89 +x43 K +$n $u $t $s +z2 K +*45 ^h +z2 o0! i0f +o0i o2w $f sa1 i32 +i2i Y4 x52 +r i6y i0a +$P x64 +sGB +i01 i12 i20 +i01 i12 i22 +T1 T8 T2 TB +'4 t d +^o *24 +$m $o $n $k +$y $o $u $n $g +z3 $5 +i58 u +i50 i60 i76 +$w $i $n $d $y +i50 i60 i74 +z4 xB1 +^@ Z3 x46 +$c $a $s $e +^c ^k o3k i5w ] +T5 TA T7 T9 +y4 l '8 +{ ^* +$7 d +$p $e $a $r $l +$d $i $s $h +$d $o $r $k +c x83 Z3 +$p $i $t $a +r *01 i1l +o6m Z1 +c $_ d ] +$t $o $a $s $t +T0 T6 T1 T9 +$V x29 +c i58 T6 +$f $u $n $k $y +p2 ^a +$l $i $t $e +i32 i46 +$v $i $x $e $n +o0z $c o2a se0 *56 +^f x58 o2u +*87 x02 +d $# +$c $r $u $e $l +T0 TB T3 T2 +-3 ,2 +y4 oB= +-1 o26 +c ss$ se3 sa@ +$b $i $r $d +i5u i6s i71 +sy5 +i71 i92 i81 +*02 y1 ] +$n $e $w $s +T0 T1 T7 T3 +$b $o $a $r $d +*05 x28 +$s $t $e $w +$i $7 +i6d x13 +c so0 si! sa@ +c i11 i31 i51 i71 +$i $r $o $n $s +c $. $m $t +$h $o $c $k +$f $l $a $s $h +$6 i4c Z1 +i2e i3l i4l +u i1. i3. $. +i4y o5e $4 $u +i12 z3 +$e $a $r $t $h +$f $e $s $t +x14 i3A +z2 i1_ +^e ^g ^r ^o ^j +p5 i6& +o0k o4u i5c o2i o7c +i6s i71 i89 +o0z i6a o53 o72 o4n +t r o3R +^7 i41 i58 o1c o6c +x05 ^? +$d $r $i $n $k ++F -4 +l $0 o52 $8 +$e $v $e $n $t +i6c i7k +*65 d +i4s i6a i5t +o0c sg2 o1j o41 o2q +T2 T5 T4 T9 +sy9 $7 +c o4# +c o4_ +$c $o $p $e +i6u i7s i81 +i4u i51 +Z1 -6 ^* +sxa +.9 x63 +$l $i $l $t +o0x x56 +^3 } $6 +$r $u $n $e +*89 ^y +$0 $l +$s $c $o $r $e +c Z3 x83 +i8n i90 +$7 i0x +i7l i8y i91 ++9 i6s $2 +$U [ u +T3 TA T7 T8 +o3y D5 +i74 i86 +i74 i85 +$m $a $l $e $s +T3 TA T7 T5 +$c $r $e $w +l o52 $0 $8 +$s $a $i $d +$c $o $u $r $t +T4 TA T7 TB +$c $r $o $w +$5 $- +i34 i49 +c i7* +$/ -0 +T4 T9 TB T8 +Z2 i6x +Z2 i6n +f x24 +$6 Z1 i4c +T5 T6 T7 T9 +si1 T4 +i34 i47 +$j $u $n $t $a +x41 o1l k +z1 xA3 +$s $p $a $r $e +x92 l +$s $t $a $r $e +$s $t $a $r $k +c $. $d $k +$n $1 +i9e iAy +Y3 D3 +$r $a $d $i $o +l^X^X$X$X +o87 xA2 +T4 TA T7 T8 +c sa@ se3 ss$ +o2> +u i11 i31 i51 +Z1o1Lo1c +y3 +5 ,1 +y3 *42 +*45 *25 +o1K x47 +$# d +T4 TA T7 T9 +$n $o $s $e +^e ^y i5k i6o o81 +$f $i $n $a $l ++5 ^C ++5 ^D +$ur +i80D0 +x87 K +*76 z1 +x32 R8 ] +c i56 +c i53 +x51 ^R +c ^- ^x ^e +*31o32 +$y $a $w $n +$f $u $r $y +$d $i $r $t +i82 i93 iA1 +$o $a $k $s ++6$! +o13 x73 +iF1 iG2 iH3 iI4 iJ5 +i6k r [ +$m $i $g $h $t +T2 T6 T7 TA +i3s i4w +o6J ] +Z2o46 +$ti7a +$p $h $o $n $e +i61 i72 i81 +$y $o $g $i +$h $i $n $d +i81 i94 iA3 +^t ^e ^m +L4 o5f +i0s i2o i1h +x52$@T0 +c d sa4 +*89o7p +^m ^S +o0z *56 o2a $c se0 +^0 $c +$p $i $n $u $p +l K Y2 +-6-6-6-6 +i22 *42 *52 +i3nl ++F -A +$m $a $t $e $s +T1T0 +^9 $d o6f se6 su3 +l $. $d $z +$. $e $r +i12 i28 +*34+5 +c^2^0 +$a $r $t $s +c i27 T3 +T2 T6 TC T4 +$w $a $r $p +$w $a $r $s +o15 $7 .2 $2 si0 +i50 i76 i60 +$n $e $c $k +c T4 ss$ +i1a o32 o6s $e sp6 +*93 '7 +z2 $2 +i1, Z2 +i37 i59 i48 +l $. $d $o +$.$c$o$m +o1a i6o o5m $a o8k +o5K +5 +i6Sx62T1 +c T2 si! +i7y i81 +$k $i $l $o +c$1$9$6$0 +i4k $9 +T2 T4 T5 TA +$s $u $r $e +$1 i35 +d *84 x06 +$w $r $a $t $h +*68 l +i75 i81 +T1 T8 T2 T4 +x42 sjb D8 +$s $c $i $o $n +$p $a $t $h +$* ^k +i32 y3 +$e $a $r $s +$1 *A2 +$e $a $r $l ++3 D1 +$s $p $a $c $e +se2 o3f $4 sc0 o59 +i6s i8e i7t +$h $o $m $e +^o ^i ^l ^u ^j +^l ^o ^c +se2 o59 $4 o3f sc0 +i6e i73 +$b $o $n $e +*51R1 +T0 T7 TD +$s $a $v $e $r +o96 -2 +$d $r $o $p $s +$s $a $v $e $d +i10 i21 i30 +T2 TA TB T8 +sf_ +fx61 +$d $o $g $s +Z3 k } +$8 Y1 *43 +l d 'D $3 +$s $e $a $l +i60 i70 i81 +i60 i70 i82 +d *B1 +$6 $- +x17 d q +$n $o $e $l +'4 d t +$l $i $v $e $s +T2 TA TB T7 +c i17 +$c $h $a $t +'8*74 +c i1$ +i47T5 +i1a o6s $e sp6 o32 +$? *34 +o46 x01 +i79 i82 +r *98 +x56 i5M +i00 i15 i20 +$Q Z1 +o4tD5 +x78 $j +$Y $2 +c ss$ si! +'7} +$d $e $l $t $a +i82 iA1 i92 +i10 i20 +x15 t z3 +x45 x49 +$m $i $m $e $d +i01 i14 i27 +T2 TA TB T4 +y4 '8 l +$s $l $u $t +xB1 i1& +i9X l x54 +o1mo0e +i4k $5 +sa@so0si! +i8i i9r iAl +o4Yc +o14l +x29 y4 +y3 $0 +i4+ '7 +T1 T9 T8 T4 +$c $r $a $p +x03 x03 .6 +$c $a $t $s +$n $o $r $m +i13 i27 +c ss$ T4 +.5 ,4 o0N +o80 *95 +$s $u $n $g +i92 iA1 iB1 +$j $u $m $p +i5n i68 +o0i sa1 o2w $f i32 +$l $a $s $t +$p $l $o $y +$h $a $r $e $m +D5 i89 i97 RA o6g +^a i74 oAo o8u $w +i82 i90 iA1 +se2 o59 sc0 $4 o3f +$p $u $p $i $l +i9l iAy iB1 +$t $a $g $s +si1 d +$s $i $r $e $n +scP u +$j $i $v $e +o1c o3j o69 o75 o5d +T4 T7 TA TB +i6a i79 i89 +T3 T6 T8 T9 +$b $e $l $o $w +'8^4 +$f $o $u $l +*68-6 +Z5 s4x +c^5 +T0 T7 TC T2 +.2 *52 +o0W *31 +$! i4- l +^0 ^k +T6 T8 T9 T7 +$2o8b +c si! sa@ so0 +$d $o $d $g $e +x25 Z3 +$c $u $b $e +c se3 sa@ ss$ +^o ^l ^b ^a ^p +i3t i5e i4l +i36 i45 +$d $i $v $a +$s $h $o $n $e +i29 i33 +i29 i38 +T3 T4 T5 TA +i16 sy4 o2j $h +o0w sf4 o4v +2 o6p +T1 T9 T8 T5 +$g $a $t $e $s +^0 $6 so0 ,6 sm0 +T2 TA T4 TB +T1 TA T5 T3 +$} +A +*63 *23 +R4 ^0 +i9l iAe iBs +$p $u $n $k +i01 i15 i20 +T6 TA T7 T8 +c ^i ^m ^e ^d +D1 i3K +$s $a $n $d +$e $a $s $t +k+2 +$h $o $l $y +^o x28 +sAV o8M +*04 *42 R3 +i8@$5 +$h $o $l $e +T6 T9 T8 T7 +$c $l $a $n $g +$c $r $y $p $t +i22 [ +$f $a $r $m $s +^e ^c ^n ^o +i72 i89 +T5 T9 TA T6 +$. $g $l +T0 TA T7 TB +$a$b$c +c$6$6$6 +$b $u $n $s +i98 iA9 iB0 +$b $u $n $g +d sr3 +c sa4 d +xB3 ] +$u $g $l $y +c so0 d +*14 o7@ +i72 i83 i94 +T2 T4 T3 T8 +T1 T9 T8 TB +c se3 T4 ++6 y4 +$w $a $g $o $n +x34 ^8 { +Z1 c x27 +$D$S +i31 i52 i41 +x42*53 +$e $l $i $t $e +'8^R +^0 $r ^2 i6i o3e +i7c i81 +T0 T3 T7 T1 +x05 $/ +T2 T8 T3 TA +i7h i8t +$d $a $d $o $s +c i11 i32 i53 i74 +$m $i $e $n +i0D i1a +$m $o $u $s $e +sa@se3 +Z5 x45 $- +c $0 d ] +i65 i72 +i97 iA0 +T4 T7 T8 T6 +o0l i2c o1c ] o4b +i2m i4n i3o +^z o75 o6u o3a +i3n i41 i52 +^0 $r ^2 o3e i6i +RA 'B +$f $a $s $t +D6$m +$e $a $g $l $e +x29 K y4 +$0 $_ +c se3 ss$ sa@ +$i $t $e $m +se3T3 +i3f-4 +$g $r $a $m +,6 i75 x41 +T0 T2 T4 TB +i2o i34 i4b ,7 +$c $l $o $s $e +o4B l +$s $p $o $r $t +T4 TB TE T7 +x23 [ $* +T5 TA T7 +sa4sc*57 +^t ^n ^a +^s ^a ^w +spx *34 +szi *79 +i72 i82 i93 +y3o0i +*53 o1$ +^o ^M +$$i8Cx2A +st`*82 +z3p5 +}x36 +T2 T7 T6 TA +$j $a $s $o $n +L0 '7 l +Y4 ,1 p2 +Z4 Y4 +TBko6u +r sbq +^d ^e ^n ^w ^o +*21 x24 sdE +cY4Y3 +t skC +i32i40i53i62 +x59x7By3 +*81 x84 +*70 x52 +z1 sDH +$c $h $a $i $r +^s ^u ^n ^i ^m +q x13 +Y2 sGH +soi sy% +^g ^n ^a ^d +d x31 +K s3r +^k ^s ^u ^m +i0" x67 +x35 $X +y2sKp +sRw D6 +s&^ +$,$~ +^z o7o +$_$~ +x0AY2 +s&S +i1a i2s i3u +s&N +s&O +o2; x75 +^w+7 +$t $r $a $n +Y4s29 +$v $i $v $a $s +sB# +x02^u +$_$, +$t $i $t $a $n +x95sk2i3m ++2*20 +l $. $t $m +l $. $t $l +o7, *64 -5 +^2 x32 +o4us#W +*7Bi5l +z4TA +o0 Z5 +^c ^l ^s +$a $h $o $y +s&. +*84 *47 +-9 ^4 +ks+Hd +T6 i0! +$f $o $r $u $m +} sJ6 +y4x51D7 +x25 *52 +*A9 +8 +t sgD +z2R0 +l $. $t $v +T0 T5 T6 TB +}se0R5 +q x7B +x07o31y1 ++9 *9A sjy +^o ^w +o37k*06 +,4^n +^g ^a +^w ^o ^w +^n ^a ^c ^s +$r $a $t $s +Y1 x92 ,8 +^m ^a ^l ^s ^i +i8? .0 +-8+D +sM' +D0 .1 +{sEio20 +T0 T8 T2 T4 +^8 ^n +sy[ [ +*87i9[ +sV9 o4D +^a ^k ^i ^t ^a +K x56 x43 +spX +$e $n $e $m $y +*8A *B9 +,1 R2 +i4a i5d i6o +^u ^n ^a ^m +$k $a $r $i +^v ^d +'9 i6' +o5(] +^c ^c ^n +^o ^m ^s ^o ^k +Z3z4 +*73 E *93 +^h ^c ^a ^u ^m +^e ^h ^t ^a ^k +i2l+2 +o3bz1 +r sz; +*80Y4o1w +^k ^s ^i ^f +.3 so* +^d ^o ^h ^s +sTA sD4 +x28 o1I +x37 x39 +,5 x85 +*46 sF8 +p5sQ?x96 +^i ^m ^a ^k +$o+8 +$k $i $r $k +'8o12 +Y4 x02 xA5 +x1A *32 +^t ^e ^p ^y ^m +x85 $6 +] y1 *98 +^n ^o ^n ^a ^c +^j x58 +$m $o +^f ^f ^e ^j +s6Y k +*05 x4A +,2 r +^_ T4 +T3 TA TB T8 +^e ^L +x58 Y4 +*07 x58 +c $l $a $t $e +sai sLf +*B5 $W x19 +z2T4xA3 +x5A { t +p3 xB5 *A6 +y1 R1 x3B +d x32 o6y +$}s i-9 +^a ^w ^a ^k +Y4 *01 +^d C +x91z3 +[$' +^n ^o ^n ^a ^k +*82 *54 E +*39x45LA +x68 ^$ +c ^y ^e ^h +$p $e $t $s +.0x56 +$/$< +o6> *20 +.8 o7z +LAi8ex25 +^y ^n ^a ^d +$m $i $l $o +^y ^n ^a ^f +*53 Z2 +o4C *45 +^g ^n ^a ^h ^t +y4 *36 -3 +T0 T9 T3 TD +T1 T3 T6 T9 +sE< +oBc x61 +] *4B x46 +x28 x0B +lo1@ +i6c R9 +$l $e +sJno3`s*Z +^i ^n ^u +*28 $E x86 +^e ^J +$3 x23 x95 +x41 sh5 +sP3 +Y4s42 +sY5 *52 +i8# u +sy! [ +saG sGE +x13 x47 +$I-9C +^d $4 ^g $u +sZg*72siv +$bR3x08 +$b $a $s $h +o1mZ2 +f d '7 +^j ^a +R7sgs +$V sM. l +$a $u $d $r $a +^% *01 K +i59{ +x18 ^e +^c ^y ^m +^j ^g +^l ^a ^r ^o ^c +y2 o0" +.5 y5 $1 +i43 z1 +^a ^y ^o ^r ^t +^e ^e ^l ^y ^m +^k ^r ^e ^j +D2 $I Z1 +cx18 +^m ^a ^e ^b +i34o5Tc +,2 iB2 +i9#^( +$d $u $m $b +^j T6 +x12 ^t +$s $i $n $g $h +^u ^n ^e ^m +-1 sv0 +^o ^a ^h ^c +*13i0w +^t ^d ^j +,7x53 +i07 Z2 +^1 ^M +L2 sds +D0 p4 +sA[ +i0f -7 ] +^v ^n +o4$ oBd +s|>*18*47 +$e $l $m $o +-3 i18 +z4Z2 +$au +$_ x2B +T2 T9 T7 T5 +x12 ^c +Z1 R1 +^a ^n ^i ^b +] i86 +p4$)xA3 +^i ^r ^k ^i ^f +x04*73 +$s $h $u $n +z3 x76 +^a ^u +p1 *20 +i1n q +f .5 +o2+ *05 +y4.7sda +x05 *25 +^a ^n ^i ^v +^a ^n ^i ^z +^y ^e ^b ^o +f o2e *53 +i0s i1p i2e +^n ^i ^m ^r ^a +t z4 +sXfxA2 +Z2 D7 +iAT c x3A +^t ^p ^e ^h +*B9 D6 +o1c o3j o75 o69 o5d +$. $m $i $l +y5x9B^t +sB1 +4 +sQ< +p4 iAm l +o0l i2c o1c o4b ] +D5^6 +^d ^n ^a ^e ^m +*5As^Kc +*03 Z3 +Y4x65 +sMQ*57z5 +-7D6 +.1 spm +sKZ T0 +c D7 *05 +^a ^n ^a ^i ^d +x57{*B6 +^s ^d +-5 ^g +^i ^j ^e ^n +^a ^n ^a ^i ^l +o2y i4u i8l o9m o6f +D6 sZS +p1 xB4 +x45 x75 +*31x59f +*53 x46 +$r $a $c $e +u *92 +^s ^r ^a ^t ^s +Z3 *12 +y1 s&Q +p1 *63 +x59 s'v +z1oAH ++2 R4 +^I *76 +p1 K [ +*07 $G +^o ^b ^a ^c +T1 TA T6 T2 +sAL Y3 +c $d $e $n +p1 *67 +lse3si1 +o73 u +$Y sQN +^o ^b ^a ^g +x01 Z5 +Z1sA* +*23 x56 +i5l i7v i6o +y1sp!x37 +x08 y5 x92 +] i1K *63 +$h *71 +i74 i36 +*A0 x14 +^v ^e +^l ^l ^i ^b +^; Z3 x45 +x63 p5 C +DB [ o7s +^f ^f ^u ^c +^g ^n ^a ^r ^o +z2 $k +*76 Y2 +-3Z3xA6 +*42 k +$?+6 +Y3 Z2 +s=` +^c ^u +i41 i51 i62 +z2 $z +i5Sl +^a ^n ^a ^z +^y ^a ^h ^c +*26swKiB\ +^a ^m ^e ^h +^S k x75 +$e $t $h $a $n +$w $h $o $r $e +$?$@ +$1d] +rsM'o9L +x58 C +s=- +o0b o14 i37 o4e o58 +^a ^n ^a ^k +o0w o6p sf4 o4v +2 +y1 x74 +^` ^` +[ y2 +1 +p1 ] k +L9*56i7, +^i ^r +o81 sub +r x85 +^b ^m ^a ^i +s1% +o1F sO4 +^o ^n ^o ^j +s=5 +t sUR +^c ^n ^m +srq Y2 +s1V +sDh^j +x14 sEb +^o ^d ^r ^o ^g +tz2Y1 +^b ^r ^o +x54 i1$ +i9x x16 +^y ^a ^c ^e ^d +x75x53 +s`* +$] x07 +^i ^w +x17 z4 +y2 Z2 x3B +R5*A8*2A +^4 Y5 +*25^-*4B +s`= +x67 o00 +s`3 +^c ^m ^j +^e ^v ^i ^h +i3h p1 +z3 +5 o3r +tZ4slb +*05 i2L +o1e i3i i6e i7n o9m +x3A ^x +y2 R8 +x6A Z1 +^n ^a ^m ^o +sM>ul +$b $r $e $a $k +^a ^i ^h ^c +Y5 p3 D1 +^o ^g ^e ^i ^d +sP;*94 +^o ^j ^o ^r +^l ^a ^r ^i ^v +i14 ss6 $9 i35 $3 +o6V t x03 +sD_i6( +i8i i9s iA1 +$- sbC +x7B*45 +^f ^l ^c +sCB +sIu *01 +-4CY1 +$5 Z5 +^a ^w +$r $y $a $n +^a ^i ^n ^u ^d +^l ^l +*89 x98 +^9 ,6 si4 o7f o4e +^s ^h ^t ^a ^m +^! *47 +*5A o5s +^h ^s ^u ^r ^c +] st% +r,B +r,A +^? ^= +*12 '5 +D2 ^N +$w -4 x67 +i43 *60 +i1u Z3 +x3B ^W +Z5 x54 +x6B o0P +r x69 +o2b sr/ +^9 o6f se6 su3 $d +^o ^t ^a ^g +] *92 +L3 Z1 +x3By5$p +r Z2 p5 +$6 sys $3 +$I x63 x31 +$m $a $r $s +$v $i $c +L4 '5 +i9u iA1 +*30 x15 +sa7 D6 +*03s<'o3H +sIVY2 +*56 i8b +Y5 x96 +$g $r $a $n $d +i6i i81 i7n +^p ^i ^r ^g +^s ^o ^d +stv -8 +*70 K +'7 sfn +^y ^n ^i ^a ^r +^o ^h ^c ^a ^m +*94 K x34 +x76 y4 +x84 Y2 ++6 Z5 x85 +xB3 x13 +*53 -1 x74 +i4) +sR0 +^t ^i ^h ^s +*15 o0U +sa' +Z2 D9 +$s $a $m $e +^Y ^1 +*75 z1 +$f $o $r $d +i1e i2a i3t +,3*B3 +^o ^t ^o ^s +p3 x28 +i16 sr8 i3i $q +^a ^t ^i ^m +xB1Z2*84 +K*68i4O +^o z2 o5l +^y ^S +l +9 +i7f i3b +D0sNb +i3m i5r i4a +$j $o $e +z5^Kx31 +s!R+7 +^l ^u ^d ^b ^a +^a ^t ^i ^s +^r ^e ^n ^w ^o +*38s^Z +luD9 +x63 C p5 +^a ^t ^i ^r +*23 f +Z1 *16 ,4 +^Z o1R r +x5A t { +i4y i6s $9 $7 $1 +i78 i1f +^( ^( +^0 i5y +^y ^e ^l ^i ^m +T3 TA T6 T9 +^c ^r ^a +$f $i $l $m $s +*87 sdT +^D z1 +z3 *16 *70 +s6J +^a ^n ^e ^j +^i ^h ^c ^a ^s +x61p2x24 +K x43 x56 +^i ^n ^g ^a +'5 i1l +sZ1 +^y p1 +i59 ,5 +^d ^d ^u ^j +$l $a $t $h +sbn sfF +u x23 $F +x59 $I +se\ .3 +^a ^w ^r ^a ^m +c $n $e +^y ^k ^l ^i ^m +T0 TC TD T6 +c ^x ^n ^i ^j +L9 [ +sX2 +sX7 +^i ^g ^i ^d +$g $d +^a ^k ^s +s$Zx8A +^g ^w ^a ^d +*A7 xA2 +s5Z *06 +^9 se6 $d o6f su3 +k d u +k u d +i9_ o9I +*A6 l +i7e i82 i90 +i52i60i71i84 +^t x87 +k*16 +*6At +o0w +2 o6p sf4 o4v +*21 q +x61o3^D8 +r i8A x1B +^t ^s ^o ^h +^o ^o ^h ^s +sZp +[ Z2 R8 +[ x4B +^( ssq t +^+ ^- +$t $h $r $u +p1 *53 +q x84 *70 +c $. $u $k +i4/ ^1 +su/*BAK +^^ p1 +*31 i3& +*37 x48 +^i ^j ^n ^a ^s +.8s7r +$n $e $v $a +TB*20s_^ +i3) *43 +$p $h $i $l +$_ sZx +*97Z4 +$a $n $u $s +z3T1 +l .9 +z4 o2u +^9 ,6 o7f o4e si4 +x01 x74 sTK +i4my1 +*19 p5 } +$a $m $e $n +$m $m +,AZ4 +r x56 +Z1 $, x54 +$|$! +p2 s08 +k+9 +^s ^y ^h ^r +*A0^tx87 +svQ*51 +.5 $1 y5 +$i $n $a +^i ^n ^i ^h ^c +{$Tx14 +^a ^i ^z ^e ^k +$ei8c +-6+D +c x39 +*7BsHyi0; +xB2*4A +$m $d +s@A ^S +^z ^m ^a ^c +$9 y4 +^d ^l ^o ^b +.5 ^u +y3 '8 .2 +^k ^n ^i ^l +*35x56z5 +k sFd +o0z $c se0 *56 o2a +^; ^/ +*70i1n*B0 +^; ^) +*65 R7 +sw\[ +o0e +0 +$E *48 +sJ! +L3s4c +$m $i $n +xA2 $_ x25 +$d $a $z $e +o0z o2l i5a i6d o3i +Z1R0 +*53Y4 +u x04 p3 +R9 o1O +^S x75 k ++3 spj o6q +*04 .5 +R4 ss) +z2 *45 +K*38*67 +sTc x13 +^u ^l ^b +^% ^_ +sRf +i76 i13 +$P x78 +^- ^I +{ u Z2 +dx94 +i4'*B0x5B +dx96 +x7Az5 +R0 l +^' ^; +^i ^f ^o ^s +$e $r $g $s +^a ^j ^a ^r +sbl i00 +^r ^e ^h ^t ^o +x97*25$d +z1 i8l x23 +i3m i6c i8e o7k +$r $e $a $d $s +^. ^( +^y ^k ^o ^p +o4> *02 +*97 Y1 *79 +Y3 x07 k +^e ^m ^a +^n ^r ^e +o5* Z3 +*04x86 +.0 sG3 +xB4 Y2 +,2 { sw2 +T0 TA T6 TB +x98 x52 +*62 *46 o18 +i3r i41 ++2-D +i32 i42 i50 +xB4 $6 +${ ,2 +xB4*15*B8 +i7P*42x0A +T1^;r +i73 i1f +x7A u +*97 x26 +^a ^l ^u ^h ^c +^a ^m ^a ^t +sD5 z2 +x81 { +T0 TA T6 TE +y2*70$4 +si! so0 +u *92 x86 +D3 sKs +*58 x05 +d sC. x64 +^i ^c ^u ^l +x52 Y5 +^n ^o ^m ^a ^r +sc&*B3 +*68 *96 +o3X *06 +*62 x56 y3 +*B9sv. +*68y5 +sGe +sYv+3s$9 +^n ^i ^a ^l ^p +l $c +$a $r $i $z +^p ^c ^a +y4 *25 '7 +*82 x56 +^n ^e ^z ^o ^r +i36 i13 +$v $e $i $n $s +Z2 R4 +svQ +^x sxM +st%'9y2 +o2# o43 +*08 D2 +$k $a $t $h $y +x25 *73 x12 +sv6 +$u i43 $x +K -5 $1 +^g ^g ^a ^m +^8 ^7 x59 +*26 sCD +^c ^o ^d +^y ^k ^n ^i ^p +^e ^l ^y ^t ^s +iAd D3 +y2 *78 +*6B -B x72 +i9eiBT +c ^[ +sa4 ss$ +skh o3e +x14*26*56 +i7f ^4 x35 +ux4Ax94 +]^; +c o28 +r*81sO. +*04 ,2 i70 +^\ -6 +c ^; +^x ^u ^n ^i ^l +^a ^j ^n ^a ^g +c o22 +s?x +o15 $7 .2 si0 $2 +o42*64.1 +^x ^y ^n ^o +.6 x05 +K { D7 +*16 x36 +L7L3 +x38 x52 +i32 *81 +*53 *36 +^a ^l ^o ^a ^p +p1 *34 +sIV z4 +*A5}xA2 +*50 i4R +i4m i6n i5o +^s ^s ^y ^b ^a +p5 Y4 +{ i2V +z3 o3A +$e $l $v $i $a +s?! +T9y4 +^e ^c ^a ^e ^p +^e ^s ^a ^h ^c +$i $o +sgU +i1n t ^A +$b $u $c $k $s +K sGd k +x6B+4d +,8 l +^l ^e ^r ^u ^a +s(}*91 +^d ^a ^r ^b +$x y5 +.7 o9Z +$j $o $a $n +l Y3 ^k +Y1 *60 +Y1 ,8 x92 +i1x i2c +r $? x75 +sb& +x13 *16 +^d ^t ^m +i6X c +R7o6] +oBB +]iA( +D0 sm> +sWQ +$l $y $n $x +^a ^m ^t ^a ^f +^a ^t ^e ^n +^o ^n ^e ^r +^s ^d ^n ^i ^w +^d ^u ^a ^m +TB*02 +l Y3 ++0 sy1 z5 +Z3 u o4a +^g ^n ^i ^j +^g ^n ^a ^r ^t +^d ^i ^k ^s +Z5 x76 +sYQ +c $a $v +$" c x89 +i3C] +sr9 +^s ^i ^n ^a ^h +*81*48xA5 +^5.2 +$M x16 } +x39 } +^g ^i ^w ^t +i74 i19 +^s ^i ^n ^a ^m +iAT x3A c +z2L8 +c $e $m $u +x61x38 +sQrR3 ++7$,*59 +^o ^k ^i ^m +-6-C +^o ^k ^i ^a +i3i z1 +sH$$( +T2 T9 T5 TA +$l $o $c $k $e +^b ^e ^d +^s ^i ^n ^a ^y +z1 sig +x83 i24 +^d ^u ^a ^l +.5*83 +Z2 sgx +^k$zx46 +o3! -2 ++4 +E +*B5 x19 $W +sl? o5b +^z ^a ^t +Cz5 +^z ^a ^q +sTW *15 x14 +^d *68 +i0gtL7 +Z3 *37 +o94 x72 +x39 ,4 +z1 R1 o2W +Y3 i3N +C x43 +$d $e $l +C '6 +t o2S +E iAI p3 +^a ^e ^l +d *97 +z2 o5W +i7X sX3 +sK{ +p1 p1 x25 +$r $i $n $g $o +^e ^i ^t +'6 o1l +T0 TD T6 T9 +rx37^g +kp5+B ++7 R3 +d o0C +l i2% +$c $a $i $n +$f $l $a $t +*1BsQ# +u *A9 +x68s>E +*29 x47 +$s $e $m $i +sD5 +[*37Y5 +$d *14 R8 +^a ^e ^a +l ^4 ^8 ^9 ^1 +i8R +B +o1G y2 x64 +oB) x25 +Z1 *39 *28 +^e ^i ^r +^e ^t ^a ^s +y3lr +^r ^o ^n +*B9x71 +y5 +6 +LB TB +*26 *30 +T0 T7 TC T1 +^e ^o ^t +^e ^i ^m +$Do5D +d D4 o4w +^o ^r ^t ^s ^a +sf\ x48 +o9O Z5 x26 +$u i31 +$;$> +x26 Y4 +o0F $Z +*43 c +$d $a $r $e $n +^e ^i ^f +^i ^j ^n ^e ^k +^e ^d ^a ^w +y4 *B3 *63 +u p4 +K x34 +x94 xB3 +iA2 o6T +^e ^l ^a ^p +D7 d +$s $e $a $l $s +*94 x34 K +^g ^n ^o ^y c +z3*A0x51 +^n ^u ^a ^h ^s +sNj +^9 se6 su3 $d o6f +sKm $n +} i31 +0 +oA< x14 +^u ^d ^a ^r +^m ^d ^m +i4y i5b i6o +r T9 o6y +i5` c x23 +R1 D5 +z1,Bs]^ +x3A t i0V +r o7[ +^a ^i ^t ^a ^k +i7i +3 o95 +i82 .7 i7H +x43 R9 +^i Y2 +i0? '7 +$g $w $e $n +s-6] +^e ^n ^i ^t +sZ[ +t^% +-9Y3 +K p1 $s +o8& Y5 x1A +R7 D3 [ +oAt*43 +$k $a $t $e +sQX Z3 +*15 $' +$. $i $q +r*32s"4 +i2Q +x18x2B-3 +sZf +^e x58 +x36 i42 +i33 $b i54 si6 +sZ| +^z +6 +$p $d +^n ^a ^f ^r ^i +x39 $J +x01 x67 +$d $r $a $g +D7 p1 +o1=c +s,1 +*89 oB( +-4 Z1 z2 +^l ^e ^t ^a ^p +^x o9u +^o ^r ^t ^e ^m +q $. +^y ^r ^t +^g ^n ^a ^v +^a ^k ^a ^h ^s +y3 *05 u +Y4 x58 +$y $o $n $g +$t $i $m $e +Z4 [ p5 +x79 K +-3 ^o o7k +i0@T9s!L +^j ^n ^b +o0G*5B^I +s,m +*24 x67 +do63 +y2 s4D +D6 y3 +^m ^m ^a ^s +^s ^n ^a ^k +s,B +sCQ *10 +o9O x26 Z5 +x82 *70 +p2 x42 +s,K +o1m ^] +y3 *84 +-1+E +x74 [ +Y4 o3v +^g ^n ^a ^y +D3 Z3 +^e ^i ^x ^e ^l +i18 u +y3 u *05 +q o3P x45 +^g ^n ^a ^g +*10 p2 x1B +sHc i4\ +^g ^n ^a ^f +*76 i2h +^z ^i ^z ^a +^y ^e ^n ^o ^m +KsBq +k sM& +T3 TA T6 T5 +l d $6 +$p $m +^( Z5 +i09 -9 +^g ^n ^a ^k +*75 sji +^o ^y ^a ^m +$0 $6 $0 $4 $5 $5 +f -2 +f -7 +$a $l $a $s +$0 $3 $0 $1 $4 $5 +$1 $1 $0 $2 $8 $8 +-4o7w +$L *60 sCK +$c $a $u $s $e +c $. $9 $3 $0 +^z ^n ^e ^h ^r +i0V $1 $* +iA] +c $_ $7 $3 $7 +^y ^a ^g +^o ^t ^i +x95 o6l +c ^p ^m ^e ^t +^o ^g ^n ^a ^s +KL0s>9 +K o1F +$2 $0 $0 $3 $6 $8 +$3 $6 $1 $8 $7 $2 +$1 $1 $5 $1 $1 $5 +,4sgC*17 +x71 *53 o2E +*84 u +$@ $2 $1 $3 $4 +^Y ^O +^n ^a ^y ^r ^b +.AoAq +^o ^t ^u ^l ^p +*82 c +T2 T4 T9 T8 +s+S{u +x15 -8 +^w ^e ^d c +^h ^e +L4^H +l -7 +,2 sw2 { +$0 $2 $3 $2 $6 $7 +$0 $8 $2 $0 $1 $3 +$9 $0 $5 $1 +i0` Y1 +p4 l iAm +Y5 ,5 +T0 T6 T9 T1 ++5 ^" +Y5 ,9 +^e ^a ^j +sFp +$H i0G +^h ^c ^n ^u ^m +i0H $* $6 +sG9 ++5 $% +Z4,0o0G +^o ^g ^o ^i ^d +R2u,2 +^r ^i ^m +i0e f p5 +sc{ +^a ^a ^d +$2 $5 $0 $4 $8 $5 +z3 x25 { +^a ^a ^l +lp5s ^ +o0z o2a *56 se0 $c +^i ^e ^t ^u ^c +i6a i8g i7n +T2 TB T3 TD +^o ^r ^e ^j +x7B$.C +^o ^r ^e ^h +Y4 ^Z +xB1*49p5 +$2 $3 $0 $9 $5 $0 +$@ $2 $2 $4 +^p ^m ^c +*09 xA2 +syXsQ{ +K { +3 +*A4xA3x8B +sWz u +^b ^a ^l +x85 o31 +r x75 $? +^e ^n ^i ^p +*04 i70 ,2 +c $n $o $m $e +Z4 ^X x68 +suF-4xB9 +T1 T9 T4 T8 +$0 $2 $0 $9 $4 $9 +iBj D0 +^p ^m ^s +u *27 +$1 $1 $2 $0 $1 $1 +c $~ $2 $3 $9 $1 +*0A *20 x42 +skj d +i9i iAo iBn +^k ^l ^o ^p +$0 $5 $5 $2 $2 $6 +o7B x14 ^B +$k $h $m $e $r +^e ^i ^t ^u ^c +$' c +,5 o8O +] -8 +$1 $4 $0 $8 $9 $0 +x2A *46 +i32 ,5 +Z1sB[i9O ++6 x82 +x72 $z $k +$2 $2 $0 $3 $1 $9 +c $@ $5 $9 $5 $9 +^e ^y ^a ^k +^o ^g ^e ^t ++0 z5 sy1 +sc" +u x48 +$? o4_ +$1 $2 $2 $7 $7 $8 +'A } ++7 i5O x02 +^e ^y ^a ^k c +$0 $6 $0 $8 $6 $0 +$T p1 x18 +l so> +-0 ^; +{*07i7# +^u sbd +iB+sq7 +x26 sh{ +$l $u $t $e +^w ^s ^m +x67*56*4A +*8Bx16 +D2 R6 +*9Bz2^I +i7Cs/.+5 +i08 i13 i28 +K o6b o51 +^o ^i ^d ^a ^r +o81skby3 +$4 $9 $# $# +Y4 Z3 x1B +Z1x39'8 +$.$[ +i2t i4a i3h +$2 $8 $1 $2 $4 $0 +x52 { x12 +o7ji2H*31 +$1 $1 $2 $2 $2 $8 +iAh *7A +s5qZ3] +x43L6 +^n ^a ^p +] *89 +'5 C +R2*76 +x07R6xB4 +$m $i $l $e $s +^a ^r ^t ^u ^p +i5{s3F +f i0, +$( x24 +^e ^k ^a ^m +R3z1 +u x48 Z4 +$' t +^n ^i ^w +*B4x28 +K y3 +1 +c T1 ss$ +szk } r +$`+5x35 +'A iAd D3 +i0u $1 +^k ^c ^i ^k +,3o2J +i0u $2 +i34 i41 i59 +c $@ $9 $5 $8 $6 +*1B { +i01 i15 i20 i34 i40 i51 +y5 o5l +$0 $5 $0 $7 $0 $7 +Y3 x41 +i33 si6 i54 $b +t +0 x17 +xB1 o7h +l $^ $s +*08 c +R1 Z4 +^r ^n ^a +$c $. +T1 T9 T4 T2 +*8A Z4 +x69 u +$f $r $a $n $k +*82 E *54 +D6 sxi +$m $a $r $c $h +^e ^l ^a ^b +oB`t +^a ^r ^o ^c +o0sY1y4 +fE +lsEQ*73 +^i ^s ^e ^d +^a ^b ^m +i4a i52 +Y4 ] Y4 +sd" +d o24 E +^a ^n ^i ^g +i1c i59 +fx64*45 +Z3 *67 +^o ^l ^a ^k +^k ^e ^r ^a ^d +p2 s{Q +o8g x53 +sv` k +TAx91*80 +i3^ k +x51 o1@ +i6l *83 +$r $u $i $z +^p ^o ^p +x36 o1f u +$b $l $u +xB2 +2 +z2-7] +x05 o4K +E ^B +R7 $, +*19 } p5 +^i ^m ^e ^k ^a +$Q $1 +^p ^e ^d +^o ^j ^n ^a +T2 K +$f $r $e $s $h +i71i89i96iA5 +i7vD1 +^e ^s ^i ^l ^e +^K s%W +f x18 z2 +[ Z1 o9q +^o ^t ^i ^v +sqW +$g x5B +^o ^t ^i ^l +^ x02sb| +^a ^t ^a ^m +u *25 +$m $o $p $s +^t*12,4 +^y ^d ^a ^e ^r +s8cY4T7 +$m $a $l $t +su4 R1 *43 +^s ^o ^r ^e ^h +c si! sa4 +x51z3*85 +T1 T2 T8 TB +y2 sG[ l +*0B,0k +$k R7 +su3 o79 sk8 o5k sa0 +^0 ^J +$e $a $t $e $r +$ho5Esz_ +*2B x15 +z2 *53 +T0 T4 T3 TA +^l ^a ^z ^i ^r +Z5xA8 +x95 Y4 +o5Gy5 +x86 sPB +-3 '7 u +$c $u $b $a +p1 sNU +xA2 u x06 +i1a sp6 o32 $e o6s +^s ^i ^r ^k +T3 TA T5 T4 +*39 DA +i5` x23 c +sZX +$u $2 +sI< +.Bsq{i1R +$o $r $t $i $z +$; $p +$V x25 +x61 +4 $v +i2s ^r +i3d L1 +T4 T8 T7 TA +Y3 ^m +r$Xx58 +^)i8c +*47*58 +i82i90iA2iB3 +}i0v +^p ^j ^m +^k ^n ^a ^r +$g $a $r $b +*62 sMr +*BAx35*60 +*71z2 +i8e i9y +$f y5 +R0 x73 +5 +^y ^h ^c ^t ^i +x34$w +*45 x64 +$N l +^s ^i ^r ^e +*26*23 +o15 $7 o3b i5g +T0 TC T8 +*62s6P$Y +^0 so0 $6 sm0 ,6 +i1i x92 +Y3,3*AB +T9 -9 +,5 k *09 +i3\ '5 +c ^3 ^1 ^2 +-0 R5 +$j $u $d $o +*89Ci27 +z1 o2W R1 +sFL '5 Y4 +] o5} +^3 ,8 +x3B *13 +L3 K $I +^0 z2 '6 +.1 x75 Z2 +$V p2 +i5m i7n i6a +^z sPo +^a ^p ^c +x4AD7*94 +^e ^r ^g ^i ^t +T0 x16 +i7sy5 +x15 Y1 *47 +^n ^o ^n ^a +i4y i6s o89 $1 o97 +DA szm +$h $1 +z5 Y3 +st$ R5 +'6 o1f +s^J +sYh +T0 T6 T4 T1 +Y1 Z4 x83 +^n ^i ^e ^r +$0i0w +] i34 x92 +T2Z4 +z5 q +o9k Z2 +sHn p1 t +c $m $i $n $x +^h ^a ^b +$" i4n o6l +*90 x47 +DB *06 x57 +$Y *37 o62 +s*8 ++1 '5 +^e ^i ^n ^r ^a +$Y C +^o ^l ^a ^g +*53 z2 +^k ^u ^f +x52 sL1 +q s=D z1 +x35 Y1 sp$ +sK8 +^e ^d ^a ^l ^b +c ss$ T1 +*40sxb +*81 y2 x17 +*86 K +^a ^m ^u ^k ^a +sNH y1 +s*N +*09 x06 +o7f D8 *23 +sT( +c x56 +i3d i56 +i7c i58 +i0. z3 +z4saj +^oY3 +$>$/ +x15 +4 +^n ^i ^e ^l ^k +q z1 s=D +$y $v $e $s +$a $a $r $o $n +*13 Z4 +^e ^m ^w ^e ^n +z1$+xBA +$o,3*59 +$a $v +^m ^r ^e ^g +,6 Z4 +sp* Y3 +^c ^e ^m +{ x63 +sdk *74 +5 +x58L6 +^s ^u ^m ^a ^k +o0g q +z5 *67 +o1o x32 i2k +*62 *01 +Y2 D6 +o0g f +x91 *27 +Z3 x9A x53 +^c ^a ^d +*35 d +'9 se2 +$ $p +^n ^u ^d +*35 x93 +x43 '9 +^s ^a ^t ^e ^b +^n ^i ^w ^r ^e +iA? .A +^a ^t ^g +L4 R3 +i27 y2 +T4z4 +x38o2gy1 +i2h i4e i73 o5r i84 +*13 q +d u 'F +,5 sTD +i6`*56x6B +K k sGd +*58 Y4 +$' x71 o6? +]Y3*37 ++6 x41 +uo05 +^r ^u ^t ^r ^a +u x48 R4 +*25 *13 +q *70 x84 +$c $i +siX x53 +o0w o4v +2 o6p sf4 +o08 x74 +q *05 +$" x89 c +] q d +*21 R0 +su4 *43 R1 +$ Z1x1B +L9,A +x37 z3 +p2 *35 +^a ^t ^i +x14 $_ D2 +o0 tx75 +^r ^a ^e ^p +*96 [ +^a ^n ^u ^y +xB3 *89 x13 +^y ^s ^i ^a ^d +T1 T9 T4 T5 +x52 [ *48 +^g x59 +ri9D +^e ^t ^i ^h ^w +^e ^h ^t ^e ^l +CZ3*25 +$U u [ +i23 *78 +p2 y4 +^e ^n ^o ^l ^a +o2/iBx +o0# *06 +*93 t +se2 o3f sc0 $4 o59 +sHn t p1 +i2q x62 +o0k i5c o4u o7c o2i +R1 $0 +^r ^a ^e ^s +^i $o +*BAsj+ +t x48 +6 +^e ^e ^n +x53 L1 +*3B *37 ] +^s ^p ^s ^a +$p*B0u +u q +o42 D3 +D5 sr x54 +p4.4 +x54 -1 R0 +r o6y T9 +DB *2B +^e ^e ^g +$) x4A $7 +^o ^n ^i ^g +xB7x68sD. +T0 T9 T8 TB +^0 ^q o6o o3e +D6]^^ +y2.4u +^l ^i ^a ^m ^g +x42 x79 +Z4 +8 o3g +Cs0QZ3 +T2 TA T4 T5 +T1 T7 T2 TC +x61 D0 -7 +si$ L2 +i82i90iA2iB7 +L5$Nx65 +sXG x47 +y1 x3B R1 +r z3 R6 +sJ7 +L4 k o2I +o2H u Z1 +^T u +$J$b +^s ^a ^g +xA4sE; +^c Y5 +^r ^a ^m ^o +^a ^v ^e ^d +*48x63z4 +s_Tx68R0 +Z4 ^7 +$d R8 *14 +p1 '7 *32 +$c $l $e $o +q x51 +5 +x15 '3 +*06 D3 sMf +*85^m*50 +*59z4Y2 +^r ^i ^m ^a ^r +d u 'G +$f $o $w $l +^n ^a ^i ^r ^b +T3 TA T5 T6 +^r ^i ^m ^a ^d +p1 x53 +^h ^a ^c ^i ^m +^f ^e ^t ^s +^k i11 +-3+E +T3 $D +^9 K +^w ^e ^h +x74 x94 +x04o8;^^ +i4b i6r i5e +i5N i4p +,6p4l +o3 i8e +i0\sQl +q x31 *26 +T0 T9 TB T8 +s3| +*68iATY2 +i42 i50 i63 i71 +E *29 +^a ^l ^u ^a ^p +^r ^a ^e ^d +^z ^e ^d +iA.o7[s +^6 *35 +r x93 +sn5x36 +i4a i5n i61 +[ *82 +T1 T5 T3 TA +sli *86 +^n ^n ^e ^j +^k ^n ^a ^b +d Z1 x32 +^r ^o ^t ^i ^v +oB` +soE Z1 +c $9 $5 $4 $! +xA2 x06 u +T3 T5 T7 TB +i28 d +x94y3 +o0c sg2 o2q o1j o41 +i7% D3 +.1[ +*6B,8 +Y3 *15 +y3*29*09 +z3*95sF; +^n ^o ^i ^d ++0 i5J +ss9 *36 +'6 $n { +^w d +i7f i1d +oB[ +^s ^u ^a ^d +sG1 '5 +-9-E +^d ^i ^r ^a +c $. $j $p +^j ^y ^m +oBP +x71 o2E *53 +$(*57 +$e $a $v $e +q x52 t +s}< +^F*B0 +$5 sLN +swe o3a ++1 i67 o7a ss0 sc5 +c $0 $4 $2 $! +^r ^e ^l ^y ^t +^u ^o ^n ^i ^m +$)y2 +^r ^e ^w ^o ^p +^e ^i ^r ^u ^c +^h ^d ^r +-6+E +^t ^s ^e ^b +^n ^a ^l ^u ^w +} sAu +i7e i89 i99 +d E o24 +i4a i6e i5m +x63 p5 +^a ^i ^b +$r ^A x76 +$5 o5! K +x09 y4 +o3" k +i4a i6e i5l +^a ^i ^f +swn *67 +i9n o9O +s}s +.9z4} +*9Ai5< +p5RBx28 +^a ^i ^g +^c ^l ^m +*01 *13 +sVSu +c $5 $9 $0 $! +^Ys,J +$m $o $v $e +T4 T6 T8 T7 +c x18 ^e +*14 sa\ +k xB4 +o2A '4 +$7 +9 +x46 *50 +si9 $4 $7 $8 i21 +sM+7 +T0 T8 TB T2 +^y ^k ^a ^h ^s +^4 x52 +c $8 $4 $1 +d '8 *20 ++2 i2K +^n ^i ^g ^o ^l +Z2 *8B +$g $a $m $u $t +s6} +^y ^x ^e ^m ^s +T0 T5 TA T9 +$T *87 u +$a $d $e $l $a +^n ^a ^t ^n ^i +x15 i41 +Z4 *37 [ +^s ^i ^w ^e ^l +s6` +ssf Z2 +T2x7AsWM +s6U +^r ^a ^h ^c +z4y4 +x43 .4 +$w $i +i72i80i92iA3 +^a ^n ^i ^t ^x +T1 T2 T9 TA +^x ^e ^p ^a +i01 i13 i2J i3a i4n +sd9y1p4 +^p ^i ^l ++2-C +o0d $9 $5 D1 i3b +L6sBR$q ++7 +7 -2 ++E -B -D ++2 -3 -A +,3 R8 +c $2 $6 $9 $! +^y ^o ^l ^e +^n ^o ^l ^e ^d +i72 R8 +T0 TB T8 TA +i71i89i97iA4 +s|b $+ +ss$ *05 +sq6 +T2 T8 T3 T6 +^i ^m ^o ^a ^n +^i ^f ^a ^r +^5 $1 +sq! +x06 Z1 -0 +T2 T5 TA T7 ++9 -E +9 ++3 -0 -6 +i1e i2t i3e +x91 z5 +L3 *35 +x35R0 +s5o f +^V *20 +sTh u +c $8 $5 $3 $! +i71 L9 +^n ^e ^l +'5 L3 Z1 +z1 x6A +sWk{ +^a ^y ^a ^r +T2 T5 TA T6 +-9 -9 -C +*25 +3 ++3 +8 +6 +fsHix26 +Y5*02 +Y5*01 ++C -9 -B +E x58 +^v ^a ^j +^a ^y ^a ^l +x19 *03 +t i1S +x6B,1 +sq` +i8q x57 Z1 ++C -9 -D +z2Y3 +c $4 $0 $5 $! +[Ko2$ +^a ^y ^a ^h +T2 '4 +-2+D +^e ^v ^a ^n +^n ^o ^s ^a ^j +$4 $m +$c $e $l $i $a +sQd +^d ^n ^o ^f +}i8^ +'6 o5* T0 +^i ^r ^i ^m +x18 o3V ++0 +A +3 +sSk +^i ^r ^i ^s +se2 $4 o3f sc0 o59 +sQv +q r '6 +sQr ++A -2 -3 +Z2 p1 ++A -2 -6 +xB1$}sYQ +$q Z4 +^ iB>o8m +{ se8 +x5Bs1] +x61 *84 ++5 +9 +7 +i12i20i33i40 +c $4 $2 $5 $! +^t ^o ^i ^r ++2 +6 +2 +-0 -9 -5 +sj= +sFaD3 +$. $u $m +^a ^y ^o ^t +*A2x31o0> +-3 -7 -4 +-B -E -D +c $3 $5 $9 $! +sL} x06 +x61 D4 sjx +$u $n +x07 p5 +-3 -7 -5 +*53 L5 *12 +-3 -7 -6 +^a ^n ^i ^e ^r +c $8 $0 $3 $! +i7c L6 +^u ^r ^u ^g +xA9x24$B +$l $u $n $g +T2 T5 TA T4 +^_ ^e ^v ^o ^l +sWsDR +i3Vo9v +c i2_ +Y1 Z1 u +x04^F*03 +-6 -8 -A +[sNGsL' +*97 ^a +y1 -7 +k L2 +T4 T8 TB TA +x13 x28 +o0{x5A*B9 +-3 -5 -7 +i9B*43 +s<9 +^o ^r ^a ^t +z4Y1*30 ++3 +3 -B ++4 -3 -5 +c $4 $0 $1 $! +c $4 $3 $6 $! +c $3 $6 $1 $! +i7b R4 +c $4 $1 $8 $! +^n ^a ^e ^m +Z1 sde +^n ^a ^e ^b +^r ^r ^a ^b +^x ^i ^m ^e ^r +c $7 $9 $0 $! +i9?iB1 +T0 T8 TC +$B l x1A ++9 -7 +A +^s ^s ^e ^j +x61 z4 z5 +T1 T5 T7 TB ++4 -3 -7 +$s $l $a $p +xA8sFn ++0 -C +0 +^n ^a ^g ^o ^l ++0 -C +1 +c $> ^< +p4x31*20 +$M$r ++0 +D -1 +Y5 o04 +LA Z1 ++C -8 -7 +^i ^f ^a +L0 +4 o5K +^g ^f ^b ++1 +5 +7 +i81i99iA8iB0 +z4 Z3 ++0 -9 -5 +^e ^p ^a ^t +r x67 +o1d i63 o77 se2 o5b ++0 o77 +i02 i15 i2J i3u i4n ++C -1 -B +^m ^a ^i ^l +sQ_s`n ++A -9 -1 +[R1o7m +T4 T8 TB T9 +^z ^a ^h ^c ++1 -A +9 +i7b i1d +^h ^a ^e ^y ++8 -4 -3 +*49iB[ +,8*15L7 +$P L9 +^e ^z ^a ^l ^b +^s ^i ^o ^l +c $4 $6 $5 $! ++C +C -6 +^e ^v ^i ^g +i03 i10 i2N i3o i4v ++C +C -3 +T2 TC T6 T4 +y3x89 +$Q $T +*48 Z1 +^+ K +D7sTp +$r $u $t $h ++7 +7 -0 +i62i70i82i98 ++C +C -0 +i29x19*59 +^n ^e ^l ^a +Y1 xA3 +o4&c$8 +c $2 $0 $9 $! +^g ^e ^r +^n ^i ^v ^l ^a +c $5 $0 $7 $! ++3 -A -2 +^r ^e ^d ^a ^b +T6 T7 TB TA +*9A $z +x46 D4 +$K T5 ++C +C -8 +^e ^s ^a ^b +$g $a $m $e $r +^o '6 +$n $o $r $t $h +x12i4E +p5sPFxBA +x81z4 +*07,7$O +*0A x68 ++5 -9 +6 +$m $a $r $2 $6 ++A -7 +A +x2A$&p1 +^b ^b ^m +s/E s- f +x61 ^2 y5 ++3 +7 -2 +^u ^s ^t ^i ^m +x25 z5 ++A +A -7 +^t ^r ^o ^m +x52 x74 +c $7 $8 $2 $! +x72 z3 ++A +A -1 +^r ^e ^z ^a ^r +^n ^i ^y +x56 ssh +*12 d +x42 x74 +,8*28 +^l ^l ^a ^i ^n +oAm { +i00 i14 i2m i3a i4r +^k ^c ^o ^l ^b +i0H i3l i4o i1e i2l +i33 R4 ++7 -B +7 ++3 +A +5 +.1 i2o +^k ^n ^a ^h ^s +^n ^i ^r +^i ^k ^u ^p +x42 D8 sjb +scr Z1 +T0 TB T7 T8 +s'D*38 ++1 +9 -A +^u ^g ^n ^i ^p +^n ^i ^a +i0m i2l i1i +^e ^i ^l ^e ^b +i2N r +sqJ +xB1 x07 +^n ^i ^f ++9 -8 +B +sU@,3y3 ++9 -8 +C +*27R4.5 +i02 i18 i2J i3u i4n +*A4 x19 +*B4 Y1 x05 +R4 y1 +^w ^e ^d +o0z o53 o4n i6a o72 +^w ^e ^a +^b ^e ^s +^y ^t ^r ^e ^w +^e ^n ^i ^a +i00 i10 i2M i3a i4r +c $9 $0 $5 $! +c $2 $4 $3 $! +*06o7/L0 +tsgB +T4 T8 TB T6 +*94z3*58 +^d ^i ^a ^z ++6 +8 -4 ++5 +7 +9 +-3 -6 -7 +c $9 $8 $4 $! +x53 stM +l p2 z2 +^f ^a ^l ^o +c $o $s ++8 +8 +B ++9 +9 -E ++0 -A -5 +o6c o4y o7f +^d ^a ^h ^c +i1c R7 ++2 -1 -7 +i8\t +^r ^o ^g ^i +^g ^n ^s +i90 iA0 iB0 +x67i3X +sU* +x93s*Vsy) +x56 $b ^r ++8 +B +8 +T2 T8 T3 T5 ++B -3 -4 ++B -3 -7 +T4 T8 TB T7 ++B -3 -0 +xB2 x57 +L8xA3sB+ +sk5 slj ++4 -F +$t x08 +^g ^n ^e +^g ^m ^d +sf{xBA +^e ^y ^a ^h ^k +iBir +Y1 u Z1 +*08,7 +c $3 $7 $9 $! +z5 +9 +$s $a $k $e +T2 TB T6 +z1 Y5 +^n ^a ^n ^o ^k +o1c o5d o3j o75 o69 +^g ^b ^r +skz '6 +^z ^z ^i ^f +^4 i2b o56 so2 sa3 ++B +B -5 +i3y Z2 x51 +o7pY3 +T4 T9 T5 TA +^e ^t ^n ^a ^d +-8 -F +s*i ^g +z2-5 +^n ^a ^e ^c ^o +'W +^d ^l ^a ^w +o9T,3Y3 +*15x95i9h +oA1y2 +*91 Z1 +i32 R2 +sHt K ++3 +6 +8 +s', +T1 T9 T5 TA +lsa4si1 +i60 *34 ++8 -7 -A +qx3AC +*02 q +^d ^r ^e ^h ++4 -7 +8 +s2b +Z4 Z4 x49 +^l ^a ^i ^r ^t +T2 T3 T4 T8 ++1 D4 d +^e ^t ^a ^k ^s +*A1 x08 +y1D9 +u i0Y ++C -B -9 ++3 +4 -7 +sCe c +o0T^C ++A -1 -9 +-1 -A -9 +$g $a $m $e $d +L2 $a +Z4y3D5 +s'h +s+W +-1 -A -1 +s+P +$"x24 +$o z3 +$k*15x13 +iBxiBz +$b $r $a $n $d +*81 x48 +T5 T9 T7 T6 +c $2 $4 $6 $! ++7 -2 +7 +$/$^ ++2 -7 -1 +^r ^i ^e ^m +x28x15i8> ++7 -0 +7 +s'@ ++2 -A +3 +c $4 $7 $8 $! +c $6 $3 $1 $! +^iu +x63 z1 p1 +$[$} +.5s).x7A +x27 'B +^?ux56 ++2 -0 +A +T1 T2 T7 TC +^n ^a ^r ^f +*B1y2RA +^o se_ o3i i7a +k*2A +c $5 $6 $2 $! +s%Go9Lx87 +^e ^h +^q x48 +T2 TB TA T7 ++D -C +E +i4( x31 +c $5 $8 $3 $! +o0k i5c o4u o2i o7c +k$> +$I z1 +s'ep1D4 +E^6t +-1Z3 +s2!z2sLb +^s ^i ^w +p5sT] +i31 L6 ++D +F -E +*95*B7K ++2 -8 -3 ++3 Z2 +c $2 $5 $7 $! +$v $o $n $d $a +se2 o3f sc0 o59 $4 +$a $d $a $m ++1 +D -0 +T2 $2 +o0z o3i o2l i5a i6d +o4i Z1 +4 +i71i89i97iA9 +i0u i1a i2t +*76snLq ++1 -0 +C +iA)*36 +o7_d +x48$xE +i03 i11 i2J i3a i4n +*12svT +u i4& +s)w +^! ^* +c $4 $3 $7 $! +T2 T8 TA TB +s)a +*20 Y2 +$_ o7i $a +[z5 +s]9 ++4 -6 -7 +i4i i5e i60 ++6 -9 +B +R4 Z2 +i61 $9 *67 +c $1 $3 $8 $! +i2Nx4B*85 +x08 o0, +-5 -D +o0l i2c ] o4b o1c +T1 TC T2 +qs56 +r x23 +^& ^@ +i9'sQO +D9*50 +o0w o6p +2 sf4 o4v +c $7 $3 $5 $! +L0u +suq +z2 x29 Z1 +T0 TC TB T3 ++1 -5 +A +K sp| +l $. $i $r +c $1 $9 $6 $! +s='sJbsO\ +^9 x13 +Y2 z2 +2 +$5 ^x +7 +o3Wi4A,6 +s-Px19 +*86sLv +i5i } *87 +sn] +^g ^a ^n +{ sog +s&x +^9 o7f si4 ,6 o4e +^g ^n ^a ^t +^z o2f +}*38DB +o0c ^a +y1x09Y3 +p2x41srV +o4UsqN +p1Y3oB6 +T0 T3 T9 TA +o6y i6v +T2 T5 T8 T3 +-4 T4 +R2 x62 +y1 *A9 +6 ++0sz@ +s0K +x1A,9{ ++9 $\ +c $5 $6 $7 $! +'7z2Z3 ++C -E +D +*06 sMf D3 +*57z4 +c $5 $3 $6 $! +i61i79i86i95 ++B +C +E ++2 -D +2 +i9)y4 +D7sp0 +l $. $i $d +R2 ^q ++2 +2 -D +x72 z3 x38 +l $. $i $e +$x o2g +$b $e $n $z +o79 i2i +o1% k r ++2 +2 -B ++5 -7 +A +^c z4 +z2C*67 +*4A*B8 +^r ^a ^c ^s ^o +$w *63 +^g ^a ^f +-1 i2R ++5 +A -7 +x16 $V +xA4*36sn1 +T2 } +T0 TB T5 T6 +o0f *46 +T7 T9 TA TB +r $o $e $s +y1,A +D6 o12 +$DZ1l +*98sY` +T0 T2 T7 TA +$i $r $a +*12 } i01 ++2 +2 +A +{ L2 +s&6 +c $l $o $w $e +x07.6^N +^n R2 +*05 ^' +o8,Z4*A1 +x59x85$B +c $9 $5 $0 $! +i4l i5l i6a +i8"Y3o7^ +s>O +$. *43 x52 +p1 D1 +1 +z3 o39 z2 +o0p se9 i2k i4i o85 +x45 i3] +s>T +^s ^y ^m +$f $. +i4y $9 i6s $7 $1 +xA4*A9*01 +o1q D3 o6l o72 si9 +s9- i56 +x23 i1o +o0f *41 ++0 -C -1 +^o ^r ^i ^m +o1bi35s+a +sDw C +*92 x18 +i77 i88 +c i2$ +so=*4B +*71i5[+9 +i4l D7 +c $1 $5 $4 $! +T1 T2 T7 T4 +c i2. +c $5 $1 $3 $! +c i2/ ++3 +3 +E +s>* +c $1 $4 $8 $! +sElt +^0 sm0 so0 $6 ,6 +s>% +^- ^( +y4$g ++3 +E +3 +^- ^# +Y3*36 +*40 i47 +o3t x52 +c $9 $0 $2 $! +}*0A^w +z1Z4 +*71 +0 y3 ++1 z3 s8v +s(x +*32Y4sjz +T0 T9 T2 T4 +^" ^( +i6l i0Z +*56 Z5 +x01x17 +ux95 +s(h +o1X-2 +s0| *36 +o0z i6a o4n o53 o72 +i9c iAk iBs +c d 'C $2 +c d 'C $5 +$s $h $o $e +*17*54 +c $9 $7 $1 $! +c $9 $7 $6 $! +o3}$+i7P +*56 u x62 +x65 R0 +i8$xB1C +^n ^a ^p ^s +y2$Fs29 +x21 d i3n +f *78 +$0 z1 +sgQ +T2 T8 T7 TA +i22 i30 i41 +i2a i4e i3k +^A o5K z1 +T2 TB TA T4 +x68 .1 +^nD1$p +*05 -2 *34 +p1 o90 +*65 x13 z4 +$h $y $d $e +o15 si0 $7 $2 .2 +T6 TA T8 T7 +x81 s28 +o37 R0 +T7 TD +c $j $a $r +Z3*64x8A +L5 sgw +T3 TB T8 T4 +i2D t $4 +$F *BA +C d 'B $1 +-0 -1 -E +T3 TB T8 T7 +o1v se1 i52 i61 o73 +T0 T9 T4 T2 +}o5' +p2 *78 { +$xx28$g +i82i90iA1iB5 +i72 *61 +c d 'A $6 +D1 o0Q x34 +T1 T6 TB T2 +c $d $o $w $n +si9 i21 $4 $7 $8 +L3o4e +Y2*86Y3 +-7+E +$zp4 +Y3 z1 +c $3 $5 $1 $! +i4y $1 i6s o97 o89 +*82so7 +L1 *15 +o0d k +o25 *65 *31 +$y $q +o0z *56 o2a se0 $c +R7 Z3 +c $8 $0 $2 $! +c $3 $7 $1 $! ++A .0 +^; ^' +x89 x75 +RA*85 +c d 'C $4 +$j $u $n $e +E sR, +c $3 $1 $9 $! +^e ^v ^o ^n ++7 +A -9 +x03 x49 +*0B } +^s ^a ^i ^l ^e +T0 T9 T4 T8 +sNE x71 +TB x19 +$" z2 +iC; +x19$5*82 +[z1$; +T0 TB T1 ++A -7 -5 +-AsA'] +*7As8' +x34o1F +x0B i8- ++A -7 -3 +k^^ ++A -7 -0 +i6j i8l i7u +-3 o2r +o1q si9 D3 o6l o72 +i4q r +x12 p4 $# +T3 T8 TB T4 +T0 T9 T6 TD +-1 -1 -A +T0 T5 TB ++A -9 -D +sFg +.BoA8s2d +i46 t ++1 -C +1 +'6 T1 +i1dp4 +-4 Z2 x78 +s!- +*87 sGf +Z2 s#1 +^a ^d ^a +*53 *12 L5 +Z1 D4 +-B C +i02 i12 i2A i3p i4r ++0 -1 -C +o0w o6p o4v sf4 +2 ++0 -1 -E +c d 'A $4 +o1a ,2 i4k i7a o9a +s2ZL1 +c $6 $3 $8 $! +i0m i2r i1a +T0 T7 T9 TA +c d 'D $6 +T1 T7 TB T5 +$f $a $y $e ++B +E +C +d i8_ +D4 p3 sYu +o3%sN- +T0 T7 TA TB +u $F x23 +i33 i41 i59 +c d '6 $9 +y3y4 +x91*19 +-1 -9 -A +z4 d +*63u +o0c o1j o2q o41 sg2 +*50 D1 K +[s+d +c $2 $9 $1 $! +*02 '6 +t iB. +c $3 $5 $8 $! +[ *52 Z3 +xA5C +r oB6 +i2c i3o i4l +x04 x74 +$gC +i9Gx78R4 +i3v i5r i4e +^k +2 o6d $3 si3 ++3 +5 +A +$zx15*62 +$j $u $n $o +C d $8 ++C +D -E +s@N*76szP +^s ^n ^u ^s +*23 c ++3 +3 +D +$n $i +^ku +*72*09*29 +c $7 $2 $8 $! +o3& l -2 +T2 T6 T3 TC +$y $v +T1 T9 TB T8 +y2 k o44 +x03 ^j y2 +] L8 +*30 u { +,Az2 +i7j R9 +r*16 +s)`x48 +$[$' +-4 i4i +T3 T8 TA TB +iC? +sW0 +T0 T2 T3 TD +L4 Z3 *02 +o02$I +Z1 x71 i4e +svp K D7 +o5c k +i4y $9 $7 i6s $1 +i20saF-3 +$usgkk +oBnt +[ +1 *02 ++C -5 -7 +,4sh3 ++7 -E +sjbsY+Z3 +z2 x65 l +o1i i04 +^s '6 +s!^ +$Nx26Y4 +r^F+6 +c $c $h $u $g +^k ^c ^i ^r +o0/ x42 -1 +$l $a $m $e +s7g ] z3 +sti [ T3 +T0 TC T6 +iAHsD} +c $t $i $k $e +$Vz1 +Z1 sJd +x51*93*A3 +$b $r $i $a $n +i3d i4r i5a +xB4 k +DA i96 +c $8 $2 $1 $! +[ x94 +sY\ +^j r x05 +T4 T6 T5 T9 +c ^b ^c +i11i29i37i43 ++B -D -E ++2sm% +L8 '9 +y2sGfsIe +^y ^k ^c ^u ^y +i3p D7 +*37 $1 +-0 -A -3 +qD0x64 +-4 -F +$? o63 +{ Z2 u +x67o5| +T1 T8 T6 T7 +o1d i69 D2 i5c o75 +Z4 c +sr3 $6 sb5 o4b $5 +s-' +y1i75x8A +Z4y3 +^e ^m ^a ^n +T4 T7 TE TB +'4 i0p +Z4 t +x03 c x49 +T1 T7 T2 TA +i3o i4c i5t +^1 z3 } +y1i8osf6 +T2 T7 T4 TB +c $w $o $l $f +c $9 $2 $6 $! +L4 *02 Z3 +*96^Vd +f .0 +o0i o2w sa1 $f i32 +i02 i14 i2m i3a i4r +c $2 $3 $7 $! +sZ6y4*28 +$M $a $r $1 $7 +*13q +$M $a $r $1 $2 ++A -0 -7 ++A -0 -4 +s=m +c i38 +T0 T7 TB T8 +,6 *06 o5f +o0i sa1 i32 o2w $f +T0 TB T9 TA +o6[ x42 +c $5 $4 $0 $! +x05 Z2 C +Z1 t x28 +*18x31*19 +Z3 s73 D3 +'7 R5 +s2y +$N^ji7} +o0l L5 +q z2 +i9i iAo +i9i iAf +T0 T6 T3 TB +DB sAI +*20 *97 +k i2i x52 +T0 TB T9 T1 +sm{ +x67 i0s +r*4AxA7 +*05 y2 +$p $i $c $k $y +c $0 $6 $9 $! +c $1 $6 $9 $! +i7L x2A +T6 T9 TA T8 +c $2 $8 $4 $! +c $2 $6 $7 $! +z2 Z1 x29 +c $1 $0 $6 $! +c $4 $6 $8 $! +$b $r $i $e +x61 $3 +i3p i5r i4e +*56 x62 u +T0 TB T9 T8 +spq{ +} *37 +^e ^f ^a ^s +i21 T3 +Cs7? +DA x47 +^n ^e ^h ^w +*91.8 +$h i92 +^u Y1 +s2i +r D7 +*0BiA| +c $0 $1 $3 $! ++7xB4z3 +Z3 $q Z2 +^s ^m ^u ^b ++B -8 -6 +x15 x14 +sNHo2gy3 +$z $e $a $l +*80 T5 +T0 T7 TB TA +,4$M +y2 x61 *05 +^9 $d su3 se6 o6f +D0 ^E +z3*02u +c $3 $4 $8 $! +sJ.Y4k +*52 L0 +$K o5B ++A +A -0 +x18*98xB9 +i18 T2 +o1y sc1 +*47Z1^j +x97*2As/# +*04y4 +$M $a $r $8 +T3 T6 TA T9 +i0H i3l i4o i2l i1e +^Fs@mZ2 +'6 o4O +c $^ $4 +c $5 $6 $0 $! +se2 o3f o59 $4 sc0 +c $7 $5 $3 $! +$Zu +c $7 $8 $1 $! +skf $o E +T3 T6 TA T5 +c $6 $3 $2 $! +*19 D1 +p3 xA2 +T3 T6 TA T4 +$i $d $a +Cs7Z +$m x18 ++0 +B -1 +*65 z4 x13 +sC-Z4C +^7 Z3 ++C -7 -8 +i5y D2 ++C -7 -5 +^k +2 $3 o6d si3 +i4c i6i i5h +x13 suH +$d $e $c $1 $0 +sr5 D1 +sq( d +^r ^a ^j +T2 T6 TB +{*67f +T4 TD TC T7 +$|+A +C d '7 $3 +x45 R1 +^s Z2 +c $7 $2 $9 $! +$d { +c $m $o +x1B u i0A +sl x4B +c $9 $5 $7 $! +se3 ss$ si! +si! ss$ u +i5t i7e i6t +-3 s0b +T3 T8 TA T4 +T3 T8 TA T7 +T2 T6 T3 T8 +-1+D +o04+3 +c $2 $0 $5 $! +sD +$aZ3,6 +c $s $k $i $d +^l$@ +c $6 $7 $5 $! +L6 '9 +sm} +*46sB$ +c ^6 ^f +x18*8Bsz| +T1 T4 TC T2 +^l ^l ^u ^f +c $i $s +x2A*39 +$d $a $z $e $d +T6 TA T7 TB +K p2 x1A +} } +2 +c $4 $6 $3 $! +T8 D2 +*73*B4 +c $0 $9 $4 $! +^_x62*1B +T0 T3 T2 TB +o1c o69 o3j o75 o5d +$f $o $u $r +x52 ,5 +^e x87 +$p $r $o $d +i0w i2l i1i +sP* E +i1uy4 +L3 y4 +i4y i6s $1 i89 o97 +T2 TB T8 T9 +-8 $2 +so9 x74 +$i $b $i $s +*06s-**1B +$+ *56 +*17 D1 Z2 +o2V -3 +$s $l $i $p $s +$r $e $n $o +^9 si4 o7f o4e ,6 +*05 x1A +*02*89xA4 +]o1 ++9 +B -C +T1 T5 T4 T7 +C o60 +l*73 +i82i90iA1iB6 +$b p1 ++2 +A +2 +$a $r $y $a $n +o73o8N +$u ^l *25 +.8*69 +c $1 $2 $0 $! +i6i i7n i81 +^( ^$ +o0g i2u i3m +k R1 x41 +i8@ +A +o08 $x r +o3Nx72*47 +c $j $o +x07 t +T2 T9 TA T4 +i5o i5p ++1 +A +2 +f *32 +o1Vu +o6^,3 +^y ^b ^u ^r c ++5 -1 -A +^[s+= +K l i04 +s/C +T3 TC +i2m i5s sa3 i66 o8o +T1 T9 T2 TA +$E c [ +i7l i81 i93 +x39 ^1 +Z1 sCk Z1 +'6 shb +*8B*2B,8 +x1B i0A u +^c ^k ] o3k i5w +T0 T6 T7 TA +^f ^e ^i ^h ^c +z5 +5 +*25^ax8B +T2 T3 T4 TB ++1 +C +B +Z1 *52 +se+shdsEt +oB c +oB?iAz,8 +i2i i3c i4k +6 .7 +i8Zk +o4kxB1$X +sdr L6 +$I *24 +*91 u +Z4 .3 +o5/] +sc) ++1 ss0 i67 sc5 o7a +{$y +*78 *A9 +T3 TB T5 +$f $e $b $1 $0 +z4 *29 +z2i1v ++8 -A -7 +c $5 $6 $1 $! +TAshZ +c $7 $2 $4 $! +p5 y2 +x56 sqJ +o0pZ3 +$9 x25 R5 +o0d D1 $9 $5 i3b +*39 D3 -5 +}L6*78 +-3 -F +L5xA7xA2 +$0oB] +c $8 $7 $9 $! +^d ^d ^i ^k +T0 TB T7 TA +$v $i $r $u $s +c $8 $5 $7 $! +uY2s1p +i4q o95 +-3 -D +c $6 $1 $4 $! +K u d +x23 z5 st2 +T0 T6 TC +$'$\ +$r $o $a $d +$A x24 u +i3[ x12 +$b $i $r $t $h +x58.3x41 +sYo +o0c o1j sg2 o41 o2q +y2 r -3 +E *2B +'9 T2 +i2s i4n i3o +*74 u x72 +sxo +l $. $s $u +*04 x46 +z2$y +c $2 $4 $9 $! +iBc scw +sFm +T2 T8 TA T7 ++4 +4 +B +i72 i87 +$8 d D6 +$( $Y +sxh +l x82 o01 +su| +$j $u $n $3 $0 +l o4t +E*B5 +T0 ^D +x64 sh/ +^s ^l +$4+2 +*74L0 +o0z $9 $7 $2 o4q +T2 T8 T9 TB +iDh +s5}-7 +*94 u x56 +su+ ++6 -F +c $5 $4 $2 $! ++6 -E +,7 +4 Z2 +$M $a $y $7 +f K +x04L1s4\ +o0q i2i i4s o54 o3d +T0 T4 T5 T2 +r x1B +y3*1Ax54 +sI{ ++4 z4 +T0 TA T3 T1 +c $3 $7 $0 $! +T2 TA T8 T7 +sJ# +c $9 $0 $4 $! +o0c sg2 o41 o2q o1j +T0 TA T3 T4 +*50 *23 +$q o0$ +,B E +o2u x82 +^c ^i ^b ^u ^c +^E Z1 +-7 { Z1 +*82*12 +^W-6 +^7 i66 o2m ,7 +o0i *34 +*84t +x67z4z3 +x03 x49 c +*85 o7s +T0 TA T3 T9 +*A0 x4B +T0 TA T3 T8 +T5 T9 T8 TA +c $9 $1 $2 $! +i8yo4R +T2 T6 T4 TC +$j $a $n $e +^m ^a ^r ^p +o1d i63 o5b o77 se2 +T2 T6 T4 TB +x37x7B[ +y1co7% +^dx74y5 ++B -0 -3 +$7r+2 +k r R1 +$J $a $n $1 $7 +$J $a $n $1 $3 +D4 sYu p3 +$7 sgc +{Z4oBR +i1a o32 $e o6s sp6 +p1 o7i +i4r i5i i6n +o6so8Gi1B +Z1 ^l i4b +i0m*63z2 +sGp +c $0 $2 $7 $! +sE8D0 +,8 Z3 +sgm z2 +l*76R0 ++9 -A +C +c $3 $1 $5 $! +o4o p1 +z2 R0 +^e ^p ^o ^h +Z1 o43 l +] o64 +T5 T6 TA +$. *92 +^a ^r ^a ^l +c $5 $3 $4 $! +i4r i5i i6a +.Ai9f*95 +$g $r $a $p $e +*62 *57 +7 +T1 T6 T9 T3 +T2 T8 T6 T3 +*70 u +T1 T4 T8 T7 +x52 p5 o63 +$! ^D +$Bx29.A +T2 TB T4 T6 +siLK +s35 d +^6 i56 i64 o7f o46 ++9 -C +B +T0 T6 TB TA +^0 so0 ,6 $6 sm0 ++A -0 +A +-5 -D -7 +xA3 $1 +c $8 $5 $0 $! +o1d i63 o77 o5b se2 +u i5# +i0h i2l i3l i1e i4o +$k $a $l $i +c $4 $3 $8 $! +qx58z1 +i1u i3t i2n +^t o1r +se2 $4 o59 o3f sc0 +C d $3 +i3j Z1 +Z2 o70 x02 +D3 i51 +4 +C d $9 ++1 +C -0 +c $2 $5 $6 $! +*46 +5 ++2 +3 -A +i7e x41 +y5 C +*43 ] c +$g $r $a $v $e +i0h i2l i1e i3l i4o +d *71 +o4y -3 +o5p o6e +i7d i3f +Z2 o5m l +x35 z1 +x84 x05 +x93s"Y +x71 d x07 +ky1,A +sm( +$1 y3 x28 +l d 'A $7 +y2 x43 y5 +t i2c +T2 TA T6 T5 +i71 i85 +c $7 $3 $1 $! +T2 T3 T5 TA +*54 *06 +T1 T3 T5 TA +x95sh[ +$d $o $r $a +-A+3 +i00 i16 i2M i3a i4r +C d '8 $3 +T2 TB TD T3 +k l '6 +o3s o1w +*13 *15 +4 +oAs*1A +i0i } +sb9s*O +$p x62 Z1 +siV +o0n o1i ++9 $2 i6s +D1 $+ +C 'D $4 ++2 ^s +*98.Bp4 +i6i ,5 +i7Ux81 +$j $a $n $1 $6 +^a ^r ^z ^e +c $5 $3 $7 $! +Y2 x12 +[ p1 ^) +o2$ Z1 x42 +^k Z2 -3 +t p1 +T1 TC T4 T2 +iA%s]7*0A +T3 T8 T7 TA +*50 K D1 +l $. $k $g +^zx93z1 +o2io6Q +^4 i0( +T2 T4 T9 T5 +T0 TB T5 +i5e i6n i71 so9 RA +$s $u $i $n $g +-5 i55 ++1 -0 +D ++1 -0 +E +Z2^C ++7 -8 +A +$p $l $o $p +$W L1 +-1 sdo l +o2r o0t +c $2 $1 $5 $! +si> +l d 'A $6 +T3 i3f +x73 'A +se* +y2-3syH +c $8 $9 $7 $! +$N $o $v $2 $5 +i6_ c 'B +l d 'A $3 +z1 { $s +i4v c x45 +p3 } l +*48 x43 C +.2*04$7 +$1 *45 D6 +s?P +x42 i3j +o7i x51 +l $. $k $e +s?^ +c $9 $2 $3 $! +-9 -C -9 +{ r x32 +xA3 +6 ++9 +C -8 +sF8i8E,3 +iE& +i2Q+4 +x53 *24 +'5 L4 x21 +sQUE +x52 ^a +$l*30 +-0 o17 +*B8iBf +CZ5 +x19suJ ++E -F +E +^z ^o +y4*19D2 ++B +B -6 +o52 *03 +$m $a $r $i $e ++E -C +E +p4 sO[ +sB< +o0T x62 +i0G t +i8n i91 iA2 +^m x54 +s?9 +p5+1o2O +-6 x42 +o1O x52 +x82 [ x41 +iE$ +*3AR6p1 +^o T1 ^g +-6 '9 +c $9 $0 $1 $! +sBe x04 +[ r K +*85s;OoA' +c $2 $8 $4 +.1$Y +r o5" +o6I$M'A ++3 o1e +^s ^s ^o ^l +-0 .3 +x43 o1u +c $4 $5 $7 $! +x02 -1 ++2 +E +z1i4w +o2Wz3 +*87Y3 +s-` +z3 i4r +sk[ +l $. $k $w +[ r d +sZz ++9L1s[G +skf E $o +sef +*35 R9 +sB] +K { -3 ++F -2 +x02 -8 +r*19 ++F -1 +o4; L4 +$b $o $n $e $s +$g o5i +c $1 $6 $5 $! +i0h i1e i3l i2l i4o +*54 ,4 +$v o6- +sw/ -7 +sTk x01 +o71 *50 +z5s?}x71 +K ^f D2 +z4*28D2 +i56 x13 +i4Es7@R8 +*32y3 +{.7s$U +s%Y^7*12 +ksyqs[K +c $7 $0 $3 $! +x16 s&s d +$1 ^s +o32 x52 +s=Pp1xA9 +^x ^i ^m +iE! +i37 } +$o $l $d $e $r +Z3 ,3 +^s ^a ^m ^u ^d +D1 x34 o0Q +o39 l +^n y2 +c $3 $1 $0 $! +,3 +6 +^k ^c ^o ^h ^s +o1e $2 +T0 T9 TA TB +o5a D3 +Y2 -3 o2o +i5f DA +x2A^>o69 +'9 z2 +*37 *53 +$c $h $o $u +Y1 *58 +i61 R1 +$s $u $b $s +$6 $f $a $c +-2 +0 sf4 +Z1 o5k +^t ^r ^o ^f +p2k +$p $e $t $r $i +o3k *14 +EsW!s#( +,7p1Z4 +] p3 '9 +o44 '6 ++0 +3 +A +-7 +5 +$b $o $n $z $e +o4i $t $a +o6Ry3sSm +d *93 xA6 +,B*39 +-7 +0 +$l $o $u +i0n xB6 x08 +i45 o33 +^e ^l ^a ^g c +^t ^a ^r ^u ^m +Z2 p2 d +}EY4 +*20 x31 +sbw ] +s@jC +^1 -1 x65 +sH- +$s $a $x $b $y +o3VZ3x83 +x2A o1e +$t $w $i $s $t +^l o2s +$u $t $y $p $e +x46i4^ +*21 *41 *23 +-1 o4x +fxB4T1 +$n $u $k $e $m +ds|l,7 +$a $u $s $t +i4a k x71 +i5o o2n +$f $l $y $s +^4 so2 sa3 i2b o56 +Z2 *90 $e +o1y sl1 $f se2 $l +$s $d $o $l +sE?s)q +*29oAj ++7 +7 -B +Y5} +-0 -C -D +$m $o $m $e $s +-5 +0 +i6'l +-0 -D -C +$z $y $a +$6 $3 sys +s'_ +i0`Y1s{d +xA7o4( +x95*4B +sDwsm( +o78 $4 +$R*70 +s.s} +o0wx39Z4 +RA$p +s*P ^5 +*65 o04 +o0X u +$h $i $f $l $y ++C -8 +C +$h $o $r $u $s +x83 Z4 +sy4 Y3 +^w snX x51 +*81 x31 +T0 T4 TB TA +^d p1 +su@[ +*87*42 +x27 .6 p3 +$t $a $s $t $e +*1B^|sAK +D6 Z5 Z2 +*61d +o3k +0 +$e $e $8 $6 ++2 o0H +f *16 ++2 -6 -9 +s /+8 +K x58 +o3l ,1 +i57 x03 +i2z ] +$s $a $n $d $i +i8i i9d iA1 +o5i t +$m $b $u $l +sw5s'5 +.5ri5c +s,T +i7sk +sMai00 +s7d^ix07 +$c $y $t $o +^k ^r ^u ^t +z4.3+5 +s,W +o3m .4 [ +K o4t +Z4s[B +x58 -5 +x01 o2m +sQ@o6 x15 +$s $a $v $e +$1 ^S +x6BL9oA) +$h $u $i +fs?`sn? +sD9i0Y$f ++1 +B +C +o7c *16 +$5 *52 [ +^N o1u +sL3 +i9^ x86 +i3t i5r i4e +^{ c +u i57 +$c $a $r $y +$a $b $e $l +o2m u +[ sh1 +s90 +0 +s{j +c T4 i4+ +$a $g $a $t $e +^d ^n ^a +*5Ai6{sCH +s9pk +sRpx4A +[ k y5 +s,} +o11 o9b x81 +*72sew +*79}$[ +^a ^r ^a ^c +^l ^a ^g +o32 *32 u +$n $k $o $s $i ++0 x36 $* +$r $o $w $l $e +o0e i8a ,9 o4_ o6a +smJ +T2 T9 T4 T8 +*17ts?d +sZ3 +x91*B7 +D1R7x05 +-5 Z1 R6 +$l $y $t $h +$u $n $t $a $r +^z ^e ^u ^s +$h $a $n $d $s +*1A*B3 +Y3 *26 D5 +s,g +^3 s;. +$] x34 +*53 +4 +dT9*73 +$t $g $o +Z3s;\i6d +D5 x57 +} } u +x25 D9 +i2i i4e i3n +T0 TC T6 TD +y4Y2D4 +*B7 'A i8t ++1 +2 +A +^d ^r ^o ^f +^y ^a ^l ^c +] K +0 +s,. +x16 +7 +*82xA3 +r $# +i1a sp6 $e o32 o6s +D5 x3B +xA5 p3 +o3t x51 +$Z L4 +x56 $7 +*34i7C +skw *03 +ss+ x52 +^P l s.y ++D -0 -1 ++2 +A -0 +y1 '4 +T0 T4 T7 TB +x42qo1f +i9X x54 l +x16Z5z2 +-A ,7 +u i5' +^v p4 R1 +K sX( +i62i70i82i99 +^BR3 +x38*4B+B +o2k x81 ++1 +A -5 +i1f i53 +u$UsnV +se" +*50*79 +i1o i3e i2k +^i ^d ++6 i54 p2 +*59tY5 +suM c +L8 *35 +p2 D3 x79 +p2x4BsN? +^u ^r +o43 R1 +so| ++4 +B +4 +^l ^a ^v +^# r *52 +$g $y +T6 T8 T9 TA +} o1k +$f $r +] $B *69 +T2 T5 T6 TA +] ^l ++B -6 -8 +x5Ai4' +} o1w +T0 T7 TA T1 +sl`*A1 +D7 sA$ +*30 ,3 *52 +Y2 *71 +x65 .7 +*35 *27 +o3f *52 +$5 o53 +[ z2 +1 +} o1R +*53 -5 [ +u i19 +z2 x0A ^# +E*79 ++C -B -1 +T0 T4 TB T3 +x69oBM] +x01 x79 +T0 *07 x21 +p5 L0 *78 +T0 T4 TB T2 +.0 Y2 +i35 i47 +*86 *70 +Z1 o5% +k *B0 +o4V *85 +z2 *31 +5 +ky5s^Y +] o4b +^b o3a +u ^3 +x02*3A*81 +[ i2s +i4k r R3 +*07 x38 +^e ^p ^m ^e ^t +-A-E +x92 *25 +x54 x01 ^r +o5pi1] +^l ^a ^p ++3 -2 -A +*37Y1 +$a $r $i $e $s +Ei9|xA1 +i54 x32 ++0 -B -2 +i9X x23 +x23o36o10 +R3 $$ +z3 *62 ] +sui y1 +s@Y*70 +*05 o5e +o3H DB +[ i2y +$hDB*27 +*89 ] ++0 -D +0 +$b $l $o $g $s +$c $h $e +T0 TC T6 T2 +{$6$_ +Z3*53 ++1 s.q o2w +Ep3 +i4g *23 +y4 *58 +$p x43 i5y +o2GD4 +p3 svk +D0^%x69 +,B x41 $J +o2t $r +$ $^ +[ i2d +z1 ^& +sXDfi0, +^* p3 +i1. i3. $. i5. i7. +sy? +E *A1 +[ i2g +x41 $2 D6 +L0 x16 Z2 +*96 T0 Z5 +R3i99 +Z2 Y5 +slY*06sUV +i2( +x74 *9A +Z3i4e +ci20 +s9" t +$s $u $g $a $r ++E +E -0 +} *91 +Z5 x39 +o3c D1 +x21z3 +^_ t +$= x96 +x51 o37 *02 +^b ^a ^l ^f +$ $# +x63 -2 +z3 s/4 +o7k D3 +] i2- ++D +D +F +T0 T2 TD T3 +$t $r $i $a $l ++D +E -C +i68 i52 +o15 o6u +D0z3*7B +$9 T0 x41 +R6 C *64 ++4 +4 -C +T0 T7 TA T2 +^n ^e ^p ^o +$f $u $c $k ++6 +B -9 +o5G l *50 +y5*01 +^a i74 $w oAo o8u +y2 Y5 +^b ^o ^l +*63 .1 +] D7 T0 +o3j *85 +.1 .0 +0 +*36s`n{ +Z1 *84 +i42 sky ++7 -9 +A +s6B T1 o0w +y1 skm +x27 { +*93s[{ +$wZ3 +*18sR#*B9 +x14 x25 +[*82 +x09o0&,8 +o4k $3 +$8 i5a +syP +*20 x43 +so0 D1 +o0p +8 +o46 z2 +$)K +D9 LA +o2k i4a +s;Jc +t i4< +^b ^o ^h +*03 i5w +x08 i5f +sBu *35 +Y2 o4c p4 +^g ^n ^u ^b +i8q Z1 x57 +*01 o3K +$m $i $r $a +$v $a $d $e $r +p1 $V +x13^Iz1 +] i2i +Y2 s.f +qs8.sFu +] i2h +q x6B +s;pshV+8 +s1w -4 +T1 T8 TB T9 +^m ^a ^l +T0 TD T3 T8 ++4 +F +o56 ,6 +i11 .4 +Z3sa/ ++4s$2 +sbJ xB4 +-5 *73 x41 +^y ^a ^d c +z4 y1 Y2 +sw[c +K *58 +i3z D5 +x31 i6i +L0 q +K *42 r +Z2 s!J +i8g i5i t +,A r +Z3 ^0 +i1u i3t i2t +sdp L5 +R2 ,7 ++6 +A +7 +R1x63 +s/( +kE^y +.6 i5r +i5e y5 r +Y1 xA1 +^x ^n ^i ^j ++2 -A -3 +x23 i3t ++2 -A -1 +diBl.5 +x73 o1g ++2 -A -4 +^s ^u ^n ^a +[ ^} +i5a i24 x76 +t L3 +[ o2p *05 +i3o o1m +d l 'I ++0 -5 -A +^2 *71 +o0D -9 +o4y $4 $u o5e +D2 x94 +i76 i96 i86 +*86 sf_ +x72 *31 K +x24 i2, +i4z Z1 +y1 y2 x6A +$ } Z2 +^MY3 +y5 x93 x62 +x42 z4 { ++D +F +D +*60'B +o2p r +L9 *96 +^a ^y +*A0fs(\ +i67 *02 +,3 -2 +^8 s7e T2 +t $D ++B +C -0 +s]is+Y +*07 ] +li1YxAB +R6 y5 +sHe +^s ^a ^h +i5a +7 +o1o sWt +]o27^+ +sg) +Z1o22*80 +y2 *AB +T0 T7 TA T5 +o0k *35 K +x03 { +i1E z1 +sFi +x94 x35 +rR1o0s +x43 i3t +^l ^u ^j c +p5$G +^0 so0 sm0 $6 ,6 +$6 d D4 +$6 d D7 +$6 x43 ++7 -6 -A +y2 x62 +i8@ x16 +x53 $h +L3 z1 +se1 sl7 st3 i32 o75 +[ r x51 ++7 -A -6 +s#p +o1? D7 +o5DsM][ +D2 y3 Y2 +Y5s6s +s#H +^c ^t ++3 +D +3 +x31 x5B +^o ^c ^s ^i ^d +$p $e $n $t +z2 *23 { +o4b z2 +$h $j +i5& y3 +^e ^s ^u ^m ^a +$h $p +x61 i3d +s#U +L1 i1w +y2 *64 x62 +s#P +i97 iA5 iB3 +$u $n $i $t $e ++0 -E -1 +$a $u +i22 '8 +'4 ^L +*5A*B8 +Z2 d p2 +o9D $@ +ci8} +r *76 +^v '9 i8t +y4 y2 +T0 TD T3 T2 +x01 ^( +T6Z1 +l o0] ++2 -9 -6 +^s sl3 +o0i } *20 +o5d x41 +sde +sNa +*17L1 +$y o5t +x79s|@ +sv_ +Y5p4 +Z4 *16 +*43 c ] +z3 o0m Z1 +x52 ^O +i75 i17 +s-)qD0 +qsp5syk +$N siu o8s +z2]^D +sul *58 ++A -D -9 +s/$ +i7t x52 +$n $o $p $e +l o7c +$H o0D +$b $e $a $n +i4/ *37 +spyd^Z +^@*45*43 +} u +3 +i0( iA1 +LB x0A +L1 o3d +.3CT5 +i7e i57 +s;X,1*72 +x41 R3 x94 +^,6 +x23 y3 } +*5B xA5 +i12i20i31i48 +u i5+ +*73 x42 ++9 +A -7 +x91 ,7 +Z2 y3 +$rsUr +l^; +x12 ^2 ++B -7 -3 +i12i20i31i46 +^m c +Z4 D2 -7 +.3 i4m +^a ^v ^i +T1 T8 T7 TA +D0 *7A +s}g$W*03 +-0 o3d +sOH t +i04 -4 +s"] +^c ^k ] i5w o3k +-7 -A -9 +$K i5O +z3 *43 +i7'sN_ +.3 i48 +sK*s|% +Y3 o3A +o0w o4v +2 o6p +f x69 u +p1 oAo +sFf +L7 x85 +s?u,B +srqY2 +$DxA6$) +D7 *68 *98 +*2AoA9sjf +Z2 x59 +i12 i3w o6i o2f +^a ^l ^r ^a ^d +*39p3 +f x31 ] +Z4stn +f *06 +p3 sQC +i6(z5Y2 +x07 o1 t +o41 ^s +p2 x04 +] oBc +i16 *32 +p5 s6A +o0i o4n +^p ^o ^m +o4v x31 +R2DBi9F +o2s p1 +^U Z5 +x48 Y2 u +R9 -5 D8 +R0 D6 +*45 } +^S$*sUs +x76 $i +y1xB1i52 ++0 -2 -B +s,Hx68 +sq]rx87 ++0 i59 +*48 D8 +Z4x0By2 +sX` +*56 +6 +$v $i $c $k $y +s0> +sg] +$t } D5 +s-! Y4 +T0 TC T2 +,6 o5f *06 +o6y -5 +xB9o2[ +D3 z3 +x42 siu +L0 Z2 +x42 *03 y5 +sA0 *20 +*47 x68 Z3 +sg% +^9 si4 o4e ,6 o7f +sDo +y4y1s/l ++D -2 +Y3R3 +i3a *04 +o60 x21 +s?M +$3 xA1 +*35i8g +i5l +4 D0 +x24 y3 +EiAIp3 +p1 Z3 +i0A *31 +*25 o4C +sx^ +K i1R +s@^ +xB4 iBr +sN0 +T0 T9 TA T8 +*52T1 +} [ i3o +^l ^e ^d ^o ^m +,B $J x41 +u ^9 ^8 +,7 *26 r +^m ^a ^h ^s +sN, +u i6+ +iA6 *83 +E $} ++1 s8v z3 +$e $r $i $e +^b ^o ^f +D1 $c +i5i z2 +*51z1 +x75 ^4 +r D0 +^p ^o ^b +sGF +sC4 +Z1 *35 +0 +i0k s5s +$0 ^o +^p C +] *69 +x83 -9 +x52 i34 +*18 K +.6cf +-5 ,2 *53 +*61i4" +d ^1 +c $C $9 +T0 T9 TA T5 +i7Gsc@z3 +d ] xA3 +'8 -0 -2 +{ ^y x67 +i1e i2v i3e +sN` +^m i2x +$^L3 +D1 +2 o3y i61 +Y1x38z2 +o7k l D3 +r s6k +^4 i2b o56 sa3 so2 +sI, +p2s u +x37 ^p +qs(Ls8O +L3s>S[ +x2A l +x59^+x43 +^4 sa3 i2b o56 so2 +T0 T9 TA T7 +x83 i7a +sdG x84 ++0 i3w +z2*45 +$f ^o x03 +c $t $o $y +^7 o2m i66 ,7 +i6x x72 ++5D8Z4 +T1 TA T4 T2 +L6 s61 +,8^8y2 +p2 x9A ] +^g*31^$ +f^5 +*05 *34 -2 +sMr +iE0 +}sB( +KksGd +c $C $b +E-7i4[ +Y5 *87 +A +L8sZ *40 +] $a Y1 +R2 D4 +p4 o36 -6 +$a Z5 +^9 } xB1 +[ *05 o2p +$\iB> +o6E p2 +'9 y5 +*51 *48 +sF( +c $D $d +{ *70 L2 +$t $w +$s $p $i $k $e +c $D $8 ++2 ,3 x72 +s3Ry2Z3 +$b $a $r $e +s_0 *75 +o0z ] +*05 .2 y2 +sTo +sx'L7iA2 +p1 $c y3 +i31 x51 +^k ^s ^u ^t +s30 *30 +u $d $7 +x6Bl +x47 d +u $d $B +sM@ +s/p +D7o6Ao0# +$)$_ +Z3y4 +T0 T7 TA T6 +o0m *54 +L2 L2 +^= K +s,Kx09i4W +ts-g +*7As'p +T1 TC T2 T4 +*B6 c +$I ^R +*B1sf>p5 +Y5*5Ao74 +s`C +C x12 ^c +x04 $7 -B +'8 x43 C +i3s i5e i4t +s/9 +Y5sZzsHE +^x ^0 +x71$sz5 +*B2iB!$y +i3c $a +-0 *40 +f u x69 +E^[r +s!q*91 +T1 TC T2 T7 +si! T1 +s;B$B +^x ^5 +Z3 o6k +}+8 +^o ^i ^t ^a ^r +i26 d +x41 x94 R3 +o3u i2w +$po1f +Z2 R5 $e +^< z3 +$r $i $t $a +^` x75 +^x ^6 +sr,.9Z4 +o45 Z3 +T0 T9 TA T3 +s+q +Z3 s.8 +T4 T7 T8 TA +T0 x14 i1A +^t x21 +sYTx08 +z3 *67 +xB9li5C +p4 iAP x9A +T1 TB TA T4 +$w $o $l $f $s +Y2R9*41 +^e ^t ^a ^n +d 'A u +^x ^8 +*26*58 +u $4 $E +x05$< +p5x4A +se1 st3 i32 sl7 o75 +^D ^F +s+K +$* xB7 +2 +sZ=s`Y +]i3< +$0 x04 x14 +x72 x21 +z2$8K +$* +2 xB7 +E su] +^k $3 si3 o6d +2 +$' k ++2 x39 t +x54 *03 +ux3Ao5S +s#D +^o.2 +i7f i3d +o1)*A5 +$B,8$d +Y2 D2 +x31 .A +] o2u +d 'F u +[ k Z2 +o0k o4u i5c o7c o2i +o9u DA +y3 +8 *76 +i6w x13 k +p1 x68 ] +i5E c +6 +u ^1 ^4 +u ^1 ^6 +o23 k +^e ^l ^a ^h +t x24 +u ^1 ^2 +,4 K +*A9 +7 ^F +i8j t x59 +T0 T7 TA T9 +iB *4B +$g $u $y $s +p1 ] x68 +u ^2 ^D ++3 *41 [ +^MsT=T1 +i5I $8 l +sWQi19K +f$S +^3 y1 } +su3 sk8 o79 o5k sa0 +r p3 x08 +s&e*B4 +} o81 +*94 xA2 +$p $a $n $t $s +^F*37 +-7*08 +i1)*14 +o0v i2m +s;. p3 +x28 y2 +z1 i96 +^b z2 *56 +iA&^_x54 +$s $i $r $e +sRD*28 ++1 { *21 +c ^i ^l ^a ^b +*32 K +xA2 D8 +L6 R5 +R1 ^a +^p ^l ^e ^k +x2B r +sU2 +o2r *54 +T0 T9 TA T2 +*38 x83 +^9 si4 ,6 o4e o7f +u ^2 ^0 +*69sG[ +TD TE TF +xA8x28*42 +x51 x73 +T1 T8 T7 T4 +.8r +i2( r ++4Y3 +x62 *43 ,3 +y5 x83 +x03 i2n +s?ux4A +z5z2] +su= +{ *31 Z1 +[E'2 +DB*23 +k .0 +*01 i1u +z2 ^& +^n ^e ^d +u ^5 ^f +sgI i2j +sCmsQ=d +o7_qo0= +sst +9 [ +s5C*71 +i3o d +$j $o $y $c $e +slo x05 +u ^1 ^E +i35 o6z +i2t i3t i4l +i54 i1f +T9} +t k $P +s+r*91s0a +u ^1 ^D +t o72 +u ^1 ^C +{ i4? +z2i1_ +Z2 ,5 +i3, -4 +x09 x34 o0w +$tsR]TA +T1 TA T4 TB +-6x89 +*65 z3 +^F i0B +*32 o2r +i2n c x52 +p1 o1I +*4A*23.A +u ^1 ^B +c $E $7 +R0 *54 +c $E $8 +c $E $d +q^# +s*m x25 +E ,2 xB4 +{ L2 *70 +-0 i9o ++0 i37 +{ k *04 +x2As|tz3 +T0 T2 T8 TB +o0g -4 +] z3 +^F ^F +^` -2 +sf3 *46 +*8A^R.4 +o7(Y5 +xA4 r +[ y3 D4 +o5& *02 +i0, x17 +u ^6 ^8 +$k $i $n $g $s +o0e o4_ o6a i8a ,9 +^CL4{ +x4Ap5R1 +$h $o $s $e +T2 T9 T3 TA +Z3 i54 +Es;' +s7g z3 ] +T2 T3 T5 T9 +u ^6 ^a +o51 .2 +fsMq*A5 +x94x94 +xB9*0Ai4W +T0 TB T6 TA +o0P x42 -4 +t '6 o30 +y3i6yY1 +k y1 { +u $A $E +T0 T9 T8 TA +o3k o0v +x42 i1h +o1f p2 +^k o6d si3 +2 $3 +Z4 o3g +8 +$g $o $t $h +iA$*A7 +x42 R3 +s)1sKki3, +,2i1vsjC +sHv +$* -3 x52 +$5 $2 c +u $A $F +T6 R2 ,7 +x32 i11 y2 +y2 x42 +Y2 Z4 +*38 i9D +o17C +^6i3 sW1 +$e $d $n $a +s&Is"asVN +*16x0A*35 +] o3+ +$d^V +sLs +[i8j +L3 L4 +x42 *42 +tz4x98 +p4*76 +qx13 +o4p Z2 +o5x ] +$_ $a o7i +s@_} +$h $o $p $e +L3 R1 +^B ^x +T0 T3 TD T8 +i5c i14 +o73 *57 +$. $s +o11 p4 ,5 +*7Ao5YxB8 +oBQE^r +i42i50i61i76 +T2 T3 T5 T8 +L6s}U +u ^8 ^b +T1 T3 T9 T6 +i3t D0 x02 +$i x31 +DB T8 +-1}x85 +u ^8 ^c +z1x89o7g +x43 x72 +*19 x86 +$w $o $r $m $s +-4 o5a +s ` +s c +u ^8 ^d +p2 D1 +$b $a $s $e $d +x86 o4J +{ D7 +L0 L6 +$1 Z2 +TB *12 +^r ^o ^t +z4 +B +i6Z x65 o3o +'8x37 +-9 oA8 +^3*9B*35 +i1b i55 +u ^8 ^0 +$w $e $s $t +p2 u x64 +T5 T7 T6 T9 +*78 x95 +x86 { +xA4Z2*01 +s +*02 o3/ +i51i69i76i87 +s1a R5 +sB" +s5X { Y3 +T1 TB T8 T3 +u $C $E +swF u +oB| +^t x13 D3 +x43 i2t +u $C $D +$m i4E C +-6 ] $7 +Z3 z4 +c ^e ^6 +i15 i1f +o3g *54 E +Z1 *A9 +c ^1 ^e +i17 i1b +s0K ^Q +'9 s-F +i8j x59 t +$d $e $c $a $f +x9A C +s-{i3^R3 +x95 y3 +x68 Z2 +^w szI k +i32i40i52i64 +o84 x24 +x16 d s&s +$-$` +$p sdo { +i39 i5f +i17 i78 +Z3*29 +T0 T6 TB T3 +*05 D6 +,1 D8 f +o3A z4 +$a i8b +i1d i55 +T2 T4 TA T9 +^k ^c ^i ^s +o6o x15 +sQi +so/ +x58 '6 i5w +'B ^_ +Y3*27 +y2$Y +p1*27 +y4oAk +*67 -4 +^p ^o ^r ^d c +x73 L1 +] sPE +^ x24 +i78 i36 +*60$% +i4u *32 ] +sQb +s^q +oBW x24 +*58*43o13 +i7L$kt +$$$" +K R0 +T0 ^7 +^l '6 +x4A C +Z3 D3 s73 +sQ1 +x48 u Y2 +s$/ +T1 TB T8 T9 +^e ^z ^a ^m c +*06 *90 x74 +r ^d x53 +L7 R6 +z4 Y2 y1 +x23 st2 z5 +i0s .3 +q $_ +T0 T6 TB T5 +^o ^r +i33 $b si6 i54 +*A7 x87 +$"$' +D3 +A x64 +$"$= +Z1 x57 ^g +^l ^i ^o ^t +x3A z1 +p3 LB +$s $l $i $d $e +i56 [ +i8a i93 +scV RA +$?$( +i11i29i36i42 +o3r D5 +TB*13 +u ^E ^A +i2K+8 +Z2 E p1 +t *B3 x86 +o1b +0 +l ^o ^t ^c ^e +y5 } Z1 +s#g +Z3 x4A +l K *63 +i32 i5f +i5e i16 +[ x3A +*36 *03 x02 +x81 .6 +*A5*A6 +u $D $F +u x57 +u $D $C +$~$$ +s,! [ +i9/ x28 +C *95 +$h i5r +Z3 *68 +^r ^e ^d ^i ^r +q *40 p3 +$j $r +T8 Z5 +Z3 C +c ^a ^e +i5c L4 R1 +R9 R9 +^t D3 +i18 i3b +x01 sad +^n ^i ^b ^a ^s +u ^F ^e +^3 r +i34 R4 L4 +u ^B ^F +o42 *56 +^w ^a ^p +p1 y3 $c +T0 TA T5 T9 +i36 i1d +x61 o1o +u $D $9 +x2A q +} z1 } +^a ^u ^q +^3 l +o71 *15 +i0? z1 +$b $r $a $i $n +c $i $o $u $s +i52 i16 +} ] ^d +i5e R6 R7 ++7 Y1 *67 +i5a R0 R1 +i38 L3 L5 +i5f i3b +u $D $3 +*39*0BoAM +i3f R1 L6 +T0 T8 TD T3 +L1 x62 +x57 i8S +i61i79i86i93 +'A s+G +^8 T2 s7e +i1P o53 +y2 z2 x53 +R8 R8 +*42 o1! +i11 L5 L1 +-9 sda +i3e R0 +i76 i37 +i37 i5c +i58 R3 L3 +o4&*10 +T6 ,7 R2 +i12 R8 L1 +u ^b ^2 +i55 R1 R0 +i35 R4 L4 +$+ q +i2A{sn/ +i16 i5d +x31i7V +u ^b ^d +k -3 -2 +T1 TA T5 T8 +$*$[ +*06 R7 +sA5 +o7t *02 +st_ ^Y +} k K +i1f i32 +i7d i1b +i34 R6 L3 +i39 R4 +i11 L3 L1 +i78 R1 L1 +o5e ,3 *41 +i9PY5 +i3e L1 +i71 R6 R8 +T0 TA T5 T7 +*26 *13 +,6s+4R2 +^e ^i ^m ^a ^j +o9r o4o c +u i7W +xBA x42 +o0j -2 +o4' l +o0j -7 +i1d R6 L6 +D6 o3- +c ^E ^3 +c ^F ^B +i78 R3 R2 +.5 Y5 +u ^f ^e +u ^f ^a +i3a L4 +K $8 +[ d r +i59 i17 +i54 R2 R3 +^w k szI +i11 R4 R0 +i33 R1 R0 +Y4*A8 +s+2 +i78 R8 R9 +i3o [ +sj +u ^f ^c +T0 T6 TD T9 +i1c i56 +Z1x79q +T5 T9 T6 TA +i11i29i36i40 +,3 'A +o3h x62 +si[ +x74*56o1R +u ^f ^8 +o6y i6a +o6s u ] +o5a *40 ++4 i03 C +Y2Z5 +i36 L1 L3 +T2 TB T8 T4 +*25 $7 +T0 TB T4 TA +i17 R6 L1 +i36 i1b +i17 L2 +{Y3 +xA5 o7o +z5p5 +o0c i6n +$3 i2h +u ^f ^5 +o9r c o4o +.5 -0 $X +i2tR7 +u ^f ^7 +^o *15 +i36 R1 R2 +i3f R1 R0 +^l ^l ^e ^w +^Q u z4 +d 'A +5 +c ^7 ^a +i17 L1 R7 +Z1 p4 l +i3e R6 R5 +T4 TB T7 T8 +i31 L3 R6 +p1 -B +sH spC +p1 o1h +^e ^d ^i ^h c +i18 L1 R0 +x14 s0Y +x51 i3u +*28 *25 +c $z $o $n $e +c ^7 ^b +^T *03 +o58 $0 +i8X-2 +s"C +D7 E ^Y +L1 L1 +i8c x52 +i22i30i42i54 +o3u K +sNw +u ^A ^E +iBu x56 +i38 i1f +K ^a -7 +r +2 +x52 r p5 +i1f R6 L6 +x53 TA +r sg3 +sx!Z1^- +i1a R3 R4 +i22i30i43i52 +i3b i11 +i19 R2 R0 +o6s x41 +x21 ^k +o99 x62 +R9 D8 -5 +C*6Az3 +*94 *01 +i7e i3- +u ^C ^F +$d $e $v $i +i78 R0 +s!9 +$j $a $m $e +i55 i17 +s#K +^m i0l +Y1syh +o15 $7 si0 $2 .2 +i37 i5d +i4s o0m +c ^0 ^f +x75 i7k +*54 ] Y2 +i14 i1f +x42so,o9l +$V $2 +i32i40i51i63 +i32i40i51i67 +^n ^n ^i ^f +$V$Bx8B +*A1 c +-1 $q +i11i29i36i48 +c ^3 ^b +spcxB1 +u $f $A +K o0p +i1c i78 +^# *52 r +*06z5 +$'$- +T0 T2 T6 TC +-9o4ei5* +i42i50i61i77 +T2 T9 TA T3 +$AZ2 +x13 sk5 z1 +u $f $C +*67*0B +^l ^l ^e ^d +z3 ] *62 ++6 Y2 +u o4Q +x43y2Z3 +^d ^u ^c +i76 R8 R6 +i36 L5 L3 +*08*53 +i52 i17 +{ o5e +^a $w i74 o8u oAo +i35 R0 +u $c $x +^r ^a ^m +o5A *25 +*15 o0- +x5Ax73t +u $2 $B +*65 i4e +^t ^n ^i ^p +i76 i14 +i59 L5 L7 +D4 '5 +^p DB +o0v y2 +x32 x81 +i1f i38 +i31 R2 R4 +L5 L6 +[ sYy +sab +xA1 x21 x71 +i73 R3 L3 +i12 i3d +^t ^s ^u ^g +*94^0u +sLfxA8xB8 +i7f R8 L8 +$s o0b +xBAs@) +] [ y4 +q +3 [ +i1f i78 +x24 Z3 *15 +i1f i76 +R6 *64 C +Cs&}i4F +[*A8 +o45DA +i40 $7 +^1 x65 -1 +-2L2 +u $B $6 +i58 R3 R2 +i53 R9 L9 +^s ^w ^a ^l +R7 R7 +sm4 +^y ^a ^t ^s +[ E y3 +T3 p1 ++4 i61 +i71 R8 R6 +c $F $D +Y5ts\R +$$$; +i59 R0 L5 +x52 Y5 'A +^%x35 +$Dz2 +*45T4x94 +^0 so0 ,6 sm0 $6 +i12 L1 L2 +y3 +3 D8 +T2 TD T3 TA +x81*0B +^n ^i ^r ^e +R7,5 +$s $u $c $r $e ++5 x02 *03 +^l ^l ^i ^k ^s +$f +4 Z1 +o5Zd'8 +u $3 $E +s # +T1 T9 T3 T2 +D5 o49 +[ $0 [ +o17p5*80 +Z5 x17 +$k $o $r $e $a +D6 i2r +u ^d ^f +k x31 K +i16 ] *63 +f x19 x21 +z3p4x63 +o7_*76sKZ +^y -7 +i64 x13 d +,8o0so5? +i18 i5f +y5 x68 +*67+8L0 +i14 i3e +i14 i3d +i18 i5a ++6 $r +svc d +Z3 +3 +se2 sc0 o59 $4 o3f +T0 T3 T9 TD +-7 +6 +*35 *61 +u ^3 ^8 +ksPh +x68d.5 +$. $m +i7?-4 +u ^d ^b +i71 i18 +Y2 *43 D5 +x6Az2*42 +] o0c +o0m *76 +x73^& +*03 o3s +i75 D3 +d 'G u +T4 T9 T7 T5 +i1c L3 +*84z1xBA +D1 i5+ +T0 TB T4 T3 +o0o ,5 +c ss$ T5 +*3AY1sqH +oBg x29 +Z5o9. +i15 i5e +*19.8 +i71 i37 +*89[x31 +s]*i2P +x31o8Qz5 +i54 x72 +y3 ] *16 +*76 x02 +x3Ao4" +u ^3 ^5 +.1u +x68$] +s"p$U{ +*54sjc +i77 L4 L5 +o5o *13 +] ] Y3 +x65z5 +o2U x53 +] Y3 ] +*98l^O +c $8 $A +i3b R1 R0 +u ^d ^6 +i4y $1 i6s o89 o97 +s,*i9u*B5 +u ^d ^7 +u ^d ^4 +L5T3 +s*to9Vi6\ +i17 i1f +s92 *57 +i14 L1 R5 +u ^d ^0 +*01 ^J +i8M x67 Z4 +i1f R3 L3 +z1 -1 -2 +x61 $2 +i36 i1f +*89o3S +'7 ^s +i76 i38 +t $Z +i31 R6 L3 +o0z $c *56 se0 o2a +^i ^l ^a ^c +o0h x71 +o5y $1 +i38 i5c +x95$B +.7 x05 +[ o0z o2- +i72 R5 +Z4x09s"` +i3f R0 R1 +i2n x52 c +i1f i54 +$h $u $a $n $g +x65sFO +o0s ,7 +$z $e $n +^to4. +so_i2(o27 +u ^3 ^c +stV*10 +o06 y1 +$t $r $o $y +^T T1 +*A4D5i1- +i32 R7 L7 +i12i20i32i47 +*97^8 +i22i30i42i51 +sqV^E +x27]o7B +u ^3 ^f +u ^3 ^E +sk^ +x41 $6 *60 +xA4C +sb2rx61 +$f $i $s $t +sZQ +o4@x56Z3 +i52 i41 +T1 T3 T7 TB +x08 '8 +-8*68Y4 +i35 R2 R1 +i2i o5v ^z +$k $e $y $s +tC*07 +lo6- +*09x76 +$_$' +T2 T9 TA T5 +T1 T3 T7 TA +D5 o4f +^x ^a ^m +T2 T4 TA TB +i1c R6 +i62 +7 +.0o3J] ++0D7 +z5 ^w x35 +x32,1z4 +}iBe +d i0z +o4s *62 +u ^0 ^7 +ss6*28$B +i4c *23 +Z2 x23 { +^z ^i ^r ^a +R5 k +i39 R1 R2 +^a ^n ^e ^r +i79 L3 +i31 i1f +i5b R8 L8 +i35 i5f +'8x28o3i +i74 i13 +^8*19 +-3 D1 +s"H*02 +} L0 x81 +i11 L1 R3 +o1C u +^n ^n ^a +o61 sg4 p3 +i4e i5r i6i +p4o9e +*27 Z2 x07 +z2 *17 ++3 R5 +skb [ x23 +Z2 x23 [ +^h ^a ^e ^l +sJ;i89 +*96Z4 +Z2o29 +$exB2 +o2l .0 +o5t swf o1j +u ^0 ^d +D4 ] o0p +o0t +5 +Z4qZ4 +y5 xA2 o5k +^7^c +sa4 C +u ^0 ^e +$Gx76^f +sf| +$!*50*24 +T0 T2 T8 T4 +i3c R5 R6 +o0z o2l o3i i5a i6d +K i04 l +*58 { ] +D3 d *30 +$x[,2 +Z4+9 +i79 L6 R3 +^x$xc +o6W*42 +[ $3 +1 +^a ^t ^l ^a +o9Es,&*20 +x43 o3x ++B-0 +^T ,6 +i4e i5n i61 +sa4 r +[ D1 { +f x04 ] +^y ^z ^a ^l +i33 R8 L3 +^4 c +8 ++A-0 +i5e R7 R6 ++A-4 +] x71 i0Z +u ^7 ^6 +D7i1Bs.| +i31 L3 L1 +i3 ] +Z1 i8y +Y2 *51 D3 +i3Ri7' +i11 x61 +^7x68$E +Z4 x67 y2 +T1 T6 T2 TB +i36 L2 L3 +T1 T6 T2 TA +c$1$2$3$( +T9x41x15 +i36 R2 R1 +o50 ^f +$k $r $i $s +]$Ko0D +^r ^i ^s +^e ^l ^a ^y +u ^7 ^5 +i14 L1 R7 +x96^|E +s +$d$k +{-7 +i4m +D4R3 +$pZ2 +D0'B +szt +i1o +t^G +Z2+6 +x81$z +z1^7 +-1d +DB$c +s+ +$8Z3 +i42-7 +o5z +^9c +D5$7 +co5F +$6-8 ++6*56 +^ho4 +i7- +x02^y +o5d ++7c +D7$i +iAr ++3o3p +smk +i1f +i7z +oA4 +{i1a +x02u +$ D1 +p5Z5 +o55l +x51p1 +-6-8 +[{ +L5R5 ++8-9 +i6+ +o2@ +$(u +lo4a ++3*12 +o5sl +i6= +$% +$o$s +^7^0 +$1x72 +$4+8 +s48 +DAl +$gl +$1*02 +L3x02 +x02i0f +[o2v +i8j +$@z2 +s52 +-3o0G +o3` +x12o0p +o1w +$] +o1p +o4Et +o6. +x03^1 +^d^5 +$\Z1 +Z2-8 +dx09 +$5o65 +i2w +i2u +o8d +i8u +$ZZ2 +$ZZ1 +$^l +'9o7n +oAw +*AB +ko2l +T0i3y +*32'9 +[o10 +*75t +T0i6_ +o7Yl +cx51 +sbn +se5 +l-5 +*10*42 +$u$r +^0x12 +*35r +^gT1 +o3G +D2^1 +o5l +$su +^7c +x03$r +o1! +^6z1 +o4h +-2*10 +^z$z +i7@ +R0z4 +ko6 +x09 +$7$6 +l+9 +D1i1. +-2D1 +^_x12 +o0-} +s30 +x31o3a ++0D4 +[o0l +x93 +$_Z2 +ko1a +i4wl +x02d +}p1 +x94 +i4:l +o0p'6 +i6J +*79x81 +$jc +i4# +i0=$1 +si +^e^w +$pZ1 ++0-1 +-1$7 ++1^l +p1o7o +co4l +slw +i6,x02 +$3i7< +t$` +^\R1 ++6[ +xB4 +i2nk +i97 +T4[ +D8$7 +o3+ +x03^u +'8z1 +x54l +o24 +o0bk +o0X +^ad +fx47 +^5 +o4= +'7Z2 +x84 +-8x04 +x03d +$.Z1 +x03sld +iAx +s0/ +L4L4 +cx03 +swp +[o2z +sj\o6 +o3= +-6Z2 +ki0b +lZ4 +Z5{ +*79*95 +i3M +$:Z2 +l*75 +sunD4 +s4 +T0o6r +[$8 +^3Z1 +o7@ +'8t +o9z +x74 +'9c +^ex21 +o7) +R5 +z1sx +^K-2 +us0b +o2Z^g +i3A +p1-6 +sak +{^b +d*09 +sedl +o0Q +sR9z5 +t$= +o2lT0 +o4K +o0Sp1 +*42 +$3D3 +{R9 +$.D1 +*40t +s73 +i2a*32 +sch +-5o61 +D7o5v +x02*20 +[+2 +^4T1 +Z2o8t +^6i05 +ssc +p1s6w +$t$b +d +$ex53 +x41o3l +t^\ +z1Z1 +$ x16 +t$T +z1i1e +sb0 +D3^@ +^tl +'Ai7s +z2-1 +x52D7 +[o33 +oA9 +o2Mc +$2*14 +rc +p1x9A +*15o5 +ssp +i4ec +p1t +*42p1 ++3i4k +do6u +Z2x82 +x12$* +^cx13 +*71'9 +o7y +ko2d +o3g-4 +o6c +}^b +qx05 +}i56 +$h$ +x81'9 +*02x21 +$rL8 +skx +$n$a +k^r +o3& +'B$l +tz2 +$8@y +p1$e ++0z4 +$TZ1 +*03$r +$5DA +Z1o0t +$.Z4 +r$z +^6^c +$7x62 +i2= +sa. +$ x18 +$7o61 +syz +$/@o +x61x21 +Z3l +i3b +i8y +dx94 +i3eD5 +^Jl +sml +D8x61 +$ux52 ++7$% +$X*56 +{$w +o16 +o1v +o6` +-5'6 +i3ml +dsg0 +i7= +}^k +^ x62 +Z1o5_ +^Bx32 +o3ic +o3 x21 +i4d +sgj +sa3z5 +k$d +sfa +slZl +R6t +i2[l +$5i6 +^7^4 +usCK ++4Z3 ++6x32 +t$; +iAq +o1h+0 +-9l +x32^e +kx13 +i31 +p1+2 +o8n +$1p1 +o4d +'8^a +$%Z1 +dx37 +$x$p +Z5$6 +z5sG6 +x46T0 +$2T0 +i5A +^& +o2d-0 +o1sc +*76'8 +z1o3- +^/c +i92 +o8& +Z3x74 +*21d +i5h +t'B +*15 +shk +D5-4 +s0e +Z2c +d*53 +o7J +T0i3s +sdg +$:$1 +$$C +i8Il +L1{ +sie +o0x +*85 +L1+1 +o7"T3 +s98 +l-A +z1i17 +L7'8 +r*68 +C$2 +$h +$ $7 +$wi6q +o3mx41 +i0fo15 ++2c +$Xt +i2ul +stz +@b +srb +i7jl +*50x15 +cD8 +@h +o3r +D2*02 ++8Z1 +i4; +o3 R0 +o6& +x83l +snc +i1z +^k*13 +$3$i +p1x02 +*03oBc +@a +*21R0 +i5P +o6I +p1x19 +i5$ ++1$n +i6a +Z3x53 ++0$` +-2R0 +^C^ +-6$7 +R1R1 +-8$! +*78-6 +so8 +q$1 +*45D0 +s0+ +to3f +*60D6 +^l^s +oA5 +*60*01 +Z1$e +ci4 +o0b*02 +o5@ +L3L1 +p1x28 +p1o0b +o6od +o1c +$3T2 +di7, +li5t +o28 +i6_D2 +[o4j +$yD8 +$4-7 +T1k +*65$! +$uo7u +x81o8s +-3x41 +i8. +$2[ +$8DB +lL1 +T0r +-6-5 +i3= +i8d +s2e +$Wl +z3{ +i4S +$iD2 ++2D3 +i3i[ +o2*d +*53*46 +'7i5_ +$1x51 +sh +^6^a +Z1T4 +o0t$9 +s47 +s07 +o08z2 +xB1$3 +i34 +i6rZ1 +x32*35 +-1o01 +*57o7s ++5'6 +lx03 +^A +^ji0h +u$! +ls' +$xD2 +sy1 +^ZL0 +s0 z2 +}x03 +Z1Z5 +$?Z2 +p5z3 +p1i5s +swd +s51 +i3 D0 +^ z1 +x72l +o4g +o71+6 +T3i3f +$C +p1D1 +$zZ1 +$X +$4o4o +Z2-9 +ki2z +z1^4 +$!T3 +^rz2 +$ep1 +^g +$.$9 +p2x0A +^1i16 +$!^0 +s14 +T5o7 +o31 +p1+9 +^y +L0Z5 +^qz1 +l-1 +x02+1 +x62T6 +s38 +oAj ++3+5 +s25Z1 +$4{ +x03x43 +ux02 +'9i8r +@3 +[o0d +$2*68 +do0z +T7^2 +o0bp1 +*04x32 +x71o81 +i3nl +^7^f +o1Kk +$eZ1 +i1b +}D1 +l+3 +x06d +*BA +i8Rl +x03D1 +x07i5 +i12 +fx59 +qs2 +ti0B +-4D5 +$-Z3 +co3m +z2L1 +D1^d ++1p1 +o16*31 +^/r +x73 +['8 +o1z +d+1 +to0F +o7, +xB2-B +i5+l +$&Z2 +s0) +o8A +*76 +o7P +'8*76 +-2k +o7F +i5Nl +o5.Z4 +T0o7 +uT1 +i8iD6 +^tx13 +i4qr +$0x82 +i2sx32 +$wZ1 +c$+ +$ii3 +^3^c +i2\ +R3p1 +x05z5 +o7m$1 +{Z1 +$lZ4 +i3p} +Z3o0j +'7$. +o0V +Z2x31 +i10d +*13o4B +-8[ +o6mc +c^A +xB2$b +s26 +$+ +$YL8 +s3f +o7] +*51[ +D3$. +rT0 +i9h +^1^c +^nd +o7>c +i68 +$($) +c^2 +o4Dc +$!D9 +{^a +o7sx51 +p1i4g +$1+7 +*53*20 +sv, +di4, +^t$. +lx95 +dx53 +$jZ1 +z1-1 +i3p*03 +R0^1 +i5;*34 +i9a +s24 +i1do1z +o4, +R5Z1 +o1r +i00^d +o6wx71 +sa6 +D3+2 +*12l +p1xA3 +i8a +co7r +s39 +D8c +co1y +rt +srz +o03+1 +o0$ +T8[ +lsp1 +$er +D4*30 +$IZ2 +o0E +$IT2 +o3dp1 +^2z1 +}k +-6+0 +i5p +lsr[ +s2f +p3x73 +i3^x41 +z2-0 +*45o0g +i84 +D1^7 +cL0 +sbg +$*^$ +*57x16 +^! +^c*12 +L3+3 +$.-5 +o4tx21 +sdil ++0T2 +R5R5 +x46$1 +o0'{ +Z2-4 +o5x +qx12 +*97$q +z1$d +i4* +sec +^o} +$`x02 +s2a +}^c +x04p1 +o9g +i0f-1 +o0m{ +sud$3 +^9^6 +stc +x24d +p1o5k +l+4 +i4k +^` +o67 ++0z1 +$qL9 +'7c +Z3t +o1r[ +*58'8 +x07 +R0'1 +o4% +^Az2 +sjh +^h^a +[o3z +doBa +Z2x03 +^]$[ +di5 +$> +oAk +}x02 +x04L0 +T2+1 +o0aT2 +x32$7 +slF +[*05 +o3g*30 +o76Z1 +o3n[ +^5^c +$Qc +stm +'5q +^8^3 +dT6 +^B +dx32 +p1x74 +^Mz1 +o0H +o07$ +$!x21 +sbe +i6: +l^m +D1+3 +Z3$- +$<^< +*06l +o91D4 +*67 +^k'7 +z5x25 +o9ex63 +L5x32 +$-$x +^vx14 +$yZ2 +o67+8 +*67o75 +$$^# +o6k[ +-5t +oA1 +[+1 +^l^k +x62c +$%i61 +[i1z +'7$9 +i8f +'Bx71 +i54*31 +sj +*54-4 +u-5 +x02^X +p1x34 +$ $3 +o1yp1 +o2. +D6d +x81R8 +i82 ++8-6 +x21+1 +x03$! +D6$9 +x01r +fx43 +x31-0 +$6$7 +o6B +'5z1 ++0^p +o12$! +o1K[ +s2c +}Z2 +o56 ++0+3 +D3p1 +i0do1h +$mZ1 +i7k+8 +srS +^ik +di5p +-6-7 +Ck +x26d +o0kx23 +^c^1 +d'9 +i3mR3 +$9o76 +c'9 +si* +$2$x +^8z2 +sdm +^ z3 +p1o5g +-7+9 +-AZ1 +s86 +$z{ +$-$. +$G +o4cx02 +'2z3 +'8$a +i6E +R0} +fx65 +x34q +^GZ2 +x03^g +lx23 +D4o0m +*86+7 +ci8 +l$u +x0B +$AZ1 +p1x72 +soe +x0Ai0 +ki0r +-0c +D6$0 +x61$+ +fi01 +$ +0 +$qd +o1;l +sbk +fx91 +o4A +*74*65 +^n$1 +Z1o0K +^K^J +s4& +p1+5 +z2i1n +o44d +[o3_ +o0L +x41i2o +kx12 +$!-5 +Z2d +$-Z4 +$i$n +p1x36 +o6cl +u+7 +T0^e +sz t +-3D2 +$id +^S$S +x71+5 +*56$1 +x21+6 +$:d +o2d-8 +lssd +o3 } +CT7 +i2g +sl4 +o7= +uo6A +o27 +x23o2n +$b$a +iBs +*74$k +-4o0P +^tx12 +[-3 +i4 +7 +'5^z +$5x52 +i2y +T6T5 +Z1$2 +dxB9 +[o1o +T4'A +se, +^H +i9o +dxA5 +x45 +*45p1 +z2R1 +p1i6r +$4T5 +^.^t +'6Z2 +o6; +*10R1 +rf +o6.*07 +l$q +i6%c +c$x +x04T3 +-4Z1 +*21o1e +i3z +-3+2 +^sx14 +i1b$s +i6I +se8d +*13*42 +R2o2v +z3+1 +$#o0w +$0+5 +sas +p1x47 +l*35 +[$@ +p3x4A +^v} +*02*97 +dsh6 +*76*68 +$7x52 +$2x53 +o8ru +LBx92 +sb7l +$3k +Z1L5 +x25p1 +p1x98 +dx67 +spt +i0i +*67*86 +snk +o9m +z1*50 +}$% +o2-^k +$!x71 +^;$ +i6` +fx7A +s65 +$;@p +l^D +lo6. +$2$! +i6w +Z1iB8 +sw +$1o7l +i7k +$ sro +oA- +$!x61 +^q*14 +T2T9 +Z1i5e +}R0 +cZ1 +^.^1 +D0+1 +sr! +i9t +-6+5 +-3d +s2# +o0KT5 +^0^c +o54*02 +i5z +o2Pl +o7$ +D0^u +o0Fl +*30x41 +cL5 +lx26 +z1^d +^Rl +T7t +i27[ +p2x04 +}i1f +i47c +do0f +sce +s5b +*20-0 +o4sl +i4El +i6zc +^WT1 +x32o0k +[$r +o4yo2k +sed +o5Ac +s1e +su1 +o4ix31 +p1x68 +o60Z5 +$PL9 +o7^ +[o3 +p1c +[f +$>$ +[$i +$j$o +}x04 +i6u +'7d +T0*9A +ss7 +o4D +*46+4 +t$B +p1*78 +s1m +*46$v +i73 +L1 +s50 +$B +sb3 +o26 +o2mD3 +*05[ +i5d*05 ++Ax82 +^ci1j +t*20 +L0c +$8@m +c$k +-7l +cx53 +o6W +p1o0h +^ $ +[d +$zZ2 +o4; +*02i0s +up1 ++5p1 +x01+6 +T7*64 +o1Ul +o64$o +^md +p2x58 +-7-9 +}^e +-4x31 +fx53 +o73o89 +c$^ +i6g +i09} +$9*01 +k'9 +^2$$ +*65*67 +^.z2 +^gp1 +[z2 +-1^8 +^4^4 +i05p1 +i7b +s1+ +@ed ++7Z1 +x46z2 +o2b-0 +x02i5e +$oo6w +^i^M +L5x04 +@8 +^Eo4e +R6+5 +q$d +o6z +co7M +o37 +stD +i6z +i5ju +o0kz1 +p1oBr +$p^9 +^1^b +o1j$1 +o6?*45 +$,*64 +$M+7 +^S^J +^7x21 +T8D5 +x45l +i5i{ +o04 +^Sz2 +^4z2 +seb +sb2 +R0x13 +^V$v +o23R1 +s6e +o1%u +o6@$1 ++6-5 +'6*54 +^g$7 +o8m*67 +to86 +*50x53 +^mo2i +$VZ1 +o2r^v +-6^@ +o5s+4 +$bx72 +x12o4 +$e^d +*37$k +$-D5 +o5$Z3 +x73xA2 +^.^a +[p3 +sko +s_4 +-3o4e +-4t ++7i5j +^=z1 +saeD6 ++6o5w +*63 +o8` +$B$J +$+@9 +i2-^z +o8Kc +i0h^r +^t*23 +o6^ +D2$. +o52$x +x93L9 +-1{ +x87 +sPs +$*$1 +o5Kl +^ z4 +^ax12 +$1^c +x43l +o8go9r +o6/$6 +o1ki1u +$"i7! +$4x62 +$ix62 +$!^D +t$" +qx86 +[z5 +DB$4 +i2- +o0gd +ki3f +i7* +i7, +*74x41 +@9p1 +T3i3- +i1kT6 +$3o6= +$1+6 +dx81 +o81sub +o2d[ +rZ3 +T7o5z +*71[ +^< +^ki1i +Z1*34 +'7o6z +svg ++9o8j +$V$6 +*85i7e +oAs +Z1x03 +o6TT7 +o0iu +$q$w +i2$ +sh-o0g +o1j*41 +D5*45 +Z4x61 +oA7 +li6t +*27D2 +x21f +^Mx43 +*53T4 +*97syi +i5Kx64 +i4@-8 +ci31 +^5^b +i5#-9 +o4T +svn +*97 +DAo91 +dxB4 +sx+ +DBx71 +i1! +x12$s +oAx +sunsjk ++5+7 +*13p1 +xB2l +Z1T0 +$7+1 +$9+4 +ri4, ++0o44 +Z2$5 +}z4 +$2x51 +o0uk +*87o0p +o4G +*31q +$-$+ +R7l +L9x62 +$ux62 +sJgl +x14^g +o6d-6 +r$; +'9r +tx72 +$`Z1 +o8Ec +Z3$5 +o61T5 +L1-0 +*A9+3 +$JL5 +s1I +s,g ++6R5 +$ R5 +o0W*31 +$6T2 +o4Uc +x02^j +^c^4 +{o6t ++6$A +[*64 +so& +i3mt +$pT2 +o0Ku ++2$ +i4 *37 +o6M$2 +kc +o4Iu +uo1d +^[l +sfj ++6x42 +^zL0 +[$- +kx31 +o9/T0 +^sD4 +^,f +s!6 +$?$2 +-2o0T +li5- +@6o57 +^0*20 +i0.c +kq +k*51 ++5o4 +o3 ^4 +*23^ +$:$! +s3o +-Bl +i3ou +$"Z1 +srm +{R2 +z1R1 +D6L5 +i6ax02 +x16$_ +$f-3 +o3O ++9i91 +$ui5- +dx21 +i3Qo3h +o6E +$.$K +$roAg +*97@a +swc +lsgj +T0T9 +$pD2 +^u^n +-0l +c^M +o1, +$g*54 +*45R4 +i4:*02 +$=T5 +oA0 +-1o0t +^3z2 +*40x42 +o15[ +i3e$Z +$3$ +o4;^c +^y^o +o7f +p1x76 +*36x32 +dsam +@bi5 +i5^[ +sprd +^Zi4X +z2R2 +x14i0T +o7&$y +sBLp1 +x0Ad +$ *52 +i90 +z4x46 +i2j +sb7 +s7f +x02'A +$#*57 +$di4 +*21f +s4/Z2 ++0$s +p1*A8 +T0^S +^u^S +R0q +[u +di0m +Z1*21 +i7S +o3D +p4Z1 +D8i5b +Z2*65 +$U$J +R0p1 +iA0 +$z$2 +$mk +lo1a +sfg*91 +o2-+4 +iB5 +$"iA! +s62 +-6x51 +s28 +o7 $l +@6 +s5 +s09 +^sL0 +*16x43 +dx07 +^x'8 +$.x63 +o4"o0! +lo6k +o3np1 +i3-c +di4y +o7cZ1 +i3h} +i4% +i0s$a +$eZ4 +C^7 +slm +$fx82 +x05p2 +sgml +o7mx81 +-0^2 +*74+5 +L4 +o9@ +t$F +s9 +i1_ +o6tD4 +-8*BA +o1kL4 +D3i3_ +x51Z2 +s3Tf +sw6 +o7#R4 +L2x02 +$qZ5 +*62*73 +-3x02 +{$i +di5o +R0o1 +scs +^6D2 +to61 +xA2 +o54x41 +{^d +Z2*53 +'Bt +*65x42 +x51*57 +$"u +}o0x +s2eq +*46Z1 +o0kx41 +$" +D6^b +spj +^ex12 +i67*53 +p2x2A +D1^p +$o*82 +i4!c +*40'9 +$vD5 +s3e$7 +$xx92 +[o1t +^yi3_ +i15r ++6$0 ++9Z1 +i4.r +@5+2 +T3$1 +T6Z2 +rs1 +i74 +i5q{ +*06$1 +sms +$q$a +x09$ +Z1i7o +f@a +z1o4, +-2u +'6$i +$1-6 +*78s71 +i6mx06 +p1x09 +$N*65 +'8-2 +-1$5 +s@, +z1o91 +L1x23 +$X$2 +xB3Z2 +$pL6 +*24k +o5/i0A +iAs +-6i5, +x81seo +Z5xB6 +shd +i00o6m +p3x0A +$mZ2 +$7Z3 +L5x62 ++6*57 +i1d +o1q^& +^k$a +sor +x2Bo2 +to0V +r'A +o4' +o0=^b +x39 +sAcp1 +x15 +T0i3: +x72^l +sNS +x61x14 +$hZ2 +^wz2 +$1*74 +-2r +Z1i4K +o6p*56 +x02z1 +o8i*57 +o5 @e +}'A +T4i4! +o5,x61 +Z3D7 +i46 +x61*9A +^N$H +s23 +}o0 +^so2y +i1-u +k+1 +-0$u +^j*41 +i1p +i5L +scf +*25 +i4? +qq +$4+2 +fx64 +x06R1 +Z1-3 +i2w@o +$lZ1 +d*03 +$_$+ +x13o1u +s!+ +-0$1 +$hp1 ++4*53 +o89Z1 +*72$q +o5ei2U +l^4 +sx) +i37 +uo0W +o7<*67 +i4P +Z1ssB +*41d +oA +o9iD0 +i5E +^Ct +o6xx51 +x71x21 +o2? +o9x +i56l ++6*75 +i6q +sp+ +$1x53 +z5R5 +o5N +'7^ ++0*32 +^a^p +x13i1j +x04Z3 +*61x12 +$_$i +@8k +p1i5z +i3uq +-6$8 +-1*13 +$sk +o5.x41 +^8+1 +s9 x01 +@5 +$xl +^lo3 +o51$k +o0sx31 +o4@ +oBy +Z4+7 +o2: +$3srl +[x32 +D3$g +o06@r +^1z3 +*32i4s +'4z5 +z2sD +$1*34 +$7s4_ +-5$? +D6o2d +$yp1 +R2^b +$6[ +i6a+5 ++5$g +$w$e ++6+1 +o8![ +'5$3 +fi5n +o40p1 +sn2 +$ sg; +*10o1. +i3mZ1 +ci1F +xB1oB3 +$ ^b +*40q +oBr +dxB8 +*68D6 +$9*14 +Z1ss& +i9e +xA1D8 +$@u +^AD4 +z1o2O +o2H^H +$.i12 +Z2$, +shO +$y$s +-4z1 +o65Z2 +*65^z +$4p1 +i46i42 +T5x62 +x01*42 +iA! +$d-8 +$Po6. +z1^i +$Lx73 +r'6 +d^1 +-4-1 +$-Z2 +x82T7 +*46l +Z2$v +i3jl +^@^p +$5x41 +Z3o4a +x23q +x21+2 +L5i6g +x21^k +^6^4 +o4tZ2 +i3! +u$m +*05+3 +^W +o6x ++7i6y +-7i7t +L4'5 +x01i4u +L0L0 +i4aD2 +D2-2 +sd* ++6d +^Pz1 +Z1^4 +^kx15 ++5*78 +dx75 +D7*78 +$8*78 +^a} +'6o5l +o6< +Z1*86 +T1T6 +skr +i1= +$s$m +o8M +i8tc +i5O{ ++5*35 +Z5se6 +L0z2 +D7u +i41r +l$i +T4+2 +T9T8 +to8T +^mx12 +D4o4 +-0d +Z5x43 +*03o5_ +c$? +$u^? +i3y*42 +s, q +x32x42 +p3x65 +loB1 +^6L1 +$1x58 +}^w +*32^s +o2rq +o1oL0 +z2o1. +$0c +*50*41 +$T +sx! +li8a +si. +-8DA +$ix54 +s74 +sft +o6/ +^0-5 +i0d^7 +L0^h +{$6 +x42-4 +oA3 +$8{ +x13+0 +s37L1 +i31o0s +*62x03 +L1R1 +i7iT5 +$e$m +oB9+8 +R7Z3 +^Vi1c ++6Z1 +fx27 +^1'8 +D3sao +Z1i8x +i01$9 +[z1 +i65'9 +i74i8z +sm8x21 +li3/ +D5d +sdq +'4[ +z5x62 +scv +o6l+3 +o1eo2d +s1/ +o7% +^/z2 +fi6o +z5o7 +fx49 +R7*67 +to9H +D6'9 +o5K +rs0- +i4qo5u +i3:c +x03Z5 +*01R0 +$8d +o51c +o0f^7 +Z5$a +x02+3 +^>o71 +^ei13 +s90 +o0dD5 +lZ2 +x37p1 +o2su +$s^k +i62[ +o3wl +L0p1 +o4aZ2 +*03x43 +T3$D +-5+2 +p1+7 +s6a +o70c +$6$2 +xB3Z1 +$-@T +*01$f +$Ml +lo5< +*16 +*37$" +i1Eo8E +x72c +dxA6 +^c+1 +*12o1b +-7$5 +^l-8 +x62x13 +syj +Z5$c +sMk +i9u +*25z2 +T0$9 +x34ssp +^2$* +fx76 +*65l +Z1+1 +D3i4, +R7'8 +lo5n ++6k +$t$h +o9sD3 +*98x71 +Co6: +r^z +p2x06 +$k^m +$xf +*21x41 +L6Z1 +oA, +D1sn_ +c^H +*57$0 +i2a-4 +o8#+9 +i57 +$p$l +$?+6 +o75t +sn, +*46-7 +*87$1 +$8*75 +*31D2 +$d$b +i0esn_ +s9x ++0*86 +i42@2 +^#x61 +o56$6 +i0P^E +s9G +R2l +$:c +c$" +o8$ +$ +i2H +x12$6 +$i$d +*03sbe +Z2x23 +s2 '3 +$s$4 +$Gc +*B1x03 +^pc +'5$r +x52*67 +*54o3 +x31-2 +{^L +sx* +T2^) +*41s9< +^/^7 +i5F +^bD4 +sla ++7l +o8) +$hi8% +di6b +qx4A +sac +x02L5 +o1k^s +'5p3 +$ x73 +o5 '6 +'8*70 +T0$} +^s+7 +sbp +-BZ1 +*35t +qr +$Ru +R4R2 +s0q +x96-6 +D0i2m +Z2$7 +$l +D2+3 +c^< +[s7+ +$sD7 +o7w +T0T5 +sv6 +*74x54 +i8zr +-7o80 +*02^b +^#$@ +*87+8 +tD1 +i17C +fxA5 +^_T1 +$#x62 +*61*21 +-5*68 +z3o12 +uo7% +si\*12 +o1N +^1$" +sdP +$*sln +$%t +i3v ++7-6 +*72 ++At +T6*65 +t$> +x75 +o14Z4 +o4( +$@@i +o5m-6 +{c +l^{ +*42T0 +o2v +p2^T +$@L4 +o2cD0 ++4[ +x12$ +i4ho2r +*65[ +li58 +$2*78 +ki7g +-2d +o85x62 +o93+8 +*01i11 +s20$! +T5o0S +{i8* +$nx82 +$D*57 +$7xB3 +sx^ +o7bZ1 +p4[ +*74k +i4,-5 +$d$w +*78Z1 +sl! +fo68 +l$j +$b$u +o2nx32 +$lx62 +o01p1 +'Ai9 +*57o7, +[o0W +*06T6 ++1^b +x63$. +*76i5 +o7#*76 +Z2s7@ +x02^x +s _ +i7v +u*68 +T2T6 +x04i6 +x04u +o1g +@0Z1 ++A*9A +Z5s3+ +'3p1 +$%se1 +i6& +o89+9 +^kz1 +$b+6 +i4gr +$m$x +$ao7f +^hc +slMT2 +'8Z5 +*74*85 +-4+3 +-3-4 +z2*96 +*40x41 +$_-0 +-6x05 +i3; +Z2-6 +sb1z1 +^8r +o4w +D5$i +x03*34 +^6x12 +$3Z2 +o6P*75 +$7Z4 +s1.*57 +*72x03 +^s} +o0gq +*13i4y +^?z3 +tT9 +tZ4 +}o71 +$$+7 +Cr +$2i6R +*10z2 +^i} +o34t +o5e$2 +*83x59 +^f*21 +*50R5 +^0r +i1, +sm+ +iAo +$!^y +$K$! +dx63 +-0i1r +sgll +*A4x05 +x07d +*05c +o8[ +x24^m +x52x31 +Z1+6 +'6$2 +r^a +$2$k +Z2*64 +$ { +D0Z1 +k^m +-7*87 +dx38 +$&u +$qLA +*67-7 +$8-5 +D0 +siO +*21-3 +i3/'8 +D1L0 +*4Bx63 +o9'^s +x35l +*58l +z3-3 +$8$+ +-5$* +ui6 +i6hr +o6D +^Hi5` +$#$7 +do0L +su0 +o3% +q'B +'Aq +^J^J +s95 +$a*38 +sf2 +-0o6p +i6,t +x42^d +p2x09 +z5x35 +[o0n +^j$s ++0$i +p5i0; +o3uD2 +^/$/ +R1C +*31$r +[z4 +i4_x54 +}i0z +ko3- +^h^m +T0^F +sF1 +@ki19 +fx48 +ci7u +$H +R6 ++8z1 +sa- +Z1i7n +o8, +^q +o6 Z1 +si_p1 +to6 +p2x85 +i60c +-6d +Z1i7% +i8@ +x46 +^+z1 +x02C ++1$j +Z3o30 +uo4Z +i7o*35 +^o@o +o0eT6 ++1i4X +$/$) +ti1S +o0. +^)z1 +@1l +lo2o +-0+2 +*45*35 +s5qZ3 +^w^t +-0+3 +'AD7 +*BAD9 +sc5 +i06z5 +^c$z +*56*85 +x02o3y +s42Z1 +T0o4r +$6+7 +$3t +cx02 +s32 +o6) +Z1*35 +o5a[ +p1o0s +i7+ +tr +*89+8 +stj +o7Y +i9dT0 +*30x01 ++7r +i9 x52 +f$m +sO= +^!z2 +se0 +o8bZ1 +x32u +i91 +R4D0 +p4x3A +i9_ +T1'8 ++5s36 +x02*23 +o6 D1 +Z1$0 +do0H +li6/ +'8o7a +o8T +$rZ1 +@z$8 ++Bx02 +sgb +DAD5 +'9q +T0T7 +o0ri0p +s5_ +i9f +^_z2 +{Z5 ++5x01 ++1Z4 +o05t +o4L +x43$! +i3xd +so.*40 +DAoAa +R0Z1 +^go78 +o2Nl +o3p +*42z1 +Z1T1 +R6x06 +*84x23 +x41} +o4H +x91+9 +z2*14 +s72 +*12o2y +@4 +o2[L2 +$!D3 ++3$1 +o0n^n +D1k +sbm^S +R1$5 +o5q +^;c +T1T3 +d-5 +o2p+3 +'8u +co4N +o0wq +c$! +p2z3 +x32i3: +i6 c +$;Z2 +^Cu +o9y +'A*84 +ssb +R5Z4 +i3_*46 +sq +o9v +R7$x +s0rL1 +o1bo0r +x04^l +*25R5 +$9$4 +p1*80 +-2$) +$Uo7# +T3'9 +oBz +*01^R +$3Z4 ++0x42 +li2p +c$0 +s42 ++5*87 +p1*63 +i2^ +$kx13 +$to6w +o1aD2 +o6M +o7u*67 +o6c'A +o0! +*06 +D3$b +sdo +co06 +Z3xB5 +$M$W +$zo3 +o7( +i0H +^ri1t +*56*76 +o5-*40 +swk +sh7 +x61$1 +L1*15 +^AD3 +x02-7 +p1'6 +Z1o9_ +o9b +T2^` +[o3j +sxy*40 +Z2$! +o5H$i +o3Ec +D7+A +o3? +i3%C +T6o1C +x09l +$2$% +q$3 +R1-3 +$"Z2 +^bsrz +$3x61 +z1$i +$d*21 +^.z1 +i9r-A +$3d +D3^p ++6$; +i0o^N +di7u +o55+6 +ki1h +^Dz2 +D0o3n +o94l +^ x24 +s9. +-3$1 +ri3t +^qL0 +Z1i58 +$P$s +$j*07 +^&$2 +i0?$! +z2o1H +^ID4 +i1v +x07k +o0Oi3B +Z2^$ +$(Z3 +Z4x42 +*40x34 +*53o15 +$o+8 +x02+8 +o11z3 +l*83 +$ix92 +^f^a +dx36 +p2*B1 +i1. +o3A +p1x17 +o3!-2 +$*D7 +$ x41 +x21*68 +$ai02 +lo6 +oAd +^b^2 +$u-6 +^1-1 +uD8 +z2i1a +^=$0 +o5I +iB_ +sir +i48l +Z1+8 +o7!-5 +s1Rq +o5to3u +^2i42 +*48z1 +}^j +^5l +i45 +o7)l +c$D +D3^8 +slt +^9i1b +spk +'8o7; +*30+3 +*67-5 +stw} +co3c +p2x6B +^zz2 +*08$* +-0*21 +x91D6 +@r*62 +$Q +x41Z4 +p5Z2 +$z+5 +i3l^z +$zD4 +i8m +o7o'A +^c*16 ++0Z1 +c$v +p1seh +T2d +i2< +$9Z2 +i66'7 +lx75 +^>o2 +x52$$ +Z3sr& ++1o25 +-0x12 +$9i7. +-8-6 +^qz2 +Z2o70 +$D$r +p1x25 +o5+*67 ++6u +$c-B +o8q +L5*21 +-8z3 +i51k +Z1RA +s9lZ2 +i1uZ3 +oA3Z1 ++1l +z1o0M +p1o0l ++4+0 +RBx0B +r-A +sn6c +$1o6c +*20x32 +o1n +^; +o8x +o0Di6r +x32c +x84c +^Sx12 +sw, +^^ +o7zl +x32^6 +o4x+2 +Z1$! +$0x72 +-3+4 +o1sz1 +lZ5 +}o4d +$fk +skl +p1z3 +o2[ +'9Z2 +*42^k +o3ul +x91R9 +o3K +o6mp1 +'2p2 +srh +i21 +o0; +lx78 +k^w +k^n +ci5/ +tD8 +$sx83 +$Z*76 +o5A +x51o3s +x12^o +^ai15 +-9} +s9^ ++5*65 +*51{ +o77Z1 +@0s3_ +-2T4 +*30*02 +o9t +^pz1 +x13i0M +*02o3e +qx82 +^1o63 +*76o6. +'7Z1 +s1wr +p2z5 +@sl +s5, +$5x51 +$no2- +$axB4 +$z*23 +{$- +x26} +i3nZ1 +^S^N +*05x35 +o8 x02 +x02q +x14+0 +Z2si9 ++0*20 +T9[ +o5 Z1 ++7o6x +Z1ss +o87Z3 +i98s18 +$aZ2 +x85l +s2*r +Z1$- +r^/ +i1Ro1J +^1$0 +Z2+8 +o0,@2 +'7o3 +T6o53 +p1o5z +p1'8 +oAu +Z2T0 +i32*81 +i5Vi22 +o7L} +$Z*80 +i1T +x81-9 +^q^n +*14Z2 +^s$b +^#i1k +i3& +z1i00 +i4f[ +[$k +Z1+B +x05s6 +z3o8h +c^@ +Z1i81 +oB2se6 +^O^M +i8/ ++3^d ++4i44 +sckx21 +o79t +dx31 +[R1 +*25o0B +$z$x +-0+7 +o3f*72 +o3Ic +i10i39 +$.*45 +x05'A +i4/[ +Z4x53 +saf +[i1d +$g$n +di7 +^h^r ++5$- +^-^j +-4$* +lx24 +^>o1j +$4k +'Ax61 +s._ +o88+9 +L7x52 +ss_ +so, +s.+ +^ix23 +u$" +x21*30 +[*12 +R3T7 ++5*53 +cslt +ss\l +o0J +iA2 +Z1o5- +z1+1 +i7u-8 +s1Kc +z1$ +$Cr +i93 +$)R0 +lx12 +^f*18 +-5x05 +T5} +*68-6 +spl +^Sx14 +D5$, ++6-7 +'2 +T6Z1 ++0^/ +$ti4C +*34l +ux21 +*27 +*65+3 +siR +}o0, +C$1 +x02$k +i63Z1 +o4r*10 +*64x72 +-6o5t +svb +o7g*98 +i0at +*05l +L7o6. +o4tZ3 +R4D1 +o6Q +$h$k +o3hp1 +{o7k +co56 +*83*47 +*67o7r +z2p1 +x24z5 +o7$s$b +$s$u +lo0c ++0x92 +p1o5f +sskp1 +-2*05 +$L +$cT0 +i3c'6 +[x21 +o6T +'9i8e ++1*06 +$k+0 +$?Z1 +$7@i +-0D7 +x06Z1 +$R +k'6 +R1o0e +o8Ml +z3o2- +ti7l +sjl +$7D2 +-2L3 +$+$5 +o0MD3 +D7$5 +x01^o +s4@ +s3c +i5xx32 +$| +$ ^8 +z3'A +$1*21 +*20o2. +^qp1 +Z1i8v +*63D3 +$5+5 +T4sau +}s0- +x24o2r +Z5x49 +T3o71 +D8o7t +i09^e +i58 +p3x34 +x35$ +z1sf* +*54l +$2Z2 +Z1srz +sBk +o5J +$ @1 +st@*41 +i0a^K +o64l +o12L0 +^,$, +^kx13 +$.+0 +^g'6 +i17$+ +o0P*23 +$d$4 +li1: +$/c +D6$g +^mx31 +i6Ec +*74+4 +o1l*13 +^7'9 +$+*56 ++4$a +i6-*78 +s80 +r^I +o1B*10 +i48 +o8rx71 +^G^M +*79-9 +scp +^<$ +ss% +^p^m +*50x32 +$v-5 +o4 x54 +o2lx31 +^Rz1 +l-4 +x02^% +i6w$y +-1C +i4l'8 +^$ ++7i7f +{i6W +o8U +o5_*24 +-7o6- +i0k$o +p1xB2 +'A+3 +o8L +^yL0 +T0sM +^di8d +'9o4h +Z4x84 +s2*Z2 +$0*85 +x92sA1 ++6x02 +x71$v +$1@s +sdxz2 +p4z5 +o0Lp1 +$e$n +-4x12 +x32i1e +lo2t +c$[ +s03 +o3g-5 +x28q +^iz1 +x12^3 +o4_o7s +^/ +s91 +o0R+4 +^gx31 +i4hD0 +o79c +c$N +$(Z1 +$&C +slj +^lc +z1x54 +i4&x03 +i0h^e +i6/ +s1#'8 +T2Z1 +D3-6 +*18o5g +o1s+0 +^i^m +x81-6 +oB+ +D3-1 +p2x93 +sdLu +oBu +i8Mx53 +o3/f ++6Z2 +sA x53 +x12$. +$0Z4 ++7o6_ +^zL1 +i4eZ3 +o6a@9 +$e$l +x45[ +p2x82 +s7c +cTA +$mt +D6o60 +D1^s +o0Md +L3} +^h$m +do5n +$+$# +D4D7 +o3w*32 +s, +^6t +uR0 +^1'9 +$P$E +{'9 +x32+2 +i56 +Z3-8 +^Wz1 +z3@k +^;^s +p1sbp +i2hl +*05-1 +^Px31 +^zi4_ +'8$Q +$,c +$ x0B +i40^k +'7Z3 +z2u +^Iu +s*< +c$3 +s0aRA +$ki8o +i64 +o1S +-7o14 +ko4 +i0,r +$-f +^{R0 +z2l +o5_@p +}$o +o13k +$( +R7 +$,x02 +*10c +Z3x96 +Z1{ +p1*98 +r[ +x42slL +s3q +'9-2 +o1Oc +i42sky +L7o07 +ssa +i77$3 +sek +^6z2 +o35 +s8M*02 +$7C +$a$p +o2 ^= +x41-0 +D2R1 +[$A +*23o3y +sbr +*87c +o3! +*89-7 +i3x +s4x^E +cR6 +o2; +i9b +$!C +i1m +i1c{ +$S$V +x02o2 +s9 k +s0| +o8k$e +se* +-6o7r ++0+0 +*76i7u +R4x04 +$!Z4 +i2:t +*05x02 +do0T +dx41 +L0o1. +D4p1 +o5iD4 +^t'7 +D3+0 +L0+1 +$u$8 +-1$; +Z1T5 +z2+6 +*98-7 +'7$s +-1-1 +*76+8 +T1T7 +oA3'B +^3^b +-6Z1 +'8^t +o68D8 +Z1D5 +^CT4 +*16o27 +t[ +o0N +i2@ +z3-2 +[Z5 +cs1, +*1A'A +{Z2 +o7U +^7} ++4Z1 +@aoB9 +D9-7 +shy +-8c +R1o07 +-0{ +-6i7d +${ +^1*50 +so# +$s^1 +D6LB +ci2/ +$_@0 +$r-8 +k^j ++1{ +Z4$4 +[D1 +ssf +i4n^k +xB2LB +xB2iBb +^ti5t +i8z'9 +x21^3 +x31$y +^di1s +x31r +*43$a +o1@-8 +s71 +x62^3 +i37c +$ *03 +x32*30 +i1a*40 +o8a+5 +sBF +o0^z1 +x21^L +^c} +*89} +iAt +-0i0c +p1o0w +-4'6 +i6A +*23*05 +^T +-7i4x ++4i4z +x12s2z +x17*20 +x51*75 +o62l +^Yo5d +cD7 +x51$6 +x17l +{scs +sB3 +'4Z5 +z1i14 +^Lz1 +^-z4 +$9Z5 +sb- +*61^ +*36c +x41$G +skh +$#$g +s@. +^Sz1 +^@*13 +dD6 +Z1@a +sr *65 +'9o6m +$9t +Z1-5 +csd1 +*35*54 +o2P +^a^n +x32k +D5o1a +i35q +x13$1 +[i31 +*46x05 +*47D4 +su[D3 +o6Oc +^7o2n +d-A +}^4 +$iq +z5z4 +$hl +i21^L +scw ++1i2g +se1D5 +^YT2 +$3Z3 +Z3i1o +lo63 +$2*52 +i1P{ +^,c +^s'A +$d$ +$eo9l +us94 +p1x13 +i7D +x82'A +$-C +$ s9a +D6i66 +$#r +ss, +x61o6 +^O+6 +Z1o6 +sa!r +i6mZ1 +-0^9 +$M$L +do5w +'4sc +z5x63 +*42R6 +i15 +$ ^: +-8l +R8R8 ++0z3 +$x{ +o32 +i2y*62 +[i5 +xB2$7 +*A6x26 +^j+1 +-2R1 +x06l +o0fD1 +p1x96 +p1o5d +si l +c'5 +R0l +$,$0 +p3x7B +$!x53 +sPN +o5ex61 +ci0M +i3_+5 +x14L0 +t-0 +i4F +oBo +-5$S +*67i65 +di6x +$nZ3 +rx51 +'7o6! +p1$i +'6z4 +Z3o14 +o77*A7 +lo7e +D7Z2 +-3i33 +o4io6! +i3ax02 +x03$6 +p1*67 +$*T5 +{+7 +i01'B +lo68 +*51+1 +i4ax52 +L0x51 +Z1oB0 +R7o6 +*14o1X +$x*31 +$wc +^_$6 +{o46 +o1zq +x0Bl +$$-7 +Z2o9m +to1y +-6x84 +i3ei2s +i83 +$s$ +o0Ik +x51i44 +^-D3 +*15$p +siB$V +$/t +*52o5B +so@x05 +x41^i +i0v*07 +D5o2_ +*71x01 +o85*75 +lx58 +o3_D4 +ssn +^b-3 +x43*05 +ci6R +'5*13 +o04L1 +^4sb1 +i5u*68 +$c$b +p1x8B +p1o5c +ci6$ +*20*03 +^:s( +*26^f ++5T4 +*9A@5 +ti11 +R5i5, +i0_l +^zx24 ++6$L +u+4 +*B8*A9 +i1uxA1 +dsrw +'9i8K +$7Z5 +lxA3 +*21^j +${L4 +$Fo1g +$dxA6 +p3DA +i7.*79 +do8o +x05$0 +s7W*74 +L0x31 +}o1a +$DZ1 +*53smb +ti62 +o8|Z2 +o9r$i +T2x02 +st# +shD^F +i60Z1 +z1o2N +$0i5k +i5_o9o +@a-3 +^d$ +kD2 +sc$+2 +'6$0 +-8o3b +D2o0l +x01x93 +z5*21 +z1^R +x83Z1 +o34l +slho10 +o3az5 +o6jD8 +*10oA9 +*20c +s16l +L2i3l +i0k+4 +sb, +*12o1j +Z2o4- +Z3o9r +i1/ +$ix12 +z1^p +-8*8A +qoA2 +[o2q +o6-Z2 ++0s@y +$mi7g +kL2 +'B$e +shr +$ $2 +$hL8 +$f$j +^psx- +'5o0d +^1-9 +x04*78 +sIEc +^m-7 +*82x06 +o0g+6 +^2D4 +i59*02 +o7&-3 +*62i0z +Z4x46 +i5*$* +p2D1 +$ -0 +*34o3r +R4Z3 +$ox15 +T0o2S +$5sk1 +{+9 +-5$3 +-2o3x +-1$8 +*56-6 +*7Ax64 +^t*34 +}*91 +'A$] +*57*93 +^[x15 +r^k +Z5@a +li4; +^6*07 +-9*98 +i16 +o4xp1 +$y^i +$$+6 +D4sg +*06s7A +li2% +$ax73 +*10o8# +i2f$# +[$9 +x64z3 +'9i45 +$5D8 +-9$% +^bo8* +^tx24 +i4Pc +o7,c +o7`L7 +sS/c +$0o0G +*09'6 +o91*18 +sPa^k +$^@j +sdf+8 +s+7 +i0e*21 +s58 +sjB +sfa'A +T7$0 +s7Qq +o59Z2 +T7$7 +o4t*45 ++4o0m +i21i6q +i6h'A +-3@8 +i8t-1 +'4$o +x28^z +Z1o54 ++5x04 ++9D3 +o7il +-4^j +sbs^j +ci4- +o6:@9 +L7i6d +to77 +'6D2 +^h} ++8*9A +*63+1 +ko65 +o72$e +qi0y +x14i1G +D2^f +z4x5A +o6sd +x65$/ +^P^4 +d*57 +x82+1 +sCs^! +'9i1t +-2x52 +ds2q ++6o77 +x57$ +*B3*B9 +i6p*28 +iBi +^,z1 +x14Z4 +'7+6 +D5*87 +^*$- +{*34 +i8Zc +Z2-3 +i85x53 +D7o7. +*60$3 +T3$" +i8uu +i4.t +sf6^c +iBrRA +$mx43 +k^8 +i1xz1 ++7o54 +spc +s- DA +-8-2 +s8z +slyx41 +sC +o9B +*04+4 +[i45 +*64o66 +i4ei52 +z1c ++4+1 +i7eR9 +x64$9 +$%$! +$0Z5 +D4o83 +$ p1 +ci61 +{i4J +lo0z +D2o6y +s2k$h +p1x23 +i05^! +x62p1 +D1*31 +^N$L +x01o4i +svt +$9Z3 +o4Fz3 +o1mo0e ++5x61 +x41f +ssw +sr$ +se ^Z +D4-B +Z4$9 +i0^z2 +*87sti +o2"u ++8$@ +x81$m +sjx ++6@d +R1+0 +x42i4e +s1! +o8Z*67 +o3d^z +x91Z1 +r*30 +z1'B +co90 +o7sshe ++8o7b +shRZ1 +^rD5 +Z2i7u +si2 +snyp1 +*71x03 +$3L0 +^dL1 +x56x01 +sph*91 +sDIx52 +z2+8 +i48L2 +co7+ +^g^h +^1s8x +$nk +'A$7 +*79'A +i3^^x +lp3 +ri7u +r^5 +o2j*60 +f$8 +*30-4 +*51x35 +x62^l +-7o6b +-8*76 +^,r +x05o1 +i8* +$b$. +s12oA0 +*97siu +i9r +$MZ2 +oAcx07 +^Lx19 +i5fx13 +$1i9 +}i0A +o15x24 +x82*86 +soIc +z3@j +o2n-4 +o0eo3l +*25+2 +o5 +6 +x36D1 +o3ix02 +x31Z3 +T0$D +^AoAa +D0i2j +x89l +i3gx43 +$f^f +D8^\ +$0x15 +s8g ++8$m +o1q +T8x02 +*20o5X +^"R6 +z4$e +o8zD7 ++1x28 +l*40 +'8i1. +sgl +x41'B +sbku +L1i27 +'5o3k +i6d-5 +^gx23 +o8- +$c$t +cx23 ++3^2 +Z2o73 +sDL +i5ri3= +i4w +T0$6 +srYu +x81sz +o7k*63 +o9ex72 +dseg +z2$k +i55r +*53x13 +i4i*64 +s0g +k$p +o5fZ3 +o4jx31 +oAp'B +*62o2s +Z4o93 +o5rz4 +*36'6 +$vD3 +*74sds +^1Z3 +Z3^3 +$a*16 +to7S +$_$? +*13s73 +T2i0I +Z3o5E +$M$* +o1s*84 +z1o6w +*69x92 +i6fl +sdj*29 +$b*34 +o5bi62 +i0u^c +s- D5 +o6SZ2 +*60-8 +o47 +$qz2 +xB2s24 +z1i5/ +o6pT1 +o7_T0 +@iZ5 +p2Z1 +$7*98 +$mx32 +s#,} +li3a +z2z4 +iAb +*80'6 +*98*85 +-8o9l +x34^p +z3sT7 +l@9 +x81$f +*A9x52 +$k^D +p1*57 +i3R +*78o4! +x52*78 +D3$X +to4T +s18*85 +*12$! +x6B[ +i4 [ +sa7o0b +p5z1 +$ *84 +*20o0l +o05z1 +z4*58 +xB2iB9 +$)o64 +o0M*13 +D2-6 +o51l +x7A[ +$n$b +sZs +*97o93 +^Xx31 +sbpi7t +^Ql +$r$F +t-8 +x36$ +xBA^4 +o6p+9 +*98@9 +o5aD6 +x71*56 +^_x13 +Cs4b +p1x53 +*56r +Z2o0_ +i7fc +sDF +o56o8s +L5T4 +i1h^d +x15$t +iAex72 +D7$0 +$b^a +*04i4t +p1o7h +{^k +sph +o8_*87 +sa9 +x64$0 +T3} +$4t +$3*74 +x42l +x93x41 ++0Z2 +x64l +$L*16 +^c*46 +i2g'B +x42'B +s05+8 +L7t +*35x12 +TBTA +x09L0 +*41x34 +*81o3@ +$o@1 +x42i4= +kx23 +*86o8s +c^( +k-3 +'4^8 +{o4_ +s0B +o3i*53 +*35^# +'B+0 +{-0 +syo +{R3 +i4]l +Z1o59 +^Fi0B +snh +ds5- +xB3x04 +*32^A +-4$! +o6n$y +^Po5d +s* '3 +x16r +Z3^J +^W*14 +Z2i7d +o2) +Z1^B +^: +k$; +@y{ +i6Si7h +o6n+3 +p3x01 +o3lD0 +^hx71 +*86i6; +smZ$e +x62+5 +p1*72 +}x14 +^.$? +$KZ1 +x34*13 +T5i0p +x05*41 +x71'B +DA$1 +co1V +*98+0 +L8s5s +L8x17 +@0l +ti2F +x93-7 +x23i2i +i8U +*23x03 +$oz4 +o0tq +o4D*78 +z3sis +*32*45 +x13R2 +smo +L7x07 +^7-3 +d$g +$6s19 +{i6L +i4&o7b +^si1j +@4{ +*68o6r +s8c*01 +x53o2e +o2Wc +$xx64 +Z1$c +o2A +x15*15 +x81$1 +i4N +i1&r +z2o1s +-1l +x04'3 +*56o5j +ksgd +Co1a +o7UR3 +D3R3 +s2M +o90*96 +x85x43 +sd5 +f*87 +*A1[ +*31o32 +o5eZ1 +'5f +l} +i2I +'8+0 +i1hp1 +o4> +tR1 +@oi1s +o0M*43 +-2i3l +$fo1e +o6u-5 +s0\ +i9u[ +}soi +o5G +lxBA +Z2o1n +fx18 +'7Z5 +o4Od +o36 +[$^ +@6*53 +o0Wskt +svz +rz2 +s79 +$KD3 +o0zx13 +-7o8! +$)^. +*34x51 +$2o62 +-1*91 +}$? +s-/ +$3$% +sAT +Z2$e +z2s4x +fx03 +'7x51 +xB2$0 +s3qp1 +*02*7A +z1o3_ +o9oxA3 +p1i7o +x24^g +TAs09 +s0^ +L8x35 +^['8 +*35+1 +sdc-0 +ts0e +$%$j +*35R4 +$3@o +o0Q$w +o4 $5 +'3p2 +'2o0- +z1^L +*03i3e +o4) +*45z1 +p1i49 +$vL5 +sGtx41 +$ +o3Yc +ki12 +s.z +$1xB2 +$Kc +p1i4m +p1s1+ +s8qZ1 +*21i50 +Z1sua +Z2s85 +-B$3 +-1$3 ++2o0z +LB@5 +o7T +o66$/ +*73 +o7#u +i68Z2 +T9*41 +$=T8 +uo95 +x51i6r +i6" +'8i6P +*46o54 +$HD3 +i4%u +$sxA1 +$8-7 +*05i1y +ux74 +$C-1 +o1_ ++B*9A +^r*67 +s,E$B +i4p*57 +i6(l +x61i2@ +$siAi +x25i3z +'6$l +$xx93 +$c^t +'Bo8f +o3xx42 ++5*60 +R3k +$o$x +i50$9 +*01o6! +o9uc +xB3LB +uo78 +i2h$3 +$t*13 +$/Z1 +o4 i4o +D2x45 +x96l +*32D7 +o1fp2 +-3+1 +Z1i93 +*20^1 +^w$w +i0Mx71 +x03^@ +*50x23 +x36z3 +^L$8 +-5o62 +D3l +'B$I +*63ssN +x72+1 +z1+3 +-1*12 +*14i2- +o2 sy? +o4S +^6$, +sx8*70 ++2*30 +@wd +i7r*8A +o2cx41 +^Cx32 ++9@s +x35+0 +oAv +^#^@ +sp= +-8o4b +$8x42 +D9+7 +L0^f +sij +o9dx63 +x35$n +^gu +x03-0 +^7$+ +iA--B +-6$z +*24R3 +p1x5A +*21i61 +o4/ +csL, +$gi0r +{i65 +t+4 +x29d +^!T4 +sx_ ++0x12 +^,^- +o51x13 +x31i67 +x42$% +siaxA1 +i65R5 +s%$ +cstC ++1o2b +o2ek +L2Z2 +x56Z1 +i5I +D5i4B +^+^a +se- ++5*54 +x21$g ++7i4/ +^Ki71 +*36*17 +$xD5 +Z3+5 +o4.Z3 +x63^2 +li0S +x62x02 +z1i1s +ksej +s-K +$S{ +o1L[ +sx, +o2Ju +*32i6_ +o2b*32 +ri6, +R0x24 +*30sdD +*62o6. +^mx24 +$uZ1 +s1^Z1 +o4 *B0 +$e+B +'9$' +$!$, +x04'8 +o3H +$Rx23 +xA2*97 +o32i3k +o9 Z1 +spck +cDA +f*9B +{T0 ++B@7 +Z2sQv +^Bs52 +Z2o8_ +o6/$5 +z1$, +o2tZ3 +i99*86 +'8d +ssuz2 +*52$3 +o2E +x02z5 +D2-4 +*15*23 +^*R1 +s6Wc +D9L7 +sai +^nstk +'3d +R8 +^i^g +-1z3 +Z5x05 +@1o8! +D1Z4 +Z4x02 +$st +o1ai2s +oAuLA +$_$t +-1s9s +fx74 +s0^Z1 +Z1$7 +*46^P +x51i3q +o4oc +$?L8 ++2*02 ++A*8A +o70$9 +$E+4 +*04l +'7^@ +i5wx72 +$5[ +*27o2n +$f$1 +*90x26 +oAsx42 +-6L6 +o6^Z1 +to8% +-8o66 +}$P +*76o6a +s1l +-9-4 +i7j +*84o84 +c} +swbZ1 +@Do7} +$gx52 +^e+3 +$?x45 +^_k +$O*86 +*02+9 +rx15 +svp +i4r*49 +iALoBP +x04^q +i3H +i3!*93 +o77*10 +sd` +sjH +o0gp2 +$A$Y +o81scw +Z4o6a +u*56 +^2o42 +ssbk +^r+A +o3/x45 +i58x23 +'5z4 +x32o2x +oAOc +x43*43 +p1sl7 +i97$5 +^dx13 +c^8 +*78x53 +*03o0h +o2m^d +^M$D +lo4b +$8*A5 +o81*63 +o3oi3k +$1-7 +sa^ +*32$k +x41[ +'B*52 +di4* +i2isJp +xA3l +-1o7m +fx3A +x59$H +x53sln +o9u +^pZ2 +z1Z4 +o58'7 +svy +'7$t +x0AR0 +o4< +o6t-5 +$,x93 +o47d +z2@a +}s7. +o6oC +o1wz1 +x34z4 +i6\ +Z1i2c +*30f +Co3d +*24o31 +o23 +i2O +^%z2 +*31*74 +^io4_ +i7p*70 +i4%+6 ++0o4o +-8R7 +$eo0d +c*21 +x72-5 +*47T4 +*30x32 +*B9x65 +^#^+ +li7k +Z1*31 +[i4l +x24$r +sn.{ +$k$4 +o7.-2 +slT +$2-9 +*30o82 +xB3[ +D1$1 +*28x05 +s.b +Z1$b +iBax74 +x51^2 +i7X'B +$+Z2 +co50 +sbJ +*BAx02 +o1ox25 +ks2c +D1'7 +o4c*67 +D3R2 +x64-6 +i9i'A +x81o5+ +ssFT3 +o0s+6 +^?$, +o8vD7 +*64*57 +[sLe +sm` +x64x32 +R6[ +o65x81 +$Lx12 +i5 +6 +o24$# +lo0C +i2: +Z4$_ +[i5: +T0L3 +ti8u +o2k*01 +t$V +tsUR +Z1R1 +^zi8" +o5wsct +^dx31 +$5x21 +i4@@7 +o3e'B +^1z4 +i1-d +o3t+6 +L5-5 +@3o8, +^cD3 +x17q +to2T +*97*21 +$ld +$B$e +*54o3l +*72o7r +^7^3 +sn8 ++5D1 +[-A +s9d*13 +Z1i4] +stL +i7wl +-1L8 +^<-1 +o6Bx32 +c+A +^[i1v +^"^\ +x32L4 +o0*z5 +kssy +ss=u +o19[ +i47D7 +s23d +o4K[ +i4li8h +$1xA5 +i5el +i7cc +DBx64 +-7i4; +s; +^7-2 +l*5B +o0ai93 +f$f +$l^b +x27$i +D2i7i +s., +x04i6_ +o0i+1 +-6T2 +i5i+7 +o6q +-6*70 +o5-'8 +Z1i2v +i3zi5& +o0_'2 +o7QZ1 +T4sIs +^@x71 +rk +'B*35 +skgo4 +loAf +o67l +'8$N +s13Z1 +x62$n +'A$ +o3R +$!$3 +x81$9 +t} +T6'9 +s1k +x48p1 +cx24 +oAr +*39o58 +i5s*10 +o8jD7 +*86x14 +$&o67 +-Ao93 +T4o0H +-8oB3 +o80+7 +o5Wt +x12sx. +li6: +x42$ +z1i8t +'9$M +$lZ2 +i8x +Cs04 +*30[ +^e'8 +soa[ +o1-o0B +{x03 +$6L1 +uo5L +$;$; +-2o7* +*17+7 +o79Z1 +o0Zz2 +*36^- +*57$% +^ip1 +o1sd ++2oAs +$tsbL +$$x61 +D5*12 +*15+3 +$&c +sm7z4 +^t*65 +*41 +-0^= +[i5- +*41D1 +x51o3L +csb1 +@r$g +*A6x42 +*A6i2m +p3'9 +o5 D3 +L1$d +i0_s87 +o0/z1 +i69{ +i34+8 +se2 +$&i0@ +Z2sg. +o8#D9 +Z5i5f +*85*63 +R9^G +o6c[ +^@T6 +i5#l +$Tz1 +o1Iu +C+6 +$`o0h +^mi3- +i2vx01 ++0*31 +o4F +i18r +c*75 +R6i74 +sBtf +o5+ +i2D-4 +x02'4 +$2o9 +^t^u +T5x13 +p2x79 +sztd +^kx46 +'9-4 ++5-4 +^6'8 +T9i9_ +$a$3 +*65@5 +sjfx37 +$@*68 +$e[ +^8^i +o0z} +^-x92 +$%x81 +Z1o7e +x42^I +*16$R +s5w +p3$9 +ui4C +$vL6 +^kz4 +x2Al +}$O +x98Z1 +cx52 +ti9, +$7k +i6Xt +Z2*45 +slM +sdF +sjV +o2z$ +^"$" +s60 +}@D +$5T6 +-Ax01 +z5'8 +$6*9B +^a'B +^Y*32 +^D +D6s2; +^H^C +$I$! +*08 +x86x52 +i12i0f +p1snd +L1x35 +-8Z2 +@n} +^P*42 +i4@o3n +s2z +to5 +$-@j +*12*68 ++6$& +z5x18 +x71c +*18l +ux31 +T4T5 +*56se2 +'9$2 +i4+*47 +x12q +$oT0 +sv? +[i1y +*79-8 +d$p +sv3c ++0'B +D6o3@ +*0A-0 +'8$@ +i5MT4 +ci69 +o39*71 +sn2Z3 +*73x21 +$4DA +i5| +skm-5 +o1nl +x35-1 +to0Y +q$e +o2u$# +i3t^r +^ho5. +o7E +o2o^@ +o0t*91 +'8R2 +-0z1 +p3x06 +o58p1 +cs0I +{$0 +x12L1 +r+8 +o9!x61 +sp z2 +i80sdz +*12^k +o9d$6 +ds0f +L6x06 +-7-3 +*8At +$r^p +$#x42 +$UT4 +-1R0 +o6N +sz7 +^M +x42[ +i3I +-8$% +o3@D4 +*54+0 +kss[ +o4K@h +p1sMw +i8= +{^C +i6M +x06$1 +*49x53 +*63slp +o5= +x24$7 +o6w+7 +p3i4, +^mx15 +o70$k +^!x71 +i3q +^t-2 +o0=r +x15o0j +o10p1 +D2o0D +$q*02 +i4Yu +T2*03 +i3* +[o3c +i3Si4& +*34sm_ +uo7I +^b*24 +$7o0Z +i9Tl +i70t +o6Fo8s +saQc +o2{ +$7x54 +st8 +$1*41 +p1z1 +*27*76 +x78l +*53xB2 +o3Wx5A +$8*68 +x1B +D4^p +D1o2c +c-3 +z4o6= +sqdo1l +Z2i88 +s3^ +[szp +slv +sgq +*14c +'5o2k +lo3_ +x53*96 +p1i4` +o2_*06 +o2` +x91oBz +i31x91 +$_x75 +si2Z1 +[o2d +s2ao1f +o0ML1 +{o0q +$6T3 +*56'7 +{i1d +fx36 +$3i6@ +sg o3l +i4 D6 +smg +o62*56 +x61*64 +i3p^a +p3x28 +x07$1 +o3pc +o8cC +qx29 +^dD4 ++8D4 +o82x21 +x03p3 +^e$7 +lss& +-2o3j +o7A +*63T2 +^8$9 +z1^x +o4@$! +@,^v +$msh= +*43x53 +x04z2 +o1p^c +-0*31 +$4x23 +o4lo1k +li51 +sfy$o +rp2 +*61^R +RBZ1 +*36o3g +z1$3 +o2px35 +*56s40 +Z2+4 +x72Z5 +R5Z2 +i5xl +T4+4 +o9E +-0^& +*16i5a +suo+5 +o52l +x53Z2 +iBTk ++6$p +o7ex43 +x26^t +x37l +xB1Z2 +-5x02 +'Ac +o1si0g +o5}s}$ +s4+Z3 +sAjd +x73x84 +dsCf +$(c ++1@a +x82$: +*35o7A +o5l+3 +o0ro2k +Z2RA +s8,o33 +x56l +i2/i5/ +*05o00 +$x*71 +o62T5 +i56i55 +o7?*75 +fx85 +x53t +$@o58 +i7ix34 +'B+1 +o3i*B3 +*32+5 +o1k$! +*64x61 +'B$6 +rz3 +seAd +^n^t +s7+ +o09*13 +-5T0 +i40c +$@Z2 +fx37 +$Du +sngi3t +R7x41 +*98o7 +i4@r +ti3p +o6lz4 +i2` +x83sa1 +$^@m +i3/+4 +{^R +^%D2 +o05$ +i3to7n +si& +^po1k +*07*18 +o0r^b +*56$3 +z2@A +x16^D +s2_^g +^K^T +Z2o3 +o5d'9 +'2o0< +i47o1g +*40x24 +sI? +x45R0 +*65-5 +Z3} +x28x0B +o4m+0 +@r'5 +Z4$e +sps +Z2s1t +uo83 +qD1 +i4hsfK +-9L9 +s70 +o2yk +T4-6 +ks3H +t^d +'3R2 +D3o1h +o2gD3 +i8ol +o6ix12 +s83o1f +{o7= +'4s0 +Z1$9 +s6$[ +i3@ +$KsbC +c*14 +-7oAD +${L5 +*52^p +o5tZ1 +Z2i78 +x07R4 +$mxA4 ++2o1b +^8i4d +r^s +$Bo3z +x52d +o5ux61 +T7R7 +@2oB9 +x24R0 +$m+4 +@np1 +x19r +i8a*18 +^o*58 +o3k^z +R5st3 +T0se4 +fDB +she +^bx35 +*75o87 +T8T4 +svYT2 +$>@n +i3%r +^kx32 +x61+5 +ls/, +@a*03 +TAZ1 +'Bo6? +o11$/ +shVo6m +ss0Z2 +Z4'8 +R9[ +T6$9 +saU +d+A +i9jxA3 +x01@k +Z4xA5 +x85o1g +x05sL +sct +o9s+3 +o4ed +x02i2l +$3$2 +^oL0 +Cs8M +-0i2n +o41x02 +x82-1 +*03o3w +o5*^o ++4D3 +^zx23 +x36+3 +CZ2 +i79 +*68o0k +smsD5 +$GD5 +{*37 +-7^3 +o6yl +us1c +i43 +^sx52 +z3x01 +^#x75 +x52$G +-3*45 +${L8 +^:c +T8$1 +*03$ +*40*73 +L7D9 +$B$G +['6 +slS +o1m*65 +xA1i2k +i9#+0 +x21o0y +o5kz4 +sdb +^v*31 +i3s-1 +z4-3 +$)x0A +x51T3 +Z1i1l +$&^$ +suz$s +ki2n +x41p2 +R4i45 +'9x61 +lo1i +o6S@c ++0$$ +lshj +o4cc +-B-9 +o1-'8 +ci7. +$d@p +c$R +$AT2 +^Sz3 +x25 +x52^O +R1'4 +^6-1 +r$! +x03$5 +i3;'8 +'B$m +i17 +cz2 +x24Z5 +o1-*74 +-0i7s +*78'9 +*91o1a +si! +i8@+A +R3*72 +slnx43 +o0LL1 +o2vd +{x12 +$nxB4 +sk@ +i41*04 +*9Ao9J +-5+4 +$it +o6@'8 +^KT2 +Z3o0 +x04$v +*40$s +D5D7 +^Ti0P +o6b$m +ls6- +^ex31 +'4o0> +^DiA! +sb1 +dsP ++7-1 +R0o1r +o1do3? +Z3i7x +*0Bl +ssop1 +lo2a +oBlD8 +$@o5# +x31o0Y +Z5*27 +^b-2 +x31o8r +*64x53 +@Rz1 ++6i7u +^x +T4st5 +p1x49 +iB0 +$,$5 +i5-D2 +p1oB2 +$D^S +x03^L +*06*67 +D0s30 +c$f +i20{ +o6*Z1 +x91[ +x34Z1 +$6*05 +D6*23 +Z5i4i +d*64 +[s07 +$k[ +D1sds +i9x-A +i0k^g +Z3k +*B7 +i38*49 +$!*74 +D4Z1 +oB2D9 +i4:c +D2$` +o2fi45 +lL0 +^Wz2 +o6_sfx +-5o8* +-0T7 +R4Z4 +*32D6 +*94'8 +^CscK +-1@2 +$nZ2 +*13o2- +^u*31 +shs +$XL8 +$$i21 +x53R1 +do2U +o4at ++Ai81 +^P*92 +swx +ss* ++0@z +^Z$" +$kR7 +*8AoB3 +x62o3t +$!*25 +lo1b +i8$ +*12R3 +i3Dc +T7-0 +i3bk +o0r^E +r$r +'6^a +x72*13 +o7s*A5 +$p$0 +$sx64 +o63d +$_$0 +i4o+8 +x52$9 +*01*83 +o1wq +o14-9 +@h[ +*48x43 +$,*74 +p1R9 +Z4o2h +D2s3- +^7*27 +*02o3a +s0. +x56$/ +^R +Z5*20 +i8v*68 +o34^M +i2T[ +^Nz1 +o0ko1. +s* *A0 +s38c +ci8r +sHl +$mo2r +x12sna +$MZ1 +R0i1e +*63o4h +R7o0K +to3" +sthD0 +^y} +C@6 +$AD6 +x24+2 +*80x47 +x63scH +x83o6h +^(D1 +l*39 +seu +T8T3 +s56 +*06R7 +cspv +$6Z3 +o7si6t ++9x71 +o3, +^p*B5 +tx93 +o2Mo85 +f{ +$#*97 +L1[ +-Bsae +o0WD2 +s5 Z5 +@1c +D5x04 +D3i4k +sku +D1Z1 +*06R0 +co77 +x07-1 +sy! +t$* +skC*98 +^$*02 +ss3 +$"i7" +D9x32 +f*24 +L2^b +i4di2N ++BDB +i1r$ +L9[ +Z2o8s +$x-6 +sac*18 +D5i2! +ss]sy +Z4o1i +^g$t +$eo5% +o2C +oBm +s9az2 +o2 T0 +*7A'A +T3x43 +i16o21 +x21o2? +x2A$_ +csaw +i1Hc +$1i7? +^4} +x12c +sckz1 +k^s +x12^E +$]i6: +sa=$5 +f*31 +T0i85 +i3\ +Z1*68 +*40i8j +z3i5} +i5:+5 +Z3o5i +$bZ3 +*31'A +sw7 +$0-B ++3$4 +x06{ +-3o4. +*06'6 +dsbh +i1y*25 +*89D5 +i3ii0Y +iAh +*91oA7 +$jr +^M-1 +^x^= +z5*8A +$sZ2 +o0bl +to8J +@2$ +*76$o +z1'A +o48*78 +u^M +-3T6 +C$5 +z3r +$0x12 +i0m*02 +D5u +^= +xA1o1a +x32Z5 +o0vx41 +T1r +-2R6 +x02$g +R8Z4 +o7s+2 +$3+2 +k^J +o3l^, +D2-5 ++9o8i +uxA3 +x42o3D +st) +o2l-8 +sCL-6 +s@c +o84+6 +o2gi4k +iAmx02 +$yi20 +$d*19 +s9, +^ci3t +L5$n +o2 sh\ +spM +*34o3h +oA/ +i1`*91 +cso* +s8^ +*96sdr +i3S +Z2C +$dD6 +i5cd +x62$w +i7.o99 +dx16 +*50x16 +*73o0d +$s-8 +@6i9! +@5-B +sDw$e +R3t +@0+9 +T0s.% +$OZ1 +i76+9 +o6X +$9z1 +o6#x51 +*8Ao0W +$ *35 +D7x12 +-3sTB +x01o4x +-6^k +x04x49 +s0+c +D7$1 +$D$E +*83x81 +x35 +x41*78 +[o7i +Z1*57 +D0i4o +-3-B +lD9 +o0d$z +'7q +^Gz1 +*12$ +-0x13 +o5io6n +*A6l +$p*73 +^Ho6O +-1$q +sWC +Z4-2 +sxk +^2^0 +o7tx32 +i4_x53 ++4x54 +$t*86 +^x*20 +*58D7 +p1svg +i8zx52 +i5p^; +qxB3 +x24o21 +*01^0 +$?Z4 +$P$# +x07$n +*97x07 +$4sr1 +^zi8z +$=x02 +*67i6; +stE +o5vT0 +i6-Z1 +o60*98 +si: +sBO +^`^k +i55u +o91*74 +$W +ci3H +o5aZ1 +@2+9 +i4v +o0ei1s +$vZ3 +i57D8 +oB_x26 +-3+6 +^1Z4 +D0o4e +Z1i3| +$aDA +u^$ +p1suk +o8Sc +c*86 ++7i8, +-2o0d +*87Z1 +}+9 +^ r +-1o08 +^u*71 +s3gx32 +$?-7 +i3nc +t+6 +*98o1d +-9-8 +s1a +dskz +xA3$f +o2e*89 +'6$p +$9*04 +*43*47 +o8<*78 +x82R7 +'8i2d +sor{ +xB7Z2 +o0sl +^P +*A1i2+ +*57o7a +x51$; +*65$n +x14i4+ +-6-9 +xA1oA6 +i7Lc +[*72 +'Bx51 +s0b +*89Z1 +}'9 +z1o2_ +i7/ +^a^h +'7} +koA7 +s6o$7 +$!$) +R8$1 +*97-8 +ui54 +i2no1+ +*01soi +sSF +*32i1u +^Y +o1Jt +x39$ +o4v'6 +p4z2 +saqZ2 +o6i[ +C^X +o5? +i4u+2 ++1'2 +$1DA +*83+3 +'9i8, +o0M'9 +o4x-9 +x26z5 +DA*BA +^Ez2 +o1;x32 +$ri7t +o0p*59 +*32o3h +sIiT7 +'2o0, +i95oA@ +*6Bx84 +$(R8 +i5px12 +*3Ax24 +o8v +}^P +DA$+ +$n@0 +'5+4 +o9xsmt +x83$# ++6*60 ++1$t +D7o8z +x63i4s +DBo9y +D6o5_ +i6V +f^9 +o5Zc +i0:x32 +i0h*67 +oByx38 +'8i4_ +[st +o5q*40 +$Tx03 +i3KT0 +s4oZ2 +c*68 +*52+1 +$+x94 +^FT7 +[$v +'7$e +^gD4 +i6 +8 +^w^M +o7.[ +sW7z5 +x93c +'6^G +o4pk +*69o67 +C$X +'5^b +*31@3 +i71x25 +o44+1 +o0p+3 +p4x03 +s34 +^gx52 +p2DB +o0EC +$-*17 +Co6& +i04 +sAo +^.^: +Z2s1z +^$$1 +i3z*56 +T6D1 +$3D2 +oAD +u@A +o1.'9 +sBr +o6eu +D0i1h +$4q +i1#$h +i65-8 +iAy +T7*06 +^/z4 +*02Z2 +o72Z2 +o2Tx74 +$ux34 +Z2$4 +*67*85 +t$X +*07R7 +lxB9 +Z1iA^ +'6i4g +o5_u +L8*08 +iBu +}L0 +^zx42 ++2z1 +i2p +su_ +x91x06 +x04Z2 +i39 +^jx21 +rsJ! +o9$ +D4o4/ +*53^& +x62Z2 +i8mD0 +kR9 +cst` +p1i5y +o8d} +^ d +saz +p1*03 +k$e +i4id +Z4$r +o4Kl +*4A +x63R6 +x71*53 +k*07 +x92*98 +Z1o8j +x38 +$G$A +$px92 +'7$n +o52c +o3sc +$3$k +x52L4 +c^G +*B0'8 +s - +$cx73 +r$] +D7skt +T8o5l +t^q +sIR +x51z1 +*01^v +i1Z +Z2o8n +s6_T0 +D3sVF +}x37 +^ho23 ++7$g +'5o4d +*A9oAy +i2 ^k +L0Z1 +o28z1 +i2D +*34} +x53$H +@ML4 +$xxA7 +*43*48 +i52-2 +s8Wl +x87x21 +*09*91 ++8x08 +*18x75 +o28*12 +-0z4 +o1md +x64i6< +sra +*83D5 +$6i8t +s1_ +Z1i6/ +$1^z +R3s1j +R5s1n +i9Ec +cs2* +*03*41 +^s-3 +o5V +doBt +-6-2 +o0D$ +*17x42 +$%+8 +i5D +sj-{ +T8D2 +D0$t +sB } +i5/T6 +x01$p +T6$ +z2i1o +x51*68 +p1LB +x63Z3 +ci4b +s2 +}xA3 +p2x73 +^m^W +str +sze +p3x04 +sb6 +C*9A +Z3{ +i6( +i3Ll ++AD4 +o87+0 +i41$2 +$t+9 +@io4e +^mx32 +T0d ++4*23 +i0w*30 +sl2 +Z4sj! +Z4i4, +D5i72 +*74x31 +s5* +D3o0S +^3x14 +L7*13 +}$r +$1*28 +tR9 +i3wp1 +o45Z3 +o1xu +$8^b +'Ao7l +$x@c +$/x75 +$1^I +z3o0f +}@b +D8$b +o3j*62 +*70s+' +$[L5 +i54-8 +x05$/ +so; +x62i6a +LBiB3 +i0OD3 +*05Z1 +p1*91 +^c*30 +x75Z2 +[i1P +i5; +Z2o2y +x41x61 +xB7Z5 +L5d +o5yu +}-0 +Z4Z2 +o2l*42 +o97[ +o4s-0 +o4f*04 +o1.p1 +x21i81 +$t$ +x54T5 +c+4 +x62*01 +i3i$x +syV +sa.x41 +ci0- +^1z2 +o29 +'7^< +$s-1 +^Oz2 +do3h +$m+6 +[i2a +se_ +ds1h +R8o7x +sfjz5 +-1*90 +$t*57 +s4 +3 +i1K +z1o2% +-1i82 +L6D5 +*41o82 +z5*60 +R3L4 +to7! +*76x41 +-B*B0 +tx71 +$3$* +*58D4 +i2a-9 +i3hZ3 +doBm +o0A^Q +s +[ +i3w*54 +x52$n +Z1i5! +$to6k +-3$4 +*A9s05 +Z3*54 +o71r +Z1*59 +*B4'7 +z4-7 +ssk +Co1i +$Ko5B +^l^r +D6i6= +i2eC +o8a+9 +R3+6 +$mx72 +i3jk +tD3 +x57$0 +o5ri2 +o1z^j +^8t +*04*73 +sul +$*@5 +-1*43 +C^0 +o8-Z1 +o77k +T0s. ++4o3g +o8z} +i3? +^ax61 +ci1i +x52Z1 +*9A$3 +^H^R +CT9 +-3o97 +Z5xB7 +sef +z3o8 +*94x06 +s19Z1 +*53$L +{$9 +p1*17 +i40D6 +-2f +'5$2 +x45{ +p1o1a +i2t'9 +x93i9e +swfx94 +s09x81 +[o0F +D2^N +o03-1 +^k*78 +o6&$2 +o5k*42 +sGj +CssN +x13p2 +i4z*64 +oB5*AB +i5ox23 +x51i2T +i5r@4 +sd7d +*84$# +^1l +oB[x12 +i27i0H +p3D0 +$%^g +i80[ +o5W[ +sa@c +saux43 +DBsbl +o5F +'AT9 +ti03 +^$o1p +D4+3 +*46{ +z3'8 +D4T1 +i59x02 +-7*76 +^3^7 ++2i2d +'7$J +x81s21 +{^9 +ti3L +f$9 +x38^s +@o +i5g{ +d*68 +*5Ax06 +T0*43 +-2$4 +sHa +*76o6g +x62@U +i4g$# +*06T4 +'3$L +^o-3 +o7ft +$kC +sof +stBscl +D6*05 +ki7d +x54^[ +Z1o3n +*08'5 +i0Px83 +-6sS +@8^3 +x42'6 +R2r ++B$f +D7o1h +*54i6t +qi01 +do0t +*60o3R +'9^k +x12l +o3dsmF +$.Z3 +r*57 +Z1i6f +x05z2 +x71s2x +o6ci6P +s06 +^a*20 +$Xx62 +z1} +L3R3 +t$. +d$n +$@L6 +'9o2l +^L-1 +o6#Z1 +^B$. +o5; ++7^o +L7@v +$4*85 +T3i6m +}+5 +*04*17 +Z1*75 +x14sa? +x02x35 ++0@t +x05^_ +o85o7y +$r+6 +^Bu +'9x06 +sl4Z5 +k*54 +o2D} +iA7o95 +^i^s +^1o3w +s41 +x62-8 +'A$e +@d*96 +u'B +kr +*97c +l*B9 +lssi +s39DB +*81d +-1*21 +Co2( +^g@a +o7L +*41x21 +s7^ +'8i02 +i3# +$h*37 +s9w +*7A +^M+1 +$aoB8 +*42^w +^a^V +-7o5g +'7sat +i4i+5 +o1E +Z2oB5 +s5=x42 +o73*36 +Z2sxn +$-Z1 +sdt^v +p1o7i +*76x52 +o5r'8 +}o0b +sn+ +i5y^C +i5W +s3F ++9sif +o6Wx83 +$nl +p2x8A +T0+0 +Z2R1 +lx63 +*37*87 +i0yz1 +o4lu +*06i2, +z3o1c +sid*91 +x94*31 +@p$* +i2oZ2 ++2^8 +su +ssyx32 +dx74 +ko0k +*46D4 +*B7o3a +D9r +o0?^! +z5$; +x02i2^ +oAn-1 +Z2x13 +s31o77 +$6$m +$.^= +smO'5 +D5*65 +$p*86 +*84 +$g$N +$G*75 +^@x15 +*03sjx +i80k +^li9n +x72^2 +skB +p1x08 +oBk +D2o6B +i2El +o6%x83 +i32$% ++3o4i +i2sx02 +[o2t +skp +$>Z3 +$9xA2 +o5.*45 +x61$p +$uD9 +x41sku +^mo3n +^f^0 +o6R +p2i60 +Z1i21 +D4o13 +'9o4j +o6 x72 +*02$i +^&$; +*ABoAz +o5CT6 +x01L3 +s3u +x67+7 +sm3*24 +*3A'8 +[*09 +s1w-9 +^7*09 +x85*67 +^t+1 +xB3$6 +x64$! +T4$3 +rstk +-5o6= +'5o0m +o3_Z1 +^7q +$b$l +^2o1Z +$%$f +li15 +{T3 +^Tz1 +slt*50 ++8iB9 +'7*30 +x92i20 +*61-4 +$1@y +i5-D0 +-3-0 +x17u +^7z5 +-Ai82 +x02z2 +*57$n +i0n'A +s5.x23 +i3a[ +ssW +T8i4 +Z3o6@ +sgwp1 +x72sa1 +*45*01 +{x92 +-Bs21 +^1o1f +$*^k +i7sR8 +D6$7 +o7MD8 +$ko78 +@v +o69^n +D6x31 +^Wi5j +o7@*97 +x15z3 +-6*85 +^A+1 +svd +x43+2 +o09*54 +skL-6 +ti5y +^FD3 +[*02 +x91o8_ +i4\ +[$a ++Bs7a +$s+4 +i3f-4 +$gx73 +z2i3p +^m-4 +sC6t ++4*86 +^g^w +i7K +i9Sl +@e +p1o6d +*20s9! +o4Ct +*90L0 +-4x82 +x27d +o9y-5 +sysZ3 +}*63 +oBs +sx[ +^Md +i6zo5s +sle +Z2o1- +f+6 +sa2k +z4L5 +o4Lu +R1$7 +x81*78 +*32p1 +o3ct +T5*31 +-5*97 +z1@b +uR5 +i4/x12 +o3S +o7ho8i +o7j{ +$w[ +^@*62 +Z5x52 +x71*86 +*54$ +$7*87 +i5ei8i +^{x06 +L9 +D3d +sHn +$h$z +sakD6 +-1^0 +o0Y$r +x03R1 +qx83 +snm +@-$a +*25*54 +x59*16 +i93-1 +[i1Z +i7ux84 ++8+7 +[sez +$x^! +$j*A4 +*5Ax73 +*A1x07 +'7u +^p@m +oB8Z1 +D4-7 +o48Z4 +o71o1t +'4c +D6$m ++5o79 +sS^l ++5o9y +*03i1r +sCM*68 +kd +Z1sb+ +x13$. +*79i9n +i0g@C +*14z5 +s9! +@j[ +z1f +o2;*31 +$aswc +*07x58 +Z4s93 +o1@*21 +$ x26 +$Kt +'9T4 +s @ +s97*67 +i3Q +i5w*57 +shvx46 +*41^v +o9ko8d +$vp1 +x84l +sv0$! +*A2x76 +$W$8 +o0['2 +x06*20 +o8c[ +@nsC8 +$0o87 +*89o7p +Z2o0K +^Io4m +*73x31 +o2t$e +o6n$4 +xB1-B +snz'7 +o7?-8 +'7+5 +$J*80 +x32o3@ +T2r +L7x82 +{$` +$,o0H +D3o9c +sfs +-7$v +l*74 +C*61 +uxA1 +^pu +dsgr +-0D1 +$no9e +o4q[ +i7_D2 +^7Z3 +x51'9 +x42$o +$ x19 +^%z5 +$3r +@g$ +o0a^f +R6ss8 +i1t-0 +D0x56 ++0o4i +x89i1g +T5[ +qi24 +o2rc +$zxA2 +[$s +i2LC +z2@2 +$5x91 +-0x56 +$7Z2 +oBoD6 +kZ3 +i1i*13 +o0ZZ1 +sl$ +-5Z4 +dsh@ +^!i78 +o0gZ2 +L0} +z2o10 +o6#Z2 +i4cd +^7$h +lL7 +^1o4C +sCyc +o4Xp1 +^a^8 +@dD8 +i8WC +$ @f +skyc +$gi9u +o1eZ5 +-8D7 +sej+7 +*54D7 +R7T4 +o0Mo2N +$ax31 +-9x25 +TAT0 +*20x41 +x94x81 +i71+8 +to06 +^|l +T1[ +^.^, +dl +o6ax42 +x61$| +L5Z3 +Z2DB +i2k[ ++0i2j +o4p} +i31p1 +kz3 +i5ex23 +'2$ +s7} +L7o6h +sa/ +p2o0l +o5Tx72 +x06x32 +i6Yt +s@+ +*37$A +o0f$1 +$U*37 +'6^j +$;x02 +s2L +R0^9 +$qL7 +T4o8o +L1o2n +@9*A9 +i90c +i2! +s1!Z2 ++1i1u +*A8x35 +tx91 +p4x94 +s#+ +i2/ +x27*A9 +o1tp1 +LB@2 +D0i1V +*13sc2 +D5*46 +DBx05 +R9Z5 +*63$j +u$o +-8o6b ++6s57 +i6Psf6 +s8 +^T^Q +-1^i +i8c*57 +o8e'9 +x61o68 +s58+8 +*35*24 +^!*40 +T3Z2 +*18x62 ++4x62 +sa+ +o5u[ +$;*01 +sdc^B +$2z4 +-3sCg +i7_c +$3^d +o6= +*28c +*52 +*65'9 +i9P +o13Z1 +*B9o2o +$.x05 +s28T0 +p2D3 +D2'A +o1ai4- +L3-5 +*B2x89 +i3m+2 +o2rZ3 +o7kr +$m^+ +z1^ +s4n^M +o71$7 +^3o2x ++7xA2 +^Iz2 +sdbx31 +i1,i2. +*49$2 +z1iA1 +p2x95 +k$q +co32 +'3s.` +[o0q +i47*47 +sdXr +$#+7 ++1'A +p1o5y +s54 +o3h[ +o5-1 +^w*53 ++1Z2 +x04$3 +i5# +o0_ +x14{ +sb^ +'BT7 +i0sp1 +o9; +$5*57 +*03*36 +$!+4 +*43*12 +$j[ +ci6C +$,D8 +D0oB2 +$9r +s27 +sim +$f*96 +T4T3 +'6^w +*58$. +^hZ1 +s1q +ko29 +x24o4 +-5*46 +$D$I +i3q{ +i5eZ1 +R0^s +i1:} +sgjL5 +*12p1 +o3t^s +sxa +o3Cl +i53*81 +o64i3r +x03x94 +i5f*03 +D1i5+ +o5{ +^1c +o2r$. +i4T +o55Z5 +i6nc +$6^6 +$8x63 +oA1+9 +R1$0 +x83c +Co4b +o2R +i2d-1 +^k+4 +[$b +x42^D +-9$! +*63o1l +o0rx24 +x05c +s2t +s9 D4 +*54x12 +f@6 +sfd +i76D5 +i4cl +o97^! +s5bL0 +i5-$3 +i2G +i7]} +[i1# +i1q{ +@m*AB +i83-7 +Z4*A8 +^s-1 +*BAc +-1*27 +x73o8! +RA$0 +$6*B9 +@uo53 +z1$T +i1d*65 +@l'9 +p1xA7 +$f*91 +x31$8 +si+ ++3o0d +ser*26 +z2*65 +o2 ^? +-8^1 +sui*23 +oAak +x91s92 +se. +*36*28 +r@e +x02o1. +D2Z4 +o5& +$eL8 +$Ox53 +$+@3 +*3Bl +ksd3 +*A0T2 +o0$*54 ++1+2 +$A$a +x62se< +x23o36 +to1B +T0+1 +i9/D8 +i60*62 +o4X ++8*70 +T5o4} +u*63 +i4fp1 +se9 +i0/i1) +o5X +o8%x31 +D1$$ +x47c +Z1^n +o1* +sFl +k*38 +csiu +D5i1j +s.l +i6no7j +T5'B ++4q +$ @# +dsxZ +^wi1r +$.*76 +T0st5 +o1M{ +T7i0R +s5e +$0s9a +s7a +*63o3q +T5$v +^!o3/ +^ ^x +co42 +o69*71 +$F+7 +$@x12 +x56x74 +scZu +D3$? +^ri4y +i7h$2 +T4r +*67s1/ +^sp1 +@c*24 +sw9 +iA_x46 +i2_l +o2g$# +Z5$8 +DBi01 +i9k*A6 +i0Md +o3nD2 +x54$. +x43+4 +xB3RB +qx19 +i2rx01 +ui4O +$8q +i4w'9 +x81o8- +*0Ax7A +*02o1a +x32Z3 +*70Z1 +$<$1 +-7i68 +oAl'B +$Ft +o0fRA +x72o6u +oA2$! +$_d +o7Uc +tx62 +$P^^ +shM +$3-8 +$9{ ++6c +i21^2 +s54-1 +o4wf +x12i5 +s!2 +p2D6 +{sue +D2D2 +sa2 +*95*5A +sls^a +i6d*60 +i4A +'6i3m +i8zx05 ++8o7_ +o2G +*7Bx64 +i56+6 +o5t+2 ++3o6e +i0zz1 +T5*45 +o28l +Z1i7N ++7R5 +o4 L5 +*67$0 +sreD5 +^u +i4 *81 +*59o90 +x43f +slm$w +RAxB3 +}x21 +@u*82 ++Ax62 +s 5$8 +x21-0 +*57@9 +sjf*7A +$ax02 +^%z1 +$o^C +ks8k +i3gT6 +o0Z$Z +z2i14 +^aD9 +^,-1 +z1@2 +Z4+0 +*39 +o5j*50 ++0^g +^oi1' +s76c ++8Z2 ++0*58 +oA_x05 +sLF +s6, +$"p1 +x13L0 +D8$f +Z2x26 +^L$i ++9$. +^.-1 +$6+8 +*01z2 +^lx36 +i6ax05 +T6i0N +$-x12 ++6$! +ko6f +o7W'9 +D6^t +p1sGb +$sx43 +i4k[ +x01o6, +$YL7 +s38x52 +iAnx64 +i4M+0 +*53o8o +iAe +^c$m +*50u +Z2-A +li1Q +{$x +co0r +i6y-8 +o91Z2 +s8j +l$7 +x73t +[o41 +*83i54 +to66 +o7or +o88o9! +*94x73 +o6o*61 +'9i6* +x42sa +i5.T2 +Z1$% +co2$ +$tx02 +x15x41 +o9% +-5x03 +o3sC +sfJ +$2+4 +}^6 +saoZ4 +i5_*97 +x56*28 +^jc +^lD2 +*36T9 +^.^f +Z3sdz +-5*74 +skf +x74$# +o5w*75 +o0mz1 +Z1x52 +*97D1 +o7W +T9*29 +s8* +$4sdr +siG ++1x24 +-2o4y +k^h +t-3 +$dx02 +R4D6 +i3N +p1D9 +i52$A +i1b+9 +o2*z1 +p1x57 +o5GD6 +-0+6 +t*37 +srZ +co3- +s29$e +sqw +sf+z1 +o70^i +uo3s +Z1i9s +o0({ +l$% +o73$+ +^1x73 +i8hR7 +*68^? +T5o7h +dsS +i9.+B ++1$f +*54x23 +o18^M +@2o94 +x13^e +o3h +i8! +-8q +$m-0 +o5,Z2 +x05q +}i7g +s7! +i67Z1 +Z1x83 +lx76 +o8gk +s3j +$liAx +}o0v +^Eu +x02$" +oB x0A +x32o2 +i33i40 +*86D3 +-9*01 +sfc^k +$7$j +o58Z4 +p2z2 +o0YZ4 +d^s +i8ax53 +*76*34 +x04o51 +ssl +x64$@ +x03Z4 +i6[ +@5^9 +o0vl +x63@f +s* +l*79 +$+Z3 +*59D2 +$b$, +s0! +DA$b ++9i8 +fx5A +^7*35 +D6sng +^m*08 +o3+D6 +i0}^{ +i7aZ2 ++8*76 +*40D4 +D9D4 +x71o6j +ts52 +D7$8 +p1o7d +T8o04 +'B+5 +DA-A +-7} +$b^h +x08i1a +L1R0 +$\l +o13$_ +Co4F +l*7B +^0z2 +i49p2 +o55*78 +o3Ql +$ $m +R0$8 +oA+ ++7*98 +@v[ +$ED8 +$fZ2 +kZ1 +'5o1g +RBx02 +$o+4 +o8.$1 +$/s1. +i4s@b +o50^b +$]i3[ +i1to4e +p3Z2 +o82*79 +^[L0 +Z3su- +$Uc +i6l*83 +x02x13 +$7sgc +sog +o4m*07 +o59d +ciA2 +cs2I +ti7P +tx26 +$3x92 +z5x61 +c*58 +$I^R +x21o9x +$ki5f +$ sMP +o3F +$+x53 +slc +i1C{ +x32D1 +-0-5 +o4-*54 +$A+7 +z1o2y +*86o5 +o5f-4 +^RD3 +[o04 +D3-8 +D6o7: +p1$v +$1+B +sjrT4 ++4D5 +D1*13 +^.z4 +^At +*94o0t +lo42 +co8o +$9x72 +T5T7 +^8z4 +^d*0A +i18 +$++7 +Z1o4! +o5) +x81D1 +o4Yc +o4qD5 +R4*30 +i6N +*17-8 +smd +o0g*34 +x24*36 +i5c*24 +$2x32 +s!^ +D6+7 +'Bi5n +*73$_ +s1L +Z1i3: +i3go98 +*58x91 +[$3 ++4'5 +D7i1q +$2D4 +Z4o8 +*56o2l +*89^q +ci9G +@i +T0s8 +i8_Z1 +lo8d +x23$l ++3T5 +o5u$3 +$8x41 +'4^d +$di0t +^mT5 +*63o5t +*56Z2 +i4/ +*84u +x32@= ++8$g +^v'6 +-8+4 ++1D7 +sgr ++8^a +x03o66 +o5hi5C +R9+4 +s8t[ +^ex46 +x16o3 +s9_r +d*45 +o4^l ++5l +-1^3 +o80i0* +*82T5 +smr +*74*94 +xA1DB +x84*78 +i5k*28 +o3Fi3B +DAD4 +D3o55 +o4*Z3 +R0p5 +L0^w +szef +i8-T0 +i0 *05 +[i6= +sr&u +o9Esa@ +*20s29 +co4V +i65Z3 +z1$k +src-1 +Cs49 +'2k +^nx31 +*48i5K +x31x43 +csgV +o7y^j +*5A +o0hu +o7- +sh^ +i3| +ro0" +i3Wl +$fT0 +*09x03 +Z3$1 +Z3x54 +o6a*36 +T6x12 +-7s., +$r*A9 +suoo4! +*20o4 +-5+8 +i42c +'B*97 +^a$v ++2sui +i7,x25 +*31x24 +$1s7_ +'8o0E +sa; +$$i0* +$_x25 +o4.D6 +x01i8i +i7D^1 +*30*43 +o02Z1 +o6t} +o4loB2 +$Jo1o +shb +o8rZ2 +$]o4[ +sgi +^c^a +sa7Z2 +x52^$ +s52o71 +$5@w +p2x56 +{Z3 +^@$ +^fi10 +x93x07 +*08x45 +z1$h +i4tD0 +D3T3 +o8: +p2x02 +*26o3G +D5l +D7$ +^9x31 +x27 +o7 @6 +-2'A +@1o64 +o3lo0H +s30*65 +$+^N +so^ +to75 +x41^K +x82*48 +o94Z1 +-6o5z +i4o-3 +*74L5 +x14R3 +sly +D5$w +p2i4 +x17{ +s0 q +x68Z1 +D5o7D +o0w*05 +*73$m +@5$7 +o5n{ +sBZ +o6 $k +i5T +x89$i +^Bo7X +x0B$' +x72^m +sa? +T5-3 +o5/@g +s3@ +s1& +^9$G +'A$? +p4Z4 +x12s81 +sf6 +sb c ++9D7 +ti5N +T9Z1 +sbyl +$$D2 +*45o6` +qo0s +s7OD8 +co1A +L5*34 +*78x62 +$*i2e +$r$! +$k{ +i3h[ +i5x+2 +sAF +*01x61 +'Ao43 +i1r +ti9N +oA6 +$p*64 +x01*38 +R6^! +o0bC +[L0 +^2i5d +i7Ml +^n^n +*57i3s +o4pD1 +L0x16 +i84+7 +-4*03 +CsO= +i3@k +Ci21 +*75$m +}^$ +fi41 +'6o3t +xB3s7f +i0oz1 +si z5 +$+sla +z2o4Z ++9D0 +ci6b +x81x12 +z4c +i4< +snq +i37x03 +i4!{ +*46i5g +srXo3k +ui6\ +D2z2 +i69+7 +qx26 +o99*19 +o0yr +D6sGM +x23L5 +x73R8 +xB1o1s +x05$+ +o5a+9 +i3l[ +$$i01 +$@x02 +x14-1 +*76scv +o5mk +@ex12 +d+0 +$u$w +L7*17 +*27^2 +Z2o9! +D9o8d +rR0 +x71T7 +@1^a +*15$u +i2w*03 +o1rt +i4Nu +i6=c +p1*7A +Z3RA +$;u +z2c +x52'A +Z1sa? +i9. ++8T2 +^b*30 +^Di0O +szL +'7C +$.*54 +$LT9 +'B$4 +i7gc +i2*-1 +sr+ +Z1s6) +$ $t +o7C +*74Z2 +'9snP +o2f} +^ni1d +co9$ +$][ +txA2 +$2l +srHx21 +-3^$ +^.i1/ +i5` +[i11 +x09T5 +T4o5i ++6+4 +s7v +xB3x17 +o83*65 +D7^n +fx83 +D2$o +x94x26 +o2zT4 +x62^a +s5. +slz'6 +x06'B +$1*89 +sws$9 +-3*75 +li8t ++9i8d +svjx52 +rsb9 +-6$x +^Co1a +*15o1u +$boB2 +$5R0 +sGm +lsuy +*39+5 +*76'B +o65$M +$+Z5 +c$y +-4L4 +'2o0> ++1smd +$s-5 +'5i2l +o79l +smb +Z1+2 +ro41 +x23siL +c^ +x23Z2 +o7: +*32*25 +*53[ +{^0 +o69s74 +$k*A8 +*40x27 +$;-7 +$3^N +i02^l +s2? +Z1o07 +scj +*57*06 +i52R2 +*87i88 +fx75 +^n*03 +$p*61 +sw-r +*9A@0 +$s*68 +{$s +tx42 +^fx61 +z3@d ++4+3 +[o0S +*54-8 +sgw$7 +*43suo +p1o2r +z1*32 +i5zx14 +D6i01 +Z2i5r +o61x76 +x23^m +-2-1 +sH@Z2 +o7m+8 +*46o7E +x03z5 +*06*15 +R7x43 +x56L5 +p1s19 +co6T +*65Z3 +swV$! +}i14 +rL7 +*25i5a +^1*36 +o8ul +*A9RB +i50$s +}sAu +z1Z3 +-0i3j +i2gse +i1ai7o +o0n*61 +^H*63 +i61R1 +{iA0 +-3z3 +Z3o0d +Z1o3t +R4x51 +sc7Z1 +s;Hu +*87$7 +o2w +$rL5 +x43d +z1sf_ +i8=x53 +*24i6^ +@1+8 +}o2# +x72T2 +DBsab ++3o8a +sAZ +x09o2 +Z2i5x +xB8 +oByx26 +$fx91 +$8*23 +*76-9 +L3{ +$dR0 +o1D*21 +suw +*19$2 +z4-2 +x48 +'B@z +^p'A +*72'6 +{^E +$4*86 +*14i0m +x16 +$!^% +i3uc ++8} +o3rx42 +z4z4 +o0v'5 +D6o2w +Z1o5c +Z2i7Y +$6x73 +o7H +^Mi6i +x54i6i +$5@6 +$7z2 +o8# +-0x25 +Z1$n +sp< +{^8 +Z3-A +r*14 +o4xc +z4l +$t$g +^Bz1 ++5D4 +i5oL4 +xB3l +o8Kr +^yx41 +rx05 +s!(D5 +$.$$ +o2B-9 +x16^a +$yx04 +{*65 +o3P +z1+2 +i0Dz3 +$*^+ +Z2o5F +$i-9 +sO8 +^pz3 +L6x4B +x07-0 +$pl +x25l +o0U +s2_ ++5+4 +Z4i0r +sxp +*67k +*76z1 +*36^m +$2Z4 +Z2$z +T7i3? +'9$c +si^l +^`r +*A8[ +'8i5e +^M+4 +sCK +*78i6k +^6$2 +o6!i58 +lL5 +o4x*46 +D1*68 +i1uo3i +*14*34 +z2scl +x8Ap1 +$:T6 +s-@-8 +*56o6q +[*76 +o1up1 +s46 +C'5 +i8t$0 +T8x31 +z1^G +i4cc +x58 +x61s8m +T2i0y +o8=s_g +p2xB9 +li5e +-9Z1 +Z3p3 +^3^< +*78$6 +z5x24 +R0R2 +p1^a +^4$s +se7 +x41Z3 +-8@6 +i9m +Z2x28 +-0-7 +T2$! +s[iT0 +x62i6m +xB2C +i7es17 +Z1^h +o67$A +*75o1h +o9bi9/ +u@E +$+-A +s53T0 +L7$4 +Z2x21 +T5*67 ++4o0t +x05D3 +*0At +-1'7 +$8x92 +'9i2l +-2Z1 +sl_ ++8R2 +i1" +$_$s +x71$E +-7Z3 ++5x62 +Z3o0m +o8l-7 +Z1*97 +^vR1 +x4B +T4x8B +*A1x16 +ro6U +o6!k +-2o0g +sZ+x01 ++9p1 +sL3'9 +co64 +o3Yl +i4rx91 +i3!c +*01o6. +x23i1b +i35 +R0@o +D2p1 +'5z5 +'9u +o91*A9 +-4o7e +^sk +fZ5 +$a$6 +*A9o9J +$G$E +i1V +o27+8 +^l'9 +z2@i +x13^S +z2@q +'8$h +[i1w +ri1k +'9$1 +$F*23 +p1*69 +$AZ3 +sn7d +^az2 +li1\ +Z3x63 +*14 +R4*64 +o1%z1 +'Bsoa +*09x34 +p1-3 +-5sb- +i4,c +sdc-3 +sf7Z1 +x72z1 +$r$n +i3$ +o93D8 +-5o1_ +{$2 +s.7 +sndx02 +$E[ +R3x73 +z2o1l +x34x52 +^di31 +o1ii04 +D8@7 +T3si1 +o4$Z1 +'9R8 +z1t +o6 @a +$ro6 +*07+0 +Z2o2d ++4$N +o87x52 +$m*28 +sy5i31 +sO% +$g$s +C-7 +-8x61 +i4=*86 +Ci9v +qt +i74^3 +i0" +x83$M +sm- +*A8s0x +o2# +@Sz1 +^4C +o4dx71 +[-6 +^r'B +$TL6 +o4,*06 +ui6r +^ix12 +'9*83 +z2*74 +*53q +-4-2 +o2Vt +o9! +sA9 +x54$y +Z4x13 +^O ++7oAo +$#o69 +$4Z3 ++3^b +fxA8 ++7u ++0*37 +sfm +z1o1* +i5H +*41-0 +T0i3m +x02^b +-2*26 +$9@O +x19p2 +x04'5 +p4x1B +T4x02 +d+B +se,$5 +$od +i7mT4 +*21i4t +i62Z2 +T4sc$ +x93l +Z1o5C +s7x +*41$z +*B6*89 +sOK +[T1 +x14x32 +o0kc +o6.^m +-6i62 +x09x54 +Z4D1 +i5oc +x18R0 +$' +x13$y +i0vd +p2x45 +^kR3 +p2Z3 +*75o6e +se [ +i1G +*86o30 +-8*53 +o7zo8o +i4K$4 +$x$t +z5@a +x08*63 +R7+9 +smlk +o8dD9 +o0D'9 +o7$'8 +o49 +s1cR0 +o9` +s8d +o8kx23 +^1x56 +^ *20 +o1eZ1 +R0$} +*67s- +*15f +^m*40 +usLH +Z4i0= +-5*16 ++0R6 +$N ++7x41 +o54p2 +*85+5 +$Gr +z2o1- +*49x24 +i5nZ1 +scF +oBE +o0p-1 +ux83 +*87o7z +s,G +-B@r +*43$3 +$!*04 +$5o7o +*01scx +T7@E +-5l ++8*78 +$9o84 +x52o4g +*45s2_ +sau +'3sd: +si[ +$9$O +*23*86 +^s+2 +*35o2m +sZb +T7o22 +^8p1 +@%+6 +o0fx32 +[$: ++7sfb +[o4t +$s[ +s9@ +cs2m +stw +T9L9 +o4jo80 +D3o0N +i2k+4 +li67 +iA7 +$/D3 +spyp1 +$< +s1$ +$0*67 +Z4x15 +@5R3 +D3i7D +i3o*20 +$#x61 +^p'5 +sDm +x12i2k ++5L0 +o9A[ +^Ui10 +Z3^# +s5V'A +z2*51 +$U +tx03 +i7 ^O +$M $W +^m ^r +$M $O +$M $A +^M ^7 +$, $m +l oB. +l o5j +l $L +$L $A +l ,5 +^l *05 +K Y2 +$k $1 +$i $z +^i l +i6s u +i6$ { +i3. y4 +i3k k +i2C Z3 +i1( o2) +i1n t +i0h ^s +^F ^W +^f ^d +E T8 T4 +E T4 T8 +^e ^d +d Z2 t +d y4 t +d x65 t +d x64 u +d u x64 +d t Z2 +d t y4 +d t x65 +d t ^R +d t +7 +d i7X +d i7b +d +7 t +$* D5 t +D2 $* +^d ^0 +^C ^X +C i4_ +^C i1c +$b $v +^a $1 +$@ ^a +$9 E +^8 $x +,8 +^% ^8 +^! ^8 +$7 -5 +^6 ^V +$6 $b +$* .6 +.5 ,3 +*50 $q +*40 +,3 ^U ++3 T4 +$2 i31 +$1 x71 +-1 ^X +$1 $W +$1 $D +,1 .2 ++0 $X +*02 y4 y4 +$* ^+ +$. $- +$. ^* +$? $/ +$| ^| +{ { { +^z z2 +^z ^d +^Z ^A +^* z4 +z3 o2Q +Z2 x32 +Z2 o3d +[ Z2 k +Z2 i6- +Z1 $h +$< Z1 +y5 o4a +Y4 o8 +Y4 o7. +y4 i4a +Y3 o7e +y3 o2S +y3 o2n +y2 o0R +^! Y2 { +Y1 $? +$_ Y1 +^X ^A +x72 +$* x05 +x04 y2 +x04 $6 +x03 -0 +$* x01 +^w ^q +^w $l +^w i0e +$& ^W +$v +1 +u d xB1 +^t ^z +t Y5 +t o2K +t o0$ +^T ^D +T4 L7 +T4 $1 +T3 t T2 +T3 T2 t +$S x13 +$S $W +$s $e +s=+ +r Z3 +^r y1 +$R x54 +$r $t +r o1_ +^r l +r i7z +R2 R2 +$q Z3 +^q $. +^P ^A +p3 D5 +p2 x75 u +p2 u x75 +p1 x08 +[ ^p $1 +^o ^R +o9# +} o8! +o7P Z2 +o79 +o73 Y5 +o6? Y2 +o6k +o6- +o4* u +o4d +o4a +o3q +o2f +o1s { +} o1g +o1A y2 +o0v y4 +o0d } +^M ^E +$* ^m +$. $m +$` L6 +l $' +l ^$ +[ k Z2 +K ^s +$K $R +K o2[ +$K ^N +K i64 +^k i0K +^K ^G +$K +^k $@ +$j $1 +i7@ C +i7* +i6z Y2 +i6( $) +i5@ l +i4, y5 +i41 Y5 +i41 +^I +3 +i2z +[ i2t +i1q y4 +i0R ^M +$! ^I +^h ^s +$H ^R +$H .7 +^g ^m +^G ^D +$g ,7 +f x49 +^e $# +d xA3 u +d x53 t +$D $W +d u xA3 +d u +0 +d t x53 +d t ,6 +d oBL +d o4- +d i8, +^D ^C +d 'B +D9 $1 +d ,6 t +d +0 u +$D +c T5 $9 +^C ^S +^c ^r +^C ^L +C i5X +^C ^B +c $9 T5 +c $3 +c $. +^b x52 +'A Y2 ++A $\ +$! ^a +^9 $4 +$9 $% +$8 x73 +$! .8 +^/ -8 +^7 y1 +*63 T2 ++6 $# +$6 $= +.6 $* +,6 $! +-6 ^_ +,5 x03 ++5 +$+ .5 +,5 $* +,5 +,4 *53 +-4 ^1 +^. ^4 +,3 ^l +$ +3 ++2 $R +^2 ^a +$2 $5 +.2 *07 +-1 Z1 +$1 $S +[ $1 ^p +$1 $7 +$1 ^! +$@ $1 +-0 T5 +$0 ^c +$* $- +$( $. +$, $. +$- +[ { +^& $% +^- { +Z5 o9U +Z4 o0D +Z4 i9U +z3 o1g +z3 o1) +z3 $! +Z2 i5v +z2 i1g +$ Z1 i22 +$@ Z1 +^Y ^N +y5 i22 +y5 c +y4 Y4 +Y4 ^r +Y3 Y3 ] +Y3 ] Y3 +Y3 o0m +Y3 -2 +y2 y2 E +Y2 oB4 +y2 +y1 Y2 Y2 +Y1 $h +$\ Y1 +^x z2 +$x $O +$X $D +x61 ] +x42 ^| +x23 *02 +x12 f +$* x12 +x06 z2 +$, x05 +x04 ^Y +x03 ,2 +x02 ^4 +$W x42 +$W ^j +$w i7q +$w $h +^W ^E +$W +$V +7 +$V $2 +u z5 y1 +u y1 z5 +u $! Y1 +$U $T +t y5 y5 +$t T1 +t o2o +$T $K +T6 T7 +T6 $+ +T5 $1 +T1 $% +T0 $! +} t +[ t ] +[ ] t +sy* +ssz +sR* t +^S ^L +^s K +^S i0A +^s ^g +s30 +$@ ^S +^r D4 +r D2 r +^r ^d +R4 o7a +q s0 +^P ^X +$p $t +^p ^R +$p $b +p2 x76 t +p2 t x76 +p1 x53 t +p1 x06 +p1 t x53 +p1 t D7 +p1 t ^D +p1 oBZ +p1 oBL +p1 o7c +p1 o0r +p1 i7X +p1 E $3 +p1 D7 t +p1 $3 E +$o $s +o8x +o7Y E $1 +o7Y $1 E +o73 +o6Y y5 +o64 l +o5W Z5 +o5v +o5- u +o5D y5 +o59 Y2 +o4n k +o3x +o3v [ +o3u K +o3s +o3f y3 +[ o2w +o2a +o0Y +o0* t r +o0* r t +o0g } +o01 z2 +^N $K +$m *73 +^m $& +^m $* +l y1 +l o44 +l i7! +l i5@ +^L ^H +L4 $0 +$' l +^k ^l +^k $k +K i6- +^j y1 c +i86 l +i4- Y5 +i4 y3 +i3A $! +i2x +$ i22 Z1 +i1n C +^I $! +$i +^H ^B +f y1 u +$f ^W +f u y1 +^F ^K +^e z1 E +^E $2 +E $$ +^@ ^E +d Z1 t +d z1 t +d u i62 +d u i61 +d t Z1 +d t z1 +d o60 +d o2M +d i62 u +d i61 u +d '9 +^d ^7 +$D $! +^c z1 +$! c T8 +^* c r +^c +8 +^c ^4 +$b Y1 +$b $w +^B ^M +$b ^A +$@ *B1 +^A $1 +'9 +$8 T8 +$# -8 +'7 R6 R6 ++7 $@ ++7 $. +^_ -7 +$6 x04 +.5 $r +-5 ^b +$5 $A +-5 $7 +^4 '8 +*46 +*45 Y4 Y4 +*42 +$_ *41 +*35 +$3 ^2 +] $3 +-3 $% +^! $3 +-2 *31 +$1 ^s +$1 $R +$1 ^R +$1 $P +$1 o0B +,1 K +$1 $g +$1 *84 ++0 $9 +^0 ^2 +$# ^@ +$$ $& +$! ^* +$, +$` ^` +$z ^a +z5 oAI +} Z4 z4 +} z4 Z4 +Z2 T5 +Z2 o1@ +z2 i2@ +$* Z1 +y3 i3x +y3 i2l +[ Y3 +y1 Z4 +y1 ^K +^x $s +^X o7X +x71 c $2 +x71 $2 c +x52 $t +x41 $a +x37 t +x1A +x14 C +x05 y2 +^W $L +$v ^c +u y5 Y2 +u Y2 y5 +u p1 x06 +u d +7 +^U ,4 +^! ^U +] u +^t z2 +t p1 x82 +t i1l +^T ^G p3 +^T ^G +t ^a +T6 T1 +T6 $\ +$+ T6 +$* T3 +$# T1 +$s ^Y +^S ^W +sP* t +so* +$s ^i +$s ^a +s1* x42 +s>. +^R $H +$r $a +$p Z2 +^p ^u +^p i0P +^p $g +p5 ^J $j +p5 $j ^J +p4 o3z +p4 '9 +] p1 x06 +p1 o4v +p1 o0v +p1 ^A +p1 '9 +^o ^S +^o ^B +] o73 +o6/ Z2 +o6S Z4 +o6b +o5z +o5j l +$o $5 +$) o5( +o4I l +o4i l +o4b k +o42 +o2v +o2[ K +o1I y2 +o1g +o1a +o0+ Y4 +o0[ y2 +o0v y2 +o03 +^N ^V +$m Y1 +$M $N +l i86 +$L $D +$' $L +$L +^L $! +^$ ^L +$k Z2 +K x07 +$k T1 +k i32 +k i1S +k ^e +^K ^- +$j ^w +$! ^j c +^J +7 +i8s } +i7_ t +i7! l +i7B Z2 +i6= [ +^i ^6 +i5T t +i5n +i56 Z2 +[ i4v +i4H ] +i48 Y4 +i41 y5 +i4_ ] +} i4 +i3t [ +} i3i +i3a +i2m l +i1l Y5 +$h ^b +^G i1g +^G $* +f z1 u +f u z1 +^F ^U +^f .1 +$F +E $$ Y1 +E $* i8* +^e ^C +E $6 +$D x52 +d x49 +d u ,6 +d t +B +d o7c +d o63 +d +B t +d ,6 u +d .6 +D5 $A +^- ^D +$c $z +^c ^u +c T8 +$c $j +^C ^D +c ^1 'A +^B ^K +^B i1b +$b $e Y2 +$B $b +^a ^w +$A $u +^a ^B +$# $A +$@ $A +^9 +*87 +^/ ^8 +$7 E +$7 $A +*76 x13 +^7 *65 +*75 L5 +^7 $! +*6A $O +[ $6 +$% *58 +$5 -7 +.5 +$4 ^9 +$. *45 +*41 +*40 E +^@ $4 +-3 Z1 +$3 $A +*30 c +} $. ^3 +} ^3 $. +$2 s 1 ++2 ^r +^2 ^f +^@ .2 +$1 T8 +$1 ^M +$1 ^B +*14 +*12 ^H +^1 ^2 +.1 $1 +$1 $0 +^1 ^0 +.1 ^@ +-1 +^0 ^X +^0 ^l +*04 $B +*04 *13 +^* $! +^. +^! $# +^_ ^@ +^| $| +$Z $X +Z4 f k +z3 o2@ +Z3 i2C +z2 o1o +Z2 i56 +Z2 i5, +z1 ^W +} z1 +y5 T9 +y5 oBY +y5 oAD +Y5 o5d +y5 i5 +Y5 ] +Y5 +} y5 } +} } y5 +y4 i6v +y4 i4_ +Y4 C { +y3 y3 +y3 i7 +y2 o1e +Y2 o0j +Y2 i7e +Y2 i4i +y2 i2n +Y2 $A +y2 *47 +y2 { { +} y1 +^x ^X +x61 Y3 Y3 +x61 $* +x51 $C +x28 t +x24 +x15 z2 t +x15 t z2 +x08 z3 +x07 K +x04 t $* +x04 $* t +$x $\ +$w $s +^W $J +^W $& +^v z1 +^V $z +^V +u z4 z4 +u Z3 r +u y4 Y1 +u Y1 y4 +^u $y +^u K +u $D $A +t Y2 Y2 +t R6 R6 +t ^Q z5 +t p1 x74 +t $h Z5 +t d D4 +$t ^b +t ^9 z5 +T3 o05 +T2 T0 +T1 *71 +T0 d x06 +^s ^Z +^S y5 +ssS +^s ^m +$s $h +sF* t +^S ^E +^S C ^M +sa- +s31 +^& ^S +$. ^s +^R ^T +^R i0J +^R ^I +^R $B +$r ^B +$( R4 R4 +R2 *62 +$R +2 +r ^* +^= r +^q $w +$Q ^Q +q '5 +] p2 [ +p1 Z2 u +p1 x12 { +p1 u Z2 +p1 o5A +p1 o1v +$= p1 +$O $o +oA3 +oA1 +o8` Z3 +o8i +o7! +o6s l +o5y +o5( o8) +6 +o5( +6 o8) +o2] y3 +[ o2v +o26 +} o2; +o1r Z2 +o1{ L1 +o11 l +o0z +o0x +o0W +o0w +o0M $2 +o0k $! +o0D Z4 +o0d +o08 z3 +^M $L +$m $l +^m $b +$M $1 +$& ^m +$l $d +l +A +^l *50 +k o4n +K o3u +k i3k +$k $g +^k ^b +K ,1 +$K ^1 +$K ^$ +^j ^M +$J $F +^J ^B +^J -9 +iB +$I .9 +i8 E +i7K u +i6j l +i5- +i4' f +i4c u +i4a $1 +i4_ +i3e ,5 +i2z i3x +i1a +i0n ^N +i0l +i0g ^a +i0* +^I +$G $M +^g $g +$. ^g +f z1 t +f t z1 +f t -6 +{ f K +^F $f +f -6 t +E T5 +d Z4 } +d Y1 u +d x32 u +d x05 +d u Y1 +d u x32 +d t +d $A +d ^A +D9 +D5 ^x +D4 $a +D1 $4 +D0 t +d ] [ +d [ ] +c $@ Z2 +$c ^s +C i5T +^C ^I +c d x05 +$c ^b +c ] ] +$b Z1 z1 +$b z1 Z1 +$B ^R +$B *A9 +$A y2 y2 ++A l +$A i01 +^A ^B +$a $b +$a -6 +$9 Y1 C +$9 C Y1 +^9 $a +$9 +8 ++9 $# +,8 p1 x06 +$8 $d +*85 L8 +-8 ,5 ++8 $. +*61 $! +.6 +^5 z4 u +-5 Y3 Y3 +^5 u z4 +*53 i3C $! +*53 $! i3C +,5 $! ++4 $. +$/ $4 +$3 $9 +*35 Y3 +*31 +^3 +,2 ^S +$2 o0H ++2 ^I +*2B x14 +.2 ^2 +$1 Z1 +$1 x93 E ++1 $v +^1 $S +^1 $K +$1 E x93 +^- $1 +^0 ^c +$# ^# +$. $* +$/ $* +^+ $# +^# $* +^? ^/ +^Z $z +$z ^Z +$z ^V +^z ^A +Z5 o5W +z2 o1J +z2 i1) +} z2 c +z2 *25 $. +z2 $. *25 +} z1 l +^ z1 +$. $z +^Y ^W +^y ^M +y5 y5 +Y5 o1v +Y5 o0h +[ y5 c +y5 $A +y4 i4, +Y4 $@ +y3 x63 +y3 x62 +y3 o6f +Y3 o0d +y2 o4; +y2 o1c +Y2 $a +} y1 l +Y1 $. +^/ y1 +$x ^z +x82 l +x43 $1 +x41 $* +x41 $. +x3B +x27 y2 +} x27 +x26 y2 +x21 ^y +x12 C +x06 z3 +x06 y1 +x05 c +x02 $0 +$w Z3 +$w $u +$w ^n +^W $f +^w $@ +^V $P +^V $E +^v ^c +^U $Y +^u +t y5 Y2 +t Y2 y5 +t o3. +t +A +T8 $8 +T7 T6 T5 +T7 T5 T6 +T6 T0 +T5 T6 +$! T5 +T2 +0 +T1 $t +T0 p1 x07 +$! ^T +sZ* t +^s ^t +srh +sr* +sJ* t +$s $b +sa@ +s21 +^S $! +s>< +^r ^I +[ r d +R3 x43 +$Q Z2 +^P ^V +p4 +p3 x51 +p3 'A -3 +p3 -3 'A +p1 x06 c +p1 i7. +p1 i7 +$o Z2 +$O u +$o $P +$o ^I +oB3 x24 +oB1 c +o8h +o8c +o88 +o7c +o75 Z3 +o75 Y2 +o6 Z3 +o6K y2 +o6i +o66 +o64 $! +o6 +o5x +o5o +o5F +o56 $* +o5 +o4p Z2 +o3w [ +o3w +o2m l +o0s $0 +{ o0s +o0r Y2 +o0L +o0H $1 +o0f K +^m ^s +$M $P +$M $a +$m ^@ +} l z1 +} l y1 +$L ^W +l T8 +$l T5 +l o4i +l o2m +l o11 +$L ^L +$l *64 +$l *46 +^L *15 +k p2 'A +K o5B +K o5* +K $A Z2 +K $1 +^j ^t +^j ^l +^J *07 +^i ^l +iAu iAD E +i89 l +i7@ t +i7s +i7h T0 +i5v Z2 +i5s l +i4' y5 +} i44 +i43 i4< +i4_ $3 +i4 +i3U y2 +i3s +i3 E +i36 ^a +i32 k +i2W +i2$ p2 +i0l ^A +i0@ $2 +$g Z2 +$g ^p +$g $o +^G $f +$G $1 +$* ^G +^f ^s +$f ^p +E T4 +E i6l $1 +$e ^a +E $1 i6l +d u D7 +d t D1 +[ d r +d ^q z1 +^D ^J +d D7 u +d D1 t +D3 t +D1 o2x +^D +$d [ +} c z2 +$C Z1 +^c ^w +c T9 +c T4 $4 +C T1 +C p5 +c $4 T4 +C $2 $1 +c ^1 +c $$ +^B ^d +^b $b +.A t +^A i1c +$\ +A +^@ ^A +^a $@ { +$9 ^3 +$9 $2 +$# +9 +^* -9 +'8 p1 x05 +$8 E +.7 i6X +-7 E $! +-7 $! E +.7 +9 +^7 ^6 +*75 $o +$6 i2e +*67 +*65 $. +$6 $1 +$5 *82 +$@ *57 +*52 y2 +.5 .2 +*50 o5* +*50 *23 *14 +*50 *14 *23 +^3 ^R ++3 o1m +.3 $8 ++3 $7 +*32 k ++3 ^, +$% -3 +-2 i2e +*20 ^T +^1 o0a ^N +$1 $! +$. $1 ++0 o2d +$0 L4 +^0 ^C ++0 $A +$0 $A +*05 D5 +*03 $b +*02 +$+ $# +$# $@ +$! ^# +} $. +^@ +$Z Z2 +^z x31 +Z5 z2 Y5 +Z5 Y5 z2 +z4 K +z3 { Z2 +Z3 o7% +Z2 o4d +$. Z2 E +$* Z2 c +z1 o4* +Z1 $? +^Z -1 +^y x31 +^Y x14 +y5 Z3 +y5 x73 +Y5 o7Y +y5 i5o u +y5 i5, +Y5 d +y4 y4 E +y4 K +y3 Z2 t +y3 y3 t +[ Y3 Y3 +y3 t Z2 +y3 t y3 +Y3 *53 +Y2 Y4 t +Y2 y2 +Y2 t Y4 +[ y2 t +Y2 o59 +Y2 o3e +y2 K Y3 +Y2 i7_ +y1 i1# +Y1 *96 +Y1 $7 +Y1 $- $- +^X z2 +x73 $8 +x71 $; +x61 ^J +x54 R5 R5 +x52 R5 R5 +x52 $D +x51 u d +x51 d u +x51 $3 +x16 C +x15 u +x14 c +x0A z3 +$w [ +^v $v +$v .7 +^v +^u $s +^U ^C +t z5 y1 +[ t y2 +t y1 z5 +t y1 +t T8 +t p2 x65 +t o8# +t o6) +t i9L +T8 ^1 +T7 T8 +T5 o0A +T3 $2 +$* T1 +] t $* +] $* t +^t +sz* +sym +st* +$s ^r +sqa q +sk* +se4 +$S $B +^s $b +sAI y2 +s1R +s1 k +} s0% +^r $s +^R l +} r l +r i6c +^r i0e +^r ^A +R2 z2 +[ r +q C -5 +q -5 C +$p $l +^p $f +p3 r +p2 x5B u +p2 u x5B +p1 Z2 t +p1 y4 u +} p1 x06 +p1 u y4 +p1 u $8 +p1 u $3 +p1 t Z2 +p1 E +p1 D3 +p1 $8 u +p1 $3 u +$p +^o ^M +$O $K +oA5 +o9) x25 +o98 +o97 +o8# C +o7? l +$o *75 +o7! } +o6U o5D +o6u +o6o +o6e +o62 x51 +$) o6( +o5q +o5 E +o57 z1 +o51 .4 +o4@ $1 +o3l y1 +o3g +o33 +o1y x21 +o1y +o1k K +} o1d +o0@ T1 +o0* t +o0m Y3 +o0h ^s +o0g p1 +o0e +o01 +^N E +$n +$m ^b +^M +l z1 +l x54 +l t d +l R6 R6 +} l r +l o6s +$L ^M +^L $m +^l ^m +l d t +L9 $) +L6 $` +K Y4 Y4 +K Y3 y2 +K y2 Y3 +k ^v +$k u +^k ^s +^k ^M +^j z1 +^J x35 +^J ^T +^J ^A +$J ^* +i7( E +i7/ D1 +i6k x12 +i6@ k +i5, Z2 +i5g ] +] i4H +i4H +i4. +] i4_ +i3 y4 +i31 ,4 +i3 +i2z ] +i2r +i2p x42 +i2f $4 +i2f +i2a +0 +i1S c +i1q Y4 +i0s ^f +i0o ^b +i0n ^A +$* i0* +^i +^H $Z +^H +$f $k +$f $b +$. E Z2 +^e y2 +^e ^m +E iA +E -4 $1 +E $1 -4 +E $1 +$$ E +^e $^ +d y1 t +d x62 u +d x31 +^D $v +d u x62 +d u *76 +d t y1 +d t ^T +d t $2 +d i7H +} d E +[ d c +d *76 u +D6 $1 +D5 t s0* +D5 s0* t +D3 t ] +D3 ] t +D3 ^r +D2 y3 +D2 y2 +D2 t +d $2 t +D0 p2 +^d +$* c Z2 +$C Y1 +$c Y1 +$C x32 +^C ^M +^c ^f +c *65 Y4 +C ^1 +$B +^B +$a x63 +^a ^S +^A ^M +^a D3 +$A D2 +$A $b +^a ^0 +'A +^a $* +^9 D2 +*9A +^9 ^0 +*86 $) +*86 +$8 *58 +$% *85 +$8 $1 +^8 +.7 o64 +$7 *A5 +$7 ^5 +-7 ,5 +*70 .2 +^, $7 +$6 Y1 +.6 i63 +$6 i4s +^6 $6 +*64 $l +-6 *34 +$5 Z1 +^5 $7 +*54 $. +*53 -0 +*43 -6 +$. *43 +*40 c ++4 +-3 x03 +.3 o13 +*35 .4 +*30 $b +$2 Z1 +,2 Y3 y3 +,2 y3 Y3 +$2 d x04 +$2 C +.2 -5 +*21 *54 +*21 ^+ +*20 $! +$! *20 +$. ^2 +^2 $& +$1 x52 +$1 ^S +^1 l +$1 iAs +$1 i4& +$1 i3- +$1 *48 +,1 *41 +*13 -2 +] ^1 +^1 $- +^# -1 +-0 t d +.0 i1t +-0 d t +$0 $9 +*05 x51 +*04 E +*03 .3 +$+ $. +$& $* +$$ ^$ +$! ^` +$= +{ $. +^% $& +^@ $@ +^` $! +^Z z1 c +$z Z1 +z4 x0B +z3 x08 +z3 $S +Z3 o7B +Z3 o6- +z3 ^M +Z2 i7. +Z2 $. +$# Z2 +$. Z2 +$/ Z2 +$- Z2 ] +Z1 i6M +Z1 *96 +$z ^# +$Y u +$y $t +^y ^t +y5 E $1 +y5 $1 E +y4 y3 +y4 x09 +Y4 i21 +y3 Y3 +Y3 u +Y3 $. +Y2 z1 Y2 +Y2 Y2 z1 +Y2 i6- +y1 ^t +$* Y1 k +Y1 i6S +$. Y1 +1 +$< Y1 +y1 +$X Z2 +$x Z1 +$x $y +x73 ^# +x71 $. +^X $7 +x51 p2 x0B +$* x46 +x42 R3 +x31 ^r +x2A t +^\ x24 +x19 +x14 f +x13 *43 +x12 ^\ +x07 y2 +^w ^h +$! ^W +^v y1 +^V ^s l +^V l ^s +$v ^D +$$ ^v +u Z1 y4 +u y4 Z1 +$u ^t +$U $E +$, ^u +^t $u +$t $i +TA ^1 +T7 i6. +T6 o1) +T4 T1 +$* T4 +^- $T +] t [ +] [ t +^s z1 +sX* +$s $w +s.V z2 +$s ^U +ssg +$S $s +$s o6f +$S $J +^S i0E +si* +^S $G +^S d +$s $d +sbB +s5# } +^s ^5 +s45 +s3N +$S *32 +s2P +$S *23 +$S $1 +^( s _ +r Z4 z4 +r z4 Z4 +[ r p1 +r o5x o3z +r o3z o5x +^r ^J +^r ^e +R5 t '6 +R5 '6 t +$r .5 +R2 y2 +^R +^Q p3 z2 +^p ^l +$p k +^p ^J +p4 x53 +$p *42 +p3 Z1 { +p3 r d +p3 d r +p3 $8 $! +p3 +p2 x6A u +p2 u x6A +p2 r l +p2 l r +p2 '9 +p1 Z1 u +p1 Y1 u +p1 x84 t +p1 u Z1 +p1 u Y1 +p1 u i71 +p1 u 'A +p1 t x84 +p1 t D6 +p1 t $7 +p1 t $1 +[ p1 r +p1 oB7 +p1 o2M +p1 i7b +p1 i71 u +p1 i7+ +p1 E T1 +p1 D6 t +p1 'A u +p1 $7 t +p1 ] $2 +p1 $1 t +^o ^n +^o ^g +oAA l +oA2 +o9y u +o8! Z1 +o8. +o7o T5 +o7f +o7c o5q +o79 -6 +o77 +o7$ *30 +o6v +o6M u +o6L +7 +o6 E +$. o67 +o6_ ,5 +o5l +o5( $) +o5- +$. o5. +o4- x51 +o4i +o44 l +o4, +o3_ R2 +o3k +o3d +o35 +o2S T4 +o2s +o2q *70 +o2M } +o2k t +o2d +o29 +o2! ,3 +o23 +o21 +o1Y Z4 +o1o +o1a -0 +o14 d +o0V $1 +o0T $1 +o0q +o0m +o0G D3 +o0f Y3 +o0a +o04 +^n l +^n ^h +^n ^F +^n +^m i1w +$M ^F +l Z2 x24 +l Z2 +l x24 Z2 +l o7c +l ^n +$) L9 +$L $1 +k $+ Z1 +] K Y2 +$* k Y1 +K ^u +^k ^t +K o3b +k K +k D2 ^k +K $@ ,7 +K ,7 $@ +k *23 +$K $1 +[ k +^J ^C +^* $J +$. ^j +^I $o +iA# E +] i9s +i9L C +i82 l +i81 +i8 +i7_ Y2 +i6x x03 +i6S Y1 +i6s c +i6. o5, +i6M Z1 +i6M Y1 +i67 Y2 +i6# .5 +i5s $5 *32 +i5s *32 $5 +i5S +i5Q .4 +i5i +i56 ^d +} i52 +i5 +i4j -1 +i4i Y2 +i4, $E o9. +i42 .5 +i32 ,4 +i3 $ +i2e t i6F +i2B $! +i20 .1 +i2 +i1x ^t +i1d ] +i0A $! +^H ^R +$G o0g +^g ^f +f xA2 K +^f ^n o0b +f K xA2 +$f ^G +f C .6 +f .6 C +^f +f +$e Z2 +[ E y3 +$e $x +E TB +^E ^T +E ss8 +^e *54 +] ^e +^d z1 +d x94 t +d x14 +d u D5 +d u $0 +d t x94 +d t *57 +^d ^s +d i7q +d i60 +$d i4s +d D5 u +^d ^C +DA i4 c +^d ^A +D7 $; +D6 ^J +D6 $5 +D5 i2y +d *57 t +^d ^2 +$D $1 +d $0 u +D0 t d +D0 d t +$= d +c x31 $9 +C sI& +c oA0 +C o11 +^C ^F +^c ^e +c $9 x31 +$$ c +[ c $! +[ $! c +$b q +$b i3f +^b i0s +'B +$b $# +$a ^w +^A $U +$a D4 +*A6 $O +^A $2 +$9 i33 $. +$9 $. i33 +*9A $B ++9 .7 +$9 $4 +$' ^9 +-8 i8@ +$8 C +$8 $6 +$- *86 +^8 ^0 +^7 i1e +$7 *5A +$7 ^, +$! +7 +^6 z2 +-6 R5 +'6 p1 E +*68 l +*63 .2 +*60 ^c +$. -6 +$! .6 +$! ,6 +} ^6 +-5 o64 +.5 o0T +,5 i2& +^5 ^b ++5 *46 +-5 .2 ++5 $! +'4 Y2 y2 +'4 y2 Y2 +.4 i75 +^4 -8 +*46 *35 +*45 ^s +*43 +0 +$3 Y1 +^3 u $! +^3 $! u +*36 ,2 +*34 -6 +.3 *45 +*32 i5s +*32 *24 +*31 -2 +*30 i4g +.3 +$2 $s *16 +,2 i3C +*27 i4w +*24 +^+ *23 +*21 ^P +$2 *16 $s +^2 *04 +$. +1 Y1 +^1 o1H +$1 ^d +*14 $_ +$1 $4 +$1 -2 +$- $1 +$0 x02 +-0 u d +-0 d u +*05 x23 +-0 *53 +$0 *43 +-0 *35 +.0 +2 +$+ +$% ^& +$& ^% +$& +$* $/ +$. ^. +$! ^? +$- $= +[ } +^% $# +^. $- +^! $@ +^! +$z $j +^z ^a +$. Z4 +$ Z4 [ +$ [ Z4 +z4 { { +Z3 { Z2 +z2 Z5 Z5 +Z2 u p1 +Z2 p1 u +} z2 l +Z2 $a +^ z2 *43 +Z1 y4 u +Z1 x61 +Z1 u y4 +z1 o4l +z1 i1D +z1 i1# +Z1 $a +Z1 -3 +Z1 $! +$Z $1 +$. Z1 +} z1 $* +} $* z1 +$Z +^Z +Y5 x74 +Y5 x23 +y5 t ] +y5 ] t +Y5 p1 +y5 o7c +y5 ^A +$= Y5 +y5 [ +y4 y4 C +y4 x64 +y4 o4v +y4 o0K +Y4 o0+ +y4 i4r +y4 i4 +Y4 $1 +Y3 Y3 y1 +] Y3 Y3 +Y3 y1 Y3 +Y3 i7- +Y3 *35 +y2 x42 +Y2 p1 x07 +Y2 o4d +Y2 ^L +y1 Y3 Y3 +Y1 p1 'B +y1 o67 +Y1 o5c +Y1 i6X +$. Y1 D1 +$x Y1 t +^X $x +$x ^X +$x t Y1 +^x sxl $m +^x $m sxl +$x $d +$x $c +x84 +^# x62 +$. x61 +x51 y5 t +x51 t y5 +x43 R3 +x41 $1 +x31 k +x25 z1 +x24 o73 +x16 z2 t +x16 t z2 +x14 t +x12 d x04 +x08 p2 +x05 z3 +x03 Y3 Y3 +x02 +5 +$w Z2 [ +$w [ Z2 +$w Y1 +$w i3s +^w $a +^W +$v $V +^v svM $M +^v $M svM +^v $$ +$u Z4 Z4 +u Y1 +u x34 t +u t x34 +^u ^s +u o1R +[ u ^K +u $A $a +^u $1 +t y4 +^t ^w +t sD4 +^t ^S +t p2 xB5 +t o3X +$t ^l +^T ^B +T8 T2 +T5 o7o +T5 i7! +T4 i1& +T4 i0/ +^T *31 +$. T3 +T2 T8 +T2 $1 +T0 o4D +sXA y2 +sw* +sv! +srf +^s o1p +so! +sL* t +^s i1p +^s $h +sD* t +sdn +sC* t +sCf +sA- +s6V { +s6O +^s *65 +s51 +s25 +s2% +^s ] +r z5 Z3 +r Z3 z5 +r Z3 y5 +r y5 Z3 +^R $r +$r ^R +^r ^M +r l { +r { l +^r ^j +r i26 +r c $! +r $! c +[ R8 R8 +^r +3 +R0 i4$ +r -0 +$R +^q z3 +$. $q +^q ] +^p ^t +^p ^j +p3 '9 +^P *32 +p2 ] Y3 +p2 x5A u +p2 x38 +p2 u x5A +p2 t r +p2 r t +p2 $3 +p1 y2 t +p1 t y2 +p1 t *67 +p1 t *57 +p1 o6@ ] +p1 ] o6@ +p1 i6a +p1 D6 c +p1 c D6 +p1 c -5 +p1 'A *54 +p1 *67 t +p1 -5 c +p1 *57 t +p1 *54 'A +p1 ^2 +^. ^p +$O Z2 +$O oA* +^o ^I +oB8 D8 +oA3 c +$ oA* +o9n +o9I Z1 +o9h +o98 Y2 +o90 +o8k +o8A +o7v +o7$ *03 +o6 Z1 Z1 +o6_ Y3 +o6r +o6Q ,7 +o6) C +o5V { +o5s i6h +o5i +o5c +o5b +o5a +o51 l +o51 *53 +o50 +] o5% +] o4x +o4n +o49 T2 +o4- .3 +o4. $. +o3f +o3a *64 +o3- +o2y +o2W ,7 +o2w ,7 +o2G u +o2g t +o27 +$! o21 +o1Z .3 +o1) Z1 +o1y C +o0p +o0m +2 +o0j *64 +o0d Y3 +$! o0d +o0* c +o0* { +o0- { +^n $w +^m z2 +^m z1 +^m ^t +$M $m +^m L1 +^m $h +$M ^1 +$l Z2 +} l z2 +l srR +l sab +l o7? +l o3. +^L i1u +l .A +L7 *75 +L7 *57 +L4 i1d +L4 +] L1 +K Y2 C +K x81 +[ ^K u +K t d +$K ^k +k i48 +K i2k +K i1j +K d t +K C Y2 +^K ^5 +k *32 +$- $k +^k +^j $W +^j ^s +$j $r +^j ^n +^J D7 +$! ^j +$I $T +iAs ^S K +iAs K ^S +iAd iBu +iA1 +i9s ] +i8! +2 +i8. +i8- +$) i8( +i7o ,6 +i79 +$. i7. +i6- Z2 +i6y +i6X Z1 +i6S Z1 +i6d +i6 +i5v [ +i5r +i5J x13 +i5F +$. i55 +i5@ +i5, +i5 ] +[ i5= +i4, Y5 +$. i4x +} i4i +i4e ^d +i4 .3 +i3F '8 +i3- +i2n ,9 +i2M l +i2k K +i23 ^a t +i21 +] i2- +i1W ,2 +i1r +i1h q +i1f +i1c +i11 $3 $. +i0q ^w +i0j ^m +i0H z1 E +i0c +i0a ^l $1 +i0a $1 ^l +$h $b +^H *32 +^g ^r +$g i2j +^g i1t +^G +$F p5 $B +^F $M +^f ^l +$f $b *10 +$f *10 $b +$f +^e ^w +$E ^V +E T3 +E q Z1 +E o6Q +E iA# +^e $E +E D4 $7 +^e ^9 +E $7 D4 +d y1 u +d x73 ] +d ] x73 +d u y1 +d u $s +d u i67 +d u +8 +d u *57 +d t $A +d t .5 +d o0h +d i8; +d i7@ +d i67 u +d i50 +^d ^h +d c $5 +d +8 u +$; D7 +D6 $? +d .5 t +D5 $r +d $5 c +d *57 u +D4 o2h +D4 o0D +$! D4 +D2 ^y +D2 $= +$. D1 Y1 +D1 t +D1 ^9 +$d $1 +c $? Z1 +c Y2 Y4 +c T7 ] +c ] T7 +C sI1 +c p1 x03 +c o6Q +c o5M +^C i0T +c D4 $2 +$c ^d +^c ^b +c +A $1 +c ,9 $1 +$c ^9 +c $2 D4 +c $1 +A +c $1 ,9 +c $% +] ^c +^c $@ +^B Z1 +^b $t +^B ^A +^b ^a +$B *9A +^A z2 ++A t +^a o1z +^a ^G +^a d +^a ^C +^a ^8 +^a $7 +'A $2 +$@ ^A +$- $a ++9 i1m +'9 ^a +$9 ^6 +$9 $3 +$9 $0 +$. -9 +,8 o3a +*89 $. +$8 $9 +*86 l +-8 $* +$7 ^X +,7 i7u +$7 $8 +$% *78 +-7 ^4 +$. $7 +{ -7 +$6 $x +*68 $) +*64 +5 +*62 R6 +,6 +-5 o6i +$5 i42 +*58 L8 +*57 o3e +*57 L5 +*54 ^7 +$. *54 +*53 Y3 +*53 o5z +*50 D5 +$5 [ +,4 u p1 +,4 p1 u +,4 o6t ++4 o0M +,4 i4x +$4 E +*42 $p +*40 ^L +[ $4 +-4 $. +^. -4 { +$3 Y4 Y4 +,3 i1g +,3 d 'A +.3 D2 +^3 ^8 +*34 ^e +*32 $S +^+ *32 +$3 ^! +$. $3 +$2 Y3 Y3 +$2 o0k +$2 $M +,2 *63 +*25 y2 +*23 k +$2 $3 +*21 o5l +^1 ^r +$1 ^O +^1 i1e +$1 $E +^1 ^d +$@ *1B +^1 ^A +$1 $8 +*16 $! +$1 .1 +,1 -0 +$1 $. +,1 +^* $1 +-0 ^Z +-0 t p1 ++0 T2 +-0 p1 t ++0 o3z ++0 o3w +$0 i7_ +*07 .2 +*06 ^c ++0 *54 +*04 c +*03 o7$ +*01 x17 ++0 *12 +*01 $. $. +$# $$ +$* [ +$- $+ +^* $. +^( $) +^? $! +^! $* +^! $! +^` $` +$z $Z +^z ^l +$Z ^H +Z5 Z5 z2 +} z5 Z3 +Z5 z2 Z5 +Z4 Z2 +Z4 r Z4 +Z4 f K +} Z3 z5 +} Z3 z3 +} z3 Z3 +Z3 } z2 +Z3 Y4 +z3 x47 +Z3 o5, +Z3 o4& +$? Z3 +z2 Z2 p2 +Z2 o68 +z2 o1D +z2 i2Q +$? Z2 +] Z2 +Z1 o38 +z1 i1o +z1 i1J +z1 i1j +Z1 E T1 +z1 $a +$# Z1 +^Z $# +^z $. +^z $! +^# $z +$y Z2 +$y $u +^y ^f +Y5 Y3 [ +Y5 [ Y3 +y5 y1 u +y5 x75 +y5 x74 p3 +Y5 x23 u +y5 x03 +y5 u y1 +Y5 u x23 +y5 u } +y5 } u +Y5 r Z3 +Y5 *08 x53 +$= y5 +Y4 Y4 c +Y4 Y4 ] +Y4 ] Y4 +y4 x02 +Y4 i4r +y4 i4- +Y4 c Y4 +y4 *A3 +y4 $? +y3 Z2 l +Y3 z1 Y3 +Y3 Y3 z1 +y3 { Y3 +y3 o0q +y3 l Z2 +Y3 i4v +Y3 $A +y3 +Y2 Y2 c +Y2 } r +Y2 o4H +y2 o1j +Y2 c Y2 +y2 *52 $. +y2 $. *52 +y2 $. .2 +y2 .2 $. +y1 ^W +Y1 u d +Y1 o38 +Y1 d u +Y1 ^B +Y1 *69 +$= Y1 +$x x31 +xB2 i7i +x91 $U +x82 +$. x81 +x62 u +x62 i36 +x61 $? +x51 o0p +x34 u +x32 $C +x32 +x28 y2 +} x25 +x21 $= +x17 C z2 +x14 ^\ +x13 i1R +x09 z2 +x06 Y4 +x04 K +x02 $1 +$X +$W Z2 +^w i0p +^w $. +$v Z2 +u z5 y3 +u z3 y3 +u x52 t +u t x52 +u T1 +u p1 +7 +^u ^h +u 'A +t Y2 y2 +t y2 Y2 +t T5 T4 +t T4 T5 +^t $T +t sL* t +t $S +t p5 +$t oB1 C +^t ^J o1R +^t i0k +^t $h +$t C oB1 +T9 T2 +t ,9 +T6 o0$ +T6 i47 +T5 o6_ +T5 o4Z +T5 o0M +T5 $l +T3 i8W +T3 i2H +[ T3 i0N +T2 o5a +T2 *36 +$. T2 +$! T1 +t $1 +T0 ,1 +^s ^z +syi +^s x51 +sS* t ] +sS* ] t +$S ^s +$S R9 o7( +soe +$S o7( R9 +smM +sK* +sdt +scf z5 +saT +sai t +} s7$ +^s *30 +s2^ q +s2g +s-1 p2 +$. s19 +^S +s-. +^r x41 +r p1 E +RA K +R6 R6 D7 +R6 D7 R6 +R3 x42 +R3 o2e +R3 i3$ +R1 t K +R1 R1 +R1 K t +^r +q sqa +q *65 *12 +q *12 *65 +$q *05 +$p $k +p5 'A +p4 Z1 +p4 ^u +^, p3 x86 +p3 l } +p3 } l +p2 x84 u +p2 x64 u +p2 x57 t +p2 x12 { +p2 u x84 +p2 u x64 +p2 t x57 +p2 p4 +p2 *74 +p2 ] +p1 y3 u +p1 x72 q +p1 x34 t +p1 u y3 +p1 t x34 +p1 t ^A +p1 o0K +p1 i7- +$P +^P $! +$o Z1 u +$o u Z1 +oAa l +oA5 T0 +oA4 ] +oA4 +o9q +o9O u +o9a $A +o8! Y1 +o8p +o8% -0 +o7y t +o7w +3 +o7v Y1 +o7% T5 +o7p [ +o7d +o75 $! +o73 ] +o6) t +o6s +o6m +o6@ k +o6. *41 +o5+ Z1 +o5r L5 +o5l K +o5K *51 +o5B K +o5A c +o59 ,4 +$o *57 +o55 +7 +] o5! +o4y L6 +o4u +2 +o4/ T5 +o3Y C +o3w *30 +o3v +o3R x12 +o3r +2 +o3h +o3d Z2 +o3b K +o3$ +o3@ +o2z $1 +o2x +o2U c +o2r *02 +o2k +o2F +0 +o2c +o24 +o1Y C +o1s ] +] o1s +o1R R5 +o1k +4 +o1e o2g +o1e ,2 +$. o1e +o1d -2 +o1c .6 +o1b +o19 $. +o14 +o13 +o12 +o10 +o0z o2c +o0w k +] o0W +o0T ^Z +o0T T4 +o0T -5 +o0t *20 +o0p *21 +o0o ^n +o0L u +o0h o2l +o0f D3 +o0d k +o0D +$! o01 +$N $Z +^N ^R +^n $N +$n $m +^n ^m +^N l +$! ^N +^m y1 C +$M ^m +$m $g +$+ ^m +$l Z3 +$L Z2 +l i82 +$l $i +L7 o2z +L6 o0t +l *68 +L5 *85 +L5 *58 +^l $. +$k Z2 k +K Y2 t +K t Y2 +K t p1 +K q z5 +K p1 t +K o75 +K o6i +K l d +k l .3 +$k k Z2 +$K $k +K i3k +k ^h +$K E $b +K d l +^K $d +$K $b E +K $4 +k .3 l +K $3 +k .1 +^K $! +^$ $K +k { +$J ^j +^j i0w +^j $d } +^. ^j +$i x51 +^I l +^i i0V +iA# c +$! i9! E +i9a +i9 +i8% T1 +i8_ K +i83 +i7X o8D +i7M *53 +$@ i7i .7 +i79 -3 +i73 +i6. z1 +i6X Y1 +i6l *13 +i6j +i6 i1 +i6A u +i66 +i64 -7 +i6% $1 +i6% [ +i5s -7 +i5n $A +i5j -4 +i5h +] i5g +i5c *25 +i51 ,6 +$! i5# +[ i5% +i4t i4@ ,5 +i4t -2 +i4r T6 +i4r +i4b +i4 *64 +i4( ,5 +$! i44 +i42 +i3x i5z +i3% T2 +i3s ^f +i3N -5 +i3L x53 +i3b +5 +i39 $. +i38 x71 +i37 +] i2z +i2t T3 +i2K o2w -7 +i2K -7 o2w +i2i x63 +i1N C +i1c ^a +i1A y2 *30 +i12 *7A +i0y $y +i0l i1s +i0h +i0f i08 +i0e i2c +i0C ^L +i06 x03 +^H ^N +^h ^C +$H $1 +^H $1 +^g z1 +^G ^S +f Z2 .3 +^f $z +f Y3 k +f x82 u +f u x82 +f k Y3 +^f i16 +$F i0S +$f $g +^f $g +f .3 Z2 +$f $1 +E Y4 +^e p4 ^J +E p2 x0B +E o6{ +E o5S +E o2y +$! E i9! +E i7( +^e i0C +E *87 $1 +^e *45 +^e $4 +E $1 *87 +$E $1 +] E ^1 +$E +d y2 t +d Y1 t +d x45 u +d x23 u +d x12 t +d u x45 +d u x23 +$D u i59 +d u +7 +d u $2 +d t y2 +d t Y1 +d t x12 +d t o11 +d t ^1 +d t [ +d [ t +d o11 t +$d ^K +d i7; +$D i59 u +d i0e x04 +$D $d +d c 'A +DB +d 'A c +$D $a +D8 x51 +] D8 +d +7 u +D7 T0 ^1 +d +7 r +$@ D5 +d -5 +D4 i2@ +D3 y3 c +d $2 u +D2 t $* +D2 $* t +D2 $1 +d ^2 +d ^1 t +D1 i6/ +D1 E +} D0 +^c $v +$c ^u +C t o6* +c q Y1 +C o6* t +c o3x +C o0G +C i9L +c i7( +^C i1B +$C D5 +c D3 $7 +$c $d +c $7 D3 +c $2 Y1 +^c $0 +$. ^c +$c +$b Z2 +^B Y1 +^b ^u +$b ^m +^b $h +^b c ^H +^B ^a ^1 +*B9 *35 +$b ^9 +$B *40 +$b *30 +$B $1 +$a Z5 Z3 +$a Z3 Z5 +$a $z +$a Y2 +] $a Y1 +$a x93 +$a $q +$a $n +$a ^j } +^a i16 +$a $i +^a ^H +*AB +^a $5 +$a $3 +$. -A +$. ^A +$! $a +^a $+ +^- ^a +^9 t ^A +$9 ^A +$9 [ +^9 $' +$8 D0 +$_ *8A +*87 x02 +*87 $% +$% *87 +$. -8 +$7 ^S +-7 o65 +-7 o6 ++7 +9 +*78 $% +*78 $. +$7 ^6 +^7 *56 +*75 $@ +*73 $. +*71 +{ +7 ++6 p1 'A ++6 o82 +,6 i7o ++6 i4H ++6 d [ +$) *68 +*67 x13 +-6 *43 +*63 *14 +*61 +^6 ^0 ++6 $. +^! .6 +,5 p1 { +,5 { p1 +,5 o41 +.5 o3D +$5 i6s +^5 i0d +$5 ^e +*57 $o +*56 +*54 ^s +$5 $4 +$5 ^4 +*52 o5v +*52 -5 +*52 +*50 x23 ++5 ^! +.5 $@ +-4 x51 *34 +^4 x12 +,4 o1G ++4 o10 +-4 $c $e +*46 *53 +*45 ^7 +*45 $. +.4 *43 +,4 *35 +-4 *34 x51 +*43 $0 +$4 ^1 +*40 $B +*40 $. +$4 $! +$4 ^@ +$^ ^4 +-3 Y1 +,3 o0v +.3 o02 +-3 i3 +$3 $D +*37 +3 +*30 i7# +$3 $! +^@ $3 +$2 x51 E ++2 o0M +-2 i2S +.2 i2a +$2 E x51 +$2 ^e +$2 [ c +.2 *70 +*26 R6 +*25 *60 +*23 y3 +*20 +$. -2 +$1 Z3 +$1 Y2 +-1 Y1 +$1 $X +^1 $X +$1 $S t +$1 o7k +-1 o5a +-1 o3z +$1 o0Z +$1 ^L +$1 i7_ +.1 i2o +$1 ^A +$! *16 +*14 o4- +*12 +,1 *14 +$1 $* +$. ^1 +] $1 +^1 $# +^* ^1 +.0 ^Z +-0 o4S +-0 o2w ++0 o2E +.0 o2, ++0 i6T ++0 i67 +$0 ^d +*05 $q +*04 ^L +$@ *02 +$! *02 +.0 +1 +$0 $+ +$0 $! +$_ $- +$= ^- +[ $, $. +^# $# +^$ $$ +^, ^. +^- +$z $p *70 +$z L7 +$z i0y *80 +^z $h +Z5 Z2 +Z5 Z1 u +Z5 u Z1 +$* Z4 +^z +4 +Z3 Z4 +Z3 Y3 +z3 x0B +Z3 u r +Z3 s15 +z3 r y5 +Z3 r u +Z3 o7- +Z3 o56 +Z2 Z4 +z2 Z2 +$ Z2 k +Z2 i7B +Z2 i7% +$! Z2 D9 +z2 *60 +Z2 $@ +$` Z2 +^# z2 +z1 y4 y4 +Z1 u d +$$ Z1 T1 +z1 o67 +Z1 o3N +Z1 i9@ +z1 i7B +Z1 d u +Z1 $b +Z1 *69 +Z1 $1 +Z1 -1 +$ Z1 +$# ^Z +$z [ +^y ^w +y5 z1 t +y5 x42 +Y5 x32 K +y5 x12 +y5 t z1 +Y5 s83 +y5 o5p +y5 o1v +Y5 K x32 +y5 +5 +} } Y5 +Y4 y2 +Y4 x72 +y4 x52 +Y4 o8g +y4 i4E +y4 i4b +y4 D4 +Y4 C +Y4 { { +y4 $. +Y3 Y3 t +Y3 Y3 E +$+ Y3 Y3 +y3 x62 u +Y3 x61 +y3 x53 o0s +y3 u x62 +Y3 t Y3 +y3 o0s x53 +y3 i3y +y3 i3, +Y3 E Y3 +y2 Z1 E +y2 y4 u +Y2 x71 $. +Y2 $. x71 +y2 u y4 +Y2 s1? +Y2 o8. +y2 o1o +y2 o1D +y2 E Z1 +y2 '6 Y2 +Y2 *25 +y2 *04 +^* Y1 y1 +^* y1 Y1 +y1 o27 +Y1 i8. +y1 i1J +Y1 -3 +Y1 $* +x92 +x62 E +x62 $@ +x61 o3p +x61 i38 +x53 o3M +x52 o6k +x51 o2@ +$. x51 i5y +x45 i4i +x43 o3f +x42 i5p +x42 i3j +x42 i2f +x42 $1 +$* x42 +[ x42 +x41 $ +x32 t +x31 ^x +x28 +x26 u +x24 Y2 y2 +x24 y2 Y2 +x24 p4 l +x24 l p4 +x23 y2 +x21 y5 y5 +$x $2 +x19 Y2 C +x19 C Y2 +x18 C +$! x13 c +x13 *34 +x12 i6X +x12 $C +x09 z1 +x03 y4 y4 +x03 i1Y +x03 i1t +x02 f +x02 $. +$. x01 i0b +$! ^x +^w ^W +$W o6W +$w $l +^W ^D +] ^v +[ $v +^u ^x +u TB +u sE* t +u R6 t +u p2 x86 +u p1 x42 +u p1 ,8 +u p1 +6 +u o5D +u $M +u K d +u i79 ,7 +u d x53 +u d ,7 +^u $c +$U ^A +$U +$u +^u $# +t z3 y3 +t z1 +t y4 x62 +t x82 +t ss3 +t sa1 +^T ^S +$t ^s +t p1 $J +t o6D +t o2Y +^T ^K +t i7 +t i1J [ +t d o67 +t D8 ] +t ] D8 +t D8 +t D6 +t .A +T9 ^U o01 +T9 T5 +T8 o70 +t ,7 +T6 i5h +T5 i4@ +T5 $7 +T4 Z4 y5 +T4 y5 Z4 +T4 o0T +T4 o0L +T4 $5 +T4 $$ +T3 T2 +T3 o59 +T3 i7K +T2 o4f +T2 o1M +T2 *63 +$@ T2 +$$ T1 Z1 +T1 o6M +T1 o0$ +T1 i7$ +T1 i4h +^T *13 +T0 q +T0 $* ^! +T0 ^! $* +$T +sy" +$s x31 +$s ^X +sua +stR l +$s $t +^s t +ss8 E +sS3 l +^S $s +^s ^p p4 +spP +^S p1 +^s ^] o0G +so0 +sMg } +sm* +^s ^J +sj* +^s $j +sio +si1 o6@ +sgW +seu +$s ^e +^s ^B +saB t +sa4 +sA1 l +sA* +s9z +s9s y2 +s8@ +s&7 +s52 +^s ^4 +s32 +$. s25 +s24 +$S $2 +s1G +s10 Z3 +s0O +s0- +] s0) +$* ^S +^S $@ +^S $. +^r y1 E +r x0A r +r p2 x0A +^R ^L +R5 R5 '6 +R5 o1R +R5 '6 R5 +R4 +R2 o6h +R2 *26 +R1 t +$. ^r +q x21 t +q t x21 +q t -5 +$q r +$Q $Q +q q +$q i5w +q E $1 +q -5 t +q $1 E +$P Z4 Z4 +$P ^p +^p ^n +^p ^M +^P ^K +^p i1k +p5 y3 C +p5 Y3 $! +p5 ] ] +p4 i4i +p4 $d $f +p3 i0T +p3 f +p3 '8 +p2 Z1 x68 +p2 x79 u +p2 x68 Z1 +p2 x3A u +p2 x05 q +p2 x03 +p2 u x79 +p2 u x3A +p2 T0 '9 +$- p2 'B +p2 'A .3 +p2 '9 T0 +p2 *47 +$p *24 +p2 .3 'A +p1 Z4 } +p1 x83 t +p1 x43 u +p1 x31 u +p1 u x43 +p1 u x31 +p1 u o0M +p1 u i82 +p1 t x83 +p1 t o63 +p1 t K +p1 t i82 +p1 t +A +p1 t *81 +p1 t *75 +p1 ^t +p1 oAA 'B +p1 o63 t +p1 o0M u +p1 K t +p1 i82 u +p1 i82 t +p1 i7A +p1 i6v +p1 i6k +p1 i50 +p1 'B oAA +p1 +A t +p1 *81 t +p1 *75 t +^o ^N +oB1 +oAi +oAe u +oAa $1 +oA@ +o9s +o9k +o93 +o8u +o8t +o88 x93 +o81 sa4 p3 +o81 p3 sa4 +o81 $* +o7% Z2 +o7x .6 +o7l +o7j o2y +o7j +o7I Z1 +o7H Z1 +o7g +8 +o7e +o7b +o76 +o6z +o6x .7 +o6* t D0 +o6s $1 +[ o6p +o6p +o6L *70 +o6L *64 +o6E ,4 +o6* D0 t +o6d +o6a +o69 $! +o5W x23 +o5s +3 +o5- o2- +o5L +9 +o5g +o5f +o57 y1 +o5$ *75 +o5; +6 +o51 R6 +o5+ +o4y +o4t +6 +o4I y5 E +o4i x54 +o4f +o4c +o4b +o4a $s +o4& ,3 +o4@ ,2 +o4- +2 +o3z x42 +o3* z1 +o3y +o3x E +o3X c +o3m *03 +o3K *74 +o3a $1 +o2y c +o2@ Y4 E +o2w -0 +o2u E +o2t +o2o +o2n *02 +o2M l +o2k *75 +o2@ E Y4 +o2C *31 +o2b L5 +o25 +o2, .0 +$. o1y +o1w *53 +o1v +o1u D3 +o1U c +$. o1u +o1p *23 +o1o ] +] o1o +o1n *36 +o1M T2 +o1L sLe [ +o1L [ sLe +o1i c +o17 z1 +o14 Y5 +o13 .3 +o11 x42 +o1- +o0) Z1 +o0w z2 +o0w $W +o0v -5 +o0u *23 +o0s $S +o0S o6f p3 +$! o0S +o0r +o0M $3 +o0l +$. o0k +o0j -9 +o0G u +o0g t +o0C i0F +o09 ^0 +$O +^n o1s +{ { $n +$M x41 +$m $u +^M o6f +$m $k +$m i7_ +$m *32 +^m $1 +} ^m +l Y2 y2 +l y2 Y2 +$l u +l sa1 +l oAa +l ^N +l ^i +$L *A5 +$L *5A +^L *51 +l *45 +L2 +L1 o5v +L0 -0 +[ $. ^l +[ ^l $. +$ k Z2 +k y4 y4 +K t ] +K ] t +^k ^T +k t +K srb +K smk +k s1 +k o6@ +K o3c +K o1k +K o0f +$k ^M +$k $l +K k +$k $K +$k ^K +$k $j +^K i0P +^k ^f +k D0 $a +k $a D0 +K -3 +K *21 +k *21 +] K -1 +K ] +^j x14 +$j i3- +$j $g +^j ^g +$i u +^i ^T +^I $H +^i ^D +iAa +i9L t +i91 +i9. +i9- +i7# x23 +i7- x14 +i7c l +i7( c +i7. .6 +i6n *12 +i6- K +i6k ] +i6. i9. +i6f +i6B z1 +i6* +$* i6* +i5T C +i5S u +i5s +i5 D1 +i5a [ +i58 $s +i58 ^a +i58 ,6 +i5@ ,6 +i54 $d +i51 $! +i5_ +$# i5@ +$@ i5@ +i4y x62 +i4y $1 +i4v $x +i4t x03 +i4s T6 +i4p Z2 +i4g $s +i4e ,2 +i4D +1 +i4B T5 +i4a $A +i49 .3 +i4- ,7 +i46 *75 +i4- ,5 +i44 +i4@ +i4, +i3y x61 +i3y o4- +i3y D6 +i3x $f +i3U R7 +i3* t D4 +i3q $b +i3q ] +i3j x52 +i3i +i3* D4 t +[ i3d +i3A -0 +i3= .2 +i31 +i3@ +i2x i6s +i2s i05 +i2p *43 +i2h x52 +i2g +i2f *03 +i2d ^6 +i2- ] +i1T *65 +i1s ^g +} i1 i0n +i1h +i11 $s +i11 +i1, +0 +i1? ^? +} i1@ +i0X s0X +i0r ^w +i0R ^J +i0h i4s +i0A Y2 p3 +i0A $d +i0a $0 +i08 ^e +i02 i13 ^% +i01 ^A +i0} +0 +i0# +i0$ +$h Z2 +^h y1 +^h ^J +^g y1 $0 +$g $v +$g t +^g ^t +$G o6g +$g $k +$g $b +^g $0 y1 +$@ ^G +f u -6 +f t -7 +f s9_ +$f ^l +^f ^j +^F ^G +^f ^F +$f ^f +$f ^C +f -7 t +f -6 u +f *13 *04 +^f -1 +f *04 *13 +] ^f +E y5 y5 +^e ^T +E s03 +E o13 +^e ^l +$e i5a +^e i0S +^e ^D +^e ^a +E *87 Y4 +E $ $5 +E *24 $1 +E $1 *24 +E } } +E ] ] +[ E +$# ^e +$d Z1 t +d y3 t +d x71 u +d x63 +d x07 x81 +d u x71 +d u o72 +d u +9 +d u +5 +$d t Z1 +d t y3 +d t i81 +d t i01 +d t ^D +d t *75 +d t -6 +d t $5 +d t $0 +^D ^T +d o7m +d o72 u +d o62 +d i81 t +d i8@ +d i7m +d i6 +d i4E +^d i1r +d i01 t +^d ^E +d 'A +5 +DA +d ^a +d +9 u +D8 R8 R8 +D8 $1 +D8 $0 +d *75 t +d -6 t +D5 y5 E +d +5 u +d $5 t +D5 i3r +D5 $C +d +5 'A +D5 $1 +D4 o6s +D4 o1V +D3 o5@ +D3 o0' +D3 k d +D3 $@ +^D ^3 +D2 ^z +D2 ^g +$= D2 +^D $1 +d $0 t +D0 -2 -2 +c $+ Z1 +c Z1 +c y4 y4 +C Y2 Y4 +C Y1 T1 +$! c x13 +C T1 Y1 +c ss8 +c q Z1 +^C ^P +c oA2 +c o2u +c o0! +^c ^k +c iA# +C i7@ +c i6, +^C ^H +C $6 Y1 +^c -3 -3 +^c *17 +c [ +$b r $9 +^b ^M +^b ^m +^B i0B +$b $g +^b $D l +$b ^8 +$b ^7 +'B $1 +^b $! +$A Z5 +$a x41 +$A u +$A $s ++A i7 +^a i1k +$a ^e p4 +*A9 $B +$_ *A8 +$A ^7 +$a ^4 +$@ -A +$* $a +$9 Z3 +$9 i0E +$9 ^8 +*97 -9 ++9 +7 +$9 $6 +$9 ^@ +.8 i6W +,8 $9 +$) *86 ++7 o6n ++7 o4# ++7 i6D +^7 ^f *15 +$7 ^3 +*72 i4w +$. -7 *05 +$@ .7 +$@ -7 +$! ^7 +-7 $. ++6 R6 t +$6 ^P +,6 o8. +.6 o3F +-6 i4k +*68 *97 +*65 k +*63 ,2 +*62 *04 +*61 o0# +^! +6 +^5 z4 +^5 y4 y4 +^5 $s +.5 o4h ++5 o3p +,5 o0Y +,5 o0L +-5 i2N +^5 $d *23 +,5 -8 ++5 *64 +*54 i6 ++5 *42 +*53 *64 +*53 .4 +^5 *23 $d +*52 *06 ++5 +1 +.5 ^! +^5 $! +^5 ] ] +^, ^5 +^4 z5 +$4 Z3 +,4 o0$ ++4 i61 ++4 i4a +$4 ^8 +*45 l +*42 *13 +$4 $2 +$4 ^2 +*41 *52 +] $4 ++3 o1- +.3 o0p +-3 i4J +$3 ^7 +*36 T2 +*35 -0 +*34 $0 +*31 i1` +*30 o0p +$2 T7 +$2 T4 +$2 ^s ++2 o3u +$2 ^E +$2 $8 +*27 o0z +*27 $. +*26 o5R +*24 $p ++2 *46 +*23 o4$ +*21 i2d +*21 ^H +^2 $1 ++2 *05 +$2 $0 +,2 .0 +$& ^2 +$@ +2 +^2 $@ +$1 Z3 t +$1 Y1 +$1 x82 +$1 x64 +$1 x62 t +$1 t Z3 +$1 t x62 ++1 t p3 +^1 $Q ++1 p3 t +$1 oAi +.1 o4# +$1 o2v +^1 $O +] -1 K +$1 i6s +$1 i0. ++1 D0 +$1 $9 +*17 $A +*17 +*14 +4 +*14 *36 +*12 o0t +*12 *45 +*12 ^+ +*10 *12 ++0 z1 $f ++0 y2 y2 +-0 o9^ ++0 o3, +-0 o2p +-0 i2n ++0 $f z1 +*06 *52 +$. *05 -7 ++0 *43 +*03 *12 +*02 o1X +*02 *64 ++0 *23 +*02 $! +.0 ,2 +$@ +0 +$. +0 +$- $0 +-0 $@ +$* $. +$. { +$; +$- ^. +$ $. +^+ $* +^@ $$ +^z ^y +$z $s +$Z r ^z +$z p4 o1u +^z ^j +^z $c +$z *70 $p +z5 z3 +z5 x48 +Z5 u o58 +Z5 o58 u +Z5 o0G +] z4 K +Z4 *61 +$+ Z4 +z3 x3B t +z3 t x3B +z3 s8 Z3 +Z3 s10 +Z3 k +5 +$. Z3 k +Z3 +5 k +z2 y5 y2 +z2 x39 t +z2 t x39 +z2 s.V +z2 ^R +Z2 o8. +Z2 o7% +z2 o1j +Z2 l +Z2 [ k +z2 ^H +z2 E ^1 +} z2 E +Z2 $@ -8 +Z2 -8 $@ +z2 *40 +1 +$. Z2 -4 +z2 +1 *40 +$$ Z2 +$= Z2 +^. z2 { +z1 Z4 +Z1 u $3 +Z1 ^Q y1 +Z1 p2 x86 +Z1 o5c +z1 o27 +Z1 o0) +Z1 i6X +Z1 i6S +z1 i0t +z1 ^B y1 +Z1 ^B +Z1 $9 +Z1 $5 +Z1 $3 u +$_ Z1 +^! z1 +$Y ^y +^Y $y +$y ^l +y5 y1 t +y5 x92 +Y5 x46 +y5 t y1 +y5 o5s +y5 o5b +y5 i5; +y5 i5- +Y5 *69 x76 +y4 x65 +y4 x41 +y4 x09 C +y4 i4y +y4 i4i +Y3 Y2 +B +Y3 sMd +y3 scf +y3 r x41 +y3 o3f +Y3 i8g +Y3 *75 +Y3 *57 +Y3 *40 [ +] Y3 *34 +y3 +2 +Y3 $1 +Y2 $z +y2 y5 y2 +y2 y4 E +Y2 Y4 +Y2 Y2 y1 +Y2 y2 t +Y2 Y2 D2 +Y2 y1 Y2 +[ y2 u +Y2 t y2 +y2 s9s +y2 s63 +y2 p1 x06 +y2 o2x +Y2 o1c +y2 ^k +y2 i4_ +y2 i2q +Y2 i0a +y2 E +Y2 D2 Y2 +y2 *74 +Y2 +6 +y2 *34 +y2 +0 +Y2 $$ +$. Y2 +$* y2 +$ y2 +y1 u { +y1 { u +Y1 t p4 +Y1 p4 t +y1 p2 -8 +y1 o4l +Y1 o3N +Y1 o1) +Y1 o0) +Y1 i6M +Y1 i4d +$) Y1 E +$@ Y1 c +y1 $a Y1 +Y1 $A +Y1 $8 +Y1 [ +$/ Y1 +$, Y1 +^+ y1 +^@ y1 +$x $z +^x y3 +^x ^s +^x p1 c +$x $l +xB2 i8i +xB2 $1 +xA1 $1 +x91 o0D +x83 +x82 x53 +x73 o5H +x72 $2 +x63 $ Z3 +x63 i2, +x61 Z1 +x61 Y1 +x53 i3S +x53 [ +x51 Y3 +x51 x24 +x51 $r +x51 i3y +] x51 +x43 y4 c +x43 i44 +x43 C $1 +x43 $1 C +x42 x42 +x42 o3. +x42 o1u +x42 i2M +x42 -2 +x32 i6 +[ x32 +x31 ^a t +$! x31 +x25 y2 +x25 y1 +x24 i1x +x23 y4 +x23 *20 +x21 y3 +x21 o6n +x21 d x04 +$! x21 +x17 z2 t +x17 t z2 +x17 C +x16 z2 +x15 C +x13 p2 '9 +x12 K i2j +x12 i2j K +x09 y1 +x08 -2 +x06 p5 +x03 Y1 +x03 i3x +x02 ^K +x02 *56 +x01 o1u $2 +x01 i0a i1r +x01 $2 o1u +^x $. +^w z3 +$W ^w +$w $r +$w $e +} ^w +^V Z3 +$v Z1 +^v ^w +^v ^t +$v i3s +$v $g +^V ^D +u Y4 +u Y2 Y4 +[ u y2 +^U ^Y +$u ^u +u sO0 p3 +u sB* t +u sA& +u r z3 +u R3 t +^u ^q +u p3 sO0 +u p1 x93 +u p1 x67 +^U o1b +u o11 +u i6M +u i1E +u i0B z5 +u D5 $1 +^u ^D +^U ^B +u $A Y1 +u $1 D5 +t Y4 Y2 +t y3 +t Y2 [ +t [ Y2 +$t ^u +t TA +t T3 +t s A +t s5i +t p2 xA6 +t o0G +t i7@ +^t i6s +t i5T +^T i0S +t ^F $C +t d x75 +t $C ^F +TB ^1 +$t $b +TA T9 +T9 $! +T8 T9 +$@ T7 +T6 $6 +$* T6 +^! T6 +T5 o4/ +T5 i3@ +T5 $. +T4 T5 $3 +T4 i4B +T4 $3 T5 +T4 $! +T3 T4 +T3 o8W +T3 o0C +T3 i68 +^t $3 +T2 T7 +T2 o1R +T2 i2- +T2 $* +T1 i2Y +^T ^1 +T0 i2m +T0 'A +$s y5 x54 +^s ^u +stT +ssz $2 +sr* t +$s $p +snx +sM[ y2 +smw +sM* +skK +siy x61 +siy $7 +siy +^S i1. +si! +^s ^h +{ ^s $f +^S E +sdD +^s ^d +sAZ .3 +sas +sab l +^S ^a +s9_ f +s9b K +s9# +$! s8F +s79 +s4v y4 +s36 +s24 $@ +s20 +s2@ +} s2! +s1D +s18 $. +s16 +^s +1 +s0 q +s0o +^s *03 +s0) ] +$* s0* +$r Z2 +^r $y +^. r x31 +r t +r p4 +r o7. +r o5s +^R l ^a +^r ^l +$r i4W c +^R i1S +^r i0y +$r D5 +^R ^a l +R7 o6# +R7 i6_ +R6 o51 +R5 i66 +R4 o38 +R4 i7p +R4 .3 +r $2 $1 +R1 z3 +R1 C +$@ r +^q z4 +$q Z3 R7 +{ $q Z1 +^q y1 t +^q y1 i39 +^q t y1 +q stb +^Q $s +$q ^s +^q $s +^q ^h +$q $9 +$q *50 +$Q $1 +^q $+ +^q $* +^p ^w +$P $M +^P ^J +$p i2y +p5 y3 t +p5 y3 l +p5 t y3 +p5 r +p5 oA6 +p5 l y3 +p5 +A +p4 $Z ^z +p4 ^z $Z +p4 sao +p4 l +p3 x8B t +p3 t x8B +p3 ^b ^j +p2 x98 u +p2 x79 t +p2 x75 t +p2 x6A C +p2 x5A *23 +p2 x0B x61 +p2 x05 C +p2 u x98 +p2 t x79 +p2 t x75 +p2 C x6A +p2 C x05 +p2 'B $m +p2 $a +$. p2 +9 +^P *23 +p2 *23 x5A +p2 $2 +$- p2 ] +p1 Z1 t +p1 y3 t +p1 Y2 u +p1 xB5 u +p1 x81 u +p1 x71 E +p1 x63 E +p1 x62 c +p1 x56 t +p1 x51 t +p1 x49 +p1 x03 t +p1 u Y2 +p1 u xB5 +p1 u x81 +p1 t Z1 +p1 t y3 +p1 t x56 +p1 t x51 +p1 t x03 +p1 t o51 +p1 t +p1 o7a +p1 o65 +p1 o61 +p1 o51 t +p1 o0m +p1 i4b +p1 ^h +p1 E x71 +p1 E x63 +p1 c x62 +p1 'A r +p1 $a +p1 ^8 +p1 *08 r +^P $@ +^p $@ +^o ^Y +^o x12 +^o ^t T0 +^o ^t +^o $o +^o ^m +^o i0B +^O ^G +oB9 +oB4 x03 +oB3 +9 +oAt +oAA u +$O *A6 +o9I Y1 +o9A u +o9a +o94 $. +o8. Z1 +o8f +o8d +o89 $. +o85 $0 +o85 +o80 +o7x -5 +o7v *23 +o7@ T3 +o7* T1 +o7t +o7s +o7q +o7n D2 +o7n +o7b t +o7. .6 +o74 +4 +o73 *65 +o72 $! +o7. $1 +o7+ +0 +o7? $! +o6w i2f +$! o6s +o6n +7 +o6k u +o6i -5 +o6h +o6d -0 +o6c +o6B x41 +o6% +9 +o69 +o6* ,7 +o65 K +o6. $4 +o6, $1 +o6[ $] +o5+ Y1 +o5* x32 t +o5x $1 +o5u +o5* t x32 +o5= T1 +o5s -3 +o5r +o5p o6e +o5p +4 +o5p +o5H x13 +o5c Z1 +o5a T2 +o5A E +o5a D6 +o5A $! +o57 $. +o56 i6. +o56 ,6 +o56 +o5@ ^2 +o5% ] +o5! ] +o4z -5 +o4 y5 +o4S sSz +o4o +o4, i44 +^. o4i { +o4f T2 +o4D T0 +o4c L1 +o4a $3 +o49 '8 +o49 *02 +o45 +o44 *74 +$! o43 +o4; ,2 +o4# .1 +o3y t +o3- y4 +o3. Y3 +o3* y1 +o3w $q +o3T +5 +o3p +o3o +o3N Y1 +o3m +o3. l +o3c +o3* ,4 +o2v -0 +o2r Z1 +o2P ,5 +o2G l $1 +o2G $1 l +o2e +o2b +o2a u +o1y t +[ o1x +o1w +o1S x53 +o1r *12 +o1P +0 +o1m D6 +o1K [ +o1I *53 +o1g *21 +o1f ^E +o1f +o1e +8 +o1e $3 +$! o1E +o1d .0 +o1C D7 +o1c +o1b D3 +o1a $@ +o17 y1 +o15 +o14 $= +$. o14 +o1- -2 +o11 T5 +o10 $! +o0z +7 +o0 z2 { +o0y +o0w u +o0V +o0T D5 +o0t { +o0S T4 +o0r +3 +o0q *46 +o0/ ^O +o0N +o0m y3 +$. o0L +o0K ^U +o0k *35 +[ o0K +o0h $1 Z1 +o0h +o0f $@ +^" o0c $4 +o0c .3 +o0c -3 +o0b ^s +o0A L4 +o0A +o08 +o07 +o02 .3 +o0# *16 +o00 T2 +o0! +^n E +^n c +$n $a +$m Z2 +^m x41 +$m $t stM +^m oAh +$m $n +^m ^n +^m i0U +$M ^h } +^m ^f +^m ^A +^m *02 +$l Z2 *01 +$l Z1 t +^l ^z +l Y5 x13 +l x13 Y5 +^l ^w +$l t Z1 +l T1 K +l se@ +l ^r +l K T1 +^l i1a +^L ^e E +L8 i20 +l *86 +L4 o0A +L4 { +l +4 +L3 i6g +$l *01 Z2 +^L +K z4 +] K z4 +$. k Z3 +k Y3 x43 +k Y2 y2 +k y2 Y2 +K x92 +K R9 +^K ^R +k ^q +K oAU +K o7? +$k o02 +^K ^M +$k $m +$K $L +K i5@ +$k i3t +k d i6q +[ k c +k *56 +K *03 +K $* +[ K +k $@ +k } +$j ^x +$j $o +$j ^l +^j $k +$J $1 +^j $* +^I p3 i1D +^i ^M +$I ^I E +^i i0y +$I E ^I +iA+ T8 +iA- +iA +i9s +i9a x63 +i9 $6 +i92 +i91 u 'A +i91 'A u +i8y +i8s .6 +i8n +i8m t +i8% K +i8i +i8% +i8( $) +i8. $. +i7& T1 +i7r +i7N *73 +i7n +i7m +i7K T3 +i7/ E +i7# *30 +i71 *04 +i7@ $@ +i6y x12 +i6y -0 +i6_ R8 +i6r +i6; o64 $. +i6; $. o64 +i6g L3 +i6E ^e +i6b +i6% +8 +i62 p2 x42 +i6@ $2 +i6_ $2 +i62 +i6@ +i6. +i5z $v r +i5x i3s +i5v $x +i5^ ^u +i5+ T1 +i5s *32 +i5r i3q +i5q *05 +i5P .6 +i5p *34 +i5p +i5n $8 +i5L ^W +i5k +i5c -0 +i5a +i5- .4 +i5 *30 +i51 $@ +i50 ,6 +i5 *03 +i5 $0 +i5( +i4' Y5 +i4. Y3 +i4w $s +i4* t +i4$ R0 +i4p $P +i4O ^I +i4n t +i4M *67 +i4L .5 +i4k o5l +i4k -7 +i4J .2 +i4i $x +i4h +i4e $2 +i4 C +i4b ^c +i48 $9 +i45 -1 +i45 +i4. $3 +i42 ,6 +i4& +i3z [ +i3y .6 +i3x $c +i3w +i3S x63 +i3S +7 +i3r D6 +i3r $5 +i3P *41 +i3 $m +i3l k +3 +i3l +3 k +i3k .1 +i3j +i3i c +i3g .2 +i3a ,1 +i3, -4 +i33 +i32 [ +i30 +i2z $/ +i2y +0 +i2y +i2W .1 +i2v ^j +i2t ^z +i2- T3 +i2t +i2s ^r +i2q $y +i2o .1 +i2j o4e +i2i } +i2h +i2g ,3 +i2f R1 +i2c *76 +i2C .3 +i2c $. +i25 $/ +i21 o52 +i1z ^X +i1w sle +i1V *65 +i1K k ^N +i1e ^E +i1a .7 +i19 ^A +i17 .2 +i15 +i10 ,2 +$- i1_ +i0z L0 +i0v ^m +i0t ^z +i0t ^s +} i0S $a +i0P ^T +i0e ^6 +i0a ^L +i0a $9 +} i08 +i04 i17 +i02 $D -0 +i02 -0 $D +i01 l +i0_ *04 +^h x61 +^h ^S +^h i1m ^o +$g $m +$G $f c +$G c $f +^G $1 +$g ^@ +^f Z1 z1 +^f z1 Z1 +f x98 K +f x74 +f u +{ $f ^s +^F o2G +f K x98 +f k +$f i66 +^F i11 +$f i0t +^f ^e +f c $1 +$f $c +^f ^4 +f $1 c +} E z2 +^e y1 r +$) E Y1 +E x71 +E x32 $9 +] E T5 +$* E T1 +^e $t +^e p4 y1 +E oA1 +^e L1 +$e i6c u +E i4t +^E i1r +E $A $1 +E $9 x32 +E $7 Y4 +$e *61 ^t +E ,5 $2 +$E ^4 o01 +E $@ $3 +E $2 ,5 +$e $1 +E $0 +$^ ^e +$d Z5 +d xA1 ] +d ] xA1 +d x91 t +d x02 u +d $W +d u x02 +d u ^S +d u o91 +d u ,B +d t x91 +d t i7O +d t -8 +d t *4B +d ^S u +d ^r ^R +d oBA +d o91 u +^D ^N +^d ^M +d i7z +d i6; +d i4r +^D i0J +^D ^G +d DA ] +d ] DA +d D3 ] +d ] D3 +^d D3 +^d ^c +d ,B u +} [ DB +$d $b +d -8 t +D8 ,7 +D7 c T4 +D7 $@ +D6 o9z +$? D6 +D5 $9 +D5 *25 +D5 *24 +^@ D5 +D4 o31 +D4 o1J +D4 ^f +d *4B t +D4 $3 +D4 $@ +D3 y3 +D2 +0 y2 +D1 $9 +$* D1 +D0 $3 +$= $D +^. ^d +^c ^z +[ c y3 +C Y2 [ +C [ Y2 +$@ c Y1 +c xA3 $1 +$C x12 +$c u $0 +C T9 +C T6 +] c T6 +C T4 +c s03 +C o92 +C o8# +c o2P +^c ^l +c K ] +^C ^J +c i5 +c i4 +c i2 p3 +^c ^E +c +B $! +c $! +B +C ^9 +$! c ,9 +c $1 xA3 +$c $0 u +$c +0 +{ C +^# ^C +c ] +^c } +^b ^y +$b u +^B $r +$B o0T +^B ^J +^B i1J +^B ^F +$B ^A +$B ^1 RB +$A Z2 +^a ^Z +^a Y3 +} $a Y1 +$A x81 +$a $v +$a ^R +^a r +$A o3s +.A l +$A K +^a ^K +$A iBa +$a i9A +^a i5s +,A i5, +^A i2C +$A i1h +} $a i0S +$A i0k +$A $G +^A ^F +^A d E +^a ^d +*A8 +^a +8 +$A ,7 +^a .5 +$* ^A +} $A +^! ^A +$a $. +[ $a +^@ $a +^! $a +$9 Z1 E +$9 Z1 +$9 o0P +^9 i34 C +$9 i0u o09 +$9 E Z1 +^9 C i34 +$9 $c +$! ,9 c +^9 $a ^5 +*98 o8B ++9 -8 +^9 ^5 $a +$9 $5 +$9 $. +$8 Z2 +^8 p1 +-8 o9p +$8 o8a +$8 i59 +-8 $A ++8 $9 +*89 +$. *82 ++8 $/ +-8 $/ +$7 Z2 +'7 ^s ++7 o3q +-7 o3# +,7 o2w ++7 o2f ++7 o0z ++7 i8e +,7 i8e +.7 ] -7 +.7 -7 ] +*76 E $! +*76 $! E +*75 i0a +*75 +$@ *75 +{ *73 *B3 +-7 *32 +$7 $3 +^7 ^2 +*71 o6b +^7 ++6 Y2 u +$6 x01 E ++6 u Y2 +,6 u +$6 r f +'6 $r ++6 o4t +,6 o1x ++6 i7. +,6 i6d +.6 i5W +^6 i1s p3 ++6 E $* ++6 $* E ++6 ^d +$- *68 +$6 ^6 +*64 i5f +*62 i2r +*62 i21 +$5 Z5 t +$5 Z4 ++5 Y4 E +$5 t Z5 +-5 o7x ++5 o6O ++5 o3t +-5 o1h +$5 o0R +$5 i97 +$5 i5a +,5 i42 ++5 E Y4 +,5 -7 +*56 y5 K +*56 K y5 +*56 i2c +$5 $6 +-5 *50 +*54 ^u +*53 +$@ *53 +-5 *23 +-5 -2 +,5 $1 +*50 +$@ +5 +$. -4 Z2 +,4 o6E +,4 o6. ++4 o1k +^" $4 o0c +^4 K +$4 i5s ++4 i47 +*47 o5w +*46 $l +*45 o2t +-4 *54 +*43 o21 +*43 +7 +*42 i3z +$. *42 +*41 t +*41 o6. +*41 +4 +.4 +^4 ] +-3 o0z +$3 $L +-3 ^i ^z +.3 i3v +$3 i3g ++3 i3d +.3 i3B +^3 ^e +$3 D8 +^3 D6 +$3 ^b +*35 *64 +$3 $5 +] *34 Y3 +*34 i4a +.3 +4 +*32 x03 t +*32 t x03 +*32 o0u +*32 $m ++3 -2 +$3 $1 +*30 o0w +*30 ,3 +*30 +^2 Y2 o9. +$2 $W +$2 T9 +-2 o5c +.2 o55 +$2 o4r +,2 o4@ ++2 o0l +$2 ^M +.2 i4J +$2 i2e +*27 x07 +*27 o1f ++2 +7 +$2 +7 +*25 $. +*24 o1@ +*23 $S +*23 o4u o2x +*23 o2x o4u +*23 o0u +*23 i2p +$2 ,3 +,2 -3 +-2 *13 +*20 ^s +*20 o6n +*20 o1X +$! ^2 +$ $2 +[ $2 +^2 ^^ +^@ ^2 +^! $2 +$1 x93 +$1 $U +^1 T9 r +$1 saA +$1 p4 $B +$1 o6a +-1 o24 +^1 o1C +-1 i4w +-1 i4l +$1 i4g +$1 i2r +.1 i2m +.1 i0@ ++1 f +$1 $C +$_ *14 +*13 o2b +*12 o3c +*12 i2d +*12 -2 +$1 $+ +$1 $- +$@ ,1 +} $1 +[ $1 +.1 +^_ ^1 +^0 z5 +$0 Z3 +$0 Y1 ++0 $W +$0 T3 $8 +.0 o3v +-0 i5c +-0 i5B +$0 i50 +.0 i1z ++0 i1, +.0 d Y3 +$0 $8 T3 +*07 o6H +*07 o3! ++0 +5 +*03 o3x +*03 o3e +$0 *34 +*02 x12 +*02 ^T +*02 o6n +$0 $1 +$@ ^0 +[ $. -0 +[ -0 $. +.0 { +$. $/ +^? +^, +$z Z3 +^Z ^z +^z Y1 +^z ^w +$Z ^S +$Z $Q E +$z LA +$z L6 +^z $l +^z d +^Z ^a +Z5 Z5 -1 +$ Z5 Z5 +Z5 Z3 Y4 +Z5 Y4 Z3 +Z5 Y1 +z5 t ,6 +z5 scf +Z5 s8 +z5 s8@ +z5 i0r x18 +z5 ,6 t +^z *53 x23 +Z5 -1 Z5 +z4 z5 { +z4 { z5 +Z4 } z3 +z4 y4 +Z4 o7. +z3 Z2 *04 +} z3 Z2 +Z3 o8 +Z3 +7 +z3 *04 Z2 +Z3 $@ +Z3 $. +$* Z3 +$@ Z3 +Z2 z5 t +} Z2 z3 +Z2 y3 t +Z2 y3 l +Z2 y2 .2 +Z2 xB3 D8 +$! Z2 x42 +z2 u +Z2 t z5 +Z2 t y3 +z2 sm1 +z2 ^Q +z2 p1 z1 +Z2 l y3 +z2 l -0 +z2 i2@ E +z2 E i2@ +z2 E ] +z2 ] E +z2 d z1 +Z2 d x07 +z2 ^B o2b +z2 *30 ^H +z2 +1 y2 +z2 -0 l +Z2 $& +Z2 $! +$\ Z2 +^. z2 +z1 Y2 Y2 +z1 x34 +Z1 x03 +Z1 u p1 +Z1 p1 u +Z1 p1 -6 +Z1 o1) +z1 i6b +Z1 i4, +Z1 i1e *62 +Z1 ^d +Z1 d +Z1 $c +z1 ^c +^. Z1 ^a +Z1 $2 +$* Z1 -0 +$_ Z1 [ +$_ [ Z1 +z1 } } +$z $! +[ $z +$y $Y +$Y ^x l +^y ^m +$Y l ^x +$y ^h +^y D3 +^y ^A +Y5 Z5 x63 +Y5 z3 r +[ Y5 Y3 +y5 xA3 y5 +y5 x93 E +Y5 x83 t +y5 x82 K +y5 x68 +$* Y5 x64 +Y5 x63 Z5 +y5 x63 ,5 +y5 x63 [ +Y5 x34 +Y5 t x83 +y5 t T5 +y5 T5 t +} Y5 t +y5 { R4 +y5 p1 x0A +y5 o5m +y5 o5g +y5 o4o +y5 o0V +y5 o0r +y5 o0M +y5 o0D +y5 K x82 +y5 E x93 +y5 ^D +Y5 +A +Y5 ^A +y5 ,5 x63 +Y4 Y4 x08 +y4 xB4 k +y4 x82 y4 +y4 x64 x02 +Y4 x08 Y4 +y4 u $6 +Y4 u ] +Y4 ] u +Y4 sbB +y4 s4v +Y4 s4+ +y4 r +y4 o2i +Y4 o0T +Y4 o0p +y4 o0P +y4 k xB4 +y4 i4. +y4 i4= +Y4 i0r +y4 E -0 +Y4 E $! +Y4 $! E +y4 *A0 +Y4 '8 +y4 $6 u +y4 *64 *31 +y4 *3A +y4 *31 *64 +y4 -0 E +y4 *0A +Y4 $! +Y4 $, +Y4 ] ] +Y4 [ +Y3 $z y2 +Y3 y3 u +Y3 y2 $z +y3 y2 l +y3 x01 +Y3 u y3 +y3 s9] +y3 ] ^p +y3 ^p ] +y3 o0j +y3 o0e +y3 $m +y3 l y2 +Y3 i7+ +Y3 i6. +y3 i1E -0 +y3 E $9 +y3 D5 $A +y3 $A D5 +Y3 $a +y3 $9 E +Y3 +8 +y3 *53 +y3 -0 i1E +y3 $. +$* y3 +Y2 y5 x65 +Y2 y5 u +Y2 y5 +Y2 Y4 Y2 +Y2 Y2 Y4 +Y2 Y2 C +y2 y2 +] y2 y2 +y2 x43 y5 +Y2 x24 y2 +Y2 $x +Y2 u y5 +Y2 u p1 +Y2 $u +Y2 t p1 +Y2 t d +y2 sNG +y2 sM[ +Y2 s15 +y2 q q +Y2 p1 u +Y2 p1 t +Y2 o5y +Y2 o56 +Y2 o4@ +Y2 o2h +y2 o0m +y2 o0f +Y2 K C +Y2 i5. +y2 i2y +y2 i0a +Y2 d t +Y2 C Y2 +Y2 C K +y2 c $1 +y2 C +Y2 +5 +y2 +3 +2 +{ Y2 *31 +y2 +2 +3 +y2 +2 +y2 $1 c +{ Y2 *13 +y2 $1 +Y2 $@ +$! $@ Y2 +] Y2 +y2 } } +$! y2 +^] ^[ y2 +Y1 $z Z1 +y1 $* Z2 +y1 Y5 C +Y1 Y4 t +y1 $x Z2 +y1 x34 +Y1 t Y4 +y1 ^s +y1 $q ^q +y1 ^q $q +y1 o4* +y1 l +Y1 ^j y1 +Y1 i4@ +y1 i1o +y1 i1j +y1 i1D +Y1 ^e +Y1 $d r +Y1 D6 +y1 C Y5 +Y1 C $4 +Y1 C ,3 +Y1 ^b +$. Y1 *63 +Y1 $4 C +Y1 ,3 C +Y1 -1 +$! Y1 [ +$! [ Y1 +y1 $@ +$. ^y +$x Z5 t +^x $w +$x t Z5 +^X ^M +^x ^l +^x i5q +^x i4x +$x i2s +^x i02 +^x ^h +^x $g +$x E $2 +$x D4 +xA1 o9k +x91 o0V +x91 $2 +x91 +x83 o88 +x81 +$x ^8 +x73 t +$x *70 +x62 i6z +x61 $s +x61 ^s +x61 o0$ +x61 $8 +$, x61 +x52 y5 y5 +x52 i4y +x51 ^r +x51 i3r +x4A +x43 y3 Y2 +x43 Y2 y3 +x43 o1u +x43 i3L +x43 i1W +$! x42 Z2 +x42 y4 +x42 o0M +x42 i2h +x42 { E +x42 [ +x41 y4 t +x41 t y4 +x41 i5s +x41 i3s +$ x41 +$* x36 +x35 y1 y5 +x35 x21 +x35 d x03 +x34 y3 y3 +x34 } q +x32 $. Z2 +x32 y2 y2 +x32 o0u +x32 i3. +x32 i2p +x31 o0c +x31 i4M +$@ x31 E +$x $2 E +x28 u +x27 z2 +} x26 +x25 u p4 +x25 p4 u +x25 o4) +[ x25 +$ x24 +x23 y3 +x23 p1 '9 +x23 i3i +x21 o4@ +x21 o2z i3q +x21 i3q o2z +x21 *31 +x21 +0 +x21 $* +x21 $@ +$= x21 +x1B u +x16 z3 +x16 C z2 +x15 t +x14 y3 } +x14 } y3 +x14 i4* +x14 i3- +x13 Z5 Z5 +x13 ^z +{ x13 $s +x13 o2H +x13 f +x12 i2e +x0B z5 +$* x0B +x07 z2 +x07 u +x07 *21 +x06 C $* +x06 $* C +x06 +0 +x05 z1 +x05 o4* +x05 D1 +x04 Z5 Z5 +x04 Y2 y2 +x04 y2 Y2 +x04 r +x04 q l +x04 p1 TB +x04 l q +x04 i5$ +x03 z3 +x03 Z1 +x03 ^e +x02 Z2 y5 +x02 y5 Z2 +x02 Y4 y2 +x02 y2 Y4 +x02 y2 +x02 ^t +x02 i3b +x02 i1h +x01 p2 +x01 ^J T4 +$x [ +] ^x +^- ^x +^x +^w ^z +^W y4 y4 +^w x21 +^w $x +$W ^W +$w ^t +$w $q +$W o5J +^w o1i +^W ^N +$w $j +$w i7. +^W i2U +^w i1s +^w i0c +^w D5 +^w ^A +$w $9 +$! ^w +^v z2 +^v i3d +^v i1s +^V i0W +^v ^h +^V ^C +$V $1 +$! ^V +$v +u z5 z1 +u z1 z5 +u Y5 x32 +u Y2 xA5 +$U x91 +u x51 p5 +u x42 *03 +u T4 +^u ^t +u sIY +u R4 t +u p2 x5B +u p2 x04 +u p1 xA4 +u p1 x52 +^u ^p +u o8I +u o76 +u o3S +] ^u o3_ +^u ^l +u d x05 +u *79 +u *03 x42 +t Z5 Z3 +t Z3 Z5 +t z2 x63 +t Z1 ^3 +} t Y5 +t x61 ] +t ] x61 +t x43 z2 +^t x21 +$t ^w *53 +$t $w +$T ^U +t T6 +^T ^t +$t ^t +t s*+ +{ t R6 +^T ^R +t p2 xA5 +t p2 +2 +t p1 +B +t o8L +t o7A +t o0W +$t ^L +t K Y2 +t d x08 +t d o74 +t d ^M +t d -B +t D4 +^t ^d +t $A $B +t -A +T8 Y1 t +T8 t Y1 +T8 $2 +T7 $8 +^T $7 +T6 o7W +T6 o7@ +T6 $4 +T6 ] ] +T5 Z5 +T5 T2 +T5 o4z +T5 o48 +T5 i5s +T4 Y2 +T4 T3 +^T $4 p4 +T4 i5# +T4 $8 +T4 $4 +T4 $. +t ^3 Z1 +T3 s1! +T3 o7@ +T3 o04 +T3 i2Y +T2 o49 +T1 $! Y1 +T1 o8% +T1 o5= +T1 o3e +T1 o0( +T1 o0! +[ t *14 +T1 $! +$T ^1 +^T ,1 +T0 o5T +T0 o1I +T0 i89 +t +0 d +$! ^t +^s z2 +sz- +$s $z +^s Y4 p2 +^S Y2 Y2 +$S Y1 +sY* +{ $s x13 +stb q +ssz E +ss8 c +srz +[ srp +${ ^S o8A +so@ $2 +so2 +sme +^s ^M +sLt +slL $! +slL +^s ^K +s)j s8 Z5 +sj( R5 R5 +sjN Y1 +$s $j +^s i4s +$S i43 +$S i3s +^s i0p +^s i0j +sg, y3 +sG* +sfF +ser +seo +sei +^S $e +sdm u +sd4 l +^s ^D +sCt +scm l +sc8 z3 +^S c +sc( $) +sBF +saf +saB l +s98 +s7% Z5 +s7# +s69 +s67 +s65 +s5i C +^s *56 +s5( $) +} s5# +s49 +s46 +^s *35 +s35 +$s ^3 +s20 Y2 +s2# +$s ^2 +s18 +s14 +s13 +s12 +s1! +s0. *86 +s0% } +$@ ^s +[ $s +r Z5 +$. r z1 +r y4 y4 +} r Y1 +$r $t $y +r ^s +^r ^s +^R ^r +^r p2 $R +r o2w +r o2j +^r l } +^r } l +r ^K +^R i1t +^R i1J +r f x43 +$R $c +$r $b +r $a *13 +r $A +R9 ] +{ R6 t +R6 R6 '7 +] R6 R6 +R6 '7 R6 +] R5 t +R5 R3 +R4 t [ +R4 [ t +r *43 +R2 z4 +R1 z5 +r +1 y2 +r *13 $a +R0 { +^. r +$Q Y1 T7 +$q $W +$q s/q +^q $Q +q oBA +$q o6o +q L0 z3 +^Q E z4 +^q ^d +^Q +^q $@ +$p $s +$P $p +^p ^O +^P ^M +^P $k +^p ^k +^P i8@ +^P i1J +^p ^a +p5 x09 $a +p5 x02 +p5 i6i +p5 'B $z +p5 $a x09 +p4 x0A +p4 o0S $3 +p4 $. $k +p4 i5p *20 +p4 ^a +p4 *42 r +p4 $3 o0S +p4 *20 i5p +p3 Z1 x09 +p3 x8B u +p3 x09 Z1 +p3 { x08 +{ p3 x08 +p3 u x8B +p3 r p1 +p3 p1 r +p3 o6M +p3 o05 +p3 $m [ +p3 [ $m +p3 k *35 +p3 C } +p3 $A $1 +p3 $a [ +p3 [ $a +p3 *35 k +{ p2 Y1 +p2 xA8 t +p2 x9A u +p2 x87 t +p2 x86 t +p2 x85 u +p2 x72 c +p2 x6A +p2 x64 t +p2 x5B t +p2 x3A t +p2 { x02 +p2 u x9A +p2 u x85 +p2 t xA8 +p2 t x87 +p2 t x86 +p2 t x64 +p2 t x5B +p2 t x3A +p2 s6c +p2 $q +p2 o2e o0b +p2 o0b o2e +] p2 ^m +p2 c x72 +p2 c $0 +p2 $0 c +p1 z1 u +p1 z1 t +p1 y1 u +p1 Y1 t +p1 x62 t +p1 x62 l +p1 x57 l +p1 x31 +p1 x25 $e +p1 x08 r +p1 u z1 +p1 u y1 +p1 u ^R +p1 u K +p1 u D8 +p1 u *57 +p1 u *54 +p1 u ^1 +p1 t z1 +p1 t Y1 +p1 t x62 +p1 t +9 +p1 t $8 +p1 t +7 +p1 t *45 +p1 t [ +p1 [ t +p1 s8 x07 +p1 ^R u +p1 o0h +p1 l x62 +p1 l x57 +p1 K u +p1 iA; +p1 i60 +p1 $e x25 +p1 D8 u +p1 D3 'B +p1 D3 ] +p1 ] D3 +p1 'B $. +p1 ^a y1 +p1 +9 t +p1 $8 t +p1 +7 t +p1 *57 u +p1 *54 u +p1 *45 t +p1 ^1 u +p1 [ +0 +^o ^P +^o ^p +^O o1/ +^o ^O +^O ^J +^o ^i +^o ^h +^o ^E -0 +oBl +oBE u +oB3 E +oB2 +oAy +oAi u +oAB +7 +oAA x21 +oAa +$! oA6 +oA1 ,B +^( oA) +o9p x62 +o9l +o9B *89 +o98 -3 +o9% *69 +o96 +o94 +$. o93 +o91 +o90 C +o9^ -0 +^^ o9^ +o8z +o8Y u +o8u x61 +o8# t +o8R *85 +o8o ] ] +o8M u +o8j +o8e -6 +o8e +o8b o0q D7 +o8b D7 o0q +o8% +9 +o89 +o83 $* +o8, $2 +o8% +o8# +o8. { +o7. Z3 +o7y o4x x02 +o7y +o7W x12 +o7v -2 +o7u +6 +o7T C +o7^ T2 +o7S c +o7O $1 +o7o +o7n x21 +o7L $+ +o7i +o7h +o7f { +o7% $E +$@ o7B +$! o79 +o7! ,8 +o78 +o77 i8. +o7& *64 +$" o7\ +o6x ,7 +o6V ,7 +o6u R0 +o6Q E +o6M T1 +o6m $1 +o6_ ^m +o6h R2 +o6H *70 +o6f L0 +o6e $A +o6@ E $0 +o6c Y2 Y2 +o6c x12 +o6B D4 +o6b .5 +o6B $$ +o67 ,5 +o6. ,7 +o65 +o6) *46 +o6, $3 +o62 .5 +] o61 +o6@ $0 E +o60 ^a +o6. -0 +o6- $. +o6< $> +^, o6, +o5z x32 +o5z i6i +$$ o5z +o5y $! +o5x *53 +o5t $1 +o5t +o5R *26 +o5q y2 y2 +o5P +o5l $a p3 +o5l .2 +o5i i3q +o5h +o5F D3 +o5f *67 +o5% E +o5a c +o5! ^A +o58 +4 +o56 $L +o5$ *57 +$. o55 +o53 $4 +o5@ *12 +o5@ +o5. +o5- ^* +o5_ ^' +$. o5- +^ o5@ +o4X .5 +o4x ] +o4v ,2 +o4u x51 +o4u +o4T +5 +o4S *34 +o4N T2 +o4L ,5 +o4k x52 +o4K +o4i *02 +$@ o4i +o4h +o4e o3p +o49 *20 +o48 $. +o4_ $7 +o44 *47 +o44 +o4? *36 +o42 *54 +o4@ +o3z *23 +o3z -1 +o3y C +o3 y4 +o3. y3 x72 +o3X ^d +o3x -5 +o3w *03 +o3u -8 +o3u +2 +o3u +o3T Z1 +o3s +4 +$? o3S +$! o3s +o3R +2 +o3q o0z +o3p i3_ +o3n +2 +o3n +o3M x53 +o3l z1 +o3l y5 E +o3H x65 +o3F x71 +o3D .5 +o3d .5 +o3b x52 +o3b +o3- ^a +$! o3a +o38 Z1 +o3# -7 +o3# ,4 +o3- ,4 +o3! *30 +$. o33 +o32 +o3- +1 +o3, +0 +o2z D3 +o2Y E +o2U E +o2u c +o2S x42 +o2s ^k +o2q +o2p -0 +o2p +o2o *21 +o2m ,A +o2m -3 +o2l $. +o2l [ +o2K -7 +o2 i5 +o2e .3 +o2e .1 +o2d +0 +o2A u +o2a o0t +o2( -6 +o23 o17 +o23 .5 +o21 [ [ +$$ o2( +$! o1z +o1) Y1 +o1x ,6 +o1- x25 +o1X *02 +o1x +o1u y3 +o1u x42 +o1u o5h +o1u ,3 +o1t i2r +$/ o1t +o1t +o1s k +o1s D3 +o1r u +o1R T2 +o1O l +o1@ K ^G +o1J D4 +o1I *43 +o1I *34 +o1i +o1h +o1@ ^G K +o1G ,4 +o1g *12 +o1E +2 +o1e $+ +o1e $% +o1e +o1C x71 +o1a k +o1a ,2 +$! o1A +o14 $. +o14 [ +o13 c +o1- +3 +o1+ +o0y p4 *72 +o0W u +o0w o2w +o0w o2f +o0w D2 +o0w ,1 +o0W ] +o0u +o0t t d +o0t d t +o0T D6 +$! o0s +o0r i2v +o0q $v +o0p T4 +o0o i0d +o0n i1i +o0N $! +o0n +o0M +4 +$@ o0m +0 +o0m $= +o0l ^a +o0l *31 +o0l *13 +o0! l +o0k ^s +o0J D5 +o0h ^Y +o0G D4 +o0f o3v +o0f *31 +o0e ^f ^E +o0D D9 +o0D D4 +o0D $8 +o0' D3 +o0c ^s +o0B +3 +o0a p4 +o0A $8 +o05 *67 +o05 { +o0$ ,4 +[ o04 +o02 +1 +o01 i1S +o0$ $1 +o0* $* +o0 +$N Z4 +$n Z2 +^n ^t +^n L1 +$N ^g } +$n $g +^n *31 +^M Z1 y1 +^M y1 Z1 +$m $v +$m u +$m $r +^M ^L +^M ^K +^m i1d +^m ^I +$M $E +^M ^B +^M ^A +} ^@ ^M +^M $@ +$@ $m +l Y2 x32 +$l Y1 +l x32 Y2 +^L ^W +l t p1 +$L T0 +^l ^t +l R9 R9 +l r +l p1 t +l o52 +l o13 +$L o0E +^L ^M +l K +7 +^L ^J +^l $j +$L i4o +$? L9 +L8 $L +l +7 K +L6 p1 -6 +L6 i6K +L3 Y3 +l ,2 y2 +L1 o4c +L1 o0I +L1 i1C +l *13 k +L0 $a +L0 { +^l $! +k y5 E +K Y3 +K Y2 Y2 +^k ^y +k x1A +^K x12 +K s9b +^K ^S +^k ^S +k q z5 +K q x13 +k o09 +K l +7 +K i8% +k i6@ +k i58 +K i46 $a +^k i1- +^k i0l +k d x04 +K D7 +K c T4 +K $a i46 +K $a +K $8 +K +7 l +K .6 +$. k *56 +^k +3 +k +2 +k +1 +k +0 +K { +$. k +^k $. +^J x71 +^J o4d +$J $o +$j $l +$j $h +^j ^f +^j ^D +^j $4 +^J $1 +^i ^r +$I o0f +$i i3u +^i i3a +^i C $1 +iBo x92 +iB. +iB- +iA@ +iA/ +i9% x04 +i9i x45 +i90 +i9@ +i9[ $] +i9- $- +$, i9. +i8* x14 +i8m x24 +i8B xA1 +i8a t +i8 +A +i8 ,9 +i8* +i7@ Z5 x25 +i7@ x25 Z5 +i7W $k +i7! T0 +i7n $R +i7M *35 +i7e x41 +i7 C +i7 +B +i77 +i7/ .6 +i71 ,8 +$. i71 +i7* *07 +i70 $! +i7( $) +i7/ +i6z x21 +i6. x72 o6o +i6X .5 +$! i6x +i6W .9 +i6T +0 +i6s D0 +i6q -9 +i6o o3x +i6. o6o x72 +i6o $1 +i6N ^J +i6n $@ +i6h +i6G -8 +i6c L7 +i6c +i6B y1 +i6b .5 +i6a ^A +i69 +$. i66 +i6. +4 +i6. ,4 +i62 Y5 +i61 +i60 $. +i6) ^( +i6/ $/ +] i6. +i5z ] ] +i5 y5 +i5 Y1 +i5 $X +^| i5w +i5w +i5S y5 +i5s $f +i5s $d +i5S '7 +i5s .7 +i5s $! +i5q $r +i5p *43 +i5k o6l +i5K *51 +i5K ^1 +i5@ K +i5J l +i5J .4 +i5\ i6' +$% i5i +i5G *70 +i5g +i5e x03 +i5C $! +i5b r $d +i5B -0 +i5b +i58 k +i53 i1c +i53 +i52 $2 +i50 T4 +i50 +i5@ $$ +i5. +i5? ] +i5? ^* +i5, $. +$[ i5/ +^! i5+ +i4- Z1 +i4x $1 +i4u *25 +i4t $5 +i4s r +i4s ^g +i4s +i4r ^w +i4. o8. +i4o +i4n $o +i4m +i4l +i4k +i4J ,5 +i4i $A +i4h ,5 +i4h $! +i4e x12 +i4e ^c +i4e +i4D x52 +} i4b +i4a +i46 *57 +i44 $4 +i43 $4 +$. i43 +i4+ -2 +i4. $! +i4- +i3y i2m +i3y D5 +i3x Z1 +i3x o0d +i3x +i3v D6 +i3v [ +i3t i1r +i3s x61 +i3s i5s +i3s i06 +i3S .7 +i3r x61 +i3$ R4 +i3r [ +i3q $h +i3q *73 +i3P *14 +i3p +i3o [ +$ i3l +i3- K +i3# i6C +i3- i3- +i3h o0s *02 +i3h c +i3h +i3f K ^2 +i3f ^2 K +i3e *71 +i3e +i3c $a +i3C ,2 +i3B $L +i3b .7 +i3b ,7 +i3B +5 +i3b } +i3a ^f +i38 D7 +i38 } +i3@ $7 +i34 $F +i34 ^E +i33 y4 y4 +i33 *67 +i32 ,6 +i31 t i32 +i31 i51 +i31 i32 t +i31 $d +i30 $s +i30 ,4 +i3# *04 +i3_ *04 +i30 .2 +i3_ .0 +$. i30 +i3* ^# +$/ i2z +i2Y T4 +i2Y T1 +i2y D6 +i2@ y2 +i2x x41 +i2x +3 +i2w $x +i2w $t +i2w $q +i2w +i2u *54 +i2t $r +i2s $g +[ i2s +i2p *34 +i2n c +i2n ^A +i2n +i2M x62 +i2m +[ i2l +i2K y3 y3 +i2j *13 +i2i $y +2 +i2i +2 $y +i2i *27 +i2i +i2f *53 +i2e .4 +i2@ D5 +i26 *25 +i25 +i23 *76 +i23 *67 +i2@ ,3 +i2= ,3 +i22 $4 +i21 i3s +i20 L9 +i20 i2e +i2+ .0 +i1z +i1- y1 t +i1- x71 +i1v y4 y4 +i1- t y1 +i1T *56 +i1S *02 +i1r o0c +i1r +0 +i1r $! +i1r [ +i1l $@ +[ i1j +i1i ^M +i1g i4s +i1e i69 +^i $1 C +i1a .2 +i19 p3 +i1 -7 +i16 +i1- .3 +i11 D5 +$! i11 +$I $1 +i1- +} i1 +^@ i1$ +^= i1 +i0 z4 D4 +i0@ z2 +i0/ z1 +i0y $s +i0y i0z +i0x ^E +i0w $l +i0U T0 $i +i0U $i T0 +i0t y3 +i0T ^N +i0t $k +i0r ^x +i0q ^z +} i0M +i0l t +i0l $l +i0l ^j +i0j $j +i0J i1M +i0H ^N +i0H i11 +$@ i0g +$. i0f +i0d i2x +i0D ^H +i0c $C +i0A ^P +i0a i0J +^. i0A +i0a $@ +i07 $S +i06 $f u +i03 ^A +i0- ^+ +i0 } +$! i0# +$I +$. ^i +^i ] ] +$h ^y +$h $s +^h ^k +$h $j +$H i0S +$H ^I +^h $H +^h $1 +$g Y1 +$g $s +$g o6k +^g ^l +^G ^J +^G i0F +^G $G +^g $f +^g ^D +^G ^B +$G $a +$G $. +^G $! +^. ^g +^g +f xA1 ] +f ] xA1 +f x96 *20 +f x8A y4 +f x56 *02 +^f ^x +f u *12 +^f t ^9 +f t *21 +^f ^p +$f o5h +^F i1G +^f D3 +^F ^A +^f ^9 t +f +4 [ +f [ +3 +f *21 t +f *20 x96 +f *12 u +f *02 x56 +$f $) +$f { +{ ^f +^f } +E Y4 T1 +E Y1 o1@ +E x42 i4L +E x41 D7 +E x41 $4 +$@ E x31 +$E u +E T6 +E T1 Y4 +$E ^T +$e ^s +^* E r +^e ^R +^E o63 +E o5l +E o5a +$e o51 +E o4B +E o3x +E o1@ Y1 +E o0! +E i2s ,3 +^E i2b +^e i0F +^e ^F +^e ^B +^e $8 +E .7 x41 +E *74 Y4 +^e ,7 +E *68 $1 +E $4 x41 +E $1 *68 +E $ +E ^/ +$D Z1 +d Z1 [ +d [ Z1 +d y3 u +d x85 u +d x81 t +d x64 +d x53 u +d x31 ] +d ] x31 +d x24 u +d x04 snr +d x03 c +d x02 t +d x02 +$d ^x +d u y3 +d u x85 +d u x53 +d u x24 +d u o0T +d u i8X +d u i7H +d u i6R +d u i6H +d u i52 +d u D1 +d u ^C +d u -5 +d u $3 +d u *04 +d t x81 +d t x02 +d t i0J +d t $8 +d t *76 +d t +6 +d t $4 +d snr x04 +d r c +^d ^r +^d o2r +d o1v +d o0T u +d o0k +$D $m +d L7 [ +d l $5 +d l $4 +d l $3 +d l *12 +$d $k +^d ^k +$d $j +d i8X u +d i7w +d i7H u +d i6R u +d i6H u +$d i5g +d i52 u +^D i1M +$d ^h +^D $f +d D3 +d D1 u +^D ^d +d ^C u +d C -0 +d +B { +d 'A Y2 +D9 u $A +D9 $A u +D9 -6 +d $8 t +D8 i5@ +$d $8 +D7 Y1 t +D7 t Y1 +D7 o8. E +D7 o13 +D7 E o8. +d *76 t +D6 Y1 +d +6 t +D6 p2 +D6 o3D +D6 o1m +D6 o12 +D6 o0$ +D6 k +D6 -2 +d *61 *3A +D6 $@ +$d ^6 +d -5 u +D5 T5 $1 +D5 so0 +D5 o7. +d $5 l +D5 i3y +D5 i3q +D5 ^c +D5 $1 T5 +D5 ^1 +d .5 +d $4 t +D4 p2 'A +D4 o4D +D4 o0W +d $4 l +D4 i11 +D4 -3 +D4 ,2 +D4 $ +$ D4 +D3 Y4 +d $3 u +D3 r p2 +D3 p2 r +D3 o1w +D3 o1s +D3 l d +d $3 l +D3 d l +d *3A *61 +D3 ^6 +D3 $2 +$@ D3 *01 +D2 o6n +D2 o3d +D2 o0w +D2 ^1 +^d +2 +D1 i03 *21 +D1 D6 +D1 c $4 +D1 $4 c +d *12 l +D1 *04 +D1 [ +D0 R9 R9 +D0 p1 x04 +D0 C +d -0 C +d *04 u +$d *04 ^f +$. ^D +^D $@ +$@ ^d +C z5 r +C { Z5 +c Z3 ^K +$c Z2 +C Z1 T8 +c x81 so0 +c x21 +c x04 q +$c ^w +c $u $s +c TA T9 +c T9 TA +C T8 Z1 +] c T4 +^c $t +c so0 x81 +C R8 t +C R5 t +$c $r +C p2 +2 +c o6{ +C o3Y +C o2o +c o13 +c $o ^1 +$c $m +$c $l +c ^K Z3 +^c ^j +c i77 Y4 +c i7! .7 +^C i72 +$c i2x +^c i1t +C d '8 +c D6 $8 +c D5 Y4 +^c D3 +$c C $1 +$C $c +C $9 p3 +c $8 D6 +^c ^6 +c ^1 $o +$c $1 C +$c $1 +C } } +^C $. +^- ^C +^c ] +^b z2 E +^B x12 +^b t ^6 +^b ^t +$b ^R +^b ^r +^B ^P +^b ^p +$B o0j +$B $L +$b i0t +^B ^I +^b ^h +^b ^D +^B ^a +^b $a +$! *B9 +^b ^6 t +$B *04 +$b *03 +$b ^` +0 +,B +^@ 'B +$a Z5 +$a Z3 +^a Z2 *90 +$A Z1 +^. ^a Z1 +^A $z +^a ^z +$A y5 +$a y2 +^a ^W +$a $t +.A slq +^a ^s +$a ^Q +$a p4 $1 +'A p1 xA4 +$A o3a +$a o34 +,A o2m +$A o2d +$A $l +$A i6a +$a i5c *36 +^A i36 +$a ^f o0C +$A +7 +*A6 *79 +$A +6 +$a ^6 +^a $6 +^A $5 +^A $4 +$A *23 +$a $2 +^a +1 +^A *01 o01 +$! ^A +$+ $a +^a $/ +^a ] +^+ $a +$9 x71 +$9 x01 ^K +$9 ^c +^9 ^b *26 +*9A u DB +*9A DB u +$9 $A ++9 +8 +*97 *A6 +*96 i12 +*93 +[ $9 +.9 +'8 Y2 +$8 $W +$8 T1 +'8 o49 +$8 o3e +-8 i6W +$8 i6 +$8 i5a +$8 i2h +$8 $B +$. *8A +^8 ^9 +[ +8 +8 +$8 $7 +$8 $4 +'8 -2 -0 +-8 $2 +'8 -0 -2 +$. $8 +] $8 +] ^8 ++7 Y3 u +'7 Y2 +-7 x05 ++7 u Y3 +-7 se3 +$7 $S +^7 r Z2 ++7 oAB ++7 o90 +.7 o6L +-7 o55 +.7 o4j +$7 o4A +$7 o3u +,7 o3q +-7 o2x +.7 o0H ++7 i6% +.7 i5D +$7 i53 +$7 i45 +$7 D7 +*76 $. +*75 i5( +*73 *84 +*73 +7 ++7 -3 +*73 +*71 *60 +$! .7 +$! -7 +] +7 +'6 y2 y2 ++6 Y2 +^6 x61 +$6 T5 +-6 r +-6 o79 ++6 o77 +-6 o58 ++6 o5; +.6 o2b +^6 L0 ^a +-6 i76 +,6 i6s +.6 i5s +$6 i2r +,6 $A +-6 $a +$6 ^9 +$. *68 +*67 x52 +*67 o5D +,6 *76 +$. *67 *54 +*65 o04 +*65 $A +*65 *74 +*64 u d +*64 t d +*64 i7M +*64 d u +*64 d t +*64 ^c +,6 *45 ++6 *43 +$. *63 Y1 +*63 $. +$6 $3 +$6 ^3 +*62 snd +*62 d 'A +$! *61 +*60 i2- o5- +*60 *71 K +*60 *52 +$6 $0 +$@ ^6 +$! -6 +$< .6 +] $6 +,6 $. +^6 +'5 z5 z5 +$5 Z3 +-5 Y5 +-5 Y4 Y4 +$5 Y4 [ +$5 [ Y4 +$5 x61 +$5 ^w +,5 u d +$5 T5 +'5 R4 +,5 o9* +$5 o78 +$5 o6u +.5 o6o +$5 o5@ +-5 o4z +.5 o23 +-5 o0T +-5 o0r +$5 o0M ++5 o0A +-5 K +-5 i6% +^5 i4s +,5 d u +,5 d { +,5 { d +-5 $A +*57 o7$ +$. *56 k +*56 -6 +-5 *62 +^5 $6 +*54 ^s *02 +$. *54 *67 +*53 o5x +*52 o1u +2 +*52 +2 o1u +$5 ^2 +*51 slC ++5 $1 +*50 x51 +*50 i5e +$. .5 +$. ^5 +-5 $. +-5 } } +^4 z5 t +,4 Z1 +^4 x61 +-4 ^x +$4 $U +^4 t z5 +.4 p2 'A ++4 o82 ++4 o5p +$4 o54 +-4 i5j +^4 i3d ++4 i3B +$4 ^B +,4 $a +$. *48 +$. *47 +-4 $7 +*46 u p1 +*46 u d +*46 p1 u +*46 d u +*46 $. +*46 $! +*45 i1T +*45 *31 +$@ *45 +.4 +5 +*43 i8p +*43 ^a +*43 -5 +$4 ^3 +*41 *36 +*41 +0 +^4 $1 +] ^4 +.4 $. +-4 $@ +-4 $/ +^4 $^ +.3 Z5 Z5 +,3 Z5 Z5 ++3 Y5 x53 +$3 xB1 ++3 x21 +-3 u p1 +-3 t d +$3 $S +-3 p1 u +.3 o5i +,3 o4& +-3 o1v ++3 o0t +$3 iA3 +$3 i3a +^3 i0f +-3 d t +$3 $d +,3 $A +$3 ^a +$. *38 +*37 '4 +$3 $6 +*35 x31 +*35 o1u +,3 *52 ++3 $. .5 ++3 .5 $. +*34 o5j +*34 o42 +*34 o21 +*34 i5v +*34 +0 +*32 Z1 E +*32 E Z1 +,3 *25 +$3 $2 +{ *31 Y2 +*31 x42 +3 +*31 o2b +*31 +3 x42 +$3 ^1 +*30 ^s ++3 $! +$3 $* +[ $3 +'3 +,3 +^3 $@ +^3 $! +^* $3 ++2 y2 y2 +$2 x31 ++2 $x *30 +,2 T0 +$2 t +$2 $S ++2 ^s ++2 o4o +.2 o4$ +.2 o3% +$2 o0W p2 +.2 o0S ++2 o0H +$2 iA_ ++2 i8! +$2 i7_ +$2 i6y +$2 i5* +$2 i5@ +,2 i4e +-2 i4+ +$2 $c t +$2 ^C +$2 $6 +*25 $w +*25 o7r +*25 o3x +*25 o0q +*25 *06 +*25 *03 +.2 .5 +*23 o7w +*23 $m ++2 *30 $x ++2 ,3 +*21 $. Z1 +*21 R1 R1 +*21 o5@ +*21 o2w +*21 i6 +*21 i2j +*20 o5x +*20 o2s +*20 o0v +*20 o0m +*20 $A +$2 +0 +$# ^2 +$. $2 +.2 $. +-2 $* +^2 } +$1 Z4 +$1 Z3 c +$1 x23 +$1 x05 +.1 ^w +$1 ^U +$1 t D8 +^1 t ^3 +$1 srt +$1 sea +$1 ^P +$1 o9o +$1 o9% +$1 o5p +$1 o5M +^1 o42 +.1 o4@ +$1 o1u +^1 o1R +$1 o1h +$1 o0l +$1 k E +^1 ^K +$1 i7s +$1 i7@ +$1 i7- +$1 i5< L5 ++1 i4D +,1 i3a +$1 i2i +-1 i28 +$1 i0z +$1 ^e +$1 D8 t +$1 c Z3 +$1 c +$1 $B +*15 o1K +*15 i5Y +[ *14 t +*14 i3l +*14 *63 +*14 *30 ++1 *41 +{ *13 Y2 +^1 ^3 t +*13 d c +*13 *54 +*13 +$1 $3 +*12 ^P +*12 d x04 +*12 +2 +$1 +2 +$1 ^1 +*10 ^s +*10 o5z +*10 o2h +} ^1 +^1 ] +^- ^1 +$0 Z5 +$* -0 Z1 +^0 z1 } ++0 y5 E +-0 y2 y2 +$0 Y2 +$0 x51 c ++0 x23 y2 +$0 T9 +.0 R0 +$0 oA1 +-0 o8% ++0 o2v ++0 o2F ++0 o1u +-0 i6y +.0 i3_ +$0 i1e +^0 i1d +^0 i16 +^0 i1. +$0 E +$0 D5 +$0 c x51 +$0 $a +*07 o0q +*05 o5x +*05 o52 +*05 o1z +*04 i5s ^z +*04 $c +*04 $a [ +*04 [ $a +*04 $1 +*03 i7# +*03 $h +*02 y2 y2 +*02 p2 x0A +*02 o0s +*02 $A ,3 +*02 ,3 $A +$@ *01 D3 ++0 } +$0 $ +-0 { +$% ^$ +$* $# +$@ $! +$) +$( ^) +$. $@ +$. $! +$/ ^/ +$? $! +$! $# +$! ^@ +$, ^. +$` +] $- $- +^* $/ +^_ $- +^< +$z Z4 +$z Z2 y1 +$z y1 Z2 +$z x63 +^z x61 +$z x21 +$z ^x +^z ^t +$z $p +$z o2w +$z o0j +^z K +$z i3d +^Z i1s +^z i0e +^z ^h +$z $d +Z5 Z5 .3 +Z5 Y4 x73 +Z5 x73 Y4 +$* Z5 x65 +z5 x49 +z5 sCA +Z5 s7% +Z5 r Z3 +Z5 d x6B +Z5 $A +Z5 .3 Z5 +$\ Z5 +$! Z5 +$, Z5 +$z -5 +$z ^5 +} z5 ^* +Z4 Z5 Z3 +Z4 Z5 T3 +z4 z4 u +Z4 z4 r +z4 Z4 r +Z4 Z4 i26 +Z4 Z3 Z5 +Z4 Z2 x23 +Z4 Y5 Y3 +Z4 Y3 Y5 +{ z4 x72 +z4 x47 t +Z4 x23 Z2 +Z4 x23 d +z4 u z4 +z4 t x47 +Z4 T3 Z5 +} z4 t +Z4 sWS +Z4 s17 +z4 r z4 +Z4 oAa +z4 ] K +Z4 i26 Z4 +z4 ^1 z4 +z3 x46 +Z3 $W +Z3 T8 +z3 sc8 +Z3 s.` +z3 r z5 +z3 p2 x78 +Z3 oA +Z3 o84 +$ Z3 k +[ Z3 D4 +z3 *81 +Z3 $. -6 +Z3 -6 $. +^z $3 +z2 Z4 +z2 y5 z2 +Z2 x23 { +Z2 u +0 +Z2 t d +z2 T5 +z2 s0M +Z2 s0g +Z2 p1 x21 +Z2 o7- +2 +Z2 o6b +7 +Z2 o6@ +Z2 o4p +z2 o1# +z2 o0t +Z2 l $f +z2 l ] +z2 ] l +z2 K p2 +Z2 i5 +Z2 i4p +Z2 $f l +z2 ^E +Z2 d t +^@ z2 D9 +z2 D6 *14 +Z2 $A +$@ Z2 *96 +Z2 +7 o6b +z2 *60 ] +z2 ] *60 +Z2 +6 +Z2 ,4 y4 +z2 .4 .2 +Z2 +2 o7- +z2 .2 .4 +z2 ^1 z5 +z2 *14 D6 +[ Z2 *12 +Z2 $1 +Z2 +0 u +$> Z2 +$^ Z2 +} z2 +^, z2 +$* Z1 y2 +z1 u $0 +z1 t i29 +z1 r $c +z1 p3 x08 +z1 o6k .1 +Z1 o3T +Z1 o0s +Z1 } i6a +z1 i29 t +z1 i1z +Z1 $F +$) Z1 E +z1 ^e +Z1 d *B9 +z1 ^A +z1 ^a +Z1 -8 +[ Z1 ,5 +z1 ^5 +Z1 *46 $+ +Z1 $+ *46 +Z1 $4 $5 +Z1 ,4 { +z1 .1 o6k +z1 $0 u +$* Z1 +0 +$) Z1 +$/ Z1 +$^ Z1 +^Z .1 +^z .1 +$@ ^Z +$. ^z +$/ ^z +$_ $z +{ ^z +^y ^t *02 +$y ^q +^y p4 D7 +^Y o61 +^y ^n +^y k +^y ^j +$y i4Y +$y i3w +$y i2w +^Y i1y +^y ^h +^y $g +^y ^d +$y $b +y5 Y3 [ +y5 [ Y3 +[ y5 Y3 +y5 xA3 +y5 x96 t +Y5 x84 x02 +y5 x84 E +y5 x83 c +y5 x82 ,7 +Y5 x73 t +y5 x72 +Y5 x63 *40 +y5 x54 C +y5 x32 +0 +Y5 x15 +y5 u T5 +Y5 u '8 +} Y5 u +y5 t x96 +Y5 t x73 +y5 t } +y5 } t +y5 sRD +y5 r E +y5 o6o +y5 o5r +Y5 o4- +y5 o1i +y5 o0s +y5 o0g +[ y5 $j +y5 E x84 +y5 D2 +y5 D1 c +y5 c x83 +y5 C x54 +y5 c D1 +y5 c 'A +y5 ^B +y5 'A c +Y5 '8 u +Y5 *82 +y5 ,7 x82 +Y5 *40 x63 +y5 +0 x32 +$y +5 +y4 Z3 *56 +Y4 Y4 x04 +y4 Y4 u +y4 y2 c +y4 Y1 +y4 x84 +y4 x63 +Y4 x42 +Y4 x34 $@ +Y4 $@ x34 +Y4 x32 c +y4 x32 $a +Y4 x04 Y4 +y4 u Y4 +Y4 t k +Y4 t D0 +y4 t ,4 +Y4 o4v +y4 o3o +y4 o2k +y4 o1i +y4 o1e +y4 o0t +y4 o0s +y4 l *36 +Y4 k t +Y4 ^J +y4 i4@ +y4 E D8 +y4 E $4 +y4 D8 E +Y4 D0 t +y4 D0 +Y4 c x32 +y4 $a x32 +y4 *71 *06 +y4 *63 *50 +y4 *56 Z3 +y4 *50 *63 +y4 ,4 t +y4 $4 E +y4 *42 +y4 *38 x23 +y4 *36 l +[ y4 +3 +y4 [ -1 +y4 *06 *71 +y4 *01 +Y4 ] +y3 Z4 x51 +y3 Z1 +y3 [ ^z +[ Y3 y5 +Y3 Y3 D3 +y3 y2 t +} y3 x64 +y3 x53 +y3 x51 Z4 +y3 x21 o0b +y3 t y2 +Y3 t D3 +y3 T3 +y3 t [ +y3 [ t +Y3 o9. +Y3 o7. +y3 o3x +y3 o0g +y3 o0b x21 +y3 i3 +y3 i0v +y3 D8 +3 +Y3 D5 $* +Y3 $* D5 +y3 D4 +Y3 D3 Y3 +Y3 D3 t +Y3 D3 p4 +y3 ,8 Y3 +y3 '8 .2 +y3 +5 +Y3 +4 +y3 +3 D8 +y3 .2 '8 +Y3 *26 D5 +Y3 *20 *32 +y3 +1 y3 +] Y3 +y3 $ +$! y3 +[ y3 +$* y2 Z1 +Y2 y5 t +y2 y2 x83 +Y2 y2 l +Y2 Y1 $a +Y2 x42 +Y2 x32 l +Y2 x32 +Y2 x17 C +y2 x08 +y2 u o32 +Y2 u -6 +y2 u } +y2 } u +y2 ^u +[ y2 $u +Y2 t y5 +Y2 T9 T8 +Y2 T8 T9 +y2 t { +y2 { t +Y2 sDj +y2 sBv +Y2 s20 +y2 p1 x04 +y2 o7t +Y2 o7g +Y2 o6l +Y2 o6* +Y2 o5x +y2 o4j +y2 o4i +y2 o32 u +y2 o2v +y2 o2m +Y2 o2@ +y2 o1s +y2 o1# +y2 o0p +y2 o0h +y2 o0d +Y2 l y2 +Y2 l x32 +Y2 l ,B +y2 i4d +y2 i4 +Y2 i2v +y2 i0b +y2 ^E +[ y2 E +y2 ^d D4 +Y2 C x17 +Y2 ^C +Y2 ,B l +Y2 *BA +Y2 +B +Y2 $a -5 +y2 $A *42 +Y2 -6 u +Y2 +6 d +Y2 -5 $a +y2 *51 +Y2 *47 ^a +{ Y2 *43 +y2 *42 $A +y2 *40 +2 +Y2 +4 +y2 .4 +Y2 *35 +y2 *35 +y2 -3 +y2 *26 +y2 +2 *40 +y2 *14 +y2 -1 +y2 *04 ^a +y2 *01 $. +y2 $. *01 +Y2 $+ +Y2 $* +Y2 $_ +y2 { $ +$@ y2 +Y1 $z Z2 +Y1 Z5 x23 +Y1 $@ Z1 +Y1 z1 +Y1 x23 Z5 +y1 x14 t +Y1 x0A +Y1 $x +Y1 u $E +$! y1 u +y1 t x14 +y1 p2 ] +Y1 o4b +Y1 o0L +y1 ^L o1K +y1 i6s +Y1 i64 +Y1 i5r +y1 i5h +y1 i0W +y1 i0@ +y1 ^G *32 +Y1 $E u +Y1 ^d z1 +Y1 d +A +Y1 c $# +Y1 $# c +Y1 ^c +y1 ^b +Y1 $6 +[ Y1 .4 +$@ Y1 [ +$@ [ Y1 +} $ Y1 +^Y $1 +^@ y1 ] +^@ ] y1 +^, y1 +$@ ^y +$x ^y +^x ^y +^x ^q +$x iAe +xA2 +^x ^A +x93 +x92 o83 +x92 +8 +x92 $1 +x91 $A +x82 i9e t +x82 $. +x81 oA8 +x81 D1 o2e +x81 $2 +x74 u +x72 c $! +x72 $! c +^x *64 +x63 $A +x62 $7 +x62 $. +x61 $z +x61 x81 +x61 x05 +x61 $w $j +x61 t o9R +x61 o6- +x61 o1m +x61 ^c +x61 ^A t +x61 *73 +x61 *52 +x61 $5 +$* x58 +x56 i4b +x54 $1 +x54 [ +x53 o1S +x53 $3 +x53 $1 +x53 $. +[ x53 +x52 r p5 +x52 p5 r +x52 o30 +x52 i5w +x51 ^z +x51 o0l +x51 o0J +x51 i3* +x51 $i +x51 $d +x51 ^6 +^x ^5 +x46 [ +x43 y5 D9 +x43 Y4 c +x43 p2 x04 +x43 o4. +x43 c Y4 +x43 $A +x42 o11 +x42 i62 +x42 $@ +x41 Y5 ] +x41 u p1 +x41 p1 u +x41 o2x +x41 o0D +x41 ^I +x41 $. -2 +x41 -2 $. +[ x41 -2 +x3A +x35 Y1 +[ x35 +x34 C f +x32 o3f +x32 i3y +x32 i0n +x32 D1 $1 +x32 $1 D1 +x32 $@ +$* x32 +x31 Y4 t +x31 $w +x31 t Y4 +x31 ^t +x31 o3u +x31 o2z $@ +x31 $@ o2z +x31 o1w +x31 o1s +x31 D1 +x31 $0 +x25 Y2 f +x24 z1 +x24 p2 +x23 y3 Y2 +x23 Y2 y3 +x23 t K +x23 sbW +x23 ^o +x23 K t +x23 f +3 +x23 ^2 { +x21 o0w +x21 o0T +x21 o0G +x21 l *30 +x21 i54 +x21 ^e +x21 ^d +x21 $8 +x21 ^8 +x21 *30 l +$* x21 +$. x21 +$x .2 +x1B [ +x19 u +x18 x13 C +x18 C x13 +^* x18 +x17 C z4 +x15 k +x15 f *02 +x15 *10 +} x14 +x13 p5 +x13 i2J +x13 $@ +x12 y5 x52 +x12 ^t +x12 o4g +x12 ^j +x12 $5 +x12 $. { +$X $1 +x0A z2 +x0A Z1 +x08 x04 +x07 z3 +x07 p5 +x06 u +x06 ,1 +x06 -0 +x05 u +x05 K +x05 c $2 +x05 $2 c +x04 ^j +x04 $2 +x03 y3 +x03 ^w u +x03 o84 +x03 ^m +x03 i7. +x03 i0I +x02 x71 +x02 ^v +x02 o1j +x02 ^o +x02 $2 +x01 Y3 +x01 $^ Y1 +x01 i5x +x01 $5 +x01 -0 +} ^x +[ $x +^x } +^x ] +$w ^z +^w $y +^w $q +^w p3 +^w o3@ +^W o1S +^w o1h +^w ^M +^W i6L +^w i5z +$w i3g +^w i2j +^W i1Y +^w i0d +^w ^h p3 +^w $f +$w D1 +^w ^5 +$w ^4 +^w +3 +^w $2 +$w $. +$- $w +^w ] +^v ^z +^v x13 +$V i7B +^v i3j +^V i1P +^v i1g +^v i1c +$v i0@ +$v D1 +$v $a +^v *46 +$v [ +$! ^v +u z4 y4 +u z4 D7 +} u Y5 +u Y4 Z1 +u Y4 D5 +u Y2 +[ $u y2 +$! u y1 +u x43 +u t D4 +u T2 +^U $t +u $s Y1 +$u $s +^u ^R +u p1 -7 +u p1 ,6 +$u o4! +^U o3- +^u o2K +u o2G +u o2C +u o2A +u iAE +u i6H +^u i6^ +u ^F $E +^u ^f +u $E ^F +^u ^E +u d y1 +^u D5 } +u d +5 +u D4 t +u D1 p1 +u D0 +u *87 +u +6 +$U } $! +$# ^u +^* u +} t z4 +t Z2 D6 +t Y4 T1 +t Y3 R3 +t Y3 D6 +t y2 *42 +t x31 x41 +^T x13 u +t x04 d +^T ^W +^T u x13 +t TA T9 +t T9 TA +t T1 Y4 +t $S $E +t R7 t +t oBA +t o9L +t o8D +t o81 +t o6H +^t o1r +^t o1o +$T o0t +^t ^J +$t i70 +$T i6Q +^t i5s +^t i3x +t i2T +^T i1r +t i1A $7 +t i1A +^T ^I +t ^G +^t ^f +t ^E $4 +t d iA. +] t D9 +t D7 ] +t ] D7 +t D6 Z2 +t D6 Y3 +t d +6 +TA TB +^t $a +T9 ^2 +T8 iA+ +T8 $0 +$! T8 +T7 T1 +t $7 i1A +^T +7 +T6 Y2 T0 +T6 T0 Y2 +T6 $0 Z1 +$# T6 +] T6 $* +] $* T6 +T5 T0 ^6 +T5 o7% +T5 o0! +T5 i0z +T5 ^4 +T5 $@ +^T $5 +T4 T0 +T4 i4 +t $4 ^E +T4 $6 +t *41 +[ t *41 +T3 p3 'A +T3 o76 +T3 i3' +T3 i3, +T3 $5 +T3 .2 +] T3 $1 +T3 $# +^t -3 +T2 o7^ +T2 $$ +T2 ^@ +T2 ^! +^T .2 +T1 o7* +T1 o04 +T1 i3i +T1 ^1 +t ^1 +T0 x82 +T0 oB1 +T0 o5P +T0 o5j +T0 iA@ +T0 i5x +T0 i4B +$! T0 D2 +T0 $, +$@ T0 $. +$@ $. T0 +^t $@ +^t ] +^S z2 +syd -0 +^S Y5 +^s y2 +suo $1 +] suo +stw +sT4 +^s ^T +ssZ T5 +$s so0 +ssc ] +ss- +sR* x23 t +sR* t x23 +srs $. +srp [ +sr8 Y1 +^s ^R +sqD Z4 +s.P Z2 +spt +^s p3 ^W +{ sp1 ^P +sos ] +$s o47 +so0 E +sn +smp ,2 +smp +smk t +smk K +smk +smj +sMd Y3 +^S $m +sls +slr Z2 +sln +sl! *68 +sK* t +^\ s\k o3. +sJ- +] sio +siA E +$s i54 +^s { i4r +^s i4g +^s i3x +^s i2w +^s i2t +^s i1y +si1 TA +si1 l +$$ si1 +sH- x35 +shw +sH* t +shK [ +sg4 ] +$s $g +{ ses +se3 ] +$S E +se; } +sdh +sdg +sdf z5 +scz p1 T0 +sck +scf y3 +^s ^C +sc* +saO t +sa) o0( +sai +$S ^A +$s $a +s9] y3 +s9a +$. s97 +s93 +$s $8 Z1 +s85 +[ s8! +s7I K +s78 +s75 +s74 +s6 Y1 +s6* t D5 +s6f +s6* D5 t +s5U i7D +s5i t +s5B K +s58 +s52 ,5 +s4- ^s +s43 +s42 +s3f .1 +s3e $t +s3c p2 +s3# +s.3 +s2s z2 +s26 } +s2. +s1@ Z1 +s1U i8D +s1| T5 +s1? l +s1f ^8 +s15 Z3 +s13 c +^S $1 +$s ^1 +} s1$ +s0v +s0O c +s08 Y2 +s04 $# +s03 l +s03 c +s?0 +$# ^S +s.- +$) s-( +$- ^s +r z5 +^. r $y +r x34 z1 +r x27 t +$r ^w +^r ^u +r t x27 +r ^t +$R $r +^r $R +r ] p1 +r o3q +{ r L0 +$r $j +^r i4s +^r i2z +r i2v +r f x5B +r f x4B +r d c +r ] d +RA } +{ R7 +R6 x03 t +R6 t x03 +R6 i3U +r ^6 f +R6 +R5 t D4 +R5 D4 t +r -4 [ +R3 R3 +R3 o46 +R2 o3_ +r *24 +r '2 +R0 z1 C +R0 C z1 +$# ^R +$! ^R +r ^\ +$q Z4 +^q z2 +$Q Y1 +} q x46 +q x1A p1 +q t D2 +^q o8q +^q o5h +q l -5 +q l +^q i4z { +^q i2w +$ q f +q D2 t +$q $a +^q $a +^q ^a +q -5 l +q *53 f +$q *52 +$q -5 +^q ,1 +^Q ^! +$q +$P Z2 +^p y1 +{ ^P sp1 +^P ^S +$p ^s +$p ^p +^p o1l +$p o0s +$p L8 +$p L7 +^p i3t +$p i2v +^p i2_ +^p *76 +p5 Z1 { +p5 y5 +p5 x86 +p5 t 'B +p5 o8 $5 +$. p5 i7q +p5 i4s ] +p5 ] i4s +p5 'B t +p5 -A +p5 $5 o8 +p4 x05 K +p4 t 'B +p4 o7l o6a +p4 o6a o7l +p4 o0B +p4 K x05 +p4 'B t +] p4 ^a +] p3 x0B +p3 k *53 +p3 i0a +p3 ^A z5 +] p3 '9 +p3 *53 k +p2 x9B +p2 x95 t +p2 x85 ,7 +p2 x6A l +p2 x38 x78 +{ p2 x02 +p2 t x95 +p2 s3c +p2 p1 +p2 l x6A +p2 l +[ p2 ^j +p2 c +p2 $A $a +p2 'A *32 +p2 -8 y2 +p2 ,7 x85 +p2 *32 'A +$p *23 +p2 $0 Z1 +p1 xB4 t +p1 xA1 ] +p1 ] xA1 +p1 x76 t +p1 x73 x03 +p1 x53 ] +p1 ] x53 +p1 x07 D7 +p1 u i6R +p1 t xB4 +p1 t x76 +p1 t i72 +p1 t $5 +p1 t +4 +p1 t $4 +p1 t *36 +p1 t $3 +p1 t +0 +p1 sa4 +p1 o75 +p1 o6v +p1 o6A R6 +p1 l *21 +p1 $J +p1 i72 t +p1 i6R u +p1 i6q +p1 i6A +p1 i4r +p1 D8 'B +p1 +B { +p1 'B +p1 'A +p1 $5 t +p1 +4 t +p1 $4 t +p1 $3 t +p1 *36 t +p1 *21 l +p1 +0 t +$p -0 +^o u $o +^o ^r +$o $p +^O o4> +^o ^L +^o i1p +^o i0I +$o ^H +oBi +oB7 +oAu t +oAq +oAM +oA9 +oA6 .8 +] oA4 +oA1 T0 ] +oA1 ] T0 +$! oA0 +o9. Z1 +o9y +o9J +o9c +o99 +o97 $& +o94 x45 +o93 T4 +$' o9. ,2 +o92 +o9* ^@ +^( o9. +o8S +o8R L8 +o8q D3 +o8O -2 +o8% K +o8c D1 +o8C +o8a $1 +$- o89 +o88 x51 $A +o88 $A x51 +o86 ^T +o86 +o8 $4 +o84 +o82 +6 +o8! .2 +o8@ *16 +^@ o81 +o80 Y4 c +o80 c Y4 +o8* +o8! [ +o8 +o7 Z4 +o7z *30 +o7x +o7w -3 p3 +o7v Z1 +$. o7u +] o7u +o7u +o7@ T6 +o7t +2 +o7R u +o7Q .6 +o7p +o7o $! +o7N +o7L *75 +o7k o2j +o7k *57 +o7k +o7I ,8 +o7i $. +o7G u +o7d t ] +o7d ] t +o7c l +o7C E +o7% *86 +$@ o78 +o77 +6 +o7# $7 +o76 o62 +o7% .5 +o74 +o70 T8 +o7# +$- o7- +^$ o7/ +o6. Z2 +o6. Y2 +o6_ Y1 +o6* x42 +o6v ] +o6t ,4 +o6t +o6s $h +o6s $! +o6R $F +o6# R7 +] o6r +o6Q c +o6n *53 +o6n *20 +o6n *02 +o6L *07 +o6K +o6j Y2 +] o6j +o6j +o6i $! +o6G +0 +o6f +o6{ E +o6@ D3 +$@ o6d +o6{ c +o6b D4 +o6b *71 +o6b *43 +o6a ^7 +$O *6A +o68 $c +o68 +o6@ ,7 +o6 -7 +o66 $* +o65 { +o6# .5 +o6- .5 +o64 *67 +o6( -3 +$? o63 +o62 +o61 $M +o60 $. +o6# ^$ +o6{ $} +o6/ ^/ +$% o6# +$( } o6) +o5z ,6 +o5z $! +o5y $1 +o5/ x62 +o5X +o5w *52 +o5w *23 +o5T u +o5T *02 +o5s Z2 +o5s *21 +o5r x02 +o5q -7 *61 +o5q *61 -7 +o5P T3 +o5o ^g +o5O E +o5( o6) +o5^ $n +o5m +o5L ^a ^q +o5l ,7 +o5L .4 +o5l *21 +o5l +0 +$! o5L +$. o5l +o5K +o5j t +o5j +0 +o5i .3 +o5F x31 +o5f *30 +o5f } +o5d i6r +o5D D4 +o5d *67 +o5c Y1 +o5c i5u +o5b $z +o5a E +o59 T3 +o59 +o58 $0 +o58 +o5# ,6 +o5, ,6 +o55 -7 +o54 +6 +o5. .4 +o53 o33 +o53 ^E +o52 o21 +o5@ *21 +o51 *35 +o5$ ^$ +o5. $! +o5_ +o5 $ +$? o5! +o4Z $v +o4y -3 +o4. Y2 +o4Y +o4X R5 +o4V '6 +o4u *70 +o4u $. +o4s ,8 +o4O u +o4o $8 +o4o *02 p5 +o4n +9 +o4l o5i +o4l *51 +o4; L4 +o4l *15 +o4j +o4H +7 +o4h .5 +o4g $! +o4F $G +o4B x52 +o4b $x +o4b $W +o4B $! +$! o4B +o4A $1 +o4A +o4) .6 +o4# .3 +o42 +3 +o41 R5 +o41 $0 +$. o41 +o41 +o4# $# +o4< +o3z x41 +o3z t +o3Y L3 +o3_ y3 +o3x D1 +o3x c +o3x *20 +o3w ^j +o3w +2 +o3u +4 *31 +o3u *31 +4 +$! o3u +o3T x12 +o3t +^\ o3. s\k +o3R -6 +o3r +o3Q o7H l +o3q +7 +o3q *64 +o3q +5 +o3p ^s +o3o t d +o3o d t +o3! o2! +o3N Z1 +o3m o2u +o3M *43 +o3j -5 +o3j [ +o3i [ +o3i +o3@ $G +o3F .4 +o3e T1 +o3e D4 +o3e $8 +o3e *45 +o3D x51 +o3d +5 +o3b $r +o38 Y1 +o38 +o3! *70 +o36 +0 +o34 +4 +o34 ] +o3_ +4 +o3% *30 +o3! *03 +o3. $0 +o3, ^, +o2z L7 +o2z +3 +o2y E +o2x K D7 +o2@ x51 +o2x -3 +o2x *14 +$! o2X +o2w +o2v o7v +o2v o4a +o2v k +o2v $0 +o2* t k +o2s o0M +o2s i6! +o2s -4 +o2s *05 +o2s $- +o2s [ +o2q *53 +o2q *46 +o2q ] +o2p -5 +o2p +0 +o2{ L2 +o2k ^x +o2* k t +o2k o1u +o2k +3 +o2j *41 +o2j +o2i t +o2i +o2h $k +o2g u +o2g $f +o2G +3 +$@ o2g +o2F *20 +o2e k [ +o2c *03 +o2B $8 +o2b *13 +o25 *24 +o23 $1 +$. o22 +o22 +o2@ ,1 +^O $2 +o2@ +$. o2, +o1y $| s|@ +o1@ y2 +o1X $. [ +o1X [ $. +o1w x31 +o1w D3 +o1w *21 +} o1w +o1v i0y +o1V D4 +o1u .0 *60 +o1) T6 +o1R u +o1P y3 l +o1P l y3 +o1p *32 +o1o *43 *35 +o1. ^k +o1I *35 +o1i +0 +o1i $@ +o1h ^q +o1h k +o1h $3 +o1g '6 +o1E E +o1C ^Y +o1a $p +$- o1a +o19 k +o19 $E +o18 o0s +o16 K +o14 ^n +o1- *41 +] o14 +o13 l +o13 E +o12 $L +o12 D6 +o11 T0 +o11 K +o11 D5 +o10 o20 +$. o10 +o1@ ^! +o0z i1u +o0Z $5 +o0. z2 +o0Z $. +o0Z $! +o0z { +o0y .6 +o0y *32 +o0y *23 +o0x d +o0W x41 +o0w x21 +o0w t +^; o0w $d +o0w .5 +o0w +2 +o0W *18 +o0v *27 +o0t p3 'A +o0! T7 +o0T .5 +o0* t *30 +o0$ T1 $% +o0$ $% T1 +o0( T1 +$# o0T +o0s x61 +o0S T2 +o0s $p +o0s o2t +$* o0S +o0S +o0r k +o0R i22 +o0r ^h +o0R -7 +o0q ] r +o0q ^m +[ o0q +o0P i0U +o0P ^5 +o0p .3 +o0P $* +o0p $! +[ o0o +o0m y2 +o0M x42 +o0M T4 +o0M $. +o0M +o0l $A +$@ o0l +o0k o6k +o0k D2 +o0K $3 +o0K +o0j Z1 +o0j +5 +o0J $* +o0j $- +$- o0j +o0i ^P +o0i ^c +o0h i0j +o0g u +o0g i1u +o0g -2 +o0f z1 +o0F D3 +o0f +7 +o0f *30 +o0f *20 +o0f *05 +o0f } +o0e +1 ^j +o0d y2 +o0D u +o0D $6 +o0d *32 +o0! c +o0B y2 +o0b y2 +o0A z2 +o0a z1 +o0a ^z +o0A ^B +o0A $4 +o0a *0A +o06 x61 +o06 $u +o06 D6 +o0# *61 +} o06 +$. o05 +o0* *30 t +[ o02 +o01 ^L +o01 ^k +o01 *50 +$? o0? +$- $o +^N Z2 +$n $v +$^ ^N o0^ +$n ^K +^n i3M +^n ^I +$n $e +^N ^A +$N ^1 +$N +$m Z3 +^M z2 +$m y2 +$m Y1 o7w +$m Y1 c +^m $y +$M x21 +$m ^v +^M ^P +^M o2A +^m o1g +^M o0p $* +^M $* o0p +^M $n +^m ^j +^M i8m +^m i6r +$M i3m +^m i2- +^m i1c +$m i0l +$m c Y1 +^m ^C +^m $a p3 +$m ^4 o8. +$m *23 +^M *13 +^m $0 Z1 +^m $. +^m $/ +^m $_ +^. ^m +$L $Y +$l ^x +^l ^x +^l ^v +l T4 { +l str +l ss3 +l siD +l s1? +$l $s +l r { +l } r +$l o6V +^l o2s +l o0! +^l ^N +$L $l +l k .3 +$l $j +l i7c +$l i7_ +$l i6d +^l i5x +^l i1q +^l i1D { +$l i0w +$l $e t +l d -6 +$l ^d +^l ^d +$l ^A +$l $a +L9 +^L $8 +L8 +L7 i4t +l ,7 *52 +L6 $r +{ L6 r +L6 i2w +l *52 ,7 +L4 i4p +l .3 k +l *25 y4 +L1 { +L0 z1 *71 +L0 $y +L0 ^v +$. ^L +^L $* +^@ ^L +l [ +$* ^l +$. $l +} ^l +^! l +$ k Z3 +K Z2 +^k z2 +k y2 *51 +k y2 -4 +K x31 +k ^x +K $w +k R0 +K p2 x0B +k p2 x0A +k ^p +K o7z +k o7f +K o5l +$k o5C +K o4t +K o3z +$k o3x +k o33 +K o3* +K o2f *41 +k o1r $@ +k $@ o1r +K o0w +k o0m *12 +k ^o +K l T1 +^k ^L +^k $l +k K *13 +} K k +} k K +K i8_ +^k i5n +K i4- +^K i1U +k i0s i2r +$k i0J +^K i0H +$k ^h +k ^g +[ k E +k D8 { +k D6 i0x +K D2 $. +K $. D2 +k D2 +K C +k C +k c +^K ^B +K .8 +K $7 +k *65 +} K *50 +K *41 o2f +K ^3 ^F +k *20 +[ k .2 +^k $2 +k *13 K +k *12 o0m +k *12 +^K +$# ^k +$j Z3 +[ $j y5 +^j Y4 k +^J y1 +^j ^q +^j k Y4 +^J i1i +^J i1c +^J i0M +$j i0l +$j *63 [ +$j $. +^_ ^j +^i ^t +^i ^p +^I ^M +$i ^l +^I ^J +^I i58 +iA# T5 +iA. 'B +iA2 +B +iA1 -5 +iA_ +^i $A +^i ^A +i9. x52 +i9 x31 +i9u L8 +i9q x15 +i9m oB1 c +i9m c oB1 +i9e $1 +i9 +B +] i9A T9 +i93 oAA +$] i9[ +] i9 +i8- x34 +i8. s=+ +i8s +] i8h $1 +i8h +$@ i8a +i8a +i89 $. +i83 o9. +i82 x42 +i81 $1 +i8@ $# +i8@ +i8/ +$. i7z +i7Y $* +] i7u +i7t x52 +$! i7r +$= i7q +i7p x42 +i7p R4 +i7p -6 +i7o $1 +i7M *64 +i7l *67 +i7^ ^k +] i7h t +i7g *64 +i7E u +i7e ,8 +i7a ] +$* i77 +i76 -6 +i75 D3 +i75 $8 +i74 x53 i6g +i74 $A +i72 $D +i7. +2 +i71 D1 +i70 +i7, +^' i7. +i6z } ^t +i6z o7o +i6/ Y3 +i6x $A +i6= x01 +i6x +i6W -9 +[ i6w +i6t +i6s $! +i6q x02 +i6n +i6/ ^L +i6K L7 +i6k +i6j u +i6I c +i6* i4* +i6h -0 +i6g i6e +i6g [ +i6e x21 +i6e ,8 +i6e *02 +i6D +8 +i6a o5r +i68 T3 +i68 $( +i6@ $8 +i6! $7 +i6 ,7 +i64 *75 +i63 .7 +[ i63 +i6 *21 +i62 $! +i62 [ +i6- $2 +i6 .2 +i61 x01 +i61 .5 +i61 $! +i6. ^1 +i6= $1 +i60 *AB +i6. -0 +i6% +i6& ^% +i6/ ^$ +i6_ +i6 ^_ +^* i6? +i5z ,3 +i5y d x06 +i5Y *16 +i5x *76 +[ i5x +i5w *04 +i5@ T4 +i5t .3 +i5t $. +i5s T6 +i5o o2n +i5N ^4 +i5K u +i5h i0k +i5h .4 +i5g r +i5g DB +i5G *07 +i5f *47 +i5f +i5d o6e +i5d $A +i5D $2 +$! i5D +i5d +i5c x62 +i5C l $2 +i5C $2 l +i5 C +i5c +i5b t +i5b i5f C +i5B .0 +i5a u +i5A ,6 +i5. *95 +i58 ^8 C +i58 .4 +i57 ^C +i5# ,6 +i55 i7. +i55 ^8 +i54 x62 +i5( .4 +i53 $9 +i52 $@ +i52 $! +i51 $A +$_ i51 $- +$_ $- i51 +^$ i51 +i5_ $- +$> i5< +^$ i5! +i4z ,5 +i4y y1 +i4 y4 +i4w $q +i4w D6 +i4w -1 +i4v x45 c +i4v c x45 +i4u *52 +i4t *63 +i4@ T6 +i4* T3 +i4t $3 +i4s ^z +i4r ^s +i4r $I +i4r *54 o4e +i4q $r +i4P x14 t +i4P t x14 +i4o i0@ +i4m l +i4m i4g +i4( $m +i4l -1 +i4k $+ +i4k $/ +i4k $! +i4j x03 +i4j r +i4i o5c +i4i o3z +i4I c +i4/ i5* +i4i *16 +$. i4i +i4i +i4h T1 +i4f T2 +i4f $A +i4b x02 +i4a i5s +i4a i2v +i4a *13 *04 +i4a *04 *13 +i49 ,5 +^? i49 +i48 o53 +i48 ^e +i48 $4 +i4@ +6 +i4, $6 +i45 o33 +i4. ,5 +i44 ^1 +i4@ +3 $@ +i4@ $@ +3 +i4@ .3 +i4. .3 +i42 i4# +i42 .3 +i4. *20 +i41 t i55 +i41 i55 t +i41 .3 +i41 ^$ +i40 $A +i40 ^a +i40 -7 +i40 .3 +i4- *03 +i4- +0 +i4% $$ +i4$ $* +i4- $@ +$] i4[ +$> i4< +^# i4* +^$ i4. +^` i4- +i3y o2q +i3y *70 +i3x i22 +i3x $g +i3) x16 +i3w ^Q +i3w ^p +i3v +i3@ T6 +i3S D5 +i3r i2w +i3r ^g +i3R E +i3r $1 +i3r $- +i3r +i3Q $S l +i3q ^P +i3p [ p5 +i3p *53 +i3M l +i3m $2 +i3m +0 +i3K o2* ,3 +i3j L3 +i3i } +i3h x32 ^h +i3h o2c +i3f x12 +i3e C +i3* D6 +i3d ,2 +i3- $D +i3d $* +i3C u ^D +i3C ^D u +i3A C +i3 $A +i39 ^c +i39 $! +i37 $, +^# i37 +i36 i58 +i35 $. +i3_ *40 +i3 ,4 +i34 +i33 *A8 +i33 ,4 +$. i33 +i32 $d +i32 *01 +i31 i30 +i3. ^$ +i2z x42 +i2z *32 p4 +i2Y +1 +i2x Y1 +i2@ x51 +i2w { L0 +i2W '9 +i2v ^b +i2u y3 +i2u *45 +i2s $v +i2r u +i2q ^w +i2q +i2p *57 +i2p *14 +i2k *75 +i2j +4 +i2h *35 +i2h .0 +] i2h +] i2g +i2e L5 ^A +i2d +i2c D8 +i2a .3 +$! i2a +i2a +i27 +i2& ,6 +i23 $2 +i21 *37 +[ i21 +i2@ +$. i2_ +i1y x43 +i1x ^r +i1x $5 +i1x $. +[ i1x +i1w ^7 +i1w *03 +i1v -3 +i1u x41 +2 +i1u ^s +i1u +2 x41 +i1S $@ [ +i1S [ $@ +i1r *73 +i1q p2 'A +i1P $6 +i1@ ^P +i1| o1l ^w +i1n ^B +i1n *17 +i1n +i1l ^m +i1l $! +i1_ i7_ +i1i +i1g i1a +i1g ,4 +i1f D7 +i1e i2l +i1d L5 +i1d ^b +i1- D7 +] i1d +i1C L2 +i1A $a +i1a *20 +i19 -0 +[ i19 +i18 T2 +i18 i04 +i15 i7. +i14 ^d +i11 x51 +i1- *13 +i10 L9 +i10 ^c +i10 *17 +^i $1 +i0z Z2 +i0z $m +i0z i2. +i0@ z5 +i0* z3 +i0- y1 +i0x ^f +i0X +i0w $V -0 +i0w -0 $V +i0W +i0U +i0t ^j +i0T ,9 +i0s $w +i0R ^N +i0P i0O +i0n $d +i0m o3v +i0M ,5 +i0L z2 +i0l ^R +i0L i1i +i0? L0 +} i0L +i0K ^O c +i0k ^b +i0j ^w +i0j ^R +[ i0j +i0h ^l +i0g i1h +i0e +i0c ^u +i0c o0v i4s +i0c i4s o0v +i0b $2 +i0* $b +i0A o2@ +i0A i6b +i0A $A -0 +i0a ,5 +i0A -0 $A +i09 i31 p4 +i08 y1 -5 +i08 i39 +i08 ^0 +i06 $* +i03 +i02 ^f +i0@ .2 +i01 -5 +i00 ^D +} i00 +i0% $% +i0@ } +i0- $_ +$# i0+ +^i $@ +$h Z5 +^h z2 +$h ^w +^H ^T +^h ^t +$h $p +^h ^o +$h $l +^h i0P +^H i0B +^h ^A +$h $a +^H *23 +$h *21 +$H +^g z2 +$G Z1 TA +^g y2 [ +^g $w +$g ^v +$g $p +$g o3z +$G o1W +^G ^L +$g ^l +^g i2p +^G i1T +^G i1r +^G i1K +$g i0G +$g $h +^g ^h +$G $B +$G ^A +^g +2 +^g ^1 +$G +^g $! +$f Z5 'A +$f ^z +f x81 +f x78 +f x76 K +f x6A k +} f x69 +f x63 ] +f ] x63 +f x32 +} f x2A +f x24 K +f u -7 +f u *21 +^F $S } +^f $s +$ f q +^f o46 +^F o1G +^F ^M +$F ^L +f K x76 +f k x6A +f K x24 +f K -6 +$f i5x +^f i0y +^f ^g +f D9 +$f d ] +f *B8 *21 +f -7 u +f -6 K +f *21 u +f *21 *B8 +f *02 r +$! ^f +[ $f +E z2 ] +E ] z2 +$) E Z1 +E Y4 T2 +E Y1 i0@ +E x31 T2 +$e x21 +^E u i3E +E T6 x41 +E T2 Y4 +E T2 x31 +$e ^t +E so@ +$E ^S +^e ^s +E q Y1 +E p4 '9 +E p2 'B +E o6N ] +E ] o6N +E o5L D6 +E o4L +E o2u +E i8* $* +E i6 +E i5r +E i5# $! +E $! i5# +$e i4r +$e i4b +^E i3E u +E i2B +^e i1r +E i0@ Y1 +E D6 o5L +^e ^c +E *78 *98 +^E $7 +E *58 Y4 +E -4 +E ^2 D6 +E ^@ +$. ^E +^e } +$d Z5 u +^d z2 E +d Z2 *76 +d y5 u +d Y2 u +d y2 u +d Y2 t +d Y1 ,6 +d xB1 x04 +d xA3 ] +d ] xA3 +d xA1 x03 +d x83 t +d x67 l +d x62 l +d x56 +d x51 t +d x05 x92 +d ^v +$d u Z5 +d u y5 +d u Y2 +d u y2 +d u K +d u i72 +d u D2 +d u *54 +d t Y2 +d t x83 +d t x51 +d t i73 +d t i72 +d TA +d t -9 +d T8 +d t *68 +d t *67 +d T5 +d t *45 +$d $t +d oB4 +d o74 +d o50 +d o4v +^d o1i +^; $d o0w +d l x67 +d l x62 +^d ^L +d K u +d ^k +d i9@ +d i9, +$D i81 +d i7s t +d i73 t +d i72 u +d i72 t +d i6w +$D i6L +^d i5g +d i4b +$d i2g +^d i1z +^D i0x +^D i0S +d $h Z1 +^d D4 +d D2 u +} ^D d +d C TB +d C r +d $b Y1 +d *A0 +$! D9 Z2 +D9 $U +] D9 t +d -9 t +D9 o0D +D8 oA8 +D8 i5 +D8 ,8 +8 +D8 ^( +D7 i5D +D7 'B +D7 $a +d ,6 Y1 +D6 o42 +D6 o3q +D6 o0T +D6 o0g +D6 o06 +D6 i1- +D6 ^A +d *68 t +d *67 t +D6 $4 +D6 $, +D5 $s +D5 ^s +D5 ^. r +D5 o6o +D5 o1o +D5 i6o +D5 ^e +D5 ^A +D5 ^7 +[ d *56 +d *54 u +$. D5 +^d ^5 +[ D4 Z3 +D4 o5B +D4 o0G +D4 ^O +D4 i6j +D4 i68 +D4 DA +d *45 t +D4 -0 +D3 ^q +D3 o4F +D3 l f +D3 f l +D3 D5 +D3 +2 +$d $3 +D2 y4 c +D2 ^x +$! D2 T0 +D2 o0T +D2 o0N +D2 ^n +D2 l +D2 *26 i3b +$D $2 +D1 y5 +D1 y2 +D1 t p1 +D1 t d +D1 ^s +D1 p1 t +D1 k +D1 i61 +D1 d t +D1 $A +D1 $2 +D1 $= +D0 T1 k +D0 t *01 +D0 i3g +D0 *01 t +d ] $+ +} ] ^d +} ^d ] +} ^d +^d $- +^d ] +$c Z4 Z3 +$c Z3 Z4 +c $! Z3 +C Z2 T1 +c z2 ] +c ] z2 +c Z1 z1 +c z1 Z1 +^c z1 Y1 +C [ y5 +c Y4 D5 +^c Y1 z1 +C y1 i48 +c $# Y1 +c x91 $6 +$C x51 +$c $v +$C t $j +C T5 +c T4 +C T1 Z2 +$c ^t +c sa8 +c R5 D6 +^C ^R +$c r +c p4 i5s +c oB4 +$c o6u +C o6) +c o5H +c o3w +C o0W +^c L1 +C K Y2 +^C ^K +C i8 +C i70 +C i6_ +C i6 +C i5_ +^c i1l +c i1h +C i1A +^c i0h +^c ^g +C $F $E +c D6 R5 +C D1 p1 +^c ^d +^C $c +^c ^B +$C $A +c $6 x91 +c $3 Y5 +^C ^3 +$c $3 +c ^1 z2 +c $# ^@ +c ^@ $# +^b z1 T1 +$b Z1 E +^B Y4 +^B Y2 +$B Y1 +^b ^x +'B u +^b p4 y1 +$b p4 $h +'B o9u +^b o2o +$b o0x +^b ^k *01 +^b ^J +$b i6a +'B i6 +$b i5j +$B ^F +^b ^f +$b E Z1 +$b ^e +'B c $0 +^b ^C +$b $c +$b $B +^b $B +*BA +$b $3 +^b ^1 +'B $0 c +$! ,B +} ^b +$a Z5 u +^a Z1 +^A $Z +'A Y3 +$A xA3 +^a x92 p5 +$A x71 +^a x13 +$a u Z5 +'A t $A +[ $A t +$A sa4 +$a $S +$a $s +'A $p t +$A o7d +^A o6! +^A o42 +$a o41 +^a o3v +^a ^, o0H +^a ^k u +^a ^j +$a i8b +,A i8 +$A i4d +$A i42 +$A i4. +$A i3l +^a i2d +$a i0w +$a ^G +$a E +^a ^E +$A d x62 +$A $d +$A ^d +^a ^a +$A *97 +^a .8 +$A -7 +^a *6A +$A *64 +$A *53 +$A $5 +'A $4 +^A ,3 +^a .3 +$A .2 +^a -1 +$A $. +$A ^! +$. $A +$? ^A +$! $A +'A $. [ +'A $! +'A [ $. +$a $@ +$a $/ +} $a +^a ^@ +^, $a +$9 x41 T0 +$9 T4 +$9 T0 x41 +$9 ^T +$9 $Q +'9 o8p Y1 ++9 o8% ++9 o5L +$9 iB0 +$9 i68 +$9 i5e +$9 ^i +$9 $H +^9 $f +^9 $e +'9 $A +*98 t +*97 *6A +*96 o6% +'9 $3 ++9 $2 +*91 r } +$9 ^# +,9 ] +,9 +^9 $) +$8 Z3 +'8 Y2 t +^8 y1 +.8 x62 +'8 t Y2 +$8 sc$ +-8 ^S ++8 $Q +.8 oA6 +$8 o6. +$8 o5o +-8 o1T +^8 o1L +$8 o1i ++8 o1e ++8 o0G +$8 o0F +,8 i8k +,8 i2n +$& +8 D4 +*8B 'B +-8 -A +-8 ,9 ++8 $7 +,8 -7 +*86 *57 +$8 +6 +*85 -5 +*84 D4 +$$ +8 +$. ^8 +$! -8 +,8 $* +,8 $@ +^8 $$ +$7 Z5 +$7 Z4 +$7 Z1 c +$7 Z1 ++7 y2 +-7 ^w ++7 u +$7 T9 +.7 szH +$7 p2 o0M +$7 o84 +-7 o63 +,7 o5l +-7 o4j ++7 o4H +-7 o2a ++7 o0f +$7 $M +$? $7 K +$7 i7s +$7 i7? +-7 i7/ +,7 i6e +$7 i3$ +$7 i0C +-7 $i ++7 D6 +$7 c Z1 ++7 c $1 +*7A +*79 +$! *79 ++7 +8 K +-7 ,8 +$7 $7 ++7 *64 +,7 *61 +*76 +'7 ^6 +*75 o7$ +*75 o5L +*75 o3e +*75 o2n +-7 *50 ++7 -5 +*75 $. +$! *75 +*74 ,7 +*73 -5 ++7 -2 +^7 $2 ++7 $1 c +-7 *14 +$. *71 +-7 $1 +*70 o4u +*70 o3! +*70 *64 +-7 +0 +$7 $* +$* -7 +$. .7 +,7 } +$6 Z3 +,6 Z1 [ +,6 [ Z1 +$6 Y5 +-6 Y3 u ++6 Y2 t +.6 Y1 $@ +-6 x06 +-6 ^v +^6 ^v +-6 u Y3 ++6 t Y2 ++6 t K ++6 sl; ++6 o7u ++6 o74 +.6 o74 +.6 o4p +.6 o1c +-6 o0t +,6 o0q ++6 K t +.6 i8s +-6 i7. +.6 i3S ++6 i33 +$6 i27 ++6 D5 +'6 d +^6 ^d +$6 ^C +*6A *97 +*6A +$. *6A +*69 i12 +*69 *87 +*67 x42 +*67 K +*67 i1c +-6 ,7 ++6 *68 +8 +*65 l d +*65 d l +*65 $4 $0 +*65 *34 +*65 $* +*64 o0j +*64 l *57 +*64 i46 +*64 i2y +*64 *57 l +*64 *57 +*64 *35 +*63 *45 +*63 *41 +*62 x06 u +*62 u x06 +*62 u d +*62 d u +*62 +6 +*62 *05 +*61 o8@ +*61 i7b +*61 D0 +*61 *25 +-6 -1 [ +*60 i2v +*60 i0c +*60 *25 +*60 *14 +*60 $. +$6 +0 +$! ^6 +^5 z2 +[ ,5 Z1 +-5 Y2 y2 +-5 y2 Y2 +-5 Y2 +-5 sdT +,5 $s ++5 R5 t +$5 ^p E +.5 o7% ++5 o4T ++5 o3T +-5 o3G +$5 ^l +-5 i55 ++5 i5@ +^5 i1K +-5 $a +*58 Y3 x12 +*58 x12 Y3 +*57 -2 +*56 o33 +*56 k +*56 i4M ++5 *69 +*56 .7 +*56 +6 +^5 *61 p1 +,5 *56 +-5 *53 +*54 K +3 +*54 i1V +*54 i1j +*54 *63 +.5 *45 +*54 ,4 +*54 +3 K +*54 +0 +*53 $q +*53 o7z +*53 o6n +*53 o31 +*53 o1w +*53 +6 +*53 -5 ++5 *34 p4 +$5 *32 +^5 $3 +*52 o3r +.5 $2 +,5 -2 +*51 i5Y +-5 *14 +*51 *36 +*51 +$5 -1 +^5 ^1 +*50 o52 +} *50 K ++5 *05 +*50 *24 +-5 +0 +$5 $$ +$@ -5 +[ '5 +-5 $* +-5 $, +^5 $ +^! .5 { +.4 $. Z1 +^4 z1 +.4 Y4 c ++4 Y3 c +$4 Y2 +-4 y2 +[ .4 Y1 +{ +4 y1 +$4 x73 +^4 x41 +$4 T2 +.4 t +-4 sa@ c +$4 $P +.4 o68 +,4 o59 +,4 o3y +,4 o3w +.4 o3M +.4 o3F +.4 o3- +.4 ^m +,4 K +$4 i7@ +$4 i7. ++4 i4L +,4 i4a +.4 i42 ++4 i3b +^4 $f ++4 D3 +.4 c Y4 ++4 c Y3 +-4 c sa@ ++4 ^b o62 +$4 $a p4 +$4 .7 +-4 +7 +*46 o4) +*46 o3a +*46 ^@ +*45 i6 +*45 *63 ++4 *54 +*45 *34 +*45 *23 +,4 +5 +-4 .5 +$* ^4 *41 ++4 +4 +0 +$4 ^4 +*43 y1 *13 +*43 o2h +*43 o1o +*43 i5q +*43 i5p +*43 i4a +*43 ^e +,4 *37 +*43 *07 +*42 d E +-4 +2 +*41 Y3 y2 +*41 y2 Y3 +[ *41 t +*41 i2l +*41 $! +*41 $_ +*40 x02 +*40 o4i ++4 +0 +4 +*40 *25 $. +*40 $. *25 +$@ *40 +$@ ,4 +$3 Z2 +$3 ^z +.3 Y2 r +,3 $. Y1 +-3 x51 ++3 x43 +$3 x42 c +^3 x13 +$3 ^x +$3 ^w +$3 T5 +$3 se3 +$3 s3M $k ++3 $s +^3 r ^k +$3 o85 +-3 o7p +-3 o6( ++3 o5s +-3 o5s +-3 o57 +-3 o4u ++3 o4T +.3 o4- +,3 o2k +.3 o2e +$3 o0G +$3 $M +$3 ^m +-3 $m +$3 $k s3M +.3 i4x +,3 i4n +,3 i4k +,3 i3g +.3 i2e +$3 D2 +-3 D2 +$3 c x42 +$3 C +^3 ^b +*37 p2 'A +*36 o1n +*36 $1 +,3 $5 p4 +*35 o5q +*35 o1I +*35 i4i x52 +*35 *46 +*35 *27 +*35 *24 +$. *35 +-3 +5 +^3 $5 +*34 o6b +*34 o1I +*34 i7p +*34 i2u +$3 -4 +$3 *32 +*32 o2r +*32 K +*32 C ++3 *27 +*32 +0 +$. *32 +-3 .2 +*31 o0L +*31 $1 +[ $3 +1 +^3 ^1 +*30 x61 +*30 s1- +*30 o0b +*30 o0! +*30 K k +*30 k K +*30 i3_ +*30 d Y4 +*30 *54 +*30 -2 +*30 +0 ++3 $* +$@ +3 +$2 Y5 +] ,2 Y5 ++2 Y2 *52 +,2 Y1 +$2 x52 +[ -2 x41 +$2 $T +^2 $T +$2 ^S +^2 r +$' ,2 o9. +$2 o6e +-2 o5w +,2 o4v +,2 o4; ++2 o3R +-2 o1- ++2 o0w ++2 o0r +-2 o0n ++2 o0g +-2 o0D +[ .2 k +$2 i5y +,2 i53 ++2 i3j +-2 i3f +$2 i37 +,2 i2z +.2 i2C ++2 i1A +$2 i1A +^2 i0a ++2 *73 +*25 y4 c +*25 c y4 +$2 *56 +.2 *52 ++2 -5 +*24 x21 u +*24 u x21 +*24 o45 +*24 i3z ++2 *41 +*24 *02 +*23 o3q +*23 o1p +,2 *36 +*23 -2 *25 +*23 +2 +*23 ] +*21 *23 +*21 +1 +*21 *03 +*20 p2 'B +*20 i5A +*20 i4c +*20 d T1 +*20 ^D +*20 $5 ++2 *04 +*20 *34 +*20 .1 +*20 $. +.2 +0 +-2 +0 ++2 [ +$2 [ +$@ $2 +$! .2 +] ^2 +-2 $! +^@ +2 +^- ^2 ++1 z1 t +$1 $z +^1 y1 $@ +^1 $@ y1 +$1 x51 +$1 x31 D3 +$1 x01 +$1 u T3 ++1 t z1 +] $1 T3 ++1 ^t +$1 syY +-1 sea +$1 r ^3 +$1 $Q +^1 o9y +$1 o8- ++1 o4f +$1 o3k +.1 o2w +.1 o2g +$1 o21 ++1 o2. +^1 o1P +$1 k ^s +.1 ^k +^1 { i8r +] $1 i8h +$1 i8A +$1 i7L l +$1 i6z +$1 i5= +-1 i45 +$1 i3r +.1 i3k ++1 i2Y +$1 i2d ++1 i1i +^1 i14 +.1 i11 +$1 i0I +^1 i0c +^1 $H +$1 ^g +$1 ^f +^1 D4 +$1 D3 x31 +^1 ^a +*18 o7M +*16 o5b +*16 i3e +$1 +6 +*15 o0Z +*14 o2b +*14 o0z ++1 *45 +*13 y5 c +*13 i6l +*13 i40 +*13 *45 +*13 *23 $! +*13 $! *23 +[ +1 *31 +[ +1 $3 +,1 ,3 +[ *12 Z2 +*12 u +*12 o2w +*12 i6 +*10 i1S ++1 .0 ++1 $@ +$1 ^& +$1 ^_ +-1 $@ +^1 $) +^1 $_ +^1 $^ +^. ^1 +^! $1 +^, $1 +$0 $z Z1 +$0 Z4 Y2 +$* +0 Z1 ++0 y4 u ++0 y2 u ++0 Y2 *73 +-0 Y2 +-0 x45 +-0 x31 $g ++0 u y4 ++0 u y2 +-0 u +$0 T5 +-0 ^T ++0 o8. ++0 o7! +-0 o6. ++0 o5l +-0 o3d ++0 o36 ++0 o2k ++0 o1P +-0 o17 +$0 ^N +-0 ^k +^0 k $. +^0 $. k +^0 ^k +$0 i6b +.0 i5B ++0 i59 +$0 i57 +$0 i5_ +-0 i4@ +-0 i3A +.0 i2h ++0 i1v ++0 i1r +.0 i1k +-0 i19 ++0 i17 +-0 $g x31 +^0 ^a ++0 $8 +*07 o6L +*06 o0A +*06 i0c +*05 o5z +*05 i2s +*05 *52 +*04 Y1 i6b +*04 o32 *24 +*04 i2x +*04 *24 o32 +*04 +$0 $4 +*03 y1 ^b +*03 $q +*03 o3s +*03 -5 +*03 *32 +3 +^@ *03 +*02 p3 x08 +*02 o2f +*02 k +*02 i5A +*02 i4u ++0 *21 +.0 *20 +-0 -2 +*01 o3@ +*01 i3k +*01 ^e +-0 *12 +*01 { +.0 *04 +-0 *03 ++0 { +$0 [ +$! .0 +$! -0 +} +0 +$+ $_ +$# $* +$# $! +$$ $# +$$ $! +$@ [ +$] +$" +$. $+ +$! $* +$! $! +$! [ +$! ^. +$- $_ +$> +} ^! +] $@ +^* $@ +^$ $! +^@ $. +^@ ^! +^/ $\ +^/ +^! ^@ +^- ^= +^> $< +^` $. +$z Z5 +$* ^z Z1 +^Z $Z +^z y5 +$Z y4 y4 +$z $y +$z $v +^z t d +$z $r +$z ^q +^z ^p +^z o5g +[ ^z o4h +] $z o3w +^z o2f +^Z ^N +^z $n +^Z l ^f +$Z $L +^Z ^L +^z ^k +$Z iAz +$z i6c *52 +$Z i4y +^z i3u +$z i3r +^z i2k +$Z i1o +^Z ^f l +^z d t +^z ^D +^z $A +Z5 Z5 x13 +$ Z5 z5 +$ z5 Z5 +Z5 Z4 Z3 +Z5 Z4 x19 +Z5 Z3 Z4 +Z5 z3 r +Z5 Z1 +Z5 Y5 oAq +Z5 Y5 -1 +Z5 Y4 x42 +z5 y4 { +z5 { y4 +z5 y3 +Z5 Y2 *43 +Z5 $/ Y1 +Z5 x59 .1 +z5 x48 t +Z5 x42 Y4 +Z5 x19 Z4 +Z5 x13 Z5 +z5 x0B +z5 ^w x35 +z5 t x48 +Z5 t D1 +Z5 t +Z5 q $r +z5 oAk C +Z5 D1 t +Z5 *B5 +Z5 *5B +Z5 *43 Y2 +$z *52 i6c +Z5 -1 Y5 +Z5 .1 x59 +Z5 $@ +^. z5 +Z4 Z5 z3 +Z4 Z5 Y3 +Z4 Z5 *05 +Z4 Z5 +Z4 Z4 Z4 +$! Z4 Z4 +Z4 z3 Z5 +Z4 Z3 u +$% Z4 Z3 +$ Z4 Y4 +Z4 Y3 Z5 +Z4 y3 D5 +Z4 x54 } +Z4 u Z3 +Z4 u s4a +z4 u *96 +} z4 u +$| Z4 t +z4 *96 u +^z *45 +z4 *36 *18 +z4 *18 *36 +Z4 ,1 +Z4 *05 Z5 +Z4 $. +$& Z4 +z3 Z5 r +$% Z3 Z4 +Z3 Z3 +z3 Z2 *40 +$/ Z3 Z1 +Z3 y5 x85 +Z3 Y3 x23 +Z3 x23 Y3 +z3 x07 +[ z3 t +Z3 se& +Z3 p1 +6 +Z3 oB$ +Z3 o82 +Z3 o6_ +Z3 o4p +Z3 $K +Z3 i89 +Z3 $A +Z3 *81 *36 +Z3 *61 $! +Z3 $! *61 +Z3 +6 +z3 *40 Z2 +Z3 *36 *81 +^z *30 -1 +$/ Z3 +{ Z3 +^@ z3 +Z2 z2 p2 +Z2 z2 *13 +Z2 y4 ,8 +^- z2 Y3 +Z2 xA1 ] +Z2 ] xA1 +Z2 x63 +Z2 x37 +Z2 u o5C +Z2 u +9 +Z2 T5 +B +Z2 t *17 +$$ Z2 t +Z2 s4C +z2 s4 +Z2 ^s +Z2 ^q +Z2 o9 +Z2 o8@ i9@ +Z2 o5s +Z2 o5f +Z2 o5C u +z2 o1u +Z2 o1o +z2 o1F +Z2 l +A +z2 ^L +Z2 $J +Z2 i9@ o8@ +Z2 i8. +Z2 i8_ +z2 i0P +$# Z2 E +z2 d y1 +Z2 d x13 +z2 ^D +z2 C z1 +$/ Z2 c +z2 c ] +z2 ] c +Z2 +B T5 +z2 $A Z2 +Z2 +A l +z2 $a *52 +Z2 $a *48 +Z2 +A +z2 ^A +Z2 +9 u +Z2 +8 d +Z2 *64 $. +Z2 $. *64 +z2 *52 $a +Z2 *48 $a +z2 { -3 +Z2 -2 -1 +Z2 *17 t +z2 *15 +Z2 *14 +Z2 [ *12 +Z2 -1 -2 +z2 *06 ] +z2 *06 +z2 ] *06 +Z2 $0 +$. Z2 .0 +{ Z2 +[ Z2 +^+ z2 +^& z2 +^- z2 +Z1 Z5 +$/ Z1 Z3 +$* Z1 ^z +Z1 Y4 +Z1 Y3 t +Z1 Y3 +$! Z1 x82 +Z1 x62 u +Z1 x51 i1r +z1 x45 y5 +Z1 u x62 +z1 u i1I +Z1 u D6 +Z1 u +6 +z1 u ^5 +Z1 u $! +Z1 $! u +Z1 t $Z +Z1 t Y3 +z1 ^t $6 +$! Z1 T1 +Z1 s5v +Z1 p4 l +Z1 p4 E +z1 $p } +Z1 o2p +Z1 l p4 +Z1 i67 $A +z1 i5@ +Z1 i4d +Z1 i3i +Z1 i2p o7b +z1 i1I u +Z1 i0! y1 +Z1 $i +Z1 E p4 +Z1 E $5 +Z1 D6 u +Z1 D6 +$+ Z1 D6 +Z1 C $9 +Z1 c *32 +Z1 C ,3 +Z1 c $% +Z1 $% c +z1 c $@ +z1 $@ c +} z1 c +Z1 $A i67 +[ Z1 $A +Z1 $9 C +$$ Z1 +8 +Z1 +7 +Z1 +6 u +z1 $6 ^t +Z1 .6 +z1 ^5 u +Z1 $5 E +Z1 *56 +Z1 .5 [ +z1 *43 *02 +Z1 ,3 C +Z1 *32 c +^z -1 *30 +^ z1 $2 +Z1 ^1 z2 +Z1 *17 q +Z1 *06 ^5 +z1 *06 +$/ Z1 *03 +z1 *02 *43 +$% Z1 } +$' Z1 +$- Z1 $. +$` Z1 +[ Z1 $% +[ $@ Z1 +[ Z1 +$+ z1 +^_ ^Z +{ $z +] $z +] } $z +^z $ +^z ] +^z +$y Z2 t +^y z2 +$Y Y3 [ +$Y [ Y3 +[ $Y Y3 +$y Y1 +^Y $Y +$Y ^X *76 +^Y ^X +^y ^V +$y t Z2 +$y $t *62 +^Y ^T +$y $r +^y ^p +$y o6z +$y o63 +^Y o4B +$y o2h +^Y o2C +$y $j +^y i6t +$y i4A +^y i3d +^Y i2P +$y $e +^y ^e +$y D2 r +^Y ^A +^Y $9 +$y *62 $t +y5 z3 *A3 +y5 Z1 E +y5 ^z +y5 Y4 x53 +Y5 Y4 x38 +y5 xA6 E +y5 xA2 y5 +y5 x93 +y5 x85 +y5 x82 c +y5 x74 -5 +y5 x73 .4 +Y5 { x73 +y5 x72 x41 +y5 x72 [ +Y5 x64 .4 +Y5 x64 $0 +y5 x56 u +y5 x52 t +y5 x38 E +y5 x27 ^m +Y5 x25 +Y5 x24 -5 +Y5 x23 [ +Y5 x21 +Y5 x14 $@ +Y5 $@ x14 +y5 x13 +Y5 x02 E +y5 x02 +y5 u x56 +Y5 u ^S +y5 t x52 +y5 t i58 +Y5 T0 ^1 +Y5 ^S u +y5 s2Y +y5 RA c +y5 RA $A +y5 R5 { +y5 p1 x47 +y5 o9i +Y5 o8M x12 +Y5 o7f +Y5 o7c +Y5 o7b +Y5 o7. +y5 o5t +y5 o5f +y5 o4& +y5 o0T +y5 o0N +y5 o0K +y5 K C +y5 $k +y5 i58 t +y5 i5_ +Y5 i0F +y5 [ ^G +y5 ^F +y5 E Z1 +y5 E xA6 +y5 E x38 +Y5 E x02 +y5 d x0A +y5 D8 +Y5 ^D +y5 c x82 +y5 c RA +y5 C $l +y5 C K +y5 C *05 +y5 ^A x92 +y5 $A RA +y5 *A8 x53 +y5 -5 x74 +y5 *59 +y5 .4 x73 +Y5 .4 x64 +y5 -4 +Y5 $2 +Y5 $0 x64 +y5 $0 +y5 -0 +$. Y5 +] y5 +y4 Z2 ,8 +Y4 Y5 *02 +Y4 Y4 x02 +y4 y4 u +y4 y4 K +Y4 Y4 D2 +y4 y4 c +Y4 Y4 ^_ +Y4 ^_ Y4 +{ y4 y4 +Y4 y2 u +Y4 Y1 x62 +y4 x82 E +y4 x76 R3 +y4 x72 o4k +y4 x71 c +Y4 x62 Y1 +Y4 x62 T0 +Y4 x52 t +y4 x43 i4n +Y4 x42 [ +Y4 x32 E +Y4 x13 C +y4 x12 K +Y4 x02 Y4 +y4 x02 o6r +y4 u y4 +Y4 u y2 +y4 u .4 +Y4 t x52 +Y4 t '8 +y4 t *63 +Y4 T0 x62 +y4 R3 x76 +Y4 o9. +y4 o7. +y4 o5u +Y4 o5_ +y4 o4z +y4 o4l E +y4 o4k x72 +y4 o4d +y4 o3i +y4 o3a l +y4 o0y +Y4 o0W +y4 o0r +Y4 o0j +Y4 o0C +y4 o0a +y4 l o3a +Y4 l *36 +y4 K y4 +y4 K x12 +Y4 K +y4 iB) x57 +Y4 i8b +Y4 i8- +y4 i4r L4 +Y4 i4, +Y4 ^H +Y4 f x3B +y4 E x82 +Y4 E x32 +Y4 E T5 +y4 E o4l +y4 E $? +y4 $? E +Y4 D6 +Y4 D2 Y4 +y4 D1 $@ +y4 $@ D1 +y4 c x71 +Y4 C x13 +Y4 c T2 +y4 C '9 +y4 c -0 +Y4 +B +Y4 +A +Y4 ^A +[ y4 $A +y4 '9 C +Y4 $9 +y4 $. -9 +y4 -9 $. +y4 ,8 Z2 +Y4 '8 t +y4 *68 x82 +y4 *63 t +Y4 -5 -4 +y4 .4 u +y4 *48 +Y4 -4 -5 +Y4 +4 +4 +Y4 +4 *21 +Y4 *36 l +y4 +3 +Y4 *27 ] +Y4 ] *27 +Y4 *21 +4 +y4 $1 +y4 -0 c +Y4 *02 Y5 +^- Y3 z2 +Y3 ^z +Y3 Y3 y3 +Y3 y3 Y3 +Y3 Y3 ^T +Y3 Y3 D1 +y3 y3 +9 +y3 Y2 Y2 +Y3 Y1 +Y3 $Y [ +Y3 [ $Y +[ Y3 $Y +y3 x81 +6 +Y3 x58 +y3 x52 c +y3 x52 +y3 x51 +y3 x45 +Y3 x43 k +Y3 x37 y3 +Y3 x31 E +Y3 $W +Y3 u D4 +] Y3 u +Y3 ^T Y3 +Y3 sSm +Y3 snu +Y3 sd_ +Y3 oA1 +Y3 oA. +Y3 o9 +Y3 o6f +y3 o3d +Y3 o2v *43 +y3 o2g +y3 o0y +y3 o0M +y3 o0K +y3 o0h +y3 o0f +y3 o0D +y3 o0C +y3 o0b +Y3 k x43 +Y3 K +Y3 i6- +y3 i6- +y3 i31 +y3 i3- +Y3 $H +Y3 E x31 +Y3 E -5 +y3 E +y3 D8 ,7 +Y3 D6 $4 +Y3 D4 u +Y3 D1 Y3 +Y3 D1 x43 +y3 c x52 +Y3 c -5 +y3 C +Y3 $a Z2 +y3 ,7 D8 +y3 -7 +y3 +6 x81 +Y3 -5 E +Y3 -5 c +y3 *54 +Y3 $5 +Y3 $4 D6 +Y3 *43 o2v +y3 *36 +Y3 +2 y3 +Y3 $2 +y3 $2 +] Y3 +1 +y3 ,1 +y3 *02 $* +y3 $* *02 +Y3 $0 +[ y3 -0 +Y3 } } +Y3 { { +] Y3 ] +y3 $@ +y3 $/ +y3 $ [ +y3 } } +y3 [ $ +y2 Z5 Z5 +y2 z2 ] +y2 ] z2 +Y2 Z1 +y2 Y4 Y4 +y2 y4 +y2 Y3 x43 +y2 Y3 u +y2 Y2 Y2 +y2 y2 u +y2 Y2 t +Y2 Y2 +4 +y2 Y2 -4 +Y2 Y2 ,3 +y2 Y1 t +Y2 $y +y2 x72 $. +y2 $. x72 +y2 x54 i4_ +y2 x53 t +Y2 ^x *53 +Y2 x51 y5 +y2 x51 i4- +y2 x43 Y3 +y2 x42 $@ +y2 $@ x42 +y2 x41 c +y2 x39 q +{ y2 x34 +y2 x15 t +Y2 x09 +Y2 x08 +Y2 $w +y2 u Y3 +y2 u y2 +Y2 u -5 +y2 ^U +y2 t Y2 +y2 t Y1 +y2 t x53 +y2 t x15 +Y2 t o7D +y2 t *71 +Y2 T2 +y2 T2 +y2 sXA +y2 smv [ +y2 [ smv +y2 sdK +Y2 s20 $! +Y2 $! s20 +Y2 $s +y2 ^S +y2 ^s +Y2 $Q +Y2 p2 x02 +Y2 o91 r +] Y2 o79 +Y2 o77 *61 +Y2 o7* +Y2 o6D C +Y2 o6@ +Y2 o6 +Y2 o5w +Y2 o5h +Y2 o5g +y2 o4v +y2 o4. +y2 o3w +y2 o3 +y2 o2w +y2 o23 +y2 o1w +y2 o1a +Y2 o0v +y2 o0e +y2 ^m +} y2 L1 +y2 k *24 +y2 $K +Y2 $j +Y2 i6j +Y2 i5@ +Y2 i49 C +y2 i2m +y2 i1e +y2 i12 +y2 ^G +y2 E $2 +Y2 $e +y2 E $! +y2 $! E +y2 d x68 +Y2 $d +y2 c x41 +Y2 C o6D +Y2 C i49 +Y2 C $# +Y2 $# C +Y2 ^B -8 +y2 $A r +Y2 *AB +] Y2 ^A +y2 ^A +Y2 +9 +Y2 ,8 +y2 $8 [ +y2 [ $8 +y2 *71 t +Y2 *71 +Y2 $7 +y2 *65 +Y2 *61 o77 +Y2 -5 u +Y2 *50 +y2 +5 +Y2 +4 Y2 +y2 -4 Y2 +y2 { *47 +y2 *42 +Y2 ,3 Y2 +y2 *36 +y2 *32 +Y2 } +3 +y2 $2 E +y2 *24 k +y2 *23 ^O +y2 *12 +y2 +0 ^u +y2 -0 ^P +y2 *01 ^B +{ y2 +0 +Y2 $# +Y2 } +$% Y2 +$# $$ Y2 +y2 { +Y1 z1 C +Y1 Z1 $9 +Y1 Y4 c +Y1 Y3 +Y1 x74 $@ +Y1 $@ x74 +Y1 x51 E +y1 x51 *02 +$^ Y1 x45 +Y1 x43 y5 +y1 x43 +Y1 x03 +Y1 u i43 +y1 u i0C +y1 u ^7 +Y1 u ,3 +Y1 t T6 +Y1 T6 t +Y1 T3 +Y1 sa2 +y1 s2s +Y1 r i0f +Y1 $R +Y1 $q +Y1 p1 x09 +Y1 p1 +A +Y1 p1 +{ Y1 ^P +Y1 o6@ +Y1 o0S +Y1 ^M +Y1 i90 -8 +Y1 i6w +Y1 i43 u +y1 i34 +Y1 i19 +y1 i0 z2 +y1 i0K +y1 i0C u +y1 ^F $3 +y1 ^F +y1 ^f +Y1 E x51 +y1 E ^W +Y1 $e C +$$ Y1 D0 +Y1 d +Y1 c Y4 +$- Y1 c +Y1 -8 i90 +y1 *87 ,7 +y1 ^7 u +Y1 $7 r +Y1 *72 *36 +Y1 $+ -7 +Y1 -7 $+ +Y1 ^5 z2 +Y1 -4 *74 +Y1 $4 +Y1 ,3 u +y1 $3 ^F +Y1 *36 *72 +^Y *13 +[ y1 ^3 +Y1 *17 q +Y1 *03 $* +Y1 $* *03 +y1 *02 x51 +Y1 $+ +Y1 $@ +] Y1 +$Y +^y +$x Z5 u +$x Z2 +$x } z1 +$x Y5 x06 +^x $X +$x ^v k +$x u Z5 +^x $u +^X ^T +] ^x ^R +^x ^r +^x q +^x $p +^x o7f +^x o3j +^x o3_ +$X o0F +$x i6d +{ $x i5m +^x i5f +$x i4t +$x i3l +^X i2z +^X i1C +$X i0X +^_ ^X i0E +^x i0a +^x ^g +^x ^e +$x ^c +xB4 ] ] +xB1 x91 +xB1 u +xA3 +xA1 x19 +xA1 t ,9 +xA1 i7N x63 +xA1 ,9 t +xA1 $. +^x ^a +x93 t +x93 o88 +x92 u +x91 c +^x '8 +5 +x84 t +x84 $a +x83 Z1 +$! x82 Z1 +x82 xA1 +x82 R8 R8 +x82 $5 +x82 $@ +$! x82 +x81 s28 +x81 $o +x81 *89 +x81 $6 +$X ^8 +x74 $1 +x74 +x72 o2x +x72 i7f +x72 $! +x71 Y3 +x71 o0z +x71 ^e ^L +x71 DA +x71 D5 $! +x71 $! D5 +x71 $d +] x71 +$x -7 +x65 x81 +x64 i6b +x64 $a +x64 $4 +x64 $2 +x63 u d +x63 t +x63 d u +x63 -2 +x63 $1 +x62 x31 +x62 r +x62 o5. +x62 i86 +x62 'B +x62 ^1 o1J +x62 $1 +x62 $! +x62 ] ] +x61 ^v +x61 u p1 +x61 p2 x0B +x61 p1 u +x61 o12 +x61 o06 +x61 i1- +x61 D0 i0C +x61 .8 +x61 *25 +x61 $2 +x61 $, +^x +5 '8 +x56 i3@ +x54 D5 +x53 y5 y5 +x53 i2i +x52 Z1 +x52 Y5 'A +x52 s80 +x52 o5q +x52 o4& +x52 o2w +x52 K Y4 +x52 $j +x52 +1 +$- x52 +$_ x52 +] x52 +^$ x52 { +x51 Y5 +x51 x81 +x51 x72 ] +x51 ] x72 +x51 ^x +x51 o5b +x51 o56 +x51 o4o +x51 o2b +x51 o0T +x51 o0s +x51 $j *50 +x51 i6@ +x51 i3c +x51 i0a +x51 *50 $j +x51 -2 +x51 $! -0 +x51 -0 $! +x47 $0 +x46 Y4 Y4 +x45 y5 T9 +$^ x45 Y1 +x45 o7C +x45 i2M +x45 $1 +x43 Z1 y5 +x43 y5 Z1 +x43 y4 +x43 o7> +x43 o4@ +x43 o3_ +x43 i4B +x43 i3t +x43 .4 +x43 $. +$* x43 +x42 y5 c +x42 y2 y2 +x42 t R4 +x42 sa1 +x42 R4 t +x42 o3_ +x42 o2S +x42 i5* +x42 i4c +0 +x42 *25 $! +x42 $! *25 +x42 +0 i4c +x42 ^@ +$! x42 +x41 Y4 t +x41 Y2 $A +x41 t Y4 +x41 ^S +x41 ^q +x41 o6f +x41 o5B +x41 o4& +x41 o2h +x41 o1@ +x41 o0G +x41 l f +x41 i5 +x41 i11 +x41 f l +x41 D6 $2 +x41 ^a +x41 $6 +x41 *42 +x41 -4 +x41 ^4 +x41 $2 D6 +x41 .1 +x35 Z1 +5 +x35 R3 R3 +x35 +5 Z1 +x35 +0 +x34 p4 +x34 i3f +x34 ^e +x34 $c *03 +x34 ^4 +x34 *03 $c +x34 [ +x32 y5 D9 +x32 y2 k +x32 xA2 +x32 x37 +x32 ^p +x32 o5v +x32 o5d +x32 i4z +x32 i2M +x32 i2h +{ x32 c +x32 +A +x32 .5 +x32 $2 +x32 [ +x32 ^! +$. x32 +x31 y5 i5_ +x31 y2 [ +x31 ^W +x31 u +x31 p1 c +x31 o4F +x31 o0G +x31 o0f +x31 k d +x31 i4- +x31 i2e +x31 D6 +x31 -2 +x29 p4 ] +x27 i2h +x26 q Z1 +x26 q Y1 +x26 q ^o +x26 i2b +x26 C T1 +x25 z5 t +x25 z4 +x25 y2 u +x25 u y2 +x25 t z5 +x25 q Z1 +x25 p4 T0 +x25 i3s +x24 Z2 l +x24 y3 } +x24 } y3 +x24 y2 t +x24 y1 +x24 t y2 +x24 l Z2 +x24 i4m +x24 i4* +x24 i2h +x23 Z5 Z1 +x23 Z1 Z5 +x23 Y3 y2 +x23 y3 o42 +x23 y3 } +x23 } y3 +x23 y2 Y3 +x23 r $h +x23 E y2 +x23 d E +x23 ^6 z2 +x23 $+ +[ x23 +x21 ^z +x21 Y1 s1+ +x21 ^u +x21 t [ +x21 [ t +x21 s^A +x21 s1+ Y1 +x21 p3 '9 +x21 o2h +x21 o0c +x21 $k $l +x21 ^k +x21 i65 +x21 i4- +x21 i3q *20 +x21 $a +x21 $5 +x21 *20 i3q +^x *20 +x1A C +x16 z5 +x16 t +x16 p2 +0 +x15 y2 u +x15 x05 +x15 u y2 +x15 ] +x14 z5 z1 +x14 z3 z3 +x14 z1 z5 +x14 Y4 +x14 y2 +x14 p2 +x14 K +4 +x14 i3C +x14 +4 K +x13 y2 t +x13 ^x ^t +x13 t y2 +x13 R3 t +x13 o0Y +x13 k q +x12 y3 y3 +x12 Y3 ^A +x12 Y1 ^B +x12 $@ ^T +x12 ^T $@ +x12 p3 x0A +x12 p2 '9 +x12 o2x +x12 o1T +x12 o1R +x12 ^o +$* x12 ^l +x12 k ^D +x12 i0g +x12 i0\ +x12 ^B Y1 +x12 ^A Y3 +x12 *14 +^x +1 +x0A p1 +x09 Y2 +x09 y2 +x09 u +x08 y4 +x08 p5 +x08 d +x07 Y2 y2 +x07 y2 Y2 +x07 p4 ] +$x *07 +x06 y3 y3 +x06 r +x06 p2 +x06 f +x06 $1 +x06 } +x05 z2 +x05 i4v +x05 +3 +x04 Z5 Y5 +x04 Y4 Y4 +x04 R4 R4 +x04 p1 x05 +x04 o1w +x04 'A +$ x04 +x03 y4 +x03 y2 u +x03 x21 +x03 u y2 +x03 s14 +x03 ^p +x03 o3, +x03 i4m +x03 i2n +x03 $7 +x03 $! +$x *03 +x02 z1 $. +x02 $. z1 +x02 y5 +x02 y4 E +x02 y4 +x02 y3 +x02 r +x02 o7t +x02 o3r +x02 o0h *46 +x02 i2@ +x02 i1e +x02 c ^M +x02 ^c +x02 *65 +x02 *46 o0h +x02 ,4 +x02 *12 +x01 $Y Z1 +x01 Y4 ^R +x01 y2 y2 +x01 $w +x01 ^R Y4 +x01 o5b +x01 i5= +$x $! +$@ ^x +$. $x +$w Z2 -4 +^w y2 +^w x61 +$w x41 +^w x16 +^w ^x +^W ^T +$w sdm +^w ^Q +^W oAL +$W o81 +^w o1j +$w o18 +$w o0s +^w $m +$w $k +$W $J +$w iAq +^w i6r +$W i3H +$W i3F +$w i1s +^w i1j +^w i0k +^w ^f +$w E $a +^w ^D +$w ^d +$@ ^W C +$w $b +$w $a E +$w $a +$W .7 +^w +5 +$w -4 Z2 +^w *24 +$W ^1 +^w *03 +$w $@ +$v Z5 t +$v Z5 +$v $z +$v $x +$v t Z5 +$v $t +^v $p +$v $n +^v L0 +^V ^L +^v ^l +^V ^J +^V i5B +$v i3y +^v i1z +^V i1l +^V i1A +$v i0r +^v ^I +^v ^i +^v ^d +^V ^A +^v $8 +$v *71 x31 +^v $6 +$v $4 +^v +2 +^V $@ +$v $@ +$- $v +^v $@ +u Z5 Y4 +u Z5 +0 +u [ z5 +u z4 x71 +} u z4 +u Z1 y1 +u Z1 iAA +^u ^Z +u Y5 DA +] u Y3 +u [ y3 +u Y2 Z1 +u Y2 T1 +u Y2 o0S +u y1 Z1 +u Y1 $4 +u $x Z5 +u x83 +u x73 t +u x72 +u x52 d +u x51 +^u x32 +u t x73 +u t o4* +$u t $A +u T9 +u T3 K +u T2 sEa +u T1 Y2 +^u ^T +u ^S x23 +u sOE +u sEa T2 +u sC* t +u ^S +u R7 t +} u R0 +u ^R +^u } r +u p2 x02 +^u p2 ^j +u p1 y4 +u p1 xB3 +u p1 x53 +u p1 x13 +u p1 $K +u p1 ,7 +u ^O ^D +u o7V +u o6A +u o69 +u o4* t +$U o4| +^u o3@ +$u o2T +u o1Z +u o0W +u o0S Y2 +u o0a +^u ^o +^u ^M +^u ^m +$u L7 +$U l $$ +$U $$ l +u k y2 +u K T3 +^u ^j +u i7W +u i7A +u i3A +$u i0t +u i0a +u f ^G +u ^F +u d xB5 +u d xB3 +u d x62 +u d x46 +u d x42 +u d +B +u DA +A +$U D9 +u d -8 +u D4 +^u ^c +u *B9 +^U +B +u $a Y1 +^U ^A +u .9 +u +8 +0 +$u $8 +u -7 x51 +u +7 ,3 +^u $7 +^u ^6 { +u $5 Z1 +u .5 Y4 +^u +5 +u ,3 +7 +u +3 +$U $1 +u +0 Z5 +u $0 Y4 +u +0 +8 +^. ^U +$* u +[ u +t z5 z1 +t Z5 +$| t Z4 +t Z3 oAa +[ t z3 +t Z2 ^o +$t Z2 +$$ t Z2 +t z1 z5 +t Z1 T8 +t $Z +t Y5 xA1 +^t Y4 +t Y2 x01 +t y2 +t Y1 $s +t Y1 *A8 +^T y1 +^t y1 +^t ^Y +t x52 $3 +t x01 Y2 +^T t ^a +t T8 Z1 +t T6 o7o +^T T2 +$t st! +t sOA +t sMK +t sAb +t sAa +t sa$ +$t $s -2 +t $r Z4 +t R4 t +t R3 t +^t $r +t q +t p2 x84 +t p1 x78 +t p1 o61 +t p1 .6 +{ $t ^p +t ^o Z2 +t oAD ] +t ] oAD +t o8T +t o8F +t o8C +t o7S +t o7o T6 +t o7I +$T o6Q +t o6B +$t o5w +t o3Y +t o2I d +t o2G +t o1Y +$t o0u +t o0M -1 +$T o01 +^t $o +t $N +8 +^t ^N +^t ^n +^T ^M +^t ^M +$t $m +^T ^L +t k .3 +$T i9U +t i9R +t i9A +$T i7Q +t i7O +t i5Y +t i5U +$t i5q +t i5N +t i4X +t i4V +$t i4m +^t i4l +$t i3s +$t i34 +^T i1h +t i1D i61 +^T i0D +{ ^T $H +$t ^h +^t ^h +^t $g +t ^F $0 +^T $F +t d x62 +t d $J +t $D D8 +t d *9B +t D8 $D +t d *79 +$t } D5 +[ t D5 +t d -5 +t D3 *02 +t d -0 +t $D +$t $d +] t d +TB so0 +^t ^b +TA T5 +TA $2 +] TA +^T $A +t $9 Z3 +T9 T8 +T9 T3 +T9 i41 +T9 $3 +t '9 +t +8 $N +T8 i04 +t ] .8 +t .8 ] +t .8 +T7 y5 +T7 $* +T6 o50 +T6 o45 +T6 o1@ +T6 o01 +T6 i62 +T5 $z +T5 Y2 +t +5 x21 +T5 T4 K +$+ T5 T0 +T5 o21 +T5 K T4 +T5 i6- +T5 i5@ +T5 ,6 +t -5 -4 +T5 ^3 +$# T5 +^t ^5 +T4 y4 D5 +T4 T6 +T4 T5 ,9 +T4 o8@ +T4 o3Y +T4 o2S +T4 o1! +T4 o03 +T4 i50 +T4 i5@ +T4 i4_ +T4 ,9 T5 +t -4 -5 +T4 ,3 +T4 { { +T3 Z5 Z4 +T3 Z5 Y4 +T3 Z4 Z5 +T3 z2 +T3 y3 +t $3 x52 +T3 T7 +T3 T6 +T3 o5P +T3 o0F +t .3 k +T3 i4* +T3 $1 +T3 $@ +T3 $! +^# T3 +^. $ T3 +T2 Y1 T3 +T2 T9 +T2 T6 +T2 T4 +T2 T3 Y1 +T2 T1 $9 +T2 seR +T2 sB0 +T2 s1< +T2 ^S +$t -2 $s +T2 o4N +T2 o1& +T2 o00 +T2 i6@ +T2 i2Y +T2 i2t +T2 $9 T1 +T2 $+ +[ ^! T2 +^T $2 +} T1 z2 +$! T1 Z1 +T1 Y1 +T1 oA! +T1 o2@ +t -1 o0M +T1 o07 +T1 i8% +T1 i62 +T1 i3! +T1 i18 +T1 $4 +T1 $2 +T1 ^2 +T0 z1 i1A +t $0 Z1 +T0 x14 i1A +$+ T0 T5 +T0 T1 $D +$* T0 o5b +T0 o44 +T0 i5@ +t $0 ^F +T0 $D T1 +] T0 D7 +T0 *45 +t *02 D3 +$' T0 +t { +$t { { +$- $t +] t ] +] ] t +$s Z5 Z4 +$s Z4 Z5 +$s Z2 $r +^S z1 Y1 +^S $z +syI u +$s y5 +sy4 +$s Y2 +^S Y1 z1 +$s Y1 +sy- +$s x52 +^S x42 +$S $X +$s $x +swt +6 +swS Z2 +swS Y2 +suo ] +sui p3 +^S ^U +^s ^U +su* +$s $u +stY C +stw i3v +str l +stn o7p +stl +ssz o3v +ssz $! +ssy +ss# x52 +ssX +ssP T3 +ssj +ssf +ss# +7 +^s r Z1 +sr; y2 +sru i3G +srt +0 +srg u +sRD y5 +sr1 $A +$s $r +$[ s[. $r +sqw +sqf +^ sq +spx +spr +^S ^P +sO) Z1 +sou r +so@ o1@ +sol ] +^s o2s +^s o2m +^S o1w +^S o1l +^s o1l +^s o10 +so0 C +snH R5 +sNG y2 +snc *53 +smt t +smt +smn +sml +0 +} sMg +smg +sm, +1 +$s $m +slz t +slr o3x +slr +9 +slp +slL T7 +slG +sl; -0 +$S $L +$s ^L +sl; +skq +skg +0 +skc +sk- +sJw +2 +sjN Z1 +sIY Z4 +siv [ +siu +sib D3 +sia E +$s i8G +^s i50 +^S i5* +^s i4i +$s i4f o4d +^S i2d +^S i1T +^s i1S +^S i1r +^S i1M +$s i1g +^S i1B +^S i1b +^S i0L +$s i07 +sh* +sgl y1 +sgG +sg4 +set +ser +2 +seJ $, +seG -5 +seE +seC x71 +sea +se1 c +se1 ] +s?! E +^s E +se@ +sd- t +sDS -7 +sdq +^S $D +^S ^D +$S $d +scg k +scF x71 +sCe *50 +sCA z5 +^S $C +^S ^C +^s ^c +sBv y2 +sbv +sBT x12 +sbg +sbd +sbB Y4 +sB* +^s ^b +sau *57 +sau +saq +sae D2 +^s ^a *63 +$S $a +s.A +sa@ $. +^s ^a +s9w ^e +s9_ $g +s96 +s91 +s90 +$s ^9 +s87 +s86 +$. s85 +s84 +s83 +s81 +s7I D9 +s7- i0m +s7C i2E } +$. s76 +s7* $* ^3 +s7* ^3 $* +s7 *06 +^s $7 +s6# +s56 +s5 *06 +s4I Y1 +s4C Z2 +^s *46 +$s $4 +s3B $F +$s *37 +s31 ] +s3. +s28 D8 +[ s2- +^s ,2 +s1* x35 +s1o Z5 +s1* o41 +s1! i0! +s1f +s1c p2 +s1B ^D +s1@ $9 +s19 +s18 $a +s16 $ +8 +s14 Y4 c +s14 o1o +s14 c Y4 +s1 ^2 +s10 +s1# +s1. +s1; +s1 +s-1 +[ s1! +s0 Z1 +s0@ x43 +s0. R4 +s0 K +s0B i0A p5 +s09 +s06 } +s03 $/ +s0* .3 +s01 *31 +s0+ +s0* +s0@ +$$ ^S +^@ ^S +s@# +s.* $* +s., +s-+ +s-_ +$s $/ +$s [ +$* ^s +$_ $s +^s $/ +^s $! +^_ ^s +r Y4 i1g +r $x i0c +r x21 i0w +r x05 +r x03 +$r $w +r T2 +^r $t +^R ^s +$[ $r s[. +r R6 *50 +$r ^q +r p3 x09 +r p2 x04 +r p2 ^A +$r o5s +r o3z +$r o3V +r o3g +r o1u +3 +$R o0k +$r $m +r L4 Z2 +r k y3 +r k ^v +r K ^0 +r i6t +r i6e +r i67 +r i58 +r i3y +$r i3q +r i3f +$R i2K +r i2k +r i2j +^R i1Y +r i1u +^R i1H +r i1g Y4 +$r i1g +r i0! z1 +^r i0d +r i0c $x +$r $h +^r $g +r f x04 +^R ^F +$r ^E o0W +^R ^E +$R $e +$r $e +r D5 +r D0 +^r ^D +r d +r C +r c +$! r c +^r ^c +] RA RA +R8 R8 '9 +R8 '9 R8 +{ R8 +R7 x04 u +R7 u x04 +R7 sr# +[ R7 R7 +$R ,7 +^r $7 +R6 R6 c +R6 c R6 +R5 R2 l +R5 o4X +R5 o11 +R5 l R2 +r *56 +R5 +5 +r *50 R6 +R5 { { +R5 +] R4 R4 +R4 o53 +R4 ,5 +r +3 o1u +R3 d E +R3 C +R3 ,4 +r *32 ^w +$! R3 +^R $3 +R3 +r ^3 +r ,2 y2 +R2 i22 +^r .2 +R1 } +^r .1 +R0 x21 +R0 R4 +R0 o6u +R0 L1 +R0 K +4 +r ^0 K +R0 i1N +r +0 f +R0 d c +R0 c d +R0 +4 K +r *02 ^W +r ^$ +$* ^r +{ r $. +] ^r +^. ^r +^_ ^r +$q Z4 Z3 +^q z4 z3 +$q Z3 Z4 +^q z3 z4 +q z2 $. +q $. z2 +^q z1 Y2 +$q Z1 r +q Y5 '9 +^q Y2 z1 +q y1 x58 +^Q y1 K +$q y1 +q xA5 $8 +q x92 xB2 +q x62 $e +$q x41 +q x28 $@ +q $@ x28 +q x03 +q $w +$q ^v +^Q t D7 +q t D3 +q t +q R5 R5 +$q ^r +$q L6 +^q L1 +^Q K y1 +^q ^j +$q i2s +^Q i1C +q $e x62 +q d $Q +^Q D7 t +q D3 t +q D3 C +q D2 C +q C D3 +q C D2 +q C { +q c +q +9 x16 +$Q -9 +q $8 xA5 +] $q -5 +^q -5 +q -4 -0 +$q +4 +$q *32 +$q +3 +q *15 x32 +^Q $1 +q -0 -4 +$! $Q +$Q +q $! +$q [ +$! $q +} ^q +[ $q +^q $/ +^q ^+ +^. ^q +$p Z1 +^p z1 +^P y3 *53 +^p y2 +{ ^P Y1 +^p x12 +$p ^w +{ ^p $t +^P r $p +^p o3q +^P o1@ +$p $o +^p ^N +$P $L +$p ^J +$P i6M +$p i4P +^P i1A +$p i0u +^P i0T +^p i0G +$P $G +^p ^d +^P ^B +^p ,9 +p5 Y1 { +{ p5 *7A +p5 } +^p $5 +p4 Y2 ] +p4 x23 'A +p4 o3i +p4 ^j $1 +p4 $i [ +p4 [ $i +p4 'A +^ p4 ^a +p4 *80 *51 +p4 *51 *80 +p4 $1 ^j +p4 *04 o0r +p4 $| } +p4 ] +p3 Y1 { +p3 x6B t +p3 x6A u +p3 x54 x7A +p3 $X .3 +p3 x14 $1 +p3 x03 x6B +p3 u x6A +p3 t x6B +] p3 o7 +p3 o5y ] +p3 ] o5y +p3 ] $f +p3 'B i82 +p3 'B i60 +p3 $A [ +p3 [ $A +p3 $7 [ +p3 [ $7 +p3 .3 $X +p3 $1 x14 +^P .3 +{ p2 Z1 +p2 { Y1 +p2 x9A ] +p2 ] x9A +p2 x96 u +p2 x94 u +p2 x76 u +] p2 x71 +p2 x6A $A +p2 x65 ] +p2 ] x65 +p2 x58 i51 +^. p2 x37 +p2 x21 'A +p2 x0B u +p2 x08 +0 +] p2 x01 +p2 u x96 +p2 u x94 +p2 u x76 +p2 u x0B +p2 $r Y1 +p2 { $q +p2 o0j $1 +p2 o0f *21 +p2 ^N $n +p2 $n ^N +p2 i0d +p2 $h +p2 $D $a +p2 ,B +3 +^. p2 'B +p2 $A x6A +p2 'A +p2 +3 ,B +p2 *21 o0f +p2 $1 o0j +p1 Z3 x61 +p1 Z2 *76 +p1 y3 ,4 +p1 y1 t +p1 ^X u +p1 xA4 +p1 xA3 u +p1 x96 u +p1 x93 E +p1 x82 ] +p1 ] x82 +p1 x6A +p1 x64 C +p1 x61 Z3 +p1 x52 t +p1 x31 ] +p1 ] x31 +p1 x15 E +p1 x09 +p1 x04 $_ +p1 $_ x04 +p1 x02 y4 +p1 x02 u +p1 x02 ] +p1 ] x02 +p1 u xA3 +p1 u x96 +p1 u x02 +p1 u ^X +p1 u ^S +p1 u ^E +p1 u D9 +p1 u D4 +p1 u ^D +p1 u +8 +p1 u *76 +p1 u *75 +p1 u -6 +p1 u *40 +p1 u +0 +p1 t y1 +p1 t x52 +p1 t ^S +p1 t ^M +p1 t i4G +p1 t D5 +p1 t ,B +p1 T7 +p1 t -5 +p1 t -4 +p1 t $0 +p1 ^S u +p1 oBA +p1 oB5 +p1 o64 +p1 o4- +p1 l $4 +p1 l *12 +p1 i8 +p1 i7f ] +p1 ] i7f +p1 i7_ +p1 i6W t +p1 i6$ +p1 i4E +p1 i0k i0k +p1 E x93 +p1 E x15 +p1 ^E u +p1 ^D u +p1 D9 u +p1 D5 t +p1 D4 u +p1 C x64 +p1 $C +p1 ,B t +p1 *97 *86 +p1 +8 u +p1 *86 *97 +p1 *76 u +p1 *75 u +p1 -6 u +p1 +6 +p1 -5 t +p1 -4 t +p1 $4 l +p1 *40 u +p1 -4 +p1 -3 +p1 *12 l +p1 $1 [ +p1 [ $1 +p1 +0 u +p1 $0 t +^P ^1 +p1 ] +$p { +$$ ^p +$. ^p +^p ] +^o z3 +$o Z2 } +^o y5 x13 +^O y5 u +$o Y4 Y4 +$o Y2 +^o x21 +^O ^W +^O u y5 +$O $R +^o o4- +^O i71 +$o i4_ +^o i2d +^o i1m +^o i0x +$o $d +oBs +oBo u +oBn D8 +oB i4 +oB5 +oB4 +oB3 TA +oB3 +oB1 iA +oB1 $3 +oB0 +^O ^B +oAy t +oA! x71 +oAv +oAo -9 +oAm +oAk ] +oAa D5 +oAA D2 +oAA +oA8 K +oA6 +] oA1 +oA +$) oA( +^* oA# +o9u +o9s u +o9r +o9p t +o9. o80 +o9i u +o9@ i01 +o9g +o98 C $2 +o98 $2 C +o98 $. +o95 u +o95 C +8 +o95 +8 C +o9* ,5 +o95 +o94 $? +o9 $4 +o93 ^M +o93 ^i +o93 C +o92 i91 +o92 ^1 +$* o92 +o91 Y1 c +o91 c Y1 +o9 $0 +o9@ +o9. ] +o8z u +o8# ^Z +o8y +o8W T3 +o8w +o8v +o8u t +o8u *83 +o8u *38 +o8s Z1 +o8s o7u +o8R *58 +o8r +o8p x91 +o8o o3o +o8o +o8m +o8L +o8l +o8k p2 +o8* i0S +o8i ] +o8d o7o +o8b Y3 +o8b +o8A l +o8a $8 +o8a -5 +] o8a +o8% *85 +o87 o4W +o87 ^J +o87 C +o87 $$ +o8^ .7 +$* o87 +o87 +o8% *58 +o84 o79 +o84 $! +o82 $a +o8 $2 +{ o82 $. +{ $. o82 +o81 T7 +o81 $Q +o81 $K +o8@ +o8/ +$& o8^ +$. o8. +$! o8- +^' o8_ +o7Z c +o7y p4 *25 +o7Y $O +o7x *53 +o7x *30 +} o7x +o7W T6 +o7V .6 +o7T +o7s *67 +o7r *52 +o7q o2s +o7p -5 +o7. p1 ] +o7o -6 +o7! o1@ +o7N $* +o7M *18 +] o7m $1 +o7L *57 +o7K x43 sK4 +o7K sK4 x43 +o7k *97 p2 +o7k -3 +o7I Y1 +o7h -5 +o7e Y2 +o7e x31 +o7e T4 +o7d $b +o7d *02 +o7C l +o7b x25 +o7a $A +o79 o0m +o79 i73 +o7@ *97 +o7. ,8 i80 +o78 $4 +o78 $! +o77 +7 +o7@ $6 [ +o7@ [ $6 +o7@ .6 +o7- .6 +o75 $# +$. o75 +o7& *46 +o73 k +o73 *57 +} o73 +$! o72 +o71 i6- +o71 +8 +$@ o71 +o71 +o7+ $- +o7\ +o7? +o7, +o7 +^_ o7_ +o6z i2q +o6? Z5 +o6z .5 +o6$ Z2 +^# o6y +$; o6x ^s +o6w +o6v u +o6u Y2 +o6u x13 +o6u o9. +o6U c +o6u *14 +o6t i3q +o6t C +o6_ T5 +^* o6T +o6s i5K +o6S i2s +o6- $s +o6r *04 +o6r ] +o6q i6e p3 +o6p o7R E +o6P C +o6O +5 +o6, o5. +o6o ] +o6n +o6M $B +o6M +$! o6m +o6l +$! o6k +} o6j k +o6 i7k +o6H $r +o6G T1 +o6g +o6f ^x +o6e +2 +$@ o6e +o6d x92 +o6d x14 +o6d *35 +o6c ^s +o6C .5 +o6c $2 +o6B ^6 +$- o6B +o6a Y2 +o6a t $A +o6a $j +$! o69 +o68 .4 +o67 +5 +o65 -7 +o65 +1 +o64 .7 +o63 x42 +o63 -7 +o63 $? +o63 +o62 $1 +o61 $9 +o61 ] +o6( $) +o6( ^? +o6. +o5z $z +o5Z u +o5z o2q +o5$ Z2 +o5y *64 +o5. y5 +o5y $4 +o5x o0k +o5x *50 +o5= x32 +o5x ] +o5w xA2 +o5w *74 +o5w +o5u u p1 +o5u p1 u +o5u -4 +o5t K +o5t D6 +o5t *50 +o5T *20 +o5s t +o5S ^5 +$@ o5r +] o5q o2y +o5q *23 +o5q +2 +] o5q +o5p $q *43 +o5p *43 $q +o5p *20 *16 +o5p *16 *20 +o5p $. +o5o ^L +o5o $_ +o5o ^* +o5n *34 +o5n $1 +o5m p1 +o5m i7d +o5M ^D +o5m $. .6 +o5m .6 $. +o5m -3 +o5l *76 +o5l -7 +$! o5l +o5k $A +o5k +$! o5J +o5i t +o5i -8 +o5@ $i +o5H x73 +o5g $@ +o5f o7o +o5f *03 +o5F $& +o5F ] +o5e u d +o5e K +o5e i4_ +o5e d u +$. o5e +] o5e +o5e +o5c -2 +o5C $! +$* o5b T0 +o5b o4o +o5B ^( +o5a C +o5A *25 +o5a -1 +o59 o41 +o59 -4 +o59 $3 +o5% $9 +o58 x31 +o58 -6 +o58 -4 +o5% '8 +$! o58 +o57 o69 +o57 $! +o5+ ,6 +o55 Y4 p2 +o5 $5 +o54 Y2 +o54 ^5 +o5* .4 +o5, .4 +o53 $* +o53 $. +o53 ^# +o5@ $3 +o52 D1 +o52 $A +o52 *78 *67 +o52 *53 +o52 +o51 $. +o50 $_ +o5- +0 +$_ o50 +o5@ $$ +o5@ $@ +$] o5[ +$. o5+ +$! o5. +^[ o5] +o4Z T5 +o4z T5 +[ o4z K +o4x '8 +o4, x31 +o4w x63 +o4w o6r -0 +o4w -0 o6r +o4W } } +o4v *25 +o4V +o4u y2 c +o4u +5 +$# o4u +o4T T0 +o4t o0v +o4t +o4s ^M +o4S *43 +o4s $1 +o4/ s1. +o4s +o4Q $2 +o4@ o5) +o4[ o5] +o4o *23 +o4o +0 +o4n *40 +o4n ^1 +o4n $0 +$? o4N +o4k +5 +o4k +o4j x61 -4 +o4j ,8 +o4j -7 +o4j -4 x61 +o4j *45 +o4j -0 +o4J } } +o4i y3 y3 +o4i x31 +o4I c +o4* i7* +o4i *30 +o4h +0 +o4@ ^H +} o4g +o4g +o4f .2 +o4e o3q +o4E $! +o4c -6 +o4c *51 +o4b Z1 +o4b Y1 +$* o4A T4 +o4a p2 'B +o4a $9 +o4a *76 +o4a +0 +o49 $- +o47 *30 +o47 +2 +o4# +7 +o46 -6 +o45 i53 +o45 ^A +o44 T8 +o44 $# +$# o44 +o43 ,5 +o4- *30 +o43 +o42 i59 +o42 -0 +o4$ .2 +o4 $2 +o4@ .1 +$! o40 +o4* ] +o4$ $$ +o4@ $! +o4. +o4- [ +o4 +$! o4@ +} o4. +^, o4, +o3y x02 +o3y [ k +o3y ^j +2 +o3y D5 +o3- y3 +o3y *20 +o3y $! +o3x $x +o3X E +o3x *37 +] o3w $z +o3w x01 +[ o3w +o3v o5g +o3v *37 +o3v .0 +o3V +o3U u +o3u i2w +o3u $1 +o3t i4y +o3* t ^f +o3t E +o3- t +o3s i3d +[ o3s D2 +o3q $y +o3q D0 +o3q ,7 +o3p +5 +o3. p3 +$% o3P +o3m x02 +o3M u +o3l +o3- k +2 +o3k +0 +o3k $! +o3j ^l +o3j K *32 +o3j *32 K +o3j +o3i *31 +o3h *12 +o3G -5 +o3f $w +o3f ^w +o3f $v +o3f +0 +o3f -0 +o3e *57 +o3e [ +o3d ^J +o3D D6 +o3d *76 +o3@ D7 +o3d ,4 +o3D $0 +o3c sc3 i40 +o3c i40 sc3 +o3c -6 +o3c *21 +o3c *12 +o3c $0 +o3B ^Y +o3b $A +o3b *78 +o3a t +o3a ,8 +o3a *40 +o3a *31 +o3/ ^a +$@ o3a +o38 $s +o38 *13 +o3/ $7 +o3. +6 +o35 x01 +o34 x51 *43 +$. o34 p4 +o34 o15 +o34 *43 x51 +] o34 +o33 o52 +o33 ^l +o33 k D0 +o3@ *34 +o3- +2 k +o32 i3S +$. o32 +^o *32 +o31 i4g +o31 -0 +o30 +2 +o3@ $0 +o30 +o3& +o3/ +o3! ^? +o3! +o2z y2 +o2z $p +o2z k +o2z *03 +o2z $0 +[ o2z +o2z +o2y $q +0 +] o2y o5q +o2Y c +o2y *32 +o2y +0 $q +$@ o2y +o2x $@ +o2w ^k +o2w *05 +o2v p5 $_ +o2v i3k ] +o2v ] i3k +o2v -3 +o2u +3 +o2- ^U +o2t t +o2t o3w +o2t *57 +o2t *54 +o2s y5 x38 +o2s ^x +o2S E +o2s $! +$@ o2s +{ o2q +o2P T2 $q +o2P $q T2 +o2p *54 +o2p $! +$? o2p +o2o $A +o2. o3. +o2) o0) +o2n .5 +o2n -0 +o2m y3 +o2M x31 +o2m i2f +o2L y2 y2 +o2L l $7 +o2L $7 l +o2l +o2k $v +o2K E +o2j r +o2j o3x +o2j *34 +o2h x41 +o2h o5j +0 +o2h *53 +o2h +0 o5j +o2g x62 +o2g +7 +o2g +0 +[ o2g +o2g +o2f i4t +o2f *42 +o2e R3 +o2e K +o2e *46 *65 +o2d o7s +o2d o5D +o2@ D5 +o2d *05 +o2C E +o2C c $5 +o2C $5 c +o2b +6 +3 +o2b +3 +6 +o2b *03 +$! o2B +o2a $1 +o29 ^a +o2. $9 +o26 .0 +o25 Y1 *02 +o25 *42 +o25 *02 Y1 +o23 o34 +o23 i32 +o2- +3 +o22 T4 +o22 C +o2@ *23 +o21 T1 +o21 *43 +o21 $1 +o20 $x +o20 +o1y x23 +o1y *54 +o1. y2 +o1Y +o1x ^w +o1X c .0 +o1W l d +o1W d l +o1W ^D +o1w *35 +o1w .3 +o1w *12 +o1W +o1v [ i0e +^# o1V +o1u x61 +o1u x43 +o1u x21 +o1u -0 +$! o1U +o1u $! +o1t +3 +o1S x34 +o1s ,2 +o1s $! +o1r y5 +o1R k $. +o1R $. k +o1$ ^R +o1o y5 E +o1o y2 +o1o 'A +o1o ^A +o1o +6 +o1O *17 +o1O $& +$& o1O +$! o1O +o1n *63 +o1k x21 +o1k *42 +o1k *30 +[ o1j +o1i o2n +o1i i0S +o1I E D2 +o1I D2 E +o1i ^A +o1) i1( +o1. i0R +o1H i2F +o1h -5 +o1h ^0 +o1G ^5 +o1f *72 +o1f $! +} o1f +o1e r +o1E *42 +o1E *24 +o1e $2 +o1d *72 *12 +[ o1c ^l +o1c k +2 +o1C i6A +o1c +2 k +o1# ^C +o1C +o1b o3b +o1b $. +o1A T6 +o1a o0A +o1a *14 +o1a $- +o19 p5 $z +o19 +o17 *14 +o16 y5 y5 +o16 d +$. o15 -0 +o14 y5 +o13 x71 +o13 o01 +o13 D7 +o13 -4 +o13 $@ .2 +o13 .2 $@ +o12 x61 +o12 o21 +o12 .0 +o11 y3 +o11 p4 ,5 +o10 $S +o10 E ] +o10 ] E +o10 +4 +o1) +o0Z y1 +o0z k ^y +o0Z D2 +o0z ^a +o0Z *15 +o0Z $# +o0y y2 +o0y ^d +o0Y $C +o0y +7 +o0y +2 +o0@ Y1 +o0) Y1 +o0x $b +o0' x31 +o0W D4 +o0w +8 +o0W $4 +o0w *35 +o0w $3 +$# o0W +o0V x91 +o0V T4 +o0v $j +o0V D9 +o0v *37 +o0v $1 +o0v $. +o0t Z2 +o0T x62 +o0t x52 +o0t x23 +o0T o5o +o0t -8 +o0$ T6 +o0t -6 +o0$ T4 T3 +o0$ T3 T4 +o0$ T1 +o0T $# +o0T +o0s y3 +o0s t d +o0@ so0 +o0s d t +o0S $D +o0S ^B +$$ o0S +$, o0s +o0r $h +o0r ^g +o0r ^C +o0Q *64 +o0Q $! +o0` q +o0p Z1 +o0p Y2 +o0P x32 +o0P ^V +o0P si1 +o0P ^S +o0P o2t +o0p $m +o0p ,2 +o0o D2 +o0* o7+ +o0, o2j +o0N y2 l +o0n x32 +o0N x31 +o0N l y2 +o0n .2 +o0m i4z +o0m i1o +o0m ^i +o0m *54 +o0l Z1 +o0l y5 t +o0l y3 +o0l t y5 +o0L o36 +o0L o2C +o0l k +o0L ,5 +o0l +2 +o0l -2 +o0L ^1 +o0k z1 +o0k $Z +o0k y2 +o0k o7x +o0K o3g +o0K o1J +o0k i3j +o0k ^a +o0K $7 +o0K *34 +o0K -3 +o0k ,3 +o0K $0 +o0J x41 +o0j ^p +o0j o2b +o0J i3P +o0j ^E +o0J D4 +o0j *46 +o0j -2 +o0j *03 +$? o0J +o0I L1 +o0I $3 +o0I +o0h ^f +o0h D5 +o0H .7 +o0g Y2 +o0g y2 +o0G x93 +o0g r +o0f x31 +o0f i4a +o0f i3k +o0F '8 +o0F +7 +o0F -4 +o0f *02 +o0f $+ +o0f ] +o0E ^T +o0e ^s +o0e ^L +o0e $4 +$! o0E +o0E +o0d Z3 +o0D x91 +o0D ^J +o0D $d +o0d *64 +o0@ D2 +o0c $A +o0c ^a +o0c *03 +o0c $= +o0B y5 y5 +o0b ^k +o0B i4y +o0b $4 +o0B $* +o0B $. +$, o0B +o0b +o0a ] ^v +o0a ^v ] +o0a i1h +o0a -9 +o0a *60 +o0A .6 +o0a *06 +o0@ +8 +o07 z5 u +o07 u z5 +{ o05 +o04 R1 r +o03 ^# +o02 $k +o02 $a +o02 *05 +$@ o02 +o02 +o01 ^v +o01 T7 +o01 $c +o00 p4 T9 +o0, *07 $. +o0, $. *07 +o0- *04 +o0$ +o0_ $_ +o0> $< +o0< +[ o0@ +$! ^O +$! [ ^o +^o $. +$n Y3 +^n y3 +^n ^x +^n ^u +$n $r +^n $r +$n $p +^n o6h +^N o1u +$N $n +$n ^n +$n ^J +^N i3d +^N i1H +^N i1B +^n ^i +^n ^H +$n $h +^N ^G +$n ^g +^n ^D +^N c +^n ^B +^n *32 +^n -3 +^$ ^N +^_ ^N +$\ $n +$* ^n +$. ^n +} ^n +^m z5 u +$m Z1 D3 +$m Y3 +^m ^y +^@ ^M x24 +$m $w +^m u z5 +^M ^T +^m ^T +$m ^t +^M ^S +^m ^S +$m r p3 +^m r +$m p3 r +^m ^P +^m o4c +^m o2j K +^m o1f +$m o0r +^m ^O +$M $N p3 +^M ^L t +$m L6 +^m K o2j +^m ^J +^M i6M +^m i4- +^m i2x +^m i2g +^M i1z +^M i1Y +^M i1n +^M i1l +^m i0r +$m D3 Z1 +$M $D +^m ^D +$M $C +^M $a +$m $a +^M $7 +$m *50 +^m $2 +^@ ^M +^. ^M +$? [ ^m +^m $! +^m $- +^L z1 +^l z1 +$l ^y *75 +$l $v +l TB +l T5 +^L T4 +l T2 +l T1 *87 +$L t +^l ^T +^l ^s +l r -5 +^L $r +l ^r } +l p2 +2 +$l $p +$L o7x +$l o6K +$L o56 +l o51 +$l o5_ +$l o40 +^l o1y +^L L1 +^L ^l +$l $L +^L K i1F +l K i18 +^l ^J +$L i91 +l i3m +$L i25 +^L i1s +^L i1F K +l i18 K +$L i0J { +$l $f +l D5 -3 +$l D3 +l D2 +^L $A l +LA iAS +l *87 T1 +L7 ^X spX +L7 spX ^X +^l +7 +L6 Z3 *03 +L6 ^m +L6 L6 +L6 $* i7s +L6 $d +l *65 Y2 +L6 -5 +L6 *03 Z3 +^L $6 +L6 +L5 o2b +L5 L2 +L5 -5 +^l *52 +L3 y3 y3 +l -3 D5 +L1 .0 { +L0 z4 $D +L0 $w +L0 r } +L0 { r +L0 i4x +L0 $f $s +L0 $D z4 +L0 +0 +$@ ^L +$( $L +$@ $l +$- $l +^* $l +k z5 t +K Z2 x03 +$k Z2 u +$K Z2 c +^k z1 +k y5 +K Y4 x82 +K Y4 u +$k y4 u +K Y4 ^R +K Y4 D4 +K Y4 c +k Y4 +k Y3 x71 +K Y3 x51 +k y3 x51 +k y3 +2 +k y2 ,3 +k Y1 i0s +K x41 Y4 +k x2A +k x21 i0j +K x03 Z2 +k ^w +$k $v +$k u Z2 +K u Y4 +$k u y4 +K u T3 +k t z5 +$k ^t k +K t +5 +k t *21 +$k ^T +k ^t +K s7I +k s3. i12 +K ^R Y4 +k $q ^a +k ^$ q +k p5 *7A +$K p4 $H +K p3 x65 +K p2 x09 +k p1 x06 +$k o7f +k o7d +k o74 +} k o6j +k o6d +K o6b +k o51 +[ K o4z +K o4w +k o49 +k o3z +K o39 +K o2y +k o2y +K o2k +K o1v +k o1v +K o0s +k o0c +k o01 +K $m +k ^m +$k ^l +^K ^k +^K ^J +$k i7W +k i7. +^k i64 +K i62 +^k i6. +K i5w +$k i40 +k i3l +k i3@ *45 +K i32 +K i31 +k i3_ +$k i2p +$k i1q +k i12 s3. +K i12 +k i0s Y1 +K i0s +k i0K +^k i0e +$K i01 +K ^h +$k $h +^k ^g +K $e +3 +K E $$ +K $$ E +K d +B +K D4 Y4 +K $D +$K c Z2 +K c Y4 +^K ^C +$k $c +k ^b ^m +k ^a $q +K ^a +k ^9 +K +8 +K ,8 +k ^8 +$k +7 ^k +K +7 +K -7 +$K ^7 +k +6 r +$k *61 +K +5 t +k *45 +K +3 $e +k ,3 +^k *26 ^v +k *21 t +K $2 +k ,2 +[ k -2 +^k -2 +k *13 +K *12 ^y +^K *12 +K $1 $_ +^K $1 +K $@ +K $! +$. K +] K +$. ^k +^k } +$j Z2 +^j ^z +^j Y5 E +^j Y5 +$J Y1 +$j $y +$j ^t +^J ssd +^J ^S +^J o7. L1 +^j $m +^J L1 o7. +$j ^J +^j i5 xA5 +$j i5a +^j i5 +^j i4z +$j i2w +$j i1v +^j i1@ +^J i0P +$J i0* +$J $h +^j ^h +^J ^G +$J $e +^j ^E +^j ^e +$j $d +$J $C l +^j ^A +$j *73 *02 +^J $7 +^j .4 +^J $3 +^J ,3 +^J -3 +$j *02 *73 +$$ ^J +^J $* +^$ ^J +$. $j +} ^j +^j $@ +$i Z5 +$I Z2 +$i s-i +$I $s +^i o8z +^I o4E +^I ^N +^I ^L +^i $L +^i ^k +{ ^i ^j +^I i7$ +^I i1r +^I i0T +^i i0H y2 +^i ^h +iBu iBd +iBl +iBi +iB E +iBA u +iB@ +iA+ x73 +iAu +iAS LB +iAi t +iA2 $d +iA0 +iA# +i9z +i9$ x04 +i9S ^M +} i9s +i9 oB5 +i9 oA6 +i9m +i9 E +i9D oAU +i9. -A +i9 $9 +i98 x0B +i90 $_ +i9# +i9) ^( +i8X i9X +i8 x32 +i8w ] +i8t u +i8s x25 +i8r +6 +i8R *07 +i8R +i8r +i8k x61 +i8k o4m +i8_ i9- +i8f +i8_ *9A +i89 *58 +i8@ -9 +i8 -9 +i88 i64 +i88 $0 +i84 x61 +i84 ^B +i82 oA2 +i82 +i80 $+ +$! i80 +i8_ +^? i8@ +i7Z c +i7% Z2 +i7. Y4 +i7 Y3 +i7@ x51 +i7v i8s +i7V $? +i7u x42 *15 +i7! T5 +i7$ T1 +i7S +i7R *80 +i7Q .6 +i7p +i7o x82 +i7^ o5^ +i7N *37 +$$ i7l +i7i x12 +i7- i4- +i7i +i7h Y1 o7- +i7h o7- Y1 +i7h L6 +i7h +i7g +i7f ,8 +i7d o8s +i7d o6a +i7d c +i7@ D1 +i7D [ +i7C x14 +i7% c +i7, c +i7c +$! i7b +i7a $A +i7a ^( +i78 $! +i7 ,8 +i7* *70 +i7+ .7 [ +i7} +7 +i76 D3 +i75 +i74 +6 +i74 +i73 D1 +i7. *31 +i7_ $3 +i72 x21 c +i72 c x21 +i72 $4 +i72 .1 +i71 $* +i7# *03 +i7? +i7` +$@ i7, +$/ i7? +] i7@ +^. i7. +i6@ Z1 +i6y i7 +i6. Y2 +i6 x73 +i6w t +} i6v +i6u x31 +i6u o7x +i6u o0f +i6u +i6- T5 +i6s Y1 +i6s i6f +i6s $7 +i6r o5v +i6r o5o +i6P ^X +i6. o3. +i6n o7d +$! i6m +i6L x34 t +i6L t x34 +i6k x73 +i6i x72 +i6i x23 +i6# i7$ +i6. i3, +i6h i7e +i6h c +i6h 'A +i6h ,7 +i6G u +i6e +7 ,4 +i6e ,4 +7 +] i6e +i6D x42 +i6d $l +i6= D0 +i6/ c +i6A .5 +i6@ $A +i6_ -A +] i6a +i68 -4 +i6@ -8 +$( i68 +i68 +i67 y2 x43 +i67 $) +i6+ ,7 +i6, ,7 +i67 +i65 $9 +i65 *35 +i6. *46 +i64 *57 +i64 $1 +i64 +i62 x74 +i62 x41 o45 +i62 ] +i61 s2- +i61 o70 +i6. -1 +i60 *BA +i6* $* +i6/ +i6! +i6_ $_ +$@ i6! +$/ i6, +$! i6- +] i6@ +] i6 +i5y x62 +i5y i2r +i5_ Y4 +i5_ Y3 p4 +i5@ Y1 +i5. y1 +$# i5y +i5x $w +i5x r +i5X ,6 +i5x *07 +i5W .7 +i5V $v +i5v ^v +i5v i2s +i5u x21 +i5u $! +i5t x62 +i5T x03 +i5t $b +i5 t +i5s $w +i5s $e +i5s $8 +i5s ^3 +i5s +2 +i5s [ +i5- r +i5 o6g +i5o +i5n c +i5n $5 +{ i5m $x +i5M l ,6 +i5m $i +i5M ,6 l +i5m ^2 +i5m $@ +i5m +i5l xB1 +i5L i3* +i5l DB +i5l +B +i5k Z1 +i5k ^s +i5K i5k +i5k +6 +i5K *15 +i5j t +i5J $# +$# i5J +i5j $! +i5i D1 +i5h i5m +i5h $6 +i5h $1 +i5g p5 y1 +i5g i4w +i5g $d +i5g ,6 +i5f K +i5E y5 +i5E *07 x53 +i5E +i5d t +$* i5D +i5d $@ +i5d [ +i5C L7 +i5c $1 +i5% c +i5b x02 +i5, ,B +i5a o2r +i5a $k +i5a c $. +i5a $. c +i5a $A +i5a +7 +i5A *02 +i5& 'A +i5- ^A +$. i5a +} i58 +i57 $9 +i57 ,6 +i5( *68 +i56 $4 +i5@ -6 +i55 D2 +i55 $* +i54 Y1 +i54 x03 +$= i54 +i53 $8 +i53 $3 +i53 ,2 +i53 $! +[ i53 +i52 Y1 +i52 x12 +i52 i67 +i52 C +i52 *5A +i52 } +i5. $2 +[ i52 +i51 ^O +i5- $1 +] i51 +i5+ +i5# +i5@ $@ +i5@ [ +^/ i5/ +i4Z $, +$, i4Z +i4z +i4y $q [ +i4y [ $q +i4. y5 +i4- y4 +i4_ y4 +i4% x21 +i4x *10 +i4X ^1 +i4w i26 +i4w [ +i4v $e +i4v } } +i4v +i4u D0 +i4T x13 +i4t o5h +i4t ] +i4s x02 +i4s k +i4s i6z +i4s *02 +i4? s0/ +i4r $h +i4. r +i4q [ +i4p L4 +i4P i4B +i4p +i4O ^S +i4o *35 +i4- o0R +$! i4o +i4n T0 +i4n i0v +i4N $1 +i4m o3e +i4m $* +i4L o0K +i4L $l +i4l D7 +i4L +5 +i4k $M +i4j i2q +i4j ^h +i4i i5y +i4i .5 +i4H $h +i4H D7 +i4H '7 +i4g *30 +i4g +i4F *67 x25 +i4F .3 +i4f *21 +i4E E ^8 +i4d u ^1 +i4d i2S +i4d ^1 u +i4_ D1 p3 +i4d +i4C $l +i4c ^A +i4c *56 +i4c *04 +$! i4C +i4B ^e +i4b .5 +i4a K +i4a *35 +i4_ '9 +i48 o3@ +i48 k +i48 $a +i48 ,5 +i48 +2 +i47 ^p +i47 i4t +i47 $. +i46 i59 +i46 i36 +i45 $k +i45 ${ +} i45 +i43 $s +i43 i4r +i4- *30 +i4_ +3 +i4 -3 +i4@ -2 +$% i42 +i41 i34 o43 +i41 $6 +i4. ,1 +i4, $1 +i4= $1 +i40 o31 +i40 ^e +i40 *31 +] i40 $1 +i4_ -0 +i4$ +i4@ ^! +i4! ^$ +i4- $- +i4_ $@ +i4_ ^' +i4 $ +i4< $> +i4^ ^% +$# i4* +$@ i4- +^ i4. +i3z z1 x03 +i3z ^s +i3z $A +i3z *52 +i3z -2 +i3y u +i3y -7 +i3_ y4 y4 +i3, y4 +i3. y2 +i3 y1 +[ i3y +i3x ^x +i3@ x61 +i3- x52 +i3@ x51 +i3w $q +i3w i3e +i3w D1 +i3w *52 +i3w *03 +i3v o0w +i3u ^x +i3u o4@ +$. i3u +i3t y5 +i3t o2w +i3T ,4 +i3S x51 +i3S l $5 +i3s i3x +i3s $A +i3s $8 +i3S $5 l +i3s $4 +i3s *30 +i3s ] +i3q *14 +i3q +i3p D7 +i3. p4 *20 +i3@ p4 $@ +i3; o0l +i3- ^) o0d +i3n C +i3m x65 +i3m $p +i3m +i3k K +i3k $g +i3k *01 +i3j o5l +i3j i5x +[ i3j +i3i x53 +i3i T1 +i3i -4 +i3. i26 +i3h $f +i3h D1 +i3h -0 +i3g x42 +i3g ^v +i3g i04 +i3g ^6 +$* i3g +i3f K +i3f $g +$/ i3f +i3f +i3e o0M +i3e ^9 +i3e -2 +i3E $! +i3= E +i3d ^s +i3d i3z x21 +i3d ^e +i3d *40 +i3d +4 +i3d .2 +i3c $w +i3c $! +i3c [ +i3@ c +[ i3c +i3B o4C +i3b -7 +i3B .4 +i3b +1 +i3a x63 +i3A i3a -1 +i3a $A +i3A -1 i3a +$! i3a +i39 $D C +i39 C $D +i3! *83 +i3* '8 +i3? +8 +i37 o6n +i37 -9 } +i3, $7 +i36 x72 +i36 i69 +i36 C +i3, *63 +$. i36 +i35 i24 +i35 d T0 +i35 $! +$@ i3@ +5 +i3# *40 +i3* ,4 +i33 i38 +i3! *38 +i33 +7 +i33 $6 +i3, *36 +i33 $0 +i33 $* +i3- ^3 +] i33 +i32 i00 +i32 ^E +i32 $0 +i3$ .2 +i31 ^f +i31 *72 +$# i31 +i3$ $^ +i3@ $# +i3. ^ +i3- $. +i3- ] +i3_ +i3 ] +i3= +$* i3# +$? i3? +] i3, +^[ i3] +i2z D6 +[ i2z +i2y $v +i2y ^k +i2_ Y4 +i2 Y1 +[ i2y +i2x x32 +i2x ^q +i2x -5 +i2x -3 +i2W x34 +i2w ^s +i2v K +i2v *53 +} i2U +i2t y4 x82 +i2t i0e o0r +i2t $_ .2 +i2t .2 $_ +i2 t +i2s $S +i2S E +i2s $A +i2S $4 +i2s *06 +$. i2s +i2r L6 +i2R E +i2r D8 +i2r *37 +i2r ] +i2q x52 +i2q $r +i2q $- +i2p $j +i2p +4 +i2p *31 +i2p ] ] +$@ i2o +i2n o0F +i2n -0 +i2m o7Q +i2m *73 +i2m [ +i2K i5m +i2k ^c +i2j i2t +i2j ^b +i2, i5, +i2H C +i2g $z +i2g $q +i2g $m +i2g i4t +[ i2g +i2f x52 +i2e o93 +i2d i43 +i2d i2w +i2d *31 +i2c K +i2c +i2b x36 +i2b +i2a C ^E +i28 i21 +i28 $4 +i2- ^5 +[ i25 +i24 i2q +i24 ] +[ i24 +i23 ,6 +i23 +i22 x32 +i22 R3 +i22 p3 +[ i22 +i21 Y2 +i20 r ^7 +i20 $f +i20 ^b +i20 $@ +i2. +$* i2# +$; i2& +] i2 +i1Z E +i1@ z1 +i1Y $3 [ +i1Y [ $3 +i1y $. +i1x x34 +i1x $a +i1x { +i1w x23 +i1w i4t +i1w i17 +i1w ^b +i1W .0 c +$! i1w +i1w +i1V x63 +i1v p1 +i1v i1i +i1U ^z o2f +i1u y4 y4 +i1u C +i1T x23 +[ i1t ^s +i1t +9 +i1t ^7 +$@ i1t +i1s i1c +i1s i14 +i1s i01 +i1s $9 +i1s ^5 +i1s +i1R x23 +$. i1r +] i1. r +i1p Y3 x02 +i1P ^Y +i1p x02 Y3 +i1p ^o +i1o o0C +i1o i2l +i1n $p +i1m ^h +i1l E +i1l D5 +i1l +i1k +8 +i1j ^k +i1j ^f +i1i o2r +i1i $4 +i1- i1v +i1h u +i1h $2 +i1g ^m +i1g ^j +} i1g +i1F i19 C +i1F C i19 +i1f *9A +i1e y2 +i1e i4n +i1e $d +i1E $9 +i1e -4 +i1_ E +i1d ^S +i1C z1 +i1b z1 +i1b ^v +i1a ^s +i1a i3e +i1a i1w +i1a ^7 +i1A +3 +i19 ^b +i17 +2 +i17 +0 +} i17 +i15 Y3 Y3 +i15 ] +i1& ,4 +i14 +i13 +i12 *A7 +i12 ^7 +i12 *25 i0H +i1@ $2 +i1! ,2 +i11 x61 +i11 $! +i10 i1! +i10 $H +i10 *71 +i1_ $- +i0z $t +i0z ^o +i0z i3s +i0z ^c +i0* z2 +i0$ z2 +i0{ z2 +i0* z1 *64 +i0Z .1 +i0Y ^M +i0y i5s +i0X z5 +i0X ^Z +i0x D1 o3- +i0X ^A +$. i0x +i0w i2q +i0w i0T +i0W $f +i0v $f +i0u ^3 +i0u $, +i0t ^s ^L +i0T ^j k +i0! T1 R8 +[ i0s y2 +i0s ^w +i0- s-w +i0s t +i0s $k +i0s i2v +i0S $h +i0S $B +^- i0S +i0r $w *24 +i0r ^o +i0R i5j +i0! R8 T1 +i0r *24 $w +i0q x13 z1 +$- i0q +i0p ^T +i0p ^S +i0p *50 +i0P +i0o i0y +i0N $N +i0M y2 E +i0M i6] R6 +i0m i2_ +i0m ^a +i0M ^7 +i0L Y2 +i0l ^P +i0l ^n +i0L $3 +i0K z2 +i0. ^K +^_ i0k +i0J x35 +i0j i3x +i0j i0w +i0j $f +i0j *02 +i0i z2 +i0i ^y +i0. i0l +i0< ^I +i0h $q +i0h o1l +i0H i1Y +$@ i0H +i0g ^z +i0g i0s +i0G ^F +i0G +3 +i0f z1 +i0f ^R +i0f i0w +i0F +i0e ^Z +i0e $w +i0E ^e +i0d ^S +i0D ^C +i0d $b +i0d ^5 +i0c i3a +i0c i1q +i0c ^i +i0c ^a +i0B Y1 +i0B ^U +i0B $r +i0b i1} o1j +i0b $7 +i0A z4 +i0a smz +i0A $r +i0A $p +i0A o1u +i0A i0K +i0a $g +i0a $= +i09 ^s +i0. ^8 +i04 $k *16 +i04 i3e t +i04 $7 +i04 *16 $k +i04 $! +i04 $^ +i0, +4 +i03 { $E +i0^ $1 +i00 ^X +i00 ^l +i00 ^1 +i0- +$! i0* +^H z2 +^H ^y k +^H x21 D1 +$h u +$h t $J +{ $H ^T +$h $t +^H ^S +^H p3 $h +^H o5@ +^h o2n *02 +^h ^m +^h $l +^h k i5y +$h K +^h i5y k +$H ^H +$H $h +$h $g +^h ^B +^h $a +^h ,2 ^s +^h $2 +$h ^@ +$@ $h +$_ $h +^g z5 u +^g Z1 y2 +$g ^z +^g y2 Z1 +^g x71 +$g x41 +^g x16 +^g u z5 +^g seo +^g ^S +$G $P +^g ^p +$g L6 +^g L4 +^g $j +$G iB1 +$g i4s +$g i4q +$g i4G +$g i2q +$G i0S +^g i0M +^G ^H +^G ^G +$G ^g +^g ^e +^G ^C +^g ^b +$g $a +$g $9 +^g +7 ^o +$g *08 x43 +^G $$ +^G $. +^@ ^G +$g { +$g [ +] $g +^g ] +$F Z4 +$f Z3 +$F Z2 +$F Y1 +f x96 +f x93 u +f x91 +f x7A u +} f x76 +f x69 u +f x24 +f u x93 +f u x7A +f u x69 +f t ^z +$f $s ^M +f q +^f ^o +$f ^M $s +$f $m +$f ^m +$f K +^f ^K +^f $k +f $i Z4 +^f i6r +^F i64 +$F i34 +^f i2v { +$f i2s +$f i2m +^f i28 +^F i1T +^F i1l +^f i1h +$f i1D +^f i15 +$f $h +f f x05 +$F $f } +f DA ] +f ] DA +^f D5 -3 +$f d +f C { +^f ^c +$F $a +^F ^a +f ^a +f *75 *01 +^f *51 +^f -3 D5 +$f *34 +^F $3 +^f *21 +^F $1 +^F -1 +f *01 *75 +^F $* +E z2 ^H +$E Z2 +$# E Z2 +E Z1 T4 +E Z1 $@ +E ^/ z1 +$e Z1 +E Y3 $7 +E Y3 -5 +E Y2 T3 +E x63 $8 +E x45 +$e x41 +^e u ^S +^e t i55 +E $t $h +E TA $2 +E TA +$e t $7 +E T4 Z1 +E T4 { +E T3 Y2 +E svd $1 +^e ^S u +E se3 +E s1Q +E s0O +E $P +E o8t $5 +E o6M +E o51 +E o3Z +^E o3@ +E o2c $3 +^E o1m +$e L2 +^E ^L +$e K +$e i9d +$e i8q +^e i6! +E i5V +E i5T +^e i55 t +E i51 +E i5. +E i5? +E i4L +^E i48 +^e i3s +^e i3c +$e i3- +^e i2t +^E i2j +E i2H +$e i1w +^e i1t +E i1a i2g +^E i0S +E ^D i1. +$* E D8 +E D6 p2 +E D6 ] +E ] D6 +$e D4 +E +B DA +$e ^b +$e ^A $9 +$e $9 ^A +E $8 x63 +E $- *84 +E $8 +$e $7 t +E +7 $2 +E ,6 -4 +E $5 o8t +E .5 K +$E ^4 C +E -4 ,6 +E $4 *23 +E $3 o2c +E $2 TA +E $2 +7 +E *23 $4 +^e *21 +E $1 svd +E ^1 i7y +E } ^# +E { { +E [ +E ^^ +[ E $. +[ E $? +[ $. E +[ $? E +^E $@ +^E +^. ^e +^- ^e +d Z2 D6 +$D Z2 +d Z2 } +d Z1 x71 +d Z1 ,6 +d $* Z1 +d y3 .4 +[ d Y3 +^D Y2 +d $Y +d xA3 t +d x87 t +d x81 u +d x72 r +d x71 Z1 +d x71 [ +$D x62 u +d [ x61 +d x52 t +d x46 +d x41 t +d x15 +d x12 u +d x04 u +d x04 i8- +d x04 E +d } x04 +d x03 K +^D ^X +^d ^w +d u x81 +$D u x62 +d u x12 +d u x04 +d u ^T +d u o7E +d u o69 +d u ^K +d u i75 +d u i73 +d u i66 +d u i0S +d u *89 +d u *75 +d u *72 +d u .7 +d u *67 +d u ^1 +d u } +d u { +d } u +d { u +d t xA3 +d t x87 +d t x52 +d t x41 +d ^T u +d t ^S +d t ^K +d t i77 +d t i6O +d t i0D +d t D5 +d t D4 +d t D0 +d t $7 +d t *54 +d t -5 +d t *04 +d t +0 +] d t +d sKg +$d ^r p3 +d r E +d r 'B +$d ^q +d oB3 +d oB1 +d o7E u +d o69 u +} d o69 +d o59 +d o58 .6 +d o58 +$D o3_ +^d o2w +^d o2c +^d o1i p5 +d o0m ] +d ] o0m +$d o0f +$D o0D +$d $o +^D ^M +$d ^M +$d $m +d l ^1 +^D $L +^d l } +^d } l +d K x03 +d ^K u +d K +7 +d K .7 +d K ,5 +d $K +^d ^J +d i7s +d i7k +d i7a +d i77 t +d i75 u +d i73 u +d i66 u +^d i52 +^d i2j +^D i2c +^d i1i +^D i1C +^d i0V +d i0S u +^d i0R +d i0r +$d $F +$D $e +$d ^E +d D8 x05 +d D6 Z2 +d D5 t +d D4 t +d D4 'B +d D0 t +$d $D +d d +d C x03 +d 'B y3 +d *BA x04 +DA i5l +DA D5 +DA ] +$D ^A +d '9 x01 +D9 T9 +D9 slL +D9 p1 x08 +D9 o3i +$+ D9 +d { '9 +D8 o9g +D8 o8t +D8 o3q +D8 i4_ +$* D8 E +D8 c $6 +D8 $. ^a +D8 ^a $. +d *89 u +D8 +8 +D8 $6 c +D8 +3 +D8 ^2 +D8 ^1 +D8 $? +^d ^8 +D7 $y +D7 x21 +D7 x02 ^h +d .7 u +] D7 T0 +d $7 t +D7 sbp +D7 o4I sIu +D7 o3y +D7 o3j +d +7 K +d .7 K +D7 i5i +D7 i3f +D7 +7 +d *75 u +d *72 u +^D ^7 +d +7 +$+ D6 Z1 +d ,6 Z1 +D6 ^t +D6 snl +d .6 o58 +D6 o3- +D6 ^l o0d +D6 i74 +D6 i38 +D6 i2z +D6 i2r +D6 i02 +D6 d x04 +D6 DB +d *67 u +D6 -4 +D6 $. +$, D6 +^d -6 +D5 $z +D5 x61 $A +D5 t p1 +[ D5 t +d -5 t +D5 sa *93 +D5 sa +d +5 r +D5 p1 t +D5 o5t +D5 o57 +D5 o49 +D5 o34 +D5 o3. +D5 o2p +D5 o2@ +d ,5 K +D5 i6@ +D5 i2p +D5 $i +D5 E i03 +D5 $A x61 +D5 $9 *43 +d *54 t +D5 *43 $9 +D5 .4 +D5 $! +D4 t $- +D4 $- t +D4 [ p1 +D4 o3J +D4 o2g +D4 o0p ] +D4 ] o0p +D4 i6d +D4 -2 *13 +D4 $2 +D4 *13 -2 +D4 $1 +$@ [ D4 +D3 y4 y4 +D3 $y +D3 x81 +D3 ^w -6 +D3 r ^z +D3 o52 +D3 o3J +D3 o2M +D3 o0G +D3 i51 +4 +D3 $6 +D3 +4 i51 +D3 $3 +^d ^3 +D2 $Y +D2 ^v +d .2 p1 +D2 o9A +D2 o2y +D2 i3% +D2 $f +D2 ^e +D2 $d +d $2 $B +$. D2 *32 +D1 x81 +d ^1 u +D1 $S +D1 R4 R4 +D1 o7c +D1 o3 +D1 ^o +d ^1 l +D1 i52 +D1 i5- +D1 i4 +D1 i33 +D1 i0l +d *1B x74 +D1 $a +D1 ^1 +D1 $. +$! D1 +^d -1 +d $0 Z1 +D0 y3 *35 +D0 y2 y2 +D0 Y2 .0 +$$ D0 Y1 +D0 x62 +D0 x41 $. +D0 $. x41 +d +0 t +D0 $q +D0 o3k +D0 k +D0 i5= +d *08 x01 +d *04 t +D0 .1 k +D0 .0 Y2 +] d +0 +^@ ^D +d $. +$. ^d +{ $d +^d $! +^_ ^d +C z5 +C z4 x71 +[ C z3 +c ^$ z3 +c z2 D7 +C $! Z2 +^C z2 +$/ c Z2 +^c z2 +{ C z1 +c Y4 x32 +C Y4 ] +c Y2 Y2 +^c y2 *29 +$C Y1 u +^C y1 +$- c Y1 +$c $y +c x91 T9 +c x84 $1 +c x52 +$c x41 +c x32 Y4 +{ c x32 +c x13 $7 +$c $x +^c ^x +$C u Y1 +$C $t l +c TB T5 +c TB +c t $6 +c T5 TB +c T4 .7 +C T2 +c T1 +C sU1 +$c ^r +$! c r +^C $* p4 +$c p3 ^h +^c p1 [ +$c $p +c oA5 +c o9e +C o78 +c o6R +c o5u +c o5b +c o4K +c o2y +c o2r +c o2p +^c o2k +c o2^ +C o1Y +C o1u +^C ^O +$C $N +$c ^M +^c ^M +$C l $t +^c ^L +^c ^k *48 +c K $@ +c K } +$c ^k +$C $J +c i8/ +^c i6s +c i6k +C i6. +c i5S +c i5c +c i5B +C i4S +c i4R +c i4k +c i4C +C i3C +^C i3. +$c i2z +C i2Y +C i2R +^c i2h +c i1t +$c i0u +$c i0f +^C i0D +C i0a +c $i +$C $G +$c $g +^C ^E +c DA +^c D8 +c D4 $. +c $. D4 +c D3 +C D1 d +^c ^D +^C C $7 +$C $B +c ^a ^a +c *98 ,8 +c *97 +c $7 x13 +c .7 T4 +^C $7 C +c *78 $* +c $* *78 +c *75 $$ +c $$ *75 +^c *71 +c $6 t +$c *60 i3t +c +6 +C *32 +^c $3 +c *24 +C *23 ] +C ] *23 +^. ^c -2 +c $1 x84 +C $@ +C ] ] +C ^@ +} C { +c $; +$c $_ +$c ^! +$* c +$@ $c +} c +^c $# +^. ^c +$b Z4 +^b ^z +$B y5 +$B Y3 Y3 +^b $w +$B ^T +^B ^T +$b ^T +^B $s +$B $R +$b $r +'B o5i +^B o4@ +$b $o +$b $m +$B $k +^B $k +$b i8f +^b i5z +^B i53 +'B i5 +^B i0E +'B i0a { +$B i01 +^b ^H +$b $f +'B DA $3 +$b ^D *37 +'B c $7 ++B c +-B $A +} ^b ^A +$b $9 +'B $7 c +*B7 'B +*B6 'B +'B $3 DA +^b +3 +^b ^2 p3 +[ $B -1 +^b ^0 ++B $. +$# ^B +$. ,B +.B +^B ^% +{ $b +^b ] +^@ ^b +^A ^Z r +$a Z4 +$a Z2 -5 +^a z1 Y5 +^a z1 +$a ^z +^a Y5 z1 +^a Y5 y1 +[ $A y4 +'A Y3 Y3 +^A y2 K +] ^A Y2 +$A y2 +^a y1 Y5 +^a ^y +$A x83 +,A x64 +$A x53 +$A x31 +$A ^v ++A u ] ++A ] u +^a ^s x43 +$A s61 +^a s1b ++A s%! +$A r l +$A r i5b +^a ^R +$a $r +$a ^Q ^Q +$A p5 y4 +$a p4 o8k +$a p2 'A +^A oB9 { +$a o9l +$A o8# +^A o72 +^A o7# +$A o6i +$A o4y +$a o3c +$A o2p -7 ++A o2n +$A o2n +$a $o +^A $n +$A ^m +^a ^m +$A l r +^a ^L +^A K y2 +^a ^k y2 +$a $k +^A ^J +,A iA- +$A i8@ +$A i7` +^a i69 $0 +$A i62 +$a i5o +$a i5l +$A i5h +$a i5a +$A i53 +$a i5/ +^a i5, +$A i4 x43 +$A i4i +$a i3o +^A i2B +^a i2a +^a i26 +^a i1y +^A i1X +^A i1L +^A i1k +^a i0q +^A i0P +^a i0H +^a ^f +$A E T1 +-A E $5 ++A E +$A $E +^a DA +^a D6 *10 +^a ^c +$a ^B +$A +9 +$A ,9 +-A -9 +$a $9 +*A8 o67 +$. -A -8 +$ *A8 +$A -7 o2p +*A7 D6 +^a *78 +^a ,7 *48 +$a +7 +*A6 E $1 +*A6 'A +*A6 $1 E +*A6 +^a +6 +^a -6 +$a -5 Z2 +-A $5 E +^A *53 +^A -5 +^a -5 +*A4 x0A +^a *48 ,7 +$a *46 +$A *43 +{ $a ,4 +^a .4 +$A *24 +$A $2 +$A -2 +^A ,2 +^a *13 +^a *10 D6 +'A $1 +^a $0 i69 +$A -0 +$A $* +$A ^@ +$@ +A +} ^A +,A +^A $- +^A } +^A ^@ +$a $# +$a $$ +$% ^a +$_ ^a +$ $a +$` ^a +^a $- +$9 Z4 +$9 Z2 +'9 Z2 +$9 Z1 x03 +^9 z1 u ++9 Y5 x06 +$9 Y2 +^9 Y2 ++9 Y1 T1 ++9 x06 Y5 +$9 x03 Z1 +$9 $X +-9 $V $L +^9 u z1 +$9 T7 +$9 T2 T1 ++9 T1 Y1 +$9 T1 T2 ++9 t ++9 oB3 +,9 oA1 p3 +-9 o8e ++9 o62 +$9 o2i +^9 o15 +$9 o0c +$9 $M +'9 $L +-9 i90 +'9 i70 +'9 i6e +$9 i5M +$9 i5a +'9 i57 +^9 i4w +'9 i48 +'9 i46 +'9 i4@ +$9 i3t +$9 $E C +^9 ^e +,9 D4 +$9 ^d +$9 C $E +*9B +*9A i9_ +-9 $A +*98 ,1 ++9 .8 +$9 ,8 +*97 x53 +*97 i33 +*97 ^a x71 +*95 *A6 +*92 Y5 x15 +*92 x15 Y5 +*91 *37 ++9 $1 +^9 ^1 +'9 $0 +,9 $0 ++9 $@ +$. $9 +^8 z3 +$8 Z1 x42 +$8 Z1 k +-8 Z1 ,7 +$8 Z1 +$$ +8 Z1 +$8 Y3 +'8 Y3 ++8 Y2 +$8 y1 $m +$8 Y1 D0 +$8 Y1 +-8 y1 +^8 x43 +$8 x42 Z1 +$8 x42 +$8 x14 +$8 x03 +^8 u ^B +$8 T6 +-8 t ++8 soa +^8 s6. +.8 s26 +^@ $8 p3 +.8 oA0 ++8 o7g ++8 o5R +-8 o3u +'8 o0x +$8 $m y1 +-8 ^m +$8 k Z1 +$8 ^K +-8 K +^8 $J $J +^8 i7+ +$8 i4s +^8 i4d u +'8 i49 +$8 i3r +$8 i3h ++8 i3_ +-8 i2a +^8 i00 +-8 D7 +$8 D5 C +^8 D3 +$8 D0 Y1 +$8 C D5 +^8 ^B u +*8A u +*8A o6 K +*8A $@ +$. -8 -A +$8 ^a +*89 Y4 x32 +*89 x32 Y4 ++8 ,9 +-8 ,7 Z1 ++8 -7 +-8 +7 +-8 .7 +*86 Y3 x02 +*86 x02 Y3 +*86 o7% +*86 o0Q +*86 c +*86 $A +*86 +7 +*86 +6 +*86 +5 +*86 *43 ++8 -6 +$8 -6 +$@ *86 +*85 o5R +*85 .7 +,8 .5 +-8 .5 +-8 +4 +-8 +3 ++8 $0 +*80 +$@ +8 +'8 +,8 $_ +^8 $! +^8 ^. +^* ^8 +$7 Z3 +$7 Z2 c ++7 Z1 k +^7 z1 +0 +.7 } z1 +$7 Y4 l ++7 Y4 ++7 Y3 Y3 +,7 y1 p2 ++7 Y1 *67 +$7 x91 +^7 { x51 ++7 x02 +'7 ^v ++7 u D6 +$7 T6 +-7 sea +-7 ^S ++7 R6 +-7 o8u ++7 o55 +$7 o3a +,7 o2W +,7 o0w ++7 o07 +$7 l Y4 ++7 l K ++7 k Z1 ++7 K l +-7 K +$7 ^i ^R +$7 i98 +-7 i8% +-7 i77 +$7 i76 +-7 i7. +$7 i67 +$7 i5n +'7 i3@ +^7 i1d +$7 ^H +$7 ^F +$7 ^f +-7 E $5 +$7 d x07 ++7 D8 ++7 D6 u +$7 $D +^7 ^d +$7 c Z2 ++7 c T1 +'7 ^c +-7 c $* +-7 $* c +*7B x71 +^7 $B +*79 *6A +*78 x02 +*78 r +*76 Y1 *54 +*76 o71 +*76 o5D +*76 o4- +*76 o1l +*76 k $. +*76 $. k +*76 i74 +*76 i7/ +*76 .7 *56 +*76 *56 .7 +*76 *54 Y1 ++7 .6 +$ *76 +,7 +6 +-7 .6 +*75 x71 +*75 $u +*75 o7f +*75 o3w +-7 $5 E +*75 d x05 +*75 +7 +*75 *26 ++7 +5 +-7 *45 +*74 *45 +*74 *21 +.7 +4 +,7 -4 +^7 +4 +*73 o2f +,7 *37 x21 +*73 *50 ++7 ,3 +*72 sst o5q +-7 +2 r +*72 o5q sst +-7 *23 ++7 +1 +$7 $1 +'7 ^1 +*70 o3f +*70 i8R +*70 *73 +,7 *06 +*70 -0 +*70 +$7 ^$ +$+ -7 +$$ .7 +$@ ^7 +$. ,7 +$- $7 +$_ $7 +$ +7 +'7 +-7 } } +-7 ^@ +^* $7 +^6 z2 K +^6 z2 C +,6 Z1 +^6 Z1 +'6 $. Y2 +$6 x71 +$6 x45 E +^6 x21 +,6 x03 +$6 ^w +'6 u d +.6 u +'6 t D4 +$6 $t +-6 soi +^6 s6m $. +^6 $. s6m +.6 s0x +$6 ^S +$6 ^s +-6 ^s ++6 p4 $6 +'6 p2 +-6 p1 Y4 +-6 o8e +.6 o7. i52 +-6 o7e ++6 o73 +$6 o61 $5 +-6 o3R ++6 o3. +-6 o2h +^6 o1T +'6 o1g +-6 o11 +.6 o0y +-6 o0F ++6 l K +-6 l K +$6 l D4 +,6 l d +^6 K z2 ++6 K l +-6 K l ++6 K +4 +$6 $J +-6 i7p +-6 i7o ++6 i7l +-6 i74 +.6 i7/ +,6 i7_ +'6 i5S +.6 i5r +,6 i4- +^6 i4- ++6 i3S +$6 i3k +-6 i3b ++6 i3. +-6 i2v +$6 i1P +.6 i1a +^6 i00 +-6 $i ++6 $f -5 +$6 E x45 +'6 d u +,6 d l +,6 D7 i4T +'6 D4 t +$6 D4 l +^6 C z2 +,6 C *45 +$6 ^b ++6 $! ^A ++6 ^A $! +-6 $A +*69 x32 +*69 o6% +*69 $. +-6 -9 +*68 x08 +*68 o2K +*68 o0d +*68 *95 +*68 ,9 +.6 *85 +,6 $8 +*67 Y4 t +*67 Y2 C +*67 t Y4 +*67 o5* +*67 o0G +*67 o0f +*67 o05 +*67 [ i3q +*67 C Y2 +*67 *85 ++6 ,7 +.6 +7 ++6 *62 +*65 $W +*65 o8p +$6 $5 o61 +*65 o1u +*65 K +*65 i33 +*65 i23 ++6 -5 $f +*65 *87 +.6 *56 +2 +*65 *57 ++6 +5 +*65 { { +$! *65 +*64 u p1 +*64 p1 u +*64 o4) +*64 o0n ++6 +4 K +*64 i2k +*64 *79 +,6 *45 C +*64 *53 +*64 .3 *31 +*64 $0 +] ,6 ,4 +.6 +4 +*63 t +*63 o4? +*63 o0x +*63 l +6 +*63 +6 l +*63 +-6 ^3 +*62 $w Z5 +*62 o61 +*62 -9 -9 +.6 +2 *56 +*62 *53 +,6 -2 .1 +.6 $2 +^* *61 z3 +*61 y2 y2 +*61 Y2 [ +*61 [ Y2 ++6 +1 ^y +*61 ,3 +^6 $1 +*60 z2 Y1 +*60 Y1 z2 +*60 o8p +*60 o3a +*60 i7. +*60 { +*60 +$/ .6 +$ $6 +$ -6 +$= .6 +.6 $? +-6 $* +^{ -6 +.5 } z4 +$5 Z2 +,5 z1 Y2 +.5 Z1 [ +.5 [ Z1 +$5 $Z ++5 Y4 -7 +,5 Y3 y3 +,5 y3 Y3 +,5 Y3 ] +,5 Y2 z1 +$5 Y1 Y4 +$5 x71 +.5 x32 +$5 x12 +$5 ^X +$5 $x +$5 ^x +-5 $w +$5 T7 +-5 t *42 +$5 T2 +,5 t +^5 sFP +-5 s20 +$5 $S +$5 $s } +-5 $Q +] -5 $q +^5 q +.5 ^p ++5 o8s ++5 o7y +-5 o7g ++5 o7e +$5 o7 +.5 o6s +$5 o6e +,5 o67 ++5 o61 +-5 o60 +,5 o6_ +$5 o5 +.5 o4X ++5 o4p +-5 o3q +$5 o2x ++5 o2q +,5 o2P +$5 o0F +$5 o0C +$5 o0A +.5 ^n i2 +.5 l K +-5 K o8z +.5 K l +.5 K E +,5 K $a +,5 k +-5 iA1 +-5 i6a +-5 i61 +^5 i5w +,5 i5s ++5 i5H l +.5 i5e +-5 i5@ +-5 i4_ +.5 i3y +-5 i3g +$5 ^I +^5 $F C +.5 E K +$5 ^E +$5 D6 +^5 D6 +^5 C $F +$5 c $2 +,5 ^a z2 +^5 ^9 +*58 x61 o7b +*58 *86 +*57 k +3 +*57 i5( +*57 *46 $. +*57 $. *46 +*57 +3 k +*57 .2 +*57 +0 +*56 x62 u +*56 x02 o7j +*56 u x62 +*56 ^s +*56 p2 x14 +*56 o73 +*56 o6@ +*56 o46 +*56 i2q +*56 i23 +*56 i0x ] +*56 ] i0x +*56 ^A +*56 *12 p3 +*56 $1 +*54 T0 *65 +*54 s6N +*54 o4z +*54 l +*54 i1T +*54 *65 T0 +*54 -5 +2 +*54 $@ ,4 +*54 ,4 $@ +-5 *42 t +*54 +2 -5 +$! *54 +[ } *54 +*53 Z5 Z5 +*53 Y4 y3 +*53 y3 Y4 +*53 o7y +*53 o47 +*53 o1I +*53 k +*53 i5t +*53 i5g +*53 -8 +*53 -5 [ +*53 *24 ++5 -3 +2 +*53 +2 +*53 $! +*52 x51 +^5 ^2 x41 +*52 o4a +$5 $2 c ++5 +2 -3 +*52 .2 ++5 -2 +*51 p5 +*51 o1K +^5 +1 +^5 $1 +*50 o7w +*50 o7g +*50 i2s +*50 ,2 +*50 +0 $! +*50 $! +0 +$. *50 ++5 $. ++5 $ +$5 $* +[ ^5 { +.5 $$ +,5 $@ +,5 $. +^5 ] +^* ^5 +.4 Z1 *57 +,4 y5 xA1 +$4 Y4 Y4 +$4 Y3 +$4 Y1 +$4 x83 +-4 x52 +3 +$4 x51 C +^4 x43 +-4 x31 +$4 u p1 ++4 u d +,4 u d +$4 T8 +$4 ^t +^4 ^t ++4 so0 +,4 sE- +$4 p1 u +-4 $p +.4 o7@ +-4 o5a +$4 o57 +-4 o2s +$4 o2R ++4 o0K +$4 o0K +.4 o0G ++4 { o0d +-4 ^m ++4 l +.4 k +0 +,4 ^k +^4 i7Z +.4 i7. +,4 i6. +-4 i5; +,4 i4Z c +,4 i4p +.4 i4L +-4 i4i +$4 i44 +-4 i3d ] +-4 ] i3d +.4 i2u *54 ++4 i25 +$4 i1u +^4 i1r +^4 i1c +,4 i0m +^4 i0L +^4 f x06 ++4 d u +,4 d u +$4 DA +$4 C x51 +$4 $c +,4 $A +{ ,4 $a +*48 D8 +*48 +4 +$4 -8 +.4 $8 +*47 Y3 x41 +*47 x41 Y3 +*47 q x17 +*47 $1 +*47 +-4 ,7 +*46 t p1 +*46 t d +*46 p1 t +*46 o7& +*46 o4y +*46 o4. +*46 o0j +*46 d t +.4 *68 *57 +*46 *76 ++4 *65 +-4 *63 ,5 +} *46 +] ,4 ,6 +^4 ^6 +*45 i1V +.4 *57 *68 +] $4 *57 +-4 *57 +-4 ,5 *63 +*45 *12 ++4 -5 +] *45 +[ *45 +-4 *41 ^j ++4 *40 +$4 .4 +^4 $4 +-4 +3 x52 +*43 s47 +*43 o7w +*43 o5j +*43 o4M +*43 o4- +*43 o1I +*43 K +,4 *36 +*43 *21 +^4 $3 +*42 ^y +*42 o45 +*42 o1E +*42 k ^3 +*42 *34 ++4 *20 +$4 +2 +} *42 +*41 ^h +*41 *50 +*41 -3 +*41 *25 D5 +] *41 +*40 x31 +*40 k y2 +*40 $A +^4 *06 +*40 *31 r +*40 *23 y2 ++4 $@ ++4 $! ++4 { { +$4 $. +$4 ^! +$. $4 $. +$! ,4 +-4 $? +^4 $. +^4 ^# +^4 ^$ +^3 z2 +$3 Y5 ++3 y5 +-3 y4 x75 +$3 y4 c ++3 y3 y3 +-3 y3 y3 +^3 y1 x42 +$3 xA1 +$3 x93 t +$3 $w $a +-3 u f +-3 u d +$3 t x93 +-3 t p1 +-3 t i2- +$3 T6 +$3 T3 +^3 $t ++3 srm +-3 sa* +-3 s2$ +,3 ^s +-3 r $z +-3 r l +-3 $q +'3 p2 E +-3 p1 t +.3 p1 +6 +-3 o98 +$3 o9% +-3 o9% +$3 o8= +-3 o8_ ++3 o7m +-3 o7c +$3 o77 +$3 o5k +,3 o5a +-3 o5a +$3 o59 +-3 o4l ++3 o2G +-3 o2c +$3 o21 +^3 o1R l +,3 o1e +-3 o12 +,3 o0n +,3 o0L +,3 o0k +.3 o0c +-3 o0A +$3 o0$ +-3 l r +$3 iA8 x43 +^3 i60 +,3 i5z +-3 i4l +^3 i42 +$3 i3s +$3 i3p +-3 i3, +-3 i2- t +.3 i2s +$3 i2n +$3 i0S +,3 i0b +$3 ^I +-3 $h +-3 f u +'3 E p2 +-3 E i0@ +-3 d u ++3 d c +$3 D7 +.3 D6 +^3 D4 +$3 D1 +$3 ^d +,3 ^d +$3 c T7 +^3 ^c +*3B *2A ++3 $A +.3 ^A +*37 srq +*37 o5q +*37 o2d +*37 *46 +*37 *27 +*37 *24 +*37 -2 +*37 $1 +*37 } +*36 K +*36 *74 +*36 *41 +-3 *63 +*36 *14 +*36 +*35 $w +*35 $v +*35 t +*35 r +*35 o6n +*35 o5u E +*35 o2z +*35 i7M +*35 i6a +*35 E o5u ++3 *57 +*35 *61 +,3 $5 *26 ++3 *52 +-3 *51 +.3 -5 +*34 sty +*34 r $. +*34 o5n +*34 o3S +*34 o3- +*34 o2f +*34 i5p +.3 *47 +*34 ^3 +*34 *25 ^a ++3 *41 [ +] *34 +,3 +4 ++3 +3 *10 ++3 *31 +*32 Z2 [ +*32 [ Z2 +*32 y3 +*32 y2 +*32 x61 +*32 x03 +*32 o4$ +*32 o3x +*32 o3p +*32 o0y $f +*32 $f o0y +,3 *26 $5 +.3 *26 +*32 *45 +*32 *14 +.3 .2 +*31 Y1 ^d +*31 x31 i0a +*31 p5 ^g +*31 o2C +*31 o1v +*31 o0r +*31 i3v +*31 ^d Y1 +*31 *54 ++3 *10 +3 ++3 ,1 +*31 $_ +-3 +1 +-3 $1 +^3 ,1 +^@ *31 +*30 y5 y5 +*30 ^S +*30 o5f +*30 i5h +*30 i5 +*30 i24 +*30 C [ +*30 *20 +*30 .1 ++3 +0 +^_ *30 ++3 $= +$+ .3 +$? -3 +} } $3 +-3 $$ +-3 { +^@ ^3 +$2 Z2 +$2 Z1 ,7 +^ $2 z1 +-2 y5 y5 +-2 y4 +$2 Y2 Y2 +,2 y2 *45 +^2 y1 r ++2 x72 ,3 +^2 x32 +$2 x13 +^2 x13 +$2 x12 -0 +$2 x12 +-2 $x +-2 $w +.2 u +0 +^2 ^u +$2 syi +,2 ^s +^2 ^s +$2 $R +-2 r +$2 $Q ++2 $q +^2 ^q +-2 $p +.2 o8! +-2 o7w +$2 o6z E +$2 o6b +-2 o5y +-2 o55 +.2 o4u +.2 o4f +$2 o4, +-2 o3J +^2 o1j +.2 o1i +-2 o1e +-2 o1d ++2 o0x *14 +.2 o0f +-2 k y2 +.2 K -5 +$2 $K +$2 k +[ -2 k +$2 i88 +-2 i7. +$2 i5z c +^2 i5@ +$2 i4x +$2 i4, +,2 i3y +$2 i3m +-2 i3a +$2 i3_ +-2 i3@ +-2 i2x +$2 i1r +.2 i1- +$2 i0X +$2 i0I +^2 i01 +^2 ^h +$2 ^G +-2 ^f +$2 E o6z ++2 E $4 +^2 ^e +^2 D5 ++2 D4 y5 +^2 D3 ++2 D1 +$2 c i5z +.2 ^c +$2 $B +^2 'A +-2 ^a +*28 x62 +^2 $8 p2 +$2 +8 +$2 ,7 Z1 +*27 o7b ++2 *73 *54 +,2 *71 +$2 ^7 +*26 i31 +*26 i2r +*26 i1r +*26 D5 +*26 D3 +*26 *76 +*26 +$2 +6 +-2 +6 +-2 .6 +*25 Y4 r +*25 Y4 +9 +*25 o5a +*25 o4v +*25 o2z r +*25 o2k +*25 o1a +.2 -5 K +*25 D6 +*25 -7 *23 +*25 *64 ++2 *54 *73 +*25 *43 +*25 *23 -7 +.2 -5 *20 +*25 +2 ++2 -5 *07 +-2 *50 +*24 [ y4 +*24 $w +*24 ^u D2 +*24 r +*24 o4k +*24 i5o ++2 $4 E +*24 *A8 +*24 *52 +*24 *35 p1 +*24 *32 ++2 *43 +.2 *41 +-2 *41 +*24 $@ +*24 { ++2 ,3 x72 +*23 o0y +*23 [ k +*23 *70 +*23 *45 +*23 -4 +*23 *24 ++2 +3 +$ *23 +-2 ,3 +.2 *20 -5 +*21 y5 c +*21 r +*21 o2g +*21 o0w +*21 l +2 +*21 C '2 +*21 $A ++2 *14 o0x +*21 +2 l +*21 '2 C +-2 *12 +0 +*21 *01 +-2 -1 +*20 y3 +$2 -0 x12 +*20 ^V +.2 +0 u +*20 ^R +*20 o5q +*20 o33 +*20 o0W +*20 o0o +*20 o0g +*20 o0@ +*20 i4+ +*20 i3i +^_ *20 c ++2 *07 -5 +*20 -7 +*20 *65 $@ +*20 $@ *65 +*20 *46 *23 +*20 *31 +*20 *23 *46 +*20 +2 +-2 +0 *12 +[ *20 $1 +,2 *01 +*20 *03 +*20 +0 ++2 +0 +[ *20 ++2 $. [ ++2 [ $. +$2 $* +$2 ^$ +$2 ^- +$+ $2 +$@ ,2 +$@ -2 +$. +2 +$! $2 +} } +2 +^2 ^@ +^# $2 +^* +2 +^1 Z5 Y2 ++1 z5 u +$1 Z2 C +$1 Z1 D6 ++1 y5 E ++1 y4 t +,1 y4 l ++1 Y3 +] +1 Y3 +$1 y3 +$1 Y1 x71 +,1 y1 $. +,1 $. y1 +$1 xB3 +$1 xA2 c +$1 xA2 +$1 x71 Y1 +$1 x53 $1 +$1 x04 ++1 $w Z2 +$1 ^w ++1 u z5 ++1 u [ ++1 [ u ++1 t y4 +,1 T2 +-1 T0 ++1 t +^1 ^t +^1 slL +$1 skd ++1 p2 +$1 oAt +^1 o9- +] $1 o7m +$1 o7i +$1 o7, +$1 o5y +$1 o4e +$1 o3o +$1 o3m ++1 o3_ +-1 o3@ +-1 o26 +,1 o2_ +$1 o1y +^1 o1 +.1 o0w +-1 o0p ,4 +$1 o0g ++1 o02 +^1 ^N +^1 $M +^1 ^M +,1 l y4 +^1 ^L +-1 K +$1 ^J +$1 iAQ +$1 i8e +^1 i7! +^1 i6d +^1 i65 +$1 i61 +$1 i5d +^1 i58 +-1 i55 +^1 i5- ++1 i4z D3 +$1 i4W E +-1 i4r +$1 i4m +] $1 i40 +-1 i2s ++1 i2p +.1 i2E +-1 i1u ++1 i17 +^1 i0S +-1 [ i0j +-1 i0j +$1 i0` +^1 i0# +$1 E +1 +,1 d Z1 +$1 D7 C +$1 D6 Z1 +$1 D6 *45 +$1 D5 +^1 D3 ++1 $d +$1 C Z2 +$1 c xA2 +$1 C D7 +$1 C *12 +[ -1 $B +$1 .A +^1 'A ++1 $a +*19 r } +$1 .9 +$1 ,9 +*18 o0W +*18 *09 +$1 ,8 +[ $1 $8 +*16 y2 y2 +*16 Y2 [ +*16 [ Y2 +*16 i7b +*16 -7 *73 +$1 -6 +.1 *57 +*15 *30 +*15 *26 *46 +,1 *50 +[ *15 +^1 ^5 +*14 y2 } +*14 t +*14 o5k +-1 ,4 o0p +*14 ^k +*14 i2l +$1 *45 D6 +*14 *56 +*14 ,3 +^1 *41 ^x +*14 $@ +$. *14 +*13 o5l +*13 o14 { +*13 o0j +*13 o0E ^$ +*13 l k +*13 k l +*13 ^j +*13 i70 +*13 i2v +*13 i2n +*13 i1i +*13 +7 +.1 *32 +-1 *31 +*13 *02 +.1 *30 +,1 -3 +^1 $3 +*12 Y1 k +*12 o5@ +*12 o0v +*12 k Y1 +*12 K +$1 *21 +[ $1 *20 +$1 .2 +.1 +2 +^1 +2 +$1 $1 x53 +$1 +1 E ++1 *14 +$1 *12 C +[ *10 y2 +*10 ^K +*10 d 'B +*10 D0 $* +*10 $* D0 +*10 *25 +[ +1 *02 +.1 .0 +0 +*10 +^# ^$ *10 ++1 $! +$1 $$ +$1 $_ +$1 [ +$1 ^ +$+ -1 +$< ^1 +-1 { +^1 } +^1 ^@ +$0 Z3 C +$0 Z2 +$. .0 Z2 +-0 y5 u +-0 y4 c +-0 y3 y3 ++0 y2 +^0 $y +$0 ^w +-0 u y5 +-0 u p1 ++0 t p1 +^0 T9 +-0 s*# ++0 ^R ++0 p5 $* +-0 p2 +.0 p1 Y3 +-0 p1 u ++0 p1 t ++0 o7D ++0 o6G +-0 o49 ++0 o4# +-0 o3x +$0 o30 +-0 o2V +$. -0 o15 ++0 $o +$0 ^M ++0 ^L ++0 k y1 +-0 k +$0 iA1 +-0 i7@ +-0 i6h ++0 i4a +-0 i4- +-0 i4 ++0 i3k +$0 i3d ++0 i37 +$0 i33 ++0 i2a +.0 i1w ++0 i1e ++0 i16 +$0 i0m +^0 i0c +$0 $G +$0 D5 $3 +$0 C Z3 ++0 c $5 +^0 C ^3 +$0 [ C ++0 ^c +-0 $b +$0 ^a ^S ++0 ^A +*07 o0x +*07 i7R +*07 -3 +.0 *70 ++0 +7 +-0 $7 +*06 o0v +*06 o0c +*06 i5G +$0 *65 o67 ++0 *61 +*05 Y2 Y2 +*05 o7v +*05 o5n +*05 o5e +*05 o4u ++0 $5 c +*05 ^b y2 ++0 *56 +*05 -3 +*04 x41 +*04 x12 +*04 i51 +*04 D6 *42 +*04 D5 D3 +*04 *42 D6 +-0 *40 +-0 $. -4 +-0 -4 $. +$/ *03 Z1 +*03 y5 t +*03 t y5 +*03 o40 +*03 o4- +*03 o27 +*03 i5w +*03 i3# +$0 $3 D5 +*03 D1 +^0 ^3 C +-0 *34 +*03 *32 *13 +*03 *21 r ++0 ^3 +*03 $. +*03 +^0 ^3 +*02 sAf +*02 o65 +*02 o0v +*02 o0M +*02 i5b +*02 i2n +*02 i1r +*02 C +*02 *61 +*02 *53 +*02 +5 +[ *02 +1 +$0 -2 +*01 x51 ] +*01 ] x51 +*01 x31 ^w +-0 +1 r +*01 i58 +*01 ^d i3y +.0 *13 +-0 -0 sei +.0 *07 ++0 $0 ++0 ] +$0 ^@ +$+ +0 +$% +0 +$. ^0 +[ +0 $= +[ $= +0 +-0 $. +^0 ] +^. $0 +$+ ^. +$% $$ +$\ ^/ +$\ +$' +$. [ +$; $' +$= $- +$< ^> +} $@ +} $, +} } } +{ { +] $# +[ $+ +^+ } ] +^\ $\ +^$ } } +^' +^. $ +^/ ^/ +^` +^z ^Z Y3 +$z Z4 t +^z z3 +^! $z z3 +$z Z2 x41 +$z Z2 o9x +$z Z2 *41 +^Z z2 +$z Z1 E +$Z z1 +^z Y3 ^Z +^z Y2 +$z y1 +$z x93 +^z x63 +$z x41 Z2 +^Z x32 +$z x03 +$Z ^X +$Z ^w T8 +^z ^u +$z t Z4 +$z $t +$Z $S +^z ^r +^z $Q +^z ^P +$Z o81 +] $z o4o +^z o40 +$Z o2s +^Z o1T +^z ^O +$z $l +$z iBc +$z i7y +$z i6w +^z i5y +$z i5u +$z i5p +^z i3y +^z i3w +$z i3q +$z i34 +^z i2y +$z i2d +^z i1m p5 +^z i1m +^z i11 +^z i1@ +^z i0b +^z ^I +$z $i +$z E Z1 +^z d 'A +^z D3 +$Z D1 +^z ^C +$Z $a +$Z ^a +^Z $9 +^z -8 K +$z +7 +$z $7 +Z5 Z5 x43 +Z5 Z5 x04 +Z5 Z5 *45 +Z5 Z5 ,3 +Z5 Z5 $1 +z5 z5 +Z5 Z4 [ +Z5 [ Z4 +^+ z5 z4 +^ z5 z4 +$% Z5 Z2 +z5 Z1 x36 +Z5 Z1 x23 +z5 z1 $* +z5 $* z1 +Z5 Y5 Y2 +Z5 Y5 x13 +Z5 Y5 x04 +z5 y5 u +Z5 Y5 *54 +Z5 Y5 *45 +Z5 Y5 $1 +Z5 Y4 ,4 +Z5 Y3 ,2 +Z5 Y2 Y5 +z5 Y2 x46 +Z5 Y2 +Z5 Y1 x23 +Z5 x64 t +z5 x57 t +Z5 x52 t +Z5 x51 $9 +z5 x49 t +z5 x46 Y2 +Z5 x43 Z5 +z5 x39 t +z5 x36 Z1 +Z5 x23 Z1 +Z5 x23 Y1 +Z5 x13 Y5 +Z5 x04 Z5 +Z5 x04 Y5 +z5 u y5 +Z5 u ^D +Z5 u *45 +Z5 t x64 +z5 t x57 +Z5 t x52 +z5 t x49 +z5 t x39 +Z5 t o1R +z5 t K +Z5 t *98 +Z5 t -0 +Z5 sJG +z5 sdf +Z5 s6l +z5 o6F .7 +z5 K t +Z5 $K +Z5 i8. +z5 i6a t +Z5 ^D u +Z5 -A Z3 +z5 *A4 Z3 +Z5 $9 x51 +Z5 *98 t +Z5 -9 -7 +z5 *91 x46 +z5 .7 o6F +Z5 -7 -9 +z5 *61 *27 +Z5 *54 Y5 +Z5 ,4 Y4 +z5 *4A Z3 +Z5 *45 Z5 +Z5 *45 Y5 +Z5 *45 u +$z *54 +Z5 ,3 Z5 +^z *53 +Z5 ,2 Y3 +z5 *27 *61 +Z5 -0 t +Z5 $+ +$$ Z5 +$- Z5 +] $? Z5 +^z -5 +z4 z5 xA3 +^+ z4 z5 +^ z4 z5 +Z4 z4 C +z4 z4 +Z4 Z3 Y5 +Z4 Z3 +$. Z4 Z3 +$; Z4 Z3 +z4 { Z3 +Z4 Y5 Z3 +z4 Y5 *85 +z4 Y5 *27 +z4 y5 { +Z4 Y3 +$_ Z4 Y3 +^/ z4 Y2 +z4 Y1 x35 +Z4 x63 C +z4 x39 t +z4 x35 Y1 +z4 x34 -1 +z4 x27 t +Z4 x23 p1 +Z4 x21 u +Z4 x06 i2= +z4 ^W z5 +Z4 u x21 +Z4 u +z4 t x39 +z4 t x27 +$ Z4 t +z4 $s t +Z4 sIY +Z4 oAM +Z4 o8A p3 +Z4 o7k +Z4 o7- +Z4 o7_ +z4 o3. +z4 ^L K +$' Z4 l +z4 K ^L +z4 i11 +Z4 $g +Z4 f *10 +$$ Z4 E +$. Z4 E +Z4 d xA2 +Z4 C z4 +Z4 C x63 +$ Z4 +4 +$z *41 Z2 +z4 -1 x34 +Z4 *16 +Z4 $! +$$ Z4 +$- Z4 +$= Z4 +{ z4 } +^@ z4 +z4 +Z3 Z5 Z4 +Z3 Z4 Z5 +Z3 Z4 *34 +$. Z3 Z4 +$; Z3 Z4 +^! z3 $z +z3 Y5 r +Z3 Y4 Y5 +Z3 y4 *56 +z3 x45 t +Z3 [ x41 +z3 x3A +Z3 x35 +Z3 ^V +Z3 u T8 +z3 t x45 +z3 T3 T2 +z3 T2 T3 +Z3 $q +Z3 p4 'A +Z3 p1 +Z3 oB. +Z3 oA_ +Z3 o9+ +Z3 o8, l +Z3 o6@ +z3 o3@ +z3 o2p +z3 o1a +Z3 o0y +z3 o0h +z3 o0b .6 +Z3 l o8, +$` Z3 l +Z3 iB_ +Z3 i9. +Z3 i1k +{ Z3 ^h +Z3 f i5a +z3 E -1 +Z3 ^e +Z3 $d Z1 +Z3 d x05 +Z3 d *20 +z3 c r +Z3 c +7 +Z3 $A *37 +Z3 $A -2 +Z3 +7 c +Z3 *74 ^P +z3 { *71 +z3 .6 o0b +z3 *51 +2 +Z3 *37 $A +Z3 *34 Z4 +Z3 -2 $A +z3 +2 *51 +Z3 $2 +z3 -1 E +Z3 $1 $A +z3 *18 +z3 -1 +z3 *07 i7- +^z *30 *26 +$& Z3 +$\ Z3 +} Z3 +] $` Z3 +} z3 { +Z2 Z5 +$% Z2 Z5 +z2 Z3 +Z2 $/ Z2 +} Z2 z2 +} z2 Z2 +Z2 Y5 +Z2 y5 +Z2 y4 $x +Z2 y4 *76 +z2 Y2 ^S +z2 Y2 -1 +$ z2 Y2 +$! Z2 y1 +{ Z2 y1 +Z2 $x y4 +$ Z2 x83 +z2 x61 *53 +$> Z2 x52 +Z2 x42 c +z2 x42 ] +z2 ] x42 +Z2 x23 [ +Z2 x21 x61 +z2 x21 E +Z2 x13 y3 +Z2 [ x13 +[ Z2 x13 +Z2 t p1 +Z2 t o49 +Z2 T3 p2 +$. Z2 T1 +z2 ^S Y2 +Z2 saE E +Z2 R5 { +$. Z2 R4 +z2 ^r +Z2 $q +z2 ^q +Z2 p2 x03 +Z2 p2 +Z2 p1 t +Z2 p1 -7 +Z2 oBi u +Z2 oB_ +Z2 oA! E +Z2 oA9 +Z2 oA7 +Z2 o9_ l +Z2 o7. +Z2 o6- z1 +Z2 o6z +} Z2 o6r +Z2 o6? +Z2 o5 sSB +Z2 o5 +Z2 o49 t +Z2 o2h +z2 o2. +z2 o1s +9 +z2 o17 { +z2 o0r +z2 o0p y3 +z2 o0K +Z2 } $O +Z2 l o9_ +Z2 L7 +Z2 l $_ +Z2 $_ l +z2 K +0 +^` z2 K +z2 ^j +Z2 i9u +Z2 i9/ p3 +z2 i7- *08 +Z2 i6 +Z2 i56 $. +Z2 $. i56 +Z2 i4t +Z2 i3@ +Z2 i2@ +z2 i1p +z2 i0q -1 +z2 ] ^g +z2 ^g ] +z2 f x3A +z2 E x21 +Z2 E oA! +] z2 E +$* Z2 D6 +$? Z2 D4 +Z2 $D +Z2 $d +} Z2 ^d +Z2 C z2 +Z2 c x42 +z2 C o0B +$= Z2 C +] z2 c +z2 ^B +Z2 ^a } +z2 { ^A +z2 +9 o1s +Z2 -7 i4_ +Z2 *71 } +Z2 ,7 +^z *26 *30 +] z2 *60 +$. Z2 ,6 +z2 *53 x61 +$$ Z2 -5 +z2 '5 +$- Z2 *43 +Z2 *37 $. +Z2 $. *37 +Z2 $3 +^* z2 -3 +Z2 *27 x51 +Z2 [ *21 +[ Z2 *21 +z2 -1 Y2 +Z2 *16 +Z2 [ *10 +z2 +1 +[ z2 +1 +z2 -0 y1 +z2 ^0 y1 +z2 +0 s3. +z2 +0 K +Z2 *07 +Z2 $% +Z2 $* ^# +Z2 $* +Z2 $? +Z2 $- +Z2 $_ +Z2 ^# $* +$) Z2 +$( Z2 +$. Z2 [ +$. [ Z2 +$, Z2 +$< Z2 +} Z2 +] $/ Z2 +] $^ Z2 +z2 $. +^z $2 +^! z2 +^ z2 ] +^ ] z2 +z1 Z5 ^B +z1 z5 $* +z1 $* z5 +z1 Z1 $D +Z1 z1 *1A +z1 y5 x03 +z1 Y5 ^q +Z1 Y4 ^R +Z1 Y3 x03 +z1 Y2 $. +z1 Y1 ^m +$- z1 Y1 +^! z1 Y1 +^$ z1 x92 +Z1 x72 +Z1 x52 $* +Z1 $* x52 +Z1 x43 y5 +z1 x42 y4 +$@ Z1 x14 +{ Z1 x05 +Z1 x03 Y3 +z1 u $9 +Z1 u ,3 +Z1 t p4 +Z1 t -6 +z1 t +5 +Z1 t ,3 +Z1 t $2 +Z1 T1 ,B +Z1 ssD +Z1 sO) +z1 sgl +Z1 sa@ c +Z1 s9 +$& Z1 s03 +Z1 ^S +Z1 ^R Y4 +z1 R0 z2 +z1 ^q Y5 +Z1 q -7 +Z1 $Q +Z1 p4 t +z1 p2 Z1 +Z1 p2 $a +z1 p2 $9 +z1 p2 ] +Z1 p1 +A +Z1 $P +Z1 o6y +Z1 o6R c +Z1 o6j +Z1 o52 +Z1 o3o +Z1 o29 ,5 +Z1 o1u +z1 o0a } +Z1 $o +z1 ^m Y1 +Z1 ^m p3 +z1 ^m +z1 L1 ^f +$! z1 L0 +z1 l +Z1 ^K +{ z1 ^j +Z1 i8y +Z1 i8v +Z1 i8. +Z1 i79 +Z1 i76 +Z1 i63 +Z1 i4w +z1 i3m +z1 i3l +Z1 i3A +Z1 i2o $0 +z1 i2- E +z1 i2c +z1 i2A +Z1 i27 +Z1 i1t +z1 i1o ^i +z1 i1C +z1 i11 C +z1 i0K +z1 ^i +z1 ^h u +z1 $h ^2 +Z1 ^g y1 +Z1 $f +z1 E i2- +Z1 E *23 +Z1 d x03 +Z1 D6 $@ +Z1 $@ D6 +z1 D5 *13 +z1 d ] +Z1 c sa@ +z1 C i11 +$. Z1 C +$* Z1 c +z1 ^B Z5 +Z1 ,B T1 +z1 ^B +} z1 $B +Z1 ^a z1 +z1 $A +Z1 $9 Z1 +z1 $9 u +z1 *97 Z1 +} z1 .9 +Z1 *86 Y2 +z1 ^8 *01 +Z1 ,8 +Z1 *75 i7- +Z1 +7 .2 +$ Z1 ^7 +[ Z1 -7 +Z1 -6 t +Z1 *60 { +$* Z1 ,6 +z1 +5 t +Z1 ,5 o29 +z1 *54 -2 +$* Z1 ,5 +{ z1 +5 +Z1 *46 *12 +Z1 .4 +Z1 ,3 u +Z1 ,3 t +$z *13 i2z +z1 +3 *12 +z1 *31 +z1 ] ^3 +z1 ^3 ] +Z1 $2 t +z1 ^2 $h +Z1 .2 +7 +z1 -2 *54 +Z1 *23 E +z1 $1 s1@ +z1 *16 ] +z1 *16 +z1 ] *16 +z1 *13 D5 +Z1 *12 *46 +z1 *12 +3 +$z *10 ^q +Z1 $0 i2o +Z1 *06 { +Z1 *03 +$ Z1 -0 +Z1 $% +Z1 $/ +Z1 } +Z1 ^* +$$ Z1 +$, Z1 +{ $* Z1 +^@ Z1 +^! Z1 +{ ^@ z1 +^. z1 +^` z1 +$z *07 +$$ ^Z +$. ^Z +$z $* +$z $@ +$z } +$z { +$@ ^z +$_ ^z +$ $z +} $z +$Y Z3 q +^y z1 +^y ^Z +^y $z +^Y y2 l +$Y { Y1 +^Y ^y +$Y xA4 u +^y $ x98 +$y x52 t +$y x14 +4 +$Y u xA4 +^Y { ^U +$y t x52 +^y ^s y2 +^y s1- +^y ^Q +^y $p +0 +$y oB7 -7 +^y o8y +$y $; o8t +$y o5t +^Y o57 +^Y o1t +^Y o1h +$y o0x +$y $o +^Y l y2 +^y L0 z2 +$Y ^L +^Y ^K +^Y ^J +^y ^J +^y $j +$y i7o +$y i52 +^y i3m +^y i2q +^y i1u -0 +^y i1A +$y i0z +$y i0Y +^Y i0N +^Y i0M +^y i0c +^y i0b +$y ^f +^y ^E +$Y c +$y ^c +^Y $A +^y $9 +$y -7 oB7 +$y ,7 +^Y *64 $! +^Y $! *64 +y5 z1 u +Y5 ^z +y5 Y5 *0B +y5 y4 x63 +y5 Y3 x76 +[ y5 Y2 +y5 xA5 u +Y5 xA4 x52 +y5 x94 E +y5 x94 +y5 x92 D7 +y5 x92 } +[ y5 x91 +Y5 x84 $0 +y5 x83 +Y5 x82 E +y5 x82 +y5 x76 +$! y5 x76 +y5 x75 x02 +y5 x75 +7 +y5 x75 .3 +Y5 x74 ,8 +y5 x74 +6 +Y5 x73 D3 +y5 x68 $! +y5 $! x68 +y5 x67 +y5 x64 C +Y5 x63 l +Y5 x63 -5 +y5 x63 *30 +Y5 x63 +Y5 x62 +4 +Y5 x61 +Y5 x58 +Y5 x57 i3i +y5 x54 i7 +Y5 x53 o5. +y5 x53 l +y5 x53 E +Y5 x53 D8 +Y5 x53 .4 +Y5 x52 i6e +y5 x43 u +y5 x34 $L +Y5 [ x34 +Y5 x2B +y5 x2B +Y5 x28 +Y5 x27 +Y5 x24 +Y5 x23 i5k +y5 x21 o2a +Y5 x18 +Y5 x17 +Y5 x13 l +Y5 x13 +Y5 { x12 +Y5 x06 $f +Y5 x06 C +y5 } x04 +Y5 x03 +0 +y5 x02 x71 +y5 u z1 +y5 u xA5 +y5 u x43 +Y5 u D4 +Y5 u $0 +[ Y5 u +y5 t T0 +y5 T1 +y5 T0 t +y5 T0 '9 +y5 t $0 +$* y5 t +Y5 r x93 +y5 r DA +Y5 r c +Y5 oBd +y5 oAN +Y5 oA- +Y5 o7 +y5 o6t +Y5 o6p +y5 o6e +Y5 o5w +y5 o5s DA +y5 o5n +Y5 o5m +y5 o5l +Y5 o5f +Y5 o4* +y5 o1u +y5 o0v +y5 o0S +y5 o0P +y5 o0n +y5 o0L +y5 o0k +y5 o0H +y5 o0d +y5 o0B +Y5 ^M +y5 ^M +Y5 l x63 +y5 l x53 +y5 $L x34 +Y5 l x13 +Y5 k ] +Y5 ] k +y5 K +y5 $j +y5 iAt +y5 iAD +y5 i5y x74 +y5 i5o +y5 i5m +y5 i51 +Y5 i50 ] +Y5 ] i50 +Y5 [ i4; +Y5 $f x06 +y5 E x94 +Y5 E x82 +y5 E x53 +y5 E D6 +y5 E *13 +y5 E ] +y5 ] E +y5 ^E +Y5 DA x34 +y5 DA o5s +Y5 DA +y5 D6 E +Y5 D4 u +Y5 D3 +2 +Y5 D2 o9. +y5 C x64 +Y5 C x06 +Y5 C ] +Y5 ] C +y5 *BA K +y5 *AB K +Y5 'A *52 +Y5 $A +y5 '9 T0 +y5 *8A x64 +y5 ,8 *48 +Y5 ] ,8 +Y5 '8 +Y5 ,8 ] +Y5 +7 x25 +y5 +6 x74 +Y5 *62 x05 +y5 *60 +Y5 -5 x63 +y5 *5A x92 +Y5 *52 'A +Y5 -5 +Y5 +4 x62 +y5 [ ,4 +y5 .3 x75 +y5 *30 x63 +y5 ,2 k +Y5 +2 D3 +y5 *21 +y5 ^1 C +Y5 *19 x04 +Y5 *13 x25 +y5 *13 E +Y5 $1 +y5 $1 +Y5 $0 x84 +Y5 $0 u +y5 $0 t +$* Y5 +] Y5 +y5 $! [ +y5 $! +y5 [ $! +y4 Z3 *65 +Y4 Z2 *67 +y4 Z2 +Y4 Y4 x12 +Y4 Y4 x06 +Y4 Y4 ^G +Y4 Y4 $9 +Y4 y4 ] +Y4 ] y4 +[ Y4 y4 +[ y4 Y4 +Y4 y3 x59 +y4 y3 '8 +y4 Y3 +y4 Y2 ^A +y4 Y1 o4t +y4 x85 -6 +y4 x81 D5 +y4 x72 -4 +y4 x67 E +Y4 x64 +Y4 x62 u +Y4 x62 +y4 x62 ] +y4 ] x62 +y4 x58 $8 +^* y4 x56 +Y4 x53 $2 +Y4 x43 t +Y4 x38 K +y4 x37 K +Y4 x35 T2 +y4 x32 ] +y4 ] x32 +Y4 x31 K +y4 x23 *15 +Y4 x12 Y4 +y4 x12 +Y4 x0B +Y4 x06 Y4 +y4 x02 saN +Y4 ^w x52 +Y4 u x62 +Y4 u T1 +Y4 u D6 +Y4 u +4 +Y4 u ,4 +y4 u +4 +Y4 t x43 +Y4 t T1 +y4 t iAA +Y4 t ^D +Y4 t +4 +Y4 t *36 +Y4 T2 x35 +Y4 T1 t +Y4 t ^1 +y4 } T1 +y4 saN x02 +y4 ^S +Y4 $q ^! +Y4 ^! $q +Y4 oB1 +Y4 o9s 'A +Y4 o9l +y4 o9i c +Y4 o8x +y4 o8u +Y4 o8t +Y4 o8d +Y4 o84 +Y4 o83 +Y4 o8@ +Y4 o8- +y4 o8- +y4 o7t +Y4 o7p +Y4 o75 +Y4 o7 +y4 o5t +Y4 o5m +y4 o5d +Y4 o59 +} Y4 o4v +y4 o4t Y1 +y4 o4t +y4 o4n +y4 o4j +y4 o4f +y4 o4e +y4 o4c +y4 o4b +y4 o3z +y4 o3s +y4 o3* +Y4 o2g +y4 o2c +y4 o0Z +y4 o0V +y4 o0M +y4 o0m +y4 o0H +y4 o0G +y4 o0g +y4 o0F +y4 o0E +Y4 o0d +y4 o0A +Y4 ^M +Y4 $L +y4 ^L +Y4 K x38 +y4 K x37 +Y4 K x31 +y4 K E +Y4 ] K +y4 $j Y1 +Y4 iB- +Y4 iA_ +Y4 iA +Y4 i6p +Y4 i4s E +y4 i4s +Y4 i4E +y4 i41 +Y4 i4_ +Y4 i2u +Y4 i2l +Y4 i2d +Y4 i2- *72 +Y4 i1u +y4 i0q x62 +Y4 ^G Y4 +Y4 f x28 +y4 f o8c +y4 ^f +y4 E x67 +y4 E K +Y4 E i4s +y4 E +6 +y4 E $. +y4 $. E +y4 $d Z3 +y4 D7 DA +Y4 D7 +Y4 D6 u +y4 D2 +0 +y4 D1 +Y4 $d +y4 c T1 +y4 c o9i +y4 c +B +y4 c +y4 +B y4 +y4 +B c +y4 +B $. +y4 $. +B +y4 ^A Y2 +y4 ^A x12 +Y4 'A o9s +y4 $A $b +Y4 $A +Y4 $a +y4 *95 x06 +Y4 .9 +y4 $8 x58 +y4 '7 K +Y4 *72 ] +Y4 ] *72 +[ Y4 -7 +y4 +7 +y4 -6 x85 +y4 +6 E +y4 *65 Z3 +y4 *65 +Y4 ,6 -4 +y4 +6 +y4 *59 +Y4 $5 +y4 -5 +y4 -4 x72 +Y4 +4 u +Y4 ,4 u +y4 +4 u +Y4 +4 t +Y4 *4A 'A +Y4 -4 ,6 +Y4 *36 t +Y4 $2 x53 +y4 .2 p1 +Y4 *29 y2 +y4 *20 T0 +Y4 +2 +y4 +2 +y4 $2 +y4 ^2 +Y4 ^1 t +y4 *10 +y4 ^1 +y4 +0 D2 +Y4 $+ +Y4 $* +Y4 $ +Y4 } ] +$. Y4 +$ Y4 +{ Y4 } +y4 $. [ +y4 [ $. +] y4 +[ y4 $? +[ $? y4 +Y3 ^Z Z4 +Y3 Z4 ^Z +y3 Z2 o1l +y3 Z1 D5 +Y3 $z +Y3 ^y y1 +y3 y5 x5A +Y3 Y5 x27 +Y3 y5 t +Y3 ] Y5 +y3 Y5 +y3 y3 Y1 +y3 y3 x58 +Y3 Y3 x45 +y3 Y3 u +y3 y3 si1 +Y3 Y3 D4 +Y3 Y3 C +y3 y3 -9 +y3 y3 [ +y3 [ y3 +y3 y2 T0 +y3 y2 ^f +y3 y2 C +y3 Y1 y3 +Y3 $+ Y1 +y3 y1 $. +y3 $. y1 +y3 xA4 c +y3 x81 ] +y3 ] x81 +Y3 x76 +y3 x73 c +y3 x65 +} y3 x63 +Y3 x62 [ +y3 x54 +y3 x53 T1 +y3 x53 C +Y3 x53 +Y3 x45 Y3 +Y3 x41 T1 +^. y3 x41 +Y3 x32 +Y3 x31 l +Y3 x02 t +y3 u Y3 +Y3 $u +Y3 t y5 +Y3 t x02 +Y3 t o4Y +y3 t $2 +y3 T1 x53 +Y3 T1 x41 +Y3 T0 -5 +y3 s*q +y3 sk# +9 +y3 si1 y3 +Y3 sCm +y3 s4 +Y3 s2* +Y3 s1- +Y3 $S +y3 $s +y3 ^s +Y3 r -0 +y3 p3 *47 +Y3 oB. +Y3 oA% +y3 o9t x53 +Y3 o9 *86 +Y3 o94 ] +Y3 ] o94 +Y3 o9/ +Y3 o9! +y3 o7. +Y3 o6s +y3 o6@ +y3 o5r +y3 o5e ^k +y3 o5a +y3 o4y +y3 o4u +Y3 o4j +y3 o3v +Y3 o3t +Y3 o3s +y3 o3r +y3 o3p +y3 o3k +y3 o3g +Y3 o34 c +y3 o3. +] y3 o2x +y3 o2. +y3 o1m +y3 o1l Z2 +y3 o0v +y3 o0P +y3 o0n +y3 o0m +y3 o0L +y3 o0A +Y3 $+ $n +Y3 l x31 +y3 l $2 +y3 ^L +y3 K Y2 +y3 k *21 +Y3 $K +Y3 iAn +y3 i9- +Y3 i8b +Y3 i8. +y3 i8. +Y3 i7/ +Y3 i6i +Y3 i6c ] +Y3 ] i6c +y3 i6. +Y3 i43 +y3 i2k +Y3 i2g +Y3 i0w +y3 i0K x32 +Y3 $i +Y3 E -6 +y3 d x63 +Y3 D6 $A +y3 D5 Z1 +Y3 D4 y4 +Y3 D4 Y3 +Y3 $d +Y3 C Y3 +y3 c xA4 +y3 c x73 +y3 C x53 +Y3 c o34 +y3 c ,3 +Y3 c ^1 +Y3 c $! +Y3 $! c +y3 c } +y3 c ] +y3 ] c +y3 ^B +Y3 'A Y3 +Y3 $A D6 +y3 ^A +y3 ^a +y3 +9 sk# +y3 +9 D0 +Y3 +9 -8 +Y3 *97 +Y3 *96 ,7 +Y3 $9 +Y3 -9 +Y3 -8 +9 +Y3 *81 +3 +} Y3 +8 +Y3 *78 ,3 +Y3 *75 x02 +y3 *73 +Y3 *72 ] +Y3 ] *72 +Y3 .7 +Y3 -7 +y3 +6 y3 +Y3 -6 E +Y3 *68 ,3 +y3 *64 +Y3 -5 T0 +Y3 *58 x12 +y3 .5 *04 +Y3 *48 D6 +] Y3 *43 +Y3 -4 +0 +y3 ,3 c +Y3 +3 *81 +Y3 ,3 *78 +Y3 ,3 *68 +y3 *36 *20 +y3 *35 f +Y3 $3 +y3 -3 +y3 $2 t +Y3 -2 p4 +y3 $2 l +y3 *27 x76 +Y3 *27 +Y3 -2 *24 +y3 +2 ,1 +y3 *20 *36 +y3 *16 ] +y3 ] *16 +Y3 *13 +Y3 *12 z5 +y3 ,1 +2 +y3 -1 [ +y3 *04 .5 +Y3 +0 -4 +y3 *02 +Y3 $& +Y3 $* +Y3 $? +Y3 $! +Y3 } [ +[ Y3 ] +^. Y3 $. +y3 } +y3 [ +$, y3 +y2 z5 $W +y2 z5 D9 +Y2 z4 $n +y2 z4 *17 +^/ Y2 z4 +Y2 Z2 +$ Y2 z2 +] y2 z2 +Y2 $Z +Y2 y5 ^r +Y2 Y5 ^q +[ Y2 y5 +Y2 Y4 k +Y2 Y4 *76 +y2 Y4 { +y2 y3 -5 +y2 Y2 x63 +Y2 y2 x43 +Y2 Y2 $x +y2 y2 K +Y2 Y2 ^E +Y2 y2 c +y2 y2 'B +y2 Y2 $A +] Y2 y2 +y2 Y2 +] y2 Y2 +Y2 x84 $0 +y2 x82 +Y2 x75 +y2 x71 y2 +y2 x71 i1a +y2 x71 *04 +y2 x63 Y2 +y2 x62 *06 +y2 x42 T6 +Y2 x42 *87 +Y2 x32 -1 +y2 x1A C +y2 x1A +Y2 x15 t +y2 x15 $! +y2 $! x15 +Y2 x13 y3 +y2 x04 ^w +Y2 x04 +y2 x04 +Y2 x02 +Y2 ^x +y2 $X +y2 $W z5 +y2 $v k +Y2 $V +Y2 ^v +Y2 u oBE +y2 u o2B +Y2 u D2 +Y2 u *89 +Y2 u *53 +Y2 u $# +Y2 $# u +Y2 t x15 +y2 t $S +Y2 T4 -8 +y2 T4 +y2 t ,4 +Y2 T1 *8B +Y2 t [ +Y2 [ t +Y2 swS +Y2 sLm +Y2 ^s +Y2 r o3y +Y2 r +3 +Y2 R0 ^& +Y2 ^q Y5 +Y2 q x12 +Y2 p3 x08 +Y2 p2 x84 +Y2 p1 x06 +y2 p1 +y2 ^p +Y2 oBE u +Y2 oA6 +Y2 oA. +Y2 o9. +Y2 o8p Y1 +Y2 o8e x61 +Y2 o8a +y2 o7z c +y2 o7q +Y2 o79 +Y2 o78 +y2 o76 +y2 o73 +Y2 o72 +y2 o7_ +y2 o6T E +Y2 o6g +Y2 o6d +y2 o6d +Y2 o62 +y2 o61 +Y2 o5z +Y2 o5v +Y2 o5q +Y2 o5J l +Y2 o5- +Y2 o4x +Y2 o4t +y2 o4t +y2 o4 sx9 +Y2 o4l +Y2 o4k *12 +y2 o4k +Y2 o4i c +Y2 o4@ c +y2 o4c +y2 o4 +Y2 o3z +y2 o3x +y2 o3s +y2 o3q +y2 o3j +Y2 o36 +y2 o3@ +Y2 o2z +y2 o2v o1p +y2 o2B u +Y2 o1u +y2 o1r $@ +y2 $@ o1r +y2 o1p o2v +y2 o1p +Y2 o1o +y2 o1J +Y2 o1g +y2 o0y +y2 o0x *43 +Y2 o0t +y2 o0t +y2 o0s +y2 o0P +y2 o0M +y2 o0F *43 +y2 o0B +y2 ^o +Y2 $n z4 +Y2 $m +y2 l ,4 +Y2 $L +Y2 $l +Y2 K Y5 +Y2 k Y4 +y2 K y2 +y2 k ^w +y2 k $v +y2 k i7a +y2 k $h +Y2 K D5 +y2 k D4 +y2 k *42 +y2 ^K +Y2 ^J +Y2 ^j +y2 ] ^j +y2 ^j ] +y2 ^j +Y2 i9. +Y2 i7w *89 +y2 i7a k +Y2 i7@ +Y2 i7- +Y2 i6v +Y2 i5t x61 +y2 i5i +y2 i5a +Y2 i5 +] Y2 i5 +Y2 i48 +Y2 i4- +y2 i4. +[ Y2 i3x +y2 i3p +y2 i3f +y2 i3b +y2 i34 o3g +Y2 i3@ +y2 i2x +y2 i2. +Y2 i1j +y2 i1i +y2 i1C o1f +Y2 i0E +y2 i0! +Y2 $h Y3 +y2 $h k +y2 ^h +Y2 ^G ^W +Y2 $f +Y2 ^E Y2 +y2 E T4 +y2 E *15 +Y2 E $! +Y2 $! E +Y2 D5 K +y2 D4 k +Y2 D2 u +y2 C x1A +y2 c T1 +y2 c o7z +Y2 c o4i +Y2 c o4@ +Y2 c *AB +Y2 C +9 +y2 c $9 +Y2 c $5 +$. Y2 C +] Y2 C +y2 ^B z1 +Y2 $b +Y2 *AB c +Y2 +9 C +y2 $9 c +Y2 *96 +Y2 +9 *58 +Y2 $9 +y2 $9 +Y2 -8 T4 +Y2 *8B T1 +Y2 *89 u +Y2 *89 +6 +Y2 *80 +y2 ,8 +y2 ^8 +y2 $7 Z1 +Y2 *7A -3 +Y2 *76 +Y2 $7 [ +Y2 [ $7 +{ Y2 -7 +y2 +7 $@ +y2 $@ +7 +Y2 +6 *89 +y2 *64 x62 +Y2 -6 +Y2 $5 c +Y2 *5A ] +Y2 ] *5A +Y2 *58 +9 +Y2 *53 u +y2 *52 +Y2 *51 +y2 *50 $+ +y2 $+ *50 +Y2 $5 +y2 ,4 t +y2 ,4 l +Y2 *49 x24 +y2 *43 o0x +y2 *43 o0F +y2 *42 k +Y2 $4 +Y2 -3 *7A +y2 *37 +Y2 *30 *21 +y2 .3 +y2 { *28 +Y2 *27 x42 +y2 *24 ^s +Y2 *21 *30 +Y2 +2 +y2 ,2 +y2 -2 +y2 ^2 +Y2 -1 x32 +Y2 $1 p3 +y2 *15 E +Y2 *12 o4k +y2 +1 +$y *21 +Y2 $0 x84 +y2 *06 +y2 *04 x71 +Y2 } *01 +Y2 $% +Y2 $? +Y2 $, +Y2 $- +Y2 $= +] Y2 $$ +^@ Y2 ] +y2 } +$/ y2 +} } y2 +{ y2 +Y1 z5 t +Y1 Z5 +Y1 Z2 +$! y1 Z2 +{ y1 Z2 +y1 z1 ^F +y1 Z1 ^C +Y1 Z1 +$- Y1 z1 +^! Y1 z1 +Y1 Y5 ^q +y1 Y5 E +Y1 y4 u +Y1 Y4 +4 +Y1 y3 E +Y1 ^y *30 +y1 Y1 ,4 +$\ Y1 y1 +y1 Y1 $* +$\ y1 Y1 +y1 ^y +Y1 x61 +$! Y1 x53 +y1 x52 +3 +$& Y1 x42 +{ y1 x37 +Y1 x34 r +Y1 x31 D6 +Y1 x21 +$$ Y1 x21 +Y1 x03 ^N +Y1 $w +Y1 u y4 +Y1 u p1 +Y1 u $D +y1 u ,7 +y1 u $3 +y1 ^u +Y1 t z5 +Y1 t i2S +y1 t i1M +Y1 T9 $! +Y1 $! T9 +Y1 t ^6 +Y1 t ,3 +y1 t ^3 +Y1 T0 i5R +Y1 $t +Y1 slz u +Y1 sKT +Y1 sjN +y1 sF7 +Y1 s5v +Y1 s1* +Y1 s1- +y1 r i5b +Y1 ^q Y5 +Y1 p4 l +Y1 p4 c +y1 p2 Z1 +y1 p2 Y1 +Y1 p1 u +Y1 p1 *9B +y1 $p +0 +y1 o83 +y1 o8. +Y1 [ o2k +y1 o2@ +[ Y1 o1b +Y1 o1! } +Y1 o0w *12 +Y1 o0h +Y1 o0f +Y1 o0a +y1 ^O +y1 $m L5 +Y1 ^m $7 +Y1 l p4 +y1 L5 $m +y1 K Z1 +$ Y1 k +Y1 iA4 c +Y1 iA +Y1 i8@ +Y1 i6y +Y1 i6n +Y1 i5R T0 +Y1 i5* o51 +Y1 i5n i80 +y1 i44 +Y1 i3_ +Y1 i28 +y1 i1i +y1 i0* z2 +y1 i0U $1 +y1 i0t +y1 i0M +Y1 i0B +y1 ^I +Y1 $h $q +y1 f x76 +Y1 ^F +y1 E Y5 +Y1 E ^G +y1 ^E +Y1 $D u +Y1 d TB +y1 d D0 +Y1 d -6 +$; Y1 d +y1 $D +Y1 C z1 +y1 ^C Z1 +y1 c ^X +Y1 $c $w +Y1 c p4 +Y1 c iA4 +y1 C i00 +y1 C ^9 +Y1 c *67 +Y1 C .6 +$^ Y1 C +Y1 $c +$) Y1 c +y1 ^C +y1 ^a t +Y1 ^a $3 +y1 ^9 C +Y1 $@ ^9 +Y1 ^9 $@ +Y1 ^9 +y1 ^9 +Y1 *8A +y1 ,7 u +Y1 $7 ^m +Y1 *75 *03 +Y1 -7 $3 +y1 $. *73 +y1 '7 ^1 +Y1 $. .7 +Y1 .7 $. +Y1 ^6 t +y1 $6 d +Y1 .6 C +Y1 *67 c +Y1 *65 $* +Y1 $* *65 +Y1 ,6 [ +Y1 *52 ^N +y1 $5 *14 +Y1 -5 +Y1 +4 Y4 +y1 ,4 Y1 +y1 ,4 ^p +y1 *45 ^J +y1 +4 $. +y1 $. +4 +y1 +3 x52 +y1 $3 u +Y1 ,3 t +y1 ^3 t +Y1 $3 ^a +Y1 $3 -7 +y1 *35 *20 +y1 *30 $2 +Y1 $3 +$ Y1 +3 +Y1 ,2 y2 +y1 $2 *30 +y1 *20 *35 +Y1 ^2 } +Y1 ,1 o01 +y1 $1 i0U +y1 *14 $5 +Y1 *12 o0w +y1 ^1 +y1 +0 $p +y1 *07 +y1 *04 z1 +Y1 *03 *75 +$- Y1 { +[ Y1 $. +$ y1 +{ y1 +^^ y1 +^y +0 $p +^y -0 i1u +$y $. +} ^y +^y $ +$x Z5 +$X Z2 x43 +$x Z2 ^c +^X Z2 +} $x Z2 +$x ^* z2 +$x Z1 TA +^X z1 +^x ^Z +$x Y2 +$X Y1 t +$x Y1 *03 +^x y1 { +^x x61 +$x x52 +$X x43 Z2 +^x x25 -3 +^X x24 u +$x x02 +^X u x24 +$X t Y1 +$x srm +$x srb +$x $s +$x $r +^x $r +^x p5 $X +$X $P +$x o6w +$x o3z +$x o2g +^x o2@ +^x o1i +^X o1C +$X o0X +$x o06 +^x ^m +$x $J c +^X ^J +^x ^j +$X i91 -9 +$x i8z +^X i7P +^x i6r +^x i5w +$X i5 +^x i3p +^x i30 +$x i2f +^x i1d +$x i08 +$x $f +^x D6 i1_ +^x D1 $8 +$x D1 +$X $d +$x $D +$x ^c Z2 +$X c +xB5 iBi +xB4 oBt +xB3 +B +xB3 ,B +xB3 +xB2 K +xB2 iA +xB2 $9 +xB1 *67 x72 +xA9 k D4 +xA9 D4 k +xA8 c $1 +xA8 $1 c +xA3 oA1 +] xA3 ] +] ] xA3 +xA2 Y2 +xA2 x42 +xA2 oBu +xA2 o5w +xA2 K -8 +xA2 d x0A +xA2 -8 K +xA1 u +xA1 t D4 +xA1 o9c +xA1 i5l +xA1 D4 t +x96 +x94 +x93 x19 C +x93 o05 +x93 C x19 +x93 c $9 +x93 $9 c +x93 $! +$. x93 +x92 Y2 +x92 sey +x92 -A +^@ x92 +x91 x41 K +x91 u DB +x91 o99 +x91 K x41 +x91 i61 +x91 i6. +x91 DB u +$@ x91 +] x91 ] +] ] x91 +^x $8 D1 +x87 o2 c +x85 +x84 i88 +x83 o05 +$! x83 c +x83 +5 +x82 Y4 +x82 $w +x82 p4 $a +x82 o9u +x82 o4y +x82 'B i8a +x81 $r +x81 o7i +x81 o7b +x81 o42 +x81 E +x81 ^e +x81 DB +x81 *AB +x81 *42 +x81 $1 +$@ x81 +x76 +5 +x74 ^1 +x73 i7c +x73 i5D +x72 Y3 D3 +x72 Y3 +x72 o5@ +x72 l L8 +x72 $l i7b +x72 L8 l +x72 i7g +x72 i7b $l +x72 i6p +x72 D4 +x72 D3 Y3 +x72 c T4 +x72 -A +x72 *23 *24 +x72 $1 +x72 ] +$. x72 +[ x71 x31 +x71 u D4 +x71 u *78 +x71 o7z +x71 o66 +x71 o62 +x71 o3F +x71 o1C +x71 i5D +x71 D4 u +x71 ^d +x71 d +{ x71 *80 +x71 *78 u +x71 *73 ] +x71 ] *73 +$/ x71 +$; x71 +^x -7 +x6B +x67 Z1 +x65 o52 +x65 o3H +x65 $b +x64 Z1 +x64 u +x63 y5 u +x63 u y5 +x63 i6i +x63 i5k +x63 $8 +x63 *76 p3 +x63 *45 +1 +x63 +1 *45 +x63 $? +x63 [ +x62 Z1 soe +x62 Y3 [ +x62 [ Y3 +x62 $W +x62 ^w +x62 ^T ^U +x62 T0 ] +x62 ] T0 +x62 soe Z1 +x62 $s +x62 o3c +x62 o0T +x62 o0R +x62 $o +x62 $K +x62 +A +x62 $A +x62 ,7 +x62 *67 -0 +x62 -5 +x62 $3 +x62 *20 +x62 -0 *67 +x62 $_ +$$ x62 +x61 ^z o66 +x61 Y3 +6 +x61 x92 +x61 ^x +x61 $r +x61 ^Q +x61 o9n +x61 o81 +x61 o4w +x61 o3D +x61 ^l +x61 K +x61 i5e +x61 i4h +x61 i1m +x61 E o6W +x61 ^B +x61 +6 i2z +x61 -6 +x61 *34 +x61 $/ +$- x61 +x59 +x57 o2v +x57 $1 +x54 x41 +x54 sai +x54 p1 E +x54 E +x54 c +x54 ^5 +x54 +3 +] x54 +x53 $^ Z1 +x53 Y2 $A +x53 Y2 +$! x53 Y1 +x53 o0R +x53 l +x53 K +x53 i7_ +$* x53 i58 +x53 i5@ +x53 i1V +x53 $h +x53 *56 +x53 *20 +$> x52 Z2 +x52 $z +x52 y5 $! +x52 $! y5 +x52 y4 x01 +x52 Y4 ] +x52 Y4 +x52 x62 +x52 $s t +x52 seB +x52 sbf +x52 r ^d +x52 r d +x52 o3l +x52 i7. +x52 i3x +x52 i2v +x52 i2k +x52 i1o y2 +x52 $e +x52 d r +x52 *75 $. +x52 $. *75 +$. x52 *43 +x52 *35 ] +x52 ] *35 +x52 ,3 +x52 *24 y5 +x52 $. +x52 $, +x52 ^! +x51 Z3 [ +x51 [ Z3 +x51 Z1 ^6 +x51 x13 +x51 x03 +x51 $w +x51 ^U +x51 t R5 +{ x51 t +x51 R5 t +x51 R5 *47 +x51 ^P D3 +x51 p4 .2 +x51 o5= +x51 o4S +x51 o4_ +x51 o2q +x51 o0r +x51 o03 +x51 K $y +x51 k ^r +x51 k $f +x51 i68 +x51 i4o +x51 i3, +x51 i2y +x51 i2/ +x51 $f k +x51 ^6 Z1 +x51 $$ -6 +x51 $6 +x51 -6 $$ +x51 $5 +x51 ^5 +x51 *47 R5 +x51 *25 +} x51 +x48 o5d +x46 ] +x45 Z5 Z4 +x45 Z4 Z5 +x45 t p1 +x45 T0 $5 +x45 p1 t +x45 o5d +x45 $5 T0 +x43 x62 +x43 o3@ +x43 i3k +x43 i2m +x43 ^f +x43 D1 +x43 $? $1 +x43 $+ +x43 $ +x42 Z4 u +x42 Z2 +x42 $Z +x42 y5 +x42 y3 Y2 +x42 Y3 +x42 y2 y5 +x42 Y2 y3 +x42 Y2 +$& x42 Y1 +x42 u Z4 +$* x42 u +x42 t d +x42 stk +x42 $r c +x42 $Q +x42 p2 D6 +x42 o6j +x42 o4 +x42 o0v +x42 ^j +x42 i7 +x42 i6. +x42 i5e +x42 i48 +x42 i1h +x42 d t +x42 c $r +x42 ^b x41 +x42 *21 +0 +x42 +0 *21 +x42 $+ +x42 $@ [ +x42 ] +x42 [ $@ +] x42 $* +] $* x42 +x41 Y5 x34 +x41 Y4 ] +x41 y2 +x41 x81 +x41 x52 +x41 T5 +x41 soi +x41 seJ +x41 se3 +x41 sBG +x41 o5- *56 +x41 o4y +x41 o4b +x41 o40 +x41 o3t +x41 o2q +x41 o1l k +x41 o0z +x41 o0m +x41 k y4 +x41 i6u +x41 i6m +x41 i5c +x41 i3S +x41 i2r +x41 i2h +x41 d E +x41 DB +x41 ^B y1 +x41 -6 +x41 -3 D1 +x41 ^! +x38 o3v o2p +x38 o2p o3v +$* x37 +x35 Z2 y4 +x35 y5 T9 +x35 y5 c +x35 y4 Z2 +x35 ^u y5 +x35 i2x +x35 i1l +x35 D4 +x35 *43 *07 +x35 *12 +x35 *07 *43 +} x34 y3 +x34 [ y2 +x34 $w i2v +x34 ^w +x34 u [ +x34 [ u +x34 t p1 +x34 ^s +} x34 q +x34 p1 t +x34 o1S +x34 i2v $w +x34 d c +x34 ^8 { +x34 ^2 o23 +x32 y5 x91 +x32 Y4 c +x32 Y4 *12 +x32 Y2 $v +x32 Y2 l +x32 $y +x32 x81 +x32 t K +x32 ] r +x32 ^P +x32 o4s +x32 o2r y4 +x32 o24 +x32 o0g +x32 l Y2 +x32 K t +x32 ^K +x32 ^k } +x32 k +x32 i3@ +x32 i0g *41 +x32 c Y4 +x32 c +x32 $a +$ x32 *84 +x32 *75 o5y +$+ x32 .6 +x32 -4 p4 +x32 *20 +x32 *12 Y4 +x32 $0 Y1 +$. x32 *01 +x32 $, +x32 $ +x31 Z5 u +x31 } Y4 +x31 y2 ^t +x31 $w o3x +x31 u Z5 +x31 t d +x31 t +x31 stJ +x31 sa@ +x31 ^s +x31 R5 +x31 o52 +x31 o5@ +x31 o3x $w +x31 o21 -1 +x31 o1b +x31 o0j +x31 l f +x31 l d +x31 K -9 +x31 i9. +x31 i86 +x31 i52 +x31 i4; +x31 i2s +x31 f l +x31 E -7 +x31 E $4 +x31 d t +x31 d l +x31 $A -2 +x31 ^a +x31 ^9 y1 +x31 $8 +x31 -7 E +x31 ^6 z2 +x31 $5 +x31 $4 E +x31 -2 $A +x31 ^2 +x31 -1 o21 +x31 $1 +x31 +0 +x31 $. +$* x31 +x28 p3 'A +x27 y2 u +x27 y1 +x27 u y2 +x27 p3 l +x27 l p3 +x26 y2 u +x26 u y2 +x26 T0 +x26 s*0 +x26 c T2 +x26 [ +x25 z2 +x25 u R5 +x25 u +x25 R5 u +x25 p4 l +x25 p4 k +[ x25 p2 +x25 l p4 +x25 f k +x25 f D6 +x24 y3 +x24 Y2 f +x24 y2 +x24 q y1 +x24 p2 l +x24 p2 E +x24 o1- +x24 o0F l +x24 l p2 +x24 K -3 +x24 i2. +x24 ^g +x24 E p2 +x24 d *54 +x24 $d +{ x24 $7 +x24 -3 y4 +x24 -3 K +x24 $1 +$@ x24 +[ x24 +x23 z2 Y2 +x23 Y2 z2 +x23 y2 [ +x23 R2 +x23 $Q +x23 p2 $2 +x23 i4. +x23 i2p +x23 i1o +x23 $A +x23 *73 +x23 $5 +x23 -3 Y4 +x23 $! +x23 +$$ x21 Y1 +x21 ^w +x21 u d +x21 $s +x21 q E +x21 p1 l +x21 oA1 +x21 o0v +x21 l p1 +x21 l d +x21 l *31 +x21 i46 +x21 i3% +x21 i1d +x21 i01 +x21 ^h +x21 d u +x21 d l +x21 D2 $8 +x21 d +x21 C +x21 ^c +$! x21 c +x21 $8 D2 +x21 -7 +x21 ^6 +x21 *31 l +x21 *04 +x21 $% +^# x21 $# +^# $# x21 +$x *20 +x1B z4 +x1B z3 +x19 Z5 Z4 +x19 Z4 Z5 +x19 y4 ,4 +x19 p2 'A +x18 x13 +x18 t +x17 z2 +x17 p3 l +x17 l p3 +x17 i2h +x16 z4 t +x16 z3 Y5 +x16 z3 t +x16 Y2 +x16 t z4 +x16 t z3 +x16 R0 +x16 p3 l +x16 l p3 +x16 $* +x15 z3 t +x15 z3 +x15 ^z +x15 y1 t +x15 y1 +x15 t z3 +x15 t y1 +x15 t R0 +x15 p5 +x15 i4q +x15 i3w +x15 C z3 +x15 C y1 +x15 { +$* x15 +x14 z3 y3 +$@ x14 Z1 +x14 y4 E +x14 Y4 c +x14 y4 *48 +x14 y4 +x14 y3 +x14 y2 ^- +[ x14 u +x14 t q +x14 t o3* +x14 q t +x14 p4 $h +x14 p3 l +x14 o4@ q +x14 o3* t +x14 o2v +x14 l p3 +x14 ^k +x14 i1i +x14 i0\ +x14 d C +x14 c Y4 +x14 ^c +x14 *04 d +[ x13 Z2 +x13 Y5 l +x13 Y5 $a +x13 y4 +x13 Y3 k +x13 Y2 y5 +x13 y2 ,6 +x13 y2 +x13 u +x13 t p2 +x13 t $* +x13 $* t +x13 p2 t +x13 l Y5 +x13 k Y3 +x13 i41 +x13 i2. +x13 f -3 +x13 } ^F +x13 ^f +x13 ^. ^c +x13 $8 +x13 ,4 y2 +x12 ^@ ^Z +x12 Y4 o0F +x12 Y4 ^b +x12 y4 +x12 Y2 u +x12 y2 +x12 ^# y1 +x12 u Y2 +x12 p2 +x12 o7q +x12 o5W +x12 o4c +x12 o0F Y4 +x12 $K +x12 i4y +x12 i3 +x12 i2h +x12 i21 +x12 E o1B +x12 ^e +x12 ^c +x12 ^b Y4 +x12 ^b +x12 $9 +x12 } $6 +x12 -5 +x12 -2 +x12 *12 +$x *12 +^x .1 +x0B z3 +x0A z5 +x0A y2 +x0A Y1 +x09 p2 +x09 p1 +x09 d +x09 .1 +x09 ^0 +$ x09 +x08 z3 u +x08 u z3 +x08 p2 *75 +x08 $* +x07 Y3 y3 +x07 y3 Y3 +x07 p2 +x07 p1 +x07 d +x07 +1 +x06 z5 +x06 y3 +x06 ^9 +x06 ^4 +x06 ^3 +x06 ] +} x06 +] x06 +[ x06 +{ x05 Z1 +x05 R0 +x05 ^% q +x05 k +x05 D0 +x05 $9 +x05 +0 +{ x05 +x04 Z1 y5 +x04 y5 Z1 +x04 Y2 f +x04 x71 +x04 o3v +x04 o09 z2 +x04 i5% +x04 d +7 +x04 C +{ x04 $c +x04 .2 +x04 ,2 +x04 +1 +x04 } +x04 ] +[ x04 $@ +[ $@ x04 +x03 ^z Z1 +x03 Z1 ^z +x03 Z1 y5 +x03 Z1 Y3 +x03 y5 Z1 +x03 Y2 $5 +$x *03 Y1 +x03 $y +x03 xA2 +x03 $* ^X +x03 ^X $* +x03 ^T +x03 smk +x03 $Q p3 +x03 p2 +x03 p1 c +x03 o3l +x03 ^j y2 +x03 i64 +x03 i6* +x03 i31 +x03 i2T +x03 i2e +x03 i24 +x03 i2? } +x03 f +x03 D4 +x03 ^D +x03 C +x03 { +$ x03 +^? x03 +x02 Z1 y2 +x02 Y3 +x02 y2 Z1 +x02 $V +x02 TA +x02 ^T +x02 sar +x02 ^Q y1 +x02 o5g +x02 o2j +x02 i6l +x02 i59 +x02 i3f +x02 i34 +x02 i2f +x02 i24 +x02 i1w +x02 i1o +x02 ^H ^A +x02 d C +x02 c $8 +x02 C +x02 $A +x02 $8 c +x02 *87 +x02 *71 +x02 -5 +x02 *21 p2 +x02 +0 +x02 $* +x02 { +$! x02 +x01 } ^v +x01 t ] +x01 ] t +x01 $q +x01 p1 x36 +x01 o5 +x01 o4t +x01 o2w +x01 o2m +x01 o1g +x01 k D5 +x01 i3M +x01 i2t +x01 D5 k +x01 $d *46 +x01 c T1 +x01 *46 $d +x01 [ +} x01 +$X $! +$x ^@ +$* $x +$! $x +^x $+ +^. ^x +$w Z4 +$W Z3 +^W z2 i3. +$W Z2 +0 +$w $y ^3 +^W y2 +$w $y +$w ^y +$W x31 +$W x12 +^w ^v -9 +^W ^V +$w $v +^w ^v +$w ^t t +$w $t +$w srY +^w ^P +$w } ^p +$w ^p +^w o4i +^w o3w +$w o3o +^W o3@ +^w o2f +$W $o +$w ^m +^w L7 +$w L5 +^w L0 +^W ^L +^w K +$w ^k +$w $j .4 +$W i8M +$W i8D +$w i6b +$w i5s +$w i3t +$W i39 +^w i26 +^W i1V +^w i1n +^w i1m +^w i0r +$w i0n +^w i0a +$w ^f p4 +^W ^F +$w d x02 +^w d +^w ^C +^w *87 +^W ,8 +$w ^7 +^w *67 x41 +^w +6 +^w -6 +$w .4 $j +^w *43 +$w ^3 $y +^W ,2 +^W -2 +$W +1 +$W +0 Z2 +$W *02 +^w *01 ^f +$w { +$% ^w +$. $w +$V Z4 +^V Z3 ^J +^v Z2 y1 +$v Z2 -6 +$v ^z +$v Y2 +^v y1 Z2 +^v x71 +$v x31 +$v x01 +^v $v k +^V $V +] $v ^v +] ^v $v +^V s9v +$V ^s +$v $s +^V p3 +^v ^P +$v o98 +^v o8. +$v o7v +^v o4k +$v o3w +^v o3j -3 +^v o2c +^v o1u +$v o1i +^v o11 +$v $m +^v k $v +^V ^k { +$v $k +^V ^J Z3 +^v i5k +$V i45 +^v i44 +$v i3z +$v i2f +^V i1s +^V i1K +^v i1k +^v i1b +^V i1a +$V $I +^v $b +$V $a +^v *61 x13 +$v ^5 +^v +5 +^v ,2 p3 +$V +{ $v +] $v +^v $, +^v ] +^. ^v +u [ z4 +$u z3 Y4 +u Z2 i41 +u Z2 *06 +u Z1 ^D +u y5 $i +u Y5 ,8 +[ u Y5 +$u Y4 z3 +u y4 x52 +u y4 ] +u ] y4 +u y2 D4 +u Y2 [ +u [ Y2 +$u ^y +u xB1 oAA +u x91 +8 +u x53 +u x51 $O +u x51 'B +u x43 z2 +$* u x42 +u x41 $5 +} ^u x41 +^u x31 +u x21 i1N +[ u x14 +$U $V +^U $u +$u u +u T3 L4 +u ^T +$u $t +u sSZ +u sRL +u sKC +u sE3 +u sDT +u R5 t +^u ^r +u p2 x6A +u p1 xB5 +u p1 x62 +u p1 x43 +u p1 -8 +u $o Z1 +u $O x51 +$u oB@ o92 +u oB3 +] u oAU +u oAA xB1 +^u o9y +u o9N +$u o92 oB@ +u o8S +u o7J +u o6G +u o6E +u o5U +^u o5j +u o45 +u o3H +^u o34 +^U o2i +u o2B +^U o1W +^u o1_ +u o0Z +u o0p +$u o06 +$u $n +[ u $M +u L4 T3 +u k +0 +^u ^K +u $k [ +u [ $k +$u ^k +u $J +u $i y5 +u iBZ +u iBN +u iAA Z1 +u i8P +u i8O +u i8K +u i61 +u i5M +$u i5a +^u i4t +u i4H +u i4A +u i41 Z2 +u i3N +] u i3K +^u i21 +u i1W +^u i1p +u i1J +u i1f +^U i1! +] $u i0w +^U i0R +^u i0H +u i0* +^U $I +u f x69 +u f D7 +u $F +^U ^E +u ^D Z1 +u d xA1 +u d x86 +u d x03 +u d $O +u d ^L +u d *A5 +u D4 +5 +^u D3 +u D1 y5 +u $d +^u ^d +u ^B y5 +^u ^B +u '9 Y3 +u +8 x91 +u +8 d +u '7 Z5 +u *7A +u +7 *45 +u ,6 Z5 +u ^6 z1 +u ^6 i57 +u *63 x41 +u $5 x41 +u *45 +7 +u +4 *02 +u -4 +u $3 Y4 +u +3 *30 +u *32 p1 +u ,3 *21 +u ^2 z1 +u ,2 Y5 +u [ *20 +$u $1 +u *02 +4 +$U $* +$! ^u +} u } +} } ^u +} } u +{ u { +{ { u +] u $* +] $* u +[ u ] +[ ] u +^< u +t Z5 x64 +$ t Z4 +$t Z3 +$T Z2 z1 +t z2 *15 +$T Z2 +t ] Z2 +t z2 } +t } z2 +$T z1 Z2 +^T Z1 z1 +^T z1 Z1 +t Z1 x72 +t Z1 ^B +^T $z +t $Z [ +t [ $Z +t Y5 o67 +t y5 o44 +t y5 *09 +$* t y5 +t y4 x82 +t Y4 o8N +t Y4 $1 +t y3 $1 +t y3 ] +t ] y3 +t Y2 ^J +t y2 $8 +t Y2 ,7 +t Y2 *63 +t Y2 ,6 +t y2 .0 +^t y1 r +t y1 $2 +$t Y1 +t $x Z5 +t ^X i5X +t x72 Z1 +t x62 Y3 +t x51 d +{ t x51 +^T x43 +$t x31 +t x25 d +t x21 o0T +t x15 +^t x13 D3 +t x12 ^h +} ^T ^X +$t ^x +t $W +^t ^V +$t $u +t T3 T1 +t T1 T3 +t sU1 +t $S ^S +t ^S $S +t sRG +] t sOo +t sEY +t sEA +^t s3l +t s0) +$T ^S +t r $r +[ t R5 +[ t R4 +t ] ^R +t ^R ] +t $q Y1 +^t ^q +t p2 x52 +t p2 x4A +t p2 x2A +t oBZ +t oBI +t oAS +t o9M ] +t ] o9M +^T o96 +t o8Y D7 +^t o8t +t o72 +t o7_ +t o6S +t o6F +t o61 +t o5K +t o2R +t o1r +t o1J +t o0X +t o0T x21 +t o0N +^t o05 i5s +$t $o +t ^N -2 +^t $n +^t ^m l +^T $m *53 +$T $M +^T $m +^t l ^m +$t $l +9 +^T $l +^t ^l +t K DB +t K D5 +t K ^* +t ^* K +t ^- ^K +[ t K +$t $k +t $j Z1 +t ^J Y2 +^T $J +t ^J +t i9I +t i8D +t i7- +t i6Y +$t i6y +t i6P +^t i5s o05 +t i5R +^T i5P +t i5G +$t i4d +^T i47 +t i41 ] +t ] i41 +t i4 +^t i3w +^T i3o +t i3E +t i3. +t i2U +t i1V +t i1v +t i1G +^t i1d +t i0V d +t i0P z4 +^t i0b +t i07 z2 +^t $g D7 +$t $g +^t $e *52 +^T ^E +t d Y3 +t d y3 +t d xA8 +t d x45 +$T ^D r +t d o4U +t d $O +t DB K +^t D7 $g +t d $6 +t D5 p1 +t D5 K +t D2 $5 +t D2 +$t D2 +$T D1 +[ t D1 +^t $d +^T ^C +t ^C +t ^B Z1 +TB Y1 TA +TB TA Y1 +TB i61 +t *B9 ] +t ] *B9 +t *B8 +t 'B +6 +TB $3 +t $b +TA $9 +t *A7 ] +TA ^2 +T9 T6 +T9 o41 +$t +9 $l +T9 i51 +t '9 d +T9 'A +t $9 -7 +t *96 *78 +T9 $6 +T9 $@ +T8 z4 x07 +T8 z1 +t $8 y2 +T8 TA +T8 o72 +T8 o0$ +T8 i41 +t +8 *85 +T8 ^2 +T8 $1 Z1 +t $7 Z4 +T7 y3 +T7 Y2 Y4 +T7 y1 y3 +T7 o6& +T7 i01 +t *79 *68 +t -7 $9 +t *78 *96 +$$ T7 +^. T7 { +^! T7 +T6 Y1 +T6 x71 +T6 x01 ^W +T6 T5 $7 +T6 T5 +T6 T4 ] +T6 ] T4 +T6 s17 +T6 o7+ +T6 o11 +T6 o10 +T6 o04 +T6 i7@ +T6 i66 +t +6 'B +t *68 *79 +T6 $7 T5 +t .6 +5 +T6 ^3 +T6 $$ +$T $6 +$@ T6 +^T -6 +$t $6 +T5 $@ Z1 +T5 Y4 x63 +T5 Y1 { +T5 x63 Y4 +T5 x13 } +T5 ss_ +$$ T5 p5 +T5 o0Z +T5 o0T +T5 i7% +T5 i6! +T5 i5$ D4 +T5 i4r +T5 ^F +T5 D9 +t $5 D2 +T5 'A +T5 $9 +t +5 .6 +T5 $4 +t -5 .4 +^T *53 $m +$t *53 +^t *52 $e +^# T5 +T4 T1 $$ +T4 $$ T1 +T4 t { +T4 { t +T4 sNT +T4 sBp +T4 sa4 +T4 o93 +T4 o7* +T4 o5@ +T4 o2y K +T4 o0p +T4 o0# +T4 o0$ +T4 L6 K +T4 K o2y +T4 i60 +T4 i5E +T4 ^G +T4 $a +T4 $7 +T4 +5 { +T4 ^2 +T4 $% +T4 ^! +^. T4 +t ,4 +t -4 +T3 T4 s57 +T3 T4 *78 +T3 s57 T4 +T3 o5M +T3 o4F +T3 o03 +[ T3 i04 +T3 $e +[ T3 ^D +T3 ^B +T3 +9 +T3 $9 +T3 *78 T4 +^t *34 .2 +t *34 -0 +t +3 ,2 +T3 $% +T3 ^@ +$? T3 +t ,3 +$t ,3 +T2 Y1 +t $2 y1 +T2 T5 -6 +T2 smM +T2 s1! p3 +T2 s1N +T2 p3 s1! +T2 ^P +T2 o63 +T2 o5A +T2 o42 +T2 o0A +T2 ^M +t $2 i61 +T2 i5@ +T2 } ^H +T2 'A +T2 ^A +T2 $9 +T2 -6 T5 +t ,2 +3 +t *20 y5 +T2 $! +T2 $- +T2 $_ +] T2 +t -2 +T1 $. Z2 +$. T1 Z2 +T1 y4 +t $1 y3 +T1 $@ Y1 +t +1 y1 +T1 sa4 +T1 s38 +T1 q Y1 +T1 o9o +T1 o7k +T1 o5! +T1 o3B +T1 o3a k +T1 o0) +T1 k o3a +T1 i7& +T1 i60 +T1 i5+ +T1 $9 +^T *16 +T1 *43 +T1 $3 +T1 $1 +T1 ^@ +T1 ^. { +$T $1 +$/ T1 +$? T1 +$t ^1 +t ^0 z4 +T0 Z2 x24 +T0 Y4 x32 +T0 x51 $6 +T0 x51 ^4 +T0 x32 Y4 +T0 x24 Z2 +T0 t d +T0 T1 K +T0 s 6 $6 +T0 r *82 +T0 } r +T0 oB. +T0 oAa +T0 oA5 +T0 o9L +T0 o6Q +T0 o2y +T0 o11 +T0 $L +T0 K T1 +T0 ^J ^C +T0 i82 +T0 i7( +T0 i4S +T0 i42 +T0 i3k +T0 i2t +T0 d t +T0 ^7 +T0 $6 x51 +T0 $6 s 6 +T0 *58 *56 +T0 *45 ^1 +t -0 *34 +^t *03 +T0 ^1 +T0 $' +$* ^T +^T $$ +^@ ^T +^T +$t $* +$t [ +$- t [ +$- [ t +$- t +$ t +} $t +[ t $- +[ $- t +[ ^t +^t ] } +^* $t +^. ^t +sZ* t ] +sZ* ] t +sZ7 +5 +$s Z4 +^s z3 +^s Z2 ^a +^s z1 $s +^s ^Y u +syR u +syr u +sym C +syd $* +^s Y3 D5 +$s Y2 ^t +$s y2 +$s Y1 +4 +^S ^Y +sxz +$s x73 +^s x52 +$S x43 +^s x32 +^s x31 +^s $x +swq +swh $@ +$/ s/w +svb t +svb +^s u ^Y +suw r -5 +sU- t +suk +4 +sue -0 +$S u ^C +$S u $4 +$s ^u *01 +^s $u +stz $! +sty C +$s ^t Y2 +sty +stw u +sTs x31 +sTL ,5 +stl +0 +stg $$ +std +sta i8n +^S t .3 +ssz $f +^s $s z1 +ss, y4 x81 +ssu +3 +ssS T3 +sSr -5 +ssn i59 +ssn +ssj y2 +ssj *03 +sSi ^c +ssG y2 p4 +sSf Y3 +sSC T3 +ssb *71 +ss8 x92 $9 +ss8 $9 x92 +ss5 $n +ss5 +^S $S +sr, Y1 l +sR* x42 t +sR* t x42 +$s r ^q +srm +3 +$$ srM +sr, l Y1 +srg i1r +srg *12 +sR* E +sre +srd $1 +srd +srb +sra ,8 +sQD +$s $P Z1 +[ spZ { +[ { spZ +spP ^1 +$% sPL +^% s%p i5c +sPG +3 +sPF +$s p5 $l +so) Y1 +soO t +so. o5x +soO $1 +so@ o0W +soj { +soe u $S +soe $S u +soe r +soe E +soa +^S o7c +$s o7b +so6 E +$s o54 +^s o4h +$s o3y +$s o3h +^s o2i +^s o1t +^s o1r +^S o1E +so0 R1 +so0 o63 +$s o00 +^S $o +sny r p5 +sny p5 r +snw -0 +snu Y3 +sns $A +snl $6 +snk i6s +snI Z1 +snH x65 +snh -2 +snf $1 +sna +$S ^N } +$* sn+ +smz +smx *73 +smW C $1 +smW $1 C +smV x41 +sMt -6 +sMp $^ +smL +sMJ '6 +smJ +s_m iA Y1 +$! smg +smF u +smf +smb z2 +] smb +smb +sma +sm1 z2 +sm? .1 +^S ^M +sM- +slw +slv ] +sl| T5 +sls K +slr t +slr +slq .A +slp +7 +slm o6t +slL T0 +sl[ K +slj o70 +slg t +slf t +^s L8 +sl7 i57 +sl1 ^W +sl? .0 +skp +5 +$! sko +sk; +$s $k +sJw i5 Y2 +sJW +sjc +sja *60 +sJ1 ^v +siz x42 +siy t +siy o42 +siy C +siy $5 +siy +2 +sig +sie $ +B +sie $ +sic -7 +sia +^s i6g +^S i5O +^s i5n +^s i5h +^s i5g +$s i55 +^S i4e +$s i44 +si4 +$S i3o +^S i3G +$S i3a +^s i34 +^s i2j +^S i2_ +^s i2- +^S i1U +si1 TB +^S i1o +^s i1o +^S i1i +si1 c +^s i1c +^s i19 +si1 +7 +si1 $# +$S i0W +^S i0W +^S i0T +$s i0S +^s ^i +sHT x61 +shp $k *73 +shM x42 +shk u +sHf .2 +$S $H +^s ^H +^ sgw +sgv +sgs +sGR -7 +sgq +7 +sgl t +sgl D1 +sgl +sgj +sgc u +sg. -0 +sfH x13 +sfc +sfa u +sF7 z1 +sF* +sf* +sf@ +s- f +$s $f +sex x52 +seu *02 +sET p2 +ses *20 +seR T2 +seq +sep ,5 +sel $1 +sei x82 +s/e i6l +se@ D0 +sec Z1 +se( c +sec +se4 +1 +se3 x61 c +se3 c x61 +se3 C +$s E ,2 +se1 *34 +se# .1 +^s $E +se- +se +sdz E +$S $D Z2 +sdz +sd_ Y3 +sd- u +$@ sdt +sds +3 +s.d s0 *54 +sdr ] +sdK y2 +sdj -8 +sdj +sdh *20 +s!d $b +} sd4 +$S $D +sd* { +scv y5 E +scv +$S ^C u +scN Y4 c +scN c Y4 +sck u +sCJ x51 +scC +sc( +s?! c +sbw ] +sbr +sbn p2 +sBl *31 +sB@ i6S +sbh +$S $B c +sbB L4 +sb2 *86 +^s ^a Z2 +say } +sa^ x31 +sav *47 +sau x32 +sau $3 +saq *74 +sap +sa@ o9i +saN u +sAK +sah D5 +saf Y2 +sab +sa4 p1 +sa4 C +sa4 ] +sa2 +sa^ -0 +$S $A +sa+ +[ sa, ] +[ ] sa, +s9- ^n +s9b *45 +s96 $L +s90 +0 +s90 $! +s9* $! +s9. $/ +[ s9! +s8+ x02 p4 +s8h p1 T0 +s7? Z4 +s7r $@ +s7P i3p +s7j l +s7f *52 +s7! $9 +^s *76 +s76 +s75 u +^s *75 +s7/ +s7_ +^s ,7 +s6w i3s +s6. o3, +s6O -2 +s6H x73 +s6C $A +^s *6A *58 +s6% +9 +s68 +$. s63 +s6. -2 +s61 +s6` +s5v Y1 +s5f p1 c +s5D D6 +s5a '8 +s59 +^s *58 *6A +s/% *58 +s57 $! +s56 Y1 ^a +s56 ^a Y1 +$- s53 +s53 +s52 -5 +^s *50 +s50 +s5# +$s +5 +[ s5! +$s +4 Y1 +s4. ^w +$S $4 u +s4f +s4A y2 +s4@ +6 +^s *45 +s4= $3 +s42 *32 +s4. ^, +s3z +s3. ^v +^S .3 t +s3H Z1 +s3. d +s38 +{ ^s *37 +s36 u +s34 +s30 *02 +s3. $@ +$- s3_ +$- s-3 +^% s3% +s2@ Y3 +s2. Y2 p3 +s2* t { +s2* { t +s2s z1 +s2f } +$s ,2 E +s2! C +s2A ] +$! s29 +s28 +^s *27 +$s *26 $1 +s26 $* +s26 +s25 -6 +s23 p3 'A +s2$ $3 +^S -2 +s2% $% +s2! } +s.2 +$$ s2) +s1 z1 +s1- y4 +s1? Y2 +s1/ } y1 +s1W T3 +s1% T1 +s1P d T5 +s1N T2 +s!1 l +s1 K +s1i s0o +s1! i6@ +s1. i43 +s1A *54 +s18 *40 +s1) -8 +s1; $8 +s17 Z4 +s15 +s14 -7 +s14 $4 +$s $1 *26 +s1% *24 +s1) ^( +s1, +[ s.1 +s0. Y2 +s0s l +s0_ $R +s0q ,1 +s0l o5K +s0l K +s0h $b +s0g Z2 +s0f *31 +s0- D8 Y2 +s0c r Y1 +s0a p4 +s0% *68 +s05 +$& s03 Z1 +s03 T3 +s03 E +s03 +s0 +s0= +s*# -0 +[ s0. +$S $! +$? ^S +$- $S +$- ^S +} ^S +^_ ^S +s*_ ^_ +s$. +s.* +s._ +s!@ +s-* +s- ] +s_- +s ( $) +s ? +s=- +$+ ^s +$@ s . +$> ^s +] ^s +^s $? +^$ ^s +^@ ^s +^_ $s +r $Z p3 +$r Z3 +r z2 x51 +^r z1 l +$r Z1 +r $y x74 +r y5 iAB +r Y5 E +r y5 E +r Y5 c +$r y5 +r Y4 ^n +r y4 $k +^r y4 +r y3 t +$r Y3 p3 +r Y3 ^c +r y3 +r y2 ,9 +r y2 ,4 +$r Y2 +^R y1 l +r Y1 ^G +r Y1 *91 +^R x82 +r $! x82 +^r x72 +[ r x51 +$r x41 +r x32 $j +r x31 p2 +r x28 t +r x27 u +r x12 d +^r x12 +r ^x +] r ^w +r u x27 +^R ^U +$R u +r u ] +r ] u +r t y3 +r t x28 +r { T8 +^r s1. +r R5 *34 +$r $R +^r ^R +r $q -3 +$? r q +$ r q +^r ^q +r p2 x09 +$r p2 $t +r p2 $q +r p1 c +r p1 ,9 +r ] ^p +r ^p ] +r o9i +^r o8y +$r o8b +^r o8@ +r o7z +$R o6Q +r o6f +r o4 E +r o4a +r o42 +r o3k +r o3h +r o35 +r o32 +r o2q +r o14 +r o0v +r o0K +r ^n Y4 +^r ^n L2 +^r $m +^r l z1 +^R l y1 +r } L0 +^R l } +^R } l +r l ^! +r ^! l +r $k y4 +r ^k y1 +$r k i43 +r K *14 +r ] ^k +r ^k ] +^r $k +r $j x32 +r $_ $j +r ^j +$r ^j +r ^i y1 +^r ^i ^p +r i6r +$r i5m +^r i5j +$r i5h +$r i5G +} ^r i4q +$r i43 k +r i3n +r i3g +^R i3B +r i2i r +^r i2i +r i2f +^R i1U +r i1r +$r i1f +^R i0T +$r i0S +r i0r x12 +^R i0I +^R i0B +$r i06 +$- $r i04 +$r i0@ +$r $i +^r ^H +$r ^h +r ^G Y1 +^r ^g +r f x36 +^R $f +r d x05 +r d T2 +r D7 +r ^c Y3 +r ^c y1 +RB Y1 +r ^B i2S +RA .9 +R9 'A +R9 $3 +R8 R8 ] +R8 ] R8 +$[ R8 $q +r '8 f +R8 $! +^r +8 +R7 Z3 +R7 Y1 C +R7 x43 t +R7 t x43 +R7 T0 R7 +R7 se3 +R7 R7 T0 +R7 o6@ +R7 E $2 +R7 C Y1 +r -7 +6 +R7 $2 E +R6 x23 t +R6 t x23 +R6 sa1 +R6 R6 ] +R6 ] R6 +R6 K Y2 +R6 ,7 +r +6 -7 +R6 $5 +r *64 +R6 +3 +[ R6 +r $6 +R5 y3 t +r ,5 y1 +R5 t y3 +R5 t D6 +R5 t ] +R5 ] t +[ R5 t +R5 R5 D4 +R5 i60 +R5 D7 .4 +R5 D6 t +r *57 i4b +r *57 +R5 .4 D7 +R5 .4 +r *53 *42 +r *53 +R5 *14 ] +R5 ] *14 +r $5 +^r ^5 +$. R4 Z2 +R4 Y2 E +r .4 x52 +R4 u +R4 t +{ R4 t +[ R4 t +R4 R4 ] +R4 ] R4 +R4 R3 *20 +R4 $n +R4 i6i +R4 i5x .3 +R4 i45 +R4 E Y2 +r *47 +R4 $5 +R4 '5 +R4 *42 +R4 .3 i5x +R4 +3 +[ r *43 +r *42 *53 +R4 *20 R3 +r *40 +R4 $. +R4 $! +r $. ^4 +r ^4 $. +$r ^4 +R3 u +R3 t -1 +R3 soe +R3 r *02 +r -3 $q +R3 i42 +R3 i32 +R3 i3@ +R3 d x62 +r *37 +^r *35 +r *34 R5 +r *34 [ +R3 .2 +R3 -1 t +R3 +0 *05 +R2 y2 t +R2 $x *35 +R2 t y2 +r *26 ,7 +R2 *35 $x +$R *23 +r *21 *05 +^r *20 +R1 z3 t +R1 u +R1 t z3 +R1 o35 E +R1 i2f +R1 E o35 +r *14 K +R1 *41 +$R $1 +r $1 +R0 Y2 { +R0 y1 C +R0 x32 *15 +R0 x1B +R0 o45 +R0 { ^k +R0 i03 +R0 ^i +R0 C y1 +r *05 *21 +R0 ^0 i2m +} r +0 +$@ $R +r ] { +r ] ^\ +r ] ^$ +r ^\ ] +r ^$ ] +$r $* +$r $. +$@ ^r +} r { +^r $+ +$Q Z5 y1 +^q z5 x18 +$q Z5 +$q Z4 t +^q z1 Y1 +$q Z1 i04 +$Q Z1 *34 +q Y4 x12 +q y3 x67 +q y3 x57 +$Q y1 Z5 +^q Y1 z1 +q Y1 y1 +q y1 Y1 +$Q Y1 [ +$Q [ Y1 +q x87 c +q x87 $1 +q x83 o8. +q x72 +q x6A *40 +q x52 +q x38 $v +q x35 y3 +^q x34 +q x26 z5 +q x26 C +q x23 -1 +q x21 l +q x1A d +q x16 +3 +q x15 +] q x15 +q x12 Y4 +q x12 +$q x12 +q x01 k +^q ^x +^q $W +q $v x38 +q u +$q t Z4 +^q t i1Q +q TB +$[ $q R8 +$? q r +$ q r +$q q x14 +^Q ^q i68 +$Q ^q +^Q q ] +{ q $Q +$q $p +^q ^p +^q o45 +$q o3g +^Q o1E +$q o0x +$q o0d i0q +$q $m +^q $m +^q ^m +q l x21 +^q L0 +$q $j +$q i5b +$q i3r +^q i3c +^q i3 +^Q i1S +^q i13 +^Q i0Z +$Q i0Q +^Q i0K +^Q i0E +^q i0A +$q i04 Z1 +$q ^f +^q D5 r +$q D4 -5 +^Q D4 +^q D3 +$q D1 +$q D0 +q c x87 +q C x26 +$Q c ^A +q C +} q *B0 +q .B [ +q ^A +q '8 z5 +^q +7 +$q +6 +$q *47 +q *40 x6A +$Q *34 Z1 +^q *34 y3 +$q *34 *32 +$Q ,3 +q ] $3 +$q ^3 +q *24 *13 +q *20 +q $1 x87 +q -1 x23 +q *13 *24 +$@ $q *06 +^q $0 +$@ $Q +[ $Q +q ] +$q $@ +$q $! +$q $, +$* $q +} $q +[ q $. +^q { ^/ +^_ q +^= $q +^q +$p Y3 +$p Y1 D1 +^p Y1 +$p ^y +$P x23 +^p x14 +^P x13 +$P u +^p ^U +^P T4 +$P ^S +^p R1 ] +^p ] R1 +^p R1 +$p $r +^P $P +^P o5p +$p o2x +^P o1w +^p o1w +^p o1j +^P o1i +^P o1- +^P ^N +^P L1 +^p ^K +$p ^j +^p i6t +^P i4q +^p i3l +$p i3g +$p i38 +^P i2o +^p i1w +^p i1P +^p i0R +$P ^G +$p $g +$p $f +^p ^f +$p d c +$p D1 Y1 +$p ^d +$P c +6 +$P c +^p ^b +^p $A +4 +$p ^a +^p *71 +$P +6 c +p5 Z1 o7/ +p5 Y4 o0H +p5 y2 o2r +p5 xB9 ] +p5 ] xB9 +p5 x85 *12 +p5 x5A ,B +p5 $S +p5 ^Q z3 +p5 o7/ Z1 +p5 o6b -7 +p5 o29 *05 +p5 o0H Y4 +p5 i6f $@ +p5 $@ i6f +p5 i44 ] +p5 ] i44 +p5 'B Y3 +p5 'B y3 +p5 'B +p5 *96 ,8 +p5 ,8 *96 +p5 -7 o6b +p5 *78 -8 +p5 *68 $0 +p5 *14 r +p5 *12 x85 +p5 $0 *68 +p5 *05 o29 +p5 +0 +p4 z5 } +p4 } z5 +p4 z1 +A +p4 y4 $m +{ p4 y1 +p4 T2 $7 +p4 o83 o1@ +p4 o5x *12 +[ p4 o3x +p4 o36 -6 +p4 o2n o1a +p4 o2c i32 +p4 o1@ o83 +p4 o1a o2n +p4 o1- +p4 o0@ D5 +p4 $n +p4 $m y4 +p4 $L ^l +p4 ^l $L +p4 $j $m +p4 i5x *43 +p4 i52 [ +p4 i4m $. +p4 $. i4m +p4 i32 o2c +p4 D5 o0@ +p4 ^c -2 +p4 'B y3 +p4 ^A o1T +^p +4 $A +[ p4 ^a +p4 ,8 ,7 +p4 $7 T2 +p4 -6 o36 +p4 ^4 T4 +p4 $4 $B +p4 *43 i5x +p4 *20 ^T +p4 *12 o5x +^? $! p4 +p3 $z [ +p3 [ $z +p3 Y3 +p3 Y2 x9A +[ p3 xA7 +p3 x9B u +p3 x9B t +p3 x9A Y2 +p3 x6B u +p3 x69 x04 +p3 x61 -0 +p3 x49 u +p3 x2A +p3 } x08 +p3 x01 $a +p3 ] ^x +p3 ^x ] +p3 $v [ +p3 [ $v +p3 u x9B +p3 u x6B +p3 u x49 +p3 t x9B +p3 $q [ +p3 [ $q +p3 o5e k +p3 o54 *17 +p3 o0M '9 +} p3 l +p3 k o5e +p3 K ^6 +p3 ^j $0 +p3 i6t $1 +p3 i43 r +p3 i0h $/ +p3 $/ i0h +p3 $D $l +p3 D3 i7t +p3 'B Y3 +p3 ^b ^R +p3 $a x01 +p3 '9 o0M +p3 ^6 K +p3 *53 *14 +p3 ,1 r +p3 $1 i6t +p3 *17 o54 +p3 *14 *53 +p3 -0 x61 +p3 $0 ^j +p3 *02 R0 +p3 *02 r +p3 { +^p $3 +p2 Z3 x06 +p2 Y2 xA4 +p2 Y2 x84 +p2 Y1 x05 +p2 xB5 u +p2 xA8 ] +p2 ] xA8 +p2 xA4 Y2 +p2 x9B C +p2 x94 t +p2 x86 u +p2 x84 Y2 +p2 x7B C +p2 x75 ] +p2 ] x75 +p2 x65 u +p2 x5A t +p2 x59 u +p2 x4A t +p2 x46 u +p2 x3B p2 +p2 [ x1B +p2 x17 o0d +p2 x0B t +p2 x0B d +p2 x0B +4 +p2 x06 Z3 +p2 x06 u +p2 x05 Y1 +p2 u xB5 +p2 u x86 +p2 u x65 +p2 u x59 +p2 u x46 +p2 u x06 +p2 u i6K +p2 t x94 +p2 t x5A +p2 t x4A +p2 t x0B +p2 t 'B +p2 T8 '9 +p2 t +p2 sET +p2 s-. ] +p2 ] s-. +p2 $r Z1 +p2 ^q { +p2 o0d x17 +p2 $l Z2 +} p2 $k +p2 $j +p2 i9g x53 +p2 i6K u +p2 ^E o2o +p2 $d +p2 C x9B +p2 C x7B +p2 'B t +p2 'B +p2 -B +{ p2 'B +p2 'A *74 +p2 '9 T8 +p2 *9A i8- +p2 *89 $@ +p2 $@ *89 +p2 *74 'A +] p2 $2 +^P *21 +p2 $ $0 +$+ p2 { +$+ { p2 +$/ p2 ] +$! p1 Z4 +p1 Z2 $0 +$) p1 Z1 +p1 $y Z1 +p1 y4 x74 +p1 y3 x63 +p1 y2 u +p1 Y2 +p1 $X L8 +p1 xB2 o6a +p1 xA4 u +p1 x93 +p1 x79 t +p1 x69 +p1 x68 ] +p1 ] x68 +p1 x65 ] +p1 ] x65 +p1 x65 +p1 x62 u +p1 x56 s29 +p1 x51 ] +p1 ] x51 +p1 x47 +p1 x35 t +p1 x14 +p1 x12 t +p1 x08 *58 +p1 x04 p1 +p1 x04 d +p1 x03 x53 +p1 ] $X +p1 u y2 +p1 u xA4 +p1 u x62 +p1 u o72 +p1 u i6F +p1 u +9 +p1 u *67 +p1 u -5 +p1 u -4 +p1 u $2 +p1 u *07 +p1 u -0 +p1 u [ +p1 [ u +p1 t x79 +p1 t x35 +p1 t x12 +p1 t ^R +p1 t i70 +p1 t i58 +p1 t i31 +p1 $T i0t +p1 t D4 +p1 t 'B +p1 t *76 +[ p1 T6 +p1 t *40 +p1 t $2 +p1 t ^$ +p1 ^$ t +p1 $s u +p1 se8 c +p1 s29 x56 +p1 s1z +p1 $S +p1 oBs +p1 oA9 +p1 oA5 +p1 o8a E +p1 o8, +p1 o72 u +p1 o7_ +p1 o6n +p1 o6 c +p1 o6a xB2 +p1 o6@ [ +p1 o5R x05 +p1 o5= +p1 o06 +p1 $M +p1 l *63 +p1 l +p1 K +7 +p1 K .7 +p1 K +6 +p1 ^i ^M +p1 iBK +p1 iA, +p1 i8p t +p1 i7f +p1 i7C +p1 i70 t +p1 i6F u +p1 i6E l +p1 i58 t +p1 i31 t +p1 i1j '9 +p1 i0t $T +p1 i0b +p1 E o8a +p1 d x82 +p1 DA ] +p1 ] DA +p1 D7 [ +p1 D4 t +p1 C x0A +p1 c se8 +p1 c 'B +p1 C $8 +p1 C -0 +p1 'B y3 +p1 'B t +p1 'B c +p1 *B8 *96 +p1 *B4 +p1 'A *75 +p1 'A *72 +p1 { +A +p1 +9 u +p1 *96 *B8 +p1 *94 +p1 -9 +p1 ,8 x62 +p1 $8 C +p1 -7 x03 +p1 +7 K +p1 .7 K +p1 *76 t +p1 *75 'A +p1 *74 x57 +p1 *72 'A +p1 +6 K +p1 *67 u +p1 .6 -5 +p1 *63 l +p1 -5 u +p1 -5 .6 +p1 -4 u +p1 *40 t +p1 $2 u +p1 $2 t +^p *12 ^e +p1 *23 +p1 +1 [ +p1 -0 u +p1 -0 C +p1 *07 u +p1 -0 +$p *10 +p1 $+ +^p $1 +$p *01 +$p +0 +$# ^P +$$ ^P +^@ ^P +^. ^P +$? ^p +} $p +^p $! +^p } +^_ ^p +$o Z3 +^o Z1 ,3 +$o $y y2 +^O y3 +$o y2 $y +$o Y1 +^o x32 +^o ^x +^o T1 ^g +$o t $0 +] $o t +^O ^s ssP +$o s1h +^o q x3A +$o o4< +^O o3j +^o o1b +^O o0E ^9 +$O ^o +$o k { +^o ^k +$o i8) x45 +$O i5x +$o i3r +^o i3_ +^o i1y +^o i1O +^O i1h +$o $i +^o ^F +^O d E +^o D2 +^o ^d +$O C +^O ^C +oBy t +oBu t +] oBl +oBi -A +oB* E +oBe +oB8 x83 +oB8 x81 +$@ oB8 +^O ^B *67 +oB5 E +oB4 o0@ +oB3 +6 +oB= +$- oB_ +oAy p3 $1 +oAw +8 +oAW +] oAU u +oAt t +oAs Z1 +oAs iAi +oAS E +oAS -9 p2 +oAp +9 p2 +oA? o9 ,7 +oAo +oAl E +oAj oBb +oAj +oAh ] +oAg +oAd x45 +oAd *A8 +oA@ D9 +oA! c } +oAc +oAa x41 +oA9 DB +oA9 -9 +oA8 Z1 +$. oA8 +oA8 +oA7 $5 +$! oA7 +oA6 K +oA6 +9 +oA $6 +oA4 Y1 +oA4 x21 +oA4 +3 +oA4 $! +^% oA3 +oA1 K C +oA1 E +oA1 D5 +oA1 C K +oA_ $1 +$@ oA1 +oA0 C +^O ^A +oA% +oA. +] oA. +^o ^a +o9! Z1 +o9z +o9y o8y +o9x ^X +o9. x71 +o9# x62 +o9w +o9V x71 l +o9V l x71 +o9U u +o9U +o9t *96 +o9t ] +o9t +o9( s2) +o9r x52 +o9r t +o9p -8 +o9p +o9o o0s +o9o .8 +o9. o0, +} o9o +o9o +o9N t +o9m x72 +o9. k +] o9k +o9I c +o9i $2 +o9g *79 +o9f +o9e $E +o9% E +o9 E +o9. D5 +o9@ D1 +o9c x61 +o9b +o9a *85 +o99 y2 +o9% *96 +$! o99 +o9- .8 +$_ o98 +$& o97 +^# o95 +o94 i9_ +o9. -4 +o93 i9 x97 +o93 i9 +o93 ^% +o9% $3 +o9. -3 +o91 o60 +o91 i9+ +o91 i8 +o91 $D +o9. *18 +^! o91 +o90 +7 +$# o90 +$! o90 +o9& +o9? +o9 +} o9. +o8. z1 +o8X $D +o8* x43 +o8- x07 +o8W Z2 E +o8W E Z2 +o8u Y3 +o8U i29 +o8u $3 +o8t 'B +o8t +A p3 +o8% T1 +o8s o5n +o8s K +o8s $b +o8@ s@. ^2 +o8q Z1 *67 +o8q x52 R4 +o8q R4 x52 +o8q *67 Z1 +o8| ^P +o8P +o8o t +o8O $2 +o8n +o8m $l +o8m *68 +o8m $@ +] o8l +o8k x52 +o8k t $1 +] o8k t +o8k D6 +o8k 'B +o8k $1 t +o8j [ +$@ o8j +o8i o6d +o8I c +o8! i1i +o8h x32 +o8H u +o8g $o +o8f x94 +o8f K +o8D +] o8d +o8c Y3 +o8b +7 +o8a Y2 +o8A o0o +o8 +A +o8a +o8 -9 +$! o89 +o88 Y2 +o88 T4 +o88 +6 +o8_ $8 +o87 ^s +o87 i3P +o8@ .7 +$@ o87 +o8@ *61 +o8. ,6 +o8. -6 +o85 $w +o85 *97 +o85 ^# +$/ o85 +o8@ $4 +$! o84 +o83 o7v +o83 +o8@ ^2 s@. +o82 +4 +o82 +o81 T5 +o81 i7x sx_ +o81 +6 +o81 $5 -5 +o81 -5 $5 +o81 $= +o81 [ +o8/ $1 +$# o81 +} o81 +o80 ^s +$? o80 +$= o80 +o8& +o8! ^` +o8, +o8_ +o8= +o8^ $& +o7z ^i +o7z $7 +o7z *32 +o7 Z3 +o7z +3 +] o7z +o7y ^y *70 +o7y ^r +o7Y c +o7x o9. +o7x o6- +o7x *64 +o7x ^3 +o7w Y2 +o7W o8A +o7w *52 +o7w *13 +] o7w +o7v *45 +{ o7v +o7U o6G +o7u $A +o7t ,8 +o7t { *61 +o7t -5 +o7t *14 +o7? T0 +o7s o6b +o7s *23 +o7S $2 +] o7s +o7r x01 +] o7r t +o7q r +o7q ^q +o7q *61 +o7q *37 +o7q *25 +o7p $w +o7p u +o7p $i +o7p c +o7O y4 t +o7O t y4 +o7@ o1@ +o7- o0- +o7n 'B +o7n +9 +o7n *30 +o7m Z1 u +o7m u Z1 +o7m o8j +o7m *64 +o7l o0p +o7l i04 +o7k o08 +o7k $2 +o7_ K +$! o7K +o7j o2g +o7J $L +o7j +3 *37 +o7I Z2 +o7i $k +o7i D6 $1 +o7I ^B +o7i -8 +o7# i7@ +o7* i4* +o7i $1 D6 +o7_ i0( +] o7i +o7H Y1 +o7- ^h x14 +o7h o4k +o7h *75 +o7g *14 +o7f r +o7f o2x +o7f *46 +o7f *27 +o7F +o7e $z +o7e *61 +o7d Y5 x56 +o7, D6 +o7d *14 +o7D +0 +o7c Y2 $1 +o7c o0C +o7c *76 +o7c *52 +o7c -0 +] o7c +o7b x15 +o7b $a +o7a Z3 +o7a R4 +o7a K +o7a $1 $4 +o79 D6 +o78 $ ^z +$- o78 +o77 o4F +o77 o2h *12 +o77 i64 +o77 D6 +o7. $7 -9 +o77 -6 +o7@ *75 +o77 *20 +o76 u +o76 E +o7. *65 +o76 $% +o7/ .6 +} o76 +{ o75 *65 +o7* *56 +o75 $1 [ +o75 [ $1 +o74 o2m +o74 +6 +o74 $+ +o7. .4 +[ o74 +o73 T3 +$! o73 p2 +o73 o68 *53 +o73 -6 +o73 *56 +o73 *53 o68 +o72 o61 +o72 d +o72 $. +o7, $2 +o71 t *76 +o71 i7+ +o71 *76 t +o7. *14 +o71 ,3 +o7@ ^1 +o70 Z5 Z2 +o70 Z2 Z5 +o70 ^t +o7. *03 +o7. $0 +o7! +0 +o7% ^% +o7$ $$ +o7' ^' +o7. +o7? $? +o7_ +o7= ] +$) o7( +$) o7| +$? o7? +^' o7_ +^! o7" +o6Z o5z +o6z K +o6z i2h +o6< Z3 ] +o6! Z1 c +o6% Z1 +o6< Z1 +o6y C +o6y c +o6@ Y3 +o6- ] Y2 +o6_ Y2 +o6 Y1 $0 +o6< Y1 +o6- y1 +o6y ] +o6x i72 +o6x D3 o3z +o6] x71 R6 +o6w $z +o6W $W +o6w p3 +o6w } +o6_ $w +o6V $l +o6u o7f +o6u $g +o6u .7 +o6u $1 +o6u -0 +o6t x51 +o6t t +o6t $9 +o6& T7 +o6# T5 +o6S ^r +o6S o0s +o6S $. +$. o6S +o6s $+ +o6s ] +o6s ^@ +o6R u +o6R i9l +o6] R6 x71 +o6p i5z +o6p i2q +o6o $x +o6o o3i +o6O i6Y +o6@ o4m +o6@ o3@ +o6@ o2! +o6, o2. +^* o6o +o6n Z2 +o6n i5w +o6n *35 +o6n $1 +o6m $t *05 +o6m $k +o6m *05 $t +o6L .7 +$! o6k $8 +o6k -7 +o6k *64 +o6k $2 +o6k $! +o6j t +o6j $. +o6i $Q +o6i o4v +o6i o3z +o6i o0c +o6i i6v +o6+ i8u +o6i *86 +o6i *57 +o6H o4R +o6G $M +o6g $k +o6g $G +o6g $3 +o6g *26 +o6f x03 +o6f o0x +o6f *52 +o6f ,3 +o6F +o6e o0t +o6e i0A +o6e *86 +$! o6E -5 +o6e *32 +o6e $_ +{ o6e +o6d o3c ] +o6d ] o3c +o6d i2k +o6D $! +o6! c Z1 +o6c ^S +o6@ C +o6b o8@ +o6b D9 +o6b ^A +o6b *17 +o6b -0 +o6a $G +o69 -7 +o69 -6 ,4 +o69 ,4 -6 +o6. -9 +o68 Y3 +$$ o68 +o67 Y4 c +o67 c Y4 +o6! $7 +o6! ,7 +$- o67 +o6) *64 +o66 *24 +o65 $D +$? o65 $d +o65 -5 +o6. ,5 +o6! .5 +o64 Y3 +o64 E +o64 *76 +o64 -5 +o64 $0 +o64 $# +$# o64 +o63 +9 +o6- *35 +o6. ^3 +o62 x31 +o62 o44 +o62 o2c +o62 K +o62 *63 +o62 *31 +o62 .3 +o62 ,1 +o62 $@ +o62 $! +o61 u -2 +o61 T4 +o61 o9S c +o61 C +o6. *14 +o61 -2 u +o61 $@ +o60 o9a +o60 d x05 +o60 .5 +o6@ *01 +^o *60 +o6% +o6# $% +o6# $# +o6& +o6/ +o6, +o6 ] +o6< ^> +$# o6# +$# o6@ +$] o6[ +$` o6` +} o6! +] o6_ +^* o6* +^@ o6! +^" o6! +^, o6_ +o5z d E +o5z +2 +o5z *06 +o5Z $$ +o5y x64 +o5y t *67 +o5y $n +o5y c +o5y *68 +o5y *67 t +o5y *23 +o5_ Y2 +o5y *12 +o5. Y1 +o5_ y1 +o5y ^# +$! o5y +o5x p1 +o5x *16 +o5w u +o5w $d +o5w *57 +$. o5w +] o5w +o5v K +o5V i6o +o5v $f +o5u ^k +o5u -8 +o5u ] +$. o5u +o5t i5o +[ o5t +o5s r -1 +o5s $r +o5@ smj +o5s ^f +o5s *50 +o5R u +o5r ^S +o5R l *35 +o5R *35 l +o5q *12 +o5q +0 +o5P $z +o5P T6 +o5p ^m +o5p *23 +o5p +2 +o5p $! +o5p ] +o5o x02 +o5o i5y +o5o 'A +o5o *65 +o5o *56 +o5^ o4U +o5# o4C +o5- o2. +o5 o1a +$# o5o +o5n $t +o5n r +o5n D3 +o5N +o5m ^1 +] o5m +o5L u +o5l '8 +o5l *13 +o5l { +o5- $l [ +o5- [ $l +$? o5l +o5k ^h +o5+ K +o5J $W +o5$ $J +o5i o3i +o5I i4b +o5i E +o5i DB c +o5i c DB +o5i c +o5i $7 +o5- i5l +o5! i0@ +o5i $* +o5h Z1 +o5h $t +o5h ^n +o5h *23 +o5g $s +o5g o3x +o5G l *50 +o5G *50 l +o5f o9l +o5f L6 +o5F K +o5f *10 +o5f $1 +} o5f +o5E u +o5e o33 +o5e o2g +o5e ^K +o5e i3K +o5D x41 +o5d x41 +o5d x01 +o5D i64 +o5; D6 +o5_ D2 +o5d *07 +o5d +o5c Z3 +o5c k +o5B T0 +o5b $d +o5b ^C +o5B *67 +o5a T0 +o5a $s +o5a o3P +o5a f x0B +o5a D3 +o5a *40 +o5a -2 +o5a *07 +o59 ^s +o59 k *15 +o59 k +o59 i57 +o59 ^d +o59 *24 x12 +o5. '9 +o58 p1 c +o58 k +o5 $8 +o57 Y2 +o57 +o56 $r +o55 u d +o55 o3Z +o55 ^j +o55 i4@ +o55 d u +o5- *54 +o5- $5 +o5_ $5 +{ o55 +o54 i51 +o54 .4 +o54 *36 +o5/ $4 +o5! .4 +o5= .4 +$! o53 y5 +o53 K +o53 .2 +o52 R6 +o52 i1z +o52 *54 +o52 *03 +o52 $@ +o5@ $2 +o5 ,2 +o51 ^Y +o51 R4 +o51 k +o51 'A +o51 .2 +o51 ] +$* o51 +o50 y5 +o50 T4 +o50 ^q +o50 ^B +o50 .4 +o50 *34 +] o50 +o5( +o5! ^" +o5_ $! +o5_ ^` +o5= +$$ o5@ +] o5. +^) { o5( +^, o5. +o4z Y2 +o4Z K c +o4Z c K +o4z *52 +o4z ,3 *43 +o4y *43 +o4y *34 +o4y *32 +o4y +2 +o4. y2 +o4X ^X +o4x r +o4X $P +o4x o3z +o4x o1l +o4. x72 +o4- x12 +$- o4x +o4w o2h +o4w o0r d +o4w *30 +o4w -2 +o4v p5 $6 +o4v k +o4V i6Z +o4v i5g +o4v -2 +o4u y3 ] +o4u ] y3 +o4u T3 +o4u o3J +o4| $U +o4u $* +o4! $u +o4t o6b +o4t o1d +o4T D5 +o4t *41 +o4T +3 +o4* T1 +o4S T6 +o4s o6c p3 +o4s c +o4s +7 ] +o4s ] +7 +o4s +5 +o4s *12 +o4S -0 +o4s [ +$@ o4s +] o4s +o4R ^0 +o4r +o4q D5 +o4p r +o4p ^P +o4p o91 +o4p +0 +] o4o $z +o4O E ] +o4O ] E +o4o D2 +o4! o8% +o4! o1a +} o4o +o4N o5C +o4N o3G +o4N o1@ +o4n i6o +o4N i6A +o4n i4X +o4n +5 +o4n *01 +o4M z4 z2 +o4M z2 z4 +o4M o79 +o4m $A +o4m *24 +o4m -2 +o4m +1 +o4m $. +[ o4m +o4l $L +o4l $l +o4L ^I +o4k $s +o4k $3 +o4k $0 +o4# k +o4j x81 +o4j o7* +o4j c +o4i o90 +o4i o0p +o4i $k +o4i i5s +o4i i3m +o4. i66 +o4@ i1k +$, o4i +o4H Y2 +o4h Y2 +o4| $H +o4g *34 +o4g *24 +o4@ ^G +o4f Y2 +o4f i4u p5 +o4f i4- +o4f +0 +o4f { +o4e u +o4e ^1 +o4d r +o4D o5T +o4d ^J +o4d -5 +o4D $. +o4d } +o4C u +o4c i4 sk +o4c i4 +o4c +0 +o4c } +$@ o4c +o4b *24 +] o4b +o4a p2 x62 +o4a o0$ +o4A c +o49 i4@ +o49 ] +o48 T5 +o48 r +o48 o06 +o48 D1 +o48 *02 +o47 ^Y +o47 $s +o47 i42 +o47 $a +o47 $8 +o4_ *75 +o46 *32 +1 +o46 +1 *32 +o4@ +6 +o4$ *56 +o45 +3 +o44 x81 +o44 T0 +o44 t +o44 *53 +o44 *43 +o44 .3 +o44 $1 +o43 i65 +{ o4* *36 +o4- ^3 +o42 Y4 c +o42 c Y4 +o42 *56 +o4, $2 +o41 r +o41 o0g +o4- *12 +o4@ +1 +o40 $l +o40 D1 +o4. -0 +o4- $0 +o4_ ^, +o4| +$+ o4+ +$. o4* +^? o4! +o3z x43 +o3z o6c +o3z i44 +o3z *72 +^o ,3 Z1 +o3z -0 +{ o3z +^, o3z +o3y o4X +o3y o2c +o3y $D +o3y $A +o3. y4 +o3/ y4 +o3, y3 +o3y *25 +o3y *07 +o3x $u $l +o3x K +o3x k +o3x *72 +o3x +6 +o3x +4 +o3w y4 +o3w R0 +o3W o7! +o3w D0 +o3w +5 +o3w *46 +o3w $. +o3_ $w +o3v D0 +o3v d +o3v *31 +o3v $3 +o3v *13 +o3v +0 +o3u y5 +o3u x41 c +o3u c x41 +o3u *90 +o3u -7 +o3u .1 +o3* u +[ o3u +o3T Y1 +o3t x71 +o3T u +o3T o4G +o3t ^N +o3* t ^a +$$ o3t +o3s s7a +o3s o1w +o3s i4w +o3S ^f +o3- saf +o3s *41 +o3s *06 +o3S $? +o3. R4 +o3R +o3r $! +o3- r +o3q $x +o3q K +o3p y3 +o3p o2j +o3p $A +o3_ p4 o0w +o3p *42 -4 +o3p -2 +o3p $1 +o3P ] +o3o r +o3o o9$ +o3o o4t +o3o } k +o3o i3b +o3o D6 *45 +o3@ o68 +o3o *45 D6 +o3_ o2g +o3@ o1C +o3( o19 +$? o3o +o3n Y1 +o3n ^I x13 +o3n *03 +o3m o6u +o3m o2k +o3m +5 +o3M .4 +o3M *34 +o3l o0R +o3k o7d +o3K o0D +o3k C +o3k *14 +o3J y3 u +o3j x63 +o3J u y3 +o3j *28 +o3J *24 +o3J $@ +o3i o46 +o3i E +o3_ i4j +o3_ i3b +o3* i37 +o3i +2 +o3i -0 +o3h K +o3h $A +o3G o74 +o3g o2 +o3g $h +o3g -5 +[ o3g +o3f o4v +o3F D7 +o3F .6 +o3f *53 +o3f *03 +o3e i2r +o3E ^I +o3e *75 +o3e $4 +o3e *30 +[ o3e +o3d Z1 +o3D x61 +o3d o83 +o3D D5 +o3d ^A +o3@ D1 +o3d *07 +o3. $D +o3D +o3c y3 +o3c x21 +o3b o4o +o3b i2R +o3b +6 +o3b $! +o3b ] +o3a i5u +o3a D5 +o3a D4 +o3A c +o3a .7 +{ o3a +^. o3a +o39 ,5 +o3@ $9 +o3, ,7 +o37 +o36 R4 +o36 k +o36 ^f +o36 *35 p3 +o36 +2 +o36 ] +o36 +o3& *54 +o35 } +o35 ^, +o3. ^5 +o3_ ,5 +o34 y3 ,7 +o3- *46 +o34 *45 +o3- *43 +o34 $! +o3@ ^4 +o3/ ,4 +o33 R1 +o33 o47 +o3- *37 +o33 +0 +o3} +3 +$@ o33 +o32 o79 +o3/ .2 +o3- -2 +$! o32 +[ o3# .2 +o31 o2e +o31 *45 +o31 *25 +o30 o78 +o3! *07 +] o3_ *02 +o3# ^0 +o3$ $% +o3$ $# +o3. +o3 +^o +3 +^o $3 +o2z u +o2z ^l +o2z $g +o2z *62 +o2z *37 +o2z *23 +^. o2z +o2Y stv l +o2Y l stv +o2y ^i +o2, y4 +o2- y3 +o2y *24 +o2- y2 +o2y *02 +o2y +0 +o2x K +[ o2x k +o2x $C +o2x *70 +o2x *64 +o2 x63 +o2x +3 +o2x .1 +o2_ ^x +o2w o1m +o2w K +o2w $8 +o2w *70 +o2w -7 +o2w *27 +o2w *02 +o2V ^U +o2v *03 +o2u x41 E +o2u x41 +[ o2u t +o2U o4A +o2u o3J +o2u K *43 +o2u ^i +o2u E x41 +o2u *43 K +o2u [ *20 +o2t x42 +o2t T0 +o2t ^S +o2t } ^r +o2t r +o2t p1 +o2T o4R +o2T i4L +o2t ^c +o2t { +7 +o2t ^5 +o2t *45 +o2t *34 +o2t ,1 +o2T $? +$# o2T +o2T +o2t ^< +o2s x32 +o2S c *35 +o2s +9 +o2s -6 +o2S *35 c +o2s *30 +o2r ^y +o2r o0V +o2r -4 +o2r *21 +o2r $! +] o2r +o2q y3 +o2q r +o2q *41 +o2p y4 *42 +o2p r +o2p *65 +o2p $$ +o2p $? +o2o o3s +o2o 'A +o2 o6 i9= +o2 o6 +o2, o1q +o2@ o1p +o2@ o0j +o2n Y3 +o2n o7- +o2N o1i +o2n i10 +o2n ^e +o2n +5 +o2n +4 +o2n +3 +o2n +o2m i3i +o2m i0A +o2M D3 +o2. ^M *32 +o2m +o2L Y3 +o2l y3 +o2l ^i +$! o2l +o2k o7b +o2. k c +o2K *68 +o2k -5 +o2j *31 +o2j -0 +o2I T6 +o2i k +o2i i3m +o2i 'B +o2@ i55 +[ o2. i20 +o2 i1t +o2i .1 +o2= i1+ +o2. i0h +o2i { +] o2i +o2h x01 +o2H u +o2h +o2g Y2 +o2g ^c +o2f Y5 x76 +o2f ^L +o2f i0w +o2f +5 +o2f *35 +o2f +0 +o2f -0 +o2f $! +o2e ^S +o2e i05 +o2e D8 +o2E C +o2e $1 +o2E +0 +o2d y2 +o2d t +o2d o8t +o2d o7h +o2d o48 +o2d K +o2d *75 +o2D ,3 +o2c i2p +o2C *13 +o2c $@ +o2b .6 +o2b ,3 +o2B +o2a Y4 T0 +o2a T0 Y4 +o2a $9 +o2a -7 +o28 *32 +o2- *76 +o27 *45 +o27 $@ +o26 i0o +o25 Z2 +o25 i61 +o25 *65 *31 +o25 *46 +o25 *31 *65 +o24 T3 +o24 o7y +o24 $. +o23 x41 +o23 R3 +o2$ ,3 +$# o23 +] o23 +o21 i2d +o2@ *10 +o20 o1h +o2, +o2 +$o $2 +^@ o2@ +^! o2@ +o1z y4 +o1z ^U +o1z o2y +o1z { 'A +o1- z2 +o1z ^. +{ o1z +[ o1z +^@ o1z +o1z +o1Y u +o1y *30 +o1@ x52 +o1x *31 +o1w ^q +o1W i4u +o1w c +o1w +0 +{ o1w +[ o1w +^o -1 ^w +o1v -5 +o1v *34 +o1v -3 +o1u o5/ +o1u i2 +o1t ^x +o1t c +o1@ T0 +o1t .0 +} o1t +o1s x31 +o1s u [ +o1s [ u +o1s o2w +^. o1s +o1r L1 +o1r ^H +o1r +5 +o1* R0 +o1r } +$. o1r +o1r +o1q +o1p ^w +o1p d +o1p ,2 +o1! ^P +o1, ^p +o1O Y3 c +o1o i5s +o1o i2r +o1o D3 +o1O c Y3 +o1@ o6! +o1o $2 +o1o -0 +o1O +o1o [ +o1n k +o1n ^! +o1n +o1m $M +o1m i7k +o1m ,3 +} o1M +o1@ ^m +o1l [ +o1l +o1k o3z +o1k i0m +o1k *45 +o1( k +} o1k +o1J x41 +o1J o0C +o1J ^M +o1j ^M +o1j $3 +^O -1 ^J +o1i i1S D0 +o1( i4. +o1@ i2m +o1* i1w +o1i $1 +o1@ i0! +$/ o1i +o1[ ^H R2 +o1h i2- +o1g x23 +o1G ^S +o1G o0S +o1G k { +o1G *73 +o1G *37 +o1F t ,2 +o1f $t +o1f i0b +o1F E +o1F ,2 t +o1f $@ +o1f ] +o1E u +o1e +0 +$+ o1e +] o1e +o1d ,2 +$! o1D +o1c $p +o1c ^p +o1C o4D +o1c i2 +o1c i0t +o1c $A +[ o1b Y1 +o1b y1 +o1b x31 +o1b ^L +o1b *01 +o1. ^B +{ o1B +o1b $@ +o1a t +o1a p4 +o1a o0Y +o1a $a +o1a $% +^# o1a $# +^# $# o1a +o19 o24 +o1. ,9 +o18 *31 +o18 +o17 } +o16 *04 +o16 [ +o15 k +o15 *54 +o15 *13 +o15 { +$\ o15 +o14 p1 +o14 o33 +o14 K k +o14 k K +o14 -3 +$= o14 +o13 Z2 +o13 ^v +o13 i62 +o13 *25 +o13 $2 +o1' ^3 +o12 ^W +} o12 } +o11 TA +o11 T9 +o11 R5 +o11 *67 +o11 *41 ^J +o1- *13 +] o11 ] +] ] o11 +] o11 +o10 $_ p4 +o10 C +1 +o1@ *02 +o10 +1 C +o1) ^) +o1. ] +^! o1@ +o0z $x +o0z o3p +o0z i6- x53 +o0z *76 +o0Z *51 +o0Z *14 +o0Z $) +{ o0Z +o0@ ^z +o0- ^z +o0Y l *53 +o0y ^g +6 +o0y $b +o0y $A +o0Y '6 +o0Y *53 l +o0y *25 +o0y -1 +o0y $* +o0x z1 +o0X $x +o0x i1p +o0x *75 +o0$ x61 +o0w sei +o0w o4s +o0w o3g +o0w o2h +o0w i3g +o0W ^E +o0W *81 +o0W $5 +o0W $- +$. o0W +o0w $- +{ o0w { +o0v r x34 +o0v ^j +o0v .5 +o0v *25 +o0v *20 +o0v *02 +o0u ^t +o0u ^G +o0U *62 +o0u ^0 { +o0T Y2 +o0t y2 +o0T x21 +o0T T3 +o0t o3q +o0t o3n +o0T ^L +o0t i44 +o0T D9 +o0t D7 +o0T $B +o0t ^7 +o0T ^6 +o0t .6 +o0t +5 +o0T $3 +$$ o0T +o0t $$ +o0t $! +$o $0 t +o0s x72 +o0s o6- +o0s i1z +o0s ^E +o0s D7 $1 +o0s *67 +o0s +5 +o0s *47 +o0S -2 +o0s $1 D7 +o0S *12 +o0s $1 +o0S ] +o0s $$ +} o0s +o0r u +o0R T5 +o0R r +o0r p2 ^g +o0R l i0M +o0r D3 +o0R $8 +o0R *51 +o0r -5 +o0R $@ +o0R +o0r $@ +$/ o0r +o0q z1 { +o0q u +o0q *68 +o0q *64 +o0Q ,6 +o0q ,6 +o0q *57 +$/ o0q +o0P y3 E +o0p o93 +o0P o3F +o0p o2n +o0P i5p +o0P i2P +o0p i1m +o0p ^c +o0p +7 *45 +o0p $6 +o0p *45 +7 +o0p *34 +o0P +3 +o0p .2 +o0p *12 +o0p $0 +o0P +o0o i0z +o0# o5# +o0@ o1R +o0o *02 +o0o *01 +o0o +o0n Y1 +o0n ^v +o0n o1i +o0N i82 +o0n i3h +o0N D2 +o0n *65 +o0n *50 +o0n *23 +o0n -2 +o0n *05 +[ o0m y2 +o0m u d +o0m t d +o0m T2 +o0m T0 ] +o0m ] T0 +o0m t +o0m ^S +o0m $p +[ o0m k +o0m d u +o0m d t +o0m *76 +o0m *71 +o0m $4 +o0M +3 +o0M *28 +$@ o0M +$? o0M +o0l z2 +o0L y4 y3 +o0l y2 +o0l u .4 +o0l p5 K +o0L o4E +o0L $m +o0l ^l +o0l i3. +o0l $9 +o0l .4 u +o0L *47 +o0l ^2 +o0l +1 +o0l $+ +o0l ^@ +$. o0l +$! o0l +o0k x32 +o0k u p1 +o0k ^u +o0K T2 +o0k sea +o0k p1 u +o0k o1h +o0K K +o0K i0A +o0k D3 $0 +o0k $0 D3 +o0! ^k +o0j $z +o0j y4 +o0J x51 +o0j ss1 +o0j i1k +o0j i0b +o0J ^H +o0J D2 +o0j $B +o0j -7 +o0j *50 +o0J -4 +o0j *32 +o0j *31 +o0j *13 +o0j $1 +o0i ^z *30 +o0i i0v +o0< iA> +o0; i7e +o0h y4 +o0h t d +o0H T5 +o0h shk +o0h r +o0H o5! +o0H ^L +o0h d t +o0h $6 +o0H -5 +o0h *20 +o0H +2 +o0H ,1 +o0H ^1 +$. o0H +o0H +o0h $! +o0G x31 +o0g snf +o0g o6. +o0G o4m +o0g o4m +o0G D8 ,5 +o0g ,6 +o0G ,5 D8 +o0g *05 +{ o0G +$. o0g +o0f t +o0f o84 +o0f o7k +o0f i6y +o0f ^a +o0F $6 +o0f ,6 +o0F ,3 +o0f .2 +$! o0F +o0f $_ +o0E o6i +o0E i7- +o0e i1n +o0e $f +o0e ^4 +o0e *05 +o0! E +o0e } +o0D x62 +o0d x42 +o0D o4G +o0d ^i +o0d $f +o0D +B +o0d $A +o0D $7 +o0$ D6 +o0d *36 +o0D +2 +o0D *13 +o0C y4 +o0c y4 +o0c x91 +o0c x31 C +o0c o3m +o0C ^J +o0c C x31 +o0C $a +o0c ^A +o0C .2 +o0c ^2 +o0c *15 +$! o0C +o0c $* +$= o0c +o0b z1 Y5 +o0b Y5 z1 +o0b y4 +o0B o1C +1 +o0b +3 +o0B +[ o0b +o0A z2 r +o0A T5 +o0A T2 +o0a $t } +o0a p1 +o0a i3e +o0a i2d +o0a i1- i0s +o0A *75 +o0A *57 +o0a *51 +o0a -1 +o0a $_ +o09 *02 +o09 +o08 T2 +o0) ,8 +o07 T5 +o07 o27 +o07 D5 +o06 *54 +o06 -2 +o05 z2 +o05 T3 +o05 'A +o05 *76 +o05 +o04 } +o0@ +4 +o03 T5 T2 +o03 T2 T5 +o03 ,1 +o02 x71 +o02 p1 } +o02 } p1 +o02 ,1 +o01 T9 +o01 *A0 +o01 *05 +o0* +1 { +o00 ^s +o00 $@ +$O ^0 +o0% +o0# $( +o0# +o0* +^o $* +^o $? +^. ^o +^o +$N Z3 +^n Z1 u +$n Z1 +^n y2 +^n x23 +^n x13 u +$n ^w *58 +^n u Z1 +^n u x13 +^n ^T +^n s4- +^n ^s +^n ^R +^n r +^n ^P +^n ^p +^N o4t +$n o1y ,3 +$N ^M +^N k c +$n i7W +$n i5w +$n i5v +$n i4z +^N i4d +$n i3x +$N i3k +^n i3- +^n i21 +^N i1O +^n } i1o +^N i1@ +^N i0V +^N i0T +^n i0F +$n i0B +^n i0a +$N $I +$n ^G +$n d +^n ^d +$N $B +^n ^b +$n *97 +^N $9 +^n +8 +^n $5 +$n ,3 o1y +$n *30 +} ^n +2 +^N *16 +$N $1 +$n $1 +$N -0 +$* ^N +} } ^N +^- ^N +$n ^( +^n ] +^. ^n +$m Z4 +^m z2 o1b +^m z1 ^w +^m z1 t +^m Z1 ^c +^m $z +$m y3 +^M Y2 +^m Y2 +^m y2 +$M Y1 +^M y1 +^m x32 t +^m x13 y5 +$m ^x +1 +^m $x +[ $M u +^m t z1 +^m t x32 +$M T5 $, +$M $, T5 +^m t *31 +$M $T +^M $t +^m s0* +$m r ^a +^M ^R +^M o8@ +^m o6p +$M o6G +^m o5h +$M o2x +^M o2W +^M o2J +2 +^M o1W +$M o0m +$m o0k +$m o0A +^M $O +$M $o +^M ^N +^M ^L x52 +$m L3 +^m ^L +^m ^K +^m $k +^M $j +^M ^j +$M i9m +$m i9, +$m i8. +^m i7- +^M i61 +[ ^M i6@ +^m i6 +$m i5z +{ ^m i5w +^M i5n +^m i5j +^m i5h +$m i5C +$M i5a +^m i5a +^m i50 +$m i4- *18 +$m i4- +^m i3w +$m i3u x23 +$m i2t +$M i2a +$M i0B +^M ^I +^m ^i +^m ^H +^m f x34 +^M ^F +^M D5 +$m D5 +$m D4 +^m ^d +^m ^c Z1 +$m C ^R +$m ^c +$m $b +^m ^b +$m $A +$m *85 +^M $8 +$M $7 +$M -7 +^M $5 +^@ $M -5 +^m .4 *23 +^m *31 t +^m *23 .4 +$M $2 +^M ^2 +^M ^1 +$M $$ +$M [ +$M ^@ +$! ^M +} $M +^M $$ +^M $. +^M ^@ +^M ^! +^# ^M +$m $/ +$m ^* +$/ $m +$- $m +{ $m +] } $m +^m $= +^m ^* +^& ^m +^l z5 u +$' l Z4 +$` l Z3 +l Z2 ^o +^l z2 +^l Y5 k +l Y4 +l Y2 x05 +l Y2 +$l $y +l xA1 o3i +$L x91 +$L x51 +l x41 f +l x24 p2 +l x21 +l x05 Y2 +$l $x +$l ^W +^l ^W +^l u z5 +l T7 +l T4 T3 +l T3 T4 +l T1 $! +l $! T1 +^L ^T +$l $t +$l sy_ +l soD k +^l so. +$L smJ +l s14 +l s!1 +l s0s +l s0a +^l } r +$l p4 $e +} l p3 +l p2 +l p1 -6 +^L ^P +l ^o Z2 +^l oA* +^L o6o +$l o6_ +^l o4j +^l o43 +l o3i xA1 +^L o2M +^l o1I c +$l o0y D5 +l $L Y1 +$l l D4 +^l k Y5 +l k soD +$l $K +^L i7/ +^L i5R +^L i5i +l i4m +$l i40 +$L i3B +$l i2h +^L i2. +^L i1C +^l i10 +l i0s +^l i0i +$L $I +{ ^l ^i +^l ^h +$L $G +^L ^E +$l ^e +$l d 'A +$l D5 o0y +$l D4 l +l D4 +$= l D4 +l D3 *73 +$L D2 +$L ^D +^l ^C +^L ^B +^l ^B +} l ^b +^L ^a +l $A +L9 Z5 x25 +L9 x25 Z5 +$L $9 +l ,8 .6 +L7 i7h +${ L7 +$? L7 +] L7 +L6 o4y +L6 o1@ +l +6 K +L6 ^J +L6 i7h +L6 i6x +L6 i6w +L6 i6h +L6 i6c +L6 i4+ +L6 ^A +l .6 ,8 +$L .6 *63 +L6 +6 +L6 ^@ +1 +L5 d c +L5 D3 +l *59 K +l *56 Y2 +l *52 y4 +L5 $! +L5 ^! +L4 y5 +L4 x72 o3z +L4 sbB +L4 s7s ^g +L4 r i5e +L4 o5f +L4 o3z x72 +L4 i2w +L4 ^g s7s +L4 ,3 +L3 ^t +L3 i5a +L3 ^c +L3 +L2 Y5 { +L2 { Y5 +L2 p1 { +L2 { p1 +$L +2 +$L -2 +$@ L2 +l -2 { +^l ,2 +L1 p1 E +L1 $o k +L1 k $o +L1 ^D +{ L1 d +L1 '8 +^L *14 +l $1 +l { -1 +^l -1 +L0 z2 t +L0 t z2 +L0 ^t +L0 s2F +L0 p2 D0 +^| L0 K +L0 ^k +L0 $j +} L0 i5z +^( L0 i2. +L0 ^G +L0 *35 ^d +$L *02 +L0 $@ +L0 $! +$L $0 +$L ^@ +^L $$ +$/ l $! +$/ $! l +$ l +} ^l } +^@ ^l +^- ^l +^_ ^l +$k Z4 +k ^, z4 +K $* Z2 +K z2 $. +K $. z2 +^` K z2 +K Z1 $0 +^K ^Z -1 +k $ Z1 +K $Z +^k ^z +K y5 x63 +k y5 x01 +$K Y5 c +[ k y5 +K y4 Y2 +$k Y4 Y1 +K Y4 x41 +K y4 x12 +K Y4 k +] ^k y4 +K Y3 o7_ +k y3 *32 +K Y2 y4 +K Y2 y2 +K y2 Y2 +K Y2 o87 +K Y2 i6. +K y2 c +K Y2 $6 +K Y1 o7z +K Y1 $k +k y1 ^A +K $@ Y1 +$ k Y1 +[ k y1 +k ^y +K xB6 +K x83 t +K x83 +K x72 *56 +k { x71 +K x41 t +$k x32 +k x25 +^k x23 +K x21 ^h +k x13 $! +k $! x13 +k x12 d +$k x04 +K $x +$k $x +$k $w +K $v +^k $v +^k ^U u +^k u ^U +K ^U ^L +K u D6 +K u ,9 +$k $u +K $t Y1 +K t x83 +K t x41 +K t R9 +K t o4_ +K ^t i0v +k ^t D4 +K t -8 +^k T5 +$K t +[ K t +K src *53 +k sau [ +k [ sau +k sad +k sa- +K s5B +k s3x +$k s1t +K s0l +k s0@ +$K ^S +k $+ ^s +k ^s $+ +k ^s +k R3 +K R2 t +K $r +k ^R +K q x23 +$k ^Q +$k q +^k p4 ^C +k p4 'A +k p3 o7. +k p2 *35 +K p1 x04 +K p1 +B +k p1 *54 +^k ^P +K oBy +K oAu +K o9I +K o8p +k o8. +K o7z Y1 +k o7x +K o76 +k o75 +K o7, +k o6m +K o65 Y3 +K o6@ +K o6 +k o5q +k o5j +k o55 ,6 +K o54 $! +K $! o54 +^k ^o *54 +k o50 +k o4y +K o4u +$k o4u +K o4_ t +$k o4i +K o4e +$k o49 +k o4_ +k o3s $8 +k o3o +K o3g +K o3f +k o39 +k o36 +k o2- y2 +[ k o2x +k o2j +k o2b +k o22 K +$K o2# +^k o2. +^K o1R +k o1d +k ^@ o1c +k o1a +K o13 +K o11 +k o11 +^k o1! +k o0o +k o0n *31 +k o0k -1 +K o0g +k o0e +k o0d +K o0c +$K ^o } +k $o +] k ^o +$K $n d +K $m i7f +^K $m +^k $m +K l *58 +k l *30 +^| K L0 +K $K Z1 +K ^k ^z +K k Y4 +k ^K T3 +k K o22 +k K *54 +K k *31 +K k *13 +K k $! +K k $_ +K $! k +K $_ k +$k K +^k K +k ^k +k ^J x32 +K $J r +k ^j *05 +K iB- +K iB +K i9u +K i7z +$k i7f +K i7. +$K i6z +K i6. Y2 +K i6x +K i6m +$k i6J +K i6b +k i6a E +k i67 +K i6+ +k i6. +K i5n +K i5g +^K i59 +k i56 +K i4o +$k i4 +k i3v +$k i3s +} K i3E +^k i2z +k i2y +k i2? x23 +K i2l +k i2@ c +K i2b +$k i2b +k i1s +k i1r +^k i1m +^k i1j +^K i1! +k i1& +$k i1- +k i0@ x51 +$. k i0v +K i0u +^K i0T +^K i0G +^k i0F +^K i0D +k i0A ,6 +$K i0$ +k $g Y1 +K $g +K ^g +k ^f x32 +k { ^f +k E r +^k E o1H +k E i6a +k E $9 +k E $5 +$+ k $e +K d x03 +K ^d i3q +K D6 u +K D6 *86 +$K D5 y5 +k D3 d +^K D3 +$k D3 +K D2 $9 +K D1 $7 +K d +k c i2@ +^k ^c D6 +K C .7 +K c -7 +K c $# +K $# c +k ^b p3 +k ^b *13 +$K ,B +$k ^b +K ^a -7 +$K ^A +$K $a +^K $a +K ,9 u +k $9 E +K $9 D2 +K *97 $1 +$K ^9 +K $8 Y2 +K -8 t +k $8 o3s +K *85 $! +K $! *85 +K *82 *76 +K ] $8 +K -8 +k } '8 +K $7 D1 +K .7 C +K -7 c +K *76 *82 +K -7 *65 +K .7 ,5 +k *74 +^k ,7 .1 +K ,7 +0 +K $. -7 +K -7 $. +$K .7 +k -7 +k *67 +K *65 -7 +k *64 +K +6 +$K +6 +$K ^6 +k $5 E +K *58 l +K *57 y5 +K ,5 .7 +^k *57 +K *56 x72 +k *56 -3 +k *54 K +K *54 *02 +K *53 src +^k *52 x12 +k *52 -1 +K -5 $1 +K +5 *07 +K +5 $@ +K $@ +5 +k .5 +^k .5 +K *45 +k *43 ^6 +$ K ,4 +$k *37 +$. k *37 +K *36 $. +K $. *36 +k -3 *56 +$k *35 +k *34 ] +k *34 +k ] *34 +K ,3 *20 +k -3 -2 +k *31 o0n +K *31 +k *30 l +^k *30 +K $$ ,3 +K { -3 +K ,3 $$ +$k +3 +$k -3 +k -2 Y3 +k -2 y3 +k *24 +k -2 -3 +K ] ^2 +K ^2 ] +^K $2 +k .2 +k +1 y1 +k -1 o0k +K $1 *97 +^k .1 ,7 +k -1 *52 +K $1 -5 +k *12 i03 +K *12 +^K +1 +k -1 +K *07 +5 +K +0 ,7 +K *02 *54 +K *02 +K *01 r +K .0 *12 +$$ K $0 +] K +0 +k -0 +K } +$* $& K +$$ ^K +$/ K +$, K +$ K +} K { +k ] +$k $& +$k $. +$* k +$@ $@ $k +$@ $k +$- ^k +} k +] ^k +^. ^k +^! $k +^ k +^J z1 +5 +$j $z +$j Y1 x12 +^@ ^J x73 +$J x41 +^J x32 +$j x12 Y1 +^j $x +^j $w +^j ^V +$J $u +^J T0 i2m +$J $T +$j $t +^j $t +$J ^S +^j r +^j $q +^j o65 +^J o5p +$J o5$ +^j o4g +$J o4 +^j o35 +$j o21 +^J o2@ +^j o1l +^J o1D +$j o0p +^J $o +$j ^m u +$J $m +$J l -8 +^j $l +$J $K +$j $k +^J ^j +$J i7# +^j i6k +^j i65 +^j i5z +$j i5w +^J i3s +$j i3k +^j i2z +^J i2m T0 +^J i2d +^J i1W +^j i1w +^J i1R +^J i1k +^j i0s +^J i0D +^j $G +^j ^G +^j E Y5 +$j d o6 +$j C $j +$J $C +^J $c +^j ^C +^j ^b *78 +^j ^B +$j ^A +^j $9 +$J -8 l +^j *61 { +$J +6 +$j ^6 +^j -5 +^j $4 *17 +$j *41 +$j *24 o2g +^J $2 +$J $! +$. ^J +^J ^$ +^@ ^J +^J +$j $* +$@ $j +$i Z2 t +$i Z2 D6 +$I Z1 +$i Y3 +{ $i Y2 +$i y2 +$I x71 u +^I x52 $1 +^i } x52 +$I x03 +^i ^W +$I u x71 +^i u ^D +$i t Z2 +^i t i6A +^I T3 +$i ^t +^i o7$ +^i o7@ +$i o6e +^I o3C +$i $n +^I ^L t +$i $k +$i i7* +$i i52 +^I i1L +^i i06 +^i ^G p4 +^i ^F +$i E .9 +^i ^D u +$i D6 Z2 +$i D5 +^i d ] +$i C +$i $c +iBy ] +iBy +iBL u +iBh +iB@ c +iB9 +iB# +iB/ +iB_ +$) iB( +] iB +iA- x53 D2 +iA x21 +iAw x82 +iAt oBr +iAo *A8 +iAm +iAj +iAi +iAh x63 +iAh x61 +iAe xB2 +iAe +iAd D8 +iAc +iAb x24 x51 +iAb i6u x74 +iA -B +] iAa +] iA9 +iA8 ] +iA8 +iA4 $A +iA_ $4 +iA4 +iA2 x72 +iA0 o8 $2 +iA0 $2 o8 +iA0 $! +iA+ +iA, +iA= +^i ^a +i9. Y2 +i9. x31 +i9* x03 +i9u x53 +i9 t +i9s E +] i9 sBn +i9p x65 i0m +i9o ,A +i9o +i9l $1 +i9l +i9h E +9 +i9h +9 E +i9g E +i9e t +i9e D4 +i9. E +$i .9 E +] i9e +i9d +i9B +i99 ^9 +i98 $. +i9^ .8 +i96 oA@ +i95 $Z +i95 -A +$* i95 +i94 'B +i94 +$* i93 +i93 +i91 c +$? i91 +i90 iB1 +i90 D0 +i90 c T1 +i90 C +i9& +i9* +i9. ] +i9_ +$/ i9* +i8z ] -8 +i8z -8 ] +i8. Y3 +i8- Y3 +i8 Y2 +i8# x74 i8p +i8 x42 +i8@ x32 +i8* x24 +i8W u +i8W T3 +i8w +i8v +i8u L7 +i8. T2 +i8t +i8s x95 +i8s x52 +i8S E +i8s D6 +i8R *70 +i8q $e +i8p x62 +i8p *34 +i8o o7d +i8o *84 +i8n t ] +i8n ] t +i8n *67 +i8. $m +i8m +$* i8l +i8k $s +i8, K +i8- $k +i8j x43 +i8J l +i8J +i8i u +i8. iAI x93 +i8. i8 x69 +i8. i8 +i8i *21 +i8^ i2^ ] +i8^ ] i2^ +i8h o9e +] i8h +i8G $s +i8g ] +i8g +i8e .7 +i8e ,7 +i8# ^D +i8d +i8* C +i8a o6_ +i8a K +i8A E $5 +i8A $5 E +i8. $A +i8@ $9 +i8. +9 +i8! ,9 +i8 $9 +i88 x94 +i87 i98 +i87 *46 +i8% -7 +i8* .7 +i8. +7 +i86 c z1 +$. i86 +i86 +i85 [ +i84 Y4 +i8 $4 +i83 C +i82 i31 +i82 C +i8- *20 +i81 i77 +i80 *97 +$I ^8 +^I ,8 +i8( +i8_ [ +i8= +$# i8+ +$& i8^ +$@ i8_ +] i8. +^! i8! +i7z x24 +i7Z C +i7z ,8 *14 +i7z *14 ,8 +$& i7z +i7y $i +i7. Y3 +i7_ y2 +i7y ] +i7y +i7X Y3 x45 +i7x $x +i7@ x13 +i7, x13 +i7x +i7W $n +i7w [ +i7v ,8 +i7v +i7U o6P +i7t C +i7( T0 +i7! ^T +i7t ] +] i7s +i7r x24 +i7r T0 +i7r t +i7R i7B +$! i7r c +] i7r +i7q D9 +7 +i7q +7 D9 +i7q *75 +i7Q +i7q +i7o sis +i7o C p4 +i7O .6 +i7. o41 +$@ i7o +i7o +i7N i8E +i7m o4E l +i7m ^M +i7l *34 +i7l $$ +] i7l +^@ i7l +i7- K +i7k +i7i u +i7I E +i7( i8) +i7i *45 +i7* i2* +i7h t +i7_ $H +i7h $! +i7g x41 +i7f x34 +i7e o8f +i7e k +i7d .6 +i7@ D5 +i7. D3 +i7. D2 +$! i7D +i7c $d +i7c $9 +i7A x52 E +i7A E x52 +i7` $A +i7. ^a +i7- -9 +$* i79 +i78 D4 +i7@ ,8 +i77 o0m +i77 C +i77 +8 +i77 .8 +i76 o67 +i7* .6 +i7! .6 +i75 i7. +$. i75 E +i75 .4 +i75 ,1 +i75 [ +$. i75 +i74 o1A +i74 D0 *75 +i74 *86 +i7. *46 +i73 o61 +i73 i13 +] i73 +i72 T8 +i72 i71 +i72 D4 +i72 $A +i72 -2 +i72 [ +i7@ $2 +] i72 +i71 C -2 +i71 -2 C +i71 ] +i7& $1 +$! i7@ *05 +i70 *31 +i70 *13 +i7. +0 +i7! $0 +i7* $# +i7* ] +i7@ +i7. ] +i7. +i7! +i7- +i7= +$/ i7, +$- i7= +^# i7* +^` i7- +i6z t +i6z $8 +i6Z ^4 +i6z +3 +i6% Y3 +i6. Y3 +i6_ Y3 +i6x x72 +i6X o0w +i6x i6z +i6x i6- +i6 x91 +i6x +9 +i6X ,7 +$. i6) x65 +i6. x12 +i6x [ +i6W s5i c +i6w D4 +i6W c s5i +i6w ^. +i6v u +i6v s0z *16 +$/ i6v o7y +i6v *16 s0z +i6v [ +i6v +i6u x05 +i6U u +i6u o7s +i6u *27 +i6- t D7 +i6T c +i6 TA +i6t +9 +$@ i6t +i6s Y1 x73 +i6s x23 +i6s L4 +i6s *71 +$! i6S +i6- s- +$@ i6s +{ i6s +] i6s +[ i6s +i6R x23 +i6r i8! +i6R i6$ +i6R $g +i6r -8 +i6- R4 +i6p x32 +i6p o0J +i6p $F +i6P *63 x21 +i6o x81 +i6o o5l +i6- o5H +i6) o4( +i6! o23 +i6o *17 p3 +i6@ o0s +i6@ o0b +i6@ o0@ +^# i6o +i6n i3m +i6n i2b +i6n c +i6n *40 *18 +i6n *21 +i6n *18 *40 +$@ i6n +i6m y4 x07 +i6m o5. +i6M E $2 +i6M E +i6m .7 +i6m *62 +i6M $2 E +i6m $/ +i6m +i6l C +i6l $8 Z1 +i6L *06 +$. i6l +i6k x42 +i6@ K +$. i6k +i6j E +i6j +4 +i6i o5j +i6i i8g .7 +i6. i7t +i6# i71 +i6& i6s +i6i ,5 +i6@ i0M +i6_ i0a +i6i $. +i6i $! +$% i6i +i6i +i6h x24 +i6h o2z +i6g x41 +i6g L0 +i6G i7C +i6g D3 +i6f i7w +i6f .5 +[ i6f +i6e Y1 +i6e t +i6e i6n +i6E E DB +i6E DB E +i6E +[ i6e +i6d Y5 x13 +i6d x13 +i6d u +i6d E +i6- D7 t +i6 D3 +i6c +7 +i6c [ +[ i6c +i6B ^N +i6b $4 +i6B $$ +i6, 'B +i6a x72 +i6a x31 +i6a o4l +i6a i6t +i6a i5d +i6. *A9 +i6 *A9 +i6a *63 +i6a *25 +i6_ +A +i69 ] +i6 -9 +i68 o75 +i68 i52 +i67 x92 C +i67 C x92 +i67 $A +i67 *02 +i67 +0 +i6 +7 +i66 R5 +i66 D1 +i66 *63 ] +i66 ] *63 +i66 $* +i66 $@ +i6+ ,6 [ +i6( .5 +6 +i6. *52 +i6/ .5 +i6_ -5 +i64 ^e +i64 'A +i6 *45 +i6 *43 +i64 ] +[ i64 +i63 ^W +i63 ,7 +i63 $2 +i6. +3 +i6. $3 +i62 o7_ +i62 C -7 +i62 $A +$i *62 ^a +i62 -7 C +i62 -5 +$* i62 +$@ i62 +i61 $M +i61 i5G +i61 C +i61 c +i6 *12 +i61 [ +i6- +1 +} i61 +i60 y5 +i60 o9@ +i6! $0 +$I .6 +i6* $^ +i6* ^# +i6$ $$ +i6( +i6, +i6_ ^( +$* i6) +$$ i6# +$- i6. +$^ i6* +{ i6 +] i6_ +] i6` +i5z $p +} i5z L0 +i5z k +i5z ^g +i5z *67 +i5z *51 +i5- z2 +i5- z1 +$@ i5z +i5y $q +i5y o8t +i5y o3j +i5y $j +i5y i51 +i5y i3d +i5y i0p +i5Y c +i5y $5 +i5, Y2 +] i5 Y2 +$. i5y +i5x +6 *15 +i5x *15 +6 +i5! x12 +i5w Y1 +i5w x21 +i5w r i6x +i5W [ o4. +i5w $n +i5w i4r +i5w { +i5v x01 +i5V o6o +i5v o3x +i5v i62 +i5V c +i5v *71 +i5v ] +i5u D4 +3 +i5u +3 D4 +i5u { +[ i5u +i5u +i5t o64 +i5T o5d ^k +i5t ^h +i5# T1 +i5t $@ +i5t $, +i5t } +$. i5t +i5s Y3 u +i5S Y2 +i5s u Y3 +i5s ^R +i5S l i4e +i5S i4e l +i5s D7 +i5s *34 +i5s *23 +i5S $! +i5s ^( +i5r ^M +i5r i5c +i5@ R4 +i5r } +i5q $s +i5q *50 +i5. ^q +i5p y4 x17 +i5p x61 i1s +i5p r +i5p i5m +i5o r p1 +i5o r [ +i5o p1 r +i5o o6i +i5o i5p +i5o $7 +i5@ o4l +i5o $/ +i5o ^# +i5n x63 +i5N i86 +i5n i3r +i5n ^A +i5n .4 +i5n [ +i5m o6. +i5m ^a +i5M .4 +i5l x32 +i5l +5 -3 +i5l *47 +i5l -3 +5 +i5. ^l +i5l +i5k s6Y +i5k ^r +i5k $q +i5k c ] +i5k ] c +i5K .6 +i5k -6 +i5k $= +i5k [ +i5j Y3 +i5j Y1 +i5J x32 +i5J T5 $j +i5J $j T5 +i5j ] +i5i i4M +i5i i1h +i5i ^G +i5I ,6 +i5+ i5+ +i5 i5[ +i5. i3b +i5 $i +i5h t +i5h C +] i5h c +i5h -4 +i5- $h +i5g i3n +i5g C +[ i5g +i5F s7E +i5f *74 +i5e i2i +i5e $e +i5e +7 +i5e *30 +$} i5E +i5e +i5D x83 +i5D x82 +i5_ D9 +i5d *60 x61 +i5D $* +i5D +^% i5c s%p +i5c o42 +i5c l +i5c K +i5c i5E +i5c 'B +i5c *52 +i5c -4 +i5- C [ +i5= c +i5b o1y +i5b i2A +i5b $f +i5b ^5 +3 +i5b $_ +i5a Z1 x62 +i5a x62 Z1 +i5a s1! +i5a o3a +i5a D3 +i5a *96 +i5A *20 +i5, $a +[ i5a +i59 K +i59 $. +] i59 +i58 o5k o3. +i58 o3. o5k +i58 C ^8 +i5 *87 +i5( *86 +i5* +8 +i57 Y1 +i57 x03 +i57 i0s +i57 $8 +i5@ *76 +i57 *50 +i57 -2 [ +i57 $1 +} i57 +i56 s2. +i5% *67 +i5# -6 +i5* ,6 +] i56 +i55 Y4 +i55 ^q +i55 o6t +i55 i4x +i55 ] +$$ i55 +i54 x32 +i54 T2 +i54 p2 +i54 K +i54 i1G +i5_ .4 +i53 i75 +i53 $. +$! i53 +] i53 +i52 $s +i52 R4 +i52 D7 +i52 D1 +i52 +6 +i52 +4 +i52 $* +] i52 +i52 +i51 x12 +i51 k +i51 i1T +i51 -9 +i5! $1 +i50 t 'A +i50 R4 +i50 r +i50 'A t +i50 *74 +i50 +2 +i50 ] +i5# $! +i5- $- +$# i5! +$$ i5@ +$) i5( +$! i5- +] i5? +^[ i5] +i4z Z1 +i4z x53 +i4z $v +i4z r +i4z .3 +i4. Z1 +] i4z +i4Y $y +i4y ^x +i4y ^f +i4Y C +i4_ Y5 +i4+ Y2 +i4@ Y2 +i4y .2 +i4x i3c +i4. x61 D2 +i4x ,5 +i4x -5 +i4* x23 $A +i4w $z r +i4w ^z +i4w x12 +i4W i4M +i4w *82 +i4W *40 +[ i4w +i4w +i4v p1 +i4v i1b +i4v D6 +i4v $9 +i4v *42 +i4. ^V +i4 $v +i4u $z +i4U u +i4u $t +i4u ^l +i4u $h +i4u $9 +i4u *32 ] +i4u ] *32 +] i4U +i4t ^y +i4t ^f +i4t ^c +i4t .7 +i4$ T5 +i4t *36 +i4& $t +$, i4t +i4t +i4s Z1 +i4s o7k +i4s K +i4s i6f +i4S c L5 +i4s -5 +i4s $2 +i4* ^S +i4@ ^S +i4 ^s +$, i4s +i4R x13 +i4- r p4 +i4r ^P +i4r o3c +i4r ^E +i4r -2 +i4_ r +i4q i4f +i4q $0 +i4p L5 +i4- p4 r +i4p *42 +i4o Y1 c +i4o } i6g +i4o i3_ +i4o c Y1 +i4# o3f +i4- o38 +i4o ^# +i4n ^N +i4n *12 +i4n $@ +i4n ] +i4M x14 o2p +i4M u +i4m $t +i4m i2s +i4m $d +i4m $9 +i4m $7 +[ i4m +5 +i4M $! +i4m ] +i4l ^L +i4l *32 +i4@ ^# L0 +i4k x73 +i4k x21 x53 +i4k ^R +i4k $K +i4k $5 +i4k $3 +i4= K +i4k ^. +i4_ $k +$+ i4k +$! i4k +i4j x21 +i4j x02 +i4j i4z +i4j $h +i4J -3 +i4j { +i4j +i4i x65 +i4I t +i4i i6u +i4i ,3 +i4i *25 +i4i $# +] i4i +i4h $s +i4h i21 +i4h $g +i4h $9 +i4H +7 +i4h *13 +i4G Z1 ,4 +i4g ^j +i4G $g +i4g ^G +i4g ^g +i4g ^8 +i4g *74 +i4G ,4 Z1 +i4G +i4. $g +i4f $r +i4f C +i4f ,8 +] i4f .3 +i4f *25 D1 +i4f -0 +i4f [ +[ i4f +i4f +i4e p4 o7z +i4e i5M +i4e D1 +i4e $D +i4E $C +i4e -5 +i4e .3 +i4e +2 +i4e $1 +i4e $$ +i4D ^C +i4_ D9 +i4% D2 +i4@ D1 +i4c *23 +i4c +i4B x53 +i4b u +i4B i4a +i4B ^F +i4B c +i4b $4 +i4a x57 +i4* $A x23 +i4a ^v +i4a sa +i4a o3@ +i4a o2p +i4A $M .4 +i4a i5m +i4a *53 +i4a *52 +i4A .4 $M +i4a ,3 +i4a $# +$# i4a +i49 ^p +i49 k +i48 Z1 +i48 ^8 +i48 ] +i47 T7 +i47 *30 +i46 *58 *54 +i46 ,5 +i46 *35 +i46 $3 +i4& *63 +i46 $, +} i46 +i46 +i45 Z1 c +i45 Z1 +i45 x12 +i45 T8 +i45 o2d +i45 ^m +i45 i4y +i45 c Z1 +i45 $* +i4@ $5 +$% i45 +$* i45 +${ i45 +i44 x62 +i44 x27 +i44 i51 +i4 *46 +i44 [ +] i44 +i43 R3 +i43 o34 +i43 ^n +i43 i44 +i43 $A +i43 +6 +i43 +5 +i4_ *31 +i43 *02 +i43 $. +i4* ^3 +i4@ +3 +i42 i21 +i42 $d +i42 ^A +i42 *76 +i42 *02 +i42 $% +i4@ ^2 +i4_ -2 +i41 x01 +i41 p3 i4. +i41 i55 +i41 ,5 +i41 *31 +i41 $3 +i41 $ +i41 } +i41 [ +} i41 +] i41 +[ i41 +i40 y5 +i40 i55 +i4$ +0 +i4+ ^! +i4( $) +i4! $? +i4= +$* i4$ +$! i4# +$! i4& +] i4/ +] i4 +] i4= +^@ i4@ +^{ i4} +i3z x43 +i3z k +i3z D5 +i3z $8 +i3z ,7 +i3z *25 +i3z $! +i3y ^z +i3y x61 E +i3y $p +i3y i5h r +i3y E x61 +i3y *63 { +i3- Y5 +i3 Y4 +i3+ y4 +i3_ y3 +i3@ Y1 *56 +i3@ Y1 +i3# y1 +i3y { +[ i3x Y2 +i3x x46 +i3x ^s +i3x o5m +i3 x81 +i3@ x72 +i3x *70 +i3" x13 $d +i3x $1 +i3w o7y +i3w $k +2 +i3w i43 +i3w +2 $k +i3- ^w +i3v $v +i3V C +i3u x52 +i3u i7y +i3u i5i +i3u +i3t y2 +i3t x02 D0 +i3t x01 +i3t ^w +i3t o6u +i3t $k +i3t D0 x02 +i3t D0 +i3$ T6 +i3' T4 +$@ i3t +i3t +i3s $z +i3s y2 +i3s y1 } +i3s ^m +i3s i4z +i3s $! -6 +i3s -6 $! +i3S .2 +i3s +0 +i3s $ +i3s $` +i3s [ +i3r r $4 +i3_ R7 +i3r $6 +i3, $r +$. i3r +i3q x71 +i3q $W +i3q $w +i3p $y +i3p ^S +i3p p3 T1 +i3p $k +i3p k +i3p i6c +i3P i1M +i3p $d +i3p ^b +i3o r +i3O o0P c +i3o i8s +i3O c o0P +i3. o6K +i3_ o6@ +] i3[ o3v +i3# o3_ $9 +i3_ o2n +i3- o0o +i3O +$+ i3o +$. i3o +i3o +i3n $w +i3n o2n +[ i3n +i3n +i3m u +i3m ^j +i3m i4d +i3l K +i3l i3. +i3l $2 +i3l +i3k x04 TB +] i3K u +i3k r +i3k o2r +i3k K x71 +i3k *53 +i3k -5 +i3k $3 +i3@ K +$. i3k +i3j y2 +$. i3j +i3i $A +i3_ i50 +i3- i4s +i3- i4C +i3i ,4 +i3- i4- +i3- i1y +i3- i1a +i3i $? +i3h i6t +i3h $A +i3h *20 +i3h $. +i3h [ +i3g ^S +i3g i6c +i3g $8 +i3g ,6 +i3g *37 +i3g *05 +i3g [ +i3f Y1 +i3F T0 +i3f i6h +i3f ^F +i3F $8 +i3f *14 +i3F $! +i3f $! +i3f [ +$@ i3f +i3e ^p +} i3E K +i3e i2N E +i3E -4 +$! i3E +i3E +i3" $d x13 +i3d t +i3d $r +i3d ^5 +i3d } +i3C z1 u +i3C u z1 +i3c t +i3c $b +i3C .2 +i3c +0 } +{ i3C +i3C +i3c +i3B l +i3B E +i3b ^A +i3. +B +i3- $B +$@ i3b +i3a ^T +i3a $s +i3a o2y p5 +i3A i6C +i3A i4P +i3a i4b +i3a i0A +i3a ^I +i3A $B +i3a $- +$* i3a +i3# $9 o3_ +i39 o02 +i39 i48 +i38 i37 +i37 i51 +i37 i3A +i37 f x65 +i37 D1 +i3# +7 +$, i37 +i36 ^t +i36 i27 +i36 $6 +i36 ,4 +[ i35 D0 +i35 ^8 +i35 *21 +i35 $_ +i3- ^5 +i3_ ^5 +[ i35 +i34 R2 +i34 i0A +i34 -8 +i34 -0 +i3! ,4 +i3- ,4 +i3_ +4 +i3 +4 +i3 -4 +i33 ^T +i33 ^s +i33 *76 +i33 +2 +$* i33 +i32 *70 +i32 ^3 +i32 ] +$* i32 +$! i32 +i32 +i31 y3 [ +i31 x62 k +i31 ^S +i31 k x62 +i31 -6 +i31 +1 +i31 } +i3@ *02 +i30 $= +i3@ +0 +$= i30 +[ i30 +i3& +i3$ +i3. $! +i3! ^? +i3- ^` +$@ i3. +$! i3- +$ i3_ +] i3_ +^# i3$ +^@ i3* +i2z ^w +i2Z ^S +i2Z l L6 +i2Z L6 l +i2z i4j +i2z '7 +i2z *67 +i2z +5 +i2Z ,3 +i2z ^2 +i2z } +{ i2z +i2y $k +i2y i5x +i2y i1r +i2Y c +i2y ^C +i2y *67 +i2. Y4 +i2y *37 +i2_ y3 +i2x $s +i2x $k +i2x i0a +i2x ^c +i2\ x23 $2 +i2x +0 +i2w y1 +i2w x03 +i2w ^n +i2w i3- +i2w *52 +i2v x01 +i2v K i3y +i2v $k +i2v i5C +i2v i3y K +i2v $h +i2v ^3 +i2u x72 +i2u $x +i2u $! +] i2u +i2t i0s +i2$ T1 +i2- ^t +i2s Y1 +i2s sa@ +i2s ^s +i2s i0v +i2s +8 +i2s *60 +i2S -3 +i2s .1 +i2s ] +} } i2s +i2r ^z +i2r ^y +i2r $K +i2r $a +i2r *73 +i2r $@ +$@ i2r +i2q $x +i2q L5 +i2q ^c +i2q *61 +i2q ,3 +i2q -0 +i2_ ^q +$- i2q +[ i2q +i2p y5 x57 +i2p Y4 +i2p y2 +i2p x42 -6 +i2p o5p +i2p k +i2. p5 -6 +i2p +i2- o67 +i2- o1k +i2o $- +$ i2o +i2n o0w +i2n K +i2n ^g +i2n ,7 +i2N -6 +i2n *40 +i2n *37 +i2m ^z +i2M x52 +i2m sif +i2m q +6 +i2m i0a +$! i2m [ +$! i2m +i2l o0K +i2L E +i2_ L5 +^( i2. L0 +i2l $. -0 +i2l -0 $. +i2l $& +i2l +i2k x71 +i2k u +i2k i2j +i2k *57 +i2k $5 +i2 k +[ i2k +i2j $r +i2j o0v +i2j i0S +i2j -8 +i2j *31 +i2j *07 +i2j +i2i Y4 x52 +i2i y2 +i2i x73 +i2i E +A +i2i D5 +i2I C +i2i +A E +i2# i7# +i2i $5 +i2! i3) +i2i .1 +i2i *03 +$* i2i +] { i2i +i2h $X +i2h o6z +i2h $f +i2h D4 +i2g y5 +i2g x53 +i2g x32 +i2G x02 +i2g s2r k +i2g o7@ +i2g k s2r +i2G i5g +i2g i34 +i2g i2x +i2G D4 C +i2G C D4 +i2g $5 +^* i2g +i2f o21 ] +i2f ] o21 +i2f $6 +i2f *31 +i2f $! +[ i2f +i2e K +i2e $? +i2e +i2D y3 u +i2D u y3 +i2d ^N +i2d i3@ +i2d ^E +i2d D5 *14 +i2d *14 D5 +i2d *13 +i2c x63 +i2c x42 +i2c $w +i2c o3k +i2c K ^F +i2c k +i2c $g +i2c ^F K +i2= c +i2b ^x +i2b ^l +i2A T3 +i2a t +i2a ^p +i2a o7C +i2a o5o +i2a ^g +i2a $F +i2A $8 *53 +i2a .8 +i2a ,7 +i2A *53 $8 +i2A $4 +i2a -1 +[ i2a +i29 D7 +$@ i29 +i28 i0w +i28 D3 +i28 ^a +i28 -1 +[ i28 +0 +i27 $X +i27 i5t +i27 i29 +i27 ^c +i27 $A +i27 .0 +i26 i5z *56 +i26 $a +i26 *52 +i26 ] +i25 x61 +i25 i3g +i25 i0a +i2_ *56 +i2_ *53 +$/ i25 +i24 i26 +i2. *40 +$+ i24 +$. i24 +i23 i53 +i23 $a u +i23 $! +i2\ $2 x23 +i22 ^1 +i22 $- +i22 +i21 o0R +i21 i31 +i21 f x78 +i2- +1 +i20 $d +i20 *03 +i2# $! +i2* +$i -2 +$? i2! +[ i2_ +[ i2= +i1z ^Z +i1z } .2 +i1y } ^v +i1y ^s +i1y o1b c +i1y ^g +i1y c o1b +i1y $2 +i1y -0 +i1x ^y +^I $1 x52 +$@ i1x +i1W x53 +i1W x01 ^K +i1w $m +i1w i56 +i1w i3 +i1v ^M +i1v ^h +i1V *56 +[ i1v +i1u Z2 +i1u y5 u +i1u u y5 +i1U u +i1u o65 +i1U } +[ i1u +i1T ^w +i1t s9w +i1t ^s +i1t i0h +i1t +0 +$! i1t +i1s ^z +i1s y3 +i1s $v +i1s o32 +i1s ^I +i1{ s3P o1L +i1S *20 +i1r x27 +} i1r ^v +i1R u +i1r sts +i1R c +i1r ^a +i1R ^_ +i1q i1z +i1p i5u +i1o o3j +i1o $O +i1o i0k +i1. o44 .1 +i1{ o1L s3P +i1n x61 +i1n ^h +i1n *71 +i1n *31 +i1n -2 -0 +i1n -0 -2 +i1M Y5 t +i1m x71 +i1M t Y5 +i1M R0 +i1m ^r +i1m o2d +i1m o12 o0! +i1m o0! o12 +i1m +A +i1. ^m +[ i1m +i1l ^P +i1l $a +i1l ,3 +i1k p1 +i1k *75 +i1k +i1j o2s +i1j i6g +$( i1j +i1i o5@ +i1i i7i +i1i C +i1i *71 +i1% i6& +i1h y5 +i1h t +i1h ^p t +i1h o50 +i1h ^j +i1h -5 +i1h -4 +i1g y1 +i1g $@ p3 +i1g i0A +i1g *02 +i1F ^T +i1f i30 +i1f $A +[ i1f +i1e o5m +i1E E +i1E *72 *56 +i1E *56 *72 +i1e +5 [ +i1e *13 +i1e +i1D $7 +i1d $. +i1C ^R +i1C o0K +i1c i2u +i1C $c +i1 c +i1b x52 +i1b t +i1B o8@ +i1a i2b +i1a +9 *78 +i1a *78 +9 +i1_ ^A +i19 ^9 +i19 +2 +i18 Z1 t +i18 y3 x42 +i18 ^v +i18 t Z1 +i18 ^5 +i18 $? +i17 ^j +i17 ] +i16 $Q +i16 *63 ] +i16 ] *63 +i16 *32 +i15 ^q +i15 $a +i14 *20 ] +i14 ] *20 +i1` *42 +i13 ^w +i13 o30 +i13 i4- +i13 c +i13 *04 +^$ i13 -0 +i12 i32 +i11 ^v +i11 o62 +i1. .1 o44 +i11 D7 +i11 D6 +i11 .4 +i10 i32 +i10 ^A +i10 *24 +i10 *14 +^I ^1 +i1+ $- +$- i1+ +^/ i1? +i0z y2 +i0Z T6 +i0z ^n +i0z i4- +i0z $b +i0 z2 +i0Z +$$ i0z +i0Y z1 +i0Y ^Z +i0! Y1 i1a +i0# y1 +i0x i2q +i0x i2h +i0x $h +i0. x12 +i0x ] +^_ i0x +] i0w $u +i0w ^r +i0w o1t +i0W ^N l +i0W ^J +i0w i0p +i0w $e +i0W ^A +i0w ^a +i0w ,4 +i0w -1 +$@ i0w +$, i0w +^. i0w +i0v z1 +i0v o5q +i0v i0J +i0u ^z +i0U i0N +i0u ^G +i0* u +i0t y2 +i0t ^O +i0t ^o +i0T i1W l +i0! T8 +i0t ^4 +i0T *31 +^. i0T +i0s $W +i0S ^L +i0s i52 +i0S i1h D4 +i0s i0x +i0s .3 +i0s $; +i0r z1 +i0R sas +i0r L1 +i0r l +i0R $J } +i0r i2q +i0r i27 +i0R i0b +i0r *27 +i0Q ^K +i0p y1 $6 +i0P ^V +i0p ^r +i0p i6w +i0p i1w +i0p $f +i0p ^e +i0p $6 y1 +i0P *32 +i0P *23 +{ i0p +i0N y2 +i0n x51 +i0N ^V +i0n l +i0n i2q +i0n ^g i79 +i0n ^8 +i0m y4 +i0M x21 +i0M o2p +i0M o1Y +i0M $L +i0m i4r +i0M *42 $! +i0M $! *42 +i0M +i0m $$ +$& i0m +i0l z2 +i0l *05 +i0{ L0 +i0` L0 +i0$ ^L +i0k Z1 +i0k spe +i0k ^l +i0k i0m +i0K $d +i0K ^5 +i0K ^- +i0k $! +^- } i0k +i0J ^P +i0j i5p +i0J i0L +i0J ^B +} i0J ^A +i0J -9 +i0J *70 +i0I x12 T4 +i0I $u +i0i o4e +i0i ^N +i0I ^b i0u +i0! { iB@ +i0i +5 z2 +i0i $4 +i0I +3 +i0! i1a Y1 +i0. i0z +i0. i00 +i0I $! +i0I ] +i0H $Z +i0H x04 $4 +i0H $i +i0H $d +i0H $4 x04 +[ ^- i0h +^, i0h +i0G u $S +i0G $S u +i0g ^k +i0g i35 +i0G ^D +i0g ^c +i0G ^A +i0g $! +i0F y1 +i0F T4 +i0f ^r +i0F ^2 +i0f .2 +} i0f +i0E Z1 +i0e seu +i0E p3 $e +i0@ ^E +i0e $^ +$^ i0e +i0d $y +[ i0d o5. +i0d i3h +i0d ^f +i0c $v +i0C l $c +i0C L3 +i0C $c l +$+ i0C +i0c } +} i0c +i0b x52 +i0b ^l +i0B ^K +i0b ^d +i0a ^v +i0a r { +i0a p4 +i0A o60 +i0A o2. +i0a i6a p4 +i0a ^H +i0a ^g +i0a ,8 y1 +} i0a +i09 i2y +i09 D2 +i09 ^0 +i08 ^v +[ i08 $7 +i08 } +i0% ^8 +i07 z1 +i07 ^2 +i07 } +i07 ^@ +i0_ -7 +i06 i6- +i06 i58 +i06 ^0 +i05 $Y +i05 $e +i05 $7 +i0 *50 Y4 +} i05 +$- i04 $r +i04 -8 +[ i04 ^4 +i04 *13 +i0. ^4 +i03 ^R +i03 i81 +i03 i4s +i02 y1 +$. i02 +i01 ^W +i01 u $4 +i01 $I +i01 $4 u +i01 ^0 +i01 $] +i01 $. +] i01 +i00 z3 +i00 x35 ^J +i0+ $# +i0+ +i0@ +i0. $. +i0? ^/ +i0_ ^@ +i0^ +$- i0. +^ i0= +^I $@ +] $i +^h z5 t +$H Z3 y5 +{ ^h Z3 +$h Z2 x32 +$H Z2 +^H Z1 i2I +$h Z1 +0 +$H Z1 +^h ^Z +$H y5 Z3 +^h Y4 +^h Y2 '8 +^H Y2 +$h Y2 +} ^h y2 +$h x52 +$h x32 Z2 +$h $v +^h ^v +^h u +^h t z5 +$h t K +$H $S +$H $R +^h ^r +^h p4 ^G +$H p1 c +^H ^P +$h oBt +$h o2z +^h o2x +^H o1S +^h o1k *12 +^h L1 +$h K t +$h $k +^h ^j +$H i81 +$H i7_ +$h i6w +$h i5r +^h i5r +$h i5 +^h i3y +^h i2k +^H i2I Z1 +$h i18 +$h $H +^H ^G +^h $g +$H $E +^h ^E +^h $e +^H D4 +^H ^C +$H $B +^h $A +^h *97 +^h +7 +^h *67 +^h +6 +^h *52 +^h +4 x31 +^h *34 +[ ^H +2 +^H +2 +^h -2 +^H .1 +$h +0 Z1 +$H +0 +$* ^H +$. ^H +[ ^H +^H $? +$h $@ +$h [ +} ^h +^h $. +^h } +^_ ^h +$g Z3 Y4 +$G Z2 +$G z1 Y1 +^g z1 ] +^g ] z1 +$g Y4 +$G Y1 z1 +$G Y1 c +$g x61 o3x +$g $x +$g ^w +$G $V p2 +$G u +6 +^G $u +^g ^u +$G ^T +^g $t +$G $s +$g $r +^g $q +1 +^G p5 $f +^g p2 +8 +$G oB0 +$g oAn +^G o8K +^g o6o +^g o54 +^g o5- +$g o3x x61 +$g o34 +^g o2k +^G ^O +^G $N +$g $n +^g ^n +^G ^M +^g $M +^g $m +^G ^l t +^G l L3 +^G L3 l +^g $l +^G $K +$g i7k +$g i61 +$g i4l +^g i3j +^g i1z +$g i1y +^g i1y +^G i1v u +$g i1g p4 +^g i1d +$g i11 +^G i0T +$g i0M +^g i0K +^g i0I +^G i0A +^G $g *68 +$G $g +^G ^g +^g ^F +$g $f +^G E z1 +^g D4 +$G D3 +^g d [ +$G c Y1 +^g ^8 +$G +6 u +$g +6 +$g ^6 +$G ,5 +$g $5 +$g $3 +^g .3 +^g ,3 +$g +2 +^g +1 $q +^g *13 +$G ^1 +$g +1 +^g *04 +$G ^0 +^. ^G +$g $@ +$g $! +$. $g +$ $g +{ $g +^g $+ +^g $% +^$ ^g +$f Z5 +$f Z4 +^F z3 +$f Z1 $1 +f Z1 ^* +f ^* Z1 +^F $z +^f ^z +f y4 $1 +f Y3 *10 +$f Y1 TB +f xA9 t +f xA8 +f x98 -7 +f x87 +f x85 K +f x83 ] +f ] x83 +f x82 -6 +] f x7B +f x76 +f x72 u +f x6B ^1 +f x68 *53 +f x67 t +f x67 +{ f x67 +} f x65 +f x64 c +f x63 $R +} f x5B +f x47 E +$F x41 +f x37 *20 +f x37 +1 +$f x31 +^f x31 +f x23 K +f x23 $9 +f u x72 +f u i6G +f t xA9 +f t x67 +f t { +f { t +f $s $S +^f s0q +^F ^S +f $R x63 +f ^p +f oB9 +f o8A '9 +^f o4s +^F o2o +$f o0F +$F $M +$f L6 +^f ^L +f K x85 +f K x23 +^f K i2e +f K +7 +f K +f iA. 'B +f i6G u +^f i6a y1 +^F i5g +$f i4j +^F i35 +$f i2p +$f i2j +^f i2e K +$f i27 +^f i1s +^f i0s +$f i0p +7 +^F i0K +^F i0I +^f i0D +$f i0c +^f i05 +$f $i +^f $h +^f ^h +$F $G +^f ^G +f f o0P +f E x47 +f E D8 +f E D6 +f E 'B +^f E -5 +^f d 'B +f D8 E +f D6 E +f c x64 +f ^b x25 +f 'B E +^f ^B +f -A x72 +f ^a i1e +f *A7 *02 +^f ^A +^f ^a +f $9 x23 +f '9 o8A +f *96 x34 +f *8A +f -7 x98 +f +7 K +$F ,7 +f -6 x82 +{ f *67 +f *64 *20 +^f -5 E +f *53 x68 +f *53 +f *43 *20 +$f *42 ^F +$F $3 +$f ^3 +^f $3 +f *20 x37 +f *20 *64 +f *20 *43 +^f *20 +^F $2 +$f -2 +f $1 y4 +f +1 x37 +f *10 Y3 +f *02 *A7 +$$ ^F +$@ ^F +$. ^F +^F ^@ +$f $@ +$f $= +$* ^f +$. $f +[ ^f +^f $+ +] ^E z5 +^E z5 ] +^E ] z5 +^E z5 +$$ E Z4 +$. E Z4 +E Z3 ^K +E z2 ^U +E Z2 $* +] E z2 +^e z2 +^E Z1 k +E z1 i1T +^e ^z +E Y5 x23 +E Y5 +E Y4 x32 +^e y3 +E y2 o0T +$E Y2 D2 +E y2 +6 +E Y2 ^! +E ^! Y2 +E Y1 *23 +E y1 +E xA2 +E x71 T7 +E x71 T3 +E x61 $$ +E $$ x61 +$e x61 +E x51 $6 +E x51 +E x42 +E x41 +E x32 Y4 +E x21 *21 +^e ^W +^e ^v k +$E $U +E ^T ^S +E T6 $D +E T6 -8 +E T6 .2 +E T5 i46 +E T5 -B +E T4 ,7 +E T4 *65 +E T3 x71 +E { T3 +E T2 $* +E $* T2 +E T1 *23 +E T1 ] +E ] T1 +E sr1 +E sn1 +E smM +E slr +E sh1 +E scI +E sbB +E s 7 +E s3e $! +E $! s3e +$E $s +E ^R ^K +$E $R +E $r +$E $r +$e ^r +E q x48 +$e ^q +E p1 x64 +$e p1 x56 +^e p1 c +^e ^P +E ^O T2 +E oB9 +E oB1 *76 +E o8? +E o7W +$e o7m +E o7L +E o7d +E o7a .5 +E o6t +E } o6R +$e o6p +^E o6* +E o5Z K +E o5Y ] +E ] o5Y +^e o55 +E o4M +E o4J +E o4b +E o49 +^E o44 +E o3s +E o3G +^E o2K +^E o1W +E o1S z1 +E o1S K +E o1o +6 +E o1J +^e o1d +E o1C +$E o0L +$e $n +E $M Z1 +$E $M +^E ^M +E $m +^e $m +E $l $e +E ^K Z3 +^E k Z1 +E K o5Z +E K o1S +E K $. +$+ $e k +^e ^J +E iAb +^E i97 +E i9@ +E i9 +E i7l +^e i7E +$. E i75 +E i70 -6 +E i7= +^E i68 +$e i5o +E i5m +E i5@ +^E i4T +E i4K +E i4F +E i4A +E i4, +^e i3y +E i3 +E i2 Z1 +E i2r x91 +E i1y ,4 +^E i1g +E i1! *81 +^e i10 +^E i1@ +E i0e } +^e i06 +E i05 z4 +^e ^g L2 +^e ^G +E $e +E $D T6 +E D8 +^e D5 +E D4 +3 +^e D3 +$E D2 Y2 +E D2 $5 +E d $" +E d +E -B T5 +E ^A o7# +E ^A i1E +E ] $A +^E ^A +$e *97 +6 +$e *96 +E $. *94 +E ^9 $4 +$( E ^9 +E -8 T6 +E } $8 +E '8 +E ^8 +E ,7 T4 +E *76 oB1 +E $$ -7 +E -7 $$ +$} E +7 +} E $7 +$e $7 +E $6 x51 +E +6 o1o +E -6 i70 +$e +6 *97 +E *65 T4 +E *64 *53 +$@ $e *64 +$e -6 +E .5 o7a +E $5 D2 +E *54 $@ +E $@ *54 +E *53 *64 +} $e *53 +E +5 +E $4 ^9 +E +3 D4 +E $3 *32 +E *32 $3 +^e *32 +E +3 $$ +E $$ +3 +E .2 T6 +$e *26 +^e *25 +E *23 Y1 +E *23 T1 +E $. ^2 +E $2 +E -2 +E ^2 $. +E ^2 +$E $2 +E ^1 o7o +$! E *10 +E $! $1 +$& $e +0 +$# E +$* [ E +} ^E +{ E +[ E $@ +[ $@ E +$e [ +^e $* +^e $@ +d $z L8 +$! d Z4 +d z3 *41 +d Z2 x61 +d Z2 .6 +d $% Z2 +} ^d Z2 +{ $d Z2 +^d Z2 +$d Z1 +$d $z +d Y3 x04 +d y3 ,4 +d Y2 y2 +d y2 Y2 +d Y2 +$d Y1 y1 +$d y1 Y1 +d Y1 x54 +^d Y1 r +$D Y1 } +^d y1 +$d $y +d ^X u +d xB5 +d xB4 x03 +d xB2 ,5 +d xA2 -7 +d x92 +1 +d x83 *38 +^d x82 +d x67 t +d x64 o7B +d x64 'A +d x61 Z2 +d x61 o65 +d x57 t +d x57 l +d x57 +d x54 Y1 +d x53 ] +d ] x53 +^D x52 x03 +d x45 x78 +d x43 t +^d x31 +^d x24 y2 +d x21 t +d x14 c +] d x14 +$ d x08 +$- d x05 +d x04 Y3 +d x04 p1 +d x04 d +d x03 -5 +d x02 y4 +d x02 i4k +d x01 t +^d $v +d u ^X +d u ^R +d u o3O +d u o11 +d u i83 +d u i6G +d u i58 +d u D9 +d u *AB +d u ^A +d u '9 +d u *53 +d u *45 +d u *40 +d u -4 +d u ^2 +d u -0 +d t x67 +d t x57 +d t x43 +d t x21 +d t x01 +d t $T +d t o77 +d t o71 +d t i85 +d t i79 +d t i70 +d t i6H +d t i6G +d t i51 +d t i5$ +d t ^G +d t D8 +d t 'B +d t ,B +d t ^A +d t ^7 +d t *63 +$D T5 T0 +d T4 +d t -4 +^D T0 y5 +$D T0 T5 +^d ^T +d $s u +d $s t +$D s6. +d s1! +^D s0C +$d s0- +d ^R x76 +d ^R u +^D R1 K +^d r +0 +^d r +d $Q +d ^q +d $p ^F +^d ^p *25 +$d $p +d oBo +d oB. +d oAf x06 +d o77 t +d o71 t +d o6a +$D o65 +$? $d o65 +d o5s L4 +d o5@ +d o3O u +^d o3a *13 +d o2a +d o1h [ +d o11 u +$D o0p +d o0O +d o0g +d $O +d ] $O +] d $O +d $n Y1 +d $m u +d ^M ^L +d l x57 +d l i71 +d l 'B +d L7 ] +d ] L7 +^d L7 +d l $7 +d l *63 +d L4 o5s +^D l } +^D } l +d l +$d $l +^D K R1 +d k ^d +d K -B +^d $k +6 +^d k $0 +d [ ^K +d ] ^k +d ^k ] +d iB9 x35 +d i9; +d i9 +d i85 t +d i83 u +d i7L +d i7d +d i79 t +d i73 ] +d ] i73 +d i71 l +d i70 t +^d i7@ +d i6g x67 +d i6G u +d i5$ t +d i5S +^D i5E +$d i5D +d i58 u +^d i54 +d i51 t +d i5- +^d i5- +$D i4v -0 +d i41 c +^d i3. +^d i1e +^D i1. +d i02 +^d i02 +d $h t +d $g Z1 +$D $g +d ^F $p +^d ^e +d D9 u +d D8 t +d D7 [ +$d D5 +d D1 ] +d ] D1 +$d D1 +d D0 i6o +d c x14 +d c i41 +d $C ^c +d ^c $C +d c -6 +$D $C +d 'B y5 +d $b u +d 'B t +d ,B t +DB oA* +DB o1s +d 'B l +d -B K +DB i6i +DB D3 +DB D1 +d *B9 x06 +d +B +7 +d *B6 +5 +d $B +^d $B +DA Y2 x42 +DA x42 Y2 +d ^A u +DA o9a ] +DA ] o9a +DA o5f +d *AB u +d *A2 x61 +^D ^A +d $a [ +d [ $a +^d ^a +d $9 Z1 +d '9 u +D9 s7I +D9 o9i +D9 o9e +D9 o7g +D9 o0V +D9 i6 +} D9 ^c +D9 *72 $. +D9 $. *72 +D8 y2 D4 +D8 xA1 c +D8 x6B +D8 x61 t +D8 t x61 +D8 R6 +D8 oAn +D8 oA9 +D8 o9* Y1 +D8 o7k +D8 o6u +D8 o4@ +D8 iBa +D8 c xA1 +D8 +6 *50 +D8 *50 +6 +d *84 x06 +D8 *40 $. +D8 $. *40 +$! D8 +} D7 z4 +D7 $z +d -7 xA2 +D7 x03 $1 +d ^7 t +D7 o9 +D7 o6b +D7 o3e +D7 o0S +D7 ^l +3 +d $7 l +D7 i5j +D7 i5 +D7 i3y +D7 $e u +D7 ^c +d +7 +B +$d $/ *76 +D7 *48 D1 +D7 *40 +$d *74 +^d *73 +D7 $1 x03 +d *71 *35 +D7 $_ +^[ D7 +d $7 +d ^6 z3 +$* D6 Z2 +d .6 Z2 +D6 Z1 +D6 x94 +D6 ^v +D6 t [ +D6 [ t +D6 t +D6 scm +D6 R5 +D6 o7b +D6 o5x +D6 o4k +D6 o3g +D6 o3c +D6 o0h +D6 ^n +D6 l $i +^d +6 $k +D6 $i l +D6 i78 +D6 i4q +D6 i3s +D6 i3o +D6 i31 +D6 i0O +D6 ^e +$. D6 c +d -6 c +D6 $9 +$. D6 +7 +D6 ,6 +D6 *54 +d ,6 *54 +D6 +5 +d *63 t +d *63 l +D6 *35 +D6 ^2 +D6 ] +d ,6 +D5 Z5 t +d ,5 xB2 +D5 x01 +4 +D5 t Z5 +D5 saX u +D5 r +D5 p4 o5u +D5 p2 [ +D5 p1 '9 +D5 o8k c +D5 o7i p5 +D5 o6 +9 +D5 o4x +D5 o4f +D5 o4D +D5 o3D +D5 o0T +D5 o0J +D5 o0$ +D5 K +D5 $k +D5 i67 +D5 i4g +D5 i0Z +D5 ^f +D5 E z2 +D5 d c +D5 D7 ^i +D5 c z2 +D5 c o8k +d +5 *B6 +D5 'A +D5 $9 Z3 +D5 $9 $4 +D5 -8 y5 +D5 $7 +D5 -6 +D5 ^6 +d *53 u +D5 ^$ +$D -5 +^D ^5 +d +5 +D4 Z2 R4 +$? D4 Z2 +D4 y5 x42 +D4 y2 *60 +D4 ^y +D4 x21 r +d -4 u +d -4 t +D4 R4 Z2 +{ D4 r +D4 p4 'A +D4 p2 Y1 +D4 o5e +D4 o0U +D4 ^m +D4 l f +$= D4 l +D4 K Y4 +D4 K } +D4 i7s +D4 i5. +D4 i3y +D4 i3S +D4 i2i D1 +D4 $g +D4 f l +D4 $e +D4 ^e +D4 ^c +D4 ^A i0R +D4 *71 +D4 $? -7 +D4 -7 $? +d *45 u +D4 *42 *32 +D4 +3 +^D *42 +^d *41 +d *40 u +$? D4 +^d ^4 +D3 z4 u +D3 Z2 -A +D3 $? Z2 +D3 ^y ^t +D3 y5 u +$? D3 y3 +D3 Y2 +D3 y2 +d -3 y2 +D3 y1 *17 +D3 u z4 +D3 u y5 +D3 sa@ +D3 $R $1 +D3 $Q +D3 o4m +D3 o4! +D3 o2o +D3 o2k $? +D3 $? o2k +D3 o0f +D3 $L +D3 $k +D3 i6c +D3 i4x +D3 i4- +D3 i2d +D3 ^f +D3 $e +D3 ^c +d *3A +D3 *74 +d *35 *71 +d *35 *17 +D3 *26 +$d *32 +D3 *02 +$! D3 *01 +D3 -0 +D3 $, +} D3 +d ,3 +$d -3 +D2 Z2 d +D2 y5 +D2 y3 Y2 +D2 Y2 y3 +D2 y2 *24 +D2 x73 +d ^2 u +D2 t [ +D2 [ t +D2 sny +D2 saj +D2 [ p1 +D2 o7r +D2 o2m t +D2 o2M +D2 o2d +D2 o1t +D2 o0z +D2 o0G +D2 K i3w +D2 i6q +D2 i4p -0 +D2 i3w K +D2 i1r ^c +D2 i12 +D2 ^. i0, +D2 $g +D2 ^f +D2 $e +D2 D6 $1 +D2 ^d +D2 ^c +$$ D2 c +D2 } ^A +D2 ^8 +D2 $7 +D2 *53 +D2 *20 +D2 $1 D6 +D2 -0 i4p +D2 $) [ +D2 $/ +D2 [ $) +$? D2 +^D -2 +^_ D2 +$@ $d ^2 +$ d $2 +D1 ^z Y4 +D1 $y d +D1 y5 c +D1 Y4 ^z +D1 y4 c +D1 y3 +D1 y2 $& +D1 $& y2 +d +1 x92 +D1 x32 +D1 $v +[ D1 t +D1 p2 ] +D1 o7p *35 +D1 o5# Z1 +D1 o4p +D1 i54 +D1 i44 +D1 i4@ +D1 E T6 +D1 $d Z1 +D1 D4 +D1 ^D +D1 C z2 +D1 C +D1 $c +D1 $a Y1 +D1 *90 +d *17 *35 +^# D1 +7 +D1 $6 +D1 *54 +5 +D1 *35 o7p +D1 $+ +] D1 +^D -1 +d ] $1 +D0 y3 D9 +D0 y3 +4 +D0 Y3 +D0 x92 [ +d -0 u +D0 ^s ,3 +D0 r p1 +D0 r i5a +D0 p1 r +D0 o9v +D0 ^@ o43 +D0 o4 +^d $0 k +D0 i5r +$D -0 i4v +D0 i2t +D0 E ^T +D0 D3 *46 +D0 c $/ +D0 $/ c +d *01 ^d +D0 -0 +^D $* +$d { +$. $d +$- $d +$_ $d +$ d +] d $" +$c Z3 x46 +c $* Z3 +c Z2 s5% +C Z2 *47 +C Z2 } +$= C Z2 +] c z2 +C z1 ^e +c Z1 *32 +$. C Z1 +$* c Z1 +C Y5 x18 +^C Y5 +$C y5 +^c Y4 y1 +c Y4 i1y +$c y4 $H +^C Y3 f +^c Y3 +c Y2 $z +C Y2 $# +$. C Y2 +] C Y2 +^c y1 Y4 +C Y1 $A +C Y1 .6 +c y1 ,3 +$^ C Y1 +^C Y1 +$) c Y1 +C $X Z2 +c $x T5 +c xB1 +c xA4 +$! c x83 +$c x82 +c x73 o5R +C x63 ^1 +c x63 ^@ +c x51 z2 +c x51 +$c x46 Z3 +c x41 o33 +C x34 f +c x34 +^c x32 +c x24 p4 +$! c x21 +c x12 o21 +C x04 +{ $c x04 +$c ^x +$c ^W R8 +^c ^W +c ^. ^V +$c ^v +c TA +$c t ^9 +c } T8 +] C T7 +c T5 $x +C T5 $+ +C $+ T5 +c T4 R3 +c T4 o3A +C T4 *50 +C T4 *03 +c T4 { +c T3 *86 +C T3 +c T2 +$# c T1 +C ^t +^c ^t +c swn +c swK +C sTY +c ssv *52 +C sS5 +c sio +c sia +C shW +c sa@ +9 +$c s9A p3 +c s5% Z2 +^C s2s +C s1) +c s1* +^c r i3n +c RB ] +c ] RB +c R5 R4 +c R4 R5 +c R3 T4 +^c r +^c $Q +C $P $O +$c p3 s9A +$* c ^P +C oB2 +$C oAJ +C oA1 +c o9o +C o96 +C o91 +c o8b +C o86 +^C o7i +c o7d +c o7B +C o72 +$C o6W +c o6k +c o5Y +c o5X +c o5R x73 +C o5R +c o5R +c o4P +c o4F +C o41 +^c o3t +c o3r +c o3A T4 +C o3a k +c o33 x41 +^C o2x +$c o2v +c o2K +c o2b +^C o2# +c o2 +^C o1r +^c o1i +C o1E +^C o1C *30 +$c o1b +C o14 +c o11 ] +c ] o11 +$c o0s +$C o0A +$c o01 +$c $n c +$c ^n +C ^l y2 +C k o3a +$c k ^j +c K i3r +C K $@ +C K +c $K +^c ^K +c iB +C i95 +c i9 +c i8r $4 +c i8n +$C i8L +c i7_ x31 +c i7r +$! c i7r +$c i6y +$c i6s +c i6p +c i6n +B +C i61 +^C i5y +] c i5h +c i5E +C i5# +c i4v +c i4s +$C i4E +$c i47 +7 +c i4@ +c i3T +c i3r K +C [ i2B +^C i2b +^C i2- +c i1y Y4 +^c i1k +^C i0I +$c $H y4 +C f x64 +$C $e +^C $e +C d x07 +C d x05 +^C d f +c $d *74 +$. c D6 +C D4 +c D2 ] +c ] D2 +$$ c D2 +} c ^D +$c c $n +C $B Z1 +c ,B +C ^A z2 +c ^A T2 +C +A +C 'A +^C $A +C ] $a +$c ^9 t +c +9 sa@ +c $. -9 +c -9 $. +c +8 Z5 +c *87 $? +c $? *87 +c *86 T3 +C *86 $1 +$@ c *86 +c *74 $d +$C .7 +C .6 Y1 +^c *65 ^D +c *65 $! +c $! *65 +c ^5 T5 +c .5 K +$- c *57 +c *52 ssv +C *50 T4 +$. c ,5 +] c ^5 +[ c ^5 +c $4 i8r +c *45 i3L +C ^4 +$C .4 +c $% .4 +c .4 $% +c ^4 +$- $c *36 +c *32 Z1 +] C *32 +^C *30 o1C +$$ c .3 +C *23 +] C *23 +C ^2 +$c $2 +$c .2 +c ,1 y5 +C +1 y1 +C ^1 i63 +C $1 *86 +c .1 ^2 +C ,1 +^C $1 +c $1 +^c ,1 +c -0 ^A +C *03 T4 +$c *03 *05 +^c ^0 +$C $! +$$ ^C +} C } +^_ ^C +$* ^c +$. $c +$. c +$_ $c +{ $c +] ^c } +[ c $/ +[ $/ c +^c $- +^B z4 +'B z1 E +-B Z1 +} $B z1 +^b Y2 +$b Y1 *05 +^B y1 ] +^B ] y1 +] ^b y1 +^B ^Y +,B x72 $! +,B $! x72 +,B x64 +.B x62 +^b x62 +'B x41 u +^B x13 +^B x08 +$b ^w +^b ^w +^B ^V +'B u x41 +$B $U +^b ^U ++B t +-B t ] +-B ] t +^b ^S T1 +^b ^s +$b r +$b p5 { +$b { p5 ++B p3 +^B p2 i1g +^b ^P +$B o6M +^B o4b +^b o3a +^b o2x +$b o1w +'B o1s +^B o1l +^B o1@ +'B o0g +$b o0f +^B $o +^b ^L +} ^b l +^b ^K ++B iB. +'B i9s +^b ^i '9 +$b i8z +^B i8I +$b i5g +$b i53 +^b i4g +$b i4a +'B i4_ +$b i3j +$B i2W l +^b i1w +$b i1k +^b i1f +$b i0S +^B i0K +^B i01 ] +^B ] i01 +$b $i +^b $i +^B ^g +^b ^G +$b $g [ +$b [ $g +^b ^g +$B ^e +^b D5 +$b D3 p3 +$b D2 +{ ^b ^D +$b $d +^b ^c +*BA x56 +'B ^A +^B +A +$B $a +*B8 x64 +$b *85 x51 +$. *B8 +$b -7 +} ^B ^6 +*B5 x64 +^B $4 +$b ^3 ^A +$b *20 +^B ^1 +^b +1 +$b *05 Y1 ++B +0 +$B +0 ++B $# +$B $! +$@ +B +$@ ,B +$} +B +$_ $B +] +B +'B $. +'B $! +-B $@ +^B $- +^B ^# +^_ ^B +$b $@ +$. $b +$/ ^b +$- $b +$_ $b +] $b $! +^b $? +^a z4 +^a z3 +^A Z2 +.A Z1 $. +'A $z +$a $Z +$A y4 *43 +^a Y4 +$a y4 [ +^a y3 $M +$A y3 +^A y3 +-A Y2 +$a Y1 E +^A y1 +^a x71 +^a x61 K +.A x61 +^a x54 +^A x42 +^a x42 +^A x12 +$a x01 +$A $W +^A ^u k +$a u i59 +$a u i1F +$a $u +,A t K +^a t i0m +$A TA iA_ +^A T6 +$a t *31 +} $A t +,A t +^A seo +$A saA +^A s9D +$a s8, +^A s2C +$a s0. +$a ^S +$A r z4 +$A r Y2 +^a ^r .2 +^A $R +$a r +$A p3 i3y +^a ^P +$a ^p +$A oA4 +^a o88 +$A o7i +^A o7c +$a o7b +$a o7A +^a o79 +$A o7! +'A o6w p5 +$a o67 +$A o64 +^A o6# +$a o6. ++A o5g +^a o40 *57 +^A o3z +^A o38 D8 +$A o3! +^a o2. +^A o1y *32 +^A o1n +^A o1J +^A o1A +$A o19 +$A o12 +'A o0z +$A o0c +$a o02 +^A $O +^a $M y3 +$A l ^D +^a L7 +^a K x61 +,A K t +$a K +$A iAM +$a iAm +$A i95 +'A i8 *0B +'A i8 +$a i7V +,A i7_ +$a i6i +^A i6a +$A i63 +$A i61 p2 +$A i61 +^a i5t +'A i5" o5n ++A i5l +$a i5i p2 +$a i59 u +^a i4o +$A i4m +$A i4g +$a i4E +$a i46 +$A i40 +$a i40 +$a i3q +$a i3n +^A i3. +^a i3/ +^A i2o x61 +^A i2f +$A i1n +^a i1J E +$a i1F u +^A i1$ +^A i0p +$a i0P +^a i0p +$A i0M +^A i0B +^A i03 +^A i02 +^a i01 +^A $f +$a E Y1 +^A ^E +^A $e +^A D8 o38 +^a D8 *31 +$a D8 +'A D6 +$A D5 *31 +^A D5 +$a D5 +-A D2 +$a D1 +^A d +^a ^b z1 +*AB $s +$A *B7 ++A 'B +-A +B +,A $b +$A *A8 +$A +A +*A9 i60 +*A9 D6 D8 +^a .9 +9 +*A9 $- +*A9 ^( +*A9 +$@ ,A ,9 +^A +9 +^a .9 +*A8 oAc +*A8 DA ,4 +*A8 ,4 DA +$A .8 +*A7 *89 +$A *76 +'A .7 +-A +7 +^A ^7 +^a -7 +*A6 D5 +*A6 +A +*A6 *97 +] $a *64 +$a ,6 +^a *57 o40 +^a *56 +4 +$A ,5 ,6 +$A -5 *14 +$a *50 +$A ,5 +*A4 t +^a *47 +^a *46 +^a +4 *56 +*A4 ] +$A +4 +^A +4 +^A -4 +^A ^4 +^a *37 i0p +^A *32 o1y +$a *31 t +^a *31 D8 +$A *31 D5 +^a ^2 D5 +*A2 '8 *70 +*A2 *70 '8 +[ $A *24 +*A2 ] .1 +*A2 .1 ] +'A ^2 +$A *14 -5 ++A $1 +$A -1 +-A $1 +$a $1 +^a $1 ^@ +^a ^@ $1 +$A ^0 +^A $0 +$a +0 ++A $. +$A $! +$* +A +$. ,A +$! -A +$, $A +$ $A +} ] ^A +} ^A ] +{ $A +'A $ +,A $* +^A $# +^A $/ +^A $= +^% $A +$a $* +$a $, +$a $` +$/ $a +$? ^a +] ^a +^* $a +^. ^a +^ ^a +$? ^9 z2 +^9 z2 +$9 Z1 y5 +$9 Z1 +7 +^9 z1 +$9 $Z +$9 y5 Z1 +'9 y4 t ++9 Y4 E +$9 y3 ++9 Y2 x83 +-9 Y2 +$9 Y1 $x +'9 Y1 $p +$9 x92 +^9 x54 ^d +$9 x41 +$9 x31 +$9 x24 c +'9 t y4 +$9 TB +$9 T7 K +$9 $T +-9 shp +$9 sae +,9 s92 C +$9 $q Z3 +-9 oA8 +-9 oA3 +$9 o9* +-9 o8y +$9 o8b +^9 o4& ,1 +$9 o3c +'9 o34 +'9 o2y +$9 o1i +-9 $L +$9 K T7 +$9 iB1 ++9 i9d t +$9 i73 +'9 i6o +^9 i6b +'9 i6a +,9 i6, +'9 i5l +$9 i55 +$9 i4, +$9 i3, +$9 i1u +$9 i1. +$9 i1- +-9 i0w +$9 ^G ++9 E Y4 +-9 E -5 +,9 E $@ +,9 $@ E +'9 d x57 +^9 D5 +-9 D4 $@ +-9 $@ D4 +$9 D2 +$9 $D +$9 c x24 +,9 C s92 +*9B 'B *79 +*9B *79 'B ++9 +A Z1 +*9A x82 +*9A i60 ++9 ^A +-9 'A +$9 $a +.9 $a +$9 *97 +$9 *95 +*98 t ] +*98 ] t +*98 o9a +*98 ,8 ^a +*98 +7 +-9 *86 ++9 ,8 +*98 [ +$9 $8 +$9 +7 Z1 +*97 u K +*97 K u +*97 K +*97 'A +-9 *79 +*97 *85 *69 +*97 *69 *85 ++9 $7 +$9 .7 +$@ *97 +$, *97 +.9 +7 +-9 $7 +*96 x85 +*96 x82 +*96 x42 +*95 x06 $3 +*95 o99 +*95 o92 +*95 i93 +-9 -5 E +*95 *84 +^9 *56 d +*95 +5 +*95 $3 x06 +-9 -4 +^9 .3 *02 +*92 x42 +7 +,9 $2 +^9 ,1 o4& +^9 *14 +^9 ,1 +^9 ^@ *07 +^9 *02 .3 ++9 $0 +^9 $0 ++9 $+ ++9 $* +$9 $* +$9 $@ +$% .9 } +$@ -9 +$/ -9 +$! -9 +$ $9 +} -9 +'9 $! +'9 } +.9 $! +,9 $+ +-9 ] +^9 $* +^9 $! +^. { .9 +$8 Z4 +$8 Z3 +0 +^8 Z2 z1 +^8 z2 +^8 z1 Z2 +^8 z1 x45 +^8 Z1 *27 +,8 ^z ++8 Y5 x32 +$8 Y5 +-8 Y4 +$8 Y3 y2 +,8 Y3 u +-8 Y3 $! ++8 y3 +$8 y2 Y3 +$8 Y2 t +$8 y2 l +'8 Y2 i6 +$8 Y2 C ++8 Y2 +6 +-8 Y1 D1 +-8 Y1 C +$8 Y1 *43 ++8 $y ++8 x91 +^8 x31 +$8 x05 +^8 $v +,8 u Y3 +$8 t Y2 +-8 t K +$8 T9 +.8 t *68 +$8 T5 +^8 T5 +$8 T2 +^8 ^S p4 ++8 siw +,8 s7I +$8 p2 ] +$8 ^p +,8 oAb +,8 o9i +-8 o7t ++8 o7c E +.8 o6v +$! $8 o6k +$8 o6* +-8 o6_ +'8 o5v +-8 o5o +$8 o4y +,8 o4s ++8 o4- +^8 o4_ +'8 o34 +$8 o2z +$8 o23 +^8 o17 +$8 o0d +-8 o0b +$8 o0! +$8 l y2 +^8 ^l +-8 K t +$8 k $1 +$8 $K +,8 K +$8 k [ +$8 i98 ++8 i8e +-8 i8A +-8 i7. x15 ++8 i7/ +'8 i6 Y2 +,8 i6s ++8 i6# ++8 i6( +$8 i5t +-8 i5 +-8 i4m +$8 i3x +'8 i2W +'8 i2 +-8 i2- +$8 i1l +^8 i14 *34 +^8 i1/ +^8 i1! ++8 i0K +$8 i0a z1 +^8 ^I +-8 ^g u +^8 $f ++8 E o7c +$8 $E +$8 ^E +-8 D6 $+ +-8 $+ D6 +$8 D5 ++8 D3 +-8 D1 Y1 +$8 C Y2 +-8 C Y1 +$8 ^C +-8 c $? +-8 $? c +*8B D8 ++8 $b +$8 $b +$8 ^b +*8A x34 $. +*8A $. x34 +*8A E ++8 $A +*89 o1i +$ .8 *96 ++8 $8 +$8 .8 +*87 Y3 t +*87 x71 $4 +*87 t Y3 +*87 o7i +*87 o57 +-8 *78 *69 +*87 $4 x71 +*87 *46 +,8 *73 $. +,8 $. *73 +-8 *71 $. +-8 $. *71 +$8 ^7 +*86 Z1 z1 +*86 z1 Z1 +*86 Y4 x23 ++8 +6 Y2 +*86 Y1 y1 +*86 y1 Y1 +*86 x74 i5a +*86 x23 Y4 +*86 ^m +*86 ^k +$% *86 i72 +*86 c *97 +$@ *86 c +*86 ^a -A +*86 *97 c +-8 *69 *78 +.8 *68 t +*86 *38 p4 +*86 *34 x01 ++8 .6 +$$ *86 +^@ *86 +*85 x63 *41 +*85 x52 +*85 o5% +-8 *56 *76 +*85 *41 x63 +$! -8 ,5 +$- *85 +{ ,8 ,5 +-8 $! .5 +-8 .5 $! +$8 *43 Y1 +*83 x24 +*83 o0S +-8 *31 +,8 *30 +-8 *30 +*82 E *41 +*82 *41 E +$8 ^2 +*81 o7M +*81 o0W +$8 $1 k ++8 *12 +$8 .1 +$8 +0 Z3 +*80 '8 +^* *80 ++8 [ +$8 $. +$8 $ +$8 ^_ +$# ^8 +$* +8 +$$ -8 +$, -8 +$ +8 +$ .8 +.8 $. +.8 $! +,8 $+ +,8 $! +,8 ] +-8 $_ +^8 $, +^7 z3 y3 +^7 z2 +^7 z1 u +,7 z1 p2 +$7 Z1 D2 +$ ^7 Z1 +^7 $z +.7 y5 x64 +$7 Y5 +'7 y5 +$7 y4 +'7 Y3 T9 +,7 } Y3 +-7 Y2 ++7 Y1 Y4 ++7 Y1 k ++7 Y1 $9 +} '7 y1 +.7 } y1 +-7 x81 +$7 x72 +$7 x63 +$7 x52 +^7 x51 ,1 ++7 x51 +$7 x46 $7 +-7 x42 +{ $7 x24 ++7 x21 o0F +.7 x05 +^7 u z1 +.7 u +-7 $u +$7 t T1 +$7 T3 +$7 T1 t ++7 srk +.7 sh@ +-7 sDS +$7 $+ s+5 +.7 s2L +,7 ^s +-7 R0 +$7 $R +$7 ^R +$7 $q +,7 p5 o8r +-7 p1 x06 +.7 o9. +.7 o9^ +,7 o9 +-7 o84 +^7 o73 } +$7 o7 +.7 o6x +$7 o6l ++7 o68 +-7 o5N ++7 o5l +.7 o5f +$7 o5- +$7 o5_ +.7 o4r K +,7 o4h +-7 o42 +$7 o3_ ++7 o2z ++7 o2w +-7 o2K ++7 o2h +$7 o1@ ++7 o0w +$7 o0w +^7 o0u +2 +-7 o0R ++7 o0m ++7 o0K ++7 o0F x21 +-7 o0d ++7 ^n +$7 ^n +^7 $M +$7 ^m +$7 $L +-7 $L ++7 k Y1 +.7 K o4r +$7 ^k +,7 k +-7 $J +$7 ^j +$7 iA8 +,7 i8t ++7 i85 +$7 i82 ++7 i8 +-7 i7_ o7e ++7 i7j +-7 i74 ++7 i6t ++7 i6I .6 +-7 i6G +^7 i68 +'7 i67 +-7 i6. +-7 i6 +'7 i56 +$7 i54 +-7 i53 ++7 i5@ ++7 i5- +$7 i5. +$7 i5- +,7 i5. +-7 i5 +.7 i4b c +$7 i45 C +-7 i4- +$7 i3j *03 +'7 i3F ++7 i3? +$7 i2r +'7 i2q +'7 i2f +^7 i2- +$7 i1w +'7 i1i +'7 i11 +[ $7 i08 +^7 i06 +-7 i0/ +.7 ^F +$7 E ,3 +.7 E $3 +,7 E $3 +$} +7 E +} $7 E +^7 d k ++7 D4 +2 +$7 D2 Z1 +.7 c i4b +$7 C i45 +$7 c *14 +$7 c -0 +$7 C ++7 c +*7B D8 +$7 $B +-7 $a .6 +$7 ^A +.7 $A +-7 ^A +-7 ^a +*79 x52 +*79 x43 +*79 *A6 +*79 *98 $! +*79 $! *98 +.7 *97 +*79 +6 +*79 -4 +*79 } [ +$$ *78 x42 +*78 o3b +*78 o3a +*78 o2i +*78 i73 *59 +*78 $c +*78 +$7 $7 x46 ++7 *75 +,7 *75 +-7 *74 ++7 $7 +-7 $7 +^7 ^7 +*76 Y2 t +*76 Y2 E +,7 +6 Y2 +*76 x02 -6 +*76 t Y2 +*76 o7. +*76 o4. *24 +*76 o05 +*76 i6@ +*76 E Y2 +*76 DB +-7 .6 $a +*76 $7 Z1 ++7 *67 Y1 +-7 *67 +*76 *57 r +*76 $. ,1 +*76 ,1 $. +,7 *60 +*76 $ +-7 +6 +*75 x72 +*75 o5g +*75 o4@ +*75 i5b +*75 D9 +*75 $7 [ +*75 [ $7 +-7 *57 +*75 +6 +*75 ,3 +*75 *23 +$7 $5 -2 +-7 *52 +^7 $5 +*74 x43 $_ +*74 $_ x43 +*74 so +*74 o5w +*74 i4_ +*74 ,2 +*74 $@ +*73 x42 +*73 o5d +*73 o1G +*73 $i +$7 ,3 E +.7 $3 E +,7 $3 E +*73 ^a +A +*73 $A +*73 -7 +{ *73 *64 +*73 *16 +*73 -1 +,7 *30 *07 +$ *73 +*72 o6e +*72 o1f +^7 +2 o0u +*72 i5c c ++7 +2 D4 +*72 c i5c +*72 *63 +$7 -2 $5 +{ *72 *36 ++7 +2 *05 +*72 +0 +*72 +$7 +2 +$7 $2 +$7 ^2 +^7 ,1 x51 +*71 x21 ] +*71 ] x21 +*71 o1f +*71 o0b +$7 *14 c +*71 *06 +*71 } +*70 } x41 +*70 o6H +*70 o62 +*70 o3p +*70 L7 D4 +*70 D9 x32 ++7 *05 +2 +,7 .0 -0 +,7 $0 +$7 $# +$7 $/ +$7 ^@ +$7 ^. +$7 ^- +$. .7 [ +$- +7 +$- .7 +] $7 +] -7 +] ^7 +-7 $? +-7 } ++6 Z2 u +-6 Z2 l +$6 Z2 i6e +$. ,6 Z2 +-6 z1 Y2 +$* ,6 Z1 +^6 ^z +,6 y5 u ++6 y5 t ++6 [ y5 +-6 Y4 t +$6 y4 t +,6 Y3 E +,6 Y3 c +'6 Y3 *31 +$6 y3 +{ +6 y3 +-6 Y2 z1 ++6 Y2 r +-6 Y2 D3 ++6 Y2 c ++6 Y2 .2 +.6 Y1 *20 +$6 Y1 $# ++6 y1 +.6 y1 +^6 y1 +.6 x73 $a +$6 x43 +-6 x42 ++6 x31 +-6 x03 ++6 u Z2 +,6 u y5 ++6 u +6 ++6 t y5 +-6 t Y4 +$6 t y4 +-6 t oBO +,6 t d ++6 t *78 +.6 T5 ++6 $t +.6 s x +-6 srZ +^6 $s +'6 r p1 ++6 r f +-6 p2 ] +'6 p1 r +^6 p1 ++6 o8! +$6 o8 +-6 o78 +,6 o75 +-6 o75 +.6 o7, +-6 o5x +$6 o5D +$6 o5- +-6 o4z +'6 o4V +$6 o4u +$6 o4i +$6 o38 +.6 o3- ++6 o2w +-6 o27 $* +-6 $* o27 +-6 o2( +^6 o1i +,6 o1- ++6 o0x +$6 o0w ++6 o0p ++6 o0M ++6 o0L +-6 ^N +,6 $m +-6 l Z2 +$6 $L ++6 $l ++6 k D4 +,6 i9c +$6 i8 +$6 i6z +$6 i6e Z2 +,6 i6e +-6 i64 +,6 i62 +,6 i6. +-6 i5s ++6 i5a ++6 i4@ +.6 i4? +-6 i4 +^6 i4* ++6 i3x +-6 i3x ++6 i3q ++6 i3j +-6 i3h +$6 i32 ++6 i3 ++6 i2x +,6 i2t +$6 i1n ++6 i0, ++6 $H +'6 f k +^6 f +,6 E Y3 +$6 E -3 +$6 E ^$ +$6 $E +.6 ^E +-6 ^E +-6 ^e +,6 d t +-6 D7 +$6 D6 +^6 D6 +-6 D4 ^R ++6 D4 k +$6 D4 .9 +-6 D3 Y2 +,6 c Y3 ++6 c Y2 +.6 c ] +.6 ] c +,6 c +-6 $c +$6 ^B +.6 $a x73 +*6A *04 +^6 ^A +.6 $a +*69 u D7 +*69 u +*69 o91 +*69 o6u E +*69 E o6u +*69 D7 u +*69 D7 +$! *69 +.6 +9 +.6 $9 +*68 Y1 o5@ +*68 R4 +*68 o7% +*68 o7. +*68 o5@ Y1 +*68 o0q +*68 ^N +*68 ^g *86 +*68 c *79 +*68 +8 +*68 *79 c +,6 *87 $. +,6 $. *87 ++6 *86 +*68 *48 *54 ++6 ,8 +$6 $8 +$_ *68 +*67 Z2 ^b +*67 Y1 +*67 x81 -4 +*67 o5B +*67 o2[ +*67 i74 +*67 ^b Z2 ++6 *78 t +*67 *78 +*67 .5 +.6 *75 $. +.6 $. *75 +*67 -4 x81 +*67 *32 +.6 *71 ++6 -7 } +*67 $ +.6 -7 +-6 ] $7 +^6 ,7 ++6 +6 u +$6 ^6 r +.6 *63 +*65 Y3 i4- +*65 x41 +*65 u $S +*65 $S u +{ *65 o75 +*65 o6@ +*65 o5- +*65 o0q +*65 o0N +*65 o0f +*65 i64 +*65 i5d +*65 i4- Y3 +*65 i4_ p2 +*65 i4M +*65 i4e +.6 .5 ^g +*65 E $1 ++6 *56 y3 +*65 *47 ++6 *53 +} -6 *52 +*65 $1 E +-6 *51 +*65 +0 ++6 $5 +$6 -5 +{ *65 +} *64 Y5 +*64 t p1 +*64 p1 t +*64 o7f +*64 o4L +*64 o3c +*64 o2w +*64 o0Q +*64 o0q +*64 i7u +*64 i7s +*64 i4@ +$@ *64 $e +*64 $a *12 +] *64 $a +*64 '8 +.6 *47 x71 +{ *64 *73 +*64 *57 *34 +*64 *45 +*64 *34 *57 +[ *64 -2 +*64 *12 $a +*64 +1 +*64 -1 [ +{ *64 +] *64 +[ *64 +-6 $4 +^6 $3 Z1 +*63 T4 +*63 p5 +0 +*63 o73 +*63 o1n +*63 i0m +$6 -3 E +*63 ,8 +-6 *37 +*63 [ -3 +*63 -0 +} ,6 -3 +-6 $3 ++6 .2 Y2 +*62 x51 +*62 t p1 +*62 p1 t +*62 o5R +*62 i2w +*62 *57 +7 +*62 *56 +.6 *21 +.6 *20 Y1 ++6 +2 +*62 +$6 $2 +$6 ^2 +$! -6 -2 +.6 ^2 +^6 $2 +*61 Z5 Z4 +*61 Z4 Z5 +*61 Z1 +*61 ^t +*61 sC# +*61 R4 +*61 o7p +*61 o2z +*61 o0x +*61 i1. +*61 $d +*61 ^d +,6 -1 *06 ++6 -1 +,6 +1 +-6 +1 +*60 x53 +*60 t [ +*60 [ t +*60 o0C +*60 i4@ ] +*60 ] i4@ +*60 i3q +*60 i3j +*60 i3h +*60 i0z *15 +*60 *80 x61 +,6 *06 -1 ++6 +0 ++6 ^0 +^@ *60 ++6 $* ++6 $/ ++6 $- ++6 } +$6 $+ +$6 $. +$+ ^6 +$, .6 +$- $6 +$ ^6 +'6 +.6 $. +,6 $& +,6 $* +,6 ] +-6 $& +-6 ] +^6 ^. +^# $6 +^5 z2 i3- +^5 z2 C +$5 Z2 *34 +,5 z2 .2 +-5 Z2 -0 +$$ -5 Z2 ++5 Z1 +$* ,5 Z1 ++5 y5 E +'5 y5 E +^5 y5 +,5 Y4 E ++5 Y4 +-5 Y4 +-5 Y3 s8. +] -5 Y2 +$5 y2 +-5 y2 +$5 Y1 x03 +$5 xB2 E +$5 x72 +$5 x62 +,5 x61 +^5 x61 +^5 x31 +^5 x21 +$5 x03 Y1 ++5 x02 *03 +$5 x01 E +.5 ^w o1g +^5 $W C +$5 $W ++5 $v +-5 ^v ++5 u .0 +^5 TA +,5 t *79 +.5 t .6 +-5 T3 T2 +-5 T2 T3 +$5 T2 *20 +$5 T1 +-5 T0 o22 +.5 t +,5 sZ7 +,5 srL +-5 seG +.5 se3 +-5 s8. Y3 +^5 s6f +$5 s-5 +^5 ^S +-5 $s +-5 ^s +'5 R4 t +-5 R4 ++5 $r ++5 $Q +.5 p1 Z2 +.5 p1 x03 ++5 ^p { +$5 oB2 +,5 o82 ++5 o7x *05 ++5 o7n +-5 o7j +,5 o7a ++5 o6k +$5 o6h +$! -5 o6E ++5 o67 +^5 o64 +$5 o5g +$5 o53 ++5 o47 ++5 o3z +$5 o3t +,5 o3s +.5 o3d ++5 o37 +.5 o33 ++5 o3_ ++5 o2z ++5 o2v +$5 o2s *46 +$5 o2a +-5 o22 T0 ++5 o22 +^5 o1f +$5 o1e +-5 o0q +$5 o0I +,5 o0d +$5 o0! +^5 $N +^@ -5 $M +$5 ^m ++5 l ,7 +-5 l *68 +$5 k ^L +^5 $J ++5 $j +$5 iA0 +-5 i8g ++5 i7n E ++5 i7- +.5 i6i +,5 i6B +-5 i6- +^5 i5t ++5 i5s +$5 i5s ++5 i5j ++5 i58 +$5 i57 +,5 i54 ++5 i53 +^5 i5 +-5 i4z x24 +$5 i4v +$5 i3z +$5 i3w +,5 i3k +-5 i3i +.5 i3a -6 +.5 i3. -9 +-5 i3/ +^5 i3- +'5 i2s p1 +$5 i2i +-5 i2d ++5 i2* +$5 $g +'5 E y5 +,5 E Y4 +$5 E xB2 ++5 E i7n ++5 ^e +.5 d Z2 +-5 ^d z1 +$5 d x02 ++5 D3 ++5 $D +$5 $D +-5 d +^5 C z2 +^5 C $W ++5 C *75 ++5 c *65 ++5 C .6 +$5 C $2 +$. ,5 c +.5 c $* +.5 $* c +^5 ^c ++5 ^B +$5 $B +$5 ^b +*5A D5 +$5 $a *34 +,5 $a +*59 x52 +*59 u +*59 T0 K +*59 l K +*59 K T0 +*59 K l +$5 -9 *89 +*59 -5 ++5 ] $9 +*58 ^w +*58 s!% +$5 $8 p2 +*58 ^p +*58 o6s +*58 l *95 +*58 ^a +*58 *95 l ++5 ^. *80 +$! ,5 -8 +{ ,5 ,8 +,5 +8 $@ +,5 $@ +8 +*57 y5 o0h +*57 x25 '8 +*57 ^U +*57 t r +*57 T4 [ +*57 r t +*57 o64 +*57 o5m +*57 o5B +*57 o53 +*57 o2z +*57 o2l +*57 o0p +*57 o0g ++5 ,7 l +*57 i8u +*57 $h +*57 $e +*57 ^d +$- *57 c +,5 *79 t +*57 $8 $4 +*57 *74 +3 +*57 +7 ] +*57 ] +7 ++5 *75 C +-5 *73 x41 +*57 +3 *74 +*57 $3 ++5 { *72 +*57 $2 +*57 -0 ++5 $7 ++5 ,7 +$5 .7 +$+ *57 +-5 $* -7 +-5 -7 $* +*56 y5 +*56 Y2 l +*56 x32 +.5 .6 t +*56 s08 +*56 o6o +*56 o0w +*56 l Y2 +*56 L0 +*56 i7. +*56 i6s +*56 i64 +*56 i5% ++5 .6 C +-5 *68 l ++5 *65 c +*56 *47 +$. *56 *41 +*56 *28 +$! *56 *23 ++5 *61 *42 +$5 *60 c +*56 *02 ++5 *60 ++5 $6 +-5 *53 ,2 +$5 *52 [ ++5 *50 *46 +,5 ^5 +-5 $5 +^5 -5 +*54 z5 t +*54 Y3 $3 +*54 ] Y2 +$@ *54 x01 +*54 t z5 +*54 o4i +*54 o2t +*54 o2g +*54 o1k +*54 o1g +*54 i2- +*54 -9 -5 +*54 +7 +$5 *46 o2s +*54 *67 ++5 *46 *50 +*54 *64 ] +*54 ] *64 +-5 *46 +*54 -5 -9 +*54 *41 ++5 *42 *61 +*54 [ *24 +*54 ,2 +,5 *42 +,5 *41 +-5 -4 ,1 +$5 *40 +$$ *54 +{ -5 ,4 +*53 siw +*53 o73 +*53 o5v +*53 o54 +*53 o3l +*53 ^j +*53 i66 +*53 i2z +*53 i2f +.5 -3 ^h +} *53 $e +.5 *36 +*53 *59 +$5 *34 Z2 +$5 *34 $a +*53 *46 +*53 +4 +.5 *31 .3 ++5 *31 +*53 $* +*53 [ +$5 $3 +$. *53 +$, *53 +,5 .3 +*52 z1 +*52 y4 l +*52 x51 o4_ +*52 [ ^s +*52 p3 'B +*52 o7r +*52 o4_ x51 +*52 o4u +*52 o2A +*52 o0g p5 +*52 l y4 +$5 $2 C +*52 +7 +} *52 -6 +-5 ,2 *53 +*52 *51 -3 +*52 *40 .1 +*52 ,4 +*52 -3 *51 +*52 ,1 *51 +*52 .1 *40 +$5 [ *20 +$+ *52 +*51 $S r +*51 o1u ,3 +*51 o0Z +*51 o0C +*51 i6k +*51 i6# +*51 i20 +*51 +5 *37 +*51 -5 +,5 *15 +*51 *42 +-5 ,1 -4 +*51 ,3 o1u +*51 *37 +5 +*51 *30 k +*51 *23 +$5 *12 +$ *51 $1 +$5 $1 +-5 -0 Z2 +*50 x31 ++5 .0 u +*50 ^t +*50 t +*50 sao *32 +*50 s0c +*50 o5n +*50 o51 +*50 o2x r +*50 o2q +*50 ^j +*50 *86 +*50 *72 ++5 *05 o7x +,5 *05 +*50 *32 sao +*50 +2 +$5 $0 +,5 +0 ++5 $* +$5 $# +$5 $/ +$5 ^/ +$. $5 +$? .5 +$ $5 +^5 $* +^5 $@ +^5 ^+ +^5 ^. } +^* -5 +^@ $5 +.4 z5 t +$ +4 Z4 +^4 z4 ++4 Z3 o5Q +,4 Z3 ,3 +-4 $ Z3 +,4 Z2 y4 +^4 z2 +-4 Z1 -6 ++4 Y5 u ++4 Y5 ++4 y5 +,4 y4 Z2 +$4 Y4 t +-4 y4 [ ++4 Y3 E ++4 Y3 [ ++4 [ Y3 +$4 y3 ++4 Y2 t ++4 y2 *35 ++4 Y1 *54 +,4 Y1 { ++4 y1 +$4 x91 +$4 x81 t ++4 x63 +$4 x62 +^4 x52 y1 +$4 x32 +-4 x02 *07 +-4 x01 p2 +$4 ^w p5 ++4 u Y5 +-4 u d +.4 t z5 +$4 t Y4 ++4 t Y2 +$4 t x81 +^4 t ^0 +$4 ss2 +-4 skT ++4 sHM ++4 s92 ++4 s21 +$4 p5 i6- +$4 p4 $0 +'4 p2 Z1 +$4 o8 c ++4 o8a +^4 o7Z +,4 o7k +-4 o73 +$4 o6z +-4 o6n +$4 o5y ++4 o5t ++4 o5Q Z3 ++4 o56 ++4 o54 ++4 o5< +^4 o4@ ++4 o3q +-4 o3o +,4 o2r +,4 o2i +-4 { o2f +-4 o2f +$4 o1y +,4 o1o +-4 o1@ D3 +.4 o0S +$4 o0p +$4 o0m +-4 o0f ++4 $n +-4 $M *31 +$4 $M ++4 ^m +$4 l $2 +$4 $L +.4 k .3 +$ ,4 K +-4 K ++4 ^k +$4 ^J ++4 ^j +,4 ^j +$4 iA3 +$4 i9# +$4 i79 +^4 i7- +-4 i6@ x13 +^4 i64 +,4 i5u +^4 i5s ++4 i5p +.4 i5e +-4 i5e +.4 i5- +.4 i4v +$4 i4t +$4 i4s +,4 i4M ++4 i4i +,4 i49 +-4 i4& ++4 i3v +^4 i3s +-4 i3n +,4 i3e ++4 i2s d +$4 i2S +-4 i2h +.4 i25 +$4 i0p +[ ^4 i04 ++4 ^g +.4 ^g +,4 ^f ++4 E Y3 +$4 E o6L +$4 E *76 +.4 d x04 +-4 d u ++4 d E +,4 d c +-4 D3 o1@ +$4 D3 +,4 D2 y5 +$4 D2 ++4 D1 +{ ,4 d +-4 $d +$4 ^C +$4 C +$4 -A ++4 $a +[ +4 ^a +$4 *96 +-4 $8 x71 +*48 x21 [ +*48 ^a *A8 +-4 -8 +*47 x51 +*47 x42 +*47 o4t +7 +*47 o3b *02 +*47 i7c +*47 D6 +*47 +7 o4t +*47 *76 +*47 ,7 +$4 *76 E ++4 *75 +*47 [ *25 +*47 *14 +*47 *03 } +*47 *02 o3b ++4 +7 ++4 ,7 ++4 -7 +.4 $7 +*46 Z2 +-4 -6 Z1 +*46 x12 +*46 swL +*46 slt +*46 sAQ +*46 o7d +*46 o7a +*46 o5q +*46 o4L +*46 o1u +*46 i2k +*46 ,6 i0R +*46 *36 [ ++4 ,6 +*45 Y5 +*45 Y3 x01 +*45 [ y3 +*45 x01 Y3 +*45 o7d +*45 o6a +*45 o4s +*45 o0d +*45 K ++4 +5 i5s +*45 i36 +*45 i1j +*45 ^h +.4 *57 Z1 +*45 *53 +$@ *45 .5 ++4 *54 Y1 +,4 *54 +*45 *32 ++4 *52 +*45 *13 +*45 } +$4 $5 +{ ,4 -5 +[ } *45 +.4 -5 +^/ *45 +[ -4 *47 +-4 *43 .2 ++4 +4 $@ ++4 $@ +4 +*43 Z4 Z3 +*43 Z4 Y3 +*43 Z3 Z4 +,4 ,3 Z3 +$- *43 Z2 +*43 y5 c +] *43 Y3 +*43 y2 *78 +$. *43 x52 +*43 $s +[ *43 r +*43 $q +*43 ^o D4 +*43 o7h +*43 o6b +*43 o5b +*43 o3R +*43 o3k +*43 o2o +*43 o13 +*43 o0y +.4 .3 k +*43 i7p +*43 i2u +*43 i2a +*43 i0e +*43 d x06 +*43 -2 +-4 *31 $M +[ *43 +1 +,4 *30 +$+ *43 +{ *43 +*42 y2 +7 +*42 [ y2 +*42 Y1 +*42 o3w +*42 o2g ^t +*42 o1w +*42 o1@ +*42 o0J ,6 +*42 o0d c +$4 $2 l +*42 ^J $f +*42 ^J +*42 $f ^J +*42 D7 .2 +*42 ,6 o0J +*42 *43 +$@ *42 *40 +*42 +4 +*42 .2 D7 +*42 *25 r +*42 *06 +*42 *03 +,4 *20 ++4 .2 ++4 -2 +] [ *42 +,4 $2 +-4 .2 +-4 -2 +*41 x12 +*41 u p1 +*41 p1 u +*41 o6m K +*41 o5 +*41 o4- ++4 .1 o2y +*41 o2@ +*41 i6_ +*41 i3l +*41 $h +*41 ^g +*41 ^a z2 +$. *41 *56 +$@ *41 +] +4 $1 +.4 $1 +,4 +1 +,4 ^1 +^4 +1 +*40 y5 u +*40 x62 D0 +*40 x42 +*40 u y5 +^4 ^0 t +*40 R0 +*40 p1 x02 +*40 o6- +*40 o4z +*40 k $A +*40 K *13 +*40 i71 +*40 i36 +*40 i2y +*40 i0L +*40 $. ^d +*40 ^d $. +*40 ^c +*40 $A k +*40 ^7 +*40 *58 +$4 *04 +.4 *04 ++4 *03 +*40 *13 K ++4 *01 } +$4 $0 +,4 $0 +-4 +0 ++4 $* ++4 $- ++4 ^@ +$4 $* +$$ +4 +$? +4 +$! -4 +$, -4 +[ +4 +[ '4 +,4 $$ +,4 $? +,4 +^4 ^ +^* $4 +^@ -4 +^( $4 +^. $4 ++3 Z4 x54 +,3 Z1 t +,3 Z1 C +$3 ^Z +-3 Y5 u +.3 y5 u +-3 y5 t +.3 Y5 ,A +.3 Y4 x43 +-3 Y4 T0 ++3 y4 +-3 y4 +-3 y3 ] +-3 ] y3 +$3 Y2 +-3 Y2 ++3 ] Y1 +$ +3 Y1 +$3 y1 +^3 y1 } +$3 xA6 +$3 x62 ++3 x54 Z4 ++3 x51 *04 +^3 x51 +^3 x26 q +$3 x25 ++3 x02 ^p +-3 $v +-3 u Y5 +.3 u y5 +^3 u $5 +,3 t Z1 +-3 t y5 +^3 T8 +^3 T5 +-3 T0 Y4 +-3 srj ++3 seu +.3 sAZ ++3 s6e +.3 s3r ++3 s39 +.3 R5 +^3 r +-3 o94 +$3 o82 +,3 o6u +.3 o64 $@ +.3 $@ o64 +^3 o6! +.3 o5g -3 +$3 o5B ++3 o5b +^3 o5 +.3 o4m k +,3 o4k +-3 o45 ++3 o40 +^3 o3n +-3 o2x +-3 o2r +,3 o2f +.3 o1Z ++3 o1y +1 ++3 o1e +-3 o1b +,3 o1a ++3 o0v +$3 o0T +,3 o0M p3 +.3 o0M +-3 o0F +$3 o0a +$3 ^M +^3 $m +-3 l ,2 +$3 L0 ++3 ^k y1 +.3 k o4m +.3 k *23 ++3 k ++3 ^j +$3 i8% +$3 i7a -6 +-3 i79 +$3 i7@ +$3 i7. +,3 i7. +$3 i5W +.3 i4m +.3 i48 ++3 i46 +,3 i4* +-3 i4 +-3 i2i c +-3 i22 +^3 i20 +$3 i1x ++3 i1r +^3 i1m +$3 i1a ++3 i15 +^3 i10 +-3 i1. +-3 i0s +,3 i0l +,3 i0i ++3 i0, +$3 i0< +-3 i0@ +$3 ^i ++3 ^h +-3 ^g +,3 f x68 +$3 $F C +-3 E D1 +$3 E .2 +,3 E $2 +,3 ^e ++3 D5 +-3 D2 *89 +^3 D2 +-3 D1 E +^3 d +,3 C Z1 +.3 ^c u +-3 c i2i +$3 C $F ++3 C *42 +,3 c $4 +$$ .3 c +*3A x03 +$3 ^A +.3 $A +,3 ^9 y5 +*38 ^w x52 +.3 .8 p3 +*38 ,4 +$3 $8 +$3 ^8 +^3 +8 +*37 t *62 +*37 ssx +*37 o7g +*37 o7@ +*37 o6o +*37 o2w +$. *37 k +-3 $7 $e +*37 ^a +*37 *74 +*37 *62 t +*37 *53 +-3 *75 +-3 -7 *41 +,3 *71 +3 ++3 -7 +$% *37 +*36 t +*36 sAs +*36 o4? +{ *36 o4* +*36 o2g +*36 o0N +*36 k +$3 -6 i7a +*36 E *47 +$- *36 $c +{ *36 *72 +,3 +6 ,7 +*36 *64 +*36 ,6 +*36 *54 *20 +*36 *54 +*36 *47 E +*36 *20 *54 +*36 *03 x02 +} -3 ,6 +,3 ^6 +-3 ,6 +*35 Y2 +*35 u +^3 $5 u +*35 r x21 +*35 p1 { +*35 { p1 +*35 o4k +*35 o31 +*35 o0A +*35 i63 +*35 i5t +*35 i4i +*35 i2- +$3 *56 +$3 *54 +$3 *53 x23 +,3 *53 +*35 *15 $0 +*35 $0 *15 ++3 *50 +,3 } *50 ++3 +5 +*35 ] [ +*35 [ ] +$3 .5 +.3 +5 +*34 Z3 Y4 +*34 Z3 *26 +*34 Y5 x12 +*34 Y1 x04 +-3 $4 Y1 +*34 x04 Y1 +*34 ^w +*34 stw +*34 s3S +*34 p1 -5 +*34 o4V +*34 o4u +*34 o3y +*34 i4p +*34 i4. +*34 i2w +,3 $4 c +*34 $A ++3 *47 +2 +*34 } *71 +*34 ,6 *32 +*34 *32 ,6 ++3 *42 C +*34 *26 Z3 +*34 *24 i4j +*34 .2 +-3 *41 -7 ++3 *40 i44 +{ *34 +.3 -3 o5g +.3 -3 D1 +,3 +3 *71 +.3 *37 +,3 *30 k +^3 .3 +*32 y4 *38 +*32 y4 $. +*32 $. y4 +*32 Y2 +*32 $t +*32 o7s +*32 o4x +*32 o3s +] *32 o2h +*32 o0l +-3 ,2 l +*32 k i0s +*32 i12 +$3 .2 E +,3 $2 E +*32 C ] +*32 ] C +] *32 C +*32 $b +*32 ^7 k +-3 *27 +^3 *25 *13 ++3 +2 *47 +*32 *47 +*32 *46 +,3 *24 +.3 *23 k +*32 -1 ++3 .2 +$3 +2 +,3 -2 +-3 +2 +^* *32 +*31 y5 c +*31 x21 +*31 x02 +*31 u o51 +*31 smb +*31 sit +$+ *31 p5 +*31 o51 u +*31 o3d +{ *31 o32 +*31 o2l D4 +*31 o1u +*31 o1e +*31 o0j +*31 i6l +*31 i44 +*31 i3P +*31 i1l +*31 i1e +*31 i0@ +*31 D4 o2l +*31 $A +*31 *86 +*31 -7 +*31 { *43 +^3 *13 *25 +,3 *12 ++3 +1 +*31 $! +*30 ^Z y1 +*30 z1 +*30 y2 +*30 x32 y2 +*30 o5t +*30 o59 +*30 o4- +*30 o2r +*30 o2k +*30 o0B +*30 ^l +*30 K *02 +*30 i4- +*30 i4 +*30 i3i +*30 i03 +*30 E i4S +*30 D0 +*30 $9 ++3 *04 x51 +,3 *04 +*30 ,3 *52 +*30 .3 +] *30 *26 +,3 *02 +*30 *02 K ++3 $. ++3 } +$3 $@ +$3 $ +$3 ^@ +$# $3 +$@ ^3 +$) .3 ^( +$. .3 +$- $3 +$_ .3 +$ ^3 +} ^3 +] ^3 +,3 $* +,3 $. +,3 $! +^3 $. +^3 } ^% +^3 } +^3 ] +^! ^! -3 +^- ^3 +$2 Z4 ++2 ^ z4 +$2 Z2 x23 +^2 Z2 +$2 z1 *51 ++2 Z1 .3 +-2 $^ Z1 +$2 ^Z ++2 ^z +,2 Y5 t ++2 Y3 y3 ++2 y3 Y3 ++2 y3 x73 ++2 Y3 s8, ++2 y3 ,4 +-2 Y2 f +.2 Y2 *68 +,2 y2 +^2 y1 $n +.2 Y1 +7 +^2 Y1 $! +^2 Y1 } +^2 x73 y1 +^2 x71 +$2 x52 y2 +$2 x51 +-2 x32 +$2 x23 Z2 +,2 x02 o58 +$2 x01 ++2 ^v y1 +$2 $V ++2 $v +,2 u ^P +$2 u i13 ++2 u *51 +^2 u ^0 +-2 ^u +,2 t Y5 +,2 t p4 +.2 t d ++2 T8 +$2 T5 +-2 smq +-2 s9/ ++2 s8, Y3 +-2 s8* +.2 s5! +$* -2 ^S +-2 ^S +^2 $S +[ -2 ^s +-2 ^s +^2 ^r ++2 ^q +-2 $q +,2 ^P u +,2 p4 t +$2 p2 Z1 +,2 p2 x0B +$2 p2 o82 +,2 p1 c +.2 $P +^2 o8Y +$2 o8o ++2 o7t +$2 o7B ++2 o7b +$2 o6v +$2 o6_ +^2 o6@ +.2 o5l +$2 o5e +-2 o4v +.2 o4c +-2 o3w +$2 o3k +$2 o3a p2 +,2 o34 ++2 o3@ +-2 o3. +$2 o2s +$2 o2@ ++2 o1q +^2 o1m +-2 o19 +^2 o16 +.2 o0z ++2 o0v +,2 o0p ++2 o0G +$2 o0G +.2 o0g ++2 o0@ +^2 $n y1 +$2 $N ++2 l i98 +.2 l D4 +,2 k y2 +,2 k *30 +-2 k [ +$2 $J ++2 $j +$2 ^j ++2 i98 l ++2 i92 +^2 i8d +$2 i7i +$2 i7b +,2 i72 +-2 i72 +-2 i62 +^2 i5- +-2 i4t ++2 i4p ++2 i4@ +^2 i3z +-2 i3w ^s +,2 i3_ +,2 i2w +$2 i2t +,2 i2c +$2 i2_ +-2 i1v +-2 i1j +$2 i13 u ++2 i11 +^2 i11 +^2 i0M +-2 i0k +$2 i0E ++2 ^h +$2 $h ++2 f x26 ++2 $f +.2 d t +$2 D6 +.2 D4 l +$2 D3 +$2 D2 +-2 D1 $2 +$2 ^d +$@ ^2 $d +$2 c ^# +^2 ^c +,2 ^b +$2 $9 +-2 ,8 Z5 +*28 -5 +[ $2 *85 +.2 +7 Y1 +*27 x62 t +*27 x53 +*27 t x62 +*27 o5y *62 +*27 o4b +*27 o2b +*27 ^a *34 +*27 $. .8 +*27 .6 ^g +*27 *62 o5y ++2 *76 *20 +*27 *24 +-2 *70 +*27 { +.2 -7 +.2 ^7 +*26 x13 +*26 u d +*26 i7. +*26 d u +*26 C +*26 +7 +*26 +5 r +[ -2 *64 +] *26 *30 ++2 -6 +$2 -6 +$! -2 -6 +*25 Z2 o0t +*25 y5 +*25 y4 l +*25 x41 ^n +*25 r +*25 o6f +*25 o5- +*25 o4c +*25 o0t Z2 +*25 l y4 +*25 k ^a +*25 i3w +*25 i3f x62 +*25 D0 } +*25 d { +*25 { d +*25 ^c +*25 $a *23 +*25 *71 +*25 $7 +-2 *54 +*25 *36 +*25 *35 +*25 *23 $a ++2 *52 +,2 *52 ++2 *51 u +} *25 *05 ++2 *50 ++2 +5 +*25 +.2 ^5 +-2 $@ ,5 +-2 ,5 $@ +*24 z2 Y5 +*24 Y5 z2 +*24 x42 c +*24 u [ +*24 [ u +*24 s7% +*24 o4b +*24 o0l +*24 o0k +*24 k i18 +*24 i6r +*24 i4u +*24 i0e o0u +*24 ^G +*24 d { +*24 { d +*24 c x42 +*24 c $* +*24 $* c +[ *24 $A +*24 ^a +[ *24 ] +[ ] *24 +*23 Z1 .3 ++2 .3 Z1 +*23 Y1 E +*23 x42 +*23 $v +*23 p4 o5 +*23 o7s +*23 o7q +*23 o4a +*23 o3% +*23 o1f +*23 o0T +*23 o0d ^k +*23 i4u +*23 i4n +*23 i41 +*23 E Y1 +*23 C +] *23 C +*23 *75 +-2 *36 +$! *23 *56 +*23 *54 +*23 +5 +*23 *42 +*23 *41 k +,2 *34 +*23 .3 Z1 +*23 *30 i03 +*23 -2 y4 +*23 *21 +*23 -1 ^q +*23 *15 *04 +*23 -1 *15 ++2 +3 .1 +*23 .1 +,2 *31 +*23 *04 *15 +*23 ^* +.2 +3 +-2 $3 [ +-2 [ $3 +-2 $2 D1 +$2 *24 +.2 *21 ++2 *20 *76 +$2 ^2 +-2 $? -2 +-2 -2 $? +[ *21 Z2 +*21 y2 u +*21 u y2 +*21 t -6 +*21 t -0 +*21 $R +*21 o5y +*21 o3p +*21 o3c +*21 o22 +*21 o0v +*21 o0p +*21 o0A *32 +*21 K +*21 ^k +*21 ^i ^q +*21 i4f +*21 i3. +,2 *17 +*21 -6 t ++2 *16 +*21 *41 *23 +*21 *32 o0A +*21 $3 *02 ++2 .1 +3 +*21 *26 +*21 *23 *41 +*21 -1 +*21 -0 t +*21 *02 $3 +.2 *10 *21 +*21 } +*21 ^@ +[ *21 +.2 +1 +,2 +1 +^# *20 z1 +*20 Y3 y2 +*20 y2 Y3 +*20 y2 $! +*20 $! y2 +*20 x43 +*20 x35 +*20 u -1 +^2 ^0 u +*20 sAX +*20 o5v *24 +*20 o5T +*20 o44 +*20 o4_ +*20 o3s +*20 o2n +*20 o1f +*20 o0h +*20 i3o +*20 i3- +*20 i2s +*20 ^F +*20 ^e +*20 C r +*20 c ,3 +*20 $7 +*20 .7 +.2 *05 +*20 ,3 c +*20 -3 +*20 *24 o5v +*20 -1 u ++2 .0 +*20 $$ +^_ *20 ++2 $/ ++2 $_ +$2 $! +$2 ^. +$$ +2 +$ .2 +$= +2 +.2 $# +,2 $. +^2 { $- +^* $2 +^! +2 +^1 $ Z3 +^1 z3 +-1 Z2 z2 +-1 z2 Z2 +$1 Z2 D3 +$1 Z2 +^, +1 z2 +$1 Z1 i8! +^1 Z1 $a ++1 $z +$1 Y5 t +] ^1 y5 +,1 y4 t ++1 y4 +$1 y3 x28 +-1 y3 $B +.1 y2 +^_ $1 Y1 +$1 $Y ++1 ^y +-1 $y +-1 ^y +$1 xB2 D8 +$1 x8A c +.1 x82 +,1 x51 ,3 +^1 x51 +$1 x46 ++1 x42 ++1 x32 i3b +.1 x25 $1 +$1 x21 u +$1 x03 ++1 $x ++1 ^x +,1 ^W ++1 ^w +-1 ^v +$1 u x21 ++1 u p3 +$1 u p1 ++1 u *13 +$1 t Y5 +,1 t y4 +-1 t p2 +$1 T6 $5 +^1 T6 +^1 T2 +$1 T0 +$1 s Y +.1 sna +^1 sh! +$1 s9* +$1 s8/ ++1 s2E ^C +^1 s1- k +^1 R6 +-1 ^R $5 +^1 p5 T4 +,1 p3 x19 ++1 p3 u ++1 p3 l +-1 p2 t ++1 p2 ] +.1 p1 Y3 ++1 p1 x04 +$1 p1 u +-1 p1 c +^1 $P +^1 ^P +$1 oBi +$1 oAu +$1 o8% +$1 o7w +$1 o6x +-1 o69 ++1 o67 +-1 o64 +$1 o5x +$1 o5l +$1 o5e +^1 o5e +-1 o4x +$1 o4v +$1 o4c +$1 o4, +$1 o3n +-1 o3n +^1 o3c ++1 o3@ +$1 o3& +-1 o3- ] +-1 ] o3- +^1 o3$ +$1 o2u +$1 o2l ++1 o2_ ,6 +$1 o23 +.1 o2! +$1 o1v +$1 o0s +4 +$1 o0R ++1 o0n ++1 o00 +$1 $O +-1 ^o ++1 ^M ++1 l p3 ++1 l ,4 ++1 l *21 +-1 ^l +^1 k s1- +.1 k ++1 $j Z1 +$1 ^j ^b +$1 iAl +$1 i9Q +$1 i9* +^1 i8t +$1 i8f +$1 i86 +$1 i7Y l +.1 i72 +$1 i7, +-1 i7. +$1 i6% +^1 i5X +^1 i5u +$1 i5- +$1 i4s x06 +$1 i4f +^1 i4= +^1 i3r p5 +$1 i3, +-1 i2g +^1 i28 ++1 i27 +^1 i21 +$1 i1i +,1 i1i +$1 i1D +$1 i1a +.1 i17 +^1 i12 +,1 i1_ +$1 i09 +$1 i0+ +^1 ^G +.1 ^f *60 +,1 E ] +,1 ] E +^1 ^E +.1 d Y3 +-1 d Y3 +$1 D3 Z2 +$1 D0 ,3 +$1 c x8A ++1 ^C s2E +,1 c .6 +^1 $C +-1 $B y3 +$1 $b ++1 ^A +-1 $A ++1 ^a +[ *19 x63 +*19 *80 +,1 *98 +$ $1 *96 +*18 x24 k +*18 k x24 +$1 *81 +^1 -8 +*17 o6b ++1 -7 K +*17 .6 +,1 -7 .6 +$1 ,7 +{ *17 +*16 o8@ +*16 o2q +*16 o2j ++1 ,6 o2_ +*16 o0# +,1 .6 c +*16 *07 ++1 +6 +.1 .6 +$1 $5 T6 +-1 $5 ^R +*15 p1 +*15 o4l +*15 o48 +*15 i5j +*15 i3x +*15 *52 *41 +*15 +4 d +*15 *41 *52 +*15 .3 +-1 *53 +*15 ,2 +*15 *17 +$ $1 *51 +*15 *06 ++1 { *50 ++1 [ -5 ++1 ,5 +} *15 +{ *15 +,1 ,5 +*14 $Z +*14 x51 k +*14 $v +*14 s1. +*14 o6. +*14 o0w +*14 o0T +$1 +4 o0s ++1 ,4 l +*14 k x51 +*14 c +*14 *75 ++1 +4 *35 +*14 *31 *12 +[ +1 *43 ++1 $4 +$1 +4 +] $1 +4 +*13 $z *10 +*13 y5 E +*13 y4 +,1 ,3 x51 +*13 o3z +*13 o0l +*13 i73 +*13 i55 +*13 i3x +*13 i3P +*13 i2l +*13 i1- +*13 D7 $. +*13 $. D7 +*13 *97 +*13 ^6 ++1 *35 +4 +*13 +4 *15 +$1 *34 $1 +*13 *21 +*13 *15 +4 +,1 +3 *12 +*13 *10 $z +^1 *30 +$. *13 +*12 Z1 y2 +*12 y3 c +*12 y2 Z1 +*12 Y2 *41 +*12 ^u -4 +*12 srg +*12 ^s +*12 ^p +*12 o7x +*12 o7s +*12 o3z +*12 o34 +*12 o2y +*12 o2u +*12 o2g +*12 K d +*12 k +*12 i5f +*12 i4f +*12 i49 +*12 i2j +*12 i1y u +*12 i0H +*12 *86 +*12 *56 +*12 *41 Y2 +$1 *24 +*12 ,3 +*12 ^2 +$1 *21 x02 ++1 *21 l +*12 *15 ++1 { *21 +*12 $. +.1 $1 x25 ++1 *13 u +$1 $1 *34 +.1 *13 +,1 *12 +3 +*10 y3 ^5 +*10 Y1 ^f +*10 u o1S +*10 $t ^q +*10 ^q $t +*10 o5b +*10 o42 +*10 o1S u +*10 ^f Y1 +$1 *05 c +,1 *05 +^1 *04 *30 ++1 +0 +*10 { +$1 +0 +$! ^1 ^0 +.1 +0 +-1 +0 +-1 .0 +-1 -0 ++1 $& +$1 $= +$1 ^* +$* $1 +$, ^1 +{ $1 +.1 $@ +,1 { +^1 $/ +^# $1 +^, ^1 +^_ $1 +^ ^1 +^` $1 +-0 Z5 Y5 +^0 z5 y1 +} +0 z5 ++0 Z4 x63 +$0 Z3 D5 +} -0 z2 +^0 z2 ++0 z1 C +$ -0 Z1 ++0 ^z +.0 ^z +^0 ^z +$0 y5 Y1 +$0 y5 t +-0 y5 t ++0 y5 c +-0 y4 t +$0 Y4 ++0 Y3 y2 ++0 y3 x01 ++0 y3 +0 +$0 y3 +-0 y3 ++0 y2 Y3 +.0 Y2 E ++0 Y2 +^0 y1 z5 +$0 Y1 y5 +$0 Y1 x71 +$0 Y1 $_ +.0 ^y +$0 x71 Y1 ++0 x63 Z4 +$0 x54 E ++0 x34 $A +$0 x32 y5 ++0 x32 ++0 ^w +$0 $! ^w +$0 ^w $! +.0 ^w ++0 $v +-0 $v +^0 ^v +$0 t y5 +-0 t y5 +-0 t y4 +-0 t .3 +.0 ^t +-0 ss1 ++0 srj +.0 sn6 +-0 sg. +-0 sei -0 +^0 s0D +-0 s0^ ++0 r +^0 r +$0 ^Q ++0 p5 *71 ++0 p4 i2c ++0 ^p +-0 o7D K ++0 o77 ++0 o7+ ++0 o6o u +^0 o6i +0 +-0 o6d +-0 o6_ +.0 o4t +0 +$0 o4O +-0 o4b ++0 o4= +$0 o4@ ++0 o3v ++0 o3s +-0 o3p +$0 o3D +-0 o2z ++0 o2x +.0 o2r r ++0 o23 ++0 o2 +-0 o2 +$0 o0B +$0 ^o ++0 ^N +^0 ^N +-0 ^m +-0 l .3 ++0 K ^j +] +0 K +$0 $k ++0 ^j K +$0 i8_ +$0 i7! ++0 i6u +-0 i6u +.0 i60 ++0 i6- +.0 i6_ +-0 i6_ ++0 i5m ++0 i4s +$0 i4s ++0 i4q +.0 i4b ++0 i41 ++0 i3x o7d ++0 i3w +-0 i3i ++0 i3g +^0 i38 +$0 i30 ++0 i2z +-0 i2p +-0 i2o +-0 i2l +-0 i2g +[ +0 i28 ++0 i1R C +^$ -0 i13 +^0 i0s +.0 i0f +-0 ^i ++0 ^H +.0 E Y2 +$0 E x54 ++0 E +$0 ^E +$& +0 $e +$0 d x42 +-0 ^D i0F +$0 D5 Z3 ++0 ^d ++0 C i1R +-0 c $7 +$0 ^B +-0 ^B +*0A x75 +2 ++0 $A x34 +-0 ^a o4o +*0A +2 x75 +*09 o0c +*09 -9 ++0 *97 ++0 *91 x46 +-0 ^9 +*08 o2. *28 +$0 ^8 +*07 snv *61 +*07 r +*07 o6e +*07 o4u +*07 i8R +*07 c $1 +-0 $7 c +*07 ,8 D3 +*07 *61 snv +*07 *52 *03 +$0 *73 x45 +*07 +2 +*07 $1 c +*07 *12 } +*07 *03 *52 ++0 ,7 +^. *07 +*06 z2 Z1 +*06 Z1 z2 +*06 x12 +$@ *06 $q +*06 o1p *65 +*06 i6a +*06 i41 +*06 i0s +*06 ^a +*06 *65 o1p +*06 +6 +*06 *54 +*06 *50 +$0 -6 +*05 Z2 $! +*05 z1 +*05 Y5 x23 +*05 Y1 x31 +*05 x52 +*05 x31 Y1 +*05 sSn +*05 o7f +*05 o78 +*05 o6o +*05 o3b +*05 o2j +*05 o2b +*05 o0z +$! *05 i7@ +*05 i3s +*05 D6 +-0 *56 +*05 -4 +2 +*05 *34 -2 +*05 +2 -4 +*05 -2 *34 ++0 +5 $* ++0 $* +5 +} *05 +-0 +5 +-0 $5 +^& *05 +*04 y5 t +*04 t y5 +*04 t +*04 ^S +*04 o5h +*04 o4_ +*04 o3 scx +*04 o34 +*04 o0k +*04 i71 +*04 i3X +*04 i2f +*04 E .3 +*04 ^6 ++0 *45 +*04 .3 E +^0 $4 +*03 Y5 ] +*03 Y4 x31 +*03 x31 Y4 +*03 ^t +-0 .3 t +*03 s4$ +*03 s1- +*03 p1 Y4 +*03 p1 ] +*03 o5f +*03 o0w +*03 o0r +*03 o0! +-0 .3 l +*03 i7- +*03 i5 +*03 i2y +*03 D3 C +*03 C D3 +*03 $c +*03 ^c +*03 c +*03 -A +*03 $a +*03 *67 ,3 +*03 *54 *32 +*03 ,3 *67 +*03 *32 *54 +*03 *27 *37 +*03 -1 +.0 *31 ++0 $3 +$0 ,3 +*02 $w ^f +*02 ssx +*02 s0b +*02 p2 $j +*02 o7w +*02 o4z +*02 o3j +*02 o3f +] *02 o3_ +*02 o2v +*02 o1o +*02 ^l +*02 k C +*02 i6r +*02 i63 +*02 i4- [ +*02 i3k +*02 ^f $w +*02 ^f +*02 D3 c +*02 c D3 +$0 ^2 C +*02 *50 i10 +*02 -4 ++0 *23 *31 +*02 *23 *12 +*02 -2 ++0 +2 ^1 +*02 -0 +*02 { +$0 $2 +$ *02 +.0 ,2 { +-0 ^2 +*01 Y4 x52 +*01 Y2 -4 +$. *01 x32 +*01 x21 ^S +*01 ^p $A +*01 o3T +*01 o32 +*01 ^K +*01 i1u +*01 i1b +*01 i0j +*01 $h +$! *01 D3 +*01 $A ^p +*01 ^7 +*01 -4 Y2 +*01 } *04 ++0 +1 +^0 $1 +^0 +0 o6i +.0 +0 o4t +-0 *01 ^k ++0 +0 ++0 $_ +$0 $* +$0 ^! +$@ $0 +$) +0 +} -0 +{ $0 +] ^0 +.0 +-0 $* +^0 $, +$+ $* +$+ ^* +$+ ^_ +$\ ^\ +$* $@ +$$ ^! +$@ $$ +$@ $. +$) $( +$/ ^\ +$, $- +$| +$< $> +} $# +} ^@ +{ { $* +] $% +] [ +] ^_ } +^+ ^# +^+ +^# ^@ +^* $* +^$ $# +^. ^, +^! ^? +^_ } +^_ +^ $. +^> ^< +^< ] $> +^Z Z5 Y2 +$z Z5 x16 +$Z Z5 t +^Z Z4 Z3 +$z Z4 Z2 +^z z4 Y4 +^Z Z4 Y3 +$z Z4 y1 +^z z4 +^Z Z3 Z4 +$Z z3 $g +$z Z2 Z4 +$z z2 *05 +$z z2 ^0 +^z z1 Y3 +$z Z1 y2 +$z Z1 i5r +$z z1 -8 +^Z Z1 ^1 +$z Z1 .0 +$Z Z1 +$. $Z Z1 +$Z ^Y oB! +^z $y D1 +^z y5 x64 +^z Y4 z4 +^z Y4 $b +^Z Y4 +^Z Y3 Z4 +^z Y3 z1 +^ ^Z Y3 +$z Y3 +^z y3 } +^z } y3 +^z y3 +^Z Y2 Z5 +$z y2 Z1 +^z y2 k +$z y2 +$z y1 Z4 +$Z Y1 o0j +$Z Y1 i8G +$z y1 -8 +$z Y1 *21 +^z y1 +^Z ^Y +$Z $X Y2 +$Z xB3 +$Z xA1 +$z $x $9 +$z x73 +^z x72 +^z x71 +^z x69 +$z x61 +^z x52 sm` +^z x52 +$z x43 +$z x34 +$z x24 +$z x18 y3 +$z x16 Z5 +^z x13 $/ +^z $/ x13 +^_ $z x02 +$z ^X +^z ^X +^z ^x +$Z ^W *53 +$z ^W +$z $w +^z u *8A +$z u *64 +$z u -0 +$Z t Z5 +$z t ^a +$Z T4 o0A +$Z ^T +$z sPf *95 +^z sm` x52 +$Z sG& r +[ $z sdy +^Z scz q +^Z saz +$z s74 +^z s71 +^z ^s $7 +$z s38 i3w +^z ^S +$Z r sG& +$z ^r +^z r ^& +^Z q scz +^z $q +^z ^q +$z o9Z +^z o8u +$z o8i +$z o7f +$Z o79 +^Z o7@ +^Z o6Z +$z o6w +$z o6l D9 +^z o62 +$z o5v +$z o5P +[ ^z o5- +^z o3i +$z o3c +$z o2q +^z o2m +^z o2- +$z o0W +^z o0u i3! +$z o0k +$Z o0j Y1 +$Z o0A T4 +$z ^M +$z $m +$z $l k +$z L8 +^Z l $7 +^z L6 *05 +^Z l ^3 +$z L1 +^z L1 +$z k $l +^z K -8 +$Z $K +$z K $! +^z $k +^z ^J +^z ^I l +$z i8- +$z i7b +^Z i7_ -6 +$z i6o -2 +$z i6b +^z i69 +$z i63 ^8 +^z i5Z +^z i5X +$z i5r Z1 +$z i5q +^z i5p +$z i53 +$Z i3z +$z i3w s38 +^z i3! o0u +$z i3i +^Z i3B +$Z i3a +^z i2z -4 +^Z i2u +^z i1u ] +^z ] i1u +$z i1p +^Z i1M +^Z i1L +^Z i1i +^Z i1b +^Z i0K +$Z i0i +^z i0c +$z ^i +^z $i +$Z $g z3 +^z ^g *31 +^Z ^F +$z $f +^Z ^E T2 +^Z d E +$z D9 o6l +$z D5 +$z D2 +^z D1 $y +^Z ^D +} $z ^D +$Z $C $M +^Z ^C +$z $c +$z ^b +^Z *A1 x23 +^Z $a +[ ^z ^a +^z *98 +$z *96 +$z *95 sPf +$Z -9 +$z $9 +$z -9 +^z +9 +^z *8A u +^z *81 +$z ,8 +^z $7 ^s +^Z $7 l +$Z *79 $! +$Z $! *79 +$z *76 +^z -7 *02 +^Z -6 i7_ +^z $6 *56 +$z *64 u +$z *64 +$z .6 +Z5 ^Z Z4 +Z5 Z5 Y2 +Z5 Z5 y2 +z5 z5 r +Z5 Z5 i51 +Z5 Z4 ^Z +Z5 z4 Y5 +Z5 z4 Y3 +Z5 z4 x56 +Z5 Z4 s3 +Z5 Z4 o2V +z5 z4 +6 +z5 Z4 ^5 +$ Z5 Z4 +$ Z5 z4 +z5 z4 ] +z5 ] z4 +z5 Z3 t +z5 Z3 sCM +$% Z5 Z3 +] Z5 Z3 +z5 Z2 i3. +Z5 Z2 *60 +Z5 Z2 .6 +Z5 Z2 *43 +z5 { Z2 +} z5 z2 +Z5 Z1 s6R +Z5 $/ Z1 +^* z5 z1 +Z5 Y5 z4 +Z5 Y5 Y4 +Z5 Y5 .3 +Z5 Y5 { +z5 y5 +Z5 Y4 Y5 +z5 Y4 x35 +Z5 Y4 x19 +Z5 Y4 T3 +Z5 Y4 *56 +Z5 Y3 z4 +Z5 y3 x52 +Z5 Y3 ^6 +Z5 Y3 *32 +Z5 Y3 +$! Z5 Y3 +Z5 Y2 Z5 +Z5 y2 Z5 +z5 Y2 Y2 +Z5 Y2 *34 +$; Z5 Y2 +z5 Y1 -3 +Z5 { Y1 +$ Z5 Y1 +$* z5 y1 +Z5 $x $D +z5 xB1 t +Z5 x98 $5 +Z5 x97 c +z5 x92 z5 +z5 x91 u +Z5 x87 +Z5 x84 +Z5 x65 $A +Z5 x65 +z5 x64 z1 +Z5 x63 o99 +Z5 x58 i5f +$ Z5 x52 +z5 x46 z3 +z5 x46 t +Z5 x46 o7A +z5 x45 o0B +Z5 x42 +Z5 x41 +2 +Z5 x39 +Z5 x37 +z5 x35 Y4 +z5 x29 *51 +z5 x26 $* +z5 $* x26 +z5 x23 T8 +z5 x23 $a +Z5 x23 +Z5 x19 Y4 +z5 x17 $* +z5 $* x17 +Z5 x16 i87 +z5 x04 +Z5 $x { +z5 u x91 +Z5 u ^N +Z5 u ^J +Z5 u i85 +z5 u +7 +z5 u *69 +Z5 u *65 +] Z5 u +z5 t Z3 +z5 t xB1 +z5 t x46 +Z5 t sOU +Z5 t o77 +Z5 t o5L +z5 t -B +Z5 T3 Y4 +Z5 t .2 +Z5 $T +z5 $S s5G +z5 sp8 t +z5 sCM Z3 +Z5 s6R Z1 +z5 s5G $S +Z5 s3 Z4 +Z5 s1o +Z5 r o8R +Z5 $r o8J +Z5 RB oAS +Z5 r '9 +Z5 R1 i4t +z5 $p .5 +Z5 p1 x6A +z5 $o u +Z5 oAS RB +Z5 oA. +Z5 o9S +Z5 o8J $r +Z5 o77 t +Z5 o63 -A +Z5 o60 +Z5 o5% x13 +Z5 o56 +Z5 o4@ +Z5 o3x *61 +Z5 o2V Z4 +z5 o2v +Z5 } o1R +Z5 o0L +z5 o0E D7 +z5 o0B x45 +z5 ^N z4 +Z5 ^N u +Z5 $M +z5 ^l z5 +z5 l i41 +Z5 L9 Y2 +Z5 ^J u +Z5 i95 ,A +Z5 i85 u +Z5 i51 Z5 +Z5 i4y u +Z5 i4t R1 +Z5 i4H x65 +z5 i41 l +z5 i3. Z2 +Z5 [ ^G +z5 D7 o0E +Z5 D5 x75 +Z5 $D +Z5 c x97 +z5 c i7J +z5 C *A6 +$! Z5 c +z5 -B t +Z5 *B4 .5 +z5 'A y5 +Z5 $A x65 +z5 $a x23 +Z5 -A o63 +z5 *A7 *39 +z5 *A6 C +Z5 *83 *16 +Z5 *81 $@ +Z5 $@ *81 +z5 +7 u +Z5 *74 *58 +Z5 *73 *2A +z5 ^6 z5 +Z5 .6 Z2 +Z5 ^6 Y3 +z5 *69 u +^z *56 $6 +Z5 *65 u +Z5 *61 o3x +Z5 *60 Z2 +^z *56 +z5 ^5 Z4 +Z5 $5 x98 +z5 .5 $p +Z5 .5 *B4 +Z5 *58 *74 +Z5 *56 Y4 +Z5 .5 *4B +Z5 ,4 ^L +Z5 *4B .5 +z5 *49 x73 +Z5 *43 Z2 +Z5 .3 Y5 +z5 -3 Y1 +z5 *39 *A7 +Z5 *34 Y2 +Z5 *32 Y3 +Z5 +2 x41 +Z5 .2 t +Z5 *2A *73 +z5 *28 *07 +z5 -1 y1 +Z5 *16 *83 +Z5 $1 $2 +$z *50 x43 +z5 *07 *28 +Z5 ^< +$% Z5 +$* Z5 +$` Z5 +$z +5 +{ z5 +^z ^5 +^* z5 +z5 +z4 Z5 x56 +Z4 Z5 x42 +Z4 Z5 x19 +$ Z4 Z5 +$ z4 Z5 +Z4 Z4 Z2 +Z4 Z4 Y4 +Z4 Z4 x34 +Z4 Z4 .6 +$= Z4 Z4 +Z4 } z4 +$\ Z4 z4 +$\ z4 Z4 +z4 z3 x75 +z4 z3 t +Z4 Z3 *34 +Z4 Z2 Z4 +z4 Z2 -0 +z4 Z1 x35 +Z4 Y5 x42 +Z4 Y5 x19 +Z4 Y5 T3 +Z4 Y5 s91 +Z4 Y5 $k +z4 Y5 *72 +z4 Y5 *58 +Z4 Y5 *15 +$ Z4 Y5 +Z4 Y4 Z4 +Z4 Y4 i57 +Z4 Y4 *30 +$% Z4 Y4 +z4 y3 x75 +Z4 Y3 i2m +Z4 Y3 *43 +$? Z4 Y3 +Z4 Y2 x42 +Z4 Y2 +$ Z4 y1 +^@ z4 y1 +Z4 x83 i7w +$! Z4 x75 +Z4 x73 C +Z4 x67 y2 +z4 x62 t +z4 x56 t +Z4 x54 +3 +Z4 x53 +z4 x48 +z4 x47 +Z4 x42 Z5 +Z4 x42 Y5 +Z4 x42 Y2 +z4 x3A t +z4 x39 p2 +^$ z4 x36 +z4 x35 Z1 +Z4 x34 Z4 +z4 x34 i1p +$@ Z4 x34 +z4 x26 +z4 x25 u +Z4 x24 R1 +Z4 x19 Z5 +Z4 x19 Y5 +Z4 x15 z4 +Z4 x04 q +Z4 x03 $Q +Z4 $W +z4 u x25 +Z4 u i37 +z4 t z3 +z4 t x62 +z4 t x56 +z4 t x3A +z4 t *9A +Z4 T4 y5 +Z4 T3 Y5 +$_ Z4 t +z4 t [ +z4 [ t +Z4 ^s u +Z4 sqD +Z4 s91 Y5 +Z4 s7? +Z4 s2? +Z4 s0& +Z4 R8 ,9 +Z4 R1 x24 +Z4 $Q x03 +Z4 $Q k +Z4 $O o2a +Z4 oA$ .9 +Z4 oA. +Z4 o7z +Z4 o78 +Z4 o7@ +Z4 o6k p3 +z4 o6A i7S +Z4 o6@ +Z4 o4T *16 +Z4 o40 +Z4 o3y *67 +Z4 o2a $O +Z4 { o1y +z4 o0q *15 +Z4 o0K +Z4 ^m *5B +Z4 $M +Z4 $L $A +z4 ^L *69 +$| Z4 l +Z4 k $Q +Z4 k $8 +Z4 iA1 +Z4 i98 +Z4 i92 +Z4 i8s *71 +z4 i7S o6A +z4 i6G o80 +z4 i6A C +Z4 i5$ x23 +Z4 i58 o7. +Z4 i57 Y4 +Z4 i37 u +z4 i34 +Z4 i2m Y3 +Z4 i21 i4# +$& Z4 i1x +z4 f x54 +Z4 f *01 +z4 ^e x38 +Z4 ^E i0D +z4 ^D ^t +Z4 d 'B +z4 D2 i2- +Z4 D1 $0 +[ Z4 ^D +Z4 C x73 +z4 C i6A +Z4 C $1 +z4 'A K +Z4 -A -7 +Z4 'A $@ +z4 *9A t +Z4 +9 -7 +z4 '9 *56 +z4 *92 +Z4 $8 k +z4 *80 *73 +Z4 -7 -A +Z4 -7 +9 +z4 *73 *80 +Z4 $7 *36 +Z4 *71 i8s +$? Z4 .7 +$z *47 +Z4 .6 Z4 +z4 ,6 i5E +Z4 *67 o3y +z4 .6 *62 +z4 ,6 *62 +z4 ,6 *26 +z4 *56 '9 +z4 *52 x53 +Z4 *50 +Z4 $5 +Z4 -5 +Z4 *47 x65 +Z4 *43 Y3 +Z4 { *43 +$ Z4 .4 +Z4 +3 x54 +Z4 *36 $7 +z4 *36 +Z4 *34 Z3 +Z4 -3 -1 +Z4 *30 Y4 +Z4 $3 +[ z4 +3 +[ $z *43 +Z4 $2 Z3 +z4 *27 +z4 -2 +Z4 $1 C +Z4 *16 o4T +Z4 *15 Y5 +z4 *15 o0q +Z4 -1 -3 +$ Z4 *13 +z4 -0 Z2 +Z4 $0 D1 +z4 *05 +Z4 .0 +Z4 } } +Z4 { { +$@ Z4 +$) Z4 +$? Z4 +$! Z4 ] +$< Z4 +$` Z4 +} $ Z4 +^, Z4 ^. +^, ^. Z4 +$z +4 +[ z4 +^+ z4 +^? z4 +^, z4 +^ z4 +^= z4 ] +^= ] z4 +z3 Z5 Y4 +z3 Z5 Y2 +Z3 Z5 ^d +Z3 Z5 *50 +Z3 Z5 ^3 +$% Z3 Z5 +] Z3 Z5 +z3 z5 +Z3 Z4 z3 +z3 z4 x75 +Z3 z4 sjo +Z3 Z4 o85 +Z3 z3 Z4 +z3 z3 x74 +Z3 z3 t +z3 z3 $* +z3 $* z3 +$* z3 z3 +$ Z3 z2 +z3 Z1 x34 +$$ Z3 z1 +z3 $z -1 +Z3 ^z +z3 y4 r +Z3 y4 *65 +Z3 Y4 *43 +Z3 Y4 -4 +Z3 Y3 i5 +Z3 y3 .5 +z3 Y3 *36 +z3 Y2 Z5 +Z3 y2 y2 +z3 Y2 *8B +$ z3 Y2 +z3 Y1 x34 +Z3 y1 ^A +Z3 x85 -9 +Z3 x71 *69 +Z3 x69 +Z3 x64 +Z3 x53 t +$# Z3 x51 +z3 x47 t +z3 x46 t +Z3 x43 o9K +[ Z3 x41 +Z3 x38 +z3 x37 t +z3 x34 Z1 +z3 x34 Y1 +z3 x34 o0_ +$$ Z3 x32 +z3 x25 p1 +z3 x25 { +Z3 x23 o61 +Z3 x21 *85 +z3 x14 $Q +Z3 x13 o93 +Z3 $W Z3 +Z3 $w o97 +Z3 $V o4D +Z3 u $q +Z3 u ^H +Z3 u .7 +Z3 u -7 +Z3 t z3 +Z3 t x53 +z3 t x47 +z3 t x46 +z3 t x37 +Z3 T9 +z3 t -3 +z3 sR6 +2 +Z3 sjo z4 +z3 s3* +Z3 $R Z3 +Z3 r ^L +Z3 r ^7 +z3 $Q x14 +z3 $q +2 +Z3 p3 'A +Z3 p1 'A +Z3 p1 *97 +^? z3 p1 +$! Z3 oBw +Z3 o9e +Z3 o9b +Z3 o9a *17 +Z3 o97 $w +Z3 o91 +Z3 o8s p3 +Z3 o85 L3 +Z3 o7. Y3 +Z3 o7o +z3 o7e L1 +Z3 o73 +Z3 o70 +6 +Z3 o7@ +Z3 o6o $A +Z3 o6h +Z3 o5# +7 +Z3 o4N *53 +Z3 o4D $V +Z3 o3v $, +Z3 $, o3v +z3 o3f +z3 o3- +z3 o3_ +z3 o2y +z3 o2g +0 +Z3 o2C +z3 o2_ +z3 o1G c +z3 o18 o0Q +z3 o0_ x34 +Z3 o0V +Z3 o0v +z3 o0t *24 +z3 o0s +z3 o0Q o18 +Z3 ^n +Z3 ^m +A +Z3 $m +Z3 L3 o85 +z3 L1 o7e +Z3 $L +$# Z3 l +^Z ^3 l +Z3 $j Z4 +Z3 $j i1f +Z3 i9- +Z3 i6b +Z3 i5 Y3 +Z3 i5_ x63 +Z3 i5i { +Z3 i54 d +Z3 i51 +z3 i33 *81 +z3 i2x D3 +z3 i2R +1 +Z3 i1O +6 +z3 i1k +Z3 i1f $j +z3 i1b x54 +z3 i0a +Z3 ^i +Z3 ^H u +Z3 ^g o59 +z3 f x5B +Z3 E T1 +Z3 E .5 +$. Z3 E +Z3 ^d Z5 +z3 d x71 +Z3 d i7s +} z3 DB +Z3 d 'A +Z3 d +6 +Z3 D5 [ +z3 D3 i2x +Z3 D2 x31 +Z3 D1 +6 +Z3 D0 D4 +z3 ^d +Z3 C +$? Z3 c +z3 { c +Z3 *B7 +$# Z3 +B +^> z3 'B +Z3 $A o6o +Z3 +A i7P +Z3 *A6 +z3 ^A -6 +{ Z3 $A +Z3 ^9 z3 +z3 ,9 y3 +Z3 +8 *47 +Z3 +8 *45 +z3 *82 *51 +z3 *82 { +Z3 -8 +^z *37 x15 +Z3 .7 u +Z3 -7 u +Z3 $7 r +Z3 +7 o5# +Z3 '7 i2g +z3 *79 *42 +Z3 *79 +Z3 *72 x04 +Z3 +6 o70 +z3 *68 Y4 +Z3 +6 *52 +Z3 *63 *18 +Z3 -6 } +Z3 .5 E +Z3 *53 o4N +Z3 *52 +6 +z3 *52 .1 +z3 *51 *82 +Z3 +5 *10 +Z3 *50 Z5 +$+ Z3 *50 +$z *35 +Z3 -4 Y4 +Z3 *47 +8 +Z3 *45 +8 +Z3 *43 Y4 +z3 *42 *79 +z3 *41 Y3 +$. z3 *41 +Z3 +4 ] +Z3 ] +4 +Z3 ^3 Z5 +z3 -3 t +z3 .3 -2 +z3 ] -3 +z3 -3 ] +z3 +2 $q +z3 *28 { +z3 *27 i64 +z3 *25 +z3 *24 o0t +z3 -2 .3 +z3 -1 $z +z3 +1 i2R +Z3 ,1 *91 +z3 +1 ^9 +Z3 *18 *63 +Z3 *17 o9a +z3 *17 +z3 *15 +Z3 ,1 *19 +Z3 *10 +5 +Z3 $1 +Z3 ,1 +$$ Z3 -1 +Z3 +0 z5 +z3 +0 o2g +z3 +0 ^A +z3 *07 y1 +$! z3 *04 +$ Z3 -0 +] Z3 $0 +z3 +0 +$z *30 +Z3 $* +Z3 $@ { +Z3 } +Z3 { { +$+ Z3 +$% Z3 +$# Z3 +$, Z3 +$= Z3 +$` Z3 +[ $ Z3 +z3 { +$z $3 +$z ^3 +$+ z3 +} $z +3 +] ^> z3 +^z .3 +^z ,3 +^\ z3 +^* z3 +^? z3 +^< z3 +Z2 ^Z Z5 +Z2 ^Z o1v +Z2 Z5 Z5 +Z2 Z5 z3 +Z2 Z5 ^Z +z2 Z5 o3s +Z2 ^z *58 +Z2 Z5 *43 +} z2 z5 +Z2 Z4 x04 +Z2 z3 Z5 +z2 Z3 ^p +Z2 $Z *35 +$ z2 Z3 +z2 Z2 -6 +Z2 z2 +3 +Z2 z2 $1 +Z2 $( Z2 +Z2 Z2 +Z2 z2 +^% Z2 z2 +^% z2 Z2 +z2 Z1 x42 +Z2 z1 $U +z2 Z1 *A0 +$% Z2 Z1 +$$ Z2 z1 +Z2 { $z +z2 ^Z +Z2 y5 t +Z2 Y5 D1 +Z2 Y4 $x +Z2 Y4 c +Z2 Y4 *08 +Z2 y4 +Z2 y3 s5O +Z2 y3 *8A +[ Z2 y3 +z2 Y3 +Z2 y2 y1 +z2 Y2 x43 +z2 Y1 s2* +Z2 y1 -2 +Z2 Y1 +Z2 y1 +z2 x92 .2 +z2 x83 +0 +z2 x81 *40 +$# Z2 x72 +Z2 x68 +Z2 x63 .2 +Z2 x62 *53 +z2 x62 +1 +Z2 x61 t +Z2 x59 +Z2 x53 ^w +z2 x53 i1o +z2 x43 Y2 +Z2 x43 o6? +Z2 x43 [ +Z2 x43 +z2 x42 Z1 +] Z2 x42 +z2 x42 +z2 x37 t +z2 x36 t +Z2 x36 +Z2 x35 y4 +Z2 x34 +z2 x32 i0s +$- Z2 x31 +Z2 x24 l +z2 x15 t +Z2 x12 $9 +$$ Z2 x12 +Z2 x04 Z4 +Z2 x03 z2 +Z2 x03 t +Z2 x03 shP +Z2 x03 o8! +z2 $W E +Z2 $W +Z2 ^W +Z2 $w +z2 ^w +Z2 $v D5 +Z2 $U z1 +z2 u o15 +Z2 u i8B +Z2 u *52 +z2 u *13 +$# Z2 u +Z2 t y5 +Z2 t x61 +z2 t x37 +z2 t x36 +z2 t x15 +Z2 t x03 +Z2 t s59 +Z2 t o8- +z2 t o24 +Z2 t i0a +Z2 t .6 +Z2 T0 -7 +Z2 $t +Z2 sys $A +[ Z2 sv_ +Z2 sth D2 +Z2 srl *34 +Z2 s.P +Z2 soO +z2 snT .2 +Z2 shP x03 +Z2 $S E +Z2 sc x03 +z2 s9H +Z2 s9 +z2 s8 r +z2 ^s $7 +Z2 s5O y3 +Z2 s59 t +z2 s3. +0 +Z2 $s .3 +z2 s2* Y1 +z2 s24 +Z2 s2. +1 +Z2 s19 +Z2 s18 +Z2 s0% +z2 ^S +^. z2 ^s +Z2 r o8m +Z2 r ^n +Z2 R6 u +Z2 R5 $@ +Z2 $@ R5 +z2 R3 R2 +z2 R2 R3 +z2 R2 r +Z2 r *05 +{ Z2 $r +Z2 ^Q ^W +Z2 $Q +z2 ^p Z3 +z2 ^P o3j +Z2 p5 +7 +z2 p2 $z +Z2 p2 x02 +z2 p2 { +z2 { p2 +z2 p1 y1 +Z2 p1 x23 +Z2 p1 x13 +Z2 p1 +z2 oAS .2 +Z2 oA2 E +Z2 o9$ iAO +Z2 o9h +Z2 o9B iAV +Z2 o93 C +Z2 o93 +1 +Z2 o8- t +Z2 o8q +Z2 o8- $4 +Z2 o8/ +[ Z2 o8% +Z2 o7x +Z2 o7, D1 +Z2 o7C Z1 +z2 o77 [ +Z2 o72 +Z2 o70 x02 +Z2 o6o +z2 o66 +Z2 o5A C +Z2 o57 +z2 o57 +[ Z2 o5@ +Z2 o3* y4 +Z2 o3_ y3 +Z2 o3x *37 +z2 o3t +z2 o3s Z5 +Z2 o3s +} z2 o33 +Z2 o3_ +z2 o2x +Z2 o2s +Z2 o2p +7 +z2 o2c *25 +z2 o2A +z2 o2_ -8 +z2 o24 t +z2 o1v $0 +z2 o1m +z2 o1l +z2 o19 *53 +z2 o16 +z2 o15 u +Z2 o1; ,5 +z2 o1. ^1 +Z2 o0y *62 +Z2 o0w ^q +Z2 o0w +z2 o0W +Z2 o0s +1 +Z2 o0s +Z2 o0f -8 +Z2 o0f *63 +z2 o0a *52 +$ Z2 o06 +] z2 o03 +Z2 $n +z2 $m +Z2 l x24 +Z2 l i8, +Z2 L8 Z1 +Z2 L6 y2 +Z2 L5 $* +Z2 $* L5 +Z2 ^l *28 +Z2 $L +] z2 l +^| z2 ^l +Z2 k +6 +Z2 k *34 +Z2 $k .0 +Z2 $K +z2 ^j x39 +Z2 $I $Q +Z2 iAV o9B +Z2 iAO o9$ +Z2 iA. +Z2 i8m +Z2 i8, l +Z2 i8j +Z2 i8B u +Z2 i82 +Z2 i8$ +Z2 i8- +{ Z2 i7o +$# Z2 i76 +z2 i72 { +Z2 i7 +$z -2 i6o +Z2 i6e -0 +$. Z2 i66 +Z2 i5c +Z2 i5a +Z2 i55 ^l +Z2 i4n DB +Z2 i4l +Z2 i4. +Z2 i2s +Z2 i2k +z2 i2F $! +z2 $! i2F +z2 i2c +z2 i2A +z2 i2. +z2 i2_ +$& Z2 i1x +z2 i1u +z2 i1o x53 +z2 i1& +Z2 i0E +z2 i0b +Z2 i0# +Z2 i0$ $# +Z2 $# i0$ +z2 ] ^H +z2 ^H ] +] z2 ^H +z2 f xA7 +z2 f x5B +Z2 f i74 +Z2 ^F *37 +Z2 $f +Z2 ^f +Z2 E oA2 +z2 ^e i3o +{ Z2 E +^> z2 ^e +Z2 d x21 +Z2 d x09 +Z2 d x03 +Z2 d D2 +Z2 DB i4n +z2 D9 +Z2 ^d -7 +Z2 D6 x81 +Z2 D5 $v +^ z2 D5 +z2 D4 L4 +$. Z2 D4 +Z2 D3 ,7 +$ Z2 D3 +Z2 D2 sth +Z2 D1 Y5 +Z2 D1 C +z2 $D *13 +Z2 D0 *73 +Z2 c Y4 +Z2 C o93 +Z2 C o5A +z2 ^C o2c +Z2 C D1 +Z2 c $a +z2 C *97 +z2 c '9 +Z2 C -7 +Z2 c *5A +Z2 C *02 +Z2 ^c } +z2 ^C +z2 C +z2 ^b ^r +Z2 ^b ^b +z2 $b ^a +Z2 ^B +7 +Z2 +B ,3 +Z2 $B +Z2 $a Z3 +Z2 $A sys +Z2 ^A i1* +Z2 $a c +z2 ^a $b +Z2 *A7 r +Z2 *A7 *26 +z2 $A ,6 +Z2 *A3 +z2 $a *18 +z2 $A +Z2 $9 x12 +z2 '9 c +z2 *97 C +} Z2 *96 +z2 -9 ,4 +$! Z2 *90 +Z2 -9 { +Z2 $8 Z3 +z2 -8 o2_ +Z2 -8 o0f +Z2 *8A D7 +Z2 *85 i61 +z2 -8 *40 +z2 *83 ^J +z2 +8 -0 +Z2 -7 T0 +z2 $7 ^s +Z2 +7 o2p +Z2 -7 C +Z2 *7A D3 +Z2 +7 +5 +Z2 *74 $6 +Z2 $7 ^3 +Z2 +7 +z2 -6 Z2 +Z2 .6 t +Z2 -6 q +Z2 +6 k +z2 ,6 $A +Z2 *69 +z2 *68 { +Z2 $6 *74 +Z2 *67 +z2 *64 Y5 +Z2 [ *64 +Z2 *63 o0f +Z2 *62 o0y +z2 *62 $* +z2 $* *62 +Z2 *61 $* +Z2 $* *61 +z2 *60 D6 +z2 ^5 z5 +Z2 ,5 o1; +Z2 *5A x52 +Z2 *5A c +Z2 *58 x81 +Z2 +5 +7 +[ Z2 *57 +Z2 *53 x62 +z2 *53 o19 +z2 +5 *31 +^+ z2 *53 +Z2 *52 u +z2 *52 o0a +Z2 +5 .2 +z2 *52 +z2 *51 D4 +Z2 *51 ,4 +Z2 -5 $0 +Z2 -5 +z2 ,5 +[ z2 -5 +Z2 $4 o8- +z2 ,4 -9 +Z2 *47 +$ Z2 *47 +Z2 ,4 *51 +Z2 *43 Z5 +Z2 *41 +z2 *41 +z2 *40 x81 +z2 *40 -8 +Z2 ^4 +z2 ,4 +z2 -4 { +Z2 .3 $s +Z2 ,3 +B +Z2 *37 +Z2 ^3 $7 +Z2 *35 $Z +Z2 *34 srl +Z2 *34 k +$< Z2 *34 +z2 *31 +5 +^> z2 *30 +Z2 ,2 y1 +z2 .2 x92 +Z2 .2 x63 +z2 .2 snT +z2 .2 oAS +Z2 } *28 +Z2 *27 .2 +Z2 *26 *A7 +Z2 .2 +5 +Z2 .2 *34 +z2 *23 { +$, Z2 +2 +$ Z2 -2 +z2 +2 +Z2 $1 z2 +$z *21 Y1 +z2 +1 x62 +Z2 +1 s2. +z2 +1 q +Z2 +1 o93 +Z2 +1 o0s +z2 *18 $a +] Z2 *17 +z2 *15 } +z2 *13 u +z2 *13 $D +Z2 $1 [ +Z2 } ,1 +Z2 [ $1 +z2 $+ -1 +z2 -1 $+ +^- z2 +1 +z2 +0 y4 +z2 +0 x83 +z2 $0 o1v +Z2 .0 $k +Z2 -0 i6e +} z2 *09 +z2 *08 ^W +z2 -0 +8 +z2 *07 +Z2 *06 E +z2 *06 ^E +Z2 $0 -5 +[ Z2 *01 +{ Z2 .0 +z2 ] -0 +z2 -0 ] +} z2 +0 +Z2 $# +Z2 $, +Z2 $< +Z2 } ^# +Z2 } +Z2 { +$+ Z2 } +$# Z2 } +$& Z2 +$' Z2 +$. { Z2 +^Z +2 +^% Z2 $+ +^# Z2 ^$ +^# ^$ Z2 +z2 { $_ +z2 { +z2 ] +$z -2 +$= z2 +} } z2 +] z2 +[ z2 +^( z2 +^/ z2 +^| z2 +^> z2 +^= z2 } +z1 $z Z1 +Z1 $z y4 +Z1 $z k +Z1 ^z *60 +z1 z5 x74 +z1 z5 $W +z1 z5 +^* z1 z5 +Z1 z4 t +$$ z1 Z3 +z1 ^ z3 +z1 Z2 s8+ +z1 z2 $S +z1 Z2 ^n +z1 Z2 ^M +Z1 z2 -2 +Z1 Z2 +$% Z1 Z2 +$$ z1 Z2 +Z1 z1 ^l +z1 Z1 ^J +Z1 $* Z1 +$] Z1 Z1 +^Z ^1 Z1 +$\ Z1 z1 +^, Z1 z1 +z1 Z1 $@ +$\ z1 Z1 +^, z1 Z1 +Z1 $z +z1 ^z +Z1 $y Z2 +Z1 y5 y5 +Z1 Y5 x52 +Z1 y5 sys +Z1 y4 $z +Z1 Y4 Y4 +Z1 y4 x72 +Z1 y4 x63 +Z1 Y4 ^b +Z1 Y4 +4 +Z1 Y4 *31 +z1 Y4 *21 +Z1 y4 +Z1 Y3 x62 +z1 Y1 i0i +z1 Y1 ^H +Z1 y1 ^g +Z1 Y1 ,8 +Z1 y1 +$\ z1 Y1 +$` z1 Y1 +Z1 $X x51 +z1 xA2 i1R +} z1 x93 +Z1 x82 *16 +Z1 x74 Y2 +Z1 x72 ,6 +$ Z1 x71 +Z1 x67 +Z1 x65 $! +Z1 $! x65 +Z1 x62 Y3 +Z1 x54 y5 +Z1 x52 t +z1 x52 *03 +Z1 x51 $X +z1 x51 R2 +z1 x43 +Z1 x42 .3 +z1 x41 o0c +Z1 x41 $$ +Z1 $$ x41 +Z1 x38 $! +Z1 $! x38 +Z1 x36 +$/ Z1 x32 +Z1 x31 +6 +Z1 x31 +Z1 x24 +4 +z1 x23 ^! +z1 x21 o2@ +z1 x14 i4l +Z1 x13 z2 +Z1 x0A +Z1 x04 y5 +Z1 x03 $7 +Z1 x03 $0 +Z1 x02 p1 +Z1 x02 $9 +Z1 x01 ^M +z1 $W z5 +Z1 $w *47 +Z1 $! $w +z1 ^w +z1 u o2- +Z1 u i85 +Z1 ^U i1M +Z1 u D2 +$& Z1 u +{ Z1 u +Z1 t z4 +Z1 t x52 +Z1 t T8 +Z1 T9 $m +Z1 T8 t +z1 T7 +4 +Z1 T5 { +Z1 { T4 +z1 ^t +3 +Z1 T2 o0L +Z1 T1 +9 +Z1 T0 i4u +Z1 T0 $9 +Z1 $T +Z1 t +^! z1 t +z1 $S z2 +Z1 sys y5 +Z1 ssz +Z1 sok +Z1 $S o3w +Z1 so0 +Z1 so) +z1 sL, $5 +Z1 sgG +Z1 sec +z1 s8+ Z2 +Z1 s8. *58 +Z1 s80 +z1 s6d p2 +Z1 s3H +Z1 s26 p5 +Z1 s26 +Z1 s2* +Z1 s1s k +Z1 s1- o07 +Z1 s1D *75 +z1 s14 i1B +Z1 s12 +z1 ^S +} z1 $S +z1 R2 x51 +Z1 r +Z1 $q *27 +z1 ^p y2 +Z1 $p c +Z1 p5 s26 +$. Z1 p5 +z1 $p ,5 +Z1 p4 x07 +Z1 p4 T1 +Z1 p4 c +Z1 p2 x06 +z1 p2 x02 +z1 p2 s6d +Z1 p2 $j +Z1 p2 ^G +Z1 p1 x0B +z1 p1 T9 +z1 p1 $A +Z1 p1 +Z1 $o r +Z1 o8p +Z1 o8k +Z1 o8e o0B +Z1 o85 c +Z1 o81 D2 +Z1 o8 +Z1 o7@ o0H +Z1 o7+ $i +Z1 o7C *18 +Z1 o7a +Z1 o7+ ,8 +Z1 o6t *06 +Z1 o68 +Z1 o5k +z1 o5! ,8 +Z1 o55 +$? Z1 o5, +Z1 o4t { +Z1 o4s +Z1 o4r *53 +Z1 o4O $. +Z1 $. o4O +Z1 o4n o3a +Z1 o4n +Z1 o4m $? +Z1 $? o4m +Z1 o4m +Z1 o4I c +Z1 o44 +$! Z1 o4! +Z1 o3w $S +Z1 o3q +4 +z1 o3p E +z1 o3d *41 +Z1 o3a o4n +Z1 o3a c +z1 o2z c +z1 o2- u +} z1 o2n +Z1 o2f +z1 o2c *14 +Z1 o2@ *85 +z1 o27 o0a +z1 o2- *40 +Z1 o24 +z1 o2, +z1 o2= +Z1 o1w +Z1 o1O +Z1 o1n +Z1 o1L ^K +Z1 o1b o0u +Z1 o17 +Z1 o14 +[ Z1 o1$ +z1 o0W $6 +Z1 o0u o1b +Z1 o0u } +Z1 o0T C +Z1 o0M +Z1 o0L T2 +Z1 o0J +Z1 o0H o7@ +z1 o0c x41 +Z1 o0C .2 +Z1 o0B o8e +z1 o0a o27 +Z1 o07 s1- +z1 $O *07 +z1 ^n Z2 +z1 ^M Z2 +Z1 $m T9 +Z1 $M $M +Z1 $M +{ Z1 ^M +Z1 $m +Z1 l i3? +z1 l i1v +Z1 l $7 +Z1 l ^1 +Z1 $l +Z1 l +Z1 k $z +Z1 k s1s +z1 ^K $7 +Z1 k +$ Z1 k +z1 ^J Z1 +z1 ^J r +z1 ^J ^J +z1 $j +Z1 $i o7+ +Z1 iB +Z1 iAr u +Z1 iAo +Z1 iA2 D8 +Z1 iA- +z1 i9= x03 +Z1 i8u E +Z1 i8o [ +z1 i8K .7 +z1 i8@ c +Z1 i85 u +Z1 i81 +Z1 i7W *56 +Z1 i7u +Z1 i74 +Z1 i7. .2 +Z1 i7# $. +Z1 i7, +Z1 $. i7# +z1 i7_ +Z1 i6t +Z1 i6k +z1 i6@ i0o +Z1 i6b x14 +z1 i67 -2 +z1 i63 +Z1 i6% +Z1 i6- +Z1 i5q +{ Z1 i53 +Z1 i5. +z1 i4w *94 +Z1 i4u T0 +Z1 i4L C +Z1 i4e E +Z1 i42 +Z1 i4* +Z1 i3v c +Z1 i3q +Z1 i3? l +z1 i3k +Z1 i3H +Z1 i3b +Z1 i30 +z1 i3@ +z1 i3! +Z1 i2z +z1 i2s +Z1 i2R +z1 i2# +4 +Z1 i22 *57 +Z1 i2@ +z1 i2% +z1 i1Z +z1 i1v l +Z1 i1u ,3 +z1 i1p +Z1 i1o +Z1 i1i +Z1 i1h +z1 i1c ^B +z1 i1B s14 +Z1 i1B +} Z1 i19 +z1 i1& +z1 i1_ +Z1 i0w y4 +z1 i0m -3 +z1 i0m *03 +Z1 i0l i4e +z1 i0K i61 +z1 i0i Y1 +Z1 i0B +Z1 i08 ^z +z1 ^H Y1 +z1 ^h *54 +z1 $H *16 +Z1 ^H +z1 f x7B +z1 f x78 +z1 f x68 +Z1 ^F *31 +z1 E o3p +Z1 E i8u +Z1 E i4e +z1 $E C +Z1 E *45 +Z1 E $+ +Z1 $+ E +$* Z1 E +z1 $e +Z1 d x87 +z1 d 'B +Z1 d +A +z1 $d $a +Z1 D8 +z1 D6 *52 +z1 D5 $5 +Z1 D4 .2 +Z1 D2 u +$^ Z1 D2 +Z1 D1 *28 +$- Z1 d +z1 ^d } +z1 ^) d +Z1 c p4 +Z1 c $p +Z1 c o85 +Z1 c o3a +z1 c o2z +z1 c $K +z1 c i8@ +Z1 C i4L +Z1 c i3v +z1 C $E +z1 c *56 +z1 ^c ,5 +Z1 C +Z1 c $/ +Z1 $/ c +Z1 ^c } +} z1 ^c +Z1 ^b Y4 +z1 ^a z4 +Z1 $a *A4 +z1 $A -8 +Z1 *A7 x35 +Z1 *A6 *59 +z1 $A .5 +Z1 *A4 $a +Z1 ^A *37 +Z1 +9 Y3 +Z1 $9 x02 +Z1 +9 T1 +Z1 $9 T0 +Z1 .9 *A7 +z1 +9 *46 +Z1 ,8 Y1 +z1 ,8 o5! +z1 -8 $A +Z1 *86 *73 +Z1 *85 o2@ +z1 *83 +7 +Z1 *83 [ +Z1 $8 *16 +z1 .8 *16 +Z1 -8 .1 +Z1 $/ -8 +Z1 -8 $/ +z1 -8 +Z1 $7 x03 +Z1 $7 l +z1 $7 ^K +z1 ,7 i0m +z1 ^7 ^b +Z1 *79 x81 +z1 +7 *83 +Z1 *75 s1D +Z1 *75 +Z1 *74 -7 +z1 *74 .2 +Z1 *73 *86 +Z1 .7 .2 +Z1 *71 q +Z1 $* ,7 +Z1 ,7 $* +Z1 ,6 x72 +Z1 -6 ^p +z1 $6 o0W +} Z1 *67 +z1 *64 *06 +Z1 .6 -4 +Z1 -6 +4 +Z1 *63 ,5 +Z1 $6 .2 +z1 ,6 .2 +Z1 -6 [ +} Z1 .6 +z1 ,6 +Z1 -5 x03 +z1 $5 sL, +Z1 +5 p1 +z1 ,5 $p +z1 $5 D5 +z1 .5 $A +Z1 *59 *A6 +Z1 *58 s8. +Z1 { *58 +Z1 *56 i7W +z1 *56 c +Z1 ,5 *63 +$+ Z1 *56 +$= Z1 *56 +Z1 *53 o4r +z1 *53 *46 +z1 *52 D6 +z1 *51 -4 +Z1 *50 +$$ Z1 +5 +[ Z1 +5 +z1 $5 +Z1 +4 Y4 +z1 +4 T7 +Z1 +4 o3q +Z1 *47 +z1 *46 +9 +z1 *46 *53 +z1 *46 *31 +Z1 +4 -6 +Z1 -4 .6 +Z1 *45 E +z1 -4 *51 +z1 ,4 *40 +Z1 *42 +3 +z1 *41 o3d +z1 *40 o2- +Z1 [ .4 +[ Z1 .4 +z1 -4 +z1 ^4 +z1 *38 i0b +Z1 ,3 *53 +Z1 *35 +0 +Z1 +3 *42 +z1 ,3 *25 +Z1 *31 Y4 +z1 *31 *46 +z1 *31 *34 +z1 *31 *20 +Z1 -3 $1 +{ Z1 *31 +z1 *31 $! +z1 $! *31 +Z1 +3 +z1 '3 +z1 $2 $s +Z1 .2 o0C +Z1 .2 i7. +z1 -2 i67 +Z1 .2 D4 +Z1 *27 $q +z1 .2 *74 +Z1 .2 .7 +$% Z1 *27 +Z1 .2 $6 +z1 .2 ,6 +z1 *24 y5 +Z1 *21 $ +Z1 $ *21 +z1 -2 -1 +z1 *20 *31 +$@ Z1 .2 +z1 ^1 x72 +Z1 ^1 l +Z1 *18 o7C +Z1 .1 -8 +z1 *17 $. +z1 $. *17 +Z1 *16 x82 +z1 *16 $H +Z1 *16 $8 +z1 *16 .8 +z1 *14 o2c +Z1 $1 -3 +z1 ^1 *23 +z1 -1 -2 +$^ Z1 ,1 +^ Z1 ,1 +z1 ^1 +Z1 $0 x03 +z1 ^0 d +z1 *07 $O +^. z1 *07 +z1 *06 } +z1 *05 ] +z1 ] *05 +z1 *04 x31 +z1 *03 x52 +Z1 +0 *35 +$ Z1 *02 +z1 ^0 +^* z1 ^0 +Z1 $# +Z1 $- +Z1 $_ [ +Z1 $ { +Z1 $= +Z1 { { +Z1 [ $_ +Z1 [ +$# $Z +1 +$' Z1 } +$. Z1 ^@ +$. ^@ Z1 +$= Z1 $( +$^ Z1 { +} Z1 +[ { Z1 +^Z +1 +^/ $; Z1 +z1 $# +z1 $\ $\ +z1 $. ^* +z1 ^* $. +} z1 } +^' z1 { +^- z1 ^< +$z .0 Z1 +$z -0 u +^z *05 L6 +$z *05 +^z *02 -7 +$Z $! +$! ^Z +{ $Z +^Z $* +^Z $$ +$z $$ +$z $. +$% ^z +$& ^z +} $! ^z +} ^z $! +^z $* +^z $- +^ ^z +$y z5 Z4 +$y Z4 z5 +^y z2 Y1 +$y Z2 o08 +^Y z2 *45 +$Y Z2 +^Y z2 +$y $ Z2 +^y Z2 +$y Z1 z1 +$y z1 Z1 +^Y Z1 ^N +$Y $Z +] $Y y5 +$y Y5 ] +^y y4 +$y Y3 +$Y y2 +$y y2 +^y y2 $. +^y $. y2 +^y Y1 z2 +^Y Y1 ^W +^y Y1 o1d +^y Y1 } +^y y1 +$Y $Y +$Y $y +] ^y ^Y +$y x85 +$y x73 +$y x64 $1 +^Y x45 ^G +^y x43 +^y x42 +^y x35 +$y x34 $c +$y x34 +^Y x13 i5m +$* ^y x13 +$Y x02 +^y ^X +^Y ^W Y1 +^y ] $w +$y $v +$y ^v +^Y $u *76 +$Y t s2@ +$Y t $h +$Y TA $m +$Y $T +} $Y ^t +$y snc +^Y s3! i1u +$Y s2@ t +$y s0q *71 +$y r i3k +$y r *52 +^Y $R +$y $Q Y1 +$y q x07 +$y $q +$y p5 i49 +$y o9l +$Y o8X l +$Y o8_ l +^Y o81 o0A +$y o6f x41 +^y o5M +^Y o4o *50 +^y o4l +^y o45 +$y o3z +$y o3p +^Y o3h +^Y o36 +$Y o31 +^y o2i +^Y o1Z +^y o1j +^y o1d Y1 +^Y o0A o81 +$y o08 Z2 +$y o0@ *43 +$Y $O +^Y $o +$y $O +^Y ^N Z1 +$Y $m TA +$y $m +$Y l o8_ +$Y l i5l +{ $y L7 +$y L6 +^y ^l +^y K ^b +$y K -0 +$Y $K +$y K +^y $k +^y ^k +$y iAq x17 +$Y i8j +$y i6y +^y i6W +^y i6v +^Y i5y +$Y i5l l +^y i4p +$y i4l +$y i4j +^y i31 +^y i3 +^y i2m +$y i2d +^Y i2A +$Y i1x +^Y i1u s3! +^Y i1u +^y i1i +^Y i1C +$y i1- +^Y i0W +^y i0P +^y i0N +$y i0k o03 +^y i07 +$Y ^H +$y $h +^y ^G +$y $g +$y ^g +$Y $F +$Y $f +$Y E o0y +^Y $E +$y ^e } +$y D6 { +^Y D1 $3 +^y ^D +$y $c x34 +^Y $C +^Y $c +^y ^b K +$y *9B +$Y $9 +$y *80 +^Y $8 +^y $8 +$y *78 x32 +^y *72 +$y *71 s0q +$y $7 +^y -7 +$y .6 *62 +$y *63 +$y .6 +^y +6 +^y ,6 +y5 Z5 xA6 +y5 Z4 x67 +y5 Z3 i57 +y5 z3 *3A +Y5 Z3 +Y5 Z1 x05 +Y5 Z1 x04 +Y5 z1 u +y5 y5 Y3 +Y5 y5 x27 +Y5 Y5 x12 +Y5 y5 *B0 +y5 Y5 *B0 +Y5 Y5 +y5 y4 u +y5 Y4 t +y5 Y3 y5 +y5 Y3 x62 +Y5 Y2 x39 +y5 Y1 o92 +y5 ] $Y +] y5 $Y +Y5 xA4 .6 +y5 xA3 i5, +y5 xA3 E +y5 xA2 x34 +Y5 xA2 x25 +y5 xA2 o5k +Y5 xA2 +y5 xA1 T5 +y5 xA1 oB) +y5 x97 o7l +y5 x96 *54 +y5 x96 *45 +y5 x95 +y5 x93 x62 +y5 x92 sn/ +y5 x92 o38 +y5 x91 u +y5 x89 y5 +y5 x86 -3 +y5 x85 u +y5 x84 .4 +Y5 x83 x32 +y5 x83 k +Y5 x83 c +y5 x82 siv +y5 x82 C +y5 x82 .2 +y5 x82 $* +y5 $* x82 +y5 x81 E +y5 x78 +y5 x74 o0d +y5 x74 i5W +y5 x73 y2 +Y5 x73 x41 +Y5 x73 r +y5 x73 c +Y5 x73 -4 +Y5 x72 s49 +Y5 x72 +A +y5 x72 ,5 +y5 x71 ^V +y5 x71 +0 +y5 x67 T2 +y5 x64 t +Y5 x64 +y5 ^# x64 +y5 x63 .7 +] Y5 x63 +y5 x62 Y3 +Y5 x62 p4 +Y5 x62 o5m +y5 x62 o4K +Y5 x62 c +Y5 x62 *A8 +[ y5 x62 +y5 [ x61 +Y5 x5A $R +y5 x58 +Y5 x56 t +y5 x56 $r +y5 x54 k +Y5 x54 D5 +Y5 x53 *49 +y5 x52 [ +y5 x51 o0N +Y5 x51 ] +Y5 ] x51 +Y5 x49 Y5 +y5 x48 +7 +Y5 x47 *04 +Y5 x46 $3 +$* Y5 x46 +Y5 x43 i0f +Y5 x42 +Y5 x41 t +Y5 x3A +Y5 x39 Y2 +y5 x38 t +Y5 x37 +Y5 x36 o77 +Y5 x36 *50 +y5 x34 o1h +y5 x34 l +y5 x34 K +Y5 x32 *98 +y5 x31 x74 +Y5 x31 $u +{ Y5 x31 +y5 x31 +Y5 x2B u +y5 x29 i1o +Y5 x28 T4 +Y5 x26 +Y5 x25 i82 +Y5 x25 c +Y5 x25 *21 +Y5 x24 ^y +Y5 x23 K +y5 x21 x67 +y5 x21 o0R +Y5 x1A +Y5 x18 T0 +Y5 x18 t +Y5 x18 l +Y5 x18 C +Y5 x17 *64 +Y5 x16 -7 +Y5 x16 +2 +Y5 x15 $o +Y5 x15 $n +Y5 x15 i4w +Y5 x14 '7 +Y5 x14 +$* Y5 x14 +Y5 x13 $l +Y5 x13 +7 +Y5 x13 $* +Y5 $* x13 +Y5 x12 Y5 +y5 x08 t +y5 x07 i5& +Y5 x06 -1 +Y5 x05 Z1 +Y5 x05 t +Y5 x04 Z1 +$& Y5 x04 +y5 x03 t +y5 x02 x51 +Y5 x02 t +y5 x02 t +y5 x02 o2r +Y5 x02 l +Y5 x02 +Y5 ^w +y5 ^V x81 +Y5 u z1 +y5 u y4 +y5 u x91 +y5 u x85 +Y5 $u x31 +Y5 u x2B +Y5 u o9B +y5 u o6a +y5 u i40 +y5 u DB +y5 u +9 +y5 u +0 +y5 u $0 +Y5 u ] +Y5 ] u +] Y5 u +y5 t Y4 +y5 t x64 +Y5 t x56 +Y5 t x41 +y5 t x38 +Y5 t x18 +y5 t x08 +Y5 t x05 +y5 t x03 +Y5 t x02 +y5 t x02 +Y5 t $s +Y5 t o0M +Y5 t D4 +y5 t *B6 +y5 TA $j +Y5 TA +y5 t .A +Y5 T8 +y5 T8 +Y5 T7 T5 +Y5 T6 ] +Y5 ] T6 +y5 T5 xA1 +Y5 T5 T7 +Y5 T5 $1 +y5 T4 T3 +y5 T3 T4 +y5 T2 x67 +Y5 T0 x18 +Y5 t $0 +Y5 t ] +Y5 ] t +Y5 ^t +y5 t $* +y5 t ^( +y5 $* t +y5 ^( t +y5 t +y5 szi D9 +y5 sua ,5 +y5 $s t +y5 ss2 +y5 srn +y5 soe o45 +y5 sn/ x92 +y5 smp t +y5 slJ o5d +y5 siv x82 +y5 sg7 C +Y5 s9X ^L +Y5 s49 x72 +y5 s3u E +Y5 $R x5A +y5 $r x56 +Y5 r D9 +} Y5 RB +] y5 RA +y5 R9 $2 +Y5 p3 o8l +Y5 $o x15 +Y5 oBu +y5 oBe +Y5 oB1 +y5 oAu E +Y5 oAr +Y5 oAj +y5 oAi E +Y5 oA2 +[ Y5 oA1 +Y5 oA. +y5 oA+ +y5 oA! +y5 oA_ +Y5 o9v +Y5 o9S +Y5 o9r +y5 o9M l +y5 o9e +Y5 o9B u +y5 o99 *B8 +y5 o98 p2 +y5 o93 +y5 o92 Y1 +y5 o91 ] +y5 ] o91 +Y5 o9_ +Y5 o9 +Y5 o8g x23 +Y5 o8g +Y5 o8 +Y5 o7w +{ Y5 o7s +Y5 o7r K +Y5 o7r +y5 o7r +Y5 o7p +y5 o7l x97 +y5 o7h +y5 o7f DA +Y5 o7d ,9 +Y5 o7d +Y5 o7+ +y5 o6u *82 +y5 o6s +] Y5 o6p +Y5 o6g c +Y5 o6g +y5 o68 +Y5 o6_ +y5 o5w +B +y5 o5w +Y5 o5n +Y5 o5m x62 +y5 o5k xA2 +Y5 o5k E +y5 o5K E +} y5 o5k +Y5 o5h +Y5 o5E +y5 o5d slJ +Y5 o5- +y5 o4K x62 +y5 o4g +y5 o4D i57 +Y5 o4 $D +y5 [ o47 +y5 o45 soe +y5 o4. +y5 o4/ +y5 [ o4- +y5 o3w i5z +y5 o38 x92 +y5 o37 +y5 o2v +y5 o2t .A +Y5 o2p +y5 o2p +y5 o1w l +y5 o1h x34 +Y5 o1c +Y5 o0z +y5 o0u +3 +y5 o0R x21 +y5 o0q +y5 o0N x51 +y5 o0L DB +Y5 o0J $j +y5 o0j D4 +y5 o0J +y5 o0f +y5 o0d x74 +y5 o0c +y5 o0b +y5 o0A +Y5 $n x15 +Y5 ^N +Y5 ^M x14 +y5 l x34 +Y5 l x18 +Y5 $l x13 +Y5 l x02 +Y5 ^L s9X +y5 l o8I +y5 l o1w +y5 $l $f +y5 l 'A +Y5 L9 i9A +Y5 L5 +y5 k x83 +y5 k x54 +y5 K x34 +Y5 K x23 +Y5 K o7r +Y5 k '8 +Y5 ^K +y5 $K +y5 $j TA +Y5 $j $s +Y5 $j o0J +Y5 iB, x26 +y5 iAu +y5 iAs +y5 iAR +y5 iAm +y5 iAJ +y5 iAa x51 +y5 iA1 +Y5 iA. +Y5 i9D x06 +Y5 i9_ +Y5 i8p +Y5 i8m +Y5 i8l +Y5 i8% i86 +Y5 i7z +Y5 i7k +Y5 i7a +Y5 i6m +Y5 i6j +Y5 i6_ +y5 i5z o3w +y5 i5z +y5 i5U +y5 i57 Z3 +y5 i57 o4D +Y5 i5@ +Y5 i5 +y5 i5+ +y5 i5& +y5 i5( +y5 i5/ +y5 i5? +y5 i5= +Y5 i4t ] +Y5 ] i4t +Y5 i46 +y5 i44 +y5 i41 +y5 i40 u +Y5 i1S +Y5 i1l o6b +Y5 i1k +y5 i1= i2P +y5 i13 *62 +y5 i0m oB@ +Y5 ^I +y5 $H Z3 +Y5 ^F x14 +y5 $F +y5 E xA3 +y5 E x81 +y5 E s3u +y5 E oAu +y5 E oAi +Y5 E o5k +y5 E 'A +y5 E -A +Y5 E '9 +y5 E $4 +y5 E $0 +Y5 $E +y5 E +Y5 $d Z2 +y5 d x47 +y5 DB u +y5 DB o0L +y5 DB +y5 DA o7f +Y5 DA +2 +y5 D9 szi +y5 D9 i9s +] y5 D9 +[ y5 D9 +Y5 D8 c +Y5 D7 x13 +Y5 D5 x54 +Y5 D5 +Y5 D4 t +y5 D4 o0j +y5 D3 o4A +y5 D2 x72 +y5 D2 +7 +y5 D0 x62 +y5 D0 $a +Y5 c x83 +y5 C x82 +y5 c x73 +Y5 c x62 +Y5 c x25 +y5 ^c x23 +Y5 C x18 +Y5 c o6g +Y5 c D8 +y5 C 'A +y5 c *81 +y5 C *50 +y5 c $5 +y5 c ,4 +y5 'B $Y +Y5 -B x73 +y5 ^B r +y5 +B o5w +Y5 'B *A7 +y5 *B8 o99 +y5 -B $7 +y5 *B6 t +Y5 +B *6A +y5 *B5 *4B +y5 *B4 x24 +Y5 'B +Y5 ,B +Y5 ^a z1 +y5 -A y5 +y5 +A x13 +y5 .A t +y5 .A o2t +y5 'A l +y5 'A E +y5 -A E +y5 $a D0 +y5 'A C +y5 *AB oA- +Y5 *A8 *31 +Y5 *A7 'B +y5 *A5 x84 +Y5 *A2 D9 +Y5 'A *25 +y5 -A +0 +Y5 'A +Y5 .A +Y5 -A +y5 -A [ +y5 .9 x09 +y5 +9 u +Y5 ,9 o7d +Y5 '9 E +Y5 *9A +2 +y5 +9 *31 +Y5 $9 +y5 -9 +Y5 -8 x52 +Y5 '8 p1 +Y5 '8 k +Y5 '8 d +y5 *89 *75 +Y5 *85 D5 +Y5 *85 -4 +y5 *82 o6u +y5 *81 c +Y5 $8 +y5 [ -8 +y5 '8 +Y5 -7 x03 +y5 *7B x43 +y5 $7 -B +y5 *75 *89 +y5 *74 x75 +y5 *73 x67 +y5 *70 D0 +y5 *70 c +y5 -7 *06 +y5 $7 [ +y5 [ $7 +$y *57 +Y5 .6 xA4 +y5 .6 x42 +Y5 *6A +B +Y5 *67 [ +y5 *67 +Y5 [ *65 +[ Y5 *65 +y5 +6 .5 +y5 -6 +4 +Y5 $6 +y5 ,5 x72 +y5 -5 x01 +y5 ,5 sua +y5 $5 c +[ y5 *56 +y5 *54 x96 +y5 +5 .1 +y5 $! -5 +y5 -5 $! +y5 .4 x84 +Y5 -4 x73 +y5 +4 x13 +y5 $4 E +y5 ,4 c +Y5 -4 *85 +y5 +4 -6 +y5 *45 x96 +y5 *43 +y5 *41 x43 +Y5 *41 x25 +y5 *40 +y5 +4 +y5 -3 x86 +Y5 $3 x46 +y5 +3 o0u +Y5 *31 *A8 +y5 *31 +9 +Y5 -3 +y5 .2 x82 +y5 $2 R9 +$y *52 r +Y5 $2 $H +Y5 +2 DA +Y5 +2 *9A +Y5 *25 'A +Y5 $1 T5 +] y5 *18 +Y5 *17 x25 +y5 .1 +5 +^@ Y5 $1 +y5 +0 x71 +y5 +0 u +y5 $0 u +Y5 $0 t +^Y *50 o4o +y5 $0 E +y5 +0 -A +y5 *06 -7 +y5 *04 x23 +Y5 *03 x15 +y5 *02 +Y5 $. +Y5 ] ] +Y5 [ +y5 ^% +$y $5 +$+ y5 +$* y5 +$@ y5 +$. y5 +$! y5 +$, y5 +} y5 [ +{ y5 +[ y5 [ +y4 ^z z4 +Y4 ^z t +Y4 $z ^A +Y4 Z5 x62 +y4 Z3 x58 +y4 $' Z3 +y4 Z1 $z +y4 Z1 x84 +Y4 Z1 x65 +y4 z1 D3 +Y4 ^z +Y4 $y ^w +y4 y5 x68 +y4 Y5 *02 +y4 y4 xB6 +Y4 y4 x85 +y4 Y4 x81 +Y4 Y4 u +y4 y4 T0 +Y4 Y4 r +Y4 Y4 *34 +Y4 Y4 $1 +Y4 Y3 Y2 +y4 Y3 x83 +y4 Y3 t +Y4 y2 y4 +y4 Y2 Y2 +y4 y2 x82 +y4 y2 x71 +Y4 Y2 x42 +y4 Y2 t +Y4 y2 D3 +y4 Y2 *B8 +Y4 y2 -5 +y4 y2 ,5 +y4 Y1 x62 +Y4 Y1 +y4 Y1 [ +y4 [ Y1 +$$ y4 Y1 +Y4 $X Z4 +y4 ^x L0 +y4 xB4 *10 +y4 xB2 +Y4 xA7 $s +] Y4 xA3 +y4 xA2 x72 +y4 xA2 c +y4 xA1 ] +y4 ] xA1 +Y4 x95 +y4 x92 o0S +Y4 ^. x92 +Y4 x91 *58 +Y4 x91 $5 +y4 x85 C +y4 x84 Z1 +y4 x83 Y3 +Y4 x82 *81 +Y4 x82 -6 +y4 x82 } +y4 x81 Y4 +y4 x81 ^M +y4 x75 -7 +Y4 x75 *64 +Y4 x75 +y4 x74 .4 +y4 x74 +y4 x73 t +y4 x73 -0 +Y4 x72 sr8 +y4 x72 c +Y4 x72 +3 +y4 x72 +Y4 x6B +y4 x67 i4& +Y4 x65 Z1 +y4 x65 ,4 +Y4 x65 +y4 x64 y4 +y4 x64 i6r +y4 x64 E +Y4 x63 T5 +Y4 x63 o8k +Y4 x63 o1e +Y4 x63 *13 +} y4 x63 +Y4 x62 Z5 +y4 x62 Y1 +y4 x62 o2s +y4 x62 *02 +y4 x62 +Y4 x61 ] +Y4 ] x61 +y4 x57 +Y4 x56 +Y4 x54 ] +Y4 ] x54 +Y4 x54 +Y4 x53 i85 +Y4 x53 -1 +Y4 x52 ^Y +y4 x52 i4G +y4 x52 -2 +Y4 x52 +y4 x51 $. +y4 $. x51 +Y4 x4A +Y4 x48 u +Y4 x43 *73 +Y4 x43 +Y4 x42 Y2 +y4 x42 i0X +Y4 x41 K +y4 x41 D1 +Y4 x37 p1 +Y4 x35 +$? Y4 x35 +Y4 x34 t +$, Y4 x34 +Y4 x32 $2 +Y4 x32 $_ +Y4 $_ x32 +Y4 [ x32 +Y4 x32 +[ Y4 x32 +Y4 x31 ] +Y4 ] x31 +y4 x26 o69 +Y4 x26 i2A +y4 x25 $u +y4 x25 $2 +Y4 x24 r +Y4 x24 +Y4 x23 +y4 x21 [ +y4 x21 +^* Y4 x14 +Y4 x13 y4 +Y4 x13 t +Y4 x13 i2C +Y4 x13 ,8 +Y4 x12 x42 +Y4 x08 y4 +Y4 x08 u +Y4 x08 t +Y4 x07 z1 +Y4 x07 +Y4 x06 y4 +Y4 x04 -2 +Y4 x03 ^c +y4 } x03 +y4 x01 +3 +Y4 ^X +Y4 ^w $y +y4 ^w ^e +y4 ^w .6 +Y4 $W +Y4 ^w +Y4 ^V +Y4 $v +Y4 u Y4 +Y4 u x48 +y4 $u x25 +Y4 u x08 +Y4 u o62 +Y4 u ^O +y4 u i4N +Y4 u i4B +Y4 u ^G +Y4 u D2 +y4 u D0 +Y4 u *7A +Y4 u .4 +Y4 u -2 +Y4 u -0 +y4 u $! +y4 $! u +y4 t Y3 +y4 t Y2 +y4 t x73 +Y4 t x34 +Y4 t x13 +Y4 t x08 +y4 t T7 +Y4 t o3W +y4 t i9m +y4 t i8. +Y4 T8 y4 +Y4 T8 *9A +y4 T7 t +y4 T7 +Y4 t *63 +y4 t $6 +Y4 T5 x63 +Y4 T4 +y4 t +4 +y4 t .4 +Y4 T3 o90 +y4 t *36 +Y4 T3 +Y4 T2 T0 +Y4 T0 T2 +y4 T0 o39 +Y4 $t +y4 t $! +y4 $! t +Y4 $s xA7 +y4 ^s x12 +y4 ssw +Y4 sr8 x72 +y4 smH c +y4 sbv +y4 sBm u +y4 saw +y4 s8p +y4 s7Q +Y4 s6. +Y4 s37 i3Y +Y4 s2z +y4 s29 -3 +Y4 s1x +y4 s1 o8. +Y4 s0k +Y4 $s +y4 r x86 +Y4 $R t +y4 $r i4@ +Y4 R9 E +y4 R7 $2 +y4 R3 +Y4 R1 R0 +Y4 R0 R1 +Y4 $r +y4 ^R +y4 $r [ +y4 [ $r +y4 ^q +y4 p3 o36 +y4 p3 o1k +Y4 ^O u +Y4 oBt +y4 oBN +y4 oB4 Y4 +Y4 oAy +Y4 oA! x42 +y4 oAu +Y4 oAa +Y4 oA9 +Y4 oA1 +Y4 oA. +Y4 o9i Y2 +Y4 o9i o4 +Y4 o9a +Y4 o95 +y4 o92 +Y4 o90 T3 +Y4 o9= +0 +Y4 o90 +y4 o90 +Y4 o8w +Y4 o8u +Y4 o8p +y4 o8m $. +y4 $. o8m +Y4 o8k *81 +y4 o8j *64 +Y4 o88 +Y4 o85 -7 +Y4 o82 +y4 o8( $) +y4 $) o8( +Y4 o7u +Y4 o7= o35 +Y4 o7k +y4 o7i +Y4 o79 +Y4 o73 *76 +Y4 o73 +y4 } o72 +Y4 o7= +y4 o7_ +y4 o6& x42 +y4 o6u +y4 o6j +y4 o6a +Y4 o69 +Y4 o62 u +Y4 o6 +y4 o5o +Y4 o5n +Y4 o5f +Y4 o5e +y4 o5e +Y4 o59 E +Y4 o56 +y4 o56 +Y4 o55 E +y4 o51 +y4 o50 +Y4 o4y +y4 o4w +y4 o4p +Y4 o4 o9i +y4 o4m +Y4 o4j d +Y4 o4i -5 +y4 o4g +Y4 o4b +8 +Y4 o45 *60 +y4 o4< +y4 o3w +Y4 o3u '9 +y4 o3n +y4 o3k ,2 +y4 o3f +y4 o3a +y4 o39 T0 +Y4 o35 o7= +Y4 o3 +y4 o3_ +y4 o2y +Y4 o2V +y4 o2s x62 +y4 o2n +y4 o2l +Y4 o2G c +y4 o2g +Y4 o2* D8 +y4 o2a r +Y4 o2A +Y4 o24 +Y4 o1z +2 +y4 o1u E +y4 o1o *63 +y4 o1J +Y4 o1e x63 +y4 o14 $F +y4 o0x +y4 o0W +Y4 o0t +y4 o0S x92 +Y4 o0S +Y4 o0s +y4 o0S +Y4 o0O +y4 o0N D7 +y4 o0M -A +y4 o0L +y4 o0k +y4 [ o0f +y4 { o07 +y4 $O +y4 [ ^N +y4 ^M o1z +y4 $M i0C +Y4 $M +y4 l $1 +y4 L0 z2 +Y4 L0 i3/ +Y4 ^l +y4 [ ^l +Y4 K x41 +y4 K C +y4 K *53 +y4 $j Z1 +Y4 $i $e +y4 iAg +y4 iA1 ,3 +Y4 i9P x24 +y4 i8. t +Y4 i8c +Y4 i88 *54 +y4 i87 +Y4 i81 +Y4 i8* +Y4 i8@ +Y4 i8. +Y4 i8! +Y4 i7n +Y4 i7a L8 +Y4 i7& +Y4 i6d +Y4 i6b +Y4 i6+ +y4 i4@ $r +y4 i4N u +$@ y4 i4e +Y4 i4B u +y4 i4b ^i +Y4 i4A ^K +y4 i4A +y4 i48 +Y4 i4? +y4 i4- ] +y4 ] i4- +Y4 i3Y s37 +Y4 i3/ L0 +Y4 i3j t +y4 i3i +Y4 i2y +Y4 i2x +y4 i2s +Y4 i1r +y4 i1k +Y4 i0u +y4 i0C $M +y4 ^I +Y4 ^h y2 +y4 $h +Y4 ^G u +Y4 ^g i5H +Y4 ^g +y4 $g +y4 $F o14 +y4 $F +y4 E x64 +Y4 E R9 +Y4 E o59 +Y4 E o55 +y4 E o1u +Y4 E D7 +y4 E -A +y4 E *39 +y4 E *17 +Y4 d x62 +Y4 d x57 +Y4 DA +Y4 D9 $7 +y4 D8 x03 +Y4 D8 o2* +Y4 D8 +y4 D8 $. +y4 $. D8 +y4 D7 o0N +Y4 D7 E +y4 D7 *20 +Y4 D7 ] +Y4 ] D7 +y4 D7 +Y4 D6 y3 +y4 D6 +y4 D5 +[ y4 D5 +[ Y4 D4 +Y4 D2 u +y4 D0 u +y4 D0 -1 +y4 ^D +y4 c xA2 +y4 C x85 +y4 c x72 +y4 C x04 +Y4 c ^P +y4 C K +Y4 $c iA3 +Y4 c -2 +y4 c +2 +y4 C +y4 ^c +Y4 $B Y1 +Y4 ,B x24 +Y4 ^b u +y4 ^b ^K +y4 *B6 x85 +y4 *B6 x84 +y4 ^B +Y4 ^A $z +y4 -A o0M +y4 -A E +Y4 *A8 x61 +Y4 'A *72 +y4 .A *63 +Y4 *A4 'A +Y4 *A4 ] +Y4 ^A *38 +y4 *A1 x63 +y4 $A +y4 'A $- +y4 ^a +Y4 '9 y5 +y4 -9 x62 +Y4 '9 o3u +y4 +9 D2 +Y4 *9A T8 +y4 -9 ^A +y4 *98 x42 +Y4 *97 +Y4 *96 x41 +Y4 *96 o91 +Y4 } *96 +y4 *94 x73 +Y4 *93 *78 +Y4 +9 *35 +Y4 *92 y2 +Y4 +9 +y4 +9 $! +y4 $! +9 +Y4 +8 o4b +Y4 +8 i7+ +y4 *8B y4 +Y4 *8B ] +Y4 ] *8B +Y4 *87 *65 +Y4 -8 [ +Y4 ^8 +Y4 -7 o85 +Y4 $7 D9 +Y4 *7A u +Y4 *78 *93 +Y4 *76 +y4 *75 [ +Y4 *72 'A +y4 -7 *12 +y4 *70 o06 +Y4 +7 +Y4 $! .7 +Y4 .7 $! +Y4 -7 +Y4 -6 x82 +Y4 .6 x06 +y4 $6 t +Y4 *68 x42 +Y4 *67 ,1 +Y4 *65 *87 +Y4 +6 *52 +Y4 *64 x75 +y4 *64 o8j +y4 *64 ,7 +Y4 -6 *42 +Y4 *63 t +y4 *63 o1o +y4 *63 .A +Y4 .6 .1 +Y4 *60 o45 +y4 *60 +Y4 +6 +y4 $6 +Y4 $5 x91 +Y4 -5 o4i +y4 *59 D4 +Y4 *58 x91 +Y4 *56 *75 +y4 *56 *49 +y4 *56 +y4 .5 .6 +Y4 *54 i88 +y4 *53 K +y4 *53 +Y4 *52 +6 +Y4 *50 +y4 +5 +0 +Y4 +5 +Y4 ,5 +y4 .4 x74 +y4 ,4 x65 +y4 +4 x01 +Y4 .4 u +y4 +4 t +y4 .4 t +Y4 *49 i4k +y4 *49 *56 +y4 *49 } +] Y4 *47 +Y4 *45 x31 +y4 +4 *54 +y4 $4 $5 +Y4 *42 -6 +y4 *42 +1 +Y4 -4 *12 +Y4 } *41 +Y4 $4 +y4 ,4 +y4 -4 +Y4 -3 y2 +Y4 +3 x72 +Y4 -3 x21 +y4 -3 s29 +$y *43 o0@ +y4 ,3 iA1 +y4 *39 E +y4 *38 +y4 *36 t +Y4 *35 +9 +y4 *35 *24 +Y4 *34 Y4 +Y4 *34 +y4 -3 ,2 +y4 *31 k +y4 *31 +0 +y4 ,3 $1 +y4 -3 -1 +y4 ^3 +y4 -2 x52 +Y4 $2 x32 +y4 $2 x25 +y4 $2 R7 +y4 ,2 o3k +Y4 +2 o1z +y4 -2 D1 +Y4 .2 d +Y4 -2 c +y4 +2 c +y4 *29 x76 +y4 *24 *35 +Y4 *24 +y4 -2 *32 +y4 ,2 -3 +y4 *20 D7 +Y4 *20 +y4 -2 -0 +y4 -2 [ +y4 -2 +Y4 $1 Y4 +Y4 ^1 x85 +Y4 -1 x53 +Y4 ^1 o9K +y4 $1 l +Y4 *1B x92 +y4 *17 E +Y4 ,1 *67 +Y4 *16 .6 +Y4 .1 .6 +y4 +1 *42 +Y4 *13 x63 +Y4 *13 +0 +y4 $1 ,3 +y4 -1 -3 +y4 *12 -7 +Y4 *12 -4 +$y *41 *20 +Y4 ,1 *16 +y4 -1 *16 +y4 *10 xB4 +Y4 ^1 +y4 -0 x73 +Y4 -0 u +Y4 +0 o9= +y4 *09 x37 +y4 +0 +5 +y4 $0 $4 +Y4 *03 D3 +y4 +0 *31 +y4 *02 Y5 +Y4 *02 y4 +y4 *02 x62 +y4 -0 -2 +Y4 +0 *13 +Y4 +0 +Y4 $. +Y4 $- +$% Y4 ] +} Y4 +] Y4 +y4 $/ +y4 $! +y4 $_ +y4 } +y4 [ { +$# y4 +$! y4 +$- y4 +] y4 [ +^y ^4 +Y3 ^Z Y4 +Y3 Z5 z4 +y3 z5 t +Y3 z5 s6E +Y3 z5 *67 +Y3 z4 Z5 +y3 Z4 D5 +y3 $@ Z4 +y3 Z4 +Y3 z3 Y4 +y3 Z3 y3 +y3 Z3 .5 +y3 Z3 +y3 Z2 y3 +Y3 Z2 x61 +Y3 Z2 t +Y3 Z2 +y3 Z2 +[ y3 Z2 +Y3 z1 i48 +Y3 Z1 D7 +Y3 Z1 $3 +y3 z1 *16 +y3 z1 $. +y3 $. z1 +^ Y3 ^Z +Y3 $y E +Y3 $y c +y3 Y5 x5A +Y3 Y5 x47 +Y3 y5 x01 +Y3 Y4 z3 +Y3 Y4 ^Z +y3 Y4 x91 +Y3 y4 $A +y3 Y4 *0A +y3 y3 Z3 +y3 y3 Z2 +y3 y3 y3 +Y3 Y3 y2 +y3 y3 x61 +y3 y3 sea +y3 Y3 s8h +Y3 Y3 $s +Y3 y3 c +y3 Y3 ^A +y3 y3 *68 +Y3 Y3 ,6 +Y3 y3 *53 +y3 y3 *53 +y3 Y3 *36 +Y3 Y3 -3 +Y3 Y3 -1 +] Y3 y3 +] y3 Y3 +y3 y3 ] +y3 ] y3 +$, y3 y3 +$` y3 y3 +Y3 y2 Y3 +Y3 y2 x61 +y3 Y2 x31 +y3 y2 o7g +Y3 y2 K +Y3 Y2 -9 +y3 Y2 -8 +Y3 y2 $. +Y3 $. y2 +[ Y3 y2 +y3 Y2 +] y3 Y2 +y3 y1 o3e +Y3 Y1 .8 +Y3 Y1 +5 +y3 Y1 *10 +Y3 ^x ^f +y3 xB2 E +y3 xB1 x51 +y3 xA3 t +y3 xA1 +Y3 x98 o9k +Y3 x94 ] +Y3 ] x94 +y3 x92 E +Y3 x92 c +Y3 x92 +Y3 x91 o7o +y3 x91 i3o +Y3 x91 +Y3 x81 x31 +Y3 x81 +y3 x74 $+ +y3 $+ x74 +] Y3 x73 +y3 x72 o0r +Y3 x72 o0g +y3 x72 +8 +y3 x71 *36 +y3 x63 -5 +y3 x62 E +y3 x62 *76 +Y3 x62 -4 +Y3 x62 +y3 x62 ] +y3 ] x62 +Y3 x61 Z2 +y3 x61 o5j +y3 x61 $D +Y3 x61 -4 +y3 [ x61 +y3 x54 *20 +y3 x53 i5y +y3 x52 o0d +Y3 [ x52 +Y3 ^$ x52 +[ Y3 x52 +Y3 x51 y4 +Y3 x51 i4G +Y3 x49 +Y3 x47 Y5 +y3 x46 smB +$* Y3 x46 +y3 x46 +Y3 x45 +$@ y3 x45 +Y3 x43 *10 +Y3 x42 t +Y3 x42 ^C +y3 x41 r +y3 x41 $3 +y3 x41 +y3 x36 $5 +Y3 x34 y3 +y3 x31 Y2 +Y3 x31 c +Y3 x29 +y3 x25 $p +Y3 x24 i2b +Y3 x23 +Y3 x21 u +Y3 x21 $+ +Y3 $+ x21 +y3 x0A +Y3 x05 $g +Y3 x04 $4 +Y3 x03 $W +Y3 x03 o47 +Y3 x02 x72 +Y3 x01 y5 +y3 x01 C +Y3 $W x03 +y3 $W +Y3 u x21 +y3 ^u o1a +Y3 $u $j +y3 u D9 +Y3 u *6B +Y3 u ,5 +y3 t z5 +Y3 t Z2 +y3 t xA3 +Y3 t x42 +y3 t $E +y3 t D1 +y3 T9 +Y3 t -8 +Y3 t +7 +Y3 T4 [ +y3 t ,4 +y3 T2 +y3 T1 *63 +y3 ^t +y3 swc .3 +Y3 ssM +Y3 ssg +Y3 sSf +Y3 ssf +Y3 so. +y3 smB x46 +y3 sk5 +y3 sjm +Y3 sfP +4 +y3 sea y3 +Y3 se@ *75 +y3 say +y3 $S *9A +Y3 s93 +y3 s8h Y3 +y3 s8. *20 +{ Y3 s7x +Y3 $S .7 +y3 s7 +Y3 s6E z5 +Y3 $s *61 +Y3 s6 +y3 s5. $f +y3 s4d *15 +Y3 s4- +Y3 s2 +y3 s18 ] +y3 ] s18 +Y3 $s +y3 ^S +Y3 r x54 +Y3 r x52 +Y3 RA x07 +y3 R9 R9 +Y3 $r .9 +Y3 R6 E +y3 ^R +{ y3 r +y3 $p x25 +y3 p4 i1a +y3 p2 x92 +y3 p2 i3. +y3 [ ^p +y3 ^p +Y3 oBr +Y3 oBp +Y3 oBF .9 +Y3 oB9 -7 +y3 oA. x06 +Y3 oAo Y3 +Y3 oAj +Y3 oA- +Y3 oA +Y3 o9y +Y3 o9q +Y3 o9P x21 +Y3 o9p +Y3 o9k +Y3 o9d +Y3 o9A $1 +y3 o94 +Y3 o93 +Y3 o9+ +Y3 o9# +Y3 o9_ +y3 o8m +y3 o8l +y3 o8i Y3 +y3 o7. x16 +Y3 o7w +Y3 o7o x91 +y3 o7o +Y3 o7m +y3 o7h -2 +Y3 o7g +y3 o7b +Y3 { o72 +Y3 o70 +Y3 o6t +Y3 o6s -4 +Y3 o6m *14 +Y3 o6| L6 +Y3 o6e +y3 o6d +Y3 o6a o4R +y3 o68 +y3 o67 D4 +Y3 o6& +Y3 o6. +Y3 o6 +y3 o6 +Y3 o5x +y3 o5w +y3 o5v +y3 o5u +y3 o5p .3 +Y3 o5n +Y3 o5m +y3 o5m +y3 o5j x61 +Y3 o5j +y3 o5g +Y3 o5D +y3 o5d +Y3 o59 DA +Y3 o58 +Y3 o57 +Y3 o5% +Y3 o5@ +Y3 o5! +y3 o5_ +y3 o5= +Y3 o4R o6a +Y3 o4i +Y3 o4h +y3 o4d +y3 o4c +5 +Y3 o4c +y3 o4c +y3 o4a +Y3 o4@ +Y3 o4 +y3 o3T +y3 o3t +y3 o3n +y3 o3m *67 +y3 o3l +y3 o3J c +y3 o3E DA +y3 o3c +Y3 o3* +Y3 o3_ +y3 o2v +Y3 o2s +y3 o2k +y3 o2i +Y3 o2e +y3 o2d +y3 o27 +y3 o25 E +^# y3 o22 +y3 o1X +y3 o1w +Y3 o1u +y3 [ o1u +y3 o1s +y3 o1p +y3 o1o +Y3 o1k { +y3 o1i i3a +Y3 o1i *97 +y3 o1i +Y3 o12 ^E +Y3 o0y +y3 o0V +y3 o0t +y3 o0r x72 +y3 o0o +y3 o0N +y3 o0l +y3 o0k +7 +Y3 o0J -6 +Y3 o0g x72 +y3 o0F *45 +y3 o0F +y3 o0d x52 +Y3 o0D +y3 o08 +y3 o03 +Y3 o0- +y3 ^O +Y3 $N +y3 ^n +Y3 $M D0 +y3 L6 L3 +y3 L3 L6 +Y3 $L +Y3 ^L +Y3 $l +] Y3 $l +y3 k ^Z +Y3 K y2 +y3 K D6 +Y3 k $A +Y3 K ,9 +y3 K *60 +Y3 K ^6 +y3 K .4 +} Y3 K +y3 K [ +y3 [ K +y3 k +y3 ^j +y3 ^i i0p +Y3 iB3 +y3 iB0 +Y3 iAl +Y3 iAa +Y3 iA1 +0 +y3 iA0 +0 +y3 i9s +Y3 i96 ,7 +Y3 i90 +Y3 i8s +Y3 i8p +Y3 i8k +Y3 i8i +Y3 i83 Y4 +y3 i8+ +y3 i8/ +y3 i78 *47 +Y3 i75 +y3 i7- +y3 i6v +Y3 i6n +Y3 i6k +Y3 i6f +y3 i6A *06 +y3 i68 +y3 i66 +Y3 i65 +Y3 i6+ +Y3 i6* +y3 i6& +y3 i5v *64 +y3 { i5g +Y3 i5 +Y3 i4s o9y +Y3 i4o +Y3 i4h +y3 i4e *14 +Y3 i4* +Y3 i4- +y3 i3x E +Y3 i3s y4 +y3 i3j +y3 i3e +y3 i3a o1i +y3 i3& +y3 i3! +y3 i3_ ^( +Y3 i2t +y3 i2s +Y3 i2r +y3 i2n +y3 i2g +y3 i2c x56 +y3 i2a +y3 i1i +y3 i1e +y3 i1( [ +y3 i0W *65 +Y3 i0M x24 +y3 i0K +y3 i0h +y3 i0E x54 +y3 i04 *06 +y3 ^i +y3 ^H +Y3 $g x05 +y3 $G +y3 $f s5. +Y3 $F p4 +Y3 ^f +Y3 E $y +y3 E xB2 +y3 E x92 +y3 E x62 +Y3 E R6 +y3 E o25 +y3 E i3x +y3 E *35 +Y3 E *27 +y3 $e -2 +Y3 E $! +Y3 $! E +Y3 ^e +y3 ^e +y3 $D x61 +y3 d i7e +Y3 DA o59 +y3 DA o3E +Y3 DA *94 +y3 D9 u +y3 D9 *23 +y3 D9 -2 +y3 } D9 +y3 D9 +$. y3 D9 +y3 D8 *49 +Y3 D7 Z1 +y3 D7 C +Y3 D7 +5 +Y3 D7 +1 +Y3 D7 +y3 D6 K +y3 D5 Z4 +Y3 D5 y3 +Y3 D5 -7 +[ y3 D4 +Y3 D3 c +y3 D1 t +^Y $3 D1 +y3 D1 +y3 D0 ^n +Y3 D0 $M +Y3 $D +[ Y3 ^d +y3 d +Y3 c $y +Y3 c x92 +Y3 c x31 +Y3 ^c x24 +y3 C x01 +Y3 ^c u +y3 c shB +y3 C D7 +Y3 c D3 +y3 c +B +Y3 c +6 +Y3 c $* +Y3 $* c +y3 ^c +y3 +B c +Y3 *B9 i6_ +Y3 ^B *52 +y3 *B1 x74 +Y3 ^B +y3 ,B +Y3 $A y4 +y3 ^A Y3 +Y3 'A $t +y3 ^a o1m +Y3 $A k +Y3 *AB -9 +Y3 *A9 .0 +y3 *A8 [ +y3 $a *56 +y3 +A *53 +Y3 'A *49 +Y3 *A3 x92 +Y3 +A +Y3 ] -A +Y3 -A ] +Y3 -A +y3 +A +y3 $a +Y3 -9 Y2 +Y3 .9 oBF +Y3 ,9 K +y3 *9A $S +Y3 -9 *AB +Y3 *97 o1i +Y3 ,9 +7 +Y3 *94 DA +Y3 *94 ] +Y3 ] *94 +Y3 *93 *82 +Y3 ] .9 +Y3 .9 ] +y3 +9 +y3 .9 +Y3 .8 Y1 +Y3 -8 t +y3 -8 i3; +Y3 -8 D5 +] Y3 *8A +Y3 +8 ^a +Y3 *89 x31 +y3 +8 *76 +Y3 +8 ,7 +y3 *86 Y4 +Y3 *86 Y2 +Y3 +8 *32 +Y3 *82 *93 +Y3 *81 +Y3 ,8 +y3 ,8 +y3 -8 +] y3 -8 +Y3 +7 t +Y3 .7 $S +Y3 -7 oB9 +y3 +7 o0k +Y3 ,7 i96 +y3 '7 $F +Y3 +7 ,9 +[ y3 *79 +Y3 ,7 +8 +Y3 *76 r +y3 *76 +8 +Y3 *75 se@ +Y3 ,7 *56 +y3 *73 x42 +y3 *73 *50 +y3 [ *73 +Y3 *72 x72 +y3 ,7 *15 +Y3 *70 E +Y3 $7 +Y3 ,7 +Y3 ,6 Y3 +y3 -6 y3 +Y3 -6 o0J +Y3 ^6 K +Y3 -6 D1 +Y3 +6 c +Y3 *6B u +y3 *69 x62 +y3 *68 Y4 +y3 *67 o3m +y3 .6 *72 +y3 *65 o6v +y3 *65 ^m +y3 *65 +Y3 *64 *57 +y3 *63 T1 +Y3 *62 ] +Y3 ] *62 +Y3 *61 $s +y3 *60 K +Y3 *60 ^B +y3 ^6 +y3 .5 Z3 +Y3 +5 Y1 +y3 -5 x63 +y3 $5 x36 +Y3 ,5 u +y3 +5 o4c +y3 $5 f +Y3 +5 D7 +Y3 *57 *64 +y3 *56 $a +y3 *53 f +y3 *53 +A +Y3 { *53 +y3 *53 ] +y3 ] *53 +Y3 $5 *24 +Y3 $5 +1 +y3 +5 ,1 +y3 *50 *73 +y3 *50 +Y3 +5 +y3 .5 +Y3 -4 x62 +Y3 -4 x61 +Y3 $4 x04 +y3 ,4 t +Y3 +4 sfP +Y3 -4 o6s +y3 .4 K +Y3 *49 'A +{ y3 *49 +y3 *48 -3 +Y3 *47 +y3 *45 Y4 +y3 *45 o0F +y3 *45 *20 +Y3 *40 $0 +Y3 *40 +y3 *40 [ +Y3 .4 +Y3 -4 +y3 +4 +y3 ,4 +[ y3 +4 +Y3 -3 Y3 +y3 ,3 y1 +y3 $3 x41 +y3 .3 swc +y3 .3 o5p +Y3 -3 i3o +y3 *39 ,9 +y3 *36 x71 +y3 *35 E +y3 $3 $5 +y3 -3 *48 +Y3 *32 +8 +y3 +3 *24 +y3 $3 +y3 .3 +y3 -2 o7h +y3 -2 $e +y3 -2 D9 +y3 *28 +Y3 *27 E +y3 *27 +Y3 *24 i2# +Y3 *24 $5 +y3 *24 +3 +y3 *23 D9 +$` y3 *23 +y3 $2 .2 +y3 .2 $2 +Y3 *21 z5 +Y3 *21 +Y3 .2 ,1 +y3 *20 x54 +y3 *20 s8. +y3 *20 *45 +y3 +2 +0 +y3 .2 +Y3 -1 Y3 +Y3 -1 y3 +Y3 $1 Y1 +Y3 $1 o9A +Y3 ,1 E +Y3 +1 D7 +y3 *16 x62 +y3 *16 x52 +y3 *15 s4d +y3 *15 ,7 +Y3 *15 *50 +Y3 +1 $5 +y3 ,1 +5 +Y3 *14 o6m +Y3 ,1 .2 +y3 *10 Y1 +Y3 *10 x43 +Y3 +0 y2 +Y3 +0 iA1 +y3 +0 iA0 +Y3 .0 *A9 +Y3 *08 ] +y3 *05 ^3 +Y3 *04 ,5 +Y3 $0 *40 +y3 *02 ^k +y3 +0 +2 +Y3 .0 +y3 -0 +Y3 $+ +Y3 $ +Y3 $= +Y3 ^@ +$@ Y3 +$. Y3 ] +$- Y3 +] Y3 $! +y3 $$ +y3 $- [ +y3 $_ +y3 $> +y3 ] } +y3 ] +y3 [ $- +] y3 [ +Y2 $z Z1 +Y2 ^Z Y5 +Y2 $z i0a +Y2 $Z *9A +y2 z4 z3 +y2 z3 z4 +y2 z3 u +Y2 Z3 E +Y2 $ Z3 +Y2 Z3 +$ Y2 z3 +y2 z2 x63 +y2 z2 x53 +Y2 z2 ^S +Y2 Z2 -8 +y2 Z2 *79 +Y2 $/ Z2 +Y2 Z1 o3x +y2 z1 $G +Y2 Z1 -9 +y2 Z1 *42 +Y2 z1 { +y2 y5 z2 +Y2 Y5 ^Z +Y2 Y5 x53 +y2 Y4 x46 +y2 Y4 x31 +Y2 y4 $t +Y2 Y4 K +Y2 y4 K +y2 Y4 k +Y2 Y4 D8 +Y2 Y4 D7 +y2 y4 C +Y2 y4 $A +Y2 Y4 -9 +y2 Y4 ,5 +Y2 Y4 -2 +] Y2 Y4 +Y2 y4 +y2 y4 ] +y2 ] y4 +Y2 Y3 Z2 +y2 y3 y1 +y2 Y3 x41 +y2 y3 c +Y2 Y3 *76 +y2 y3 -3 +Y2 Y3 +] Y2 y3 +[ y2 Y3 +y2 y3 +Y2 y2 x84 +Y2 y2 x73 +Y2 Y2 x45 +Y2 Y2 o7u +Y2 Y2 o2l +Y2 Y2 o1o +y2 Y2 o06 +Y2 y2 K +Y2 Y2 i3A +Y2 Y2 i0k +y2 y2 i0K +y2 y2 ^A +y2 Y2 *84 +Y2 Y2 *76 +Y2 Y2 +2 +y2 y2 -2 +Y2 Y2 $! +$ Y2 y2 +y2 Y2 [ +y2 $ Y2 +y2 { Y2 +y2 [ Y2 +$ y2 Y2 +y2 y2 $* +y2 $* y2 +$? y2 y2 +$! y2 y2 +} y2 y2 +^- y2 y2 +y2 y1 y3 +y2 Y1 x51 +Y2 Y1 x25 +Y2 Y1 o5j +y2 Y1 i14 +y2 y1 ^C +y2 Y1 *A1 +y2 Y1 *04 +Y2 $@ Y1 +y2 Y1 $@ +} y2 y1 +Y2 ^Y +Y2 xB1 +y2 x94 -4 +y2 x91 Y2 +y2 x91 i1a +y2 x83 slo +y2 x83 o7. +Y2 x83 +7 +Y2 x83 +y2 x82 o1A +y2 x81 sby +y2 x81 *34 +[ y2 x81 +Y2 x73 -6 +Y2 x73 $3 +Y2 x73 +y2 $. x73 +y2 x73 +Y2 x72 o98 +Y2 x72 -A +Y2 x72 +y2 x71 -4 +y2 x71 +Y2 x65 $i +Y2 x64 +Y2 x63 T0 +y2 x63 skq +y2 x63 ^k +y2 x62 .3 +y2 x62 *16 +Y2 x62 $1 +} Y2 x62 +y2 x61 se. +Y2 x61 ^d +y2 x61 *05 +Y2 x61 +Y2 x57 +Y2 x54 +y2 x53 ^i +y2 x53 E +Y2 x52 K +y2 x52 E +y2 x51 Y1 +[ y2 x51 +Y2 x46 Y5 +y2 x46 Y4 +y2 x46 $. +y2 $. x46 +Y2 x45 Y2 +y2 x45 C +y2 x43 z2 +y2 x43 y2 +y2 x43 i4P +Y2 x43 +Y2 x42 d +y2 x42 -9 +y2 x41 Y3 +Y2 x41 o1N +Y2 x41 ,8 +$. Y2 x41 +y2 x35 Y5 +y2 x35 y5 +y2 x35 i4_ +Y2 x34 o5w +y2 x34 ,3 +Y2 x34 [ +Y2 x32 T0 +y2 x32 +3 +y2 x31 o8 +y2 x31 o1x +y2 x31 $J +y2 x31 +y2 $x -3 +Y2 x28 +3 +Y2 x25 Y1 +Y2 x23 z2 +Y2 x23 y3 +Y2 x23 $/ +Y2 $/ x23 +[ Y2 x23 +Y2 x21 y3 +y2 x21 +5 +Y2 x17 t +Y2 x14 z3 +Y2 x13 y5 +Y2 x12 *21 +Y2 x12 +} Y2 x12 +Y2 x0B +Y2 x0A +Y2 x07 y2 +Y2 x07 +Y2 x03 $@ +Y2 $@ x03 +Y2 x02 t +Y2 x02 ^k +Y2 x02 -3 +Y2 x02 -0 +y2 x01 st5 +Y2 x01 +3 +y2 $w Z2 +Y2 $W p3 +y2 $w +Y2 ^v L5 +Y2 $v *53 +y2 ^V +y2 ^v +y2 u z3 +Y2 u T6 +y2 u o0F +Y2 u D7 +Y2 u d +Y2 u -A +y2 u +5 +y2 u +1 +Y2 $t y4 +Y2 t x17 +Y2 t x02 +y2 t D3 +Y2 t $c +Y2 t *96 +y2 T8 k +y2 t *75 +Y2 T6 *B8 +y2 T6 ,7 +Y2 t +6 +Y2 T5 *69 +y2 t *53 +y2 t .5 +y2 T4 y4 +Y2 ^t $2 +y2 T2 ] +y2 ] T2 +Y2 T1 *B8 +y2 T1 *67 +Y2 T0 x63 +Y2 T0 x32 +y2 T0 ^J +Y2 T0 ,B +Y2 T0 *67 +y2 T0 +6 +y2 T0 *56 +y2 T0 *42 +Y2 $t +Y2 t +} y2 ^t +y2 syl l +y2 st5 x01 +Y2 ssc +y2 ss8 c +Y2 sr, +y2 sr; +y2 snb +y2 slr +Y2 slp +y2 slp +y2 slo x83 +y2 skq x63 +Y2 sio c +y2 sia +y2 sFB o3W +y2 se. x61 +Y2 sex *56 +Y2 sdm +^\ y2 sd/ +$= y2 scg +y2 ^s C +y2 sby x81 +Y2 sbl +Y2 sbK +y2 sat +y2 sAI +Y2 s96 +Y2 s7g +y2 s7. +Y2 s6z +Y2 s5* c +y2 $s *50 +Y2 s30 -3 +Y2 s2l +y2 s1o +y2 s1/ +Y2 s0. -6 +Y2 s04 i5. +y2 s04 -6 +y2 ^R D6 +Y2 R9 Z4 +Y2 r +9 +y2 R4 R4 +Y2 R4 D5 +Y2 R4 +Y2 r *32 +Y2 r *30 +y2 r -3 +y2 r *27 +y2 R2 -4 +Y2 r *23 +Y2 ^R .2 +y2 R1 +y2 R0 *15 +Y2 $r +Y2 ^r +y2 q *56 +y2 $Q +y2 $q +y2 q +y2 p3 x09 +y2 p2 x03 +Y2 p1 ^r +y2 p1 ^r +y2 p1 i6A +Y2 p1 +y2 $P +Y2 ^o ^G +Y2 oB6 +y2 oB1 c +y2 oB0 +Y2 oAs +Y2 oAg +Y2 oAA +Y2 oA4 +Y2 o9t E +y2 [ o9t +y2 o96 +y2 o91 +Y2 o9@ +Y2 o9 +] Y2 o9- +Y2 o8@ Y1 +Y2 o8x +y2 o8v x35 +Y2 o8s +Y2 o8r +y2 o8a +y2 o85 *24 +Y2 o84 +y2 o82 +Y2 o8* *12 +Y2 o8 *0A +Y2 o8% +Y2 o8! +Y2 o8 +y2 o7. x83 +Y2 o7r +Y2 o7K +Y2 o7j +Y2 o7f +y2 o7. -7 +Y2 o75 o5o +Y2 o74 +Y2 o7/ +Y2 o6y -9 +y2 o6y +y2 o6u C +Y2 } o6s +y2 o6r o4K +y2 o6R E +Y2 o6r +y2 o6p +Y2 o6h +y2 o6g ^u +Y2 o6b +Y2 o6A +y2 o63 o1f +$= Y2 o63 +y2 o5W +y2 o5v +Y2 o5o o75 +Y2 o5j Y1 +y2 o5f *25 +Y2 o5f +y2 o5e +Y2 o5d K +y2 o5d +Y2 o55 +Y2 o53 +y2 o50 +Y2 o5@ +Y2 o5. +y2 o4@ y5 +y2 o4w l +Y2 o4v +Y2 o4q +Y2 o4p *34 +Y2 o4L y2 +y2 o4K o6r +y2 o4h *12 +y2 o4g -2 +Y2 o4g +y2 o4g +Y2 o4c p4 +Y2 o48 +y2 o48 +Y2 o4- ,6 +Y2 o45 -5 +y2 o44 k +Y2 [ o44 +Y2 o42 +Y2 o4[ +Y2 o4- +y2 o4_ +Y2 o3x Z1 +y2 o3W sFB +y2 o3r p4 +Y2 o3r +y2 o3@ p1 +Y2 o3j +y2 } o3i +y2 o3F +y2 o3e +y2 o3d +Y2 o3a +y2 o3a +y2 o39 +y2 o38 $A +Y2 o35 +y2 o3. +Y2 o2y +y2 o2t +y2 o2s +y2 o2p +Y2 o2o -3 +Y2 o2n -6 +Y2 o2l Y2 +Y2 o2l -A +y2 o2k p4 +y2 o2j +y2 o2i +y2 o2d *47 +y2 o2C +y2 o2+ +y2 o2, +y2 o1x x31 +Y2 o1o Y2 +Y2 o1N x41 +y2 o1k +y2 o1f o63 +y2 o1f ^c +y2 o1A x82 +y2 o13 +y2 o10 +y2 o0X y1 +y2 o0w +2 +y2 o0u +Y2 o0P *31 +Y2 o0P +y2 o0o +Y2 o0l D3 +y2 o0L +y2 o0l +y2 o0k +y2 o0j +y2 o0i ^M +y2 o0I +y2 o0H +Y2 o0g -5 +y2 o0g +y2 o0F u +y2 o0e *57 +Y2 o0d *54 +y2 o0c +Y2 o0B +2 +Y2 o0a *76 +Y2 o07 +y2 o06 Y2 +Y2 o02 +y2 o02 +Y2 $o +Y2 ^N +y2 ^m K +y2 ^M +y2 l syl +Y2 $l $S +y2 l o4w +Y2 l +B +y2 L0 y1 +Y2 l +Y2 K y4 +y2 k Y4 +y2 k y3 +Y2 K y2 +Y2 K x52 +y2 ^k ^u +y2 k T8 +Y2 K o5d +y2 k o44 +Y2 k o0O +y2 K ^m +y2 K i6u +Y2 k D4 +Y2 k $7 +Y2 K .5 +Y2 K $^ +Y2 $K +Y2 ^K +y2 ] $K +y2 $J x31 +y2 ^J *34 +Y2 $i x65 +Y2 ^i i1b +y2 iBe +Y2 iB5 x63 +Y2 iB +Y2 iA4 +Y2 iA@ +Y2 iA. +y2 i9o *59 +y2 i9a +Y2 i9@ +Y2 i9, +Y2 i8t +y2 i8k +Y2 i8h +Y2 i80 +Y2 i8; +Y2 i8_ +y2 i8_ +Y2 i7` x02 +y2 i7v +Y2 i7j +y2 i7e +y2 i7d x13 +Y2 i7d +y2 i7c +Y2 i7 *42 +Y2 i7& +y2 i6u K +y2 i6q +y2 i6n +Y2 i6h +Y2 i6A +y2 i68 +Y2 i6# +Y2 i6* +Y2 i6 +y2 i6. +y2 i5w +Y2 i5. s04 +Y2 i5R +y2 i5q +Y2 i5e +Y2 i5a +y2 i4s $? +y2 $? i4s +Y2 i4p +y2 i4M +Y2 i4g +y2 i4f +y2 i4d E +y2 i4c c +$! y2 i4b +y2 i4A +Y2 i43 D8 +y2 i42 +y2 i4? +y2 i3z +y2 i3w +} y2 i3U +y2 i3m +y2 i3l +Y2 i3d *41 +y2 i3c +Y2 i3A Y2 +Y2 i3a +y2 i30 +y2 i3/ +Y2 i2w +Y2 i2u *64 +y2 i2u +y2 i2t +Y2 i2r +y2 [ i2l +y2 i2j +y2 i2A +y2 i28 'B +Y2 i2 *32 +y2 i1u +Y2 i1t +y2 i1t +y2 i1r i2T +Y2 i1r +y2 i1n +Y2 i1l +y2 i1c +y2 i19 x31 +y2 i14 Y1 +y2 i14 +0 +y2 i13 +y2 i12 x46 +Y2 i1. +Y2 i1, +Y2 i0y *89 +y2 i0t +Y2 i0k Y2 +y2 i0h y3 +y2 i0F ,5 +y2 i0d +y2 i0B +Y2 i0a $z +Y2 $i +y2 ^I +y2 ^h .9 +Y2 $H +Y2 ^h +y2 ^H +y2 $G z1 +Y2 $G +y2 ^g +y2 ^F x46 +Y2 $f t +Y2 $F i6t +y2 f i5S +Y2 $[ $f +y2 ^f +Y2 E Z3 +y2 E x53 +y2 E x52 +y2 E T1 +Y2 E o9t +y2 E i4d +Y2 E $7 +Y2 $e *17 +Y2 E ^@ +Y2 $E +y2 E ] +y2 ] E +y2 ^e +y2 d x04 +Y2 d u +Y2 d ^r +y2 d ^r +Y2 D8 Y4 +Y2 D7 u +y2 D6 +4 +Y2 D5 R4 +Y2 D5 *43 +Y2 D4 k +Y2 D4 ^A +Y2 D4 } +y2 D3 t +Y2 D3 o0l +y2 D3 *65 +Y2 D2 y3 +y2 ^d *21 +} Y2 D2 +y2 D2 +Y2 D1 y2 +Y2 D1 $3 +y2 $_ ^d +y2 ] ^d +y2 ^d $_ +y2 ^d ] +y2 C y4 +y2 C x45 +Y2 c T4 +y2 c ss8 +y2 c slB +Y2 c sio +Y2 c s5* +y2 c oB1 +Y2 c ^J +y2 c i4c +y2 c +A +y2 c *67 +y2 C *62 +y2 C *58 +y2 C *42 +Y2 C *25 +y2 c -0 +Y2 C [ +Y2 $C +Y2 c $? +Y2 c { +Y2 $? c +Y2 $c +Y2 ^c +$& Y2 c +[ y2 c +Y2 ,B T0 +Y2 +B l +Y2 *B8 T6 +Y2 *B8 T1 +Y2 -B -7 +y2 ,B *57 +Y2 $A y4 +Y2 -A u +y2 $A o38 +Y2 -A o2l +y2 'A ^o +Y2 +A i9/ +y2 +A c +y2 *A8 oA, +Y2 ^a *72 +y2 $A *71 +y2 $a *65 +y2 $A *61 +Y2 *A6 +y2 $A -6 +Y2 $/ -A +Y2 ,A +Y2 -A +y2 '9 y3 +Y2 -9 o6y +Y2 *9A $Z +Y2 *9A *86 +Y2 +9 .7 +y2 -9 ,7 +Y2 *96 t +Y2 *94 *45 +Y2 ,9 .4 +Y2 $$ ,9 +Y2 ,9 $$ +Y2 ,9 +Y2 -9 +y2 .9 +y2 -9 +Y2 +8 y5 +Y2 +8 y3 +y2 +8 x62 +Y2 -8 D6 +Y2 +8 d +y2 *8A x04 +Y2 *89 $^ +Y2 $^ *89 +Y2 *87 *6A +Y2 *86 *9A +Y2 *84 o48 +Y2 *84 D8 +y2 ,8 *45 +y2 ,8 -4 +y2 *82 +Y2 *81 d +Y2 +8 +Y2 -8 +Y2 ,7 y1 +Y2 +7 x83 +Y2 $7 k +Y2 $7 E +Y2 *7B oB! +Y2 *7B +Y2 -7 -B +y2 *79 ,6 +Y2 .7 +9 +y2 ,7 -9 +Y2 *76 o0a +Y2 *76 ^L +Y2 *76 ,3 +Y2 *76 *15 +Y2 ,7 ,6 +y2 *75 t +y2 +7 *56 +y2 *74 *36 +Y2 *74 .1 +y2 +7 *40 +Y2 *73 *12 +y2 *72 +y2 *71 $A +y2 *71 *40 +Y2 *70 x12 +Y2 *70 +} y2 *70 +Y2 +7 +[ y2 +7 +Y2 -6 x73 +y2 +6 T0 +Y2 +6 t +y2 -6 s04 +Y2 -6 s0. +y2 +6 r +y2 ^6 p5 +Y2 +6 p1 +Y2 ,6 o4- +Y2 -6 o2n +y2 *6A x46 +Y2 *6A *87 +y2 *6A *10 +y2 -6 $A +Y2 *69 T5 +y2 *69 *43 +y2 *69 -2 +Y2 *68 D4 +y2 *68 } +y2 *67 T1 +Y2 *67 T0 +Y2 *67 r +y2 *67 c +Y2 *67 *B7 +y2 ,6 *79 +y2 *65 $a +Y2 *64 i6 +y2 *63 .4 +y2 ^6 *34 +Y2 *62 ^m +y2 *62 C +y2 *61 $A +Y2 *61 +{ Y2 *60 +Y2 $6 +y2 +6 +y2 ,6 +$y *26 +y2 .5 y2 +y2 +5 u +y2 .5 t +Y2 -5 o45 +Y2 -5 o0g +Y2 .5 K +y2 *5B [ +Y2 *58 y3 +Y2 *58 x75 +y2 *58 C +y2 *57 o0e +y2 *57 ,B +y2 *57 +y2 *56 T0 +Y2 *56 sex +y2 *56 +7 +y2 *56 *05 +Y2 *54 o0d +y2 ,5 *48 +Y2 *53 $v +y2 *53 t +Y2 -5 *34 +y2 { *53 +Y2 *52 *30 +Y2 *52 +Y2 *51 D3 +Y2 -5 *12 +y2 *50 $s +Y2 *50 +1 +Y2 ,5 +y2 +5 ] +y2 ] +5 +y2 -5 +y2 ^5 +y2 -4 x94 +y2 -4 x71 +y2 -4 R2 +y2 +4 ^P +y2 +4 D6 +y2 *4A +Y2 .4 ,9 +Y2 *48 i8- +Y2 *48 +y2 -4 ,8 +y2 *47 o2d +y2 .4 *63 +Y2 *45 r +y2 *45 ,8 +Y2 *43 D5 +y2 *43 *69 +y2 *42 Z1 +y2 *42 T0 +Y2 *42 i7 +y2 *42 C +Y2 *42 +Y2 *41 *31 +Y2 *40 D4 +y2 *40 *71 +y2 *40 +7 +y2 ] .4 +y2 .4 ] +Y2 $3 x73 +y2 .3 x62 +y2 -3 $x +Y2 -3 s30 +Y2 -3 o2o +Y2 $3 D1 +Y2 ,3 *76 +Y2 *37 +y2 *36 *74 +Y2 *36 +{ y2 *36 +y2 *35 -2 +y2 *34 x81 +Y2 *34 -5 +y2 *32 $@ +y2 $@ *32 +Y2 *31 o0P +y2 *30 y4 +Y2 *30 r +Y2 *30 *52 +Y2 ,3 [ +y2 +3 { +y2 +3 +y2 ^3 +Y2 -2 Y4 +Y2 +2 Y2 +Y2 ^2 x54 +Y2 $2 ^t +y2 +2 s35 +y2 -2 o4g +y2 +2 o0w +Y2 +2 o0B +y2 -2 ^B +Y2 *28 *23 +y2 *28 +Y2 *27 x01 +y2 -2 *69 +Y2 *26 +Y2 *25 C +y2 *25 +y2 *24 o85 +y2 -2 *35 +y2 *21 *24 +Y2 *21 $@ +Y2 *21 +Y2 $@ *21 +$% Y2 *20 +y2 +2 -0 +Y2 $2 +Y2 .2 +Y2 ,2 } +Y2 ^2 +Y2 ^1 z3 +y2 -1 y2 +Y2 $1 x62 +y2 +1 u +Y2 .1 ^R +y2 -1 i1z +y2 *19 $1 +Y2 *17 $e +Y2 .1 *74 +Y2 *16 i5. +y2 *15 R0 +Y2 *15 *76 +Y2 +1 *50 +{ y2 *15 +Y2 *13 +Y2 *12 o8* +y2 *12 o4h +Y2 *12 *73 +Y2 *12 -5 +Y2 *12 +y2 $1 *19 +y2 *10 *6A +Y2 $1 $* +[ y2 +1 +Y2 +0 p1 +y2 .0 o12 +y2 +0 i14 +y2 .0 ^i +Y2 *08 x41 +{ y2 *08 +y2 *07 x65 +y2 *05 x61 +y2 *05 +y2 *04 Y1 +$y *20 *41 +$% Y2 *02 +y2 -0 +2 +Y2 $0 +y2 $0 [ +y2 [ $0 +y2 -0 +Y2 $/ +Y2 $ +Y2 $^ +Y2 $` +Y2 ] +Y2 ^@ +$+ Y2 { +$+ Y2 +$& $^ Y2 +$@ Y2 +$/ Y2 +$? Y2 +$, Y2 +$- Y2 { +$_ Y2 +$` Y2 +} Y2 } +} } Y2 +] Y2 [ +] [ Y2 +[ Y2 +^Y $2 +^# Y2 +^* Y2 +^! Y2 +y2 $$ +y2 $` +y2 { $# +y2 ^* +$( y2 +$? y2 +{ y2 { +[ y2 $* +[ $* y2 +[ y2 +^y .2 +Y1 $z y4 +y1 ^z Y1 +y1 ^z o2q +Y1 $z -6 +y1 Z5 ^B +$ Y1 Z5 +$* y1 z5 +y1 Z4 Y4 +Y1 z4 x35 +$ y1 Z4 +^@ y1 z4 +Y1 z3 x34 +Y1 z1 p1 +Y1 z1 $A +y1 Z1 +5 +$\ Y1 z1 +$` Y1 z1 +y1 z1 $@ +y1 $@ z1 +Y1 $y k +Y1 Y5 x52 +y1 y5 x13 +Y1 y4 $z +Y1 y4 x42 +Y1 Y4 i6F +Y1 Y4 i0R +Y1 [ y4 +$$ Y1 y4 +y1 ^) y4 +y1 y3 Y1 +Y1 Y3 x03 +Y1 y3 t +Y1 Y3 oAx +Y1 Y3 ,9 +[ y1 y3 +Y1 y2 o0L +y1 Y2 C +y1 Y2 +y1 Y1 ^z +y1 Y1 y3 +Y1 y1 ^w +y1 Y1 i0b +Y1 $# Y1 +Y1 Y1 +$* Y1 Y1 +Y1 ^. y1 +{ Y1 y1 +^# Y1 y1 +{ y1 Y1 +^# y1 Y1 +y1 ^! y1 +Y1 $y +y1 { $y +Y1 $x Z5 +Y1 $x Z2 +Y1 x93 iB7 +Y1 x73 $. +Y1 $. x73 +y1 x71 *13 +$. Y1 x64 +$y $1 x64 +Y1 x63 t +Y1 x63 s7/ +Y1 x62 o4w +{ Y1 x62 +y1 x61 o0i +y1 x52 Y2 +Y1 x52 T1 +y1 x51 *13 +y1 x43 *31 +Y1 x43 -0 +y1 x42 $( +y1 $( x42 +Y1 x41 $+ +Y1 x41 $@ +Y1 $+ x41 +Y1 $@ x41 +$! Y1 x41 +Y1 x36 s0* +Y1 x32 ^I +y1 ^! x32 +y1 x32 +Y1 x23 L0 +Y1 x23 $1 +Y1 x21 -7 +Y1 x13 y1 +Y1 x13 i5- +y1 x13 *34 +$' Y1 x13 +Y1 x12 +y1 x12 ^@ +{ Y1 x05 +y1 x04 +Y1 x03 Y3 +Y1 x02 *43 +$' Y1 x02 +Y1 x01 C +y1 $x +0 +y1 $w ,3 +y1 ^V ^R +Y1 u $q +y1 $u i4F +Y1 u i2P +Y1 u *57 +Y1 $u +Y1 t y3 +Y1 t x63 +Y1 t T8 +Y1 t o6 +Y1 t o1U +y1 $t o16 +y1 t i1s +Y1 T8 t +y1 T6 *32 +Y1 T5 o3O +Y1 T5 { +Y1 T4 $5 +Y1 T4 +y1 t ,2 +Y1 T1 x52 +Y1 T1 $A +Y1 T1 ,9 +Y1 T1 +$# Y1 T1 +$$ Y1 T1 +$@ Y1 T1 +$% Y1 t +$- Y1 t +Y1 sy@ +y1 sws +Y1 sue +Y1 st_ +Y1 sO) +Y1 so) +Y1 $s i41 +y1 si* +y1 sgl +Y1 seK *46 +Y1 sec +Y1 se] +y1 sAJ +Y1 sa! i0t +Y1 s8b +Y1 s7/ x63 +{ Y1 s7o +y1 s75 +y1 s6. ,4 +Y1 s5@ +Y1 s3H +Y1 s3! +Y1 s3, +Y1 s2z +Y1 s2p $d +y1 s-2 +Y1 s1* $@ +Y1 $@ s1* +Y1 s0* x36 +Y1 ^s +} y1 $S +y1 $s +y1 ^r l +Y1 R6 R6 +Y1 R6 o1w +Y1 R4 .2 +y1 r ^3 +y1 r +^ y1 r +y1 q z3 +Y1 q -7 +y1 ] ^Q +y1 ^Q ] +y1 ^q +$_ y1 $q +Y1 $p $y +Y1 p5 x0B +y1 p5 i1A +Y1 p4 $h +Y1 p4 E +Y1 ^P *38 +Y1 p2 $j +y1 p2 *21 +Y1 ^p ,2 +Y1 p1 C +$; Y1 p1 +$- Y1 p1 +Y1 oB1 +Y1 o9r $0 +Y1 o9c +Y1 o7G ^N +y1 o6z +Y1 o6Y +Y1 o6X +Y1 o6 t +Y1 o6r +Y1 o6p +y1 o67 E +Y1 o63 +Y1 o6. +Y1 o5y +Y1 o5K +8 +y1 o59 *17 +Y1 o4w x62 +Y1 o4v +Y1 o4k o0K +Y1 o4e +y1 o46 +Y1 o44 *38 +Y1 o4@ +[ Y1 o4@ +Y1 o3T +y1 o3p c +Y1 o3O T5 +y1 o2Y l +Y1 o2s +Y1 o2j *20 +y1 o2j +y1 o2 E +Y1 o2- +y1 o2. +y1 o2! +Y1 o1w R6 +y1 o1D i1d +y1 o16 $t +Y1 o0X +Y1 o0w +Y1 o0L +7 +Y1 o0K o4k +y1 o0i x61 +$? Y1 o0F +Y1 o0B y2 +Y1 o0A +y1 ^n y2 +Y1 ^n i50 +{ y1 $n +Y1 $m ^C +y1 $m +Y1 ^L y1 +y1 l ^r +y1 ^l p1 +Y1 L9 ^A +Y1 l $7 +Y1 L5 i6H +y1 L1 i2m +Y1 ^L $1 +Y1 L0 x23 +Y1 ^l +Y1 k $y +Y1 ^k ^v +y1 K i1w +Y1 k i1t +y1 K C +Y1 $k +^- Y1 k +y1 ^J z1 +y1 ^J r +y1 $j *12 +y1 ^J +{ y1 ^j +Y1 ^I x42 +Y1 i9z +Y1 i9. +Y1 i8_ *79 +Y1 i8_ +Y1 i7x c +y1 i7K ,8 +y1 i76 *40 +y1 i6w +Y1 i6i +Y1 i6H L5 +Y1 i6F Y4 +Y1 i66 -5 +Y1 i6_ -5 +Y1 i62 ,5 +y1 i6. +2 +Y1 i5R R6 +Y1 i5o *34 +Y1 i5i i3v +y1 i5F +y1 i59 +y1 i5 -0 +Y1 i5. +Y1 i4x c +y1 i4i +y1 i4F $u +$_ Y1 i48 +y1 i47 +Y1 i41 $s +Y1 i41 +y1 i4- +y1 i3p +Y1 i34 +Y1 i2P u +y1 i2m L1 +y1 } i2m +y1 i2m +Y1 i2 l +Y1 i2C +y1 i26 +Y1 i2 +[ y1 i1z +y1 i1w K +y1 i1s } +Y1 i1o E +y1 i1f +y1 i1d +} Y1 i19 +Y1 } i12 +y1 i11 x35 +{ Y1 i11 +Y1 i0y $a +Y1 i0t sa! +Y1 i0t +Y1 i0R Y4 +Y1 i0p t +y1 i0l d +y1 i0h i11 +y1 i0b Y1 +Y1 i09 $* +Y1 $* i09 +y1 ^H i24 +^@ Y1 ^H +y1 ^G z1 +Y1 ^G x41 +Y1 $@ ^G +Y1 ^G $@ +y1 ^g +y1 ^F ^V +Y1 f i6- +Y1 f *97 +Y1 $F *85 +Y1 f *79 +$ Y1 f +Y1 E y5 +y1 ^e ^Y +Y1 E p4 +y1 E o67 +y1 E o2 +Y1 E i1o +y1 E ^B +Y1 E $7 +Y1 E ^4 +Y1 E +$* Y1 E +Y1 d x0A +Y1 $d s2p +y1 d ^A +y1 D8 i6. +Y1 D6 ^. +y1 $d *50 +Y1 D3 z1 +Y1 D3 +Y1 D2 $_ +Y1 $_ D2 +y1 ^d +^$ y1 d +y1 C Y2 +y1 c o3p +Y1 ^C $m +y1 C K +Y1 c i7x +Y1 c i4x +Y1 c *23 +y1 ^C $2 +y1 $c .1 +Y1 C $@ +Y1 $@ C +Y1 ^c } +$\ Y1 c +y1 C +y1 ^B Z5 +$/ Y1 $b +y1 { $B +{ y1 $b +Y1 $A z1 +Y1 $A T1 +Y1 $a i0y +Y1 ^a $7 +Y1 *A6 x91 +Y1 ^A +^@ y1 ,A +Y1 ,9 T1 +Y1 $9 -9 +Y1 -9 $9 +$! Y1 *98 +Y1 ,9 -6 +Y1 *93 -7 +$- Y1 *91 +y1 -8 Y1 +Y1 +8 o5K +Y1 $8 *65 +Y1 *85 $F +Y1 *83 ,3 +Y1 +8 $0 +y1 ,8 +Y1 +7 o0L +Y1 $7 l +Y1 $7 E +Y1 $7 ^a +Y1 -7 *93 +Y1 *78 +Y1 *75 x23 +Y1 -7 .5 +y1 *73 .1 +y1 *73 $. +^. y1 *70 +y1 +7 +y1 .7 +Y1 -6 $z +Y1 *6B '9 +Y1 -6 ,9 +Y1 [ *68 +Y1 *65 $8 +Y1 $6 *56 +y1 ^6 *36 +y1 *62 *23 +Y1 *60 { +Y1 $# -6 +Y1 -6 $# +y1 ^6 +y1 +5 Z1 +Y1 $5 T4 +Y1 -5 i66 +Y1 ,5 i62 +Y1 -5 i6_ +Y1 *57 u +Y1 .5 -7 +Y1 *56 $6 +Y1 -5 -5 +Y1 *52 *30 +y1 -5 +2 +y1 *50 $d +y1 *50 .4 +$- Y1 +5 +{ y1 +5 +y1 ,4 s6. +y1 .4 i1u +Y1 ^4 i1f +Y1 *48 Z1 +y1 *47 ^j +Y1 *46 seK +{ Y1 *45 +y1 .4 *34 +Y1 +4 $3 +y1 ,4 .2 +Y1 *41 +y1 *40 i76 +Y1 +4 +Y1 $@ .4 +Y1 [ +4 +Y1 .4 $@ +y1 { .4 +$y *14 $. +$y $. *14 +^* y1 .4 +y1 ,3 $w +Y1 *38 o44 +y1 *36 *12 +Y1 *34 i5o +Y1 $3 +4 +y1 *32 T6 +y1 ^3 *27 +y1 *31 x43 +y1 ,3 *15 +Y1 *30 *52 +Y1 { ,3 +y1 ] ^3 +y1 ^3 } +y1 ^3 ] +} y1 ^3 +y1 ,2 t +Y1 .2 R4 +y1 +2 i6. +y1 $2 ^C +^! y1 *27 +y1 +2 -5 +Y1 *24 ^q +y1 .2 ,4 +Y1 *23 c +Y1 +2 [ +Y1 } ^2 +$& Y1 -2 +y1 .2 +Y1 $1 x23 +Y1 $1 ^L +y1 .1 $c +y1 *17 x12 +y1 *17 o59 +y1 .1 *73 +y1 *15 ,3 +y1 *14 +y1 *13 x71 +y1 *13 x51 +Y1 *13 r +y1 *12 $j +y1 *12 i1q +y1 *12 i1f +y1 *12 *36 +y1 +1 +Y1 -0 x43 +y1 +0 $x +Y1 $0 o9r +Y1 ^0 ^j +y1 ^0 d +y1 *08 r +Y1 $0 +8 +Y1 *06 { +Y1 *05 o0g +y1 *03 ^f +Y1 +0 $# +Y1 +0 +Y1 $# +0 +Y1 $0 +Y1 .0 +y1 $0 +Y1 $* $* +Y1 $$ +Y1 $_ +Y1 $ +Y1 ^( +Y1 ^_ +$% Y1 +$& Y1 +$$ Y1 +$. Y1 } +{ Y1 $% +{ Y1 +y1 $. +y1 $! +y1 $_ +$y $1 +$+ y1 $. +$+ $. y1 +} ^. y1 +^y +1 +^' y1 { +$y -0 K +$@ ^Y +} $Y +^Y ^@ +^Y +$_ $y +{ $y +^y $_ +^_ ^y +^= ^y +^X z5 l +$X Z4 y4 +$X Z4 y2 +^X z4 y1 +^x z3 Z1 +^x z3 Y1 +$x Z3 k +$x Z3 +^x z3 +$X Z2 *34 +^x z2 *15 +$x Z2 *04 +^x Z1 z3 +^X Z1 ^T +$x Z1 s1_ +$x z1 i8x +$x Z1 C +^x z1 *60 +$x Z1 +6 +$x z1 +$X $Z +^X Y5 $x +$X Y5 -0 +$X y4 Z4 +$x y3 +$X y2 Z4 +^x Y2 Y2 +^x y2 +^X y1 z4 +^x Y1 z3 +^x y1 ssi +$X Y1 } +$X Y1 +^X $X ,8 +^X x62 *21 +$x x51 *01 +$x x42 $d +^x x25 +$x x06 s1t +$x x04 +$x x01 i5 +$x x01 +^X ^x +$X $V +$x } ^u +^x u +^X ^T Z1 +$x t D4 +^X T8 +$X T4 y4 +^X t +$x $t +^x ^t +^x ssi y1 +$X smp +^X sIM i5k +$x s1_ Z1 +$x s1t x06 +^X ^S +$X r x82 +$x R4 *60 +^x R3 k +$X ^r +$x $q +$^ $x q +$X p1 ] +$- $x p1 +^x ^p +$x o9 so` +$x o95 +$x o9 +^x o8o +$X o7t i5j +$x o75 +$X o6x +^x o5h +$x o4b +$X o3O +$x o3k +$x o2j +^x o2f +^x o2A +$x o2 +$X ^o +^x ^o +^X l z5 +$x L8 +$x L7 +$X L5 C +$X L0 +^X $L +$x k Z3 +^x k R3 +^x k q +^x k i7x +^x K +^x $k +^x ^k +$X i8W +$x i8m +^x i7x k +$X i7c +^x i73 +^x i6k +$x i6h +$X i5t +^X i5k sIM +^X i59 +$x i4w +^x i4N +$x i4g +^X i4b +$x i40 +$X i3b +$x i3a *46 +$x i2z +^x i2o +^x i2m +^x i2g +$X i23 +$x i1k +^x i1g +^x i12 ^j +^X i10 +$x i0W +^x i0p +$X i01 +^x ^i +$x ^g p4 +^X ^F +$X E +8 +$X E +0 +^X ^E +$x $d x42 +^x D7 +$x D4 t +$x D3 +^x ^d +3 +^x $d *15 +^X d [ +$x d +$x C Z1 +^X $C +$x ^C +^x ^c +xBA oBk +xBA iB ] +xB6 ] +xB5 xA1 $. +xB5 $. xA1 +xB5 o8m +xB4 x53 u +xB4 u x53 +xB4 oB5 +xB4 i9s +xB4 *9B +xB4 +xB3 u +$ xB3 $1 +xB2 Z2 x42 +xB2 $z +xB2 x42 Z2 +xB2 x34 +xB2 x26 +xB2 oBs +xB2 o9e +xB2 *A9 +xB2 +9 +xB2 +xB1 xA1 $m +xB1 x36 +xB1 u .A +xB1 oAy +xB1 o9i x42 +xB1 o7c +xB1 $m xA1 +xB1 i8_ +xB1 i0* +xB1 .A u +xB1 $A +xB1 ,A +xB1 $a +xB1 $8 +xB1 $5 +$x $b +$x ^b +xA6 x36 +xA6 t +xA5 D7 +xA5 +xA4 x35 *20 +xA4 u o8W +xA4 o8W u +xA4 *20 x35 +xA4 $1 +xA3 t ,9 +xA3 iBi +xA3 D7 +xA3 ,B +xA3 *A7 +xA3 ,9 t +xA2 T0 iAg +xA2 oAn +xA2 oAm +xA2 oA? +xA2 o8y +xA2 o8r c +xA2 o8b +xA2 K +xA2 $k +xA2 iBe -9 +xA2 iBe +xA2 iAg T0 +xA2 c o8r +xA2 -9 iBe +xA2 *94 x31 +xA2 *68 +xA2 -6 +xA2 $2 +xA2 ^1 +xA2 $. +xA1 x34 +xA1 x21 x71 +xA1 TB +xA1 p1 +xA1 oB7 +xA1 o6j u +xA1 i5g +xA1 +B K +xA1 *98 $4 +xA1 .8 x32 +xA1 $4 *98 +xA1 $2 +$x ^a +^x $a +x98 $t +x98 +9 +x98 { { +x98 +x97 t DA +x97 $e +x97 DA t +x96 u +x96 o7o +x95 i7_ +x95 E $2 +x95 $2 E +x95 $1 +x94 o9y +x94 o9k +x94 o9a +x94 o4 t +x94 i8l +x94 $2 +} x93 z1 +x93 Y3 +x93 t *78 +x93 sh8 +x93 $o $p +x93 oB1 +x93 o9j +x93 o82 +x93 E +x93 -B +x93 *A9 +x93 +9 +x93 *78 t +x93 -7 +^, $. x93 +x92 $y +x92 x06 +] x92 t +x92 $s u +x92 oAw +x92 o90 +x92 o8l +x92 o6b +x92 o39 +x92 $L +x92 i5@ +x92 ^i +x92 $e +x92 ,B +x92 +A +x92 $! -A +x92 $A +x92 -A $! +x92 *41 x31 +x92 $, +$+ x92 +$@ x92 +$? x92 +x91 y4 c +x91 xB1 +x91 x54 T1 +x91 x12 +x91 ^W +x91 u -8 +} x91 T8 +x91 T7 T6 +x91 T6 T7 +x91 T1 x54 +x91 sSV +x91 ssb +x91 s4A o6O +x91 ^S +x91 R9 ^2 +x91 oBy +x91 o8z +x91 o8u +x91 o8d +x91 o88 *87 +x91 o7u +x91 o7b +x91 o77 DB +x91 o6O s4A +x91 o6i +x91 o5& +x91 o4s +x91 o3@ +x91 o1o +x91 o0f +x91 i8B +x91 i44 +[ x91 i0V +x91 DB o77 +x91 C $8 +$* x91 c +x91 +B +x91 -B +x91 $a +x91 +9 $1 +x91 ,8 Y5 +x91 -8 u +x91 $8 C +x91 -8 .6 +x91 ,7 +x91 .6 -8 +x91 $6 +x91 $1 +9 +x91 *18 +$x -9 +^X ,8 $X +$X +8 E +x8A +x89 $1 $A +x87 Z1 +x87 Y2 Y2 +x86 $1 +x86 { *04 +x86 +x85 x32 K +x85 t +x85 K x32 +x85 ^A +x85 $1 +x84 $Y u +x84 Y4 +x84 Y3 u +x84 Y1 +x84 x31 sau +x84 u Y3 +x84 u $Y +x84 sau x31 +x84 oA1 +x84 o57 +x84 *8A -8 +x84 *89 +x84 *48 +[ $ x84 +$ x83 Z2 +x83 x61 i5 +x83 x06 +x83 s f +$\ x83 R9 +x83 R8 ,9 +x83 o90 +x83 o8i +x83 o5l +x83 o3a +x83 i9l +x83 i7a +x83 i4n +x83 E $9 +x83 'B ,7 +x83 $9 E +x83 -9 +x83 -8 +x83 ,7 'B +x83 $2 +x83 ^1 *27 +$@ x83 +x82 Z1 u +x82 Z1 *78 +x82 y5 +x82 Y1 $S +x82 x42 ^@ +x82 [ x41 +x82 x31 +x82 $x +x82 ^v +x82 u Z1 +x82 ssz +x82 s0m ^! +x82 ^! s0m +x82 p4 z1 +x82 o7_ +x82 o6g *68 +x82 o60 +x82 o5s +x82 o5_ +x82 o44 +x82 o0j +x82 i8z +x82 i7h +x82 ^i +x82 D5 [ +x82 [ D5 +x82 C +x82 *96 ,6 +x82 +8 +x82 *78 Z1 +x82 $7 ,3 +x82 -7 +x82 -6 +x82 ,3 $7 +x82 *16 D5 +x82 $, +x82 } } +$* x82 [ +$. x82 +] x82 +x81 y2 y2 +x81 x61 T5 +x81 x54 snq +x81 x43 +x81 u T9 +x81 u *83 +x81 T5 x61 +x81 T2 o8R +x81 snq x54 +x81 sdj +x81 scs K +x81 s04 +x81 s- +x81 p3 o2y +x81 o8R T2 +x81 o8e +x81 o7s +x81 o66 +x81 o5l +x81 o41 +x81 o2. +x81 o1u +x81 o12 +6 +x81 o0D +} x81 L0 +x81 K scs +x81 i7s +x81 i7f +x81 i62 +x81 i1- x42 +x81 i1c +$@ x81 E +[ x81 E +x81 'B +x81 ^A +x81 ,9 +x81 *83 u +x81 +6 o12 +x81 $5 +x81 *21 k +^ x81 +$x +8 +^x ,8 +^x ^8 +x7B x12 +x78 E T4 +x76 p1 x07 +x76 oA1 +x76 K +x76 i6r +x76 $i +x75 z2 +x75 $z +^* x75 T6 +x75 o6_ +x75 o3x +x75 i7k +x75 $9 Z1 +x75 ] ^1 +x75 ^1 ] +x75 +x74 y4 k +x74 Y4 +x74 y1 ^A +^X *74 x65 +x74 x62 +x74 x32 x46 +x74 x32 +x74 o4c +x74 i3e +x74 $d +x74 *58 +x74 ] ] +$* x74 +$. x74 +} x74 +x73 Z1 +x73 x05 u +x73 u x05 +x73 ^q +x73 o7- +x73 o6m +x73 ^m +x73 $l +x73 i7@ p4 +x73 i4' +x73 i3r +x73 i0# +x73 C $2 +x73 'A +x73 *87 +x73 *53 { +x73 ] -3 +x73 -3 ] +x73 $2 C +x73 $1 +x73 +0 +$* x73 +$) x73 +$# x72 Z2 +x72 y5 +x72 Y4 x63 +x72 y3 +x72 Y2 *36 +x72 x85 +[ x72 x51 +x72 x31 +x72 x24 $t +x72 x21 +x72 x02 +x72 u *06 +x72 $t x24 +x72 t $I +x72 T5 +x72 T0 } +x72 s3/ +x72 s1@ +x72 s1, +x72 $s +x72 [ r +x72 p3 o27 +x72 p1 .7 +x72 oAs +x72 o9k +x72 o8, +x72 o7. Y1 +x72 o7# +x72 o6z $4 +x72 o5k +x72 o5h +x72 o57 +x72 o3c +x72 o3 *27 +x72 o3@ +x72 o2 +$. x72 o1a +x72 K *31 +x72 i7p +x72 i7_ +x72 i6j +x72 i5s +x72 i5H +x72 i5e +x72 i5D +x72 i59 +x72 i50 +x72 i4t +x72 i3o +x72 D2 +x72 +B $1 +x72 $A +x72 ^A +x72 ,8 +x72 -8 +x72 *76 +4 +x72 *69 +x72 *65 +x72 $4 o6z +x72 +4 *76 +x72 -3 -2 +x72 *31 K +x72 ,3 +x72 *26 $@ +x72 $@ *26 +x72 *25 +x72 -2 -3 +x72 +2 +2 +x72 -2 -0 +x72 $1 +B +x72 *06 u +x72 -0 -2 +x72 $. [ +x72 [ $. +$/ x72 +$_ x72 +^x *72 +^@ x72 +x71 Z3 o0l +$ x71 Z1 +x71 z1 +^? x71 z1 +x71 Y5 +x71 y5 +x71 Y1 i33 +x71 x05 C +x71 x05 +x71 x02 +x71 t .6 +x71 ^t +x71 smd +x71 s2! +x71 R9 o8y +x71 o9g +x71 o8y R9 +x71 o8n +x71 o77 +x71 o61 +x71 o5u +x71 o5a +x71 o41 E +x71 o2i +x71 o2C +x71 o1r +x71 o0l Z3 +x71 k i2d +x71 i9m +x71 i6j +x71 i5u +x71 i59 +x71 i52 +x71 i4x +x71 i4a y5 +x71 i33 Y1 +x71 i2d k +x71 i2? +x71 i1c +4 +x71 [ i0V +x71 ^G +x71 E o41 +x71 d x07 +x71 d x02 +x71 c *13 +x71 ^B x13 +x71 *A9 +6 +x71 ^a +x71 *78 ] +x71 ] *78 +x71 *71 *60 +x71 ^7 +x71 .6 t +x71 +6 *A9 +x71 .6 *59 +x71 *60 *71 +x71 *59 .6 +x71 *59 +x71 +4 y4 +x71 ,4 ^s +x71 *13 c +x71 } +x71 ^@ +$* x71 +^X ^7 +$x +6 Z1 +x6A u $2 +x6A $2 u +x68 o6k +^X *68 +x68 +x67 *21 +x67 ] +x65 Y3 t +x65 x31 +x65 t Y3 +x65 o3w +x65 K i6g +x65 $j +x65 i6g K +x65 i6_ +x65 i2. c +x65 c i2. +$_ x65 +x65 +$. x64 Y1 +x64 xA1 +x64 x62 +x64 $s +$! x64 o6& +x64 o4s +x64 o34 +x64 ^o +x64 c +x64 -6 +x64 ^4 +x64 *34 +x64 .3 ,2 +[ x64 *25 +x64 ,2 .3 +x64 ] +x64 ^* +$* x64 +^! x64 +x63 Z4 $M +x63 Y3 u +x63 y3 C +x63 Y2 ^t +x63 Y2 +x63 Y1 i14 +x63 x51 +x63 u Y3 +x63 u p1 +x63 ^t Y2 +x63 t *89 +x63 $t +x63 srw +x63 s86 +x63 ^s +x63 ^r ^m +x63 p1 u +x63 $p +x63 o8u +x63 o7z +x63 o5T i6M +x63 K +x63 i6p +x63 i6M o5T +x63 i6@ +x63 i4 +x63 i3t +x63 i14 Y1 +x63 i0Y +x63 $h +x63 D9 +x63 D5 +x63 *89 t +x63 $6 +x63 +5 *53 +x63 +5 *31 +x63 $5 +x63 *47 *43 +x63 ^4 +x63 *31 +5 +x63 $3 +x63 $* +x63 $@ +$* x63 +$/ x63 +^( x63 +x62 $! Z1 +} x62 z1 +x62 Y4 u +x62 Y3 +} x62 Y2 +x62 Y1 ,6 +{ x62 Y1 +x62 $x *65 +x62 u Y4 +x62 u *79 +x62 T1 $$ +x62 $$ T1 +x62 stw +x62 srx +x62 s28 o7. +x62 s1 z1 +x62 s1! l +x62 ^* R6 +x62 R6 +x62 R5 +x62 R4 +x62 $r +x62 p3 $t +x62 o8@ +x62 o7. s28 +x62 o66 +x62 o4_ +x62 o3f +^@ x62 o2y +x62 o2f +x62 o1t +x62 o0F +x62 l s1! +x62 K +x62 i8. +x62 i7z +x62 i5i i5P +x62 i5- ,2 +x62 i5@ +x62 i4e i5l +x62 } i43 +x62 i3x +x62 i3m +x62 i26 +x62 i2- +x62 ^h +x62 d x63 +x62 D5 +x62 d +x62 C +x62 -A +x62 ^a +x62 $8 +x62 *79 u +x62 *70 +x62 ,6 Y1 +x62 *65 $x +x62 *54 +x62 *43 ,3 +x62 +3 +x62 .3 +x62 ,2 i5- +x62 .2 ,1 +x62 ,1 .2 +x62 ^1 +x62 $0 +x62 [ [ +$& x62 +$* x62 +^$ x62 +^@ x62 +^( x62 +x61 ^z +x61 ^y ,5 +x61 Y4 *1A +x61 Y3 o0L +x61 y3 *96 +x61 ] Y2 +x61 xA1 +x61 x73 p4 +x61 x71 x21 +x61 x21 x61 +x61 x19 +x61 x03 y2 +x61 x02 y4 +x61 $v +4 +x61 $v +x61 $u o7x +x61 u 'A +x61 t i86 +x61 ^T +x61 sZ$ +x61 sHT +x61 sH6 +x61 scm +x61 s29 +x61 $r ^F +x61 R7 R7 +x61 R3 +x61 R2 +x61 o8w +x61 o8! +x61 o7_ k +x61 o7c +x61 o71 +x61 o3y +x61 o3< +x61 o2q *13 +x61 o1S i61 +x61 o1o +x61 o0L Y3 +x61 ^N T3 +} x61 $m +x61 L6 Z2 +x61 L3 ^e +x61 k o7_ +x61 k *23 +x61 $k +x61 i8i +x61 i8d +x61 i86 t +x61 i7u +x61 i7n +x61 i77 +x61 i61 o1S +x61 i4k *76 +x61 i3s +x61 i3e +x61 i3d +x61 i3- +x61 i17 +x61 i15 +x61 i07 +x61 ^H ^R +x61 ^G ^J +x61 ^F $r +x61 ^f +x61 ^e +x61 D7 *34 +x61 D0 -7 +x61 $D +x61 $b *30 +x61 'A u +x61 'A -6 +x61 *95 .6 +x61 +8 +x61 +6 Y3 +x61 -6 'A +x61 .6 *95 +x61 ^6 +x61 +4 $v +x61 -4 *35 +x61 *35 -4 +x61 *34 D7 +x61 *30 $b +x61 $3 +x61 ^3 +x61 *25 -0 +x61 *23 k +x61 +2 +1 +x61 ,2 +x61 ^2 +x61 *13 o2q +^ x61 *13 +x61 +1 +2 +x61 -1 +x61 -0 *25 +x61 *02 ^1 +x61 +0 $! +x61 $! +0 +x61 ] -0 +x61 -0 ] +x61 $? [ +x61 [ $? +$+ x61 +$? x61 +$! x61 +} x61 ] +} ] x61 +] x61 +[ x61 +$x *60 R4 +$X ,6 +$x .6 +^x +6 +x59 $k +x59 i32 +x58 s-4 +x57 o2o +x57 f x57 +x57 *34 +x57 ] ] +x56 x06 +x56 r +x56 d +x56 '9 +4 +x56 $7 +x56 +4 '9 +x56 $2 +x56 -1 +x54 z5 t +x54 z3 *18 +x54 z2 ssw +x54 ^$ z2 +x54 y5 o5v +x54 y4 *75 +x54 Y3 o3 +x54 y2 +8 +x54 x72 +x54 x01 ^r +x54 u +x54 t z5 +x54 t *01 +x54 ssw z2 +x54 $r +x54 q x04 +x54 o73 +x54 o3 Y3 +x54 o3o $2 +x54 o0y +x54 o0b p3 +x54 $l t +x54 L5 Z1 +x54 E ^3 +x54 -B +x54 ^A +x54 *93 x24 +x54 *64 +x54 ^5 o6m +x54 *54 +x54 *34 +x54 $3 +x54 $2 o3o +x54 $2 +x54 *02 +x54 *01 t +x54 { { +^( x54 +^` x53 z3 +x53 Y5 o5k +x53 Y2 *87 +^$ x53 y1 +x53 x64 o43 +x53 x52 $. +x53 $. x52 +x53 ^V +] x53 u +x53 ^s z5 +x53 ^s +x53 r +x53 $q *24 +x53 o8m +x53 o4M Y2 +x53 o4c +x53 o43 x64 +x53 o1r +x53 o0f +x53 $n +x53 i6h +x53 i6d +x53 i1f .4 +x53 i19 +} x53 $h +x53 $g +x53 'A +x53 *97 +x53 *76 i0J +x53 -7 *10 +x53 ^7 +x53 *65 $> +x53 $> *65 +x53 .6 +x53 -5 +x53 ^5 +x53 *43 +x53 +4 ] +x53 $4 +x53 ] +4 +x53 *32 +x53 ,3 +x53 *24 $q +x53 *24 +x53 *10 -7 +[ x53 *02 +x53 $& +x53 $@ +x53 $! +x53 $= +x53 ^* +$* x53 +$$ x53 +[ $x *53 +x52 $z k +$ x52 Z5 +^@ x52 z5 +x52 Z2 } +x52 { Z2 +x52 Z1 sPA +x52 y5 o5D +x52 Y4 u +x52 y4 E +[ x52 Y3 +x52 Y2 u +x52 Y2 +x52 y1 ,5 +x52 x92 +x52 x74 +x52 u Y4 +x52 u Y2 +x52 T4 i71 +x52 T4 ,7 +x52 T4 $% +x52 $% T4 +x52 ssz +x52 sPA Z1 +x52 so. c +x52 snq ] +x52 ] snq +x52 sd& +x52 s8# -0 +x52 s1. +x52 r p1 +x52 r ^e +x52 ^r *73 +x52 R5 +5 +x52 R5 +x52 p5 o63 +x52 p1 r +x52 p1 ] +x52 oB0 +x52 o76 Z1 +x52 o5- +x52 o4, +x52 o4_ +x52 o2y +x52 $n +x52 ^m +x52 ^L +x52 k $z +x52 K ^3 +x52 $j $t +x52 i8p ] +x52 i71 T4 +x52 i6F +x52 i6& +x52 i5t +x52 i5h *27 +x52 i55 +x52 i4p +x52 i4N } +x52 i3* *65 +x52 i34 +x52 i3/ +x52 i2y +x52 i2h *53 +x52 i1r +x52 i11 y4 +x52 i0x +x52 ^f +x52 ^e +x52 d x05 +x52 d +x52 c so. +x52 c $* +x52 $* c +x52 ^a z2 +x52 $A +x52 ^a +x52 ,7 T4 +x52 ] $6 +x52 +5 R5 +x52 ,5 +x52 ^3 K +x52 .3 +1 +$* x52 -3 +x52 *25 ^P +x52 +1 .3 +x52 *12 ^t +x52 ^1 +^@ x52 +1 +x52 -0 s8# +x52 $0 *81 +x52 *07 x63 +x52 .0 *60 +x52 *05 +x52 +0 +x52 -0 +x52 $@ +x52 $? +x52 $! +x52 $_ +$% x52 +{ x52 { +^! { x52 +$# x51 Z3 +x51 Z2 iA0 +x51 } z2 +x51 z1 *23 +x51 ^Y $7 +x51 y5 T5 +x51 y5 o3i +x51 y5 o0J +x51 y5 i52 +x51 y5 $A +x51 Y4 +x51 y3 y3 +x51 Y3 o6b +x51 Y3 [ +x51 [ Y3 +x51 y1 sue +x51 Y1 ^d +x51 xA5 +x51 x82 +x51 x73 +x51 x65 +x51 x19 +x51 x13 t +x51 $w .2 +$* x51 u +x51 t x13 +x51 T7 +x51 T0 .2 +x51 t $- +x51 $- t +x51 syE .1 +x51 ^s x35 +x51 sue y1 +x51 sbA .4 +x51 sb@ +x51 s5_ $! +x51 $! s5_ +x51 $R R4 +x51 $r l +x51 R5 +x51 R4 $R +x51 $q +x51 oAj +x51 o6= ^K +x51 o5t +x51 o5! o0z +x51 o5e +x51 o50 ^@ +x51 o5# +x51 o5, +x51 o4D +x51 o37 *02 +x51 o3- +x51 o2i +x51 o1, +x51 o0z o5! +x51 o0* +x51 $M +x51 $m +x51 l $r +x51 K $P +x51 K ^H +x51 ^j +x51 i8n +x51 i8 +x51 i3u +x51 i35 +x51 i1d +x51 i11 +x51 i0z +x51 i08 +x51 i0* +x51 ^H K +x51 E z2 +x51 d Y2 +x51 ^d Y1 +x51 d *61 +x51 ^d -2 +x51 ^d +x51 d +x51 ^c +x51 $A y5 +x51 $A *30 +x51 $7 ^Y +x51 *75 +x51 *64 ,4 +x51 $_ .6 +[ x51 *58 +x51 *52 +x51 .4 sbA +x51 ^4 +x51 *30 $A +x51 ^3 +x51 .2 $w +x51 .2 T0 +x51 .1 syE +x51 *13 o1L +x51 *02 o37 +x51 ^! +$* x51 +$? x51 +$ x51 +] x51 ] +] ] x51 +^@ x51 ] +^@ ] x51 +^- x51 +$x -5 +x49 i2r $3 +x49 $3 i2r +x48 y3 o0C +x48 $8 $9 +x47 x05 +x47 x02 +x47 o0H +x47 i6e +x47 i40 i55 +x47 i32 i45 +x47 $2 +x47 $1 +x46 y4 o4I +x46 y2 .2 +x46 $U +x46 so0 +x46 i51 +x46 i4a +x46 i4& +x46 i2_ +x46 i0B T1 +x46 f o5l +x46 *30 +x46 -0 +$. x46 +x45 Z1 o6d +x45 y5 o9s +x45 y5 -5 +x45 y4 o4g +x45 y4 $? +x45 $? y4 +x45 y3 +x45 Y2 t +x45 u +x45 t Y2 +x45 s6- +x45 s3C +x45 p5 $1 +x45 i6w +x45 i4x +x45 i4] D1 +x45 i4b +2 +x45 i41 +x45 i1y +x45 D6 +3 +x45 d -5 +$/ x45 d +x45 +6 -5 +x45 -5 +6 +x45 ^5 +x45 +3 D6 +x45 *31 +x45 $3 +x45 +2 i4b +x45 $2 $5 +x45 *13 +x45 $* +x45 [ +$? x45 +$! x45 +x43 y5 Y1 +x43 Y5 x32 +x43 y5 C +x43 y5 *60 +x43 Y5 +x43 Y4 i5p +x43 y3 x52 +x43 y3 k +x43 y3 +4 +x43 Y3 { +x43 Y1 y5 +x43 y1 +x43 x82 +x43 x72 +x43 x41 +x43 ^x +x43 u o1Y +x43 st> +x43 srf +x43 scg +x43 sbt +x43 q T0 +x43 o4i +x43 o42 +x43 o3x +x43 o2r +x43 o1Y u +x43 o1r k +x43 o1F y2 +x43 o0F $8 +x43 k C +x43 i7 +x43 i5y +x43 i5w +x43 i4V c +x43 i4k +x43 i4J +x43 i48 } +$! x43 i48 +x43 i2t +x43 i2D +x43 i1l +x43 i16 +x43 i0$ y1 +x43 E ^& +x43 d -5 +x43 D3 +x43 C +[ x43 C +x43 ^c +x43 $b R9 +x43 $8 o0F +x43 $7 +x43 $6 Y1 +x43 +3 s1s +x43 $3 +$= x43 +3 +x43 *25 +x43 *23 y3 +x43 ^1 +^@ x43 ^1 +x43 *04 +x43 { -0 +x43 $@ +x43 $? +x43 $! +x43 $- [ +x43 [ $- +x43 [ +x43 ^& +[ x43 +^x *43 +^@ x43 +x42 Z5 Z4 +x42 Z5 u +x42 Z4 Z5 +x42 z3 i0H +x42 Z2 o5u +] x42 Z2 +x42 z1 Y2 +x42 Z1 .3 +x42 Z1 +x42 $z +x42 Y5 o5A +x42 y4 s2# +x42 y4 i4* +x42 Y3 E +x42 Y2 z1 +x42 Y2 y1 +x42 y2 ^g +x42 y2 +x42 Y1 Y3 +x42 y1 Y2 +x42 Y1 o59 +x42 $# Y1 +x42 $) Y1 +x42 $x +x42 ^V +x42 u Z5 +x42 $t ^e +x42 ^t ^8 +x42 T7 +x42 T1 { +x42 t .1 +x42 T0 p1 +x42 T0 $A +x42 ^t +x42 ssu o4d +x42 spw +x42 spK *84 +x42 sl% +x42 siu +x42 s9@ +x42 s2# y4 +$. x42 s1Y +x42 ^R +x42 p1 i5+ +x42 p1 +x42 o7z +x42 o5z +x42 o5i +x42 o59 Y1 +x42 o58 +x42 o5_ +x42 o4y +x42 o4p +x42 o4d ssu +x42 o4B +x42 o3y u +x42 o3@ D7 +x42 o35 +x42 o2z t +x42 o2d +x42 o29 +x42 o1& +x42 o0p +x42 ^M o3h +x42 $M +x42 $l *05 +x42 K i3P +x42 K ^! +x42 ^! K +x42 i8j x93 +x42 i7 *9A +x42 i7- +x42 i7_ +x42 i6@ +x42 i5q +x42 i53 +x42 i5= +x42 i3w +x42 i3q +x42 i3P K +x42 i3o ] +x42 ] i3o +x42 i3i } +x42 i2y +x42 i2e +x42 i1r +x42 i0Z +x42 i0| +x42 $i +x42 E Y3 +x42 ^e $t +x42 E $. +x42 $. E +x42 $D $C +x42 D7 o3@ +x42 d *54 +x42 D0 +x42 ^@ c +x42 $A T0 +x42 -A +x42 $a +x42 *97 $? +x42 $? *97 +x42 *84 spK +} x42 *62 +x42 ^4 D2 +x42 *42 +x42 .3 Z1 +x42 ^3 +x42 *23 [ +x42 *21 -0 +x42 *20 +x42 +2 +$/ x42 +2 +x42 .1 t +x42 +1 { +x42 *07 +x42 *05 $l +x42 *03 y5 +x42 -0 *21 +x42 +0 +x42 -0 +$# x42 +$- x42 +$` x42 +[ x41 Z3 +x41 z1 i1i +x41 z1 i11 +x41 $z +x41 Y3 T2 +x41 y3 +x41 y2 o6 +x41 Y2 -2 +$. x41 Y2 +x41 Y1 ^t +$! x41 Y1 +x41 $y +x41 $X d +[ x41 x62 +x41 x46 +x41 x12 +x41 ^w +x41 ^u ^F +x41 $u *31 +x41 ^t Y1 +x41 t T2 +x41 t R5 +x41 T2 Y3 +x41 T2 t +x41 t ] +x41 t [ +x41 ] t +x41 [ t +x41 t +x41 sy +x41 sSD +x41 se( -7 +x41 sc4 +x41 sa! +x41 s5 +x41 s37 +x41 $s +x41 $r t +x41 R5 t +x41 R5 R5 +x41 ^p y2 +x41 p3 x6A +x41 p2 Z1 +x41 p2 x64 +x41 oAA +x41 o8 +x41 o7y +x41 o6e +x41 o52 +x41 o4O $* +x41 $* o4O +x41 o41 +x41 o4@ +x41 o3z +x41 o3r $6 +x41 o3n +x41 o3l i1r +x41 o3f +x41 o30 +x41 o3& +x41 o2w +x41 o2V +x41 o2- +x41 o1z ^b +x41 o1V +x41 o1o +x41 o1J +x41 o1i *35 +x41 o1e +x41 o0X +x41 o0W +x41 o0d +x41 o0+ $+ +x41 o0! +x41 $+ o0+ +x41 ^m -5 +x41 K Y4 +x41 i7l +x41 i7$ +x41 { i6u +x41 i6r +x41 i60 +x41 i5c E +x41 i58 +x41 i5& +x41 i3c +x41 i2m +x41 i2@ +x41 i1Y R2 +x41 i1- $7 +x41 i15 +x41 i1* +x41 i0L +} x41 i0. +x41 f $E +x41 ^f $A +x41 f *75 +x41 E i5c +x41 E $a +x41 E +5 +x41 ^e +x41 } D9 +x41 ^B +x41 $A ^f +x41 $a E +x41 *97 ] +x41 -7 se( +x41 $7 i1- +x41 *78 .4 +x41 -7 *64 +x41 -7 *52 +x41 *71 ^t +x41 $7 +x41 $6 o3r +x41 $6 *60 +x41 *64 -7 +x41 *60 $6 +x41 ,6 +x41 ^6 +x41 +5 E +x41 *57 L5 +x41 *52 -7 +x41 .5 +x41 ^5 +x41 .4 *78 +x41 *42 ] +x41 ] *42 +x41 *35 o1i +x41 *31 $u +x41 -2 Y2 +x41 *23 +x41 *16 i2M +x41 *12 o2K +x41 *10 $? +x41 $? *10 +x41 *02 ] +x41 ] *02 +x41 $0 +x41 ] ] +x41 ^_ +$; x41 +^+ ^+ x41 +$X $4 +$x $4 +^x $4 +x3B o3f +x38 y4 y4 +x37 $& Z2 +x37 { z1 +x37 p1 c +x37 ^p +x37 o0h +x37 c $8 +x37 ^a q +x37 $8 c +$x *37 +x36 Z1 ^E +x36 y5 +x36 y4 *38 +x36 ^s +x36 o6e +x36 o3x +x36 k +x36 i3c +x36 i2T o43 +x36 ^E Z1 +x36 E +x36 $1 +x36 *03 +x35 Y4 y3 +x35 Y4 +x35 y3 Y4 +x35 y3 u +x35 Y3 t +x35 y3 i3> +x35 Y3 $1 +x35 u y3 +x35 t Y3 +x35 q p1 +x35 p1 q +$. x35 p1 +x35 o7q +x35 o2b +x35 i7s +x35 i6# +x35 i5g *50 +x35 $# i5\ +x35 d z1 +x35 $a Y4 +x35 ,1 i1W +$! x35 ^$ +$@ x34 Z4 +x34 Z3 -3 +$X *34 Z2 +x34 Z1 +x34 $y ^u +x34 y5 E +x34 y4 *64 +x34 y4 *24 +x34 y3 o0Z +x34 } y3 +x34 y3 +x34 Y2 -5 +x34 Y1 r +x34 x01 y2 +x34 $W o6. +x34 ^u $y +x34 t R3 +x34 T1 ,3 +x34 T0 q +x34 $t +x34 snr +x34 r y1 +x34 R3 t +x34 p1 o2d +x34 o7w +x34 o6. $W +x34 o5x +x34 $m +x34 ^L *61 +x34 k *57 +x34 $+ i7. +x34 i5A +x34 i4g *23 +x34 i4- +x34 i2r +x34 i1s +x34 i0! +x34 ^H z1 +x34 f x05 +x34 E p2 +x34 c p2 +x34 $A +x34 'A +x34 *64 *06 +x34 ^6 +4 +x34 *57 k +x34 ,4 +x34 -3 Z3 +x34 ,3 T1 +x34 +3 +x34 .3 +x34 *24 +x34 *23 i4g +x34 +1 +x34 $/ ^1 +x34 ^1 $/ +x34 $@ +x34 $! +[ x34 +x32 Z3 o1F +$$ x32 Z3 +x32 z2 *40 +^? x32 z2 +$/ x32 Z1 +x32 ^* z1 +x32 y5 o9e +x32 y5 o3E +x32 y5 D6 +x32 y5 +4 +x32 y4 Y2 +x32 Y4 ^H +x32 Y4 E +x32 Y3 c +x32 Y2 y4 +x32 Y2 ,5 +x32 y2 ^@ +x32 Y1 .3 +x32 ^* y1 +x32 ^Y +x32 x83 +x32 x47 u +x32 x46 +x32 x42 +x32 ^w u +x32 u x47 +x32 u $A +x32 ^u +x32 ^T -1 +x32 sxm +x32 sMj +x32 sI3 d +x32 $s *24 +x32 R5 R5 +x32 R2 $@ +x32 $@ R2 +{ x32 r +x32 ^P p2 +x32 p2 x03 +x32 p2 +x32 o95 o4t +x32 o6Q +x32 o6F +x32 o5r +x32 o4t o95 +x32 o4= ,5 +x32 o3r +x32 o3p +x32 o3A +x32 o38 +x32 o2j +x32 o2d +$_ x32 o2A +[ x32 o2@ +x32 o1y +x32 o1w +x32 o1u +x32 o1s +x32 o1F Z3 +x32 o1E +x32 o17 +x32 o0K y4 +x32 o0D i1a +x32 ^J -7 +x32 i7o +x32 i6 s0$ +x32 i5q +x32 i4x E +x32 i4w +x32 i3x +x32 i3s +x32 i3b +x32 i32 p3 +x32 i2s *35 +x32 i2g +x32 i2f ^h +x32 i2f +x32 i22 +x32 i2/ +x32 i1j +x32 i1a o0D +x32 i11 y2 +x32 ^H Y4 +x32 $g *03 +x32 ^F *12 +x32 $f +x32 ^# f +x32 E Y4 +x32 ^e q +x32 E i4x +{ x32 E +x32 d sI3 +x32 D7 Y3 +x32 ^d +x32 c Y3 +x32 ^c *21 +$$ x32 C +x32 ^c +x32 [ ^B +x32 $A u +x32 'A +x32 ^8 +x32 *76 Y4 +x32 *76 $$ +x32 $$ *76 +x32 -6 +x32 ,5 Y2 +x32 *53 -4 +x32 -4 *53 +x32 *42 +x32 .3 Y1 +x32 *35 Y2 +x32 *31 +x32 +3 +x32 -3 +x32 ^3 +x32 *25 +x32 *24 $s +x32 .1 +x32 ^0 z4 +x32 $0 $7 +x32 *03 $g +} x32 *01 +x32 .0 +x32 $) +x32 ^. +{ x32 +^@ x32 +^! x32 +x31 $z x02 +x31 z4 ^L +x31 $* Z4 +x31 z2 *30 +$- x31 Z2 +x31 Y4 o1i +x31 y3 $A +x31 y3 ] +x31 ] y3 +x31 y2 D8 +x31 Y2 D1 +x31 Y2 *BA +x31 } y1 +x31 x94 +x31 x65 +x31 x52 k +x31 x52 C +x31 x02 $z +x31 $V Z3 +x31 ^u $S +x31 u $L +x31 T7 +x31 t ,3 +x31 T0 f +x31 t ] +x31 ] t +x31 $S ^u +x31 sMf +x31 sa^ +x31 ^S $8 +x31 s2' +x31 r p2 +x31 p2 r +x31 p2 i5y +x31 p2 i0a +x31 p1 l +x31 ^p +x31 o8u i8l +x31 o7j +x31 o6! +x31 o5y +x31 o4i +x31 o43 k +x31 o3J +x31 o3_ +x31 o2v +x31 o2j +x31 o2g +x31 o2f *46 +x31 o2, +x31 o1x +x31 o19 +x31 o10 E +$? x31 o0Y +x31 o0U +x31 o04 +x31 $m Z5 +x31 $L u +x31 l p1 +x31 $l i7b +x31 ^l +x31 k x52 +x31 k o43 +x31 K c +x31 k *04 +x31 $J D2 +x31 $j *72 +x31 i8I +x31 i7+ ,7 +x31 i71 +x31 i6o +x31 i6i +x31 i6_ +x31 i2n E +x31 i2c +x31 i2@ +x31 i1d +x31 i11 +x31 ^G C +x31 f x45 +x31 ^f +$* x31 ^f +x31 E o10 +x31 E i2n +x31 d oAe +x31 d iA_ +x31 D2 $J +x31 D1 Y2 +x31 $. d +x31 C y3 +x31 C x52 +x31 c K +x31 C { +x31 ^c +x31 'B +x31 $A y3 +x31 $8 ^S +x31 *83 +x31 ^5 +x31 *46 o2f +x31 $4 +x31 .3 y5 +x31 ,3 t +x31 $3 +x31 $2 +x31 *15 y2 +x31 *12 +^X *31 +x31 $% +x31 } +x31 ^# +x31 ^@ +x31 ^/ { +} x31 +] x31 +^X $3 +^x ^3 +x2A +3 +x29 y2 $8 +x29 r p4 +x29 p4 r +x29 $8 y2 +x28 y4 *36 +x28 p2 l +x28 p2 $& +x28 l p2 +x28 i6l +x28 $7 +$* x28 +x27 z4 +x27 o3. y2 +x27 o0b +x27 K +x27 i1v +x27 $% f +x27 ^D +x26 z4 +x26 p4 l +x26 p4 $( +x26 o2h +x26 l p4 +x26 k +x26 f o0k +x26 d ^Z +x26 d *54 +x26 +4 +x26 *01 +x26 $0 +$* x26 +^! x26 +x25 y5 E +x25 y2 z2 +x25 y2 t +x25 t y2 +x25 T0 $& +x25 $& T0 +x25 q q +x25 q *74 +x25 q $2 +x25 p4 T4 +x25 p3 *54 +x25 o4! +x25 o2p +x25 o2b +x25 l $4 +x25 i5x +x25 i3g +x25 i0J +x25 $4 l +x25 $3 Y2 +x25 $# $# +x24 ^Z Y4 +x24 z5 i3o +x24 z2 +x24 Z1 +4 +x24 Y4 ^Z +x24 Y4 *24 +[ x24 y2 +x24 Y1 +4 +x24 ^v +[ x24 u +x24 t p4 +x24 T2 srS +x24 ^T +x24 srS T2 +x24 se3 +x24 R3 +x24 q D9 +x24 q *94 +x24 q *65 +x24 q ] +x24 p4 t +x24 p4 ^a +x24 p3 DA +x24 p3 +x24 p1 i5@ +x24 $P +x24 o3= f +x24 o3@ +x24 o2- $. +x24 $. o2- +x24 $l d +x24 L2 +x24 i3y d +x24 i3r +x24 i2W +x24 i2d +x24 ^E t +x24 D9 +x24 C ,1 +x24 +9 +x24 +4 Z1 +x24 +4 Y1 +x24 $& -4 +x24 -4 $& +x24 ^1 ^m +x24 *13 +x24 } +0 +x24 -0 +x24 $ +x24 ^@ +x24 ^! +$( x24 ^) +$( ^) x24 +{ x24 +x23 $z y4 +x23 Z4 Y2 +x23 $= Z3 +x23 Z2 i2T +x23 y4 $z +x23 y4 K +x23 y4 *78 +x23 y4 ,6 +x23 y3 Y1 +x23 y2 y5 +x23 Y2 t +x23 Y2 f +[ x23 Y2 +x23 Y1 y3 +x23 Y1 o4w +x23 x62 +x23 x4B y4 +x23 x41 $$ +x23 $$ x41 +x23 x02 x56 +x23 $x +x23 ^w *48 +x23 $V +x23 ^u +x23 t Y2 +x23 t -0 +$+ x23 t +x23 snq +x23 $S +x23 R0 ^l +x23 r +} x23 q +x23 p4 l +x23 p3 'A +x23 p2 'A +x23 p2 ] +x23 p1 o9$ +x23 p1 [ +x23 o7h +x23 o6! Y1 +x23 o4w Y1 +x23 o3g +x23 o2y ] +x23 ] o2y +x23 o2W +x23 o2K +x23 o1i q +x23 o1_ +x23 o0h $` +x23 $` o0h +$. x23 $O +x23 ^m +x23 l p4 +x23 L6 ^n +x23 ^' ^L +x23 k p2 +x23 ^K +x23 ^J +x23 ^j +x23 i7, +x23 i5y +x23 i5/ $B +x23 i4# +x23 i3t +x23 i2T Z2 +x23 i2b +x23 i2& +x23 i1p +2 +x23 i1h +x23 i06 .3 +x23 ^h +x23 ^G +x23 ^e u +x23 ^e i1G +x23 ^e +x23 d 'A +x23 D7 -5 +x23 $B i5/ +x23 $b +x23 ^7 +x23 *64 ] +x23 ] *64 +x23 -5 D7 +x23 *35 Y4 +x23 } $1 +x23 -0 t +x23 $0 +x23 ^@ +$$ x23 +$@ x23 +$. x23 +$< x23 +} x23 $! +} $! x23 +] x23 +x21 Z5 *34 +x21 z3 *25 +x21 z2 ,4 +x21 Z1 .0 +^! x21 z1 +x21 $z +x21 $y t +x21 Y4 y3 +x21 y4 x74 +x21 Y4 t +x21 y4 +x21 y3 Y4 +x21 y3 E +x21 Y1 $p +x21 } y1 +x21 x81 o0r +^X *21 x62 +x21 x19 +x21 x18 +0 +x21 ^x +x21 u i1X +x21 u .7 +x21 u $1 +x21 t Y4 +x21 t o3* +x21 t i3n +x21 t d +x21 t ^B +$. x21 srx +x21 sln +$) x21 sKZ +x21 sg# +x21 sea +x21 se# -1 +x21 s89 +x21 ^s +x21 r o6m +x21 ^R o6F +x21 r i6i +x21 $R ,4 +x21 R0 +x21 ^R +x21 [ r +x21 q +x21 p1 -3 +x21 [ p1 +x21 o7h o1u +x21 o7a i4A +x21 o6w +x21 o5k +x21 o52 +x21 o3* t +x21 o3n +x21 o3h +x21 o3c +x21 o3a p2 +x21 o2t +x21 o2M +x21 o2d E +x21 o1y +x21 o1u o7h +x21 o1u D3 +x21 o1c +x21 o0r x81 +x21 o0I +x21 o0d +x21 o0$ +x21 l +x21 K d +x21 k ] +x21 ] k +x21 i8i +x21 i7L x42 +x21 i6l +x21 i6d +x21 [ i55 +x21 i5/ +x21 i4t +x21 i4j +x21 i4e +x21 i4b +x21 i3B o5! +x21 i1X u +x21 i1i +x21 i0z +x21 i0Q +1 +x21 $h +x21 E o2d +x21 E o1M +x21 ^d y3 +x21 d t +x21 DB +x21 D3 o1u +x21 [ d +x21 c -9 +$, x21 c +x21 'B +x21 ^a +x21 -9 c +x21 .7 u +x21 *75 +x21 ^7 +x21 [ *62 +x21 -5 Y4 +x21 .4 z1 +x21 ,4 $R +x21 *34 Z5 +x21 [ *26 +x21 } *21 +x21 $2 +x21 .1 y2 +x21 $1 u +x21 -1 se# +x21 *16 +x21 { +1 +x21 .0 Z1 +x21 -0 y2 +x21 +0 x18 +x21 $0 *98 +x21 *05 +x21 $- +$* x21 $/ +$* $/ x21 +$< x21 +^' x21 +^, x21 +$x ^2 +x1B z2 t +x1B t z2 +x1B C z3 +x1A z2 t +x1A t z2 +x1A p5 +x1A ^i +x1A $f +x1A C ^t +^* x1A +x19 Z4 Y5 +x19 z3 +x19 z2 t +x19 z2 +x19 y3 y5 +x19 t z2 +x19 { q +x19 C z3 +^* x19 +x18 Z3 y2 +x18 y3 y3 +x18 y2 Z3 +x18 x14 +x18 $T $6 +x18 i4( +x18 C z4 +x17 z5 t +x17 z4 t +x17 z3 +x17 z1 t +x17 Y2 Y2 +x17 t z5 +x17 t z4 +x17 t z1 +x17 t r +x17 r t +x17 p4 { +x17 { p4 +x17 p2 o83 +x17 p1 o7@ +x17 o5x *73 +x17 k ^' +x17 k +x17 C z5 +x17 *73 o5x +x17 ^0 k +$_ x17 $0 +x16 $! Z3 +^$ x16 z2 +x16 Y3 ,6 +x16 ^r +x16 ^q y3 +x16 ^p +x16 d +5 +x16 ^d +x16 C z5 +x16 C $* +x16 $* C +$! x16 -4 +x16 { +^x *16 +^# x16 +x15 $ Z5 +x15 Y4 +x15 y4 +x15 Y2 C +x15 y2 +x15 x65 +x15 T0 p2 +x15 t { +x15 { t +x15 s*) D6 +x15 s2* C +x15 p4 $5 +x15 o45 *30 +x15 o2- +x15 i3@ +$) x15 i3( +[ x15 i2. +x15 ^i +x15 $# ^H +x15 ^H $# +x15 f *26 +x15 D6 s*) +x15 d +6 +x15 d -3 +^x *15 $d +x15 C z1 +x15 C Y2 +x15 C s2* +x15 c +x15 *30 o45 +x15 *15 Z3 +x15 *12 +[ x15 +^* x15 +x14 z3 Y2 +x14 ^z +x14 Y5 ^J +x14 Y4 u +x14 y4 $L +^* x14 Y4 +x14 Y2 z3 +x14 Y2 k +x14 Y2 f +x14 Y2 c +x14 y2 ] +x14 ] y2 +x14 y1 $3 +x14 x15 +x14 u Y4 +x14 $U i3o +x14 ssl +$! x14 slg +x14 R3 q +x14 R2 K +x14 ^r +x14 q *56 +x14 p4 l +x14 p2 o5! +x14 p2 $, +x14 ^P +x14 o83 +x14 o75 +x14 o45 +2 +x14 o3v Y5 +x14 o3l +x14 o1u +x14 $L y4 +x14 l p4 +x14 k Y2 +x14 K R2 +x14 ^J Y5 +x14 ^j +x14 i41 ^Y +x14 i3o $U +x14 i18 +x14 ^h +x14 ^g $4 +x14 ^e +x14 d o7, +x14 d *97 +x14 D2 o2H +x14 c Y2 +x14 $c +x14 $9 +x14 $4 ^g +x14 $3 y1 +x14 -3 +x14 +2 o45 +x14 ^2 ^5 +x14 $1 +[ x14 +^$ x14 +x13 z5 z3 +x13 z5 t +x13 z3 z5 +x13 z2 Z1 +x13 z2 Y1 +x13 Z1 z2 +x13 y5 o0J +x13 y4 o25 +x13 Y3 t +x13 Y3 D4 +x13 y3 $5 +x13 y3 +x13 y2 i8n +x13 y2 d +x13 Y1 z2 +$' x13 Y1 +x13 u *30 +x13 t z5 +x13 t Y3 +x13 T6 .0 +x13 T0 i31 +$% x13 T0 +x13 s-l +x13 sfH +x13 r p1 +x13 R0 ] +x13 ] R0 +x13 q z5 +x13 $q +x13 p1 r +x13 o3x +x13 o3l +x13 o37 +x13 o2b +x13 o21 +x13 o0t ^r +x13 o0g +x13 o0C +x13 ^m +x13 k -6 +x13 k +x13 ^j +x13 i6o +x13 i5p +x13 i3v +x13 i3l +x13 i31 T0 +x13 i3_ +x13 i2q +x13 i2, f +x13 i2D o5+ +x13 i1T +x13 ] f +x13 D4 Y3 +x13 -6 k +x13 $5 y3 +x13 *54 +x13 *46 +x13 *32 ^! +x13 *30 u +x13 *30 +x13 .0 ^U +x13 .0 T6 +x13 $0 +x13 .0 +x13 $% +x13 $* +x13 $. +x13 ^' +x12 Z3 +x12 z2 t +x12 z2 *25 +$$ x12 Z2 +x12 Z1 ^x +x12 ^z +x12 y3 ^k +x12 y3 .6 +x12 y3 +x12 y2 *64 +x12 y2 *10 +} x12 Y2 +x12 y1 i0z +x12 Y1 +x12 ^x Z1 +x12 $X Y1 +x12 x51 *24 +x12 x24 p2 +x12 x21 z2 +x12 ^W +x12 t z2 +x12 t D0 +x12 t +$* x12 t +x12 suc +x12 srW +x12 snc +x12 sln +x12 s74 +x12 s5L +x12 $s +x12 R7 R7 +x12 ^R +x12 p5 ^w +x12 p3 x08 +x12 p3 $# +x12 p1 *B9 +x12 p1 +x12 o95 +x12 o5O +x12 o3- +x12 o2f +$! x12 o1S +x12 o0x K +x12 ^l +x12 K o0x +} x12 i6r +x12 i5w +x12 i5b +x12 i5- +x12 i4k +x12 i4@ +x12 i3y +x12 i3l +x12 i3k +x12 i2R y5 +x12 i2C $? +x12 $? i2C +x12 i2a y3 +x12 i2) +$/ x12 i0/ +x12 f x62 +x12 E x41 +x12 ^E +x12 d x05 +x12 d +A +x12 D0 t +x12 C z3 +x12 $c +x12 ^B +x12 $b +x12 $a $, +x12 ,7 -6 +x12 +7 +x12 *46 d +x12 *40 ^m +x12 *32 y1 +x12 ^2 .6 +x12 *24 x51 +x12 *16 i3n +x12 -1 +x12 ^0 +x12 $+ +x12 $. +x12 } ^# +$< x12 $> +$< $> x12 +^x .1 *03 +^x $1 +^+ ^x -1 +$X -0 Y5 +$X +0 E +x0B K +x0B ] +x0A z4 +x0A x31 +x0A p2 x02 +x0A p2 +x0A D6 +x0A } +^( x0A +x09 p5 +x09 ^6 +x09 +0 +x09 $} +x09 ^* +x08 y2 C +x08 y1 +x08 p1 +x08 C $* +x08 $* C +x08 $2 +x08 $1 +x08 ,1 +x08 } +$ x08 +x07 Z3 q +x07 Y4 +x07 Y3 q +x07 Y2 +x07 x93 +x07 x6B +x07 x36 +x07 -0 +x07 } +x07 { +x06 z4 +x06 z2 u +x06 z1 +x06 Y3 q +x06 Y2 y2 +x06 y2 Y2 +x06 Y1 +x06 u z2 +x06 r p2 +x06 q Z3 +x06 q *19 +x06 p3 *45 +x06 p2 r +x06 L1 +x06 k p2 +x06 ^K +x06 ^i +x06 d +x06 C +x06 $a Z4 +x06 $4 +x06 +3 Y5 +x06 $2 +[ x06 $2 +x06 *10 +x06 $* +x06 $@ +x05 z2 *42 +x05 Z1 y5 +x05 $z +x05 y5 Z1 +x05 y5 x43 +x05 y5 *97 +x05 y5 +8 +x05 y4 [ +x05 y3 +x05 y2 D6 +x05 Y1 +{ x05 Y1 +x05 x21 u +x05 x12 +x05 u x21 +$* x05 u +] x05 u +x05 s1+ +x05 q +x05 p4 k +{ x05 p4 +x05 ^. o7. +x05 o35 +x05 o2v +x05 i5% +x05 i3n +x05 i3. +x05 i1u +x05 i19 +x05 ^h +} x05 $h +x05 f *20 +x05 E $0 +x05 $e +x05 d Y1 +x05 d c +x05 C z3 +x05 C z2 +{ x05 C +x05 $5 +x05 ^5 +x05 '3 +x05 $2 +x05 .2 +x05 $0 E +x05 $* +x05 [ +x04 Z4 Z4 +x04 Z4 q +x04 Z4 -5 +x04 Z3 +$x *04 Z2 +x04 z1 ^o +x04 Y5 Y1 +x04 y4 i4, +x04 y3 +x04 y2 +2 +x04 ^X t +x04 x72 +$. x04 $w +x04 u $* +x04 $* u +x04 u +x04 t +2 +x04 ss1 c +x04 $/ q +$/ x04 q +x04 p5 +x04 p2 DB +x04 p2 ] +x04 p1 o11 +x04 $_ ^P +x04 ^P $_ +x04 o57 *24 +x04 o4 +x04 o38 +x04 o0x y2 +x04 o01 +x04 ^N $4 +x04 ^M +x04 $L +x04 iA2 +x04 i6. +x04 i4$ +$% x04 i4$ +x04 i3k +x04 i2y t +x04 i1t +x04 i0Y +x04 i0j R2 +x04 i0B $5 +x04 D6 +x04 c ss1 +x04 ^c +x04 ^B +x04 $a +x04 +7 +x04 *65 *64 +x04 -6 +x04 $5 i0B +x04 ^5 +x04 $4 Y4 +x04 $4 ^N +x04 +2 t +x04 *24 o57 +x04 *23 +x04 '2 +x04 $0 Y1 +$. x04 $0 +x04 $* +x04 $@ +x04 $! +x04 ] ] +$$ x04 +^/ x04 +x03 Z5 t +x03 z3 ^G +x03 Z2 i2h +x03 z2 i2b +x03 z2 +x03 Z1 ^m +x03 y5 Y1 +x03 Y5 i6e +x03 Y4 Y4 +x03 y4 *56 +x03 y3 y3 +x03 y3 y2 +x03 y3 k +x03 y3 .1 +x03 Y3 +x03 Y2 y5 +x03 Y2 +x03 Y1 y5 +x03 x93 +x03 x32 +x03 x12 +x03 $W +x03 ^V *23 +x03 ^u ^z +x03 u R5 +x03 u i22 +x03 t Z5 +x03 t k +x03 t *30 +x03 t '3 +x03 t *13 +x03 $s L6 +^) x03 se. +x03 ^s +x03 R5 u +x03 q o8f +x03 q +x03 p2 C +x03 p1 Y1 +x03 p1 $h +x03 ^P ^! +x03 o7k i7o +x03 o6M E +x03 o55 +x03 o4c p1 +x03 o44 ^A +x03 o2e +x03 o1s p4 +x03 o0z +x03 ^o +x03 $N +x03 ^N +x03 ^m Z1 +x03 L6 $s +x03 k t +x03 K ^d +x03 K +5 +x03 ^j o6e +x03 i55 +x03 i5 +x03 i4q i4h +x03 i4h +x03 i3v -3 +x03 i3b +x03 i36 +x03 i2- y2 +x03 i2- i22 +x03 i2h Z2 +x03 i2b +x03 i22 u +x03 i2. +x03 i1j +x03 i1- +x03 ^g $c +$+ x03 E +x03 ^d K +x03 d $h +x03 d +B +x03 d '9 +x03 D6 +x03 D4 $@ +x03 $@ D4 +x03 ^d -1 +x03 d +0 +x03 ^d +x03 d +x03 c y2 +x03 C p2 +x03 $c ^g +x03 $c +x03 c +x03 'B +x03 *73 *48 +x03 +5 K +x03 *48 *73 +x03 '3 t +x03 *30 t +x03 $! -3 +x03 -3 $! +x03 ^2 y1 +x03 *23 +x03 *13 t +^x *03 .1 +x03 *04 +x03 $? +$* x03 +$. x03 +$> x03 +} x03 +x02 z4 t +x02 Z3 *40 +x02 z3 +x02 z2 t +x02 Z2 +x02 Z1 $! +^_ x02 $z +x02 y3 u +x02 y3 c +x02 Y3 $/ +x02 Y2 Y3 +x02 Y2 i0h +x02 y2 D5 +x02 Y1 y1 +x02 y1 Y1 +x02 Y1 *34 +$' x02 Y1 +x02 x83 +x02 x62 Y3 +x02 x16 +x02 $V Z1 +x02 u y3 +x02 $u +x02 t z4 +x02 t z2 +x02 sxF $. +x02 $. sxF +x02 srp +x02 soa +x02 scs +x02 s27 +x02 s1+ +x02 ^/ r +] x02 q +x02 p1 $W +x02 ^p +x02 o8o x71 +x02 o5z +x02 o51 +x02 o5@ +x02 o32 i6a +x02 o2z +x02 o1. z4 +x02 o1y +x02 o1s +x02 o1e ^M +x02 o13 +x02 o0d $9 +x02 } $o +x02 k $k +x02 $k k +x02 ^k +x02 i6a o32 +x02 i64 +x02 i6* +x02 i6$ +x02 i51 +x02 i50 +x02 i4n +x02 i4J l +x02 i4h +x02 i48 +x02 i3s +x02 i3n +x02 i3- i3- +x02 i33 +x02 i3@ +x02 i2o +x02 i1v +x02 i1u i2T +x02 i1u +x02 i1l +x02 i1a +x02 i0K +x02 i0h Y2 +x02 E +x02 d x04 +x02 DB +x02 D5 *10 +x02 d -5 +x02 D4 +x02 ^d +x02 c +x02 'B +x02 *AB +x02 $9 o0d +x02 $8 +x02 -8 +x02 .6 +x02 -6 +x02 +5 Y4 +x02 *53 i1w +x02 *45 +x02 *43 +} x02 *42 +x02 *41 *27 +x02 *40 Z3 +x02 *40 +x02 { *35 +x02 *34 Y1 +x02 $3 +x02 ,3 +x02 *27 *41 +x02 *15 .0 +x02 *10 D5 +x02 -1 +x02 $% ^@ +x02 $- +x02 ^@ $% +x01 z3 o2l +x01 Z2 $D +x01 Y5 +9 +x01 Y4 Y4 +x01 y4 i8@ +x01 y4 [ +x01 y2 u +x01 x82 +x01 x61 $@ +x01 $@ x61 +x01 x56 +x01 x51 *35 +$x *01 x51 +x01 x42 +x01 $x +x01 u y2 +$- x01 t +x01 sad +x01 r D5 +x01 R2 $d +x01 r +x01 p2 $* +x01 p2 ] +x01 o7* E +x01 o7! +x01 o6p +x01 o6+ +x01 o4S $. +x01 $. o4S +x01 o3X +x01 o2v +x01 o1i p1 +x01 k $! +x01 $! k +x01 ^J *86 +$@ x01 i71 +x01 i65 +x01 i6! +x01 i54 +x01 i5% +x01 i4v +x01 i4e +x01 ^f $b +x01 E y3 +x01 E o7* +x01 E D2 +x01 $d R2 +x01 $D r +x01 d ,6 +x01 D3 r +x01 D3 [ +x01 D2 E +x01 $d +x01 $b ^f +x01 $a +x01 -7 -2 +x01 *6A x43 +x01 *41 +x01 -2 -7 +x01 $- +x01 } +^x $0 +$X $$ +} $X +^X $! +$x $+ +$x { +$# ^x +} $x +{ $x +^x $* +^x $/ +^x $? +^% ^x +^* $x +$w Z5 -5 +^w z4 +^W z3 +$w Z2 z1 +$w Z2 x84 +$w Z2 t +$W Z2 E +] ^W z2 +$w z1 Z2 +^w z1 x73 +^W z1 x62 +^W Z1 o5g +^W z1 +^w $z +$W Y5 xA3 +^w Y5 x51 +^w y5 x32 +^W Y5 x12 +$W $y *53 +$w Y5 +$W y4 +$w Y3 t +$W y2 z5 +$w y2 o9A +^w y2 o2t +^w y2 ,9 +$w Y1 x51 +^W y1 u +^W Y1 ^Q +$w x84 Z2 +^w x72 T0 +^w x65 y1 +$w x64 $u +$w x63 +^w x63 +$w x51 Y1 +^W x46 y2 +^W x43 ,2 +$w x42 +^W x34 +^w x31 +^w x23 +^W x12 Y5 +$. $w x04 +$W $W +{ $W $w +$w ^v +^W u y1 +$w $u x64 +^w u D7 +^W ^U +$w t Z2 +$w t Y3 +^w t $8 +^W T6 +^w T0 x72 +^w sli *25 +^w ^s LA +$W sig [ +$W [ sig +$w $s E +$w s9. +$w $s -8 +^W s5o +^W s1S *50 +$W s10 +$W $S +^W ^S +^w r +$w $q Z1 +^W ^Q Y1 +^W q q +^W ^Q +$w $P Y2 +^W ^P l +$w p1 *85 +$w $p +^w $* o9l +^w o93 +$w o8m +^w o89 +^w o73 +^W o6W +^w o6s +$w o5y +^W o5g Z1 +$w o4Y +^W o4t +^w o4@ ^I +$w o43 +$w o3b +$W o2y +^w o2w +$w o2p +^W o2G +^w o27 +$w o1q +^W o1k +^W o1i +$W o15 +$w o0f +$w $n *65 +$w $n +^W $m +^w L9 +$w L2 +$W $l +^W ^K +^w ^K +$W i9Q +^w i90 +$w i8M E +$W i8E r +$W i8e +$w i7f +$W i74 +^W i73 +$w i6i +$W i65 +^w i5y +$w i5A +$w i52 +$w i4w +^w i4c +$W i40 +$w i3y +^w i3w +$w i3p *53 +$w i3p +^W i2s +$w i2k +^W i2F +^w i2f +$W i2e +^w i2d +^W i1S +^w i1i +^W i1G +$w i0o ^z +^w i0N +^W i0M +$W i0j +^w i0h +^W i0E +^W i0C +^w i05 o24 +^W ^G +$w $G +$W E Z2 +$W E T4 +$W $e t +$w E $s +^W ^D i0S +^w d E +^W D8 i1C +^w D7 u +^w D7 +$W D6 +$w D5 +} $w D5 +$w D3 +^w D3 } +$w D2 +^w D2 +$w $d +^w c ^F +^w c $3 +$W $C +$w $c +$w ^c +^W ^B +^w ^a ^M +$w ^A +^w +A +^w $A +$w ^a +^w $8 t +$w -8 $s +$W ^8 ^8 +$W ^8 +^w +8 ] +^w ] +8 +^W .7 ,6 +^w *76 +$w *70 *52 +$W ,7 +^w +7 +^W ,6 .7 +$w *65 $n +$w *64 +$W +6 +^W ,6 +$w -5 Z5 +$w +5 ^j +$W *57 +$w *54 D4 +$W *53 $y +$w *52 *70 +^W *50 s1S +$w ^5 +$w +4 +^w $3 c +^w *3A ,A +$w *36 ^l +$w ,3 +$w ^3 +^w -3 +^w ^3 +^W ,2 x43 +^w *28 +^w *25 sli +^w *20 +^W $2 +^w -2 +^w ^2 +^W ,1 +^W ^1 +$w *01 ^5 +$W -0 +$W $$ +} ^W +[ $W +^W $# +$w { { +$# $w +$/ ^w +$_ $w +$^ ^w +{ $w +[ $w +^w } } +^w ^( +^w ^/ +^@ ^w +^V z5 u +$v Z4 +$v Z3 +$v Z2 x74 +$V Z2 +^v Z2 +^' $v Z2 +^V z1 $N +$v Z1 d +$- $v Z1 +$v y5 u +^v Y4 +^V y2 y5 +^V y2 +$v $. Y2 +$v y2 +$v Y1 D5 +$v $y +$V xB4 +$V x72 +^v x63 i0S +$v x63 +^v x42 +$v x34 +$v x32 $r +^v x25 +^V x23 y2 +^V x15 ^A +^v $v *31 +$V $v +^V ^v +^V u z5 +$v u y5 +^v u i0D +$V u +[ $V u +$V $t u +^V ^t ^m +^v T3 +^v ^T +$v ^t +$v syb +$V shs +$v sbr +$v s.8 +[ ^V s57 +^v s53 +$v ^S +^v ^S +$v $r x32 +$v $r +^v ^Q +^@ ^v p5 +$v ^p +^v ^p +$v o9s +$V o8P x52 +$V o77 +$v o6p +$v o6- +$v o5q +$v o5g +$v o4Z +$v o4b +$v o4+ +^v o4 +^V o3t l +$v o3p +^v o3, D8 +^v o3- *20 +^V o3. +^v o21 +^v o2@ +^V o1w p3 +$v o1v +^V o1P +$V o0M +$v o0A +^v ^O +$v $o +^v ^o +^V $N z1 +$V $M +^V ^M +^v ^M +^V l o3t +$v L7 +^v L0 z2 +$V $L +^v $l +^V K i1- +$v k D5 +^V $K +$v ^K +^v ^k +^v ^j +^V i9@ +$v i8y +$v i7_ +$v i6x *30 +^V i6/ +^v i5% x23 +^v i5m +^v i5h r +^v i4n +{ ^V i4c +$v i4 +^v i3r +$v i3q +$v i3n +$v i3m +^V i1- K +^V i1. +^V i0P +^v i0D u +$v i0D +^v i0C +^v i0a +^v ^E ,8 +^v D8 o3, +^v D8 *52 +^v D7 +^V D6 +^v D6 +$v D5 Y1 +$v D5 k +$v D4 +$v D3 +} $v D3 +^v D3 +$v $c +8 +$v $c +^v { $b +^v ^b +^v $a +$v *97 +$v *95 +^v *90 +8 +^v +8 *90 +$V *82 Y1 +$v *82 +^V $7 +^V -7 +^v *63 Z1 +^v *52 D8 +$v $5 +^v $4 +^v *34 +^v *31 $v +^v *31 +$v *30 i6x +^v ^2 x24 +^v *20 o3- +^v ^2 +$v ^1 +^v *06 +^v *05 +$v *02 +$v $0 +$_ $V +^- ^V +^_ ^V +$v { +$# ^v +$@ $v +$] ^v +$. ^v +} ^v +^v $) +^v $- +^v } +u $Z Z5 +u ^Z ^X +u Z5 Z5 +u Z5 x71 +u z5 sIA +u Z5 s2q +u Z5 o2Z +u Z5 i6I +u Z5 D7 +u Z5 ,9 +u Z5 *64 +u Z5 +5 +] u Z5 +u z5 +u z4 z2 +u z4 y2 +u Z4 ^V +u Z3 x83 +u Z3 x23 +$u Z3 ^v +u Z3 s80 +u Z3 s*0 +u Z3 $s +$u Z3 D8 +u $* Z3 +u ] Z3 +u z2 z4 +u z2 o1J +u Z2 .2 +u z2 -0 +$U Z2 +$# u Z2 +u z2 +u Z1 Y5 +u Z1 $Y +u Z1 x31 +$u Z1 iA. +$U z1 ,5 +u Z1 -1 +u Z1 +$u Z1 +$& u Z1 +{ u Z1 +^u $z +^u ^Y y2 +u $Y $C +u y5 x92 +u Y5 x84 +u y5 $w +u Y5 o1t +u Y5 i9T +u Y5 i7S +u y5 *8A +u y5 *09 +] u Y5 +u y4 $t +^U y4 l +u y4 $C +u Y4 *87 +u Y4 +6 +u Y4 ,3 +u Y4 $. +u Y3 x52 +u Y3 ,8 +u Y3 ,7 +u Y3 *02 +$u Y3 +u Y2 Y2 +$u Y2 Y2 +u y2 x47 +$u Y2 t +u Y2 o8g +u Y2 i9. +u Y2 D0 +^u y2 ^c +u Y2 ,B +u y2 *51 +u Y2 *30 +u Y2 { +$u Y2 +u [ y2 +u y2 +u Y1 i27 +u Y1 $d +u y1 ^8 +u y1 *41 +^U Y1 +^U $y +u ^X z4 +u $X x42 +^u xA5 +u x83 Z3 +$u x82 +^U x81 smC +u x71 Z5 +u x71 +^u x71 +u x65 $I +u x64 Y4 +u x64 t +u x63 t +u x62 $J +^u x62 D3 +u x61 $J +u x61 $j +^u x54 ^K +u x53 $M +] u x53 +u x52 ] +u ] x52 +u x51 $4 +$u x51 +$* u x51 +u x45 +u x43 t +u x43 d +u x42 $X +u x42 +u x35 y3 +u x35 t +u x32 k +^U x32 +u x32 +u x31 Z1 +^u x31 t +u x31 o0W +u x24 t +u x24 d +[ u x24 +^u x24 +u x23 Z3 +u x23 i5? +u x21 k +u x14 y2 +$* u x05 +] u x05 +u x04 ^G +u $X +u ^- ^X +$u $x +u $w y5 +$U ^W +u ^V Z4 +$u ^v Z3 +^U ^V K +^U ^V +[ u $V +u $U i7F +^u u $2 +$U ^u +u $t y4 +$u t Y2 +u t x64 +u t x63 +u ^t x52 +u t x43 +u t x35 +^u t x31 +u t x24 +$U $t o6f +$U t K +u T8 $! +u $! T8 +u T7 T2 +u T6 -4 +^U T6 +u ^T ,6 +^U T5 o1P +u T3 $7 +^U T3 +u T2 T7 +$U ^T +u $T +$u ^T +u ^t +$' u t +u sZB +^U sy7 +u sTD +u sSV $O +u sR* +u sOo $. +u $. sOo +$U so0 +u sO* +u sNn +u sNM +^U smC x81 +u sLT ] +u ] sLT +u sIU +u sIA z5 +u sHW +u s H +u sEz +u sCP DA +u s80 Z3 +u s7! i3" +u s3D +5 +u s2q Z5 +u s1l +u s*0 Z3 +^U $S +u $S +u $s +u ^R z4 +u $r Z2 +$u $r *45 +u R0 z1 +$u $R +] u $R +u r +} $u r +^@ $u p4 +u p3 xAB +u p2 x62 +u p2 x4A +u p2 x2A +u p2 x06 +u p2 +u p1 x23 +^u p1 x05 +u p1 $X +u p1 o2J +u p1 ^L +u p1 $J +u p1 i6S +u p1 i64 +u p1 +B +u p1 ^. +$u p1 $_ +u $O sSV +u $o i1o +$u oAy +^U oAu +u oAN +] u o9F +u o9C +^u o9c +u o8v +$u o88 o3D +^U o82 +u o7M +^U o7i +u o7A *63 +u o78 o1t +u o73 x41 +u o6Z +u o6Y +u o6U K +$U o6+ r +u o6% o39 +u o6I +$U o6f $t +u o67 p1 +^U o6@ +u o6 +] u o5W +u o5t +u o5S ] +u ] o5S +u o56 .6 +^u o54 +^u o53 +$U [ o4T +u o4S +^U o4m +u o4f *46 +u o4_ D0 +u o46 *43 +u o3W +$u o3D o88 +u o39 o6% +u o3- +u o2Z Z5 +u o2T *97 +u o2S +u o2F ,1 +u o1t Y5 +u o1t o78 +^U o1P T5 +^U o1P +$u o1f *17 +$U o1b *70 +u o0W x31 +u o0W -7 +$u o0p +u o0l +u o0G +u o0g $* +u $* o0g +^U ^O +u $N +^u ^n +^u ^m z1 +u $M x53 +u ^M $1 +u $l Z1 +^U l y4 +^u l ^L +^u l i5g +$u L6 +u L5 Y2 +^u L0 r +$u ^L +u k x32 +u k x21 +^U K ^V +$U K t +u K o6U +^U k i5r +u K *A8 +u K *86 +^u k *6A +u K ,5 +$U $K +^U $K +] ^u K +$u $k +} u k +u $j Z5 +u $J x62 +u $J x61 +u $j x61 +u $J $F +u $I x65 +$U $i E +u iBY +u iBD +u iAR +u iAn +u i9. Y2 +u i8F +u i89 x12 +u i7T +u i7N +u i7j +u i7F $U +u $I .7 +u i6T +u i6p +u i6n +u i6I Z5 +u i6I +$U i6F +u i6= $d +$u i6A +u i6? [ +u i6 +u i5T +^U i5r k +^u i5n *01 +^U i5m +^u i5g l +u i5A D2 +u i5/ +u i4Y +^U i4d +u i4c +u i4_ -2 +{ u i3Y +u i3x ,4 +u i3" s7! +^u i3l +u i3I +u i3B +^u i3a +$u i2z +$U i2w +u i2E o72 +u { i29 +u i27 Y1 +^U i1Y +^U i1T +^U i1r +u i1o $o +u i1K +u i0X z2 +^u i0t *46 +u i0R $a +u i0$ r +u i0H x13 +^U i0E ^T +^u i0a +^U i0# } +$U ^i +$u $i +] $u $i +u ^H z5 +u $H ,7 +$U $H +u $h +$u $h +^u ^g o2y +u f x6B +u ^F i0D +u f -6 +u f *56 +^U ^F +u $E Z2 +$U E T4 +u ^e i1d +$U E $i +u [ ^E +$u E +$u $e +^u ^e +u d x96 +u d x93 +u d x52 +u d x13 +u d $X +$u d $U +u d o8K +u d o56 +u d o55 +u d o41 +u d $J +u d iA$ +u d i70 +u d i60 +u $d i6= +u d ,B +u DA sCP +u d $A +u d .9 +u D8 i3O +u D7 Z5 +^u D7 i1n +u d -7 +u D6 +5 +u d +6 +u D5 D1 +[ u D5 +u D3 z4 +u D0 Y2 +$U d +u $C y4 +$u c $b +$u $c +u ^b ^x +$u $b c +u *B9 *B7 +^u ^B *12 +u ^B ,1 +^U $B +^u $b +u ^A z1 +u 'A $T +u $a i0R +u .A 'B +u $A +8 +u $a *67 +$u $a *14 +^U +A +u +A +u ^a +$u ^a +^u $a +u ,9 Z5 +u +9 Z2 +u *97 o2T +^U ^9 +u +9 ] +u $9 +u ] +9 +] u ,9 +u +8 $A +u *86 K +u -7 x41 +u $7 T3 +u -7 o0W +u .7 $I +u ,7 $H +^u ,7 ^f +u -7 d +u *79 Y4 +u *76 +u *75 Y2 +u +7 *36 +u +7 -3 +$U *70 o1b +u *70 *58 +} u ^7 +u '6 Y3 +u -6 Y3 +u .6 o56 +u +6 D4 +^u *6A k +u *67 $a +u *64 Z5 +u *64 *45 +u *63 o7A +u -6 +^u -6 +u +5 Z5 +u ,5 ^T +u +5 s3D +u ^5 r +u ,5 K +u +5 D6 +u ,5 *95 +u *58 *70 +u *56 +u +5 *45 +u *52 +4 +u *51 -2 +u +5 +0 +[ u *50 +^U $5 +u -5 +u +4 y4 +u ,4 Y3 +u $4 x51 +u -4 T6 +u ^4 i6n +u *4A x52 +u *46 .3 +$u *45 $r +u +4 *52 +^u -4 *39 +u *41 { +u *40 ,5 +u -4 *02 +u [ +4 +^u ^4 +u ,3 Y4 +u ,3 o2A +^u *39 -4 +u -3 +7 +u *36 +7 +$# u *35 +[ u *34 +u *32 -0 +u *30 Y2 +u ^2 z5 +u .2 Z2 +^u $2 u +u -2 i4_ +u *26 *13 +$u *26 +u -2 *51 +^u *24 $1 +u -2 *15 +^U $2 +u +2 ] +u $2 +u ] +2 +u -1 Z1 +u +1 p3 +u ,1 o2F +u $1 ^M +u ^1 ^C +u *17 +$u *16 .6 +u *15 -2 +u *14 i2y +$u *14 $a +u *14 +u *13 f +u *13 *26 +^u $1 *24 +^u -1 +u ^0 z4 +u +0 y3 +u +0 y2 +u +0 +5 +u *03 z5 +u -0 *32 +u *02 Y3 +u *02 -4 +$u *02 +^u *01 i5n +u .0 *02 +$u .0 { +$# ^U +^U $+ +^# ^U +u ] +u ^" ^" +$& $u +$* u $^ +$* $^ u +$; ^u +$- $u +} $u +{ u +^u $? +^u $! +^u } +^* u { +^* { u +^$ ^u +^- ^u +t $Z Z5 +t ^Z t +t z5 x87 +t Z5 s9k +t z4 y2 +$t Z4 Y1 +t z4 sBV +t z4 o2@ +t Z4 i86 +$_ t Z4 +^t Z3 z2 +t Z3 +t z3 ] +t ] z3 +^t z2 Z3 +$t Z2 z1 +t Z2 x61 +t Z2 sHw +t Z2 o7P +$t Z2 ^H +t Z2 $E +^t Z2 *68 +^T z2 +$t z1 Z2 +$t Z1 y4 +^t Z1 ^w +t Z1 T1 +t Z1 .6 +t z1 +2 +t Z1 +^! t z1 +[ t ^Z +t $z +t ^Y i0m +t Y5 Z1 +t y5 x83 +t y5 x69 +t Y5 x18 +t y5 T5 +t y5 K +t y5 $k +t y5 i56 +$T y5 E +t y5 +A +t y5 *90 +t Y5 +1 +t ] Y5 +t y5 +$t y5 +^t y5 +$t y4 Z1 +t Y4 xB2 +t y4 x65 +t Y4 x02 +t y4 $X +t y4 s27 +t Y4 o5M +t Y4 ^O +t Y4 i0O +t Y4 ^C +t Y4 +2 +^t y4 +^t Y3 y2 +t Y3 x82 +t Y3 x62 +t Y3 ^S +^t y3 D5 +t Y3 *45 +t y3 *34 +^t y2 Y3 +t y2 r +t y2 *36 +$t Y2 +$t y2 +$t Y1 Z4 +t Y1 xB1 +t Y1 x42 +t Y1 i4W +^T y1 i1M +^t Y1 i1b +t Y1 $E +t y1 $E +t Y1 .6 +^t y1 +3 +$T $Y +1 +$% t Y1 +$- t Y1 +} ^t $Y +$t ^y +t $X y4 +t xB4 +t xB1 Y1 +$t xA2 $u +t x98 +t x94 +t x92 Y4 +] t x92 +t x91 *69 +t x87 +t x82 Y3 +t x82 o6P +^t x82 ,2 +t x81 x52 +t x81 $I +t x81 .A +t x72 D0 +$t x72 +t x63 x12 +^T x63 +t x61 Z2 +t x53 d +t x52 $I +^T x51 +$t x51 +t x42 Y1 +t x41 o1y +t x41 $l +$t x41 l +$T x41 +t x41 +t x32 y4 +t x31 $P +t x31 -4 +t x27 ^S +t x24 p4 +^T x24 *21 +$+ t x23 +^t x23 +t x16 o2? +t x13 z2 +^t x13 i1e +t x12 +$* t x12 +t x02 Y4 +$- t x01 +^T ^x +$t ^X +^t $x +t $W Z5 +^t ^w Z1 +^T ^w +t $v Z5 +^t $V +$t ^v +$t $u xA2 +^T u .7 +^T ^U +^t ^u +] t TB +t [ T9 +] t T9 +t T8 -3 +t T7 T6 +t T7 +t T6 T7 +$T T6 +] t T6 +t T5 $L +t T5 ] +t ] T5 +t T4 { +t T1 Z1 +^T $T +t sZP +t ^S Y3 +t sUO +^t stg +t sSU +^t ssf *01 +^t ss6 +t sRD +t sOZ +^T ^S $M +t sLJ $! +t $! sLJ +t sHw Z2 +t shW +t sG5 +t sES +t sdm o5. +t sCc +$T sC1 +t sBV z4 +^T sae +t s9k Z5 +t s7z +^T s@6 +t s 6 +{ t s6* +$T s4 i8t +t ^S .4 +t s3# +t s27 y4 +t s25 +t s1I +t s17 +t s1) +^T ^s +t $! ^s +t ^s $! +$t $s +^T r Z2 +$t r p2 +^T r c +$t r .7 +t R6 t +$t R6 *A6 +{ t R4 +{ t R3 +t R1 i1o +} t R0 +$t ^q o8 +t $Q +$t $q +$t q +t ^P z4 +t $P x31 +t $P o1U +t $p +6 +t p3 xAB +t p3 x9B +t p3 '9 +t p2 xA7 +t p2 xA4 +t p2 x86 +t p2 x75 +$t p2 r +t p1 x42 +t p1 x15 +t p1 $W +t p1 iA_ +t p1 i61 +t p1 i5S +t p1 i3# +t p1 $B +t p1 *83 +t p1 .4 +$T $P +^T $P +$t $p +^t $p +^t ^p +t ^O Y4 +t $o p5 +t $O i8W +t oBy x26 +t oAK x52 +t oAG +t } oAa +t o9Z +^t o9S +t o9r +$t o9p +$t o9m +t o9K -9 +t o9a +t o94 +$T o8J +$t o8e +t o7U +^t o7t E +t o7n p4 +t $O ,7 +$& t o7( +^] t o7} +t o6s i6f +t o6P x82 +^t o6n +t o6E o4O +^t o6d +^T o6c +^t o69 +[ t o68 +^T o6@ +t o5Y +t o5. sdm +t o5N +$t o5n +t o5h Y3 +^t o5h +^t o5e +t o5c +t o58 +^t o58 +t o56 +t o54 +t o52 $C +t o5( +[ t o5- +^T o4t +t o4O o6E +t o4L +t o4K p1 +t o42 +t o4 +^T o3y +^t o3w .5 +^t o3s *02 +t o3N +^T o3m +t o3G D1 +^T o3G +t o3F +t o36 +t o33 +] t o30 +t o3# $# +t $# o3# +^t o3@ +t o2X +^t o2w +^t o2s +t o2N +t o2k +5 +^t o2i +t o2D y3 +t o2A i6R +t o23 +t o22 *73 +t o2 -0 +t o2_ +t o1y x41 +t o1X +t o1U $P +t o1l *04 +t o1g +$t o1f +t o1E d +t o1D +t o1B +^T o1- +t $o ^1 +t o0O +^T ^o +t ^O +^T ^n T0 +^T $n +t $n +^T $M ^S +t ^m $1 +$T $m +t $m +t $l Z5 +t $l x41 +$t l x41 +t $L T5 +$t l D4 +$T l ^C +t L9 Z5 +t ^L -8 +$t L7 +$t L6 D2 +^T $L +t K y5 +t $k y5 +$t k D2 +^t k *87 +t K ,8 +t K +5 +^t } ^K +^t K +t k { +t ^j $9 +^T $j +t ^j +^t $i Y2 +t $I x81 +t $I x52 +t iA. +t iA +t i9. +$T i8t s4 +$t i8r +t i8C +^T i7s +t i7N +^T i7h +t i7G +t i7C +t i7a +$t i73 +^T i7- +t i6_ Y3 +t i6R o2A +$T i6O +^t i6k +t i6C +$t i65 +t i6, +t i6= +^t i5u +t i5T ^8 +t i5S [ +t i5m y5 +^t i5j *37 +t i5E *72 +t i5C +$T i56 x34 +$t i5_ +t i4$ x62 +t i4 x0B +t i4W Y1 +$t i4w +t i4V i6V +t i4N ] +t ] i4N +t i4m y1 +$T i4i +t i4I +t i4D +t i4 C +^t i46 +t i4@ +$t i4& +$t i4. +$t i3w +^t i3s ] +^t ] i3s +t i2Y +t i2T +1 +^t i2s +^T i2F +t i2C +$T i22 +t i2 +t i1z +^t } i1v +^* ^t i1v +^T i1u +^T i1S +$t i1s +^t i1b Y1 +^t i18 +^T i10 +^t i1- +^t i0z +^t i0y +^t i0X +t i0W +^t i0v +t i0O Y4 +^T i0N +^T i0G +t i0d ^5 +t i0a +t $I *05 +$T $i +^T $i +t ^I +$t ^H Z2 +t ^h ^C +t f xA5 +t f *A8 +t ^F -6 +t f -5 +t $E y1 +^t E o7t +t ^E D3 +t $E ,7 +$t $E +t d $Z +t d oBM +t d o31 +$T $D l +t d i61 +t d i60 +t d $B +t $D +A +t d *92 +^T D9 +t d ^7 +t D6 o64 +t d -6 +t D5 d +{ t D5 +$t D4 l +$t D4 i64 +t D3 'A +t D3 $4 +^T D3 +1 +] t D3 +$t D2 k +t D2 i42 +[ t D2 +t D1 +] t D0 +t ^D +t d +t $C Z2 +t ^C Y4 +t $C o52 +t $C ^2 +^t ^C +t $c +$t c +t $b $Z +TB TA +] TB t +TB iB3 +TB i77 +t $b i72 +TB i6s +TB *86 +TB $7 +TB ^6 +TB $5 +TB *20 +TB ^0 +$! TB +] TB +t ^A z3 +t +A x81 +TA o92 p3 +TA o50 +TA i64 +TA i57 +TA D6 ] +TA ] D6 +t +A $D +t $a ^9 +TA $7 +t } *A7 +t +A +6 +t *A6 +t $a *54 +^@ TA +t ] $A +^t 'A +T9 Z5 xA6 +^T +9 Y1 +T9 t T2 +] T9 T8 +T9 T2 t +] T9 t +T9 sT- +T9 p3 $# +T9 oAG +T9 o81 +T9 o3d +T9 k *43 +t $9 ^j +T9 i33 +T9 DB +t '9 D4 +T9 $D +t ^9 $a +T9 $9 +t .9 *8B +T9 *87 +t -9 +8 +T9 *43 k +t *93 .4 +$t *92 +T9 ] ] +^t ,9 +^t ^9 +t $8 Z4 +T8 Z1 t +T8 Y3 +T8 $$ Y1 +} T8 x91 +T8 } x81 +T8 x42 +0 +T8 x41 D4 +T8 t Z1 +] T8 T9 +$* T8 T7 +T8 T4 o2P +T8 T4 +T8 T0 *67 +T8 saA +T8 s38 +T8 R0 ^1 +T8 o78 +T8 o74 +T8 o48 +T8 o2P T4 +T8 o2a +T8 o0K +T8 iA6 +T8 i81 +T8 i55 +T8 i51 +T8 i4t +T8 D7 } +T8 D4 x41 +t *8B .9 +^T *89 i80 +T8 $9 +T8 .9 } +t +8 -9 +^t *87 k +T8 *67 T0 +T8 $5 +T8 ^5 +t -8 $5 +T8 ^4 TA +t *83 *37 +t *83 +T8 +0 x42 +T8 $+ +T8 $@ +T8 ^# +$. T8 +t ,8 +^t ,8 +T7 z1 y3 +T7 z1 t +t -7 y4 +T7 Y3 x62 +T7 x81 +T7 x32 +T7 x13 +T7 x03 +T7 x02 +^T .7 u +T7 t z1 +T7 t K +T7 T8 o5/ +$* T7 T8 +T7 s7& +T7 s58 +T7 o8! +T7 o5/ T8 +T7 o2t +T7 o14 +T7 [ o0J +T7 o05 +t ,7 $O +T7 $L +T7 K t +T7 K ^4 +T7 } i93 +T7 i7N +T7 i21 +T7 } i05 +T7 i0@ +T7 } ^f +t ,7 $E +t $7 $A +T7 .6 *34 +t .7 +6 +] t *76 +T7 } ^5 +T7 ^4 K +t ,7 *45 +T7 $4 +$, T7 $4 +t *73 o22 +T7 *34 .6 +T7 $3 +T7 ^2 +^T -7 *08 +$+ T7 +0 +T7 $- +T7 ^* +$# T7 +$. T7 +t +7 ] +t ] +7 +t ] ,7 +t ,7 ] +$t +7 +$t } +7 +t -6 Z2 +T6 Z1 i6_ +t .6 Z1 +T6 y5 +T6 Y2 x51 +T6 Y2 x23 +T6 Y2 D5 +T6 Y2 *B8 +t ,6 Y2 +T6 y1 i7K +t .6 Y1 +^* T6 x75 +T6 x51 Y2 +T6 x42 +T6 x23 Y2 +T6 x15 i1T +T6 x06 +T6 $u i0n +T6 t T7 +T6 T7 t +T6 T4 +T6 T3 D5 +T6 T2 ] +T6 ] T2 +T6 T1 o0[ +T6 T0 d +T6 T0 +0 +] T6 t +T6 slL +T6 s0K +t +6 $p +T6 o9! +T6 o7T +T6 o72 +T6 o5Z +T6 o23 +T6 o1O +T6 o1i +T6 o1A +T6 o1& +T6 o0[ T1 +T6 o0S +T6 o0P +T6 o0L +t +6 K +T6 i8B +T6 i7L +T6 i7K y1 +T6 i7* +T6 i6_ Z1 +T6 i0n $u +T6 D5 Y2 +T6 D5 T3 +t +6 +A +T6 ,7 +t +6 .7 +t *65 *02 +t *63 *14 +T6 $2 +T6 ^2 +T6 +0 T0 +T6 +0 +T6 $% +T6 $? +] T6 +^T .6 +t -6 +T5 $_ Z5 +] T5 Z5 +T5 $! Z3 +T5 z2 ^4 +T5 Z1 +T5 Y2 *30 +T5 x72 $0 +T5 x63 T0 +^T -5 ^V +T5 T6 ] +T5 ] T6 +T5 T4 T1 +T5 T3 ] +T5 ] T3 +T5 T2 D7 +] T5 T2 +T5 T1 T4 +T5 T0 x63 +T5 T0 +T5 ^T +T5 ssZ +T5 $S o38 +T5 sl! +T5 sgd +T5 seo o3F +T5 sa4 +T5 s13 +T5 s1| +T5 ^S +$$ T5 $r +T5 o99 +T5 o97 +T5 o7u +T5 o6V +T5 o6P +t ^5 o5g +T5 o44 +T5 o40 +^t .5 o3w +T5 o3F seo +T5 o38 $S +T5 o2s +t +5 o2k +T5 o1i +T5 o11 D6 +T5 o10 +T5 o0Y +T5 o0x $4 +T5 o01 +T5 ^L +T5 i8@ +T5 i74 +T5 i72 +T5 i6F +T5 i6. $5 +T5 i6_ +T5 i5G +t ,5 i3B +[ T5 i03 +T5 f x62 +T5 D7 T2 +T5 D6 o11 +T5 D1 -0 +T5 ,A x71 +t *59 +0 +t *58 -3 +t $5 -8 +t *57 p1 +t +5 *75 +t *57 -4 +t *56 x21 +T5 *67 $! +T5 $! *67 +t -5 *65 +t *56 -4 +T5 $5 i6. +T5 $5 +$& T5 ^5 +T5 $4 o0x +t *54 $a +^t *54 +^@ T5 *31 +T5 *30 Y2 +T5 .2 i08 +t .5 *21 +T5 ^2 +t +5 ,2 +t *51 *40 +T5 $0 x72 +T5 -0 D1 +T5 } } +T5 ] +$) T5 $@ +$) $@ T5 +[ T5 +^T ,5 +t $5 +] t ,5 +T4 ^z sRW +T4 Z5 Z5 +T4 } z1 +T4 Y4 ^I +T4 y4 +t +4 Y4 +T4 Y1 $5 +T4 t T3 +T4 T7 +T4 t *50 +T4 T3 t +T4 T0 D2 +T4 $T +T4 sRW ^z +T4 sB3 d +T4 sa4 ] +T4 ] sa4 +T4 s6% } +T4 } s6% +T4 R8 .3 +T4 ^Q z4 +T4 o8! +T4 o7n +T4 } o4U +T4 o3S +T4 o39 +T4 o23 +T4 o21 +T4 o10 +[ T4 o0T +T4 o0E +T4 o0% +t -4 ^N +T4 ^I Y4 +T4 i5 x69 +T4 i5V +T4 i5 +T4 i4 x46 +T4 i4E +T4 i4a +t .4 i4$ +T4 i2t +T4 i27 +T4 i2- +T4 ^E +T4 d sB3 +t $4 D3 +T4 D2 T0 +T4 D2 $* +T4 $* D2 +T4 +A +t -4 ^A +t *49 x17 +T4 *97 +t .4 *93 +t *46 x53 +t *45 ,7 +t -4 *57 +t -4 *56 +T4 *50 t +T4 $. -4 +T4 -4 $. +T4 .3 R8 +T4 $3 *02 +^T *42 +[ t *42 +T4 *13 +T4 *10 y1 +T4 +1 +t } *41 +T4 $0 Z1 +t *40 D4 +t *40 *51 +T4 *02 $3 +T4 +0 ] +T4 +0 +T4 ] +0 +T4 ^0 +T4 $# +T4 $@ +T4 $? +T4 $- +T4 $_ +$+ T4 +} T4 ] +} ] T4 +^T .4 +^@ T4 +] t +4 +^t -4 +T3 Z4 Y5 +T3 $. Z1 +[ T3 y3 +T3 y2 i5w +T3 y1 +T3 $W *97 +T3 ^w +t -3 T8 +T3 t *56 +T3 T0 +T3 ssP +T3 srR +T3 sfN +T3 ^s ,7 +T3 ^S *31 +T3 s1W +T3 s16 +T3 o98 +T3 o88 +} T3 o77 +T3 o66 +T3 o6- +T3 o4- K +T3 o4$ +T3 o2C +T3 o15 +T3 o0N y5 +T3 o0I +T3 K o4- +T3 k ^B +T3 ^J $9 +T3 i7? +T3 i5n +T3 i4Z +T3 i4x +T3 i4E +T3 i44 +T3 i1l T3 +T3 i1L *24 +T3 D8 +T3 D7 ,4 +T3 $9 ^J +T3 *97 +T3 $8 +T3 [ ^8 +t *37 $1 +T3 $7 +T3 *69 +T3 ^@ -6 +t -3 *58 +T3 *56 t +t [ *35 +T3 ,4 D7 +T3 ,4 +{ T3 +4 +^t -3 -3 +T3 ^2 +} t *31 +T3 *02 +t *30 +2 +T3 $* +T3 ^* +] T3 +t $3 $* +$t +3 +^t ,3 +t ^2 z4 +T2 z3 z3 +T2 Z1 +^! T2 z1 +T2 ^Z +t +2 Y4 +T2 Y3 D4 +^t ,2 x82 +T2 [ x32 +T2 T5 o6$ +T2 T5 +] T2 T5 +T2 T4 $= +T2 $= T4 +T2 T1 K +T2 T0 y2 +T2 si| +T2 sg6 +T2 s9$ +T2 s7^ +T2 s4* +T2 s29 +T2 o7! +T2 o6$ T5 +T2 o1K +T2 o13 +T2 o1% +T2 o0N +T2 o0g +T2 K T1 +T2 ^K +$@ T2 K +T2 [ k +T2 } i7o +T2 i4? L4 +T2 i4f +T2 i3g T3 +T2 i3% +T2 i3= +T2 i2J +T2 i2. +T2 ^E +T2 D7 $^ +T2 $^ D7 +$* T2 D7 +T2 D4 Y3 +t ^2 $C +T2 $a +T2 ^9 ^! +T2 .6 Y4 +T2 .6 +1 +$, T2 .6 +t ,2 +5 +{ $t *25 +$t *24 *01 +t *23 $1 +T2 *30 $1 +t +2 *30 +T2 ,3 +T2 +1 .6 +t *21 .5 +T2 $1 *30 +t $2 *10 +t *20 o20 +T2 *04 y2 +t *20 +T2 [ +$! T2 +^T +2 +{ t +2 +T1 $! Z2 +T1 $@ Z1 +T1 $_ Z1 +t +1 z1 +t +1 Y5 +T1 Y4 t +T1 Y3 x41 +T1 Y2 { +T1 Y2 +t $1 Y2 +T1 Y1 T2 +T1 Y1 .4 +T1 $# Y1 +$# T1 Y1 +$$ T1 Y1 +$@ T1 Y1 +{ T1 y1 +t ^1 y1 +$T +1 $Y +T1 x42 { +T1 x41 Y3 +T1 x41 o4$ +t .1 ^W +T1 ^u +T1 t Y4 +T1 T5 T4 +T1 T4 T5 +T1 T3 +T1 t $3 +T1 T2 Y1 +T1 T2 D8 +T1 T2 +T1 t ^2 +T1 T0 +T1 t +T1 ssC D7 +T1 ^S K +T1 saU +T1 s6^ +T1 r +t +1 p3 +T1 o7z +T1 o7s +T1 o7( +T1 o6/ $3 +T1 ^! o60 +T1 o6. +T1 o5N +T1 o51 .7 +T1 o4@ ,3 +T1 o4$ +T1 o3I +T1 o3@ +T1 o2u k +T1 o0W +T1 o0R ^X +T1 o01 +T1 o0% +t ^1 $o +t $1 ^m +T1 K ^S +T1 k o2u +T1 k -2 +T1 $% K +$& T1 K +[ T1 k +T1 i92 +T1 i83 +T1 i6# +T1 i6@ +T1 i5# R6 +T1 [ i5K +T1 i5@ +T1 i4s +T1 i4A [ +T1 i47 +T1 i43 +T1 i4! +T1 i3Q .0 +t +1 i2T +T1 i2h +T1 i1A [ +T1 i0w +T1 i0o +T1 i03 +T1 D8 T2 +T1 D7 ssC +^T +1 D3 +T1 $c +T1 +A x21 +T1 $a +T1 $8 -3 +T1 $8 +T1 .7 o51 +T1 *75 K +T1 -7 +T1 *67 +T1 *64 $! +T1 $! *64 +T1 *61 Z2 +T1 $6 +T1 *54 *64 +T1 .4 Y1 +t *14 *63 +T1 *46 +T1 [ +4 +t *14 ] +t *14 +t ] *14 +T1 $3 t +T1 $3 o6/ +T1 ,3 o4@ +T1 -3 $8 +t $1 *37 +T1 ^2 t +T1 -2 k +t $1 *23 +T1 *20 +^* T1 $2 +T1 .0 i3Q +t *10 $2 +T1 $0 +} T1 -0 +^t ,1 $0 +T1 $@ $^ +T1 $_ +T1 ^$ +^- { T1 +t -1 +^t -1 +T0 z4 x95 +T0 Y3 o21 +T0 y2 i5y +T0 Y2 +T0 y1 +T0 ^X ^D +T0 x84 +T0 x82 *17 +T0 x67 +T0 x62 o13 +T0 x61 *53 +T0 x14 +$% T0 x13 +T0 ^X +T0 t p1 +T0 $T i0U +T0 TA Z1 +T0 T9 Z2 +T0 T2 .5 +T0 $T +T0 stT p4 +T0 scK +T0 sbx +T0 s9$ *57 +T0 s7j +T0 s1Q +T0 s0N *27 +T0 r { +T0 p4 stT +T0 p1 t +T0 o8z $d +T0 o7? +T0 o6s +T0 o6G i79 +T0 o5W +T0 o5B +T0 o4U +T0 o4C +[ T0 o4 +T0 o3x +[ T0 o3K +T0 o2h o1v +T0 o21 Y3 +t -0 o2 +T0 o1W +T0 o1v o2h +T0 o1K D2 +T0 o13 x62 +T0 o13 +T0 ^N $8 +T0 ^N +T0 K *85 +T0 i86 +T0 i7h +T0 i7e +T0 i79 o6G +T0 i7! +T0 i68 *48 +T0 i5p +T0 i4l ,7 +T0 i4e D7 +T0 i3? +T0 i0U $T +T0 i0E ^R +T0 ^i +T0 $d o8z +$@ T0 D9 +T0 D2 o1K +T0 ^d } +t -0 ^D +T0 $A r +T0 $A +T0 -9 i2@ +T0 $8 ^N +T0 ,8 $7 +^T *08 -7 +T0 +8 +4 +T0 $7 ,8 +T0 -7 +5 +T0 ,7 +T0 .6 .7 +T0 $6 ^5 +T0 .5 T2 +t *05 $I +t +0 *59 +T0 *57 s9$ +T0 +5 -7 +T0 ,5 *65 +T0 ^5 $6 +T0 *53 x61 +t *04 o1l +T0 +4 +8 +T0 *47 ^# +T0 $* -4 +T0 -4 $* +$= T0 +4 +} T0 *32 +T0 ^3 +^t *02 o3s +T0 *27 s0N +t *02 *65 +T0 *24 $? +T0 $? *24 +T0 ] ^2 +T0 ^2 ] +t *02 $@ +t $@ *02 +$t *02 +^t *01 ssf +T0 *17 x82 +$t *01 *24 +T0 $1 $1 +T0 ^1 ^- +^t $0 ,1 +T0 $. ^@ +T0 ^$ +T0 ^@ $. +t $0 +$T ^* +$T ^@ +$% ^T +$# ^T +} $T +} ^T +^T $@ +^T } } +^T ^$ +^T ^@ +^! ^T +^_ ^T +t $! +t } ^# +$t { +$* t +$. $t +$/ $t +$? ^t +$! t +{ $t +] t } +] } t +[ } ^t +^t $+ +^t $# +^t $/ +^t $! +^t ^$ +^@ ^t +^. $t +^; ^t +^s $z Z2 +] szZ +szZ +sZ$ x61 +szx +szv *76 +szv } +szs t +[ szs *20 +$_ szs +szs +sz? o0e +$s Z5 +$s Z4 Y5 +$S Z3 $A +$S Z3 +s.` Z3 +$s Z2 o0S +^s Z2 -7 +^s z2 -4 +^S z2 *30 +$S Z2 +^s Z1 i80 +sz1 c +} $S z1 +^s Z1 +s*Z +s>Z +$$ s*Z +syX c y2 +syw t +syw +sy* u +sy* t +sys ,8 +syR y4 *57 +sy@ o82 +sy@ o5a +syN u +syn $1 +sym ^l +syk *45 +syj +syI c +syH o2r +syf Y2 x43 +syf x43 Y2 +syf i4# +sye ^1 +sye +syc Y3 Y3 +syc .3 +sy- ^b +sya Z4 +sy? *87 +$s y5 t +^S Y5 o5l +s-_ y5 +^s y5 +$s y4 x65 +$S Y4 D7 +$S y4 C +$S y4 +^S y3 D3 +sy( -3 +^s y2 +5 +^s y2 -0 +^S Y2 +^, ^s y2 +$s Y1 i7h +sy1 i38 +^S Y1 i1C +$s y1 $e +$s y1 *56 +} $S y1 +^- sy1 +sy0 o1i +s*Y +s$Y +$s $Y +sy_ $@ +$s $y [ +$s [ $y +sxX $. +sxv +sX* t +$. sxs +sxq $ +sXP $e t +sxp +sxm +sx[ L6 +4 +sxj +sxc +sxb +^S xA1 +sx9 $! +$s x65 +^S x54 +sx[ +4 L6 +s . x43 +^s x34 +sx3 +^s x24 +^s x15 D3 +^s x14 x58 +$s x13 $c +^s x13 +^S x12 i20 +s , x02 +sx0 +s/X +swz $. +swy -6 +sw* Y2 *96 +swX i6y +swx +swt ssv +sWS Z4 +sws y3 +swS Y1 u +swS u Y1 +swO o6Y +sWL $F +swh seO l +swh -5 +swe -6 +swd o2d +swd o1a +sWD i4a +sw0 +$s $W +s w +[ sv_ Z2 +svy Y5 x62 +svw +svV +svS snt +svn o2f +} svl *60 +^S ^V K +svf +svc +] svb +sV5 } o4- +$- s-V +sv* +suz +sux u D3 +sux D3 u +s,u x25 +sUW +suU +sUt o2v +sus i5c +$s u ^S +suo x71 +sum x21 +sul o6e +su{ L2 +suG ^S +sUC d ] +sua o4u +^S u *80 +su7 o3@ +} su7 i25 +[ su4 +su3 y2 +$S ^U +$S $u +^S u ] +^S ] u +stz p1 +stz $1 -B +stz +sty shd p1 +sty p1 shd +sty o5p +sTY C +sTy C +$s t y5 +stx o8. +st/ x31 *51 +stv -8 +s!T ^U +stu +$s ^T scf +sT% q q +stp r +stp ] +stO *36 Y2 +sto $. +stm l +stm i3e +stk t +stJ *78 +sTj $. +st, i3p +sth *52 +sth +4 +sTG y5 x84 +stf $h D3 +stf D3 $h +st- ^F +std $M D2 +std D2 $M +stc x03 ^V +stc $5 +st9 +2 +$s T7 x14 +$! st5 +$S t -4 +st4 +$S T3 +$s t +2 +sT1 $L +^s t *12 +[ st1 +^S $t +st! +s+t +s*+ t +$! st. +ssz T5 +ssz -5 +ss^ Z1 +ssx i3j +^S sxc +ssx ,6 +ss. x43 +ssX $1 +$> ssX +ssW Y1 E +ssw $M +ssW E Y1 +ssw +ssV u +$@ ssv +^s sue +$s ^S u +ssu +ssT R3 +sst ^l ^u +ssT i56 ] +ssT ] i56 +sS* t d +s-s T2 +$s ss$ E +$s ss$ +^s srl +ssr E +^S src .4 +^s $S r +ssq K +ssq i3j +ssq i2y +ssp i4k +ssp *50 +ssP +ssO D2 D2 +ss$ o4h D0 +^s $s o10 +ss$ o07 +^s snp +sSn *05 +sSm Y3 +sSM i8. +ss& $m +ssl $8 +^S $s L6 +ssl *26 *14 +ssl *14 *26 +ssL *07 +$* ssL +$s skc +ssk ,3 +ssj x03 +ssj K i0b +ssj i0b K +^S sis +3 +ssi o3_ +ss! i6z +ss) i5I +ssi +^S sgt +^S sgM +ssf x01 r +] ssf i64 +ssf [ *35 +ssf *30 +sse +ssd y5 +sS* d t +ssd s1 +ssd $Q +ssd i6e x43 +ssD i5Q +^s $s d +$@ ssc p4 +$s scf ^T +ssc -5 +sSb o46 c +ssb i1x +sSb c o46 +^S saS +ssa ] +ss_ ^a +ss6 x51 +ss. $6 +$S s5s +sS4 D1 +$! ss4 +ss3 o1k +ss3 D5 +} ss3 +ss *24 +ss2 $* +^s s1o +ss1 +0 +ss$ -0 +ss[ +$} ss{ +$ ss +] s s +srz d +sRy p4 T0 +s-r Y3 Y3 +srx x52 +$. srx x21 +srX ^x +srx o0, ,5 +srx ,5 o0, +srx +5 +srw o2u +srw *35 +srW *32 +sru t d +sru d t +sru c +] sr* u +srt x81 +srt o5v +sR* t K +srt i0g +srt +2 +srq r +srq i2s +srn Y2 Y2 +srn o2a +srN E +srn *53 +srn *24 +srM x01 +srm i4j +srl o0w +srL ,5 +^. sR. l +sR* K t +srk o9. +sr+ k .4 +srj k +srj *50 +srj ,4 +sri *26 +sri +srH y4 -0 +srh y1 +srg x53 +srG u +sRg t d +srg t +sRg d t +srf o3k +srf o3f +srf $5 +sre .1 +srd o8A +src o2j +src -2 +sR- C +sR* c +srb D3 +$$ srb +srA ^M +^s R9 +sr8 Z1 +sr8 Y2 +sr7 +sr$ *62 +sr+ .4 k +sr4 E +sr $4 +$S R3 *03 +^s R2 +sr_ $2 +sr1 R1 +sr1 D6 c +sr1 c D6 +$s R0 +sr# $# +sr +s/+ ^r +$s r $$ +^s ^r +^$ s/r +sqt +sQq o4 -0 +sqe +sqB D1 +sqb +sq9 T3 +^S q +7 +sq7 +$s $q +$s q +^s ^q +spz c +spw x21 +spw i2g +spw +spu ^j +spu +spt .9 +sp@ o5x +spl T0 +sp. ^h k +spg t +spg ^H +sPF $X +spf i63 +spf $b +spC o3i c +spC c o3i +spC $2 +spB c +] spb +spb +^S p4 i5* +sp *47 +s`| ^P +$! soz +soy $Y p3 +soy x13 +sox slz +sow *34 +s#o $w +soV +sou y5 +soU E +sou '8 +so@ u +so. ] $u +sou +sos 'B +soq i2j +soO i8Z +} soO +soN o3d +soM T2 +sOM s0G p2 +sOM p2 s0G +] som +so| L5 +sok Y3 t +sok t Y3 +soK *51 +soJ o3J +soi t +$* soi +soG ^F +sof $Q +sof o42 +soe oAl +soc .6 +so! c $! +so! $! c +soB *25 D2 +soa y3 +soa Y2 +soa $H +$s oAa +soa $8 +sO) $A +^S o9. +^S o8t +^S } o8S +^S o8! +$s o7s +$S o7? +^s o7_ +$s o6x +$S o6o +$s o6G +$s o6g +^s o6a -3 +^s o5x +$s o5p +^S o5M +$s o5m +^s o5K -2 +^S o5# +so$ ,5 +$s o4 r +$S o4l +so *47 +^S o3v +$s o3t +^s o3n +^s o3e +$S o2w +so2 T1 +^s o2j +[ ^S o2a +so2 *87 +s!O -2 +so& -2 +^s o2. +^s o1x +so1 sli +^S o1N +^S o1j +^s o1f r +$S o1f +^S o1d +so1 c +^s o11 +^s o10 $s +so0 x81 t +so0 t x81 +so0 TA +$s o0T +$s o0S Z2 +^S o0q y3 +so0 o8M +$s o0G +so0 D1 +$s o0b +$s o04 +sO* *02 +so0 ^2 +so0 ] +$S ^O +^S ^O +so@ $$ +so@ } +so) +[ so@ +^s ^o +snz siy +snz ^d +snz *52 +sNY ,5 +sn Y1 +snx shd +snx +3 +sNW *81 +$. snw +snv i6z +snv ^2 +snT K +s/N T5 +sN* t ] +sN* ] t +sN_ $ sxq +sns i1I +snS D4 .3 +snR u +snr +snq $x +snq *35 +snP l -0 +snP -0 l +^] s]N o8* +sn- o2d +{ snN +s/n $n +snM +6 -2 +snM -2 +6 +snm $2 +{ snm [ +{ [ snm +sNl ^s 'A +snL i5d +snl *12 +snk c +snI Y1 +s-n iBe +sn* i7. +sni -6 +snh suo +snH +2 +$. snh +snh +snf ^x +sN. $f q +snf *03 +sn, E *78 +snd ] Y2 +snD R1 D3 +snD D3 R1 +snd *75 $$ +snd $$ *75 +sND *13 ^1 +snd +snc x12 +sNc *54 .1 +sNc .1 *54 +snB ^@ +sna x02 +snA C *50 +sNA +sn, *78 E +sn6 Y1 +sn *45 +sn3 o5p +sn2 ^4 +sn2 +sn1 *16 +sn0 o0F +sn0 *64 +^s ^N +sn+ +^s ^n +smz i4. +sMY x61 .1 +smy DB +sMY .1 x61 +smX o5S +smx *65 +smw x01 +smw sim +smW c +[ smw +smv o7q +smv -B +smv +4 p4 +smu i7f +sm* u ] +sm* ] u +smt { $b +smt -7 +sMT .5 +sm> sa> +sms $ +smr x32 +smR sRx $c +smR $c sRx +smr +smq u +smq +2 +smp u +smp +4 i4 +smP *35 +sMP *34 +1 +sMP +1 *34 +sm. o67 +smo *45 -3 +smo -3 *45 +s-m o2M +smM *13 +smM } +sml o4D +$s ^m L6 +sml +smK K -4 +sMK *86 +smK -4 K +smK $1 +sMj x32 +sMJ s10 C +smj l $3 +sMJ C s10 +smj $3 l +sMJ +smh D6 *31 +smh *31 D6 +smh *08 +smh +sMg i1r +sMf x31 +[ smf +smd o1a +smd $5 +smd ] +smd +smc ^g +smc +smB x21 +smb $* +sM9 $u L7 +sM9 L7 $u +sm8 o30 +sM7 +sm5 o0S +1 +sm5 +1 o0S +sM- .3 +sm2 ^u +sM1 sv5 D5 +sM1 D5 sv5 +sm1 c +sm? ,1 +sm+ *03 i3m +$S $m +^S ^m +s-m +s m +^s $m +slz o5k +slz +sly o7w +sly *63 +sly *36 +sl. y2 +slx u +sl% x42 +sl/ x32 ^g +slx +slw +1 +slV Y3 x51 +slV x51 Y3 +slv *07 +slu i3y +slu +slt *46 +slt +slS u +sl; sp[ +slS +slr x61 +slR x51 E +slr i5u suP +slR E x51 +slR c $* +slR $* c +slr $2 +slq x43 +slq $q *53 +slq *53 $q +slp $z +slP o6# +slp -6 +sln R5 ] +sln ] R5 +slN c +slL K +slL i34 +slk u +slK ^E +slk +slj ,3 +sLj ^2 +slj -0 +slI +slh ^@ +$! slg x14 +sLG u +sLg u +slg K Z2 +slg +sLF Y4 t +slf Y3 Y3 +slf y2 +sLF t Y4 +slf D5 i5w +slF $6 +sle x81 +sLE +sl! E +sle +sld Z2 y4 +sld y4 Z2 +slc $j +slC *51 +slb x91 +sLA T2 +slA -B +sl! *86 +^S L6 $s +^S L6 +sl; +6 +^s L5 +^s L3 +sl1 TA +^s L1 +sl1 ^! +sl1 +^S $l +$/ s/L +sl[ +sl. +s?! l +$s l $! +$s $! l +^s ^l +^. s$/ l +$) sKZ x21 +sK* z2 +] skz +sky $v +sky +skw $n +skw D1 +skw *03 +skV *42 +skv *20 +^S K ^V +skv } +sKU +skt T0 +skt $D *35 +skt *35 $D +skr o0d K +skr K o0d +skR E +skp $s +sKp *32 +] skp +skM C +sKL +skj ^s +skH E +skh +sKg p1 +sKg d +sk_ ^g +sKf $m p1 +$s K f +skD x51 +skd oB5 +skc x72 +sKC ^1 d +sKC +skc ] +sKb $a -8 +sKb -8 $a +sk6 +sk3 sj? +sk3 +8 +^S ^K +s.k +s k +^s $k +sjz K ^k +sjz ^k K +sjy i6t +s*j Y2 Y2 +sjx Y2 +sJW D8 +sJS x42 +sjs ^m +sj$ s0O c +sjs +sjr ,2 +sjr $1 +sjp $. +sjp +sjK i5L +sjJ +sJH o4l y1 +sjh } +sJG Z5 +sjg y2 +2 +sJg -2 +sje u d +sje d u +sjD R8 +sja *12 +sj0 +s?j +$. sj. +^s ^j +siz *62 +siy E +siy $2 +] siy +[ siy +six +2 $. +six $. +2 +siw *35 +siv $h [ +siv [ $h +siv *31 +[ siv +siv +siu o7z +2 +siU l ,7 +siU ,7 l +siu +2 o7z +siu ] +s i u +s.I $S +siQ x37 +siq *61 +sip o2y +sio Z1 +sio $T +sio k +siO i2. +si- o5y .6 +si_ o0s +siN y3 y3 +siN Y1 c +siN c Y1 +si! L5 +sil *02 +sik +siI +sih +$! sig +sif +sie x42 +sie x32 c +sie T1 +sie o4 +sie c x32 +siE C +siE *24 +si@ D7 +sid $4 +siD +siC o1s *12 +sic $. +siB L7 *30 +siB *30 L7 +sia o0m z1 +$s iAO +sia $D +sia c +$s i9r +si@ *97 +5 +^S i95 +si9 ^2 +$s i8u +$s i8c +^S i82 +3 +^s i80 Z1 +$s i7h Y1 +si/ $7 +^s i6z +^s i6y +^S i6P +si- .6 o5y +$S i6N *32 +^s i6h +$s i6e +$s i66 +si@ *62 +$s i61 +^s i5x +si5 t +$S i5M +$s i5k +$s i5i +^S i5c .8 +si@ +5 *97 +$S i53 +^s i51 +^S i5! +si@ +5 +si4 x03 +^s i4q +$s i4o +$s i4n +^S i4M +{ sI4 i22 +$s i4_ C +^S i42 +si, .3 y2 +^S i3T +^s i3S +^S i3R +^S i3m y1 +si3 *30 i1p +$s i3* +$* si3 +^S i2S +si2 *26 +si2 *15 +^S i2. +si1 x53 +^S i1W +^s i1w +si1 T0 +^S i1L +si1 $h +si1 E +^S i1D +^S i1C Y1 +^S i1C +^S i1A +si1 ^a +si1 *35 +^S i1& +] si1 +^s i0Z +si0 R4 +^s i0j y1 +^S i0J +^S i0G +^s i0g +si *04 +^S i02 p5 +s=+ i02 +$s i02 +si0 $@ +$s i0# +si0 +^S ^i +si* [ +si! ] +si| +s!i +$s $i +] si! +^s ^i } +shz x43 +shz x32 +shz $8 +sh_ ^z +sHW u +} shW $C +shw *70 p5 +shv y5 u +shv x62 +4 +shv u y5 +} shv o3f +shv *52 +shv +4 x62 +shv *25 +shv +shu i2f +sht *69 x42 +shr +shp x02 +shp *73 $k +shp +shn +shm o32 *07 +sHM +4 +shm *07 o32 +shl x91 c +shl c x91 +shk o6_ +shk +3 +sh i5o +shG Z2 .2 +shG .2 Z2 +shG $2 +shf Y3 +0 +shf +0 Y3 +$# she +shD .5 +shd -2 +sh@ .7 +sh7 +sh4 +^S $h *23 +sh- $2 +s?h $2 +sh1 $J +sh ] +sh +sgz L7 +sgz +sgy smq +$! sgy +$. sgu .5 +sgt y2 +sgt ^5 *73 +sgs -3 +^( sgs +sgr +3 +sgo *65 +sg o0l +sgn +2 +sgm +7 +sgM +$! sgL +sgk Y5 +sgk c o4C +sGk ^a +sgk +0 +sgk +sgf i0* +sgd E $8 +sgd $8 E +sgd .0 +sgd +sgb Z2 s5I +sgb s5I Z2 +sgb *36 +sg9 x32 +sg9 +sg' *75 x02 +$! sg6 c +sg6 -7 x41 +sg4 '8 +] sg4 +s,G *37 +s.@ ^G +$- s-G +sg, +$! s@g +sfz +sfw *15 +sfv ^$ z3 +sfv +sfs +sfq +sFP i05 +$! sfN +sfl +s!F K +sFj $e *61 +sFj *61 $e +sF i41 +sfF ska +$@ sfF +^S $F C +sfb +sF7 y1 +sf5 *50 +sf5 *05 +s.F .4 +$S ^f ,2 +[ sez o51 +sez -5 +se& Z3 +sez *13 +se_ Y4 +se_ Y3 +$s $e y1 +seY +sey +s*E x24 $O +se* x13 +^) se. x03 +sew r x53 +sev $n +seu r +set d x05 +set ^d E +set $3 +ses y5 c +$s E ss$ +seS o1F +ses { +seq x21 +seQ u +seq *71 +sep i2v +sep $9 +seo x67 +s*E $O x24 +seo '9 $n +seo *54 +[ seo *41 +seo ,2 +seo ^' +seN *53 +seM o2k +sem d x03 +$= sEm +seJ x41 +sej x12 +sej ^3 +se; i7n +sEi *56 +se] i3, +sei $* +$. sei +^s E D7 +se_ d [ +sec y2 scp +sec Y1 +sec scp y2 +sec ,3 +se@ c +$S E $B +sea *53 +se9 o3f +se8 T5 +se8 +se7 i65 +$@ se7 ,4 +se6 +se! ,4 +se- -4 +se .4 +se3 Z1 +se3 y3 +se3 x73 +se3 ^r +se3 o6! +se3 D8 +se3 -7 +se3 ^2 +se% $3 +se2 o11 +se2 *18 +$s E -0 +se- .0 +$_ se0 +sE* +$s E +se# +s*e [ +} se; +[ se` +^s $@ ^e +^s ^e $@ +^s ^e +[ sdy $z +sdy t +^\ sd/ y2 +sdw +7 +sdw +sdT -5 +} sDR L6 +sdq +3 +sdp $p +sdP +[ sdo +sdn y2 +sdn E +sdm +sdl +sdk x23 +sdk r { +sDk $Q o3n +sDk o3n $Q +sdK E $. +sdK $. E +sdk +sDi +6 .1 +sDi .1 +6 +sdH q E +$! sdh +sdf y5 +sdf x62 +sDf $t *05 +sDf *67 +sdf *20 +sdf +1 +sDf *05 $t +sdf +sdD Z2 +sdc $7 +sDa +^s D7 E +$S [ D6 +$s D6 +sd6 +sd5 *45 +$s D4 ^w +sd4 i4i +$s D4 c +^s D4 *20 +^s D4 +sd4 +^S D3 $* +^S $* D3 +^s D3 +$s D2 +sd1 Z1 [ +sd1 [ Z1 +sd0 +scz $! +$S C y4 +$* scy +scx Y2 +$s $c x13 +scX +scv k +scT u +scT +5 +sct *45 +sC( T1 +sct +scS $0 +$_ scs +scr t o1I +scr R1 +scr +1 +sc. ^Q +sc. ^q +scP o2N +sCp i3a +scN s6& +scn +sCm Y3 +scm k +scl *64 +sCl +scK x72 +scK K +sck $e +sck *A8 +sck +8 +^@ scK +scK +scj x58 +scj t k +scj o4g ^d +scj k t +scJ ^$ ^$ +$s C i4_ +sch ^Y +sch ^s +$= scg y2 +sCG x31 +scg x12 +scF D7 +scF ,2 +^S C $F +sCe *05 +sce +$s c D4 +scC Y1 +sc@ ^A +$s c -0 +$S $C +$S c +sC* +sc- +s-c +$s $c ^* +$s ^* $c +sby o7w +sb@ Y3 *20 +sbX T2 *50 +sbX *50 T2 +sbw sth +sbv D5 +sbT i3k +] sbt $7 +sbt ,3 +sbS Y2 +sbs ssK o5* +sbs o5* ssK +sb sBO +sbs *25 +sbs +sb$ R3 E +sbq x63 +sbQ q +sbq o7d +sbp o2x +{ sbp { +{ { sbp +sbp +sbN c +sbm Y2 +sbm o20 +sbm ^M p4 +} sbM +sbm +sbk x02 +sbJ +$! sbj +sbh Y1 +sBH ^1 +sBG D4 +sbf Y2 +sb$ E R3 +sbd $$ +sbc +sbB T0 +sbB o6a +sb7 k +sb7 D1 *08 +sb, -6 ,2 +sB3 l ^\ +sB3 ^\ l +sb2 *68 +sb, ,2 -6 +sb@ *20 Y3 +sb! *12 *62 +sb0 z1 $5 +sb0 $5 z1 +^s $B +sb/ $* +s b +$# sb* +sa. Z1 +saz +say i61 +s.a Y4 D6 +sa@ Y2 +say $. +saX $P +saX i1M +sax c +sa& xA2 +^s ^A x72 +sa+ x62 +sa. x54 +saX *53 +s^A x21 +saW +saV -3 +sav $_ +sa@ ^v +sav +sau x61 +saU u +sau i09 +sau $. ^H +sau ^H $. +sAu *32 +sau *20 +sau +0 +sat r +saT $K +sat *57 +sat +2 +saT *02 +sas u p1 +sas p1 u +sa@ soO +sas o1k +{ sAs +sar x02 +sap +2 $. +sap $. +2 +sao x73 +sa@ o8$ +sa@ o5a +sao *57 +sa. o0G +} saO } +} } saO +sao +sAn -2 +{ saN +$. sAl +sak sbh +sak $! +sa@ k +saj o8p +sah o57 +sah *43 +sAH +sag Y2 +sag *06 $! +sag $! *06 +saf o0y +saf +6 +sAf *02 +sAf $+ +sae scg +sae c +sae -2 +saE $. +sae +sad y4 T4 +sad $y +sad d +sa_ D6 +sa, D2 +saC o5X -3 +saC -3 o5X +^@ sac +sab $= +sa@ $b +saA Z1 +saA +6 +sAa +saA $$ +saA } +sa9 $s +sa@ ,9 ,8 +sa8 +sa6 R3 R3 +sa@ *65 +$s *A6 +sa5 x02 -7 +sa4 r +sa4 D3 +$& sa4 +sa3 $! +sa *25 +sa- *21 +sa *21 +} sa2 +sa1 xA2 +sa1 x42 +sa1 R6 +sa1 $c +sa1 -6 +sa1 -5 +sa' ,1 *05 +sa1 +sa0 D5 +sa0 c +sa@ -0 +^S $A +$@ s@A +sa$ } +$! sa. +] s-a +s9. Y2 y2 +s9. y2 Y2 +s9. x43 +s9w $W +} s9s +s9) R9 R9 +s9Q Z1 ^A +s9q $Q +s9Q ^A Z1 +s9. o4* *50 +s9, o33 D4 +s9@ ^M +s9m +s9] i8[ +s9! i24 +s9H z2 +s9& $H +s9g $i +s9d i3b ] +s9d ] i3b +s9, D4 o33 +s9C $c $c +s9@ ^B +s9a 'B +s97 -2 +s97 $! -0 +s97 -0 $! +$/ s97 +s97 +s96 T4 +s96 s87 +s96 C +s9. *50 o4* +s9% *42 +s94 *12 +s93 o37 +s93 o0L +^s ,9 ,3 +s92 o6w +s92 -8 +s9 *24 +s9/ ,2 +s90 T0 +$S $9 +^S $9 +s9@ $* +s9) $& +s9 +s9> +s.9 ] +^s +9 +s8@ z5 +s8/ Z1 c +s8# y5 r +s8, y3 y1 +s8x i3v +s8x +7 +s8w i3M +{ s8v +s8u *75 +s8s *53 $- +s8s $- *53 +s8# ^s +s8# r y5 +s8R L8 i04 +s8- ^o z1 +s8O +s8n ] ^A +s8n ^A ] +s,8 $k +s8@ i4@ +s8! i2D +s8= i1 $1 +s8h Y1 ^h +s8h ^h Y1 +s8G Y5 T1 +s8G T1 Y5 +s8f +s8+ E +s8! D0 +s8/ c Z1 +s8c d *20 +s8- C +s8b Z1 +s8B ^Y +s8b o3n t +s8A i37 +^S *8A *89 +s89 $q -4 +s89 $G +s89 -4 $q +s8. *92 r +s89 +s87 E -0 +s86 -7 +s86 +6 +s86 .4 +s8_ .6 +s85 ^L +s85 +9 +s8 .5 +s84 i38 +$! s84 +s83 Y5 +s83 Y2 +s83 +4 +s82 +s81 Y5 Y2 +s81 o8a +s8 *14 +s8< *12 +$+ s81 +^S *80 u +s80 ,9 +$S $8 +^S .8 +s8@ $* +s8@ } +s8 $+ +s8 +s,8 +s 8 +$s ^8 +^s ,8 +s7* Z2 +{ s7x Y3 +s7X i6R +s7 x81 o1e +s7w i7u +s7W $C +s7v ^K +s7T ^Z +s7R ^C +$@ s7r +{ s7o Y1 +s7 o1e x81 +s7! i5E +s7g z3 { +s7F Y3 +s7f +s7b ^g +s7a i13 +$S *79 +$s *78 +s 7 $7 +s75 $ x86 +s75 $- +s75 $ +s73 T4 +s73 ,9 +s73 +s72 x01 +s72 +4 +s72 $4 +s71 i4j ^D +$s *71 +s71 +s70 x15 *86 +s70 $s +s70 +$S $7 +^S ^7 } +s7& +s7. [ +s7` } +s-7 +$s $7 +^s +7 +^/ s7* +s6y $r +s6. Y3 +s6@ Y2 +s6x +7 +s6x *35 +{ s6V +s@6 ^T +s-6 t +{ s6* t +s6s i1g +s6* r +s6q y2 y2 +s6Q i53 +^{ s{6 oB9 +s6N *45 +s6k -5 +s6I y4 +s6! i0U +s6g $o } +s6E Y1 ^a +s6E ^a Y1 +s6e .5 ^^ +s6c K +s6c ^$ +s6_ $A +s69 $! Y1 +^S *68 +$s *68 +$s *67 +s)& *64 +^S *63 +s63 ] ] +$s *63 +s62 $w +s62 p1 +B +^s *62 ^n +s62 i4@ +$S .6 +$S ,6 +s6$ } +s6! } } +s6, ^, +s6- +s@6 +s!. ,6 +s>6 +$s ,6 +$% s6@ +s5- Z1 ^s +s5Z $1 +s5x q +s5x +^s ,5 ^w +s5- ^s Z1 +s5! so0 +s5S +s5. p3 +s5k o6m +s5k *15 *17 +s5J c s3S +s5. i92 +s5@ ^g +s5f y2 y2 +s5f *75 +s5% E +s5D *57 +s5D +$! s5C +s-5 'B +s5A Y1 t +s5A t Y1 +s5a p2 x0A +s59 i5p +s59 ^4 +s58 ^s +[ s57 ^V +s57 $. +s54 y2 +s5% *42 +s5/ +4 +^s *54 +s53 x61 +} $s *53 +s52 c +s51 y3 x01 +s51 .8 +$S *51 +s50 +6 +s5. [ +s5 ^` +s5 +s.5 +$! s5@ +{ s5+ +^, s5. +s4Z o5N +s4. Y4 T2 +} s4X +s4w d +s4w $5 +s4v Y2 +s4. T2 Y4 +$S -4 t +^S .4 src +s4^ so6 +s4/ s0t +s4Q +s4. p4 i2l +s4. p3 +s4( o7) +s4 K i3c +s4J Y2 Y2 +s4i ^u L1 +s4@ i47 +s4 i3c K +s4g *47 +s4f o0G +s4F i4g +s4f *54 +s4f $0 Y3 +s4F +s4- D3 +s4. d +s4B ^A +s4A i5a +s4A ^2 +s49 t +$s *48 +s48 +s47 o0G +s47 L6 Z5 +$S *47 +s47 +$s *46 +s4@ *56 +s@4 ^5 +s43 -1 +s4$ *30 +s4 .3 +s41 o8@ +s4 +1 +s41 +s40 $@ +$S -4 +s4? $! +s4- +$s -4 +$) s4( $( +$) $( s4( +[ s4! +^s +4 +^s $4 +^s -4 +s3z k +s3$ Z2 o82 +s3' z1 { +s3Z +s3- y5 +s3. y3 +s3x d c +s3= x42 +s*3 x14 +s3w ^a +s3v Z2 +s3v y5 +s3, $v +^* s3T +s3# t +s3s y2 +^S +3 sis +s3s *41 *02 +s3s *02 *41 +s3$ ^R +s3p .3 +s3p +s3o $k +^s -3 o6a +s3- o63 +s3N ^P +s3m Y2 +s3m $r +s-3 ^L +s3* $l +s3 k +^S +3 i82 +s3H Y1 +s3h +{ s3f o0c +s3F $M i7L +s3F i7L $M +s3e E +s3e +s3d ^9 +s3{ D0 { +s3C x45 +s3c i2R +s3C ^@ +s3# C +s3A i7z +s3A ^A +s!3 +9 +^s ,3 ,9 +s39 +s38 T8 +s3* $7 +s3. $7 +s37 +s36 K +] s36 +$S *35 *20 +$S *35 +s34 $l +$S *32 i6N +s3% *24 +s3? *23 $. +s3? $. *23 +s32 ] +s3! .2 +] s32 +s31 c +s31 *48 +s31 $# +] s31 +s30 o42 +s30 i4g x21 +s3. *04 +s30 *30 +$S .3 +^S ^3 +s3& { +s3! ^" +s3> $< +$s $3 +{ $s ^3 +^` s3! +s2. Z2 +s2z +s2. y2 +s2y $! +s2' x31 +^S +2 ^X +s2w z2 +s2w $l +s2U +s2T +$s +2 t +s2s Y3 Y3 +s2s y1 +s2- s0_ ] +s2- ] s0_ +s2! ^S +s2+ $s +s2p $s k +s2p k $s +s2P ^H +^s -2 o5K +s2[ o4d Y2 +s2O -2 +} s2o } +} } s2o +s2N $Z +s2m $q +s2m p1 +s2m $- +s2L .7 +s2_ K Y3 +s2k $! +] s2j u +s2J ^J +s2I Z4 *24 +s2- i3m +s2I *24 Z4 +[ s2f o3a +s2$ E +s2D x41 u +s2D u x41 +s2' D3 +s2c i32 Y5 +s2C $F +s2! c ,3 +} s2C +s2& $c +s2B -8 +s2B +] s2A +s28 s3$ +s28 o0S +s28 $c +s27 y4 ^w +s27 +s26 $@ +s2^ +6 +} s26 +s25 K +s25 i2l +s2@ ,5 +^s *25 +s24 T3 q +s24 T0 +s24 o5Q +s24 *76 +s24 +4 +s24 +1 +s.2 $4 +^S *23 $h +s23 ^g +s2! ,3 c +s2$ -3 +s2@ +3 +s2_ $2 +s21 y1 +^S *21 R2 +s$2 ^1 +} s21 +s20 s0@ +^s *20 D4 +s20 +5 +$S *20 *35 +$S *20 +s2. .0 +$S ^2 +^S $2 +^S ,2 +s2* +s2! [ +$s +2 +$s ,2 +$* s2! +$ s2. +^& s2& +s1z $o +^. s1z +$. s1Y x42 +s1Y ^T '8 +s1# Y2 +s1x i1h E +s1x E i1h +s1x D6 +^ s1 x98 +s1X $3 +s1@ x23 +s1+ x05 +s1v d +s1# u o2P +s1! u +s1$ T3 +s1, T2 +s1S sDU +s1s o2q +s1s *54 +s1@ $s +s1* r +s1q $A +s1Q $2 +s1p T6 $1 +s1p d x04 +s1? p3 +s1p $1 T6 +s1p +s1o T6 +s1# o2P u +s1o +2 +s1O ^0 +s1n T3 D5 +s1n i8_ +s1n i6d +s1n i3h +s1n D5 T3 +$! s1m i94 +s1m i6f +s1L y1 +s1L *70 +s1, K +s1^ i6^ +s1! i1p +s1i +s1g ^x +s1f $d +s1E -6 +$+ s1e +s1C s/O +s-1 c +} s1c +s1B $Q +s1a { Z4 +s1a R5 +s1A +s1a +s19 i5. +s1. *95 +s1% +9 +s1. +9 +s18 Y2 +s18 o3@ +s18 *45 +s1$ $8 +} s18 +s17 x31 +s1? ,7 p4 +^s *17 K +s17 *34 +s1! $7 +s16 T2 +^s *16 i09 +s16 [ ^c +s16 'A +s16 -5 +s16 *21 +s1@ *56 +s15 *51 +s1. *51 +s1+ .5 +$$ s15 +$s *14 x27 +s1. ,4 x13 +s14 x03 +s14 l +s14 C +$s *14 +$/ s14 +$! s14 +s13 $R +s13 K +s13 ^C +s12 $! Z2 +^s *12 t +s1@ *20 +s1* .2 +s10 i83 +s1- *03 +s1+ +s1@ +s1. } +s1/ +s1, ^$ +s1- $@ +s1 } +s1> +s1< +^s -1 +^ s1 +^> s1< +s0Z y2 y2 +} s0z i7' +s0z i4w i5w +s0. Z1 ,3 +s0$ Z1 ^$ +s0$ ^$ Z1 +s0. $z +s0% Y3 R6 +s0- Y2 D8 +s0x k +s0x D7 +s0X +s0x +s0w $@ +s0u +s0T y1 +1 +s0s i4@ +s0% r d +s0r $7 +s0r *34 ,1 +s0r ,1 *34 +s0r +s0p Z2 +s0 $? p3 +s0O u +s0o i4o +s0O C +s0o *90 +s0O -9 +s0- o6e +s0o +1 +s0_ o0w +s0@ o0t p4 +s0N $Z +s0N $n l +s0N l $n +s0L o5b o0h +s0L o0h o5b +s0- $l +s0k $P +s0@ k +[ s0* k +s0J o4T +s0I +s0h ^j +s0H $h +s0f *13 +s0e Z1 +$s -0 E +s0% d r +s0) D8 +s0. D7 +s0C x45 +s0C ^B +s0# C +s0* c +$s -0 c +s0B r i31 +s0B *89 +s0b +s0A o3P l +s0a l +s0A ^a +s0a *36 +s0^ +A +s0a +s09 Y2 $! +s09 x86 +s09 o0S +s0@ *86 +s0_ -7 +s07 +s06 u +} s06 +^s *06 +s05 ^j +s0. *58 +s05 *10 +s04 z2 +s0% *42 +s0 $4 +s04 +s0. ,3 Z1 +s03 K +s01 ^N x42 +s01 } L0 +s01 ^@ +$ $s *01 +s01 +s0% ^% +s0] +s0) { +s0. } +s0. +s0` +s.0 +s-0 +s=0 +$s .0 +$ s0 +{ s0- +{ s0 +$S $@ +$S ^@ +$+ ^S +$% ^S +} $S +{ ^S +] $S +s+- +s+_ +s+ +s#) +s*& +s*/ +s*? +s$( $) +s@& +s@( $) +s@! +s.+ +s.@ +s.( $) +s./ +s.! +s. +s!$ +s-@ +s-' +s-/ +s-, +s * +s - ] +s>+ +s>* +s>^ +s=} +s=_ +s=` ^` +$s $? +$s $! +$s ^! +$\ $' $s +$* s*@ +$$ ^s +$@ $s +$. $s +$- $s +] s. +^s $@ +^s $. +^s $ +^s $= +^s ^* +^s ^@ +^# ^s +^& ^s +^* s-* +^* $s +^_ s_. +^= $s +r $Z t +$r Z5 o0Z +^r Z4 t +r z3 o0B +r Z3 +9 +$r z3 -1 +r z2 o59 +^r Z2 ^n +r z2 i14 +$R Z2 +^R Z2 +r $# Z2 +r ^# z2 +^r z2 } +^R Z1 Y4 +$r z1 y2 +r z1 $r +r z1 i1n +r Z1 .8 +$R z1 *45 +r Z1 *37 +r Z1 *19 +^R z1 +r $ Z1 +r Z1 +r z1 +} ^R ^Z +^R ^Z +^r ^z +r y5 x93 +r y5 x67 +r y5 c +r y5 *84 +r { Y5 +$r Y4 oAd +r y4 i92 +r Y4 [ +r [ Y4 +r Y4 +r Y3 Y3 +^R y3 u +r Y3 t +r Y3 $l +^r Y2 Y5 +r y2 y2 +^r Y2 i0u +r Y2 *92 +r y2 *32 +r Y2 ,3 +r y2 *23 +^R Y1 i7r +r Y1 i52 +r y1 i49 +^r y1 i2w +r Y1 *47 +r Y1 ,2 +^@ r Y1 +^, r Y1 +$R xA2 u +$r x93 $R +r x74 $y +r x72 r +r x72 +r ^x -7 +$r x63 +$r x62 +r x61 $s +r x61 +4 +r x61 ^@ +^r x61 +r x53 +0 +r x52 +3 +$r x51 l +r x51 ] +r ] x51 +$r x51 +^R x42 +r x41 y4 +$r x37 $g +r x28 u +$r x25 ^L +r x25 +r x24 r +^. r x21 +r x14 r +^R x13 +r x12 p1 +^R x12 o89 +r x05 p4 +$r x03 $l +$R x02 y2 +$r $x +$R $w E +r $w +6 +$r $v ^8 +r $v -5 +^R u y3 +$R u xA2 +r u x28 +r ^U sUT +$R u r +$r u r +r u p1 +^R u -1 +] $R u +r u +$r $u +^r u $! +^r $! u +^r t Z4 +r t Y3 +r t $9 +} r T8 +$$ $r T5 +r t *20 +r T2 { +$r T2 +r T1 +$R t +^R $t +r $s x61 +$r stx +^r ssq +$r sry +r slt +r sl4 $3 +r $s i51 +r sev *72 +r sdj +r sAQ f +r ^S *73 +r s2z +^r s1t .1 +r s1t +$R $S +$r ^s +r $r z1 +$r $R x93 +$R r u +$r r u +$R r o4z +r ^r i2m +r R4 R4 +r R3 R3 +r R0 +^R $R +$r } $R +$r q z1 +$r q y1 +r ^? q +r ^q +r ^p x71 +^R p5 x02 +r ^p *56 +r $p -5 +r p4 x0A +r p3 x0A +r p3 x08 +r p3 x04 +r p3 *B9 +r p1 u +^r p1 o0J +r ^P +$r $P +^r ^P +r ^p +$r $p +^r ^p +r $O Z2 +$r oAo +r o9c } +^r o8z +r o8Y +^r o8t +0 +$R ^+ o8s +r o8O +^R o84 +r o8$ +r o7y o3. +r o7w +r o7t *14 +r o7t +r o7r +r o7o y2 +r o7! o2m +r o7+ ^h +r o79 +r o7# +r o7* +r o7_ +r } o6T +$r o6p +r o6o +r o6m +r o6j ^d +^R o6i +r o6i +$R o6E +^r o62 +r o5l +r o5j d +^r o5j +7 +r o5f ,3 +r o5E +r o5@ +^r o5, +$R o4z r +r o4T *84 +^R o4K +r o4g *17 +^R o4c K +r o4C f +r o4* +r o4$ +^R o3Y +r o3. o7y +r o3C +r o37 +r o30 l +r o3! +r o3 +^r o2r +^R o2P i4T +r o2m o7! +^r o2j +^r o2g +r o2f +^r o24 +^R o23 +^r o1w +$r o1t +^r o1q +r o1m +r o1e +r o16 +$R o10 +$r o0Z Z5 +r o0M +$r o0H ^Z +r o0G p4 +r o0E +r o0. $d +$r o0b y1 +r o0$ ^% +^r ^O +$r $o +^r ^n Z2 +$R ^M c +r $m *21 +$r $M +$r ^m +$r l x51 +$r $l x03 +r l o30 +$r L7 *63 +r L6 } +r L4 ^f +^r $l +3 +r L2 i4m +^R $l +$r $l +^r $l +r ^k z1 +r ^K y1 +$R $K t +^R K o4c +r K k +r k K +$r K i5a +r k i4/ +$r K i3n +^R K i0C +r $k *48 +r K .2 +$R $K +$R ^K +^R $K +^R ^K +$r K +[ r K +[ $r K +r ^k +$r k +^r ^k +$r iAB +$r i9A +r i7d +r i7- +r i6x } +^R i6N +^R i6n +^r i6j +$r i6- +r i5x +$r i5s +^r i5n +r i5k '9 +r i5k ] +r ] i5k +$R i5i +r i5I ] +r ] i5I +^r i5h +r i5g $6 +$r i5a K +r i5a +$r i5a +r i57 +r i55 +r i52 Y1 +r i51 x63 +r i51 $s +^r i4z +^r i4w +^R i4T o2P +^r i4t +$R i4S c +^R i4p +r i4n +r i4m L2 +^r i4l +r i4/ k +r i4& D9 +r i4d +r i4B +r i42 +r i4. +r i4_ +r i3v +^R i3t o4t +r i3q +r i3n x63 +$r i3n K +r i3h +r i3e +r i3a +r i30 *31 +^R i3_ +^. r i3. +r i2r $1 +^R i2M +^R i2F +] r i2f +r i2d +r i25 *62 +$r i24 +r i22 +r i20 -0 +^r i1w +r i1m z3 +^R i1c +r i1C +r i15 +r i11 +^r i0u Y2 +^R i0. ^M +^r i0K +^R i0G +r i0c ^s +^R i0C K +r ^_ i0c +r i01 *35 +$R $i +^r ^i +r ^H +r ^h +$r $g x37 +r $g ^b +r $g ^1 +^R ^G +r ^g +r f x96 +r f x59 +r f x53 +r f ^x +r f sAQ +r ^f +$r $f +$R E $w +^r E +7 +r ^E +$r E $! +$r $! E +r ^D y3 +r ^d x53 +r d $x +r $d o0. +$\ r D8 +r D7 r +r D7 ^n +$R D7 +^R ^D $7 +^r D7 +^r ^d +7 +r D6 ^f +r D6 -5 +r D6 *46 +r D5 D6 +r D5 ] +r ] D5 +r D4 p1 +r D3 p2 +r D3 i01 +r D3 *50 +r D3 +$r D3 +r D1 i3q +r D1 -3 +[ r D0 +^R ^D +$R $d +$R ^d +^R ^d +r c T6 +r C r +r $C ^B +r c $6 +$R ^c +r ^C +$r $C +$r ^C +r { c +r ^! c +RB xA1 +RB x91 R9 +RB x54 R7 +r $b t +RB oAA +r ^b $g +RB D5 c +r ^b d +RB c D5 +r ^B $C +RB $@ +r ^b { +[ r ^b +RA z1 $X +RA Z1 +RA y1 c +RA $X z1 +RA u -A +^r 'A ^u +RA RA x73 +RA RA x04 +RA RA l +$* RA RA +RA R9 ,8 +RA o91 +RA l RA +RA iA3 +RA i6s +RA -A u +RA ,8 R9 +r 'A -7 +RA *69 +r *A6 *79 +r $A *31 +RA $3 +r $A +3 +r ^A *15 +] $! RA +^R ^A +$R $a +^R ^a +R9 Z2 D2 +r $9 Z1 +r '9 ^u +R9 T4 T0 +R9 T0 T4 +r $9 t +R9 ^S o1e +R9 p2 ,A +R9 D7 *56 +R9 D2 Z2 +R9 *81 +r *97 +R9 *56 D7 +$= R9 +^$ R9 +r .8 Z1 +R8 Y1 +{ R8 Y1 +^% R8 x53 +R8 x01 R7 +$r ^8 $v +R8 R8 x52 +R8 R8 [ +R8 o7z +$) R8 i8( +R8 i4t +R8 C +6 +R8 *78 +^r *86 x61 +R8 +6 C +^ r *85 +r *84 *62 +r *84 *57 +r +8 -4 +r *80 } +$. R8 +^` R8 +r $8 +$r ^8 +} ^r '8 +R7 Z1 ^u +R7 $@ Y1 +R7 x82 sfG +R7 x43 +R7 x25 d +R7 x15 q +R7 ^u Z1 +R7 t '8 +R7 t +R7 sfG x82 +R7 s2s +r '7 ^q +^r +7 o5j +R7 o5a +R7 o4P ] +R7 ] o4P +R7 o2a +R7 o18 +R7 i7k +R7 i7B +R7 i72 +R7 i3# +^r +7 E +^R $7 ^D +R7 c $$ +R7 $$ c +r -7 'A +r *79 *A6 +r *79 *53 +R7 $9 +R7 '8 t +R7 ,8 K +r *76 *79 +r *76 *41 +r *75 +3 +R7 -4 -4 +R7 $4 +r *72 sev +^. r *72 +R7 $1 +R7 *04 +R7 ] +R7 ^! +{ R7 $. +{ $. R7 +$r $7 +^r .7 +R6 Z5 u +R6 Y4 +R6 y2 t +R6 x42 +R6 x32 .3 +R6 x05 +r +6 $w +R6 u Z5 +R6 t y2 +R6 t o5y +R6 t .5 +R6 t [ +R6 [ t +R6 s7b t +R6 s40 +R6 s0# o7& +R6 } ^S +R6 r o3/ +R6 R7 +R6 o7& s0# +R6 o78 +R6 o4y d +R6 o4v +R6 o38 +R6 i6s +r $6 i5g +R6 i42 +R6 i4[ +{ R6 i3z +R6 i3. ^8 +r $6 f +r '6 d +r $6 c +r *68 -1 +R6 '8 +r *67 r +R6 +7 +r *67 +^r *67 +R6 .5 t +r *65 +2 +$r *63 L7 +r } *63 +r *62 K +r *62 *84 +r '6 .1 +R6 *02 +R6 $$ +$! [ R6 +{ R6 +$r $6 +R5 z3 t +R5 Z2 x41 +R5 y5 y5 +R5 Y2 x02 +R5 x41 Z2 +R5 x41 +R5 x02 Y2 +r -5 $v +R5 t z3 +R5 su1 +R5 R6 R0 +R5 R6 *75 +R5 R5 Z1 +R5 R5 Y1 +R5 R5 ] +R5 ] R5 +R5 R4 o0f +R5 R4 *13 +R5 R3 *48 +R5 R2 k +R5 R0 R6 +r -5 $p +R5 o6S +R5 o6n +R5 [ o5l +R5 o34 x02 +R5 o28 +R5 o23 +R5 o2& +R5 o0m +R5 o0k y2 +R5 o0f R4 +R5 o03 *51 +R5 k R2 +R5 i6b +R5 [ i64 +R5 i53 +R5 i40 *26 +R5 d T0 +r -5 D6 +R5 D4 R4 +R5 D3 +r *59 x53 +r *57 *84 +R5 *75 R6 +r *57 -0 +R5 '6 +R5 +5 +2 +R5 *51 o03 +R5 *48 R3 +R5 *46 *35 +] R5 *41 +R5 ] .4 +R5 .4 ] +r *54 +r *53 *79 +R5 *35 *46 +R5 *35 .0 +r *53 *24 +R5 ^3 +R5 +2 +5 +R5 *13 R4 +R5 .0 *35 +R5 ^0 +r *50 +{ ^r .5 +^r -5 ^! +R4 Z2 x54 +r $4 Z2 +R4 Z1 .2 +R4 y2 k +r +4 x61 +R4 x54 Z2 +R4 ^V *31 +R4 ss2 p4 +R4 siO c +R4 scm +R4 s58 +[ R4 R4 +R4 p4 ss2 +R4 p4 $3 +R4 o8A +R4 o6t +R4 o6c +R4 [ o5d +R4 o59 i4e +R4 o54 +R4 o5) +R4 o37 +R4 o2y +R4 o2@ +R4 o13 +R4 o0A +R4 o08 +R4 $n [ +R4 [ $n +R4 k ^G +R4 i6W +R4 i6/ +R4 i5n +R4 i5L +R4 i57 +R4 i51 +0 +R4 i4# .6 +R4 i41 ^b +R4 D5 i4y +R4 C +$r *49 +r *48 $k +R4 *85 r +r -4 +8 +R4 -7 +r *46 Y5 +R4 ,5 i53 +$R *45 *43 +R4 .2 Z1 +r } *42 +r *41 *76 +R4 *16 .6 +^. r *41 +R4 +0 i51 +$r } *40 +R4 $# +$@ R4 +$? R4 +r +4 +r -4 } +R3 Z4 Z4 +R3 Z2 o28 +R3 y4 +r ,3 Y2 +r +3 x52 +R3 t *21 +{ R3 t +r $3 sl4 +R3 si3 +R3 ^S +R3 R5 +R3 R4 +{ R3 R3 +R3 R2 +r .3 r +R3 ^q +R3 p5 o7? +R3 o7v +r ,3 o5f +R3 o4! +R3 o2g ^@ +R3 o28 Z2 +R3 o2@ +R3 o0X +R3 ^m +^r +3 $l +R3 i5h +R3 i4r +R3 i44 +R3 i3f +R3 i38 +R3 i35 +R3 i33 +R3 i2l +R3 i24 +R3 E .4 +r +3 $A +$. R3 *83 +r *37 Z1 +r +3 *75 +r *36 Z1 +R3 +6 ,4 +R3 *54 +0 +R3 $5 [ +R3 [ $5 +r *35 +R3 .4 E +R3 ,4 +6 +] R3 *46 +r *34 *05 +$r *34 +^r *32 ^g +R3 *21 t +r *31 $A +{ R3 +1 +R3 +0 *54 +R3 { $! +$. R3 +r +3 $! +r $! +3 +r ,2 Y1 +r -2 y1 +R2 x02 +R2 ^T +R2 t ] +R2 ] t +R2 r d +R2 R2 y2 +R2 p5 Y2 +R2 p1 c +R2 $o o6Z +R2 o7q +R2 o6Z $o +R2 o3h K +R2 o34 } +R2 o3* +R2 o1f +R2 o0V +R2 o0R *37 +R2 ^n x51 +R2 L5 p1 +R2 K o3h +R2 K +0 +r .2 K +R2 i52 +R2 i3z *10 +R2 i3w +R2 i36 +R2 i26 +R2 i24 +R2 i21 +R2 i1z +R2 i0D +R2 d r +R2 D5 +R2 *97 +r +2 *65 +r *24 *53 +R2 *37 o0R +r *21 $m +R2 *10 i3z +r *20 t +R2 +0 K +R2 { +$R $2 +$! R2 +} R2 } +r .2 +] $r .2 +R1 z2 +R1 z1 +R1 Y4 Y4 +R1 y2 +^R -1 u +^r .1 s1t +R1 o6n k +R1 o55 l +R1 o4h y3 +R1 o2P +R1 l o55 +R1 k o6n +R1 K +R1 i4l +R1 i3R +r $1 i2r +R1 i27 +R1 i25 +R1 i1k +r ^1 $g +R1 C z2 +r } *19 +r *17 o4g +r -1 *68 +r .1 '6 +} r *16 +r *14 o7t +R1 *26 +R1 ,2 +R1 *15 y3 +R1 $1 +R1 .0 +R1 $) +$R ,1 +r { -1 +r -1 +{ ^r ,1 +^r -1 +R0 y4 y4 +R0 y4 +R0 Y2 ^& +R0 ^& Y2 +R0 { y2 +R0 ^@ x53 +r +0 x53 +R0 x51 o3s +R0 x45 i6N +R0 T1 +R0 sea { +R0 { sea +R0 sb; +R0 R1 +^r +0 o8t +R0 o7y +R0 o50 +R0 o4Y +R0 o3s x51 +R0 o2l o1t +R0 o1t o2l +R0 o1t .4 +R0 k ^M +R0 ^J +R0 i4J { +R0 i3- +r -0 i20 +R0 i1j +R0 i17 +R0 ^F +R0 E r +R0 D5 +R0 ^c +R0 'A *05 +[ $R *09 +r *08 } +R0 { *75 +r *07 .0 +r -0 *57 +r *05 *34 +R0 .4 o1t +$% R0 -3 +R0 *21 +R0 .2 ,1 +r *02 *07 +R0 *16 +R0 ,1 .2 +R0 *05 'A +R0 $? +R0 ^@ +R0 ^! +$$ R0 +$! R0 +r +0 } +$r -0 +$$ ^R +$. ^R +^R $* +^R ^@ +^@ ^R +^! ^R +^- ^R +^_ ^R +r $. ^+ +r $- +r { $, +r ^+ $. +r ^@ +r ^. +$\ [ r +$$ [ r +$$ r +{ r $? +{ $r +{ { r +] $r +[ $\ r +[ $$ r +^r $@ +^r ^@ +^@ r +^- ^r +^ r +q z5 x76 +$Q Z5 x07 +$q Z4 u +^Q z4 +q Z3 y1 +$q Z2 r +^q z2 .A +$q Z2 *32 +$Q Z2 } +^. ^q z2 +q Z1 x12 +$q Z1 u +$q Z1 *51 +q ^Z +q ^z +$q $z +[ q $z +$q ^y p5 +^Q Y5 s8q +q Y5 +^q y4 x71 +q Y4 $O +$Q y4 i52 +q y4 *65 +q y4 *56 +$Q y4 +q y3 x74 +q y3 x65 +$q Y3 +^q Y3 ] +$q y2 y4 +^q y2 +2 +$Q y2 -0 +q y2 $. +q $. y2 +^q y2 +q y1 Z3 +q Y1 x15 +$q Y1 x06 +^q y1 K +$q Y1 i7Q +$Q Y1 D1 +^Q y1 'B +$q Y1 *43 +] q Y1 +$_ $q y1 +^q ^y +q xB8 c +q xB3 x06 +q xA1 o9o +q x95 D4 +q x93 xA2 +q x82 E +$Q x81 +q x75 *24 +q x72 *86 +q x68 o4y +q x67 +q x65 x01 +q x64 sKm +q x63 *62 +^q x61 *02 +q x58 $l +$q x52 +^q x51 o7h +q x4B i1m +q x4B *05 +q x49 ^# +q x46 *85 +q x46 -7 +q x46 *20 +q x45 $U +$@ q x45 +q [ x42 +q x38 *31 +q x36 ,2 +$q x34 +q x32 $1 +$q x32 +^q x32 +q x31 t +q x31 l +q x31 *57 +q x28 *31 +q x26 se, +q x25 i0s +q x24 *30 +q x21 T0 +q x18 *20 +q x15 Y1 +q x15 o2# +$q x15 K +$Q x14 +q x14 +q x12 Z1 +q x09 i34 +$Q x07 Z5 +$q x06 Y1 +$q x05 +^Q ^X +q $x +$q $x +^q ^w L3 +$q u Z4 +$q u Z1 +q $U x45 +$Q $U +^Q u +q t x31 +q TA +q T0 x21 +$q $T +$q ^t +^q $t +$q smy +q sKm x64 +q se, x26 +^Q s8q Y5 +$q s82 [ +$q [ s82 +q s6b +q s3w $. +q $. s3w +q s2 *42 +^Q ^S +$Q ^s +q $s +$q $s +$q r $g +^q r D5 +$q R3 +q r +^q ^r +q q $q +$Q $q *51 +$Q $P +$Q oA1 o4b +q o9o xA1 +^q o95 +$q o8Q +q o8A x08 +q o6. i07 +$q o5z +^q o5s i1w +q o5g x14 +^q o59 z1 +q o4y x68 +q o4T +$Q o4b oA1 +$q o47 +$q o45 +$; q o3X +$q o3l +$q o38 +q o2f o0c +q o1z +^Q o1U +^q o1i +q o0P 'A +q o0c o2f +q o0A $a +$q $o +q ^M $1 +$q ^M +^q ^M +$q ^m +$Q $l Z1 +q $l x58 +q l x31 +q l o7D +q l D3 +$q L8 +$q L4 Z3 +^q L0 z1 +^q k Y4 +^q K y1 +$q K x15 +^q K *20 +$q k +q ^J $9 +q iB2 +$Q i9q +q i9A xA4 +$q i7Q Y1 +$Q i6z +^q i6y +$q i6o +$q i5z +$q i5s +^q i5p +q i5H +$Q i4p +$q i4i +$q i49 +q i4. -2 +q i4- +^Q i3V +^q i3o +^q i3j +$q i3c +^q i2W +$q i2h +$q i2g +^q i1n +$Q i16 +^q i0n +^q i0m *35 +q i0h i1H +^Q ^I +q $i +q ^H $h +q $h ^H +^Q ^G +$q ^g +^Q f x31 +^q f *25 +q ^F +^q ^f +q E x82 +^q ^e i88 +$Q E -8 +$q $e +$q ^e +q DB +q DA x23 +q D8 D0 +q D8 *24 +q D7 +q D6 D3 +q D5 *45 +{ $q D5 +q D4 o75 +q D3 l +^q D3 i02 +q D3 D6 +q D2 -A +$Q D1 Y1 +q D0 D8 +q D0 D3 +^Q ^D +$q $d +q c xB8 +q $C $c +q c *82 +q c ] +q ] c +q *B8 x08 +^q *B5 *68 +^q *B3 +q *B2 *81 +q *B0 -9 +q *B0 *38 +$Q $B +q $b +q 'A o0P +q $a o0A +$Q ^A c +$q *A5 *86 +q '9 x21 +q $9 ^J +q -9 *B0 +q *9A x18 +q *97 *31 +q *92 *65 +$Q $9 +q $9 +$Q -8 E +$q *86 *A5 +$Q *86 +q *85 +q *82 c +q *81 *B2 +$Q $8 +$q $8 +$q ,8 +q +7 x23 +[ ^q *74 +q *71 o1a +^- $q *70 +^Q ,7 +^q *68 *B5 +^q *65 ^q +^Q *65 i0Q +q *65 *92 +^q *61 +$Q ,6 +$Q -6 +^Q +6 +^q +6 +^q .6 +^q *59 y1 +$; ^q *52 +$q *51 Z1 +$Q *51 $q +q $5 +q ^5 +^Q *47 y1 +q *47 x15 +^q *46 +$q *43 Y1 +q *42 s2 +$q *40 $# +$q $# *40 +$Q +4 +q $4 +$q -4 +^q $4 +q *38 *B0 +q *37 x01 +^q *37 +q *35 f +$q *32 Z2 +q *31 *97 +$Q +3 +$q .3 +$q ,3 +^q $3 +^q ^3 +q ,2 x36 +q -2 i4. +^q +2 i2w +q *24 x75 +q *24 D8 +q *20 x46 +^q *20 K +^q *20 +$q ,2 +q $1 x32 +q $1 ^M +q *16 x14 +$q *15 i5p +^q *13 +q $1 $* +q *09 +^q *02 x61 +$q +0 +$q -0 +$Q $? +$+ ^Q +$/ $Q +^@ $Q +q $@ +$q $+ +$q $* +$q $$ +$q { +$q ^* +$* q [ +$$ q +$. q +{ $q +^q $& +^+ q +^@ $q +^@ ^q +] ^P z5 +^P z5 ] +^P ] z5 +^p Z3 Z3 +$p z2 +1 +$p Z2 [ +$p [ Z2 +^p z2 +$p Z1 x62 +$P z1 ^k +^P ^z +^p $z +$p $y .7 +[ ^p y5 +$p Y4 Z2 +$p Y4 +^p Y4 +$p y2 $p +^P Y2 ^C +^p y2 *63 +^p y2 *36 +^P Y2 +] ^P y2 +$p Y2 +$p Y1 i8v +$P Y1 $@ +$P Y1 +^P $y +$p $y +^p $y +$P xB2 u +$p x91 +$p x62 Z1 +^P x53 o2G +$p x43 +$p x42 +^P x24 o44 +$p x23 +$p x21 +^P x08 +^P ^w t +$P $W +^P $W +^P ^W +$p $w +$p $v +$P u xB2 +^P u r +$P ^U +$P ^u +^P ^u +$p $u +{ ^p ^u +^p t i1e +^p t D8 +$P $T +^P $t +^p stq +$p spt *21 +$P saX +^p $s *28 +^P r u +^P r i2H +$P r ^H +$p R4 *30 +$P ^r +1 +^P ^R +$p ^R +$p r ] +^p r +$P $Q *41 +^P ^Q +$p $p y2 +^p p4 $Q +^p p4 i5v +^p p3 i6p +^P p3 +^p p2 ,8 +$p o7w +^P o7# E +^p o70 +^P o6e +^p o6b +^P o5q +^p o55 +^p o52 +^p o5` +^P o4v x12 +^p o4G +$p o4b +^P o3V +$p o3p +^P o2n c +^P o2G x53 +^P o2@ +$p o2& { +^P o1G +$p o1c +$p o1a +^p o1a +$p o15 +^p o14 c +$p o13 +^p o13 +^p o1. +$p o0m +{ $p o0m +^p ^N ^d +$p ^N +$p ^n +^p $n +$P ^M +^P $M +$P $m +} ^p $m +^p $m +$P $L D7 +^P l ,4 +$P ^L +^P ^L +$P $K +$P $k +^P ^J $5 +$p ^J $1 +^p $j +$p ^i x12 +^p i88 +$P i7o +^p i72 i7p +^P i6T *71 +$p i6s +$P i6o +^p i6m +$p i6H +$p i5t +^p i5L +$p i55 +^P i5. +^p i5- +$P i4p +^p i4m +^p i4h +^p i4@ +^p i4- +^P i3T +^P i2Z +$p i2z +$p i2x +^P i1V +$P i1g c +^P i1G +$p i1d +^P i0X +^P i0V +^p i0u +^p i0j ] +^p ] i0j +^p i0i +$p ^G +^p ^g +^P ^F +^P E o7# +^P ^E +$P $e +^p d C +^p D8 t +$P D7 $L +$p D7 +$P $d +$p ^D +$p $d +^P ^C Y2 +^P c o2n +^p c o14 +$P c i1g +^p ^C +^p $c +^p ^c +$P ^B +$P $b +^p $B +^p ^B +$P $a +^p -A +^p $9 Y1 +$p *92 +$p *85 +^p *85 +^P $8 +$p -8 +$p .7 $y +^p *72 +^P $7 +$P .6 *40 +$p $6 +p5 Z3 ^a +p5 y2 slx +p5 y2 sa, +p5 y2 $m +p5 xA8 o99 +p5 x13 +p5 x0A *76 +p5 ^w -4 +p5 $v *30 +p5 swp i9m +p5 slx y2 +p5 sa, y2 +p5 $S *A7 +p5 ^P *46 +p5 ^O o1o +p5 oBx +p5 o99 xA8 +p5 o6U o4G +p5 o5t $4 +p5 o4. ^i +p5 o4G o6U +$& p5 o2y +p5 o2b *60 +p5 o1s *73 +p5 o0y +5 +p5 o0g ^e +p5 $m y2 +^P $5 ^J +p5 ^i ^B +p5 i9W xAB +p5 i9m swp +p5 i7l $2 +p5 i6a *06 +p5 i5 $v +p5 i54 $e +p5 i42 C +$_ p5 i3d +p5 i1t u +p5 i1B ^9 +p5 i0p D2 +p5 $H $1 +} p5 $g +p5 $e i54 +p5 ^D +5 +p5 C i42 +p5 $a Z4 +p5 ^a Z3 +p5 *A7 $S +p5 *A7 +p5 } *A7 +p5 *96 } +p5 ^! +9 +p5 '8 Y5 +p5 { *7A +p5 *74 *02 +p5 *73 o1s +p5 +6 i5 +p5 *6B *34 +p5 *60 o2b +p5 +5 o0y +p5 $4 o5t +p5 *34 *6B +$p *53 *27 +p5 *30 $v +$p *53 +p5 $2 i7l +p5 *24 [ +p5 $ ^1 +p5 ^1 $ +p5 *02 *74 +p5 ^] ^[ +} ^p -5 +[ p5 +p4 $\ Z4 +p4 Z2 -4 +p4 $% Z2 +p4 z1 { +p4 { z1 +p4 Y3 +p4 Y2 i6f +p4 Y1 $K +p4 y1 i1_ +p4 y1 { +p4 { y1 +] p4 x7B +p4 x71 i18 +p4 x45 'A +p4 x34 x8A +p4 x08 x48 +p4 x05 $v +p4 $v x05 +p4 ^v o6y +p4 $u ^P +p4 T5 o4W +$@ p4 ssc +p4 sov *46 +p4 s n +p4 s5a +p4 r $z +$- p4 $r +p4 $q D0 +p4 $q [ +p4 ] $q +p4 [ $q +p4 ^P $u +p4 o95 o0T +p4 o8u $1 +$\ p4 o8q +p4 o8. ,6 +p4 o7T E +p4 o7G $3 +p4 o7c *63 +p4 o6o u +p4 o6b *02 +p4 o6 $6 +p4 o5 'B +p4 o4W T5 +p4 o4m y2 +p4 o4i x31 +p4 o2r $@ +p4 $@ o2r +p4 o1c .6 +p4 o1% C +p4 o0T o95 +p4 o0E ,5 +p4 $m ^a +^P ,4 l +p4 $J Z2 +p4 ^j } +p4 i9# D6 +p4 i7d +p4 i6z y2 +p4 i6f Y2 +p4 i5y $0 +p4 i5 T6 +p4 i5a *47 +[ p4 i0a +p4 i04 +p4 $G +p4 ^e ^v +p4 E i6F +p4 ^e +4 +p4 E { +p4 D7 i5U +p4 D7 ,3 +p4 D0 $q +p4 $D +p4 C o1% +p4 'B o5 +p4 'B +p4 'A ^s +p4 ^a $m +{ p4 ^a +} p4 '9 +[ p4 '8 +p4 ,6 o8. +p4 .6 o1c +p4 .6 i71 +p4 *63 o7c +p4 ,5 o0E +p4 ,5 +p4 -4 Z2 +p4 *46 sov +p4 $3 o7G +p4 ,3 D7 +p4 -2 *B2 +$P *41 $Q +p4 $1 o8u +p4 *13 y5 +^p ,4 ,1 +p4 $0 i5y +$P *40 .6 +p4 *02 o6b +^P -4 +$* p4 $^ +p3 $Z [ +p3 [ $Z +p3 y3 $a +p3 $y -3 +p3 Y2 x8A +p3 y2 s83 +p3 Y1 x09 +p3 xBA sNA +p3 xB4 o8= +p3 xB1 ] +p3 ] xB1 +p3 xAB s40 +p3 x92 x03 +p3 x91 $6 +p3 x8A Y2 +p3 x83 *02 +p3 x81 x41 +p3 x7B t +p3 x78 u +] p3 x76 +p3 x72 -2 +p3 x62 o6/ +p3 x5B x76 +p3 x5B t +p3 x14 +p3 x09 Y1 +p3 x09 ^a +p3 x08 sdl +p3 x07 ] +p3 ] x07 +p3 x01 $m +p3 x01 *BA +p3 ] $v +p3 u x78 +p3 t x7B +p3 t x5B +p3 $t o7c +p3 t o0v +p3 t 'A +p3 T3 o2A +p3 T0 i6K +p3 T0 'B +p3 sNA xBA +p3 sln o6v +p3 sgb $Q +p3 sdl x08 +p3 s83 y2 +p3 s7. +p3 s40 xAB +p3 s*. +p3 r x0A +p3 r x04 +p3 r *B9 +p3 $r [ +p3 [ $r +p3 $Q sgb +p3 ^Q 'A +p3 $p i9P +p3 oBx +p3 oAt x54 +p3 o8= xB4 +^! p3 o7o +p3 o7c $t +p3 o76 i83 +p3 o6v sln +p3 o6f 'A +p3 } o6$ +p3 o5x *46 +p3 o5u *32 +p3 o5f *12 +p3 o4x ] +p3 ] o4x +p3 o4! K +p3 o3W '9 +p3 o34 *43 +p3 o2A T3 +p3 o1o +7 +p3 o0L +p3 o0e +p3 o0b $$ +p3 $$ o0b +p3 $m x01 +p3 ] $m +p3 l 'B +p3 K o4! +p3 $K $5 +p3 $k *45 +p3 iA5 x14 +p3 i9P $p +] p3 i9- +p3 i8G c +p3 i8c i9c +p3 i83 o76 +p3 i7d +8 +p3 i6K T0 +p3 i5l +6 +p3 i09 x53 +p3 ^F $4 +p3 E i2C +p3 ] ^e +p3 ^e ] +p3 d o0H +p3 DB ] +p3 ] DB +^P -3 ^C +p3 } ^c +p3 'B T0 +p3 'B l +p3 'B i9R +p3 'B .4 +p3 'B +p3 'A y4 +p3 $a y3 +p3 'A t +p3 'A o6f +p3 'A $i +p3 [ *AB +p3 .A .2 +p3 'A $_ +p3 'A +p3 '9 o3W +p3 '9 ^M +p3 '9 $5 +p3 *80 *32 +p3 +7 o1o +p3 $! ,7 +p3 ,7 $! +$p *37 +p3 $6 x91 +p3 .6 ^s +^P *36 +p3 *53 *10 +p3 $4 ^F +p3 .4 'B +p3 *46 o5x +p3 *45 $k +p3 .4 *24 +p3 -3 $y +p3 +3 i2r +p3 *32 o5u +p3 *32 *80 +p3 -2 x72 +p3 .2 .A +p3 $1 Z3 +p3 *12 o5f +p3 *10 *53 +$p *30 R4 +^p *30 i2a +p3 *02 x83 +$ p3 $0 +$p -3 +$, p3 $; +$, p3 +^# p3 } +^# } p3 +p2 $z Z1 +p2 Z2 xB9 +p2 $+ Z2 +p2 $) Z2 +p2 Y3 +p2 Y2 x94 +p2 Y1 ^r +p2 xB9 Z2 +p2 xB9 x02 +p2 xB7 t +p2 xB5 +[ p2 xB2 +p2 xA9 x05 +p2 x98 o5@ +p2 x95 u +p2 x95 +7 +p2 x95 +p2 x94 Y2 +p2 x93 x13 +p2 x93 t +p2 x8A x32 +p2 x8A u +p2 x89 t +p2 x87 -6 +p2 x85 t +p2 x83 x83 +p2 x7B E +p2 x7A i0h +p2 x79 x78 +p2 x78 x98 +p2 x78 x79 +p2 x73 x39 +p2 x6A t +p2 x6A o5A +p2 [ x69 +p2 x64 'B +p2 x63 i6t +p2 x59 .4 +p2 x53 u +p2 x53 o5u +p2 x4A u +p2 x48 t +p2 x42 $2 +p2 x3B +] p2 x3B +p2 x38 ] +p2 ] x38 +p2 x2B +p2 x29 D4 +p2 x28 x78 +p2 x27 o0c +p2 x23 x6B +p2 x23 'B +p2 x1B *72 +p2 x1A k +p2 x1A +p2 x18 y2 +p2 x15 'A +p2 x0A ^s +p2 x08 t +p2 x07 x8A +p2 x07 i7/ +p2 $w Z2 +[ p2 ^w +p2 $V $D +p2 u x95 +p2 u x8A +p2 u x53 +p2 u x4A +p2 $u ^s +p2 u ^L +p2 $t Z1 +p2 $t Y1 +p2 t xB7 +p2 t x93 +p2 t x89 +p2 t x85 +p2 t x6A +p2 t x48 +p2 t x08 +p2 t i57 +p2 ^t ^g +p2 TB TA +p2 TA TB +p2 T7 DB +p2 T2 $7 +p2 ^s $u +p2 ^s ^S +p2 slF E +p2 si1 R5 +p2 s8+ ] +p2 ] s8+ +p2 s1c +p2 ^r Y1 +p2 r x04 +p2 r x02 +p2 r $q +p2 R5 si1 +p2 ^p r +p2 ^p L0 +p2 oAj +5 +p2 o9u Y4 +p2 o9u -6 +p2 o99 +p2 o6x -2 +p2 o6O +3 +p2 o5@ x98 +p2 o5t +0 +p2 o5A x6A +$@ p2 o2z +p2 o1@ ^G +p2 o0c x27 +p2 ^N ^T +p2 $m Z2 +p2 ^m x1A +p2 ^L u +p2 l 'B +p2 ^l +p2 ^k ^e +p2 $j i8J +p2 iAx +p2 iAm x12 +p2 i8J $j +p2 i5n '9 +p2 i57 t +p2 i5 +p2 i4$ +p2 i0z +p2 i0p L0 +p2 i0k +p2 i0a $- +p2 $- i0a +p2 $h ^E +p2 ^g x1B +p2 $G ^g +p2 ^g $G +p2 ^g $3 +p2 E x7B +p2 ^E $h +p2 E ] +p2 ] E +p2 $e ^@ +p2 ^@ $e +[ p2 $e +p2 DB Y3 +p2 DB T7 +p2 DB +7 +p2 D8 'A +p2 ^d ^5 +p2 D3 x79 +p2 D1 o3i +p2 d +[ p2 $d +p2 C 'B +[ p2 c +p2 'B Y3 +p2 'B l +p2 $B $K +p2 'B C +p2 'B *64 +p2 'B -4 +p2 $! -B +p2 'B { +p2 -B $! +p2 $a Z5 +p2 $A Z3 +p2 .A y4 +p2 $A ^a +p2 ^a $A +p2 $a ^a +p2 ^a $a +p2 'A *59 +[ p2 $a +p2 '9 -7 +p2 +9 -1 +^p *28 $s +^P *28 +p2 +7 x95 +p2 $7 T2 +p2 +7 DB +p2 -7 '9 +$p *27 *53 +p2 -6 x87 +p2 -6 o9u +p2 *6A x7B +p2 *64 'B +p2 $6 +p2 +5 oAj +p2 *59 'A +p2 -4 'B +$P *24 +p2 +3 o6O +p2 $3 ^g +p2 *3B x6B +p2 *32 { +p2 $2 x42 +p2 -2 o6x +p2 *28 +$p *21 spt +p2 -1 +9 +p2 +0 o5t +p2 $0 +$P $2 +p2 $. +p2 $! +p2 $- +$\ p2 ] +$, p2 ] +] p2 ] +] p2 ^* +[ p2 $* +p1 ^z ^Z +p1 Z4 +p1 z3 *41 +p1 z3 *14 +$- p1 Z1 +p1 $z +p1 ^y ^N +p1 Y5 *20 +p1 Y5 *02 +p1 Y3 x07 +p1 y3 .4 +[ p1 Y3 +p1 Y2 t +p1 y2 +9 +p1 Y1 ,6 +p1 ^X x15 +p1 xB2 *46 +p1 xAB c +p1 xA9 +6 +p1 xA7 t +p1 xA4 C +p1 xA3 t +p1 xA2 x03 +p1 xA2 oAO +p1 x96 -6 +p1 x95 E +p1 x93 [ +p1 x87 ,9 +p1 x84 K +p1 x81 xA4 +p1 x7A +p1 x76 ssd +p1 x76 +p1 x75 x72 +p1 x72 x75 +p1 x72 .1 +p1 x68 t +p1 x68 K +p1 x67 u +p1 x67 l +p1 x67 k +p1 x64 c +p1 x62 DB +p1 x5A .A +p1 x52 u +p1 x49 ^a +p1 } x47 +p1 x41 u +p1 x41 C +p1 x39 c +p1 x38 +p1 x34 } +p1 x25 $1 +p1 x25 ] +p1 ] x25 +p1 x21 u +p1 x16 o0f +p1 x14 o0m +p1 x12 z2 +p1 x12 u +p1 x09 *89 +} p1 x08 +[ p1 x08 +p1 x07 Y3 +p1 x07 K +p1 x07 ,6 +p1 x06 x21 +p1 x06 sao +p1 x05 x94 +p1 x05 i3_ +p1 x04 u +p1 x04 t +p1 x04 *36 +p1 x02 o60 +p1 x02 *81 +p1 x02 $7 +p1 u x67 +p1 u x52 +p1 u x41 +p1 u x21 +p1 u x12 +p1 u x04 +p1 u $s +p1 u oB7 +p1 u oB3 +p1 u oB2 +p1 u o8U +p1 u o6H +p1 u o6E +p1 u o4U +p1 u ^M +p1 u ^L +p1 u ^K +p1 u i85 +p1 u i80 +p1 u i7Y +p1 u i6W +p1 u i65 +p1 u i5B +p1 u i51 +p1 u i4A +p1 u D0 +p1 u ^C +p1 u ,B +p1 u $b +p1 u $7 +p1 u +6 +p1 u *04 +p1 u $0 +p1 t Y2 +p1 t xA7 +p1 t xA3 +p1 t x68 +p1 t x04 +p1 t ^X +p1 $t t +p1 t s16 +p1 t $s +p1 t o5L +p1 t o0R +p1 t o0K +p1 t ^L +p1 t i83 +p1 t i80 +p1 t i6E +p1 t i5J +p1 t i41 +p1 t i0A +p1 t *BA +p1 t *B2 +p1 t +8 +p1 t +6 +p1 t ,6 +p1 t *54 +p1 t ,5 +p1 T3 +p1 T2 +p1 T0 $8 +p1 t *04 +p1 $s t +p1 ssm ] +p1 ] ssm +p1 ssd x76 +p1 sr; ] +p1 ] sr; +p1 smg u +p1 $s i5S +p1 sao x06 +p1 sae +p1 s8+ o3- +p1 s7. o4B +p1 s1Z +p1 s16 t +p1 s0v +p1 s0n T2 +p1 s0j +p1 s0g o4h +p1 s0. +p1 ^S +p1 ^s +p1 r x02 +p1 r p3 +p1 r E +p1 r c +p1 R7 u +p1 r $2 +p1 $Q [ +p1 [ $Q +p1 $q [ +p1 $# $q +p1 $q +p1 [ $q +p1 p3 r +p1 $p +p1 $O xB3 +p1 oBD +p1 oBB +p1 oB7 u +p1 oB3 u +p1 oB2 u +p1 oB0 +p1 oA7 +p1 oA2 x02 +p1 o9I DA +p1 o99 +p1 o98 +p1 o9! +p1 o8z +p1 o8v +p1 o8U u +p1 o8o 'A +p1 o8j +p1 o8a +p1 o7n '9 +p1 o7- 'B +p1 o78 +p1 o77 +p1 o76 +p1 o7. +p1 o6 x75 +] p1 o6s +p1 o6P t +p1 o6M +p1 o6H u +p1 o6E u +p1 o6a .7 +p1 o62 { +p1 o5i +p1 o5g *87 +p1 o56 +p1 o55 +p1 o54 +p1 o53 +] p1 o51 +p1 o4U u +p1 o4h s0g +p1 o4B s7. +p1 o43 +p1 o3s u +p1 o3- s8+ +[ p1 o32 +p1 o1t +p1 o0s +4 +p1 o0r u +p1 o0m x14 +p1 o0h K +p1 o0g +p1 o0f x16 +p1 o0B +p1 ^M u +p1 ^M +p1 l x67 +p1 ^L u +p1 ^l ^O +p1 l i01 +p1 L7 ] +p1 ] L7 +p1 l $7 +p1 l *36 +p1 l $3 +p1 $L +p1 K x84 +p1 K x68 +p1 k x67 +p1 k x15 +p1 ^k x14 +p1 K x07 +p1 ^K u +p1 K o0h +p1 K *31 +p1 ] K +p1 ^J i0j +$p $1 ^J +p1 iBy u +p1 iB, x06 +] p1 iBK +p1 iB; +p1 iB, +p1 i98 z1 +p1 i9; +p1 i8X t +p1 i8H t +p1 i85 u +p1 i83 t +p1 i80 u +p1 i80 t +p1 i8; +p1 i8, +p1 i7Y u +p1 i7y +p1 i7M +p1 i7j +p1 i7h +p1 i7C t +p1 i7= +p1 i6W u +p1 i6q t +p1 i6m +p1 i65 u +p1 i6? +p1 i6_ +p1 i6 $_ +p1 $_ i6 +p1 i5S $s +p1 i5B u +p1 i51 u +p1 i4k ^M +p1 i4A u +p1 i4a ^p +p1 i41 t +p1 i25 +p1 i1x x75 +p1 i1a -6 +p1 i0r +p1 i0m y1 +p1 i0A +p1 i01 l +p1 $h t +p1 $h $h +p1 ^G +p1 $F +p1 E x95 +p1 ^e i15 +p1 $E ^E +p1 ^E $E +p1 ^d i12 +p1 DA x76 +p1 DA o9I +p1 [ D7 +p1 D0 u +p1 D0 'A +p1 D0 +p1 ^c y1 +p1 c xAB +p1 C xA4 +p1 c x64 +p1 C x41 +p1 c x39 +p1 C x03 +p1 ^C u +p1 c T3 +p1 $c +p1 c +p1 'B $z +p1 ,B u +p1 'B o7- +p1 'B i75 +p1 *BA t +p1 *B2 t +p1 *B1 x36 +p1 { +B +p1 ^a z1 +p1 'A y2 +p1 'A o8o +p1 -A K +p1 'A -9 +p1 *A0 x38 +p1 } ,A +p1 ] $A +p1 $a [ +p1 [ $a +p1 $9 Z1 +p1 '9 o7n +p1 -9 'A +p1 .9 +8 +p1 *97 *04 +p1 *96 '9 +p1 *95 ,4 +p1 '9 *48 +p1 +9 -3 +p1 $8 T0 +p1 +8 t +p1 +8 .9 +p1 *87 o5g +p1 $7 Z1 +p1 +7 y2 +p1 $7 x02 +p1 $7 u +p1 .7 o6a +p1 $7 l +p1 ,7 +7 +p1 -7 +5 +p1 +7 *32 +p1 *71 *53 +p1 -7 +p1 ^6 z3 +p1 ,6 Y1 +p1 +6 xA9 +p1 -6 x96 +p1 +6 u +p1 +6 t +p1 ,6 t +p1 *6B ,5 +p1 *68 +p1 -6 ,7 +p1 *61 ,4 +[ p1 ,6 +p1 ,5 t +p1 +5 -7 +p1 ,5 *6B +p1 *54 t +p1 +5 *4B +p1 .5 ,4 +p1 *53 *71 +p1 *53 } +p1 +4 o0s +p1 *4B +5 +p1 ,4 *95 +p1 *48 '9 +p1 *46 xB2 +p1 ,4 *61 +p1 ,4 .5 +^p ,1 ,4 +p1 $3 l +p1 $3 $i +p1 *3A +p1 -3 +9 +p1 *36 l +p1 *32 +7 +p1 *31 K +^P *13 +p1 +3 $% +p1 +3 +p1 $% +3 +p1 .2 p1 +p1 .2 d +p1 *27 -0 +p1 *20 Y5 +p1 .1 x72 +p1 $1 x25 +p1 +1 i1o +p1 ] $1 +p1 ] ^1 +p1 ^1 ] +p1 $0 u +p1 *04 u +p1 *04 t +p1 *04 *97 +p1 *02 Y5 +p1 -0 *27 +$P ^1 +p1 $& +p1 $! +} p1 $@ +[ p1 { +[ { p1 +$p *03 +$P *02 x21 +^P $0 +$/ ^P +} ^P +^P $. +^P ^_ } +^_ ^P +$p [ +{ $p +^p $- +^p ^@ +^p ^. +^p ^, +^- ^p +$o z5 Z2 +$o Z5 u +$o Z4 Z3 +$o Z4 Y4 +$o Z4 +$o Z3 Z4 +^o z3 *14 +$o Z2 z5 +$O Z2 y3 +$o Z2 x82 +$o Z2 x51 +^O z2 u +^o z2 +^o z1 x52 +^O z1 { +$O $Z +^o y5 u +^O Y4 r +$O Y4 { +$O { Y4 +^o } y4 +$O y3 Z2 +$o Y3 t +$o Y3 -7 +$O y3 *02 +^o Y3 +^o Y1 o6N +$o Y1 ^8 +^O y1 *25 +^O y1 *05 +^o $x ^j +$o x93 +$o x82 Z2 +^o x65 ^L +^o x52 z1 +$o x51 Z2 +^o x46 ^b +^o x26 +^o x24 +$. $O x23 +$O x13 +^o ^X +^o ^W +$o ^w +$o $v D6 +^o ^V +$o u Z5 +^O u z2 +^o u y5 +$o ^u +$o t Y3 +$O T3 $1 +$o sOj -6 +^o ^s c +$o s4S +$o s4O +$o s4m +^O ^S +$o s@< +$o ^s +^o r ^M +^O ^R +$o ^R +^O q *15 +$o o9J +$O o91 +^o o6N Y1 +^O o65 +} $o o5L +^O o5# E +^O o2m +^o o2k +^O o2d +^O o1w +^O o1b +$O o01 +$o $O +$o $n *48 +$o ^M +$o $m +$O l ^a +$o L6 ^I +$O l +$O $k +^o K +$o ^k +^o $k +^o ^j $x +$O i90 +^O i85 ] +^O ] i85 +$O i71 +$o i6z +$o i6x +^O i61 +$o i6+ +$o i5r +$o i5g +^o i5c D6 +^O i5@ +^o i3m +$O i2J +^o i18 z2 +^O i1> +^o i0w ,4 +$o i0T +^o i0S +^O i0K +^o i0k +] ^o ^I +$O $h +^o ^f .2 +$o $f +^O E o5# +$o DB x24 +$o D6 $v +^o D6 +^o ^d -6 +$o D4 +^o D2 $@ +^o $@ D2 +^o d +$o C $0 +oBx u +oBX +oBw Z2 +oBu xA1 +oBt x52 +oBT E +oB. T0 +oBt +oBs x81 +oBs E +oB\ RB ] +oB\ ] RB +oBO o9H +oBo +oBn x92 +oBm -A +oBM ] +oBm +oBl x65 +oBl E +oBK u +oB K +oBi Y2 +oBi Y1 +oB. iA2 +oBh x91 c +oBh c x91 +oBf x81 +oBe o4a +oBe *B9 ] +oBe ] *B9 +oBd x61 +oBD { { +oBC +oBc ] ] +oBc +] oBB c +oBa x61 +oBa o8a +oBa $1 +oB@ +A +oBA +oBa +^{ oB9 s{6 +oB9 o6@ +oB9 $1 +oB$ .9 +oB. +9 +oB. ^9 +oB8 iB# +oB8 $$ +oB8 +oB7 Z1 DA +oB7 y4 +oB7 T1 +oB7 d xBA +oB7 DA Z1 +oB7 *A9 +oB@ *78 +oB7 $? +oB5 oA8 +^! oB5 +oB4 Y4 +oB4 Y1 x73 +oB4 x73 Y1 +oB4 iA +oB4 $A +oB4 -3 +oB3 ] p2 +oB2 xA1 +oB2 R8 +oB2 $E +oB2 *9A +oB2 $6 +oB2 ^* +oB1 Z4 +oB1 ^i +oB1 -0 +$@ oB1 +$. oB1 +oB0 t +oB0 oA4 +oB$ +oB@ +oB! +oB- $_ +$) oB( +oAz x62 $p +oAz $p x62 +oAz LA +oA\ Z3 +oAz $3 +oA. Z1 +oAy E +oA Y1 +oAY +oA# x91 +oA. x82 +oA. x34 +oA@ x03 +] oAx +oAU xB1 E +oAU E xB1 +oAu c +oAu 'B +oAt x03 +oAT r p3 +oAT p3 r +oA& T0 +oAT +oAS t +oAs $t +oAs i87 x64 +oAs D8 +oAS ] +] oAs +oAs +oAR u +oAq Z2 +oA- ^O x15 +oAo D6 +oA@ o91 +oA& o9( +oAo $1 +oAn +oAm x91 u +oAM x45 T5 +oAm u x91 +oAM c +oAl K +$O ^a l +oAl ] +oAk x82 +oAk x62 +oAk u +oAk +7 +oAk *59 +oAj *04 +oAi T0 +oAi D2 +oA! i5n +^' oAi +oAh sh@ c +oAh o9a +oAh c sh@ +oAH +oAh +$? oAG $g +oAf o9l +oAf +oA. E +oA. d x3A +oAd $m +oA# D9 +oA! D9 +oA. D7 +oA! D1 +oA/ c +oA c +oAa $z +oAA x32 +oAa T0 +oA9 Z1 E +oA9 o1o +oA9 E Z1 +oA9 ,B *57 +oA9 *57 ,B +oA. -9 +oA! .9 +oA8 RB +] oA8 c +oA7 Y1 +oA7 p1 x09 +oA7 i7t x23 +oA7 C T4 +oA. -7 +oA6 Z2 +oA6 -8 +oA6 $\ +oA5 o93 +oA5 *98 +oA5 -9 +$$ oA5 +oA4 $W +oA4 u +oA4 t +oA4 o5L +oA4 c +oA4 *BA +oA4 ,6 +oA4 .2 +oA. .4 +oA3 C +oA3 +5 +oA3 $? +oA2 x81 o3c +oA2 x64 +] oA2 x31 +oA2 o9 s\D +oA2 o9 +oA2 o3c x81 +oA2 +8 +oA2 $- +$% oA2 +oA1 D3 +oA1 *A6 +oA1 *93 +oA1 *67 +oA1 *58 +oA1 *57 +$ oA1 +} oA0 y1 +oA0 oB8 +oA0 o11 +oA0 K +oA0 DB +$! oA0 .B +$* oA0 +$O $A +oA+ $- +oA# +oA@ $! +oA/ ] +oA! +oA- +oA ^ +$- oA_ +] oA_ +^o ^A +^+ oA# +^? oA? +^> oA< +o9z x52 +o9Z c ,6 +o9z $c +o9Z ,6 c +o9z $5 +o9* Z2 +o9? Z2 +o9$ Z1 +o9Y Z1 u +o9y xA1 +o9Y u Z1 +o9y +6 +o9x x32 +o9X u +o9. x13 $6 +o9X +o9x +o9w Z2 +o9W t +o9w *09 +o9v x72 +o9V $v +o9u DA +o9u D7 +o9u D2 +o9U $9 +o9t t +o9t $s +o9t $7 p2 +o9! T7 +o9s Z1 -3 +o9s x71 u +o9s u x71 +o9s o6w +o9S i8L C +o9s i4s +o9S C i8L +o9s c +o9s -3 Z1 +o9r K E +o9r E K +o9/ RA +o9r $7 +o9r -5 +o9Q -6 +{ o9q +o9p x41 +o9p +8 +o9O x61 u +o9O u x61 +o9o o7o } +o9O o0H c +o9O c o0H +o9o *96 +o9? o8? +o9< o8@ +o9. o1e +o9? o0p +o9/ o0h +o9O +o9o { { +$@ o9o +o9N $Z +o9n *9A +o9N *87 +o9m xA2 +o9m r +o9m o8l +o9m o7d +o9m +B +] o9m +o9m +o9l ,4 +o9% l $1 +o9L +o9k o7t +o9k -8 +o9k [ -7 +o9j x81 .6 +o9J ^W E +o9j .6 x81 +o9J -6 +o9i x43 +o9i u p5 +o9i p5 u +o9. iAd +o9/ iA3 +o9_ i99 +o9# i3@ +o9I +o9i +o9h o8k +o9h ^m +o9h D6 +o9h $a +o9h ] +o9g i0G +o9g D4 +o9f x52 +o9f x35 +] o9F u +o9f $s +o9f *B9 RB +$) o9f +o9E x45 d +o9E u ] +o9E ] u +o9e D7 +o9e -7 +o9e *60 +o9d x53 +o9d $H l +o9% DA c +o9d -8 +o9- D6 +o9d ,5 +o9/ D3 +] o9d +o9c u +o9% c DA +o9c *95 +o9C $1 +o9@ c +] o9c +o9B Z5 x17 +o9B x17 Z5 +o9b x05 +o9b *93 +o9B +o9a xA1 +o9a $S +o9a k *24 +o9A i90 +o9a -8 +o9A *53 +o9a $3 +o9a *24 k +o9A *24 +o9A $2 +o9/ 'A +o9_ ,A +o9a $. +o99 x62 +o99 s45 +o99 o6i +o99 o4 +o99 i8/ +o9+ *9B +o99 ,A +o99 *9B +o9@ $9 +o98 Y1 +o98 $v +o98 T3 +o9. .8 p4 +o98 i8s +o98 C +o9. *80 +o98 [ +o9. -8 +o9 .8 +$@ o98 +o97 u p1 +o97 T0 +o97 p1 u +o97 o3u +o97 o1i +] o97 $9 +o97 *20 +o9$ ^7 +o9@ +7 +o9@ ,7 +o9 $7 +$- o97 +o96 Y4 +o96 x21 $4 +o9. $6 x13 +o96 o33 +o9. *68 +o9+ *67 +o96 $4 x21 +o96 $4 +o96 ^# +o95 Z4 +o95 x61 +o95 o77 +o95 D3 +o95 'A +o9+ *59 +o95 *89 +o9. *57 +o95 -5 *39 +o95 *39 -5 +o95 ,1 +o95 -0 +o9. ,5 +$! o95 +o94 $v +o94 D6 +o9 *48 +o9. *46 +o94 *46 +o9. *40 +$# o94 +o93 Y1 +o93 x72 +o93 x53 +o93 T1 +o93 o6f +o93 o2m +o93 K +o93 $A +o93 ,8 +o93 -5 +o92 oB. +o92 o3u +o92 i9x +o92 i5- +o92 ^G +o92 *9A +o92 $6 +[ o9. *24 +o92 +0 +o92 ^/ +o9? .2 +] o92 +o91 Y1 +o91 s0 +o9% $1 l +o91 K +o91 i8d +o91 i3a +o91 +B +o91 .8 +o91 $7 +o91 .7 +o91 .6 i55 +o91 -6 +o9% $1 +o9, $1 +$- o91 +[ o91 +o90 x81 C +o90 o80 +] o90 o73 +o90 o0W +o90 { k +o90 i0D +o90 C x81 +o90 +A +o90 +8 +o90 *79 +o90 $7 +o9$ +o9@ $. +o9. [ +$? o9 +} o9! +] o9) +] o9_ +] o9= +[ o9 +^* o9* +^$ o9! +^[ o9. +^. o9. +^, o9. +^- o9- +o8Z $z +o8z x05 +o8z $f +o8z D3 +o8! Z3 o8Z +o8. Z3 +o8) Z2 +o8 Z2 +o8+ Z1 R0 +o8- Z1 E +o8@ Z1 +o8y x32 s8H +o8y s8H x32 +o8y r +o8y p5 +o8y D3 D6 +o8y *83 +o8. Y2 +o8^ Y1 x42 +o8* Y1 +o8- Y1 [ +o8- [ Y1 +$o ^8 Y1 +} o8y +] o8y +o8x K +o8X E +o8x D9 +o8x ,9 +o8. x71 D5 +o8& x53 +o8@ x53 +o8_ x52 +o8^ x42 Y1 +o8# x34 d +o8* x34 +o8_ x32 +o8. x31 +o8* x17 +o8# x12 +o8_ x12 +o8X +o8w Z1 +o8w $z +o8w $x +o8w p4 +o8W o3s +o8w K +o8w C +o8w 'B +o8w *21 +o8w +0 +o8@ ^W +o8v x51 +o8v u +o8V [ T7 +o8V T0 +o8V c +o8V -7 +o8v ] +[ o8v +o8u Y1 C +o8u s90 +o8u o9p +o8U $E +o8u D4 +o8u C Y1 +o8u $. +o8u ] +[ o8u +o8t $x +o8t ^p +o8t K +o8t D9 ] +o8t ] D9 +o8t *75 +o8_ T7 +o8@ T4 -B +o8s Z2 +o8s T4 +o8s $p +^] o8* s]N +o8S D3 +6 +o8s .3 +o8s +0 +] o8s +o8r x41 +o8R u +o8R T2 +o8r $o +o8r L7 i8i +o8r i8i L7 +o8+ R0 Z1 +o8R +o8q +o8P Y1 +o8p x52 +o8p t +o8p oBk +o8p *85 +o8p -5 +o8o Y2 +o8o x91 p3 +o8O o6n +o8! o7x +o8< o7h +o8. o77 '9 +o8O +7 +o8@ o60 +o8. o5k +o8. o53 +o8o +4 +o8* o4. +o8o *27 } +$@ o8o +o8N Y1 +o8N x26 $S +o8N $S x26 +o8n o5^ +o8n 'B +o8m Z1 +o8m E +o8M 'A Y2 +o8m ,9 +o8m $* +o8l Z1 +o8L i7e +o8l *86 +o8L ] +] o8L +$= o8l +o8k t +o8_ K D1 +o8- K +o8K +o8j u ] +o8j ] u +o8j u +o8j o7@ +o8j ^j +o8j i93 +o8j D7 +o8j *86 +o8j *78 +o8i ^Y o0j +o8i Y2 x41 +o8i x42 +o8i x41 Y2 +o8i T4 +o8i K +o8i D4 +o8i D2 +o8. i9A +o8 i94 +o8, i9 +o8 i8v +o8! i8S +o8i *86 +o8@ i79 +o8I .7 +o8? i6S +o8i -5 +o8i -3 +o8. i25 +o8I +o8h x42 +o8h x26 +o8h x23 p4 +o8H o4y +o8H ^I +o8h *68 +o8g Z1 +o8G Y3 Y3 +o8g Y2 +o8g x61 u +o8g u x61 +o8g $s +o8g i8m +o8g *08 +o8f Z1 +o8f x32 +o8f x31 +o8f $n +o8f $h +o8f ] +o8/ ^f +[ o8f +o8- E Z1 +o8e x71 +o8e $k +o8e D5 +o8e D4 +o8e $A +o8e $2 +[ o8E +o8E +o8d Y3 +o8d x52 +o8d t DB +o8d T6 +o8d sed -0 +o8D $S +o8d DB t +o8+ D3 +o8@ D2 +o8_ D1 K +o8d -0 sed +o8! D0 +o8& $D +o8d ^@ +o8c Y2 c +o8c Y1 +o8c o7y +o8C o7M +o8c c Y2 +o8c -7 +o8b x21 D8 +o8@ -B T4 +o8b o4w +o8B l $5 +o8B i31 R9 +o8b D5 +o8b *86 *62 +o8B -6 +o8B $5 l +o8b -5 +o8! 'B +$@ o8A o3z +o8a o0t +o8a D5 +o8a D4 +o8A C +o8A ^c +o8a ^A +o8a .9 +o8a *87 +o8A ,5 +o8a .3 +o8a .1 +o8A +0 +o8a $. +o89 Z3 +o8. '9 o77 +o89 o0L +o8$ ,9 +o8- .9 +$` o89 +o88 u +o88 C +o88 $7 $? +o8 *86 +o88 *02 k +o87 x61 +o8- .7 x34 +o87 p1 +o87 o3- +o87 o1y +o8_ .7 D2 +o87 +A +o87 *58 ,6 +$? o87 .3 +o87 ] +o87 [ +o8* .7 +o8! .7 +o8_ .7 +o86 x32 $f +o86 s13 +o86 R9 +o86 i3h +o86 i1o +o86 i1i +o86 $f x32 +^* o86 *40 +o86 +2 +^O *86 +$, o86 +^* o86 +o85 Y4 +o85 ^w +o85 T1 +o85 i4n +o85 D3 $* +o85 $* D3 +o85 C +] o85 C +o85 ,7 +o85 *36 +o8* +5 +$+ o85 +o84 x05 +o84 T1 -4 +o84 p1 x57 +o84 o0B +o84 i5+ +o84 ^h +o84 -4 T1 +o8. -4 +o83 x31 +o83 x14 +o83 o93 +o83 o1A +o83 C +o83 $? +o8@ $3 +o8/ -3 +^o *83 +^@ o83 +o82 x52 +o82 T2 *21 +o82 i7k +o82 D9 +o82 +A +o82 ,6 +o82 $5 +o82 $@ +o82 ] +o8! ,2 +$! o82 +o81 s7! +o81 R7 +o81 o0g +o81 ^L +o81 i8= +o81 i2z +o81 $E +o81 D2 x04 +o81 ^d +o81 C +o81 $4 p4 +$- o81 +o80 Y4 +o80 D9 +o80 D4 ^N +o80 *46 +o8- *03 x26 +o8@ +0 +o8# ^@ +o8! $? +o8! +o8 ] +$/ o8_ +$! o8% +} o8* +{ o8_ +^[ o8] +^' o8' +o7Z u ] +o7Z ] u +o7z o4y +o7Z o1o +o7z i7w +o7z i7u +o7Z E +o7z $b +o7z -9 p3 +o7Z ,8 +o7z -6 +o7z +5 +o7z ,5 +o7* Z4 +o7! Z2 c +o7! Z2 ,2 +o7@ Z2 +o7! Z2 +o7 Z2 +o7; Z1 Z1 +o7* Z1 T1 +o7 Z1 l +$" o7z $1 +o7z { +o7z [ +} o7z +o7y x51 +o7y x05 +o7y t $E +o7Y K E +o7y i7s +o7y f +o7Y E K +o7Y E +o7y *70 +o7y -6 +o7. y4 +o7/ Y3 $1 +o7 Y2 +o7# Y1 T2 +o7* Y1 +o7@ Y1 +o7y -0 +o7Y } } +o7x Y2 x81 +o7x R4 x21 +o7x r +o7X o1Z *56 +o7X $L +o7x $L +o7x ^8 +o7x *79 +o7X *56 o1Z +o7* x52 +o7X *50 +o7$ x42 +o7+ x41 +o7 x41 +o7$ x31 +o7x *14 +o7* x01 ^6 +o7w x41 +o7w $p +o7w o5b +o7W C +] o7w c +o7w *46 +o7w *31 +o7w *07 +o7w ] +$@ o7w +o7v Z4 .2 +o7v r +o7v o6c +o7v o3 +o7v $a +o7v *41 +o7v .2 Z4 +o7. ^v +o7u ^T +o7u o5s +o7u o0k +o7u ,8 +o7u .6 +o7u ,6 +o7U ] +$! o7U +o7U +o7t x34 u +o7t x21 +o7t u x34 +o7t u +o7T ^T E +o7t o45 -7 +o7t o4- +o7t o2T +o7t o0T +o7t ^O +o7T E *21 +] o7t E +o7t $b +o7t -7 o45 +o7+ T6 +o7# T2 Y1 +o7T *21 E +o7* T1 Z1 +o7t $1 +o7t *02 +$& o7( t +^] o7} t +o7s x23 o0s +o7s t +o7S svl +o7, s,@ R6 +o7s o6o +o7s o6' +o7s o4U +o7s o0s x23 +o7S E *32 +o7S $B +o7s $b +o7s *93 x02 +o7s *56 +o7s *41 +o7S *32 E +$$ o7s +o7R T2 +o7r i7. +o7r $I +o7, R6 s,@ +o7r *50 +o7r *26 +o7r *25 +} o7R } +o7r +o7q t +o7q .2 +o7q +0 +o7q $@ +o7q ] +o7P Y1 +o7p x01 +o7p u o5O +o7p o5V +o7p o5O u +o7p k +o7p ,8 +o7p *70 +o7p $4 +o7p *26 +o7p $2 +} o7p +o7o x34 +o7o x31 +o7o t +o7o C +o7o *83 +o7 o8< +o7o +6 +o7o .6 +o7. o6. +o7$ o5$ +o7! o4G +o7? o3< +o7< o2m i3y +o7$ o2b t +o7! o1Y +o7. o1u K +o7o *13 +o7@ o1* +o7- o1@ +o7$ o0@ +o7N T0 +o7n t +$. o7n p3 +o7n K L7 +o7N D1 i7^ +o7n $A +o7n $@ +o7- ^n +^! { o7n +o7m Y2 +o7m o9k t +o7m o8& +o7m o5g +o7m o3a +o7m $o *34 +o7m D8 +o7m D6 ,9 +o7. ^M D6 +o7M *81 +o7m *61 +o7m *34 $o +$? o7m +o7m +o7 l Z1 +o7L x92 u +o7l x91 +o7L u x92 +o7l u D6 +o7l o6a +o7l o5s +o7l i8e +o7L i6M +o7L $F +o7l D6 u +o7L $5 +o7l +5 +$+ o7L +o7L +o7l ] +$^ o7? l +o7K Y2 +o7k x41 z2 +o7k x41 +o7k u -2 +o7k T1 +o7k o25 +o7. K o1u +o7k o0v +o7k l D3 +o7k i0x +o7k D3 l +o7k $9 +o7K *65 +o7k .6 +o7k -2 u +o7. K +o7k $. +$! o7k +o7j Z1 +o7j o6 +o7j o3t +o7J $o +] o7j $k +o7J $D [ +o7J [ $D +o7j .9 +o7j *57 +o7j *02 +o7i x51 +o7i T0 +o7i $m +o7i K +o7I i8S t +o7i i6t +o7i i4I +o7i C p4 +o7i *92 +o7. i86 +o7i +8 +o7i '8 +o7\ i8" +o7- i7H +o7! i72 +o7/ i7/ +o7# i5N .3 +o7? i4K +o7* i46 ,7 +o7< i3y o2m +o7$ i31 +o7. i2n +o7. i0v +o7I +o7i $@ +o7@ ^i +$_ o7i +o7h x02 i3d +o7h u +o7h ^i +o7h *64 +o7h $2 +] o7h +o7g xA2 +o7G T3 +o7g ssj +o7g ^R +o7g o6v +o7g i8i +o7g i5s +o7g .2 +o7! ^G +o7f t +o7f o6r +o7f $k +o7f i5y +o7f $1 +o7f *07 +o7f .0 +o7f -0 +o7. ^F +o7e Y3 +o7e u +o7e t p1 +o7e p1 t +o7E o6W *35 +o7e o5i +o7e o0a +o7e $A +o7e $8 +o7e *54 +o7E *35 o6W +o7e $2 +o7e +0 +$* o7e +o7d x91 *75 +o7d x91 +o7d x61 +o7D x52 +o7d x52 +o7D T2 +o7d sth +o7d $r +5 +o7d r +o7d K +o7D i7C +o7D i6R $2 +o7d DA +o7d D8 +o7, D8 +o7d *75 x91 +o7# ^d *70 +o7d +5 $r +o7, D4 +o7d $3 +o7D $2 i6R +] o7d +o7c Z2 +o7! c Z2 +o7C Y1 +o7C t i5I +o7c t +o7c C +o7 C +8 +o7c *23 +o7c *14 *16 +o7c *14 +o7c +1 +o7c *02 +o7! C +o7c { +o7b Y3 x95 +o7b x34 ^m +o7B t +o7b srO *16 +o7b o58 +o7B c +o7b *76 +o7B *73 +o7b -6 +o7b *57 +o7b *16 srO +o7B *07 +o7b +0 +o7_ ^B +o7A Y1 ^9 +o7a t +5 +o7a o5l +o7a i1c +o7a $e +o7A C +o7A ^9 Y1 +o7a *78 +o7a +5 t +o7A +4 +o7a *23 +o7A $! +o7@ +A +o7a [ +] o79 Y2 +o79 Y1 +o79 x82 +o79 sta +o79 s73 +o79 o41 +o7& *98 +o7/ *98 +o79 *36 +o79 { +o7- +9 +o7_ $9 +{ o79 +o78 Z3 +o78 T2 +o78 R6 $^ +o78 $^ R6 +o78 o4h +o78 o0L +o78 i6p +o7 +8 C +o78 $5 +o78 *34 +o7 $8 +$& o78 +$* o78 +o77 y3 y3 +o77 ^v +} o77 T3 +o77 o8- +o77 o6g +o77 o69 +o77 o56 +o77 o0d +o77 d '9 +o77 $b +o77 '9 +o7- *76 +o7. *75 +o7% *74 $& +o7% $& *74 +o77 $3 +o7+ -7 +o76 z1 +o76 R5 c +o76 o0v +o76 o0@ +o76 c R5 +o7. *67 +o76 .6 +o7 ,6 *24 +$O *76 +o7% +6 +o7% .6 +o7# -6 +o7) $6 +o7. +6 +o75 Z2 +o75 smt +o75 i90 +o75 i78 +o75 i72 +o75 ,9 +o75 *89 +o75 $- +o75 ] +o7@ -5 +o74 Z2 +o74 x02 ^0 +o74 u d +o74 T3 +o74 T1 +o74 $q +o74 o2l +o74 k +{ o74 k +o74 i9k +o74 i6. +o74 i1 *98 +o74 d u +o74 $c +o74 *70 +o74 *64 ^3 +o74 .6 +o74 $ +] o74 +^$ o74 +o73 y4 +o73 Y2 +o73 x52 +] o73 o90 +o7# .3 i5N +o73 i4J +o73 i0L -8 +o73 ^E +o73 -9 +o73 ,8 +o73 .4 *46 +o73 ,4 +o73 -3 +o73 $2 +o7# -3 +o7 $3 +o7! ,2 Z2 +o72 Y2 +o72 x03 d +o72 T2 $! +o72 $! T2 +o72 $T +o72 ^* R7 +o72 k +o72 +6 +o7 *24 ,6 +o72 ^@ +$+ o72 +o71 Z2 *78 +o71 y3 +o71 Y2 *78 +o71 x43 +o71 $M +o71 L8 Z2 +o71 i5U +o71 i0O +o71 D3 +o71 *78 Z2 +o71 *50 +o71 -5 +o7@ *13 +o7. *13 +o7. *12 +o71 *15 +o71 *13 +o70 Y4 +o70 o8N +o70 o4B +o70 i77 +o70 i6- +o70 i5$ +o70 i0f +o70 +6 +o7_ *06 +o70 -4 +o70 ,3 o2y +o70 *13 +o70 +1 +o70 $= +$# o70 +o70 +$O .7 +$O -7 +o7# ^! +o7@ $@ +o7@ ] +o7. $_ +o7/ $* +o7/ +o7! $@ +o7! [ +o7- $* +o7- { +o7_ $& +o7| $) +o7^ +$# o7@ +$/ o7* +$= o7 +[ o7! +[ o7_ +^$ o7, +^@ o7? +^[ o7. +^? o7( +o6z ^Z +o6Z Y1 +o6z x32 +o6z o5@ +o6z o4b +o6z o06 { +o6Z l d +o6Z d l +o6z D0 ^R +o6z +9 +o6@ Z5 x14 +o6Z .5 +o6z $5 +o6_ Z3 +o6. Z2 x42 +o6# Z2 +o6* Z2 +o6) Z2 +o6> Z2 +o6# Z1 c +o6? Z1 +o6. z1 +o6z .0 D1 +o6Z +o6z ] +o6y r *17 +o6y o5c d +o6y o1r +o6y o0B +o6y i7@ +o6y i6a +o6y D7 +o6y D0 +o6y *63 +o6y -5 +o6. y4 x82 +o6 Y4 +o6. y3 *62 +o6_ y3 +o6 y3 +o6< Y2 Y2 +o6@ Y2 ,3 +o6+ Y2 +o6& Y2 +o6- Y2 +o6- y2 +$! o6y +o6X Z2 [ +o6X [ Z2 +o6x x41 +o6X x15 ^7 +o6x T3 T2 +o6x T2 T3 +o6X o5T } +o6x k .1 +o6x i7u +o6X c +o6x ,A +o6_ x82 +o6x +8 +o6= x75 L6 +o6@ x72 +o6x -7 +o6. x42 Z2 +o6@ x42 +o6- x41 +o6- x32 +o6@ x31 +o6! x23 } +o6@ x14 Z5 +^@ o6x +o6w Z2 ,1 +o6w z1 x21 +o6w x01 +o6w sys +o6w skf +o6w o7m +o6w o7e +o6W o5P +o6w o5a y2 +o6w i6s +o6W C +o6w ,1 Z2 +o6W $1 +o6w $1 +o6! ^W +o6W +o6v x82 +o6v x13 +o6v r +o6V $P d +o6V o9i E +o6v o7s +o6V o3& k +o6V k o3& +o6V E o9i +o6V E +o6v *83 +o6v *61 +o6v $5 +o6v { +o6u $z +o6u x82 +o6u x21 +o6u x14 +o6u u +o6u o5D +o6u $n +o6U l *16 +o6u i6t $8 +o6u 'B +o6u $8 i6t +o6u +8 +o6u *70 +o6u -7 +o6* u ,5 +o6u -2 +o6U *16 l +$. o6u +o6t z1 +o6T y2 ^0 +o6t o8x +o6t o2t +o6* t k +o6t D5 +o6t [ ^d +o6t *78 +o6T ,7 +o6# T3 +o6* T1 ,7 +o6, T1 +o6t *04 +o6T +o6s Z3 i7@ +o6s x74 +o6s x41 +o6s u ] +o6s ] u +o6s ss4 +o6S s%D i6U +$o -6 sOj +o6S o4C *47 +o6s L5 ^K +o6@ sl1 +o6s K +o6S $J +o6s i8y +o6s i7@ Z3 +o6s i7/ x21 +o6s i74 E +o6S i6U s%D +o6s E i74 +o6S $e $! +o6S c *87 +o6S c +o6S *87 c +$. o6s -7 +o6s *50 -2 +o6s *42 +o6s -4 +o6! s3% +o6s -2 *50 +o6s *02 x01 +o6S +o6s $* +o6r y4 +o6R u +4 +o6r ^u +o6R T7 +o6R ^S +o6r { r +o6r r +o6r o04 +o6r D9 +o6r D7 +o6R ^A +o6, R7 +o6. R5 t +o6R +4 u +o6r +4 +o6_ $r +$$ o6r +$_ o6r +o6q Z4 Z4 +o6q Z3 { +o6q Z2 -3 +o6q Y3 +o6q } x12 +o6Q ^Q +o6Q o5@ +o6q o4z .2 +o6q o0t +o6q k +o6Q i6Q +o6q *64 +o6q -3 Z2 +o6q *36 +o6q .2 o4z +o6_ ^q +o6q +o6P x74 E +o6P u +o6P T2 +o6P s7o +o6p R5 +o6p $r +o6P o0T c +o6P E x74 +o6P c o0T +o6p $7 Y1 +o6P *68 +o6p .5 +o6p *35 +$@ o6p +[ [ o6p +o6o $z +o6O y5 y5 +o6o x24 y4 +o6o o3l +o6o $O +o6o ^M +o6o K $s +o6o i5o +o6o E +9 +o6o +9 E +o6* o9^ +o6. o9! +o6o *67 +o6& o5l +o6o .5 ,4 +o6o ,4 .5 +o6o -4 +o6 o3l +o6@ o34 *36 +o6< o2r +o6@ o2K +o6_ o24 +o6_ o1u +o6% o1s +$? o6! o0B +o6# o0$ +$* o6o +o6N u sRU +o6n u +o6n o7g +o6n o3s [ +o6n i0G +o6N $d Z5 +o6n ] +$. o6n +o6M Z4 Y2 +o6m Y3 +o6m xA4 t +o6m t xA4 +} o6m o5@ +o6M i0m x61 +o6M ^D +o6m $b +o6M +9 +o6_ ^m $7 +o6M *60 *24 +o6m $5 +o6m *34 +o6m ,3 ^4 +o6m *31 +o6M *24 *60 +o6! ^M +o6l z2 +o6l Y3 +o6l $y +o6l x93 +o6l x91 +o6L u +o6l s28 C +o6l $r +o6l p1 +o6L o7F +o6l o4d +o6l o2K +o6l i5z +o6l C s28 +o6l .8 +o6l *75 +o6l *74 +o6l ,7 +o6= L6 x75 +o6l *57 x03 +o6l $5 +$@ o6L +o6L +$@ o6l +o6K y3 .4 +o6K Y2 +o6k x83 +o6K t i3n +o6* k t +o6k s9j +o6k o0J +o6k L7 +o6K $l +o6K ^K +$! o6k k +o6k i4p +o6k i3K +o6k i2p +o6k $g +o6k *42 +o6k +1 +o6, k +] o6k +o6j x51 K +o6j x21 +o6J s1T +o6J o9i +o6j L3 +o6j K x51 +o6j *71 +o6j +5 +o6j +2 +$. o6j +o6i Y2 +o6i x31 +o6i smv +o6i o7w +o6i o5v +o6i o4H ] +o6i ] o4H +o6i o0L +o6i $i +o6I E +o6i ^C +o6/ i7p +o6& i79 +o6+ i6/ +o6^ i6$ +o6! i5D +o6i *5A +o6* i58 +o6. i5. +o6+ i4s +o6* i3* +o6@ i2g +o6+ i1p +o6# i1l +o6# i11 +o6$ i0i +o6& } ^i +o6$ ^i +o6@ $i +{ o6i +] o6i +o6h x32 +o6H q x06 +o6h i4B +o6h $7 +o6h ,7 +o6h ^1 +o6H *07 +o6H +o6h [ +$! o6h +o6g Z2 $J +o6g y2 +o6g x12 +o6g x03 +o6g o4c +o6g o0l +o6G c +o6g *63 +5 +o6g +5 *63 +o6g $5 +o6G *32 *21 +o6g .2 +o6g ,1 +o6g *02 +o6g [ +o6f x42 +o6f x02 +o6f $s *12 +o6f $s -0 +o6f k +o6f i5x +o6F $b +o6f .A +o6f ,9 +o6f *71 +o6f *12 $s +o6f *12 +o6f -0 $s +o6f [ +{ o6f +o6e Y2 +o6E $R +o6e oAb +o6e o7d +o6e o5l +o6E i7@ +o6e i34 +o6e ^G +o6E [ E +o6e +8 +o6e *20 +o6. E ^! +] o6e +^( o6e +o6d x13 +2 +o6d x02 +o6d ^s K +o6d p4 R9 +o6d o8n p3 +o6d L5 +o6d K ^s +o6d D1 R4 +o6, DA +o6+ D8 +o6, D8 +o6& D5 +o6_ D4 c +o6D .3 +o6, D3 +o6d $2 +o6+ D0 $b +[ o6d +o6# c Z1 +o6C s0M +o6c o7- +o6c o5q K +o6c K o5q +o6c $e +o6_ c D4 +o6C C +o6c $A +o6c *98 +o6c $8 +o6c -8 +o6c *75 +o6c -7 +o6c *60 +o6c *56 +o6c *51 +o6c +3 +o6$ C } +o6- C +o6@ c $! +o6@ $! c +{ o6c +o6b x51 t +o6B x42 +o6b t x51 +o6B o5F *31 +o6B ^M +o6B i6. +o6b i0t +o6+ $b D0 +o6b ^A .1 +o6b -9 +o6B +6 *54 +o6B *54 +6 +o6b *46 *23 +o6b *34 +o6B *31 o5F +o6b +3 +o6b *23 *46 +[ o6B *15 +$! o6b *06 +o6B $- +o6. 'B +^( o6B +$# o6b +o6A Y2 +o6a x72 u +o6a u x72 +o6a o76 +o6A o49 +o6A o16 *72 +o6A i6@ +o6a i2a +o6A f x38 +o6A D4 y5 +o6a ^9 z2 +o6a *74 +o6A *72 o16 +o6a *64 +o6A *54 +o6a ,5 +o6A *46 +o6a *31 +o6a +0 r +o6# ^A +o6A +$? o6a +o69 x41 o3B +o69 u d +o69 o5Z C +o69 o4m } +o69 o3B x41 +o69 k *16 +o69 d u +o69 C o5Z +o69 $8 +o69 +7 $# +o69 $# +7 +o69 ^6 +o68 Z4 +[ o68 t +o68 ^p +o68 o76 +o68 o1. y1 +{ o68 o1j +o68 o0b *30 +o68 K .5 +o68 D7 +o68 D5 i5k +o68 D2 +o6 $8 *8A +o6# *87 ] +o6# ] *87 +o6! *86 +o68 .5 K +o68 -5 +o68 } +o6. +8 +o6_ ^+ '8 +$? o68 +} o68 ^@ +[ o68 +o6* ,7 T1 +o6_ $7 ^m +o6@ -7 +o6= -7 +o6^ ,7 +o67 +o66 y3 +o66 $w +o66 p5 *57 +o66 p2 o0v +o66 o5@ l +o66 l o5@ +o66 K +3 +o66 ^f +o6. *69 +o66 -8 +$) o6( *68 +o66 *54 +o6= *65 *01 +o66 .5 +o6 *63 p4 +o66 +3 K +o6 *63 ] +o6 ] *63 +o66 *16 +o66 *04 +o66 $+ +o66 $_ +o66 } +o6} +6 +o6. ^* +6 +o6? .5 y2 +o65 Y1 +o65 x73 +3 +o65 x51 +o65 x21 +o65 x13 +o6* ,5 u +o65 $s *06 +o65 o8. +o65 o7k +o65 o1O +o6_ .5 ^n +o65 k +o65 ^j +o65 i3? +o65 f x85 +o65 D3 *79 +o65 D1 ^z +o65 $A +o65 +9 +o65 *89 +o6 .5 *64 +o65 -4 +o6- *54 +o6 *54 +o65 +3 x73 +o65 *06 $s +o65 } +o65 [ +o6? .5 +o64 u p1 +o64 t p1 +o64 T0 +o64 sHm +o64 p1 u +o64 p1 t +o64 o3, *21 +o64 o1l *21 +o64 i4& +o64 i03 +o64 i02 +o64 *75 +o64 *21 o3, +o64 *20 +o64 $1 +o6- *41 +o64 ^$ +o64 ^- +o6. ,4 +$! o64 +] o64 +[ o64 +o63 Y4 +o6@ ,3 Y2 +o63 T3 +o63 i80 [ +o63 $b +o63 *47 +o63 +3 +o6 *31 +^o +6 *31 +o63 } +o6# +3 +o6* -3 +o6< $3 +$- o63 +o62 y5 y2 +o62 $w +o62 ^J +o62 i8. +o6! ,2 ^E +o62 c ] +o62 ] c +o62 $A *52 +o62 $A +o62 -5 i4J +o62 *52 $A +o62 .4 +o62 *04 +o6% $2 +o6, $2 +o6_ .2 +o6 +2 +o6= -2 +$+ o62 +$@ o62 +$ o62 +o61 $z +o61 x23 +o61 sl/ ] +o61 ] sl/ +o61 sg4 p3 +o61 p3 sg4 +o61 p1 x04 +o61 o1S +o61 ^n +o61 i6i +o61 i52 +o61 E +o61 ^c +o61 ^A +o61 -5 +o61 *32 +o61 *20 +o61 *02 p1 +o61 [ +o6. .1 +o6- +1 +o6 $1 +$/ o61 +^, o61 +o60 ] Y3 +o60 Y2 +o60 x21 +o60 t +o60 i5w +o60 ^I +o60 D3 D8 +o60 -A +o60 +8 +o6_ *05 ^E +o60 -5 +o6- *05 [ +o6+ *04 +o60 *23 $1 +o60 *23 +o6= *01 *65 +o60 $1 *23 +o60 $- +o60 { ] +o6. +0 +$* o60 +$O $6 +o6& [ +o6$ ^$ +o6@ $. +o6@ +o6{ +o6( +o6. ^| +o6, ^$ +o6` +$# o6+ +$$ o6@ +$. o6@ +$? o6! +$! o6. +[ o6 +o5z r +o5z o4= +o5z o0s +o5Z i5Z +o5Z i5N +o5z D8 +o5z $D +o5z -7 +6 +o5z +6 -7 +o5! z4 z4 +o5. Z3 *20 +o5@ Z3 $2 +o5z ,3 +o5- Z2 +2 +o5@ Z2 +[ o5@ Z2 +o5_ Z1 +o5 Z1 +$? o5, Z1 +o5z $1 +$! o5Z +o5z $. +o5y $z +o5y y4 +o5y x14 y5 +o5y $v +o5y T4 +o5Y T2 +o5y R1 +o5y $N +o5Y l ^k +o5y L7 +o5% $y l +o5Y ^k l +o5y K +o5y k +o5y i5s +o5Y i4B +o5Y C +o5y +7 +o5y -6 +o5 y5 E +o5y *53 +o5! Y5 +o5- Y3 +o5_ Y3 +o5. y3 +o5. Y2 Y2 +o5. Y2 +o5. Y1 i6B +o5+ Y1 i19 +o5* Y1 ^a +o5_ y1 *45 +o5 Y1 +} o5y $) +} $) o5y +o5X y3 +o5X x62 +o5X x21 t +o5x x01 p4 +o5X ^# ^x +o5X t x21 +o5x scq +o5x $r *53 +o5x R4 +o5x $q +o5x o6y +o5X o6B +o5x o2x i3B +o5X l $b +o5x k +o5x i6u +o5x i3B o2x +o5X $b l +o5 x91 +o5x *72 +o5_ x71 +o5_ x62 K +o5! x61 +o5x *53 $r +o5x *17 +o5x -0 +$> o5x +o5W Z3 u +o5W u Z3 +] o5W u +o5w p3 *85 +o5W o4E '8 +o5w o4a +o5W o41 y4 +o5W ^L +o5w D6 +o5w D2 +o5W '8 o4E +o5W $8 +o5w *64 +o5w *53 +o5w *47 +o5w *27 +o5v x32 +o5v t +o5v oA3 +] o5V o4T +o5v o22 +o5V l *12 +o5v L1 +o5v $g +o5v D3 y5 +o5v *43 +o5v *32 +o5v *23 +o5V *12 l +o5v $+ +$* o5v +o5u Z5 Z2 +o5u Z2 Z5 +o5u x81 +o5U u $0 +o5u T0 $? +o5u $? T0 +o5U $p i4* +o5U l *48 +o5u i5l +o5U i4* $p +o5u i3m +o5u i0z +o5u D1 +o5u C T4 +o5U *48 l +o5u .4 +o5U $0 u +o5u -0 +o5u ^, +o5t o4. +o5t o3m ] +o5t ] o3m +o5T o2b +o5t o11 $5 +o5T ^L +o5t k $. +o5t $. k +o5t i9e +o5t .9 +o5t $5 o11 +o5T .4 +o5$ T4 +o5. T4 +o5# T2 +o5T *05 +o5? [ T0 +[ o5- t +o5s Y2 D6 +o5S Y2 c +o5s t -6 +o5; sop +o5s o9! +o5S o2s +o5s o0z +o5s i83 x31 +o5s i76 +o5s i4s +o5- sH. +o5s D6 Y2 +o5S c Y2 +o5s c +o5[ s9K +o5s +7 +o5s -6 t +o5s -4 +o5s .2 +o5= s1> +o5) s0( +o5S +o5R T2 +o5r r '9 +o5R o6$ +o5R o4Y +o5r o3v +o5r ^n R2 +o5# ^r l +o5r i5a +o5r d +o5r *70 +o5r .7 +o5* R4 +o5. R4 ] +o5. ] R4 +o5_ R4 +o5R $? +o5R } } +o5r $. +o5r ] +o5r [ [ +o5q x76 +o5q spy +o5q K +o5q i2z +o5q -0 +o5@ $Q [ +o5@ [ $Q +o5Q +o5q $! +$! o5q +o5p Y2 +o5p T3 +o5p sdR +o5p R7 +o5p r +o5p o4w +o5p o43 +o5p o4. +o5P o0d +o5P i7a +o5p i77 +o5p D3 +o5p $D +o5p *08 .7 +o5p $$ +o5@ $p +} o5p +o5o z3 $F +o5O y2 +o5o Y1 +o5o x71 +o5o o0K +o5o $F z3 +o5_ o8t x32 +o5! o76 +o5, o70 +} o5@ o6m +o5o ,6 +o5o -6 +o5$ o6! +o5- o4I c +o5! o46 +o5 o3a +o5! o2k *75 +o5o { *26 +o5$ o2# -5 +o5# o23 +o5o .2 +o5o *13 +o5 o0L +o5@ o0K i3c +o5. o0E +o5o { +o5o [ +o5N y2 *74 +o5n x71 u +o5n u x71 +o5N t +o5n smh +o5n oB1 +o5n o3p +o5n o2s +o5n o29 +o5n i5I +o5N i1d +o5n *45 ] +o5n ] *45 +o5n *43 +o5n *37 +o5& ^N +o5n $/ +{ o5n +o5n +o5M y5 $s +o5m x41 D3 +o5m x14 y3 +o5m u +o5M $s y5 +o5M slL +o5m o7g D8 +o5M o6P +o5M o6K +o5M o4l +o5m i4N +o5m D8 o7g +o5m *75 +o5m +6 +^( o5m +o5l Y3 +o5% l $y +o5l x21 +o5# l ^r +o5l oA4 +B +o5L o6U +o5l o3H +o5L o0M +} o5L $o +{ o5l K +o5l $i +o5l +B oA4 +o5l $9 +o5l '9 +o5L *75 +o5l +7 +o5l *31 +o5l *12 +o5l [ +o5_ $l +o5| l $| +o5| $| l +o5* K Z2 +o5k $z +o5_ K x62 +o5K R0 *16 +o5k o3n +o5% K L7 +o5k i6S +o5k i6s +o5k i6a +o5k i3r +o5k i0s +o5k D3 +o5K ,4 +o5K *16 R0 +o5k +1 +o5k +0 +o5k $! +$+ o5k +[ o5k +o5J y5 +o5j Y2 +o5J T0 +o5j slw +o5j sl; +o5j o0q +o5j K *53 +o5j i3 +o5J *75 ^x +o5j ,7 +o5j *53 K +o5j +3 +o5j -3 +o5j *02 +o5J $! +{ o5j +] o5j +[ o5j +o5I Z2 +o5i Y4 x21 +o5i x86 +o5i x81 +o5i x21 Y4 +o5i o0X +o5i i6h +o5i ^A +o5i *85 .3 +o5_ i7s +o5/ i78 +o5+ i7= +o5& i6P +o5 i6H +o5, i6d +o5. i6B Y1 +o5@ i6( +o5= i6) +o5. i5g +o5i *57 +o5i *56 +o5) i5@ +o5- i3t +o5@ i3c o0K +o5i .3 *85 +o5. i3, +o5. i2s +o5i ^2 +o5= i2= +o5+ i19 Y1 +o5i *12 +o5$ i0$ +o5I +o5i } +$. o5i +o5h y5 y5 +o5h x31 +o5h x21 D2 +o5h ^p +o5h oA@ +o5h o6a +o5H $o +o5H i5 +o5h D2 x21 +o5h .9 +o5h ] +o5g Z2 p3 +o5g $y p4 +o5g t +o5g o9b +o5g o7t +o5G o6O +o5G o4G +o5g o3w +o5g o3e +o5g o1j +o5g $k +o5g i1j +o5g d +o5G ^C +} o5g *47 +o5g $4 +o5g *23 +o5g *12 +o5G -0 +o5g -0 +o5f Y1 x71 +o5f x71 Y1 +o5f x71 +o5F x12 *27 +o5f ^T R5 +o5f t K +o5f R5 .7 +o5F o83 -3 +o5f o4w +o5F o4D +o5f o0y +o5f K t +o5f ^k +o5f i3E +[ o5F $F +o5f ^c D2 +o5f C *43 +o5f .7 R5 +o5f +7 +o5F ,6 +o5f *53 +o5f *52 +o5f *43 C +o5f *42 +o5f ^4 +o5F -3 o83 +o5f *23 +o5f *06 +] o5F +^@ o5F +$( o5f +o5E Z1 +o5E x32 ^F +o5E T4 y4 +o5e T1 +o5e s9. +o5e $s +o5e o7o +o5e o6x +o5e o6f +o5e o4r +o5e o2J +o5E i5G +o5e i2q +o5e [ D2 +o5e ^b +o5e *41 ,3 +o5? E .4 +o5e .4 +o5e ,3 *41 +o5* ^E +o5e [ +} o5e +] o5 $e +o5d Z2 +o5D y3 x62 +o5d y3 +o5D T7 +o5D r *76 +o5D o6@ $6 +o5D o4G +o5d o4D +o5d o0s +o5d o0p +o5D K +o5& D8 +o5D $6 o6@ +o5D *67 +o5D $6 +^@ o5& D6 +o5D *57 +o5* D1 +o5. D0 +^@ o5d +o5c Z3 u +o5C x03 $8 +o5c x02 $4 +o5c ^V +o5c u Z3 +o5C T4 +6 +o5c T3 o4i +o5c o9- +o5= c o6T +o5c o4i T3 +o5c o0D +o5C $k +o5c K +o5c ^k +o5C [ i5- +o5c i34 +o5C $8 x03 +o5c *72 +o5C ,7 +o5c $7 +o5C +6 T4 +[ o5C ^6 +o5c *57 +o5c *52 +o5- c $5 +o5c $4 x02 +o5c .4 +o5c *37 +o5c [ +o5, c } +} o5c +o5b x73 +o5B ^W u +o5B u ^W +o5b o1e +o5b i5/ +o5b D7 +o5b +7 +o5b *51 *53 +o5b *40 +o5b -2 *27 +o5b $- +$$ o5b +] o5b +o5A y5 +{ o5a y3 +o5a y2 +o5* ^a Y1 +o5A x63 +o5A o7% +o5a o6g +o5a o2A +o5a i4/ +o5a *A6 +o5a $7 +o5a -7 +o5a *54 +o5a *12 +o5A +0 y5 +o5@ ^A +o5- ^A +$! o5A +o5A +o5a $$ +o5a ^! +o5- ^a +$% o5a +^* o5a +o59 t } +o59 } t +o59 r +o59 o31 +o59 o2k +o59 K *34 +o59 $A +o59 *87 +o5@ *98 +o5$ +9 .4 +o59 *34 K +o5_ $9 +o58 Z1 D4 +o58 y5 +o58 T0 +o58 R6 *43 +o5/ +8 p4 +o58 p1 +7 +o58 o3d +o58 o0D ,6 +o58 D4 Z1 +o58 C { +o5@ *87 +o58 ,6 o0D +o5$ *85 +o58 *43 R6 +o58 *14 +o58 [ +o5_ $8 +$# o58 +^o *58 +o57 Y2 Y2 +o57 ^K +o57 i6z +o57 $b +o5! *75 o2k +o57 *04 +o5^ '7 -0 +o57 $% +$- o57 +o56 Y4 +o56 y3 +o56 T6 $! +o56 $! T6 +o56 o4d +o56 i52 +o56 C +o5* *67 +o56 $5 +o5@ *65 +o56 *43 +o56 $2 Z1 +o56 *23 +o5! +6 *23 +o56 +2 +o56 -0 +o56 $! +o56 $- +o5@ ,6 +$$ o56 +$ o56 +[ o56 +^@ o56 +o55 y5 C +o55 $R +o55 o95 +o55 o7f +o55 o67 +o55 o44 +o5$ -5 o2# +o55 o1M +o55 o1f +o55 ^m *65 +o55 i5@ +o5- $5 c +o5@ *56 +o55 $4 +o55 .2 +o55 .0 +o55 $= +o54 y3 +o54 T4 +o54 p4 $D +o5_ ^4 o56 +o54 o40 +o54 k +o54 i78 +o54 i6a Y2 +o5? .4 E +o54 D2 +o5$ .4 +9 +o54 ,8 +o54 *75 +o5@ *45 +o54 *45 +o54 -2 +o5, *41 *34 +o54 ] +o5- -4 +] o54 ^- +[ o54 +o53 t d +o53 T4 +o53 r R7 +o53 o2. +o53 o08 +o53 ^n +o53 i4o t +o53 E +o53 d t +o53 D8 +o53 'B +o53 -6 +o53 *41 +o5/ .3 +0 +o5, *30 +o5& ,3 +o5_ +3 +[ o5 ,3 +o5- +2 Z2 +o52 x84 +o52 smu +o52 o6_ +o52 o4* +o52 o1d L2 +o52 L2 o1d +o52 l +o52 i5e +o52 ^i +o52 ,9 +o52 *76 +o52 +6 +o52 -6 +o52 *56 -4 +o52 -4 *56 +o5! *23 +6 +o5. *20 Z3 +o5. ] ,2 +o5. ,2 ] +$$ o52 +o51 Z5 t +o51 ^z +o51 y1 i03 +o51 x21 +o51 t Z5 +o51 T0 +[ o51 sez +o51 p1 c +o51 o8l +o51 o82 +o51 ^m +o51 K +o51 i55 +o51 ^H +o51 ^g +o51 DB +o51 ,4 +o51 +3 +o51 .0 +o51 $, +o5@ $1 +o5. $1 +o5- -1 +o5 ,1 +} o51 +o51 +o5, ^0 z3 +o50 Z2 ,8 +o50 y5 l +o50 Y3 +o50 Y2 +o50 stk +o50 o34 +o50 l y5 +o50 ^L ^K +o50 K +o50 i2s +o50 D3 +o50 $b +o50 +A +o50 ,8 Z2 +$O $5 *08 +o5^ -0 '7 +o50 } *64 +o5/ +0 .3 +o50 } +o5+ -0 +$$ o50 +$O ^5 +^O $5 +o5+ $. +o5& { +o5& +o5* ^* +o5$ $$ +o5@ $! +o5' +o5/ +o5? $! +o5! ^@ +o5_ ^@ +o5> +$o +5 +$@ o5@ +$! o5@ +] o5& +] o5; +^( o5. +o4z y5 t +o4z y5 +o4z t y5 +o4Z R5 +o4z p5 i6n +o4z i7y +o4z i2s +o4z d +o4Z C +o4z ^A +o4z *96 +o4Z +5 +o4* Z4 ^w +o4- z1 si5 +$! o4! Z1 +o4z .1 +o4z $. +o4y y5 y5 +o4Y Y2 t +o4y Y2 +o4Y t Y2 +o4y r +o4y i3- +o4Y c ] +o4Y ] c +o4Y $9 +o4y *87 +o4y *64 +o4! y5 D9 +] o4@ y5 +o4 Y4 +o4. y3 .5 +o4% Y3 +o4- Y3 +o4y +3 +o4 y3 +o4] Y2 i0[ +o4y *24 $? +o4y $? *24 +[ o4@ Y1 +o4y ^0 +o4x x71 +o4x T2 +o4x o3I +o4x o0z +o4X o0W .2 +o4X i5n +o4x i4- +o4/ x81 +o4_ x72 +o4x *63 +o4. x63 +o4_ x61 +o4x *60 +o4 x51 +o4X .2 o0W +o4x *05 +o4* ^w Z4 +o4w z1 ,6 +o4w x52 +o4w u +o4W snl +o4W s3h +o4w ^S +o4w o7x +o4w i5z +o4w i5L +o4w i4o +o4w D8 r +o4w +6 +o4w -5 +o4w *32 +o4v x31 +o4V u +o4v sgo +o4v o7c +o4V o77 +o4v o5e +o4v o3g +o4V o0S +o4v i2p ^m +o4v *52 +o4v ^3 *46 +o4v *23 +o4u y3 +o4u x62 +o4U u +o4u slq +o4u scR +o4u o9y +o4U o0S +o4U i5P +o4u i4v +o4u i3L +o4u i2t +o4u *52 +o4u *17 +o4u $1 +o4u $# +o4. ^u +o4? ^u +$> o4u +{ o4u +] o4u +o4t y2 +o4t $T +o4t $P D7 +] o4T o5V +o4T o5S +o4T o2R +o4t i5w +o4t i5m +o4t i0A +o4t D7 $P +o4T D6 $! +o4T $! D6 +o4T c -6 +o4T *76 ,5 +o4t ,7 +5 +o4* T7 +o4T -6 c +o4T ,5 *76 +o4t +5 ,7 +o4 t *57 +o4* t *45 +o4$ T3 ,2 +o4@ T3 +o4) T3 +o4t -3 +o4@ T1 +o4. T1 +o4t *01 +[ o4 T0 +o4t -0 +o4T $# +o4@ ^T +o4. t +o4s ^S +o4s $r +o4s o9@ +o4S o3J +o4s ] ^n +o4s ^n ] +o4- si5 z1 +o4s *62 +o4s *47 +o4S ,3 +o4s -2 +o4S +o4s $# +$* o4s +$? o4s +$_ o4s +o4R y2 E +o4R sR< +o4r R5 *42 +o4r o3@ +o4r i4M +o4R i4* +o4r i33 +o4r $9 +o4r ,8 +o4r ^8 +o4r .7 +o4R ,6 ^ +o4r *42 R5 +o4# R3 +o4r $2 +o4R $0 +o4R $. +o4R +o4. r +$! o4r +{ o4r +o4q o5p +o4. q D0 +o4q +7 +o4. q [ +o4q +o4p ^y +o4p x53 +o4p u +o4P o3s +o4p o3e +o4p ^m +o4p K *35 +o4P $# iA9 +o4P i4G +o4p i0w +o4P C p5 +o4p $b +o4p $a +o4p *54 +o4p *50 +o4P -5 +o4p *40 +o4p *35 K +o4p *12 +o4. p1 +[ o4p +o4o y3 ] +o4o ] y3 +o4o $u +o4o $r +o4o ^P +o4o o0q +o4o L7 +o4o K +o4o i7* +o4o i5t +o4O E +o4o D1 +o4o $b +o4o $A +o4. o91 +o4$ o6x +o4* o65 +o4o *63 +o4o ,5 +o4$ o28 +o4. o1j $3 +o4) o14 +o4* o0Z +o4 o0Y +o4. o0d ^e +o4! o0@ +o4o $* +o4< $o +$? o4o +o4n y4 +o4N Y3 i50 +o4n ^T +o4n r +o4n ^p +o4n oA1 +o4n o6x +o4N o3M +o4n $N +o4N i60 +o4N i50 Y3 +o4n C *53 +o4n *82 +o4n *53 C +o4N $1 +o4N $? +o4n { +o4- $n +o4M z3 z3 +o4m y4 +o4M ^y +o4m x21 i0W +o4m o0g +o4m i0J +o4m d +o4M c +o4m +5 y2 +o4m *56 .5 +o4m $5 +o4m [ *32 +o4m ] .3 +o4m .3 ] +o4m *28 +] o4M +o4m $! +o4l y3 p3 +o4l y2 +o4l t *34 +o4l sr& +o4l o3P +o4L i6v +o4l $d +o4L ^C +o4l c +o4l +6 *34 +o4l $4 +o4l *34 t +o4l *34 +6 +o4_ L2 y2 +o4L *25 +o4l +2 +o4L *03 +o4 $L +o4l $= +o4l ^; +o4l +o4k y5 +o4# ^K x65 +o4k x63 +o4k o3o +o4k i4u +o4k i47 +o4K E +o4k D7 +o4k D0 D0 +o4k $6 +o4k -3 +o4k *27 +o4k *03 +o4k +0 +o4k -0 +o4_ ^K +} o4k +o4j Y3 +o4J x51 +o4J x31 +o4j t *46 +o4j smf p1 +o4j p1 smf +o4j o7! +o4J i6y +o4J i4T +o4j i4O +o4J D3 +} o4j $c +o4j *46 t +o4j $2 +o4j -2 +o4j +1 +o4 $J +o4i Y2 *72 +o4i y2 +o4i x92 +o4i x01 +o4I u +o4i t d +o4i R6 +o4i o8, +o4i o6u +o4i o3D +o4i k ^K +o4i d t +o4i d $o +o4I C +o4I *63 +o4 i5b +o4@ i4e .2 +o4i *35 +o4i *23 +o4i +2 +o4_ i2- +o4] i0[ Y2 +$` o4i +o4h ^w +o4h p1 +o4h o22 +o4h *A5 +o4H ^2 +o4_ ^H +o4g { Y2 +o4G o5$ +o4g o1h +o4g ^m +] o4G l +o4g i6y +o4g -7 +o4g *46 +o4g *15 +o4g *02 +o4G $. +o4g $+ +o4g $- +o4* ^g +o4? ^g +$! o4g +o4f r +o4f i5c +o4F i4s +o4f i3c +o4f i2d +o4f $F +o4f d x94 +o4f D2 +o4f D1 +o4f *75 +o4F *21 +o4f +1 +o4, ^F +o4f [ +o4e x13 +o4e ^s +o4E L7 +o4e i6e +o4e i5t t +o4E $e Z1 +o4e c -5 +o4e -5 c +o4e +1 +o4e -0 +o4 E +o4e +o4D y2 y5 +o4d Y1 c +o4D x31 -2 +o4D x31 +o4D o1C +o4d i6r +o4d i4l +o4d c Y1 +o4D 'A *40 +o4d *89 +o4D *40 'A +o4@ D3 *57 +o4d *34 +o4D -2 x31 +o4d { -1 +o4d *05 +$* o4d +{ o4C r +o4c o6d +o4c o1r +o4 $C l +o4C E +o4c $D +o4c *13 +o4 C +$! o4C +o4c } } +o4( c +o4b x53 +o4b x13 u +o4b x12 +o4b u x13 +o4b t p1 +o4B $s *84 +o4b p1 t +o4b o6t { +o4B ^C +o4b ^A +o4B *84 $s +o4b +3 +o4b $3 +o4B $0 x72 +o4b $! +$! o4b +$- o4b +o4a z4 x07 +o4a Y3 +o4a ^Y +o4a u d +o4a sth +o4a $R +o4a oA_ +o4A l ^h +o4A ^h l +o4a d u +o4A ^D +o4a 'B +o4a *21 +o4a *15 } +o4a *12 +o4* ^A +o49 u +o49 o8@ +o49 o5= +o49 o3f +o49 i5p +o49 i53 +o49 i0g i1v +o49 ^g +o49 ^7 +o4= *94 x62 +o49 +2 +o4$ *91 ,8 +o4 $9 +o4 '9 +$. o49 +$, o49 +$- o49 +o48 x71 +o48 u d +o48 ^T C +o48 o6t +o48 o1s } +$o *48 $n +o48 i7| +o48 d u +o48 *96 x12 +o4$ ,8 *91 +o48 *53 +o48 .5 +o48 .1 +o48 $! +o4< +8 +{ o48 +o47 Z2 [ +o47 [ Z2 +o47 } $z +o47 y1 u +o47 u y1 +o47 r +o47 o3* +o47 K +o47 $3 +o4- *71 *08 +o4_ ,7 +$. { o47 +o47 +o46 y3 +o46 x53 +o46 x03 i4u +o46 x01 +o46 ^w +o46 $r +o46 $g +o46 D5 +o46 $. .8 +o4@ *67 +o46 ,3 +o4? *63 +o46 *24 +o46 ^1 +o46 $! +o45 T9 *14 +o45 ^T +o45 o5A +o45 o5* +o45 o2@ +o45 o1f +o45 i78 +o45 i75 +o45 E ,9 +o45 DA +o45 ,9 E +o45 ,8 +o4 *57 t +o45 *78 +o45 *74 +o45 *34 ^f +o4, *52 +o45 *14 T9 +o45 *14 +o45 $! +o4@ +5 +o4/ ,5 +] o45 +^@ o45 +o44 T7 +o44 $c +$$ o44 c +o44 '6 +o4* *45 t +o44 .5 +o44 ^4 +o44 ] +o44 [ +o4# ^4 +] o44 +o43 Y4 c +o43 R3 +o43 o6@ +o4. $3 o1j +o43 o1H +o43 $k ^h +o43 $K +o43 k +o43 ^I +o43 ^h $k +o43 $e } +o43 c Y4 +o43 *85 +o43 *54 +o43 ^4 +o43 *27 ,7 +o4# *32 [ +o4$ *32 +o4* +3 +o4. +3 +o4. .3 +o4- -3 +$. o43 +o42 Y3 o2d +o4$ ,2 T3 +o42 p4 o7. +o42 o58 +o42 o2d Y3 +o4@ .2 i4e +o42 $i +o42 E D3 +o42 D3 E +o42 $d +o42 *40 ^u +o42 $4 +o42 ^4 +o4@ *24 +o4$ *23 +o42 +2 +o42 .1 +o42 *04 +$# o42 +} o42 +o41 x52 +o41 T7 +o41 T5 +o41 ^s +o41 o0Z +o41 o0d +o41 ^M +o41 $l *75 +o4# -1 k +o41 i1& +o41 ^F +o41 DA +o41 c +o4@ *17 R7 +o41 *75 $l +o4, *16 $. +o4, $. *16 +o41 +2 +o4. *12 +o41 -0 +o41 $? +o4@ ^1 +o4, .1 +o4- +1 +o4_ ,1 +o4_ ^1 +o4 $1 +o40 x93 +o40 x71 i13 +o40 x62 +o40 o8@ +o40 o54 i4- +o40 $k +o40 i2g +^o *40 ^F +o40 c $@ +o40 $@ c +o40 *97 +o4- *08 *71 +o40 *85 +o40 *78 +o40 *73 +o40 ^7 +o4- *07 +o4- *03 +o4* *02 +o40 $, +o4_ $0 +o4 +0 +o40 +o4% +o4# +o4* [ +o4@ ^ +o4( $) +o4( +o4! +o4; +o4, { +o4_ ^` +o4 $` +o4> +$# o4! +$- o4- +$_ o4_ +o3z Z5 u +o3z y4 +o3z x61 +o3z u Z5 +o3z $r +$@ o3z o8A +o3z o4@ +o3z $f +o3z ,9 *43 +o3z $9 +o3z *70 +o3z *58 +o3- Z4 Z4 +o3z *43 ,9 +o3z .2 +o3z -2 +o3z *14 Y2 +o3 Z1 +o3z $# +o3z ^^ +$& o3z +$. o3z +o3y y5 t +o3y y5 ] +o3y ] y5 +o3y t y5 +o3y o2V +o3y ^j +o3y ^A +o3y *72 +o3y *65 *12 +o3y .4 +o3* y4 +o3@ y4 +o3$ y3 y3 +o3y *31 +o3@ Y3 +o3- y2 +o3y *12 *65 +o3* y1 +2 +o3. Y1 +o3y [ +o3x $z +o3x Y5 +o3X y4 +1 +o3x $t +o3x spr +o3x $p -5 +o3x o1F [ +o3x i4a +o3X i2K +o3X E *21 +o3x $c +o3x -5 $p +o3x *57 +o3- x52 *04 +o3. x51 l +o3+ x41 +o3x .4 +o3X *21 E +o3$ x01 +o3! $x +o3w Y2 -7 +o3w x61 +o3w sC4 o4$ +o3w ^q +o3w $p +o3w o4z +o3w o4$ sC4 +o3W o0K +o3W ^E +o3w +9 +o3w .2 +o3W +o3v $s +o3V $r +o3v o2a +o3v i5c +o3v $A +o3v *67 *02 +o3v *67 +o3v ,5 +o3v *02 *67 +o3v *02 +o3v { +o3u Z3 x52 +o3u ^z +o3u y5 E +o3u y2 +o3u x52 Z3 +o3u u K +o3u o4. +o3u o2i +o3u K u +o3u K $! +o3u k +o3u i2t ] +o3u ] i2t +o3u D7 *50 +o3u $A +o3u *50 D7 +o3u [ *31 +o3u *03 ^B +^! o3u +o3t x52 +o3t x51 +o3T T8 +o3T T4 +o3t r ^n +o3t o0c +o3t i6r +o3t i2f +o3t i0i +o3* T2 +o3@ T2 +o3t *12 +o3% T1 +^< o3t +o3s z2 +o3s y3 +o3s Y2 +o3s x63 +o3S u r +o3s so# +o3S s20 +o3s s17 +o3S r u +o3s R6 +o3s p1 +o3S o5l +o3s o52 +o3- so5 +o3S o4h +1 +o3s ^n +o3s L0 *13 +o3s k +o3S ^I +o3@ sez +o3s $$ ^e +o3s ^e $$ +o3s ^a .6 +o3s $A +o3s +7 *16 +o3s *67 +o3S .6 +o3s ^4 o1K +o3s *45 +o3S +1 o4h +o3s *16 +7 +o3s *13 L0 +o3s $! -0 +o3s -0 $! +$% o3s +o3r r -6 +o3r L3 +o3r D5 +o3r ^D +o3r ^C +o3r $9 +o3r *83 +o3r $7 +o3r *64 +o3r -1 ^G +o3r +0 +o3r $. +o3_ r +^% o3r ] +^% ] o3r +o3q x72 +o3q x52 +o3q $p *57 +o3q o0g +o3q *75 +o3Q *38 +o3q *24 +o3q *23 +o3q .2 +o3q *05 r +o3q *03 +} o3q +o3p Z1 +o3p y4 Y1 +o3p Y1 y4 +o3p x51 +o3 ^p t +o3p p1 x06 +o3p ^k +o3p i6. +o3P i0L +o3p ^G k +o3p D4 ^e +o3p D1 i4b +o3p -8 *64 +o3p *64 -8 +o3p -5 +o3p -4 +o3p ,2 +o3p +0 +o3P $% +o3) ^p +^, o3p +o3O Z2 y3 +o3o Z1 x41 +o3O y3 Z2 +o3o y2 +o3o x41 Z1 +o3o u p1 +o3o u *62 +o3o s9- +o3o $S +o3o p1 u +o3o o2c +o3o o0a +o3o o02 +o3o ^k +o3o i4k D9 +o3O i2J +o3o D1 +o3o +A +o3* o7q +o3. o7g +o3< o7? +o3. o66 +o3o *62 u +o3. o5k +o3 o56 +o3? o4a +o3+ o48 +o3O ,4 +o3o *37 x43 +o3o +2 y2 +o3. o2y +o3# o2F +o3o $2 +o3- o1o +o3 o1f *35 +o3@ o1c +o3_ o0b +o3@ o0A +o3$ o0# +o3O +{ o3o +o3n y4 x41 +o3n D1 +o3N c +5 +o3N +5 c +o3n .1 +o3M { $z +o3m Y1 +o3m ^w +o3m ^r +o3m o6f +o3m o0Z +o3M o0c +o3m o0c +o3m ^L +o3m i6M c +o3M i3Y +o3M i2I +o3M D2 +o3M -6 i0N +o3m $4 +o3m .4 [ +o3m *21 +o3M $2 +$- o3m +o3l y4 +o3L Y1 *41 +o3. l x51 +o3L R2 ] +o3L ] R2 +o3l ^J +o3l ^I +o3L ^c +o3l *73 +o3l +5 +o3L *41 Y1 +o3^ L3 +o3l *16 +o3l $1 +o3l ,1 +o3l [ *01 +o3& l ] +o3& ] l +} o3K z2 +o3k x51 u +o3k $w +o3k u x51 +[ o3K T0 +o3K o6A +o3K o5R x41 +o3k o0v +o3k l *34 +o3K $k +o3k i7f +o3k i5r ^1 +o3k i5. +o3k D0 x91 +o3- K ^B +o3k .7 +o3k *61 +o3k $6 +o3- k $6 +o3K *47 +o3k *34 l +} o3K *30 +o3k *14 [ +o3@ k *05 +o3k $0 +] o3- K +o3k $% +$. o3k +o3j y5 x47 +o3j y5 +o3j x02 +o3J u +o3J i2P +o3J D4 +o3j d *20 +o3J D1 -0 +o3j D1 +o3J ^d *04 +o3J C +o3j $5 +o3@ $j -5 +o3j *25 +o3j *24 +o3J -0 D1 +o3j +0 +o3& ^J +$@ o3J +$. o3j +o3i Z2 +o3i Y1 { +o3i x02 ^G +o3i p1 +o3i o4s +o3i i3t c +o3i DA *A8 +o3i c i3t +o3i C +o3i $8 +o3i *76 +o3& i6b +o3- i4F +o3= i4d c +] o3* i3m +o3# i3E +o3 i33 +o3@ i3_ +o3 i0g +o3 i0a +o3@ i04 +o3i } +o3h Z5 *31 +o3h x62 +o3H x42 +o3H o7S +o3h o5o +o3H o5l +o3H i3E +o3h +7 +o3h *65 +o3h *31 Z5 +o3h $3 +o3h +2 +o3h $$ +o3h $! +] o3h +o3g y4 +o3g x61 u +o3g u x61 +o3G u D1 +o3g R0 +o3G q +o3g o6e +o3g $k K +o3g i4B +o3g E *54 +o3G D1 u +o3g [ d +o3g +7 +o3g ,6 +$% o3g +6 +o3g *57 +o3g *54 E +o3g *20 +o3G $1 +o3g -0 +o3f Z1 o5q +o3f x43 +} o3f shv +o3f R7 *52 +o3f o5q Z1 +o3F o5I +o3f o0q +o3F i38 +o3f $A +o3f -8 +o3f *52 R7 +o3f +5 +o3f ,4 +o3f -2 +o3f *15 +o3f *01 +o3$ ^f +o3, $f +o3e p5 o5. +o3e o8! +o3e o5- k +o3e o54 +o3e o2h p1 +o3e $O +o3e l i0| +o3e ^l +o3e k o5- +o3e K +o3E i1A +o3e i0| l +o3e *46 $# +o3e $# *46 +o3e *40 +o3e { *27 +o3e *06 +o3e -0 +o3 ^E +o3 E +o3^ E +o3e ^_ +o3D Y2 x53 +o3d o8t +o3d o7o +o3D o4u *12 +o3D o40 +o3d i1l +o3d i0J +o3D E ,2 +o3d *46 +o3d *45 +o3D *42 +o3 D4 +o3D ^3 +o3D ,2 E +o3d *25 +o3d *24 +1 +o3D *12 o4u +o3d +1 *24 +o3. d +o3! ^d +o3c Z1 C +o3c x72 +o3c $x *62 +$! o3c x12 +o3c sa4 +o3c o5$ +o3C o2s C +o3C ^N +o3= c i4d +o3c i3p +o3c i0m +o3c D1 +o3c C Z1 +o3c *62 $x +o3c *23 +o3# ^C *13 +{ o3C +o3@ c +$/ o3c +$? o3c +o3b ^u { +o3- ^B K +o3b $j +{ o3B i6v +o3b ^E *32 +o3b D5 +o3B C +o3b *72 +o3B *64 i2t +[ o3B ,5 +o3b *24 +o3b *03 +o3b *02 +o3B $- +o3 ^B +$& o3b +o3a y5 +o3A y4 +o3A y3 *20 +o3a sAu +[ o3a s2f +o3a R4 +o3a $p +o3a [ o4c +o3a o2y -4 +o3a o0W +o3a o07 +o3A L4 +o3a $K +o3a K +o3a k +o3a i5c +o3a i29 +o3a ^a +o3a -4 o2y +o3a *46 +o3a -3 +o3a $# $1 +o3& ^A +o3a $! +o3* $a +o3. $a +$* o3a +o39 Y1 +o39 ^w +o39 *56 +o3. *93 +o39 *15 +o39 .1 +o39 *05 +o39 $% +o3@ ,9 +$/ o39 +o39 +o38 Z4 -6 +o38 ^t +o38 r i5p +o38 R4 +o38 o4X +o38 o4 +o38 -2 +o3@ $8 +o3< '8 +o37 Z3 +2 +o37 T2 +o37 i6* +o37 $a +o37 *96 +o3. *75 +o37 +2 Z3 +o37 *20 +o37 *13 +o3 $7 +o3- $6 k +o36 i5l +o36 i5@ .4 +o36 i2b +o36 E +1 +o36 -9 +o36 *84 +o36 *37 +o36 *27 +o36 +1 E +o36 *05 +o36 $! +$* o36 +[ o35 y2 +o35 ^w K +o35 $N +o35 K ^w +o3@ -5 $j +$% o35 E +o35 D6 Y4 +o35 -7 +o35 *46 +o3_ *53 ] +o3_ ] *53 +o35 *21 +o3- ,5 -2 +o35 -0 +o35 $@ +o3- ,5 +^o *35 +o34 o2. +o34 ^N +o34 ^j +o34 i5b o6g +o3# *47 +o3. *45 $- +o3. $- *45 +o34 *31 +o34 .2 +o3 *42 +o34 *13 +$* o34 +o33 y3 ^@ +o33 Y1 +o33 x41 +o33 sy_ D5 +o33 $S +o33 o93 +o33 o2< +o33 o0X y1 +o33 K +o33 i73 +o33 D5 sy_ +o33 D0 +o33 c *42 +o33 C +o33 $A +o3 *35 o1f +o3+ *35 +o3& *35 +o3? *35 $? +o3? $? *35 +o33 *42 c +o3- *34 +o33 *34 +o33 ,2 +o3( *31 [ +o33 $# +o33 } +o3. ^3 +$? o33 +o32 Z1 *27 +o32 Y3 o0@ +o32 x52 +o32 svr +o32 s59 +o32 o5B +o32 o13 +o32 o0@ Y3 +o32 ^l +o32 i27 .1 +o32 ^A +o32 *8A +o32 +5 +o32 ,5 +o3- -2 ,5 +o32 $4 +o32 $3 +o32 +2 +o32 $2 +o32 -0 +o3 *20 +o3@ .2 +o3@ -2 +o3; .2 +o3, ,2 +o3- $2 +o3- ^2 +[ o32 +o31 z1 +o31 T1 $$ +o31 $$ T1 +o31 p4 ^d +o31 ^N +o31 i7Y +o31 $f +o31 D5 +^o *31 +6 +o31 ,4 +o31 *21 +^, o3_ *12 +o31 +0 +o31 } +o31 ] +o3$ $1 +o31 +o30 x65 +o30 t ,4 +] o30 t +o30 o5u +o30 { i0m +o30 -7 *12 +o30 *65 +o3- ^0 ,5 +o3- *04 x52 +o30 ,4 t +o30 *24 +o30 *12 -7 +o30 *02 { +o30 $? +o30 $_ +o3@ +0 +o3+ $+ +o3# ^. +o3& $! +o3@ $. +o3@ ] +o3; $; +o3^ +$# o3$ +$@ o3# +$; o3< +] o3# +] o3& +[ o3, +o2z $Z +o2Z y4 l +o2z Y4 +o2z y4 +o2z x5B +o2z x52 +o2z ssd +o2z $Q o5z +o2z p3 +o2z o7d +o2z o5z $Q +o2z o3f +o2z o3b +o2z o3. +o2z o02 +o2Z l y4 +o2z i2t +o2z $5 +o2- z3 +o2. z2 +o2. Z1 +o2z $- +o2z $_ +o2z } +o2z ] +o2. ^z +$@ o2z +o2y Y3 +^@ o2y x62 +o2y se +o2y R8 +o2y r +o2y p4 $x +o2y o0Y +] o2y $M +o2y k ,4 +o2y i2z +o2Y c $% +o2Y $% c +o2y *61 +o2y ,4 k +o2- Y4 +o2_ y3 +o2- y2 K +o2% Y2 E +o2. y2 +5 +o2+ y2 +o2, y2 +o2y *04 +$. o2y +o2x x52 +o2x ^U *43 +o2x t D9 +o2x $R +o2x $p +o2x o0j +o2x ^l +o2x D9 t +o2x +6 *02 +o2x *54 +o2x +5 +o2x *47 +7 +o2x +3 i3v +[ o2@ x32 +o2x *02 +6 +o2x *02 +o2X $! +o2X +o2x $? +o2w Z2 +o2w Y5 $L +o2w y5 +o2W x01 T4 +o2w t +o2w $s +o2w r +o2w o1s +[ o2w K +o2w i6m +o2w i4o +o2W i3Y +o2w i1f +o2W C +o2w +3 +o2w -3 +o2w *16 +o2w $@ +] o2w +o2V Z5 Z4 +o2V Z4 Z5 +o2v Y2 +o2v xA2 +o2v x51 +o2v sbx +o2v r +o2v q l +o2v $q +o2v ^p +o2v o7p +o2v o4s +o2v o1k +o2v l q +o2v ^j +o2v i4T +o2v $d +o2v -6 +o2v *34 +o2v *20 +o2v *04 +o2v } +$? o2v +o2U y5 K +o2u y4 +o2u y3 +o2u x82 +o2u $+ p5 +o2u o4k +o2U K y5 +o2u i6n +o2u i6% +o2u i0b +o2u D6 +] o2u *38 +o2u *17 +o2u $! +o2 u +$- o2u +] o2u +o2u +o2t y5 u +o2t Y4 Y4 +o2T x31 E +o2t u y5 +o2t u d +o2t $s +o2t o73 Y4 +o2t o6u +o2t o5T +o2t o3u +o2t [ o0K +o2t $O +o2T l +o2- t K +o2t ^H +o2T E x31 +o2t d u +o2t D6 +o2T D5 +o2t $d +o2t -8 +{ o2t +7 +o2t -6 +o2t *52 +o2t .5 +o2t -4 ^u +o2T .4 +o2S y3 +o2s y3 +o2s Y2 +o2s x41 +o2s x31 +o2s t T3 +o2S T8 +o2s T3 t +o2S T1 *54 +o2s $s -6 +o2s s36 *64 +o2s o7b +o2s o6n +o2s i86 +o2S i0n x51 +o2( s9) +$. o2s *74 +o2s *70 +o2s -6 $s +o2s *64 s36 +o2s *57 +0 +o2S *54 T1 +o2s .5 +o2s +0 *57 +o2s +0 *04 +o2s +0 +o2r y4 x42 +o2R o1V +o2r o0t +o2R k .4 +o2r ^K +o2r i3g +o2r i1v p3 +o2r i0O +o2r $e +o2r D6 *23 +o2r +7 +o2r $7 +o2r *54 +o2r *52 +o2R .4 k +o2R $4 +o2r *23 D6 +o2r -0 +o2r $$ +o2r $@ +o2r { { +o2@ r +o2_ r +$! o2r +o2Q z1 *14 +o2q ^z +o2q xA1 +o2q x32 +o2q $x +o2! q q +o2q K +o2q $k +o2q *73 +o2q *72 +o2q *43 +o2q -3 +o2q *03 +o2q $@ +} o2q [ +} o2q +o2p u +o2P t +o2p o5y +o2P ^M x12 +o2P k +o2p ^K +o2p ^k +o2p i3f +o2p ^g +o2p ^e +o2P C i0v +o2p [ +o2o q *57 +o2o o1a +o2o i3x +o2o i0C +o2o $H +o2o $h +o2o D7 +o2@ oA5 +o2- o5- y2 +o2, o5i +o2o *57 $! +o2o $! *57 +o2! o4# +o2- o3h +o2, o38 +o2/ o1s +o2@ o14 +[ o2- o0z +o2@ o0Y +o2> o0P +o2! o0a +o2o $? +o2o [ +o2n p1 +o2N o3M +o2n o0s +o2n $M +o2N i5R +o2n c *78 +o2N ^A +o2n *78 c +o2n *75 +o2n *70 +o2n *60 +o2n $5 +o2n ^3 +o2n *17 ] +o2n ] *17 +o2n *14 +o2n ,1 ^[ +o2n ^& +$/ o2n +o2m Z2 c +o2M y5 l +o2m y2 +o2m Y1 $0 +o2m Y1 +o2m u +o2m spI +o2m o0R +o2m $O +o2M l y5 +o2m K +o2m ^k +o2m i7 +o2M i5r +o2m i5f +o2m i4f +o2m i2t +o2m $G +o2m c Z2 +o2M .6 *46 +o2m .6 +o2m *57 +o2m .5 +o2m *42 +o2m *03 +o2m $- +o2. ^m +$% o2m +$* o2m +$. o2m +$? o2m +o2l t +o2l p5 +o2L l *41 +o2l i72 +o2l i3f +o2l i3@ +o2l i0j +o2l E +o2L D5 +o2l .8 +o2l *74 +o2l .6 r +o2L *41 l +o2l *36 +o2l *13 +o2l .0 +o2l ] +] o2l ] +] ] o2l +o2k Z2 +o2k y3 +o2- K y2 +o2k x81 +o2k x52 +o2k x45 u +o2k x41 +o2K x31 *14 +o2k u x45 +o2- K t +o2k sk@ *02 +o2k o5r +o2K o3O +o2k o1e +o2k ^k +o2k i4p +o2k i4a +o2k i1j +o2k $h D6 +o2k D6 $h +o2k ,8 +o2k +6 [ +o2k ,1 +o2k *02 sk@ +o2j Z1 ^A +o2j $z +o2j y4 +o2j x45 +o2j $@ ^t +o2j ^t $@ +o2J p4 l +o2j p1 +o2j o5s +o2j o4r l +o2j o48 +o2j o3u +o2j o3g +o2J l p4 +o2j l o4r +o2j k -1 +o2j K +o2j ^k +o2j i3a +o2j ^A Z1 +o2j +7 +[ o2j .6 +o2j *56 +o2j +3 *43 +o2j -3 +o2j -1 -1 +o2j $@ +o2j ^, +$, o2j +o2i Y1 +o2i x73 +o2I u o3B +o2i u ^A +o2I o3B u +o2I l D1 +^! o2i D4 +o2I D1 l +o2i ^b +o2i ^A u +o2i $9 +o2- i4a +o2i *30 +o2i +3 +o2i .3 +] o2@ i3$ +o2i $2 +o2- i1y +o2_ i0s +o2, i0g *14 +o2* i02 +o2i $# +} o2i +{ o2i +o2h y5 { +o2h { y5 +o2h Y3 x34 +o2h Y2 +o2h u *9A +o2h ssz *73 +o2H $s i0G +o2h o1t +o2h o0f +o2H o0B +o2h k p1 +o2h i6u +o2h i6i +o2h i1v L4 +o2H i0N +o2H i0G $s +o2h D5 +o2h D4 +o2h ^a +o2h *9A u +o2h *73 ssz +o2h *31 +o2h *27 +o2h *03 +o2G Z1 o1I +o2g $s +o2g R1 *35 +o2g r +o2g o40 +o2G o1I Z1 +o2g l +o2g k +o2g i2c +o2g f x59 +o2g D1 +o2g $8 +o2g *46 +o2g *35 R1 +o2g *31 +o2g *20 +o2g ^# +o2f y4 c +o2F Y4 +o2f $x +o2f o8E } +o2f o4. +o2f o0R +o2f k *51 +o2f ^e +o2f +9 +o2f *52 y1 +o2f -3 +o2f ,1 +o2f -1 +o2f $/ +[ o2f +o2e Y4 +o2e Y2 +0 +o2% E Y2 +o2e x42 y3 +o2e t d +o2e R7 +o2e o6t +o2E o1S +o2e o0f +o2e k D4 +o2E i3l z1 +] o2e E +o2e d t +o2e D7 +o2e D4 k +o2e -7 +o2e +3 +o2e +0 Y2 +o2) E +[ o2E +o2e $# +o2d y5 $A +o2D { y2 +o2d Y1 o3e +o2d $q +5 +o2d p3 *13 +o2d p1 +o2d o5h +o2d o3e Y1 +o2d o33 +o2d o10 +o2D o1= +o2d $k +o2d i4p y2 +o2d i4m +o2d $A y5 +] o2d $8 +o2d *70 +o2# D6 i44 +o2$ D6 ,3 +o2d +6 +o2d +5 $q +o2D ^4 +o2d $3 +o2d ^1 +o2d ] +o2_ ^d +{ o2d +[ o2d +o2C z4 ,5 +o2c Z1 s1d +o2c y5 +o2c x81 +o2c x52 [ +o2c ^v +o2c s8# +o2c s1d Z1 +o2C o5l +o2C o0A +o2c i4+ +o2c i2z +o2c i22 +o2C ^A +o2c -6 +o2c { *57 +o2c *40 +o2c +3 +o2c ,3 +o2c $` +o2, $c +o2 ^c +o2B y5 l +o2b y4 +o2b x63 +o2b x46 +o2b x02 y3 +o2b u .1 +o2b son +o2b o3s +o2B l y5 +o2b i51 +o2b i3W +o2b i3. +o2B i0A +o2b i04 +o2B .6 +o2b *56 +o2b *34 $! +o2b $! *34 +o2b *31 +o2% ^B *20 +o2b .1 u +o2b $1 +o2B *02 +o2b *02 +o2a Y4 +o2a y2 y2 +o2A y2 +o2A x72 T5 +o2a x71 +o2a x63 *63 +$_ o2A x32 +o2a x31 +o2a ^v *46 +o2A T5 x72 +o2A svm +o2A p1 E +o2a o1w +o2a i6_ +o2A i5k +o2a E { +o2a E +o2A ^D +o2a $8 +} o2a *79 +o2@ *A4 +o2a } *38 +o2a *17 +o2a *14 p1 +o2a -1 +o2A +o2a $, +$! o2a +o29 Y2 +3 +o29 y2 +o29 -7 +o29 +3 Y2 +o29 *30 +o29 -0 +o2@ +9 +o2@ ^9 +o28 R0 +o28 r +o28 q { +o28 o60 +o28 o17 +o28 o0s +o28 -6 *13 +o2- *84 +o28 *13 -6 +o28 ^1 +o2@ '8 +$# o28 +$. o28 +o27 o7a +o27 *23 z3 +o27 *23 +o27 } +o2+ ^7 +o26 $x +o26 o7- +o26 $g +o26 $f +o26 -8 +o2@ *64 +o26 $* +o2} '6 ^{ +o2= $6 +o25 x01 +o25 ^j +o25 ^F +o25 D9 +o25 *52 +o25 ,3 +0 +^* o25 -1 +o25 +0 ,3 +o2# -5 +o2, +5 +o24 y2 +o24 x01 +o24 ^o +$o *24 i2c +o2/ *46 +o24 *54 +o2- *42 +o24 $! +o2. -4 +$. o24 +o23 Y3 +o23 y2 +o23 y1 +o23 x61 +o23 x41 i2c +o23 srR +o2. ,3 p1 +o23 o9D +o23 ^k +o23 k +o23 i0f +o2$ ,3 D6 +o23 *75 $+ +o23 $+ *75 +o23 +5 +o2+ *34 Y4 +o2% *32 +o23 -1 *51 +o23 *02 +o2* -3 +o2. ^3 +o22 z1 +o22 T1 +o22 T0 o36 +o22 R8 +o22 R4 +o22 o36 T0 +o22 o0a +o22 i5- +o2. *29 +$. o22 *65 +o22 *60 D6 +o22 '6 +o2@ *25 +o2 *20 +o2 $2 +o21 $x +o21 o52 +[ o21 K +o21 $j +o21 ^B +o21 *83 +o21 ,4 y1 +o21 *34 +o2@ *13 +o21 ^! +o2$ ^1 +o2; +1 +$. o21 +o20 Y4 ] +o20 l $d +o20 l +o20 i3@ +o20 $d l +o20 ^c +o20 c +o20 *76 +o20 *57 +o20 $4 +o20 +1 +o20 $* +o2/ +0 +$* o20 +o2+ } $. +o2* ^# +o2( +o2- +o2= +o2` +$@ o2_ +$ o2 +} o2@ +^[ o2] +^) o2) +o1z z3 *36 +o1z Y2 ^x +o1z ^x Y2 +o1Z q +o1z o64 +o1z o56 +o1z o44 +o1z o2i k +o1z L0 +o1Z K p1 +o1z k o2i +o1Z i73 +o1z i4y +o1z ^h r +o1* z2 +[ o1$ Z1 +o1z +0 +o1, $z +o1y y5 c +o1y y2 +o1Y u ^1 +o1y $K +o1y i7r +o1y i6? +o1y E +o1= Y4 o67 +o1y +4 +o1y -4 +o1y *24 +o1$ y2 *21 +o1Y ^1 u +o1* y1 t +o1y *06 +o1y -0 +o1_ ^Y +{ o1y +[ [ o1y +^@ o1y +o1x Z1 o71 +o1x Z1 E +o1x x35 +o1x R3 +o1x R2 +o1x p1 +o1X o5t o0@ +o1X o0@ o5t +o1x E Z1 +o1x *53 +o1X *20 +o1X *06 $! +o1X $! *06 +o1w ^z +o1W y4 c +o1w y3 y3 +o1w x01 .2 +o1w ^s +o1w p4 ,5 +o1W o31 +o1w $n +o1W k +o1w i40 +o1W $G +o1w ^D +o1w *51 +o1w -0 +o1w { +o1v x61 +o1v x34 +o1V x31 *53 +o1v t +o1v sv0 o4d +o1v s2g +o1v o4d sv0 +o1v o22 +o1v K +o1v i3c x32 +o1v ^d +o1v ^b +o1v *64 +[ o1V *60 +$. o1V +o1u Y4 -9 +o1u x65 +o1u x54 +o1U x41 -0 +o1U u +o1u sm4 +o1u R0 +o1u +9 +o1u -5 +o1u *41 +o1u *34 y5 +o1u -3 +o1u $1 +o1U -0 x41 +o1U *01 +o1u $/ +{ o1u +] o1u +o1T z1 +o1t y1 ^a +o1* t y1 +o1t $m +o1T k $2 +o1t i58 +o1T i0! +o1T -8 +o1t -7 +o1@ T5 +^. o1t -5 +$O $1 T3 +o1T $2 k +o1& T2 +o1@ T2 +o1t *18 +^@ o1T +] o1t +o1S y5 [ +o1s r -3 +o1s o0w $7 +o1# so) +o1S k $4 +o1s $g +o1! se@ +o1s DB +o1s D5 +o1s ^B +o1s $7 o0w +o1S $7 +o1s *52 +o1s ^4 ^w +o1S $4 k +o1s *34 i1& +o1s -1 *06 +o1_ s1@ +o1s *06 -1 +o1s $0 +o1s [ +o1/ ^s +o1R o0F +o1r k +8 +o1r i2D c +o1r ^h +o1r +8 k +o1r $6 +o1r $4 +o1r *31 +o1r *24 +o1r *02 +} o1R +o1R +o1r ^@ +o1_ ^r +o1q Y2 T0 +o1q T0 Y2 +o1q ^s +o1q K +o1q k +o1Q i5O +o1q i2d +o1Q .6 +o1q *24 +o1p x01 ] +o1p ] x01 +o1p stW +o1p ^r +o1p o5W +o1p o2w [ +o1p o0W *17 +o1p i4c +[ o1p i2c +o1p ^G +o1p ^@ D1 +o1p $d +o1P c -3 +o1P -3 c +o1p *17 o0W +o1P +^@ o1p +o1p +o1o y5 +o1O Y2 k +o1o x32 i2k +o1O p1 *47 +o1o o9e +o1o o7. *23 +o1o o2p +o1o o0p +o1o ^o +o1O k Y2 +o1o k +o1o i7- p3 +o1o $F +o1o DA +o1o $d +o1O c $9 +o1o ^b +o1O $9 c +o1o +9 +o1o .7 +o1o *67 +o1o -6 +o1# o50 *32 +o1@ o4N +o1o *32 +o1o -3 +o1* o3! +o1o *23 o7. +o1^ o21 +o1. o0e +o1o *08 +o1o *05 +o1. o0, +o1O $* $* +[ o1O { +o1o $* +o1n ^t +o1n ^L T6 +o1n i0w +o1n d i5@ +} o1n .3 +o1n -0 +o1- ^N +[ o1n +o1M y4 x62 +o1m u *32 +o1M o55 +o1M o41 -5 +o1m o2P +o1m o0d +o1M l +o1M K c +o1M k $7 +o1M k *32 +o1m f x3A +[ o1m E +o1m D3 +o1M c K +o1m ^c +o1M $7 k +o1M -5 o41 +o1m *32 u +o1M *32 k +o1m +3 +o1m .0 +o1M $% +o1M $! +o1@ ^M +$! o1m +o1l Z4 +o1L T9 +o1l r +o1l o2K +o1L o0S ,7 +o1l ^J +o1L i3w +o1L ,7 o0S +o1L .7 +0 +o1l +5 +o1l +2 +o1l *12 +o1L +0 .7 +o1* ^L +$! o1L +o1k Y5 +o1k Y4 [ +o1k [ Y4 +o1k t [ +o1k [ t +o1k R2 +o1k o5, +o1k i2g +o1k i1, +o1k D3 +o1K D0 +o1k *54 +o1k $2 +o1@ K +o1k $- +^$ o1k +o1j y5 x52 +o1j Y4 +o1j Y3 +o1j r z2 +o1j ^R +{ o1j o68 +o1j $7 +o1j $4 +o1j *35 Y5 +o1j +0 +o1J [ +o1j $! +$. o1j +o1i Z1 ^@ +o1i ^@ Z1 +o1i Y4 +o1i y4 +o1i T9 +o1i s6p +o1i o5= +o1i k i0B +o1i i5/ +o1i D6 +o1i $d +o1i *95 +o1! i5 +o1@ i4q +o1, i3v +o1- i3= +o1= i1k +o1. i0w +o1- i0f +o1@ i0C +o1@ ^I +o1i ^@ +$* o1i +$? o1i +o1h x42 +o1h x32 y4 +o1h $w +o1H ^t +o1h R0 +o1h p3 o8i +o1h o5a +o1h o3 +o1h ^k -8 +o1h i4$ +o1h i3n +o1h i0p +o1h *32 +^! o1H +o1G z5 $C +o1G o4l +o1g i4v +o1g i3K +o1g i1j +o1G $C z5 +o1g *74 +o1G $7 +o1G *42 +o1@ ^G +o1g ] ] +$! o1g +o1f y4 +o1F x01 .2 +o1f $L +o1f i5g +o1f i1F +o1f i14 i6r +o1f D4 +o1f ^6 +o1f *23 +$! o1F +o1f { +o1f [ +o1e Z1 $? +o1e y5 +o1e y3 +o1E Y2 [ +o1E [ Y2 +o1! E y2 +o1e x41 +o1e x31 +o1e o6i +o1e o4F +o1e i5_ p2 +o1e D4 o4c +o1e $A +o1e *67 +o1e *53 +o1e -3 +o1e *14 +o1% E +o1e $- +o1d o0U +o1D k *46 +o1d i3j +o1D i2N +o1d i0j +o1d D2 ^s +o1d D2 +o1D C D0 +o1d c +6 +o1d *70 +o1d +6 c +o1d *67 +o1d *60 +o1d +6 +] o1d *57 +o1+ D5 +o1D *46 k +o1d -3 -3 +o1d $1 +o1D +o1d +o1c x23 ^e +o1c u +o1c ^s +o1c o61 +o1C o4z +o1c o2- +o1c ^M +o1c i4n +o1c i1s +o1C f k +o1c d x82 +o1c ^d ^h +o1c ,A +o1c *64 +o1C -5 .0 +o1c *43 +o1C .0 -5 +o1@ ^C +o1c $@ +o1c ^< +o1) c +o1, ^c +$$ o1c +$@ o1c +o1b Z1 .0 +o1B u k +o1b o5a +o1B o2F t +o1B k u +o1b k $9 +[ o1b i6- +o1B i3q +o1b i20 +o1b E '9 +o1b ^d +[ o1b $d +o1b $9 k +o1b '9 E +o1b -7 +o1B *15 +o1b .0 Z1 +o1b +0 +o1_ ^B +^@ o1B +o1b $$ +o1A z2 +o1A Z1 E +o1a Y1 o7k +o1a { y1 +$. o1a x72 +o1a u d +o1A T4 *32 +o1a T2 +o1a sDK +o1A s01 r +o1A r s01 +o1a o7q +o1a o6b +o1A o58 +o1a o4o +o1A o2P +o1A k +o1a iB. +o1a i4d +o1a i1r +o1a i1i +o1A E Z1 +o1a d u +o1A c +o1a *87 +o1a $8 +o1a *54 +o1A *32 T4 +o1A *25 +o1a *07 +o1= ^A +o1a $+ +o1@ $a +$. o1a +o19 { $a +] o19 $9 +o19 *01 +o19 .0 +{ o19 +o18 x32 +o18 T2 +o18 o60 +o18 $O +o18 i3. +o18 ^C y3 +o18 c $3 +o18 $3 c +o18 *26 +o18 *01 +o18 -0 +o17 TA +o17 o5* +o17 } ^G +o17 ^6 y5 +o1- *76 +o1- } *72 +o17 *15 +o17 $+ +o17 +o16 x54 +o16 x42 +o16 p2 x02 +o16 '8 r +o16 +3 +o16 ] +o16 +o15 y2 +o15 { o9+ +o15 o4q o3h +o15 o3h o4q +o15 *91 +o15 *67 +o15 .5 ^6 +o15 *50 +o15 -0 +o15 $@ +{ o15 +^o *15 +o14 Z5 Z5 +o14 y4 +o14 x31 +o14 T4 +o14 o0H *74 +o14 i1? o1@ +o14 D5 +o14 *A8 x52 +o14 $A +o14 *74 o0H +o14 $7 +o14 *52 +o14 +3 +o1+ *42 *17 +o14 *16 +o14 $* +$@ o14 +o13 x71 T4 +o13 TA +o13 T4 x71 +o13 o3e +o13 o0K +o1@ -3 ^M +o13 C +o13 *97 +o13 .5 +o1; *34 i1i +o1# *32 o50 +o13 .2 +o1_ *31 +o12 T7 +o1) +2 ^Q +o12 p2 $v +o12 o3w l +o12 o2- +o12 l o3w +o12 ^@ L2 +o12 k +[ o12 i23 +o12 ^C +o12 *B3 +o12 +6 p4 +o12 *43 +o12 *24 +[ o12 +0 +o1; +2 +] o12 +o11 y1 +o11 x51 $j +o11 si3 +o11 o5! +o11 $j x51 +o11 i1k +o11 $h +o11 $G *56 +o11 *81 +o1+ *17 *42 +o11 *56 $G +o1- *14 +o11 ^2 y4 +^@ o11 +o10 y2 +o10 x37 *30 +o10 R5 +o10 o74 +$. o10 o0T +o10 i2 +o10 ^H l +o10 D6 +o10 ,3 +o10 -3 +o10 *14 +o10 *12 +o10 $* +o10 ] +o10 ^! +o1@ -0 +o1. +0 +o1, .0 +o1 +0 +] o10 +[ o10 +o1% +o1@ $@ +o1@ $. +o1@ { +o1@ +o1/ +o1! $$ +o1! $! +o1 [ +$o $1 +] o1' +^[ o1] +^, o1. +o0z Z2 +o0z y5 +o0z Y4 x15 +o0Z y2 +o0z x72 +o0Z T6 +o0z sdn +o0z p1 z1 +o0Z oA1 +[ o0z o2- +o0z k +o0z i7@ +o0Z i4< +o0z i0a +o0z ^i +o0z $a +o0z *68 +o0z *63 ] +o0z ] *63 +o0z *61 +o0z $6 +o0 z5 +o0z $4 +o0 z4 +o0z ^3 +o0@ z3 +o0@ Z2 +o0> $< Z2 +o0@ Z1 $@ +o0$ z1 +$) o0Z +o0z ^! +o0Y ^Z +o0Y Y2 Y3 +o0y y2 t +o0Y Y1 $# +$? o0Y x31 +o0y t y2 +o0y T4 +o0Y T2 +o0y o5h +o0Y o4n +o0y i7t +o0y i53 +o0y i3q ] +o0y ] i3q +o0y $8 $o +o0Y +8 +o0Y $7 +o0Y ,5 +o0| Y2 Z2 +o0Y +2 +o0y .2 +o0y $1 +o0Y ^@ +] o0Y +o0y $@ +o0y $. +o0x Z3 D6 +o0x y4 +o0x y2 -9 +o0x x64 +o0x x54 +o0X x52 +o0X t i2d +o0x $r p1 +o0x o64 +o0x o3h +o0x i4t +o0x ^e +o0x D6 Z3 +o0$ x91 +o0? x62 +o0X -6 +o0x -6 +o0x *52 +o0x *47 +o0x *45 *65 +o0. x41 y4 +o0@ x41 ^m +o0x *27 +o0x *21 +o0x } +o0@ $x +[ o0x +o0w z4 +o0w Y5 Y5 +o0w Y4 Y4 +o0w y3 +o0W y2 +o0w Y2 +o0w y2 +o0w y1 *06 +o0w x53 y5 +o0w so6 +o0w slm +o0w s21 ^e +o0W p5 +o0W p1 x04 +o0W ^P +o0w ^p +o0w ^o ^r +o0w o7j +o0w o6h +o0w o4- +o0W o3m $% +o0W $% o3m +o0w o13 +o0w ^j +o0w i5n +o0w i2t +o0W i0P +o0w i0C +o0W i02 +o0w ^e s21 +o0w D3 +o0w 'B +o0w $9 +o0W '8 +o0w -6 +o0w *56 +o0W *41 +o0w *40 +o0w ,4 +o0w *34 +o0W .3 +o0w *20 *15 +[ o0w +2 +o0w *15 *20 +o0w *03 p5 +o0w $0 +o0v Z2 +o0V Z1 +o0v x31 +o0V u ^L +o0V o7Z +o0v o7d +o0v o4o +o0v o4i +o0v o2z +o0V ^L u +o0V k ^r +o0v k +o0V ^J +o0v i4- +o0v i2m +o0v i0t p2 +o0v i0k +o0v ^A +o0V *63 +o0v *54 ,4 +o0v *43 +o0V .4 +o0V *31 +o0v *31 +o0v *10 +o0v *07 C +o0V $* +o0V $( +o0V ^! +$( o0V +o0_ ^v +o0u z1 z1 +o0u Y2 +o0u x32 +o0U $u +o0U T3 +o0u ^q +o0u o1b *87 +o0u ^m +o0u ^K +o0u ^J +o0u i7X +o0u $9 +o0u *87 o1b +o0U ,4 +o0u *32 +o0u ^1 +$@ o0U +o0T Z5 u +o0T y4 y4 +o0T Y3 t +o0T y2 +o0T Y1 +o0t x24 +o0T u Z5 +o0T t Y3 +o0t t ^M +[ o0T T4 +o0T t +o0t som +o0T se_ +o0t ^s +o0T o7. +o0t o6d +o0T o2F +o0T o1B +$. o0T o10 +o0t $m +o0t L6 +o0t K Z1 +$! o0T k +o0t i80 +o0t i5l +o0t i4/ +o0T i3i +o0t i0T +o0T i0K +[ o0t $i +o0T D2 +o0t ^c +o0T *97 *36 +o0t *91 +o0t -7 +o0t *60 +o0T $4 +o0@ T4 +o0T *36 *97 +o0t *30 +o0t ,3 +$? o0t -3 +o0T .2 +[ o0t +2 +o0^ T1 +o0T $. +o0t $# +o0t $. +$# o0t +$@ o0t +o0S Z1 z1 +o0S z1 Z1 +o0s Y4 x62 +o0s ^Y +o0s $y +o0s x21 +o0s u +o0S s39 +o0S $S +o0s R9 +o0s R3 +o0_ s_p +3 +o0! sok +o0S o6z +o0S o5k +o0s o4i +o0S o4F +o0s o3$ +o0S o1t *37 +o0s ^m +o0S ^L +o0s i7f +o0s i2i +o0S i1a x81 +o0s $H +o0S DA +o0S D8 +o0S D4 +o0S ^A +o0* s9! L0 +o0s *89 +o0S '8 +o0s +8 +o0s ,7 +o0S *65 +o0S *41 +o0S *37 o1t +o0s *35 +} o0s *25 +o0s *24 +o0S ^2 +o0s ^2 +o0s *13 +o0S $# +o0S ^= +o0s ] +o0r syl +o0r se, +o0R R1 +o0r o8s o3a +o0r o6y +o0r o3a o8s +o0r o2p +o0r o2j +o0r o2i +o0r o1d +o0r o1= +o0r ^o +o0r ^k +o0r i5w +o0R i5k +o0R i3c +o0R i3. +o0R D5 +o0R -9 +o0R *76 +o0r *65 +o0r *64 *65 +o0R *57 +o0r *54 +o0R ,5 +] o0r *42 +o0r -4 +o0r *34 +o0r ^1 +o0r { +o0. r +o0q z5 t +o0Q z3 +o0Q z2 +o0q y5 +o0Q y1 +o0q x63 +o0q $w -1 +o0q t z5 +o0q r Y2 +o0q p1 D0 +o0q o7t +o0q o27 +o0q i2r +o0Q C +} o0q *67 +o0Q ,5 +o0q +5 +o0q -1 $w +o0Q ^1 +o0Q $. +o0P x82 +o0P x42 -4 +o0P u +o0p T7 +o0P ^T +o0P r +o0P o56 +o0P o1T +o0p o1H +o0p o1d K +o0p K o1d +o0p i4M +o0P D8 +o0P D7 +o0P $A +o0p '9 +o0P +8 +o0p +8 +o0p '8 +o0p $7 +o0P *65 +o0P *53 +o0p *53 +o0P .5 +o0P *41 +o0P -4 +o0$ p2 T1 +o0p *20 +o0P $# +o0P ^# +o0P ^@ +$% o0P +$. o0P +o0p $$ +o0p $= +o0p } +$& o0p +$^ o0p +{ o0p +o0O Y4 +o0o y1 ^z +o0o y1 +o0O ^W +o0o u p1 +o0o shp +o0o p1 u +o0o o6@ +o0o o1s +o0O $O +o0o i5^ +o0o ^H +o0( o6) +o0o ,5 +o0= o5 +o0; o4@ +o0+ o3o +o0' o2l +o0o -1 +o0 ^o +o0n y5 -A +o0n Y2 x43 +o0N Y2 +o0n ^X -8 +o0n x62 +o0n x61 +o0N x52 +o0n x43 Y2 +o0N x32 +o0N x21 +o0n u $H +o0n ^U +o0N q $L +o0N o3m +o0n o1p +o0N K D1 +o0N i4S +o0n i2m +o0N i2@ +o0n $H u +o0N D1 K +o0N $6 +o0n *41 +o0n *24 ,2 +o0n *06 +o0m Y5 t +o0m Y3 $K +o0M y2 +o0m x63 +o0m ^w +o0M u p1 +o0m t Y5 +o0m t o4u +o0m $ sp +o0M $r ,5 +o0M p4 D5 +o0M p1 u +{ o0m $p +o0m o9s { +o0M o9e +o0m o93 +o0m o79 +o0M o5x +o0M o4z +o0m o3m +o0M o2d +o0m o2^ +o0m k +o0m i3c +o0m ^G p2 +o0M +B +o0m $A ,3 +o0m '8 +o0m ,6 +o0M ,5 $r +o0m *57 +o0m .5 *45 +o0m ,4 +o0m ,3 $A +o0m *27 +o0m *20 +o0m *06 +o0. ^M +$^ o0M +[ o0M $@ +[ $@ o0M +o0m $ +o0m ^_ +o0. ^m +{ { o0m +o0L z3 +o0L Z2 +o0L Y2 Y2 +o0L Y2 $w +o0l y2 k +o0L xA1 +o0L x71 +o0l x32 +o0l u d +o0l ^u +o0l t d +o0L T5 +o0l srw +o0L sct +o0l r +o0l o7t Z1 +o0L i4b +o0L i3s +o0l i0O +o0L i02 +o0l d u +o0l d t +o0L D2 ^Y +o0L D2 +o0L ^b +o0l +B +o0l ^B +o0L ,8 +o0L ^8 +o0l +8 +o0L +6 +o0l *54 z2 +[ o0l -4 +o0L .3 +o0l +3 +o0L *23 +o0l *17 +o0L *12 +o0* L0 s9! +o0{ L0 +o0L $% +$% o0L +$# o0L +o0l $. +o0@ ^l +o0K y4 D4 +o0K y1 +o0K x93 ,4 +o0k $X +o0k $x +o0K T5 +o0K t +o0K se0 +o0K $S +o0k $R +o0k p4 y3 +o0k p2 *25 +o0k oA5 +o0K o8n +o0k o5l +o0k o3u +o0k o2o *41 +o0K $N +o0k K *35 +$@ o0k k +o0K i5b +o0k i49 +o0k i4. +o0k i2b +o0k i1w +o0K ^B +o0k 'B +o0k $9 +o0K *61 +o0k -5 +o0K ,4 x93 +o0k *41 y5 +o0k *41 o2o +o0k *35 K +o0K *21 o1# +o0K *14 +o0, ^K +o0` K +o0k +o0J z2 +o0j y3 +o0J y2 +o0j y1 +o0j x83 +o0j x41 y4 +o0J u $8 +o0J $S +o0j ^s +o0J p2 ] +o0J o4n p3 +o0j $J +o0J i2m +o0j i2h +^_ o0j i0w +o0J i0M +o0j D4 +o0J ^B +o0J ^A +o0j $A +o0J *95 +o0J $8 u +o0J *89 +o0j *63 +o0j -6 +o0J +5 *85 +o0j *51 +o0j -5 +o0J $4 +o0J ^4 +o0J *27 +o0J *13 +o0j $/ +o0j ] +o0< ^j +o0i Y3 x34 +o0i y3 [ +o0i y2 +o0i y1 +o0i x34 Y3 +o0i ^V +o0i u ^A +o0I u +o0I T4 +o0i $s +o0i o4n +o0i o3d +o0I i2n +o0i i1v +o0i i0P +o0i i06 +o0i ^C +o0i ^b +o0i ^A u +o0$ i84 +o0% i6t +o0I *67 +o0* i60 +o0i ^6 +o0i *57 +o0$ i3M +o0, i3l +o0/ i3i d +o0@ i36 +o0i *34 +o0i *31 +[ o0i .3 +o0i } *20 +o0. i1s +o0i *14 *16 +o0@ i0z +o0_ i0l +o0i *01 y2 +o0$ i0# +$? o0i +o0i +o0h Z2 +o0h x71 +o0h x42 +o0H x41 +o0h ^r +o0h o5i +o0h o3- +o0h ^k +o0h i7V +o0H i6r +o0h i5a +o0h ^g *24 +o0H D2 +o0H *B9 +5 +o0H $9 +o0h *85 +o0H +5 *B9 +o0h .5 +o0H ^4 +o0h .4 +o0H $3 +o0H .3 +o0h -3 +o0H *15 +o0H $0 +{ o0H +o0h $_ +$@ o0h +o0g Z4 u +o0G Z1 +o0g y4 t +o0G Y4 +o0g y3 +o0g Y2 ^d +o0G y2 ] +o0G ] y2 +o0g x74 +o0g x51 +o0g x31 t +o0g u Z4 +o0g t y4 +o0g t x31 +o0G T3 ,5 +o0G T3 +o0G T2 +o0g $t +o0g R1 +o0g p2 '9 +o0G o4k *58 +o0g i7- +o0G i02 +o0g $i +o0g f i4g +o0g ^d Y2 +o0G D2 +o0G -9 *15 +o0G $9 +o0G *82 +o0G +8 +o0g +7 +o0G *62 +o0G $6 +o0G ,5 T3 +o0G *58 o4k +o0g ,5 -2 +o0g *46 *63 +o0g *43 +o0g *42 +o0g -4 +o0G *34 $2 +$! o0G ,3 +o0g -2 ,5 +o0G $2 *34 +o0G *15 -9 +o0g *12 +o0G .1 +o0G ^# +o0@ ^G +o0G +$_ o0g +o0f Z5 u +o0F Z2 +o0f y4 x62 +o0f Y4 +o0f Y3 u +$? o0F Y1 +o0? f x64 +o0f x62 +o0F $X +o0f u Z5 +o0f u Y3 +o0F $T +o0f s1_ +o0f R1 +o0f o5l +o0F o3L +o0f o2c +o0f o1s +o0F K Z1 +o0f K *45 +o0f ^k +o0f k +o0f i8O +o0f i6. +o0f i5g +o0f i4k +o0f i3b r +o0f i1L +o0F i1B +o0F i0K +o0f $I +o0F D2 +o0f d +o0f *86 +o0f *76 +o0F *73 +o0f -7 +o0f ^6 +o0F *53 +o0f .5 +o0f *46 +o0f *45 K +o0f *41 +o0F +3 +o0F .2 i3e +o0f +2 +o0f *13 +o0F .1 +o0F ^1 +] o0F +o0f $% +o0- ^f +o0e y5 +o0E x41 +o0E x24 $, +o0E $, x24 +o0E T5 +o0E T2 +o0e T1 +o0E ^S +o0E o91 +o0E o2c +5 +o0e o1i +o0E K .7 +o0E i0T +o0E i0Q +o0e D4 *01 +o0e c o3V +o0e ^B +o0E *96 +o0e ,8 ,3 +o0E +5 o2c +o0E -5 +o0e ,3 ,8 +o0e +2 +o0e *10 +o0e +1 +o0e *01 D4 +$! o0e +$- o0e +^@ o0e +o0d y3 +o0, ^d y2 +o0d y1 +o0d x61 +o0d x52 +o0D x41 +o0D x21 ] +o0D ] x21 +o0D T3 +o0d R3 +o0d o9y +o0d o7a +o0d o6r +o0d o5s +o0D o47 K +o0d $o +o0D K o47 +o0d i7- +o0D i68 +o0d i5t +o0d i4d +o0D i2f +o0D i1i +} o0d D5 +o0d +B +o0D -9 +o0D +8 +o0d ,7 +o0! D5 +o0d *48 +o0D *35 +o0d $3 +$$ o0D +o0d ] +{ o0d +o0C Z3 sGh +o0c y3 +o0C ] Y1 +o0C x92 +o0C x63 +o0C x51 +o0C x23 +o0c ^x +o0C T4 +o0C T3 +o0C sGh Z3 +o0c sea +{ o0c s3f +o0c r +o0c $q +o0c o5u +o0c o3. } +o0c ^M +o0C L1 +o0C ^L +o0c ^K +o0c i6n +o0c i58 +o0C i3M +o0c i3 +o0c d x04 +o0C DA +o0C D7 +o0C ^A +o0c +7 +o0c -7 +o0C *51 +o0c *30 +o0c $2 +o0C } +$o $0 C +{ o0C ] +{ ] o0C +o0C +o0c $, +$* o0c +] o0c +o0b Y4 ^B +o0B Y4 +o0B y3 t +o0B y2 Y1 +o0b y2 $! +o0b $! y2 +o0B Y1 y2 +o0B y1 $3 +o0B Y1 +o0B x32 i3n +o0B t y3 +o0B T4 +o0b saz +o0b $s +o0B o90 +o0b o63 +$? o0B o6! +o0B o5# +o0b o1x +o0b $n +o0b i4c c +o0b ^I +o0b c i4c +o0b C i0p +o0b C -4 +o0b ^B Y4 +o0B ^b +o0b $b +o0b -8 +o0B ,6 +o0b +6 +o0B $3 y1 +o0b .3 *21 +o0b $3 +o0b *23 +o0b *21 .3 +o0B +2 +o0B ,2 +o0B $+ +o0B $, +o0- $B +$% o0b +o0a Z2 *73 +o0A y2 T2 +o0a Y2 E +o0A ^U +o0A oB1 +o0a o1i +o0A o1e +o0A l +o0a ^l +o0a i1z +o0a E Y2 +o0a E $7 +o0a $7 E +o0A $7 $9 +o0A *76 +{ o0A $6 +o0A +5 +o0A .5 +o0A } +o0) $A +o0a $/ +$- o0a +o09 z2 +o09 y4 +o09 T9 +o09 i11 i6O +o09 d +o09 $8 +o09 } +o0! -9 +o08 o6c +o08 *76 o6A +$O *08 $5 +o08 ^5 +o08 ,1 d +o08 .1 +} o08 +^o *08 +o07 Z2 +o07 o6c o25 +o07 o25 o6c +o07 i20 +o07 ^9 +o07 ^8 +o0@ *75 +o07 ^2 +o0 *71 ^ +o0! *70 +$ o06 Z2 +o06 Z1 snk +o06 y1 +o06 x41 +o06 snk Z1 +o06 o88 +o06 +8 +o0@ *67 +o06 *46 *10 +o06 *46 +o06 *43 +o0$ *62 +o06 *10 *46 +o06 *0A +o05 x62 +o05 T2 +o05 t +o05 R5 +o05 o7w +o05 i1P +o05 ^h +o05 *74 +o0& $5 *34 +o05 ^2 +$* o0@ .5 +o04 y4 +o04 $t +o04 ^s D5 +o04 $q +o04 i02 +o04 ^e +o04 $6 +o04 *45 +o04 *25 +o04 +2 +o0. ^4 +} o04 +o03 Y3 +o03 ^T +o0_ +3 s_p +o03 i3_ +o03 ^8 +o03 ,6 +o0& *34 $5 +o03 -4 +o0@ *32 +o03 *09 +o0. *30 .1 +o03 } +o02 y3 y3 +o02 x83 +o02 T6 +o02 o5p +o02 o28 *51 +o02 o11 +] o02 k +o02 -6 +o02 *51 o28 +o02 +2 +o0* -2 +o0@ ^2 +o0, +2 +$= o02 +o01 T8 +o01 $T +o01 r { +o01 i3T *31 +o01 i2j +o01 ^f +o01 $E +o01 ^d +o01 *51 +o0. .1 *30 +o01 +2 +o01 ] +o0+ -1 +o0* ,1 +o0@ +1 +o00 TB +o00 TA +o00 s@a +o00 ^n +o00 *10 +o00 $! +o00 +o0& +o0* $+ +o0@ $$ +o0( ^) +o0/ $- +o0/ ^\ +o0/ +o0? $. +o0, +o0_ +$% o0# +$# o0% +$# o0_ +$* o0@ +$( o0# +$* ^O +$_ ^O +^. ^O +$o $* +$o ^, +$. ^o +^N Z5 z4 +^N z4 Z5 +^N z4 Y5 +^N Z3 o9M +$n z2 L6 +$n z2 d +^N z2 +^n z2 +^n Z1 i0m +$n $z +^N ^Y k +^N Y5 z4 +^n Y4 +$n $y .4 +$n y3 D3 +$N y3 +^n Y2 Y2 +$n Y2 +$n y2 +{ $n y1 +^N ^Y +$n ^Y +$n xA1 +$n x94 +$n x84 +$N x64 $! +$N $! x64 +$n x43 +} ^n x32 +^n x31 o01 +$N x24 $6 +$n x05 +^n u i68 +^n u *40 +^N ^u +$N t +$n $t +$n ss5 +$n srp +^n sna +^n seg +^n s8i +^n s5- +^n ^S +$n R8 ,7 +^n R4 +^n } ^r +^n p1 x04 +$n p1 E +^N p1 +$n oAo +$N oAb E +^n o99 +$n o8y +^n o8n +$n o7a +$N o6M +^n o5q +$n o5* +^N o4T +$n o3x .2 +$N o3T +^N o3e +$N o38 +$N o2g +^N o2F +$N o17 +$n o06 +^n o01 x31 +^n ^O +^N ^n +$N $M +$N l ^c +^N ^L +$n $l +^n $l +^n ^l +$n ^k *01 +$N $K +^N K $? +^n $K +$n $k +$n } ^k +$n ^k +^n iA8 DB +$N i91 +$N i7M +$n i7/ *16 +$N i71 +$n i6z *96 +$n i6z +$n i6p x32 +$n i6k +^n i68 u +$n i68 +^n i5z *41 +^N i5n +^n i5h +^N i5d +^N i5a +^N i49 +^N i3w +$n i3D +^N i1Y +$n i1t +^N i1r +$n i1p +^N i1k +^N i1j +^N i1e +$n i19 +$n i11 +^n i0m Z1 +^N i0K +$N i09 +$n i04 +^N ] ^I +^N ^I ] +$N $i +^n $i +^n ^G +$N E ^r +$N E oAb +{ ^n D7 +$n D6 +^N D3 o30 +^N $D +$N ^c l +^n ^C +^n 'B { +^N ^a +$! $n ,A +^n ,9 +$n ,7 R8 +^n *70 k +$N $6 x24 +$n *6A +^n *65 i4l +$n *65 +$n $5 Z2 +^n *54 +[ ^n *53 +^n *52 +$n -5 +$n .4 $y +^N *43 +^n *41 i5z +^n *40 u +^n ,4 +^n -4 +$N +3 +^N ,3 +$n +3 +^n ,3 +$n *25 +^N *23 +^n *20 *52 +$n ^2 +^n +2 +^n ,2 +$n *16 i7/ +$N *13 +^N $1 +$n +1 +^n +1 +$n *04 +$n -0 *20 +$+ ^N +} ^N +] $N +^N +$n $, +$+ ^n +$# ^n +$& ^n +$@ ^n +$. $n +$! ^n +$- $n +$_ $n +} $n +^n $/ +^n } +^@ $n +^@ ^n +^- ^n +^m ^z Y1 +$m Z5 +5 +$m Z5 +$M Z4 +$m Z2 -1 +^M Z2 +$M Z1 z1 +$M z1 Z1 +$m Z1 z1 +$m z1 Z1 +$m Z1 o1m +^M Z1 $D +$M Z1 d +{ ^M Z1 +^m ^, z1 +^M ^Z +$M $z +^M Y5 x15 +^M ^y *54 +^m Y5 $] +^M Y4 u +$M Y4 s4n +^m Y4 +$m y2 $d +^m y2 $/ +^m $/ y2 +^m Y1 ^z +^m Y1 x15 +$m y1 u +^m y1 D4 +^M $Y +$m x82 +$m x72 +$M x71 +} $m x61 +^M x53 +^m x52 C +^m x52 +$M x51 $e +^M x32 z1 +$m x21 $p +^m x15 Y1 +^M x14 K +^M x13 +^m x12 +$M x04 $O +$m x03 +^m ^X +^m ^v $0 +$M $V +^M u Y4 +$m u y1 +$M $u oAl +$m u *79 +$M $u +^M u +$m t $W +$m t p3 +$m TA sm3 +^m t +9 +^M T8 +^M $T +^m $t +$m snl +$m sm3 TA +^M sdY +$M sb2 +$M s4n Y4 +$m s3M +$m $S +$m $s +^m r x34 +[ ^M ^R +$$ $M r +^M r +$m ^R +$m $p x21 +$m p3 t +$m p3 { +$m { p3 +$m ^P +} $m ^p +$M $O x04 +^m ^o i1a +$M oAl $u +^M o9e +^m o87 +^m o83 C +$m o7z +$m o7w Y1 +^m o7k +^M o73 +^M o7@ +^m o66 +^M o4q +$m o4+ k +^m o4g +^M o4b +$M o3q +^m o3H +] $M o2y +$M o2p +^M o2o +^M o2_ +^m o1y +^m o1q +^M o1p +$m o1m Z1 +^m o1j +$m o0v +$m ^n r +$m $n ^9 +$M ^M +^M $L c +$M L4 +$M $l +$m $L +^m l +^M K x14 +$m k o4+ +$m k *76 +$M $K +$m k +^m ^k +$M ^j +$M iA8 +$M i92 +$m i8k +$m i7c *82 +^M i7. +^M i6W +$m i6w +^m i6v +$m i6u +$M i6o +$M i6I *78 +^M i62 +^m i5N +^M i58 D3 +^m i5- +^M i4W +$M i4o +$m i48 .4 +$m i4( +^m i4= +^M i3g +^m i3g +^M i3e { +$m i3 +^m i3 +^m i2u +^M i2M +^m i2b +$m i2A +] ^m i21 +^m i1r x24 +^m i1m i2x +$M i1i +^m i1g +^m i1a L8 +$m i13 +^m i1@ +^m i0l +^m i0g +^M i0E +$m i0b +$m $I +$m $h *53 +^M ^H +$M $f +^m ^F +$M $e x51 +$m $d y2 +^M D5 z1 +$M D1 +$M d .0 +$m $d +$m d +^m C x52 +^m C o83 +^m c i0K +$M C ,3 +$M c $_ +$M $_ c +$M ^c +$M $B +^M +B +$M $b +$M $A K +] ^M ^A +^m $A +^m ^a +^m +9 t +$m ^9 $n +^M *94 .6 +^M $9 +^M '9 +$m ,9 +^m $9 +^m ,9 +$M ,8 +$M ^8 +^M -8 +$m *79 u +} ^M *78 +$m *76 k +^m *76 +$M ,7 +$m +7 +^M .6 *94 +^m *65 +^m ,6 $1 +^m ,6 .1 +$m -6 +$m +5 Z5 +^m *57 *24 +$m *53 $h +$m *53 +$M .5 +$m +5 +$M *46 +^M *41 +$M ^4 +^M $4 +^m .4 +^m -4 +^m ^4 +$M ,3 C +$m *30 i0e +$m .3 +^m -3 +^m *24 *57 +$m -1 Z2 +^m *16 +^m $1 ,6 +^m .1 ,6 +$m *14 +$M .1 +$M -1 +^M .1 +^m $0 ^v +$m *07 ^h +$m *07 +^m *05 +$m -0 +$M $# +$M $@ +$M $? +^M $, +^M $- +^M ] +^@ $M +^! ^M +$m $. +$m $! +$m $, +$m $- +$+ $m +$& $m +$@ ^m +$? ^m +^m $? +^m $, +^l ^z Z3 +$L $Z z2 +^l z5 t +^l Z5 *82 +l Z4 so0 +$| l Z4 +^l Z3 ^z +$# l Z3 +$l Z2 z2 +$l z2 Z2 +$L z2 $Z +l Z2 i3a +l Z2 $f +$l Z2 E +$l Z2 { +] l z2 +$L Z1 t +l Z1 i3? +l Z1 $7 +^l z1 .7 +$L Z1 +l Z1 +$l ^Z +l Y5 x63 +^l y5 x2B +l y5 -0 +^l Y5 +^l y4 +l y3 x32 +l Y3 i4l +^l Y2 Y2 +l Y2 x15 +l Y2 i5% +l Y2 ,B +l y2 ,4 +^l y2 +l Y1 x71 +^L y1 x51 +$L Y1 t +^l y1 .6 +^l Y1 -4 +$L ^Y +^l ^Y +l $X i7 +^l x83 +^l x82 x21 +l x71 Y1 +l x71 o1W +^L x71 i1d +^l x62 K +$L x62 +^l x62 +$L x54 $J +l x51 D3 +l x51 d +l x51 -3 +l x48 +^l x43 +$L x42 +^L x42 +l $X .4 +l x37 +l x32 +} ^l x32 +l x24 p4 +$L x23 +1 +^L x23 +^l x21 Y5 +l x21 *13 +^l x16 y5 +l x15 Y2 +^l x14 i6h +l x14 +^L x13 +l x12 $h +^l x05 i3d +l x02 $h +^l ^X +l $W sae +l $w o3f +^L ^V o0F +$l $v K +^L $v +l ^U $T +^l ^U +^l t z5 +$L t Z1 +$L t Y1 +l $T ^U +l $T o5s +l ^t o0s +^l t i1_ +l T9 +l T8 *67 +l T7 $@ +l $T ,7 +l $@ T7 +$l t *52 +l T3 i73 +l { T3 +^L T2 +l T2 ^! +l T1 *89 +l T1 +^l t { +^l { t +l sxb $& +l $& sxb +$L s-x +l suy +l so0 Z4 +l s*M *26 +$# l sfV +l sfc +l sda i3k +l sae $W +$L sAE +l sa8 K +$l s9s +^l s93 +l s2$ +0 +l s1. i7, +l s1C +l s0@ i2e +l s03 +$L $S +^L ] ^S +^L ^S ] +l $S +l $s } +^l s!* +^l $s +^. l s$/ +l r ^F +l RB RB +$L R6 +l R5 R4 +l R4 R5 +$L R2 *41 +$L $R +^L $R +^l $R +^l r { +^L q *43 +^L $Q +$l ^q +^l ^p $e +^l p5 ^S +^l p5 o2m +l p5 +^L p1 x07 +l p1 i5x +$L $P +l o9z x41 +^l o8m -3 +l o8+ LA +$l o7m +$^ l o7? +l o6" Y2 +l o6p *42 +l o6D i27 +l o6c i5. +^l o6a +$l o6@ +l o5u o4a +$l o5T +l o5s $T +l o5i +l o5H *24 +^L o5B +l o53 o34 +l o4T +l o4( o3/ +l o4a o5u +l o3t .5 +^L o3P +l o3o $K +l o3/ o4( +l o3m +l o3f $w +l o3f ^C +l o34 o53 +l o2g +6 +l o2' *45 +l o1W x71 +} ^L o1V +^L o1J +^l o1d +^L o13 +$L o12 i2W +$L $o +$l $o +^l ^o +^l ^m o1$ +l ^m $l +l $M +$l ^M +l $@ ^m +l ^m $@ +l ^. ^m +$l ^m +l $L Z1 +$L ^l r +l $l ^m +^l l ^F +$L l D1 +$l $l D1 +l LA o8+ +l L6 ^L +^L l ^, +^L ^, l +^l K x62 +l K sa8 +l $K o3o +l K i65 +l K i5c +^l k i3r +^l K *82 +l K -6 +l K +5 +l k *30 +l k *03 +$. ^L K +^L ^K +^L $k +^l ^K +$L $J x54 +l ^j o6G +$L i9P E +$. l i9_ +$! l i8y +^) l i8N +^L i8L +l i8% i0@ +$l i8i +$L i8B +l i8; $A +$= l i8a +^L i86 ,6 +l i7 $X +l i7@ ^U +l i7, s1. +$L i7l +l i73 T3 +$L i7' +^l i6q +$L i6N $@ +$L $@ i6N +$L i6h +l i65 K +^l i6@ +l i5% Y2 +^L i5y +^L i5t +^L i5M +l i5f +l i5c K +^L i5b +l i4v +3 +$L i4r +l i4P *02 +l i4^ oA^ +l i4l Y3 +$L i4j +$l i4+ +^l i4/ +^l i3z -2 +l i3? Z1 +^l i3y +$l i3w +$l i3v +^l i3U +^l i3r k +l i3k sda +l i3a Z2 +^L i3A Y3 +^l i39 +$) l i36 +^L i3! +^l i3. +$L i2W o12 +^L i2u +^L i2m +l i2e s0@ +l i24 +^l i1x +^l i1_ t +^l i1k +$l i1H +l i0y o1i +$L i0W +$L i0M +$l i0k +^l i0H +^l i0G +$l i0F +$l i0c +$l i0, $b +l i0$ +l i0@ +$L $i +l $h x12 +l $h x02 +$L ^h +^L $h +l $G Y1 +l ^G y1 +$L ^G *61 +l f x46 +l $F r +^l ^f 'A +] ^L ^F +^L ] ^F +^L ^F ] +$l E Z2 +^l $e ^p +$L ^e +^L $e +^L ^e +$! l $E +^l E $- +^l $- E +$l d x7B +l d x67 +l d i8, +$L DB +l D6 T6 +$L D6 +l D6 +l D5 d +l D4 f +l D4 ^A +l D4 .2 +l D2 *31 +$L D1 l +$l D1 $l +$L { $D +$l $D +^L ^C +^L C +$- ^L c +{ ^l $c +l ^B ^J +$l $b i0, +LB +A ] +LB ] +A +$% l *B8 +$l ^b +^l ^b +LA } x81 +l $A i8; +LA } D8 +^l 'A -9 +$? LA +$l +A +L9 Z2 +L9 i77 +l -9 i5L +L9 C p3 +^l -9 'A +L9 +9 +$l *97 +l *95 K +^l *95 +$] L9 +^l $9 +L8 Z1 i4o +L8 y2 D2 +$) L8 x42 +L8 i4o Z1 +l *89 T1 +l $8 *34 +L8 *27 x34 +} ^l *80 +l +8 $. +l $. +8 +$l +8 +] $l ,8 +^l '8 +^l -8 +L7 Z2 +L7 Y1 i6t +L7 Y1 D6 +L7 x32 i3@ +L7 x03 *32 +l ,7 $T +L7 sgz +L7 $r E +L7 o6j +L7 o5x +L7 o4q +L7 o4a -1 +L7 l o3H +L7 K *32 +L7 i7e +L7 i7A +L7 i6t Y1 +L7 E $r +L7 D6 Y1 +{ L7 D3 +^L *78 +^L $7 -5 +l -7 +5 +^l *75 +L7 *32 K +L7 -1 o4a +l ,7 $1 +$L ,7 +{ $L ,7 +{ L7 +^L $7 +$l -7 +^l $; ,7 +^l ,7 $; +L6 Z1 $k +L6 Z1 } +L6 $z +L6 Y2 ] +$| L6 Y1 +L6 $V +} L6 sDR +L6 R2 *13 +L6 ^q +l '6 q +L6 $p +L6 o7d Y4 +L6 o5v +l +6 o2g +L6 o26 +l -6 K +^L ,6 i86 +L6 i6D +L6 i5c +L6 i5= ,6 +L6 i55 $& +L6 $& i55 +L6 i4_ +L6 i3v +L6 i0N +L6 i0e t +L6 f x04 +L6 ^B +L6 $b +l *67 T8 +$l *67 +l +6 *65 +l *65 +5 +L6 ] .5 +L6 .5 ] +L6 *41 *43 +L6 *40 i47 +L6 *13 R2 +L6 +0 +L6 ^= +${ L6 +$l $6 +L5 Z2 z1 +L5 z1 Z2 +L5 y4 y4 +L5 Y2 +{ L5 x01 +L5 s1v [ +L5 [ s1v +L5 ^r +L5 $p +L5 o4J +0 +L5 o41 *63 +l .5 o3t +L5 $k +L5 ^j +L5 i5y +2 +L5 i5p +L5 i5. i5M +L5 i4m +L5 i1f +L5 i0g +L5 C i6i +l *58 x71 +^L -5 $7 +l +5 -7 +L5 *63 o41 +l *54 +$l *52 t +L5 +2 i5y +L5 +0 o4J +L5 $= +^L $5 +l +5 +L4 Y3 o66 +^l -4 Y1 +l .4 $X +L4 $R +L4 $q +L4 o3d ,2 +L4 ^m i4y +L4 ^m +L4 k $b +L4 i5y +L4 i4z +L4 i4m +L4 i4l +L4 i2M +L4 i2g +L4 i2C +l -4 i21 +L4 i0P ^m +L4 f +L4 $b k +L4 ^B } +L4 ^A +^l *48 +{ L4 *73 +l *46 +1 +l *45 o2' +{ L4 *37 +l *42 o6p +L4 ,2 o3d +L4 *27 +$L *41 R2 +$@ L4 +$l $4 +L3 ^y $5 +L3 $y +l -3 x51 +L3 ^w +L3 s3c i4v +L3 s1n d +l -3 r +L3 q Y1 +L3 p2 -4 +^l -3 o8m +L3 L3 ] +L3 ] L3 +L3 K +L3 k { +L3 ^J +L3 i4v s3c +l +3 i4v +L3 i3h +L3 i3E ^8 +L3 i1v +L3 $i +L3 ^h *75 +L3 d x03 +L3 d s1n +L3 $c +L3 ^a +L3 *75 *03 +L3 $5 ^y +l *34 $8 +^^ l *34 +^l *32 +3 +l -3 ,2 +l *31 k +L3 *03 *75 +l .3 -0 +L3 $. +L3 $! +^l +3 +L2 Z3 f +L2 z2 i43 +L2 Y4 scm +L2 sku p1 +L2 scm Y4 +L2 p1 sku +L2 ^L +L2 K ^@ +L2 ^@ K +L2 ^J +L2 i5p +L2 i4r +^l -2 i3z +L2 i3t +l +2 i2r +L2 i1Y +L2 f x51 +l .2 D4 +L2 d { +L2 { d +} L2 ^b +l *26 s*M +l *24 o5H +L2 *46 +l ,2 -3 +[ L2 +1 +^l *21 +L2 $[ +L2 [ +$! L2 +[ L2 +l +2 +l $! ,2 +l ,2 $! +L1 z1 ^2 +l $1 Z1 +L1 Y4 *75 +L1 Y2 o2h +L1 x31 ^D +L1 x23 u +$L +1 x23 +L1 ^w ^g +L1 u x23 +L1 ^R +L1 r +L1 p5 x13 +L1 p3 z1 +L1 o2h Y2 +L1 o21 i6e +L1 o0e +L1 k ^d +L1 i6e o21 +L1 i4S +L1 i46 +l .1 i2b +L1 i2- +L1 $f +L1 $c +L1 $b +L1 ^a +l $1 ,7 +^l *17 +l +1 *46 +^L ,1 *21 +L1 ] .0 +L1 .0 ] +L1 .0 +L1 } +L1 ] +$l .1 +} l ^1 +^l $1 +^l .1 +^^ l +1 +L0 z2 r +L0 $! Z1 +L0 { Z1 +L0 y1 ^C +} L0 x81 +L0 $v +L0 s5k +l +0 s2$ +L0 ^R +L0 r +L0 o4j +L0 L1 +L0 K +L0 i0E +L0 ^f +L0 { $d +L0 ^A +L0 *65 +L0 ^6 +l -0 .3 +^l *03 +l *02 i4P +L0 *12 +L0 +0 ,1 +L0 $# +L0 } +$* L0 +^\ L0 ] +^\ ] L0 +^| L0 +$L $? +$L $! +$@ $L +^L $# +^. ^L +^- ^L +^_ ^L +l $$ ^@ +l $@ +l $/ ^. +l $? +l { { +l ] +l ^@ $$ +l ^. $/ +$l $* +$l $; +$$ l ^@ +$$ ^@ l +$@ l +$. ^l +$. l +$? l +$= l $( +$= $( l +} l ^^ +} ^^ l +] $l +] ^l +[ $l +^l $# +^l $/ +^l $> +^% ^l +^. l ^_ +^. ^_ l +^! ^l +K $z x12 +k $z r +k ^z p2 +K $z i5d +K Z5 Z4 +k Z5 Z3 +$k Z5 Y1 +$k Z5 x23 +$k Z5 +6 +$k Z5 ,6 +$k Z5 +K Z4 Z5 +k Z3 Z5 +k Z3 +5 +k $. Z3 +k $ Z3 +$k z3 +k Z2 y3 +^k Z2 x31 +k Z2 x14 +k z2 o1s +k Z2 o0c +^K z2 ^N +k z2 i36 +k z2 i0P +K Z2 *58 +k z2 *50 +^k z2 $2 +k Z2 *1A +K z2 -0 +] K Z2 +$k Z2 } +^k Z1 t +K Z1 o7f +K Z1 o6l +^k Z1 o65 +k Z1 o1s +K z1 o14 +K Z1 $k +$k Z1 k +K Z1 i75 +k z1 ,4 +^* K Z1 +$ k Z1 +K $z *01 +K $z +k ^z +K $y Y1 +^k Y5 y1 +K Y5 ^T +K y5 sqa +k Y5 o9r +K y5 o8o +k y4 x62 +K Y4 *B9 +K Y4 ] +^K Y4 +K Y3 y3 +K y3 Y3 +k y3 y2 +K Y3 o4y +k Y3 o2e +K y3 $e +K y3 D6 +^K Y3 +9 +k y3 *54 +k y3 *20 +K Y3 *12 +k y3 -1 +k y2 y2 +K Y2 $v +k Y2 t +K Y2 o7x +K Y2 o2p +K Y2 ^G +k Y2 E +$_ K Y2 +k } Y2 +[ k y2 +^. k y2 +$k Y1 Z5 +^k y1 Y5 +K Y1 x81 +^k Y1 x52 +^k Y1 o5b +K Y1 k +K Y1 i5 +K Y1 C +K Y1 *54 +K Y1 .5 +k Y1 +2 +k y1 +2 +K Y1 ^* +K ^* Y1 +K Y1 +^* K Y1 +k $@ Y1 +$+ $k Y1 +^- k Y1 +$K ^Y +K $y +^k ^Y +k $x x01 +K $x c +K xB1 +K xA3 t +K xA2 +K xA1 $t +K x91 +K x82 +K x81 Y1 +^K x81 +k x81 $. +k x81 { +k $. x81 +$k x62 Y2 +k x62 $8 +K x61 *54 +k x57 ,6 +k x53 x62 +^k x52 Y1 +$k x52 +^k x52 +K x51 Y3 +^k x51 i4a +K x51 ,8 +k x51 +2 +k x42 x62 +K x42 $. +K $. x42 +K [ x42 +k ^@ x42 +k x41 .1 +^k x41 +K $x *36 +k x35 t +^K x34 +$k x34 +^K x32 +^k x31 Z2 +k x31 p1 +k x31 K +{ ^k x31 +K x25 +K x24 t +K x24 *34 +$k x23 Z5 +K x21 $K +k x21 i1m +k x14 Z2 +^K x14 +k x13 *84 +k x13 +K x12 $z +K x12 $n +k x12 k +K x04 *20 +K x03 +$k x02 $p +K x02 +k x01 $x +K $w i7@ +K ^W $0 +^K $W +$k ^W +^k ^V +^K ^U +K $u +] K $u +] K ^u +$k ^U +k u +} k u +] ^k u +^k ^u +K $t Z2 +^k t Z1 +K t $Z +K ^T Y5 +k t Y2 +K t xA3 +K $t xA1 +k t x35 +K t x24 +K $T $t +k ^T o7? +K t D1 +k t d +K $t *75 +k ^t *54 +K T4 o2y +k t .3 +k T2 o0U +K T2 o0M +K T2 ^! +$@ K T2 +K T1 k +K T1 ^@ +$& K T1 +k t +1 +k T0 i94 +K T0 *58 +K T0 +2 +$K ^T +K t $. +K $. t +K $t +k sy1 c +^K ^S x41 +K ^s ^w +k st Y1 +K sty +$k ss4 +K sr6 *62 +K sqa y5 +k sob o1a +K sMb ^N +k seh -5 +K se +K sDf +K sCs o9S +k s94 +K s91 +$K s8S +K s86 +k s7. *71 +K s70 +K s6c +K ^s -3 +^K s3- +k s2z +K s2U +k s2g +1 +K s25 +K $s *24 +$K s12 +k s10 +^K s0@ +[ k s0* +$K $S +K $s [ +K [ $s +[ K $s +k ^S +] k ^S +^K r o6- +K r i51 +K r i3q +K R7 Y2 +K R7 o9d +K r *42 +k R2 t +k R2 $L +k R1 i3R +k R1 $> +k $> R1 +K R0 +k r ^0 +$K r +k ^r +$k r +^k q Z1 +K $q Y1 +^k q Y1 +K $q +K ^ q +^k ^Q +k ^ q +$k ^q +^k q +$k $p x02 +K $P ^F +K $p +7 +K p5 o52 +K p5 *7A +K p4 xA5 +^K p4 i6a +^k p4 i4u +K p4 +K p3 $Y +k p3 o0x +K p3 +K p2 $a +$k p2 '9 +K p1 x76 +K p1 x72 +K p1 x46 +K p1 l +K p1 $A +k ^o o3} +k $o $k +K oBg +K oAi +K oA2 p4 +K o9V +K o9S sCs +K o9d R7 +^k o99 +K o94 +^k o92 +^k o91 +K o9@ +K o9 +^K o9! +K o89 +K o8% +K o8. } +^k o7z +K o7v +K o7s +k o7q +k o7O c +K o7k +] $k o7j +$k o7i +K o74 +1 +{ k o74 +k o72 +k o71 +K o6# ^S +K o6l Z1 +$! k o6k +K o6g +K o6c +K o6a +^k o69 .1 +^k o69 +^k o65 Z1 +k o62 +5 +K o6- +k o5z ^t +^k o5w +$K o5M +{ K o5l +k o5j *47 +K o5F +K o5d +^k o5b Y1 +k o5b $7 +K ^` o53 +K o5- +^k o5. +K o4y Y3 +k o4u +k o4p +K o4n +k o4m *34 +^K o4h +k o4g c +k o4_ D5 +$K [ o4c +$K o4c +^K o4b l +K o4b +K o43 +K o4 +k o3y +K o3w +k o3u +k o3s ,2 +K o3r +^k o3r +k o3N { +k o3k +^K o3H ,2 +K o3e +6 +k o3c *43 +k o3c +K o3B $7 +^k o3b +K o3a -0 +k o35 +$K $O -3 +] K o3- +k o3= +K o2z +K o2y T4 +[ K o2w +k o2u +k o2S +k o2s +k o2q +1 +K o2p Y2 +k o2o *A0 +^k o2m *73 +k o2m +K o2l +$K o2k +$k o2k +^K o2i +k o2f +k o2e Y3 +k o25 +k o24 +k o21 ^6 +[ K o21 +k o1z +K o1y +K o1w +k o1 ^T +k o1s Z1 +k o1s *05 +K o1r +k o1P i34 +k [ o1p +^k o1p +^K o1n +k o1m +^K o1e +k o1a sob +K o1a +k o18 +K o1. +7 +^K o1@ +K o0z +k o0U T2 +K o0r +K o0q +K o0p +$k o0n *32 +K o0M T2 +K o0G ,4 +K o0G +K o0F +K o0d +k o0c Z2 +k o04 +^K ^O +K ] ^o +K ^o ] +$K $o +K $n x12 +k ^n u +K ^N sMb +K ^N +K $n +K ^n +^k ^N +k ^n +k ^m o1- +K ^M ^F +k ^m -1 +K } $m +k $M +k $L R2 +K l p1 +^K l o4b +k ^l $h +K $L E +K l *85 +{ K L8 +K L7 *36 +K $l +7 +$k L6 +K l +5 +$k L3 +K L0 +$k L0 +$K ^L +$. K ^L +K $l +$k k Z1 +K k Y1 +k $K Y1 +k K x31 +K $K x21 +k ^k i76 +^k K i2@ +k K i0N +K k $c +^K $k ,4 +$K K *02 +K $k *01 +} $k ^k +} ^k $k +k ^j p1 +K $j i3, +K ^j i1v +^K ^J *46 +K ^j $1 +K $J +K iAx +$k iAs +$k iAi +K iA1 x62 +K i9a +k i94 T0 +K i90 $3 +$k i8i +k i8a *86 +K i88 +K i80 C +K i8' +K i8. +^k i8^ +$K i7S +K ^! i7r +K i7i ,6 +K i7e *46 +K i7c +k i78 ^k +K i75 Z1 +k i7. } +k i7_ +$k i6W +k { i6o +K i6N +K i6b +8 +k i6b +^k i6& +k i5y r +K i5 Y1 +K i5x $H +^k i5x +^K i5w +k i5w +K i5v $9 +^K i5u +K i5t +^K i5s +$K i5p +k i5L i68 +K i5L +^K i5L +^k i5L +k i5k +k i5F +0 +k i5e +K i5d $z +$k i5d +[ K i5a +k i56 $D +k i54 +$k i54 $- +$k $- i54 +$K i53 +^k i5. +K i4y i2c +K i4y +K i4t i4k +^K i4r +$k i4D +k i4c +K i48 +2 +K i47 +K i44 +K i4. +[ K i4. +k i4_ +k i3x +{ $k i3w +^k i3s +k i3R R1 +$k i3q +^k i3q +K i3p $c +K i3p +K i3O +K i3j i23 +K i3, $j +k i3h -4 +$K i3h +k i3g +k i3! E +K i3a +^k i35 +k i34 o1P +k i34 +$K i32 +K i3! +K i2t +^k i2@ K +k i2i x52 +k i2i $- +k $- i2i +K i2H ^k +$k i2h +K i2g +5 +k i2f +$@ k i2e +K i2a $4 +K i21 +k i2 +1 +^k i2 +K i1y +$K i1s +k i1i +k i1f +K i1e +1 +^k i1b ^y +K i1B i0D +^K i1B +k i1A +^k i1A +k i16 ^9 +k i15 +k ^i +1 +k i0z $8 +k i0z $2 +^k i0u +k i0N K +^k i0n +k i0M p5 +k i0e o21 +k i0e +k i0D *41 +K i0c +6 +K i0c +^K i0A +^K i05 +^k i03 +K $i +^k ^i +k ^h y3 +k ^H r +k $h ^l +K $H i5x +$K ^H +K ^G Y2 +K $g r +^k ^g o11 +^k ^G $0 +] k ^G +k f x6A +K ^F $P +K ^f D2 +k f *A9 +k f *9A +[ K ^f +K $e y3 +k E Y2 +k E i3! +$K $e c +K E $A +k E *65 +K E *56 +K E +$# K E +[ $K E +^K ^E +^k ^E +$k ^e +k ^D t +k d t +K d $Q +K $D $k +K $d i66 +k $D i56 +k d E +K $d D5 +K D9 +K D8 +k d ^8 +^k D7 i1m +K D7 *75 +k { D7 +k D7 +k D6 -1 +K D6 +$- k D6 +^k D6 +k D5 o4_ +K D5 $d +k D5 *35 +k D5 *25 +K D5 $2 +K D4 ^k +K D4 $3 +k D4 $* +k $* D4 +k D3 p1 +[ k D3 +K D2 ^g +K D2 D3 +k D2 c +k D2 +6 +K D1 t +K D1 $a +K D1 $4 +K D1 .4 +k $# ^D +k ^D $# +k ^D +^k $D +^k ^D +$k $d +^k $d +K C Y1 +K c $x +k c sy1 +$K c r +k c o4g +K $c k +K C i80 +K $c i3p +K c ^F +$K c $e +k c D2 +k c *79 +k c $7 +$K $C *67 +K C +5 +^k ^C *45 +k c *24 +k c +1 +K C ] +K ] C +$K ^C +$K c $$ +$K $$ c +k $B $H +k $b ^5 +K 'B +$K $B +$- K ^B +k ] ^b +k ^b ] +k $a Y1 +K ^a x25 +K $a D1 +K *A9 +k *A0 o2o +K $$ ^A +K $A +K ^A $$ +$K -A +$k ^A +K $9 i5v +$K *9A +K .9 $1 +K $9 +k +9 +{ k -9 +k $8 x62 +k $8 i0z +K *8A +k *89 *24 +K *87 D5 +^k *87 ^b +k *86 ^m +k +8 *62 +k { *86 +K *85 l +k +8 *26 +k *82 *59 +$. k ,8 +^k ,8 +k +7 Z1 +$k $7 Y1 +k +7 ^s +K +7 $p +K ,7 o63 +k $7 o5b +K $7 o3B +K +7 o1. +K +7 $l +k +7 d +k $7 c +k *79 c +k *76 *37 +K *75 $t +k *75 ,6 +K *75 +K *74 ,4 +^k *73 o2m +K *73 ^a +k *71 s7. +K $ .7 +$K +7 +k +7 +$k +6 Z5 +$k ,6 Z5 +K +6 o3e +K ,6 i7i +k *67 y2 +k *67 x42 +$K *67 $C +k *67 *42 +k *65 E +k *65 ^a +K *65 -4 +K *65 +3 +K *65 $$ +K *65 +K $$ *65 +k +6 -3 +K *62 sr6 +k *62 +8 +k *60 i33 +K *60 +K +6 $! +K $. ,6 +K $! +6 +K ,6 $. +K -6 +$K -6 +^K $6 +^K ^6 +k ,6 +k ^6 +K .5 Y1 +k -5 seh +k +5 o62 +K +5 l +K +5 C +k ^5 $b +k *59 *82 +K *58 T0 +K *57 *46 +k *57 *41 +k *57 +4 +K *56 E +k *56 -1 +K *56 $$ +K $$ *56 +K *54 Y1 +K *54 x61 +K -5 *48 +K *54 *03 +K *54 +k +5 -3 +k *52 *75 +k *52 +0 +K -5 +2 +k +5 ^2 +k ,5 .2 +{ k *52 +k *51 ,2 +k } *51 +K .5 +0 +K +5 +K $5 +K ,5 +$K .5 +^K $5 +^! K -5 +k -4 ^w +K ,4 o0G +^K ,4 $k +^k .4 i4- +K $4 i2a +K $4 D1 +K *48 -5 +k *47 o5j +K *47 .1 +K *46 i7e +k *46 i4. +k *46 i1. +K *46 *57 +K -4 *65 +k *46 *20 +k +4 *57 +K } *45 +k *45 $! +k $! *45 +k *42 *67 +k .4 ,2 +K *41 i2b +k *41 *57 +k -4 *03 +K +4 +K .4 +^K $4 +k +4 $* +k $* +4 +k .4 +$k +4 +k .3 t +$K -3 $O +K $3 i90 +k ^3 i7+ +K $3 D4 +K *3A y2 +K *37 i3r +K *36 $x +K *36 L7 +K *36 ^l +K +3 *65 +k -3 +6 +$k *35 r +k -3 +5 +k *34 ^D +$k *32 o0n +k +3 *06 +k *30 *23 +K *30 +K } *30 +k +3 -0 +k +3 [ +$k ^3 +^k ] $3 +^k ,3 +^k ^3 +^k $2 z2 +k +2 Y1 +k +2 x51 +K +2 T0 +k -2 p1 +k ,2 o3s +^K ,2 o3H +K +2 i48 +k $2 i0z +K $2 D5 +k -2 d +k *26 +8 +k *25 +2 +K +2 -5 +K *25 +k .2 ,5 +K *24 $s +k *24 c +k *24 *89 +k ,2 .4 +k *23 y2 +^K *21 +k *21 } +k *20 *46 +K $- $2 +$K $2 +} K $2 +k -2 +$? ^k +2 +^k ,2 +k +1 y2 +k .1 x41 +k +1 t +k +1 s2g +K +1 o74 +^k .1 o69 +k +1 o2q +K $1 ^j +k -1 D6 +k +1 c +K $1 .9 +K *17 +$k *17 +} k *17 +k *16 o1v +{ k *16 +k -1 *56 +k *15 +0 +K .1 *47 +k *14 +$k *13 ^p +K *12 Y3 +k .1 *03 +K -1 +^K -1 +$- k -1 +$- k ^1 +[ k $1 +^k $1 +k $0 Z2 +K $0 ^W +K -0 o3a +k +0 i5F +^k $0 ^G +k *07 +k *06 +3 +k *05 o1s +k +0 *52 +K +0 .5 +} K *05 +{ k *04 +K *03 k +K *03 *54 +k *03 -4 +k *03 .1 +k -0 +3 +K *02 o0e +$K *02 K +k *02 +K *01 $z +K *01 $k +k +0 *15 +K +0 +K -0 +k -0 { +^k ^0 +^. k -0 +K $$ +K $. +K $? +K $_ +K $= +K ] $@ +K ^_ +$K $! +$+ K +$@ K +$( K $) +$' K +$! ^K +$- K +$` K +} $@ ^K +} ^K $@ +} ^K +{ { K +{ K +^K $# +^K $. +^@ } ^K +^ K +k $= +k } } +$k $* +$+ $k +$+ k +$* ^k +$! k $@ +$! $@ k +$ ^k +$= $k +^k $+ +^k ^, +^@ $k +^@ ^k +$j Z5 u +^J Z5 .5 +$j Z5 *43 +$j Z4 y3 +^j z3 -6 +^j z3 +^J z2 +^j z2 +$j Z1 s84 +^J z1 *87 +$J Z1 } +$j Z1 [ +$j [ Z1 +$j Z1 +{ $j Z1 +^j ^Z +$j ^z +$j Y5 o4? +$j Y5 +$j y3 Z4 +^J y3 +^j y2 x76 +^j y1 t +^J ^Y +$j x72 +^j x62 $j +^J x51 +$J x43 i5D +^j x43 +$j x34 $h +^j x32 +^J x23 { +$j x16 o0m +^J x14 +$J x12 +$J x05 +^J } ^W +^j $w } +$J $V +$J $v +^J $v +$j $v +^j ^v +$j u Z5 +^J $u +^j t y1 +$J T1 ^W +^j T1 o3X +$j T0 $h +$j $t .0 +$J $s o2Q +^j siu +$j sdq +$j s84 Z1 +$j s1R +$j $s +^J r Y1 +$j r R5 +{ ^J RA +^j R9 +$J $R $- +$J $R +^J $R +$J $r +^J ^r +$j ^r +$j ^q +$J ^p { +^j ^P +^j ^p +$j o8\ R8 +^J o86 +^j o7U +^j o7K +2 +^J o7j +^J o65 +^j o5m k +^J o5d +^J o4c +^j o3X T1 +^j o2y +^J o2v +^J o2u +3 +$J o2Q $s +^j o2% +$j o0m x16 +$j $O +$j $n +^j $n +^j $m c +$j $M +$j l +^j k o5m +$J ^k +$j $K +$j ^K +$j ^k +^j $j x62 +$j iAh +$j i9w +$J i9j +$J i7Y +$J i7v +$J i7S +^J i7N +$J i7d u +$j i7= +$j i6w y1 +^j i6s +^j i61 +$j i5s +^j i5s +$j i5l +$J i5K +^j i5h +$J i4s +^j i4r +^J i4_ +$j i3v +$j i3l +$j i3h +$J i3a +$j i3A +^J i3# +^j i2y +$j i2w x52 +$j i2q +$j i2J *02 +$j i2d +$j i1w +^J i1q +^# ^j i1p +$j i1m +^j i1h $. +^j $. i1h +^J i1C +^J i0R +$j i0n +$j $i +$j $h x34 +$j $h T0 +^J ^H +^J $h +^j ^H +} $j ^h +$J $G +^j ^F +^J d x06 +$J d E +^J d E +$j D6 +^J D5 o5P +^j D5 +$J $d +$j ^d +} ^j d +^j c $m +^J c $2 +$J $c +^J $b +^j ^b +^J ^9 o1C +$J $! .9 +^J -8 z1 +^J $8 +^j *76 +2 +^j $7 .5 +$j *73 o7i +^J -7 +$j *62 +] ^j *62 +^J .5 Z5 +^j .5 $7 +^J *54 +^j *52 +$J +5 +$j *47 x32 +^J ,4 -4 +$j *43 Z5 +^j *41 +^j -4 +^J +3 o2u +$j +3 +{ ^j .3 +^j +2 o7K +^J $2 c +^j +2 *76 +$j *26 i5h +^j +2 +$j .0 $t +$J *04 +^j $0 +$J $* +$J ^$ +^J $@ +^. ^J +^- ^J +$j $+ +$j { +$$ $j +$@ ^j +$- $j +{ $j +{ ^j +^j $, +^j +$I Z5 x95 +$I Z5 oB5 +^I Z4 o5o +$I Z3 oB1 +$i Z3 +$I Z2 sI* +$I z2 $i +^i Z2 *54 +$i Z2 +$I Z1 x74 +^I Z1 x42 +$i Z1 o0s +$I Z1 i6X +^I z1 E +$i Z1 ,5 +^i Z1 +^i z1 +$i y4 Y3 +$i Y3 y4 +$i y2 z1 +$i y2 t +$i Y2 *48 +^I Y2 +^i y2 +$i Y1 x93 +^I Y1 x42 +^i Y1 x12 +$I Y1 ,1 +$i x93 Y1 +$i x82 +^i x82 +$I x74 Z1 +$i x62 u +$i x62 *51 +$I x61 c +$I x61 +$i x52 p4 +^i x45 +^I x42 Z1 +^I x42 Y1 +^I x42 +^i x42 +^I x32 ^F +^I x31 +$i x31 +^I x16 $s +^i x12 Y1 +^I x12 +^i x04 $$ +^i $$ x04 +$I $v +$i u x62 +^i $u ^5 +$I ^U +$i t y2 +$I } T5 +^i T1 +^i t *05 +$i $t +^I $s x16 +$I sI* Z2 +^I s9@ +^I s6H +$I s41 +^I R1 +^i ^q i2. +$I q -5 +^i p1 c +$I $P +^i ^P +$i oAa +^I o9H +^I o87 +^I o84 +^i { o7k +$i o6o +^I o5o Z4 +^i o4o +$i o42 .6 +^I o41 +^I o3z +^i o3s i6b +^I o3D +^i o21 +^I o1r +^i o1r +^I o1n +$I o1i ^T +^I o1B +^i o1] +^i o1< +[ $i o0t +$i o0s Z1 +$i $n D9 +$i ^M +$i $m +$I l ^U +^i ^L +^i K i0F +$I K +^i ^K +$I $i z2 +$I i7L +$I i6X Z1 +$i i6u +$i i6n +^i i6b o3s +^i i6. +^i i5d +^i i54 +$I i4H +$i i4b +^i i3O +^i i3g x52 +^i i24 +$i i1i +^i i1g ^C +^I i1C +^I i0w +^i i0F K +^I ^I +^I $i +^i $I +$i ^i +$i $g +^i ^f ^G +$i ^f +^i ^E +$i D9 $n +^i D6 *23 +^! $i D5 +^i D2 +$i ^D +$I c x61 +$i c *68 +$I $C +^I ^C +^i ^c +iB- Y2 +iBX Z1 [ +iBX [ Z1 +iB= x74 +iB- x51 +iBW c +iBu x56 +iB u +$I $B t +iBt +iBs u +iBs +iBp ] +iBM +iB_ K +iBk +iBJ u +iBe $y x84 +iBe x84 $y +iBe +iBC ^F +iB, c +iBa x82 +iBa x71 +iBa x61 +iB8 ] +iB5 y4 x35 +iB. $5 +iB4 x27 +iB+ $4 +$@ iB4 +iB3 ] +iB1 Y2 +iB1 $9 p3 +iB1 ] +iB $1 +iB1 +$! iB0 +iB* +$# iB* +] iB@ +iAz oBx +iAZ E +iAx x36 y2 +iAx o9u +iA` x51 +iA% x05 +iAv x81 E +iAv E x81 +iAv +iAu sue iBf +iAu iBf sue +iAt D7 +iA# T3 +iA_ t +iAs +iAr x64 +iAr x54 +iAr K +iAr *8B +iAP xA3 +B +{ iAo *A0 +iA_ o3n +iAn x06 +iAn u +iAm x64 u +iAm u x64 +iAm c +iAM *A8 .7 +iAM +iAm ] +iAL +iA_ l $. +iA_ $. l +$. iAl +] iAl +iAl +iAh +iAg +iAE iBp x7A +iAe $1 +iA, E +iAD l $0 +iA@ D7 +iA_ D6 +iA- D2 +iAD $0 l +iAd +iAa x25 +iAa D6 +iA *98 +iA/ ,9 +iA9 +iA8 x72 +iA8 x32 +iA7 x71 +iA7 o9( +iA7 +iA6 i9@ +iA6 *65 $3 +iA6 $3 *65 +iA3 ] +iA2 x42 +iA2 o9t +iA2 +iA1 x42 -3 +iA1 u +iA1 iB0 +iA1 *9B oB7 +iA1 -3 x42 +iA0 oB9 +iA0 o8_ +iA0 iA. +iA0 $* +iA0 $= +iA $0 +$@ iA0 +^I 'A +iA! ^! +iA- ] +iA= ] +$# iA$ +$. iA. +^- iA- +^_ iA! +i9Z y1 ,A +i9z $0 +i9< Y2 +i9y +i9x x62 +i9X x54 l +i9X l x54 +i9' x93 } +i9- x72 *25 +i9. x62 +i9. x51 +i9_ x45 +i9. x41 +i9- x32 +i9# x25 +i9 x07 y3 +i9@ x04 +^@ i9. x03 +i9w x53 +i9v x05 +i9V u +i9u o7h +i9U C +i9U $9 +i9t D4 *23 +i9t *A8 +i9t *23 D4 +i9- t +i9t +i9s Y2 x43 +i9s xA2 E +i9s x43 Y2 +i9s u +i9s ^s +i9s E xA2 +i9 s95 +i9s ] .4 +i9s .4 ] +i9S +i9R x21 [ +i9r o8e +i9r o7f +i9r -A +i9r +i9p o7w +i9o x31 +i9o u +i9o o5c +i9o K +i9O iAK +$. i9. oB9 +i9; o9l x43 +i9$ o7@ +i9n $a +i9n ,8 +i9N +i9M y2 +i9M o8F +i9m *97 +i9l x63 +i9L E +$. i9_ l +i9k RA +i9k +A +i9/ K +^= i9k { +i9j x54 +i9J u +i9J c +i9j ,9 -3 +i9j -3 ,9 +i9i i9k +i9i c -5 +i9- i81 +i9. i6n +i9i -5 c +i9_ i0s +[ i9i +i9h x27 +i9g i8 +i9E x73 o67 +i9E o67 x73 +i9e K iBu +i9e iBu K +i9 E D2 +i9e *39 +i9# E +i9* E +i9/ E +i9, E +i9/ DA $* +i9/ $* DA +i9_ D3 +i9 D2 E +i9C C +i9c *65 +i9c +i9B D1 +i9b -B +i9b ] +i9A x21 +i9A o8F +i9a iAj +i9. $A +i9/ -A +i9_ +A +i9_ $A +i99 r ,9 +i99 ,A +i9} +9 +i99 +i98 i2n +i98 .8 +i98 ^1 +i98 ] $@ +i9, .8 +$- i9_ -7 +$@ i96 x35 +i96 iA2 +i9 *67 +i96 +i95 Y1 +i95 x72 ^f +i95 o8@ +i95 o1k +i95 +8 +i95 .7 +i95 ,1 +$@ i95 +$! i95 +i95 +i94 x03 +$! i94 s1m +i94 D1 +i9, *45 x51 +i9, $4 +i93 Z2 +i93 *5A +i93 -4 +i93 $* +i92 [ E +] i92 -6 +i9- *25 x72 +] i92 +i91 Y2 +i91 TA +i91 D6 -0 +i91 *87 +i91 -0 D6 +^I *91 +i90 c +$@ i90 +$! i90 +i9% ] +i9/ ^! +i9? +i9! ^_ +i9, +i9 ] +i9^ $* +$% i9$ +$. i9_ +$. i9 +$> i9< +^. i9- +^! i9! +i8z Z2 .7 +i8z x53 +i8z C +i8z .7 Z2 +i8z ,7 +i8. Z4 E +i8y Z3 +$! i8y l +i8y $! ,7 +i8y ,7 $! +i8x x43 +i8X x12 +i8X s*D +i8 x95 +i8# x51 +i8/ x42 +i8- x42 +i8. x24 ^S +i8- x24 +i8_ x12 +i8 x01 +i8x +i8W c +i8v o9k +i8v i0v +i8V $3 +i8V +] i8v +i8u t +i8u o7D +i8u o0M +i8U +i8u $@ +i8- $u +] i8u +i8u +i8t x62 +i8t $W +i8t shn +i8t s3. +i8! T7 +i8# T1 +i8T +i8 t +i8s Z1 +i8s u ] +i8s ] u +i8S T7 +i8s siu +i8S o9E +i8@ sio +i8s DB +i8s C +i8" s0\ +i8R u +i8R o9A +i8 R9 +i8r +9 +i8Q u +i8Q i8a +i8Q $1 +i8q +i8p +B .8 +i8p .8 +B +i8p *43 +i8_ p1 x98 +i8P +i8p +i8o Z1 +i8o o9f +i8O i9O +i8O [ C +i8 o9M +i8o ,7 +i8$ o7@ +i8$ o7) +i8@ o6e l +i8@ o5x +i8 o5i +i8o *57 +i8o *56 +i8@ o4c +i8o ] +i8n u +i8n sn +i8n .7 +i8n ,3 +] i8n +] i8m Y2 +i8m ^M +i8m $m +i8M +i8l x92 u +i8l x15 +i8l u x92 +i8l t +i8@ l o6e +i8l D1 +i8l +9 [ +i8l *53 p3 +i8l ] +[ i8l +i8k Z1 C +i8k x34 +i8= $K l +i8k K +i8K i8* +i8K ^e +i8k C Z1 +i8* K *67 +i8k $6 +i8= K +$@ i8K +i8k +i8j D5 +i8J *48 x52 +$. i8j +] i8j +i8i Z1 D0 +i8i t '9 +i8i o4g +i8i D0 Z1 +i8% iA3 +i8i -A +i8i '9 t +i8- i9G $# +i8- $# i9G +i8% i92 +i8_ i6_ E +i8@ i6e +i8i .3 +i8/ i0/ +i8h Y2 +i8H c +8 +i8H ,9 +i8H +8 c +i8h $8 +i8h -6 +i8h -3 +i8g x42 +i8g *68 +i8F c -B +i8F -B c +i8f *90 +i8. E Z4 +i8e x93 +i8e u 'A +i8e t +i8e $p +i8_ E i6_ +i8e $e +i8e 'A u +i8e 'A +i8e *87 +i8e +7 +i8e -7 +i8e *28 +i8E +0 +i8e +i8D x74 c +i8D oA0 +i8d o9f D2 +i8D c x74 +i8D c +i8/ D1 +} } i8D +i8c x73 ,6 +i8c x52 +i8c ,6 x73 +i8) c +i8b x26 +i8b -4 +i8_ -B +$= i8a l +i8a C ] +i8a ] C +i8A $0 +$i *8A +] i8a +i89 x64 ^/ +i89 r +i89 p5 .1 +i8/ *9A +i89 .7 +i89 ,2 +i89 $@ +i8. $9 +i8/ ,9 +i8_ .9 +i88 x32 +i88 $S +i88 o2p +i88 i80 +i88 -9 +i88 *8B +i88 *54 +i88 ,5 $0 +i8# *84 x42 +i88 $0 ,5 +i88 $. +i8_ $8 +i87 Z4 +i8# .7 x52 +i87 x25 +i87 x04 +i87 ^E +i87 *83 +i87 .4 +i8. -7 +i8- $7 +$@ i87 +$! i87 +] i87 +^ i8 $7 +i86 T0 +i8* *67 K +i86 *39 +i8_ +6 +] i86 +i85 Z1 +i85 x32 +i85 $A +i85 +7 +i8@ *56 +i85 $5 +$? i85 +$! i8. +5 +$! i85 +i84 x42 +i84 x12 +i84 x02 +i84 o5W x14 +i84 o0s +i84 D6 +i84 c +i84 ,9 +i84 *84 +i84 *58 +i8. *45 +i8- +4 +i83 x61 +i83 oAa +i83 o0S +i83 $9 $u +i8. +3 +i82 t *41 +i82 -8 -6 +i82 -6 -8 +i82 .5 +i82 *41 t +[ i82 .1 +i8. .2 +i8, $2 +i8_ $2 +i8_ ,2 +i81 Y5 u +i81 Y3 +i81 x25 +i81 x23 +i81 u Y5 +i81 TA +i81 o0K +i81 +3 +i81 ^1 +9 +i8- +1 +i8- $1 +i80 u +i80 oAr +i80 oA= +i80 ^K t +i80 *B8 x35 +i80 *36 p5 +$I { *80 +i80 $/ +i8. $0 +$. i80 +i8# +i8& +i8@ $@ +i8. [ +i8, ] +i8, +i8_ } +i8` +$i +8 +$% i8$ +$* i8& +$* i8/ +$. i8( +$; i8( +$_ i8- +$ i8_ +] i8@ +^' i8. +i7z D3 +i7@ Z2 +i7z +2 +i7_ Z1 +i7. z1 +i7- z1 +$/ i7z +i7y Z2 +i7y u +i7Y o8U +i7y o8f +i7y iA1 +i7y i6w +i7y .6 +i7 y5 x36 +i7y $5 +i7. Y3 x32 +i7_ Y3 +i7. Y2 Y2 +$* i7Y +[ i7y +i7X x51 +i7X x45 Y3 +i7X k +$. i7x D8 +i7 xB1 +i7x *56 +i7@ x41 +i7. x32 Y3 +i7- x31 +i7) x17 +i7x $1 +i7! x04 d +i7* x03 +i7* x02 +i7# $x +$@ i7x +i7w o6k +i7w i7j ,4 +i7w $A +i7W .6 +i7w .6 +i7w ,4 i7j +i7w -1 +i7W *07 +$_ i7w +[ i7w +^. i7w +i7v t +i7v o6d +$? i7V +i7v ] +i7u Y1 *64 +i7u x41 ,3 +i7u u +i7u C +i7u *64 Y1 +i7u ,3 x41 +i7T x41 c +i7t k +] i7t D3 +i7T c x41 +i7t *84 +i7t *72 .0 +i7t .6 +i7% T5 +i7t $5 +i7# T3 +i7. T2 +i7t .0 *72 +i7+ T0 *45 +i7t [ +i7s xB1 +i7s xA2 +i7S u +i7s s90 [ +i7s [ s90 +i7s s75 +i7! sdD +i7s D0 +i7S c T2 +i7S c +i7s $B +i7s -8 +i7s *71 +i7- s57 o8- +i7- s18 +} i7' s0z +i7$ s02 +i7s ] +i7r r +i7r o6j +i7r o1y +i7r [ C +i7r +9 +i7r -8 +i7r +6 +i7r .6 +i7r *46 +i7_ R1 D3 +i7R *08 +i7Q x42 +i7Q $T +i7Q ^Q +i7q +8 x31 +i7p srk +i7p o8m +i7p c +i7p +5 +i7p *34 +i7* p3 .2 +i7* p2 i7* +i7 p2 $9 +i7P +i7p { +i7@ $p +i7o Y2 +i7o x51 +i7o x02 +i7O p1 x81 +i7o o6y +i7o o6g +i7o $o +i7o i8n +] i7@ o9a +i7@ o99 +i7o '9 +i7- o8- s57 +i7o *8A +i7] o7. *9A +i7@ o60 K +i7+ o60 +i7| o48 +i7* o2u +i7, o1g +i7O +i7n o8j +i7n L8 +i7n k +i7n i0n +i7N C +i7n $! +i7m Y2 +i7m t -8 +i7m s4P +i7m k D2 +i7M E +i7m D2 k +i7M c +i7m -8 t +i7m *75 +i7m .6 p5 +i7M *46 +i7m *08 +i7m +0 +$! i7m +] i7m +i7l sel +i7l L8 +i7l ,3 +i7@ K o60 +i7k o4, +i7k $l +i7k K $! +i7K i9K +i7k *A7 +i7k +9 +i7k .9 +i7K .6 +i7_ $_ K +i7j o8w +i7j o5i +4 +i7j D6 i8k +i7j .6 +i7j +4 o5i +i7# $J +i7i $W +i7I t +i7i o5_ +i7i o2L +i7i iAi +i7i 'B +i7. i90 +i7I ,8 +i7< i8= +i7- i7h +i7- i75 +i7& i7% +i7. i6t +i7= i6+ +i7. i5_ +i7_ i4y +i7@ i4@ +i7= i4+ +i7i ,2 +i7. i1a +i7i .0 ^a +i7i $@ +$% i7i +i7H T0 se4 +i7H se4 T0 +i7H r o62 +i7H l s0F +i7H i7H +i7h $h +i7h $A +i7h *92 +i7h .9 +i7h *70 +i7h .6 +i7h *53 +i7h [ +i7g xA1 +i7g x23 +i7G o1@ +i7g ,B D8 +i7g $3 +i7G +i7f x81 D6 +i7f D3 +i7f ,8 *83 +i7f *07 +i7e Y3 +i7e x92 +i7e x12 +i7e i7g +i7e $a +i7e +8 +i7e +6 +i7e *07 +i7d i7e +i7d i4t +i7d ^D +i7_ D4 +i7_ D3 R1 +i7@ D3 +i7' D3 +i7@ D2 +i7/ D1 *75 +i7d *13 +[ i7d +i7d +i7c x43 +i7c x12 +i7c x01 x32 +i7c sDW +i7c D2 *17 +i7* C +i7- C +i7c ] +i7c [ +i7B x43 +i7B u +i7B i7L +i7B D4 *73 +i7b -A +i7b *61 +i7b *16 +i7@ ,B +i7 -B +i7a Y4 *37 +i7a x21 +i7a K ,9 +i7a i2n +] i7A E +i7A '9 +i7a +8 +i7a $4 +i7- -A +i7 -A +i7A +i7_ ^a +i7a +i79 x31 +i79 C ,4 +i7] *9A o7. +i7! *97 +8 +i79 +6 +] i79 .6 +i79 ,4 C +i79 *48 +i7* *94 *7B +i79 *34 +i79 $3 +i79 $* +i79 $. +i79 $_ +i79 ] +i7. -9 +i7/ ,9 +$. i79 +] i79 +i78 Y5 +i78 Y4 +i7 +8 Y2 +i78 u +i78 R6 +i78 i7. +i78 D3 c +i78 D1 +i78 c D3 +i78 -A +i7! +8 *97 +i78 *73 +i78 $7 +i7+ *86 x43 +i7- *85 Z1 +i78 .3 +i7@ +8 +i7. +8 +i7! ,8 +i7( .7 x32 +i77 p4 $8 +i77 $G +i7* *7B *94 +i77 $A +i77 -9 +i77 -8 +i77 .6 +i77 [ +i7# $7 +i7- $7 +i7_ $7 +$# i76 Z2 +i76 Y3 Y3 +i76 y3 x46 +i76 Y3 T2 +i76 T3 +i76 T2 Y3 +i76 o68 +i76 C +i76 'B *67 +i7. *69 +i76 *67 'B +i76 *58 +i7- *65 +i76 $4 +i76 ^4 +i7- *64 +i76 +3 +i76 +0 +i7/ +6 +i7_ $6 +$` i76 +i76 +i75 x01 +i7- ^5 L9 +i75 i69 ,6 +i75 ^C +i75 -8 +i7% *57 +i75 -6 +i7_ *54 +i75 *16 +i7. *50 +i7@ ,5 +i7@ -5 +i7_ +5 +i74 TB +i74 c $. +i74 $. c +i74 $a +3 +i74 *68 +i74 -6 +i7+ *45 T0 +i74 .5 +i74 +3 $a +i74 *24 +i7% $4 +i7. -4 +i7/ +4 +i73 o6a +i73 o1Z +i73 K +i73 i8i +i73 i34 +i73 $9 +i73 *69 +i73 *65 ] +i73 ] *65 +i73 +6 +i73 $5 +i73 [ [ +^+ { i73 +i72 Z2 x41 +i72 Y5 l +i72 x41 Z2 +i72 R3 +i72 p3 x83 +i72 o0c +i72 l Y5 +i72 i67 +i72 i4L +i72 i3d *06 +i72 i1i +i72 D3 +i72 c [ +i72 [ c +i72 +8 +i72 $8 +i72 *68 $/ +i72 $/ *68 +i7+ +2 +i7_ $2 +i71 i7A +i71 i1r +^i *71 *60 +i71 *40 +i71 $@ +i71 ^@ +i7_ ^1 +$* i71 +i70 x83 +i70 x01 o6w +i70 ^P E +i70 i6p o7* +i70 i53 +i70 i51 +i7. *04 +i70 *23 +i7& ] +i7@ ^? +i7{ $} +i7. ^# +i7? ^? +i7, $@ +i7, $- +i7- $= +i7- ^. +i7 $$ +i7 ] $ +} i7@ +] i7- +] i7_ +^i +7 ] +^i ] +7 +^i ,7 +^% i7% +^% i7& +^$ i7/ +^@ i7@ +^- i7- +^_ i7 +^^ i7^ +i6Z x65 o3o +i6Z o4V +i6Z o3o x65 +i6z o1i +i6z L6 +i6z i5e +i6z *89 +i6# Z4 x14 +i6@ Z3 x13 +i6+ z1 +i6z $* +i6y ^y +i6y seO +i6Y i6N +i6y i0A x13 +i6y E +i6y -9 +i6- Y3 x03 +i6 Y3 +i6@ Y2 *64 +i6@ Y2 +i6, Y2 +i6@ y2 +i6 Y1 Y3 +i6, Y1 c +i6 y1 *07 +i6- $* Y1 +i6y $- +i6y ] +} i6y +i6X u ] +i6X ] u +i6X u +i6x $S +i6x o5 xA5 +i6x o5 +i6x o2V +i6x $m +i6x E -7 +i6X D2 +i6, xA1 +i6, x93 *54 +i6- x93 +i6X .8 +i6x -7 E +i6@ x74 +i6 x73 s = +i6. x73 +i6) x52 ^b +i6/ x34 +i6- x32 +i6_ x32 +i6 x21 +i6# x14 Z4 +i6@ x13 Z3 +i6+ x12 +i6_ x12 +i6, x09 +i6x *04 +i6- x03 Y3 +} } i6X +i6x $= +i6w Y3 Y3 +i6W x24 +i6w x13 k +i6W o7A $N +i6W $N o7A +i6w i8y +i6w D1 +i6w -8 +i6w *74 +i6w +5 +i6w { +$? i6w +i6v x42 c +i6v x41 +{ i6v o3B +i6V ^E +i6v c x42 +i6v .7 +i6V *21 +$$ i6V +i6V +i6v $- +$! i6v +i6u Y3 +i6u x91 x31 +i6u x72 +i6u R4 +i6u k +i6u DB +i6U C +i6u +7 *73 +i6u -5 +i6u $3 +i6u } +i6u ^@ +i6, u +$= i6u +i6t x04 +i6t skj +i6t o7r +8 +i6t o3d +i6t i1o +i6t $g D0 +i6t D0 $g +i6@ T9 +i6t +8 o7r +i6! T7 +i6_ T7 +i6t *26 +i6+ T1 +i6@ T1 +] i6_ ^T +$* i6t +i6S Z1 E +i6S Y2 +i6@ sxw +i6s x73 Y1 +i6 s = x73 +i6s ^X +i6s $W +i6* sv* +i6s p5 *01 +i6s o30 ,5 +i6/ smf +i6 sm1 +i6s ^l +i6s i6s +i6s i6r +i6s ^g +i6S E Z1 +i6s ^E +i6! s9f +i6s $6 +i6s ,5 o30 +i6+ s5* +i6S $! +i6s $. +i6s $_ +i6s +i6r Z1 +i6r o5i +i6r o3. +i6R o0S D3 +i6r $m +i6R L7 +i6r L3 +i6r ^j +i6r i6w +i6r ^E +i6R D3 o0S +i6R C +i6r c +i6_ r '8 +i6r *62 +i6R .5 +i6R +i6r $@ +^, i6r +i6q $w +i6q T7 +i6Q $T +i6Q o5Q +i6q i5i +i6Q ,7 +i6q *0B x24 +i6Q +i6` $q +i6p i4H o4k +i6P C +i6p $5 +i6p -4 +i6P $- +i6 ^p +$! i6p +i6O Y2 t +i6o x74 +i6o u +i6O t Y2 +i6o $s } +i6o o4I +i6o o3k +i6o L8 +i6o K +i6o i6v +i6, o9a 'A +i6@ o7l +i6o *7A +i6o -7 *41 +i6o *70 +i6o +7 +i6' o6. K +i6o *61 +i6o *54 +i6o *52 +i6) o5( +i6_ o4x +$i .6 o42 +i6o *41 -7 +i6* o37 +i6. o2x +i6- o2n +[ i6- o1b +i6/ o0V +i6/ o0B +i6< o0> +i6- $o +i6o +i6n x93 +i6N ^u r +i6N u +i6n p1 'B +i6n o8+ +i6n o3v +i6n o2y +i6N E +i6N C ] +i6N ] C +i6n 'B +i6n *86 -0 +i6n +7 +i6n -0 *86 +i6m Y3 +i6m x92 +i6M T1 +i6M p3 T7 +i6m o3N +i6M i1M +i6m i0( +i6M ^D +i6M ,7 +i6m *53 +i6m $+ +i6m { +i6m [ +i6l sln *15 +i6# l o5J +i6L o4a +i6= l i2n +i6l i2g +i6l ^D +i6L ,5 +i6l +4 +i6l *31 +i6l *23 *36 +i6l *15 sln +i6l ] +i6+ l $$ +i6+ $$ l +i6k Y2 +i6k x05 +i6k x02 +i6k t +i6' K o6. +i6k o5l +i6k o5. +i6k o4M +i6k l -7 +i6k $L +i6k k +i6k i7o $+ +i6k $+ i7o +i6k D1 +i6& K c +i6k '9 +i6K ,7 y1 +i6k -7 l +} i6k ,1 +i6k *02 +i6- k +i6j oA9 +i6j o5X +i6j o5R +i6J o2T +i6J L7 +i6j { $g +i6j 'B +i6j *A6 oAA +i6j *13 +i6+ ^j +^@ i6j +i6i Z3 +i6i x92 +i6i T1 +i6i sbl +i6i s6e +i6i $o +i6i i5C +i6i i5& +i6i i2. +i6i i0s +i6i $g +i6i d o7; +i6i DB +i6i ^c +i6I ^B E +i6. iB- +i6 iB +i6I .8 +i6i *71 +i6I ,7 +i6` i7` +i6, i6/ +i6= i6& +i6 i5u +i6_ i4s +i6/ i4l ] +i6/ ] i4l +i6- i42 +i6 i3d +i6 i3 +i6= i2n l +i6* i1i +i6@ i0c +i6 i0_ +i6I +i6h x93 +i6h L7 +i6h D3 +i6h .0 +$! i6H +i6h [ +i6g x12 +i6g x04 +i6g t +8 +i6g ^p +i6g o4o +i6g ^H +i6g $G +i6g D1 +i6g +8 t +i6G *73 p1 +i6G *60 +i6g ] +$@ i6g +i6g +i6f x75 +i6f k *23 +i6F ^d +i6f *34 +i6f *23 k +i6@ ^f +] i6f +i6e x41 +i6E L7 c +i6e $L +i6E i3c +i6E c L7 +i6e C +i6e *75 +i6e .5 +i6e *25 +i6& E +{ i6e +i6d ssW -6 +i6d sdv +i6d o7a +i6d [ o54 +i6D i84 +i6D i3D l +i6d i2D +i6D C +i6d -6 ssW +i6@ D3 +i6d *23 +i6d *10 +i6% D0 +i6D { +[ i6D +i6d $- +] i6d +i6c Z3 *54 +i6c Z2 +i6, c Y1 +i6c ^t +i6c r +i6c o8i +i6c o8@ +i6C L7 +i6& c K +i6C i7f +0 +i6c D1 +i6_ c 'B +i6 C -8 +i6c *79 +i6c *54 Z3 +i6- c +5 +i6c $4 +i6c +1 +i6C +0 i7f +i6c +0 +i6_ $C +i6c ] +i6@ $c +i6b $z +i6b xA4 +i6b x42 o0W +i6b o7h +i6B o3A +i6b o0W x42 +i6B c $7 +i6_ 'B c +i6b *95 +i6b *86 +i6B $7 c +i6b *72 +i6b *70 [ +i6b *69 +i6B ,5 +i6b +5 +i6b ^3 } +i6- 'B +i6_ 'B ^( +i6_ 'B +i6_ -B +$# i6b +$. i6b +i6a Z2 +i6a y2 +i6a x03 +i6a $x +i6a sdS +i6a s4s +i6a ^S +i6, 'A o9a +i6A o5T +i6a o3i +i6a ^M +i6A i6F +i6A i6a +i6a i2) .2 +i6a i0r +i6a c .7 +i6a .8 +i6a .7 c +i6A ,7 +i6a *31 ^b +i6, -A +i6_ $a +i69 l d +i69 i40 +i69 d l +i69 D8 +i69 D1 +i69 ^d +i69 .5 K +i69 *41 +i69 *37 +i69 $! +i6$ '9 +i6/ $9 +i6, '9 +i6= -9 +] i69 +i68 Y5 t +i68 x24 +i68 t Y5 +i68 s8 sj2 +i68 s8 +i68 o2I +i68 o1o +i68 $O +i68 D9 x73 +i68 D9 +i68 D3 +i6 -8 C +$i *68 c +i6. *86 +i6- *86 +i6| $8 ,6 +i68 ,5 y5 +i68 *42 +i68 +4 +i68 [ *31 +i6@ *82 *73 +i6@ +8 +i6! +8 +i6, +8 +i6 +8 +] i68 +i67 z1 -0 +i67 Y3 c +i67 x21 +i67 u $7 +i67 o58 +i67 l K +i67 K l +i67 c Y3 +i67 *87 $1 +i6- *78 +i67 $7 u +i67 +7 +i67 *69 +6 +i67 *57 +i67 .4 +i6@ *73 *82 +i67 +2 +i67 $1 *87 +i6& -7 +i6. .7 +i6 $. -7 +i6 -7 $. +$) i67 +$. i66 Z2 +i66 x41 $o +i66 x01 +i66 u p1 +i66 t .9 +i66 s3B +i66 $s +i66 p1 u +i66 $o x41 +i66 o51 +i66 ^A +i66 .9 t +i6| ,6 $8 +i66 ,7 +i6@ *64 Y2 +i66 ,1 +i66 $$ +i6_ ^6 +i65 Y2 K +i65 o1j +3 +i65 o0n +i65 K c +i65 i8X +i65 i5x x03 +i65 i5o +i65 i2j +i65 $h +i65 D1 +i65 c K +i6- +5 c +i6 *59 +i65 +8 .5 +i65 *78 +i65 -7 +i65 .5 +8 +i65 $5 +i6, *54 x93 +i65 $4 +i65 .4 +i6 *54 +i65 +3 o1j +i6. *53 -5 +i65 $% +i65 ] +i6+ ^5 +i6* +5 +i6, +5 +i6 ,5 +] i65 +i65 +i64 Z3 c +i64 Y4 +i64 Y2 i7a +i64 Y2 +i6$ ^4 x43 +i64 x13 d +] i64 ssf +i64 p1 +i64 o7S +i64 o56 +i64 o5- +i64 i7a Y2 +i64 D4 .3 +i64 c Z3 +i64 $8 +] i64 *76 +i6- *46 +i64 +5 +i64 $4 +i64 *13 +i6 *41 +i6# $4 +i6$ +4 +i6@ +4 +$@ i64 +^@ i63 z5 +i63 Y4 +i63 Y3 +i63 Y2 Y4 +i63 ^s z2 +i63 R5 +i63 i7@ +i63 i3] x32 +i63 *85 x04 +i63 ^6 +i6 *35 +i63 *32 +i6. *32 +i6/ *30 +i6/ -3 +i6_ ,3 +i62 x92 +i62 o7s +i62 k +i62 i98 +i62 d Y2 +i62 D2 +i62 *89 +i62 +7 +i62 *63 +i62 *12 +i62 .1 +i62 } +i6. -2 +i6` -2 +$! i62 +[ i62 +i61 ^u +i61 RB +i61 o51 +i61 o4y +i61 ^k ^h +i61 ^K +i61 i33 +i61 i3/ +i61 i11 +i61 $9 *67 +i61 ,7 +i61 *67 $9 +i61 *40 p3 +i61 +4 +i61 +3 +i61 *25 +i61 *24 +i6! *12 +i6- *12 +i6@ ^1 +$/ i61 +] i61 +^/ i6@ -1 +i60 Z1 -3 +i60 Y4 +i60 Y3 o3g +i60 x02 +i60 $, p3 +i60 o3g Y3 +^i *60 *71 +i60 .7 +i60 -3 Z1 +i60 +3 ] +i60 ] +3 +i6 *03 +i6. *02 +] i6. *02 +i60 $* +i6@ -0 +i6/ +0 +i6- -0 +$i *60 +^I $6 +i6% { +i6# ^# +i6& $$ +i6@ $$ +i6@ $! +i6) +i6, $/ +i6= +i6^ +$i +6 +$+ i6 +$% i6, +$* i6. +$$ i6& +$_ i6- +[ i6, +^, i6, +i5z Z1 +i5z y2 x43 +i5z x72 +i5z ^w +i5z p1 +i5z o4J +i5z i4o +i5Z E *85 +i5Z c +i5z $A +i5Z *85 E +i5z +8 +i5z *63 +i5; Z2 +i5z $2 +i5 Z1 D2 +i5* Z1 +$i ,5 Z1 +i5@ z1 +i5y $z +i5y x91 c +i5y $x +i5y $p +i5y o0r +i5y K +i5y i4p +i5y i3r +i5y i0a +i5y $i +i5y D2 +i5y c x91 +i5y C +i5@ y5 t +i5` y5 D5 +i5_ Y5 +i5. y5 +i5, y5 +i5 y5 ] +i5 ] y5 +i5y *47 +i5. Y3 +i5/ Y3 +i5- Y3 +i5. Y2 +i5- Y2 +i5y ^2 +i5y $# +$@ i5y +} i5y +i5x x17 E +i5x $W +i5x ^w +i5x $N +i5x $n +i5X i6A +i5x i3t +i5x i1j +i5x E x17 +i5X d ] +i5 xA2 +i5# x81 +i5- x72 i34 +i5x ,6 +i5[ x56 T0 +i5' x41 o5V +i5@ x32 +i5@ x31 *23 +i5- x31 +i5< x26 y2 +i5x *23 +i5@ x13 k +i5- x02 -6 +i5 x01 +i5x ] +i5x ^* +i5x +i5w Z1 *03 +i5w ^z +i5w x71 *06 +i5w x02 +i5W ^W +i5w r +i5w o0r +i5w i16 +i5W $F +i5w +2 +i5w *06 x71 +i5w *03 Z1 +i5w } +$@ i5w +i5v y5 +i5v x83 +i5V T6 +i5v o3_ *36 +i5v o0x +i5V i5V E +i5v D0 +i5v $b +i5v ^5 +i5v +4 +i5v $2 +i5v $@ +$. i5v +i5u y2 +i5U x63 E +$@ i5u x45 +i5u sdg +i5U o7^ +i5u o4s +i5u ^h +i5U E x63 +i5u c *35 +i5U C +i5u ,9 +i5u $6 +i5u *51 +i5u *35 c +i5u *35 +i5u -0 +^i ^5 $u +i5@ t y5 +i5t Y1 $2 +i5t x72 +i5t seu +i5t R4 +i5$ t p1 +i5T o4E +i5T $n +i5t k +i5t i78 +i5t i5J -1 +i5t i0t +i5_ T9 +i5t ^7 +i5_ T6 +i5 T6 +i5t +6 +i5% T4 +i5t *36 +i5T ^2 x34 +i5t -1 i5J +i5[ T0 x56 +i5@ T0 +i5. t +$/ i5t +$, i5t +[ i5t +i5t +i5s Y3 +i5s Y2 +i5s T0 +i5s sea +i5s o76 +i5s l *60 +i5s L4 +i5s i9s +i5s i1e +i5s E ^5 +i5S D8 ,4 +i5s 'B +i5 s97 +i5_ s8x +i5s ^8 +i5( s7) +i5s *60 l +i5s ,6 +i5s -6 +i5s *53 +i5S ,4 D8 +[ i5s .1 +i5$ ^s +^( i5s +i5r Y3 u +i5R x39 *73 +i5r u Y3 +i5r srd +i5r r +i5R $m *46 +i5r i6p +i5r i5u +i5R D9 C +i5R C D9 +i5r *A5 +i5r +A +i5R *46 $m +i5r +4 +i5@ R3 +i5r *10 z1 +i5R $$ +i5R ] +i5% ] $R +$! i5R +i5r $, +i5r ] +i5q Z2 +i5q ^z +i5q x73 +i5q $t +i5q s1r +i5q $Q +i5q o3w +i5q i2y +i5q -6 +i5q *16 +i5q [ +i5q ^! +i5- $q +$* i5q +$@ i5q +] i5q +i5P y4 u +i5P u y4 +i5p $S +i5p $p +i5p o6O +i5p o4i +i5p K *74 +i5P K -1 +i5p $c *43 +i5p *70 +i5p ,7 +i5p *43 $c +i5- p3 T6 +i5$ p1 t +i5P -1 K +i5o Z2 -4 +i5o Z1 *02 +i5o Z1 +i5O y5 +i5o x92 +i5o x23 $8 +i5o t +i5O $s +i5o p1 +i5O o0y +i5o ^j +i5o i6$ x63 +i5o i2* x05 +i5o $d +i5o C +i5_ o9m +i5o $8 x23 +i5o -7 p3 +i5( o6) +i5@ [ o5m +i5o *58 +i5o -4 Z2 +i5+ o4s i3f +i5o -4 +i5* o21 +i5o *15 +i5o *02 Z1 +i5o $? +$- i5o +^# i5o +i5n Y4 x87 +i5n x92 'B +i5n x03 +i5n $r +i5n o7c +i5n o1r +i5n o0< +i5N K +i5n ^h +i5n C +i5N $1 +i5n $0 +i5n $_ +i5M y5 +i5m Y1 D1 +i5m x03 +i5m ^v +i5m o6c +i5m o4n +i5M o1b E +i5m ^m +i5m i4h +i5m i2u +i5M ^F +i5M E o1b +i5M D3 +i5m D1 Y1 +i5m $c +i5M $9 +i5M -9 +i5m -4 r +i5_ $m +$_ i5m +i5l Z2 +i5l Y1 E +i5l x72 +i5l x63 E +i5l $w +i5L u +i5l $s +i5l $Q +i5L L2 +i5L i6P +i5L i3H +i5L i3A +i5l i1M +i5L i11 ,6 +i5l E Y1 +i5l E x63 +i5l E +i5l -8 +i5l +4 D0 +i5 L4 +i5L +3 +i5l $/ +] i5l +i5k } $z +i5K Y5 u +i5k x81 +i5k x72 +i5k x21 +i5k ^v +i5K u Y5 +i5K t *03 +i5K sn# l +i5K r +i5K o7s +i5K o67 +i5K l sn# +i5k i4t +i5k i3i +i5K E +i5k $e +i5k ,4 D1 +i5k +4 +i5k .4 +i5k *30 x25 +i5K *03 t +i5& K ] +i5- K ] +i5K +i5k { +i5@ k +$* i5k +i5j z2 +i5j smd +i5j s1m ] +i5j ] s1m +i5j o56 +i5j k o0w +i5J i6D +i5j f x6A +i5j ^D x75 +i5j D2 ] +i5j ] D2 +i5j $A +i5J -8 +i5j -7 +i5j *64 +i5j .4 +i5j *01 +i5, ^j +$? i5j +i5i Y4 +i5i y3 +i5i x63 +i5I x32 C +} i5i x32 +i5i x12 +i5i $W +i5I o6n +i5I l $8 +i5I $J +i5i i6n +i5i E +i5i ^d +i5I C x32 +i5i ^B +i5 i9$ x85 +i5! i9$ K +i5I $8 l +i5i } *87 +i5_ i7f +i5@ i72 +i5' i7 +i5@ i6K +i5= i6h +i5* i59 +i5< i58 x21 +i5i $5 +i5@ i2h +i5* i20 +i5. i1, +i5# i0A +i5i +0 +i5# i0@ +i5? i0* +i5I +i5i $% +i5, ^i +$/ i5i +i5h ^z +i5h t sMC +i5h sdg +i5h p1 +i5h o6b +i5h i5= +i5h i2b +i5h i1y +i5h D8 +i5H C +i5h $9 +i5h .9 +i5H .4 +i5< ^h +$! i5h +^$ i5h +i5g Z1 +i5g xB1 +i5g x92 +i5g x73 +i5g $s +i5g o68 +i5g o2m +i5G o1k +i5G i7% +i5g i6s +i5G i6D l +i5g D8 *14 +i5g $. *86 +i5G ,6 +i5g *50 +i5g ^5 +i5g .4 +i5g *31 +i5g *14 D8 +i5G -1 -1 +i5f z2 +i5F y5 +i5f y1 +i5f $y +i5f x03 +i5f ^x +i5f r +i5f o8E +i5f o7q +i5f o3s +i5f o0q +i5f i5s +i5F [ i4G +i5F $f -4 +i5F $E +i5f DA +i5f 'B +i5F +9 ^W +i5f $? -7 +i5f -7 $? +i5F ^5 +i5F -4 $f +i5F .4 +i5f -0 +i5f ] +$@ i5f +[ i5f +i5e Y3 +i5e x91 +i5e x85 +i5e x31 +i5e u +i5e o4h +i5e $o +i5E k *47 +i5e i7R +i5e i1E +i5e d +i5E c +6 +i5e $C +[ i5e C +i5e c +i5E +6 c +i5e -6 +i5E *47 k +i5E $} +i5$ ^E +i5- E +i5e $! +$% i5e +i5D Y2 +i5D ^U l +i5D o37 +i5D i5J +i5d i1v +i5D E -6 +i5d ^D +i5d ^c +i5% DA +i5? D8 +i5D ^6 o43 +i5D -6 E +i5d *62 +i5d *50 +i5% D4 T5 +i5, D4 ,3 +i5- D3 +i5 D2 Z1 +i5- D2 +i5C Z1 o79 +i5C y5 +i5c $y +i5c x13 p3 +i5c sus +i5c p2 D1 +i5C o79 Z1 +i5C o6H +i5c o4n +i5c $m +i5C i7i +i5C i3c +i5c $H +i5c ^H +i5C C ^9 +i5C ^9 C +i5C *69 x14 +i5c $6 +i5c -2 [ +i5c *19 x64 +i5c *14 +i5c ,1 +i5@ C +i5C +i5. ^c +i5B Z5 +i5B Z1 i5V +i5b ^t +i5b s6e +i5B o7! +i5B i6T +i5B i5V Z1 +i5b C +i5B $7 +i5b +4 ^k +i5b .4 +i5B $* +i5. +B +i5 +B +$. i5b +] i5a Y4 +i5a u { +i5a { u +i5a t ] +i5a ] t +i5a s1# +i5a oAt +i5A o6G +i5a o6= +i5A o49 +i5a K o7k +[ i5a K +i5a i6y +i5a i3G +i5a ^f +i5a C +i5a } ^B +i5a 'B +i5A $a +i5a -6 +i5a *49 x91 +i5a -1 +i5% ^A +i5A +i5a $+ +i5a $# +i5a $- +i59 Y5 +i59 x21 +i59 x13 $j +i59 x05 $+ +i59 $+ x05 +i59 k +i59 $j x13 +i59 i63 +i59 i60 +i59 i4[ +i59 D9 [ +[ i59 +i59 +i58 z1 +i58 i74 +i58 i38 +i58 i2k +3 +i58 'A +i58 $2 +i58 $! +i58 $- +i58 ] +i5& +8 +i5- '8 +i5 ,8 +i57 Z2 *84 +i57 p5 -6 +i57 i5b +i57 i20 *52 +i57 DA +i5_ *79 +i57 $7 +i57 -7 +i57 *62 +i5% *76 +i57 +4 +i57 *21 +i57 ^2 +i57 .1 +i57 $@ +i57 $_ +$. i57 +i56 x23 +i56 x13 +i56 sd9 +i56 $q +i56 ^q +i56 $O +i56 k C +i56 k +4 +i56 i4E +i56 $h +i5_ -6 ^e +i5_ *68 +i56 *79 +i5@ *67 +i56 *61 +i56 +6 +i56 +4 k +i56 .4 +i56 $. +i56 [ +i5+ +6 +i5+ ,6 +i5@ $6 +^i *56 +^$ i56 +^@ i56 +i55 Z1 c +i55 y1 *73 +i55 xB2 +i55 $M +i55 i50 +i55 DA +i55 D0 x71 +i55 c Z1 +i5! *58 +i55 +2 +i55 -2 +i55 -1 +i55 [ +i5& $5 +$* i55 +$/ i55 +} i55 +[ i55 +^i *54 Z2 +i54 Z1 t +i54 x72 +i54 x62 C +i54 t Z1 +i54 $S +i54 R2 +i54 o67 +i54 C x62 +i54 '9 +i5- *48 +i54 *79 *76 +i54 *76 +i5; $4 *68 +i54 *13 +i54 $+ +i54 [ +i5+ .4 +i5@ -4 +} i5! .4 +^# i54 +i54 +{ i53 Z1 +i53 Y4 l +i53 Y2 +i53 $s +i53 l Y4 +i53 i5m +i53 ^E +i53 $e +i5, ,3 D4 +i53 D0 ,6 +i53 ,9 x63 +i53 *96 +i53 *71 +i53 *60 +i53 *31 +i53 *20 +i53 $* +i53 $@ +^# i53 +i52 T2 +i52 o1l +i52 o0! +i52 i41 +i52 $b +i52 $A +i52 $9 +i52 ^4 +i52 .0 +i52 { +i52 ^@ +i5+ $2 +i5* $2 +i5@ .2 +i5= -2 +{ i52 +i51 Y5 +$i *51 y3 +i51 Y1 *7A +i51 x94 +i51 x65 c +$i *51 x62 +i51 t +i51 r +i51 o2y +i51 ] ^k +i51 ^k ] +i51 i9f x42 +i51 i67 E +i51 i3- +i51 i0S +i51 E i67 +i51 D3 +i51 c x65 +i51 $a +i51 ,6 *60 +i51 ,6 .3 +i51 +4 +i51 .3 ,6 +i51 $3 +i51 $0 +i5@ .1 +$* i51 +[ i51 +^@ i51 +i50 Y5 +i50 Y1 +i50 T1 +i50 o8_ +i50 o68 +i50 o0@ +i50 i76 +i50 i6@ +i50 E +i50 +8 +i50 -6 +i50 *31 +i50 *13 +i5@ +0 +i5/ -0 +^@ i50 +i5+ $+ +i5& [ +i5& +i5* ^# +i5) ^( +i5' ] +i5. $$ +i5? $? +i5! +i5; ] +i5, $/ +i5, $, +i5- ] +i5_ ] +i5| ] ] +i5= +$- i5+ +} i5* +} i5. +{ { i5- +] i5 +[ i5@ +[ i5 +^i .5 +^i ^5 +^$ i5$ +^/ i5 +^, i5- +i4z x64 +i4z L4 +i4Z i7t +i4z i1l +i4z i0s +i4z i0l +i4Z $a +i4Z *78 +{ i4z -7 +i4z *46 +i4z *36 +i4Z .3 +i4z $3 +i4z *21 +i4, $| Z2 +i4z +2 +i4. z2 +i4_ Z1 R3 +i4Z +i4z $@ +i4z [ +i4; ^z +i4y $Z +i4y Y3 +i4y Y2 x82 +i4y $Y +i4y x82 Y2 +i4y x72 +i4Y x53 s70 +i4y x03 +i4Y x02 d +i4Y s70 x53 +i4y i5b +i4Y E +i4y ^c +i4y ^a +i4y [ *65 +i4. Y5 +i4 Y5 +i4y .5 +i4y ,5 +i4@ y5 +i4. Y4 +i4- Y3 +i4y *20 +i4. Y2 +i4_ Y2 +i4= Y2 +i4- y2 +i4_ y2 +$$ i4@ y2 +i4@ Y1 -7 +i4. y1 *43 +i4y *14 +i4y *01 ^t +i4y $. +i4y ^, +i4+ $y +i4y +i4x z2 u +i4x Z1 +i4x ^x +i4x u z2 +i4x r +i4X o7- x34 +i4x o6k +i4x o65 +i4X o5n +i4x ^n +i4x ^l +i4x ^K +i4x ^c +i4x $9 Z1 +i4x *56 +i4. x53 +i4. x52 +i4x .5 +i4] x42 ^D +i4x ^1 +i4X } } +i4x $. +i4x [ +$@ i4x +] i4x +[ i4x +i4w y5 +i4w y3 +i4W Y1 +i4W u ] +i4W ] u +i4w r +i4w o6z +i4w o6n +i4W o1u +i4w $m +i4w $c +i4w *64 +i4w .5 +i4w +3 +i4w *28 +i4w *17 +{ i4. ^W +i4v x75 +i4V ^S +i4v i6k +i4v *63 +i4V ,5 +i4u y5 [ +i4u y1 +i4U u i2P +i4u s5y +i4u p2 +i4U ^o .5 +i4u o3G +i4u o2w +i4U o2D +i4u o1h +i4u i6q +i4U i2P u +i4u i2g +i4u D7 +i4u *82 *04 +i4u *56 *25 +i4u -2 +i4u *04 *82 +i4u $% +i4T $x +i4T sjT +i4t $s +i4t o6G +A +i4t o3, +i4t L8 +i4t i8d +i4t { i2a +i4t i0H +i4t +A o6G +i4 TA +i4t '9 +i4T .7 D1 +i4T $7 +i4 t *67 +i4t ,6 +i4t .3 +i4t *20 +i4- T1 -5 +i4- t +i4_ ^t +i4s Z1 c +i4s y5 +i4s x52 +i4/ ssx +i4S R3 +i4s o5u +i4s o5h +i4s o1H o0M +i4S o0Z +i4s o0M o1H +i4s o0m +i4s ^M +i4S L5 c +i4s i5- +i4S i4v x02 +{ i4S $F +i4s d c +i4s c Z1 +i4. s.B ^O +i4- s5+ +i4s *23 +i4S *16 ^S +i4s *16 +[ i4s *16 +i4s [ +} i4s +] i4s +i4R x31 o23 +i4r x03 +i4R ^s +i4@ r R2 +i4R [ r +i4r $p +i4R o23 x31 +i4R ^N +i4r l i8` +i4R $K } +i4r i8` l +i4r ^i +i4r ^f +i4R E ^r +i4r E +i4r '9 *21 +i4r *80 +i4_ R3 Z1 +i4; R3 +[ i4r ,3 +i4r *21 '9 +i4- ^r +i4q y2 *36 +i4q Y1 +i4Q x38 +i4q ^r +i4q i5m +i4q i1q +i4q i1a +i4q i0E +i4q d +i4Q ,5 +i4P x64 se$ +i4p ^t +i4P se$ x64 +i4P $p +i4p o3c +i4p L0 +i4p iAP +i4p i6t +i4p ^D +i4p *83 +i4p *40 +i4p ^3 +i4p *24 +i4p $@ +i4p ] +i4. ^O s.B +i4o o5k +i4o o0t +i4o o0f +i4o $o +i4o i5. +i4o i4B C +i4o C i4B +{ i4- oA1 +i4o $A +i4 o9m +i4+ o8y +i4! o6% +i4 o57 x31 +i4* o51 +i4o +5 +i4o .5 +i4^ o4z $. +i4^ $. o4z +i4@ { o48 +i4o *40 +i4# o3E +i4o *31 +i4# o3* $# +i4# $# o3* +i4$ o1h +i4. o1g +} i4O +i4O +i4. ^o +i4_ $o +i4 $o +i4n sl +i4n R0 +i4n o3H +i4n o0l +i4N i5Z +i4N $e +i4n $9 +i4n +7 +i4n *31 +i4n -0 +i4+ $n +^@ i4n +i4m ^U +i4M s0X l +i4m ^S +i4m ^q +i4m o5i i7H +i4M [ ^N +i4m $M +i4M ^L l +i4M K c +i4m i7H o5i +i4m i2l +i4m ^i +i4m ^h +i4M ^F +i4M D1 } +i4M c K +i4m $A +i4m ^A +i4m ^9 +i4M $7 *63 +i4M *63 $7 +i4M *58 +i4m -5 *35 +i4m *12 i2t +i4. ^M +i4m $! +i4l xA1 +i4L T4 R2 +i4L R2 T4 +i4L ^Q +$! i4L l +i4L i72 +i4l i6v +i4L i6k +i4l i5r +i4l i3o +i4l i3d +i4l i2p +i4l E p2 +i4l ^E +i4l ^e +i4L $d +i4L .7 +i4| L4 +i4l *02 +} i4l +{ i4l +i4K Z1 $e +i4K y2 C +i4K x12 u +i4K u x12 +$+ i4k t +i4k o2m +i4k o0j +i4k ^k x23 +i4K $k +i4k i69 +i4k i0w +$$ i4k E +i4K C y2 +i4K C +i4k *57 +i4k +5 +i4k .5 +i4k +4 ^X +i4k *14 { +i4@ K +i4. ^K +i4_ K +[ i4. K +i4k $* +i4k $` +i4- k +$/ i4k +[ i4k +i4j ^z +i4j u +i4j o5k +i4J L5 +i4j ^k +i4j DA +i4j ^D +i4j +6 i1e +i4j *61 +i4j *54 $1 +i4j ^2 p5 +i4j .2 +i4j $1 *54 +i4j *04 +i4i y2 +i4i x81 +i4i T1 +i4I R5 +i4i r +i4i $p +i4i o8e +i4i o6z +i4i o3V +i4i ^O +i4i k +i4i i6h +i4I ^i +i4_ i89 +i4i $8 +i4i '8 +i4- i79 +i4* i7- +i4 i6 +i4 i5i *32 +i4. i5f +i4_ i5c +i4+ i5* +i4) i4( +i4. i4/ +i4+ i3m +i4i *35 +i4, i32 +i4. i2r +i4= i2a +i4i -2 +i4@ i2@ +i4, i2, +i4$ i11 x23 +i4+ i1+ +i4i +0 +i4i $. +$# i4i +^@ i4i +i4h x23 t +i4H x07 +i4h t x23 +i4h o87 +i4h o1z +i4h K +i4H i4T c +i4H i2c c +i4H D0 i5t +i4H c i2c +i4h c -9 +i4H c +i4h $A +4 +i4h -9 c +i4h -4 ^H +i4h +4 $A +i4h *04 +i4% ^H +i4h $# [ +i4h $ +i4h [ $# +i4h ^$ +i4. $h +i4. ^h +i4- $h +i4 $h +i4g Z2 $% +i4g $z +i4g x64 +i4g ^q +i4g ^p +i4g o3j *04 +i4G i6o +i4G i5g +i4G i3& +i4g i2S +i4G $h +i4g $G +i4g $g +i4g ^f +$! i4g E +i4g ^c r +i4G c $a +i4g ^C +i4g $B +i4G $a c +i4g *04 o3j +i4g *03 +{ i4g +0 +$. i4G +$! i4g +i4f t i50 +i4f o4r ^O +i4f o2E +i4f i61 +0 +i4f i5p +i4f i50 t +i4f i4. +i4F i19 +i4F i13 +i4f $A l +i4f *A8 +i4f ^A +i4f *62 +i4f *18 +i4f *12 +i4f +0 i61 +$# i4F +i4F +i4f ] +i4e Z1 +i4e s2c r +i4e r s2c +i4e o2m +i4e i76 +i4e ^B +i4e *9A +i4e ,9 +i4e +0 +i4e -0 +i4% E +i4e $! +i4e ] +i4e [ +} i4e +^@ i4e +i4D ^Y -0 +i4d $[ o8K +i4D o5F +i4D o0H +i4d ^N +i4d k o0M +i4d k +i4d i2Z +i4d i2K +{ i4d D1 +i4/ D7 +i4d -7 +i4+ D0 +i4D +i4d [ +] i4d +i4c y5 +i4c [ y4 +i4c x61 +i4c x21 k +i4c $U +i4c ^T +i4C r +i4c o7_ +i4c ^m +i4c k x21 +[ i4C i65 +i4C i4J +i4@ ^c E +i4c $e +i4. C ,8 +i4@ c *64 +i4c *52 +i4c *15 +i4. ^C +i4B Z1 +i4b y4 *67 +i4b y4 +i4b o59 $B +i4B o0C *15 +i4b l +5 +i4B i9n +i4b D8 +i4b C +i4b $B o59 +i4B +A +i4B ^A +i4b +5 l +i4b +5 +5 +i4B *15 o0C +i4b $0 +i4B $! +i4B ] ] +i4b } +i4a ^Z +i4a y5 D5 +i4a Y1 $8 +i4a x71 k +i4a R5 Y5 +i4a $Q +i4a $q +i4a o8- +i4A o3P +i4a o3_ +i4a k x71 +i4A k +i4a i6m *41 +i4a i5t +i4a i52 +i4A i3T *20 +i4a i3r +i4a i2q +i4a i1t +i4a ^F +i4a +5 +i4a *41 i6m +i4a $4 +i4a *30 +i4a .3 +i4A *20 i3T +i4a *08 +i4A ^0 +i4, 'A +i4- +A +$. i4A +i4a $! +i4a ^( +i4< $a +$* i4a +$@ i4a +] i4a +i49 ^z +i49 y5 +i49 Y3 +i49 t i2C +i49 suw +i49 p3 $s +i49 ^b *14 +i49 ^6 +i49 ,4 i3h +i49 *23 +i49 $2 +i49 [ +i4* +9 +i4- ,9 +$! i49 +[ i49 +$_ i48 Y1 +i48 xA2 +i48 x91 +i48 $t +i48 i0A +i48 ^I +i48 DB p4 +i4. ,8 C +i48 *62 +i4@ *85 +i4. *85 +i48 *30 +i48 *10 +i48 .1 +i4- ,8 +{ i48 +i47 u .2 +i47 R3 +i47 R0 -5 +i47 o3z +i47 $m +i47 DA +i47 $D +i47 ^A +i47 *79 +i4@ *76 +i47 -5 R0 +^I *47 .4 +i47 ^4 +i47 .2 u +i4@ -7 +i4- $7 +i4= +7 +$- i47 +} i47 +i47 +i46 Z5 s03 +i46 s03 Z5 +i46 o89 +i46 o33 +i46 o0j +i46 i62 x12 +i46 i24 +i46 ^G +i46 ^F +i4 *67 t +i46 *61 +i4# *65 $! +i4# $! *65 +i4@ *64 c +i46 ^4 +i46 .3 +i46 ,1 *30 +i4, ,6 +i4- -6 +i4 $6 +i4= -6 +i4^ ,6 +i45 Y5 +] i45 Y5 +i45 y4 +i4- -5 T1 +i45 o8. +i45 i60 +i45 i52 +i45 ^a +i45 ,9 +i45 '8 .3 +i45 ] ^8 +i45 ^8 ] +i4& *58 +i45 ^7 +i4. *57 +i4 *57 +i45 ^6 +i45 .3 '8 +i45 +2 +i45 *12 +i4- *51 +i4+ +5 +i4& $5 +i4& ,5 +i4* ,5 +i4! } -5 +i4! -5 +i4= -5 +$; i45 +i44 Z1 +i44 x81 +i44 x02 +i44 T2 +i44 srg +i44 $q +i44 o8t +i44 o0O ^! +i44 ^o +i44 i6. +i44 i5q +i44 D9 +i44 D0 +i44 C $C +i44 $C C +i4! *49 +i44 '8 +i44 *75 +i44 *49 +i44 *30 +i4? +4 ,1 +i44 $( +i44 $/ +i4} +4 +i43 Z3 +i43 x12 +i43 $w +i43 slw +i43 s8w L8 +i43 ^q +i43 o74 K +i43 o63 +i43 L8 s8w +i43 ^l +i43 K +i43 ^J +i43 D7 +i43 ^@ D6 +i43 ^8 +i43 .3 +i4 *32 i5i +i43 } +i4* .3 +i4= $3 +{ i43 +i42 x91 +i42 x62 +i42 ^w +i42 ^u +i42 u +i42 sd* +i42 o1. +5 +i42 o1@ +i42 ^N +i42 i59 +i42 i4_ +i42 ^i +i42 f x38 +i42 d Y1 +i42 *72 +i42 +7 +i42 +5 o1. +i42 $3 +i42 ,2 *05 +i4* *21 y2 +i42 *05 ,2 +i42 ] +i4# [ .2 +i4* -2 +i4@ ,2 +i4. +2 +i4 -2 +i4= -2 +i41 y5 r +i41 Y2 +i41 T7 +i41 $S +i41 r y5 +i41 R9 +i41 l ^@ +i41 ^@ l +i41 ^j +i41 i6f +i41 i4A +i41 i23 +i41 i1, +i41 $F +i41 E +i41 DA +i41 +9 +i41 *82 +i4@ *18 +i4@ *16 +i41 ^5 +i41 *47 Y4 +i4? ,1 +4 +i41 ,3 +i4# *13 +i4# ,1 +i4. -1 +i4/ -1 +i4- -1 +$! i41 +$= i41 +i40 Z1 o8L +i40 TA +i40 $s +i40 ^s +i40 o9D +i40 $m +i40 $k +i40 $9 +4 +i40 *72 +i40 *67 +i40 $5 +i4- *05 +i40 +4 $9 +i40 -3 +i40 ^3 +i40 ^2 +i4_ *02 +i4# *01 +} i40 +i40 +i4% [ +i4# +i4& $! +i4$ [ +i4@ $! +i4. $, +i4? +i4, $. +i4- [ +i4- ^@ +i4_ $+ +i4< +$. i4, +$! i4. +$ i4 +} i4$ +] i4- +[ i4+ +[ i4_ +^@ i4# +^? i4! +i3z Z2 +i3z y4 x92 +i3z Y2 x43 +i3z x54 +i3z x52 +i3z x43 Y2 +i3z o5t +i3z o2i k +i3Z l D7 +i3z k o2i +i3z i70 +i3Z i6Q +i3z i60 +4 +i3Z D7 l +i3z ^c +i3z +4 i60 +i3* z3 -5 +i3z *30 +i3- Z2 +i3z *15 i5m +i3. Z1 +i3z $$ $$ +i3z ] +i3- $z +i3= $z +$. i3z +] i3z +i3y Z5 t +i3y Y3 +i3y x52 t +i3y $x +{ i3Y u +i3y t Z5 +i3y t x52 +i3Y o8! c +i3y i6i +i3y i4t +i3y D7 +i3Y c o8! +i3y ^c +i3y *81 ,7 +i3y ,7 *81 +i3. Y5 +i3y .5 +i3y $4 +i3@ y4 +i3 Y3 +i3* Y1 T0 +i3+ y1 +i3y *05 +i3y *01 y5 +i3x x42 o0h +i3x t .2 +i3x o0h x42 +i3x ^f +i3x { $e +i3x d +i3x C [ +i3_ xA1 +i3\ x71 sqg +i3_ x71 +i3x *64 +i3. x64 +i3- x61 +i3. x52 +i3= x43 +i3x .2 t +i3x -2 +i3x +1 +[ i3x +i3W x64 $N +i3w x64 +i3w ^t +i3W $N x64 +{ i3w $k +i3W $j K +i3w D6 +i3w ^d +i3w *76 +i3w -2 +i3w ^1 k +i3+ ^w +i3v x75 D6 +i3v x71 +i3v x54 +i3V x53 ^j +i3v x01 { +i3v ^v +i3V T4 +i3v t +i3v srb +i3v $s +i3v L3 +i3v i2n +i3V $g c +i3v d '9 +i3V c $g +i3V -9 x42 +i3v -7 x42 +i3v *70 +i3v *52 +i3v *51 +i3v *46 +i3v *37 +i3v *03 +i3v $. +i3_ $v +$! i3v +] i3v +i3u x12 +i3u T5 +i3u ssk +i3u ^s +i3u p1 +i3u ^M +i3u L3 +i3u i5F +i3U i39 +i3u $A +i3u *63 +i3u ,4 +i3u *25 +i3u ^@ +i3 u +i3t Y4 +i3T $X +i3t $v +i3t ^n +i3t $m +i3t L4 *50 +i3t i4u +i3t i0f +i3t $g +i3t ^g +i3t E } +i3t d +i3t C +i3t $b +i3t $A +i3t *50 L4 +i3t *50 +i3t -5 +i3# T4 +i3* T4 +i3! T4 +i3t *28 +i3t +2 +i3* T0 Y1 +i3$ $t +i3s y3 +i3s t .3 +i3s t +i3s sWm +i3s R8 C +i3s r +i3\ sqg x71 +i3s o77 *45 +i3s o3j *61 +i3S o24 +i3s o1j +i3s L4 +i3s i75 +i3s i5z +i3s i5@ +i3s i4w +i3s i4s +i3s i1s *04 +i3s i1d +i3S c ,4 +i3S C +i3s $a +i3s ^9 +i3s *86 ] +i3s ] *86 +i3s '8 *42 +i3s +8 +i3s ^7 +i3s *61 o3j +i3S ,4 c +i3s *45 o77 +i3s *42 '8 +i3s .3 t +i3S $$ .2 +i3S .2 $$ +i3S -2 +i3* s2* +i3S ^1 +i3s .1 +i3- s0+ +i3# s^ +i3@ $s +i3, ^s +$* i3s +$. i3s +i3r z2 +i3r Z1 o5x +i3r y2 *61 +i3r y2 +i3r y1 +i3r x42 +i3r R3 $- +i3r $- R3 +i3R $R +i3r o5x Z1 +i3r ^L l +i3r i4a +i3r $d x72 +i3r *48 +i3. $r +[ i3r +i3Q u +i3q ^q +i3q p5 i6_ +i3q $n *76 +i3q L2 +i3q ^l +i3q i6f +i3q i0x +i3q D6 x75 +i3q +4 +i3q [ +} i3q +i3p Z1 +i3P Y4 o8x +i3p x72 +i3p x51 +i3p ^u +i3p o5w '8 +i3p o4h +i3p k *65 +i3p i5h +i3P i3X +i3P i3A +i3p $a +i3p '8 o5w +i3p -8 +i3p *65 k +i3P +5 .3 +i3p *51 +i3P .3 +5 +i3p *35 +i3p .1 +i3p *02 +[ i3p +i3o Z2 +i3o y4 +i3o xA4 +i3O u +i3o t $% +i3o $% t +i3O $Q +i3o o1m +i3O o0m C +i3o K i3e +i3o i3e K +i3O D7 +i3O C o0m +i3. o8a o3u +i3_ o6g +i3, o6. +i3& o5e +i3, o54 +i3; o4i o3S +i3. o4d +i3 o4 +i3. o3u o8a +i3; o3S o4i +] i3$ o2@ +i3- o1y +i3@ o1s +i3o *16 +i3o *12 +i3! o1@ +i3. o0R +i3# o0$ +i3o $! +i3, $o +} [ i3o +{ i3o +^! i3o +i3n y3 +i3N Y2 .2 +i3n R9 +i3n p2 $3 +i3n o68 +i3n $o +i3N i3M +i3n i00 +i3N ^G +i3n ^G +i3N ^4 +i3N .2 Y2 +i3n +2 +i3n $1 +i3n $- +i3- ^n +$. i3n +i3m Z5 ,6 +i3M t T4 +i3M T4 t +i3m ^T +i3m o0C +i3M o0A +i3m L7 +i3m l +i3m i4w +i3m i4g +i3m i41 +i3m ] ^h +i3m ^h ] +i3m ,6 Z5 +i3m .4 +i3m +2 y1 +i3m .1 +i3= ^m +i3l Z3 .2 +i3l x51 +i3L x45 k +i3l x23 $, +i3l $, x23 +i3l u +i3L T4 +i3l p4 ^v +i3l o2e +i3l ^N +i3L k x45 +i3l i7t +i3l i6! +i3L i2S +$. i3L E +i3l ^c +i3l *75 +i3l *65 +i3l *51 +i3{ L3 +i3l .2 Z3 +i3l ^2 +i3l *15 +i3l *02 +i3l -0 +i3l $ +i3l { +i3l ] +i3@ $l +i3- ^l +i3k y5 +i3k Y3 x53 +i3k x53 Y3 +i3k u +i3k stc +i3k spM +i3k o6n +i3k o6g +i3k o6a +i3K i6B +i3k i4K +i3K E +i3K D7 -0 +i3k $6 +[ i3K *41 +i3k ^4 +i3k { *37 +i3K -0 D7 +i3& K +i3j y5 +i3J x42 +i3j u +i3j $q +i3j $L +i3J k +2 +i3j K +i3j $j +i3j i3s +i3j D6 +i3J ^D +i3j ^d +i3j *59 +i3j *58 +i3J +2 k +i3j *21 +i3j *04 +i3j -0 +i3. ^j +i3i x21 *31 +i3i x02 +i3i sr +i3i i3P +i3i i1s +i3i ^f +i3I C +i3i ^c +i3_ i8_ +i3I *74 -4 +i3. i7, +i3 i62 +i3- i5j +i3. i5. +i3" i4I +0 +i3 i46 +i3% i4^ +i3. i35 +i3- i3= +i3_ i25 +i3_ i1f +i3$ ^# i1c +i3I *16 *13 +i3i +1 +i3. i1. +i3_ i00 +i3i $/ +] i3i +i3h y5 -B +i3h y3 +i3h x81 +i3h x71 +i3h x02 +i3H o2D +i3h i4x +i3h i4s +i3h i0i *09 +i3h *89 +i3H $7 +i3h { +3 +i3h +2 +i3g y3 +9 +i3g x52 +i3G q +i3g o7x +i3g o2i +i3G o2G +i3g ^m +i3g K +i3g i6t +i3g i6p +i3G i4g +i3g i3u +i3g i2z +i3G c +i3g .7 +i3g $5 +i3g $4 +$$ i3g +{ i3g +i3F x62 .2 +i3F $W +i3F u o1F +i3f t +i3f $p +i3f o5& +i3f o4 x6B +i3f o4 +i3F o3d +i3F o1F u +i3F i7H +i3f i4q +i3F i4c +i3f i3l +i3f i3A +i3f $F +i3f D1 +i3f $d +i3f C +i3f *87 ^M +i3f *68 +i3F .2 x62 +i3f *16 +[ i3f -1 +i3f $/ +i3f ] +i3[ f +i3e Z2 +i3e { x43 +i3e T4 *12 +i3E E +i3E $e +i3e $2 +i3e -1 ^e +i3e *17 +i3e *12 T4 +i3e $? +i3e [ +i3e ^# +[ i3e $@ +[ $@ i3e +i3d y4 +i3d Y2 *20 +i3d Y1 +i3d x54 +i3! d x04 +i3d $v *15 +i3d o8. +i3d o5G +i3d o4C +i3D o2X +i3* $d K +i3d i3? +i3d i0C +i3d ^b +i3- DA *23 +i3@ D9 +i3d '8 +i3D +7 +i3d $7 +i3d *20 Y2 +i3D ^2 +i3d *15 $v +i3d *10 y4 +i3D +$* i3d +$! i3d +] i3d +i3c Y2 -5 +i3C T2 +i3c T0 K +i3C s8D +i3C L1 p3 +i3c K T0 +i3c k D6 +i3c i59 +i3c D6 k +i3c D0 +i3c *56 +i3c *46 +i3c *31 -0 +i3c -0 *31 +i3c *02 +i3b x54 +i3b x02 +i3b ^T +i3b s12 +i3b o2w +i3B L4 +i3b ^l +i3B k +i3b i7c +i3b ^h +i3b $F +i3b D5 +i3B ^A +i3b '8 +i3B *72 ^E +i3b *67 *25 +i3b *25 *67 +i3b +2 +i3B *03 +i3b $0 +[ i3b +i3a Z2 i3+ +i3a y4 +i3a ^x +i3a T6 +i3A T4 +i3a seH *78 +i3a sal +2 +i3a s7a +i3A p3 E +i3a ^o K +i3A o6x c +i3a o4a ,7 +i3A o1A +i3a K ^o +i3a k +i3a ^j +i3a i6s +i3a i5y +i3a i3+ Z2 +i3a i3R +i3a i2g +i3a i23 +i3a DA +i3A $d +i3A c o6x +i3a $8 +i3a ,7 o4a +i3a *78 seH +i3a .6 p4 +i3a *68 +[ i3a *63 +i3a $5 +i3 .A *43 +i3a *37 +i3A *31 +i3a *30 +i3a +2 sal +i3a +2 +i3a -2 +i3a *04 +i3A [ *02 +i3a $! +i3a } +i3a { +i3a [ +i3* ] ^a +i3* ^a ] +[ i3a +i39 x12 $6 +i39 T6 +i39 o9. +i39 o2R +i39 o0g +i39 i57 +i39 ^h +i39 D7 +i39 c ^! +i39 ^9 { +i39 $6 x12 +i39 *47 +i39 *41 +i39 *35 +i39 *25 +i39 } +i39 ^? +i3@ -9 +i3. +9 +i38 o7* *04 +i38 ^n +i38 i7d +i38 i6n +i38 '9 +i38 *65 +i38 +5 +i38 *04 o7* +i38 { [ +i3# '8 +i3. $8 } +i3. ^8 +i3/ -8 +i3? $8 ^, +i3? ^, $8 +i3 $8 +i3 .8 +] i38 +i38 +i37 o1j +i37 o0w +i37 i0j +i3@ *79 +i37 ,7 +i3. *76 +i3- *75 +i37 *20 +i37 -2 +i37 *12 p3 +i37 .1 +i37 } +i3- '7 +i36 z2 +i36 x73 *30 +i3- ^6 x21 +i36 T0 y5 +i36 ^S +$) i36 l +i36 K +i36 '8 *02 +i36 $7 +i36 '7 +i36 ,6 +4 +i36 +4 ,6 +i3- *64 +i36 *30 x73 +i36 *02 '8 +i36 ] ] +i3@ $6 +$- i36 +] i36 ] +] ] i36 +i35 R1 +i35 ^p D9 +i35 o4B +i35 i3% ] +i35 ] i3% +i35 '8 +i3; *56 +i35 ^5 +i35 *46 +i35 .2 +i35 [ { +i3, +5 +i3- +5 +{ $i *35 +i34 ^S ^G +i34 s0= +i34 r +i34 p2 x04 +i34 p1 +i34 o4k +i34 $M +i34 i5Y x45 +i34 i4@ +i34 i16 +i34 D7 *64 +i34 $A +i34 *64 D7 +i34 *61 +i34 *50 +i3 *43 .A +i34 *23 +i34 $1 +i3. *40 -0 +i3% ^4 +i3# ,4 +i3* $4 +i3, +4 +i3, ,4 +i3= +4 +{ i34 +] i34 +i33 x45 +i33 i58 +i33 { f +i3. *39 +i33 *8A +i3@ *38 +i3 *36 +i3 *35 +i33 +3 +i33 -2 +i33 $/ +i33 [ +i3@ $3 +i32 x92 +i32 o49 +i32 i47 +i32 i45 +i32 D7 ,4 +i32 *57 +i32 .5 +i3 *25 +i32 ,4 D7 +i32 *45 +i32 [ *43 +i3- *23 DA +i32 *3A +i32 -2 +i32 *10 +i32 $& +i32 $? +i32 ^* +i3* -2 +i3. .2 +i3. -2 +i3, ^2 +i3 $2 +i3= -2 +} i32 +i31 x51 +i31 srn +i31 ] p2 +i31 o23 +i31 } o1l +i31 ^@ o0C +i31 k .3 +i31 i56 +i31 i33 +i31 c +i31 *58 +i31 -5 +i31 .3 k +i31 *27 +i31 ,2 +i3+ *12 +i3@ *12 +i31 ^0 ^2 +} i31 +0 +i3& +1 +i3@ ^1 +i3. -1 +[ i3= .1 +i30 Z2 +i30 y5 +i30 Y4 x86 +i30 i4w +i3" +0 i4I +i30 ^F +i30 -8 +i30 ^7 +i30 ^6 +i30 -4 +i3! *03 +i3. ^0 +$? i30 +i3% $$ +i3. $? +i3. +i3/ ^/ +i3? $? +i3? +i3! [ +i3, +i3_ } +i3> +i3^ +i3` +$# i3* +$* i3$ +$* i3/ +$ i3 +$^ i3$ +} i3 $ +] i3? +[ i3; +^@ i3@ +^, i3. +i2Z y5 l +i2Z t i5d +i2z o7b +i2z o5d '8 +i2z o1A +i2z ^n +i2Z l y5 +i2z k +i2z i1c +i2z ^f +i2z D7 +i2z '8 o5d +i2z '8 +i2z *34 +i2. Z2 +i2_ Z2 +i2_ Z1 +6 +i2z .1 +i2z { +$! i2z +i2y Z1 *12 +i2y x41 p4 +i2Y T4 ] +i2Y ] T4 +i2y r D3 +i2y r +i2y p1 +i2y o5m +i2y o4y +i2y o3k +i2y o3- +i2y ^m +i2y k $8 +i2y D9 +[ i2y c +i2y $8 k +i2y *56 +i2+ Y5 *35 +i2y ,5 +i2, y4 +i2* Y3 $* +i2* $* Y3 +i2, y3 +i2_ y2 $3 +i2+ y2 +i2y *16 +i2y *12 Z1 +i2y $1 +i2/ y1 +i2x Y2 +i2x y2 +i2x sdk +i2x r [ +i2x $n +i2x i6h +i2x i27 +i2x i0x +i2x D7 +i2X D5 +i2_ x91 +i2_ x83 +i2x '8 +i2, x73 +i2. x71 +i2. x63 +i2x *61 +i2- x61 +i2, x41 ^w +i2x *41 +i2x ,3 +i2 ^x +$? i2x +$_ i2x +i2w x43 +i2w $W +i2w q +5 +i2W ^Q +i2w o0t +i2w ^C +i2W $8 +i2w *78 p5 +i2w *65 +i2w *53 +i2w .5 +i2w $4 +i2w ,3 +[ i2w +i2v Z1 +i2v y5 +i2v Y3 *B9 +i2v x71 +i2V u +i2v ^p +i2v o8c +i2v o3W +i2v o3q +i2v o0R +i2v k +i2v i6d +i2v i1c +i2v D0 +i2V $6 +i2v +6 +i2v ,3 +i2v *28 +i2v -0 ^z +$/ i2v +i2v +i2u o9. +i2u K +i2u k +i2u ^j +i2U i3C +i2u i3. +i2u ^g +i2u $3 +i2u +2 i0y +[ i2u +i2t y1 .1 +i2t $x +i2t $v +i2t $U +i2t ^u +i2t $q +i2T o7 E +i2t o3h *54 +i2t ^j +i2t $i K +i2t i9o ,2 +i2t i7e +i2T i3U +i2t i0J +i2t ^C +i2t ^B +i2t *80 D3 +i2t *54 o3h +i2t *43 -0 +i2t ,2 i9o +i2# T1 +i2t -0 *43 +i2t $$ +i2t } +i2t ] +i2t [ +$* i2t +$! i2t +i2s Z1 *23 +i2s Y3 +i2S y2 p3 +i2S x51 +i2s x43 +i2S T3 +i2s ^R +i2S o6D +i2s o1 +5 +i2s k +i2s i8k +i2s i7_ +i2s i4r +i2s i2V +i2s ^f +i2s E *34 +i2S C +i2s ^6 ^7 +i2s ,6 +i2s -6 +i2/ s58 +i2s *34 E +i2S ^3 +i2s *23 Z1 +i2. ^s +i2- ^s +i2s +i2r x34 +i2r t *36 +i2r t ] +i2r ] t +i2r stg +i2- r o7. +i2r o6y +i2r o0S +i2r l +3 +i2r i5r +i2r c z3 +i2r $9 +i2r *46 +i2r +3 l +i2r *36 t +i2r *35 ^E +i2r *16 +^_ i2R +} i2r +[ i2r +i2q $z *31 +i2q y3 +i2q x71 +i2q o6- +i2q o5b +i2Q o41 +i2Q f +i2q *52 +i2q $5 +i2q *31 $z +i2q $0 +i2q $. +i2q $! +} i2q +i2p ^x +i2p o5h +i2p o3p +i2p i3- +i2p i0w +i2p i0h +i2P ^f +i2p c +i2P ^B +i2p -6 +i2p *45 +i2p +3 +i2p $! +i2p ] +i2p [ +i2o Y2 +i2o x02 +i2o u +i2o p3 $P +i2o ^o K +i2o o4i +i2O o1R y2 +i2o K ^o +i2O K +1 +i2o K +i2o i4. +i2O i3p +i2O i1V +i2O ^i +i2o ^c +i2@ o86 +i2@ o8^ +[ i2o $7 +i2@ o6@ +i2= o6= +i2 o50 +i2& o3m +i2- o3= +i2] o2 ,3 +i2- o1q +i2@ o1L +0 +i2O +1 K +i2o $1 +i2o $ +i2n x52 c +i2N T3 +i2n t +{ i2n ^t +i2n ^R +i2n i50 +i2n i3i +i2N i2o +i2n i02 p3 +i2n c x52 +i2n C +i2n -A +i2n *86 +i2n +3 +i2n .2 i1o +i2N *20 +] i2n +i2m Z5 Y2 +i2m $Z *23 +i2m $y +i2m x72 +i2M x42 +i2m x42 +$? i2m x24 +i2m t *75 +i2m p3 'B +i2m o3> Z4 +i2m i6G +i2M i5k +i2m i3? +i2m D9 +i2m D7 +i2M D4 f +$/ i2m d +i2m $c +i2m *75 t +i2m *57 +i2m +5 +i2m *35 +i2m *23 $Z +i2m +1 +i2m *05 ^D +i2m { +[ i2m +i2l x82 *18 +i2l x34 *10 +i2l ^q ,6 +i2l o89 $. +i2l $. o89 +i2l $A +i2l *8B x23 +i2l *51 +i2l +5 +i2l $4 +i2L ,3 +i2l *10 x34 +i2l +0 +i2l $+ +i2l $, +i2l ] +i2k Y1 +i2k R4 +i2K $R +i2] k i2[ +i2k i03 +i2K E +i2k *87 +i2k $7 +i2K ,3 +i2k -3 +i2k *25 +i2k *14 +i2k +1 +i2k *04 +i2% K +] i2k +i2j y4 ] +i2j ] y4 +i2j x73 +i2j x72 +i2j x51 +i2j x43 +i2j $v +i2j p3 -3 +i2j o6o D4 +i2J o4O +i2J L4 +i2j D0 o5e +i2j ^a +i2j ,9 +i2j *57 +i2j -5 *37 +i2j $4 +i2j *37 -5 +i2j *27 +i2j *03 +i2_ ^j +[ i2j { +i2i y4 +i2i ^y +i2i p4 *42 +i2i o4u +i2i ^J +i2i i6. +i2I c -A +i2I -A c +i2_ iA_ +i2i ,7 $4 +i2i *72 +i2 i6e +i2i *53 +i2i *51 +i2- i5_ +i2 i5 +i2_ i4i +i2i $4 ,7 +i2< i36 +i2I ,3 +i2] i2[ k +i2' i1' +i2- i1_ +i2- i0v +i2i +0 +i2i [ +0 +] i2i +i2h y2 +i2h ^y +i2h xA2 +i2H x63 l +i2h x42 +i2h u +i2h s85 +i2h s2s +5 +i2h o75 +i2h o63 +i2h o4c +i2H l x63 +i2H K i5h +i2h K ^+ +i2h ^+ K +i2h ^k +i2H ^j +i2H i5r +i2H i5h K +i2h i4j +i2h i3p +i2h i2t +i2h i0G +i2h ^I +i2H c +i2h +5 s2s +i2h -3 +$. i2h +i2g y5 x85 +i2G x52 d +i2G x34 +0 +i2g x34 +i2g $x +i2g ^T +i2g p4 *31 +i2g o1n +i2G l +i2g K +i2g k +i2g ^j +i2g i3y +i2g i0w +i2g $g +i2g ^D +i2g $8 +i2g *63 +i2g *47 ] +i2g ] *47 +i2G +0 x34 +i2G $! +i2g $@ +i2f y4 +i2f y3 -7 +i2@ ^F y3 +i2F u +i2f ^T +i2f $p +i2f o59 +i2f K +i2f i6g +i2f i45 +i2F i2G +i2f ^h +i2f *72 *52 +i2f *58 +i2f *54 +i2f +4 +i2f *34 +i2f .1 +i2F { { +] i2f +i2E y3 ^E +i2e $w r +i2E u +i2e L4 +$@ i2e k +i2e i7t +i2e ^i +i2E ^E y3 +i2E E +i2e E +i2E c +i2e c +i2e ^A +i2e ,3 +i2e -3 +i2e *03 +i2# E +i2. ^E +i2e ] +i2d Z2 $^ +i2D Y2 Y2 +i2d Y1 +i2d x82 +i2d s96 +i2d $R +i2d o1l +i2d k +i2D i7d +i2d i4# +i2D i3g +i2d D7 +i2- D8 +i2d -8 +i2d *50 +i2d -5 +i2. D4 -1 +i2d *24 +i2@ D0 *40 +i2. D0 +i2d +0 +i2d -0 +i2d $, +i2_ d +[ i2d +i2c Y3 s0- +i2c y2 +i2c x82 +7 +i2c t k +i2c s0- Y3 +i2c o5w +i2c o4z *43 +[ i2c o1p +i2c o0l +i2c L6 +i2C l [ +i2C [ l +i2c k t +i2c ^k +i2c i6 +[ i2c E +[ i2C c +i2@ ^c c +i2c $9 *95 +i2c +7 x82 +i2c *67 +i2c *60 +i2c ,6 +i2C -1 +i2c *07 +i2c -0 +i2! C +i2b y2 +i2b x52 +i2b x32 +i2B ^U +i2b o1x +i2b $n +i2B k +i2b i4s +i2b i1k +i2B i08 C +i2b ^E +i2B C i08 +i2B $b +i2b $A +i2b .5 +i2b *45 +i2b *35 +i2b *16 +i2- $b +{ i2b +] i2b +i2A Y5 x23 +i2a Y2 +i2a Y1 L6 +i2A x41 l +i2A x23 +4 +i2A T3 [ +i2a sr7 *05 +i2a R3 +i2a ^P +8 +i2A o3l +i2A l x41 +i2a L6 Y1 +i2A L5 +i2a i7o +i2a i6n c +i2A i45 +i2A ^F +i2A E +i2a E +i2a D7 +i2A D5 ,3 +i2a c i6n +i2a 'A +i2 *A9 +i2a +6 +i2A ,3 D5 +i2a *26 +i2& $a ,2 +i2a *05 sr7 +i2a *04 +i2@ ^A +i2_ 'A +i2a $^ +i29 Z2 +i29 y1 *41 +i29 x62 +[ i29 *61 +i29 *53 ,6 +i29 $% +i28 o08 +i28 ^o +i28 i33 +i28 i23 +i28 } $h +i28 f x59 +i28 *74 +i28 ,3 +i28 *14 +i2- '8 +i27 x52 +i27 ^n +i27 i34 +i27 +3 +i27 ^3 +i27 *16 K +i27 ,1 +i2. -7 +i2, $7 +i2- -7 +i26 i39 .8 +i2* *64 +i26 ,3 +i2 *62 +1 +i2- ^5 z1 +i25 x41 $@ +i25 $@ x41 +i25 u ^B +} i25 su7 +i25 o1d .4 +i25 i63 +i25 i4m +i25 i3- +i25 ^B u +i25 +5 +i25 .5 +i25 .4 o1d +i2_ +5 +$. i25 +i24 Z1 +i24 Y1 T0 +i24 $x *92 +i24 T0 Y1 +i24 p1 'B +i24 o7. +i24 [ o5h +i24 o39 +i24 ^n +i24 i4t +i24 *50 *34 +i24 *34 *50 +i24 } +i2_ $3 y2 +i23 o7w +[ i23 o12 +i23 K +i23 i6g +i23 i2t +i23 i1j +^i *23 D6 +i23 '8 +i23 *58 +i23 *53 +i23 .3 +i2. *31 +i23 -0 +i23 $? +i2. +3 +i2- +3 +i2 $3 +i22 $z +i22 Y3 ,5 +i22 $x +i22 T4 i76 +{ i22 sI4 +i22 o0P +i22 i76 T4 +i22 i2s +i22 i2A +i2& ,2 $a +i2. *29 +i22 '8 +i2@ *28 +i22 *65 +i2_ *25 +i2 *25 +i22 *42 *52 +i22 .3 p1 +i21 Z1 +i21 x81 +i21 T1 +i2, -1 p4 +[ i21 o62 +i21 $O +i21 ^o +i2. -1 D4 +i21 *73 +i21 '7 +i2 +1 *62 +i21 *52 +i21 ^3 +i21 +1 +i20 x62 +i20 o5m K +i20 o1m +i2@ +0 o1L +i20 K o5m +i20 i6* +i20 i24 +i20 i15 +i20 D6 +i20 .4 +i20 } +i2_ +0 +i2 $0 +i20 +^I ,2 +i2+ [ +i2& $; +i2* ^@ +i2$ ^# +i2@ $. +i2] ^[ +i2. $! +i2/ +i2! } +i2! +i2_ +$i ^2 +$! i2# +} i1z y3 +i1z x61 +i1z x43 +i1z R0 +i1z o3x +i1z o3? D2 +i1z i10 +i1z ^b +i1z [ ^a +i1z *71 +i1z *30 +i1/ z1 E +i1z *18 k +i1@ $z +[ i1z +i1y y3 +i1y x71 +i1y sx, +i1y o7b +i1y i6Z +i1y ^h +i1y *31 +i1. y3 *04 +i1y .2 +i1= y2 +$I ,1 Y1 +i1. Y1 +i1$ y1 +i1_ ^y +i1X { z5 +$& i1x Z4 +$& i1x Z2 +i1x { x31 +] i1X sXd +i1x p4 Y5 +i1x o0z .7 +i1x i07 +i1x D7 +i1x ^c +i1# x82 .0 +i1x .7 o0z +i1 x41 +i1% x32 i31 +i1x ,2 +i1x -2 +i1( x17 +] i1x +i1x +i1w Y4 x37 +i1w x53 +i1w x52 +i1w $t +i1w r y2 +i1w $r +i1w o6u o0M +i1w o0M o6u +i1W o0E +i1w i4q +i1w i1t y1 +i1w D7 +i1w -4 +i1w ^1 x36 +i1_ ^w +$ i1w +] i1w +i1v ^t +i1v o6S +i1v i3t ,4 +i1v *13 +i1V $0 +i1v $* +i1u y2 +i1u x52 +i1U s2l +i1u o5k +i1u o3k +[ i1u o2P +i1u o2f +i1u *52 +i1u *20 +i1u +0 +i1# ^u +i1t $x +i1t R0 *43 +i1t ^p +i1t o6Z +i1t o43 +i1t o2w +i1t i2- +i1t i0a +i1T ^A k +i1T ^A +i1t *51 +i1t *43 R0 +i1t $2 +i1, T0 +i1t $! +i1t } +i1t [ +$# i1t [ +] i1t +i1t +i1s Z3 +i1S Y3 c +i1S x32 .4 +i1s x01 o3p +i1s t +i1S R7 D4 +i1* sMz *45 +i1S L0 +i1s ^k +i1s $j +i1s ^h +i1s ^e +i1S c Y3 +i1s ^a +i1s *72 x43 +i1s +3 +i1s $@ +{ i1s +i1R Z1 +i1R z1 } +i1r y3 +i1R R0 +i1r $R +i1r o5C +i1r K .2 +i1R i8s +i1r i4d +i1r i1k +i1R E *43 +i1r c *25 +i1r ^b +i1r +8 +i1r +7 +i1r +6 +i1r +5 +i1R *43 E +i1r -4 +i1r *37 +i1r .2 K +i1r *28 +i1r *25 c +i1r *17 +i1r .0 +i1q ^s +i1Q o1d y2 +i1q o09 +i1q ^e +i1q d +i1q *51 +$@ i1q +i1q +i1p ^z +i1p x01 T6 +i1p $S o01 +i1p si. +i1p sdg +i1P o0V +i1p o01 $S +i1P k *96 +i1p i2h +i1P i0I +i1P *96 k +i1p .5 p5 +i1@ p4 i11 +i1p +2 +i1p $. +i1o y3 +i1O $y +i1o x32 +i1O u +i1o sSY D6 +i1o ssy +i1o ^S +i1o p1 +i1o o5u +i1o o0v +[ i1o ^N +i1o L4 +i1o i6i +i1o i2b +i1o $g +i1o E .6 +i1o D6 sSY +i1o ^c p4 +i1O c ,9 +i1o c +i1O ,9 c +i1o *78 +i1o .6 E +i1_ o59 ^t +i1o .3 +i1@ o2# K +i1@ o0J *13 +i1. o0b p5 +i1O +i1o ^@ +$* i1o +i1o +i1n Z2 +i1n Y4 +i1n y2 +i1n $x p5 +i1N u *12 +i1n ^p +i1n K ^c +i1n K +i1n $G +i1n d +i1n ^c K +i1n $4 +i1n .3 *13 +i1N *12 u +i1@ ^N +i1m z5 C +i1m z2 +i1m x31 t +i1m t x31 +i1m D4 +i1m C z5 +i1m c +i1m $b +i1m *65 +i1m -5 +i1m *13 +$. i1M +i1* ^m +i1l Z1 +i1l x32 +i1l ^u u +i1L $r +i1l o2m +i1l K +i1L ^j c +i1L i9# +i1l i3* +i1L i2y [ +i1L ^E +i1l D7 +i1l D6 p3 +i1L d ] +i1l C +i1L ^B +1 +i1l ^A +i1l .6 x31 +i1L $5 +i1l -2 +i1L $! +i1- ^L +i1l ] +i1l ^$ +i1. ^l +i1k y3 Y1 +i1k y2 +i1k Y1 y3 +i1k y1 u +i1k Y1 *40 +i1k x62 +i1k u y1 +i1k R0 +i1k o57 +i1k o3o ] +i1k ] o3o +i1@ K o2# +i1k i4m +i1k ^5 +i1k *45 -3 +i1k *40 Y1 +i1k -3 *45 +i1k $3 +i1_ K .0 +i1& K +i1_ K +^- i1K +i1k $! +i1j y5 *17 +i1J x62 [ +i1J u $7 +i1j s1h +i1j i6n +i1j i3g +i1j ^H +i1j ^E +i1j D7 +i1j $b +i1J $7 u +i1j *56 +i1j -2 +i1@ ^j +i1j +i1i y2 Y1 +i1i y2 -8 +i1i Y2 +i1i y2 +i1i Y1 y2 +i1i x92 +i1i o0c +i1i i5, +i1i i2o +i1i '9 $2 +i1i ,8 +i1i .4 +i1* i4* +i1. i1r +i1i *17 +i1- i0v +i1_ i0u +i1i -0 +i1I $# +i1i $! +i1h Z1 x51 +i1H Y2 +i1h x51 Z1 +{ i1h x41 +i1h r x32 +[ i1h R6 +i1h $Q +i1H o74 +i1h o7/ +i1H l $_ +i1H $_ l +i1h ^K +i1h i9_ +i1h i2m +i1H E *32 +i1h D4 +i1h ^b +i1H *32 E +i1h } +i1g y3 +i1G Y1 +i1g x62 *41 +i1g x32 srb +i1g $v +i1g t *64 +i1g syq D0 +i1g srb x32 +i1G o6# +i1g o3n k +i1g k o3n +i1G k ^F +i1g i67 +i1g i5f +i1g i5a +i1g $H x84 +i1g D0 syq +i1g ^d +i1g *64 t +i1g *41 x62 +i1g ,3 +i1g .2 +i1g $1 +i1G +i1F z2 Y1 +i1F Z1 +[ i1f y2 +i1F Y1 z2 +i1f Y1 i5- +i1f x23 +i1f t +i1f ^Q o0y +i1f o45 +i1f i5- Y1 +i1f $F +i1F $e +i1f D8 +i1f D6 +i1f D4 +i1f ^c +i1_ $f *61 +i1F $4 +i1f } ] +i1f ] +i1e y2 .3 +i1e Y2 +i1E Y1 o3z +i1e x52 +4 +i1e x41 +i1E ^S +i1E o3z Y1 +i1e o2d +i1e L0 +i1e i5i -9 +i1e i4k *24 +i1e i2v +i1e i0E +[ i1e $f +i1e E +^$ i1E D6 +i1e D4 +i1e C +i1E ^A +i1e ^A +i1e $a +i1@ E *65 +i1e +4 x52 +} i1E ] +} ] i1E +i1e $! +$) i1e +{ i1e +] i1e +i1d y5 +i1d Y4 u +i1D y1 +i1d x05 o2g +i1d u Y4 +i1d ^p u +i1d i4s +i1D i2u +i1d i2s +i1d i28 +i1d $g +i1d DA i2i +i1D c ^4 +i1d ^B +i1d '8 +i1d *43 *04 +i1 ^d -3 +i1d ^1 +i1D .0 +i1- ^D +i1d $$ +{ { i1d +^ i1d +i1c Z1 +{ i1c y5 +i1C x54 u +i1c x23 *64 +i1C u x54 +i1C s8E +i1c o3* +i1c ^i +i1c D4 +i1c *87 +i1c *30 +i1C } +i1C +i1c $? +i1& c +i1B Z2 $D +i1b y4 +i1B y1 +i1B s5E +i1b R0 +i1b o0m +i1B l *41 +i1B i66 +i1b i0R +i1B *41 l +i1b *14 +i1b -0 +$* i1B +i1b $+ +$! i1b +i1a Z5 Z2 +i1a Z2 Z5 +i1A Z2 +i1a Z1 y3 +i1a y3 Z1 +i1a y3 *07 +i1a Y3 +i1A y1 +i1A sod +i1A o2X t +i1A o2J +i1A o1y $0 +i1a ^m +i1A $k +i1a i8. +i1a i4r p3 +i1a i3Y +i1a i1S +i1a i1e +i1a i0c +i1A $g +i1a D5 +i1a ^B o7# +i1a +9 +i1A *82 +i1a ,6 +i1A $0 o1y +^+ i1A +i1a $# [ +i1a [ $# +i1a ^@ +} i19 Z1 +i19 y3 y3 +} i19 Y1 +i19 u K +i19 o6S i6M +i19 K u +i19 i5F +i19 $h +i19 ^6 +i19 ,2 +i19 +i18 o4b +i18 o48 +i18 K *36 +i18 i3y +i18 D2 .0 +i18 '8 +i18 ^6 +i18 *43 +i1- *84 +i18 $* -2 +i18 -2 $* +i1- ,8 *15 +i18 .0 D2 +} i18 +^* i18 +i17 Z1 +i17 ^M +i17 K +i17 d E +i17 -5 +i17 ^3 +i1( *71 x53 +i17 *15 +i1@ -7 +i1. -7 +] i17 +i16 Z2 o04 +i16 Y5 Y5 +i16 o04 Z2 +i16 i18 +i1@ *65 E +i1_ *61 $f +i16 +0 +i16 ] +i15 i4z +i15 i2y +i15 i2g +i15 ^D *73 +i1- *58 D7 +i15 *53 +i1# -5 ,2 +] i15 +i14 y4 +i14 T6 +i14 ^M +i14 i3r +i14 i2* +i1. *47 +i1* *45 sMz +i14 '4 +i14 $1 +i1@ *41 +i1- +4 +{ i14 +i13 y2 +i13 $M +i13 ^L +i13 i1u +i13 $A +i13 *98 +i13 *62 +i13 ^2 *73 +i13 *25 p5 +i1$ -3 +i12 x61 +i12 ^Q +i12 o6@ +i12 o1z ^k +i12 o0N $N +i12 $N o0N +i12 K c +i12 ^g +i12 c K +i12 ^A +i12 $a +i12 +5 +i1# ,2 -5 +i1` *24 +i12 ,2 +i12 +i11 y3 +{ i11 Y1 +i11 r +2 +i11 K +i11 i3s +i11 ^G +i1- *15 ,8 +i1@ *13 o0J +i11 ^2 o1w +i11 ] +$. i11 +i10 Y4 Y2 +i1# .0 x82 +i10 $p l +i10 l $p +i1_ .0 K +i1; *03 .3 +i10 *06 y2 +i10 $# +$, i10 +i10 +i1\ +i1* $* +i1/ ^/ +i1_ $. +i1_ } +i1 $. +$[ i1[ +^@ i1_ +^" i1# ^! +^! i1! ] +^! ] i1! +^- i1- +i0z Z1 ^j +i0z Y3 y1 +i0z y1 Y3 +i0z x61 +i0z x31 +i0z x12 ^h +i0z $r +i0z o7p -5 +i0z o3@ +i0Z $o +i0z ^j Z1 +i0z *87 *25 +i0Z *65 $2 +i0z -5 o7p +i0Z *42 ^H +i0 z3 +i0+ Z2 x56 +i0Z $2 *65 +i0z *25 *87 +i0# z2 +5 +i0z .1 +i0z $% +i0- ^z +$? i0z +i0Y x14 +i0y ^T +i0Y ^N +i0y i67 Y2 +i0y D1 o1o +i0y ^B +i0Y -8 p3 +i0@ Y5 ^w +i0_ Y4 Y4 +i0- Y1 ^v +i0. y1 o5Y +i0y *03 +$$ i0y +i0X $x +i0X ^R +i0X o6! +i0x o18 $l +i0x ^N +i0x $l o18 +i0X ^K +i0x i6o c +i0x i2d -4 +i0x i1g +i0X i1C +i0x i0n +i0x c i6o +i0X $7 +i0_ x61 *46 +i0+ x56 Z2 +i0x -4 i4Y +i0' x43 +} i0. x41 +i0) x14 C +i0! x13 ^y +i0> x07 t +i0- x03 i2p +$% i0X +i0x $* +{ i0x +^/ i0x +i0x +i0w z4 *59 +i0@ ^w Y5 +i0w y1 +i0W $w *43 +i0W $w +i0W $R +i0W ^R +i0w o8l +i0W $L +i0w i4_ +i0w i1j +i0W ^A D3 +i0w $a +i0w $ *76 +i0w *74 +i0w .5 +i0W *43 $w +i0w *15 z2 +i0$ $W +$& i0W +i0w $* +i0V y1 ] +i0V ] y1 +i0- ^v Y1 +i0v x53 o5s +i0V x31 *47 +i0V ^R +i0v $p k +i0v k $p +i0v i5@ +i0v i3m +i0V ^I +i0v D3 +i0v ,5 +^& i0v -0 +i0v $$ +i0u z1 ^k +i0u y4 +i0U Y2 +i0u $y +i0u x35 +i0U sva ,6 +i0U sUo .7 +i0U ^R +i0u oA# +{ i0U o5A +i0u o4_ +i0U l D6 +i0u i4p +i0U D6 l +i0U .7 sUo +i0U ,6 sva +i0U ,4 +i0u ,1 +i0u $# +i0u +i0t z2 +i0T Z1 +i0T Y3 Y3 +^. i0t y1 +i0t x23 *34 +i0> t x07 +i0t ^U +i0t $u +i0T T5 +i0T s0M +i0T ^S +i0t r i1B +i0t $l +i0t i4_ +i0T i0L } +i0T i0F +i0T $h +i0t ^H +i0t ^F +i0t *74 +i0t *67 +i0t ^5 +i0t $2 +i0T +1 +i0T ^@ +$$ i0T +i0t ^! +i0- ^t +i0s z4 +i0S Y5 Y5 +i0S Y5 +i0s y4 +i0S y1 +i0s x62 +i0s x21 +i0S ^W +i0s $v +i0s su1 *01 +i0s o72 +i0s i2t +i0s i1d +i0s i0w +i0s D4 +i0s D2 *16 +i0S c +i0s .4 +i0S ,3 +i0S *23 +i0s ^2 +i0, s2, +i0s *01 su1 +^& i0S +i0_ } ^s +[ i0s +i0r Y5 +i0r Y4 +i0r y1 } +i0r y1 +i0r ^Y +i0R x21 ^G +i0R ^T +i0r sie +7 +i0R o1. +i0r L0 +i0R i1N +i0R i1J +i0r i0e +i0r ^d +i0R ^b +i0r +7 sie +i0r .5 +i0R *46 +i0r +3 +$% i0R +i0@ ^r +i0- r +i0= r +i0q x21 $p +i0Q $W .4 +i0q $p x21 +i0Q $P +i0Q o7q +i0q i2h +i0q -7 z2 +i0Q .4 $W +i0q *09 x07 +i0! ^Q +i0p Z1 *21 +i0p x52 +i0p $x +i0P s1W +i0p oA2 +i0P o90 +i0p o1l ^U +i0P $o +i0p ^m +i0P i0T +i0P *52 +i0p *21 Z1 +i0p *16 +i0_ ^P +i0O Z1 +i0o Y4 D7 +i0O y2 +i0o x12 +i0o ^S +i0O o2t +i0O i61 +i0o ^B +i0$ o7# +i0# o65 l +i0$ o5$ o4e +i0$ o4e o5$ +i0_ o41 +i0* o3z +i0@ o3n +i0@ o3i +i0n ^Z +i0n x13 K +i0n $w +i0N ^R +i0n ^r +i0n p2 *41 +i0N o7@ +i0N o45 +i0N l +i0n K x13 +i0N i4u +i0N i30 +i0N i1T +i0n $f +i0N $7 +$. i0N *51 +i0N *43 *15 +i0N *15 *43 +i0n .1 *04 +i0n *04 .1 +i0M x93 +i0m ^r +i0m oA1 +i0m o6a +i0M o6@ +i0m o4c +i0m o3i +i0M o1A +i0M o1a +i0M k o0F +i0M i8m +i0m i84 +i0M i43 +i0m i2g +i0m i1k +i0M i1j +i0m ^g +i0M ^E +i0M d o5V +[ i0m D5 +i0m $b +i0M ^a +i0M +9 +i0m -7 ^J +} i0M -6 +i0m *42 +i0l Y5 o0F +i0l x35 ^; +i0L u +i0L s2X +i0# l o65 +i0L o5# +i0l o3w '8 +i0l o1o +i0l o1& *52 +i0L K Y2 +i0L ^j +i0L i3# +i0l i2g +i0l i1o +i0l ^A T7 +i0l '8 o3w +i0l *52 o1& +i0L *51 +i0l *50 +i0l ,4 +i0L $0 +i0l $0 +^- i0l $0 +^$ i0L +i0@ $l +i0K z5 z4 +i0K z4 z5 +i0k z4 o27 +i0k y5 -4 +i0K y2 o0V +^_ i0K y1 +i0k x43 z1 +i0K x12 +i0k slz +i0K o43 +i0K o3a l +i0K o1h +i0K l o3a +i0k i4b +i0K i1B +i0K ^G +i0k ^G +i0K +6 +i0k *36 +i0K $3 +i0K *13 +i0J Y4 u +i0J ^W +i0J u Y4 +i0J ^R +i0j o2y c +i0J o1D +i0J ^K x63 +i0J i5c +i0J i0F ] +i0J ] i0F +i0J i0F +i0J ^D +i0j c o2y +i0j *60 +i0J $1 +i0j ^# +i0' $j +i0! ^j +$+ i0j +i0i x21 +i0i p3 ,A +i0I o7. +i0I o6- +i0i o3k +i0I o12 -5 +i0I $o +i0i ^o +{ i0i ^n +i0I i4U +i0I ^H +i0i ^H +i0i c ^R +i0i C *21 +i0i ^C +i0I $7 +i0i ^6 +i0[ i6] +i0I -5 o12 +i0I *53 +i0? i49 +i0@ i3F x53 +i0# i37 +i0i *24 +i0i *21 C +i0. i0N D6 +i0. i0F +i0- i0b +i0I +i0i } +i0i ] +^- i0i +i0h ^y +i0H ^R +i0h o74 +i0h i72 +i0H *32 +i0H *31 +i0H *23 +i0g Y4 *63 +i0g ^r } +i0G p2 Z1 +i0G ^P +i0g o5m +i0g ^m +i0g i87 +i0g i6b +i0G i0F +i0g -3 +i0G *24 ^F +i0G $! ^1 +i0G ^1 $! +i0G $* +i0= ^G +$* i0G +i0G +i0F z1 +i0f y1 +^. i0F x32 +i0f x12 *31 +i0F ^W +i0F ^U +i0f t *06 +i0f soi +i0f sme +i0f ^s +i0f o5c +i0F o3* +i0f ^m +i0F k o0! +i0F ^J +i0f i7/ +i0F i2E +i0F i1G +i0f ^9 +i0f ] -7 +i0f -7 ] +i0F ^4 +i0f *06 t +i0F $* +} i0F +i0@ ^f +i0E y5 x78 +i0e x52 -2 +i0e $T +i0e o4d +i0E o41 +i0E o2f +i0e L7 +i0e L3 *35 +i0E i2 *67 +i0E i1W +i0E i1@ +i0e i05 +i0e D5 +i0E $C +i0E *73 *65 +$! i0E -7 +i0e .7 +i0E *65 *73 +i0e *45 +i0e -2 x52 +i0E $2 +i0e ^2 +$# i0e +i0d Y2 t +i0D y1 i3A +i0D x41 +i0d t Y2 +i0D sm3 { +i0D { sm3 +i0D ^S +i0d R7 +i0d o38 *52 +i0D o1w +i0D ^J +i0d i7e +i0D i4s +i0d i3b +i0D $i } +} i0D $g +i0D ^E +i0d $c +i0D *54 +i0d *52 o38 +i0d ^2 +i0c z1 oA0 +i0) C x14 +i0C ^V +i0c ^s +i0C o2@ +i0c ^n +i0C i6e +i0C i5& +i0C i4j +i0c i4* +i0C ^I +i0C ^G +i0C $e +i0c $e +i0c ^e +i0C ^D +i0C ^B +i0C ^A +i0c +8 +i0c *17 +i0b Z2 *78 +i0B $$ Z1 +i0B z1 +i0B y3 D4 +i0b Y1 i12 +i0b x13 -4 +i0B ^S K +i0B K ^S +i0B i5. +i0b i2y +i0B i2! +i0B i1Q +i0b i12 Y1 +i0B $I +i0b $h +i0B ^d +i0b *78 Z2 +i0b $5 +i0b } +^ i0b +i0a z2 *75 +i0a y3 +i0A ss1 +i0A R8 R8 +i0A q c +i0A o6# E +i0A o5Z +i0a ^L R3 +i0a i5x +i0A i2Z +i0a i2f +i0A i1C -4 +i0A i0B +i0a i07 +i0a ^I +i0A E o6# +i0a *A8 +i0A *68 Y1 +i0A *31 +i0a -2 ^2 +i0A *01 z2 +$) i0a +$. i0a +^* i0a +i09 T5 +i09 i0k +i09 ^c +i09 .3 +i0* -9 +i08 z3 +i08 Y3 y1 +i08 y1 Y3 +i08 $x +i08 o29 +i08 $e ^= +i08 ^= $e +i08 D8 y4 +i08 *04 i49 +i0& ^8 +i0/ ^8 +^% i08 +^! i08 +i07 ^t y1 +i07 o6o z3 +i07 D2 +i07 ^c +i06 x41 +i06 x13 +i06 ^w +i06 ^V +i06 K *03 +i06 ^g +i06 D3 +i06 ^d +i06 +9 +i06 $9 +i06 $7 +i06 *03 K +i0! .6 +} i06 +^i *05 t +i05 o6S +i05 i7k +i05 i3- +i05 ^6 +i05 $$ +i04 u $! +i04 $! u +i04 sea { +i04 { sea +i04 r ^v +i04 ^M +i04 i55 +i04 i32 +i04 ^d +i04 $A *50 +i04 *50 $A +i04 -4 .2 +i04 -4 +i04 .2 -4 +i0@ $4 +$? i04 +^. i04 +i03 y2 { +i03 y1 $q +i03 $q y1 +i03 o3n +i03 ^L +i03 i3m +i0 *31 +i03 ] +i0@ ,3 +i0! $3 +i02 x25 +i02 $U +i02 s2v +i02 o24 +i02 o1c +i02 i5G E +i02 i04 +i02 D2 +i02 +6 ^b +i02 $6 +i0, *25 *24 +i02 *40 +i02 *04 +$? i02 +^i *02 +i01 Y4 o1B +i01 ^y +i01 ^r +i01 o8S +i01 $K +i01 i82 +i0@ *12 +i0# -1 +i0* $1 +i0< $1 +$. i01 +^* i01 +i00 y2 $* +i00 $* y2 +i00 s0% +i00 L6 { +i00 i3. +i00 i05 r +i00 i0. +i00 c { +i0* *04 +i00 ^3 +i00 *05 +i00 +i0% $& +i0# $# +i0# $* +i0\ +i0* $. +i0* ^# +i0* ^/ +i0$ $$ +i0) } } +i0' ^( +i0/ +i0? +i0! $# +i0, $, +i0 +i0< +$% i0% +$& i0% +$. i0. +^i $0 +^+ i0- +^# i0* +^_ i0@ +$I $. +$* ^I +{ ^I +$i $- +$i $ +$i [ { +$i ^@ +$, $i +$, ^i +$_ $i +$= ^i +{ $i +^@ ^i +^( $i +$H z5 y2 +^H z4 z2 +$H Z4 +$H Z3 l +^H z2 z4 +^H Z2 +^H Z1 z1 +^H z1 Z1 +^h Z1 z1 +^h z1 Z1 +$H Z1 E +^H Z1 *25 +^h z1 *07 +$H z1 +^h z1 { +^H ^Z +^h ^z +$h $y y2 +^H ^y x18 +^h y4 +^h y3 y3 +^h y3 +$h y2 $y +^H y2 +^@ ^H Y1 +^H $y +$h x83 +$H x62 *70 +$H x61 +$h x5B +^H x53 +} $h x53 +$h x32 *25 +$H x32 +^h x23 +^H x18 C +^H x16 $s +} $h x05 +$h ^w r +$H u o7C +^H u D7 +$H $u +^h $/ ^U +^h ^U $/ +^h t *6A +^H T5 +^H T3 +$H $T +^H $s x16 +^h s0y +^H r $Z +$h r ^z +$H R4 o3G +$h R2 +$h ^r -2 +$h [ R0 +$H p4 ^A +^h o7w +$H o7L +$H o7C u +^H o6t x23 +$h o6a +$H o61 +$h o6- +^H o5N +^h o4i +$H o4| +$H o3G R4 +^h o2y +3 +^H o2y +^H o2r +^H o2d +^H o2 +^H o1p +^H o1g +^H o1C +$h o13 +$H o1@ } +$H ^o $1 +$h ^n +^h $n +$H ^M +^H ^M +$H l Z3 +^H L7 +^h L5 *42 +^h ^L +$h ^l +$H $K p5 +^h ^K +} ^h $j +^H $i Z3 +$h i8s +$h i81 +$h i7s +[ ^H i71 +^h i6m +^H i6h +$h i6d +$h i6A +$H i61 +$h i6_ +$h i5. +^H i4t +^H i4l +^h i4f +$h i49 p4 +$h i40 +^H i3O +$h i3n +^h i31 +^h i2o +$h i2k +^h i2j +^h i2f +^h i2a +^H i28 +^H i2, +^h i1w +$H i1h +] ^H i1F +^H i1C +^h i17 +$H i10 +^H i0z +$H i0R +$h i0q i57 +^H i0N +^H i0h +$h i0b +$H $i +$h $i +} $h $i +$H $G +$h ^g +^H f x16 +^h $F +$H E Z1 +$h $e +^h ^e +^H D7 u +$h D4 ,5 +$H D4 +^h ^D +^H C x18 +$h $c +^h ^b +$H *A7 +$h *A6 +^H ^A +4 +^H $9 +^H ,8 ^O +^h *83 x42 +$H ^8 +$H ^7 +$h .7 +$h ^7 +^h *6A t +^h *68 +[ ^h *60 +^h *60 +$h +6 +^H ,5 z1 +$h .5 q +$h *51 ^z +$H $5 +$h $5 +^h ,5 +^H *48 +^h *42 L5 +$h *41 *27 +^H *41 +} $h *40 +^H +4 +^h -4 +^h ^4 } +^h +3 o2y +^h $3 +$h *27 *41 +^h *27 ] +^h ] *27 +^H *25 Z1 +$h +2 +$h .2 +$H $1 ^o +^H $0 +$! ^H +} ^H +$h $? +$h { { +$h { +$@ ^h +$! ^h +[ $/ ^h +[ ^h $/ +^. ^h +^g { Z5 +^g z3 +$g Z2 *17 +$g $z +^g ^y *A9 +^G Y4 Y4 +$G y4 y4 +$g Y4 x14 +^g y2 u +^g Y2 r +^g y2 C +^g Y2 -9 +^G Y2 .2 +^g Y2 +$g y2 +$G Y1 l +^g y1 *43 +$G $Y +$g xB3 t +^G x74 +^g x51 +^g x43 +^g x41 +^g x23 +^g x21 +^g x18 +$g x14 Y4 +$g x05 $w +$G ^x +$g $w x05 +$G $W +$g $w +^g ^w +^G ^V y1 +$g ^v s2j +^g ^V +^g u y2 +$g $U u +$g u $U +$G u $H +$G u ,5 +$G $u +$g t xB3 +^g snf +^g sk_ +^g s.g +^g s9g +^G s8R +$g s5c +$g s2j ^v +$G s%@ +^g $s +^G r x21 +^G ^R o3h +^g ^r ^i +^g r $G +$g R4 D5 +^g R4 *23 +$g r *12 +$G $r ^1 +^G ^R +^g ^R +^g $r +$G q *81 +$G p1 x02 +^g $p +$g $o Z1 +$? $g oAG +^g o97 D7 +^G o91 Y1 +^G o80 *96 +^g o8$ +$g o6u +$G o6a +^g o62 +^g o6# $1 +^g o6% +$g o5t +$g o5i +^g o5h +^g o5d +^G o5 +^g o5? +$G o4y $M +$G o4F +^G o42 +^G o3s +$G o3@ +^g o2v +^g o1r +^G o1p iA0 +$g o1p +^G o1h +^g o15 +^g o1. +^G o0x i6t +$g o0g +$G $O +^G ^o +^g ^O +$G $M o4y +^G ^m +$G l Y1 +^g l *51 +$g $l +^G ^K +^G $k +$g ^j +^g ^j +^G iA0 o1p +^g i8_ +^G i7s x14 +^G i6t o0x +$g i6s +$G i6i +} ^g i6e +^g i66 +$g i6^ +$g i5z +$g i5m +^g i5m +^g i5e +^G i5@ +$g i5- +^g i4w +$g i4m +^g i46 +$G i42 +^G i3s +^G i3i +^g i3i +^g i3d +^g i3, +^g i2b +$g i29 +^g i1W +^g i1v +^G i1o +$g i1n +^g i1m +$g i1h +^g i13 +^g i0T +^g i0m +$G i0l +^G i0D +} $g i0D +^G ^I +^g ^i +$G $H u +$G $H +^g $g *02 +^g { $G +$G $F +$G f +^G E y1 +$G $e +^g $E +$g D9 +$G D7 D2 +^g $d *62 +$g D5 R4 +^g D3 +2 +^G c z3 +^g c y1 +$G c +0 +$G $C +$G ^C +$g $c +$G $b +^g -A x61 +^g +A +} $g ^a +^G *96 o80 +^g *86 +$G +8 +$g ,7 i0G +^g *78 *86 +^G *68 $g +$g *68 +^g *62 $d +^g -6 $2 +^G $6 +$g -6 +^g ,6 +$G ,5 u +^g *57 +$G *56 D4 +$G *54 +^g *51 l +^g $5 +^g -5 +^G *43 +^G ,4 +^g *38 D6 +$g *37 +$g .3 -2 +^g *30 +$g ^3 +^G .2 Y2 +^g +2 D3 +^g $2 -6 +^g *23 R4 +$g -2 .3 +$G *20 $. +$G $. *20 +$g ^2 +$G ^1 $r +^g $1 o6# +^g *19 +^G ^1 +$G +0 c +^g *02 $g +$g -0 +$G $* +^G } $! +^G } +^G ^# +^G ^? +$g $* +$g $. +$g $/ +$g ^! +$* ^g +^g $) +^+ ^g +^$ $g +^' $g +^/ ^g +^ ^g +f $z x59 +^f z3 +^f z2 ,4 +$f Z2 +$f [ z2 +^f z1 *79 +$f Z1 +4 +^f ^Z +$f $z +^f y5 x03 +f y5 i6H +^F y5 +f y4 x98 +^F Y3 +f Y2 x79 +f y2 K +f Y2 *57 +$F y2 +$f Y1 y1 +$f y1 Y1 +} $f $y +f xB7 +f xA8 k +f xA7 *86 +f xA6 +f xA5 x65 +f xA3 ,9 +f xA1 x61 +f x96 c +f x95 +f x92 u +f x8B T0 +f x8B +f x86 -6 +f x84 ^m +f x83 u +f x82 K +$f x82 +f x81 $( +f $( x81 +f [ x81 +f x7A i65 +f x7A +3 +f x79 Y2 +f x78 E +f x76 $5 +f x75 ] +f ] x75 +f x74 k +f x73 C +^f x73 +f x72 +$f x72 +} ^f x72 +f x71 +f { x69 +f x67 E +f x67 [ +f x64 T3 +f x64 s4x +f x64 o3q +f x64 +f x63 *79 +f x62 c +f x62 +4 +f x62 *34 +f x61 $9 +f x59 $z +f x59 o38 +f x59 i2s +f x59 c +f x58 *57 +$f x58 +f x57 sJN +f x57 o5d +f x57 $F +f x57 $^ +f $^ x57 +f x56 *97 +f x56 +f x54 T0 +f x51 s5O +f x51 $9 +f x51 +f x47 $^ +f $^ x47 +f x45 i78 +f x43 ^J +f x42 x63 +f x42 x62 +f x42 k +f x39 +1 +f x38 *32 +f x38 +f x37 x41 +f x37 ] +f ] x37 +f x36 t +f x36 +f x35 t +f x34 K +f x28 t +} f x28 +f x26 +f x25 +f x24 -3 +f $ x24 +^f x23 ^j +$f x23 +^f x21 +f x19 x21 +f x17 D5 +^f x16 i02 +f x15 r +f x14 $s +f x14 +^f x13 +f x12 *31 +f x05 x35 +f x04 ] +f ] x04 +$f x03 q +f x03 D5 +f x02 +3 +^F ^X +f $w Z2 +f $w +} ^f ^v +$F $u Y2 +f u x92 +f u x83 +f t x36 +f t x35 +f t x28 +^F ^T i2X +f t $i +^f t d +f T8 T0 +^F T4 -1 +f T3 x64 +f t *12 +f T0 x8B +f T0 x54 +f T0 T8 +f $s x14 +^f smg *32 +^f sm/ +f sJN x57 +$f sf9 i2j +$f sdu +f s5O x51 +f s4x x64 +f s2` i4e +^F s2F +$F $S +^F ^R l +$F r ^H +^f r ^3 +^F $R +$F $r +^F ^r +{ $f r +^F q q +^F p4 'A +f p1 x86 +$f $p +$f ^o x03 +f $o o7k +f oB3 *75 +f oAk +f oAb x28 +f o9R +^F o91 +^f o8x i21 +f o7k $o +^F o77 +f o75 +$F o71 +^f o71 +^f o6s +$f o6c +f o5l +[ $F o5F +f o54 +^f o5- +^f o4R c +$f o4o +^F o41 +^F o4- +^f o3v +f o3q x64 +$f o3g +f o38 x59 +^f o2v +f o2s ,3 +^f o2p +$f o2n +$f o2j +$F o2i D3 +$f o2h +^F o2A +$f o19 *70 +f o0A +^F ^N +f $M +^f ^M +$f L4 +^f L3 *50 +^F ^L +$F $l +f K y2 +f k xA8 +f K x96 +f K x82 +f k x74 +f k x42 +f K x34 +^F k ^T +f K E +$f K ^a +f K *97 +f k *78 +f K *75 +f K *67 +f k *67 +f k *42 +[ ^f K +[ f k +^f $J r +$f $j +f $i t +f i9< x2A +^F i99 +f i8X +$f i8h +$F i81 p3 +f i7* E +$F i79 +f i76 +$f i6w +$F i6p +^f i6m +$F i6h p4 +^f i6g +^f i6e +$F i61 +f i6* +f i6_ +$F i5f +^f i4z +$F i4y +f i4t +{ $F i4S +f i4e s2` +$f i4e +$f i44 ^9 +$f i3v +^f i3v +f i3s $0 +^F i3L +$f i3l +$f i2j sf9 +$f i2d +^f i21 +^f i1w +^f i1o +$f i1k +^F i1H +^F i1h +$f i1g +[ $f i1e +$F i1c +$f i0Y +^F i0W +^f ^i +^F ^H +$F $g +f $F x57 +$f $F +3 +$F ^F +$f ^F +f E x78 +f E x67 +f E K +f E i7* +^f ^e ^b +^F $e *14 +^f d t +f D9 ] +f ] D9 +f D7 x93 +^F D7 +f D5 $9 +$f D5 +f D4 *85 +$f D4 { +^f D4 +$F D3 o2i +$F $d +f c x96 +f C x73 +f c x62 +f c x59 +$f ^c o8_ +$F C $C +$F $C C +} $f $c +f 'B x61 +f *BA *98 +f *B8 *65 +f *B3 x12 +^f $b +3 +$f ,B +$f ^b +$f ^a K +$F $A .9 +f *A8 -5 +^F $a +f ,9 xA3 +f $9 x61 +f $9 x51 +f '9 $x +$f ^9 i44 +f $9 D5 +$F .9 $A +f *98 *BA +f *97 K +f *97 *B9 +^F +9 ,3 +f -9 -0 +^f $9 +$f $8 Y2 +f *87 *02 +f *86 xA7 +f *7A *54 +f *78 k +$f *78 +{ f *76 +f *75 oB3 +f *75 K +^F *74 +f *72 x57 +$f *72 *53 +$f *70 o19 +^F -7 +f $7 +^f -7 +^f ^7 +f -6 x86 +f *67 K +f *67 k +f *67 *03 +f *67 +f *65 *B8 +f *64 +f *63 x53 +^F *62 +^f *61 +^F ^6 +$f $6 +$f .6 +^f ,6 +f $5 x76 +f -5 *A8 +^F *57 +f *54 *7A +^F *54 +^f *54 +$f *53 *72 +$f *53 +^F *52 +$f *52 +f *51 z5 +^f *50 L3 +$F +5 +f $5 +f ] ,5 +f ,5 ] +f ,5 +^f +5 +^f .5 +$f +4 Z1 +f +4 x62 +f *43 x4A +^f } *43 +f *42 k +f *40 ] +f ] *40 +^F +4 +f $4 [ +f [ $4 +$) f -4 +^f .4 +^f ,4 +f +3 x7A +$f +3 $F +^f +3 $b +^F ,3 +9 +f *34 x62 +$f *34 ^r +^f *32 smg +^F .3 ,2 +^F *31 *21 +f *31 +^F ^3 +$f *23 *72 +f *23 *05 +^F ,2 .3 +f *21 +f *20 +^F +2 +f ,2 +f +1 x39 +^F -1 T4 +f *18 x01 +^F *14 $e +f *12 t +f $1 +f $0 i3s +f -0 -9 +f *07 { +f *05 *23 +^f *05 +f *04 +f *03 *67 +$f *03 +f *02 *87 +$F +0 +$F ^0 +f $0 +^f $0 +^f ^0 +$F ^/ +} $F +[ $@ ^F +[ ^F $@ +^F $+ +^@ $F +^- ^F +^_ ^F +f $. +f $? $? +$f $? +$f $, +$@ $f +$/ ^f +$= $f +} ^f +{ $f +[ $+ ^f +[ $# ^f +[ ^f $+ +[ ^f $# +^f $@ +^f ] +^f ^) +^% $f +E z5 x34 +E $$ Z5 +$e Z4 z3 +$e z3 Z4 +$E Z3 Z3 +E Z3 +$E Z3 +$. E Z3 +E ^$ z3 +E Z2 T2 +E z2 o0W +E Z2 ^1 +E z2 ^0 +{ E Z2 +^E } z2 +^& ^e z2 +$e Z1 Y3 +E Z1 TB +E Z1 o5L +E Z1 ^J +E z1 i1c +$E Z1 +$* E Z1 +E $z +^E ^Y u +E $y $8 +E y5 x51 +E Y5 x34 +E Y5 x21 +E Y5 x17 +E Y5 x13 +E y5 +E y4 x57 +^E Y4 x45 +E Y4 o2T +^e Y4 ^m +E y4 +4 +^E Y4 +E y3 y3 +^E y3 y3 +$e y3 Y2 +$e Y3 x24 +E Y3 o2@ +^E y3 E +^e Y3 *53 +E y3 *51 +$E y3 +$e Y3 ] +$e Y2 y3 +^E Y2 Y2 +E Y2 T5 +E Y2 o1V +E Y2 $m +E y2 i1e +E Y2 .8 +$e Y2 -4 +E y2 +2 +E Y2 -1 +E y2 +$e [ y2 +E Y1 o32 +E Y1 o2. +E Y1 i5D +$e Y1 E +$* E Y1 +$e Y1 +^e y1 +$E xB2 +E xB1 T5 +^e xA2 +$e x92 t +E x83 +3 +E x82 Y2 +E x82 o1o +E x81 $@ +E $@ x81 +$@ E x81 +[ E x81 +E x74 T1 +$e x72 +^e x72 +E x71 D1 +$e x71 +E x64 $7 +E x63 +$e x63 +E x62 o7l +$e x62 $d +E x62 *23 +E x61 T6 +E ^@ x61 +E x61 +$e x56 +E x52 T6 +E x52 o47 +E x51 z2 +^E x46 +^E x45 Y4 +^E x43 +^e x42 t +E x42 ^. +E x41 i0G +E x41 $a +E x37 x37 +^e x37 +$E x36 +$e x34 i6Y +E x34 +^e x34 +{ E x32 +$e x24 Y3 +E x24 p4 +$E x23 $r +E x23 $5 +E x23 +E x21 Y5 +E x21 $L +$e x14 { +E x12 T2 +E x12 $9 +^E x12 +$E { x02 +^e $x +$E $w +^e ^v +^E u ^Y +E ^u ^T +$e u o9I +$E u $O +$E u $2 +] $e u +$e t x92 +^e t x42 +E TB Z1 +E T9 'A +E T9 +^E T8 diff --git a/rules/hybrid/append_d.rule b/rules/hybrid/append_d.rule new file mode 100644 index 0000000000..7548faad7c --- /dev/null +++ b/rules/hybrid/append_d.rule @@ -0,0 +1,10 @@ +$0 +$1 +$2 +$3 +$4 +$5 +$6 +$7 +$8 +$9 diff --git a/rules/hybrid/append_ds.rule b/rules/hybrid/append_ds.rule new file mode 100644 index 0000000000..d680f5d81d --- /dev/null +++ b/rules/hybrid/append_ds.rule @@ -0,0 +1,43 @@ +$0 +$1 +$2 +$3 +$4 +$5 +$6 +$7 +$8 +$9 +$ +$! +$" +$# +$$ +$% +$& +$' +$( +$) +$* +$+ +$, +$- +$. +$/ +$: +$; +$< +$= +$> +$? +$@ +$[ +$\ +$] +$^ +$_ +$` +${ +$| +$} +$~ diff --git a/rules/hybrid/append_du.rule b/rules/hybrid/append_du.rule new file mode 100644 index 0000000000..94efa085ba --- /dev/null +++ b/rules/hybrid/append_du.rule @@ -0,0 +1,36 @@ +$0 +$1 +$2 +$3 +$4 +$5 +$6 +$7 +$8 +$9 +$A +$B +$C +$D +$E +$F +$G +$H +$I +$J +$K +$L +$M +$N +$O +$P +$Q +$R +$S +$T +$U +$V +$W +$X +$Y +$Z diff --git a/rules/hybrid/append_dus.rule b/rules/hybrid/append_dus.rule new file mode 100644 index 0000000000..201d5baf4a --- /dev/null +++ b/rules/hybrid/append_dus.rule @@ -0,0 +1,69 @@ +$0 +$1 +$2 +$3 +$4 +$5 +$6 +$7 +$8 +$9 +$A +$B +$C +$D +$E +$F +$G +$H +$I +$J +$K +$L +$M +$N +$O +$P +$Q +$R +$S +$T +$U +$V +$W +$X +$Y +$Z +$ +$! +$" +$# +$$ +$% +$& +$' +$( +$) +$* +$+ +$, +$- +$. +$/ +$: +$; +$< +$= +$> +$? +$@ +$[ +$\ +$] +$^ +$_ +$` +${ +$| +$} +$~ diff --git a/rules/hybrid/append_hl.rule b/rules/hybrid/append_hl.rule new file mode 100644 index 0000000000..bb77bfed94 --- /dev/null +++ b/rules/hybrid/append_hl.rule @@ -0,0 +1,16 @@ +$0 +$1 +$2 +$3 +$4 +$5 +$6 +$7 +$8 +$9 +$a +$b +$c +$d +$e +$f diff --git a/rules/hybrid/append_hu.rule b/rules/hybrid/append_hu.rule new file mode 100644 index 0000000000..476e1ebb43 --- /dev/null +++ b/rules/hybrid/append_hu.rule @@ -0,0 +1,16 @@ +$0 +$1 +$2 +$3 +$4 +$5 +$6 +$7 +$8 +$9 +$A +$B +$C +$D +$E +$F diff --git a/rules/hybrid/append_l.rule b/rules/hybrid/append_l.rule new file mode 100644 index 0000000000..e26f48a129 --- /dev/null +++ b/rules/hybrid/append_l.rule @@ -0,0 +1,26 @@ +$a +$b +$c +$d +$e +$f +$g +$h +$i +$j +$k +$l +$m +$n +$o +$p +$q +$r +$s +$t +$u +$v +$w +$x +$y +$z diff --git a/rules/hybrid/append_ld.rule b/rules/hybrid/append_ld.rule new file mode 100644 index 0000000000..2582730928 --- /dev/null +++ b/rules/hybrid/append_ld.rule @@ -0,0 +1,36 @@ +$a +$b +$c +$d +$e +$f +$g +$h +$i +$j +$k +$l +$m +$n +$o +$p +$q +$r +$s +$t +$u +$v +$w +$x +$y +$z +$0 +$1 +$2 +$3 +$4 +$5 +$6 +$7 +$8 +$9 diff --git a/rules/hybrid/append_lds.rule b/rules/hybrid/append_lds.rule new file mode 100644 index 0000000000..cf71001e2f --- /dev/null +++ b/rules/hybrid/append_lds.rule @@ -0,0 +1,69 @@ +$a +$b +$c +$d +$e +$f +$g +$h +$i +$j +$k +$l +$m +$n +$o +$p +$q +$r +$s +$t +$u +$v +$w +$x +$y +$z +$0 +$1 +$2 +$3 +$4 +$5 +$6 +$7 +$8 +$9 +$ +$! +$" +$# +$$ +$% +$& +$' +$( +$) +$* +$+ +$, +$- +$. +$/ +$: +$; +$< +$= +$> +$? +$@ +$[ +$\ +$] +$^ +$_ +$` +${ +$| +$} +$~ diff --git a/rules/hybrid/append_ldu.rule b/rules/hybrid/append_ldu.rule new file mode 100644 index 0000000000..55fe9bec3f --- /dev/null +++ b/rules/hybrid/append_ldu.rule @@ -0,0 +1,62 @@ +$a +$b +$c +$d +$e +$f +$g +$h +$i +$j +$k +$l +$m +$n +$o +$p +$q +$r +$s +$t +$u +$v +$w +$x +$y +$z +$0 +$1 +$2 +$3 +$4 +$5 +$6 +$7 +$8 +$9 +$A +$B +$C +$D +$E +$F +$G +$H +$I +$J +$K +$L +$M +$N +$O +$P +$Q +$R +$S +$T +$U +$V +$W +$X +$Y +$Z diff --git a/rules/hybrid/append_ldus.rule b/rules/hybrid/append_ldus.rule new file mode 100644 index 0000000000..d618b7c8eb --- /dev/null +++ b/rules/hybrid/append_ldus.rule @@ -0,0 +1,95 @@ +$a +$b +$c +$d +$e +$f +$g +$h +$i +$j +$k +$l +$m +$n +$o +$p +$q +$r +$s +$t +$u +$v +$w +$x +$y +$z +$0 +$1 +$2 +$3 +$4 +$5 +$6 +$7 +$8 +$9 +$A +$B +$C +$D +$E +$F +$G +$H +$I +$J +$K +$L +$M +$N +$O +$P +$Q +$R +$S +$T +$U +$V +$W +$X +$Y +$Z +$ +$! +$" +$# +$$ +$% +$& +$' +$( +$) +$* +$+ +$, +$- +$. +$/ +$: +$; +$< +$= +$> +$? +$@ +$[ +$\ +$] +$^ +$_ +$` +${ +$| +$} +$~ diff --git a/rules/hybrid/append_ls.rule b/rules/hybrid/append_ls.rule new file mode 100644 index 0000000000..9503445889 --- /dev/null +++ b/rules/hybrid/append_ls.rule @@ -0,0 +1,59 @@ +$a +$b +$c +$d +$e +$f +$g +$h +$i +$j +$k +$l +$m +$n +$o +$p +$q +$r +$s +$t +$u +$v +$w +$x +$y +$z +$ +$! +$" +$# +$$ +$% +$& +$' +$( +$) +$* +$+ +$, +$- +$. +$/ +$: +$; +$< +$= +$> +$? +$@ +$[ +$\ +$] +$^ +$_ +$` +${ +$| +$} +$~ diff --git a/rules/hybrid/append_lu.rule b/rules/hybrid/append_lu.rule new file mode 100644 index 0000000000..6ad0efbe96 --- /dev/null +++ b/rules/hybrid/append_lu.rule @@ -0,0 +1,52 @@ +$a +$b +$c +$d +$e +$f +$g +$h +$i +$j +$k +$l +$m +$n +$o +$p +$q +$r +$s +$t +$u +$v +$w +$x +$y +$z +$A +$B +$C +$D +$E +$F +$G +$H +$I +$J +$K +$L +$M +$N +$O +$P +$Q +$R +$S +$T +$U +$V +$W +$X +$Y +$Z diff --git a/rules/hybrid/append_lus.rule b/rules/hybrid/append_lus.rule new file mode 100644 index 0000000000..048d944568 --- /dev/null +++ b/rules/hybrid/append_lus.rule @@ -0,0 +1,85 @@ +$a +$b +$c +$d +$e +$f +$g +$h +$i +$j +$k +$l +$m +$n +$o +$p +$q +$r +$s +$t +$u +$v +$w +$x +$y +$z +$A +$B +$C +$D +$E +$F +$G +$H +$I +$J +$K +$L +$M +$N +$O +$P +$Q +$R +$S +$T +$U +$V +$W +$X +$Y +$Z +$ +$! +$" +$# +$$ +$% +$& +$' +$( +$) +$* +$+ +$, +$- +$. +$/ +$: +$; +$< +$= +$> +$? +$@ +$[ +$\ +$] +$^ +$_ +$` +${ +$| +$} +$~ diff --git a/rules/hybrid/append_s.rule b/rules/hybrid/append_s.rule new file mode 100644 index 0000000000..0a59cc5f6e --- /dev/null +++ b/rules/hybrid/append_s.rule @@ -0,0 +1,33 @@ +$ +$! +$" +$# +$$ +$% +$& +$' +$( +$) +$* +$+ +$, +$- +$. +$/ +$: +$; +$< +$= +$> +$? +$@ +$[ +$\ +$] +$^ +$_ +$` +${ +$| +$} +$~ diff --git a/rules/hybrid/append_u.rule b/rules/hybrid/append_u.rule new file mode 100644 index 0000000000..a07ec74822 --- /dev/null +++ b/rules/hybrid/append_u.rule @@ -0,0 +1,26 @@ +$A +$B +$C +$D +$E +$F +$G +$H +$I +$J +$K +$L +$M +$N +$O +$P +$Q +$R +$S +$T +$U +$V +$W +$X +$Y +$Z diff --git a/rules/hybrid/append_us.rule b/rules/hybrid/append_us.rule new file mode 100644 index 0000000000..e85dab3d15 --- /dev/null +++ b/rules/hybrid/append_us.rule @@ -0,0 +1,59 @@ +$A +$B +$C +$D +$E +$F +$G +$H +$I +$J +$K +$L +$M +$N +$O +$P +$Q +$R +$S +$T +$U +$V +$W +$X +$Y +$Z +$ +$! +$" +$# +$$ +$% +$& +$' +$( +$) +$* +$+ +$, +$- +$. +$/ +$: +$; +$< +$= +$> +$? +$@ +$[ +$\ +$] +$^ +$_ +$` +${ +$| +$} +$~ diff --git a/rules/hybrid/prepend_d.rule b/rules/hybrid/prepend_d.rule new file mode 100644 index 0000000000..8e565551e9 --- /dev/null +++ b/rules/hybrid/prepend_d.rule @@ -0,0 +1,10 @@ +^0 +^1 +^2 +^3 +^4 +^5 +^6 +^7 +^8 +^9 diff --git a/rules/hybrid/prepend_ds.rule b/rules/hybrid/prepend_ds.rule new file mode 100644 index 0000000000..70b51a07b8 --- /dev/null +++ b/rules/hybrid/prepend_ds.rule @@ -0,0 +1,43 @@ +^0 +^1 +^2 +^3 +^4 +^5 +^6 +^7 +^8 +^9 +^ +^! +^" +^# +^$ +^% +^& +^' +^( +^) +^* +^+ +^, +^- +^. +^/ +^: +^; +^< +^= +^> +^? +^@ +^[ +^\ +^] +^^ +^_ +^` +^{ +^| +^} +^~ diff --git a/rules/hybrid/prepend_du.rule b/rules/hybrid/prepend_du.rule new file mode 100644 index 0000000000..06a234f9f5 --- /dev/null +++ b/rules/hybrid/prepend_du.rule @@ -0,0 +1,36 @@ +^0 +^1 +^2 +^3 +^4 +^5 +^6 +^7 +^8 +^9 +^A +^B +^C +^D +^E +^F +^G +^H +^I +^J +^K +^L +^M +^N +^O +^P +^Q +^R +^S +^T +^U +^V +^W +^X +^Y +^Z diff --git a/rules/hybrid/prepend_dus.rule b/rules/hybrid/prepend_dus.rule new file mode 100644 index 0000000000..03d5036025 --- /dev/null +++ b/rules/hybrid/prepend_dus.rule @@ -0,0 +1,69 @@ +^0 +^1 +^2 +^3 +^4 +^5 +^6 +^7 +^8 +^9 +^A +^B +^C +^D +^E +^F +^G +^H +^I +^J +^K +^L +^M +^N +^O +^P +^Q +^R +^S +^T +^U +^V +^W +^X +^Y +^Z +^ +^! +^" +^# +^$ +^% +^& +^' +^( +^) +^* +^+ +^, +^- +^. +^/ +^: +^; +^< +^= +^> +^? +^@ +^[ +^\ +^] +^^ +^_ +^` +^{ +^| +^} +^~ diff --git a/rules/hybrid/prepend_hl.rule b/rules/hybrid/prepend_hl.rule new file mode 100644 index 0000000000..38c3300a2a --- /dev/null +++ b/rules/hybrid/prepend_hl.rule @@ -0,0 +1,16 @@ +^0 +^1 +^2 +^3 +^4 +^5 +^6 +^7 +^8 +^9 +^a +^b +^c +^d +^e +^f diff --git a/rules/hybrid/prepend_hu.rule b/rules/hybrid/prepend_hu.rule new file mode 100644 index 0000000000..ff3496d824 --- /dev/null +++ b/rules/hybrid/prepend_hu.rule @@ -0,0 +1,16 @@ +^0 +^1 +^2 +^3 +^4 +^5 +^6 +^7 +^8 +^9 +^A +^B +^C +^D +^E +^F diff --git a/rules/hybrid/prepend_l.rule b/rules/hybrid/prepend_l.rule new file mode 100644 index 0000000000..c2c24f2a9e --- /dev/null +++ b/rules/hybrid/prepend_l.rule @@ -0,0 +1,26 @@ +^a +^b +^c +^d +^e +^f +^g +^h +^i +^j +^k +^l +^m +^n +^o +^p +^q +^r +^s +^t +^u +^v +^w +^x +^y +^z diff --git a/rules/hybrid/prepend_ld.rule b/rules/hybrid/prepend_ld.rule new file mode 100644 index 0000000000..0224bfc56e --- /dev/null +++ b/rules/hybrid/prepend_ld.rule @@ -0,0 +1,36 @@ +^a +^b +^c +^d +^e +^f +^g +^h +^i +^j +^k +^l +^m +^n +^o +^p +^q +^r +^s +^t +^u +^v +^w +^x +^y +^z +^0 +^1 +^2 +^3 +^4 +^5 +^6 +^7 +^8 +^9 diff --git a/rules/hybrid/prepend_lds.rule b/rules/hybrid/prepend_lds.rule new file mode 100644 index 0000000000..8b71c05c18 --- /dev/null +++ b/rules/hybrid/prepend_lds.rule @@ -0,0 +1,69 @@ +^a +^b +^c +^d +^e +^f +^g +^h +^i +^j +^k +^l +^m +^n +^o +^p +^q +^r +^s +^t +^u +^v +^w +^x +^y +^z +^0 +^1 +^2 +^3 +^4 +^5 +^6 +^7 +^8 +^9 +^ +^! +^" +^# +^$ +^% +^& +^' +^( +^) +^* +^+ +^, +^- +^. +^/ +^: +^; +^< +^= +^> +^? +^@ +^[ +^\ +^] +^^ +^_ +^` +^{ +^| +^} +^~ diff --git a/rules/hybrid/prepend_ldu.rule b/rules/hybrid/prepend_ldu.rule new file mode 100644 index 0000000000..1d1fa92a88 --- /dev/null +++ b/rules/hybrid/prepend_ldu.rule @@ -0,0 +1,62 @@ +^a +^b +^c +^d +^e +^f +^g +^h +^i +^j +^k +^l +^m +^n +^o +^p +^q +^r +^s +^t +^u +^v +^w +^x +^y +^z +^0 +^1 +^2 +^3 +^4 +^5 +^6 +^7 +^8 +^9 +^A +^B +^C +^D +^E +^F +^G +^H +^I +^J +^K +^L +^M +^N +^O +^P +^Q +^R +^S +^T +^U +^V +^W +^X +^Y +^Z diff --git a/rules/hybrid/prepend_ldus.rule b/rules/hybrid/prepend_ldus.rule new file mode 100644 index 0000000000..0638b49d39 --- /dev/null +++ b/rules/hybrid/prepend_ldus.rule @@ -0,0 +1,95 @@ +^a +^b +^c +^d +^e +^f +^g +^h +^i +^j +^k +^l +^m +^n +^o +^p +^q +^r +^s +^t +^u +^v +^w +^x +^y +^z +^0 +^1 +^2 +^3 +^4 +^5 +^6 +^7 +^8 +^9 +^A +^B +^C +^D +^E +^F +^G +^H +^I +^J +^K +^L +^M +^N +^O +^P +^Q +^R +^S +^T +^U +^V +^W +^X +^Y +^Z +^ +^! +^" +^# +^$ +^% +^& +^' +^( +^) +^* +^+ +^, +^- +^. +^/ +^: +^; +^< +^= +^> +^? +^@ +^[ +^\ +^] +^^ +^_ +^` +^{ +^| +^} +^~ diff --git a/rules/hybrid/prepend_ls.rule b/rules/hybrid/prepend_ls.rule new file mode 100644 index 0000000000..eeefcd1838 --- /dev/null +++ b/rules/hybrid/prepend_ls.rule @@ -0,0 +1,59 @@ +^a +^b +^c +^d +^e +^f +^g +^h +^i +^j +^k +^l +^m +^n +^o +^p +^q +^r +^s +^t +^u +^v +^w +^x +^y +^z +^ +^! +^" +^# +^$ +^% +^& +^' +^( +^) +^* +^+ +^, +^- +^. +^/ +^: +^; +^< +^= +^> +^? +^@ +^[ +^\ +^] +^^ +^_ +^` +^{ +^| +^} +^~ diff --git a/rules/hybrid/prepend_lu.rule b/rules/hybrid/prepend_lu.rule new file mode 100644 index 0000000000..bc1e624e24 --- /dev/null +++ b/rules/hybrid/prepend_lu.rule @@ -0,0 +1,52 @@ +^a +^b +^c +^d +^e +^f +^g +^h +^i +^j +^k +^l +^m +^n +^o +^p +^q +^r +^s +^t +^u +^v +^w +^x +^y +^z +^A +^B +^C +^D +^E +^F +^G +^H +^I +^J +^K +^L +^M +^N +^O +^P +^Q +^R +^S +^T +^U +^V +^W +^X +^Y +^Z diff --git a/rules/hybrid/prepend_lus.rule b/rules/hybrid/prepend_lus.rule new file mode 100644 index 0000000000..4b7f5e3998 --- /dev/null +++ b/rules/hybrid/prepend_lus.rule @@ -0,0 +1,85 @@ +^a +^b +^c +^d +^e +^f +^g +^h +^i +^j +^k +^l +^m +^n +^o +^p +^q +^r +^s +^t +^u +^v +^w +^x +^y +^z +^A +^B +^C +^D +^E +^F +^G +^H +^I +^J +^K +^L +^M +^N +^O +^P +^Q +^R +^S +^T +^U +^V +^W +^X +^Y +^Z +^ +^! +^" +^# +^$ +^% +^& +^' +^( +^) +^* +^+ +^, +^- +^. +^/ +^: +^; +^< +^= +^> +^? +^@ +^[ +^\ +^] +^^ +^_ +^` +^{ +^| +^} +^~ diff --git a/rules/hybrid/prepend_s.rule b/rules/hybrid/prepend_s.rule new file mode 100644 index 0000000000..85c018e0a3 --- /dev/null +++ b/rules/hybrid/prepend_s.rule @@ -0,0 +1,33 @@ +^ +^! +^" +^# +^$ +^% +^& +^' +^( +^) +^* +^+ +^, +^- +^. +^/ +^: +^; +^< +^= +^> +^? +^@ +^[ +^\ +^] +^^ +^_ +^` +^{ +^| +^} +^~ diff --git a/rules/hybrid/prepend_u.rule b/rules/hybrid/prepend_u.rule new file mode 100644 index 0000000000..f1e4ada221 --- /dev/null +++ b/rules/hybrid/prepend_u.rule @@ -0,0 +1,26 @@ +^A +^B +^C +^D +^E +^F +^G +^H +^I +^J +^K +^L +^M +^N +^O +^P +^Q +^R +^S +^T +^U +^V +^W +^X +^Y +^Z diff --git a/rules/hybrid/prepend_us.rule b/rules/hybrid/prepend_us.rule new file mode 100644 index 0000000000..c56105c12a --- /dev/null +++ b/rules/hybrid/prepend_us.rule @@ -0,0 +1,59 @@ +^A +^B +^C +^D +^E +^F +^G +^H +^I +^J +^K +^L +^M +^N +^O +^P +^Q +^R +^S +^T +^U +^V +^W +^X +^Y +^Z +^ +^! +^" +^# +^$ +^% +^& +^' +^( +^) +^* +^+ +^, +^- +^. +^/ +^: +^; +^< +^= +^> +^? +^@ +^[ +^\ +^] +^^ +^_ +^` +^{ +^| +^} +^~ diff --git a/rules/leetspeak.rule b/rules/leetspeak.rule new file mode 100644 index 0000000000..50889ae782 --- /dev/null +++ b/rules/leetspeak.rule @@ -0,0 +1,29 @@ +## rule: leetspeak single +## limits: none +## example: john ---> j0hn +## extras: case original, lower, upper + +sa4 +sa@ +sb6 +sc< +sc{ +se3 +sg9 +si1 +si! +so0 +sq9 +ss5 +ss$ +st7 +st+ +sx% + +## rule: leetspeak multi +## limits: none +## example: johnbox ---> j0hnbox +## extras: all case variants + +sa@sc +i5y i61 R7 +o74 o86 +i4z o52 +i2b r +i3i i42 i50 i60 o76 +i3y i41 i50 o61 +$2 $1 $0 $0 +o5a i61 o74 +^e ^e ^l T3 +i72 i80 ss0 $8 +o0y $9 +i36 se6 $6 +o0t $0 $2 +o92 oA0 +^1 ^0 ^0 ^7 r +o3h o4o +i31 ss9 $8 $6 +i42 i50 ,6 $0 +ss2 $5 $6 +$T $E $A $M $O +o2z o3a +se3 ] +i1h o3e +o3r i4u +D5 o5r +o46 ss1 $9 +o4a $m +i6- o71 +i52 i60 ss0 $1 +l $r $a $y +o72 i80 ss0 $5 +o0a o1h +o0h $6 $9 +i37 i42 o51 +^k o2y +$y $l +o3i $2 $0 $0 $8 +i2l $e +o0h $1 $4 +$r r +o4y $j +i71 o8! +o0z $2 $7 +D5 $i +o1o $2 $1 +^1 ^0 ^4 o31 r +o0r o4a +ss3 $2 $7 +$6 $6 $2 +^1 ^6 o29 r +i6. ,7 ++4 o51 +o1a $1 $7 +^0 ^1 ^3 o32 r +i31 i41 i52 o67 +$5 $4 $4 +^j o5a +$0 $2 $1 $6 +o64 i7e o8v $a +i3g ,4 +l $3 $2 $6 +^1 $z +$7 $0 $0 r +l i68 ,7 +l o51 i69 i79 o83 +^1 ^1 ^2 ^6 r +o1u $5 +o5y $1 $0 $1 +^5 ^2 ^7 o32 r +i4_ i51 o62 +o54 $2 $0 +o5t $h +o3a $8 $6 +$8 $9 $9 +o5o $2 ++2 o4a +o0k $1 $9 $9 $9 +o4y o5h +o72 ss0 $0 $5 +se9 o64 +i67 i71 ,8 +i67 i78 R8 +$a $0 $2 +o2o $e +i3l i4e +o64 o7e $v $a +i51 i69 i78 o89 +o0c $0 $4 +[ i5i +$0 $9 $2 $7 +$^ +^1 o62 +l i1k +i91 oA0 oB1 +i45 o50 ,6 +o4o $1 $0 +i2u D5 +l o52 i60 i70 o84 +o5a $i +l i51 i69 ,7 o83 +.2 $3 +i3a ss1 $2 $3 +i43 o51 o63 +i44 i50 ,6 +o0i o4i r +l i1b +D2 +5 $a +o0c o4o +o0a $2 $4 +i64 o7m o8e +o5. ,6 +-0 i4i +o50 i60 o75 +o0z $6 $6 $6 +o0c i2a +D4 $l +o4k $y +o0x $1 $2 $3 +^1 ^0 ^6 o31 r +o4a $2 $7 +o3r i4a +$0 $1 $2 $6 +$o $0 $6 +ss1 $3 $7 +i1l ] +l i47 ,5 +i41 ss8 $7 +$1 $9 $1 $4 +o43 i51 o63 +$0 $4 $2 $2 +$1 $6 $1 $2 +o3i o4c +o3y $6 $9 +$0 $9 $1 $5 +i1g r +ss2 $3 $4 $5 +^i o4i r +ss$ $$ +,2 o5a +l o80 ,9 +o4m o51 +l ss1 $8 +sr1 $0 $0 +o57 ss1 $1 +o1a $a $1 +$3 $4 $1 +$0 $9 $1 $8 +$0 $5 $1 $7 +sr1 $9 $9 $5 +^s o1e +^z o3h r +l i6b o7o o8y +o0a i1d +$1 $1 $3 $4 +i31 i49 ss8 $6 +^8 ^0 T2 +^3 sa2 i21 r +i72 ss0 $0 $8 +^n $a +o3z $9 $1 +l i51 o69 i79 o83 +i69 R7 +o6s o71 +i3y o4a r +o3o o4i +o0w i1h +i52 ss0 $0 $1 +o0a $0 $6 +sa3 i12 i21 r +i51 ss1 $2 +$x $1 $2 $3 +D2 $5 $5 +$0 $5 $2 $4 +o32 i40 ss0 $0 +$7 $9 $9 $1 r +i4a i58 ,6 +$0 $2 $1 $9 +st1 $9 $9 $5 +$9 $7 $1 +^4 ^0 T2 +i4o i51 ,6 +i45 i51 ,6 +$2 $2 $0 $9 +D5 $5 +st1 $9 $9 $2 +o3g $a +o4o +5 +ss6 $5 $4 +o3n i4i +l i50 o68 +l i50 o67 +l o71 i80 ,9 +o0s $9 +o2u $1 $2 +sy4 $1 +l ss6 $9 +$y $1 $4 $3 +$g $2 +sy2 $2 $2 +sr1 $2 $3 $4 $5 $6 +o4i $u +^1 ^0 ^0 ^3 r +i2k o4i +-0 $2 $0 $0 $6 +i4o i52 o61 +l o6r i7o $e +o4o o5i +o0e $i +o5a i61 o70 +i31 o49 ss9 $2 +st0 $0 $7 +i1w $1 +o0t i1u +D3 i4u +o31 ss9 $8 $9 +i52 o60 ,7 $0 +i3h o4u +o3n $o +$6 $4 $6 +-2 o3i +[ i1h r +i4a o51 o62 +o32 o41 +i31 o49 ss8 $9 +.5 $a ++3 i4i +o70 $4 +^j $0 $6 +i2e i3n +o0n $0 $2 +i5l ,6 +^8 o58 +i31 i49 o58 o64 +sg2 $3 +,3 o5a +$9 $8 $8 +o3u $e +l $1 $1 $2 $8 +o2r o61 +i41 i51 i60 o71 +i4b o5a r +l o5k o61 +i31 i43 o58 +o81 ss0 $1 +i2o $o +o3i $8 +^k o2e +o4a o5g +i4y se0 o61 +st6 $9 +o48 $6 +i2e o5n +$1 $4 $1 $7 +^0 ^2 ^5 +o5m $o +D4 $1 $8 +$1 $2 $3 $@ +i41 o50 ss1 $0 +$1 $0 $1 r +o9z +D1 $1 $1 $1 $1 +o3i o5z +o1s $2 $0 $0 $6 +o2k i3u +o0p D3 +o0m $9 $4 +o0c o61 +D1 o5e +o3g o4u +o0d $. +l o51 i69 i79 o81 +^r o1y +l $6 $1 $2 +i1i i2c +^1 ^1 ^2 o31 r +o73 ss2 $1 +o0M $1 +l o5# o61 +^4 ^1 ^2 +o5r ] +i51 ,6 $1 +D5 o58 +o31 i49 ss8 $9 +i62 ss0 $0 $3 +o5m o6a $e +i41 o52 o64 +i42 i51 o68 +^4 ^3 ^2 ^1 o45 r +l $# $2 +$1 $5 $2 $1 +[ $2 $0 $0 $1 +o0p $0 $6 +$e $1 $1 +o31 i49 ss9 $2 +o0m $2 $0 $0 $6 +^a i4i +i82 R9 +i2d ] +i38 ss8 $8 +o3y o5u +$1 $2 $4 $3 +o51 $1 $1 +$- $3 +l i6e +i61 i79 ,8 ,9 +i3a i46 o59 +l o57 o66 +i61 o79 i89 ,9 +o52 $9 +ss2 $0 $3 +o0j $7 $2 +st2 $0 $0 $0 +o0d $9 $2 +o41 ss0 $1 $0 +l i51 i69 ,7 o81 +i52 i64 o76 +R7 $1 +o10 ,2 +,3 $0 $9 +i89 o95 +o0d $2 $9 +o0m i5i +sy6 $5 +^3 ^3 ^3 o33 r +$0 $6 $0 $1 +sn0 $8 +i5m o6a o7e +i62 i70 ss0 $3 +o0k -2 +i4o r +i41 ss8 $2 +o3r $o +l i71 o80 ,9 +o0d i3e +$= $1 +i39 i41 o50 +se9 o61 +i61 i74 o87 +o5a $h +o4a $! +$3 $5 $8 +i3i i49 o53 +o4o $0 $1 +i63 i76 o80 +o1a i3y +^1 ^1 o20 r +ss4 $2 $3 +^3 ^6 +o0z $0 $2 +o0d o3a +o2e o5z +i1o $i +o32 ss0 $0 $0 +$0 $9 $1 $4 +o41 i50 ss1 $0 +o3a $s +o0i .1 +-0 $8 $8 +$0 $4 $2 $7 +^k $o +o41 i52 o64 +i31 o49 i58 o64 +sn2 $0 $0 $6 +l $8 $0 $9 +[ ] r +o0x i1e r +i5y i61 i70 o81 +o31 i49 i58 o64 +o82 $4 +$8 $8 r +ss6 $2 $3 +o2i $1 $7 +i32 o40 ss0 $0 +l i51 o69 i79 o81 +sn1 $5 +$o $1 $7 +l o5k o6a +o3o ,5 +i4i o55 +$y $1 $2 $3 $4 $5 +i31 i44 i51 o64 +l o1l +$2 $4 $0 $3 +o31 ss9 $9 $2 +o5d o6o +o0m o4i +D2 $9 $3 +l o4w +l ss0 $6 +l $1 $2 $2 $2 +o52 ss0 $0 +o61 i79 i89 ,9 +o2y o5o +se1 $9 $8 $2 +i51 i69 i77 R8 +o2b o5a +^0 o17 +o5y i61 R7 +i51 o64 $3 +D2 $9 $2 +i5y i60 o76 +l o5. +i3 +o3r o4u +o5b ] +,3 $0 $5 +i2e i3r +o4i $8 +i2p o3i +i2t i3o +o4z o5u +.1 $1 $2 $3 $4 +o2r $2 $3 +o4a ss1 $2 +^1 o1g +$3 $5 $3 +i3a i42 o55 +^i ^e r +o0f i2r +i3e o5z +i5a o6r +i2a $1 $2 $3 +$g $1 $2 +D2 $1 $9 $7 $9 +l o40 +$2 $5 $0 $3 ++0 D3 +o0g $0 $9 +$0 $2 $2 $6 +l i61 o79 i89 o97 +$2 $5 $0 $0 +^1 ^0 ^5 o31 r +sy1 $9 $9 $7 +$7 $7 $0 +o1h ] +l $5 $2 $3 +ss2 $k $6 +D1 $9 +$2 $5 $0 $4 +l i61 i79 ,8 o97 +o1e o5m +i50 ,6 o72 +l o6b i7o o8y +sd8 $0 +o1j $1 +i3m ,5 +$7 $7 $5 +i40 i51 o63 +o6f +o1o $0 $8 +l o61 i79 i88 o90 +i21 i30 i42 o54 +o6b $1 +o1y $o +o0n $2 $0 +^s $1 $2 +o2r $1 $4 +o1i -2 +i2y i4i +o3i $5 $5 +i31 se1 $1 +o0d o4o +^3 ^4 ^5 o32 r +se3 $1 $3 +-4 $u +o1a $6 +$6 $6 $5 +i51 i61 i71 ,8 +o61 o70 $0 +o31 o44 +o3u $z +D5 $2 $3 +D2 $1 $9 $8 $4 +i75 o81 +o0m i3e +i34 i42 o53 +l i40 o54 +o6e $1 +i21 i32 i43 o50 +o2s o3h +o3e o5z +o7_ o81 +i1i o2a +i51 ss9 $8 $8 +i23 i32 o41 r +-0 $2 $0 $0 $7 +o5y i60 o76 +D4 o5a r +$d $o $o +l o6b o7o $y +o6. ,7 +o53 ss1 $1 +^9 ^8 o20 r +D2 $4 $2 $0 +i3h $a +i60 ,7 $7 +o5K +i2i o4u +o4y $m +i35 i45 i55 i65 ,7 +i41 i55 o69 +o42 i50 i61 o72 +i43 o50 i60 ,7 +i2f ,3 +o0l $1 $4 $3 +$4 $4 $1 +o3u D5 +^1 ^0 o20 r +o3c o4y +sL3 i12 i21 r +i32 i40 se0 $5 +o0t i2e +D4 $1 $7 +D3 $A +o0q o1u ++5 o6o +^7 ^2 T2 +o4o $2 $3 +R4 $1 +o1a o2t +i4e o61 +i54 i6e i7v o8a +ss8 $0 $0 +^1 ^4 T2 r +ss5 $2 $3 +^a o1u +$1 $3 $2 $6 +i50 i60 o72 +D4 $t +$4 $! +D5 o55 +i3e o51 +se2 $0 $0 $2 +o5e ,6 +i41 o52 o60 +ss2 $4 $2 +$6 $2 r +l i43 ,5 +o4j D5 +o0a $u +o52 $0 $0 $6 +o3i i4m +o4u $n +o56 ss9 $6 $9 +o51 i62 R7 +^0 ^2 ^5 o31 r +i31 sd2 $3 $4 +i51 i69 ss8 $9 +$0 $6 $3 $0 +i52 i60 o71 ,8 +i51 i69 ss8 $8 +o4y $2 $0 +o45 i56 o67 +i42 i50 o61 o72 +-0 i1h +o0n $9 $2 +o5a $z +l i61 o79 i88 o90 +o0m o3i +o5N +i21 i32 i40 o54 +$0 $6 $1 $6 +o1y $2 $2 +o72 i80 ,9 ++0 $1 $6 +$n $2 +i4h o5u +^2 ^0 ^0 ^7 D5 r +i34 i41 o50 +i5y o68 +l $_ $1 $7 +i51 ss9 $8 $9 +l i41 o57 +o0n o6a +i21 i32 i41 o50 +i34 i41 o54 +l o61 i79 i89 o97 +$0 $7 $2 $4 +o43 i50 i60 ,7 +i3e ,5 +l o67 o70 +i1a o4u +i52 o60 i71 ,8 +o4o i51 o60 +o56 i69 ss6 $9 +i41 ss3 $1 $3 +o50 i60 o72 +i31 i42 sd3 $4 +^e o1i r +o3r $i +D4 $h +i41 i53 ss1 $3 +ss2 $5 $2 $6 +o0v i2r +sr1 $1 $1 +i1c $1 $2 $3 +o0u $1 +D3 $1 $9 $9 $4 +i31 i40 i52 o67 +i45 o56 o67 +^3 sL2 i21 r +o5j $a +o2w r +l ss1 $7 +i48 i50 o65 +o3y i41 o53 +^1 o1s +i42 i50 R6 +-3 o5i +i56 o69 ss6 $9 +o1a o5l +i2h ] +i41 o52 ,6 +i1j r +[ o5z +o41 i52 o60 +o3f o4i +^- ^j +o0j $1 $9 $7 $7 +l $4 $e +i36 i40 ,5 +i41 i52 i62 o76 +o41 i52 ,6 +$5 $8 $9 $1 r +l i51 o67 +o0k $8 $8 $8 +$1 $9 $0 $1 +,4 $n +o1m $1 $0 $1 +l i61 i79 o88 o90 +^- ^1 r +i52 i60 i71 ,8 +o34 ss2 $0 +i43 i50 ,6 ,7 +i42 o50 i61 o72 +o0j i2o +l $1 $9 $5 $7 +sd4 $3 +i3i o4y +i31 i45 o50 +i32 se0 $0 $5 +ss7 $2 $3 +i54 i6e o7v $a +i50 ,6 o73 +o5o D6 +o52 ss1 $4 +o1u $0 $5 +i3r o4e +^. T1 +o0z $9 $2 +o3i $4 +o3y $2 $6 +o0c o6o +o1o o4e +-6 $1 +o3b $1 $2 +o32 i40 ss0 $9 +i2r o4u +$$ $$ $$ +$1 $2 $9 $5 +^j $1 $1 +o4i $4 +o3t o6a +^a o2o +o76 ,8 $6 +$z $2 $4 +[ o4a r +o0k $2 $0 $1 $0 +$2 $4 $0 $9 +o3a $1 $0 $1 +i2d o3o +o1i i4o +i32 i45 i53 o65 +o2k $2 $2 +i51 i62 o76 ++2 $1 $2 +ss1 $2 $0 $2 +i30 i41 o54 +o64 $2 $0 +o0f $0 $1 +i52 se0 i70 o86 +[ $5 $6 +$0 $2 $2 $3 +i33 i46 o55 +l $0 $2 $1 +i5y i61 o70 +i2k o4o +o5t o6h +o5j o6o $e +o4e o5y +o3O +o0r i4a +se1 o72 +i3a i48 o57 +l $8 $2 $3 +o0f $0 $7 +o3i o4j +o51 i61 o73 +i88 o95 +D1 $1 $9 $7 $5 +^1 ^9 ^5 ^8 r +^d r +^m $y +o5a i62 ,7 +o1m $1 $9 $9 $2 +sS9 $3 +^7 ^9 ^1 o36 +o2t o3a +i3o i42 o55 +i96 RA +o0n $2 $8 +o3m ,5 +o4o $4 +o6< o73 +o0b D3 +o4o i52 o63 +o0s o4u +o4l i5a +o3g i4a +^9 ^5 ^7 o31 r +o0o $o +l i64 o7e o8v $a +o0g o4i +o0l $9 $4 +o5b ,6 +l o5! +l $1 $1 $0 $9 +l o4j o5o +i51 ss9 $8 $5 +i3o o4a +ss1 $0 $0 $5 +$a $1 $0 $1 +o2o D3 +D4 $0 $9 +,7 o81 +[ $o r +o2i i3k +i4z i51 o63 +o6* ,7 +^u ^p +o0z $2 $6 +i3e $h +o7j +$0 $7 $0 $1 +o5d o61 +l i91 oA2 oB3 +o4f r +$2 $9 $7 +o1a $0 $4 +o0m o3u +$e $2 $1 +o4y $l +^9 ^6 ^9 ^1 +i3s D5 +o0v $y +o62 i70 ss0 $1 +o81 $0 +o55 i61 o75 +i62 o70 ss0 $1 +i44 i51 o65 +i6i ] +$0 $8 $3 $0 +i21 i32 o43 $4 +o42 $0 $0 $8 +$2 $2 $8 $8 +$1 $3 $3 $7 +$1 $4 $1 $8 +o0z i2h +i4y o5j +i3z i40 o59 +o1l D2 +ss1 $2 $2 $7 +$2 $8 $3 +o0k $1 $9 $9 $8 +l $6 $2 $1 +ss1 $2 $2 $6 +$9 $8 $9 $8 +$5 $4 $5 $4 +ss1 $2 $2 $9 +D5 o57 +i5y o6a +o62 $0 $0 $8 +i5a o67 +o0k $4 $3 +o0N $1 +o2d i3o +o0f $7 +i2m $i +i33 i41 o55 +o3m D4 +R5 $8 +o0k o5t +D3 $4 $5 +o1i $s +$a $n $a +i1e $y +o1e $2 $8 +i4i o5k r +o4x o51 +o2l o4a +i52 i60 se0 o86 +o1o i2k +i2r i3y +i4m o5e +o43 r +se2 i60 i70 o86 +$2 $7 $3 +^_ ^1 ^0 r +i42 i50 o63 +l $d $a +[ i2i r +i51 i60 o78 +i20 i31 i42 o53 +$1 $6 $0 $3 +o1e i2l +i58 i61 o78 +o48 o59 +i3c $1 +o0v $2 $4 +i8# o91 +ss1 $3 $8 +i4a o5p +o4i $a $1 +i32 i45 o54 +i2y o3u +o1a $2 $5 +o0n i1i r +i61 i70 i81 o90 +^1 ^1 ^0 ^1 r +i31 i42 i51 o69 +i51 i69 ss8 $5 +$2 $8 $1 $2 +ss3 $6 $5 +sd1 $9 $8 $3 +^m o5a +^7 ^1 ^7 o31 r +o3e o4z +sd1 $9 $8 $1 +i21 i39 i46 o55 +o0z $2 $0 $0 $6 +o0j $6 $5 +o50 i60 o73 +D1 +1 +o3i $h +o0j i1d +$0 $6 $2 $4 +o76 o80 +R6 $6 +l o67 ss7 $7 +o2s i4a +^4 ^3 R2 r +D5 $! +i62 i71 ,8 +^a o2i r +o3n $1 $2 +o49 i58 o67 +[ $i r +o3f ] +$0 $1 $2 $8 +^( o7) +i49 o58 o67 +$9 $3 $1 +i3p o4o +o2a $u +o58 $5 +^- ^g +i7z o81 +i3a i49 o50 +i4j o5o $e +^m r +^v $1 +i51 ,6 o73 +l o7s o81 +o0m i2u +o0c $! +o32 ss0 $0 $9 +o1a i4o +$0 $8 $8 +i21 i32 i41 ,5 +^3 ^2 ^4 r +i21 i30 i41 o54 +i1h $1 $3 +$0 $9 $1 $9 +l i64 o7e i8v o9a +o0g $1 $2 $3 $4 +sd2 $0 $0 $1 +^3 o16 r +^4 o54 +o5a i62 o71 +o1e $s +o62 ss0 $0 $1 +i32 o40 ss0 $9 +l i71 i82 o93 +i42 ss1 $3 +i1h $0 $7 +o0j i4u +i41 i52 i62 o78 +l $1 $3 $0 +o87 o92 +l o91 iA2 oB3 +^3 ^2 ^1 i41 i52 o63 +i1u $o +i4y o5b +o3z $3 $3 +^1 o1p +ss4 $1 $7 +i56 i69 i76 R8 +[ o0n +$# $2 $2 +o4i o5k r +o52 ss1 $2 +^e $o +^j o1o $1 +l o64 i7e i8v o9a +o0k $i $1 +l R7 +i2h o4a +i61 i79 ss8 $5 +i3i $1 $2 $3 +l i2c +st1 $9 $9 $0 +o61 i79 ss8 $5 +o58 $3 +o0l $9 $3 +o3y o4k +st1 $9 $9 $1 +[ o0f +i41 o59 i66 R7 +l i52 o65 +i1u ,5 +^o ^j o2e +o4o o5t +o3y $z +l o1s ++0 D5 +-3 i4o +o0k D3 $1 +sr9 $8 +D3 i4y +i3i i4n +o0m D4 +o73 $2 +o0t D4 +$2 $5 $0 $1 +l o74 +o0l i2y +o5a i6k o7o +o3a i4c +i3u D5 +i4a i52 o64 +o1r D2 +o03 i12 r +$6 $5 $7 +-5 o6o +i61 o79 ss8 $5 +i41 i53 ,6 +o0l i2e +i2e o3j +$1 $9 $2 $4 +$2 $4 $0 $1 +o1i o2s +l o71 i89 i99 oA4 +i51 o62 o77 +se1 o70 +o2m o3i +$2 $4 $0 $4 +o2n i4a +i88 o93 +l o61 i79 i88 o93 +o0k $7 $3 +se0 o77 +sS9 $1 +l o64 o7e $v $a +o51 i69 ss7 $9 +o3E +^w o1a +i2e i3l +$- $0 $6 +o3i i4n +l i64 i7e o8v o9a +D1 $1 $1 $2 $2 +$0 $8 $1 $4 +i2c $a +i41 i51 i60 o77 +l i61 o79 i88 o93 +o41 i51 i62 ,7 +o0a o1j +o0w $1 $4 +$i $7 +o3z D5 +$z $8 +o0y o1i +l i71 i89 ,9 oA4 +o0h i2r +l $k $i +$y $c +D2 o2v +o4y $g +o0n o4o +i44 i52 o61 +^2 ^4 T2 r +l o6c +l o61 ss9 $9 $4 +o2o D4 +o0k $7 $2 +o41 i59 i66 R7 +i1A +i61 ss9 $8 $5 +o0f $2 $3 +o36 +o0y $7 +[ $6 $1 $9 +l i3b +o0m $9 $1 +^2 R1 +o4u o5t +o68 $2 +$1 $4 $0 $5 +i41 ss9 $7 $5 +sr6 $6 +l $3 $2 $4 +l i62 o75 +$1 $4 $0 $1 +l i60 o77 +$1 $6 $2 $3 +$0 $8 $3 $1 +i2l o3y +R4 $2 +l i61 o79 ss9 $4 +i41 i51 o62 ,7 +i4c o5e +o2c $1 $2 +o5y $1 $5 +ss1 $2 $2 $5 +l o64 i7e o8v $a +o5c o6e +l o89 o92 +ss2 $5 $0 +sn0 $6 +$8 $9 $7 +o5z o63 +D1 $9 $1 $1 +.0 $1 $2 +l i6l o7e ,8 +o1e $7 $7 +o0n o5h r +o5a o66 +o0s i1o +i72 i80 i90 oA4 +l $7 $1 $6 +i33 i42 o54 +i30 ss0 $1 +o61 ss9 $8 $5 +[ i3u +$0 $8 $2 $9 +o5S +l $7 $3 $1 +o1l $1 $2 $3 $4 +l $9 $2 $9 +i55 o61 o75 +i51 o69 ss7 $9 +i1h $2 $1 +^5 ^0 ^5 r +$z $0 $5 +-0 $0 $3 +i31 i42 i52 o67 +^i D3 +i41 ss0 $1 $0 +^3 sS2 i21 r +D1 $9 $0 +i51 o60 o76 +ss6 $1 $6 +i41 i50 i62 o78 +o2t o3h +o4h $i +sS1 $4 $3 +^9 ^1 ^3 r +o1a i3e ++0 $1 $5 +i4s o5o +i3e o4n +o46 $6 $6 +o4l o5e +^o o2e +l $0 $1 $4 +o0g $8 +o0s $0 $9 +o6- +o57 $8 +o4e ,5 +i4y i50 R6 +l o55 o66 +o3j $1 $2 +$0 $3 $2 $7 +i3u o4z +^2 ^2 ^2 o32 +i12 i22 i32 i42 ,5 +i32 i40 ,5 $6 +D2 $s +o0l $2 $0 $0 $6 +i41 i52 i61 o76 +i5e o62 +^3 ^2 ^5 r +o0l i3o +i31 i41 i50 o65 +$0 $4 $2 $6 +o51 i60 o76 +$0 $3 $3 $1 +o4z $3 +i65 ss5 $5 +o2j $e +st1 $4 $3 +i3y i42 o55 +i57 o61 o74 +i1u D5 +i4y i50 o65 +i63 i71 ,8 +D1 o1k +o2k $e +^i o4a +o0n i4e +i82 i90 iA0 oB7 +-0 D1 +sS3 i12 i21 r +$a $2 $6 +i3o i41 o58 +o0l $8 $6 +l o58 o60 +o0t i2o +[ $w +$1 $9 $2 $5 +i41 ,5 i62 ,7 +^0 ^0 ^7 o31 r +st6 $6 $6 +l i71 o89 i99 oA4 +i3g $1 +i41 i50 ss1 $0 +l o61 i79 ss9 $4 +$3 $0 $0 $1 +$0 $4 $1 $3 +^p $1 $2 $3 +i41 i59 ss7 $5 +-0 ,5 +o0k i4r +o21 $2 $3 $4 +o0l D1 +i41 i59 o66 R7 +l i61 i79 o88 o93 +$8 $6 $4 +l i3- +o51 ss9 $7 $9 +$_ $9 $1 +i5g o61 +o0k i5i +l o61 ss0 $0 +o0a i1l +o3o $0 $9 +i1e o2l +o0p $! +D2 $9 $5 +$0 $5 $2 $3 +l i50 ,6 o71 +D1 o2i +l i42 o57 +o61 o74 $3 +o0l $9 $0 +l i42 o56 +o0l $9 $1 +o2e i3s +i32 i45 i53 ,6 +o2r ,5 +i2d o3e +o3c $1 $2 +i61 i79 ss8 $4 +i53 o66 R7 +o19 +$1 $9 $4 $6 +i71 i89 o98 ,A +o53 i66 R7 +i1a o2z +o51 ss9 $7 $7 +l i57 ,6 ,7 +ss4 $1 $9 +^0 ^0 ^2 o33 +o4y o51 $2 +$0 $5 $2 $2 +$1 $9 $4 $2 ++2 i3o +^6 ^9 ^9 ^1 T4 +o0h i3a +o0n $7 $7 +[ i2n +^k o5a +$z $2 $8 +o51 i69 ss7 $7 +^9 o19 +^1 ^3 o21 r +o0k $3 $6 +o57 i61 o74 +o51 i69 i76 R8 +i24 i33 i42 o51 +o2i $5 +sy! $! +D1 $8 +o1a i2d +i5a ,6 +o5y i60 o75 +-0 o1o +$0 $8 $7 +i43 +D2 $9 +^2 ^1 ^8 r +o0b $0 $4 +o0e $o +i4a se1 o62 +i31 i44 R5 +i51 o69 ss9 $8 +i41 i52 i60 o73 +o6i $1 +i3o o4r +i4y se0 o67 +o1m $1 $9 $9 $0 +$2 $0 r +l o83 ,9 +[ o5h r +$2 $1 $1 $3 +,5 $3 +$0 $7 $1 $4 +$6 $4 $2 +o51 ss9 $9 $8 +o22 +ss4 $2 $4 +l o3w +^a ^a +$y $k +i61 i79 i87 o94 +o0r $2 $0 $0 $7 +o0i $u +o0f $1 $1 +^0 ^2 ^1 r +D5 $2 $2 +o1a o4z +i52 i60 i71 o82 +se2 $5 +o1y .4 +o61 i71 o87 +^2 ^1 o2k +i2a ] r +i3i i42 o56 +o3p i4h +l i52 o60 ss0 $5 +$e $0 $1 +i41 i52 i61 R7 +$2 $9 $3 +i6! i7! ,8 +o0w $e +o4y $i +D2 $4 $5 $6 +ss3 $2 $6 +o7h +^1 ^2 ^3 o3n r +i5k o6u +o63 i71 o86 +^2 o16 r +sl1 $0 +o4i $s +o5m o6o +l $6 $1 $7 +-3 D5 +o2b ] +o4h o5i +o42 $8 +o1a $0 $2 +i1l D3 +i3i o5l +$- $- +l o52 ss0 $0 $5 +o30 o48 +i3n ,4 +i44 i51 o63 +i51 o69 i76 R8 +i10 ,2 +se1 $9 $8 $1 +i63 o71 o86 +i2e i4a +^1 ^5 o21 r +o3a i4h r +^_ ^1 ^4 r +i4k o5a o61 +-1 $1 ++5 $o +l i6n +o78 $7 +$2 $7 $0 $5 +ss1 $2 $3 $! +$4 $6 $8 +o3o o4r +o3f i4i +l $1 $0 $0 $3 +o1y $1 $3 +i3m r +l $7 $1 $0 +o0i i1< i23 +i43 i51 o67 +^1 ^2 ^3 ] r +o1r $1 $2 +l $7 $1 $5 +$5 $5 $1 +i3i ss1 $2 $3 +$3 $8 $7 +l $4 $0 $8 +o0w o1a +i52 i60 se0 o87 +o7O +o3y $5 +i62 i71 o82 +^a D5 +^0 ^5 o21 r +$9 $0 r +o1u o5u +l $_ $0 $8 +l i5i i6t +l $3 $5 $7 +i61 ,7 o87 +se2 i60 i70 o87 +i89 o96 +o1i $2 $0 $0 $7 +o60 $0 $7 +D2 $0 $0 $1 +^1 ^5 T2 r +$2 $8 $1 $0 +i21 i31 i42 o51 +^4 ^4 $4 $4 +i51 o69 ss7 $7 +l $9 $2 $5 +ss1 $4 $4 +o51 i69 ss9 $8 +$9 $9 $6 +i51 i69 o76 R8 +$0 $7 $2 $7 +i3z o5a +o0z $2 $0 $0 $4 +l ss8 $8 +o0c o1h +o4a i52 o67 +^1 ^2 ^3 ^4 ^5 ^6 +$4 $8 $9 +o0j $s +D4 $j +.0 i2y r +o2V +$2 $8 $0 $5 +^9 ^6 ss6 $9 +o3l $1 $2 +i4z o5e +$9 $8 $1 +o0v $0 $2 +l ss1 $6 +i51 i69 i77 o80 +o1i o3z +o4m o5a r +i42 i52 o61 +o1j $a +.2 $1 $2 $3 $4 +i1o o2y +ss1 $9 $5 $5 +D1 o3i +se3 $z +^I +o5a o6! +o0a ,5 +l o50 i60 o71 +i52 se0 i70 o87 +i2l i3u +i4a se1 ,6 +$0 $5 $1 $6 +o5a $1 $1 +i71 o89 i98 ,A +o1J $1 $2 $3 +i4o R5 +i5_ i61 o73 +$5 $! +i31 i49 ss8 $4 +$0 $2 $1 $7 +i57 ss8 $9 +o4n $o +o2a i3y +^6 ^7 ^9 ^1 +i77 o80 +o3i $8 $4 +i31 ss9 $8 $4 +l i49 ,5 +o5Y $1 +$i $1 $3 +i61 ss9 $8 $4 +^1 ^9 ^9 ^1 T4 +^a o2y +^2 ^0 ^3 r +l o6l i7e ,8 +$1 $0 $9 $0 +o0z $1 $2 $3 $4 $5 +$2 $5 $3 $4 +l o5h o61 +ss4 $1 $6 +l o52 i60 ss0 $5 +^1 ^8 ^0 r +o5x o63 +D3 o6e +i61 i79 ss8 $6 +i1y o4a +l o50 ss0 $7 +o0h i3i +^8 ^8 T2 +i31 i49 i56 o64 +i31 i42 i53 se4 $5 $6 +o71 i89 i98 ,A +o64 o72 $0 +o2t $1 $2 $3 +ss7 $1 $6 +o2i $0 $6 +o0t ,5 +o5o $a +o5s $1 +$0 $2 $0 $1 +o44 i54 ,6 +sS6 $6 +-2 i3u +o3k D5 +i3y $1 +,2 o61 +o67 $6 +o1i ,4 +i2z i3e +i4l i5i +o1j $2 $0 $0 $4 +i4o o51 i62 o73 +i51 o63 o75 +o3d $i +o0f $y +$n $1 $2 +^j $2 $4 +i31 i49 se9 $2 +^j $1 $8 +i1h o3r +i51 i62 i73 o84 ss5 $6 +i44 ,5 ,6 +i2i o3k +ss1 $2 $0 $7 +i2s o5o +i58 ss8 $8 +o1a $9 +i4z o53 +o1o $1 $8 +i2j o3e +o4y $. +i4i r +^_ l $_ +o3@ +o51 i62 i73 ss4 $5 $6 +i3o i42 o50 +l $9 $1 $9 +i32 i40 R5 +^2 ^7 o21 r +i31 o49 ss8 $8 +o1y o5j r +o1u $6 +o2j i3e +o0t $0 $0 +se0 o78 +l o6m +$2 $9 $1 $0 +i30 ,4 o51 +l $5 $3 $0 +o4z i52 ,6 +i31 se2 $3 $4 $5 $6 +i41 i53 o61 +o51 i62 sS3 $4 +o0d o3y +$v r +sg0 $6 +i29 i39 i49 ,5 +i42 i52 o60 +i42 o50 $0 $0 +i31 i42 se3 $4 $5 $6 +o1m $1 $9 $8 $7 +^1 ^2 ^2 ^2 r +o4o $9 +o51 i62 ss3 $4 $5 $6 +i31 se9 $9 $2 +^2 ^5 ^2 o35 +o1s $2 $0 $0 $8 +o51 i62 i73 i84 ss5 $6 +$e $i +ss8 $1 $1 +o1e i3z +o51 sS2 $3 $4 +o90 RA +$ $m $e +$3 $0 $0 $4 +l o64 ss2 $0 +se2 $0 +i3i i42 o57 +i51 o65 R7 +o0w $2 $3 +st7 $7 +i41 i52 i60 o74 +^1 o19 +o0r $7 $7 +i41 i50 i61 o77 +o1t $1 +i61 ss9 $8 $6 +$8 $3 $2 +i4i o5t +i41 i52 i60 o76 +o4z i52 o61 +o0g $6 +l $8 $9 $0 +o51 i65 R7 +o0m $9 $2 +o1h o2y +$a $9 $9 +i5j o6o $e +^0 ^1 ^5 +ss1 $1 $2 $6 +o0b $2 $5 +l $6 $1 $6 +i31 i42 i53 i64 se5 $6 +$1 $2 $5 $6 +o1e $8 $9 +o1y i2a +[ $8 $0 +i41 i55 i61 o75 +o1o i2y +D2 o2g +o0j D2 $1 +l o5r i6o $e +D4 o4c +$a $9 $3 +$2 $8 $6 +^i o5a +l $7 $2 $3 +i51 o62 ss3 $4 $5 $6 +l o61 i79 i88 o92 +o42 ss1 $3 +l $1 $0 $0 $7 +o31 i49 ss8 $8 +i50 i60 o73 +^0 ^5 o20 r +i4i o64 +$4 $3 $1 +i4n o5y +o0b i4a +l o89 o91 +o4n o5e +i67 o71 ,8 +i3z i41 ss2 $3 +i4y o5g +i61 i79 o87 o96 +$4 $3 $5 +o2y o4u +l i6a +i3a se1 $2 $3 +i61 i79 o87 o95 +^2 ^2 ^7 r +ss@ $1 $2 $3 +o2p o3h +$8 $9 $1 +i2h i31 i42 o53 +^j $1 $5 +i34 o5v o6a +$2 $7 $1 $2 +i41 i51 i62 o71 +o0y $2 $0 +o5* ,6 +-0 $2 $0 +ss1 $8 $1 +sr7 $8 +$0 $6 $1 $5 +i1i i2z +i33 i42 o57 +o0j $3 $6 +i5e $1 +o67 i71 ,8 +i42 i50 o65 +o0h $9 +o0@ +l i61 o79 i88 o92 +^5 ^2 ^7 ^4 ^1 o58 +o3e o4r +$1 $6 $0 $2 +i3u i41 o52 +^1 ^7 ^1 ^7 r +i3i i46 o59 +o1a $2 $7 +i2t o5a +o0j o2m +o61 i79 i87 o96 +ss1 $5 $1 $5 +i52 i60 ss0 $3 +$2 $8 $1 $1 +o41 i51 o67 +o2y o3c +o61 i79 i87 o95 +i32 i40 o55 +^8 ^7 ^3 ^2 ^1 o59 +$1 $$ +i51 i62 o73 i84 ss5 $6 +o0k i1l +$1 $6 $0 $9 +o0n $9 +o4k o5a r +ss5 $1 $6 +i34 i41 o52 +$4 $9 $0 +o0k -3 +i61 o79 i87 o96 +o51 i60 o78 +o75 R8 +i51 i69 i77 o83 +i61 o79 i87 o95 +$5 $6 $3 +o42 i51 o62 +o4y i52 o67 +i61 o72 o85 +i3u o4r +D2 o5a $1 +o51 ss2 $3 $4 $5 $6 +^1 ^9 ^9 ^1 D5 +i51 o62 i73 ss4 $5 $6 +$1 $7 $0 $4 +o7z $1 +i52 ,6 o73 +$4 $4 $7 +se4 $5 $6 +i73 R8 +iA1 oB2 oC3 +^! $! r ++0 i1a +o1i $8 $9 +^2 ^1 ^6 ^5 ^4 o53 +$0 $7 $2 $8 +^1 ^0 ^0 ^9 r +o2b o3e +se9 o65 +[ $1 $9 $8 $1 +o0k ] r +o51 i63 o75 +i51 o62 i73 i84 ss5 $6 +^j D5 +o1k $1 $2 $3 $4 +o0i $2 +l o64 o78 +o3a $2 $0 $0 $5 +i53 i60 i70 ,8 +i71 i89 i99 oA1 +^1 ^y ^m +o3a $9 $6 +ss1 $9 $5 $6 +i3y i48 ,5 +o2e o3j +D2 i3s +l $_ $1 $1 +o4z i51 ,6 +o0i o5a +o2e $1 $3 +i3r o5i +i4t o5z +$1 $9 $0 $9 +o31 $0 $1 +o3l o4e +o5u D6 +o0n o1i r +i51 i62 o73 ss4 $5 $6 +o0j $1 $9 $7 $5 +^_ ^1 ^5 r +^b ^b T2 +^2 ^1 ^2 ^1 ^2 o51 +o31 ss9 $8 $8 +o4n o51 +i4a i50 o65 +o4i o57 +o0n o3e ++0 $2 $4 +o30 i40 o51 +o81 $5 +$1 $9 $0 $0 +o0f o5a +o0l i4e +o2n i3o +i41 ,5 o67 +i51 o62 sS3 $4 +i42 o51 o62 +o1i i3h +l i61 i79 o88 o92 +o0c $2 $0 $0 $8 +o4k o5a $1 +o0p $6 +l o6l o7e $e +o0o o1r +o0w i1e +i52 ss0 $0 $3 +sr1 $9 $8 $7 +^b r +i3a i42 o58 +o2y o5n +ss1 $5 $6 +ss7 $2 $0 +ss4 $1 $4 +o2i $1 $8 +^5 ^9 ^9 ^1 T4 +l i62 o76 +D4 o4d +l $9 $0 $0 +T8 +l o57 i67 ,7 +i51 o62 R7 +i51 o60 o78 +D2 i3n +o0m i4u +$3 $1 $1 $0 +i21 i39 i47 R5 +i41 o54 o67 +i74 o85 o96 +l $5 $1 $7 +l o78 +*23 $1 +^k -1 +ss_ $0 $8 +l o4f +o2y o61 +,3 o4u +^f o1i +^3 sA2 i21 r +u sI1 +i3j o4a r +$. $1 $1 +-0 o1a +o0u $a +D6 o6z ++2 o5i +o0c $2 $0 $0 $6 +^1 ^9 ^5 ^6 r +i5y i61 o75 +o2l i3e +l o91 oA2 +o2k $2 $3 +^9 ^3 +D1 o2y +i31 i49 se9 $4 +sm1 $2 $3 $4 +l $5 $2 $2 +^b $2 +i3b i4a +^7 ^7 ^7 ^7 o47 +.3 D5 +o3d o4u +i62 o70 ss1 $0 +i3t o5a +i2e o3l +o1a i2z +o51 i69 i77 o80 +i3z i41 o52 o63 +^0 ^5 ^0 ^6 r +^9 ^0 ^2 +o1i i2a +o0a i1c +^3 ^2 ^1 i54 i65 o76 +o41 i54 o67 +^1 ^8 ^1 ^8 r +o5a i61 o76 +^1 o2a +i3a ss1 $2 +o1i i2g +$0 $6 $6 +o3a $7 +sg2 $1 +o2m o3a +i41 i51 i62 o77 +o0m i3o +st1 $9 $8 $7 +sd7 $5 +l ,6 o71 +o0j i2d +o5z o6o +sr2 $0 $0 $4 +o1a i2t +i1i o2s +i1i o2g +o4a o5f +o2r i3o +o48 $7 +i30 i40 o54 +o0z o4u +o0i $o +i41 i50 i63 o70 +i31 se9 $9 $4 +o2i o5n +D5 o6o +$2 $3 $2 $7 +o7l +i31 i49 ,5 +o2u o6a +o2y $0 $6 +o3i i4s +^2 ^2 ^1 ^1 +$7 $0 $9 +o0g i2i +i3a i49 o53 +^a o1k +o61 i72 i81 o92 +l i40 o59 +l o51 i69 i79 o80 +sd4 $u +l $a $1 $2 +ss0 $6 $9 +l $3 $2 $2 +i1d $1 $2 $3 +sy1 $9 $7 $9 +^3 ^3 $3 $3 +o81 o90 $1 +o3o o4n +^a o4o r +^2 ^2 ^6 r +o32 ss2 $2 +i4o $a +i2g i31 i42 o53 +i2s $1 +^1 ^8 T2 r +i42 i51 R6 +$1 $1 $3 $3 +$. $5 +ss8 $2 $1 +l i51 o69 i78 o87 +o0k $2 $2 $2 +o3h i4i +^a o1a +o51 i62 o76 +l o89 o90 +o0k $1 $9 $7 $8 +l i51 i69 o78 o87 +i2g o3i +$1 $3 $1 $8 +l o73 o86 +o1h i2u +o3y $2 $0 $0 $7 +o2i $1 $2 $3 $4 +ss5 $2 $6 +^1 ^3 ^3 r +$e $1 $0 +l $1 $5 $0 +ss1 $0 $0 $2 +^1 ^4 o23 r +i3g o5a +l $4 $2 $6 +o2g i3i +R5 $5 +l $4 $2 $4 +o0j o2d +i52 ss3 $4 +o3a $8 $4 +i42 i53 o61 +^e ^s +o3y i4a r +i47 i52 o60 +^0 ^0 ^6 o31 r +o0y i2e +l $2 $2 $2 $2 +i6b o71 +l i51 i69 ,7 o80 +^1 ,5 +-2 $e +o4n i5a +o0p i3i +[ $3 $5 +i1y o2a +o2e $l +i2w o3i +^1 ^1 ^7 o31 r +o43 ss1 $6 +l $9 $2 $0 +D4 o4t +o0j $5 $5 $5 +i21 i31 i42 o53 +$3 $8 $9 +i1o $e +o4p $1 +i4r o5a r +^5 ^1 ^5 o30 +o1i $0 $3 +^4 ^2 $2 $4 +o76 o82 +o1u o5y +$1 $6 $1 $8 +o76 o81 +^3 o15 r +l i58 ,6 +i3m o4e +sA3 i12 i21 r +i71 ss0 $0 +o0b i2e +o4y $7 $7 +D2 o6i +i3b o4u +i51 i61 o73 +o0l $2 $0 $0 $8 +i61 i72 o81 o92 +o4y o6a +D1 o1l +o3a $9 $5 +$a $8 $9 +^o o4a +l o6b o71 +$t $1 $2 +i54 o62 $0 +l i49 o51 +l o65 o71 +o5a i60 o71 +D1 .1 +i62 o71 o80 +sr1 $9 $9 $2 +$2 $8 $0 $8 +o4a i50 o64 +^* ^* $* $* r +l o51 i69 i78 o87 +D2 i5h o6o +o81 $8 +o5a o64 +^1 ^2 ^0 ^7 r +sd1 $9 $7 $9 +o1a -2 +$0 $9 $2 $8 +^1 ^1 i51 ,6 +$0 $1 $1 $4 +o2y o5z +sr1 $9 $9 $1 +o0d $5 $5 +i2i o5y +^! T1 +[ $r +D3 o3n +^i i4a r +o4e $y +l i51 o69 i79 o80 +i3a o4s +^1 ^2 ^3 ^1 ^2 ^3 r +o4o i5n +$0 $9 $2 $6 +o0a i1a +o3p o4a +o0d o61 +o3h $i +i51 o69 i77 o80 +i3z o41 i52 o63 +^s o1o +o2y $u +i34 i40 o58 +i3o i4o +^0 o16 +i1u $i +l o63 R7 +i41 i59 i65 o77 +D5 o5t +i3d o51 +i2t i3i +l i61 o77 +i4y i52 o64 +i62 o70 ss0 $2 +^2 ^3 ^1 ^2 ^3 o51 r +o2r $u +i31 i49 i56 o62 +i52 i60 ,7 $5 +i43 i56 R6 +i3y i40 o53 +o70 ,8 $7 +l i5k +^0 ^0 ^1 o30 +o3S +i29 i38 i47 i56 i65 i74 i83 i92 oA1 r +o0m o2e +o1c $2 $0 $0 $5 +o17 +D6 o6k +i21 i31 i40 o57 +i2y o4u +^7 ^7 T2 +o4a i50 R6 +o1o i3e +o41 i59 i67 o72 +i41 i59 o67 o72 +i2e o3i +sy1 $9 $9 $8 +o0a o3e +i51 ,6 i71 ,8 +o3N +o2w i3i +o0a $0 $3 +i4a i52 o60 +o5l $y +o0z $4 +i1a $n +i71 i89 o98 oA7 +o0h D5 +o0h $2 $5 +i21 i30 i43 o51 +i4e $a +i51 i69 o77 o80 +^i ^n r +o0r $2 $0 $0 $8 +$0 $1 $1 $3 +l i5y +i44 i52 ,6 +i4o i51 o64 +i41 st2 $3 +o42 i50 o62 +o97 ,A +oB1 +,2 $0 $1 +$s $1 $3 +o2p $o +o72 $8 +se0 o75 +^1 ^2 ^3 .4 r +o2r $0 $7 +l $1 r +o2e o3z +^k o1a $1 +o0b $8 $8 +o0f $1 $4 +$1 $3 $7 $9 +i2l o4i +o0b D2 +$2 $3 $4 $5 $6 +$1 $2 $3 $2 $1 +o64 $2 +[ o0i r +$y $i +i41 i51 i60 o75 +l i51 o69 i79 o86 +i2y i3o +o2u ,5 +i2v i3e +o1y $2 $0 $0 $7 +l o71 ss4 $3 +o4a $1 $0 $1 +o52 i60 ,7 $5 +o0v D3 +o51 i61 i71 ,8 +$4 $8 $9 $1 r +o0f i1i +i3i $n +i22 i31 i41 o52 +o2n $1 $3 +i4z i51 o62 +l $k $e +i51 i61 ,7 ,8 +o1a o2d +o62 ss0 $0 $2 +^0 ^2 o22 r +o3i i4u +i51 ss9 $9 $7 +i40 i50 o64 +i44 i52 o65 +i41 i52 i60 o75 +o5l o6u +$e $2 $3 +so0 $7 +l $p $o $g $i +D3 $8 $2 +o62 i70 ss0 $2 +i41 o59 i67 o72 +i42 o50 o62 +o0c $3 $3 +o4a i52 o65 +o71 i89 i98 oA7 +ss3 $0 $1 +^1 ^2 ^3 o4y r +o4s $a +o2d i3e +^1 ^2 ^3 ^4 D5 r +o62 ss0 $1 $0 +^9 ^9 ^4 R3 r +o1a $8 $9 +se1 $9 $8 $0 +^a o1y +o1a $8 $8 +o0y $0 $9 +l $7 $2 $2 +o0t i3o +i41 i50 i61 o78 +i41 i52 i62 o75 +ss5 $6 $2 +o3e $1 $3 +o0z o2y +i63 o74 o85 +i2a o6a +i40 i58 i60 o78 +D2 o2o +i1e .4 +o1i $h +$0 $6 $1 $8 +i3y i40 R5 +-0 o5i +l o6s o71 +i4a o6i +l o6r +^1 ^3 o2z r +i2y o3e +ss1 $1 $0 $5 +ss9 $2 $5 +o62 i70 ss1 $0 +i47 i50 o67 +o1y $1 $1 +^n $1 $2 $3 +i47 i52 o67 +$1 $5 $2 $2 +D1 o4a r +i33 i43 o50 +^9 ^1 ^2 r +i4l o61 +o0r $2 $9 +i31 i41 i51 o63 +$1 $3 $9 $0 +ss1 $5 $2 +i31 i41 i51 o62 +o3a $8 $5 +i72 o84 o97 +R7 $3 +o1u $8 $8 +-0 $0 $2 +o1e i2o +^1 ^1 ^1 ^3 r +i2c i3o +o6l $1 +sh3 i12 i21 r +o4c ] +l i51 i69 ,7 o86 +o2y o3u +^8 ^5 +i71 R8 o93 +o3y $3 +o51 i60 R7 +i2g o3u +i1e o2o +^1 $k r +l $x $1 +$5 $6 $8 +^k D4 +l $5 $2 $7 +^2 ^5 ^2 ^6 r +^3 sh2 i21 r +D1 $9 $5 +$1 $7 $0 $8 +o2i i4o +o4y i52 o68 +$0 $7 $2 $5 +D1 $2 $9 +^8 o15 r +i1u i2d +^- ^t +o2p i3i +i21 i32 i40 o58 +$z $1 $2 $3 $4 +^5 ^8 o22 r +$e $5 +i32 i43 i54 o65 +i21 i32 i41 o54 +i51 i69 ss9 $7 +$0 $3 $2 $9 +o1a +2 +$6 $9 $! +,1 ,5 +o1a .2 +$6 $9 $6 $9 $6 $9 +^8 T1 r +o52 i60 i71 o82 +i3o D5 +^i ^c +^p ] +$u $1 $2 +o2a $0 $1 +l o65 o73 +i4i i60 o77 +i4i $o +$y $3 $1 +$6 $9 $8 +i51 o60 R7 +i3b $1 +D1 $1 $0 $2 $2 +o2v D3 +o82 $1 +i30 ,4 $7 +^8 ^1 ^7 r +o2k D4 +i1a o3i +i57 i61 o74 +i25 i31 i45 o50 +^3 ^2 ^1 o6a +sd1 $9 $9 $7 +$y $b $o $y +^1 ^2 ^3 $k r +o3i o4r +o4d D5 +sd2 $2 $2 +$0 $1 $3 $1 +^3 ^0 ^2 ^0 ^1 o50 +o2n i3n +o5d $1 +o63 i74 o85 +i2e o51 +o74 i85 o96 +o2c o3o +^8 ^8 ^8 ^8 ^8 o58 +i3o i40 o58 +$0 $7 $! +$0 $5 $1 $9 +$1 $8 $0 $9 +o0m $2 $0 $0 $7 +^1 o1v +i31 o40 $1 +o3e $z +$a $2 $8 +D4 o6e +o87 o91 +l i42 o58 +o2y i3e +o3y $7 $7 +sy2 $3 $4 +o0m o4o +$0 $5 $2 $7 +D2 $9 $0 +o3j ,5 +o58 $2 +i71 o89 i98 oA7 +o3y $0 $4 +o3y $2 $7 +i41 o50 i60 ,7 +^2 ^7 ^9 ^1 +o0p i2e +i3o i40 o55 +$d $e $e +i31 sk2 $3 $4 +i3a i42 o56 +D3 $3 $1 +i39 ss1 $1 +$! $! $! $! +o51 i69 i77 o81 +o41 i52 i62 o71 +o2r $2 $2 +.2 D5 +i31 i42 sk3 $4 +o0m i1j +o0l $9 $5 +$1 $9 $4 $4 +o2z $2 $3 +o0a $5 +^j $1 $0 +o39 ss9 $9 +o0r $1 $4 $3 +i2r $1 $2 $3 +o61 i79 ss8 $3 +o0a $3 +i51 o63 o71 +o0j $6 $1 $9 +o1u o5n +o71 i82 o91 +^7 ^0 ^2 r +i41 o59 ss7 $3 +o3d D5 +o0d o4y +o0o o4a ++0 D1 +sL1 i1l +o73 $1 +l $9 $1 $4 +$_ $_ +sd3 $7 +i4a i52 o65 +ss_ $1 $4 +i1u o2z +^3 sD2 i21 r +$o $! +i4o se1 i62 o73 +i39 i48 i57 i66 i75 i84 i93 iA2 oB1 r +i61 o74 o87 +l o71 i89 i99 oA2 +o58 i63 o71 +o3i $n +o3L +o5c $a +i2g r +i51 i69 o77 o81 +i3i i42 i50 i60 o77 +o0j $9 $9 $9 +i61 o79 ss8 $3 +^y ^l +$- $0 $1 +^1 ^2 ^1 o30 +i40 ,5 $7 +sD3 i12 i21 r +i32 o40 i50 o62 +o92 oA7 +i88 o92 +sg0 $1 +,7 $1 +i13 i23 i33 i43 ,5 +i3b i4i +i42 i50 sy0 $0 +D4 $2 $4 +o51 i69 ss9 $9 +o5a o6k $o +i4f o5a +$0 $7 $0 $3 +i61 i79 i87 o95 +^2 o54 +o61 i74 o87 +sS9 $6 +[ o5u +ss2 $5 $4 +$e $o +i41 i52 ,6 o71 +o0t $2 $6 +o0j o6e +o0a o4u +i41 i50 ,6 ,7 +o1j $1 $3 +o5a $1 $3 +l $2 $5 $8 +o0i D3 +o53 i61 o74 +^5 ^2 ^1 +i42 i52 o66 +i1e i2d +o0m $8 $4 +^g $1 $2 $3 +i17 i28 i39 i44 i55 o66 +l i71 i89 ,9 oA2 +l o61 ss9 $9 $0 +o4z i52 o63 +o4a o5c +,5 o63 +^2 ^1 ^2 o31 +o42 i50 i61 ,7 +^3 ^6 ^5 r +ss1 $1 $3 $0 +o61 i72 o80 +D1 i2u +o5y $0 $5 +o1e $0 $4 +.3 o5z +o32 i40 i50 o62 +i2h o3e +D3 $8 $3 +o0v o5i +o0a o4i r +$2 $5 $0 $2 +l $9 $2 $7 +i1R +^k o1i $1 +l i5r o6o $e +o2y i4e +$2 $7 $0 $8 +$e $0 $7 +i44 i54 ,6 ,7 +o51 ss9 $9 $9 +o1a $0 $3 +o5o i61 i72 o83 +ss1 $1 $2 $7 +st2 $0 +o5- o61 +o41 ss9 $7 $3 +^2 ^0 T2 +o73 R8 +l o51 i69 i79 o86 +o4y $3 $3 +o2t D3 +i3a i47 ,5 +i6h o7a +o0s i1c +o5y $1 $7 +o0t $2 $0 $0 $7 +^2 ss4 $u +o1o i2e +ss1 $2 $2 $2 +$3 $0 $1 $0 +^6 ^1 ^5 r +i2m $o +o0m $9 $3 +o42 ss1 $0 +o0j i3u +l i61 o79 ss9 $0 +o43 ss4 $5 +o0c ,5 +se2 o74 +o2y o4y +i91 oA4 +D5 o54 +se2 i60 i70 o88 +$2 $2 $5 $5 +o5a $r +o0z $8 $6 +l $4 $2 $2 +$y $1 $9 $9 $4 +o52 o60 $0 $5 +o1u o2y +^0 ^7 T2 r +o4u i51 i62 o73 +o1y o4a r +o0f $5 +o0k o5h +i57 i61 o78 +o3c o4h +ss1 $0 $0 $7 +l i70 ,8 o97 +o1i $! +^4 o15 +o0b $2 $6 +ss9 $2 $3 +i3a i42 i50 i60 o78 +^8 ^0 ^9 r +i72 o80 ,9 $6 +i1b r +$j $u +ss6 $1 $3 +o61 ss9 $8 $3 +$& $m $e +i3v ] +o4l D5 +i4# o53 +i3i o5a $1 +^k o4i +.0 .3 r +ss6 $1 $1 +o0r i1y +o5y i61 o77 +l o75 o80 +o3a i4u +o3a $5 $5 +o0b $7 $7 +i1h $2 $4 +D1 $3 $2 $1 r +i4w o5i +o0v $2 $5 +$i $a $1 +o3o $5 +^7 ^9 ^1 o32 +i52 i60 se0 o88 +l o2y $1 +o0j o6o +o5u $a +i44 ,5 i64 ,7 +^2 ^0 ^6 r +i57 i68 o79 +i2n o4o +$2 $6 $0 $4 +i1e o2s +i71 o82 o93 $4 +ss4 $0 $8 +o0j $7 $3 +$0 $3 $2 $4 +i75 o83 +o41 i59 ss7 $3 +$o $2 $0 +$c $o $h +l i6i i7t +i42 o50 i61 ,7 +i58 o63 o71 +i61 ss2 $1 +o0a i2e +ss1 $6 $9 +i2o o51 +i3i i47 ,5 +i90 oA6 +i41 o50 o63 +o0l o4y +i42 i50 o61 ,7 +o4y i50 R6 +i2a o51 +i41 o52 i62 o71 +i67 o78 o86 +o2S +$0 $1 $2 $9 +i45 i51 o65 +i63 i70 o85 +^1 ^6 ^1 ^6 r +$y $3 $0 +l $3 $2 $8 +o3u $1 $1 +[ o0o r +o1y .3 +i32 i40 ,5 o62 +i1u o4o +o3z $3 +sA1 $2 $3 +i3o i40 o56 +$0 $1 $1 $5 +ss1 $4 $1 +o56 $6 +i51 sy0 $1 +$# $2 $1 +i1. i3. i5. $. +o2e $1 $1 +o41 i50 o63 +i4o o56 +o3i o5a r +^! ^! o2! r +o2h o3i +o0k o2d +i2r o4o +^r $1 $2 $3 +i1u i2s +l o53 o65 +i1o o2e +o2i $1 $5 +D2 o2r +o0a i1z +o1e o3j +o2c o4a +o4z i50 o68 +o3o $0 $4 +o3s $i +i42 sy0 $0 $0 +l $g $o +o44 i54 i64 ,7 +i61 i71 o87 +l o61 i79 ss9 $0 +l ss2 $0 +sS1 $2 $3 $4 $5 +o3z i41 o52 +l i71 o89 i99 oA2 +o3c $y +^j o4i +i51 o60 o77 +$0 $9 $2 $4 +i2i o5o +i52 se0 i70 o88 +o41 i50 i60 ,7 +o0n $2 $9 +^9 ^9 ^2 R3 r +o2e i3l +o67 i78 o86 +i39 o48 ++0 i3a +i86 i96 ,A +D1 i4e +^2 ^1 ss3 $4 +o3o $1 $9 +o62 ss2 $2 +l o70 i80 o97 +sg6 $9 +i4y o5. +o1i o6o +-2 o5o +i3z i42 o50 +o5a o6m +o4c $e +o1u $0 $9 +i3i o53 +i3d o4o +$1 $0 $8 $8 +o2i $0 $5 +sy2 $4 $7 +ss6 $2 $4 +l i52 o64 +i2n D4 +o74 $4 +l i52 i60 ,7 o82 +o0r $9 +o2v i3e +o4o o5v +l o5s o61 +l o66 o72 +sg2 $0 $0 $7 +o1l o2e +l $5 $0 $5 +i41 sr2 $3 $4 +o2! +l $0 $0 $0 $0 +o0d i2i +i4e r +[ $7 $5 +D1 $5 $5 +o3d o4o +o0v i4a +o3w i4i +D2 i51 i62 o73 +o6y ] +D3 $# $1 +i4o i52 o63 +o0y $0 $2 +[ $1 $9 $7 $8 +i32 o43 o54 +i2v o3e +o2i o3c +l .1 +^1 ^8 o21 r +o4a $p +i53 o61 o74 +i51 o69 ss9 $9 +l $1 $3 $7 +l o77 i87 ,9 +o0k $m +^7 ^9 ^1 o35 +[ o2u +o4r D5 +sw1 $2 $3 +i46 sy6 $6 +o0b $8 $9 +l $8 $1 $5 +se0 $0 $1 +o0l $3 $0 ++1 $1 $2 $3 $4 +o2b $1 $2 +o0L $1 +se3 $4 +o2j o4a r +$7 $8 $1 +$y $j +o4e $1 $2 +o3p i4a +o3l $o +,3 ,5 +^1 $s +D4 $0 $5 +o0n i3u +o1a o2l +i5i o6n +^2 ^5 ^2 ^4 r +i38 i40 o55 +o41 ss5 $9 +i2n $1 $2 +,4 $1 $1 +o0x i1a +$u $z +o4y $e +o52 i60 i71 ,8 +o2a o51 +o1e $1 $0 $1 +sd5 $7 +o0n $2 $0 $0 $6 +i3i o5e +-0 $6 +l $2 $4 $2 $4 +i1a i2z +i53 o65 o77 +o4h o5u +o0b $2 $8 +o3i $2 $0 $0 $4 +l $6 $1 $4 +i46 i51 o67 +l o45 +o1i o5k +^0 ^0 ^0 R3 r +ss3 $0 $4 +i5a o6u +l $1 $3 $1 $4 +o0f o1o +i61 o72 i81 o92 +l $8 $0 $5 +i18 i28 i38 i48 ,5 +o0f o1a +l i77 ,8 ,9 +se1 $9 $8 $3 +i21 i30 i41 o59 +o0f i3i +o2w $a +ss4 $e $v $e $r +o3y i41 ,5 +o51 ss2 $5 +i71 i89 i99 oA4 +$4 $6 $7 +i52 o60 $0 $5 +^< ^i o23 +o2i o5y +i51 i60 o76 +^r r +i3i $1 $2 +o2k o5i +o1u $4 +D3 $9 $8 +o0s $2 $4 +i42 i50 o69 +o0p $2 $4 +i3a i41 o59 +ss8 $2 $8 +o2l o3i +o42 $0 $0 $0 ++4 $o +o1o i2m +o53 $0 +o1e $9 $9 +i1y i2n +^e ^z +i2y ,4 +sY1 $1 +i72 i80 ,9 +o5z i61 o73 +-0 $2 $6 +i38 i41 o53 +i1a o3a +R5 $7 +o0d $9 $0 +-0 i1i +$3 $8 $3 +o6o ,7 +$l $e $o +se8 $9 +o2d i3y +o6k ] +o3a i4t +i41 i52 sr3 $4 +i3a $a r +o6# +i31 i41 i50 o64 +$2 $3 $0 $2 +R7 $2 +o0j $7 $4 +i51 i62 ,7 o81 +o0j o53 +^j o3i +o1o $3 +o1o o5n +i2c o3i +ss6 $1 $4 +sb2 i11 r +o2s o4i +$3 $7 $8 +o6# $1 +l o64 o76 +o0p $1 $6 +i3t i4i +o3y $0 $2 +o1e o6o +^5 ^6 ^7 ^8 r +o2u o5u +$0 $1 $2 $7 +i57 i68 o76 +$1 $8 $2 $3 +$0 $9 $3 $0 +o1u o5z +o0k ,6 +R6 $7 +o1o o5y +o0z $2 $0 $0 $0 +o52 i62 o73 +o55 $6 +l $z $a +o2a $0 $7 +i4i i60 o76 +i39 i41 o57 +$9 $3 $7 +o2e $0 $7 +i4o i51 se2 o73 +o5m i6a o7e +o0d $9 $4 +i5Y o61 +i44 o5e $v $a +ss1 $9 $5 $7 +o54 i6e i7v o8a +^3 ^2 ^6 r +,1 $2 $0 $0 $6 +o51 i60 o77 +$2 $3 $6 $9 +o51 i63 o71 +$a $q +^1 ^2 ^3 ^4 ^5 +o3m $1 $2 $3 +o0c o4u +i31 i42 i52 ,6 +i3o +4 ++0 $0 $9 +o5v r +sd5 $4 +o4y i54 ,6 +$5 $3 $2 +o3s $1 $2 $3 +sr1 $9 $9 $0 +l $h $a +D2 $h +D2 i3u +o4h o51 +^1 $5 +o1u $2 $4 +$o $0 $8 +i63 i71 o83 +^5 ^5 ^5 ^5 ^5 o55 +o75 i85 ,9 +i31 i40 o59 +^1 ^6 o22 r +^y ^a ^j T3 +i3c ,5 +o5y i61 i70 o81 +o0l $u +o2e o5n +o1o $6 $9 +^a o2u +sd6 $4 +o0v $1 $9 +o0k $5 $0 +i3n $y +i31 i45 o51 +o0k $1 $5 $9 +o3o $k +$a $g +se8 ,7 +o2v $o +ss1 $5 $5 +i6a +o54 o6e $v $a +o0k o2s +i41 i50 i61 R7 +o6a $a +i75 ,8 ,9 +o3i i41 i52 o63 +o32 i43 o54 +^9 ^6 ^1 o31 r +i51 o69 i77 o81 +^7 ^2 ^3 r +o53 i65 o77 +o2y $z +i1- +o0z $9 $3 +i1e i4i +o3l i4e +D5 $6 +o4a $1 $9 +,4 $4 +o4z i50 o66 +D1 .2 +o0k i2n +$0 $0 $1 $2 +$5 $3 $3 +o2r D4 +$2 $1 $6 $9 +i44 i50 o68 +ss7 $1 $5 +i31 o49 i58 o62 +[ $2 $2 $2 +sy4 $0 +o1e o5e +[ $7 $6 +o2s o5i +i1a o2t +o0c $9 $3 +o4a $8 $9 +o3f r +o3z i41 ss2 $3 +^8 ^1 ^2 r ++0 D2 +o1i o2j +l $1 $9 $8 +i3i i48 o57 +$3 $6 $3 $6 +o4< o53 +$3 $3 $9 +i1i ,4 +^2 ^2 ^8 r +o3f D4 +o0f D1 +i2o $y +^0 ^0 ^8 R3 r +i30 i41 o56 +o5a $2 $3 +i3c D5 +i53 i61 o78 +o0h D3 +i31 o49 ss9 $1 +ss_ $1 $1 +o1x $1 $2 $3 +o51 i69 i77 o82 +i4n $1 +i42 i50 sy0 $6 +i1i i4a +i2n D5 +i51 i69 o77 o82 +[ o0r +l $1 $3 $3 +o4a o5t +i21 i30 i42 o56 +l o62 ss0 $0 $4 +sD1 i1d +o41 ss0 $2 +[ i2e r +i3y o5o +o4a o5q +o71 ss1 $1 +o64 i7m o8e +-0 o6a +se8 o65 +$0 $7 $3 $1 +i41 i51 i62 o70 +.0 D5 r +^j $1 $4 $3 +o3e i4n +o0h o1y +o3u $2 $2 +o4l o5a r +st7 $7 $7 +i36 i45 o54 +$1 $5 $2 $4 +o43 i51 ,6 +$1 $4 $3 $0 +o1m $1 $9 $8 $9 +i31 ss9 $8 $2 +o3u $y +i31 i49 o58 o62 +o2k $1 $4 +ss9 $1 $0 +^2 ^1 l $1 $2 +i32 o40 $0 $6 +^4 ^0 ^0 r +i1o i2s +^1 ^6 o29 +i21 i32 i42 o58 +^a i4u r +o0y o4a +^0 ^2 ^0 ^1 ^0 o53 +l o6g +$1 $8 $0 $1 +D1 $1 $9 $7 $1 +o2i o5l +.0 i4e r +o1o $u +o1i $2 $0 +i4h o5o +o4e $z +l i42 i50 i60 o76 +ss5 $0 $0 $0 +l o61 ss9 $9 $3 +o0c $2 $8 +$k $a $1 +o1e o2m +o9e +^8 ^2 ^8 o32 r +l i52 o60 i70 o82 +i3y o41 i52 o63 +o0y $6 $9 +i4p o5a +o1o $2 $4 +o0i $e +l i60 o73 +o0e i1i r +o50 i69 o78 +o3i $8 $5 +o5M +i43 ss4 $5 +i3m i4o +,3 $1 $7 +i2e o5y +st2 $7 +^2 ^2 ^2 o31 r +^b $1 $2 +$y $8 $5 +o5B +$2 $7 $6 +^1 ^4 o20 r +$5 $8 $7 +i1h ,5 +o71 i89 i99 oA0 +l o5g o61 +i2r o3o +i4y o5o +o5i $2 +i1s $1 $2 $3 +D5 $y +i4l o5a r +i72 i80 ,9 RA +l i61 o79 ss9 $3 +ss3 $2 $8 +i2i $1 $2 $3 +o3w $a +o2a $2 $3 +^1 ^1 ^1 ^7 r +o54 i6e o7v $a +$o $t +^a ^j $1 +i4f o5i +o0H $1 +i1i o4o +sy6 $8 +i41 i51 i61 o73 +i3s o4o +sS0 $0 $7 +^1 $a r +ss1 $1 $2 $8 +sy1 $9 $7 $7 +l $6 $2 $4 +o31 i49 ss9 $1 +i31 i40 i51 R6 +$1 $5 $1 $7 +^7 ^9 ^1 o31 +[ o01 r +l $1 $5 $1 +i43 ss1 $6 +o0f $4 +i2w i31 i42 o53 +l $4 $2 $7 +o5c o6k +o1y $1 $5 +$2 $3 $2 $5 +o0s o3i +D1 o3e +i51 o62 $3 $4 $5 +^* ^* +o3u $2 $3 +ss_ $2 +$0 $6 $1 $3 +[ o4e +^m T1 r +i3a i49 o51 +i3y o51 +i33 i42 o50 +o0n $! +i42 i50 o66 +^1 ,4 +o2e $0 $8 +st2 $0 $0 $4 +ss6 $1 $5 +o1c $2 $0 $0 $7 +o0s $8 $8 +ss1 $8 $9 ++0 $6 $9 +i75 o88 +$6 $3 $1 +i72 o80 i90 RA +o0z i2r +i2c o3o +o0j o1a $1 +^5 ^6 ^1 r +o1i $2 $7 +$0 $3 $2 $2 +,6 $a +l o62 i70 ss0 $4 +l $9 $2 $4 +o0g $9 +$0 $9 $2 +l $2 $0 $3 +i5a o6k o7o +o0a o6a +D3 o3t +o0h i4a +i64 o72 $0 +o0l i3e +o62 i71 o80 +^8 ^7 ^6 ^5 ^4 o59 +o2e $2 $2 +l i63 ,7 +i21 i31 i42 o59 +o4a $0 $2 +i79 i89 ,9 +i41 i52 i63 i74 i85 i96 iA7 iB8 oC9 +o1u ,3 +i3i o4b +$0 $6 $2 $7 +$9 $8 $6 +o1k ] +o3z $5 +o52 i60 ,7 $0 +ss1 $2 $1 $9 +i3y i42 o50 +o2y i3s +^1 ^9 ^5 ^7 r +l i62 o70 ss0 $4 +^a D3 r +^1 ^0 T2 r +o3e o4n +o1o o2k +i43 o51 ,6 +o51 i62 i72 o81 +sd5 $0 +i2i i4a +o2z o4i +l i49 o53 +i5c o6o +o2d $1 $2 +^1 ^6 o21 r +^1 o1r +o58 $6 +o0h $0 $9 +l o6a $1 +o0p $1 $8 +o31 i49 i58 o62 +i5o o6u +i3j i4i +i2l o5i +D1 ,3 ++3 o4u +o3c $e +o2i $2 $4 +i2e .4 +i3n o51 +se0 o62 +i3i i5a +$_ $2 $8 +o0k i1i $1 +i6j o7o $e +i42 sy0 $0 $6 +l o88 o96 +$_ $1 $2 $3 $4 +o1y o3o +o3w r +^2 ^1 i61 o72 +o3o $2 $7 +o0e i1l +i3z o5y +i53 i65 o77 +i4i o57 +i71 i89 ,9 oA0 +o0k i52 ,6 +i3a i40 o59 +o24 r +sY1 $3 +l o61 i79 ss9 $3 +o3i $1 $9 $9 $5 +o31 ss9 $9 $1 +o2g $1 $2 +o5v o6a +^* ^* i5* ,6 +i31 i49 ss8 $2 +,4 o53 +i3i i40 ,5 +D2 o3j +o3e $2 $3 +^0 ^7 ^9 ^1 +o43 $4 +o1a $1 $2 $3 $4 +$n $a r +,1 $1 $0 $1 +i41 i52 i61 o77 +i5r o6z +o1a o6i +D1 $! +o50 ,6 $1 +o3o $8 $8 +i35 i41 o56 +o0a i1h +$2 $2 $2 $3 +$7 $7 r +i51 ss9 $8 $6 +o0n i4i r +o3t $1 $2 $3 +o2r $1 $0 +o0j $4 $0 +i31 i49 ,5 o67 +$a $7 $7 ++3 i4o +o2r $2 $1 +$6 $0 $7 +i51 i61 o74 +i32 i41 i51 o62 +$2 $5 $1 $6 +ss_ $0 $7 +i40 ,5 i60 ,7 +o6b o71 +o0j $4 $7 +i61 i70 i80 ,9 +^4 ^2 ^2 r +$7 $8 $9 $4 $5 $6 +^5 ^4 o22 r +o2z $2 $1 +^1 $. +o0v i4i +o61 i79 ss8 $1 +i2r ,5 +$2 $6 $0 $6 +$5 $9 $0 +o2e i3y +o2y $1 $1 +$2 $2 $1 $3 +i2e o3a +o2s o6a +o61 ss9 $7 $9 +l ] r +o0j $2 $2 $2 +o3V +i5y i61 o77 +i31 o49 i59 o67 +o5a i61 o78 +i31 i49 i55 o67 +o0k $7 $8 $9 +o1e $1 $4 $3 +o4c $i +i4i i61 ,7 +o5a o6r +^2 ^5 ^8 r +i3i D6 +i31 i49 se9 $3 +$5 $9 $9 +[ $6 $7 +sg0 $8 +ss4 i13 i22 i31 r +o41 i59 i67 o71 +i41 i59 o67 o71 +i59 i61 o76 +o1f r +o54 ss4 $4 +o2u o51 +i40 i50 ,6 ,7 +o64 i74 ,8 +l i62 i70 o81 o90 +i61 o79 ss8 $1 +i21 i30 i42 o55 +o2e o3l +$0 $2 $2 $8 +o0h $2 $4 +l D9 +i21 i30 i42 o57 +i65 i76 o87 +o50 i61 ,7 +o1m $1 $9 $9 $5 +o41 ss2 $5 +o3k $0 $1 +se1 o75 +l o6t +^0 ^7 ^1 ^1 r +$6 $6 $0 +i4z ,5 $z +o61 i79 ss7 $9 +o3y i42 o51 +l o62 i70 i81 o90 +i3z ss1 $2 +o0p i4o +o3a $6 +i41 i51 i62 o76 +o3y i42 o53 +se1 o78 +i56 i61 o79 +^1 ^2 o23 r +se8 o64 +o3j o4a r +o65 $6 +^1 $7 +^4 sb3 i22 i31 r +l $5 $3 $1 +D2 $1 $9 $8 $1 +o2s o3a +st1 $1 $1 +,1 $2 $0 $0 $8 +o4y $h +o0i D2 +i50 o69 o78 +o0k $g +i3z i43 ,5 +^4 ^3 ^2 ^1 D6 +o0o i1o r +i31 se9 $9 $3 +l $0 $5 $0 $6 +[ o5y +,3 D5 +i21 i32 i42 o59 +^2 ^3 ^2 r +o3u $1 $2 $3 $4 +o0k $5 $2 +o0k o2y $1 +o4i o5n +i61 o79 ss7 $9 +^2 ^2 ^1 o34 +o2n $1 $1 +i21 i32 i43 o51 +$1 $8 $0 $3 +o2i o3y +l $8 $2 $0 +sS3 $1 +o4y i50 o62 +o53 $2 $1 +i31 i41 i52 o64 +-0 $8 +o1j $1 $9 $9 $6 +i4z i5z ,6 +i2a o4a r +i61 i72 o87 +o0t o3u +o2u $y +sn6 $9 +$f $c +o0C $1 +^u T1 +o01 i12 r +o7g +o2o $y +l $7 $2 $5 +i41 o59 i67 o71 +$1 $1 $8 $5 +o3t i4o +sd7 $8 $9 +^4 ss3 i22 i31 r +o5C +o3e $2 +i5z o62 +i50 o61 ,7 +l $4 $2 $9 +$i $l r +ss1 $1 $0 $1 +i51 i63 o71 +o52 o60 $0 $0 +o5w o61 +[ i1y r +^0 ^7 o21 r +l $1 $0 $0 $2 +$s $y +ss6 $0 $6 +o0f o5i +l o89 o94 +o1a $k +l o52 i60 i70 o82 +i3i $z +l o73 o85 +i42 ss1 $2 +ss1 $1 $0 $8 +i61 o72 o80 +o0z $a r +D1 $5 $5 $5 +sb4 i13 i22 i31 r +R5 $4 +$i $r +i43 i51 R6 +o99 ,A +,3 o61 +i71 o89 i99 oA0 +o4o o54 +o2r o4y +i31 i42 i53 o64 $5 +i3a i40 ,5 +i64 ,7 ,8 +i42 i54 o65 +o0x $a r +o1a $l +sn1 $0 +l $4 $1 $6 +o61 ss9 $8 $1 +^1 ^1 ^1 ^6 r +^k D2 +^5 ^1 ^5 +^3 ^4 ss2 i31 r +$h $h +o0p $0 $9 +o1e $2 $6 +^x o1e r +^a ^k $1 +o5a $u +[ $7 $4 +i41 sS2 $3 $4 +sg1 $4 +i21 i31 i42 o50 +o40 i50 i60 ,7 +o1e $k +sn1 $8 +o0s $9 $9 +o52 o6u +o3p $o +i32 i40 o53 +o0z $0 $0 +i35 i45 i55 ,6 +o0j o2j +o0z o4y +l o6i $1 +i51 i69 ss8 $6 +^5 ^4 ^2 ^5 ^8 o56 +o4d $o +D4 $m +i21 i31 i42 o56 +$m $i $a +o1y o5l +^4 ] +o0b i2a +o0z i4h r +o4y i58 o67 +o3i $j +o0t o2y +o0l $2 $0 $0 $5 +$e $4 +o31 i49 i59 o67 +o2e i3i +-4 o5e +i3c o4y +^1 ^2 ^3 ^3 ^2 ^1 +^1 ^6 o25 r +ss7 $4 $7 +o4o i51 o65 +o1u o5e +[ o4y +$1 $8 $2 $4 +sy1 $9 $7 $8 +sd2 $3 $4 +o4e $o +i31 i41 i50 o63 +$2 $2 $! +o3y i41 o55 +l $k $i $m +i1u i2m +o5a $e +sd2 $0 $1 $0 +^a ^1 ^2 ^3 r +ss1 $9 $5 $8 +l $2 $0 $1 $3 +i3d i4i +o0g $3 $3 +o55 i62 o70 +i45 i51 o62 +o42 o5u +o1a o5m +o1i $9 $9 +^3 ^4 sb2 i31 r +sR1 i1r +i3a o4g +i58 i63 o71 +i3n D5 +^1 ^2 o2y r +o4y i57 ,6 +o1j $1 $2 +se5 $5 $5 +o4m $o +^7 ^0 ^8 o30 r +$1 $1 $9 $9 +^z ^m +D4 o4n +i62 o71 o82 +^o o1o r +i3i o4r +o0d o5u +o2c o3i +i72 i84 o97 +$5 $3 $7 +i2f o3i +o2f i3f +se6 ,6 +l o83 o91 +i1. o3. +l ss0 $9 +o2e o5l +o0* +o4u $1 $2 $3 +o1l $2 $0 $0 $8 +i42 ss1 $0 +i2d o3u +D1 $9 $9 $9 +i3a o61 +^2 ^3 ^2 ^3 ^2 o53 +o2a o61 +o4y sr1 $2 +,2 i3a +o2i o4e +i51 o69 i77 o82 ++0 $2 $0 $0 $7 +i41 i52 sS3 $4 +o1o -2 +D2 i3k +i31 i44 o51 +^* ^* i6* ,7 +o4k i5a o61 +o52 ss1 $1 +l i51 i69 o78 R8 +i4g ,5 +i3s o5y +.2 ,5 +o5a o6o +i3g o4o +l $o $o +D1 i3o +$0 $6 $! +i3a i41 i50 o61 +o4o o5j +i31 i49 ss9 $7 +^3 ^4 sc2 i31 r +o0j $1 $9 $7 $4 +o2y $1 $4 +o51 ss9 $7 $6 +i3b ,4 +i4e o5k +o0k o4a $1 +i48 i51 o67 +sg2 $0 $0 $6 +sc4 i13 i22 i31 r +i26 i35 i44 i53 i62 o71 +o3z $0 $0 +l o72 ss0 $0 $8 +o1e $! +i32 i45 o50 +o5z $2 +l o72 ss0 $0 $5 +i41 o59 ss7 $4 +[ i4a r +i31 i49 se9 $0 +D1 $1 $2 $3 $4 $5 $6 $7 $8 $9 +^1 ^1 ^1 ^0 r +o51 i69 ss7 $6 +l i52 o60 i70 R8 +o0g $2 $0 +$7 $7 $1 +ss_ $1 $5 +i1m o2a +i3l o5a +$0 $5 $3 $1 +i3e o41 +o0z o1i r +i3a i41 se2 $3 +D1 i3e +i2a o5e +i61 i79 ss9 $7 +o0i D1 r +i43 i52 ,6 +i3d o5a +o1i i2c +i4o i51 o60 ++4 $h +o5o $n +o0j $2 $0 $1 $0 +o0k $1 $1 $2 +i35 i44 i53 i62 o71 +i2v o3a +i2r o3u +i3y i41 o52 o63 +i4o o5g +o74 R8 +o4o o6o +^1 ^1 ^0 ^9 r +$8 $7 $8 $7 +o1u i2z +^( o6) +l o72 i80 ss0 $5 +l o23 +^9 ^2 T2 +-4 D5 +$1 $8 $0 $2 +sr2 $0 $0 $9 +o1m $1 $9 $9 $3 +i31 ss9 $9 $7 +$0 $7 $1 $5 +o32 $0 $0 $6 +i51 i69 i77 o82 +l $8 $1 $6 +i42 o55 i62 o75 +o0j o3c +D1 o1c +D6 o6n +o0o ] +^j o2a ++4 $e +i1r $i +o1o i2s +i1c $1 +i3z i41 i50 o61 +i52 i62 o73 +i3o o4g +l i62 o70 i81 o90 +o1e o5z +o1j $1 $9 $8 $9 +i31 se9 $9 $0 +^o ^y T2 +o0z $1 $1 $1 +i1l o2i +sl2 $1 +i61 i72 i82 o91 +i3b D5 +i33 i40 o51 +o1o .4 +sy7 $1 +o0p D1 +^a o1h +o43 $2 +o42 i55 i62 o75 +ss8 $1 $4 +o42 o50 $0 $8 +o0f $2 $1 +i1h i3e +^2 i54 o6u +^1 o1k $1 +o3t o4i +,6 ] +i42 i55 i62 ,7 +o41 ss9 $7 $4 +o0t o51 +i42 i55 o62 o75 +o61 i72 o84 +so1 $2 $3 $4 +o0y i2u +$0 $3 $1 $9 +o0k o1h +o5k ] r +o2k o3e +o0c o2i +o0p $u +$1 $4 $0 $3 +o43 ss6 $0 +o4i .5 +o2r o4o +i4d o5y +o0e $1 $3 +i4o i52 ,6 +^o ^e ^n +l $1 $0 $0 $9 +o4f o5i +i5x o63 +i64 i74 ,8 +si1 se3 +i1a i2h +$4 $6 $4 +i4y o5i +o4e o6e +l $c $h +$7 $7 $7 $7 $7 +i5d o61 +o2a ,5 +l i51 i69 o78 o85 +^0 ^3 ^0 o31 r +o0c o2e +^4 ^1 ^4 r +^1 ^2 ^3 o4l r +i1a o3y +[ i4i r +o0n ] r +$8 $2 r +o0s $2 $5 +^4 sc3 i22 i31 r +o2k $1 $5 +o0o D1 r +^5 ^6 ^2 r +o42 i50 ,6 $8 +o0p i3a +o2i o3n +$4 $7 $5 +^2 ^1 i41 o52 +l $_ $0 $1 +i2r i3u +$0 $8 $1 $9 +o0j $e $1 +ss2 $0 $7 +l o72 i80 ss0 $8 +^9 ^9 ^1 o39 +i6i o71 +i33 se2 $1 +^1 ^9 ^1 ^9 r +^1 ^9 o21 r +o1e i2b +i61 ss9 $8 $2 +i31 ss9 $8 $3 +se3 r +i42 o51 r +i61 ss9 $9 $7 +-0 i4a +o1y $1 $8 +se6 o69 +i1e i2k +o0j i1s +sr7 $9 +-3 $e +o83 o97 +i31 i41 i51 o67 +-0 $1 $0 $1 +^0 ^7 ^0 ^8 r +^2 ^0 ^7 o31 r +,2 o4o +i2z $a +.3 $2 +i3a ,4 $a +i4e o52 +o0R $1 +sd1 $2 $1 $2 +l $9 $2 $1 +i52 o60 R7 +i2r o6a +o0m $3 $1 +o0x o1a +i31 i40 i50 o63 +i51 o69 ss7 $6 +^0 ^2 $0 $7 +D3 $m +o0g o2r +D2 o52 +l o5c o61 +ss5 $1 $7 +$3 $8 $8 +o0p $1 $7 +^o ^1 r +^0 o16 r +o2p i3h +o0h o5a +$0 $6 $2 $2 +l i72 o80 ss0 $5 +i3y +4 +o41 i59 ss7 $4 +ss4 $2 $5 +l i52 i60 ,7 R8 +o2z i3u +o4a $0 $3 +i31 i42 i50 o67 +o0d $0 $0 +i2b o3u +l o51 i69 i78 o85 +o1a i4u +i54 o6e $v $a +i3r o5o +o0i o1a +sy8 $8 $8 +l o2x +o4s r +o4x $1 +l o51 i69 i78 R8 +i42 o50 ,6 $8 +l i72 o80 ss0 $8 +i2k o5a +o3y +4 +o0r $9 $5 +,5 $y +-3 o5a +l i51 o69 i78 R8 +$\ $\ $\ $\ +$0 $0 $1 $1 +sd1 $9 $7 $8 +l $1 $7 $1 $7 +l o53 o66 +l i69 ,7 +o81 $7 +i3a i4s +$y $6 $6 +R6 o74 +i2m o4a +l $y $a +o2y i3l +$x $4 +sn2 $4 +o2y i3n +l o76 o87 +o31 r +,5 $n +i1o o2k +$3 $4 $9 +i31 i49 ss8 $3 +,4 o52 +o0y o4y +i35 i42 o55 +o4y i50 i60 o77 +o2y i3k +i41 i51 i63 o70 +D5 $1 $4 +^s ^m T2 +,5 r +$9 $7 $9 +o4o i52 ,6 +o2o $1 $2 +$i $1 $4 +o0w $5 +o1i $k +o2n $3 +^2 ^0 ^1 +i61 i79 ss8 $2 +o4Z o5A +o0p $1 $2 $3 $4 +i3i i49 o55 +o06 i10 r +o3i o6a +-4 ,5 +o2h o3u +$1 $4 $6 $9 +o5a +6 +o6q +o0z ] r +o53 ss6 $0 +$8 $0 $7 +o40 $0 $7 +o1e $9 +$5 $8 $8 +st1 $9 $9 $6 +i71 o89 i99 oA3 +o2u o61 +$2 $6 $0 $1 +o0a $1 $5 +o0t o61 +i31 i43 i51 o64 +i5y o61 o72 +$b $o $i $1 +o4y $9 $9 +o2i o4z +i81 i92 iA3 oB4 +o2e $1 $0 +l i4i $1 +o0t i2r +o3z $2 $9 +i4y se1 o66 +l $b $2 +l i72 ,8 +sr8 $2 +o2j o3e +$2 $6 $1 $2 +o43 i52 o63 +$. $1 $0 +o1a o6z +i59 i60 ,7 +i2e o4y +o0g $2 $5 +i5v o6a +$3 $3 $8 +$6 $5 $2 +^9 ^2 ^3 r +sk1 $2 +i7! ,8 +o67 $2 +i45 i52 o63 +$6 $7 $0 +i2m $1 +$5 $9 $8 +^5 ^4 ^3 ^2 ^1 r +o0d i1y +i41 o59 ss6 $9 +i4l i5e +i42 i50 i61 o73 +i45 i52 o65 +^1 o16 r +^1 ^7 o23 r +i52 o60 ,7 $9 +i21 i31 i40 o53 +i2e o6a +o2i $7 +$! $1 $2 $3 ++2 i3e +o0z o3y +o0j $5 $0 +i3b i4o +o0o o5a r +o5a $5 +i2y i3e +$2 $9 $0 $8 +i31 i42 o53 $4 $5 +$0 $6 $2 $0 +i61 i73 o85 +i41 i59 ss7 $3 +o1o o4z +l o71 i89 i99 oA5 +o1i o4k +i4a o59 +o62 ss4 $7 +i3n o5o +o0g $u +D1 $7 $8 $9 +o4e o5a +o0y $6 +i3n o4y +i2n i3o +l i5u +o1o i4e +l $t $h +l o88 o95 +l o3x +-3 o4e +i41 i51 i61 o72 +o4z $1 $4 +o1o $0 $5 +o2b i3u +$z $8 $8 +i42 i50 ,6 $5 +i18 i28 i38 i48 i58 ,6 +o2r $0 $1 +^j $7 +o4g o5u +i2z o3u +ss7 $5 $7 +o3i $9 +l o77 o82 +l o3p +^j $0 $5 +l o77 o83 +o4y $c +i51 ss9 $8 $4 +i2u ,5 +o2l o6a +i3i i4s +o5g $a +sl0 $1 +l i71 i89 ,9 oA5 +o0k i51 o62 +o4z i51 o60 +^9 ^0 ^9 o30 r +o3z i41 o53 +o3k $2 +o4u o5m +i5i i6t +i33 i40 o54 +l ,6 ,7 +o53 ss1 $6 +o41 ss9 $6 $9 +o0m $9 $5 +i52 o61 o76 +i41 ss9 $7 $3 +o4y i50 o63 +^7 ^1 ^2 r +^3 ^9 ^9 ^1 D5 +o1a o5a r +o3y i4n +^~ l $~ +^8 ^1 ^8 o31 r +$2 $9 $6 +se0 $4 +i3t i4o +D1 $2 $3 $2 $3 +-2 o4i +^a i3a +i2s $o +i3i o5m +i76 o80 +$1 $4 $7 $8 +o07 i10 r +o4h o5o +$` $1 +o0c $n +i71 o82 o91 +.0 i2o r +^i $e +se1 $9 $7 $9 +l i51 o69 i78 o85 +o0* r +o4m o5e +o41 i59 ss6 $9 +l o5t o6a +o1e ,3 +^0 ^2 ^0 ^2 r +o4y $1 $2 $3 $4 +i34 i42 o56 +l $6 $1 $5 +o1u o2s +i4g o5o +o78 $6 +i4i o65 +i4k o5y +i39 i42 o51 +^a o6a +l o6_ o71 +$e $1 $4 +l i69 o71 ,8 +o2j $1 $3 +i4i i61 o74 +o2r i3u +l i51 o69 i78 o83 +i62 ss0 $0 $1 +ss1 $1 $0 $2 +l o69 i71 ,8 +o2g i3o +l o56 ss6 $6 +$7 $7 $8 $8 +^5 ^4 o26 +^9 ^9 $9 $9 +i4d ] +i3c o4e +o78 $3 +i35 i42 ,5 +$5 $5 $2 +o1u o2z +l i51 i69 o78 o83 +o0g $2 $7 +o1y $1 $7 +ss1 $0 $0 $4 +o4u $o +i3o i42 o56 +^1 ^5 o25 r +$2 $8 $0 $3 +.2 $1 $8 +$z $e +i3u o4l +l o52 i60 i70 R8 +o3y o5i +[ $7 $8 $9 +ss9 $6 $3 +^2 ^0 ^5 r +i41 ] +o0h o5i +o4o o56 +o39 i41 ,5 +i45 i54 i63 i72 o81 +i32 i40 ss0 $2 +i87 o96 +.3 $3 +$1 $2 $6 $9 +l $m $c +i41 i52 i63 i74 i85 i96 iA7 iB8 RC +sn1 $6 +i5a i61 ,7 +i4o +5 +sn1 $7 +o0m o1r +i89 o97 +i62 i70 ss0 $1 +i51 i69 ss8 $4 +i43 o52 o63 +o2p i3o +l o65 R7 +^2 o18 +l $r $o +o3z $7 $7 +o1l $1 $9 $9 $2 +o0d $4 $4 +o1i $0 $2 +^0 ^2 ^1 o34 +[ $4 $5 $6 +D2 $t +o0e i2h r +^2 ^2 o22 +i4g o5h +ss1 $6 $8 +i32 ss0 $0 $2 +o3e o4a +$6 $8 $7 +$1 $9 $1 $6 +$o $1 $9 +D3 $2 $0 $0 $0 +l $h $o +i3t o4u +$5 $2 $5 $2 +i4y se2 ,6 +^1 ^2 o2a r +^1 ^0 ^9 o31 r +.0 $y +i2I +i3a i41 ss2 $3 +o1i $2 $8 +^f o1a +i4$ ,5 +o66 ss1 $9 +o3y i40 o57 +$9 $4 $9 +$1 $2 $8 $4 +i3n $i +ss2 $5 $2 $9 +o3a $1 $9 $9 $4 +o0l o3u +i1a ,4 +i4i +5 +i41 i52 i62 o77 +i3m $1 +o2y o3i +i3g ] +o1s $a +o2l i3y +o0h $0 $3 +o4r o5y +ss6 $2 $1 +,3 $1 $8 +o2g ] +$1 $6 $2 $0 +l i71 o89 i99 oA5 +o2i $1 $4 +^1 ^2 o2z r +st1 $9 $8 $5 +o75 $5 +i71 i89 ,9 oA3 +i2z o5a +l $j $2 +o0s $! +o4y i51 i62 i73 o84 +i39 o41 ,5 +i36 i41 o56 +i38 i41 o52 +$1 $2 $9 $4 +-0 o1u +o05 i11 r +$a $2 $9 +i1o o2m +o0y $a r +l o51 i69 i78 o83 +^y ^a r +D4 o4h +^9 o14 r +$9 $5 $5 +l ss2 $5 +$2 $4 $4 $2 +o4y $8 $8 +ss_ $0 $1 +$3 $7 $3 +i3i i49 o50 +$2 $0 $2 $2 +i61 i72 ,8 +i5o ] +l $1 $9 $5 $4 +i2e o3s +i31 i49 o51 +$y $6 $6 $6 +o0q $1 +o3d $y +ss2 $3 $5 +so0 o71 +o3s o4o +[ $9 $1 $1 +i44 o6v o7a +o1u o4z +^3 ^1 ^9 r +$1 $9 $3 $0 +o1e $8 +o5u $1 +i2a $y +o4p $a +o3a $1 $4 $3 +$9 $7 $4 +o2d o3i +l o51 i69 i78 ,8 +o0a $7 +^c r +o51 ] +$2 $1 $3 $4 +o3u $k +i41 o59 ss7 $0 +i36 ,4 +$2 $6 $0 $7 +ss1 $2 $0 $8 +^0 ^1 ^0 ^1 r +o0n o61 +o1z D2 +D4 -4 +sl2 $0 $0 $7 +i63 i70 ,8 +o58 i61 o73 +o0c o3y +^7 ^2 ^2 r +i52 i62 o74 +o4t o5y +l i50 o63 +o4s ] +o2v i3a ++0 ,5 +o5o o6l +o3o i4o +R4 $5 +o0f D2 +o3o $2 $8 +o0n o4a r +i32 i43 o52 +l i72 i80 ,9 ,A +$3 $6 $4 +o73 $4 +o2z $1 $8 +i74 o86 +o2i $8 +i53 o61 o70 +^a o2a r ++0 o1y +^3 ^2 ^1 o3d +i3k o4y +$3 $3 r +sr3 $3 $3 +i5_ o61 i72 o83 +i42 i51 o62 o71 +l i71 ,8 +o0n ,2 +$8 $6 $9 +l $1 $1 $1 $3 +o92 oA5 +-0 $! +$1 $5 $9 $0 +i61 sy2 $3 +l o72 i80 i90 ,A +o5e o6n +l $8 $1 $1 +o2i o3k +i1a o4e +o3o o5u +i1i o2c +i31 o49 ss8 $6 +^1 ^1 i61 ,7 +i24 i34 i44 ,5 +D3 $d +i1h i4a +o2u $n +o4o i52 o61 +o1a i2v +i2i i31 i42 o53 +o72 i84 o97 +o3z i4e +$1 $5 $2 $5 +^d $1 $2 +o31 o45 +,2 $e +o0b $8 $7 +^b o1u +o3d o6a +se3 o65 +^. o1. r +i2n i4i +$7 $8 $5 +-1 i2e +$i $5 +o0t o4i +o4y o5p +o53 i61 o70 +^9 ^5 ^1 +l $l $u $v +o2g $o +o0a i4a r +i5i o6k +o43 $0 +i5y i60 o75 +i41 i52 i63 o75 +i3s o4y +sl0 $7 +i4d o5e +i34 i42 o54 +$2 $1 $! +o5i $t $a +ss0 $1 $8 +$1 $8 $0 $7 +-0 $9 +l i52 o60 ss0 $0 +[ o3u +o3a o4t +D3 i51 i62 o73 +ss2 $5 $2 +l i60 o72 +o41 ss9 $7 $0 +i3z $e +o07 i10 i20 i32 r +o0n .4 +o2m $1 $2 +$8 $8 $1 +$i $k $a +^0 ^3 o23 r +o31 i49 ss8 $6 +o0j $1 $2 $1 +o51 ss2 $0 +^1 o3i r +o3u $1 $3 +l o52 ss0 $0 $0 +i2l ,3 +D4 o4b +D2 o2h +i42 o51 i62 o71 +i30 i43 i50 o64 +$a $9 $4 +ss5 $2 $2 +o31 $2 $3 $4 $5 +i41 i51 o64 +sY2 $3 +i91 oA5 +l i51 i69 o78 o86 +o1u $1 $0 $1 +o4i $0 $1 +$2 $7 $0 $4 +o0s $2 $0 $0 $6 +$z $1 $9 +o0k o5l +^1 $o +o59 i61 o76 +o0p o4i +o1h $i +o0s i1k +o0r $3 $3 +o2l $e +o1a o2s +ss5 $2 $9 +o1i $l +i1i i2s +$1 $8 $9 $2 +l o80 o92 +o2i $8 $8 +$o $s +o1i o5z +$a $2 $0 $0 $6 +i30 i42 ,5 +l $a $m +i58 i61 o73 +i4y o5c +o0b o6a +i71 i89 i99 oA2 +i72 o80 ,9 $8 +o2d i3u +l $4 $2 $5 +ss9 $0 $1 +ss9 $2 $2 +R5 $6 +$0 $8 $2 $6 +^5 ^2 ^4 o32 r +$0 $6 $1 $4 +si1 $0 +i34 i41 o59 +o0g $7 $7 ++0 $0 $4 +$0 $6 $1 $7 +o3r $e +i31 i42 i50 R6 +o0y i2a +so0 o63 +l i51 i69 o78 ,8 +$Q +o1x +o1i o3j +so0 $1 $2 $3 +i51 i69 ss8 $2 +o50 ss0 $9 +-8 +o0a $2 $0 $0 $8 +o0m $3 $0 +o41 i59 ss7 $0 +^u $1 +ss9 $1 $4 +o0k i5a +st0 $3 +i2A +o4o $g +ss9 $1 $5 +i2p i3e +$1 $7 $0 $9 +o0k o1i r +^j o3a +l $c $c +$0 $1 $2 $0 +$1 $0 $6 $6 +D4 $a r +^b l $1 +i3i i45 ,5 +o0b o3u +o0j i1b +o4t i5a +^9 ^9 ^0 R3 r +o2e $2 $1 +o4d $e +i32 i45 o58 +$3 $9 $1 +i32 i49 i59 o61 r +^3 ^2 ^1 o4s +i59 o61 o76 +o2z ,5 +i51 i69 i77 o81 +o2a $2 $1 +^4 ^5 o22 r +o4n $y +sn2 $0 $0 $5 +i1a $u +o0l $1 $9 $9 $5 +i51 i64 o75 +^9 ^5 ^5 o31 r +o4o $t +D1 o3y +o4a o6e +i2m o3u +^o ^g T2 +i3a i43 ,5 +i48 i50 ,6 +i31 i41 i50 o61 +i35 i42 o51 +l i72 o80 i90 ,A +^2 o62 +,1 $1 $9 $9 $5 +i2f o3a +o5t o6y +i51 ss9 $8 $2 +o1m $2 $0 $0 $5 +o0f o4a +,1 $1 $9 $9 $6 +o1i $9 $3 +i3o i4y +o3a $1 $9 $9 $5 +l o74 o82 +-0 $u +i3i o4l +o31 ss9 $8 $6 +o3a $1 $9 $9 $2 +i30 i42 i51 o64 +o4y sr1 $3 +o1u $2 $5 +$0 $4 $1 $9 +$b $1 $2 +R6 o77 +$3 $6 $6 +i58 o61 o73 +i5b o6o +l o83 o90 +^1 ^7 T2 r +^1 ^2 ^3 o4b r +o1e $9 $2 +o0g $0 $4 +o1e i4y +sd4 $1 +ss2 $5 $3 $0 +i2b $o +o5_ i61 i72 o83 +o1e $6 +i2r o4e +D1 o1z +i5_ i61 i72 o83 +o3o $0 $2 +o4g ] +i72 i80 i90 ,A +o42 i51 i62 o71 +o0g $1 $0 $1 +i22 i30 i41 o53 +o5i D6 +l o51 i69 i78 o86 +sk2 $0 $0 $7 +l o52 i60 ss0 $0 +l o54 o62 +st1 $9 $8 $9 +o0o ,1 r +o51 ss2 $4 +o5# $1 +^i $a r +ss7 $2 $4 +$y $0 +D1 o1r +i41 ss5 $9 +o32 i40 ss0 $3 +o2z $o +l i42 o50 +D3 $3 $2 +o2i $0 $9 +o31 i49 i58 o63 +o0z $9 $1 +sr9 $7 +i4o i51 o62 o73 +^1 o1h +i2j $a +^4 o1k +D1 $4 $4 +o0o $a r +i3i i40 o52 +l i52 o66 +i5e i60 o71 +i51 sd0 $1 +o2z $2 $2 +^i T1 r +^6 ^5 ^4 r +i5z i61 o73 +i2i ,4 +ss3 $4 $1 r +i3i i4l +^. o5. +$2 $6 $1 $1 +.2 .4 +i41 i52 o63 i74 i85 i96 iA7 iB8 RC +o0g o51 +^1 sb2 i23 +o67 $4 +$0 $2 $2 $7 +D2 $A +o5y i68 ,7 +o59 ,6 $9 +i31 o49 i58 o63 +^1 ^6 +o0k $3 $7 +D5 o5g +o2v $1 $2 +$j $2 +i31 i49 i55 o64 +l $0 $2 $3 +^8 o18 +^1 ^2 D3 r +i31 o49 ss9 $6 +$7 $7 $6 +o0h o4a +i5e o6l +o3i $2 $0 $0 $5 +^1 D5 r +o4D +$y $1 $0 $0 +o0r $6 +o4i $j r +.0 i3i r +^0 ^4 o25 r +o1e o5n +o2z $1 $5 +i41 o52 i63 i74 i85 i96 iA7 iB8 RC +$j $o $1 ++0 o5i +i4a se1 o63 +i4f +o2e o3s +l se1 $2 $3 +i4! ,5 ,6 +i1a o4y +o0z i3h r +se7 $7 +se1 o74 +o2n o3e +o2n $2 $3 +D6 ,6 +^j o1a $1 +^@ T1 +^1 ^2 ^1 o35 +^2 ^0 ^1 o34 +o4! i5! ,6 +.1 ] +l i3v +^1 ^0 ^0 ^8 r +i31 se9 $8 $8 +^y ^a ^k +i41 i52 i63 i74 i85 o96 iA7 iB8 RC +o1i i2o +o4e o5k +^4 ^0 ^6 o30 r +o0j i5e +i51 se0 ,7 +o0c $u +ss1 $9 $1 $9 +$w $1 $2 $3 +,3 $s +o0n i2i r +o0w $0 $8 +$2 $1 $2 $1 r +l i61 o79 ss8 $9 +se2 $6 +o1m $1 $9 $8 $5 +l o71 i89 i99 oA3 +o7o $1 +o51 sS4 $3 +i36 i41 ,5 +o0m $8 $5 +^3 ^4 ^1 o32 +^g ] +^3 ^1 ss1 $3 +o0s o1h +o0k $1 $9 $7 $7 +o0i i4a r +o38 ss8 $8 +^3 ^2 ^7 r +i41 i52 i63 i74 o85 i96 iA7 iB8 RC +l i60 ,7 +o4a $d +o0m o6i +^4 ^1 ^0 r +l i71 i89 ,9 oA3 +i1i o2n +l o61 ss9 $8 $9 +D2 o2t +o43 $1 +i1i o2o +o1s $2 $0 $0 $7 +i40 i50 o66 +o5x $1 +i1i i4i +o0k $5 $4 +i41 i52 i60 o72 +o1e $0 $2 +.2 $3 $3 +$0 $7 $0 $2 +D3 o53 +o2n $y +o0d o3o +^3 o13 +i51 i61 i72 ,8 +i63 o70 ,8 +o0l $. +o4z o5! +i4i o6! +$b $3 +i51 ss0 $2 +o41 i52 i63 i74 i85 i96 iA7 iB8 RC +o1e $2 $0 $0 $7 +l i60 o74 +o5g o6o +^1 ^0 ^5 o32 r +i62 ss2 $2 +$2 $3 $1 $3 +i4a ss1 $2 +ss3 $3 $3 $3 +i41 i52 i63 i74 i85 i96 oA7 iB8 RC +l $3 $2 $9 +$5 $4 $2 +l o61 i79 ss8 $9 +o2g o5o +$2 $3 $1 $6 +i30 ,4 ,5 +o0l $0 +se1 i60 ,7 +^1 ^4 o27 r +^1 ^1 o25 r +$a $9 $0 +i3l $o +ss0 $1 $7 +l $4 $2 $8 +o1a $1 $9 +o6i o7e +i91 oA7 +o3i i4b +^3 ^2 ^1 $a +i5x o61 +i92 oA4 +i62 ss0 $0 $2 +$0 $6 $1 $9 +o0y $2 $8 +o2k o5o +i33 i42 R5 +o0y $0 $3 +o3y o4h r +$8 $9 $5 +o0s $2 $0 $0 $7 +i48 o50 o68 +^0 ^6 o22 r +l $6 $2 $5 +i51 ,6 i72 ,8 +st3 i12 i21 r +o4j $u +ss@ $1 +i71 o89 i98 RA +i61 i79 o87 o94 +l $3 $3 $0 +$1 $6 $8 $8 +o0m o6o +o5p ] +o3y i41 o54 +^0 ^0 ^2 R3 +ss9 $2 $0 +i1s $1 +o31 i49 ss9 $6 +$E $1 +o0s $0 $3 +o0t o2i +R5 $0 +^y ^b ^a ^b T4 +$3 $5 $9 +l $j r +o3y $7 +l o5o $1 +i47 i50 o62 +o2k $u +i32 i40 ,5 $8 +o1e i2m +o51 i60 o74 +i4e o53 +o4i $1 $3 +o1e $l +i4o o6a +i2d o4i +o71 i89 i99 oA3 +o31 ss9 $9 $6 +$a $2 $0 $0 $8 +o1i $8 $7 +o0j i1k +o61 i79 i87 o94 +^1 o5o +D3 o4a r +^2 ^5 ^0 r +$y $# $1 +o2n o3i +o0j i1r +l $0 $1 $5 +i2y i31 i42 o53 +o3y o5e +o33 ss2 $1 r +i62 i70 ss0 $2 +l i51 o69 i78 ,8 +l i69 o73 +se7 o68 +i61 o79 i87 o94 +^t l $1 +o30 i40 ,5 +o1o o5u +o0s $0 $4 +ss4 $2 $6 +o1u ,4 +$e $y $1 +i21 i32 i41 o55 +^1 ^. r +ss4 $2 $7 +$0 $7 $2 $0 +i41 i52 i63 i74 i85 i96 iA7 oB8 RC +i39 i41 o53 +$o $0 $5 +l ss1 $9 +^3 st2 i21 r +o1y i4i +,1 ,4 r +$1 $2 $3 $6 $5 $4 +o48 i50 o68 +ss7 $4 $1 +o4x o52 +i31 i41 i50 o66 +o0s $0 $2 +^z $1 +i5e o63 +^g $a +^1 $j r +o32 ss0 $0 $3 +i31 i49 o58 o63 +o2y -3 +$1 $2 $1 $2 $1 $2 +l o1a $1 +i3z i48 o57 +i2s o4o +o51 i61 i72 ,8 +o45 i51 o60 +D4 o4r +sy1 $1 $2 +$y $3 $2 +$1 $2 $8 $5 +^2 ^2 ^6 o31 r +l i32 +o1y o3y +,3 $8 +i41 i59 o61 +o3e o4k +l o91 +i45 o51 o60 +o58 $1 +o1i $9 $2 +o0a ,4 +se5 o66 +o0l o51 +o0n $2 $0 $0 $7 +i50 i61 o73 +ss2 $5 $2 $8 +o71 i89 i98 RA +i2s o3e ++1 $2 $0 $0 $6 +$5 $3 $4 +^6 ^4 ^2 +i21 i30 i40 o52 +o5e o62 +^. l $. +i5y o6n +$s $5 +^a ,5 +o1a $1 $0 $1 ++0 $2 $5 +o4m $i +o4n D5 +$0 $5 $1 $4 +D3 o3m +D2 i5a o61 +i87 R9 +i21 i30 i40 o55 +o1e -2 +^1 ^8 o27 r +,5 o6o +$y $4 $5 +o87 o94 +sb1 i12 i23 +i51 o60 o74 +i35 i42 o54 +l i71 o89 i99 oA3 +o63 i70 ,8 +o2c i3i +$1 $2 $9 $3 +D4 o6i +i71 ss4 $3 +i2l i4i +l o76 o88 +o3z $9 $4 +o3k $3 +i1y D4 +o1l i2i ++3 $1 $3 +i71 i89 o98 RA +i1h $0 $1 ++0 $2 $0 $0 $6 +i31 i49 se8 $8 +i41 i52 i63 o74 i85 i96 iA7 iB8 RC +ss! $1 +i1e o4y +i4y i52 o65 +o6- o71 +i35 i40 o51 +$_ $3 $3 +i4y o51 o62 +i2p o3h +l i62 o70 +o0j $2 $1 $3 +i3y i41 o59 +sd! $! +$2 $5 $1 $7 +i71 o89 i99 oA6 +i1i $1 $2 $3 +o3g $1 $2 +D1 $8 $8 $8 +i3z i42 o57 +i3z i42 o56 +$. $1 $5 +l o66 o71 +i6r +i4y se1 o64 +o51 ss9 $7 $5 +D3 $0 +^e ^h ^t T3 +o53 ss4 $5 +o2z $0 $1 +$7 $4 $5 +$i $2 $2 +^w o1u +$1 $0 $8 $0 +o04 i11 r +o1l $1 $9 $9 $0 +o2e -3 +i4o i50 o61 +i3k D5 +i1h o51 +^3 ^3 ^3 ^3 ^3 o53 +^o o5a +sd3 $6 +$e $1 $5 +o47 i51 ,6 +i5n ,6 +l o74 i82 o90 +i27 i38 i49 o51 r +l i71 o83 +o51 i69 ss7 $5 +i51 +i2y $i +sn1 $2 $3 $4 $5 +o4g $o +^2 ^3 o24 r +[ $4 $1 +i41 sn2 $3 +l i61 i72 i83 i94 oA5 oB6 +$2 $9 $0 $9 +D2 $8 +o51 ss9 $7 $8 +i5i o6t o7a +^y ^t T2 +i43 o50 ,6 +i51 sn2 R7 +$8 $7 $9 +i16 i26 i36 i46 ,5 +i4h ] +i4o ss1 $2 $3 +i2y $n +i41 i59 o66 o77 +o61 i75 R8 +^k $0 $7 +o3r o5a +o1m $1 $4 $3 +i22 i39 i49 o51 r +o51 i69 ss7 $8 +o0p $8 $8 +k r +D2 $3 $1 +l $1 $1 $1 $4 +o0r $2 $0 $0 $6 +o0j i5a +i62 i70 i80 o99 +i34 i49 i59 o61 r +^3 ^1 o28 r +^5 ^7 ^1 ^5 ^9 o53 +se3 o62 +i31 se9 $8 $7 +$0 $7 $1 $6 +$c $h $a +o1u i2d +o0d o1j +^8 $8 r +l $8 $1 $4 +i5a o6h +l o6j o7o +o5a $1 $5 +^t $2 +D4 o5m +^9 ^9 ^3 R3 r +ss4 $5 $4 +o1m $1 $9 $8 $8 +sS9 $8 +o3a o4d +i4a i51 i60 o71 +o1o $l +o0d o51 +D1 i2o +$- $1 $0 +l $8 $2 $8 +i47 o51 ,6 +o3a o4g +se2 $7 +D5 o5k r +o0b D4 +o4l i5o +o0v D5 +i1u $1 +i2i o4y +i2y o5n +sl2 $2 +^2 ^5 ^2 ^5 ^2 o55 +l o61 ss9 $9 $1 +i2t $o +i31 se9 $9 $5 +i51 o62 i72 o81 +o3t $o +se1 ss2 $3 +o0w $0 $1 +i1e i2m +.3 o5y +^8 ^1 ^1 r +$s $i +i62 ss0 $1 $0 +o7m +o2y i4o +i41 ss9 $7 $0 +o2y .4 +o41 i59 i66 o77 +o44 ss3 $2 $1 +l i61 o72 i83 i94 iA5 oB6 +^a i3e +D1 $1 $2 $2 $1 +$b $5 +o2y i3m +^4 ^2 ^3 r +^! o7! +i61 i79 i89 ,9 +o1p $1 +i1e i2j +o46 $6 +i31 i49 i55 ,6 +i41 ss0 $2 +l i61 i72 o83 i94 iA5 oB6 +o32 i40 i50 o61 +$i $0 $1 +i3m D5 +i5b o6a +sn1 i62 R7 +i4a se0 o61 +o3g o4o +o42 $9 +i47 ,5 i67 ,7 +i62 ss4 $7 +o1u o2l +l o3i $1 +i43 ss6 $0 +l i51 o69 i79 o87 +o1h i2o +$a $9 $2 ++0 o6a +o55 i61 o70 +o6r $1 +i44 i51 o62 +l i51 o69 i78 o86 +o0y $5 +$a $9 $1 +$2 $3 $1 $4 +i51 o69 ss7 $8 +i62 o70 ,8 $0 +o0y i4e +.0 o4i r +i21 o32 $3 $4 +o30 $0 $7 +^1 $2 $3 +o4u $t +o5r $o +l i61 o79 ss9 $1 +i32 i40 ,5 o61 +o4z o57 +i71 i89 ,9 oA6 +i51 i60 o74 +$y $1 $9 $9 $2 +^0 ^1 o22 r +o4a i59 o63 +i2j ] +i44 o53 ss2 $1 +o4o $2 $4 +i2m o4i +o4y i59 o63 +D1 o5y +D1 $l +o3v D4 +o2r i3k +l $_ $2 $2 +$2 $7 $2 $8 +-0 $2 $7 +i41 i51 o66 +l o61 i79 ss9 $1 +o2c $1 $3 +i55 o61 o70 +.2 $0 $9 +D3 o6i +D2 +5 $o +i47 i57 ,6 ,7 +$5 $5 $7 +o0k $1 $8 $7 +[ i3a r +R7 $5 +$z $0 $4 +$0 $0 $6 $9 +i61 o75 R8 +o47 i57 i67 ,7 +o61 sS0 $1 +ss3 $3 $1 +$2 $3 $2 $1 +i42 i50 o64 ++0 i4i +i3i i41 o59 +^6 ^9 ^1 o39 +R5 o67 +^9 ^9 T2 +l i61 i72 i83 o94 iA5 oB6 +$z $0 $3 +^a $u +i21 i32 i40 o56 +l i51 i69 ,7 o87 +o44 i53 ss2 $1 +$0 $6 $2 $9 +.2 $1 $7 +i41 ss2 $5 +o44 ss1 $1 +o0s o4o +l o61 i72 i83 i94 iA5 oB6 +i62 i72 o85 +o3i $1 $9 $9 $0 +i4. +ss5 $1 $4 +i5d +ss9 $1 $9 +i3i se1 $2 $3 +i42 i55 i62 o76 +l $0 $1 $6 ++0 i4a +i2b $1 +i39 i46 o53 +o74 o8m $e +[ i3y +^1 ^1 ^5 o31 r +$3 $9 $9 +i51 o69 ss7 $5 +o1i +2 +se7 ,7 +l *56 +o0d $8 $6 +o43 i50 ,6 +i52 ,6 o71 +i42 i50 ss1 $2 +i62 i70 ss1 $0 +l o51 i69 i79 o87 +i41 o59 i66 o77 +$y $9 $7 +ss1 $3 $6 +i32 o40 i50 o61 +o2e $2 $3 ++6 $a +^j o3e +o62 i71 o82 +o2k o4o +^1 ^5 ^1 o35 +^0 ^2 ^3 r +l i67 ,7 +o73 $0 +o0e o2i +o3a $2 $0 $0 $0 +i1a o5z +o58 ss0 $8 +i4n i5e +l i5b o6o ,7 +o71 i89 i99 oA6 +^0 ^0 ^9 o31 r +i45 i56 o61 +$0 $5 $0 +i21 i32 i41 o58 +D1 $1 $0 $2 $0 +$i $u +$5 $0 $0 $2 r +^1 ^a +o4a $9 $4 +o4y o50 +o0n $0 $0 $7 +,3 $2 $5 +i52 i61 o76 +o1a o5e +^5 ^2 ^2 o32 r +sd0 $0 $0 +$0 $8 $2 $0 +i2i i3s +i3o i48 ,5 +o5a i62 o74 +l $ +o3z $9 $9 +i41 i59 ss7 $0 +i44 sy2 $0 +i32 o40 ss0 $3 +o0m $2 $0 $0 $8 +st1 $9 $8 $6 +o3i o4s +D3 o3l +i31 i49 se9 $5 +$b $1 $3 +^2 ^8 o26 r +$3 $0 $1 $2 +o3y $2 $9 +i2g $a +i1h $1 $7 +^0 ^8 T2 r +sr1 $9 $8 $8 +o0p o6o +o0k o2l +o0z .2 +o3o $0 $0 +l i74 o82 o90 +i31 i49 se8 $7 +o3i $1 $9 $9 $1 +i3k o4a r +o2n o4a +o0n o51 +o1e $4 +o0z $0 $0 $7 +o0t o5u +i1y o4i +i42 ss0 $1 $2 +$2 $5 $3 $7 +o0m i2h +$5 $8 $6 +-5 o6i +o3k $1 $3 +o0e o5o +o0j $4 $3 +i61 o70 i81 o90 +l i51 o69 ss9 $2 +o42 ss0 $1 $2 +o42 i50 ss1 $2 +D2 $9 $6 +$2 $5 $1 $5 +l i52 o68 +o0r o5o +o2z $0 $7 +i2k D4 +i41 i51 i61 o77 +D2 $8 $6 +i4d o51 +i40 i52 i61 o74 +D1 i4o +i32 i45 i53 o62 +l o1o $1 +o0P $1 +o5a o6k +^2 o1a r +^2 o1m +o0l $9 $7 +i2l $1 $2 $3 +ss1 $2 $0 $9 +.2 o4u +$2 $2 $1 $4 +i5z i61 o72 +o1j $2 $0 $0 $0 +^3 ^2 ^1 o30 +^_ ^1 ^6 r +o2h o4a +o3y o4c +^1 ^2 ^3 ^4 o5j r +i3N +i45 i52 o61 +-0 o51 +o4y ss1 $2 $3 +o4y o5a $h +o1y o5k r +o0g o3u +$1 $2 $* +o0j o5n +sy1 $9 $9 $9 +$2 $4 $0 $2 +o41 i50 i61 o72 +o3b o4e +i2k $o +^a $2 +o1o i4o +^i o5a r +i71 i89 o98 oA5 +i3k i41 i52 o63 +^k o5i +i1e i2t +o0i $2 $1 +i1o i2b +o3r ,5 +l i48 o57 +o59 o61 $1 +i3a $n +l $1 $1 $1 $0 +i1l o5a +o2r $1 $5 +o0n o5i r +i3u i42 o53 +o2r $1 $6 +o2r $1 $7 +o1e o2z +D2 .3 +l o62 ss0 $0 $0 +o0i o5i +o0i D5 r +o3u $2 $1 +i4a o5! +i3i i42 i50 i60 o78 +$3 $0 $0 $8 +o0w $1 $1 +i61 i79 i87 o92 +^l ] +$z $8 $9 +i3a o5z +^u ^z +o0k .5 +$4 $0 $4 $0 +i24 i39 i49 o51 r +i4z i51 o64 +i3l D5 +D1 i2m +o4y $0 $3 +^j $3 +o2g $i +o0o $1 $2 +^o o1i r +o86 o95 +o2u $2 $2 +l o5b i6o ,7 +o2s o3i +i19 i29 i39 i49 i59 ,6 +D3 $3 $4 +o1s $2 $0 $0 $5 +o3p i4i +D2 $! +i38 i41 o56 +i2o i31 i42 o53 +o0r i2a +l i71 i89 o98 oA7 +i2n i4a +o6a $2 +o0p D2 +ss8 $1 $7 +o3c o6a +l o61 ss9 $9 $6 +i4o i51 ss2 $3 +i5a o61 i72 o83 +o1u o2d +i35 i44 o53 +i2h o4a r +o1o o3j +^t o5a +D3 o4c +l $2 $1 $1 $2 +$2 $9 $0 $6 +i41 ss9 $7 $4 +i3a o5e +o0w $0 $7 +l o56 o67 +i1e $n +i32 i40 ,5 $7 +o71 i89 i98 oA5 +i52 i60 ss1 $0 +,3 $1 $2 $3 $4 +i3u i41 i52 i63 o74 +$1 $2 $5 $4 +i74 R8 +l i61 o79 ss9 $6 +^5 ^1 ^6 r +sd7 $2 +se9 $9 $9 +$0 $7 $8 +D1 $8 $5 +i42 o50 ss1 $2 +i1e o2a +o5o $3 +i42 ss5 $2 $5 +^- l $- +^o D4 r +l o51 ss9 $9 $2 +o33 $2 $1 r +i51 i61 R7 +$1 $3 $2 $7 +o0p o4o +$0 $8 $1 $7 +i65 i70 ,8 +^9 ^1 ^9 o31 r +ss5 $2 $4 +l $p $o +l $4 $0 $0 +l $7 $2 $9 +o1m $1 $2 +l $_ $2 $1 +l o5b o6o $o +.2 $0 $5 +ss9 $2 $4 +o4y i59 o65 +l $_ $2 $3 +o7t +l o3y $1 +l o51 i69 ss9 $2 +o2k $1 $6 +$- $0 $8 +l $3 $3 $1 +l i71 o89 i98 oA7 +se4 o6u +D3 i5e +i62 i71 o85 +o0m $8 $2 +i33 i42 o56 +^i ^w +o79 ss1 $1 +i34 i41 o58 +l o5y $1 +i5h o61 +[ o1e +i39 o46 +o1e i2a +$0 $8 $2 $7 +i3e o4y +^9 ^2 ^5 r +i61 i70 o81 o90 +$1 $9 $2 $9 +^2 ^1 ] +i89 o98 +o0p i1h $1 +i61 ss9 $7 $9 +l o57 o65 +i47 i55 o67 +o4i i5a +i49 i51 o64 +^a i4i r +^2 ^2 ^2 ^2 o42 +se8 o66 +i61 o70 $0 +^2 ^1 i63 o74 +i4l ,5 +o2f ,3 +i3i o5b +^e ^v +^_ ^0 ^7 r +l $i $e +^7 o17 +i42 i55 ss2 $5 +i41 i52 i62 ,7 +i62 i70 i81 o92 +o4S +l o62 i70 ss0 $0 +$0 $4 $3 $0 +o1i $2 $0 $0 $6 +$# $! +$_ $9 $0 +i3u o4c +o0c $0 $0 +o0I +i4e o57 +o4o $0 $8 +o5g ] +i48 i51 o66 +-0 i1e +ss5 $1 $8 +^w $1 +[ $1 $9 $9 $8 +o61 i79 i87 o90 +o5z $1 $2 +$y $1 $1 $1 +o61 $0 $0 +i30 i42 o54 +o0y o5y +i3a i4d +ss1 $9 $0 +^3 ^3 T2 +i41 o50 i61 o72 +l $2 $2 $6 +D3 $c +i3y o4l +o1u $k +i2p i3a +i41 i50 o61 o72 ++0 $9 +l ss8 $9 +i21 i32 i41 o56 +i3n o4o +$2 $8 $0 $4 ++0 $8 $8 +o0l $4 $4 +l i62 o70 ss0 $0 +$9 $3 $6 +$3 $9 $3 +^1 D2 r +l $1 $4 $4 +$o $8 $8 +i71 i89 i99 oA3 +o0k o6e +o0a $2 $0 $0 $6 +o2e i3j +$1 $9 $1 $3 +$0 $7 $2 $9 +l $1 $4 $1 +l o71 i81 ,9 +ss4 $0 $5 +$0 $1 $1 $6 +^1 ^6 ^9 r +l o71 i89 i98 oA7 +o0b $1 $0 $1 +o0z $2 $0 $0 $8 +i3t ] +o3e o4i +$0 $5 $5 +o2i $2 $0 +o0w $1 $5 +i33 i41 o59 +l i4b +[ $1 $0 $1 $0 +i3i o4n +^9 ^1 ^0 r +i56 ss1 $9 +i55 i61 o70 +o2r o3a +o4a sr1 $2 $3 +i3o o5u +o80 $5 +$# $6 +i36 ,4 $6 +sS2 $0 $0 $5 +i43 i52 o60 +o2e o5e +i1a o5n +i4o o54 +i61 i79 ss7 $9 +o3b ,5 +o3a $1 $9 $9 $1 +o2u $2 +l o3a $1 +l o61 i79 ss9 $6 +o2a $1 $5 +D1 $3 $2 +l $0 $4 $0 $5 +i4y +5 +o0g i3o +l i2w +i5t o6a o71 +^$ o7$ +^1 ^5 ^1 r +^0 ^5 ^1 ^5 +i41 i59 ss7 $4 +^0 o18 +D3 o5t +i2o o3n +o53 ,6 $3 +o52 i60 R7 +D2 i4u +l i71 ,8 ,9 +i2w i3a +o5k $u +i52 ss1 $3 +o3c ,5 +o63 $5 +o0o o4o r +i1h $0 $6 +i36 i41 o55 +o4k $1 $2 $3 +i3o i4k +o3o $0 $3 +i52 ss0 $1 $0 +o1y o4o +i1a o3u +o2s $1 $2 +o0j $6 $9 $6 $9 +o4h o5k r +i5e i61 i72 o83 +l o54 o60 +o3w i4a +sk2 $0 $0 $6 +^1 ^2 o25 r +l i60 R7 +l $1 $9 $5 $5 +o98 RA +^2 ^4 ^0 ^2 ^4 o50 +l o91 ,A +^1 o4y r +$8 $4 $5 +o61 i70 i81 o90 +o3f $a +^1 ^3 ^8 +i1r $o +o4a i51 sr2 $3 +i3e i41 o52 +i2i $n +o63 i72 o83 +$4 $l $y $f +i2o i3n +sd6 $8 +l i61 o72 i83 ss4 $5 +o3k $1 $1 +D1 o2k +o3b o4u +i4y i52 o67 +D5 o5p +o0a i4e +l $5 $1 $4 +o0y o3e ++2 i3u +o06 i10 i20 i32 r +o43 ss0 $0 $0 +$5 $9 $5 +ss2 $3 $3 +o1y $z +i4y i52 o60 +i4a o5h r +o4o o5z +i23 i39 i49 o51 r +i51 i60 R7 +i54 ss1 $1 +^6 o10 i20 i32 r +i51 i62 i73 i84 i95 iA6 oB7 iC8 RD +o2f i3i +[ $1 $9 $7 $4 +o5o o6k +^j $1 $7 +i1l o2e +o0p $9 +o0j o5h +$2 $9 $0 $3 +o55 ss0 $0 +[ $1 $9 $7 $7 +i62 i70 i81 ,9 +$# $1 $4 +o0l $0 $0 $7 +o0y i3e +,2 $1 $0 +o0s o2i +i1e o3e +o2z o51 +o3u i4k +sD1 $3 +l i71 i89 ,9 oA0 +l $5 $2 $4 +o42 i52 i62 ,7 +i3o i4o ,5 +o2o i4a +l i1h $1 +^0 ^1 ^3 +i36 i46 ,5 r +i31 i44 ,5 +l o71 i89 i99 oA0 +i42 i52 ,6 ,7 +o2e o3i +ss_ $1 $0 +$3 $0 r +i35 o46 +l i61 o72 o83 $4 +o1u i2s +o1o $1 $7 +^3 ^0 o21 r +$$ $1 +i76 ,8 $6 +l o61 i72 i83 ss4 $5 +o0t $2 $8 +i42 ,5 i62 ,7 +i3a o7a +se1 o76 +i3i i5a o61 +l $9 $1 $8 +,3 $8 $8 +l i6b o7a i8b o9y +sn6 $6 $6 +i51 i62 i73 o84 i95 iA6 iB7 iC8 RD +i4i o5j r +o4a i5n +i53 i61 o70 +i59 o60 ,7 +o4a o5p +o0a $1 $4 $3 +o3D +i51 i62 i73 i84 o95 iA6 iB7 iC8 RD +o0t o1y $1 +D2 $3 $0 +D1 -1 +o0f $6 $9 +i38 o44 +i1o i2j +o2j o5i +i2i o6a +l i42 i50 i60 o78 +^1 o4i r +o0h i1a r +^2 ^1 o22 r +l i5b o6o o7y +i5a o6i +o5s o62 +$9 $9 $4 +i61 o72 o84 +[ $5 $4 +o4o $8 +o72 i80 i90 RA +^7 ^6 ^5 ^4 ^3 ^2 ^1 +o4o i50 o61 +^0 ^6 o20 i32 r +i49 i52 o61 +l o51 i62 ss3 $4 $5 +l o61 ss2 $3 $4 $5 +i2n o5o +i62 o70 i81 o92 +i4a i50 R6 +^1 ^9 T2 r +^1 ^9 ^5 ^5 r +l ss9 $9 +o5l o6o +i34 i42 o51 +i5_ i61 o72 o83 +o4n $2 +i1h i3a +o02 i12 r +o0b i3a +l i42 i50 i60 o77 +o0t $8 $7 +o0x ] +^m o1y i2c +l i71 i89 o98 oA6 +l o61 ss9 $9 $5 +i3i o42 +o5x $3 +o0l $6 $6 $6 +i31 o42 $3 $4 $5 +^i ] r +l $s $u $e +o53 i61 o78 +^4 ^5 ^6 $3 $2 $1 r +sl1 $4 +l o51 ss2 $3 $4 $5 +o1e i3r +i4z o51 ss2 $3 +i55 o69 +$e $0 $6 +o2n $u +o2e o4e +o0c $h +i41 i50 i60 o78 +i1y $1 +o0d o3e +l i61 i72 o83 ss4 $5 +o3t i4i +o5u o6l +o5a i61 R7 +i33 i40 i53 o60 +l o61 i72 ss3 $4 $5 +o2j D4 +i51 i62 i73 i84 i95 oA6 iB7 iC8 RD +^5 ^7 o23 r +o4o i51 R6 +o5n o6e +i62 i70 o81 o92 +o0a $6 $9 +l i71 o89 i99 oA0 +o2k $2 +l o6b i7a i8b o9y +D2 o6e +i3b r +R4 $3 +i2a o3m +o0k i3l +i3d i4e +R4 $0 +o4n o5o +i30 i46 i50 o66 +l i61 o79 ss9 $5 +o2r $3 +i3i o5k +o0s o2e +o3i $1 $9 $9 $3 +,4 o5n +i48 i52 o68 +ss0 $8 $0 $8 +i2r -3 +ss2 $2 $9 +R4 $4 +l o89 o93 +o0r $3 $0 +i1o ,5 +i40 i52 o63 +^e ^v ^o ^l T4 +o2p $1 +^3 ^< T2 +o4y i59 o62 +i61 i79 o87 o90 +l $6 $2 $3 +^d $2 +ss5 $2 $7 +l o89 o96 +$k $9 +i51 i63 o72 +i2t o3u +o3i i4l +ss1 $1 $0 $6 +o0j i3s +.2 $4 +i44 ss1 $1 +$- $5 +i3i i41 i59 i69 o71 +i5a o63 +i59 o60 R7 +l o61 o70 $1 +o1o o5e +sy6 $9 $6 $9 +$_ $1 $9 $9 $4 +ss1 $0 $0 $6 +o4y $2 $6 +$_ $1 $9 $9 $3 +st9 $9 +,5 o6y +o5i i6t o7a +i61 i73 o81 o93 +o49 i50 ,6 +ss3 $3 $0 +o4o i51 o68 +o0a $2 $0 +i72 o80 ,9 $7 +o2b $i +i63 i72 o83 +^2 ^9 ^9 ^1 D5 +i30 i42 o54 r +o4i $m r +i2n $2 +o5h $1 +l i6b i7a o8b o9y +o4t $i +o0d i3o +i32 i45 i53 o64 +i31 i41 i51 o64 +o2k $0 $7 +i31 i46 o51 +i3a o4h r +i51 i62 o73 i84 i95 iA6 iB7 iC8 RD +l $9 $2 $2 +^3 ^2 ^1 o4e +^5 ^1 ^7 r +o1a $2 $6 +o0k i5e +o41 i50 i62 o73 +ss_ $2 $1 +$- $1 $4 +se3 o50 +i3e o4l +l o55 o64 +^9 ^5 ^6 o31 r +^a i2i r +o1i $0 $0 $7 +l i51 i62 o73 ss4 $5 +l i62 o78 +$, $1 +i4i $e +sy6 $2 +i3c i4o +$4 $4 $6 +$5 $6 $0 +o3i o4m +o4o i51 o66 +o1a .3 +D3 o3v +i61 o79 i87 o90 +sd1 $2 $1 +,2 o51 +D1 $1 $0 $2 $8 +^9 ^1 ^9 r +^2 ^5 ^2 ^8 r +i2p i3o +l o61 i72 o83 $4 +$o $2 $7 +sY2 $2 +i71 i82 o91 +o32 ss0 $0 $4 +o68 $0 +l o51 i62 i73 ss4 $5 +sS4 $2 $0 +$1 $7 $0 $2 +o0x ] r +l o6b o7a $b $y +$t $3 +$t $1 $3 +o0a $2 $0 $0 $7 +i45 i50 i60 ,7 +i1k $1 $2 $3 +^s $o +l o53 i63 ,7 +i45 i51 o63 +o68 i70 o88 +o1y $6 $9 +$1 $e +.1 $i +i43 o50 ss0 $0 +$9 $3 $3 +o51 ss8 $2 +i2a ,3 +l o71 i89 i98 oA6 +i51 ,6 o70 +^1 ^0 ^1 o35 +^9 ^9 ^9 ^9 ^9 o59 +o6i $e +i2j o4i +o0v $6 +i44 +o2b o3o +o2y o3k +l o51 ss1 $1 +i21 i30 o41 +o59 i60 R7 +o59 i60 ,7 +o5t $e +i31 i42 i53 o6! +ss4 $3 $2 +i43 i52 o67 +i74 i85 o96 +D5 $. +i2h D4 +$6 $9 $3 ++0 o61 +$1 $1 $5 $0 +o4i o55 +i41 o50 i62 o73 +o1k $2 $0 $0 $7 +^1 ^7 ^9 ^1 +l i41 i59 i69 o75 +o3z $4 $4 +i2v r +i3e o61 +i2e o4e +l o61 i79 ss9 $5 +i32 o40 ss0 $4 +i51 i62 i73 i84 i95 iA6 iB7 oC8 RD +l i61 o72 ss3 $4 $5 +o5i $n +i49 o50 ,6 +o2t o5i +i51 i62 i72 o81 +o0g o3o +o8i +sr1 $9 $8 $5 +o1i i3u +o0g $8 $8 +l i71 o89 i98 oA6 +^0 ^2 ^0 ^7 r +.1 $2 $0 $0 $7 +$4 $4 $5 $5 +l ss2 $4 +i41 i50 o62 o73 +o61 i73 i81 o93 +se9 o66 +^1 ^1 ^1 ^1 +o32 i40 ss0 $4 +o3y $9 $2 +l i53 ,6 ,7 +i41 sY2 $3 +o43 i50 ss0 $0 +o2y $2 $2 +^1 ^4 o21 r +i54 o69 +o2b o5o +i61 o73 i81 o93 +o2r o5o +o51 i62 i73 i84 i95 iA6 iB7 iC8 RD +i68 i70 o88 +^9 ^6 ^3 +o0k $o $1 +i36 i40 o56 +$1 $0 $8 $9 +o1i o2o +i1u o2i +^2 ^4 ^2 r +o2y $1 $2 $3 $4 +i1h o4u +i31 i40 i50 o62 +i3k r +D1 o2u +o3e $h +o0g $1 $9 +o0d i1d +o0a $4 +$2 $5 $5 $0 +^9 ^5 ^4 o31 r +i52 i62 o71 +o0b ,1 +o71 o84 $3 +o61 i79 ss8 $0 +o0z o5o +$i $2 $3 +$2 $9 $0 $4 +o0g $2 $6 +o2i $6 $9 +i3o i40 ,5 +^d o1d +i31 i49 ,5 $5 +^m o1u +$g $1 $3 +.0 i4i r +o40 i50 R6 +o3a $1 $0 $0 +i1i o5u +^1 o1o r +i5 +o3r o6a +o1o i3y +l $9 $1 $5 +o2u i4o +l i71 o82 +$r $o $o +o2i $4 +i72 i80 ,9 oA3 +$6 $7 $7 +o4a $a $1 +i2i o3a +i41 i58 i61 o78 +i4a i52 o67 +l i51 o62 ss3 $4 $5 +o2i $6 +i1a $y +i2a i3l +o1j $1 $9 $7 $7 +o0f $e +sb1 $2 $3 +i2y -3 +o4x o5a +i30 i42 o55 +i3i i42 i50 i60 o74 +i51 o62 o76 +i42 i50 sy0 $5 +o6n ] +i39 i45 o51 +i61 o79 ss8 $0 +i40 sy0 $7 +,2 $0 $7 +^1 ^2 ^1 o33 +o51 i61 o70 +i3u $1 +o2y +3 +l D5 $2 +i4u i51 i62 o73 +o1m $1 $9 $9 $6 +o2j o5o +i72 o80 i90 oA3 +^w o1e +o51 i61 o75 +i12 i25 i32 i45 i52 o65 +ss2 $k +l o6b i7a o8b $y +i53 o61 o78 +o0h $8 $8 +o72 $9 +D1 o1- +o2a $3 +i5k o6i +i31 se9 $8 $9 +^u ^f +o74 o82 $0 +o5a $1 $4 +^1 ^2 o29 r +o0i D4 +o2a $7 +o3y i42 ,5 +o5y o61 $2 +i4o o5j +i51 ss9 $8 $0 +se8 o63 +o1u o2c +o4i o5b +o1m $1 $9 $8 $6 +i40 o51 o62 +-0 $2 $0 $0 $8 +^5 ^3 ^0 o32 r +o1o $n +l o92 oA3 +o40 i51 o62 +^5 ^1 $1 $5 +^j i4i +^3 ^2 ^1 $y +l o77 o81 +o0j $1 $1 $2 +i52 o60 o71 +o0k i51 o63 +i2a i3r +o3s $1 $2 +D6 o6y +l $@ $1 +o1u i2i +o0j o1o $1 +i41 sy4 $3 +^5 ^2 ^9 o32 r +$a $a $a +o0l D4 +o1e $2 $0 $0 $8 +l i40 o52 +i31 i41 i52 R6 +l $8 $2 $1 +^3 ^2 ^1 o5i +o61 i70 i80 ,9 +i3a ,6 +sl1 $7 +$. $1 $4 +D1 $1 $9 $6 $9 +o42 ss0 $0 +o3t $i +i45 i56 i68 o73 +i2p r +$3 $5 $3 $5 +^k $2 $3 +i61 ss9 $8 $1 +i42 i55 o66 +se2 $8 +^k $2 $2 +D3 o4m +i3d $a +^i $o +i4i $h +i37 se7 $7 +^3 ^1 ^3 +i66 ss1 $9 +i76 o81 +o0m i3u +ss2 i11 r +^4 ^5 o21 r +,2 .3 +o42 o5k $7 +o59 ss8 $7 +i40 ,5 R6 +^2 ^5 o24 r +l i62 o70 ss0 $9 +i6z o7a +^1 ^6 o20 r +l i51 o69 i78 o84 +i42 i53 i64 o75 +o3y $2 $8 +o2y o6a +o5l o6y +^5 ^2 ^3 r +l $7 $2 $0 +i1o o2s +i42 o50 ,6 $6 +i61 o70 i80 ,9 +i53 o60 o73 +sr8 $3 +ss5 $4 $3 +o42 ss1 $2 +l i51 o62 i73 ss4 $5 +D4 $8 $8 +o0a i4i r +o5w r +i4Y +$2 $6 $0 $8 +l i51 i69 o78 o84 +^2 ^3 ^4 ^5 ^6 ^7 ^8 o71 r +o3n $2 +i3g r +o5X +$2 $4 $6 $9 +o53 ss0 $0 +i25 i36 i47 o58 +l o7y +i4a o6o +o2k $1 $0 +o3i $0 $0 $7 +$8 $9 $6 +i1y i2k +o5o $7 +$_ $0 $0 $7 +o4a i59 o64 +o5y $9 +o42 o50 $0 $6 +$2 $7 $0 $6 +o0n $8 $4 +i1o D3 +i49 i51 o60 +$1 $6 $0 $4 +D3 $8 $1 +o4o $1 $5 +i2y o4a r +^c o1u +l i3_ +o0n $8 $6 +.1 $1 $2 +o0n $9 $4 +o4o o58 +l o62 i70 ss0 $9 +ss9 $2 $6 +o71 i81 o92 +o0s i3u +o3y $8 $7 +o6a o7l +^3 ^2 ^2 r +D2 i51 o62 +^r $a +o3z .4 +o3i $6 $6 $6 +i1i i2y +l $0 $1 $8 +i3y i47 ,5 +o0j $7 $1 +o0z $3 $3 +ss1 $2 $3 $4 $5 $6 $7 +o3i $3 $1 +o2o ,3 +i1a i2g +o0e $2 $2 +l i65 ,7 +o2a o4u +o0n $9 $3 +o0e $2 $3 +o1o o2s +l o62 ss0 $0 $9 +$8 $5 $2 $0 +.5 $1 +$5 $7 $8 +o2o o51 +o6i ] +$0 $6 $2 $8 +l o6! ,7 +o0s $1 $9 +ss1 $1 $1 $7 +o42 i50 ,6 $6 +,1 ,3 .4 +o2y o3r +i51 i69 ss8 $0 +$0 $2 $9 +l $_ $2 +o0k o3j +^u ^e +i1a o5a r +ss1 $1 $1 $4 +o9* +^9 ^9 ^1 R3 r +i1e o2m +o0b $. +i68 o70 o88 +o0G $1 +i31 i40 i50 R6 +o4s o5y +i21 i33 i41 o54 +^4 ^2 ^4 r +i33 o42 $1 r +[ $1 $9 $9 $9 +D3 $1 $9 $9 $2 +o0z $2 $0 $0 $5 +ss9 $1 $7 +$c $y +o3r $1 $2 $3 +i34 i41 o57 +^6 ^8 ^7 +o4z i51 o68 +o4h $k r +o0p i3o +o2n $7 +i90 oA8 +o0y $9 $3 ++0 $8 +$1 $8 $2 $5 +o61 ss9 $8 $0 +ss2 $5 $2 $4 +^6 ^6 ^6 ^6 r +o80 $9 +sg1 $0 $1 +i71 ,8 o92 +o5t $1 +i42 ss0 $0 +$1 $2 $3 $9 +i1u i2n +o76 $6 $6 +^3 ^2 ^1 ss4 $5 $6 +l i5c +o6z $a +o0m o4u +o2v o3a +ss0 $2 $4 +o0c o4y +i3a o4f +i67 i78 o86 +i3o i4t +i45 i56 o62 +$j $1 $2 +o1a o5n +i4y i59 ,6 +^s ^s +o53 i60 o73 +i71 i89 i98 ,A +l o74 o80 +i2d $a +i51 ,6 o75 +o0a ,2 +i52 i61 o77 +i61 i70 ,8 ,9 +i6o ,7 +se1 $9 $7 $8 +l i50 R6 +i31 i42 o59 +$5 $3 $6 +i53 o69 +$0 $4 $1 $8 +i11 i25 i39 i47 i55 o63 +$y $6 $7 +i42 sy0 $0 $5 +^2 ^0 o22 r +o0l $8 $4 +o62 ss3 $4 +i3b o4e +l o88 o94 +$y $9 $8 +o3z o4a $a +i1h $1 $5 +o0e i1m +o5o i61 o72 +sy3 $8 +sd8 $8 $8 +l $0 $2 $1 $4 +o63 $6 +$6 $6 $6 $6 $6 $6 +i41 i58 R6 +^1 o1z +o85 o90 +[ i4u +sE1 $2 $3 $4 +i55 i60 o74 +o1y i2k +o4c o5y +o5d o6i +o0c $. +ss2 $5 $3 $2 +i1r o2a +$y $5 $6 +i1h $0 $4 +l o51 i69 i78 o84 +i1h $0 $5 +^0 o10 +i2i o5l +o3a $3 $0 +-2 o5i +o1k $2 $0 $0 $5 +i62 o7k o87 +o0z $9 $9 +o2m o5a +i1h $0 $3 +o5z i61 i72 o83 +i3o ,4 $o +oA1 oB2 +i1a o3j +o0t $3 $3 +^2 ^1 i51 o62 +o0j $2 $3 $2 $3 +l i6b o7a o8b $y +o0n $i r +i3d o4e +i31 i49 se8 $9 +i71 o89 i98 oA5 +^2 ^2 ^1 o35 +^0 ^2 ^1 o36 +$0 $4 $5 +i61 i79 ss8 $1 +o3a $3 $1 +$4 $2 $0 $1 +$J $1 +^6 ^1 $1 $6 +i51 o62 i73 i84 i95 iA6 iB7 iC8 RD +o0j $2 $1 $4 +D2 $1 $9 $7 $7 +o3a o5y +$2 $9 $1 $2 +i2z i3i +i31 i45 ,5 +o4i $9 +$_ $3 $0 +$2 $1 $1 $6 +o0t i2u +-0 o1y +^k o1y $1 +[ $5 $5 $5 +l i2b +^4 ^3 ^2 ^1 o4k +^1 -1 +$2 $1 $1 $1 +R7 ,8 +^2 ^4 o23 r +$9 $7 $5 +o0k i2l +$2 $6 $0 $5 +$a $3 $3 +l i50 o69 +o0z o6a +^1 ^8 ^9 r +i3a i42 i50 i60 ,7 +o0g $2 $8 +o08 i10 i20 i32 r +$0 $5 $2 $9 +o1i o2n +$_ $8 $7 +$d $u +R2 +i77 ss7 $7 +o42 i50 sS0 $7 +o0k o57 +i31 i42 i53 i64 o75 $6 +l o70 +i30 i47 i50 o67 +i61 se0 o81 +D2 -3 +o3o i4l +D3 o5j +$z $2 $5 +i1u o2v +l i50 o64 +i2t i3e +i1j o2e +o1a $! +l o64 R7 +i1i ,5 +i41 ss1 $2 $2 +o0i i4u r +o4z $0 $1 +o3a o4l +[ $6 $4 +o3m $e +[ o5i r +o2z $0 $8 +l i48 o59 +i53 o61 o72 +o62 ss1 $3 +i3z D5 +i2m o5a +^7 ^1 $1 $7 +[ o5e +i41 i51 ss2 $2 +i5_ o61 o73 +^6 ^1 ^3 r +o2k o4i +o4a $9 $3 +$- $x +o1o $1 $9 +i88 o90 +o3j i4e +se1 o77 +l o61 i79 i88 o91 +o4o o5e +l i48 o56 +^1 o5h r +o6! i7! ,8 +l o51 ss0 $0 +^2 ^3 ^4 ^5 ^6 R5 r +i21 i30 i42 o53 +^3 ^2 ^1 o3c +i40 i51 o64 +i19 i29 i39 i49 ,5 +o0b $9 $3 +i3z ss1 $3 +o0r o3i +i3o o4m +ss9 $8 $9 +i31 o49 ss8 $5 +$- $7 +i31 o44 $3 +o0m i1u +o2y $0 $1 +i33 i43 i53 ,6 +o5j ] r +o3i o5h +^k $1 $3 +i21 i30 i42 o59 +o1k $a +i63 o72 o83 +^1 o2i +o0d $2 $0 $0 $8 +o1a $g +^2 ^3 ^4 o31 +i56 i62 o76 +se8 o61 +^k o2a +^k $1 $1 +o1e o2a +o4p o51 +o4y o5v +$7 $8 $0 +i5k o6e +^5 l $5 +i55 o62 o70 +D1 i2n +o31 o46 +o2i i3m +i57 se7 ,7 +o1j $1 $9 $8 $6 +o53 i61 o72 +^1 ^0 o29 r +i31 i47 i51 o67 +o1o $h +o5m $a +o42 sS0 $0 $7 +l $6 $1 $8 +o1o $k +D5 $0 $7 +l i3w +i2u i4a +^o $1 $2 $3 +o0k o71 +i3e i4r +se7 i67 ,7 +D2 ] r +o0p ,5 +i49 i59 ,6 ,7 +o2s i3e +o0a o1k r +o0k o5a $1 +o0n $3 $3 +o1e i3s +o0v $8 $8 +o4z $z $z +i3l $e +o42 i5k o67 +D5 $1 $6 +o5o o65 +i2- +i61 ss9 $8 $3 +D3 o4n +o1u o2i +o0k $6 $5 +o56 i62 o76 +ss6 $9 $6 +$z $a $a +l i40 R5 +o31 i49 ss8 $5 +i3i o5n +o1h $2 $3 +^4 ^2 ^7 r +o72 o80 $0 $6 +so0 $1 $3 +$1 $1 $8 $9 +o1j $1 $9 $8 $8 +o5D +i2y o3n +i69 i78 o87 +o0n $1 $4 $3 +o5_ i61 o73 +o2y o4a r +i42 o50 sS0 $7 +i32 i45 i53 o61 +o3c $2 +l $r $a $e +o5m $e +i73 ss2 $1 +i4_ i51 o66 +^a o51 +o4a i56 R6 +i47 ,5 $7 +o3i $# $1 +i47 o51 o63 +o0y o2y +ss1 $1 $0 $3 +$2 $7 $0 $7 +^7 ^2 ^0 r +i3y i42 i50 i60 o77 +o3c o4u +o32 o44 +o0i o2a r +i6! ,7 ,8 +o49 i59 i69 ,7 +ss2 $0 $4 +$8 $7 $0 $1 +o3d $2 +i31 sl2 $3 +o52 $0 $0 $5 +i72 ,8 ,9 +D2 $4 $4 +i30 ss0 $0 +$4 $7 $7 +i2y o3b +i81 ss0 $1 +l $a $j +$3 $8 $5 +o3o $3 +o5T +o0e $2 $1 +o0k o3s +i3i i41 se2 $3 +^6 ^9 ^1 o38 +$u r +i1a o3e +o0a o4u r +i64 o79 +[ i3r +l i61 o79 i88 o91 +o1y $0 $5 +i1r o5a +.5 ] +i3i $7 +^1 ^8 o22 r +o0a o3y +i3d o4u +o0i -1 +ss9 $1 $8 +ss1 $8 $8 +o0K $2 +o1o o5l +D5 o5j r +ss1 $0 $0 $% +o5e D6 +o2k $0 $1 +i41 ss9 $6 $9 +i51 ss8 $7 +o72 i80 ,9 $6 +$7 $3 $4 +o4J r +i2e -3 +i4r i5i +o1u $n +se1 i70 o81 +i32 i44 o55 +o0x o5a +i1o o51 +o4o $j +so0 $6 +o4m D5 +o2e $0 $1 +ss2 $5 $2 $7 +o88 $8 +o1o o2b ++0 $1 $0 $1 +$G $1 +o2i i4e +o4o $0 $7 +i49 ,5 i69 ,7 +o0n $9 $0 +l $r $a +$1 $1 $9 $5 +ss6 $1 $0 +o4p o5i +$y $8 $4 +l o5b o6o $y +o0a o5i r +o3i o4b +i3A +o47 i51 o63 +i2i .4 +o4m $e +-0 $8 $9 +sd5 $2 +o0z $1 $9 $9 $4 +o2b o3i +i3e o4a +se3 i62 o71 +D1 $3 $0 +,3 $6 +i6a ] +o0z i2a +o0j $1 $9 $7 $3 +i4z o5a r +o0m o4y +^2 ^0 ^5 o30 r +D1 o5a r +D2 $9 $1 $1 +l i45 ,5 +o4z $2 $1 +$1 $3 $1 $3 $1 $3 +l o62 i70 ,8 $7 +D3 i5h o6a ++4 o5e +o31 ss9 $8 $5 +o1u i2n +i21 i30 i40 o53 +l o61 ss1 $1 +l $2 $3 $2 +i3k ,4 +o3a $1 $9 $9 $3 +o1v r +i3i o4s +o2a o3r +i21 i30 i41 o57 +o1i $7 $7 +$2 $0 $3 $0 +ss6 $2 $0 +o2r $n +i4a i50 o63 +o0n $2 $0 $0 $8 +i41 i59 ss6 $9 +sp1 $2 $3 $4 +l o88 o93 +o5o i61 o73 +o0s i2i +i52 i60 R7 +o4c o5u +l i3i $1 +l i61 i79 o88 o91 +i3i o5h +o2r o3y +,5 $o +^6 T1 r +o2a $1 $0 +i2s $i +l $h $i $g $h +o54 $2 +o3i $1 $9 $9 $2 +sS7 $8 +$3 $4 $8 +o85 o97 +o0m $2 $0 $0 $0 +o5t o6a $1 +R5 o64 +^1 $9 +i2g i3i +se6 R7 +$s $! +o3y $9 $0 +o2z $1 $2 $3 $4 $5 +^6 ^6 ^6 ^6 o46 +l o5b i6o o7y +i3r ,5 +i21 i31 i41 o55 +i34 i41 R5 +o8! ,9 +o2e $7 +i1a o2d +l ss2 $7 +i61 i79 ss8 $3 +st1 $9 $8 $8 +o0k o4a r +o2y $2 $3 +i1u o2d +o0p o3a +i3a i42 i50 i60 o76 +o61 ] +l $o $k +o0s $1 $4 $3 +l $1 $2 $3 $4 $5 $6 $7 +o2y o5e +i2u o51 +$2 $5 $1 $3 +^6 ^7 ^8 ^9 ^0 o55 +sr5 $6 +$8 $5 $8 +$9 $7 $0 +o4f $e +o0d $u +o0e $0 $1 +^5 ^1 ^6 o31 r +$2 $2 $2 $4 +,3 $0 $3 +i31 i44 o56 +i40 i51 i60 o71 +o5k $e +o1r $2 $0 $0 $7 +$o $1 $2 $3 $4 +$d $1 $2 +o3c $1 $1 +^0 ^0 ^1 o31 +i5z +D2 $8 $5 +o0x i2r r +l i52 i60 ,7 o83 +o1y i3e +i46 i52 o61 +ss6 $6 $6 $6 +o0Z $1 $2 $3 +o5a i60 o76 +o2s $y +o42 i50 R6 +$3 $7 $6 +i52 i61 i72 o81 +i51 o60 i71 o82 +^u $a +i32 i45 i53 o66 +i1a o2w +o0c $9 $4 +$6 $5 $1 +i53 i66 R7 +[ $6 $8 +o0i o2a +[ i2l +o1j $2 $0 $0 $3 +o3o $2 $0 $0 $7 +i11 i20 i31 i40 i51 o60 +$h $2 +^2 o1j +o51 i60 i71 o82 +o2k $2 $1 +i1u $1 $2 $3 +i62 i70 o82 +se2 o70 +.5 $s +i51 i61 o78 +i4r o5z +o0v D1 +o1i o2t +i55 i61 o75 +o2y i3b +o0a $0 $4 +$7 $6 $9 +o5c $e +D3 i4r +o3d o4y +D2 o5m +o3d $e +o89 +i5l i6l o7a +^* o1j $* +i2l $1 $2 +o3u i4l +i4l $1 +i41 o59 i66 ,7 +o3m o6a +o1l o2o +[ o0v +[ $4 $0 +^_ ^2 ^1 r +sg2 $4 +o4c D5 +ss3 $2 $9 +o1o $0 $9 +o4a $9 $2 +l i4e $1 +^j $0 $1 +o5h o61 +l i41 i54 o63 +o65 $4 +^l l $1 +o31 $4 $3 +i41 o59 i66 o78 +^3 o11 +i78 ,8 ,9 +i31 i49 i55 o68 +se5 $5 +^k $0 $8 +i41 i59 o66 o78 +o41 i59 i66 ,7 +l o62 ss0 $0 $3 +o3a i5i +o2r $0 $6 +o1y o2d +o4o i52 o60 +se2 $9 +i42 o50 R6 +D4 o5j r +o3o o4l +i4i o5m r +i2g i3e +o1k o2y +l $5 $2 $9 +i62 ss1 $3 +o5a $1 $0 +ss6 $6 $7 +i75 R8 +i2u o4o +o2u $u +^3 ^2 ^3 +sr2 $0 $0 $2 +^8 ^1 o27 +D5 $2 $1 +i32 o40 $0 $8 +i3z i49 o51 +o0d o2y +sn1 $0 $1 +o0b $3 $3 +o4z i52 o64 +$1 $4 $2 $8 +$2 $0 $2 $5 +^_ ^0 ^9 r +o4i o5j +$2 $k $7 +o51 i69 ,7 $5 +o0r $8 $7 +^1 o2u +i3a $y +i41 i55 o61 +sS8 $5 +o41 i59 i66 o78 +,2 D4 +l $* $1 +^1 ^1 o21 +^1 ^2 ^3 o6a r +i41 sy2 $3 $4 $5 +$u $t +D3 o52 +i43 i56 o65 +o4t $u +o62 i70 i81 o92 +i46 i51 o64 +l o5f +ss8 $5 $2 +i55 o60 o74 +sd2 $4 $7 +i32 i40 o57 +$2 $0 $0 $0 $0 +i53 o62 $1 +i4z ss1 $2 $3 +o3j $1 $2 $3 +i42 o50 $0 $5 +o0e $1 $1 +i71 se2 o93 +i35 i46 i57 o68 +sn1 $2 $3 $4 $5 $6 +o0g o2o +ss1 $7 $1 $7 +i1u o2s +i4x o51 +^! o5! +i41 i59 o66 ,7 +i1y i2d +^7 ^0 ^0 ^2 T4 +l o72 i80 i90 RA +so0 $1 $2 +o0z $2 $8 +o0t $2 $0 $0 $6 +o61 i73 o85 +^l ^e +$a $. +o42 o50 $0 $7 +i39 i42 o53 +o0k o1i i2m +i2l $y +o31 i42 i51 o62 +o49 ss8 $7 +$y $t +o1y i2n +D1 $h +i34 i42 ,5 +o42 ss1 $1 +i61 i79 o87 o92 +^9 ^1 ^4 r +i4l o5i $a +i62 o7u +i2y o3k +l $6 $2 $2 +$1 $3 $1 $9 +i31 i42 o53 $4 $5 $6 +i3l ,5 +-0 $2 $8 +$y $1 $9 $9 $3 +i2i o4e +l o61 i79 i87 o98 +o0t o6o +l i61 o79 i87 o98 +i51 i60 o71 o82 +se1 i82 o93 +o1n $2 $0 $0 $6 +i41 i52 i63 sy4 $5 +o45 ss0 $0 +o3p ] +D3 $7 $6 +o5- +l i51 i60 o71 +i31 i42 o51 o62 +l i62 o70 ,8 $7 +^5 ^2 ^2 r +i3s $i +i3i i41 i59 i69 o75 +o4n $1 $2 $3 +o0p o4a +o0k R5 +o5! ss! $! +l o82 R9 +i3a i41 i59 i69 o74 +o4k o5y +o1r i2a +o31 $9 $9 $5 +l o57 o64 +o2h i3e +i41 sd0 $1 +o2h $e +$1 $6 $0 $1 +i19 i28 i37 i46 i55 o64 +o1a i2w +sn8 $8 +o43 ss1 $3 +o0j o6i +o0j D3 $1 +o0K $1 $2 +o4y i56 o69 +i37 i48 i59 o61 r +l o62 i70 ss0 $3 +o0x D1 +i42 ss0 $1 $1 +o42 i50 ,6 $7 +o3y o41 $3 +i48 i51 o63 +o2k i4a +o0h i4i +i45 ss0 $0 +o0f D5 +i38 +l o73 o88 +o55 i60 o74 +$_ $0 +ss2 $0 $8 +i1a +2 +i21 i31 i42 o54 +^1 o6j r +o61 $4 $3 +o0j $6 $8 +i31 i42 i52 R6 +i41 i52 sy3 $4 $5 +o2y i3d +$3 $9 $6 +o0j o5l +o61 i79 i87 o92 +^5 ^8 ^7 ^4 ^1 o52 +i2a o4z +o1e o3y +l i62 o70 ss0 $3 +i4k i51 i62 o73 +i52 ,6 o74 +i42 i50 ss1 $1 +$0 $1 $! +o0l $4 $5 +i31 o42 i51 o62 +i39 i41 o55 +o7o o81 +o3y i41 o50 +i71 i89 i99 oA5 +ss9 $5 $4 +o0n o4y +$o $0 $9 +o4a $0 $4 +o0r $9 $2 +$1 $2 $8 $0 +o1i o3y +^j $1 $2 $3 $4 +i48 +^0 ^3 ^0 ^6 r +-3 $1 $3 +i53 i60 o73 +^1 ^4 o24 r +i3a i4i +l i61 i79 o87 o98 +,5 $1 $3 +sy1 $8 $7 +i61 o73 o85 +o3s o6a +i3z i41 o59 +i32 ss3 $4 +o1k o2e +i3a i4k +^7 ^1 ^0 r +o1l $2 $0 $0 $5 +,4 o57 +i3u +4 +[ o6o +i57 i62 o77 +i51 o69 ,7 $5 +$8 $7 $7 ++0 o5o +o81 o9! +o0d $3 $2 +i21 i30 i40 o51 +,2 $2 $2 +i41 sl2 $3 +i41 i50 i62 R7 +o4a i50 o62 +o0k $6 $1 $9 +$2 $0 $1 $6 +^j $i +i2l i3y +l o1j +o1u i3e +o2e i3a +o0n i2y +i42 o50 ,6 $7 +o2t o5o +i75 i85 ,9 +i4t +5 +o1m $3 $2 $1 +i42 ss1 $1 +i2z i3z +i14 i25 i36 i47 i58 o69 +ss7 $0 $0 +o5o $1 $2 +$_ $9 $6 +o87 o90 +o5i $k +o3z ss1 $3 +$i $1 $0 +^y ^m ] +i3t o4h +o78 i88 ,9 +,4 o55 +l $0 $1 $0 $7 +,1 D2 +o87 o93 +l i72 i80 ,9 RA +o3a $m +i2c ] +i4i i61 R7 +o0k i3n +i35 i41 o57 +$1 $0 $9 $2 +o1n $1 +se2 $2 $2 +st1 $9 +^1 o4i +i1i o3n +i61 i79 ss8 $0 +l i62 o7k o87 +^5 ^0 ^8 o30 r +i63 o71 ,8 +D5 $9 +i3i i49 o56 +i51 i61 o75 +^8 ^0 o21 r +^i o2a r +$3 $2 $1 $0 +i1t $1 $2 $3 +^2 ^0 ^7 r +sg2 $0 $0 $8 +o42 i55 ss2 $5 +sr4 $2 +^1 ^0 ^0 ^% r +$9 $8 r +D3 $1 $2 $3 $4 $5 +i2e i4o +i51 o69 ,7 $2 +o1i $a r +o2l $1 $3 +^e o5o +^m $e +i4k o52 +l ss7 $7 +o0m $5 $5 +i42 o55 ss2 $5 +o0m i1m +l i72 o80 i90 RA +o4u $1 $2 +i3l o5i +o1j $2 $0 $0 $1 +i41 o59 ss7 $2 +i3a i4a ,5 +o4C +i44 i53 ss2 $1 +^9 ^1 ^5 r +o0a i2a r +i3y i40 o59 +o0c $9 $2 +o4a o5v +^1 ^9 ^1 r ++2 o5o +i31 i49 se9 $1 +o1i o4j +o1o $8 $8 +o52 i61 o76 +o51 i61 o78 ++3 $2 $3 +.2 $z +o4o o5m +[ $8 $8 $8 ++4 ,5 +l i61 o72 o81 +o5y i62 o74 +i1i $y +^z T1 r +sS8 $4 +i2i o3e +^k o1l +o4l $1 $2 $3 +i52 o60 ,7 $4 +o52 ss4 $6 +l o4j o5a +o0k o4r +^1 ^1 ^1 ^4 r +D2 i5a +i44 i6v i7e +i42 o54 o66 +o0n o1o r +^9 ^0 T2 +l o61 i72 o81 +o0l $8 $5 +o0o i1k r +o5p $1 +ss1 $6 $1 $6 +D4 $2 $5 +$4 $0 r +o5i o6m +D6 o6i +o3i o5k +ss4 $y $o $u +$i $8 +$i $c $a +D1 $1 $2 $1 $3 +$a $8 $7 +l $0 $6 $0 $8 +o0u o4a r +i4e i5r +o0z $1 $0 $0 +l $8 $3 $0 +o42 i54 o66 +o0g o4u +$u $e +o0m $8 $3 +^m o1m +i43 i50 ss0 $0 +^j $5 +o0c i1u +$1 $7 $8 $9 +l $a $3 +D6 o6c +$- $1 $5 +o1e o2b +i44 i55 i66 o77 +i51 ss9 $8 $1 +i44 ss4 $4 +o51 i69 ,7 $2 +i4w +o4z i51 R6 +$1 $4 $3 $4 +.0 i3a r +o4y $0 $2 +i41 i51 i60 o78 +o1y o2l +o48 $4 +se1 i64 o73 +i31 se9 $9 $1 +o1n $1 $4 $3 +o1y $2 $0 $0 $6 +o7o ] +$0 $7 $1 $8 +i3z i42 i50 i60 o77 +^2 ^0 o25 r +D1 $a $1 +i3s o4u +i42 i55 i63 o70 +-0 o3a +o3r o4e +o0k $5 $7 +ss2 $4 $8 +i50 i61 ,7 +o56 ss7 $8 +o1i i2j +^s o5a +,1 $1 $2 +o6c ] +^1 ^3 o28 r +i35 i41 ,5 +o67 ,7 $7 +$1 $5 $3 $0 +^o $a r +^1 ^3 ^1 o34 +i44 ss3 $2 $1 +o2y $l +i1i o2j +se0 $2 +i3i i42 o58 +^0 ^0 o20 +l i52 o60 i70 o83 +o1u $7 $7 +o4y o5f +i3g D5 +o52 i62 o71 +^0 ^8 ^0 ^9 r ++3 o5a +,4 i5i +i74 o8m o9e +i3k o4i r +i54 i62 o71 +o0e $1 $4 +i4m i5a +l $3 $6 $5 +i30 i48 i50 o68 +o41 ss9 $7 $2 +o1a ,3 +l $7 $2 $4 +D6 o6u +l i6a o71 +o1e $2 $0 $0 $6 +$1 $1 $1 $1 $1 $1 +l i70 o88 +i2t ,3 +sy6 $3 +o4N +^9 ^7 ^5 ^3 ^1 +i4y i57 ,6 +o51 i65 o70 +D4 $k +o2r i3s +o42 ss1 $4 +^1 ^1 l $1 $1 +^o o4o +ss3 $0 $2 +$y $p +^2 o72 +o2e $u +i3u i41 ,5 +o3a o6e +$1 $3 $2 $8 +i61 ss9 $8 $0 +o1i $a $1 +ss8 $2 $3 +i3g i4i +o2r $5 +i2f i31 i42 o53 +o0m $2 $0 $0 $5 +o0i i4a +^c $1 $2 +^8 ^1 ^3 +o41 ss1 $2 $2 +i51 i63 o70 +i1o D5 +o4y $9 $2 +$2 $2 $7 $7 +o0e $1 $5 +$r $1 $2 +l $2 $1 $0 $5 +l $_ $2 $0 +i41 sS0 $1 +$y $1 $9 $9 $5 +i43 i50 i63 o70 +i1h o5e +o0n $8 $7 +i3e i4l +o7i o8a +l $b $o $y $1 +l o89 o95 +o0s $2 $8 +l $1 $5 $6 +i5c o6e +i1e o2b +sn0 $5 +$4 $3 $7 +i2R +se1 sr0 $1 +o5z i61 o72 +o1y $1 $4 +^7 ^1 ^1 o30 r +o0n o2h r +i3g o5o +o2g o5a +^1 ^2 ^3 i4j r +ss1 $8 $3 +^2 ^1 ^4 o30 r +o2c $1 $2 $3 $4 +o0m $0 +l $1 $6 $9 +o2o o6a +^5 o10 +^1 ^9 o22 r +o1r ] ++1 $2 $0 $0 $7 +o54 i61 o73 +i3i $a $1 ++0 $0 $2 +o0n $9 $5 +o83 o96 +ss5 $3 $0 +^a o1y r +o4k o5z +^1 ^5 o20 r +i5a o61 o72 +o0s o5u +o4n ,5 +o1i o5a r +o0n $9 $1 +i4a o51 ss2 $3 +i31 i42 i53 R6 +i51 i69 ss8 $1 +l o69 +o1h $y +o67 ss8 $9 +o0a i2r +o63 i71 ,8 +o3v $o +$q $o $h +i3u i42 ,5 +i41 ,5 ss2 $2 +i2u o5n +i3y o4j +i4b o5y +i2i o5n +$# $# +D4 $c +^1 ^4 ^4 r +sg1 $0 +i31 i42 i53 o64 $5 $6 +o91 RA +i55 i62 o70 +o41 i59 ss7 $2 +o6, +i21 i31 i42 o57 +o52 i60 ,7 $9 +o2a $z +i61 o79 i87 o92 +i51 o65 o70 +o0j o2v +i51 ,6 R7 +o0f $1 $0 $1 +i3i i41 i50 o61 +o4o $0 $6 +i2y +3 +o6o $o +o52 o60 $0 $9 +o1j $1 $2 $3 $4 $5 $6 +o4A o51 +^R +i3o ,5 +o1a D6 +o0s $9 $0 +D3 $1 $9 $9 $6 +$1 $5 $2 $6 +i3a i4a +D1 $1 $2 $1 +o3y i41 o56 +o0l $7 $9 +i1u i2c +o2a $0 $6 +i51 ,6 o78 +$a $k $i +o2O +o2a i3m +i54 o61 o73 +i67 ,7 $7 +o1u i2v +,1 $2 $0 $0 $7 +o3z $7 +o0a $n +$1 $1 $9 $0 +$1 $0 $6 $9 +o1a $t +i3l o51 +o50 i61 o73 +$y $8 $3 +i5u +i2l o5o +$1 $1 $9 $2 +$y $8 $2 +^j ,4 +l ss9 $3 +o0j $1 $9 $7 $2 +l ] ] +i4t o5y +st0 $4 +ss4 $2 $9 +i3i i49 o51 +^2 ^5 o25 r +i6j i7o o8e +o2l $2 +i3. +o0j -2 +*12 $1 +o5s r +o2a $0 $8 +o5o $1 $2 $3 +l ss2 $6 +$0 $0 $1 $3 +o1o $4 +i8i o9a +o42 ss5 $2 $5 +o0m o3y +o2z i3e +l $0 $1 $0 $1 +D4 o6z +o53 ss0 $5 +i50 o61 o73 +-0 D5 +l o53 o67 +-0 D4 +i72 o81 o93 +$6 $9 $2 +,3 $3 $3 +$1 $9 $2 $6 +,2 i4a +sa4 o43 +se6 sd6 $6 +se3 o71 +i31 sm2 $3 +se3 o70 +o2j $2 $0 $0 $5 +i43 ss0 $0 $0 +$e $1 $8 +$a $0 $0 +o0d $0 $0 $7 +^9 ^1 ^1 o31 r +i32 i40 i51 o63 +o41 i51 ss2 $2 +i82 i90 iA0 oB8 +$2 $1 $2 $0 +i31 i45 o56 +o2n o5o +i2u o3l +^1 ^2 o24 +i42 ss1 $4 +o2w o3a +^j o4o +i31 i45 o53 +o3z ss1 $2 +sr1 $9 $8 $6 +^4 $4 r +^j o1- +i3e $y +se2 $0 $0 $1 +i44 i52 o64 +o51 i61 R7 +l $k r +^s l $1 +^1 ^2 ^3 o4d r +i49 ss8 $7 +o0j i51 o62 +o4y $8 $9 +o0d $6 $6 $6 +o1k $1 $2 +i3i o57 +i52 o60 sS0 $7 +o51 i62 i71 o83 +^3 ^5 ^7 ^9 ^5 ^1 +^7 ^0 ^7 o30 r +$1 $1 $4 $4 +i37 ss8 $9 +i41 i52 o63 i74 ss5 $6 $7 $8 $9 +o3o i4r +i46 i55 o64 +i44 i50 o61 +i31 i45 o52 +^9 ^8 ^9 R3 r +o44 ss4 $4 +^0 ^5 ^0 ^5 r +i5p o61 +i1h i3y +o42 i51 o65 +l i52 o6k o77 +i41 o53 o65 +i31 i49 o58 +o2y $1 $5 +^i ^m $a +^i ^1 r +o0b $u +$z $2 $0 +o0j $k +[ $7 $2 +i1u ,4 +o90 oA3 +-2 i4a +i3l o5o +o0k $1 $2 $1 +l o59 i69 ,7 +,6 $2 +l o66 o70 +ss4 $5 $6 $7 +o3d $o +i33 i46 R5 +o4v ] +i52 i62 o77 +i1a o2v +o53 i60 i70 ,8 +i41 o52 ss3 $4 $5 $6 $7 $8 $9 +l o4e $1 ++0 D4 +o4u +5 +i4h o5b r +^7 o10 i20 i32 r +sr8 $1 +i4y se1 o60 +i4y ss1 $3 +^6 ^2 ^2 r +^4 ^0 ^4 o30 r +o1y o4y +,2 $1 $1 +o0i $0 $7 +o62 i70 ,8 $0 +o3n $1 $3 +^m o4a +[ o0x +i20 i35 i40 o56 +i42 i52 o68 +o41 i52 i63 i74 i85 i96 iA7 ss8 $9 +o67 $3 +l o76 ss6 $6 +o0r o6a +i30 i41 o55 +i2u i3l +o2y ,3 +o1y i3o +sS1 $9 $9 $4 +o1u -2 +^9 ^5 ^1 r +i3a i48 o54 +sy4 $8 +o1u o4e +se3 $! +i3E +i31 i46 o58 +o5a $2 $2 +^6 ^8 ^3 o35 r +^5 ^3 ^0 r +o0p i4a +^1 ^7 o22 r +i3i i42 i50 i60 o75 +i3y o41 o52 +o5y $n +o41 i52 i63 i74 i85 i96 ss7 $8 $9 +o0n i1u +o0n D5 r +o1e $0 $0 +i41 o52 i63 ss4 $5 $6 $7 $8 $9 +i42 o53 i62 o73 +i84 o92 +o3u o4r +o52 sS0 $0 $7 +o3B +o2i o3a +i3a i45 ,5 +i80 i90 oA7 +o4y $p +o51 i68 o70 +^1 ^5 ^6 r +^0 ^6 ^0 ^6 r +o0g ,5 +i38 o41 +,5 $7 +l $0 $6 $0 $7 +o61 i79 ss7 $7 +sy1 $0 $1 $0 +l o7! +i25 i34 i43 i52 o61 +o2k ,5 +o0i $2 $3 +i31 i49 ss7 $9 +[ .1 +i3u i42 o51 +i1e i2s +o0l $3 $4 +D1 $1 $1 $2 $0 +i5e o6y +D4 i51 i62 o73 +l o6b +o3m D5 +l i71 o89 i98 RA +i41 i52 o63 i74 i85 ss6 $7 $8 $9 +i2d o5a +sr4 $5 $6 +^9 ^8 ^9 ^1 T4 +o3r D5 +o0t $9 $5 +^2 ^1 o20 r +ss3 $5 $0 +i5l ,6 $a +i51 i62 o71 o83 +i61 i73 i81 o93 +l o62 o70 $0 $7 +i62 ss3 $4 +i41 i51 i60 o74 +i34 i42 o58 +o4z ,6 +o4z i51 o67 +D5 o6e +i41 i52 i63 o74 i85 i96 ss7 $8 $9 +i41 i52 ,6 o73 +l sn1 $2 +o3a $9 +o4z i51 o65 +,5 o67 +i41 i50 i60 o77 +^a ^h ^t +o0v $2 $8 +[ $5 $0 +o2n $1 $0 +i5o o62 +l i40 ,5 +i2y o5l +D2 $9 $9 $9 +i2e o61 +l $8 $2 $5 +l $2 $k $7 +o4z $5 +o3i $6 +i39 i42 ,5 +$h $y +i51 o68 o70 +o0e $0 $7 +i3a o4y r +l $8 $2 $2 +$u $y +o1o $t +o2i i3e +[ o4u r +l o53 ss2 $1 +i41 ss9 $7 $2 +o0k $a r +i41 i52 o63 i74 i85 i96 iA7 ss8 $9 +o0m $0 $0 $7 +o41 i52 i62 o73 +i41 o52 i63 i74 i85 ss6 $7 $8 $9 +i41 i52 i63 i74 i85 o96 ss7 $8 $9 +o1i o5e +o5i o6z +o0c $7 $7 +o1e -3 +i2c o5a +-0 i3a +o0w $0 $6 +i3i i51 o63 +$8 $8 $5 +o41 ss2 $3 $4 $5 $6 $7 $8 $9 +l o51 o62 $3 +l i71 i89 o98 RA +o0j i1- +o52 i60 sS0 $7 +o3u $1 $4 +o3a $1 $2 $3 $4 $5 +i4i o5t o6a +o0p o2u +^0 ^7 o20 i32 r +ss4 $e +o3i i4z +^6 ^1 ^6 r +o0j o3z +l o61 i71 o82 +^8 ^1 ^8 +i56 o62 o76 +l i59 ,6 ,7 +l o51 ss9 $9 $5 +i30 i42 i50 o62 +^o o2i r +o0j i3l +$7 $9 $0 +-3 o4y +i4_ i51 o60 +o51 i64 o75 +o41 i52 i63 i74 i85 ss6 $7 $8 $9 +l $n r +o42 i53 i62 o73 +i54 i61 o72 +i62 i70 ,8 $5 +i1e o6a +i51 o64 o75 +i45 i50 o61 +^8 ^9 T2 r +D3 $g +i39 i42 o50 +$2 $7 $0 $3 +o42 $0 $0 $5 +i53 i60 ,7 ,8 +o61 i72 ,8 +o1a o2v +o0b $5 $5 +o4z o54 +l i61 ,7 o82 +o0a i3a r +i61 o70 o85 +o4j i5a +o4o o61 +o1j o2a +o3s i4o +^j i3a +i3L +^4 ^7 ^9 ^1 +o1m $1 $3 +l $m $i +o3a $8 $3 +l i6j o7o o8y +o1e $8 $7 +i2i $1 $2 +o1h $0 $8 +l i1t +o6z $2 +o0n o4i r +o0e i2i +D1 $r +se9 $9 +i41 i52 i63 i74 o85 i96 ss7 $8 $9 +i39 i42 o58 +l o52 i60 i70 o83 +^p o1h $1 +i5k +o0t i3e +D4 o5j +o1a $s +^4 o14 +$5 $2 $5 $4 +l o51 i69 ss9 $5 +l o5t o6o +o4v o5o +.2 $8 $8 +i47 i52 o63 +i4y i58 ,6 +o0z $1 $9 $8 $7 +i42 i55 i62 o78 +l i1n +so0 ] +o2u $1 $1 +i42 i53 o62 o73 +o57 o69 +o2c $1 $4 +i1e ,4 +i3d D5 +l $4 $1 $8 +sg1 $2 $3 $4 $5 +R7 $4 +.3 $5 +^5 ^1 ^4 +o61 i70 o85 +$1 $7 $2 $3 +o3o $7 +i41 i52 i63 i74 i85 i96 oA7 ss8 $9 +^k o4o +i41 o52 i63 i74 i85 i96 iA7 ss8 $9 +i41 i52 i63 i74 i85 o96 iA7 ss8 $9 +i3h o5a +o1o ,3 +o4u $e +i31 i40 i50 o66 +o0i o1r +ss1 $9 $8 +ss1 $1 $1 $6 +i3o o4j +i53 o60 i70 ,8 +i61 i70 o83 +o62 o70 $0 $0 +^0 ^5 o22 r +o0g $8 $9 +i2r o5u +i41 o52 i62 o73 +u $4 $E $V $A +i34 i40 o55 +D1 $9 $4 +i99 ,A +o2v ] +i61 i70 o85 +o2i .3 +i3i $3 +$1 $7 $7 $6 +sy0 $0 $0 +^2 ^7 o27 r +o91 $2 +^9 ^5 ^8 o31 r +o3i $l +o0j $1 $2 $1 $3 +i61 o74 $3 +o4h $b r +i31 i42 i50 o61 +l i42 R5 +i51 i68 o70 +o0d $4 $5 +o0s $9 $5 +D1 o3u +o3u $0 $8 +i2y o3s +^1 ^1 $1 $1 r +i41 i52 i63 o74 ss5 $6 $7 $8 $9 +o52 i62 o74 +$0 $7 $2 $6 +l o90 oA7 +^i o1i r +$4 $6 $2 +o7_ +ss1 $9 $2 +o0y i2r +l o71 i89 i98 RA +i31 ,4 $1 +^6 ^5 ^4 ^3 ^2 ^1 o6j +o50 $0 $1 +o4o i51 o67 +l $0 $8 $0 $8 +D3 $2 $0 $0 $4 +i21 i39 i46 o53 +i41 i52 i63 o74 i85 i96 iA7 ss8 $9 +o7z o81 +^5 ^0 ^5 o32 r +o0a i1u +o3e $2 $1 +o0s i1h i2a +so0 $8 +i3e o4b +o4a o5. +o0y $2 $6 +o1u i3u +$b $o $1 +l $+ +o0m $8 $6 +^j $0 $9 ++0 o1u +i4a o5b +$a $m $o +o41 i52 i63 ss4 $5 $6 $7 $8 $9 +i41 i52 i63 i74 o85 i96 iA7 ss8 $9 +o3d $1 $3 +i21 i34 o43 +l i49 o52 +i1a o5e +$4 $8 $2 +o0a i1k r +l o90 oA1 +$y $p $o $o +o08 i11 r +o67 $7 $7 +$1 $2 $3 $? +o2l o5i +$6 $9 $5 +i30 i42 i50 o64 +l o33 +o0l $8 $3 +o0a $8 $9 +[ $0 $0 $0 +o4a i59 ,6 +o0b o4a +i31 i40 i52 o69 +o2a o3y +l ss9 $2 +i42 o5m o6e +i2y o3l +sn1 $9 $9 $5 +o41 i52 ss3 $4 $5 $6 $7 $8 $9 +$_ $7 $7 +i41 o52 i63 i74 ss5 $6 $7 $8 $9 +$4 $8 $7 +i41 i52 i63 o74 i85 ss6 $7 $8 $9 +o1i .3 +$9 $3 $9 +o0z $h +$7 $9 $7 $9 +o5t i6a o71 +o3z o5y +i3o i4u +^7 ^1 ^5 r +i41 i59 ss7 $2 +i41 i52 o63 i74 i85 i96 ss7 $8 $9 +i41 i52 o63 ss4 $5 $6 $7 $8 $9 +D3 o5a $1 +i50 ,6 $1 +i43 i52 o65 +$? $? $? +o3o $0 $0 $7 +o3i o4l +i5i i6t o7a +o2a $1 $2 $3 $4 +o5u o61 +o0r o3a +o41 i52 i63 i74 ss5 $6 $7 $8 $9 +o2a $1 $4 +i38 i41 o55 +o2s ,3 +i42 o51 o65 +i1m ] +i1u $e +$9 $4 $5 +o0m i1y i2c +o0n i4o +i2k i3u +o41 i53 o65 +l o1k +l i51 o69 ss9 $5 +i86 o97 +^1 ^4 ^1 ^4 ^1 o54 +$2 $3 r +D1 o4e +i6i o7e +^1 ^4 ^1 ^2 r +i76 o82 +,3 $1 $0 $1 +o0i i1i r +l i62 R7 +o0o o1k r +,1 i2y +o3n $i +o2c $2 $0 $0 $6 +i4c ] +i41 i52 i63 i74 o85 ss6 $7 $8 $9 +o1l i2e +^1 ^2 ^3 o4n r +^0 ^1 T2 r +ss7 $1 $0 +i3t $a +i41 o52 i63 i74 i85 i96 ss7 $8 $9 +i2t $1 +i4z i51 ss2 $3 +o0a i3i r +-2 i3e +D2 $9 $1 +o1d $2 $0 $0 $6 +$8 $9 $0 $7 +o61 ss9 $7 $7 +$6 $0 $0 $0 +i31 ss9 $7 $9 +o45 ss6 $7 +^a i4o r +.0 ,4 r +i51 i65 o70 +o42 ss0 $1 $1 +o42 i50 ss1 $1 +o2f i3a +o8i $a +i4_ i50 o61 +i74 o8m $e +D5 $8 +^d D3 +l i51 o69 ss9 $3 +^2 ^1 sJ3 i3j +i40 i52 i61 o70 +i35 i40 o53 +i5i $a +i30 i41 i50 o62 +i2g o3o +$2 $6 $0 $2 +i3k $a +i1h $0 $9 +i35 i40 o55 +i31 i48 i51 o68 +i71 i82 o93 $4 +l i11 ++3 D5 +i5a i61 o75 +o0b $2 $0 $0 $6 +^6 ^9 ^9 ^1 D5 +o0i $1 $1 +o4s o5h +R3 +o0a $1 $9 +o0k o54 +l o8a +^0 ^0 ^2 o31 +o74 $5 +o5j o6e +o0c $2 $0 $0 $0 +^3 ^2 ^1 .4 +$6 $3 $3 +D4 o5t +i6j o7o +o0w $6 $9 +o3o i4m +$$ r +^a o1j +l $0 $2 $4 +o3k $2 $2 +o42 i50 sS0 $8 +o51 i60 i71 o83 +$n $a $1 +l o91 oA3 ++3 $2 $1 +^0 ^0 o29 r +i4r o5y +o3y $s +o0c $2 $0 $0 $5 +i2a D5 r +,4 $2 $2 +^3 ^2 ^1 o81 i92 oA3 +l i61 o79 i89 o98 +$0 $9 $3 +o3d i4e +$i $m r +i1u o2y +^1 ^1 ^4 o31 r +[ $4 $2 +o0n $5 $5 +l o71 i89 i99 oA1 +i2r o51 +o5a $0 $7 +o5a $2 $1 +o3j $u +-2 o3o +$k $1 $2 +^1 sJ2 i23 i3j +^8 ^1 ^2 o30 r +o0g $0 $3 +i88 o91 +[ o0p +^1 ^9 ^9 ^3 D5 r +l o90 oA8 +^o ^j $1 +o5a i61 o77 +o32 $0 $0 $8 +sy5 $1 +o3h $1 $2 $3 +sJ1 i12 i23 i3j +^5 ^0 ^0 ^0 r +sa4 i13 i22 i31 r +o4k $7 +^2 ^0 ^0 ^8 D5 r +o1i o2y +o0u o1r +l i61 i79 ,8 o98 +i3m $e +o2r $0 $8 +o4o i52 o64 +i34 i41 o56 +o4o o5c +o4o ss1 $2 $3 +*45 $1 +i1e i3r +i60 ,7 R8 +i4n o5z +^l o1e r +o0l $3 $2 +i31 o49 ss8 $4 +l o62 o7k $7 +o32 $0 $0 $7 +^9 ^1 ^1 o30 r +i3y o5i +o4a i50 ,6 +^6 ^2 ^3 r +o0j $1 $0 $1 $0 +i4x +l i82 i90 ,A oB7 +i31 i40 i51 o68 +o1a ,4 +D6 o6l +i49 i52 o65 +i51 o63 ss1 $3 +^z $1 $2 $3 +l o85 ,9 +^0 ^8 ^0 ^8 r +o4z i51 o66 +i32 o40 $0 $7 +o3y i41 i52 i63 o74 +D1 $1 $2 $0 $9 +$e $0 $8 +i42 i52 o67 +sa1 $2 +i2c $o +i61 o79 ss7 $7 +i5y se1 i72 o83 +o1e i3y +o42 sS0 $0 $8 +-0 $1 $4 $3 +o4y $0 $0 +o2n ,5 +l i61 o79 ss8 $8 +i41 i50 i60 o73 +^6 ^0 ^0 ^2 T4 +o0m $9 $8 +l i42 i50 i60 o75 +i33 i40 o56 +o0w $i +o1e o2k +$7 $5 $6 +l i71 i89 ,9 oA1 +l o61 ss9 $8 $8 +l i82 o90 iA0 oB7 +o3n o4i +o0c $2 $9 +i1r $e +i2z D4 +i52 o61 o77 +o47 $7 $7 +o1o $2 $0 +D5 o6i +l $2 $5 $4 +^c $2 +i3d i4o +o0i i2h r +i4c o5y +i46 i51 o62 +o51 ss1 $4 +i21 i32 i42 o55 +se1 $9 $9 $8 +l o6k o7a +o42 ss0 $2 +o1a o2b +i2r .4 +i42 o50 sS0 $8 +sd6 $5 +i41 i59 i65 ,7 +o2u o4u +D1 $1 $9 $6 $6 +[ i3i r +ss3 $0 $6 +^1 ^9 ^5 ^4 r +D1 o5l +o0n o2y +o6L +$s $e +i2c i3i +^5 ^0 ^1 r +i4b o5e +o3f i4a +i3s $y +^5 ^0 o21 r +o31 i49 ss8 $4 +o71 $2 $3 $4 +i10 i21 i32 i43 i54 o65 +,4 i5a +o3a i4f +$7 $9 $3 +o2l i4a +^a i3i +o0n $0 $4 +o5j i6o o7e +o0x i1u r +i54 i61 o73 +l $1 $0 $0 $8 +l i51 o69 i78 o80 +i4d o5u +l o51 ss9 $9 $3 +o5j $o $e +i4y i53 ,6 +i4c o5k +o1i o5u +o0z $5 $5 +l o4z ,5 +$1 $7 $2 $7 +D1 $8 $6 +$0 $5 r +o4a $7 $7 +i43 ss1 $3 +o2g o3o +o5A o61 +^4 ^4 ^3 ^4 ^1 ++0 i2r +^2 $! +o0k $2 $3 $4 +sd7 $3 +^c $1 $3 +o1u o2v +l $_ $0 $6 +o0g o5z +o0f o5o +o1a $9 $9 +l o61 o72 $3 $4 +o3z i42 ,5 +o5z i62 o73 +o0z $3 $1 +l i51 i69 o78 o80 +o4y $2 $8 +l o6m o7a $e +o0p $2 $7 +ss1 $0 $0 $3 +o2d D5 +st2 $0 $0 $9 +i5a o65 +[ o61 +o1h $0 $9 +l o5e $1 +l o5z o61 +l o51 i69 ss9 $3 +o2n o6a +o5y $1 $8 +D3 $9 $7 +o5c o6h +i51 i60 o71 o83 +$c $i +o0g o2y +o2g i3e +l $a $h +$8 $* +l si1 +o0j i2l +i4a $1 +i3o i42 o57 +o5z i61 o74 +i3y o4b +^i o4u r +i3g o5i +o3l o6a +i41 i53 o60 +^2 ^5 ^2 ^9 r +^2 ^3 o27 r +^k o1i i2m +sl1 $8 +o0d i1h +l o57 o63 +[ o1a +o0d $9 $5 +o0o i1i r +o0k o5r +^2 ^4 ^5 r +o0b o3a +$d $2 +o0p $1 $9 +l $2 $0 $8 +i2r o5z +l i6m o7a o8e +D3 o71 +sr1 $9 $8 $4 +$- $8 +^e ^j T2 +^9 ^9 ^6 R3 r +o0j i1l +D1 $1 $0 $1 $2 +i2j i3u +l $7 $1 $9 +i2d $1 +$e $2 $4 +^5 ^5 o25 +i3s ,4 +o0g o61 +i7_ o81 +o3n o6a +^m ^1 +o0s i3e +o0a i1j r +o3r i4e +,3 i4u +i3z o4i r +i59 ,6 $9 +o6l ] +o5r r +$3 $9 $5 +l o61 i79 i89 o98 +i85 o96 +i2E +i3n $e +^2 o16 +i4i -5 +ss9 $5 $1 +[ i3e r +l o82 i90 iA0 oB7 +o5a i60 o78 +^5 ^8 ^9 ^1 T4 +i3a i4b +l o61 i79 ss8 $8 +o51 i63 ss1 $3 +o3z i4k o5i +o4l o5y +$3 $6 $8 +l $0 $3 $0 $6 +^o o5a r +o4o i5u +l ss9 $1 +.2 ] r ++0 $! +i3y i42 o57 +l $0 $3 $0 $3 +i41 i51 i61 o75 +o0s o61 +o52 i6k o77 +so1 $2 +ss1 $9 $5 $4 +o1l o2y +o0k i1r +i31 sr2 $3 +o3u o5u +ss1 $4 $2 +o0h $1 $8 +i4y i50 o64 +^- ^d +o56 $7 +o31 ss9 $8 $4 +i49 i55 o64 +^L +$a $m $i +o5y i69 ,7 +l o6m i7a o8e +o1h $2 $0 $0 $6 +^l o1h +o3k o4e +o81 $6 +D2 $c +i21 i30 i41 o56 +o1r D3 +o4a i50 o63 +D7 D7 +$1 $6 $2 $2 +o0d $3 $0 +^1 ^2 ^3 o3. r +i3o i46 o59 +i43 i52 o64 +^J T1 +o52 o6k $7 +R6 o75 +D2 $2 $0 $0 $1 +i4x o53 +$k $a $i +i42 o50 ss1 $1 +$1 $2 $9 $6 +R5 o68 +i1y o2k +l i71 o89 i99 oA1 +l o51 i69 i78 o80 +^1 o2e r +i36 i41 o57 +i4e i51 o62 +^k i4i +,4 $k +^8 ^1 $1 $8 +o0l $1 $0 $0 +o0d i4o +o0s o3e +o3g i4g +i31 sp2 $3 +D2 i4y +ss1 $5 $3 +o0n $1 $0 $1 +^, r +^4 sa3 i22 i31 r +^3 ^4 sa2 i31 r +^0 o12 +$4 $8 $5 +,3 o6a +^4 ^3 ^2 ^1 o45 i56 +l o62 i7k o87 +o3e $2 $2 +o2a o5z +$8 $9 r +i11 i22 i33 i46 i55 o64 +o5o o6y +$y $7 $8 +o51 ss3 $1 $3 +$2 $3 $1 $5 +o52 ss0 $2 +i3o i4l +l o87 R9 +i46 i50 ,6 +i3z $1 +$3 $1 $1 $3 +l o5o o61 +$n $0 $7 +l i2g +$2 $1 $8 $5 +o5v $a +i2i o3y +i65 i71 o80 +i4a i59 o64 +o3z $9 $0 +$0 $3 r +$2 $5 $1 $4 +l o6j i7o o8y +$o $0 +^1 ^4 ^1 o34 +l ss3 $3 +o3o $9 $9 +D3 o5c +i31 i49 o57 +l $v $i +i37 o48 R5 +i62 o70 $0 $5 +^6 ^7 ^8 o35 r +i46 i52 o64 +o76 $6 +i4t $1 +$2 $1 $3 $1 +sJ1 i14 i23 i3j +o0l i1e r +i3y o5u +l i52 i60 ,7 o81 +o0s i2u +o6a o72 +o5a o6j +o4o i51 ss2 $3 +o0e o5i +o1k $2 $0 $0 $8 +o0i $1 $0 +i2f i3i +^2 ^5 ^6 r +o2r o5u +i21 i31 i41 o57 +o90 oA4 +^1 ^8 o20 r +o1c i2h +sH1 i1h +o3u o4l +o1y o4z +l i52 o60 +$_ $8 $6 +^k $1 $2 $3 $4 +i2z ] +o6y $2 +i98 ,A +i61 ,7 o83 +^3 sG2 i21 r +i36 i42 ,5 +i21 i31 i40 o56 +^1 sJ4 i23 i3j +o3o $7 $7 ++0 $u ++2 $1 $1 +i47 i51 o60 +o0k i2s +,3 o4e +i62 o71 ,8 +^_ ^0 ^1 r +o4b o5e +l $a $1 $2 $3 +ss0 $1 $0 $2 +l $5 $0 $3 +,4 $2 $3 +i3k o4e +ss0 $1 $0 $1 +si1 $2 $3 +o0h $1 $2 $3 $4 +i4z o55 +o2h o4i +i3a i48 o56 +i2n $1 $1 +o0h $2 $7 +i4u o5z +i1j $1 +o4y .5 +o0g $0 $2 +o3i $6 $6 +i2z o3e +o1e o2s +o40 ,5 $7 +o31 $2 +l o72 i80 i90 oA4 +i41 i52 i63 i74 i85 i96 iA7 ss8 $9 +$f $i +o68 ss8 $8 +^a i2a r +o0j D6 +^b o5a +o1y $n +i30 i45 i50 o65 +o44 $2 $0 +^2 ^0 ^1 o38 +o1u o3y +l i52 o60 ss0 $4 +i2y $o +^j o2i +i41 i59 o66 o74 +^9 ^0 o28 r +i51 i69 i76 o84 +o0t o4y +o0n o2e +sD2 $3 +$7 $6 $3 +^j i2e +o0d $8 $5 ++0 $9 $9 +o2n $2 $2 +,4 $0 $7 +^5 ^9 ^9 ^1 D5 +i53 i61 o72 +$K $A +o0y $4 +i78 o89 +i1i o2r +i5a o6m +l $1 $1 $1 $6 +i3j o4a $1 +$a $y $a +,5 $1 $2 +i36 i42 o51 +o4y i59 o64 +o0f o3i +o04 i12 r +i5- o61 +i31 o49 ss8 $2 +i41 i51 i60 o76 +$1 $4 $3 $3 +^3 ^1 i61 o73 +o3e i4l +o1o o3z +i31 i40 i51 o69 +o3y i40 o51 +l $0 $7 $0 $7 +l i50 ,6 +^2 ^1 R2 r +o53 i62 o74 +o0b $9 $9 +o61 i71 o83 +o3p i4o +sr2 $0 $0 $3 +^5 ^0 ^5 o30 r +$- $1 $1 +o41 ss1 $7 +^0 ^3 o22 r +$0 $7 $1 $9 +o0m $4 $2 $0 +so0 $0 $1 +o65 i76 o87 +^j o2u +i51 o60 i71 o83 +o81 i99 iA9 oB2 +ss8 $1 $5 +o0k $6 $8 +o66 i79 i86 R9 +i3_ i41 o58 +o0t o4o +i41 i52 i63 i74 ss5 $6 $7 $8 $9 +o3i $8 $3 +si1 $5 +^- $- r +o2i i3a +l o61 i79 i87 o94 +o0m $9 $6 +i21 i32 i42 o56 +o41 i59 i66 o74 +o4a $0 $0 $7 +i2g i3u +o51 i61 o76 +i32 st0 $0 $6 +$< $3 $3 +o0w $2 $1 +o4y i51 ss2 $3 +i5y i61 se2 o83 +o0l o2o +l i72 o80 i90 oA4 +o1a o5j r +^7 ^2 ^1 r +l ss1 $0 $1 +i3a i49 o55 +l i72 i80 ,9 oA4 +o0K $1 $3 +i66 o79 i86 R9 +i2u $e +o63 i71 o83 +l o61 ss9 $8 $4 +^b $1 $3 +i2m $e +i32 i40 st0 $6 +i1i o5a r +l o51 ss9 $9 $4 +$x $5 +o37 i48 R5 +o72 o80 $0 $7 +$2 $4 $8 $6 +o0s $9 $3 +i1z r +o5h ] +ss5 $6 $1 +$2 $1 $2 $6 +o1e i4e +i2l D5 +$4 $6 $6 +i43 i56 o69 +o3i $1 $4 $3 +o0i i1s +i32 i40 se0 $0 +i2y o51 +o2r o4u +ss8 $2 $4 +o51 ss0 $5 +i67 i71 o83 +l i61 o79 i87 o94 +o2y o4z +i62 o70 ,8 $5 +i39 i42 o56 +o0n $. +o4o $2 $7 +^y ^m ^a T3 +o0j o1h o2e +i63 o71 o83 +i2y o3d +o0J $1 $2 +^1 o1r r +^1 +1 +ss1 $1 $0 $4 +o1r o2a +$2 $2 $6 $9 +i3e o6a +i5y o61 i72 o83 +^3 ^0 o23 r +D5 o56 +^1 ^0 ^3 o32 r +o4o $1 $6 +i50 i60 o76 +o41 $0 $0 +o2i $2 $0 $0 $7 +i41 ss2 $3 $4 $5 $6 $7 $8 $9 +o0j $* +i41 o54 $3 +o0p $2 $0 +D5 ,6 +i41 i52 ss3 $4 $5 $6 $7 $8 $9 +i4f o5e +o5z o67 +$3 $1 $0 $5 +D3 $1 $9 $8 $5 +l o51 i69 ss9 $4 +$1 $8 $2 $6 +o0y $7 $7 +o7p +^4 ^0 ^7 o30 r +l i61 o79 ss8 $4 +^n o1u +o31 i49 ss8 $2 +i81 o99 iA9 oB2 +i66 i79 o86 R9 +o2z $y +i1u o3i +o0c o51 +^1 ^9 ^9 ^5 D5 r +o1a $m +o3z o6a +^i o2e +^6 ^1 ^1 r +ss. $1 $2 $3 +D3 i5a +ss1 $3 $2 $4 +l $o $7 +o4y $o $o +^j $4 +$1 $1 $9 $1 +D2 $2 $2 $2 +o0y $2 $7 +^k o1i o2m +o5y i66 R7 +l $m $b +o2h $y +o74 i8m o9e +o5y i61 o78 +sg1 $5 +ss_ $2 $3 +i2p i31 i42 o53 +^c $o +o1y $0 $6 +i31 sg2 $3 +o84 i92 oA0 +o5l $l $a +i33 i49 i59 o61 r +i45 ss6 $7 +i2a o4u +l ss8 $6 +l $9 $2 $6 +i31 i44 i50 o68 +i3i i48 o56 +.0 $i r +i1y o5a +i36 i49 i56 R6 +i1L +o1i $0 $0 +o72 i80 ,9 $7 +i51 i69 ,7 $5 +i48 i51 o65 +^e o1u +o1i o3u +^c $i +ss5 $1 $9 +i3e o4m +i61 i70 o88 +o3s o4y +D3 $1 $9 $9 $3 +o4i i5t o6a +^0 ^4 ^0 ^6 r +^~ $~ r +i41 o59 i66 o74 +o0c $1 $4 $3 +o31 $2 $3 $4 $5 $6 +o41 $4 $3 +o0k -4 +o1u $9 $9 +i21 i32 i41 o57 +o1c $1 $9 $9 $2 +i65 o76 o87 ++0 $1 $9 +$1 $1 $9 $6 +o5s o6i +i4y se2 o63 +i2o o4y +i39 i40 o51 +o3f o4o +$0 $1 $1 $9 ++1 $2 $0 $0 $8 +o4e $i +o2y o3n +-0 $8 $7 +^7 ^8 ^7 r +$0 $1 $1 $7 +sd5 $1 +^. ^1 ^2 ^3 r +o2r o3j +i31 i40 i50 o67 +o3i i51 i62 o73 +i4k i5a +i38 i41 ,5 +o4a $3 $3 +i3y i42 o58 +o0v i3i +i3o i40 o54 +o4p o5u +i50 i61 o70 +l o61 i79 ss8 $4 +$3 $6 $2 +.0 $i +ss6 $2 $5 +-0 $9 $9 +i51 ,6 o76 +i31 i42 i53 o6. +i81 i99 ,A oB2 +o2a $1 $7 +,2 $1 $4 +^3 ^< $< $3 +i61 i70 R8 +o48 $5 +^5 ^0 ^2 o31 r +o31 ss9 $8 $2 +i1r o2y +$0 $1 $3 $0 +D1 $0 $0 $0 +^1 o1l r +o0, +l $1 $8 $0 +st1 $9 $8 $4 +sn2 $5 +i4a i56 o69 +o0y $8 $9 +o0b i2i +i32 se0 $0 $0 +sG3 i12 i21 r +l $b $1 $2 $3 +i66 i72 o86 +^2 ^1 ^1 o33 +o51 $9 $9 $5 +i35 i43 o50 +i35 i42 o57 +$8 $6 $7 +[ $1 $2 $1 +D2 i3c +i1h i2o +o1a o6e +ss6 $2 $9 +^4 ^1 sJ3 i3j +o0z i4o +o0w $1 $2 $3 $4 +,1 $3 $3 $3 +i36 i41 o52 +o2s o4o +sn0 $0 $7 +i41 i52 i63 ss4 $5 $6 $7 $8 $9 +R5 o65 +i35 i42 o53 +l $0 $2 $0 $4 ++4 o5u +ss7 $2 $2 +^0 ^1 i51 o60 +$5 $8 $0 +D5 -5 +-2 $1 $1 +$i $1 $6 +i21 i32 i43 i54 o65 $6 +ss1 $5 $7 +l i41 i50 o61 +l i51 o69 ss9 $4 +^9 ^8 ^8 R3 r +i41 i52 i63 i74 i85 i96 ss7 $8 $9 +i3i o55 +o2a ,4 +$. $8 +$8 $4 $7 +i41 i52 i63 i74 i85 ss6 $7 $8 $9 +^2 ^1 o2_ r +i36 i40 o51 +l o52 i60 ss0 $4 +[ o0h +o2w o3i +o1u $0 $4 +i4_ i50 o67 +,3 $2 $0 +i71 o88 o97 +$3 $7 $1 +o0i D5 +l i51 o69 ss9 $1 +,1 ] +^7 ^5 ^4 ^2 ^1 o58 +$a $0 $0 $7 +.2 $6 +i40 i51 i60 o72 +i4i i62 o71 +i43 i53 o64 +$5 $9 $7 +i4y i52 o66 +o2h o4a r +o0b $2 $0 $0 $7 +o31 i42 o51 +sY0 $1 +i4o $1 +l i43 o51 +i1u o2l +o45 i50 o64 +se2 ] +o3y o4m +$2 $9 $0 $7 +o66 $4 +i5e i61 o73 +ss8 $2 $0 +^2 ^0 o23 r +o3R +o2p ] +o0l i2r +[ $7 $3 +sd7 $1 +o51 ss9 $7 $4 +.2 i4o +o51 i69 ss7 $4 +o2k $6 $9 +^e T1 r +o0k i50 o61 +i2t o4a +i4z i50 o61 +o0n $h +^1 ^1 ^7 ++0 o1o +^8 o10 i20 i32 r +o0c i3e +o2y $1 $0 +o3u o4n +^m $i +i2i o3m +i41 i59 i65 o78 +o0i $1 $6 +o0r $8 $9 +i3s o5e +$z $2 $7 +sS5 $6 +o3o o5e +o3o $2 $0 $0 $5 +o1l o2a +o53 i62 o70 +^j $1 $9 +o3J +i4i ,6 +i5a i62 o73 +o6o o72 +i21 i31 i43 o50 +^m D3 +i5a o6z +i2t o4i +D3 +5 $a +i51 se4 o73 +o78 o89 +D3 i4s +i5e i62 ,7 +[ $e r +l $. $1 $2 $3 +i45 o50 o64 +o0o ] r +^6 ^0 ^0 r +o72 i80 i90 oA3 +^4 l $4 +i62 i70 o81 ,9 +l o6x +o2z $1 $6 +i3z i47 ,5 +o0z o3e +sr# $1 +$9 $2 r +^1 ^2 o5j r +i61 o79 ,8 $2 +o0n i3e +o0i o4o r +o2z $1 $0 +o3h $1 $2 +o6k $1 +i3m $a +^1 ^2 ^1 o36 +o0k $3 $8 +o1j $1 $0 $1 +i2u i31 i42 o53 +i41 i59 o66 o75 +.0 i2h r +o3a i4y r +$2 $2 $3 $4 +o2i o3m +o5q ] +,2 o3b +i4a o51 o63 +$m $2 +^j $2 $0 $0 $6 +$c $h $e +^3 o63 +se4 o6m $e +l o6b i7o ,8 +i5j o6o o7e +o2y $0 $7 +o1i o4e +i3r o51 +l $8 $1 $0 +^v o1o +i36 i42 o54 +$h $j r +o32 o45 +o2n i4i +^6 ^9 T2 r +D4 o5c +o0h i2y +i83 o95 +i50 i69 o78 +^x o1u r +o0e i1u +o51 i60 i71 ,8 +i6l o7e +i51 i61 o72 ,8 +o1i i2r +o1u .3 +^a o4e +i31 i43 o57 +o0k $2 $1 $3 +o6j $o $e +$@ r +o4v $i +o2r i3j +i49 i52 o66 +i41 i54 i61 o75 +D2 o5j r +o3a $8 +^0 ^8 ^1 ^2 r +o00 i11 r +^0 ^9 ^9 ^1 T4 +i56 i61 o73 +l o51 i69 ss9 $1 +i2y .4 +i5y o61 ,7 +o0a o1d +l $0 $2 $0 $2 +i41 i51 i61 o78 +l $t $e +l $0 $7 $0 $8 +l $m $i $a +D2 $1 $9 $9 $8 +i2n $1 $3 +o3e i4e +^1 o1f +,4 $6 +i2g i3o +o61 i79 ,8 $2 +^7 ^6 ^4 ^3 ^1 o59 +i3h $e +se0 $0 +o0l o5u +o0k i1y $1 +o0e $0 $8 +$e $0 $5 +o1e +2 +i2a o3z +l $5 $6 $2 +o5o R6 +$i $0 $5 +i41 i52 o63 o70 +o41 i59 i66 o75 +o5J +o3o o4b +o4y i55 ,6 +i41 ss0 $3 +i52 o61 i72 o81 +o3h i4u +o4w $i +l i52 o60 i70 o81 +i43 o56 R6 +$7 $9 $8 +i2n $2 $3 +o43 i56 R6 +D2 $. +i91 iA0 oB1 +i44 i51 o66 +o51 ss2 $2 +l o52 ss0 $0 $4 +$1 $4 $0 $0 +,2 .4 +^8 ^9 o21 r +o1c $1 $2 +o0b i4i +o1h $0 $7 +l o51 ss9 $9 $1 +l i57 ,6 +i4i i61 o70 +ss1 $8 $1 $8 +,4 $! +o60 i70 R8 +o3o o4c +o50 ss1 $2 +o1y $3 +$e $1 $7 +i62 o70 i81 ,9 +^1 ^2 ^2 ^1 +i3n ,5 +o0a $h +o1i o5t +i41 i52 i63 o7! +o0k $4 $0 +l o6b o7o $o +o0r $3 $1 +-2 D5 +D3 o5k r +o4y $9 $3 +i4i o66 +i1k o2i r +i4i i60 o73 +$y $3 $4 +D3 i5o +o0J $1 $3 +o0k i3t +^3 ^6 ^9 o31 r +i41 o52 i63 o70 +o3y $2 $0 $0 $6 +o0k i3i $1 +se8 $8 $8 +i41 i52 o63 $4 $5 +$5 $5 $3 +i4Y o51 +o78 $1 +o51 ss1 $7 +i4i R5 +$- $4 +$1 $3 $9 $2 +^3 ^2 ^1 i44 o55 +^0 ^8 o20 i32 r +ss1 $1 $0 $9 +o4n i5i +l sn2 $2 +o71 i88 o97 +l o52 i60 i70 o81 +o0k o3t +i47 i52 o64 +o5z o65 +l $7 $3 $0 +i3c r +$5 $4 $7 +o0g i3e +^e ^e ^w T3 +R7 $6 +$@ $1 $3 +^4 ^1 ^7 r +^5 ^2 ^3 o32 r +sT1 i1t +i47 i52 o61 +sd1 $1 $2 +o6k o71 +l o14 +o3v $i +i2a .4 +$1 $6 $0 $0 +o0r D1 +^2 $7 +i3b i41 i52 o63 +i31 i41 i51 o65 +o73 ss3 $3 +o4T +o3o i41 i52 o63 +sS9 $7 +$9 $0 $0 $2 r +si1 $! +l o52 o6k $7 +^6 ^2 ^1 r +D1 $1 $0 $1 $3 +D2 $0 $0 $0 +o1e i4n +^o T1 r +^0 ^9 T2 r +i3z o4k o5i +^4 ^3 ^2 +i14 i22 i30 i44 i52 o60 +o4u o5k r +^8 ^5 ^2 o30 +^5 ^0 ^8 o31 r +o4h ] +i39 i45 o54 +i51 o69 ss7 $4 +ss_ $1 $6 ++0 o3i +^5 o15 +i41 i52 i63 o74 $5 +^2 ^0 ^6 o30 r +i34 i45 R5 +i3r o5y +o0j $6 $4 +l $j $o $1 +o2a .3 +l i61 i79 o87 o94 +o2m $e +i3z o51 +l $7 $0 $2 +D3 $b +l o52 i6k o77 +o3m $1 $2 +^9 ^0 ^6 o31 r +i41 o59 i66 o75 +i31 o42 o51 +$y $2 $0 $0 $0 +i32 i45 i51 o69 +se9 o62 +o3z $1 $9 $9 $2 +o4o o5! +$2 $9 r +i3u o4v +$2 $8 $0 $2 +i31 i47 ,5 +o1e o3u +o4x r +i6t ,7 +l o6j o7o $y +i2d i3u +i37 i42 o58 +^8 ^0 ^8 o30 r +^2 ^0 ^4 o30 r +o1o o2e +o3s $y +$6 $8 $8 +i3a o5a $1 +o41 i52 i63 o70 +,3 o5i +o3i $1 $9 $9 $4 +^z ^z r +i1u i2v +D1 o1d +o0w i1y +ss1 $4 $6 +o0v o4i ++0 $2 $0 +o4i $6 +o30 ss0 $1 +i21 i30 i42 o58 +i67 ss8 $9 +^2 ^5 ^2 ^7 r +$7 $2 $7 $2 +sd4 $8 +i21 i32 i41 R5 +sd1 $9 $7 $7 +$s $4 +i2m ,3 +,5 o6n +o3z $8 $5 +$i $1 $8 +i41 i52 se3 $4 +l o88 o92 +i38 i42 o54 +o2i ,4 +l $2 $3 $4 $5 +^o D4 +o3k $0 $7 +l $1 $6 $1 $6 +l o88 o91 +o0k i1a r +sY1 $4 +$1 $2 $9 $9 +o0k o2j +D1 $6 $6 +o2b $e +sy1 $2 $1 +o0a i1e +o5o i61 o70 +o3b $y +o2g $1 $3 +i2z i31 i42 i53 o64 +l $0 $4 $2 $0 +ss1 $7 $7 +o3e $1 $1 +i37 ,4 $7 +sy1 $3 $1 $3 +i3a i48 o55 +D3 i5h o6o +sl1 sy0 $1 +^9 ^8 ^7 R3 r +i68 i71 o88 +i41 se2 $3 $4 +i51 i60 o71 ,8 +o72 i82 ,9 +o3a $3 $4 +i3a i42 o59 +o2i o3e +^1 -1 r +i4_ i50 o68 +sr1 $9 $8 $0 +R5 o60 +D1 i3y +o3y $9 $3 +D1 o2m +i47 i54 o67 +l $0 $1 $0 $3 +o0e D5 +o1u $0 $2 +i5a i6n ,7 +^1 ^2 o23 +o2w ] +o51 i69 i76 o88 +o3y $9 $5 +o1a o3j +^0 ^2 ^1 o35 +i51 se1 ,7 +^s o1h i2a +i61 i79 o86 R9 +i2p o3o +i38 i48 i59 o61 r +i1u o2j +i41 i52 o61 o73 +^4 ^0 ^9 o30 r +o0s $7 $7 +l $1 $9 $5 $3 +i31 i48 ,5 +o3y $8 $9 +^1 ^1 ^3 o31 r +^a o1l +$o $0 $0 $7 +o0d i2u +o52 ss1 $0 +D2 i3l +i5n o6o +o4y -5 +sY0 $7 +D2 i3m +i5y o61 o73 +i82 o90 ss0 $7 +^o ] r +o62 i70 i81 ,9 +o3y o4l +o0p $1 $0 $1 +i31 o49 i57 ,6 +^0 ^1 ^7 r +o4y i53 o60 +o4f $i +i51 i61 o70 +o4y o51 $3 +o3d o51 +^w o1y +^4 ^1 ^2 o31 r +i31 i48 o53 +^3 ^1 o21 r +l $y $y +i2o o5o +o1l $1 $9 $9 $4 +i5e i61 o72 +i4y se1 o65 +o2t i3u +l $1 $9 $1 $9 +o0y o6a +$2 $1 $1 $4 +i61 i75 R8 +i1t $1 +o41 i50 i62 o70 +o0v $1 $0 $1 +^6 ^0 ^4 o30 r +^1 ss4 i23 +$i $2 $1 +i31 i49 ,5 $2 +i2e o3c +l o76 +$j $7 +o3T +o4o o5r +$n $1 $3 +i31 i49 i55 o66 +o0y o51 +o3n $e +i21 i31 i40 o54 +o82 ss0 $0 $7 +l $g $u $r $l +$0 $2 $2 $2 +$0 $5 $3 $0 +i51 o60 i71 ,8 +l o91 oA4 +o0g o6o +l $1 $1 $1 $9 +sl2 $0 $0 $8 +l i71 o80 +o41 ss2 $2 +l $5 $4 $3 $2 $1 +^j $o +o4o $6 $9 +o4a $9 $1 +sy5 $8 +ss0 $9 $0 $9 +o41 ss2 $0 +o0r $4 $4 +o2u o3r +i21 i30 i43 o50 +o2r $1 $2 $3 $4 +D1 $1 $1 $2 $8 +^1 ^1 ^1 ^9 r +i32 i41 i52 o63 +i3c o5i +$4 $7 $9 +^1 o6a +i71 o82 $3 $4 +i39 R4 +^j i2a +[ i2o r +i21 i38 i41 o58 +o0o $e +o2i o3l +o4o i50 o67 +i2r i31 i42 o53 +$7 $4 $2 +o65 $7 +o61 i79 i86 R9 +^_ ^0 ^8 r +$s $1 $1 +o0p i4i +^1 ^4 o2_ r +,4 $0 $6 +o1m $1 $9 $9 $1 +i5o o67 +o2n $0 $1 +ss1 i14 i23 +i1r D4 +o31 i49 i57 ,6 +o0r $! +^1 ,2 r +o0m o61 +sL1 $2 $3 +so0 $z +sl0 $8 +o52 i60 o71 +^d $1 $3 +se9 ,7 +i3g i4u +i53 i62 o70 +^0 ^4 ^0 ^4 r +o0w $1 $6 +o6n $1 +o2u ,4 +^1 ^2 ^0 ^9 o40 +$4 $4 r +i41 i55 o66 +o31 o48 +$i $8 $8 +i49 i52 o60 +l o77 o80 +i61 o79 i86 R9 +i53 se2 o71 +i51 o60 ss0 $0 +o1u i2m +^1 ^7 o26 r +o2v $2 +o0a o5z +$7 $5 $4 +^0 ^5 ^0 ^8 r +l o55 o60 +o1e o6i +^8 ^6 ^5 o33 +i1e i2b +o5m o6e +l o51 i69 i79 o88 +o31 $1 $1 +l i82 o90 iA0 oB6 +^5 ^1 ^8 o32 r +i3i $l +o48 $2 +i44 i52 o63 +o3i o5y +o3i $9 $7 +i41 ss0 $0 $0 +l o61 i79 i87 o96 +l i64 o7m o8e +i2e $l +i51 i69 o76 o84 +l i51 o69 i79 o88 +$1 $4 $2 $7 +o6B +l $* $* $* +^1 ^5 ^5 r +$1 $4 $2 $6 +o30 o41 +l o82 i90 iA0 oB6 +i21 i39 i49 o51 r +o0e $1 $8 +o81 i99 iA9 oB4 +i52 ss0 $0 +i3_ i41 o53 +o5y $0 $9 +o1m $2 $1 +i3u i4l +i72 o81 o94 +l o83 +o0u i1o r +o0m $1 $9 $8 $7 +$2 $7 $0 $9 +o4e o6o +i3u i4n +o3o o4a +o1r o2o +^i $i +i51 o69 i76 o88 +i25 i30 i45 o50 +o5y $8 $8 +o1m $2 $0 $0 $0 +o2i i3y +D5 $1 $0 +o0e $1 $0 +i37 i48 o57 +i42 i52 i61 ,7 +l i69 o75 +o1u o2n +ss1 $0 $0 $9 +l o54 ss2 $0 +$4 $6 $0 +o51 ss0 $0 $0 +ss1 $0 $0 $8 +o0w $y +o55 i61 o73 +$D $1 +i60 i70 R8 +l $p $a +o4e $3 +i31 o42 $3 $4 $5 $6 +$_ $1 $9 $9 $5 +o2p i3u +i1m o2i +l i61 o79 i87 o96 ++6 ] +$0 $1 $4 $7 +l i51 o69 i78 o81 +i7o o81 +o82 i90 ss0 $7 +i55 o61 o73 +$3 $0 $1 $1 +i24 i35 i46 o57 +D1 o5u +^3 ^0 ^3 o30 r +o4y i59 o60 +i4r ,6 +i3i $1 $3 +o0k $4 $1 +i6n o71 +o3z i42 o51 +i43 ss1 $1 +i4i i61 o76 +o51 i69 i76 o84 +l $1 $5 $3 +l i51 i69 o78 o81 +l $s $1 $2 +o1i $m +^a o1z r +$2 $6 $0 $9 +se3 ,7 +i3z i4e +ss0 $2 $0 $2 +D2 $6 $6 +ss5 $2 $8 +ss9 $2 $7 +l ss0 $2 +o4A $1 +.2 o5l +$5 $7 $7 +o0k $4 $7 +ss3 $3 $4 +o54 i62 o73 +$y $1 $9 $8 $9 +o0n i3a r +o2k $1 $8 +^2 ^2 o25 r +sG1 i1g +^2 ^1 o23 i34 i45 i56 +o0d $0 +o3o o4z +o50 ss0 $3 +o0k i3s +i42 i53 o62 +^9 ^8 ^4 R3 r +i4r o6y +l ss0 $3 +o0g o5u +o0j $3 $7 +o1d D2 +o0d $9 $3 +l o57 o62 +l $_ $0 $9 +i41 o52 i61 o73 +i62 i74 o86 +i4a o51 ,6 +i12 i21 i32 i41 i52 o61 +[ $3 $7 +o1i ] r +o0c o2u +i81 o99 iA9 oB4 +o5y o6. +i2s i4i +i1h $2 $5 +$8 $8 $0 +i2n o3y +D2 $7 $8 +i31 i49 o57 ,6 +^2 o1n r +D2 $6 $1 $9 +i21 i32 i40 o53 +^e ^n r +i4e o55 +o1a $2 $0 $0 $8 +o1r i2y +o1i $2 $0 $0 $5 +$* $2 +o51 i60 i72 o80 +o41 $2 $3 $4 $5 +i31 st2 $3 $4 $5 +l i82 i90 ,A oB6 +o84 o93 +l i51 i69 ,7 o88 +se1 i61 ,7 +^0 ^0 ^0 o35 r +o5z $1 $3 +o1e i2t +o57 $9 +$r $3 +$1 $7 $1 $9 +i1r o5i +$y $7 $7 $7 +i31 i42 i53 st4 $5 +o2c $2 $2 +o43 ss0 $5 +i3e o4k +o0s $9 $2 +i39 i41 R5 +o1s D2 +$a $6 $6 $6 +l $i $i +D2 o4m +o5e i60 o71 +o3z ,4 $1 +sY1 $2 $3 $4 +o93 ,A +^e ^f +sy1 $9 $7 $6 +st8 $9 +l $0 $2 $0 $5 +^s D3 +so1 $1 +^1 ^0 ^2 o32 +ss4 $0 $7 +$9 $8 $2 +i2h o4i r +^j o51 +o2a $2 $4 +i33 o45 +^4 ^2 ^1 +o2l o5o +o57 $6 +i31 i42 st3 $4 $5 +i1l o4i +i51 o69 i76 o84 +$4 $8 $3 +i51 i69 o76 o88 +i81 i99 ,A oB4 +i1u i2t +i57 i62 o71 +i1i .3 +o2g o3a +ss1 $4 $0 +i37 i40 ,5 +i3m o4a r +^s $i +o1u $2 $0 +D6 ] +o0y o5o +i6d o7a +o1a o5b +o0b o4o +o0d $3 $4 +$a $5 $5 +o0j $1 $1 $2 $2 +o3y ,4 +D1 ,1 +$2 $@ +ss6 $2 $2 +i3z o41 ss2 $3 +o2f $1 +o51 i60 ss0 $0 +o0s $5 $5 +o0w i1u +o4r i5a +o2e $1 $4 +i3a i42 i50 i60 o75 +o0d $3 $1 +o0a i1y +i3j i4e +i1c o2h +o4c i5h o6a +o2B +i3l o4u +,2 $5 +ss4 $0 $1 +i2u o3r +o0r $8 $6 +i57 ss1 $1 +^3 ^3 o23 ++3 $0 $8 +^3 ^2 ^1 i81 i92 oA3 +i41 o50 i62 o70 +$z $9 ++0 $2 $0 $0 $8 +o0c $8 $7 +^o o2o r +o3z $9 $2 +o0s $1 $0 $1 +$y $2 $0 $0 $4 +l o51 i69 i78 o81 +i11 i24 i37 i42 i55 o68 +o4a $2 $0 $0 $8 +sY1 $0 +o0c o3o +l ,1 +o0k o2n +o3z $0 $0 $7 +,2 i3m +i3! ,4 +^2 ^9 o21 r +i1l i2e +o1e i4u +l $1 $8 $9 +-2 $1 $3 +sK1 i1k +o0v $8 +i36 i41 o53 +l o1c +l i59 o61 +i21 i30 i41 o58 ++3 $1 $1 +o4i o58 +i31 i49 ss9 $8 +^8 ^0 ^9 o30 r +^1 ^4 ^3 ^2 r +,1 $1 $2 $3 $4 $5 +$2 $2 $0 $0 +o3k $1 $7 +o41 i52 i61 o73 +i41 i50 o62 o70 +o0r o5i +i3o i4m +^3 ^2 ^1 o34 i45 i56 +T1 T2 T3 +o3k $1 $4 +o3u $s +o2s $e +o2i $2 $7 +i41 i50 ss0 $0 +o3e o6a +D8 o8a +o3z $3 $4 +l sn0 $1 +o2s i31 o42 $3 +i5o o6l +i4_ o51 i62 o73 +o2k D5 +i45 o51 i65 o70 +i1e o4z +$2 $1 $1 $5 +i42 ,5 o63 +$p $3 +^1 +1 r +i2e ,4 +i41 i59 i66 o71 +^f $1 $2 $3 +i60 i71 o82 +i44 i50 o64 +l $o $n +o0a $6 +i5o o63 +,3 $0 $0 +o0c $9 $9 +o36 $6 $6 +i46 i52 o63 +l $j $r $1 +o3n D5 +o4y i53 o61 +i5a i61 o73 +o0j $4 $8 +$k $7 +o1o o4k +i41 o59 ss7 $1 +D1 o4l +[ $1 $9 $7 $5 +i31 i49 ,5 $4 +o3a i41 o52 +i5a i61 o70 +o0o i1j r +i1e i4a +i4i o58 +$1 $9 $4 $0 +o3p o4o +l o69 i79 ,8 +i2e o3b +i3v r +o2i $0 $3 +D2 $1 $9 $7 $8 +^3 ^0 ^1 +o0i ,1 r +i4e o5r +$6 $4 $6 $4 +i31 i46 i51 o66 +$6 $6 $6 $9 +[ $6 $5 +o3z i40 o57 +i4u o5r +i5a se1 i72 o83 +o2s o31 $2 $3 +i31 ss9 $9 $8 +i23 i32 i43 o52 +$6 $7 $5 +o4y i51 i64 o73 +o0s i4e +i3o i42 o58 +o0f i4i +i21 i32 i43 o54 $5 $6 +$k $1 $1 +^x r +i51 sd2 $3 $4 +^5 ^9 ^3 ^5 ^7 o51 +i21 i31 i40 o59 +o0t $2 $9 +o1e o2t +o1a -3 +o0s i2y +o4_ i51 i62 o73 +i2k $e +o2i o5u +o0b i1u +i2o o5y +.0 i2e r +i5y i60 R7 +o0b $0 $0 +i67 o71 o84 +i32 i45 i51 o66 +i41 o50 ss0 $0 +i63 i71 o80 +^1 ^2 ^1 o34 +,5 $5 +o2h $1 +o4b o5y +o5i o6l +o0p $9 $9 +^2 ^3 o20 r +$1 $8 $9 $0 +l i64 o75 o86 +i2b i3y +i31 se9 $8 $5 +o1a o5a $1 +l $m $2 +o1u i2y +o0p $8 $7 +D1 $8 $2 +-2 o3e +i21 i39 i40 o54 +i2e i3m +l i69 ,7 ,8 +^s $7 +o0z $! +ss1 $* +o21 $2 $3 $4 $5 $6 +i2a o5y +$3 $0 $0 $9 +i53 i62 o74 +i41 o50 R6 +i31 o49 ss8 $3 +o0i $y +o0i i1m +o4i o5g +^k $1 $0 +i1h .4 +o42 o59 +^5 ^0 ^8 +^y ^t $1 ++3 ,4 +i3g i41 i52 o63 +o42 i52 o65 +i31 ss9 $8 $0 +$z $1 $4 $3 +o0m $1 $9 $9 $3 +^2 ^1 ^1 o31 +o3y i41 i50 o61 +i4o o5i +i51 ss9 $8 $3 +^5 ^2 ^0 o32 r +o81 i90 ,A +o1u i2l +o0t $3 $2 +sa1 $1 +l $. $c $o $m +i3z i40 ,5 +D1 $4 $3 $2 $1 +sh1 $2 +l i5a o61 +i2i o4z +o2u $2 $3 +i3z r +l so0 +i4e o5j r +i41 i50 i60 o72 +o4s o5a r +i84 o92 oA0 +o2n $1 $4 +i31 o49 i57 o68 +oA2 +^~ o7~ +D3 $2 $0 $0 $9 +i4y se0 o66 +i21 i32 o43 $4 $5 $6 +^3 ^3 ^3 ^3 o43 +o41 $1 $1 +o5y $2 $4 +o3i i4r +i32 i40 ,5 $5 +l i70 o81 +i44 i52 o67 +o3v $1 $2 +$r $z +i3i i42 o59 +^7 ^2 ^7 o32 r +o3a o4s +o3y i4l +o0r $6 $6 $6 +^a o4u +o2i o5e +o0l o1i $1 +i81 o90 ,A +i3a D6 +o0w $1 $0 +^8 ^5 ^2 r +l i69 o70 +i1m $a +o1a $0 $0 +^2 ^3 ^2 o33 r +D5 $1 $5 +o41 ss9 $7 $1 +^y ^a +l o61 ss9 $8 $6 +l o61 i79 i87 R9 +o3t i4h +l i61 o79 ss8 $6 +o6d $1 +D1 $2 $3 $4 +o2s i31 i42 o53 +^e l $1 +o4e $7 +l o56 o64 +o0h o3a +i3o i47 ,5 +o4x $3 +i31 i49 o58 $9 +$7 $7 $7 r +o3a $4 $4 +o0d o2i +o51 ss2 $7 +i5z o63 +i31 i49 o58 $7 +i44 o5y i6o o7u +^h $1 $2 $3 +o6j $o +o41 ss0 $0 $0 +o0n .2 +i71 i89 i98 oA7 +o2t i3t +l i46 i56 ,6 +se9 $2 +sr7 $6 +o2d $e +^3 ^4 ^1 o6i +^0 ^1 ^0 ^4 r +l i6b o7o ,8 +i41 o50 $0 +i3s i4e +o4e .5 +o0s $2 $6 +[ i5e +l o54 i65 o76 +o99 oA2 +^7 ^6 ^9 ^1 +$6 $3 $4 +^6 ^9 ^1 o35 +i12 i24 i36 i48 i51 o60 +o4g $2 +o4o $1 $7 +o4a i51 i62 i73 o84 +i39 i42 o55 +o31 i49 ss8 $3 +i2c i3e +o0p $0 $5 +^2 ^1 ^0 o33 +o1y $1 $6 +D4 $a $1 +^0 ^6 ^0 ^7 r +o1r $1 $3 +o0d i5i +$5 $3 $8 +o1m $1 $1 +i5a i61 o72 o83 +o6; +o3s o5i +o31 i49 i57 o68 +l i51 i62 i73 o84 +i3e i4n +i1e o5y +o1s $1 $2 $3 $4 $5 +i3a i41 i59 i69 o71 +o54 i62 o71 +i4y i56 R6 +o32 ss3 $4 +o54 i61 o72 +$8 $1 $8 $1 +l $j $e +o5z i60 o71 +o4a i57 ,6 +sy1 $1 $1 $1 +o2h o5i +D1 $1 $0 $1 $5 +o0m i5a +$c $2 +i44 o5y o6o $u +i31 i49 o57 o68 +o0b $9 $4 +i51 o60 i72 o80 +i3a i41 i59 i69 o75 +o0n i3i r +[ o5o r +o54 i61 o75 +^0 ^9 ^0 ^9 r +i1i o51 +o2e o6l +^J $1 +i51 o62 i71 o83 +D1 $9 $2 +i66 i79 i86 R9 +i32 i44 o58 ++0 o3a +D4 o4s +^0 ^6 o21 r +i41 ,5 $1 +o31 $9 $9 $2 ++0 $6 +^8 ^1 ^6 r +i5y i68 ,7 +R7 $0 +i87 o95 +o0z o2k +o0r $u +o0d $9 $6 +o0p $7 $7 +^9 ^2 ^8 r +D3 D6 +i2s i3u +l o1w +^3 o1k +D1 $9 $6 +i3o i40 R5 +i51 i69 ss8 $3 +i1h $2 $8 +o0t i4e +i5m o6e +i2t o5o +ss9 $0 $8 +i4y i5d ,7 +^1 ^2 ^3 D6 r +o0d $8 $2 +o0k o3h +sg1 $6 +o5y D6 +o0v o3o +o3o $2 $0 $0 $6 +o39 ss1 $1 +i4n i5i +,4 ,5 $1 +o0l o4o +o42 i52 o63 +$s $2 $3 +^9 ^2 ^1 r +D3 $5 $6 +o45 i51 i65 o70 +l o77 +^2 ^7 o22 r +o41 i59 ss7 $1 +$s $2 $2 +^z ^m T2 +l i68 o76 +l i61 i79 o87 o96 +ss0 $2 $2 +o41 i50 ss0 $0 +i3b ] +l i6t +o5o i62 o73 +o0y i2h +o0r $1 $9 $9 $2 +o54 i62 ,7 +i54 o61 o75 +i41 o50 o67 +D3 o3w +o41 i50 R6 +o5s o6o +o0n o4u r +o0d $4 $2 $0 +so0 $4 +D2 $r +st0 $2 +o62 i71 ,8 +i40 i55 i60 o75 +^_ ^2 ^3 r +i31 i40 i50 o69 +o2a $2 $2 +i54 o61 o72 +o2y o3d +o4i R5 +[ o4z +i39 i41 o54 +o0z $1 $9 $9 $0 +i2j o4a +i31 i49 i50 o65 +ss2 $5 $2 $1 +i90 oA5 +i3n $o +o3h $e +o0l $1 $9 $9 $4 +o67 i71 o84 +o6# o72 +^k +1 +$1 $1 $9 $3 +i4y se2 o61 +o0a D5 r +o52 i60 ,7 $4 +o1y i2d +l i54 o65 o76 +i1u i2j +i45 i51 o65 o70 +D1 $3 $1 +o3i $1 $9 $8 $7 +^2 ^1 ^2 +^7 ^8 ^9 ^1 T4 +o0z o1y r +i6z o72 +o41 i50 o67 +i42 i58 o61 +o1l $1 $4 $3 +o31 ss9 $8 $3 +l i56 o69 +o91 $2 $3 +$y $y $y +ss6 $2 $7 +o4i $1 $1 +l i59 o65 +i2a ,4 +^1 ^2 ^3 $a r +o1o o2m +o0z o3h r +o1u $2 $7 +o01 i12 i23 i34 i45 i56 +i4c i5h o6a +i4_ i51 o62 o73 +o1i $9 $1 +.0 o4o r +i6n o7e +l o61 i79 ss8 $6 +sr1 $9 $9 $6 +o65 i70 ,8 +^0 ^3 T2 +^d $2 $1 +o0p i2r +l i59 o61 ,7 +^s o1c +o01 i12 i23 i34 +o5c i6h o7a +o0j $1 $9 $7 $0 +i71 i89 i98 RA +i41 ss1 $7 ++0 i1u +$k $i $m +i34 se2 $0 +i61 i71 o83 +i38 i42 o55 +i32 i45 i58 o60 +^1 ^6 ^7 r +l i61 o79 i87 R9 +o5y i60 R7 +^4 ^4 ^4 ^4 +-0 i2i +,2 $3 +sd4 $7 +o3z i40 o58 +o3w $1 +o3k o4a r +i1k $1 +o51 i69 i76 o87 +i35 i43 o51 +.2 o51 +o5l i6o o7u +i1u i2z +o0j $1 $9 $7 $1 +i31 i49 ss8 $0 +$1 $3 $4 $5 +sd6 $9 $6 $9 +,2 i3o +l o75 o84 +R5 o66 +o0z $6 +i6d +l o76 o84 +o0q i2e +i2n ,5 +i21 i30 i41 R5 +^4 ^1 ^6 r +i4i o6n +o57 i62 o77 +i31 i49 se8 $5 +i36 i41 o50 +o3y o41 $5 +^5 ^2 ^2 +l o1d +i2v $1 +o1e $0 $0 $7 +l $0 $4 $0 $4 +i42 ,5 o65 +sy2 $1 $3 +D3 i4n +o4y sr1 $1 +^0 o14 +o1j $7 $7 $7 +o0s o2y +sr5 $4 +^6 ^9 $9 $6 r +o2e $3 +i52 o60 sS0 $6 +sR1 $2 +o32 i40 ss0 $2 +[ $1 $1 $2 +i41 i59 i65 R7 +o0z $9 $0 +l o86 ,9 +o3y $9 $9 +i30 i47 i51 ,6 +l o62 i70 ,8 $6 +^n $o +$s $0 $1 +o3t $2 +i4y o51 o63 +l i55 ,6 ,7 +$2 $8 $8 $2 +^4 ^2 ^5 r +[ i4h r +i31 i48 o51 +l o64 i7m o8e +^4 o1j +i53 o61 o77 +-1 $1 $2 $3 $4 +$f $1 $2 $3 +D1 $4 $5 +ss_ $0 $9 +i52 i60 ,7 $0 +$5 $9 $3 +o0l $9 $6 +l o2y r +l $b $o $o $1 +o1c $2 $0 $0 $8 +o5l $l +i32 sd0 $0 $6 +D3 o3f +i61 o7. +^q o1u $1 +i61 i79 i86 R9 +i4y ss1 $1 +i2r ,3 +o3h o4y +o0c $9 $5 +i4y ss0 $7 +i51 sy2 $3 $4 +o5l $o +i5y i61 o78 +o0i $1 $4 +o4a $9 $9 +o0j $2 $3 $4 +o4g $h +o0k $1 $2 $5 +^1 ^4 ^3 D4 r +o91 $3 +l o91 oA0 +i41 ,5 i62 o73 +i31 i48 o59 +^e o2e +l $9 $1 $7 +D3 $7 $7 $7 +[ $4 $7 +o71 ss2 $3 $4 $5 +i4y i51 se0 o71 +$1 $0 $8 $5 +o3v $1 $2 $3 +i3b i4e +o5a $0 $1 +o0c $9 $0 +o4o $! +i61 i73 o82 +o0i i4h r +^1 i22 o43 +i4y se1 i60 o71 +l $a $m $o $r +i4e o5t +-3 i4e +o6` +o3l $2 +o52 i61 o77 +o2d o3e +o48 $3 +i31 st0 $1 +o0b i2u +o6z o72 +$7 $7 $4 +o0k $7 $0 +o5a $6 +i51 i62 sd3 $4 +o3t $1 $2 +o0m o2i ++3 $e +^4 ^3 ^2 o35 +o4i o5t o6a +D2 o4a r +sr5 $5 $5 +o1l $1 $9 $8 $2 +^o $e r +o6j o7o +i32 i40 st0 $8 +D3 +5 +o4b i5o o6y +i67 o71 o83 +$z $6 +i2b i3u +^1 ^0 o28 r +^s $1 $3 +o1j $4 $2 $0 +o2n $2 $1 +i41 o59 ss6 $7 +o2k o3y +o3A $A +i2r o3k +i1l o4a +o4o .5 +ss2 $5 $3 +o2i $! +o41 ss0 $3 +o3o $5 $5 +l o62 ss0 $0 $1 +o0s o6o +^a o2o r +$e $t +o0j $1 $9 $6 $9 +o2n $0 $7 +o51 ss4 $7 +o1A $1 +$v $1 $2 $3 +,2 D5 +o4y $x +l i52 i60 i70 o88 +^0 l $0 +i4i i5n +o0t $9 $4 +o2n o4i +o41 ss9 $6 $7 +o4z $1 $5 +^2 ^2 ^1 ^2 r +i3i o4q +^1 ^2 o26 r +^a ^k $a +i41 i51 o62 o73 +i41 i51 i61 o76 +o0t $2 $0 $0 $8 +o2i o6l +^1 ^2 ^1 o37 +o0j o41 +^2 ^5 ^2 ^3 r +o84 o90 +^i D4 r +^9 ^8 ^7 ^6 ^5 ^4 ^3 ^2 ^1 DA +o2f o3i +o61 i79 ss7 $8 +sk1 $2 $3 $4 $5 $6 +.0 $1 $2 $3 $4 +i61 o79 ss7 $8 +^a $2 $3 +^j o2y +o2t o4a +i68 ss8 $8 +ss2 $6 $9 +o42 ss0 $9 +$i $4 +i4u o5m +o0c o3e +i4d ,6 +o0v D2 +^2 ^8 ^2 ^8 r +o1p r +^4 ^9 ^9 ^1 D5 +o0v i1o +o4r o5z +i3a $z +i32 st0 $0 $8 +o1e $1 $9 $8 $9 +l o59 i61 ,7 +$3 $0 $0 $7 +i4a i5n +i92 iA0 ,B oC7 +,1 $1 $3 +$o $2 $5 +sh1 $2 $3 $4 +o4a $. +o2n $1 $6 +o0z i4a r +o3b $2 ++0 i2e +o0o i4a r +o1u o2e +ss4 $l $i $f $e +l o55 i65 ,7 +sk1 $9 $9 $2 +^2 ^3 ^3 r +o52 i61 i72 o81 +o63 i71 o80 +^3 ^2 ^1 o5z +o1y $2 $0 $0 $8 +o0c $3 $1 +l o61 ss9 $8 $7 +o52 i60 sS0 $6 +i46 i51 o66 +,5 $1 $2 $3 +l o44 +o0e $1 $7 +^7 ^8 ^9 +l i61 o79 ss8 $7 +$1 $8 $8 $1 +o3w D4 +i2n $2 $2 +i71 o82 i93 ss4 $5 +i61 o72 ,8 +-0 $3 $3 +i41 ss2 $2 +o3h i4o +o1y i2e +i51 o69 i76 o87 +l $0 $7 $1 $1 +o3b o5a +o3i i4y +i21 i32 i42 ,5 +i4p o5i +i3a i4h r +^0 ^0 ^0 ^0 +sy6 $1 +^2 ^4 o25 r +o1m $2 $0 $0 $4 +o41 i51 i62 o73 +$9 $1 $6 r +l o64 i75 o86 +,2 $u +^t $1 $3 +o5e i61 o72 +i4_ i52 o61 +^0 ^1 ^4 o32 r +o61 ss9 $7 $8 +o1h $2 $1 +o4y $9 $4 +$3 $. +$a $9 $6 +R4 $6 +o1m $2 $0 $0 $9 +ss6 $0 $1 +o5G +$5 $5 $8 +o4i $t $a +i71 i89 i98 oA5 +o4o i58 ,6 +i2d i3o +i63 o71 o80 +i61 i79 o87 o93 +ss6 $0 $2 +^o ^f +ss8 $2 $5 +^1 ^2 ^3 o6j r +$7 $9 $7 +o78 $4 +o72 o80 $0 $8 +o4y i59 o61 +o0m o3e +^1 ^9 ^5 ^0 r +sE1 $2 +o5d ] +i2u $y +ss8 $2 $7 +$4 $4 $3 +$4 $3 $3 +l $7 $2 $8 +o0w D3 +i54 i63 i72 o81 +l -1 +$w r +o6r o7a +^x o1y +i61 ss8 $2 +o4o i57 ,6 +$/ $1 +o5r $a +o1a $j +^8 ^8 ^9 ^1 T4 +o07 i11 r +$a $2 $0 $0 $5 +$4 $7 $4 +o0c $1 $2 $3 $4 $5 +o1a $3 $3 +i51 i62 sy3 $4 +i3h o5i +i3t ,4 +i3u o4n +o1e $9 $5 +i1h o5y +R7 o81 +^1 ^2 ^3 ^5 r +^t ^t +o3a o6i +l i61 i70 o81 +o1l $a +st2 $0 $0 $2 +$1 $4 $1 $3 +l i62 o70 ,8 $6 +D3 $1 $9 $8 $7 ++0 $0 $3 +o0z i1a r +$0 $3 $0 +o0z i2i r +o46 ,5 $6 +st4 $5 $6 +o43 ss1 $1 +o72 i80 ,9 $8 +o0e $2 +o1i $6 $6 $6 +o2c $0 $7 +i31 i41 i51 o66 +^c ^m T2 +o1a $b +o2k $0 $6 +^9 ^1 ^0 o30 r +^i D2 +o1h $1 $1 +i3e o4t +o5T o6A +l o5p o61 +o0w o1o +ss1 $1 $1 $0 +o3y $1 $4 $3 +^a i2u r +D1 $9 $1 +.2 $8 +o90 ,A +o3o $1 $4 $3 +o5r o6u +[ i1a r +i71 o82 ss3 $4 $5 +o0j o55 +l o62 i70 ss0 $1 +^1 o5i +^m o1y i2j +-3 $2 $3 +o0r D4 +l $3 $0 $1 +i3i i48 o54 +.0 $2 $2 +i33 i42 o58 +i34 i45 i56 o67 +o61 i79 i87 o93 +o4l $y +o0j $o $1 +i42 i55 i62 o74 +i3y o4k +^2 ^1 o25 r +o1u i3y +o3p $a +i52 i61 o72 o81 +o53 i61 o77 +i2i i4o +D2 o5k r +i37 i44 o51 +o4a $2 $6 +^z i3h r +i61 o79 i87 o93 +$z $u +$2 $3 $8 $8 +^1 ^3 ^7 r +^i $1 $3 +i1o $1 $2 $3 +^o o4u r +$1 $0 $. +o0k $5 $8 +$1 $6 $1 $9 +i1h $3 +i31 i49 i55 R6 +$3 $9 $7 +$4 $9 $9 +i62 o71 o85 +i2b o4i +i50 o61 o70 +.0 .4 +^h ^t +i5a R6 +o1o o2c +l i62 o70 ss0 $1 +i1y o2e +-0 $1 $2 $3 $4 $5 +sd2 $1 $3 +i69 i70 ,8 +D2 o4l +-0 $5 $5 +l i53 ,6 +l ss2 $0 $0 $7 +o0k o7a +o32 ss0 $0 $2 +o4a $9 $5 +i2e $1 $2 $3 +o67 i71 o83 +o56 i61 o73 +i3i $a r +o6x o73 +st0 $0 +i72 i80 i90 RA +o0k i1i o2m +$g $3 +o2j $1 $4 +o0r $9 $3 +$4 $8 $4 $8 +i39 i41 o58 +^_ ^y ^m +l $0 $3 $0 $4 +ss4 $0 $4 +i21 i36 i41 o56 +o3d i4y +i4z i52 o61 +o3a $2 $0 $0 $4 +.0 i3e r +se2 R6 +o3h D4 +i45 i53 o60 +o0h $! +sd1 $9 $9 $8 +D2 +5 +sy4 $6 +o6d $a +o3i o4y +l i49 o54 +o41 i59 ss6 $7 +o2d $1 $3 +i92 oA0 iB0 oC7 +o2J +sr0 $0 $1 +o0t i3u +se9 $1 $1 +i4y o50 o67 +o1a o5j +^2 ^1 o23 i34 +D2 i4n +o0v i2e +o71 i82 i93 ss4 $5 +l o61 i79 ss8 $7 +l i72 o81 +$ $1 $2 $3 +i51 o69 i76 o85 +o0d $1 $9 $9 $4 +$1 $6 $2 $4 +o52 sS0 $0 $6 +o3l $0 $7 +o6a D7 +l $2 $3 $1 $0 +^5 ^2 ^1 o32 r +o3a $1 $9 $9 $0 +l o74 o87 +o0a ,1 ++0 $2 $6 +o2e $1 $5 +o71 i82 ss3 $4 $5 +i74 i8m o9e +o0d $n +i1a o61 +o0d $1 $9 $9 $3 +[ o6i +l i61 i79 o87 R9 +i32 o40 ss0 $2 +o1y ] r +^2 ^7 ^2 ^7 r +i65 o70 ,8 +i2d o5i +o4i o5j r +,2 i3k +i1p $1 $2 $3 +^0 ^3 ^0 ^4 r +o0n o3y +o4u -5 +o3u $0 $5 +^0 o19 +-0 o5o +i71 i82 o93 ss4 $5 +-0 $1 $9 $9 $1 +i32 i40 sd0 $6 +i3y ss1 $2 $3 +i40 i54 i62 o70 +o51 i69 i76 o85 +i1u o2g +i4_ i51 ,6 +^1 o1w +^e D3 +i2p o3e +o2y $6 $9 +o5i $l +^n o5a +o0g $9 $9 +o5l o6o $u +.1 $3 $3 $3 +o3k $y +i2r o4z +i21 ,3 +l i68 o73 ++2 $e +o5a ss1 $2 +o0z o5a r +^2 ^0 ^8 r +i2o o6a +R8 $9 +o2i $a $1 +i4y ss0 $1 +sr5 $0 +i4a i59 o63 +i5a i60 o77 +l $0 $2 $0 $3 +i51 i62 i71 o84 +o3a $6 $6 $6 +l i49 o56 +i2y o5y +l o71 ss0 $0 +o0i o5h r +l $0 $4 $0 $6 +$0 $4 $4 +o3z o41 +^2 ^0 ^1 o30 +i3y i49 o50 +o0n o2j r +o6e $e +o40 ss0 $0 $0 +o2y $2 $1 +o3k o4y +-0 $2 $0 $0 $5 +l $1 $9 $5 $0 +l o71 i89 ss9 $2 +i3i i48 R5 +^0 ^0 ^1 R3 r +i2a $1 $2 +i35 i41 o52 +o1e $j +i32 i46 ,5 +D3 i4m +ss2 $3 $7 +i56 o61 o73 +o72 i81 o94 +l $_ $1 $9 +i31 sd0 $1 +o3b $i +^0 ^4 ^0 ^8 r +^0 ^0 ^8 o31 r +i3i o52 +o3n $y +D3 o5b +o1o i3s +o4s o5e +o5a -6 +i4e o5i +o0j i51 o68 +o1u $8 +o4y $8 $7 +^8 ^6 ^9 ^1 +l i71 o89 ss9 $2 +i4o i50 o68 +,3 $2 $7 +$9 $! +o0t $3 $1 +^1 ^1 ^4 +l $5 $1 $8 +l i52 o67 +o0c i1h o2e +i2r $n +i41 i55 ,6 +l $5 $1 $9 +$2 $9 $0 $5 +o0k o55 +l o61 i79 i87 ,9 +l $f $c +o5y o61 $2 $3 +o2e i3z +o2$ +i50 o61 o74 +o41 i52 i62 o74 +^0 ^2 ^0 ^3 r +o0n $e r +i2g ,3 +o66 $8 +o4* ,5 +D2 o5j +^u o1o r +l $1 $3 $8 +i30 i41 o58 +^0 ^0 ^1 o34 +D4 $7 $7 +o0j $m +i4- o51 +l o63 ss3 $3 +i3z i49 o54 +sk1 $3 +o0f D4 +i2e o5l +l $5 $2 $6 +l $n $o +i3i ,6 +o0j i3i $1 +^k $1 $4 +^4 ^2 ^6 r +^3 ^1 o22 r +o4a $1 $2 $3 $4 +o3z i4a ,5 +i51 i65 R7 +o4G +o77 $8 +^8 o19 +sy5 $9 +l o91 oA6 +o0k o4i $1 +o51 i69 ss7 $3 +o2l o4i +o5y i62 o75 +o3n i4e +i63 i71 o88 +o08 i10 r +i49 i50 o69 +o2z $1 $9 $9 $2 +l $n $i +^h o1a r +i51 i62 se3 i84 o95 +o2y $1 $8 +i4a se1 o60 +^2 ^0 ^7 o32 r +i31 ss9 $7 $8 +[ $1 $9 $7 $9 +i1o i2d +$l $2 +o5a $4 +^0 ^9 o21 r +l $b $3 +i1g $1 $2 $3 +o4a o5w +o3d i4o +sy5 $3 +l i72 o83 +i1n $1 +o4z $0 $8 +l o63 ss2 $1 +.2 o4e +i91 oA2 $3 +l $0 $6 $0 $6 +^1 ^2 o2i r +^2 ^5 o23 r +i5t o6y +i1h i3r +D3 ] r +^1 ^8 o24 r +i1a i3a +o0a $0 $0 $7 +i3i $1 $1 +i31 i49 ss7 $8 +i4o i51 o65 +o98 oA7 +$9 $6 $5 +l $1 $1 $1 $5 +se1 i62 i73 i84 o95 +o1e $t +D1 $1 $2 $3 $1 +o2u i3l +^2 ^0 ^1 o33 +l $1 $1 $1 $7 +o1h $2 +l o52 i60 ss0 $9 +D5 $6 $9 +l o57 ss7 $7 +,5 $1 $1 +i32 i40 st0 $7 +i41 i52 ,6 o74 +o1e i3n +ss4 $5 $0 +i3z i44 ,5 +o2n $0 $6 +o2r $0 $5 +o0k $b +o6j o7o $e +o3o -4 +^7 ^9 ^1 o30 +i72 o89 +o1y o2e +$1 $7 $8 $8 +o1- +ss2 $5 $5 +o0j $3 $9 +$0 $0 $0 $0 $0 $0 +i40 ,5 ss0 $0 +o4z $2 $3 +i1i o2y +o0t o3e +$1 $4 $3 $6 +o1j $1 $9 $8 $5 +o0a o1k +,5 o65 +o51 i62 i71 o80 +^3 ^3 ^0 r +i70 ,8 $7 +D1 $2 $4 $6 $8 +l i71 i89 ,9 oA6 +i2s o3u +ss0 $5 $0 $5 ++0 o4o +l $8 $2 $9 +i3h o4e +i72 i81 o94 +[ $* +l o92 oA1 +l i52 o60 ss0 $9 +D6 o71 +D1 $1 $9 $7 $0 +i5a i62 ,7 +o51 ss5 $9 +o1u i2j +l $8 $2 $4 +i3j o51 +i72 i80 ,9 $6 +i42 i55 i63 o71 +.1 $1 $0 $1 +$7 $5 $5 +l i70 o86 +o0g $2 $0 $0 $6 +^n ] +i2p $a +o4z i52 o65 +o4b $i +i44 i5y o6o o7u +l o92 ,A +o4y o5k r +i51 i69 o76 o87 +i31 ss2 $1 +l $2 $5 $2 +sS8 $2 +^1 ^3 o29 r +i21 i32 i42 o50 +o1s $1 $9 $9 $1 +sl1 $6 +^# ^3 r +o61 ss8 $2 ++4 $u +i51 i69 o76 o85 +i32 i45 i51 o68 +D1 $1 $2 $2 $3 +o0v $8 $9 +o5H +o0x o1o r +i6# o72 +i32 st0 $0 $7 +l $0 $3 $0 $8 +^1 ^9 o29 r +i2o i4a +o61 o7. +o3y i4o +i41 o52 ss2 $1 +i34 $v $a +^u o4a r +*23 r +^a ^i ^t ++0 o4y +^7 ^1 ^7 r +$i $0 $6 +o4k i51 i62 o73 +o4y o5e +l o52 ss0 $0 $9 +^8 ^2 ^1 r +o0j $1 $2 $5 +o4# $1 +o42 o50 $0 $0 +i1i i2d +o4l $a r +i3z i40 o52 +i2a -3 +^o ^m ^e +l o81 i90 oA1 +o0j o4c +o46 i57 o68 +i2y i3u +^6 ^0 ^6 r +i2a o3d +o44 $2 +i5l o7y +,2 o5i +$6 $3 $9 +i52 o60 $0 $0 +D1 $6 $1 $9 +o2i -3 +o0z $3 $2 $1 +o4e o6i +^1 o1d r +o3y i4u +o40 i50 ss0 $0 +o1m $a +o3e $1 $0 +,2 $z +^j o1m +o5i $3 +l o56 o68 +i31 i41 i52 o69 +^5 ^3 ^1 +i51 i62 ss1 $2 +o5z i62 ,7 +i41 o52 o66 +i14 i24 i34 i44 i54 ,6 +o0w D5 +l i61 o79 i87 ,9 +o1y $1 $4 $3 +$e $1 $6 +i3i o5j +i5y o6. +^0 ^2 ^0 ^1 +$1 $3 $2 $9 +o51 ss9 $7 $3 +o53 $5 +o0t $9 $3 +$7 $3 $3 +o1a o2w +o45 $6 +$y $1 $9 $9 $1 +i3g i4o +o41 i52 ss2 $1 +o2e ,3 +^0 ^1 ^6 r +ss1 $2 $3 $. +o4u $r +o51 ss2 $8 +^i o2o +^3 ^0 ^4 r +o78 $5 +o61 i79 ss9 $8 +i41 o5. +o0r $3 $2 +$8 $6 $4 $2 r +l D5 r +sS7 $7 $7 +o0k o5m +i6x o73 +o1n $1 $2 $3 $4 +l o89 o97 +o0c o2y +$1 $8 $9 $1 +$8 $9 $3 +^0 ^3 ^0 ^5 r +o4b o5u +o0s $2 $0 $0 $5 +o1e $9 $3 +o52 o60 $0 $4 +l o71 ss9 $9 $2 +o1e $1 $9 $9 $1 +o3c i4e +o61 ss9 $9 $8 +D3 $7 $8 +sc0 i11 r +ss0 $2 $0 $3 +o3v D5 +i5j +D4 o52 +l $6 $2 $7 +l o7s +i43 o51 o68 +i2g o3e +i65 o79 +R7 o83 +i47 i51 o62 +i2t o3y +ss_ $3 +[ i4u r +D2 $4 $5 +o4z $7 +sy6 $1 $9 +i49 i51 o63 +^i D4 +^9 ^9 o21 r +o0x o1y r +i32 i45 i53 o67 +st2 $0 $0 $3 +i72 o80 $0 $6 +.3 $7 +i2d o4a +o3p $1 $2 $3 +i2U +o3e $0 $1 +o42 i50 ,6 $0 +st3 $2 $1 +o5b $o +i4y o5x +^0 ^0 ^5 R3 r +$3 $8 $2 +i20 i39 i49 o51 r +^6 ^5 ^4 ^3 ^2 ^1 D8 +o31 $9 $9 $4 +D1 $1 $1 $0 $5 +l o71 i89 i99 oA6 +^8 o78 +i3y o4c +i1i o5e +l i81 o90 oA1 +$2 $3 $! +^b o1h +i5y i62 o74 +o41 ss2 $2 $1 +-0 $0 $0 +i32 i43 o55 +i51 o60 i72 o84 +i5c o6h +i51 se2 i73 i84 o95 +-0 i1o +i51 o69 ss7 $3 +o51 i60 i72 o84 +$- $9 +o0x o1e r +o3e $1 $4 +l i69 o72 +o1e i2k +^1 $1 $2 +.2 $9 +o50 ss0 $8 +o1a i3j +^0 ^2 $0 $6 +[ $7 $8 $6 +o4o o5. +sn0 $9 +^8 ^1 ^0 r +o41 i50 i62 o71 +sn1 $9 +-2 $0 $7 +l $5 $1 $5 $0 +o0k i1m +o51 o62 $1 +o0e i1r +o1i $2 $6 +i4f o5u +i31 i42 sy3 $4 +i32 ss0 $0 $1 +i11 i24 i33 i41 i54 o63 +^m $2 +,2 $0 $6 +o43 i51 o68 +o62 i70 ,8 $5 +i1r $2 +l o71 o80 $1 +$a $8 $6 +o4y i50 ,6 +i51 i62 o71 o80 +o0h o5o +o1u $3 $3 +o1j D3 ++3 o6a +i32 i40 ss0 $1 +o50 i61 o74 +o5e $2 +^2 ^1 ^0 ^7 r +l $2 $0 $4 +.2 $8 $9 +o4a $0 $0 +^9 T1 r +l sn1 $0 +-4 o5a r +o3y o5a r +sy1 $1 $2 $2 +ss2 $5 $2 $2 +i3c o51 +o55 ss6 $7 +o5B o61 +i4z i52 o63 +o0m $1 $2 $3 $4 $5 +o1u $s +o2e $1 $8 +o5h o6a +o41 i52 o66 +i49 i50 R6 +o2c i4a +o1i $2 $9 +i51 ss2 $1 $2 +o4g ,5 +i47 o51 o64 +o4m o53 +o0m $1 $1 $1 +o0j o4r +o3e o5u +i41 o52 i62 o74 +i51 st2 $3 +o4c o5h +i61 i79 i86 o95 +^2 ^1 ^0 ^2 +o47 i51 o64 +l i51 o69 +i61 o79 ss9 $8 +i4i i60 o78 +o5a ,7 +l i33 +o1u o5l +o0g $1 $4 $3 +,2 i4i +i4m ,6 +i64 i73 i82 o91 +l ss0 $4 +o1a $2 $8 +l i59 o63 +^6 ^1 ^0 o32 r +i35 i41 o54 +o2i $l +i43 i50 o64 +o5a i60 o75 +^e ^m T2 +i42 i52 i61 o72 +$1 $6 $2 $6 +o0j $1 $2 $2 $1 +i42 i50 sd0 $7 +^o D3 +o4i $! +i62 o70 o82 +o70 $0 $7 +i4y i51 i62 i73 o84 +$2 $8 $2 $9 +o0m .1 +i4a se1 sr2 $3 +o0s i3o +i2k $i +i42 o50 ,6 $0 +^9 ^8 ^7 ^6 ^5 ^4 ^3 ^2 ^1 ] +o3g $e +D1 $2 $0 $1 $2 +o4z ss1 $2 +i3o i4c +D3 $i r +i46 o57 o68 +l i71 o89 i99 oA6 +o85 o92 +i3y i46 o59 +l i41 i59 i69 o74 +o2g $1 $1 +^1 $0 +i41 o50 i62 o71 +i61 i71 o85 +i3z o4a ,5 +$a $1 $4 $3 +o0q i2i +i51 i62 i72 o83 +i42 i53 ,6 +o64 ss1 $1 +o3b i4e +o3y $2 $0 $0 $8 +o0r i2o +^2 o1k r +$y $2 $0 $0 $5 +o0a o4o r +st1 $9 $8 $1 +i1h $1 $9 +o63 i70 o85 +sS7 $9 +i2o o3m +-1 D2 +i1o o2l +sy1 $2 $5 +i47 i54 o61 +o0g $9 $2 +$1 $2 $9 $2 +l i42 o59 +o53 ss6 $9 +^5 ^5 ^5 ^5 o45 r +i4o o58 +i42 sd0 $0 $7 +,2 i3b +o4u o5c +o2h ,5 +o0l o3e +i4h o5k r +$6 $9 $7 $7 +i63 o70 o85 +i1i o3j +o3o $8 $9 +i4e o5a +o0j o2o +o0j i1h o2e ++3 $1 $0 +i41 i50 o62 o71 +D3 i4k +l $0 $1 $7 +o1y $s +o1u $0 $3 +i51 i69 i76 R8 +,1 ,5 r +i3y i4n +o5o $u +sc3 i11 r +i3i i49 o52 +i6l +o3y o41 $1 +$2 $0 $2 $4 +^3 ^0 ^9 o32 r +l $0 $1 $0 $2 +l i51 o69 ss8 $9 +o0j $c +o2y i3c +$8 $4 $8 +i31 i49 o52 +^2 ^0 ^0 ^5 D5 r +^d $y +o1d $2 $0 $0 $8 +o61 i72 ss3 $4 $5 $6 +o3o $8 $7 +i1e i3n +i61 i72 ,8 o91 +o1i $8 $6 +^2 ^2 o26 r +^s o1y +o3h ,5 +o3n $2 $1 +o2a ] r +$- $2 $2 +,4 o5! +o1i i3z +i71 o89 i99 oA7 +o62 o70 $0 $5 +o1i $1 $4 $3 +o1u o2t +i4y o51 o66 +D4 i5a +o0z $9 $5 +o0c $8 $9 +i31 ss9 $7 $7 +^m o4i +^j .3 +D2 $8 $2 +o0c $9 $6 +$1 $1 $7 $9 +i61 i72 i83 o94 ss5 $6 +i52 i65 o78 +^1 ^1 ^1 ^5 r +[ $7 $1 +i42 i55 i63 ,7 +i26 i38 i49 o51 r +o1y -2 +D5 o5h +,4 $1 $5 +^1 ^3 T2 +i2u o5o +i53 o62 o70 +i31 o49 i57 R6 +$5 $6 $7 $8 $9 +.2 o4z +o5t o6o $1 +o40 i51 i62 o73 +o0i $1 $7 +sr8 $0 +$2 $9 $0 $1 +^j .4 +^t $1 $2 +o41 $9 $9 $2 +i3h o4y +$2 $1 $1 $9 +.1 ,5 +D3 o5h +,3 $1 $9 +i3a se1 $2 +o63 o72 $1 +i5a i62 o71 +^7 ^7 o21 r +,1 o2y r +i48 o51 o68 ++0 o51 +o9o +^t o1t +ss2 $8 $1 +o67 o79 +o71 o80 $0 +o44 ss4 $4 $4 +i46 i51 ,6 +o0j $5 $7 +l o77 ss7 $7 +o3o $2 $9 +o4t o5e +ss7 $3 $1 +i4z i50 o68 +o0m i2o +sb3 i11 r +$1 $3 $* +[ ,2 +$h $i $a +sg0 $9 +o0k i2y $1 +sS1 i12 i23 i3s +o1y o2u +o4j +5 +sd4 $m $e +i60 ,7 o88 +o0a $0 $2 +i3s o5o +o0k o58 ++6 $1 +i2r i4e +i61 o72 i83 i94 ss5 $6 +o42 i50 i62 o70 +.0 $o r +[ o0w +o0j $t +o4b $a r +o3u i4c +o0j o5t +i4m o53 +o1l o2i +i50 ,6 o76 +l o73 i82 o91 +si1 o73 +$8 $0 $8 $0 +i1r o4a +o0i $2 $2 +o3y $j +i21 i39 i45 ,5 +^7 ^2 ^6 r +o5a $2 $4 +o1i i2y +i38 i43 o50 +i31 i49 ss7 $7 +^2 ^1 sS3 i3s +^5 o14 i23 i32 i41 r +i38 o40 +o1e i3k +^0 ^7 ^0 ^7 r +i52 o60 ,7 $3 +^1 ^2 ^3 -4 r +o0z $7 $8 $6 +o0f $8 $8 +i1h $u +^4 ^0 ^7 o31 r +o0z o3o +i61 o72 ss3 $4 $5 $6 +D1 $1 $2 $3 $0 +i41 i51 i60 o72 +o5i o6n +o61 ss2 $3 $4 $5 $6 +i53 i61 o75 +i61 i79 i87 o91 +i31 se9 $8 $6 +i55 o60 o75 +o0z $8 $7 +D4 $2 $0 +o1u i2g +o1b $1 $2 +o41 i53 o62 +o0k $4 $8 +i61 i79 i87 o93 +o0e ,5 +i71 i81 o92 +ss0 $4 $2 $0 +i3m o5i +i41 i53 i63 o71 +o0l o2y +i40 o51 i62 o73 +o4_ o51 +o0f $1 $5 +o2i o3t +o1j $1 $9 $8 $2 +o2n $1 $8 +^1 ^2 ^3 o4t r +o2o $2 +o0b $9 $5 +D1 i2k +o0l $3 $1 +o61 i72 i83 ss4 $5 $6 +,2 $0 $8 +^0 ^9 o28 r +se8 $7 +o0x i1y +o3y i40 o56 +o0f $1 $0 +^. ^. ^. $. $. $. +l sn1 $1 +o1e o2c +^v $1 $2 $3 +i56 o60 ,7 ++3 ,5 +$r $a $e +sa1 $3 +o3u o51 +o2i i3n +o0k $5 $3 +i34 o45 $6 +^9 ^9 ^5 R3 r +l i82 i90 ,A oB8 +o57 ss8 $6 +l i61 i79 o87 ,9 +i21 i39 i46 o50 +i52 ss1 $4 +o51 i69 ,7 $1 +$1 $- +l $0 $7 $0 $9 +o0w $1 $8 +$# $1 $2 $3 +o49 $9 +o1y o2n +i4a i57 ,6 +D4 $1 $9 +i32 i45 i50 o66 +i1y $1 $2 $3 +o4e $4 +i3o o4c +D6 $o +o1e $5 $5 +o2m o5i +sS8 $6 +ss2 $2 $1 $2 +o0k $4 $6 +o4. i5. ,6 +o0i i3a r +i1e i2c +i31 i49 o57 R6 +$6 $3 $5 +o36 i41 R5 +o4q $u +o4y $m r +i35 se5 $5 +o0k i51 o64 +o0K $0 $7 +i4. ,5 ,6 +st3 $3 +st2 $8 +^1 ^0 ^1 T3 +o6o $2 +i2n i3u +o44 i54 ss4 $4 +l $1 $0 $0 $% +D1 $1 $9 $6 $8 +o1o $2 $5 +i3c i41 i52 o63 +D3 o4l +$8 $8 $4 +i41 ss2 $4 +i4a se2 o63 +i52 o63 o71 +o0j ,1 +i4a o50 o61 +o3u $a r +l $6 $2 $8 +.1 $2 $0 $0 $6 +o3a $j r +^s o2e +i5b ,6 +^1 ^0 o24 r +i40 i57 i60 o77 +o4i $t +$. $4 +o71 i89 i99 oA7 +o3z i41 ,5 +o3a $6 $6 +i1h o5o +o4i i5k o6a +l o51 ss9 $9 $6 +$4 $6 $1 +i4i o5n +^j i3i +i1r $1 $2 +o3y i4h r +i31 i40 i50 o68 +^e o1i +-3 $u +l o51 i69 ss8 $9 +o3a i4g +^3 ^2 ^8 r +o43 i51 o62 +$4 $2 $0 $6 $9 +o0i i4o r +o1o +2 +$5 $4 $9 +o2l D4 +o5n o6o +i3i i42 R5 +$1 $3 $8 $8 +sr7 $5 +^0 ^1 ^2 ^1 +i1I +o3x $1 +o1r $1 $9 $9 $4 +^4 ^4 ^4 ^4 o44 +.2 $0 $2 +l o48 +i4y se1 o67 +o0k i3k +o5p o6o +o0i o3a +se1 $9 $7 $7 +i51 i60 i71 o83 +i31 i41 i51 o68 +l o51 ss9 $8 $9 +^9 ^9 ^9 ^9 o49 +^1 ^9 ^8 r +l sn2 $1 +^5 ^2 ^9 r +$8 $9 $2 +i50 i60 o74 +o3e ,4 +o2y o3e +ss5 $5 $9 +l $1 $8 $1 $8 +.2 $1 $9 +i3a i41 i59 i69 o70 +,5 i61 o73 +ss1 $1 $1 $8 +i1a i2c +l i62 ,7 ,8 +i3o o4b +o0z $1 $9 $9 $1 +^1 ^2 D4 r +i1l $o +o3o $2 $0 $0 $8 +o2b $1 $2 $3 $4 +i42 i50 sd0 $8 +$_ $1 $9 $9 $2 +o0g $4 $5 +l o51 i69 ss9 $6 +o0e i2l +o54 o65 $6 +i51 i62 i72 o80 +sa1 $2 $3 $4 +i2k o3i r +i43 o51 o62 +i2v $a +o0a $z +D1 $1 $1 $2 +o41 i51 o63 +o0j $1 $1 $2 $8 +^m o5i +i2c $1 +l o62 i72 ,8 +o3k $2 $3 +i42 i50 o62 o70 +D1 $7 $7 $7 $7 +^- ^b +o4o $1 $8 +i62 i72 o84 +o0c $5 $5 +i51 se2 $3 +o0a $9 $9 +i4e o54 +o0a $e r +sb1 $2 $3 $4 +l o50 ss0 $1 +o4t i5o +^5 ^4 ^3 ^2 ^1 o5j +i3a o4p +o4o $c +o4n i5e +i3t r +i5e o6r +i34 i40 o54 +o55 i60 o75 +o5z o6! +^y ^m $y +$3 $9 $8 +.3 $1 $2 +i34 i40 o57 +D1 $1 $0 $3 $1 +o0i o1h r +o50 i60 o76 +.2 $2 $7 +o3o $9 $2 +^. T1 r +D2 o53 +i61 i72 o83 i94 ss5 $6 +i5o i61 i72 o83 +o0a D4 r +i5a i61 se2 o83 +i31 se0 $0 +$a $8 $5 +o0j $2 $5 $2 $5 +l $i $n +$4 $9 $5 +o0t i1t +o2i i51 i62 o73 +o4y i58 o65 +o1m $1 $1 $1 +i3i ss1 $2 +i43 ss0 $0 +i1u o51 +o48 i51 o68 +^c o1h o2e +i39 i41 o56 r +i51 o69 ,7 $1 +l i73 o82 o91 +i42 o50 i62 o70 +o0y $2 $0 $0 $8 +i40 ,5 o68 +i21 i39 i46 o51 +^a o3i +i62 o74 o86 +i41 i59 ,6 $2 +^1 sS2 i23 i3s +ss4 $u $2 +o4a i52 o66 +l ss1 $2 $3 $4 +o1e $a r +o31 $9 $8 $7 +i44 ,5 ss4 $4 +^3 ^8 ^6 ^5 +o3l $1 $3 +i43 ss0 $5 +i5d o6o +o0d o5z +o50 i61 o70 +i4k i5i +i61 i72 o83 ss4 $5 $6 +D1 $3 $4 +o0k i1i i2m +so0 $9 +o61 i72 i83 i94 ss5 $6 +o61 i72 i82 o91 +o0m i4o +o2l i3l +o37 $7 $7 +o3d $1 $1 +o0v $0 $4 +^o $e +l o5k o6u +o31 i49 i57 R6 +i61 o72 i83 ss4 $5 $6 +o2c $e +l o82 i90 iA0 oB8 +i35 i40 i50 ,6 +i3y i48 o57 +^3 ^4 o21 r +o4i $2 $2 +o0i o1m +$a $p +^1 ^5 ^7 r +o0h $1 $9 +^1 ^0 $0 $1 +^2 o1y r +i4y i50 o63 +i4y se2 o64 +l ,4 ,5 +l i64 o75 +D4 o6y +^4 ^3 ^2 r +o1o o2l +i1a o6o +^1 o3i +$2 $8 $0 $9 +^1 ^0 ^1 o32 +o1l ] +i31 sy2 $3 $4 +i3k ,5 +ss3 $0 $3 $0 +o1o $6 +i71 ss1 $1 +i2i $u +o2e $1 $6 +i61 i71 o80 +T2 T4 $1 +o0x D5 r +o3g $2 +D2 i4r +i4c o5h o6a +[ o0a r +l o6j o71 +o4z ss1 $3 +o3y o42 $3 +^$ ^$ r +o4o -5 +o0b o4i +o3u $2 +o0z ,2 +o0w $! +o0n i4h r +l i2v +i36 o41 R5 +l o64 o7m $e +o0l $5 $5 +D3 i5a o61 +i40 i51 o62 o73 +$2 $5 $4 $0 +^a $1 $1 +o0l $5 $6 +o60 ss0 $0 +^1 sf2 i23 +i4i i61 i70 o81 +o40 i50 o68 +i82 i90 iA0 oB6 +sy4 $1 $1 +^e ^d T2 +^a $1 $3 +i71 i89 ,9 oA7 +o0f o4o +^s o1k +i55 i60 o75 +sf1 i12 i23 +o2m i4a +o1e $r +l $0 $1 $0 $5 +$Z $Z +l $0 $5 $0 $5 +-0 o4o +i31 i49 se8 $6 +i41 ,5 o63 +i3o o5e +^2 ^2 ss2 $2 +i42 sd0 $0 $8 +$8 $4 $2 +i2c o4a +o0a $2 $8 +o3e o4y +o5h $a +i4a o5y o6a +oA1 oB3 +^b $2 $1 +o3c $0 $7 +$1 $0 $1 $! +ss2 $0 $1 $4 +o2u $0 $1 +$5 $8 $4 +l i51 o69 ss9 $6 +^2 ^4 ^2 o34 +i32 i44 R5 +i2o o3r +D3 $1 $9 $8 $9 +^1 $4 $u +$0 $8 $! +^y ^n r +i37 i41 o57 +i41 o53 o62 +o40 i50 o63 +ss4 $3 $2 $1 r +i31 i42 sd3 $4 $5 +o1d $1 $9 $9 $4 +i3y i40 o54 +^4 ^5 o23 i32 i41 r +$1 $9 $3 $3 +i31 i44 i53 i64 ,7 +o62 ss0 $0 +o1u o4t +,2 -3 +$8 $6 $8 +i32 sd0 $0 $8 +o1r $1 $0 $1 +.0 ] +o2z o4a r +,5 i61 ,7 +o4a i5y o6a +ss4 $5 $4 $5 +i2m i31 i42 o53 +^5 ^0 ^0 ^1 +o0p i2i +^5 ^1 ^4 r +o4y sr0 $7 +l $1 $9 $0 +i59 i60 R7 +i2p o3u +o3u i4r +o3k o6a +l ss5 $5 +i5a i61 o74 +o4z i50 o65 +i20 i39 i48 o57 +^a ^i ^m T3 +$o $. +o4w $1 +i31 i42 i53 sd4 $5 +o0a i1y r +i5y se1 o73 +$. $1 $6 +l o6< o73 +i36 i49 i59 o61 r +o58 i69 o70 +^t $o +i58 o69 o70 +se2 o75 +o41 i50 i60 o71 +^0 ^9 ^8 ^7 r +ss2 $k $8 +o4e o5j r +o0p $. +^1 l $3 +i3z ss2 $1 +i2z i31 i42 i53 i64 o75 +i41 i59 o68 $7 +$1 $0 $8 $6 +i4o i52 o67 +$1 $5 $5 $1 +i2e o3d +i5y o60 o71 +l $3 $3 $3 $3 +^9 ^8 ^5 R3 r +i3r $y +i21 i32 i40 o52 +i3i o4a r +i72 i80 ,9 oA1 +i1i $u ++3 $2 $2 +i31 i49 ,5 $1 +i42 i55 i63 o76 +o1e $a $1 +^5 ^4 o26 r +$7 $* +o56 i60 ,7 +i4o i52 o64 +i41 i54 ,6 ++2 $1 $3 +$j $3 +st5 $5 +l o91 oA7 +[ $4 $3 +o2i o3g +l $1 $1 $1 $8 +i3. i41 i52 o63 +l o62 o70 $0 $6 +o1j $2 $0 $0 $9 +i31 o49 ss9 $7 +o2r o5z +sk2 $0 $0 $8 +i2a i3m +^k $0 $1 +^a ^j o2y +i41 i59 o66 o73 +i72 i80 ss0 $5 +i1a i3l +o5o $l +^m $1 $2 +$6 $7 $9 +i51 i69 i76 o88 +o3y $h +^2 $z +i71 i89 o98 oA6 +^0 ^6 ^9 r +o0z $9 +o41 ss2 $4 +o92 oA6 +o4a $q +o0a D1 r +i68 o71 o88 +o2m o3o +o0i D4 r +o0d o4u +^6 o56 +^r ^i +i6@ o71 +$1 $6 $2 $5 +i72 o80 i91 oA0 +o4m $3 +,5 $6 +o0h $2 $0 +o4a $t +^_ ^1 +i4o o5e +^s $1 $1 +i3i i51 ,6 +o3G +i72 o80 i90 oA1 +D2 $3 $2 +o41 $9 $8 $7 +i4a o51 o64 +o1c $1 $3 +i40 o59 o68 +^3 ^0 ^4 o30 r +o4z $6 $9 +o0s o4y +o0s i2r +o2v $0 $7 +i32 i43 i50 o64 +R4 $8 +l o62 ss0 $0 $2 +o2q +se9 i69 ,7 +o0k D2 $1 +^0 ^2 ^0 ^4 r +o2v $e +o2a $5 +o3i $w +$h r +i41 i56 o68 +$. $2 $3 +i31 i49 o58 o60 +i2y i4a ++2 i4a +o3y -4 +o47 ss7 $7 $7 +i3y i4a r +i47 ,5 ss7 $7 +D4 $1 $0 $1 +o0t $3 $4 +o31 o47 +i11 i32 i53 i74 $5 +o3u o4h r +i51 ss9 $9 $8 +i52 ss1 $2 +o0m $1 $9 $9 $1 +i41 i51 i62 o78 +sd1 $9 $7 $5 +^4 ^0 ^8 o32 r +i11 i29 i38 ,4 +i5i o6l +o51 i62 i71 o84 +^2 ^6 o23 r +^1 ^5 ^2 r +^a $2 $2 +D1 i2s +i41 i50 i60 o74 +o5y $. +o0k $6 $9 $6 $9 +o61 ,7 $1 +$3 $0 $0 $5 +o1a +3 +o51 i69 ,7 $4 +i4y se0 o68 +o1o i4u +^2 ^1 ^1 o38 +^1 $6 +l i2e $1 +^1 ^2 ^0 ^0 r +i4a se0 o66 +l i7l i8o o9v oAe +i41 i53 i62 o74 +o0s o3u +i31 sd2 $3 $4 $5 +sy3 $9 +o68 i71 o88 +o4y $k +i34 i43 o52 +^_ $_ r +^0 ^2 ^0 ^5 r +^5 ^2 ^8 o32 r +D4 $9 $2 +o2j $1 $4 $3 +i2r i4o +o0y $3 $3 ++0 o4u +o3y $a r +o0s i2o +$b $4 +o4g i5u +i56 i69 ss6 $9 +l $0 $9 $0 $9 +[ $1 $2 $1 $2 +^0 ^1 ^1 o32 +^7 ^0 ^0 T3 +l i52 o60 ss0 $2 +o1e i3u +i51 ss2 $5 +i45 i52 ,6 +i3i i51 o62 +o41 i59 i66 o73 +i1w $1 $2 $3 +o1a o2c +l i82 o90 iA0 oB8 +i1a i2p +o0j o1m +o3u $1 $6 +^8 ^7 T2 r +l i1z +i41 ss2 $0 +o2e o3b +$8 $8 $2 +i44 i54 ss4 $4 +i32 i45 i53 R6 +$8 $8 $3 +o5a $1 $6 +o47 i58 o66 +o71 i89 i98 oA6 +i32 i40 se0 $4 +$1 $3 $3 $0 +sy6 $0 +o3u $0 $7 +i4o i5n +o3e $3 +o92 iA0 iB0 oC7 +[ $! $! +o0g o2i +i59 se9 ,7 +l o6o $1 ++3 $2 +o1m $0 $0 $7 +o2i i3b +i5z o65 +i4a i5k o6o +i4n i51 i62 o73 +^1 ^# ] +i5e ] +o30 R4 +^2 ^3 o25 r +R4 $7 +l $# $3 +se9 $0 +o0y $0 $4 +$2 $7 $0 $2 +^5 o65 +^j o1j +o0s $2 $7 +o1a $8 $7 +i5s o6h +i3a i43 o51 +i4i i61 o75 +o0g i2y +ss0 $7 $0 $7 +^0 ^2 ^1 ++4 $1 $2 $3 +o3a o7a +o05 i14 i23 i32 i41 r +o7# $1 +o4i $0 $7 +$8 $! +^o ^z +o2k $1 $7 +i1e o2t +^. ^j T2 +o1n $2 $0 $0 $7 +o2i $8 $9 +i4p o5u +l $6 $3 $7 +^8 ^8 ^8 +$4 $3 $6 +i1i o4e +i2n o4u +o3v o4o +o5z i62 o71 +o0i i4i +l o5w o61 +$5 $7 $2 +^2 ^3 o26 r +o31 i49 ss9 $7 +D1 $2 $1 $3 +i4o i50 o67 +i1e o5e +o1m D2 +o0d $9 $1 +o2r o6i +se0 R7 +^r ^u $1 +$2 $4 $1 $4 +-3 $0 $1 +i40 ,5 o62 +^1 ^9 ^9 ^4 D5 r +i43 o51 o60 +$n $2 $1 +o2r o6o +o3a $d +i47 o58 o66 +i21 i32 i41 o59 +l o75 o82 +o0a o2o +D3 $1 $0 $0 +$0 $0 $7 $7 +^0 ^3 ^1 ^2 r +i4a i53 ,6 +l o62 i70 ss0 $2 +$g $e +o0a $2 $6 +o6' +o2n D4 +i49 i51 o68 +i2h i3i +l $; +o5b $a +o2y o3s +$6 $5 $3 +^6 ^1 o25 r +i32 i44 o53 +o2t o3o +i3p i4a +i3a i49 o56 +i47 sy7 $7 +i71 i89 i99 oA0 +i32 i40 o54 +i3i i48 o55 +i4y o5p +-3 $2 $1 +o0j i1j +i56 ss9 $6 $9 +o0u $a r +o3a $9 $8 +.3 $1 $3 +o4i $j +i51 i62 o71 o84 +o40 ss0 $9 +$4 $9 $6 +$7 $3 $5 +i1r i2e +o0t o2e +i1j D4 +i51 i69 ss9 $8 +l i63 o70 +o31 $9 $8 $9 +i4a se0 o67 +o0j o2u +^9 ^0 ^4 o31 r +o3a $0 $0 $7 +$1 $1 $9 r +^6 ^1 ^9 +^d o4a +i61 o72 i82 o91 +i29 i38 i49 o51 r +i5E o61 +o2e o5j r +i1p r +o4y i58 o66 +i3i i43 ,5 +o3y i41 o58 ++2 $1 $2 $3 $4 +l i62 o70 ss0 $2 +i1u i2b +^5 ^1 ^0 o32 r +i72 ss0 $0 $5 +^0 ^8 o24 r +$0 $7 $8 $9 +^1 ^3 ^2 ^3 r +ss7 $8 $7 +i41 o59 i66 o73 +ss2 $5 $2 $3 +-1 $2 $0 $0 $8 +^4 ^0 ^1 +o3e o4b +o5# +o47 i57 ss7 $7 +o2e $0 $6 +o3a $1 $9 $8 $9 +l $1 $a +o0v $0 $3 +^i o4i +$o $9 $9 +^b o4a +i32 i44 i50 o63 +l $0 $8 $1 $0 +i40 ,5 o63 +o2e o5y +ss6 $3 $0 +o43 i51 o60 +o4n $z +o1i $2 $0 $0 $8 +o2y o3b +o3z $1 $2 $3 $4 $5 +ss1 $4 $1 $2 +D4 o4g +i3z o5i +^t $3 +i52 i60 o71 +l o6m o71 +i3c o4u +i41 i50 ,6 o71 +o57 $5 +sy1 $9 $7 $4 +i1m o2y +i3y i42 o56 +l i37 +i52 i60 o73 +l ss9 $0 +i4a o5c +,2 i3y +o0r $9 $1 +ss4 $2 $8 +,5 o6z +^2 ^1 ^2 o32 r +o0j $1 $2 $2 $4 +D2 i3r +$9 $5 $9 $5 +o0j $1 $9 $6 $6 +$y $* +sd1 $8 $2 +l i59 ,6 +o31 i49 i58 o60 +o1k i2i r +so1 $3 +o4x $2 +o0e i1d +^0 ^4 ^0 ^5 r +o0S $1 +i40 i52 i60 o73 +i31 o49 i58 o60 +o2y $0 $8 +o3r $y +i51 o69 ,7 $4 +o3z i41 o54 +^0 ^9 ^1 ^1 r +l i49 o58 +D1 o2o +^1 ^9 ^5 ^3 r +$1 $4 $5 $6 +o1a $7 $7 +o37 ss8 $9 +i4i o5h r +i44 ss4 $4 $4 +^7 ^1 ^6 r +o3k ,5 ++3 $0 $6 +o40 i59 o68 +o4d $u +o3y o40 $7 +D2 $i r +^1 ^2 ^3 o5k r +-1 $2 $0 $0 $7 +i3d i4u +o1i $3 $3 +i32 i40 sd0 $8 +-0 o4u +i2y o3m +i3o i45 ,5 +i4i o54 +o57 ss1 $3 +o3i $q +i3i o4v +$r $7 +o3z $8 $6 +i2a +3 +o3z o4k o5i +o3g $i +l $l $l +D3 $k $a +ss7 $2 $6 +o01 i10 r +o4z $! +o0z ,4 +o31 ss9 $9 $7 +i32 se0 $0 $4 +o0f i2e +^a o5h r +i86 o99 +o52 ss2 $5 +i50 ss0 $9 +i31 i41 i51 R6 +o3l o4u +o0n o4e +i44 i55 i64 o75 +$8 $6 $0 +o2i $1 $9 +o2x $1 $2 +l i62 o77 +^3 ^1 ^6 o31 r +$y $7 $9 ++3 .4 +i41 o50 i60 o71 +sr1 $9 $8 $2 +$i $1 $5 +o40 i50 o62 +ss1 $3 $6 $9 +o4y sr1 $6 +l o54 o67 +o0g o3e +i31 i49 ,5 o68 +o2r $2 $4 +^v ^u ^l T3 +l i51 o69 ss9 $0 +o3h $o +l o87 o98 +i41 i50 o62 o74 +i71 o89 i98 oA6 +i52 i62 o78 +,3 $7 $7 +l i51 o69 ss8 $7 +i41 i52 o61 o70 +D1 o2j +o2v o5a +-0 $6 $6 $6 +$1 $9 $3 $2 +D5 o5q +o2k .4 +D2 $1 $9 $9 $9 +o2k $y +i41 i59 o68 $9 +o0f $u +i51 i62 i73 ss4 $5 $6 +o0b $1 $4 $3 +i76 o81 R9 +$3 $2 $1 $1 +i4y se1 o68 +o70 ss0 $1 +i54 o62 o71 +i1u o2n +-2 $2 $3 +o3c $1 $3 +o0q i1u $1 +i5a i61 o76 +o2i $0 $4 +^9 ^5 ^4 r +o0e o1d +o4a ss1 $1 +i1h o4e +i4p o51 +i30 i47 i50 o68 +i4e o5j +o4y sr0 $1 +o3b $1 $1 +o51 i69 ss6 $9 +o3u i4s +i32 sd0 $0 $7 +$g $7 +^8 ^0 ^0 r +l i71 o89 ss9 $4 +i40 i51 i60 o74 +i47 ss1 $1 +^s $y +$5 $9 $1 +o6j $1 +i3a i41 i50 ,6 +o5a o6u +i3y i49 o55 +D1 i3n +o61 i79 ,8 $1 +l i7l o8o i9v oAe +i51 o63 o70 +i11 i22 i33 i47 i58 o69 +o62 o7k $7 +^` +$1 $0 $8 $7 +$6 $3 $2 +o5z $3 +o0e i3i +o4l i5i $a +o4l $2 +i31 i49 ,5 $0 +o1a o3z +o2e o3d +^7 ^0 ^1 o31 r +i4n o6a +i31 o49 i59 o68 +^1 o5l r +i51 o69 ss6 $9 +i37 i43 o51 +i42 o54 i62 o74 +i61 i73 o81 +o3o i4c +$1 $0 $9 $8 +i63 o76 R8 +o0a $8 +^k $5 +o41 $9 $8 $9 +o0j $5 $3 +$# $1 $5 +o0o D2 +o3z $2 $0 $0 $6 +o51 ss9 $6 $9 +$2 $3 $9 $0 +o3g $0 $7 +o0h D2 +$2 $3 $9 $1 +$2 $4 $2 $6 +i3o o4t +i61 o79 ,8 $1 +o0m i1y i2j +$4 $5 $6 $7 $8 $9 +o5w o6a +^3 ^2 ^1 i81 o92 oA3 +^1 ^0 ^1 D4 r +i4h ,5 +D3 -5 +i5j i6o o7e +$7 $4 $4 +o0h ,5 +$z $o $e +i3i $s +^u ^h +o3y i42 o55 +o41 i50 i62 ,7 +,3 $8 $9 +[ $y r +$7 $6 $1 +D3 +5 $o +i41 ss4 $7 +i47 o51 o68 +i42 ss0 $9 +o1e i3h +i12 i26 i32 i46 i52 o66 +,3 $8 $7 +i5e o6z +o3k i4u +o5c $o +o4o i50 o66 +o0b $9 $2 +i41 o50 i62 ,7 +o0j $5 $8 +o0k +3 +i3a i41 i54 o63 +$o $7 $7 +i4y ss2 $1 +D3 $4 $2 $0 +o4c $y +i4o o5c +^1 ^9 o23 r +$0 $7 $3 $0 +o1y o2z +o5o i60 o77 +i4y ss2 $3 +l i7l o8o o9v $e +^1 ^2 ^1 o38 +i61 ,7 $1 +-3 i4u +^1 ^2 ^3 o4w r +o5J r +o4a $5 $5 +i51 ss2 $3 $4 $5 $6 +l o5m o6a +l $0 $2 $0 $8 +D3 $k $o +i51 i62 i73 se4 o95 +-2 ,3 +o07 i17 r +,3 $9 $9 +o4y o5m r +o72 $0 $0 $6 +o0n i1e r +i31 i49 o58 o61 +i72 i80 o91 oA0 +o0w $1 $7 +i44 o55 $6 +o51 i69 i76 ,8 +i51 i69 o76 ,8 +o0t i5i +o3e i4m +o4b D5 +o3t o4z +o2r $1 $8 +o84 o91 +^1 o4u r +o1u i2a +i41 i52 i60 o78 +i52 o64 i76 o88 +^4 ^1 ^3 ^4 ^1 o53 +l o71 ss9 $9 $4 +ss0 $5 $0 $6 +o0b $8 $6 +i3n o5y +o86 o98 +i1h i3o +^2 ^5 ^3 ^0 r +l $2 $3 $3 +i15 i26 i37 i48 o59 +i3c $i +$1 $/ +i41 o52 i61 o70 +o4t $y +$7 $5 $9 +^3 ^2 ^1 o3b +^i ^h T2 +o1e o2o +D1 $1 $2 $1 $8 +o1i i2t +o4i i51 o62 +^2 ^1 o2j +^z ^1 ^2 ^3 r +l o52 ss0 $0 $2 +l i65 ,7 ,8 +o3z o4k $y +i42 o51 ss2 $1 +^2 ^1 ^1 o37 +o62 i7k o87 +i51 i61 i72 o83 +^7 ^0 ^9 o30 r +o2i i3d +o0d $2 $0 $0 $5 +i31 i45 i51 o60 +o0f i1o +i32 ss0 $1 $0 +o0a o3i +l o6m o7a +sl2 $4 +o0n $3 $0 +i44 i5e o6v o7a +i42 i55 i63 o75 +o4c o5i $a +i42 o5k $7 +-2 o4o +o4w ] +o4y i5# o61 +$m $c +st3 $3 $3 +^a o1e +o3i $8 $2 diff --git a/rules/specific.rule b/rules/specific.rule new file mode 100644 index 0000000000..5a24929bba --- /dev/null +++ b/rules/specific.rule @@ -0,0 +1,211 @@ +## rule: switch last two chars of word with each other +## limits: words greater or equal 10 chars length +## example: johnnoble ---> johnnobel +## extras: experienced effective cases + +>A k l +>A k u +>A k c + +## rule: permuted switch of chars of word with each other +## limits: char positions 0 to 9 +## example: peterbishop ---> petrebishop +## extras: none + +*01 +*02 +*03 +*04 +*05 +*06 +*07 +*08 +*09 +*12 +*13 +*14 +*15 +*16 +*17 +*18 +*19 +*23 +*24 +*25 +*26 +*27 +*28 +*29 +*34 +*35 +*36 +*37 +*38 +*39 +*45 +*46 +*47 +*48 +*49 +*56 +*57 +*58 +*59 +*67 +*68 +*69 +*78 +*79 +*89 + +## rule: increase char +## limits: positions 0 to 9 +## example: nina555 ---> nina666 +## extras: none + ++0 ++1 ++2 ++3 ++4 ++5 ++6 ++7 ++8 ++9 + ++0+1 ++1+2 ++2+3 ++3+4 ++4+5 ++5+6 ++6+7 ++7+8 ++8+9 + ++0+0 ++1+1 ++2+2 ++3+3 ++4+4 ++5+5 ++6+6 ++7+7 ++8+8 ++9+9 + ++0+1+2 ++1+2+3 ++2+3+4 ++3+4+5 ++4+5+6 ++5+6+7 ++6+7+8 ++7+8+9 + ++0+0+0 ++1+1+1 ++2+2+2 ++3+3+3 ++4+4+4 ++5+5+5 ++6+6+6 ++7+7+7 ++8+8+8 ++9+9+9 + ++0+1+2+3 ++1+2+3+4 ++2+3+4+5 ++3+4+5+6 ++4+5+6+7 ++5+6+7+8 ++6+7+8+9 + ++0+0+0+0 ++1+1+1+1 ++2+2+2+2 ++3+3+3+3 ++4+4+4+4 ++5+5+5+5 ++6+6+6+6 ++7+7+7+7 ++8+8+8+8 ++9+9+9+9 + +## rule: decrease char +## limits: positions 0 to 9 +## example: astrid0816 ---> astrid0815 +## extras: none + +-0 +-1 +-2 +-3 +-4 +-5 +-6 +-7 +-8 +-9 + +-0-1 +-1-2 +-2-3 +-3-4 +-4-5 +-5-6 +-6-7 +-7-8 +-8-9 + +-0-0 +-1-1 +-2-2 +-3-3 +-4-4 +-5-5 +-6-6 +-7-7 +-8-8 +-9-9 + +-0-1-2 +-1-2-3 +-2-3-4 +-3-4-5 +-4-5-6 +-5-6-7 +-6-7-8 +-7-8-9 + +-0-0-0 +-1-1-1 +-2-2-2 +-3-3-3 +-4-4-4 +-5-5-5 +-6-6-6 +-7-7-7 +-8-8-8 +-9-9-9 + +-0-1-2-3 +-1-2-3-4 +-2-3-4-5 +-3-4-5-6 +-4-5-6-7 +-5-6-7-8 +-6-7-8-9 + +-0-0-0-0 +-1-1-1-1 +-2-2-2-2 +-3-3-3-3 +-4-4-4-4 +-5-5-5-5 +-6-6-6-6 +-7-7-7-7 +-8-8-8-8 +-9-9-9-9 diff --git a/rules/toggles1.rule b/rules/toggles1.rule new file mode 100644 index 0000000000..52ad157bb7 --- /dev/null +++ b/rules/toggles1.rule @@ -0,0 +1,15 @@ +T0 +T1 +T2 +T3 +T4 +T5 +T6 +T7 +T8 +T9 +TA +TB +TC +TD +TE diff --git a/rules/toggles2.rule b/rules/toggles2.rule new file mode 100644 index 0000000000..4df4b08268 --- /dev/null +++ b/rules/toggles2.rule @@ -0,0 +1,120 @@ +T0 +T1 +T2 +T3 +T4 +T5 +T6 +T7 +T8 +T9 +TA +TB +TC +TD +TE +T0T1 +T0T2 +T0T3 +T0T4 +T0T5 +T0T6 +T0T7 +T0T8 +T0T9 +T0TA +T0TB +T0TC +T0TD +T0TE +T1T2 +T1T3 +T1T4 +T1T5 +T1T6 +T1T7 +T1T8 +T1T9 +T1TA +T1TB +T1TC +T1TD +T1TE +T2T3 +T2T4 +T2T5 +T2T6 +T2T7 +T2T8 +T2T9 +T2TA +T2TB +T2TC +T2TD +T2TE +T3T4 +T3T5 +T3T6 +T3T7 +T3T8 +T3T9 +T3TA +T3TB +T3TC +T3TD +T3TE +T4T5 +T4T6 +T4T7 +T4T8 +T4T9 +T4TA +T4TB +T4TC +T4TD +T4TE +T5T6 +T5T7 +T5T8 +T5T9 +T5TA +T5TB +T5TC +T5TD +T5TE +T6T7 +T6T8 +T6T9 +T6TA +T6TB +T6TC +T6TD +T6TE +T7T8 +T7T9 +T7TA +T7TB +T7TC +T7TD +T7TE +T8T9 +T8TA +T8TB +T8TC +T8TD +T8TE +T9TA +T9TB +T9TC +T9TD +T9TE +TATB +TATC +TATD +TATE +TBTC +TBTD +TBTE +TCTD +TCTE +TDTE diff --git a/rules/toggles3.rule b/rules/toggles3.rule new file mode 100644 index 0000000000..789607c7aa --- /dev/null +++ b/rules/toggles3.rule @@ -0,0 +1,575 @@ +T0 +T1 +T2 +T3 +T4 +T5 +T6 +T7 +T8 +T9 +TA +TB +TC +TD +TE +T0T1 +T0T2 +T0T3 +T0T4 +T0T5 +T0T6 +T0T7 +T0T8 +T0T9 +T0TA +T0TB +T0TC +T0TD +T0TE +T1T2 +T1T3 +T1T4 +T1T5 +T1T6 +T1T7 +T1T8 +T1T9 +T1TA +T1TB +T1TC +T1TD +T1TE +T2T3 +T2T4 +T2T5 +T2T6 +T2T7 +T2T8 +T2T9 +T2TA +T2TB +T2TC +T2TD +T2TE +T3T4 +T3T5 +T3T6 +T3T7 +T3T8 +T3T9 +T3TA +T3TB +T3TC +T3TD +T3TE +T4T5 +T4T6 +T4T7 +T4T8 +T4T9 +T4TA +T4TB +T4TC +T4TD +T4TE +T5T6 +T5T7 +T5T8 +T5T9 +T5TA +T5TB +T5TC +T5TD +T5TE +T6T7 +T6T8 +T6T9 +T6TA +T6TB +T6TC +T6TD +T6TE +T7T8 +T7T9 +T7TA +T7TB +T7TC +T7TD +T7TE +T8T9 +T8TA +T8TB +T8TC +T8TD +T8TE +T9TA +T9TB +T9TC +T9TD +T9TE +TATB +TATC +TATD +TATE +TBTC +TBTD +TBTE +TCTD +TCTE +TDTE +T0T1T2 +T0T1T3 +T0T1T4 +T0T1T5 +T0T1T6 +T0T1T7 +T0T1T8 +T0T1T9 +T0T1TA +T0T1TB +T0T1TC +T0T1TD +T0T1TE +T0T2T3 +T0T2T4 +T0T2T5 +T0T2T6 +T0T2T7 +T0T2T8 +T0T2T9 +T0T2TA +T0T2TB +T0T2TC +T0T2TD +T0T2TE +T0T3T4 +T0T3T5 +T0T3T6 +T0T3T7 +T0T3T8 +T0T3T9 +T0T3TA +T0T3TB +T0T3TC +T0T3TD +T0T3TE +T0T4T5 +T0T4T6 +T0T4T7 +T0T4T8 +T0T4T9 +T0T4TA +T0T4TB +T0T4TC +T0T4TD +T0T4TE +T0T5T6 +T0T5T7 +T0T5T8 +T0T5T9 +T0T5TA +T0T5TB +T0T5TC +T0T5TD +T0T5TE +T0T6T7 +T0T6T8 +T0T6T9 +T0T6TA +T0T6TB +T0T6TC +T0T6TD +T0T6TE +T0T7T8 +T0T7T9 +T0T7TA +T0T7TB +T0T7TC +T0T7TD +T0T7TE +T0T8T9 +T0T8TA +T0T8TB +T0T8TC +T0T8TD +T0T8TE +T0T9TA +T0T9TB +T0T9TC +T0T9TD +T0T9TE +T0TATB +T0TATC +T0TATD +T0TATE +T0TBTC +T0TBTD +T0TBTE +T0TCTD +T0TCTE +T0TDTE +T1T2T3 +T1T2T4 +T1T2T5 +T1T2T6 +T1T2T7 +T1T2T8 +T1T2T9 +T1T2TA +T1T2TB +T1T2TC +T1T2TD +T1T2TE +T1T3T4 +T1T3T5 +T1T3T6 +T1T3T7 +T1T3T8 +T1T3T9 +T1T3TA +T1T3TB +T1T3TC +T1T3TD +T1T3TE +T1T4T5 +T1T4T6 +T1T4T7 +T1T4T8 +T1T4T9 +T1T4TA +T1T4TB +T1T4TC +T1T4TD +T1T4TE +T1T5T6 +T1T5T7 +T1T5T8 +T1T5T9 +T1T5TA +T1T5TB +T1T5TC +T1T5TD +T1T5TE +T1T6T7 +T1T6T8 +T1T6T9 +T1T6TA +T1T6TB +T1T6TC +T1T6TD +T1T6TE +T1T7T8 +T1T7T9 +T1T7TA +T1T7TB +T1T7TC +T1T7TD +T1T7TE +T1T8T9 +T1T8TA +T1T8TB +T1T8TC +T1T8TD +T1T8TE +T1T9TA +T1T9TB +T1T9TC +T1T9TD +T1T9TE +T1TATB +T1TATC +T1TATD +T1TATE +T1TBTC +T1TBTD +T1TBTE +T1TCTD +T1TCTE +T1TDTE +T2T3T4 +T2T3T5 +T2T3T6 +T2T3T7 +T2T3T8 +T2T3T9 +T2T3TA +T2T3TB +T2T3TC +T2T3TD +T2T3TE +T2T4T5 +T2T4T6 +T2T4T7 +T2T4T8 +T2T4T9 +T2T4TA +T2T4TB +T2T4TC +T2T4TD +T2T4TE +T2T5T6 +T2T5T7 +T2T5T8 +T2T5T9 +T2T5TA +T2T5TB +T2T5TC +T2T5TD +T2T5TE +T2T6T7 +T2T6T8 +T2T6T9 +T2T6TA +T2T6TB +T2T6TC +T2T6TD +T2T6TE +T2T7T8 +T2T7T9 +T2T7TA +T2T7TB +T2T7TC +T2T7TD +T2T7TE +T2T8T9 +T2T8TA +T2T8TB +T2T8TC +T2T8TD +T2T8TE +T2T9TA +T2T9TB +T2T9TC +T2T9TD +T2T9TE +T2TATB +T2TATC +T2TATD +T2TATE +T2TBTC +T2TBTD +T2TBTE +T2TCTD +T2TCTE +T2TDTE +T3T4T5 +T3T4T6 +T3T4T7 +T3T4T8 +T3T4T9 +T3T4TA +T3T4TB +T3T4TC +T3T4TD +T3T4TE +T3T5T6 +T3T5T7 +T3T5T8 +T3T5T9 +T3T5TA +T3T5TB +T3T5TC +T3T5TD +T3T5TE +T3T6T7 +T3T6T8 +T3T6T9 +T3T6TA +T3T6TB +T3T6TC +T3T6TD +T3T6TE +T3T7T8 +T3T7T9 +T3T7TA +T3T7TB +T3T7TC +T3T7TD +T3T7TE +T3T8T9 +T3T8TA +T3T8TB +T3T8TC +T3T8TD +T3T8TE +T3T9TA +T3T9TB +T3T9TC +T3T9TD +T3T9TE +T3TATB +T3TATC +T3TATD +T3TATE +T3TBTC +T3TBTD +T3TBTE +T3TCTD +T3TCTE +T3TDTE +T4T5T6 +T4T5T7 +T4T5T8 +T4T5T9 +T4T5TA +T4T5TB +T4T5TC +T4T5TD +T4T5TE +T4T6T7 +T4T6T8 +T4T6T9 +T4T6TA +T4T6TB +T4T6TC +T4T6TD +T4T6TE +T4T7T8 +T4T7T9 +T4T7TA +T4T7TB +T4T7TC +T4T7TD +T4T7TE +T4T8T9 +T4T8TA +T4T8TB +T4T8TC +T4T8TD +T4T8TE +T4T9TA +T4T9TB +T4T9TC +T4T9TD +T4T9TE +T4TATB +T4TATC +T4TATD +T4TATE +T4TBTC +T4TBTD +T4TBTE +T4TCTD +T4TCTE +T4TDTE +T5T6T7 +T5T6T8 +T5T6T9 +T5T6TA +T5T6TB +T5T6TC +T5T6TD +T5T6TE +T5T7T8 +T5T7T9 +T5T7TA +T5T7TB +T5T7TC +T5T7TD +T5T7TE +T5T8T9 +T5T8TA +T5T8TB +T5T8TC +T5T8TD +T5T8TE +T5T9TA +T5T9TB +T5T9TC +T5T9TD +T5T9TE +T5TATB +T5TATC +T5TATD +T5TATE +T5TBTC +T5TBTD +T5TBTE +T5TCTD +T5TCTE +T5TDTE +T6T7T8 +T6T7T9 +T6T7TA +T6T7TB +T6T7TC +T6T7TD +T6T7TE +T6T8T9 +T6T8TA +T6T8TB +T6T8TC +T6T8TD +T6T8TE +T6T9TA +T6T9TB +T6T9TC +T6T9TD +T6T9TE +T6TATB +T6TATC +T6TATD +T6TATE +T6TBTC +T6TBTD +T6TBTE +T6TCTD +T6TCTE +T6TDTE +T7T8T9 +T7T8TA +T7T8TB +T7T8TC +T7T8TD +T7T8TE +T7T9TA +T7T9TB +T7T9TC +T7T9TD +T7T9TE +T7TATB +T7TATC +T7TATD +T7TATE +T7TBTC +T7TBTD +T7TBTE +T7TCTD +T7TCTE +T7TDTE +T8T9TA +T8T9TB +T8T9TC +T8T9TD +T8T9TE +T8TATB +T8TATC +T8TATD +T8TATE +T8TBTC +T8TBTD +T8TBTE +T8TCTD +T8TCTE +T8TDTE +T9TATB +T9TATC +T9TATD +T9TATE +T9TBTC +T9TBTD +T9TBTE +T9TCTD +T9TCTE +T9TDTE +TATBTC +TATBTD +TATBTE +TATCTD +TATCTE +TATDTE +TBTCTD +TBTCTE +TBTDTE +TCTDTE diff --git a/rules/toggles4.rule b/rules/toggles4.rule new file mode 100644 index 0000000000..ab542d8ee4 --- /dev/null +++ b/rules/toggles4.rule @@ -0,0 +1,1940 @@ +T0 +T1 +T2 +T3 +T4 +T5 +T6 +T7 +T8 +T9 +TA +TB +TC +TD +TE +T0T1 +T0T2 +T0T3 +T0T4 +T0T5 +T0T6 +T0T7 +T0T8 +T0T9 +T0TA +T0TB +T0TC +T0TD +T0TE +T1T2 +T1T3 +T1T4 +T1T5 +T1T6 +T1T7 +T1T8 +T1T9 +T1TA +T1TB +T1TC +T1TD +T1TE +T2T3 +T2T4 +T2T5 +T2T6 +T2T7 +T2T8 +T2T9 +T2TA +T2TB +T2TC +T2TD +T2TE +T3T4 +T3T5 +T3T6 +T3T7 +T3T8 +T3T9 +T3TA +T3TB +T3TC +T3TD +T3TE +T4T5 +T4T6 +T4T7 +T4T8 +T4T9 +T4TA +T4TB +T4TC +T4TD +T4TE +T5T6 +T5T7 +T5T8 +T5T9 +T5TA +T5TB +T5TC +T5TD +T5TE +T6T7 +T6T8 +T6T9 +T6TA +T6TB +T6TC +T6TD +T6TE +T7T8 +T7T9 +T7TA +T7TB +T7TC +T7TD +T7TE +T8T9 +T8TA +T8TB +T8TC +T8TD +T8TE +T9TA +T9TB +T9TC +T9TD +T9TE +TATB +TATC +TATD +TATE +TBTC +TBTD +TBTE +TCTD +TCTE +TDTE +T0T1T2 +T0T1T3 +T0T1T4 +T0T1T5 +T0T1T6 +T0T1T7 +T0T1T8 +T0T1T9 +T0T1TA +T0T1TB +T0T1TC +T0T1TD +T0T1TE +T0T2T3 +T0T2T4 +T0T2T5 +T0T2T6 +T0T2T7 +T0T2T8 +T0T2T9 +T0T2TA +T0T2TB +T0T2TC +T0T2TD +T0T2TE +T0T3T4 +T0T3T5 +T0T3T6 +T0T3T7 +T0T3T8 +T0T3T9 +T0T3TA +T0T3TB +T0T3TC +T0T3TD +T0T3TE +T0T4T5 +T0T4T6 +T0T4T7 +T0T4T8 +T0T4T9 +T0T4TA +T0T4TB +T0T4TC +T0T4TD +T0T4TE +T0T5T6 +T0T5T7 +T0T5T8 +T0T5T9 +T0T5TA +T0T5TB +T0T5TC +T0T5TD +T0T5TE +T0T6T7 +T0T6T8 +T0T6T9 +T0T6TA +T0T6TB +T0T6TC +T0T6TD +T0T6TE +T0T7T8 +T0T7T9 +T0T7TA +T0T7TB +T0T7TC +T0T7TD +T0T7TE +T0T8T9 +T0T8TA +T0T8TB +T0T8TC +T0T8TD +T0T8TE +T0T9TA +T0T9TB +T0T9TC +T0T9TD +T0T9TE +T0TATB +T0TATC +T0TATD +T0TATE +T0TBTC +T0TBTD +T0TBTE +T0TCTD +T0TCTE +T0TDTE +T1T2T3 +T1T2T4 +T1T2T5 +T1T2T6 +T1T2T7 +T1T2T8 +T1T2T9 +T1T2TA +T1T2TB +T1T2TC +T1T2TD +T1T2TE +T1T3T4 +T1T3T5 +T1T3T6 +T1T3T7 +T1T3T8 +T1T3T9 +T1T3TA +T1T3TB +T1T3TC +T1T3TD +T1T3TE +T1T4T5 +T1T4T6 +T1T4T7 +T1T4T8 +T1T4T9 +T1T4TA +T1T4TB +T1T4TC +T1T4TD +T1T4TE +T1T5T6 +T1T5T7 +T1T5T8 +T1T5T9 +T1T5TA +T1T5TB +T1T5TC +T1T5TD +T1T5TE +T1T6T7 +T1T6T8 +T1T6T9 +T1T6TA +T1T6TB +T1T6TC +T1T6TD +T1T6TE +T1T7T8 +T1T7T9 +T1T7TA +T1T7TB +T1T7TC +T1T7TD +T1T7TE +T1T8T9 +T1T8TA +T1T8TB +T1T8TC +T1T8TD +T1T8TE +T1T9TA +T1T9TB +T1T9TC +T1T9TD +T1T9TE +T1TATB +T1TATC +T1TATD +T1TATE +T1TBTC +T1TBTD +T1TBTE +T1TCTD +T1TCTE +T1TDTE +T2T3T4 +T2T3T5 +T2T3T6 +T2T3T7 +T2T3T8 +T2T3T9 +T2T3TA +T2T3TB +T2T3TC +T2T3TD +T2T3TE +T2T4T5 +T2T4T6 +T2T4T7 +T2T4T8 +T2T4T9 +T2T4TA +T2T4TB +T2T4TC +T2T4TD +T2T4TE +T2T5T6 +T2T5T7 +T2T5T8 +T2T5T9 +T2T5TA +T2T5TB +T2T5TC +T2T5TD +T2T5TE +T2T6T7 +T2T6T8 +T2T6T9 +T2T6TA +T2T6TB +T2T6TC +T2T6TD +T2T6TE +T2T7T8 +T2T7T9 +T2T7TA +T2T7TB +T2T7TC +T2T7TD +T2T7TE +T2T8T9 +T2T8TA +T2T8TB +T2T8TC +T2T8TD +T2T8TE +T2T9TA +T2T9TB +T2T9TC +T2T9TD +T2T9TE +T2TATB +T2TATC +T2TATD +T2TATE +T2TBTC +T2TBTD +T2TBTE +T2TCTD +T2TCTE +T2TDTE +T3T4T5 +T3T4T6 +T3T4T7 +T3T4T8 +T3T4T9 +T3T4TA +T3T4TB +T3T4TC +T3T4TD +T3T4TE +T3T5T6 +T3T5T7 +T3T5T8 +T3T5T9 +T3T5TA +T3T5TB +T3T5TC +T3T5TD +T3T5TE +T3T6T7 +T3T6T8 +T3T6T9 +T3T6TA +T3T6TB +T3T6TC +T3T6TD +T3T6TE +T3T7T8 +T3T7T9 +T3T7TA +T3T7TB +T3T7TC +T3T7TD +T3T7TE +T3T8T9 +T3T8TA +T3T8TB +T3T8TC +T3T8TD +T3T8TE +T3T9TA +T3T9TB +T3T9TC +T3T9TD +T3T9TE +T3TATB +T3TATC +T3TATD +T3TATE +T3TBTC +T3TBTD +T3TBTE +T3TCTD +T3TCTE +T3TDTE +T4T5T6 +T4T5T7 +T4T5T8 +T4T5T9 +T4T5TA +T4T5TB +T4T5TC +T4T5TD +T4T5TE +T4T6T7 +T4T6T8 +T4T6T9 +T4T6TA +T4T6TB +T4T6TC +T4T6TD +T4T6TE +T4T7T8 +T4T7T9 +T4T7TA +T4T7TB +T4T7TC +T4T7TD +T4T7TE +T4T8T9 +T4T8TA +T4T8TB +T4T8TC +T4T8TD +T4T8TE +T4T9TA +T4T9TB +T4T9TC +T4T9TD +T4T9TE +T4TATB +T4TATC +T4TATD +T4TATE +T4TBTC +T4TBTD +T4TBTE +T4TCTD +T4TCTE +T4TDTE +T5T6T7 +T5T6T8 +T5T6T9 +T5T6TA +T5T6TB +T5T6TC +T5T6TD +T5T6TE +T5T7T8 +T5T7T9 +T5T7TA +T5T7TB +T5T7TC +T5T7TD +T5T7TE +T5T8T9 +T5T8TA +T5T8TB +T5T8TC +T5T8TD +T5T8TE +T5T9TA +T5T9TB +T5T9TC +T5T9TD +T5T9TE +T5TATB +T5TATC +T5TATD +T5TATE +T5TBTC +T5TBTD +T5TBTE +T5TCTD +T5TCTE +T5TDTE +T6T7T8 +T6T7T9 +T6T7TA +T6T7TB +T6T7TC +T6T7TD +T6T7TE +T6T8T9 +T6T8TA +T6T8TB +T6T8TC +T6T8TD +T6T8TE +T6T9TA +T6T9TB +T6T9TC +T6T9TD +T6T9TE +T6TATB +T6TATC +T6TATD +T6TATE +T6TBTC +T6TBTD +T6TBTE +T6TCTD +T6TCTE +T6TDTE +T7T8T9 +T7T8TA +T7T8TB +T7T8TC +T7T8TD +T7T8TE +T7T9TA +T7T9TB +T7T9TC +T7T9TD +T7T9TE +T7TATB +T7TATC +T7TATD +T7TATE +T7TBTC +T7TBTD +T7TBTE +T7TCTD +T7TCTE +T7TDTE +T8T9TA +T8T9TB +T8T9TC +T8T9TD +T8T9TE +T8TATB +T8TATC +T8TATD +T8TATE +T8TBTC +T8TBTD +T8TBTE +T8TCTD +T8TCTE +T8TDTE +T9TATB +T9TATC +T9TATD +T9TATE +T9TBTC +T9TBTD +T9TBTE +T9TCTD +T9TCTE +T9TDTE +TATBTC +TATBTD +TATBTE +TATCTD +TATCTE +TATDTE +TBTCTD +TBTCTE +TBTDTE +TCTDTE +T0T1T2T3 +T0T1T2T4 +T0T1T2T5 +T0T1T2T6 +T0T1T2T7 +T0T1T2T8 +T0T1T2T9 +T0T1T2TA +T0T1T2TB +T0T1T2TC +T0T1T2TD +T0T1T2TE +T0T1T3T4 +T0T1T3T5 +T0T1T3T6 +T0T1T3T7 +T0T1T3T8 +T0T1T3T9 +T0T1T3TA +T0T1T3TB +T0T1T3TC +T0T1T3TD +T0T1T3TE +T0T1T4T5 +T0T1T4T6 +T0T1T4T7 +T0T1T4T8 +T0T1T4T9 +T0T1T4TA +T0T1T4TB +T0T1T4TC +T0T1T4TD +T0T1T4TE +T0T1T5T6 +T0T1T5T7 +T0T1T5T8 +T0T1T5T9 +T0T1T5TA +T0T1T5TB +T0T1T5TC +T0T1T5TD +T0T1T5TE +T0T1T6T7 +T0T1T6T8 +T0T1T6T9 +T0T1T6TA +T0T1T6TB +T0T1T6TC +T0T1T6TD +T0T1T6TE +T0T1T7T8 +T0T1T7T9 +T0T1T7TA +T0T1T7TB +T0T1T7TC +T0T1T7TD +T0T1T7TE +T0T1T8T9 +T0T1T8TA +T0T1T8TB +T0T1T8TC +T0T1T8TD +T0T1T8TE +T0T1T9TA +T0T1T9TB +T0T1T9TC +T0T1T9TD +T0T1T9TE +T0T1TATB +T0T1TATC +T0T1TATD +T0T1TATE +T0T1TBTC +T0T1TBTD +T0T1TBTE +T0T1TCTD +T0T1TCTE +T0T1TDTE +T0T2T3T4 +T0T2T3T5 +T0T2T3T6 +T0T2T3T7 +T0T2T3T8 +T0T2T3T9 +T0T2T3TA +T0T2T3TB +T0T2T3TC +T0T2T3TD +T0T2T3TE +T0T2T4T5 +T0T2T4T6 +T0T2T4T7 +T0T2T4T8 +T0T2T4T9 +T0T2T4TA +T0T2T4TB +T0T2T4TC +T0T2T4TD +T0T2T4TE +T0T2T5T6 +T0T2T5T7 +T0T2T5T8 +T0T2T5T9 +T0T2T5TA +T0T2T5TB +T0T2T5TC +T0T2T5TD +T0T2T5TE +T0T2T6T7 +T0T2T6T8 +T0T2T6T9 +T0T2T6TA +T0T2T6TB +T0T2T6TC +T0T2T6TD +T0T2T6TE +T0T2T7T8 +T0T2T7T9 +T0T2T7TA +T0T2T7TB +T0T2T7TC +T0T2T7TD +T0T2T7TE +T0T2T8T9 +T0T2T8TA +T0T2T8TB +T0T2T8TC +T0T2T8TD +T0T2T8TE +T0T2T9TA +T0T2T9TB +T0T2T9TC +T0T2T9TD +T0T2T9TE +T0T2TATB +T0T2TATC +T0T2TATD +T0T2TATE +T0T2TBTC +T0T2TBTD +T0T2TBTE +T0T2TCTD +T0T2TCTE +T0T2TDTE +T0T3T4T5 +T0T3T4T6 +T0T3T4T7 +T0T3T4T8 +T0T3T4T9 +T0T3T4TA +T0T3T4TB +T0T3T4TC +T0T3T4TD +T0T3T4TE +T0T3T5T6 +T0T3T5T7 +T0T3T5T8 +T0T3T5T9 +T0T3T5TA +T0T3T5TB +T0T3T5TC +T0T3T5TD +T0T3T5TE +T0T3T6T7 +T0T3T6T8 +T0T3T6T9 +T0T3T6TA +T0T3T6TB +T0T3T6TC +T0T3T6TD +T0T3T6TE +T0T3T7T8 +T0T3T7T9 +T0T3T7TA +T0T3T7TB +T0T3T7TC +T0T3T7TD +T0T3T7TE +T0T3T8T9 +T0T3T8TA +T0T3T8TB +T0T3T8TC +T0T3T8TD +T0T3T8TE +T0T3T9TA +T0T3T9TB +T0T3T9TC +T0T3T9TD +T0T3T9TE +T0T3TATB +T0T3TATC +T0T3TATD +T0T3TATE +T0T3TBTC +T0T3TBTD +T0T3TBTE +T0T3TCTD +T0T3TCTE +T0T3TDTE +T0T4T5T6 +T0T4T5T7 +T0T4T5T8 +T0T4T5T9 +T0T4T5TA +T0T4T5TB +T0T4T5TC +T0T4T5TD +T0T4T5TE +T0T4T6T7 +T0T4T6T8 +T0T4T6T9 +T0T4T6TA +T0T4T6TB +T0T4T6TC +T0T4T6TD +T0T4T6TE +T0T4T7T8 +T0T4T7T9 +T0T4T7TA +T0T4T7TB +T0T4T7TC +T0T4T7TD +T0T4T7TE +T0T4T8T9 +T0T4T8TA +T0T4T8TB +T0T4T8TC +T0T4T8TD +T0T4T8TE +T0T4T9TA +T0T4T9TB +T0T4T9TC +T0T4T9TD +T0T4T9TE +T0T4TATB +T0T4TATC +T0T4TATD +T0T4TATE +T0T4TBTC +T0T4TBTD +T0T4TBTE +T0T4TCTD +T0T4TCTE +T0T4TDTE +T0T5T6T7 +T0T5T6T8 +T0T5T6T9 +T0T5T6TA +T0T5T6TB +T0T5T6TC +T0T5T6TD +T0T5T6TE +T0T5T7T8 +T0T5T7T9 +T0T5T7TA +T0T5T7TB +T0T5T7TC +T0T5T7TD +T0T5T7TE +T0T5T8T9 +T0T5T8TA +T0T5T8TB +T0T5T8TC +T0T5T8TD +T0T5T8TE +T0T5T9TA +T0T5T9TB +T0T5T9TC +T0T5T9TD +T0T5T9TE +T0T5TATB +T0T5TATC +T0T5TATD +T0T5TATE +T0T5TBTC +T0T5TBTD +T0T5TBTE +T0T5TCTD +T0T5TCTE +T0T5TDTE +T0T6T7T8 +T0T6T7T9 +T0T6T7TA +T0T6T7TB +T0T6T7TC +T0T6T7TD +T0T6T7TE +T0T6T8T9 +T0T6T8TA +T0T6T8TB +T0T6T8TC +T0T6T8TD +T0T6T8TE +T0T6T9TA +T0T6T9TB +T0T6T9TC +T0T6T9TD +T0T6T9TE +T0T6TATB +T0T6TATC +T0T6TATD +T0T6TATE +T0T6TBTC +T0T6TBTD +T0T6TBTE +T0T6TCTD +T0T6TCTE +T0T6TDTE +T0T7T8T9 +T0T7T8TA +T0T7T8TB +T0T7T8TC +T0T7T8TD +T0T7T8TE +T0T7T9TA +T0T7T9TB +T0T7T9TC +T0T7T9TD +T0T7T9TE +T0T7TATB +T0T7TATC +T0T7TATD +T0T7TATE +T0T7TBTC +T0T7TBTD +T0T7TBTE +T0T7TCTD +T0T7TCTE +T0T7TDTE +T0T8T9TA +T0T8T9TB +T0T8T9TC +T0T8T9TD +T0T8T9TE +T0T8TATB +T0T8TATC +T0T8TATD +T0T8TATE +T0T8TBTC +T0T8TBTD +T0T8TBTE +T0T8TCTD +T0T8TCTE +T0T8TDTE +T0T9TATB +T0T9TATC +T0T9TATD +T0T9TATE +T0T9TBTC +T0T9TBTD +T0T9TBTE +T0T9TCTD +T0T9TCTE +T0T9TDTE +T0TATBTC +T0TATBTD +T0TATBTE +T0TATCTD +T0TATCTE +T0TATDTE +T0TBTCTD +T0TBTCTE +T0TBTDTE +T0TCTDTE +T1T2T3T4 +T1T2T3T5 +T1T2T3T6 +T1T2T3T7 +T1T2T3T8 +T1T2T3T9 +T1T2T3TA +T1T2T3TB +T1T2T3TC +T1T2T3TD +T1T2T3TE +T1T2T4T5 +T1T2T4T6 +T1T2T4T7 +T1T2T4T8 +T1T2T4T9 +T1T2T4TA +T1T2T4TB +T1T2T4TC +T1T2T4TD +T1T2T4TE +T1T2T5T6 +T1T2T5T7 +T1T2T5T8 +T1T2T5T9 +T1T2T5TA +T1T2T5TB +T1T2T5TC +T1T2T5TD +T1T2T5TE +T1T2T6T7 +T1T2T6T8 +T1T2T6T9 +T1T2T6TA +T1T2T6TB +T1T2T6TC +T1T2T6TD +T1T2T6TE +T1T2T7T8 +T1T2T7T9 +T1T2T7TA +T1T2T7TB +T1T2T7TC +T1T2T7TD +T1T2T7TE +T1T2T8T9 +T1T2T8TA +T1T2T8TB +T1T2T8TC +T1T2T8TD +T1T2T8TE +T1T2T9TA +T1T2T9TB +T1T2T9TC +T1T2T9TD +T1T2T9TE +T1T2TATB +T1T2TATC +T1T2TATD +T1T2TATE +T1T2TBTC +T1T2TBTD +T1T2TBTE +T1T2TCTD +T1T2TCTE +T1T2TDTE +T1T3T4T5 +T1T3T4T6 +T1T3T4T7 +T1T3T4T8 +T1T3T4T9 +T1T3T4TA +T1T3T4TB +T1T3T4TC +T1T3T4TD +T1T3T4TE +T1T3T5T6 +T1T3T5T7 +T1T3T5T8 +T1T3T5T9 +T1T3T5TA +T1T3T5TB +T1T3T5TC +T1T3T5TD +T1T3T5TE +T1T3T6T7 +T1T3T6T8 +T1T3T6T9 +T1T3T6TA +T1T3T6TB +T1T3T6TC +T1T3T6TD +T1T3T6TE +T1T3T7T8 +T1T3T7T9 +T1T3T7TA +T1T3T7TB +T1T3T7TC +T1T3T7TD +T1T3T7TE +T1T3T8T9 +T1T3T8TA +T1T3T8TB +T1T3T8TC +T1T3T8TD +T1T3T8TE +T1T3T9TA +T1T3T9TB +T1T3T9TC +T1T3T9TD +T1T3T9TE +T1T3TATB +T1T3TATC +T1T3TATD +T1T3TATE +T1T3TBTC +T1T3TBTD +T1T3TBTE +T1T3TCTD +T1T3TCTE +T1T3TDTE +T1T4T5T6 +T1T4T5T7 +T1T4T5T8 +T1T4T5T9 +T1T4T5TA +T1T4T5TB +T1T4T5TC +T1T4T5TD +T1T4T5TE +T1T4T6T7 +T1T4T6T8 +T1T4T6T9 +T1T4T6TA +T1T4T6TB +T1T4T6TC +T1T4T6TD +T1T4T6TE +T1T4T7T8 +T1T4T7T9 +T1T4T7TA +T1T4T7TB +T1T4T7TC +T1T4T7TD +T1T4T7TE +T1T4T8T9 +T1T4T8TA +T1T4T8TB +T1T4T8TC +T1T4T8TD +T1T4T8TE +T1T4T9TA +T1T4T9TB +T1T4T9TC +T1T4T9TD +T1T4T9TE +T1T4TATB +T1T4TATC +T1T4TATD +T1T4TATE +T1T4TBTC +T1T4TBTD +T1T4TBTE +T1T4TCTD +T1T4TCTE +T1T4TDTE +T1T5T6T7 +T1T5T6T8 +T1T5T6T9 +T1T5T6TA +T1T5T6TB +T1T5T6TC +T1T5T6TD +T1T5T6TE +T1T5T7T8 +T1T5T7T9 +T1T5T7TA +T1T5T7TB +T1T5T7TC +T1T5T7TD +T1T5T7TE +T1T5T8T9 +T1T5T8TA +T1T5T8TB +T1T5T8TC +T1T5T8TD +T1T5T8TE +T1T5T9TA +T1T5T9TB +T1T5T9TC +T1T5T9TD +T1T5T9TE +T1T5TATB +T1T5TATC +T1T5TATD +T1T5TATE +T1T5TBTC +T1T5TBTD +T1T5TBTE +T1T5TCTD +T1T5TCTE +T1T5TDTE +T1T6T7T8 +T1T6T7T9 +T1T6T7TA +T1T6T7TB +T1T6T7TC +T1T6T7TD +T1T6T7TE +T1T6T8T9 +T1T6T8TA +T1T6T8TB +T1T6T8TC +T1T6T8TD +T1T6T8TE +T1T6T9TA +T1T6T9TB +T1T6T9TC +T1T6T9TD +T1T6T9TE +T1T6TATB +T1T6TATC +T1T6TATD +T1T6TATE +T1T6TBTC +T1T6TBTD +T1T6TBTE +T1T6TCTD +T1T6TCTE +T1T6TDTE +T1T7T8T9 +T1T7T8TA +T1T7T8TB +T1T7T8TC +T1T7T8TD +T1T7T8TE +T1T7T9TA +T1T7T9TB +T1T7T9TC +T1T7T9TD +T1T7T9TE +T1T7TATB +T1T7TATC +T1T7TATD +T1T7TATE +T1T7TBTC +T1T7TBTD +T1T7TBTE +T1T7TCTD +T1T7TCTE +T1T7TDTE +T1T8T9TA +T1T8T9TB +T1T8T9TC +T1T8T9TD +T1T8T9TE +T1T8TATB +T1T8TATC +T1T8TATD +T1T8TATE +T1T8TBTC +T1T8TBTD +T1T8TBTE +T1T8TCTD +T1T8TCTE +T1T8TDTE +T1T9TATB +T1T9TATC +T1T9TATD +T1T9TATE +T1T9TBTC +T1T9TBTD +T1T9TBTE +T1T9TCTD +T1T9TCTE +T1T9TDTE +T1TATBTC +T1TATBTD +T1TATBTE +T1TATCTD +T1TATCTE +T1TATDTE +T1TBTCTD +T1TBTCTE +T1TBTDTE +T1TCTDTE +T2T3T4T5 +T2T3T4T6 +T2T3T4T7 +T2T3T4T8 +T2T3T4T9 +T2T3T4TA +T2T3T4TB +T2T3T4TC +T2T3T4TD +T2T3T4TE +T2T3T5T6 +T2T3T5T7 +T2T3T5T8 +T2T3T5T9 +T2T3T5TA +T2T3T5TB +T2T3T5TC +T2T3T5TD +T2T3T5TE +T2T3T6T7 +T2T3T6T8 +T2T3T6T9 +T2T3T6TA +T2T3T6TB +T2T3T6TC +T2T3T6TD +T2T3T6TE +T2T3T7T8 +T2T3T7T9 +T2T3T7TA +T2T3T7TB +T2T3T7TC +T2T3T7TD +T2T3T7TE +T2T3T8T9 +T2T3T8TA +T2T3T8TB +T2T3T8TC +T2T3T8TD +T2T3T8TE +T2T3T9TA +T2T3T9TB +T2T3T9TC +T2T3T9TD +T2T3T9TE +T2T3TATB +T2T3TATC +T2T3TATD +T2T3TATE +T2T3TBTC +T2T3TBTD +T2T3TBTE +T2T3TCTD +T2T3TCTE +T2T3TDTE +T2T4T5T6 +T2T4T5T7 +T2T4T5T8 +T2T4T5T9 +T2T4T5TA +T2T4T5TB +T2T4T5TC +T2T4T5TD +T2T4T5TE +T2T4T6T7 +T2T4T6T8 +T2T4T6T9 +T2T4T6TA +T2T4T6TB +T2T4T6TC +T2T4T6TD +T2T4T6TE +T2T4T7T8 +T2T4T7T9 +T2T4T7TA +T2T4T7TB +T2T4T7TC +T2T4T7TD +T2T4T7TE +T2T4T8T9 +T2T4T8TA +T2T4T8TB +T2T4T8TC +T2T4T8TD +T2T4T8TE +T2T4T9TA +T2T4T9TB +T2T4T9TC +T2T4T9TD +T2T4T9TE +T2T4TATB +T2T4TATC +T2T4TATD +T2T4TATE +T2T4TBTC +T2T4TBTD +T2T4TBTE +T2T4TCTD +T2T4TCTE +T2T4TDTE +T2T5T6T7 +T2T5T6T8 +T2T5T6T9 +T2T5T6TA +T2T5T6TB +T2T5T6TC +T2T5T6TD +T2T5T6TE +T2T5T7T8 +T2T5T7T9 +T2T5T7TA +T2T5T7TB +T2T5T7TC +T2T5T7TD +T2T5T7TE +T2T5T8T9 +T2T5T8TA +T2T5T8TB +T2T5T8TC +T2T5T8TD +T2T5T8TE +T2T5T9TA +T2T5T9TB +T2T5T9TC +T2T5T9TD +T2T5T9TE +T2T5TATB +T2T5TATC +T2T5TATD +T2T5TATE +T2T5TBTC +T2T5TBTD +T2T5TBTE +T2T5TCTD +T2T5TCTE +T2T5TDTE +T2T6T7T8 +T2T6T7T9 +T2T6T7TA +T2T6T7TB +T2T6T7TC +T2T6T7TD +T2T6T7TE +T2T6T8T9 +T2T6T8TA +T2T6T8TB +T2T6T8TC +T2T6T8TD +T2T6T8TE +T2T6T9TA +T2T6T9TB +T2T6T9TC +T2T6T9TD +T2T6T9TE +T2T6TATB +T2T6TATC +T2T6TATD +T2T6TATE +T2T6TBTC +T2T6TBTD +T2T6TBTE +T2T6TCTD +T2T6TCTE +T2T6TDTE +T2T7T8T9 +T2T7T8TA +T2T7T8TB +T2T7T8TC +T2T7T8TD +T2T7T8TE +T2T7T9TA +T2T7T9TB +T2T7T9TC +T2T7T9TD +T2T7T9TE +T2T7TATB +T2T7TATC +T2T7TATD +T2T7TATE +T2T7TBTC +T2T7TBTD +T2T7TBTE +T2T7TCTD +T2T7TCTE +T2T7TDTE +T2T8T9TA +T2T8T9TB +T2T8T9TC +T2T8T9TD +T2T8T9TE +T2T8TATB +T2T8TATC +T2T8TATD +T2T8TATE +T2T8TBTC +T2T8TBTD +T2T8TBTE +T2T8TCTD +T2T8TCTE +T2T8TDTE +T2T9TATB +T2T9TATC +T2T9TATD +T2T9TATE +T2T9TBTC +T2T9TBTD +T2T9TBTE +T2T9TCTD +T2T9TCTE +T2T9TDTE +T2TATBTC +T2TATBTD +T2TATBTE +T2TATCTD +T2TATCTE +T2TATDTE +T2TBTCTD +T2TBTCTE +T2TBTDTE +T2TCTDTE +T3T4T5T6 +T3T4T5T7 +T3T4T5T8 +T3T4T5T9 +T3T4T5TA +T3T4T5TB +T3T4T5TC +T3T4T5TD +T3T4T5TE +T3T4T6T7 +T3T4T6T8 +T3T4T6T9 +T3T4T6TA +T3T4T6TB +T3T4T6TC +T3T4T6TD +T3T4T6TE +T3T4T7T8 +T3T4T7T9 +T3T4T7TA +T3T4T7TB +T3T4T7TC +T3T4T7TD +T3T4T7TE +T3T4T8T9 +T3T4T8TA +T3T4T8TB +T3T4T8TC +T3T4T8TD +T3T4T8TE +T3T4T9TA +T3T4T9TB +T3T4T9TC +T3T4T9TD +T3T4T9TE +T3T4TATB +T3T4TATC +T3T4TATD +T3T4TATE +T3T4TBTC +T3T4TBTD +T3T4TBTE +T3T4TCTD +T3T4TCTE +T3T4TDTE +T3T5T6T7 +T3T5T6T8 +T3T5T6T9 +T3T5T6TA +T3T5T6TB +T3T5T6TC +T3T5T6TD +T3T5T6TE +T3T5T7T8 +T3T5T7T9 +T3T5T7TA +T3T5T7TB +T3T5T7TC +T3T5T7TD +T3T5T7TE +T3T5T8T9 +T3T5T8TA +T3T5T8TB +T3T5T8TC +T3T5T8TD +T3T5T8TE +T3T5T9TA +T3T5T9TB +T3T5T9TC +T3T5T9TD +T3T5T9TE +T3T5TATB +T3T5TATC +T3T5TATD +T3T5TATE +T3T5TBTC +T3T5TBTD +T3T5TBTE +T3T5TCTD +T3T5TCTE +T3T5TDTE +T3T6T7T8 +T3T6T7T9 +T3T6T7TA +T3T6T7TB +T3T6T7TC +T3T6T7TD +T3T6T7TE +T3T6T8T9 +T3T6T8TA +T3T6T8TB +T3T6T8TC +T3T6T8TD +T3T6T8TE +T3T6T9TA +T3T6T9TB +T3T6T9TC +T3T6T9TD +T3T6T9TE +T3T6TATB +T3T6TATC +T3T6TATD +T3T6TATE +T3T6TBTC +T3T6TBTD +T3T6TBTE +T3T6TCTD +T3T6TCTE +T3T6TDTE +T3T7T8T9 +T3T7T8TA +T3T7T8TB +T3T7T8TC +T3T7T8TD +T3T7T8TE +T3T7T9TA +T3T7T9TB +T3T7T9TC +T3T7T9TD +T3T7T9TE +T3T7TATB +T3T7TATC +T3T7TATD +T3T7TATE +T3T7TBTC +T3T7TBTD +T3T7TBTE +T3T7TCTD +T3T7TCTE +T3T7TDTE +T3T8T9TA +T3T8T9TB +T3T8T9TC +T3T8T9TD +T3T8T9TE +T3T8TATB +T3T8TATC +T3T8TATD +T3T8TATE +T3T8TBTC +T3T8TBTD +T3T8TBTE +T3T8TCTD +T3T8TCTE +T3T8TDTE +T3T9TATB +T3T9TATC +T3T9TATD +T3T9TATE +T3T9TBTC +T3T9TBTD +T3T9TBTE +T3T9TCTD +T3T9TCTE +T3T9TDTE +T3TATBTC +T3TATBTD +T3TATBTE +T3TATCTD +T3TATCTE +T3TATDTE +T3TBTCTD +T3TBTCTE +T3TBTDTE +T3TCTDTE +T4T5T6T7 +T4T5T6T8 +T4T5T6T9 +T4T5T6TA +T4T5T6TB +T4T5T6TC +T4T5T6TD +T4T5T6TE +T4T5T7T8 +T4T5T7T9 +T4T5T7TA +T4T5T7TB +T4T5T7TC +T4T5T7TD +T4T5T7TE +T4T5T8T9 +T4T5T8TA +T4T5T8TB +T4T5T8TC +T4T5T8TD +T4T5T8TE +T4T5T9TA +T4T5T9TB +T4T5T9TC +T4T5T9TD +T4T5T9TE +T4T5TATB +T4T5TATC +T4T5TATD +T4T5TATE +T4T5TBTC +T4T5TBTD +T4T5TBTE +T4T5TCTD +T4T5TCTE +T4T5TDTE +T4T6T7T8 +T4T6T7T9 +T4T6T7TA +T4T6T7TB +T4T6T7TC +T4T6T7TD +T4T6T7TE +T4T6T8T9 +T4T6T8TA +T4T6T8TB +T4T6T8TC +T4T6T8TD +T4T6T8TE +T4T6T9TA +T4T6T9TB +T4T6T9TC +T4T6T9TD +T4T6T9TE +T4T6TATB +T4T6TATC +T4T6TATD +T4T6TATE +T4T6TBTC +T4T6TBTD +T4T6TBTE +T4T6TCTD +T4T6TCTE +T4T6TDTE +T4T7T8T9 +T4T7T8TA +T4T7T8TB +T4T7T8TC +T4T7T8TD +T4T7T8TE +T4T7T9TA +T4T7T9TB +T4T7T9TC +T4T7T9TD +T4T7T9TE +T4T7TATB +T4T7TATC +T4T7TATD +T4T7TATE +T4T7TBTC +T4T7TBTD +T4T7TBTE +T4T7TCTD +T4T7TCTE +T4T7TDTE +T4T8T9TA +T4T8T9TB +T4T8T9TC +T4T8T9TD +T4T8T9TE +T4T8TATB +T4T8TATC +T4T8TATD +T4T8TATE +T4T8TBTC +T4T8TBTD +T4T8TBTE +T4T8TCTD +T4T8TCTE +T4T8TDTE +T4T9TATB +T4T9TATC +T4T9TATD +T4T9TATE +T4T9TBTC +T4T9TBTD +T4T9TBTE +T4T9TCTD +T4T9TCTE +T4T9TDTE +T4TATBTC +T4TATBTD +T4TATBTE +T4TATCTD +T4TATCTE +T4TATDTE +T4TBTCTD +T4TBTCTE +T4TBTDTE +T4TCTDTE +T5T6T7T8 +T5T6T7T9 +T5T6T7TA +T5T6T7TB +T5T6T7TC +T5T6T7TD +T5T6T7TE +T5T6T8T9 +T5T6T8TA +T5T6T8TB +T5T6T8TC +T5T6T8TD +T5T6T8TE +T5T6T9TA +T5T6T9TB +T5T6T9TC +T5T6T9TD +T5T6T9TE +T5T6TATB +T5T6TATC +T5T6TATD +T5T6TATE +T5T6TBTC +T5T6TBTD +T5T6TBTE +T5T6TCTD +T5T6TCTE +T5T6TDTE +T5T7T8T9 +T5T7T8TA +T5T7T8TB +T5T7T8TC +T5T7T8TD +T5T7T8TE +T5T7T9TA +T5T7T9TB +T5T7T9TC +T5T7T9TD +T5T7T9TE +T5T7TATB +T5T7TATC +T5T7TATD +T5T7TATE +T5T7TBTC +T5T7TBTD +T5T7TBTE +T5T7TCTD +T5T7TCTE +T5T7TDTE +T5T8T9TA +T5T8T9TB +T5T8T9TC +T5T8T9TD +T5T8T9TE +T5T8TATB +T5T8TATC +T5T8TATD +T5T8TATE +T5T8TBTC +T5T8TBTD +T5T8TBTE +T5T8TCTD +T5T8TCTE +T5T8TDTE +T5T9TATB +T5T9TATC +T5T9TATD +T5T9TATE +T5T9TBTC +T5T9TBTD +T5T9TBTE +T5T9TCTD +T5T9TCTE +T5T9TDTE +T5TATBTC +T5TATBTD +T5TATBTE +T5TATCTD +T5TATCTE +T5TATDTE +T5TBTCTD +T5TBTCTE +T5TBTDTE +T5TCTDTE +T6T7T8T9 +T6T7T8TA +T6T7T8TB +T6T7T8TC +T6T7T8TD +T6T7T8TE +T6T7T9TA +T6T7T9TB +T6T7T9TC +T6T7T9TD +T6T7T9TE +T6T7TATB +T6T7TATC +T6T7TATD +T6T7TATE +T6T7TBTC +T6T7TBTD +T6T7TBTE +T6T7TCTD +T6T7TCTE +T6T7TDTE +T6T8T9TA +T6T8T9TB +T6T8T9TC +T6T8T9TD +T6T8T9TE +T6T8TATB +T6T8TATC +T6T8TATD +T6T8TATE +T6T8TBTC +T6T8TBTD +T6T8TBTE +T6T8TCTD +T6T8TCTE +T6T8TDTE +T6T9TATB +T6T9TATC +T6T9TATD +T6T9TATE +T6T9TBTC +T6T9TBTD +T6T9TBTE +T6T9TCTD +T6T9TCTE +T6T9TDTE +T6TATBTC +T6TATBTD +T6TATBTE +T6TATCTD +T6TATCTE +T6TATDTE +T6TBTCTD +T6TBTCTE +T6TBTDTE +T6TCTDTE +T7T8T9TA +T7T8T9TB +T7T8T9TC +T7T8T9TD +T7T8T9TE +T7T8TATB +T7T8TATC +T7T8TATD +T7T8TATE +T7T8TBTC +T7T8TBTD +T7T8TBTE +T7T8TCTD +T7T8TCTE +T7T8TDTE +T7T9TATB +T7T9TATC +T7T9TATD +T7T9TATE +T7T9TBTC +T7T9TBTD +T7T9TBTE +T7T9TCTD +T7T9TCTE +T7T9TDTE +T7TATBTC +T7TATBTD +T7TATBTE +T7TATCTD +T7TATCTE +T7TATDTE +T7TBTCTD +T7TBTCTE +T7TBTDTE +T7TCTDTE +T8T9TATB +T8T9TATC +T8T9TATD +T8T9TATE +T8T9TBTC +T8T9TBTD +T8T9TBTE +T8T9TCTD +T8T9TCTE +T8T9TDTE +T8TATBTC +T8TATBTD +T8TATBTE +T8TATCTD +T8TATCTE +T8TATDTE +T8TBTCTD +T8TBTCTE +T8TBTDTE +T8TCTDTE +T9TATBTC +T9TATBTD +T9TATBTE +T9TATCTD +T9TATCTE +T9TATDTE +T9TBTCTD +T9TBTCTE +T9TBTDTE +T9TCTDTE +TATBTCTD +TATBTCTE +TATBTDTE +TATCTDTE +TBTCTDTE diff --git a/rules/toggles5.rule b/rules/toggles5.rule new file mode 100644 index 0000000000..7a5a60a66f --- /dev/null +++ b/rules/toggles5.rule @@ -0,0 +1,4943 @@ +T0 +T1 +T2 +T3 +T4 +T5 +T6 +T7 +T8 +T9 +TA +TB +TC +TD +TE +T0T1 +T0T2 +T0T3 +T0T4 +T0T5 +T0T6 +T0T7 +T0T8 +T0T9 +T0TA +T0TB +T0TC +T0TD +T0TE +T1T2 +T1T3 +T1T4 +T1T5 +T1T6 +T1T7 +T1T8 +T1T9 +T1TA +T1TB +T1TC +T1TD +T1TE +T2T3 +T2T4 +T2T5 +T2T6 +T2T7 +T2T8 +T2T9 +T2TA +T2TB +T2TC +T2TD +T2TE +T3T4 +T3T5 +T3T6 +T3T7 +T3T8 +T3T9 +T3TA +T3TB +T3TC +T3TD +T3TE +T4T5 +T4T6 +T4T7 +T4T8 +T4T9 +T4TA +T4TB +T4TC +T4TD +T4TE +T5T6 +T5T7 +T5T8 +T5T9 +T5TA +T5TB +T5TC +T5TD +T5TE +T6T7 +T6T8 +T6T9 +T6TA +T6TB +T6TC +T6TD +T6TE +T7T8 +T7T9 +T7TA +T7TB +T7TC +T7TD +T7TE +T8T9 +T8TA +T8TB +T8TC +T8TD +T8TE +T9TA +T9TB +T9TC +T9TD +T9TE +TATB +TATC +TATD +TATE +TBTC +TBTD +TBTE +TCTD +TCTE +TDTE +T0T1T2 +T0T1T3 +T0T1T4 +T0T1T5 +T0T1T6 +T0T1T7 +T0T1T8 +T0T1T9 +T0T1TA +T0T1TB +T0T1TC +T0T1TD +T0T1TE +T0T2T3 +T0T2T4 +T0T2T5 +T0T2T6 +T0T2T7 +T0T2T8 +T0T2T9 +T0T2TA +T0T2TB +T0T2TC +T0T2TD +T0T2TE +T0T3T4 +T0T3T5 +T0T3T6 +T0T3T7 +T0T3T8 +T0T3T9 +T0T3TA +T0T3TB +T0T3TC +T0T3TD +T0T3TE +T0T4T5 +T0T4T6 +T0T4T7 +T0T4T8 +T0T4T9 +T0T4TA +T0T4TB +T0T4TC +T0T4TD +T0T4TE +T0T5T6 +T0T5T7 +T0T5T8 +T0T5T9 +T0T5TA +T0T5TB +T0T5TC +T0T5TD +T0T5TE +T0T6T7 +T0T6T8 +T0T6T9 +T0T6TA +T0T6TB +T0T6TC +T0T6TD +T0T6TE +T0T7T8 +T0T7T9 +T0T7TA +T0T7TB +T0T7TC +T0T7TD +T0T7TE +T0T8T9 +T0T8TA +T0T8TB +T0T8TC +T0T8TD +T0T8TE +T0T9TA +T0T9TB +T0T9TC +T0T9TD +T0T9TE +T0TATB +T0TATC +T0TATD +T0TATE +T0TBTC +T0TBTD +T0TBTE +T0TCTD +T0TCTE +T0TDTE +T1T2T3 +T1T2T4 +T1T2T5 +T1T2T6 +T1T2T7 +T1T2T8 +T1T2T9 +T1T2TA +T1T2TB +T1T2TC +T1T2TD +T1T2TE +T1T3T4 +T1T3T5 +T1T3T6 +T1T3T7 +T1T3T8 +T1T3T9 +T1T3TA +T1T3TB +T1T3TC +T1T3TD +T1T3TE +T1T4T5 +T1T4T6 +T1T4T7 +T1T4T8 +T1T4T9 +T1T4TA +T1T4TB +T1T4TC +T1T4TD +T1T4TE +T1T5T6 +T1T5T7 +T1T5T8 +T1T5T9 +T1T5TA +T1T5TB +T1T5TC +T1T5TD +T1T5TE +T1T6T7 +T1T6T8 +T1T6T9 +T1T6TA +T1T6TB +T1T6TC +T1T6TD +T1T6TE +T1T7T8 +T1T7T9 +T1T7TA +T1T7TB +T1T7TC +T1T7TD +T1T7TE +T1T8T9 +T1T8TA +T1T8TB +T1T8TC +T1T8TD +T1T8TE +T1T9TA +T1T9TB +T1T9TC +T1T9TD +T1T9TE +T1TATB +T1TATC +T1TATD +T1TATE +T1TBTC +T1TBTD +T1TBTE +T1TCTD +T1TCTE +T1TDTE +T2T3T4 +T2T3T5 +T2T3T6 +T2T3T7 +T2T3T8 +T2T3T9 +T2T3TA +T2T3TB +T2T3TC +T2T3TD +T2T3TE +T2T4T5 +T2T4T6 +T2T4T7 +T2T4T8 +T2T4T9 +T2T4TA +T2T4TB +T2T4TC +T2T4TD +T2T4TE +T2T5T6 +T2T5T7 +T2T5T8 +T2T5T9 +T2T5TA +T2T5TB +T2T5TC +T2T5TD +T2T5TE +T2T6T7 +T2T6T8 +T2T6T9 +T2T6TA +T2T6TB +T2T6TC +T2T6TD +T2T6TE +T2T7T8 +T2T7T9 +T2T7TA +T2T7TB +T2T7TC +T2T7TD +T2T7TE +T2T8T9 +T2T8TA +T2T8TB +T2T8TC +T2T8TD +T2T8TE +T2T9TA +T2T9TB +T2T9TC +T2T9TD +T2T9TE +T2TATB +T2TATC +T2TATD +T2TATE +T2TBTC +T2TBTD +T2TBTE +T2TCTD +T2TCTE +T2TDTE +T3T4T5 +T3T4T6 +T3T4T7 +T3T4T8 +T3T4T9 +T3T4TA +T3T4TB +T3T4TC +T3T4TD +T3T4TE +T3T5T6 +T3T5T7 +T3T5T8 +T3T5T9 +T3T5TA +T3T5TB +T3T5TC +T3T5TD +T3T5TE +T3T6T7 +T3T6T8 +T3T6T9 +T3T6TA +T3T6TB +T3T6TC +T3T6TD +T3T6TE +T3T7T8 +T3T7T9 +T3T7TA +T3T7TB +T3T7TC +T3T7TD +T3T7TE +T3T8T9 +T3T8TA +T3T8TB +T3T8TC +T3T8TD +T3T8TE +T3T9TA +T3T9TB +T3T9TC +T3T9TD +T3T9TE +T3TATB +T3TATC +T3TATD +T3TATE +T3TBTC +T3TBTD +T3TBTE +T3TCTD +T3TCTE +T3TDTE +T4T5T6 +T4T5T7 +T4T5T8 +T4T5T9 +T4T5TA +T4T5TB +T4T5TC +T4T5TD +T4T5TE +T4T6T7 +T4T6T8 +T4T6T9 +T4T6TA +T4T6TB +T4T6TC +T4T6TD +T4T6TE +T4T7T8 +T4T7T9 +T4T7TA +T4T7TB +T4T7TC +T4T7TD +T4T7TE +T4T8T9 +T4T8TA +T4T8TB +T4T8TC +T4T8TD +T4T8TE +T4T9TA +T4T9TB +T4T9TC +T4T9TD +T4T9TE +T4TATB +T4TATC +T4TATD +T4TATE +T4TBTC +T4TBTD +T4TBTE +T4TCTD +T4TCTE +T4TDTE +T5T6T7 +T5T6T8 +T5T6T9 +T5T6TA +T5T6TB +T5T6TC +T5T6TD +T5T6TE +T5T7T8 +T5T7T9 +T5T7TA +T5T7TB +T5T7TC +T5T7TD +T5T7TE +T5T8T9 +T5T8TA +T5T8TB +T5T8TC +T5T8TD +T5T8TE +T5T9TA +T5T9TB +T5T9TC +T5T9TD +T5T9TE +T5TATB +T5TATC +T5TATD +T5TATE +T5TBTC +T5TBTD +T5TBTE +T5TCTD +T5TCTE +T5TDTE +T6T7T8 +T6T7T9 +T6T7TA +T6T7TB +T6T7TC +T6T7TD +T6T7TE +T6T8T9 +T6T8TA +T6T8TB +T6T8TC +T6T8TD +T6T8TE +T6T9TA +T6T9TB +T6T9TC +T6T9TD +T6T9TE +T6TATB +T6TATC +T6TATD +T6TATE +T6TBTC +T6TBTD +T6TBTE +T6TCTD +T6TCTE +T6TDTE +T7T8T9 +T7T8TA +T7T8TB +T7T8TC +T7T8TD +T7T8TE +T7T9TA +T7T9TB +T7T9TC +T7T9TD +T7T9TE +T7TATB +T7TATC +T7TATD +T7TATE +T7TBTC +T7TBTD +T7TBTE +T7TCTD +T7TCTE +T7TDTE +T8T9TA +T8T9TB +T8T9TC +T8T9TD +T8T9TE +T8TATB +T8TATC +T8TATD +T8TATE +T8TBTC +T8TBTD +T8TBTE +T8TCTD +T8TCTE +T8TDTE +T9TATB +T9TATC +T9TATD +T9TATE +T9TBTC +T9TBTD +T9TBTE +T9TCTD +T9TCTE +T9TDTE +TATBTC +TATBTD +TATBTE +TATCTD +TATCTE +TATDTE +TBTCTD +TBTCTE +TBTDTE +TCTDTE +T0T1T2T3 +T0T1T2T4 +T0T1T2T5 +T0T1T2T6 +T0T1T2T7 +T0T1T2T8 +T0T1T2T9 +T0T1T2TA +T0T1T2TB +T0T1T2TC +T0T1T2TD +T0T1T2TE +T0T1T3T4 +T0T1T3T5 +T0T1T3T6 +T0T1T3T7 +T0T1T3T8 +T0T1T3T9 +T0T1T3TA +T0T1T3TB +T0T1T3TC +T0T1T3TD +T0T1T3TE +T0T1T4T5 +T0T1T4T6 +T0T1T4T7 +T0T1T4T8 +T0T1T4T9 +T0T1T4TA +T0T1T4TB +T0T1T4TC +T0T1T4TD +T0T1T4TE +T0T1T5T6 +T0T1T5T7 +T0T1T5T8 +T0T1T5T9 +T0T1T5TA +T0T1T5TB +T0T1T5TC +T0T1T5TD +T0T1T5TE +T0T1T6T7 +T0T1T6T8 +T0T1T6T9 +T0T1T6TA +T0T1T6TB +T0T1T6TC +T0T1T6TD +T0T1T6TE +T0T1T7T8 +T0T1T7T9 +T0T1T7TA +T0T1T7TB +T0T1T7TC +T0T1T7TD +T0T1T7TE +T0T1T8T9 +T0T1T8TA +T0T1T8TB +T0T1T8TC +T0T1T8TD +T0T1T8TE +T0T1T9TA +T0T1T9TB +T0T1T9TC +T0T1T9TD +T0T1T9TE +T0T1TATB +T0T1TATC +T0T1TATD +T0T1TATE +T0T1TBTC +T0T1TBTD +T0T1TBTE +T0T1TCTD +T0T1TCTE +T0T1TDTE +T0T2T3T4 +T0T2T3T5 +T0T2T3T6 +T0T2T3T7 +T0T2T3T8 +T0T2T3T9 +T0T2T3TA +T0T2T3TB +T0T2T3TC +T0T2T3TD +T0T2T3TE +T0T2T4T5 +T0T2T4T6 +T0T2T4T7 +T0T2T4T8 +T0T2T4T9 +T0T2T4TA +T0T2T4TB +T0T2T4TC +T0T2T4TD +T0T2T4TE +T0T2T5T6 +T0T2T5T7 +T0T2T5T8 +T0T2T5T9 +T0T2T5TA +T0T2T5TB +T0T2T5TC +T0T2T5TD +T0T2T5TE +T0T2T6T7 +T0T2T6T8 +T0T2T6T9 +T0T2T6TA +T0T2T6TB +T0T2T6TC +T0T2T6TD +T0T2T6TE +T0T2T7T8 +T0T2T7T9 +T0T2T7TA +T0T2T7TB +T0T2T7TC +T0T2T7TD +T0T2T7TE +T0T2T8T9 +T0T2T8TA +T0T2T8TB +T0T2T8TC +T0T2T8TD +T0T2T8TE +T0T2T9TA +T0T2T9TB +T0T2T9TC +T0T2T9TD +T0T2T9TE +T0T2TATB +T0T2TATC +T0T2TATD +T0T2TATE +T0T2TBTC +T0T2TBTD +T0T2TBTE +T0T2TCTD +T0T2TCTE +T0T2TDTE +T0T3T4T5 +T0T3T4T6 +T0T3T4T7 +T0T3T4T8 +T0T3T4T9 +T0T3T4TA +T0T3T4TB +T0T3T4TC +T0T3T4TD +T0T3T4TE +T0T3T5T6 +T0T3T5T7 +T0T3T5T8 +T0T3T5T9 +T0T3T5TA +T0T3T5TB +T0T3T5TC +T0T3T5TD +T0T3T5TE +T0T3T6T7 +T0T3T6T8 +T0T3T6T9 +T0T3T6TA +T0T3T6TB +T0T3T6TC +T0T3T6TD +T0T3T6TE +T0T3T7T8 +T0T3T7T9 +T0T3T7TA +T0T3T7TB +T0T3T7TC +T0T3T7TD +T0T3T7TE +T0T3T8T9 +T0T3T8TA +T0T3T8TB +T0T3T8TC +T0T3T8TD +T0T3T8TE +T0T3T9TA +T0T3T9TB +T0T3T9TC +T0T3T9TD +T0T3T9TE +T0T3TATB +T0T3TATC +T0T3TATD +T0T3TATE +T0T3TBTC +T0T3TBTD +T0T3TBTE +T0T3TCTD +T0T3TCTE +T0T3TDTE +T0T4T5T6 +T0T4T5T7 +T0T4T5T8 +T0T4T5T9 +T0T4T5TA +T0T4T5TB +T0T4T5TC +T0T4T5TD +T0T4T5TE +T0T4T6T7 +T0T4T6T8 +T0T4T6T9 +T0T4T6TA +T0T4T6TB +T0T4T6TC +T0T4T6TD +T0T4T6TE +T0T4T7T8 +T0T4T7T9 +T0T4T7TA +T0T4T7TB +T0T4T7TC +T0T4T7TD +T0T4T7TE +T0T4T8T9 +T0T4T8TA +T0T4T8TB +T0T4T8TC +T0T4T8TD +T0T4T8TE +T0T4T9TA +T0T4T9TB +T0T4T9TC +T0T4T9TD +T0T4T9TE +T0T4TATB +T0T4TATC +T0T4TATD +T0T4TATE +T0T4TBTC +T0T4TBTD +T0T4TBTE +T0T4TCTD +T0T4TCTE +T0T4TDTE +T0T5T6T7 +T0T5T6T8 +T0T5T6T9 +T0T5T6TA +T0T5T6TB +T0T5T6TC +T0T5T6TD +T0T5T6TE +T0T5T7T8 +T0T5T7T9 +T0T5T7TA +T0T5T7TB +T0T5T7TC +T0T5T7TD +T0T5T7TE +T0T5T8T9 +T0T5T8TA +T0T5T8TB +T0T5T8TC +T0T5T8TD +T0T5T8TE +T0T5T9TA +T0T5T9TB +T0T5T9TC +T0T5T9TD +T0T5T9TE +T0T5TATB +T0T5TATC +T0T5TATD +T0T5TATE +T0T5TBTC +T0T5TBTD +T0T5TBTE +T0T5TCTD +T0T5TCTE +T0T5TDTE +T0T6T7T8 +T0T6T7T9 +T0T6T7TA +T0T6T7TB +T0T6T7TC +T0T6T7TD +T0T6T7TE +T0T6T8T9 +T0T6T8TA +T0T6T8TB +T0T6T8TC +T0T6T8TD +T0T6T8TE +T0T6T9TA +T0T6T9TB +T0T6T9TC +T0T6T9TD +T0T6T9TE +T0T6TATB +T0T6TATC +T0T6TATD +T0T6TATE +T0T6TBTC +T0T6TBTD +T0T6TBTE +T0T6TCTD +T0T6TCTE +T0T6TDTE +T0T7T8T9 +T0T7T8TA +T0T7T8TB +T0T7T8TC +T0T7T8TD +T0T7T8TE +T0T7T9TA +T0T7T9TB +T0T7T9TC +T0T7T9TD +T0T7T9TE +T0T7TATB +T0T7TATC +T0T7TATD +T0T7TATE +T0T7TBTC +T0T7TBTD +T0T7TBTE +T0T7TCTD +T0T7TCTE +T0T7TDTE +T0T8T9TA +T0T8T9TB +T0T8T9TC +T0T8T9TD +T0T8T9TE +T0T8TATB +T0T8TATC +T0T8TATD +T0T8TATE +T0T8TBTC +T0T8TBTD +T0T8TBTE +T0T8TCTD +T0T8TCTE +T0T8TDTE +T0T9TATB +T0T9TATC +T0T9TATD +T0T9TATE +T0T9TBTC +T0T9TBTD +T0T9TBTE +T0T9TCTD +T0T9TCTE +T0T9TDTE +T0TATBTC +T0TATBTD +T0TATBTE +T0TATCTD +T0TATCTE +T0TATDTE +T0TBTCTD +T0TBTCTE +T0TBTDTE +T0TCTDTE +T1T2T3T4 +T1T2T3T5 +T1T2T3T6 +T1T2T3T7 +T1T2T3T8 +T1T2T3T9 +T1T2T3TA +T1T2T3TB +T1T2T3TC +T1T2T3TD +T1T2T3TE +T1T2T4T5 +T1T2T4T6 +T1T2T4T7 +T1T2T4T8 +T1T2T4T9 +T1T2T4TA +T1T2T4TB +T1T2T4TC +T1T2T4TD +T1T2T4TE +T1T2T5T6 +T1T2T5T7 +T1T2T5T8 +T1T2T5T9 +T1T2T5TA +T1T2T5TB +T1T2T5TC +T1T2T5TD +T1T2T5TE +T1T2T6T7 +T1T2T6T8 +T1T2T6T9 +T1T2T6TA +T1T2T6TB +T1T2T6TC +T1T2T6TD +T1T2T6TE +T1T2T7T8 +T1T2T7T9 +T1T2T7TA +T1T2T7TB +T1T2T7TC +T1T2T7TD +T1T2T7TE +T1T2T8T9 +T1T2T8TA +T1T2T8TB +T1T2T8TC +T1T2T8TD +T1T2T8TE +T1T2T9TA +T1T2T9TB +T1T2T9TC +T1T2T9TD +T1T2T9TE +T1T2TATB +T1T2TATC +T1T2TATD +T1T2TATE +T1T2TBTC +T1T2TBTD +T1T2TBTE +T1T2TCTD +T1T2TCTE +T1T2TDTE +T1T3T4T5 +T1T3T4T6 +T1T3T4T7 +T1T3T4T8 +T1T3T4T9 +T1T3T4TA +T1T3T4TB +T1T3T4TC +T1T3T4TD +T1T3T4TE +T1T3T5T6 +T1T3T5T7 +T1T3T5T8 +T1T3T5T9 +T1T3T5TA +T1T3T5TB +T1T3T5TC +T1T3T5TD +T1T3T5TE +T1T3T6T7 +T1T3T6T8 +T1T3T6T9 +T1T3T6TA +T1T3T6TB +T1T3T6TC +T1T3T6TD +T1T3T6TE +T1T3T7T8 +T1T3T7T9 +T1T3T7TA +T1T3T7TB +T1T3T7TC +T1T3T7TD +T1T3T7TE +T1T3T8T9 +T1T3T8TA +T1T3T8TB +T1T3T8TC +T1T3T8TD +T1T3T8TE +T1T3T9TA +T1T3T9TB +T1T3T9TC +T1T3T9TD +T1T3T9TE +T1T3TATB +T1T3TATC +T1T3TATD +T1T3TATE +T1T3TBTC +T1T3TBTD +T1T3TBTE +T1T3TCTD +T1T3TCTE +T1T3TDTE +T1T4T5T6 +T1T4T5T7 +T1T4T5T8 +T1T4T5T9 +T1T4T5TA +T1T4T5TB +T1T4T5TC +T1T4T5TD +T1T4T5TE +T1T4T6T7 +T1T4T6T8 +T1T4T6T9 +T1T4T6TA +T1T4T6TB +T1T4T6TC +T1T4T6TD +T1T4T6TE +T1T4T7T8 +T1T4T7T9 +T1T4T7TA +T1T4T7TB +T1T4T7TC +T1T4T7TD +T1T4T7TE +T1T4T8T9 +T1T4T8TA +T1T4T8TB +T1T4T8TC +T1T4T8TD +T1T4T8TE +T1T4T9TA +T1T4T9TB +T1T4T9TC +T1T4T9TD +T1T4T9TE +T1T4TATB +T1T4TATC +T1T4TATD +T1T4TATE +T1T4TBTC +T1T4TBTD +T1T4TBTE +T1T4TCTD +T1T4TCTE +T1T4TDTE +T1T5T6T7 +T1T5T6T8 +T1T5T6T9 +T1T5T6TA +T1T5T6TB +T1T5T6TC +T1T5T6TD +T1T5T6TE +T1T5T7T8 +T1T5T7T9 +T1T5T7TA +T1T5T7TB +T1T5T7TC +T1T5T7TD +T1T5T7TE +T1T5T8T9 +T1T5T8TA +T1T5T8TB +T1T5T8TC +T1T5T8TD +T1T5T8TE +T1T5T9TA +T1T5T9TB +T1T5T9TC +T1T5T9TD +T1T5T9TE +T1T5TATB +T1T5TATC +T1T5TATD +T1T5TATE +T1T5TBTC +T1T5TBTD +T1T5TBTE +T1T5TCTD +T1T5TCTE +T1T5TDTE +T1T6T7T8 +T1T6T7T9 +T1T6T7TA +T1T6T7TB +T1T6T7TC +T1T6T7TD +T1T6T7TE +T1T6T8T9 +T1T6T8TA +T1T6T8TB +T1T6T8TC +T1T6T8TD +T1T6T8TE +T1T6T9TA +T1T6T9TB +T1T6T9TC +T1T6T9TD +T1T6T9TE +T1T6TATB +T1T6TATC +T1T6TATD +T1T6TATE +T1T6TBTC +T1T6TBTD +T1T6TBTE +T1T6TCTD +T1T6TCTE +T1T6TDTE +T1T7T8T9 +T1T7T8TA +T1T7T8TB +T1T7T8TC +T1T7T8TD +T1T7T8TE +T1T7T9TA +T1T7T9TB +T1T7T9TC +T1T7T9TD +T1T7T9TE +T1T7TATB +T1T7TATC +T1T7TATD +T1T7TATE +T1T7TBTC +T1T7TBTD +T1T7TBTE +T1T7TCTD +T1T7TCTE +T1T7TDTE +T1T8T9TA +T1T8T9TB +T1T8T9TC +T1T8T9TD +T1T8T9TE +T1T8TATB +T1T8TATC +T1T8TATD +T1T8TATE +T1T8TBTC +T1T8TBTD +T1T8TBTE +T1T8TCTD +T1T8TCTE +T1T8TDTE +T1T9TATB +T1T9TATC +T1T9TATD +T1T9TATE +T1T9TBTC +T1T9TBTD +T1T9TBTE +T1T9TCTD +T1T9TCTE +T1T9TDTE +T1TATBTC +T1TATBTD +T1TATBTE +T1TATCTD +T1TATCTE +T1TATDTE +T1TBTCTD +T1TBTCTE +T1TBTDTE +T1TCTDTE +T2T3T4T5 +T2T3T4T6 +T2T3T4T7 +T2T3T4T8 +T2T3T4T9 +T2T3T4TA +T2T3T4TB +T2T3T4TC +T2T3T4TD +T2T3T4TE +T2T3T5T6 +T2T3T5T7 +T2T3T5T8 +T2T3T5T9 +T2T3T5TA +T2T3T5TB +T2T3T5TC +T2T3T5TD +T2T3T5TE +T2T3T6T7 +T2T3T6T8 +T2T3T6T9 +T2T3T6TA +T2T3T6TB +T2T3T6TC +T2T3T6TD +T2T3T6TE +T2T3T7T8 +T2T3T7T9 +T2T3T7TA +T2T3T7TB +T2T3T7TC +T2T3T7TD +T2T3T7TE +T2T3T8T9 +T2T3T8TA +T2T3T8TB +T2T3T8TC +T2T3T8TD +T2T3T8TE +T2T3T9TA +T2T3T9TB +T2T3T9TC +T2T3T9TD +T2T3T9TE +T2T3TATB +T2T3TATC +T2T3TATD +T2T3TATE +T2T3TBTC +T2T3TBTD +T2T3TBTE +T2T3TCTD +T2T3TCTE +T2T3TDTE +T2T4T5T6 +T2T4T5T7 +T2T4T5T8 +T2T4T5T9 +T2T4T5TA +T2T4T5TB +T2T4T5TC +T2T4T5TD +T2T4T5TE +T2T4T6T7 +T2T4T6T8 +T2T4T6T9 +T2T4T6TA +T2T4T6TB +T2T4T6TC +T2T4T6TD +T2T4T6TE +T2T4T7T8 +T2T4T7T9 +T2T4T7TA +T2T4T7TB +T2T4T7TC +T2T4T7TD +T2T4T7TE +T2T4T8T9 +T2T4T8TA +T2T4T8TB +T2T4T8TC +T2T4T8TD +T2T4T8TE +T2T4T9TA +T2T4T9TB +T2T4T9TC +T2T4T9TD +T2T4T9TE +T2T4TATB +T2T4TATC +T2T4TATD +T2T4TATE +T2T4TBTC +T2T4TBTD +T2T4TBTE +T2T4TCTD +T2T4TCTE +T2T4TDTE +T2T5T6T7 +T2T5T6T8 +T2T5T6T9 +T2T5T6TA +T2T5T6TB +T2T5T6TC +T2T5T6TD +T2T5T6TE +T2T5T7T8 +T2T5T7T9 +T2T5T7TA +T2T5T7TB +T2T5T7TC +T2T5T7TD +T2T5T7TE +T2T5T8T9 +T2T5T8TA +T2T5T8TB +T2T5T8TC +T2T5T8TD +T2T5T8TE +T2T5T9TA +T2T5T9TB +T2T5T9TC +T2T5T9TD +T2T5T9TE +T2T5TATB +T2T5TATC +T2T5TATD +T2T5TATE +T2T5TBTC +T2T5TBTD +T2T5TBTE +T2T5TCTD +T2T5TCTE +T2T5TDTE +T2T6T7T8 +T2T6T7T9 +T2T6T7TA +T2T6T7TB +T2T6T7TC +T2T6T7TD +T2T6T7TE +T2T6T8T9 +T2T6T8TA +T2T6T8TB +T2T6T8TC +T2T6T8TD +T2T6T8TE +T2T6T9TA +T2T6T9TB +T2T6T9TC +T2T6T9TD +T2T6T9TE +T2T6TATB +T2T6TATC +T2T6TATD +T2T6TATE +T2T6TBTC +T2T6TBTD +T2T6TBTE +T2T6TCTD +T2T6TCTE +T2T6TDTE +T2T7T8T9 +T2T7T8TA +T2T7T8TB +T2T7T8TC +T2T7T8TD +T2T7T8TE +T2T7T9TA +T2T7T9TB +T2T7T9TC +T2T7T9TD +T2T7T9TE +T2T7TATB +T2T7TATC +T2T7TATD +T2T7TATE +T2T7TBTC +T2T7TBTD +T2T7TBTE +T2T7TCTD +T2T7TCTE +T2T7TDTE +T2T8T9TA +T2T8T9TB +T2T8T9TC +T2T8T9TD +T2T8T9TE +T2T8TATB +T2T8TATC +T2T8TATD +T2T8TATE +T2T8TBTC +T2T8TBTD +T2T8TBTE +T2T8TCTD +T2T8TCTE +T2T8TDTE +T2T9TATB +T2T9TATC +T2T9TATD +T2T9TATE +T2T9TBTC +T2T9TBTD +T2T9TBTE +T2T9TCTD +T2T9TCTE +T2T9TDTE +T2TATBTC +T2TATBTD +T2TATBTE +T2TATCTD +T2TATCTE +T2TATDTE +T2TBTCTD +T2TBTCTE +T2TBTDTE +T2TCTDTE +T3T4T5T6 +T3T4T5T7 +T3T4T5T8 +T3T4T5T9 +T3T4T5TA +T3T4T5TB +T3T4T5TC +T3T4T5TD +T3T4T5TE +T3T4T6T7 +T3T4T6T8 +T3T4T6T9 +T3T4T6TA +T3T4T6TB +T3T4T6TC +T3T4T6TD +T3T4T6TE +T3T4T7T8 +T3T4T7T9 +T3T4T7TA +T3T4T7TB +T3T4T7TC +T3T4T7TD +T3T4T7TE +T3T4T8T9 +T3T4T8TA +T3T4T8TB +T3T4T8TC +T3T4T8TD +T3T4T8TE +T3T4T9TA +T3T4T9TB +T3T4T9TC +T3T4T9TD +T3T4T9TE +T3T4TATB +T3T4TATC +T3T4TATD +T3T4TATE +T3T4TBTC +T3T4TBTD +T3T4TBTE +T3T4TCTD +T3T4TCTE +T3T4TDTE +T3T5T6T7 +T3T5T6T8 +T3T5T6T9 +T3T5T6TA +T3T5T6TB +T3T5T6TC +T3T5T6TD +T3T5T6TE +T3T5T7T8 +T3T5T7T9 +T3T5T7TA +T3T5T7TB +T3T5T7TC +T3T5T7TD +T3T5T7TE +T3T5T8T9 +T3T5T8TA +T3T5T8TB +T3T5T8TC +T3T5T8TD +T3T5T8TE +T3T5T9TA +T3T5T9TB +T3T5T9TC +T3T5T9TD +T3T5T9TE +T3T5TATB +T3T5TATC +T3T5TATD +T3T5TATE +T3T5TBTC +T3T5TBTD +T3T5TBTE +T3T5TCTD +T3T5TCTE +T3T5TDTE +T3T6T7T8 +T3T6T7T9 +T3T6T7TA +T3T6T7TB +T3T6T7TC +T3T6T7TD +T3T6T7TE +T3T6T8T9 +T3T6T8TA +T3T6T8TB +T3T6T8TC +T3T6T8TD +T3T6T8TE +T3T6T9TA +T3T6T9TB +T3T6T9TC +T3T6T9TD +T3T6T9TE +T3T6TATB +T3T6TATC +T3T6TATD +T3T6TATE +T3T6TBTC +T3T6TBTD +T3T6TBTE +T3T6TCTD +T3T6TCTE +T3T6TDTE +T3T7T8T9 +T3T7T8TA +T3T7T8TB +T3T7T8TC +T3T7T8TD +T3T7T8TE +T3T7T9TA +T3T7T9TB +T3T7T9TC +T3T7T9TD +T3T7T9TE +T3T7TATB +T3T7TATC +T3T7TATD +T3T7TATE +T3T7TBTC +T3T7TBTD +T3T7TBTE +T3T7TCTD +T3T7TCTE +T3T7TDTE +T3T8T9TA +T3T8T9TB +T3T8T9TC +T3T8T9TD +T3T8T9TE +T3T8TATB +T3T8TATC +T3T8TATD +T3T8TATE +T3T8TBTC +T3T8TBTD +T3T8TBTE +T3T8TCTD +T3T8TCTE +T3T8TDTE +T3T9TATB +T3T9TATC +T3T9TATD +T3T9TATE +T3T9TBTC +T3T9TBTD +T3T9TBTE +T3T9TCTD +T3T9TCTE +T3T9TDTE +T3TATBTC +T3TATBTD +T3TATBTE +T3TATCTD +T3TATCTE +T3TATDTE +T3TBTCTD +T3TBTCTE +T3TBTDTE +T3TCTDTE +T4T5T6T7 +T4T5T6T8 +T4T5T6T9 +T4T5T6TA +T4T5T6TB +T4T5T6TC +T4T5T6TD +T4T5T6TE +T4T5T7T8 +T4T5T7T9 +T4T5T7TA +T4T5T7TB +T4T5T7TC +T4T5T7TD +T4T5T7TE +T4T5T8T9 +T4T5T8TA +T4T5T8TB +T4T5T8TC +T4T5T8TD +T4T5T8TE +T4T5T9TA +T4T5T9TB +T4T5T9TC +T4T5T9TD +T4T5T9TE +T4T5TATB +T4T5TATC +T4T5TATD +T4T5TATE +T4T5TBTC +T4T5TBTD +T4T5TBTE +T4T5TCTD +T4T5TCTE +T4T5TDTE +T4T6T7T8 +T4T6T7T9 +T4T6T7TA +T4T6T7TB +T4T6T7TC +T4T6T7TD +T4T6T7TE +T4T6T8T9 +T4T6T8TA +T4T6T8TB +T4T6T8TC +T4T6T8TD +T4T6T8TE +T4T6T9TA +T4T6T9TB +T4T6T9TC +T4T6T9TD +T4T6T9TE +T4T6TATB +T4T6TATC +T4T6TATD +T4T6TATE +T4T6TBTC +T4T6TBTD +T4T6TBTE +T4T6TCTD +T4T6TCTE +T4T6TDTE +T4T7T8T9 +T4T7T8TA +T4T7T8TB +T4T7T8TC +T4T7T8TD +T4T7T8TE +T4T7T9TA +T4T7T9TB +T4T7T9TC +T4T7T9TD +T4T7T9TE +T4T7TATB +T4T7TATC +T4T7TATD +T4T7TATE +T4T7TBTC +T4T7TBTD +T4T7TBTE +T4T7TCTD +T4T7TCTE +T4T7TDTE +T4T8T9TA +T4T8T9TB +T4T8T9TC +T4T8T9TD +T4T8T9TE +T4T8TATB +T4T8TATC +T4T8TATD +T4T8TATE +T4T8TBTC +T4T8TBTD +T4T8TBTE +T4T8TCTD +T4T8TCTE +T4T8TDTE +T4T9TATB +T4T9TATC +T4T9TATD +T4T9TATE +T4T9TBTC +T4T9TBTD +T4T9TBTE +T4T9TCTD +T4T9TCTE +T4T9TDTE +T4TATBTC +T4TATBTD +T4TATBTE +T4TATCTD +T4TATCTE +T4TATDTE +T4TBTCTD +T4TBTCTE +T4TBTDTE +T4TCTDTE +T5T6T7T8 +T5T6T7T9 +T5T6T7TA +T5T6T7TB +T5T6T7TC +T5T6T7TD +T5T6T7TE +T5T6T8T9 +T5T6T8TA +T5T6T8TB +T5T6T8TC +T5T6T8TD +T5T6T8TE +T5T6T9TA +T5T6T9TB +T5T6T9TC +T5T6T9TD +T5T6T9TE +T5T6TATB +T5T6TATC +T5T6TATD +T5T6TATE +T5T6TBTC +T5T6TBTD +T5T6TBTE +T5T6TCTD +T5T6TCTE +T5T6TDTE +T5T7T8T9 +T5T7T8TA +T5T7T8TB +T5T7T8TC +T5T7T8TD +T5T7T8TE +T5T7T9TA +T5T7T9TB +T5T7T9TC +T5T7T9TD +T5T7T9TE +T5T7TATB +T5T7TATC +T5T7TATD +T5T7TATE +T5T7TBTC +T5T7TBTD +T5T7TBTE +T5T7TCTD +T5T7TCTE +T5T7TDTE +T5T8T9TA +T5T8T9TB +T5T8T9TC +T5T8T9TD +T5T8T9TE +T5T8TATB +T5T8TATC +T5T8TATD +T5T8TATE +T5T8TBTC +T5T8TBTD +T5T8TBTE +T5T8TCTD +T5T8TCTE +T5T8TDTE +T5T9TATB +T5T9TATC +T5T9TATD +T5T9TATE +T5T9TBTC +T5T9TBTD +T5T9TBTE +T5T9TCTD +T5T9TCTE +T5T9TDTE +T5TATBTC +T5TATBTD +T5TATBTE +T5TATCTD +T5TATCTE +T5TATDTE +T5TBTCTD +T5TBTCTE +T5TBTDTE +T5TCTDTE +T6T7T8T9 +T6T7T8TA +T6T7T8TB +T6T7T8TC +T6T7T8TD +T6T7T8TE +T6T7T9TA +T6T7T9TB +T6T7T9TC +T6T7T9TD +T6T7T9TE +T6T7TATB +T6T7TATC +T6T7TATD +T6T7TATE +T6T7TBTC +T6T7TBTD +T6T7TBTE +T6T7TCTD +T6T7TCTE +T6T7TDTE +T6T8T9TA +T6T8T9TB +T6T8T9TC +T6T8T9TD +T6T8T9TE +T6T8TATB +T6T8TATC +T6T8TATD +T6T8TATE +T6T8TBTC +T6T8TBTD +T6T8TBTE +T6T8TCTD +T6T8TCTE +T6T8TDTE +T6T9TATB +T6T9TATC +T6T9TATD +T6T9TATE +T6T9TBTC +T6T9TBTD +T6T9TBTE +T6T9TCTD +T6T9TCTE +T6T9TDTE +T6TATBTC +T6TATBTD +T6TATBTE +T6TATCTD +T6TATCTE +T6TATDTE +T6TBTCTD +T6TBTCTE +T6TBTDTE +T6TCTDTE +T7T8T9TA +T7T8T9TB +T7T8T9TC +T7T8T9TD +T7T8T9TE +T7T8TATB +T7T8TATC +T7T8TATD +T7T8TATE +T7T8TBTC +T7T8TBTD +T7T8TBTE +T7T8TCTD +T7T8TCTE +T7T8TDTE +T7T9TATB +T7T9TATC +T7T9TATD +T7T9TATE +T7T9TBTC +T7T9TBTD +T7T9TBTE +T7T9TCTD +T7T9TCTE +T7T9TDTE +T7TATBTC +T7TATBTD +T7TATBTE +T7TATCTD +T7TATCTE +T7TATDTE +T7TBTCTD +T7TBTCTE +T7TBTDTE +T7TCTDTE +T8T9TATB +T8T9TATC +T8T9TATD +T8T9TATE +T8T9TBTC +T8T9TBTD +T8T9TBTE +T8T9TCTD +T8T9TCTE +T8T9TDTE +T8TATBTC +T8TATBTD +T8TATBTE +T8TATCTD +T8TATCTE +T8TATDTE +T8TBTCTD +T8TBTCTE +T8TBTDTE +T8TCTDTE +T9TATBTC +T9TATBTD +T9TATBTE +T9TATCTD +T9TATCTE +T9TATDTE +T9TBTCTD +T9TBTCTE +T9TBTDTE +T9TCTDTE +TATBTCTD +TATBTCTE +TATBTDTE +TATCTDTE +TBTCTDTE +T0T1T2T3T4 +T0T1T2T3T5 +T0T1T2T3T6 +T0T1T2T3T7 +T0T1T2T3T8 +T0T1T2T3T9 +T0T1T2T3TA +T0T1T2T3TB +T0T1T2T3TC +T0T1T2T3TD +T0T1T2T3TE +T0T1T2T4T5 +T0T1T2T4T6 +T0T1T2T4T7 +T0T1T2T4T8 +T0T1T2T4T9 +T0T1T2T4TA +T0T1T2T4TB +T0T1T2T4TC +T0T1T2T4TD +T0T1T2T4TE +T0T1T2T5T6 +T0T1T2T5T7 +T0T1T2T5T8 +T0T1T2T5T9 +T0T1T2T5TA +T0T1T2T5TB +T0T1T2T5TC +T0T1T2T5TD +T0T1T2T5TE +T0T1T2T6T7 +T0T1T2T6T8 +T0T1T2T6T9 +T0T1T2T6TA +T0T1T2T6TB +T0T1T2T6TC +T0T1T2T6TD +T0T1T2T6TE +T0T1T2T7T8 +T0T1T2T7T9 +T0T1T2T7TA +T0T1T2T7TB +T0T1T2T7TC +T0T1T2T7TD +T0T1T2T7TE +T0T1T2T8T9 +T0T1T2T8TA +T0T1T2T8TB +T0T1T2T8TC +T0T1T2T8TD +T0T1T2T8TE +T0T1T2T9TA +T0T1T2T9TB +T0T1T2T9TC +T0T1T2T9TD +T0T1T2T9TE +T0T1T2TATB +T0T1T2TATC +T0T1T2TATD +T0T1T2TATE +T0T1T2TBTC +T0T1T2TBTD +T0T1T2TBTE +T0T1T2TCTD +T0T1T2TCTE +T0T1T2TDTE +T0T1T3T4T5 +T0T1T3T4T6 +T0T1T3T4T7 +T0T1T3T4T8 +T0T1T3T4T9 +T0T1T3T4TA +T0T1T3T4TB +T0T1T3T4TC +T0T1T3T4TD +T0T1T3T4TE +T0T1T3T5T6 +T0T1T3T5T7 +T0T1T3T5T8 +T0T1T3T5T9 +T0T1T3T5TA +T0T1T3T5TB +T0T1T3T5TC +T0T1T3T5TD +T0T1T3T5TE +T0T1T3T6T7 +T0T1T3T6T8 +T0T1T3T6T9 +T0T1T3T6TA +T0T1T3T6TB +T0T1T3T6TC +T0T1T3T6TD +T0T1T3T6TE +T0T1T3T7T8 +T0T1T3T7T9 +T0T1T3T7TA +T0T1T3T7TB +T0T1T3T7TC +T0T1T3T7TD +T0T1T3T7TE +T0T1T3T8T9 +T0T1T3T8TA +T0T1T3T8TB +T0T1T3T8TC +T0T1T3T8TD +T0T1T3T8TE +T0T1T3T9TA +T0T1T3T9TB +T0T1T3T9TC +T0T1T3T9TD +T0T1T3T9TE +T0T1T3TATB +T0T1T3TATC +T0T1T3TATD +T0T1T3TATE +T0T1T3TBTC +T0T1T3TBTD +T0T1T3TBTE +T0T1T3TCTD +T0T1T3TCTE +T0T1T3TDTE +T0T1T4T5T6 +T0T1T4T5T7 +T0T1T4T5T8 +T0T1T4T5T9 +T0T1T4T5TA +T0T1T4T5TB +T0T1T4T5TC +T0T1T4T5TD +T0T1T4T5TE +T0T1T4T6T7 +T0T1T4T6T8 +T0T1T4T6T9 +T0T1T4T6TA +T0T1T4T6TB +T0T1T4T6TC +T0T1T4T6TD +T0T1T4T6TE +T0T1T4T7T8 +T0T1T4T7T9 +T0T1T4T7TA +T0T1T4T7TB +T0T1T4T7TC +T0T1T4T7TD +T0T1T4T7TE +T0T1T4T8T9 +T0T1T4T8TA +T0T1T4T8TB +T0T1T4T8TC +T0T1T4T8TD +T0T1T4T8TE +T0T1T4T9TA +T0T1T4T9TB +T0T1T4T9TC +T0T1T4T9TD +T0T1T4T9TE +T0T1T4TATB +T0T1T4TATC +T0T1T4TATD +T0T1T4TATE +T0T1T4TBTC +T0T1T4TBTD +T0T1T4TBTE +T0T1T4TCTD +T0T1T4TCTE +T0T1T4TDTE +T0T1T5T6T7 +T0T1T5T6T8 +T0T1T5T6T9 +T0T1T5T6TA +T0T1T5T6TB +T0T1T5T6TC +T0T1T5T6TD +T0T1T5T6TE +T0T1T5T7T8 +T0T1T5T7T9 +T0T1T5T7TA +T0T1T5T7TB +T0T1T5T7TC +T0T1T5T7TD +T0T1T5T7TE +T0T1T5T8T9 +T0T1T5T8TA +T0T1T5T8TB +T0T1T5T8TC +T0T1T5T8TD +T0T1T5T8TE +T0T1T5T9TA +T0T1T5T9TB +T0T1T5T9TC +T0T1T5T9TD +T0T1T5T9TE +T0T1T5TATB +T0T1T5TATC +T0T1T5TATD +T0T1T5TATE +T0T1T5TBTC +T0T1T5TBTD +T0T1T5TBTE +T0T1T5TCTD +T0T1T5TCTE +T0T1T5TDTE +T0T1T6T7T8 +T0T1T6T7T9 +T0T1T6T7TA +T0T1T6T7TB +T0T1T6T7TC +T0T1T6T7TD +T0T1T6T7TE +T0T1T6T8T9 +T0T1T6T8TA +T0T1T6T8TB +T0T1T6T8TC +T0T1T6T8TD +T0T1T6T8TE +T0T1T6T9TA +T0T1T6T9TB +T0T1T6T9TC +T0T1T6T9TD +T0T1T6T9TE +T0T1T6TATB +T0T1T6TATC +T0T1T6TATD +T0T1T6TATE +T0T1T6TBTC +T0T1T6TBTD +T0T1T6TBTE +T0T1T6TCTD +T0T1T6TCTE +T0T1T6TDTE +T0T1T7T8T9 +T0T1T7T8TA +T0T1T7T8TB +T0T1T7T8TC +T0T1T7T8TD +T0T1T7T8TE +T0T1T7T9TA +T0T1T7T9TB +T0T1T7T9TC +T0T1T7T9TD +T0T1T7T9TE +T0T1T7TATB +T0T1T7TATC +T0T1T7TATD +T0T1T7TATE +T0T1T7TBTC +T0T1T7TBTD +T0T1T7TBTE +T0T1T7TCTD +T0T1T7TCTE +T0T1T7TDTE +T0T1T8T9TA +T0T1T8T9TB +T0T1T8T9TC +T0T1T8T9TD +T0T1T8T9TE +T0T1T8TATB +T0T1T8TATC +T0T1T8TATD +T0T1T8TATE +T0T1T8TBTC +T0T1T8TBTD +T0T1T8TBTE +T0T1T8TCTD +T0T1T8TCTE +T0T1T8TDTE +T0T1T9TATB +T0T1T9TATC +T0T1T9TATD +T0T1T9TATE +T0T1T9TBTC +T0T1T9TBTD +T0T1T9TBTE +T0T1T9TCTD +T0T1T9TCTE +T0T1T9TDTE +T0T1TATBTC +T0T1TATBTD +T0T1TATBTE +T0T1TATCTD +T0T1TATCTE +T0T1TATDTE +T0T1TBTCTD +T0T1TBTCTE +T0T1TBTDTE +T0T1TCTDTE +T0T2T3T4T5 +T0T2T3T4T6 +T0T2T3T4T7 +T0T2T3T4T8 +T0T2T3T4T9 +T0T2T3T4TA +T0T2T3T4TB +T0T2T3T4TC +T0T2T3T4TD +T0T2T3T4TE +T0T2T3T5T6 +T0T2T3T5T7 +T0T2T3T5T8 +T0T2T3T5T9 +T0T2T3T5TA +T0T2T3T5TB +T0T2T3T5TC +T0T2T3T5TD +T0T2T3T5TE +T0T2T3T6T7 +T0T2T3T6T8 +T0T2T3T6T9 +T0T2T3T6TA +T0T2T3T6TB +T0T2T3T6TC +T0T2T3T6TD +T0T2T3T6TE +T0T2T3T7T8 +T0T2T3T7T9 +T0T2T3T7TA +T0T2T3T7TB +T0T2T3T7TC +T0T2T3T7TD +T0T2T3T7TE +T0T2T3T8T9 +T0T2T3T8TA +T0T2T3T8TB +T0T2T3T8TC +T0T2T3T8TD +T0T2T3T8TE +T0T2T3T9TA +T0T2T3T9TB +T0T2T3T9TC +T0T2T3T9TD +T0T2T3T9TE +T0T2T3TATB +T0T2T3TATC +T0T2T3TATD +T0T2T3TATE +T0T2T3TBTC +T0T2T3TBTD +T0T2T3TBTE +T0T2T3TCTD +T0T2T3TCTE +T0T2T3TDTE +T0T2T4T5T6 +T0T2T4T5T7 +T0T2T4T5T8 +T0T2T4T5T9 +T0T2T4T5TA +T0T2T4T5TB +T0T2T4T5TC +T0T2T4T5TD +T0T2T4T5TE +T0T2T4T6T7 +T0T2T4T6T8 +T0T2T4T6T9 +T0T2T4T6TA +T0T2T4T6TB +T0T2T4T6TC +T0T2T4T6TD +T0T2T4T6TE +T0T2T4T7T8 +T0T2T4T7T9 +T0T2T4T7TA +T0T2T4T7TB +T0T2T4T7TC +T0T2T4T7TD +T0T2T4T7TE +T0T2T4T8T9 +T0T2T4T8TA +T0T2T4T8TB +T0T2T4T8TC +T0T2T4T8TD +T0T2T4T8TE +T0T2T4T9TA +T0T2T4T9TB +T0T2T4T9TC +T0T2T4T9TD +T0T2T4T9TE +T0T2T4TATB +T0T2T4TATC +T0T2T4TATD +T0T2T4TATE +T0T2T4TBTC +T0T2T4TBTD +T0T2T4TBTE +T0T2T4TCTD +T0T2T4TCTE +T0T2T4TDTE +T0T2T5T6T7 +T0T2T5T6T8 +T0T2T5T6T9 +T0T2T5T6TA +T0T2T5T6TB +T0T2T5T6TC +T0T2T5T6TD +T0T2T5T6TE +T0T2T5T7T8 +T0T2T5T7T9 +T0T2T5T7TA +T0T2T5T7TB +T0T2T5T7TC +T0T2T5T7TD +T0T2T5T7TE +T0T2T5T8T9 +T0T2T5T8TA +T0T2T5T8TB +T0T2T5T8TC +T0T2T5T8TD +T0T2T5T8TE +T0T2T5T9TA +T0T2T5T9TB +T0T2T5T9TC +T0T2T5T9TD +T0T2T5T9TE +T0T2T5TATB +T0T2T5TATC +T0T2T5TATD +T0T2T5TATE +T0T2T5TBTC +T0T2T5TBTD +T0T2T5TBTE +T0T2T5TCTD +T0T2T5TCTE +T0T2T5TDTE +T0T2T6T7T8 +T0T2T6T7T9 +T0T2T6T7TA +T0T2T6T7TB +T0T2T6T7TC +T0T2T6T7TD +T0T2T6T7TE +T0T2T6T8T9 +T0T2T6T8TA +T0T2T6T8TB +T0T2T6T8TC +T0T2T6T8TD +T0T2T6T8TE +T0T2T6T9TA +T0T2T6T9TB +T0T2T6T9TC +T0T2T6T9TD +T0T2T6T9TE +T0T2T6TATB +T0T2T6TATC +T0T2T6TATD +T0T2T6TATE +T0T2T6TBTC +T0T2T6TBTD +T0T2T6TBTE +T0T2T6TCTD +T0T2T6TCTE +T0T2T6TDTE +T0T2T7T8T9 +T0T2T7T8TA +T0T2T7T8TB +T0T2T7T8TC +T0T2T7T8TD +T0T2T7T8TE +T0T2T7T9TA +T0T2T7T9TB +T0T2T7T9TC +T0T2T7T9TD +T0T2T7T9TE +T0T2T7TATB +T0T2T7TATC +T0T2T7TATD +T0T2T7TATE +T0T2T7TBTC +T0T2T7TBTD +T0T2T7TBTE +T0T2T7TCTD +T0T2T7TCTE +T0T2T7TDTE +T0T2T8T9TA +T0T2T8T9TB +T0T2T8T9TC +T0T2T8T9TD +T0T2T8T9TE +T0T2T8TATB +T0T2T8TATC +T0T2T8TATD +T0T2T8TATE +T0T2T8TBTC +T0T2T8TBTD +T0T2T8TBTE +T0T2T8TCTD +T0T2T8TCTE +T0T2T8TDTE +T0T2T9TATB +T0T2T9TATC +T0T2T9TATD +T0T2T9TATE +T0T2T9TBTC +T0T2T9TBTD +T0T2T9TBTE +T0T2T9TCTD +T0T2T9TCTE +T0T2T9TDTE +T0T2TATBTC +T0T2TATBTD +T0T2TATBTE +T0T2TATCTD +T0T2TATCTE +T0T2TATDTE +T0T2TBTCTD +T0T2TBTCTE +T0T2TBTDTE +T0T2TCTDTE +T0T3T4T5T6 +T0T3T4T5T7 +T0T3T4T5T8 +T0T3T4T5T9 +T0T3T4T5TA +T0T3T4T5TB +T0T3T4T5TC +T0T3T4T5TD +T0T3T4T5TE +T0T3T4T6T7 +T0T3T4T6T8 +T0T3T4T6T9 +T0T3T4T6TA +T0T3T4T6TB +T0T3T4T6TC +T0T3T4T6TD +T0T3T4T6TE +T0T3T4T7T8 +T0T3T4T7T9 +T0T3T4T7TA +T0T3T4T7TB +T0T3T4T7TC +T0T3T4T7TD +T0T3T4T7TE +T0T3T4T8T9 +T0T3T4T8TA +T0T3T4T8TB +T0T3T4T8TC +T0T3T4T8TD +T0T3T4T8TE +T0T3T4T9TA +T0T3T4T9TB +T0T3T4T9TC +T0T3T4T9TD +T0T3T4T9TE +T0T3T4TATB +T0T3T4TATC +T0T3T4TATD +T0T3T4TATE +T0T3T4TBTC +T0T3T4TBTD +T0T3T4TBTE +T0T3T4TCTD +T0T3T4TCTE +T0T3T4TDTE +T0T3T5T6T7 +T0T3T5T6T8 +T0T3T5T6T9 +T0T3T5T6TA +T0T3T5T6TB +T0T3T5T6TC +T0T3T5T6TD +T0T3T5T6TE +T0T3T5T7T8 +T0T3T5T7T9 +T0T3T5T7TA +T0T3T5T7TB +T0T3T5T7TC +T0T3T5T7TD +T0T3T5T7TE +T0T3T5T8T9 +T0T3T5T8TA +T0T3T5T8TB +T0T3T5T8TC +T0T3T5T8TD +T0T3T5T8TE +T0T3T5T9TA +T0T3T5T9TB +T0T3T5T9TC +T0T3T5T9TD +T0T3T5T9TE +T0T3T5TATB +T0T3T5TATC +T0T3T5TATD +T0T3T5TATE +T0T3T5TBTC +T0T3T5TBTD +T0T3T5TBTE +T0T3T5TCTD +T0T3T5TCTE +T0T3T5TDTE +T0T3T6T7T8 +T0T3T6T7T9 +T0T3T6T7TA +T0T3T6T7TB +T0T3T6T7TC +T0T3T6T7TD +T0T3T6T7TE +T0T3T6T8T9 +T0T3T6T8TA +T0T3T6T8TB +T0T3T6T8TC +T0T3T6T8TD +T0T3T6T8TE +T0T3T6T9TA +T0T3T6T9TB +T0T3T6T9TC +T0T3T6T9TD +T0T3T6T9TE +T0T3T6TATB +T0T3T6TATC +T0T3T6TATD +T0T3T6TATE +T0T3T6TBTC +T0T3T6TBTD +T0T3T6TBTE +T0T3T6TCTD +T0T3T6TCTE +T0T3T6TDTE +T0T3T7T8T9 +T0T3T7T8TA +T0T3T7T8TB +T0T3T7T8TC +T0T3T7T8TD +T0T3T7T8TE +T0T3T7T9TA +T0T3T7T9TB +T0T3T7T9TC +T0T3T7T9TD +T0T3T7T9TE +T0T3T7TATB +T0T3T7TATC +T0T3T7TATD +T0T3T7TATE +T0T3T7TBTC +T0T3T7TBTD +T0T3T7TBTE +T0T3T7TCTD +T0T3T7TCTE +T0T3T7TDTE +T0T3T8T9TA +T0T3T8T9TB +T0T3T8T9TC +T0T3T8T9TD +T0T3T8T9TE +T0T3T8TATB +T0T3T8TATC +T0T3T8TATD +T0T3T8TATE +T0T3T8TBTC +T0T3T8TBTD +T0T3T8TBTE +T0T3T8TCTD +T0T3T8TCTE +T0T3T8TDTE +T0T3T9TATB +T0T3T9TATC +T0T3T9TATD +T0T3T9TATE +T0T3T9TBTC +T0T3T9TBTD +T0T3T9TBTE +T0T3T9TCTD +T0T3T9TCTE +T0T3T9TDTE +T0T3TATBTC +T0T3TATBTD +T0T3TATBTE +T0T3TATCTD +T0T3TATCTE +T0T3TATDTE +T0T3TBTCTD +T0T3TBTCTE +T0T3TBTDTE +T0T3TCTDTE +T0T4T5T6T7 +T0T4T5T6T8 +T0T4T5T6T9 +T0T4T5T6TA +T0T4T5T6TB +T0T4T5T6TC +T0T4T5T6TD +T0T4T5T6TE +T0T4T5T7T8 +T0T4T5T7T9 +T0T4T5T7TA +T0T4T5T7TB +T0T4T5T7TC +T0T4T5T7TD +T0T4T5T7TE +T0T4T5T8T9 +T0T4T5T8TA +T0T4T5T8TB +T0T4T5T8TC +T0T4T5T8TD +T0T4T5T8TE +T0T4T5T9TA +T0T4T5T9TB +T0T4T5T9TC +T0T4T5T9TD +T0T4T5T9TE +T0T4T5TATB +T0T4T5TATC +T0T4T5TATD +T0T4T5TATE +T0T4T5TBTC +T0T4T5TBTD +T0T4T5TBTE +T0T4T5TCTD +T0T4T5TCTE +T0T4T5TDTE +T0T4T6T7T8 +T0T4T6T7T9 +T0T4T6T7TA +T0T4T6T7TB +T0T4T6T7TC +T0T4T6T7TD +T0T4T6T7TE +T0T4T6T8T9 +T0T4T6T8TA +T0T4T6T8TB +T0T4T6T8TC +T0T4T6T8TD +T0T4T6T8TE +T0T4T6T9TA +T0T4T6T9TB +T0T4T6T9TC +T0T4T6T9TD +T0T4T6T9TE +T0T4T6TATB +T0T4T6TATC +T0T4T6TATD +T0T4T6TATE +T0T4T6TBTC +T0T4T6TBTD +T0T4T6TBTE +T0T4T6TCTD +T0T4T6TCTE +T0T4T6TDTE +T0T4T7T8T9 +T0T4T7T8TA +T0T4T7T8TB +T0T4T7T8TC +T0T4T7T8TD +T0T4T7T8TE +T0T4T7T9TA +T0T4T7T9TB +T0T4T7T9TC +T0T4T7T9TD +T0T4T7T9TE +T0T4T7TATB +T0T4T7TATC +T0T4T7TATD +T0T4T7TATE +T0T4T7TBTC +T0T4T7TBTD +T0T4T7TBTE +T0T4T7TCTD +T0T4T7TCTE +T0T4T7TDTE +T0T4T8T9TA +T0T4T8T9TB +T0T4T8T9TC +T0T4T8T9TD +T0T4T8T9TE +T0T4T8TATB +T0T4T8TATC +T0T4T8TATD +T0T4T8TATE +T0T4T8TBTC +T0T4T8TBTD +T0T4T8TBTE +T0T4T8TCTD +T0T4T8TCTE +T0T4T8TDTE +T0T4T9TATB +T0T4T9TATC +T0T4T9TATD +T0T4T9TATE +T0T4T9TBTC +T0T4T9TBTD +T0T4T9TBTE +T0T4T9TCTD +T0T4T9TCTE +T0T4T9TDTE +T0T4TATBTC +T0T4TATBTD +T0T4TATBTE +T0T4TATCTD +T0T4TATCTE +T0T4TATDTE +T0T4TBTCTD +T0T4TBTCTE +T0T4TBTDTE +T0T4TCTDTE +T0T5T6T7T8 +T0T5T6T7T9 +T0T5T6T7TA +T0T5T6T7TB +T0T5T6T7TC +T0T5T6T7TD +T0T5T6T7TE +T0T5T6T8T9 +T0T5T6T8TA +T0T5T6T8TB +T0T5T6T8TC +T0T5T6T8TD +T0T5T6T8TE +T0T5T6T9TA +T0T5T6T9TB +T0T5T6T9TC +T0T5T6T9TD +T0T5T6T9TE +T0T5T6TATB +T0T5T6TATC +T0T5T6TATD +T0T5T6TATE +T0T5T6TBTC +T0T5T6TBTD +T0T5T6TBTE +T0T5T6TCTD +T0T5T6TCTE +T0T5T6TDTE +T0T5T7T8T9 +T0T5T7T8TA +T0T5T7T8TB +T0T5T7T8TC +T0T5T7T8TD +T0T5T7T8TE +T0T5T7T9TA +T0T5T7T9TB +T0T5T7T9TC +T0T5T7T9TD +T0T5T7T9TE +T0T5T7TATB +T0T5T7TATC +T0T5T7TATD +T0T5T7TATE +T0T5T7TBTC +T0T5T7TBTD +T0T5T7TBTE +T0T5T7TCTD +T0T5T7TCTE +T0T5T7TDTE +T0T5T8T9TA +T0T5T8T9TB +T0T5T8T9TC +T0T5T8T9TD +T0T5T8T9TE +T0T5T8TATB +T0T5T8TATC +T0T5T8TATD +T0T5T8TATE +T0T5T8TBTC +T0T5T8TBTD +T0T5T8TBTE +T0T5T8TCTD +T0T5T8TCTE +T0T5T8TDTE +T0T5T9TATB +T0T5T9TATC +T0T5T9TATD +T0T5T9TATE +T0T5T9TBTC +T0T5T9TBTD +T0T5T9TBTE +T0T5T9TCTD +T0T5T9TCTE +T0T5T9TDTE +T0T5TATBTC +T0T5TATBTD +T0T5TATBTE +T0T5TATCTD +T0T5TATCTE +T0T5TATDTE +T0T5TBTCTD +T0T5TBTCTE +T0T5TBTDTE +T0T5TCTDTE +T0T6T7T8T9 +T0T6T7T8TA +T0T6T7T8TB +T0T6T7T8TC +T0T6T7T8TD +T0T6T7T8TE +T0T6T7T9TA +T0T6T7T9TB +T0T6T7T9TC +T0T6T7T9TD +T0T6T7T9TE +T0T6T7TATB +T0T6T7TATC +T0T6T7TATD +T0T6T7TATE +T0T6T7TBTC +T0T6T7TBTD +T0T6T7TBTE +T0T6T7TCTD +T0T6T7TCTE +T0T6T7TDTE +T0T6T8T9TA +T0T6T8T9TB +T0T6T8T9TC +T0T6T8T9TD +T0T6T8T9TE +T0T6T8TATB +T0T6T8TATC +T0T6T8TATD +T0T6T8TATE +T0T6T8TBTC +T0T6T8TBTD +T0T6T8TBTE +T0T6T8TCTD +T0T6T8TCTE +T0T6T8TDTE +T0T6T9TATB +T0T6T9TATC +T0T6T9TATD +T0T6T9TATE +T0T6T9TBTC +T0T6T9TBTD +T0T6T9TBTE +T0T6T9TCTD +T0T6T9TCTE +T0T6T9TDTE +T0T6TATBTC +T0T6TATBTD +T0T6TATBTE +T0T6TATCTD +T0T6TATCTE +T0T6TATDTE +T0T6TBTCTD +T0T6TBTCTE +T0T6TBTDTE +T0T6TCTDTE +T0T7T8T9TA +T0T7T8T9TB +T0T7T8T9TC +T0T7T8T9TD +T0T7T8T9TE +T0T7T8TATB +T0T7T8TATC +T0T7T8TATD +T0T7T8TATE +T0T7T8TBTC +T0T7T8TBTD +T0T7T8TBTE +T0T7T8TCTD +T0T7T8TCTE +T0T7T8TDTE +T0T7T9TATB +T0T7T9TATC +T0T7T9TATD +T0T7T9TATE +T0T7T9TBTC +T0T7T9TBTD +T0T7T9TBTE +T0T7T9TCTD +T0T7T9TCTE +T0T7T9TDTE +T0T7TATBTC +T0T7TATBTD +T0T7TATBTE +T0T7TATCTD +T0T7TATCTE +T0T7TATDTE +T0T7TBTCTD +T0T7TBTCTE +T0T7TBTDTE +T0T7TCTDTE +T0T8T9TATB +T0T8T9TATC +T0T8T9TATD +T0T8T9TATE +T0T8T9TBTC +T0T8T9TBTD +T0T8T9TBTE +T0T8T9TCTD +T0T8T9TCTE +T0T8T9TDTE +T0T8TATBTC +T0T8TATBTD +T0T8TATBTE +T0T8TATCTD +T0T8TATCTE +T0T8TATDTE +T0T8TBTCTD +T0T8TBTCTE +T0T8TBTDTE +T0T8TCTDTE +T0T9TATBTC +T0T9TATBTD +T0T9TATBTE +T0T9TATCTD +T0T9TATCTE +T0T9TATDTE +T0T9TBTCTD +T0T9TBTCTE +T0T9TBTDTE +T0T9TCTDTE +T0TATBTCTD +T0TATBTCTE +T0TATBTDTE +T0TATCTDTE +T0TBTCTDTE +T1T2T3T4T5 +T1T2T3T4T6 +T1T2T3T4T7 +T1T2T3T4T8 +T1T2T3T4T9 +T1T2T3T4TA +T1T2T3T4TB +T1T2T3T4TC +T1T2T3T4TD +T1T2T3T4TE +T1T2T3T5T6 +T1T2T3T5T7 +T1T2T3T5T8 +T1T2T3T5T9 +T1T2T3T5TA +T1T2T3T5TB +T1T2T3T5TC +T1T2T3T5TD +T1T2T3T5TE +T1T2T3T6T7 +T1T2T3T6T8 +T1T2T3T6T9 +T1T2T3T6TA +T1T2T3T6TB +T1T2T3T6TC +T1T2T3T6TD +T1T2T3T6TE +T1T2T3T7T8 +T1T2T3T7T9 +T1T2T3T7TA +T1T2T3T7TB +T1T2T3T7TC +T1T2T3T7TD +T1T2T3T7TE +T1T2T3T8T9 +T1T2T3T8TA +T1T2T3T8TB +T1T2T3T8TC +T1T2T3T8TD +T1T2T3T8TE +T1T2T3T9TA +T1T2T3T9TB +T1T2T3T9TC +T1T2T3T9TD +T1T2T3T9TE +T1T2T3TATB +T1T2T3TATC +T1T2T3TATD +T1T2T3TATE +T1T2T3TBTC +T1T2T3TBTD +T1T2T3TBTE +T1T2T3TCTD +T1T2T3TCTE +T1T2T3TDTE +T1T2T4T5T6 +T1T2T4T5T7 +T1T2T4T5T8 +T1T2T4T5T9 +T1T2T4T5TA +T1T2T4T5TB +T1T2T4T5TC +T1T2T4T5TD +T1T2T4T5TE +T1T2T4T6T7 +T1T2T4T6T8 +T1T2T4T6T9 +T1T2T4T6TA +T1T2T4T6TB +T1T2T4T6TC +T1T2T4T6TD +T1T2T4T6TE +T1T2T4T7T8 +T1T2T4T7T9 +T1T2T4T7TA +T1T2T4T7TB +T1T2T4T7TC +T1T2T4T7TD +T1T2T4T7TE +T1T2T4T8T9 +T1T2T4T8TA +T1T2T4T8TB +T1T2T4T8TC +T1T2T4T8TD +T1T2T4T8TE +T1T2T4T9TA +T1T2T4T9TB +T1T2T4T9TC +T1T2T4T9TD +T1T2T4T9TE +T1T2T4TATB +T1T2T4TATC +T1T2T4TATD +T1T2T4TATE +T1T2T4TBTC +T1T2T4TBTD +T1T2T4TBTE +T1T2T4TCTD +T1T2T4TCTE +T1T2T4TDTE +T1T2T5T6T7 +T1T2T5T6T8 +T1T2T5T6T9 +T1T2T5T6TA +T1T2T5T6TB +T1T2T5T6TC +T1T2T5T6TD +T1T2T5T6TE +T1T2T5T7T8 +T1T2T5T7T9 +T1T2T5T7TA +T1T2T5T7TB +T1T2T5T7TC +T1T2T5T7TD +T1T2T5T7TE +T1T2T5T8T9 +T1T2T5T8TA +T1T2T5T8TB +T1T2T5T8TC +T1T2T5T8TD +T1T2T5T8TE +T1T2T5T9TA +T1T2T5T9TB +T1T2T5T9TC +T1T2T5T9TD +T1T2T5T9TE +T1T2T5TATB +T1T2T5TATC +T1T2T5TATD +T1T2T5TATE +T1T2T5TBTC +T1T2T5TBTD +T1T2T5TBTE +T1T2T5TCTD +T1T2T5TCTE +T1T2T5TDTE +T1T2T6T7T8 +T1T2T6T7T9 +T1T2T6T7TA +T1T2T6T7TB +T1T2T6T7TC +T1T2T6T7TD +T1T2T6T7TE +T1T2T6T8T9 +T1T2T6T8TA +T1T2T6T8TB +T1T2T6T8TC +T1T2T6T8TD +T1T2T6T8TE +T1T2T6T9TA +T1T2T6T9TB +T1T2T6T9TC +T1T2T6T9TD +T1T2T6T9TE +T1T2T6TATB +T1T2T6TATC +T1T2T6TATD +T1T2T6TATE +T1T2T6TBTC +T1T2T6TBTD +T1T2T6TBTE +T1T2T6TCTD +T1T2T6TCTE +T1T2T6TDTE +T1T2T7T8T9 +T1T2T7T8TA +T1T2T7T8TB +T1T2T7T8TC +T1T2T7T8TD +T1T2T7T8TE +T1T2T7T9TA +T1T2T7T9TB +T1T2T7T9TC +T1T2T7T9TD +T1T2T7T9TE +T1T2T7TATB +T1T2T7TATC +T1T2T7TATD +T1T2T7TATE +T1T2T7TBTC +T1T2T7TBTD +T1T2T7TBTE +T1T2T7TCTD +T1T2T7TCTE +T1T2T7TDTE +T1T2T8T9TA +T1T2T8T9TB +T1T2T8T9TC +T1T2T8T9TD +T1T2T8T9TE +T1T2T8TATB +T1T2T8TATC +T1T2T8TATD +T1T2T8TATE +T1T2T8TBTC +T1T2T8TBTD +T1T2T8TBTE +T1T2T8TCTD +T1T2T8TCTE +T1T2T8TDTE +T1T2T9TATB +T1T2T9TATC +T1T2T9TATD +T1T2T9TATE +T1T2T9TBTC +T1T2T9TBTD +T1T2T9TBTE +T1T2T9TCTD +T1T2T9TCTE +T1T2T9TDTE +T1T2TATBTC +T1T2TATBTD +T1T2TATBTE +T1T2TATCTD +T1T2TATCTE +T1T2TATDTE +T1T2TBTCTD +T1T2TBTCTE +T1T2TBTDTE +T1T2TCTDTE +T1T3T4T5T6 +T1T3T4T5T7 +T1T3T4T5T8 +T1T3T4T5T9 +T1T3T4T5TA +T1T3T4T5TB +T1T3T4T5TC +T1T3T4T5TD +T1T3T4T5TE +T1T3T4T6T7 +T1T3T4T6T8 +T1T3T4T6T9 +T1T3T4T6TA +T1T3T4T6TB +T1T3T4T6TC +T1T3T4T6TD +T1T3T4T6TE +T1T3T4T7T8 +T1T3T4T7T9 +T1T3T4T7TA +T1T3T4T7TB +T1T3T4T7TC +T1T3T4T7TD +T1T3T4T7TE +T1T3T4T8T9 +T1T3T4T8TA +T1T3T4T8TB +T1T3T4T8TC +T1T3T4T8TD +T1T3T4T8TE +T1T3T4T9TA +T1T3T4T9TB +T1T3T4T9TC +T1T3T4T9TD +T1T3T4T9TE +T1T3T4TATB +T1T3T4TATC +T1T3T4TATD +T1T3T4TATE +T1T3T4TBTC +T1T3T4TBTD +T1T3T4TBTE +T1T3T4TCTD +T1T3T4TCTE +T1T3T4TDTE +T1T3T5T6T7 +T1T3T5T6T8 +T1T3T5T6T9 +T1T3T5T6TA +T1T3T5T6TB +T1T3T5T6TC +T1T3T5T6TD +T1T3T5T6TE +T1T3T5T7T8 +T1T3T5T7T9 +T1T3T5T7TA +T1T3T5T7TB +T1T3T5T7TC +T1T3T5T7TD +T1T3T5T7TE +T1T3T5T8T9 +T1T3T5T8TA +T1T3T5T8TB +T1T3T5T8TC +T1T3T5T8TD +T1T3T5T8TE +T1T3T5T9TA +T1T3T5T9TB +T1T3T5T9TC +T1T3T5T9TD +T1T3T5T9TE +T1T3T5TATB +T1T3T5TATC +T1T3T5TATD +T1T3T5TATE +T1T3T5TBTC +T1T3T5TBTD +T1T3T5TBTE +T1T3T5TCTD +T1T3T5TCTE +T1T3T5TDTE +T1T3T6T7T8 +T1T3T6T7T9 +T1T3T6T7TA +T1T3T6T7TB +T1T3T6T7TC +T1T3T6T7TD +T1T3T6T7TE +T1T3T6T8T9 +T1T3T6T8TA +T1T3T6T8TB +T1T3T6T8TC +T1T3T6T8TD +T1T3T6T8TE +T1T3T6T9TA +T1T3T6T9TB +T1T3T6T9TC +T1T3T6T9TD +T1T3T6T9TE +T1T3T6TATB +T1T3T6TATC +T1T3T6TATD +T1T3T6TATE +T1T3T6TBTC +T1T3T6TBTD +T1T3T6TBTE +T1T3T6TCTD +T1T3T6TCTE +T1T3T6TDTE +T1T3T7T8T9 +T1T3T7T8TA +T1T3T7T8TB +T1T3T7T8TC +T1T3T7T8TD +T1T3T7T8TE +T1T3T7T9TA +T1T3T7T9TB +T1T3T7T9TC +T1T3T7T9TD +T1T3T7T9TE +T1T3T7TATB +T1T3T7TATC +T1T3T7TATD +T1T3T7TATE +T1T3T7TBTC +T1T3T7TBTD +T1T3T7TBTE +T1T3T7TCTD +T1T3T7TCTE +T1T3T7TDTE +T1T3T8T9TA +T1T3T8T9TB +T1T3T8T9TC +T1T3T8T9TD +T1T3T8T9TE +T1T3T8TATB +T1T3T8TATC +T1T3T8TATD +T1T3T8TATE +T1T3T8TBTC +T1T3T8TBTD +T1T3T8TBTE +T1T3T8TCTD +T1T3T8TCTE +T1T3T8TDTE +T1T3T9TATB +T1T3T9TATC +T1T3T9TATD +T1T3T9TATE +T1T3T9TBTC +T1T3T9TBTD +T1T3T9TBTE +T1T3T9TCTD +T1T3T9TCTE +T1T3T9TDTE +T1T3TATBTC +T1T3TATBTD +T1T3TATBTE +T1T3TATCTD +T1T3TATCTE +T1T3TATDTE +T1T3TBTCTD +T1T3TBTCTE +T1T3TBTDTE +T1T3TCTDTE +T1T4T5T6T7 +T1T4T5T6T8 +T1T4T5T6T9 +T1T4T5T6TA +T1T4T5T6TB +T1T4T5T6TC +T1T4T5T6TD +T1T4T5T6TE +T1T4T5T7T8 +T1T4T5T7T9 +T1T4T5T7TA +T1T4T5T7TB +T1T4T5T7TC +T1T4T5T7TD +T1T4T5T7TE +T1T4T5T8T9 +T1T4T5T8TA +T1T4T5T8TB +T1T4T5T8TC +T1T4T5T8TD +T1T4T5T8TE +T1T4T5T9TA +T1T4T5T9TB +T1T4T5T9TC +T1T4T5T9TD +T1T4T5T9TE +T1T4T5TATB +T1T4T5TATC +T1T4T5TATD +T1T4T5TATE +T1T4T5TBTC +T1T4T5TBTD +T1T4T5TBTE +T1T4T5TCTD +T1T4T5TCTE +T1T4T5TDTE +T1T4T6T7T8 +T1T4T6T7T9 +T1T4T6T7TA +T1T4T6T7TB +T1T4T6T7TC +T1T4T6T7TD +T1T4T6T7TE +T1T4T6T8T9 +T1T4T6T8TA +T1T4T6T8TB +T1T4T6T8TC +T1T4T6T8TD +T1T4T6T8TE +T1T4T6T9TA +T1T4T6T9TB +T1T4T6T9TC +T1T4T6T9TD +T1T4T6T9TE +T1T4T6TATB +T1T4T6TATC +T1T4T6TATD +T1T4T6TATE +T1T4T6TBTC +T1T4T6TBTD +T1T4T6TBTE +T1T4T6TCTD +T1T4T6TCTE +T1T4T6TDTE +T1T4T7T8T9 +T1T4T7T8TA +T1T4T7T8TB +T1T4T7T8TC +T1T4T7T8TD +T1T4T7T8TE +T1T4T7T9TA +T1T4T7T9TB +T1T4T7T9TC +T1T4T7T9TD +T1T4T7T9TE +T1T4T7TATB +T1T4T7TATC +T1T4T7TATD +T1T4T7TATE +T1T4T7TBTC +T1T4T7TBTD +T1T4T7TBTE +T1T4T7TCTD +T1T4T7TCTE +T1T4T7TDTE +T1T4T8T9TA +T1T4T8T9TB +T1T4T8T9TC +T1T4T8T9TD +T1T4T8T9TE +T1T4T8TATB +T1T4T8TATC +T1T4T8TATD +T1T4T8TATE +T1T4T8TBTC +T1T4T8TBTD +T1T4T8TBTE +T1T4T8TCTD +T1T4T8TCTE +T1T4T8TDTE +T1T4T9TATB +T1T4T9TATC +T1T4T9TATD +T1T4T9TATE +T1T4T9TBTC +T1T4T9TBTD +T1T4T9TBTE +T1T4T9TCTD +T1T4T9TCTE +T1T4T9TDTE +T1T4TATBTC +T1T4TATBTD +T1T4TATBTE +T1T4TATCTD +T1T4TATCTE +T1T4TATDTE +T1T4TBTCTD +T1T4TBTCTE +T1T4TBTDTE +T1T4TCTDTE +T1T5T6T7T8 +T1T5T6T7T9 +T1T5T6T7TA +T1T5T6T7TB +T1T5T6T7TC +T1T5T6T7TD +T1T5T6T7TE +T1T5T6T8T9 +T1T5T6T8TA +T1T5T6T8TB +T1T5T6T8TC +T1T5T6T8TD +T1T5T6T8TE +T1T5T6T9TA +T1T5T6T9TB +T1T5T6T9TC +T1T5T6T9TD +T1T5T6T9TE +T1T5T6TATB +T1T5T6TATC +T1T5T6TATD +T1T5T6TATE +T1T5T6TBTC +T1T5T6TBTD +T1T5T6TBTE +T1T5T6TCTD +T1T5T6TCTE +T1T5T6TDTE +T1T5T7T8T9 +T1T5T7T8TA +T1T5T7T8TB +T1T5T7T8TC +T1T5T7T8TD +T1T5T7T8TE +T1T5T7T9TA +T1T5T7T9TB +T1T5T7T9TC +T1T5T7T9TD +T1T5T7T9TE +T1T5T7TATB +T1T5T7TATC +T1T5T7TATD +T1T5T7TATE +T1T5T7TBTC +T1T5T7TBTD +T1T5T7TBTE +T1T5T7TCTD +T1T5T7TCTE +T1T5T7TDTE +T1T5T8T9TA +T1T5T8T9TB +T1T5T8T9TC +T1T5T8T9TD +T1T5T8T9TE +T1T5T8TATB +T1T5T8TATC +T1T5T8TATD +T1T5T8TATE +T1T5T8TBTC +T1T5T8TBTD +T1T5T8TBTE +T1T5T8TCTD +T1T5T8TCTE +T1T5T8TDTE +T1T5T9TATB +T1T5T9TATC +T1T5T9TATD +T1T5T9TATE +T1T5T9TBTC +T1T5T9TBTD +T1T5T9TBTE +T1T5T9TCTD +T1T5T9TCTE +T1T5T9TDTE +T1T5TATBTC +T1T5TATBTD +T1T5TATBTE +T1T5TATCTD +T1T5TATCTE +T1T5TATDTE +T1T5TBTCTD +T1T5TBTCTE +T1T5TBTDTE +T1T5TCTDTE +T1T6T7T8T9 +T1T6T7T8TA +T1T6T7T8TB +T1T6T7T8TC +T1T6T7T8TD +T1T6T7T8TE +T1T6T7T9TA +T1T6T7T9TB +T1T6T7T9TC +T1T6T7T9TD +T1T6T7T9TE +T1T6T7TATB +T1T6T7TATC +T1T6T7TATD +T1T6T7TATE +T1T6T7TBTC +T1T6T7TBTD +T1T6T7TBTE +T1T6T7TCTD +T1T6T7TCTE +T1T6T7TDTE +T1T6T8T9TA +T1T6T8T9TB +T1T6T8T9TC +T1T6T8T9TD +T1T6T8T9TE +T1T6T8TATB +T1T6T8TATC +T1T6T8TATD +T1T6T8TATE +T1T6T8TBTC +T1T6T8TBTD +T1T6T8TBTE +T1T6T8TCTD +T1T6T8TCTE +T1T6T8TDTE +T1T6T9TATB +T1T6T9TATC +T1T6T9TATD +T1T6T9TATE +T1T6T9TBTC +T1T6T9TBTD +T1T6T9TBTE +T1T6T9TCTD +T1T6T9TCTE +T1T6T9TDTE +T1T6TATBTC +T1T6TATBTD +T1T6TATBTE +T1T6TATCTD +T1T6TATCTE +T1T6TATDTE +T1T6TBTCTD +T1T6TBTCTE +T1T6TBTDTE +T1T6TCTDTE +T1T7T8T9TA +T1T7T8T9TB +T1T7T8T9TC +T1T7T8T9TD +T1T7T8T9TE +T1T7T8TATB +T1T7T8TATC +T1T7T8TATD +T1T7T8TATE +T1T7T8TBTC +T1T7T8TBTD +T1T7T8TBTE +T1T7T8TCTD +T1T7T8TCTE +T1T7T8TDTE +T1T7T9TATB +T1T7T9TATC +T1T7T9TATD +T1T7T9TATE +T1T7T9TBTC +T1T7T9TBTD +T1T7T9TBTE +T1T7T9TCTD +T1T7T9TCTE +T1T7T9TDTE +T1T7TATBTC +T1T7TATBTD +T1T7TATBTE +T1T7TATCTD +T1T7TATCTE +T1T7TATDTE +T1T7TBTCTD +T1T7TBTCTE +T1T7TBTDTE +T1T7TCTDTE +T1T8T9TATB +T1T8T9TATC +T1T8T9TATD +T1T8T9TATE +T1T8T9TBTC +T1T8T9TBTD +T1T8T9TBTE +T1T8T9TCTD +T1T8T9TCTE +T1T8T9TDTE +T1T8TATBTC +T1T8TATBTD +T1T8TATBTE +T1T8TATCTD +T1T8TATCTE +T1T8TATDTE +T1T8TBTCTD +T1T8TBTCTE +T1T8TBTDTE +T1T8TCTDTE +T1T9TATBTC +T1T9TATBTD +T1T9TATBTE +T1T9TATCTD +T1T9TATCTE +T1T9TATDTE +T1T9TBTCTD +T1T9TBTCTE +T1T9TBTDTE +T1T9TCTDTE +T1TATBTCTD +T1TATBTCTE +T1TATBTDTE +T1TATCTDTE +T1TBTCTDTE +T2T3T4T5T6 +T2T3T4T5T7 +T2T3T4T5T8 +T2T3T4T5T9 +T2T3T4T5TA +T2T3T4T5TB +T2T3T4T5TC +T2T3T4T5TD +T2T3T4T5TE +T2T3T4T6T7 +T2T3T4T6T8 +T2T3T4T6T9 +T2T3T4T6TA +T2T3T4T6TB +T2T3T4T6TC +T2T3T4T6TD +T2T3T4T6TE +T2T3T4T7T8 +T2T3T4T7T9 +T2T3T4T7TA +T2T3T4T7TB +T2T3T4T7TC +T2T3T4T7TD +T2T3T4T7TE +T2T3T4T8T9 +T2T3T4T8TA +T2T3T4T8TB +T2T3T4T8TC +T2T3T4T8TD +T2T3T4T8TE +T2T3T4T9TA +T2T3T4T9TB +T2T3T4T9TC +T2T3T4T9TD +T2T3T4T9TE +T2T3T4TATB +T2T3T4TATC +T2T3T4TATD +T2T3T4TATE +T2T3T4TBTC +T2T3T4TBTD +T2T3T4TBTE +T2T3T4TCTD +T2T3T4TCTE +T2T3T4TDTE +T2T3T5T6T7 +T2T3T5T6T8 +T2T3T5T6T9 +T2T3T5T6TA +T2T3T5T6TB +T2T3T5T6TC +T2T3T5T6TD +T2T3T5T6TE +T2T3T5T7T8 +T2T3T5T7T9 +T2T3T5T7TA +T2T3T5T7TB +T2T3T5T7TC +T2T3T5T7TD +T2T3T5T7TE +T2T3T5T8T9 +T2T3T5T8TA +T2T3T5T8TB +T2T3T5T8TC +T2T3T5T8TD +T2T3T5T8TE +T2T3T5T9TA +T2T3T5T9TB +T2T3T5T9TC +T2T3T5T9TD +T2T3T5T9TE +T2T3T5TATB +T2T3T5TATC +T2T3T5TATD +T2T3T5TATE +T2T3T5TBTC +T2T3T5TBTD +T2T3T5TBTE +T2T3T5TCTD +T2T3T5TCTE +T2T3T5TDTE +T2T3T6T7T8 +T2T3T6T7T9 +T2T3T6T7TA +T2T3T6T7TB +T2T3T6T7TC +T2T3T6T7TD +T2T3T6T7TE +T2T3T6T8T9 +T2T3T6T8TA +T2T3T6T8TB +T2T3T6T8TC +T2T3T6T8TD +T2T3T6T8TE +T2T3T6T9TA +T2T3T6T9TB +T2T3T6T9TC +T2T3T6T9TD +T2T3T6T9TE +T2T3T6TATB +T2T3T6TATC +T2T3T6TATD +T2T3T6TATE +T2T3T6TBTC +T2T3T6TBTD +T2T3T6TBTE +T2T3T6TCTD +T2T3T6TCTE +T2T3T6TDTE +T2T3T7T8T9 +T2T3T7T8TA +T2T3T7T8TB +T2T3T7T8TC +T2T3T7T8TD +T2T3T7T8TE +T2T3T7T9TA +T2T3T7T9TB +T2T3T7T9TC +T2T3T7T9TD +T2T3T7T9TE +T2T3T7TATB +T2T3T7TATC +T2T3T7TATD +T2T3T7TATE +T2T3T7TBTC +T2T3T7TBTD +T2T3T7TBTE +T2T3T7TCTD +T2T3T7TCTE +T2T3T7TDTE +T2T3T8T9TA +T2T3T8T9TB +T2T3T8T9TC +T2T3T8T9TD +T2T3T8T9TE +T2T3T8TATB +T2T3T8TATC +T2T3T8TATD +T2T3T8TATE +T2T3T8TBTC +T2T3T8TBTD +T2T3T8TBTE +T2T3T8TCTD +T2T3T8TCTE +T2T3T8TDTE +T2T3T9TATB +T2T3T9TATC +T2T3T9TATD +T2T3T9TATE +T2T3T9TBTC +T2T3T9TBTD +T2T3T9TBTE +T2T3T9TCTD +T2T3T9TCTE +T2T3T9TDTE +T2T3TATBTC +T2T3TATBTD +T2T3TATBTE +T2T3TATCTD +T2T3TATCTE +T2T3TATDTE +T2T3TBTCTD +T2T3TBTCTE +T2T3TBTDTE +T2T3TCTDTE +T2T4T5T6T7 +T2T4T5T6T8 +T2T4T5T6T9 +T2T4T5T6TA +T2T4T5T6TB +T2T4T5T6TC +T2T4T5T6TD +T2T4T5T6TE +T2T4T5T7T8 +T2T4T5T7T9 +T2T4T5T7TA +T2T4T5T7TB +T2T4T5T7TC +T2T4T5T7TD +T2T4T5T7TE +T2T4T5T8T9 +T2T4T5T8TA +T2T4T5T8TB +T2T4T5T8TC +T2T4T5T8TD +T2T4T5T8TE +T2T4T5T9TA +T2T4T5T9TB +T2T4T5T9TC +T2T4T5T9TD +T2T4T5T9TE +T2T4T5TATB +T2T4T5TATC +T2T4T5TATD +T2T4T5TATE +T2T4T5TBTC +T2T4T5TBTD +T2T4T5TBTE +T2T4T5TCTD +T2T4T5TCTE +T2T4T5TDTE +T2T4T6T7T8 +T2T4T6T7T9 +T2T4T6T7TA +T2T4T6T7TB +T2T4T6T7TC +T2T4T6T7TD +T2T4T6T7TE +T2T4T6T8T9 +T2T4T6T8TA +T2T4T6T8TB +T2T4T6T8TC +T2T4T6T8TD +T2T4T6T8TE +T2T4T6T9TA +T2T4T6T9TB +T2T4T6T9TC +T2T4T6T9TD +T2T4T6T9TE +T2T4T6TATB +T2T4T6TATC +T2T4T6TATD +T2T4T6TATE +T2T4T6TBTC +T2T4T6TBTD +T2T4T6TBTE +T2T4T6TCTD +T2T4T6TCTE +T2T4T6TDTE +T2T4T7T8T9 +T2T4T7T8TA +T2T4T7T8TB +T2T4T7T8TC +T2T4T7T8TD +T2T4T7T8TE +T2T4T7T9TA +T2T4T7T9TB +T2T4T7T9TC +T2T4T7T9TD +T2T4T7T9TE +T2T4T7TATB +T2T4T7TATC +T2T4T7TATD +T2T4T7TATE +T2T4T7TBTC +T2T4T7TBTD +T2T4T7TBTE +T2T4T7TCTD +T2T4T7TCTE +T2T4T7TDTE +T2T4T8T9TA +T2T4T8T9TB +T2T4T8T9TC +T2T4T8T9TD +T2T4T8T9TE +T2T4T8TATB +T2T4T8TATC +T2T4T8TATD +T2T4T8TATE +T2T4T8TBTC +T2T4T8TBTD +T2T4T8TBTE +T2T4T8TCTD +T2T4T8TCTE +T2T4T8TDTE +T2T4T9TATB +T2T4T9TATC +T2T4T9TATD +T2T4T9TATE +T2T4T9TBTC +T2T4T9TBTD +T2T4T9TBTE +T2T4T9TCTD +T2T4T9TCTE +T2T4T9TDTE +T2T4TATBTC +T2T4TATBTD +T2T4TATBTE +T2T4TATCTD +T2T4TATCTE +T2T4TATDTE +T2T4TBTCTD +T2T4TBTCTE +T2T4TBTDTE +T2T4TCTDTE +T2T5T6T7T8 +T2T5T6T7T9 +T2T5T6T7TA +T2T5T6T7TB +T2T5T6T7TC +T2T5T6T7TD +T2T5T6T7TE +T2T5T6T8T9 +T2T5T6T8TA +T2T5T6T8TB +T2T5T6T8TC +T2T5T6T8TD +T2T5T6T8TE +T2T5T6T9TA +T2T5T6T9TB +T2T5T6T9TC +T2T5T6T9TD +T2T5T6T9TE +T2T5T6TATB +T2T5T6TATC +T2T5T6TATD +T2T5T6TATE +T2T5T6TBTC +T2T5T6TBTD +T2T5T6TBTE +T2T5T6TCTD +T2T5T6TCTE +T2T5T6TDTE +T2T5T7T8T9 +T2T5T7T8TA +T2T5T7T8TB +T2T5T7T8TC +T2T5T7T8TD +T2T5T7T8TE +T2T5T7T9TA +T2T5T7T9TB +T2T5T7T9TC +T2T5T7T9TD +T2T5T7T9TE +T2T5T7TATB +T2T5T7TATC +T2T5T7TATD +T2T5T7TATE +T2T5T7TBTC +T2T5T7TBTD +T2T5T7TBTE +T2T5T7TCTD +T2T5T7TCTE +T2T5T7TDTE +T2T5T8T9TA +T2T5T8T9TB +T2T5T8T9TC +T2T5T8T9TD +T2T5T8T9TE +T2T5T8TATB +T2T5T8TATC +T2T5T8TATD +T2T5T8TATE +T2T5T8TBTC +T2T5T8TBTD +T2T5T8TBTE +T2T5T8TCTD +T2T5T8TCTE +T2T5T8TDTE +T2T5T9TATB +T2T5T9TATC +T2T5T9TATD +T2T5T9TATE +T2T5T9TBTC +T2T5T9TBTD +T2T5T9TBTE +T2T5T9TCTD +T2T5T9TCTE +T2T5T9TDTE +T2T5TATBTC +T2T5TATBTD +T2T5TATBTE +T2T5TATCTD +T2T5TATCTE +T2T5TATDTE +T2T5TBTCTD +T2T5TBTCTE +T2T5TBTDTE +T2T5TCTDTE +T2T6T7T8T9 +T2T6T7T8TA +T2T6T7T8TB +T2T6T7T8TC +T2T6T7T8TD +T2T6T7T8TE +T2T6T7T9TA +T2T6T7T9TB +T2T6T7T9TC +T2T6T7T9TD +T2T6T7T9TE +T2T6T7TATB +T2T6T7TATC +T2T6T7TATD +T2T6T7TATE +T2T6T7TBTC +T2T6T7TBTD +T2T6T7TBTE +T2T6T7TCTD +T2T6T7TCTE +T2T6T7TDTE +T2T6T8T9TA +T2T6T8T9TB +T2T6T8T9TC +T2T6T8T9TD +T2T6T8T9TE +T2T6T8TATB +T2T6T8TATC +T2T6T8TATD +T2T6T8TATE +T2T6T8TBTC +T2T6T8TBTD +T2T6T8TBTE +T2T6T8TCTD +T2T6T8TCTE +T2T6T8TDTE +T2T6T9TATB +T2T6T9TATC +T2T6T9TATD +T2T6T9TATE +T2T6T9TBTC +T2T6T9TBTD +T2T6T9TBTE +T2T6T9TCTD +T2T6T9TCTE +T2T6T9TDTE +T2T6TATBTC +T2T6TATBTD +T2T6TATBTE +T2T6TATCTD +T2T6TATCTE +T2T6TATDTE +T2T6TBTCTD +T2T6TBTCTE +T2T6TBTDTE +T2T6TCTDTE +T2T7T8T9TA +T2T7T8T9TB +T2T7T8T9TC +T2T7T8T9TD +T2T7T8T9TE +T2T7T8TATB +T2T7T8TATC +T2T7T8TATD +T2T7T8TATE +T2T7T8TBTC +T2T7T8TBTD +T2T7T8TBTE +T2T7T8TCTD +T2T7T8TCTE +T2T7T8TDTE +T2T7T9TATB +T2T7T9TATC +T2T7T9TATD +T2T7T9TATE +T2T7T9TBTC +T2T7T9TBTD +T2T7T9TBTE +T2T7T9TCTD +T2T7T9TCTE +T2T7T9TDTE +T2T7TATBTC +T2T7TATBTD +T2T7TATBTE +T2T7TATCTD +T2T7TATCTE +T2T7TATDTE +T2T7TBTCTD +T2T7TBTCTE +T2T7TBTDTE +T2T7TCTDTE +T2T8T9TATB +T2T8T9TATC +T2T8T9TATD +T2T8T9TATE +T2T8T9TBTC +T2T8T9TBTD +T2T8T9TBTE +T2T8T9TCTD +T2T8T9TCTE +T2T8T9TDTE +T2T8TATBTC +T2T8TATBTD +T2T8TATBTE +T2T8TATCTD +T2T8TATCTE +T2T8TATDTE +T2T8TBTCTD +T2T8TBTCTE +T2T8TBTDTE +T2T8TCTDTE +T2T9TATBTC +T2T9TATBTD +T2T9TATBTE +T2T9TATCTD +T2T9TATCTE +T2T9TATDTE +T2T9TBTCTD +T2T9TBTCTE +T2T9TBTDTE +T2T9TCTDTE +T2TATBTCTD +T2TATBTCTE +T2TATBTDTE +T2TATCTDTE +T2TBTCTDTE +T3T4T5T6T7 +T3T4T5T6T8 +T3T4T5T6T9 +T3T4T5T6TA +T3T4T5T6TB +T3T4T5T6TC +T3T4T5T6TD +T3T4T5T6TE +T3T4T5T7T8 +T3T4T5T7T9 +T3T4T5T7TA +T3T4T5T7TB +T3T4T5T7TC +T3T4T5T7TD +T3T4T5T7TE +T3T4T5T8T9 +T3T4T5T8TA +T3T4T5T8TB +T3T4T5T8TC +T3T4T5T8TD +T3T4T5T8TE +T3T4T5T9TA +T3T4T5T9TB +T3T4T5T9TC +T3T4T5T9TD +T3T4T5T9TE +T3T4T5TATB +T3T4T5TATC +T3T4T5TATD +T3T4T5TATE +T3T4T5TBTC +T3T4T5TBTD +T3T4T5TBTE +T3T4T5TCTD +T3T4T5TCTE +T3T4T5TDTE +T3T4T6T7T8 +T3T4T6T7T9 +T3T4T6T7TA +T3T4T6T7TB +T3T4T6T7TC +T3T4T6T7TD +T3T4T6T7TE +T3T4T6T8T9 +T3T4T6T8TA +T3T4T6T8TB +T3T4T6T8TC +T3T4T6T8TD +T3T4T6T8TE +T3T4T6T9TA +T3T4T6T9TB +T3T4T6T9TC +T3T4T6T9TD +T3T4T6T9TE +T3T4T6TATB +T3T4T6TATC +T3T4T6TATD +T3T4T6TATE +T3T4T6TBTC +T3T4T6TBTD +T3T4T6TBTE +T3T4T6TCTD +T3T4T6TCTE +T3T4T6TDTE +T3T4T7T8T9 +T3T4T7T8TA +T3T4T7T8TB +T3T4T7T8TC +T3T4T7T8TD +T3T4T7T8TE +T3T4T7T9TA +T3T4T7T9TB +T3T4T7T9TC +T3T4T7T9TD +T3T4T7T9TE +T3T4T7TATB +T3T4T7TATC +T3T4T7TATD +T3T4T7TATE +T3T4T7TBTC +T3T4T7TBTD +T3T4T7TBTE +T3T4T7TCTD +T3T4T7TCTE +T3T4T7TDTE +T3T4T8T9TA +T3T4T8T9TB +T3T4T8T9TC +T3T4T8T9TD +T3T4T8T9TE +T3T4T8TATB +T3T4T8TATC +T3T4T8TATD +T3T4T8TATE +T3T4T8TBTC +T3T4T8TBTD +T3T4T8TBTE +T3T4T8TCTD +T3T4T8TCTE +T3T4T8TDTE +T3T4T9TATB +T3T4T9TATC +T3T4T9TATD +T3T4T9TATE +T3T4T9TBTC +T3T4T9TBTD +T3T4T9TBTE +T3T4T9TCTD +T3T4T9TCTE +T3T4T9TDTE +T3T4TATBTC +T3T4TATBTD +T3T4TATBTE +T3T4TATCTD +T3T4TATCTE +T3T4TATDTE +T3T4TBTCTD +T3T4TBTCTE +T3T4TBTDTE +T3T4TCTDTE +T3T5T6T7T8 +T3T5T6T7T9 +T3T5T6T7TA +T3T5T6T7TB +T3T5T6T7TC +T3T5T6T7TD +T3T5T6T7TE +T3T5T6T8T9 +T3T5T6T8TA +T3T5T6T8TB +T3T5T6T8TC +T3T5T6T8TD +T3T5T6T8TE +T3T5T6T9TA +T3T5T6T9TB +T3T5T6T9TC +T3T5T6T9TD +T3T5T6T9TE +T3T5T6TATB +T3T5T6TATC +T3T5T6TATD +T3T5T6TATE +T3T5T6TBTC +T3T5T6TBTD +T3T5T6TBTE +T3T5T6TCTD +T3T5T6TCTE +T3T5T6TDTE +T3T5T7T8T9 +T3T5T7T8TA +T3T5T7T8TB +T3T5T7T8TC +T3T5T7T8TD +T3T5T7T8TE +T3T5T7T9TA +T3T5T7T9TB +T3T5T7T9TC +T3T5T7T9TD +T3T5T7T9TE +T3T5T7TATB +T3T5T7TATC +T3T5T7TATD +T3T5T7TATE +T3T5T7TBTC +T3T5T7TBTD +T3T5T7TBTE +T3T5T7TCTD +T3T5T7TCTE +T3T5T7TDTE +T3T5T8T9TA +T3T5T8T9TB +T3T5T8T9TC +T3T5T8T9TD +T3T5T8T9TE +T3T5T8TATB +T3T5T8TATC +T3T5T8TATD +T3T5T8TATE +T3T5T8TBTC +T3T5T8TBTD +T3T5T8TBTE +T3T5T8TCTD +T3T5T8TCTE +T3T5T8TDTE +T3T5T9TATB +T3T5T9TATC +T3T5T9TATD +T3T5T9TATE +T3T5T9TBTC +T3T5T9TBTD +T3T5T9TBTE +T3T5T9TCTD +T3T5T9TCTE +T3T5T9TDTE +T3T5TATBTC +T3T5TATBTD +T3T5TATBTE +T3T5TATCTD +T3T5TATCTE +T3T5TATDTE +T3T5TBTCTD +T3T5TBTCTE +T3T5TBTDTE +T3T5TCTDTE +T3T6T7T8T9 +T3T6T7T8TA +T3T6T7T8TB +T3T6T7T8TC +T3T6T7T8TD +T3T6T7T8TE +T3T6T7T9TA +T3T6T7T9TB +T3T6T7T9TC +T3T6T7T9TD +T3T6T7T9TE +T3T6T7TATB +T3T6T7TATC +T3T6T7TATD +T3T6T7TATE +T3T6T7TBTC +T3T6T7TBTD +T3T6T7TBTE +T3T6T7TCTD +T3T6T7TCTE +T3T6T7TDTE +T3T6T8T9TA +T3T6T8T9TB +T3T6T8T9TC +T3T6T8T9TD +T3T6T8T9TE +T3T6T8TATB +T3T6T8TATC +T3T6T8TATD +T3T6T8TATE +T3T6T8TBTC +T3T6T8TBTD +T3T6T8TBTE +T3T6T8TCTD +T3T6T8TCTE +T3T6T8TDTE +T3T6T9TATB +T3T6T9TATC +T3T6T9TATD +T3T6T9TATE +T3T6T9TBTC +T3T6T9TBTD +T3T6T9TBTE +T3T6T9TCTD +T3T6T9TCTE +T3T6T9TDTE +T3T6TATBTC +T3T6TATBTD +T3T6TATBTE +T3T6TATCTD +T3T6TATCTE +T3T6TATDTE +T3T6TBTCTD +T3T6TBTCTE +T3T6TBTDTE +T3T6TCTDTE +T3T7T8T9TA +T3T7T8T9TB +T3T7T8T9TC +T3T7T8T9TD +T3T7T8T9TE +T3T7T8TATB +T3T7T8TATC +T3T7T8TATD +T3T7T8TATE +T3T7T8TBTC +T3T7T8TBTD +T3T7T8TBTE +T3T7T8TCTD +T3T7T8TCTE +T3T7T8TDTE +T3T7T9TATB +T3T7T9TATC +T3T7T9TATD +T3T7T9TATE +T3T7T9TBTC +T3T7T9TBTD +T3T7T9TBTE +T3T7T9TCTD +T3T7T9TCTE +T3T7T9TDTE +T3T7TATBTC +T3T7TATBTD +T3T7TATBTE +T3T7TATCTD +T3T7TATCTE +T3T7TATDTE +T3T7TBTCTD +T3T7TBTCTE +T3T7TBTDTE +T3T7TCTDTE +T3T8T9TATB +T3T8T9TATC +T3T8T9TATD +T3T8T9TATE +T3T8T9TBTC +T3T8T9TBTD +T3T8T9TBTE +T3T8T9TCTD +T3T8T9TCTE +T3T8T9TDTE +T3T8TATBTC +T3T8TATBTD +T3T8TATBTE +T3T8TATCTD +T3T8TATCTE +T3T8TATDTE +T3T8TBTCTD +T3T8TBTCTE +T3T8TBTDTE +T3T8TCTDTE +T3T9TATBTC +T3T9TATBTD +T3T9TATBTE +T3T9TATCTD +T3T9TATCTE +T3T9TATDTE +T3T9TBTCTD +T3T9TBTCTE +T3T9TBTDTE +T3T9TCTDTE +T3TATBTCTD +T3TATBTCTE +T3TATBTDTE +T3TATCTDTE +T3TBTCTDTE +T4T5T6T7T8 +T4T5T6T7T9 +T4T5T6T7TA +T4T5T6T7TB +T4T5T6T7TC +T4T5T6T7TD +T4T5T6T7TE +T4T5T6T8T9 +T4T5T6T8TA +T4T5T6T8TB +T4T5T6T8TC +T4T5T6T8TD +T4T5T6T8TE +T4T5T6T9TA +T4T5T6T9TB +T4T5T6T9TC +T4T5T6T9TD +T4T5T6T9TE +T4T5T6TATB +T4T5T6TATC +T4T5T6TATD +T4T5T6TATE +T4T5T6TBTC +T4T5T6TBTD +T4T5T6TBTE +T4T5T6TCTD +T4T5T6TCTE +T4T5T6TDTE +T4T5T7T8T9 +T4T5T7T8TA +T4T5T7T8TB +T4T5T7T8TC +T4T5T7T8TD +T4T5T7T8TE +T4T5T7T9TA +T4T5T7T9TB +T4T5T7T9TC +T4T5T7T9TD +T4T5T7T9TE +T4T5T7TATB +T4T5T7TATC +T4T5T7TATD +T4T5T7TATE +T4T5T7TBTC +T4T5T7TBTD +T4T5T7TBTE +T4T5T7TCTD +T4T5T7TCTE +T4T5T7TDTE +T4T5T8T9TA +T4T5T8T9TB +T4T5T8T9TC +T4T5T8T9TD +T4T5T8T9TE +T4T5T8TATB +T4T5T8TATC +T4T5T8TATD +T4T5T8TATE +T4T5T8TBTC +T4T5T8TBTD +T4T5T8TBTE +T4T5T8TCTD +T4T5T8TCTE +T4T5T8TDTE +T4T5T9TATB +T4T5T9TATC +T4T5T9TATD +T4T5T9TATE +T4T5T9TBTC +T4T5T9TBTD +T4T5T9TBTE +T4T5T9TCTD +T4T5T9TCTE +T4T5T9TDTE +T4T5TATBTC +T4T5TATBTD +T4T5TATBTE +T4T5TATCTD +T4T5TATCTE +T4T5TATDTE +T4T5TBTCTD +T4T5TBTCTE +T4T5TBTDTE +T4T5TCTDTE +T4T6T7T8T9 +T4T6T7T8TA +T4T6T7T8TB +T4T6T7T8TC +T4T6T7T8TD +T4T6T7T8TE +T4T6T7T9TA +T4T6T7T9TB +T4T6T7T9TC +T4T6T7T9TD +T4T6T7T9TE +T4T6T7TATB +T4T6T7TATC +T4T6T7TATD +T4T6T7TATE +T4T6T7TBTC +T4T6T7TBTD +T4T6T7TBTE +T4T6T7TCTD +T4T6T7TCTE +T4T6T7TDTE +T4T6T8T9TA +T4T6T8T9TB +T4T6T8T9TC +T4T6T8T9TD +T4T6T8T9TE +T4T6T8TATB +T4T6T8TATC +T4T6T8TATD +T4T6T8TATE +T4T6T8TBTC +T4T6T8TBTD +T4T6T8TBTE +T4T6T8TCTD +T4T6T8TCTE +T4T6T8TDTE +T4T6T9TATB +T4T6T9TATC +T4T6T9TATD +T4T6T9TATE +T4T6T9TBTC +T4T6T9TBTD +T4T6T9TBTE +T4T6T9TCTD +T4T6T9TCTE +T4T6T9TDTE +T4T6TATBTC +T4T6TATBTD +T4T6TATBTE +T4T6TATCTD +T4T6TATCTE +T4T6TATDTE +T4T6TBTCTD +T4T6TBTCTE +T4T6TBTDTE +T4T6TCTDTE +T4T7T8T9TA +T4T7T8T9TB +T4T7T8T9TC +T4T7T8T9TD +T4T7T8T9TE +T4T7T8TATB +T4T7T8TATC +T4T7T8TATD +T4T7T8TATE +T4T7T8TBTC +T4T7T8TBTD +T4T7T8TBTE +T4T7T8TCTD +T4T7T8TCTE +T4T7T8TDTE +T4T7T9TATB +T4T7T9TATC +T4T7T9TATD +T4T7T9TATE +T4T7T9TBTC +T4T7T9TBTD +T4T7T9TBTE +T4T7T9TCTD +T4T7T9TCTE +T4T7T9TDTE +T4T7TATBTC +T4T7TATBTD +T4T7TATBTE +T4T7TATCTD +T4T7TATCTE +T4T7TATDTE +T4T7TBTCTD +T4T7TBTCTE +T4T7TBTDTE +T4T7TCTDTE +T4T8T9TATB +T4T8T9TATC +T4T8T9TATD +T4T8T9TATE +T4T8T9TBTC +T4T8T9TBTD +T4T8T9TBTE +T4T8T9TCTD +T4T8T9TCTE +T4T8T9TDTE +T4T8TATBTC +T4T8TATBTD +T4T8TATBTE +T4T8TATCTD +T4T8TATCTE +T4T8TATDTE +T4T8TBTCTD +T4T8TBTCTE +T4T8TBTDTE +T4T8TCTDTE +T4T9TATBTC +T4T9TATBTD +T4T9TATBTE +T4T9TATCTD +T4T9TATCTE +T4T9TATDTE +T4T9TBTCTD +T4T9TBTCTE +T4T9TBTDTE +T4T9TCTDTE +T4TATBTCTD +T4TATBTCTE +T4TATBTDTE +T4TATCTDTE +T4TBTCTDTE +T5T6T7T8T9 +T5T6T7T8TA +T5T6T7T8TB +T5T6T7T8TC +T5T6T7T8TD +T5T6T7T8TE +T5T6T7T9TA +T5T6T7T9TB +T5T6T7T9TC +T5T6T7T9TD +T5T6T7T9TE +T5T6T7TATB +T5T6T7TATC +T5T6T7TATD +T5T6T7TATE +T5T6T7TBTC +T5T6T7TBTD +T5T6T7TBTE +T5T6T7TCTD +T5T6T7TCTE +T5T6T7TDTE +T5T6T8T9TA +T5T6T8T9TB +T5T6T8T9TC +T5T6T8T9TD +T5T6T8T9TE +T5T6T8TATB +T5T6T8TATC +T5T6T8TATD +T5T6T8TATE +T5T6T8TBTC +T5T6T8TBTD +T5T6T8TBTE +T5T6T8TCTD +T5T6T8TCTE +T5T6T8TDTE +T5T6T9TATB +T5T6T9TATC +T5T6T9TATD +T5T6T9TATE +T5T6T9TBTC +T5T6T9TBTD +T5T6T9TBTE +T5T6T9TCTD +T5T6T9TCTE +T5T6T9TDTE +T5T6TATBTC +T5T6TATBTD +T5T6TATBTE +T5T6TATCTD +T5T6TATCTE +T5T6TATDTE +T5T6TBTCTD +T5T6TBTCTE +T5T6TBTDTE +T5T6TCTDTE +T5T7T8T9TA +T5T7T8T9TB +T5T7T8T9TC +T5T7T8T9TD +T5T7T8T9TE +T5T7T8TATB +T5T7T8TATC +T5T7T8TATD +T5T7T8TATE +T5T7T8TBTC +T5T7T8TBTD +T5T7T8TBTE +T5T7T8TCTD +T5T7T8TCTE +T5T7T8TDTE +T5T7T9TATB +T5T7T9TATC +T5T7T9TATD +T5T7T9TATE +T5T7T9TBTC +T5T7T9TBTD +T5T7T9TBTE +T5T7T9TCTD +T5T7T9TCTE +T5T7T9TDTE +T5T7TATBTC +T5T7TATBTD +T5T7TATBTE +T5T7TATCTD +T5T7TATCTE +T5T7TATDTE +T5T7TBTCTD +T5T7TBTCTE +T5T7TBTDTE +T5T7TCTDTE +T5T8T9TATB +T5T8T9TATC +T5T8T9TATD +T5T8T9TATE +T5T8T9TBTC +T5T8T9TBTD +T5T8T9TBTE +T5T8T9TCTD +T5T8T9TCTE +T5T8T9TDTE +T5T8TATBTC +T5T8TATBTD +T5T8TATBTE +T5T8TATCTD +T5T8TATCTE +T5T8TATDTE +T5T8TBTCTD +T5T8TBTCTE +T5T8TBTDTE +T5T8TCTDTE +T5T9TATBTC +T5T9TATBTD +T5T9TATBTE +T5T9TATCTD +T5T9TATCTE +T5T9TATDTE +T5T9TBTCTD +T5T9TBTCTE +T5T9TBTDTE +T5T9TCTDTE +T5TATBTCTD +T5TATBTCTE +T5TATBTDTE +T5TATCTDTE +T5TBTCTDTE +T6T7T8T9TA +T6T7T8T9TB +T6T7T8T9TC +T6T7T8T9TD +T6T7T8T9TE +T6T7T8TATB +T6T7T8TATC +T6T7T8TATD +T6T7T8TATE +T6T7T8TBTC +T6T7T8TBTD +T6T7T8TBTE +T6T7T8TCTD +T6T7T8TCTE +T6T7T8TDTE +T6T7T9TATB +T6T7T9TATC +T6T7T9TATD +T6T7T9TATE +T6T7T9TBTC +T6T7T9TBTD +T6T7T9TBTE +T6T7T9TCTD +T6T7T9TCTE +T6T7T9TDTE +T6T7TATBTC +T6T7TATBTD +T6T7TATBTE +T6T7TATCTD +T6T7TATCTE +T6T7TATDTE +T6T7TBTCTD +T6T7TBTCTE +T6T7TBTDTE +T6T7TCTDTE +T6T8T9TATB +T6T8T9TATC +T6T8T9TATD +T6T8T9TATE +T6T8T9TBTC +T6T8T9TBTD +T6T8T9TBTE +T6T8T9TCTD +T6T8T9TCTE +T6T8T9TDTE +T6T8TATBTC +T6T8TATBTD +T6T8TATBTE +T6T8TATCTD +T6T8TATCTE +T6T8TATDTE +T6T8TBTCTD +T6T8TBTCTE +T6T8TBTDTE +T6T8TCTDTE +T6T9TATBTC +T6T9TATBTD +T6T9TATBTE +T6T9TATCTD +T6T9TATCTE +T6T9TATDTE +T6T9TBTCTD +T6T9TBTCTE +T6T9TBTDTE +T6T9TCTDTE +T6TATBTCTD +T6TATBTCTE +T6TATBTDTE +T6TATCTDTE +T6TBTCTDTE +T7T8T9TATB +T7T8T9TATC +T7T8T9TATD +T7T8T9TATE +T7T8T9TBTC +T7T8T9TBTD +T7T8T9TBTE +T7T8T9TCTD +T7T8T9TCTE +T7T8T9TDTE +T7T8TATBTC +T7T8TATBTD +T7T8TATBTE +T7T8TATCTD +T7T8TATCTE +T7T8TATDTE +T7T8TBTCTD +T7T8TBTCTE +T7T8TBTDTE +T7T8TCTDTE +T7T9TATBTC +T7T9TATBTD +T7T9TATBTE +T7T9TATCTD +T7T9TATCTE +T7T9TATDTE +T7T9TBTCTD +T7T9TBTCTE +T7T9TBTDTE +T7T9TCTDTE +T7TATBTCTD +T7TATBTCTE +T7TATBTDTE +T7TATCTDTE +T7TBTCTDTE +T8T9TATBTC +T8T9TATBTD +T8T9TATBTE +T8T9TATCTD +T8T9TATCTE +T8T9TATDTE +T8T9TBTCTD +T8T9TBTCTE +T8T9TBTDTE +T8T9TCTDTE +T8TATBTCTD +T8TATBTCTE +T8TATBTDTE +T8TATCTDTE +T8TBTCTDTE +T9TATBTCTD +T9TATBTCTE +T9TATBTDTE +T9TATCTDTE +T9TBTCTDTE +TATBTCTDTE diff --git a/src/Makefile b/src/Makefile new file mode 100644 index 0000000000..2e06169160 --- /dev/null +++ b/src/Makefile @@ -0,0 +1,406 @@ +## +## Author......: Jens Steube +## License.....: MIT +## + +## +## Detect number of processors +## + +NPROCS := $(shell grep -c ^processor /proc/cpuinfo) +OS := $(shell uname) + +## +## Makefile flags +## + +MAKEFLAGS += -l -j $(NPROCS) -rR --no-print-directory + +ifneq ($(findstring clean,$(MAKECMDGOALS)),) +MAKEFLAGS += -j 1 +endif + +## +## Library Paths +## + +OCL := /opt/hashcat-deps/amd-app-sdk +OCLLIBPATH32 := $(OCL)/lib/x86 +OCLLIBPATH64 := $(OCL)/lib/x86_64 + +CUDA := /opt/hashcat-deps/cuda-7.5 +CUDALIBPATH32 := /opt/hashcat-deps/NVIDIA-Linux-x86_64-352.21/32 +CUDALIBPATH64 := /opt/hashcat-deps/NVIDIA-Linux-x86_64-352.21 + +ADL := /opt/hashcat-deps/adl-sdk + +GDK := /opt/hashcat-deps/nvidia-gdk +NVAPI := /opt/hashcat-deps/R352-developer + +NVMLINCPATH := $(GDK)/usr/include/nvidia/gdk/ +NVMLLIBPATH32 := $(CUDALIBPATH32) +NVMLLIBPATH64 := $(CUDALIBPATH64) + +CLCOMPILE_PATH := tools/clcompile +RULES_OPTIMIZE_PATH := tools/rules_optimize + +## +## Compiler paths +## + +CC_LINUX_32 := gcc +CC_LINUX_64 := gcc + +CC_WIN_32 := i686-w64-mingw32-gcc +CC_WIN_64 := x86_64-w64-mingw32-gcc + +DLL_WIN_32 := i686-w64-mingw32-dlltool +DLL_WIN_64 := x86_64-w64-mingw32-dlltool + +NVCC := $(CUDA)/bin/nvcc +CLCOMPILE := $(CLCOMPILE_PATH)/clcompile.bin + +BIN := . + +## +## Misc stuff +## + +NOW := $(shell perl -e 'print time') + +## +## Compiler flags +## + +CFLAGS := -O2 -s -pipe -W -Wall -Iinclude/ -std=c99 +#CFLAGS := -g -pipe -W -Wall -Iinclude/ -std=c99 + +CFLAGS_32 := -m32 +CFLAGS_64 := -m64 + +CFLAGS_LINUX := -D_POSIX -DLINUX +CFLAGS_WIN := -D_WIN -DWIN -D__MSVCRT__ -D__USE_MINGW_ANSI_STDIO=1 + +CFLAGS_OCL_LINUX := -D_OCL -I$(OCL)/include/ -I$(ADL)/include/ +CFLAGS_OCL_WIN := -D_OCL -I$(OCL)/include/ -I$(ADL)/include/ +CFLAGS_CUDA_LINUX := -D_CUDA -I$(CUDA)/include/ -I$(GDK)/usr/include/nvidia/gdk/ +CFLAGS_CUDA_WIN := -D_CUDA -I$(CUDA)/include/ -I$(NVAPI)/ + +LFLAGS_OCL_LINUX := -lpthread -lOpenCL -ldl +LFLAGS_OCL_WIN := -lpsapi -L./lib +LFLAGS_CUDA_LINUX := -lpthread -lnvidia-ml -lcuda +LFLAGS_CUDA_WIN := -lpsapi -L./lib + +## +## Kernels +## + +AMD_IN := amd +AMD_OUT := kernels/4098 + +NV_IN := nv +NV_OUT := kernels/4318 + +KERNELS_MODE_ALL := m00400 m00500 m01600 m01800 m02100 m02500 m03200 m05200 m05800 m06211 m06212 m06213 m06221 m06222 m06223 m06231 m06232 m06233 m06300 m06400 m06500 m06600 m06700 m06800 m07100 m07400 m07900 m08200 m08800 m08900 m09000 m09100 m09400 m09500 m09600 m10300 m10500 m10700 m10900 m11300 m11600 m11900 m12000 m12200 m12300 m12400 m12500 m12700 m12800 m00000_a0 m00000_a1 m00000_a3 m00010_a0 m00010_a1 m00010_a3 m00020_a0 m00020_a1 m00020_a3 m00030_a0 m00030_a1 m00030_a3 m00040_a0 m00040_a1 m00040_a3 m00050_a0 m00050_a1 m00050_a3 m00060_a0 m00060_a1 m00060_a3 m00100_a0 m00100_a1 m00100_a3 m00110_a0 m00110_a1 m00110_a3 m00120_a0 m00120_a1 m00120_a3 m00130_a0 m00130_a1 m00130_a3 m00140_a0 m00140_a1 m00140_a3 m00150_a0 m00150_a1 m00150_a3 m00160_a0 m00160_a1 m00160_a3 m00190_a0 m00190_a1 m00190_a3 m00200_a0 m00200_a1 m00200_a3 m00300_a0 m00300_a1 m00300_a3 m00900_a0 m00900_a1 m00900_a3 m01000_a0 m01000_a1 m01000_a3 m01100_a0 m01100_a1 m01100_a3 m01400_a0 m01400_a1 m01400_a3 m01410_a0 m01410_a1 m01410_a3 m01420_a0 m01420_a1 m01420_a3 m01430_a0 m01430_a1 m01430_a3 m01440_a0 m01440_a1 m01440_a3 m01450_a0 m01450_a1 m01450_a3 m01460_a0 m01460_a1 m01460_a3 m01500_a0 m01500_a1 m01500_a3 m01700_a0 m01700_a1 m01700_a3 m01710_a0 m01710_a1 m01710_a3 m01720_a0 m01720_a1 m01720_a3 m01730_a0 m01730_a1 m01730_a3 m01740_a0 m01740_a1 m01740_a3 m01750_a0 m01750_a1 m01750_a3 m01760_a0 m01760_a1 m01760_a3 m02400_a0 m02400_a1 m02400_a3 m02410_a0 m02410_a1 m02410_a3 m02610_a0 m02610_a1 m02610_a3 m02710_a0 m02710_a1 m02710_a3 m02810_a0 m02810_a1 m02810_a3 m03000_a0 m03000_a1 m03000_a3 m03100_a0 m03100_a1 m03100_a3 m03710_a0 m03710_a1 m03710_a3 m03800_a0 m03800_a1 m03800_a3 m04310_a0 m04310_a1 m04310_a3 m04400_a0 m04400_a1 m04400_a3 m04500_a0 m04500_a1 m04500_a3 m04700_a0 m04700_a1 m04700_a3 m04800_a0 m04800_a1 m04800_a3 m04900_a0 m04900_a1 m04900_a3 m05000_a0 m05000_a1 m05000_a3 m05100_a0 m05100_a1 m05100_a3 m05300_a0 m05300_a1 m05300_a3 m05400_a0 m05400_a1 m05400_a3 m05500_a0 m05500_a1 m05500_a3 m05600_a0 m05600_a1 m05600_a3 m06000_a0 m06000_a1 m06000_a3 m06100_a0 m06100_a1 m06100_a3 m06900_a0 m06900_a1 m06900_a3 m07300_a0 m07300_a1 m07300_a3 m07500_a0 m07500_a1 m07500_a3 m07600_a0 m07600_a1 m07600_a3 m07700_a0 m07700_a1 m07700_a3 m07800_a0 m07800_a1 m07800_a3 m08000_a0 m08000_a1 m08000_a3 m08100_a0 m08100_a1 m08100_a3 m08300_a0 m08300_a1 m08300_a3 m08400_a0 m08400_a1 m08400_a3 m08500_a0 m08500_a1 m08500_a3 m08600_a0 m08600_a1 m08600_a3 m08700_a0 m08700_a1 m08700_a3 m09700_a0 m09700_a1 m09700_a3 m09710_a0 m09710_a1 m09710_a3 m09720_a0 m09720_a1 m09720_a3 m09800_a0 m09800_a1 m09800_a3 m09810_a0 m09810_a1 m09810_a3 m09820_a0 m09820_a1 m09820_a3 m09900_a0 m09900_a1 m09900_a3 m10100_a0 m10100_a1 m10100_a3 m10400_a0 m10400_a1 m10400_a3 m10410_a0 m10410_a1 m10410_a3 m10420_a0 m10420_a1 m10420_a3 m10800_a0 m10800_a1 m10800_a3 m11000_a0 m11000_a1 m11000_a3 m11100_a0 m11100_a1 m11100_a3 m11200_a0 m11200_a1 m11200_a3 m11400_a0 m11400_a1 m11400_a3 m11500_a0 m11500_a1 m11500_a3 m11700_a0 m11700_a1 m11700_a3 m11800_a0 m11800_a1 m11800_a3 m12600_a0 m12600_a1 m12600_a3 +KERNELS_MASK_ALL := markov_le_v1 markov_le_v2 markov_le_v4 markov_be_v1 markov_be_v2 markov_be_v4 +KERNELS_AMP_ALL := amp_a0_v1 amp_a0_v2 amp_a0_v4 amp_a1_v1 amp_a1_v2 amp_a1_v4 amp_a3_v1 amp_a3_v2 amp_a3_v4 +AMD_DEVICES_ALL := VLIW1 VLIW4 VLIW5 +NV_DEVICES_ALL := sm_20 sm_21 sm_30 sm_35 sm_37 sm_50 sm_52 +NV_BITNESS_ALL := 32 64 + +## +## Targets for script +## + +SCRYPT_N_ALL := 1024 16384 +SCRYPT_R_ALL := 1 +SCRYPT_P_ALL := 1 +SCRYPT_TMTO_ALL := 2 4 8 16 32 64 128 256 512 1024 + +## +## Targets: Global +## + +all: binaries_all kernels_all + +binaries_all: linux32 linux64 win32 win64 rules_optimize + +kernels_all: amd_all nv_all + +release: binaries + +linux: linux32 linux64 rules_optimize + +windows: win32 win64 rules_optimize + +clean: clean_bin + +clean_all: clean_bin clean_kernel clean_clcompile + +clean_bin: + rm -f obj/*.o lib/*.a $(BIN)/*.bin $(BIN)/*.exe $(BIN)/*.app *.restore *.out *.pot *.dictstat *.log + rm -rf *Hashcat.induct + rm -rf *Hashcat.outfiles + $(MAKE) -C $(RULES_OPTIMIZE_PATH) clean + +clean_kernel: + rm -f $(AMD_OUT)/* $(NV_OUT)/* + +clean_clcompile: + rm -f ${CLCOMPILE_PATH}/clcompile.bin + +${CLCOMPILE}: ${CLCOMPILE_PATH}/clcompile.c + $(CC_LINUX_64) $(CFLAGS) -o $@ -I$(CFLAGS_OCL_LINUX) $< -L$(OCLLIBPATH64) $(LFLAGS_OCL_LINUX) + +rules_optimize: + $(MAKE) -C $(RULES_OPTIMIZE_PATH) + +linux32: oclHashcat32.bin cudaHashcat32.bin +linux64: oclHashcat64.bin cudaHashcat64.bin + +win32: oclHashcat32.exe cudaHashcat32.exe +win64: oclHashcat64.exe cudaHashcat64.exe + +amd_all: $(foreach KERNEL,$(KERNELS_MODE_ALL),$(foreach DEVICE,$(AMD_DEVICES_ALL),$(AMD_OUT)/$(KERNEL).$(DEVICE).llvmir)) \ + $(AMD_OUT)/markov_le_v1.llvmir $(AMD_OUT)/markov_le_v2.llvmir $(AMD_OUT)/markov_le_v4.llvmir \ + $(AMD_OUT)/markov_be_v1.llvmir $(AMD_OUT)/markov_be_v2.llvmir $(AMD_OUT)/markov_be_v4.llvmir \ + $(AMD_OUT)/amp_a0_v1.llvmir $(AMD_OUT)/amp_a0_v2.llvmir $(AMD_OUT)/amp_a0_v4.llvmir \ + $(AMD_OUT)/amp_a1_v1.llvmir $(AMD_OUT)/amp_a1_v2.llvmir $(AMD_OUT)/amp_a1_v4.llvmir \ + $(AMD_OUT)/amp_a3_v1.llvmir $(AMD_OUT)/amp_a3_v2.llvmir $(AMD_OUT)/amp_a3_v4.llvmir + +nv_all: $(foreach KERNEL,$(KERNELS_MODE_ALL),$(foreach DEVICE,$(NV_DEVICES_ALL),$(foreach BITNESS,$(NV_BITNESS_ALL),$(NV_OUT)/$(KERNEL).$(DEVICE).$(BITNESS).cubin))) \ + $(foreach DEVICE,$(NV_DEVICES_ALL),$(foreach BITNESS,$(NV_BITNESS_ALL),$(NV_OUT)/markov_le_v1.$(DEVICE).$(BITNESS).cubin)) $(foreach DEVICE,$(NV_DEVICES_ALL),$(foreach BITNESS,$(NV_BITNESS_ALL),$(NV_OUT)/markov_le_v2.$(DEVICE).$(BITNESS).cubin)) $(foreach DEVICE,$(NV_DEVICES_ALL),$(foreach BITNESS,$(NV_BITNESS_ALL),$(NV_OUT)/markov_le_v4.$(DEVICE).$(BITNESS).cubin)) \ + $(foreach DEVICE,$(NV_DEVICES_ALL),$(foreach BITNESS,$(NV_BITNESS_ALL),$(NV_OUT)/markov_be_v1.$(DEVICE).$(BITNESS).cubin)) $(foreach DEVICE,$(NV_DEVICES_ALL),$(foreach BITNESS,$(NV_BITNESS_ALL),$(NV_OUT)/markov_be_v2.$(DEVICE).$(BITNESS).cubin)) $(foreach DEVICE,$(NV_DEVICES_ALL),$(foreach BITNESS,$(NV_BITNESS_ALL),$(NV_OUT)/markov_be_v4.$(DEVICE).$(BITNESS).cubin)) \ + $(foreach DEVICE,$(NV_DEVICES_ALL),$(foreach BITNESS,$(NV_BITNESS_ALL),$(NV_OUT)/amp_a0_v1.$(DEVICE).$(BITNESS).cubin)) $(foreach DEVICE,$(NV_DEVICES_ALL),$(foreach BITNESS,$(NV_BITNESS_ALL),$(NV_OUT)/amp_a0_v2.$(DEVICE).$(BITNESS).cubin)) $(foreach DEVICE,$(NV_DEVICES_ALL),$(foreach BITNESS,$(NV_BITNESS_ALL),$(NV_OUT)/amp_a0_v4.$(DEVICE).$(BITNESS).cubin)) \ + $(foreach DEVICE,$(NV_DEVICES_ALL),$(foreach BITNESS,$(NV_BITNESS_ALL),$(NV_OUT)/amp_a1_v1.$(DEVICE).$(BITNESS).cubin)) $(foreach DEVICE,$(NV_DEVICES_ALL),$(foreach BITNESS,$(NV_BITNESS_ALL),$(NV_OUT)/amp_a1_v2.$(DEVICE).$(BITNESS).cubin)) $(foreach DEVICE,$(NV_DEVICES_ALL),$(foreach BITNESS,$(NV_BITNESS_ALL),$(NV_OUT)/amp_a1_v4.$(DEVICE).$(BITNESS).cubin)) \ + $(foreach DEVICE,$(NV_DEVICES_ALL),$(foreach BITNESS,$(NV_BITNESS_ALL),$(NV_OUT)/amp_a3_v1.$(DEVICE).$(BITNESS).cubin)) $(foreach DEVICE,$(NV_DEVICES_ALL),$(foreach BITNESS,$(NV_BITNESS_ALL),$(NV_OUT)/amp_a3_v2.$(DEVICE).$(BITNESS).cubin)) $(foreach DEVICE,$(NV_DEVICES_ALL),$(foreach BITNESS,$(NV_BITNESS_ALL),$(NV_OUT)/amp_a3_v4.$(DEVICE).$(BITNESS).cubin)) + +## +## Targets: AMD Kernel (oclHashcat) +## + +# general kernels + +$(AMD_OUT)/markov_%.llvmir: $(AMD_IN)/markov_%.cl ${CLCOMPILE} + @rm -f $(subst .llvmir,*.kernel,$@) + $(CLCOMPILE) "-D VLIW1 -I $(AMD_IN)/" $< $@ + +$(AMD_OUT)/amp_%_v1.llvmir: $(AMD_IN)/amp_%_v1.cl ${CLCOMPILE} + @rm -f $(subst .llvmir,*.kernel,$@) + $(CLCOMPILE) "-D VLIW1 -I $(AMD_IN)/" $< $@ + +$(AMD_OUT)/amp_%_v2.llvmir: $(AMD_IN)/amp_%_v2.cl ${CLCOMPILE} + @rm -f $(subst .llvmir,*.kernel,$@) + $(CLCOMPILE) "-D VLIW1 -I $(AMD_IN)/" $< $@ + +$(AMD_OUT)/amp_%_v4.llvmir: $(AMD_IN)/amp_%_v4.cl ${CLCOMPILE} + @rm -f $(subst .llvmir,*.kernel,$@) + $(CLCOMPILE) "-D VLIW1 -I $(AMD_IN)/" $< $@ + +$(AMD_OUT)/%.VLIW1.llvmir: $(AMD_IN)/%.cl ${CLCOMPILE} + @rm -f $(subst VLIW1.llvmir,*.kernel,$@) + $(CLCOMPILE) "-D VLIW1 -I $(AMD_IN)/" $< $@ + +$(AMD_OUT)/%.VLIW4.llvmir: $(AMD_IN)/%.cl ${CLCOMPILE} + @rm -f $(subst VLIW4.llvmir,*.kernel,$@) + $(CLCOMPILE) "-D VLIW4 -I $(AMD_IN)/" $< $@ + +$(AMD_OUT)/%.VLIW5.llvmir: $(AMD_IN)/%.cl ${CLCOMPILE} + @rm -f $(subst VLIW5.llvmir,*.kernel,$@) + $(CLCOMPILE) "-D VLIW5 -I $(AMD_IN)/" $< $@ + +# scrypt specific kernels + +.PHONY : $(AMD_OUT)/m08900.VLIW1.llvmir $(AMD_OUT)/m08900.VLIW4.llvmir $(AMD_OUT)/m08900.VLIW5.llvmir + +$(AMD_OUT)/m08900.VLIW1.llvmir: $(foreach N,$(SCRYPT_N_ALL),$(foreach R,$(SCRYPT_R_ALL),$(foreach P,$(SCRYPT_P_ALL),$(foreach TMTO,$(SCRYPT_TMTO_ALL),$(AMD_OUT)/m08900_$(N)_$(R)_$(P)_$(TMTO).VLIW1.llvmir)))) ${CLCOMPILE} + +$(AMD_OUT)/m08900.VLIW4.llvmir: $(foreach N,$(SCRYPT_N_ALL),$(foreach R,$(SCRYPT_R_ALL),$(foreach P,$(SCRYPT_P_ALL),$(foreach TMTO,$(SCRYPT_TMTO_ALL),$(AMD_OUT)/m08900_$(N)_$(R)_$(P)_$(TMTO).VLIW4.llvmir)))) ${CLCOMPILE} + +$(AMD_OUT)/m08900.VLIW5.llvmir: $(foreach N,$(SCRYPT_N_ALL),$(foreach R,$(SCRYPT_R_ALL),$(foreach P,$(SCRYPT_P_ALL),$(foreach TMTO,$(SCRYPT_TMTO_ALL),$(AMD_OUT)/m08900_$(N)_$(R)_$(P)_$(TMTO).VLIW5.llvmir)))) ${CLCOMPILE} + +$(AMD_OUT)/m08900_%.llvmir: $(AMD_IN)/m08900.cl ${CLCOMPILE} + @rm -f $(subst .llvmir,*.kernel,$@) + $(eval splitted := $(subst ., ,$(subst _, ,$@))) + $(eval n_val := $(wordlist 2, 2, $(splitted))) + $(eval r_val := $(wordlist 3, 3, $(splitted))) + $(eval p_val := $(wordlist 4, 4, $(splitted))) + $(eval tmto_val := $(wordlist 5, 5, $(splitted))) + $(eval vliw_val := $(wordlist 6, 6, $(splitted))) + $(CLCOMPILE) "-D $(vliw_val) -I $(AMD_IN)/ -DSCRYPT_N=$(n_val) -DSCRYPT_R=$(r_val) -DSCRYPT_P=$(p_val) -DSCRYPT_TMTO=$(tmto_val)" $< $@ + +## +## Targets: NV Kernels 32 bit (oclHashcat) +## + +# general kernels + +$(NV_OUT)/%.sm_20.32.cubin: $(NV_IN)/%.cu + ${NVCC} -ccbin $(CC_LINUX_32) -cubin --machine 32 -o $@ -arch sm_20 -I . -I $(NV_IN)/ $< -Dsm_20 -DNV32 + +$(NV_OUT)/%.sm_21.32.cubin: $(NV_IN)/%.cu + ${NVCC} -ccbin $(CC_LINUX_32) -cubin --machine 32 -o $@ -arch sm_21 -I . -I $(NV_IN)/ $< -Dsm_21 -DNV32 + +$(NV_OUT)/%.sm_30.32.cubin: $(NV_IN)/%.cu + ${NVCC} -ccbin $(CC_LINUX_32) -cubin --machine 32 -o $@ -arch sm_30 -I . -I $(NV_IN)/ $< -Dsm_30 -DNV32 + +$(NV_OUT)/%.sm_35.32.cubin: $(NV_IN)/%.cu + ${NVCC} -ccbin $(CC_LINUX_32) -cubin --machine 32 -o $@ -arch sm_35 -I . -I $(NV_IN)/ $< -Dsm_35 -DNV32 + +$(NV_OUT)/%.sm_37.32.cubin: $(NV_IN)/%.cu + ${NVCC} -ccbin $(CC_LINUX_32) -cubin --machine 32 -o $@ -arch sm_37 -I . -I $(NV_IN)/ $< -Dsm_37 -DNV32 + +$(NV_OUT)/%.sm_50.32.cubin: $(NV_IN)/%.cu + ${NVCC} -ccbin $(CC_LINUX_32) -cubin --machine 32 -o $@ -arch sm_50 -I . -I $(NV_IN)/ $< -Dsm_50 -DNV32 + +$(NV_OUT)/%.sm_52.32.cubin: $(NV_IN)/%.cu + ${NVCC} -ccbin $(CC_LINUX_32) -cubin --machine 32 -o $@ -arch sm_52 -I . -I $(NV_IN)/ $< -Dsm_52 -DNV32 + +# scrypt specific kernels + +.PHONY : $(NV_OUT)/m08900.sm_20.32.cubin $(NV_OUT)/m08900.sm_21.32.cubin $(NV_OUT)/m08900.sm_30.32.cubin $(NV_OUT)/m08900.sm_35.32.cubin $(NV_OUT)/m08900.sm_37.32.cubin $(NV_OUT)/m08900.sm_50.32.cubin $(NV_OUT)/m08900.sm_52.32.cubin + +$(NV_OUT)/m08900.sm_20.32.cubin:$(foreach N,$(SCRYPT_N_ALL),$(foreach R,$(SCRYPT_R_ALL),$(foreach P,$(SCRYPT_P_ALL),$(foreach TMTO,$(SCRYPT_TMTO_ALL),$(NV_OUT)/m08900_$(N)_$(R)_$(P)_$(TMTO).sm_20.32.cubin)))) + +$(NV_OUT)/m08900.sm_21.32.cubin:$(foreach N,$(SCRYPT_N_ALL),$(foreach R,$(SCRYPT_R_ALL),$(foreach P,$(SCRYPT_P_ALL),$(foreach TMTO,$(SCRYPT_TMTO_ALL),$(NV_OUT)/m08900_$(N)_$(R)_$(P)_$(TMTO).sm_21.32.cubin)))) + +$(NV_OUT)/m08900.sm_30.32.cubin:$(foreach N,$(SCRYPT_N_ALL),$(foreach R,$(SCRYPT_R_ALL),$(foreach P,$(SCRYPT_P_ALL),$(foreach TMTO,$(SCRYPT_TMTO_ALL),$(NV_OUT)/m08900_$(N)_$(R)_$(P)_$(TMTO).sm_30.32.cubin)))) + +$(NV_OUT)/m08900.sm_35.32.cubin:$(foreach N,$(SCRYPT_N_ALL),$(foreach R,$(SCRYPT_R_ALL),$(foreach P,$(SCRYPT_P_ALL),$(foreach TMTO,$(SCRYPT_TMTO_ALL),$(NV_OUT)/m08900_$(N)_$(R)_$(P)_$(TMTO).sm_35.32.cubin)))) + +$(NV_OUT)/m08900.sm_37.32.cubin:$(foreach N,$(SCRYPT_N_ALL),$(foreach R,$(SCRYPT_R_ALL),$(foreach P,$(SCRYPT_P_ALL),$(foreach TMTO,$(SCRYPT_TMTO_ALL),$(NV_OUT)/m08900_$(N)_$(R)_$(P)_$(TMTO).sm_37.32.cubin)))) + +$(NV_OUT)/m08900.sm_50.32.cubin:$(foreach N,$(SCRYPT_N_ALL),$(foreach R,$(SCRYPT_R_ALL),$(foreach P,$(SCRYPT_P_ALL),$(foreach TMTO,$(SCRYPT_TMTO_ALL),$(NV_OUT)/m08900_$(N)_$(R)_$(P)_$(TMTO).sm_50.32.cubin)))) + +$(NV_OUT)/m08900.sm_52.32.cubin:$(foreach N,$(SCRYPT_N_ALL),$(foreach R,$(SCRYPT_R_ALL),$(foreach P,$(SCRYPT_P_ALL),$(foreach TMTO,$(SCRYPT_TMTO_ALL),$(NV_OUT)/m08900_$(N)_$(R)_$(P)_$(TMTO).sm_52.32.cubin)))) + +$(NV_OUT)/m08900_%.32.cubin: $(NV_IN)/m08900.cu + $(eval splitted := $(subst ., ,$(subst _, ,$@))) + $(eval n_val := $(wordlist 2, 2, $(splitted))) + $(eval r_val := $(wordlist 3, 3, $(splitted))) + $(eval p_val := $(wordlist 4, 4, $(splitted))) + $(eval tmto_val := $(wordlist 5, 5, $(splitted))) + $(eval cubin_val := $(wordlist 7, 7, $(splitted))) + ${NVCC} -ccbin $(CC_LINUX_32) -cubin --machine 32 -o $@ -arch sm_$(cubin_val) -I . -I $(NV_IN)/ $< -Dsm_$(cubin_val) -DSCRYPT_N=$(n_val) -DSCRYPT_R=$(r_val) -DSCRYPT_P=$(p_val) -DSCRYPT_TMTO=$(tmto_val) + +## +## Targets: NV Kernels 64 bit (oclHashcat) +## + +# general kernels + +$(NV_OUT)/%.sm_20.64.cubin: $(NV_IN)/%.cu + ${NVCC} -ccbin $(CC_LINUX_64) -cubin --machine 64 -o $@ -arch sm_20 -I . -I $(NV_IN)/ $< -Dsm_20 -DNV64 + +$(NV_OUT)/%.sm_21.64.cubin: $(NV_IN)/%.cu + ${NVCC} -ccbin $(CC_LINUX_64) -cubin --machine 64 -o $@ -arch sm_21 -I . -I $(NV_IN)/ $< -Dsm_21 -DNV64 + +$(NV_OUT)/%.sm_30.64.cubin: $(NV_IN)/%.cu + ${NVCC} -ccbin $(CC_LINUX_64) -cubin --machine 64 -o $@ -arch sm_30 -I . -I $(NV_IN)/ $< -Dsm_30 -DNV64 + +$(NV_OUT)/%.sm_35.64.cubin: $(NV_IN)/%.cu + ${NVCC} -ccbin $(CC_LINUX_64) -cubin --machine 64 -o $@ -arch sm_35 -I . -I $(NV_IN)/ $< -Dsm_35 -DNV64 + +$(NV_OUT)/%.sm_37.64.cubin: $(NV_IN)/%.cu + ${NVCC} -ccbin $(CC_LINUX_64) -cubin --machine 64 -o $@ -arch sm_37 -I . -I $(NV_IN)/ $< -Dsm_37 -DNV64 + +$(NV_OUT)/%.sm_50.64.cubin: $(NV_IN)/%.cu + ${NVCC} -ccbin $(CC_LINUX_64) -cubin --machine 64 -o $@ -arch sm_50 -I . -I $(NV_IN)/ $< -Dsm_50 -DNV64 + +$(NV_OUT)/%.sm_52.64.cubin: $(NV_IN)/%.cu + ${NVCC} -ccbin $(CC_LINUX_64) -cubin --machine 64 -o $@ -arch sm_52 -I . -I $(NV_IN)/ $< -Dsm_52 -DNV64 + +# scrypt specific kernels + +.PHONY : $(NV_OUT)/m08900.sm_20.64.cubin $(NV_OUT)/m08900.sm_21.64.cubin $(NV_OUT)/m08900.sm_30.64.cubin $(NV_OUT)/m08900.sm_35.64.cubin $(NV_OUT)/m08900.sm_37.64.cubin $(NV_OUT)/m08900.sm_50.64.cubin $(NV_OUT)/m08900.sm_52.64.cubin + +$(NV_OUT)/m08900.sm_20.64.cubin:$(foreach N,$(SCRYPT_N_ALL),$(foreach R,$(SCRYPT_R_ALL),$(foreach P,$(SCRYPT_P_ALL),$(foreach TMTO,$(SCRYPT_TMTO_ALL),$(NV_OUT)/m08900_$(N)_$(R)_$(P)_$(TMTO).sm_20.64.cubin)))) + +$(NV_OUT)/m08900.sm_21.64.cubin:$(foreach N,$(SCRYPT_N_ALL),$(foreach R,$(SCRYPT_R_ALL),$(foreach P,$(SCRYPT_P_ALL),$(foreach TMTO,$(SCRYPT_TMTO_ALL),$(NV_OUT)/m08900_$(N)_$(R)_$(P)_$(TMTO).sm_21.64.cubin)))) + +$(NV_OUT)/m08900.sm_30.64.cubin:$(foreach N,$(SCRYPT_N_ALL),$(foreach R,$(SCRYPT_R_ALL),$(foreach P,$(SCRYPT_P_ALL),$(foreach TMTO,$(SCRYPT_TMTO_ALL),$(NV_OUT)/m08900_$(N)_$(R)_$(P)_$(TMTO).sm_30.64.cubin)))) + +$(NV_OUT)/m08900.sm_35.64.cubin:$(foreach N,$(SCRYPT_N_ALL),$(foreach R,$(SCRYPT_R_ALL),$(foreach P,$(SCRYPT_P_ALL),$(foreach TMTO,$(SCRYPT_TMTO_ALL),$(NV_OUT)/m08900_$(N)_$(R)_$(P)_$(TMTO).sm_35.64.cubin)))) + +$(NV_OUT)/m08900.sm_37.64.cubin:$(foreach N,$(SCRYPT_N_ALL),$(foreach R,$(SCRYPT_R_ALL),$(foreach P,$(SCRYPT_P_ALL),$(foreach TMTO,$(SCRYPT_TMTO_ALL),$(NV_OUT)/m08900_$(N)_$(R)_$(P)_$(TMTO).sm_37.64.cubin)))) + +$(NV_OUT)/m08900.sm_50.64.cubin:$(foreach N,$(SCRYPT_N_ALL),$(foreach R,$(SCRYPT_R_ALL),$(foreach P,$(SCRYPT_P_ALL),$(foreach TMTO,$(SCRYPT_TMTO_ALL),$(NV_OUT)/m08900_$(N)_$(R)_$(P)_$(TMTO).sm_50.64.cubin)))) + +$(NV_OUT)/m08900.sm_52.64.cubin:$(foreach N,$(SCRYPT_N_ALL),$(foreach R,$(SCRYPT_R_ALL),$(foreach P,$(SCRYPT_P_ALL),$(foreach TMTO,$(SCRYPT_TMTO_ALL),$(NV_OUT)/m08900_$(N)_$(R)_$(P)_$(TMTO).sm_52.64.cubin)))) + +$(NV_OUT)/m08900_%.64.cubin: $(NV_IN)/m08900.cu + $(eval splitted := $(subst ., ,$(subst _, ,$@))) + $(eval n_val := $(wordlist 2, 2, $(splitted))) + $(eval r_val := $(wordlist 3, 3, $(splitted))) + $(eval p_val := $(wordlist 4, 4, $(splitted))) + $(eval tmto_val := $(wordlist 5, 5, $(splitted))) + $(eval cubin_val := $(wordlist 7, 7, $(splitted))) + ${NVCC} -ccbin $(CC_LINUX_64) -cubin --machine 64 -o $@ -arch sm_$(cubin_val) -I . -I $(NV_IN)/ $< -Dsm_$(cubin_val) -DNV64 -DSCRYPT_N=$(n_val) -DSCRYPT_R=$(r_val) -DSCRYPT_P=$(p_val) -DSCRYPT_TMTO=$(tmto_val) + +## +## Targets: Libraries +## + +lib/libOpenCL.a: + ${DLL_WIN_32} -A -k -l lib/libOpenCL.a -d lib/OpenCL.def + +lib/libOpenCL64.a: + ${DLL_WIN_64} -A -k -l lib/libOpenCL64.a -d lib/OpenCL64.def + +lib/libcuda.a: + ${DLL_WIN_32} -A -k -l lib/libcuda.a -d lib/cuda.def + +lib/libcuda64.a: + ${DLL_WIN_64} -A -k -l lib/libcuda64.a -d lib/cuda64.def + +## +## oclHashcat +## + +obj/%.oclHashcat.LINUX.32.o: src/%.c + $(CC_LINUX_32) $(CFLAGS) $(CFLAGS_LINUX) $(CFLAGS_32) $(CFLAGS_OCL_LINUX) -c -o $@ $< + +obj/%.oclHashcat.LINUX.64.o: src/%.c + $(CC_LINUX_64) $(CFLAGS) $(CFLAGS_LINUX) $(CFLAGS_64) $(CFLAGS_OCL_LINUX) -c -o $@ $< + +obj/%.oclHashcat.WIN.32.o: src/%.c + $(CC_WIN_32) $(CFLAGS) $(CFLAGS_WIN) $(CFLAGS_32) $(CFLAGS_OCL_WIN) -c -o $@ $< + +obj/%.oclHashcat.WIN.64.o: src/%.c + $(CC_WIN_64) $(CFLAGS) $(CFLAGS_WIN) $(CFLAGS_64) $(CFLAGS_OCL_WIN) -c -o $@ $< + +obj/%.cudaHashcat.LINUX.32.o: src/%.c + $(CC_LINUX_32) $(CFLAGS) $(CFLAGS_LINUX) $(CFLAGS_32) $(CFLAGS_CUDA_LINUX) -c -o $@ $< + +obj/%.cudaHashcat.LINUX.64.o: src/%.c + $(CC_LINUX_64) $(CFLAGS) $(CFLAGS_LINUX) $(CFLAGS_64) $(CFLAGS_CUDA_LINUX) -c -o $@ $< + +obj/%.cudaHashcat.WIN.32.o: src/%.c + $(CC_WIN_32) $(CFLAGS) $(CFLAGS_WIN) $(CFLAGS_32) $(CFLAGS_CUDA_WIN) -c -o $@ $< + +obj/%.cudaHashcat.WIN.64.o: src/%.c + $(CC_WIN_64) $(CFLAGS) $(CFLAGS_WIN) $(CFLAGS_64) $(CFLAGS_CUDA_WIN) -c -o $@ $< + +oclHashcat32.bin: src/oclHashcat.c obj/ext_OpenCL.oclHashcat.LINUX.32.o obj/ext_ADL.oclHashcat.LINUX.32.o obj/shared.oclHashcat.LINUX.32.o obj/rp_gpu_on_cpu.oclHashcat.LINUX.32.o + $(CC_LINUX_32) $(CFLAGS) $(CFLAGS_LINUX) $(CFLAGS_32) $(CFLAGS_OCL_LINUX) -o $@ -DCOMPTIME=$(NOW) $^ -L$(OCLLIBPATH32) $(LFLAGS_OCL_LINUX) + +oclHashcat64.bin: src/oclHashcat.c obj/ext_OpenCL.oclHashcat.LINUX.64.o obj/ext_ADL.oclHashcat.LINUX.64.o obj/shared.oclHashcat.LINUX.64.o obj/rp_gpu_on_cpu.oclHashcat.LINUX.64.o + $(CC_LINUX_64) $(CFLAGS) $(CFLAGS_LINUX) $(CFLAGS_64) $(CFLAGS_OCL_LINUX) -o $@ -DCOMPTIME=$(NOW) $^ -L$(OCLLIBPATH64) $(LFLAGS_OCL_LINUX) + +oclHashcat32.exe: src/oclHashcat.c obj/ext_OpenCL.oclHashcat.WIN.32.o obj/ext_ADL.oclHashcat.WIN.32.o obj/shared.oclHashcat.WIN.32.o obj/rp_gpu_on_cpu.oclHashcat.WIN.32.o lib/libOpenCL.a /usr/i686-w64-mingw32/lib/CRT_glob.o + $(CC_WIN_32) $(CFLAGS) $(CFLAGS_WIN) $(CFLAGS_32) $(CFLAGS_OCL_WIN) -o $@ -DCOMPTIME=$(NOW) $^ -L$(OCLLIBPATH32) $(LFLAGS_OCL_WIN) -static-libgcc + +oclHashcat64.exe: src/oclHashcat.c obj/ext_OpenCL.oclHashcat.WIN.64.o obj/ext_ADL.oclHashcat.WIN.64.o obj/shared.oclHashcat.WIN.64.o obj/rp_gpu_on_cpu.oclHashcat.WIN.64.o lib/libOpenCL64.a /usr/x86_64-w64-mingw32/lib/CRT_glob.o + $(CC_WIN_64) $(CFLAGS) $(CFLAGS_WIN) $(CFLAGS_64) $(CFLAGS_OCL_WIN) -o $@ -DCOMPTIME=$(NOW) $^ -L$(OCLLIBPATH64) $(LFLAGS_OCL_WIN) -static-libgcc + +cudaHashcat32.bin: src/oclHashcat.c obj/ext_cuda.cudaHashcat.LINUX.32.o obj/ext_nvml.cudaHashcat.LINUX.32.o obj/shared.cudaHashcat.LINUX.32.o obj/rp_gpu_on_cpu.cudaHashcat.LINUX.32.o + $(CC_LINUX_32) $(CFLAGS) $(CFLAGS_LINUX) $(CFLAGS_32) $(CFLAGS_CUDA_LINUX) -o $@ -DCOMPTIME=$(NOW) $^ -L$(CUDALIBPATH32) $(LFLAGS_CUDA_LINUX) -L$(NVMLLIBPATH32) + +cudaHashcat64.bin: src/oclHashcat.c obj/ext_cuda.cudaHashcat.LINUX.64.o obj/ext_nvml.cudaHashcat.LINUX.64.o obj/shared.cudaHashcat.LINUX.64.o obj/rp_gpu_on_cpu.cudaHashcat.LINUX.64.o + $(CC_LINUX_64) $(CFLAGS) $(CFLAGS_LINUX) $(CFLAGS_64) $(CFLAGS_CUDA_LINUX) -o $@ -DCOMPTIME=$(NOW) $^ -L$(CUDALIBPATH64) $(LFLAGS_CUDA_LINUX) -L$(NVMLLIBPATH64) + +cudaHashcat32.exe: src/oclHashcat.c obj/ext_cuda.cudaHashcat.WIN.32.o obj/ext_nvapi.cudaHashcat.WIN.32.o obj/shared.cudaHashcat.WIN.32.o obj/rp_gpu_on_cpu.cudaHashcat.WIN.32.o lib/libcuda.a /usr/i686-w64-mingw32/lib/CRT_glob.o + $(CC_WIN_32) $(CFLAGS) $(CFLAGS_WIN) $(CFLAGS_32) $(CFLAGS_CUDA_WIN) -o $@ -DCOMPTIME=$(NOW) $^ -L$(CUDALIBPATH32) $(LFLAGS_CUDA_WIN) -static-libgcc $(NVAPI)/x86/nvapi.lib + +cudaHashcat64.exe: src/oclHashcat.c obj/ext_cuda.cudaHashcat.WIN.64.o obj/ext_nvapi.cudaHashcat.WIN.64.o obj/shared.cudaHashcat.WIN.64.o obj/rp_gpu_on_cpu.cudaHashcat.WIN.64.o lib/libcuda64.a /usr/x86_64-w64-mingw32/lib/CRT_glob.o + $(CC_WIN_64) $(CFLAGS) $(CFLAGS_WIN) $(CFLAGS_64) $(CFLAGS_CUDA_WIN) -o $@ -DCOMPTIME=$(NOW) $^ -L$(CUDALIBPATH64) $(LFLAGS_CUDA_WIN) -static-libgcc $(NVAPI)/amd64/nvapi64.lib diff --git a/src/ext_ADL.c b/src/ext_ADL.c new file mode 100644 index 0000000000..fdef198f3d --- /dev/null +++ b/src/ext_ADL.c @@ -0,0 +1,736 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#include + +#ifdef _POSIX +void *GetProcAddress (void *pLibrary, const char *name) +{ + return dlsym (pLibrary, name); +} +#endif + +int hc_ADL_Main_Control_Destroy (HM_LIB hDLL) +{ + ADL_MAIN_CONTROL_DESTROY ADL_Main_Control_Destroy = (ADL_MAIN_CONTROL_DESTROY) GetProcAddress (hDLL, "ADL_Main_Control_Destroy"); + + if (ADL_Main_Control_Destroy == NULL) + { + log_error ("ERROR: %s\n", "ADL_Main_Control_Destroy() is missing"); + + exit (-1); + } + + int ADL_rc = ADL_Main_Control_Destroy (); + + if (ADL_rc != ADL_OK) + { + log_info ("WARN: %s: %d\n", "ADL_Main_Control_Destroy()", ADL_rc); + } + + return (ADL_rc); +} + +int hc_ADL_Main_Control_Create (HM_LIB hDLL, ADL_MAIN_MALLOC_CALLBACK callback, int iEnumConnectedAdapters) +{ + ADL_MAIN_CONTROL_CREATE ADL_Main_Control_Create = (ADL_MAIN_CONTROL_CREATE) GetProcAddress (hDLL, "ADL_Main_Control_Create"); + + if (ADL_Main_Control_Create == NULL) + { + log_error ("ERROR: %s\n", "ADL_Main_Control_Create() is missing"); + + exit (-1); + } + + int ADL_rc = ADL_Main_Control_Create (callback, iEnumConnectedAdapters); + + if (ADL_rc != ADL_OK) + { + log_info ("WARN: %s: %d\n", "ADL_Main_Control_Create()", ADL_rc); + } + + return (ADL_rc); +} + +int hc_ADL_Adapter_NumberOfAdapters_Get (HM_LIB hDLL, int *lpNumAdapters) +{ + ADL_ADAPTER_NUMBEROFADAPTERS_GET ADL_Adapter_NumberOfAdapters_Get = (ADL_ADAPTER_NUMBEROFADAPTERS_GET) GetProcAddress (hDLL, "ADL_Adapter_NumberOfAdapters_Get"); + + if (ADL_Adapter_NumberOfAdapters_Get == NULL) + { + log_error ("ERROR: %s\n", "ADL_Adapter_NumberOfAdapters_Get() is missing"); + + exit (-1); + } + + int ADL_rc = ADL_Adapter_NumberOfAdapters_Get (lpNumAdapters); + + if (ADL_rc != ADL_OK) + { + log_info ("WARN: %s: %d\n", "ADL_Adapter_NumberOfAdapters_Get()", ADL_rc); + } + + return (ADL_rc); +} + +int hc_ADL_Adapter_AdapterInfo_Get (HM_LIB hDLL, LPAdapterInfo lpInfo, int iInputSize) +{ + ADL_ADAPTER_ADAPTERINFO_GET ADL_Adapter_AdapterInfo_Get = (ADL_ADAPTER_ADAPTERINFO_GET) GetProcAddress (hDLL, "ADL_Adapter_AdapterInfo_Get"); + + if (ADL_Adapter_AdapterInfo_Get == NULL) + { + log_error ("ERROR: %s\n", "ADL_Adapter_AdapterInfo_Get() is missing"); + + exit (-1); + } + + int ADL_rc = ADL_Adapter_AdapterInfo_Get (lpInfo, iInputSize); + + if (ADL_rc != ADL_OK) + { + log_info ("WARN: %s: %d\n", "ADL_Adapter_AdapterInfo_Get()", ADL_rc); + } + + return (ADL_rc); +} + +int hc_ADL_Display_DisplayInfo_Get (HM_LIB hDLL, int iAdapterIndex, int *iNumDisplays, ADLDisplayInfo **lppInfo, int iForceDetect) +{ + ADL_DISPLAY_DISPLAYINFO_GET ADL_Display_DisplayInfo_Get = (ADL_DISPLAY_DISPLAYINFO_GET) GetProcAddress (hDLL, "ADL_Display_DisplayInfo_Get"); + + if (ADL_Display_DisplayInfo_Get == NULL) + { + log_error ("ERROR: %s\n", "ADL_Display_DisplayInfo_Get() is missing"); + + exit (-1); + } + + int ADL_rc = ADL_Display_DisplayInfo_Get (iAdapterIndex, iNumDisplays, lppInfo, iForceDetect); + + if (ADL_rc != ADL_OK) + { + log_info ("WARN: %s: %d\n", "ADL_Display_DisplayInfo_Get()", ADL_rc); + } + + return (ADL_rc); +} + +int hc_ADL_Adapter_ID_Get (HM_LIB hDLL, int iAdapterIndex, int *lpAdapterID) +{ + HC_ADL_ADAPTER_ID_GET ADL_Adapter_ID_Get = (HC_ADL_ADAPTER_ID_GET) GetProcAddress (hDLL, "ADL_Adapter_ID_Get"); + + if (ADL_Adapter_ID_Get == NULL) + { + log_error ("ERROR: %s\n", "ADL_Adapter_ID_Get() is missing"); + + exit (-1); + } + + int ADL_rc = ADL_Adapter_ID_Get (iAdapterIndex, lpAdapterID); + + if (ADL_rc != ADL_OK) + { + log_info ("WARN: %s: %d\n", "ADL_Adapter_ID_Get()", ADL_rc); + } + + return ADL_rc; +} + +int hc_ADL_Adapter_VideoBiosInfo_Get (HM_LIB hDLL, int iAdapterIndex, ADLBiosInfo *lpBiosInfo) +{ + HC_ADL_ADAPTER_VIDEOBIOSINFO_GET ADL_Adapter_VideoBiosInfo_Get = (HC_ADL_ADAPTER_VIDEOBIOSINFO_GET) GetProcAddress (hDLL, "ADL_Adapter_VideoBiosInfo_Get"); + + if (ADL_Adapter_VideoBiosInfo_Get == NULL) + { + log_error ("ERROR: %s\n", "ADL_Adapter_VideoBiosInfo_Get() is missing"); + + exit (-1); + } + + int ADL_rc = ADL_Adapter_VideoBiosInfo_Get (iAdapterIndex, lpBiosInfo); + + if (ADL_rc != ADL_OK) + { + log_info ("WARN: %s: %d\n", "ADL_Adapter_VideoBiosInfo_Get()", ADL_rc); + } + + return ADL_rc; +} + +int hc_ADL_Overdrive_ThermalDevices_Enum (HM_LIB hDLL, int iAdapterIndex, int iThermalControllerIndex, ADLThermalControllerInfo *lpThermalControllerInfo) +{ + HC_ADL_OVERDRIVE5_THERMALDEVICES_ENUM ADL_Overdrive5_ThermalDevices_Enum = (HC_ADL_OVERDRIVE5_THERMALDEVICES_ENUM) GetProcAddress (hDLL, "ADL_Overdrive5_ThermalDevices_Enum"); + + if (ADL_Overdrive5_ThermalDevices_Enum == NULL) + { + log_error ("ERROR: %s\n", "ADL_Overdrive5_ThermalDevices_Enum() is missing"); + + exit (-1); + } + + int ADL_rc = ADL_Overdrive5_ThermalDevices_Enum (iAdapterIndex, iThermalControllerIndex, lpThermalControllerInfo); + + if (ADL_rc != ADL_OK) + { + log_info ("WARN: %s: %d\n", "ADL_Overdrive5_ThermalDevices_Enum()", ADL_rc); + } + + return (ADL_rc); +} + +int hc_ADL_Overdrive5_Temperature_Get (HM_LIB hDLL, int iAdapterIndex, int iThermalControllerIndex, ADLTemperature *lpTemperature) +{ + ADL_OVERDRIVE5_TEMPERATURE_GET ADL_Overdrive5_Temperature_Get = (ADL_OVERDRIVE5_TEMPERATURE_GET) GetProcAddress (hDLL, "ADL_Overdrive5_Temperature_Get"); + + if (ADL_Overdrive5_Temperature_Get == NULL) + { + log_error ("ERROR: %s\n", "ADL_Overdrive5_Temperature_Get() is missing"); + + exit (-1); + } + + int ADL_rc = ADL_Overdrive5_Temperature_Get (iAdapterIndex, iThermalControllerIndex, lpTemperature); + + if (ADL_rc != ADL_OK) + { + log_info ("WARN: %s: %d\n", "ADL_Overdrive5_Temperature_Get()", ADL_rc); + } + + return (ADL_rc); +} + +int hc_ADL_Overdrive6_Temperature_Get (HM_LIB hDLL, int iAdapterIndex, int *iTemperature) +{ + ADL_OVERDRIVE6_TEMPERATURE_GET ADL_Overdrive6_Temperature_Get = (ADL_OVERDRIVE6_TEMPERATURE_GET) GetProcAddress (hDLL, "ADL_Overdrive6_Temperature_Get"); + + if (ADL_Overdrive6_Temperature_Get == NULL) + { + log_error ("ERROR: %s\n", "ADL_Overdrive6_Temperature_Get() is missing"); + + exit (-1); + } + + int ADL_rc = ADL_Overdrive6_Temperature_Get (iAdapterIndex, iTemperature); + + if (ADL_rc != ADL_OK) + { + log_info ("WARN: %s: %d\n", "ADL_Overdrive6_Temperature_Get()", ADL_rc); + } + + return (ADL_rc); +} + +int hc_ADL_Overdrive_CurrentActivity_Get (HM_LIB hDLL, int iAdapterIndex, ADLPMActivity *lpActivity) +{ + HC_ADL_OVERDRIVE5_CURRENTACTIVITY_GET ADL_Overdrive5_CurrentActivity_Get = (HC_ADL_OVERDRIVE5_CURRENTACTIVITY_GET) GetProcAddress (hDLL, "ADL_Overdrive5_CurrentActivity_Get"); + + if (ADL_Overdrive5_CurrentActivity_Get == NULL) + { + log_error ("ERROR: %s\n", "ADL_Overdrive5_CurrentActivity_Get() is missing"); + + exit (-1); + } + + int ADL_rc = ADL_Overdrive5_CurrentActivity_Get (iAdapterIndex, lpActivity); + + if (ADL_rc != ADL_OK) + { + log_info ("WARN: %s: %d\n", "ADL_Overdrive5_CurrentActivity_Get()", ADL_rc); + } + + return (ADL_rc); +} + +int hc_ADL_Overdrive5_FanSpeedInfo_Get (HM_LIB hDLL, int iAdapterIndex, int iThermalControllerIndex, ADLFanSpeedInfo *lpFanSpeedInfo) +{ + HC_ADL_OVERDRIVE5_FANSPEEDINFO_GET ADL_Overdrive5_FanSpeedInfo_Get = (HC_ADL_OVERDRIVE5_FANSPEEDINFO_GET) GetProcAddress (hDLL, "ADL_Overdrive5_FanSpeedInfo_Get"); + + if (ADL_Overdrive5_FanSpeedInfo_Get == NULL) + { + log_error ("ERROR: %s\n", "ADL_Overdrive5_FanSpeedInfo_Get() is missing"); + + exit (-1); + } + + int ADL_rc = ADL_Overdrive5_FanSpeedInfo_Get (iAdapterIndex, iThermalControllerIndex, lpFanSpeedInfo); + + if (ADL_rc != ADL_OK) + { + log_info ("WARN: %s: %d\n", "ADL_Overdrive5_FanSpeedInfo_Get()", ADL_rc); + } + + return ADL_rc; +} + +int hc_ADL_Overdrive5_FanSpeed_Get (HM_LIB hDLL, int iAdapterIndex, int iThermalControllerIndex, ADLFanSpeedValue *lpFanSpeedValue) +{ + ADL_OVERDRIVE5_FANSPEED_GET ADL_Overdrive5_FanSpeed_Get = (ADL_OVERDRIVE5_FANSPEED_GET) GetProcAddress (hDLL, "ADL_Overdrive5_FanSpeed_Get"); + + if (ADL_Overdrive5_FanSpeed_Get == NULL) + { + log_error ("ERROR: %s\n", "ADL_Overdrive5_FanSpeed_Get() is missing"); + + exit (-1); + } + + int ADL_rc = ADL_Overdrive5_FanSpeed_Get (iAdapterIndex, iThermalControllerIndex, lpFanSpeedValue); + + if ((ADL_rc != ADL_OK) && (ADL_rc != ADL_ERR_NOT_SUPPORTED)) // exception allowed only here + { + log_info ("WARN: %s: %d\n", "ADL_Overdrive5_FanSpeed_Get()", ADL_rc); + } + + return (ADL_rc); +} + +int hc_ADL_Overdrive6_FanSpeed_Get (HM_LIB hDLL, int iAdapterIndex, ADLOD6FanSpeedInfo *lpFanSpeedInfo) +{ + ADL_OVERDRIVE6_FANSPEED_GET ADL_Overdrive6_FanSpeed_Get = (ADL_OVERDRIVE6_FANSPEED_GET) GetProcAddress (hDLL, "ADL_Overdrive6_FanSpeed_Get"); + + if (ADL_Overdrive6_FanSpeed_Get == NULL) + { + log_error ("ERROR: %s\n", "ADL_Overdrive6_FanSpeed_Get() is missing"); + + exit (-1); + } + + int ADL_rc = ADL_Overdrive6_FanSpeed_Get (iAdapterIndex, lpFanSpeedInfo); + + if ((ADL_rc != ADL_OK) && (ADL_rc != ADL_ERR_NOT_SUPPORTED)) // exception allowed only here + { + log_info ("WARN: %s: %d\n", "ADL_Overdrive6_FanSpeed_Get()", ADL_rc); + } + + return (ADL_rc); +} + +int hc_ADL_Overdrive5_FanSpeed_Set (HM_LIB hDLL, int iAdapterIndex, int iThermalControllerIndex, ADLFanSpeedValue *lpFanSpeedValue) +{ + ADL_OVERDRIVE5_FANSPEED_SET ADL_Overdrive5_FanSpeed_Set = (ADL_OVERDRIVE5_FANSPEED_SET) GetProcAddress (hDLL, "ADL_Overdrive5_FanSpeed_Set"); + + if (ADL_Overdrive5_FanSpeed_Set == NULL) + { + log_error ("ERROR: %s\n", "ADL_Overdrive5_FanSpeed_Set() is missing"); + + exit (-1); + } + + int ADL_rc = ADL_Overdrive5_FanSpeed_Set (iAdapterIndex, iThermalControllerIndex, lpFanSpeedValue); + + if ((ADL_rc != ADL_OK) && (ADL_rc != ADL_ERR_NOT_SUPPORTED)) // exception allowed only here + { + log_info ("WARN: %s: %d\n", "ADL_Overdrive5_FanSpeed_Set()", ADL_rc); + } + + return (ADL_rc); +} + +int hc_ADL_Overdrive6_FanSpeed_Set (HM_LIB hDLL, int iAdapterIndex, ADLOD6FanSpeedValue *lpFanSpeedValue) +{ + ADL_OVERDRIVE6_FANSPEED_SET ADL_Overdrive6_FanSpeed_Set = (ADL_OVERDRIVE6_FANSPEED_SET) GetProcAddress (hDLL, "ADL_Overdrive6_FanSpeed_Set"); + + if (ADL_Overdrive6_FanSpeed_Set == NULL) + { + log_error ("ERROR: %s\n", "ADL_Overdrive6_FanSpeed_Set() is missing"); + + exit (-1); + } + + int ADL_rc = ADL_Overdrive6_FanSpeed_Set (iAdapterIndex, lpFanSpeedValue); + + if ((ADL_rc != ADL_OK) && (ADL_rc != ADL_ERR_NOT_SUPPORTED)) // exception allowed only here + { + log_info ("WARN: %s: %d\n", "ADL_Overdrive6_FanSpeed_Set()", ADL_rc); + } + + return (ADL_rc); +} + +int hc_ADL_Overdrive5_FanSpeedToDefault_Set (HM_LIB hDLL, int iAdapterIndex, int iThermalControllerIndex) +{ + ADL_OVERDRIVE5_FANSPEEDTODEFAULT_SET ADL_Overdrive5_FanSpeedToDefault_Set = (ADL_OVERDRIVE5_FANSPEEDTODEFAULT_SET) GetProcAddress (hDLL, "ADL_Overdrive5_FanSpeedToDefault_Set"); + + if (ADL_Overdrive5_FanSpeedToDefault_Set == NULL) + { + log_error ("ERROR: %s\n", "ADL_Overdrive5_FanSpeedToDefault_Set() is missing"); + + exit (-1); + } + + int ADL_rc = ADL_Overdrive5_FanSpeedToDefault_Set (iAdapterIndex, iThermalControllerIndex); + + if ((ADL_rc != ADL_OK) && (ADL_rc != ADL_ERR_NOT_SUPPORTED)) // exception allowed only here + { + log_info ("WARN: %s: %d\n", "ADL_Overdrive5_FanSpeedToDefault_Set()", ADL_rc); + } + + return (ADL_rc); +} + +int hc_ADL_Overdrive_ODParameters_Get (HM_LIB hDLL, int iAdapterIndex, ADLODParameters *lpOdParameters) +{ + HC_ADL_OVERDRIVE5_ODPARAMETERS_GET ADL_Overdrive5_ODParameters_Get = (HC_ADL_OVERDRIVE5_ODPARAMETERS_GET) GetProcAddress (hDLL, "ADL_Overdrive5_ODParameters_Get"); + + if (ADL_Overdrive5_ODParameters_Get == NULL) + { + log_error ("ERROR: %s\n", "ADL_Overdrive5_ODParameters_Get() is missing"); + + exit (-1); + } + + int ADL_rc = ADL_Overdrive5_ODParameters_Get (iAdapterIndex, lpOdParameters); + + if (ADL_rc != ADL_OK) + { + log_info ("WARN: %s: %d\n", "ADL_Overdrive5_ODParameters_Get()", ADL_rc); + } + + return (ADL_rc); +} + +int hc_ADL_Overdrive_ODPerformanceLevels_Get (HM_LIB hDLL, int iAdapterIndex, int iDefault, ADLODPerformanceLevels *lpOdPerformanceLevels) +{ + HC_ADL_OVERDRIVE5_ODPERFORMANCELEVELS_GET ADL_Overdrive5_ODPerformanceLevels_Get = (HC_ADL_OVERDRIVE5_ODPERFORMANCELEVELS_GET) GetProcAddress (hDLL, "ADL_Overdrive5_ODPerformanceLevels_Get"); + + if (ADL_Overdrive5_ODPerformanceLevels_Get == NULL) + { + log_error ("ERROR: %s\n", "ADL_Overdrive5_ODPerformanceLevels_Get() is missing"); + + exit (-1); + } + + int ADL_rc = ADL_Overdrive5_ODPerformanceLevels_Get (iAdapterIndex, iDefault, lpOdPerformanceLevels); + + if (ADL_rc != ADL_OK) + { + log_info ("WARN: %s: %d\n", "ADL_Overdrive5_ODPerformanceLevels_Get()", ADL_rc); + } + + return (ADL_rc); +} + +int hc_ADL_Overdrive_ODPerformanceLevels_Set (HM_LIB hDLL, int iAdapterIndex, ADLODPerformanceLevels *lpOdPerformanceLevels) +{ + HC_ADL_OVERDRIVE5_ODPERFORMANCELEVELS_SET ADL_Overdrive5_ODPerformanceLevels_Set = (HC_ADL_OVERDRIVE5_ODPERFORMANCELEVELS_SET) GetProcAddress (hDLL, "ADL_Overdrive5_ODPerformanceLevels_Set"); + + if (ADL_Overdrive5_ODPerformanceLevels_Set == NULL) + { + log_error ("ERROR: %s\n", "ADL_Overdrive5_ODPerformanceLevels_Set() is missing"); + + exit (-1); + } + + int ADL_rc = ADL_Overdrive5_ODPerformanceLevels_Set (iAdapterIndex, lpOdPerformanceLevels); + + if (ADL_rc != ADL_OK) + { + log_info ("WARN: %s: %d\n", "ADL_Overdrive5_ODPerformanceLevels_Set()", ADL_rc); + } + + return (ADL_rc); +} + +int hc_ADL_Overdrive_PowerControlInfo_Get (HM_LIB hDLL, int iAdapterIndex, ADLOD6PowerControlInfo *powertune) +{ + HC_ADL_OVERDRIVE6_POWERCONTROLINFO_GET ADL_Overdrive6_PowerControlInfo_Get = (HC_ADL_OVERDRIVE6_POWERCONTROLINFO_GET) GetProcAddress (hDLL, "ADL_Overdrive6_PowerControlInfo_Get"); + + if (ADL_Overdrive6_PowerControlInfo_Get == NULL) + { + log_error ("ERROR: %s\n", "ADL_Overdrive6_PowerControlInfo_Get is missing"); + + exit (-1); + } + + int ADL_rc = ADL_Overdrive6_PowerControlInfo_Get (iAdapterIndex, powertune); + + return (ADL_rc); +} + +int hc_ADL_Overdrive_PowerControl_Get (HM_LIB hDLL, int iAdapterIndex, int *iCurrentValue) +{ + HC_ADL_OVERDRIVE6_POWERCONTROL_GET ADL_Overdrive6_PowerControl_Get = (HC_ADL_OVERDRIVE6_POWERCONTROL_GET) GetProcAddress (hDLL, "ADL_Overdrive6_PowerControl_Get"); + + if (ADL_Overdrive6_PowerControl_Get == NULL) + { + log_error ("ERROR: %s\n", "ADL_Overdrive6_PowerControl_Get is missing"); + + exit (-1); + } + + int default_value = 0; + + int ADL_rc = ADL_Overdrive6_PowerControl_Get (iAdapterIndex, iCurrentValue, &default_value); + + return (ADL_rc); +} + +int hc_ADL_Overdrive_PowerControl_Set (HM_LIB hDLL, int iAdapterIndex, int level) +{ + HC_ADL_OVERDRIVE6_POWERCONTROL_SET ADL_Overdrive6_PowerControl_Set = (HC_ADL_OVERDRIVE6_POWERCONTROL_SET) GetProcAddress (hDLL, "ADL_Overdrive6_PowerControl_Set"); + + int ADL_rc = ADL_ERR; + + ADLOD6PowerControlInfo powertune = {0, 0, 0, 0, 0}; + + if ((ADL_rc = hc_ADL_Overdrive_PowerControlInfo_Get (hDLL, iAdapterIndex, &powertune)) != ADL_OK) + { + log_info ("WARN: %s\n", "ADL_Overdrive6_PowerControl_Get", ADL_rc); + } + else + { + int min = powertune.iMinValue; + int max = powertune.iMaxValue; + int step = powertune.iStepValue; + + if (level < min || level > max) + { + log_info ("WARN: ADL PowerControl level invalid"); + + return ADL_ERR; + } + if (level % step != 0) + { + log_info ("WARN: ADL PowerControl step invalid"); + + return ADL_ERR; + } + + ADL_rc = ADL_Overdrive6_PowerControl_Set (iAdapterIndex, level); + } + + return (ADL_rc); +} + +int hc_ADL_Adapter_Active_Get (HM_LIB hDLL, int iAdapterIndex, int *lpStatus) +{ + ADL_ADAPTER_ACTIVE_GET ADL_Adapter_Active_Get = (ADL_ADAPTER_ACTIVE_GET) GetProcAddress (hDLL, "ADL_Adapter_Active_Get"); + + if (ADL_Adapter_Active_Get == NULL) + { + log_error ("ERROR: %s\n", "ADL_Adapter_Active_Get() is missing"); + + exit (-1); + } + + int ADL_rc = ADL_Adapter_Active_Get (iAdapterIndex, lpStatus); + + if (ADL_rc != ADL_OK) + { + log_info ("WARN: %s: %d\n", "ADL_Adapter_Active_Get()", ADL_rc); + } + + return (ADL_rc); +} + +int hc_ADL_DisplayEnable_Set (HM_LIB hDLL, int iAdapterIndex, int *lpDisplayIndexList, int iDisplayListSize, int bPersistOnly) +{ + ADL_DISPLAYENABLE_SET ADL_DisplayEnable_Set = (ADL_DISPLAYENABLE_SET) GetProcAddress (hDLL, "ADL_DisplayEnable_Set"); + + if (ADL_DisplayEnable_Set == NULL) + { + log_error ("ERROR: %s\n", "ADL_DisplayEnable_Set() is missing"); + + exit (-1); + } + + int ADL_rc = ADL_DisplayEnable_Set (iAdapterIndex, lpDisplayIndexList, iDisplayListSize, bPersistOnly); + + if (ADL_rc != ADL_OK) + { + log_info ("WARN: %s: %d\n", "ADL_DisplayEnable_Set()", ADL_rc); + } + + return (ADL_rc); +} + +int hc_ADL_Overdrive_Caps (HM_LIB hDLL, int iAdapterIndex, int *od_supported, int *od_enabled, int *od_version) +{ + ADL_OVERDRIVE_CAPS ADL_Overdrive_Caps = (ADL_OVERDRIVE_CAPS) GetProcAddress (hDLL, "ADL_Overdrive_Caps"); + + if (ADL_Overdrive_Caps == NULL) + { + log_error ("ERROR: %s\n", "ADL_Overdrive_Caps() is missing"); + + exit (-1); + } + + int ADL_rc = ADL_Overdrive_Caps (iAdapterIndex, od_supported, od_enabled, od_version); + + return (ADL_rc) ; +} + +int hc_ADL_Overdrive6_PowerControl_Caps (HM_LIB hDLL, int iAdapterIndex, int *lpSupported) +{ + ADL_OVERDRIVE6_POWERCONTROL_CAPS ADL_Overdrive6_PowerControl_Caps = (ADL_OVERDRIVE6_POWERCONTROL_CAPS) GetProcAddress (hDLL, "ADL_Overdrive6_PowerControl_Caps"); + + if (ADL_Overdrive6_PowerControl_Caps == NULL) + { + log_error ("ERROR: %s\n", "ADL_Overdrive6_PowerControl_Caps() is missing"); + + exit (-1); + } + + int ADL_rc = ADL_Overdrive6_PowerControl_Caps (iAdapterIndex, lpSupported); + + return (ADL_rc) ; +} + +int hc_ADL_Overdrive_Capabilities_Get (HM_LIB hDLL, int iAdapterIndex, ADLOD6Capabilities *caps) +{ + ADL_OVERDRIVE6_CAPABILITIES_GET ADL_Overdrive6_Capabilities_Get = (ADL_OVERDRIVE6_CAPABILITIES_GET) GetProcAddress (hDLL, "ADL_Overdrive6_Capabilities_Get"); + + if (ADL_Overdrive6_Capabilities_Get == NULL) + { + log_error ("ERROR: %s\n", "ADL_Overdrive6_Capabilities_Get() is missing"); + + exit (-1); + } + + int ADL_rc = ADL_Overdrive6_Capabilities_Get (iAdapterIndex, caps); + + return (ADL_rc); +} + +int hc_ADL_Overdrive_StateInfo_Get (HM_LIB hDLL, int iAdapterIndex, int type, ADLOD6MemClockState *state) +{ + ADL_OVERDRIVE6_STATEINFO_GET ADL_Overdrive6_StateInfo_Get = (ADL_OVERDRIVE6_STATEINFO_GET) GetProcAddress (hDLL, "ADL_Overdrive6_StateInfo_Get"); + + if (ADL_Overdrive6_StateInfo_Get == NULL) + { + log_error ("ERROR: %s\n", "ADL_Overdrive6_StateInfo_Get() is missing"); + + exit (-1); + } + + int ADL_rc = ADL_Overdrive6_StateInfo_Get (iAdapterIndex, type, state); + + if (ADL_rc == ADL_OK) + { + // check if clocks are okay with step sizes + // if not run a little hack: adjust the clocks to nearest clock size (clock down just a little bit) + + ADLOD6Capabilities caps; + + if ((hc_ADL_Overdrive_Capabilities_Get (hDLL, iAdapterIndex, &caps)) != ADL_OK) + { + log_info ("ERROR: failed to get ADL device capabilities"); + + exit (1); + } + + if (state->state.aLevels[0].iEngineClock % caps.sEngineClockRange.iStep != 0) + { + log_info ("WARN: ADL engine step size invalid for performance level 1"); + state->state.aLevels[0].iEngineClock -= state->state.aLevels[0].iEngineClock % caps.sEngineClockRange.iStep; + } + + if (state->state.aLevels[1].iEngineClock % caps.sEngineClockRange.iStep != 0) + { + log_info ("WARN: ADL engine step size invalid for performance level 2"); + state->state.aLevels[1].iEngineClock -= state->state.aLevels[1].iEngineClock % caps.sEngineClockRange.iStep; + } + + if (state->state.aLevels[0].iMemoryClock % caps.sMemoryClockRange.iStep != 0) + { + log_info ("WARN: ADL memory step size invalid for performance level 1"); + state->state.aLevels[0].iMemoryClock -= state->state.aLevels[0].iMemoryClock % caps.sMemoryClockRange.iStep; + } + + if (state->state.aLevels[1].iMemoryClock % caps.sMemoryClockRange.iStep != 0) + { + log_info ("WARN: ADL memory step size invalid for performance level 2"); + state->state.aLevels[1].iMemoryClock -= state->state.aLevels[1].iMemoryClock % caps.sMemoryClockRange.iStep; + } + } + + return (ADL_rc); +} + +int hc_ADL_Overdrive_CurrentStatus_Get (HM_LIB hDLL, int iAdapterIndex, ADLOD6CurrentStatus *status) +{ + ADL_OVERDRIVE6_CURRENTSTATUS_GET ADL_Overdrive6_CurrentStatus_Get = (ADL_OVERDRIVE6_CURRENTSTATUS_GET) GetProcAddress (hDLL, "ADL_Overdrive6_CurrentStatus_Get"); + + if (ADL_Overdrive6_CurrentStatus_Get == NULL) + { + log_error ("ERROR: %s\n", "ADL_Overdrive6_CurrentStatus_Get() is missing"); + + exit (-1); + } + + int ADL_rc = ADL_Overdrive6_CurrentStatus_Get (iAdapterIndex, status); + + return (ADL_rc); +} + +int hc_ADL_Overdrive_State_Set (HM_LIB hDLL, int iAdapterIndex, int type, ADLOD6StateInfo *state) +{ + ADL_OVERDRIVE6_STATE_SET ADL_Overdrive6_State_Set = (ADL_OVERDRIVE6_STATE_SET) GetProcAddress (hDLL, "ADL_Overdrive6_State_Set"); + + if (ADL_Overdrive6_State_Set == NULL) + { + log_error ("ERROR: %s\n", "ADL_Overdrive6_State_Set() is missing"); + + exit (- 1); + } + + // sanity checks + + ADLOD6Capabilities caps; + + if ((hc_ADL_Overdrive_Capabilities_Get (hDLL, iAdapterIndex, &caps)) != ADL_OK) + { + log_info ("ERROR: failed to get ADL device capabilities"); + + exit (1); + } + + if (state->aLevels[0].iEngineClock < caps.sEngineClockRange.iMin || state->aLevels[1].iEngineClock > caps.sEngineClockRange.iMax) + { + log_info ("WARN: ADL engine clock outside valid range"); + + return ADL_ERR; + } + + if (state->aLevels[1].iEngineClock % caps.sEngineClockRange.iStep != 0) + { + log_info ("WARN: ADL engine step size invalid"); + + return ADL_ERR; + } + + if (state->aLevels[0].iMemoryClock < caps.sMemoryClockRange.iMin || state->aLevels[1].iMemoryClock > caps.sMemoryClockRange.iMax) + { + log_info ("WARN: ADL memory clock outside valid range"); + + return ADL_ERR; + } + + if (state->aLevels[1].iMemoryClock % caps.sMemoryClockRange.iStep != 0) + { + log_info ("WARN: ADL memory step size invalid"); + + return ADL_ERR; + } + + int ADL_rc = ADL_Overdrive6_State_Set (iAdapterIndex, type, state); + + return (ADL_rc); +} + +int hc_ADL_Overdrive6_TargetTemperatureData_Get (HM_LIB hDLL, int iAdapterIndex, int *cur_temp, int *default_temp) +{ + ADL_OVERDRIVE6_TARGETTEMPERATUREDATA_GET ADL_Overdrive6_TargetTemperatureData_Get = (ADL_OVERDRIVE6_TARGETTEMPERATUREDATA_GET) GetProcAddress (hDLL, "ADL_Overdrive6_TargetTemperatureData_Get"); + + if (ADL_Overdrive6_TargetTemperatureData_Get == NULL) + { + log_error ("ERROR: %s\n", "ADL_Overdrive6_TargetTemperatureData_Get() is missing"); + + exit (-1); + } + + int ADL_rc = ADL_Overdrive6_TargetTemperatureData_Get (iAdapterIndex, cur_temp, default_temp); + + return (ADL_rc); +} diff --git a/src/ext_OpenCL.c b/src/ext_OpenCL.c new file mode 100644 index 0000000000..c73522b02e --- /dev/null +++ b/src/ext_OpenCL.c @@ -0,0 +1,376 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#include + +void hc_clEnqueueNDRangeKernel (cl_command_queue command_queue, cl_kernel kernel, cl_uint work_dim, const size_t *global_work_offset, const size_t *global_work_size, const size_t *local_work_size, cl_uint num_events_in_wait_list, const cl_event *event_wait_list, cl_event *event) +{ + cl_int CL_err = clEnqueueNDRangeKernel (command_queue, kernel, work_dim, global_work_offset, global_work_size, local_work_size, num_events_in_wait_list, event_wait_list, event); + + if (CL_err != CL_SUCCESS) + { + log_error ("ERROR: %s %d\n", "clEnqueueNDRangeKernel()", CL_err); + + exit (-1); + } +} + +void hc_clGetEventInfo (cl_event event, cl_event_info param_name, size_t param_value_size, void *param_value, size_t *param_value_size_ret) +{ + cl_int CL_err = clGetEventInfo (event, param_name, param_value_size, param_value, param_value_size_ret); + + if (CL_err != CL_SUCCESS) + { + log_error ("ERROR: %s %d\n", "clGetEventInfo()", CL_err); + + exit (-1); + } +} + +void hc_clFlush (cl_command_queue command_queue) +{ + cl_int CL_err = clFlush (command_queue); + + if (CL_err != CL_SUCCESS) + { + log_error ("ERROR: %s %d\n", "clFlush()", CL_err); + + exit (-1); + } +} + +void hc_clFinish (cl_command_queue command_queue) +{ + cl_int CL_err = clFinish (command_queue); + + if (CL_err != CL_SUCCESS) + { + log_error ("ERROR: %s %d\n", "clFinish()", CL_err); + + exit (-1); + } +} + +void hc_clSetKernelArg (cl_kernel kernel, cl_uint arg_index, size_t arg_size, const void *arg_value) +{ + cl_int CL_err = clSetKernelArg (kernel, arg_index, arg_size, arg_value); + + if (CL_err != CL_SUCCESS) + { + log_error ("ERROR: %s %d\n", "clSetKernelArg()", CL_err); + + exit (-1); + } +} + +void hc_clEnqueueWriteBuffer (cl_command_queue command_queue, cl_mem buffer, cl_bool blocking_write, size_t offset, size_t cb, const void *ptr, cl_uint num_events_in_wait_list, const cl_event *event_wait_list, cl_event *event) +{ + cl_int CL_err = clEnqueueWriteBuffer (command_queue, buffer, blocking_write, offset, cb, ptr, num_events_in_wait_list, event_wait_list, event); + + if (CL_err != CL_SUCCESS) + { + log_error ("ERROR: %s %d\n", "clEnqueueWriteBuffer()", CL_err); + + exit (-1); + } +} + +void hc_clEnqueueCopyBuffer (cl_command_queue command_queue, cl_mem src_buffer, cl_mem dst_buffer, size_t src_offset, size_t dst_offset, size_t cb, cl_uint num_events_in_wait_list, const cl_event *event_wait_list, cl_event *event) +{ + cl_int CL_err = clEnqueueCopyBuffer (command_queue, src_buffer, dst_buffer, src_offset, dst_offset, cb, num_events_in_wait_list, event_wait_list, event); + + if (CL_err != CL_SUCCESS) + { + log_error ("ERROR: %s %d\n", "clEnqueueCopyBuffer()", CL_err); + + exit (-1); + } +} + +void hc_clEnqueueReadBuffer (cl_command_queue command_queue, cl_mem buffer, cl_bool blocking_read, size_t offset, size_t cb, void *ptr, cl_uint num_events_in_wait_list, const cl_event *event_wait_list, cl_event *event) +{ + cl_int CL_err = clEnqueueReadBuffer (command_queue, buffer, blocking_read, offset, cb, ptr, num_events_in_wait_list, event_wait_list, event); + + if (CL_err != CL_SUCCESS) + { + log_error ("ERROR: %s %d\n", "clEnqueueReadBuffer()", CL_err); + + exit (-1); + } +} + +void hc_clGetPlatformIDs (cl_uint num_entries, cl_platform_id *platforms, cl_uint *num_platforms) +{ + cl_int CL_err = clGetPlatformIDs (num_entries, platforms, num_platforms); + + if (CL_err != CL_SUCCESS) + { + log_error ("ERROR: %s %d\n", "clGetPlatformIDs()", CL_err); + + exit (-1); + } +} + +void hc_clGetPlatformInfo (cl_platform_id platform, cl_platform_info param_name, size_t param_value_size, void *param_value, size_t *param_value_size_ret) +{ + cl_int CL_err = clGetPlatformInfo (platform, param_name, param_value_size, param_value, param_value_size_ret); + + if (CL_err != CL_SUCCESS) + { + log_error ("ERROR: %s %d\n", "clGetPlatformInfo()", CL_err); + + exit (-1); + } +} + +void hc_clGetDeviceIDs (cl_platform_id platform, cl_device_type device_type, cl_uint num_entries, cl_device_id *devices, cl_uint *num_devices) +{ + cl_int CL_err = clGetDeviceIDs (platform, device_type, num_entries, devices, num_devices); + + if (CL_err != CL_SUCCESS) + { + log_error ("ERROR: %s %d\n", "clGetDeviceIDs()", CL_err); + + exit (-1); + } +} + +void hc_clGetDeviceInfo (cl_device_id device, cl_device_info param_name, size_t param_value_size, void *param_value, size_t *param_value_size_ret) +{ + cl_int CL_err = clGetDeviceInfo (device, param_name, param_value_size, param_value, param_value_size_ret); + + if (CL_err != CL_SUCCESS) + { + log_error ("ERROR: %s %d\n", "clGetDeviceInfo()", CL_err); + + exit (-1); + } +} + +cl_context hc_clCreateContext (cl_context_properties *properties, cl_uint num_devices, const cl_device_id *devices, void (CL_CALLBACK *pfn_notify) (const char *, const void *, size_t, void *), void *user_data) +{ + cl_int CL_err; + + cl_context context = clCreateContext (properties, num_devices, devices, pfn_notify, user_data, &CL_err); + + if (CL_err != CL_SUCCESS) + { + log_error ("ERROR: %s %d\n", "clCreateContext()", CL_err); + + exit (-1); + } + + return (context); +} + +/* +cl_command_queue hc_clCreateCommandQueue (cl_context context, cl_device_id device, cl_command_queue_properties properties) +{ + cl_int CL_err; + + cl_command_queue command_queue = clCreateCommandQueue (context, device, properties, &CL_err); + + if (CL_err != CL_SUCCESS) + { + log_error ("ERROR: %s %d\n", "clCreateCommandQueue()", CL_err); + + exit (-1); + } + + return (command_queue); +} +*/ + +cl_command_queue hc_clCreateCommandQueueWithProperties (cl_context context, cl_device_id device, const cl_queue_properties *properties) +{ + cl_int CL_err; + + cl_command_queue command_queue = clCreateCommandQueueWithProperties (context, device, properties, &CL_err); + + if (CL_err != CL_SUCCESS) + { + log_error ("ERROR: %s %d\n", "clCreateCommandQueueWithProperties()", CL_err); + + exit (-1); + } + + return (command_queue); +} + +cl_mem hc_clCreateBuffer (cl_context context, cl_mem_flags flags, size_t size, void *host_ptr) +{ + cl_int CL_err; + + cl_mem mem = clCreateBuffer (context, flags, size, host_ptr, &CL_err); + + if (CL_err != CL_SUCCESS) + { + log_error ("ERROR: %s %d\n", "clCreateBuffer()", CL_err); + + exit (-1); + } + + return (mem); +} + +cl_program hc_clCreateProgramWithSource (cl_context context, cl_uint count, const char **strings, const size_t *lengths) +{ + cl_int CL_err; + + cl_program program = clCreateProgramWithSource (context, count, strings, lengths, &CL_err); + + if (CL_err != CL_SUCCESS) + { + log_error ("ERROR: %s %d\n", "clCreateProgramWithSource()", CL_err); + + exit (-1); + } + + return (program); +} + +cl_program hc_clCreateProgramWithBinary (cl_context context, cl_uint num_devices, const cl_device_id *device_list, const size_t *lengths, const unsigned char **binaries, cl_int *binary_status) +{ + cl_int CL_err; + + cl_program program = clCreateProgramWithBinary (context, num_devices, device_list, lengths, binaries, binary_status, &CL_err); + + if (CL_err != CL_SUCCESS) + { + log_error ("ERROR: %s %d\n", "clCreateProgramWithBinary()", CL_err); + + exit (-1); + } + + return (program); +} + +void hc_clBuildProgram (cl_program program, cl_uint num_devices, const cl_device_id *device_list, const char *options, void (CL_CALLBACK *pfn_notify) (cl_program program, void *user_data), void *user_data) +{ + cl_int CL_err = clBuildProgram (program, num_devices, device_list, options, pfn_notify, user_data); + + if (CL_err != CL_SUCCESS) + { + log_error ("ERROR: %s %d\n", "clBuildProgram()", CL_err); + + exit (-1); + } +} + +cl_kernel hc_clCreateKernel (cl_program program, const char *kernel_name) +{ + cl_int CL_err; + + cl_kernel kernel = clCreateKernel (program, kernel_name, &CL_err); + + if (CL_err != CL_SUCCESS) + { + log_error ("ERROR: %s %d\n", "clCreateKernel()", CL_err); + + exit (-1); + } + + return (kernel); +} + +void hc_clReleaseMemObject (cl_mem mem) +{ + cl_int CL_err = clReleaseMemObject (mem); + + if (CL_err != CL_SUCCESS) + { + log_error ("ERROR: %s %d\n", "clReleaseMemObject()", CL_err); + + exit (-1); + } +} + +void hc_clReleaseKernel (cl_kernel kernel) +{ + cl_int CL_err = clReleaseKernel (kernel); + + if (CL_err != CL_SUCCESS) + { + log_error ("ERROR: %s %d\n", "clReleaseProgram()", CL_err); + + exit (-1); + } +} + +void hc_clReleaseProgram (cl_program program) +{ + cl_int CL_err = clReleaseProgram (program); + + if (CL_err != CL_SUCCESS) + { + log_error ("ERROR: %s %d\n", "clReleaseProgram()", CL_err); + + exit (-1); + } +} + +void hc_clReleaseCommandQueue (cl_command_queue command_queue) +{ + cl_int CL_err = clReleaseCommandQueue (command_queue); + + if (CL_err != CL_SUCCESS) + { + log_error ("ERROR: %s %d\n", "clReleaseCommandQueue()", CL_err); + + exit (-1); + } +} + +void hc_clReleaseContext (cl_context context) +{ + cl_int CL_err = clReleaseContext (context); + + if (CL_err != CL_SUCCESS) + { + log_error ("ERROR: %s %d\n", "clReleaseContext()", CL_err); + + exit (-1); + } +} + +void *hc_clEnqueueMapBuffer (cl_command_queue command_queue, cl_mem buffer, cl_bool blocking_read, cl_map_flags map_flags, size_t offset, size_t cb, cl_uint num_events_in_wait_list, const cl_event *event_wait_list, cl_event *event) +{ + cl_int CL_err; + + void *buf = clEnqueueMapBuffer (command_queue, buffer, blocking_read, map_flags, offset, cb, num_events_in_wait_list, event_wait_list, event, &CL_err); + + if (CL_err != CL_SUCCESS) + { + log_error ("ERROR: %s %d\n", "clEnqueueMapBuffer()", CL_err); + + exit (-1); + } + + return buf; +} + +void hc_clEnqueueUnmapMemObject (cl_command_queue command_queue, cl_mem memobj, void *mapped_ptr, cl_uint num_events_in_wait_list, const cl_event *event_wait_list, cl_event *event) +{ + cl_int CL_err = clEnqueueUnmapMemObject (command_queue, memobj, mapped_ptr, num_events_in_wait_list, event_wait_list, event); + + if (CL_err != CL_SUCCESS) + { + log_error ("ERROR: %s %d\n", "clEnqueueUnmapMemObject()", CL_err); + + exit (-1); + } +} + +void hc_clEnqueueFillBuffer (cl_command_queue command_queue, cl_mem buffer, const void *pattern, size_t pattern_size, size_t offset, size_t size, cl_uint num_events_in_wait_list, const cl_event *event_wait_list, cl_event *event) +{ + cl_int CL_err = clEnqueueFillBuffer (command_queue, buffer, pattern, pattern_size, offset, size, num_events_in_wait_list, event_wait_list, event); + + if (CL_err != CL_SUCCESS) + { + log_error ("ERROR: %s %d\n", "clEnqueueFillBuffer()", CL_err); + + exit (-1); + } +} diff --git a/src/ext_cuda.c b/src/ext_cuda.c new file mode 100644 index 0000000000..77bab0c9c8 --- /dev/null +++ b/src/ext_cuda.c @@ -0,0 +1,558 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#include + +void hc_cuDeviceGetCount (int *count) +{ + CUresult CU_err = cuDeviceGetCount (count); + + if (CU_err != CUDA_SUCCESS) + { + log_error ("ERROR: %s %d\n", "cuDeviceGetCount()", CU_err); + + exit (-1); + } +} + +void hc_cuDeviceGet (CUdevice *device, int ordinal) +{ + CUresult CU_err = cuDeviceGet (device, ordinal); + + if (CU_err != CUDA_SUCCESS) + { + log_error ("ERROR: %s %d\n", "cuDeviceGet()", CU_err); + + exit (-1); + } +} + +void hc_cuDeviceGetName (char *name, int len, CUdevice dev) +{ + CUresult CU_err = cuDeviceGetName (name, len, dev); + + if (CU_err != CUDA_SUCCESS) + { + log_error ("ERROR: %s %d\n", "cuDeviceGetName()", CU_err); + + exit (-1); + } +} + +void hc_cuDeviceTotalMem (size_t *bytes, CUdevice dev) +{ + CUresult CU_err = cuDeviceTotalMem (bytes, dev); + + if (CU_err != CUDA_SUCCESS) + { + log_error ("ERROR: %s %d\n", "cuDeviceTotalMem()", CU_err); + + exit (-1); + } +} + +void hc_cuDeviceGetAttribute (int *pi, CUdevice_attribute attrib, CUdevice dev) +{ + CUresult CU_err = cuDeviceGetAttribute (pi, attrib, dev); + + if (CU_err != CUDA_SUCCESS) + { + log_error ("ERROR: %s %d\n", "cuDeviceGetAttribute()", CU_err); + + exit (-1); + } +} + +void hc_cuCtxCreate (CUcontext *pctx, unsigned int flags, CUdevice dev) +{ + CUresult CU_err = cuCtxCreate (pctx, flags, dev); + + if (CU_err != CUDA_SUCCESS) + { + log_error ("ERROR: %s %d\n", "cuCtxCreate()", CU_err); + + exit (-1); + } +} + +void hc_cuMemAllocHost (void **pp, size_t bytesize) +{ + CUresult CU_err = cuMemAllocHost (pp, bytesize); + + if (CU_err != CUDA_SUCCESS) + { + log_error ("ERROR: %s %d\n", "cuMemAllocHost()", CU_err); + + exit (-1); + } +} + +void hc_cuMemAlloc (CUdeviceptr *dptr, size_t bytesize) +{ + CUresult CU_err = cuMemAlloc (dptr, bytesize); + + if (CU_err != CUDA_SUCCESS) + { + log_error ("ERROR: %s %d\n", "cuMemAlloc()", CU_err); + + exit (-1); + } +} + +void hc_cuMemsetD8 (CUdeviceptr dstDevice, unsigned char uc, unsigned int N) +{ + CUresult CU_err = cuMemsetD8 (dstDevice, uc, N); + + if (CU_err != CUDA_SUCCESS) + { + log_error ("ERROR: %s %d\n", "cuMemsetD8()", CU_err); + + exit (-1); + } +} + +void hc_cuMemsetD32 (CUdeviceptr dstDevice, unsigned int ui, unsigned int N) +{ + CUresult CU_err = cuMemsetD32 (dstDevice, ui, N); + + if (CU_err != CUDA_SUCCESS) + { + log_error ("ERROR: %s %d\n", "cuMemsetD32()", CU_err); + + exit (-1); + } +} + +void hc_cuMemcpyDtoD (CUdeviceptr dstDevice, CUdeviceptr srcDevice, size_t ByteCount) +{ + CUresult CU_err = cuMemcpyDtoD (dstDevice, srcDevice, ByteCount); + + if (CU_err != CUDA_SUCCESS) + { + log_error ("ERROR: %s %d\n", "cuMemcpyDtoD()", CU_err); + + exit (-1); + } +} + +void hc_cuMemcpyDtoDAsync (CUdeviceptr dstDevice, CUdeviceptr srcDevice, size_t ByteCount, CUstream hStream) +{ + CUresult CU_err = cuMemcpyDtoDAsync (dstDevice, srcDevice, ByteCount, hStream); + + if (CU_err != CUDA_SUCCESS) + { + log_error ("ERROR: %s %d\n", "cuMemcpyDtoDAsync()", CU_err); + + exit (-1); + } +} + +void hc_cuMemcpyHtoD (CUdeviceptr dstDevice, const void *srcHost, size_t ByteCount) +{ + CUresult CU_err = cuMemcpyHtoD (dstDevice, srcHost, ByteCount); + + if (CU_err != CUDA_SUCCESS) + { + log_error ("ERROR: %s %d\n", "cuMemcpyHtoD()", CU_err); + + exit (-1); + } +} + +void hc_cuMemcpyHtoDAsync (CUdeviceptr dstDevice, const void *srcHost, size_t ByteCount, CUstream hStream) +{ + CUresult CU_err = cuMemcpyHtoDAsync (dstDevice, srcHost, ByteCount, hStream); + + if (CU_err != CUDA_SUCCESS) + { + log_error ("ERROR: %s %d\n", "cuMemcpyHtoDAsync()", CU_err); + + exit (-1); + } +} + +void hc_cuMemcpyDtoH (void *dstHost, CUdeviceptr srcDevice, size_t ByteCount) +{ + CUresult CU_err = cuMemcpyDtoH (dstHost, srcDevice, ByteCount); + + if (CU_err != CUDA_SUCCESS) + { + log_error ("ERROR: %s %d\n", "cuMemcpyDtoH()", CU_err); + + exit (-1); + } +} + +void hc_cuMemcpyDtoHAsync (void *dstHost, CUdeviceptr srcDevice, size_t ByteCount, CUstream hStream) +{ + CUresult CU_err = cuMemcpyDtoHAsync (dstHost, srcDevice, ByteCount, hStream); + + if (CU_err != CUDA_SUCCESS) + { + log_error ("ERROR: %s %d\n", "cuMemcpyDtoHAsync()", CU_err); + + exit (-1); + } +} + +void hc_cuEventCreate (CUevent *phEvent, unsigned int Flags) +{ + CUresult CU_err = cuEventCreate (phEvent, Flags); + + if (CU_err != CUDA_SUCCESS) + { + log_error ("ERROR: %s %d\n", "cuEventCreate()", CU_err); + + exit (-1); + } +} + +void hc_cuStreamCreate (CUstream *phStream, unsigned int Flags) +{ + CUresult CU_err = cuStreamCreate (phStream, Flags); + + if (CU_err != CUDA_SUCCESS) + { + log_error ("ERROR: %s %d\n", "cuStreamCreate()", CU_err); + + exit (-1); + } +} + +void hc_cuDeviceComputeCapability (int *major, int *minor, CUdevice dev) +{ + CUresult CU_err = cuDeviceComputeCapability (major, minor, dev); + + if (CU_err != CUDA_SUCCESS) + { + log_error ("ERROR: %s %d\n", "cuDeviceComputeCapability()", CU_err); + + exit (-1); + } +} + +void hc_cuModuleLoad (CUmodule *module, const char *fname) +{ + CUresult CU_err = cuModuleLoad (module, fname); + + if (CU_err != CUDA_SUCCESS) + { + log_error ("ERROR: %s %d\n", "cuModuleLoad()", CU_err); + + exit (-1); + } +} + +void hc_cuModuleLoadData (CUmodule *module, const void *image) +{ + CUresult CU_err = cuModuleLoadData (module, image); + + if (CU_err != CUDA_SUCCESS) + { + log_error ("ERROR: %s %d\n", "cuModuleLoadData()", CU_err); + + exit (-1); + } +} + +void hc_cuModuleGetFunction (CUfunction *hfunc, CUmodule hmod, const char *name) +{ + CUresult CU_err = cuModuleGetFunction (hfunc, hmod, name); + + if (CU_err != CUDA_SUCCESS) + { + log_error ("ERROR: %s %d\n", "cuModuleGetFunction()", CU_err); + + exit (-1); + } +} + +void hc_cuFuncSetBlockShape (CUfunction hfunc, int x, int y, int z) +{ + CUresult CU_err = cuFuncSetBlockShape (hfunc, x, y, z); + + if (CU_err != CUDA_SUCCESS) + { + log_error ("ERROR: %s %d\n", "cuFuncSetBlockShape()", CU_err); + + exit (-1); + } +} + +void hc_cuParamSetSize (CUfunction hfunc, unsigned int numbytes) +{ + CUresult CU_err = cuParamSetSize (hfunc, numbytes); + + if (CU_err != CUDA_SUCCESS) + { + log_error ("ERROR: %s %d\n", "cuParamSetSize()", CU_err); + + exit (-1); + } +} + +void hc_cuParamSetv (CUfunction hfunc, int offset, void *ptr, unsigned int numbytes) +{ + CUresult CU_err = cuParamSetv (hfunc, offset, ptr, numbytes); + + if (CU_err != CUDA_SUCCESS) + { + log_error ("ERROR: %s %d\n", "cuParamSetv()", CU_err); + + exit (-1); + } +} + +void hc_cuParamSeti (CUfunction hfunc, int offset, unsigned int value) +{ + CUresult CU_err = cuParamSeti (hfunc, offset, value); + + if (CU_err != CUDA_SUCCESS) + { + log_error ("ERROR: %s %d\n", "cuParamSeti()", CU_err); + + exit (-1); + } +} + +void hc_cuModuleGetGlobal (CUdeviceptr *dptr, size_t *bytes, CUmodule hmod, const char *name) +{ + CUresult CU_err = cuModuleGetGlobal (dptr, bytes, hmod, name); + + if (CU_err != CUDA_SUCCESS) + { + log_error ("ERROR: %s %d\n", "cuModuleGetGlobal()", CU_err); + + exit (-1); + } +} + +void hc_cuCtxPopCurrent (CUcontext *pctx) +{ + CUresult CU_err = cuCtxPopCurrent (pctx); + + if (CU_err != CUDA_SUCCESS) + { + log_error ("ERROR: %s %d\n", "cuCtxPopCurrent()", CU_err); + + exit (-1); + } +} + +void hc_cuCtxPushCurrent (CUcontext ctx) +{ + CUresult CU_err = cuCtxPushCurrent (ctx); + + if (CU_err != CUDA_SUCCESS) + { + log_error ("ERROR: %s %d\n", "cuCtxPushCurrent()", CU_err); + + exit (-1); + } +} + +void hc_cuLaunchKernel (CUfunction f, unsigned int gridDimX, unsigned int gridDimY, unsigned int gridDimZ, unsigned int blockDimX, unsigned int blockDimY, unsigned int blockDimZ, unsigned int sharedMemBytes, CUstream hStream, void **kernelParams, void **extra) +{ + CUresult CU_err = cuLaunchKernel (f, gridDimX, gridDimY, gridDimZ, blockDimX, blockDimY, blockDimZ, sharedMemBytes, hStream, kernelParams, extra); + + if (CU_err != CUDA_SUCCESS) + { + log_error ("ERROR: %s %d\n", "cuLaunchKernel()", CU_err); + + exit (-1); + } +} + +void hc_cuLaunchGrid (CUfunction f, int grid_width, int grid_height) +{ + CUresult CU_err = cuLaunchGrid (f, grid_width, grid_height); + + if (CU_err != CUDA_SUCCESS) + { + log_error ("ERROR: %s %d\n", "cuLaunchGrid()", CU_err); + + exit (-1); + } +} + +void hc_cuLaunchGridAsync (CUfunction f, int grid_width, int grid_height, CUstream hStream) +{ + CUresult CU_err = cuLaunchGridAsync (f, grid_width, grid_height, hStream); + + if (CU_err != CUDA_SUCCESS) + { + log_error ("ERROR: %s %d\n", "cuLaunchGridAsync()", CU_err); + + exit (-1); + } +} + +void hc_cuEventSynchronize (CUevent hEvent) +{ + CUresult CU_err = cuEventSynchronize (hEvent); + + if (CU_err != CUDA_SUCCESS) + { + log_error ("ERROR: %s %d\n", "cuEventSynchronize()", CU_err); + + exit (-1); + } +} + +void hc_cuStreamSynchronize (CUstream hStream) +{ + CUresult CU_err = cuStreamSynchronize (hStream); + + if (CU_err != CUDA_SUCCESS) + { + log_error ("ERROR: %s %d\n", "cuStreamSynchronize()", CU_err); + + exit (-1); + } +} + +void hc_cuMemFreeHost (void *p) +{ + CUresult CU_err = cuMemFreeHost (p); + + if (CU_err != CUDA_SUCCESS) + { + log_error ("ERROR: %s %d\n", "cuMemFreeHost()", CU_err); + + exit (-1); + } +} + +void hc_cuMemFree (CUdeviceptr dptr) +{ + CUresult CU_err = cuMemFree (dptr); + + if (CU_err != CUDA_SUCCESS) + { + log_error ("ERROR: %s %d\n", "cuMemFree()", CU_err); + + exit (-1); + } +} + +void hc_cuEventDestroy (CUevent hEvent) +{ + CUresult CU_err = cuEventDestroy (hEvent); + + if (CU_err != CUDA_SUCCESS) + { + log_error ("ERROR: %s %d\n", "cuEventDestroy()", CU_err); + + exit (-1); + } +} + +void hc_cuStreamDestroy (CUstream hStream) +{ + CUresult CU_err = cuStreamDestroy (hStream); + + if (CU_err != CUDA_SUCCESS) + { + log_error ("ERROR: %s %d\n", "cuStreamDestroy()", CU_err); + + exit (-1); + } +} + +void hc_cuModuleUnload (CUmodule hmod) +{ + CUresult CU_err = cuModuleUnload (hmod); + + if (CU_err != CUDA_SUCCESS) + { + log_error ("ERROR: %s %d\n", "cuModuleUnload()", CU_err); + + exit (-1); + } +} + +void hc_cuCtxDestroy (CUcontext ctx) +{ + CUresult CU_err = cuCtxDestroy (ctx); + + if (CU_err != CUDA_SUCCESS) + { + log_error ("ERROR: %s %d\n", "cuCtxDestroy()", CU_err); + + exit (-1); + } +} + +void hc_cuCtxAttach (CUcontext *pctx, unsigned int flags) +{ + CUresult CU_err = cuCtxAttach (pctx, flags); + + if (CU_err != CUDA_SUCCESS) + { + log_error ("ERROR: %s %d\n", "cuCtxAttach()", CU_err); + + exit (-1); + } +} + +void hc_cuCtxDetach (CUcontext ctx) +{ + CUresult CU_err = cuCtxDetach (ctx); + + if (CU_err != CUDA_SUCCESS) + { + log_error ("ERROR: %s %d\n", "cuCtxDetach()", CU_err); + + exit (-1); + } +} + +void hc_cuCtxSynchronize (void) +{ + CUresult CU_err = cuCtxSynchronize (); + + if (CU_err != CUDA_SUCCESS) + { + log_error ("ERROR: %s %d\n", "cuCtxSynchronize()", CU_err); + + exit (-1); + } +} + +void hc_cuCtxSetCacheConfig (CUfunc_cache config) +{ + CUresult CU_err = cuCtxSetCacheConfig (config); + + if (CU_err != CUDA_SUCCESS) + { + log_error ("ERROR: %s %d\n", "cuCtxSetCacheConfig()", CU_err); + + exit (-1); + } +} + +void hc_cuDriverGetVersion (int *driverVersion) +{ + CUresult CU_err = cuDriverGetVersion (driverVersion); + + if (CU_err != CUDA_SUCCESS) + { + log_error ("ERROR: %s %d\n", "cuDriverGetVersion()", CU_err); + + exit (-1); + } +} + +void hc_cuModuleLoadDataEx (CUmodule *module, const void *image, unsigned int numOptions, CUjit_option *options, void **optionValues) +{ + CUresult CU_err = cuModuleLoadDataEx (module, image, numOptions, options, optionValues); + + if (CU_err != CUDA_SUCCESS) + { + log_error ("ERROR: %s %d\n", "cuModuleLoadDataEx()", CU_err); + + exit (-1); + } +} diff --git a/src/ext_dummy.c b/src/ext_dummy.c new file mode 100644 index 0000000000..3b09b02dac --- /dev/null +++ b/src/ext_dummy.c @@ -0,0 +1 @@ +#include diff --git a/src/ext_nvapi.c b/src/ext_nvapi.c new file mode 100644 index 0000000000..1b01fcbfcf --- /dev/null +++ b/src/ext_nvapi.c @@ -0,0 +1,83 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#include + +int hc_NvAPI_EnumPhysicalGPUs (NvPhysicalGpuHandle nvGPUHandle[NVAPI_MAX_PHYSICAL_GPUS], NvU32 *pGpuCount) +{ + NvAPI_Status NvAPI_rc = NvAPI_EnumPhysicalGPUs (nvGPUHandle, pGpuCount); + + if (NvAPI_rc != NVAPI_OK) + { + NvAPI_ShortString string; + + NvAPI_GetErrorMessage (NvAPI_rc, string); + + log_info ("WARN: %s %d %s\n", "NvAPI_EnumPhysicalGPUs()", NvAPI_rc, string); + } + + return NvAPI_rc; +} + +int hc_NvAPI_GPU_GetThermalSettings (NvPhysicalGpuHandle hPhysicalGpu, NvU32 sensorIndex, NV_GPU_THERMAL_SETTINGS *pThermalSettings) +{ + NvAPI_Status NvAPI_rc = NvAPI_GPU_GetThermalSettings (hPhysicalGpu, sensorIndex, pThermalSettings); + + if (NvAPI_rc != NVAPI_OK) + { + NvAPI_ShortString string; + + NvAPI_GetErrorMessage (NvAPI_rc, string); + + log_info ("WARN: %s %d %s\n", "NvAPI_GPU_GetThermalSettings()", NvAPI_rc, string); + } + + return NvAPI_rc; +} + +int hc_NvAPI_GPU_GetTachReading (NvPhysicalGpuHandle hPhysicalGPU, NvU32 *pValue) +{ + NvAPI_Status NvAPI_rc = NvAPI_GPU_GetTachReading (hPhysicalGPU, pValue); + + if (NvAPI_rc != NVAPI_OK) + { + NvAPI_ShortString string; + + NvAPI_GetErrorMessage (NvAPI_rc, string); + + log_info ("WARN: %s %d %s\n", "NvAPI_GPU_GetTachReading()", NvAPI_rc, string); + } + + return NvAPI_rc; +} + +int hc_NvAPI_GPU_GetDynamicPstatesInfoEx (NvPhysicalGpuHandle hPhysicalGpu, NV_GPU_DYNAMIC_PSTATES_INFO_EX *pDynamicPstatesInfoEx) +{ + NvAPI_Status NvAPI_rc = NvAPI_GPU_GetDynamicPstatesInfoEx (hPhysicalGpu, pDynamicPstatesInfoEx); + + if (NvAPI_rc != NVAPI_OK) + { + NvAPI_ShortString string; + + NvAPI_GetErrorMessage (NvAPI_rc, string); + + log_info ("WARN: %s %d %s\n", "NvAPI_GPU_GetDynamicPstatesInfoEx()", NvAPI_rc, string); + } + + return NvAPI_rc; +} + +#ifdef __MINGW64__ + +void __security_check_cookie (uintptr_t _StackCookie) +{ + (void) _StackCookie; +} + +void __GSHandlerCheck () +{ +} + +#endif diff --git a/src/ext_nvml.c b/src/ext_nvml.c new file mode 100644 index 0000000000..7a3eb73952 --- /dev/null +++ b/src/ext_nvml.c @@ -0,0 +1,129 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#include + +nvmlReturn_t hc_NVML_nvmlInit (void) +{ + nvmlReturn_t nvml_rc = nvmlInit (); + + if (nvml_rc != NVML_SUCCESS) + { + const char *string = nvmlErrorString (nvml_rc); + + log_info ("WARN: %s %d %s\n", "nvmlInit()", nvml_rc, string); + } + + return nvml_rc; +} + +nvmlReturn_t hc_NVML_nvmlShutdown (void) +{ + nvmlReturn_t nvml_rc = nvmlShutdown (); + + if (nvml_rc != NVML_SUCCESS) + { + const char *string = nvmlErrorString (nvml_rc); + + log_info ("WARN: %s %d %s\n", "nvmlShutdown()", nvml_rc, string); + } + + return nvml_rc; +} + +nvmlReturn_t hc_NVML_nvmlDeviceGetName (nvmlDevice_t device, char *name, unsigned int length) +{ + nvmlReturn_t nvml_rc = nvmlDeviceGetName (device, name, length); + + if (nvml_rc != NVML_SUCCESS) + { + const char *string = nvmlErrorString (nvml_rc); + + log_info ("WARN: %s %d %s\n", "nvmlDeviceGetName()", nvml_rc, string); + } + + return nvml_rc; +} + +nvmlReturn_t hc_NVML_nvmlDeviceGetHandleByIndex (unsigned int index, nvmlDevice_t *device) +{ + nvmlReturn_t nvml_rc = nvmlDeviceGetHandleByIndex (index, device); + + if (nvml_rc != NVML_SUCCESS) + { + const char *string = nvmlErrorString (nvml_rc); + + log_info ("WARN: %s %d %s\n", "nvmlDeviceGetHandleByIndex()", nvml_rc, string); + } + + return nvml_rc; +} + +nvmlReturn_t hc_NVML_nvmlDeviceGetTemperature (nvmlDevice_t device, nvmlTemperatureSensors_t sensorType, unsigned int *temp) +{ + nvmlReturn_t nvml_rc = nvmlDeviceGetTemperature (device, sensorType, temp); + + if (nvml_rc != NVML_SUCCESS) + { + *temp = -1; + + //const char *string = nvmlErrorString (nvml_rc); + + //log_info ("WARN: %s %d %s\n", "nvmlDeviceGetTemperature()", nvml_rc, string); + } + + return nvml_rc; +} + +nvmlReturn_t hc_NVML_nvmlDeviceGetFanSpeed (nvmlDevice_t device, unsigned int *speed) +{ + nvmlReturn_t nvml_rc = nvmlDeviceGetFanSpeed (device, speed); + + if (nvml_rc != NVML_SUCCESS) + { + *speed = -1; + + //const char *string = nvmlErrorString (nvml_rc); + + //log_info ("WARN: %s %d %s\n", "nvmlDeviceGetFanSpeed()", nvml_rc, string); + } + + return nvml_rc; +} + +/* only tesla following */ + +nvmlReturn_t hc_NVML_nvmlDeviceGetPowerUsage (nvmlDevice_t device, unsigned int *power) +{ + nvmlReturn_t nvml_rc = nvmlDeviceGetPowerUsage (device, power); + + if (nvml_rc != NVML_SUCCESS) + { + *power = -1; + + //const char *string = nvmlErrorString (nvml_rc); + + //log_info ("WARN: %s %d %s\n", "nvmlDeviceGetPowerUsage()", nvml_rc, string); + } + + return nvml_rc; +} + +nvmlReturn_t hc_NVML_nvmlDeviceGetUtilizationRates (nvmlDevice_t device, nvmlUtilization_t *utilization) +{ + nvmlReturn_t nvml_rc = nvmlDeviceGetUtilizationRates (device, utilization); + + if (nvml_rc != NVML_SUCCESS) + { + utilization->gpu = -1; + utilization->memory = -1; + + //const char *string = nvmlErrorString (nvml_rc); + + //log_info ("WARN: %s %d %s\n", "nvmlDeviceGetUtilizationRates()", nvml_rc, string); + } + + return nvml_rc; +} diff --git a/src/ext_smi.c b/src/ext_smi.c new file mode 100644 index 0000000000..870f4ccb72 --- /dev/null +++ b/src/ext_smi.c @@ -0,0 +1,68 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#include + +int hc_nvidia_smi (int dev, int *temperature, int *gpu) +{ + char cmd[256]; memset (cmd, 0, sizeof (cmd)); + + sprintf (cmd, "nvidia-smi -q -g %d", dev); + + FILE *fp = popen (cmd, "r"); + + if (fp == NULL) + { + log_info ("WARN: %s\n", "nvidia-smi is missing!"); + + return SMI_NOBIN; + } + + int temp_found = 0; + int util_found = 0; + + char token[32]; + + while (fscanf (fp, " %31s ", token) == 1) + { + if (strcmp (token, "Temperature") == 0) + { + if (fscanf (fp, " : %4s C", token) == 1) *temperature = atoi (token); + + temp_found = 1; + } + + if (temp_found == 1) + { + if ((strcmp (token, "GPU") == 0) || (strcmp (token, "Gpu") == 0)) + { + if (fscanf (fp, " : %4s C", token) == 1) *temperature = atoi (token); + + temp_found = 0; + } + } + + if (strcmp (token, "Utilization") == 0) + { + util_found = 1; + + temp_found = 0; + } + + if (util_found == 1) + { + if ((strcmp (token, "GPU") == 0) || (strcmp (token, "Gpu") == 0)) + { + if (fscanf (fp, " : %2s%%", token) == 1) *gpu = atoi (token); + + util_found = 0; + } + } + } + + pclose (fp); + + return (SMI_OK); +} diff --git a/src/oclHashcat.c b/src/oclHashcat.c new file mode 100644 index 0000000000..3aa4d46b76 --- /dev/null +++ b/src/oclHashcat.c @@ -0,0 +1,17958 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#include +#include +#include + +#include + +#ifdef _CUDA +const char *PROGNAME = "cudaHashcat"; +#elif _OCL +const char *PROGNAME = "oclHashcat"; +#endif + +const char *VERSION_TXT = "2.00"; +const uint VERSION_BIN = 200; +const uint RESTORE_MIN = 200; + +#define INCR_RULES 10000 +#define INCR_SALTS 100000 +#define INCR_MASKS 1000 +#define INCR_POT 1000 + +// comment-out for kernel source mode + +#define BINARY_KERNEL + +#define USAGE 0 +#define VERSION 0 +#define QUIET 0 +#define MARKOV_THRESHOLD 0 +#define MARKOV_DISABLE 0 +#define MARKOV_CLASSIC 0 +#define BENCHMARK 0 +#define BENCHMARK_MODE 1 +#define RESTORE 0 +#define RESTORE_TIMER 60 +#define RESTORE_DISABLE 0 +#define STATUS 0 +#define STATUS_TIMER 10 +#define STATUS_AUTOMAT 0 +#define LOOPBACK 0 +#define WEAK_HASH_THRESHOLD 100 +#define SHOW 0 +#define LEFT 0 +#define USERNAME 0 +#define REMOVE 0 +#define REMOVE_TIMER 60 +#define SKIP 0 +#define LIMIT 0 +#define KEYSPACE 0 +#define POTFILE_DISABLE 0 +#define DEBUG_MODE 0 +#define RP_GEN 0 +#define RP_GEN_FUNC_MIN 1 +#define RP_GEN_FUNC_MAX 4 +#define RP_GEN_SEED 0 +#define RULE_BUF_L ":" +#define RULE_BUF_R ":" +#define FORCE 0 +#define RUNTIME 0 +#define HEX_CHARSET 0 +#define HEX_SALT 0 +#define HEX_WORDLIST 0 +#define OUTFILE_FORMAT 3 +#define OUTFILE_AUTOHEX 1 +#define OUTFILE_CHECK_TIMER 5 +#define ATTACK_MODE 0 +#define HASH_MODE 0 +#define SEGMENT_SIZE 32 +#define INCREMENT 0 +#define INCREMENT_MIN 1 +#define INCREMENT_MAX PW_MAX +#define SEPARATOR ':' +#define BITMAP_MIN 16 +#define BITMAP_MAX 24 +#define GPU_ASYNC 0 +#define GPU_TEMP_DISABLE 0 +#define GPU_TEMP_ABORT 90 +#define GPU_TEMP_RETAIN 80 +#define WORKLOAD_PROFILE 2 +#define GPU_ACCEL 0 +#define GPU_LOOPS 0 +#define GPU_RULES 1024 +#define GPU_COMBS 1024 +#define GPU_BFS 1024 +#define GPU_THREADS_AMD 64 +#define GPU_THREADS_NV 256 +#define POWERTUNE_ENABLE 0 +#define LOGFILE_DISABLE 0 +#define SCRYPT_TMTO 0 + +#define VECT_SIZE_1 1 +#define VECT_SIZE_2 2 +#define VECT_SIZE_4 4 +#define VECT_SIZE_8 8 + +#define WL_MODE_STDIN 1 +#define WL_MODE_FILE 2 +#define WL_MODE_MASK 3 + +#define HL_MODE_FILE 4 +#define HL_MODE_ARG 5 + +#define HLFMT_HASHCAT 0 +#define HLFMT_PWDUMP 1 +#define HLFMT_PASSWD 2 +#define HLFMT_SHADOW 3 +#define HLFMT_DCC 4 +#define HLFMT_DCC2 5 +#define HLFMT_NETNTLM1 7 +#define HLFMT_NETNTLM2 8 +#define HLFMT_NSLDAP 9 +#define HLFMT_NSLDAPS 10 +#define HLFMTS_CNT 11 + +#define ATTACK_MODE_STRAIGHT 0 +#define ATTACK_MODE_COMBI 1 +#define ATTACK_MODE_TOGGLE 2 +#define ATTACK_MODE_BF 3 +#define ATTACK_MODE_PERM 4 +#define ATTACK_MODE_TABLE 5 +#define ATTACK_MODE_HYBRID1 6 +#define ATTACK_MODE_HYBRID2 7 +#define ATTACK_MODE_NONE 100 + +#define ATTACK_KERN_STRAIGHT 0 +#define ATTACK_KERN_COMBI 1 +#define ATTACK_KERN_BF 3 +#define ATTACK_KERN_NONE 100 + +#define ATTACK_EXEC_ON_CPU 10 +#define ATTACK_EXEC_ON_GPU 11 + +#define COMBINATOR_MODE_BASE_LEFT 10001 +#define COMBINATOR_MODE_BASE_RIGHT 10002 + +#define MIN(a,b) (((a) < (b)) ? (a) : (b)) +#define MAX(a,b) (((a) > (b)) ? (a) : (b)) + +#define MAX_CUT_TRIES 4 + +#define MAX_DICTSTAT 10000 + +#define NUM_DEFAULT_BENCHMARK_ALGORITHMS 128 + +#define global_free(attr) \ +{ \ + myfree ((void *) data.attr); \ + \ + data.attr = NULL; \ +} + +#define local_free(attr) \ +{ \ + myfree ((void *) attr); \ + \ + attr = NULL; \ +} + +static uint default_benchmark_algorithms[NUM_DEFAULT_BENCHMARK_ALGORITHMS] = +{ + 900, + 0, + 5100, + 100, + 1400, + 10800, + 1700, + 5000, + 10100, + 6000, + 6100, + 6900, + 11700, + 11800, + 400, + 8900, + 11900, + 12000, + 10900, + 12100, + 23, + 2500, + 5300, + 5400, + 5500, + 5600, + 7300, + 7500, + 8300, + 11100, + 11200, + 11400, + 121, + 2611, + 2711, + 2811, + 8400, + 11, + 2612, + 7900, + 21, + 11000, + 124, + 10000, + 3711, + 7600, + 12, + 131, + 132, + 1731, + 200, + 300, + 3100, + 112, + 12300, + 8000, + 141, + 1441, + 1600, + 12600, + 1421, + 101, + 111, + 1711, + 3000, + 1000, + 1100, + 2100, + 12800, + 1500, + 12400, + 500, + 3200, + 7400, + 1800, + 122, + 1722, + 7100, + 6300, + 6700, + 6400, + 6500, + 2400, + 2410, + 5700, + 9200, + 9300, + 22, + 501, + 5800, + 8100, + 8500, + 7200, + 9900, + 7700, + 7800, + 10300, + 8600, + 8700, + 9100, + 133, + 11600, + 12500, + 6211, + 6221, + 6231, + 6241, + 8800, + 12200, + 9700, + 9710, + 9800, + 9810, + 9400, + 9500, + 9600, + 10400, + 10410, + 10500, + 10600, + 10700, + 9000, + 5200, + 6800, + 6600, + 8200, + 11300, + 12700 +}; + +/** + * types + */ + +static void (*get_next_word_func) (char *, uint32_t, uint32_t *, uint32_t *); + +/** + * globals + */ + +static unsigned int full01 = 0x01010101; +static unsigned int full80 = 0x80808080; + +int SUPPRESS_OUTPUT = 0; + +hc_thread_mutex_t mux_adl; +hc_thread_mutex_t mux_counter; +hc_thread_mutex_t mux_dispatcher; +hc_thread_mutex_t mux_display; + +hc_global_data_t data; + +const char *PROMPT = "[s]tatus [p]ause [r]esume [b]ypass [q]uit => "; + +const char *USAGE_MINI[] = +{ + "Usage: %s [options]... hash|hashfile|hccapfile [dictionary|mask|directory]...", + "", + "Try --help for more help.", + NULL +}; + +const char *USAGE_BIG[] = +{ + "%s, advanced password recovery", + "", + "Usage: %s [options]... hash|hashfile|hccapfile [dictionary|mask|directory]...", + "", + "=======", + "Options", + "=======", + "", + "* General:", + "", + " -m, --hash-type=NUM Hash-type, see references below", + " -a, --attack-mode=NUM Attack-mode, see references below", + " -V, --version Print version", + " -h, --help Print help", + " --quiet Suppress output", + "", + "* Benchmark:", + "", + " -b, --benchmark Run benchmark", + " --benchmark-mode=NUM Benchmark-mode, see references below", + "", + "* Misc:", + "", + " --hex-charset Assume charset is given in hex", + " --hex-salt Assume salt is given in hex", + " --hex-wordlist Assume words in wordlist is given in hex", + " --force Ignore warnings", + " --status Enable automatic update of the status-screen", + " --status-timer=NUM Seconds between status-screen update", + " --status-automat Display the status view in a machine readable format", + " --loopback Add new plains to induct directory", + " --weak-hash-threshold=NUM Threshold when to stop checking for weak hashes, default is 100 salts", + "", + "* Markov:", + "", + " --markov-hcstat=FILE Specify hcstat file to use, default is hashcat.hcstat", + " --markov-disable Disables markov-chains, emulates classic brute-force", + " --markov-classic Enables classic markov-chains, no per-position enhancement", + " -t, --markov-threshold=NUM Threshold when to stop accepting new markov-chains", + "", + "* Session:", + "", + " --runtime=NUM Abort session after NUM seconds of runtime", + " --session=STR Define specific session name", + " --restore Restore session from --session", + " --restore-disable Do not write restore file", + "", + "* Files:", + "", + " -o, --outfile=FILE Define outfile for recovered hash", + " --outfile-format=NUM Define outfile-format for recovered hash, see references below", + " --outfile-autohex-disable Disable the use of $HEX[] in output plains", + " --outfile-check-timer=NUM Seconds between outfile checks", + " -p, --separator=CHAR Separator char for hashlists and outfile", + " --show Show cracked passwords only", + " --left Show un-cracked passwords only", + " --username Enable ignoring of usernames in hashfile (recommended: also use --show)", + " --remove Enable remove of hash once it is cracked", + " --remove-timer=NUM Update input hash file each NUM seconds", + " --potfile-disable Do not write potfile", + " --debug-mode=NUM Defines the debug mode (hybrid only by using rules), see references below", + " --debug-file=FILE Output file for debugging rules (see also --debug-mode)", + " --induction-dir=FOLDER Specify induction directory to use, default is $session.induct", + " --outfile-check-dir=FOLDER Specify the outfile directory which should be monitored, default is $session.outfiles", + " --logfile-disable Disable the logfile", + " --truecrypt-keyfiles=FILE Keyfiles used, seperate with comma", + "", + "* Resources:", + "", + " -c, --segment-size=NUM Size in MB to cache from the wordfile", + " --bitmap-min=NUM Minimum number of bits allowed for bitmaps", + " --bitmap-max=NUM Maximum number of bits allowed for bitmaps", + " --cpu-affinity=STR Locks to CPU devices, seperate with comma", + " --gpu-async Use non-blocking async calls (NV only)", + " -d, --gpu-devices=STR Devices to use, separate with comma", + " -w, --workload-profile=NUM Enable a specific workload profile, see references below", + " -n, --gpu-accel=NUM Workload tuning: 1, 8, 40, 80, 160", + " -u, --gpu-loops=NUM Workload fine-tuning: 8 - 1024", + " --gpu-temp-disable Disable temperature and fanspeed readings and triggers", + " --gpu-temp-abort=NUM Abort session if GPU temperature reaches NUM degrees celsius", + " --gpu-temp-retain=NUM Try to retain GPU temperature at NUM degrees celsius (AMD only)", + " --powertune-enable Enable automatic power tuning option (AMD OverDrive 6 only)", + " --scrypt-tmto=NUM Manually override automatically calculated TMTO value for scrypt", + "", + "* Distributed:", + "", + " -s, --skip=NUM Skip number of words", + " -l, --limit=NUM Limit number of words", + " --keyspace Show keyspace base:mod values and quit", + "", + "* Rules:", + "", + " -j, --rule-left=RULE Single rule applied to each word from left dict", + " -k, --rule-right=RULE Single rule applied to each word from right dict", + " -r, --rules-file=FILE Rules-file, multi use: -r 1.rule -r 2.rule", + " -g, --generate-rules=NUM Generate NUM random rules", + " --generate-rules-func-min=NUM Force NUM functions per random rule min", + " --generate-rules-func-max=NUM Force NUM functions per random rule max", + " --generate-rules-seed=NUM Force RNG seed to NUM", + "", + "* Custom charsets:", + "", + " -1, --custom-charset1=CS User-defined charsets", + " -2, --custom-charset2=CS Example:", + " -3, --custom-charset3=CS --custom-charset1=?dabcdef : sets charset ?1 to 0123456789abcdef", + " -4, --custom-charset4=CS -2 mycharset.hcchr : sets charset ?2 to chars contained in file", + "", + "* Increment:", + "", + " -i, --increment Enable increment mode", + " --increment-min=NUM Start incrementing at NUM", + " --increment-max=NUM Stop incrementing at NUM", + "", + "==========", + "References", + "==========", + "", + "* Workload Profile:", + "", + " 1 = Reduced performance profile (low latency desktop)", + " 2 = Default performance profile", + " 3 = Tuned performance profile (high latency desktop)", + "", + "* Benchmark Settings:", + "", + " 0 = Manual Tuning", + " 1 = Performance Tuning, default", + "", + "* Outfile Formats:", + "", + " 1 = hash[:salt]", + " 2 = plain", + " 3 = hash[:salt]:plain", + " 4 = hex_plain", + " 5 = hash[:salt]:hex_plain", + " 6 = plain:hex_plain", + " 7 = hash[:salt]:plain:hex_plain", + " 8 = crackpos", + " 9 = hash[:salt]:crackpos", + " 10 = plain:crackpos", + " 11 = hash[:salt]:plain:crackpos", + " 12 = hex_plain:crackpos", + " 13 = hash[:salt]:hex_plain:crackpos", + " 14 = plain:hex_plain:crackpos", + " 15 = hash[:salt]:plain:hex_plain:crackpos", + "", + "* Debug mode output formats (for hybrid mode only, by using rules):", + "", + " 1 = save finding rule", + " 2 = save original word", + " 3 = save original word and finding rule", + " 4 = save original word, finding rule and modified plain", + "", + "* Built-in charsets:", + "", + " ?l = abcdefghijklmnopqrstuvwxyz", + " ?u = ABCDEFGHIJKLMNOPQRSTUVWXYZ", + " ?d = 0123456789", + " ?s = !\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~", + " ?a = ?l?u?d?s", + " ?b = 0x00 - 0xff", + "", + "* Attack modes:", + "", + " 0 = Straight", + " 1 = Combination", + " 3 = Brute-force", + " 6 = Hybrid dict + mask", + " 7 = Hybrid mask + dict", + "", + "* Hash types:", + "", + "[[ Roll-your-own: Raw Hashes ]]", + "", + " 900 = MD4", + " 0 = MD5", + " 5100 = Half MD5", + " 100 = SHA1", + " 10800 = SHA-384", + " 1400 = SHA-256", + " 1700 = SHA-512", + " 5000 = SHA-3(Keccak)", + " 10100 = SipHash", + " 6000 = RipeMD160", + " 6100 = Whirlpool", + " 6900 = GOST R 34.11-94", + " 11700 = GOST R 34.11-2012 (Streebog) 256-bit", + " 11800 = GOST R 34.11-2012 (Streebog) 512-bit", + "", + "[[ Roll-your-own: Iterated and / or Salted Hashes ]]", + "", + " 10 = md5($pass.$salt)", + " 20 = md5($salt.$pass)", + " 30 = md5(unicode($pass).$salt)", + " 40 = md5($salt.unicode($pass))", + " 3800 = md5($salt.$pass.$salt)", + " 3710 = md5($salt.md5($pass))", + " 2600 = md5(md5($pass)", + " 4300 = md5(strtoupper(md5($pass)))", + " 4400 = md5(sha1($pass))", + " 110 = sha1($pass.$salt)", + " 120 = sha1($salt.$pass)", + " 130 = sha1(unicode($pass).$salt)", + " 140 = sha1($salt.unicode($pass))", + " 4500 = sha1(sha1($pass)", + " 4700 = sha1(md5($pass))", + " 4900 = sha1($salt.$pass.$salt)", + " 1410 = sha256($pass.$salt)", + " 1420 = sha256($salt.$pass)", + " 1430 = sha256(unicode($pass).$salt)", + " 1440 = sha256($salt.unicode($pass))", + " 1710 = sha512($pass.$salt)", + " 1720 = sha512($salt.$pass)", + " 1730 = sha512(unicode($pass).$salt)", + " 1740 = sha512($salt.unicode($pass))", + "", + "[[ Roll-your-own: Authenticated Hashes ]]", + "", + " 50 = HMAC-MD5 (key = $pass)", + " 60 = HMAC-MD5 (key = $salt)", + " 150 = HMAC-SHA1 (key = $pass)", + " 160 = HMAC-SHA1 (key = $salt)", + " 1450 = HMAC-SHA256 (key = $pass)", + " 1460 = HMAC-SHA256 (key = $salt)", + " 1750 = HMAC-SHA512 (key = $pass)", + " 1760 = HMAC-SHA512 (key = $salt)", + "", + "[[ Generic KDF ]]", + "", + " 400 = phpass", + " 8900 = scrypt", + " 11900 = PBKDF2-HMAC-MD5", + " 12000 = PBKDF2-HMAC-SHA1", + " 10900 = PBKDF2-HMAC-SHA256", + " 12100 = PBKDF2-HMAC-SHA512", + "", + "[[ Network protocols, Challenge-Response ]]", + "", + " 23 = Skype", + " 2500 = WPA/WPA2", + " 4800 = iSCSI CHAP authentication, MD5(Chap)", + " 5300 = IKE-PSK MD5", + " 5400 = IKE-PSK SHA1", + " 5500 = NetNTLMv1", + " 5500 = NetNTLMv1 + ESS", + " 5600 = NetNTLMv2", + " 7300 = IPMI2 RAKP HMAC-SHA1", + " 7500 = Kerberos 5 AS-REQ Pre-Auth etype 23", + " 8300 = DNSSEC (NSEC3)", + " 10200 = Cram MD5", + " 11100 = PostgreSQL Challenge-Response Authentication (MD5)", + " 11200 = MySQL Challenge-Response Authentication (SHA1)", + " 11400 = SIP digest authentication (MD5)", + "", + "[[ Forums, CMS, E-Commerce, Frameworks, Middleware, Wiki, Management ]]", + "", + " 121 = SMF (Simple Machines Forum)", + " 400 = phpBB3", + " 2611 = vBulletin < v3.8.5", + " 2711 = vBulletin > v3.8.5", + " 2811 = MyBB", + " 2811 = IPB (Invison Power Board)", + " 8400 = WBB3 (Woltlab Burning Board)", + " 11 = Joomla < 2.5.18", + " 400 = Joomla > 2.5.18", + " 400 = Wordpress", + " 2612 = PHPS", + " 7900 = Drupal7", + " 21 = osCommerce", + " 21 = xt:Commerce", + " 11000 = PrestaShop", + " 124 = Django (SHA-1)", + " 10000 = Django (PBKDF2-SHA256)", + " 3711 = Mediawiki B type", + " 7600 = Redmine", + "", + "[[ Database Server ]]", + "", + " 12 = PostgreSQL", + " 131 = MSSQL(2000)", + " 132 = MSSQL(2005)", + " 1731 = MSSQL(2012)", + " 1731 = MSSQL(2014)", + " 200 = MySQL323", + " 300 = MySQL4.1/MySQL5", + " 3100 = Oracle H: Type (Oracle 7+)", + " 112 = Oracle S: Type (Oracle 11+)", + " 12300 = Oracle T: Type (Oracle 12+)", + " 8000 = Sybase ASE", + "", + "[[ HTTP, SMTP, LDAP Server]]", + "", + " 141 = EPiServer 6.x < v4", + " 1441 = EPiServer 6.x > v4", + " 1600 = Apache $apr1$", + " 12600 = ColdFusion 10+", + " 1421 = hMailServer", + " 101 = nsldap, SHA-1(Base64), Netscape LDAP SHA", + " 111 = nsldaps, SSHA-1(Base64), Netscape LDAP SSHA", + " 1711 = SSHA-512(Base64), LDAP {SSHA512}", + "", + "[[ Checksums ]]", + "", + " 11500 = CRC32", + "", + "[[ Operating-Systems ]]", + "", + " 3000 = LM", + " 1000 = NTLM", + " 1100 = Domain Cached Credentials (DCC), MS Cache", + " 2100 = Domain Cached Credentials 2 (DCC2), MS Cache 2", + " 12800 = MS-AzureSync PBKDF2-HMAC-SHA256", + " 1500 = descrypt, DES(Unix), Traditional DES", + " 12400 = BSDiCrypt, Extended DES", + " 500 = md5crypt $1$, MD5(Unix)", + " 3200 = bcrypt $2*$, Blowfish(Unix)", + " 7400 = sha256crypt $5$, SHA256(Unix)", + " 1800 = sha512crypt $6$, SHA512(Unix)", + " 122 = OSX v10.4", + " 122 = OSX v10.5", + " 122 = OSX v10.6", + " 1722 = OSX v10.7", + " 7100 = OSX v10.8", + " 7100 = OSX v10.9", + " 7100 = OSX v10.10", + " 6300 = AIX {smd5}", + " 6700 = AIX {ssha1}", + " 6400 = AIX {ssha256}", + " 6500 = AIX {ssha512}", + " 2400 = Cisco-PIX", + " 2410 = Cisco-ASA", + " 500 = Cisco-IOS $1$", + " 5700 = Cisco-IOS $4$", + " 9200 = Cisco-IOS $8$", + " 9300 = Cisco-IOS $9$", + " 22 = Juniper Netscreen/SSG (ScreenOS)", + " 501 = Juniper IVE", + " 5800 = Android PIN", + " 8100 = Citrix Netscaler", + " 8500 = RACF", + " 7200 = GRUB 2", + " 9900 = Radmin2", + "", + "[[ Enterprise Application Software (EAS) ]]", + "", + " 7700 = SAP CODVN B (BCODE)", + " 7800 = SAP CODVN F/G (PASSCODE)", + " 10300 = SAP CODVN H (PWDSALTEDHASH) iSSHA-1", + " 8600 = Lotus Notes/Domino 5", + " 8700 = Lotus Notes/Domino 6", + " 9100 = Lotus Notes/Domino 8", + " 133 = PeopleSoft", + "", + "[[ Archives ]]", + "", + " 11600 = 7-Zip", + " 12500 = RAR3-hp", + "", + "[[ Full-Disk encryptions (FDE) ]]", + "", + " 62XY = TrueCrypt 5.0+", + " X = 1 = PBKDF2-HMAC-RipeMD160", + " X = 2 = PBKDF2-HMAC-SHA512", + " X = 3 = PBKDF2-HMAC-Whirlpool", + " X = 4 = PBKDF2-HMAC-RipeMD160 + boot-mode", + " Y = 1 = XTS 512 bit (Ciphers: AES or Serpent or Twofish)", + " Y = 2 = XTS 1024 bit (Ciphers: AES or Serpent or Twofish or AES-Twofish or Serpent-AES or Twofish-Serpent)", + " Y = 3 = XTS 1536 bit (Ciphers: All)", + " 8800 = Android FDE < v4.3", + " 12200 = eCryptfs", + "", + "[[ Documents ]]", + "", + " 9700 = MS Office <= 2003 MD5 + RC4, oldoffice$0, oldoffice$1", + " 9710 = MS Office <= 2003 MD5 + RC4, collider-mode #1", + " 9720 = MS Office <= 2003 MD5 + RC4, collider-mode #2", + " 9800 = MS Office <= 2003 SHA1 + RC4, oldoffice$3, oldoffice$4", + " 9810 = MS Office <= 2003 SHA1 + RC4, collider-mode #1", + " 9820 = MS Office <= 2003 SHA1 + RC4, collider-mode #2", + " 9400 = MS Office 2007", + " 9500 = MS Office 2010", + " 9600 = MS Office 2013", + " 10400 = PDF 1.1 - 1.3 (Acrobat 2 - 4)", + " 10410 = PDF 1.1 - 1.3 (Acrobat 2 - 4) + collider-mode #1", + " 10420 = PDF 1.1 - 1.3 (Acrobat 2 - 4) + collider-mode #2", + " 10500 = PDF 1.4 - 1.6 (Acrobat 5 - 8)", + " 10600 = PDF 1.7 Level 3 (Acrobat 9)", + " 10700 = PDF 1.7 Level 8 (Acrobat 10 - 11)", + "", + "[[ Password Managers ]]", + "", + " 9000 = Password Safe v2", + " 5200 = Password Safe v3", + " 6800 = Lastpass", + " 6600 = 1Password, agilekeychain", + " 8200 = 1Password, cloudkeychain", + " 11300 = Bitcoin/Litecoin wallet.dat", + " 12700 = Blockchain, My Wallet", + "", + NULL +}; + +/** + * oclHashcat specific functions + */ + +void status_display_automat () +{ + FILE *out = stdout; + + fprintf (out, "STATUS\t%u\t", data.devices_status); + + /** + * speed new + */ + + fprintf (out, "SPEED\t"); + + for (uint device_id = 0; device_id < data.devices_cnt; device_id++) + { + hc_device_param_t *device_param = &data.devices_param[device_id]; + + uint64_t speed_cnt = 0; + float speed_ms = 0; + + for (int i = 0; i < SPEED_CACHE; i++) + { + float rec_ms; + + hc_timer_get (device_param->speed_rec[i], rec_ms); + + if (rec_ms > SPEED_MAXAGE) continue; + + speed_cnt += device_param->speed_cnt[i]; + speed_ms += device_param->speed_ms[i]; + } + + speed_cnt /= SPEED_CACHE; + speed_ms /= SPEED_CACHE; + + fprintf (out, "%llu\t%f\t", (unsigned long long int) speed_cnt, speed_ms); + } + + /** + * words_cur + */ + + uint64_t words_cur = get_lowest_words_done (); + + fprintf (out, "CURKU\t%llu\t", (unsigned long long int) words_cur); + + /** + * counter + */ + + uint salts_left = data.salts_cnt - data.salts_done; + + if (salts_left == 0) salts_left = 1; + + uint64_t progress_total = data.words_cnt * salts_left; + + uint64_t all_done = 0; + uint64_t all_rejected = 0; + uint64_t all_restored = 0; + + for (uint salt_pos = 0; salt_pos < data.salts_cnt; salt_pos++) + { + if (salts_left > 1) + { + // otherwise the final cracked status shows 0/XXX progress + + if (data.salts_shown[salt_pos] == 1) continue; + } + + all_done += data.words_progress_done[salt_pos]; + all_rejected += data.words_progress_rejected[salt_pos]; + all_restored += data.words_progress_restored[salt_pos]; + } + + uint64_t progress_cur = all_restored + all_done + all_rejected; + uint64_t progress_end = progress_total; + + uint64_t progress_skip = 0; + + if (data.skip) + { + progress_skip = MIN (data.skip, data.words_base) * salts_left; + + if (data.attack_kern == ATTACK_KERN_STRAIGHT) progress_skip *= data.gpu_rules_cnt; + else if (data.attack_kern == ATTACK_KERN_COMBI) progress_skip *= data.combs_cnt; + else if (data.attack_kern == ATTACK_KERN_BF) progress_skip *= data.bfs_cnt; + } + + if (data.limit) + { + progress_end = MIN (data.limit, data.words_base) * salts_left; + + if (data.attack_kern == ATTACK_KERN_STRAIGHT) progress_end *= data.gpu_rules_cnt; + else if (data.attack_kern == ATTACK_KERN_COMBI) progress_end *= data.combs_cnt; + else if (data.attack_kern == ATTACK_KERN_BF) progress_end *= data.bfs_cnt; + } + + uint64_t progress_cur_relative_skip = progress_cur - progress_skip; + uint64_t progress_end_relative_skip = progress_end - progress_skip; + + fprintf (out, "PROGRESS\t%llu\t%llu\t", (unsigned long long int) progress_cur_relative_skip, (unsigned long long int) progress_end_relative_skip); + + /** + * cracks + */ + + fprintf (out, "RECHASH\t%u\t%u\t", data.digests_done, data.digests_cnt); + fprintf (out, "RECSALT\t%u\t%u\t", data.salts_done, data.salts_cnt); + + /** + * temperature + */ + + if (data.gpu_temp_disable == 0) + { + fprintf (out, "TEMP\t"); + + hc_thread_mutex_lock (mux_adl); + + for (uint i = 0; i < data.devices_cnt; i++) + { + int temp = hm_get_temperature_with_device_id (i); + + fprintf (out, "%d\t", temp); + } + + hc_thread_mutex_unlock (mux_adl); + } + + #ifdef _WIN + fputc ('\r', out); + fputc ('\n', out); + #endif + + #ifdef _POSIX + fputc ('\n', out); + #endif + + fflush (out); +} + +void status_display () +{ + if (data.devices_status == STATUS_INIT) return; + if (data.devices_status == STATUS_STARTING) return; + if (data.devices_status == STATUS_BYPASS) return; + + if (data.status_automat == 1) + { + status_display_automat (); + + return; + } + + char tmp_buf[1000]; + + uint tmp_len = 0; + + log_info ("Session.Name...: %s", data.session); + + char *status_type = strstatus (data.devices_status); + + uint hash_mode = data.hash_mode; + + char *hash_type = strhashtype (hash_mode); // not a bug + + log_info ("Status.........: %s", status_type); + + /** + * show rules + */ + + if (data.rp_files_cnt) + { + uint i; + + for (i = 0, tmp_len = 0; i < data.rp_files_cnt - 1 && tmp_len < sizeof (tmp_buf); i++) + { + tmp_len += snprintf (tmp_buf + tmp_len, sizeof (tmp_buf) - tmp_len, "File (%s), ", data.rp_files[i]); + } + + snprintf (tmp_buf + tmp_len, sizeof (tmp_buf) - tmp_len, "File (%s)", data.rp_files[i]); + + log_info ("Rules.Type.....: %s", tmp_buf); + + tmp_len = 0; + } + + if (data.rp_gen) + { + log_info ("Rules.Type.....: Generated (%u)", data.rp_gen); + + if (data.rp_gen_seed) + { + log_info ("Rules.Seed.....: %u", data.rp_gen_seed); + } + } + + /** + * show input + */ + + if (data.attack_mode == ATTACK_MODE_STRAIGHT) + { + if (data.wordlist_mode == WL_MODE_FILE) + { + if (data.dictfile != NULL) log_info ("Input.Mode.....: File (%s)", data.dictfile); + } + else if (data.wordlist_mode == WL_MODE_STDIN) + { + log_info ("Input.Mode.....: Pipe"); + } + } + else if (data.attack_mode == ATTACK_MODE_COMBI) + { + if (data.dictfile != NULL) log_info ("Input.Left.....: File (%s)", data.dictfile); + if (data.dictfile2 != NULL) log_info ("Input.Right....: File (%s)", data.dictfile2); + } + else if (data.attack_mode == ATTACK_MODE_BF) + { + char *mask = data.mask; + + if (mask != NULL) + { + uint mask_len = data.css_cnt; + + tmp_len += snprintf (tmp_buf + tmp_len, sizeof (tmp_buf) - tmp_len, "Mask (%s)", mask); + + if (mask_len > 0) + { + if (data.opti_type & OPTI_TYPE_SINGLE_HASH) + { + if (data.opti_type & OPTI_TYPE_APPENDED_SALT) + { + mask_len -= data.salts_buf[0].salt_len; + } + } + + if (data.opts_type & OPTS_TYPE_PT_UNICODE) mask_len /= 2; + + tmp_len += snprintf (tmp_buf + tmp_len, sizeof (tmp_buf) - tmp_len, " [%i]", mask_len); + } + + if (data.maskcnt > 1) + { + float mask_percentage = (float) data.maskpos / (float) data.maskcnt; + + tmp_len += snprintf (tmp_buf + tmp_len, sizeof (tmp_buf) - tmp_len, " (%.02f%%)", mask_percentage * 100); + } + + log_info ("Input.Mode.....: %s", tmp_buf); + } + + tmp_len = 0; + } + else if (data.attack_mode == ATTACK_MODE_HYBRID1) + { + if (data.dictfile != NULL) log_info ("Input.Left.....: File (%s)", data.dictfile); + if (data.mask != NULL) log_info ("Input.Right....: Mask (%s) [%i]", data.mask, data.css_cnt); + } + else if (data.attack_mode == ATTACK_MODE_HYBRID2) + { + if (data.mask != NULL) log_info ("Input.Left.....: Mask (%s) [%i]", data.mask, data.css_cnt); + if (data.dictfile != NULL) log_info ("Input.Right....: File (%s)", data.dictfile); + } + + if (data.digests_cnt == 1) + { + if (data.hash_mode == 2500) + { + wpa_t *wpa = (wpa_t *) data.esalts_buf; + + uint pke[25]; + + char *pke_ptr = (char *) pke; + + for (uint i = 0; i < 25; i++) + { + pke[i] = byte_swap_32 (wpa->pke[i]); + } + + char mac1[6]; + char mac2[6]; + + memcpy (mac1, pke_ptr + 23, 6); + memcpy (mac2, pke_ptr + 29, 6); + + log_info ("Hash.Target....: %s (%02x:%02x:%02x:%02x:%02x:%02x <-> %02x:%02x:%02x:%02x:%02x:%02x)", + (char *) data.salts_buf[0].salt_buf, + mac1[0] & 0xff, + mac1[1] & 0xff, + mac1[2] & 0xff, + mac1[3] & 0xff, + mac1[4] & 0xff, + mac1[5] & 0xff, + mac2[0] & 0xff, + mac2[1] & 0xff, + mac2[2] & 0xff, + mac2[3] & 0xff, + mac2[4] & 0xff, + mac2[5] & 0xff); + } + else if (data.hash_mode == 5200) + { + log_info ("Hash.Target....: File (%s)", data.hashfile); + } + else if (data.hash_mode == 9000) + { + log_info ("Hash.Target....: File (%s)", data.hashfile); + } + else if ((data.hash_mode >= 6200) && (data.hash_mode <= 6299)) + { + log_info ("Hash.Target....: File (%s)", data.hashfile); + } + else + { + char out_buf[4096]; + + ascii_digest (out_buf, 0, 0); + + // limit length + if (strlen (out_buf) > 40) + { + out_buf[41] = '.'; + out_buf[42] = '.'; + out_buf[43] = '.'; + out_buf[44] = 0; + } + + log_info ("Hash.Target....: %s", out_buf); + } + } + else + { + if (data.hash_mode == 3000) + { + char out_buf1[4096]; + char out_buf2[4096]; + + ascii_digest (out_buf1, 0, 0); + ascii_digest (out_buf2, 0, 1); + + log_info ("Hash.Target....: %s, %s", out_buf1, out_buf2); + } + else + { + log_info ("Hash.Target....: File (%s)", data.hashfile); + } + } + + log_info ("Hash.Type......: %s", hash_type); + + /** + * speed new + */ + + uint64_t speed_cnt[DEVICES_MAX]; + float speed_ms[DEVICES_MAX]; + + for (uint device_id = 0; device_id < data.devices_cnt; device_id++) + { + hc_device_param_t *device_param = &data.devices_param[device_id]; + + // we need to clear values (set to 0) because in case the gpu does + // not get new candidates it idles around but speed display would + // show it as working. + // if we instantly set it to 0 after reading it happens that the + // speed can be shown as zero if the users refreshs to fast. + // therefore, we add a timestamp when a stat was recorded and if its + // to old we will not use it + + speed_cnt[device_id] = 0; + speed_ms[device_id] = 0; + + for (int i = 0; i < SPEED_CACHE; i++) + { + float rec_ms; + + hc_timer_get (device_param->speed_rec[i], rec_ms); + + if (rec_ms > SPEED_MAXAGE) continue; + + speed_cnt[device_id] += device_param->speed_cnt[i]; + speed_ms[device_id] += device_param->speed_ms[i]; + } + + speed_cnt[device_id] /= SPEED_CACHE; + speed_ms[device_id] /= SPEED_CACHE; + } + + float hashes_all_ms = 0; + + float hashes_dev_ms[DEVICES_MAX]; + + for (uint device_id = 0; device_id < data.devices_cnt; device_id++) + { + hashes_dev_ms[device_id] = 0; + + if (speed_ms[device_id]) + { + hashes_dev_ms[device_id] = speed_cnt[device_id] / speed_ms[device_id]; + + hashes_all_ms += hashes_dev_ms[device_id]; + } + } + + /** + * timers + */ + + float ms_running = 0; + + hc_timer_get (data.timer_running, ms_running); + + float ms_paused = data.ms_paused; + + if (data.devices_status == STATUS_PAUSED) + { + float ms_paused_tmp = 0; + + hc_timer_get (data.timer_paused, ms_paused_tmp); + + ms_paused += ms_paused_tmp; + } + + #ifdef WIN + + __time64_t sec_run = ms_running / 1000; + + #else + + time_t sec_run = ms_running / 1000; + + #endif + + if (sec_run) + { + char display_run[32]; + + struct tm tm_run; + + struct tm *tmp; + + #ifdef WIN + + tmp = _gmtime64 (&sec_run); + + #else + + tmp = gmtime (&sec_run); + + #endif + + if (tmp != NULL) + { + memcpy (&tm_run, tmp, sizeof (struct tm)); + + format_timer_display (&tm_run, display_run, sizeof (tm_run)); + + char *start = ctime (&data.proc_start); + + size_t start_len = strlen (start); + + if (start[start_len - 1] == '\n') start[start_len - 1] = 0; + if (start[start_len - 2] == '\r') start[start_len - 2] = 0; + + log_info ("Time.Started...: %s (%s)", start, display_run); + } + } + else + { + log_info ("Time.Started...: 0 secs"); + } + + /** + * counters + */ + + uint salts_left = data.salts_cnt - data.salts_done; + + if (salts_left == 0) salts_left = 1; + + uint64_t progress_total = data.words_cnt * salts_left; + + uint64_t all_done = 0; + uint64_t all_rejected = 0; + uint64_t all_restored = 0; + + for (uint salt_pos = 0; salt_pos < data.salts_cnt; salt_pos++) + { + if (salts_left > 1) + { + // otherwise the final cracked status shows 0/XXX progress + + if (data.salts_shown[salt_pos] == 1) continue; + } + + all_done += data.words_progress_done[salt_pos]; + all_rejected += data.words_progress_rejected[salt_pos]; + all_restored += data.words_progress_restored[salt_pos]; + } + + uint64_t progress_cur = all_restored + all_done + all_rejected; + uint64_t progress_end = progress_total; + + uint64_t progress_skip = 0; + + if (data.skip) + { + progress_skip = MIN (data.skip, data.words_base) * salts_left; + + if (data.attack_kern == ATTACK_KERN_STRAIGHT) progress_skip *= data.gpu_rules_cnt; + else if (data.attack_kern == ATTACK_KERN_COMBI) progress_skip *= data.combs_cnt; + else if (data.attack_kern == ATTACK_KERN_BF) progress_skip *= data.bfs_cnt; + } + + if (data.limit) + { + progress_end = MIN (data.limit, data.words_base) * salts_left; + + if (data.attack_kern == ATTACK_KERN_STRAIGHT) progress_end *= data.gpu_rules_cnt; + else if (data.attack_kern == ATTACK_KERN_COMBI) progress_end *= data.combs_cnt; + else if (data.attack_kern == ATTACK_KERN_BF) progress_end *= data.bfs_cnt; + } + + uint64_t progress_cur_relative_skip = progress_cur - progress_skip; + uint64_t progress_end_relative_skip = progress_end - progress_skip; + + float speed_ms_real = ms_running - ms_paused; + uint64_t speed_plains_real = all_done; + + if ((data.wordlist_mode == WL_MODE_FILE) || (data.wordlist_mode == WL_MODE_MASK)) + { + if (data.devices_status != STATUS_CRACKED) + { + uint64_t words_per_ms = 0; + + if (speed_plains_real && speed_ms_real) + { + words_per_ms = speed_plains_real / speed_ms_real; + } + + #ifdef WIN + __time64_t sec_etc = 0; + #else + time_t sec_etc = 0; + #endif + + if (words_per_ms) + { + uint64_t progress_left_relative_skip = progress_end_relative_skip - progress_cur_relative_skip; + + uint64_t ms_left = progress_left_relative_skip / words_per_ms; + + sec_etc = ms_left / 1000; + } + + if (sec_etc == 0) + { + log_info ("Time.Estimated.: 0 secs"); + } + else if ((uint64_t) sec_etc > ETC_MAX) + { + log_info ("Time.Estimated.: > 10 Years"); + } + else + { + char display_etc[32]; + + struct tm tm_etc; + + struct tm *tmp; + + #ifdef WIN + + tmp = _gmtime64 (&sec_etc); + + #else + + tmp = gmtime (&sec_etc); + + #endif + + if (tmp != NULL) + { + memcpy (&tm_etc, tmp, sizeof (tm_etc)); + + format_timer_display (&tm_etc, display_etc, sizeof (display_etc)); + + time_t now; + + time (&now); + + now += sec_etc; + + char *etc = ctime (&now); + + size_t etc_len = strlen (etc); + + if (etc[etc_len - 1] == '\n') etc[etc_len - 1] = 0; + if (etc[etc_len - 2] == '\r') etc[etc_len - 2] = 0; + + log_info ("Time.Estimated.: %s (%s)", etc, display_etc); + } + } + } + } + + for (uint device_id = 0; device_id < data.devices_cnt; device_id++) + { + char display_dev_cur[16]; + + memset (display_dev_cur, 0, sizeof (display_dev_cur)); + + strncpy (display_dev_cur, "0.00", 4); + + format_speed_display (hashes_dev_ms[device_id] * 1000, display_dev_cur, sizeof (display_dev_cur)); + + log_info ("Speed.GPU.#%d...: %9sH/s", device_id + 1, display_dev_cur); + } + + char display_all_cur[16]; + + memset (display_all_cur, 0, sizeof (display_all_cur)); + + strncpy (display_all_cur, "0.00", 4); + + format_speed_display (hashes_all_ms * 1000, display_all_cur, sizeof (display_all_cur)); + + if (data.devices_cnt > 1) log_info ("Speed.GPU.#*...: %9sH/s", display_all_cur); + + const float digests_percent = (float) data.digests_done / data.digests_cnt; + const float salts_percent = (float) data.salts_done / data.salts_cnt; + + log_info ("Recovered......: %u/%u (%.2f%%) Digests, %u/%u (%.2f%%) Salts", data.digests_done, data.digests_cnt, digests_percent * 100, data.salts_done, data.salts_cnt, salts_percent * 100); + + // crack-per-time + + if (data.digests_cnt > 100) + { + time_t now = time (NULL); + + int cpt_cur_min = 0; + int cpt_cur_hour = 0; + int cpt_cur_day = 0; + + for (int i = 0; i < CPT_BUF; i++) + { + const uint cracked = data.cpt_buf[i].cracked; + const time_t timestamp = data.cpt_buf[i].timestamp; + + if ((timestamp + 60) > now) + { + cpt_cur_min += cracked; + } + + if ((timestamp + 3600) > now) + { + cpt_cur_hour += cracked; + } + + if ((timestamp + 86400) > now) + { + cpt_cur_day += cracked; + } + } + + float cpt_avg_min = (float) data.cpt_total / ((speed_ms_real / 1000) / 60); + float cpt_avg_hour = (float) data.cpt_total / ((speed_ms_real / 1000) / 3600); + float cpt_avg_day = (float) data.cpt_total / ((speed_ms_real / 1000) / 86400); + + if ((data.cpt_start + 86400) < now) + { + log_info ("Recovered/Time.: CUR:%llu,%llu,%llu AVG:%0.2f,%0.2f,%0.2f (Min,Hour,Day)", + cpt_cur_min, + cpt_cur_hour, + cpt_cur_day, + cpt_avg_min, + cpt_avg_hour, + cpt_avg_day); + } + else if ((data.cpt_start + 3600) < now) + { + log_info ("Recovered/Time.: CUR:%llu,%llu,N/A AVG:%0.2f,%0.2f,%0.2f (Min,Hour,Day)", + cpt_cur_min, + cpt_cur_hour, + cpt_avg_min, + cpt_avg_hour, + cpt_avg_day); + } + else if ((data.cpt_start + 60) < now) + { + log_info ("Recovered/Time.: CUR:%llu,N/A,N/A AVG:%0.2f,%0.2f,%0.2f (Min,Hour,Day)", + cpt_cur_min, + cpt_avg_min, + cpt_avg_hour, + cpt_avg_day); + } + else + { + log_info ("Recovered/Time.: CUR:N/A,N/A,N/A AVG:%0.2f,%0.2f,%0.2f (Min,Hour,Day)", + cpt_avg_min, + cpt_avg_hour, + cpt_avg_day); + } + } + + // Restore point + + uint64_t restore_point = get_lowest_words_done (); + + uint64_t restore_total = data.words_base; + + float percent_restore = 0; + + if (restore_total != 0) percent_restore = (float) restore_point / (float) restore_total; + + if (progress_end_relative_skip) + { + if ((data.wordlist_mode == WL_MODE_FILE) || (data.wordlist_mode == WL_MODE_MASK)) + { + float percent_finished = (float) progress_cur_relative_skip / (float) progress_end_relative_skip; + float percent_rejected = 0.0; + + if (progress_cur) + { + percent_rejected = (float) (all_rejected) / (float) progress_cur; + } + + log_info ("Progress.......: %llu/%llu (%.02f%%)", (unsigned long long int) progress_cur_relative_skip, (unsigned long long int) progress_end_relative_skip, percent_finished * 100); + log_info ("Rejected.......: %llu/%llu (%.02f%%)", (unsigned long long int) all_rejected, (unsigned long long int) progress_cur_relative_skip, percent_rejected * 100); + + if (data.restore_disable == 0) + { + if (percent_finished != 1) + { + log_info ("Restore.Point..: %llu/%llu (%.02f%%)", (unsigned long long int) restore_point, (unsigned long long int) restore_total, percent_restore * 100); + } + } + } + } + else + { + if ((data.wordlist_mode == WL_MODE_FILE) || (data.wordlist_mode == WL_MODE_MASK)) + { + log_info ("Progress.......: %llu/%llu (%.02f%%)", (uint64_t) 0, (uint64_t) 0, (float) 100); + log_info ("Rejected.......: %llu/%llu (%.02f%%)", (uint64_t) 0, (uint64_t) 0, (float) 100); + + if (data.restore_disable == 0) + { + log_info ("Restore point..: %llu/%llu (%.02f%%)", (uint64_t) 0, (uint64_t) 0, (float) 100); + } + } + else + { + log_info ("Progress.......: %llu", (unsigned long long int) progress_cur_relative_skip); + log_info ("Rejected.......: %llu", (unsigned long long int) all_rejected); + + // --restore not allowed if stdin is used -- really? why? + + //if (data.restore_disable == 0) + //{ + // log_info ("Restore point..: %llu", (unsigned long long int) restore_point); + //} + } + } + + if (data.gpu_temp_disable == 0) + { + hc_thread_mutex_lock (mux_adl); + + for (uint i = 0; i < data.devices_cnt; i++) + { + if (data.hm_device[i].fan_supported == 1) + { + const int temperature = hm_get_temperature_with_device_id (i); + const int utilization = hm_get_utilization_with_device_id (i); + const int fanspeed = hm_get_fanspeed_with_device_id (i); + + #ifdef _OCL + log_info ("HWMon.GPU.#%d...: %2d%% Util, %2dc Temp, %2d%% Fan", i + 1, utilization, temperature, fanspeed); + #else + #ifdef LINUX + log_info ("HWMon.GPU.#%d...: %2d%% Util, %2dc Temp, %2d%% Fan", i + 1, utilization, temperature, fanspeed); + #else + log_info ("HWMon.GPU.#%d...: %2d%% Util, %2dc Temp, %2drpm Fan", i + 1, utilization, temperature, fanspeed); + #endif + #endif + } + else + { + const int temperature = hm_get_temperature_with_device_id (i); + const int utilization = hm_get_utilization_with_device_id (i); + + log_info ("HWMon.GPU.#%d...: %2d%% Util, %2dc Temp, N/A Fan", i + 1, utilization, temperature); + } + } + + hc_thread_mutex_unlock (mux_adl); + } +} + +static void status_benchmark () +{ + if (data.devices_status == STATUS_INIT) return; + if (data.devices_status == STATUS_STARTING) return; + + if (data.words_cnt == 0) return; + + uint64_t speed_cnt[DEVICES_MAX]; + float speed_ms[DEVICES_MAX]; + + uint device_id; + + for (device_id = 0; device_id < data.devices_cnt; device_id++) + { + hc_device_param_t *device_param = &data.devices_param[device_id]; + + speed_cnt[device_id] = 0; + speed_ms[device_id] = 0; + + for (int i = 0; i < SPEED_CACHE; i++) + { + speed_cnt[device_id] += device_param->speed_cnt[i]; + speed_ms[device_id] += device_param->speed_ms[i]; + } + + speed_cnt[device_id] /= SPEED_CACHE; + speed_ms[device_id] /= SPEED_CACHE; + } + + float hashes_all_ms = 0; + + float hashes_dev_ms[DEVICES_MAX]; + + for (uint device_id = 0; device_id < data.devices_cnt; device_id++) + { + hashes_dev_ms[device_id] = 0; + + if (speed_ms[device_id]) + { + hashes_dev_ms[device_id] = speed_cnt[device_id] / speed_ms[device_id]; + + hashes_all_ms += hashes_dev_ms[device_id]; + } + } + + for (uint device_id = 0; device_id < data.devices_cnt; device_id++) + { + char display_dev_cur[16]; + + memset (display_dev_cur, 0, sizeof (display_dev_cur)); + + strncpy (display_dev_cur, "0.00", 4); + + format_speed_display (hashes_dev_ms[device_id] * 1000, display_dev_cur, sizeof (display_dev_cur)); + + log_info ("Speed.GPU.#%d.: %9sH/s", device_id + 1, display_dev_cur); + } + + char display_all_cur[16]; + + memset (display_all_cur, 0, sizeof (display_all_cur)); + + strncpy (display_all_cur, "0.00", 4); + + format_speed_display (hashes_all_ms * 1000, display_all_cur, sizeof (display_all_cur)); + + if (data.devices_cnt > 1) log_info ("Speed.GPU.#*.: %9sH/s", display_all_cur); +} + +/** + * oclHashcat -only- functions + */ + +static uint convert_from_hex (char *line_buf, const uint line_len) +{ + if (line_len & 1) return (line_len); // not in hex + + if (data.hex_wordlist == 1) + { + uint i; + uint j; + + for (i = 0, j = 0; j < line_len; i += 1, j += 2) + { + line_buf[i] = hex_to_char (&line_buf[j]); + } + + memset (line_buf + i, 0, line_len - i); + + return (i); + } + else if (line_len >= 6) // $HEX[] = 6 + { + if (line_buf[0] != '$') return (line_len); + if (line_buf[1] != 'H') return (line_len); + if (line_buf[2] != 'E') return (line_len); + if (line_buf[3] != 'X') return (line_len); + if (line_buf[4] != '[') return (line_len); + if (line_buf[line_len - 1] != ']') return (line_len); + + uint i; + uint j; + + for (i = 0, j = 5; j < line_len - 1; i += 1, j += 2) + { + line_buf[i] = hex_to_char (&line_buf[j]); + } + + memset (line_buf + i, 0, line_len - i); + + return (i); + } + + return (line_len); +} + +static uint count_lines (FILE *fd) +{ + uint cnt = 0; + + char *buf = (char *) mymalloc (BUFSIZ); + + size_t nread_tmp = 0; + + char *ptr = buf; + + while (!feof (fd)) + { + size_t nread = fread (buf, sizeof (char), BUFSIZ, fd); + nread_tmp = nread; + + if (nread < 1) continue; + + ptr = buf; + + do + { + if (*ptr++ == '\n') cnt++; + + } while (nread--); + } + + // special case (if last line did not contain a newline char ... at the very end of the file) + + if (nread_tmp > 3) + { + ptr -= 2; + + if (*ptr != '\n') + { + ptr--; + + if (*ptr != '\n') // needed ? different on windows systems? + { + cnt++; + } + } + } + + myfree (buf); + + return cnt; +} + +static void clear_prompt () +{ + fputc ('\r', stdout); + + for (size_t i = 0; i < strlen (PROMPT); i++) + { + fputc (' ', stdout); + } + + fputc ('\r', stdout); + + fflush (stdout); +} + +static void gidd_to_pw_t (hc_device_param_t *device_param, const uint64_t gidd, pw_t *pw) +{ + #ifdef _CUDA + hc_cuCtxPushCurrent (device_param->context); + + hc_cuMemcpyDtoH (pw, device_param->d_pws_buf + (gidd * sizeof (pw_t)), sizeof (pw_t)); + + hc_cuCtxPopCurrent (&device_param->context); + + #elif _OCL + hc_clEnqueueReadBuffer (device_param->command_queue, device_param->d_pws_buf, CL_TRUE, gidd * sizeof (pw_t), sizeof (pw_t), pw, 0, NULL, NULL); + + #endif +} + +static void check_hash (hc_device_param_t *device_param, const uint salt_pos, const uint digest_pos) +{ + char *outfile = data.outfile; + uint quiet = data.quiet; + FILE *pot_fp = data.pot_fp; + uint loopback = data.loopback; + uint debug_mode = data.debug_mode; + char *debug_file = data.debug_file; + + char debug_rule_buf[BLOCK_SIZE]; + int debug_rule_len = 0; // -1 error + uint debug_plain_len = 0; + + unsigned char debug_plain_ptr[BLOCK_SIZE]; + + // hash + + char out_buf[4096]; memset (out_buf, 0, sizeof (out_buf)); + + ascii_digest (out_buf, salt_pos, digest_pos); + + uint idx = data.salts_buf[salt_pos].digests_offset + digest_pos; + + // plain + + plain_t plain; + + #ifdef _CUDA + hc_cuCtxPushCurrent (device_param->context); + + hc_cuMemcpyDtoH (&plain, device_param->d_plain_bufs + (idx * sizeof (plain_t)), sizeof (plain_t)); + + hc_cuCtxPopCurrent (&device_param->context); + #elif _OCL + hc_clEnqueueReadBuffer (device_param->command_queue, device_param->d_plain_bufs, CL_TRUE, idx * sizeof (plain_t), sizeof (plain_t), &plain, 0, NULL, NULL); + #endif + + uint gidvid = plain.gidvid; + uint il_pos = plain.il_pos; + + uint64_t crackpos = device_param->words_off; + + uint plain_buf[16]; + + unsigned char *plain_ptr = (unsigned char *) plain_buf; + unsigned int plain_len = 0; + + if (data.attack_mode == ATTACK_MODE_STRAIGHT) + { + uint64_t gidd = gidvid / device_param->gpu_vector_width; + uint64_t gidm = gidvid % device_param->gpu_vector_width; + + pw_t pw; + + gidd_to_pw_t (device_param, gidd, &pw); + + for (int i = 0, j = gidm; i < 16; i++, j += device_param->gpu_vector_width) + { + plain_buf[i] = pw.hi1[0][j]; + } + + plain_len = pw.pw_len; + + const uint off = device_param->innerloop_pos + il_pos; + + if (debug_mode > 0) + { + debug_rule_len = 0; + + // save rule + if ((debug_mode == 1) || (debug_mode == 3) || (debug_mode == 4)) + { + memset (debug_rule_buf, 0, sizeof (debug_rule_buf)); + + debug_rule_len = gpu_rule_to_cpu_rule (debug_rule_buf, &data.gpu_rules_buf[off]); + } + + // save plain + if ((debug_mode == 2) || (debug_mode == 3) || (debug_mode == 4)) + { + memset (debug_plain_ptr, 0, sizeof (debug_plain_ptr)); + + memcpy (debug_plain_ptr, plain_ptr, plain_len); + + debug_plain_len = plain_len; + } + } + + plain_len = apply_rules (data.gpu_rules_buf[off].cmds, &plain_buf[0], &plain_buf[4], plain_len); + + crackpos += gidvid; + crackpos *= data.gpu_rules_cnt; + crackpos += device_param->innerloop_pos + il_pos; + + if (plain_len > data.pw_max) plain_len = data.pw_max; + } + else if (data.attack_mode == ATTACK_MODE_COMBI) + { + uint64_t gidd = gidvid / device_param->gpu_vector_width; + uint64_t gidm = gidvid % device_param->gpu_vector_width; + + pw_t pw; + + gidd_to_pw_t (device_param, gidd, &pw); + + for (int i = 0, j = gidm; i < 16; i++, j += device_param->gpu_vector_width) + { + plain_buf[i] = pw.hi1[0][j]; + } + + plain_len = pw.pw_len; + + char *comb_buf = (char *) device_param->combs_buf[il_pos].i; + uint comb_len = device_param->combs_buf[il_pos].pw_len; + + if (data.combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + memcpy (plain_ptr + plain_len, comb_buf, comb_len); + } + else + { + memmove (plain_ptr + comb_len, plain_ptr, plain_len); + + memcpy (plain_ptr, comb_buf, comb_len); + } + + plain_len += comb_len; + + crackpos += gidvid; + crackpos *= data.combs_cnt; + crackpos += device_param->innerloop_pos + il_pos; + + if (data.pw_max != PW_DICTMAX1) + { + if (plain_len > data.pw_max) plain_len = data.pw_max; + } + } + else if (data.attack_mode == ATTACK_MODE_BF) + { + uint64_t l_off = device_param->kernel_params_mp_l_buf64[3] + gidvid; + uint64_t r_off = device_param->kernel_params_mp_r_buf64[3] + il_pos; + + uint l_start = device_param->kernel_params_mp_l_buf32[5]; + uint r_start = device_param->kernel_params_mp_r_buf32[5]; + + uint l_stop = device_param->kernel_params_mp_l_buf32[4]; + uint r_stop = device_param->kernel_params_mp_r_buf32[4]; + + sp_exec (l_off, (char *) plain_ptr + l_start, data.root_css_buf, data.markov_css_buf, l_start, l_start + l_stop); + sp_exec (r_off, (char *) plain_ptr + r_start, data.root_css_buf, data.markov_css_buf, r_start, r_start + r_stop); + + plain_len = data.css_cnt; + + crackpos += gidvid; + crackpos *= data.bfs_cnt; + crackpos += device_param->innerloop_pos + il_pos; + } + else if (data.attack_mode == ATTACK_MODE_HYBRID1) + { + uint64_t gidd = gidvid / device_param->gpu_vector_width; + uint64_t gidm = gidvid % device_param->gpu_vector_width; + + pw_t pw; + + gidd_to_pw_t (device_param, gidd, &pw); + + for (int i = 0, j = gidm; i < 16; i++, j += device_param->gpu_vector_width) + { + plain_buf[i] = pw.hi1[0][j]; + } + + plain_len = pw.pw_len; + + uint64_t off = device_param->kernel_params_mp_buf64[3] + il_pos; + + uint start = 0; + uint stop = device_param->kernel_params_mp_buf32[4]; + + sp_exec (off, (char *) plain_ptr + plain_len, data.root_css_buf, data.markov_css_buf, start, start + stop); + + plain_len += start + stop; + + crackpos += gidvid; + crackpos *= data.combs_cnt; + crackpos += device_param->innerloop_pos + il_pos; + + if (data.pw_max != PW_DICTMAX1) + { + if (plain_len > data.pw_max) plain_len = data.pw_max; + } + } + else if (data.attack_mode == ATTACK_MODE_HYBRID2) + { + uint64_t gidd = gidvid / device_param->gpu_vector_width; + uint64_t gidm = gidvid % device_param->gpu_vector_width; + + pw_t pw; + + gidd_to_pw_t (device_param, gidd, &pw); + + for (int i = 0, j = gidm; i < 16; i++, j += device_param->gpu_vector_width) + { + plain_buf[i] = pw.hi1[0][j]; + } + + plain_len = pw.pw_len; + + uint64_t off = device_param->kernel_params_mp_buf64[3] + il_pos; + + uint start = 0; + uint stop = device_param->kernel_params_mp_buf32[4]; + + memmove (plain_ptr + stop, plain_ptr, plain_len); + + sp_exec (off, (char *) plain_ptr, data.root_css_buf, data.markov_css_buf, start, start + stop); + + plain_len += start + stop; + + crackpos += gidvid; + crackpos *= data.combs_cnt; + crackpos += device_param->innerloop_pos + il_pos; + + if (data.pw_max != PW_DICTMAX1) + { + if (plain_len > data.pw_max) plain_len = data.pw_max; + } + } + + if (data.opti_type & OPTI_TYPE_BRUTE_FORCE) // lots of optimizations can happen here + { + if (data.opti_type & OPTI_TYPE_SINGLE_HASH) + { + if (data.opti_type & OPTI_TYPE_APPENDED_SALT) + { + plain_len = plain_len - data.salts_buf[0].salt_len; + } + } + + if (data.opts_type & OPTS_TYPE_PT_UNICODE) + { + for (uint i = 0, j = 0; i < plain_len; i += 2, j += 1) + { + plain_ptr[j] = plain_ptr[i]; + } + + plain_len = plain_len / 2; + } + } + + // if enabled, update also the potfile + + if (pot_fp) + { + fprintf (pot_fp, "%s:", out_buf); + + format_plain (pot_fp, plain_ptr, plain_len, 1); + + fputc ('\n', pot_fp); + + fflush (pot_fp); + } + + // outfile + + FILE *out_fp = NULL; + + if (outfile != NULL) + { + if ((out_fp = fopen (outfile, "ab")) == NULL) + { + log_error ("ERROR: %s: %s", outfile, strerror (errno)); + + out_fp = stdout; + } + } + else + { + out_fp = stdout; + + if (quiet == 0) clear_prompt (); + } + + format_output (out_fp, out_buf, plain_ptr, plain_len, crackpos, NULL, 0); + + if (outfile != NULL) + { + if (out_fp != stdout) + { + fclose (out_fp); + } + } + else + { + if ((data.wordlist_mode == WL_MODE_FILE) || (data.wordlist_mode == WL_MODE_MASK)) + { + if ((data.devices_status != STATUS_CRACKED) && (data.status != 1)) + { + if (quiet == 0) fprintf (stdout, "%s", PROMPT); + if (quiet == 0) fflush (stdout); + } + } + } + + // loopback + + if (loopback) + { + char *loopback_file = data.loopback_file; + + FILE *fb_fp = NULL; + + if ((fb_fp = fopen (loopback_file, "ab")) != NULL) + { + format_plain (fb_fp, plain_ptr, plain_len, 1); + + fputc ('\n', fb_fp); + + fclose (fb_fp); + } + } + + // (rule) debug mode + + // the next check implies that: + // - (data.attack_mode == ATTACK_MODE_STRAIGHT) + // - debug_mode > 0 + + if ((debug_plain_len > 0) || (debug_rule_len > 0)) + { + if (debug_rule_len < 0) debug_rule_len = 0; + + if ((quiet == 0) && (debug_file == NULL)) clear_prompt (); + + format_debug (debug_file, debug_mode, debug_plain_ptr, debug_plain_len, plain_ptr, plain_len, debug_rule_buf, debug_rule_len); + + if ((quiet == 0) && (debug_file == NULL)) + { + fprintf (stdout, "%s", PROMPT); + fflush (stdout); + } + } +} + +static void check_cracked (hc_device_param_t *device_param, const uint salt_pos) +{ + salt_t *salt_buf = &data.salts_buf[salt_pos]; + + int found = 0; + + #ifdef _CUDA + + hc_cuCtxPushCurrent (device_param->context); + + hc_cuMemcpyDtoH (device_param->result, device_param->d_result, device_param->size_results); + + hc_cuCtxPopCurrent (&device_param->context); + + for (uint i = 0; i < GPU_THREADS_NV; i++) if (device_param->result[i] == 1) found = 1; + + #elif _OCL + + hc_clEnqueueReadBuffer (device_param->command_queue, device_param->d_result, CL_TRUE, 0, device_param->size_results, device_param->result, 0, NULL, NULL); + + for (uint i = 0; i < GPU_THREADS_AMD; i++) if (device_param->result[i] == 1) found = 1; + + #endif + + if (found == 1) + { + // display hack (for weak hashes etc, it could be that there is still something to clear on the current line) + + log_info_nn (""); + + #ifdef _CUDA + + hc_cuCtxPushCurrent (device_param->context); + + hc_cuMemcpyDtoH (&data.digests_shown_tmp[salt_buf->digests_offset], device_param->d_digests_shown + (salt_buf->digests_offset * sizeof (uint)), salt_buf->digests_cnt * sizeof (uint)); + + hc_cuCtxPopCurrent (&device_param->context); + + #elif _OCL + + hc_clEnqueueReadBuffer (device_param->command_queue, device_param->d_digests_shown, CL_TRUE, salt_buf->digests_offset * sizeof (uint), salt_buf->digests_cnt * sizeof (uint), &data.digests_shown_tmp[salt_buf->digests_offset], 0, NULL, NULL); + + #endif + + uint cpt_cracked = 0; + + for (uint digest_pos = 0; digest_pos < salt_buf->digests_cnt; digest_pos++) + { + uint idx = salt_buf->digests_offset + digest_pos; + + if (data.digests_shown_tmp[idx] == 0) continue; + + if (data.digests_shown[idx] == 1) continue; + + if ((data.opts_type & OPTS_TYPE_PT_NEVERCRACK) == 0) + { + data.digests_shown[idx] = 1; + + data.digests_done++; + + cpt_cracked++; + + salt_buf->digests_done++; + + if (salt_buf->digests_done == salt_buf->digests_cnt) + { + data.salts_shown[salt_pos] = 1; + + data.salts_done++; + } + } + + if (data.salts_done == data.salts_cnt) data.devices_status = STATUS_CRACKED; + + check_hash (device_param, salt_pos, digest_pos); + } + + if (cpt_cracked > 0) + { + data.cpt_buf[data.cpt_pos].timestamp = time (NULL); + data.cpt_buf[data.cpt_pos].cracked = cpt_cracked; + + data.cpt_pos++; + + data.cpt_total += cpt_cracked; + + if (data.cpt_pos == CPT_BUF) data.cpt_pos = 0; + } + + if (data.opts_type & OPTS_TYPE_PT_NEVERCRACK) + { + // we need to reset cracked state on the gpu + // otherwise host thinks again and again the hash was cracked + // and returns invalid password each time + + memset (data.digests_shown_tmp, 0, salt_buf->digests_cnt * sizeof (uint)); + + #ifdef _CUDA + + hc_cuCtxPushCurrent (device_param->context); + + hc_cuMemsetD8 (device_param->d_digests_shown + (salt_buf->digests_offset * sizeof (uint)), 0, salt_buf->digests_cnt * sizeof (uint)); + + hc_cuCtxPopCurrent (&device_param->context); + + #elif _OCL + + hc_clEnqueueWriteBuffer (device_param->command_queue, device_param->d_digests_shown, CL_TRUE, salt_buf->digests_offset * sizeof (uint), salt_buf->digests_cnt * sizeof (uint), &data.digests_shown_tmp[salt_buf->digests_offset], 0, NULL, NULL); + + #endif + } + + #ifdef _CUDA + + hc_cuCtxPushCurrent (device_param->context); + + hc_cuMemsetD8 (device_param->d_result, 0, device_param->size_results); + + hc_cuCtxPopCurrent (&device_param->context); + + #elif _OCL + + memset (device_param->result, 0, device_param->size_results); + + hc_clEnqueueWriteBuffer (device_param->command_queue, device_param->d_result, CL_TRUE, 0, device_param->size_results, device_param->result, 0, NULL, NULL); + + #endif + } +} + +static void save_hash () +{ + char *hashfile = data.hashfile; + + char new_hashfile[256]; + char old_hashfile[256]; + + memset (new_hashfile, 0, sizeof (new_hashfile)); + memset (old_hashfile, 0, sizeof (old_hashfile)); + + snprintf (new_hashfile, 255, "%s.new", hashfile); + snprintf (old_hashfile, 255, "%s.old", hashfile); + + unlink (new_hashfile); + + char separator = data.separator; + + FILE *fp = fopen (new_hashfile, "wb"); + + if (fp == NULL) + { + log_error ("ERROR: %s: %s", new_hashfile, strerror (errno)); + + exit (-1); + } + + for (uint salt_pos = 0; salt_pos < data.salts_cnt; salt_pos++) + { + if (data.salts_shown[salt_pos] == 1) continue; + + salt_t *salt_buf = &data.salts_buf[salt_pos]; + + for (uint digest_pos = 0; digest_pos < salt_buf->digests_cnt; digest_pos++) + { + uint idx = salt_buf->digests_offset + digest_pos; + + if (data.digests_shown[idx] == 1) continue; + + if (data.hash_mode != 2500) + { + char out_buf[4096]; + + memset (out_buf, 0, sizeof (out_buf)); + + if (data.username == 1) + { + user_t *user = data.hash_info[idx]->user; + + uint i; + + for (i = 0; i < user->user_len; i++) fputc (user->user_name[i], fp); + + fputc (separator, fp); + } + + ascii_digest (out_buf, salt_pos, digest_pos); + + fputs (out_buf, fp); + + log_out (fp, ""); + } + else + { + hccap_t hccap; + + to_hccap_t (&hccap, salt_pos, digest_pos); + + fwrite (&hccap, sizeof (hccap_t), 1, fp); + } + } + } + + fflush (fp); + + fclose (fp); + + unlink (old_hashfile); + + if (rename (hashfile, old_hashfile) != 0) + { + log_error ("ERROR: Rename file '%s' to '%s': %s", hashfile, old_hashfile, strerror (errno)); + + exit (-1); + } + + unlink (hashfile); + + if (rename (new_hashfile, hashfile) != 0) + { + log_error ("ERROR: Rename file '%s' to '%s': %s", new_hashfile, hashfile, strerror (errno)); + + exit (-1); + } + + unlink (old_hashfile); +} + +static float find_gpu_blocks_div (const uint64_t total_left, const uint gpu_blocks_all) +{ + // function called only in case gpu_blocks_all > words_left) + + float gpu_blocks_div = (float) (total_left) / gpu_blocks_all; + + gpu_blocks_div += gpu_blocks_div / 100; + + uint32_t gpu_blocks_new = (uint32_t) (gpu_blocks_all * gpu_blocks_div); + + while (gpu_blocks_new < total_left) + { + gpu_blocks_div += gpu_blocks_div / 100; + + gpu_blocks_new = (uint32_t) (gpu_blocks_all * gpu_blocks_div); + } + + if (data.quiet == 0) + { + clear_prompt (); + + log_info (""); + + log_info ("INFO: approaching final keyspace, workload adjusted"); + + log_info (""); + + fprintf (stdout, "%s", PROMPT); + + fflush (stdout); + } + + if ((gpu_blocks_all * gpu_blocks_div) < 8) return 1; + + return gpu_blocks_div; +} + +static void run_kernel (const uint kern_run, hc_device_param_t *device_param, const uint num) +{ + // uint gpu_vector_width = device_param->gpu_vector_width; + + // uint num_elements = mydivc32 (num, gpu_vector_width); + + uint num_elements = num; + + device_param->kernel_params_buf32[30] = data.combs_mode; + device_param->kernel_params_buf32[31] = num; + + uint gpu_threads = device_param->gpu_threads; + + while (num_elements % gpu_threads) num_elements++; + + #ifdef _CUDA + CUfunction function = NULL; + + switch (kern_run) + { + case KERN_RUN_1: function = device_param->function1; break; + case KERN_RUN_12: function = device_param->function12; break; + case KERN_RUN_2: function = device_param->function2; break; + case KERN_RUN_23: function = device_param->function23; break; + case KERN_RUN_3: function = device_param->function3; break; + } + + num_elements /= gpu_threads; + + hc_cuCtxPushCurrent (device_param->context); + + hc_cuLaunchKernel (function, num_elements, 1, 1, gpu_threads, 1, 1, 0, device_param->stream, device_param->kernel_params, NULL); + + hc_cuStreamSynchronize (device_param->stream); + + hc_cuCtxPopCurrent (&device_param->context); + + #elif _OCL + + cl_kernel kernel = NULL; + + switch (kern_run) + { + case KERN_RUN_1: kernel = device_param->kernel1; break; + case KERN_RUN_12: kernel = device_param->kernel12; break; + case KERN_RUN_2: kernel = device_param->kernel2; break; + case KERN_RUN_23: kernel = device_param->kernel23; break; + case KERN_RUN_3: kernel = device_param->kernel3; break; + } + + hc_clSetKernelArg (kernel, 21, sizeof (cl_uint), device_param->kernel_params[21]); + hc_clSetKernelArg (kernel, 22, sizeof (cl_uint), device_param->kernel_params[22]); + hc_clSetKernelArg (kernel, 23, sizeof (cl_uint), device_param->kernel_params[23]); + hc_clSetKernelArg (kernel, 24, sizeof (cl_uint), device_param->kernel_params[24]); + hc_clSetKernelArg (kernel, 25, sizeof (cl_uint), device_param->kernel_params[25]); + hc_clSetKernelArg (kernel, 26, sizeof (cl_uint), device_param->kernel_params[26]); + hc_clSetKernelArg (kernel, 27, sizeof (cl_uint), device_param->kernel_params[27]); + hc_clSetKernelArg (kernel, 28, sizeof (cl_uint), device_param->kernel_params[28]); + hc_clSetKernelArg (kernel, 29, sizeof (cl_uint), device_param->kernel_params[29]); + hc_clSetKernelArg (kernel, 30, sizeof (cl_uint), device_param->kernel_params[30]); + hc_clSetKernelArg (kernel, 31, sizeof (cl_uint), device_param->kernel_params[31]); + + if ((data.opts_type & OPTS_TYPE_PT_BITSLICE) && (data.attack_mode == ATTACK_MODE_BF)) + { + const size_t global_work_size[3] = { num_elements, 32, 1 }; + const size_t local_work_size[3] = { gpu_threads / 32, 32, 1 }; + + hc_clEnqueueNDRangeKernel (device_param->command_queue, kernel, 2, NULL, global_work_size, local_work_size, 0, NULL, NULL); + } + else + { + const size_t global_work_size[3] = { num_elements, 1, 1 }; + const size_t local_work_size[3] = { gpu_threads, 1, 1 }; + + hc_clEnqueueNDRangeKernel (device_param->command_queue, kernel, 1, NULL, global_work_size, local_work_size, 0, NULL, NULL); + } + + hc_clFlush (device_param->command_queue); + + hc_clFinish (device_param->command_queue); + + #endif +} + +static void run_kernel_mp (const uint kern_run, hc_device_param_t *device_param, const uint num) +{ + // uint gpu_vector_width = device_param->gpu_vector_width; + + // uint num_elements = mydivc32 (num, gpu_vector_width); + + uint num_elements = num; + + switch (kern_run) + { + case KERN_RUN_MP: device_param->kernel_params_mp_buf32[8] = num; break; + case KERN_RUN_MP_R: device_param->kernel_params_mp_r_buf32[8] = num; break; + case KERN_RUN_MP_L: device_param->kernel_params_mp_l_buf32[9] = num; break; + } + + // causes problems with special threads like in bcrypt + // const uint gpu_threads = device_param->gpu_threads; + + #ifdef _CUDA + + const uint gpu_threads = GPU_THREADS_NV; + + while (num_elements % gpu_threads) num_elements++; + + CUfunction function = NULL; + + switch (kern_run) + { + case KERN_RUN_MP: function = device_param->function_mp; break; + case KERN_RUN_MP_R: function = device_param->function_mp_r; break; + case KERN_RUN_MP_L: function = device_param->function_mp_l; break; + } + + void **kernel_params = NULL; + + switch (kern_run) + { + case KERN_RUN_MP: kernel_params = device_param->kernel_params_mp; break; + case KERN_RUN_MP_R: kernel_params = device_param->kernel_params_mp_r; break; + case KERN_RUN_MP_L: kernel_params = device_param->kernel_params_mp_l; break; + } + + num_elements /= gpu_threads; + + hc_cuCtxPushCurrent (device_param->context); + + hc_cuLaunchKernel (function, num_elements, 1, 1, gpu_threads, 1, 1, 0, device_param->stream, kernel_params, NULL); + + hc_cuStreamSynchronize (device_param->stream); + + hc_cuCtxPopCurrent (&device_param->context); + + #elif _OCL + + const uint gpu_threads = GPU_THREADS_AMD; + + while (num_elements % gpu_threads) num_elements++; + + cl_kernel kernel = NULL; + + switch (kern_run) + { + case KERN_RUN_MP: kernel = device_param->kernel_mp; break; + case KERN_RUN_MP_R: kernel = device_param->kernel_mp_r; break; + case KERN_RUN_MP_L: kernel = device_param->kernel_mp_l; break; + } + + switch (kern_run) + { + case KERN_RUN_MP: hc_clSetKernelArg (kernel, 3, sizeof (cl_ulong), device_param->kernel_params_mp[3]); + hc_clSetKernelArg (kernel, 4, sizeof (cl_uint), device_param->kernel_params_mp[4]); + hc_clSetKernelArg (kernel, 5, sizeof (cl_uint), device_param->kernel_params_mp[5]); + hc_clSetKernelArg (kernel, 6, sizeof (cl_uint), device_param->kernel_params_mp[6]); + hc_clSetKernelArg (kernel, 7, sizeof (cl_uint), device_param->kernel_params_mp[7]); + hc_clSetKernelArg (kernel, 8, sizeof (cl_uint), device_param->kernel_params_mp[8]); + break; + case KERN_RUN_MP_R: hc_clSetKernelArg (kernel, 3, sizeof (cl_ulong), device_param->kernel_params_mp_r[3]); + hc_clSetKernelArg (kernel, 4, sizeof (cl_uint), device_param->kernel_params_mp_r[4]); + hc_clSetKernelArg (kernel, 5, sizeof (cl_uint), device_param->kernel_params_mp_r[5]); + hc_clSetKernelArg (kernel, 6, sizeof (cl_uint), device_param->kernel_params_mp_r[6]); + hc_clSetKernelArg (kernel, 7, sizeof (cl_uint), device_param->kernel_params_mp_r[7]); + hc_clSetKernelArg (kernel, 8, sizeof (cl_uint), device_param->kernel_params_mp_r[8]); + break; + case KERN_RUN_MP_L: hc_clSetKernelArg (kernel, 3, sizeof (cl_ulong), device_param->kernel_params_mp_l[3]); + hc_clSetKernelArg (kernel, 4, sizeof (cl_uint), device_param->kernel_params_mp_l[4]); + hc_clSetKernelArg (kernel, 5, sizeof (cl_uint), device_param->kernel_params_mp_l[5]); + hc_clSetKernelArg (kernel, 6, sizeof (cl_uint), device_param->kernel_params_mp_l[6]); + hc_clSetKernelArg (kernel, 7, sizeof (cl_uint), device_param->kernel_params_mp_l[7]); + hc_clSetKernelArg (kernel, 8, sizeof (cl_uint), device_param->kernel_params_mp_l[8]); + hc_clSetKernelArg (kernel, 9, sizeof (cl_uint), device_param->kernel_params_mp_l[9]); + break; + } + + const size_t global_work_size[3] = { num_elements, 1, 1 }; + const size_t local_work_size[3] = { gpu_threads, 1, 1 }; + + hc_clEnqueueNDRangeKernel (device_param->command_queue, kernel, 1, NULL, global_work_size, local_work_size, 0, NULL, NULL); + + hc_clFlush (device_param->command_queue); + + hc_clFinish (device_param->command_queue); + + #endif +} + +static void run_kernel_tb (hc_device_param_t *device_param, const uint num) +{ + uint num_elements = num; + + uint gpu_threads = device_param->gpu_threads; + + while (num_elements % gpu_threads) num_elements++; + + #ifdef _CUDA + + CUfunction function = device_param->function_tb; + + void **kernel_params = device_param->kernel_params_tb; + + hc_cuCtxPushCurrent (device_param->context); + + hc_cuLaunchKernel (function, num_elements / gpu_threads, 1, 1, gpu_threads, 1, 1, 0, device_param->stream, kernel_params, NULL); + + hc_cuStreamSynchronize (device_param->stream); + + hc_cuCtxPopCurrent (&device_param->context); + + #elif _OCL + + cl_kernel kernel = device_param->kernel_tb; + + const size_t global_work_size[3] = { num_elements, 1, 1 }; + const size_t local_work_size[3] = { gpu_threads, 1, 1 }; + + hc_clEnqueueNDRangeKernel (device_param->command_queue, kernel, 1, NULL, global_work_size, local_work_size, 0, NULL, NULL); + + hc_clFlush (device_param->command_queue); + + hc_clFinish (device_param->command_queue); + + #endif +} + +static void run_kernel_tm (hc_device_param_t *device_param) +{ + const uint num_elements = 1024; // fixed + + const uint gpu_threads = 32; + + #ifdef _CUDA + + CUfunction function = device_param->function_tm; + + void **kernel_params = device_param->kernel_params_tm; + + hc_cuCtxPushCurrent (device_param->context); + + hc_cuLaunchKernel (function, num_elements / gpu_threads, 1, 1, gpu_threads, 1, 1, 0, device_param->stream, kernel_params, NULL); + + hc_cuStreamSynchronize (device_param->stream); + + hc_cuCtxPopCurrent (&device_param->context); + + #elif _OCL + + cl_kernel kernel = device_param->kernel_tm; + + const size_t global_work_size[3] = { num_elements, 1, 1 }; + const size_t local_work_size[3] = { gpu_threads, 1, 1 }; + + hc_clEnqueueNDRangeKernel (device_param->command_queue, kernel, 1, NULL, global_work_size, local_work_size, 0, NULL, NULL); + + hc_clFlush (device_param->command_queue); + + hc_clFinish (device_param->command_queue); + + #endif +} + +static void run_kernel_amp (hc_device_param_t *device_param, const uint num) +{ + // uint gpu_vector_width = device_param->gpu_vector_width; + + // uint num_elements = mydivc32 (num, gpu_vector_width); + + uint num_elements = num; + + device_param->kernel_params_amp_buf32[5] = data.combs_mode; + device_param->kernel_params_amp_buf32[6] = num_elements; + + // causes problems with special threads like in bcrypt + // const uint gpu_threads = device_param->gpu_threads; + + #ifdef _CUDA + + const uint gpu_threads = GPU_THREADS_NV; + + while (num_elements % gpu_threads) num_elements++; + + CUfunction function = device_param->function_amp; + + void **kernel_params = device_param->kernel_params_amp; + + num_elements /= gpu_threads; + + hc_cuCtxPushCurrent (device_param->context); + + hc_cuLaunchKernel (function, num_elements, 1, 1, gpu_threads, 1, 1, 0, device_param->stream, kernel_params, NULL); + + hc_cuStreamSynchronize (device_param->stream); + + hc_cuCtxPopCurrent (&device_param->context); + + #elif _OCL + + const uint gpu_threads = GPU_THREADS_AMD; + + while (num_elements % gpu_threads) num_elements++; + + cl_kernel kernel = device_param->kernel_amp; + + hc_clSetKernelArg (kernel, 5, sizeof (cl_uint), device_param->kernel_params_amp[5]); + hc_clSetKernelArg (kernel, 6, sizeof (cl_uint), device_param->kernel_params_amp[6]); + + const size_t global_work_size[3] = { num_elements, 1, 1 }; + const size_t local_work_size[3] = { gpu_threads, 1, 1 }; + + hc_clEnqueueNDRangeKernel (device_param->command_queue, kernel, 1, NULL, global_work_size, local_work_size, 0, NULL, NULL); + + hc_clFlush (device_param->command_queue); + + hc_clFinish (device_param->command_queue); + + #endif +} + +#ifdef _OCL +static void run_kernel_bzero (hc_device_param_t *device_param, cl_mem buf, const uint size) +{ + const cl_uchar zero = 0; + + hc_clEnqueueFillBuffer (device_param->command_queue, buf, &zero, sizeof (cl_uchar), 0, size, 0, NULL, NULL); +} +#elif _CUDA +static void run_kernel_bzero (hc_device_param_t *device_param, CUdeviceptr buf, const uint size) +{ + hc_cuCtxPushCurrent (device_param->context); + + hc_cuMemsetD8 (buf, 0, size); + + hc_cuCtxPopCurrent (&device_param->context); +} +#endif + +static int run_rule_engine (const int rule_len, const char *rule_buf) +{ + if (rule_len == 0) + { + return 0; + } + else if (rule_len == 1) + { + if (rule_buf[0] == RULE_OP_MANGLE_NOOP) return 0; + } + + return 1; +} + +static void run_copy (hc_device_param_t *device_param, const uint pws_cnt) +{ + #ifdef _CUDA + hc_cuCtxPushCurrent (device_param->context); + #endif + + // clear some leftovers from previous run (maskfiles, etc) + + #ifdef _CUDA + hc_cuMemsetD8 (device_param->c_bfs, 0, device_param->c_bytes); + #endif + + if (data.attack_kern == ATTACK_KERN_STRAIGHT) + { + #ifdef _CUDA + hc_cuMemcpyHtoD (device_param->d_pws_buf, device_param->pws_buf, pws_cnt * sizeof (pw_t)); + #elif _OCL + hc_clEnqueueWriteBuffer (device_param->command_queue, device_param->d_pws_buf, CL_TRUE, 0, pws_cnt * sizeof (pw_t), device_param->pws_buf, 0, NULL, NULL); + #endif + } + else if (data.attack_kern == ATTACK_KERN_COMBI) + { + #ifdef _CUDA + hc_cuMemcpyHtoD (device_param->d_pws_buf, device_param->pws_buf, pws_cnt * sizeof (pw_t)); + #elif _OCL + hc_clEnqueueWriteBuffer (device_param->command_queue, device_param->d_pws_buf, CL_TRUE, 0, pws_cnt * sizeof (pw_t), device_param->pws_buf, 0, NULL, NULL); + #endif + } + else if (data.attack_kern == ATTACK_KERN_BF) + { + const uint64_t off = device_param->words_off; + + device_param->kernel_params_mp_l_buf64[3] = off; + + run_kernel_mp (KERN_RUN_MP_L, device_param, pws_cnt); + } + + #ifdef _CUDA + hc_cuCtxPopCurrent (&device_param->context); + #endif +} + +static void run_cracker (hc_device_param_t *device_param, const uint pw_cnt, const uint pws_cnt) +{ + const uint gpu_loops = data.gpu_loops; + + // init speed timer + + uint speed_pos = device_param->speed_pos; + + #ifdef _POSIX + if (device_param->timer_speed.tv_sec == 0) + { + hc_timer_set (&device_param->timer_speed); + } + #endif + + #ifdef _WIN + if (device_param->timer_speed.QuadPart == 0) + { + hc_timer_set (&device_param->timer_speed); + } + #endif + + // find higest password length, this is for optimization stuff + + uint highest_pw_len = 0; + + if (data.attack_kern == ATTACK_KERN_STRAIGHT) + { + } + else if (data.attack_kern == ATTACK_KERN_COMBI) + { + } + else if (data.attack_kern == ATTACK_KERN_BF) + { + highest_pw_len = device_param->kernel_params_mp_l_buf32[4] + + device_param->kernel_params_mp_l_buf32[5]; + } + + // bitslice optimization stuff + + if (data.attack_mode == ATTACK_MODE_BF) + { + if (data.opts_type & OPTS_TYPE_PT_BITSLICE) + { + run_kernel_tb (device_param, pws_cnt); + } + } + + // iteration type + + uint innerloop_step = 0; + uint innerloop_cnt = 0; + + if (data.attack_exec == ATTACK_EXEC_ON_GPU) innerloop_step = gpu_loops; + else innerloop_step = 1; + + if (data.attack_kern == ATTACK_KERN_STRAIGHT) innerloop_cnt = data.gpu_rules_cnt; + else if (data.attack_kern == ATTACK_KERN_COMBI) innerloop_cnt = data.combs_cnt; + else if (data.attack_kern == ATTACK_KERN_BF) innerloop_cnt = data.bfs_cnt; + + // loop start: most outer loop = salt iteration, then innerloops (if multi) + + for (uint salt_pos = 0; salt_pos < data.salts_cnt; salt_pos++) + { + while (data.devices_status == STATUS_PAUSED) hc_sleep (1); + + if (data.devices_status == STATUS_CRACKED) break; + if (data.devices_status == STATUS_ABORTED) break; + if (data.devices_status == STATUS_QUIT) break; + if (data.devices_status == STATUS_BYPASS) break; + + if (data.salts_shown[salt_pos] == 1) continue; + + salt_t *salt_buf = &data.salts_buf[salt_pos]; + + device_param->kernel_params_buf32[24] = salt_pos; + device_param->kernel_params_buf32[28] = salt_buf->digests_cnt; + device_param->kernel_params_buf32[29] = salt_buf->digests_offset; + + FILE *combs_fp = device_param->combs_fp; + + if (data.attack_mode == ATTACK_MODE_COMBI) + { + rewind (combs_fp); + } + + // innerloops + + for (uint innerloop_pos = 0; innerloop_pos < innerloop_cnt; innerloop_pos += innerloop_step) + { + while (data.devices_status == STATUS_PAUSED) hc_sleep (1); + + if (data.devices_status == STATUS_CRACKED) break; + if (data.devices_status == STATUS_ABORTED) break; + if (data.devices_status == STATUS_QUIT) break; + if (data.devices_status == STATUS_BYPASS) break; + + uint innerloop_left = innerloop_cnt - innerloop_pos; + + if (innerloop_left > innerloop_step) innerloop_left = innerloop_step; + + device_param->innerloop_pos = innerloop_pos; + device_param->innerloop_left = innerloop_left; + + device_param->kernel_params_buf32[27] = innerloop_left; + + if (innerloop_left == 0) continue; + + // initialize amplifiers + + if (data.attack_mode == ATTACK_MODE_COMBI) + { + char line_buf[BUFSIZ]; + + uint i = 0; + + while (i < innerloop_left) + { + if (feof (combs_fp)) break; + + int line_len = fgetl (combs_fp, line_buf); + + if (line_len >= PW_MAX1) continue; + + line_len = convert_from_hex (line_buf, line_len); + + char *line_buf_new = line_buf; + + if (run_rule_engine (data.rule_len_r, data.rule_buf_r)) + { + char rule_buf_out[BLOCK_SIZE]; + + memset (rule_buf_out, 0, sizeof (rule_buf_out)); + + int rule_len_out = _old_apply_rule (data.rule_buf_r, data.rule_len_r, line_buf, line_len, rule_buf_out); + + if (rule_len_out < 0) + { + data.words_progress_rejected[salt_pos] += pw_cnt; + + continue; + } + + line_len = rule_len_out; + + line_buf_new = rule_buf_out; + } + + line_len = MIN (line_len, PW_DICTMAX); + + char *ptr = (char *) device_param->combs_buf[i].i; + + memcpy (ptr, line_buf_new, line_len); + + memset (ptr + line_len, 0, PW_DICTMAX1 - line_len); + + if (data.opts_type & OPTS_TYPE_PT_UPPER) + { + uppercase (ptr, line_len); + } + + if (data.combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + if (data.opts_type & OPTS_TYPE_PT_ADD80) + { + ptr[line_len] = 0x80; + } + + if (data.opts_type & OPTS_TYPE_PT_ADD01) + { + ptr[line_len] = 0x01; + } + } + + device_param->combs_buf[i].pw_len = line_len; + + i++; + } + + for (uint j = i; j < innerloop_left; j++) + { + device_param->combs_buf[j].i[0] = 0; + device_param->combs_buf[j].i[1] = 0; + device_param->combs_buf[j].i[2] = 0; + device_param->combs_buf[j].i[3] = 0; + device_param->combs_buf[j].i[4] = 0; + device_param->combs_buf[j].i[5] = 0; + device_param->combs_buf[j].i[6] = 0; + device_param->combs_buf[j].i[7] = 0; + + device_param->combs_buf[j].pw_len = 0; + } + + innerloop_left = i; + } + else if (data.attack_mode == ATTACK_MODE_BF) + { + uint64_t off = innerloop_pos; + + device_param->kernel_params_mp_r_buf64[3] = off; + + const uint gpu_vector_width = device_param->gpu_vector_width; + + const uint innerloop_left_d = mydivc32 (innerloop_left, gpu_vector_width); + + run_kernel_mp (KERN_RUN_MP_R, device_param, innerloop_left_d); + } + else if (data.attack_mode == ATTACK_MODE_HYBRID1) + { + uint64_t off = innerloop_pos; + + device_param->kernel_params_mp_buf64[3] = off; + + const uint gpu_vector_width = device_param->gpu_vector_width; + + const uint innerloop_left_d = mydivc32 (innerloop_left, gpu_vector_width); + + run_kernel_mp (KERN_RUN_MP, device_param, innerloop_left_d); + } + else if (data.attack_mode == ATTACK_MODE_HYBRID2) + { + uint64_t off = innerloop_pos; + + device_param->kernel_params_mp_buf64[3] = off; + + const uint gpu_vector_width = device_param->gpu_vector_width; + + const uint innerloop_left_d = mydivc32 (innerloop_left, gpu_vector_width); + + run_kernel_mp (KERN_RUN_MP, device_param, innerloop_left_d); + } + + // copy amplifiers + + #ifdef _CUDA + hc_cuCtxPushCurrent (device_param->context); + + if (data.attack_mode == ATTACK_MODE_STRAIGHT) + { + hc_cuMemcpyDtoD (device_param->c_rules, device_param->d_rules + (innerloop_pos * sizeof (gpu_rule_t)), innerloop_left * sizeof (gpu_rule_t)); + } + else if (data.attack_mode == ATTACK_MODE_COMBI) + { + hc_cuMemcpyHtoD (device_param->c_combs, device_param->combs_buf, innerloop_left * sizeof (comb_t)); + } + else if (data.attack_mode == ATTACK_MODE_BF) + { + hc_cuMemcpyDtoD (device_param->c_bfs, device_param->d_bfs, innerloop_left * sizeof (bf_t)); + } + else if (data.attack_mode == ATTACK_MODE_HYBRID1) + { + hc_cuMemcpyDtoD (device_param->c_combs, device_param->d_combs, innerloop_left * sizeof (comb_t)); + } + else if (data.attack_mode == ATTACK_MODE_HYBRID2) + { + hc_cuMemcpyDtoD (device_param->c_combs, device_param->d_combs, innerloop_left * sizeof (comb_t)); + } + + hc_cuCtxPopCurrent (&device_param->context); + + #elif _OCL + if (data.attack_mode == ATTACK_MODE_STRAIGHT) + { + hc_clEnqueueCopyBuffer (device_param->command_queue, device_param->d_rules, device_param->d_rules_c, innerloop_pos * sizeof (gpu_rule_t), 0, innerloop_left * sizeof (gpu_rule_t), 0, NULL, NULL); + } + else if (data.attack_mode == ATTACK_MODE_COMBI) + { + hc_clEnqueueWriteBuffer (device_param->command_queue, device_param->d_combs_c, CL_TRUE, 0, innerloop_left * sizeof (comb_t), device_param->combs_buf, 0, NULL, NULL); + } + else if (data.attack_mode == ATTACK_MODE_BF) + { + hc_clEnqueueCopyBuffer (device_param->command_queue, device_param->d_bfs, device_param->d_bfs_c, 0, 0, innerloop_left * sizeof (bf_t), 0, NULL, NULL); + } + else if (data.attack_mode == ATTACK_MODE_HYBRID1) + { + hc_clEnqueueCopyBuffer (device_param->command_queue, device_param->d_combs, device_param->d_combs_c, 0, 0, innerloop_left * sizeof (comb_t), 0, NULL, NULL); + } + else if (data.attack_mode == ATTACK_MODE_HYBRID2) + { + hc_clEnqueueCopyBuffer (device_param->command_queue, device_param->d_combs, device_param->d_combs_c, 0, 0, innerloop_left * sizeof (comb_t), 0, NULL, NULL); + } + + #endif + + if (data.attack_exec == ATTACK_EXEC_ON_GPU) + { + if (data.attack_mode == ATTACK_MODE_BF) + { + if (data.opts_type & OPTS_TYPE_PT_BITSLICE) + { + const uint size_tm = 32 * sizeof (bs_word_t); + + #ifdef _CUDA + run_kernel_bzero (device_param, device_param->d_tm, size_tm); + #elif _OCL + run_kernel_bzero (device_param, device_param->d_tm_c, size_tm); + #endif + + run_kernel_tm (device_param); + + #ifdef _CUDA + hc_cuCtxPushCurrent (device_param->context); + + hc_cuMemcpyDtoD (device_param->c_tm, device_param->d_tm, size_tm); + + hc_cuCtxPopCurrent (&device_param->context); + #elif _OCL + hc_clEnqueueCopyBuffer (device_param->command_queue, device_param->d_tm_c, device_param->d_bfs_c, 0, 0, size_tm, 0, NULL, NULL); + #endif + } + } + + if (highest_pw_len < 16) + { + run_kernel (KERN_RUN_1, device_param, pws_cnt); + } + else if (highest_pw_len < 32) + { + run_kernel (KERN_RUN_2, device_param, pws_cnt); + } + else + { + run_kernel (KERN_RUN_3, device_param, pws_cnt); + } + } + else + { + run_kernel_amp (device_param, pws_cnt); + + run_kernel (KERN_RUN_1, device_param, pws_cnt); + + if (data.opts_type & OPTS_TYPE_HOOK12) + { + run_kernel (KERN_RUN_12, device_param, pws_cnt); + } + + uint iter = salt_buf->salt_iter; + + for (uint loop_pos = 0; loop_pos < iter; loop_pos += gpu_loops) + { + uint loop_left = iter - loop_pos; + + loop_left = MIN (loop_left, gpu_loops); + + device_param->kernel_params_buf32[25] = loop_pos; + device_param->kernel_params_buf32[26] = loop_left; + + run_kernel (KERN_RUN_2, device_param, pws_cnt); + + if (data.devices_status == STATUS_CRACKED) break; + if (data.devices_status == STATUS_ABORTED) break; + if (data.devices_status == STATUS_QUIT) break; + } + + if (data.opts_type & OPTS_TYPE_HOOK23) + { + run_kernel (KERN_RUN_23, device_param, pws_cnt); + + #ifdef _CUDA + hc_cuCtxPushCurrent (device_param->context); + + hc_cuMemcpyDtoH (device_param->hooks_buf, device_param->d_hooks, device_param->size_hooks); + + hc_cuCtxPopCurrent (&device_param->context); + #elif _OCL + hc_clEnqueueReadBuffer (device_param->command_queue, device_param->d_hooks, CL_TRUE, 0, device_param->size_hooks, device_param->hooks_buf, 0, NULL, NULL); + #endif + + // do something with data + + + #ifdef _CUDA + hc_cuCtxPushCurrent (device_param->context); + + hc_cuMemcpyHtoD (device_param->d_hooks, device_param->hooks_buf, device_param->size_hooks); + + hc_cuCtxPopCurrent (&device_param->context); + #elif _OCL + hc_clEnqueueWriteBuffer (device_param->command_queue, device_param->d_hooks, CL_TRUE, 0, device_param->size_hooks, device_param->hooks_buf, 0, NULL, NULL); + #endif + } + + run_kernel (KERN_RUN_3, device_param, pws_cnt); + } + + if (data.devices_status == STATUS_CRACKED) break; + if (data.devices_status == STATUS_ABORTED) break; + if (data.devices_status == STATUS_QUIT) break; + + /** + * result + */ + + hc_thread_mutex_lock (mux_display); + + check_cracked (device_param, salt_pos); + + hc_thread_mutex_unlock (mux_display); + + /** + * progress + */ + + uint64_t perf_sum_all = (uint64_t) pw_cnt * (uint64_t) innerloop_left; + + hc_thread_mutex_lock (mux_counter); + + data.words_progress_done[salt_pos] += perf_sum_all; + + hc_thread_mutex_unlock (mux_counter); + + /** + * speed + */ + + float speed_ms; + + hc_timer_get (device_param->timer_speed, speed_ms); + + hc_timer_set (&device_param->timer_speed); + + hc_thread_mutex_lock (mux_display); + + device_param->speed_cnt[speed_pos] = perf_sum_all; + + device_param->speed_ms[speed_pos] = speed_ms; + + device_param->speed_rec[speed_pos] = device_param->timer_speed; + + hc_thread_mutex_unlock (mux_display); + + speed_pos++; + + if (speed_pos == SPEED_CACHE) + { + speed_pos = 0; + } + } + } + + device_param->speed_pos = speed_pos; +} + +static void load_segment (wl_data_t *wl_data, FILE *fd) +{ + // NOTE: use (never changing) ->incr here instead of ->avail otherwise the buffer gets bigger and bigger + + wl_data->pos = 0; + + wl_data->cnt = fread (wl_data->buf, 1, wl_data->incr - 1000, fd); + + wl_data->buf[wl_data->cnt] = 0; + + if (wl_data->cnt == 0) return; + + if (wl_data->buf[wl_data->cnt - 1] == '\n') return; + + while (!feof (fd)) + { + if (wl_data->cnt == wl_data->avail) + { + wl_data->buf = (char *) myrealloc (wl_data->buf, wl_data->avail, wl_data->incr); + + wl_data->avail += wl_data->incr; + } + + const int c = fgetc (fd); + + if (c == EOF) break; + + wl_data->buf[wl_data->cnt] = (char) c; + + wl_data->cnt++; + + if (c == '\n') break; + } + + // ensure stream ends with a newline + + if (wl_data->buf[wl_data->cnt - 1] != '\n') + { + wl_data->cnt++; + + wl_data->buf[wl_data->cnt - 1] = '\n'; + } + + return; +} + +static void get_next_word_lm (char *buf, uint32_t sz, uint32_t *len, uint32_t *off) +{ + char *ptr = buf; + + for (uint32_t i = 0; i < sz; i++, ptr++) + { + if (*ptr >= 'a' && *ptr <= 'z') *ptr -= 0x20; + + if (i == 7) + { + *off = i; + *len = i; + + return; + } + + if (*ptr != '\n') continue; + + *off = i + 1; + + if ((i > 0) && (buf[i - 1] == '\r')) i--; + + *len = i; + + return; + } + + *off = sz; + *len = sz; +} + +static void get_next_word_uc (char *buf, uint32_t sz, uint32_t *len, uint32_t *off) +{ + char *ptr = buf; + + for (uint32_t i = 0; i < sz; i++, ptr++) + { + if (*ptr >= 'a' && *ptr <= 'z') *ptr -= 0x20; + + if (*ptr != '\n') continue; + + *off = i + 1; + + if ((i > 0) && (buf[i - 1] == '\r')) i--; + + *len = i; + + return; + } + + *off = sz; + *len = sz; +} + +static void get_next_word_std (char *buf, uint32_t sz, uint32_t *len, uint32_t *off) +{ + char *ptr = buf; + + for (uint32_t i = 0; i < sz; i++, ptr++) + { + if (*ptr != '\n') continue; + + *off = i + 1; + + if ((i > 0) && (buf[i - 1] == '\r')) i--; + + *len = i; + + return; + } + + *off = sz; + *len = sz; +} + +static void get_next_word (wl_data_t *wl_data, FILE *fd, char **out_buf, uint *out_len) +{ + while (wl_data->pos < wl_data->cnt) + { + uint off; + uint len; + + char *ptr = wl_data->buf + wl_data->pos; + + get_next_word_func (ptr, wl_data->cnt - wl_data->pos, &len, &off); + + wl_data->pos += off; + + if (run_rule_engine (data.rule_len_l, data.rule_buf_l)) + { + char rule_buf_out[BLOCK_SIZE]; + + memset (rule_buf_out, 0, sizeof (rule_buf_out)); + + int rule_len_out = -1; + + if (len < BLOCK_SIZE) + { + rule_len_out = _old_apply_rule (data.rule_buf_l, data.rule_len_l, ptr, len, rule_buf_out); + } + + if (rule_len_out < 0) + { + continue; + } + + if (rule_len_out > PW_MAX) + { + continue; + } + } + else + { + if (len > PW_MAX) + { + continue; + } + } + + *out_buf = ptr; + *out_len = len; + + return; + } + + if (feof (fd)) + { + fprintf (stderr, "bug!!\n"); + + return; + } + + load_segment (wl_data, fd); + + get_next_word (wl_data, fd, out_buf, out_len); +} + +#ifdef _POSIX +static uint64_t count_words (wl_data_t *wl_data, FILE *fd, char *dictfile, dictstat_t *dictstat_base, size_t *dictstat_nmemb) +#endif + +#ifdef _WIN +static uint64_t count_words (wl_data_t *wl_data, FILE *fd, char *dictfile, dictstat_t *dictstat_base, uint *dictstat_nmemb) +#endif +{ + hc_signal (NULL); + + dictstat_t d; + + d.cnt = 0; + + #ifdef _POSIX + fstat (fileno (fd), &d.stat); + #endif + + #ifdef _WIN + _fstat64 (fileno (fd), &d.stat); + #endif + + d.stat.st_mode = 0; + d.stat.st_nlink = 0; + d.stat.st_uid = 0; + d.stat.st_gid = 0; + d.stat.st_rdev = 0; + d.stat.st_atime = 0; + + #ifdef _POSIX + d.stat.st_blksize = 0; + d.stat.st_blocks = 0; + #endif + + if (d.stat.st_size == 0) return 0; + + dictstat_t *d_cache = (dictstat_t *) lfind (&d, dictstat_base, dictstat_nmemb, sizeof (dictstat_t), sort_by_dictstat); + + if (run_rule_engine (data.rule_len_l, data.rule_buf_l) == 0) + { + if (d_cache) + { + uint64_t cnt = d_cache->cnt; + + uint64_t keyspace = cnt; + + if (data.attack_kern == ATTACK_KERN_STRAIGHT) + { + keyspace *= data.gpu_rules_cnt; + } + else if (data.attack_kern == ATTACK_KERN_COMBI) + { + keyspace *= data.combs_cnt; + } + + if (data.quiet == 0) log_info ("Cache-hit dictionary stats %s: %llu bytes, %llu words, %llu keyspace", dictfile, (unsigned long long int) d.stat.st_size, (unsigned long long int) cnt, (unsigned long long int) keyspace); + if (data.quiet == 0) log_info (""); + + hc_signal (sigHandler_default); + + return (keyspace); + } + } + + time_t now = 0; + time_t prev = 0; + + uint64_t comp = 0; + uint64_t cnt = 0; + uint64_t cnt2 = 0; + + while (!feof (fd)) + { + load_segment (wl_data, fd); + + comp += wl_data->cnt; + + uint32_t i = 0; + + while (i < wl_data->cnt) + { + uint32_t len; + uint32_t off; + + get_next_word_func (wl_data->buf + i, wl_data->cnt - i, &len, &off); + + if (run_rule_engine (data.rule_len_l, data.rule_buf_l)) + { + char rule_buf_out[BLOCK_SIZE]; + + memset (rule_buf_out, 0, sizeof (rule_buf_out)); + + int rule_len_out = -1; + + if (len < BLOCK_SIZE) + { + rule_len_out = _old_apply_rule (data.rule_buf_l, data.rule_len_l, wl_data->buf + i, len, rule_buf_out); + } + + if (rule_len_out < 0) + { + len = PW_MAX1; + } + else + { + len = rule_len_out; + } + } + + if (len < PW_MAX1) + { + if (data.attack_kern == ATTACK_KERN_STRAIGHT) + { + cnt += data.gpu_rules_cnt; + } + else if (data.attack_kern == ATTACK_KERN_COMBI) + { + cnt += data.combs_cnt; + } + + d.cnt++; + } + + i += off; + + cnt2++; + } + + time (&now); + + if ((now - prev) == 0) continue; + + float percent = (float) comp / (float) d.stat.st_size; + + if (data.quiet == 0) log_info_nn ("Generating dictionary stats for %s: %llu bytes (%.2f%%), %llu words, %llu keyspace", dictfile, (unsigned long long int) comp, percent * 100, (unsigned long long int) cnt2, (unsigned long long int) cnt); + + time (&prev); + } + + if (data.quiet == 0) log_info ("Generated dictionary stats for %s: %llu bytes, %llu words, %llu keyspace", dictfile, (unsigned long long int) comp, (unsigned long long int) cnt2, (unsigned long long int) cnt); + if (data.quiet == 0) log_info (""); + + lsearch (&d, dictstat_base, dictstat_nmemb, sizeof (dictstat_t), sort_by_dictstat); + + hc_signal (sigHandler_default); + + return (cnt); +} + +static uint get_gpu_vector_width (const uint hash_mode, const uint attack_mode, const uint attack_exec, const uint opti_type, const uint vliw) +{ + uint gpu_vector_width = 0; + + if ((attack_mode == ATTACK_MODE_BF) && (attack_exec == ATTACK_EXEC_ON_GPU) && (opti_type & OPTI_TYPE_SCALAR_MODE)) + { + return VECT_SIZE_1; + } + + #ifdef _CUDA + if ((attack_mode == ATTACK_MODE_STRAIGHT) && (attack_exec == ATTACK_EXEC_ON_GPU)) + { + return VECT_SIZE_1; + } + + if (vliw == 1) + { + switch (hash_mode) + { + default: gpu_vector_width = VECT_SIZE_1; break; + } + } + else if (vliw == 2) + { + switch (hash_mode) + { + case 0: gpu_vector_width = VECT_SIZE_4; break; + case 10: gpu_vector_width = VECT_SIZE_4; break; + case 11: gpu_vector_width = VECT_SIZE_4; break; + case 12: gpu_vector_width = VECT_SIZE_4; break; + case 20: gpu_vector_width = VECT_SIZE_4; break; + case 21: gpu_vector_width = VECT_SIZE_4; break; + case 22: gpu_vector_width = VECT_SIZE_4; break; + case 23: gpu_vector_width = VECT_SIZE_4; break; + case 30: gpu_vector_width = VECT_SIZE_4; break; + case 40: gpu_vector_width = VECT_SIZE_4; break; + case 50: gpu_vector_width = VECT_SIZE_4; break; + case 60: gpu_vector_width = VECT_SIZE_4; break; + case 100: gpu_vector_width = VECT_SIZE_4; break; + case 101: gpu_vector_width = VECT_SIZE_4; break; + case 110: gpu_vector_width = VECT_SIZE_4; break; + case 111: gpu_vector_width = VECT_SIZE_4; break; + case 112: gpu_vector_width = VECT_SIZE_4; break; + case 120: gpu_vector_width = VECT_SIZE_4; break; + case 121: gpu_vector_width = VECT_SIZE_4; break; + case 122: gpu_vector_width = VECT_SIZE_4; break; + case 124: gpu_vector_width = VECT_SIZE_4; break; + case 130: gpu_vector_width = VECT_SIZE_4; break; + case 131: gpu_vector_width = VECT_SIZE_4; break; + case 132: gpu_vector_width = VECT_SIZE_4; break; + case 133: gpu_vector_width = VECT_SIZE_4; break; + case 140: gpu_vector_width = VECT_SIZE_4; break; + case 141: gpu_vector_width = VECT_SIZE_4; break; + case 150: gpu_vector_width = VECT_SIZE_4; break; + case 160: gpu_vector_width = VECT_SIZE_4; break; + case 190: gpu_vector_width = VECT_SIZE_4; break; + case 200: gpu_vector_width = VECT_SIZE_4; break; + case 400: gpu_vector_width = VECT_SIZE_2; break; + case 500: gpu_vector_width = VECT_SIZE_2; break; + case 501: gpu_vector_width = VECT_SIZE_2; break; + case 900: gpu_vector_width = VECT_SIZE_4; break; + case 1000: gpu_vector_width = VECT_SIZE_4; break; + case 1100: gpu_vector_width = VECT_SIZE_4; break; + case 2400: gpu_vector_width = VECT_SIZE_4; break; + case 2410: gpu_vector_width = VECT_SIZE_4; break; + case 2600: gpu_vector_width = VECT_SIZE_4; break; + case 2611: gpu_vector_width = VECT_SIZE_4; break; + case 2612: gpu_vector_width = VECT_SIZE_4; break; + case 2711: gpu_vector_width = VECT_SIZE_4; break; + case 2811: gpu_vector_width = VECT_SIZE_4; break; + case 3710: gpu_vector_width = VECT_SIZE_4; break; + case 3800: gpu_vector_width = VECT_SIZE_4; break; + case 3711: gpu_vector_width = VECT_SIZE_4; break; + case 4300: gpu_vector_width = VECT_SIZE_4; break; + case 4800: gpu_vector_width = VECT_SIZE_4; break; + case 4900: gpu_vector_width = VECT_SIZE_4; break; + case 5100: gpu_vector_width = VECT_SIZE_4; break; + case 9900: gpu_vector_width = VECT_SIZE_4; break; + case 10200: gpu_vector_width = VECT_SIZE_4; break; + case 11000: gpu_vector_width = VECT_SIZE_4; break; + case 11500: gpu_vector_width = VECT_SIZE_4; break; + + default: gpu_vector_width = VECT_SIZE_1; break; + } + } + #endif + + #ifdef _OCL + if (vliw == 1) + { + switch (hash_mode) + { + default: gpu_vector_width = VECT_SIZE_1; break; + } + } + else if (vliw == 4) + { + switch (hash_mode) + { + case 150: gpu_vector_width = VECT_SIZE_2; break; + case 160: gpu_vector_width = VECT_SIZE_2; break; + case 300: gpu_vector_width = VECT_SIZE_2; break; + case 1400: gpu_vector_width = VECT_SIZE_2; break; + case 1410: gpu_vector_width = VECT_SIZE_2; break; + case 1420: gpu_vector_width = VECT_SIZE_2; break; + case 1421: gpu_vector_width = VECT_SIZE_2; break; + case 1430: gpu_vector_width = VECT_SIZE_2; break; + case 1440: gpu_vector_width = VECT_SIZE_2; break; + case 1441: gpu_vector_width = VECT_SIZE_2; break; + case 1450: gpu_vector_width = VECT_SIZE_1; break; + case 1460: gpu_vector_width = VECT_SIZE_2; break; + case 1500: gpu_vector_width = VECT_SIZE_1; break; + case 1700: gpu_vector_width = VECT_SIZE_1; break; + case 1710: gpu_vector_width = VECT_SIZE_1; break; + case 1711: gpu_vector_width = VECT_SIZE_1; break; + case 1720: gpu_vector_width = VECT_SIZE_1; break; + case 1722: gpu_vector_width = VECT_SIZE_1; break; + case 1730: gpu_vector_width = VECT_SIZE_1; break; + case 1731: gpu_vector_width = VECT_SIZE_1; break; + case 1740: gpu_vector_width = VECT_SIZE_1; break; + case 1750: gpu_vector_width = VECT_SIZE_1; break; + case 1760: gpu_vector_width = VECT_SIZE_1; break; + case 1800: gpu_vector_width = VECT_SIZE_1; break; + case 2100: gpu_vector_width = VECT_SIZE_2; break; + case 2500: gpu_vector_width = VECT_SIZE_2; break; + case 3000: gpu_vector_width = VECT_SIZE_1; break; + case 3100: gpu_vector_width = VECT_SIZE_2; break; + case 3200: gpu_vector_width = VECT_SIZE_1; break; + case 5000: gpu_vector_width = VECT_SIZE_1; break; + case 5200: gpu_vector_width = VECT_SIZE_2; break; + case 5600: gpu_vector_width = VECT_SIZE_2; break; + case 5700: gpu_vector_width = VECT_SIZE_2; break; + case 6100: gpu_vector_width = VECT_SIZE_2; break; + case 6211: + case 6212: + case 6213: + case 6221: + case 6222: + case 6223: + case 6231: + case 6232: + case 6233: + case 6241: + case 6242: + case 6243: gpu_vector_width = VECT_SIZE_1; break; + case 6400: gpu_vector_width = VECT_SIZE_1; break; + case 6500: gpu_vector_width = VECT_SIZE_1; break; + case 6600: gpu_vector_width = VECT_SIZE_1; break; + case 6700: gpu_vector_width = VECT_SIZE_2; break; + case 6800: gpu_vector_width = VECT_SIZE_1; break; + case 6900: gpu_vector_width = VECT_SIZE_1; break; + case 7100: gpu_vector_width = VECT_SIZE_1; break; + case 7200: gpu_vector_width = VECT_SIZE_1; break; + case 7300: gpu_vector_width = VECT_SIZE_1; break; + case 7400: gpu_vector_width = VECT_SIZE_1; break; + case 7500: gpu_vector_width = VECT_SIZE_1; break; + case 7700: gpu_vector_width = VECT_SIZE_1; break; + case 7800: gpu_vector_width = VECT_SIZE_1; break; + case 7900: gpu_vector_width = VECT_SIZE_1; break; + case 8000: gpu_vector_width = VECT_SIZE_2; break; + case 8200: gpu_vector_width = VECT_SIZE_1; break; + case 8500: gpu_vector_width = VECT_SIZE_2; break; + case 8700: gpu_vector_width = VECT_SIZE_2; break; + case 8800: gpu_vector_width = VECT_SIZE_1; break; + case 8900: gpu_vector_width = VECT_SIZE_1; break; + case 9000: gpu_vector_width = VECT_SIZE_1; break; + case 9100: gpu_vector_width = VECT_SIZE_1; break; + case 9200: gpu_vector_width = VECT_SIZE_1; break; + case 9300: gpu_vector_width = VECT_SIZE_1; break; + case 9400: gpu_vector_width = VECT_SIZE_1; break; + case 9500: gpu_vector_width = VECT_SIZE_1; break; + case 9600: gpu_vector_width = VECT_SIZE_1; break; + case 9700: gpu_vector_width = VECT_SIZE_1; break; + case 9710: gpu_vector_width = VECT_SIZE_1; break; + case 9720: gpu_vector_width = VECT_SIZE_2; break; + case 9800: gpu_vector_width = VECT_SIZE_1; break; + case 9810: gpu_vector_width = VECT_SIZE_1; break; + case 9820: gpu_vector_width = VECT_SIZE_2; break; + case 10000: gpu_vector_width = VECT_SIZE_1; break; + case 10100: gpu_vector_width = VECT_SIZE_1; break; + case 10400: gpu_vector_width = VECT_SIZE_1; break; + case 10410: gpu_vector_width = VECT_SIZE_1; break; + case 10420: gpu_vector_width = VECT_SIZE_2; break; + case 10500: gpu_vector_width = VECT_SIZE_1; break; + case 10600: gpu_vector_width = VECT_SIZE_2; break; + case 10700: gpu_vector_width = VECT_SIZE_1; break; + case 10800: gpu_vector_width = VECT_SIZE_1; break; + case 10900: gpu_vector_width = VECT_SIZE_1; break; + case 11100: gpu_vector_width = VECT_SIZE_2; break; + case 11200: gpu_vector_width = VECT_SIZE_2; break; + case 11300: gpu_vector_width = VECT_SIZE_1; break; + case 11400: gpu_vector_width = VECT_SIZE_1; break; + case 11600: gpu_vector_width = VECT_SIZE_1; break; + case 11700: gpu_vector_width = VECT_SIZE_1; break; + case 11800: gpu_vector_width = VECT_SIZE_1; break; + case 11900: gpu_vector_width = VECT_SIZE_1; break; + case 12000: gpu_vector_width = VECT_SIZE_1; break; + case 12100: gpu_vector_width = VECT_SIZE_1; break; + case 12200: gpu_vector_width = VECT_SIZE_1; break; + case 12300: gpu_vector_width = VECT_SIZE_1; break; + case 12500: gpu_vector_width = VECT_SIZE_1; break; + case 12700: gpu_vector_width = VECT_SIZE_1; break; + case 12800: gpu_vector_width = VECT_SIZE_1; break; + + default: gpu_vector_width = VECT_SIZE_4; break; + } + } + else if (vliw == 5) + { + switch (hash_mode) + { + case 150: gpu_vector_width = VECT_SIZE_2; break; + case 160: gpu_vector_width = VECT_SIZE_2; break; + case 300: gpu_vector_width = VECT_SIZE_2; break; + case 1400: gpu_vector_width = VECT_SIZE_2; break; + case 1410: gpu_vector_width = VECT_SIZE_2; break; + case 1420: gpu_vector_width = VECT_SIZE_2; break; + case 1421: gpu_vector_width = VECT_SIZE_2; break; + case 1430: gpu_vector_width = VECT_SIZE_2; break; + case 1440: gpu_vector_width = VECT_SIZE_2; break; + case 1441: gpu_vector_width = VECT_SIZE_2; break; + case 1450: gpu_vector_width = VECT_SIZE_1; break; + case 1460: gpu_vector_width = VECT_SIZE_2; break; + case 1500: gpu_vector_width = VECT_SIZE_1; break; + case 1700: gpu_vector_width = VECT_SIZE_1; break; + case 1710: gpu_vector_width = VECT_SIZE_1; break; + case 1711: gpu_vector_width = VECT_SIZE_1; break; + case 1720: gpu_vector_width = VECT_SIZE_1; break; + case 1722: gpu_vector_width = VECT_SIZE_1; break; + case 1730: gpu_vector_width = VECT_SIZE_1; break; + case 1731: gpu_vector_width = VECT_SIZE_1; break; + case 1740: gpu_vector_width = VECT_SIZE_1; break; + case 1750: gpu_vector_width = VECT_SIZE_1; break; + case 1760: gpu_vector_width = VECT_SIZE_1; break; + case 1800: gpu_vector_width = VECT_SIZE_1; break; + case 2100: gpu_vector_width = VECT_SIZE_2; break; + case 2500: gpu_vector_width = VECT_SIZE_2; break; + case 3000: gpu_vector_width = VECT_SIZE_1; break; + case 3100: gpu_vector_width = VECT_SIZE_2; break; + case 3200: gpu_vector_width = VECT_SIZE_1; break; + case 5000: gpu_vector_width = VECT_SIZE_1; break; + case 5200: gpu_vector_width = VECT_SIZE_2; break; + case 5400: gpu_vector_width = VECT_SIZE_2; break; + case 5600: gpu_vector_width = VECT_SIZE_2; break; + case 5700: gpu_vector_width = VECT_SIZE_2; break; + case 6100: gpu_vector_width = VECT_SIZE_2; break; + case 6211: + case 6212: + case 6213: + case 6221: + case 6222: + case 6223: + case 6231: + case 6232: + case 6233: + case 6241: + case 6242: + case 6243: gpu_vector_width = VECT_SIZE_1; break; + case 6400: gpu_vector_width = VECT_SIZE_1; break; + case 6500: gpu_vector_width = VECT_SIZE_1; break; + case 6600: gpu_vector_width = VECT_SIZE_1; break; + case 6700: gpu_vector_width = VECT_SIZE_2; break; + case 6800: gpu_vector_width = VECT_SIZE_1; break; + case 6900: gpu_vector_width = VECT_SIZE_1; break; + case 7100: gpu_vector_width = VECT_SIZE_1; break; + case 7200: gpu_vector_width = VECT_SIZE_1; break; + case 7300: gpu_vector_width = VECT_SIZE_1; break; + case 7400: gpu_vector_width = VECT_SIZE_1; break; + case 7500: gpu_vector_width = VECT_SIZE_1; break; + case 7700: gpu_vector_width = VECT_SIZE_1; break; + case 7800: gpu_vector_width = VECT_SIZE_1; break; + case 7900: gpu_vector_width = VECT_SIZE_1; break; + case 8000: gpu_vector_width = VECT_SIZE_2; break; + case 8200: gpu_vector_width = VECT_SIZE_1; break; + case 8300: gpu_vector_width = VECT_SIZE_2; break; + case 8400: gpu_vector_width = VECT_SIZE_2; break; + case 8500: gpu_vector_width = VECT_SIZE_2; break; + case 8700: gpu_vector_width = VECT_SIZE_2; break; + case 8800: gpu_vector_width = VECT_SIZE_1; break; + case 8900: gpu_vector_width = VECT_SIZE_1; break; + case 9000: gpu_vector_width = VECT_SIZE_1; break; + case 9100: gpu_vector_width = VECT_SIZE_1; break; + case 9200: gpu_vector_width = VECT_SIZE_1; break; + case 9300: gpu_vector_width = VECT_SIZE_1; break; + case 9400: gpu_vector_width = VECT_SIZE_1; break; + case 9500: gpu_vector_width = VECT_SIZE_1; break; + case 9600: gpu_vector_width = VECT_SIZE_1; break; + case 9700: gpu_vector_width = VECT_SIZE_1; break; + case 9710: gpu_vector_width = VECT_SIZE_1; break; + case 9720: gpu_vector_width = VECT_SIZE_2; break; + case 9800: gpu_vector_width = VECT_SIZE_1; break; + case 9810: gpu_vector_width = VECT_SIZE_1; break; + case 9820: gpu_vector_width = VECT_SIZE_2; break; + case 10000: gpu_vector_width = VECT_SIZE_1; break; + case 10100: gpu_vector_width = VECT_SIZE_1; break; + case 10400: gpu_vector_width = VECT_SIZE_1; break; + case 10410: gpu_vector_width = VECT_SIZE_1; break; + case 10420: gpu_vector_width = VECT_SIZE_2; break; + case 10500: gpu_vector_width = VECT_SIZE_1; break; + case 10600: gpu_vector_width = VECT_SIZE_2; break; + case 10700: gpu_vector_width = VECT_SIZE_1; break; + case 10800: gpu_vector_width = VECT_SIZE_1; break; + case 10900: gpu_vector_width = VECT_SIZE_1; break; + case 11100: gpu_vector_width = VECT_SIZE_2; break; + case 11200: gpu_vector_width = VECT_SIZE_2; break; + case 11300: gpu_vector_width = VECT_SIZE_1; break; + case 11400: gpu_vector_width = VECT_SIZE_1; break; + case 11600: gpu_vector_width = VECT_SIZE_1; break; + case 11700: gpu_vector_width = VECT_SIZE_1; break; + case 11800: gpu_vector_width = VECT_SIZE_1; break; + case 11900: gpu_vector_width = VECT_SIZE_1; break; + case 12000: gpu_vector_width = VECT_SIZE_1; break; + case 12100: gpu_vector_width = VECT_SIZE_1; break; + case 12200: gpu_vector_width = VECT_SIZE_1; break; + case 12300: gpu_vector_width = VECT_SIZE_1; break; + case 12500: gpu_vector_width = VECT_SIZE_1; break; + case 12700: gpu_vector_width = VECT_SIZE_1; break; + case 12800: gpu_vector_width = VECT_SIZE_1; break; + + default: gpu_vector_width = VECT_SIZE_4; break; + } + } + #endif + + return gpu_vector_width; +} + +static void pw_transpose_to_hi1 (const pw_t *p1, pw_t *p2) +{ + memcpy (p2->hi1, p1->hi1, 64 * sizeof (uint)); +} + +static void pw_transpose_to_hi2 (const pw_t *p1, pw_t *p2) +{ + p2->hi2[0][ 0] = p1->hi2[0][ 0]; + p2->hi2[0][ 2] = p1->hi2[0][ 1]; + p2->hi2[0][ 4] = p1->hi2[0][ 2]; + p2->hi2[0][ 6] = p1->hi2[0][ 3]; + p2->hi2[0][ 8] = p1->hi2[0][ 4]; + p2->hi2[0][10] = p1->hi2[0][ 5]; + p2->hi2[0][12] = p1->hi2[0][ 6]; + p2->hi2[0][14] = p1->hi2[0][ 7]; + p2->hi2[0][16] = p1->hi2[0][ 8]; + p2->hi2[0][18] = p1->hi2[0][ 9]; + p2->hi2[0][20] = p1->hi2[0][10]; + p2->hi2[0][22] = p1->hi2[0][11]; + p2->hi2[0][24] = p1->hi2[0][12]; + p2->hi2[0][26] = p1->hi2[0][13]; + p2->hi2[0][28] = p1->hi2[0][14]; + p2->hi2[0][30] = p1->hi2[0][15]; + p2->hi2[1][ 0] = p1->hi2[0][16]; + p2->hi2[1][ 2] = p1->hi2[0][17]; + p2->hi2[1][ 4] = p1->hi2[0][18]; + p2->hi2[1][ 6] = p1->hi2[0][19]; + p2->hi2[1][ 8] = p1->hi2[0][20]; + p2->hi2[1][10] = p1->hi2[0][21]; + p2->hi2[1][12] = p1->hi2[0][22]; + p2->hi2[1][14] = p1->hi2[0][23]; + p2->hi2[1][16] = p1->hi2[0][24]; + p2->hi2[1][18] = p1->hi2[0][25]; + p2->hi2[1][20] = p1->hi2[0][26]; + p2->hi2[1][22] = p1->hi2[0][27]; + p2->hi2[1][24] = p1->hi2[0][28]; + p2->hi2[1][26] = p1->hi2[0][29]; + p2->hi2[1][28] = p1->hi2[0][30]; + p2->hi2[1][30] = p1->hi2[0][31]; + + p2->hi2[0][ 1] = p1->hi2[1][ 0]; + p2->hi2[0][ 3] = p1->hi2[1][ 1]; + p2->hi2[0][ 5] = p1->hi2[1][ 2]; + p2->hi2[0][ 7] = p1->hi2[1][ 3]; + p2->hi2[0][ 9] = p1->hi2[1][ 4]; + p2->hi2[0][11] = p1->hi2[1][ 5]; + p2->hi2[0][13] = p1->hi2[1][ 6]; + p2->hi2[0][15] = p1->hi2[1][ 7]; + p2->hi2[0][17] = p1->hi2[1][ 8]; + p2->hi2[0][19] = p1->hi2[1][ 9]; + p2->hi2[0][21] = p1->hi2[1][10]; + p2->hi2[0][23] = p1->hi2[1][11]; + p2->hi2[0][25] = p1->hi2[1][12]; + p2->hi2[0][27] = p1->hi2[1][13]; + p2->hi2[0][29] = p1->hi2[1][14]; + p2->hi2[0][31] = p1->hi2[1][15]; + p2->hi2[1][ 1] = p1->hi2[1][16]; + p2->hi2[1][ 3] = p1->hi2[1][17]; + p2->hi2[1][ 5] = p1->hi2[1][18]; + p2->hi2[1][ 7] = p1->hi2[1][19]; + p2->hi2[1][ 9] = p1->hi2[1][20]; + p2->hi2[1][11] = p1->hi2[1][21]; + p2->hi2[1][13] = p1->hi2[1][22]; + p2->hi2[1][15] = p1->hi2[1][23]; + p2->hi2[1][17] = p1->hi2[1][24]; + p2->hi2[1][19] = p1->hi2[1][25]; + p2->hi2[1][21] = p1->hi2[1][26]; + p2->hi2[1][23] = p1->hi2[1][27]; + p2->hi2[1][25] = p1->hi2[1][28]; + p2->hi2[1][27] = p1->hi2[1][29]; + p2->hi2[1][29] = p1->hi2[1][30]; + p2->hi2[1][31] = p1->hi2[1][31]; +} + +static void pw_transpose_to_hi4 (const pw_t *p1, pw_t *p2) +{ + p2->hi4[0][ 0] = p1->hi4[0][ 0]; + p2->hi4[0][ 4] = p1->hi4[0][ 1]; + p2->hi4[0][ 8] = p1->hi4[0][ 2]; + p2->hi4[0][12] = p1->hi4[0][ 3]; + p2->hi4[1][ 0] = p1->hi4[0][ 4]; + p2->hi4[1][ 4] = p1->hi4[0][ 5]; + p2->hi4[1][ 8] = p1->hi4[0][ 6]; + p2->hi4[1][12] = p1->hi4[0][ 7]; + p2->hi4[2][ 0] = p1->hi4[0][ 8]; + p2->hi4[2][ 4] = p1->hi4[0][ 9]; + p2->hi4[2][ 8] = p1->hi4[0][10]; + p2->hi4[2][12] = p1->hi4[0][11]; + p2->hi4[3][ 0] = p1->hi4[0][12]; + p2->hi4[3][ 4] = p1->hi4[0][13]; + p2->hi4[3][ 8] = p1->hi4[0][14]; + p2->hi4[3][12] = p1->hi4[0][15]; + + p2->hi4[0][ 1] = p1->hi4[1][ 0]; + p2->hi4[0][ 5] = p1->hi4[1][ 1]; + p2->hi4[0][ 9] = p1->hi4[1][ 2]; + p2->hi4[0][13] = p1->hi4[1][ 3]; + p2->hi4[1][ 1] = p1->hi4[1][ 4]; + p2->hi4[1][ 5] = p1->hi4[1][ 5]; + p2->hi4[1][ 9] = p1->hi4[1][ 6]; + p2->hi4[1][13] = p1->hi4[1][ 7]; + p2->hi4[2][ 1] = p1->hi4[1][ 8]; + p2->hi4[2][ 5] = p1->hi4[1][ 9]; + p2->hi4[2][ 9] = p1->hi4[1][10]; + p2->hi4[2][13] = p1->hi4[1][11]; + p2->hi4[3][ 1] = p1->hi4[1][12]; + p2->hi4[3][ 5] = p1->hi4[1][13]; + p2->hi4[3][ 9] = p1->hi4[1][14]; + p2->hi4[3][13] = p1->hi4[1][15]; + + p2->hi4[0][ 2] = p1->hi4[2][ 0]; + p2->hi4[0][ 6] = p1->hi4[2][ 1]; + p2->hi4[0][10] = p1->hi4[2][ 2]; + p2->hi4[0][14] = p1->hi4[2][ 3]; + p2->hi4[1][ 2] = p1->hi4[2][ 4]; + p2->hi4[1][ 6] = p1->hi4[2][ 5]; + p2->hi4[1][10] = p1->hi4[2][ 6]; + p2->hi4[1][14] = p1->hi4[2][ 7]; + p2->hi4[2][ 2] = p1->hi4[2][ 8]; + p2->hi4[2][ 6] = p1->hi4[2][ 9]; + p2->hi4[2][10] = p1->hi4[2][10]; + p2->hi4[2][14] = p1->hi4[2][11]; + p2->hi4[3][ 2] = p1->hi4[2][12]; + p2->hi4[3][ 6] = p1->hi4[2][13]; + p2->hi4[3][10] = p1->hi4[2][14]; + p2->hi4[3][14] = p1->hi4[2][15]; + + p2->hi4[0][ 3] = p1->hi4[3][ 0]; + p2->hi4[0][ 7] = p1->hi4[3][ 1]; + p2->hi4[0][11] = p1->hi4[3][ 2]; + p2->hi4[0][15] = p1->hi4[3][ 3]; + p2->hi4[1][ 3] = p1->hi4[3][ 4]; + p2->hi4[1][ 7] = p1->hi4[3][ 5]; + p2->hi4[1][11] = p1->hi4[3][ 6]; + p2->hi4[1][15] = p1->hi4[3][ 7]; + p2->hi4[2][ 3] = p1->hi4[3][ 8]; + p2->hi4[2][ 7] = p1->hi4[3][ 9]; + p2->hi4[2][11] = p1->hi4[3][10]; + p2->hi4[2][15] = p1->hi4[3][11]; + p2->hi4[3][ 3] = p1->hi4[3][12]; + p2->hi4[3][ 7] = p1->hi4[3][13]; + p2->hi4[3][11] = p1->hi4[3][14]; + p2->hi4[3][15] = p1->hi4[3][15]; +} + +static uint pw_add_to_hc1 (hc_device_param_t *device_param, const uint8_t *pw_buf, const uint pw_len) +{ + if (data.devices_status == STATUS_BYPASS) return 0; + + pw_cache_t *pw_cache = device_param->pw_caches + pw_len; + + uint cache_cnt = pw_cache->cnt; + + uint8_t *pw_hc1 = pw_cache->pw_buf.hc1[cache_cnt]; + + memcpy (pw_hc1, pw_buf, pw_len); + + memset (pw_hc1 + pw_len, 0, 256 - pw_len); + + uint pws_cnt = device_param->pws_cnt; + + cache_cnt++; + + if (cache_cnt == VECT_SIZE_1) + { + pw_t *pw = device_param->pws_buf + pws_cnt; + + device_param->pw_transpose (&pw_cache->pw_buf, pw); + + pw->pw_len = pw_len; + + pws_cnt++; + + device_param->pws_cnt = pws_cnt; + device_param->pw_cnt = pws_cnt * 1; + + cache_cnt = 0; + } + + pw_cache->cnt = cache_cnt; + + return pws_cnt; +} + +static uint pw_add_to_hc2 (hc_device_param_t *device_param, const uint8_t *pw_buf, const uint pw_len) +{ + if (data.devices_status == STATUS_BYPASS) return 0; + + pw_cache_t *pw_cache = device_param->pw_caches + pw_len; + + uint cache_cnt = pw_cache->cnt; + + uint8_t *pw_hc2 = pw_cache->pw_buf.hc2[cache_cnt]; + + memcpy (pw_hc2, pw_buf, pw_len); + + memset (pw_hc2 + pw_len, 0, 128 - pw_len); + + uint pws_cnt = device_param->pws_cnt; + + cache_cnt++; + + if (cache_cnt == VECT_SIZE_2) + { + pw_t *pw = device_param->pws_buf + pws_cnt; + + device_param->pw_transpose (&pw_cache->pw_buf, pw); + + pw->pw_len = pw_len; + + pws_cnt++; + + device_param->pws_cnt = pws_cnt; + device_param->pw_cnt = pws_cnt * 2; + + cache_cnt = 0; + } + + pw_cache->cnt = cache_cnt; + + return pws_cnt; +} + +static uint pw_add_to_hc4 (hc_device_param_t *device_param, const uint8_t *pw_buf, const uint pw_len) +{ + if (data.devices_status == STATUS_BYPASS) return 0; + + pw_cache_t *pw_cache = device_param->pw_caches + pw_len; + + uint cache_cnt = pw_cache->cnt; + + uint8_t *pw_hc4 = pw_cache->pw_buf.hc4[cache_cnt]; + + memcpy (pw_hc4, pw_buf, pw_len); + + memset (pw_hc4 + pw_len, 0, 64 - pw_len); + + uint pws_cnt = device_param->pws_cnt; + + cache_cnt++; + + if (cache_cnt == VECT_SIZE_4) + { + pw_t *pw = device_param->pws_buf + pws_cnt; + + device_param->pw_transpose (&pw_cache->pw_buf, pw); + + pw->pw_len = pw_len; + + pws_cnt++; + + device_param->pws_cnt = pws_cnt; + device_param->pw_cnt = pws_cnt * 4; + + cache_cnt = 0; + } + + pw_cache->cnt = cache_cnt; + + return pws_cnt; +} + +static void *thread_monitor (void *p) +{ + uint runtime_check = 0; + uint remove_check = 0; + uint status_check = 0; + uint hwmon_check = 0; + uint restore_check = 0; + + uint restore_left = data.restore_timer; + uint remove_left = data.remove_timer; + uint status_left = data.status_timer; + + #ifdef _OCL + #ifndef OSX + + int *fan_speed_chgd = (int *) mycalloc (data.devices_cnt, sizeof (int)); + + // temperature controller "loopback" values + + int *temp_diff_old = (int *) mycalloc (data.devices_cnt, sizeof (int)); + int *temp_diff_sum = (int *) mycalloc (data.devices_cnt, sizeof (int)); + + int temp_threshold = 1; // degrees celcius + + int fan_speed_min = 15; // in percentage + int fan_speed_max = 100; + + time_t last_temp_check_time; + + #endif + #endif + + uint sleep_time = 1; + + if (data.runtime) + runtime_check = 1; + + if (data.restore_timer) + restore_check = 1; + + if ((data.remove == 1) && (data.hashlist_mode == HL_MODE_FILE)) + remove_check = 1; + + if (data.status == 1) + status_check = 1; + + if (data.gpu_temp_disable == 0) + { + #ifdef _OCL + #ifndef OSX + time (&last_temp_check_time); + #endif + #endif + + hwmon_check = 1; + } + + if ((runtime_check == 0) && (remove_check == 0) && (status_check == 0) && (hwmon_check == 0) && (restore_check == 0)) + { + return (p); + } + + while ((data.devices_status != STATUS_EXHAUSTED) && (data.devices_status != STATUS_CRACKED) && (data.devices_status != STATUS_ABORTED) && (data.devices_status != STATUS_QUIT)) + { + hc_sleep (sleep_time); + + if (data.devices_status != STATUS_RUNNING) continue; + + if (hwmon_check == 1) + { + hc_thread_mutex_lock (mux_adl); + + #ifdef _OCL + #ifndef OSX + + time_t temp_check_time; + + time (&temp_check_time); + + uint Ta = temp_check_time - last_temp_check_time; // set Ta = sleep_time; is not good enough (see --remove etc) + + if (Ta == 0) Ta = 1; + + #endif + #endif + + for (uint i = 0; i < data.devices_cnt; i++) + { + const int temperature = hm_get_temperature_with_device_id (i); + + if (temperature > (int) data.gpu_temp_abort) + { + log_error ("ERROR: Temperature limit on GPU %d reached, aborting...", i + 1); + + if (data.devices_status != STATUS_QUIT) myabort (); + + break; + } + + #ifdef _OCL + #ifndef OSX + + const int gpu_temp_retain = data.gpu_temp_retain; + + if (gpu_temp_retain) + { + if (data.hm_device[i].fan_supported == 1) + { + int temp_cur = temperature; + + int temp_diff_new = gpu_temp_retain - temp_cur; + + temp_diff_sum[i] = temp_diff_sum[i] + temp_diff_new; + + // calculate Ta value (time difference in seconds between the last check and this check) + + last_temp_check_time = temp_check_time; + + float Kp = 1.8; + float Ki = 0.005; + float Kd = 6; + + // PID controller (3-term controller: proportional - Kp, integral - Ki, derivative - Kd) + + int fan_diff_required = (int) (Kp * (float)temp_diff_new + Ki * Ta * (float)temp_diff_sum[i] + Kd * ((float)(temp_diff_new - temp_diff_old[i])) / Ta); + + if (abs (fan_diff_required) >= temp_threshold) + { + const int fan_speed_cur = hm_get_fanspeed_with_device_id (i); + + int fan_speed_level = fan_speed_cur; + + if (fan_speed_chgd[i] == 0) fan_speed_level = temp_cur; + + int fan_speed_new = fan_speed_level - fan_diff_required; + + if (fan_speed_new > fan_speed_max) fan_speed_new = fan_speed_max; + if (fan_speed_new < fan_speed_min) fan_speed_new = fan_speed_min; + + if (fan_speed_new != fan_speed_cur) + { + int freely_change_fan_speed = (fan_speed_chgd[i] == 1); + int fan_speed_must_change = (fan_speed_new > fan_speed_cur); + + if ((freely_change_fan_speed == 1) || (fan_speed_must_change == 1)) + { + hm_set_fanspeed_with_device_id (i, fan_speed_new); + + fan_speed_chgd[i] = 1; + } + + temp_diff_old[i] = temp_diff_new; + } + } + } + } + + #endif + #endif + } + + hc_thread_mutex_unlock (mux_adl); + } + + if (restore_check == 1) + { + restore_left--; + + if (restore_left == 0) + { + if (data.restore_disable == 0) cycle_restore (); + + restore_left = data.restore_timer; + } + } + + if ((runtime_check == 1) && (data.runtime_start > 0)) + { + time_t runtime_cur; + + time (&runtime_cur); + + int runtime_left = data.runtime_start + data.runtime - runtime_cur; + + if (runtime_left <= 0) + { + if (data.benchmark == 0) + { + if (data.quiet == 0) log_info ("\nNOTE: Runtime limit reached, aborting...\n"); + } + + if (data.devices_status != STATUS_QUIT) myabort (); + } + } + + if (remove_check == 1) + { + remove_left--; + + if (remove_left == 0) + { + if (data.digests_saved != data.digests_done) + { + data.digests_saved = data.digests_done; + + save_hash (); + } + + remove_left = data.remove_timer; + } + } + + if (status_check == 1) + { + status_left--; + + if (status_left == 0) + { + hc_thread_mutex_lock (mux_display); + + if (data.quiet == 0) clear_prompt (); + + if (data.quiet == 0) log_info (""); + + status_display (); + + if (data.quiet == 0) log_info (""); + + hc_thread_mutex_unlock (mux_display); + + status_left = data.status_timer; + } + } + } + + #ifdef _OCL + #ifndef OSX + myfree (fan_speed_chgd); + + myfree (temp_diff_old); + myfree (temp_diff_sum); + #endif + #endif + + p = NULL; + + return (p); +} + +static void *thread_outfile_remove (void *p) +{ + // some hash-dependent constants + char *outfile_dir = data.outfile_check_directory; + uint dgst_size = data.dgst_size; + uint isSalted = data.isSalted; + uint esalt_size = data.esalt_size; + uint hash_mode = data.hash_mode; + + uint outfile_check_timer = data.outfile_check_timer; + + char separator = data.separator; + + // some hash-dependent functions + int (*sort_by_digest) (const void *, const void *) = data.sort_by_digest; + int (*parse_func) (char *, uint, hash_t *) = data.parse_func; + + // buffers + hash_t hash_buf; + + memset (&hash_buf, 0, sizeof (hash_buf)); + + hash_buf.digest = mymalloc (dgst_size); + + if (isSalted) hash_buf.salt = (salt_t *) mymalloc (sizeof (salt_t)); + + if (esalt_size) hash_buf.esalt = (void *) mymalloc (esalt_size); + + uint digest_buf[64]; + + outfile_data_t *out_info = NULL; + + char **out_files = NULL; + + time_t folder_mtime = 0; + + int out_cnt = 0; + + uint check_left = outfile_check_timer; // or 1 if we want to check it at startup + + while ((data.devices_status != STATUS_EXHAUSTED) && (data.devices_status != STATUS_CRACKED) && (data.devices_status != STATUS_ABORTED) && (data.devices_status != STATUS_QUIT)) + { + hc_sleep (1); + + if (data.devices_status != STATUS_RUNNING) continue; + + check_left--; + + if (check_left == 0) + { + struct stat outfile_check_stat; + + if (stat (outfile_dir, &outfile_check_stat) == 0) + { + uint is_dir = S_ISDIR (outfile_check_stat.st_mode); + + if (is_dir == 1) + { + if (outfile_check_stat.st_mtime > folder_mtime) + { + char **out_files_new = scan_directory (outfile_dir); + + int out_cnt_new = count_dictionaries (out_files_new); + + outfile_data_t *out_info_new = NULL; + + if (out_cnt_new > 0) + { + out_info_new = (outfile_data_t *) mycalloc (out_cnt_new, sizeof (outfile_data_t)); + + for (int i = 0; i < out_cnt_new; i++) + { + out_info_new[i].file_name = out_files_new[i]; + + // check if there are files that we have seen/checked before (and not changed) + + for (int j = 0; j < out_cnt; j++) + { + if (strcmp (out_info[j].file_name, out_info_new[i].file_name) == 0) + { + struct stat outfile_stat; + + if (stat (out_info_new[i].file_name, &outfile_stat) == 0) + { + if (outfile_stat.st_ctime == out_info[j].ctime) + { + out_info_new[i].ctime = out_info[j].ctime; + out_info_new[i].seek = out_info[j].seek; + } + } + } + } + } + } + + local_free (out_info); + local_free (out_files); + + out_files = out_files_new; + out_cnt = out_cnt_new; + out_info = out_info_new; + + folder_mtime = outfile_check_stat.st_mtime; + } + + for (int j = 0; j < out_cnt; j++) + { + FILE *fp = fopen (out_info[j].file_name, "rb"); + + if (fp != NULL) + { + //hc_thread_mutex_lock (mux_display); + + #ifdef _POSIX + struct stat outfile_stat; + + fstat (fileno (fp), &outfile_stat); + #endif + + #ifdef _WIN + struct stat64 outfile_stat; + + _fstat64 (fileno (fp), &outfile_stat); + #endif + + if (outfile_stat.st_ctime > out_info[j].ctime) + { + out_info[j].ctime = outfile_stat.st_ctime; + out_info[j].seek = 0; + } + + fseek (fp, out_info[j].seek, SEEK_SET); + + while (!feof (fp)) + { + char line_buf[BUFSIZ]; + + memset (line_buf, 0, BUFSIZ); + + char *ptr = fgets (line_buf, BUFSIZ - 1, fp); + + if (ptr == NULL) break; + + int line_len = strlen (line_buf); + + if (line_len <= 0) continue; + + int iter = MAX_CUT_TRIES; + + for (uint i = line_len - 1; i && iter; i--, line_len--) + { + if (line_buf[i] != separator) continue; + + int parser_status = PARSER_OK; + + if ((hash_mode != 2500) && (hash_mode != 6800)) + { + parser_status = parse_func (line_buf, line_len - 1, &hash_buf); + } + + uint found = 0; + + if (parser_status == PARSER_OK) + { + for (uint salt_pos = 0; (found == 0) && (salt_pos < data.salts_cnt); salt_pos++) + { + if (data.salts_shown[salt_pos] == 1) continue; + + salt_t *salt_buf = &data.salts_buf[salt_pos]; + + for (uint digest_pos = 0; (found == 0) && (digest_pos < salt_buf->digests_cnt); digest_pos++) + { + uint idx = salt_buf->digests_offset + digest_pos; + + if (data.digests_shown[idx] == 1) continue; + + uint cracked = 0; + + if (hash_mode == 6800) + { + if (i == salt_buf->salt_len) + { + cracked = (memcmp (line_buf, salt_buf->salt_buf, salt_buf->salt_len) == 0); + } + } + else if (hash_mode == 2500) + { + // BSSID : MAC1 : MAC2 (:plain) + if (i == (salt_buf->salt_len + 1 + 12 + 1 + 12)) + { + cracked = (memcmp (line_buf, salt_buf->salt_buf, salt_buf->salt_len) == 0); + + if (!cracked) continue; + + // now compare MAC1 and MAC2 too, since we have this additional info + char *mac1_pos = line_buf + salt_buf->salt_len + 1; + char *mac2_pos = mac1_pos + 12 + 1; + + wpa_t *wpas = (wpa_t *) data.esalts_buf; + wpa_t *wpa = &wpas[salt_pos]; + + uint pke[25]; + + char *pke_ptr = (char *) pke; + + for (uint i = 0; i < 25; i++) + { + pke[i] = byte_swap_32 (wpa->pke[i]); + } + + unsigned char mac1[6]; + unsigned char mac2[6]; + + memcpy (mac1, pke_ptr + 23, 6); + memcpy (mac2, pke_ptr + 29, 6); + + // compare hex string(s) vs binary MAC address(es) + + for (uint i = 0, j = 0; i < 6; i++, j += 2) + { + if (mac1[i] != (unsigned char) hex_to_char (&mac1_pos[j])) + { + cracked = 0; + break; + } + } + + // early skip ;) + if (!cracked) continue; + + for (uint i = 0, j = 0; i < 6; i++, j += 2) + { + if (mac2[i] != (unsigned char) hex_to_char (&mac2_pos[j])) + { + cracked = 0; + break; + } + } + } + } + else + { + char *digests_buf_ptr = (char *) data.digests_buf; + + memcpy (digest_buf, digests_buf_ptr + (data.salts_buf[salt_pos].digests_offset * dgst_size) + (digest_pos * dgst_size), dgst_size); + + cracked = (sort_by_digest (digest_buf, hash_buf.digest) == 0); + } + + if (cracked == 1) + { + found = 1; + + data.digests_shown[idx] = 1; + + data.digests_done++; + + salt_buf->digests_done++; + + if (salt_buf->digests_done == salt_buf->digests_cnt) + { + data.salts_shown[salt_pos] = 1; + + data.salts_done++; + + if (data.salts_done == data.salts_cnt) data.devices_status = STATUS_CRACKED; + } + } + } + + if (data.devices_status == STATUS_CRACKED) break; + } + } + + if (found) break; + + if (data.devices_status == STATUS_CRACKED) break; + + iter--; + } + + if (data.devices_status == STATUS_CRACKED) break; + } + + out_info[j].seek = ftell (fp); + + //hc_thread_mutex_unlock (mux_display); + + fclose (fp); + } + } + } + } + + check_left = outfile_check_timer; + } + } + + if (esalt_size) local_free (hash_buf.esalt); + + if (isSalted) local_free (hash_buf.salt); + + local_free (hash_buf.digest); + + local_free (out_info); + + local_free (out_files); + + p = NULL; + + return (p); +} + +static uint get_work (hc_device_param_t *device_param, const uint64_t max) +{ + hc_thread_mutex_lock (mux_dispatcher); + + const uint64_t words_cur = data.words_cur; + const uint64_t words_base = (data.limit == 0) ? data.words_base : data.limit; + + device_param->words_off = words_cur; + + const uint64_t words_left = words_base - words_cur; + + if (data.gpu_blocks_all > words_left) + { + if (data.gpu_blocks_div == 0) + { + data.gpu_blocks_div = find_gpu_blocks_div (words_left, data.gpu_blocks_all); + } + } + + if (data.gpu_blocks_div) + { + if (device_param->gpu_blocks == device_param->gpu_blocks_user) + { + const uint32_t gpu_blocks_new = (float) device_param->gpu_blocks * data.gpu_blocks_div; + const uint32_t gpu_power_new = gpu_blocks_new / device_param->gpu_vector_width; + + if (gpu_blocks_new < device_param->gpu_blocks) + { + device_param->gpu_blocks = gpu_blocks_new; + device_param->gpu_power = gpu_power_new; + } + } + } + + const uint gpu_blocks = device_param->gpu_blocks; + + uint work = MIN (words_left, gpu_blocks); + + work = MIN (work, max); + + data.words_cur += work; + + hc_thread_mutex_unlock (mux_dispatcher); + + return work; +} + +static void *thread_calc_stdin (void *p) +{ + hc_device_param_t *device_param = (hc_device_param_t *) p; + + const uint attack_kern = data.attack_kern; + + const uint gpu_blocks = device_param->gpu_blocks; + + while ((data.devices_status != STATUS_EXHAUSTED) && (data.devices_status != STATUS_CRACKED) && (data.devices_status != STATUS_ABORTED) && (data.devices_status != STATUS_QUIT)) + { + hc_thread_mutex_lock (mux_dispatcher); + + if (feof (stdin) != 0) + { + hc_thread_mutex_unlock (mux_dispatcher); + + break; + } + + uint words_cur = 0; + + while (words_cur < gpu_blocks) + { + char buf[BUFSIZ]; + + char *line_buf = fgets (buf, sizeof (buf), stdin); + + if (line_buf == NULL) break; + + uint line_len = in_superchop (line_buf); + + line_len = convert_from_hex (line_buf, line_len); + + // post-process rule engine + + if (run_rule_engine (data.rule_len_l, data.rule_buf_l)) + { + char rule_buf_out[BLOCK_SIZE]; + + memset (rule_buf_out, 0, sizeof (rule_buf_out)); + + int rule_len_out = -1; + + if (line_len < BLOCK_SIZE) + { + rule_len_out = _old_apply_rule (data.rule_buf_l, data.rule_len_l, line_buf, line_len, rule_buf_out); + } + + if (rule_len_out < 0) continue; + + line_buf = rule_buf_out; + line_len = rule_len_out; + } + + if (line_len > PW_MAX) + { + continue; + } + + if (attack_kern == ATTACK_KERN_STRAIGHT) + { + if ((line_len < data.pw_min) || (line_len > data.pw_max)) + { + hc_thread_mutex_lock (mux_counter); + + for (uint salt_pos = 0; salt_pos < data.salts_cnt; salt_pos++) + { + data.words_progress_rejected[salt_pos] += data.gpu_rules_cnt; + } + + hc_thread_mutex_unlock (mux_counter); + + continue; + } + } + else if (attack_kern == ATTACK_KERN_COMBI) + { + // do not check if minimum restriction is satisfied (line_len >= data.pw_min) here + // since we still need to combine the plains + + if (line_len > data.pw_max) + { + hc_thread_mutex_lock (mux_counter); + + for (uint salt_pos = 0; salt_pos < data.salts_cnt; salt_pos++) + { + data.words_progress_rejected[salt_pos] += data.combs_cnt; + } + + hc_thread_mutex_unlock (mux_counter); + + continue; + } + } + + device_param->pw_add (device_param, (uint8_t *) line_buf, line_len); + + words_cur++; + + if (data.devices_status == STATUS_CRACKED) break; + if (data.devices_status == STATUS_ABORTED) break; + if (data.devices_status == STATUS_QUIT) break; + if (data.devices_status == STATUS_BYPASS) break; + } + + hc_thread_mutex_unlock (mux_dispatcher); + + if (data.devices_status == STATUS_CRACKED) break; + if (data.devices_status == STATUS_ABORTED) break; + if (data.devices_status == STATUS_QUIT) break; + if (data.devices_status == STATUS_BYPASS) break; + + // we need 2 flushing because we have two independant caches and it can occur + // that one buffer is already at threshold plus for that length also exists + // more data in the 2nd buffer so it would overflow + + // flush session 1 + + { + for (int pw_len = 0; pw_len < PW_MAX1; pw_len++) + { + pw_cache_t *pw_cache = &device_param->pw_caches[pw_len]; + + const uint pw_cache_cnt = pw_cache->cnt; + + if (pw_cache_cnt == 0) continue; + + pw_cache->cnt = 0; + + uint pws_cnt = device_param->pws_cnt; + + pw_t *pw = device_param->pws_buf + pws_cnt; + + device_param->pw_transpose (&pw_cache->pw_buf, pw); + + pw->pw_len = pw_len; + + uint pw_cnt = device_param->pw_cnt; + + pw_cnt += pw_cache_cnt; + + device_param->pw_cnt = pw_cnt; + + pws_cnt++; + + device_param->pws_cnt = pws_cnt; + + if (pws_cnt == device_param->gpu_power_user) break; + } + + const uint pw_cnt = device_param->pw_cnt; + const uint pws_cnt = device_param->pws_cnt; + + if (pws_cnt) + { + run_copy (device_param, pws_cnt); + + run_cracker (device_param, pw_cnt, pws_cnt); + + device_param->pw_cnt = 0; + device_param->pws_cnt = 0; + } + } + + // flush session 2 + + { + for (int pw_len = 0; pw_len < PW_MAX1; pw_len++) + { + pw_cache_t *pw_cache = &device_param->pw_caches[pw_len]; + + const uint pw_cache_cnt = pw_cache->cnt; + + if (pw_cache_cnt == 0) continue; + + pw_cache->cnt = 0; + + uint pws_cnt = device_param->pws_cnt; + + pw_t *pw = device_param->pws_buf + pws_cnt; + + device_param->pw_transpose (&pw_cache->pw_buf, pw); + + pw->pw_len = pw_len; + + uint pw_cnt = device_param->pw_cnt; + + pw_cnt += pw_cache_cnt; + + device_param->pw_cnt = pw_cnt; + + pws_cnt++; + + device_param->pws_cnt = pws_cnt; + } + + const uint pw_cnt = device_param->pw_cnt; + const uint pws_cnt = device_param->pws_cnt; + + if (pws_cnt) + { + run_copy (device_param, pws_cnt); + + run_cracker (device_param, pw_cnt, pws_cnt); + + device_param->pw_cnt = 0; + device_param->pws_cnt = 0; + } + } + } + + return NULL; +} + +static void *thread_calc (void *p) +{ + hc_device_param_t *device_param = (hc_device_param_t *) p; + + const uint attack_mode = data.attack_mode; + const uint attack_kern = data.attack_kern; + + if (attack_mode == ATTACK_MODE_BF) + { + while ((data.devices_status != STATUS_EXHAUSTED) && (data.devices_status != STATUS_CRACKED) && (data.devices_status != STATUS_ABORTED) && (data.devices_status != STATUS_QUIT)) + { + const uint work = get_work (device_param, -1); + + if (work == 0) break; + + const uint64_t words_off = device_param->words_off; + const uint64_t words_fin = words_off + work; + + const uint gpu_vector_width = device_param->gpu_vector_width; + + const uint pw_cnt = work; + const uint pws_cnt = mydivc32 (work, gpu_vector_width); + + device_param->pw_cnt = pw_cnt; + device_param->pws_cnt = pws_cnt; + + if (pws_cnt) + { + run_copy (device_param, pws_cnt); + + run_cracker (device_param, pw_cnt, pws_cnt); + + device_param->pw_cnt = 0; + device_param->pws_cnt = 0; + } + + if (data.devices_status == STATUS_CRACKED) break; + if (data.devices_status == STATUS_ABORTED) break; + if (data.devices_status == STATUS_QUIT) break; + if (data.devices_status == STATUS_BYPASS) break; + + device_param->words_done = words_fin; + } + } + else + { + const uint segment_size = data.segment_size; + + char *dictfile = data.dictfile; + + if (attack_mode == ATTACK_MODE_COMBI) + { + if (data.combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + dictfile = data.dictfile2; + } + } + + FILE *fd = fopen (dictfile, "rb"); + + if (fd == NULL) + { + log_error ("ERROR: %s: %s", dictfile, strerror (errno)); + + return NULL; + } + + if (attack_mode == ATTACK_MODE_COMBI) + { + const uint combs_mode = data.combs_mode; + + if (combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + const char *dictfilec = data.dictfile2; + + FILE *combs_fp = fopen (dictfilec, "rb"); + + if (combs_fp == NULL) + { + log_error ("ERROR: %s: %s", dictfilec, strerror (errno)); + + fclose (fd); + + return NULL; + } + + device_param->combs_fp = combs_fp; + } + else if (combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + const char *dictfilec = data.dictfile; + + FILE *combs_fp = fopen (dictfilec, "rb"); + + if (combs_fp == NULL) + { + log_error ("ERROR: %s: %s", dictfilec, strerror (errno)); + + fclose (fd); + + return NULL; + } + + device_param->combs_fp = combs_fp; + } + } + + wl_data_t *wl_data = (wl_data_t *) mymalloc (sizeof (wl_data_t)); + + wl_data->buf = (char *) mymalloc (segment_size); + wl_data->avail = segment_size; + wl_data->incr = segment_size; + wl_data->cnt = 0; + wl_data->pos = 0; + + uint64_t words_cur = 0; + + while ((data.devices_status != STATUS_EXHAUSTED) && (data.devices_status != STATUS_CRACKED) && (data.devices_status != STATUS_ABORTED) && (data.devices_status != STATUS_QUIT)) + { + uint64_t words_off = 0; + uint64_t words_fin = 0; + + uint64_t max = -1; + + while (max) + { + const uint work = get_work (device_param, max); + + if (work == 0) break; + + words_off = device_param->words_off; + words_fin = words_off + work; + + char *line_buf; + uint line_len; + + for ( ; words_cur < words_off; words_cur++) get_next_word (wl_data, fd, &line_buf, &line_len); + + max = 0; + + for ( ; words_cur < words_fin; words_cur++) + { + get_next_word (wl_data, fd, &line_buf, &line_len); + + line_len = convert_from_hex (line_buf, line_len); + + // post-process rule engine + + if (run_rule_engine (data.rule_len_l, data.rule_buf_l)) + { + char rule_buf_out[BLOCK_SIZE]; + + memset (rule_buf_out, 0, sizeof (rule_buf_out)); + + int rule_len_out = -1; + + if (line_len < BLOCK_SIZE) + { + rule_len_out = _old_apply_rule (data.rule_buf_l, data.rule_len_l, line_buf, line_len, rule_buf_out); + } + + if (rule_len_out < 0) continue; + + line_buf = rule_buf_out; + line_len = rule_len_out; + } + + if (attack_kern == ATTACK_KERN_STRAIGHT) + { + if ((line_len < data.pw_min) || (line_len > data.pw_max)) + { + max++; + + hc_thread_mutex_lock (mux_counter); + + for (uint salt_pos = 0; salt_pos < data.salts_cnt; salt_pos++) + { + data.words_progress_rejected[salt_pos] += data.gpu_rules_cnt; + } + + hc_thread_mutex_unlock (mux_counter); + + continue; + } + } + else if (attack_kern == ATTACK_KERN_COMBI) + { + // do not check if minimum restriction is satisfied (line_len >= data.pw_min) here + // since we still need to combine the plains + + if (line_len > data.pw_max) + { + max++; + + hc_thread_mutex_lock (mux_counter); + + for (uint salt_pos = 0; salt_pos < data.salts_cnt; salt_pos++) + { + data.words_progress_rejected[salt_pos] += data.combs_cnt; + } + + hc_thread_mutex_unlock (mux_counter); + + continue; + } + } + + device_param->pw_add (device_param, (uint8_t *) line_buf, line_len); + + if (data.devices_status == STATUS_CRACKED) break; + if (data.devices_status == STATUS_ABORTED) break; + if (data.devices_status == STATUS_QUIT) break; + if (data.devices_status == STATUS_BYPASS) break; + } + + if (data.devices_status == STATUS_CRACKED) break; + if (data.devices_status == STATUS_ABORTED) break; + if (data.devices_status == STATUS_QUIT) break; + if (data.devices_status == STATUS_BYPASS) break; + } + + if (data.devices_status == STATUS_CRACKED) break; + if (data.devices_status == STATUS_ABORTED) break; + if (data.devices_status == STATUS_QUIT) break; + if (data.devices_status == STATUS_BYPASS) break; + + // we need 2 flushing because we have two independant caches and it can occur + // that one buffer is already at threshold plus for that length also exists + // more data in the 2nd buffer so it would overflow + + // + // flush session 1 + // + + { + for (int pw_len = 0; pw_len < PW_MAX1; pw_len++) + { + pw_cache_t *pw_cache = &device_param->pw_caches[pw_len]; + + const uint pw_cache_cnt = pw_cache->cnt; + + if (pw_cache_cnt == 0) continue; + + pw_cache->cnt = 0; + + uint pws_cnt = device_param->pws_cnt; + + pw_t *pw = device_param->pws_buf + pws_cnt; + + device_param->pw_transpose (&pw_cache->pw_buf, pw); + + pw->pw_len = pw_len; + + uint pw_cnt = device_param->pw_cnt; + + pw_cnt += pw_cache_cnt; + + device_param->pw_cnt = pw_cnt; + + pws_cnt++; + + device_param->pws_cnt = pws_cnt; + + if (pws_cnt == device_param->gpu_power_user) break; + } + + const uint pw_cnt = device_param->pw_cnt; + const uint pws_cnt = device_param->pws_cnt; + + if (pws_cnt) + { + run_copy (device_param, pws_cnt); + + run_cracker (device_param, pw_cnt, pws_cnt); + + device_param->pw_cnt = 0; + device_param->pws_cnt = 0; + } + + if (data.devices_status == STATUS_CRACKED) break; + if (data.devices_status == STATUS_ABORTED) break; + if (data.devices_status == STATUS_QUIT) break; + if (data.devices_status == STATUS_BYPASS) break; + } + + // + // flush session 2 + // + + { + for (int pw_len = 0; pw_len < PW_MAX1; pw_len++) + { + pw_cache_t *pw_cache = &device_param->pw_caches[pw_len]; + + const uint pw_cache_cnt = pw_cache->cnt; + + if (pw_cache_cnt == 0) continue; + + pw_cache->cnt = 0; + + uint pws_cnt = device_param->pws_cnt; + + pw_t *pw = device_param->pws_buf + pws_cnt; + + device_param->pw_transpose (&pw_cache->pw_buf, pw); + + pw->pw_len = pw_len; + + uint pw_cnt = device_param->pw_cnt; + + pw_cnt += pw_cache_cnt; + + device_param->pw_cnt = pw_cnt; + + pws_cnt++; + + device_param->pws_cnt = pws_cnt; + } + + const uint pw_cnt = device_param->pw_cnt; + const uint pws_cnt = device_param->pws_cnt; + + if (pws_cnt) + { + run_copy (device_param, pws_cnt); + + run_cracker (device_param, pw_cnt, pws_cnt); + + device_param->pw_cnt = 0; + device_param->pws_cnt = 0; + } + + if (data.devices_status == STATUS_CRACKED) break; + if (data.devices_status == STATUS_ABORTED) break; + if (data.devices_status == STATUS_QUIT) break; + if (data.devices_status == STATUS_BYPASS) break; + } + + if (words_fin == 0) break; + + device_param->words_done = words_fin; + } + + if (attack_mode == ATTACK_MODE_COMBI) + { + fclose (device_param->combs_fp); + } + + free (wl_data->buf); + free (wl_data); + + fclose (fd); + } + + return NULL; +} + +static void weak_hash_check (hc_device_param_t *device_param, const uint salt_pos, const uint gpu_loops) +{ + #ifdef _CUDA + hc_cuCtxPushCurrent (device_param->context); + #endif + + salt_t *salt_buf = &data.salts_buf[salt_pos]; + + device_param->kernel_params_buf32[24] = salt_pos; + device_param->kernel_params_buf32[27] = 1; + device_param->kernel_params_buf32[28] = salt_buf->digests_cnt; + device_param->kernel_params_buf32[29] = salt_buf->digests_offset; + device_param->kernel_params_buf32[30] = 0; + device_param->kernel_params_buf32[31] = 1; + + char *dictfile_old = data.dictfile; + char *dictfile2_old = data.dictfile2; + char *mask_old = data.mask; + + const char *weak_hash_check = "weak-hash-check"; + + data.dictfile = (char *) weak_hash_check; + data.dictfile2 = (char *) weak_hash_check; + data.mask = (char *) weak_hash_check; + + /** + * run the kernel + */ + + if (data.attack_exec == ATTACK_EXEC_ON_GPU) + { + run_kernel (KERN_RUN_1, device_param, 1); + } + else + { + run_kernel (KERN_RUN_1, device_param, 1); + + const uint iter = salt_buf->salt_iter; + + for (uint loop_pos = 0; loop_pos < iter; loop_pos += gpu_loops) + { + uint loop_left = iter - loop_pos; + + loop_left = MIN (loop_left, gpu_loops); + + device_param->kernel_params_buf32[25] = loop_pos; + device_param->kernel_params_buf32[26] = loop_left; + + run_kernel (KERN_RUN_2, device_param, 1); + } + + run_kernel (KERN_RUN_3, device_param, 1); + } + + /** + * result + */ + + check_cracked (device_param, salt_pos); + + /** + * cleanup + */ + + device_param->kernel_params_buf32[24] = 0; + device_param->kernel_params_buf32[25] = 0; + device_param->kernel_params_buf32[26] = 0; + device_param->kernel_params_buf32[27] = 0; + device_param->kernel_params_buf32[28] = 0; + device_param->kernel_params_buf32[29] = 0; + device_param->kernel_params_buf32[30] = 0; + device_param->kernel_params_buf32[31] = 0; + + data.dictfile = dictfile_old; + data.dictfile2 = dictfile2_old; + data.mask = mask_old; + + #ifdef _CUDA + hc_cuCtxPopCurrent (&device_param->context); + #endif +} + +// hlfmt hashcat + +static void hlfmt_hash_hashcat (char line_buf[BUFSIZ], int line_len, char **hashbuf_pos, int *hashbuf_len) +{ + if (data.username == 0) + { + *hashbuf_pos = line_buf; + *hashbuf_len = line_len; + } + else + { + char *pos = line_buf; + int len = line_len; + + for (int i = 0; i < line_len; i++, pos++, len--) + { + if (line_buf[i] == data.separator) + { + pos++; + + len--; + + break; + } + } + + *hashbuf_pos = pos; + *hashbuf_len = len; + } +} + +static void hlfmt_user_hashcat (char line_buf[BUFSIZ], int line_len, char **userbuf_pos, int *userbuf_len) +{ + char *pos = NULL; + int len = 0; + + int sep_cnt = 0; + + for (int i = 0; i < line_len; i++) + { + if (line_buf[i] == data.separator) + { + sep_cnt++; + + continue; + } + + if (sep_cnt == 0) + { + if (pos == NULL) pos = line_buf + i; + + len++; + } + } + + *userbuf_pos = pos; + *userbuf_len = len; +} + +// hlfmt pwdump + +static int hlfmt_detect_pwdump (char line_buf[BUFSIZ], int line_len) +{ + int sep_cnt = 0; + + int sep2_len = 0; + int sep3_len = 0; + + for (int i = 0; i < line_len; i++) + { + if (line_buf[i] == ':') + { + sep_cnt++; + + continue; + } + + if (sep_cnt == 2) sep2_len++; + if (sep_cnt == 3) sep3_len++; + } + + if ((sep_cnt == 6) && ((sep2_len == 32) || (sep3_len == 32))) return 1; + + return 0; +} + +static void hlfmt_hash_pwdump (char line_buf[BUFSIZ], int line_len, char **hashbuf_pos, int *hashbuf_len) +{ + char *pos = NULL; + int len = 0; + + int sep_cnt = 0; + + for (int i = 0; i < line_len; i++) + { + if (line_buf[i] == ':') + { + sep_cnt++; + + continue; + } + + if (data.hash_mode == 1000) + { + if (sep_cnt == 3) + { + if (pos == NULL) pos = line_buf + i; + + len++; + } + } + else if (data.hash_mode == 3000) + { + if (sep_cnt == 2) + { + if (pos == NULL) pos = line_buf + i; + + len++; + } + } + } + + *hashbuf_pos = pos; + *hashbuf_len = len; +} + +static void hlfmt_user_pwdump (char line_buf[BUFSIZ], int line_len, char **userbuf_pos, int *userbuf_len) +{ + char *pos = NULL; + int len = 0; + + int sep_cnt = 0; + + for (int i = 0; i < line_len; i++) + { + if (line_buf[i] == ':') + { + sep_cnt++; + + continue; + } + + if (sep_cnt == 0) + { + if (pos == NULL) pos = line_buf + i; + + len++; + } + } + + *userbuf_pos = pos; + *userbuf_len = len; +} + +// hlfmt passwd + +static int hlfmt_detect_passwd (char line_buf[BUFSIZ], int line_len) +{ + int sep_cnt = 0; + + char sep5_first = 0; + char sep6_first = 0; + + for (int i = 0; i < line_len; i++) + { + if (line_buf[i] == ':') + { + sep_cnt++; + + continue; + } + + if (sep_cnt == 5) if (sep5_first == 0) sep5_first = line_buf[i]; + if (sep_cnt == 6) if (sep6_first == 0) sep6_first = line_buf[i]; + } + + if ((sep_cnt == 6) && ((sep5_first == '/') || (sep6_first == '/'))) return 1; + + return 0; +} + +static void hlfmt_hash_passwd (char line_buf[BUFSIZ], int line_len, char **hashbuf_pos, int *hashbuf_len) +{ + char *pos = NULL; + int len = 0; + + int sep_cnt = 0; + + for (int i = 0; i < line_len; i++) + { + if (line_buf[i] == ':') + { + sep_cnt++; + + continue; + } + + if (sep_cnt == 1) + { + if (pos == NULL) pos = line_buf + i; + + len++; + } + } + + *hashbuf_pos = pos; + *hashbuf_len = len; +} + +static void hlfmt_user_passwd (char line_buf[BUFSIZ], int line_len, char **userbuf_pos, int *userbuf_len) +{ + char *pos = NULL; + int len = 0; + + int sep_cnt = 0; + + for (int i = 0; i < line_len; i++) + { + if (line_buf[i] == ':') + { + sep_cnt++; + + continue; + } + + if (sep_cnt == 0) + { + if (pos == NULL) pos = line_buf + i; + + len++; + } + } + + *userbuf_pos = pos; + *userbuf_len = len; +} + +// hlfmt shadow + +static int hlfmt_detect_shadow (char line_buf[BUFSIZ], int line_len) +{ + int sep_cnt = 0; + + for (int i = 0; i < line_len; i++) + { + if (line_buf[i] == ':') sep_cnt++; + } + + if (sep_cnt == 8) return 1; + + return 0; +} + +static void hlfmt_hash_shadow (char line_buf[BUFSIZ], int line_len, char **hashbuf_pos, int *hashbuf_len) +{ + hlfmt_hash_passwd (line_buf, line_len, hashbuf_pos, hashbuf_len); +} + +static void hlfmt_user_shadow (char line_buf[BUFSIZ], int line_len, char **userbuf_pos, int *userbuf_len) +{ + hlfmt_user_passwd (line_buf, line_len, userbuf_pos, userbuf_len); +} + +// hlfmt main + +static void hlfmt_hash (uint hashfile_format, char line_buf[BUFSIZ], int line_len, char **hashbuf_pos, int *hashbuf_len) +{ + switch (hashfile_format) + { + case HLFMT_HASHCAT: hlfmt_hash_hashcat (line_buf, line_len, hashbuf_pos, hashbuf_len); break; + case HLFMT_PWDUMP: hlfmt_hash_pwdump (line_buf, line_len, hashbuf_pos, hashbuf_len); break; + case HLFMT_PASSWD: hlfmt_hash_passwd (line_buf, line_len, hashbuf_pos, hashbuf_len); break; + case HLFMT_SHADOW: hlfmt_hash_shadow (line_buf, line_len, hashbuf_pos, hashbuf_len); break; + } +} + +static void hlfmt_user (uint hashfile_format, char line_buf[BUFSIZ], int line_len, char **userbuf_pos, int *userbuf_len) +{ + switch (hashfile_format) + { + case HLFMT_HASHCAT: hlfmt_user_hashcat (line_buf, line_len, userbuf_pos, userbuf_len); break; + case HLFMT_PWDUMP: hlfmt_user_pwdump (line_buf, line_len, userbuf_pos, userbuf_len); break; + case HLFMT_PASSWD: hlfmt_user_passwd (line_buf, line_len, userbuf_pos, userbuf_len); break; + case HLFMT_SHADOW: hlfmt_user_shadow (line_buf, line_len, userbuf_pos, userbuf_len); break; + } +} + +static uint hlfmt_detect (FILE *fp, uint max_check) +{ + // Exception: those formats are wrongly detected as HLFMT_SHADOW, prevent it + + if (data.hash_mode == 5300) return HLFMT_HASHCAT; + if (data.hash_mode == 5400) return HLFMT_HASHCAT; + + uint *formats_cnt = (uint *) mycalloc (HLFMTS_CNT, sizeof (uint)); + + uint num_check = 0; + + while (!feof (fp)) + { + char line_buf[BUFSIZ]; + + int line_len = fgetl (fp, line_buf); + + if (line_len == 0) continue; + + if (hlfmt_detect_pwdump (line_buf, line_len)) formats_cnt[HLFMT_PWDUMP]++; + if (hlfmt_detect_passwd (line_buf, line_len)) formats_cnt[HLFMT_PASSWD]++; + if (hlfmt_detect_shadow (line_buf, line_len)) formats_cnt[HLFMT_SHADOW]++; + + if (num_check == max_check) break; + + num_check++; + } + + uint hashlist_format = HLFMT_HASHCAT; + + for (int i = 1; i < HLFMTS_CNT; i++) + { + if (formats_cnt[i - 1] >= formats_cnt[i]) continue; + + hashlist_format = i; + } + + free (formats_cnt); + + return hashlist_format; +} + +/** + * main + */ + +#ifdef _OCL +void *__stdcall ADL_Main_Memory_Alloc (const int iSize) +{ + return mymalloc (iSize); +} +#endif + +static uint generate_bitmaps (const uint digests_cnt, const uint dgst_size, const uint dgst_shifts, char *digests_buf_ptr, const uint bitmap_mask, const uint bitmap_size, uint *bitmap_a, uint *bitmap_b, uint *bitmap_c, uint *bitmap_d, const uint64_t collisions_max) +{ + uint64_t collisions = 0; + + const uint dgst_pos0 = data.dgst_pos0; + const uint dgst_pos1 = data.dgst_pos1; + const uint dgst_pos2 = data.dgst_pos2; + const uint dgst_pos3 = data.dgst_pos3; + + memset (bitmap_a, 0, bitmap_size); + memset (bitmap_b, 0, bitmap_size); + memset (bitmap_c, 0, bitmap_size); + memset (bitmap_d, 0, bitmap_size); + + for (uint i = 0; i < digests_cnt; i++) + { + uint *digest_ptr = (uint *) digests_buf_ptr; + + digests_buf_ptr += dgst_size; + + const uint val0 = 1 << (digest_ptr[dgst_pos0] & 0x1f); + const uint val1 = 1 << (digest_ptr[dgst_pos1] & 0x1f); + const uint val2 = 1 << (digest_ptr[dgst_pos2] & 0x1f); + const uint val3 = 1 << (digest_ptr[dgst_pos3] & 0x1f); + + const uint idx0 = (digest_ptr[dgst_pos0] >> dgst_shifts) & bitmap_mask; + const uint idx1 = (digest_ptr[dgst_pos1] >> dgst_shifts) & bitmap_mask; + const uint idx2 = (digest_ptr[dgst_pos2] >> dgst_shifts) & bitmap_mask; + const uint idx3 = (digest_ptr[dgst_pos3] >> dgst_shifts) & bitmap_mask; + + if (bitmap_a[idx0] & val0) collisions++; + if (bitmap_b[idx1] & val1) collisions++; + if (bitmap_c[idx2] & val2) collisions++; + if (bitmap_d[idx3] & val3) collisions++; + + bitmap_a[idx0] |= val0; + bitmap_b[idx1] |= val1; + bitmap_c[idx2] |= val2; + bitmap_d[idx3] |= val3; + + if (collisions >= collisions_max) return 0x7fffffff; + } + + return collisions; +} + +int main (int argc, char **argv) +{ + /** + * To help users a bit + */ + + char *compute = getenv ("COMPUTE"); + + if (compute) + { + char display[100]; + + snprintf (display, sizeof (display) - 1, "DISPLAY=%s", compute); + + putenv (display); + } + else + { + if (getenv ("DISPLAY") == NULL) + putenv ((char *) "DISPLAY=:0"); + } + + /* + if (getenv ("GPU_MAX_ALLOC_PERCENT") == NULL) + putenv ((char *) "GPU_MAX_ALLOC_PERCENT=100"); + + if (getenv ("GPU_USE_SYNC_OBJECTS") == NULL) + putenv ((char *) "GPU_USE_SYNC_OBJECTS=1"); + */ + + /** + * Real init + */ + + memset (&data, 0, sizeof (hc_global_data_t)); + + time_t proc_start; + + time (&proc_start); + + data.proc_start = proc_start; + + int myargc = argc; + char **myargv = argv; + + hc_thread_mutex_init (mux_dispatcher); + hc_thread_mutex_init (mux_counter); + hc_thread_mutex_init (mux_display); + hc_thread_mutex_init (mux_adl); + + /** + * commandline parameters + */ + + uint usage = USAGE; + uint version = VERSION; + uint quiet = QUIET; + uint benchmark = BENCHMARK; + uint benchmark_mode = BENCHMARK_MODE; + uint show = SHOW; + uint left = LEFT; + uint username = USERNAME; + uint remove = REMOVE; + uint remove_timer = REMOVE_TIMER; + uint64_t skip = SKIP; + uint64_t limit = LIMIT; + uint keyspace = KEYSPACE; + uint potfile_disable = POTFILE_DISABLE; + uint debug_mode = DEBUG_MODE; + char *debug_file = NULL; + char *induction_dir = NULL; + char *outfile_check_dir = NULL; + uint force = FORCE; + uint runtime = RUNTIME; + uint hash_mode = HASH_MODE; + uint attack_mode = ATTACK_MODE; + uint markov_disable = MARKOV_DISABLE; + uint markov_classic = MARKOV_CLASSIC; + uint markov_threshold = MARKOV_THRESHOLD; + char *markov_hcstat = NULL; + char *outfile = NULL; + uint outfile_format = OUTFILE_FORMAT; + uint outfile_autohex = OUTFILE_AUTOHEX; + uint outfile_check_timer = OUTFILE_CHECK_TIMER; + uint restore = RESTORE; + uint restore_timer = RESTORE_TIMER; + uint restore_disable = RESTORE_DISABLE; + uint status = STATUS; + uint status_timer = STATUS_TIMER; + uint status_automat = STATUS_AUTOMAT; + uint loopback = LOOPBACK; + uint weak_hash_threshold = WEAK_HASH_THRESHOLD; + char *session = NULL; + uint hex_charset = HEX_CHARSET; + uint hex_salt = HEX_SALT; + uint hex_wordlist = HEX_WORDLIST; + uint rp_gen = RP_GEN; + uint rp_gen_func_min = RP_GEN_FUNC_MIN; + uint rp_gen_func_max = RP_GEN_FUNC_MAX; + uint rp_gen_seed = RP_GEN_SEED; + char *rule_buf_l = (char *) RULE_BUF_L; + char *rule_buf_r = (char *) RULE_BUF_R; + uint increment = INCREMENT; + uint increment_min = INCREMENT_MIN; + uint increment_max = INCREMENT_MAX; + char *cpu_affinity = NULL; + uint gpu_async = GPU_ASYNC; + char *gpu_devices = NULL; + char *truecrypt_keyfiles = NULL; + uint workload_profile = WORKLOAD_PROFILE; + uint gpu_accel = GPU_ACCEL; + uint gpu_loops = GPU_LOOPS; + uint gpu_temp_disable = GPU_TEMP_DISABLE; + uint gpu_temp_abort = GPU_TEMP_ABORT; + uint gpu_temp_retain = GPU_TEMP_RETAIN; + uint powertune_enable = POWERTUNE_ENABLE; + uint logfile_disable = LOGFILE_DISABLE; + uint segment_size = SEGMENT_SIZE; + uint scrypt_tmto = SCRYPT_TMTO; + char separator = SEPARATOR; + uint bitmap_min = BITMAP_MIN; + uint bitmap_max = BITMAP_MAX; + char *custom_charset_1 = NULL; + char *custom_charset_2 = NULL; + char *custom_charset_3 = NULL; + char *custom_charset_4 = NULL; + + #define IDX_HELP 'h' + #define IDX_VERSION 'V' + #define IDX_VERSION_LOWER 'v' + #define IDX_QUIET 0xff02 + #define IDX_SHOW 0xff03 + #define IDX_LEFT 0xff04 + #define IDX_REMOVE 0xff05 + #define IDX_REMOVE_TIMER 0xff37 + #define IDX_SKIP 's' + #define IDX_LIMIT 'l' + #define IDX_KEYSPACE 0xff35 + #define IDX_POTFILE_DISABLE 0xff06 + #define IDX_DEBUG_MODE 0xff43 + #define IDX_DEBUG_FILE 0xff44 + #define IDX_INDUCTION_DIR 0xff46 + #define IDX_OUTFILE_CHECK_DIR 0xff47 + #define IDX_USERNAME 0xff07 + #define IDX_FORCE 0xff08 + #define IDX_RUNTIME 0xff09 + #define IDX_BENCHMARK 'b' + #define IDX_BENCHMARK_MODE 0xff32 + #define IDX_HASH_MODE 'm' + #define IDX_ATTACK_MODE 'a' + #define IDX_RP_FILE 'r' + #define IDX_RP_GEN 'g' + #define IDX_RP_GEN_FUNC_MIN 0xff10 + #define IDX_RP_GEN_FUNC_MAX 0xff11 + #define IDX_RP_GEN_SEED 0xff34 + #define IDX_RULE_BUF_L 'j' + #define IDX_RULE_BUF_R 'k' + #define IDX_INCREMENT 'i' + #define IDX_INCREMENT_MIN 0xff12 + #define IDX_INCREMENT_MAX 0xff13 + #define IDX_OUTFILE 'o' + #define IDX_OUTFILE_FORMAT 0xff14 + #define IDX_OUTFILE_AUTOHEX_DISABLE 0xff39 + #define IDX_OUTFILE_CHECK_TIMER 0xff45 + #define IDX_RESTORE 0xff15 + #define IDX_RESTORE_DISABLE 0xff27 + #define IDX_STATUS 0xff17 + #define IDX_STATUS_TIMER 0xff18 + #define IDX_STATUS_AUTOMAT 0xff50 + #define IDX_LOOPBACK 0xff38 + #define IDX_WEAK_HASH_THRESHOLD 0xff42 + #define IDX_SESSION 0xff19 + #define IDX_HEX_CHARSET 0xff20 + #define IDX_HEX_SALT 0xff21 + #define IDX_HEX_WORDLIST 0xff40 + #define IDX_MARKOV_DISABLE 0xff22 + #define IDX_MARKOV_CLASSIC 0xff23 + #define IDX_MARKOV_THRESHOLD 't' + #define IDX_MARKOV_HCSTAT 0xff24 + #define IDX_CPU_AFFINITY 0xff25 + #define IDX_GPU_ASYNC 0xff26 + #define IDX_GPU_DEVICES 'd' + #define IDX_WORKLOAD_PROFILE 'w' + #define IDX_GPU_ACCEL 'n' + #define IDX_GPU_LOOPS 'u' + #define IDX_GPU_TEMP_DISABLE 0xff29 + #define IDX_GPU_TEMP_ABORT 0xff30 + #define IDX_GPU_TEMP_RETAIN 0xff31 + #define IDX_POWERTUNE_ENABLE 0xff41 + #define IDX_LOGFILE_DISABLE 0xff51 + #define IDX_TRUECRYPT_KEYFILES 0xff52 + #define IDX_SCRYPT_TMTO 0xff61 + #define IDX_SEGMENT_SIZE 'c' + #define IDX_SEPARATOR 'p' + #define IDX_BITMAP_MIN 0xff70 + #define IDX_BITMAP_MAX 0xff71 + #define IDX_CUSTOM_CHARSET_1 '1' + #define IDX_CUSTOM_CHARSET_2 '2' + #define IDX_CUSTOM_CHARSET_3 '3' + #define IDX_CUSTOM_CHARSET_4 '4' + + char short_options[] = "hVvm:a:r:j:k:g:o:t:d:n:u:c:p:s:l:1:2:3:4:ibw:"; + + struct option long_options[] = + { + {"help", no_argument, 0, IDX_HELP}, + {"version", no_argument, 0, IDX_VERSION}, + {"quiet", no_argument, 0, IDX_QUIET}, + {"show", no_argument, 0, IDX_SHOW}, + {"left", no_argument, 0, IDX_LEFT}, + {"username", no_argument, 0, IDX_USERNAME}, + {"remove", no_argument, 0, IDX_REMOVE}, + {"remove-timer", required_argument, 0, IDX_REMOVE_TIMER}, + {"skip", required_argument, 0, IDX_SKIP}, + {"limit", required_argument, 0, IDX_LIMIT}, + {"keyspace", no_argument, 0, IDX_KEYSPACE}, + {"potfile-disable", no_argument, 0, IDX_POTFILE_DISABLE}, + {"debug-mode", required_argument, 0, IDX_DEBUG_MODE}, + {"debug-file", required_argument, 0, IDX_DEBUG_FILE}, + {"induction-dir", required_argument, 0, IDX_INDUCTION_DIR}, + {"outfile-check-dir", required_argument, 0, IDX_OUTFILE_CHECK_DIR}, + {"force", no_argument, 0, IDX_FORCE}, + {"benchmark", no_argument, 0, IDX_BENCHMARK}, + {"benchmark-mode", required_argument, 0, IDX_BENCHMARK_MODE}, + {"restore", no_argument, 0, IDX_RESTORE}, + {"restore-disable", no_argument, 0, IDX_RESTORE_DISABLE}, + {"status", no_argument, 0, IDX_STATUS}, + {"status-timer", required_argument, 0, IDX_STATUS_TIMER}, + {"status-automat", no_argument, 0, IDX_STATUS_AUTOMAT}, + {"loopback", no_argument, 0, IDX_LOOPBACK}, + {"weak-hash-threshold", + required_argument, 0, IDX_WEAK_HASH_THRESHOLD}, + {"session", required_argument, 0, IDX_SESSION}, + {"runtime", required_argument, 0, IDX_RUNTIME}, + {"generate-rules", required_argument, 0, IDX_RP_GEN}, + {"generate-rules-func-min", + required_argument, 0, IDX_RP_GEN_FUNC_MIN}, + {"generate-rules-func-max", + required_argument, 0, IDX_RP_GEN_FUNC_MAX}, + {"generate-rules-seed", + required_argument, 0, IDX_RP_GEN_SEED}, + {"rule-left", required_argument, 0, IDX_RULE_BUF_L}, + {"rule-right", required_argument, 0, IDX_RULE_BUF_R}, + {"hash-type", required_argument, 0, IDX_HASH_MODE}, + {"attack-mode", required_argument, 0, IDX_ATTACK_MODE}, + {"rules-file", required_argument, 0, IDX_RP_FILE}, + {"outfile", required_argument, 0, IDX_OUTFILE}, + {"outfile-format", required_argument, 0, IDX_OUTFILE_FORMAT}, + {"outfile-autohex-disable", + no_argument, 0, IDX_OUTFILE_AUTOHEX_DISABLE}, + {"outfile-check-timer", + required_argument, 0, IDX_OUTFILE_CHECK_TIMER}, + {"hex-charset", no_argument, 0, IDX_HEX_CHARSET}, + {"hex-salt", no_argument, 0, IDX_HEX_SALT}, + {"hex-wordlist", no_argument, 0, IDX_HEX_WORDLIST}, + {"markov-disable", no_argument, 0, IDX_MARKOV_DISABLE}, + {"markov-classic", no_argument, 0, IDX_MARKOV_CLASSIC}, + {"markov-threshold", required_argument, 0, IDX_MARKOV_THRESHOLD}, + {"markov-hcstat", required_argument, 0, IDX_MARKOV_HCSTAT}, + {"cpu-affinity", required_argument, 0, IDX_CPU_AFFINITY}, + {"gpu-async", no_argument, 0, IDX_GPU_ASYNC}, + {"gpu-devices", required_argument, 0, IDX_GPU_DEVICES}, + {"workload-profile", required_argument, 0, IDX_WORKLOAD_PROFILE}, + {"gpu-accel", required_argument, 0, IDX_GPU_ACCEL}, + {"gpu-loops", required_argument, 0, IDX_GPU_LOOPS}, + {"gpu-temp-disable", no_argument, 0, IDX_GPU_TEMP_DISABLE}, + {"gpu-temp-abort", required_argument, 0, IDX_GPU_TEMP_ABORT}, + {"gpu-temp-retain", required_argument, 0, IDX_GPU_TEMP_RETAIN}, + {"powertune-enable", no_argument, 0, IDX_POWERTUNE_ENABLE}, + {"logfile-disable", no_argument, 0, IDX_LOGFILE_DISABLE}, + {"truecrypt-keyfiles", required_argument, 0, IDX_TRUECRYPT_KEYFILES}, + {"segment-size", required_argument, 0, IDX_SEGMENT_SIZE}, + {"scrypt-tmto", required_argument, 0, IDX_SCRYPT_TMTO}, + // deprecated + {"seperator", required_argument, 0, IDX_SEPARATOR}, + {"separator", required_argument, 0, IDX_SEPARATOR}, + {"bitmap-min", required_argument, 0, IDX_BITMAP_MIN}, + {"bitmap-max", required_argument, 0, IDX_BITMAP_MAX}, + {"increment", no_argument, 0, IDX_INCREMENT}, + {"increment-min", required_argument, 0, IDX_INCREMENT_MIN}, + {"increment-max", required_argument, 0, IDX_INCREMENT_MAX}, + {"custom-charset1", required_argument, 0, IDX_CUSTOM_CHARSET_1}, + {"custom-charset2", required_argument, 0, IDX_CUSTOM_CHARSET_2}, + {"custom-charset3", required_argument, 0, IDX_CUSTOM_CHARSET_3}, + {"custom-charset4", required_argument, 0, IDX_CUSTOM_CHARSET_4}, + + {0, 0, 0, 0} + }; + + uint rp_files_cnt = 0; + + char **rp_files = (char **) mycalloc (argc, sizeof (char *)); + + int option_index; + int c; + + optind = 1; + optopt = 0; + option_index = 0; + + while (((c = getopt_long (argc, argv, short_options, long_options, &option_index)) != -1) && optopt == 0) + { + switch (c) + { + case IDX_HELP: usage = 1; break; + case IDX_VERSION: + case IDX_VERSION_LOWER: version = 1; break; + case IDX_RESTORE: restore = 1; break; + case IDX_SESSION: session = optarg; break; + case IDX_SHOW: show = 1; break; + case IDX_LEFT: left = 1; break; + case '?': return (-1); + } + } + + if (optopt != 0) + { + log_error ("ERROR: Invalid argument specified"); + + return (-1); + } + + /** + * exit functions + */ + + if (version) + { + log_info (VERSION_TXT); + + return (0); + } + + if (usage) + { + usage_big_print (PROGNAME); + + return (0); + } + + /** + * session + */ + + if (session == NULL) session = (char *) PROGNAME; + + size_t session_size = strlen (session) + 32; + + data.session = session; + + char *eff_restore_file = (char *) mymalloc (session_size); + char *new_restore_file = (char *) mymalloc (session_size); + + snprintf (eff_restore_file, session_size - 1, "%s.restore", session); + snprintf (new_restore_file, session_size - 1, "%s.restore.new", session); + + data.eff_restore_file = eff_restore_file; + data.new_restore_file = new_restore_file; + + if (((show == 1) || (left == 1)) && (restore == 1)) + { + if (show == 1) log_error ("ERROR: Mixing --restore parameter and --show is not supported"); + else log_error ("ERROR: Mixing --restore parameter and --left is not supported"); + + return (-1); + } + + // this allows the user to use --show and --left while cracking (i.e. while another instance of oclHashcat is running) + if ((show == 1) || (left == 1)) + { + restore_disable = 1; + + restore = 0; + } + + data.restore_disable = restore_disable; + + restore_data_t *rd = init_restore (argc, argv); + + data.rd = rd; + + /** + * restore file + */ + + if (restore == 1) + { + read_restore (eff_restore_file, rd); + + if (rd->version_bin < RESTORE_MIN) + { + log_error ("ERROR: Incompatible restore-file version"); + + return (-1); + } + + myargc = rd->argc; + myargv = rd->argv; + + #ifdef _POSIX + rd->pid = getpid (); + #elif _WIN + rd->pid = GetCurrentProcessId (); + #endif + } + + uint hash_mode_chgd = 0; + uint runtime_chgd = 0; + uint gpu_loops_chgd = 0; + uint gpu_accel_chgd = 0; + uint attack_mode_chgd = 0; + uint outfile_format_chgd = 0; + uint rp_gen_seed_chgd = 0; + uint remove_timer_chgd = 0; + uint increment_min_chgd = 0; + uint increment_max_chgd = 0; + + #if _OCL + uint gpu_temp_abort_chgd = 0; + uint gpu_temp_retain_chgd = 0; + #endif + + optind = 1; + optopt = 0; + option_index = 0; + + while (((c = getopt_long (myargc, myargv, short_options, long_options, &option_index)) != -1) && optopt == 0) + { + switch (c) + { + //case IDX_HELP: usage = 1; break; + //case IDX_VERSION: version = 1; break; + //case IDX_RESTORE: restore = 1; break; + case IDX_QUIET: quiet = 1; break; + //case IDX_SHOW: show = 1; break; + case IDX_SHOW: break; + //case IDX_LEFT: left = 1; break; + case IDX_LEFT: break; + case IDX_USERNAME: username = 1; break; + case IDX_REMOVE: remove = 1; break; + case IDX_REMOVE_TIMER: remove_timer = atoi (optarg); + remove_timer_chgd = 1; break; + case IDX_POTFILE_DISABLE: potfile_disable = 1; break; + case IDX_DEBUG_MODE: debug_mode = atoi (optarg); break; + case IDX_DEBUG_FILE: debug_file = optarg; break; + case IDX_INDUCTION_DIR: induction_dir = optarg; break; + case IDX_OUTFILE_CHECK_DIR: outfile_check_dir = optarg; break; + case IDX_FORCE: force = 1; break; + case IDX_SKIP: skip = atoll (optarg); break; + case IDX_LIMIT: limit = atoll (optarg); break; + case IDX_KEYSPACE: keyspace = 1; break; + case IDX_BENCHMARK: benchmark = 1; break; + case IDX_BENCHMARK_MODE: benchmark_mode = atoi (optarg); break; + case IDX_RESTORE: break; + case IDX_RESTORE_DISABLE: restore_disable = 1; break; + case IDX_STATUS: status = 1; break; + case IDX_STATUS_TIMER: status_timer = atoi (optarg); break; + case IDX_STATUS_AUTOMAT: status_automat = 1; break; + case IDX_LOOPBACK: loopback = 1; break; + case IDX_WEAK_HASH_THRESHOLD: + weak_hash_threshold = atoi (optarg); break; + //case IDX_SESSION: session = optarg; break; + case IDX_SESSION: break; + case IDX_HASH_MODE: hash_mode = atoi (optarg); + hash_mode_chgd = 1; break; + case IDX_RUNTIME: runtime = atoi (optarg); + runtime_chgd = 1; break; + case IDX_ATTACK_MODE: attack_mode = atoi (optarg); + attack_mode_chgd = 1; break; + case IDX_RP_FILE: rp_files[rp_files_cnt++] = optarg; break; + case IDX_RP_GEN: rp_gen = atoi (optarg); break; + case IDX_RP_GEN_FUNC_MIN: rp_gen_func_min = atoi (optarg); break; + case IDX_RP_GEN_FUNC_MAX: rp_gen_func_max = atoi (optarg); break; + case IDX_RP_GEN_SEED: rp_gen_seed = atoi (optarg); + rp_gen_seed_chgd = 1; break; + case IDX_RULE_BUF_L: rule_buf_l = optarg; break; + case IDX_RULE_BUF_R: rule_buf_r = optarg; break; + case IDX_MARKOV_DISABLE: markov_disable = 1; break; + case IDX_MARKOV_CLASSIC: markov_classic = 1; break; + case IDX_MARKOV_THRESHOLD: markov_threshold = atoi (optarg); break; + case IDX_MARKOV_HCSTAT: markov_hcstat = optarg; break; + case IDX_OUTFILE: outfile = optarg; break; + case IDX_OUTFILE_FORMAT: outfile_format = atoi (optarg); + outfile_format_chgd = 1; break; + case IDX_OUTFILE_AUTOHEX_DISABLE: + outfile_autohex = 0; break; + case IDX_OUTFILE_CHECK_TIMER: + outfile_check_timer = atoi (optarg); break; + case IDX_HEX_CHARSET: hex_charset = 1; break; + case IDX_HEX_SALT: hex_salt = 1; break; + case IDX_HEX_WORDLIST: hex_wordlist = 1; break; + case IDX_CPU_AFFINITY: cpu_affinity = optarg; break; + case IDX_GPU_ASYNC: gpu_async = 1; break; + case IDX_GPU_DEVICES: gpu_devices = optarg; break; + case IDX_WORKLOAD_PROFILE: workload_profile = atoi (optarg); break; + case IDX_GPU_ACCEL: gpu_accel = atoi (optarg); + gpu_accel_chgd = 1; break; + case IDX_GPU_LOOPS: gpu_loops = atoi (optarg); + gpu_loops_chgd = 1; break; + case IDX_GPU_TEMP_DISABLE: gpu_temp_disable = 1; break; + case IDX_GPU_TEMP_ABORT: + #if _OCL + gpu_temp_abort_chgd = 1; + #endif + gpu_temp_abort = atoi (optarg); break; + case IDX_GPU_TEMP_RETAIN: + #if _OCL + gpu_temp_retain_chgd = 1; + #endif + gpu_temp_retain = atoi (optarg); break; + case IDX_POWERTUNE_ENABLE: powertune_enable = 1; break; + case IDX_LOGFILE_DISABLE: logfile_disable = 1; break; + case IDX_TRUECRYPT_KEYFILES: truecrypt_keyfiles = optarg; break; + case IDX_SEGMENT_SIZE: segment_size = atoi (optarg); break; + case IDX_SCRYPT_TMTO: scrypt_tmto = atoi (optarg); break; + case IDX_SEPARATOR: separator = optarg[0]; break; + case IDX_BITMAP_MIN: bitmap_min = atoi (optarg); break; + case IDX_BITMAP_MAX: bitmap_max = atoi (optarg); break; + case IDX_INCREMENT: increment = 1; break; + case IDX_INCREMENT_MIN: increment_min = atoi (optarg); + increment_min_chgd = 1; break; + case IDX_INCREMENT_MAX: increment_max = atoi (optarg); + increment_max_chgd = 1; break; + case IDX_CUSTOM_CHARSET_1: custom_charset_1 = optarg; break; + case IDX_CUSTOM_CHARSET_2: custom_charset_2 = optarg; break; + case IDX_CUSTOM_CHARSET_3: custom_charset_3 = optarg; break; + case IDX_CUSTOM_CHARSET_4: custom_charset_4 = optarg; break; + + default: + log_error ("ERROR: Invalid argument specified"); + return (-1); + } + } + + if (optopt != 0) + { + log_error ("ERROR: Invalid argument specified"); + + return (-1); + } + + /** + * Inform user things getting started, + * - this is giving us a visual header before preparations start, so we do not need to clear them afterwards + * - we do not need to check algorithm_pos + */ + + if (quiet == 0) + { + if (benchmark == 1) + { + log_info ("%s v%.2f starting in benchmark-mode...", PROGNAME, (float) VERSION_BIN / 100); + + log_info (""); + } + else if (restore == 1) + { + log_info ("%s v%.2f starting in restore-mode...", PROGNAME, (float) VERSION_BIN / 100); + + log_info (""); + } + else + { + log_info ("%s v%.2f starting...", PROGNAME, (float) VERSION_BIN / 100); + + log_info (""); + } + } + + /** + * sanity check + */ + + if (attack_mode > 7) + { + log_error ("ERROR: Invalid attack-mode specified"); + + return (-1); + } + + if (runtime_chgd && runtime == 0) // just added to remove compiler warnings for runtime_chgd + { + log_error ("ERROR: Invalid runtime specified"); + + return (-1); + } + + if (hash_mode_chgd && hash_mode > 12800) // just added to remove compiler warnings for hash_mode_chgd + { + log_error ("ERROR: Invalid hash-type specified"); + + return (-1); + } + + // renamed hash modes + + if (hash_mode_chgd) + { + int n = -1; + + switch (hash_mode) + { + case 123: n = 124; + break; + } + + if (n >= 0) + { + log_error ("Old -m specified, use -m %d instead", n); + + return (-1); + } + } + + if (username == 1) + { + if ((hash_mode == 2500) || (hash_mode == 5200) || ((hash_mode >= 6200) && (hash_mode <= 6299))) + { + log_error ("ERROR: Mixing support for user names and hashes of type %s is not supported", strhashtype (hash_mode)); + + return (-1); + } + } + + if (outfile_format > 16) + { + log_error ("ERROR: Invalid outfile-format specified"); + + return (-1); + } + + if (left == 1) + { + if (outfile_format_chgd == 1) + { + if (outfile_format > 1) + { + log_error ("ERROR: Mixing outfile-format > 1 is not allowed together with left parameter"); + + return (-1); + } + } + else + { + outfile_format = OUTFILE_FMT_HASH; + } + } + + if (show == 1) + { + if (outfile_format_chgd == 1) + { + if ((outfile_format > 7) && (outfile_format < 16)) + { + log_error ("ERROR: Mixing outfile-format > 7 is not allowed together with show parameter"); + + return (-1); + } + } + } + + if (increment_min < INCREMENT_MIN) + { + log_error ("ERROR: Invalid increment-min specified"); + + return (-1); + } + + if (increment_max > INCREMENT_MAX) + { + log_error ("ERROR: Invalid increment-max specified"); + + return (-1); + } + + if (increment_min > increment_max) + { + log_error ("ERROR: Invalid increment-min specified"); + + return (-1); + } + + if ((increment == 1) && (attack_mode == ATTACK_MODE_STRAIGHT)) + { + log_error ("ERROR: increment is not allowed in attack-mode 0"); + + return (-1); + } + + if ((increment == 0) && (increment_min_chgd == 1)) + { + log_error ("ERROR: increment-min is only supported together with increment switch"); + + return (-1); + } + + if ((increment == 0) && (increment_max_chgd == 1)) + { + log_error ("ERROR: increment-max is only supported together with increment switch"); + + return (-1); + } + + if (rp_files_cnt && rp_gen) + { + log_error ("ERROR: Use of both rules-file and rules-generate is not supported"); + + return (-1); + } + + if (rp_files_cnt || rp_gen) + { + if (attack_mode != ATTACK_MODE_STRAIGHT) + { + log_error ("ERROR: Use of rules-file or rules-generate only allowed in attack-mode 0"); + + return (-1); + } + } + + if (rp_gen_func_min > rp_gen_func_max) + { + log_error ("ERROR: Invalid rp-gen-func-min specified"); + + return (-1); + } + + if (gpu_accel_chgd == 1) + { + if (workload_profile != WORKLOAD_PROFILE) + { + log_error ("ERROR: gpu-accel parameter can only be set when workload-profile %i is used", WORKLOAD_PROFILE); + + return (-1); + } + + if (gpu_accel < 1) + { + log_error ("ERROR: Invalid gpu-accel specified"); + + return (-1); + } + + if (gpu_accel > 800) + { + log_error ("ERROR: Invalid gpu-accel specified"); + + return (-1); + } + } + + if (gpu_loops_chgd == 1) + { + if (workload_profile != WORKLOAD_PROFILE) + { + log_error ("ERROR: gpu-loops parameter can only be set when workload-profile %i is used", WORKLOAD_PROFILE); + + return (-1); + } + + if (gpu_loops < 1) + { + log_error ("ERROR: Invalid gpu-loops specified"); + + return (-1); + } + + if (gpu_loops > 1024) + { + log_error ("ERROR: Invalid gpu-loops specified"); + + return (-1); + } + } + + if (benchmark == 1) + { + if (workload_profile != WORKLOAD_PROFILE) + { + log_error ("ERROR: Using the workload-profile in benchmark mode is not allowed"); + + return (-1); + } + } + + if ((workload_profile < 1) || (workload_profile > 3)) + { + log_error ("ERROR: workload-profile %i not available", workload_profile); + + return (-1); + } + + if (show == 1 || left == 1) + { + attack_mode = ATTACK_MODE_NONE; + + if (remove == 1) + { + log_error ("ERROR: Mixing remove parameter not allowed with show parameter or left parameter"); + + return (-1); + } + + if (potfile_disable == 1) + { + log_error ("ERROR: Mixing potfile-disable parameter not allowed with show parameter or left parameter"); + + return (-1); + } + } + + uint attack_kern = ATTACK_KERN_NONE; + + switch (attack_mode) + { + case ATTACK_MODE_STRAIGHT: attack_kern = ATTACK_KERN_STRAIGHT; break; + case ATTACK_MODE_COMBI: attack_kern = ATTACK_KERN_COMBI; break; + case ATTACK_MODE_BF: attack_kern = ATTACK_KERN_BF; break; + case ATTACK_MODE_HYBRID1: attack_kern = ATTACK_KERN_COMBI; break; + case ATTACK_MODE_HYBRID2: attack_kern = ATTACK_KERN_COMBI; break; + } + + if (benchmark == 0) + { + if (keyspace == 1) + { + int num_additional_params = 1; + + if (attack_kern == ATTACK_KERN_COMBI) + { + num_additional_params = 2; + } + + int keyspace_wordlist_specified = myargc - optind - num_additional_params; + + if (keyspace_wordlist_specified == 0) optind--; + } + + if (attack_kern == ATTACK_KERN_NONE) + { + if ((optind + 1) != myargc) + { + usage_mini_print (myargv[0]); + + return (-1); + } + } + else if (attack_kern == ATTACK_KERN_STRAIGHT) + { + if ((optind + 1) > myargc) + { + usage_mini_print (myargv[0]); + + return (-1); + } + } + else if (attack_kern == ATTACK_KERN_COMBI) + { + if ((optind + 3) != myargc) + { + usage_mini_print (myargv[0]); + + return (-1); + } + } + else if (attack_kern == ATTACK_KERN_BF) + { + if ((optind + 1) > myargc) + { + usage_mini_print (myargv[0]); + + return (-1); + } + } + else + { + usage_mini_print (myargv[0]); + + return (-1); + } + } + else + { + if (myargv[optind] != 0) + { + log_error ("ERROR: Invalid argument for benchmark mode specified"); + + return (-1); + } + + if (attack_mode_chgd == 1) + { + if (attack_mode != ATTACK_MODE_BF) + { + log_error ("ERROR: Only attack-mode 3 allowed in benchmark mode"); + + return (-1); + } + } + + if (benchmark_mode == 0) + { + // nothing to do + } + else if (benchmark_mode == 1) + { + if (gpu_accel_chgd == 1 || gpu_loops_chgd == 1) + { + log_error ("ERROR: Benchmark-mode 1 does not allow gpu-accel or gpu-loops changed"); + + return (-1); + } + } + else + { + log_error ("ERROR: Benchmark-mode must be 0 or 1"); + + return (-1); + } + } + + if (skip != 0 && limit != 0) + { + limit += skip; + } + + if (keyspace == 1) + { + if (show == 1) + { + log_error ("ERROR: Mixing show parameter not supported with keyspace parameter"); + + return (-1); + } + else if (left == 1) + { + log_error ("ERROR: Mixing left parameter not supported wiht keyspace parameter"); + + return (-1); + } + + potfile_disable = 1; + + restore_disable = 1; + + restore = 0; + + weak_hash_threshold = 0; + + quiet = 1; + } + + if (remove_timer_chgd == 1) + { + if (remove == 0) + { + log_error ("ERROR: Parameter remove-timer require parameter remove enabled"); + + return (-1); + } + + if (remove_timer < 1) + { + log_error ("ERROR: Parameter remove-timer must have a value greater than or equal to 1"); + + return (-1); + } + } + + if (loopback == 1) + { + if (attack_mode == ATTACK_MODE_BF) + { + log_error ("ERROR: Parameter loopback not allowed in attack-mode 3"); + + return (-1); + } + else if (attack_mode == ATTACK_MODE_STRAIGHT) + { + if ((rp_files_cnt == 0) && (rp_gen == 0)) + { + log_error ("ERROR: Parameter loopback not allowed without rules-file or rules-generate"); + + return (-1); + } + } + } + + if (debug_mode > 0) + { + if (attack_mode != ATTACK_MODE_STRAIGHT) + { + log_error ("ERROR: Parameter debug-mode option is only available with attack-mode 0"); + + return (-1); + } + + if ((rp_files_cnt == 0) && (rp_gen == 0)) + { + log_error ("ERROR: Parameter debug-mode not allowed without rules-file or rules-generate"); + + return (-1); + } + } + + if (debug_mode > 4) + { + log_error ("ERROR: Invalid debug-mode specified"); + + return (-1); + } + + if (debug_file != NULL) + { + if (debug_mode < 1) + { + log_error ("ERROR: Parameter debug-file requires parameter debug-mode to be set"); + + return (-1); + } + } + + if (induction_dir != NULL) + { + if (attack_mode == ATTACK_MODE_BF) + { + log_error ("ERROR: Parameter induction-dir not allowed with brute-force attacks"); + + return (-1); + } + } + + /** + * induction directory + */ + + char *induction_directory = NULL; + + if (attack_mode != ATTACK_MODE_BF) + { + if (induction_dir == NULL) + { + induction_directory = (char *) mymalloc (session_size); + + snprintf (induction_directory, session_size - 1, "%s.%s", session, INDUCT_DIR); + + // create induction folder if it does not already exist + + if (keyspace == 0) + { + if (rmdir (induction_directory) == -1) + { + if (errno == ENOENT) + { + // good, we can ignore + } + else if (errno == ENOTEMPTY) + { + char *induction_directory_mv = (char *) mymalloc (session_size); + + snprintf (induction_directory_mv, session_size - 1, "%s.induct.%d", session, (int) proc_start); + + if (rename (induction_directory, induction_directory_mv) != 0) + { + log_error ("ERROR: Rename directory %s to %s: %s", induction_directory, induction_directory_mv, strerror (errno)); + + return (-1); + } + } + else + { + log_error ("ERROR: %s: %s", induction_directory, strerror (errno)); + + return (-1); + } + } + + #ifdef _WIN + #define mkdir(name,mode) mkdir (name) + #endif + + if (mkdir (induction_directory, 0700) == -1) + { + log_error ("ERROR: %s: %s", induction_directory, strerror (errno)); + + return (-1); + } + } + } + else + { + induction_directory = induction_dir; + } + } + + data.induction_directory = induction_directory; + + /** + * loopback + */ + + size_t loopback_size = session_size + strlen (LOOPBACK_FILE) + 12; + + char *loopback_file = (char *) mymalloc (loopback_size); + + /** + * outfile-check directory + */ + + char *outfile_check_directory = NULL; + + if (outfile_check_dir == NULL) + { + outfile_check_directory = (char *) mymalloc (session_size); + + snprintf (outfile_check_directory, session_size - 1, "%s.%s", session, OUTFILES_DIR); + } + else + { + outfile_check_directory = outfile_check_dir; + } + + data.outfile_check_directory = outfile_check_directory; + + if (keyspace == 0) + { + struct stat outfile_check_stat; + + if (stat (outfile_check_directory, &outfile_check_stat) == 0) + { + uint is_dir = S_ISDIR (outfile_check_stat.st_mode); + + if (is_dir == 0) + { + log_error ("ERROR: Directory specified in outfile-check '%s' is not a valid directory", outfile_check_directory); + + return (-1); + } + } + else if (outfile_check_dir == NULL) + { + #ifdef _WIN + #define mkdir(name,mode) mkdir (name) + #endif + + if (mkdir (outfile_check_directory, 0700) == -1) + { + log_error ("ERROR: %s: %s", outfile_check_directory, strerror (errno)); + + return (-1); + } + } + } + + /** + * special other stuff + */ + + if (hash_mode == 9710) + { + outfile_format = 5; + outfile_format_chgd = 1; + } + + if (hash_mode == 9810) + { + outfile_format = 5; + outfile_format_chgd = 1; + } + + if (hash_mode == 10410) + { + outfile_format = 5; + outfile_format_chgd = 1; + } + + /** + * store stuff + */ + + data.hash_mode = hash_mode; + data.restore = restore; + data.restore_timer = restore_timer; + data.restore_disable = restore_disable; + data.status = status; + data.status_timer = status_timer; + data.status_automat = status_automat; + data.loopback = loopback; + data.runtime = runtime; + data.remove = remove; + data.remove_timer = remove_timer; + data.debug_mode = debug_mode; + data.debug_file = debug_file; + data.username = username; + data.quiet = quiet; + data.outfile = outfile; + data.outfile_format = outfile_format; + data.outfile_autohex = outfile_autohex; + data.hex_charset = hex_charset; + data.hex_salt = hex_salt; + data.hex_wordlist = hex_wordlist; + data.separator = separator; + data.rp_files = rp_files; + data.rp_files_cnt = rp_files_cnt; + data.rp_gen = rp_gen; + data.rp_gen_seed = rp_gen_seed; + data.force = force; + data.benchmark = benchmark; + data.skip = skip; + data.limit = limit; + data.powertune_enable = powertune_enable; + data.logfile_disable = logfile_disable; + data.truecrypt_keyfiles = truecrypt_keyfiles; + data.scrypt_tmto = scrypt_tmto; + + /** + * install_dir + */ + + char *install_dir = get_install_dir (myargv[0]); + + data.install_dir = install_dir; + + /** + * cpu affinity + */ + + if (cpu_affinity) + { + set_cpu_affinity (cpu_affinity); + } + + if (rp_gen_seed_chgd == 0) + { + srand (proc_start); + } + else + { + srand (rp_gen_seed); + } + + /** + * logfile init + */ + + if (logfile_disable == 0) + { + size_t logfile_size = strlen (session) + 32; + + char *logfile = (char *) mymalloc (logfile_size); + + snprintf (logfile, logfile_size - 1, "%s.log", session); + + data.logfile = logfile; + + char *topid = logfile_generate_topid (); + + data.topid = topid; + } + + // logfile_append() checks for logfile_disable internally to make it easier from here + + #define logfile_top_msg(msg) logfile_append ("%s\t%s", data.topid, (msg)); + #define logfile_sub_msg(msg) logfile_append ("%s\t%s\t%s", data.topid, data.subid, (msg)); + #define logfile_top_var_uint64(var,val) logfile_append ("%s\t%s\t%llu", data.topid, (var), (val)); + #define logfile_sub_var_uint64(var,val) logfile_append ("%s\t%s\t%s\t%llu", data.topid, data.subid, (var), (val)); + #define logfile_top_var_uint(var,val) logfile_append ("%s\t%s\t%u", data.topid, (var), (val)); + #define logfile_sub_var_uint(var,val) logfile_append ("%s\t%s\t%s\t%u", data.topid, data.subid, (var), (val)); + #define logfile_top_var_char(var,val) logfile_append ("%s\t%s\t%c", data.topid, (var), (val)); + #define logfile_sub_var_char(var,val) logfile_append ("%s\t%s\t%s\t%c", data.topid, data.subid, (var), (val)); + #define logfile_top_var_string(var,val) if ((val) != NULL) logfile_append ("%s\t%s\t%s", data.topid, (var), (val)); + #define logfile_sub_var_string(var,val) if ((val) != NULL) logfile_append ("%s\t%s\t%s\t%s", data.topid, data.subid, (var), (val)); + + #define logfile_top_uint64(var) logfile_top_var_uint64 (#var, (var)); + #define logfile_sub_uint64(var) logfile_sub_var_uint64 (#var, (var)); + #define logfile_top_uint(var) logfile_top_var_uint (#var, (var)); + #define logfile_sub_uint(var) logfile_sub_var_uint (#var, (var)); + #define logfile_top_char(var) logfile_top_var_char (#var, (var)); + #define logfile_sub_char(var) logfile_sub_var_char (#var, (var)); + #define logfile_top_string(var) logfile_top_var_string (#var, (var)); + #define logfile_sub_string(var) logfile_sub_var_string (#var, (var)); + + logfile_top_msg ("START"); + + logfile_top_uint (attack_mode); + logfile_top_uint (attack_kern); + logfile_top_uint (benchmark); + logfile_top_uint (benchmark_mode); + logfile_top_uint (bitmap_min); + logfile_top_uint (bitmap_max); + logfile_top_uint (debug_mode); + logfile_top_uint (force); + logfile_top_uint (gpu_accel); + logfile_top_uint (gpu_async); + logfile_top_uint (gpu_loops); + logfile_top_uint (gpu_temp_abort); + logfile_top_uint (gpu_temp_disable); + logfile_top_uint (gpu_temp_retain); + logfile_top_uint (hash_mode); + logfile_top_uint (hex_charset); + logfile_top_uint (hex_salt); + logfile_top_uint (hex_wordlist); + logfile_top_uint (increment); + logfile_top_uint (increment_max); + logfile_top_uint (increment_min); + logfile_top_uint (keyspace); + logfile_top_uint (left); + logfile_top_uint (logfile_disable); + logfile_top_uint (loopback); + logfile_top_uint (markov_classic); + logfile_top_uint (markov_disable); + logfile_top_uint (markov_threshold); + logfile_top_uint (outfile_autohex); + logfile_top_uint (outfile_check_timer); + logfile_top_uint (outfile_format); + logfile_top_uint (potfile_disable); + logfile_top_uint (powertune_enable); + logfile_top_uint (scrypt_tmto); + logfile_top_uint (quiet); + logfile_top_uint (remove); + logfile_top_uint (remove_timer); + logfile_top_uint (restore); + logfile_top_uint (restore_disable); + logfile_top_uint (restore_timer); + logfile_top_uint (rp_gen); + logfile_top_uint (rp_gen_func_max); + logfile_top_uint (rp_gen_func_min); + logfile_top_uint (rp_gen_seed); + logfile_top_uint (runtime); + logfile_top_uint (segment_size); + logfile_top_uint (show); + logfile_top_uint (status); + logfile_top_uint (status_automat); + logfile_top_uint (status_timer); + logfile_top_uint (usage); + logfile_top_uint (username); + logfile_top_uint (version); + logfile_top_uint (weak_hash_threshold); + logfile_top_uint (workload_profile); + logfile_top_uint64 (limit); + logfile_top_uint64 (skip); + logfile_top_char (separator); + logfile_top_string (cpu_affinity); + logfile_top_string (custom_charset_1); + logfile_top_string (custom_charset_2); + logfile_top_string (custom_charset_3); + logfile_top_string (custom_charset_4); + logfile_top_string (debug_file); + logfile_top_string (gpu_devices); + logfile_top_string (induction_dir); + logfile_top_string (markov_hcstat); + logfile_top_string (outfile); + logfile_top_string (outfile_check_dir); + logfile_top_string (rule_buf_l); + logfile_top_string (rule_buf_r); + logfile_top_string (session); + logfile_top_string (truecrypt_keyfiles); + + /** + * devices + */ + + uint gpu_devicemask = devices_to_devicemask (gpu_devices); + + /** + * benchmark + */ + + if (benchmark == 1) + { + /** + * disable useless stuff for benchmark + */ + + restore_timer = 0; + status_timer = 0; + restore_disable = 1; + potfile_disable = 1; + weak_hash_threshold = 0; + + data.restore_timer = restore_timer; + data.status_timer = status_timer; + data.restore_disable = restore_disable; + + if (benchmark_mode == 1) + { + markov_disable = 1; + } + + /** + * force attack mode to be bruteforce + */ + + attack_mode = ATTACK_MODE_BF; + attack_kern = ATTACK_KERN_BF; + + if (runtime_chgd == 0) + { + runtime = 4; + + if (benchmark_mode == 1) runtime = 17; + + data.runtime = runtime; + } + } + + /** + * config + */ + + uint hash_type = 0; + uint salt_type = 0; + uint attack_exec = 0; + uint opts_type = 0; + uint kern_type = 0; + uint dgst_size = 0; + uint esalt_size = 0; + uint opti_type = 0; + uint dgst_pos0 = -1; + uint dgst_pos1 = -1; + uint dgst_pos2 = -1; + uint dgst_pos3 = -1; + + int (*parse_func) (char *, uint, hash_t *); + int (*sort_by_digest) (const void *, const void *); + + uint algorithm_pos = 0; + uint algorithm_max = 1; + + uint *algorithms = default_benchmark_algorithms; + + if (benchmark == 1 && hash_mode_chgd == 0) algorithm_max = NUM_DEFAULT_BENCHMARK_ALGORITHMS; + + for (algorithm_pos = 0; algorithm_pos < algorithm_max; algorithm_pos++) + { + /* + * We need to reset 'rd' in benchmark mode otherwise when the user hits 'bypass' + * the following algos are skipped entirely + */ + + if (algorithm_pos > 0) + { + local_free (rd); + + rd = init_restore (argc, argv); + + data.rd = rd; + } + + /** + * update hash_mode in case of multihash benchmark + */ + + if (benchmark == 1) + { + if (hash_mode_chgd == 0) + { + hash_mode = algorithms[algorithm_pos]; + + data.hash_mode = hash_mode; + } + + quiet = 1; + + data.quiet = quiet; + } + + switch (hash_mode) + { + case 0: hash_type = HASH_TYPE_MD5; + salt_type = SALT_TYPE_NONE; + attack_exec = ATTACK_EXEC_ON_GPU; + opts_type = OPTS_TYPE_PT_GENERATE_LE + | OPTS_TYPE_PT_ADD80 + | OPTS_TYPE_PT_ADDBITS14; + kern_type = KERN_TYPE_MD5; + dgst_size = DGST_SIZE_4_4; + parse_func = md5_parse_hash; + sort_by_digest = sort_by_digest_4_4; + opti_type = OPTI_TYPE_ZERO_BYTE + | OPTI_TYPE_PRECOMPUTE_INIT + | OPTI_TYPE_PRECOMPUTE_MERKLE + | OPTI_TYPE_SCALAR_MODE + | OPTI_TYPE_MEET_IN_MIDDLE + | OPTI_TYPE_EARLY_SKIP + | OPTI_TYPE_NOT_ITERATED + | OPTI_TYPE_NOT_SALTED + | OPTI_TYPE_RAW_HASH; + dgst_pos0 = 0; + dgst_pos1 = 3; + dgst_pos2 = 2; + dgst_pos3 = 1; + break; + + case 10: hash_type = HASH_TYPE_MD5; + salt_type = SALT_TYPE_INTERN; + attack_exec = ATTACK_EXEC_ON_GPU; + opts_type = OPTS_TYPE_PT_GENERATE_LE + | OPTS_TYPE_ST_ADD80 + | OPTS_TYPE_ST_ADDBITS14; + kern_type = KERN_TYPE_MD5_PWSLT; + dgst_size = DGST_SIZE_4_4; + parse_func = md5s_parse_hash; + sort_by_digest = sort_by_digest_4_4; + opti_type = OPTI_TYPE_ZERO_BYTE + | OPTI_TYPE_PRECOMPUTE_INIT + | OPTI_TYPE_PRECOMPUTE_MERKLE + | OPTI_TYPE_SCALAR_MODE + | OPTI_TYPE_MEET_IN_MIDDLE + | OPTI_TYPE_EARLY_SKIP + | OPTI_TYPE_NOT_ITERATED + | OPTI_TYPE_APPENDED_SALT + | OPTI_TYPE_RAW_HASH; + dgst_pos0 = 0; + dgst_pos1 = 3; + dgst_pos2 = 2; + dgst_pos3 = 1; + break; + + case 11: hash_type = HASH_TYPE_MD5; + salt_type = SALT_TYPE_INTERN; + attack_exec = ATTACK_EXEC_ON_GPU; + opts_type = OPTS_TYPE_PT_GENERATE_LE + | OPTS_TYPE_ST_ADD80 + | OPTS_TYPE_ST_ADDBITS14; + kern_type = KERN_TYPE_MD5_PWSLT; + dgst_size = DGST_SIZE_4_4; + parse_func = joomla_parse_hash; + sort_by_digest = sort_by_digest_4_4; + opti_type = OPTI_TYPE_ZERO_BYTE + | OPTI_TYPE_PRECOMPUTE_INIT + | OPTI_TYPE_PRECOMPUTE_MERKLE + | OPTI_TYPE_SCALAR_MODE + | OPTI_TYPE_MEET_IN_MIDDLE + | OPTI_TYPE_EARLY_SKIP + | OPTI_TYPE_NOT_ITERATED + | OPTI_TYPE_APPENDED_SALT + | OPTI_TYPE_RAW_HASH; + dgst_pos0 = 0; + dgst_pos1 = 3; + dgst_pos2 = 2; + dgst_pos3 = 1; + break; + + case 12: hash_type = HASH_TYPE_MD5; + salt_type = SALT_TYPE_INTERN; + attack_exec = ATTACK_EXEC_ON_GPU; + opts_type = OPTS_TYPE_PT_GENERATE_LE + | OPTS_TYPE_ST_ADD80 + | OPTS_TYPE_ST_ADDBITS14; + kern_type = KERN_TYPE_MD5_PWSLT; + dgst_size = DGST_SIZE_4_4; + parse_func = postgresql_parse_hash; + sort_by_digest = sort_by_digest_4_4; + opti_type = OPTI_TYPE_ZERO_BYTE + | OPTI_TYPE_PRECOMPUTE_INIT + | OPTI_TYPE_PRECOMPUTE_MERKLE + | OPTI_TYPE_SCALAR_MODE + | OPTI_TYPE_MEET_IN_MIDDLE + | OPTI_TYPE_EARLY_SKIP + | OPTI_TYPE_NOT_ITERATED + | OPTI_TYPE_APPENDED_SALT + | OPTI_TYPE_RAW_HASH; + dgst_pos0 = 0; + dgst_pos1 = 3; + dgst_pos2 = 2; + dgst_pos3 = 1; + break; + + case 20: hash_type = HASH_TYPE_MD5; + salt_type = SALT_TYPE_INTERN; + attack_exec = ATTACK_EXEC_ON_GPU; + opts_type = OPTS_TYPE_PT_GENERATE_LE + | OPTS_TYPE_PT_ADD80 + | OPTS_TYPE_PT_ADDBITS14; + kern_type = KERN_TYPE_MD5_SLTPW; + dgst_size = DGST_SIZE_4_4; + parse_func = md5s_parse_hash; + sort_by_digest = sort_by_digest_4_4; + opti_type = OPTI_TYPE_ZERO_BYTE + | OPTI_TYPE_PRECOMPUTE_INIT + | OPTI_TYPE_PRECOMPUTE_MERKLE + | OPTI_TYPE_EARLY_SKIP + | OPTI_TYPE_NOT_ITERATED + | OPTI_TYPE_PREPENDED_SALT + | OPTI_TYPE_RAW_HASH; + dgst_pos0 = 0; + dgst_pos1 = 3; + dgst_pos2 = 2; + dgst_pos3 = 1; + break; + + case 21: hash_type = HASH_TYPE_MD5; + salt_type = SALT_TYPE_INTERN; + attack_exec = ATTACK_EXEC_ON_GPU; + opts_type = OPTS_TYPE_PT_GENERATE_LE + | OPTS_TYPE_PT_ADD80 + | OPTS_TYPE_PT_ADDBITS14; + kern_type = KERN_TYPE_MD5_SLTPW; + dgst_size = DGST_SIZE_4_4; + parse_func = osc_parse_hash; + sort_by_digest = sort_by_digest_4_4; + opti_type = OPTI_TYPE_ZERO_BYTE + | OPTI_TYPE_PRECOMPUTE_INIT + | OPTI_TYPE_PRECOMPUTE_MERKLE + | OPTI_TYPE_EARLY_SKIP + | OPTI_TYPE_NOT_ITERATED + | OPTI_TYPE_PREPENDED_SALT + | OPTI_TYPE_RAW_HASH; + dgst_pos0 = 0; + dgst_pos1 = 3; + dgst_pos2 = 2; + dgst_pos3 = 1; + break; + + case 22: hash_type = HASH_TYPE_MD5; + salt_type = SALT_TYPE_EMBEDDED; + attack_exec = ATTACK_EXEC_ON_GPU; + opts_type = OPTS_TYPE_PT_GENERATE_LE + | OPTS_TYPE_PT_ADD80 + | OPTS_TYPE_PT_ADDBITS14; + kern_type = KERN_TYPE_MD5_SLTPW; + dgst_size = DGST_SIZE_4_4; + parse_func = netscreen_parse_hash; + sort_by_digest = sort_by_digest_4_4; + opti_type = OPTI_TYPE_ZERO_BYTE + | OPTI_TYPE_PRECOMPUTE_INIT + | OPTI_TYPE_PRECOMPUTE_MERKLE + | OPTI_TYPE_EARLY_SKIP + | OPTI_TYPE_NOT_ITERATED + | OPTI_TYPE_PREPENDED_SALT + | OPTI_TYPE_RAW_HASH; + dgst_pos0 = 0; + dgst_pos1 = 3; + dgst_pos2 = 2; + dgst_pos3 = 1; + break; + + case 23: hash_type = HASH_TYPE_MD5; + salt_type = SALT_TYPE_EMBEDDED; + attack_exec = ATTACK_EXEC_ON_GPU; + opts_type = OPTS_TYPE_PT_GENERATE_LE + | OPTS_TYPE_PT_ADD80 + | OPTS_TYPE_PT_ADDBITS14; + kern_type = KERN_TYPE_MD5_SLTPW; + dgst_size = DGST_SIZE_4_4; + parse_func = skype_parse_hash; + sort_by_digest = sort_by_digest_4_4; + opti_type = OPTI_TYPE_ZERO_BYTE + | OPTI_TYPE_PRECOMPUTE_INIT + | OPTI_TYPE_PRECOMPUTE_MERKLE + | OPTI_TYPE_EARLY_SKIP + | OPTI_TYPE_NOT_ITERATED + | OPTI_TYPE_PREPENDED_SALT + | OPTI_TYPE_RAW_HASH; + dgst_pos0 = 0; + dgst_pos1 = 3; + dgst_pos2 = 2; + dgst_pos3 = 1; + break; + + case 30: hash_type = HASH_TYPE_MD5; + salt_type = SALT_TYPE_INTERN; + attack_exec = ATTACK_EXEC_ON_GPU; + opts_type = OPTS_TYPE_PT_GENERATE_LE + | OPTS_TYPE_PT_UNICODE + | OPTS_TYPE_ST_ADD80 + | OPTS_TYPE_ST_ADDBITS14; + kern_type = KERN_TYPE_MD5_PWUSLT; + dgst_size = DGST_SIZE_4_4; + parse_func = md5s_parse_hash; + sort_by_digest = sort_by_digest_4_4; + opti_type = OPTI_TYPE_ZERO_BYTE + | OPTI_TYPE_PRECOMPUTE_INIT + | OPTI_TYPE_PRECOMPUTE_MERKLE + | OPTI_TYPE_SCALAR_MODE + | OPTI_TYPE_MEET_IN_MIDDLE + | OPTI_TYPE_EARLY_SKIP + | OPTI_TYPE_NOT_ITERATED + | OPTI_TYPE_APPENDED_SALT + | OPTI_TYPE_RAW_HASH; + dgst_pos0 = 0; + dgst_pos1 = 3; + dgst_pos2 = 2; + dgst_pos3 = 1; + break; + + case 40: hash_type = HASH_TYPE_MD5; + salt_type = SALT_TYPE_INTERN; + attack_exec = ATTACK_EXEC_ON_GPU; + opts_type = OPTS_TYPE_PT_GENERATE_LE + | OPTS_TYPE_PT_ADD80 + | OPTS_TYPE_PT_ADDBITS14 + | OPTS_TYPE_PT_UNICODE; + kern_type = KERN_TYPE_MD5_SLTPWU; + dgst_size = DGST_SIZE_4_4; + parse_func = md5s_parse_hash; + sort_by_digest = sort_by_digest_4_4; + opti_type = OPTI_TYPE_ZERO_BYTE + | OPTI_TYPE_PRECOMPUTE_INIT + | OPTI_TYPE_PRECOMPUTE_MERKLE + | OPTI_TYPE_EARLY_SKIP + | OPTI_TYPE_NOT_ITERATED + | OPTI_TYPE_PREPENDED_SALT + | OPTI_TYPE_RAW_HASH; + dgst_pos0 = 0; + dgst_pos1 = 3; + dgst_pos2 = 2; + dgst_pos3 = 1; + break; + + case 50: hash_type = HASH_TYPE_MD5; + salt_type = SALT_TYPE_INTERN; + attack_exec = ATTACK_EXEC_ON_GPU; + opts_type = OPTS_TYPE_PT_GENERATE_LE + | OPTS_TYPE_ST_ADD80 + | OPTS_TYPE_ST_ADDBITS14; + kern_type = KERN_TYPE_HMACMD5_PW; + dgst_size = DGST_SIZE_4_4; + parse_func = hmacmd5_parse_hash; + sort_by_digest = sort_by_digest_4_4; + opti_type = OPTI_TYPE_ZERO_BYTE + | OPTI_TYPE_NOT_ITERATED; + dgst_pos0 = 0; + dgst_pos1 = 3; + dgst_pos2 = 2; + dgst_pos3 = 1; + break; + + case 60: hash_type = HASH_TYPE_MD5; + salt_type = SALT_TYPE_INTERN; + attack_exec = ATTACK_EXEC_ON_GPU; + opts_type = OPTS_TYPE_PT_GENERATE_LE + | OPTS_TYPE_PT_ADD80 + | OPTS_TYPE_PT_ADDBITS14; + kern_type = KERN_TYPE_HMACMD5_SLT; + dgst_size = DGST_SIZE_4_4; + parse_func = hmacmd5_parse_hash; + sort_by_digest = sort_by_digest_4_4; + opti_type = OPTI_TYPE_ZERO_BYTE + | OPTI_TYPE_NOT_ITERATED; + dgst_pos0 = 0; + dgst_pos1 = 3; + dgst_pos2 = 2; + dgst_pos3 = 1; + break; + + case 100: hash_type = HASH_TYPE_SHA1; + salt_type = SALT_TYPE_NONE; + attack_exec = ATTACK_EXEC_ON_GPU; + opts_type = OPTS_TYPE_PT_GENERATE_BE + | OPTS_TYPE_PT_ADD80 + | OPTS_TYPE_PT_ADDBITS15; + kern_type = KERN_TYPE_SHA1; + dgst_size = DGST_SIZE_4_5; + parse_func = sha1_parse_hash; + sort_by_digest = sort_by_digest_4_5; + opti_type = OPTI_TYPE_ZERO_BYTE + | OPTI_TYPE_PRECOMPUTE_INIT + | OPTI_TYPE_PRECOMPUTE_MERKLE + | OPTI_TYPE_SCALAR_MODE + | OPTI_TYPE_EARLY_SKIP + | OPTI_TYPE_NOT_ITERATED + | OPTI_TYPE_NOT_SALTED + | OPTI_TYPE_RAW_HASH; + dgst_pos0 = 3; + dgst_pos1 = 4; + dgst_pos2 = 2; + dgst_pos3 = 1; + break; + + case 101: hash_type = HASH_TYPE_SHA1; + salt_type = SALT_TYPE_NONE; + attack_exec = ATTACK_EXEC_ON_GPU; + opts_type = OPTS_TYPE_PT_GENERATE_BE + | OPTS_TYPE_PT_ADD80 + | OPTS_TYPE_PT_ADDBITS15; + kern_type = KERN_TYPE_SHA1; + dgst_size = DGST_SIZE_4_5; + parse_func = sha1b64_parse_hash; + sort_by_digest = sort_by_digest_4_5; + opti_type = OPTI_TYPE_ZERO_BYTE + | OPTI_TYPE_PRECOMPUTE_INIT + | OPTI_TYPE_PRECOMPUTE_MERKLE + | OPTI_TYPE_SCALAR_MODE + | OPTI_TYPE_EARLY_SKIP + | OPTI_TYPE_NOT_ITERATED + | OPTI_TYPE_NOT_SALTED + | OPTI_TYPE_RAW_HASH; + dgst_pos0 = 3; + dgst_pos1 = 4; + dgst_pos2 = 2; + dgst_pos3 = 1; + break; + + case 110: hash_type = HASH_TYPE_SHA1; + salt_type = SALT_TYPE_INTERN; + attack_exec = ATTACK_EXEC_ON_GPU; + opts_type = OPTS_TYPE_PT_GENERATE_BE + | OPTS_TYPE_ST_ADD80 + | OPTS_TYPE_ST_ADDBITS15; + kern_type = KERN_TYPE_SHA1_PWSLT; + dgst_size = DGST_SIZE_4_5; + parse_func = sha1s_parse_hash; + sort_by_digest = sort_by_digest_4_5; + opti_type = OPTI_TYPE_ZERO_BYTE + | OPTI_TYPE_PRECOMPUTE_INIT + | OPTI_TYPE_PRECOMPUTE_MERKLE + | OPTI_TYPE_SCALAR_MODE + | OPTI_TYPE_EARLY_SKIP + | OPTI_TYPE_NOT_ITERATED + | OPTI_TYPE_APPENDED_SALT + | OPTI_TYPE_RAW_HASH; + dgst_pos0 = 3; + dgst_pos1 = 4; + dgst_pos2 = 2; + dgst_pos3 = 1; + break; + + case 111: hash_type = HASH_TYPE_SHA1; + salt_type = SALT_TYPE_EMBEDDED; + attack_exec = ATTACK_EXEC_ON_GPU; + opts_type = OPTS_TYPE_PT_GENERATE_BE + | OPTS_TYPE_ST_ADD80 + | OPTS_TYPE_ST_ADDBITS15; + kern_type = KERN_TYPE_SHA1_PWSLT; + dgst_size = DGST_SIZE_4_5; + parse_func = sha1b64s_parse_hash; + sort_by_digest = sort_by_digest_4_5; + opti_type = OPTI_TYPE_ZERO_BYTE + | OPTI_TYPE_PRECOMPUTE_INIT + | OPTI_TYPE_PRECOMPUTE_MERKLE + | OPTI_TYPE_SCALAR_MODE + | OPTI_TYPE_EARLY_SKIP + | OPTI_TYPE_NOT_ITERATED + | OPTI_TYPE_APPENDED_SALT + | OPTI_TYPE_RAW_HASH; + dgst_pos0 = 3; + dgst_pos1 = 4; + dgst_pos2 = 2; + dgst_pos3 = 1; + break; + + case 112: hash_type = HASH_TYPE_SHA1; + salt_type = SALT_TYPE_INTERN; + attack_exec = ATTACK_EXEC_ON_GPU; + opts_type = OPTS_TYPE_PT_GENERATE_BE + | OPTS_TYPE_ST_ADD80 + | OPTS_TYPE_ST_ADDBITS15 + | OPTS_TYPE_ST_HEX; + kern_type = KERN_TYPE_SHA1_PWSLT; + dgst_size = DGST_SIZE_4_5; + parse_func = oracles_parse_hash; + sort_by_digest = sort_by_digest_4_5; + opti_type = OPTI_TYPE_ZERO_BYTE + | OPTI_TYPE_PRECOMPUTE_INIT + | OPTI_TYPE_PRECOMPUTE_MERKLE + | OPTI_TYPE_SCALAR_MODE + | OPTI_TYPE_EARLY_SKIP + | OPTI_TYPE_NOT_ITERATED + | OPTI_TYPE_APPENDED_SALT + | OPTI_TYPE_RAW_HASH; + dgst_pos0 = 3; + dgst_pos1 = 4; + dgst_pos2 = 2; + dgst_pos3 = 1; + break; + + case 120: hash_type = HASH_TYPE_SHA1; + salt_type = SALT_TYPE_INTERN; + attack_exec = ATTACK_EXEC_ON_GPU; + opts_type = OPTS_TYPE_PT_GENERATE_BE + | OPTS_TYPE_PT_ADD80 + | OPTS_TYPE_PT_ADDBITS15; + kern_type = KERN_TYPE_SHA1_SLTPW; + dgst_size = DGST_SIZE_4_5; + parse_func = sha1s_parse_hash; + sort_by_digest = sort_by_digest_4_5; + opti_type = OPTI_TYPE_ZERO_BYTE + | OPTI_TYPE_PRECOMPUTE_INIT + | OPTI_TYPE_PRECOMPUTE_MERKLE + | OPTI_TYPE_EARLY_SKIP + | OPTI_TYPE_NOT_ITERATED + | OPTI_TYPE_PREPENDED_SALT + | OPTI_TYPE_RAW_HASH; + dgst_pos0 = 3; + dgst_pos1 = 4; + dgst_pos2 = 2; + dgst_pos3 = 1; + break; + + case 121: hash_type = HASH_TYPE_SHA1; + salt_type = SALT_TYPE_INTERN; + attack_exec = ATTACK_EXEC_ON_GPU; + opts_type = OPTS_TYPE_PT_GENERATE_BE + | OPTS_TYPE_PT_ADD80 + | OPTS_TYPE_PT_ADDBITS15 + | OPTS_TYPE_ST_LOWER; + kern_type = KERN_TYPE_SHA1_SLTPW; + dgst_size = DGST_SIZE_4_5; + parse_func = smf_parse_hash; + sort_by_digest = sort_by_digest_4_5; + opti_type = OPTI_TYPE_ZERO_BYTE + | OPTI_TYPE_PRECOMPUTE_INIT + | OPTI_TYPE_PRECOMPUTE_MERKLE + | OPTI_TYPE_EARLY_SKIP + | OPTI_TYPE_NOT_ITERATED + | OPTI_TYPE_PREPENDED_SALT + | OPTI_TYPE_RAW_HASH; + dgst_pos0 = 3; + dgst_pos1 = 4; + dgst_pos2 = 2; + dgst_pos3 = 1; + break; + + case 122: hash_type = HASH_TYPE_SHA1; + salt_type = SALT_TYPE_EMBEDDED; + attack_exec = ATTACK_EXEC_ON_GPU; + opts_type = OPTS_TYPE_PT_GENERATE_BE + | OPTS_TYPE_PT_ADD80 + | OPTS_TYPE_PT_ADDBITS15 + | OPTS_TYPE_ST_HEX; + kern_type = KERN_TYPE_SHA1_SLTPW; + dgst_size = DGST_SIZE_4_5; + parse_func = osx1_parse_hash; + sort_by_digest = sort_by_digest_4_5; + opti_type = OPTI_TYPE_ZERO_BYTE + | OPTI_TYPE_PRECOMPUTE_INIT + | OPTI_TYPE_PRECOMPUTE_MERKLE + | OPTI_TYPE_EARLY_SKIP + | OPTI_TYPE_NOT_ITERATED + | OPTI_TYPE_PREPENDED_SALT + | OPTI_TYPE_RAW_HASH; + dgst_pos0 = 3; + dgst_pos1 = 4; + dgst_pos2 = 2; + dgst_pos3 = 1; + break; + + case 124: hash_type = HASH_TYPE_SHA1; + salt_type = SALT_TYPE_EMBEDDED; + attack_exec = ATTACK_EXEC_ON_GPU; + opts_type = OPTS_TYPE_PT_GENERATE_BE + | OPTS_TYPE_PT_ADD80 + | OPTS_TYPE_PT_ADDBITS15; + kern_type = KERN_TYPE_SHA1_SLTPW; + dgst_size = DGST_SIZE_4_5; + parse_func = djangosha1_parse_hash; + sort_by_digest = sort_by_digest_4_5; + opti_type = OPTI_TYPE_ZERO_BYTE + | OPTI_TYPE_PRECOMPUTE_INIT + | OPTI_TYPE_PRECOMPUTE_MERKLE + | OPTI_TYPE_EARLY_SKIP + | OPTI_TYPE_NOT_ITERATED + | OPTI_TYPE_PREPENDED_SALT + | OPTI_TYPE_RAW_HASH; + dgst_pos0 = 3; + dgst_pos1 = 4; + dgst_pos2 = 2; + dgst_pos3 = 1; + break; + + case 130: hash_type = HASH_TYPE_SHA1; + salt_type = SALT_TYPE_INTERN; + attack_exec = ATTACK_EXEC_ON_GPU; + opts_type = OPTS_TYPE_PT_GENERATE_BE + | OPTS_TYPE_PT_UNICODE + | OPTS_TYPE_ST_ADD80 + | OPTS_TYPE_ST_ADDBITS15; + kern_type = KERN_TYPE_SHA1_PWUSLT; + dgst_size = DGST_SIZE_4_5; + parse_func = sha1s_parse_hash; + sort_by_digest = sort_by_digest_4_5; + opti_type = OPTI_TYPE_ZERO_BYTE + | OPTI_TYPE_PRECOMPUTE_INIT + | OPTI_TYPE_PRECOMPUTE_MERKLE + | OPTI_TYPE_SCALAR_MODE + | OPTI_TYPE_EARLY_SKIP + | OPTI_TYPE_NOT_ITERATED + | OPTI_TYPE_APPENDED_SALT + | OPTI_TYPE_RAW_HASH; + dgst_pos0 = 3; + dgst_pos1 = 4; + dgst_pos2 = 2; + dgst_pos3 = 1; + break; + + case 131: hash_type = HASH_TYPE_SHA1; + salt_type = SALT_TYPE_EMBEDDED; + attack_exec = ATTACK_EXEC_ON_GPU; + opts_type = OPTS_TYPE_PT_GENERATE_BE + | OPTS_TYPE_PT_UNICODE + | OPTS_TYPE_PT_UPPER + | OPTS_TYPE_ST_ADD80 + | OPTS_TYPE_ST_ADDBITS15 + | OPTS_TYPE_ST_HEX; + kern_type = KERN_TYPE_SHA1_PWUSLT; + dgst_size = DGST_SIZE_4_5; + parse_func = mssql2000_parse_hash; + sort_by_digest = sort_by_digest_4_5; + opti_type = OPTI_TYPE_ZERO_BYTE + | OPTI_TYPE_PRECOMPUTE_INIT + | OPTI_TYPE_PRECOMPUTE_MERKLE + | OPTI_TYPE_SCALAR_MODE + | OPTI_TYPE_EARLY_SKIP + | OPTI_TYPE_NOT_ITERATED + | OPTI_TYPE_APPENDED_SALT + | OPTI_TYPE_RAW_HASH; + dgst_pos0 = 3; + dgst_pos1 = 4; + dgst_pos2 = 2; + dgst_pos3 = 1; + break; + + case 132: hash_type = HASH_TYPE_SHA1; + salt_type = SALT_TYPE_EMBEDDED; + attack_exec = ATTACK_EXEC_ON_GPU; + opts_type = OPTS_TYPE_PT_GENERATE_BE + | OPTS_TYPE_PT_UNICODE + | OPTS_TYPE_ST_ADD80 + | OPTS_TYPE_ST_ADDBITS15 + | OPTS_TYPE_ST_HEX; + kern_type = KERN_TYPE_SHA1_PWUSLT; + dgst_size = DGST_SIZE_4_5; + parse_func = mssql2005_parse_hash; + sort_by_digest = sort_by_digest_4_5; + opti_type = OPTI_TYPE_ZERO_BYTE + | OPTI_TYPE_PRECOMPUTE_INIT + | OPTI_TYPE_PRECOMPUTE_MERKLE + | OPTI_TYPE_SCALAR_MODE + | OPTI_TYPE_EARLY_SKIP + | OPTI_TYPE_NOT_ITERATED + | OPTI_TYPE_APPENDED_SALT + | OPTI_TYPE_RAW_HASH; + dgst_pos0 = 3; + dgst_pos1 = 4; + dgst_pos2 = 2; + dgst_pos3 = 1; + break; + + case 133: hash_type = HASH_TYPE_SHA1; + salt_type = SALT_TYPE_EMBEDDED; + attack_exec = ATTACK_EXEC_ON_GPU; + opts_type = OPTS_TYPE_PT_GENERATE_BE + | OPTS_TYPE_PT_UNICODE + | OPTS_TYPE_ST_ADD80 + | OPTS_TYPE_ST_ADDBITS15; + kern_type = KERN_TYPE_SHA1_PWUSLT; + dgst_size = DGST_SIZE_4_5; + parse_func = peoplesoft_parse_hash; + sort_by_digest = sort_by_digest_4_5; + opti_type = OPTI_TYPE_ZERO_BYTE + | OPTI_TYPE_PRECOMPUTE_INIT + | OPTI_TYPE_PRECOMPUTE_MERKLE + | OPTI_TYPE_SCALAR_MODE + | OPTI_TYPE_EARLY_SKIP + | OPTI_TYPE_NOT_ITERATED + | OPTI_TYPE_APPENDED_SALT + | OPTI_TYPE_RAW_HASH; + dgst_pos0 = 3; + dgst_pos1 = 4; + dgst_pos2 = 2; + dgst_pos3 = 1; + break; + + case 140: hash_type = HASH_TYPE_SHA1; + salt_type = SALT_TYPE_INTERN; + attack_exec = ATTACK_EXEC_ON_GPU; + opts_type = OPTS_TYPE_PT_GENERATE_BE + | OPTS_TYPE_PT_ADD80 + | OPTS_TYPE_PT_ADDBITS15 + | OPTS_TYPE_PT_UNICODE; + kern_type = KERN_TYPE_SHA1_SLTPWU; + dgst_size = DGST_SIZE_4_5; + parse_func = sha1s_parse_hash; + sort_by_digest = sort_by_digest_4_5; + opti_type = OPTI_TYPE_ZERO_BYTE + | OPTI_TYPE_PRECOMPUTE_INIT + | OPTI_TYPE_PRECOMPUTE_MERKLE + | OPTI_TYPE_EARLY_SKIP + | OPTI_TYPE_NOT_ITERATED + | OPTI_TYPE_PREPENDED_SALT + | OPTI_TYPE_RAW_HASH; + dgst_pos0 = 3; + dgst_pos1 = 4; + dgst_pos2 = 2; + dgst_pos3 = 1; + break; + + case 141: hash_type = HASH_TYPE_SHA1; + salt_type = SALT_TYPE_EMBEDDED; + attack_exec = ATTACK_EXEC_ON_GPU; + opts_type = OPTS_TYPE_PT_GENERATE_BE + | OPTS_TYPE_PT_ADD80 + | OPTS_TYPE_PT_ADDBITS15 + | OPTS_TYPE_PT_UNICODE + | OPTS_TYPE_ST_BASE64; + kern_type = KERN_TYPE_SHA1_SLTPWU; + dgst_size = DGST_SIZE_4_5; + parse_func = episerver_parse_hash; + sort_by_digest = sort_by_digest_4_5; + opti_type = OPTI_TYPE_ZERO_BYTE + | OPTI_TYPE_PRECOMPUTE_INIT + | OPTI_TYPE_PRECOMPUTE_MERKLE + | OPTI_TYPE_EARLY_SKIP + | OPTI_TYPE_NOT_ITERATED + | OPTI_TYPE_PREPENDED_SALT + | OPTI_TYPE_RAW_HASH; + dgst_pos0 = 3; + dgst_pos1 = 4; + dgst_pos2 = 2; + dgst_pos3 = 1; + break; + + case 150: hash_type = HASH_TYPE_SHA1; + salt_type = SALT_TYPE_INTERN; + attack_exec = ATTACK_EXEC_ON_GPU; + opts_type = OPTS_TYPE_PT_GENERATE_BE + | OPTS_TYPE_ST_ADD80 + | OPTS_TYPE_ST_ADDBITS15; + kern_type = KERN_TYPE_HMACSHA1_PW; + dgst_size = DGST_SIZE_4_5; + parse_func = hmacsha1_parse_hash; + sort_by_digest = sort_by_digest_4_5; + opti_type = OPTI_TYPE_ZERO_BYTE + | OPTI_TYPE_NOT_ITERATED; + dgst_pos0 = 3; + dgst_pos1 = 4; + dgst_pos2 = 2; + dgst_pos3 = 1; + break; + + case 160: hash_type = HASH_TYPE_SHA1; + salt_type = SALT_TYPE_INTERN; + attack_exec = ATTACK_EXEC_ON_GPU; + opts_type = OPTS_TYPE_PT_GENERATE_BE + | OPTS_TYPE_PT_ADD80 + | OPTS_TYPE_PT_ADDBITS15; + kern_type = KERN_TYPE_HMACSHA1_SLT; + dgst_size = DGST_SIZE_4_5; + parse_func = hmacsha1_parse_hash; + sort_by_digest = sort_by_digest_4_5; + opti_type = OPTI_TYPE_ZERO_BYTE + | OPTI_TYPE_NOT_ITERATED; + dgst_pos0 = 3; + dgst_pos1 = 4; + dgst_pos2 = 2; + dgst_pos3 = 1; + break; + + case 190: hash_type = HASH_TYPE_SHA1; + salt_type = SALT_TYPE_NONE; + attack_exec = ATTACK_EXEC_ON_GPU; + opts_type = OPTS_TYPE_PT_GENERATE_BE + | OPTS_TYPE_PT_ADD80 + | OPTS_TYPE_PT_ADDBITS15; + kern_type = KERN_TYPE_SHA1_LINKEDIN; + dgst_size = DGST_SIZE_4_5; + parse_func = sha1linkedin_parse_hash; + sort_by_digest = sort_by_digest_4_5; + opti_type = OPTI_TYPE_ZERO_BYTE + | OPTI_TYPE_PRECOMPUTE_INIT + | OPTI_TYPE_SCALAR_MODE + | OPTI_TYPE_EARLY_SKIP + | OPTI_TYPE_NOT_ITERATED + | OPTI_TYPE_NOT_SALTED; + dgst_pos0 = 0; + dgst_pos1 = 4; + dgst_pos2 = 3; + dgst_pos3 = 2; + break; + + case 200: hash_type = HASH_TYPE_MYSQL; + salt_type = SALT_TYPE_NONE; + attack_exec = ATTACK_EXEC_ON_GPU; + opts_type = 0; + kern_type = KERN_TYPE_MYSQL; + dgst_size = DGST_SIZE_4_4; // originally DGST_SIZE_4_2 + parse_func = mysql323_parse_hash; + sort_by_digest = sort_by_digest_4_4; // originally sort_by_digest_4_2 + opti_type = OPTI_TYPE_ZERO_BYTE + | OPTI_TYPE_SCALAR_MODE; + dgst_pos0 = 0; + dgst_pos1 = 1; + dgst_pos2 = 2; + dgst_pos3 = 3; + break; + + case 300: hash_type = HASH_TYPE_SHA1; + salt_type = SALT_TYPE_NONE; + attack_exec = ATTACK_EXEC_ON_GPU; + opts_type = OPTS_TYPE_PT_GENERATE_BE + | OPTS_TYPE_PT_ADD80 + | OPTS_TYPE_PT_ADDBITS15; + kern_type = KERN_TYPE_MYSQL41; + dgst_size = DGST_SIZE_4_5; + parse_func = sha1_parse_hash; + sort_by_digest = sort_by_digest_4_5; + opti_type = OPTI_TYPE_ZERO_BYTE + | OPTI_TYPE_PRECOMPUTE_INIT + | OPTI_TYPE_PRECOMPUTE_MERKLE + | OPTI_TYPE_SCALAR_MODE + | OPTI_TYPE_EARLY_SKIP + | OPTI_TYPE_NOT_ITERATED + | OPTI_TYPE_NOT_SALTED; + dgst_pos0 = 3; + dgst_pos1 = 4; + dgst_pos2 = 2; + dgst_pos3 = 1; + break; + + case 400: hash_type = HASH_TYPE_MD5; + salt_type = SALT_TYPE_EMBEDDED; + attack_exec = ATTACK_EXEC_ON_CPU; + opts_type = OPTS_TYPE_PT_GENERATE_LE; + kern_type = KERN_TYPE_PHPASS; + dgst_size = DGST_SIZE_4_4; + parse_func = phpass_parse_hash; + sort_by_digest = sort_by_digest_4_4; + opti_type = OPTI_TYPE_ZERO_BYTE; + dgst_pos0 = 0; + dgst_pos1 = 1; + dgst_pos2 = 2; + dgst_pos3 = 3; + break; + + case 500: hash_type = HASH_TYPE_MD5; + salt_type = SALT_TYPE_EMBEDDED; + attack_exec = ATTACK_EXEC_ON_CPU; + opts_type = OPTS_TYPE_PT_GENERATE_LE; + kern_type = KERN_TYPE_MD5CRYPT; + dgst_size = DGST_SIZE_4_4; + parse_func = md5crypt_parse_hash; + sort_by_digest = sort_by_digest_4_4; + opti_type = OPTI_TYPE_ZERO_BYTE; + dgst_pos0 = 0; + dgst_pos1 = 1; + dgst_pos2 = 2; + dgst_pos3 = 3; + break; + + case 501: hash_type = HASH_TYPE_MD5; + salt_type = SALT_TYPE_EMBEDDED; + attack_exec = ATTACK_EXEC_ON_CPU; + opts_type = OPTS_TYPE_PT_GENERATE_LE + | OPTS_TYPE_HASH_COPY; + kern_type = KERN_TYPE_MD5CRYPT; + dgst_size = DGST_SIZE_4_4; + parse_func = juniper_parse_hash; + sort_by_digest = sort_by_digest_4_4; + opti_type = OPTI_TYPE_ZERO_BYTE; + dgst_pos0 = 0; + dgst_pos1 = 1; + dgst_pos2 = 2; + dgst_pos3 = 3; + break; + + case 900: hash_type = HASH_TYPE_MD4; + salt_type = SALT_TYPE_NONE; + attack_exec = ATTACK_EXEC_ON_GPU; + opts_type = OPTS_TYPE_PT_GENERATE_LE + | OPTS_TYPE_PT_ADD80 + | OPTS_TYPE_PT_ADDBITS14; + kern_type = KERN_TYPE_MD4; + dgst_size = DGST_SIZE_4_4; + parse_func = md4_parse_hash; + sort_by_digest = sort_by_digest_4_4; + opti_type = OPTI_TYPE_ZERO_BYTE + | OPTI_TYPE_PRECOMPUTE_INIT + | OPTI_TYPE_PRECOMPUTE_MERKLE + | OPTI_TYPE_SCALAR_MODE + | OPTI_TYPE_MEET_IN_MIDDLE + | OPTI_TYPE_EARLY_SKIP + | OPTI_TYPE_NOT_ITERATED + | OPTI_TYPE_NOT_SALTED + | OPTI_TYPE_RAW_HASH; + dgst_pos0 = 0; + dgst_pos1 = 3; + dgst_pos2 = 2; + dgst_pos3 = 1; + break; + + case 1000: hash_type = HASH_TYPE_MD4; + salt_type = SALT_TYPE_NONE; + attack_exec = ATTACK_EXEC_ON_GPU; + opts_type = OPTS_TYPE_PT_GENERATE_LE + | OPTS_TYPE_PT_ADD80 + | OPTS_TYPE_PT_ADDBITS14 + | OPTS_TYPE_PT_UNICODE; + kern_type = KERN_TYPE_MD4_PWU; + dgst_size = DGST_SIZE_4_4; + parse_func = md4_parse_hash; + sort_by_digest = sort_by_digest_4_4; + opti_type = OPTI_TYPE_ZERO_BYTE + | OPTI_TYPE_PRECOMPUTE_INIT + | OPTI_TYPE_PRECOMPUTE_MERKLE + | OPTI_TYPE_SCALAR_MODE + | OPTI_TYPE_MEET_IN_MIDDLE + | OPTI_TYPE_EARLY_SKIP + | OPTI_TYPE_NOT_ITERATED + | OPTI_TYPE_NOT_SALTED + | OPTI_TYPE_RAW_HASH; + dgst_pos0 = 0; + dgst_pos1 = 3; + dgst_pos2 = 2; + dgst_pos3 = 1; + break; + + case 1100: hash_type = HASH_TYPE_MD4; + salt_type = SALT_TYPE_INTERN; + attack_exec = ATTACK_EXEC_ON_GPU; + opts_type = OPTS_TYPE_PT_GENERATE_LE + | OPTS_TYPE_PT_ADD80 + | OPTS_TYPE_PT_ADDBITS14 + | OPTS_TYPE_PT_UNICODE + | OPTS_TYPE_ST_ADD80 + | OPTS_TYPE_ST_UNICODE + | OPTS_TYPE_ST_LOWER; + kern_type = KERN_TYPE_MD44_PWUSLT; + dgst_size = DGST_SIZE_4_4; + parse_func = dcc_parse_hash; + sort_by_digest = sort_by_digest_4_4; + opti_type = OPTI_TYPE_ZERO_BYTE + | OPTI_TYPE_PRECOMPUTE_INIT + | OPTI_TYPE_PRECOMPUTE_MERKLE + | OPTI_TYPE_SCALAR_MODE + | OPTI_TYPE_EARLY_SKIP + | OPTI_TYPE_NOT_ITERATED; + dgst_pos0 = 0; + dgst_pos1 = 3; + dgst_pos2 = 2; + dgst_pos3 = 1; + break; + + case 1400: hash_type = HASH_TYPE_SHA256; + salt_type = SALT_TYPE_NONE; + attack_exec = ATTACK_EXEC_ON_GPU; + opts_type = OPTS_TYPE_PT_GENERATE_BE + | OPTS_TYPE_PT_ADD80 + | OPTS_TYPE_PT_ADDBITS15; + kern_type = KERN_TYPE_SHA256; + dgst_size = DGST_SIZE_4_8; + parse_func = sha256_parse_hash; + sort_by_digest = sort_by_digest_4_8; + opti_type = OPTI_TYPE_ZERO_BYTE + | OPTI_TYPE_PRECOMPUTE_INIT + | OPTI_TYPE_PRECOMPUTE_MERKLE + | OPTI_TYPE_SCALAR_MODE + | OPTI_TYPE_EARLY_SKIP + | OPTI_TYPE_NOT_ITERATED + | OPTI_TYPE_NOT_SALTED + | OPTI_TYPE_RAW_HASH; + dgst_pos0 = 3; + dgst_pos1 = 7; + dgst_pos2 = 2; + dgst_pos3 = 6; + break; + + case 1410: hash_type = HASH_TYPE_SHA256; + salt_type = SALT_TYPE_INTERN; + attack_exec = ATTACK_EXEC_ON_GPU; + opts_type = OPTS_TYPE_PT_GENERATE_BE + | OPTS_TYPE_ST_ADD80 + | OPTS_TYPE_ST_ADDBITS15; + kern_type = KERN_TYPE_SHA256_PWSLT; + dgst_size = DGST_SIZE_4_8; + parse_func = sha256s_parse_hash; + sort_by_digest = sort_by_digest_4_8; + opti_type = OPTI_TYPE_ZERO_BYTE + | OPTI_TYPE_PRECOMPUTE_INIT + | OPTI_TYPE_PRECOMPUTE_MERKLE + | OPTI_TYPE_SCALAR_MODE + | OPTI_TYPE_EARLY_SKIP + | OPTI_TYPE_NOT_ITERATED + | OPTI_TYPE_APPENDED_SALT + | OPTI_TYPE_RAW_HASH; + dgst_pos0 = 3; + dgst_pos1 = 7; + dgst_pos2 = 2; + dgst_pos3 = 6; + break; + + case 1420: hash_type = HASH_TYPE_SHA256; + salt_type = SALT_TYPE_INTERN; + attack_exec = ATTACK_EXEC_ON_GPU; + opts_type = OPTS_TYPE_PT_GENERATE_BE + | OPTS_TYPE_PT_ADD80 + | OPTS_TYPE_PT_ADDBITS15; + kern_type = KERN_TYPE_SHA256_SLTPW; + dgst_size = DGST_SIZE_4_8; + parse_func = sha256s_parse_hash; + sort_by_digest = sort_by_digest_4_8; + opti_type = OPTI_TYPE_ZERO_BYTE + | OPTI_TYPE_PRECOMPUTE_INIT + | OPTI_TYPE_PRECOMPUTE_MERKLE + | OPTI_TYPE_EARLY_SKIP + | OPTI_TYPE_NOT_ITERATED + | OPTI_TYPE_PREPENDED_SALT + | OPTI_TYPE_RAW_HASH; + dgst_pos0 = 3; + dgst_pos1 = 7; + dgst_pos2 = 2; + dgst_pos3 = 6; + break; + + case 1421: hash_type = HASH_TYPE_SHA256; + salt_type = SALT_TYPE_EMBEDDED; + attack_exec = ATTACK_EXEC_ON_GPU; + opts_type = OPTS_TYPE_PT_GENERATE_BE + | OPTS_TYPE_PT_ADD80 + | OPTS_TYPE_PT_ADDBITS15; + kern_type = KERN_TYPE_SHA256_SLTPW; + dgst_size = DGST_SIZE_4_8; + parse_func = hmailserver_parse_hash; + sort_by_digest = sort_by_digest_4_8; + opti_type = OPTI_TYPE_ZERO_BYTE + | OPTI_TYPE_PRECOMPUTE_INIT + | OPTI_TYPE_PRECOMPUTE_MERKLE + | OPTI_TYPE_EARLY_SKIP + | OPTI_TYPE_NOT_ITERATED + | OPTI_TYPE_PREPENDED_SALT + | OPTI_TYPE_RAW_HASH; + dgst_pos0 = 3; + dgst_pos1 = 7; + dgst_pos2 = 2; + dgst_pos3 = 6; + break; + + case 1430: hash_type = HASH_TYPE_SHA256; + salt_type = SALT_TYPE_INTERN; + attack_exec = ATTACK_EXEC_ON_GPU; + opts_type = OPTS_TYPE_PT_GENERATE_BE + | OPTS_TYPE_PT_UNICODE + | OPTS_TYPE_ST_ADD80 + | OPTS_TYPE_ST_ADDBITS15; + kern_type = KERN_TYPE_SHA256_PWUSLT; + dgst_size = DGST_SIZE_4_8; + parse_func = sha256s_parse_hash; + sort_by_digest = sort_by_digest_4_8; + opti_type = OPTI_TYPE_ZERO_BYTE + | OPTI_TYPE_PRECOMPUTE_INIT + | OPTI_TYPE_PRECOMPUTE_MERKLE + | OPTI_TYPE_SCALAR_MODE + | OPTI_TYPE_EARLY_SKIP + | OPTI_TYPE_NOT_ITERATED + | OPTI_TYPE_APPENDED_SALT + | OPTI_TYPE_RAW_HASH; + dgst_pos0 = 3; + dgst_pos1 = 7; + dgst_pos2 = 2; + dgst_pos3 = 6; + break; + + case 1440: hash_type = HASH_TYPE_SHA256; + salt_type = SALT_TYPE_INTERN; + attack_exec = ATTACK_EXEC_ON_GPU; + opts_type = OPTS_TYPE_PT_GENERATE_BE + | OPTS_TYPE_PT_ADD80 + | OPTS_TYPE_PT_ADDBITS15 + | OPTS_TYPE_PT_UNICODE; + kern_type = KERN_TYPE_SHA256_SLTPWU; + dgst_size = DGST_SIZE_4_8; + parse_func = sha256s_parse_hash; + sort_by_digest = sort_by_digest_4_8; + opti_type = OPTI_TYPE_ZERO_BYTE + | OPTI_TYPE_PRECOMPUTE_INIT + | OPTI_TYPE_PRECOMPUTE_MERKLE + | OPTI_TYPE_EARLY_SKIP + | OPTI_TYPE_NOT_ITERATED + | OPTI_TYPE_PREPENDED_SALT + | OPTI_TYPE_RAW_HASH; + dgst_pos0 = 3; + dgst_pos1 = 7; + dgst_pos2 = 2; + dgst_pos3 = 6; + break; + + case 1441: hash_type = HASH_TYPE_SHA256; + salt_type = SALT_TYPE_EMBEDDED; + attack_exec = ATTACK_EXEC_ON_GPU; + opts_type = OPTS_TYPE_PT_GENERATE_BE + | OPTS_TYPE_PT_ADD80 + | OPTS_TYPE_PT_ADDBITS15 + | OPTS_TYPE_PT_UNICODE + | OPTS_TYPE_ST_BASE64; + kern_type = KERN_TYPE_SHA256_SLTPWU; + dgst_size = DGST_SIZE_4_8; + parse_func = episerver4_parse_hash; + sort_by_digest = sort_by_digest_4_8; + opti_type = OPTI_TYPE_ZERO_BYTE + | OPTI_TYPE_PRECOMPUTE_INIT + | OPTI_TYPE_PRECOMPUTE_MERKLE + | OPTI_TYPE_EARLY_SKIP + | OPTI_TYPE_NOT_ITERATED + | OPTI_TYPE_PREPENDED_SALT + | OPTI_TYPE_RAW_HASH; + dgst_pos0 = 3; + dgst_pos1 = 7; + dgst_pos2 = 2; + dgst_pos3 = 6; + break; + + case 1450: hash_type = HASH_TYPE_SHA256; + salt_type = SALT_TYPE_INTERN; + attack_exec = ATTACK_EXEC_ON_GPU; + opts_type = OPTS_TYPE_PT_GENERATE_BE + | OPTS_TYPE_ST_ADD80; + kern_type = KERN_TYPE_HMACSHA256_PW; + dgst_size = DGST_SIZE_4_8; + parse_func = hmacsha256_parse_hash; + sort_by_digest = sort_by_digest_4_8; + opti_type = OPTI_TYPE_ZERO_BYTE + | OPTI_TYPE_NOT_ITERATED; + dgst_pos0 = 3; + dgst_pos1 = 7; + dgst_pos2 = 2; + dgst_pos3 = 6; + break; + + case 1460: hash_type = HASH_TYPE_SHA256; + salt_type = SALT_TYPE_INTERN; + attack_exec = ATTACK_EXEC_ON_GPU; + opts_type = OPTS_TYPE_PT_GENERATE_BE + | OPTS_TYPE_PT_ADD80 + | OPTS_TYPE_PT_ADDBITS15; + kern_type = KERN_TYPE_HMACSHA256_SLT; + dgst_size = DGST_SIZE_4_8; + parse_func = hmacsha256_parse_hash; + sort_by_digest = sort_by_digest_4_8; + opti_type = OPTI_TYPE_ZERO_BYTE + | OPTI_TYPE_NOT_ITERATED; + dgst_pos0 = 3; + dgst_pos1 = 7; + dgst_pos2 = 2; + dgst_pos3 = 6; + break; + + case 1500: hash_type = HASH_TYPE_DESCRYPT; + salt_type = SALT_TYPE_EMBEDDED; + attack_exec = ATTACK_EXEC_ON_GPU; + opts_type = OPTS_TYPE_PT_GENERATE_LE + | OPTS_TYPE_PT_BITSLICE; + kern_type = KERN_TYPE_DESCRYPT; + dgst_size = DGST_SIZE_4_4; // originally DGST_SIZE_4_2 + parse_func = descrypt_parse_hash; + sort_by_digest = sort_by_digest_4_4; // originally sort_by_digest_4_2 + opti_type = OPTI_TYPE_ZERO_BYTE + | OPTI_TYPE_SCALAR_MODE + | OPTI_TYPE_PRECOMPUTE_PERMUT; + dgst_pos0 = 0; + dgst_pos1 = 1; + dgst_pos2 = 2; + dgst_pos3 = 3; + break; + + case 1600: hash_type = HASH_TYPE_MD5; + salt_type = SALT_TYPE_EMBEDDED; + attack_exec = ATTACK_EXEC_ON_CPU; + opts_type = OPTS_TYPE_PT_GENERATE_LE; + kern_type = KERN_TYPE_APR1CRYPT; + dgst_size = DGST_SIZE_4_4; + parse_func = md5apr1_parse_hash; + sort_by_digest = sort_by_digest_4_4; + opti_type = OPTI_TYPE_ZERO_BYTE; + dgst_pos0 = 0; + dgst_pos1 = 1; + dgst_pos2 = 2; + dgst_pos3 = 3; + break; + + case 1700: hash_type = HASH_TYPE_SHA512; + salt_type = SALT_TYPE_NONE; + attack_exec = ATTACK_EXEC_ON_GPU; + opts_type = OPTS_TYPE_PT_GENERATE_BE + | OPTS_TYPE_PT_ADD80 + | OPTS_TYPE_PT_ADDBITS15; + kern_type = KERN_TYPE_SHA512; + dgst_size = DGST_SIZE_8_8; + parse_func = sha512_parse_hash; + sort_by_digest = sort_by_digest_8_8; + opti_type = OPTI_TYPE_ZERO_BYTE + | OPTI_TYPE_PRECOMPUTE_INIT + | OPTI_TYPE_PRECOMPUTE_MERKLE + | OPTI_TYPE_SCALAR_MODE + | OPTI_TYPE_EARLY_SKIP + | OPTI_TYPE_NOT_ITERATED + | OPTI_TYPE_NOT_SALTED + | OPTI_TYPE_RAW_HASH; + dgst_pos0 = 14; + dgst_pos1 = 15; + dgst_pos2 = 6; + dgst_pos3 = 7; + break; + + case 1710: hash_type = HASH_TYPE_SHA512; + salt_type = SALT_TYPE_INTERN; + attack_exec = ATTACK_EXEC_ON_GPU; + opts_type = OPTS_TYPE_PT_GENERATE_BE + | OPTS_TYPE_ST_ADD80 + | OPTS_TYPE_ST_ADDBITS15; + kern_type = KERN_TYPE_SHA512_PWSLT; + dgst_size = DGST_SIZE_8_8; + parse_func = sha512s_parse_hash; + sort_by_digest = sort_by_digest_8_8; + opti_type = OPTI_TYPE_ZERO_BYTE + | OPTI_TYPE_PRECOMPUTE_INIT + | OPTI_TYPE_PRECOMPUTE_MERKLE + | OPTI_TYPE_SCALAR_MODE + | OPTI_TYPE_EARLY_SKIP + | OPTI_TYPE_NOT_ITERATED + | OPTI_TYPE_APPENDED_SALT + | OPTI_TYPE_RAW_HASH; + dgst_pos0 = 14; + dgst_pos1 = 15; + dgst_pos2 = 6; + dgst_pos3 = 7; + break; + + case 1711: hash_type = HASH_TYPE_SHA512; + salt_type = SALT_TYPE_EMBEDDED; + attack_exec = ATTACK_EXEC_ON_GPU; + opts_type = OPTS_TYPE_PT_GENERATE_BE + | OPTS_TYPE_ST_ADD80 + | OPTS_TYPE_ST_ADDBITS15; + kern_type = KERN_TYPE_SHA512_PWSLT; + dgst_size = DGST_SIZE_8_8; + parse_func = sha512b64s_parse_hash; + sort_by_digest = sort_by_digest_8_8; + opti_type = OPTI_TYPE_ZERO_BYTE + | OPTI_TYPE_PRECOMPUTE_INIT + | OPTI_TYPE_PRECOMPUTE_MERKLE + | OPTI_TYPE_SCALAR_MODE + | OPTI_TYPE_EARLY_SKIP + | OPTI_TYPE_NOT_ITERATED + | OPTI_TYPE_APPENDED_SALT + | OPTI_TYPE_RAW_HASH; + dgst_pos0 = 14; + dgst_pos1 = 15; + dgst_pos2 = 6; + dgst_pos3 = 7; + break; + + case 1720: hash_type = HASH_TYPE_SHA512; + salt_type = SALT_TYPE_INTERN; + attack_exec = ATTACK_EXEC_ON_GPU; + opts_type = OPTS_TYPE_PT_GENERATE_BE + | OPTS_TYPE_PT_ADD80 + | OPTS_TYPE_PT_ADDBITS15; + kern_type = KERN_TYPE_SHA512_SLTPW; + dgst_size = DGST_SIZE_8_8; + parse_func = sha512s_parse_hash; + sort_by_digest = sort_by_digest_8_8; + opti_type = OPTI_TYPE_ZERO_BYTE + | OPTI_TYPE_PRECOMPUTE_INIT + | OPTI_TYPE_PRECOMPUTE_MERKLE + | OPTI_TYPE_EARLY_SKIP + | OPTI_TYPE_NOT_ITERATED + | OPTI_TYPE_PREPENDED_SALT + | OPTI_TYPE_RAW_HASH; + dgst_pos0 = 14; + dgst_pos1 = 15; + dgst_pos2 = 6; + dgst_pos3 = 7; + break; + + case 1722: hash_type = HASH_TYPE_SHA512; + salt_type = SALT_TYPE_EMBEDDED; + attack_exec = ATTACK_EXEC_ON_GPU; + opts_type = OPTS_TYPE_PT_GENERATE_BE + | OPTS_TYPE_PT_ADD80 + | OPTS_TYPE_PT_ADDBITS15 + | OPTS_TYPE_ST_HEX; + kern_type = KERN_TYPE_SHA512_SLTPW; + dgst_size = DGST_SIZE_8_8; + parse_func = osx512_parse_hash; + sort_by_digest = sort_by_digest_8_8; + opti_type = OPTI_TYPE_ZERO_BYTE + | OPTI_TYPE_PRECOMPUTE_INIT + | OPTI_TYPE_PRECOMPUTE_MERKLE + | OPTI_TYPE_EARLY_SKIP + | OPTI_TYPE_NOT_ITERATED + | OPTI_TYPE_PREPENDED_SALT + | OPTI_TYPE_RAW_HASH; + dgst_pos0 = 14; + dgst_pos1 = 15; + dgst_pos2 = 6; + dgst_pos3 = 7; + break; + + case 1730: hash_type = HASH_TYPE_SHA512; + salt_type = SALT_TYPE_INTERN; + attack_exec = ATTACK_EXEC_ON_GPU; + opts_type = OPTS_TYPE_PT_GENERATE_BE + | OPTS_TYPE_PT_UNICODE + | OPTS_TYPE_ST_ADD80 + | OPTS_TYPE_ST_ADDBITS15; + kern_type = KERN_TYPE_SHA512_PWSLTU; + dgst_size = DGST_SIZE_8_8; + parse_func = sha512s_parse_hash; + sort_by_digest = sort_by_digest_8_8; + opti_type = OPTI_TYPE_ZERO_BYTE + | OPTI_TYPE_PRECOMPUTE_INIT + | OPTI_TYPE_PRECOMPUTE_MERKLE + | OPTI_TYPE_SCALAR_MODE + | OPTI_TYPE_EARLY_SKIP + | OPTI_TYPE_NOT_ITERATED + | OPTI_TYPE_APPENDED_SALT + | OPTI_TYPE_RAW_HASH; + dgst_pos0 = 14; + dgst_pos1 = 15; + dgst_pos2 = 6; + dgst_pos3 = 7; + break; + + case 1731: hash_type = HASH_TYPE_SHA512; + salt_type = SALT_TYPE_EMBEDDED; + attack_exec = ATTACK_EXEC_ON_GPU; + opts_type = OPTS_TYPE_PT_GENERATE_BE + | OPTS_TYPE_PT_UNICODE + | OPTS_TYPE_ST_ADD80 + | OPTS_TYPE_ST_ADDBITS15 + | OPTS_TYPE_ST_HEX; + kern_type = KERN_TYPE_SHA512_PWSLTU; + dgst_size = DGST_SIZE_8_8; + parse_func = mssql2012_parse_hash; + sort_by_digest = sort_by_digest_8_8; + opti_type = OPTI_TYPE_ZERO_BYTE + | OPTI_TYPE_PRECOMPUTE_INIT + | OPTI_TYPE_PRECOMPUTE_MERKLE + | OPTI_TYPE_SCALAR_MODE + | OPTI_TYPE_EARLY_SKIP + | OPTI_TYPE_NOT_ITERATED + | OPTI_TYPE_APPENDED_SALT + | OPTI_TYPE_RAW_HASH; + dgst_pos0 = 14; + dgst_pos1 = 15; + dgst_pos2 = 6; + dgst_pos3 = 7; + break; + + case 1740: hash_type = HASH_TYPE_SHA512; + salt_type = SALT_TYPE_INTERN; + attack_exec = ATTACK_EXEC_ON_GPU; + opts_type = OPTS_TYPE_PT_GENERATE_BE + | OPTS_TYPE_PT_ADD80 + | OPTS_TYPE_PT_ADDBITS15 + | OPTS_TYPE_PT_UNICODE; + kern_type = KERN_TYPE_SHA512_SLTPWU; + dgst_size = DGST_SIZE_8_8; + parse_func = sha512s_parse_hash; + sort_by_digest = sort_by_digest_8_8; + opti_type = OPTI_TYPE_ZERO_BYTE + | OPTI_TYPE_PRECOMPUTE_INIT + | OPTI_TYPE_PRECOMPUTE_MERKLE + | OPTI_TYPE_EARLY_SKIP + | OPTI_TYPE_NOT_ITERATED + | OPTI_TYPE_PREPENDED_SALT + | OPTI_TYPE_RAW_HASH; + dgst_pos0 = 14; + dgst_pos1 = 15; + dgst_pos2 = 6; + dgst_pos3 = 7; + break; + + case 1750: hash_type = HASH_TYPE_SHA512; + salt_type = SALT_TYPE_INTERN; + attack_exec = ATTACK_EXEC_ON_GPU; + opts_type = OPTS_TYPE_PT_GENERATE_BE + | OPTS_TYPE_ST_ADD80; + kern_type = KERN_TYPE_HMACSHA512_PW; + dgst_size = DGST_SIZE_8_8; + parse_func = hmacsha512_parse_hash; + sort_by_digest = sort_by_digest_8_8; + opti_type = OPTI_TYPE_ZERO_BYTE + | OPTI_TYPE_NOT_ITERATED; + dgst_pos0 = 14; + dgst_pos1 = 15; + dgst_pos2 = 6; + dgst_pos3 = 7; + break; + + case 1760: hash_type = HASH_TYPE_SHA512; + salt_type = SALT_TYPE_INTERN; + attack_exec = ATTACK_EXEC_ON_GPU; + opts_type = OPTS_TYPE_PT_GENERATE_BE + | OPTS_TYPE_PT_ADD80 + | OPTS_TYPE_PT_ADDBITS15; + kern_type = KERN_TYPE_HMACSHA512_SLT; + dgst_size = DGST_SIZE_8_8; + parse_func = hmacsha512_parse_hash; + sort_by_digest = sort_by_digest_8_8; + opti_type = OPTI_TYPE_ZERO_BYTE + | OPTI_TYPE_NOT_ITERATED; + dgst_pos0 = 14; + dgst_pos1 = 15; + dgst_pos2 = 6; + dgst_pos3 = 7; + break; + + case 1800: hash_type = HASH_TYPE_SHA512; + salt_type = SALT_TYPE_EMBEDDED; + attack_exec = ATTACK_EXEC_ON_CPU; + opts_type = OPTS_TYPE_PT_GENERATE_LE; // should be OPTS_TYPE_PT_GENERATE_BE + kern_type = KERN_TYPE_SHA512CRYPT; + dgst_size = DGST_SIZE_8_8; + parse_func = sha512crypt_parse_hash; + sort_by_digest = sort_by_digest_8_8; + opti_type = OPTI_TYPE_ZERO_BYTE; + dgst_pos0 = 0; + dgst_pos1 = 1; + dgst_pos2 = 2; + dgst_pos3 = 3; + break; + + case 2100: hash_type = HASH_TYPE_DCC2; + salt_type = SALT_TYPE_EMBEDDED; + attack_exec = ATTACK_EXEC_ON_CPU; + opts_type = OPTS_TYPE_PT_GENERATE_LE // should be OPTS_TYPE_PT_GENERATE_BE + | OPTS_TYPE_ST_LOWER + | OPTS_TYPE_ST_UNICODE; + kern_type = KERN_TYPE_DCC2; + dgst_size = DGST_SIZE_4_4; + parse_func = dcc2_parse_hash; + sort_by_digest = sort_by_digest_4_4; + opti_type = OPTI_TYPE_ZERO_BYTE; + dgst_pos0 = 0; + dgst_pos1 = 1; + dgst_pos2 = 2; + dgst_pos3 = 3; + break; + + case 2400: hash_type = HASH_TYPE_MD5; + salt_type = SALT_TYPE_NONE; + attack_exec = ATTACK_EXEC_ON_GPU; + opts_type = OPTS_TYPE_PT_GENERATE_LE; + kern_type = KERN_TYPE_MD5PIX; + dgst_size = DGST_SIZE_4_4; + parse_func = md5pix_parse_hash; + sort_by_digest = sort_by_digest_4_4; + opti_type = OPTI_TYPE_ZERO_BYTE + | OPTI_TYPE_PRECOMPUTE_INIT + | OPTI_TYPE_PRECOMPUTE_MERKLE + | OPTI_TYPE_SCALAR_MODE + | OPTI_TYPE_EARLY_SKIP + | OPTI_TYPE_NOT_ITERATED + | OPTI_TYPE_NOT_SALTED; + dgst_pos0 = 0; + dgst_pos1 = 3; + dgst_pos2 = 2; + dgst_pos3 = 1; + break; + + case 2410: hash_type = HASH_TYPE_MD5; + salt_type = SALT_TYPE_INTERN; + attack_exec = ATTACK_EXEC_ON_GPU; + opts_type = OPTS_TYPE_PT_GENERATE_LE; + kern_type = KERN_TYPE_MD5ASA; + dgst_size = DGST_SIZE_4_4; + parse_func = md5asa_parse_hash; + sort_by_digest = sort_by_digest_4_4; + opti_type = OPTI_TYPE_ZERO_BYTE + | OPTI_TYPE_PRECOMPUTE_INIT + | OPTI_TYPE_PRECOMPUTE_MERKLE + | OPTI_TYPE_SCALAR_MODE + | OPTI_TYPE_EARLY_SKIP + | OPTI_TYPE_NOT_ITERATED; + dgst_pos0 = 0; + dgst_pos1 = 3; + dgst_pos2 = 2; + dgst_pos3 = 1; + break; + + case 2500: hash_type = HASH_TYPE_WPA; + salt_type = SALT_TYPE_EMBEDDED; + attack_exec = ATTACK_EXEC_ON_CPU; + opts_type = OPTS_TYPE_PT_GENERATE_LE; // should be OPTS_TYPE_PT_GENERATE_BE + kern_type = KERN_TYPE_WPA; + dgst_size = DGST_SIZE_4_4; + parse_func = wpa_parse_hash; + sort_by_digest = sort_by_digest_4_4; + opti_type = OPTI_TYPE_ZERO_BYTE; + dgst_pos0 = 0; + dgst_pos1 = 1; + dgst_pos2 = 2; + dgst_pos3 = 3; + break; + + case 2600: hash_type = HASH_TYPE_MD5; + salt_type = SALT_TYPE_VIRTUAL; + attack_exec = ATTACK_EXEC_ON_GPU; + opts_type = OPTS_TYPE_PT_GENERATE_LE + | OPTS_TYPE_PT_ADD80 + | OPTS_TYPE_PT_ADDBITS14 + | OPTS_TYPE_ST_ADD80; + kern_type = KERN_TYPE_MD55_PWSLT1; + dgst_size = DGST_SIZE_4_4; + parse_func = md5md5_parse_hash; + sort_by_digest = sort_by_digest_4_4; + opti_type = OPTI_TYPE_ZERO_BYTE + | OPTI_TYPE_PRECOMPUTE_INIT + | OPTI_TYPE_PRECOMPUTE_MERKLE + | OPTI_TYPE_EARLY_SKIP; + dgst_pos0 = 0; + dgst_pos1 = 3; + dgst_pos2 = 2; + dgst_pos3 = 1; + break; + + case 2611: hash_type = HASH_TYPE_MD5; + salt_type = SALT_TYPE_INTERN; + attack_exec = ATTACK_EXEC_ON_GPU; + opts_type = OPTS_TYPE_PT_GENERATE_LE + | OPTS_TYPE_PT_ADD80 + | OPTS_TYPE_PT_ADDBITS14 + | OPTS_TYPE_ST_ADD80; + kern_type = KERN_TYPE_MD55_PWSLT1; + dgst_size = DGST_SIZE_4_4; + parse_func = vb3_parse_hash; + sort_by_digest = sort_by_digest_4_4; + opti_type = OPTI_TYPE_ZERO_BYTE + | OPTI_TYPE_PRECOMPUTE_INIT + | OPTI_TYPE_PRECOMPUTE_MERKLE + | OPTI_TYPE_EARLY_SKIP; + dgst_pos0 = 0; + dgst_pos1 = 3; + dgst_pos2 = 2; + dgst_pos3 = 1; + break; + + case 2612: hash_type = HASH_TYPE_MD5; + salt_type = SALT_TYPE_EMBEDDED; + attack_exec = ATTACK_EXEC_ON_GPU; + opts_type = OPTS_TYPE_PT_GENERATE_LE + | OPTS_TYPE_PT_ADD80 + | OPTS_TYPE_PT_ADDBITS14 + | OPTS_TYPE_ST_ADD80 + | OPTS_TYPE_ST_HEX; + kern_type = KERN_TYPE_MD55_PWSLT1; + dgst_size = DGST_SIZE_4_4; + parse_func = phps_parse_hash; + sort_by_digest = sort_by_digest_4_4; + opti_type = OPTI_TYPE_ZERO_BYTE + | OPTI_TYPE_PRECOMPUTE_INIT + | OPTI_TYPE_PRECOMPUTE_MERKLE + | OPTI_TYPE_EARLY_SKIP; + dgst_pos0 = 0; + dgst_pos1 = 3; + dgst_pos2 = 2; + dgst_pos3 = 1; + break; + + case 2711: hash_type = HASH_TYPE_MD5; + salt_type = SALT_TYPE_INTERN; + attack_exec = ATTACK_EXEC_ON_GPU; + opts_type = OPTS_TYPE_PT_GENERATE_LE + | OPTS_TYPE_PT_ADD80 + | OPTS_TYPE_PT_ADDBITS14 + | OPTS_TYPE_ST_ADD80; + kern_type = KERN_TYPE_MD55_PWSLT2; + dgst_size = DGST_SIZE_4_4; + parse_func = vb30_parse_hash; + sort_by_digest = sort_by_digest_4_4; + opti_type = OPTI_TYPE_ZERO_BYTE + | OPTI_TYPE_PRECOMPUTE_INIT + | OPTI_TYPE_EARLY_SKIP; + dgst_pos0 = 0; + dgst_pos1 = 3; + dgst_pos2 = 2; + dgst_pos3 = 1; + break; + + case 2811: hash_type = HASH_TYPE_MD5; + salt_type = SALT_TYPE_INTERN; + attack_exec = ATTACK_EXEC_ON_GPU; + opts_type = OPTS_TYPE_PT_GENERATE_LE + | OPTS_TYPE_PT_ADD80 + | OPTS_TYPE_PT_ADDBITS14; + kern_type = KERN_TYPE_MD55_SLTPW; + dgst_size = DGST_SIZE_4_4; + parse_func = ipb2_parse_hash; + sort_by_digest = sort_by_digest_4_4; + opti_type = OPTI_TYPE_ZERO_BYTE + | OPTI_TYPE_PRECOMPUTE_INIT + | OPTI_TYPE_EARLY_SKIP; + dgst_pos0 = 0; + dgst_pos1 = 3; + dgst_pos2 = 2; + dgst_pos3 = 1; + break; + + case 3000: hash_type = HASH_TYPE_LM; + salt_type = SALT_TYPE_NONE; + attack_exec = ATTACK_EXEC_ON_GPU; + opts_type = OPTS_TYPE_PT_GENERATE_LE + | OPTS_TYPE_PT_UPPER + | OPTS_TYPE_PT_BITSLICE; + kern_type = KERN_TYPE_LM; + dgst_size = DGST_SIZE_4_4; // originally DGST_SIZE_4_2 + parse_func = lm_parse_hash; + sort_by_digest = sort_by_digest_4_4; // originally sort_by_digest_4_2 + opti_type = OPTI_TYPE_ZERO_BYTE + | OPTI_TYPE_SCALAR_MODE + | OPTI_TYPE_PRECOMPUTE_PERMUT; + dgst_pos0 = 0; + dgst_pos1 = 1; + dgst_pos2 = 2; + dgst_pos3 = 3; + break; + + case 3100: hash_type = HASH_TYPE_ORACLEH; + salt_type = SALT_TYPE_INTERN; + attack_exec = ATTACK_EXEC_ON_GPU; + opts_type = OPTS_TYPE_PT_GENERATE_LE + | OPTS_TYPE_PT_UPPER + | OPTS_TYPE_ST_UPPER; + kern_type = KERN_TYPE_ORACLEH; + dgst_size = DGST_SIZE_4_4; // originally DGST_SIZE_4_2 + parse_func = oracleh_parse_hash; + sort_by_digest = sort_by_digest_4_4; // originally sort_by_digest_4_2 + opti_type = OPTI_TYPE_ZERO_BYTE + | OPTI_TYPE_SCALAR_MODE; + dgst_pos0 = 0; + dgst_pos1 = 1; + dgst_pos2 = 2; + dgst_pos3 = 3; + break; + + case 3200: hash_type = HASH_TYPE_BCRYPT; + salt_type = SALT_TYPE_EMBEDDED; + attack_exec = ATTACK_EXEC_ON_CPU; + opts_type = OPTS_TYPE_PT_GENERATE_LE + | OPTS_TYPE_ST_GENERATE_LE; + kern_type = KERN_TYPE_BCRYPT; + dgst_size = DGST_SIZE_4_6; + parse_func = bcrypt_parse_hash; + sort_by_digest = sort_by_digest_4_6; + opti_type = OPTI_TYPE_ZERO_BYTE; + dgst_pos0 = 0; + dgst_pos1 = 1; + dgst_pos2 = 2; + dgst_pos3 = 3; + break; + + case 3710: hash_type = HASH_TYPE_MD5; + salt_type = SALT_TYPE_INTERN; + attack_exec = ATTACK_EXEC_ON_GPU; + opts_type = OPTS_TYPE_PT_GENERATE_LE + | OPTS_TYPE_PT_ADD80 + | OPTS_TYPE_PT_ADDBITS14; + kern_type = KERN_TYPE_MD5_SLT_MD5_PW; + dgst_size = DGST_SIZE_4_4; + parse_func = md5s_parse_hash; + sort_by_digest = sort_by_digest_4_4; + opti_type = OPTI_TYPE_ZERO_BYTE + | OPTI_TYPE_PRECOMPUTE_INIT + | OPTI_TYPE_PRECOMPUTE_MERKLE + | OPTI_TYPE_EARLY_SKIP; + dgst_pos0 = 0; + dgst_pos1 = 3; + dgst_pos2 = 2; + dgst_pos3 = 1; + break; + + case 3711: hash_type = HASH_TYPE_MD5; + salt_type = SALT_TYPE_EMBEDDED; + attack_exec = ATTACK_EXEC_ON_GPU; + opts_type = OPTS_TYPE_PT_GENERATE_LE + | OPTS_TYPE_PT_ADD80 + | OPTS_TYPE_PT_ADDBITS14; + kern_type = KERN_TYPE_MD5_SLT_MD5_PW; + dgst_size = DGST_SIZE_4_4; + parse_func = mediawiki_b_parse_hash; + sort_by_digest = sort_by_digest_4_4; + opti_type = OPTI_TYPE_ZERO_BYTE + | OPTI_TYPE_PRECOMPUTE_INIT + | OPTI_TYPE_PRECOMPUTE_MERKLE + | OPTI_TYPE_EARLY_SKIP; + dgst_pos0 = 0; + dgst_pos1 = 3; + dgst_pos2 = 2; + dgst_pos3 = 1; + break; + + case 3800: hash_type = HASH_TYPE_MD5; + salt_type = SALT_TYPE_INTERN; + attack_exec = ATTACK_EXEC_ON_GPU; + opts_type = OPTS_TYPE_PT_GENERATE_LE + | OPTS_TYPE_ST_ADDBITS14; + kern_type = KERN_TYPE_MD5_SLT_PW_SLT; + dgst_size = DGST_SIZE_4_4; + parse_func = md5s_parse_hash; + sort_by_digest = sort_by_digest_4_4; + opti_type = OPTI_TYPE_ZERO_BYTE + | OPTI_TYPE_PRECOMPUTE_INIT + | OPTI_TYPE_PRECOMPUTE_MERKLE + | OPTI_TYPE_EARLY_SKIP + | OPTI_TYPE_NOT_ITERATED + | OPTI_TYPE_RAW_HASH; + dgst_pos0 = 0; + dgst_pos1 = 3; + dgst_pos2 = 2; + dgst_pos3 = 1; + break; + + case 4300: hash_type = HASH_TYPE_MD5; + salt_type = SALT_TYPE_VIRTUAL; + attack_exec = ATTACK_EXEC_ON_GPU; + opts_type = OPTS_TYPE_PT_GENERATE_LE + | OPTS_TYPE_PT_ADD80 + | OPTS_TYPE_PT_ADDBITS14 + | OPTS_TYPE_ST_ADD80; + kern_type = KERN_TYPE_MD5U5_PWSLT1; + dgst_size = DGST_SIZE_4_4; + parse_func = md5md5_parse_hash; + sort_by_digest = sort_by_digest_4_4; + opti_type = OPTI_TYPE_ZERO_BYTE + | OPTI_TYPE_PRECOMPUTE_INIT + | OPTI_TYPE_PRECOMPUTE_MERKLE + | OPTI_TYPE_EARLY_SKIP; + dgst_pos0 = 0; + dgst_pos1 = 3; + dgst_pos2 = 2; + dgst_pos3 = 1; + break; + + + case 4400: hash_type = HASH_TYPE_MD5; + salt_type = SALT_TYPE_NONE; + attack_exec = ATTACK_EXEC_ON_GPU; + opts_type = OPTS_TYPE_PT_GENERATE_BE + | OPTS_TYPE_PT_ADD80 + | OPTS_TYPE_PT_ADDBITS15; + kern_type = KERN_TYPE_MD5_SHA1; + dgst_size = DGST_SIZE_4_4; + parse_func = md5_parse_hash; + sort_by_digest = sort_by_digest_4_4; + opti_type = OPTI_TYPE_ZERO_BYTE + | OPTI_TYPE_PRECOMPUTE_INIT + | OPTI_TYPE_PRECOMPUTE_MERKLE + | OPTI_TYPE_EARLY_SKIP + | OPTI_TYPE_NOT_ITERATED + | OPTI_TYPE_NOT_SALTED + | OPTI_TYPE_RAW_HASH; + dgst_pos0 = 0; + dgst_pos1 = 3; + dgst_pos2 = 2; + dgst_pos3 = 1; + break; + + case 4500: hash_type = HASH_TYPE_SHA1; + salt_type = SALT_TYPE_NONE; + attack_exec = ATTACK_EXEC_ON_GPU; + opts_type = OPTS_TYPE_PT_GENERATE_BE + | OPTS_TYPE_PT_ADD80 + | OPTS_TYPE_PT_ADDBITS15; + kern_type = KERN_TYPE_SHA11; + dgst_size = DGST_SIZE_4_5; + parse_func = sha1_parse_hash; + sort_by_digest = sort_by_digest_4_5; + opti_type = OPTI_TYPE_ZERO_BYTE + | OPTI_TYPE_PRECOMPUTE_INIT + | OPTI_TYPE_PRECOMPUTE_MERKLE + | OPTI_TYPE_EARLY_SKIP + | OPTI_TYPE_NOT_SALTED; + dgst_pos0 = 3; + dgst_pos1 = 4; + dgst_pos2 = 2; + dgst_pos3 = 1; + break; + + case 4700: hash_type = HASH_TYPE_SHA1; + salt_type = SALT_TYPE_NONE; + attack_exec = ATTACK_EXEC_ON_GPU; + opts_type = OPTS_TYPE_PT_GENERATE_LE + | OPTS_TYPE_PT_ADD80 + | OPTS_TYPE_PT_ADDBITS14; + kern_type = KERN_TYPE_SHA1_MD5; + dgst_size = DGST_SIZE_4_5; + parse_func = sha1_parse_hash; + sort_by_digest = sort_by_digest_4_5; + opti_type = OPTI_TYPE_ZERO_BYTE + | OPTI_TYPE_PRECOMPUTE_INIT + | OPTI_TYPE_PRECOMPUTE_MERKLE + | OPTI_TYPE_EARLY_SKIP + | OPTI_TYPE_NOT_ITERATED + | OPTI_TYPE_NOT_SALTED + | OPTI_TYPE_RAW_HASH; + dgst_pos0 = 3; + dgst_pos1 = 4; + dgst_pos2 = 2; + dgst_pos3 = 1; + break; + + case 4800: hash_type = HASH_TYPE_MD5; + salt_type = SALT_TYPE_EMBEDDED; + attack_exec = ATTACK_EXEC_ON_GPU; + opts_type = OPTS_TYPE_PT_GENERATE_LE + | OPTS_TYPE_PT_ADDBITS14; + kern_type = KERN_TYPE_MD5_CHAP; + dgst_size = DGST_SIZE_4_4; + parse_func = chap_parse_hash; + sort_by_digest = sort_by_digest_4_4; + opti_type = OPTI_TYPE_ZERO_BYTE + | OPTI_TYPE_PRECOMPUTE_INIT + | OPTI_TYPE_PRECOMPUTE_MERKLE + | OPTI_TYPE_MEET_IN_MIDDLE + | OPTI_TYPE_EARLY_SKIP + | OPTI_TYPE_NOT_ITERATED + | OPTI_TYPE_RAW_HASH; + dgst_pos0 = 0; + dgst_pos1 = 3; + dgst_pos2 = 2; + dgst_pos3 = 1; + break; + + case 4900: hash_type = HASH_TYPE_SHA1; + salt_type = SALT_TYPE_INTERN; + attack_exec = ATTACK_EXEC_ON_GPU; + opts_type = OPTS_TYPE_PT_GENERATE_LE; + kern_type = KERN_TYPE_SHA1_SLT_PW_SLT; + dgst_size = DGST_SIZE_4_5; + parse_func = sha1s_parse_hash; + sort_by_digest = sort_by_digest_4_5; + opti_type = OPTI_TYPE_ZERO_BYTE + | OPTI_TYPE_PRECOMPUTE_INIT + | OPTI_TYPE_PRECOMPUTE_MERKLE + | OPTI_TYPE_EARLY_SKIP; + dgst_pos0 = 3; + dgst_pos1 = 4; + dgst_pos2 = 2; + dgst_pos3 = 1; + break; + + case 5000: hash_type = HASH_TYPE_KECCAK; + salt_type = SALT_TYPE_EMBEDDED; + attack_exec = ATTACK_EXEC_ON_GPU; + opts_type = OPTS_TYPE_PT_GENERATE_LE + | OPTS_TYPE_PT_ADD01; + kern_type = KERN_TYPE_KECCAK; + dgst_size = DGST_SIZE_8_25; + parse_func = keccak_parse_hash; + sort_by_digest = sort_by_digest_8_25; + opti_type = OPTI_TYPE_ZERO_BYTE + | OPTI_TYPE_RAW_HASH; + dgst_pos0 = 2; + dgst_pos1 = 3; + dgst_pos2 = 4; + dgst_pos3 = 5; + break; + + case 5100: hash_type = HASH_TYPE_MD5H; + salt_type = SALT_TYPE_NONE; + attack_exec = ATTACK_EXEC_ON_GPU; + opts_type = OPTS_TYPE_PT_GENERATE_LE + | OPTS_TYPE_PT_ADD80 + | OPTS_TYPE_PT_ADDBITS14; + kern_type = KERN_TYPE_MD5H; + dgst_size = DGST_SIZE_4_4; // originally DGST_SIZE_4_2 + parse_func = md5half_parse_hash; + sort_by_digest = sort_by_digest_4_4; // originally sort_by_digest_4_2 + opti_type = OPTI_TYPE_ZERO_BYTE + | OPTI_TYPE_RAW_HASH; + dgst_pos0 = 0; + dgst_pos1 = 1; + dgst_pos2 = 2; + dgst_pos3 = 3; + break; + + case 5200: hash_type = HASH_TYPE_SHA256; + salt_type = SALT_TYPE_EMBEDDED; + attack_exec = ATTACK_EXEC_ON_CPU; + opts_type = OPTS_TYPE_PT_GENERATE_LE; // should be OPTS_TYPE_PT_GENERATE_BE + kern_type = KERN_TYPE_PSAFE3; + dgst_size = DGST_SIZE_4_8; + parse_func = psafe3_parse_hash; + sort_by_digest = sort_by_digest_4_8; + opti_type = OPTI_TYPE_ZERO_BYTE; + dgst_pos0 = 0; + dgst_pos1 = 1; + dgst_pos2 = 2; + dgst_pos3 = 3; + break; + + case 5300: hash_type = HASH_TYPE_MD5; + salt_type = SALT_TYPE_EMBEDDED; + attack_exec = ATTACK_EXEC_ON_GPU; + opts_type = OPTS_TYPE_PT_GENERATE_LE + | OPTS_TYPE_ST_ADD80; + kern_type = KERN_TYPE_IKEPSK_MD5; + dgst_size = DGST_SIZE_4_4; + parse_func = ikepsk_md5_parse_hash; + sort_by_digest = sort_by_digest_4_4; + opti_type = OPTI_TYPE_ZERO_BYTE; + dgst_pos0 = 0; + dgst_pos1 = 3; + dgst_pos2 = 2; + dgst_pos3 = 1; + break; + + case 5400: hash_type = HASH_TYPE_SHA1; + salt_type = SALT_TYPE_EMBEDDED; + attack_exec = ATTACK_EXEC_ON_GPU; + opts_type = OPTS_TYPE_PT_GENERATE_BE + | OPTS_TYPE_ST_ADD80; + kern_type = KERN_TYPE_IKEPSK_SHA1; + dgst_size = DGST_SIZE_4_5; + parse_func = ikepsk_sha1_parse_hash; + sort_by_digest = sort_by_digest_4_5; + opti_type = OPTI_TYPE_ZERO_BYTE; + dgst_pos0 = 3; + dgst_pos1 = 4; + dgst_pos2 = 2; + dgst_pos3 = 1; + break; + + case 5500: hash_type = HASH_TYPE_NETNTLM; + salt_type = SALT_TYPE_EMBEDDED; + attack_exec = ATTACK_EXEC_ON_GPU; + opts_type = OPTS_TYPE_PT_GENERATE_LE + | OPTS_TYPE_PT_ADD80 + | OPTS_TYPE_PT_ADDBITS14 + | OPTS_TYPE_PT_UNICODE + | OPTS_TYPE_ST_HEX; + kern_type = KERN_TYPE_NETNTLMv1; + dgst_size = DGST_SIZE_4_4; + parse_func = netntlmv1_parse_hash; + sort_by_digest = sort_by_digest_4_4; + opti_type = OPTI_TYPE_ZERO_BYTE + | OPTI_TYPE_SCALAR_MODE + | OPTI_TYPE_PRECOMPUTE_PERMUT; + dgst_pos0 = 0; + dgst_pos1 = 1; + dgst_pos2 = 2; + dgst_pos3 = 3; + break; + + case 5600: hash_type = HASH_TYPE_MD5; + salt_type = SALT_TYPE_EMBEDDED; + attack_exec = ATTACK_EXEC_ON_GPU; + opts_type = OPTS_TYPE_PT_GENERATE_LE + | OPTS_TYPE_PT_ADD80 + | OPTS_TYPE_PT_ADDBITS14 + | OPTS_TYPE_PT_UNICODE; + kern_type = KERN_TYPE_NETNTLMv2; + dgst_size = DGST_SIZE_4_4; + parse_func = netntlmv2_parse_hash; + sort_by_digest = sort_by_digest_4_4; + opti_type = OPTI_TYPE_ZERO_BYTE; + dgst_pos0 = 0; + dgst_pos1 = 3; + dgst_pos2 = 2; + dgst_pos3 = 1; + break; + + case 5700: hash_type = HASH_TYPE_SHA256; + salt_type = SALT_TYPE_NONE; + attack_exec = ATTACK_EXEC_ON_GPU; + opts_type = OPTS_TYPE_PT_GENERATE_BE + | OPTS_TYPE_PT_ADD80 + | OPTS_TYPE_PT_ADDBITS15; + kern_type = KERN_TYPE_SHA256; + dgst_size = DGST_SIZE_4_8; + parse_func = cisco4_parse_hash; + sort_by_digest = sort_by_digest_4_8; + opti_type = OPTI_TYPE_ZERO_BYTE + | OPTI_TYPE_PRECOMPUTE_INIT + | OPTI_TYPE_PRECOMPUTE_MERKLE + | OPTI_TYPE_SCALAR_MODE + | OPTI_TYPE_EARLY_SKIP + | OPTI_TYPE_NOT_ITERATED + | OPTI_TYPE_NOT_SALTED + | OPTI_TYPE_RAW_HASH; + dgst_pos0 = 3; + dgst_pos1 = 7; + dgst_pos2 = 2; + dgst_pos3 = 6; + break; + + case 5800: hash_type = HASH_TYPE_SHA1; + salt_type = SALT_TYPE_INTERN; + attack_exec = ATTACK_EXEC_ON_CPU; + opts_type = OPTS_TYPE_PT_GENERATE_LE // should be OPTS_TYPE_PT_GENERATE_BE + | OPTS_TYPE_ST_ADD80; + kern_type = KERN_TYPE_ANDROIDPIN; + dgst_size = DGST_SIZE_4_5; + parse_func = androidpin_parse_hash; + sort_by_digest = sort_by_digest_4_5; + opti_type = OPTI_TYPE_ZERO_BYTE; + dgst_pos0 = 0; + dgst_pos1 = 1; + dgst_pos2 = 2; + dgst_pos3 = 3; + break; + + case 6000: hash_type = HASH_TYPE_RIPEMD160; + salt_type = SALT_TYPE_NONE; + attack_exec = ATTACK_EXEC_ON_GPU; + opts_type = OPTS_TYPE_PT_GENERATE_LE + | OPTS_TYPE_PT_ADD80; + kern_type = KERN_TYPE_RIPEMD160; + dgst_size = DGST_SIZE_4_5; + parse_func = ripemd160_parse_hash; + sort_by_digest = sort_by_digest_4_5; + opti_type = OPTI_TYPE_ZERO_BYTE; + dgst_pos0 = 0; + dgst_pos1 = 1; + dgst_pos2 = 2; + dgst_pos3 = 3; + break; + + case 6100: hash_type = HASH_TYPE_WHIRLPOOL; + salt_type = SALT_TYPE_NONE; + attack_exec = ATTACK_EXEC_ON_GPU; + opts_type = OPTS_TYPE_PT_GENERATE_BE + | OPTS_TYPE_PT_ADD80; + kern_type = KERN_TYPE_WHIRLPOOL; + dgst_size = DGST_SIZE_4_16; + parse_func = whirlpool_parse_hash; + sort_by_digest = sort_by_digest_4_16; + opti_type = OPTI_TYPE_ZERO_BYTE; + dgst_pos0 = 0; + dgst_pos1 = 1; + dgst_pos2 = 2; + dgst_pos3 = 3; + break; + + case 6211: hash_type = HASH_TYPE_RIPEMD160; + salt_type = SALT_TYPE_EMBEDDED; + attack_exec = ATTACK_EXEC_ON_CPU; + opts_type = OPTS_TYPE_PT_GENERATE_LE; + kern_type = KERN_TYPE_TCRIPEMD160_XTS512; + dgst_size = DGST_SIZE_4_5; + parse_func = truecrypt_parse_hash_2k; + sort_by_digest = sort_by_digest_4_5; + opti_type = OPTI_TYPE_ZERO_BYTE; + dgst_pos0 = 0; + dgst_pos1 = 1; + dgst_pos2 = 2; + dgst_pos3 = 3; + break; + + case 6212: hash_type = HASH_TYPE_RIPEMD160; + salt_type = SALT_TYPE_EMBEDDED; + attack_exec = ATTACK_EXEC_ON_CPU; + opts_type = OPTS_TYPE_PT_GENERATE_LE; + kern_type = KERN_TYPE_TCRIPEMD160_XTS1024; + dgst_size = DGST_SIZE_4_5; + parse_func = truecrypt_parse_hash_2k; + sort_by_digest = sort_by_digest_4_5; + opti_type = OPTI_TYPE_ZERO_BYTE; + dgst_pos0 = 0; + dgst_pos1 = 1; + dgst_pos2 = 2; + dgst_pos3 = 3; + break; + + case 6213: hash_type = HASH_TYPE_RIPEMD160; + salt_type = SALT_TYPE_EMBEDDED; + attack_exec = ATTACK_EXEC_ON_CPU; + opts_type = OPTS_TYPE_PT_GENERATE_LE; + kern_type = KERN_TYPE_TCRIPEMD160_XTS1536; + dgst_size = DGST_SIZE_4_5; + parse_func = truecrypt_parse_hash_2k; + sort_by_digest = sort_by_digest_4_5; + opti_type = OPTI_TYPE_ZERO_BYTE; + dgst_pos0 = 0; + dgst_pos1 = 1; + dgst_pos2 = 2; + dgst_pos3 = 3; + break; + + case 6221: hash_type = HASH_TYPE_SHA512; + salt_type = SALT_TYPE_EMBEDDED; + attack_exec = ATTACK_EXEC_ON_CPU; + opts_type = OPTS_TYPE_PT_GENERATE_LE; // should be OPTS_TYPE_PT_GENERATE_BE + kern_type = KERN_TYPE_TCSHA512_XTS512; + dgst_size = DGST_SIZE_8_8; + parse_func = truecrypt_parse_hash_1k; + sort_by_digest = sort_by_digest_8_8; + opti_type = OPTI_TYPE_ZERO_BYTE; + dgst_pos0 = 0; + dgst_pos1 = 1; + dgst_pos2 = 2; + dgst_pos3 = 3; + break; + + case 6222: hash_type = HASH_TYPE_SHA512; + salt_type = SALT_TYPE_EMBEDDED; + attack_exec = ATTACK_EXEC_ON_CPU; + opts_type = OPTS_TYPE_PT_GENERATE_LE; // should be OPTS_TYPE_PT_GENERATE_BE + kern_type = KERN_TYPE_TCSHA512_XTS1024; + dgst_size = DGST_SIZE_8_8; + parse_func = truecrypt_parse_hash_1k; + sort_by_digest = sort_by_digest_8_8; + opti_type = OPTI_TYPE_ZERO_BYTE; + dgst_pos0 = 0; + dgst_pos1 = 1; + dgst_pos2 = 2; + dgst_pos3 = 3; + break; + + case 6223: hash_type = HASH_TYPE_SHA512; + salt_type = SALT_TYPE_EMBEDDED; + attack_exec = ATTACK_EXEC_ON_CPU; + opts_type = OPTS_TYPE_PT_GENERATE_LE; // should be OPTS_TYPE_PT_GENERATE_BE + kern_type = KERN_TYPE_TCSHA512_XTS1536; + dgst_size = DGST_SIZE_8_8; + parse_func = truecrypt_parse_hash_1k; + sort_by_digest = sort_by_digest_8_8; + opti_type = OPTI_TYPE_ZERO_BYTE; + dgst_pos0 = 0; + dgst_pos1 = 1; + dgst_pos2 = 2; + dgst_pos3 = 3; + break; + + case 6231: hash_type = HASH_TYPE_WHIRLPOOL; + salt_type = SALT_TYPE_EMBEDDED; + attack_exec = ATTACK_EXEC_ON_CPU; + opts_type = OPTS_TYPE_PT_GENERATE_LE; + kern_type = KERN_TYPE_TCWHIRLPOOL_XTS512; + dgst_size = DGST_SIZE_4_8; + parse_func = truecrypt_parse_hash_1k; + sort_by_digest = sort_by_digest_4_8; + opti_type = OPTI_TYPE_ZERO_BYTE; + dgst_pos0 = 0; + dgst_pos1 = 1; + dgst_pos2 = 2; + dgst_pos3 = 3; + break; + + case 6232: hash_type = HASH_TYPE_WHIRLPOOL; + salt_type = SALT_TYPE_EMBEDDED; + attack_exec = ATTACK_EXEC_ON_CPU; + opts_type = OPTS_TYPE_PT_GENERATE_LE; + kern_type = KERN_TYPE_TCWHIRLPOOL_XTS1024; + dgst_size = DGST_SIZE_4_8; + parse_func = truecrypt_parse_hash_1k; + sort_by_digest = sort_by_digest_4_8; + opti_type = OPTI_TYPE_ZERO_BYTE; + dgst_pos0 = 0; + dgst_pos1 = 1; + dgst_pos2 = 2; + dgst_pos3 = 3; + break; + + case 6233: hash_type = HASH_TYPE_WHIRLPOOL; + salt_type = SALT_TYPE_EMBEDDED; + attack_exec = ATTACK_EXEC_ON_CPU; + opts_type = OPTS_TYPE_PT_GENERATE_LE; + kern_type = KERN_TYPE_TCWHIRLPOOL_XTS1536; + dgst_size = DGST_SIZE_4_8; + parse_func = truecrypt_parse_hash_1k; + sort_by_digest = sort_by_digest_4_8; + opti_type = OPTI_TYPE_ZERO_BYTE; + dgst_pos0 = 0; + dgst_pos1 = 1; + dgst_pos2 = 2; + dgst_pos3 = 3; + break; + + case 6241: hash_type = HASH_TYPE_RIPEMD160; + salt_type = SALT_TYPE_EMBEDDED; + attack_exec = ATTACK_EXEC_ON_CPU; + opts_type = OPTS_TYPE_PT_GENERATE_LE; + kern_type = KERN_TYPE_TCRIPEMD160_XTS512; + dgst_size = DGST_SIZE_4_5; + parse_func = truecrypt_parse_hash_1k; + sort_by_digest = sort_by_digest_4_5; + opti_type = OPTI_TYPE_ZERO_BYTE; + dgst_pos0 = 0; + dgst_pos1 = 1; + dgst_pos2 = 2; + dgst_pos3 = 3; + break; + + case 6242: hash_type = HASH_TYPE_RIPEMD160; + salt_type = SALT_TYPE_EMBEDDED; + attack_exec = ATTACK_EXEC_ON_CPU; + opts_type = OPTS_TYPE_PT_GENERATE_LE; + kern_type = KERN_TYPE_TCRIPEMD160_XTS1024; + dgst_size = DGST_SIZE_4_5; + parse_func = truecrypt_parse_hash_1k; + sort_by_digest = sort_by_digest_4_5; + opti_type = OPTI_TYPE_ZERO_BYTE; + dgst_pos0 = 0; + dgst_pos1 = 1; + dgst_pos2 = 2; + dgst_pos3 = 3; + break; + + case 6243: hash_type = HASH_TYPE_RIPEMD160; + salt_type = SALT_TYPE_EMBEDDED; + attack_exec = ATTACK_EXEC_ON_CPU; + opts_type = OPTS_TYPE_PT_GENERATE_LE; + kern_type = KERN_TYPE_TCRIPEMD160_XTS1536; + dgst_size = DGST_SIZE_4_5; + parse_func = truecrypt_parse_hash_1k; + sort_by_digest = sort_by_digest_4_5; + opti_type = OPTI_TYPE_ZERO_BYTE; + dgst_pos0 = 0; + dgst_pos1 = 1; + dgst_pos2 = 2; + dgst_pos3 = 3; + break; + + case 6300: hash_type = HASH_TYPE_MD5; + salt_type = SALT_TYPE_EMBEDDED; + attack_exec = ATTACK_EXEC_ON_CPU; + opts_type = OPTS_TYPE_PT_GENERATE_LE; + kern_type = KERN_TYPE_MD5AIX; + dgst_size = DGST_SIZE_4_4; + parse_func = md5aix_parse_hash; + sort_by_digest = sort_by_digest_4_4; + opti_type = OPTI_TYPE_ZERO_BYTE; + dgst_pos0 = 0; + dgst_pos1 = 1; + dgst_pos2 = 2; + dgst_pos3 = 3; + break; + + case 6400: hash_type = HASH_TYPE_SHA256; + salt_type = SALT_TYPE_EMBEDDED; + attack_exec = ATTACK_EXEC_ON_CPU; + opts_type = OPTS_TYPE_PT_GENERATE_LE; // should be OPTS_TYPE_PT_GENERATE_BE + kern_type = KERN_TYPE_SHA256AIX; + dgst_size = DGST_SIZE_4_8; + parse_func = sha256aix_parse_hash; + sort_by_digest = sort_by_digest_4_8; + opti_type = OPTI_TYPE_ZERO_BYTE; + dgst_pos0 = 0; + dgst_pos1 = 1; + dgst_pos2 = 2; + dgst_pos3 = 3; + break; + + case 6500: hash_type = HASH_TYPE_SHA512; + salt_type = SALT_TYPE_EMBEDDED; + attack_exec = ATTACK_EXEC_ON_CPU; + opts_type = OPTS_TYPE_PT_GENERATE_LE; // should be OPTS_TYPE_PT_GENERATE_BE + kern_type = KERN_TYPE_SHA512AIX; + dgst_size = DGST_SIZE_8_8; + parse_func = sha512aix_parse_hash; + sort_by_digest = sort_by_digest_8_8; + opti_type = OPTI_TYPE_ZERO_BYTE; + dgst_pos0 = 0; + dgst_pos1 = 1; + dgst_pos2 = 2; + dgst_pos3 = 3; + break; + + case 6600: hash_type = HASH_TYPE_AES; + salt_type = SALT_TYPE_EMBEDDED; + attack_exec = ATTACK_EXEC_ON_CPU; + opts_type = OPTS_TYPE_PT_GENERATE_LE; + kern_type = KERN_TYPE_AGILEKEY; + dgst_size = DGST_SIZE_4_5; // because kernel uses _SHA1_ + parse_func = agilekey_parse_hash; + sort_by_digest = sort_by_digest_4_5; + opti_type = OPTI_TYPE_ZERO_BYTE; + dgst_pos0 = 0; + dgst_pos1 = 1; + dgst_pos2 = 2; + dgst_pos3 = 3; + break; + + case 6700: hash_type = HASH_TYPE_SHA1; + salt_type = SALT_TYPE_EMBEDDED; + attack_exec = ATTACK_EXEC_ON_CPU; + opts_type = OPTS_TYPE_PT_GENERATE_LE; // should be OPTS_TYPE_PT_GENERATE_BE + kern_type = KERN_TYPE_SHA1AIX; + dgst_size = DGST_SIZE_4_5; + parse_func = sha1aix_parse_hash; + sort_by_digest = sort_by_digest_4_5; + opti_type = OPTI_TYPE_ZERO_BYTE; + dgst_pos0 = 0; + dgst_pos1 = 1; + dgst_pos2 = 2; + dgst_pos3 = 3; + break; + + case 6800: hash_type = HASH_TYPE_AES; + salt_type = SALT_TYPE_EMBEDDED; + attack_exec = ATTACK_EXEC_ON_CPU; + opts_type = OPTS_TYPE_PT_GENERATE_LE; + kern_type = KERN_TYPE_LASTPASS; + dgst_size = DGST_SIZE_4_8; // because kernel uses _SHA256_ + parse_func = lastpass_parse_hash; + sort_by_digest = sort_by_digest_4_8; + opti_type = OPTI_TYPE_ZERO_BYTE; + dgst_pos0 = 0; + dgst_pos1 = 1; + dgst_pos2 = 2; + dgst_pos3 = 3; + break; + + case 6900: hash_type = HASH_TYPE_GOST; + salt_type = SALT_TYPE_NONE; + attack_exec = ATTACK_EXEC_ON_GPU; + opts_type = OPTS_TYPE_PT_GENERATE_LE; + kern_type = KERN_TYPE_GOST; + dgst_size = DGST_SIZE_4_8; + parse_func = gost_parse_hash; + sort_by_digest = sort_by_digest_4_8; + opti_type = OPTI_TYPE_ZERO_BYTE; + dgst_pos0 = 0; + dgst_pos1 = 1; + dgst_pos2 = 2; + dgst_pos3 = 3; + break; + + case 7100: hash_type = HASH_TYPE_SHA512; + salt_type = SALT_TYPE_EMBEDDED; + attack_exec = ATTACK_EXEC_ON_CPU; + opts_type = OPTS_TYPE_PT_GENERATE_LE; // should be OPTS_TYPE_PT_GENERATE_BE + kern_type = KERN_TYPE_PBKDF2_SHA512; + dgst_size = DGST_SIZE_8_16; + parse_func = sha512osx_parse_hash; + sort_by_digest = sort_by_digest_8_16; + opti_type = OPTI_TYPE_ZERO_BYTE; + dgst_pos0 = 0; + dgst_pos1 = 1; + dgst_pos2 = 2; + dgst_pos3 = 3; + break; + + case 7200: hash_type = HASH_TYPE_SHA512; + salt_type = SALT_TYPE_EMBEDDED; + attack_exec = ATTACK_EXEC_ON_CPU; + opts_type = OPTS_TYPE_PT_GENERATE_LE; // should be OPTS_TYPE_PT_GENERATE_BE + kern_type = KERN_TYPE_PBKDF2_SHA512; + dgst_size = DGST_SIZE_8_16; + parse_func = sha512grub_parse_hash; + sort_by_digest = sort_by_digest_8_16; + opti_type = OPTI_TYPE_ZERO_BYTE; + dgst_pos0 = 0; + dgst_pos1 = 1; + dgst_pos2 = 2; + dgst_pos3 = 3; + break; + + case 7300: hash_type = HASH_TYPE_SHA1; + salt_type = SALT_TYPE_EMBEDDED; + attack_exec = ATTACK_EXEC_ON_GPU; + opts_type = OPTS_TYPE_PT_GENERATE_BE + | OPTS_TYPE_ST_ADD80 + | OPTS_TYPE_ST_ADDBITS15; + kern_type = KERN_TYPE_RAKP; + dgst_size = DGST_SIZE_4_5; + parse_func = rakp_parse_hash; + sort_by_digest = sort_by_digest_4_5; + opti_type = OPTI_TYPE_ZERO_BYTE + | OPTI_TYPE_NOT_ITERATED; + dgst_pos0 = 3; + dgst_pos1 = 4; + dgst_pos2 = 2; + dgst_pos3 = 1; + break; + + case 7400: hash_type = HASH_TYPE_SHA256; + salt_type = SALT_TYPE_EMBEDDED; + attack_exec = ATTACK_EXEC_ON_CPU; + opts_type = OPTS_TYPE_PT_GENERATE_LE; // should be OPTS_TYPE_PT_GENERATE_BE + kern_type = KERN_TYPE_SHA256CRYPT; + dgst_size = DGST_SIZE_4_8; + parse_func = sha256crypt_parse_hash; + sort_by_digest = sort_by_digest_4_8; + opti_type = OPTI_TYPE_ZERO_BYTE; + dgst_pos0 = 0; + dgst_pos1 = 1; + dgst_pos2 = 2; + dgst_pos3 = 3; + break; + + case 7500: hash_type = HASH_TYPE_KRB5PA; + salt_type = SALT_TYPE_EMBEDDED; + attack_exec = ATTACK_EXEC_ON_GPU; + opts_type = OPTS_TYPE_PT_GENERATE_LE; + kern_type = KERN_TYPE_KRB5PA; + dgst_size = DGST_SIZE_4_4; + parse_func = krb5pa_parse_hash; + sort_by_digest = sort_by_digest_4_4; + opti_type = OPTI_TYPE_ZERO_BYTE + | OPTI_TYPE_NOT_ITERATED; + dgst_pos0 = 3; + dgst_pos1 = 7; + dgst_pos2 = 2; + dgst_pos3 = 6; + break; + + case 7600: hash_type = HASH_TYPE_SHA1; + salt_type = SALT_TYPE_INTERN; + attack_exec = ATTACK_EXEC_ON_GPU; + opts_type = OPTS_TYPE_PT_GENERATE_BE + | OPTS_TYPE_PT_ADD80 + | OPTS_TYPE_PT_ADDBITS15; + kern_type = KERN_TYPE_SHA1_SLT_SHA1_PW; + dgst_size = DGST_SIZE_4_5; + parse_func = redmine_parse_hash; + sort_by_digest = sort_by_digest_4_5; + opti_type = OPTI_TYPE_ZERO_BYTE + | OPTI_TYPE_PRECOMPUTE_INIT + | OPTI_TYPE_EARLY_SKIP + | OPTI_TYPE_NOT_ITERATED + | OPTI_TYPE_PREPENDED_SALT; + dgst_pos0 = 3; + dgst_pos1 = 4; + dgst_pos2 = 2; + dgst_pos3 = 1; + break; + + case 7700: hash_type = HASH_TYPE_SAPB; + salt_type = SALT_TYPE_EMBEDDED; + attack_exec = ATTACK_EXEC_ON_GPU; + opts_type = OPTS_TYPE_PT_GENERATE_LE + | OPTS_TYPE_PT_UPPER + | OPTS_TYPE_ST_UPPER; + kern_type = KERN_TYPE_SAPB; + dgst_size = DGST_SIZE_4_4; // originally DGST_SIZE_4_2 + parse_func = sapb_parse_hash; + sort_by_digest = sort_by_digest_4_4; // originally sort_by_digest_4_2 + opti_type = OPTI_TYPE_ZERO_BYTE + | OPTI_TYPE_PRECOMPUTE_INIT + | OPTI_TYPE_NOT_ITERATED; + dgst_pos0 = 0; + dgst_pos1 = 1; + dgst_pos2 = 2; + dgst_pos3 = 3; + break; + + case 7800: hash_type = HASH_TYPE_SAPG; + salt_type = SALT_TYPE_EMBEDDED; + attack_exec = ATTACK_EXEC_ON_GPU; + opts_type = OPTS_TYPE_PT_GENERATE_BE + | OPTS_TYPE_ST_ADD80 + | OPTS_TYPE_ST_UPPER; + kern_type = KERN_TYPE_SAPG; + dgst_size = DGST_SIZE_4_5; + parse_func = sapg_parse_hash; + sort_by_digest = sort_by_digest_4_5; + opti_type = OPTI_TYPE_ZERO_BYTE + | OPTI_TYPE_PRECOMPUTE_INIT + | OPTI_TYPE_NOT_ITERATED; + dgst_pos0 = 3; + dgst_pos1 = 4; + dgst_pos2 = 2; + dgst_pos3 = 1; + break; + + case 7900: hash_type = HASH_TYPE_SHA512; + salt_type = SALT_TYPE_EMBEDDED; + attack_exec = ATTACK_EXEC_ON_CPU; + opts_type = OPTS_TYPE_PT_GENERATE_LE; // should be OPTS_TYPE_PT_GENERATE_BE + kern_type = KERN_TYPE_DRUPAL7; + dgst_size = DGST_SIZE_8_8; + parse_func = drupal7_parse_hash; + sort_by_digest = sort_by_digest_8_8; + opti_type = OPTI_TYPE_ZERO_BYTE; + dgst_pos0 = 0; + dgst_pos1 = 1; + dgst_pos2 = 2; + dgst_pos3 = 3; + break; + + case 8000: hash_type = HASH_TYPE_SHA256; + salt_type = SALT_TYPE_EMBEDDED; + attack_exec = ATTACK_EXEC_ON_GPU; + opts_type = OPTS_TYPE_PT_GENERATE_BE + | OPTS_TYPE_PT_UNICODE + | OPTS_TYPE_ST_ADD80 + | OPTS_TYPE_ST_HEX; + kern_type = KERN_TYPE_SYBASEASE; + dgst_size = DGST_SIZE_4_8; + parse_func = sybasease_parse_hash; + sort_by_digest = sort_by_digest_4_8; + opti_type = OPTI_TYPE_ZERO_BYTE + | OPTI_TYPE_PRECOMPUTE_INIT + | OPTI_TYPE_SCALAR_MODE + | OPTI_TYPE_EARLY_SKIP + | OPTI_TYPE_NOT_ITERATED + | OPTI_TYPE_RAW_HASH; + dgst_pos0 = 3; + dgst_pos1 = 7; + dgst_pos2 = 2; + dgst_pos3 = 6; + break; + + case 8100: hash_type = HASH_TYPE_SHA1; + salt_type = SALT_TYPE_EMBEDDED; + attack_exec = ATTACK_EXEC_ON_GPU; + opts_type = OPTS_TYPE_PT_GENERATE_BE; + kern_type = KERN_TYPE_NETSCALER; + dgst_size = DGST_SIZE_4_5; + parse_func = netscaler_parse_hash; + sort_by_digest = sort_by_digest_4_5; + opti_type = OPTI_TYPE_ZERO_BYTE + | OPTI_TYPE_PRECOMPUTE_INIT + | OPTI_TYPE_PRECOMPUTE_MERKLE + | OPTI_TYPE_EARLY_SKIP + | OPTI_TYPE_NOT_ITERATED + | OPTI_TYPE_PREPENDED_SALT + | OPTI_TYPE_RAW_HASH; + dgst_pos0 = 3; + dgst_pos1 = 4; + dgst_pos2 = 2; + dgst_pos3 = 1; + break; + + case 8200: hash_type = HASH_TYPE_SHA256; + salt_type = SALT_TYPE_EMBEDDED; + attack_exec = ATTACK_EXEC_ON_CPU; + opts_type = OPTS_TYPE_PT_GENERATE_LE; // should be OPTS_TYPE_PT_GENERATE_BE + kern_type = KERN_TYPE_CLOUDKEY; + dgst_size = DGST_SIZE_4_8; + parse_func = cloudkey_parse_hash; + sort_by_digest = sort_by_digest_4_8; + opti_type = OPTI_TYPE_ZERO_BYTE; + dgst_pos0 = 0; + dgst_pos1 = 1; + dgst_pos2 = 2; + dgst_pos3 = 3; + break; + + case 8300: hash_type = HASH_TYPE_SHA1; + salt_type = SALT_TYPE_EMBEDDED; + attack_exec = ATTACK_EXEC_ON_GPU; + opts_type = OPTS_TYPE_PT_GENERATE_LE + | OPTS_TYPE_ST_HEX + | OPTS_TYPE_ST_ADD80; + kern_type = KERN_TYPE_NSEC3; + dgst_size = DGST_SIZE_4_5; + parse_func = nsec3_parse_hash; + sort_by_digest = sort_by_digest_4_5; + opti_type = OPTI_TYPE_ZERO_BYTE; + dgst_pos0 = 3; + dgst_pos1 = 4; + dgst_pos2 = 2; + dgst_pos3 = 1; + break; + + case 8400: hash_type = HASH_TYPE_SHA1; + salt_type = SALT_TYPE_INTERN; + attack_exec = ATTACK_EXEC_ON_GPU; + opts_type = OPTS_TYPE_PT_GENERATE_BE + | OPTS_TYPE_PT_ADD80 + | OPTS_TYPE_PT_ADDBITS15; + kern_type = KERN_TYPE_WBB3; + dgst_size = DGST_SIZE_4_5; + parse_func = wbb3_parse_hash; + sort_by_digest = sort_by_digest_4_5; + opti_type = OPTI_TYPE_ZERO_BYTE + | OPTI_TYPE_PRECOMPUTE_INIT + | OPTI_TYPE_NOT_ITERATED; + dgst_pos0 = 3; + dgst_pos1 = 4; + dgst_pos2 = 2; + dgst_pos3 = 1; + break; + + case 8500: hash_type = HASH_TYPE_DESRACF; + salt_type = SALT_TYPE_EMBEDDED; + attack_exec = ATTACK_EXEC_ON_GPU; + opts_type = OPTS_TYPE_PT_GENERATE_LE + | OPTS_TYPE_ST_UPPER; + kern_type = KERN_TYPE_RACF; + dgst_size = DGST_SIZE_4_4; // originally DGST_SIZE_4_2 + parse_func = racf_parse_hash; + sort_by_digest = sort_by_digest_4_4; // originally sort_by_digest_4_2 + opti_type = OPTI_TYPE_ZERO_BYTE + | OPTI_TYPE_SCALAR_MODE + | OPTI_TYPE_PRECOMPUTE_PERMUT; + dgst_pos0 = 0; + dgst_pos1 = 1; + dgst_pos2 = 2; + dgst_pos3 = 3; + break; + + case 8600: hash_type = HASH_TYPE_LOTUS5; + salt_type = SALT_TYPE_NONE; + attack_exec = ATTACK_EXEC_ON_GPU; + opts_type = OPTS_TYPE_PT_GENERATE_LE; + kern_type = KERN_TYPE_LOTUS5; + dgst_size = DGST_SIZE_4_4; + parse_func = lotus5_parse_hash; + sort_by_digest = sort_by_digest_4_4; + opti_type = OPTI_TYPE_SCALAR_MODE + | OPTI_TYPE_EARLY_SKIP + | OPTI_TYPE_NOT_ITERATED + | OPTI_TYPE_NOT_SALTED + | OPTI_TYPE_RAW_HASH; + dgst_pos0 = 0; + dgst_pos1 = 1; + dgst_pos2 = 2; + dgst_pos3 = 3; + break; + + case 8700: hash_type = HASH_TYPE_LOTUS6; + salt_type = SALT_TYPE_EMBEDDED; + attack_exec = ATTACK_EXEC_ON_GPU; + opts_type = OPTS_TYPE_PT_GENERATE_LE; + kern_type = KERN_TYPE_LOTUS6; + dgst_size = DGST_SIZE_4_4; + parse_func = lotus6_parse_hash; + sort_by_digest = sort_by_digest_4_4; + opti_type = OPTI_TYPE_SCALAR_MODE + | OPTI_TYPE_EARLY_SKIP + | OPTI_TYPE_NOT_ITERATED + | OPTI_TYPE_RAW_HASH; + dgst_pos0 = 0; + dgst_pos1 = 1; + dgst_pos2 = 2; + dgst_pos3 = 3; + break; + + case 8800: hash_type = HASH_TYPE_ANDROIDFDE; + salt_type = SALT_TYPE_EMBEDDED; + attack_exec = ATTACK_EXEC_ON_CPU; + opts_type = OPTS_TYPE_PT_GENERATE_LE; + kern_type = KERN_TYPE_ANDROIDFDE; + dgst_size = DGST_SIZE_4_4; + parse_func = androidfde_parse_hash; + sort_by_digest = sort_by_digest_4_4; + opti_type = OPTI_TYPE_ZERO_BYTE; + dgst_pos0 = 0; + dgst_pos1 = 1; + dgst_pos2 = 2; + dgst_pos3 = 3; + break; + + case 8900: hash_type = HASH_TYPE_SCRYPT; + salt_type = SALT_TYPE_EMBEDDED; + attack_exec = ATTACK_EXEC_ON_CPU; + opts_type = OPTS_TYPE_PT_GENERATE_LE; + kern_type = KERN_TYPE_SCRYPT; + dgst_size = DGST_SIZE_4_8; + parse_func = scrypt_parse_hash; + sort_by_digest = sort_by_digest_4_8; + opti_type = OPTI_TYPE_ZERO_BYTE; + dgst_pos0 = 0; + dgst_pos1 = 1; + dgst_pos2 = 2; + dgst_pos3 = 3; + break; + + case 9000: hash_type = HASH_TYPE_SHA1; + salt_type = SALT_TYPE_EMBEDDED; + attack_exec = ATTACK_EXEC_ON_CPU; + opts_type = OPTS_TYPE_PT_GENERATE_LE + | OPTS_TYPE_ST_GENERATE_LE; + kern_type = KERN_TYPE_PSAFE2; + dgst_size = DGST_SIZE_4_5; + parse_func = psafe2_parse_hash; + sort_by_digest = sort_by_digest_4_5; + opti_type = OPTI_TYPE_ZERO_BYTE; + dgst_pos0 = 0; + dgst_pos1 = 1; + dgst_pos2 = 2; + dgst_pos3 = 3; + break; + + case 9100: hash_type = HASH_TYPE_LOTUS8; + salt_type = SALT_TYPE_EMBEDDED; + attack_exec = ATTACK_EXEC_ON_CPU; + opts_type = OPTS_TYPE_PT_GENERATE_LE; + kern_type = KERN_TYPE_LOTUS8; + dgst_size = DGST_SIZE_4_4; // originally DGST_SIZE_4_2 + parse_func = lotus8_parse_hash; + sort_by_digest = sort_by_digest_4_4; // originally sort_by_digest_4_2 + opti_type = OPTI_TYPE_ZERO_BYTE; + dgst_pos0 = 0; + dgst_pos1 = 1; + dgst_pos2 = 2; + dgst_pos3 = 3; + break; + + case 9200: hash_type = HASH_TYPE_SHA256; + salt_type = SALT_TYPE_EMBEDDED; + attack_exec = ATTACK_EXEC_ON_CPU; + opts_type = OPTS_TYPE_PT_GENERATE_LE; // should be OPTS_TYPE_PT_GENERATE_BE + kern_type = KERN_TYPE_PBKDF2_SHA256; + dgst_size = DGST_SIZE_4_32; + parse_func = cisco8_parse_hash; + sort_by_digest = sort_by_digest_4_32; + opti_type = OPTI_TYPE_ZERO_BYTE; + dgst_pos0 = 0; + dgst_pos1 = 1; + dgst_pos2 = 2; + dgst_pos3 = 3; + break; + + case 9300: hash_type = HASH_TYPE_SCRYPT; + salt_type = SALT_TYPE_EMBEDDED; + attack_exec = ATTACK_EXEC_ON_CPU; + opts_type = OPTS_TYPE_PT_GENERATE_LE; + kern_type = KERN_TYPE_SCRYPT; + dgst_size = DGST_SIZE_4_8; + parse_func = cisco9_parse_hash; + sort_by_digest = sort_by_digest_4_8; + opti_type = OPTI_TYPE_ZERO_BYTE; + dgst_pos0 = 0; + dgst_pos1 = 1; + dgst_pos2 = 2; + dgst_pos3 = 3; + break; + + case 9400: hash_type = HASH_TYPE_OFFICE2007; + salt_type = SALT_TYPE_EMBEDDED; + attack_exec = ATTACK_EXEC_ON_CPU; + opts_type = OPTS_TYPE_PT_GENERATE_LE; + kern_type = KERN_TYPE_OFFICE2007; + dgst_size = DGST_SIZE_4_4; + parse_func = office2007_parse_hash; + sort_by_digest = sort_by_digest_4_4; + opti_type = OPTI_TYPE_ZERO_BYTE; + dgst_pos0 = 0; + dgst_pos1 = 1; + dgst_pos2 = 2; + dgst_pos3 = 3; + break; + + case 9500: hash_type = HASH_TYPE_OFFICE2010; + salt_type = SALT_TYPE_EMBEDDED; + attack_exec = ATTACK_EXEC_ON_CPU; + opts_type = OPTS_TYPE_PT_GENERATE_LE; + kern_type = KERN_TYPE_OFFICE2010; + dgst_size = DGST_SIZE_4_4; + parse_func = office2010_parse_hash; + sort_by_digest = sort_by_digest_4_4; + opti_type = OPTI_TYPE_ZERO_BYTE; + dgst_pos0 = 0; + dgst_pos1 = 1; + dgst_pos2 = 2; + dgst_pos3 = 3; + break; + + case 9600: hash_type = HASH_TYPE_OFFICE2013; + salt_type = SALT_TYPE_EMBEDDED; + attack_exec = ATTACK_EXEC_ON_CPU; + opts_type = OPTS_TYPE_PT_GENERATE_LE; + kern_type = KERN_TYPE_OFFICE2013; + dgst_size = DGST_SIZE_4_4; + parse_func = office2013_parse_hash; + sort_by_digest = sort_by_digest_4_4; + opti_type = OPTI_TYPE_ZERO_BYTE; + dgst_pos0 = 0; + dgst_pos1 = 1; + dgst_pos2 = 2; + dgst_pos3 = 3; + break; + + case 9700: hash_type = HASH_TYPE_OLDOFFICE01; + salt_type = SALT_TYPE_EMBEDDED; + attack_exec = ATTACK_EXEC_ON_GPU; + opts_type = OPTS_TYPE_PT_GENERATE_LE + | OPTS_TYPE_PT_ADD80 + | OPTS_TYPE_PT_UNICODE; + kern_type = KERN_TYPE_OLDOFFICE01; + dgst_size = DGST_SIZE_4_4; + parse_func = oldoffice01_parse_hash; + sort_by_digest = sort_by_digest_4_4; + opti_type = OPTI_TYPE_ZERO_BYTE + | OPTI_TYPE_PRECOMPUTE_INIT + | OPTI_TYPE_NOT_ITERATED; + dgst_pos0 = 0; + dgst_pos1 = 1; + dgst_pos2 = 2; + dgst_pos3 = 3; + break; + + case 9710: hash_type = HASH_TYPE_OLDOFFICE01; + salt_type = SALT_TYPE_EMBEDDED; + attack_exec = ATTACK_EXEC_ON_GPU; + opts_type = OPTS_TYPE_PT_GENERATE_LE + | OPTS_TYPE_PT_ADD80; + kern_type = KERN_TYPE_OLDOFFICE01CM1; + dgst_size = DGST_SIZE_4_4; + parse_func = oldoffice01cm1_parse_hash; + sort_by_digest = sort_by_digest_4_4; + opti_type = OPTI_TYPE_ZERO_BYTE + | OPTI_TYPE_PRECOMPUTE_INIT + | OPTI_TYPE_NOT_ITERATED; + dgst_pos0 = 0; + dgst_pos1 = 1; + dgst_pos2 = 2; + dgst_pos3 = 3; + break; + + case 9720: hash_type = HASH_TYPE_OLDOFFICE01; + salt_type = SALT_TYPE_EMBEDDED; + attack_exec = ATTACK_EXEC_ON_GPU; + opts_type = OPTS_TYPE_PT_GENERATE_LE + | OPTS_TYPE_PT_ADD80 + | OPTS_TYPE_PT_UNICODE + | OPTS_TYPE_PT_NEVERCRACK; + kern_type = KERN_TYPE_OLDOFFICE01CM2; + dgst_size = DGST_SIZE_4_4; + parse_func = oldoffice01cm2_parse_hash; + sort_by_digest = sort_by_digest_4_4; + opti_type = OPTI_TYPE_ZERO_BYTE + | OPTI_TYPE_PRECOMPUTE_INIT + | OPTI_TYPE_NOT_ITERATED; + dgst_pos0 = 0; + dgst_pos1 = 1; + dgst_pos2 = 2; + dgst_pos3 = 3; + break; + + case 9800: hash_type = HASH_TYPE_OLDOFFICE34; + salt_type = SALT_TYPE_EMBEDDED; + attack_exec = ATTACK_EXEC_ON_GPU; + opts_type = OPTS_TYPE_PT_GENERATE_BE + | OPTS_TYPE_PT_ADD80 + | OPTS_TYPE_PT_UNICODE; + kern_type = KERN_TYPE_OLDOFFICE34; + dgst_size = DGST_SIZE_4_4; + parse_func = oldoffice34_parse_hash; + sort_by_digest = sort_by_digest_4_4; + opti_type = OPTI_TYPE_ZERO_BYTE + | OPTI_TYPE_PRECOMPUTE_INIT + | OPTI_TYPE_NOT_ITERATED; + dgst_pos0 = 0; + dgst_pos1 = 1; + dgst_pos2 = 2; + dgst_pos3 = 3; + break; + + case 9810: hash_type = HASH_TYPE_OLDOFFICE34; + salt_type = SALT_TYPE_EMBEDDED; + attack_exec = ATTACK_EXEC_ON_GPU; + opts_type = OPTS_TYPE_PT_GENERATE_LE; + kern_type = KERN_TYPE_OLDOFFICE34CM1; + dgst_size = DGST_SIZE_4_4; + parse_func = oldoffice34cm1_parse_hash; + sort_by_digest = sort_by_digest_4_4; + opti_type = OPTI_TYPE_ZERO_BYTE + | OPTI_TYPE_PRECOMPUTE_INIT + | OPTI_TYPE_NOT_ITERATED; + dgst_pos0 = 0; + dgst_pos1 = 1; + dgst_pos2 = 2; + dgst_pos3 = 3; + break; + + case 9820: hash_type = HASH_TYPE_OLDOFFICE34; + salt_type = SALT_TYPE_EMBEDDED; + attack_exec = ATTACK_EXEC_ON_GPU; + opts_type = OPTS_TYPE_PT_GENERATE_BE + | OPTS_TYPE_PT_ADD80 + | OPTS_TYPE_PT_UNICODE + | OPTS_TYPE_PT_NEVERCRACK; + kern_type = KERN_TYPE_OLDOFFICE34CM2; + dgst_size = DGST_SIZE_4_4; + parse_func = oldoffice34cm2_parse_hash; + sort_by_digest = sort_by_digest_4_4; + opti_type = OPTI_TYPE_ZERO_BYTE + | OPTI_TYPE_PRECOMPUTE_INIT + | OPTI_TYPE_NOT_ITERATED; + dgst_pos0 = 0; + dgst_pos1 = 1; + dgst_pos2 = 2; + dgst_pos3 = 3; + break; + + case 9900: hash_type = HASH_TYPE_MD5; + salt_type = SALT_TYPE_NONE; + attack_exec = ATTACK_EXEC_ON_GPU; + opts_type = OPTS_TYPE_PT_GENERATE_LE; + kern_type = KERN_TYPE_RADMIN2; + dgst_size = DGST_SIZE_4_4; + parse_func = radmin2_parse_hash; + sort_by_digest = sort_by_digest_4_4; + opti_type = OPTI_TYPE_ZERO_BYTE + | OPTI_TYPE_PRECOMPUTE_INIT + | OPTI_TYPE_SCALAR_MODE + | OPTI_TYPE_EARLY_SKIP + | OPTI_TYPE_NOT_ITERATED + | OPTI_TYPE_NOT_SALTED; + dgst_pos0 = 0; + dgst_pos1 = 3; + dgst_pos2 = 2; + dgst_pos3 = 1; + break; + + case 10000: hash_type = HASH_TYPE_SHA256; + salt_type = SALT_TYPE_EMBEDDED; + attack_exec = ATTACK_EXEC_ON_CPU; + opts_type = OPTS_TYPE_PT_GENERATE_LE; // should be OPTS_TYPE_PT_GENERATE_BE + kern_type = KERN_TYPE_PBKDF2_SHA256; + dgst_size = DGST_SIZE_4_32; + parse_func = djangopbkdf2_parse_hash; + sort_by_digest = sort_by_digest_4_32; + opti_type = OPTI_TYPE_ZERO_BYTE; + dgst_pos0 = 0; + dgst_pos1 = 1; + dgst_pos2 = 2; + dgst_pos3 = 3; + break; + + case 10100: hash_type = HASH_TYPE_SIPHASH; + salt_type = SALT_TYPE_EMBEDDED; + attack_exec = ATTACK_EXEC_ON_GPU; + opts_type = OPTS_TYPE_PT_GENERATE_LE; + kern_type = KERN_TYPE_SIPHASH; + dgst_size = DGST_SIZE_4_4; // originally DGST_SIZE_4_2 + parse_func = siphash_parse_hash; + sort_by_digest = sort_by_digest_4_4; // originally sort_by_digest_4_2 + opti_type = OPTI_TYPE_ZERO_BYTE + | OPTI_TYPE_SCALAR_MODE + | OPTI_TYPE_NOT_ITERATED + | OPTI_TYPE_RAW_HASH; + dgst_pos0 = 0; + dgst_pos1 = 1; + dgst_pos2 = 2; + dgst_pos3 = 3; + break; + + case 10200: hash_type = HASH_TYPE_MD5; + salt_type = SALT_TYPE_EMBEDDED; + attack_exec = ATTACK_EXEC_ON_GPU; + opts_type = OPTS_TYPE_PT_GENERATE_LE + | OPTS_TYPE_ST_ADD80 + | OPTS_TYPE_ST_ADDBITS14; + kern_type = KERN_TYPE_HMACMD5_PW; + dgst_size = DGST_SIZE_4_4; + parse_func = crammd5_parse_hash; + sort_by_digest = sort_by_digest_4_4; + opti_type = OPTI_TYPE_ZERO_BYTE + | OPTI_TYPE_NOT_ITERATED; + dgst_pos0 = 0; + dgst_pos1 = 3; + dgst_pos2 = 2; + dgst_pos3 = 1; + break; + + case 10300: hash_type = HASH_TYPE_SHA1; + salt_type = SALT_TYPE_EMBEDDED; + attack_exec = ATTACK_EXEC_ON_CPU; + opts_type = OPTS_TYPE_PT_GENERATE_LE; // should be OPTS_TYPE_PT_GENERATE_BE + kern_type = KERN_TYPE_SAPH_SHA1; + dgst_size = DGST_SIZE_4_5; + parse_func = saph_sha1_parse_hash; + sort_by_digest = sort_by_digest_4_5; + opti_type = OPTI_TYPE_ZERO_BYTE; + dgst_pos0 = 0; + dgst_pos1 = 1; + dgst_pos2 = 2; + dgst_pos3 = 3; + break; + + case 10400: hash_type = HASH_TYPE_PDFU16; + salt_type = SALT_TYPE_EMBEDDED; + attack_exec = ATTACK_EXEC_ON_GPU; + opts_type = OPTS_TYPE_PT_GENERATE_LE; + kern_type = KERN_TYPE_PDF11; + dgst_size = DGST_SIZE_4_4; + parse_func = pdf11_parse_hash; + sort_by_digest = sort_by_digest_4_4; + opti_type = OPTI_TYPE_ZERO_BYTE + | OPTI_TYPE_NOT_ITERATED; + dgst_pos0 = 0; + dgst_pos1 = 1; + dgst_pos2 = 2; + dgst_pos3 = 3; + break; + + case 10410: hash_type = HASH_TYPE_PDFU16; + salt_type = SALT_TYPE_EMBEDDED; + attack_exec = ATTACK_EXEC_ON_GPU; + opts_type = OPTS_TYPE_PT_GENERATE_LE; + kern_type = KERN_TYPE_PDF11CM1; + dgst_size = DGST_SIZE_4_4; + parse_func = pdf11cm1_parse_hash; + sort_by_digest = sort_by_digest_4_4; + opti_type = OPTI_TYPE_ZERO_BYTE + | OPTI_TYPE_NOT_ITERATED; + dgst_pos0 = 0; + dgst_pos1 = 1; + dgst_pos2 = 2; + dgst_pos3 = 3; + break; + + case 10420: hash_type = HASH_TYPE_PDFU16; + salt_type = SALT_TYPE_EMBEDDED; + attack_exec = ATTACK_EXEC_ON_GPU; + opts_type = OPTS_TYPE_PT_GENERATE_LE; + kern_type = KERN_TYPE_PDF11CM2; + dgst_size = DGST_SIZE_4_4; + parse_func = pdf11cm2_parse_hash; + sort_by_digest = sort_by_digest_4_4; + opti_type = OPTI_TYPE_ZERO_BYTE + | OPTI_TYPE_NOT_ITERATED; + dgst_pos0 = 0; + dgst_pos1 = 1; + dgst_pos2 = 2; + dgst_pos3 = 3; + break; + + case 10500: hash_type = HASH_TYPE_PDFU16; + salt_type = SALT_TYPE_EMBEDDED; + attack_exec = ATTACK_EXEC_ON_CPU; + opts_type = OPTS_TYPE_PT_GENERATE_LE; + kern_type = KERN_TYPE_PDF14; + dgst_size = DGST_SIZE_4_4; + parse_func = pdf14_parse_hash; + sort_by_digest = sort_by_digest_4_4; + opti_type = OPTI_TYPE_ZERO_BYTE + | OPTI_TYPE_NOT_ITERATED; + dgst_pos0 = 0; + dgst_pos1 = 1; + dgst_pos2 = 2; + dgst_pos3 = 3; + break; + + case 10600: hash_type = HASH_TYPE_SHA256; + salt_type = SALT_TYPE_EMBEDDED; + attack_exec = ATTACK_EXEC_ON_GPU; + opts_type = OPTS_TYPE_PT_GENERATE_BE + | OPTS_TYPE_ST_ADD80 + | OPTS_TYPE_ST_ADDBITS15 + | OPTS_TYPE_HASH_COPY; + kern_type = KERN_TYPE_SHA256_PWSLT; + dgst_size = DGST_SIZE_4_8; + parse_func = pdf17l3_parse_hash; + sort_by_digest = sort_by_digest_4_8; + opti_type = OPTI_TYPE_ZERO_BYTE + | OPTI_TYPE_PRECOMPUTE_INIT + | OPTI_TYPE_PRECOMPUTE_MERKLE + | OPTI_TYPE_SCALAR_MODE + | OPTI_TYPE_EARLY_SKIP + | OPTI_TYPE_NOT_ITERATED + | OPTI_TYPE_APPENDED_SALT + | OPTI_TYPE_RAW_HASH; + dgst_pos0 = 3; + dgst_pos1 = 7; + dgst_pos2 = 2; + dgst_pos3 = 6; + break; + + case 10700: hash_type = HASH_TYPE_PDFU32; + salt_type = SALT_TYPE_EMBEDDED; + attack_exec = ATTACK_EXEC_ON_CPU; + opts_type = OPTS_TYPE_PT_GENERATE_LE + | OPTS_TYPE_HASH_COPY; + kern_type = KERN_TYPE_PDF17L8; + dgst_size = DGST_SIZE_4_8; + parse_func = pdf17l8_parse_hash; + sort_by_digest = sort_by_digest_4_8; + opti_type = OPTI_TYPE_ZERO_BYTE + | OPTI_TYPE_NOT_ITERATED; + dgst_pos0 = 0; + dgst_pos1 = 1; + dgst_pos2 = 2; + dgst_pos3 = 3; + break; + + case 10800: hash_type = HASH_TYPE_SHA384; + salt_type = SALT_TYPE_NONE; + attack_exec = ATTACK_EXEC_ON_GPU; + opts_type = OPTS_TYPE_PT_GENERATE_BE + | OPTS_TYPE_PT_ADD80 + | OPTS_TYPE_PT_ADDBITS15; + kern_type = KERN_TYPE_SHA384; + dgst_size = DGST_SIZE_8_8; + parse_func = sha384_parse_hash; + sort_by_digest = sort_by_digest_8_8; + opti_type = OPTI_TYPE_ZERO_BYTE + | OPTI_TYPE_PRECOMPUTE_INIT + | OPTI_TYPE_PRECOMPUTE_MERKLE + | OPTI_TYPE_SCALAR_MODE + | OPTI_TYPE_EARLY_SKIP + | OPTI_TYPE_NOT_ITERATED + | OPTI_TYPE_NOT_SALTED + | OPTI_TYPE_RAW_HASH; + dgst_pos0 = 6; + dgst_pos1 = 7; + dgst_pos2 = 4; + dgst_pos3 = 5; + break; + + case 10900: hash_type = HASH_TYPE_PBKDF2_SHA256; + salt_type = SALT_TYPE_EMBEDDED; + attack_exec = ATTACK_EXEC_ON_CPU; + opts_type = OPTS_TYPE_PT_GENERATE_LE + | OPTS_TYPE_ST_BASE64 + | OPTS_TYPE_HASH_COPY; + kern_type = KERN_TYPE_PBKDF2_SHA256; + dgst_size = DGST_SIZE_4_32; + parse_func = pbkdf2_sha256_parse_hash; + sort_by_digest = sort_by_digest_4_32; + opti_type = OPTI_TYPE_ZERO_BYTE; + dgst_pos0 = 0; + dgst_pos1 = 1; + dgst_pos2 = 2; + dgst_pos3 = 3; + break; + + case 11000: hash_type = HASH_TYPE_MD5; + salt_type = SALT_TYPE_INTERN; + attack_exec = ATTACK_EXEC_ON_GPU; + opts_type = OPTS_TYPE_PT_GENERATE_LE + | OPTS_TYPE_PT_ADD80; + kern_type = KERN_TYPE_PRESTASHOP; + dgst_size = DGST_SIZE_4_4; + parse_func = prestashop_parse_hash; + sort_by_digest = sort_by_digest_4_4; + opti_type = OPTI_TYPE_ZERO_BYTE + | OPTI_TYPE_PRECOMPUTE_INIT + | OPTI_TYPE_NOT_ITERATED + | OPTI_TYPE_PREPENDED_SALT; + dgst_pos0 = 0; + dgst_pos1 = 3; + dgst_pos2 = 2; + dgst_pos3 = 1; + break; + + case 11100: hash_type = HASH_TYPE_MD5; + salt_type = SALT_TYPE_EMBEDDED; + attack_exec = ATTACK_EXEC_ON_GPU; + opts_type = OPTS_TYPE_PT_GENERATE_LE + | OPTS_TYPE_ST_ADD80; + kern_type = KERN_TYPE_POSTGRESQL_AUTH; + dgst_size = DGST_SIZE_4_4; + parse_func = postgresql_auth_parse_hash; + sort_by_digest = sort_by_digest_4_4; + opti_type = OPTI_TYPE_ZERO_BYTE + | OPTI_TYPE_PRECOMPUTE_INIT + | OPTI_TYPE_PRECOMPUTE_MERKLE + | OPTI_TYPE_EARLY_SKIP; + dgst_pos0 = 0; + dgst_pos1 = 3; + dgst_pos2 = 2; + dgst_pos3 = 1; + break; + + case 11200: hash_type = HASH_TYPE_SHA1; + salt_type = SALT_TYPE_EMBEDDED; + attack_exec = ATTACK_EXEC_ON_GPU; + opts_type = OPTS_TYPE_PT_GENERATE_BE + | OPTS_TYPE_PT_ADD80 + | OPTS_TYPE_ST_HEX; + kern_type = KERN_TYPE_MYSQL_AUTH; + dgst_size = DGST_SIZE_4_5; + parse_func = mysql_auth_parse_hash; + sort_by_digest = sort_by_digest_4_5; + opti_type = OPTI_TYPE_ZERO_BYTE + | OPTI_TYPE_EARLY_SKIP; + dgst_pos0 = 3; + dgst_pos1 = 4; + dgst_pos2 = 2; + dgst_pos3 = 1; + break; + + case 11300: hash_type = HASH_TYPE_BITCOIN_WALLET; + salt_type = SALT_TYPE_EMBEDDED; + attack_exec = ATTACK_EXEC_ON_CPU; + opts_type = OPTS_TYPE_PT_GENERATE_LE + | OPTS_TYPE_ST_HEX + | OPTS_TYPE_ST_ADD80; + kern_type = KERN_TYPE_BITCOIN_WALLET; + dgst_size = DGST_SIZE_4_4; + parse_func = bitcoin_wallet_parse_hash; + sort_by_digest = sort_by_digest_4_4; + opti_type = OPTI_TYPE_ZERO_BYTE; + dgst_pos0 = 0; + dgst_pos1 = 1; + dgst_pos2 = 2; + dgst_pos3 = 3; + break; + + case 11400: hash_type = HASH_TYPE_MD5; + salt_type = SALT_TYPE_EMBEDDED; + attack_exec = ATTACK_EXEC_ON_GPU; + opts_type = OPTS_TYPE_PT_GENERATE_LE + | OPTS_TYPE_PT_ADD80 + | OPTS_TYPE_HASH_COPY; + kern_type = KERN_TYPE_SIP_AUTH; + dgst_size = DGST_SIZE_4_4; + parse_func = sip_auth_parse_hash; + sort_by_digest = sort_by_digest_4_4; + opti_type = OPTI_TYPE_ZERO_BYTE; + dgst_pos0 = 0; + dgst_pos1 = 3; + dgst_pos2 = 2; + dgst_pos3 = 1; + break; + + case 11500: hash_type = HASH_TYPE_CRC32; + salt_type = SALT_TYPE_INTERN; + attack_exec = ATTACK_EXEC_ON_GPU; + opts_type = OPTS_TYPE_PT_GENERATE_LE + | OPTS_TYPE_ST_GENERATE_LE + | OPTS_TYPE_ST_HEX; + kern_type = KERN_TYPE_CRC32; + dgst_size = DGST_SIZE_4_4; // originally DGST_SIZE_4_2 + parse_func = crc32_parse_hash; + sort_by_digest = sort_by_digest_4_4; // originally sort_by_digest_4_2 + opti_type = OPTI_TYPE_ZERO_BYTE + | OPTI_TYPE_SCALAR_MODE; + dgst_pos0 = 0; + dgst_pos1 = 1; + dgst_pos2 = 2; + dgst_pos3 = 3; + break; + + case 11600: hash_type = HASH_TYPE_AES; + salt_type = SALT_TYPE_EMBEDDED; + attack_exec = ATTACK_EXEC_ON_CPU; + opts_type = OPTS_TYPE_PT_GENERATE_LE + | OPTS_TYPE_PT_NEVERCRACK; + kern_type = KERN_TYPE_SEVEN_ZIP; + dgst_size = DGST_SIZE_4_4; // originally DGST_SIZE_4_2 + parse_func = seven_zip_parse_hash; + sort_by_digest = sort_by_digest_4_4; // originally sort_by_digest_4_2 + opti_type = OPTI_TYPE_ZERO_BYTE; + dgst_pos0 = 0; + dgst_pos1 = 1; + dgst_pos2 = 2; + dgst_pos3 = 3; + break; + + case 11700: hash_type = HASH_TYPE_GOST_2012SBOG_256; + salt_type = SALT_TYPE_NONE; + attack_exec = ATTACK_EXEC_ON_GPU; + opts_type = OPTS_TYPE_PT_GENERATE_LE + | OPTS_TYPE_PT_ADD01; + kern_type = KERN_TYPE_GOST_2012SBOG_256; + dgst_size = DGST_SIZE_4_8; + parse_func = gost2012sbog_256_parse_hash; + sort_by_digest = sort_by_digest_4_8; + opti_type = OPTI_TYPE_ZERO_BYTE; + dgst_pos0 = 0; + dgst_pos1 = 1; + dgst_pos2 = 2; + dgst_pos3 = 3; + break; + + case 11800: hash_type = HASH_TYPE_GOST_2012SBOG_512; + salt_type = SALT_TYPE_NONE; + attack_exec = ATTACK_EXEC_ON_GPU; + opts_type = OPTS_TYPE_PT_GENERATE_LE + | OPTS_TYPE_PT_ADD01; + kern_type = KERN_TYPE_GOST_2012SBOG_512; + dgst_size = DGST_SIZE_4_16; + parse_func = gost2012sbog_512_parse_hash; + sort_by_digest = sort_by_digest_4_16; + opti_type = OPTI_TYPE_ZERO_BYTE; + dgst_pos0 = 0; + dgst_pos1 = 1; + dgst_pos2 = 2; + dgst_pos3 = 3; + break; + + case 11900: hash_type = HASH_TYPE_PBKDF2_MD5; + salt_type = SALT_TYPE_EMBEDDED; + attack_exec = ATTACK_EXEC_ON_CPU; + opts_type = OPTS_TYPE_PT_GENERATE_LE + | OPTS_TYPE_ST_BASE64 + | OPTS_TYPE_HASH_COPY; + kern_type = KERN_TYPE_PBKDF2_MD5; + dgst_size = DGST_SIZE_4_32; + parse_func = pbkdf2_md5_parse_hash; + sort_by_digest = sort_by_digest_4_32; + opti_type = OPTI_TYPE_ZERO_BYTE; + dgst_pos0 = 0; + dgst_pos1 = 1; + dgst_pos2 = 2; + dgst_pos3 = 3; + break; + + case 12000: hash_type = HASH_TYPE_PBKDF2_SHA1; + salt_type = SALT_TYPE_EMBEDDED; + attack_exec = ATTACK_EXEC_ON_CPU; + opts_type = OPTS_TYPE_PT_GENERATE_LE + | OPTS_TYPE_ST_BASE64 + | OPTS_TYPE_HASH_COPY; + kern_type = KERN_TYPE_PBKDF2_SHA1; + dgst_size = DGST_SIZE_4_32; + parse_func = pbkdf2_sha1_parse_hash; + sort_by_digest = sort_by_digest_4_32; + opti_type = OPTI_TYPE_ZERO_BYTE; + dgst_pos0 = 0; + dgst_pos1 = 1; + dgst_pos2 = 2; + dgst_pos3 = 3; + break; + + case 12100: hash_type = HASH_TYPE_PBKDF2_SHA512; + salt_type = SALT_TYPE_EMBEDDED; + attack_exec = ATTACK_EXEC_ON_CPU; + opts_type = OPTS_TYPE_PT_GENERATE_LE + | OPTS_TYPE_ST_BASE64 + | OPTS_TYPE_HASH_COPY; + kern_type = KERN_TYPE_PBKDF2_SHA512; + dgst_size = DGST_SIZE_8_16; + parse_func = pbkdf2_sha512_parse_hash; + sort_by_digest = sort_by_digest_8_16; + opti_type = OPTI_TYPE_ZERO_BYTE; + dgst_pos0 = 0; + dgst_pos1 = 1; + dgst_pos2 = 2; + dgst_pos3 = 3; + break; + + case 12200: hash_type = HASH_TYPE_ECRYPTFS; + salt_type = SALT_TYPE_EMBEDDED; + attack_exec = ATTACK_EXEC_ON_CPU; + opts_type = OPTS_TYPE_PT_GENERATE_LE; + kern_type = KERN_TYPE_ECRYPTFS; + dgst_size = DGST_SIZE_8_8; + parse_func = ecryptfs_parse_hash; + sort_by_digest = sort_by_digest_8_8; + opti_type = OPTI_TYPE_ZERO_BYTE; + dgst_pos0 = 0; + dgst_pos1 = 1; + dgst_pos2 = 2; + dgst_pos3 = 3; + break; + + case 12300: hash_type = HASH_TYPE_ORACLET; + salt_type = SALT_TYPE_EMBEDDED; + attack_exec = ATTACK_EXEC_ON_CPU; + opts_type = OPTS_TYPE_PT_GENERATE_LE; + kern_type = KERN_TYPE_ORACLET; + dgst_size = DGST_SIZE_8_16; + parse_func = oraclet_parse_hash; + sort_by_digest = sort_by_digest_8_16; + opti_type = OPTI_TYPE_ZERO_BYTE; + dgst_pos0 = 0; + dgst_pos1 = 1; + dgst_pos2 = 2; + dgst_pos3 = 3; + break; + + case 12400: hash_type = HASH_TYPE_BSDICRYPT; + salt_type = SALT_TYPE_EMBEDDED; + attack_exec = ATTACK_EXEC_ON_CPU; + opts_type = OPTS_TYPE_PT_GENERATE_LE; + kern_type = KERN_TYPE_BSDICRYPT; + dgst_size = DGST_SIZE_4_4; + parse_func = bsdicrypt_parse_hash; + sort_by_digest = sort_by_digest_4_4; + opti_type = OPTI_TYPE_ZERO_BYTE + | OPTI_TYPE_PRECOMPUTE_PERMUT; + dgst_pos0 = 0; + dgst_pos1 = 1; + dgst_pos2 = 2; + dgst_pos3 = 3; + break; + + case 12500: hash_type = HASH_TYPE_RAR3HP; + salt_type = SALT_TYPE_EMBEDDED; + attack_exec = ATTACK_EXEC_ON_CPU; + opts_type = OPTS_TYPE_PT_GENERATE_LE; + kern_type = KERN_TYPE_RAR3; + dgst_size = DGST_SIZE_4_4; + parse_func = rar3hp_parse_hash; + sort_by_digest = sort_by_digest_4_4; + opti_type = OPTI_TYPE_ZERO_BYTE; + dgst_pos0 = 0; + dgst_pos1 = 1; + dgst_pos2 = 2; + dgst_pos3 = 3; + break; + + case 12600: hash_type = HASH_TYPE_SHA256; + salt_type = SALT_TYPE_INTERN; + attack_exec = ATTACK_EXEC_ON_GPU; + opts_type = OPTS_TYPE_PT_GENERATE_BE + | OPTS_TYPE_PT_ADD80; + kern_type = KERN_TYPE_CF10; + dgst_size = DGST_SIZE_4_8; + parse_func = cf10_parse_hash; + sort_by_digest = sort_by_digest_4_8; + opti_type = OPTI_TYPE_ZERO_BYTE + | OPTI_TYPE_PRECOMPUTE_INIT + | OPTI_TYPE_EARLY_SKIP + | OPTI_TYPE_NOT_ITERATED; + dgst_pos0 = 3; + dgst_pos1 = 7; + dgst_pos2 = 2; + dgst_pos3 = 6; + break; + + case 12700: hash_type = HASH_TYPE_AES; + salt_type = SALT_TYPE_EMBEDDED; + attack_exec = ATTACK_EXEC_ON_CPU; + opts_type = OPTS_TYPE_PT_GENERATE_LE + | OPTS_TYPE_HASH_COPY; + kern_type = KERN_TYPE_MYWALLET; + dgst_size = DGST_SIZE_4_5; // because kernel uses _SHA1_ + parse_func = mywallet_parse_hash; + sort_by_digest = sort_by_digest_4_5; + opti_type = OPTI_TYPE_ZERO_BYTE; + dgst_pos0 = 0; + dgst_pos1 = 1; + dgst_pos2 = 2; + dgst_pos3 = 3; + break; + + case 12800: hash_type = HASH_TYPE_PBKDF2_SHA256; + salt_type = SALT_TYPE_EMBEDDED; + attack_exec = ATTACK_EXEC_ON_CPU; + opts_type = OPTS_TYPE_PT_GENERATE_LE; + kern_type = KERN_TYPE_MS_DRSR; + dgst_size = DGST_SIZE_4_8; + parse_func = ms_drsr_parse_hash; + sort_by_digest = sort_by_digest_4_8; + opti_type = OPTI_TYPE_ZERO_BYTE; + dgst_pos0 = 0; + dgst_pos1 = 1; + dgst_pos2 = 2; + dgst_pos3 = 3; + break; + + default: usage_mini_print (PROGNAME); return (-1); + } + + /** + * transpose + */ + + data.parse_func = parse_func; + + /** + * misc stuff + */ + + if (hex_salt) + { + if (salt_type == SALT_TYPE_INTERN) + { + opts_type |= OPTS_TYPE_ST_HEX; + } + else + { + log_error ("ERROR: Parameter hex-salt not valid for hash-type %u", hash_mode); + + return (-1); + } + } + + uint isSalted = ((salt_type == SALT_TYPE_INTERN) + | (salt_type == SALT_TYPE_EXTERN) + | (salt_type == SALT_TYPE_EMBEDDED) + | (salt_type == SALT_TYPE_VIRTUAL)); + + sort_by_digest = sort_by_digest_p0p1; // overruled by 64 bit digest + + data.hash_type = hash_type; + data.attack_mode = attack_mode; + data.attack_kern = attack_kern; + data.attack_exec = attack_exec; + data.kern_type = kern_type; + data.opts_type = opts_type; + data.dgst_size = dgst_size; + data.salt_type = salt_type; + data.isSalted = isSalted; + data.sort_by_digest = sort_by_digest; + data.dgst_pos0 = dgst_pos0; + data.dgst_pos1 = dgst_pos1; + data.dgst_pos2 = dgst_pos2; + data.dgst_pos3 = dgst_pos3; + + esalt_size = 0; + + switch (hash_mode) + { + case 2500: esalt_size = sizeof (wpa_t); break; + case 5300: esalt_size = sizeof (ikepsk_t); break; + case 5400: esalt_size = sizeof (ikepsk_t); break; + case 5500: esalt_size = sizeof (netntlm_t); break; + case 5600: esalt_size = sizeof (netntlm_t); break; + case 6211: + case 6212: + case 6213: + case 6221: + case 6222: + case 6223: + case 6231: + case 6232: + case 6233: + case 6241: + case 6242: + case 6243: esalt_size = sizeof (tc_t); break; + case 6600: esalt_size = sizeof (agilekey_t); break; + case 7100: esalt_size = sizeof (pbkdf2_sha512_t); break; + case 7200: esalt_size = sizeof (pbkdf2_sha512_t); break; + case 7300: esalt_size = sizeof (rakp_t); break; + case 7500: esalt_size = sizeof (krb5pa_t); break; + case 8200: esalt_size = sizeof (cloudkey_t); break; + case 8800: esalt_size = sizeof (androidfde_t); break; + case 9200: esalt_size = sizeof (pbkdf2_sha256_t); break; + case 9400: esalt_size = sizeof (office2007_t); break; + case 9500: esalt_size = sizeof (office2010_t); break; + case 9600: esalt_size = sizeof (office2013_t); break; + case 9700: esalt_size = sizeof (oldoffice01_t); break; + case 9710: esalt_size = sizeof (oldoffice01_t); break; + case 9720: esalt_size = sizeof (oldoffice01_t); break; + case 9800: esalt_size = sizeof (oldoffice34_t); break; + case 9810: esalt_size = sizeof (oldoffice34_t); break; + case 9820: esalt_size = sizeof (oldoffice34_t); break; + case 10000: esalt_size = sizeof (pbkdf2_sha256_t); break; + case 10200: esalt_size = sizeof (cram_md5_t); break; + case 10400: esalt_size = sizeof (pdf_t); break; + case 10410: esalt_size = sizeof (pdf_t); break; + case 10420: esalt_size = sizeof (pdf_t); break; + case 10500: esalt_size = sizeof (pdf_t); break; + case 10600: esalt_size = sizeof (pdf_t); break; + case 10700: esalt_size = sizeof (pdf_t); break; + case 10900: esalt_size = sizeof (pbkdf2_sha256_t); break; + case 11300: esalt_size = sizeof (bitcoin_wallet_t); break; + case 11400: esalt_size = sizeof (sip_t); break; + case 11600: esalt_size = sizeof (seven_zip_t); break; + case 11900: esalt_size = sizeof (pbkdf2_md5_t); break; + case 12000: esalt_size = sizeof (pbkdf2_sha1_t); break; + case 12100: esalt_size = sizeof (pbkdf2_sha512_t); break; + } + + data.esalt_size = esalt_size; + + /** + * choose dictionary parser + */ + + if (hash_type == HASH_TYPE_LM) + { + get_next_word_func = get_next_word_lm; + } + else if (opts_type & OPTS_TYPE_PT_UPPER) + { + get_next_word_func = get_next_word_uc; + } + else + { + get_next_word_func = get_next_word_std; + } + + /** + * dictstat + */ + + dictstat_t *dictstat_base = (dictstat_t *) mycalloc (MAX_DICTSTAT, sizeof (dictstat_t)); + + #ifdef _POSIX + size_t dictstat_nmemb = 0; + #endif + + #ifdef _WIN + uint dictstat_nmemb = 0; + #endif + + char dictstat[256]; + + FILE *dictstat_fp = NULL; + + if (keyspace == 0) + { + memset (dictstat, 0, sizeof (dictstat)); + + snprintf (dictstat, sizeof (dictstat) - 1, "%s/%s.dictstat", install_dir, PROGNAME); + + dictstat_fp = fopen (dictstat, "rb"); + + if (dictstat_fp) + { + #ifdef _POSIX + struct stat tmpstat; + + fstat (fileno (dictstat_fp), &tmpstat); + #endif + + #ifdef _WIN + struct stat64 tmpstat; + + _fstat64 (fileno (dictstat_fp), &tmpstat); + #endif + + if (tmpstat.st_mtime < COMPTIME) + { + /* with v0.15 the format changed so we have to ensure user is using a good version + since there is no version-header in the dictstat file */ + + fclose (dictstat_fp); + + unlink (dictstat); + } + else + { + while (!feof (dictstat_fp)) + { + dictstat_t d; + + if (fread (&d, sizeof (dictstat_t), 1, dictstat_fp) == 0) continue; + + lsearch (&d, dictstat_base, &dictstat_nmemb, sizeof (dictstat_t), sort_by_dictstat); + + if (dictstat_nmemb == (MAX_DICTSTAT - 1000)) + { + log_error ("ERROR: There are too many entries in the %s database. You have to remove/rename it.", dictstat); + + return -1; + } + } + + fclose (dictstat_fp); + } + } + } + + /** + * potfile + */ + + char potfile[256]; + + memset (potfile, 0, sizeof (potfile)); + + snprintf (potfile, sizeof (potfile) - 1, "%s.pot", session); + + data.pot_fp = NULL; + + FILE *out_fp = NULL; + FILE *pot_fp = NULL; + + if (show == 1 || left == 1) + { + pot_fp = fopen (potfile, "rb"); + + if (pot_fp == NULL) + { + log_error ("ERROR: %s: %s", potfile, strerror (errno)); + + return (-1); + } + + if (outfile != NULL) + { + if ((out_fp = fopen (outfile, "ab")) == NULL) + { + log_error ("ERROR: %s: %s", outfile, strerror (errno)); + + fclose (pot_fp); + + return (-1); + } + } + else + { + out_fp = stdout; + } + } + else + { + if (potfile_disable == 0) + { + pot_fp = fopen (potfile, "ab"); + + if (pot_fp == NULL) + { + log_error ("ERROR: %s: %s", potfile, strerror (errno)); + + return (-1); + } + + data.pot_fp = pot_fp; + } + } + + pot_t *pot = NULL; + + uint pot_cnt = 0; + uint pot_avail = 0; + + if (show == 1 || left == 1) + { + SUPPRESS_OUTPUT = 1; + + pot_avail = count_lines (pot_fp); + + rewind (pot_fp); + + pot = (pot_t *) mycalloc (pot_avail, sizeof (pot_t)); + + uint pot_hashes_avail = 0; + + uint line_num = 0; + + while (!feof (pot_fp)) + { + line_num++; + + char line_buf[BUFSIZ]; + + int line_len = fgetl (pot_fp, line_buf); + + if (line_len == 0) continue; + + char *plain_buf = line_buf + line_len; + + pot_t *pot_ptr = &pot[pot_cnt]; + + hash_t *hashes_buf = &pot_ptr->hash; + + // we do not initialize all hashes_buf->digest etc at the beginning, since many lines may not be + // valid lines of this specific hash type (otherwise it would be more waste of memory than gain) + + if (pot_cnt == pot_hashes_avail) + { + uint pos = 0; + + for (pos = 0; pos < INCR_POT; pos++) + { + if ((pot_cnt + pos) >= pot_avail) break; + + pot_t *tmp_pot = &pot[pot_cnt + pos]; + + hash_t *tmp_hash = &tmp_pot->hash; + + tmp_hash->digest = mymalloc (dgst_size); + + if (isSalted) + { + tmp_hash->salt = (salt_t *) mymalloc (sizeof (salt_t)); + } + + if (esalt_size) + { + tmp_hash->esalt = mymalloc (esalt_size); + } + + pot_hashes_avail++; + } + } + + int plain_len = 0; + + int parser_status; + + int iter = MAX_CUT_TRIES; + + do + { + for (int i = line_len - 1; i; i--, plain_len++, plain_buf--, line_len--) + { + if (line_buf[i] == ':') + { + line_len--; + + break; + } + } + + if (data.hash_mode != 2500) + { + parser_status = parse_func (line_buf, line_len, hashes_buf); + } + else + { + int max_salt_size = sizeof (hashes_buf->salt->salt_buf); + + if (line_len > max_salt_size) + { + parser_status = PARSER_GLOBAL_LENGTH; + } + else + { + memset (&hashes_buf->salt->salt_buf, 0, max_salt_size); + + memcpy (&hashes_buf->salt->salt_buf, line_buf, line_len); + + hashes_buf->salt->salt_len = line_len; + + parser_status = PARSER_OK; + } + } + + // if NOT parsed without error, we add the ":" to the plain + + if (parser_status == PARSER_GLOBAL_LENGTH || parser_status == PARSER_HASH_LENGTH || parser_status == PARSER_SALT_LENGTH) + { + plain_len++; + plain_buf--; + } + + } while ((parser_status == PARSER_GLOBAL_LENGTH || parser_status == PARSER_HASH_LENGTH || parser_status == PARSER_SALT_LENGTH) && --iter); + + if (parser_status < PARSER_GLOBAL_ZERO) + { + // log_info ("WARNING: Potfile '%s' in line %u (%s): %s", potfile, line_num, line_buf, strparser (parser_status)); + + continue; + } + + memcpy (pot_ptr->plain_buf, plain_buf, plain_len); + + pot_ptr->plain_len = plain_len; + + pot_cnt++; + } + + fclose (pot_fp); + + SUPPRESS_OUTPUT = 0; + + qsort (pot, pot_cnt, sizeof (pot_t), sort_by_pot); + } + + /** + * gpu accel and loops auto adjustment + */ + + if (gpu_accel_chgd == 0) gpu_accel = set_gpu_accel (hash_mode); + if (gpu_loops_chgd == 0) gpu_loops = set_gpu_loops (hash_mode); + + if (workload_profile == 1) + { + gpu_loops /= 8; + gpu_accel /= 4; + + if (gpu_loops == 0) gpu_loops = 8; + if (gpu_accel == 0) gpu_accel = 2; + } + else if (workload_profile == 3) + { + gpu_loops *= 8; + gpu_accel *= 4; + + if (gpu_loops > 1024) gpu_loops = 1024; + if (gpu_accel > 256) gpu_accel = 256; // causes memory problems otherwise + } + + // those hashes *must* run at a specific gpu_loops count because of some optimization inside the kernel + + if ((opts_type & OPTS_TYPE_PT_BITSLICE) && (attack_mode == ATTACK_MODE_BF)) + { + gpu_loops = 1024; + } + + if (hash_mode == 12500) + { + gpu_loops = ROUNDS_RAR3 / 16; + } + + data.gpu_accel = gpu_accel; + data.gpu_loops = gpu_loops; + + /** + * word len + */ + + uint pw_min = PW_MIN; + uint pw_max = PW_MAX; + + switch (hash_mode) + { + case 400: if (pw_max > 40) pw_max = 40; + break; + case 500: if (pw_max > 16) pw_max = 16; + break; + case 1500: if (pw_max > 8) pw_max = 8; + break; + case 1600: if (pw_max > 16) pw_max = 16; + break; + case 1800: if (pw_max > 16) pw_max = 16; + break; + case 2100: if (pw_max > 16) pw_max = 16; + break; + case 2500: if (pw_min < 8) pw_min = 8; + break; + case 3000: if (pw_max > 7) pw_max = 7; + break; + case 5200: if (pw_max > 24) pw_max = 24; + break; + case 5800: if (pw_max > 16) pw_max = 16; + break; + case 6300: if (pw_max > 16) pw_max = 16; + break; + case 7400: if (pw_max > 16) pw_max = 16; + break; + case 7900: if (pw_max > 48) pw_max = 48; + break; + case 8500: if (pw_max > 8) pw_max = 8; + break; + case 8600: if (pw_max > 16) pw_max = 16; + break; + case 9710: pw_min = 5; + pw_max = 5; + break; + case 9810: pw_min = 5; + pw_max = 5; + break; + case 10410: pw_min = 5; + pw_max = 5; + break; + case 10300: if (pw_max < 3) pw_min = 3; + if (pw_max > 40) pw_max = 40; + break; + case 10500: if (pw_max < 3) pw_min = 3; + if (pw_max > 40) pw_max = 40; + break; + case 10700: if (pw_max > 16) pw_max = 16; + break; + case 11300: if (pw_max > 40) pw_max = 40; + break; + case 12500: if (pw_max > 20) pw_max = 20; + break; + case 12800: if (pw_max > 24) pw_max = 24; + break; + } + + if (attack_exec == ATTACK_EXEC_ON_GPU) + { + switch (attack_kern) + { + case ATTACK_KERN_STRAIGHT: if (pw_max > PW_DICTMAX) pw_max = PW_DICTMAX1; + break; + case ATTACK_KERN_COMBI: if (pw_max > PW_DICTMAX) pw_max = PW_DICTMAX1; + break; + } + } + + /** + * charsets : keep them together for more easy maintainnce + */ + + cs_t mp_sys[6]; + cs_t mp_usr[4]; + + memset (mp_sys, 0, sizeof (mp_sys)); + memset (mp_usr, 0, sizeof (mp_usr)); + + mp_setup_sys (mp_sys); + + if (custom_charset_1) mp_setup_usr (mp_sys, mp_usr, custom_charset_1, 0); + if (custom_charset_2) mp_setup_usr (mp_sys, mp_usr, custom_charset_2, 1); + if (custom_charset_3) mp_setup_usr (mp_sys, mp_usr, custom_charset_3, 2); + if (custom_charset_4) mp_setup_usr (mp_sys, mp_usr, custom_charset_4, 3); + + /** + * load hashes, part I: find input mode, count hashes + */ + + uint hashlist_mode = 0; + uint hashlist_format = HLFMT_HASHCAT; + + uint hashes_avail = 0; + + if (benchmark == 0) + { + struct stat f; + + hashlist_mode = (stat (myargv[optind], &f) == 0) ? HL_MODE_FILE : HL_MODE_ARG; + + if ((hash_mode == 2500) || + (hash_mode == 5200) || + ((hash_mode >= 6200) && (hash_mode <= 6299)) || + (hash_mode == 9000)) + { + hashlist_mode = HL_MODE_ARG; + + char *hashfile = myargv[optind]; + + data.hashfile = hashfile; + + logfile_top_var_string ("target", hashfile); + } + + if (hashlist_mode == HL_MODE_ARG) + { + if (hash_mode == 2500) + { + struct stat st; + + if (stat (data.hashfile, &st) == -1) + { + log_error ("ERROR: %s: %s", data.hashfile, strerror (errno)); + + return (-1); + } + + hashes_avail = st.st_size / sizeof (hccap_t); + } + else + { + hashes_avail = 1; + } + } + else if (hashlist_mode == HL_MODE_FILE) + { + char *hashfile = myargv[optind]; + + data.hashfile = hashfile; + + logfile_top_var_string ("target", hashfile); + + FILE *fp = NULL; + + if ((fp = fopen (hashfile, "rb")) == NULL) + { + log_error ("ERROR: %s: %s", hashfile, strerror (errno)); + + return (-1); + } + + if (data.quiet == 0) log_info_nn ("Counting lines in %s", hashfile); + + hashes_avail = count_lines (fp); + + rewind (fp); + + if (hashes_avail == 0) + { + log_error ("ERROR: hashfile is empty or corrupt"); + + fclose (fp); + + return (-1); + } + + hashlist_format = hlfmt_detect (fp, 100); // 100 = max numbers to "scan". could be hashes_avail, too + + if ((remove == 1) && (hashlist_format != HLFMT_HASHCAT)) + { + log_error ("ERROR: remove not supported in native hashfile-format mode"); + + fclose (fp); + + return (-1); + } + + fclose (fp); + } + } + else + { + hashlist_mode = HL_MODE_ARG; + + hashes_avail = 1; + } + + if (hash_mode == 3000) hashes_avail *= 2; + + data.hashlist_mode = hashlist_mode; + data.hashlist_format = hashlist_format; + + logfile_top_uint (hashlist_mode); + logfile_top_uint (hashlist_format); + + /** + * load hashes, part II: allocate required memory, set pointers + */ + + hash_t *hashes_buf = NULL; + void *digests_buf = NULL; + salt_t *salts_buf = NULL; + void *esalts_buf = NULL; + + hashes_buf = (hash_t *) mycalloc (hashes_avail, sizeof (hash_t)); + + digests_buf = (void *) mycalloc (hashes_avail, dgst_size); + + if ((username && (remove || show)) || (opts_type & OPTS_TYPE_HASH_COPY)) + { + uint32_t hash_pos; + + for (hash_pos = 0; hash_pos < hashes_avail; hash_pos++) + { + hashinfo_t *hash_info = (hashinfo_t *) mymalloc (sizeof (hashinfo_t)); + + hashes_buf[hash_pos].hash_info = hash_info; + + if (username && (remove || show || left)) + { + hash_info->user = (user_t*) mymalloc (sizeof (user_t)); + } + + if (benchmark) + { + hash_info->orighash = (char *) mymalloc (256); + } + } + } + + if (isSalted) + { + salts_buf = (salt_t *) mycalloc (hashes_avail, sizeof (salt_t)); + + if (esalt_size) + { + esalts_buf = (void *) mycalloc (hashes_avail, esalt_size); + } + } + else + { + salts_buf = (salt_t *) mycalloc (1, sizeof (salt_t)); + } + + for (uint hash_pos = 0; hash_pos < hashes_avail; hash_pos++) + { + hashes_buf[hash_pos].digest = ((char *) digests_buf) + (hash_pos * dgst_size); + + if (isSalted) + { + hashes_buf[hash_pos].salt = &salts_buf[hash_pos]; + + if (esalt_size) + { + hashes_buf[hash_pos].esalt = ((char *) esalts_buf) + (hash_pos * esalt_size); + } + } + else + { + hashes_buf[hash_pos].salt = &salts_buf[0]; + } + } + + /** + * load hashes, part III: parse hashes or generate them if benchmark + */ + + uint hashes_cnt = 0; + + if (benchmark == 0) + { + if (keyspace == 1) + { + // useless to read hash file for keyspace, cheat a little bit w/ optind + } + else if (hashes_avail == 0) + { + } + else if (hashlist_mode == HL_MODE_ARG) + { + char *input_buf = myargv[optind]; + + uint input_len = strlen (input_buf); + + logfile_top_var_string ("target", input_buf); + + char *hash_buf = NULL; + int hash_len = 0; + + hlfmt_hash (hashlist_format, input_buf, input_len, &hash_buf, &hash_len); + + if (hash_len) + { + if (opts_type & OPTS_TYPE_HASH_COPY) + { + hashinfo_t *hash_info_tmp = hashes_buf[hashes_cnt].hash_info; + + hash_info_tmp->orighash = mystrdup (hash_buf); + } + + if (isSalted) + { + memset (hashes_buf[0].salt, 0, sizeof (salt_t)); + } + + int parser_status = PARSER_OK; + + if (hash_mode == 2500) + { + if (hash_len == 0) + { + log_error ("ERROR: hccap file not specified"); + + return (-1); + } + + hashlist_mode = HL_MODE_FILE; + + data.hashlist_mode = hashlist_mode; + + FILE *fp = fopen (hash_buf, "rb"); + + if (fp == NULL) + { + log_error ("ERROR: %s: %s", hash_buf, strerror (errno)); + + return (-1); + } + + if (hashes_avail < 1) + { + log_error ("ERROR: hccap file is empty or corrupt"); + + fclose (fp); + + return (-1); + } + + uint hccap_size = sizeof (hccap_t); + + char in[hccap_size]; + + while (!feof (fp)) + { + int n = fread (&in, hccap_size, 1, fp); + + if (n != 1) + { + if (hashes_cnt < 1) parser_status = PARSER_HCCAP_FILE_SIZE; + + break; + } + + parser_status = parse_func (in, hccap_size, &hashes_buf[hashes_cnt]); + + if (parser_status != PARSER_OK) + { + log_info ("WARNING: Hash '%s': %s", hash_buf, strparser (parser_status)); + + continue; + } + + // hack: append MAC1 and MAC2 s.t. in --show and --left the line matches with the .pot file format (i.e. ESSID:MAC1:MAC2) + + if ((show == 1) || (left == 1)) + { + salt_t *tmp_salt = hashes_buf[hashes_cnt].salt; + + char *salt_ptr = (char *) tmp_salt->salt_buf; + + int cur_pos = tmp_salt->salt_len; + int rem_len = sizeof (hashes_buf[hashes_cnt].salt->salt_buf) - cur_pos; + + wpa_t *wpa = (wpa_t *) hashes_buf[hashes_cnt].esalt; + + unsigned char *pke_ptr = (unsigned char *) wpa->pke; + + // do the appending task + + snprintf (salt_ptr + cur_pos, + rem_len, + ":%02x%02x%02x%02x%02x%02x:%02x%02x%02x%02x%02x%02x", + pke_ptr[20], pke_ptr[27], pke_ptr[26], pke_ptr[25], pke_ptr[24], pke_ptr[31], // MAC1 + pke_ptr[30], pke_ptr[29], pke_ptr[28], pke_ptr[35], pke_ptr[34], pke_ptr[33]); // MAC2 + + + // memset () the remaining part of the salt + + cur_pos = tmp_salt->salt_len + 1 + 12 + 1 + 12; + rem_len = sizeof (hashes_buf[hashes_cnt].salt->salt_buf) - cur_pos; + + if (rem_len > 0) memset (salt_ptr + cur_pos, 0, rem_len); + + tmp_salt->salt_len += 1 + 12 + 1 + 12; + } + + if (show == 1) handle_show_request (pot, pot_cnt, (char *) hashes_buf[hashes_cnt].salt->salt_buf, hashes_buf[hashes_cnt].salt->salt_len, &hashes_buf[hashes_cnt], sort_by_salt_buf, out_fp); + if (left == 1) handle_left_request (pot, pot_cnt, (char *) hashes_buf[hashes_cnt].salt->salt_buf, hashes_buf[hashes_cnt].salt->salt_len, &hashes_buf[hashes_cnt], sort_by_salt_buf, out_fp); + + hashes_cnt++; + } + + fclose (fp); + } + else if (hash_mode == 3000) + { + if (hash_len == 32) + { + parser_status = parse_func (hash_buf, 16, &hashes_buf[hashes_cnt]); + + hash_t *lm_hash_left = NULL; + + if (parser_status == PARSER_OK) + { + lm_hash_left = &hashes_buf[hashes_cnt]; + + hashes_cnt++; + } + else + { + log_info ("WARNING: Hash '%s': %s", input_buf, strparser (parser_status)); + } + + + parser_status = parse_func (hash_buf + 16, 16, &hashes_buf[hashes_cnt]); + + hash_t *lm_hash_right = NULL; + + if (parser_status == PARSER_OK) + { + lm_hash_right = &hashes_buf[hashes_cnt]; + + hashes_cnt++; + } + else + { + log_info ("WARNING: Hash '%s': %s", input_buf, strparser (parser_status)); + } + + // show / left + + if ((lm_hash_left != NULL) && (lm_hash_right != NULL)) + { + if (show == 1) handle_show_request_lm (pot, pot_cnt, input_buf, input_len, lm_hash_left, lm_hash_right, sort_by_pot, out_fp); + if (left == 1) handle_left_request_lm (pot, pot_cnt, input_buf, input_len, lm_hash_left, lm_hash_right, sort_by_pot, out_fp); + } + } + else + { + parser_status = parse_func (hash_buf, hash_len, &hashes_buf[hashes_cnt]); + + if (parser_status == PARSER_OK) + { + if (show == 1) handle_show_request (pot, pot_cnt, input_buf, input_len, &hashes_buf[hashes_cnt], sort_by_pot, out_fp); + if (left == 1) handle_left_request (pot, pot_cnt, input_buf, input_len, &hashes_buf[hashes_cnt], sort_by_pot, out_fp); + } + + if (parser_status == PARSER_OK) + { + hashes_cnt++; + } + else + { + log_info ("WARNING: Hash '%s': %s", input_buf, strparser (parser_status)); + } + } + } + else + { + parser_status = parse_func (hash_buf, hash_len, &hashes_buf[hashes_cnt]); + + if (parser_status == PARSER_OK) + { + if (show == 1) handle_show_request (pot, pot_cnt, input_buf, input_len, &hashes_buf[hashes_cnt], sort_by_pot, out_fp); + if (left == 1) handle_left_request (pot, pot_cnt, input_buf, input_len, &hashes_buf[hashes_cnt], sort_by_pot, out_fp); + } + + if (parser_status == PARSER_OK) + { + hashes_cnt++; + } + else + { + log_info ("WARNING: Hash '%s': %s", input_buf, strparser (parser_status)); + } + } + } + } + else if (hashlist_mode == HL_MODE_FILE) + { + char *hashfile = data.hashfile; + + FILE *fp; + + if ((fp = fopen (hashfile, "rb")) == NULL) + { + log_error ("ERROR: %s: %s", hashfile, strerror (errno)); + + return (-1); + } + + uint line_num = 0; + + while (!feof (fp)) + { + line_num++; + + char line_buf[BUFSIZ]; + + int line_len = fgetl (fp, line_buf); + + if (line_len == 0) continue; + + char *hash_buf = NULL; + int hash_len = 0; + + hlfmt_hash (hashlist_format, line_buf, line_len, &hash_buf, &hash_len); + + if (username) + { + char *user_buf = NULL; + int user_len = 0; + + hlfmt_user (hashlist_format, line_buf, line_len, &user_buf, &user_len); + + if (remove || show) + { + user_t **user = &hashes_buf[hashes_cnt].hash_info->user; + + *user = (user_t *) malloc (sizeof (user_t)); + + user_t *user_ptr = *user; + + if (user_buf != NULL) + { + user_ptr->user_name = mystrdup (user_buf); + } + else + { + user_ptr->user_name = mystrdup (""); + } + + user_ptr->user_len = user_len; + } + } + + if (opts_type & OPTS_TYPE_HASH_COPY) + { + hashinfo_t *hash_info_tmp = hashes_buf[hashes_cnt].hash_info; + + hash_info_tmp->orighash = mystrdup (hash_buf); + } + + if (isSalted) + { + memset (hashes_buf[hashes_cnt].salt, 0, sizeof (salt_t)); + } + + if (hash_mode == 3000) + { + if (hash_len == 32) + { + int parser_status = parse_func (hash_buf, 16, &hashes_buf[hashes_cnt]); + + if (parser_status < PARSER_GLOBAL_ZERO) + { + log_info ("WARNING: Hashfile '%s' in line %u (%s): %s", data.hashfile, line_num, line_buf, strparser (parser_status)); + + continue; + } + + hash_t *lm_hash_left = &hashes_buf[hashes_cnt]; + + hashes_cnt++; + + parser_status = parse_func (hash_buf + 16, 16, &hashes_buf[hashes_cnt]); + + if (parser_status < PARSER_GLOBAL_ZERO) + { + log_info ("WARNING: Hashfile '%s' in line %u (%s): %s", data.hashfile, line_num, line_buf, strparser (parser_status)); + + continue; + } + + hash_t *lm_hash_right = &hashes_buf[hashes_cnt]; + + if (data.quiet == 0) if ((hashes_cnt % 0x20000) == 0) log_info_nn ("Parsed Hashes: %u/%u (%0.2f%%)", hashes_cnt, hashes_avail, ((float) hashes_cnt / hashes_avail) * 100); + + hashes_cnt++; + + // show / left + + if (show == 1) handle_show_request_lm (pot, pot_cnt, line_buf, line_len, lm_hash_left, lm_hash_right, sort_by_pot, out_fp); + if (left == 1) handle_left_request_lm (pot, pot_cnt, line_buf, line_len, lm_hash_left, lm_hash_right, sort_by_pot, out_fp); + } + else + { + int parser_status = parse_func (hash_buf, hash_len, &hashes_buf[hashes_cnt]); + + if (parser_status < PARSER_GLOBAL_ZERO) + { + log_info ("WARNING: Hashfile '%s' in line %u (%s): %s", data.hashfile, line_num, line_buf, strparser (parser_status)); + + continue; + } + + if (data.quiet == 0) if ((hashes_cnt % 0x20000) == 0) log_info_nn ("Parsed Hashes: %u/%u (%0.2f%%)", hashes_cnt, hashes_avail, ((float) hashes_cnt / hashes_avail) * 100); + + if (show == 1) handle_show_request (pot, pot_cnt, line_buf, line_len, &hashes_buf[hashes_cnt], sort_by_pot, out_fp); + if (left == 1) handle_left_request (pot, pot_cnt, line_buf, line_len, &hashes_buf[hashes_cnt], sort_by_pot, out_fp); + + hashes_cnt++; + } + } + else + { + int parser_status = parse_func (hash_buf, hash_len, &hashes_buf[hashes_cnt]); + + if (parser_status < PARSER_GLOBAL_ZERO) + { + log_info ("WARNING: Hashfile '%s' in line %u (%s): %s", data.hashfile, line_num, line_buf, strparser (parser_status)); + + continue; + } + + if (data.quiet == 0) if ((hashes_cnt % 0x20000) == 0) log_info_nn ("Parsed Hashes: %u/%u (%0.2f%%)", hashes_cnt, hashes_avail, ((float) hashes_cnt / hashes_avail) * 100); + + if (show == 1) handle_show_request (pot, pot_cnt, line_buf, line_len, &hashes_buf[hashes_cnt], sort_by_pot, out_fp); + if (left == 1) handle_left_request (pot, pot_cnt, line_buf, line_len, &hashes_buf[hashes_cnt], sort_by_pot, out_fp); + + hashes_cnt++; + } + } + + fclose (fp); + + if (data.quiet == 0) log_info_nn ("Parsed Hashes: %u/%u (%0.2f%%)", hashes_avail, hashes_avail, 100.00); + + if ((out_fp != NULL) && (out_fp != stdout)) fclose (out_fp); + } + } + else + { + if (isSalted) + { + hashes_buf[0].salt->salt_len = 8; + + // special salt handling + + switch (hash_mode) + { + case 1500: hashes_buf[0].salt->salt_len = 2; + break; + case 1731: hashes_buf[0].salt->salt_len = 4; + break; + case 2410: hashes_buf[0].salt->salt_len = 4; + break; + case 2500: memcpy (hashes_buf[0].salt->salt_buf, "hashcat.net", 11); + break; + case 3100: hashes_buf[0].salt->salt_len = 1; + break; + case 5000: hashes_buf[0].salt->keccak_mdlen = 32; + break; + case 5800: hashes_buf[0].salt->salt_len = 16; + break; + case 6800: hashes_buf[0].salt->salt_len = 32; + break; + case 8400: hashes_buf[0].salt->salt_len = 40; + break; + case 8800: hashes_buf[0].salt->salt_len = 16; + break; + case 8900: hashes_buf[0].salt->salt_len = 16; + hashes_buf[0].salt->scrypt_N = 1024; + hashes_buf[0].salt->scrypt_r = 1; + hashes_buf[0].salt->scrypt_p = 1; + break; + case 9100: hashes_buf[0].salt->salt_len = 16; + break; + case 9300: hashes_buf[0].salt->salt_len = 14; + hashes_buf[0].salt->scrypt_N = 16384; + hashes_buf[0].salt->scrypt_r = 1; + hashes_buf[0].salt->scrypt_p = 1; + break; + case 9400: hashes_buf[0].salt->salt_len = 16; + break; + case 9500: hashes_buf[0].salt->salt_len = 16; + break; + case 9600: hashes_buf[0].salt->salt_len = 16; + break; + case 9700: hashes_buf[0].salt->salt_len = 16; + break; + case 9710: hashes_buf[0].salt->salt_len = 16; + break; + case 9720: hashes_buf[0].salt->salt_len = 16; + break; + case 9800: hashes_buf[0].salt->salt_len = 16; + break; + case 9810: hashes_buf[0].salt->salt_len = 16; + break; + case 9820: hashes_buf[0].salt->salt_len = 16; + break; + case 10300: hashes_buf[0].salt->salt_len = 12; + break; + case 11500: hashes_buf[0].salt->salt_len = 4; + break; + case 11600: hashes_buf[0].salt->salt_len = 4; + break; + case 12400: hashes_buf[0].salt->salt_len = 4; + break; + case 12500: hashes_buf[0].salt->salt_len = 8; + break; + case 12600: hashes_buf[0].salt->salt_len = 64; + break; + } + + // special esalt handling + + switch (hash_mode) + { + case 2500: ((wpa_t *) hashes_buf[0].esalt)->eapol_size = 128; + break; + case 5300: ((ikepsk_t *) hashes_buf[0].esalt)->nr_len = 1; + ((ikepsk_t *) hashes_buf[0].esalt)->msg_len = 1; + break; + case 5400: ((ikepsk_t *) hashes_buf[0].esalt)->nr_len = 1; + ((ikepsk_t *) hashes_buf[0].esalt)->msg_len = 1; + break; + case 5500: ((netntlm_t *) hashes_buf[0].esalt)->user_len = 1; + ((netntlm_t *) hashes_buf[0].esalt)->domain_len = 1; + ((netntlm_t *) hashes_buf[0].esalt)->srvchall_len = 1; + ((netntlm_t *) hashes_buf[0].esalt)->clichall_len = 1; + break; + case 5600: ((netntlm_t *) hashes_buf[0].esalt)->user_len = 1; + ((netntlm_t *) hashes_buf[0].esalt)->domain_len = 1; + ((netntlm_t *) hashes_buf[0].esalt)->srvchall_len = 1; + ((netntlm_t *) hashes_buf[0].esalt)->clichall_len = 1; + break; + case 7300: ((rakp_t *) hashes_buf[0].esalt)->salt_len = 32; + break; + case 10400: ((pdf_t *) hashes_buf[0].esalt)->id_len = 16; + ((pdf_t *) hashes_buf[0].esalt)->o_len = 32; + ((pdf_t *) hashes_buf[0].esalt)->u_len = 32; + break; + case 10410: ((pdf_t *) hashes_buf[0].esalt)->id_len = 16; + ((pdf_t *) hashes_buf[0].esalt)->o_len = 32; + ((pdf_t *) hashes_buf[0].esalt)->u_len = 32; + break; + case 10420: ((pdf_t *) hashes_buf[0].esalt)->id_len = 16; + ((pdf_t *) hashes_buf[0].esalt)->o_len = 32; + ((pdf_t *) hashes_buf[0].esalt)->u_len = 32; + break; + case 10500: ((pdf_t *) hashes_buf[0].esalt)->id_len = 16; + ((pdf_t *) hashes_buf[0].esalt)->o_len = 32; + ((pdf_t *) hashes_buf[0].esalt)->u_len = 32; + break; + case 10600: ((pdf_t *) hashes_buf[0].esalt)->id_len = 16; + ((pdf_t *) hashes_buf[0].esalt)->o_len = 127; + ((pdf_t *) hashes_buf[0].esalt)->u_len = 127; + break; + case 10700: ((pdf_t *) hashes_buf[0].esalt)->id_len = 16; + ((pdf_t *) hashes_buf[0].esalt)->o_len = 127; + ((pdf_t *) hashes_buf[0].esalt)->u_len = 127; + break; + case 11600: ((seven_zip_t *) hashes_buf[0].esalt)->iv_len = 16; + ((seven_zip_t *) hashes_buf[0].esalt)->data_len = 112; + ((seven_zip_t *) hashes_buf[0].esalt)->unpack_size = 112; + break; + } + } + + // set hashfile + + switch (hash_mode) + { + case 5200: data.hashfile = mystrdup ("hashcat.psafe3"); + break; + case 5300: data.hashfile = mystrdup ("hashcat.ikemd5"); + break; + case 5400: data.hashfile = mystrdup ("hashcat.ikesha1"); + break; + case 6211: + case 6212: + case 6213: + case 6221: + case 6222: + case 6223: + case 6231: + case 6232: + case 6233: + case 6241: + case 6242: + case 6243: data.hashfile = mystrdup ("hashcat.tc"); + break; + case 6600: data.hashfile = mystrdup ("hashcat.agilekey"); + break; + case 8200: data.hashfile = mystrdup ("hashcat.cloudkey"); + break; + case 9000: data.hashfile = mystrdup ("hashcat.psafe2"); + break; + } + + // set default iterations + + switch (hash_mode) + { + case 400: hashes_buf[0].salt->salt_iter = ROUNDS_PHPASS; + break; + case 500: hashes_buf[0].salt->salt_iter = ROUNDS_MD5CRYPT; + break; + case 501: hashes_buf[0].salt->salt_iter = ROUNDS_MD5CRYPT; + break; + case 1600: hashes_buf[0].salt->salt_iter = ROUNDS_MD5CRYPT; + break; + case 1800: hashes_buf[0].salt->salt_iter = ROUNDS_SHA512CRYPT; + break; + case 2100: hashes_buf[0].salt->salt_iter = ROUNDS_DCC2; + break; + case 2500: hashes_buf[0].salt->salt_iter = ROUNDS_WPA2; + break; + case 3200: hashes_buf[0].salt->salt_iter = ROUNDS_BCRYPT; + break; + case 5200: hashes_buf[0].salt->salt_iter = ROUNDS_PSAFE3; + break; + case 5800: hashes_buf[0].salt->salt_iter = ROUNDS_ANDROIDPIN - 1; + break; + case 6211: + case 6212: + case 6213: hashes_buf[0].salt->salt_iter = ROUNDS_TRUECRYPT_2K; + break; + case 6221: + case 6222: + case 6223: hashes_buf[0].salt->salt_iter = ROUNDS_TRUECRYPT_1K; + break; + case 6231: + case 6232: + case 6233: hashes_buf[0].salt->salt_iter = ROUNDS_TRUECRYPT_1K; + break; + case 6241: + case 6242: + case 6243: hashes_buf[0].salt->salt_iter = ROUNDS_TRUECRYPT_1K; + break; + case 6300: hashes_buf[0].salt->salt_iter = ROUNDS_MD5CRYPT; + break; + case 6400: hashes_buf[0].salt->salt_iter = ROUNDS_SHA256AIX; + break; + case 6500: hashes_buf[0].salt->salt_iter = ROUNDS_SHA512AIX; + break; + case 6700: hashes_buf[0].salt->salt_iter = ROUNDS_SHA1AIX; + break; + case 6600: hashes_buf[0].salt->salt_iter = ROUNDS_AGILEKEY; + break; + case 6800: hashes_buf[0].salt->salt_iter = ROUNDS_LASTPASS; + break; + case 7100: hashes_buf[0].salt->salt_iter = ROUNDS_SHA512OSX; + break; + case 7200: hashes_buf[0].salt->salt_iter = ROUNDS_GRUB; + break; + case 7400: hashes_buf[0].salt->salt_iter = ROUNDS_SHA256CRYPT; + break; + case 7900: hashes_buf[0].salt->salt_iter = ROUNDS_DRUPAL7; + break; + case 8200: hashes_buf[0].salt->salt_iter = ROUNDS_CLOUDKEY; + break; + case 8300: hashes_buf[0].salt->salt_iter = ROUNDS_NSEC3; + break; + case 8800: hashes_buf[0].salt->salt_iter = ROUNDS_ANDROIDFDE; + break; + case 8900: hashes_buf[0].salt->salt_iter = 1; + break; + case 9000: hashes_buf[0].salt->salt_iter = ROUNDS_PSAFE2; + break; + case 9100: hashes_buf[0].salt->salt_iter = ROUNDS_LOTUS8; + break; + case 9200: hashes_buf[0].salt->salt_iter = ROUNDS_CISCO8; + break; + case 9300: hashes_buf[0].salt->salt_iter = 1; + break; + case 9400: hashes_buf[0].salt->salt_iter = ROUNDS_OFFICE2007; + break; + case 9500: hashes_buf[0].salt->salt_iter = ROUNDS_OFFICE2010; + break; + case 9600: hashes_buf[0].salt->salt_iter = ROUNDS_OFFICE2013; + break; + case 10000: hashes_buf[0].salt->salt_iter = ROUNDS_DJANGOPBKDF2; + break; + case 10300: hashes_buf[0].salt->salt_iter = ROUNDS_SAPH_SHA1 - 1; + break; + case 10500: hashes_buf[0].salt->salt_iter = ROUNDS_PDF14; + break; + case 10700: hashes_buf[0].salt->salt_iter = ROUNDS_PDF17L8; + break; + case 10900: hashes_buf[0].salt->salt_iter = ROUNDS_PBKDF2_SHA256 - 1; + break; + case 11300: hashes_buf[0].salt->salt_iter = ROUNDS_BITCOIN_WALLET - 1; + break; + case 11600: hashes_buf[0].salt->salt_iter = ROUNDS_SEVEN_ZIP; + break; + case 11900: hashes_buf[0].salt->salt_iter = ROUNDS_PBKDF2_MD5 - 1; + break; + case 12000: hashes_buf[0].salt->salt_iter = ROUNDS_PBKDF2_SHA1 - 1; + break; + case 12100: hashes_buf[0].salt->salt_iter = ROUNDS_PBKDF2_SHA512 - 1; + break; + case 12200: hashes_buf[0].salt->salt_iter = ROUNDS_ECRYPTFS - 1; + break; + case 12300: hashes_buf[0].salt->salt_iter = ROUNDS_ORACLET - 1; + break; + case 12400: hashes_buf[0].salt->salt_iter = ROUNDS_BSDICRYPT - 1; + break; + case 12500: hashes_buf[0].salt->salt_iter = ROUNDS_RAR3; + break; + case 12700: hashes_buf[0].salt->salt_iter = ROUNDS_MYWALLET; + break; + case 12800: hashes_buf[0].salt->salt_iter = ROUNDS_MS_DRSR - 1; + break; + } + + // set special tuning for benchmark-mode 1 + + if (benchmark_mode == 1) + { + gpu_loops *= 8; + gpu_accel *= 4; + + switch (hash_mode) + { + case 400: gpu_loops = ROUNDS_PHPASS; + gpu_accel = 32; + break; + case 500: gpu_loops = ROUNDS_MD5CRYPT; + gpu_accel = 32; + break; + case 501: gpu_loops = ROUNDS_MD5CRYPT; + gpu_accel = 32; + break; + case 1600: gpu_loops = ROUNDS_MD5CRYPT; + gpu_accel = 32; + break; + case 1800: gpu_loops = ROUNDS_SHA512CRYPT; + gpu_accel = 8; + break; + case 2100: gpu_loops = ROUNDS_DCC2; + gpu_accel = 16; + break; + case 2500: gpu_loops = ROUNDS_WPA2; + gpu_accel = 32; + break; + case 3200: gpu_loops = ROUNDS_BCRYPT; + gpu_accel = 2; + break; + case 5200: gpu_loops = ROUNDS_PSAFE3; + gpu_accel = 16; + break; + case 5800: gpu_loops = ROUNDS_ANDROIDPIN; + gpu_accel = 16; + break; + case 6211: gpu_loops = ROUNDS_TRUECRYPT_2K; + gpu_accel = 64; + break; + case 6212: gpu_loops = ROUNDS_TRUECRYPT_2K; + gpu_accel = 32; + break; + case 6213: gpu_loops = ROUNDS_TRUECRYPT_2K; + gpu_accel = 32; + break; + case 6221: gpu_loops = ROUNDS_TRUECRYPT_1K; + gpu_accel = 8; + break; + case 6222: gpu_loops = ROUNDS_TRUECRYPT_1K; + gpu_accel = 8; + break; + case 6223: gpu_loops = ROUNDS_TRUECRYPT_1K; + gpu_accel = 8; + break; + case 6231: gpu_loops = ROUNDS_TRUECRYPT_1K; + gpu_accel = 8; + break; + case 6232: gpu_loops = ROUNDS_TRUECRYPT_1K; + gpu_accel = 8; + break; + case 6233: gpu_loops = ROUNDS_TRUECRYPT_1K; + gpu_accel = 8; + break; + case 6241: gpu_loops = ROUNDS_TRUECRYPT_1K; + gpu_accel = 128; + break; + case 6242: gpu_loops = ROUNDS_TRUECRYPT_1K; + gpu_accel = 64; + break; + case 6243: gpu_loops = ROUNDS_TRUECRYPT_1K; + gpu_accel = 64; + break; + case 6300: gpu_loops = ROUNDS_MD5CRYPT; + gpu_accel = 32; + break; + case 6700: gpu_loops = ROUNDS_SHA1AIX; + gpu_accel = 128; + break; + case 6400: gpu_loops = ROUNDS_SHA256AIX; + gpu_accel = 128; + break; + case 6500: gpu_loops = ROUNDS_SHA512AIX; + gpu_accel = 32; + break; + case 6600: gpu_loops = ROUNDS_AGILEKEY; + gpu_accel = 64; + break; + case 6800: gpu_loops = ROUNDS_LASTPASS; + gpu_accel = 64; + break; + case 7100: gpu_loops = ROUNDS_SHA512OSX; + gpu_accel = 2; + break; + case 7200: gpu_loops = ROUNDS_GRUB; + gpu_accel = 2; + break; + case 7400: gpu_loops = ROUNDS_SHA256CRYPT; + gpu_accel = 4; + break; + case 7900: gpu_loops = ROUNDS_DRUPAL7; + gpu_accel = 8; + break; + case 8200: gpu_loops = ROUNDS_CLOUDKEY; + gpu_accel = 2; + break; + case 8800: gpu_loops = ROUNDS_ANDROIDFDE; + gpu_accel = 32; + break; + case 8900: gpu_loops = 1; + gpu_accel = 64; + break; + case 9000: gpu_loops = ROUNDS_PSAFE2; + gpu_accel = 16; + break; + case 9100: gpu_loops = ROUNDS_LOTUS8; + gpu_accel = 64; + break; + case 9200: gpu_loops = ROUNDS_CISCO8; + gpu_accel = 8; + break; + case 9300: gpu_loops = 1; + gpu_accel = 4; + break; + case 9400: gpu_loops = ROUNDS_OFFICE2007; + gpu_accel = 32; + break; + case 9500: gpu_loops = ROUNDS_OFFICE2010; + gpu_accel = 32; + break; + case 9600: gpu_loops = ROUNDS_OFFICE2013; + gpu_accel = 4; + break; + case 10000: gpu_loops = ROUNDS_DJANGOPBKDF2; + gpu_accel = 8; + break; + case 10300: gpu_loops = ROUNDS_SAPH_SHA1; + gpu_accel = 16; + break; + case 10500: gpu_loops = ROUNDS_PDF14; + gpu_accel = 256; + break; + case 10700: gpu_loops = ROUNDS_PDF17L8; + gpu_accel = 8; + break; + case 10900: gpu_loops = ROUNDS_PBKDF2_SHA256; + gpu_accel = 8; + break; + case 11300: gpu_loops = ROUNDS_BITCOIN_WALLET; + gpu_accel = 2; + break; + case 11600: gpu_loops = ROUNDS_SEVEN_ZIP; + gpu_accel = 4; + break; + case 11900: gpu_loops = ROUNDS_PBKDF2_MD5; + gpu_accel = 8; + break; + case 12000: gpu_loops = ROUNDS_PBKDF2_SHA1; + gpu_accel = 8; + break; + case 12100: gpu_loops = ROUNDS_PBKDF2_SHA512; + gpu_accel = 8; + break; + case 12200: gpu_loops = ROUNDS_ECRYPTFS; + gpu_accel = 8; + break; + case 12300: gpu_loops = ROUNDS_ORACLET; + gpu_accel = 8; + break; + case 12500: gpu_loops = ROUNDS_RAR3; + gpu_accel = 32; + break; + case 12700: gpu_loops = ROUNDS_MYWALLET; + gpu_accel = 512; + break; + case 12800: gpu_loops = ROUNDS_MS_DRSR; + gpu_accel = 512; + break; + } + + // some algorithm collide too fast, make that impossible + + switch (hash_mode) + { + case 11500: ((uint *) digests_buf)[1] = 1; + break; + } + + if (gpu_loops > 1024) gpu_loops = 1024; + if (gpu_accel > 256) gpu_accel = 256; // causes memory problems otherwise + } + + if ((opts_type & OPTS_TYPE_PT_BITSLICE) && (attack_mode == ATTACK_MODE_BF)) + { + gpu_loops = 1024; + } + + if (hash_mode == 12500) + { + gpu_loops = ROUNDS_RAR3 / 16; + } + + data.gpu_accel = gpu_accel; + data.gpu_loops = gpu_loops; + + hashes_cnt = 1; + } + + if (show == 1 || left == 1) + { + for (uint i = 0; i < pot_cnt; i++) + { + pot_t *pot_ptr = &pot[i]; + + hash_t *hashes_buf = &pot_ptr->hash; + + local_free (hashes_buf->digest); + + if (isSalted) + { + local_free (hashes_buf->salt); + } + } + + local_free (pot); + + if (data.quiet == 0) log_info_nn (""); + + return (0); + } + + if (keyspace == 0) + { + if (hashes_cnt == 0) + { + log_error ("ERROR: No hashes loaded"); + + return (-1); + } + } + + /** + * Sanity check for hashfile vs outfile (should not point to the same physical file) + */ + + if (data.outfile != NULL) + { + if (data.hashfile != NULL) + { + #ifdef _POSIX + struct stat tmpstat_outfile; + struct stat tmpstat_hashfile; + #endif + + #ifdef _WIN + struct stat64 tmpstat_outfile; + struct stat64 tmpstat_hashfile; + #endif + + FILE *tmp_outfile_fp = fopen (data.outfile, "r"); + + if (tmp_outfile_fp) + { + #ifdef _POSIX + fstat (fileno (tmp_outfile_fp), &tmpstat_outfile); + #endif + + #ifdef _WIN + _fstat64 (fileno (tmp_outfile_fp), &tmpstat_outfile); + #endif + + fclose (tmp_outfile_fp); + } + + FILE *tmp_hashfile_fp = fopen (data.hashfile, "r"); + + if (tmp_hashfile_fp) + { + #ifdef _POSIX + fstat (fileno (tmp_hashfile_fp), &tmpstat_hashfile); + #endif + + #ifdef _WIN + _fstat64 (fileno (tmp_hashfile_fp), &tmpstat_hashfile); + #endif + + fclose (tmp_hashfile_fp); + } + + if (tmp_outfile_fp && tmp_outfile_fp) + { + tmpstat_outfile.st_mode = 0; + tmpstat_outfile.st_nlink = 0; + tmpstat_outfile.st_uid = 0; + tmpstat_outfile.st_gid = 0; + tmpstat_outfile.st_rdev = 0; + tmpstat_outfile.st_atime = 0; + + tmpstat_hashfile.st_mode = 0; + tmpstat_hashfile.st_nlink = 0; + tmpstat_hashfile.st_uid = 0; + tmpstat_hashfile.st_gid = 0; + tmpstat_hashfile.st_rdev = 0; + tmpstat_hashfile.st_atime = 0; + + #ifdef _POSIX + tmpstat_outfile.st_blksize = 0; + tmpstat_outfile.st_blocks = 0; + + tmpstat_hashfile.st_blksize = 0; + tmpstat_hashfile.st_blocks = 0; + #endif + + #ifdef _POSIX + if (memcmp (&tmpstat_outfile, &tmpstat_hashfile, sizeof (struct stat)) == 0) + { + log_error ("ERROR: Hashfile and Outfile are not allowed to point to the same file"); + + return (-1); + } + #endif + + #ifdef _WIN + if (memcmp (&tmpstat_outfile, &tmpstat_hashfile, sizeof (struct stat64)) == 0) + { + log_error ("ERROR: Hashfile and Outfile are not allowed to point to the same file"); + + return (-1); + } + #endif + } + } + } + + /** + * Remove duplicates + */ + + if (data.quiet == 0) log_info_nn ("Removing duplicate hashes..."); + + if (isSalted) + { + qsort (hashes_buf, hashes_cnt, sizeof (hash_t), sort_by_hash); + } + else + { + qsort (hashes_buf, hashes_cnt, sizeof (hash_t), sort_by_hash_no_salt); + } + + uint hashes_cnt_orig = hashes_cnt; + + hashes_cnt = 1; + + for (uint hashes_pos = 1; hashes_pos < hashes_cnt_orig; hashes_pos++) + { + if (isSalted) + { + if (sort_by_salt (hashes_buf[hashes_pos].salt, hashes_buf[hashes_pos - 1].salt) == 0) + { + if (sort_by_digest (hashes_buf[hashes_pos].digest, hashes_buf[hashes_pos - 1].digest) == 0) continue; + } + } + else + { + if (sort_by_digest (hashes_buf[hashes_pos].digest, hashes_buf[hashes_pos - 1].digest) == 0) continue; + } + + if (hashes_pos > hashes_cnt) + { + memcpy (&hashes_buf[hashes_cnt], &hashes_buf[hashes_pos], sizeof (hash_t)); + } + + hashes_cnt++; + } + + /** + * Potfile removes + */ + + uint potfile_remove_cracks = 0; + + if (potfile_disable == 0) + { + hash_t hash_buf; + + hash_buf.digest = mymalloc (dgst_size); + hash_buf.salt = NULL; + hash_buf.esalt = NULL; + hash_buf.hash_info = NULL; + hash_buf.cracked = 0; + + if (isSalted) + { + hash_buf.salt = (salt_t *) mymalloc (sizeof (salt_t)); + } + + if (esalt_size) + { + hash_buf.esalt = mymalloc (esalt_size); + } + + if (quiet == 0) log_info_nn ("Comparing hashes with potfile entries..."); + + // no solution for these special hash types (for instane because they use hashfile in output etc) + if ((hash_mode != 5200) && + !((hash_mode >= 6200) && (hash_mode <= 6299)) && + (hash_mode != 9000)) + { + FILE *fp = fopen (potfile, "rb"); + + if (fp != NULL) + { + while (!feof (fp)) + { + char line_buf[BUFSIZ]; + + memset (line_buf, 0, BUFSIZ); + + char *ptr = fgets (line_buf, BUFSIZ - 1, fp); + + if (ptr == NULL) break; + + int line_len = strlen (line_buf); + + if (line_len == 0) continue; + + int iter = MAX_CUT_TRIES; + + for (int i = line_len - 1; i && iter; i--, line_len--) + { + if (line_buf[i] != ':') continue; + + if (isSalted) + { + memset (hash_buf.salt, 0, sizeof (salt_t)); + } + + hash_t *found = NULL; + + if (hash_mode == 6800) + { + if (i < 48) // 48 = 12 * uint in salt_buf[] + { + // manipulate salt_buf + memcpy (hash_buf.salt->salt_buf, line_buf, i); + + hash_buf.salt->salt_len = i; + + found = (hash_t *) bsearch (&hash_buf, hashes_buf, hashes_cnt, sizeof (hash_t), sort_by_hash_t_salt); + } + } + else if (hash_mode == 2500) + { + if (i < 48) // 48 = 12 * uint in salt_buf[] + { + // here we have in line_buf: ESSID:MAC1:MAC2 (without the plain) + // manipulate salt_buf + + // to be safe work with a copy (because of line_len loop, i etc) + + char line_buf_cpy[BUFSIZ]; + memset (line_buf_cpy, 0, BUFSIZ); + + memset (line_buf_cpy, 0, sizeof (line_buf_cpy)); + + memcpy (line_buf_cpy, line_buf, i); + + char *mac2_pos = strrchr (line_buf_cpy, ':'); + + if (mac2_pos == NULL) continue; + + mac2_pos[0] = 0; + mac2_pos++; + + if (strlen (mac2_pos) != 12) continue; + + char *mac1_pos = strrchr (line_buf_cpy, ':'); + + if (mac1_pos == NULL) continue; + + mac1_pos[0] = 0; + mac1_pos++; + + if (strlen (mac1_pos) != 12) continue; + + uint essid_length = mac1_pos - line_buf_cpy - 1; + + // here we need the ESSID + memcpy (hash_buf.salt->salt_buf, line_buf_cpy, essid_length); + + hash_buf.salt->salt_len = essid_length; + + found = (hash_t *) bsearch (&hash_buf, hashes_buf, hashes_cnt, sizeof (hash_t), sort_by_hash_t_salt_hccap); + + if (found) + { + wpa_t *wpa = (wpa_t *) found->esalt; + + uint pke[25]; + + char *pke_ptr = (char *) pke; + + for (uint i = 0; i < 25; i++) + { + pke[i] = byte_swap_32 (wpa->pke[i]); + } + + unsigned char mac1[6]; + unsigned char mac2[6]; + + memcpy (mac1, pke_ptr + 23, 6); + memcpy (mac2, pke_ptr + 29, 6); + + // compare hex string(s) vs binary MAC address(es) + + for (uint i = 0, j = 0; i < 6; i++, j += 2) + { + if (mac1[i] != (unsigned char) hex_to_char (&mac1_pos[j])) + { + found = NULL; + break; + } + } + + // early skip ;) + if (!found) continue; + + for (uint i = 0, j = 0; i < 6; i++, j += 2) + { + if (mac2[i] != (unsigned char) hex_to_char (&mac2_pos[j])) + { + found = NULL; + break; + } + } + } + } + } + else + { + int parser_status = parse_func (line_buf, line_len - 1, &hash_buf); + + if (parser_status == PARSER_OK) + { + if (isSalted) + { + found = (hash_t *) bsearch (&hash_buf, hashes_buf, hashes_cnt, sizeof (hash_t), sort_by_hash); + } + else + { + found = (hash_t *) bsearch (&hash_buf, hashes_buf, hashes_cnt, sizeof (hash_t), sort_by_hash_no_salt); + } + } + } + + if (found == NULL) continue; + + if (!found->cracked) potfile_remove_cracks++; + + found->cracked = 1; + + if (found) break; + + iter--; + } + } + + fclose (fp); + } + } + + if (esalt_size) + { + local_free (hash_buf.esalt); + } + + if (isSalted) + { + local_free (hash_buf.salt); + } + + local_free (hash_buf.digest); + } + + /** + * Now generate all the buffers required for later + */ + + void *digests_buf_new = (void *) mycalloc (hashes_avail, dgst_size); + + salt_t *salts_buf_new = NULL; + void *esalts_buf_new = NULL; + + if (isSalted) + { + salts_buf_new = (salt_t *) mycalloc (hashes_avail, sizeof (salt_t)); + + if (esalt_size) + { + esalts_buf_new = (void *) mycalloc (hashes_avail, esalt_size); + } + } + else + { + salts_buf_new = (salt_t *) mycalloc (1, sizeof (salt_t)); + } + + if (data.quiet == 0) log_info_nn ("Structuring salts for cracking task..."); + + uint digests_cnt = hashes_cnt; + uint digests_done = 0; + + uint size_digests = digests_cnt * dgst_size; + uint size_shown = digests_cnt * sizeof (uint); + + uint *digests_shown = (uint *) mymalloc (size_shown); + uint *digests_shown_tmp = (uint *) mymalloc (size_shown); + + uint salts_cnt = 0; + uint salts_done = 0; + + hashinfo_t **hash_info = NULL; + + if ((username && (remove || show)) || (opts_type & OPTS_TYPE_HASH_COPY)) + { + hash_info = (hashinfo_t**) mymalloc (hashes_cnt * sizeof (hashinfo_t *)); + + if (username && (remove || show)) + { + uint user_pos; + + for (user_pos = 0; user_pos < hashes_cnt; user_pos++) + { + hash_info[user_pos] = (hashinfo_t*) mycalloc (hashes_cnt, sizeof (hashinfo_t)); + + hash_info[user_pos]->user = (user_t*) mymalloc (sizeof (user_t)); + } + } + } + + uint *salts_shown = (uint *) mymalloc (size_shown); + + salt_t *salt_buf; + + { + // copied from inner loop + + salt_buf = &salts_buf_new[salts_cnt]; + + memcpy (salt_buf, hashes_buf[0].salt, sizeof (salt_t)); + + if (esalt_size) + { + memcpy (((char *) esalts_buf_new) + (salts_cnt * esalt_size), hashes_buf[0].esalt, esalt_size); + } + + salt_buf->digests_cnt = 0; + salt_buf->digests_done = 0; + salt_buf->digests_offset = 0; + + salts_cnt++; + } + + if (hashes_buf[0].cracked == 1) + { + digests_shown[0] = 1; + + digests_done++; + + salt_buf->digests_done++; + } + + salt_buf->digests_cnt++; + + memcpy (((char *) digests_buf_new) + (0 * dgst_size), hashes_buf[0].digest, dgst_size); + + if ((username && (remove || show)) || (opts_type & OPTS_TYPE_HASH_COPY)) + { + hash_info[0] = hashes_buf[0].hash_info; + } + + // copy from inner loop + + for (uint hashes_pos = 1; hashes_pos < hashes_cnt; hashes_pos++) + { + if (isSalted) + { + if (sort_by_salt (hashes_buf[hashes_pos].salt, hashes_buf[hashes_pos - 1].salt) != 0) + { + salt_buf = &salts_buf_new[salts_cnt]; + + memcpy (salt_buf, hashes_buf[hashes_pos].salt, sizeof (salt_t)); + + if (esalt_size) + { + memcpy (((char *) esalts_buf_new) + (salts_cnt * esalt_size), hashes_buf[hashes_pos].esalt, esalt_size); + } + + salt_buf->digests_cnt = 0; + salt_buf->digests_done = 0; + salt_buf->digests_offset = hashes_pos; + + salts_cnt++; + } + } + + if (hashes_buf[hashes_pos].cracked == 1) + { + digests_shown[hashes_pos] = 1; + + digests_done++; + + salt_buf->digests_done++; + } + + salt_buf->digests_cnt++; + + memcpy (((char *) digests_buf_new) + (hashes_pos * dgst_size), hashes_buf[hashes_pos].digest, dgst_size); + + if ((username && (remove || show)) || (opts_type & OPTS_TYPE_HASH_COPY)) + { + hash_info[hashes_pos] = hashes_buf[hashes_pos].hash_info; + } + } + + for (uint salt_pos = 0; salt_pos < salts_cnt; salt_pos++) + { + salt_t *salt_buf = &salts_buf_new[salt_pos]; + + if (salt_buf->digests_done == salt_buf->digests_cnt) + { + salts_shown[salt_pos] = 1; + + salts_done++; + } + + if (salts_done == salts_cnt) data.devices_status = STATUS_CRACKED; + } + + local_free (digests_buf); + local_free (salts_buf); + local_free (esalts_buf); + + digests_buf = digests_buf_new; + salts_buf = salts_buf_new; + esalts_buf = esalts_buf_new; + + local_free (hashes_buf); + + /** + * special modification not set from parser + */ + + switch (hash_mode) + { + case 6211: salts_buf->truecrypt_mdlen = 1 * 512; break; + case 6212: salts_buf->truecrypt_mdlen = 2 * 512; break; + case 6213: salts_buf->truecrypt_mdlen = 3 * 512; break; + case 6221: salts_buf->truecrypt_mdlen = 1 * 512; break; + case 6222: salts_buf->truecrypt_mdlen = 2 * 512; break; + case 6223: salts_buf->truecrypt_mdlen = 3 * 512; break; + case 6231: salts_buf->truecrypt_mdlen = 1 * 512; break; + case 6232: salts_buf->truecrypt_mdlen = 2 * 512; break; + case 6233: salts_buf->truecrypt_mdlen = 3 * 512; break; + case 6241: salts_buf->truecrypt_mdlen = 1 * 512; break; + case 6242: salts_buf->truecrypt_mdlen = 2 * 512; break; + case 6243: salts_buf->truecrypt_mdlen = 3 * 512; break; + } + + if (truecrypt_keyfiles) + { + uint *keyfile_buf = ((tc_t *) esalts_buf)->keyfile_buf; + + char *keyfiles = strdup (truecrypt_keyfiles); + + char *keyfile = strtok (keyfiles, ","); + + do + { + truecrypt_crc32 (keyfile, (unsigned char *) keyfile_buf); + + } while ((keyfile = strtok (NULL, ",")) != NULL); + + free (keyfiles); + } + + data.digests_cnt = digests_cnt; + data.digests_done = digests_done; + data.digests_buf = digests_buf; + data.digests_shown = digests_shown; + data.digests_shown_tmp = digests_shown_tmp; + + data.salts_cnt = salts_cnt; + data.salts_done = salts_done; + data.salts_buf = salts_buf; + data.salts_shown = salts_shown; + + data.esalts_buf = esalts_buf; + data.hash_info = hash_info; + + /** + * Automatic Optimizers + */ + + if (salts_cnt == 1) + opti_type |= OPTI_TYPE_SINGLE_SALT; + + if (digests_cnt == 1) + opti_type |= OPTI_TYPE_SINGLE_HASH; + + if (attack_exec == ATTACK_EXEC_ON_GPU) + opti_type |= OPTI_TYPE_NOT_ITERATED; + + if (attack_mode == ATTACK_MODE_BF) + opti_type |= OPTI_TYPE_BRUTE_FORCE; + + data.opti_type = opti_type; + + if (opti_type & OPTI_TYPE_BRUTE_FORCE) + { + if (opti_type & OPTI_TYPE_SINGLE_HASH) + { + if (opti_type & OPTI_TYPE_APPENDED_SALT) + { + if (opts_type & OPTS_TYPE_ST_ADD80) + { + opts_type &= ~OPTS_TYPE_ST_ADD80; + opts_type |= OPTS_TYPE_PT_ADD80; + } + + if (opts_type & OPTS_TYPE_ST_ADDBITS14) + { + opts_type &= ~OPTS_TYPE_ST_ADDBITS14; + opts_type |= OPTS_TYPE_PT_ADDBITS14; + } + + if (opts_type & OPTS_TYPE_ST_ADDBITS15) + { + opts_type &= ~OPTS_TYPE_ST_ADDBITS15; + opts_type |= OPTS_TYPE_PT_ADDBITS15; + } + } + } + } + + /** + * generate bitmap tables + */ + + const uint bitmap_shift1 = 5; + const uint bitmap_shift2 = 13; + + if (bitmap_max < bitmap_min) bitmap_max = bitmap_min; + + uint *bitmap_s1_a = (uint *) mymalloc ((1 << bitmap_max) * sizeof (uint)); + uint *bitmap_s1_b = (uint *) mymalloc ((1 << bitmap_max) * sizeof (uint)); + uint *bitmap_s1_c = (uint *) mymalloc ((1 << bitmap_max) * sizeof (uint)); + uint *bitmap_s1_d = (uint *) mymalloc ((1 << bitmap_max) * sizeof (uint)); + uint *bitmap_s2_a = (uint *) mymalloc ((1 << bitmap_max) * sizeof (uint)); + uint *bitmap_s2_b = (uint *) mymalloc ((1 << bitmap_max) * sizeof (uint)); + uint *bitmap_s2_c = (uint *) mymalloc ((1 << bitmap_max) * sizeof (uint)); + uint *bitmap_s2_d = (uint *) mymalloc ((1 << bitmap_max) * sizeof (uint)); + + uint bitmap_bits; + uint bitmap_nums; + uint bitmap_mask; + uint bitmap_size; + + for (bitmap_bits = bitmap_min; bitmap_bits < bitmap_max; bitmap_bits++) + { + if (data.quiet == 0) log_info_nn ("Generating bitmap tables with %u bits...", bitmap_bits); + + bitmap_nums = 1 << bitmap_bits; + + bitmap_mask = bitmap_nums - 1; + + bitmap_size = bitmap_nums * sizeof (uint); + + if ((hashes_cnt & bitmap_mask) == hashes_cnt) break; + + if (generate_bitmaps (digests_cnt, dgst_size, bitmap_shift1, (char *) data.digests_buf, bitmap_mask, bitmap_size, bitmap_s1_a, bitmap_s1_b, bitmap_s1_c, bitmap_s1_d, digests_cnt / 2) == 0x7fffffff) continue; + if (generate_bitmaps (digests_cnt, dgst_size, bitmap_shift2, (char *) data.digests_buf, bitmap_mask, bitmap_size, bitmap_s1_a, bitmap_s1_b, bitmap_s1_c, bitmap_s1_d, digests_cnt / 2) == 0x7fffffff) continue; + + break; + } + + bitmap_nums = 1 << bitmap_bits; + + bitmap_mask = bitmap_nums - 1; + + bitmap_size = bitmap_nums * sizeof (uint); + + generate_bitmaps (digests_cnt, dgst_size, bitmap_shift1, (char *) data.digests_buf, bitmap_mask, bitmap_size, bitmap_s1_a, bitmap_s1_b, bitmap_s1_c, bitmap_s1_d, -1); + generate_bitmaps (digests_cnt, dgst_size, bitmap_shift2, (char *) data.digests_buf, bitmap_mask, bitmap_size, bitmap_s2_a, bitmap_s2_b, bitmap_s2_c, bitmap_s2_d, -1); + + /** + * prepare quick rule + */ + + data.rule_buf_l = rule_buf_l; + data.rule_buf_r = rule_buf_r; + + int rule_len_l = (int) strlen (rule_buf_l); + int rule_len_r = (int) strlen (rule_buf_r); + + data.rule_len_l = rule_len_l; + data.rule_len_r = rule_len_r; + + /** + * load rules + */ + + uint *all_gpu_rules_cnt = NULL; + + gpu_rule_t **all_gpu_rules_buf = NULL; + + if (rp_files_cnt) + { + all_gpu_rules_cnt = (uint *) mycalloc (rp_files_cnt, sizeof (uint)); + + all_gpu_rules_buf = (gpu_rule_t **) mycalloc (rp_files_cnt, sizeof (gpu_rule_t *)); + } + + char rule_buf[BUFSIZ]; + + int rule_len = 0; + + for (uint i = 0; i < rp_files_cnt; i++) + { + uint gpu_rules_avail = 0; + + uint gpu_rules_cnt = 0; + + gpu_rule_t *gpu_rules_buf = NULL; + + char *rp_file = rp_files[i]; + + char in[BLOCK_SIZE]; + char out[BLOCK_SIZE]; + + FILE *fp = NULL; + + uint rule_line = 0; + + if ((fp = fopen (rp_file, "rb")) == NULL) + { + log_error ("ERROR: %s: %s", rp_file, strerror (errno)); + + return (-1); + } + + while (!feof (fp)) + { + memset (rule_buf, 0, BUFSIZ); + + rule_len = fgetl (fp, rule_buf); + + rule_line++; + + if (rule_len == 0) continue; + + if (rule_buf[0] == '#') continue; + + if (gpu_rules_avail == gpu_rules_cnt) + { + gpu_rules_buf = (gpu_rule_t *) myrealloc (gpu_rules_buf, gpu_rules_avail * sizeof (gpu_rule_t), INCR_RULES * sizeof (gpu_rule_t)); + + gpu_rules_avail += INCR_RULES; + } + + memset (in, 0, BLOCK_SIZE); + memset (out, 0, BLOCK_SIZE); + + int result = _old_apply_rule (rule_buf, rule_len, in, 1, out); + + if (result == -1) + { + log_info ("WARNING: Skipping invalid or unsupported rule in file %s in line %u: %s", rp_file, rule_line, rule_buf); + + continue; + } + + if (cpu_rule_to_gpu_rule (rule_buf, rule_len, &gpu_rules_buf[gpu_rules_cnt]) == -1) + { + log_info ("WARNING: Cannot convert rule for use on GPU in file %s in line %u: %s", rp_file, rule_line, rule_buf); + + memset (&gpu_rules_buf[gpu_rules_cnt], 0, sizeof (gpu_rule_t)); // needs to be cleared otherwise we could have some remaining data + + continue; + } + + /* its so slow + if (rulefind (&gpu_rules_buf[gpu_rules_cnt], gpu_rules_buf, gpu_rules_cnt, sizeof (gpu_rule_t), sort_by_gpu_rule)) + { + log_info ("Duplicate rule for use on GPU in file %s in line %u: %s", rp_file, rule_line, rule_buf); + + continue; + } + */ + + gpu_rules_cnt++; + } + + fclose (fp); + + all_gpu_rules_cnt[i] = gpu_rules_cnt; + + all_gpu_rules_buf[i] = gpu_rules_buf; + } + + /** + * merge rules or automatic rule generator + */ + + uint gpu_rules_cnt = 0; + + gpu_rule_t *gpu_rules_buf = NULL; + + if (attack_mode == ATTACK_MODE_STRAIGHT) + { + if (rp_files_cnt) + { + gpu_rules_cnt = 1; + + uint *repeats = (uint *) mycalloc (rp_files_cnt + 1, sizeof (uint)); + + repeats[0] = gpu_rules_cnt; + + for (uint i = 0; i < rp_files_cnt; i++) + { + gpu_rules_cnt *= all_gpu_rules_cnt[i]; + + repeats[i + 1] = gpu_rules_cnt; + } + + gpu_rules_buf = (gpu_rule_t *) mycalloc (gpu_rules_cnt, sizeof (gpu_rule_t)); + + memset (gpu_rules_buf, 0, gpu_rules_cnt * sizeof (gpu_rule_t)); + + for (uint i = 0; i < gpu_rules_cnt; i++) + { + uint out_pos = 0; + + gpu_rule_t *out = &gpu_rules_buf[i]; + + for (uint j = 0; j < rp_files_cnt; j++) + { + uint in_off = (i / repeats[j]) % all_gpu_rules_cnt[j]; + uint in_pos; + + gpu_rule_t *in = &all_gpu_rules_buf[j][in_off]; + + for (in_pos = 0; in->cmds[in_pos]; in_pos++, out_pos++) + { + if (out_pos == RULES_MAX - 1) + { + // log_info ("WARNING: Truncating chaining of rule %d and rule %d as maximum number of function calls per rule exceeded", i, in_off); + + break; + } + + out->cmds[out_pos] = in->cmds[in_pos]; + } + } + } + + local_free (repeats); + } + else if (rp_gen) + { + uint gpu_rules_avail = 0; + + while (gpu_rules_cnt < rp_gen) + { + if (gpu_rules_avail == gpu_rules_cnt) + { + gpu_rules_buf = (gpu_rule_t *) myrealloc (gpu_rules_buf, gpu_rules_avail * sizeof (gpu_rule_t), INCR_RULES * sizeof (gpu_rule_t)); + + gpu_rules_avail += INCR_RULES; + } + + memset (rule_buf, 0, BLOCK_SIZE); + + rule_len = (int) generate_random_rule (rule_buf, rp_gen_func_min, rp_gen_func_max); + + if (cpu_rule_to_gpu_rule (rule_buf, rule_len, &gpu_rules_buf[gpu_rules_cnt]) == -1) continue; + + gpu_rules_cnt++; + } + } + } + + /** + * generate NOP rules + */ + + if (gpu_rules_cnt == 0) + { + gpu_rules_buf = (gpu_rule_t *) mymalloc (sizeof (gpu_rule_t)); + + gpu_rules_buf[gpu_rules_cnt].cmds[0] = RULE_OP_MANGLE_NOOP; + + gpu_rules_cnt++; + } + + data.gpu_rules_cnt = gpu_rules_cnt; + data.gpu_rules_buf = gpu_rules_buf; + + /** + * platform + */ + + #ifdef _CUDA + if (cuInit (0) != CUDA_SUCCESS) + { + log_error ("ERROR: No NVidia compatible platform found"); + + return (-1); + } + #endif + + /** + * devices get + */ + + uint devices_all_cnt = 0; + + #ifdef _CUDA + CUdevice devices_all[DEVICES_MAX]; + CUdevice devices[DEVICES_MAX]; + + hc_cuDeviceGetCount ((int *) &devices_all_cnt); + + for (uint i = 0; i < devices_all_cnt; i++) + { + hc_cuDeviceGet (&devices_all[i], i); + } + + #elif _OCL + cl_platform_id CL_platform = NULL; + + cl_platform_id CL_platforms[CL_PLATFORMS_MAX]; + + uint CL_platforms_cnt = 0; + + hc_clGetPlatformIDs (CL_PLATFORMS_MAX, CL_platforms, &CL_platforms_cnt); + + for (uint i = 0; i < CL_platforms_cnt; i++) + { + char CL_platform_vendor[INFOSZ]; + + memset (CL_platform_vendor, 0, sizeof (CL_platform_vendor)); + + hc_clGetPlatformInfo (CL_platforms[i], CL_PLATFORM_VENDOR, sizeof (CL_platform_vendor), CL_platform_vendor, NULL); + + if ((strcmp (CL_platform_vendor, CL_VENDOR_AMD) != 0) + && (strcmp (CL_platform_vendor, CL_VENDOR_SDS) != 0) + && (strcmp (CL_platform_vendor, CL_VENDOR_APPLE) != 0)) continue; + + if (strcmp (CL_platform_vendor, CL_VENDOR_SDS) == 0) gpu_temp_disable = 1; + + CL_platform = CL_platforms[i]; + } + + if (CL_platform == NULL) + { + log_error ("ERROR: No AMD/SDS compatible platform found"); + + return (-1); + } + + cl_device_id devices_all[DEVICES_MAX]; + cl_device_id devices[DEVICES_MAX]; + + hc_clGetDeviceIDs (CL_platform, CL_DEVICE_TYPE_GPU, DEVICES_MAX, devices_all, (uint *) &devices_all_cnt); + + #endif + + int hm_adapters_all = devices_all_cnt; + + hm_attrs_t hm_adapter_all[DEVICES_MAX]; + + memset (hm_adapter_all, 0, sizeof (hm_adapter_all)); + + if (gpu_temp_disable == 0) + { + #ifdef _CUDA + #ifdef LINUX + if (hc_NVML_nvmlInit () == NVML_SUCCESS) + { + HM_ADAPTER nvGPUHandle[DEVICES_MAX]; + + int tmp_in = hm_get_adapter_index (nvGPUHandle); + + int tmp_out = 0; + + for (int i = 0; i < tmp_in; i++) + { + hm_adapter_all[tmp_out++].adapter_index = nvGPUHandle[i]; + } + + hm_adapters_all = tmp_out; + + for (int i = 0; i < tmp_out; i++) + { + unsigned int speed; + + if (nvmlDeviceGetFanSpeed (hm_adapter_all[i].adapter_index, &speed) != NVML_ERROR_NOT_SUPPORTED) hm_adapter_all[i].fan_supported = 1; + } + } + #endif + + #ifdef WIN + if (NvAPI_Initialize () == NVAPI_OK) + { + HM_ADAPTER nvGPUHandle[DEVICES_MAX]; + + int tmp_in = hm_get_adapter_index (nvGPUHandle); + + int tmp_out = 0; + + for (int i = 0; i < tmp_in; i++) + { + hm_adapter_all[tmp_out++].adapter_index = nvGPUHandle[i]; + } + + hm_adapters_all = tmp_out; + + for (int i = 0; i < tmp_out; i++) + { + NvU32 speed; + + if (NvAPI_GPU_GetTachReading (hm_adapter_all[i].adapter_index, &speed) != NVAPI_NOT_SUPPORTED) hm_adapter_all[i].fan_supported = 1; + } + } + #endif + #endif + + #ifdef _OCL + #ifndef OSX + HM_LIB hm_dll = hm_init (); + + data.hm_dll = hm_dll; + + if (hc_ADL_Main_Control_Create (hm_dll, ADL_Main_Memory_Alloc, 0) == ADL_OK) + { + // total number of adapters + + int hm_adapters_num; + + if (get_adapters_num (hm_dll, &hm_adapters_num) != 0) return (-1); + + // adapter info + + LPAdapterInfo lpAdapterInfo = hm_get_adapter_info (hm_dll, hm_adapters_num); + + if (lpAdapterInfo == NULL) return (-1); + + // get a list (of ids of) valid/usable adapters + + int num_adl_adapters = 0; + + uint32_t *valid_adl_device_list = hm_get_list_valid_adl_adapters (hm_adapters_num, &num_adl_adapters, lpAdapterInfo); + + if (num_adl_adapters > 0) + { + hc_thread_mutex_lock (mux_adl); + + // hm_get_opencl_busid_devid (hm_adapter_all, devices_all_cnt, devices_all); + + hm_get_adapter_index (hm_adapter_all, valid_adl_device_list, num_adl_adapters, lpAdapterInfo); + + hm_get_overdrive_version (hm_dll, hm_adapter_all, valid_adl_device_list, num_adl_adapters, lpAdapterInfo); + hm_check_fanspeed_control (hm_dll, hm_adapter_all, valid_adl_device_list, num_adl_adapters, lpAdapterInfo); + + hc_thread_mutex_unlock (mux_adl); + } + + hm_adapters_all = num_adl_adapters; + + myfree (valid_adl_device_list); + myfree (lpAdapterInfo); + } + #endif + #endif + } + + if (hm_adapters_all == 0) + { + gpu_temp_disable = 1; + } + + if (gpu_temp_disable == 1) + { + gpu_temp_abort = 0; + gpu_temp_retain = 0; + } + + /** + * enable custom signal handler(s) + */ + + if (benchmark == 0) + { + hc_signal (sigHandler_default); + } + else + { + hc_signal (sigHandler_benchmark); + } + + /** + * devices mask and properties + */ + + uint devices_cnt = 0; + + for (uint device_all_id = 0; device_all_id < devices_all_cnt; device_all_id++) + { + if (gpu_devicemask) + { + uint device_all_id_mask = 1 << device_all_id; + + if ((device_all_id_mask & gpu_devicemask) != device_all_id_mask) + { + if (quiet == 0 && algorithm_pos == 0) log_info ("Device #%d: skipped by user", device_all_id_mask + 1); + + continue; + } + } + + const uint device_id = devices_cnt; + + devices[device_id] = devices_all[device_all_id]; + + memcpy (&data.hm_device[device_id], &hm_adapter_all[device_all_id], sizeof (hm_attrs_t)); + + char device_name[INFOSZ]; + + memset (device_name, 0, sizeof (device_name)); + + #ifdef _CUDA + size_t global_mem_size; + int max_clock_frequency; + int max_compute_units; + int kernel_exec_timeout; + + hc_cuDeviceGetName (device_name, sizeof (device_name), devices[device_id]); + hc_cuDeviceTotalMem (&global_mem_size, devices[device_id]); + hc_cuDeviceGetAttribute (&max_clock_frequency, CU_DEVICE_ATTRIBUTE_CLOCK_RATE, devices[device_id]); max_clock_frequency /= 1000; + hc_cuDeviceGetAttribute (&max_compute_units, CU_DEVICE_ATTRIBUTE_MULTIPROCESSOR_COUNT, devices[device_id]); + hc_cuDeviceGetAttribute (&kernel_exec_timeout, CU_DEVICE_ATTRIBUTE_KERNEL_EXEC_TIMEOUT, devices[device_id]); + + #elif _OCL + cl_ulong global_mem_size; + cl_uint max_clock_frequency; + cl_uint max_compute_units; + + hc_clGetDeviceInfo (devices[device_id], CL_DEVICE_NAME, sizeof (device_name), &device_name, NULL); + hc_clGetDeviceInfo (devices[device_id], CL_DEVICE_GLOBAL_MEM_SIZE, sizeof (global_mem_size), &global_mem_size, NULL); + hc_clGetDeviceInfo (devices[device_id], CL_DEVICE_MAX_CLOCK_FREQUENCY, sizeof (max_clock_frequency), &max_clock_frequency, NULL); + hc_clGetDeviceInfo (devices[device_id], CL_DEVICE_MAX_COMPUTE_UNITS, sizeof (max_compute_units), &max_compute_units, NULL); + + #endif + + if ((benchmark == 1 || quiet == 0) && (algorithm_pos == 0)) + { + log_info ("Device #%u: %s, %luMB, %dMhz, %uMCU", + device_all_id + 1, + device_name, + (unsigned int) (global_mem_size / 1024 / 1024), + (unsigned int) (max_clock_frequency), + (unsigned int) max_compute_units); + } + + #ifdef _CUDA + if (quiet == 0 && kernel_exec_timeout != 0 && algorithm_pos == 0) + { + log_info ("Device #%u: WARNING! Kernel exec timeout is not disabled, it might cause you errors of code 702", device_id + 1); + #if _WIN + log_info (" You can disable it with a regpatch, see here: http://hashcat.net/wiki/doku.php?id=timeout_patch"); + #endif + } + #endif + + devices_cnt++; + } + + if (devices_cnt == 0) + { + log_error ("ERROR: No devices left that matches your specification."); + + return (-1); + } + + if ((benchmark == 1 || quiet == 0) && (algorithm_pos == 0)) + { + log_info (""); + } + + /** + * inform the user + */ + + // gpu temp sanity check + + if ((gpu_temp_abort != 0) && (gpu_temp_retain != 0)) + { + if (gpu_temp_abort < gpu_temp_retain) + { + log_error ("ERROR: invalid values for gpu-temp-abort. Parameter gpu-temp-abort is less than gpu-temp-retain."); + + return (-1); + } + } + + if (data.quiet == 0) + { + log_info ("Hashes: %u hashes; %u unique digests, %u unique salts", hashes_cnt_orig, digests_cnt, salts_cnt); + + log_info ("Bitmaps: %u bits, %u entries, 0x%08x mask, %u bytes, %u/%u rotates", bitmap_bits, bitmap_nums, bitmap_mask, bitmap_size, bitmap_shift1, bitmap_shift2); + + if (attack_mode == ATTACK_MODE_STRAIGHT) + { + log_info ("Rules: %u", gpu_rules_cnt); + } + + if (opti_type) + { + log_info ("Applicable Optimizers:"); + + for (uint i = 0; i < 32; i++) + { + const uint opti_bit = 1 << i; + + if (opti_type & opti_bit) log_info ("* %s", stroptitype (opti_bit)); + } + } + + /** + * Watchdog and Temperature balance + */ + + if (gpu_temp_abort == 0) + { + log_info ("Watchdog: Temperature abort trigger disabled"); + } + else + { + log_info ("Watchdog: Temperature abort trigger set to %uc", gpu_temp_abort); + } + + if (gpu_temp_retain == 0) + { + log_info ("Watchdog: Temperature retain trigger disabled"); + } + else + { + log_info ("Watchdog: Temperature retain trigger set to %uc", gpu_temp_retain); + } + } + + /** + * store all the preparation, not hash_mode dependant + */ + + data.gpu_temp_disable = gpu_temp_disable; + data.gpu_temp_abort = gpu_temp_abort; + data.gpu_temp_retain = gpu_temp_retain; + + data.devices_cnt = devices_cnt; + + #ifdef _OCL + /** + * catalyst driver check + */ + + int catalyst_check = (force == 1) ? 0 : 1; + + int catalyst_warn = 0; + + int catalyst_broken = 0; + #endif + + /** + * devices init + */ + + #ifdef _OCL + #ifndef OSX + int gpu_temp_retain_set = 0; + + int *temp_retain_fanspeed_value = (int *) mycalloc (devices_cnt, sizeof (int)); + + ADLOD6MemClockState *od_clock_mem_status = (ADLOD6MemClockState *) mycalloc (devices_cnt, sizeof (ADLOD6MemClockState)); + + int *od_power_control_status = (int *) mycalloc (devices_cnt, sizeof (int)); + #endif + #endif + + hc_device_param_t *devices_param = (hc_device_param_t *) mycalloc (devices_cnt, sizeof (hc_device_param_t)); + + data.devices_param = devices_param; + + for (uint device_id = 0; device_id < devices_cnt; device_id++) + { + hc_device_param_t *device_param = &data.devices_param[device_id]; + + #ifdef _CUDA + CUdevice device = devices[device_id]; + + device_param->device = device; + + size_t bytes; + + hc_cuDeviceTotalMem (&bytes, device); + + device_param->gpu_maxmem_alloc = bytes; + + int sm_major = 0; + int sm_minor = 0; + int max_compute_units = 0; + + hc_cuDeviceComputeCapability (&sm_major, &sm_minor, device); + + if (sm_major == 1) + { + log_error ("ERROR: Shader Model 1.0 - 1.3 based GPU detected. Support for CUDA was dropped by NVidia."); + log_error (" Remove it from your system or use -d and select only supported cards."); + + return (-1); + } + + device_param->sm_major = sm_major; + device_param->sm_minor = sm_minor; + + hc_cuDeviceGetAttribute (&max_compute_units, CU_DEVICE_ATTRIBUTE_MULTIPROCESSOR_COUNT, device); + + if (sm_major >= 5) + { + // those maxwell and newer are so good compared to older chipsets we need to equalize + // their power to older chipsets, otherwise workload distribution which is based on the compute_units + // gets out of control + + max_compute_units *= 3; + } + + device_param->gpu_processors = max_compute_units; + + /** + * calculate vector size + */ + + uint vliw = get_vliw_by_compute_capability (sm_major, sm_minor); + + device_param->gpu_vector_width = get_gpu_vector_width (hash_mode, attack_kern, attack_exec, opti_type, vliw); + + #elif _OCL + cl_device_id device = devices[device_id]; + + device_param->device = device; + + cl_uint max_compute_units = 0; + + hc_clGetDeviceInfo (device, CL_DEVICE_MAX_COMPUTE_UNITS, sizeof (max_compute_units), &max_compute_units, NULL); + + device_param->gpu_processors = max_compute_units; + + cl_ulong max_mem_alloc_size = 0; + + hc_clGetDeviceInfo (device, CL_DEVICE_MAX_MEM_ALLOC_SIZE, sizeof (max_mem_alloc_size), &max_mem_alloc_size, NULL); + + device_param->gpu_maxmem_alloc = max_mem_alloc_size; + + char tmp[INFOSZ], t1[64]; + + memset (tmp, 0, sizeof (tmp)); + + hc_clGetDeviceInfo (device, CL_DEVICE_NAME, sizeof (tmp), &tmp, NULL); + + device_param->device_name = mystrdup (tmp); + + memset (tmp, 0, sizeof (tmp)); + + hc_clGetDeviceInfo (device, CL_DEVICE_VERSION, sizeof (tmp), &tmp, NULL); + + memset (t1, 0, sizeof (t1)); + + sscanf (tmp, "%*16s %*16s %*16s (%[^)]16s)", t1); + + device_param->device_version = mystrdup (t1); + + memset (tmp, 0, sizeof (tmp)); + + hc_clGetDeviceInfo (device, CL_DRIVER_VERSION, sizeof (tmp), &tmp, NULL); + + device_param->driver_version = mystrdup (tmp); + + /** + * calculate vector size + */ + + uint vliw = get_vliw_by_device_name (device_param->device_name); + + device_param->gpu_vector_width = get_gpu_vector_width (hash_mode, attack_kern, attack_exec, opti_type, vliw); + + /** + * catalyst driver check + */ + + if (catalyst_check == 1) + { + catalyst_warn = 1; + + // v14.9 and higher + if ((atoi (device_param->device_version) >= 1573) + && (atoi (device_param->driver_version) >= 1573)) + { + catalyst_warn = 0; + } + + /* + // v14.9 + if ((strstr (device_param->device_version, "1573.") != NULL) + && (strstr (device_param->driver_version, "1573.") != NULL)) + { + catalyst_warn = 0; + } + + // v14.12 -- version overlaps with v15.4 beta + if ((strstr (device_param->device_version, "1642.") != NULL) + && (strstr (device_param->driver_version, "1642.") != NULL)) + { + catalyst_broken = 1; + } + + // v15.4 (Beta, Windows only release) + if ((strstr (device_param->device_version, "1642.") != NULL) + && (strstr (device_param->driver_version, "1642.") != NULL)) + { + catalyst_warn = 0; + } + + // v15.5 (Release, Linux) + if ((strstr (device_param->device_version, "1702.") != NULL) + && (strstr (device_param->driver_version, "1702.") != NULL)) + { + catalyst_warn = 0; + } + + // v15.3 (Beta, Ubuntu repository release) + if ((strstr (device_param->device_version, "1729.") != NULL) + && (strstr (device_param->driver_version, "1729.") != NULL)) + { + catalyst_warn = 0; + } + */ + + catalyst_check = 0; + } + #endif + } + + #ifdef _OCL + if (catalyst_broken == 1) + { + log_error (""); + log_error ("ATTENTION! The installed GPU driver in your system is known to be broken!"); + log_error ("It will pass over cracked hashes and does not report them as cracked"); + log_error ("You are STRONGLY encouraged not to use it"); + log_error ("You can use --force to override this but do not post error reports if you do so"); + + return (-1); + } + + if (catalyst_warn == 1) + { + log_error (""); + log_error ("ATTENTION! Unsupported or incorrect installed GPU driver detected!"); + log_error ("You are STRONGLY encouraged to use the official supported GPU driver for good reasons"); + log_error ("See oclHashcat's homepage for official supported GPU drivers"); + #ifdef _WIN + log_error ("Also see: http://hashcat.net/wiki/doku.php?id=upgrading_amd_drivers_how_to"); + #endif + log_error ("You can use --force to override this but do not post error reports if you do so"); + + return (-1); + } + #endif + + uint gpu_blocks_all = 0; + + #ifdef _CUDA + for (uint device_id = 0; device_id < devices_cnt; device_id++) + { + /** + * host buffer + */ + + hc_device_param_t *device_param = &data.devices_param[device_id]; + + /** + * device properties + */ + + int sm_minor = device_param->sm_minor; + int sm_major = device_param->sm_major; + + uint gpu_processors = device_param->gpu_processors; + uint gpu_vector_width = device_param->gpu_vector_width; + + /** + * create context for each device + */ + + uint flags = 0; + + if (gpu_async == 0) flags |= CU_CTX_SCHED_BLOCKING_SYNC; + else flags |= CU_CTX_SCHED_SPIN; + + hc_cuCtxCreate (&device_param->context, flags, device_param->device); + + // does bad things hc_cuCtxSetCacheConfig (CU_FUNC_CACHE_PREFER_L1); + + /** + * create input buffers on device + */ + + uint gpu_threads = GPU_THREADS_NV; + + if (hash_mode == 1500) gpu_threads = 64; + if (hash_mode == 3000) gpu_threads = 64; + if (hash_mode == 3200) gpu_threads = 8; + if (hash_mode == 7500) gpu_threads = 64; + if (hash_mode == 8900) gpu_threads = 64; + if (hash_mode == 9000) gpu_threads = 8; + if (hash_mode == 9300) gpu_threads = 64; + if (hash_mode == 9700) gpu_threads = 64; + if (hash_mode == 9710) gpu_threads = 64; + if (hash_mode == 9800) gpu_threads = 64; + if (hash_mode == 9810) gpu_threads = 64; + if (hash_mode == 10400) gpu_threads = 64; + if (hash_mode == 10410) gpu_threads = 64; + if (hash_mode == 10500) gpu_threads = 64; + + uint gpu_power = gpu_processors * gpu_threads * gpu_accel; + uint gpu_blocks = gpu_power * gpu_vector_width; + + device_param->gpu_threads = gpu_threads; + device_param->gpu_power_user = gpu_power; + device_param->gpu_blocks_user = gpu_blocks; + + gpu_blocks_all += gpu_blocks; + + uint size_pws = gpu_power * sizeof (pw_t); + + uint size_tmps = 4; + + switch (hash_mode) + { + case 400: size_tmps = gpu_blocks * sizeof (phpass_tmp_t); break; + case 500: size_tmps = gpu_blocks * sizeof (md5crypt_tmp_t); break; + case 501: size_tmps = gpu_blocks * sizeof (md5crypt_tmp_t); break; + case 1600: size_tmps = gpu_blocks * sizeof (md5crypt_tmp_t); break; + case 1800: size_tmps = gpu_blocks * sizeof (sha512crypt_tmp_t); break; + case 2100: size_tmps = gpu_blocks * sizeof (dcc2_tmp_t); break; + case 2500: size_tmps = gpu_blocks * sizeof (wpa_tmp_t); break; + case 3200: size_tmps = gpu_blocks * sizeof (bcrypt_tmp_t); break; + case 5200: size_tmps = gpu_blocks * sizeof (pwsafe3_tmp_t); break; + case 5800: size_tmps = gpu_blocks * sizeof (androidpin_tmp_t); break; + case 6211: + case 6212: + case 6213: size_tmps = gpu_blocks * sizeof (tc_tmp_t); break; + case 6221: + case 6222: + case 6223: size_tmps = gpu_blocks * sizeof (tc64_tmp_t); break; + case 6231: + case 6232: + case 6233: size_tmps = gpu_blocks * sizeof (tc_tmp_t); break; + case 6241: + case 6242: + case 6243: size_tmps = gpu_blocks * sizeof (tc_tmp_t); break; + case 6300: size_tmps = gpu_blocks * sizeof (md5crypt_tmp_t); break; + case 6400: size_tmps = gpu_blocks * sizeof (sha256aix_tmp_t); break; + case 6500: size_tmps = gpu_blocks * sizeof (sha512aix_tmp_t); break; + case 6600: size_tmps = gpu_blocks * sizeof (agilekey_tmp_t); break; + case 6700: size_tmps = gpu_blocks * sizeof (sha1aix_tmp_t); break; + case 6800: size_tmps = gpu_blocks * sizeof (lastpass_tmp_t); break; + case 7100: size_tmps = gpu_blocks * sizeof (pbkdf2_sha512_tmp_t); break; + case 7200: size_tmps = gpu_blocks * sizeof (pbkdf2_sha512_tmp_t); break; + case 7400: size_tmps = gpu_blocks * sizeof (sha256crypt_tmp_t); break; + case 7900: size_tmps = gpu_blocks * sizeof (drupal7_tmp_t); break; + case 8200: size_tmps = gpu_blocks * sizeof (pbkdf2_sha512_tmp_t); break; + case 8800: size_tmps = gpu_blocks * sizeof (androidfde_tmp_t); break; + case 8900: size_tmps = gpu_blocks * sizeof (scrypt_tmp_t); break; + case 9000: size_tmps = gpu_blocks * sizeof (pwsafe2_tmp_t); break; + case 9100: size_tmps = gpu_blocks * sizeof (lotus8_tmp_t); break; + case 9200: size_tmps = gpu_blocks * sizeof (pbkdf2_sha256_tmp_t); break; + case 9300: size_tmps = gpu_blocks * sizeof (scrypt_tmp_t); break; + case 9400: size_tmps = gpu_blocks * sizeof (office2007_tmp_t); break; + case 9500: size_tmps = gpu_blocks * sizeof (office2010_tmp_t); break; + case 9600: size_tmps = gpu_blocks * sizeof (office2013_tmp_t); break; + case 10000: size_tmps = gpu_blocks * sizeof (pbkdf2_sha256_tmp_t); break; + case 10200: size_tmps = gpu_blocks * sizeof (cram_md5_t); break; + case 10300: size_tmps = gpu_blocks * sizeof (saph_sha1_tmp_t); break; + case 10500: size_tmps = gpu_blocks * sizeof (pdf14_tmp_t); break; + case 10700: size_tmps = gpu_blocks * sizeof (pdf17l8_tmp_t); break; + case 10900: size_tmps = gpu_blocks * sizeof (pbkdf2_sha256_tmp_t); break; + case 11300: size_tmps = gpu_blocks * sizeof (bitcoin_wallet_tmp_t); break; + case 11600: size_tmps = gpu_blocks * sizeof (seven_zip_tmp_t); break; + case 11900: size_tmps = gpu_blocks * sizeof (pbkdf2_md5_tmp_t); break; + case 12000: size_tmps = gpu_blocks * sizeof (pbkdf2_sha1_tmp_t); break; + case 12100: size_tmps = gpu_blocks * sizeof (pbkdf2_sha512_tmp_t); break; + case 12200: size_tmps = gpu_blocks * sizeof (ecryptfs_tmp_t); break; + case 12300: size_tmps = gpu_blocks * sizeof (oraclet_tmp_t); break; + case 12400: size_tmps = gpu_blocks * sizeof (bsdicrypt_tmp_t); break; + case 12500: size_tmps = gpu_blocks * sizeof (rar3_tmp_t); break; + case 12700: size_tmps = gpu_blocks * sizeof (mywallet_tmp_t); break; + case 12800: size_tmps = gpu_blocks * sizeof (pbkdf2_sha256_tmp_t); break; + }; + + uint size_hooks = 4; + + if ((opts_type & OPTS_TYPE_HOOK12) || (opts_type & OPTS_TYPE_HOOK23)) + { + // fill size_hook with correct size + } + + // we can optimize some stuff here... + + device_param->size_pws = size_pws; + device_param->size_tmps = size_tmps; + device_param->size_hooks = size_hooks; + + uint size_root_css = SP_PW_MAX * sizeof (cs_t); + uint size_markov_css = SP_PW_MAX * CHARSIZ * sizeof (cs_t); + + device_param->size_root_css = size_root_css; + device_param->size_markov_css = size_markov_css; + + uint size_results = GPU_THREADS_NV * sizeof (uint); + + device_param->size_results = size_results; + + uint size_rules = gpu_rules_cnt * sizeof (gpu_rule_t); + uint size_plains = digests_cnt * sizeof (plain_t); + uint size_salts = salts_cnt * sizeof (salt_t); + uint size_esalts = salts_cnt * esalt_size; + + device_param->size_plains = size_plains; + device_param->size_digests = size_digests; + device_param->size_shown = size_shown; + device_param->size_salts = size_salts; + + uint size_combs = GPU_COMBS * sizeof (comb_t); + uint size_bfs = GPU_BFS * sizeof (bf_t); + uint size_tm = 32 * sizeof (bs_word_t); + + uint64_t size_scryptV = 1; + + if ((hash_mode == 8900) || (hash_mode == 9300)) + { + #define SHADER_PER_MP 32 + #define WARPS 32 + + uint tmto_start = 2; + uint tmto_stop = 1024; + + if (scrypt_tmto) + { + tmto_start = 1 << scrypt_tmto; + tmto_stop = tmto_start + 1; + } + + for (uint tmto = tmto_start; tmto < tmto_stop; tmto <<= 1) + { + // todo -- make sure all salts get the new tmto value + + size_scryptV = (128 * data.salts_buf[0].scrypt_r) * data.salts_buf[0].scrypt_N; + + size_scryptV /= tmto; + + size_scryptV *= gpu_processors * WARPS * SHADER_PER_MP; + + if (size_scryptV > (device_param->gpu_maxmem_alloc / 2)) continue; + + for (uint salts_pos = 0; salts_pos < data.salts_cnt; salts_pos++) + { + data.salts_buf[salts_pos].scrypt_tmto = tmto; + data.salts_buf[salts_pos].scrypt_phy = gpu_processors * WARPS * SHADER_PER_MP; + } + + break; + } + + if (data.salts_buf[0].scrypt_tmto == 0) + { + log_error ("ERROR: can't allocate enough GPU memory"); + + return -1; + } + + if (quiet == 0) log_info (""); + if (quiet == 0) log_info ("SCRYPT tmto optimizer value set to: %u\n", data.salts_buf[0].scrypt_tmto); + } + + /** + * stream + */ + + hc_cuStreamCreate (&device_param->stream, 0); + + /** + * module find + */ + + char module_file[256]; + + memset (module_file, 0, sizeof (module_file)); + + #ifdef __x86_64__ + if (attack_exec == ATTACK_EXEC_ON_GPU) + { + if (attack_kern == ATTACK_KERN_STRAIGHT) + snprintf (module_file, sizeof (module_file) - 1, "%s/kernels/4318/m%05d_a0.sm_%d%d.64.cubin", install_dir, (int) kern_type, sm_major, sm_minor); + else if (attack_kern == ATTACK_KERN_COMBI) + snprintf (module_file, sizeof (module_file) - 1, "%s/kernels/4318/m%05d_a1.sm_%d%d.64.cubin", install_dir, (int) kern_type, sm_major, sm_minor); + else if (attack_kern == ATTACK_KERN_BF) + snprintf (module_file, sizeof (module_file) - 1, "%s/kernels/4318/m%05d_a3.sm_%d%d.64.cubin", install_dir, (int) kern_type, sm_major, sm_minor); + } + else + { + snprintf (module_file, sizeof (module_file) - 1, "%s/kernels/4318/m%05d.sm_%d%d.64.cubin", install_dir, (int) kern_type, sm_major, sm_minor); + + if ((hash_mode == 8900) || (hash_mode == 9300)) + { + snprintf (module_file, sizeof (module_file) - 1, "%s/kernels/4318/m%05d_%d_%d_%d_%d.sm_%d%d.64.cubin", install_dir, (int) kern_type, data.salts_buf[0].scrypt_N, data.salts_buf[0].scrypt_r, data.salts_buf[0].scrypt_p, data.salts_buf[0].scrypt_tmto, sm_major, sm_minor); + } + } + + #else + if (attack_exec == ATTACK_EXEC_ON_GPU) + { + if (attack_kern == ATTACK_KERN_STRAIGHT) + snprintf (module_file, sizeof (module_file) - 1, "%s/kernels/4318/m%05d_a0.sm_%d%d.32.cubin", install_dir, (int) kern_type, sm_major, sm_minor); + else if (attack_kern == ATTACK_KERN_COMBI) + snprintf (module_file, sizeof (module_file) - 1, "%s/kernels/4318/m%05d_a1.sm_%d%d.32.cubin", install_dir, (int) kern_type, sm_major, sm_minor); + else if (attack_kern == ATTACK_KERN_BF) + snprintf (module_file, sizeof (module_file) - 1, "%s/kernels/4318/m%05d_a3.sm_%d%d.32.cubin", install_dir, (int) kern_type, sm_major, sm_minor); + } + else + { + snprintf (module_file, sizeof (module_file) - 1, "%s/kernels/4318/m%05d.sm_%d%d.32.cubin", install_dir, (int) kern_type, sm_major, sm_minor); + + if ((hash_mode == 8900) || (hash_mode == 9300)) + { + snprintf (module_file, sizeof (module_file) - 1, "%s/kernels/4318/m%05d_%d_%d_%d_%d.sm_%d%d.32.cubin", install_dir, (int) kern_type, data.salts_buf[0].scrypt_N, data.salts_buf[0].scrypt_r, data.salts_buf[0].scrypt_p, data.salts_buf[0].scrypt_tmto, sm_major, sm_minor); + } + } + + #endif + + char module_mp_file[256]; + + memset (module_mp_file, 0, sizeof (module_mp_file)); + + if ((opti_type & OPTI_TYPE_BRUTE_FORCE) && (opts_type & OPTS_TYPE_PT_GENERATE_BE)) + { + #ifdef __x86_64__ + snprintf (module_mp_file, sizeof (module_mp_file) - 1, "%s/kernels/4318/markov_be_v%d.sm_%d%d.64.cubin", install_dir, gpu_vector_width, sm_major, sm_minor); + #else + snprintf (module_mp_file, sizeof (module_mp_file) - 1, "%s/kernels/4318/markov_be_v%d.sm_%d%d.32.cubin", install_dir, gpu_vector_width, sm_major, sm_minor); + #endif + } + else + { + #ifdef __x86_64__ + snprintf (module_mp_file, sizeof (module_mp_file) - 1, "%s/kernels/4318/markov_le_v%d.sm_%d%d.64.cubin", install_dir, gpu_vector_width, sm_major, sm_minor); + #else + snprintf (module_mp_file, sizeof (module_mp_file) - 1, "%s/kernels/4318/markov_le_v%d.sm_%d%d.32.cubin", install_dir, gpu_vector_width, sm_major, sm_minor); + #endif + } + + char module_amp_file[256]; + + memset (module_amp_file, 0, sizeof (module_amp_file)); + + #ifdef __x86_64__ + snprintf (module_amp_file, sizeof (module_amp_file) - 1, "%s/kernels/4318/amp_a%d_v%d.sm_%d%d.64.cubin", install_dir, attack_kern, gpu_vector_width, sm_major, sm_minor); + #else + snprintf (module_amp_file, sizeof (module_amp_file) - 1, "%s/kernels/4318/amp_a%d_v%d.sm_%d%d.32.cubin", install_dir, attack_kern, gpu_vector_width, sm_major, sm_minor); + #endif + + /** + * module load + */ + + hc_cuModuleLoad (&device_param->module, module_file); + + if (quiet == 0) log_info ("Device #%u: Kernel %s", device_id + 1, module_file); + + if (attack_mode != ATTACK_MODE_STRAIGHT) + { + hc_cuModuleLoad (&device_param->module_mp, module_mp_file); + + if (quiet == 0) log_info ("Device #%u: Kernel %s", device_id + 1, module_mp_file); + } + + if (attack_exec == ATTACK_EXEC_ON_GPU) + { + // nothing to do + } + else + { + hc_cuModuleLoad (&device_param->module_amp, module_amp_file); + + if (quiet == 0) log_info ("Device #%u: Kernel %s", device_id + 1, module_amp_file); + } + + /** + * module functions + */ + + char module_name[64]; + + memset (module_name, 0, sizeof (module_name)); + + if (attack_exec == ATTACK_EXEC_ON_GPU) + { + if (opti_type & OPTI_TYPE_SINGLE_HASH) + { + snprintf (module_name, sizeof (module_name) - 1, "m%05d_s%02d", kern_type, 4); + + hc_cuModuleGetFunction (&device_param->function1, device_param->module, module_name); + + snprintf (module_name, sizeof (module_name) - 1, "m%05d_s%02d", kern_type, 8); + + hc_cuModuleGetFunction (&device_param->function2, device_param->module, module_name); + + snprintf (module_name, sizeof (module_name) - 1, "m%05d_s%02d", kern_type, 16); + + hc_cuModuleGetFunction (&device_param->function3, device_param->module, module_name); + } + else + { + snprintf (module_name, sizeof (module_name) - 1, "m%05d_m%02d", kern_type, 4); + + hc_cuModuleGetFunction (&device_param->function1, device_param->module, module_name); + + snprintf (module_name, sizeof (module_name) - 1, "m%05d_m%02d", kern_type, 8); + + hc_cuModuleGetFunction (&device_param->function2, device_param->module, module_name); + + snprintf (module_name, sizeof (module_name) - 1, "m%05d_m%02d", kern_type, 16); + + hc_cuModuleGetFunction (&device_param->function3, device_param->module, module_name); + } + + if (attack_mode == ATTACK_MODE_BF) + { + if (opts_type & OPTS_TYPE_PT_BITSLICE) + { + snprintf (module_name, sizeof (module_name) - 1, "m%05d_tb", kern_type); + + hc_cuModuleGetFunction (&device_param->function_tb, device_param->module, module_name); + + snprintf (module_name, sizeof (module_name) - 1, "m%05d_tm", kern_type); + + hc_cuModuleGetFunction (&device_param->function_tm, device_param->module, module_name); + } + } + } + else + { + snprintf (module_name, sizeof (module_name) - 1, "m%05d_init", kern_type); + + hc_cuModuleGetFunction (&device_param->function1, device_param->module, module_name); + + snprintf (module_name, sizeof (module_name) - 1, "m%05d_loop", kern_type); + + hc_cuModuleGetFunction (&device_param->function2, device_param->module, module_name); + + snprintf (module_name, sizeof (module_name) - 1, "m%05d_comp", kern_type); + + hc_cuModuleGetFunction (&device_param->function3, device_param->module, module_name); + + if (opts_type & OPTS_TYPE_HOOK12) + { + snprintf (module_name, sizeof (module_name) - 1, "m%05d_hook12", kern_type); + + hc_cuModuleGetFunction (&device_param->function12, device_param->module, module_name); + } + + if (opts_type & OPTS_TYPE_HOOK23) + { + snprintf (module_name, sizeof (module_name) - 1, "m%05d_hook23", kern_type); + + hc_cuModuleGetFunction (&device_param->function23, device_param->module, module_name); + } + } + + if (attack_mode == ATTACK_MODE_BF) + { + hc_cuModuleGetFunction (&device_param->function_mp_l, device_param->module_mp, "l_markov"); + hc_cuModuleGetFunction (&device_param->function_mp_r, device_param->module_mp, "r_markov"); + } + else if (attack_mode == ATTACK_MODE_HYBRID1) + { + hc_cuModuleGetFunction (&device_param->function_mp, device_param->module_mp, "C_markov"); + } + else if (attack_mode == ATTACK_MODE_HYBRID2) + { + hc_cuModuleGetFunction (&device_param->function_mp, device_param->module_mp, "C_markov"); + } + + /** + * amplifiers are not independant + */ + + if (attack_exec == ATTACK_EXEC_ON_GPU) + { + // nothing to do + } + else + { + hc_cuModuleGetFunction (&device_param->function_amp, device_param->module_amp, "amp"); + } + + /** + * global buffers + */ + + hc_cuMemAlloc (&device_param->d_pws_buf, size_pws); + hc_cuMemAlloc (&device_param->d_pws_amp_buf, size_pws); + hc_cuMemAlloc (&device_param->d_tmps, size_tmps); + hc_cuMemAlloc (&device_param->d_hooks, size_hooks); + hc_cuMemAlloc (&device_param->d_bitmap_s1_a, bitmap_size); + hc_cuMemAlloc (&device_param->d_bitmap_s1_b, bitmap_size); + hc_cuMemAlloc (&device_param->d_bitmap_s1_c, bitmap_size); + hc_cuMemAlloc (&device_param->d_bitmap_s1_d, bitmap_size); + hc_cuMemAlloc (&device_param->d_bitmap_s2_a, bitmap_size); + hc_cuMemAlloc (&device_param->d_bitmap_s2_b, bitmap_size); + hc_cuMemAlloc (&device_param->d_bitmap_s2_c, bitmap_size); + hc_cuMemAlloc (&device_param->d_bitmap_s2_d, bitmap_size); + hc_cuMemAlloc (&device_param->d_plain_bufs, size_plains); + hc_cuMemAlloc (&device_param->d_digests_buf, size_digests); + hc_cuMemAlloc (&device_param->d_digests_shown, size_shown); + hc_cuMemAlloc (&device_param->d_salt_bufs, size_salts); + hc_cuMemAlloc (&device_param->d_result, size_results); + hc_cuMemAlloc (&device_param->d_scryptV_buf, size_scryptV); + + hc_cuMemcpyHtoD (device_param->d_bitmap_s1_a, bitmap_s1_a, bitmap_size); + hc_cuMemcpyHtoD (device_param->d_bitmap_s1_b, bitmap_s1_b, bitmap_size); + hc_cuMemcpyHtoD (device_param->d_bitmap_s1_c, bitmap_s1_c, bitmap_size); + hc_cuMemcpyHtoD (device_param->d_bitmap_s1_d, bitmap_s1_d, bitmap_size); + hc_cuMemcpyHtoD (device_param->d_bitmap_s2_a, bitmap_s2_a, bitmap_size); + hc_cuMemcpyHtoD (device_param->d_bitmap_s2_b, bitmap_s2_b, bitmap_size); + hc_cuMemcpyHtoD (device_param->d_bitmap_s2_c, bitmap_s2_c, bitmap_size); + hc_cuMemcpyHtoD (device_param->d_bitmap_s2_d, bitmap_s2_d, bitmap_size); + hc_cuMemcpyHtoD (device_param->d_digests_buf, data.digests_buf, size_digests); + hc_cuMemcpyHtoD (device_param->d_digests_shown, data.digests_shown, size_shown); + hc_cuMemcpyHtoD (device_param->d_salt_bufs, data.salts_buf, size_salts); + + run_kernel_bzero (device_param, device_param->d_pws_buf, size_pws); + run_kernel_bzero (device_param, device_param->d_pws_amp_buf, size_pws); + run_kernel_bzero (device_param, device_param->d_tmps, size_tmps); + run_kernel_bzero (device_param, device_param->d_hooks, size_hooks); + run_kernel_bzero (device_param, device_param->d_plain_bufs, size_plains); + run_kernel_bzero (device_param, device_param->d_result, size_results); + + /** + * special buffers + */ + + if (attack_kern == ATTACK_KERN_STRAIGHT) + { + hc_cuMemAlloc (&device_param->d_rules, size_rules); + + hc_cuMemcpyHtoD (device_param->d_rules, gpu_rules_buf, size_rules); + } + else if (attack_kern == ATTACK_KERN_COMBI) + { + hc_cuMemAlloc (&device_param->d_combs, size_combs); + hc_cuMemAlloc (&device_param->d_root_css_buf, size_root_css); + hc_cuMemAlloc (&device_param->d_markov_css_buf, size_markov_css); + + run_kernel_bzero (device_param, device_param->d_combs, size_combs); + run_kernel_bzero (device_param, device_param->d_root_css_buf, size_root_css); + run_kernel_bzero (device_param, device_param->d_markov_css_buf, size_markov_css); + } + else if (attack_kern == ATTACK_KERN_BF) + { + hc_cuMemAlloc (&device_param->d_bfs, size_bfs); + hc_cuMemAlloc (&device_param->d_tm, size_tm); + hc_cuMemAlloc (&device_param->d_root_css_buf, size_root_css); + hc_cuMemAlloc (&device_param->d_markov_css_buf, size_markov_css); + + run_kernel_bzero (device_param, device_param->d_bfs, size_bfs); + run_kernel_bzero (device_param, device_param->d_tm, size_tm); + run_kernel_bzero (device_param, device_param->d_root_css_buf, size_root_css); + run_kernel_bzero (device_param, device_param->d_markov_css_buf, size_markov_css); + } + + if (size_esalts) + { + hc_cuMemAlloc (&device_param->d_esalt_bufs, size_esalts); + + hc_cuMemcpyHtoD (device_param->d_esalt_bufs, data.esalts_buf, size_esalts); + } + + /** + * main host data + */ + + uint *result = (uint *) mymalloc (size_results); + + memset (result, 0, size_results); + + device_param->result = result; + + pw_t *pws_buf = (pw_t *) mymalloc (size_pws); + + memset (pws_buf, 0, size_pws); + + device_param->pws_buf = pws_buf; + + pw_cache_t *pw_caches = (pw_cache_t *) mycalloc (64, sizeof (pw_cache_t)); + + for (int i = 0; i < 64; i++) + { + pw_caches[i].pw_buf.pw_len = i; + pw_caches[i].cnt = 0; + } + + device_param->pw_caches = pw_caches; + + comb_t *combs_buf = (comb_t *) mycalloc (GPU_COMBS, sizeof (comb_t)); + + device_param->combs_buf = combs_buf; + + void *hooks_buf = mymalloc (size_hooks); + + device_param->hooks_buf = hooks_buf; + + switch (device_param->gpu_vector_width) + { + case 1: device_param->pw_transpose = pw_transpose_to_hi1; + device_param->pw_add = pw_add_to_hc1; + break; + case 2: device_param->pw_transpose = pw_transpose_to_hi2; + device_param->pw_add = pw_add_to_hc2; + break; + case 4: device_param->pw_transpose = pw_transpose_to_hi4; + device_param->pw_add = pw_add_to_hc4; + break; + } + + /** + * module args + */ + + device_param->kernel_params_buf32[21] = bitmap_mask; + device_param->kernel_params_buf32[22] = bitmap_shift1; + device_param->kernel_params_buf32[23] = bitmap_shift2; + device_param->kernel_params_buf32[24] = 0; // salt_pos + device_param->kernel_params_buf32[25] = 0; // loop_pos + device_param->kernel_params_buf32[26] = 0; // loop_cnt + device_param->kernel_params_buf32[27] = 0; // gpu_rules_cnt + device_param->kernel_params_buf32[28] = 0; // digests_cnt + device_param->kernel_params_buf32[29] = 0; // digests_offset + device_param->kernel_params_buf32[30] = 0; // combs_mode + device_param->kernel_params_buf32[31] = 0; // gid_max + + device_param->kernel_params[ 0] = (attack_exec == ATTACK_EXEC_ON_GPU) + ? &device_param->d_pws_buf + : &device_param->d_pws_amp_buf; + device_param->kernel_params[ 1] = &device_param->d_rules; + device_param->kernel_params[ 2] = &device_param->d_combs; + device_param->kernel_params[ 3] = &device_param->d_bfs; + device_param->kernel_params[ 4] = &device_param->d_tmps; + device_param->kernel_params[ 5] = &device_param->d_hooks; + device_param->kernel_params[ 6] = &device_param->d_bitmap_s1_a; + device_param->kernel_params[ 7] = &device_param->d_bitmap_s1_b; + device_param->kernel_params[ 8] = &device_param->d_bitmap_s1_c; + device_param->kernel_params[ 9] = &device_param->d_bitmap_s1_d; + device_param->kernel_params[10] = &device_param->d_bitmap_s2_a; + device_param->kernel_params[11] = &device_param->d_bitmap_s2_b; + device_param->kernel_params[12] = &device_param->d_bitmap_s2_c; + device_param->kernel_params[13] = &device_param->d_bitmap_s2_d; + device_param->kernel_params[14] = &device_param->d_plain_bufs; + device_param->kernel_params[15] = &device_param->d_digests_buf; + device_param->kernel_params[16] = &device_param->d_digests_shown; + device_param->kernel_params[17] = &device_param->d_salt_bufs; + device_param->kernel_params[18] = &device_param->d_esalt_bufs; + device_param->kernel_params[19] = &device_param->d_result; + device_param->kernel_params[20] = &device_param->d_scryptV_buf; + device_param->kernel_params[21] = &device_param->kernel_params_buf32[21]; + device_param->kernel_params[22] = &device_param->kernel_params_buf32[22]; + device_param->kernel_params[23] = &device_param->kernel_params_buf32[23]; + device_param->kernel_params[24] = &device_param->kernel_params_buf32[24]; + device_param->kernel_params[25] = &device_param->kernel_params_buf32[25]; + device_param->kernel_params[26] = &device_param->kernel_params_buf32[26]; + device_param->kernel_params[27] = &device_param->kernel_params_buf32[27]; + device_param->kernel_params[28] = &device_param->kernel_params_buf32[28]; + device_param->kernel_params[29] = &device_param->kernel_params_buf32[29]; + device_param->kernel_params[30] = &device_param->kernel_params_buf32[30]; + device_param->kernel_params[31] = &device_param->kernel_params_buf32[31]; + + device_param->kernel_params_mp_buf64[3] = 0; + device_param->kernel_params_mp_buf32[4] = 0; + device_param->kernel_params_mp_buf32[5] = 0; + device_param->kernel_params_mp_buf32[6] = 0; + device_param->kernel_params_mp_buf32[7] = 0; + device_param->kernel_params_mp_buf32[8] = 0; + + device_param->kernel_params_mp[0] = NULL; + device_param->kernel_params_mp[1] = NULL; + device_param->kernel_params_mp[2] = NULL; + device_param->kernel_params_mp[3] = &device_param->kernel_params_mp_buf64[3]; + device_param->kernel_params_mp[4] = &device_param->kernel_params_mp_buf32[4]; + device_param->kernel_params_mp[5] = &device_param->kernel_params_mp_buf32[5]; + device_param->kernel_params_mp[6] = &device_param->kernel_params_mp_buf32[6]; + device_param->kernel_params_mp[7] = &device_param->kernel_params_mp_buf32[7]; + device_param->kernel_params_mp[8] = &device_param->kernel_params_mp_buf32[8]; + + device_param->kernel_params_mp_l_buf64[3] = 0; + device_param->kernel_params_mp_l_buf32[4] = 0; + device_param->kernel_params_mp_l_buf32[5] = 0; + device_param->kernel_params_mp_l_buf32[6] = 0; + device_param->kernel_params_mp_l_buf32[7] = 0; + device_param->kernel_params_mp_l_buf32[8] = 0; + device_param->kernel_params_mp_l_buf32[9] = 0; + + device_param->kernel_params_mp_l[0] = NULL; + device_param->kernel_params_mp_l[1] = NULL; + device_param->kernel_params_mp_l[2] = NULL; + device_param->kernel_params_mp_l[3] = &device_param->kernel_params_mp_l_buf64[3]; + device_param->kernel_params_mp_l[4] = &device_param->kernel_params_mp_l_buf32[4]; + device_param->kernel_params_mp_l[5] = &device_param->kernel_params_mp_l_buf32[5]; + device_param->kernel_params_mp_l[6] = &device_param->kernel_params_mp_l_buf32[6]; + device_param->kernel_params_mp_l[7] = &device_param->kernel_params_mp_l_buf32[7]; + device_param->kernel_params_mp_l[8] = &device_param->kernel_params_mp_l_buf32[8]; + device_param->kernel_params_mp_l[9] = &device_param->kernel_params_mp_l_buf32[9]; + + device_param->kernel_params_mp_r_buf64[3] = 0; + device_param->kernel_params_mp_r_buf32[4] = 0; + device_param->kernel_params_mp_r_buf32[5] = 0; + device_param->kernel_params_mp_r_buf32[6] = 0; + device_param->kernel_params_mp_r_buf32[7] = 0; + device_param->kernel_params_mp_r_buf32[8] = 0; + + device_param->kernel_params_mp_r[0] = NULL; + device_param->kernel_params_mp_r[1] = NULL; + device_param->kernel_params_mp_r[2] = NULL; + device_param->kernel_params_mp_r[3] = &device_param->kernel_params_mp_r_buf64[3]; + device_param->kernel_params_mp_r[4] = &device_param->kernel_params_mp_r_buf32[4]; + device_param->kernel_params_mp_r[5] = &device_param->kernel_params_mp_r_buf32[5]; + device_param->kernel_params_mp_r[6] = &device_param->kernel_params_mp_r_buf32[6]; + device_param->kernel_params_mp_r[7] = &device_param->kernel_params_mp_r_buf32[7]; + device_param->kernel_params_mp_r[8] = &device_param->kernel_params_mp_r_buf32[8]; + + device_param->kernel_params_amp_buf32[5] = 0; // combs_mode + device_param->kernel_params_amp_buf32[6] = 0; // gid_max + + device_param->kernel_params_amp[0] = &device_param->d_pws_buf; + device_param->kernel_params_amp[1] = &device_param->d_pws_amp_buf; + device_param->kernel_params_amp[2] = &device_param->d_rules; + device_param->kernel_params_amp[3] = &device_param->d_combs; + device_param->kernel_params_amp[4] = &device_param->d_bfs; + device_param->kernel_params_amp[5] = &device_param->kernel_params_amp_buf32[5]; + device_param->kernel_params_amp[6] = &device_param->kernel_params_amp_buf32[6]; + + device_param->kernel_params_tb[0] = &device_param->d_pws_buf; + + device_param->kernel_params_tm[0] = &device_param->d_bfs; + device_param->kernel_params_tm[1] = &device_param->d_tm; + + /* constant memory init */ + + CUmodule c_module; + + if (attack_exec == ATTACK_EXEC_ON_GPU) + { + c_module = device_param->module; + } + else + { + c_module = device_param->module_amp; + } + + size_t c_bytes; + + if (attack_kern == ATTACK_KERN_STRAIGHT) + { + CUdeviceptr c_rules; + + hc_cuModuleGetGlobal (&c_rules, &c_bytes, c_module, "c_rules"); + + device_param->c_rules = c_rules; + device_param->c_bytes = c_bytes; + + hc_cuMemsetD8 (c_rules, 0, c_bytes); + } + else if (attack_kern == ATTACK_KERN_COMBI) + { + CUdeviceptr c_combs; + + hc_cuModuleGetGlobal (&c_combs, &c_bytes, c_module, "c_combs"); + + device_param->c_combs = c_combs; + device_param->c_bytes = c_bytes; + + hc_cuMemsetD8 (c_combs, 0, c_bytes); + } + else if (attack_kern == ATTACK_KERN_BF) + { + CUdeviceptr c_bfs; + + hc_cuModuleGetGlobal (&c_bfs, &c_bytes, c_module, "c_bfs"); + + device_param->c_bfs = c_bfs; + device_param->c_bytes = c_bytes; + + hc_cuMemsetD8 (c_bfs, 0, c_bytes); + + if (data.opts_type & OPTS_TYPE_PT_BITSLICE) + { + size_t bytes; + + CUdeviceptr c_tm; + + hc_cuModuleGetGlobal (&c_tm, &bytes, c_module, "c_tm"); + + device_param->c_tm = c_tm; + + hc_cuMemsetD8 (c_tm, 0, bytes); + } + } + + hc_cuCtxPopCurrent (NULL); + } + + #elif _OCL + for (uint device_id = 0; device_id < devices_cnt; device_id++) + { + /** + * host buffer + */ + + hc_device_param_t *device_param = &data.devices_param[device_id]; + + /** + * device properties + */ + + char *device_name = device_param->device_name; + char *device_version = device_param->device_version; + char *driver_version = device_param->driver_version; + + uint gpu_processors = device_param->gpu_processors; + uint gpu_vector_width = device_param->gpu_vector_width; + + /** + * create context for each device + */ + + device_param->context = hc_clCreateContext (NULL, 1, &device_param->device, NULL, NULL); + + /** + * create command-queue + */ + + device_param->command_queue = hc_clCreateCommandQueueWithProperties (device_param->context, device_param->device, NULL); + + /** + * create input buffers on device + */ + + uint gpu_threads = GPU_THREADS_AMD; + + if (hash_mode == 3200) gpu_threads = 8; + if (hash_mode == 9000) gpu_threads = 8; + + uint gpu_power = gpu_processors * gpu_threads * gpu_accel; + + uint gpu_blocks = gpu_power * gpu_vector_width; + + device_param->gpu_threads = gpu_threads; + device_param->gpu_power_user = gpu_power; + device_param->gpu_blocks_user = gpu_blocks; + + gpu_blocks_all += gpu_blocks; + + uint size_pws = gpu_power * sizeof (pw_t); + + uint size_tmps = 4; + + switch (hash_mode) + { + case 400: size_tmps = gpu_blocks * sizeof (phpass_tmp_t); break; + case 500: size_tmps = gpu_blocks * sizeof (md5crypt_tmp_t); break; + case 501: size_tmps = gpu_blocks * sizeof (md5crypt_tmp_t); break; + case 1600: size_tmps = gpu_blocks * sizeof (md5crypt_tmp_t); break; + case 1800: size_tmps = gpu_blocks * sizeof (sha512crypt_tmp_t); break; + case 2100: size_tmps = gpu_blocks * sizeof (dcc2_tmp_t); break; + case 2500: size_tmps = gpu_blocks * sizeof (wpa_tmp_t); break; + case 3200: size_tmps = gpu_blocks * sizeof (bcrypt_tmp_t); break; + case 5200: size_tmps = gpu_blocks * sizeof (pwsafe3_tmp_t); break; + case 5800: size_tmps = gpu_blocks * sizeof (androidpin_tmp_t); break; + case 6211: + case 6212: + case 6213: size_tmps = gpu_blocks * sizeof (tc_tmp_t); break; + case 6221: + case 6222: + case 6223: size_tmps = gpu_blocks * sizeof (tc64_tmp_t); break; + case 6231: + case 6232: + case 6233: size_tmps = gpu_blocks * sizeof (tc_tmp_t); break; + case 6241: + case 6242: + case 6243: size_tmps = gpu_blocks * sizeof (tc_tmp_t); break; + case 6300: size_tmps = gpu_blocks * sizeof (md5crypt_tmp_t); break; + case 6400: size_tmps = gpu_blocks * sizeof (sha256aix_tmp_t); break; + case 6500: size_tmps = gpu_blocks * sizeof (sha512aix_tmp_t); break; + case 6600: size_tmps = gpu_blocks * sizeof (agilekey_tmp_t); break; + case 6700: size_tmps = gpu_blocks * sizeof (sha1aix_tmp_t); break; + case 6800: size_tmps = gpu_blocks * sizeof (lastpass_tmp_t); break; + case 7100: size_tmps = gpu_blocks * sizeof (pbkdf2_sha512_tmp_t); break; + case 7200: size_tmps = gpu_blocks * sizeof (pbkdf2_sha512_tmp_t); break; + case 7400: size_tmps = gpu_blocks * sizeof (sha256crypt_tmp_t); break; + case 7900: size_tmps = gpu_blocks * sizeof (drupal7_tmp_t); break; + case 8200: size_tmps = gpu_blocks * sizeof (pbkdf2_sha512_tmp_t); break; + case 8800: size_tmps = gpu_blocks * sizeof (androidfde_tmp_t); break; + case 8900: size_tmps = gpu_blocks * sizeof (scrypt_tmp_t); break; + case 9000: size_tmps = gpu_blocks * sizeof (pwsafe2_tmp_t); break; + case 9100: size_tmps = gpu_blocks * sizeof (lotus8_tmp_t); break; + case 9200: size_tmps = gpu_blocks * sizeof (pbkdf2_sha256_tmp_t); break; + case 9300: size_tmps = gpu_blocks * sizeof (scrypt_tmp_t); break; + case 9400: size_tmps = gpu_blocks * sizeof (office2007_tmp_t); break; + case 9500: size_tmps = gpu_blocks * sizeof (office2010_tmp_t); break; + case 9600: size_tmps = gpu_blocks * sizeof (office2013_tmp_t); break; + case 10000: size_tmps = gpu_blocks * sizeof (pbkdf2_sha256_tmp_t); break; + case 10200: size_tmps = gpu_blocks * sizeof (cram_md5_t); break; + case 10300: size_tmps = gpu_blocks * sizeof (saph_sha1_tmp_t); break; + case 10500: size_tmps = gpu_blocks * sizeof (pdf14_tmp_t); break; + case 10700: size_tmps = gpu_blocks * sizeof (pdf17l8_tmp_t); break; + case 10900: size_tmps = gpu_blocks * sizeof (pbkdf2_sha256_tmp_t); break; + case 11300: size_tmps = gpu_blocks * sizeof (bitcoin_wallet_tmp_t); break; + case 11600: size_tmps = gpu_blocks * sizeof (seven_zip_tmp_t); break; + case 11900: size_tmps = gpu_blocks * sizeof (pbkdf2_md5_tmp_t); break; + case 12000: size_tmps = gpu_blocks * sizeof (pbkdf2_sha1_tmp_t); break; + case 12100: size_tmps = gpu_blocks * sizeof (pbkdf2_sha512_tmp_t); break; + case 12200: size_tmps = gpu_blocks * sizeof (ecryptfs_tmp_t); break; + case 12300: size_tmps = gpu_blocks * sizeof (oraclet_tmp_t); break; + case 12400: size_tmps = gpu_blocks * sizeof (bsdicrypt_tmp_t); break; + case 12500: size_tmps = gpu_blocks * sizeof (rar3_tmp_t); break; + case 12700: size_tmps = gpu_blocks * sizeof (mywallet_tmp_t); break; + case 12800: size_tmps = gpu_blocks * sizeof (pbkdf2_sha256_tmp_t); break; + }; + + uint size_hooks = 4; + + if ((opts_type & OPTS_TYPE_HOOK12) || (opts_type & OPTS_TYPE_HOOK23)) + { + // insert correct hook size + } + + // we can optimize some stuff here... + + device_param->size_pws = size_pws; + device_param->size_tmps = size_tmps; + device_param->size_hooks = size_hooks; + + uint size_root_css = SP_PW_MAX * sizeof (cs_t); + uint size_markov_css = SP_PW_MAX * CHARSIZ * sizeof (cs_t); + + device_param->size_root_css = size_root_css; + device_param->size_markov_css = size_markov_css; + + uint size_results = GPU_THREADS_AMD * sizeof (uint); + + device_param->size_results = size_results; + + uint size_rules = gpu_rules_cnt * sizeof (gpu_rule_t); + uint size_rules_c = GPU_RULES * sizeof (gpu_rule_t); + uint size_plains = digests_cnt * sizeof (plain_t); + uint size_salts = salts_cnt * sizeof (salt_t); + uint size_esalts = salts_cnt * esalt_size; + + device_param->size_plains = size_plains; + device_param->size_digests = size_digests; + device_param->size_shown = size_shown; + device_param->size_salts = size_salts; + + uint size_combs = GPU_COMBS * sizeof (comb_t); + uint size_bfs = GPU_BFS * sizeof (bf_t); + uint size_tm = 32 * sizeof (bs_word_t); + + uint64_t size_scryptV = 1; + + if ((hash_mode == 8900) || (hash_mode == 9300)) + { + #define SHADER_PER_MP 8 + #define WAVEFRONTS 64 + + uint tmto_start = 2; + uint tmto_stop = 1024; + + if (scrypt_tmto) + { + tmto_start = 1 << scrypt_tmto; + tmto_stop = tmto_start + 1; + } + + for (uint tmto = tmto_start; tmto < tmto_stop; tmto <<= 1) + { + // todo -- make sure all salts get the new tmto value + + size_scryptV = (128 * data.salts_buf[0].scrypt_r) * data.salts_buf[0].scrypt_N; + + size_scryptV /= tmto; + + size_scryptV *= gpu_processors * WAVEFRONTS * SHADER_PER_MP; + + if (size_scryptV > (device_param->gpu_maxmem_alloc / 2)) continue; + + for (uint salts_pos = 0; salts_pos < data.salts_cnt; salts_pos++) + { + data.salts_buf[salts_pos].scrypt_tmto = tmto; + data.salts_buf[salts_pos].scrypt_phy = gpu_processors * WAVEFRONTS * SHADER_PER_MP; + } + + break; + } + + if (data.salts_buf[0].scrypt_tmto == 0) + { + log_error ("ERROR: can't allocate enough GPU memory"); + + return -1; + } + + if (quiet == 0) log_info (""); + if (quiet == 0) log_info ("SCRYPT tmto optimizer value set to: %u\n", data.salts_buf[0].scrypt_tmto); + } + + /** + * kernel find + */ + + uint vliw = get_vliw_by_device_name (device_name); + + struct stat st; + + char kernel_file[256]; + + memset (kernel_file, 0, sizeof (kernel_file)); + + size_t *kernel_lengths = (size_t *) mymalloc (sizeof (size_t)); + + const unsigned char **kernel_sources = (const unsigned char **) mymalloc (sizeof (unsigned char *)); + + #ifdef BINARY_KERNEL + if (attack_exec == ATTACK_EXEC_ON_GPU) + { + if (attack_kern == ATTACK_KERN_STRAIGHT) + snprintf (kernel_file, sizeof (kernel_file) - 1, "%s/kernels/4098/m%05d_a0.%s_%s_%s_%d.kernel", install_dir, (int) kern_type, device_name, device_version, driver_version, COMPTIME); + else if (attack_kern == ATTACK_KERN_COMBI) + snprintf (kernel_file, sizeof (kernel_file) - 1, "%s/kernels/4098/m%05d_a1.%s_%s_%s_%d.kernel", install_dir, (int) kern_type, device_name, device_version, driver_version, COMPTIME); + else if (attack_kern == ATTACK_KERN_BF) + snprintf (kernel_file, sizeof (kernel_file) - 1, "%s/kernels/4098/m%05d_a3.%s_%s_%s_%d.kernel", install_dir, (int) kern_type, device_name, device_version, driver_version, COMPTIME); + } + else + { + snprintf (kernel_file, sizeof (kernel_file) - 1, "%s/kernels/4098/m%05d.%s_%s_%s_%d.kernel", install_dir, (int) kern_type, device_name, device_version, driver_version, COMPTIME); + + if ((hash_mode == 8900) || (hash_mode == 9300)) + { + snprintf (kernel_file, sizeof (kernel_file) - 1, "%s/kernels/4098/m%05d_%d_%d_%d_%d.%s_%s_%s_%d.kernel", install_dir, (int) kern_type, data.salts_buf[0].scrypt_N, data.salts_buf[0].scrypt_r, data.salts_buf[0].scrypt_p, data.salts_buf[0].scrypt_tmto, device_name, device_version, driver_version, COMPTIME); + } + } + + if (stat (kernel_file, &st) == -1) + { + if (quiet == 0) log_info ("Device #%u: Kernel %s not found in cache! Building may take a while...", device_id + 1, kernel_file); + + char module_file[256]; + + memset (module_file, 0, sizeof (module_file)); + + if (attack_exec == ATTACK_EXEC_ON_GPU) + { + if (attack_kern == ATTACK_KERN_STRAIGHT) + snprintf (module_file, sizeof (module_file) - 1, "%s/kernels/4098/m%05d_a0.VLIW%d.llvmir", install_dir, (int) kern_type, vliw); + else if (attack_kern == ATTACK_KERN_COMBI) + snprintf (module_file, sizeof (module_file) - 1, "%s/kernels/4098/m%05d_a1.VLIW%d.llvmir", install_dir, (int) kern_type, vliw); + else if (attack_kern == ATTACK_KERN_BF) + snprintf (module_file, sizeof (module_file) - 1, "%s/kernels/4098/m%05d_a3.VLIW%d.llvmir", install_dir, (int) kern_type, vliw); + } + else + { + snprintf (module_file, sizeof (module_file) - 1, "%s/kernels/4098/m%05d.VLIW%d.llvmir", install_dir, (int) kern_type, vliw); + + if ((hash_mode == 8900) || (hash_mode == 9300)) + { + snprintf (module_file, sizeof (module_file) - 1, "%s/kernels/4098/m%05d_%d_%d_%d_%d.VLIW%d.llvmir", install_dir, (int) kern_type, data.salts_buf[0].scrypt_N, data.salts_buf[0].scrypt_r, data.salts_buf[0].scrypt_p, data.salts_buf[0].scrypt_tmto, vliw); + } + } + + load_kernel (module_file, 1, kernel_lengths, kernel_sources); + + cl_program program = hc_clCreateProgramWithBinary (device_param->context, 1, &device_param->device, kernel_lengths, (const unsigned char **) kernel_sources, NULL); + + local_free (kernel_sources[0]); + + hc_clBuildProgram (program, 1, &device_param->device, "-cl-std=CL1.2", NULL, NULL); + + size_t binary_size; + + clGetProgramInfo (program, CL_PROGRAM_BINARY_SIZES, sizeof (size_t), &binary_size, NULL); + + unsigned char *binary = (unsigned char *) mymalloc (binary_size); + + clGetProgramInfo (program, CL_PROGRAM_BINARIES, sizeof (binary), &binary, NULL); + + writeProgramBin (kernel_file, binary, binary_size); + + local_free (binary); + + stat (kernel_file, &st); // to reload filesize + } + + #else + if (attack_exec == ATTACK_EXEC_ON_GPU) + { + if (attack_kern == ATTACK_KERN_STRAIGHT) + snprintf (kernel_file, sizeof (kernel_file) - 1, "%s/amd/m%05d_a0.cl", install_dir, (int) kern_type); + else if (attack_kern == ATTACK_KERN_COMBI) + snprintf (kernel_file, sizeof (kernel_file) - 1, "%s/amd/m%05d_a1.cl", install_dir, (int) kern_type); + else if (attack_kern == ATTACK_KERN_BF) + snprintf (kernel_file, sizeof (kernel_file) - 1, "%s/amd/m%05d_a3.cl", install_dir, (int) kern_type); + } + else + snprintf (kernel_file, sizeof (kernel_file) - 1, "%s/amd/m%05d.cl", install_dir, (int) kern_type); + + if (stat (kernel_file, &st) == -1) + { + log_error ("ERROR: %s: %s", kernel_file, strerror (errno)); + + return -1; + } + + #endif + + load_kernel (kernel_file, 1, kernel_lengths, kernel_sources); + + if (quiet == 0) log_info ("Device #%u: Kernel %s (%ld bytes)", device_id + 1, kernel_file, st.st_size); + + #ifdef BINARY_KERNEL + device_param->program = hc_clCreateProgramWithBinary (device_param->context, 1, &device_param->device, kernel_lengths, (const unsigned char **) kernel_sources, NULL); + #else + device_param->program = hc_clCreateProgramWithSource (device_param->context, 1, (const char **) kernel_sources, NULL); + #endif + + local_free (kernel_lengths); + + local_free (kernel_sources[0]); + + local_free (kernel_sources) + + /** + * kernel mp find + */ + + if (attack_mode != ATTACK_MODE_STRAIGHT) + { + char kernel_mp_file[256]; + + memset (kernel_mp_file, 0, sizeof (kernel_mp_file)); + + size_t *kernel_mp_lengths = (size_t *) mymalloc (sizeof (size_t)); + + const unsigned char **kernel_mp_sources = (const unsigned char **) mymalloc (sizeof (unsigned char *)); + + #ifdef BINARY_KERNEL + if ((opti_type & OPTI_TYPE_BRUTE_FORCE) && (opts_type & OPTS_TYPE_PT_GENERATE_BE)) + { + snprintf (kernel_mp_file, sizeof (kernel_mp_file) - 1, "%s/kernels/4098/markov_be_v%d.%s_%s_%s_%d.kernel", install_dir, gpu_vector_width, device_name, device_version, driver_version, COMPTIME); + } + else + { + snprintf (kernel_mp_file, sizeof (kernel_mp_file) - 1, "%s/kernels/4098/markov_le_v%d.%s_%s_%s_%d.kernel", install_dir, gpu_vector_width, device_name, device_version, driver_version, COMPTIME); + } + + if (stat (kernel_mp_file, &st) == -1) + { + if (quiet == 0) log_info ("Device #%u: Kernel %s not found in cache! Building may take a while...", device_id + 1, kernel_mp_file); + + char module_mp_file[256]; + + memset (module_mp_file, 0, sizeof (module_mp_file)); + + if ((opti_type & OPTI_TYPE_BRUTE_FORCE) && (opts_type & OPTS_TYPE_PT_GENERATE_BE)) + { + snprintf (module_mp_file, sizeof (module_mp_file) - 1, "%s/kernels/4098/markov_be_v%d.llvmir", install_dir, gpu_vector_width); + } + else + { + snprintf (module_mp_file, sizeof (module_mp_file) - 1, "%s/kernels/4098/markov_le_v%d.llvmir", install_dir, gpu_vector_width); + } + + load_kernel (module_mp_file, 1, kernel_mp_lengths, kernel_mp_sources); + + cl_program program_mp = hc_clCreateProgramWithBinary (device_param->context, 1, &device_param->device, kernel_mp_lengths, (const unsigned char **) kernel_mp_sources, NULL); + + local_free (kernel_mp_sources[0]); + + hc_clBuildProgram (program_mp, 1, &device_param->device, "-cl-std=CL1.2", NULL, NULL); + + size_t binary_mp_size; + + clGetProgramInfo (program_mp, CL_PROGRAM_BINARY_SIZES, sizeof (size_t), &binary_mp_size, NULL); + + unsigned char *binary_mp = (unsigned char *) mymalloc (binary_mp_size); + + clGetProgramInfo (program_mp, CL_PROGRAM_BINARIES, sizeof (binary_mp), &binary_mp, NULL); + + writeProgramBin (kernel_mp_file, binary_mp, binary_mp_size); + + local_free (binary_mp); + + stat (kernel_mp_file, &st); // to reload filesize + } + + #else + if ((opti_type & OPTI_TYPE_BRUTE_FORCE) && (opts_type & OPTS_TYPE_PT_GENERATE_BE)) + { + snprintf (kernel_mp_file, sizeof (kernel_mp_file) - 1, "%s/amd/markov_be_v%d.cl", install_dir, gpu_vector_width); + } + else + { + snprintf (kernel_mp_file, sizeof (kernel_mp_file) - 1, "%s/amd/markov_le_v%d.cl", install_dir, gpu_vector_width); + } + + if (stat (kernel_mp_file, &st) == -1) + { + log_error ("ERROR: %s: %s", kernel_mp_file, strerror (errno)); + + return -1; + } + + #endif + + load_kernel (kernel_mp_file, 1, kernel_mp_lengths, kernel_mp_sources); + + if (quiet == 0) log_info ("Device #%u: Kernel %s (%ld bytes)", device_id + 1, kernel_mp_file, st.st_size); + + #ifdef BINARY_KERNEL + device_param->program_mp = hc_clCreateProgramWithBinary (device_param->context, 1, &device_param->device, kernel_mp_lengths, (const unsigned char **) kernel_mp_sources, NULL); + #else + device_param->program_mp = hc_clCreateProgramWithSource (device_param->context, 1, (const char **) kernel_mp_sources, NULL); + #endif + + local_free (kernel_mp_lengths); + + local_free (kernel_mp_sources[0]); + + local_free (kernel_mp_sources); + } + + /** + * kernel amp find + */ + + if (attack_exec == ATTACK_EXEC_ON_GPU) + { + // nothing to do + } + else + { + char kernel_amp_file[256]; + + memset (kernel_amp_file, 0, sizeof (kernel_amp_file)); + + size_t *kernel_amp_lengths = (size_t *) mymalloc (sizeof (size_t)); + + const unsigned char **kernel_amp_sources = (const unsigned char **) mymalloc (sizeof (unsigned char *)); + + #ifdef BINARY_KERNEL + snprintf (kernel_amp_file, sizeof (kernel_amp_file) - 1, "%s/kernels/4098/amp_a%d_v%d.%s_%s_%s_%d.kernel", install_dir, attack_kern, gpu_vector_width, device_name, device_version, driver_version, COMPTIME); + + if (stat (kernel_amp_file, &st) == -1) + { + if (quiet == 0) log_info ("Device #%u: Kernel %s not found in cache! Building may take a while...", device_id + 1, kernel_amp_file); + + char module_amp_file[256]; + + memset (module_amp_file, 0, sizeof (module_amp_file)); + + snprintf (module_amp_file, sizeof (module_amp_file) - 1, "%s/kernels/4098/amp_a%d_v%d.llvmir", install_dir, attack_kern, gpu_vector_width); + + load_kernel (module_amp_file, 1, kernel_amp_lengths, kernel_amp_sources); + + cl_program program_amp = hc_clCreateProgramWithBinary (device_param->context, 1, &device_param->device, kernel_amp_lengths, (const unsigned char **) kernel_amp_sources, NULL); + + local_free (kernel_amp_sources[0]); + + hc_clBuildProgram (program_amp, 1, &device_param->device, "-cl-std=CL1.2", NULL, NULL); + + size_t binary_amp_size; + + clGetProgramInfo (program_amp, CL_PROGRAM_BINARY_SIZES, sizeof (size_t), &binary_amp_size, NULL); + + unsigned char *binary_amp = (unsigned char *) mymalloc (binary_amp_size); + + clGetProgramInfo (program_amp, CL_PROGRAM_BINARIES, sizeof (binary_amp), &binary_amp, NULL); + + writeProgramBin (kernel_amp_file, binary_amp, binary_amp_size); + + local_free (binary_amp); + + stat (kernel_amp_file, &st); // to reload filesize + } + #else + snprintf (kernel_amp_file, sizeof (kernel_amp_file) - 1, "%s/amd/amp_a%d_v%d.cl", install_dir, attack_kern, gpu_vector_width); + + if (stat (kernel_amp_file, &st) == -1) + { + log_error ("ERROR: %s: %s", kernel_amp_file, strerror (errno)); + + return -1; + } + #endif + + load_kernel (kernel_amp_file, 1, kernel_amp_lengths, kernel_amp_sources); + + if (quiet == 0) log_info ("Device #%u: Kernel %s (%ld bytes)", device_id + 1, kernel_amp_file, st.st_size); + + #ifdef BINARY_KERNEL + device_param->program_amp = hc_clCreateProgramWithBinary (device_param->context, 1, &device_param->device, kernel_amp_lengths, (const unsigned char **) kernel_amp_sources, NULL); + #else + device_param->program_amp = hc_clCreateProgramWithSource (device_param->context, 1, (const char **) kernel_amp_sources, NULL); + #endif + + local_free (kernel_amp_lengths); + + local_free (kernel_amp_sources[0]); + + local_free (kernel_amp_sources); + } + + /** + * kernel compile + */ + + char *build_opts = NULL; + + #ifndef BINARY_KERNEL + build_opts = (char *) mymalloc (256); + + sprintf (build_opts, "-I . -I amd/ -D VLIW%d -x clc++ -cl-std=CL1.2", vliw); + + if ((hash_mode == 8900) || (hash_mode == 9300)) + { + sprintf (build_opts, "-I . -I amd/ -D VLIW%d -x clc++ -cl-std=CL1.2 -DSCRYPT_N=%d -DSCRYPT_R=%d -DSCRYPT_P=%d -DSCRYPT_TMTO=%d", vliw, data.salts_buf[0].scrypt_N, data.salts_buf[0].scrypt_r, data.salts_buf[0].scrypt_p, data.salts_buf[0].scrypt_tmto); + } + #endif + + clBuildProgram (device_param->program, 1, &device_param->device, build_opts, NULL, NULL); + + size_t ret_val_size = 0; + + clGetProgramBuildInfo (device_param->program, device_param->device, CL_PROGRAM_BUILD_LOG, 0, NULL, &ret_val_size); + + if (ret_val_size > 1) + { + char *build_log = (char *) malloc (ret_val_size + 1); + + memset (build_log, 0, ret_val_size + 1); + + clGetProgramBuildInfo (device_param->program, device_param->device, CL_PROGRAM_BUILD_LOG, ret_val_size, build_log, NULL); + + puts (build_log); + + free (build_log); + } + + if (attack_mode != ATTACK_MODE_STRAIGHT) + { + hc_clBuildProgram (device_param->program_mp, 1, &device_param->device, build_opts, NULL, NULL); + } + + if (attack_exec == ATTACK_EXEC_ON_GPU) + { + // nothing to do + } + else + { + hc_clBuildProgram (device_param->program_amp, 1, &device_param->device, build_opts, NULL, NULL); + } + + /** + * amp is not independent + */ + + if (attack_exec == ATTACK_EXEC_ON_GPU) + { + // nothing to do + } + else + { + device_param->kernel_amp = hc_clCreateKernel (device_param->program_amp, "amp"); + } + + /** + * global buffers + */ + + device_param->d_pws_buf = hc_clCreateBuffer (device_param->context, CL_MEM_READ_ONLY, size_pws, NULL); + device_param->d_pws_amp_buf = hc_clCreateBuffer (device_param->context, CL_MEM_READ_ONLY, size_pws, NULL); + device_param->d_tmps = hc_clCreateBuffer (device_param->context, CL_MEM_READ_WRITE, size_tmps, NULL); + device_param->d_hooks = hc_clCreateBuffer (device_param->context, CL_MEM_READ_WRITE, size_hooks, NULL); + device_param->d_bitmap_s1_a = hc_clCreateBuffer (device_param->context, CL_MEM_READ_ONLY, bitmap_size, NULL); + device_param->d_bitmap_s1_b = hc_clCreateBuffer (device_param->context, CL_MEM_READ_ONLY, bitmap_size, NULL); + device_param->d_bitmap_s1_c = hc_clCreateBuffer (device_param->context, CL_MEM_READ_ONLY, bitmap_size, NULL); + device_param->d_bitmap_s1_d = hc_clCreateBuffer (device_param->context, CL_MEM_READ_ONLY, bitmap_size, NULL); + device_param->d_bitmap_s2_a = hc_clCreateBuffer (device_param->context, CL_MEM_READ_ONLY, bitmap_size, NULL); + device_param->d_bitmap_s2_b = hc_clCreateBuffer (device_param->context, CL_MEM_READ_ONLY, bitmap_size, NULL); + device_param->d_bitmap_s2_c = hc_clCreateBuffer (device_param->context, CL_MEM_READ_ONLY, bitmap_size, NULL); + device_param->d_bitmap_s2_d = hc_clCreateBuffer (device_param->context, CL_MEM_READ_ONLY, bitmap_size, NULL); + device_param->d_plain_bufs = hc_clCreateBuffer (device_param->context, CL_MEM_READ_WRITE, size_plains, NULL); + device_param->d_digests_buf = hc_clCreateBuffer (device_param->context, CL_MEM_READ_ONLY, size_digests, NULL); + device_param->d_digests_shown = hc_clCreateBuffer (device_param->context, CL_MEM_READ_WRITE, size_shown, NULL); + device_param->d_salt_bufs = hc_clCreateBuffer (device_param->context, CL_MEM_READ_ONLY, size_salts, NULL); + device_param->d_result = hc_clCreateBuffer (device_param->context, CL_MEM_READ_WRITE, size_results, NULL); + device_param->d_scryptV_buf = hc_clCreateBuffer (device_param->context, CL_MEM_READ_WRITE, size_scryptV, NULL); + + hc_clEnqueueWriteBuffer (device_param->command_queue, device_param->d_bitmap_s1_a, CL_TRUE, 0, bitmap_size, bitmap_s1_a, 0, NULL, NULL); + hc_clEnqueueWriteBuffer (device_param->command_queue, device_param->d_bitmap_s1_b, CL_TRUE, 0, bitmap_size, bitmap_s1_b, 0, NULL, NULL); + hc_clEnqueueWriteBuffer (device_param->command_queue, device_param->d_bitmap_s1_c, CL_TRUE, 0, bitmap_size, bitmap_s1_c, 0, NULL, NULL); + hc_clEnqueueWriteBuffer (device_param->command_queue, device_param->d_bitmap_s1_d, CL_TRUE, 0, bitmap_size, bitmap_s1_d, 0, NULL, NULL); + hc_clEnqueueWriteBuffer (device_param->command_queue, device_param->d_bitmap_s2_a, CL_TRUE, 0, bitmap_size, bitmap_s2_a, 0, NULL, NULL); + hc_clEnqueueWriteBuffer (device_param->command_queue, device_param->d_bitmap_s2_b, CL_TRUE, 0, bitmap_size, bitmap_s2_b, 0, NULL, NULL); + hc_clEnqueueWriteBuffer (device_param->command_queue, device_param->d_bitmap_s2_c, CL_TRUE, 0, bitmap_size, bitmap_s2_c, 0, NULL, NULL); + hc_clEnqueueWriteBuffer (device_param->command_queue, device_param->d_bitmap_s2_d, CL_TRUE, 0, bitmap_size, bitmap_s2_d, 0, NULL, NULL); + hc_clEnqueueWriteBuffer (device_param->command_queue, device_param->d_digests_buf, CL_TRUE, 0, size_digests, data.digests_buf, 0, NULL, NULL); + hc_clEnqueueWriteBuffer (device_param->command_queue, device_param->d_digests_shown, CL_TRUE, 0, size_shown, data.digests_shown, 0, NULL, NULL); + hc_clEnqueueWriteBuffer (device_param->command_queue, device_param->d_salt_bufs, CL_TRUE, 0, size_salts, data.salts_buf, 0, NULL, NULL); + + run_kernel_bzero (device_param, device_param->d_pws_buf, size_pws); + run_kernel_bzero (device_param, device_param->d_pws_amp_buf, size_pws); + run_kernel_bzero (device_param, device_param->d_tmps, size_tmps); + run_kernel_bzero (device_param, device_param->d_hooks, size_hooks); + run_kernel_bzero (device_param, device_param->d_plain_bufs, size_plains); + run_kernel_bzero (device_param, device_param->d_result, size_results); + + /** + * special buffers + */ + + if (attack_kern == ATTACK_KERN_STRAIGHT) + { + device_param->d_rules = hc_clCreateBuffer (device_param->context, CL_MEM_READ_ONLY, size_rules, NULL); + device_param->d_rules_c = hc_clCreateBuffer (device_param->context, CL_MEM_READ_ONLY, size_rules_c, NULL); + + hc_clEnqueueWriteBuffer (device_param->command_queue, device_param->d_rules, CL_TRUE, 0, size_rules, gpu_rules_buf, 0, NULL, NULL); + + run_kernel_bzero (device_param, device_param->d_rules_c, size_rules_c); + } + else if (attack_kern == ATTACK_KERN_COMBI) + { + device_param->d_combs = hc_clCreateBuffer (device_param->context, CL_MEM_READ_ONLY, size_combs, NULL); + device_param->d_combs_c = hc_clCreateBuffer (device_param->context, CL_MEM_READ_ONLY, size_combs, NULL); + device_param->d_root_css_buf = hc_clCreateBuffer (device_param->context, CL_MEM_READ_ONLY, size_root_css, NULL); + device_param->d_markov_css_buf = hc_clCreateBuffer (device_param->context, CL_MEM_READ_ONLY, size_markov_css, NULL); + + run_kernel_bzero (device_param, device_param->d_combs, size_combs); + run_kernel_bzero (device_param, device_param->d_combs_c, size_combs); + run_kernel_bzero (device_param, device_param->d_root_css_buf, size_root_css); + run_kernel_bzero (device_param, device_param->d_markov_css_buf, size_markov_css); + } + else if (attack_kern == ATTACK_KERN_BF) + { + device_param->d_bfs = hc_clCreateBuffer (device_param->context, CL_MEM_READ_ONLY, size_bfs, NULL); + device_param->d_bfs_c = hc_clCreateBuffer (device_param->context, CL_MEM_READ_ONLY, size_bfs, NULL); + device_param->d_tm_c = hc_clCreateBuffer (device_param->context, CL_MEM_READ_ONLY, size_tm, NULL); + device_param->d_root_css_buf = hc_clCreateBuffer (device_param->context, CL_MEM_READ_ONLY, size_root_css, NULL); + device_param->d_markov_css_buf = hc_clCreateBuffer (device_param->context, CL_MEM_READ_ONLY, size_markov_css, NULL); + + run_kernel_bzero (device_param, device_param->d_bfs, size_bfs); + run_kernel_bzero (device_param, device_param->d_bfs_c, size_bfs); + run_kernel_bzero (device_param, device_param->d_tm_c, size_tm); + run_kernel_bzero (device_param, device_param->d_root_css_buf, size_root_css); + run_kernel_bzero (device_param, device_param->d_markov_css_buf, size_markov_css); + } + + if (size_esalts) + { + device_param->d_esalt_bufs = hc_clCreateBuffer (device_param->context, CL_MEM_READ_ONLY, size_esalts, NULL); + + hc_clEnqueueWriteBuffer (device_param->command_queue, device_param->d_esalt_bufs, CL_TRUE, 0, size_esalts, data.esalts_buf, 0, NULL, NULL); + } + + /** + * main host data + */ + + uint *result = (uint *) mymalloc (size_results); + + memset (result, 0, size_results); + + device_param->result = result; + + pw_t *pws_buf = (pw_t *) mymalloc (size_pws); + + memset (pws_buf, 0, size_pws); + + device_param->pws_buf = pws_buf; + + pw_cache_t *pw_caches = (pw_cache_t *) mycalloc (64, sizeof (pw_cache_t)); + + for (int i = 0; i < 64; i++) + { + pw_caches[i].pw_buf.pw_len = i; + pw_caches[i].cnt = 0; + } + + device_param->pw_caches = pw_caches; + + comb_t *combs_buf = (comb_t *) mycalloc (GPU_COMBS, sizeof (comb_t)); + + device_param->combs_buf = combs_buf; + + void *hooks_buf = mymalloc (size_hooks); + + device_param->hooks_buf = hooks_buf; + + switch (device_param->gpu_vector_width) + { + case 1: device_param->pw_transpose = pw_transpose_to_hi1; + device_param->pw_add = pw_add_to_hc1; + break; + case 2: device_param->pw_transpose = pw_transpose_to_hi2; + device_param->pw_add = pw_add_to_hc2; + break; + case 4: device_param->pw_transpose = pw_transpose_to_hi4; + device_param->pw_add = pw_add_to_hc4; + break; + } + + /** + * kernel args + */ + + device_param->kernel_params_buf32[21] = bitmap_mask; + device_param->kernel_params_buf32[22] = bitmap_shift1; + device_param->kernel_params_buf32[23] = bitmap_shift2; + device_param->kernel_params_buf32[24] = 0; // salt_pos + device_param->kernel_params_buf32[25] = 0; // loop_pos + device_param->kernel_params_buf32[26] = 0; // loop_cnt + device_param->kernel_params_buf32[27] = 0; // gpu_rules_cnt + device_param->kernel_params_buf32[28] = 0; // digests_cnt + device_param->kernel_params_buf32[29] = 0; // digests_offset + device_param->kernel_params_buf32[30] = 0; // combs_mode + device_param->kernel_params_buf32[31] = 0; // gid_max + + device_param->kernel_params[ 0] = (attack_exec == ATTACK_EXEC_ON_GPU) + ? &device_param->d_pws_buf + : &device_param->d_pws_amp_buf; + device_param->kernel_params[ 1] = &device_param->d_rules_c; + device_param->kernel_params[ 2] = &device_param->d_combs_c; + device_param->kernel_params[ 3] = &device_param->d_bfs_c; + device_param->kernel_params[ 4] = &device_param->d_tmps; + device_param->kernel_params[ 5] = &device_param->d_hooks; + device_param->kernel_params[ 6] = &device_param->d_bitmap_s1_a; + device_param->kernel_params[ 7] = &device_param->d_bitmap_s1_b; + device_param->kernel_params[ 8] = &device_param->d_bitmap_s1_c; + device_param->kernel_params[ 9] = &device_param->d_bitmap_s1_d; + device_param->kernel_params[10] = &device_param->d_bitmap_s2_a; + device_param->kernel_params[11] = &device_param->d_bitmap_s2_b; + device_param->kernel_params[12] = &device_param->d_bitmap_s2_c; + device_param->kernel_params[13] = &device_param->d_bitmap_s2_d; + device_param->kernel_params[14] = &device_param->d_plain_bufs; + device_param->kernel_params[15] = &device_param->d_digests_buf; + device_param->kernel_params[16] = &device_param->d_digests_shown; + device_param->kernel_params[17] = &device_param->d_salt_bufs; + device_param->kernel_params[18] = &device_param->d_esalt_bufs; + device_param->kernel_params[19] = &device_param->d_result; + device_param->kernel_params[20] = &device_param->d_scryptV_buf; + device_param->kernel_params[21] = &device_param->kernel_params_buf32[21]; + device_param->kernel_params[22] = &device_param->kernel_params_buf32[22]; + device_param->kernel_params[23] = &device_param->kernel_params_buf32[23]; + device_param->kernel_params[24] = &device_param->kernel_params_buf32[24]; + device_param->kernel_params[25] = &device_param->kernel_params_buf32[25]; + device_param->kernel_params[26] = &device_param->kernel_params_buf32[26]; + device_param->kernel_params[27] = &device_param->kernel_params_buf32[27]; + device_param->kernel_params[28] = &device_param->kernel_params_buf32[28]; + device_param->kernel_params[29] = &device_param->kernel_params_buf32[29]; + device_param->kernel_params[30] = &device_param->kernel_params_buf32[30]; + device_param->kernel_params[31] = &device_param->kernel_params_buf32[31]; + + device_param->kernel_params_mp_buf64[3] = 0; + device_param->kernel_params_mp_buf32[4] = 0; + device_param->kernel_params_mp_buf32[5] = 0; + device_param->kernel_params_mp_buf32[6] = 0; + device_param->kernel_params_mp_buf32[7] = 0; + device_param->kernel_params_mp_buf32[8] = 0; + + device_param->kernel_params_mp[0] = NULL; + device_param->kernel_params_mp[1] = NULL; + device_param->kernel_params_mp[2] = NULL; + device_param->kernel_params_mp[3] = &device_param->kernel_params_mp_buf64[3]; + device_param->kernel_params_mp[4] = &device_param->kernel_params_mp_buf32[4]; + device_param->kernel_params_mp[5] = &device_param->kernel_params_mp_buf32[5]; + device_param->kernel_params_mp[6] = &device_param->kernel_params_mp_buf32[6]; + device_param->kernel_params_mp[7] = &device_param->kernel_params_mp_buf32[7]; + device_param->kernel_params_mp[8] = &device_param->kernel_params_mp_buf32[8]; + + device_param->kernel_params_mp_l_buf64[3] = 0; + device_param->kernel_params_mp_l_buf32[4] = 0; + device_param->kernel_params_mp_l_buf32[5] = 0; + device_param->kernel_params_mp_l_buf32[6] = 0; + device_param->kernel_params_mp_l_buf32[7] = 0; + device_param->kernel_params_mp_l_buf32[8] = 0; + device_param->kernel_params_mp_l_buf32[9] = 0; + + device_param->kernel_params_mp_l[0] = NULL; + device_param->kernel_params_mp_l[1] = NULL; + device_param->kernel_params_mp_l[2] = NULL; + device_param->kernel_params_mp_l[3] = &device_param->kernel_params_mp_l_buf64[3]; + device_param->kernel_params_mp_l[4] = &device_param->kernel_params_mp_l_buf32[4]; + device_param->kernel_params_mp_l[5] = &device_param->kernel_params_mp_l_buf32[5]; + device_param->kernel_params_mp_l[6] = &device_param->kernel_params_mp_l_buf32[6]; + device_param->kernel_params_mp_l[7] = &device_param->kernel_params_mp_l_buf32[7]; + device_param->kernel_params_mp_l[8] = &device_param->kernel_params_mp_l_buf32[8]; + device_param->kernel_params_mp_l[9] = &device_param->kernel_params_mp_l_buf32[9]; + + device_param->kernel_params_mp_r_buf64[3] = 0; + device_param->kernel_params_mp_r_buf32[4] = 0; + device_param->kernel_params_mp_r_buf32[5] = 0; + device_param->kernel_params_mp_r_buf32[6] = 0; + device_param->kernel_params_mp_r_buf32[7] = 0; + device_param->kernel_params_mp_r_buf32[8] = 0; + + device_param->kernel_params_mp_r[0] = NULL; + device_param->kernel_params_mp_r[1] = NULL; + device_param->kernel_params_mp_r[2] = NULL; + device_param->kernel_params_mp_r[3] = &device_param->kernel_params_mp_r_buf64[3]; + device_param->kernel_params_mp_r[4] = &device_param->kernel_params_mp_r_buf32[4]; + device_param->kernel_params_mp_r[5] = &device_param->kernel_params_mp_r_buf32[5]; + device_param->kernel_params_mp_r[6] = &device_param->kernel_params_mp_r_buf32[6]; + device_param->kernel_params_mp_r[7] = &device_param->kernel_params_mp_r_buf32[7]; + device_param->kernel_params_mp_r[8] = &device_param->kernel_params_mp_r_buf32[8]; + + device_param->kernel_params_amp_buf32[5] = 0; // combs_mode + device_param->kernel_params_amp_buf32[6] = 0; // gid_max + + device_param->kernel_params_amp[0] = &device_param->d_pws_buf; + device_param->kernel_params_amp[1] = &device_param->d_pws_amp_buf; + device_param->kernel_params_amp[2] = &device_param->d_rules_c; + device_param->kernel_params_amp[3] = &device_param->d_combs_c; + device_param->kernel_params_amp[4] = &device_param->d_bfs_c; + device_param->kernel_params_amp[5] = &device_param->kernel_params_amp_buf32[5]; + device_param->kernel_params_amp[6] = &device_param->kernel_params_amp_buf32[6]; + + device_param->kernel_params_tb[0] = &device_param->d_pws_buf; + + device_param->kernel_params_tm[0] = &device_param->d_bfs_c; + device_param->kernel_params_tm[1] = &device_param->d_tm_c; + + /** + * kernel name + */ + + char kernel_name[64]; + + memset (kernel_name, 0, sizeof (kernel_name)); + + if (attack_exec == ATTACK_EXEC_ON_GPU) + { + if (opti_type & OPTI_TYPE_SINGLE_HASH) + { + snprintf (kernel_name, sizeof (kernel_name) - 1, "m%05d_s%02d", kern_type, 4); + + device_param->kernel1 = hc_clCreateKernel (device_param->program, kernel_name); + + snprintf (kernel_name, sizeof (kernel_name) - 1, "m%05d_s%02d", kern_type, 8); + + device_param->kernel2 = hc_clCreateKernel (device_param->program, kernel_name); + + snprintf (kernel_name, sizeof (kernel_name) - 1, "m%05d_s%02d", kern_type, 16); + + device_param->kernel3 = hc_clCreateKernel (device_param->program, kernel_name); + } + else + { + snprintf (kernel_name, sizeof (kernel_name) - 1, "m%05d_m%02d", kern_type, 4); + + device_param->kernel1 = hc_clCreateKernel (device_param->program, kernel_name); + + snprintf (kernel_name, sizeof (kernel_name) - 1, "m%05d_m%02d", kern_type, 8); + + device_param->kernel2 = hc_clCreateKernel (device_param->program, kernel_name); + + snprintf (kernel_name, sizeof (kernel_name) - 1, "m%05d_m%02d", kern_type, 16); + + device_param->kernel3 = hc_clCreateKernel (device_param->program, kernel_name); + } + + if (data.attack_mode == ATTACK_MODE_BF) + { + if (opts_type & OPTS_TYPE_PT_BITSLICE) + { + snprintf (kernel_name, sizeof (kernel_name) - 1, "m%05d_tb", kern_type); + + device_param->kernel_tb = hc_clCreateKernel (device_param->program, kernel_name); + + snprintf (kernel_name, sizeof (kernel_name) - 1, "m%05d_tm", kern_type); + + device_param->kernel_tm = hc_clCreateKernel (device_param->program, kernel_name); + } + } + } + else + { + snprintf (kernel_name, sizeof (kernel_name) - 1, "m%05d_init", kern_type); + + device_param->kernel1 = hc_clCreateKernel (device_param->program, kernel_name); + + snprintf (kernel_name, sizeof (kernel_name) - 1, "m%05d_loop", kern_type); + + device_param->kernel2 = hc_clCreateKernel (device_param->program, kernel_name); + + snprintf (kernel_name, sizeof (kernel_name) - 1, "m%05d_comp", kern_type); + + device_param->kernel3 = hc_clCreateKernel (device_param->program, kernel_name); + + if (opts_type & OPTS_TYPE_HOOK12) + { + snprintf (kernel_name, sizeof (kernel_name) - 1, "m%05d_hook12", kern_type); + + device_param->kernel12 = hc_clCreateKernel (device_param->program, kernel_name); + } + + if (opts_type & OPTS_TYPE_HOOK23) + { + snprintf (kernel_name, sizeof (kernel_name) - 1, "m%05d_hook23", kern_type); + + device_param->kernel23 = hc_clCreateKernel (device_param->program, kernel_name); + } + } + + for (uint i = 0; i <= 20; i++) + { + hc_clSetKernelArg (device_param->kernel1, i, sizeof (cl_mem), device_param->kernel_params[i]); + hc_clSetKernelArg (device_param->kernel2, i, sizeof (cl_mem), device_param->kernel_params[i]); + hc_clSetKernelArg (device_param->kernel3, i, sizeof (cl_mem), device_param->kernel_params[i]); + + if (opts_type & OPTS_TYPE_HOOK12) hc_clSetKernelArg (device_param->kernel12, i, sizeof (cl_mem), device_param->kernel_params[i]); + if (opts_type & OPTS_TYPE_HOOK23) hc_clSetKernelArg (device_param->kernel23, i, sizeof (cl_mem), device_param->kernel_params[i]); + } + + for (uint i = 21; i <= 31; i++) + { + hc_clSetKernelArg (device_param->kernel1, i, sizeof (cl_uint), device_param->kernel_params[i]); + hc_clSetKernelArg (device_param->kernel2, i, sizeof (cl_uint), device_param->kernel_params[i]); + hc_clSetKernelArg (device_param->kernel3, i, sizeof (cl_uint), device_param->kernel_params[i]); + + if (opts_type & OPTS_TYPE_HOOK12) hc_clSetKernelArg (device_param->kernel12, i, sizeof (cl_uint), device_param->kernel_params[i]); + if (opts_type & OPTS_TYPE_HOOK23) hc_clSetKernelArg (device_param->kernel23, i, sizeof (cl_uint), device_param->kernel_params[i]); + } + + if (attack_mode == ATTACK_MODE_BF) + { + device_param->kernel_mp_l = hc_clCreateKernel (device_param->program_mp, "l_markov"); + device_param->kernel_mp_r = hc_clCreateKernel (device_param->program_mp, "r_markov"); + + if (opts_type & OPTS_TYPE_PT_BITSLICE) + { + hc_clSetKernelArg (device_param->kernel_tb, 0, sizeof (cl_mem), device_param->kernel_params_tb[0]); + + hc_clSetKernelArg (device_param->kernel_tm, 0, sizeof (cl_mem), device_param->kernel_params_tm[0]); + hc_clSetKernelArg (device_param->kernel_tm, 1, sizeof (cl_mem), device_param->kernel_params_tm[1]); + } + } + else if (attack_mode == ATTACK_MODE_HYBRID1) + { + device_param->kernel_mp = hc_clCreateKernel (device_param->program_mp, "C_markov"); + } + else if (attack_mode == ATTACK_MODE_HYBRID2) + { + device_param->kernel_mp = hc_clCreateKernel (device_param->program_mp, "C_markov"); + } + + if (attack_exec == ATTACK_EXEC_ON_GPU) + { + // nothing to do + } + else + { + for (uint i = 0; i < 5; i++) + { + hc_clSetKernelArg (device_param->kernel_amp, i, sizeof (cl_mem), device_param->kernel_params_amp[i]); + } + + for (uint i = 5; i < 7; i++) + { + hc_clSetKernelArg (device_param->kernel_amp, i, sizeof (cl_uint), device_param->kernel_params_amp[i]); + } + } + + /** + * Store initial fanspeed if gpu_temp_retain is enabled + */ + + if (gpu_temp_disable == 0) + { + if (gpu_temp_retain != 0) + { + hc_thread_mutex_lock (mux_adl); + + if (data.hm_device[device_id].fan_supported == 1) + { + if (gpu_temp_retain_chgd == 0) + { + uint cur_temp = 0; + uint default_temp = 0; + + int ADL_rc = hc_ADL_Overdrive6_TargetTemperatureData_Get (data.hm_dll, data.hm_device[device_id].adapter_index, (int *) &cur_temp, (int *) &default_temp); + + if (ADL_rc == ADL_OK) + { + #define GPU_TEMP_RETAIN_ABORT_DIFF 15 + + const uint gpu_temp_retain_target = default_temp - GPU_TEMP_RETAIN_ABORT_DIFF; + + // special case with multi gpu setups: always use minimum retain + + if (gpu_temp_retain_set == 0) + { + gpu_temp_retain = gpu_temp_retain_target; + gpu_temp_retain_set = 1; + } + else + { + gpu_temp_retain = MIN (gpu_temp_retain, gpu_temp_retain_target); + } + + if (gpu_temp_abort_chgd == 0) gpu_temp_abort = gpu_temp_retain + GPU_TEMP_RETAIN_ABORT_DIFF; + } + } + + const int fan_speed = hm_get_fanspeed_with_device_id (device_id); + + temp_retain_fanspeed_value[device_id] = fan_speed; + + if (fan_speed == -1) + { + log_info ("WARNING: Failed to get current fan speed settings for gpu number: %i:", device_id + 1); + + temp_retain_fanspeed_value[device_id] = 0; + } + } + + hc_thread_mutex_unlock (mux_adl); + } + } + + /** + * Store original powercontrol/clocks settings, set overdrive 6 performance tuning settings + */ + + if (powertune_enable == 1) + { + hc_thread_mutex_lock (mux_adl); + + if (data.hm_device[device_id].od_version == 6) + { + int ADL_rc; + + // check powertune capabilities first, if not available then skip device + + int powertune_supported = 0; + + if ((ADL_rc = hc_ADL_Overdrive6_PowerControl_Caps (data.hm_dll, data.hm_device[device_id].adapter_index, &powertune_supported)) != ADL_OK) + { + log_error ("ERROR: Failed to get ADL PowerControl Capabilities"); + + return (-1); + } + + if (powertune_supported != 0) + { + // powercontrol settings + + ADLOD6PowerControlInfo powertune = {0, 0, 0, 0, 0}; + + if ((ADL_rc = hc_ADL_Overdrive_PowerControlInfo_Get (data.hm_dll, data.hm_device[device_id].adapter_index, &powertune)) == ADL_OK) + { + ADL_rc = hc_ADL_Overdrive_PowerControl_Get (data.hm_dll, data.hm_device[device_id].adapter_index, &od_power_control_status[device_id]); + } + + if (ADL_rc != ADL_OK) + { + log_error ("ERROR: Failed to get current ADL PowerControl settings"); + + return (-1); + } + + if ((ADL_rc = hc_ADL_Overdrive_PowerControl_Set (data.hm_dll, data.hm_device[device_id].adapter_index, powertune.iMaxValue)) != ADL_OK) + { + log_error ("ERROR: Failed to set new ADL PowerControl values"); + + return (-1); + } + + // clocks + + memset (&od_clock_mem_status[device_id], 0, sizeof (ADLOD6MemClockState)); + + od_clock_mem_status[device_id].state.iNumberOfPerformanceLevels = 2; + + if ((ADL_rc = hc_ADL_Overdrive_StateInfo_Get (data.hm_dll, data.hm_device[device_id].adapter_index, ADL_OD6_GETSTATEINFO_CUSTOM_PERFORMANCE, &od_clock_mem_status[device_id])) != ADL_OK) + { + log_error ("ERROR: Failed to get ADL memory and engine clock frequency"); + + return (-1); + } + + // Query capabilities only to see if profiles were not "damaged", if so output a warning but do accept the users profile settings + + ADLOD6Capabilities caps = {0, 0, 0, {0, 0, 0}, {0, 0, 0}, 0, 0}; + + if ((ADL_rc = hc_ADL_Overdrive_Capabilities_Get (data.hm_dll, data.hm_device[device_id].adapter_index, &caps)) != ADL_OK) + { + log_error ("ERROR: Failed to get ADL device capabilities"); + + return (-1); + } + + int engine_clock_max = caps.sEngineClockRange.iMax * 0.6666; + int memory_clock_max = caps.sMemoryClockRange.iMax * 0.6250; + + int warning_trigger_engine = (int) (0.25 * (float) engine_clock_max); + int warning_trigger_memory = (int) (0.25 * (float) memory_clock_max); + + int engine_clock_profile_max = od_clock_mem_status[device_id].state.aLevels[1].iEngineClock; + int memory_clock_profile_max = od_clock_mem_status[device_id].state.aLevels[1].iMemoryClock; + + // warning if profile has to low max values + + if ((engine_clock_max - engine_clock_profile_max) > warning_trigger_engine) + { + log_info ("WARN: the custom profile seems to have too low maximum engine clock values. You therefore may not reach full performance"); + } + + if ((memory_clock_max - memory_clock_profile_max) > warning_trigger_memory) + { + log_info ("WARN: the custom profile seems to have too low maximum memory clock values. You therefore may not reach full performance"); + } + + ADLOD6StateInfo *performance_state = (ADLOD6StateInfo*) mycalloc (1, sizeof (ADLOD6StateInfo) + sizeof (ADLOD6PerformanceLevel)); + + performance_state->iNumberOfPerformanceLevels = 2; + + performance_state->aLevels[0].iEngineClock = engine_clock_profile_max; + performance_state->aLevels[1].iEngineClock = engine_clock_profile_max; + performance_state->aLevels[0].iMemoryClock = memory_clock_profile_max; + performance_state->aLevels[1].iMemoryClock = memory_clock_profile_max; + + if ((ADL_rc = hc_ADL_Overdrive_State_Set (data.hm_dll, data.hm_device[device_id].adapter_index, ADL_OD6_SETSTATE_PERFORMANCE, performance_state)) != ADL_OK) + { + log_info ("ERROR: Failed to set ADL performance state"); + + return (-1); + } + + local_free (performance_state); + } + } + + hc_thread_mutex_unlock (mux_adl); + } + } + + /* Temporary fix: + * with AMD r9 295x cards it seems that we need to set the powertune value just AFTER the ocl init stuff + * otherwise after hc_clCreateContext () etc, powertune value was set back to "normal" and cards unfortunately + * were not working @ full speed (setting hc_ADL_Overdrive_PowerControl_Set () here seems to fix the problem) + * Driver / ADL bug? + */ + + if (powertune_enable == 1) + { + hc_thread_mutex_lock (mux_adl); + + for (uint i = 0; i < devices_cnt; i++) + { + if (data.hm_device[i].od_version == 6) + { + // set powertune value only + + int powertune_supported = 0; + + int ADL_rc = 0; + + if ((ADL_rc = hc_ADL_Overdrive6_PowerControl_Caps (data.hm_dll, data.hm_device[i].adapter_index, &powertune_supported)) != ADL_OK) + { + log_error ("ERROR: Failed to get ADL PowerControl Capabilities"); + + return (-1); + } + + if (powertune_supported != 0) + { + // powertune set + ADLOD6PowerControlInfo powertune = {0, 0, 0, 0, 0}; + + if ((ADL_rc = hc_ADL_Overdrive_PowerControlInfo_Get (data.hm_dll, data.hm_device[i].adapter_index, &powertune)) != ADL_OK) + { + log_error ("ERROR: Failed to get current ADL PowerControl settings"); + + return (-1); + } + + if ((ADL_rc = hc_ADL_Overdrive_PowerControl_Set (data.hm_dll, data.hm_device[i].adapter_index, powertune.iMaxValue)) != ADL_OK) + { + log_error ("ERROR: Failed to set new ADL PowerControl values"); + + return (-1); + } + } + } + } + + hc_thread_mutex_unlock (mux_adl); + } + #endif + + data.gpu_blocks_all = gpu_blocks_all; + + #ifdef _OCL + if (gpu_async == 0) gpu_async = 1; // get rid of the warning + #endif + + if (data.quiet == 0) log_info (""); + + /** + * Inform user which algorithm is checked and at which workload setting + */ + + if (benchmark == 1) + { + quiet = 0; + + data.quiet = quiet; + + char *hash_type = strhashtype (data.hash_mode); // not a bug + + log_info ("Hashtype: %s", hash_type); + log_info ("Workload: %u loops, %u accel", gpu_loops, gpu_accel); + log_info (""); + } + + /** + * keep track of the progress + */ + + data.words_progress_done = (uint64_t *) mycalloc (data.salts_cnt, sizeof (uint64_t)); + data.words_progress_rejected = (uint64_t *) mycalloc (data.salts_cnt, sizeof (uint64_t)); + data.words_progress_restored = (uint64_t *) mycalloc (data.salts_cnt, sizeof (uint64_t)); + + /** + * open filehandles + */ + + #if _WIN + if (_setmode (_fileno (stdin), _O_BINARY) == -1) + { + log_error ("ERROR: %s: %s", "stdin", strerror (errno)); + + return (-1); + } + + if (_setmode (_fileno (stdout), _O_BINARY) == -1) + { + log_error ("ERROR: %s: %s", "stdout", strerror (errno)); + + return (-1); + } + + if (_setmode (_fileno (stderr), _O_BINARY) == -1) + { + log_error ("ERROR: %s: %s", "stderr", strerror (errno)); + + return (-1); + } + #endif + + /** + * dictionary pad + */ + + segment_size *= (1024 * 1024); + + data.segment_size = segment_size; + + wl_data_t *wl_data = (wl_data_t *) mymalloc (sizeof (wl_data_t)); + + wl_data->buf = (char *) mymalloc (segment_size); + wl_data->avail = segment_size; + wl_data->incr = segment_size; + wl_data->cnt = 0; + wl_data->pos = 0; + + uint wordlist_mode = ((optind + 1) < myargc) ? WL_MODE_FILE : WL_MODE_STDIN; + + data.wordlist_mode = wordlist_mode; + + cs_t *css_buf = NULL; + uint css_cnt = 0; + uint dictcnt = 0; + uint maskcnt = 1; + char **masks = NULL; + char **dictfiles = NULL; + + uint mask_from_file = 0; + + if (attack_mode == ATTACK_MODE_STRAIGHT) + { + if (wordlist_mode == WL_MODE_FILE) + { + int wls_left = myargc - (optind + 1); + + for (int i = 0; i < wls_left; i++) + { + char *l0_filename = myargv[optind + 1 + i]; + + struct stat l0_stat; + + if (stat (l0_filename, &l0_stat) == -1) + { + log_error ("ERROR: %s: %s", l0_filename, strerror (errno)); + + return (-1); + } + + uint is_dir = S_ISDIR (l0_stat.st_mode); + + if (is_dir == 0) + { + dictfiles = (char **) myrealloc (dictfiles, dictcnt * sizeof (char *), sizeof (char *)); + + dictcnt++; + + dictfiles[dictcnt - 1] = l0_filename; + } + else + { + // do not allow --keyspace w/ a directory + + if (keyspace == 1) + { + log_error ("ERROR: keyspace parameter is not allowed together with a directory"); + + return (-1); + } + + char **dictionary_files = NULL; + + dictionary_files = scan_directory (l0_filename); + + if (dictionary_files != NULL) + { + qsort (dictionary_files, count_dictionaries (dictionary_files), sizeof (char *), sort_by_stringptr); + + for (int d = 0; dictionary_files[d] != NULL; d++) + { + char *l1_filename = dictionary_files[d]; + + struct stat l1_stat; + + if (stat (l1_filename, &l1_stat) == -1) + { + log_error ("ERROR: %s: %s", l1_filename, strerror (errno)); + + return (-1); + } + + if (S_ISREG (l1_stat.st_mode)) + { + dictfiles = (char **) myrealloc (dictfiles, dictcnt * sizeof (char *), sizeof (char *)); + + dictcnt++; + + dictfiles[dictcnt - 1] = strdup (l1_filename); + } + } + } + + local_free (dictionary_files); + } + } + + if (dictcnt < 1) + { + log_error ("ERROR: No usable dictionary file found."); + + return (-1); + } + } + else if (wordlist_mode == WL_MODE_STDIN) + { + dictcnt = 1; + } + } + else if (attack_mode == ATTACK_MODE_COMBI) + { + // display + + char *dictfile1 = myargv[optind + 1 + 0]; + char *dictfile2 = myargv[optind + 1 + 1]; + + // find the bigger dictionary and use as base + + FILE *fp1; + FILE *fp2; + + struct stat tmp_stat; + + if ((fp1 = fopen (dictfile1, "rb")) == NULL) + { + log_error ("ERROR: %s: %s", dictfile1, strerror (errno)); + + return (-1); + } + + if (stat (dictfile1, &tmp_stat) == -1) + { + log_error ("ERROR: %s: %s", dictfile1, strerror (errno)); + + fclose (fp1); + + return (-1); + } + + if (S_ISDIR (tmp_stat.st_mode)) + { + log_error ("ERROR: %s must be a regular file", dictfile1, strerror (errno)); + + fclose (fp1); + + return (-1); + } + + if ((fp2 = fopen (dictfile2, "rb")) == NULL) + { + log_error ("ERROR: %s: %s", dictfile2, strerror (errno)); + + fclose (fp1); + + return (-1); + } + + if (stat (dictfile2, &tmp_stat) == -1) + { + log_error ("ERROR: %s: %s", dictfile2, strerror (errno)); + + fclose (fp1); + fclose (fp2); + + return (-1); + } + + if (S_ISDIR (tmp_stat.st_mode)) + { + log_error ("ERROR: %s must be a regular file", dictfile2, strerror (errno)); + + fclose (fp1); + fclose (fp2); + + return (-1); + } + + data.combs_cnt = 1; + + data.quiet = 1; + + const uint64_t words1_cnt = count_words (wl_data, fp1, dictfile1, dictstat_base, &dictstat_nmemb); + + data.quiet = quiet; + + if (words1_cnt == 0) + { + log_error ("ERROR: %s: empty file", dictfile1); + + fclose (fp1); + fclose (fp2); + + return (-1); + } + + data.combs_cnt = 1; + + data.quiet = 1; + + const uint64_t words2_cnt = count_words (wl_data, fp2, dictfile2, dictstat_base, &dictstat_nmemb); + + data.quiet = quiet; + + if (words2_cnt == 0) + { + log_error ("ERROR: %s: empty file", dictfile2); + + fclose (fp1); + fclose (fp2); + + return (-1); + } + + fclose (fp1); + fclose (fp2); + + data.dictfile = dictfile1; + data.dictfile2 = dictfile2; + + if (words1_cnt >= words2_cnt) + { + data.combs_cnt = words2_cnt; + data.combs_mode = COMBINATOR_MODE_BASE_LEFT; + + dictfiles = &data.dictfile; + + dictcnt = 1; + } + else + { + data.combs_cnt = words1_cnt; + data.combs_mode = COMBINATOR_MODE_BASE_RIGHT; + + dictfiles = &data.dictfile2; + + dictcnt = 1; + + // we also have to switch wordlist related rules! + + char *tmpc = data.rule_buf_l; + + data.rule_buf_l = data.rule_buf_r; + data.rule_buf_r = tmpc; + + int tmpi = data.rule_len_l; + + data.rule_len_l = data.rule_len_r; + data.rule_len_r = tmpi; + } + } + else if (attack_mode == ATTACK_MODE_BF) + { + char *mask = NULL; + + maskcnt = 0; + + if (benchmark == 0) + { + mask = myargv[optind + 1]; + + masks = (char **) mymalloc (INCR_MASKS * sizeof (char *)); + + if ((optind + 2) <= myargc) + { + struct stat file_stat; + + if (stat (mask, &file_stat) == -1) + { + maskcnt = 1; + + masks[maskcnt - 1] = mystrdup (mask); + } + else + { + int wls_left = myargc - (optind + 1); + + uint masks_avail = INCR_MASKS; + + for (int i = 0; i < wls_left; i++) + { + if (i != 0) + { + mask = myargv[optind + 1 + i]; + + if (stat (mask, &file_stat) == -1) + { + log_error ("ERROR: %s: %s", mask, strerror (errno)); + + return (-1); + } + } + + uint is_file = S_ISREG (file_stat.st_mode); + + if (is_file == 1) + { + FILE *mask_fp; + + if ((mask_fp = fopen (mask, "r")) == NULL) + { + log_error ("ERROR: %s: %s", mask, strerror (errno)); + + return (-1); + } + + char line_buf[BUFSIZ]; + + while (!feof (mask_fp)) + { + memset (line_buf, 0, BUFSIZ); + + int line_len = fgetl (mask_fp, line_buf); + + if (line_len == 0) continue; + + if (line_buf[0] == '#') continue; + + if (masks_avail == maskcnt) + { + masks = (char **) myrealloc (masks, masks_avail * sizeof (char *), INCR_MASKS * sizeof (char *)); + + masks_avail += INCR_MASKS; + } + + masks[maskcnt] = mystrdup (line_buf); + + maskcnt++; + } + + fclose (mask_fp); + } + else + { + log_error ("ERROR: %s: unsupported file-type", mask); + + return (-1); + } + } + + mask_from_file = 1; + } + } + else + { + custom_charset_1 = (char *) "?l?d?u"; + custom_charset_2 = (char *) "?l?d"; + custom_charset_3 = (char *) "?l?d*!$@_"; + + mp_setup_usr (mp_sys, mp_usr, custom_charset_1, 0); + mp_setup_usr (mp_sys, mp_usr, custom_charset_2, 1); + mp_setup_usr (mp_sys, mp_usr, custom_charset_3, 2); + + masks[maskcnt] = mystrdup ("?1?2?2?2?2?2?2?3?3?3?3?d?d?d?d"); + + wordlist_mode = WL_MODE_MASK; + + data.wordlist_mode = wordlist_mode; + + increment = 1; + + maskcnt = 1; + } + } + else + { + /** + * generate full masks and charsets + */ + + masks = (char **) mymalloc (sizeof (char *)); + + switch (hash_mode) + { + case 1731: pw_min = 5; + pw_max = 5; + mask = mystrdup ("?b?b?b?b?b"); + break; + case 12500: pw_min = 5; + pw_max = 5; + mask = mystrdup ("?b?b?b?b?b"); + break; + default: pw_min = 7; + pw_max = 7; + mask = mystrdup ("?b?b?b?b?b?b?b"); + break; + } + + maskcnt = 1; + + masks[maskcnt - 1] = mystrdup (mask); + + wordlist_mode = WL_MODE_MASK; + + data.wordlist_mode = wordlist_mode; + + increment = 1; + } + + dictfiles = (char **) mycalloc (pw_max, sizeof (char *)); + + if (increment) + { + if (increment_min > pw_min) pw_min = increment_min; + + if (increment_max < pw_max) pw_max = increment_max; + } + } + else if (attack_mode == ATTACK_MODE_HYBRID1) + { + data.combs_mode = COMBINATOR_MODE_BASE_LEFT; + + // display + + char *mask = myargv[myargc - 1]; + + maskcnt = 0; + + masks = (char **) mymalloc (1 * sizeof (char *)); + + // mod + + struct stat file_stat; + + if (stat (mask, &file_stat) == -1) + { + maskcnt = 1; + + masks[maskcnt - 1] = mystrdup (mask); + } + else + { + uint is_file = S_ISREG (file_stat.st_mode); + + if (is_file == 1) + { + FILE *mask_fp; + + if ((mask_fp = fopen (mask, "r")) == NULL) + { + log_error ("ERROR: %s: %s", mask, strerror (errno)); + + return (-1); + } + + char line_buf[BUFSIZ]; + + uint masks_avail = 1; + + while (!feof (mask_fp)) + { + memset (line_buf, 0, BUFSIZ); + + int line_len = fgetl (mask_fp, line_buf); + + if (line_len == 0) continue; + + if (line_buf[0] == '#') continue; + + if (masks_avail == maskcnt) + { + masks = (char **) myrealloc (masks, masks_avail * sizeof (char *), INCR_MASKS * sizeof (char *)); + + masks_avail += INCR_MASKS; + } + + masks[maskcnt] = mystrdup (line_buf); + + maskcnt++; + } + + fclose (mask_fp); + + mask_from_file = 1; + } + else + { + maskcnt = 1; + + masks[maskcnt - 1] = mystrdup (mask); + } + } + + // base + + int wls_left = myargc - (optind + 2); + + for (int i = 0; i < wls_left; i++) + { + char *filename = myargv[optind + 1 + i]; + + struct stat file_stat; + + if (stat (filename, &file_stat) == -1) + { + log_error ("ERROR: %s: %s", filename, strerror (errno)); + + return (-1); + } + + uint is_dir = S_ISDIR (file_stat.st_mode); + + if (is_dir == 0) + { + dictfiles = (char **) myrealloc (dictfiles, dictcnt * sizeof (char *), sizeof (char *)); + + dictcnt++; + + dictfiles[dictcnt - 1] = filename; + } + else + { + // do not allow --keyspace w/ a directory + + if (keyspace == 1) + { + log_error ("ERROR: keyspace parameter is not allowed together with a directory"); + + return (-1); + } + + char **dictionary_files = NULL; + + dictionary_files = scan_directory (filename); + + if (dictionary_files != NULL) + { + qsort (dictionary_files, count_dictionaries (dictionary_files), sizeof (char *), sort_by_stringptr); + + for (int d = 0; dictionary_files[d] != NULL; d++) + { + char *l1_filename = dictionary_files[d]; + + struct stat l1_stat; + + if (stat (l1_filename, &l1_stat) == -1) + { + log_error ("ERROR: %s: %s", l1_filename, strerror (errno)); + + return (-1); + } + + if (S_ISREG (l1_stat.st_mode)) + { + dictfiles = (char **) myrealloc (dictfiles, dictcnt * sizeof (char *), sizeof (char *)); + + dictcnt++; + + dictfiles[dictcnt - 1] = strdup (l1_filename); + } + } + } + + local_free (dictionary_files); + } + } + + if (dictcnt < 1) + { + log_error ("ERROR: No usable dictionary file found."); + + return (-1); + } + + if (increment) + { + maskcnt = 0; + + uint mask_min = increment_min; // we can't reject smaller masks here + uint mask_max = (increment_max < pw_max) ? increment_max : pw_max; + + for (uint mask_cur = mask_min; mask_cur <= mask_max; mask_cur++) + { + char *cur_mask = mp_get_truncated_mask (mask, strlen (mask), mask_cur); + + if (cur_mask == NULL) break; + + masks[maskcnt] = cur_mask; + + maskcnt++; + + masks = (char **) myrealloc (masks, maskcnt * sizeof (char *), sizeof (char *)); + } + } + } + else if (attack_mode == ATTACK_MODE_HYBRID2) + { + data.combs_mode = COMBINATOR_MODE_BASE_RIGHT; + + // display + + char *mask = myargv[optind + 1 + 0]; + + maskcnt = 0; + + masks = (char **) mymalloc (1 * sizeof (char *)); + + // mod + + struct stat file_stat; + + if (stat (mask, &file_stat) == -1) + { + maskcnt = 1; + + masks[maskcnt - 1] = mystrdup (mask); + } + else + { + uint is_file = S_ISREG (file_stat.st_mode); + + if (is_file == 1) + { + FILE *mask_fp; + + if ((mask_fp = fopen (mask, "r")) == NULL) + { + log_error ("ERROR: %s: %s", mask, strerror (errno)); + + return (-1); + } + + char line_buf[BUFSIZ]; + + uint masks_avail = 1; + + while (!feof (mask_fp)) + { + memset (line_buf, 0, BUFSIZ); + + int line_len = fgetl (mask_fp, line_buf); + + if (line_len == 0) continue; + + if (line_buf[0] == '#') continue; + + if (masks_avail == maskcnt) + { + masks = (char **) myrealloc (masks, masks_avail * sizeof (char *), INCR_MASKS * sizeof (char *)); + + masks_avail += INCR_MASKS; + } + + masks[maskcnt] = mystrdup (line_buf); + + maskcnt++; + } + + fclose (mask_fp); + + mask_from_file = 1; + } + else + { + maskcnt = 1; + + masks[maskcnt - 1] = mystrdup (mask); + } + } + + // base + + int wls_left = myargc - (optind + 2); + + for (int i = 0; i < wls_left; i++) + { + char *filename = myargv[optind + 2 + i]; + + struct stat file_stat; + + if (stat (filename, &file_stat) == -1) + { + log_error ("ERROR: %s: %s", filename, strerror (errno)); + + return (-1); + } + + uint is_dir = S_ISDIR (file_stat.st_mode); + + if (is_dir == 0) + { + dictfiles = (char **) myrealloc (dictfiles, dictcnt * sizeof (char *), sizeof (char *)); + + dictcnt++; + + dictfiles[dictcnt - 1] = filename; + } + else + { + // do not allow --keyspace w/ a directory + + if (keyspace == 1) + { + log_error ("ERROR: keyspace parameter is not allowed together with a directory"); + + return (-1); + } + + char **dictionary_files = NULL; + + dictionary_files = scan_directory (filename); + + if (dictionary_files != NULL) + { + qsort (dictionary_files, count_dictionaries (dictionary_files), sizeof (char *), sort_by_stringptr); + + for (int d = 0; dictionary_files[d] != NULL; d++) + { + char *l1_filename = dictionary_files[d]; + + struct stat l1_stat; + + if (stat (l1_filename, &l1_stat) == -1) + { + log_error ("ERROR: %s: %s", l1_filename, strerror (errno)); + + return (-1); + } + + if (S_ISREG (l1_stat.st_mode)) + { + dictfiles = (char **) myrealloc (dictfiles, dictcnt * sizeof (char *), sizeof (char *)); + + dictcnt++; + + dictfiles[dictcnt - 1] = strdup (l1_filename); + } + } + } + + local_free (dictionary_files); + } + } + + if (dictcnt < 1) + { + log_error ("ERROR: No usable dictionary file found."); + + return (-1); + } + + if (increment) + { + maskcnt = 0; + + uint mask_min = increment_min; // we can't reject smaller masks here + uint mask_max = (increment_max < pw_max) ? increment_max : pw_max; + + for (uint mask_cur = mask_min; mask_cur <= mask_max; mask_cur++) + { + char *cur_mask = mp_get_truncated_mask (mask, strlen (mask), mask_cur); + + if (cur_mask == NULL) break; + + masks[maskcnt] = cur_mask; + + maskcnt++; + + masks = (char **) myrealloc (masks, maskcnt * sizeof (char *), sizeof (char *)); + } + } + } + + data.pw_min = pw_min; + data.pw_max = pw_max; + + /** + * weak hash check + */ + + if (weak_hash_threshold >= salts_cnt) + { + if (data.quiet == 0) log_info_nn ("Checking for weak hashes..."); + + for (uint salt_pos = 0; salt_pos < salts_cnt; salt_pos++) + { + weak_hash_check (&data.devices_param[0], salt_pos, gpu_loops); + } + } + + // Display hack, guarantee that there is at least one \r before real start + + if (data.quiet == 0) log_info_nn (""); + + /** + * status and monitor threads + */ + + if (data.devices_status != STATUS_CRACKED) data.devices_status = STATUS_STARTING; + + hc_thread_t i_thread = 0; + + if ((data.wordlist_mode == WL_MODE_FILE) || (data.wordlist_mode == WL_MODE_MASK)) + { + hc_thread_create (i_thread, thread_keypress, &benchmark); + } + + if (wordlist_mode == WL_MODE_STDIN) data.status = 1; + + uint ni_threads_cnt = 0; + + hc_thread_t *ni_threads = (hc_thread_t *) mycalloc (10, sizeof (hc_thread_t)); + + hc_thread_create (ni_threads[ni_threads_cnt], thread_monitor, NULL); + + ni_threads_cnt++; + + /** + * Outfile remove + */ + + if (keyspace == 0) + { + if (outfile_check_timer != 0) + { + if (data.outfile_check_directory != NULL) + { + if ((hash_mode != 5200) && + !((hash_mode >= 6200) && (hash_mode <= 6299)) && + (hash_mode != 9000)) + { + hc_thread_create (ni_threads[ni_threads_cnt], thread_outfile_remove, NULL); + + ni_threads_cnt++; + } + else + { + outfile_check_timer = 0; + } + } + else + { + outfile_check_timer = 0; + } + } + } + + /** + * Inform the user if we got some hashes remove because of the pot file remove feature + */ + + if (data.quiet == 0) + { + if (potfile_remove_cracks > 0) + { + if (potfile_remove_cracks == 1) log_info ("INFO: removed 1 hash found in pot file\n"); + else log_info ("INFO: removed %u hashes found in pot file\n", potfile_remove_cracks); + } + } + + data.outfile_check_timer = outfile_check_timer; + + /** + * main loop + */ + + char **induction_dictionaries = NULL; + + int induction_dictionaries_cnt = 0; + + hcstat_table_t *root_table_buf = NULL; + hcstat_table_t *markov_table_buf = NULL; + + uint initial_restore_done = 0; + + data.maskcnt = maskcnt; + + for (uint maskpos = rd->maskpos; maskpos < maskcnt; maskpos++) + { + if (data.devices_status == STATUS_CRACKED) break; + + data.devices_status = STATUS_INIT; + + if (maskpos > rd->maskpos) + { + rd->dictpos = 0; + } + + rd->maskpos = maskpos; + data.maskpos = maskpos; + + if (attack_mode == ATTACK_MODE_HYBRID1 || attack_mode == ATTACK_MODE_HYBRID2 || attack_mode == ATTACK_MODE_BF) + { + char *mask = masks[maskpos]; + + if (mask_from_file == 1) + { + if (mask[0] == '\\' && mask[1] == '#') mask++; // escaped comment sign (sharp) "\#" + + char *str_ptr; + uint str_pos; + + uint mask_offset = 0; + + uint separator_cnt; + + for (separator_cnt = 0; separator_cnt < 4; separator_cnt++) + { + str_ptr = strstr (mask + mask_offset, ","); + + if (str_ptr == NULL) break; + + str_pos = str_ptr - mask; + + // escaped separator, i.e. "\," + + if (str_pos > 0) + { + if (mask[str_pos - 1] == '\\') + { + separator_cnt --; + + mask_offset = str_pos + 1; + + continue; + } + } + + // reset the offset + + mask_offset = 0; + + mask[str_pos] = '\0'; + + switch (separator_cnt) + { + case 0: + mp_reset_usr (mp_usr, 0); + + custom_charset_1 = mask; + mp_setup_usr (mp_sys, mp_usr, custom_charset_1, 0); + break; + + case 1: + mp_reset_usr (mp_usr, 1); + + custom_charset_2 = mask; + mp_setup_usr (mp_sys, mp_usr, custom_charset_2, 1); + break; + + case 2: + mp_reset_usr (mp_usr, 2); + + custom_charset_3 = mask; + mp_setup_usr (mp_sys, mp_usr, custom_charset_3, 2); + break; + + case 3: + mp_reset_usr (mp_usr, 3); + + custom_charset_4 = mask; + mp_setup_usr (mp_sys, mp_usr, custom_charset_4, 3); + break; + } + + mask = mask + str_pos + 1; + } + } + + if ((attack_mode == ATTACK_MODE_HYBRID1) || (attack_mode == ATTACK_MODE_HYBRID2)) + { + if (maskpos > 0) + { + local_free (css_buf); + local_free (data.root_css_buf); + local_free (data.markov_css_buf); + + local_free (masks[maskpos - 1]); + } + + css_buf = mp_gen_css (mask, strlen (mask), mp_sys, mp_usr, &css_cnt); + + data.mask = mask; + data.css_cnt = css_cnt; + data.css_buf = css_buf; + + uint uniq_tbls[SP_PW_MAX][CHARSIZ]; + + memset (uniq_tbls, 0, sizeof (uniq_tbls)); + + mp_css_to_uniq_tbl (css_cnt, css_buf, uniq_tbls); + + if (root_table_buf == NULL) root_table_buf = (hcstat_table_t *) mycalloc (SP_ROOT_CNT, sizeof (hcstat_table_t)); + if (markov_table_buf == NULL) markov_table_buf = (hcstat_table_t *) mycalloc (SP_MARKOV_CNT, sizeof (hcstat_table_t)); + + sp_setup_tbl (install_dir, markov_hcstat, markov_disable, markov_classic, root_table_buf, markov_table_buf); + + markov_threshold = (markov_threshold != 0) ? markov_threshold : CHARSIZ; + + cs_t *root_css_buf = (cs_t *) mycalloc (SP_PW_MAX, sizeof (cs_t)); + cs_t *markov_css_buf = (cs_t *) mycalloc (SP_PW_MAX * CHARSIZ, sizeof (cs_t)); + + data.root_css_buf = root_css_buf; + data.markov_css_buf = markov_css_buf; + + sp_tbl_to_css (root_table_buf, markov_table_buf, root_css_buf, markov_css_buf, markov_threshold, uniq_tbls); + + data.combs_cnt = sp_get_sum (0, css_cnt, root_css_buf); + + local_free (root_table_buf); + local_free (markov_table_buf); + + // args + + for (uint device_id = 0; device_id < devices_cnt; device_id++) + { + hc_device_param_t *device_param = &data.devices_param[device_id]; + + device_param->kernel_params_mp[0] = &device_param->d_combs; + device_param->kernel_params_mp[1] = &device_param->d_root_css_buf; + device_param->kernel_params_mp[2] = &device_param->d_markov_css_buf; + + device_param->kernel_params_mp_buf64[3] = 0; + device_param->kernel_params_mp_buf32[4] = css_cnt; + device_param->kernel_params_mp_buf32[5] = 0; + device_param->kernel_params_mp_buf32[6] = 0; + device_param->kernel_params_mp_buf32[7] = 0; + + if (attack_mode == ATTACK_MODE_HYBRID1) + { + if (opts_type & OPTS_TYPE_PT_ADD01) device_param->kernel_params_mp_buf32[5] = full01; + if (opts_type & OPTS_TYPE_PT_ADD80) device_param->kernel_params_mp_buf32[5] = full80; + if (opts_type & OPTS_TYPE_PT_ADDBITS14) device_param->kernel_params_mp_buf32[6] = 1; + if (opts_type & OPTS_TYPE_PT_ADDBITS15) device_param->kernel_params_mp_buf32[7] = 1; + } + else if (attack_mode == ATTACK_MODE_HYBRID2) + { + device_param->kernel_params_mp_buf32[5] = 0; + device_param->kernel_params_mp_buf32[6] = 0; + device_param->kernel_params_mp_buf32[7] = 0; + } + + #ifdef _CUDA + hc_cuCtxPushCurrent (device_param->context); + + hc_cuMemcpyHtoD (device_param->d_root_css_buf, root_css_buf, device_param->size_root_css); + hc_cuMemcpyHtoD (device_param->d_markov_css_buf, markov_css_buf, device_param->size_markov_css); + + hc_cuCtxPopCurrent (&device_param->context); + #elif _OCL + for (uint i = 0; i < 3; i++) hc_clSetKernelArg (device_param->kernel_mp, i, sizeof (cl_mem), (void *) device_param->kernel_params_mp[i]); + for (uint i = 3; i < 4; i++) hc_clSetKernelArg (device_param->kernel_mp, i, sizeof (cl_ulong), (void *) device_param->kernel_params_mp[i]); + for (uint i = 4; i < 8; i++) hc_clSetKernelArg (device_param->kernel_mp, i, sizeof (cl_uint), (void *) device_param->kernel_params_mp[i]); + + hc_clEnqueueWriteBuffer (device_param->command_queue, device_param->d_root_css_buf, CL_TRUE, 0, device_param->size_root_css, root_css_buf, 0, NULL, NULL); + hc_clEnqueueWriteBuffer (device_param->command_queue, device_param->d_markov_css_buf, CL_TRUE, 0, device_param->size_markov_css, markov_css_buf, 0, NULL, NULL); + #endif + } + } + else if (attack_mode == ATTACK_MODE_BF) + { + dictcnt = 0; // number of "sub-masks", i.e. when using incremental mode + + if (increment) + { + for (uint i = 0; i < dictcnt; i++) + { + local_free (dictfiles[i]); + } + + for (uint pw_len = MAX (1, pw_min); pw_len <= pw_max; pw_len++) + { + char *l1_filename = mp_get_truncated_mask (mask, strlen (mask), pw_len); + + if (l1_filename == NULL) break; + + dictcnt++; + + dictfiles[dictcnt - 1] = l1_filename; + } + } + else + { + dictcnt++; + + dictfiles[dictcnt - 1] = mask; + } + + if (dictcnt == 0) + { + log_error ("ERROR: Mask is too small"); + + return (-1); + } + } + } + + free (induction_dictionaries); + + // induction_dictionaries_cnt = 0; // implied + + if (attack_mode != ATTACK_MODE_BF) + { + if (keyspace == 0) + { + induction_dictionaries = scan_directory (induction_directory); + + induction_dictionaries_cnt = count_dictionaries (induction_dictionaries); + } + } + + if (induction_dictionaries_cnt) + { + qsort (induction_dictionaries, induction_dictionaries_cnt, sizeof (char *), sort_by_mtime); + } + + /** + * prevent the user from using --keyspace together w/ maskfile and or dictfile + */ + if (keyspace == 1) + { + if ((maskcnt > 1) || (dictcnt > 1)) + { + log_error ("ERROR: --keyspace is not supported with --increment or mask files"); + + return (-1); + } + } + + for (uint dictpos = rd->dictpos; dictpos < dictcnt; ) + { + char *subid = logfile_generate_subid (); + + data.subid = subid; + + logfile_sub_msg ("START"); + + data.devices_status = STATUS_INIT; + + memset (data.words_progress_done, 0, data.salts_cnt * sizeof (uint64_t)); + memset (data.words_progress_rejected, 0, data.salts_cnt * sizeof (uint64_t)); + memset (data.words_progress_restored, 0, data.salts_cnt * sizeof (uint64_t)); + + memset (data.cpt_buf, 0, CPT_BUF * sizeof (cpt_t)); + + data.cpt_pos = 0; + + data.cpt_start = time (NULL); + + data.cpt_total = 0; + + if (data.restore == 0) + { + rd->words_cur = skip; + + skip = 0; + + data.skip = 0; + } + + data.ms_paused = 0; + + data.words_cur = rd->words_cur; + + for (uint device_id = 0; device_id < data.devices_cnt; device_id++) + { + hc_device_param_t *device_param = &data.devices_param[device_id]; + + device_param->speed_pos = 0; + + memset (device_param->speed_cnt, 0, SPEED_CACHE * sizeof (uint64_t)); + memset (device_param->speed_ms, 0, SPEED_CACHE * sizeof (float)); + memset (device_param->speed_rec, 0, SPEED_CACHE * sizeof (hc_timer_t)); + + device_param->gpu_power = device_param->gpu_power_user; + device_param->gpu_blocks = device_param->gpu_blocks_user; + + device_param->outerloop_pos = 0; + device_param->outerloop_left = 0; + device_param->innerloop_pos = 0; + device_param->innerloop_left = 0; + + // some more resets: + + memset (device_param->pw_caches, 0, 64 * sizeof (pw_cache_t)); + + memset (device_param->pws_buf, 0, device_param->size_pws); + + device_param->pw_cnt = 0; + device_param->pws_cnt = 0; + + device_param->words_off = 0; + device_param->words_done = 0; + } + + data.gpu_blocks_div = 0; + + // figure out some workload + + if (attack_mode == ATTACK_MODE_STRAIGHT) + { + if (data.wordlist_mode == WL_MODE_FILE) + { + char *dictfile = NULL; + + if (induction_dictionaries_cnt) + { + dictfile = induction_dictionaries[0]; + } + else + { + dictfile = dictfiles[dictpos]; + } + + data.dictfile = dictfile; + + logfile_sub_string (dictfile); + + for (uint i = 0; i < rp_files_cnt; i++) + { + logfile_sub_var_string ("rulefile", rp_files[i]); + } + + FILE *fd2 = fopen (dictfile, "rb"); + + if (fd2 == NULL) + { + log_error ("ERROR: %s: %s", dictfile, strerror (errno)); + + return (-1); + } + + data.words_cnt = count_words (wl_data, fd2, dictfile, dictstat_base, &dictstat_nmemb); + + fclose (fd2); + + if (data.words_cnt == 0) + { + if (data.devices_status == STATUS_CRACKED) break; + if (data.devices_status == STATUS_ABORTED) break; + + dictpos++; + + continue; + } + } + } + else if (attack_mode == ATTACK_MODE_COMBI) + { + char *dictfile = data.dictfile; + char *dictfile2 = data.dictfile2; + + logfile_sub_string (dictfile); + logfile_sub_string (dictfile2); + + if (data.combs_mode == COMBINATOR_MODE_BASE_LEFT) + { + FILE *fd2 = fopen (dictfile, "rb"); + + if (fd2 == NULL) + { + log_error ("ERROR: %s: %s", dictfile, strerror (errno)); + + return (-1); + } + + data.words_cnt = count_words (wl_data, fd2, dictfile, dictstat_base, &dictstat_nmemb); + + fclose (fd2); + } + else if (data.combs_mode == COMBINATOR_MODE_BASE_RIGHT) + { + FILE *fd2 = fopen (dictfile2, "rb"); + + if (fd2 == NULL) + { + log_error ("ERROR: %s: %s", dictfile2, strerror (errno)); + + return (-1); + } + + data.words_cnt = count_words (wl_data, fd2, dictfile2, dictstat_base, &dictstat_nmemb); + + fclose (fd2); + } + + if (data.words_cnt == 0) + { + if (data.devices_status == STATUS_CRACKED) break; + if (data.devices_status == STATUS_ABORTED) break; + + dictpos++; + + continue; + } + } + else if ((attack_mode == ATTACK_MODE_HYBRID1) || (attack_mode == ATTACK_MODE_HYBRID2)) + { + char *dictfile = NULL; + + if (induction_dictionaries_cnt) + { + dictfile = induction_dictionaries[0]; + } + else + { + dictfile = dictfiles[dictpos]; + } + + data.dictfile = dictfile; + + char *mask = data.mask; + + logfile_sub_string (dictfile); + logfile_sub_string (mask); + + FILE *fd2 = fopen (dictfile, "rb"); + + if (fd2 == NULL) + { + log_error ("ERROR: %s: %s", dictfile, strerror (errno)); + + return (-1); + } + + data.words_cnt = count_words (wl_data, fd2, dictfile, dictstat_base, &dictstat_nmemb); + + fclose (fd2); + + if (data.words_cnt == 0) + { + if (data.devices_status == STATUS_CRACKED) break; + if (data.devices_status == STATUS_ABORTED) break; + + dictpos++; + + continue; + } + } + else if (attack_mode == ATTACK_MODE_BF) + { + local_free (css_buf); + local_free (data.root_css_buf); + local_free (data.markov_css_buf); + + char *mask = dictfiles[dictpos]; + + logfile_sub_string (mask); + + // base + + css_buf = mp_gen_css (mask, strlen (mask), mp_sys, mp_usr, &css_cnt); + + if (opts_type & OPTS_TYPE_PT_UNICODE) + { + uint css_cnt_unicode = css_cnt * 2; + + cs_t *css_buf_unicode = (cs_t *) mycalloc (css_cnt_unicode, sizeof (cs_t)); + + for (uint i = 0, j = 0; i < css_cnt; i += 1, j += 2) + { + memcpy (&css_buf_unicode[j + 0], &css_buf[i], sizeof (cs_t)); + + css_buf_unicode[j + 1].cs_buf[0] = 0; + css_buf_unicode[j + 1].cs_len = 1; + } + + free (css_buf); + + css_buf = css_buf_unicode; + css_cnt = css_cnt_unicode; + } + + // check if mask is not too large or too small for pw_min/pw_max (*2 if unicode) + + uint mask_min = pw_min; + uint mask_max = pw_max; + + if (opts_type & OPTS_TYPE_PT_UNICODE) + { + mask_min *= 2; + mask_max *= 2; + } + + if ((css_cnt < mask_min) || (css_cnt > mask_max)) + { + if (css_cnt < mask_min) + { + log_info ("WARNING: skipping mask '%s' because it is smaller than the minimum password length", mask); + } + + if (css_cnt > mask_max) + { + log_info ("WARNING: skipping mask '%s' because it is larger than the maximum password length", mask); + } + + // skip to next mask + + dictpos++; + + rd->dictpos = dictpos; + + logfile_sub_msg ("STOP"); + + continue; + } + + uint save_css_cnt = css_cnt; + + if (opti_type & OPTI_TYPE_SINGLE_HASH) + { + if (opti_type & OPTI_TYPE_APPENDED_SALT) + { + uint salt_len = (uint) data.salts_buf[0].salt_len; + char *salt_buf = (char *) data.salts_buf[0].salt_buf; + + uint css_cnt_salt = css_cnt + salt_len; + + cs_t *css_buf_salt = (cs_t *) mycalloc (css_cnt_salt, sizeof (cs_t)); + + memcpy (css_buf_salt, css_buf, css_cnt * sizeof (cs_t)); + + for (uint i = 0, j = css_cnt; i < salt_len; i++, j++) + { + css_buf_salt[j].cs_buf[0] = salt_buf[i]; + css_buf_salt[j].cs_len = 1; + } + + free (css_buf); + + css_buf = css_buf_salt; + css_cnt = css_cnt_salt; + } + } + + data.mask = mask; + data.css_cnt = css_cnt; + data.css_buf = css_buf; + + if (maskpos > 0 && dictpos == 0) free (masks[maskpos - 1]); + + uint uniq_tbls[SP_PW_MAX][CHARSIZ]; + + memset (uniq_tbls, 0, sizeof (uniq_tbls)); + + mp_css_to_uniq_tbl (css_cnt, css_buf, uniq_tbls); + + if (root_table_buf == NULL) root_table_buf = (hcstat_table_t *) mycalloc (SP_ROOT_CNT, sizeof (hcstat_table_t)); + if (markov_table_buf == NULL) markov_table_buf = (hcstat_table_t *) mycalloc (SP_MARKOV_CNT, sizeof (hcstat_table_t)); + + sp_setup_tbl (install_dir, markov_hcstat, markov_disable, markov_classic, root_table_buf, markov_table_buf); + + markov_threshold = (markov_threshold != 0) ? markov_threshold : CHARSIZ; + + cs_t *root_css_buf = (cs_t *) mycalloc (SP_PW_MAX, sizeof (cs_t)); + cs_t *markov_css_buf = (cs_t *) mycalloc (SP_PW_MAX * CHARSIZ, sizeof (cs_t)); + + data.root_css_buf = root_css_buf; + data.markov_css_buf = markov_css_buf; + + sp_tbl_to_css (root_table_buf, markov_table_buf, root_css_buf, markov_css_buf, markov_threshold, uniq_tbls); + + data.words_cnt = sp_get_sum (0, css_cnt, root_css_buf); + + local_free (root_table_buf); + local_free (markov_table_buf); + + // copy + args + + uint css_cnt_l = css_cnt; + uint css_cnt_r; + + if (attack_exec == ATTACK_EXEC_ON_GPU) + { + if (save_css_cnt < 6) + { + css_cnt_r = 1; + } + else if (save_css_cnt == 6) + { + css_cnt_r = 2; + } + else + { + if (opts_type & OPTS_TYPE_PT_UNICODE) + { + if (save_css_cnt == 8 || save_css_cnt == 10) + { + css_cnt_r = 2; + } + else + { + css_cnt_r = 4; + } + } + else + { + if ((css_buf[0].cs_len * css_buf[1].cs_len * css_buf[2].cs_len) > 256) + { + css_cnt_r = 3; + } + else + { + css_cnt_r = 4; + } + } + } + } + else + { + css_cnt_r = 1; + + /* unfinished code? + int sum = css_buf[css_cnt_r - 1].cs_len; + + for (uint i = 1; i < 4 && i < css_cnt; i++) + { + if (sum > 1) break; // we really don't need alot of amplifier them for slow hashes + + css_cnt_r++; + + sum *= css_buf[css_cnt_r - 1].cs_len; + } + */ + } + + css_cnt_l -= css_cnt_r; + + data.bfs_cnt = sp_get_sum (0, css_cnt_r, root_css_buf); + + for (uint device_id = 0; device_id < devices_cnt; device_id++) + { + hc_device_param_t *device_param = &data.devices_param[device_id]; + + device_param->kernel_params_mp_l[0] = &device_param->d_pws_buf; + device_param->kernel_params_mp_l[1] = &device_param->d_root_css_buf; + device_param->kernel_params_mp_l[2] = &device_param->d_markov_css_buf; + + device_param->kernel_params_mp_l_buf64[3] = 0; + device_param->kernel_params_mp_l_buf32[4] = css_cnt_l; + device_param->kernel_params_mp_l_buf32[5] = css_cnt_r; + device_param->kernel_params_mp_l_buf32[6] = 0; + device_param->kernel_params_mp_l_buf32[7] = 0; + device_param->kernel_params_mp_l_buf32[8] = 0; + + if (opts_type & OPTS_TYPE_PT_ADD01) device_param->kernel_params_mp_l_buf32[6] = full01; + if (opts_type & OPTS_TYPE_PT_ADD80) device_param->kernel_params_mp_l_buf32[6] = full80; + if (opts_type & OPTS_TYPE_PT_ADDBITS14) device_param->kernel_params_mp_l_buf32[7] = 1; + if (opts_type & OPTS_TYPE_PT_ADDBITS15) device_param->kernel_params_mp_l_buf32[8] = 1; + + device_param->kernel_params_mp_r[0] = &device_param->d_bfs; + device_param->kernel_params_mp_r[1] = &device_param->d_root_css_buf; + device_param->kernel_params_mp_r[2] = &device_param->d_markov_css_buf; + + device_param->kernel_params_mp_r_buf64[3] = 0; + device_param->kernel_params_mp_r_buf32[4] = css_cnt_r; + device_param->kernel_params_mp_r_buf32[5] = 0; + device_param->kernel_params_mp_r_buf32[6] = 0; + device_param->kernel_params_mp_r_buf32[7] = 0; + + #ifdef _CUDA + hc_cuCtxPushCurrent (device_param->context); + + hc_cuMemcpyHtoD (device_param->d_root_css_buf, root_css_buf, device_param->size_root_css); + hc_cuMemcpyHtoD (device_param->d_markov_css_buf, markov_css_buf, device_param->size_markov_css); + + hc_cuCtxPopCurrent (&device_param->context); + #elif _OCL + for (uint i = 0; i < 3; i++) hc_clSetKernelArg (device_param->kernel_mp_l, i, sizeof (cl_mem), (void *) device_param->kernel_params_mp_l[i]); + for (uint i = 3; i < 4; i++) hc_clSetKernelArg (device_param->kernel_mp_l, i, sizeof (cl_ulong), (void *) device_param->kernel_params_mp_l[i]); + for (uint i = 4; i < 9; i++) hc_clSetKernelArg (device_param->kernel_mp_l, i, sizeof (cl_uint), (void *) device_param->kernel_params_mp_l[i]); + + for (uint i = 0; i < 3; i++) hc_clSetKernelArg (device_param->kernel_mp_r, i, sizeof (cl_mem), (void *) device_param->kernel_params_mp_r[i]); + for (uint i = 3; i < 4; i++) hc_clSetKernelArg (device_param->kernel_mp_r, i, sizeof (cl_ulong), (void *) device_param->kernel_params_mp_r[i]); + for (uint i = 4; i < 8; i++) hc_clSetKernelArg (device_param->kernel_mp_r, i, sizeof (cl_uint), (void *) device_param->kernel_params_mp_r[i]); + + hc_clEnqueueWriteBuffer (device_param->command_queue, device_param->d_root_css_buf, CL_TRUE, 0, device_param->size_root_css, root_css_buf, 0, NULL, NULL); + hc_clEnqueueWriteBuffer (device_param->command_queue, device_param->d_markov_css_buf, CL_TRUE, 0, device_param->size_markov_css, markov_css_buf, 0, NULL, NULL); + #endif + } + } + + uint64_t words_base = data.words_cnt; + + if (data.attack_kern == ATTACK_KERN_STRAIGHT) + { + if (data.gpu_rules_cnt) + { + words_base /= data.gpu_rules_cnt; + } + } + else if (data.attack_kern == ATTACK_KERN_COMBI) + { + if (data.combs_cnt) + { + words_base /= data.combs_cnt; + } + } + else if (data.attack_kern == ATTACK_KERN_BF) + { + if (data.bfs_cnt) + { + words_base /= data.bfs_cnt; + } + } + + data.words_base = words_base; + + if (keyspace == 1) + { + log_info ("%llu", (unsigned long long int) words_base); + + return (0); + } + + if (data.words_cur > data.words_base) + { + log_error ("ERROR: restore value greater keyspace"); + + return (-1); + } + + if (data.words_cur) + { + if (data.attack_kern == ATTACK_KERN_STRAIGHT) + { + for (uint i = 0; i < data.salts_cnt; i++) + { + data.words_progress_restored[i] = data.words_cur * data.gpu_rules_cnt; + } + } + else if (data.attack_kern == ATTACK_KERN_COMBI) + { + for (uint i = 0; i < data.salts_cnt; i++) + { + data.words_progress_restored[i] = data.words_cur * data.combs_cnt; + } + } + else if (data.attack_kern == ATTACK_KERN_BF) + { + for (uint i = 0; i < data.salts_cnt; i++) + { + data.words_progress_restored[i] = data.words_cur * data.bfs_cnt; + } + } + } + + /* + * Inform user about possible slow speeds + */ + + if ((wordlist_mode == WL_MODE_FILE) || (wordlist_mode == WL_MODE_MASK)) + { + if (data.words_base < gpu_blocks_all) + { + if (quiet == 0) + { + log_info (""); + log_info ("ATTENTION!"); + log_info (" The wordlist or mask you are using is too small."); + log_info (" Therefore, oclHashcat is unable to utilize the full parallelization power of your GPU(s)."); + log_info (" The cracking speed will drop."); + log_info (" Workaround: https://hashcat.net/wiki/doku.php?id=frequently_asked_questions#how_to_create_more_work_for_full_speed"); + log_info (""); + } + } + } + + /* + * Update loopback file + */ + + if (loopback == 1) + { + time_t now; + + time (&now); + + uint random_num = get_random_num (0, 9999); + + snprintf (loopback_file, loopback_size - 1, "%s/%s.%d_%i", induction_directory, LOOPBACK_FILE, (int) now, random_num); + + data.loopback_file = loopback_file; + } + + /* + * Update dictionary statistic + */ + + if (keyspace == 0) + { + dictstat_fp = fopen (dictstat, "wb"); + + if (dictstat_fp) + { + fwrite (dictstat_base, sizeof (dictstat_t), dictstat_nmemb, dictstat_fp); + + fclose (dictstat_fp); + } + } + + data.devices_status = STATUS_RUNNING; + + if (initial_restore_done == 0) + { + if (data.restore_disable == 0) cycle_restore (); + + initial_restore_done = 1; + } + + hc_timer_set (&data.timer_running); + + if ((wordlist_mode == WL_MODE_FILE) || (wordlist_mode == WL_MODE_MASK)) + { + if ((quiet == 0) && (status == 0) && (benchmark == 0)) + { + if (quiet == 0) fprintf (stdout, "%s", PROMPT); + if (quiet == 0) fflush (stdout); + } + } + else if (wordlist_mode == WL_MODE_STDIN) + { + if (data.quiet == 0) log_info ("Starting attack in stdin mode..."); + if (data.quiet == 0) log_info (""); + } + + time_t runtime_start; + + time (&runtime_start); + + data.runtime_start = runtime_start; + + /** + * create cracker threads + */ + + hc_thread_t *c_threads = (hc_thread_t *) mycalloc (devices_cnt, sizeof (hc_thread_t)); + + for (uint device_id = 0; device_id < devices_cnt; device_id++) + { + hc_device_param_t *device_param = &devices_param[device_id]; + + device_param->device_id = device_id; + + if (wordlist_mode == WL_MODE_STDIN) + { + hc_thread_create (c_threads[device_id], thread_calc_stdin, device_param); + } + else + { + hc_thread_create (c_threads[device_id], thread_calc, device_param); + } + } + + // wait for crack threads to exit + + hc_thread_wait (devices_cnt, c_threads); + + local_free (c_threads); + + data.restore = 0; + + // finalize task + + logfile_sub_var_uint ("status-after-work", data.devices_status); + + if (data.devices_status == STATUS_CRACKED) break; + if (data.devices_status == STATUS_ABORTED) break; + + if (data.devices_status == STATUS_BYPASS) + { + data.devices_status = STATUS_RUNNING; + } + + if (induction_dictionaries_cnt) + { + unlink (induction_dictionaries[0]); + } + + free (induction_dictionaries); + + if (attack_mode != ATTACK_MODE_BF) + { + induction_dictionaries = scan_directory (induction_directory); + + induction_dictionaries_cnt = count_dictionaries (induction_dictionaries); + } + + if (benchmark == 0) + { + if (((dictpos + 1) < dictcnt) || ((maskpos + 1) < maskcnt) || induction_dictionaries_cnt) + { + if (quiet == 0) clear_prompt (); + + if (quiet == 0) log_info (""); + + if (status == 1) + { + status_display (); + } + else + { + if (quiet == 0) status_display (); + } + + if (quiet == 0) log_info (""); + } + } + + if (attack_mode == ATTACK_MODE_BF) + { + dictpos++; + + rd->dictpos = dictpos; + } + else + { + if (induction_dictionaries_cnt) + { + qsort (induction_dictionaries, induction_dictionaries_cnt, sizeof (char *), sort_by_mtime); + } + else + { + dictpos++; + + rd->dictpos = dictpos; + } + } + + time_t runtime_stop; + + time (&runtime_stop); + + data.runtime_stop = runtime_stop; + + logfile_sub_uint (runtime_start); + logfile_sub_uint (runtime_stop); + + logfile_sub_msg ("STOP"); + + global_free (subid); + } + + if (data.devices_status == STATUS_CRACKED) break; + if (data.devices_status == STATUS_ABORTED) break; + if (data.devices_status == STATUS_QUIT) break; + + if (data.devices_status == STATUS_BYPASS) + { + data.devices_status = STATUS_RUNNING; + } + } + + // problems could occur if already at startup everything was cracked (because of .pot file reading etc), we must set some variables here to avoid NULL pointers + + if (attack_mode == ATTACK_MODE_STRAIGHT) + { + if (data.wordlist_mode == WL_MODE_FILE) + { + if (data.dictfile == NULL) + { + if (dictfiles != NULL) + { + data.dictfile = dictfiles[0]; + + hc_timer_set (&data.timer_running); + } + } + } + } + // NOTE: combi is okay because it is already set beforehand + else if (attack_mode == ATTACK_MODE_HYBRID1 || attack_mode == ATTACK_MODE_HYBRID2) + { + if (data.dictfile == NULL) + { + if (dictfiles != NULL) + { + hc_timer_set (&data.timer_running); + + data.dictfile = dictfiles[0]; + } + } + } + else if (attack_mode == ATTACK_MODE_BF) + { + if (data.mask == NULL) + { + hc_timer_set (&data.timer_running); + + data.mask = masks[0]; + } + } + + if ((data.devices_status != STATUS_CRACKED) && (data.devices_status != STATUS_ABORTED) && (data.devices_status != STATUS_QUIT)) + { + data.devices_status = STATUS_EXHAUSTED; + } + + // if cracked / aborted remove last induction dictionary + + for (int file_pos = 0; file_pos < induction_dictionaries_cnt; file_pos++) + { + struct stat induct_stat; + + if (stat (induction_dictionaries[file_pos], &induct_stat) == 0) + { + unlink (induction_dictionaries[file_pos]); + } + } + + // wait for non-interactive threads + + for (uint thread_idx = 0; thread_idx < ni_threads_cnt; thread_idx++) + { + hc_thread_wait (1, &ni_threads[thread_idx]); + } + + local_free (ni_threads); + + // wait for interactive threads + + if ((data.wordlist_mode == WL_MODE_FILE) || (data.wordlist_mode == WL_MODE_MASK)) + { + hc_thread_wait (1, &i_thread); + } + + // we dont need restore file anymore + if (data.restore_disable == 0) + { + if ((data.devices_status == STATUS_EXHAUSTED) || (data.devices_status == STATUS_CRACKED)) + { + unlink (eff_restore_file); + unlink (new_restore_file); + } + else + { + cycle_restore (); + } + } + + // finally save left hashes + + if ((hashlist_mode == HL_MODE_FILE) && (remove == 1) && (data.digests_saved != data.digests_done)) + { + save_hash (); + } + + /** + * Clean up + */ + + if (benchmark == 1) + { + status_benchmark (); + + log_info (""); + } + else + { + if (quiet == 0) clear_prompt (); + + if (quiet == 0) log_info (""); + + if (status == 1) + { + status_display (); + } + else + { + if (quiet == 0) status_display (); + } + + if (quiet == 0) log_info (""); + } + + for (uint device_id = 0; device_id < devices_cnt; device_id++) + { + hc_device_param_t *device_param = &data.devices_param[device_id]; + + local_free (device_param->result); + + local_free (device_param->pw_caches); + + local_free (device_param->combs_buf); + + local_free (device_param->hooks_buf); + + #ifdef _CUDA + hc_cuCtxPushCurrent (device_param->context); + + if (device_param->pws_buf) myfree (device_param->pws_buf); + if (device_param->d_pws_buf) hc_cuMemFree (device_param->d_pws_buf); + if (device_param->d_pws_amp_buf) hc_cuMemFree (device_param->d_pws_amp_buf); + if (device_param->d_rules) hc_cuMemFree (device_param->d_rules); + if (device_param->d_combs) hc_cuMemFree (device_param->d_combs); + if (device_param->d_bfs) hc_cuMemFree (device_param->d_bfs); + if (device_param->d_bitmap_s1_a) hc_cuMemFree (device_param->d_bitmap_s1_a); + if (device_param->d_bitmap_s1_b) hc_cuMemFree (device_param->d_bitmap_s1_b); + if (device_param->d_bitmap_s1_c) hc_cuMemFree (device_param->d_bitmap_s1_c); + if (device_param->d_bitmap_s1_d) hc_cuMemFree (device_param->d_bitmap_s1_d); + if (device_param->d_bitmap_s2_a) hc_cuMemFree (device_param->d_bitmap_s2_a); + if (device_param->d_bitmap_s2_b) hc_cuMemFree (device_param->d_bitmap_s2_b); + if (device_param->d_bitmap_s2_c) hc_cuMemFree (device_param->d_bitmap_s2_c); + if (device_param->d_bitmap_s2_d) hc_cuMemFree (device_param->d_bitmap_s2_d); + if (device_param->d_plain_bufs) hc_cuMemFree (device_param->d_plain_bufs); + if (device_param->d_digests_buf) hc_cuMemFree (device_param->d_digests_buf); + if (device_param->d_digests_shown) hc_cuMemFree (device_param->d_digests_shown); + if (device_param->d_salt_bufs) hc_cuMemFree (device_param->d_salt_bufs); + if (device_param->d_esalt_bufs) hc_cuMemFree (device_param->d_esalt_bufs); + if (device_param->d_tmps) hc_cuMemFree (device_param->d_tmps); + if (device_param->d_hooks) hc_cuMemFree (device_param->d_hooks); + if (device_param->d_result) hc_cuMemFree (device_param->d_result); + if (device_param->d_scryptV_buf) hc_cuMemFree (device_param->d_scryptV_buf); + if (device_param->d_root_css_buf) hc_cuMemFree (device_param->d_root_css_buf); + if (device_param->d_markov_css_buf) hc_cuMemFree (device_param->d_markov_css_buf); + + if (device_param->stream) hc_cuStreamDestroy (device_param->stream); + if (device_param->module) hc_cuModuleUnload (device_param->module); + + hc_cuCtxPopCurrent (&device_param->context); + + if (device_param->context) hc_cuCtxDestroy (device_param->context); + + #elif _OCL + local_free (device_param->device_name); + + local_free (device_param->device_version); + + local_free (device_param->driver_version); + + if (device_param->pws_buf) myfree (device_param->pws_buf); + if (device_param->d_pws_buf) hc_clReleaseMemObject (device_param->d_pws_buf); + if (device_param->d_pws_amp_buf) hc_clReleaseMemObject (device_param->d_pws_amp_buf); + if (device_param->d_rules) hc_clReleaseMemObject (device_param->d_rules); + if (device_param->d_rules_c) hc_clReleaseMemObject (device_param->d_rules_c); + if (device_param->d_combs) hc_clReleaseMemObject (device_param->d_combs); + if (device_param->d_combs_c) hc_clReleaseMemObject (device_param->d_combs_c); + if (device_param->d_bfs) hc_clReleaseMemObject (device_param->d_bfs); + if (device_param->d_bfs_c) hc_clReleaseMemObject (device_param->d_bfs_c); + if (device_param->d_bitmap_s1_a) hc_clReleaseMemObject (device_param->d_bitmap_s1_a); + if (device_param->d_bitmap_s1_b) hc_clReleaseMemObject (device_param->d_bitmap_s1_b); + if (device_param->d_bitmap_s1_c) hc_clReleaseMemObject (device_param->d_bitmap_s1_c); + if (device_param->d_bitmap_s1_d) hc_clReleaseMemObject (device_param->d_bitmap_s1_d); + if (device_param->d_bitmap_s2_a) hc_clReleaseMemObject (device_param->d_bitmap_s2_a); + if (device_param->d_bitmap_s2_b) hc_clReleaseMemObject (device_param->d_bitmap_s2_b); + if (device_param->d_bitmap_s2_c) hc_clReleaseMemObject (device_param->d_bitmap_s2_c); + if (device_param->d_bitmap_s2_d) hc_clReleaseMemObject (device_param->d_bitmap_s2_d); + if (device_param->d_plain_bufs) hc_clReleaseMemObject (device_param->d_plain_bufs); + if (device_param->d_digests_buf) hc_clReleaseMemObject (device_param->d_digests_buf); + if (device_param->d_digests_shown) hc_clReleaseMemObject (device_param->d_digests_shown); + if (device_param->d_salt_bufs) hc_clReleaseMemObject (device_param->d_salt_bufs); + if (device_param->d_esalt_bufs) hc_clReleaseMemObject (device_param->d_esalt_bufs); + if (device_param->d_tmps) hc_clReleaseMemObject (device_param->d_tmps); + if (device_param->d_hooks) hc_clReleaseMemObject (device_param->d_hooks); + if (device_param->d_result) hc_clReleaseMemObject (device_param->d_result); + if (device_param->d_scryptV_buf) hc_clReleaseMemObject (device_param->d_scryptV_buf); + if (device_param->d_root_css_buf) hc_clReleaseMemObject (device_param->d_root_css_buf); + if (device_param->d_markov_css_buf) hc_clReleaseMemObject (device_param->d_markov_css_buf); + + if (device_param->kernel1) hc_clReleaseKernel (device_param->kernel1); + if (device_param->kernel12) hc_clReleaseKernel (device_param->kernel12); + if (device_param->kernel2) hc_clReleaseKernel (device_param->kernel2); + if (device_param->kernel23) hc_clReleaseKernel (device_param->kernel23); + if (device_param->kernel3) hc_clReleaseKernel (device_param->kernel3); + if (device_param->kernel_mp) hc_clReleaseKernel (device_param->kernel_mp); + if (device_param->kernel_mp_l) hc_clReleaseKernel (device_param->kernel_mp_l); + if (device_param->kernel_mp_r) hc_clReleaseKernel (device_param->kernel_mp_r); + + if (device_param->program) hc_clReleaseProgram (device_param->program); + if (device_param->program_mp) hc_clReleaseProgram (device_param->program_mp); + if (device_param->command_queue) hc_clReleaseCommandQueue (device_param->command_queue); + if (device_param->context) hc_clReleaseContext (device_param->context); + #endif + } + + #ifdef _OCL + #ifndef OSX + + // reset default fan speed + + if (gpu_temp_disable == 0) + { + if (gpu_temp_retain != 0) + { + hc_thread_mutex_lock (mux_adl); + + for (uint i = 0; i < data.devices_cnt; i++) + { + if (data.hm_device[i].fan_supported == 1) + { + int fanspeed = temp_retain_fanspeed_value[i]; + + if (fanspeed == -1) continue; + + int rc = hm_set_fanspeed_with_device_id (i, fanspeed); + + if (rc == -1) log_info ("WARNING: Failed to restore default fan speed for gpu number: %i:", i); + } + } + + hc_thread_mutex_unlock (mux_adl); + } + } + + // reset power tuning + + if (powertune_enable == 1) + { + hc_thread_mutex_lock (mux_adl); + + for (uint i = 0; i < data.devices_cnt; i++) + { + if (data.hm_device[i].od_version == 6) + { + // check powertune capabilities first, if not available then skip device + + int powertune_supported = 0; + + if ((hc_ADL_Overdrive6_PowerControl_Caps (data.hm_dll, data.hm_device[i].adapter_index, &powertune_supported)) != ADL_OK) + { + log_error ("ERROR: Failed to get ADL PowerControl Capabilities"); + + return (-1); + } + + if (powertune_supported != 0) + { + // powercontrol settings + + if ((hc_ADL_Overdrive_PowerControl_Set (data.hm_dll, data.hm_device[i].adapter_index, od_power_control_status[i])) != ADL_OK) + { + log_info ("ERROR: Failed to restore the ADL PowerControl values"); + + return (-1); + } + + // clocks + + ADLOD6StateInfo *performance_state = (ADLOD6StateInfo*) mycalloc (1, sizeof (ADLOD6StateInfo) + sizeof (ADLOD6PerformanceLevel)); + + performance_state->iNumberOfPerformanceLevels = 2; + + performance_state->aLevels[0].iEngineClock = od_clock_mem_status[i].state.aLevels[0].iEngineClock; + performance_state->aLevels[1].iEngineClock = od_clock_mem_status[i].state.aLevels[1].iEngineClock; + performance_state->aLevels[0].iMemoryClock = od_clock_mem_status[i].state.aLevels[0].iMemoryClock; + performance_state->aLevels[1].iMemoryClock = od_clock_mem_status[i].state.aLevels[1].iMemoryClock; + + if ((hc_ADL_Overdrive_State_Set (data.hm_dll, data.hm_device[i].adapter_index, ADL_OD6_SETSTATE_PERFORMANCE, performance_state)) != ADL_OK) + { + log_info ("ERROR: Failed to restore ADL performance state"); + + return (-1); + } + + local_free (performance_state); + } + } + } + + hc_thread_mutex_unlock (mux_adl); + } + + #endif + #endif + + if (gpu_temp_disable == 0) + { + #ifdef _CUDA + #ifdef LINUX + hc_NVML_nvmlShutdown (); + #endif + + #ifdef WIN + NvAPI_Unload (); + #endif + #endif + + #ifdef _OCL + #ifndef OSX + hc_ADL_Main_Control_Destroy (data.hm_dll); + + hm_close (data.hm_dll); + #endif + #endif + } + + // free memory + + local_free (masks); + + local_free (dictstat_base); + + for (uint pot_pos = 0; pot_pos < pot_cnt; pot_pos++) + { + pot_t *pot_ptr = &pot[pot_pos]; + + hash_t *hash = &pot_ptr->hash; + + local_free (hash->digest); + + if (isSalted) + { + local_free (hash->salt); + } + } + + local_free (pot); + + local_free (all_gpu_rules_cnt); + local_free (all_gpu_rules_buf); + + local_free (wl_data->buf); + local_free (wl_data); + + local_free (bitmap_s1_a); + local_free (bitmap_s1_b); + local_free (bitmap_s1_c); + local_free (bitmap_s1_d); + local_free (bitmap_s2_a); + local_free (bitmap_s2_b); + local_free (bitmap_s2_c); + local_free (bitmap_s2_d); + + #ifdef _OCL + #ifndef OSX + local_free (temp_retain_fanspeed_value); + local_free (od_clock_mem_status); + local_free (od_power_control_status); + #endif + #endif + + global_free (devices_param); + + global_free (gpu_rules_buf); + + global_free (root_css_buf); + global_free (markov_css_buf); + + global_free (digests_buf); + global_free (digests_shown); + global_free (digests_shown_tmp); + + global_free (salts_buf); + global_free (salts_shown); + + global_free (esalts_buf); + + global_free (words_progress_done); + global_free (words_progress_rejected); + global_free (words_progress_restored); + + if (pot_fp) fclose (pot_fp); + + if (data.devices_status == STATUS_QUIT) break; + } + + // destroy others mutex + + hc_thread_mutex_delete (mux_dispatcher); + hc_thread_mutex_delete (mux_counter); + hc_thread_mutex_delete (mux_display); + hc_thread_mutex_delete (mux_adl); + + // free memory + + local_free (eff_restore_file); + local_free (new_restore_file); + + local_free (rd); + + // loopback + + local_free (loopback_file); + + if (loopback == 1) unlink (loopback_file); + + // induction directory + + if (induction_dir == NULL) + { + if (attack_mode != ATTACK_MODE_BF) + { + if (rmdir (induction_directory) == -1) + { + if (errno == ENOENT) + { + // good, we can ignore + } + else if (errno == ENOTEMPTY) + { + // good, we can ignore + } + else + { + log_error ("ERROR: %s: %s", induction_directory, strerror (errno)); + + return (-1); + } + } + + local_free (induction_directory); + } + } + + // outfile-check directory + + if (outfile_check_dir == NULL) + { + if (rmdir (outfile_check_directory) == -1) + { + if (errno == ENOENT) + { + // good, we can ignore + } + else if (errno == ENOTEMPTY) + { + // good, we can ignore + } + else + { + log_error ("ERROR: %s: %s", outfile_check_directory, strerror (errno)); + + return (-1); + } + } + + local_free (outfile_check_directory); + } + + time_t proc_stop; + + time (&proc_stop); + + logfile_top_uint (proc_start); + logfile_top_uint (proc_stop); + + logfile_top_msg ("STOP"); + + if (quiet == 0) log_info_nn ("Started: %s", ctime (&proc_start)); + if (quiet == 0) log_info_nn ("Stopped: %s", ctime (&proc_stop)); + + if (data.devices_status == STATUS_ABORTED) return 2; + if (data.devices_status == STATUS_QUIT) return 2; + if (data.devices_status == STATUS_EXHAUSTED) return 1; + if (data.devices_status == STATUS_CRACKED) return 0; + + return -1; +} diff --git a/src/rp_gpu_on_cpu.c b/src/rp_gpu_on_cpu.c new file mode 100644 index 0000000000..fd1b2c569c --- /dev/null +++ b/src/rp_gpu_on_cpu.c @@ -0,0 +1,2677 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#pragma GCC diagnostic ignored "-Wunused-parameter" +#pragma GCC diagnostic ignored "-Wunused-variable" +#pragma GCC diagnostic ignored "-Wunused-but-set-variable" +#pragma GCC diagnostic ignored "-Wunused-function" + +#include + +static uint32_t generate_cmask (uint32_t buf) +{ + const uint32_t rmask = ((buf & 0x40404040) >> 1) + & ~((buf & 0x80808080) >> 2); + + const uint32_t hmask = (buf & 0x1f1f1f1f) + 0x05050505; + const uint32_t lmask = (buf & 0x1f1f1f1f) + 0x1f1f1f1f; + + return rmask & ~hmask & lmask; +} + +static void truncate_right (uint32_t w0[4], uint32_t w1[4], const uint len) +{ + const uint tmp = (1 << ((len % 4) * 8)) - 1; + + switch (len / 4) + { + case 0: w0[0] &= tmp; + w0[1] = 0; + w0[2] = 0; + w0[3] = 0; + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + break; + case 1: w0[1] &= tmp; + w0[2] = 0; + w0[3] = 0; + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + break; + case 2: w0[2] &= tmp; + w0[3] = 0; + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + break; + case 3: w0[3] &= tmp; + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + break; + case 4: w1[0] &= tmp; + w1[1] = 0; + w1[2] = 0; + w1[3] = 0; + break; + case 5: w1[1] &= tmp; + w1[2] = 0; + w1[3] = 0; + break; + case 6: w1[2] &= tmp; + w1[3] = 0; + break; + case 7: w1[3] &= tmp; + break; + } +} + +static void truncate_left (uint32_t w0[4], uint32_t w1[4], const uint len) +{ + const uint tmp = ~((1 << ((len % 4) * 8)) - 1); + + switch (len / 4) + { + case 0: w0[0] &= tmp; + break; + case 1: w0[0] = 0; + w0[1] &= tmp; + break; + case 2: w0[0] = 0; + w0[1] = 0; + w0[2] &= tmp; + break; + case 3: w0[0] = 0; + w0[1] = 0; + w0[2] = 0; + w0[3] &= tmp; + break; + case 4: w0[0] = 0; + w0[1] = 0; + w0[2] = 0; + w0[3] = 0; + w1[0] &= tmp; + break; + case 5: w0[0] = 0; + w0[1] = 0; + w0[2] = 0; + w0[3] = 0; + w1[0] = 0; + w1[1] &= tmp; + break; + case 6: w0[0] = 0; + w0[1] = 0; + w0[2] = 0; + w0[3] = 0; + w1[0] = 0; + w1[1] = 0; + w1[2] &= tmp; + break; + case 7: w0[0] = 0; + w0[1] = 0; + w0[2] = 0; + w0[3] = 0; + w1[0] = 0; + w1[1] = 0; + w1[2] = 0; + w1[3] &= tmp; + break; + } +} + +static void lshift_block (const uint32_t in0[4], const uint32_t in1[4], uint32_t out0[4], uint32_t out1[4]) +{ + out0[0] = in0[0] >> 8 | in0[1] << 24; + out0[1] = in0[1] >> 8 | in0[2] << 24; + out0[2] = in0[2] >> 8 | in0[3] << 24; + out0[3] = in0[3] >> 8 | in1[0] << 24; + out1[0] = in1[0] >> 8 | in1[1] << 24; + out1[1] = in1[1] >> 8 | in1[2] << 24; + out1[2] = in1[2] >> 8 | in1[3] << 24; + out1[3] = in1[3] >> 8; +} + +static void rshift_block (const uint32_t in0[4], const uint32_t in1[4], uint32_t out0[4], uint32_t out1[4]) +{ + out1[3] = in1[3] << 8 | in1[2] >> 24; + out1[2] = in1[2] << 8 | in1[1] >> 24; + out1[1] = in1[1] << 8 | in1[0] >> 24; + out1[0] = in1[0] << 8 | in0[3] >> 24; + out0[3] = in0[3] << 8 | in0[2] >> 24; + out0[2] = in0[2] << 8 | in0[1] >> 24; + out0[1] = in0[1] << 8 | in0[0] >> 24; + out0[0] = in0[0] << 8; +} + +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) +{ + switch (num) + { + case 0: out1[3] = in1[3]; + out1[2] = in1[2]; + out1[1] = in1[1]; + out1[0] = in1[0]; + out0[3] = in0[3]; + out0[2] = in0[2]; + out0[1] = in0[1]; + out0[0] = in0[0]; + break; + case 1: out1[3] = in1[3] << 8 | in1[2] >> 24; + out1[2] = in1[2] << 8 | in1[1] >> 24; + out1[1] = in1[1] << 8 | in1[0] >> 24; + out1[0] = in1[0] << 8 | in0[3] >> 24; + out0[3] = in0[3] << 8 | in0[2] >> 24; + out0[2] = in0[2] << 8 | in0[1] >> 24; + out0[1] = in0[1] << 8 | in0[0] >> 24; + out0[0] = in0[0] << 8; + break; + case 2: out1[3] = in1[3] << 16 | in1[2] >> 16; + out1[2] = in1[2] << 16 | in1[1] >> 16; + out1[1] = in1[1] << 16 | in1[0] >> 16; + out1[0] = in1[0] << 16 | in0[3] >> 16; + out0[3] = in0[3] << 16 | in0[2] >> 16; + out0[2] = in0[2] << 16 | in0[1] >> 16; + out0[1] = in0[1] << 16 | in0[0] >> 16; + out0[0] = in0[0] << 16; + break; + case 3: out1[3] = in1[3] << 24 | in1[2] >> 8; + out1[2] = in1[2] << 24 | in1[1] >> 8; + out1[1] = in1[1] << 24 | in1[0] >> 8; + out1[0] = in1[0] << 24 | in0[3] >> 8; + out0[3] = in0[3] << 24 | in0[2] >> 8; + out0[2] = in0[2] << 24 | in0[1] >> 8; + out0[1] = in0[1] << 24 | in0[0] >> 8; + out0[0] = in0[0] << 24; + break; + case 4: out1[3] = in1[2]; + out1[2] = in1[1]; + out1[1] = in1[0]; + out1[0] = in0[3]; + out0[3] = in0[2]; + out0[2] = in0[1]; + out0[1] = in0[0]; + out0[0] = 0; + break; + case 5: out1[3] = in1[2] << 8 | in1[1] >> 24; + out1[2] = in1[1] << 8 | in1[0] >> 24; + out1[1] = in1[0] << 8 | in0[3] >> 24; + out1[0] = in0[3] << 8 | in0[2] >> 24; + out0[3] = in0[2] << 8 | in0[1] >> 24; + out0[2] = in0[1] << 8 | in0[0] >> 24; + out0[1] = in0[0] << 8; + out0[0] = 0; + break; + case 6: out1[3] = in1[2] << 16 | in1[1] >> 16; + out1[2] = in1[1] << 16 | in1[0] >> 16; + out1[1] = in1[0] << 16 | in0[3] >> 16; + out1[0] = in0[3] << 16 | in0[2] >> 16; + out0[3] = in0[2] << 16 | in0[1] >> 16; + out0[2] = in0[1] << 16 | in0[0] >> 16; + out0[1] = in0[0] << 16; + out0[0] = 0; + break; + case 7: out1[3] = in1[2] << 24 | in1[1] >> 8; + out1[2] = in1[1] << 24 | in1[0] >> 8; + out1[1] = in1[0] << 24 | in0[3] >> 8; + out1[0] = in0[3] << 24 | in0[2] >> 8; + out0[3] = in0[2] << 24 | in0[1] >> 8; + out0[2] = in0[1] << 24 | in0[0] >> 8; + out0[1] = in0[0] << 24; + out0[0] = 0; + break; + case 8: out1[3] = in1[1]; + out1[2] = in1[0]; + out1[1] = in0[3]; + out1[0] = in0[2]; + out0[3] = in0[1]; + out0[2] = in0[0]; + out0[1] = 0; + out0[0] = 0; + break; + case 9: out1[3] = in1[1] << 8 | in1[0] >> 24; + out1[2] = in1[0] << 8 | in0[3] >> 24; + out1[1] = in0[3] << 8 | in0[2] >> 24; + out1[0] = in0[2] << 8 | in0[1] >> 24; + out0[3] = in0[1] << 8 | in0[0] >> 24; + out0[2] = in0[0] << 8; + out0[1] = 0; + out0[0] = 0; + break; + case 10: out1[3] = in1[1] << 16 | in1[0] >> 16; + out1[2] = in1[0] << 16 | in0[3] >> 16; + out1[1] = in0[3] << 16 | in0[2] >> 16; + out1[0] = in0[2] << 16 | in0[1] >> 16; + out0[3] = in0[1] << 16 | in0[0] >> 16; + out0[2] = in0[0] << 16; + out0[1] = 0; + out0[0] = 0; + break; + case 11: out1[3] = in1[1] << 24 | in1[0] >> 8; + out1[2] = in1[0] << 24 | in0[3] >> 8; + out1[1] = in0[3] << 24 | in0[2] >> 8; + out1[0] = in0[2] << 24 | in0[1] >> 8; + out0[3] = in0[1] << 24 | in0[0] >> 8; + out0[2] = in0[0] << 24; + out0[1] = 0; + out0[0] = 0; + break; + case 12: out1[3] = in1[0]; + out1[2] = in0[3]; + out1[1] = in0[2]; + out1[0] = in0[1]; + out0[3] = in0[0]; + out0[2] = 0; + out0[1] = 0; + out0[0] = 0; + break; + case 13: out1[3] = in1[0] << 8 | in0[3] >> 24; + out1[2] = in0[3] << 8 | in0[2] >> 24; + out1[1] = in0[2] << 8 | in0[1] >> 24; + out1[0] = in0[1] << 8 | in0[0] >> 24; + out0[3] = in0[0] << 8; + out0[2] = 0; + out0[1] = 0; + out0[0] = 0; + break; + case 14: out1[3] = in1[0] << 16 | in0[3] >> 16; + out1[2] = in0[3] << 16 | in0[2] >> 16; + out1[1] = in0[2] << 16 | in0[1] >> 16; + out1[0] = in0[1] << 16 | in0[0] >> 16; + out0[3] = in0[0] << 16; + out0[2] = 0; + out0[1] = 0; + out0[0] = 0; + break; + case 15: out1[3] = in1[0] << 24 | in0[3] >> 8; + out1[2] = in0[3] << 24 | in0[2] >> 8; + out1[1] = in0[2] << 24 | in0[1] >> 8; + out1[0] = in0[1] << 24 | in0[0] >> 8; + out0[3] = in0[0] << 24; + out0[2] = 0; + out0[1] = 0; + out0[0] = 0; + break; + case 16: out1[3] = in0[3]; + out1[2] = in0[2]; + out1[1] = in0[1]; + out1[0] = in0[0]; + out0[3] = 0; + out0[2] = 0; + out0[1] = 0; + out0[0] = 0; + break; + case 17: out1[3] = in0[3] << 8 | in0[2] >> 24; + out1[2] = in0[2] << 8 | in0[1] >> 24; + out1[1] = in0[1] << 8 | in0[0] >> 24; + out1[0] = in0[0] << 8; + out0[3] = 0; + out0[2] = 0; + out0[1] = 0; + out0[0] = 0; + break; + case 18: out1[3] = in0[3] << 16 | in0[2] >> 16; + out1[2] = in0[2] << 16 | in0[1] >> 16; + out1[1] = in0[1] << 16 | in0[0] >> 16; + out1[0] = in0[0] << 16; + out0[3] = 0; + out0[2] = 0; + out0[1] = 0; + out0[0] = 0; + break; + case 19: out1[3] = in0[3] << 24 | in0[2] >> 8; + out1[2] = in0[2] << 24 | in0[1] >> 8; + out1[1] = in0[1] << 24 | in0[0] >> 8; + out1[0] = in0[0] << 24; + out0[3] = 0; + out0[2] = 0; + out0[1] = 0; + out0[0] = 0; + break; + case 20: out1[3] = in0[2]; + out1[2] = in0[1]; + out1[1] = in0[0]; + out1[0] = 0; + out0[3] = 0; + out0[2] = 0; + out0[1] = 0; + out0[0] = 0; + break; + case 21: out1[3] = in0[2] << 8 | in0[1] >> 24; + out1[2] = in0[1] << 8 | in0[0] >> 24; + out1[1] = in0[0] << 8; + out1[0] = 0; + out0[3] = 0; + out0[2] = 0; + out0[1] = 0; + out0[0] = 0; + break; + case 22: out1[3] = in0[2] << 16 | in0[1] >> 16; + out1[2] = in0[1] << 16 | in0[0] >> 16; + out1[1] = in0[0] << 16; + out1[0] = 0; + out0[3] = 0; + out0[2] = 0; + out0[1] = 0; + out0[0] = 0; + break; + case 23: out1[3] = in0[2] << 24 | in0[1] >> 8; + out1[2] = in0[1] << 24 | in0[0] >> 8; + out1[1] = in0[0] << 24; + out1[0] = 0; + out0[3] = 0; + out0[2] = 0; + out0[1] = 0; + out0[0] = 0; + break; + case 24: out1[3] = in0[1]; + out1[2] = in0[0]; + out1[1] = 0; + out1[0] = 0; + out0[3] = 0; + out0[2] = 0; + out0[1] = 0; + out0[0] = 0; + break; + case 25: out1[3] = in0[1] << 8 | in0[0] >> 24; + out1[2] = in0[0] << 8; + out1[1] = 0; + out1[0] = 0; + out0[3] = 0; + out0[2] = 0; + out0[1] = 0; + out0[0] = 0; + break; + case 26: out1[3] = in0[1] << 16 | in0[0] >> 16; + out1[2] = in0[0] << 16; + out1[1] = 0; + out1[0] = 0; + out0[3] = 0; + out0[2] = 0; + out0[1] = 0; + out0[0] = 0; + break; + case 27: out1[3] = in0[1] << 24 | in0[0] >> 8; + out1[2] = in0[0] << 24; + out1[1] = 0; + out1[0] = 0; + out0[3] = 0; + out0[2] = 0; + out0[1] = 0; + out0[0] = 0; + break; + case 28: out1[3] = in0[0]; + out1[2] = 0; + out1[1] = 0; + out1[0] = 0; + out0[3] = 0; + out0[2] = 0; + out0[1] = 0; + out0[0] = 0; + break; + case 29: out1[3] = in0[0] << 8; + out1[2] = 0; + out1[1] = 0; + out1[0] = 0; + out0[3] = 0; + out0[2] = 0; + out0[1] = 0; + out0[0] = 0; + break; + case 30: out1[3] = in0[0] << 16; + out1[2] = 0; + out1[1] = 0; + out1[0] = 0; + out0[3] = 0; + out0[2] = 0; + out0[1] = 0; + out0[0] = 0; + break; + case 31: out1[3] = in0[0] << 24; + out1[2] = 0; + out1[1] = 0; + out1[0] = 0; + out0[3] = 0; + out0[2] = 0; + out0[1] = 0; + out0[0] = 0; + break; + } +} + +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) +{ + switch (num) + { + case 0: out0[0] = in0[0]; + out0[1] = in0[1]; + out0[2] = in0[2]; + out0[3] = in0[3]; + out1[0] = in1[0]; + out1[1] = in1[1]; + out1[2] = in1[2]; + out1[3] = in1[3]; + break; + case 1: out0[0] = in0[0] >> 8 | in0[1] << 24; + out0[1] = in0[1] >> 8 | in0[2] << 24; + out0[2] = in0[2] >> 8 | in0[3] << 24; + out0[3] = in0[3] >> 8 | in1[0] << 24; + out1[0] = in1[0] >> 8 | in1[1] << 24; + out1[1] = in1[1] >> 8 | in1[2] << 24; + out1[2] = in1[2] >> 8 | in1[3] << 24; + out1[3] = in1[3] >> 8; + break; + case 2: out0[0] = in0[0] >> 16 | in0[1] << 16; + out0[1] = in0[1] >> 16 | in0[2] << 16; + out0[2] = in0[2] >> 16 | in0[3] << 16; + out0[3] = in0[3] >> 16 | in1[0] << 16; + out1[0] = in1[0] >> 16 | in1[1] << 16; + out1[1] = in1[1] >> 16 | in1[2] << 16; + out1[2] = in1[2] >> 16 | in1[3] << 16; + out1[3] = in1[3] >> 16; + break; + case 3: out0[0] = in0[0] >> 24 | in0[1] << 8; + out0[1] = in0[1] >> 24 | in0[2] << 8; + out0[2] = in0[2] >> 24 | in0[3] << 8; + out0[3] = in0[3] >> 24 | in1[0] << 8; + out1[0] = in1[0] >> 24 | in1[1] << 8; + out1[1] = in1[1] >> 24 | in1[2] << 8; + out1[2] = in1[2] >> 24 | in1[3] << 8; + out1[3] = in1[3] >> 24; + break; + case 4: out0[0] = in0[1]; + out0[1] = in0[2]; + out0[2] = in0[3]; + out0[3] = in1[0]; + out1[0] = in1[1]; + out1[1] = in1[2]; + out1[2] = in1[3]; + out1[3] = 0; + break; + case 5: out0[0] = in0[1] >> 8 | in0[2] << 24; + out0[1] = in0[2] >> 8 | in0[3] << 24; + out0[2] = in0[3] >> 8 | in1[0] << 24; + out0[3] = in1[0] >> 8 | in1[1] << 24; + out1[0] = in1[1] >> 8 | in1[2] << 24; + out1[1] = in1[2] >> 8 | in1[3] << 24; + out1[2] = in1[3] >> 8; + out1[3] = 0; + break; + case 6: out0[0] = in0[1] >> 16 | in0[2] << 16; + out0[1] = in0[2] >> 16 | in0[3] << 16; + out0[2] = in0[3] >> 16 | in1[0] << 16; + out0[3] = in1[0] >> 16 | in1[1] << 16; + out1[0] = in1[1] >> 16 | in1[2] << 16; + out1[1] = in1[2] >> 16 | in1[3] << 16; + out1[2] = in1[3] >> 16; + out1[3] = 0; + break; + case 7: out0[0] = in0[1] >> 24 | in0[2] << 8; + out0[1] = in0[2] >> 24 | in0[3] << 8; + out0[2] = in0[3] >> 24 | in1[0] << 8; + out0[3] = in1[0] >> 24 | in1[1] << 8; + out1[0] = in1[1] >> 24 | in1[2] << 8; + out1[1] = in1[2] >> 24 | in1[3] << 8; + out1[2] = in1[3] >> 24; + out1[3] = 0; + break; + case 8: out0[0] = in0[2]; + out0[1] = in0[3]; + out0[2] = in1[0]; + out0[3] = in1[1]; + out1[0] = in1[2]; + out1[1] = in1[3]; + out1[2] = 0; + out1[3] = 0; + break; + case 9: out0[0] = in0[2] >> 8 | in0[3] << 24; + out0[1] = in0[3] >> 8 | in1[0] << 24; + out0[2] = in1[0] >> 8 | in1[1] << 24; + out0[3] = in1[1] >> 8 | in1[2] << 24; + out1[0] = in1[2] >> 8 | in1[3] << 24; + out1[1] = in1[3] >> 8; + out1[2] = 0; + out1[3] = 0; + break; + case 10: out0[0] = in0[2] >> 16 | in0[3] << 16; + out0[1] = in0[3] >> 16 | in1[0] << 16; + out0[2] = in1[0] >> 16 | in1[1] << 16; + out0[3] = in1[1] >> 16 | in1[2] << 16; + out1[0] = in1[2] >> 16 | in1[3] << 16; + out1[1] = in1[3] >> 16; + out1[2] = 0; + out1[3] = 0; + break; + case 11: out0[0] = in0[2] >> 24 | in0[3] << 8; + out0[1] = in0[3] >> 24 | in1[0] << 8; + out0[2] = in1[0] >> 24 | in1[1] << 8; + out0[3] = in1[1] >> 24 | in1[2] << 8; + out1[0] = in1[2] >> 24 | in1[3] << 8; + out1[1] = in1[3] >> 24; + out1[2] = 0; + out1[3] = 0; + break; + case 12: out0[0] = in0[3]; + out0[1] = in1[0]; + out0[2] = in1[1]; + out0[3] = in1[2]; + out1[0] = in1[3]; + out1[1] = 0; + out1[2] = 0; + out1[3] = 0; + break; + case 13: + out0[0] = in0[3] >> 8 | in1[0] << 24; + out0[1] = in1[0] >> 8 | in1[1] << 24; + out0[2] = in1[1] >> 8 | in1[2] << 24; + out0[3] = in1[2] >> 8 | in1[3] << 24; + out1[0] = in1[3] >> 8; + out1[1] = 0; + out1[2] = 0; + out1[3] = 0; + break; + case 14: out0[0] = in0[3] >> 16 | in1[0] << 16; + out0[1] = in1[0] >> 16 | in1[1] << 16; + out0[2] = in1[1] >> 16 | in1[2] << 16; + out0[3] = in1[2] >> 16 | in1[3] << 16; + out1[0] = in1[3] >> 16; + out1[1] = 0; + out1[2] = 0; + out1[3] = 0; + break; + case 15: out0[0] = in0[3] >> 24 | in1[0] << 8; + out0[1] = in1[0] >> 24 | in1[1] << 8; + out0[2] = in1[1] >> 24 | in1[2] << 8; + out0[3] = in1[2] >> 24 | in1[3] << 8; + out1[0] = in1[3] >> 24; + out1[1] = 0; + out1[2] = 0; + out1[3] = 0; + break; + case 16: out0[0] = in1[0]; + out0[1] = in1[1]; + out0[2] = in1[2]; + out0[3] = in1[3]; + out1[0] = 0; + out1[1] = 0; + out1[2] = 0; + out1[3] = 0; + break; + case 17: out0[0] = in1[0] >> 8 | in1[1] << 24; + out0[1] = in1[1] >> 8 | in1[2] << 24; + out0[2] = in1[2] >> 8 | in1[3] << 24; + out0[3] = in1[3] >> 8; + out1[0] = 0; + out1[1] = 0; + out1[2] = 0; + out1[3] = 0; + break; + case 18: out0[0] = in1[0] >> 16 | in1[1] << 16; + out0[1] = in1[1] >> 16 | in1[2] << 16; + out0[2] = in1[2] >> 16 | in1[3] << 16; + out0[3] = in1[3] >> 16; + out1[0] = 0; + out1[1] = 0; + out1[2] = 0; + out1[3] = 0; + break; + case 19: out0[0] = in1[0] >> 24 | in1[1] << 8; + out0[1] = in1[1] >> 24 | in1[2] << 8; + out0[2] = in1[2] >> 24 | in1[3] << 8; + out0[3] = in1[3] >> 24; + out1[0] = 0; + out1[1] = 0; + out1[2] = 0; + out1[3] = 0; + break; + case 20: out0[0] = in1[1]; + out0[1] = in1[2]; + out0[2] = in1[3]; + out0[3] = 0; + out1[0] = 0; + out1[1] = 0; + out1[2] = 0; + out1[3] = 0; + break; + case 21: out0[0] = in1[1] >> 8 | in1[2] << 24; + out0[1] = in1[2] >> 8 | in1[3] << 24; + out0[2] = in1[3] >> 8; + out0[3] = 0; + out1[0] = 0; + out1[1] = 0; + out1[2] = 0; + out1[3] = 0; + break; + case 22: out0[0] = in1[1] >> 16 | in1[2] << 16; + out0[1] = in1[2] >> 16 | in1[3] << 16; + out0[2] = in1[3] >> 16; + out0[3] = 0; + out1[0] = 0; + out1[1] = 0; + out1[2] = 0; + out1[3] = 0; + break; + case 23: out0[0] = in1[1] >> 24 | in1[2] << 8; + out0[1] = in1[2] >> 24 | in1[3] << 8; + out0[2] = in1[3] >> 24; + out0[3] = 0; + out1[0] = 0; + out1[1] = 0; + out1[2] = 0; + out1[3] = 0; + break; + case 24: out0[0] = in1[2]; + out0[1] = in1[3]; + out0[2] = 0; + out0[3] = 0; + out1[0] = 0; + out1[1] = 0; + out1[2] = 0; + out1[3] = 0; + break; + case 25: out0[0] = in1[2] >> 8 | in1[3] << 24; + out0[1] = in1[3] >> 8; + out0[2] = 0; + out0[3] = 0; + out1[0] = 0; + out1[1] = 0; + out1[2] = 0; + out1[3] = 0; + break; + case 26: out0[0] = in1[2] >> 16 | in1[3] << 16; + out0[1] = in1[3] >> 16; + out0[2] = 0; + out0[3] = 0; + out1[0] = 0; + out1[1] = 0; + out1[2] = 0; + out1[3] = 0; + break; + case 27: out0[0] = in1[2] >> 24 | in1[3] << 8; + out0[1] = in1[3] >> 24; + out0[2] = 0; + out0[3] = 0; + out1[0] = 0; + out1[1] = 0; + out1[2] = 0; + out1[3] = 0; + break; + case 28: out0[0] = in1[3]; + out0[1] = 0; + out0[2] = 0; + out0[3] = 0; + out1[0] = 0; + out1[1] = 0; + out1[2] = 0; + out1[3] = 0; + break; + case 29: out0[0] = in1[3] >> 8; + out0[1] = 0; + out0[2] = 0; + out0[3] = 0; + out1[0] = 0; + out1[1] = 0; + out1[2] = 0; + out1[3] = 0; + break; + case 30: out0[0] = in1[3] >> 16; + out0[1] = 0; + out0[2] = 0; + out0[3] = 0; + out1[0] = 0; + out1[1] = 0; + out1[2] = 0; + out1[3] = 0; + break; + case 31: out0[0] = in1[3] >> 24; + out0[1] = 0; + out0[2] = 0; + out0[3] = 0; + out1[0] = 0; + out1[1] = 0; + out1[2] = 0; + out1[3] = 0; + break; + } +} + +static void append_block1 (const uint offset, uint32_t dst0[4], uint32_t dst1[4], const uint32_t src_r0) +{ + uint32_t tmp[2]; + + switch (offset & 3) + { + case 0: tmp[0] = src_r0; + tmp[1] = 0; + break; + case 1: tmp[0] = src_r0 << 8; + tmp[1] = src_r0 >> 24; + break; + case 2: tmp[0] = src_r0 << 16; + tmp[1] = src_r0 >> 16; + break; + case 3: tmp[0] = src_r0 << 24; + tmp[1] = src_r0 >> 8; + break; + } + + switch (offset / 4) + { + case 0: dst0[0] |= tmp[0]; + dst0[1] = tmp[1]; + break; + case 1: dst0[1] |= tmp[0]; + dst0[2] = tmp[1]; + break; + case 2: dst0[2] |= tmp[0]; + dst0[3] = tmp[1]; + break; + case 3: dst0[3] |= tmp[0]; + dst1[0] = tmp[1]; + break; + case 4: dst1[0] |= tmp[0]; + dst1[1] = tmp[1]; + break; + case 5: dst1[1] |= tmp[0]; + dst1[2] = tmp[1]; + break; + case 6: dst1[2] |= tmp[0]; + dst1[3] = tmp[1]; + break; + case 7: dst1[3] |= tmp[0]; + break; + } +} + +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]) +{ + switch (offset) + { + case 0: + dst0[0] = src_r0[0]; + dst0[1] = src_r0[1]; + dst0[2] = src_r0[2]; + dst0[3] = src_r0[3]; + dst1[0] = src_r1[0]; + dst1[1] = src_r1[1]; + dst1[2] = src_r1[2]; + dst1[3] = src_r1[3]; + break; + + case 1: + dst0[0] = src_l0[0] | src_r0[0] << 8; + dst0[1] = src_r0[0] >> 24 | src_r0[1] << 8; + dst0[2] = src_r0[1] >> 24 | src_r0[2] << 8; + dst0[3] = src_r0[2] >> 24 | src_r0[3] << 8; + dst1[0] = src_r0[3] >> 24 | src_r1[0] << 8; + dst1[1] = src_r1[0] >> 24 | src_r1[1] << 8; + dst1[2] = src_r1[1] >> 24 | src_r1[2] << 8; + dst1[3] = src_r1[2] >> 24 | src_r1[3] << 8; + break; + + case 2: + dst0[0] = src_l0[0] | src_r0[0] << 16; + dst0[1] = src_r0[0] >> 16 | src_r0[1] << 16; + dst0[2] = src_r0[1] >> 16 | src_r0[2] << 16; + dst0[3] = src_r0[2] >> 16 | src_r0[3] << 16; + dst1[0] = src_r0[3] >> 16 | src_r1[0] << 16; + dst1[1] = src_r1[0] >> 16 | src_r1[1] << 16; + dst1[2] = src_r1[1] >> 16 | src_r1[2] << 16; + dst1[3] = src_r1[2] >> 16 | src_r1[3] << 16; + break; + + case 3: + dst0[0] = src_l0[0] | src_r0[0] << 24; + dst0[1] = src_r0[0] >> 8 | src_r0[1] << 24; + dst0[2] = src_r0[1] >> 8 | src_r0[2] << 24; + dst0[3] = src_r0[2] >> 8 | src_r0[3] << 24; + dst1[0] = src_r0[3] >> 8 | src_r1[0] << 24; + dst1[1] = src_r1[0] >> 8 | src_r1[1] << 24; + dst1[2] = src_r1[1] >> 8 | src_r1[2] << 24; + dst1[3] = src_r1[2] >> 8 | src_r1[3] << 24; + break; + + case 4: + dst0[1] = src_r0[0]; + dst0[2] = src_r0[1]; + dst0[3] = src_r0[2]; + dst1[0] = src_r0[3]; + dst1[1] = src_r1[0]; + dst1[2] = src_r1[1]; + dst1[3] = src_r1[2]; + break; + + case 5: + dst0[1] = src_l0[1] | src_r0[0] << 8; + dst0[2] = src_r0[0] >> 24 | src_r0[1] << 8; + dst0[3] = src_r0[1] >> 24 | src_r0[2] << 8; + dst1[0] = src_r0[2] >> 24 | src_r0[3] << 8; + dst1[1] = src_r0[3] >> 24 | src_r1[0] << 8; + dst1[2] = src_r1[0] >> 24 | src_r1[1] << 8; + dst1[3] = src_r1[1] >> 24 | src_r1[2] << 8; + break; + + case 6: + dst0[1] = src_l0[1] | src_r0[0] << 16; + dst0[2] = src_r0[0] >> 16 | src_r0[1] << 16; + dst0[3] = src_r0[1] >> 16 | src_r0[2] << 16; + dst1[0] = src_r0[2] >> 16 | src_r0[3] << 16; + dst1[1] = src_r0[3] >> 16 | src_r1[0] << 16; + dst1[2] = src_r1[0] >> 16 | src_r1[1] << 16; + dst1[3] = src_r1[1] >> 16 | src_r1[2] << 16; + break; + + case 7: + dst0[1] = src_l0[1] | src_r0[0] << 24; + dst0[2] = src_r0[0] >> 8 | src_r0[1] << 24; + dst0[3] = src_r0[1] >> 8 | src_r0[2] << 24; + dst1[0] = src_r0[2] >> 8 | src_r0[3] << 24; + dst1[1] = src_r0[3] >> 8 | src_r1[0] << 24; + dst1[2] = src_r1[0] >> 8 | src_r1[1] << 24; + dst1[3] = src_r1[1] >> 8 | src_r1[2] << 24; + break; + + case 8: + dst0[2] = src_r0[0]; + dst0[3] = src_r0[1]; + dst1[0] = src_r0[2]; + dst1[1] = src_r0[3]; + dst1[2] = src_r1[0]; + dst1[3] = src_r1[1]; + break; + + case 9: + dst0[2] = src_l0[2] | src_r0[0] << 8; + dst0[3] = src_r0[0] >> 24 | src_r0[1] << 8; + dst1[0] = src_r0[1] >> 24 | src_r0[2] << 8; + dst1[1] = src_r0[2] >> 24 | src_r0[3] << 8; + dst1[2] = src_r0[3] >> 24 | src_r1[0] << 8; + dst1[3] = src_r1[0] >> 24 | src_r1[1] << 8; + break; + + case 10: + dst0[2] = src_l0[2] | src_r0[0] << 16; + dst0[3] = src_r0[0] >> 16 | src_r0[1] << 16; + dst1[0] = src_r0[1] >> 16 | src_r0[2] << 16; + dst1[1] = src_r0[2] >> 16 | src_r0[3] << 16; + dst1[2] = src_r0[3] >> 16 | src_r1[0] << 16; + dst1[3] = src_r1[0] >> 16 | src_r1[1] << 16; + break; + + case 11: + dst0[2] = src_l0[2] | src_r0[0] << 24; + dst0[3] = src_r0[0] >> 8 | src_r0[1] << 24; + dst1[0] = src_r0[1] >> 8 | src_r0[2] << 24; + dst1[1] = src_r0[2] >> 8 | src_r0[3] << 24; + dst1[2] = src_r0[3] >> 8 | src_r1[0] << 24; + dst1[3] = src_r1[0] >> 8 | src_r1[1] << 24; + break; + + case 12: + dst0[3] = src_r0[0]; + dst1[0] = src_r0[1]; + dst1[1] = src_r0[2]; + dst1[2] = src_r0[3]; + dst1[3] = src_r1[0]; + break; + + case 13: + dst0[3] = src_l0[3] | src_r0[0] << 8; + dst1[0] = src_r0[0] >> 24 | src_r0[1] << 8; + dst1[1] = src_r0[1] >> 24 | src_r0[2] << 8; + dst1[2] = src_r0[2] >> 24 | src_r0[3] << 8; + dst1[3] = src_r0[3] >> 24 | src_r1[0] << 8; + break; + + case 14: + dst0[3] = src_l0[3] | src_r0[0] << 16; + dst1[0] = src_r0[0] >> 16 | src_r0[1] << 16; + dst1[1] = src_r0[1] >> 16 | src_r0[2] << 16; + dst1[2] = src_r0[2] >> 16 | src_r0[3] << 16; + dst1[3] = src_r0[3] >> 16 | src_r1[0] << 16; + break; + + case 15: + dst0[3] = src_l0[3] | src_r0[0] << 24; + dst1[0] = src_r0[0] >> 8 | src_r0[1] << 24; + dst1[1] = src_r0[1] >> 8 | src_r0[2] << 24; + dst1[2] = src_r0[2] >> 8 | src_r0[3] << 24; + dst1[3] = src_r0[3] >> 8 | src_r1[0] << 24; + break; + + case 16: + dst1[0] = src_r0[0]; + dst1[1] = src_r0[1]; + dst1[2] = src_r0[2]; + dst1[3] = src_r0[3]; + break; + + case 17: + dst1[0] = src_l1[0] | src_r0[0] << 8; + dst1[1] = src_r0[0] >> 24 | src_r0[1] << 8; + dst1[2] = src_r0[1] >> 24 | src_r0[2] << 8; + dst1[3] = src_r0[2] >> 24 | src_r0[3] << 8; + break; + + case 18: + dst1[0] = src_l1[0] | src_r0[0] << 16; + dst1[1] = src_r0[0] >> 16 | src_r0[1] << 16; + dst1[2] = src_r0[1] >> 16 | src_r0[2] << 16; + dst1[3] = src_r0[2] >> 16 | src_r0[3] << 16; + break; + + case 19: + dst1[0] = src_l1[0] | src_r0[0] << 24; + dst1[1] = src_r0[0] >> 8 | src_r0[1] << 24; + dst1[2] = src_r0[1] >> 8 | src_r0[2] << 24; + dst1[3] = src_r0[2] >> 8 | src_r0[3] << 24; + break; + + case 20: + dst1[1] = src_r0[0]; + dst1[2] = src_r0[1]; + dst1[3] = src_r0[2]; + break; + + case 21: + dst1[1] = src_l1[1] | src_r0[0] << 8; + dst1[2] = src_r0[0] >> 24 | src_r0[1] << 8; + dst1[3] = src_r0[1] >> 24 | src_r0[2] << 8; + break; + + case 22: + dst1[1] = src_l1[1] | src_r0[0] << 16; + dst1[2] = src_r0[0] >> 16 | src_r0[1] << 16; + dst1[3] = src_r0[1] >> 16 | src_r0[2] << 16; + break; + + case 23: + dst1[1] = src_l1[1] | src_r0[0] << 24; + dst1[2] = src_r0[0] >> 8 | src_r0[1] << 24; + dst1[3] = src_r0[1] >> 8 | src_r0[2] << 24; + break; + + case 24: + dst1[2] = src_r0[0]; + dst1[3] = src_r0[1]; + break; + + case 25: + dst1[2] = src_l1[2] | src_r0[0] << 8; + dst1[3] = src_r0[0] >> 24 | src_r0[1] << 8; + break; + + case 26: + dst1[2] = src_l1[2] | src_r0[0] << 16; + dst1[3] = src_r0[0] >> 16 | src_r0[1] << 16; + break; + + case 27: + dst1[2] = src_l1[2] | src_r0[0] << 24; + dst1[3] = src_r0[0] >> 8 | src_r0[1] << 24; + break; + + case 28: + dst1[3] = src_r0[0]; + break; + + case 29: + dst1[3] = src_l1[3] | src_r0[0] << 8; + break; + + case 30: + dst1[3] = src_l1[3] | src_r0[0] << 16; + break; + + case 31: + dst1[3] = src_l1[3] | src_r0[0] << 24; + break; + } +} + +static void reverse_block (uint32_t in0[4], uint32_t in1[4], uint32_t out0[4], uint32_t out1[4], const uint len) +{ + rshift_block_N (in0, in1, out0, out1, 32 - len); + + uint32_t tib40[4]; + uint32_t tib41[4]; + + tib40[0] = out1[3]; + tib40[1] = out1[2]; + tib40[2] = out1[1]; + tib40[3] = out1[0]; + tib41[0] = out0[3]; + tib41[1] = out0[2]; + tib41[2] = out0[1]; + tib41[3] = out0[0]; + + out0[0] = swap_workaround (tib40[0]); + out0[1] = swap_workaround (tib40[1]); + out0[2] = swap_workaround (tib40[2]); + out0[3] = swap_workaround (tib40[3]); + out1[0] = swap_workaround (tib41[0]); + out1[1] = swap_workaround (tib41[1]); + out1[2] = swap_workaround (tib41[2]); + out1[3] = swap_workaround (tib41[3]); +} + +static uint rule_op_mangle_lrest (const uint p0, const uint p1, uint32_t buf0[4], uint32_t buf1[4], const uint in_len) +{ + buf0[0] |= (generate_cmask (buf0[0])); + buf0[1] |= (generate_cmask (buf0[1])); + buf0[2] |= (generate_cmask (buf0[2])); + buf0[3] |= (generate_cmask (buf0[3])); + buf1[0] |= (generate_cmask (buf1[0])); + buf1[1] |= (generate_cmask (buf1[1])); + buf1[2] |= (generate_cmask (buf1[2])); + buf1[3] |= (generate_cmask (buf1[3])); + + return in_len; +} + +static uint rule_op_mangle_urest (const uint p0, const uint p1, uint32_t buf0[4], uint32_t buf1[4], const uint in_len) +{ + buf0[0] &= ~(generate_cmask (buf0[0])); + buf0[1] &= ~(generate_cmask (buf0[1])); + buf0[2] &= ~(generate_cmask (buf0[2])); + buf0[3] &= ~(generate_cmask (buf0[3])); + buf1[0] &= ~(generate_cmask (buf1[0])); + buf1[1] &= ~(generate_cmask (buf1[1])); + buf1[2] &= ~(generate_cmask (buf1[2])); + buf1[3] &= ~(generate_cmask (buf1[3])); + + return in_len; +} + +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) +{ + rule_op_mangle_lrest (p0, p1, buf0, buf1, in_len); + + buf0[0] &= ~(0x00000020 & generate_cmask (buf0[0])); + + return in_len; +} + +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) +{ + rule_op_mangle_urest (p0, p1, buf0, buf1, in_len); + + buf0[0] |= (0x00000020 & generate_cmask (buf0[0])); + + return in_len; +} + +static uint rule_op_mangle_trest (const uint p0, const uint p1, uint32_t buf0[4], uint32_t buf1[4], const uint in_len) +{ + buf0[0] ^= (generate_cmask (buf0[0])); + buf0[1] ^= (generate_cmask (buf0[1])); + buf0[2] ^= (generate_cmask (buf0[2])); + buf0[3] ^= (generate_cmask (buf0[3])); + buf1[0] ^= (generate_cmask (buf1[0])); + buf1[1] ^= (generate_cmask (buf1[1])); + buf1[2] ^= (generate_cmask (buf1[2])); + buf1[3] ^= (generate_cmask (buf1[3])); + + return in_len; +} + +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) +{ + if (p0 >= in_len) return (in_len); + + const uint tmp = 0x20 << ((p0 & 3) * 8); + + switch (p0 / 4) + { + case 0: buf0[0] ^= (tmp & generate_cmask (buf0[0])); break; + case 1: buf0[1] ^= (tmp & generate_cmask (buf0[1])); break; + case 2: buf0[2] ^= (tmp & generate_cmask (buf0[2])); break; + case 3: buf0[3] ^= (tmp & generate_cmask (buf0[3])); break; + case 4: buf1[0] ^= (tmp & generate_cmask (buf1[0])); break; + case 5: buf1[1] ^= (tmp & generate_cmask (buf1[1])); break; + case 6: buf1[2] ^= (tmp & generate_cmask (buf1[2])); break; + case 7: buf1[3] ^= (tmp & generate_cmask (buf1[3])); break; + } + + return in_len; +} + +static uint rule_op_mangle_reverse (const uint p0, const uint p1, uint32_t buf0[4], uint32_t buf1[4], const uint in_len) +{ + reverse_block (buf0, buf1, buf0, buf1, in_len); + + return in_len; +} + +static uint rule_op_mangle_dupeword (const uint p0, const uint p1, uint32_t buf0[4], uint32_t buf1[4], const uint in_len) +{ + if ((in_len + in_len) >= 32) return (in_len); + + uint out_len = in_len; + + uint32_t tib40[4]; + uint32_t tib41[4]; + + tib40[0] = buf0[0]; + tib40[1] = buf0[1]; + tib40[2] = buf0[2]; + tib40[3] = buf0[3]; + tib41[0] = buf1[0]; + tib41[1] = buf1[1]; + tib41[2] = buf1[2]; + tib41[3] = buf1[3]; + + append_block8 (out_len, buf0, buf1, buf0, buf1, tib40, tib41); + + out_len += in_len; + + return out_len; +} + +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) +{ + if (((in_len * p0) + in_len) >= 32) return (in_len); + + uint out_len = in_len; + + uint32_t tib40[4]; + uint32_t tib41[4]; + + tib40[0] = buf0[0]; + tib40[1] = buf0[1]; + tib40[2] = buf0[2]; + tib40[3] = buf0[3]; + tib41[0] = buf1[0]; + tib41[1] = buf1[1]; + tib41[2] = buf1[2]; + tib41[3] = buf1[3]; + + for (uint i = 0; i < p0; i++) + { + append_block8 (out_len, buf0, buf1, buf0, buf1, tib40, tib41); + + out_len += in_len; + } + + return out_len; +} + +static uint rule_op_mangle_reflect (const uint p0, const uint p1, uint32_t buf0[4], uint32_t buf1[4], const uint in_len) +{ + if ((in_len + in_len) >= 32) return (in_len); + + uint out_len = in_len; + + uint32_t tib40[4]; + uint32_t tib41[4]; + + reverse_block (buf0, buf1, tib40, tib41, out_len); + + append_block8 (out_len, buf0, buf1, buf0, buf1, tib40, tib41); + + out_len += in_len; + + return out_len; +} + +static uint rule_op_mangle_append (const uint p0, const uint p1, uint32_t buf0[4], uint32_t buf1[4], const uint in_len) +{ + if ((in_len + 1) >= 32) return (in_len); + + uint out_len = in_len; + + append_block1 (out_len, buf0, buf1, p0); + + out_len++; + + return out_len; +} + +static uint rule_op_mangle_prepend (const uint p0, const uint p1, uint32_t buf0[4], uint32_t buf1[4], const uint in_len) +{ + if ((in_len + 1) >= 32) return (in_len); + + uint out_len = in_len; + + rshift_block (buf0, buf1, buf0, buf1); + + buf0[0] = buf0[0] | p0; + + out_len++; + + return out_len; +} + +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) +{ + if (in_len == 0) return (in_len); + + const uint in_len1 = in_len - 1; + + const uint sh = (in_len1 & 3) * 8; + + const uint32_t tmp = (buf0[0] & 0xff) << sh; + + lshift_block (buf0, buf1, buf0, buf1); + + switch (in_len1 / 4) + { + case 0: buf0[0] |= tmp; break; + case 1: buf0[1] |= tmp; break; + case 2: buf0[2] |= tmp; break; + case 3: buf0[3] |= tmp; break; + case 4: buf1[0] |= tmp; break; + case 5: buf1[1] |= tmp; break; + case 6: buf1[2] |= tmp; break; + case 7: buf1[3] |= tmp; break; + } + + return in_len; +} + +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) +{ + if (in_len == 0) return (in_len); + + const uint in_len1 = in_len - 1; + + const uint sh = (in_len1 & 3) * 8; + + uint32_t tmp = 0; + + switch (in_len1 / 4) + { + case 0: tmp = (buf0[0] >> sh) & 0xff; break; + case 1: tmp = (buf0[1] >> sh) & 0xff; break; + case 2: tmp = (buf0[2] >> sh) & 0xff; break; + case 3: tmp = (buf0[3] >> sh) & 0xff; break; + case 4: tmp = (buf1[0] >> sh) & 0xff; break; + case 5: tmp = (buf1[1] >> sh) & 0xff; break; + case 6: tmp = (buf1[2] >> sh) & 0xff; break; + case 7: tmp = (buf1[3] >> sh) & 0xff; break; + } + + rshift_block (buf0, buf1, buf0, buf1); + + buf0[0] |= tmp; + + truncate_right (buf0, buf1, in_len); + + return in_len; +} + +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) +{ + if (in_len == 0) return (in_len); + + const uint in_len1 = in_len - 1; + + lshift_block (buf0, buf1, buf0, buf1); + + return in_len1; +} + +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) +{ + if (in_len == 0) return (in_len); + + const uint in_len1 = in_len - 1; + + const uint tmp = (1 << ((in_len1 & 3) * 8)) - 1; + + switch (in_len1 / 4) + { + case 0: buf0[0] &= tmp; break; + case 1: buf0[1] &= tmp; break; + case 2: buf0[2] &= tmp; break; + case 3: buf0[3] &= tmp; break; + case 4: buf1[0] &= tmp; break; + case 5: buf1[1] &= tmp; break; + case 6: buf1[2] &= tmp; break; + case 7: buf1[3] &= tmp; break; + } + + return in_len1; +} + +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) +{ + if (p0 >= in_len) return (in_len); + + uint out_len = in_len; + + uint32_t tib40[4]; + uint32_t tib41[4]; + + lshift_block (buf0, buf1, tib40, tib41); + + const uint ml = (1 << ((p0 & 3) * 8)) - 1; + const uint mr = ~ml; + + switch (p0 / 4) + { + case 0: buf0[0] = (buf0[0] & ml) + | (tib40[0] & mr); + buf0[1] = tib40[1]; + buf0[2] = tib40[2]; + buf0[3] = tib40[3]; + buf1[0] = tib41[0]; + buf1[1] = tib41[1]; + buf1[2] = tib41[2]; + buf1[3] = tib41[3]; + break; + case 1: buf0[1] = (buf0[1] & ml) + | (tib40[1] & mr); + buf0[2] = tib40[2]; + buf0[3] = tib40[3]; + buf1[0] = tib41[0]; + buf1[1] = tib41[1]; + buf1[2] = tib41[2]; + buf1[3] = tib41[3]; + break; + case 2: buf0[2] = (buf0[2] & ml) + | (tib40[2] & mr); + buf0[3] = tib40[3]; + buf1[0] = tib41[0]; + buf1[1] = tib41[1]; + buf1[2] = tib41[2]; + buf1[3] = tib41[3]; + break; + case 3: buf0[3] = (buf0[3] & ml) + | (tib40[3] & mr); + buf1[0] = tib41[0]; + buf1[1] = tib41[1]; + buf1[2] = tib41[2]; + buf1[3] = tib41[3]; + break; + case 4: buf1[0] = (buf1[0] & ml) + | (tib41[0] & mr); + buf1[1] = tib41[1]; + buf1[2] = tib41[2]; + buf1[3] = tib41[3]; + break; + case 5: buf1[1] = (buf1[1] & ml) + | (tib41[1] & mr); + buf1[2] = tib41[2]; + buf1[3] = tib41[3]; + break; + case 6: buf1[2] = (buf1[2] & ml) + | (tib41[2] & mr); + buf1[3] = tib41[3]; + break; + case 7: buf1[3] = (buf1[3] & ml) + | (tib41[3] & mr); + break; + } + + out_len--; + + return out_len; +} + +static uint rule_op_mangle_extract (const uint p0, const uint p1, uint32_t buf0[4], uint32_t buf1[4], const uint in_len) +{ + if (p0 >= in_len) return (in_len); + + if ((p0 + p1) > in_len) return (in_len); + + uint out_len = p1; + + lshift_block_N (buf0, buf1, buf0, buf1, p0); + + truncate_right (buf0, buf1, out_len); + + return out_len; +} + +static uint rule_op_mangle_omit (const uint p0, const uint p1, uint32_t buf0[4], uint32_t buf1[4], const uint in_len) +{ + if (p0 >= in_len) return (in_len); + + if ((p0 + p1) > in_len) return (in_len); + + uint out_len = in_len; + + uint32_t tib40[4]; + uint32_t tib41[4]; + + tib40[0] = 0; + tib40[1] = 0; + tib40[2] = 0; + tib40[3] = 0; + tib41[0] = 0; + tib41[1] = 0; + tib41[2] = 0; + tib41[3] = 0; + + lshift_block_N (buf0, buf1, tib40, tib41, p1); + + const uint ml = (1 << ((p0 & 3) * 8)) - 1; + const uint mr = ~ml; + + switch (p0 / 4) + { + case 0: buf0[0] = (buf0[0] & ml) + | (tib40[0] & mr); + buf0[1] = tib40[1]; + buf0[2] = tib40[2]; + buf0[3] = tib40[3]; + buf1[0] = tib41[0]; + buf1[1] = tib41[1]; + buf1[2] = tib41[2]; + buf1[3] = tib41[3]; + break; + case 1: buf0[1] = (buf0[1] & ml) + | (tib40[1] & mr); + buf0[2] = tib40[2]; + buf0[3] = tib40[3]; + buf1[0] = tib41[0]; + buf1[1] = tib41[1]; + buf1[2] = tib41[2]; + buf1[3] = tib41[3]; + break; + case 2: buf0[2] = (buf0[2] & ml) + | (tib40[2] & mr); + buf0[3] = tib40[3]; + buf1[0] = tib41[0]; + buf1[1] = tib41[1]; + buf1[2] = tib41[2]; + buf1[3] = tib41[3]; + break; + case 3: buf0[3] = (buf0[3] & ml) + | (tib40[3] & mr); + buf1[0] = tib41[0]; + buf1[1] = tib41[1]; + buf1[2] = tib41[2]; + buf1[3] = tib41[3]; + break; + case 4: buf1[0] = (buf1[0] & ml) + | (tib41[0] & mr); + buf1[1] = tib41[1]; + buf1[2] = tib41[2]; + buf1[3] = tib41[3]; + break; + case 5: buf1[1] = (buf1[1] & ml) + | (tib41[1] & mr); + buf1[2] = tib41[2]; + buf1[3] = tib41[3]; + break; + case 6: buf1[2] = (buf1[2] & ml) + | (tib41[2] & mr); + buf1[3] = tib41[3]; + break; + case 7: buf1[3] = (buf1[3] & ml) + | (tib41[3] & mr); + break; + } + + out_len -= p1; + + return out_len; +} + +static uint rule_op_mangle_insert (const uint p0, const uint p1, uint32_t buf0[4], uint32_t buf1[4], const uint in_len) +{ + if (p0 > in_len) return (in_len); + + if ((in_len + 1) >= 32) return (in_len); + + uint out_len = in_len; + + uint32_t tib40[4]; + uint32_t tib41[4]; + + rshift_block (buf0, buf1, tib40, tib41); + + const uint p1n = p1 << ((p0 & 3) * 8); + + const uint ml = (1 << ((p0 & 3) * 8)) - 1; + + const uint mr = 0xffffff00 << ((p0 & 3) * 8); + + switch (p0 / 4) + { + case 0: buf0[0] = (buf0[0] & ml) | p1n | (tib40[0] & mr); + buf0[1] = tib40[1]; + buf0[2] = tib40[2]; + buf0[3] = tib40[3]; + buf1[0] = tib41[0]; + buf1[1] = tib41[1]; + buf1[2] = tib41[2]; + buf1[3] = tib41[3]; + break; + case 1: buf0[1] = (buf0[1] & ml) | p1n | (tib40[1] & mr); + buf0[2] = tib40[2]; + buf0[3] = tib40[3]; + buf1[0] = tib41[0]; + buf1[1] = tib41[1]; + buf1[2] = tib41[2]; + buf1[3] = tib41[3]; + break; + case 2: buf0[2] = (buf0[2] & ml) | p1n | (tib40[2] & mr); + buf0[3] = tib40[3]; + buf1[0] = tib41[0]; + buf1[1] = tib41[1]; + buf1[2] = tib41[2]; + buf1[3] = tib41[3]; + break; + case 3: buf0[3] = (buf0[3] & ml) | p1n | (tib40[3] & mr); + buf1[0] = tib41[0]; + buf1[1] = tib41[1]; + buf1[2] = tib41[2]; + buf1[3] = tib41[3]; + break; + case 4: buf1[0] = (buf1[0] & ml) | p1n | (tib41[0] & mr); + buf1[1] = tib41[1]; + buf1[2] = tib41[2]; + buf1[3] = tib41[3]; + break; + case 5: buf1[1] = (buf1[1] & ml) | p1n | (tib41[1] & mr); + buf1[2] = tib41[2]; + buf1[3] = tib41[3]; + break; + case 6: buf1[2] = (buf1[2] & ml) | p1n | (tib41[2] & mr); + buf1[3] = tib41[3]; + break; + case 7: buf1[3] = (buf1[3] & ml) | p1n | (tib41[3] & mr); + break; + } + + out_len++; + + return out_len; +} + +static uint rule_op_mangle_overstrike (const uint p0, const uint p1, uint32_t buf0[4], uint32_t buf1[4], const uint in_len) +{ + if (p0 >= in_len) return (in_len); + + const uint p1n = p1 << ((p0 & 3) * 8); + + const uint m = ~(0xff << ((p0 & 3) * 8)); + + switch (p0 / 4) + { + case 0: buf0[0] = (buf0[0] & m) | p1n; break; + case 1: buf0[1] = (buf0[1] & m) | p1n; break; + case 2: buf0[2] = (buf0[2] & m) | p1n; break; + case 3: buf0[3] = (buf0[3] & m) | p1n; break; + case 4: buf1[0] = (buf1[0] & m) | p1n; break; + case 5: buf1[1] = (buf1[1] & m) | p1n; break; + case 6: buf1[2] = (buf1[2] & m) | p1n; break; + case 7: buf1[3] = (buf1[3] & m) | p1n; break; + } + + return in_len; +} + +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) +{ + if (p0 >= in_len) return (in_len); + + truncate_right (buf0, buf1, p0); + + return p0; +} + +static uint rule_op_mangle_replace (const uint p0, const uint p1, uint32_t buf0[4], uint32_t buf1[4], const uint in_len) +{ + for (uint i = 0; i < in_len; i++) + { + switch (i) + { + case 0: if (((buf0[0] >> 0) & 0xFF) == p0) buf0[0] = (buf0[0] & 0xFFFFFF00) | p1 << 0; break; + case 1: if (((buf0[0] >> 8) & 0xFF) == p0) buf0[0] = (buf0[0] & 0xFFFF00FF) | p1 << 8; break; + case 2: if (((buf0[0] >> 16) & 0xFF) == p0) buf0[0] = (buf0[0] & 0xFF00FFFF) | p1 << 16; break; + case 3: if (((buf0[0] >> 24) & 0xFF) == p0) buf0[0] = (buf0[0] & 0x00FFFFFF) | p1 << 24; break; + case 4: if (((buf0[1] >> 0) & 0xFF) == p0) buf0[1] = (buf0[1] & 0xFFFFFF00) | p1 << 0; break; + case 5: if (((buf0[1] >> 8) & 0xFF) == p0) buf0[1] = (buf0[1] & 0xFFFF00FF) | p1 << 8; break; + case 6: if (((buf0[1] >> 16) & 0xFF) == p0) buf0[1] = (buf0[1] & 0xFF00FFFF) | p1 << 16; break; + case 7: if (((buf0[1] >> 24) & 0xFF) == p0) buf0[1] = (buf0[1] & 0x00FFFFFF) | p1 << 24; break; + case 8: if (((buf0[2] >> 0) & 0xFF) == p0) buf0[2] = (buf0[2] & 0xFFFFFF00) | p1 << 0; break; + case 9: if (((buf0[2] >> 8) & 0xFF) == p0) buf0[2] = (buf0[2] & 0xFFFF00FF) | p1 << 8; break; + case 10: if (((buf0[2] >> 16) & 0xFF) == p0) buf0[2] = (buf0[2] & 0xFF00FFFF) | p1 << 16; break; + case 11: if (((buf0[2] >> 24) & 0xFF) == p0) buf0[2] = (buf0[2] & 0x00FFFFFF) | p1 << 24; break; + case 12: if (((buf0[3] >> 0) & 0xFF) == p0) buf0[3] = (buf0[3] & 0xFFFFFF00) | p1 << 0; break; + case 13: if (((buf0[3] >> 8) & 0xFF) == p0) buf0[3] = (buf0[3] & 0xFFFF00FF) | p1 << 8; break; + case 14: if (((buf0[3] >> 16) & 0xFF) == p0) buf0[3] = (buf0[3] & 0xFF00FFFF) | p1 << 16; break; + case 15: if (((buf0[3] >> 24) & 0xFF) == p0) buf0[3] = (buf0[3] & 0x00FFFFFF) | p1 << 24; break; + case 16: if (((buf1[0] >> 0) & 0xFF) == p0) buf1[0] = (buf1[0] & 0xFFFFFF00) | p1 << 0; break; + case 17: if (((buf1[0] >> 8) & 0xFF) == p0) buf1[0] = (buf1[0] & 0xFFFF00FF) | p1 << 8; break; + case 18: if (((buf1[0] >> 16) & 0xFF) == p0) buf1[0] = (buf1[0] & 0xFF00FFFF) | p1 << 16; break; + case 19: if (((buf1[0] >> 24) & 0xFF) == p0) buf1[0] = (buf1[0] & 0x00FFFFFF) | p1 << 24; break; + case 20: if (((buf1[1] >> 0) & 0xFF) == p0) buf1[1] = (buf1[1] & 0xFFFFFF00) | p1 << 0; break; + case 21: if (((buf1[1] >> 8) & 0xFF) == p0) buf1[1] = (buf1[1] & 0xFFFF00FF) | p1 << 8; break; + case 22: if (((buf1[1] >> 16) & 0xFF) == p0) buf1[1] = (buf1[1] & 0xFF00FFFF) | p1 << 16; break; + case 23: if (((buf1[1] >> 24) & 0xFF) == p0) buf1[1] = (buf1[1] & 0x00FFFFFF) | p1 << 24; break; + case 24: if (((buf1[2] >> 0) & 0xFF) == p0) buf1[2] = (buf1[2] & 0xFFFFFF00) | p1 << 0; break; + case 25: if (((buf1[2] >> 8) & 0xFF) == p0) buf1[2] = (buf1[2] & 0xFFFF00FF) | p1 << 8; break; + case 26: if (((buf1[2] >> 16) & 0xFF) == p0) buf1[2] = (buf1[2] & 0xFF00FFFF) | p1 << 16; break; + case 27: if (((buf1[2] >> 24) & 0xFF) == p0) buf1[2] = (buf1[2] & 0x00FFFFFF) | p1 << 24; break; + case 28: if (((buf1[3] >> 0) & 0xFF) == p0) buf1[3] = (buf1[3] & 0xFFFFFF00) | p1 << 0; break; + case 29: if (((buf1[3] >> 8) & 0xFF) == p0) buf1[3] = (buf1[3] & 0xFFFF00FF) | p1 << 8; break; + case 30: if (((buf1[3] >> 16) & 0xFF) == p0) buf1[3] = (buf1[3] & 0xFF00FFFF) | p1 << 16; break; + case 31: if (((buf1[3] >> 24) & 0xFF) == p0) buf1[3] = (buf1[3] & 0x00FFFFFF) | p1 << 24; break; + } + } + + return in_len; +} + +static uint rule_op_mangle_purgechar (const uint p0, const uint p1, uint32_t buf0[4], uint32_t buf1[4], const uint in_len) +{ + // TODO + return in_len; +} + +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) +{ + // TODO + return in_len; +} + +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) +{ + if ( in_len == 0) return (in_len); + if ((in_len + p0) >= 32) return (in_len); + + uint out_len = in_len; + + const uint32_t tmp = buf0[0] & 0xFF; + + rshift_block_N (buf0, buf1, buf0, buf1, p0); + + switch (p0) + { + case 1: buf0[0] |= tmp << 0; + break; + case 2: buf0[0] |= tmp << 0 | tmp << 8; + break; + case 3: buf0[0] |= tmp << 0 | tmp << 8 | tmp << 16; + break; + case 4: buf0[0] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24; + break; + case 5: buf0[0] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24; + buf0[1] |= tmp << 0; + break; + case 6: buf0[0] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24; + buf0[1] |= tmp << 0 | tmp << 8; + break; + case 7: buf0[0] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24; + buf0[1] |= tmp << 0 | tmp << 8 | tmp << 16; + break; + case 8: buf0[0] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24; + buf0[1] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24; + break; + case 9: buf0[0] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24; + buf0[1] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24; + buf0[2] |= tmp << 0; + break; + case 10: buf0[0] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24; + buf0[1] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24; + buf0[2] |= tmp << 0 | tmp << 8; + break; + case 11: buf0[0] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24; + buf0[1] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24; + buf0[2] |= tmp << 0 | tmp << 8 | tmp << 16; + break; + case 12: buf0[0] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24; + buf0[1] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24; + buf0[2] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24; + break; + case 13: buf0[0] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24; + buf0[1] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24; + buf0[2] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24; + buf0[3] |= tmp << 0; + break; + case 14: buf0[0] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24; + buf0[1] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24; + buf0[2] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24; + buf0[3] |= tmp << 0 | tmp << 8; + break; + case 15: buf0[0] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24; + buf0[1] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24; + buf0[2] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24; + buf0[3] |= tmp << 0 | tmp << 8 | tmp << 16; + break; + case 16: buf0[0] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24; + buf0[1] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24; + buf0[2] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24; + buf0[3] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24; + break; + case 17: buf0[0] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24; + buf0[1] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24; + buf0[2] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24; + buf0[3] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24; + buf1[0] |= tmp << 0; + break; + case 18: buf0[0] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24; + buf0[1] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24; + buf0[2] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24; + buf0[3] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24; + buf1[0] |= tmp << 0 | tmp << 8; + break; + case 19: buf0[0] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24; + buf0[1] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24; + buf0[2] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24; + buf0[3] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24; + buf1[0] |= tmp << 0 | tmp << 8 | tmp << 16; + break; + case 20: buf0[0] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24; + buf0[1] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24; + buf0[2] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24; + buf0[3] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24; + buf1[0] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24; + break; + case 21: buf0[0] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24; + buf0[1] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24; + buf0[2] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24; + buf0[3] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24; + buf1[0] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24; + buf1[1] |= tmp << 0; + break; + case 22: buf0[0] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24; + buf0[1] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24; + buf0[2] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24; + buf0[3] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24; + buf1[0] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24; + buf1[1] |= tmp << 0 | tmp << 8; + break; + case 23: buf0[0] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24; + buf0[1] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24; + buf0[2] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24; + buf0[3] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24; + buf1[0] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24; + buf1[1] |= tmp << 0 | tmp << 8 | tmp << 16; + break; + case 24: buf0[0] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24; + buf0[1] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24; + buf0[2] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24; + buf0[3] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24; + buf1[0] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24; + buf1[1] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24; + break; + case 25: buf0[0] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24; + buf0[1] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24; + buf0[2] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24; + buf0[3] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24; + buf1[0] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24; + buf1[1] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24; + buf1[2] |= tmp << 0; + break; + case 26: buf0[0] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24; + buf0[1] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24; + buf0[2] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24; + buf0[3] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24; + buf1[0] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24; + buf1[1] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24; + buf1[2] |= tmp << 0 | tmp << 8; + break; + case 27: buf0[0] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24; + buf0[1] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24; + buf0[2] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24; + buf0[3] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24; + buf1[0] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24; + buf1[1] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24; + buf1[2] |= tmp << 0 | tmp << 8 | tmp << 16; + break; + case 28: buf0[0] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24; + buf0[1] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24; + buf0[2] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24; + buf0[3] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24; + buf1[0] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24; + buf1[1] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24; + buf1[2] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24; + break; + case 29: buf0[0] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24; + buf0[1] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24; + buf0[2] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24; + buf0[3] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24; + buf1[0] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24; + buf1[1] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24; + buf1[2] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24; + buf1[3] |= tmp << 0; + break; + case 30: buf0[0] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24; + buf0[1] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24; + buf0[2] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24; + buf0[3] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24; + buf1[0] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24; + buf1[1] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24; + buf1[2] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24; + buf1[3] |= tmp << 0 | tmp << 8; + break; + case 31: buf0[0] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24; + buf0[1] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24; + buf0[2] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24; + buf0[3] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24; + buf1[0] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24; + buf1[1] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24; + buf1[2] |= tmp << 0 | tmp << 8 | tmp << 16 | tmp << 24; + buf1[3] |= tmp << 0 | tmp << 8 | tmp << 16; + break; + } + + out_len += p0; + + return out_len; +} + +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) +{ + if ( in_len == 0) return (in_len); + if ((in_len + p0) >= 32) return (in_len); + + const uint in_len1 = in_len - 1; + + const uint sh = (in_len1 & 3) * 8; + + uint32_t tmp = 0; + + switch (in_len1 / 4) + { + case 0: tmp = (buf0[0] >> sh) & 0xff; break; + case 1: tmp = (buf0[1] >> sh) & 0xff; break; + case 2: tmp = (buf0[2] >> sh) & 0xff; break; + case 3: tmp = (buf0[3] >> sh) & 0xff; break; + case 4: tmp = (buf1[0] >> sh) & 0xff; break; + case 5: tmp = (buf1[1] >> sh) & 0xff; break; + case 6: tmp = (buf1[2] >> sh) & 0xff; break; + case 7: tmp = (buf1[3] >> sh) & 0xff; break; + } + + uint out_len = in_len; + + for (uint i = 0; i < p0; i++) + { + append_block1 (out_len, buf0, buf1, tmp); + + out_len++; + } + + return out_len; +} + +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) +{ + if ( in_len == 0) return (in_len); + if ((in_len + in_len) >= 32) return (in_len); + + uint out_len = in_len; + + uint32_t tib40[4]; + uint32_t tib41[4]; + + tib40[0] = ((buf0[0] & 0x000000FF) << 0) | ((buf0[0] & 0x0000FF00) << 8); + tib40[1] = ((buf0[0] & 0x00FF0000) >> 16) | ((buf0[0] & 0xFF000000) >> 8); + tib40[2] = ((buf0[1] & 0x000000FF) << 0) | ((buf0[1] & 0x0000FF00) << 8); + tib40[3] = ((buf0[1] & 0x00FF0000) >> 16) | ((buf0[1] & 0xFF000000) >> 8); + tib41[0] = ((buf0[2] & 0x000000FF) << 0) | ((buf0[2] & 0x0000FF00) << 8); + tib41[1] = ((buf0[2] & 0x00FF0000) >> 16) | ((buf0[2] & 0xFF000000) >> 8); + tib41[2] = ((buf0[3] & 0x000000FF) << 0) | ((buf0[3] & 0x0000FF00) << 8); + tib41[3] = ((buf0[3] & 0x00FF0000) >> 16) | ((buf0[3] & 0xFF000000) >> 8); + + buf0[0] = tib40[0] | (tib40[0] << 8); + buf0[1] = tib40[1] | (tib40[1] << 8); + buf0[2] = tib40[2] | (tib40[2] << 8); + buf0[3] = tib40[3] | (tib40[3] << 8); + buf1[0] = tib41[0] | (tib41[0] << 8); + buf1[1] = tib41[1] | (tib41[1] << 8); + buf1[2] = tib41[2] | (tib41[2] << 8); + buf1[3] = tib41[3] | (tib41[3] << 8); + + out_len = out_len + out_len; + + return out_len; +} + +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) +{ + if (in_len < 2) return (in_len); + + buf0[0] = (buf0[0] & 0xFFFF0000) | ((buf0[0] << 8) & 0x0000FF00) | ((buf0[0] >> 8) & 0x000000FF); + + return in_len; +} + +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) +{ + if (in_len < 2) return (in_len); + + switch (in_len) + { + case 2: buf0[0] = ((buf0[0] << 8) & 0x0000FF00) | ((buf0[0] >> 8) & 0x000000FF); + break; + case 3: buf0[0] = (buf0[0] & 0x000000FF) | ((buf0[0] << 8) & 0x00FF0000) | ((buf0[0] >> 8) & 0x0000FF00); + break; + case 4: buf0[0] = (buf0[0] & 0x0000FFFF) | ((buf0[0] << 8) & 0xFF000000) | ((buf0[0] >> 8) & 0x00FF0000); + break; + case 5: buf0[1] = (buf0[0] & 0xFF000000) | buf0[1]; + buf0[0] = (buf0[0] & 0x00FFFFFF) | (buf0[1] << 24); + buf0[1] = (buf0[1] >> 24); + break; + case 6: buf0[1] = ((buf0[1] << 8) & 0x0000FF00) | ((buf0[1] >> 8) & 0x000000FF); + break; + case 7: buf0[1] = (buf0[1] & 0x000000FF) | ((buf0[1] << 8) & 0x00FF0000) | ((buf0[1] >> 8) & 0x0000FF00); + break; + case 8: buf0[1] = (buf0[1] & 0x0000FFFF) | ((buf0[1] << 8) & 0xFF000000) | ((buf0[1] >> 8) & 0x00FF0000); + break; + case 9: buf0[2] = (buf0[1] & 0xFF000000) | buf0[2]; + buf0[1] = (buf0[1] & 0x00FFFFFF) | (buf0[2] << 24); + buf0[2] = (buf0[2] >> 24); + break; + case 10: buf0[2] = ((buf0[2] << 8) & 0x0000FF00) | ((buf0[2] >> 8) & 0x000000FF); + break; + case 11: buf0[2] = (buf0[2] & 0x000000FF) | ((buf0[2] << 8) & 0x00FF0000) | ((buf0[2] >> 8) & 0x0000FF00); + break; + case 12: buf0[2] = (buf0[2] & 0x0000FFFF) | ((buf0[2] << 8) & 0xFF000000) | ((buf0[2] >> 8) & 0x00FF0000); + break; + case 13: buf0[3] = (buf0[2] & 0xFF000000) | buf0[3]; + buf0[2] = (buf0[2] & 0x00FFFFFF) | (buf0[3] << 24); + buf0[3] = (buf0[3] >> 24); + break; + case 14: buf0[3] = ((buf0[3] << 8) & 0x0000FF00) | ((buf0[3] >> 8) & 0x000000FF); + break; + case 15: buf0[3] = (buf0[3] & 0x000000FF) | ((buf0[3] << 8) & 0x00FF0000) | ((buf0[3] >> 8) & 0x0000FF00); + break; + case 16: buf0[3] = (buf0[3] & 0x0000FFFF) | ((buf0[3] << 8) & 0xFF000000) | ((buf0[3] >> 8) & 0x00FF0000); + break; + case 17: buf1[0] = (buf0[3] & 0xFF000000) | buf1[0]; + buf0[3] = (buf0[3] & 0x00FFFFFF) | (buf1[0] << 24); + buf1[0] = (buf1[0] >> 24); + break; + case 18: buf1[0] = ((buf1[0] << 8) & 0x0000FF00) | ((buf1[0] >> 8) & 0x000000FF); + break; + case 19: buf1[0] = (buf1[0] & 0x000000FF) | ((buf1[0] << 8) & 0x00FF0000) | ((buf1[0] >> 8) & 0x0000FF00); + break; + case 20: buf1[0] = (buf1[0] & 0x0000FFFF) | ((buf1[0] << 8) & 0xFF000000) | ((buf1[0] >> 8) & 0x00FF0000); + break; + case 21: buf1[1] = (buf1[0] & 0xFF000000) | buf1[1]; + buf1[0] = (buf1[0] & 0x00FFFFFF) | (buf1[1] << 24); + buf1[1] = (buf1[1] >> 24); + break; + case 22: buf1[1] = ((buf1[1] << 8) & 0x0000FF00) | ((buf1[1] >> 8) & 0x000000FF); + break; + case 23: buf1[1] = (buf1[1] & 0x000000FF) | ((buf1[1] << 8) & 0x00FF0000) | ((buf1[1] >> 8) & 0x0000FF00); + break; + case 24: buf1[1] = (buf1[1] & 0x0000FFFF) | ((buf1[1] << 8) & 0xFF000000) | ((buf1[1] >> 8) & 0x00FF0000); + break; + case 25: buf1[2] = (buf1[1] & 0xFF000000) | buf1[2]; + buf1[1] = (buf1[1] & 0x00FFFFFF) | (buf1[2] << 24); + buf1[2] = (buf1[2] >> 24); + break; + case 26: buf1[2] = ((buf1[2] << 8) & 0x0000FF00) | ((buf1[2] >> 8) & 0x000000FF); + break; + case 27: buf1[2] = (buf1[2] & 0x000000FF) | ((buf1[2] << 8) & 0x00FF0000) | ((buf1[2] >> 8) & 0x0000FF00); + break; + case 28: buf1[2] = (buf1[2] & 0x0000FFFF) | ((buf1[2] << 8) & 0xFF000000) | ((buf1[2] >> 8) & 0x00FF0000); + break; + case 29: buf1[3] = (buf1[2] & 0xFF000000) | buf1[3]; + buf1[2] = (buf1[2] & 0x00FFFFFF) | (buf1[3] << 24); + buf1[3] = (buf1[3] >> 24); + break; + case 30: buf1[3] = ((buf1[3] << 8) & 0x0000FF00) | ((buf1[3] >> 8) & 0x000000FF); + break; + case 31: buf1[3] = (buf1[3] & 0x000000FF) | ((buf1[3] << 8) & 0x00FF0000) | ((buf1[3] >> 8) & 0x0000FF00); + break; + } + + return in_len; +} + +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) +{ + if (p0 >= in_len) return (in_len); + if (p1 >= in_len) return (in_len); + + uint32_t tmp0 = 0; + uint32_t tmp1 = 0; + + switch (p0) + { + case 0: tmp0 = (buf0[0] >> 0) & 0xFF; + break; + case 1: tmp0 = (buf0[0] >> 8) & 0xFF; + break; + case 2: tmp0 = (buf0[0] >> 16) & 0xFF; + break; + case 3: tmp0 = (buf0[0] >> 24) & 0xFF; + break; + case 4: tmp0 = (buf0[1] >> 0) & 0xFF; + break; + case 5: tmp0 = (buf0[1] >> 8) & 0xFF; + break; + case 6: tmp0 = (buf0[1] >> 16) & 0xFF; + break; + case 7: tmp0 = (buf0[1] >> 24) & 0xFF; + break; + case 8: tmp0 = (buf0[2] >> 0) & 0xFF; + break; + case 9: tmp0 = (buf0[2] >> 8) & 0xFF; + break; + case 10: tmp0 = (buf0[2] >> 16) & 0xFF; + break; + case 11: tmp0 = (buf0[2] >> 24) & 0xFF; + break; + case 12: tmp0 = (buf0[3] >> 0) & 0xFF; + break; + case 13: tmp0 = (buf0[3] >> 8) & 0xFF; + break; + case 14: tmp0 = (buf0[3] >> 16) & 0xFF; + break; + case 15: tmp0 = (buf0[3] >> 24) & 0xFF; + break; + case 16: tmp0 = (buf1[0] >> 0) & 0xFF; + break; + case 17: tmp0 = (buf1[0] >> 8) & 0xFF; + break; + case 18: tmp0 = (buf1[0] >> 16) & 0xFF; + break; + case 19: tmp0 = (buf1[0] >> 24) & 0xFF; + break; + case 20: tmp0 = (buf1[1] >> 0) & 0xFF; + break; + case 21: tmp0 = (buf1[1] >> 8) & 0xFF; + break; + case 22: tmp0 = (buf1[1] >> 16) & 0xFF; + break; + case 23: tmp0 = (buf1[1] >> 24) & 0xFF; + break; + case 24: tmp0 = (buf1[2] >> 0) & 0xFF; + break; + case 25: tmp0 = (buf1[2] >> 8) & 0xFF; + break; + case 26: tmp0 = (buf1[2] >> 16) & 0xFF; + break; + case 27: tmp0 = (buf1[2] >> 24) & 0xFF; + break; + case 28: tmp0 = (buf1[3] >> 0) & 0xFF; + break; + case 29: tmp0 = (buf1[3] >> 8) & 0xFF; + break; + case 30: tmp0 = (buf1[3] >> 16) & 0xFF; + break; + case 31: tmp0 = (buf1[3] >> 24) & 0xFF; + break; + } + + switch (p1) + { + case 0: tmp1 = (buf0[0] >> 0) & 0xff; + buf0[0] = (buf0[0] & 0xffffff00) | tmp0 << 0; + break; + case 1: tmp1 = (buf0[0] >> 8) & 0xff; + buf0[0] = (buf0[0] & 0xffff00ff) | tmp0 << 8; + break; + case 2: tmp1 = (buf0[0] >> 16) & 0xff; + buf0[0] = (buf0[0] & 0xff00ffff) | tmp0 << 16; + break; + case 3: tmp1 = (buf0[0] >> 24) & 0xff; + buf0[0] = (buf0[0] & 0x00ffffff) | tmp0 << 24; + break; + case 4: tmp1 = (buf0[1] >> 0) & 0xff; + buf0[1] = (buf0[1] & 0xffffff00) | tmp0 << 0; + break; + case 5: tmp1 = (buf0[1] >> 8) & 0xff; + buf0[1] = (buf0[1] & 0xffff00ff) | tmp0 << 8; + break; + case 6: tmp1 = (buf0[1] >> 16) & 0xff; + buf0[1] = (buf0[1] & 0xff00ffff) | tmp0 << 16; + break; + case 7: tmp1 = (buf0[1] >> 24) & 0xff; + buf0[1] = (buf0[1] & 0x00ffffff) | tmp0 << 24; + break; + case 8: tmp1 = (buf0[2] >> 0) & 0xff; + buf0[2] = (buf0[2] & 0xffffff00) | tmp0 << 0; + break; + case 9: tmp1 = (buf0[2] >> 8) & 0xff; + buf0[2] = (buf0[2] & 0xffff00ff) | tmp0 << 8; + break; + case 10: tmp1 = (buf0[2] >> 16) & 0xff; + buf0[2] = (buf0[2] & 0xff00ffff) | tmp0 << 16; + break; + case 11: tmp1 = (buf0[2] >> 24) & 0xff; + buf0[2] = (buf0[2] & 0x00ffffff) | tmp0 << 24; + break; + case 12: tmp1 = (buf0[3] >> 0) & 0xff; + buf0[3] = (buf0[3] & 0xffffff00) | tmp0 << 0; + break; + case 13: tmp1 = (buf0[3] >> 8) & 0xff; + buf0[3] = (buf0[3] & 0xffff00ff) | tmp0 << 8; + break; + case 14: tmp1 = (buf0[3] >> 16) & 0xff; + buf0[3] = (buf0[3] & 0xff00ffff) | tmp0 << 16; + break; + case 15: tmp1 = (buf0[3] >> 24) & 0xff; + buf0[3] = (buf0[3] & 0x00ffffff) | tmp0 << 24; + break; + case 16: tmp1 = (buf1[0] >> 0) & 0xff; + buf1[0] = (buf1[0] & 0xffffff00) | tmp0 << 0; + break; + case 17: tmp1 = (buf1[0] >> 8) & 0xff; + buf1[0] = (buf1[0] & 0xffff00ff) | tmp0 << 8; + break; + case 18: tmp1 = (buf1[0] >> 16) & 0xff; + buf1[0] = (buf1[0] & 0xff00ffff) | tmp0 << 16; + break; + case 19: tmp1 = (buf1[0] >> 24) & 0xff; + buf1[0] = (buf1[0] & 0x00ffffff) | tmp0 << 24; + break; + case 20: tmp1 = (buf1[1] >> 0) & 0xff; + buf1[1] = (buf1[1] & 0xffffff00) | tmp0 << 0; + break; + case 21: tmp1 = (buf1[1] >> 8) & 0xff; + buf1[1] = (buf1[1] & 0xffff00ff) | tmp0 << 8; + break; + case 22: tmp1 = (buf1[1] >> 16) & 0xff; + buf1[1] = (buf1[1] & 0xff00ffff) | tmp0 << 16; + break; + case 23: tmp1 = (buf1[1] >> 24) & 0xff; + buf1[1] = (buf1[1] & 0x00ffffff) | tmp0 << 24; + break; + case 24: tmp1 = (buf1[2] >> 0) & 0xff; + buf1[2] = (buf1[2] & 0xffffff00) | tmp0 << 0; + break; + case 25: tmp1 = (buf1[2] >> 8) & 0xff; + buf1[2] = (buf1[2] & 0xffff00ff) | tmp0 << 8; + break; + case 26: tmp1 = (buf1[2] >> 16) & 0xff; + buf1[2] = (buf1[2] & 0xff00ffff) | tmp0 << 16; + break; + case 27: tmp1 = (buf1[2] >> 24) & 0xff; + buf1[2] = (buf1[2] & 0x00ffffff) | tmp0 << 24; + break; + case 28: tmp1 = (buf1[3] >> 0) & 0xff; + buf1[3] = (buf1[3] & 0xffffff00) | tmp0 << 0; + break; + case 29: tmp1 = (buf1[3] >> 8) & 0xff; + buf1[3] = (buf1[3] & 0xffff00ff) | tmp0 << 8; + break; + case 30: tmp1 = (buf1[3] >> 16) & 0xff; + buf1[3] = (buf1[3] & 0xff00ffff) | tmp0 << 16; + break; + case 31: tmp1 = (buf1[3] >> 24) & 0xff; + buf1[3] = (buf1[3] & 0x00ffffff) | tmp0 << 24; + break; + } + + switch (p0) + { + case 0: buf0[0] = (buf0[0] & 0xffffff00) | tmp1 << 0; + break; + case 1: buf0[0] = (buf0[0] & 0xffff00ff) | tmp1 << 8; + break; + case 2: buf0[0] = (buf0[0] & 0xff00ffff) | tmp1 << 16; + break; + case 3: buf0[0] = (buf0[0] & 0x00ffffff) | tmp1 << 24; + break; + case 4: buf0[1] = (buf0[1] & 0xffffff00) | tmp1 << 0; + break; + case 5: buf0[1] = (buf0[1] & 0xffff00ff) | tmp1 << 8; + break; + case 6: buf0[1] = (buf0[1] & 0xff00ffff) | tmp1 << 16; + break; + case 7: buf0[1] = (buf0[1] & 0x00ffffff) | tmp1 << 24; + break; + case 8: buf0[2] = (buf0[2] & 0xffffff00) | tmp1 << 0; + break; + case 9: buf0[2] = (buf0[2] & 0xffff00ff) | tmp1 << 8; + break; + case 10: buf0[2] = (buf0[2] & 0xff00ffff) | tmp1 << 16; + break; + case 11: buf0[2] = (buf0[2] & 0x00ffffff) | tmp1 << 24; + break; + case 12: buf0[3] = (buf0[3] & 0xffffff00) | tmp1 << 0; + break; + case 13: buf0[3] = (buf0[3] & 0xffff00ff) | tmp1 << 8; + break; + case 14: buf0[3] = (buf0[3] & 0xff00ffff) | tmp1 << 16; + break; + case 15: buf0[3] = (buf0[3] & 0x00ffffff) | tmp1 << 24; + break; + case 16: buf1[0] = (buf1[0] & 0xffffff00) | tmp1 << 0; + break; + case 17: buf1[0] = (buf1[0] & 0xffff00ff) | tmp1 << 8; + break; + case 18: buf1[0] = (buf1[0] & 0xff00ffff) | tmp1 << 16; + break; + case 19: buf1[0] = (buf1[0] & 0x00ffffff) | tmp1 << 24; + break; + case 20: buf1[1] = (buf1[1] & 0xffffff00) | tmp1 << 0; + break; + case 21: buf1[1] = (buf1[1] & 0xffff00ff) | tmp1 << 8; + break; + case 22: buf1[1] = (buf1[1] & 0xff00ffff) | tmp1 << 16; + break; + case 23: buf1[1] = (buf1[1] & 0x00ffffff) | tmp1 << 24; + break; + case 24: buf1[2] = (buf1[2] & 0xffffff00) | tmp1 << 0; + break; + case 25: buf1[2] = (buf1[2] & 0xffff00ff) | tmp1 << 8; + break; + case 26: buf1[2] = (buf1[2] & 0xff00ffff) | tmp1 << 16; + break; + case 27: buf1[2] = (buf1[2] & 0x00ffffff) | tmp1 << 24; + break; + case 28: buf1[3] = (buf1[3] & 0xffffff00) | tmp1 << 0; + break; + case 29: buf1[3] = (buf1[3] & 0xffff00ff) | tmp1 << 8; + break; + case 30: buf1[3] = (buf1[3] & 0xff00ffff) | tmp1 << 16; + break; + case 31: buf1[3] = (buf1[3] & 0x00ffffff) | tmp1 << 24; + break; + } + + return in_len; +} + +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) +{ + if (p0 >= in_len) return (in_len); + + const uint mr = 0xff << ((p0 & 3) * 8); + const uint ml = ~mr; + + switch (p0 / 4) + { + case 0: buf0[0] = (buf0[0] & ml) | (((buf0[0] & mr) << 1) & mr); break; + case 1: buf0[1] = (buf0[1] & ml) | (((buf0[1] & mr) << 1) & mr); break; + case 2: buf0[2] = (buf0[2] & ml) | (((buf0[2] & mr) << 1) & mr); break; + case 3: buf0[3] = (buf0[3] & ml) | (((buf0[3] & mr) << 1) & mr); break; + case 4: buf1[0] = (buf1[0] & ml) | (((buf1[0] & mr) << 1) & mr); break; + case 5: buf1[1] = (buf1[1] & ml) | (((buf1[1] & mr) << 1) & mr); break; + case 6: buf1[2] = (buf1[2] & ml) | (((buf1[2] & mr) << 1) & mr); break; + case 7: buf1[3] = (buf1[3] & ml) | (((buf1[3] & mr) << 1) & mr); break; + } + + return in_len; +} + +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) +{ + if (p0 >= in_len) return (in_len); + + const uint mr = 0xff << ((p0 & 3) * 8); + const uint ml = ~mr; + + switch (p0 / 4) + { + case 0: buf0[0] = (buf0[0] & ml) | (((buf0[0] & mr) >> 1) & mr); break; + case 1: buf0[1] = (buf0[1] & ml) | (((buf0[1] & mr) >> 1) & mr); break; + case 2: buf0[2] = (buf0[2] & ml) | (((buf0[2] & mr) >> 1) & mr); break; + case 3: buf0[3] = (buf0[3] & ml) | (((buf0[3] & mr) >> 1) & mr); break; + case 4: buf1[0] = (buf1[0] & ml) | (((buf1[0] & mr) >> 1) & mr); break; + case 5: buf1[1] = (buf1[1] & ml) | (((buf1[1] & mr) >> 1) & mr); break; + case 6: buf1[2] = (buf1[2] & ml) | (((buf1[2] & mr) >> 1) & mr); break; + case 7: buf1[3] = (buf1[3] & ml) | (((buf1[3] & mr) >> 1) & mr); break; + } + + return in_len; +} + +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) +{ + if (p0 >= in_len) return (in_len); + + const uint mr = 0xff << ((p0 & 3) * 8); + const uint ml = ~mr; + + const uint n = 0x01010101 & mr; + + switch (p0 / 4) + { + case 0: buf0[0] = (buf0[0] & ml) | (((buf0[0] & mr) + n) & mr); break; + case 1: buf0[1] = (buf0[1] & ml) | (((buf0[1] & mr) + n) & mr); break; + case 2: buf0[2] = (buf0[2] & ml) | (((buf0[2] & mr) + n) & mr); break; + case 3: buf0[3] = (buf0[3] & ml) | (((buf0[3] & mr) + n) & mr); break; + case 4: buf1[0] = (buf1[0] & ml) | (((buf1[0] & mr) + n) & mr); break; + case 5: buf1[1] = (buf1[1] & ml) | (((buf1[1] & mr) + n) & mr); break; + case 6: buf1[2] = (buf1[2] & ml) | (((buf1[2] & mr) + n) & mr); break; + case 7: buf1[3] = (buf1[3] & ml) | (((buf1[3] & mr) + n) & mr); break; + } + + return in_len; +} + +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) +{ + if (p0 >= in_len) return (in_len); + + const uint mr = 0xff << ((p0 & 3) * 8); + const uint ml = ~mr; + + const uint n = 0x01010101 & mr; + + switch (p0 / 4) + { + case 0: buf0[0] = (buf0[0] & ml) | (((buf0[0] & mr) - n) & mr); break; + case 1: buf0[1] = (buf0[1] & ml) | (((buf0[1] & mr) - n) & mr); break; + case 2: buf0[2] = (buf0[2] & ml) | (((buf0[2] & mr) - n) & mr); break; + case 3: buf0[3] = (buf0[3] & ml) | (((buf0[3] & mr) - n) & mr); break; + case 4: buf1[0] = (buf1[0] & ml) | (((buf1[0] & mr) - n) & mr); break; + case 5: buf1[1] = (buf1[1] & ml) | (((buf1[1] & mr) - n) & mr); break; + case 6: buf1[2] = (buf1[2] & ml) | (((buf1[2] & mr) - n) & mr); break; + case 7: buf1[3] = (buf1[3] & ml) | (((buf1[3] & mr) - n) & mr); break; + } + + return in_len; +} + +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) +{ + if ((p0 + 1) >= in_len) return (in_len); + + uint32_t tib40[4]; + uint32_t tib41[4]; + + lshift_block (buf0, buf1, tib40, tib41); + + const uint mr = 0xff << ((p0 & 3) * 8); + const uint ml = ~mr; + + switch (p0 / 4) + { + case 0: buf0[0] = (buf0[0] & ml) | (tib40[0] & mr); break; + case 1: buf0[1] = (buf0[1] & ml) | (tib40[1] & mr); break; + case 2: buf0[2] = (buf0[2] & ml) | (tib40[2] & mr); break; + case 3: buf0[3] = (buf0[3] & ml) | (tib40[3] & mr); break; + case 4: buf1[0] = (buf1[0] & ml) | (tib41[0] & mr); break; + case 5: buf1[1] = (buf1[1] & ml) | (tib41[1] & mr); break; + case 6: buf1[2] = (buf1[2] & ml) | (tib41[2] & mr); break; + case 7: buf1[3] = (buf1[3] & ml) | (tib41[3] & mr); break; + } + + return in_len; +} + +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) +{ + if (p0 == 0) return (in_len); + + if (p0 >= in_len) return (in_len); + + uint32_t tib40[4]; + uint32_t tib41[4]; + + rshift_block (buf0, buf1, tib40, tib41); + + const uint mr = 0xff << ((p0 & 3) * 8); + const uint ml = ~mr; + + switch (p0 / 4) + { + case 0: buf0[0] = (buf0[0] & ml) | (tib40[0] & mr); break; + case 1: buf0[1] = (buf0[1] & ml) | (tib40[1] & mr); break; + case 2: buf0[2] = (buf0[2] & ml) | (tib40[2] & mr); break; + case 3: buf0[3] = (buf0[3] & ml) | (tib40[3] & mr); break; + case 4: buf1[0] = (buf1[0] & ml) | (tib41[0] & mr); break; + case 5: buf1[1] = (buf1[1] & ml) | (tib41[1] & mr); break; + case 6: buf1[2] = (buf1[2] & ml) | (tib41[2] & mr); break; + case 7: buf1[3] = (buf1[3] & ml) | (tib41[3] & mr); break; + } + + return in_len; +} + +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) +{ + if (p0 > in_len) return (in_len); + + if ((in_len + p0) >= 32) return (in_len); + + uint out_len = in_len; + + uint32_t tib40[4]; + uint32_t tib41[4]; + + tib40[0] = buf0[0]; + tib40[1] = buf0[1]; + tib40[2] = buf0[2]; + tib40[3] = buf0[3]; + tib41[0] = buf1[0]; + tib41[1] = buf1[1]; + tib41[2] = buf1[2]; + tib41[3] = buf1[3]; + + truncate_right (tib40, tib41, p0); + + rshift_block_N (buf0, buf1, buf0, buf1, p0); + + buf0[0] |= tib40[0]; + buf0[1] |= tib40[1]; + buf0[2] |= tib40[2]; + buf0[3] |= tib40[3]; + buf1[0] |= tib41[0]; + buf1[1] |= tib41[1]; + buf1[2] |= tib41[2]; + buf1[3] |= tib41[3]; + + out_len += p0; + + return out_len; +} + +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) +{ + if (p0 > in_len) return (in_len); + + if ((in_len + p0) >= 32) return (in_len); + + uint out_len = in_len; + + uint32_t tib40[4]; + uint32_t tib41[4]; + + rshift_block_N (buf0, buf1, tib40, tib41, p0); + + truncate_left (tib40, tib41, out_len); + + buf0[0] |= tib40[0]; + buf0[1] |= tib40[1]; + buf0[2] |= tib40[2]; + buf0[3] |= tib40[3]; + buf1[0] |= tib41[0]; + buf1[1] |= tib41[1]; + buf1[2] |= tib41[2]; + buf1[3] |= tib41[3]; + + out_len += p0; + + return out_len; +} + +static uint rule_op_mangle_title (const uint p0, const uint p1, uint32_t buf0[4], uint32_t buf1[4], const uint in_len) +{ + buf0[0] |= (generate_cmask (buf0[0])); + buf0[1] |= (generate_cmask (buf0[1])); + buf0[2] |= (generate_cmask (buf0[2])); + buf0[3] |= (generate_cmask (buf0[3])); + buf1[0] |= (generate_cmask (buf1[0])); + buf1[1] |= (generate_cmask (buf1[1])); + buf1[2] |= (generate_cmask (buf1[2])); + buf1[3] |= (generate_cmask (buf1[3])); + + buf0[0] &= ~(0x00000020 & generate_cmask (buf0[0])); + + for (uint i = 0; i < in_len; i++) + { + uint32_t tmp0 = 0; + uint32_t tmp1 = 0; + + switch (i) + { + case 0: tmp0 = (buf0[0] >> 0) & 0xFF; + tmp1 = ~(0x00002000 & generate_cmask (buf0[0])); break; + case 1: tmp0 = (buf0[0] >> 8) & 0xFF; + tmp1 = ~(0x00200000 & generate_cmask (buf0[0])); break; + case 2: tmp0 = (buf0[0] >> 16) & 0xFF; + tmp1 = ~(0x20000000 & generate_cmask (buf0[0])); break; + case 3: tmp0 = (buf0[0] >> 24) & 0xFF; + tmp1 = ~(0x00000020 & generate_cmask (buf0[1])); break; + case 4: tmp0 = (buf0[1] >> 0) & 0xFF; + tmp1 = ~(0x00002000 & generate_cmask (buf0[1])); break; + case 5: tmp0 = (buf0[1] >> 8) & 0xFF; + tmp1 = ~(0x00200000 & generate_cmask (buf0[1])); break; + case 6: tmp0 = (buf0[1] >> 16) & 0xFF; + tmp1 = ~(0x20000000 & generate_cmask (buf0[1])); break; + case 7: tmp0 = (buf0[1] >> 24) & 0xFF; + tmp1 = ~(0x00000020 & generate_cmask (buf0[2])); break; + case 8: tmp0 = (buf0[2] >> 0) & 0xFF; + tmp1 = ~(0x00002000 & generate_cmask (buf0[2])); break; + case 9: tmp0 = (buf0[2] >> 8) & 0xFF; + tmp1 = ~(0x00200000 & generate_cmask (buf0[2])); break; + case 10: tmp0 = (buf0[2] >> 16) & 0xFF; + tmp1 = ~(0x20000000 & generate_cmask (buf0[2])); break; + case 11: tmp0 = (buf0[2] >> 24) & 0xFF; + tmp1 = ~(0x00000020 & generate_cmask (buf0[3])); break; + case 12: tmp0 = (buf0[3] >> 0) & 0xFF; + tmp1 = ~(0x00002000 & generate_cmask (buf0[3])); break; + case 13: tmp0 = (buf0[3] >> 8) & 0xFF; + tmp1 = ~(0x00200000 & generate_cmask (buf0[3])); break; + case 14: tmp0 = (buf0[3] >> 16) & 0xFF; + tmp1 = ~(0x20000000 & generate_cmask (buf0[3])); break; + case 15: tmp0 = (buf0[3] >> 24) & 0xFF; + tmp1 = ~(0x00000020 & generate_cmask (buf1[0])); break; + case 16: tmp0 = (buf1[0] >> 0) & 0xFF; + tmp1 = ~(0x00002000 & generate_cmask (buf1[0])); break; + case 17: tmp0 = (buf1[0] >> 8) & 0xFF; + tmp1 = ~(0x00200000 & generate_cmask (buf1[0])); break; + case 18: tmp0 = (buf1[0] >> 16) & 0xFF; + tmp1 = ~(0x20000000 & generate_cmask (buf1[0])); break; + case 19: tmp0 = (buf1[0] >> 24) & 0xFF; + tmp1 = ~(0x00000020 & generate_cmask (buf1[1])); break; + case 20: tmp0 = (buf1[1] >> 0) & 0xFF; + tmp1 = ~(0x00002000 & generate_cmask (buf1[1])); break; + case 21: tmp0 = (buf1[1] >> 8) & 0xFF; + tmp1 = ~(0x00200000 & generate_cmask (buf1[1])); break; + case 22: tmp0 = (buf1[1] >> 16) & 0xFF; + tmp1 = ~(0x20000000 & generate_cmask (buf1[1])); break; + case 23: tmp0 = (buf1[1] >> 24) & 0xFF; + tmp1 = ~(0x00000020 & generate_cmask (buf1[2])); break; + case 24: tmp0 = (buf1[2] >> 0) & 0xFF; + tmp1 = ~(0x00002000 & generate_cmask (buf1[2])); break; + case 25: tmp0 = (buf1[2] >> 8) & 0xFF; + tmp1 = ~(0x00200000 & generate_cmask (buf1[2])); break; + case 26: tmp0 = (buf1[2] >> 16) & 0xFF; + tmp1 = ~(0x20000000 & generate_cmask (buf1[2])); break; + case 27: tmp0 = (buf1[2] >> 24) & 0xFF; + tmp1 = ~(0x00000020 & generate_cmask (buf1[3])); break; + case 28: tmp0 = (buf1[3] >> 0) & 0xFF; + tmp1 = ~(0x00002000 & generate_cmask (buf1[3])); break; + case 29: tmp0 = (buf1[3] >> 8) & 0xFF; + tmp1 = ~(0x00200000 & generate_cmask (buf1[3])); break; + case 30: tmp0 = (buf1[3] >> 16) & 0xFF; + tmp1 = ~(0x20000000 & generate_cmask (buf1[3])); break; + } + + if (i < 3) + { + if (tmp0 == ' ') buf0[0] &= tmp1 ; + } + else if (i < 7) + { + if (tmp0 == ' ') buf0[1] &= tmp1 ; + } + else if (i < 11) + { + if (tmp0 == ' ') buf0[2] &= tmp1 ; + } + else if (i < 15) + { + if (tmp0 == ' ') buf0[3] &= tmp1 ; + } + else if (i < 19) + { + if (tmp0 == ' ') buf1[0] &= tmp1 ; + } + else if (i < 23) + { + if (tmp0 == ' ') buf1[1] &= tmp1 ; + } + else if (i < 27) + { + if (tmp0 == ' ') buf1[2] &= tmp1 ; + } + else if (i < 31) + { + if (tmp0 == ' ') buf1[3] &= tmp1 ; + } + } + + return in_len; +} + +uint apply_rule (const uint name, const uint p0, const uint p1, uint32_t buf0[4], uint32_t buf1[4], const uint in_len) +{ + uint out_len = in_len; + + switch (name) + { + case RULE_OP_MANGLE_LREST: out_len = rule_op_mangle_lrest (p0, p1, buf0, buf1, out_len); break; + case RULE_OP_MANGLE_UREST: out_len = rule_op_mangle_urest (p0, p1, buf0, buf1, out_len); break; + case RULE_OP_MANGLE_LREST_UFIRST: out_len = rule_op_mangle_lrest_ufirst (p0, p1, buf0, buf1, out_len); break; + case RULE_OP_MANGLE_UREST_LFIRST: out_len = rule_op_mangle_urest_lfirst (p0, p1, buf0, buf1, out_len); break; + case RULE_OP_MANGLE_TREST: out_len = rule_op_mangle_trest (p0, p1, buf0, buf1, out_len); break; + case RULE_OP_MANGLE_TOGGLE_AT: out_len = rule_op_mangle_toggle_at (p0, p1, buf0, buf1, out_len); break; + case RULE_OP_MANGLE_REVERSE: out_len = rule_op_mangle_reverse (p0, p1, buf0, buf1, out_len); break; + case RULE_OP_MANGLE_DUPEWORD: out_len = rule_op_mangle_dupeword (p0, p1, buf0, buf1, out_len); break; + case RULE_OP_MANGLE_DUPEWORD_TIMES: out_len = rule_op_mangle_dupeword_times (p0, p1, buf0, buf1, out_len); break; + case RULE_OP_MANGLE_REFLECT: out_len = rule_op_mangle_reflect (p0, p1, buf0, buf1, out_len); break; + case RULE_OP_MANGLE_APPEND: out_len = rule_op_mangle_append (p0, p1, buf0, buf1, out_len); break; + case RULE_OP_MANGLE_PREPEND: out_len = rule_op_mangle_prepend (p0, p1, buf0, buf1, out_len); break; + case RULE_OP_MANGLE_ROTATE_LEFT: out_len = rule_op_mangle_rotate_left (p0, p1, buf0, buf1, out_len); break; + case RULE_OP_MANGLE_ROTATE_RIGHT: out_len = rule_op_mangle_rotate_right (p0, p1, buf0, buf1, out_len); break; + case RULE_OP_MANGLE_DELETE_FIRST: out_len = rule_op_mangle_delete_first (p0, p1, buf0, buf1, out_len); break; + case RULE_OP_MANGLE_DELETE_LAST: out_len = rule_op_mangle_delete_last (p0, p1, buf0, buf1, out_len); break; + case RULE_OP_MANGLE_DELETE_AT: out_len = rule_op_mangle_delete_at (p0, p1, buf0, buf1, out_len); break; + case RULE_OP_MANGLE_EXTRACT: out_len = rule_op_mangle_extract (p0, p1, buf0, buf1, out_len); break; + case RULE_OP_MANGLE_OMIT: out_len = rule_op_mangle_omit (p0, p1, buf0, buf1, out_len); break; + case RULE_OP_MANGLE_INSERT: out_len = rule_op_mangle_insert (p0, p1, buf0, buf1, out_len); break; + case RULE_OP_MANGLE_OVERSTRIKE: out_len = rule_op_mangle_overstrike (p0, p1, buf0, buf1, out_len); break; + case RULE_OP_MANGLE_TRUNCATE_AT: out_len = rule_op_mangle_truncate_at (p0, p1, buf0, buf1, out_len); break; + case RULE_OP_MANGLE_REPLACE: out_len = rule_op_mangle_replace (p0, p1, buf0, buf1, out_len); break; + //case RULE_OP_MANGLE_PURGECHAR: out_len = rule_op_mangle_purgechar (p0, p1, buf0, buf1, out_len); break; + //case RULE_OP_MANGLE_TOGGLECASE_REC: out_len = rule_op_mangle_togglecase_rec (p0, p1, buf0, buf1, out_len); break; + case RULE_OP_MANGLE_DUPECHAR_FIRST: out_len = rule_op_mangle_dupechar_first (p0, p1, buf0, buf1, out_len); break; + case RULE_OP_MANGLE_DUPECHAR_LAST: out_len = rule_op_mangle_dupechar_last (p0, p1, buf0, buf1, out_len); break; + case RULE_OP_MANGLE_DUPECHAR_ALL: out_len = rule_op_mangle_dupechar_all (p0, p1, buf0, buf1, out_len); break; + case RULE_OP_MANGLE_SWITCH_FIRST: out_len = rule_op_mangle_switch_first (p0, p1, buf0, buf1, out_len); break; + case RULE_OP_MANGLE_SWITCH_LAST: out_len = rule_op_mangle_switch_last (p0, p1, buf0, buf1, out_len); break; + case RULE_OP_MANGLE_SWITCH_AT: out_len = rule_op_mangle_switch_at (p0, p1, buf0, buf1, out_len); break; + case RULE_OP_MANGLE_CHR_SHIFTL: out_len = rule_op_mangle_chr_shiftl (p0, p1, buf0, buf1, out_len); break; + case RULE_OP_MANGLE_CHR_SHIFTR: out_len = rule_op_mangle_chr_shiftr (p0, p1, buf0, buf1, out_len); break; + case RULE_OP_MANGLE_CHR_INCR: out_len = rule_op_mangle_chr_incr (p0, p1, buf0, buf1, out_len); break; + case RULE_OP_MANGLE_CHR_DECR: out_len = rule_op_mangle_chr_decr (p0, p1, buf0, buf1, out_len); break; + case RULE_OP_MANGLE_REPLACE_NP1: out_len = rule_op_mangle_replace_np1 (p0, p1, buf0, buf1, out_len); break; + case RULE_OP_MANGLE_REPLACE_NM1: out_len = rule_op_mangle_replace_nm1 (p0, p1, buf0, buf1, out_len); break; + case RULE_OP_MANGLE_DUPEBLOCK_FIRST: out_len = rule_op_mangle_dupeblock_first (p0, p1, buf0, buf1, out_len); break; + case RULE_OP_MANGLE_DUPEBLOCK_LAST: out_len = rule_op_mangle_dupeblock_last (p0, p1, buf0, buf1, out_len); break; + case RULE_OP_MANGLE_TITLE: out_len = rule_op_mangle_title (p0, p1, buf0, buf1, out_len); break; + } + + return out_len; +} + +uint apply_rules (uint *cmds, uint32_t buf0[4], uint32_t buf1[4], const uint len) +{ + uint out_len = len; + + for (; *cmds; cmds++) + { + const uint name = (*cmds >> 0) & 0xff; + const uint p0 = (*cmds >> 8) & 0xff; + const uint p1 = (*cmds >> 16) & 0xff; + + out_len = apply_rule (name, p0, p1, buf0, buf1, out_len); + } + + return out_len; +} diff --git a/src/shared.c b/src/shared.c new file mode 100644 index 0000000000..ad56a73fe9 --- /dev/null +++ b/src/shared.c @@ -0,0 +1,20135 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#include +#include + +#define MIN(a,b) (((a) < (b)) ? (a) : (b)) +#define MAX(a,b) (((a) > (b)) ? (a) : (b)) + +/** + * tuning tools + */ + +#ifdef _CUDA +#define GET_ACCEL(x) GPU_ACCEL_NV_ ## x +#define GET_LOOPS(x) GPU_LOOPS_NV_ ## x +#elif _OCL +#define GET_ACCEL(x) GPU_ACCEL_AMD_ ## x +#define GET_LOOPS(x) GPU_LOOPS_AMD_ ## x +#endif + +/** + * bit rotate + */ + +uint32_t rotl32 (const uint32_t a, const uint n) +{ + return ((a << n) | (a >> (32 - n))); +} + +uint32_t rotr32 (const uint32_t a, const uint n) +{ + return ((a >> n) | (a << (32 - n))); +} + +uint64_t rotl64 (const uint64_t a, const uint n) +{ + return ((a << n) | (a >> (64 - n))); +} + +uint64_t rotr64 (const uint64_t a, const uint n) +{ + return ((a >> n) | (a << (64 - n))); +} + +/** + * ciphers for use on cpu + */ + +#include "cpu-des.c" +#include "cpu-aes.c" + +/** + * hashes for use on cpu + */ + +#include "cpu-md5.c" +#include "cpu-sha256.c" + +/** + * logging + */ + +int last_len = 0; + +void log_final (FILE *fp, const char *fmt, va_list ap) +{ + if (last_len) + { + fputc ('\r', fp); + + for (int i = 0; i < last_len; i++) + { + fputc (' ', fp); + } + + fputc ('\r', fp); + } + + char s[4096]; + + int max_len = (int) sizeof (s); + + int len = vsnprintf (s, max_len, fmt, ap); + + if (len > max_len) len = max_len; + + fwrite (s, len, 1, fp); + + fflush (fp); + + last_len = len; +} + +void log_out_nn (FILE *fp, const char *fmt, ...) +{ + if (SUPPRESS_OUTPUT) return; + + va_list ap; + + va_start (ap, fmt); + + log_final (fp, fmt, ap); + + va_end (ap); +} + +void log_info_nn (const char *fmt, ...) +{ + if (SUPPRESS_OUTPUT) return; + + va_list ap; + + va_start (ap, fmt); + + log_final (stdout, fmt, ap); + + va_end (ap); +} + +void log_error_nn (const char *fmt, ...) +{ + if (SUPPRESS_OUTPUT) return; + + va_list ap; + + va_start (ap, fmt); + + log_final (stderr, fmt, ap); + + va_end (ap); +} + +void log_out (FILE *fp, const char *fmt, ...) +{ + if (SUPPRESS_OUTPUT) return; + + va_list ap; + + va_start (ap, fmt); + + log_final (fp, fmt, ap); + + va_end (ap); + + fputc ('\n', fp); + + last_len = 0; +} + +void log_info (const char *fmt, ...) +{ + if (SUPPRESS_OUTPUT) return; + + va_list ap; + + va_start (ap, fmt); + + log_final (stdout, fmt, ap); + + va_end (ap); + + fputc ('\n', stdout); + + last_len = 0; +} + +void log_error (const char *fmt, ...) +{ + if (SUPPRESS_OUTPUT) return; + + fputc ('\n', stderr); + fputc ('\n', stderr); + + va_list ap; + + va_start (ap, fmt); + + log_final (stderr, fmt, ap); + + va_end (ap); + + fputc ('\n', stderr); + fputc ('\n', stderr); + + last_len = 0; +} + +/** + * converter + */ + +uint byte_swap_32 (const uint n) +{ + return (n & 0xff000000) >> 24 + | (n & 0x00ff0000) >> 8 + | (n & 0x0000ff00) << 8 + | (n & 0x000000ff) << 24; +} + +uint64_t byte_swap_64 (const uint64_t n) +{ + return (n & 0xff00000000000000ULL) >> 56 + | (n & 0x00ff000000000000ULL) >> 40 + | (n & 0x0000ff0000000000ULL) >> 24 + | (n & 0x000000ff00000000ULL) >> 8 + | (n & 0x00000000ff000000ULL) << 8 + | (n & 0x0000000000ff0000ULL) << 24 + | (n & 0x000000000000ff00ULL) << 40 + | (n & 0x00000000000000ffULL) << 56; +} + +char int_to_base32 (const char c) +{ + static const char tbl[0x20] = + { + 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, 0x50, + 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, + }; + + return tbl[(const uint8_t) c]; +} + +char base32_to_int (const char c) +{ + if ((c >= 'A') && (c <= 'Z')) return c - 'A'; + else if ((c >= '2') && (c <= '7')) return c - '2' + 26; + + return 0; +} + +char int_to_itoa32 (const char c) +{ + static const char tbl[0x20] = + { + 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, + 0x67, 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, + }; + + return tbl[(const uint8_t) c]; +} + +char itoa32_to_int (const char c) +{ + if ((c >= '0') && (c <= '9')) return c - '0'; + else if ((c >= 'a') && (c <= 'v')) return c - 'a' + 10; + + return 0; +} + +char int_to_itoa64 (const char c) +{ + static const char tbl[0x40] = + { + 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x41, 0x42, 0x43, 0x44, + 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, 0x50, 0x51, 0x52, 0x53, 0x54, + 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6a, + 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7a, + }; + + return tbl[(const uint8_t) c]; +} + +char itoa64_to_int (const char c) +{ + static const char tbl[0x100] = + { + 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, + 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, + 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, 0x00, 0x01, + 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, + 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, + 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x20, 0x21, 0x22, 0x23, 0x24, + 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34, + 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, 0x00, 0x01, 0x02, 0x03, 0x04, + 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, + 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, + 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34, + 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, 0x00, 0x01, 0x02, 0x03, 0x04, + 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, + 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, + 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34, + 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, 0x00, 0x01, 0x02, 0x03, 0x04, + }; + + return tbl[(const uint8_t) c]; +} + +char int_to_base64 (const char c) +{ + static const char tbl[0x40] = + { + 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, 0x50, + 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, + 0x67, 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, + 0x77, 0x78, 0x79, 0x7a, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x2b, 0x2f, + }; + + return tbl[(const uint8_t) c]; +} + +char base64_to_int (const char c) +{ + static const char tbl[0x100] = + { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x00, 0x00, 0x3f, + 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, + 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, + 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + + return tbl[(const uint8_t) c]; +} + +char int_to_bf64 (const char c) +{ + static const char tbl[0x40] = + { + 0x2e, 0x2f, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, + 0x4f, 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x61, 0x62, 0x63, 0x64, + 0x65, 0x66, 0x67, 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, + 0x75, 0x76, 0x77, 0x78, 0x79, 0x7a, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, + }; + + return tbl[(const uint8_t) c]; +} + +char bf64_to_int (const char c) +{ + static const char tbl[0x100] = + { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, + 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, + 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, + 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + }; + + return tbl[(const uint8_t) c]; +} + +char int_to_lotus64 (const char c) +{ + if (c < 10) return '0' + c; + else if (c < 36) return 'A' + c - 10; + else if (c < 62) return 'a' + c - 36; + else if (c == 62) return '+'; + else if (c == 63) return '/'; + + return 0; +} + +char lotus64_to_int (const char c) +{ + if ((c >= '0') && (c <= '9')) return c - '0'; + else if ((c >= 'A') && (c <= 'Z')) return c - 'A' + 10; + else if ((c >= 'a') && (c <= 'z')) return c - 'a' + 36; + else if (c == '+') return 62; + else if (c == '/') return 63; + else + + return 0; +} + +int base32_decode (char (*f) (const char), char *in_buf, int in_len, char *out_buf) +{ + char *in_ptr = in_buf; + + char *out_ptr = out_buf; + + for (int i = 0; i < in_len; i += 8) + { + char out_val0 = f (in_ptr[0] & 0x7f); + char out_val1 = f (in_ptr[1] & 0x7f); + char out_val2 = f (in_ptr[2] & 0x7f); + char out_val3 = f (in_ptr[3] & 0x7f); + char out_val4 = f (in_ptr[4] & 0x7f); + char out_val5 = f (in_ptr[5] & 0x7f); + char out_val6 = f (in_ptr[6] & 0x7f); + char out_val7 = f (in_ptr[7] & 0x7f); + + out_ptr[0] = ((out_val0 << 3) & 0xf8) | ((out_val1 >> 2) & 0x07); + out_ptr[1] = ((out_val1 << 6) & 0xc0) | ((out_val2 << 1) & 0x3e) | ((out_val3 >> 4) & 0x01); + out_ptr[2] = ((out_val3 << 4) & 0xf0) | ((out_val4 >> 1) & 0x0f); + out_ptr[3] = ((out_val4 << 7) & 0x80) | ((out_val5 << 2) & 0x7c) | ((out_val6 >> 3) & 0x03); + out_ptr[4] = ((out_val6 << 5) & 0xe0) | ((out_val7 >> 0) & 0x1f); + + in_ptr += 8; + out_ptr += 5; + } + + for (int i = 0; i < in_len; i++) + { + if (in_buf[i] != '=') continue; + + in_len = i; + } + + int out_len = (in_len * 5) / 8; + + return out_len; +} + +int base32_encode (char (*f) (const char), char *in_buf, int in_len, char *out_buf) +{ + char *in_ptr = in_buf; + + char *out_ptr = out_buf; + + for (int i = 0; i < in_len; i += 5) + { + char out_val0 = f ( ((in_ptr[0] >> 3) & 0x1f)); + char out_val1 = f (((in_ptr[0] << 2) & 0x1c) | ((in_ptr[1] >> 6) & 0x03)); + char out_val2 = f ( ((in_ptr[1] >> 1) & 0x1f)); + char out_val3 = f (((in_ptr[1] << 4) & 0x10) | ((in_ptr[2] >> 4) & 0x0f)); + char out_val4 = f (((in_ptr[2] << 1) & 0x1e) | ((in_ptr[3] >> 7) & 0x01)); + char out_val5 = f ( ((in_ptr[3] >> 2) & 0x1f)); + char out_val6 = f (((in_ptr[3] << 3) & 0x18) | ((in_ptr[4] >> 5) & 0x07)); + char out_val7 = f ( ((in_ptr[4] >> 0) & 0x1f)); + + out_ptr[0] = out_val0 & 0x7f; + out_ptr[1] = out_val1 & 0x7f; + out_ptr[2] = out_val2 & 0x7f; + out_ptr[3] = out_val3 & 0x7f; + out_ptr[4] = out_val4 & 0x7f; + out_ptr[5] = out_val5 & 0x7f; + out_ptr[6] = out_val6 & 0x7f; + out_ptr[7] = out_val7 & 0x7f; + + in_ptr += 5; + out_ptr += 8; + } + + int out_len = (in_len * 8) / 5; + + for (int i = 0; i < (7 - (in_len % 7)); i++) + { + out_len++; + + out_buf[out_len] = '='; + } + + return out_len; +} + +int base64_decode (char (*f) (const char), char *in_buf, int in_len, char *out_buf) +{ + char *in_ptr = in_buf; + + char *out_ptr = out_buf; + + for (int i = 0; i < in_len; i += 4) + { + char out_val0 = f (in_ptr[0] & 0x7f); + char out_val1 = f (in_ptr[1] & 0x7f); + char out_val2 = f (in_ptr[2] & 0x7f); + char out_val3 = f (in_ptr[3] & 0x7f); + + out_ptr[0] = ((out_val0 << 2) & 0xfc) | ((out_val1 >> 4) & 0x03); + out_ptr[1] = ((out_val1 << 4) & 0xf0) | ((out_val2 >> 2) & 0x0f); + out_ptr[2] = ((out_val2 << 6) & 0xc0) | ((out_val3 >> 0) & 0x3f); + + in_ptr += 4; + out_ptr += 3; + } + + for (int i = 0; i < in_len; i++) + { + if (in_buf[i] != '=') continue; + + in_len = i; + } + + int out_len = (in_len * 6) / 8; + + return out_len; +} + +int base64_encode (char (*f) (const char), char *in_buf, int in_len, char *out_buf) +{ + char *in_ptr = in_buf; + + char *out_ptr = out_buf; + + for (int i = 0; i < in_len; i += 3) + { + char out_val0 = f ( ((in_ptr[0] >> 2) & 0x3f)); + char out_val1 = f (((in_ptr[0] << 4) & 0x30) | ((in_ptr[1] >> 4) & 0x0f)); + char out_val2 = f (((in_ptr[1] << 2) & 0x3c) | ((in_ptr[2] >> 6) & 0x03)); + char out_val3 = f ( ((in_ptr[2] >> 0) & 0x3f)); + + out_ptr[0] = out_val0 & 0x7f; + out_ptr[1] = out_val1 & 0x7f; + out_ptr[2] = out_val2 & 0x7f; + out_ptr[3] = out_val3 & 0x7f; + + in_ptr += 3; + out_ptr += 4; + } + + int out_len = (in_len * 8) / 6; + + for (int i = 0; i < (3 - (in_len % 3)); i++) + { + out_len++; + + out_buf[out_len] = '='; + } + + return out_len; +} + +static void AES128_decrypt_cbc (const uint key[4], const uint iv[4], const uint in[16], uint out[16]) +{ + AES_KEY skey; + + AES_set_decrypt_key ((unsigned char *) key, 128, &skey); + + uint _iv[4]; + + _iv[0] = iv[0]; + _iv[1] = iv[1]; + _iv[2] = iv[2]; + _iv[3] = iv[3]; + + for (int i = 0; i < 16; i += 4) + { + uint _in[4]; + uint _out[4]; + + _in[0] = in[i + 0]; + _in[1] = in[i + 1]; + _in[2] = in[i + 2]; + _in[3] = in[i + 3]; + + AES_decrypt (&skey, (char *) _in, (char *) _out); + + _out[0] ^= _iv[0]; + _out[1] ^= _iv[1]; + _out[2] ^= _iv[2]; + _out[3] ^= _iv[3]; + + out[i + 0] = _out[0]; + out[i + 1] = _out[1]; + out[i + 2] = _out[2]; + out[i + 3] = _out[3]; + + _iv[0] = _in[0]; + _iv[1] = _in[1]; + _iv[2] = _in[2]; + _iv[3] = _in[3]; + } +} + +static void juniper_decrypt_hash (char *in, char *out) +{ + // base64 decode + + char base64_buf[100]; + + memset (base64_buf, 0, sizeof (base64_buf)); + + base64_decode (base64_to_int, in, DISPLAY_LEN_MIN_501, base64_buf); + + // iv stuff + + uint juniper_iv[4] = { 0 }; + + memcpy (juniper_iv, base64_buf, 12); + + memcpy (out, juniper_iv, 12); + + // reversed key + + uint juniper_key[4]; + + juniper_key[0] = byte_swap_32 (0xa6707a7e); + juniper_key[1] = byte_swap_32 (0x8df91059); + juniper_key[2] = byte_swap_32 (0xdea70ae5); + juniper_key[3] = byte_swap_32 (0x2f9c2442); + + // AES decrypt + + uint *in_ptr = (uint *) (base64_buf + 12); + uint *out_ptr = (uint *) (out + 12); + + AES128_decrypt_cbc (juniper_key, juniper_iv, in_ptr, out_ptr); +} + +uint is_valid_hex_char (const char c) +{ + if ((c >= '0') && (c <= '9')) return 1; + if ((c >= 'A') && (c <= 'F')) return 1; + if ((c >= 'a') && (c <= 'f')) return 1; + + return 0; +} + +char hex_convert (const char c) +{ + return (c & 15) + (c >> 6) * 9; +} + +char hex_to_char (const char hex[2]) +{ + char v = 0; + + v |= (hex_convert (hex[1]) << 0); + v |= (hex_convert (hex[0]) << 4); + + return (v); +} + +uint hex_to_uint (const char hex[8]) +{ + uint v = 0; + + v |= hex_convert (hex[7]) << 0; + v |= hex_convert (hex[6]) << 4; + v |= hex_convert (hex[5]) << 8; + v |= hex_convert (hex[4]) << 12; + v |= hex_convert (hex[3]) << 16; + v |= hex_convert (hex[2]) << 20; + v |= hex_convert (hex[1]) << 24; + v |= hex_convert (hex[0]) << 28; + + return (v); +} + +uint64_t hex_to_uint64_t (const char hex[16]) +{ + uint64_t v = 0; + + v |= ((uint64_t) hex_convert (hex[15]) << 0); + v |= ((uint64_t) hex_convert (hex[14]) << 4); + v |= ((uint64_t) hex_convert (hex[13]) << 8); + v |= ((uint64_t) hex_convert (hex[12]) << 12); + v |= ((uint64_t) hex_convert (hex[11]) << 16); + v |= ((uint64_t) hex_convert (hex[10]) << 20); + v |= ((uint64_t) hex_convert (hex[ 9]) << 24); + v |= ((uint64_t) hex_convert (hex[ 8]) << 28); + v |= ((uint64_t) hex_convert (hex[ 7]) << 32); + v |= ((uint64_t) hex_convert (hex[ 6]) << 36); + v |= ((uint64_t) hex_convert (hex[ 5]) << 40); + v |= ((uint64_t) hex_convert (hex[ 4]) << 44); + v |= ((uint64_t) hex_convert (hex[ 3]) << 48); + v |= ((uint64_t) hex_convert (hex[ 2]) << 52); + v |= ((uint64_t) hex_convert (hex[ 1]) << 56); + v |= ((uint64_t) hex_convert (hex[ 0]) << 60); + + return (v); +} + +void bin_to_hex_lower (uint v, char hex[8]) +{ + hex[0] = v >> 28 & 15; + hex[1] = v >> 24 & 15; + hex[2] = v >> 20 & 15; + hex[3] = v >> 16 & 15; + hex[4] = v >> 12 & 15; + hex[5] = v >> 8 & 15; + hex[6] = v >> 4 & 15; + hex[7] = v >> 0 & 15; + + uint add; + + hex[0] += 6; add = ((hex[0] & 0x10) >> 4) * 39; hex[0] += 42 + add; + hex[1] += 6; add = ((hex[1] & 0x10) >> 4) * 39; hex[1] += 42 + add; + hex[2] += 6; add = ((hex[2] & 0x10) >> 4) * 39; hex[2] += 42 + add; + hex[3] += 6; add = ((hex[3] & 0x10) >> 4) * 39; hex[3] += 42 + add; + hex[4] += 6; add = ((hex[4] & 0x10) >> 4) * 39; hex[4] += 42 + add; + hex[5] += 6; add = ((hex[5] & 0x10) >> 4) * 39; hex[5] += 42 + add; + hex[6] += 6; add = ((hex[6] & 0x10) >> 4) * 39; hex[6] += 42 + add; + hex[7] += 6; add = ((hex[7] & 0x10) >> 4) * 39; hex[7] += 42 + add; +} + +void phpass_decode (unsigned char digest[16], unsigned char buf[22]) +{ + int l; + + l = itoa64_to_int (buf[ 0]) << 0; + l |= itoa64_to_int (buf[ 1]) << 6; + l |= itoa64_to_int (buf[ 2]) << 12; + l |= itoa64_to_int (buf[ 3]) << 18; + + digest[ 0] = (l >> 0) & 0xff; + digest[ 1] = (l >> 8) & 0xff; + digest[ 2] = (l >> 16) & 0xff; + + l = itoa64_to_int (buf[ 4]) << 0; + l |= itoa64_to_int (buf[ 5]) << 6; + l |= itoa64_to_int (buf[ 6]) << 12; + l |= itoa64_to_int (buf[ 7]) << 18; + + digest[ 3] = (l >> 0) & 0xff; + digest[ 4] = (l >> 8) & 0xff; + digest[ 5] = (l >> 16) & 0xff; + + l = itoa64_to_int (buf[ 8]) << 0; + l |= itoa64_to_int (buf[ 9]) << 6; + l |= itoa64_to_int (buf[10]) << 12; + l |= itoa64_to_int (buf[11]) << 18; + + digest[ 6] = (l >> 0) & 0xff; + digest[ 7] = (l >> 8) & 0xff; + digest[ 8] = (l >> 16) & 0xff; + + l = itoa64_to_int (buf[12]) << 0; + l |= itoa64_to_int (buf[13]) << 6; + l |= itoa64_to_int (buf[14]) << 12; + l |= itoa64_to_int (buf[15]) << 18; + + digest[ 9] = (l >> 0) & 0xff; + digest[10] = (l >> 8) & 0xff; + digest[11] = (l >> 16) & 0xff; + + l = itoa64_to_int (buf[16]) << 0; + l |= itoa64_to_int (buf[17]) << 6; + l |= itoa64_to_int (buf[18]) << 12; + l |= itoa64_to_int (buf[19]) << 18; + + digest[12] = (l >> 0) & 0xff; + digest[13] = (l >> 8) & 0xff; + digest[14] = (l >> 16) & 0xff; + + l = itoa64_to_int (buf[20]) << 0; + l |= itoa64_to_int (buf[21]) << 6; + + digest[15] = (l >> 0) & 0xff; +} + +void phpass_encode (unsigned char digest[16], unsigned char buf[22]) +{ + int l; + + l = (digest[ 0] << 0) | (digest[ 1] << 8) | (digest[ 2] << 16); + + buf[ 0] = int_to_itoa64 (l & 0x3f); l >>= 6; + buf[ 1] = int_to_itoa64 (l & 0x3f); l >>= 6; + buf[ 2] = int_to_itoa64 (l & 0x3f); l >>= 6; + buf[ 3] = int_to_itoa64 (l & 0x3f); + + l = (digest[ 3] << 0) | (digest[ 4] << 8) | (digest[ 5] << 16); + + buf[ 4] = int_to_itoa64 (l & 0x3f); l >>= 6; + buf[ 5] = int_to_itoa64 (l & 0x3f); l >>= 6; + buf[ 6] = int_to_itoa64 (l & 0x3f); l >>= 6; + buf[ 7] = int_to_itoa64 (l & 0x3f); + + l = (digest[ 6] << 0) | (digest[ 7] << 8) | (digest[ 8] << 16); + + buf[ 8] = int_to_itoa64 (l & 0x3f); l >>= 6; + buf[ 9] = int_to_itoa64 (l & 0x3f); l >>= 6; + buf[10] = int_to_itoa64 (l & 0x3f); l >>= 6; + buf[11] = int_to_itoa64 (l & 0x3f); + + l = (digest[ 9] << 0) | (digest[10] << 8) | (digest[11] << 16); + + buf[12] = int_to_itoa64 (l & 0x3f); l >>= 6; + buf[13] = int_to_itoa64 (l & 0x3f); l >>= 6; + buf[14] = int_to_itoa64 (l & 0x3f); l >>= 6; + buf[15] = int_to_itoa64 (l & 0x3f); + + l = (digest[12] << 0) | (digest[13] << 8) | (digest[14] << 16); + + buf[16] = int_to_itoa64 (l & 0x3f); l >>= 6; + buf[17] = int_to_itoa64 (l & 0x3f); l >>= 6; + buf[18] = int_to_itoa64 (l & 0x3f); l >>= 6; + buf[19] = int_to_itoa64 (l & 0x3f); + + l = (digest[15] << 0); + + buf[20] = int_to_itoa64 (l & 0x3f); l >>= 6; + buf[21] = int_to_itoa64 (l & 0x3f); +} + +void md5crypt_decode (unsigned char digest[16], unsigned char buf[22]) +{ + int l; + + l = itoa64_to_int (buf[ 0]) << 0; + l |= itoa64_to_int (buf[ 1]) << 6; + l |= itoa64_to_int (buf[ 2]) << 12; + l |= itoa64_to_int (buf[ 3]) << 18; + + digest[ 0] = (l >> 16) & 0xff; + digest[ 6] = (l >> 8) & 0xff; + digest[12] = (l >> 0) & 0xff; + + l = itoa64_to_int (buf[ 4]) << 0; + l |= itoa64_to_int (buf[ 5]) << 6; + l |= itoa64_to_int (buf[ 6]) << 12; + l |= itoa64_to_int (buf[ 7]) << 18; + + digest[ 1] = (l >> 16) & 0xff; + digest[ 7] = (l >> 8) & 0xff; + digest[13] = (l >> 0) & 0xff; + + l = itoa64_to_int (buf[ 8]) << 0; + l |= itoa64_to_int (buf[ 9]) << 6; + l |= itoa64_to_int (buf[10]) << 12; + l |= itoa64_to_int (buf[11]) << 18; + + digest[ 2] = (l >> 16) & 0xff; + digest[ 8] = (l >> 8) & 0xff; + digest[14] = (l >> 0) & 0xff; + + l = itoa64_to_int (buf[12]) << 0; + l |= itoa64_to_int (buf[13]) << 6; + l |= itoa64_to_int (buf[14]) << 12; + l |= itoa64_to_int (buf[15]) << 18; + + digest[ 3] = (l >> 16) & 0xff; + digest[ 9] = (l >> 8) & 0xff; + digest[15] = (l >> 0) & 0xff; + + l = itoa64_to_int (buf[16]) << 0; + l |= itoa64_to_int (buf[17]) << 6; + l |= itoa64_to_int (buf[18]) << 12; + l |= itoa64_to_int (buf[19]) << 18; + + digest[ 4] = (l >> 16) & 0xff; + digest[10] = (l >> 8) & 0xff; + digest[ 5] = (l >> 0) & 0xff; + + l = itoa64_to_int (buf[20]) << 0; + l |= itoa64_to_int (buf[21]) << 6; + + digest[11] = (l >> 0) & 0xff; +} + +void md5crypt_encode (unsigned char digest[16], unsigned char buf[22]) +{ + int l; + + l = (digest[ 0] << 16) | (digest[ 6] << 8) | (digest[12] << 0); + + buf[ 0] = int_to_itoa64 (l & 0x3f); l >>= 6; + buf[ 1] = int_to_itoa64 (l & 0x3f); l >>= 6; + buf[ 2] = int_to_itoa64 (l & 0x3f); l >>= 6; + buf[ 3] = int_to_itoa64 (l & 0x3f); l >>= 6; + + l = (digest[ 1] << 16) | (digest[ 7] << 8) | (digest[13] << 0); + + buf[ 4] = int_to_itoa64 (l & 0x3f); l >>= 6; + buf[ 5] = int_to_itoa64 (l & 0x3f); l >>= 6; + buf[ 6] = int_to_itoa64 (l & 0x3f); l >>= 6; + buf[ 7] = int_to_itoa64 (l & 0x3f); l >>= 6; + + l = (digest[ 2] << 16) | (digest[ 8] << 8) | (digest[14] << 0); + + buf[ 8] = int_to_itoa64 (l & 0x3f); l >>= 6; + buf[ 9] = int_to_itoa64 (l & 0x3f); l >>= 6; + buf[10] = int_to_itoa64 (l & 0x3f); l >>= 6; + buf[11] = int_to_itoa64 (l & 0x3f); l >>= 6; + + l = (digest[ 3] << 16) | (digest[ 9] << 8) | (digest[15] << 0); + + buf[12] = int_to_itoa64 (l & 0x3f); l >>= 6; + buf[13] = int_to_itoa64 (l & 0x3f); l >>= 6; + buf[14] = int_to_itoa64 (l & 0x3f); l >>= 6; + buf[15] = int_to_itoa64 (l & 0x3f); l >>= 6; + + l = (digest[ 4] << 16) | (digest[10] << 8) | (digest[ 5] << 0); + + buf[16] = int_to_itoa64 (l & 0x3f); l >>= 6; + buf[17] = int_to_itoa64 (l & 0x3f); l >>= 6; + buf[18] = int_to_itoa64 (l & 0x3f); l >>= 6; + buf[19] = int_to_itoa64 (l & 0x3f); l >>= 6; + + l = (digest[11] << 0); + + buf[20] = int_to_itoa64 (l & 0x3f); l >>= 6; + buf[21] = int_to_itoa64 (l & 0x3f); l >>= 6; +} + +void sha512crypt_decode (unsigned char digest[64], unsigned char buf[86]) +{ + int l; + + l = itoa64_to_int (buf[ 0]) << 0; + l |= itoa64_to_int (buf[ 1]) << 6; + l |= itoa64_to_int (buf[ 2]) << 12; + l |= itoa64_to_int (buf[ 3]) << 18; + + digest[ 0] = (l >> 16) & 0xff; + digest[21] = (l >> 8) & 0xff; + digest[42] = (l >> 0) & 0xff; + + l = itoa64_to_int (buf[ 4]) << 0; + l |= itoa64_to_int (buf[ 5]) << 6; + l |= itoa64_to_int (buf[ 6]) << 12; + l |= itoa64_to_int (buf[ 7]) << 18; + + digest[22] = (l >> 16) & 0xff; + digest[43] = (l >> 8) & 0xff; + digest[ 1] = (l >> 0) & 0xff; + + l = itoa64_to_int (buf[ 8]) << 0; + l |= itoa64_to_int (buf[ 9]) << 6; + l |= itoa64_to_int (buf[10]) << 12; + l |= itoa64_to_int (buf[11]) << 18; + + digest[44] = (l >> 16) & 0xff; + digest[ 2] = (l >> 8) & 0xff; + digest[23] = (l >> 0) & 0xff; + + l = itoa64_to_int (buf[12]) << 0; + l |= itoa64_to_int (buf[13]) << 6; + l |= itoa64_to_int (buf[14]) << 12; + l |= itoa64_to_int (buf[15]) << 18; + + digest[ 3] = (l >> 16) & 0xff; + digest[24] = (l >> 8) & 0xff; + digest[45] = (l >> 0) & 0xff; + + l = itoa64_to_int (buf[16]) << 0; + l |= itoa64_to_int (buf[17]) << 6; + l |= itoa64_to_int (buf[18]) << 12; + l |= itoa64_to_int (buf[19]) << 18; + + digest[25] = (l >> 16) & 0xff; + digest[46] = (l >> 8) & 0xff; + digest[ 4] = (l >> 0) & 0xff; + + l = itoa64_to_int (buf[20]) << 0; + l |= itoa64_to_int (buf[21]) << 6; + l |= itoa64_to_int (buf[22]) << 12; + l |= itoa64_to_int (buf[23]) << 18; + + digest[47] = (l >> 16) & 0xff; + digest[ 5] = (l >> 8) & 0xff; + digest[26] = (l >> 0) & 0xff; + + l = itoa64_to_int (buf[24]) << 0; + l |= itoa64_to_int (buf[25]) << 6; + l |= itoa64_to_int (buf[26]) << 12; + l |= itoa64_to_int (buf[27]) << 18; + + digest[ 6] = (l >> 16) & 0xff; + digest[27] = (l >> 8) & 0xff; + digest[48] = (l >> 0) & 0xff; + + l = itoa64_to_int (buf[28]) << 0; + l |= itoa64_to_int (buf[29]) << 6; + l |= itoa64_to_int (buf[30]) << 12; + l |= itoa64_to_int (buf[31]) << 18; + + digest[28] = (l >> 16) & 0xff; + digest[49] = (l >> 8) & 0xff; + digest[ 7] = (l >> 0) & 0xff; + + l = itoa64_to_int (buf[32]) << 0; + l |= itoa64_to_int (buf[33]) << 6; + l |= itoa64_to_int (buf[34]) << 12; + l |= itoa64_to_int (buf[35]) << 18; + + digest[50] = (l >> 16) & 0xff; + digest[ 8] = (l >> 8) & 0xff; + digest[29] = (l >> 0) & 0xff; + + l = itoa64_to_int (buf[36]) << 0; + l |= itoa64_to_int (buf[37]) << 6; + l |= itoa64_to_int (buf[38]) << 12; + l |= itoa64_to_int (buf[39]) << 18; + + digest[ 9] = (l >> 16) & 0xff; + digest[30] = (l >> 8) & 0xff; + digest[51] = (l >> 0) & 0xff; + + l = itoa64_to_int (buf[40]) << 0; + l |= itoa64_to_int (buf[41]) << 6; + l |= itoa64_to_int (buf[42]) << 12; + l |= itoa64_to_int (buf[43]) << 18; + + digest[31] = (l >> 16) & 0xff; + digest[52] = (l >> 8) & 0xff; + digest[10] = (l >> 0) & 0xff; + + l = itoa64_to_int (buf[44]) << 0; + l |= itoa64_to_int (buf[45]) << 6; + l |= itoa64_to_int (buf[46]) << 12; + l |= itoa64_to_int (buf[47]) << 18; + + digest[53] = (l >> 16) & 0xff; + digest[11] = (l >> 8) & 0xff; + digest[32] = (l >> 0) & 0xff; + + l = itoa64_to_int (buf[48]) << 0; + l |= itoa64_to_int (buf[49]) << 6; + l |= itoa64_to_int (buf[50]) << 12; + l |= itoa64_to_int (buf[51]) << 18; + + digest[12] = (l >> 16) & 0xff; + digest[33] = (l >> 8) & 0xff; + digest[54] = (l >> 0) & 0xff; + + l = itoa64_to_int (buf[52]) << 0; + l |= itoa64_to_int (buf[53]) << 6; + l |= itoa64_to_int (buf[54]) << 12; + l |= itoa64_to_int (buf[55]) << 18; + + digest[34] = (l >> 16) & 0xff; + digest[55] = (l >> 8) & 0xff; + digest[13] = (l >> 0) & 0xff; + + l = itoa64_to_int (buf[56]) << 0; + l |= itoa64_to_int (buf[57]) << 6; + l |= itoa64_to_int (buf[58]) << 12; + l |= itoa64_to_int (buf[59]) << 18; + + digest[56] = (l >> 16) & 0xff; + digest[14] = (l >> 8) & 0xff; + digest[35] = (l >> 0) & 0xff; + + l = itoa64_to_int (buf[60]) << 0; + l |= itoa64_to_int (buf[61]) << 6; + l |= itoa64_to_int (buf[62]) << 12; + l |= itoa64_to_int (buf[63]) << 18; + + digest[15] = (l >> 16) & 0xff; + digest[36] = (l >> 8) & 0xff; + digest[57] = (l >> 0) & 0xff; + + l = itoa64_to_int (buf[64]) << 0; + l |= itoa64_to_int (buf[65]) << 6; + l |= itoa64_to_int (buf[66]) << 12; + l |= itoa64_to_int (buf[67]) << 18; + + digest[37] = (l >> 16) & 0xff; + digest[58] = (l >> 8) & 0xff; + digest[16] = (l >> 0) & 0xff; + + l = itoa64_to_int (buf[68]) << 0; + l |= itoa64_to_int (buf[69]) << 6; + l |= itoa64_to_int (buf[70]) << 12; + l |= itoa64_to_int (buf[71]) << 18; + + digest[59] = (l >> 16) & 0xff; + digest[17] = (l >> 8) & 0xff; + digest[38] = (l >> 0) & 0xff; + + l = itoa64_to_int (buf[72]) << 0; + l |= itoa64_to_int (buf[73]) << 6; + l |= itoa64_to_int (buf[74]) << 12; + l |= itoa64_to_int (buf[75]) << 18; + + digest[18] = (l >> 16) & 0xff; + digest[39] = (l >> 8) & 0xff; + digest[60] = (l >> 0) & 0xff; + + l = itoa64_to_int (buf[76]) << 0; + l |= itoa64_to_int (buf[77]) << 6; + l |= itoa64_to_int (buf[78]) << 12; + l |= itoa64_to_int (buf[79]) << 18; + + digest[40] = (l >> 16) & 0xff; + digest[61] = (l >> 8) & 0xff; + digest[19] = (l >> 0) & 0xff; + + l = itoa64_to_int (buf[80]) << 0; + l |= itoa64_to_int (buf[81]) << 6; + l |= itoa64_to_int (buf[82]) << 12; + l |= itoa64_to_int (buf[83]) << 18; + + digest[62] = (l >> 16) & 0xff; + digest[20] = (l >> 8) & 0xff; + digest[41] = (l >> 0) & 0xff; + + l = itoa64_to_int (buf[84]) << 0; + l |= itoa64_to_int (buf[85]) << 6; + + digest[63] = (l >> 0) & 0xff; +} + +void sha512crypt_encode (unsigned char digest[64], unsigned char buf[86]) +{ + int l; + + l = (digest[ 0] << 16) | (digest[21] << 8) | (digest[42] << 0); + + buf[ 0] = int_to_itoa64 (l & 0x3f); l >>= 6; + buf[ 1] = int_to_itoa64 (l & 0x3f); l >>= 6; + buf[ 2] = int_to_itoa64 (l & 0x3f); l >>= 6; + buf[ 3] = int_to_itoa64 (l & 0x3f); l >>= 6; + + l = (digest[22] << 16) | (digest[43] << 8) | (digest[ 1] << 0); + + buf[ 4] = int_to_itoa64 (l & 0x3f); l >>= 6; + buf[ 5] = int_to_itoa64 (l & 0x3f); l >>= 6; + buf[ 6] = int_to_itoa64 (l & 0x3f); l >>= 6; + buf[ 7] = int_to_itoa64 (l & 0x3f); l >>= 6; + + l = (digest[44] << 16) | (digest[ 2] << 8) | (digest[23] << 0); + + buf[ 8] = int_to_itoa64 (l & 0x3f); l >>= 6; + buf[ 9] = int_to_itoa64 (l & 0x3f); l >>= 6; + buf[10] = int_to_itoa64 (l & 0x3f); l >>= 6; + buf[11] = int_to_itoa64 (l & 0x3f); l >>= 6; + + l = (digest[ 3] << 16) | (digest[24] << 8) | (digest[45] << 0); + + buf[12] = int_to_itoa64 (l & 0x3f); l >>= 6; + buf[13] = int_to_itoa64 (l & 0x3f); l >>= 6; + buf[14] = int_to_itoa64 (l & 0x3f); l >>= 6; + buf[15] = int_to_itoa64 (l & 0x3f); l >>= 6; + + l = (digest[25] << 16) | (digest[46] << 8) | (digest[ 4] << 0); + + buf[16] = int_to_itoa64 (l & 0x3f); l >>= 6; + buf[17] = int_to_itoa64 (l & 0x3f); l >>= 6; + buf[18] = int_to_itoa64 (l & 0x3f); l >>= 6; + buf[19] = int_to_itoa64 (l & 0x3f); l >>= 6; + + l = (digest[47] << 16) | (digest[ 5] << 8) | (digest[26] << 0); + + buf[20] = int_to_itoa64 (l & 0x3f); l >>= 6; + buf[21] = int_to_itoa64 (l & 0x3f); l >>= 6; + buf[22] = int_to_itoa64 (l & 0x3f); l >>= 6; + buf[23] = int_to_itoa64 (l & 0x3f); l >>= 6; + + l = (digest[ 6] << 16) | (digest[27] << 8) | (digest[48] << 0); + + buf[24] = int_to_itoa64 (l & 0x3f); l >>= 6; + buf[25] = int_to_itoa64 (l & 0x3f); l >>= 6; + buf[26] = int_to_itoa64 (l & 0x3f); l >>= 6; + buf[27] = int_to_itoa64 (l & 0x3f); l >>= 6; + + l = (digest[28] << 16) | (digest[49] << 8) | (digest[ 7] << 0); + + buf[28] = int_to_itoa64 (l & 0x3f); l >>= 6; + buf[29] = int_to_itoa64 (l & 0x3f); l >>= 6; + buf[30] = int_to_itoa64 (l & 0x3f); l >>= 6; + buf[31] = int_to_itoa64 (l & 0x3f); l >>= 6; + + l = (digest[50] << 16) | (digest[ 8] << 8) | (digest[29] << 0); + + buf[32] = int_to_itoa64 (l & 0x3f); l >>= 6; + buf[33] = int_to_itoa64 (l & 0x3f); l >>= 6; + buf[34] = int_to_itoa64 (l & 0x3f); l >>= 6; + buf[35] = int_to_itoa64 (l & 0x3f); l >>= 6; + + l = (digest[ 9] << 16) | (digest[30] << 8) | (digest[51] << 0); + + buf[36] = int_to_itoa64 (l & 0x3f); l >>= 6; + buf[37] = int_to_itoa64 (l & 0x3f); l >>= 6; + buf[38] = int_to_itoa64 (l & 0x3f); l >>= 6; + buf[39] = int_to_itoa64 (l & 0x3f); l >>= 6; + + l = (digest[31] << 16) | (digest[52] << 8) | (digest[10] << 0); + + buf[40] = int_to_itoa64 (l & 0x3f); l >>= 6; + buf[41] = int_to_itoa64 (l & 0x3f); l >>= 6; + buf[42] = int_to_itoa64 (l & 0x3f); l >>= 6; + buf[43] = int_to_itoa64 (l & 0x3f); l >>= 6; + + l = (digest[53] << 16) | (digest[11] << 8) | (digest[32] << 0); + + buf[44] = int_to_itoa64 (l & 0x3f); l >>= 6; + buf[45] = int_to_itoa64 (l & 0x3f); l >>= 6; + buf[46] = int_to_itoa64 (l & 0x3f); l >>= 6; + buf[47] = int_to_itoa64 (l & 0x3f); l >>= 6; + + l = (digest[12] << 16) | (digest[33] << 8) | (digest[54] << 0); + + buf[48] = int_to_itoa64 (l & 0x3f); l >>= 6; + buf[49] = int_to_itoa64 (l & 0x3f); l >>= 6; + buf[50] = int_to_itoa64 (l & 0x3f); l >>= 6; + buf[51] = int_to_itoa64 (l & 0x3f); l >>= 6; + + l = (digest[34] << 16) | (digest[55] << 8) | (digest[13] << 0); + + buf[52] = int_to_itoa64 (l & 0x3f); l >>= 6; + buf[53] = int_to_itoa64 (l & 0x3f); l >>= 6; + buf[54] = int_to_itoa64 (l & 0x3f); l >>= 6; + buf[55] = int_to_itoa64 (l & 0x3f); l >>= 6; + + l = (digest[56] << 16) | (digest[14] << 8) | (digest[35] << 0); + + buf[56] = int_to_itoa64 (l & 0x3f); l >>= 6; + buf[57] = int_to_itoa64 (l & 0x3f); l >>= 6; + buf[58] = int_to_itoa64 (l & 0x3f); l >>= 6; + buf[59] = int_to_itoa64 (l & 0x3f); l >>= 6; + + l = (digest[15] << 16) | (digest[36] << 8) | (digest[57] << 0); + + buf[60] = int_to_itoa64 (l & 0x3f); l >>= 6; + buf[61] = int_to_itoa64 (l & 0x3f); l >>= 6; + buf[62] = int_to_itoa64 (l & 0x3f); l >>= 6; + buf[63] = int_to_itoa64 (l & 0x3f); l >>= 6; + + l = (digest[37] << 16) | (digest[58] << 8) | (digest[16] << 0); + + buf[64] = int_to_itoa64 (l & 0x3f); l >>= 6; + buf[65] = int_to_itoa64 (l & 0x3f); l >>= 6; + buf[66] = int_to_itoa64 (l & 0x3f); l >>= 6; + buf[67] = int_to_itoa64 (l & 0x3f); l >>= 6; + + l = (digest[59] << 16) | (digest[17] << 8) | (digest[38] << 0); + + buf[68] = int_to_itoa64 (l & 0x3f); l >>= 6; + buf[69] = int_to_itoa64 (l & 0x3f); l >>= 6; + buf[70] = int_to_itoa64 (l & 0x3f); l >>= 6; + buf[71] = int_to_itoa64 (l & 0x3f); l >>= 6; + + l = (digest[18] << 16) | (digest[39] << 8) | (digest[60] << 0); + + buf[72] = int_to_itoa64 (l & 0x3f); l >>= 6; + buf[73] = int_to_itoa64 (l & 0x3f); l >>= 6; + buf[74] = int_to_itoa64 (l & 0x3f); l >>= 6; + buf[75] = int_to_itoa64 (l & 0x3f); l >>= 6; + + l = (digest[40] << 16) | (digest[61] << 8) | (digest[19] << 0); + + buf[76] = int_to_itoa64 (l & 0x3f); l >>= 6; + buf[77] = int_to_itoa64 (l & 0x3f); l >>= 6; + buf[78] = int_to_itoa64 (l & 0x3f); l >>= 6; + buf[79] = int_to_itoa64 (l & 0x3f); l >>= 6; + + l = (digest[62] << 16) | (digest[20] << 8) | (digest[41] << 0); + + buf[80] = int_to_itoa64 (l & 0x3f); l >>= 6; + buf[81] = int_to_itoa64 (l & 0x3f); l >>= 6; + buf[82] = int_to_itoa64 (l & 0x3f); l >>= 6; + buf[83] = int_to_itoa64 (l & 0x3f); l >>= 6; + + l = 0 | 0 | (digest[63] << 0); + + buf[84] = int_to_itoa64 (l & 0x3f); l >>= 6; + buf[85] = int_to_itoa64 (l & 0x3f); l >>= 6; +} + +void sha1aix_decode (unsigned char digest[20], unsigned char buf[27]) +{ + int l; + + l = itoa64_to_int (buf[ 0]) << 0; + l |= itoa64_to_int (buf[ 1]) << 6; + l |= itoa64_to_int (buf[ 2]) << 12; + l |= itoa64_to_int (buf[ 3]) << 18; + + digest[ 2] = (l >> 0) & 0xff; + digest[ 1] = (l >> 8) & 0xff; + digest[ 0] = (l >> 16) & 0xff; + + l = itoa64_to_int (buf[ 4]) << 0; + l |= itoa64_to_int (buf[ 5]) << 6; + l |= itoa64_to_int (buf[ 6]) << 12; + l |= itoa64_to_int (buf[ 7]) << 18; + + digest[ 5] = (l >> 0) & 0xff; + digest[ 4] = (l >> 8) & 0xff; + digest[ 3] = (l >> 16) & 0xff; + + l = itoa64_to_int (buf[ 8]) << 0; + l |= itoa64_to_int (buf[ 9]) << 6; + l |= itoa64_to_int (buf[10]) << 12; + l |= itoa64_to_int (buf[11]) << 18; + + digest[ 8] = (l >> 0) & 0xff; + digest[ 7] = (l >> 8) & 0xff; + digest[ 6] = (l >> 16) & 0xff; + + l = itoa64_to_int (buf[12]) << 0; + l |= itoa64_to_int (buf[13]) << 6; + l |= itoa64_to_int (buf[14]) << 12; + l |= itoa64_to_int (buf[15]) << 18; + + digest[11] = (l >> 0) & 0xff; + digest[10] = (l >> 8) & 0xff; + digest[ 9] = (l >> 16) & 0xff; + + l = itoa64_to_int (buf[16]) << 0; + l |= itoa64_to_int (buf[17]) << 6; + l |= itoa64_to_int (buf[18]) << 12; + l |= itoa64_to_int (buf[19]) << 18; + + digest[14] = (l >> 0) & 0xff; + digest[13] = (l >> 8) & 0xff; + digest[12] = (l >> 16) & 0xff; + + l = itoa64_to_int (buf[20]) << 0; + l |= itoa64_to_int (buf[21]) << 6; + l |= itoa64_to_int (buf[22]) << 12; + l |= itoa64_to_int (buf[23]) << 18; + + digest[17] = (l >> 0) & 0xff; + digest[16] = (l >> 8) & 0xff; + digest[15] = (l >> 16) & 0xff; + + l = itoa64_to_int (buf[24]) << 0; + l |= itoa64_to_int (buf[25]) << 6; + l |= itoa64_to_int (buf[26]) << 12; + + digest[19] = (l >> 8) & 0xff; + digest[18] = (l >> 16) & 0xff; +} + +void sha1aix_encode (unsigned char digest[20], unsigned char buf[27]) +{ + int l; + + l = (digest[ 2] << 0) | (digest[ 1] << 8) | (digest[ 0] << 16); + + buf[ 0] = int_to_itoa64 (l & 0x3f); l >>= 6; + buf[ 1] = int_to_itoa64 (l & 0x3f); l >>= 6; + buf[ 2] = int_to_itoa64 (l & 0x3f); l >>= 6; + buf[ 3] = int_to_itoa64 (l & 0x3f); + + l = (digest[ 5] << 0) | (digest[ 4] << 8) | (digest[ 3] << 16); + + buf[ 4] = int_to_itoa64 (l & 0x3f); l >>= 6; + buf[ 5] = int_to_itoa64 (l & 0x3f); l >>= 6; + buf[ 6] = int_to_itoa64 (l & 0x3f); l >>= 6; + buf[ 7] = int_to_itoa64 (l & 0x3f); + + l = (digest[ 8] << 0) | (digest[ 7] << 8) | (digest[ 6] << 16); + + buf[ 8] = int_to_itoa64 (l & 0x3f); l >>= 6; + buf[ 9] = int_to_itoa64 (l & 0x3f); l >>= 6; + buf[10] = int_to_itoa64 (l & 0x3f); l >>= 6; + buf[11] = int_to_itoa64 (l & 0x3f); + + l = (digest[11] << 0) | (digest[10] << 8) | (digest[ 9] << 16); + + buf[12] = int_to_itoa64 (l & 0x3f); l >>= 6; + buf[13] = int_to_itoa64 (l & 0x3f); l >>= 6; + buf[14] = int_to_itoa64 (l & 0x3f); l >>= 6; + buf[15] = int_to_itoa64 (l & 0x3f); + + l = (digest[14] << 0) | (digest[13] << 8) | (digest[12] << 16); + + buf[16] = int_to_itoa64 (l & 0x3f); l >>= 6; + buf[17] = int_to_itoa64 (l & 0x3f); l >>= 6; + buf[18] = int_to_itoa64 (l & 0x3f); l >>= 6; + buf[19] = int_to_itoa64 (l & 0x3f); + + l = (digest[17] << 0) | (digest[16] << 8) | (digest[15] << 16); + + buf[20] = int_to_itoa64 (l & 0x3f); l >>= 6; + buf[21] = int_to_itoa64 (l & 0x3f); l >>= 6; + buf[22] = int_to_itoa64 (l & 0x3f); l >>= 6; + buf[23] = int_to_itoa64 (l & 0x3f); + + l = 0 | (digest[19] << 8) | (digest[18] << 16); + + buf[24] = int_to_itoa64 (l & 0x3f); l >>= 6; + buf[25] = int_to_itoa64 (l & 0x3f); l >>= 6; + buf[26] = int_to_itoa64 (l & 0x3f); +} + +void sha256aix_decode (unsigned char digest[32], unsigned char buf[43]) +{ + int l; + + l = itoa64_to_int (buf[ 0]) << 0; + l |= itoa64_to_int (buf[ 1]) << 6; + l |= itoa64_to_int (buf[ 2]) << 12; + l |= itoa64_to_int (buf[ 3]) << 18; + + digest[ 2] = (l >> 0) & 0xff; + digest[ 1] = (l >> 8) & 0xff; + digest[ 0] = (l >> 16) & 0xff; + + l = itoa64_to_int (buf[ 4]) << 0; + l |= itoa64_to_int (buf[ 5]) << 6; + l |= itoa64_to_int (buf[ 6]) << 12; + l |= itoa64_to_int (buf[ 7]) << 18; + + digest[ 5] = (l >> 0) & 0xff; + digest[ 4] = (l >> 8) & 0xff; + digest[ 3] = (l >> 16) & 0xff; + + l = itoa64_to_int (buf[ 8]) << 0; + l |= itoa64_to_int (buf[ 9]) << 6; + l |= itoa64_to_int (buf[10]) << 12; + l |= itoa64_to_int (buf[11]) << 18; + + digest[ 8] = (l >> 0) & 0xff; + digest[ 7] = (l >> 8) & 0xff; + digest[ 6] = (l >> 16) & 0xff; + + l = itoa64_to_int (buf[12]) << 0; + l |= itoa64_to_int (buf[13]) << 6; + l |= itoa64_to_int (buf[14]) << 12; + l |= itoa64_to_int (buf[15]) << 18; + + digest[11] = (l >> 0) & 0xff; + digest[10] = (l >> 8) & 0xff; + digest[ 9] = (l >> 16) & 0xff; + + l = itoa64_to_int (buf[16]) << 0; + l |= itoa64_to_int (buf[17]) << 6; + l |= itoa64_to_int (buf[18]) << 12; + l |= itoa64_to_int (buf[19]) << 18; + + digest[14] = (l >> 0) & 0xff; + digest[13] = (l >> 8) & 0xff; + digest[12] = (l >> 16) & 0xff; + + l = itoa64_to_int (buf[20]) << 0; + l |= itoa64_to_int (buf[21]) << 6; + l |= itoa64_to_int (buf[22]) << 12; + l |= itoa64_to_int (buf[23]) << 18; + + digest[17] = (l >> 0) & 0xff; + digest[16] = (l >> 8) & 0xff; + digest[15] = (l >> 16) & 0xff; + + l = itoa64_to_int (buf[24]) << 0; + l |= itoa64_to_int (buf[25]) << 6; + l |= itoa64_to_int (buf[26]) << 12; + l |= itoa64_to_int (buf[27]) << 18; + + digest[20] = (l >> 0) & 0xff; + digest[19] = (l >> 8) & 0xff; + digest[18] = (l >> 16) & 0xff; + + l = itoa64_to_int (buf[28]) << 0; + l |= itoa64_to_int (buf[29]) << 6; + l |= itoa64_to_int (buf[30]) << 12; + l |= itoa64_to_int (buf[31]) << 18; + + digest[23] = (l >> 0) & 0xff; + digest[22] = (l >> 8) & 0xff; + digest[21] = (l >> 16) & 0xff; + + l = itoa64_to_int (buf[32]) << 0; + l |= itoa64_to_int (buf[33]) << 6; + l |= itoa64_to_int (buf[34]) << 12; + l |= itoa64_to_int (buf[35]) << 18; + + digest[26] = (l >> 0) & 0xff; + digest[25] = (l >> 8) & 0xff; + digest[24] = (l >> 16) & 0xff; + + l = itoa64_to_int (buf[36]) << 0; + l |= itoa64_to_int (buf[37]) << 6; + l |= itoa64_to_int (buf[38]) << 12; + l |= itoa64_to_int (buf[39]) << 18; + + digest[29] = (l >> 0) & 0xff; + digest[28] = (l >> 8) & 0xff; + digest[27] = (l >> 16) & 0xff; + + l = itoa64_to_int (buf[40]) << 0; + l |= itoa64_to_int (buf[41]) << 6; + l |= itoa64_to_int (buf[42]) << 12; + + //digest[32] = (l >> 0) & 0xff; + digest[31] = (l >> 8) & 0xff; + digest[30] = (l >> 16) & 0xff; +} + +void sha256aix_encode (unsigned char digest[32], unsigned char buf[43]) +{ + int l; + + l = (digest[ 2] << 0) | (digest[ 1] << 8) | (digest[ 0] << 16); + + buf[ 0] = int_to_itoa64 (l & 0x3f); l >>= 6; + buf[ 1] = int_to_itoa64 (l & 0x3f); l >>= 6; + buf[ 2] = int_to_itoa64 (l & 0x3f); l >>= 6; + buf[ 3] = int_to_itoa64 (l & 0x3f); + + l = (digest[ 5] << 0) | (digest[ 4] << 8) | (digest[ 3] << 16); + + buf[ 4] = int_to_itoa64 (l & 0x3f); l >>= 6; + buf[ 5] = int_to_itoa64 (l & 0x3f); l >>= 6; + buf[ 6] = int_to_itoa64 (l & 0x3f); l >>= 6; + buf[ 7] = int_to_itoa64 (l & 0x3f); + + l = (digest[ 8] << 0) | (digest[ 7] << 8) | (digest[ 6] << 16); + + buf[ 8] = int_to_itoa64 (l & 0x3f); l >>= 6; + buf[ 9] = int_to_itoa64 (l & 0x3f); l >>= 6; + buf[10] = int_to_itoa64 (l & 0x3f); l >>= 6; + buf[11] = int_to_itoa64 (l & 0x3f); + + l = (digest[11] << 0) | (digest[10] << 8) | (digest[ 9] << 16); + + buf[12] = int_to_itoa64 (l & 0x3f); l >>= 6; + buf[13] = int_to_itoa64 (l & 0x3f); l >>= 6; + buf[14] = int_to_itoa64 (l & 0x3f); l >>= 6; + buf[15] = int_to_itoa64 (l & 0x3f); + + l = (digest[14] << 0) | (digest[13] << 8) | (digest[12] << 16); + + buf[16] = int_to_itoa64 (l & 0x3f); l >>= 6; + buf[17] = int_to_itoa64 (l & 0x3f); l >>= 6; + buf[18] = int_to_itoa64 (l & 0x3f); l >>= 6; + buf[19] = int_to_itoa64 (l & 0x3f); + + l = (digest[17] << 0) | (digest[16] << 8) | (digest[15] << 16); + + buf[20] = int_to_itoa64 (l & 0x3f); l >>= 6; + buf[21] = int_to_itoa64 (l & 0x3f); l >>= 6; + buf[22] = int_to_itoa64 (l & 0x3f); l >>= 6; + buf[23] = int_to_itoa64 (l & 0x3f); + + l = (digest[20] << 0) | (digest[19] << 8) | (digest[18] << 16); + + buf[24] = int_to_itoa64 (l & 0x3f); l >>= 6; + buf[25] = int_to_itoa64 (l & 0x3f); l >>= 6; + buf[26] = int_to_itoa64 (l & 0x3f); l >>= 6; + buf[27] = int_to_itoa64 (l & 0x3f); + + l = (digest[23] << 0) | (digest[22] << 8) | (digest[21] << 16); + + buf[28] = int_to_itoa64 (l & 0x3f); l >>= 6; + buf[29] = int_to_itoa64 (l & 0x3f); l >>= 6; + buf[30] = int_to_itoa64 (l & 0x3f); l >>= 6; + buf[31] = int_to_itoa64 (l & 0x3f); + + l = (digest[26] << 0) | (digest[25] << 8) | (digest[24] << 16); + + buf[32] = int_to_itoa64 (l & 0x3f); l >>= 6; + buf[33] = int_to_itoa64 (l & 0x3f); l >>= 6; + buf[34] = int_to_itoa64 (l & 0x3f); l >>= 6; + buf[35] = int_to_itoa64 (l & 0x3f); + + l = (digest[29] << 0) | (digest[28] << 8) | (digest[27] << 16); + + buf[36] = int_to_itoa64 (l & 0x3f); l >>= 6; + buf[37] = int_to_itoa64 (l & 0x3f); l >>= 6; + buf[38] = int_to_itoa64 (l & 0x3f); l >>= 6; + buf[39] = int_to_itoa64 (l & 0x3f); + + l = 0 | (digest[31] << 8) | (digest[30] << 16); + + buf[40] = int_to_itoa64 (l & 0x3f); l >>= 6; + buf[41] = int_to_itoa64 (l & 0x3f); l >>= 6; + buf[42] = int_to_itoa64 (l & 0x3f); +} + +void sha512aix_decode (unsigned char digest[64], unsigned char buf[86]) +{ + int l; + + l = itoa64_to_int (buf[ 0]) << 0; + l |= itoa64_to_int (buf[ 1]) << 6; + l |= itoa64_to_int (buf[ 2]) << 12; + l |= itoa64_to_int (buf[ 3]) << 18; + + digest[ 2] = (l >> 0) & 0xff; + digest[ 1] = (l >> 8) & 0xff; + digest[ 0] = (l >> 16) & 0xff; + + l = itoa64_to_int (buf[ 4]) << 0; + l |= itoa64_to_int (buf[ 5]) << 6; + l |= itoa64_to_int (buf[ 6]) << 12; + l |= itoa64_to_int (buf[ 7]) << 18; + + digest[ 5] = (l >> 0) & 0xff; + digest[ 4] = (l >> 8) & 0xff; + digest[ 3] = (l >> 16) & 0xff; + + l = itoa64_to_int (buf[ 8]) << 0; + l |= itoa64_to_int (buf[ 9]) << 6; + l |= itoa64_to_int (buf[10]) << 12; + l |= itoa64_to_int (buf[11]) << 18; + + digest[ 8] = (l >> 0) & 0xff; + digest[ 7] = (l >> 8) & 0xff; + digest[ 6] = (l >> 16) & 0xff; + + l = itoa64_to_int (buf[12]) << 0; + l |= itoa64_to_int (buf[13]) << 6; + l |= itoa64_to_int (buf[14]) << 12; + l |= itoa64_to_int (buf[15]) << 18; + + digest[11] = (l >> 0) & 0xff; + digest[10] = (l >> 8) & 0xff; + digest[ 9] = (l >> 16) & 0xff; + + l = itoa64_to_int (buf[16]) << 0; + l |= itoa64_to_int (buf[17]) << 6; + l |= itoa64_to_int (buf[18]) << 12; + l |= itoa64_to_int (buf[19]) << 18; + + digest[14] = (l >> 0) & 0xff; + digest[13] = (l >> 8) & 0xff; + digest[12] = (l >> 16) & 0xff; + + l = itoa64_to_int (buf[20]) << 0; + l |= itoa64_to_int (buf[21]) << 6; + l |= itoa64_to_int (buf[22]) << 12; + l |= itoa64_to_int (buf[23]) << 18; + + digest[17] = (l >> 0) & 0xff; + digest[16] = (l >> 8) & 0xff; + digest[15] = (l >> 16) & 0xff; + + l = itoa64_to_int (buf[24]) << 0; + l |= itoa64_to_int (buf[25]) << 6; + l |= itoa64_to_int (buf[26]) << 12; + l |= itoa64_to_int (buf[27]) << 18; + + digest[20] = (l >> 0) & 0xff; + digest[19] = (l >> 8) & 0xff; + digest[18] = (l >> 16) & 0xff; + + l = itoa64_to_int (buf[28]) << 0; + l |= itoa64_to_int (buf[29]) << 6; + l |= itoa64_to_int (buf[30]) << 12; + l |= itoa64_to_int (buf[31]) << 18; + + digest[23] = (l >> 0) & 0xff; + digest[22] = (l >> 8) & 0xff; + digest[21] = (l >> 16) & 0xff; + + l = itoa64_to_int (buf[32]) << 0; + l |= itoa64_to_int (buf[33]) << 6; + l |= itoa64_to_int (buf[34]) << 12; + l |= itoa64_to_int (buf[35]) << 18; + + digest[26] = (l >> 0) & 0xff; + digest[25] = (l >> 8) & 0xff; + digest[24] = (l >> 16) & 0xff; + + l = itoa64_to_int (buf[36]) << 0; + l |= itoa64_to_int (buf[37]) << 6; + l |= itoa64_to_int (buf[38]) << 12; + l |= itoa64_to_int (buf[39]) << 18; + + digest[29] = (l >> 0) & 0xff; + digest[28] = (l >> 8) & 0xff; + digest[27] = (l >> 16) & 0xff; + + l = itoa64_to_int (buf[40]) << 0; + l |= itoa64_to_int (buf[41]) << 6; + l |= itoa64_to_int (buf[42]) << 12; + l |= itoa64_to_int (buf[43]) << 18; + + digest[32] = (l >> 0) & 0xff; + digest[31] = (l >> 8) & 0xff; + digest[30] = (l >> 16) & 0xff; + + l = itoa64_to_int (buf[44]) << 0; + l |= itoa64_to_int (buf[45]) << 6; + l |= itoa64_to_int (buf[46]) << 12; + l |= itoa64_to_int (buf[47]) << 18; + + digest[35] = (l >> 0) & 0xff; + digest[34] = (l >> 8) & 0xff; + digest[33] = (l >> 16) & 0xff; + + l = itoa64_to_int (buf[48]) << 0; + l |= itoa64_to_int (buf[49]) << 6; + l |= itoa64_to_int (buf[50]) << 12; + l |= itoa64_to_int (buf[51]) << 18; + + digest[38] = (l >> 0) & 0xff; + digest[37] = (l >> 8) & 0xff; + digest[36] = (l >> 16) & 0xff; + + l = itoa64_to_int (buf[52]) << 0; + l |= itoa64_to_int (buf[53]) << 6; + l |= itoa64_to_int (buf[54]) << 12; + l |= itoa64_to_int (buf[55]) << 18; + + digest[41] = (l >> 0) & 0xff; + digest[40] = (l >> 8) & 0xff; + digest[39] = (l >> 16) & 0xff; + + l = itoa64_to_int (buf[56]) << 0; + l |= itoa64_to_int (buf[57]) << 6; + l |= itoa64_to_int (buf[58]) << 12; + l |= itoa64_to_int (buf[59]) << 18; + + digest[44] = (l >> 0) & 0xff; + digest[43] = (l >> 8) & 0xff; + digest[42] = (l >> 16) & 0xff; + + l = itoa64_to_int (buf[60]) << 0; + l |= itoa64_to_int (buf[61]) << 6; + l |= itoa64_to_int (buf[62]) << 12; + l |= itoa64_to_int (buf[63]) << 18; + + digest[47] = (l >> 0) & 0xff; + digest[46] = (l >> 8) & 0xff; + digest[45] = (l >> 16) & 0xff; + + l = itoa64_to_int (buf[64]) << 0; + l |= itoa64_to_int (buf[65]) << 6; + l |= itoa64_to_int (buf[66]) << 12; + l |= itoa64_to_int (buf[67]) << 18; + + digest[50] = (l >> 0) & 0xff; + digest[49] = (l >> 8) & 0xff; + digest[48] = (l >> 16) & 0xff; + + l = itoa64_to_int (buf[68]) << 0; + l |= itoa64_to_int (buf[69]) << 6; + l |= itoa64_to_int (buf[70]) << 12; + l |= itoa64_to_int (buf[71]) << 18; + + digest[53] = (l >> 0) & 0xff; + digest[52] = (l >> 8) & 0xff; + digest[51] = (l >> 16) & 0xff; + + l = itoa64_to_int (buf[72]) << 0; + l |= itoa64_to_int (buf[73]) << 6; + l |= itoa64_to_int (buf[74]) << 12; + l |= itoa64_to_int (buf[75]) << 18; + + digest[56] = (l >> 0) & 0xff; + digest[55] = (l >> 8) & 0xff; + digest[54] = (l >> 16) & 0xff; + + l = itoa64_to_int (buf[76]) << 0; + l |= itoa64_to_int (buf[77]) << 6; + l |= itoa64_to_int (buf[78]) << 12; + l |= itoa64_to_int (buf[79]) << 18; + + digest[59] = (l >> 0) & 0xff; + digest[58] = (l >> 8) & 0xff; + digest[57] = (l >> 16) & 0xff; + + l = itoa64_to_int (buf[80]) << 0; + l |= itoa64_to_int (buf[81]) << 6; + l |= itoa64_to_int (buf[82]) << 12; + l |= itoa64_to_int (buf[83]) << 18; + + digest[62] = (l >> 0) & 0xff; + digest[61] = (l >> 8) & 0xff; + digest[60] = (l >> 16) & 0xff; + + l = itoa64_to_int (buf[84]) << 0; + l |= itoa64_to_int (buf[85]) << 6; + + digest[63] = (l >> 16) & 0xff; +} + +void sha512aix_encode (unsigned char digest[64], unsigned char buf[86]) +{ + int l; + + l = (digest[ 2] << 0) | (digest[ 1] << 8) | (digest[ 0] << 16); + + buf[ 0] = int_to_itoa64 (l & 0x3f); l >>= 6; + buf[ 1] = int_to_itoa64 (l & 0x3f); l >>= 6; + buf[ 2] = int_to_itoa64 (l & 0x3f); l >>= 6; + buf[ 3] = int_to_itoa64 (l & 0x3f); + + l = (digest[ 5] << 0) | (digest[ 4] << 8) | (digest[ 3] << 16); + + buf[ 4] = int_to_itoa64 (l & 0x3f); l >>= 6; + buf[ 5] = int_to_itoa64 (l & 0x3f); l >>= 6; + buf[ 6] = int_to_itoa64 (l & 0x3f); l >>= 6; + buf[ 7] = int_to_itoa64 (l & 0x3f); + + l = (digest[ 8] << 0) | (digest[ 7] << 8) | (digest[ 6] << 16); + + buf[ 8] = int_to_itoa64 (l & 0x3f); l >>= 6; + buf[ 9] = int_to_itoa64 (l & 0x3f); l >>= 6; + buf[10] = int_to_itoa64 (l & 0x3f); l >>= 6; + buf[11] = int_to_itoa64 (l & 0x3f); + + l = (digest[11] << 0) | (digest[10] << 8) | (digest[ 9] << 16); + + buf[12] = int_to_itoa64 (l & 0x3f); l >>= 6; + buf[13] = int_to_itoa64 (l & 0x3f); l >>= 6; + buf[14] = int_to_itoa64 (l & 0x3f); l >>= 6; + buf[15] = int_to_itoa64 (l & 0x3f); + + l = (digest[14] << 0) | (digest[13] << 8) | (digest[12] << 16); + + buf[16] = int_to_itoa64 (l & 0x3f); l >>= 6; + buf[17] = int_to_itoa64 (l & 0x3f); l >>= 6; + buf[18] = int_to_itoa64 (l & 0x3f); l >>= 6; + buf[19] = int_to_itoa64 (l & 0x3f); + + l = (digest[17] << 0) | (digest[16] << 8) | (digest[15] << 16); + + buf[20] = int_to_itoa64 (l & 0x3f); l >>= 6; + buf[21] = int_to_itoa64 (l & 0x3f); l >>= 6; + buf[22] = int_to_itoa64 (l & 0x3f); l >>= 6; + buf[23] = int_to_itoa64 (l & 0x3f); + + l = (digest[20] << 0) | (digest[19] << 8) | (digest[18] << 16); + + buf[24] = int_to_itoa64 (l & 0x3f); l >>= 6; + buf[25] = int_to_itoa64 (l & 0x3f); l >>= 6; + buf[26] = int_to_itoa64 (l & 0x3f); l >>= 6; + buf[27] = int_to_itoa64 (l & 0x3f); + + l = (digest[23] << 0) | (digest[22] << 8) | (digest[21] << 16); + + buf[28] = int_to_itoa64 (l & 0x3f); l >>= 6; + buf[29] = int_to_itoa64 (l & 0x3f); l >>= 6; + buf[30] = int_to_itoa64 (l & 0x3f); l >>= 6; + buf[31] = int_to_itoa64 (l & 0x3f); + + l = (digest[26] << 0) | (digest[25] << 8) | (digest[24] << 16); + + buf[32] = int_to_itoa64 (l & 0x3f); l >>= 6; + buf[33] = int_to_itoa64 (l & 0x3f); l >>= 6; + buf[34] = int_to_itoa64 (l & 0x3f); l >>= 6; + buf[35] = int_to_itoa64 (l & 0x3f); + + l = (digest[29] << 0) | (digest[28] << 8) | (digest[27] << 16); + + buf[36] = int_to_itoa64 (l & 0x3f); l >>= 6; + buf[37] = int_to_itoa64 (l & 0x3f); l >>= 6; + buf[38] = int_to_itoa64 (l & 0x3f); l >>= 6; + buf[39] = int_to_itoa64 (l & 0x3f); + + l = (digest[32] << 0) | (digest[31] << 8) | (digest[30] << 16); + + buf[40] = int_to_itoa64 (l & 0x3f); l >>= 6; + buf[41] = int_to_itoa64 (l & 0x3f); l >>= 6; + buf[42] = int_to_itoa64 (l & 0x3f); l >>= 6; + buf[43] = int_to_itoa64 (l & 0x3f); + + l = (digest[35] << 0) | (digest[34] << 8) | (digest[33] << 16); + + buf[44] = int_to_itoa64 (l & 0x3f); l >>= 6; + buf[45] = int_to_itoa64 (l & 0x3f); l >>= 6; + buf[46] = int_to_itoa64 (l & 0x3f); l >>= 6; + buf[47] = int_to_itoa64 (l & 0x3f); + + l = (digest[38] << 0) | (digest[37] << 8) | (digest[36] << 16); + + buf[48] = int_to_itoa64 (l & 0x3f); l >>= 6; + buf[49] = int_to_itoa64 (l & 0x3f); l >>= 6; + buf[50] = int_to_itoa64 (l & 0x3f); l >>= 6; + buf[51] = int_to_itoa64 (l & 0x3f); + + l = (digest[41] << 0) | (digest[40] << 8) | (digest[39] << 16); + + buf[52] = int_to_itoa64 (l & 0x3f); l >>= 6; + buf[53] = int_to_itoa64 (l & 0x3f); l >>= 6; + buf[54] = int_to_itoa64 (l & 0x3f); l >>= 6; + buf[55] = int_to_itoa64 (l & 0x3f); + + l = (digest[44] << 0) | (digest[43] << 8) | (digest[42] << 16); + + buf[56] = int_to_itoa64 (l & 0x3f); l >>= 6; + buf[57] = int_to_itoa64 (l & 0x3f); l >>= 6; + buf[58] = int_to_itoa64 (l & 0x3f); l >>= 6; + buf[59] = int_to_itoa64 (l & 0x3f); + + l = (digest[47] << 0) | (digest[46] << 8) | (digest[45] << 16); + + buf[60] = int_to_itoa64 (l & 0x3f); l >>= 6; + buf[61] = int_to_itoa64 (l & 0x3f); l >>= 6; + buf[62] = int_to_itoa64 (l & 0x3f); l >>= 6; + buf[63] = int_to_itoa64 (l & 0x3f); + + l = (digest[50] << 0) | (digest[49] << 8) | (digest[48] << 16); + + buf[64] = int_to_itoa64 (l & 0x3f); l >>= 6; + buf[65] = int_to_itoa64 (l & 0x3f); l >>= 6; + buf[66] = int_to_itoa64 (l & 0x3f); l >>= 6; + buf[67] = int_to_itoa64 (l & 0x3f); + + l = (digest[53] << 0) | (digest[52] << 8) | (digest[51] << 16); + + buf[68] = int_to_itoa64 (l & 0x3f); l >>= 6; + buf[69] = int_to_itoa64 (l & 0x3f); l >>= 6; + buf[70] = int_to_itoa64 (l & 0x3f); l >>= 6; + buf[71] = int_to_itoa64 (l & 0x3f); + + l = (digest[56] << 0) | (digest[55] << 8) | (digest[54] << 16); + + buf[72] = int_to_itoa64 (l & 0x3f); l >>= 6; + buf[73] = int_to_itoa64 (l & 0x3f); l >>= 6; + buf[74] = int_to_itoa64 (l & 0x3f); l >>= 6; + buf[75] = int_to_itoa64 (l & 0x3f); + + l = (digest[59] << 0) | (digest[58] << 8) | (digest[57] << 16); + + buf[76] = int_to_itoa64 (l & 0x3f); l >>= 6; + buf[77] = int_to_itoa64 (l & 0x3f); l >>= 6; + buf[78] = int_to_itoa64 (l & 0x3f); l >>= 6; + buf[79] = int_to_itoa64 (l & 0x3f); + + l = (digest[62] << 0) | (digest[61] << 8) | (digest[60] << 16); + + buf[80] = int_to_itoa64 (l & 0x3f); l >>= 6; + buf[81] = int_to_itoa64 (l & 0x3f); l >>= 6; + buf[82] = int_to_itoa64 (l & 0x3f); l >>= 6; + buf[83] = int_to_itoa64 (l & 0x3f); + + l = 0 | 0 | (digest[63] << 16); + + buf[84] = int_to_itoa64 (l & 0x3f); l >>= 6; + buf[85] = int_to_itoa64 (l & 0x3f); l >>= 6; +} + +void sha256crypt_decode (unsigned char digest[32], unsigned char buf[43]) +{ + int l; + + l = itoa64_to_int (buf[ 0]) << 0; + l |= itoa64_to_int (buf[ 1]) << 6; + l |= itoa64_to_int (buf[ 2]) << 12; + l |= itoa64_to_int (buf[ 3]) << 18; + + digest[ 0] = (l >> 16) & 0xff; + digest[10] = (l >> 8) & 0xff; + digest[20] = (l >> 0) & 0xff; + + l = itoa64_to_int (buf[ 4]) << 0; + l |= itoa64_to_int (buf[ 5]) << 6; + l |= itoa64_to_int (buf[ 6]) << 12; + l |= itoa64_to_int (buf[ 7]) << 18; + + digest[21] = (l >> 16) & 0xff; + digest[ 1] = (l >> 8) & 0xff; + digest[11] = (l >> 0) & 0xff; + + l = itoa64_to_int (buf[ 8]) << 0; + l |= itoa64_to_int (buf[ 9]) << 6; + l |= itoa64_to_int (buf[10]) << 12; + l |= itoa64_to_int (buf[11]) << 18; + + digest[12] = (l >> 16) & 0xff; + digest[22] = (l >> 8) & 0xff; + digest[ 2] = (l >> 0) & 0xff; + + l = itoa64_to_int (buf[12]) << 0; + l |= itoa64_to_int (buf[13]) << 6; + l |= itoa64_to_int (buf[14]) << 12; + l |= itoa64_to_int (buf[15]) << 18; + + digest[ 3] = (l >> 16) & 0xff; + digest[13] = (l >> 8) & 0xff; + digest[23] = (l >> 0) & 0xff; + + l = itoa64_to_int (buf[16]) << 0; + l |= itoa64_to_int (buf[17]) << 6; + l |= itoa64_to_int (buf[18]) << 12; + l |= itoa64_to_int (buf[19]) << 18; + + digest[24] = (l >> 16) & 0xff; + digest[ 4] = (l >> 8) & 0xff; + digest[14] = (l >> 0) & 0xff; + + l = itoa64_to_int (buf[20]) << 0; + l |= itoa64_to_int (buf[21]) << 6; + l |= itoa64_to_int (buf[22]) << 12; + l |= itoa64_to_int (buf[23]) << 18; + + digest[15] = (l >> 16) & 0xff; + digest[25] = (l >> 8) & 0xff; + digest[ 5] = (l >> 0) & 0xff; + + l = itoa64_to_int (buf[24]) << 0; + l |= itoa64_to_int (buf[25]) << 6; + l |= itoa64_to_int (buf[26]) << 12; + l |= itoa64_to_int (buf[27]) << 18; + + digest[ 6] = (l >> 16) & 0xff; + digest[16] = (l >> 8) & 0xff; + digest[26] = (l >> 0) & 0xff; + + l = itoa64_to_int (buf[28]) << 0; + l |= itoa64_to_int (buf[29]) << 6; + l |= itoa64_to_int (buf[30]) << 12; + l |= itoa64_to_int (buf[31]) << 18; + + digest[27] = (l >> 16) & 0xff; + digest[ 7] = (l >> 8) & 0xff; + digest[17] = (l >> 0) & 0xff; + + l = itoa64_to_int (buf[32]) << 0; + l |= itoa64_to_int (buf[33]) << 6; + l |= itoa64_to_int (buf[34]) << 12; + l |= itoa64_to_int (buf[35]) << 18; + + digest[18] = (l >> 16) & 0xff; + digest[28] = (l >> 8) & 0xff; + digest[ 8] = (l >> 0) & 0xff; + + l = itoa64_to_int (buf[36]) << 0; + l |= itoa64_to_int (buf[37]) << 6; + l |= itoa64_to_int (buf[38]) << 12; + l |= itoa64_to_int (buf[39]) << 18; + + digest[ 9] = (l >> 16) & 0xff; + digest[19] = (l >> 8) & 0xff; + digest[29] = (l >> 0) & 0xff; + + l = itoa64_to_int (buf[40]) << 0; + l |= itoa64_to_int (buf[41]) << 6; + l |= itoa64_to_int (buf[42]) << 12; + + digest[31] = (l >> 8) & 0xff; + digest[30] = (l >> 0) & 0xff; +} + +void sha256crypt_encode (unsigned char digest[32], unsigned char buf[43]) +{ + int l; + + l = (digest[ 0] << 16) | (digest[10] << 8) | (digest[20] << 0); + + buf[ 0] = int_to_itoa64 (l & 0x3f); l >>= 6; + buf[ 1] = int_to_itoa64 (l & 0x3f); l >>= 6; + buf[ 2] = int_to_itoa64 (l & 0x3f); l >>= 6; + buf[ 3] = int_to_itoa64 (l & 0x3f); l >>= 6; + + l = (digest[21] << 16) | (digest[ 1] << 8) | (digest[11] << 0); + + buf[ 4] = int_to_itoa64 (l & 0x3f); l >>= 6; + buf[ 5] = int_to_itoa64 (l & 0x3f); l >>= 6; + buf[ 6] = int_to_itoa64 (l & 0x3f); l >>= 6; + buf[ 7] = int_to_itoa64 (l & 0x3f); l >>= 6; + + l = (digest[12] << 16) | (digest[22] << 8) | (digest[ 2] << 0); + + buf[ 8] = int_to_itoa64 (l & 0x3f); l >>= 6; + buf[ 9] = int_to_itoa64 (l & 0x3f); l >>= 6; + buf[10] = int_to_itoa64 (l & 0x3f); l >>= 6; + buf[11] = int_to_itoa64 (l & 0x3f); l >>= 6; + + l = (digest[ 3] << 16) | (digest[13] << 8) | (digest[23] << 0); + + buf[12] = int_to_itoa64 (l & 0x3f); l >>= 6; + buf[13] = int_to_itoa64 (l & 0x3f); l >>= 6; + buf[14] = int_to_itoa64 (l & 0x3f); l >>= 6; + buf[15] = int_to_itoa64 (l & 0x3f); l >>= 6; + + l = (digest[24] << 16) | (digest[ 4] << 8) | (digest[14] << 0); + + buf[16] = int_to_itoa64 (l & 0x3f); l >>= 6; + buf[17] = int_to_itoa64 (l & 0x3f); l >>= 6; + buf[18] = int_to_itoa64 (l & 0x3f); l >>= 6; + buf[19] = int_to_itoa64 (l & 0x3f); l >>= 6; + + l = (digest[15] << 16) | (digest[25] << 8) | (digest[ 5] << 0); + + buf[20] = int_to_itoa64 (l & 0x3f); l >>= 6; + buf[21] = int_to_itoa64 (l & 0x3f); l >>= 6; + buf[22] = int_to_itoa64 (l & 0x3f); l >>= 6; + buf[23] = int_to_itoa64 (l & 0x3f); l >>= 6; + + l = (digest[ 6] << 16) | (digest[16] << 8) | (digest[26] << 0); + + buf[24] = int_to_itoa64 (l & 0x3f); l >>= 6; + buf[25] = int_to_itoa64 (l & 0x3f); l >>= 6; + buf[26] = int_to_itoa64 (l & 0x3f); l >>= 6; + buf[27] = int_to_itoa64 (l & 0x3f); l >>= 6; + + l = (digest[27] << 16) | (digest[ 7] << 8) | (digest[17] << 0); + + buf[28] = int_to_itoa64 (l & 0x3f); l >>= 6; + buf[29] = int_to_itoa64 (l & 0x3f); l >>= 6; + buf[30] = int_to_itoa64 (l & 0x3f); l >>= 6; + buf[31] = int_to_itoa64 (l & 0x3f); l >>= 6; + + l = (digest[18] << 16) | (digest[28] << 8) | (digest[ 8] << 0); + + buf[32] = int_to_itoa64 (l & 0x3f); l >>= 6; + buf[33] = int_to_itoa64 (l & 0x3f); l >>= 6; + buf[34] = int_to_itoa64 (l & 0x3f); l >>= 6; + buf[35] = int_to_itoa64 (l & 0x3f); l >>= 6; + + l = (digest[ 9] << 16) | (digest[19] << 8) | (digest[29] << 0); + + buf[36] = int_to_itoa64 (l & 0x3f); l >>= 6; + buf[37] = int_to_itoa64 (l & 0x3f); l >>= 6; + buf[38] = int_to_itoa64 (l & 0x3f); l >>= 6; + buf[39] = int_to_itoa64 (l & 0x3f); l >>= 6; + + l = 0 | (digest[31] << 8) | (digest[30] << 0); + + buf[40] = int_to_itoa64 (l & 0x3f); l >>= 6; + buf[41] = int_to_itoa64 (l & 0x3f); l >>= 6; + buf[42] = int_to_itoa64 (l & 0x3f); +} + +void drupal7_decode (unsigned char digest[64], unsigned char buf[44]) +{ + int l; + + l = itoa64_to_int (buf[ 0]) << 0; + l |= itoa64_to_int (buf[ 1]) << 6; + l |= itoa64_to_int (buf[ 2]) << 12; + l |= itoa64_to_int (buf[ 3]) << 18; + + digest[ 0] = (l >> 0) & 0xff; + digest[ 1] = (l >> 8) & 0xff; + digest[ 2] = (l >> 16) & 0xff; + + l = itoa64_to_int (buf[ 4]) << 0; + l |= itoa64_to_int (buf[ 5]) << 6; + l |= itoa64_to_int (buf[ 6]) << 12; + l |= itoa64_to_int (buf[ 7]) << 18; + + digest[ 3] = (l >> 0) & 0xff; + digest[ 4] = (l >> 8) & 0xff; + digest[ 5] = (l >> 16) & 0xff; + + l = itoa64_to_int (buf[ 8]) << 0; + l |= itoa64_to_int (buf[ 9]) << 6; + l |= itoa64_to_int (buf[10]) << 12; + l |= itoa64_to_int (buf[11]) << 18; + + digest[ 6] = (l >> 0) & 0xff; + digest[ 7] = (l >> 8) & 0xff; + digest[ 8] = (l >> 16) & 0xff; + + l = itoa64_to_int (buf[12]) << 0; + l |= itoa64_to_int (buf[13]) << 6; + l |= itoa64_to_int (buf[14]) << 12; + l |= itoa64_to_int (buf[15]) << 18; + + digest[ 9] = (l >> 0) & 0xff; + digest[10] = (l >> 8) & 0xff; + digest[11] = (l >> 16) & 0xff; + + l = itoa64_to_int (buf[16]) << 0; + l |= itoa64_to_int (buf[17]) << 6; + l |= itoa64_to_int (buf[18]) << 12; + l |= itoa64_to_int (buf[19]) << 18; + + digest[12] = (l >> 0) & 0xff; + digest[13] = (l >> 8) & 0xff; + digest[14] = (l >> 16) & 0xff; + + l = itoa64_to_int (buf[20]) << 0; + l |= itoa64_to_int (buf[21]) << 6; + l |= itoa64_to_int (buf[22]) << 12; + l |= itoa64_to_int (buf[23]) << 18; + + digest[15] = (l >> 0) & 0xff; + digest[16] = (l >> 8) & 0xff; + digest[17] = (l >> 16) & 0xff; + + l = itoa64_to_int (buf[24]) << 0; + l |= itoa64_to_int (buf[25]) << 6; + l |= itoa64_to_int (buf[26]) << 12; + l |= itoa64_to_int (buf[27]) << 18; + + digest[18] = (l >> 0) & 0xff; + digest[19] = (l >> 8) & 0xff; + digest[20] = (l >> 16) & 0xff; + + l = itoa64_to_int (buf[28]) << 0; + l |= itoa64_to_int (buf[29]) << 6; + l |= itoa64_to_int (buf[30]) << 12; + l |= itoa64_to_int (buf[31]) << 18; + + digest[21] = (l >> 0) & 0xff; + digest[22] = (l >> 8) & 0xff; + digest[23] = (l >> 16) & 0xff; + + l = itoa64_to_int (buf[32]) << 0; + l |= itoa64_to_int (buf[33]) << 6; + l |= itoa64_to_int (buf[34]) << 12; + l |= itoa64_to_int (buf[35]) << 18; + + digest[24] = (l >> 0) & 0xff; + digest[25] = (l >> 8) & 0xff; + digest[26] = (l >> 16) & 0xff; + + l = itoa64_to_int (buf[36]) << 0; + l |= itoa64_to_int (buf[37]) << 6; + l |= itoa64_to_int (buf[38]) << 12; + l |= itoa64_to_int (buf[39]) << 18; + + digest[27] = (l >> 0) & 0xff; + digest[28] = (l >> 8) & 0xff; + digest[29] = (l >> 16) & 0xff; + + l = itoa64_to_int (buf[40]) << 0; + l |= itoa64_to_int (buf[41]) << 6; + l |= itoa64_to_int (buf[42]) << 12; + l |= itoa64_to_int (buf[43]) << 18; + + digest[30] = (l >> 0) & 0xff; + digest[31] = (l >> 8) & 0xff; + digest[32] = (l >> 16) & 0xff; + + digest[33] = 0; + digest[34] = 0; + digest[35] = 0; + digest[36] = 0; + digest[37] = 0; + digest[38] = 0; + digest[39] = 0; + digest[40] = 0; + digest[41] = 0; + digest[42] = 0; + digest[43] = 0; + digest[44] = 0; + digest[45] = 0; + digest[46] = 0; + digest[47] = 0; + digest[48] = 0; + digest[49] = 0; + digest[50] = 0; + digest[51] = 0; + digest[52] = 0; + digest[53] = 0; + digest[54] = 0; + digest[55] = 0; + digest[56] = 0; + digest[57] = 0; + digest[58] = 0; + digest[59] = 0; + digest[60] = 0; + digest[61] = 0; + digest[62] = 0; + digest[63] = 0; +} + +void drupal7_encode (unsigned char digest[64], unsigned char buf[43]) +{ + int l; + + l = (digest[ 0] << 0) | (digest[ 1] << 8) | (digest[ 2] << 16); + + buf[ 0] = int_to_itoa64 (l & 0x3f); l >>= 6; + buf[ 1] = int_to_itoa64 (l & 0x3f); l >>= 6; + buf[ 2] = int_to_itoa64 (l & 0x3f); l >>= 6; + buf[ 3] = int_to_itoa64 (l & 0x3f); + + l = (digest[ 3] << 0) | (digest[ 4] << 8) | (digest[ 5] << 16); + + buf[ 4] = int_to_itoa64 (l & 0x3f); l >>= 6; + buf[ 5] = int_to_itoa64 (l & 0x3f); l >>= 6; + buf[ 6] = int_to_itoa64 (l & 0x3f); l >>= 6; + buf[ 7] = int_to_itoa64 (l & 0x3f); + + l = (digest[ 6] << 0) | (digest[ 7] << 8) | (digest[ 8] << 16); + + buf[ 8] = int_to_itoa64 (l & 0x3f); l >>= 6; + buf[ 9] = int_to_itoa64 (l & 0x3f); l >>= 6; + buf[10] = int_to_itoa64 (l & 0x3f); l >>= 6; + buf[11] = int_to_itoa64 (l & 0x3f); + + l = (digest[ 9] << 0) | (digest[10] << 8) | (digest[11] << 16); + + buf[12] = int_to_itoa64 (l & 0x3f); l >>= 6; + buf[13] = int_to_itoa64 (l & 0x3f); l >>= 6; + buf[14] = int_to_itoa64 (l & 0x3f); l >>= 6; + buf[15] = int_to_itoa64 (l & 0x3f); + + l = (digest[12] << 0) | (digest[13] << 8) | (digest[14] << 16); + + buf[16] = int_to_itoa64 (l & 0x3f); l >>= 6; + buf[17] = int_to_itoa64 (l & 0x3f); l >>= 6; + buf[18] = int_to_itoa64 (l & 0x3f); l >>= 6; + buf[19] = int_to_itoa64 (l & 0x3f); + + l = (digest[15] << 0) | (digest[16] << 8) | (digest[17] << 16); + + buf[20] = int_to_itoa64 (l & 0x3f); l >>= 6; + buf[21] = int_to_itoa64 (l & 0x3f); l >>= 6; + buf[22] = int_to_itoa64 (l & 0x3f); l >>= 6; + buf[23] = int_to_itoa64 (l & 0x3f); + + l = (digest[18] << 0) | (digest[19] << 8) | (digest[20] << 16); + + buf[24] = int_to_itoa64 (l & 0x3f); l >>= 6; + buf[25] = int_to_itoa64 (l & 0x3f); l >>= 6; + buf[26] = int_to_itoa64 (l & 0x3f); l >>= 6; + buf[27] = int_to_itoa64 (l & 0x3f); + + l = (digest[21] << 0) | (digest[22] << 8) | (digest[23] << 16); + + buf[28] = int_to_itoa64 (l & 0x3f); l >>= 6; + buf[29] = int_to_itoa64 (l & 0x3f); l >>= 6; + buf[30] = int_to_itoa64 (l & 0x3f); l >>= 6; + buf[31] = int_to_itoa64 (l & 0x3f); + + l = (digest[24] << 0) | (digest[25] << 8) | (digest[26] << 16); + + buf[32] = int_to_itoa64 (l & 0x3f); l >>= 6; + buf[33] = int_to_itoa64 (l & 0x3f); l >>= 6; + buf[34] = int_to_itoa64 (l & 0x3f); l >>= 6; + buf[35] = int_to_itoa64 (l & 0x3f); + + l = (digest[27] << 0) | (digest[28] << 8) | (digest[29] << 16); + + buf[36] = int_to_itoa64 (l & 0x3f); l >>= 6; + buf[37] = int_to_itoa64 (l & 0x3f); l >>= 6; + buf[38] = int_to_itoa64 (l & 0x3f); l >>= 6; + buf[39] = int_to_itoa64 (l & 0x3f); + + l = (digest[30] << 0) | (digest[31] << 8) | (digest[32] << 16); + + buf[40] = int_to_itoa64 (l & 0x3f); l >>= 6; + buf[41] = int_to_itoa64 (l & 0x3f); l >>= 6; + buf[42] = int_to_itoa64 (l & 0x3f); l >>= 6; + //buf[43] = int_to_itoa64 (l & 0x3f); +} + +/** + * tty + */ + +#ifdef LINUX +static struct termio savemodes; +static int havemodes = 0; + +int tty_break() +{ + struct termio modmodes; + + if (ioctl (fileno (stdin), TCGETA, &savemodes) < 0) return -1; + + havemodes = 1; + + modmodes = savemodes; + modmodes.c_lflag &= ~ICANON; + modmodes.c_cc[VMIN] = 1; + modmodes.c_cc[VTIME] = 0; + + return ioctl (fileno (stdin), TCSETAW, &modmodes); +} + +int tty_getchar() +{ + fd_set rfds; + + FD_ZERO (&rfds); + + FD_SET (fileno (stdin), &rfds); + + struct timeval tv; + + tv.tv_sec = 1; + tv.tv_usec = 0; + + int retval = select (1, &rfds, NULL, NULL, &tv); + + if (retval == 0) return 0; + if (retval == -1) return -1; + + return getchar(); +} + +int tty_fix() +{ + if (!havemodes) return 0; + + return ioctl (fileno (stdin), TCSETAW, &savemodes); +} +#endif + +#ifdef OSX +static struct termios savemodes; +static int havemodes = 0; + +int tty_break() +{ + struct termios modmodes; + + if (ioctl (fileno (stdin), TIOCGETA, &savemodes) < 0) return -1; + + havemodes = 1; + + modmodes = savemodes; + modmodes.c_lflag &= ~ICANON; + modmodes.c_cc[VMIN] = 1; + modmodes.c_cc[VTIME] = 0; + + return ioctl (fileno (stdin), TIOCSETAW, &modmodes); +} + +int tty_getchar() +{ + fd_set rfds; + + FD_ZERO (&rfds); + + FD_SET (fileno (stdin), &rfds); + + struct timeval tv; + + tv.tv_sec = 1; + tv.tv_usec = 0; + + int retval = select (1, &rfds, NULL, NULL, &tv); + + if (retval == 0) return 0; + if (retval == -1) return -1; + + return getchar(); +} + +int tty_fix() +{ + if (!havemodes) return 0; + + return ioctl (fileno (stdin), TIOCSETAW, &savemodes); +} +#endif + +#ifdef WIN +static DWORD saveMode = 0; + +int tty_break() +{ + HANDLE stdinHandle = GetStdHandle (STD_INPUT_HANDLE); + + GetConsoleMode (stdinHandle, &saveMode); + SetConsoleMode (stdinHandle, ENABLE_PROCESSED_INPUT); + + return 0; +} + +int tty_getchar() +{ + HANDLE stdinHandle = GetStdHandle (STD_INPUT_HANDLE); + + DWORD rc = WaitForSingleObject (stdinHandle, 1000); + + if (rc == WAIT_TIMEOUT) return 0; + if (rc == WAIT_ABANDONED) return -1; + if (rc == WAIT_FAILED) return -1; + + // The whole ReadConsoleInput () part is a workaround. + // For some unknown reason, maybe a mingw bug, a random signal + // is sent to stdin which unblocks WaitForSingleObject () and sets rc 0. + // Then it wants to read with getche () a keyboard input + // which has never been made. + + INPUT_RECORD buf[100]; + + DWORD num = 0; + + ReadConsoleInput (stdinHandle, buf, 100, &num); + + FlushConsoleInputBuffer (stdinHandle); + + for (uint i = 0; i < num; i++) + { + if (buf[i].EventType != KEY_EVENT) continue; + + KEY_EVENT_RECORD KeyEvent = buf[i].Event.KeyEvent; + + if (KeyEvent.bKeyDown != TRUE) continue; + + return KeyEvent.uChar.AsciiChar; + } + + return 0; +} + +int tty_fix() +{ + HANDLE stdinHandle = GetStdHandle (STD_INPUT_HANDLE); + + SetConsoleMode (stdinHandle, saveMode); + + return 0; +} +#endif + +/** + * mem alloc + */ + +#define MSG_ENOMEM "Insufficient memory available" + +void *mycalloc (size_t nmemb, size_t size) +{ + void *p = calloc (nmemb, size); + + if (p == NULL) + { + log_error ("ERROR: %s", MSG_ENOMEM); + + exit (-1); + } + + return (p); +} + +void *mymalloc (size_t size) +{ + void *p = malloc (size); + + if (p == NULL) + { + log_error ("ERROR: %s", MSG_ENOMEM); + + exit (-1); + } + + memset (p, 0, size); + + return (p); +} + +void myfree (void *ptr) +{ + if (ptr == NULL) return; + + free (ptr); +} + +void *myrealloc (void *ptr, size_t oldsz, size_t add) +{ + void *p = realloc (ptr, oldsz + add); + + if (p == NULL) + { + log_error ("ERROR: %s", MSG_ENOMEM); + + exit (-1); + } + + memset ((char *) p + oldsz, 0, add); + + return (p); +} + +char *mystrdup (const char *s) +{ + const size_t len = strlen (s); + + char *b = (char *) mymalloc (len + 1); + + memcpy (b, s, len); + + return (b); +} + +FILE *logfile_open (char *logfile) +{ + FILE *fp = fopen (logfile, "ab"); + + if (fp == NULL) + { + fp = stdout; + } + + return fp; +} + +void logfile_close (FILE *fp) +{ + if (fp == stdout) return; + + fclose (fp); +} + +void logfile_append (const char *fmt, ...) +{ + if (data.logfile_disable == 1) return; + + FILE *fp = logfile_open (data.logfile); + + va_list ap; + + va_start (ap, fmt); + + vfprintf (fp, fmt, ap); + + va_end (ap); + + fputc ('\n', fp); + + fflush (fp); + + logfile_close (fp); +} + +int logfile_generate_id () +{ + const int n = rand (); + + time_t t; + + time (&t); + + return t + n; +} + +char *logfile_generate_topid () +{ + const int id = logfile_generate_id (); + + char *topid = (char *) mymalloc (1 + 16 + 1); + + sprintf (topid, "TOP%08x", id); + + return topid; +} + +char *logfile_generate_subid () +{ + const int id = logfile_generate_id (); + + char *subid = (char *) mymalloc (1 + 16 + 1); + + sprintf (subid, "SUB%08x", id); + + return subid; +} + +/** + * system + */ + +#ifdef _WIN +void fsync (int fd) +{ + HANDLE h = (HANDLE) _get_osfhandle (fd); + + FlushFileBuffers (h); +} +#endif + +/** + * thermal + */ + +#ifdef _CUDA +#ifdef _WIN +int hm_get_adapter_index (HM_ADAPTER nvGPUHandle[DEVICES_MAX]) +{ + NvU32 pGpuCount; + + if (hc_NvAPI_EnumPhysicalGPUs (nvGPUHandle, &pGpuCount) != NVAPI_OK) return (0); + + if (pGpuCount == 0) + { + log_info ("WARN: No NvAPI adapters found"); + + return (0); + } + + return (pGpuCount); +} +#endif + +#ifdef LINUX +int hm_get_adapter_index (HM_ADAPTER nvGPUHandle[DEVICES_MAX]) +{ + int pGpuCount = 0; + + for (uint i = 0; i < DEVICES_MAX; i++) + { + /* do not use wrapper function to omit warning message */ + if (nvmlDeviceGetHandleByIndex (i, &nvGPUHandle[i]) != NVML_SUCCESS) break; + + //can be used to determine if the device by index matches the cuda device by index + //char name[100]; memset (name, 0, sizeof (name)); + //hc_NVML_nvmlDeviceGetName (nvGPUHandle[i], name, sizeof (name) - 1); + + pGpuCount++; + } + + if (pGpuCount == 0) + { + log_info ("WARN: No NVML adapters found"); + + return (0); + } + + return (pGpuCount); +} +#endif +#endif + +#ifdef _OCL +#ifndef OSX +void hm_close (HM_LIB hm_dll) +{ + #ifdef _POSIX + dlclose (hm_dll); + + #elif _WIN + FreeLibrary (hm_dll); + + #endif +} + +HM_LIB hm_init () +{ + #ifdef _POSIX + HM_LIB hm_dll = dlopen ("libatiadlxx.so", RTLD_LAZY | RTLD_GLOBAL); + + #elif _WIN + HM_LIB hm_dll = LoadLibrary ("atiadlxx.dll"); + + if (hm_dll == NULL) + hm_dll = LoadLibrary ("atiadlxy.dll"); + + #endif + + return hm_dll; +} + +int get_adapters_num (HM_LIB hm_dll, int *iNumberAdapters) +{ + if (hc_ADL_Adapter_NumberOfAdapters_Get (hm_dll, iNumberAdapters) != ADL_OK) return -1; + + if (iNumberAdapters == 0) + { + log_info ("WARN: No ADL adapters found."); + + return -1; + } + + return 0; +} + +int hm_show_performance_level (HM_LIB hm_dll, int iAdapterIndex) +{ + ADLODPerformanceLevels *lpOdPerformanceLevels = NULL; + ADLODParameters lpOdParameters; + + lpOdParameters.iSize = sizeof (ADLODParameters); + size_t plevels_size = 0; + + if (hc_ADL_Overdrive_ODParameters_Get (hm_dll, iAdapterIndex, &lpOdParameters) != ADL_OK) return -1; + + log_info ("[DEBUG] %s, adapter %d performance level (%d) : %s %s", + __func__, iAdapterIndex, + lpOdParameters.iNumberOfPerformanceLevels, + (lpOdParameters.iActivityReportingSupported) ? "activity reporting" : "", + (lpOdParameters.iDiscretePerformanceLevels) ? "discrete performance levels" : "performance ranges"); + + plevels_size = sizeof (ADLODPerformanceLevels) + sizeof (ADLODPerformanceLevel) * (lpOdParameters.iNumberOfPerformanceLevels - 1); + + lpOdPerformanceLevels = (ADLODPerformanceLevels *) mymalloc (plevels_size); + + lpOdPerformanceLevels->iSize = sizeof (ADLODPerformanceLevels) + sizeof (ADLODPerformanceLevel) * (lpOdParameters.iNumberOfPerformanceLevels - 1); + + if (hc_ADL_Overdrive_ODPerformanceLevels_Get (hm_dll, iAdapterIndex, 0, lpOdPerformanceLevels) != ADL_OK) return -1; + + for (int j = 0; j < lpOdParameters.iNumberOfPerformanceLevels; j++) + log_info ("[DEBUG] %s, adapter %d, level %d : engine %d, memory %d, voltage: %d", + __func__, iAdapterIndex, j, + lpOdPerformanceLevels->aLevels[j].iEngineClock / 100, lpOdPerformanceLevels->aLevels[j].iMemoryClock / 100, lpOdPerformanceLevels->aLevels[j].iVddc); + + myfree (lpOdPerformanceLevels); + + return 0; +} + +LPAdapterInfo hm_get_adapter_info (HM_LIB hm_dll, int iNumberAdapters) +{ + size_t AdapterInfoSize = iNumberAdapters * sizeof (AdapterInfo); + + LPAdapterInfo lpAdapterInfo = (LPAdapterInfo) mymalloc (AdapterInfoSize); + + if (hc_ADL_Adapter_AdapterInfo_Get (hm_dll, lpAdapterInfo, AdapterInfoSize) != ADL_OK) return NULL; + + return lpAdapterInfo; +} + +/* + * does not help at all, since AMD does not assign different bus id, device id when we have multi GPU setups + * + +int hm_get_opencl_device_index (hm_attrs_t *hm_device, uint num_adl_adapters, int bus_num, int dev_num) +{ + uint32_t idx = -1; + + for (uint i = 0; i < num_adl_adapters; i++) + { + int opencl_bus_num = hm_device[i].busid; + int opencl_dev_num = hm_device[i].devid; + + if ((opencl_bus_num == bus_num) && (opencl_dev_num == dev_num)) + { + idx = i; + + break; + } + } + + if (idx >= DEVICES_MAX) return -1; + + return idx; +} + +void hm_get_opencl_busid_devid (hm_attrs_t *hm_device, uint opencl_num_devices, cl_device_id *devices) +{ + for (uint i = 0; i < opencl_num_devices; i++) + { + cl_device_topology_amd device_topology; + + hc_clGetDeviceInfo (devices[i], CL_DEVICE_TOPOLOGY_AMD, sizeof (device_topology), &device_topology, NULL); + + hm_device[i].busid = device_topology.pcie.bus; + hm_device[i].devid = device_topology.pcie.device; + } +} +*/ + +void hm_sort_adl_adapters_by_busid_devid (uint32_t *valid_adl_device_list, int num_adl_adapters, LPAdapterInfo lpAdapterInfo) +{ + // basically bubble sort + + for (int i = 0; i < num_adl_adapters; i++) + { + for (int j = 0; j < num_adl_adapters - 1; j++) + { + // get info of adapter [x] + + uint32_t adapter_index_x = valid_adl_device_list[j]; + AdapterInfo info_x = lpAdapterInfo[adapter_index_x]; + + uint32_t bus_num_x = info_x.iBusNumber; + uint32_t dev_num_x = info_x.iDeviceNumber; + + // get info of adapter [y] + + uint32_t adapter_index_y = valid_adl_device_list[j + 1]; + AdapterInfo info_y = lpAdapterInfo[adapter_index_y]; + + uint32_t bus_num_y = info_y.iBusNumber; + uint32_t dev_num_y = info_y.iDeviceNumber; + + uint need_swap = 0; + + if (bus_num_y < bus_num_x) + { + need_swap = 1; + } + else if (bus_num_y == bus_num_x) + { + if (dev_num_y < dev_num_x) + { + need_swap = 1; + } + } + + if (need_swap == 1) + { + uint32_t temp = valid_adl_device_list[j + 1]; + + valid_adl_device_list[j + 1] = valid_adl_device_list[j]; + valid_adl_device_list[j + 0] = temp; + } + } + } +} + +uint32_t *hm_get_list_valid_adl_adapters (int iNumberAdapters, int *num_adl_adapters, LPAdapterInfo lpAdapterInfo) +{ + *num_adl_adapters = 0; + + uint32_t *adl_adapters = NULL; + + int *bus_numbers = NULL; + int *device_numbers = NULL; + + for (int i = 0; i < iNumberAdapters; i++) + { + AdapterInfo info = lpAdapterInfo[i]; + + if ((info.strUDID == NULL) || (strlen (info.strUDID) < 1)) continue; + + #ifdef WIN + if (info.iVendorID != 1002) continue; + #else + if (info.iVendorID != 0x1002) continue; + #endif + + if (info.iBusNumber < 0) continue; + if (info.iDeviceNumber < 0) continue; + + int found = 0; + + for (int pos = 0; pos < *num_adl_adapters; pos++) + { + if ((bus_numbers[pos] == info.iBusNumber) && (device_numbers[pos] == info.iDeviceNumber)) + { + found = 1; + break; + } + } + + if (found) continue; + + // add it to the list + + adl_adapters = (uint32_t *) myrealloc (adl_adapters, (*num_adl_adapters) * sizeof (int), sizeof (int)); + + adl_adapters[*num_adl_adapters] = i; + + // rest is just bookkeeping + + bus_numbers = (int*) myrealloc (bus_numbers, (*num_adl_adapters) * sizeof (int), sizeof (int)); + device_numbers = (int*) myrealloc (device_numbers, (*num_adl_adapters) * sizeof (int), sizeof (int)); + + bus_numbers[*num_adl_adapters] = info.iBusNumber; + device_numbers[*num_adl_adapters] = info.iDeviceNumber; + + (*num_adl_adapters)++; + } + + myfree (bus_numbers); + myfree (device_numbers); + + // sort the list by increasing bus id, device id number + + hm_sort_adl_adapters_by_busid_devid (adl_adapters, *num_adl_adapters, lpAdapterInfo); + + return adl_adapters; +} + +int hm_check_fanspeed_control (HM_LIB hm_dll, hm_attrs_t *hm_device, uint32_t *valid_adl_device_list, int num_adl_adapters, LPAdapterInfo lpAdapterInfo) +{ + // loop through all valid devices + + for (int i = 0; i < num_adl_adapters; i++) + { + uint32_t adapter_index = valid_adl_device_list[i]; + + // get AdapterInfo + + AdapterInfo info = lpAdapterInfo[adapter_index]; + + // unfortunately this doesn't work since bus id and dev id are not unique + // int opencl_device_index = hm_get_opencl_device_index (hm_device, num_adl_adapters, info.iBusNumber, info.iDeviceNumber); + // if (opencl_device_index == -1) continue; + + int opencl_device_index = i; + + // if (hm_show_performance_level (hm_dll, info.iAdapterIndex) != 0) return -1; + + // get fanspeed info + + if (hm_device[opencl_device_index].od_version == 5) + { + ADLFanSpeedInfo FanSpeedInfo; + + memset (&FanSpeedInfo, 0, sizeof (ADLFanSpeedInfo)); + + FanSpeedInfo.iSize = sizeof (ADLFanSpeedInfo); + + if (hc_ADL_Overdrive5_FanSpeedInfo_Get (hm_dll, info.iAdapterIndex, 0, &FanSpeedInfo) != ADL_OK) return -1; + + // check read and write capability in fanspeedinfo + + if ((FanSpeedInfo.iFlags & ADL_DL_FANCTRL_SUPPORTS_PERCENT_READ) && + (FanSpeedInfo.iFlags & ADL_DL_FANCTRL_SUPPORTS_PERCENT_WRITE)) + { + hm_device[opencl_device_index].fan_supported = 1; + } + else + { + hm_device[opencl_device_index].fan_supported = 0; + } + } + else // od_version == 6 + { + ADLOD6FanSpeedInfo faninfo; + + memset (&faninfo, 0, sizeof (faninfo)); + + if (hc_ADL_Overdrive6_FanSpeed_Get (hm_dll, info.iAdapterIndex, &faninfo) != ADL_OK) return -1; + + // check read capability in fanspeedinfo + + if (faninfo.iSpeedType & ADL_OD6_FANSPEED_TYPE_PERCENT) + { + hm_device[opencl_device_index].fan_supported = 1; + } + else + { + hm_device[opencl_device_index].fan_supported = 0; + } + } + } + + return 0; +} + +int hm_get_overdrive_version (HM_LIB hm_dll, hm_attrs_t *hm_device, uint32_t *valid_adl_device_list, int num_adl_adapters, LPAdapterInfo lpAdapterInfo) +{ + for (int i = 0; i < num_adl_adapters; i++) + { + uint32_t adapter_index = valid_adl_device_list[i]; + + // get AdapterInfo + + AdapterInfo info = lpAdapterInfo[adapter_index]; + + // get overdrive version + + int od_supported = 0; + int od_enabled = 0; + int od_version = 0; + + if (hc_ADL_Overdrive_Caps (hm_dll, info.iAdapterIndex, &od_supported, &od_enabled, &od_version) != ADL_OK) return -1; + + // store the overdrive version in hm_device + + // unfortunately this doesn't work since bus id and dev id are not unique + // int opencl_device_index = hm_get_opencl_device_index (hm_device, num_adl_adapters, info.iBusNumber, info.iDeviceNumber); + // if (opencl_device_index == -1) continue; + + int opencl_device_index = i; + + hm_device[opencl_device_index].od_version = od_version; + } + + return 0; +} + +int hm_get_adapter_index (hm_attrs_t *hm_device, uint32_t *valid_adl_device_list, int num_adl_adapters, LPAdapterInfo lpAdapterInfo) +{ + for (int i = 0; i < num_adl_adapters; i++) + { + uint32_t adapter_index = valid_adl_device_list[i]; + + // get AdapterInfo + + AdapterInfo info = lpAdapterInfo[adapter_index]; + + // store the iAdapterIndex in hm_device + + // unfortunately this doesn't work since bus id and dev id are not unique + // int opencl_device_index = hm_get_opencl_device_index (hm_device, num_adl_adapters, info.iBusNumber, info.iDeviceNumber); + // if (opencl_device_index == -1) continue; + + int opencl_device_index = i; + + hm_device[opencl_device_index].adapter_index = info.iAdapterIndex; + } + + return num_adl_adapters; +} +#endif +#endif + +int hm_get_temperature_with_device_id (const uint device_id) +{ + #ifdef _OCL + #ifndef OSX + if (data.hm_dll) + { + if (data.hm_device[device_id].od_version == 5) + { + ADLTemperature Temperature; + + Temperature.iSize = sizeof (ADLTemperature); + + if (hc_ADL_Overdrive5_Temperature_Get (data.hm_dll, data.hm_device[device_id].adapter_index, 0, &Temperature) != ADL_OK) return -1; + + return Temperature.iTemperature / 1000; + } + else if (data.hm_device[device_id].od_version == 6) + { + int Temperature = 0; + + if (hc_ADL_Overdrive6_Temperature_Get (data.hm_dll, data.hm_device[device_id].adapter_index, &Temperature) != ADL_OK) return -1; + + return Temperature / 1000; + } + } + #endif + #endif + + #ifdef _CUDA + #ifdef LINUX + int temperature = 0; + + hc_NVML_nvmlDeviceGetTemperature (data.hm_device[device_id].adapter_index, NVML_TEMPERATURE_GPU, (unsigned int *) &temperature); + + return temperature; + #endif + + #ifdef WIN + NV_GPU_THERMAL_SETTINGS pThermalSettings; + + pThermalSettings.version = NV_GPU_THERMAL_SETTINGS_VER; + pThermalSettings.count = NVAPI_MAX_THERMAL_SENSORS_PER_GPU; + pThermalSettings.sensor[0].controller = NVAPI_THERMAL_CONTROLLER_UNKNOWN; + pThermalSettings.sensor[0].target = NVAPI_THERMAL_TARGET_GPU; + + if (hc_NvAPI_GPU_GetThermalSettings (data.hm_device[device_id].adapter_index, 0, &pThermalSettings) != NVAPI_OK) return -1; + + return pThermalSettings.sensor[0].currentTemp; + #endif + #endif + + return -1; +} + +int hm_get_fanspeed_with_device_id (const uint device_id) +{ + if (data.hm_device[device_id].fan_supported == 1) + { + #ifdef _OCL + #ifndef OSX + if (data.hm_dll) + { + if (data.hm_device[device_id].od_version == 5) + { + ADLFanSpeedValue lpFanSpeedValue; + + memset (&lpFanSpeedValue, 0, sizeof (lpFanSpeedValue)); + + lpFanSpeedValue.iSize = sizeof (lpFanSpeedValue); + lpFanSpeedValue.iSpeedType = ADL_DL_FANCTRL_SPEED_TYPE_PERCENT; + lpFanSpeedValue.iFlags = ADL_DL_FANCTRL_FLAG_USER_DEFINED_SPEED; + + if (hc_ADL_Overdrive5_FanSpeed_Get (data.hm_dll, data.hm_device[device_id].adapter_index, 0, &lpFanSpeedValue) != ADL_OK) return -1; + + return lpFanSpeedValue.iFanSpeed; + } + else // od_version == 6 + { + ADLOD6FanSpeedInfo faninfo; + + memset (&faninfo, 0, sizeof (faninfo)); + + if (hc_ADL_Overdrive6_FanSpeed_Get (data.hm_dll, data.hm_device[device_id].adapter_index, &faninfo) != ADL_OK) return -1; + + return faninfo.iFanSpeedPercent; + } + } + #endif + #endif + + #ifdef _CUDA + #ifdef LINUX + int speed = 0; + + hc_NVML_nvmlDeviceGetFanSpeed (data.hm_device[device_id].adapter_index, (unsigned int *) &speed); + + return speed; + #endif + + #ifdef WIN + NvU32 speed = 0; + + hc_NvAPI_GPU_GetTachReading (data.hm_device[device_id].adapter_index, &speed); + + return speed; + #endif + #endif + } + + return -1; +} + +int hm_get_utilization_with_device_id (const uint device_id) +{ + #ifdef _OCL + #ifndef OSX + if (data.hm_dll) + { + ADLPMActivity PMActivity; + + PMActivity.iSize = sizeof (ADLPMActivity); + + if (hc_ADL_Overdrive_CurrentActivity_Get (data.hm_dll, data.hm_device[device_id].adapter_index, &PMActivity) != ADL_OK) return -1; + + return PMActivity.iActivityPercent; + } + #endif + #endif + + #ifdef _CUDA + #ifdef LINUX + nvmlUtilization_t utilization; + + hc_NVML_nvmlDeviceGetUtilizationRates (data.hm_device[device_id].adapter_index, &utilization); + + return utilization.gpu; + #endif + + #ifdef WIN + NV_GPU_DYNAMIC_PSTATES_INFO_EX pDynamicPstatesInfoEx; + + pDynamicPstatesInfoEx.version = NV_GPU_DYNAMIC_PSTATES_INFO_EX_VER; + + if (hc_NvAPI_GPU_GetDynamicPstatesInfoEx (data.hm_device[device_id].adapter_index, &pDynamicPstatesInfoEx) != NVAPI_OK) return -1; + + return pDynamicPstatesInfoEx.utilization[0].percentage; + #endif + #endif + + return -1; +} + +#ifdef _OCL +#ifndef OSX +int hm_set_fanspeed_with_device_id (const uint device_id, const int fanspeed) +{ + if (data.hm_device[device_id].fan_supported == 1) + { + if (data.hm_dll) + { + if (data.hm_device[device_id].od_version == 5) + { + ADLFanSpeedValue lpFanSpeedValue; + + memset (&lpFanSpeedValue, 0, sizeof (lpFanSpeedValue)); + + lpFanSpeedValue.iSize = sizeof (lpFanSpeedValue); + lpFanSpeedValue.iSpeedType = ADL_DL_FANCTRL_SPEED_TYPE_PERCENT; + lpFanSpeedValue.iFlags = ADL_DL_FANCTRL_FLAG_USER_DEFINED_SPEED; + lpFanSpeedValue.iFanSpeed = fanspeed; + + if (hc_ADL_Overdrive5_FanSpeed_Set (data.hm_dll, data.hm_device[device_id].adapter_index, 0, &lpFanSpeedValue) != ADL_OK) return -1; + + return 0; + } + else // od_version == 6 + { + ADLOD6FanSpeedValue fan_speed_value; + + memset (&fan_speed_value, 0, sizeof (fan_speed_value)); + + fan_speed_value.iSpeedType = ADL_OD6_FANSPEED_TYPE_PERCENT; + fan_speed_value.iFanSpeed = fanspeed; + + if (hc_ADL_Overdrive6_FanSpeed_Set (data.hm_dll, data.hm_device[device_id].adapter_index, &fan_speed_value) != ADL_OK) return -1; + + return 0; + } + } + } + + return -1; +} +#endif +#endif + +/** + * maskprocessor + */ + +void mp_css_to_uniq_tbl (uint css_cnt, cs_t *css, uint uniq_tbls[SP_PW_MAX][CHARSIZ]) +{ + /* generates a lookup table where key is the char itself for fastest possible lookup performance */ + + if (css_cnt > SP_PW_MAX) + { + log_error ("ERROR: mask length is too long"); + + exit (-1); + } + + for (uint css_pos = 0; css_pos < css_cnt; css_pos++) + { + uint *uniq_tbl = uniq_tbls[css_pos]; + + uint *cs_buf = css[css_pos].cs_buf; + uint cs_len = css[css_pos].cs_len; + + for (uint cs_pos = 0; cs_pos < cs_len; cs_pos++) + { + uint c = cs_buf[cs_pos] & 0xff; + + uniq_tbl[c] = 1; + } + } +} + +void mp_add_cs_buf (uint *in_buf, size_t in_len, cs_t *css, int css_cnt) +{ + cs_t *cs = &css[css_cnt]; + + size_t css_uniq_sz = CHARSIZ * sizeof (uint); + + uint *css_uniq = (uint *) mymalloc (css_uniq_sz); + + memset (css_uniq, 0, css_uniq_sz); + + size_t i; + + for (i = 0; i < cs->cs_len; i++) + { + const uint u = cs->cs_buf[i]; + + css_uniq[u] = 1; + } + + for (i = 0; i < in_len; i++) + { + uint u = in_buf[i] & 0xff; + + if (data.opts_type & OPTS_TYPE_PT_UPPER) u = toupper (u); + + if (css_uniq[u] == 1) continue; + + css_uniq[u] = 1; + + cs->cs_buf[cs->cs_len] = u; + + cs->cs_len++; + } + + myfree (css_uniq); +} + +void mp_expand (char *in_buf, size_t in_len, cs_t *mp_sys, cs_t *mp_usr, int mp_usr_offset, int interpret) +{ + size_t in_pos; + + for (in_pos = 0; in_pos < in_len; in_pos++) + { + uint p0 = in_buf[in_pos] & 0xff; + + if (interpret == 1 && p0 == '?') + { + in_pos++; + + if (in_pos == in_len) break; + + uint p1 = in_buf[in_pos] & 0xff; + + switch (p1) + { + case 'l': mp_add_cs_buf (mp_sys[0].cs_buf, mp_sys[0].cs_len, mp_usr, mp_usr_offset); + break; + case 'u': mp_add_cs_buf (mp_sys[1].cs_buf, mp_sys[1].cs_len, mp_usr, mp_usr_offset); + break; + case 'd': mp_add_cs_buf (mp_sys[2].cs_buf, mp_sys[2].cs_len, mp_usr, mp_usr_offset); + break; + case 's': mp_add_cs_buf (mp_sys[3].cs_buf, mp_sys[3].cs_len, mp_usr, mp_usr_offset); + break; + case 'a': mp_add_cs_buf (mp_sys[4].cs_buf, mp_sys[4].cs_len, mp_usr, mp_usr_offset); + break; + case 'b': mp_add_cs_buf (mp_sys[5].cs_buf, mp_sys[5].cs_len, mp_usr, mp_usr_offset); + break; + case '1': if (mp_usr[0].cs_len == 0) { log_error ("ERROR: Custom-charset 1 is undefined\n"); exit (-1); } + mp_add_cs_buf (mp_usr[0].cs_buf, mp_usr[0].cs_len, mp_usr, mp_usr_offset); + break; + case '2': if (mp_usr[1].cs_len == 0) { log_error ("ERROR: Custom-charset 2 is undefined\n"); exit (-1); } + mp_add_cs_buf (mp_usr[1].cs_buf, mp_usr[1].cs_len, mp_usr, mp_usr_offset); + break; + case '3': if (mp_usr[2].cs_len == 0) { log_error ("ERROR: Custom-charset 3 is undefined\n"); exit (-1); } + mp_add_cs_buf (mp_usr[2].cs_buf, mp_usr[2].cs_len, mp_usr, mp_usr_offset); + break; + case '4': if (mp_usr[3].cs_len == 0) { log_error ("ERROR: Custom-charset 4 is undefined\n"); exit (-1); } + mp_add_cs_buf (mp_usr[3].cs_buf, mp_usr[3].cs_len, mp_usr, mp_usr_offset); + break; + case '?': mp_add_cs_buf (&p0, 1, mp_usr, mp_usr_offset); + break; + default: log_error ("Syntax error: %s", in_buf); + exit (-1); + } + } + else + { + if (data.hex_charset) + { + in_pos++; + + if (in_pos == in_len) + { + log_error ("ERROR: the hex-charset option always expects couples of exactly 2 hexadecimal chars, failed mask: %s", in_buf); + + exit (-1); + } + + uint p1 = in_buf[in_pos] & 0xff; + + if ((is_valid_hex_char (p0) == 0) || (is_valid_hex_char (p1) == 0)) + { + log_error ("ERROR: invalid hex character detected in mask %s", in_buf); + + exit (-1); + } + + uint chr = 0; + + chr = hex_convert (p1) << 0; + chr |= hex_convert (p0) << 4; + + mp_add_cs_buf (&chr, 1, mp_usr, mp_usr_offset); + } + else + { + uint chr = p0; + + mp_add_cs_buf (&chr, 1, mp_usr, mp_usr_offset); + } + } + } +} + +uint64_t mp_get_sum (uint css_cnt, cs_t *css) +{ + uint64_t sum = 1; + + for (uint css_pos = 0; css_pos < css_cnt; css_pos++) + { + sum *= css[css_pos].cs_len; + } + + return (sum); +} + +cs_t *mp_gen_css (char *mask_buf, size_t mask_len, cs_t *mp_sys, cs_t *mp_usr, uint *css_cnt) +{ + cs_t *css = (cs_t *) mycalloc (256, sizeof (cs_t)); + + uint mask_pos; + uint css_pos; + + for (mask_pos = 0, css_pos = 0; mask_pos < mask_len; mask_pos++, css_pos++) + { + char p0 = mask_buf[mask_pos]; + + if (p0 == '?') + { + mask_pos++; + + if (mask_pos == mask_len) break; + + char p1 = mask_buf[mask_pos]; + + uint chr = p1; + + switch (p1) + { + case 'l': mp_add_cs_buf (mp_sys[0].cs_buf, mp_sys[0].cs_len, css, css_pos); + break; + case 'u': mp_add_cs_buf (mp_sys[1].cs_buf, mp_sys[1].cs_len, css, css_pos); + break; + case 'd': mp_add_cs_buf (mp_sys[2].cs_buf, mp_sys[2].cs_len, css, css_pos); + break; + case 's': mp_add_cs_buf (mp_sys[3].cs_buf, mp_sys[3].cs_len, css, css_pos); + break; + case 'a': mp_add_cs_buf (mp_sys[4].cs_buf, mp_sys[4].cs_len, css, css_pos); + break; + case 'b': mp_add_cs_buf (mp_sys[5].cs_buf, mp_sys[5].cs_len, css, css_pos); + break; + case '1': if (mp_usr[0].cs_len == 0) { log_error ("ERROR: Custom-charset 1 is undefined\n"); exit (-1); } + mp_add_cs_buf (mp_usr[0].cs_buf, mp_usr[0].cs_len, css, css_pos); + break; + case '2': if (mp_usr[1].cs_len == 0) { log_error ("ERROR: Custom-charset 2 is undefined\n"); exit (-1); } + mp_add_cs_buf (mp_usr[1].cs_buf, mp_usr[1].cs_len, css, css_pos); + break; + case '3': if (mp_usr[2].cs_len == 0) { log_error ("ERROR: Custom-charset 3 is undefined\n"); exit (-1); } + mp_add_cs_buf (mp_usr[2].cs_buf, mp_usr[2].cs_len, css, css_pos); + break; + case '4': if (mp_usr[3].cs_len == 0) { log_error ("ERROR: Custom-charset 4 is undefined\n"); exit (-1); } + mp_add_cs_buf (mp_usr[3].cs_buf, mp_usr[3].cs_len, css, css_pos); + break; + case '?': mp_add_cs_buf (&chr, 1, css, css_pos); + break; + default: log_error ("ERROR: syntax error: %s", mask_buf); + exit (-1); + } + } + else + { + if (data.hex_charset) + { + mask_pos++; + + // if there is no 2nd hex character, show an error: + + if (mask_pos == mask_len) + { + log_error ("ERROR: the hex-charset option always expects couples of exactly 2 hexadecimal chars, failed mask: %s", mask_buf); + + exit (-1); + } + + char p1 = mask_buf[mask_pos]; + + // if they are not valid hex character, show an error: + + if ((is_valid_hex_char (p0) == 0) || (is_valid_hex_char (p1) == 0)) + { + log_error ("ERROR: invalid hex character detected in mask %s", mask_buf); + + exit (-1); + } + + uint chr = 0; + + chr |= hex_convert (p1) << 0; + chr |= hex_convert (p0) << 4; + + mp_add_cs_buf (&chr, 1, css, css_pos); + } + else + { + uint chr = p0; + + mp_add_cs_buf (&chr, 1, css, css_pos); + } + } + } + + if (css_pos == 0) + { + log_error ("ERROR: invalid mask length (0)"); + + exit (-1); + } + + *css_cnt = css_pos; + + return (css); +} + +void mp_exec (uint64_t val, char *buf, cs_t *css, int css_cnt) +{ + for (int i = 0; i < css_cnt; i++) + { + uint len = css[i].cs_len; + uint64_t next = val / len; + uint pos = val % len; + buf[i] = (char) css[i].cs_buf[pos] & 0xff; + val = next; + } +} + +void mp_cut_at (char *mask, uint max) +{ + uint i; + uint j; + uint mask_len = strlen (mask); + + for (i = 0, j = 0; i < mask_len && j < max; i++, j++) + { + if (mask[i] == '?') i++; + } + + mask[i] = 0; +} + +void mp_setup_sys (cs_t *mp_sys) +{ + uint pos; + uint chr; + uint donec[CHARSIZ]; + + memset (donec, 0, sizeof (donec)); + + for (pos = 0, chr = 'a'; chr <= 'z'; chr++) { donec[chr] = 1; + mp_sys[0].cs_buf[pos++] = chr; + mp_sys[0].cs_len = pos; } + + for (pos = 0, chr = 'A'; chr <= 'Z'; chr++) { donec[chr] = 1; + mp_sys[1].cs_buf[pos++] = chr; + mp_sys[1].cs_len = pos; } + + for (pos = 0, chr = '0'; chr <= '9'; chr++) { donec[chr] = 1; + mp_sys[2].cs_buf[pos++] = chr; + mp_sys[2].cs_len = pos; } + + for (pos = 0, chr = 0x20; chr <= 0x7e; chr++) { if (donec[chr]) continue; + mp_sys[3].cs_buf[pos++] = chr; + mp_sys[3].cs_len = pos; } + + for (pos = 0, chr = 0x20; chr <= 0x7e; chr++) { mp_sys[4].cs_buf[pos++] = chr; + mp_sys[4].cs_len = pos; } + + for (pos = 0, chr = 0x00; chr <= 0xff; chr++) { mp_sys[5].cs_buf[pos++] = chr; + mp_sys[5].cs_len = pos; } +} + +void mp_setup_usr (cs_t *mp_sys, cs_t *mp_usr, char *buf, uint index) +{ + FILE *fp = fopen (buf, "rb"); + + if (fp == NULL || feof (fp)) // feof() in case if file is empty + { + mp_expand (buf, strlen (buf), mp_sys, mp_usr, index, 1); + } + else + { + char mp_file[1024]; + + memset (mp_file, 0, sizeof (mp_file)); + + size_t len = fread (mp_file, 1, sizeof (mp_file) - 1, fp); + + fclose (fp); + + len = in_superchop (mp_file); + + if (len == 0) + { + log_info ("WARNING: charset file corrupted"); + + mp_expand (buf, strlen (buf), mp_sys, mp_usr, index, 1); + } + else + { + mp_expand (mp_file, len, mp_sys, mp_usr, index, 0); + } + } +} + +void mp_reset_usr (cs_t *mp_usr, uint index) +{ + mp_usr[index].cs_len = 0; + + memset (mp_usr[index].cs_buf, 0, sizeof (mp_usr[index].cs_buf)); +} + +char *mp_get_truncated_mask (char *mask_buf, size_t mask_len, uint len) +{ + char *new_mask_buf = (char *) mymalloc (256); + + uint mask_pos; + + uint css_pos; + + for (mask_pos = 0, css_pos = 0; mask_pos < mask_len; mask_pos++, css_pos++) + { + if (css_pos == len) break; + + char p0 = mask_buf[mask_pos]; + + new_mask_buf[mask_pos] = p0; + + if (p0 == '?') + { + mask_pos++; + + if (mask_pos == mask_len) break; + + new_mask_buf[mask_pos] = mask_buf[mask_pos]; + } + else + { + if (data.hex_charset) + { + mask_pos++; + + if (mask_pos == mask_len) + { + log_error ("ERROR: the hex-charset option always expects couples of exactly 2 hexadecimal chars, failed mask: %s", mask_buf); + + exit (-1); + } + + char p1 = mask_buf[mask_pos]; + + // if they are not valid hex character, show an error: + + if ((is_valid_hex_char (p0) == 0) || (is_valid_hex_char (p1) == 0)) + { + log_error ("ERROR: invalid hex character detected in mask: %s", mask_buf); + + exit (-1); + } + + new_mask_buf[mask_pos] = p1; + } + } + } + + if (css_pos == len) return (new_mask_buf); + + myfree (new_mask_buf); + + return (NULL); +} + +/** + * statprocessor + */ + +uint64_t sp_get_sum (uint start, uint stop, cs_t *root_css_buf) +{ + uint64_t sum = 1; + + uint i; + + for (i = start; i < stop; i++) + { + sum *= root_css_buf[i].cs_len; + } + + return (sum); +} + +void sp_exec (uint64_t ctx, char *pw_buf, cs_t *root_css_buf, cs_t *markov_css_buf, uint start, uint stop) +{ + uint64_t v = ctx; + + cs_t *cs = &root_css_buf[start]; + + uint i; + + for (i = start; i < stop; i++) + { + const uint64_t m = v % cs->cs_len; + const uint64_t d = v / cs->cs_len; + + v = d; + + const uint k = cs->cs_buf[m]; + + pw_buf[i - start] = (char) k; + + cs = &markov_css_buf[(i * CHARSIZ) + k]; + } +} + +int sp_comp_val (const void *p1, const void *p2) +{ + hcstat_table_t *b1 = (hcstat_table_t *) p1; + hcstat_table_t *b2 = (hcstat_table_t *) p2; + + return b2->val - b1->val; +} + +void sp_setup_tbl (const char *install_dir, char *hcstat, uint disable, uint classic, hcstat_table_t *root_table_buf, hcstat_table_t *markov_table_buf) +{ + uint i; + uint j; + uint k; + + /** + * Initialize hcstats + */ + + uint64_t *root_stats_buf = (uint64_t *) mycalloc (SP_ROOT_CNT, sizeof (uint64_t)); + + uint64_t *root_stats_ptr = root_stats_buf; + + uint64_t *root_stats_buf_by_pos[SP_PW_MAX]; + + for (i = 0; i < SP_PW_MAX; i++) + { + root_stats_buf_by_pos[i] = root_stats_ptr; + + root_stats_ptr += CHARSIZ; + } + + uint64_t *markov_stats_buf = (uint64_t *) mycalloc (SP_MARKOV_CNT, sizeof (uint64_t)); + + uint64_t *markov_stats_ptr = markov_stats_buf; + + uint64_t *markov_stats_buf_by_key[SP_PW_MAX][CHARSIZ]; + + for (i = 0; i < SP_PW_MAX; i++) + { + for (j = 0; j < CHARSIZ; j++) + { + markov_stats_buf_by_key[i][j] = markov_stats_ptr; + + markov_stats_ptr += CHARSIZ; + } + } + + /** + * Load hcstats File + */ + + if (hcstat == NULL) + { + char hcstat_tmp[256]; + + memset (hcstat_tmp, 0, sizeof (hcstat_tmp)); + + snprintf (hcstat_tmp, sizeof (hcstat_tmp) - 1, "%s/%s", install_dir, SP_HCSTAT); + + hcstat = hcstat_tmp; + } + + FILE *fd = fopen (hcstat, "rb"); + + if (fd == NULL) + { + log_error ("%s: %s", hcstat, strerror (errno)); + + exit (-1); + } + + if (fread (root_stats_buf, sizeof (uint64_t), SP_ROOT_CNT, fd) != SP_ROOT_CNT) + { + log_error ("%s: Could not load data", hcstat); + + exit (-1); + } + + if (fread (markov_stats_buf, sizeof (uint64_t), SP_MARKOV_CNT, fd) != SP_MARKOV_CNT) + { + log_error ("%s: Could not load data", hcstat); + + exit (-1); + } + + fclose (fd); + + /** + * Markov modifier of hcstat_table on user request + */ + + if (disable) + { + memset (root_stats_buf, 0, SP_ROOT_CNT * sizeof (uint64_t)); + memset (markov_stats_buf, 0, SP_MARKOV_CNT * sizeof (uint64_t)); + } + + if (classic) + { + /* Add all stats to first position */ + + for (i = 1; i < SP_PW_MAX; i++) + { + uint64_t *out = root_stats_buf_by_pos[0]; + uint64_t *in = root_stats_buf_by_pos[i]; + + for (j = 0; j < CHARSIZ; j++) + { + *out++ += *in++; + } + } + + for (i = 1; i < SP_PW_MAX; i++) + { + uint64_t *out = markov_stats_buf_by_key[0][0]; + uint64_t *in = markov_stats_buf_by_key[i][0]; + + for (j = 0; j < CHARSIZ; j++) + { + for (k = 0; k < CHARSIZ; k++) + { + *out++ += *in++; + } + } + } + + /* copy them to all pw_positions */ + + for (i = 1; i < SP_PW_MAX; i++) + { + memcpy (root_stats_buf_by_pos[i], root_stats_buf_by_pos[0], CHARSIZ * sizeof (uint64_t)); + } + + for (i = 1; i < SP_PW_MAX; i++) + { + memcpy (markov_stats_buf_by_key[i][0], markov_stats_buf_by_key[0][0], CHARSIZ * CHARSIZ * sizeof (uint64_t)); + } + } + + /** + * Initialize tables + */ + + hcstat_table_t *root_table_ptr = root_table_buf; + + hcstat_table_t *root_table_buf_by_pos[SP_PW_MAX]; + + for (i = 0; i < SP_PW_MAX; i++) + { + root_table_buf_by_pos[i] = root_table_ptr; + + root_table_ptr += CHARSIZ; + } + + hcstat_table_t *markov_table_ptr = markov_table_buf; + + hcstat_table_t *markov_table_buf_by_key[SP_PW_MAX][CHARSIZ]; + + for (i = 0; i < SP_PW_MAX; i++) + { + for (j = 0; j < CHARSIZ; j++) + { + markov_table_buf_by_key[i][j] = markov_table_ptr; + + markov_table_ptr += CHARSIZ; + } + } + + /** + * Convert hcstat to tables + */ + + for (i = 0; i < SP_ROOT_CNT; i++) + { + uint key = i % CHARSIZ; + + root_table_buf[i].key = key; + root_table_buf[i].val = root_stats_buf[i]; + } + + for (i = 0; i < SP_MARKOV_CNT; i++) + { + uint key = i % CHARSIZ; + + markov_table_buf[i].key = key; + markov_table_buf[i].val = markov_stats_buf[i]; + } + + myfree (root_stats_buf); + myfree (markov_stats_buf); + + /** + * Finally sort them + */ + + for (i = 0; i < SP_PW_MAX; i++) + { + qsort (root_table_buf_by_pos[i], CHARSIZ, sizeof (hcstat_table_t), sp_comp_val); + } + + for (i = 0; i < SP_PW_MAX; i++) + { + for (j = 0; j < CHARSIZ; j++) + { + qsort (markov_table_buf_by_key[i][j], CHARSIZ, sizeof (hcstat_table_t), sp_comp_val); + } + } +} + +void sp_tbl_to_css (hcstat_table_t *root_table_buf, hcstat_table_t *markov_table_buf, cs_t *root_css_buf, cs_t *markov_css_buf, uint threshold, uint uniq_tbls[SP_PW_MAX][CHARSIZ]) +{ + /** + * Convert tables to css + */ + + for (uint i = 0; i < SP_ROOT_CNT; i++) + { + uint pw_pos = i / CHARSIZ; + + cs_t *cs = &root_css_buf[pw_pos]; + + if (cs->cs_len == threshold) continue; + + uint key = root_table_buf[i].key; + + if (uniq_tbls[pw_pos][key] == 0) continue; + + cs->cs_buf[cs->cs_len] = key; + + cs->cs_len++; + } + + /** + * Convert table to css + */ + + for (uint i = 0; i < SP_MARKOV_CNT; i++) + { + uint c = i / CHARSIZ; + + cs_t *cs = &markov_css_buf[c]; + + if (cs->cs_len == threshold) continue; + + uint pw_pos = c / CHARSIZ; + + uint key = markov_table_buf[i].key; + + if ((pw_pos + 1) < SP_PW_MAX) if (uniq_tbls[pw_pos + 1][key] == 0) continue; + + cs->cs_buf[cs->cs_len] = key; + + cs->cs_len++; + } + + /* + for (uint i = 0; i < 8; i++) + { + for (uint j = 0x20; j < 0x80; j++) + { + cs_t *ptr = &markov_css_buf[(i * CHARSIZ) + j]; + + printf ("pos:%u key:%u len:%u\n", i, j, ptr->cs_len); + + for (uint k = 0; k < 10; k++) + { + printf (" %u\n", ptr->cs_buf[k]); + } + } + } + */ +} + +void sp_stretch_root (hcstat_table_t *in, hcstat_table_t *out) +{ + for (uint i = 0; i < SP_PW_MAX; i += 2) + { + memcpy (out, in, CHARSIZ * sizeof (hcstat_table_t)); + + out += CHARSIZ; + in += CHARSIZ; + + out->key = 0; + out->val = 1; + + out++; + + for (uint j = 1; j < CHARSIZ; j++) + { + out->key = j; + out->val = 0; + + out++; + } + } +} + +void sp_stretch_markov (hcstat_table_t *in, hcstat_table_t *out) +{ + for (uint i = 0; i < SP_PW_MAX; i += 2) + { + memcpy (out, in, CHARSIZ * CHARSIZ * sizeof (hcstat_table_t)); + + out += CHARSIZ * CHARSIZ; + in += CHARSIZ * CHARSIZ; + + for (uint j = 0; j < CHARSIZ; j++) + { + out->key = 0; + out->val = 1; + + out++; + + for (uint k = 1; k < CHARSIZ; k++) + { + out->key = k; + out->val = 0; + + out++; + } + } + } +} + +/** + * mixed shared functions + */ + +void dump_hex (const char *s, size_t size) +{ + size_t i; + + for (i = 0; i < size; i++) + { + log_info_nn ("%02x ", (unsigned char) s[i]); + } + + log_info (""); +} + +void usage_mini_print (const char *progname) +{ + for (uint i = 0; USAGE_MINI[i] != NULL; i++) log_info (USAGE_MINI[i], progname); +} + +void usage_big_print (const char *progname) +{ + for (uint i = 0; USAGE_BIG[i] != NULL; i++) log_info (USAGE_BIG[i], progname); +} + +char *get_install_dir (const char *progname) +{ + char *install_dir = mystrdup (progname); + char *last_slash = NULL; + + if ((last_slash = strrchr (install_dir, '/')) != NULL) + { + *last_slash = 0; + } + else if ((last_slash = strrchr (install_dir, '\\')) != NULL) + { + *last_slash = 0; + } + else + { + install_dir[0] = '.'; + install_dir[1] = 0; + } + + return (install_dir); +} + +void truecrypt_crc32 (char *file, unsigned char keytab[64]) +{ + uint crc = ~0; + + FILE *fd = fopen (file, "rb"); + + if (fd == NULL) + { + log_error ("%s: %s", file, strerror (errno)); + + exit (-1); + } + + #define MAX_KEY_SIZE (1024 * 1024) + + char *buf = (char *) mymalloc (MAX_KEY_SIZE); + + int nread = fread (buf, 1, MAX_KEY_SIZE, fd); + + int kpos = 0; + + for (int fpos = 0; fpos < nread; fpos++) + { + crc = crc32tab[(crc ^ buf[fpos]) & 0xff] ^ (crc >> 8); + + keytab[kpos++] += (crc >> 24) & 0xff; + keytab[kpos++] += (crc >> 16) & 0xff; + keytab[kpos++] += (crc >> 8) & 0xff; + keytab[kpos++] += (crc >> 0) & 0xff; + + if (kpos >= 64) kpos = 0; + } + + myfree (buf); + + fclose(fd); +} + +void set_cpu_affinity (char *cpu_affinity) +{ + #ifdef WIN + DWORD_PTR aff_mask = 0; + #endif + + #ifdef LINUX + cpu_set_t cpuset; + + CPU_ZERO (&cpuset); + #endif + + if (cpu_affinity) + { + char *devices = strdup (cpu_affinity); + + char *next = strtok (devices, ","); + + do + { + uint cpu_id = atoi (next); + + if (cpu_id == 0) + { + #ifdef WIN + aff_mask = 0; + #endif + + #ifdef LINUX + CPU_ZERO (&cpuset); + #endif + + break; + } + + if (cpu_id > 32) + { + log_error ("ERROR: invalid cpu_id %u specified", cpu_id); + + exit (-1); + } + + #ifdef WIN + aff_mask |= 1 << (cpu_id - 1); + #endif + + #ifdef LINUX + CPU_SET ((cpu_id - 1), &cpuset); + #endif + + } while ((next = strtok (NULL, ",")) != NULL); + + free (devices); + } + + #ifdef WIN + SetProcessAffinityMask (GetCurrentProcess (), aff_mask); + SetThreadAffinityMask (GetCurrentThread (), aff_mask); + #endif + + #ifdef LINUX + pthread_t thread = pthread_self (); + pthread_setaffinity_np (thread, sizeof (cpu_set_t), &cpuset); + #endif +} + +void *rulefind (const void *key, void *base, int nmemb, size_t size, int (*compar) (const void *, const void *)) +{ + char *element, *end; + + end = (char *) base + nmemb * size; + + for (element = (char *) base; element < end; element += size) + if (!compar (element, key)) + return element; + + return NULL; +} + +int sort_by_salt (const void *v1, const void *v2) +{ + const salt_t *s1 = (const salt_t *) v1; + const salt_t *s2 = (const salt_t *) v2; + + const int res1 = s1->salt_len - s2->salt_len; + + if (res1 != 0) return (res1); + + const int res2 = s1->salt_iter - s2->salt_iter; + + if (res2 != 0) return (res2); + + uint n; + + n = 12; + + while (n--) + { + if (s1->salt_buf[n] > s2->salt_buf[n]) return ( 1); + if (s1->salt_buf[n] < s2->salt_buf[n]) return (-1); + } + + n = 8; + + while (n--) + { + if (s1->salt_buf_pc[n] > s2->salt_buf_pc[n]) return ( 1); + if (s1->salt_buf_pc[n] < s2->salt_buf_pc[n]) return (-1); + } + + return (0); +} + +int sort_by_salt_buf (const void *v1, const void *v2) +{ + const pot_t *p1 = (const pot_t *) v1; + const pot_t *p2 = (const pot_t *) v2; + + const hash_t *h1 = &p1->hash; + const hash_t *h2 = &p2->hash; + + const salt_t *s1 = h1->salt; + const salt_t *s2 = h2->salt; + + uint n = 12; + + while (n--) + { + if (s1->salt_buf[n] > s2->salt_buf[n]) return ( 1); + if (s1->salt_buf[n] < s2->salt_buf[n]) return (-1); + } + + return 0; +} + +int sort_by_hash_t_salt (const void *v1, const void *v2) +{ + const hash_t *h1 = (const hash_t *) v1; + const hash_t *h2 = (const hash_t *) v2; + + const salt_t *s1 = h1->salt; + const salt_t *s2 = h2->salt; + + // testphase: this should work + uint n = 12; + + while (n--) + { + if (s1->salt_buf[n] > s2->salt_buf[n]) return ( 1); + if (s1->salt_buf[n] < s2->salt_buf[n]) return (-1); + } + + /* original code, seems buggy since salt_len can be very big (had a case with 131 len) + also it thinks salt_buf[x] is a char but its a uint so salt_len should be / 4 + if (s1->salt_len > s2->salt_len) return ( 1); + if (s1->salt_len < s2->salt_len) return (-1); + + uint n = s1->salt_len; + + while (n--) + { + if (s1->salt_buf[n] > s2->salt_buf[n]) return ( 1); + if (s1->salt_buf[n] < s2->salt_buf[n]) return (-1); + } + */ + + return 0; +} + +int sort_by_hash_t_salt_hccap (const void *v1, const void *v2) +{ + const hash_t *h1 = (const hash_t *) v1; + const hash_t *h2 = (const hash_t *) v2; + + const salt_t *s1 = h1->salt; + const salt_t *s2 = h2->salt; + + // 12 - 2 (since last 2 uints contain the digest) + uint n = 10; + + while (n--) + { + if (s1->salt_buf[n] > s2->salt_buf[n]) return ( 1); + if (s1->salt_buf[n] < s2->salt_buf[n]) return (-1); + } + + return 0; +} + +int sort_by_hash_no_salt (const void *v1, const void *v2) +{ + const hash_t *h1 = (const hash_t *) v1; + const hash_t *h2 = (const hash_t *) v2; + + const void *d1 = h1->digest; + const void *d2 = h2->digest; + + return data.sort_by_digest (d1, d2); +} + +int sort_by_hash (const void *v1, const void *v2) +{ + const hash_t *h1 = (const hash_t *) v1; + const hash_t *h2 = (const hash_t *) v2; + + if (data.isSalted) + { + const salt_t *s1 = h1->salt; + const salt_t *s2 = h2->salt; + + int res = sort_by_salt (s1, s2); + + if (res != 0) return (res); + } + + const void *d1 = h1->digest; + const void *d2 = h2->digest; + + return data.sort_by_digest (d1, d2); +} + +int sort_by_pot (const void *v1, const void *v2) +{ + const pot_t *p1 = (const pot_t *) v1; + const pot_t *p2 = (const pot_t *) v2; + + const hash_t *h1 = &p1->hash; + const hash_t *h2 = &p2->hash; + + return sort_by_hash (h1, h2); +} + +int sort_by_mtime (const void *p1, const void *p2) +{ + const char **f1 = (const char **) p1; + const char **f2 = (const char **) p2; + + struct stat s1; stat (*f1, &s1); + struct stat s2; stat (*f2, &s2); + + return s2.st_mtime - s1.st_mtime; +} + +int sort_by_cpu_rule (const void *p1, const void *p2) +{ + const cpu_rule_t *r1 = (const cpu_rule_t *) p1; + const cpu_rule_t *r2 = (const cpu_rule_t *) p2; + + return memcmp (r1, r2, sizeof (cpu_rule_t)); +} + +int sort_by_gpu_rule (const void *p1, const void *p2) +{ + const gpu_rule_t *r1 = (const gpu_rule_t *) p1; + const gpu_rule_t *r2 = (const gpu_rule_t *) p2; + + return memcmp (r1, r2, sizeof (gpu_rule_t)); +} + +int sort_by_stringptr (const void *p1, const void *p2) +{ + const char **s1 = (const char **) p1; + const char **s2 = (const char **) p2; + + return strcmp (*s1, *s2); +} + +int sort_by_dictstat (const void *s1, const void *s2) +{ + dictstat_t *d1 = (dictstat_t *) s1; + dictstat_t *d2 = (dictstat_t *) s2; + + #ifdef _POSIX + d2->stat.st_atim = d1->stat.st_atim; + #else + d2->stat.st_atime = d1->stat.st_atime; + #endif + + return memcmp (&d1->stat, &d2->stat, sizeof (struct stat)); +} + +int sort_by_bitmap (const void *p1, const void *p2) +{ + const bitmap_result_t *b1 = (const bitmap_result_t *) p1; + const bitmap_result_t *b2 = (const bitmap_result_t *) p2; + + return b1->collisions - b2->collisions; +} + +int sort_by_digest_4_2 (const void *v1, const void *v2) +{ + const uint32_t *d1 = (const uint32_t *) v1; + const uint32_t *d2 = (const uint32_t *) v2; + + uint n = 2; + + while (n--) + { + if (d1[n] > d2[n]) return ( 1); + if (d1[n] < d2[n]) return (-1); + } + + return (0); +} + +int sort_by_digest_4_4 (const void *v1, const void *v2) +{ + const uint32_t *d1 = (const uint32_t *) v1; + const uint32_t *d2 = (const uint32_t *) v2; + + uint n = 4; + + while (n--) + { + if (d1[n] > d2[n]) return ( 1); + if (d1[n] < d2[n]) return (-1); + } + + return (0); +} + +int sort_by_digest_4_5 (const void *v1, const void *v2) +{ + const uint32_t *d1 = (const uint32_t *) v1; + const uint32_t *d2 = (const uint32_t *) v2; + + uint n = 5; + + while (n--) + { + if (d1[n] > d2[n]) return ( 1); + if (d1[n] < d2[n]) return (-1); + } + + return (0); +} + +int sort_by_digest_4_6 (const void *v1, const void *v2) +{ + const uint32_t *d1 = (const uint32_t *) v1; + const uint32_t *d2 = (const uint32_t *) v2; + + uint n = 6; + + while (n--) + { + if (d1[n] > d2[n]) return ( 1); + if (d1[n] < d2[n]) return (-1); + } + + return (0); +} + +int sort_by_digest_4_8 (const void *v1, const void *v2) +{ + const uint32_t *d1 = (const uint32_t *) v1; + const uint32_t *d2 = (const uint32_t *) v2; + + uint n = 8; + + while (n--) + { + if (d1[n] > d2[n]) return ( 1); + if (d1[n] < d2[n]) return (-1); + } + + return (0); +} + +int sort_by_digest_4_16 (const void *v1, const void *v2) +{ + const uint32_t *d1 = (const uint32_t *) v1; + const uint32_t *d2 = (const uint32_t *) v2; + + uint n = 16; + + while (n--) + { + if (d1[n] > d2[n]) return ( 1); + if (d1[n] < d2[n]) return (-1); + } + + return (0); +} + +int sort_by_digest_4_32 (const void *v1, const void *v2) +{ + const uint32_t *d1 = (const uint32_t *) v1; + const uint32_t *d2 = (const uint32_t *) v2; + + uint n = 32; + + while (n--) + { + if (d1[n] > d2[n]) return ( 1); + if (d1[n] < d2[n]) return (-1); + } + + return (0); +} + +int sort_by_digest_4_64 (const void *v1, const void *v2) +{ + const uint32_t *d1 = (const uint32_t *) v1; + const uint32_t *d2 = (const uint32_t *) v2; + + uint n = 64; + + while (n--) + { + if (d1[n] > d2[n]) return ( 1); + if (d1[n] < d2[n]) return (-1); + } + + return (0); +} + +int sort_by_digest_8_8 (const void *v1, const void *v2) +{ + const uint64_t *d1 = (const uint64_t *) v1; + const uint64_t *d2 = (const uint64_t *) v2; + + uint n = 8; + + while (n--) + { + if (d1[n] > d2[n]) return ( 1); + if (d1[n] < d2[n]) return (-1); + } + + return (0); +} + +int sort_by_digest_8_16 (const void *v1, const void *v2) +{ + const uint64_t *d1 = (const uint64_t *) v1; + const uint64_t *d2 = (const uint64_t *) v2; + + uint n = 16; + + while (n--) + { + if (d1[n] > d2[n]) return ( 1); + if (d1[n] < d2[n]) return (-1); + } + + return (0); +} + +int sort_by_digest_8_25 (const void *v1, const void *v2) +{ + const uint64_t *d1 = (const uint64_t *) v1; + const uint64_t *d2 = (const uint64_t *) v2; + + uint n = 25; + + while (n--) + { + if (d1[n] > d2[n]) return ( 1); + if (d1[n] < d2[n]) return (-1); + } + + return (0); +} + +int sort_by_digest_p0p1 (const void *v1, const void *v2) +{ + const uint32_t *d1 = (const uint32_t *) v1; + const uint32_t *d2 = (const uint32_t *) v2; + + const uint dgst_pos0 = data.dgst_pos0; + const uint dgst_pos1 = data.dgst_pos1; + const uint dgst_pos2 = data.dgst_pos2; + const uint dgst_pos3 = data.dgst_pos3; + + if (d1[dgst_pos3] > d2[dgst_pos3]) return ( 1); + if (d1[dgst_pos3] < d2[dgst_pos3]) return (-1); + if (d1[dgst_pos2] > d2[dgst_pos2]) return ( 1); + if (d1[dgst_pos2] < d2[dgst_pos2]) return (-1); + if (d1[dgst_pos1] > d2[dgst_pos1]) return ( 1); + if (d1[dgst_pos1] < d2[dgst_pos1]) return (-1); + if (d1[dgst_pos0] > d2[dgst_pos0]) return ( 1); + if (d1[dgst_pos0] < d2[dgst_pos0]) return (-1); + + return (0); +} + +void format_debug (char * debug_file, uint debug_mode, unsigned char *orig_plain_ptr, uint orig_plain_len, unsigned char *mod_plain_ptr, uint mod_plain_len, char *rule_buf, int rule_len) +{ + uint outfile_autohex = data.outfile_autohex; + + unsigned char *rule_ptr = (unsigned char *) rule_buf; + + FILE *debug_fp = NULL; + + if (debug_file != NULL) + { + debug_fp = fopen (debug_file, "ab"); + } + else + { + debug_fp = stderr; + } + + if (debug_fp == NULL) + { + log_info ("WARNING: Could not open debug-file for writing"); + } + else + { + if ((debug_mode == 2) || (debug_mode == 3) || (debug_mode == 4)) + { + format_plain (debug_fp, orig_plain_ptr, orig_plain_len, outfile_autohex); + + if ((debug_mode == 3) || (debug_mode == 4)) fputc (':', debug_fp); + } + + fwrite (rule_ptr, rule_len, 1, debug_fp); + + if (debug_mode == 4) + { + fputc (':', debug_fp); + + format_plain (debug_fp, mod_plain_ptr, mod_plain_len, outfile_autohex); + } + + fputc ('\n', debug_fp); + + if (debug_file != NULL) fclose (debug_fp); + } +} + +void format_plain (FILE *fp, unsigned char *plain_ptr, uint plain_len, uint outfile_autohex) +{ + int needs_hexify = 0; + + if (outfile_autohex == 1) + { + for (uint i = 0; i < plain_len; i++) + { + if (plain_ptr[i] < 0x20) + { + needs_hexify = 1; + + break; + } + + if (plain_ptr[i] > 0x7f) + { + needs_hexify = 1; + + break; + } + } + } + + if (needs_hexify == 1) + { + fprintf (fp, "$HEX["); + + for (uint i = 0; i < plain_len; i++) + { + fprintf (fp, "%02x", plain_ptr[i]); + } + + fprintf (fp, "]"); + } + else + { + fwrite (plain_ptr, plain_len, 1, fp); + } +} + +void format_output (FILE *out_fp, char *out_buf, unsigned char *plain_ptr, const uint plain_len, const uint64_t crackpos, unsigned char *username, const uint user_len) +{ + uint outfile_format = data.outfile_format; + + char separator = data.separator; + + if (outfile_format & OUTFILE_FMT_HASH) + { + fprintf (out_fp, "%s", out_buf); + + if (outfile_format & (OUTFILE_FMT_PLAIN | OUTFILE_FMT_HEXPLAIN | OUTFILE_FMT_CRACKPOS)) + { + fputc (separator, out_fp); + } + } + else if (data.username) + { + if (username != NULL) + { + for (uint i = 0; i < user_len; i++) + { + fprintf (out_fp, "%c", username[i]); + } + + if (outfile_format & (OUTFILE_FMT_PLAIN | OUTFILE_FMT_HEXPLAIN | OUTFILE_FMT_CRACKPOS)) + { + fputc (separator, out_fp); + } + } + } + + if (outfile_format & OUTFILE_FMT_PLAIN) + { + format_plain (out_fp, plain_ptr, plain_len, data.outfile_autohex); + + if (outfile_format & (OUTFILE_FMT_HEXPLAIN | OUTFILE_FMT_CRACKPOS)) + { + fputc (separator, out_fp); + } + } + + if (outfile_format & OUTFILE_FMT_HEXPLAIN) + { + for (uint i = 0; i < plain_len; i++) + { + fprintf (out_fp, "%02x", plain_ptr[i]); + } + + if (outfile_format & (OUTFILE_FMT_CRACKPOS)) + { + fputc (separator, out_fp); + } + } + + if (outfile_format & OUTFILE_FMT_CRACKPOS) + { + #ifdef _WIN + __mingw_fprintf (out_fp, "%llu", crackpos); + #endif + + #ifdef _POSIX + #ifdef __x86_64__ + fprintf (out_fp, "%lu", crackpos); + #else + fprintf (out_fp, "%llu", crackpos); + #endif + #endif + } + + fputc ('\n', out_fp); +} + +void handle_show_request (pot_t *pot, uint pot_cnt, char *input_buf, int input_len, hash_t *hashes_buf, int (*sort_by_pot) (const void *, const void *), FILE *out_fp) +{ + pot_t pot_key; + + pot_key.hash.salt = hashes_buf->salt; + pot_key.hash.digest = hashes_buf->digest; + + pot_t *pot_ptr = (pot_t *) bsearch (&pot_key, pot, pot_cnt, sizeof (pot_t), sort_by_pot); + + if (pot_ptr) + { + log_info_nn (""); + + input_buf[input_len] = 0; + + // user + unsigned char *username = NULL; + uint user_len = 0; + + if (data.username) + { + user_t *user = hashes_buf->hash_info->user; + + if (user) + { + username = (unsigned char *) (user->user_name); + + user_len = user->user_len; + } + } + + // do output the line + format_output (out_fp, input_buf, (unsigned char *) pot_ptr->plain_buf, pot_ptr->plain_len, 0, username, user_len); + } +} + +#define LM_WEAK_HASH "\x4e\xcf\x0d\x0c\x0a\xe2\xfb\xc1" +#define LM_MASKED_PLAIN "[notfound]" + +void handle_show_request_lm (pot_t *pot, uint pot_cnt, char *input_buf, int input_len, hash_t *hash_left, hash_t *hash_right, int (*sort_by_pot) (const void *, const void *), FILE *out_fp) +{ + // left + + pot_t pot_left_key; + + pot_left_key.hash.salt = hash_left->salt; + pot_left_key.hash.digest = hash_left->digest; + + pot_t *pot_left_ptr = (pot_t *) bsearch (&pot_left_key, pot, pot_cnt, sizeof (pot_t), sort_by_pot); + + // right + + uint weak_hash_found = 0; + + pot_t pot_right_key; + + pot_right_key.hash.salt = hash_right->salt; + pot_right_key.hash.digest = hash_right->digest; + + pot_t *pot_right_ptr = (pot_t *) bsearch (&pot_right_key, pot, pot_cnt, sizeof (pot_t), sort_by_pot); + + if (pot_right_ptr == NULL) + { + // special case, if "weak hash" + + if (memcmp (hash_right->digest, LM_WEAK_HASH, 8) == 0) + { + weak_hash_found = 1; + + pot_right_ptr = (pot_t *) mycalloc (1, sizeof (pot_t)); + + // in theory this is not needed, but we are paranoia: + + memset (pot_right_ptr->plain_buf, 0, sizeof (pot_right_ptr->plain_buf)); + pot_right_ptr->plain_len = 0; + } + } + + if ((pot_left_ptr == NULL) && (pot_right_ptr == NULL)) + { + if (weak_hash_found == 1) myfree (pot_right_ptr); // this shouldn't happen at all: if weak_hash_found == 1, than pot_right_ptr is not NULL for sure + + return; + } + + // at least one half was found: + + log_info_nn (""); + + input_buf[input_len] = 0; + + // user + + unsigned char *username = NULL; + uint user_len = 0; + + if (data.username) + { + user_t *user = hash_left->hash_info->user; + + if (user) + { + username = (unsigned char *) (user->user_name); + + user_len = user->user_len; + } + } + + // mask the part which was not found + + uint left_part_masked = 0; + uint right_part_masked = 0; + + uint mask_plain_len = strlen (LM_MASKED_PLAIN); + + if (pot_left_ptr == NULL) + { + left_part_masked = 1; + + pot_left_ptr = (pot_t *) mycalloc (1, sizeof (pot_t)); + + memset (pot_left_ptr->plain_buf, 0, sizeof (pot_left_ptr->plain_buf)); + + memcpy (pot_left_ptr->plain_buf, LM_MASKED_PLAIN, mask_plain_len); + pot_left_ptr->plain_len = mask_plain_len; + } + + if (pot_right_ptr == NULL) + { + right_part_masked = 1; + + pot_right_ptr = (pot_t *) mycalloc (1, sizeof (pot_t)); + + memset (pot_right_ptr->plain_buf, 0, sizeof (pot_right_ptr->plain_buf)); + + memcpy (pot_right_ptr->plain_buf, LM_MASKED_PLAIN, mask_plain_len); + pot_right_ptr->plain_len = mask_plain_len; + } + + // create the pot_ptr out of pot_left_ptr and pot_right_ptr + + pot_t pot_ptr; + + pot_ptr.plain_len = pot_left_ptr->plain_len + pot_right_ptr->plain_len; + + memcpy (pot_ptr.plain_buf, pot_left_ptr->plain_buf, pot_left_ptr->plain_len); + + memcpy (pot_ptr.plain_buf + pot_left_ptr->plain_len, pot_right_ptr->plain_buf, pot_right_ptr->plain_len); + + // do output the line + + format_output (out_fp, input_buf, (unsigned char *) pot_ptr.plain_buf, pot_ptr.plain_len, 0, username, user_len); + + if (weak_hash_found == 1) myfree (pot_right_ptr); + + if (left_part_masked == 1) myfree (pot_left_ptr); + if (right_part_masked == 1) myfree (pot_right_ptr); +} + +void handle_left_request (pot_t *pot, uint pot_cnt, char *input_buf, int input_len, hash_t *hashes_buf, int (*sort_by_pot) (const void *, const void *), FILE *out_fp) +{ + pot_t pot_key; + + memcpy (&pot_key.hash, hashes_buf, sizeof (hash_t)); + + pot_t *pot_ptr = (pot_t *) bsearch (&pot_key, pot, pot_cnt, sizeof (pot_t), sort_by_pot); + + if (pot_ptr == NULL) + { + log_info_nn (""); + + input_buf[input_len] = 0; + + format_output (out_fp, input_buf, NULL, 0, 0, NULL, 0); + } +} + +void handle_left_request_lm (pot_t *pot, uint pot_cnt, char *input_buf, int input_len, hash_t *hash_left, hash_t *hash_right, int (*sort_by_pot) (const void *, const void *), FILE *out_fp) +{ + // left + + pot_t pot_left_key; + + memcpy (&pot_left_key.hash, hash_left, sizeof (hash_t)); + + pot_t *pot_left_ptr = (pot_t *) bsearch (&pot_left_key, pot, pot_cnt, sizeof (pot_t), sort_by_pot); + + // right + + pot_t pot_right_key; + + memcpy (&pot_right_key.hash, hash_right, sizeof (hash_t)); + + pot_t *pot_right_ptr = (pot_t *) bsearch (&pot_right_key, pot, pot_cnt, sizeof (pot_t), sort_by_pot); + + uint weak_hash_found = 0; + + if (pot_right_ptr == NULL) + { + // special case, if "weak hash" + + if (memcmp (hash_right->digest, LM_WEAK_HASH, 8) == 0) + { + weak_hash_found = 1; + + // we just need that pot_right_ptr is not a NULL pointer + + pot_right_ptr = (pot_t *) mycalloc (1, sizeof (pot_t)); + } + } + + if ((pot_left_ptr != NULL) && (pot_right_ptr != NULL)) + { + if (weak_hash_found == 1) myfree (pot_right_ptr); + + return; + } + + // ... at least one part was not cracked + + log_info_nn (""); + + input_buf[input_len] = 0; + + // only show the hash part which is still not cracked + + uint user_len = input_len - 32; + + char hash_output[user_len + 33]; + + memset (hash_output, 0, sizeof (hash_output)); + + memcpy (hash_output, input_buf, input_len); + + if (pot_left_ptr != NULL) + { + // only show right part (because left part was already found) + + memcpy (hash_output + user_len, input_buf + user_len + 16, 16); + + hash_output[user_len + 16] = 0; + } + + if (pot_right_ptr != NULL) + { + // only show left part (because right part was already found) + + memcpy (hash_output + user_len, input_buf + user_len, 16); + + hash_output[user_len + 16] = 0; + } + + format_output (out_fp, hash_output, NULL, 0, 0, NULL, 0); + + if (weak_hash_found == 1) myfree (pot_right_ptr); +} + +uint devices_to_devicemask (char *gpu_devices) +{ + uint gpu_devicemask = 0; + + if (gpu_devices) + { + char *devices = strdup (gpu_devices); + + char *next = strtok (devices, ","); + + do + { + uint gpu_id = atoi (next); + + if (gpu_id < 1 || gpu_id > 8) + { + log_error ("ERROR: invalid gpu_id %u specified", gpu_id); + + exit (-1); + } + + gpu_devicemask |= 1 << (gpu_id - 1); + + } while ((next = strtok (NULL, ",")) != NULL); + + free (devices); + } + + return gpu_devicemask; +} + +uint get_random_num (uint min, uint max) +{ + if (min == max) return (min); + + return (uint) ((rand () % (max - min)) + min); +} + +uint32_t mydivc32 (const uint32_t dividend, const uint32_t divisor) +{ + uint32_t quotient = dividend / divisor; + + if (dividend % divisor) quotient++; + + return quotient; +} + +uint64_t mydivc64 (const uint64_t dividend, const uint64_t divisor) +{ + uint64_t quotient = dividend / divisor; + + if (dividend % divisor) quotient++; + + return quotient; +} + +void format_timer_display (struct tm *tm, char *buf, size_t len) +{ + const char *time_entities_s[] = { "year", "day", "hour", "min", "sec" }; + const char *time_entities_m[] = { "years", "days", "hours", "mins", "secs" }; + + if (tm->tm_year - 70) + { + char *time_entity1 = ((tm->tm_year - 70) == 1) ? (char *) time_entities_s[0] : (char *) time_entities_m[0]; + char *time_entity2 = ( tm->tm_yday == 1) ? (char *) time_entities_s[1] : (char *) time_entities_m[1]; + + snprintf (buf, len - 1, "%d %s, %d %s", tm->tm_year - 70, time_entity1, tm->tm_yday, time_entity2); + } + else if (tm->tm_yday) + { + char *time_entity1 = (tm->tm_yday == 1) ? (char *) time_entities_s[1] : (char *) time_entities_m[1]; + char *time_entity2 = (tm->tm_hour == 1) ? (char *) time_entities_s[2] : (char *) time_entities_m[2]; + + snprintf (buf, len - 1, "%d %s, %d %s", tm->tm_yday, time_entity1, tm->tm_hour, time_entity2); + } + else if (tm->tm_hour) + { + char *time_entity1 = (tm->tm_hour == 1) ? (char *) time_entities_s[2] : (char *) time_entities_m[2]; + char *time_entity2 = (tm->tm_min == 1) ? (char *) time_entities_s[3] : (char *) time_entities_m[3]; + + snprintf (buf, len - 1, "%d %s, %d %s", tm->tm_hour, time_entity1, tm->tm_min, time_entity2); + } + else if (tm->tm_min) + { + char *time_entity1 = (tm->tm_min == 1) ? (char *) time_entities_s[3] : (char *) time_entities_m[3]; + char *time_entity2 = (tm->tm_sec == 1) ? (char *) time_entities_s[4] : (char *) time_entities_m[4]; + + snprintf (buf, len - 1, "%d %s, %d %s", tm->tm_min, time_entity1, tm->tm_sec, time_entity2); + } + else + { + char *time_entity1 = (tm->tm_sec == 1) ? (char *) time_entities_s[4] : (char *) time_entities_m[4]; + + snprintf (buf, len - 1, "%d %s", tm->tm_sec, time_entity1); + } +} + +void format_speed_display (float val, char *buf, size_t len) +{ + if (val <= 0) + { + buf[0] = '0'; + buf[1] = ' '; + buf[2] = 0; + + return; + } + + char units[7] = { ' ', 'k', 'M', 'G', 'T', 'P', 'E' }; + + uint level = 0; + + while (val > 99999) + { + val /= 1000; + + level++; + } + + /* generate output */ + + if (level == 0) + { + snprintf (buf, len - 1, "%.0f ", val); + } + else + { + snprintf (buf, len - 1, "%.1f %c", val, units[level]); + } +} + +void lowercase (char *buf, int len) +{ + for (int i = 0; i < len; i++) buf[i] = tolower (buf[i]); +} + +void uppercase (char *buf, int len) +{ + for (int i = 0; i < len; i++) buf[i] = toupper (buf[i]); +} + +int fgetl (FILE *fp, char *line_buf) +{ + int line_len = 0; + + while (!feof (fp)) + { + const int c = fgetc (fp); + + if (c == EOF) break; + + line_buf[line_len] = (char) c; + + line_len++; + + if (line_len == BUFSIZ) line_len--; + + if (c == '\n') break; + } + + if (line_len == 0) return 0; + + if (line_buf[line_len - 1] == '\n') + { + line_len--; + + line_buf[line_len] = 0; + } + + if (line_len == 0) return 0; + + if (line_buf[line_len - 1] == '\r') + { + line_len--; + + line_buf[line_len] = 0; + } + + return (line_len); +} + +int in_superchop (char *buf) +{ + int len = strlen (buf); + + while (len) + { + if (buf[len - 1] == '\n') + { + len--; + + continue; + } + + if (buf[len - 1] == '\r') + { + len--; + + continue; + } + + break; + } + + buf[len] = 0; + + return len; +} + +char **scan_directory (const char *path) +{ + char *tmp_path = mystrdup (path); + + size_t tmp_path_len = strlen (tmp_path); + + while (tmp_path[tmp_path_len - 1] == '/' || tmp_path[tmp_path_len - 1] == '\\') + { + tmp_path[tmp_path_len - 1] = 0; + + tmp_path_len = strlen (tmp_path); + } + + char **files = NULL; + + int num_files = 0; + + DIR *d; + + if ((d = opendir (tmp_path)) != NULL) + { + struct dirent *de; + + while ((de = readdir (d)) != NULL) + { + if ((strcmp (de->d_name, ".") == 0) || (strcmp (de->d_name, "..") == 0)) continue; + + int path_size = strlen (tmp_path) + 1 + strlen (de->d_name); + + char *path_file = (char *) mymalloc (path_size + 1); + + snprintf (path_file, path_size + 1, "%s/%s", tmp_path, de->d_name); + + path_file[path_size] = 0; + + DIR *d_test; + + if ((d_test = opendir (path_file)) != NULL) + { + closedir (d_test); + + myfree (path_file); + } + else + { + files = (char **) myrealloc (files, num_files * sizeof (char *), sizeof (char *)); + + num_files++; + + files[num_files - 1] = path_file; + } + } + + closedir (d); + } + else if (errno == ENOTDIR) + { + files = (char **) myrealloc (files, num_files * sizeof (char *), sizeof (char *)); + + num_files++; + + files[num_files - 1] = mystrdup (path); + } + + files = (char **) myrealloc (files, num_files * sizeof (char *), sizeof (char *)); + + num_files++; + + files[num_files - 1] = NULL; + + myfree (tmp_path); + + return (files); +} + +int count_dictionaries (char **dictionary_files) +{ + if (dictionary_files == NULL) return 0; + + int cnt = 0; + + for (int d = 0; dictionary_files[d] != NULL; d++) + { + cnt++; + } + + return (cnt); +} + +char *stroptitype (const uint opti_type) +{ + switch (opti_type) + { + case OPTI_TYPE_ZERO_BYTE: return ((char *) OPTI_STR_ZERO_BYTE); break; + case OPTI_TYPE_PRECOMPUTE_INIT: return ((char *) OPTI_STR_PRECOMPUTE_INIT); break; + case OPTI_TYPE_PRECOMPUTE_MERKLE: return ((char *) OPTI_STR_PRECOMPUTE_MERKLE); break; + case OPTI_TYPE_PRECOMPUTE_PERMUT: return ((char *) OPTI_STR_PRECOMPUTE_PERMUT); break; + case OPTI_TYPE_MEET_IN_MIDDLE: return ((char *) OPTI_STR_MEET_IN_MIDDLE); break; + case OPTI_TYPE_EARLY_SKIP: return ((char *) OPTI_STR_EARLY_SKIP); break; + case OPTI_TYPE_NOT_SALTED: return ((char *) OPTI_STR_NOT_SALTED); break; + case OPTI_TYPE_NOT_ITERATED: return ((char *) OPTI_STR_NOT_ITERATED); break; + case OPTI_TYPE_PREPENDED_SALT: return ((char *) OPTI_STR_PREPENDED_SALT); break; + case OPTI_TYPE_APPENDED_SALT: return ((char *) OPTI_STR_APPENDED_SALT); break; + case OPTI_TYPE_SINGLE_HASH: return ((char *) OPTI_STR_SINGLE_HASH); break; + case OPTI_TYPE_SINGLE_SALT: return ((char *) OPTI_STR_SINGLE_SALT); break; + case OPTI_TYPE_BRUTE_FORCE: return ((char *) OPTI_STR_BRUTE_FORCE); break; + case OPTI_TYPE_SCALAR_MODE: return ((char *) OPTI_STR_SCALAR_MODE); break; + case OPTI_TYPE_RAW_HASH: return ((char *) OPTI_STR_RAW_HASH); break; + } + + return (NULL); +} + +char *strparser (const uint parser_status) +{ + switch (parser_status) + { + case PARSER_OK: return ((char *) PA_000); break; + case PARSER_COMMENT: return ((char *) PA_001); break; + case PARSER_GLOBAL_ZERO: return ((char *) PA_002); break; + case PARSER_GLOBAL_LENGTH: return ((char *) PA_003); break; + case PARSER_HASH_LENGTH: return ((char *) PA_004); break; + case PARSER_HASH_VALUE: return ((char *) PA_005); break; + case PARSER_SALT_LENGTH: return ((char *) PA_006); break; + case PARSER_SALT_VALUE: return ((char *) PA_007); break; + case PARSER_SALT_ITERATION: return ((char *) PA_008); break; + case PARSER_SEPARATOR_UNMATCHED: return ((char *) PA_009); break; + case PARSER_SIGNATURE_UNMATCHED: return ((char *) PA_010); break; + case PARSER_HCCAP_FILE_SIZE: return ((char *) PA_011); break; + case PARSER_HCCAP_EAPOL_SIZE: return ((char *) PA_012); break; + case PARSER_PSAFE2_FILE_SIZE: return ((char *) PA_013); break; + case PARSER_PSAFE3_FILE_SIZE: return ((char *) PA_014); break; + case PARSER_TC_FILE_SIZE: return ((char *) PA_015); break; + case PARSER_SIP_AUTH_DIRECTIVE: return ((char *) PA_016); break; + } + + return ((char *) PA_255); +} + +char *strhashtype (const uint hash_mode) +{ + switch (hash_mode) + { + case 0: return ((char *) HT_00000); break; + case 10: return ((char *) HT_00010); break; + case 11: return ((char *) HT_00011); break; + case 12: return ((char *) HT_00012); break; + case 20: return ((char *) HT_00020); break; + case 21: return ((char *) HT_00021); break; + case 22: return ((char *) HT_00022); break; + case 23: return ((char *) HT_00023); break; + case 30: return ((char *) HT_00030); break; + case 40: return ((char *) HT_00040); break; + case 50: return ((char *) HT_00050); break; + case 60: return ((char *) HT_00060); break; + case 100: return ((char *) HT_00100); break; + case 101: return ((char *) HT_00101); break; + case 110: return ((char *) HT_00110); break; + case 111: return ((char *) HT_00111); break; + case 112: return ((char *) HT_00112); break; + case 120: return ((char *) HT_00120); break; + case 121: return ((char *) HT_00121); break; + case 122: return ((char *) HT_00122); break; + case 124: return ((char *) HT_00124); break; + case 130: return ((char *) HT_00130); break; + case 131: return ((char *) HT_00131); break; + case 132: return ((char *) HT_00132); break; + case 133: return ((char *) HT_00133); break; + case 140: return ((char *) HT_00140); break; + case 141: return ((char *) HT_00141); break; + case 150: return ((char *) HT_00150); break; + case 160: return ((char *) HT_00160); break; + case 190: return ((char *) HT_00190); break; + case 200: return ((char *) HT_00200); break; + case 300: return ((char *) HT_00300); break; + case 400: return ((char *) HT_00400); break; + case 500: return ((char *) HT_00500); break; + case 501: return ((char *) HT_00501); break; + case 900: return ((char *) HT_00900); break; + case 910: return ((char *) HT_00910); break; + case 1000: return ((char *) HT_01000); break; + case 1100: return ((char *) HT_01100); break; + case 1400: return ((char *) HT_01400); break; + case 1410: return ((char *) HT_01410); break; + case 1420: return ((char *) HT_01420); break; + case 1421: return ((char *) HT_01421); break; + case 1430: return ((char *) HT_01430); break; + case 1440: return ((char *) HT_01440); break; + case 1441: return ((char *) HT_01441); break; + case 1450: return ((char *) HT_01450); break; + case 1460: return ((char *) HT_01460); break; + case 1500: return ((char *) HT_01500); break; + case 1600: return ((char *) HT_01600); break; + case 1700: return ((char *) HT_01700); break; + case 1710: return ((char *) HT_01710); break; + case 1711: return ((char *) HT_01711); break; + case 1720: return ((char *) HT_01720); break; + case 1722: return ((char *) HT_01722); break; + case 1730: return ((char *) HT_01730); break; + case 1731: return ((char *) HT_01731); break; + case 1740: return ((char *) HT_01740); break; + case 1750: return ((char *) HT_01750); break; + case 1760: return ((char *) HT_01760); break; + case 1800: return ((char *) HT_01800); break; + case 2100: return ((char *) HT_02100); break; + case 2400: return ((char *) HT_02400); break; + case 2410: return ((char *) HT_02410); break; + case 2500: return ((char *) HT_02500); break; + case 2600: return ((char *) HT_02600); break; + case 2611: return ((char *) HT_02611); break; + case 2612: return ((char *) HT_02612); break; + case 2711: return ((char *) HT_02711); break; + case 2811: return ((char *) HT_02811); break; + case 3000: return ((char *) HT_03000); break; + case 3100: return ((char *) HT_03100); break; + case 3200: return ((char *) HT_03200); break; + case 3710: return ((char *) HT_03710); break; + case 3711: return ((char *) HT_03711); break; + case 3800: return ((char *) HT_03800); break; + case 4300: return ((char *) HT_04300); break; + case 4400: return ((char *) HT_04400); break; + case 4500: return ((char *) HT_04500); break; + case 4700: return ((char *) HT_04700); break; + case 4800: return ((char *) HT_04800); break; + case 4900: return ((char *) HT_04900); break; + case 5000: return ((char *) HT_05000); break; + case 5100: return ((char *) HT_05100); break; + case 5200: return ((char *) HT_05200); break; + case 5300: return ((char *) HT_05300); break; + case 5400: return ((char *) HT_05400); break; + case 5500: return ((char *) HT_05500); break; + case 5600: return ((char *) HT_05600); break; + case 5700: return ((char *) HT_05700); break; + case 5800: return ((char *) HT_05800); break; + case 6000: return ((char *) HT_06000); break; + case 6100: return ((char *) HT_06100); break; + case 6211: return ((char *) HT_06211); break; + case 6212: return ((char *) HT_06212); break; + case 6213: return ((char *) HT_06213); break; + case 6221: return ((char *) HT_06221); break; + case 6222: return ((char *) HT_06222); break; + case 6223: return ((char *) HT_06223); break; + case 6231: return ((char *) HT_06231); break; + case 6232: return ((char *) HT_06232); break; + case 6233: return ((char *) HT_06233); break; + case 6241: return ((char *) HT_06241); break; + case 6242: return ((char *) HT_06242); break; + case 6243: return ((char *) HT_06243); break; + case 6300: return ((char *) HT_06300); break; + case 6400: return ((char *) HT_06400); break; + case 6500: return ((char *) HT_06500); break; + case 6600: return ((char *) HT_06600); break; + case 6700: return ((char *) HT_06700); break; + case 6800: return ((char *) HT_06800); break; + case 6900: return ((char *) HT_06900); break; + case 7100: return ((char *) HT_07100); break; + case 7200: return ((char *) HT_07200); break; + case 7300: return ((char *) HT_07300); break; + case 7400: return ((char *) HT_07400); break; + case 7500: return ((char *) HT_07500); break; + case 7600: return ((char *) HT_07600); break; + case 7700: return ((char *) HT_07700); break; + case 7800: return ((char *) HT_07800); break; + case 7900: return ((char *) HT_07900); break; + case 8000: return ((char *) HT_08000); break; + case 8100: return ((char *) HT_08100); break; + case 8200: return ((char *) HT_08200); break; + case 8300: return ((char *) HT_08300); break; + case 8400: return ((char *) HT_08400); break; + case 8500: return ((char *) HT_08500); break; + case 8600: return ((char *) HT_08600); break; + case 8700: return ((char *) HT_08700); break; + case 8800: return ((char *) HT_08800); break; + case 8900: return ((char *) HT_08900); break; + case 9000: return ((char *) HT_09000); break; + case 9100: return ((char *) HT_09100); break; + case 9200: return ((char *) HT_09200); break; + case 9300: return ((char *) HT_09300); break; + case 9400: return ((char *) HT_09400); break; + case 9500: return ((char *) HT_09500); break; + case 9600: return ((char *) HT_09600); break; + case 9700: return ((char *) HT_09700); break; + case 9710: return ((char *) HT_09710); break; + case 9720: return ((char *) HT_09720); break; + case 9800: return ((char *) HT_09800); break; + case 9810: return ((char *) HT_09810); break; + case 9820: return ((char *) HT_09820); break; + case 9900: return ((char *) HT_09900); break; + case 10000: return ((char *) HT_10000); break; + case 10100: return ((char *) HT_10100); break; + case 10200: return ((char *) HT_10200); break; + case 10300: return ((char *) HT_10300); break; + case 10400: return ((char *) HT_10400); break; + case 10410: return ((char *) HT_10410); break; + case 10420: return ((char *) HT_10420); break; + case 10500: return ((char *) HT_10500); break; + case 10600: return ((char *) HT_10600); break; + case 10700: return ((char *) HT_10700); break; + case 10800: return ((char *) HT_10800); break; + case 10900: return ((char *) HT_10900); break; + case 11000: return ((char *) HT_11000); break; + case 11100: return ((char *) HT_11100); break; + case 11200: return ((char *) HT_11200); break; + case 11300: return ((char *) HT_11300); break; + case 11400: return ((char *) HT_11400); break; + case 11500: return ((char *) HT_11500); break; + case 11600: return ((char *) HT_11600); break; + case 11700: return ((char *) HT_11700); break; + case 11800: return ((char *) HT_11800); break; + case 11900: return ((char *) HT_11900); break; + case 12000: return ((char *) HT_12000); break; + case 12100: return ((char *) HT_12100); break; + case 12200: return ((char *) HT_12200); break; + case 12300: return ((char *) HT_12300); break; + case 12400: return ((char *) HT_12400); break; + case 12500: return ((char *) HT_12500); break; + case 12600: return ((char *) HT_12600); break; + case 12700: return ((char *) HT_12700); break; + case 12800: return ((char *) HT_12800); break; + } + + return ((char *) "Unknown"); +} + +char *strstatus (const uint devices_status) +{ + switch (devices_status) + { + case STATUS_INIT: return ((char *) ST_0000); break; + case STATUS_STARTING: return ((char *) ST_0001); break; + case STATUS_RUNNING: return ((char *) ST_0002); break; + case STATUS_PAUSED: return ((char *) ST_0003); break; + case STATUS_EXHAUSTED: return ((char *) ST_0004); break; + case STATUS_CRACKED: return ((char *) ST_0005); break; + case STATUS_ABORTED: return ((char *) ST_0006); break; + case STATUS_QUIT: return ((char *) ST_0007); break; + } + + return ((char *) "Unknown"); +} + +void ascii_digest (char out_buf[4096], uint salt_pos, uint digest_pos) +{ + uint hash_type = data.hash_type; + uint hash_mode = data.hash_mode; + uint salt_type = data.salt_type; + uint opts_type = data.opts_type; + uint opti_type = data.opti_type; + uint dgst_size = data.dgst_size; + + char *hashfile = data.hashfile; + + uint len = 4096; + + uint digest_buf[64]; + + uint64_t *digest_buf64 = (uint64_t *) digest_buf; + + char *digests_buf_ptr = (char *) data.digests_buf; + + memcpy (digest_buf, digests_buf_ptr + (data.salts_buf[salt_pos].digests_offset * dgst_size) + (digest_pos * dgst_size), dgst_size); + + if (opti_type & OPTI_TYPE_PRECOMPUTE_PERMUT) + { + uint tt; + + switch (hash_type) + { + case HASH_TYPE_DESCRYPT: + FP (digest_buf[1], digest_buf[0], tt); + break; + + case HASH_TYPE_DESRACF: + digest_buf[0] = ROTATE_LEFT (digest_buf[0], 29); + digest_buf[1] = ROTATE_LEFT (digest_buf[1], 29); + + FP (digest_buf[1], digest_buf[0], tt); + break; + + case HASH_TYPE_LM: + FP (digest_buf[1], digest_buf[0], tt); + break; + + case HASH_TYPE_NETNTLM: + digest_buf[0] = ROTATE_LEFT (digest_buf[0], 29); + digest_buf[1] = ROTATE_LEFT (digest_buf[1], 29); + digest_buf[2] = ROTATE_LEFT (digest_buf[2], 29); + digest_buf[3] = ROTATE_LEFT (digest_buf[3], 29); + + FP (digest_buf[1], digest_buf[0], tt); + FP (digest_buf[3], digest_buf[2], tt); + break; + + case HASH_TYPE_BSDICRYPT: + digest_buf[0] = ROTATE_LEFT (digest_buf[0], 31); + digest_buf[1] = ROTATE_LEFT (digest_buf[1], 31); + + FP (digest_buf[1], digest_buf[0], tt); + break; + } + } + + if (opti_type & OPTI_TYPE_PRECOMPUTE_MERKLE) + { + switch (hash_type) + { + case HASH_TYPE_MD4: + digest_buf[0] += MD4M_A; + digest_buf[1] += MD4M_B; + digest_buf[2] += MD4M_C; + digest_buf[3] += MD4M_D; + break; + + case HASH_TYPE_MD5: + digest_buf[0] += MD5M_A; + digest_buf[1] += MD5M_B; + digest_buf[2] += MD5M_C; + digest_buf[3] += MD5M_D; + break; + + case HASH_TYPE_SHA1: + digest_buf[0] += SHA1M_A; + digest_buf[1] += SHA1M_B; + digest_buf[2] += SHA1M_C; + digest_buf[3] += SHA1M_D; + digest_buf[4] += SHA1M_E; + break; + + case HASH_TYPE_SHA256: + digest_buf[0] += SHA256M_A; + digest_buf[1] += SHA256M_B; + digest_buf[2] += SHA256M_C; + digest_buf[3] += SHA256M_D; + digest_buf[4] += SHA256M_E; + digest_buf[5] += SHA256M_F; + digest_buf[6] += SHA256M_G; + digest_buf[7] += SHA256M_H; + break; + + case HASH_TYPE_SHA384: + digest_buf64[0] += SHA384M_A; + digest_buf64[1] += SHA384M_B; + digest_buf64[2] += SHA384M_C; + digest_buf64[3] += SHA384M_D; + digest_buf64[4] += SHA384M_E; + digest_buf64[5] += SHA384M_F; + digest_buf64[6] += 0; + digest_buf64[7] += 0; + break; + + case HASH_TYPE_SHA512: + digest_buf64[0] += SHA512M_A; + digest_buf64[1] += SHA512M_B; + digest_buf64[2] += SHA512M_C; + digest_buf64[3] += SHA512M_D; + digest_buf64[4] += SHA512M_E; + digest_buf64[5] += SHA512M_F; + digest_buf64[6] += SHA512M_G; + digest_buf64[7] += SHA512M_H; + break; + } + } + + if (opts_type & OPTS_TYPE_PT_GENERATE_LE) + { + if (dgst_size == DGST_SIZE_4_2) + { + for (int i = 0; i < 2; i++) digest_buf[i] = byte_swap_32 (digest_buf[i]); + } + else if (dgst_size == DGST_SIZE_4_4) + { + for (int i = 0; i < 4; i++) digest_buf[i] = byte_swap_32 (digest_buf[i]); + } + else if (dgst_size == DGST_SIZE_4_5) + { + for (int i = 0; i < 5; i++) digest_buf[i] = byte_swap_32 (digest_buf[i]); + } + else if (dgst_size == DGST_SIZE_4_6) + { + for (int i = 0; i < 6; i++) digest_buf[i] = byte_swap_32 (digest_buf[i]); + } + else if (dgst_size == DGST_SIZE_4_8) + { + for (int i = 0; i < 8; i++) digest_buf[i] = byte_swap_32 (digest_buf[i]); + } + else if ((dgst_size == DGST_SIZE_4_16) || (dgst_size == DGST_SIZE_8_8)) // same size, same result :) + { + if (hash_type == HASH_TYPE_WHIRLPOOL) + { + for (int i = 0; i < 16; i++) digest_buf[i] = byte_swap_32 (digest_buf[i]); + } + else if (hash_type == HASH_TYPE_SHA384) + { + for (int i = 0; i < 8; i++) digest_buf64[i] = byte_swap_64 (digest_buf64[i]); + } + else if (hash_type == HASH_TYPE_SHA512) + { + for (int i = 0; i < 8; i++) digest_buf64[i] = byte_swap_64 (digest_buf64[i]); + } + else if (hash_type == HASH_TYPE_GOST) + { + for (int i = 0; i < 16; i++) digest_buf[i] = byte_swap_32 (digest_buf[i]); + } + } + else if (dgst_size == DGST_SIZE_4_64) + { + for (int i = 0; i < 64; i++) digest_buf[i] = byte_swap_32 (digest_buf[i]); + } + else if (dgst_size == DGST_SIZE_8_25) + { + for (int i = 0; i < 25; i++) digest_buf64[i] = byte_swap_64 (digest_buf64[i]); + } + } + + uint isSalted = ((data.salt_type == SALT_TYPE_INTERN) + | (data.salt_type == SALT_TYPE_EXTERN) + | (data.salt_type == SALT_TYPE_EMBEDDED)); + + salt_t salt; + + if (isSalted) + { + memset (&salt, 0, sizeof (salt_t)); + + memcpy (&salt, &data.salts_buf[salt_pos], sizeof (salt_t)); + + char *ptr = (char *) salt.salt_buf; + + uint len = salt.salt_len; + + if (opti_type & OPTI_TYPE_PRECOMPUTE_PERMUT) + { + uint tt; + + switch (hash_type) + { + case HASH_TYPE_NETNTLM: + + salt.salt_buf[0] = ROTATE_RIGHT (salt.salt_buf[0], 3); + salt.salt_buf[1] = ROTATE_RIGHT (salt.salt_buf[1], 3); + + FP (salt.salt_buf[1], salt.salt_buf[0], tt); + + break; + } + } + + if (opts_type & OPTS_TYPE_ST_UNICODE) + { + for (uint i = 0, j = 0; i < len; i += 1, j += 2) + { + ptr[i] = ptr[j]; + } + + len = len / 2; + } + + if (opts_type & OPTS_TYPE_ST_GENERATE_LE) + { + uint max = salt.salt_len / 4; + + if (len % 4) max++; + + for (uint i = 0; i < max; i++) + { + salt.salt_buf[i] = byte_swap_32 (salt.salt_buf[i]); + } + } + + if (opts_type & OPTS_TYPE_ST_HEX) + { + char tmp[64]; + + memset (tmp, 0, sizeof (tmp)); + + for (uint i = 0, j = 0; i < len; i += 1, j += 2) + { + sprintf (tmp + j, "%02x", (unsigned char) ptr[i]); + } + + len = len * 2; + + memcpy (ptr, tmp, len); + } + + uint memset_size = ((48 - (int) len) > 0) ? (48 - len) : 0; + + memset (ptr + len, 0, memset_size); + + salt.salt_len = len; + } + + // + // some modes require special encoding + // + + uint out_buf_plain[256]; + uint out_buf_salt[256]; + + char tmp_buf[1024]; + + memset (out_buf_plain, 0, sizeof (out_buf_plain)); + memset (out_buf_salt, 0, sizeof (out_buf_salt)); + + memset (tmp_buf, 0, sizeof (tmp_buf)); + + char *ptr_plain = (char *) out_buf_plain; + char *ptr_salt = (char *) out_buf_salt; + + if (hash_mode == 22) + { + char username[30]; + + memset (username, 0, sizeof (username)); + + memcpy (username, salt.salt_buf, salt.salt_len - 22); + + char sig[6] = { 'n', 'r', 'c', 's', 't', 'n' }; + + uint16_t *ptr = (uint16_t *) digest_buf; + + tmp_buf[ 0] = sig[0]; + tmp_buf[ 1] = int_to_base64 (((ptr[1]) >> 12) & 0x3f); + tmp_buf[ 2] = int_to_base64 (((ptr[1]) >> 6) & 0x3f); + tmp_buf[ 3] = int_to_base64 (((ptr[1]) >> 0) & 0x3f); + tmp_buf[ 4] = int_to_base64 (((ptr[0]) >> 12) & 0x3f); + tmp_buf[ 5] = int_to_base64 (((ptr[0]) >> 6) & 0x3f); + tmp_buf[ 6] = sig[1]; + tmp_buf[ 7] = int_to_base64 (((ptr[0]) >> 0) & 0x3f); + tmp_buf[ 8] = int_to_base64 (((ptr[3]) >> 12) & 0x3f); + tmp_buf[ 9] = int_to_base64 (((ptr[3]) >> 6) & 0x3f); + tmp_buf[10] = int_to_base64 (((ptr[3]) >> 0) & 0x3f); + tmp_buf[11] = int_to_base64 (((ptr[2]) >> 12) & 0x3f); + tmp_buf[12] = sig[2]; + tmp_buf[13] = int_to_base64 (((ptr[2]) >> 6) & 0x3f); + tmp_buf[14] = int_to_base64 (((ptr[2]) >> 0) & 0x3f); + tmp_buf[15] = int_to_base64 (((ptr[5]) >> 12) & 0x3f); + tmp_buf[16] = int_to_base64 (((ptr[5]) >> 6) & 0x3f); + tmp_buf[17] = sig[3]; + tmp_buf[18] = int_to_base64 (((ptr[5]) >> 0) & 0x3f); + tmp_buf[19] = int_to_base64 (((ptr[4]) >> 12) & 0x3f); + tmp_buf[20] = int_to_base64 (((ptr[4]) >> 6) & 0x3f); + tmp_buf[21] = int_to_base64 (((ptr[4]) >> 0) & 0x3f); + tmp_buf[22] = int_to_base64 (((ptr[7]) >> 12) & 0x3f); + tmp_buf[23] = sig[4]; + tmp_buf[24] = int_to_base64 (((ptr[7]) >> 6) & 0x3f); + tmp_buf[25] = int_to_base64 (((ptr[7]) >> 0) & 0x3f); + tmp_buf[26] = int_to_base64 (((ptr[6]) >> 12) & 0x3f); + tmp_buf[27] = int_to_base64 (((ptr[6]) >> 6) & 0x3f); + tmp_buf[28] = int_to_base64 (((ptr[6]) >> 0) & 0x3f); + tmp_buf[29] = sig[5]; + + snprintf (out_buf, len-1, "%s:%s", + tmp_buf, + username); + } + else if (hash_mode == 23) + { + // do not show the \nskyper\n part in output + + char *salt_buf_ptr = (char *) salt.salt_buf; + + salt_buf_ptr[salt.salt_len - 8] = 0; + + snprintf (out_buf, len-1, "%08x%08x%08x%08x:%s", + digest_buf[0], + digest_buf[1], + digest_buf[2], + digest_buf[3], + salt_buf_ptr); + } + else if (hash_mode == 101) + { + // the encoder is a bit to intelligent, it expects the input data in the wrong BOM + + digest_buf[0] = byte_swap_32 (digest_buf[0]); + digest_buf[1] = byte_swap_32 (digest_buf[1]); + digest_buf[2] = byte_swap_32 (digest_buf[2]); + digest_buf[3] = byte_swap_32 (digest_buf[3]); + digest_buf[4] = byte_swap_32 (digest_buf[4]); + + memcpy (tmp_buf, digest_buf, 20); + + base64_encode (int_to_base64, tmp_buf, 20, ptr_plain); + + snprintf (out_buf, len-1, "{SHA}%s", ptr_plain); + } + else if (hash_mode == 111) + { + // the encoder is a bit to intelligent, it expects the input data in the wrong BOM + + digest_buf[0] = byte_swap_32 (digest_buf[0]); + digest_buf[1] = byte_swap_32 (digest_buf[1]); + digest_buf[2] = byte_swap_32 (digest_buf[2]); + digest_buf[3] = byte_swap_32 (digest_buf[3]); + digest_buf[4] = byte_swap_32 (digest_buf[4]); + + memcpy (tmp_buf, digest_buf, 20); + memcpy (tmp_buf + 20, salt.salt_buf, salt.salt_len); + + base64_encode (int_to_base64, tmp_buf, 20 + salt.salt_len, ptr_plain); + + snprintf (out_buf, len-1, "{SSHA}%s", ptr_plain); + } + else if (hash_mode == 122) + { + snprintf (out_buf, len-1, "%s%08x%08x%08x%08x%08x", + (unsigned char *) salt.salt_buf, + digest_buf[0], + digest_buf[1], + digest_buf[2], + digest_buf[3], + digest_buf[4]); + } + else if (hash_mode == 124) + { + snprintf (out_buf, len-1, "sha1$%s$%08x%08x%08x%08x%08x", + (unsigned char *) salt.salt_buf, + digest_buf[0], + digest_buf[1], + digest_buf[2], + digest_buf[3], + digest_buf[4]); + } + else if (hash_mode == 131) + { + snprintf (out_buf, len-1, "0x0100%s%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x", + (unsigned char *) salt.salt_buf, + 0, 0, 0, 0, 0, + digest_buf[0], + digest_buf[1], + digest_buf[2], + digest_buf[3], + digest_buf[4]); + } + else if (hash_mode == 132) + { + snprintf (out_buf, len-1, "0x0100%s%08x%08x%08x%08x%08x", + (unsigned char *) salt.salt_buf, + digest_buf[0], + digest_buf[1], + digest_buf[2], + digest_buf[3], + digest_buf[4]); + } + else if (hash_mode == 133) + { + // the encoder is a bit to intelligent, it expects the input data in the wrong BOM + + digest_buf[0] = byte_swap_32 (digest_buf[0]); + digest_buf[1] = byte_swap_32 (digest_buf[1]); + digest_buf[2] = byte_swap_32 (digest_buf[2]); + digest_buf[3] = byte_swap_32 (digest_buf[3]); + digest_buf[4] = byte_swap_32 (digest_buf[4]); + + memcpy (tmp_buf, digest_buf, 20); + + base64_encode (int_to_base64, tmp_buf, 20, ptr_plain); + + snprintf (out_buf, len-1, "%s", ptr_plain); + } + else if (hash_mode == 141) + { + memcpy (tmp_buf, salt.salt_buf, salt.salt_len); + + base64_encode (int_to_base64, tmp_buf, salt.salt_len, ptr_salt); + + memset (tmp_buf, 0, sizeof (tmp_buf)); + + // the encoder is a bit to intelligent, it expects the input data in the wrong BOM + + digest_buf[0] = byte_swap_32 (digest_buf[0]); + digest_buf[1] = byte_swap_32 (digest_buf[1]); + digest_buf[2] = byte_swap_32 (digest_buf[2]); + digest_buf[3] = byte_swap_32 (digest_buf[3]); + digest_buf[4] = byte_swap_32 (digest_buf[4]); + + memcpy (tmp_buf, digest_buf, 20); + + base64_encode (int_to_base64, tmp_buf, 20, ptr_plain); + + ptr_plain[27] = 0; + + snprintf (out_buf, len-1, "%s%s*%s", SIGNATURE_EPISERVER, ptr_salt, ptr_plain); + } + else if (hash_mode == 400) + { + // the encoder is a bit to intelligent, it expects the input data in the wrong BOM + + digest_buf[0] = byte_swap_32 (digest_buf[0]); + digest_buf[1] = byte_swap_32 (digest_buf[1]); + digest_buf[2] = byte_swap_32 (digest_buf[2]); + digest_buf[3] = byte_swap_32 (digest_buf[3]); + + phpass_encode ((unsigned char *) digest_buf, (unsigned char *) ptr_plain); + + snprintf (out_buf, len-1, "%s%s%s", (char *) salt.salt_sign, (char *) salt.salt_buf, (char *) ptr_plain); + } + else if (hash_mode == 500) + { + // the encoder is a bit to intelligent, it expects the input data in the wrong BOM + + digest_buf[0] = byte_swap_32 (digest_buf[0]); + digest_buf[1] = byte_swap_32 (digest_buf[1]); + digest_buf[2] = byte_swap_32 (digest_buf[2]); + digest_buf[3] = byte_swap_32 (digest_buf[3]); + + md5crypt_encode ((unsigned char *) digest_buf, (unsigned char *) ptr_plain); + + if (salt.salt_iter == ROUNDS_MD5CRYPT) + { + snprintf (out_buf, len-1, "$1$%s$%s", (char *) salt.salt_buf, (char *) ptr_plain); + } + else + { + snprintf (out_buf, len-1, "$1$rounds=%i$%s$%s", salt.salt_iter, (char *) salt.salt_buf, (char *) ptr_plain); + } + } + else if (hash_mode == 501) + { + uint digest_idx = salt.digests_offset + digest_pos; + + hashinfo_t **hashinfo_ptr = data.hash_info; + char *hash_buf = hashinfo_ptr[digest_idx]->orighash; + + snprintf (out_buf, len-1, "%s", hash_buf); + } + else if (hash_mode == 1421) + { + uint8_t *salt_ptr = (uint8_t *) salt.salt_buf; + + snprintf (out_buf, len-1, "%c%c%c%c%c%c%08x%08x%08x%08x%08x%08x%08x%08x", + salt_ptr[0], + salt_ptr[1], + salt_ptr[2], + salt_ptr[3], + salt_ptr[4], + salt_ptr[5], + digest_buf[0], + digest_buf[1], + digest_buf[2], + digest_buf[3], + digest_buf[4], + digest_buf[5], + digest_buf[6], + digest_buf[7]); + } + else if (hash_mode == 1441) + { + memcpy (tmp_buf, salt.salt_buf, salt.salt_len); + + base64_encode (int_to_base64, tmp_buf, salt.salt_len, ptr_salt); + + memset (tmp_buf, 0, sizeof (tmp_buf)); + + // the encoder is a bit to intelligent, it expects the input data in the wrong BOM + + digest_buf[0] = byte_swap_32 (digest_buf[0]); + digest_buf[1] = byte_swap_32 (digest_buf[1]); + digest_buf[2] = byte_swap_32 (digest_buf[2]); + digest_buf[3] = byte_swap_32 (digest_buf[3]); + digest_buf[4] = byte_swap_32 (digest_buf[4]); + digest_buf[5] = byte_swap_32 (digest_buf[5]); + digest_buf[6] = byte_swap_32 (digest_buf[6]); + digest_buf[7] = byte_swap_32 (digest_buf[7]); + + memcpy (tmp_buf, digest_buf, 32); + + base64_encode (int_to_base64, tmp_buf, 32, ptr_plain); + + ptr_plain[43] = 0; + + snprintf (out_buf, len-1, "%s%s*%s", SIGNATURE_EPISERVER4, ptr_salt, ptr_plain); + } + else if (hash_mode == 1500) + { + out_buf[0] = salt.salt_sign[0] & 0xff; + out_buf[1] = salt.salt_sign[1] & 0xff; + //original method, but changed because of this ticket: https://hashcat.net/trac/ticket/269 + //out_buf[0] = int_to_itoa64 ((salt.salt_buf[0] >> 0) & 0x3f); + //out_buf[1] = int_to_itoa64 ((salt.salt_buf[0] >> 6) & 0x3f); + + memset (tmp_buf, 0, sizeof (tmp_buf)); + + // the encoder is a bit to intelligent, it expects the input data in the wrong BOM + + digest_buf[0] = byte_swap_32 (digest_buf[0]); + digest_buf[1] = byte_swap_32 (digest_buf[1]); + + memcpy (tmp_buf, digest_buf, 8); + + base64_encode (int_to_itoa64, tmp_buf, 8, ptr_plain); + + snprintf (out_buf + 2, len-1-2, "%s", ptr_plain); + + out_buf[13] = 0; + } + else if (hash_mode == 1600) + { + // the encoder is a bit to intelligent, it expects the input data in the wrong BOM + + digest_buf[0] = byte_swap_32 (digest_buf[0]); + digest_buf[1] = byte_swap_32 (digest_buf[1]); + digest_buf[2] = byte_swap_32 (digest_buf[2]); + digest_buf[3] = byte_swap_32 (digest_buf[3]); + + md5crypt_encode ((unsigned char *) digest_buf, (unsigned char *) ptr_plain); + + if (salt.salt_iter == ROUNDS_MD5CRYPT) + { + snprintf (out_buf, len-1, "$apr1$%s$%s", (char *) salt.salt_buf, (char *) ptr_plain); + } + else + { + snprintf (out_buf, len-1, "$apr1$rounds=%i$%s$%s", salt.salt_iter, (char *) salt.salt_buf, (char *) ptr_plain); + } + } + else if (hash_mode == 1711) + { + // the encoder is a bit too intelligent, it expects the input data in the wrong BOM + + digest_buf64[0] = byte_swap_64 (digest_buf64[0]); + digest_buf64[1] = byte_swap_64 (digest_buf64[1]); + digest_buf64[2] = byte_swap_64 (digest_buf64[2]); + digest_buf64[3] = byte_swap_64 (digest_buf64[3]); + digest_buf64[4] = byte_swap_64 (digest_buf64[4]); + digest_buf64[5] = byte_swap_64 (digest_buf64[5]); + digest_buf64[6] = byte_swap_64 (digest_buf64[6]); + digest_buf64[7] = byte_swap_64 (digest_buf64[7]); + + memcpy (tmp_buf, digest_buf, 64); + memcpy (tmp_buf + 64, salt.salt_buf, salt.salt_len); + + base64_encode (int_to_base64, tmp_buf, 64 + salt.salt_len, ptr_plain); + + snprintf (out_buf, len-1, "%s%s", SIGNATURE_SHA512B64S, ptr_plain); + } + else if (hash_mode == 1722) + { + uint *ptr = digest_buf; + + snprintf (out_buf, len-1, "%s%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x", + (unsigned char *) salt.salt_buf, + ptr[ 1], ptr[ 0], + ptr[ 3], ptr[ 2], + ptr[ 5], ptr[ 4], + ptr[ 7], ptr[ 6], + ptr[ 9], ptr[ 8], + ptr[11], ptr[10], + ptr[13], ptr[12], + ptr[15], ptr[14]); + } + else if (hash_mode == 1731) + { + uint *ptr = digest_buf; + + snprintf (out_buf, len-1, "0x0200%s%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x", + (unsigned char *) salt.salt_buf, + ptr[ 1], ptr[ 0], + ptr[ 3], ptr[ 2], + ptr[ 5], ptr[ 4], + ptr[ 7], ptr[ 6], + ptr[ 9], ptr[ 8], + ptr[11], ptr[10], + ptr[13], ptr[12], + ptr[15], ptr[14]); + } + else if (hash_mode == 1800) + { + // temp workaround + + digest_buf64[0] = byte_swap_64 (digest_buf64[0]); + digest_buf64[1] = byte_swap_64 (digest_buf64[1]); + digest_buf64[2] = byte_swap_64 (digest_buf64[2]); + digest_buf64[3] = byte_swap_64 (digest_buf64[3]); + digest_buf64[4] = byte_swap_64 (digest_buf64[4]); + digest_buf64[5] = byte_swap_64 (digest_buf64[5]); + digest_buf64[6] = byte_swap_64 (digest_buf64[6]); + digest_buf64[7] = byte_swap_64 (digest_buf64[7]); + + sha512crypt_encode ((unsigned char *) digest_buf64, (unsigned char *) ptr_plain); + + if (salt.salt_iter == ROUNDS_SHA512CRYPT) + { + snprintf (out_buf, len-1, "$6$%s$%s", (char *) salt.salt_buf, (char *) ptr_plain); + } + else + { + snprintf (out_buf, len-1, "$6$rounds=%i$%s$%s", salt.salt_iter, (char *) salt.salt_buf, (char *) ptr_plain); + } + } + else if (hash_mode == 2100) + { + uint pos = 0; + + snprintf (out_buf + pos, len-1, "%s%i#", + SIGNATURE_DCC2, + salt.salt_iter + 1); + + uint signature_len = strlen (out_buf); + + pos += signature_len; + len -= signature_len; + + char *salt_ptr = (char *) salt.salt_buf; + + for (uint i = 0; i < salt.salt_len; i++, pos++, len--) snprintf (out_buf + pos, len-1, "%c", salt_ptr[i]); + + snprintf (out_buf + pos, len-1, "#%08x%08x%08x%08x", + byte_swap_32 (digest_buf[0]), + byte_swap_32 (digest_buf[1]), + byte_swap_32 (digest_buf[2]), + byte_swap_32 (digest_buf[3])); + } + else if ((hash_mode == 2400) || (hash_mode == 2410)) + { + memcpy (tmp_buf, digest_buf, 16); + + // the encoder is a bit too intelligent, it expects the input data in the wrong BOM + + digest_buf[0] = byte_swap_32 (digest_buf[0]); + digest_buf[1] = byte_swap_32 (digest_buf[1]); + digest_buf[2] = byte_swap_32 (digest_buf[2]); + digest_buf[3] = byte_swap_32 (digest_buf[3]); + + out_buf[ 0] = int_to_itoa64 ((digest_buf[0] >> 0) & 0x3f); + out_buf[ 1] = int_to_itoa64 ((digest_buf[0] >> 6) & 0x3f); + out_buf[ 2] = int_to_itoa64 ((digest_buf[0] >> 12) & 0x3f); + out_buf[ 3] = int_to_itoa64 ((digest_buf[0] >> 18) & 0x3f); + + out_buf[ 4] = int_to_itoa64 ((digest_buf[1] >> 0) & 0x3f); + out_buf[ 5] = int_to_itoa64 ((digest_buf[1] >> 6) & 0x3f); + out_buf[ 6] = int_to_itoa64 ((digest_buf[1] >> 12) & 0x3f); + out_buf[ 7] = int_to_itoa64 ((digest_buf[1] >> 18) & 0x3f); + + out_buf[ 8] = int_to_itoa64 ((digest_buf[2] >> 0) & 0x3f); + out_buf[ 9] = int_to_itoa64 ((digest_buf[2] >> 6) & 0x3f); + out_buf[10] = int_to_itoa64 ((digest_buf[2] >> 12) & 0x3f); + out_buf[11] = int_to_itoa64 ((digest_buf[2] >> 18) & 0x3f); + + out_buf[12] = int_to_itoa64 ((digest_buf[3] >> 0) & 0x3f); + out_buf[13] = int_to_itoa64 ((digest_buf[3] >> 6) & 0x3f); + out_buf[14] = int_to_itoa64 ((digest_buf[3] >> 12) & 0x3f); + out_buf[15] = int_to_itoa64 ((digest_buf[3] >> 18) & 0x3f); + + out_buf[16] = 0; + } + else if (hash_mode == 2500) + { + wpa_t *wpas = (wpa_t *) data.esalts_buf; + + wpa_t *wpa = &wpas[salt_pos]; + + uint pke[25]; + + char *pke_ptr = (char *) pke; + + for (uint i = 0; i < 25; i++) + { + pke[i] = byte_swap_32 (wpa->pke[i]); + } + + unsigned char mac1[6]; + unsigned char mac2[6]; + + memcpy (mac1, pke_ptr + 23, 6); + memcpy (mac2, pke_ptr + 29, 6); + + snprintf (out_buf, len-1, "%s:%02x%02x%02x%02x%02x%02x:%02x%02x%02x%02x%02x%02x", + (char *) salt.salt_buf, + mac1[0], + mac1[1], + mac1[2], + mac1[3], + mac1[4], + mac1[5], + mac2[0], + mac2[1], + mac2[2], + mac2[3], + mac2[4], + mac2[5]); + } + else if (hash_mode == 4400) + { + snprintf (out_buf, len-1, "%08x%08x%08x%08x", + byte_swap_32 (digest_buf[0]), + byte_swap_32 (digest_buf[1]), + byte_swap_32 (digest_buf[2]), + byte_swap_32 (digest_buf[3])); + } + else if (hash_mode == 4700) + { + snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x", + byte_swap_32 (digest_buf[0]), + byte_swap_32 (digest_buf[1]), + byte_swap_32 (digest_buf[2]), + byte_swap_32 (digest_buf[3]), + byte_swap_32 (digest_buf[4])); + } + else if (hash_mode == 4800) + { + uint8_t chap_id_byte = (uint8_t) salt.salt_buf[4]; + + snprintf (out_buf, len-1, "%08x%08x%08x%08x:%08x%08x%08x%08x:%02x", + digest_buf[0], + digest_buf[1], + digest_buf[2], + digest_buf[3], + byte_swap_32 (salt.salt_buf[0]), + byte_swap_32 (salt.salt_buf[1]), + byte_swap_32 (salt.salt_buf[2]), + byte_swap_32 (salt.salt_buf[3]), + chap_id_byte); + } + else if (hash_mode == 4900) + { + snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x", + byte_swap_32 (digest_buf[0]), + byte_swap_32 (digest_buf[1]), + byte_swap_32 (digest_buf[2]), + byte_swap_32 (digest_buf[3]), + byte_swap_32 (digest_buf[4])); + } + else if (hash_mode == 5100) + { + snprintf (out_buf, len-1, "%08x%08x", + digest_buf[0], + digest_buf[1]); + } + else if (hash_mode == 5200) + { + snprintf (out_buf, len-1, "%s", hashfile); + } + else if (hash_mode == 5300) + { + ikepsk_t *ikepsks = (ikepsk_t *) data.esalts_buf; + + ikepsk_t *ikepsk = &ikepsks[salt_pos]; + + int buf_len = len -1; + + // msg_buf + + uint ikepsk_msg_len = ikepsk->msg_len / 4; + + for (uint i = 0; i < ikepsk_msg_len; i++) + { + if ((i == 32) || (i == 64) || (i == 66) || (i == 68) || (i == 108)) + { + snprintf (out_buf, buf_len, ":"); + + buf_len--; + out_buf++; + } + + snprintf (out_buf, buf_len, "%08x", byte_swap_32 (ikepsk->msg_buf[i])); + + buf_len -= 8; + out_buf += 8; + } + + // nr_buf + + uint ikepsk_nr_len = ikepsk->nr_len / 4; + + for (uint i = 0; i < ikepsk_nr_len; i++) + { + if ((i == 0) || (i == 5)) + { + snprintf (out_buf, buf_len, ":"); + + buf_len--; + out_buf++; + } + + snprintf (out_buf, buf_len, "%08x", byte_swap_32 (ikepsk->nr_buf[i])); + + buf_len -= 8; + out_buf += 8; + } + + // digest_buf + + for (uint i = 0; i < 4; i++) + { + if (i == 0) + { + snprintf (out_buf, buf_len, ":"); + + buf_len--; + out_buf++; + } + + snprintf (out_buf, buf_len, "%08x", digest_buf[i]); + + buf_len -= 8; + out_buf += 8; + } + } + else if (hash_mode == 5400) + { + ikepsk_t *ikepsks = (ikepsk_t *) data.esalts_buf; + + ikepsk_t *ikepsk = &ikepsks[salt_pos]; + + int buf_len = len -1; + + // msg_buf + + uint ikepsk_msg_len = ikepsk->msg_len / 4; + + for (uint i = 0; i < ikepsk_msg_len; i++) + { + if ((i == 32) || (i == 64) || (i == 66) || (i == 68) || (i == 108)) + { + snprintf (out_buf, buf_len, ":"); + + buf_len--; + out_buf++; + } + + snprintf (out_buf, buf_len, "%08x", byte_swap_32 (ikepsk->msg_buf[i])); + + buf_len -= 8; + out_buf += 8; + } + + // nr_buf + + uint ikepsk_nr_len = ikepsk->nr_len / 4; + + for (uint i = 0; i < ikepsk_nr_len; i++) + { + if ((i == 0) || (i == 5)) + { + snprintf (out_buf, buf_len, ":"); + + buf_len--; + out_buf++; + } + + snprintf (out_buf, buf_len, "%08x", byte_swap_32 (ikepsk->nr_buf[i])); + + buf_len -= 8; + out_buf += 8; + } + + // digest_buf + + for (uint i = 0; i < 5; i++) + { + if (i == 0) + { + snprintf (out_buf, buf_len, ":"); + + buf_len--; + out_buf++; + } + + snprintf (out_buf, buf_len, "%08x", digest_buf[i]); + + buf_len -= 8; + out_buf += 8; + } + } + else if (hash_mode == 5500) + { + netntlm_t *netntlms = (netntlm_t *) data.esalts_buf; + + netntlm_t *netntlm = &netntlms[salt_pos]; + + char user_buf[64]; + char domain_buf[64]; + char srvchall_buf[1024]; + char clichall_buf[1024]; + + memset (user_buf, 0, sizeof (user_buf)); + memset (domain_buf, 0, sizeof (domain_buf)); + memset (srvchall_buf, 0, sizeof (srvchall_buf)); + memset (clichall_buf, 0, sizeof (clichall_buf)); + + for (uint i = 0, j = 0; j < netntlm->user_len; i += 1, j += 2) + { + char *ptr = (char *) netntlm->userdomain_buf; + + user_buf[i] = ptr[j]; + } + + for (uint i = 0, j = 0; j < netntlm->domain_len; i += 1, j += 2) + { + char *ptr = (char *) netntlm->userdomain_buf; + + domain_buf[i] = ptr[netntlm->user_len + j]; + } + + for (uint i = 0, j = 0; i < netntlm->srvchall_len; i += 1, j += 2) + { + char *ptr = (char *) netntlm->chall_buf; + + sprintf (srvchall_buf + j, "%02x", (uint8_t) ptr[i]); + } + + for (uint i = 0, j = 0; i < netntlm->clichall_len; i += 1, j += 2) + { + char *ptr = (char *) netntlm->chall_buf; + + sprintf (clichall_buf + j, "%02x", (uint8_t) ptr[netntlm->srvchall_len + i]); + } + + snprintf (out_buf, len-1, "%s::%s:%s:%08x%08x%08x%08x%08x%08x:%s", + user_buf, + domain_buf, + srvchall_buf, + digest_buf[0], + digest_buf[1], + digest_buf[2], + digest_buf[3], + byte_swap_32 (salt.salt_buf_pc[0]), + byte_swap_32 (salt.salt_buf_pc[1]), + clichall_buf); + } + else if (hash_mode == 5600) + { + netntlm_t *netntlms = (netntlm_t *) data.esalts_buf; + + netntlm_t *netntlm = &netntlms[salt_pos]; + + char user_buf[64]; + char domain_buf[64]; + char srvchall_buf[1024]; + char clichall_buf[1024]; + + memset (user_buf, 0, sizeof (user_buf)); + memset (domain_buf, 0, sizeof (domain_buf)); + memset (srvchall_buf, 0, sizeof (srvchall_buf)); + memset (clichall_buf, 0, sizeof (clichall_buf)); + + for (uint i = 0, j = 0; j < netntlm->user_len; i += 1, j += 2) + { + char *ptr = (char *) netntlm->userdomain_buf; + + user_buf[i] = ptr[j]; + } + + for (uint i = 0, j = 0; j < netntlm->domain_len; i += 1, j += 2) + { + char *ptr = (char *) netntlm->userdomain_buf; + + domain_buf[i] = ptr[netntlm->user_len + j]; + } + + for (uint i = 0, j = 0; i < netntlm->srvchall_len; i += 1, j += 2) + { + char *ptr = (char *) netntlm->chall_buf; + + sprintf (srvchall_buf + j, "%02x", (uint8_t) ptr[i]); + } + + for (uint i = 0, j = 0; i < netntlm->clichall_len; i += 1, j += 2) + { + char *ptr = (char *) netntlm->chall_buf; + + sprintf (clichall_buf + j, "%02x", (uint8_t) ptr[netntlm->srvchall_len + i]); + } + + snprintf (out_buf, len-1, "%s::%s:%s:%08x%08x%08x%08x:%s", + user_buf, + domain_buf, + srvchall_buf, + digest_buf[0], + digest_buf[1], + digest_buf[2], + digest_buf[3], + clichall_buf); + } + else if (hash_mode == 5700) + { + // the encoder is a bit too intelligent, it expects the input data in the wrong BOM + + digest_buf[0] = byte_swap_32 (digest_buf[0]); + digest_buf[1] = byte_swap_32 (digest_buf[1]); + digest_buf[2] = byte_swap_32 (digest_buf[2]); + digest_buf[3] = byte_swap_32 (digest_buf[3]); + digest_buf[4] = byte_swap_32 (digest_buf[4]); + digest_buf[5] = byte_swap_32 (digest_buf[5]); + digest_buf[6] = byte_swap_32 (digest_buf[6]); + digest_buf[7] = byte_swap_32 (digest_buf[7]); + + memcpy (tmp_buf, digest_buf, 32); + + base64_encode (int_to_itoa64, tmp_buf, 32, ptr_plain); + + ptr_plain[43] = 0; + + snprintf (out_buf, len-1, "%s", ptr_plain); + } + else if (hash_mode == 5800) + { + digest_buf[0] = byte_swap_32 (digest_buf[0]); + digest_buf[1] = byte_swap_32 (digest_buf[1]); + digest_buf[2] = byte_swap_32 (digest_buf[2]); + digest_buf[3] = byte_swap_32 (digest_buf[3]); + digest_buf[4] = byte_swap_32 (digest_buf[4]); + + snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x", + digest_buf[0], + digest_buf[1], + digest_buf[2], + digest_buf[3], + digest_buf[4]); + } + else if ((hash_mode >= 6200) && (hash_mode <= 6299)) + { + snprintf (out_buf, len-1, "%s", hashfile); + } + else if (hash_mode == 6300) + { + // the encoder is a bit to intelligent, it expects the input data in the wrong BOM + + digest_buf[0] = byte_swap_32 (digest_buf[0]); + digest_buf[1] = byte_swap_32 (digest_buf[1]); + digest_buf[2] = byte_swap_32 (digest_buf[2]); + digest_buf[3] = byte_swap_32 (digest_buf[3]); + + md5crypt_encode ((unsigned char *) digest_buf, (unsigned char *) ptr_plain); + + snprintf (out_buf, len-1, "{smd5}%s$%s", (char *) salt.salt_buf, (char *) ptr_plain); + } + else if (hash_mode == 6400) + { + sha256aix_encode ((unsigned char *) digest_buf, (unsigned char *) ptr_plain); + + snprintf (out_buf, len-1, "{ssha256}%02d$%s$%s", salt.salt_sign[0], (char *) salt.salt_buf, (char *) ptr_plain); + } + else if (hash_mode == 6500) + { + sha512aix_encode ((unsigned char *) digest_buf64, (unsigned char *) ptr_plain); + + snprintf (out_buf, len-1, "{ssha512}%02d$%s$%s", salt.salt_sign[0], (char *) salt.salt_buf, (char *) ptr_plain); + } + else if (hash_mode == 6600) + { + agilekey_t *agilekeys = (agilekey_t *) data.esalts_buf; + + agilekey_t *agilekey = &agilekeys[salt_pos]; + + salt.salt_buf[0] = byte_swap_32 (salt.salt_buf[0]); + salt.salt_buf[1] = byte_swap_32 (salt.salt_buf[1]); + + uint buf_len = len - 1; + + uint off = snprintf (out_buf, buf_len, "%d:%08x%08x:", salt.salt_iter + 1, salt.salt_buf[0], salt.salt_buf[1]); + buf_len -= 22; + + for (uint i = 0, j = off; i < 1040; i++, j += 2) + { + snprintf (out_buf + j, buf_len, "%02x", agilekey->cipher[i]); + + buf_len -= 2; + } + } + else if (hash_mode == 6700) + { + sha1aix_encode ((unsigned char *) digest_buf, (unsigned char *) ptr_plain); + + snprintf (out_buf, len-1, "{ssha1}%02d$%s$%s", salt.salt_sign[0], (char *) salt.salt_buf, (char *) ptr_plain); + } + else if (hash_mode == 6800) + { + snprintf (out_buf, len-1, "%s", (char *) salt.salt_buf); + } + else if (hash_mode == 7100) + { + uint *ptr = digest_buf; + + pbkdf2_sha512_t *pbkdf2_sha512s = (pbkdf2_sha512_t *) data.esalts_buf; + + pbkdf2_sha512_t *pbkdf2_sha512 = &pbkdf2_sha512s[salt_pos]; + + uint esalt[16]; + + esalt[0] = byte_swap_32 (pbkdf2_sha512->salt_buf[0]); + esalt[1] = byte_swap_32 (pbkdf2_sha512->salt_buf[1]); + esalt[2] = byte_swap_32 (pbkdf2_sha512->salt_buf[2]); + esalt[3] = byte_swap_32 (pbkdf2_sha512->salt_buf[3]); + esalt[4] = byte_swap_32 (pbkdf2_sha512->salt_buf[4]); + esalt[5] = byte_swap_32 (pbkdf2_sha512->salt_buf[5]); + esalt[6] = byte_swap_32 (pbkdf2_sha512->salt_buf[6]); + esalt[7] = byte_swap_32 (pbkdf2_sha512->salt_buf[7]); + + snprintf (out_buf, len-1, "%s%i$%08x%08x%08x%08x%08x%08x%08x%08x$%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x", + SIGNATURE_SHA512OSX, + salt.salt_iter + 1, + esalt[ 0], esalt[ 1], + esalt[ 2], esalt[ 3], + esalt[ 4], esalt[ 5], + esalt[ 6], esalt[ 7], + ptr [ 1], ptr [ 0], + ptr [ 3], ptr [ 2], + ptr [ 5], ptr [ 4], + ptr [ 7], ptr [ 6], + ptr [ 9], ptr [ 8], + ptr [11], ptr [10], + ptr [13], ptr [12], + ptr [15], ptr [14]); + } + else if (hash_mode == 7200) + { + uint *ptr = digest_buf; + + pbkdf2_sha512_t *pbkdf2_sha512s = (pbkdf2_sha512_t *) data.esalts_buf; + + pbkdf2_sha512_t *pbkdf2_sha512 = &pbkdf2_sha512s[salt_pos]; + + uint len_used = 0; + + snprintf (out_buf + len_used, len - len_used - 1, "%s%i.", SIGNATURE_SHA512GRUB, salt.salt_iter + 1); + + len_used = strlen (out_buf); + + unsigned char *salt_buf_ptr = (unsigned char *) pbkdf2_sha512->salt_buf; + + for (uint i = 0; i < salt.salt_len; i++, len_used += 2) + { + snprintf (out_buf + len_used, len - len_used - 1, "%02x", salt_buf_ptr[i]); + } + + snprintf (out_buf + len_used, len - len_used - 1, ".%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x", + ptr [ 1], ptr [ 0], + ptr [ 3], ptr [ 2], + ptr [ 5], ptr [ 4], + ptr [ 7], ptr [ 6], + ptr [ 9], ptr [ 8], + ptr [11], ptr [10], + ptr [13], ptr [12], + ptr [15], ptr [14]); + } + else if (hash_mode == 7300) + { + rakp_t *rakps = (rakp_t *) data.esalts_buf; + + rakp_t *rakp = &rakps[salt_pos]; + + for (uint i = 0, j = 0; (i * 4) < rakp->salt_len; i += 1, j += 8) + { + sprintf (out_buf + j, "%08x", rakp->salt_buf[i]); + } + + snprintf (out_buf + rakp->salt_len * 2, len - 1, ":%08x%08x%08x%08x%08x", + digest_buf[0], + digest_buf[1], + digest_buf[2], + digest_buf[3], + digest_buf[4]); + } + else if (hash_mode == 7400) + { + // the encoder is a bit too intelligent, it expects the input data in the wrong BOM + + digest_buf[0] = byte_swap_32 (digest_buf[0]); + digest_buf[1] = byte_swap_32 (digest_buf[1]); + digest_buf[2] = byte_swap_32 (digest_buf[2]); + digest_buf[3] = byte_swap_32 (digest_buf[3]); + digest_buf[4] = byte_swap_32 (digest_buf[4]); + digest_buf[5] = byte_swap_32 (digest_buf[5]); + digest_buf[6] = byte_swap_32 (digest_buf[6]); + digest_buf[7] = byte_swap_32 (digest_buf[7]); + + sha256crypt_encode ((unsigned char *) digest_buf, (unsigned char *) ptr_plain); + + if (salt.salt_iter == ROUNDS_SHA256CRYPT) + { + snprintf (out_buf, len-1, "$5$%s$%s", (char *) salt.salt_buf, (char *) ptr_plain); + } + else + { + snprintf (out_buf, len-1, "$5$rounds=%i$%s$%s", salt.salt_iter, (char *) salt.salt_buf, (char *) ptr_plain); + } + } + else if (hash_mode == 7500) + { + krb5pa_t *krb5pas = (krb5pa_t *) data.esalts_buf; + + krb5pa_t *krb5pa = &krb5pas[salt_pos]; + + uint8_t *ptr_timestamp = (uint8_t *) krb5pa->timestamp; + uint8_t *ptr_checksum = (uint8_t *) krb5pa->checksum; + + char data[128]; + + char *ptr_data = data; + + for (uint i = 0; i < 36; i++, ptr_data += 2) + { + sprintf (ptr_data, "%02x", ptr_timestamp[i]); + } + + for (uint i = 0; i < 16; i++, ptr_data += 2) + { + sprintf (ptr_data, "%02x", ptr_checksum[i]); + } + + *ptr_data = 0; + + snprintf (out_buf, len-1, "%s$%s$%s$%s$%s", + SIGNATURE_KRB5PA, + (char *) krb5pa->user, + (char *) krb5pa->realm, + (char *) krb5pa->salt, + data); + } + else if (hash_mode == 7700) + { + snprintf (out_buf, len-1, "%s$%08X%08X", + (char *) salt.salt_buf, + digest_buf[0], + digest_buf[1]); + } + else if (hash_mode == 7800) + { + snprintf (out_buf, len-1, "%s$%08X%08X%08X%08X%08X", + (char *) salt.salt_buf, + digest_buf[0], + digest_buf[1], + digest_buf[2], + digest_buf[3], + digest_buf[4]); + } + else if (hash_mode == 7900) + { + drupal7_encode ((unsigned char *) digest_buf64, (unsigned char *) ptr_plain); + + // ugly hack start + + char *tmp = (char *) salt.salt_buf_pc; + + ptr_plain[42] = tmp[0]; + + // ugly hack end + + ptr_plain[43] = 0; + + snprintf (out_buf, len-1, "%s%s%s", (char *) salt.salt_sign, (char *) salt.salt_buf, (char *) ptr_plain); + } + else if (hash_mode == 8000) + { + snprintf (out_buf, len-1, "0xc007%s%08x%08x%08x%08x%08x%08x%08x%08x", + (unsigned char *) salt.salt_buf, + digest_buf[0], + digest_buf[1], + digest_buf[2], + digest_buf[3], + digest_buf[4], + digest_buf[5], + digest_buf[6], + digest_buf[7]); + } + else if (hash_mode == 8100) + { + salt.salt_buf[0] = byte_swap_32 (salt.salt_buf[0]); + salt.salt_buf[1] = byte_swap_32 (salt.salt_buf[1]); + + snprintf (out_buf, len-1, "1%s%08x%08x%08x%08x%08x", + (unsigned char *) salt.salt_buf, + digest_buf[0], + digest_buf[1], + digest_buf[2], + digest_buf[3], + digest_buf[4]); + } + else if (hash_mode == 8200) + { + cloudkey_t *cloudkeys = (cloudkey_t *) data.esalts_buf; + + cloudkey_t *cloudkey = &cloudkeys[salt_pos]; + + char data_buf[4096]; + + for (int i = 0, j = 0; i < 512; i += 1, j += 8) + { + sprintf (data_buf + j, "%08x", cloudkey->data_buf[i]); + } + + data_buf[cloudkey->data_len * 2] = 0; + + digest_buf[0] = byte_swap_32 (digest_buf[0]); + digest_buf[1] = byte_swap_32 (digest_buf[1]); + digest_buf[2] = byte_swap_32 (digest_buf[2]); + digest_buf[3] = byte_swap_32 (digest_buf[3]); + digest_buf[4] = byte_swap_32 (digest_buf[4]); + digest_buf[5] = byte_swap_32 (digest_buf[5]); + digest_buf[6] = byte_swap_32 (digest_buf[6]); + digest_buf[7] = byte_swap_32 (digest_buf[7]); + + salt.salt_buf[0] = byte_swap_32 (salt.salt_buf[0]); + salt.salt_buf[1] = byte_swap_32 (salt.salt_buf[1]); + salt.salt_buf[2] = byte_swap_32 (salt.salt_buf[2]); + salt.salt_buf[3] = byte_swap_32 (salt.salt_buf[3]); + + snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x%08x%08x%08x:%08x%08x%08x%08x:%u:%s", + digest_buf[0], + digest_buf[1], + digest_buf[2], + digest_buf[3], + digest_buf[4], + digest_buf[5], + digest_buf[6], + digest_buf[7], + salt.salt_buf[0], + salt.salt_buf[1], + salt.salt_buf[2], + salt.salt_buf[3], + salt.salt_iter + 1, + data_buf); + } + else if (hash_mode == 8300) + { + // todo + + char digest_buf_c[33]; + + base32_encode (int_to_itoa32, (char *) digest_buf, 32, digest_buf_c); + + digest_buf_c[32] = 0; + + // domain + + const uint salt_pc_len = salt.salt_buf_pc[7]; // what a hack + + char domain_buf_c[33]; + + memcpy (domain_buf_c, (char *) salt.salt_buf_pc, salt_pc_len); + + for (uint i = 0; i < salt_pc_len; i++) + { + const char next = domain_buf_c[i]; + + domain_buf_c[i] = '.'; + + i += next; + } + + domain_buf_c[salt_pc_len] = 0; + + // final + + snprintf (out_buf, len-1, "%s:%s:%s:%u", digest_buf_c, domain_buf_c, (char *) salt.salt_buf, salt.salt_iter); + } + else if (hash_mode == 8500) + { + snprintf (out_buf, len-1, "%s*%s*%08X%08X", SIGNATURE_RACF, (char *) salt.salt_buf, digest_buf[0], digest_buf[1]); + } + else if (hash_mode == 2612) + { + snprintf (out_buf, len-1, "%s%s$%08x%08x%08x%08x", + SIGNATURE_PHPS, + (char *) salt.salt_buf, + digest_buf[0], + digest_buf[1], + digest_buf[2], + digest_buf[3]); + } + else if (hash_mode == 3711) + { + char *salt_ptr = (char *) salt.salt_buf; + + salt_ptr[salt.salt_len - 1] = 0; + + snprintf (out_buf, len-1, "%s%s$%08x%08x%08x%08x", + SIGNATURE_MEDIAWIKI_B, + salt_ptr, + digest_buf[0], + digest_buf[1], + digest_buf[2], + digest_buf[3]); + } + else if (hash_mode == 8800) + { + androidfde_t *androidfdes = (androidfde_t *) data.esalts_buf; + + androidfde_t *androidfde = &androidfdes[salt_pos]; + + char tmp[3073]; + + for (uint i = 0, j = 0; i < 384; i += 1, j += 8) + { + sprintf (tmp + j, "%08x", androidfde->data[i]); + } + + tmp[3072] = 0; + + snprintf (out_buf, len-1, "%s16$%08x%08x%08x%08x$16$%08x%08x%08x%08x$%s", + SIGNATURE_ANDROIDFDE, + byte_swap_32 (salt.salt_buf[0]), + byte_swap_32 (salt.salt_buf[1]), + byte_swap_32 (salt.salt_buf[2]), + byte_swap_32 (salt.salt_buf[3]), + byte_swap_32 (digest_buf[0]), + byte_swap_32 (digest_buf[1]), + byte_swap_32 (digest_buf[2]), + byte_swap_32 (digest_buf[3]), + tmp); + } + else if (hash_mode == 8900) + { + uint N = salt.scrypt_N; + uint r = salt.scrypt_r; + uint p = salt.scrypt_p; + + char base64_salt[32]; + + memset (base64_salt, 0, 32); + + base64_encode (int_to_base64, (char *) salt.salt_buf, salt.salt_len, base64_salt + 0); + + memset (tmp_buf, 0, 46); + + digest_buf[0] = byte_swap_32 (digest_buf[0]); + digest_buf[1] = byte_swap_32 (digest_buf[1]); + digest_buf[2] = byte_swap_32 (digest_buf[2]); + digest_buf[3] = byte_swap_32 (digest_buf[3]); + digest_buf[4] = byte_swap_32 (digest_buf[4]); + digest_buf[5] = byte_swap_32 (digest_buf[5]); + digest_buf[6] = byte_swap_32 (digest_buf[6]); + digest_buf[7] = byte_swap_32 (digest_buf[7]); + digest_buf[8] = 0; // needed for base64_encode () + + base64_encode (int_to_base64, (char *) digest_buf, 32, tmp_buf + 0); + + snprintf (out_buf, len-1, "%s:%i:%i:%i:%s:%s", + SIGNATURE_SCRYPT, + N, + r, + p, + base64_salt, + tmp_buf); + } + else if (hash_mode == 9000) + { + snprintf (out_buf, len-1, "%s", hashfile); + } + else if (hash_mode == 9200) + { + // salt + + pbkdf2_sha256_t *pbkdf2_sha256s = (pbkdf2_sha256_t *) data.esalts_buf; + + pbkdf2_sha256_t *pbkdf2_sha256 = &pbkdf2_sha256s[salt_pos]; + + unsigned char *salt_buf_ptr = (unsigned char *) pbkdf2_sha256->salt_buf; + + // hash + + digest_buf[0] = byte_swap_32 (digest_buf[0]); + digest_buf[1] = byte_swap_32 (digest_buf[1]); + digest_buf[2] = byte_swap_32 (digest_buf[2]); + digest_buf[3] = byte_swap_32 (digest_buf[3]); + digest_buf[4] = byte_swap_32 (digest_buf[4]); + digest_buf[5] = byte_swap_32 (digest_buf[5]); + digest_buf[6] = byte_swap_32 (digest_buf[6]); + digest_buf[7] = byte_swap_32 (digest_buf[7]); + digest_buf[8] = 0; // needed for base64_encode () + + char tmp_buf[64]; + memset (tmp_buf, 0, sizeof (tmp_buf)); + + base64_encode (int_to_itoa64, (char *) digest_buf, 32, tmp_buf); + tmp_buf[43] = 0; // cut it here + + // output + + snprintf (out_buf, len-1, "%s%s$%s", SIGNATURE_CISCO8, salt_buf_ptr, tmp_buf); + } + else if (hash_mode == 9300) + { + digest_buf[0] = byte_swap_32 (digest_buf[0]); + digest_buf[1] = byte_swap_32 (digest_buf[1]); + digest_buf[2] = byte_swap_32 (digest_buf[2]); + digest_buf[3] = byte_swap_32 (digest_buf[3]); + digest_buf[4] = byte_swap_32 (digest_buf[4]); + digest_buf[5] = byte_swap_32 (digest_buf[5]); + digest_buf[6] = byte_swap_32 (digest_buf[6]); + digest_buf[7] = byte_swap_32 (digest_buf[7]); + digest_buf[8] = 0; // needed for base64_encode () + + char tmp_buf[64]; + memset (tmp_buf, 0, sizeof (tmp_buf)); + + base64_encode (int_to_itoa64, (char *) digest_buf, 32, tmp_buf); + tmp_buf[43] = 0; // cut it here + + unsigned char *salt_buf_ptr = (unsigned char *) salt.salt_buf; + + snprintf (out_buf, len-1, "%s%s$%s", SIGNATURE_CISCO9, salt_buf_ptr, tmp_buf); + } + else if (hash_mode == 9400) + { + office2007_t *office2007s = (office2007_t *) data.esalts_buf; + + office2007_t *office2007 = &office2007s[salt_pos]; + + snprintf (out_buf, len-1, "%s*%u*%u*%u*%u*%08x%08x%08x%08x*%08x%08x%08x%08x*%08x%08x%08x%08x%08x", + SIGNATURE_OFFICE2007, + 2007, + 20, + office2007->keySize, + 16, + salt.salt_buf[0], + salt.salt_buf[1], + salt.salt_buf[2], + salt.salt_buf[3], + office2007->encryptedVerifier[0], + office2007->encryptedVerifier[1], + office2007->encryptedVerifier[2], + office2007->encryptedVerifier[3], + office2007->encryptedVerifierHash[0], + office2007->encryptedVerifierHash[1], + office2007->encryptedVerifierHash[2], + office2007->encryptedVerifierHash[3], + office2007->encryptedVerifierHash[4]); + } + else if (hash_mode == 9500) + { + office2010_t *office2010s = (office2010_t *) data.esalts_buf; + + office2010_t *office2010 = &office2010s[salt_pos]; + + snprintf (out_buf, len-1, "%s*%u*%u*%u*%u*%08x%08x%08x%08x*%08x%08x%08x%08x*%08x%08x%08x%08x%08x%08x%08x%08x", SIGNATURE_OFFICE2010, 2010, 100000, 128, 16, + + salt.salt_buf[0], + salt.salt_buf[1], + salt.salt_buf[2], + salt.salt_buf[3], + office2010->encryptedVerifier[0], + office2010->encryptedVerifier[1], + office2010->encryptedVerifier[2], + office2010->encryptedVerifier[3], + office2010->encryptedVerifierHash[0], + office2010->encryptedVerifierHash[1], + office2010->encryptedVerifierHash[2], + office2010->encryptedVerifierHash[3], + office2010->encryptedVerifierHash[4], + office2010->encryptedVerifierHash[5], + office2010->encryptedVerifierHash[6], + office2010->encryptedVerifierHash[7]); + } + else if (hash_mode == 9600) + { + office2013_t *office2013s = (office2013_t *) data.esalts_buf; + + office2013_t *office2013 = &office2013s[salt_pos]; + + snprintf (out_buf, len-1, "%s*%u*%u*%u*%u*%08x%08x%08x%08x*%08x%08x%08x%08x*%08x%08x%08x%08x%08x%08x%08x%08x", SIGNATURE_OFFICE2013, 2013, 100000, 256, 16, + + salt.salt_buf[0], + salt.salt_buf[1], + salt.salt_buf[2], + salt.salt_buf[3], + office2013->encryptedVerifier[0], + office2013->encryptedVerifier[1], + office2013->encryptedVerifier[2], + office2013->encryptedVerifier[3], + office2013->encryptedVerifierHash[0], + office2013->encryptedVerifierHash[1], + office2013->encryptedVerifierHash[2], + office2013->encryptedVerifierHash[3], + office2013->encryptedVerifierHash[4], + office2013->encryptedVerifierHash[5], + office2013->encryptedVerifierHash[6], + office2013->encryptedVerifierHash[7]); + } + else if (hash_mode == 9700) + { + oldoffice01_t *oldoffice01s = (oldoffice01_t *) data.esalts_buf; + + oldoffice01_t *oldoffice01 = &oldoffice01s[salt_pos]; + + snprintf (out_buf, len-1, "%s*%08x%08x%08x%08x*%08x%08x%08x%08x*%08x%08x%08x%08x", + (oldoffice01->version == 0) ? SIGNATURE_OLDOFFICE0 : SIGNATURE_OLDOFFICE1, + byte_swap_32 (salt.salt_buf[0]), + byte_swap_32 (salt.salt_buf[1]), + byte_swap_32 (salt.salt_buf[2]), + byte_swap_32 (salt.salt_buf[3]), + byte_swap_32 (oldoffice01->encryptedVerifier[0]), + byte_swap_32 (oldoffice01->encryptedVerifier[1]), + byte_swap_32 (oldoffice01->encryptedVerifier[2]), + byte_swap_32 (oldoffice01->encryptedVerifier[3]), + byte_swap_32 (oldoffice01->encryptedVerifierHash[0]), + byte_swap_32 (oldoffice01->encryptedVerifierHash[1]), + byte_swap_32 (oldoffice01->encryptedVerifierHash[2]), + byte_swap_32 (oldoffice01->encryptedVerifierHash[3])); + } + else if (hash_mode == 9710) + { + oldoffice01_t *oldoffice01s = (oldoffice01_t *) data.esalts_buf; + + oldoffice01_t *oldoffice01 = &oldoffice01s[salt_pos]; + + snprintf (out_buf, len-1, "%s*%08x%08x%08x%08x*%08x%08x%08x%08x*%08x%08x%08x%08x", + (oldoffice01->version == 0) ? SIGNATURE_OLDOFFICE0 : SIGNATURE_OLDOFFICE1, + byte_swap_32 (salt.salt_buf[0]), + byte_swap_32 (salt.salt_buf[1]), + byte_swap_32 (salt.salt_buf[2]), + byte_swap_32 (salt.salt_buf[3]), + byte_swap_32 (oldoffice01->encryptedVerifier[0]), + byte_swap_32 (oldoffice01->encryptedVerifier[1]), + byte_swap_32 (oldoffice01->encryptedVerifier[2]), + byte_swap_32 (oldoffice01->encryptedVerifier[3]), + byte_swap_32 (oldoffice01->encryptedVerifierHash[0]), + byte_swap_32 (oldoffice01->encryptedVerifierHash[1]), + byte_swap_32 (oldoffice01->encryptedVerifierHash[2]), + byte_swap_32 (oldoffice01->encryptedVerifierHash[3])); + } + else if (hash_mode == 9720) + { + oldoffice01_t *oldoffice01s = (oldoffice01_t *) data.esalts_buf; + + oldoffice01_t *oldoffice01 = &oldoffice01s[salt_pos]; + + uint8_t *rc4key = (uint8_t *) oldoffice01->rc4key; + + snprintf (out_buf, len-1, "%s*%08x%08x%08x%08x*%08x%08x%08x%08x*%08x%08x%08x%08x:%02x%02x%02x%02x%02x", + (oldoffice01->version == 0) ? SIGNATURE_OLDOFFICE0 : SIGNATURE_OLDOFFICE1, + byte_swap_32 (salt.salt_buf[0]), + byte_swap_32 (salt.salt_buf[1]), + byte_swap_32 (salt.salt_buf[2]), + byte_swap_32 (salt.salt_buf[3]), + byte_swap_32 (oldoffice01->encryptedVerifier[0]), + byte_swap_32 (oldoffice01->encryptedVerifier[1]), + byte_swap_32 (oldoffice01->encryptedVerifier[2]), + byte_swap_32 (oldoffice01->encryptedVerifier[3]), + byte_swap_32 (oldoffice01->encryptedVerifierHash[0]), + byte_swap_32 (oldoffice01->encryptedVerifierHash[1]), + byte_swap_32 (oldoffice01->encryptedVerifierHash[2]), + byte_swap_32 (oldoffice01->encryptedVerifierHash[3]), + rc4key[0], + rc4key[1], + rc4key[2], + rc4key[3], + rc4key[4]); + } + else if (hash_mode == 9800) + { + oldoffice34_t *oldoffice34s = (oldoffice34_t *) data.esalts_buf; + + oldoffice34_t *oldoffice34 = &oldoffice34s[salt_pos]; + + snprintf (out_buf, len-1, "%s*%08x%08x%08x%08x*%08x%08x%08x%08x*%08x%08x%08x%08x%08x", + (oldoffice34->version == 3) ? SIGNATURE_OLDOFFICE3 : SIGNATURE_OLDOFFICE4, + salt.salt_buf[0], + salt.salt_buf[1], + salt.salt_buf[2], + salt.salt_buf[3], + byte_swap_32 (oldoffice34->encryptedVerifier[0]), + byte_swap_32 (oldoffice34->encryptedVerifier[1]), + byte_swap_32 (oldoffice34->encryptedVerifier[2]), + byte_swap_32 (oldoffice34->encryptedVerifier[3]), + byte_swap_32 (oldoffice34->encryptedVerifierHash[0]), + byte_swap_32 (oldoffice34->encryptedVerifierHash[1]), + byte_swap_32 (oldoffice34->encryptedVerifierHash[2]), + byte_swap_32 (oldoffice34->encryptedVerifierHash[3]), + byte_swap_32 (oldoffice34->encryptedVerifierHash[4])); + } + else if (hash_mode == 9810) + { + oldoffice34_t *oldoffice34s = (oldoffice34_t *) data.esalts_buf; + + oldoffice34_t *oldoffice34 = &oldoffice34s[salt_pos]; + + snprintf (out_buf, len-1, "%s*%08x%08x%08x%08x*%08x%08x%08x%08x*%08x%08x%08x%08x%08x", + (oldoffice34->version == 3) ? SIGNATURE_OLDOFFICE3 : SIGNATURE_OLDOFFICE4, + salt.salt_buf[0], + salt.salt_buf[1], + salt.salt_buf[2], + salt.salt_buf[3], + byte_swap_32 (oldoffice34->encryptedVerifier[0]), + byte_swap_32 (oldoffice34->encryptedVerifier[1]), + byte_swap_32 (oldoffice34->encryptedVerifier[2]), + byte_swap_32 (oldoffice34->encryptedVerifier[3]), + byte_swap_32 (oldoffice34->encryptedVerifierHash[0]), + byte_swap_32 (oldoffice34->encryptedVerifierHash[1]), + byte_swap_32 (oldoffice34->encryptedVerifierHash[2]), + byte_swap_32 (oldoffice34->encryptedVerifierHash[3]), + byte_swap_32 (oldoffice34->encryptedVerifierHash[4])); + } + else if (hash_mode == 9820) + { + oldoffice34_t *oldoffice34s = (oldoffice34_t *) data.esalts_buf; + + oldoffice34_t *oldoffice34 = &oldoffice34s[salt_pos]; + + uint8_t *rc4key = (uint8_t *) oldoffice34->rc4key; + + snprintf (out_buf, len-1, "%s*%08x%08x%08x%08x*%08x%08x%08x%08x*%08x%08x%08x%08x%08x:%02x%02x%02x%02x%02x", + (oldoffice34->version == 3) ? SIGNATURE_OLDOFFICE3 : SIGNATURE_OLDOFFICE4, + salt.salt_buf[0], + salt.salt_buf[1], + salt.salt_buf[2], + salt.salt_buf[3], + byte_swap_32 (oldoffice34->encryptedVerifier[0]), + byte_swap_32 (oldoffice34->encryptedVerifier[1]), + byte_swap_32 (oldoffice34->encryptedVerifier[2]), + byte_swap_32 (oldoffice34->encryptedVerifier[3]), + byte_swap_32 (oldoffice34->encryptedVerifierHash[0]), + byte_swap_32 (oldoffice34->encryptedVerifierHash[1]), + byte_swap_32 (oldoffice34->encryptedVerifierHash[2]), + byte_swap_32 (oldoffice34->encryptedVerifierHash[3]), + byte_swap_32 (oldoffice34->encryptedVerifierHash[4]), + rc4key[0], + rc4key[1], + rc4key[2], + rc4key[3], + rc4key[4]); + } + else if (hash_mode == 10000) + { + // salt + + pbkdf2_sha256_t *pbkdf2_sha256s = (pbkdf2_sha256_t *) data.esalts_buf; + + pbkdf2_sha256_t *pbkdf2_sha256 = &pbkdf2_sha256s[salt_pos]; + + unsigned char *salt_buf_ptr = (unsigned char *) pbkdf2_sha256->salt_buf; + + // hash + + digest_buf[0] = byte_swap_32 (digest_buf[0]); + digest_buf[1] = byte_swap_32 (digest_buf[1]); + digest_buf[2] = byte_swap_32 (digest_buf[2]); + digest_buf[3] = byte_swap_32 (digest_buf[3]); + digest_buf[4] = byte_swap_32 (digest_buf[4]); + digest_buf[5] = byte_swap_32 (digest_buf[5]); + digest_buf[6] = byte_swap_32 (digest_buf[6]); + digest_buf[7] = byte_swap_32 (digest_buf[7]); + digest_buf[8] = 0; // needed for base64_encode () + + char tmp_buf[64]; + memset (tmp_buf, 0, sizeof (tmp_buf)); + + base64_encode (int_to_base64, (char *) digest_buf, 32, tmp_buf); + + // output + + snprintf (out_buf, len-1, "%s%i$%s$%s", SIGNATURE_DJANGOPBKDF2, salt.salt_iter + 1, salt_buf_ptr, tmp_buf); + } + else if (hash_mode == 10100) + { + snprintf (out_buf, len-1, "%08x%08x:%u:%u:%08x%08x%08x%08x", + digest_buf[0], + digest_buf[1], + 2, + 4, + byte_swap_32 (salt.salt_buf[0]), + byte_swap_32 (salt.salt_buf[1]), + byte_swap_32 (salt.salt_buf[2]), + byte_swap_32 (salt.salt_buf[3])); + } + else if (hash_mode == 10200) + { + cram_md5_t *cram_md5s = (cram_md5_t *) data.esalts_buf; + + cram_md5_t *cram_md5 = &cram_md5s[salt_pos]; + + // challenge + + char challenge[100]; + + memset (challenge, 0, sizeof (challenge)); + + base64_encode (int_to_base64, (char *) salt.salt_buf, salt.salt_len, challenge); + + // response + + char tmp_buf[100]; + + uint tmp_len = snprintf (tmp_buf, 100, "%s %08x%08x%08x%08x", + (char *) cram_md5->user, + digest_buf[0], + digest_buf[1], + digest_buf[2], + digest_buf[3]); + + char response[100]; + + memset (response, 0, sizeof (response)); + + base64_encode (int_to_base64, (char *) tmp_buf, tmp_len, response); + + snprintf (out_buf, len-1, "%s%s$%s", SIGNATURE_CRAM_MD5, challenge, response); + } + else if (hash_mode == 10300) + { + char tmp_buf[100]; + + memset (tmp_buf, 0, sizeof (tmp_buf)); + + memcpy (tmp_buf + 0, digest_buf, 20); + memcpy (tmp_buf + 20, salt.salt_buf, salt.salt_len); + + uint tmp_len = 20 + salt.salt_len; + + // base64 encode it + + char base64_encoded[100]; + + memset (base64_encoded, 0, sizeof (base64_encoded)); + + base64_encode (int_to_base64, (char *) tmp_buf, tmp_len, base64_encoded); + + snprintf (out_buf, len-1, "%s%i}%s", SIGNATURE_SAPH_SHA1, salt.salt_iter + 1, base64_encoded); + } + else if (hash_mode == 10400) + { + pdf_t *pdfs = (pdf_t *) data.esalts_buf; + + pdf_t *pdf = &pdfs[salt_pos]; + + snprintf (out_buf, len-1, "$pdf$%d*%d*%d*%d*%d*%d*%08x%08x%08x%08x*%d*%08x%08x%08x%08x%08x%08x%08x%08x*%d*%08x%08x%08x%08x%08x%08x%08x%08x", + + pdf->V, + pdf->R, + 40, + pdf->P, + pdf->enc_md, + pdf->id_len, + byte_swap_32 (pdf->id_buf[0]), + byte_swap_32 (pdf->id_buf[1]), + byte_swap_32 (pdf->id_buf[2]), + byte_swap_32 (pdf->id_buf[3]), + pdf->u_len, + byte_swap_32 (pdf->u_buf[0]), + byte_swap_32 (pdf->u_buf[1]), + byte_swap_32 (pdf->u_buf[2]), + byte_swap_32 (pdf->u_buf[3]), + byte_swap_32 (pdf->u_buf[4]), + byte_swap_32 (pdf->u_buf[5]), + byte_swap_32 (pdf->u_buf[6]), + byte_swap_32 (pdf->u_buf[7]), + pdf->o_len, + byte_swap_32 (pdf->o_buf[0]), + byte_swap_32 (pdf->o_buf[1]), + byte_swap_32 (pdf->o_buf[2]), + byte_swap_32 (pdf->o_buf[3]), + byte_swap_32 (pdf->o_buf[4]), + byte_swap_32 (pdf->o_buf[5]), + byte_swap_32 (pdf->o_buf[6]), + byte_swap_32 (pdf->o_buf[7]) + ); + } + else if (hash_mode == 10410) + { + pdf_t *pdfs = (pdf_t *) data.esalts_buf; + + pdf_t *pdf = &pdfs[salt_pos]; + + snprintf (out_buf, len-1, "$pdf$%d*%d*%d*%d*%d*%d*%08x%08x%08x%08x*%d*%08x%08x%08x%08x%08x%08x%08x%08x*%d*%08x%08x%08x%08x%08x%08x%08x%08x", + + pdf->V, + pdf->R, + 40, + pdf->P, + pdf->enc_md, + pdf->id_len, + byte_swap_32 (pdf->id_buf[0]), + byte_swap_32 (pdf->id_buf[1]), + byte_swap_32 (pdf->id_buf[2]), + byte_swap_32 (pdf->id_buf[3]), + pdf->u_len, + byte_swap_32 (pdf->u_buf[0]), + byte_swap_32 (pdf->u_buf[1]), + byte_swap_32 (pdf->u_buf[2]), + byte_swap_32 (pdf->u_buf[3]), + byte_swap_32 (pdf->u_buf[4]), + byte_swap_32 (pdf->u_buf[5]), + byte_swap_32 (pdf->u_buf[6]), + byte_swap_32 (pdf->u_buf[7]), + pdf->o_len, + byte_swap_32 (pdf->o_buf[0]), + byte_swap_32 (pdf->o_buf[1]), + byte_swap_32 (pdf->o_buf[2]), + byte_swap_32 (pdf->o_buf[3]), + byte_swap_32 (pdf->o_buf[4]), + byte_swap_32 (pdf->o_buf[5]), + byte_swap_32 (pdf->o_buf[6]), + byte_swap_32 (pdf->o_buf[7]) + ); + } + else if (hash_mode == 10420) + { + pdf_t *pdfs = (pdf_t *) data.esalts_buf; + + pdf_t *pdf = &pdfs[salt_pos]; + + uint8_t *rc4key = (uint8_t *) pdf->rc4key; + + snprintf (out_buf, len-1, "$pdf$%d*%d*%d*%d*%d*%d*%08x%08x%08x%08x*%d*%08x%08x%08x%08x%08x%08x%08x%08x*%d*%08x%08x%08x%08x%08x%08x%08x%08x:%02x%02x%02x%02x%02x", + + pdf->V, + pdf->R, + 40, + pdf->P, + pdf->enc_md, + pdf->id_len, + byte_swap_32 (pdf->id_buf[0]), + byte_swap_32 (pdf->id_buf[1]), + byte_swap_32 (pdf->id_buf[2]), + byte_swap_32 (pdf->id_buf[3]), + pdf->u_len, + byte_swap_32 (pdf->u_buf[0]), + byte_swap_32 (pdf->u_buf[1]), + byte_swap_32 (pdf->u_buf[2]), + byte_swap_32 (pdf->u_buf[3]), + byte_swap_32 (pdf->u_buf[4]), + byte_swap_32 (pdf->u_buf[5]), + byte_swap_32 (pdf->u_buf[6]), + byte_swap_32 (pdf->u_buf[7]), + pdf->o_len, + byte_swap_32 (pdf->o_buf[0]), + byte_swap_32 (pdf->o_buf[1]), + byte_swap_32 (pdf->o_buf[2]), + byte_swap_32 (pdf->o_buf[3]), + byte_swap_32 (pdf->o_buf[4]), + byte_swap_32 (pdf->o_buf[5]), + byte_swap_32 (pdf->o_buf[6]), + byte_swap_32 (pdf->o_buf[7]), + rc4key[0], + rc4key[1], + rc4key[2], + rc4key[3], + rc4key[4] + ); + } + else if (hash_mode == 10500) + { + pdf_t *pdfs = (pdf_t *) data.esalts_buf; + + pdf_t *pdf = &pdfs[salt_pos]; + + if (pdf->id_len == 32) + { + snprintf (out_buf, len-1, "$pdf$%d*%d*%d*%d*%d*%d*%08x%08x%08x%08x%08x%08x%08x%08x*%d*%08x%08x%08x%08x%08x%08x%08x%08x*%d*%08x%08x%08x%08x%08x%08x%08x%08x", + + pdf->V, + pdf->R, + 128, + pdf->P, + pdf->enc_md, + pdf->id_len, + byte_swap_32 (pdf->id_buf[0]), + byte_swap_32 (pdf->id_buf[1]), + byte_swap_32 (pdf->id_buf[2]), + byte_swap_32 (pdf->id_buf[3]), + byte_swap_32 (pdf->id_buf[4]), + byte_swap_32 (pdf->id_buf[5]), + byte_swap_32 (pdf->id_buf[6]), + byte_swap_32 (pdf->id_buf[7]), + pdf->u_len, + byte_swap_32 (pdf->u_buf[0]), + byte_swap_32 (pdf->u_buf[1]), + byte_swap_32 (pdf->u_buf[2]), + byte_swap_32 (pdf->u_buf[3]), + byte_swap_32 (pdf->u_buf[4]), + byte_swap_32 (pdf->u_buf[5]), + byte_swap_32 (pdf->u_buf[6]), + byte_swap_32 (pdf->u_buf[7]), + pdf->o_len, + byte_swap_32 (pdf->o_buf[0]), + byte_swap_32 (pdf->o_buf[1]), + byte_swap_32 (pdf->o_buf[2]), + byte_swap_32 (pdf->o_buf[3]), + byte_swap_32 (pdf->o_buf[4]), + byte_swap_32 (pdf->o_buf[5]), + byte_swap_32 (pdf->o_buf[6]), + byte_swap_32 (pdf->o_buf[7]) + ); + } + else + { + snprintf (out_buf, len-1, "$pdf$%d*%d*%d*%d*%d*%d*%08x%08x%08x%08x*%d*%08x%08x%08x%08x%08x%08x%08x%08x*%d*%08x%08x%08x%08x%08x%08x%08x%08x", + + pdf->V, + pdf->R, + 128, + pdf->P, + pdf->enc_md, + pdf->id_len, + byte_swap_32 (pdf->id_buf[0]), + byte_swap_32 (pdf->id_buf[1]), + byte_swap_32 (pdf->id_buf[2]), + byte_swap_32 (pdf->id_buf[3]), + pdf->u_len, + byte_swap_32 (pdf->u_buf[0]), + byte_swap_32 (pdf->u_buf[1]), + byte_swap_32 (pdf->u_buf[2]), + byte_swap_32 (pdf->u_buf[3]), + byte_swap_32 (pdf->u_buf[4]), + byte_swap_32 (pdf->u_buf[5]), + byte_swap_32 (pdf->u_buf[6]), + byte_swap_32 (pdf->u_buf[7]), + pdf->o_len, + byte_swap_32 (pdf->o_buf[0]), + byte_swap_32 (pdf->o_buf[1]), + byte_swap_32 (pdf->o_buf[2]), + byte_swap_32 (pdf->o_buf[3]), + byte_swap_32 (pdf->o_buf[4]), + byte_swap_32 (pdf->o_buf[5]), + byte_swap_32 (pdf->o_buf[6]), + byte_swap_32 (pdf->o_buf[7]) + ); + } + } + else if (hash_mode == 10600) + { + uint digest_idx = salt.digests_offset + digest_pos; + + hashinfo_t **hashinfo_ptr = data.hash_info; + char *hash_buf = hashinfo_ptr[digest_idx]->orighash; + + snprintf (out_buf, len-1, "%s", hash_buf); + } + else if (hash_mode == 10700) + { + uint digest_idx = salt.digests_offset + digest_pos; + + hashinfo_t **hashinfo_ptr = data.hash_info; + char *hash_buf = hashinfo_ptr[digest_idx]->orighash; + + snprintf (out_buf, len-1, "%s", hash_buf); + } + else if (hash_mode == 10900) + { + uint digest_idx = salt.digests_offset + digest_pos; + + hashinfo_t **hashinfo_ptr = data.hash_info; + char *hash_buf = hashinfo_ptr[digest_idx]->orighash; + + snprintf (out_buf, len-1, "%s", hash_buf); + } + else if (hash_mode == 11100) + { + uint32_t salt_challenge = salt.salt_buf[0]; + + salt_challenge = byte_swap_32 (salt_challenge); + + unsigned char *user_name = (unsigned char *) (salt.salt_buf + 1); + + snprintf (out_buf, len-1, "%s%s*%08x*%08x%08x%08x%08x", + SIGNATURE_POSTGRESQL_AUTH, + user_name, + salt_challenge, + digest_buf[0], + digest_buf[1], + digest_buf[2], + digest_buf[3]); + } + else if (hash_mode == 11200) + { + snprintf (out_buf, len-1, "%s%s*%08x%08x%08x%08x%08x", + SIGNATURE_MYSQL_AUTH, + (unsigned char *) salt.salt_buf, + digest_buf[0], + digest_buf[1], + digest_buf[2], + digest_buf[3], + digest_buf[4]); + } + else if (hash_mode == 11300) + { + bitcoin_wallet_t *bitcoin_wallets = (bitcoin_wallet_t *) data.esalts_buf; + + bitcoin_wallet_t *bitcoin_wallet = &bitcoin_wallets[salt_pos]; + + const uint cry_master_len = bitcoin_wallet->cry_master_len; + const uint ckey_len = bitcoin_wallet->ckey_len; + const uint public_key_len = bitcoin_wallet->public_key_len; + + char *cry_master_buf = (char *) mymalloc ((cry_master_len * 2) + 1); + char *ckey_buf = (char *) mymalloc ((ckey_len * 2) + 1); + char *public_key_buf = (char *) mymalloc ((public_key_len * 2) + 1); + + for (uint i = 0, j = 0; i < cry_master_len; i += 1, j += 2) + { + const uint8_t *ptr = (const uint8_t *) bitcoin_wallet->cry_master_buf; + + sprintf (cry_master_buf + j, "%02x", ptr[i]); + } + + for (uint i = 0, j = 0; i < ckey_len; i += 1, j += 2) + { + const uint8_t *ptr = (const uint8_t *) bitcoin_wallet->ckey_buf; + + sprintf (ckey_buf + j, "%02x", ptr[i]); + } + + for (uint i = 0, j = 0; i < public_key_len; i += 1, j += 2) + { + const uint8_t *ptr = (const uint8_t *) bitcoin_wallet->public_key_buf; + + sprintf (public_key_buf + j, "%02x", ptr[i]); + } + + snprintf (out_buf, len-1, "%s%d$%s$%d$%s$%d$%d$%s$%d$%s", + SIGNATURE_BITCOIN_WALLET, + cry_master_len * 2, + cry_master_buf, + salt.salt_len, + (unsigned char *) salt.salt_buf, + salt.salt_iter + 1, + ckey_len * 2, + ckey_buf, + public_key_len * 2, + public_key_buf + ); + + free (cry_master_buf); + free (ckey_buf); + free (public_key_buf); + } + else if (hash_mode == 11400) + { + uint digest_idx = salt.digests_offset + digest_pos; + + hashinfo_t **hashinfo_ptr = data.hash_info; + char *hash_buf = hashinfo_ptr[digest_idx]->orighash; + + snprintf (out_buf, len-1, "%s", hash_buf); + } + else if (hash_mode == 11600) + { + seven_zip_t *seven_zips = (seven_zip_t *) data.esalts_buf; + + seven_zip_t *seven_zip = &seven_zips[salt_pos]; + + const uint data_len = seven_zip->data_len; + + char *data_buf = (char *) mymalloc ((data_len * 2) + 1); + + for (uint i = 0, j = 0; i < data_len; i += 1, j += 2) + { + const uint8_t *ptr = (const uint8_t *) seven_zip->data_buf; + + sprintf (data_buf + j, "%02x", ptr[i]); + } + + snprintf (out_buf, len-1, "%s%u$%u$%u$%s$%u$%08x%08x%08x%08x$%u$%u$%u$%s", + SIGNATURE_SEVEN_ZIP, + 0, + salt.salt_sign[0], + 0, + (char *) seven_zip->salt_buf, + seven_zip->iv_len, + seven_zip->iv_buf[0], + seven_zip->iv_buf[1], + seven_zip->iv_buf[2], + seven_zip->iv_buf[3], + seven_zip->crc, + seven_zip->data_len, + seven_zip->unpack_size, + data_buf); + + free (data_buf); + } + else if (hash_mode == 11700) + { + snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x%08x%08x%08x", + digest_buf[0], + digest_buf[1], + digest_buf[2], + digest_buf[3], + digest_buf[4], + digest_buf[5], + digest_buf[6], + digest_buf[7]); + } + else if (hash_mode == 11800) + { + snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x", + digest_buf[ 0], + digest_buf[ 1], + digest_buf[ 2], + digest_buf[ 3], + digest_buf[ 4], + digest_buf[ 5], + digest_buf[ 6], + digest_buf[ 7], + digest_buf[ 8], + digest_buf[ 9], + digest_buf[10], + digest_buf[11], + digest_buf[12], + digest_buf[13], + digest_buf[14], + digest_buf[15]); + } + else if (hash_mode == 11900) + { + uint digest_idx = salt.digests_offset + digest_pos; + + hashinfo_t **hashinfo_ptr = data.hash_info; + char *hash_buf = hashinfo_ptr[digest_idx]->orighash; + + snprintf (out_buf, len-1, "%s", hash_buf); + } + else if (hash_mode == 12000) + { + uint digest_idx = salt.digests_offset + digest_pos; + + hashinfo_t **hashinfo_ptr = data.hash_info; + char *hash_buf = hashinfo_ptr[digest_idx]->orighash; + + snprintf (out_buf, len-1, "%s", hash_buf); + } + else if (hash_mode == 12100) + { + uint digest_idx = salt.digests_offset + digest_pos; + + hashinfo_t **hashinfo_ptr = data.hash_info; + char *hash_buf = hashinfo_ptr[digest_idx]->orighash; + + snprintf (out_buf, len-1, "%s", hash_buf); + } + else if (hash_mode == 12200) + { + uint *ptr_digest = digest_buf; + uint *ptr_salt = salt.salt_buf; + + snprintf (out_buf, len-1, "%s0$1$%08x%08x$%08x%08x", + SIGNATURE_ECRYPTFS, + ptr_salt[0], + ptr_salt[1], + ptr_digest[0], + ptr_digest[1]); + } + else if (hash_mode == 12300) + { + uint *ptr_digest = digest_buf; + uint *ptr_salt = salt.salt_buf; + + snprintf (out_buf, len-1, "%08X%08X%08X%08X%08X%08X%08X%08X%08X%08X%08X%08X%08X%08X%08X%08X%08X%08X%08X%08X", + ptr_digest[ 0], ptr_digest[ 1], + ptr_digest[ 2], ptr_digest[ 3], + ptr_digest[ 4], ptr_digest[ 5], + ptr_digest[ 6], ptr_digest[ 7], + ptr_digest[ 8], ptr_digest[ 9], + ptr_digest[10], ptr_digest[11], + ptr_digest[12], ptr_digest[13], + ptr_digest[14], ptr_digest[15], + ptr_salt[0], + ptr_salt[1], + ptr_salt[2], + ptr_salt[3]); + } + else if (hash_mode == 12400) + { + // encode iteration count + + char salt_iter[5]; + + salt_iter[0] = int_to_itoa64 ((salt.salt_iter ) & 0x3f); + salt_iter[1] = int_to_itoa64 ((salt.salt_iter >> 6) & 0x3f); + salt_iter[2] = int_to_itoa64 ((salt.salt_iter >> 12) & 0x3f); + salt_iter[3] = int_to_itoa64 ((salt.salt_iter >> 18) & 0x3f); + salt_iter[4] = 0; + + // encode salt + + ptr_salt[0] = int_to_itoa64 ((salt.salt_buf[0] ) & 0x3f); + ptr_salt[1] = int_to_itoa64 ((salt.salt_buf[0] >> 6) & 0x3f); + ptr_salt[2] = int_to_itoa64 ((salt.salt_buf[0] >> 12) & 0x3f); + ptr_salt[3] = int_to_itoa64 ((salt.salt_buf[0] >> 18) & 0x3f); + ptr_salt[4] = 0; + + // encode digest + + memset (tmp_buf, 0, sizeof (tmp_buf)); + + digest_buf[0] = byte_swap_32 (digest_buf[0]); + digest_buf[1] = byte_swap_32 (digest_buf[1]); + + memcpy (tmp_buf, digest_buf, 8); + + base64_encode (int_to_itoa64, tmp_buf, 8, ptr_plain); + + ptr_plain[11] = 0; + + // fill the resulting buffer + + snprintf (out_buf, len - 1, "_%s%s%s", salt_iter, ptr_salt, ptr_plain); + } + else if (hash_mode == 12500) + { + snprintf (out_buf, len - 1, "%s*0*%08x%08x*%08x%08x%08x%08x", + SIGNATURE_RAR3, + byte_swap_32 (salt.salt_buf[0]), + byte_swap_32 (salt.salt_buf[1]), + salt.salt_buf[2], + salt.salt_buf[3], + salt.salt_buf[4], + salt.salt_buf[5]); + } + else if (hash_mode == 12600) + { + snprintf (out_buf, len - 1, "%08x%08x%08x%08x%08x%08x%08x%08x", + digest_buf[0] + salt.salt_buf_pc[0], + digest_buf[1] + salt.salt_buf_pc[1], + digest_buf[2] + salt.salt_buf_pc[2], + digest_buf[3] + salt.salt_buf_pc[3], + digest_buf[4] + salt.salt_buf_pc[4], + digest_buf[5] + salt.salt_buf_pc[5], + digest_buf[6] + salt.salt_buf_pc[6], + digest_buf[7] + salt.salt_buf_pc[7]); + } + else if (hash_mode == 12700) + { + uint digest_idx = salt.digests_offset + digest_pos; + + hashinfo_t **hashinfo_ptr = data.hash_info; + char *hash_buf = hashinfo_ptr[digest_idx]->orighash; + + snprintf (out_buf, len-1, "%s", hash_buf); + } + else if (hash_mode == 12800) + { + const uint8_t *ptr = (const uint8_t *) salt.salt_buf; + + snprintf (out_buf, len-1, "%s,%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x,%d,%08x%08x%08x%08x%08x%08x%08x%08x", + SIGNATURE_MS_DRSR, + ptr[0], + ptr[1], + ptr[2], + ptr[3], + ptr[4], + ptr[5], + ptr[6], + ptr[7], + ptr[8], + ptr[9], + salt.salt_iter + 1, + byte_swap_32 (digest_buf[0]), + byte_swap_32 (digest_buf[1]), + byte_swap_32 (digest_buf[2]), + byte_swap_32 (digest_buf[3]), + byte_swap_32 (digest_buf[4]), + byte_swap_32 (digest_buf[5]), + byte_swap_32 (digest_buf[6]), + byte_swap_32 (digest_buf[7]) + ); + } + else + { + if (hash_type == HASH_TYPE_MD4) + { + snprintf (out_buf, 255, "%08x%08x%08x%08x", + digest_buf[0], + digest_buf[1], + digest_buf[2], + digest_buf[3]); + } + else if (hash_type == HASH_TYPE_MD5) + { + snprintf (out_buf, len-1, "%08x%08x%08x%08x", + digest_buf[0], + digest_buf[1], + digest_buf[2], + digest_buf[3]); + } + else if (hash_type == HASH_TYPE_SHA1) + { + snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x", + digest_buf[0], + digest_buf[1], + digest_buf[2], + digest_buf[3], + digest_buf[4]); + } + else if (hash_type == HASH_TYPE_SHA256) + { + snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x%08x%08x%08x", + digest_buf[0], + digest_buf[1], + digest_buf[2], + digest_buf[3], + digest_buf[4], + digest_buf[5], + digest_buf[6], + digest_buf[7]); + } + else if (hash_type == HASH_TYPE_SHA384) + { + uint *ptr = digest_buf; + + snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x", + ptr[ 1], ptr[ 0], + ptr[ 3], ptr[ 2], + ptr[ 5], ptr[ 4], + ptr[ 7], ptr[ 6], + ptr[ 9], ptr[ 8], + ptr[11], ptr[10]); + } + else if (hash_type == HASH_TYPE_SHA512) + { + uint *ptr = digest_buf; + + snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x", + ptr[ 1], ptr[ 0], + ptr[ 3], ptr[ 2], + ptr[ 5], ptr[ 4], + ptr[ 7], ptr[ 6], + ptr[ 9], ptr[ 8], + ptr[11], ptr[10], + ptr[13], ptr[12], + ptr[15], ptr[14]); + } + else if (hash_type == HASH_TYPE_LM) + { + snprintf (out_buf, len-1, "%08x%08x", + digest_buf[0], + digest_buf[1]); + } + else if (hash_type == HASH_TYPE_ORACLEH) + { + snprintf (out_buf, len-1, "%08X%08X", + digest_buf[0], + digest_buf[1]); + } + else if (hash_type == HASH_TYPE_BCRYPT) + { + base64_encode (int_to_bf64, (char *) salt.salt_buf, 16, tmp_buf + 0); + base64_encode (int_to_bf64, (char *) digest_buf, 23, tmp_buf + 22); + + tmp_buf[22 + 31] = 0; // base64_encode wants to pad + + snprintf (out_buf, len-1, "%s$%s", (char *) salt.salt_sign, tmp_buf); + } + else if (hash_type == HASH_TYPE_KECCAK) + { + uint *ptr = digest_buf; + + snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x", + ptr[ 1], ptr[ 0], + ptr[ 3], ptr[ 2], + ptr[ 5], ptr[ 4], + ptr[ 7], ptr[ 6], + ptr[ 9], ptr[ 8], + ptr[11], ptr[10], + ptr[13], ptr[12], + ptr[15], ptr[14], + ptr[17], ptr[16], + ptr[19], ptr[18], + ptr[21], ptr[20], + ptr[23], ptr[22], + ptr[25], ptr[24], + ptr[27], ptr[26], + ptr[29], ptr[28], + ptr[31], ptr[30], + ptr[33], ptr[32], + ptr[35], ptr[34], + ptr[37], ptr[36], + ptr[39], ptr[38], + ptr[41], ptr[30], + ptr[43], ptr[42], + ptr[45], ptr[44], + ptr[47], ptr[46], + ptr[49], ptr[48] + ); + + out_buf[salt.keccak_mdlen * 2] = 0; + } + else if (hash_type == HASH_TYPE_RIPEMD160) + { + snprintf (out_buf, 255, "%08x%08x%08x%08x%08x", + digest_buf[0], + digest_buf[1], + digest_buf[2], + digest_buf[3], + digest_buf[4]); + } + else if (hash_type == HASH_TYPE_WHIRLPOOL) + { + digest_buf[ 0] = digest_buf[ 0]; + digest_buf[ 1] = digest_buf[ 1]; + digest_buf[ 2] = digest_buf[ 2]; + digest_buf[ 3] = digest_buf[ 3]; + digest_buf[ 4] = digest_buf[ 4]; + digest_buf[ 5] = digest_buf[ 5]; + digest_buf[ 6] = digest_buf[ 6]; + digest_buf[ 7] = digest_buf[ 7]; + digest_buf[ 8] = digest_buf[ 8]; + digest_buf[ 9] = digest_buf[ 9]; + digest_buf[10] = digest_buf[10]; + digest_buf[11] = digest_buf[11]; + digest_buf[12] = digest_buf[12]; + digest_buf[13] = digest_buf[13]; + digest_buf[14] = digest_buf[14]; + digest_buf[15] = digest_buf[15]; + + snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x%08x", + digest_buf[ 0], + digest_buf[ 1], + digest_buf[ 2], + digest_buf[ 3], + digest_buf[ 4], + digest_buf[ 5], + digest_buf[ 6], + digest_buf[ 7], + digest_buf[ 8], + digest_buf[ 9], + digest_buf[10], + digest_buf[11], + digest_buf[12], + digest_buf[13], + digest_buf[14], + digest_buf[15]); + } + else if (hash_type == HASH_TYPE_GOST) + { + snprintf (out_buf, len-1, "%08x%08x%08x%08x%08x%08x%08x%08x", + digest_buf[0], + digest_buf[1], + digest_buf[2], + digest_buf[3], + digest_buf[4], + digest_buf[5], + digest_buf[6], + digest_buf[7]); + } + else if (hash_type == HASH_TYPE_MYSQL) + { + snprintf (out_buf, len-1, "%08x%08x", + digest_buf[0], + digest_buf[1]); + } + else if (hash_type == HASH_TYPE_LOTUS5) + { + snprintf (out_buf, len-1, "%08x%08x%08x%08x", + digest_buf[0], + digest_buf[1], + digest_buf[2], + digest_buf[3]); + } + else if (hash_type == HASH_TYPE_LOTUS6) + { + digest_buf[ 0] = byte_swap_32 (digest_buf[ 0]); + digest_buf[ 1] = byte_swap_32 (digest_buf[ 1]); + digest_buf[ 2] = byte_swap_32 (digest_buf[ 2]); + digest_buf[ 3] = byte_swap_32 (digest_buf[ 3]); + + char buf[16]; + + memcpy (buf + 0, salt.salt_buf, 5); + memcpy (buf + 5, digest_buf, 9); + + buf[3] -= -4; + + base64_encode (int_to_lotus64, buf, 14, tmp_buf); + + tmp_buf[18] = salt.salt_buf_pc[7]; + tmp_buf[19] = 0; + + snprintf (out_buf, len-1, "(G%s)", tmp_buf); + } + else if (hash_type == HASH_TYPE_LOTUS8) + { + char buf[52]; + + memset (buf, 0, sizeof (buf)); + + // salt + + memcpy (buf + 0, salt.salt_buf, 16); + + buf[3] -= -4; + + // iteration + + snprintf (buf + 16, 11, "%010i", salt.salt_iter + 1); + + // chars + + buf[26] = salt.salt_buf_pc[0]; + buf[27] = salt.salt_buf_pc[1]; + + // digest + + memcpy (buf + 28, digest_buf, 8); + + base64_encode (int_to_lotus64, buf, 36, tmp_buf); + + tmp_buf[49] = 0; + + snprintf (out_buf, len-1, "(H%s)", tmp_buf); + } + else if (hash_type == HASH_TYPE_CRC32) + { + snprintf (out_buf, len-1, "%08x", byte_swap_32 (digest_buf[0])); + } + } + + if (salt_type == SALT_TYPE_INTERN) + { + size_t pos = strlen (out_buf); + + out_buf[pos] = data.separator; + + char *ptr = (char *) salt.salt_buf; + + memcpy (out_buf + pos + 1, ptr, salt.salt_len); + + out_buf[pos + 1 + salt.salt_len] = 0; + } +} + +void to_hccap_t (hccap_t *hccap, uint salt_pos, uint digest_pos) +{ + memset (hccap, 0, sizeof (hccap_t)); + + salt_t *salt = &data.salts_buf[salt_pos]; + + memcpy (hccap->essid, salt->salt_buf, salt->salt_len); + + wpa_t *wpas = (wpa_t *) data.esalts_buf; + wpa_t *wpa = &wpas[salt_pos]; + + hccap->keyver = wpa->keyver; + + hccap->eapol_size = wpa->eapol_size; + + if (wpa->keyver != 1) + { + uint eapol_tmp[64]; + + for (uint i = 0; i < 64; i++) + { + eapol_tmp[i] = byte_swap_32 (wpa->eapol[i]); + } + + memcpy (hccap->eapol, eapol_tmp, wpa->eapol_size); + } + else + { + memcpy (hccap->eapol, wpa->eapol, wpa->eapol_size); + } + + uint pke_tmp[25]; + + for (int i = 5; i < 25; i++) + { + pke_tmp[i] = byte_swap_32 (wpa->pke[i]); + } + + char *pke_ptr = (char *) pke_tmp; + + memcpy (hccap->mac1, pke_ptr + 23, 6); + memcpy (hccap->mac2, pke_ptr + 29, 6); + memcpy (hccap->nonce1, pke_ptr + 67, 32); + memcpy (hccap->nonce2, pke_ptr + 35, 32); + + char *digests_buf_ptr = (char *) data.digests_buf; + + uint dgst_size = data.dgst_size; + + uint *digest_ptr = (uint *) (digests_buf_ptr + (data.salts_buf[salt_pos].digests_offset * dgst_size) + (digest_pos * dgst_size)); + + if (wpa->keyver != 1) + { + uint digest_tmp[4]; + + digest_tmp[0] = byte_swap_32 (digest_ptr[0]); + digest_tmp[1] = byte_swap_32 (digest_ptr[1]); + digest_tmp[2] = byte_swap_32 (digest_ptr[2]); + digest_tmp[3] = byte_swap_32 (digest_ptr[3]); + + memcpy (hccap->keymic, digest_tmp, 16); + } + else + { + memcpy (hccap->keymic, digest_ptr, 16); + } +} + +void SuspendThreads () +{ + if (data.devices_status == STATUS_RUNNING) + { + hc_timer_set (&data.timer_paused); + + data.devices_status = STATUS_PAUSED; + + log_info ("Paused"); + } +} + +void ResumeThreads () +{ + if (data.devices_status == STATUS_PAUSED) + { + float ms_paused; + + hc_timer_get (data.timer_paused, ms_paused); + + data.ms_paused += ms_paused; + + data.devices_status = STATUS_RUNNING; + + log_info ("Resumed"); + } +} + +void bypass () +{ + if (data.devices_status != STATUS_RUNNING) return; + + data.devices_status = STATUS_BYPASS; + + log_info ("Next dictionary / mask in queue selected, bypassing current one"); +} + +void myabort () +{ + if (data.devices_status == STATUS_INIT) return; + if (data.devices_status == STATUS_STARTING) return; + + data.devices_status = STATUS_ABORTED; +} + +void myquit () +{ + if (data.devices_status == STATUS_INIT) return; + if (data.devices_status == STATUS_STARTING) return; + + data.devices_status = STATUS_QUIT; +} + +#ifdef _OCL +uint get_vliw_by_device_name (const char *device_name) +{ + uint vliw = 0; + + if (strcmp (device_name, "Capeverde" ) == 0) vliw = 1; + if (strcmp (device_name, "Pitcairn" ) == 0) vliw = 1; + if (strcmp (device_name, "Tahiti" ) == 0) vliw = 1; + if (strcmp (device_name, "ATI RV710" ) == 0) vliw = 1; + if (strcmp (device_name, "ATI RV730" ) == 0) vliw = 1; + if (strcmp (device_name, "ATI RV770" ) == 0) vliw = 4; + if (strcmp (device_name, "Cayman" ) == 0) vliw = 4; + if (strcmp (device_name, "Devastator" ) == 0) vliw = 4; + if (strcmp (device_name, "Scrapper" ) == 0) vliw = 4; + if (strcmp (device_name, "Barts" ) == 0) vliw = 5; + if (strcmp (device_name, "BeaverCreek" ) == 0) vliw = 5; + if (strcmp (device_name, "Caicos" ) == 0) vliw = 5; + if (strcmp (device_name, "Cedar" ) == 0) vliw = 5; + if (strcmp (device_name, "Cypress" ) == 0) vliw = 5; + if (strcmp (device_name, "Juniper" ) == 0) vliw = 5; + if (strcmp (device_name, "Loveland" ) == 0) vliw = 5; + if (strcmp (device_name, "Redwood" ) == 0) vliw = 5; + if (strcmp (device_name, "Turks" ) == 0) vliw = 5; + if (strcmp (device_name, "WinterPark" ) == 0) vliw = 5; + if (strcmp (device_name, "Oland" ) == 0) vliw = 1; + if (strcmp (device_name, "Cats" ) == 0) vliw = 1; + if (strcmp (device_name, "Raccoons" ) == 0) vliw = 1; + if (strcmp (device_name, "Bonaire" ) == 0) vliw = 1; + if (strcmp (device_name, "Hawaii" ) == 0) vliw = 1; + if (strcmp (device_name, "Spectre" ) == 0) vliw = 1; + if (strcmp (device_name, "Spooky" ) == 0) vliw = 1; + if (strcmp (device_name, "Kalindi" ) == 0) vliw = 1; + if (strcmp (device_name, "Hainan" ) == 0) vliw = 1; + if (strcmp (device_name, "Iceland" ) == 0) vliw = 1; + if (strcmp (device_name, "Tonga" ) == 0) vliw = 1; + if (strcmp (device_name, "Mullins" ) == 0) vliw = 1; + if (strcmp (device_name, "Fiji" ) == 0) vliw = 1; + + if (strncmp (device_name, "ATI Radeon HD 4", 15) == 0) vliw = 1; + if (strncmp (device_name, "ATI Radeon HD 5", 15) == 0) vliw = 5; + if (strncmp (device_name, "ATI Radeon HD 6", 15) == 0) vliw = 4; + if (strncmp (device_name, "ATI Radeon HD 7", 15) == 0) vliw = 4; + if (strncmp (device_name, "ATI Radeon HD 79", 16) == 0) vliw = 1; + if (strncmp (device_name, "ATI Radeon HD 8", 15) == 0) vliw = 1; + if (strncmp (device_name, "AMD Radeon R9", 13) == 0) vliw = 1; + + return vliw; +} +#else +uint get_vliw_by_compute_capability (const uint major, const uint minor) +{ + uint vliw = 0; + + if (major == 1 && minor == 0) vliw = 1; + if (major == 1 && minor == 1) vliw = 1; + if (major == 1 && minor == 2) vliw = 1; + if (major == 1 && minor == 3) vliw = 1; + if (major == 2 && minor == 0) vliw = 1; + if (major == 2 && minor == 1) vliw = 2; + if (major == 3 && minor == 0) vliw = 2; + if (major == 3 && minor == 5) vliw = 2; + if (major == 3 && minor == 7) vliw = 2; + if (major == 5 && minor == 0) vliw = 2; + if (major == 5 && minor == 2) vliw = 2; + + return vliw; +} +#endif + +#ifdef _OCL +void load_kernel (const char *kernel_file, int num_devices, size_t *kernel_lengths, const unsigned char **kernel_sources) +{ + FILE *fp; + + if ((fp = fopen (kernel_file, "rb")) != NULL) + { + struct stat st; + + memset (&st, 0, sizeof (st)); + + stat (kernel_file, &st); + + unsigned char *buf = (unsigned char *) mymalloc (st.st_size + 1); + + size_t num_read = fread (buf, sizeof (unsigned char), st.st_size, fp); + + if (num_read != (size_t) st.st_size) + { + log_error ("ERROR: %s: %s", kernel_file, strerror (errno)); + + exit (-1); + } + + fclose (fp); + + buf[st.st_size] = 0; + + for (int i = 0; i < num_devices; i++) + { + kernel_lengths[i] = (size_t) st.st_size; + + kernel_sources[i] = buf; + } + } + else + { + log_error ("ERROR: %s: %s", kernel_file, strerror (errno)); + + exit (-1); + } + + return; +} + +void writeProgramBin (char *dst, unsigned char *binary, size_t binary_size) +{ + FILE *fp = fopen (dst, "wb"); + + fwrite (binary, sizeof (unsigned char), binary_size, fp); + + fflush (fp); + fclose (fp); +} +#endif + +/** + * restore + */ + +restore_data_t *init_restore (int argc, char **argv) +{ + restore_data_t *rd = (restore_data_t *) mymalloc (sizeof (restore_data_t)); + + if (data.restore_disable == 0) + { + FILE *fp = fopen (data.eff_restore_file, "rb"); + + if (fp) + { + size_t nread = fread (rd, sizeof (restore_data_t), 1, fp); + + if (nread != 1) + { + log_error ("ERROR: cannot read %s", data.eff_restore_file); + + exit (-1); + } + + fclose (fp); + + if (rd->pid) + { + char pidbin[BUFSIZ]; + + int pidbin_len; + + #ifdef _POSIX + memset (pidbin, 0, sizeof (pidbin)); + + snprintf (pidbin, sizeof (pidbin) - 1, "/proc/%d/cmdline", rd->pid); + + FILE *fd = fopen (pidbin, "rb"); + + if (fd) + { + pidbin_len = fread (pidbin, 1, BUFSIZ, fd); + + pidbin[pidbin_len] = 0; + + fclose (fd); + + char *argv0_r = strrchr (argv[0], '/'); + + char *pidbin_r = strrchr (pidbin, '/'); + + if (argv0_r == NULL) argv0_r = argv[0]; + + if (pidbin_r == NULL) pidbin_r = pidbin; + + if (strcmp (argv0_r, pidbin_r) == 0) + { + log_error ("ERROR: already an instance %s running on pid %d", pidbin, rd->pid); + + exit (-1); + } + } + + #elif _WIN + HANDLE hProcess = OpenProcess (PROCESS_ALL_ACCESS, FALSE, rd->pid); + + char pidbin2[BUFSIZ]; + + int pidbin2_len; + + memset (pidbin2, 0, sizeof (pidbin2)); + + pidbin_len = GetModuleFileName (NULL, pidbin, BUFSIZ); + pidbin2_len = GetModuleFileNameEx (hProcess, NULL, pidbin2, BUFSIZ); + + pidbin[pidbin_len] = 0; + pidbin2[pidbin2_len] = 0; + + if (pidbin2_len) + { + if (strcmp (pidbin, pidbin2) == 0) + { + log_error ("ERROR: already an instance %s running on pid %d", pidbin2, rd->pid); + + exit (-1); + } + } + #endif + } + + if (rd->version_bin < RESTORE_MIN) + { + log_error ("ERROR: cannot use outdated %s. Please remove it.", data.eff_restore_file); + + exit (-1); + } + } + } + + memset (rd, 0, sizeof (restore_data_t)); + + rd->version_bin = VERSION_BIN; + + #ifdef _POSIX + rd->pid = getpid (); + #elif _WIN + rd->pid = GetCurrentProcessId (); + #endif + + if (getcwd (rd->cwd, 255) == NULL) + { + myfree (rd); + + return (NULL); + } + + rd->argc = argc; + rd->argv = argv; + + return (rd); +} + +void read_restore (const char *eff_restore_file, restore_data_t *rd) +{ + FILE *fp = fopen (eff_restore_file, "rb"); + + if (fp == NULL) + { + log_error ("ERROR: restore file '%s': %s", eff_restore_file, strerror (errno)); + + exit (-1); + } + + if (fread (rd, sizeof (restore_data_t), 1, fp) != 1) + { + log_error ("ERROR: cannot read %s", eff_restore_file); + + exit (-1); + } + + rd->argv = (char **) mycalloc (rd->argc, sizeof (char *)); + + for (uint i = 0; i < rd->argc; i++) + { + char buf[BUFSIZ]; + + if (fgets (buf, BUFSIZ - 1, fp) == NULL) + { + log_error ("ERROR: cannot read %s", eff_restore_file); + + exit (-1); + } + + size_t len = strlen (buf); + + if (len) buf[len - 1] = 0; + + rd->argv[i] = mystrdup (buf); + } + + fclose (fp); + + char new_cwd[256]; + + char *nwd = getcwd (new_cwd, sizeof (new_cwd)); + + if (nwd == NULL) + { + log_error ("Restore file is corrupted"); + } + + if (strncmp (new_cwd, rd->cwd, sizeof (new_cwd)) != 0) + { + if (getcwd (rd->cwd, sizeof (rd->cwd)) == NULL) + { + log_error ("ERROR: could not determine current user path: %s", strerror (errno)); + + exit (-1); + } + + log_info ("WARNING: Found old restore file, updating path to %s...", new_cwd); + } + + + if (chdir (rd->cwd)) + { + log_error ("ERROR: cannot chdir to %s: %s", rd->cwd, strerror (errno)); + + exit (-1); + } +} + +uint64_t get_lowest_words_done () +{ + uint64_t words_cur = -1; + + for (uint device_id = 0; device_id < data.devices_cnt; device_id++) + { + hc_device_param_t *device_param = &data.devices_param[device_id]; + + const uint64_t words_done = device_param->words_done; + + if (words_done < words_cur) words_cur = words_done; + } + + return words_cur; +} + +void write_restore (const char *new_restore_file, restore_data_t *rd) +{ + uint64_t words_cur = get_lowest_words_done (); + + rd->words_cur = words_cur; + + FILE *fp = fopen (new_restore_file, "wb"); + + if (fp == NULL) + { + log_error ("ERROR: %s: %s", new_restore_file, strerror (errno)); + + exit (-1); + } + + if (setvbuf (fp, NULL, _IONBF, 0)) + { + log_error ("ERROR: setvbuf file '%s': %s", new_restore_file, strerror (errno)); + + exit (-1); + } + + fwrite (rd, sizeof (restore_data_t), 1, fp); + + for (uint i = 0; i < rd->argc; i++) + { + fprintf (fp, "%s", rd->argv[i]); + fputc ('\n', fp); + } + + fflush (fp); + + fsync (fileno (fp)); + + fclose (fp); +} + +void cycle_restore () +{ + const char *eff_restore_file = data.eff_restore_file; + const char *new_restore_file = data.new_restore_file; + + restore_data_t *rd = data.rd; + + write_restore (new_restore_file, rd); + + struct stat st; + + memset (&st, 0, sizeof(st)); + + if (stat (eff_restore_file, &st) == 0) + { + if (unlink (eff_restore_file)) + { + log_info ("WARN: unlink file '%s': %s", eff_restore_file, strerror (errno)); + } + } + + if (rename (new_restore_file, eff_restore_file)) + { + log_info ("WARN: rename file '%s' to '%s': %s", new_restore_file, eff_restore_file, strerror (errno)); + } +} + +/** + * adjustments + */ + +uint set_gpu_accel (uint hash_mode) +{ + switch (hash_mode) + { + case 0: return GET_ACCEL (0); + case 10: return GET_ACCEL (10); + case 11: return GET_ACCEL (11); + case 12: return GET_ACCEL (12); + case 20: return GET_ACCEL (20); + case 21: return GET_ACCEL (21); + case 22: return GET_ACCEL (22); + case 23: return GET_ACCEL (23); + case 30: return GET_ACCEL (30); + case 40: return GET_ACCEL (40); + case 50: return GET_ACCEL (50); + case 60: return GET_ACCEL (60); + case 100: return GET_ACCEL (100); + case 101: return GET_ACCEL (101); + case 110: return GET_ACCEL (110); + case 111: return GET_ACCEL (111); + case 112: return GET_ACCEL (112); + case 120: return GET_ACCEL (120); + case 121: return GET_ACCEL (121); + case 122: return GET_ACCEL (122); + case 124: return GET_ACCEL (124); + case 130: return GET_ACCEL (130); + case 131: return GET_ACCEL (131); + case 132: return GET_ACCEL (132); + case 133: return GET_ACCEL (133); + case 140: return GET_ACCEL (140); + case 141: return GET_ACCEL (141); + case 150: return GET_ACCEL (150); + case 160: return GET_ACCEL (160); + case 190: return GET_ACCEL (190); + case 200: return GET_ACCEL (200); + case 300: return GET_ACCEL (300); + case 400: return GET_ACCEL (400); + case 500: return GET_ACCEL (500); + case 501: return GET_ACCEL (501); + case 900: return GET_ACCEL (900); + case 910: return GET_ACCEL (910); + case 1000: return GET_ACCEL (1000); + case 1100: return GET_ACCEL (1100); + case 1400: return GET_ACCEL (1400); + case 1410: return GET_ACCEL (1410); + case 1420: return GET_ACCEL (1420); + case 1421: return GET_ACCEL (1421); + case 1430: return GET_ACCEL (1430); + case 1440: return GET_ACCEL (1440); + case 1441: return GET_ACCEL (1441); + case 1450: return GET_ACCEL (1450); + case 1460: return GET_ACCEL (1460); + case 1500: return GET_ACCEL (1500); + case 1600: return GET_ACCEL (1600); + case 1700: return GET_ACCEL (1700); + case 1710: return GET_ACCEL (1710); + case 1711: return GET_ACCEL (1711); + case 1720: return GET_ACCEL (1720); + case 1722: return GET_ACCEL (1722); + case 1730: return GET_ACCEL (1730); + case 1731: return GET_ACCEL (1731); + case 1740: return GET_ACCEL (1740); + case 1750: return GET_ACCEL (1750); + case 1760: return GET_ACCEL (1760); + case 1800: return GET_ACCEL (1800); + case 2100: return GET_ACCEL (2100); + case 2400: return GET_ACCEL (2400); + case 2410: return GET_ACCEL (2410); + case 2500: return GET_ACCEL (2500); + case 2600: return GET_ACCEL (2600); + case 2611: return GET_ACCEL (2611); + case 2612: return GET_ACCEL (2612); + case 2711: return GET_ACCEL (2711); + case 2811: return GET_ACCEL (2811); + case 3000: return GET_ACCEL (3000); + case 3100: return GET_ACCEL (3100); + case 3200: return GET_ACCEL (3200); + case 3710: return GET_ACCEL (3710); + case 3711: return GET_ACCEL (3711); + case 3800: return GET_ACCEL (3800); + case 4300: return GET_ACCEL (4300); + case 4400: return GET_ACCEL (4400); + case 4500: return GET_ACCEL (4500); + case 4700: return GET_ACCEL (4700); + case 4800: return GET_ACCEL (4800); + case 4900: return GET_ACCEL (4900); + case 5000: return GET_ACCEL (5000); + case 5100: return GET_ACCEL (5100); + case 5200: return GET_ACCEL (5200); + case 5300: return GET_ACCEL (5300); + case 5400: return GET_ACCEL (5400); + case 5500: return GET_ACCEL (5500); + case 5600: return GET_ACCEL (5600); + case 5700: return GET_ACCEL (5700); + case 5800: return GET_ACCEL (5800); + case 6000: return GET_ACCEL (6000); + case 6100: return GET_ACCEL (6100); + case 6211: return GET_ACCEL (6211); + case 6212: return GET_ACCEL (6212); + case 6213: return GET_ACCEL (6213); + case 6221: return GET_ACCEL (6221); + case 6222: return GET_ACCEL (6222); + case 6223: return GET_ACCEL (6223); + case 6231: return GET_ACCEL (6231); + case 6232: return GET_ACCEL (6232); + case 6233: return GET_ACCEL (6233); + case 6241: return GET_ACCEL (6241); + case 6242: return GET_ACCEL (6242); + case 6243: return GET_ACCEL (6243); + case 6300: return GET_ACCEL (6300); + case 6400: return GET_ACCEL (6400); + case 6500: return GET_ACCEL (6500); + case 6600: return GET_ACCEL (6600); + case 6700: return GET_ACCEL (6700); + case 6800: return GET_ACCEL (6800); + case 6900: return GET_ACCEL (6900); + case 7100: return GET_ACCEL (7100); + case 7200: return GET_ACCEL (7200); + case 7300: return GET_ACCEL (7300); + case 7400: return GET_ACCEL (7400); + case 7500: return GET_ACCEL (7500); + case 7600: return GET_ACCEL (7600); + case 7700: return GET_ACCEL (7700); + case 7800: return GET_ACCEL (7800); + case 7900: return GET_ACCEL (7900); + case 8000: return GET_ACCEL (8000); + case 8100: return GET_ACCEL (8100); + case 8200: return GET_ACCEL (8200); + case 8300: return GET_ACCEL (8300); + case 8400: return GET_ACCEL (8400); + case 8500: return GET_ACCEL (8500); + case 8600: return GET_ACCEL (8600); + case 8700: return GET_ACCEL (8700); + case 8800: return GET_ACCEL (8800); + case 8900: return GET_ACCEL (8900); + case 9000: return GET_ACCEL (9000); + case 9100: return GET_ACCEL (9100); + case 9200: return GET_ACCEL (9200); + case 9300: return GET_ACCEL (9300); + case 9400: return GET_ACCEL (9400); + case 9500: return GET_ACCEL (9500); + case 9600: return GET_ACCEL (9600); + case 9700: return GET_ACCEL (9700); + case 9710: return GET_ACCEL (9710); + case 9720: return GET_ACCEL (9720); + case 9800: return GET_ACCEL (9800); + case 9810: return GET_ACCEL (9810); + case 9820: return GET_ACCEL (9820); + case 9900: return GET_ACCEL (9900); + case 10000: return GET_ACCEL (10000); + case 10100: return GET_ACCEL (10100); + case 10200: return GET_ACCEL (10200); + case 10300: return GET_ACCEL (10300); + case 10400: return GET_ACCEL (10400); + case 10410: return GET_ACCEL (10410); + case 10420: return GET_ACCEL (10420); + case 10500: return GET_ACCEL (10500); + case 10600: return GET_ACCEL (10600); + case 10700: return GET_ACCEL (10700); + case 10800: return GET_ACCEL (10800); + case 10900: return GET_ACCEL (10900); + case 11000: return GET_ACCEL (11000); + case 11100: return GET_ACCEL (11100); + case 11200: return GET_ACCEL (11200); + case 11300: return GET_ACCEL (11300); + case 11400: return GET_ACCEL (11400); + case 11500: return GET_ACCEL (11500); + case 11600: return GET_ACCEL (11600); + case 11700: return GET_ACCEL (11700); + case 11800: return GET_ACCEL (11800); + case 11900: return GET_ACCEL (11900); + case 12000: return GET_ACCEL (12000); + case 12100: return GET_ACCEL (12100); + case 12200: return GET_ACCEL (12200); + case 12300: return GET_ACCEL (12300); + case 12400: return GET_ACCEL (12400); + case 12500: return GET_ACCEL (12500); + case 12600: return GET_ACCEL (12600); + case 12700: return GET_ACCEL (12700); + case 12800: return GET_ACCEL (12800); + } + + return 0; +} + +uint set_gpu_loops (uint hash_mode) +{ + switch (hash_mode) + { + case 0: return GET_LOOPS (0); + case 10: return GET_LOOPS (10); + case 11: return GET_LOOPS (11); + case 12: return GET_LOOPS (12); + case 20: return GET_LOOPS (20); + case 21: return GET_LOOPS (21); + case 22: return GET_LOOPS (22); + case 23: return GET_LOOPS (23); + case 30: return GET_LOOPS (30); + case 40: return GET_LOOPS (40); + case 50: return GET_LOOPS (50); + case 60: return GET_LOOPS (60); + case 100: return GET_LOOPS (100); + case 101: return GET_LOOPS (101); + case 110: return GET_LOOPS (110); + case 111: return GET_LOOPS (111); + case 112: return GET_LOOPS (112); + case 120: return GET_LOOPS (120); + case 121: return GET_LOOPS (121); + case 122: return GET_LOOPS (122); + case 124: return GET_LOOPS (124); + case 130: return GET_LOOPS (130); + case 131: return GET_LOOPS (131); + case 132: return GET_LOOPS (132); + case 133: return GET_LOOPS (133); + case 140: return GET_LOOPS (140); + case 141: return GET_LOOPS (141); + case 150: return GET_LOOPS (150); + case 160: return GET_LOOPS (160); + case 190: return GET_LOOPS (190); + case 200: return GET_LOOPS (200); + case 300: return GET_LOOPS (300); + case 400: return GET_LOOPS (400); + case 500: return GET_LOOPS (500); + case 501: return GET_LOOPS (501); + case 900: return GET_LOOPS (900); + case 910: return GET_LOOPS (910); + case 1000: return GET_LOOPS (1000); + case 1100: return GET_LOOPS (1100); + case 1400: return GET_LOOPS (1400); + case 1410: return GET_LOOPS (1410); + case 1420: return GET_LOOPS (1420); + case 1421: return GET_LOOPS (1421); + case 1430: return GET_LOOPS (1430); + case 1440: return GET_LOOPS (1440); + case 1441: return GET_LOOPS (1441); + case 1450: return GET_LOOPS (1450); + case 1460: return GET_LOOPS (1460); + case 1500: return GET_LOOPS (1500); + case 1600: return GET_LOOPS (1600); + case 1700: return GET_LOOPS (1700); + case 1710: return GET_LOOPS (1710); + case 1711: return GET_LOOPS (1711); + case 1720: return GET_LOOPS (1720); + case 1722: return GET_LOOPS (1722); + case 1730: return GET_LOOPS (1730); + case 1731: return GET_LOOPS (1731); + case 1740: return GET_LOOPS (1740); + case 1750: return GET_LOOPS (1750); + case 1760: return GET_LOOPS (1760); + case 1800: return GET_LOOPS (1800); + case 2100: return GET_LOOPS (2100); + case 2400: return GET_LOOPS (2400); + case 2410: return GET_LOOPS (2410); + case 2500: return GET_LOOPS (2500); + case 2600: return GET_LOOPS (2600); + case 2611: return GET_LOOPS (2611); + case 2612: return GET_LOOPS (2612); + case 2711: return GET_LOOPS (2711); + case 2811: return GET_LOOPS (2811); + case 3000: return GET_LOOPS (3000); + case 3100: return GET_LOOPS (3100); + case 3200: return GET_LOOPS (3200); + case 3710: return GET_LOOPS (3710); + case 3711: return GET_LOOPS (3711); + case 3800: return GET_LOOPS (3800); + case 4300: return GET_LOOPS (4300); + case 4400: return GET_LOOPS (4400); + case 4500: return GET_LOOPS (4500); + case 4700: return GET_LOOPS (4700); + case 4800: return GET_LOOPS (4800); + case 4900: return GET_LOOPS (4900); + case 5000: return GET_LOOPS (5000); + case 5100: return GET_LOOPS (5100); + case 5200: return GET_LOOPS (5200); + case 5300: return GET_LOOPS (5300); + case 5400: return GET_LOOPS (5400); + case 5500: return GET_LOOPS (5500); + case 5600: return GET_LOOPS (5600); + case 5700: return GET_LOOPS (5700); + case 5800: return GET_LOOPS (5800); + case 6000: return GET_LOOPS (6000); + case 6100: return GET_LOOPS (6100); + case 6211: return GET_LOOPS (6211); + case 6212: return GET_LOOPS (6212); + case 6213: return GET_LOOPS (6213); + case 6221: return GET_LOOPS (6221); + case 6222: return GET_LOOPS (6222); + case 6223: return GET_LOOPS (6223); + case 6231: return GET_LOOPS (6231); + case 6232: return GET_LOOPS (6232); + case 6233: return GET_LOOPS (6233); + case 6241: return GET_LOOPS (6241); + case 6242: return GET_LOOPS (6242); + case 6243: return GET_LOOPS (6243); + case 6300: return GET_LOOPS (6300); + case 6400: return GET_LOOPS (6400); + case 6500: return GET_LOOPS (6500); + case 6600: return GET_LOOPS (6600); + case 6700: return GET_LOOPS (6700); + case 6800: return GET_LOOPS (6800); + case 6900: return GET_LOOPS (6900); + case 7100: return GET_LOOPS (7100); + case 7200: return GET_LOOPS (7200); + case 7300: return GET_LOOPS (7300); + case 7400: return GET_LOOPS (7400); + case 7500: return GET_LOOPS (7500); + case 7600: return GET_LOOPS (7600); + case 7700: return GET_LOOPS (7700); + case 7800: return GET_LOOPS (7800); + case 7900: return GET_LOOPS (7900); + case 8000: return GET_LOOPS (8000); + case 8100: return GET_LOOPS (8100); + case 8200: return GET_LOOPS (8200); + case 8300: return GET_LOOPS (8300); + case 8400: return GET_LOOPS (8400); + case 8500: return GET_LOOPS (8500); + case 8600: return GET_LOOPS (8600); + case 8700: return GET_LOOPS (8700); + case 8800: return GET_LOOPS (8800); + case 8900: return GET_LOOPS (8900); + case 9000: return GET_LOOPS (9000); + case 9100: return GET_LOOPS (9100); + case 9200: return GET_LOOPS (9200); + case 9300: return GET_LOOPS (9300); + case 9400: return GET_LOOPS (9400); + case 9500: return GET_LOOPS (9500); + case 9600: return GET_LOOPS (9600); + case 9700: return GET_LOOPS (9700); + case 9710: return GET_LOOPS (9710); + case 9720: return GET_LOOPS (9720); + case 9800: return GET_LOOPS (9800); + case 9810: return GET_LOOPS (9810); + case 9820: return GET_LOOPS (9820); + case 9900: return GET_LOOPS (9900); + case 10000: return GET_LOOPS (10000); + case 10100: return GET_LOOPS (10100); + case 10200: return GET_LOOPS (10200); + case 10300: return GET_LOOPS (10300); + case 10400: return GET_LOOPS (10400); + case 10410: return GET_LOOPS (10410); + case 10420: return GET_LOOPS (10420); + case 10500: return GET_LOOPS (10500); + case 10600: return GET_LOOPS (10600); + case 10700: return GET_LOOPS (10700); + case 10800: return GET_LOOPS (10800); + case 10900: return GET_LOOPS (10900); + case 11000: return GET_LOOPS (11000); + case 11100: return GET_LOOPS (11100); + case 11200: return GET_LOOPS (11200); + case 11300: return GET_LOOPS (11300); + case 11400: return GET_LOOPS (11400); + case 11500: return GET_LOOPS (11500); + case 11600: return GET_LOOPS (11600); + case 11700: return GET_LOOPS (11700); + case 11800: return GET_LOOPS (11800); + case 11900: return GET_LOOPS (11900); + case 12000: return GET_LOOPS (12000); + case 12100: return GET_LOOPS (12100); + case 12200: return GET_LOOPS (12200); + case 12300: return GET_LOOPS (12300); + case 12400: return GET_LOOPS (12400); + case 12500: return GET_LOOPS (12500); + case 12600: return GET_LOOPS (12600); + case 12700: return GET_LOOPS (12700); + case 12800: return GET_LOOPS (12800); + } + + return 0; +} + +/** + * parser + */ + +uint parse_and_store_salt (char *out, char *in, uint salt_len) +{ + char tmp[256]; + + if (salt_len > sizeof(tmp)) + { + return UINT_MAX; + } + + memset (tmp, 0, sizeof (tmp)); + memcpy (tmp, in, salt_len); + + if (data.opts_type & OPTS_TYPE_ST_HEX) + { + if ((salt_len % 2) == 0) + { + uint new_salt_len = salt_len / 2; + + for (uint i = 0, j = 0; i < new_salt_len; i += 1, j += 2) + { + char p0 = tmp[j + 0]; + char p1 = tmp[j + 1]; + + tmp[i] = hex_convert (p1) << 0; + tmp[i] |= hex_convert (p0) << 4; + } + + salt_len = new_salt_len; + } + else + { + return UINT_MAX; + } + } + else if (data.opts_type & OPTS_TYPE_ST_BASE64) + { + salt_len = base64_decode (base64_to_int, in, salt_len, tmp); + } + + memset (tmp + salt_len, 0, sizeof (tmp) - salt_len); + + if (data.opts_type & OPTS_TYPE_ST_UNICODE) + { + if (salt_len < 20) + { + uint *tmp_uint = (uint *) tmp; + + tmp_uint[9] = ((tmp_uint[4] >> 8) & 0x00FF0000) | ((tmp_uint[4] >> 16) & 0x000000FF); + tmp_uint[8] = ((tmp_uint[4] << 8) & 0x00FF0000) | ((tmp_uint[4] >> 0) & 0x000000FF); + tmp_uint[7] = ((tmp_uint[3] >> 8) & 0x00FF0000) | ((tmp_uint[3] >> 16) & 0x000000FF); + tmp_uint[6] = ((tmp_uint[3] << 8) & 0x00FF0000) | ((tmp_uint[3] >> 0) & 0x000000FF); + tmp_uint[5] = ((tmp_uint[2] >> 8) & 0x00FF0000) | ((tmp_uint[2] >> 16) & 0x000000FF); + tmp_uint[4] = ((tmp_uint[2] << 8) & 0x00FF0000) | ((tmp_uint[2] >> 0) & 0x000000FF); + tmp_uint[3] = ((tmp_uint[1] >> 8) & 0x00FF0000) | ((tmp_uint[1] >> 16) & 0x000000FF); + tmp_uint[2] = ((tmp_uint[1] << 8) & 0x00FF0000) | ((tmp_uint[1] >> 0) & 0x000000FF); + tmp_uint[1] = ((tmp_uint[0] >> 8) & 0x00FF0000) | ((tmp_uint[0] >> 16) & 0x000000FF); + tmp_uint[0] = ((tmp_uint[0] << 8) & 0x00FF0000) | ((tmp_uint[0] >> 0) & 0x000000FF); + + salt_len = salt_len * 2; + } + else + { + return UINT_MAX; + } + } + + if (data.opts_type & OPTS_TYPE_ST_LOWER) + { + lowercase (tmp, salt_len); + } + + if (data.opts_type & OPTS_TYPE_ST_UPPER) + { + uppercase (tmp, salt_len); + } + + uint len = salt_len; + + if (data.opts_type & OPTS_TYPE_ST_ADD80) + { + tmp[len++] = 0x80; + } + + if (data.opts_type & OPTS_TYPE_ST_ADD01) + { + tmp[len++] = 0x01; + } + + if (data.opts_type & OPTS_TYPE_ST_GENERATE_LE) + { + uint *tmp_uint = (uint *) tmp; + + uint max = len / 4; + + if (len % 4) max++; + + for (uint i = 0; i < max; i++) + { + tmp_uint[i] = byte_swap_32 (tmp_uint[i]); + } + + // Important: we may need to increase the length of memcpy since + // we don't want to "loose" some swapped bytes (could happen if + // they do not perfectly fit in the 4-byte blocks) + // Memcpy does always copy the bytes in the BE order, but since + // we swapped them, some important bytes could be in positions + // we normally skip with the original len + + if (len % 4) len += 4 - (len % 4); + } + + memcpy (out, tmp, len); + + return (salt_len); +} + +int bcrypt_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf) +{ + if ((input_len < DISPLAY_LEN_MIN_3200) || (input_len > DISPLAY_LEN_MAX_3200)) return (PARSER_GLOBAL_LENGTH); + + if ((memcmp (SIGNATURE_BCRYPT1, input_buf, 4)) && (memcmp (SIGNATURE_BCRYPT2, input_buf, 4)) && (memcmp (SIGNATURE_BCRYPT3, input_buf, 4))) return (PARSER_SIGNATURE_UNMATCHED); + + uint32_t *digest = (uint32_t *) hash_buf->digest; + + salt_t *salt = hash_buf->salt; + + memcpy ((char *) salt->salt_sign, input_buf, 6); + + char *iter_pos = input_buf + 4; + + salt->salt_iter = 1 << atoi (iter_pos); + + char *salt_pos = strchr (iter_pos, '$'); + + if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); + + salt_pos++; + + uint salt_len = 16; + + salt->salt_len = salt_len; + + char tmp_buf[100]; + + memset (tmp_buf, 0, sizeof (tmp_buf)); + + base64_decode (bf64_to_int, salt_pos, 22, tmp_buf); + + char *salt_buf_ptr = (char *) salt->salt_buf; + + memcpy (salt_buf_ptr, tmp_buf, 16); + + salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]); + salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]); + salt->salt_buf[2] = byte_swap_32 (salt->salt_buf[2]); + salt->salt_buf[3] = byte_swap_32 (salt->salt_buf[3]); + + char *hash_pos = salt_pos + 22; + + memset (tmp_buf, 0, sizeof (tmp_buf)); + + base64_decode (bf64_to_int, hash_pos, 31, tmp_buf); + + memcpy (digest, tmp_buf, 24); + + digest[0] = byte_swap_32 (digest[0]); + digest[1] = byte_swap_32 (digest[1]); + digest[2] = byte_swap_32 (digest[2]); + digest[3] = byte_swap_32 (digest[3]); + digest[4] = byte_swap_32 (digest[4]); + digest[5] = byte_swap_32 (digest[5]); + + digest[5] &= ~0xff; // its just 23 not 24 ! + + return (PARSER_OK); +} + +int cisco4_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf) +{ + if ((input_len < DISPLAY_LEN_MIN_5700) || (input_len > DISPLAY_LEN_MAX_5700)) return (PARSER_GLOBAL_LENGTH); + + uint32_t *digest = (uint32_t *) hash_buf->digest; + + char tmp_buf[100]; + + memset (tmp_buf, 0, sizeof (tmp_buf)); + + base64_decode (itoa64_to_int, input_buf, 43, tmp_buf); + + memcpy (digest, tmp_buf, 32); + + digest[0] = byte_swap_32 (digest[0]); + digest[1] = byte_swap_32 (digest[1]); + digest[2] = byte_swap_32 (digest[2]); + digest[3] = byte_swap_32 (digest[3]); + digest[4] = byte_swap_32 (digest[4]); + digest[5] = byte_swap_32 (digest[5]); + digest[6] = byte_swap_32 (digest[6]); + digest[7] = byte_swap_32 (digest[7]); + + digest[0] -= SHA256M_A; + digest[1] -= SHA256M_B; + digest[2] -= SHA256M_C; + digest[3] -= SHA256M_D; + digest[4] -= SHA256M_E; + digest[5] -= SHA256M_F; + digest[6] -= SHA256M_G; + digest[7] -= SHA256M_H; + + return (PARSER_OK); +} + +int lm_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf) +{ + if ((input_len < DISPLAY_LEN_MIN_3000) || (input_len > DISPLAY_LEN_MAX_3000)) return (PARSER_GLOBAL_LENGTH); + + uint32_t *digest = (uint32_t *) hash_buf->digest; + + digest[0] = hex_to_uint (&input_buf[ 0]); + digest[1] = hex_to_uint (&input_buf[ 8]); + + digest[0] = byte_swap_32 (digest[0]); + digest[1] = byte_swap_32 (digest[1]); + + uint tt; + + IP (digest[0], digest[1], tt); + + digest[0] = digest[0]; + digest[1] = digest[1]; + digest[2] = 0; + digest[3] = 0; + + return (PARSER_OK); +} + +int osx1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf) +{ + if ((input_len < DISPLAY_LEN_MIN_122) || (input_len > DISPLAY_LEN_MAX_122)) return (PARSER_GLOBAL_LENGTH); + + uint32_t *digest = (uint32_t *) hash_buf->digest; + + salt_t *salt = hash_buf->salt; + + char *hash_pos = input_buf + 8; + + digest[0] = hex_to_uint (&hash_pos[ 0]); + digest[1] = hex_to_uint (&hash_pos[ 8]); + digest[2] = hex_to_uint (&hash_pos[16]); + digest[3] = hex_to_uint (&hash_pos[24]); + digest[4] = hex_to_uint (&hash_pos[32]); + + digest[0] -= SHA1M_A; + digest[1] -= SHA1M_B; + digest[2] -= SHA1M_C; + digest[3] -= SHA1M_D; + digest[4] -= SHA1M_E; + + uint salt_len = 8; + + char *salt_buf_ptr = (char *) salt->salt_buf; + + salt_len = parse_and_store_salt (salt_buf_ptr, input_buf, salt_len); + + if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH); + + salt->salt_len = salt_len; + + return (PARSER_OK); +} + +int osx512_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf) +{ + if ((input_len < DISPLAY_LEN_MIN_1722) || (input_len > DISPLAY_LEN_MAX_1722)) return (PARSER_GLOBAL_LENGTH); + + uint64_t *digest = (uint64_t *) hash_buf->digest; + + salt_t *salt = hash_buf->salt; + + char *hash_pos = input_buf + 8; + + digest[0] = hex_to_uint64_t (&hash_pos[ 0]); + digest[1] = hex_to_uint64_t (&hash_pos[ 16]); + digest[2] = hex_to_uint64_t (&hash_pos[ 32]); + digest[3] = hex_to_uint64_t (&hash_pos[ 48]); + digest[4] = hex_to_uint64_t (&hash_pos[ 64]); + digest[5] = hex_to_uint64_t (&hash_pos[ 80]); + digest[6] = hex_to_uint64_t (&hash_pos[ 96]); + digest[7] = hex_to_uint64_t (&hash_pos[112]); + + digest[0] -= SHA512M_A; + digest[1] -= SHA512M_B; + digest[2] -= SHA512M_C; + digest[3] -= SHA512M_D; + digest[4] -= SHA512M_E; + digest[5] -= SHA512M_F; + digest[6] -= SHA512M_G; + digest[7] -= SHA512M_H; + + uint salt_len = 8; + + char *salt_buf_ptr = (char *) salt->salt_buf; + + salt_len = parse_and_store_salt (salt_buf_ptr, input_buf, salt_len); + + if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH); + + salt->salt_len = salt_len; + + return (PARSER_OK); +} + +int osc_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf) +{ + if (data.opts_type & OPTS_TYPE_ST_HEX) + { + if ((input_len < DISPLAY_LEN_MIN_21H) || (input_len > DISPLAY_LEN_MAX_21H)) return (PARSER_GLOBAL_LENGTH); + } + else + { + if ((input_len < DISPLAY_LEN_MIN_21) || (input_len > DISPLAY_LEN_MAX_21)) return (PARSER_GLOBAL_LENGTH); + } + + uint32_t *digest = (uint32_t *) hash_buf->digest; + + salt_t *salt = hash_buf->salt; + + digest[0] = hex_to_uint (&input_buf[ 0]); + digest[1] = hex_to_uint (&input_buf[ 8]); + digest[2] = hex_to_uint (&input_buf[16]); + digest[3] = hex_to_uint (&input_buf[24]); + + digest[0] = byte_swap_32 (digest[0]); + digest[1] = byte_swap_32 (digest[1]); + digest[2] = byte_swap_32 (digest[2]); + digest[3] = byte_swap_32 (digest[3]); + + digest[0] -= MD5M_A; + digest[1] -= MD5M_B; + digest[2] -= MD5M_C; + digest[3] -= MD5M_D; + + if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED); + + uint salt_len = input_len - 32 - 1; + + char *salt_buf = input_buf + 32 + 1; + + char *salt_buf_ptr = (char *) salt->salt_buf; + + salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len); + + if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH); + + salt->salt_len = salt_len; + + return (PARSER_OK); +} + +int netscreen_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf) +{ + if (data.opts_type & OPTS_TYPE_ST_HEX) + { + if ((input_len < DISPLAY_LEN_MIN_22H) || (input_len > DISPLAY_LEN_MAX_22H)) return (PARSER_GLOBAL_LENGTH); + } + else + { + if ((input_len < DISPLAY_LEN_MIN_22) || (input_len > DISPLAY_LEN_MAX_22)) return (PARSER_GLOBAL_LENGTH); + } + + // unscramble + + char clean_input_buf[32]; + + char sig[6] = { 'n', 'r', 'c', 's', 't', 'n' }; + int pos[6] = { 0, 6, 12, 17, 23, 29 }; + + for (int i = 0, j = 0, k = 0; i < 30; i++) + { + if (i == pos[j]) + { + if (sig[j] != input_buf[i]) return (PARSER_SIGNATURE_UNMATCHED); + + j++; + } + else + { + clean_input_buf[k] = input_buf[i]; + + k++; + } + } + + // base64 decode + + uint32_t *digest = (uint32_t *) hash_buf->digest; + + salt_t *salt = hash_buf->salt; + + char a, b, c, d, e, f; + + a = base64_to_int (clean_input_buf[ 0] & 0x7f); + b = base64_to_int (clean_input_buf[ 1] & 0x7f); + c = base64_to_int (clean_input_buf[ 2] & 0x7f); + d = base64_to_int (clean_input_buf[ 3] & 0x7f); + e = base64_to_int (clean_input_buf[ 4] & 0x7f); + f = base64_to_int (clean_input_buf[ 5] & 0x7f); + + digest[0] = (((a << 12) | (b << 6) | (c)) << 16) + | (((d << 12) | (e << 6) | (f)) << 0); + + a = base64_to_int (clean_input_buf[ 6] & 0x7f); + b = base64_to_int (clean_input_buf[ 7] & 0x7f); + c = base64_to_int (clean_input_buf[ 8] & 0x7f); + d = base64_to_int (clean_input_buf[ 9] & 0x7f); + e = base64_to_int (clean_input_buf[10] & 0x7f); + f = base64_to_int (clean_input_buf[11] & 0x7f); + + digest[1] = (((a << 12) | (b << 6) | (c)) << 16) + | (((d << 12) | (e << 6) | (f)) << 0); + + a = base64_to_int (clean_input_buf[12] & 0x7f); + b = base64_to_int (clean_input_buf[13] & 0x7f); + c = base64_to_int (clean_input_buf[14] & 0x7f); + d = base64_to_int (clean_input_buf[15] & 0x7f); + e = base64_to_int (clean_input_buf[16] & 0x7f); + f = base64_to_int (clean_input_buf[17] & 0x7f); + + digest[2] = (((a << 12) | (b << 6) | (c)) << 16) + | (((d << 12) | (e << 6) | (f)) << 0); + + a = base64_to_int (clean_input_buf[18] & 0x7f); + b = base64_to_int (clean_input_buf[19] & 0x7f); + c = base64_to_int (clean_input_buf[20] & 0x7f); + d = base64_to_int (clean_input_buf[21] & 0x7f); + e = base64_to_int (clean_input_buf[22] & 0x7f); + f = base64_to_int (clean_input_buf[23] & 0x7f); + + digest[3] = (((a << 12) | (b << 6) | (c)) << 16) + | (((d << 12) | (e << 6) | (f)) << 0); + + digest[0] = byte_swap_32 (digest[0]); + digest[1] = byte_swap_32 (digest[1]); + digest[2] = byte_swap_32 (digest[2]); + digest[3] = byte_swap_32 (digest[3]); + + digest[0] -= MD5M_A; + digest[1] -= MD5M_B; + digest[2] -= MD5M_C; + digest[3] -= MD5M_D; + + if (input_buf[30] != ':') return (PARSER_SEPARATOR_UNMATCHED); + + uint salt_len = input_len - 30 - 1; + + char *salt_buf = input_buf + 30 + 1; + + char *salt_buf_ptr = (char *) salt->salt_buf; + + salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len); + + if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH); + + salt->salt_len = salt_len; + + memcpy (salt_buf_ptr + salt_len, ":Administration Tools:", 22); + + salt->salt_len += 22; + + return (PARSER_OK); +} + +int smf_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf) +{ + if (data.opts_type & OPTS_TYPE_ST_HEX) + { + if ((input_len < DISPLAY_LEN_MIN_121H) || (input_len > DISPLAY_LEN_MAX_121H)) return (PARSER_GLOBAL_LENGTH); + } + else + { + if ((input_len < DISPLAY_LEN_MIN_121) || (input_len > DISPLAY_LEN_MAX_121)) return (PARSER_GLOBAL_LENGTH); + } + + uint32_t *digest = (uint32_t *) hash_buf->digest; + + salt_t *salt = hash_buf->salt; + + digest[0] = hex_to_uint (&input_buf[ 0]); + digest[1] = hex_to_uint (&input_buf[ 8]); + digest[2] = hex_to_uint (&input_buf[16]); + digest[3] = hex_to_uint (&input_buf[24]); + digest[4] = hex_to_uint (&input_buf[32]); + + digest[0] -= SHA1M_A; + digest[1] -= SHA1M_B; + digest[2] -= SHA1M_C; + digest[3] -= SHA1M_D; + digest[4] -= SHA1M_E; + + if (input_buf[40] != data.separator) return (PARSER_SEPARATOR_UNMATCHED); + + uint salt_len = input_len - 40 - 1; + + char *salt_buf = input_buf + 40 + 1; + + char *salt_buf_ptr = (char *) salt->salt_buf; + + salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len); + + if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH); + + salt->salt_len = salt_len; + + return (PARSER_OK); +} + +int dcc2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf) +{ + if (data.opts_type & OPTS_TYPE_ST_HEX) + { + if ((input_len < DISPLAY_LEN_MIN_2100H) || (input_len > DISPLAY_LEN_MAX_2100H)) return (PARSER_GLOBAL_LENGTH); + } + else + { + if ((input_len < DISPLAY_LEN_MIN_2100) || (input_len > DISPLAY_LEN_MAX_2100)) return (PARSER_GLOBAL_LENGTH); + } + + if (memcmp (SIGNATURE_DCC2, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED); + + char *iter_pos = input_buf + 6; + + salt_t *salt = hash_buf->salt; + + salt->salt_iter = atoi (iter_pos) - 1; + + char *salt_pos = strchr (iter_pos, '#'); + + if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); + + salt_pos++; + + char *digest_pos = strchr (salt_pos, '#'); + + if (digest_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); + + digest_pos++; + + uint salt_len = digest_pos - salt_pos - 1; + + uint32_t *digest = (uint32_t *) hash_buf->digest; + + digest[0] = hex_to_uint (&digest_pos[ 0]); + digest[1] = hex_to_uint (&digest_pos[ 8]); + digest[2] = hex_to_uint (&digest_pos[16]); + digest[3] = hex_to_uint (&digest_pos[24]); + + char *salt_buf_ptr = (char *) salt->salt_buf; + + salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len); + + if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH); + + salt->salt_len = salt_len; + + return (PARSER_OK); +} + +int wpa_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf) +{ + uint32_t *digest = (uint32_t *) hash_buf->digest; + + salt_t *salt = hash_buf->salt; + + wpa_t *wpa = (wpa_t *) hash_buf->esalt; + + hccap_t in; + + memcpy (&in, input_buf, input_len); + + if (in.eapol_size < 1 || in.eapol_size > 255) return (PARSER_HCCAP_EAPOL_SIZE); + + memcpy (digest, in.keymic, 16); + + /* + http://www.one-net.eu/jsw/j_sec/m_ptype.html + The phrase "Pairwise key expansion" + Access Point Address (Referred to as Authenticator Address AA) + Supplicant Address (referred to as Supplicant Address SA) + Access Point Nonce (referred to as Authenticator Anonce) + Wireless Device Nonce (referred to as Supplicant Nonce Snonce) + */ + + uint salt_len = strlen (in.essid); + + memcpy (salt->salt_buf, in.essid, salt_len); + + salt->salt_len = salt_len; + + salt->salt_iter = ROUNDS_WPA2 - 1; + + unsigned char *pke_ptr = (unsigned char *) wpa->pke; + + memcpy (pke_ptr, "Pairwise key expansion", 23); + + if (memcmp (in.mac1, in.mac2, 6) < 0) + { + memcpy (pke_ptr + 23, in.mac1, 6); + memcpy (pke_ptr + 29, in.mac2, 6); + } + else + { + memcpy (pke_ptr + 23, in.mac2, 6); + memcpy (pke_ptr + 29, in.mac1, 6); + } + + if (memcmp (in.nonce1, in.nonce2, 32) < 0) + { + memcpy (pke_ptr + 35, in.nonce1, 32); + memcpy (pke_ptr + 67, in.nonce2, 32); + } + else + { + memcpy (pke_ptr + 35, in.nonce2, 32); + memcpy (pke_ptr + 67, in.nonce1, 32); + } + + for (int i = 0; i < 25; i++) + { + wpa->pke[i] = byte_swap_32 (wpa->pke[i]); + } + + wpa->keyver = in.keyver; + + if (wpa->keyver > 255) + { + log_info ("ATTENTION!"); + log_info (" The WPA/WPA2 key version in your .hccap file is invalid!"); + log_info (" This could be due to a recent aircrack-ng bug."); + log_info (" The key version was automatically reset to a reasonable value."); + log_info (""); + + wpa->keyver &= 0xff; + } + + wpa->eapol_size = in.eapol_size; + + unsigned char *eapol_ptr = (unsigned char *) wpa->eapol; + + memcpy (eapol_ptr, in.eapol, wpa->eapol_size); + + memset (eapol_ptr + wpa->eapol_size, 0, 256 - wpa->eapol_size); + + eapol_ptr[wpa->eapol_size] = (unsigned char) 0x80; + + if (wpa->keyver == 1) + { + // nothing to do + } + else + { + digest[0] = byte_swap_32 (digest[0]); + digest[1] = byte_swap_32 (digest[1]); + digest[2] = byte_swap_32 (digest[2]); + digest[3] = byte_swap_32 (digest[3]); + + for (int i = 0; i < 64; i++) + { + wpa->eapol[i] = byte_swap_32 (wpa->eapol[i]); + } + } + + salt->salt_buf[10] = digest[1]; + salt->salt_buf[11] = digest[2]; + + return (PARSER_OK); +} + +int psafe2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf) +{ + uint32_t *digest = (uint32_t *) hash_buf->digest; + + salt_t *salt = hash_buf->salt; + + if (input_len == 0) + { + log_error ("Password Safe v2 container not specified"); + + exit (-1); + } + + FILE *fp = fopen (input_buf, "rb"); + + if (fp == NULL) + { + log_error ("%s: %s", input_buf, strerror (errno)); + + exit (-1); + } + + typedef struct + { + uint32_t random[2]; + uint32_t hash[5]; + uint32_t salt[5]; // unused, but makes better valid check + uint32_t iv[2]; // unused, but makes better valid check + + } psafe2_hdr; + + psafe2_hdr buf; + + int n = fread (&buf, sizeof (psafe2_hdr), 1, fp); + + fclose (fp); + + if (n != 1) return (PARSER_PSAFE2_FILE_SIZE); + + salt->salt_buf[0] = buf.random[0]; + salt->salt_buf[1] = buf.random[1]; + + salt->salt_len = 8; + salt->salt_iter = 1000; + + digest[0] = byte_swap_32 (buf.hash[0]); + digest[1] = byte_swap_32 (buf.hash[1]); + digest[2] = byte_swap_32 (buf.hash[2]); + digest[3] = byte_swap_32 (buf.hash[3]); + digest[4] = byte_swap_32 (buf.hash[4]); + + return (PARSER_OK); +} + +int psafe3_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf) +{ + uint32_t *digest = (uint32_t *) hash_buf->digest; + + salt_t *salt = hash_buf->salt; + + if (input_len == 0) + { + log_error (".psafe3 not specified"); + + exit (-1); + } + + FILE *fp = fopen (input_buf, "rb"); + + if (fp == NULL) + { + log_error ("%s: %s", input_buf, strerror (errno)); + + exit (-1); + } + + psafe3_t in; + + int n = fread (&in, sizeof (psafe3_t), 1, fp); + + fclose (fp); + + data.hashfile = input_buf; // we will need this in case it gets cracked + + if (memcmp (SIGNATURE_PSAFE3, in.signature, 4)) return (PARSER_SIGNATURE_UNMATCHED); + + if (n != 1) return (PARSER_PSAFE3_FILE_SIZE); + + salt->salt_iter = in.iterations + 1; + + salt->salt_buf[0] = in.salt_buf[0]; + salt->salt_buf[1] = in.salt_buf[1]; + salt->salt_buf[2] = in.salt_buf[2]; + salt->salt_buf[3] = in.salt_buf[3]; + salt->salt_buf[4] = in.salt_buf[4]; + salt->salt_buf[5] = in.salt_buf[5]; + salt->salt_buf[6] = in.salt_buf[6]; + salt->salt_buf[7] = in.salt_buf[7]; + + salt->salt_len = 32; + + digest[0] = in.hash_buf[0]; + digest[1] = in.hash_buf[1]; + digest[2] = in.hash_buf[2]; + digest[3] = in.hash_buf[3]; + digest[4] = in.hash_buf[4]; + digest[5] = in.hash_buf[5]; + digest[6] = in.hash_buf[6]; + digest[7] = in.hash_buf[7]; + + digest[0] = byte_swap_32 (digest[0]); + digest[1] = byte_swap_32 (digest[1]); + digest[2] = byte_swap_32 (digest[2]); + digest[3] = byte_swap_32 (digest[3]); + digest[4] = byte_swap_32 (digest[4]); + digest[5] = byte_swap_32 (digest[5]); + digest[6] = byte_swap_32 (digest[6]); + digest[7] = byte_swap_32 (digest[7]); + + return (PARSER_OK); +} + +int phpass_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf) +{ + if ((input_len < DISPLAY_LEN_MIN_400) || (input_len > DISPLAY_LEN_MAX_400)) return (PARSER_GLOBAL_LENGTH); + + if ((memcmp (SIGNATURE_PHPASS1, input_buf, 3)) && (memcmp (SIGNATURE_PHPASS2, input_buf, 3))) return (PARSER_SIGNATURE_UNMATCHED); + + uint32_t *digest = (uint32_t *) hash_buf->digest; + + salt_t *salt = hash_buf->salt; + + char *iter_pos = input_buf + 3; + + uint salt_iter = 1 << itoa64_to_int (iter_pos[0]); + + if (salt_iter > 0x80000000) return (PARSER_SALT_ITERATION); + + memcpy ((char *) salt->salt_sign, input_buf, 4); + + salt->salt_iter = salt_iter; + + char *salt_pos = iter_pos + 1; + + uint salt_len = 8; + + memcpy ((char *) salt->salt_buf, salt_pos, salt_len); + + salt->salt_len = salt_len; + + char *hash_pos = salt_pos + salt_len; + + phpass_decode ((unsigned char *) digest, (unsigned char *) hash_pos); + + return (PARSER_OK); +} + +int md5crypt_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf) +{ + if (memcmp (SIGNATURE_MD5CRYPT, input_buf, 3)) return (PARSER_SIGNATURE_UNMATCHED); + + uint32_t *digest = (uint32_t *) hash_buf->digest; + + salt_t *salt = hash_buf->salt; + + char *salt_pos = input_buf + 3; + + uint iterations_len = 0; + + if (memcmp (salt_pos, "rounds=", 7) == 0) + { + salt_pos += 7; + + for (iterations_len = 0; salt_pos[0] >= '0' && salt_pos[0] <= '9' && iterations_len < 7; iterations_len++, salt_pos += 1) continue; + + if (iterations_len == 0 ) return (PARSER_SALT_ITERATION); + if (salt_pos[0] != '$') return (PARSER_SIGNATURE_UNMATCHED); + + salt_pos[0] = 0x0; + + salt->salt_iter = atoi (salt_pos - iterations_len); + + salt_pos += 1; + + iterations_len += 8; + } + else + { + salt->salt_iter = ROUNDS_MD5CRYPT; + } + + if ((input_len < DISPLAY_LEN_MIN_500) || (input_len > (DISPLAY_LEN_MAX_500 + iterations_len))) return (PARSER_GLOBAL_LENGTH); + + char *hash_pos = strchr (salt_pos, '$'); + + if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); + + uint salt_len = hash_pos - salt_pos; + + if (salt_len > 8) return (PARSER_SALT_LENGTH); + + memcpy ((char *) salt->salt_buf, salt_pos, salt_len); + + salt->salt_len = salt_len; + + hash_pos++; + + uint hash_len = input_len - 3 - iterations_len - salt_len - 1; + + if (hash_len != 22) return (PARSER_HASH_LENGTH); + + md5crypt_decode ((unsigned char *) digest, (unsigned char *) hash_pos); + + return (PARSER_OK); +} + +int md5apr1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf) +{ + if (memcmp (SIGNATURE_MD5APR1, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED); + + uint32_t *digest = (uint32_t *) hash_buf->digest; + + salt_t *salt = hash_buf->salt; + + char *salt_pos = input_buf + 6; + + uint iterations_len = 0; + + if (memcmp (salt_pos, "rounds=", 7) == 0) + { + salt_pos += 7; + + for (iterations_len = 0; salt_pos[0] >= '0' && salt_pos[0] <= '9' && iterations_len < 7; iterations_len++, salt_pos += 1) continue; + + if (iterations_len == 0 ) return (PARSER_SALT_ITERATION); + if (salt_pos[0] != '$') return (PARSER_SIGNATURE_UNMATCHED); + + salt_pos[0] = 0x0; + + salt->salt_iter = atoi (salt_pos - iterations_len); + + salt_pos += 1; + + iterations_len += 8; + } + else + { + salt->salt_iter = ROUNDS_MD5CRYPT; + } + + if ((input_len < DISPLAY_LEN_MIN_1600) || (input_len > DISPLAY_LEN_MAX_1600 + iterations_len)) return (PARSER_GLOBAL_LENGTH); + + char *hash_pos = strchr (salt_pos, '$'); + + if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); + + uint salt_len = hash_pos - salt_pos; + + if (salt_len > 8) return (PARSER_SALT_LENGTH); + + memcpy ((char *) salt->salt_buf, salt_pos, salt_len); + + salt->salt_len = salt_len; + + hash_pos++; + + md5crypt_decode ((unsigned char *) digest, (unsigned char *) hash_pos); + + return (PARSER_OK); +} + +int episerver_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf) +{ + if ((input_len < DISPLAY_LEN_MIN_141) || (input_len > DISPLAY_LEN_MAX_141)) return (PARSER_GLOBAL_LENGTH); + + if (memcmp (SIGNATURE_EPISERVER, input_buf, 14)) return (PARSER_SIGNATURE_UNMATCHED); + + uint32_t *digest = (uint32_t *) hash_buf->digest; + + salt_t *salt = hash_buf->salt; + + char *salt_pos = input_buf + 14; + + char *hash_pos = strchr (salt_pos, '*'); + + if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); + + hash_pos++; + + uint salt_len = hash_pos - salt_pos - 1; + + char *salt_buf_ptr = (char *) salt->salt_buf; + + salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len); + + if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH); + + salt->salt_len = salt_len; + + char tmp_buf[100]; memset (tmp_buf, 0, sizeof (tmp_buf)); + + base64_decode (base64_to_int, hash_pos, 27, tmp_buf); + + memcpy (digest, tmp_buf, 20); + + digest[0] = byte_swap_32 (digest[0]); + digest[1] = byte_swap_32 (digest[1]); + digest[2] = byte_swap_32 (digest[2]); + digest[3] = byte_swap_32 (digest[3]); + digest[4] = byte_swap_32 (digest[4]); + + digest[0] -= SHA1M_A; + digest[1] -= SHA1M_B; + digest[2] -= SHA1M_C; + digest[3] -= SHA1M_D; + digest[4] -= SHA1M_E; + + return (PARSER_OK); +} + +int descrypt_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf) +{ + if ((input_len < DISPLAY_LEN_MIN_1500) || (input_len > DISPLAY_LEN_MAX_1500)) return (PARSER_GLOBAL_LENGTH); + + unsigned char c12 = itoa64_to_int (input_buf[12]); + + if (c12 & 3) return (PARSER_HASH_VALUE); + + uint32_t *digest = (uint32_t *) hash_buf->digest; + + salt_t *salt = hash_buf->salt; + + // for ascii_digest + salt->salt_sign[0] = input_buf[0]; + salt->salt_sign[1] = input_buf[1]; + + salt->salt_buf[0] = itoa64_to_int (input_buf[0]) + | itoa64_to_int (input_buf[1]) << 6; + + salt->salt_len = 2; + + char tmp_buf[100]; + + memset (tmp_buf, 0, sizeof (tmp_buf)); + + base64_decode (itoa64_to_int, input_buf + 2, 11, tmp_buf); + + memcpy (digest, tmp_buf, 8); + + uint tt; + + IP (digest[0], digest[1], tt); + + digest[2] = 0; + digest[3] = 0; + + return (PARSER_OK); +} + +int md4_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf) +{ + if ((input_len < DISPLAY_LEN_MIN_900) || (input_len > DISPLAY_LEN_MAX_900)) return (PARSER_GLOBAL_LENGTH); + + uint32_t *digest = (uint32_t *) hash_buf->digest; + + digest[0] = hex_to_uint (&input_buf[ 0]); + digest[1] = hex_to_uint (&input_buf[ 8]); + digest[2] = hex_to_uint (&input_buf[16]); + digest[3] = hex_to_uint (&input_buf[24]); + + digest[0] = byte_swap_32 (digest[0]); + digest[1] = byte_swap_32 (digest[1]); + digest[2] = byte_swap_32 (digest[2]); + digest[3] = byte_swap_32 (digest[3]); + + digest[0] -= MD4M_A; + digest[1] -= MD4M_B; + digest[2] -= MD4M_C; + digest[3] -= MD4M_D; + + return (PARSER_OK); +} + +int md4s_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf) +{ + if (data.opts_type & OPTS_TYPE_ST_HEX) + { + if ((input_len < DISPLAY_LEN_MIN_910H) || (input_len > DISPLAY_LEN_MAX_910H)) return (PARSER_GLOBAL_LENGTH); + } + else + { + if ((input_len < DISPLAY_LEN_MIN_910) || (input_len > DISPLAY_LEN_MAX_910)) return (PARSER_GLOBAL_LENGTH); + } + + uint32_t *digest = (uint32_t *) hash_buf->digest; + + salt_t *salt = hash_buf->salt; + + digest[0] = hex_to_uint (&input_buf[ 0]); + digest[1] = hex_to_uint (&input_buf[ 8]); + digest[2] = hex_to_uint (&input_buf[16]); + digest[3] = hex_to_uint (&input_buf[24]); + + digest[0] = byte_swap_32 (digest[0]); + digest[1] = byte_swap_32 (digest[1]); + digest[2] = byte_swap_32 (digest[2]); + digest[3] = byte_swap_32 (digest[3]); + + digest[0] -= MD4M_A; + digest[1] -= MD4M_B; + digest[2] -= MD4M_C; + digest[3] -= MD4M_D; + + if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED); + + uint salt_len = input_len - 32 - 1; + + char *salt_buf = input_buf + 32 + 1; + + char *salt_buf_ptr = (char *) salt->salt_buf; + + salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len); + + if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH); + + salt->salt_len = salt_len; + + return (PARSER_OK); +} + +int md5_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf) +{ + if ((input_len < DISPLAY_LEN_MIN_0) || (input_len > DISPLAY_LEN_MAX_0)) return (PARSER_GLOBAL_LENGTH); + + uint32_t *digest = (uint32_t *) hash_buf->digest; + + digest[0] = hex_to_uint (&input_buf[ 0]); + digest[1] = hex_to_uint (&input_buf[ 8]); + digest[2] = hex_to_uint (&input_buf[16]); + digest[3] = hex_to_uint (&input_buf[24]); + + digest[0] = byte_swap_32 (digest[0]); + digest[1] = byte_swap_32 (digest[1]); + digest[2] = byte_swap_32 (digest[2]); + digest[3] = byte_swap_32 (digest[3]); + + digest[0] -= MD5M_A; + digest[1] -= MD5M_B; + digest[2] -= MD5M_C; + digest[3] -= MD5M_D; + + return (PARSER_OK); +} + +int md5half_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf) +{ + if ((input_len < DISPLAY_LEN_MIN_5100) || (input_len > DISPLAY_LEN_MAX_5100)) return (PARSER_GLOBAL_LENGTH); + + uint32_t *digest = (uint32_t *) hash_buf->digest; + + digest[0] = hex_to_uint (&input_buf[0]); + digest[1] = hex_to_uint (&input_buf[8]); + digest[2] = 0; + digest[3] = 0; + + digest[0] = byte_swap_32 (digest[0]); + digest[1] = byte_swap_32 (digest[1]); + + return (PARSER_OK); +} + +int md5s_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf) +{ + if (data.opts_type & OPTS_TYPE_ST_HEX) + { + if ((input_len < DISPLAY_LEN_MIN_10H) || (input_len > DISPLAY_LEN_MAX_10H)) return (PARSER_GLOBAL_LENGTH); + } + else + { + if ((input_len < DISPLAY_LEN_MIN_10) || (input_len > DISPLAY_LEN_MAX_10)) return (PARSER_GLOBAL_LENGTH); + } + + uint32_t *digest = (uint32_t *) hash_buf->digest; + + salt_t *salt = hash_buf->salt; + + digest[0] = hex_to_uint (&input_buf[ 0]); + digest[1] = hex_to_uint (&input_buf[ 8]); + digest[2] = hex_to_uint (&input_buf[16]); + digest[3] = hex_to_uint (&input_buf[24]); + + digest[0] = byte_swap_32 (digest[0]); + digest[1] = byte_swap_32 (digest[1]); + digest[2] = byte_swap_32 (digest[2]); + digest[3] = byte_swap_32 (digest[3]); + + digest[0] -= MD5M_A; + digest[1] -= MD5M_B; + digest[2] -= MD5M_C; + digest[3] -= MD5M_D; + + if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED); + + uint salt_len = input_len - 32 - 1; + + char *salt_buf = input_buf + 32 + 1; + + char *salt_buf_ptr = (char *) salt->salt_buf; + + salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len); + + if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH); + + salt->salt_len = salt_len; + + return (PARSER_OK); +} + +int md5pix_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf) +{ + if ((input_len < DISPLAY_LEN_MIN_2400) || (input_len > DISPLAY_LEN_MAX_2400)) return (PARSER_GLOBAL_LENGTH); + + uint32_t *digest = (uint32_t *) hash_buf->digest; + + digest[0] = itoa64_to_int (input_buf[ 0]) << 0 + | itoa64_to_int (input_buf[ 1]) << 6 + | itoa64_to_int (input_buf[ 2]) << 12 + | itoa64_to_int (input_buf[ 3]) << 18; + digest[1] = itoa64_to_int (input_buf[ 4]) << 0 + | itoa64_to_int (input_buf[ 5]) << 6 + | itoa64_to_int (input_buf[ 6]) << 12 + | itoa64_to_int (input_buf[ 7]) << 18; + digest[2] = itoa64_to_int (input_buf[ 8]) << 0 + | itoa64_to_int (input_buf[ 9]) << 6 + | itoa64_to_int (input_buf[10]) << 12 + | itoa64_to_int (input_buf[11]) << 18; + digest[3] = itoa64_to_int (input_buf[12]) << 0 + | itoa64_to_int (input_buf[13]) << 6 + | itoa64_to_int (input_buf[14]) << 12 + | itoa64_to_int (input_buf[15]) << 18; + + digest[0] -= MD5M_A; + digest[1] -= MD5M_B; + digest[2] -= MD5M_C; + digest[3] -= MD5M_D; + + digest[0] &= 0x00ffffff; + digest[1] &= 0x00ffffff; + digest[2] &= 0x00ffffff; + digest[3] &= 0x00ffffff; + + return (PARSER_OK); +} + +int md5asa_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf) +{ + if (data.opts_type & OPTS_TYPE_ST_HEX) + { + if ((input_len < DISPLAY_LEN_MIN_2410H) || (input_len > DISPLAY_LEN_MAX_2410H)) return (PARSER_GLOBAL_LENGTH); + } + else + { + if ((input_len < DISPLAY_LEN_MIN_2410) || (input_len > DISPLAY_LEN_MAX_2410)) return (PARSER_GLOBAL_LENGTH); + } + + uint32_t *digest = (uint32_t *) hash_buf->digest; + + salt_t *salt = hash_buf->salt; + + digest[0] = itoa64_to_int (input_buf[ 0]) << 0 + | itoa64_to_int (input_buf[ 1]) << 6 + | itoa64_to_int (input_buf[ 2]) << 12 + | itoa64_to_int (input_buf[ 3]) << 18; + digest[1] = itoa64_to_int (input_buf[ 4]) << 0 + | itoa64_to_int (input_buf[ 5]) << 6 + | itoa64_to_int (input_buf[ 6]) << 12 + | itoa64_to_int (input_buf[ 7]) << 18; + digest[2] = itoa64_to_int (input_buf[ 8]) << 0 + | itoa64_to_int (input_buf[ 9]) << 6 + | itoa64_to_int (input_buf[10]) << 12 + | itoa64_to_int (input_buf[11]) << 18; + digest[3] = itoa64_to_int (input_buf[12]) << 0 + | itoa64_to_int (input_buf[13]) << 6 + | itoa64_to_int (input_buf[14]) << 12 + | itoa64_to_int (input_buf[15]) << 18; + + digest[0] -= MD5M_A; + digest[1] -= MD5M_B; + digest[2] -= MD5M_C; + digest[3] -= MD5M_D; + + digest[0] &= 0x00ffffff; + digest[1] &= 0x00ffffff; + digest[2] &= 0x00ffffff; + digest[3] &= 0x00ffffff; + + if (input_buf[16] != data.separator) return (PARSER_SEPARATOR_UNMATCHED); + + uint salt_len = input_len - 16 - 1; + + char *salt_buf = input_buf + 16 + 1; + + char *salt_buf_ptr = (char *) salt->salt_buf; + + salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len); + + if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH); + + salt->salt_len = salt_len; + + return (PARSER_OK); +} + +void transform_netntlmv1_key (const uint8_t *nthash, uint8_t *key) +{ + key[0] = (nthash[0] >> 0); + key[1] = (nthash[0] << 7) | (nthash[1] >> 1); + key[2] = (nthash[1] << 6) | (nthash[2] >> 2); + key[3] = (nthash[2] << 5) | (nthash[3] >> 3); + key[4] = (nthash[3] << 4) | (nthash[4] >> 4); + key[5] = (nthash[4] << 3) | (nthash[5] >> 5); + key[6] = (nthash[5] << 2) | (nthash[6] >> 6); + key[7] = (nthash[6] << 1); + + key[0] |= 0x01; + key[1] |= 0x01; + key[2] |= 0x01; + key[3] |= 0x01; + key[4] |= 0x01; + key[5] |= 0x01; + key[6] |= 0x01; + key[7] |= 0x01; +} + +int netntlmv1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf) +{ + if ((input_len < DISPLAY_LEN_MIN_5500) || (input_len > DISPLAY_LEN_MAX_5500)) return (PARSER_GLOBAL_LENGTH); + + uint32_t *digest = (uint32_t *) hash_buf->digest; + + salt_t *salt = hash_buf->salt; + + netntlm_t *netntlm = (netntlm_t *) hash_buf->esalt; + + /** + * parse line + */ + + char *user_pos = input_buf; + + char *unused_pos = strchr (user_pos, ':'); + + if (unused_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); + + uint user_len = unused_pos - user_pos; + + if (user_len > 60) return (PARSER_SALT_LENGTH); + + unused_pos++; + + char *domain_pos = strchr (unused_pos, ':'); + + if (domain_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); + + uint unused_len = domain_pos - unused_pos; + + if (unused_len != 0) return (PARSER_SALT_LENGTH); + + domain_pos++; + + char *srvchall_pos = strchr (domain_pos, ':'); + + if (srvchall_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); + + uint domain_len = srvchall_pos - domain_pos; + + if (domain_len > 45) return (PARSER_SALT_LENGTH); + + srvchall_pos++; + + char *hash_pos = strchr (srvchall_pos, ':'); + + if (srvchall_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); + + uint srvchall_len = hash_pos - srvchall_pos; + + // if (srvchall_len != 0) return (PARSER_SALT_LENGTH); + + hash_pos++; + + char *clichall_pos = strchr (hash_pos, ':'); + + if (clichall_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); + + uint hash_len = clichall_pos - hash_pos; + + if (hash_len != 48) return (PARSER_HASH_LENGTH); + + clichall_pos++; + + uint clichall_len = input_len - user_len - 1 - unused_len - 1 - domain_len - 1 - srvchall_len - 1 - hash_len - 1; + + if (clichall_len != 16) return (PARSER_SALT_LENGTH); + + /** + * store some data for later use + */ + + netntlm->user_len = user_len * 2; + netntlm->domain_len = domain_len * 2; + netntlm->srvchall_len = srvchall_len / 2; + netntlm->clichall_len = clichall_len / 2; + + char *userdomain_ptr = (char *) netntlm->userdomain_buf; + char *chall_ptr = (char *) netntlm->chall_buf; + + /** + * handle username and domainname + */ + + for (uint i = 0; i < user_len; i++) + { + *userdomain_ptr++ = user_pos[i]; + *userdomain_ptr++ = 0; + } + + for (uint i = 0; i < domain_len; i++) + { + *userdomain_ptr++ = domain_pos[i]; + *userdomain_ptr++ = 0; + } + + /** + * handle server challenge encoding + */ + + for (uint i = 0; i < srvchall_len; i += 2) + { + const char p0 = srvchall_pos[i + 0]; + const char p1 = srvchall_pos[i + 1]; + + *chall_ptr++ = hex_convert (p1) << 0 + | hex_convert (p0) << 4; + } + + /** + * handle client challenge encoding + */ + + for (uint i = 0; i < clichall_len; i += 2) + { + const char p0 = clichall_pos[i + 0]; + const char p1 = clichall_pos[i + 1]; + + *chall_ptr++ = hex_convert (p1) << 0 + | hex_convert (p0) << 4; + } + + /** + * store data + */ + + char *salt_buf_ptr = (char *) salt->salt_buf; + + uint salt_len = parse_and_store_salt (salt_buf_ptr, clichall_pos, clichall_len); + + if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH); + + salt->salt_len = salt_len; + + digest[0] = hex_to_uint (&hash_pos[ 0]); + digest[1] = hex_to_uint (&hash_pos[ 8]); + digest[2] = hex_to_uint (&hash_pos[16]); + digest[3] = hex_to_uint (&hash_pos[24]); + + digest[0] = byte_swap_32 (digest[0]); + digest[1] = byte_swap_32 (digest[1]); + digest[2] = byte_swap_32 (digest[2]); + digest[3] = byte_swap_32 (digest[3]); + + /* special case, last 8 byte do not need to be checked since they are brute-forced next */ + + uint digest_tmp[2]; + + digest_tmp[0] = hex_to_uint (&hash_pos[32]); + digest_tmp[1] = hex_to_uint (&hash_pos[40]); + + digest_tmp[0] = byte_swap_32 (digest_tmp[0]); + digest_tmp[1] = byte_swap_32 (digest_tmp[1]); + + /* special case 2: ESS */ + + if (srvchall_len == 48) + { + if ((netntlm->chall_buf[2] == 0) && (netntlm->chall_buf[3] == 0) && (netntlm->chall_buf[4] == 0) && (netntlm->chall_buf[5] == 0)) + { + uint w[16]; + + w[ 0] = netntlm->chall_buf[6]; + w[ 1] = netntlm->chall_buf[7]; + w[ 2] = netntlm->chall_buf[0]; + w[ 3] = netntlm->chall_buf[1]; + w[ 4] = 0x80; + w[ 5] = 0; + w[ 6] = 0; + w[ 7] = 0; + w[ 8] = 0; + w[ 9] = 0; + w[10] = 0; + w[11] = 0; + w[12] = 0; + w[13] = 0; + w[14] = 16 * 8; + w[15] = 0; + + uint dgst[4]; + + dgst[0] = MAGIC_A; + dgst[1] = MAGIC_B; + dgst[2] = MAGIC_C; + dgst[3] = MAGIC_D; + + md5_64 (w, dgst); + + salt->salt_buf[0] = dgst[0]; + salt->salt_buf[1] = dgst[1]; + } + } + + /* precompute netntlmv1 exploit start */ + + for (uint i = 0; i < 0x10000; i++) + { + uint key_md4[2] = { i, 0 }; + uint key_des[2] = { 0, 0 }; + + transform_netntlmv1_key ((uint8_t *) key_md4, (uint8_t *) key_des); + + uint Kc[16]; + uint Kd[16]; + + _des_keysetup (key_des, Kc, Kd, c_skb); + + uint data3[2] = { salt->salt_buf[0], salt->salt_buf[1] }; + + _des_encrypt (data3, Kc, Kd, c_SPtrans); + + if (data3[0] != digest_tmp[0]) continue; + if (data3[1] != digest_tmp[1]) continue; + + salt->salt_buf[2] = i; + + salt->salt_len = 24; + + break; + } + + salt->salt_buf_pc[0] = digest_tmp[0]; + salt->salt_buf_pc[1] = digest_tmp[1]; + + /* precompute netntlmv1 exploit stop */ + + uint32_t tt; + + IP (digest[0], digest[1], tt); + IP (digest[2], digest[3], tt); + + digest[0] = ROTATE_RIGHT (digest[0], 29); + digest[1] = ROTATE_RIGHT (digest[1], 29); + digest[2] = ROTATE_RIGHT (digest[2], 29); + digest[3] = ROTATE_RIGHT (digest[3], 29); + + IP (salt->salt_buf[0], salt->salt_buf[1], tt); + + salt->salt_buf[0] = ROTATE_LEFT (salt->salt_buf[0], 3); + salt->salt_buf[1] = ROTATE_LEFT (salt->salt_buf[1], 3); + + return (PARSER_OK); +} + +int netntlmv2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf) +{ + if ((input_len < DISPLAY_LEN_MIN_5600) || (input_len > DISPLAY_LEN_MAX_5600)) return (PARSER_GLOBAL_LENGTH); + + uint32_t *digest = (uint32_t *) hash_buf->digest; + + salt_t *salt = hash_buf->salt; + + netntlm_t *netntlm = (netntlm_t *) hash_buf->esalt; + + /** + * parse line + */ + + char *user_pos = input_buf; + + char *unused_pos = strchr (user_pos, ':'); + + if (unused_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); + + uint user_len = unused_pos - user_pos; + + if (user_len > 60) return (PARSER_SALT_LENGTH); + + unused_pos++; + + char *domain_pos = strchr (unused_pos, ':'); + + if (domain_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); + + uint unused_len = domain_pos - unused_pos; + + if (unused_len != 0) return (PARSER_SALT_LENGTH); + + domain_pos++; + + char *srvchall_pos = strchr (domain_pos, ':'); + + if (srvchall_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); + + uint domain_len = srvchall_pos - domain_pos; + + if (domain_len > 45) return (PARSER_SALT_LENGTH); + + srvchall_pos++; + + char *hash_pos = strchr (srvchall_pos, ':'); + + if (srvchall_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); + + uint srvchall_len = hash_pos - srvchall_pos; + + if (srvchall_len != 16) return (PARSER_SALT_LENGTH); + + hash_pos++; + + char *clichall_pos = strchr (hash_pos, ':'); + + if (clichall_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); + + uint hash_len = clichall_pos - hash_pos; + + if (hash_len != 32) return (PARSER_HASH_LENGTH); + + clichall_pos++; + + uint clichall_len = input_len - user_len - 1 - unused_len - 1 - domain_len - 1 - srvchall_len - 1 - hash_len - 1; + + if (clichall_len > 1024) return (PARSER_SALT_LENGTH); + + if (clichall_len % 2) return (PARSER_SALT_VALUE); + + /** + * store some data for later use + */ + + netntlm->user_len = user_len * 2; + netntlm->domain_len = domain_len * 2; + netntlm->srvchall_len = srvchall_len / 2; + netntlm->clichall_len = clichall_len / 2; + + char *userdomain_ptr = (char *) netntlm->userdomain_buf; + char *chall_ptr = (char *) netntlm->chall_buf; + + /** + * handle username and domainname + */ + + for (uint i = 0; i < user_len; i++) + { + *userdomain_ptr++ = toupper (user_pos[i]); + *userdomain_ptr++ = 0; + } + + for (uint i = 0; i < domain_len; i++) + { + *userdomain_ptr++ = domain_pos[i]; + *userdomain_ptr++ = 0; + } + + *userdomain_ptr++ = 0x80; + + /** + * handle server challenge encoding + */ + + for (uint i = 0; i < srvchall_len; i += 2) + { + const char p0 = srvchall_pos[i + 0]; + const char p1 = srvchall_pos[i + 1]; + + *chall_ptr++ = hex_convert (p1) << 0 + | hex_convert (p0) << 4; + } + + /** + * handle client challenge encoding + */ + + for (uint i = 0; i < clichall_len; i += 2) + { + const char p0 = clichall_pos[i + 0]; + const char p1 = clichall_pos[i + 1]; + + *chall_ptr++ = hex_convert (p1) << 0 + | hex_convert (p0) << 4; + } + + *chall_ptr++ = 0x80; + + /** + * handle hash itself + */ + + digest[0] = hex_to_uint (&hash_pos[ 0]); + digest[1] = hex_to_uint (&hash_pos[ 8]); + digest[2] = hex_to_uint (&hash_pos[16]); + digest[3] = hex_to_uint (&hash_pos[24]); + + digest[0] = byte_swap_32 (digest[0]); + digest[1] = byte_swap_32 (digest[1]); + digest[2] = byte_swap_32 (digest[2]); + digest[3] = byte_swap_32 (digest[3]); + + /** + * reuse challange data as salt_buf, its the buffer that is most likely unique + */ + + salt->salt_buf[0] = 0; + salt->salt_buf[1] = 0; + salt->salt_buf[2] = 0; + salt->salt_buf[3] = 0; + salt->salt_buf[4] = 0; + salt->salt_buf[5] = 0; + salt->salt_buf[6] = 0; + salt->salt_buf[7] = 0; + + uint *uptr; + + uptr = (uint *) netntlm->userdomain_buf; + + for (uint i = 0; i < 16; i += 16) + { + md5_64 (uptr, salt->salt_buf); + } + + uptr = (uint *) netntlm->chall_buf; + + for (uint i = 0; i < 256; i += 16) + { + md5_64 (uptr, salt->salt_buf); + } + + salt->salt_len = 16; + + return (PARSER_OK); +} + +int joomla_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf) +{ + if (data.opts_type & OPTS_TYPE_ST_HEX) + { + if ((input_len < DISPLAY_LEN_MIN_11H) || (input_len > DISPLAY_LEN_MAX_11H)) return (PARSER_GLOBAL_LENGTH); + } + else + { + if ((input_len < DISPLAY_LEN_MIN_11) || (input_len > DISPLAY_LEN_MAX_11)) return (PARSER_GLOBAL_LENGTH); + } + + uint32_t *digest = (uint32_t *) hash_buf->digest; + + salt_t *salt = hash_buf->salt; + + digest[0] = hex_to_uint (&input_buf[ 0]); + digest[1] = hex_to_uint (&input_buf[ 8]); + digest[2] = hex_to_uint (&input_buf[16]); + digest[3] = hex_to_uint (&input_buf[24]); + + digest[0] = byte_swap_32 (digest[0]); + digest[1] = byte_swap_32 (digest[1]); + digest[2] = byte_swap_32 (digest[2]); + digest[3] = byte_swap_32 (digest[3]); + + digest[0] -= MD5M_A; + digest[1] -= MD5M_B; + digest[2] -= MD5M_C; + digest[3] -= MD5M_D; + + if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED); + + uint salt_len = input_len - 32 - 1; + + char *salt_buf = input_buf + 32 + 1; + + char *salt_buf_ptr = (char *) salt->salt_buf; + + salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len); + + if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH); + + salt->salt_len = salt_len; + + return (PARSER_OK); +} + +int postgresql_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf) +{ + if (data.opts_type & OPTS_TYPE_ST_HEX) + { + if ((input_len < DISPLAY_LEN_MIN_12H) || (input_len > DISPLAY_LEN_MAX_12H)) return (PARSER_GLOBAL_LENGTH); + } + else + { + if ((input_len < DISPLAY_LEN_MIN_12) || (input_len > DISPLAY_LEN_MAX_12)) return (PARSER_GLOBAL_LENGTH); + } + + uint32_t *digest = (uint32_t *) hash_buf->digest; + + salt_t *salt = hash_buf->salt; + + digest[0] = hex_to_uint (&input_buf[ 0]); + digest[1] = hex_to_uint (&input_buf[ 8]); + digest[2] = hex_to_uint (&input_buf[16]); + digest[3] = hex_to_uint (&input_buf[24]); + + digest[0] = byte_swap_32 (digest[0]); + digest[1] = byte_swap_32 (digest[1]); + digest[2] = byte_swap_32 (digest[2]); + digest[3] = byte_swap_32 (digest[3]); + + digest[0] -= MD5M_A; + digest[1] -= MD5M_B; + digest[2] -= MD5M_C; + digest[3] -= MD5M_D; + + if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED); + + uint salt_len = input_len - 32 - 1; + + char *salt_buf = input_buf + 32 + 1; + + char *salt_buf_ptr = (char *) salt->salt_buf; + + salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len); + + if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH); + + salt->salt_len = salt_len; + + return (PARSER_OK); +} + +int md5md5_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf) +{ + if ((input_len < DISPLAY_LEN_MIN_2600) || (input_len > DISPLAY_LEN_MAX_2600)) return (PARSER_GLOBAL_LENGTH); + + uint32_t *digest = (uint32_t *) hash_buf->digest; + + salt_t *salt = hash_buf->salt; + + digest[0] = hex_to_uint (&input_buf[ 0]); + digest[1] = hex_to_uint (&input_buf[ 8]); + digest[2] = hex_to_uint (&input_buf[16]); + digest[3] = hex_to_uint (&input_buf[24]); + + digest[0] = byte_swap_32 (digest[0]); + digest[1] = byte_swap_32 (digest[1]); + digest[2] = byte_swap_32 (digest[2]); + digest[3] = byte_swap_32 (digest[3]); + + digest[0] -= MD5M_A; + digest[1] -= MD5M_B; + digest[2] -= MD5M_C; + digest[3] -= MD5M_D; + + /** + * This is a virtual salt. While the algorithm is basically not salted + * we can exploit the salt buffer to set the 0x80 and the w[14] value. + * This way we can save a special md5md5 kernel and reuse the one from vbull. + */ + + char *salt_buf_ptr = (char *) salt->salt_buf; + + uint salt_len = parse_and_store_salt (salt_buf_ptr, (char *) "", 0); + + if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH); + + salt->salt_len = salt_len; + + return (PARSER_OK); +} + +int vb3_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf) +{ + if (data.opts_type & OPTS_TYPE_ST_HEX) + { + if ((input_len < DISPLAY_LEN_MIN_2611H) || (input_len > DISPLAY_LEN_MAX_2611H)) return (PARSER_GLOBAL_LENGTH); + } + else + { + if ((input_len < DISPLAY_LEN_MIN_2611) || (input_len > DISPLAY_LEN_MAX_2611)) return (PARSER_GLOBAL_LENGTH); + } + + uint32_t *digest = (uint32_t *) hash_buf->digest; + + salt_t *salt = hash_buf->salt; + + digest[0] = hex_to_uint (&input_buf[ 0]); + digest[1] = hex_to_uint (&input_buf[ 8]); + digest[2] = hex_to_uint (&input_buf[16]); + digest[3] = hex_to_uint (&input_buf[24]); + + digest[0] = byte_swap_32 (digest[0]); + digest[1] = byte_swap_32 (digest[1]); + digest[2] = byte_swap_32 (digest[2]); + digest[3] = byte_swap_32 (digest[3]); + + digest[0] -= MD5M_A; + digest[1] -= MD5M_B; + digest[2] -= MD5M_C; + digest[3] -= MD5M_D; + + if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED); + + uint salt_len = input_len - 32 - 1; + + char *salt_buf = input_buf + 32 + 1; + + char *salt_buf_ptr = (char *) salt->salt_buf; + + salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len); + + if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH); + + salt->salt_len = salt_len; + + return (PARSER_OK); +} + +int vb30_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf) +{ + if (data.opts_type & OPTS_TYPE_ST_HEX) + { + if ((input_len < DISPLAY_LEN_MIN_2711H) || (input_len > DISPLAY_LEN_MAX_2711H)) return (PARSER_GLOBAL_LENGTH); + } + else + { + if ((input_len < DISPLAY_LEN_MIN_2711) || (input_len > DISPLAY_LEN_MAX_2711)) return (PARSER_GLOBAL_LENGTH); + } + + uint32_t *digest = (uint32_t *) hash_buf->digest; + + salt_t *salt = hash_buf->salt; + + digest[0] = hex_to_uint (&input_buf[ 0]); + digest[1] = hex_to_uint (&input_buf[ 8]); + digest[2] = hex_to_uint (&input_buf[16]); + digest[3] = hex_to_uint (&input_buf[24]); + + digest[0] = byte_swap_32 (digest[0]); + digest[1] = byte_swap_32 (digest[1]); + digest[2] = byte_swap_32 (digest[2]); + digest[3] = byte_swap_32 (digest[3]); + + if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED); + + uint salt_len = input_len - 32 - 1; + + char *salt_buf = input_buf + 32 + 1; + + char *salt_buf_ptr = (char *) salt->salt_buf; + + salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len); + + if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH); + + salt->salt_len = salt_len; + + return (PARSER_OK); +} + +int dcc_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf) +{ + if (data.opts_type & OPTS_TYPE_ST_HEX) + { + if ((input_len < DISPLAY_LEN_MIN_1100H) || (input_len > DISPLAY_LEN_MAX_1100H)) return (PARSER_GLOBAL_LENGTH); + } + else + { + if ((input_len < DISPLAY_LEN_MIN_1100) || (input_len > DISPLAY_LEN_MAX_1100)) return (PARSER_GLOBAL_LENGTH); + } + + uint32_t *digest = (uint32_t *) hash_buf->digest; + + salt_t *salt = hash_buf->salt; + + digest[0] = hex_to_uint (&input_buf[ 0]); + digest[1] = hex_to_uint (&input_buf[ 8]); + digest[2] = hex_to_uint (&input_buf[16]); + digest[3] = hex_to_uint (&input_buf[24]); + + digest[0] = byte_swap_32 (digest[0]); + digest[1] = byte_swap_32 (digest[1]); + digest[2] = byte_swap_32 (digest[2]); + digest[3] = byte_swap_32 (digest[3]); + + digest[0] -= MD4M_A; + digest[1] -= MD4M_B; + digest[2] -= MD4M_C; + digest[3] -= MD4M_D; + + if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED); + + uint salt_len = input_len - 32 - 1; + + char *salt_buf = input_buf + 32 + 1; + + char *salt_buf_ptr = (char *) salt->salt_buf; + + salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len); + + if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH); + + salt->salt_len = salt_len; + + return (PARSER_OK); +} + +int ipb2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf) +{ + if (data.opts_type & OPTS_TYPE_ST_HEX) + { + if ((input_len < DISPLAY_LEN_MIN_2811H) || (input_len > DISPLAY_LEN_MAX_2811H)) return (PARSER_GLOBAL_LENGTH); + } + else + { + if ((input_len < DISPLAY_LEN_MIN_2811) || (input_len > DISPLAY_LEN_MAX_2811)) return (PARSER_GLOBAL_LENGTH); + } + + uint32_t *digest = (uint32_t *) hash_buf->digest; + + salt_t *salt = hash_buf->salt; + + digest[0] = hex_to_uint (&input_buf[ 0]); + digest[1] = hex_to_uint (&input_buf[ 8]); + digest[2] = hex_to_uint (&input_buf[16]); + digest[3] = hex_to_uint (&input_buf[24]); + + digest[0] = byte_swap_32 (digest[0]); + digest[1] = byte_swap_32 (digest[1]); + digest[2] = byte_swap_32 (digest[2]); + digest[3] = byte_swap_32 (digest[3]); + + if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED); + + uint salt_len = input_len - 32 - 1; + + char *salt_buf = input_buf + 32 + 1; + + uint salt_pc_block[16]; + + memset (salt_pc_block, 0, sizeof (salt_pc_block)); + + char *salt_pc_block_ptr = (char *) salt_pc_block; + + salt_len = parse_and_store_salt (salt_pc_block_ptr, salt_buf, salt_len); + + if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH); + + salt_pc_block_ptr[salt_len] = (unsigned char) 0x80; + + salt_pc_block[14] = salt_len * 8; + + uint salt_pc_digest[4]; + + salt_pc_digest[0] = MAGIC_A; + salt_pc_digest[1] = MAGIC_B; + salt_pc_digest[2] = MAGIC_C; + salt_pc_digest[3] = MAGIC_D; + + md5_64 (salt_pc_block, salt_pc_digest); + + salt_pc_digest[0] = byte_swap_32 (salt_pc_digest[0]); + salt_pc_digest[1] = byte_swap_32 (salt_pc_digest[1]); + salt_pc_digest[2] = byte_swap_32 (salt_pc_digest[2]); + salt_pc_digest[3] = byte_swap_32 (salt_pc_digest[3]); + + char *salt_buf_ptr = (char *) salt->salt_buf; + + memcpy (salt_buf_ptr, salt_buf, salt_len); + + char *salt_buf_pc_ptr = (char *) salt->salt_buf_pc; + + bin_to_hex_lower (salt_pc_digest[0], salt_buf_pc_ptr + 0); + bin_to_hex_lower (salt_pc_digest[1], salt_buf_pc_ptr + 8); + bin_to_hex_lower (salt_pc_digest[2], salt_buf_pc_ptr + 16); + bin_to_hex_lower (salt_pc_digest[3], salt_buf_pc_ptr + 24); + + salt->salt_len = 32; // changed, was salt_len before -- was a bug? 32 should be correct + + return (PARSER_OK); +} + +int sha1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf) +{ + if ((input_len < DISPLAY_LEN_MIN_100) || (input_len > DISPLAY_LEN_MAX_100)) return (PARSER_GLOBAL_LENGTH); + + uint32_t *digest = (uint32_t *) hash_buf->digest; + + digest[0] = hex_to_uint (&input_buf[ 0]); + digest[1] = hex_to_uint (&input_buf[ 8]); + digest[2] = hex_to_uint (&input_buf[16]); + digest[3] = hex_to_uint (&input_buf[24]); + digest[4] = hex_to_uint (&input_buf[32]); + + digest[0] -= SHA1M_A; + digest[1] -= SHA1M_B; + digest[2] -= SHA1M_C; + digest[3] -= SHA1M_D; + digest[4] -= SHA1M_E; + + return (PARSER_OK); +} + +int sha1linkedin_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf) +{ + if ((input_len < DISPLAY_LEN_MIN_100) || (input_len > DISPLAY_LEN_MAX_100)) return (PARSER_GLOBAL_LENGTH); + + uint32_t *digest = (uint32_t *) hash_buf->digest; + + digest[0] = hex_to_uint (&input_buf[ 0]); + digest[1] = hex_to_uint (&input_buf[ 8]); + digest[2] = hex_to_uint (&input_buf[16]); + digest[3] = hex_to_uint (&input_buf[24]); + digest[4] = hex_to_uint (&input_buf[32]); + + return (PARSER_OK); +} + +int sha1s_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf) +{ + if (data.opts_type & OPTS_TYPE_ST_HEX) + { + if ((input_len < DISPLAY_LEN_MIN_110H) || (input_len > DISPLAY_LEN_MAX_110H)) return (PARSER_GLOBAL_LENGTH); + } + else + { + if ((input_len < DISPLAY_LEN_MIN_110) || (input_len > DISPLAY_LEN_MAX_110)) return (PARSER_GLOBAL_LENGTH); + } + + uint32_t *digest = (uint32_t *) hash_buf->digest; + + salt_t *salt = hash_buf->salt; + + digest[0] = hex_to_uint (&input_buf[ 0]); + digest[1] = hex_to_uint (&input_buf[ 8]); + digest[2] = hex_to_uint (&input_buf[16]); + digest[3] = hex_to_uint (&input_buf[24]); + digest[4] = hex_to_uint (&input_buf[32]); + + digest[0] -= SHA1M_A; + digest[1] -= SHA1M_B; + digest[2] -= SHA1M_C; + digest[3] -= SHA1M_D; + digest[4] -= SHA1M_E; + + if (input_buf[40] != data.separator) return (PARSER_SEPARATOR_UNMATCHED); + + uint salt_len = input_len - 40 - 1; + + char *salt_buf = input_buf + 40 + 1; + + char *salt_buf_ptr = (char *) salt->salt_buf; + + salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len); + + if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH); + + salt->salt_len = salt_len; + + return (PARSER_OK); +} + +int sha1b64_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf) +{ + if ((input_len < DISPLAY_LEN_MIN_101) || (input_len > DISPLAY_LEN_MAX_101)) return (PARSER_GLOBAL_LENGTH); + + if (memcmp (SIGNATURE_SHA1B64, input_buf, 5)) return (PARSER_SIGNATURE_UNMATCHED); + + uint32_t *digest = (uint32_t *) hash_buf->digest; + + char tmp_buf[100]; + + memset (tmp_buf, 0, sizeof (tmp_buf)); + + base64_decode (base64_to_int, input_buf + 5, input_len - 5, tmp_buf); + + memcpy (digest, tmp_buf, 20); + + digest[0] = byte_swap_32 (digest[0]); + digest[1] = byte_swap_32 (digest[1]); + digest[2] = byte_swap_32 (digest[2]); + digest[3] = byte_swap_32 (digest[3]); + digest[4] = byte_swap_32 (digest[4]); + + digest[0] -= SHA1M_A; + digest[1] -= SHA1M_B; + digest[2] -= SHA1M_C; + digest[3] -= SHA1M_D; + digest[4] -= SHA1M_E; + + return (PARSER_OK); +} + +int sha1b64s_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf) +{ + if ((input_len < DISPLAY_LEN_MIN_111) || (input_len > DISPLAY_LEN_MAX_111)) return (PARSER_GLOBAL_LENGTH); + + if (memcmp (SIGNATURE_SSHA1B64_lower, input_buf, 6) && memcmp (SIGNATURE_SSHA1B64_upper, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED); + + uint32_t *digest = (uint32_t *) hash_buf->digest; + + salt_t *salt = hash_buf->salt; + + char tmp_buf[100]; + + memset (tmp_buf, 0, sizeof (tmp_buf)); + + int tmp_len = base64_decode (base64_to_int, input_buf + 6, input_len - 6, tmp_buf); + + memcpy (digest, tmp_buf, 20); + + salt->salt_len = tmp_len - 20; + + memcpy (salt->salt_buf, tmp_buf + 20, salt->salt_len); + + if (data.opts_type & OPTS_TYPE_ST_ADD80) + { + char *ptr = (char *) salt->salt_buf; + + ptr[salt->salt_len] = 0x80; + } + + digest[0] = byte_swap_32 (digest[0]); + digest[1] = byte_swap_32 (digest[1]); + digest[2] = byte_swap_32 (digest[2]); + digest[3] = byte_swap_32 (digest[3]); + digest[4] = byte_swap_32 (digest[4]); + + digest[0] -= SHA1M_A; + digest[1] -= SHA1M_B; + digest[2] -= SHA1M_C; + digest[3] -= SHA1M_D; + digest[4] -= SHA1M_E; + + return (PARSER_OK); +} + +int mssql2000_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf) +{ + if ((input_len < DISPLAY_LEN_MIN_131) || (input_len > DISPLAY_LEN_MAX_131)) return (PARSER_GLOBAL_LENGTH); + + if (memcmp (SIGNATURE_MSSQL, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED); + + uint32_t *digest = (uint32_t *) hash_buf->digest; + + salt_t *salt = hash_buf->salt; + + char *salt_buf = input_buf + 6; + + uint salt_len = 8; + + char *salt_buf_ptr = (char *) salt->salt_buf; + + salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len); + + if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH); + + salt->salt_len = salt_len; + + char *hash_pos = input_buf + 6 + 8 + 40; + + digest[0] = hex_to_uint (&hash_pos[ 0]); + digest[1] = hex_to_uint (&hash_pos[ 8]); + digest[2] = hex_to_uint (&hash_pos[16]); + digest[3] = hex_to_uint (&hash_pos[24]); + digest[4] = hex_to_uint (&hash_pos[32]); + + digest[0] -= SHA1M_A; + digest[1] -= SHA1M_B; + digest[2] -= SHA1M_C; + digest[3] -= SHA1M_D; + digest[4] -= SHA1M_E; + + return (PARSER_OK); +} + +int mssql2005_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf) +{ + if ((input_len < DISPLAY_LEN_MIN_132) || (input_len > DISPLAY_LEN_MAX_132)) return (PARSER_GLOBAL_LENGTH); + + if (memcmp (SIGNATURE_MSSQL, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED); + + uint32_t *digest = (uint32_t *) hash_buf->digest; + + salt_t *salt = hash_buf->salt; + + char *salt_buf = input_buf + 6; + + uint salt_len = 8; + + char *salt_buf_ptr = (char *) salt->salt_buf; + + salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len); + + if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH); + + salt->salt_len = salt_len; + + char *hash_pos = input_buf + 6 + 8; + + digest[0] = hex_to_uint (&hash_pos[ 0]); + digest[1] = hex_to_uint (&hash_pos[ 8]); + digest[2] = hex_to_uint (&hash_pos[16]); + digest[3] = hex_to_uint (&hash_pos[24]); + digest[4] = hex_to_uint (&hash_pos[32]); + + digest[0] -= SHA1M_A; + digest[1] -= SHA1M_B; + digest[2] -= SHA1M_C; + digest[3] -= SHA1M_D; + digest[4] -= SHA1M_E; + + return (PARSER_OK); +} + +int mssql2012_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf) +{ + if ((input_len < DISPLAY_LEN_MIN_1731) || (input_len > DISPLAY_LEN_MAX_1731)) return (PARSER_GLOBAL_LENGTH); + + if (memcmp (SIGNATURE_MSSQL2012, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED); + + uint64_t *digest = (uint64_t *) hash_buf->digest; + + salt_t *salt = hash_buf->salt; + + char *salt_buf = input_buf + 6; + + uint salt_len = 8; + + char *salt_buf_ptr = (char *) salt->salt_buf; + + salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len); + + if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH); + + salt->salt_len = salt_len; + + char *hash_pos = input_buf + 6 + 8; + + digest[0] = hex_to_uint64_t (&hash_pos[ 0]); + digest[1] = hex_to_uint64_t (&hash_pos[ 16]); + digest[2] = hex_to_uint64_t (&hash_pos[ 32]); + digest[3] = hex_to_uint64_t (&hash_pos[ 48]); + digest[4] = hex_to_uint64_t (&hash_pos[ 64]); + digest[5] = hex_to_uint64_t (&hash_pos[ 80]); + digest[6] = hex_to_uint64_t (&hash_pos[ 96]); + digest[7] = hex_to_uint64_t (&hash_pos[112]); + + digest[0] -= SHA512M_A; + digest[1] -= SHA512M_B; + digest[2] -= SHA512M_C; + digest[3] -= SHA512M_D; + digest[4] -= SHA512M_E; + digest[5] -= SHA512M_F; + digest[6] -= SHA512M_G; + digest[7] -= SHA512M_H; + + return (PARSER_OK); +} + +int oracleh_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf) +{ + if (data.opts_type & OPTS_TYPE_ST_HEX) + { + if ((input_len < DISPLAY_LEN_MIN_3100H) || (input_len > DISPLAY_LEN_MAX_3100H)) return (PARSER_GLOBAL_LENGTH); + } + else + { + if ((input_len < DISPLAY_LEN_MIN_3100) || (input_len > DISPLAY_LEN_MAX_3100)) return (PARSER_GLOBAL_LENGTH); + } + + uint32_t *digest = (uint32_t *) hash_buf->digest; + + salt_t *salt = hash_buf->salt; + + digest[0] = hex_to_uint (&input_buf[ 0]); + digest[1] = hex_to_uint (&input_buf[ 8]); + digest[2] = 0; + digest[3] = 0; + + digest[0] = byte_swap_32 (digest[0]); + digest[1] = byte_swap_32 (digest[1]); + + if (input_buf[16] != data.separator) return (PARSER_SEPARATOR_UNMATCHED); + + uint salt_len = input_len - 16 - 1; + + char *salt_buf = input_buf + 16 + 1; + + char *salt_buf_ptr = (char *) salt->salt_buf; + + salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len); + + if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH); + + salt->salt_len = salt_len; + + return (PARSER_OK); +} + +int oracles_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf) +{ + if ((input_len < DISPLAY_LEN_MIN_112) || (input_len > DISPLAY_LEN_MAX_112)) return (PARSER_GLOBAL_LENGTH); + + uint32_t *digest = (uint32_t *) hash_buf->digest; + + salt_t *salt = hash_buf->salt; + + digest[0] = hex_to_uint (&input_buf[ 0]); + digest[1] = hex_to_uint (&input_buf[ 8]); + digest[2] = hex_to_uint (&input_buf[16]); + digest[3] = hex_to_uint (&input_buf[24]); + digest[4] = hex_to_uint (&input_buf[32]); + + digest[0] -= SHA1M_A; + digest[1] -= SHA1M_B; + digest[2] -= SHA1M_C; + digest[3] -= SHA1M_D; + digest[4] -= SHA1M_E; + + if (input_buf[40] != data.separator) return (PARSER_SEPARATOR_UNMATCHED); + + uint salt_len = input_len - 40 - 1; + + char *salt_buf = input_buf + 40 + 1; + + char *salt_buf_ptr = (char *) salt->salt_buf; + + salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len); + + if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH); + + salt->salt_len = salt_len; + + return (PARSER_OK); +} + +int oraclet_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf) +{ + if ((input_len < DISPLAY_LEN_MIN_12300) || (input_len > DISPLAY_LEN_MAX_12300)) return (PARSER_GLOBAL_LENGTH); + + uint32_t *digest = (uint32_t *) hash_buf->digest; + + salt_t *salt = hash_buf->salt; + + char *hash_pos = input_buf; + + digest[ 0] = hex_to_uint (&hash_pos[ 0]); + digest[ 1] = hex_to_uint (&hash_pos[ 8]); + digest[ 2] = hex_to_uint (&hash_pos[ 16]); + digest[ 3] = hex_to_uint (&hash_pos[ 24]); + digest[ 4] = hex_to_uint (&hash_pos[ 32]); + digest[ 5] = hex_to_uint (&hash_pos[ 40]); + digest[ 6] = hex_to_uint (&hash_pos[ 48]); + digest[ 7] = hex_to_uint (&hash_pos[ 56]); + digest[ 8] = hex_to_uint (&hash_pos[ 64]); + digest[ 9] = hex_to_uint (&hash_pos[ 72]); + digest[10] = hex_to_uint (&hash_pos[ 80]); + digest[11] = hex_to_uint (&hash_pos[ 88]); + digest[12] = hex_to_uint (&hash_pos[ 96]); + digest[13] = hex_to_uint (&hash_pos[104]); + digest[14] = hex_to_uint (&hash_pos[112]); + digest[15] = hex_to_uint (&hash_pos[120]); + + char *salt_pos = input_buf + 128; + + salt->salt_buf[0] = hex_to_uint (&salt_pos[ 0]); + salt->salt_buf[1] = hex_to_uint (&salt_pos[ 8]); + salt->salt_buf[2] = hex_to_uint (&salt_pos[16]); + salt->salt_buf[3] = hex_to_uint (&salt_pos[24]); + + salt->salt_iter = ROUNDS_ORACLET - 1; + salt->salt_len = 16; + + return (PARSER_OK); +} + +int sha256_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf) +{ + if ((input_len < DISPLAY_LEN_MIN_1400) || (input_len > DISPLAY_LEN_MAX_1400)) return (PARSER_GLOBAL_LENGTH); + + uint32_t *digest = (uint32_t *) hash_buf->digest; + + digest[0] = hex_to_uint (&input_buf[ 0]); + digest[1] = hex_to_uint (&input_buf[ 8]); + digest[2] = hex_to_uint (&input_buf[16]); + digest[3] = hex_to_uint (&input_buf[24]); + digest[4] = hex_to_uint (&input_buf[32]); + digest[5] = hex_to_uint (&input_buf[40]); + digest[6] = hex_to_uint (&input_buf[48]); + digest[7] = hex_to_uint (&input_buf[56]); + + digest[0] -= SHA256M_A; + digest[1] -= SHA256M_B; + digest[2] -= SHA256M_C; + digest[3] -= SHA256M_D; + digest[4] -= SHA256M_E; + digest[5] -= SHA256M_F; + digest[6] -= SHA256M_G; + digest[7] -= SHA256M_H; + + return (PARSER_OK); +} + +int sha256s_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf) +{ + if (data.opts_type & OPTS_TYPE_ST_HEX) + { + if ((input_len < DISPLAY_LEN_MIN_1410H) || (input_len > DISPLAY_LEN_MAX_1410H)) return (PARSER_GLOBAL_LENGTH); + } + else + { + if ((input_len < DISPLAY_LEN_MIN_1410) || (input_len > DISPLAY_LEN_MAX_1410)) return (PARSER_GLOBAL_LENGTH); + } + + uint32_t *digest = (uint32_t *) hash_buf->digest; + + salt_t *salt = hash_buf->salt; + + digest[0] = hex_to_uint (&input_buf[ 0]); + digest[1] = hex_to_uint (&input_buf[ 8]); + digest[2] = hex_to_uint (&input_buf[16]); + digest[3] = hex_to_uint (&input_buf[24]); + digest[4] = hex_to_uint (&input_buf[32]); + digest[5] = hex_to_uint (&input_buf[40]); + digest[6] = hex_to_uint (&input_buf[48]); + digest[7] = hex_to_uint (&input_buf[56]); + + digest[0] -= SHA256M_A; + digest[1] -= SHA256M_B; + digest[2] -= SHA256M_C; + digest[3] -= SHA256M_D; + digest[4] -= SHA256M_E; + digest[5] -= SHA256M_F; + digest[6] -= SHA256M_G; + digest[7] -= SHA256M_H; + + if (input_buf[64] != data.separator) return (PARSER_SEPARATOR_UNMATCHED); + + uint salt_len = input_len - 64 - 1; + + char *salt_buf = input_buf + 64 + 1; + + char *salt_buf_ptr = (char *) salt->salt_buf; + + salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len); + + if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH); + + salt->salt_len = salt_len; + + return (PARSER_OK); +} + +int sha384_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf) +{ + if ((input_len < DISPLAY_LEN_MIN_10800) || (input_len > DISPLAY_LEN_MAX_10800)) return (PARSER_GLOBAL_LENGTH); + + uint64_t *digest = (uint64_t *) hash_buf->digest; + + digest[0] = hex_to_uint64_t (&input_buf[ 0]); + digest[1] = hex_to_uint64_t (&input_buf[ 16]); + digest[2] = hex_to_uint64_t (&input_buf[ 32]); + digest[3] = hex_to_uint64_t (&input_buf[ 48]); + digest[4] = hex_to_uint64_t (&input_buf[ 64]); + digest[5] = hex_to_uint64_t (&input_buf[ 80]); + digest[6] = 0; + digest[7] = 0; + + digest[0] -= SHA384M_A; + digest[1] -= SHA384M_B; + digest[2] -= SHA384M_C; + digest[3] -= SHA384M_D; + digest[4] -= SHA384M_E; + digest[5] -= SHA384M_F; + digest[6] -= 0; + digest[7] -= 0; + + return (PARSER_OK); +} + +int sha512_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf) +{ + if ((input_len < DISPLAY_LEN_MIN_1700) || (input_len > DISPLAY_LEN_MAX_1700)) return (PARSER_GLOBAL_LENGTH); + + uint64_t *digest = (uint64_t *) hash_buf->digest; + + digest[0] = hex_to_uint64_t (&input_buf[ 0]); + digest[1] = hex_to_uint64_t (&input_buf[ 16]); + digest[2] = hex_to_uint64_t (&input_buf[ 32]); + digest[3] = hex_to_uint64_t (&input_buf[ 48]); + digest[4] = hex_to_uint64_t (&input_buf[ 64]); + digest[5] = hex_to_uint64_t (&input_buf[ 80]); + digest[6] = hex_to_uint64_t (&input_buf[ 96]); + digest[7] = hex_to_uint64_t (&input_buf[112]); + + digest[0] -= SHA512M_A; + digest[1] -= SHA512M_B; + digest[2] -= SHA512M_C; + digest[3] -= SHA512M_D; + digest[4] -= SHA512M_E; + digest[5] -= SHA512M_F; + digest[6] -= SHA512M_G; + digest[7] -= SHA512M_H; + + return (PARSER_OK); +} + +int sha512s_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf) +{ + if (data.opts_type & OPTS_TYPE_ST_HEX) + { + if ((input_len < DISPLAY_LEN_MIN_1710H) || (input_len > DISPLAY_LEN_MAX_1710H)) return (PARSER_GLOBAL_LENGTH); + } + else + { + if ((input_len < DISPLAY_LEN_MIN_1710) || (input_len > DISPLAY_LEN_MAX_1710)) return (PARSER_GLOBAL_LENGTH); + } + + uint64_t *digest = (uint64_t *) hash_buf->digest; + + salt_t *salt = hash_buf->salt; + + digest[0] = hex_to_uint64_t (&input_buf[ 0]); + digest[1] = hex_to_uint64_t (&input_buf[ 16]); + digest[2] = hex_to_uint64_t (&input_buf[ 32]); + digest[3] = hex_to_uint64_t (&input_buf[ 48]); + digest[4] = hex_to_uint64_t (&input_buf[ 64]); + digest[5] = hex_to_uint64_t (&input_buf[ 80]); + digest[6] = hex_to_uint64_t (&input_buf[ 96]); + digest[7] = hex_to_uint64_t (&input_buf[112]); + + digest[0] -= SHA512M_A; + digest[1] -= SHA512M_B; + digest[2] -= SHA512M_C; + digest[3] -= SHA512M_D; + digest[4] -= SHA512M_E; + digest[5] -= SHA512M_F; + digest[6] -= SHA512M_G; + digest[7] -= SHA512M_H; + + if (input_buf[128] != data.separator) return (PARSER_SEPARATOR_UNMATCHED); + + uint salt_len = input_len - 128 - 1; + + char *salt_buf = input_buf + 128 + 1; + + char *salt_buf_ptr = (char *) salt->salt_buf; + + salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len); + + if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH); + + salt->salt_len = salt_len; + + return (PARSER_OK); +} + +int sha512crypt_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf) +{ + if (memcmp (SIGNATURE_SHA512CRYPT, input_buf, 3)) return (PARSER_SIGNATURE_UNMATCHED); + + uint64_t *digest = (uint64_t *) hash_buf->digest; + + salt_t *salt = hash_buf->salt; + + char *salt_pos = input_buf + 3; + + uint iterations_len = 0; + + if (memcmp (salt_pos, "rounds=", 7) == 0) + { + salt_pos += 7; + + for (iterations_len = 0; salt_pos[0] >= '0' && salt_pos[0] <= '9' && iterations_len < 7; iterations_len++, salt_pos += 1) continue; + + if (iterations_len == 0 ) return (PARSER_SALT_ITERATION); + if (salt_pos[0] != '$') return (PARSER_SIGNATURE_UNMATCHED); + + salt_pos[0] = 0x0; + + salt->salt_iter = atoi (salt_pos - iterations_len); + + salt_pos += 1; + + iterations_len += 8; + } + else + { + salt->salt_iter = ROUNDS_SHA512CRYPT; + } + + if ((input_len < DISPLAY_LEN_MIN_1800) || (input_len > DISPLAY_LEN_MAX_1800 + iterations_len)) return (PARSER_GLOBAL_LENGTH); + + char *hash_pos = strchr (salt_pos, '$'); + + if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); + + uint salt_len = hash_pos - salt_pos; + + if (salt_len > 16) return (PARSER_SALT_LENGTH); + + memcpy ((char *) salt->salt_buf, salt_pos, salt_len); + + salt->salt_len = salt_len; + + hash_pos++; + + sha512crypt_decode ((unsigned char *) digest, (unsigned char *) hash_pos); + + return (PARSER_OK); +} + +int keccak_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf) +{ + if ((input_len < DISPLAY_LEN_MIN_5000) || (input_len > DISPLAY_LEN_MAX_5000)) return (PARSER_GLOBAL_LENGTH); + + if (input_len % 16) return (PARSER_GLOBAL_LENGTH); + + uint64_t *digest = (uint64_t *) hash_buf->digest; + + salt_t *salt = hash_buf->salt; + + uint keccak_mdlen = input_len / 2; + + for (uint i = 0; i < keccak_mdlen / 8; i++) + { + digest[i] = hex_to_uint64_t (&input_buf[i * 16]); + + digest[i] = byte_swap_64 (digest[i]); + } + + salt->keccak_mdlen = keccak_mdlen; + + return (PARSER_OK); +} + +int ikepsk_md5_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf) +{ + if ((input_len < DISPLAY_LEN_MIN_5300) || (input_len > DISPLAY_LEN_MAX_5300)) return (PARSER_GLOBAL_LENGTH); + + uint32_t *digest = (uint32_t *) hash_buf->digest; + + salt_t *salt = hash_buf->salt; + + ikepsk_t *ikepsk = (ikepsk_t *) hash_buf->esalt; + + /** + * Parse that strange long line + */ + + char *in_off[9]; + + size_t in_len[9]; + + in_off[0] = strtok (input_buf, ":"); + + in_len[0] = strlen (in_off[0]); + + size_t i; + + for (i = 1; i < 9; i++) + { + in_off[i] = strtok (NULL, ":"); + + if (in_off[i] == NULL) return (PARSER_SEPARATOR_UNMATCHED); + + in_len[i] = strlen (in_off[i]); + } + + char *ptr; + + ptr = (char *) ikepsk->msg_buf; + + for (i = 0; i < in_len[0]; i += 2) *ptr++ = hex_to_char (in_off[0] + i); + for (i = 0; i < in_len[1]; i += 2) *ptr++ = hex_to_char (in_off[1] + i); + for (i = 0; i < in_len[2]; i += 2) *ptr++ = hex_to_char (in_off[2] + i); + for (i = 0; i < in_len[3]; i += 2) *ptr++ = hex_to_char (in_off[3] + i); + for (i = 0; i < in_len[4]; i += 2) *ptr++ = hex_to_char (in_off[4] + i); + for (i = 0; i < in_len[5]; i += 2) *ptr++ = hex_to_char (in_off[5] + i); + + *ptr = 0x80; + + ikepsk->msg_len = (in_len[0] + in_len[1] + in_len[2] + in_len[3] + in_len[4] + in_len[5]) / 2; + + ptr = (char *) ikepsk->nr_buf; + + for (i = 0; i < in_len[6]; i += 2) *ptr++ = hex_to_char (in_off[6] + i); + for (i = 0; i < in_len[7]; i += 2) *ptr++ = hex_to_char (in_off[7] + i); + + *ptr = 0x80; + + ikepsk->nr_len = (in_len[6] + in_len[7]) / 2; + + /** + * Store to database + */ + + ptr = in_off[8]; + + digest[0] = hex_to_uint (&ptr[ 0]); + digest[1] = hex_to_uint (&ptr[ 8]); + digest[2] = hex_to_uint (&ptr[16]); + digest[3] = hex_to_uint (&ptr[24]); + + digest[0] = byte_swap_32 (digest[0]); + digest[1] = byte_swap_32 (digest[1]); + digest[2] = byte_swap_32 (digest[2]); + digest[3] = byte_swap_32 (digest[3]); + + salt->salt_len = 32; + + salt->salt_buf[0] = ikepsk->nr_buf[0]; + salt->salt_buf[1] = ikepsk->nr_buf[1]; + salt->salt_buf[2] = ikepsk->nr_buf[2]; + salt->salt_buf[3] = ikepsk->nr_buf[3]; + salt->salt_buf[4] = ikepsk->nr_buf[4]; + salt->salt_buf[5] = ikepsk->nr_buf[5]; + salt->salt_buf[6] = ikepsk->nr_buf[6]; + salt->salt_buf[7] = ikepsk->nr_buf[7]; + + return (PARSER_OK); +} + +int ikepsk_sha1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf) +{ + if ((input_len < DISPLAY_LEN_MIN_5400) || (input_len > DISPLAY_LEN_MAX_5400)) return (PARSER_GLOBAL_LENGTH); + + uint32_t *digest = (uint32_t *) hash_buf->digest; + + salt_t *salt = hash_buf->salt; + + ikepsk_t *ikepsk = (ikepsk_t *) hash_buf->esalt; + + /** + * Parse that strange long line + */ + + char *in_off[9]; + + size_t in_len[9]; + + in_off[0] = strtok (input_buf, ":"); + + in_len[0] = strlen (in_off[0]); + + size_t i; + + for (i = 1; i < 9; i++) + { + in_off[i] = strtok (NULL, ":"); + + if (in_off[i] == NULL) return (PARSER_SEPARATOR_UNMATCHED); + + in_len[i] = strlen (in_off[i]); + } + + char *ptr; + + ptr = (char *) ikepsk->msg_buf; + + for (i = 0; i < in_len[0]; i += 2) *ptr++ = hex_to_char (in_off[0] + i); + for (i = 0; i < in_len[1]; i += 2) *ptr++ = hex_to_char (in_off[1] + i); + for (i = 0; i < in_len[2]; i += 2) *ptr++ = hex_to_char (in_off[2] + i); + for (i = 0; i < in_len[3]; i += 2) *ptr++ = hex_to_char (in_off[3] + i); + for (i = 0; i < in_len[4]; i += 2) *ptr++ = hex_to_char (in_off[4] + i); + for (i = 0; i < in_len[5]; i += 2) *ptr++ = hex_to_char (in_off[5] + i); + + *ptr = 0x80; + + ikepsk->msg_len = (in_len[0] + in_len[1] + in_len[2] + in_len[3] + in_len[4] + in_len[5]) / 2; + + ptr = (char *) ikepsk->nr_buf; + + for (i = 0; i < in_len[6]; i += 2) *ptr++ = hex_to_char (in_off[6] + i); + for (i = 0; i < in_len[7]; i += 2) *ptr++ = hex_to_char (in_off[7] + i); + + *ptr = 0x80; + + ikepsk->nr_len = (in_len[6] + in_len[7]) / 2; + + /** + * Store to database + */ + + ptr = in_off[8]; + + digest[0] = hex_to_uint (&ptr[ 0]); + digest[1] = hex_to_uint (&ptr[ 8]); + digest[2] = hex_to_uint (&ptr[16]); + digest[3] = hex_to_uint (&ptr[24]); + digest[4] = hex_to_uint (&ptr[32]); + + salt->salt_len = 32; + + salt->salt_buf[0] = ikepsk->nr_buf[0]; + salt->salt_buf[1] = ikepsk->nr_buf[1]; + salt->salt_buf[2] = ikepsk->nr_buf[2]; + salt->salt_buf[3] = ikepsk->nr_buf[3]; + salt->salt_buf[4] = ikepsk->nr_buf[4]; + salt->salt_buf[5] = ikepsk->nr_buf[5]; + salt->salt_buf[6] = ikepsk->nr_buf[6]; + salt->salt_buf[7] = ikepsk->nr_buf[7]; + + return (PARSER_OK); +} + +int ripemd160_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf) +{ + if ((input_len < DISPLAY_LEN_MIN_6000) || (input_len > DISPLAY_LEN_MAX_6000)) return (PARSER_GLOBAL_LENGTH); + + uint32_t *digest = (uint32_t *) hash_buf->digest; + + digest[0] = hex_to_uint (&input_buf[ 0]); + digest[1] = hex_to_uint (&input_buf[ 8]); + digest[2] = hex_to_uint (&input_buf[16]); + digest[3] = hex_to_uint (&input_buf[24]); + digest[4] = hex_to_uint (&input_buf[32]); + + digest[0] = byte_swap_32 (digest[0]); + digest[1] = byte_swap_32 (digest[1]); + digest[2] = byte_swap_32 (digest[2]); + digest[3] = byte_swap_32 (digest[3]); + digest[4] = byte_swap_32 (digest[4]); + + return (PARSER_OK); +} + +int whirlpool_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf) +{ + if ((input_len < DISPLAY_LEN_MIN_6100) || (input_len > DISPLAY_LEN_MAX_6100)) return (PARSER_GLOBAL_LENGTH); + + uint32_t *digest = (uint32_t *) hash_buf->digest; + + digest[ 0] = hex_to_uint (&input_buf[ 0]); + digest[ 1] = hex_to_uint (&input_buf[ 8]); + digest[ 2] = hex_to_uint (&input_buf[ 16]); + digest[ 3] = hex_to_uint (&input_buf[ 24]); + digest[ 4] = hex_to_uint (&input_buf[ 32]); + digest[ 5] = hex_to_uint (&input_buf[ 40]); + digest[ 6] = hex_to_uint (&input_buf[ 48]); + digest[ 7] = hex_to_uint (&input_buf[ 56]); + digest[ 8] = hex_to_uint (&input_buf[ 64]); + digest[ 9] = hex_to_uint (&input_buf[ 72]); + digest[10] = hex_to_uint (&input_buf[ 80]); + digest[11] = hex_to_uint (&input_buf[ 88]); + digest[12] = hex_to_uint (&input_buf[ 96]); + digest[13] = hex_to_uint (&input_buf[104]); + digest[14] = hex_to_uint (&input_buf[112]); + digest[15] = hex_to_uint (&input_buf[120]); + + return (PARSER_OK); +} + +int androidpin_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf) +{ + if ((input_len < DISPLAY_LEN_MIN_5800) || (input_len > DISPLAY_LEN_MAX_5800)) return (PARSER_GLOBAL_LENGTH); + + uint32_t *digest = (uint32_t *) hash_buf->digest; + + salt_t *salt = hash_buf->salt; + + digest[0] = hex_to_uint (&input_buf[ 0]); + digest[1] = hex_to_uint (&input_buf[ 8]); + digest[2] = hex_to_uint (&input_buf[16]); + digest[3] = hex_to_uint (&input_buf[24]); + digest[4] = hex_to_uint (&input_buf[32]); + + if (input_buf[40] != data.separator) return (PARSER_SEPARATOR_UNMATCHED); + + uint salt_len = input_len - 40 - 1; + + char *salt_buf = input_buf + 40 + 1; + + char *salt_buf_ptr = (char *) salt->salt_buf; + + salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len); + + if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH); + + salt->salt_len = salt_len; + + salt->salt_iter = ROUNDS_ANDROIDPIN - 1; + + return (PARSER_OK); +} + +int truecrypt_parse_hash_1k (char *input_buf, uint input_len, hash_t *hash_buf) +{ + uint32_t *digest = (uint32_t *) hash_buf->digest; + + salt_t *salt = hash_buf->salt; + + tc_t *tc = (tc_t *) hash_buf->esalt; + + if (input_len == 0) + { + log_error ("TrueCrypt container not specified"); + + exit (-1); + } + + FILE *fp = fopen (input_buf, "rb"); + + if (fp == NULL) + { + log_error ("%s: %s", input_buf, strerror (errno)); + + exit (-1); + } + + char buf[512]; + + int n = fread (buf, 1, sizeof (buf), fp); + + fclose (fp); + + if (n != 512) return (PARSER_TC_FILE_SIZE); + + memcpy (tc->salt_buf, buf, 64); + + memcpy (tc->data_buf, buf + 64, 512 - 64); + + salt->salt_buf[0] = tc->salt_buf[0]; + + salt->salt_len = 4; + + salt->salt_iter = 1000 - 1; + + digest[0] = tc->data_buf[0]; + + return (PARSER_OK); +} + +int truecrypt_parse_hash_2k (char *input_buf, uint input_len, hash_t *hash_buf) +{ + uint32_t *digest = (uint32_t *) hash_buf->digest; + + salt_t *salt = hash_buf->salt; + + tc_t *tc = (tc_t *) hash_buf->esalt; + + if (input_len == 0) + { + log_error ("TrueCrypt container not specified"); + + exit (-1); + } + + FILE *fp = fopen (input_buf, "rb"); + + if (fp == NULL) + { + log_error ("%s: %s", input_buf, strerror (errno)); + + exit (-1); + } + + char buf[512]; + + int n = fread (buf, 1, sizeof (buf), fp); + + fclose (fp); + + if (n != 512) return (PARSER_TC_FILE_SIZE); + + memcpy (tc->salt_buf, buf, 64); + + memcpy (tc->data_buf, buf + 64, 512 - 64); + + salt->salt_buf[0] = tc->salt_buf[0]; + + salt->salt_len = 4; + + salt->salt_iter = 2000 - 1; + + digest[0] = tc->data_buf[0]; + + return (PARSER_OK); +} + +int md5aix_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf) +{ + if ((input_len < DISPLAY_LEN_MIN_6300) || (input_len > DISPLAY_LEN_MAX_6300)) return (PARSER_GLOBAL_LENGTH); + + if (memcmp (SIGNATURE_MD5AIX, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED); + + uint32_t *digest = (uint32_t *) hash_buf->digest; + + salt_t *salt = hash_buf->salt; + + char *salt_pos = input_buf + 6; + + char *hash_pos = strchr (salt_pos, '$'); + + if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); + + uint salt_len = hash_pos - salt_pos; + + if (salt_len < 8) return (PARSER_SALT_LENGTH); + + memcpy ((char *) salt->salt_buf, salt_pos, salt_len); + + salt->salt_len = salt_len; + + salt->salt_iter = 1000; + + hash_pos++; + + md5crypt_decode ((unsigned char *) digest, (unsigned char *) hash_pos); + + return (PARSER_OK); +} + +int sha1aix_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf) +{ + if ((input_len < DISPLAY_LEN_MIN_6700) || (input_len > DISPLAY_LEN_MAX_6700)) return (PARSER_GLOBAL_LENGTH); + + if (memcmp (SIGNATURE_SHA1AIX, input_buf, 7)) return (PARSER_SIGNATURE_UNMATCHED); + + uint32_t *digest = (uint32_t *) hash_buf->digest; + + salt_t *salt = hash_buf->salt; + + char *iter_pos = input_buf + 7; + + char *salt_pos = strchr (iter_pos, '$'); + + if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); + + salt_pos++; + + char *hash_pos = strchr (salt_pos, '$'); + + if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); + + uint salt_len = hash_pos - salt_pos; + + if (salt_len < 16) return (PARSER_SALT_LENGTH); + + memcpy ((char *) salt->salt_buf, salt_pos, salt_len); + + salt->salt_len = salt_len; + + char salt_iter[3] = { iter_pos[0], iter_pos[1], 0 }; + + salt->salt_sign[0] = atoi (salt_iter); + + salt->salt_iter = (1 << atoi (salt_iter)) - 1; + + hash_pos++; + + sha1aix_decode ((unsigned char *) digest, (unsigned char *) hash_pos); + + digest[0] = byte_swap_32 (digest[0]); + digest[1] = byte_swap_32 (digest[1]); + digest[2] = byte_swap_32 (digest[2]); + digest[3] = byte_swap_32 (digest[3]); + digest[4] = byte_swap_32 (digest[4]); + + return (PARSER_OK); +} + +int sha256aix_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf) +{ + if ((input_len < DISPLAY_LEN_MIN_6400) || (input_len > DISPLAY_LEN_MAX_6400)) return (PARSER_GLOBAL_LENGTH); + + if (memcmp (SIGNATURE_SHA256AIX, input_buf, 9)) return (PARSER_SIGNATURE_UNMATCHED); + + uint32_t *digest = (uint32_t *) hash_buf->digest; + + salt_t *salt = hash_buf->salt; + + char *iter_pos = input_buf + 9; + + char *salt_pos = strchr (iter_pos, '$'); + + if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); + + salt_pos++; + + char *hash_pos = strchr (salt_pos, '$'); + + if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); + + uint salt_len = hash_pos - salt_pos; + + if (salt_len < 16) return (PARSER_SALT_LENGTH); + + memcpy ((char *) salt->salt_buf, salt_pos, salt_len); + + salt->salt_len = salt_len; + + char salt_iter[3] = { iter_pos[0], iter_pos[1], 0 }; + + salt->salt_sign[0] = atoi (salt_iter); + + salt->salt_iter = (1 << atoi (salt_iter)) - 1; + + hash_pos++; + + sha256aix_decode ((unsigned char *) digest, (unsigned char *) hash_pos); + + digest[0] = byte_swap_32 (digest[0]); + digest[1] = byte_swap_32 (digest[1]); + digest[2] = byte_swap_32 (digest[2]); + digest[3] = byte_swap_32 (digest[3]); + digest[4] = byte_swap_32 (digest[4]); + digest[5] = byte_swap_32 (digest[5]); + digest[6] = byte_swap_32 (digest[6]); + digest[7] = byte_swap_32 (digest[7]); + + return (PARSER_OK); +} + +int sha512aix_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf) +{ + if ((input_len < DISPLAY_LEN_MIN_6500) || (input_len > DISPLAY_LEN_MAX_6500)) return (PARSER_GLOBAL_LENGTH); + + if (memcmp (SIGNATURE_SHA512AIX, input_buf, 9)) return (PARSER_SIGNATURE_UNMATCHED); + + uint64_t *digest = (uint64_t *) hash_buf->digest; + + salt_t *salt = hash_buf->salt; + + char *iter_pos = input_buf + 9; + + char *salt_pos = strchr (iter_pos, '$'); + + if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); + + salt_pos++; + + char *hash_pos = strchr (salt_pos, '$'); + + if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); + + uint salt_len = hash_pos - salt_pos; + + if (salt_len < 16) return (PARSER_SALT_LENGTH); + + memcpy ((char *) salt->salt_buf, salt_pos, salt_len); + + salt->salt_len = salt_len; + + char salt_iter[3] = { iter_pos[0], iter_pos[1], 0 }; + + salt->salt_sign[0] = atoi (salt_iter); + + salt->salt_iter = (1 << atoi (salt_iter)) - 1; + + hash_pos++; + + sha512aix_decode ((unsigned char *) digest, (unsigned char *) hash_pos); + + digest[0] = byte_swap_64 (digest[0]); + digest[1] = byte_swap_64 (digest[1]); + digest[2] = byte_swap_64 (digest[2]); + digest[3] = byte_swap_64 (digest[3]); + digest[4] = byte_swap_64 (digest[4]); + digest[5] = byte_swap_64 (digest[5]); + digest[6] = byte_swap_64 (digest[6]); + digest[7] = byte_swap_64 (digest[7]); + + return (PARSER_OK); +} + +int agilekey_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf) +{ + if ((input_len < DISPLAY_LEN_MIN_6600) || (input_len > DISPLAY_LEN_MAX_6600)) return (PARSER_GLOBAL_LENGTH); + + uint32_t *digest = (uint32_t *) hash_buf->digest; + + salt_t *salt = hash_buf->salt; + + agilekey_t *agilekey = (agilekey_t *) hash_buf->esalt; + + /** + * parse line + */ + + char *iterations_pos = input_buf; + + char *saltbuf_pos = strchr (iterations_pos, ':'); + + if (saltbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); + + uint iterations_len = saltbuf_pos - iterations_pos; + + if (iterations_len > 6) return (PARSER_SALT_LENGTH); + + saltbuf_pos++; + + char *cipherbuf_pos = strchr (saltbuf_pos, ':'); + + if (cipherbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); + + uint saltbuf_len = cipherbuf_pos - saltbuf_pos; + + if (saltbuf_len != 16) return (PARSER_SALT_LENGTH); + + uint cipherbuf_len = input_len - iterations_len - 1 - saltbuf_len - 1; + + if (cipherbuf_len != 2080) return (PARSER_HASH_LENGTH); + + cipherbuf_pos++; + + /** + * pbkdf2 iterations + */ + + salt->salt_iter = atoi (iterations_pos) - 1; + + /** + * handle salt encoding + */ + + char *saltbuf_ptr = (char *) salt->salt_buf; + + for (uint i = 0; i < saltbuf_len; i += 2) + { + const char p0 = saltbuf_pos[i + 0]; + const char p1 = saltbuf_pos[i + 1]; + + *saltbuf_ptr++ = hex_convert (p1) << 0 + | hex_convert (p0) << 4; + } + + salt->salt_len = saltbuf_len / 2; + + /** + * handle cipher encoding + */ + + uint *tmp = (uint *) mymalloc (32); + + char *cipherbuf_ptr = (char *) tmp; + + for (uint i = 2016; i < cipherbuf_len; i += 2) + { + const char p0 = cipherbuf_pos[i + 0]; + const char p1 = cipherbuf_pos[i + 1]; + + *cipherbuf_ptr++ = hex_convert (p1) << 0 + | hex_convert (p0) << 4; + } + + // iv is stored at salt_buf 4 (length 16) + // data is stored at salt_buf 8 (length 16) + + salt->salt_buf[ 4] = byte_swap_32 (tmp[0]); + salt->salt_buf[ 5] = byte_swap_32 (tmp[1]); + salt->salt_buf[ 6] = byte_swap_32 (tmp[2]); + salt->salt_buf[ 7] = byte_swap_32 (tmp[3]); + + salt->salt_buf[ 8] = byte_swap_32 (tmp[4]); + salt->salt_buf[ 9] = byte_swap_32 (tmp[5]); + salt->salt_buf[10] = byte_swap_32 (tmp[6]); + salt->salt_buf[11] = byte_swap_32 (tmp[7]); + + free (tmp); + + for (uint i = 0, j = 0; i < 1040; i += 1, j += 2) + { + const char p0 = cipherbuf_pos[j + 0]; + const char p1 = cipherbuf_pos[j + 1]; + + agilekey->cipher[i] = hex_convert (p1) << 0 + | hex_convert (p0) << 4; + } + + /** + * digest buf + */ + + digest[0] = 0x10101010; + digest[1] = 0x10101010; + digest[2] = 0x10101010; + digest[3] = 0x10101010; + + return (PARSER_OK); +} + +int lastpass_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf) +{ + if ((input_len < DISPLAY_LEN_MIN_6800) || (input_len > DISPLAY_LEN_MAX_6800)) return (PARSER_GLOBAL_LENGTH); + + uint32_t *digest = (uint32_t *) hash_buf->digest; + + salt_t *salt = hash_buf->salt; + + char *hashbuf_pos = input_buf; + + char *iterations_pos = strchr (hashbuf_pos, ':'); + + if (iterations_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); + + uint hash_len = iterations_pos - hashbuf_pos; + + if ((hash_len != 32) && (hash_len != 64)) return (PARSER_HASH_LENGTH); + + iterations_pos++; + + char *saltbuf_pos = strchr (iterations_pos, ':'); + + if (saltbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); + + uint iterations_len = saltbuf_pos - iterations_pos; + + saltbuf_pos++; + + uint salt_len = input_len - hash_len - 1 - iterations_len - 1; + + if (salt_len > 32) return (PARSER_SALT_LENGTH); + + char *salt_buf_ptr = (char *) salt->salt_buf; + + salt_len = parse_and_store_salt (salt_buf_ptr, saltbuf_pos, salt_len); + + if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH); + + salt->salt_len = salt_len; + + salt->salt_iter = atoi (iterations_pos) - 1; + + digest[0] = hex_to_uint (&hashbuf_pos[ 0]); + digest[1] = hex_to_uint (&hashbuf_pos[ 8]); + digest[2] = hex_to_uint (&hashbuf_pos[16]); + digest[3] = hex_to_uint (&hashbuf_pos[24]); + + return (PARSER_OK); +} + +int gost_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf) +{ + if ((input_len < DISPLAY_LEN_MIN_6900) || (input_len > DISPLAY_LEN_MAX_6900)) return (PARSER_GLOBAL_LENGTH); + + uint32_t *digest = (uint32_t *) hash_buf->digest; + + digest[0] = hex_to_uint (&input_buf[ 0]); + digest[1] = hex_to_uint (&input_buf[ 8]); + digest[2] = hex_to_uint (&input_buf[16]); + digest[3] = hex_to_uint (&input_buf[24]); + digest[4] = hex_to_uint (&input_buf[32]); + digest[5] = hex_to_uint (&input_buf[40]); + digest[6] = hex_to_uint (&input_buf[48]); + digest[7] = hex_to_uint (&input_buf[56]); + + digest[0] = byte_swap_32 (digest[0]); + digest[1] = byte_swap_32 (digest[1]); + digest[2] = byte_swap_32 (digest[2]); + digest[3] = byte_swap_32 (digest[3]); + digest[4] = byte_swap_32 (digest[4]); + digest[5] = byte_swap_32 (digest[5]); + digest[6] = byte_swap_32 (digest[6]); + digest[7] = byte_swap_32 (digest[7]); + + return (PARSER_OK); +} + +int sha256crypt_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf) +{ + if (memcmp (SIGNATURE_SHA256CRYPT, input_buf, 3)) return (PARSER_SIGNATURE_UNMATCHED); + + uint32_t *digest = (uint32_t *) hash_buf->digest; + + salt_t *salt = hash_buf->salt; + + char *salt_pos = input_buf + 3; + + uint iterations_len = 0; + + if (memcmp (salt_pos, "rounds=", 7) == 0) + { + salt_pos += 7; + + for (iterations_len = 0; salt_pos[0] >= '0' && salt_pos[0] <= '9' && iterations_len < 7; iterations_len++, salt_pos += 1) continue; + + if (iterations_len == 0 ) return (PARSER_SALT_ITERATION); + if (salt_pos[0] != '$') return (PARSER_SIGNATURE_UNMATCHED); + + salt_pos[0] = 0x0; + + salt->salt_iter = atoi (salt_pos - iterations_len); + + salt_pos += 1; + + iterations_len += 8; + } + else + { + salt->salt_iter = ROUNDS_SHA256CRYPT; + } + + if ((input_len < DISPLAY_LEN_MIN_7400) || (input_len > DISPLAY_LEN_MAX_7400 + iterations_len)) return (PARSER_GLOBAL_LENGTH); + + char *hash_pos = strchr (salt_pos, '$'); + + if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); + + uint salt_len = hash_pos - salt_pos; + + if (salt_len > 16) return (PARSER_SALT_LENGTH); + + memcpy ((char *) salt->salt_buf, salt_pos, salt_len); + + salt->salt_len = salt_len; + + hash_pos++; + + sha256crypt_decode ((unsigned char *) digest, (unsigned char *) hash_pos); + + return (PARSER_OK); +} + +int sha512osx_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf) +{ + uint max_len = DISPLAY_LEN_MAX_7100 + (2 * 128); + + if ((input_len < DISPLAY_LEN_MIN_7100) || (input_len > max_len)) return (PARSER_GLOBAL_LENGTH); + + if (memcmp (SIGNATURE_SHA512OSX, input_buf, 4)) return (PARSER_SIGNATURE_UNMATCHED); + + uint64_t *digest = (uint64_t *) hash_buf->digest; + + salt_t *salt = hash_buf->salt; + + pbkdf2_sha512_t *pbkdf2_sha512 = (pbkdf2_sha512_t *) hash_buf->esalt; + + char *iter_pos = input_buf + 4; + + char *salt_pos = strchr (iter_pos, '$'); + + if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); + + salt_pos++; + + char *hash_pos = strchr (salt_pos, '$'); + + if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); + + if (((input_len - (hash_pos - input_buf) - 1) % 128) != 0) return (PARSER_GLOBAL_LENGTH); + + hash_pos++; + + digest[0] = hex_to_uint64_t (&hash_pos[ 0]); + digest[1] = hex_to_uint64_t (&hash_pos[ 16]); + digest[2] = hex_to_uint64_t (&hash_pos[ 32]); + digest[3] = hex_to_uint64_t (&hash_pos[ 48]); + digest[4] = hex_to_uint64_t (&hash_pos[ 64]); + digest[5] = hex_to_uint64_t (&hash_pos[ 80]); + digest[6] = hex_to_uint64_t (&hash_pos[ 96]); + digest[7] = hex_to_uint64_t (&hash_pos[112]); + + uint salt_len = hash_pos - salt_pos - 1; + + if ((salt_len % 2) != 0) return (PARSER_SALT_LENGTH); + + salt->salt_len = salt_len / 2; + + pbkdf2_sha512->salt_buf[0] = hex_to_uint (&salt_pos[ 0]); + pbkdf2_sha512->salt_buf[1] = hex_to_uint (&salt_pos[ 8]); + pbkdf2_sha512->salt_buf[2] = hex_to_uint (&salt_pos[16]); + pbkdf2_sha512->salt_buf[3] = hex_to_uint (&salt_pos[24]); + pbkdf2_sha512->salt_buf[4] = hex_to_uint (&salt_pos[32]); + pbkdf2_sha512->salt_buf[5] = hex_to_uint (&salt_pos[40]); + pbkdf2_sha512->salt_buf[6] = hex_to_uint (&salt_pos[48]); + pbkdf2_sha512->salt_buf[7] = hex_to_uint (&salt_pos[56]); + + pbkdf2_sha512->salt_buf[0] = byte_swap_32 (pbkdf2_sha512->salt_buf[0]); + pbkdf2_sha512->salt_buf[1] = byte_swap_32 (pbkdf2_sha512->salt_buf[1]); + pbkdf2_sha512->salt_buf[2] = byte_swap_32 (pbkdf2_sha512->salt_buf[2]); + pbkdf2_sha512->salt_buf[3] = byte_swap_32 (pbkdf2_sha512->salt_buf[3]); + pbkdf2_sha512->salt_buf[4] = byte_swap_32 (pbkdf2_sha512->salt_buf[4]); + pbkdf2_sha512->salt_buf[5] = byte_swap_32 (pbkdf2_sha512->salt_buf[5]); + pbkdf2_sha512->salt_buf[6] = byte_swap_32 (pbkdf2_sha512->salt_buf[6]); + pbkdf2_sha512->salt_buf[7] = byte_swap_32 (pbkdf2_sha512->salt_buf[7]); + pbkdf2_sha512->salt_buf[8] = 0x01000000; + pbkdf2_sha512->salt_buf[9] = 0x80; + + salt->salt_buf[0] = pbkdf2_sha512->salt_buf[0]; + + salt->salt_iter = atoi (iter_pos) - 1; + + return (PARSER_OK); +} + +int episerver4_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf) +{ + if ((input_len < DISPLAY_LEN_MIN_1441) || (input_len > DISPLAY_LEN_MAX_1441)) return (PARSER_GLOBAL_LENGTH); + + if (memcmp (SIGNATURE_EPISERVER4, input_buf, 14)) return (PARSER_SIGNATURE_UNMATCHED); + + uint32_t *digest = (uint32_t *) hash_buf->digest; + + salt_t *salt = hash_buf->salt; + + char *salt_pos = input_buf + 14; + + char *hash_pos = strchr (salt_pos, '*'); + + if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); + + hash_pos++; + + uint salt_len = hash_pos - salt_pos - 1; + + char *salt_buf_ptr = (char *) salt->salt_buf; + + salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len); + + if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH); + + salt->salt_len = salt_len; + + char tmp_buf[100]; memset (tmp_buf, 0, sizeof (tmp_buf)); + + base64_decode (base64_to_int, hash_pos, 43, tmp_buf); + + memcpy (digest, tmp_buf, 32); + + digest[0] = byte_swap_32 (digest[0]); + digest[1] = byte_swap_32 (digest[1]); + digest[2] = byte_swap_32 (digest[2]); + digest[3] = byte_swap_32 (digest[3]); + digest[4] = byte_swap_32 (digest[4]); + digest[5] = byte_swap_32 (digest[5]); + digest[6] = byte_swap_32 (digest[6]); + digest[7] = byte_swap_32 (digest[7]); + + digest[0] -= SHA256M_A; + digest[1] -= SHA256M_B; + digest[2] -= SHA256M_C; + digest[3] -= SHA256M_D; + digest[4] -= SHA256M_E; + digest[5] -= SHA256M_F; + digest[6] -= SHA256M_G; + digest[7] -= SHA256M_H; + + return (PARSER_OK); +} + +int sha512grub_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf) +{ + uint max_len = DISPLAY_LEN_MAX_7200 + (8 * 128); + + if ((input_len < DISPLAY_LEN_MIN_7200) || (input_len > max_len)) return (PARSER_GLOBAL_LENGTH); + + if (memcmp (SIGNATURE_SHA512GRUB, input_buf, 19)) return (PARSER_SIGNATURE_UNMATCHED); + + uint64_t *digest = (uint64_t *) hash_buf->digest; + + salt_t *salt = hash_buf->salt; + + pbkdf2_sha512_t *pbkdf2_sha512 = (pbkdf2_sha512_t *) hash_buf->esalt; + + char *iter_pos = input_buf + 19; + + char *salt_pos = strchr (iter_pos, '.'); + + if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); + + salt_pos++; + + char *hash_pos = strchr (salt_pos, '.'); + + if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); + + if (((input_len - (hash_pos - input_buf) - 1) % 128) != 0) return (PARSER_GLOBAL_LENGTH); + + hash_pos++; + + digest[0] = hex_to_uint64_t (&hash_pos[ 0]); + digest[1] = hex_to_uint64_t (&hash_pos[ 16]); + digest[2] = hex_to_uint64_t (&hash_pos[ 32]); + digest[3] = hex_to_uint64_t (&hash_pos[ 48]); + digest[4] = hex_to_uint64_t (&hash_pos[ 64]); + digest[5] = hex_to_uint64_t (&hash_pos[ 80]); + digest[6] = hex_to_uint64_t (&hash_pos[ 96]); + digest[7] = hex_to_uint64_t (&hash_pos[112]); + + uint salt_len = hash_pos - salt_pos - 1; + + salt_len /= 2; + + char *salt_buf_ptr = (char *) pbkdf2_sha512->salt_buf; + + uint i; + + for (i = 0; i < salt_len; i++) + { + salt_buf_ptr[i] = hex_to_char (&salt_pos[i * 2]); + } + + salt_buf_ptr[salt_len + 3] = 0x01; + salt_buf_ptr[salt_len + 4] = 0x80; + + salt->salt_buf[0] = pbkdf2_sha512->salt_buf[0]; + + salt->salt_len = salt_len; + + salt->salt_iter = atoi (iter_pos) - 1; + + return (PARSER_OK); +} + +int sha512b64s_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf) +{ + if ((input_len < DISPLAY_LEN_MIN_1711) || (input_len > DISPLAY_LEN_MAX_1711)) return (PARSER_GLOBAL_LENGTH); + + if (memcmp (SIGNATURE_SHA512B64S, input_buf, 9)) return (PARSER_SIGNATURE_UNMATCHED); + + uint64_t *digest = (uint64_t *) hash_buf->digest; + + salt_t *salt = hash_buf->salt; + + char tmp_buf[120]; + + memset (tmp_buf, 0, sizeof (tmp_buf)); + + int tmp_len = base64_decode (base64_to_int, input_buf + 9, input_len - 9, tmp_buf); + + memcpy (digest, tmp_buf, 64); + + digest[0] = byte_swap_64 (digest[0]); + digest[1] = byte_swap_64 (digest[1]); + digest[2] = byte_swap_64 (digest[2]); + digest[3] = byte_swap_64 (digest[3]); + digest[4] = byte_swap_64 (digest[4]); + digest[5] = byte_swap_64 (digest[5]); + digest[6] = byte_swap_64 (digest[6]); + digest[7] = byte_swap_64 (digest[7]); + + digest[0] -= SHA512M_A; + digest[1] -= SHA512M_B; + digest[2] -= SHA512M_C; + digest[3] -= SHA512M_D; + digest[4] -= SHA512M_E; + digest[5] -= SHA512M_F; + digest[6] -= SHA512M_G; + digest[7] -= SHA512M_H; + + salt->salt_len = tmp_len - 64; + + memcpy (salt->salt_buf, tmp_buf + 64, salt->salt_len); + + if (data.opts_type & OPTS_TYPE_ST_ADD80) + { + char *ptr = (char *) salt->salt_buf; + + ptr[salt->salt_len] = 0x80; + } + + return (PARSER_OK); +} + +int hmacmd5_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf) +{ + if (data.opts_type & OPTS_TYPE_ST_HEX) + { + if ((input_len < DISPLAY_LEN_MIN_50H) || (input_len > DISPLAY_LEN_MAX_50H)) return (PARSER_GLOBAL_LENGTH); + } + else + { + if ((input_len < DISPLAY_LEN_MIN_50) || (input_len > DISPLAY_LEN_MAX_50)) return (PARSER_GLOBAL_LENGTH); + } + + uint32_t *digest = (uint32_t *) hash_buf->digest; + + salt_t *salt = hash_buf->salt; + + digest[0] = hex_to_uint (&input_buf[ 0]); + digest[1] = hex_to_uint (&input_buf[ 8]); + digest[2] = hex_to_uint (&input_buf[16]); + digest[3] = hex_to_uint (&input_buf[24]); + + digest[0] = byte_swap_32 (digest[0]); + digest[1] = byte_swap_32 (digest[1]); + digest[2] = byte_swap_32 (digest[2]); + digest[3] = byte_swap_32 (digest[3]); + + if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED); + + uint salt_len = input_len - 32 - 1; + + char *salt_buf = input_buf + 32 + 1; + + char *salt_buf_ptr = (char *) salt->salt_buf; + + salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len); + + if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH); + + salt->salt_len = salt_len; + + return (PARSER_OK); +} + +int hmacsha1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf) +{ + if (data.opts_type & OPTS_TYPE_ST_HEX) + { + if ((input_len < DISPLAY_LEN_MIN_150H) || (input_len > DISPLAY_LEN_MAX_150H)) return (PARSER_GLOBAL_LENGTH); + } + else + { + if ((input_len < DISPLAY_LEN_MIN_150) || (input_len > DISPLAY_LEN_MAX_150)) return (PARSER_GLOBAL_LENGTH); + } + + uint32_t *digest = (uint32_t *) hash_buf->digest; + + salt_t *salt = hash_buf->salt; + + digest[0] = hex_to_uint (&input_buf[ 0]); + digest[1] = hex_to_uint (&input_buf[ 8]); + digest[2] = hex_to_uint (&input_buf[16]); + digest[3] = hex_to_uint (&input_buf[24]); + digest[4] = hex_to_uint (&input_buf[32]); + + if (input_buf[40] != data.separator) return (PARSER_SEPARATOR_UNMATCHED); + + uint salt_len = input_len - 40 - 1; + + char *salt_buf = input_buf + 40 + 1; + + char *salt_buf_ptr = (char *) salt->salt_buf; + + salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len); + + if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH); + + salt->salt_len = salt_len; + + return (PARSER_OK); +} + +int hmacsha256_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf) +{ + if (data.opts_type & OPTS_TYPE_ST_HEX) + { + if ((input_len < DISPLAY_LEN_MIN_1450H) || (input_len > DISPLAY_LEN_MAX_1450H)) return (PARSER_GLOBAL_LENGTH); + } + else + { + if ((input_len < DISPLAY_LEN_MIN_1450) || (input_len > DISPLAY_LEN_MAX_1450)) return (PARSER_GLOBAL_LENGTH); + } + + uint32_t *digest = (uint32_t *) hash_buf->digest; + + salt_t *salt = hash_buf->salt; + + digest[0] = hex_to_uint (&input_buf[ 0]); + digest[1] = hex_to_uint (&input_buf[ 8]); + digest[2] = hex_to_uint (&input_buf[16]); + digest[3] = hex_to_uint (&input_buf[24]); + digest[4] = hex_to_uint (&input_buf[32]); + digest[5] = hex_to_uint (&input_buf[40]); + digest[6] = hex_to_uint (&input_buf[48]); + digest[7] = hex_to_uint (&input_buf[56]); + + if (input_buf[64] != data.separator) return (PARSER_SEPARATOR_UNMATCHED); + + uint salt_len = input_len - 64 - 1; + + char *salt_buf = input_buf + 64 + 1; + + char *salt_buf_ptr = (char *) salt->salt_buf; + + salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len); + + if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH); + + salt->salt_len = salt_len; + + return (PARSER_OK); +} + +int hmacsha512_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf) +{ + if (data.opts_type & OPTS_TYPE_ST_HEX) + { + if ((input_len < DISPLAY_LEN_MIN_1750H) || (input_len > DISPLAY_LEN_MAX_1750H)) return (PARSER_GLOBAL_LENGTH); + } + else + { + if ((input_len < DISPLAY_LEN_MIN_1750) || (input_len > DISPLAY_LEN_MAX_1750)) return (PARSER_GLOBAL_LENGTH); + } + + uint64_t *digest = (uint64_t *) hash_buf->digest; + + salt_t *salt = hash_buf->salt; + + digest[0] = hex_to_uint64_t (&input_buf[ 0]); + digest[1] = hex_to_uint64_t (&input_buf[ 16]); + digest[2] = hex_to_uint64_t (&input_buf[ 32]); + digest[3] = hex_to_uint64_t (&input_buf[ 48]); + digest[4] = hex_to_uint64_t (&input_buf[ 64]); + digest[5] = hex_to_uint64_t (&input_buf[ 80]); + digest[6] = hex_to_uint64_t (&input_buf[ 96]); + digest[7] = hex_to_uint64_t (&input_buf[112]); + + if (input_buf[128] != data.separator) return (PARSER_SEPARATOR_UNMATCHED); + + uint salt_len = input_len - 128 - 1; + + char *salt_buf = input_buf + 128 + 1; + + char *salt_buf_ptr = (char *) salt->salt_buf; + + salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len); + + if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH); + + salt->salt_len = salt_len; + + return (PARSER_OK); +} + +int krb5pa_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf) +{ + if ((input_len < DISPLAY_LEN_MIN_7500) || (input_len > DISPLAY_LEN_MAX_7500)) return (PARSER_GLOBAL_LENGTH); + + if (memcmp (SIGNATURE_KRB5PA, input_buf, 10)) return (PARSER_SIGNATURE_UNMATCHED); + + uint32_t *digest = (uint32_t *) hash_buf->digest; + + salt_t *salt = hash_buf->salt; + + krb5pa_t *krb5pa = (krb5pa_t *) hash_buf->esalt; + + /** + * parse line + */ + + char *user_pos = input_buf + 10 + 1; + + char *realm_pos = strchr (user_pos, '$'); + + if (realm_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); + + uint user_len = realm_pos - user_pos; + + if (user_len >= 64) return (PARSER_SALT_LENGTH); + + realm_pos++; + + char *salt_pos = strchr (realm_pos, '$'); + + if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); + + uint realm_len = salt_pos - realm_pos; + + if (realm_len >= 64) return (PARSER_SALT_LENGTH); + + salt_pos++; + + char *data_pos = strchr (salt_pos, '$'); + + if (data_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); + + uint salt_len = data_pos - salt_pos; + + if (salt_len >= 128) return (PARSER_SALT_LENGTH); + + data_pos++; + + uint data_len = input_len - 10 - 1 - user_len - 1 - realm_len - 1 - salt_len - 1; + + if (data_len != ((36 + 16) * 2)) return (PARSER_SALT_LENGTH); + + /** + * copy data + */ + + memcpy (krb5pa->user, user_pos, user_len); + memcpy (krb5pa->realm, realm_pos, realm_len); + memcpy (krb5pa->salt, salt_pos, salt_len); + + char *timestamp_ptr = (char *) krb5pa->timestamp; + + for (uint i = 0; i < (36 * 2); i += 2) + { + const char p0 = data_pos[i + 0]; + const char p1 = data_pos[i + 1]; + + *timestamp_ptr++ = hex_convert (p1) << 0 + | hex_convert (p0) << 4; + } + + char *checksum_ptr = (char *) krb5pa->checksum; + + for (uint i = (36 * 2); i < ((36 + 16) * 2); i += 2) + { + const char p0 = data_pos[i + 0]; + const char p1 = data_pos[i + 1]; + + *checksum_ptr++ = hex_convert (p1) << 0 + | hex_convert (p0) << 4; + } + + /** + * copy some data to generic buffers to make sorting happy + */ + + salt->salt_buf[0] = krb5pa->timestamp[0]; + salt->salt_buf[1] = krb5pa->timestamp[1]; + salt->salt_buf[2] = krb5pa->timestamp[2]; + salt->salt_buf[3] = krb5pa->timestamp[3]; + salt->salt_buf[4] = krb5pa->timestamp[4]; + salt->salt_buf[5] = krb5pa->timestamp[5]; + salt->salt_buf[6] = krb5pa->timestamp[6]; + salt->salt_buf[7] = krb5pa->timestamp[7]; + salt->salt_buf[8] = krb5pa->timestamp[8]; + + salt->salt_len = 36; + + digest[0] = krb5pa->checksum[0]; + digest[1] = krb5pa->checksum[1]; + digest[2] = krb5pa->checksum[2]; + digest[3] = krb5pa->checksum[3]; + + return (PARSER_OK); +} + +int sapb_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf) +{ + if ((input_len < DISPLAY_LEN_MIN_7700) || (input_len > DISPLAY_LEN_MAX_7700)) return (PARSER_GLOBAL_LENGTH); + + uint32_t *digest = (uint32_t *) hash_buf->digest; + + salt_t *salt = hash_buf->salt; + + /** + * parse line + */ + + char *salt_pos = input_buf; + + char *hash_pos = strchr (salt_pos, '$'); + + if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); + + uint salt_len = hash_pos - salt_pos; + + if (salt_len >= 40) return (PARSER_SALT_LENGTH); + + hash_pos++; + + uint hash_len = input_len - 1 - salt_len; + + if (hash_len != 16) return (PARSER_HASH_LENGTH); + + /** + * valid some data + */ + + uint user_len = 0; + + for (uint i = 0; i < salt_len; i++) + { + if (salt_pos[i] == ' ') continue; + + user_len++; + } + + // SAP user names cannot be longer than 12 characters + if (user_len > 12) return (PARSER_SALT_LENGTH); + + // SAP user name cannot start with ! or ? + if (salt_pos[0] == '!' || salt_pos[0] == '?') return (PARSER_SALT_VALUE); + + /** + * copy data + */ + + char *salt_buf_ptr = (char *) salt->salt_buf; + + salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len); + + if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH); + + salt->salt_len = salt_len; + + digest[0] = hex_to_uint (&hash_pos[0]); + digest[1] = hex_to_uint (&hash_pos[8]); + digest[2] = 0; + digest[3] = 0; + + digest[0] = byte_swap_32 (digest[0]); + digest[1] = byte_swap_32 (digest[1]); + + return (PARSER_OK); +} + +int sapg_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf) +{ + if ((input_len < DISPLAY_LEN_MIN_7800) || (input_len > DISPLAY_LEN_MAX_7800)) return (PARSER_GLOBAL_LENGTH); + + uint32_t *digest = (uint32_t *) hash_buf->digest; + + salt_t *salt = hash_buf->salt; + + /** + * parse line + */ + + char *salt_pos = input_buf; + + char *hash_pos = strchr (salt_pos, '$'); + + if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); + + uint salt_len = hash_pos - salt_pos; + + if (salt_len >= 40) return (PARSER_SALT_LENGTH); + + hash_pos++; + + uint hash_len = input_len - 1 - salt_len; + + if (hash_len != 40) return (PARSER_HASH_LENGTH); + + /** + * valid some data + */ + + uint user_len = 0; + + for (uint i = 0; i < salt_len; i++) + { + if (salt_pos[i] == ' ') continue; + + user_len++; + } + + // SAP user names cannot be longer than 12 characters + if (user_len > 12) return (PARSER_SALT_LENGTH); + + // SAP user name cannot start with ! or ? + if (salt_pos[0] == '!' || salt_pos[0] == '?') return (PARSER_SALT_VALUE); + + /** + * copy data + */ + + char *salt_buf_ptr = (char *) salt->salt_buf; + + salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len); + + if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH); + + salt->salt_len = salt_len; + + digest[0] = hex_to_uint (&hash_pos[ 0]); + digest[1] = hex_to_uint (&hash_pos[ 8]); + digest[2] = hex_to_uint (&hash_pos[16]); + digest[3] = hex_to_uint (&hash_pos[24]); + digest[4] = hex_to_uint (&hash_pos[32]); + + return (PARSER_OK); +} + +int drupal7_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf) +{ + if ((input_len < DISPLAY_LEN_MIN_7900) || (input_len > DISPLAY_LEN_MAX_7900)) return (PARSER_GLOBAL_LENGTH); + + if (memcmp (SIGNATURE_DRUPAL7, input_buf, 3)) return (PARSER_SIGNATURE_UNMATCHED); + + uint64_t *digest = (uint64_t *) hash_buf->digest; + + salt_t *salt = hash_buf->salt; + + char *iter_pos = input_buf + 3; + + uint salt_iter = 1 << itoa64_to_int (iter_pos[0]); + + if (salt_iter > 0x80000000) return (PARSER_SALT_ITERATION); + + memcpy ((char *) salt->salt_sign, input_buf, 4); + + salt->salt_iter = salt_iter; + + char *salt_pos = iter_pos + 1; + + uint salt_len = 8; + + memcpy ((char *) salt->salt_buf, salt_pos, salt_len); + + salt->salt_len = salt_len; + + char *hash_pos = salt_pos + salt_len; + + drupal7_decode ((unsigned char *) digest, (unsigned char *) hash_pos); + + // ugly hack start + + char *tmp = (char *) salt->salt_buf_pc; + + tmp[0] = hash_pos[42]; + + // ugly hack end + + digest[ 0] = byte_swap_64 (digest[ 0]); + digest[ 1] = byte_swap_64 (digest[ 1]); + digest[ 2] = byte_swap_64 (digest[ 2]); + digest[ 3] = byte_swap_64 (digest[ 3]); + digest[ 4] = 0; + digest[ 5] = 0; + digest[ 6] = 0; + digest[ 7] = 0; + + return (PARSER_OK); +} + +int sybasease_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf) +{ + if ((input_len < DISPLAY_LEN_MIN_8000) || (input_len > DISPLAY_LEN_MAX_8000)) return (PARSER_GLOBAL_LENGTH); + + if (memcmp (SIGNATURE_SYBASEASE, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED); + + uint32_t *digest = (uint32_t *) hash_buf->digest; + + salt_t *salt = hash_buf->salt; + + char *salt_buf = input_buf + 6; + + uint salt_len = 16; + + char *salt_buf_ptr = (char *) salt->salt_buf; + + salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len); + + if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH); + + salt->salt_len = salt_len; + + char *hash_pos = input_buf + 6 + 16; + + digest[0] = hex_to_uint (&hash_pos[ 0]); + digest[1] = hex_to_uint (&hash_pos[ 8]); + digest[2] = hex_to_uint (&hash_pos[16]); + digest[3] = hex_to_uint (&hash_pos[24]); + digest[4] = hex_to_uint (&hash_pos[32]); + digest[5] = hex_to_uint (&hash_pos[40]); + digest[6] = hex_to_uint (&hash_pos[48]); + digest[7] = hex_to_uint (&hash_pos[56]); + + return (PARSER_OK); +} + +int mysql323_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf) +{ + if ((input_len < DISPLAY_LEN_MIN_200) || (input_len > DISPLAY_LEN_MAX_200)) return (PARSER_GLOBAL_LENGTH); + + uint32_t *digest = (uint32_t *) hash_buf->digest; + + digest[0] = hex_to_uint (&input_buf[ 0]); + digest[1] = hex_to_uint (&input_buf[ 8]); + digest[2] = 0; + digest[3] = 0; + + return (PARSER_OK); +} + +int rakp_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf) +{ + if ((input_len < DISPLAY_LEN_MIN_7300) || (input_len > DISPLAY_LEN_MAX_7300)) return (PARSER_GLOBAL_LENGTH); + + uint32_t *digest = (uint32_t *) hash_buf->digest; + + salt_t *salt = hash_buf->salt; + + rakp_t *rakp = (rakp_t *) hash_buf->esalt; + + char *saltbuf_pos = input_buf; + + char *hashbuf_pos = strchr (saltbuf_pos, ':'); + + if (hashbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); + + uint saltbuf_len = hashbuf_pos - saltbuf_pos; + + if (saltbuf_len < 64) return (PARSER_SALT_LENGTH); + if (saltbuf_len > 512) return (PARSER_SALT_LENGTH); + + if (saltbuf_len & 1) return (PARSER_SALT_LENGTH); // muss gerade sein wegen hex + + hashbuf_pos++; + + uint hashbuf_len = input_len - saltbuf_len - 1; + + if (hashbuf_len != 40) return (PARSER_HASH_LENGTH); + + char *salt_ptr = (char *) saltbuf_pos; + char *rakp_ptr = (char *) rakp->salt_buf; + + uint i; + uint j; + + for (i = 0, j = 0; i < saltbuf_len; i += 2, j += 1) + { + rakp_ptr[j] = hex_to_char (&salt_ptr[i]); + } + + rakp_ptr[j] = 0x80; + + rakp->salt_len = j; + + for (i = 0; i < 64; i++) + { + rakp->salt_buf[i] = byte_swap_32 (rakp->salt_buf[i]); + } + + salt->salt_buf[0] = rakp->salt_buf[0]; + salt->salt_buf[1] = rakp->salt_buf[1]; + salt->salt_buf[2] = rakp->salt_buf[2]; + salt->salt_buf[3] = rakp->salt_buf[3]; + salt->salt_buf[4] = rakp->salt_buf[4]; + salt->salt_buf[5] = rakp->salt_buf[5]; + salt->salt_buf[6] = rakp->salt_buf[6]; + salt->salt_buf[7] = rakp->salt_buf[7]; + + salt->salt_len = 32; // muss min. 32 haben + + digest[0] = hex_to_uint (&hashbuf_pos[ 0]); + digest[1] = hex_to_uint (&hashbuf_pos[ 8]); + digest[2] = hex_to_uint (&hashbuf_pos[16]); + digest[3] = hex_to_uint (&hashbuf_pos[24]); + digest[4] = hex_to_uint (&hashbuf_pos[32]); + + return (PARSER_OK); +} + +int netscaler_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf) +{ + if ((input_len < DISPLAY_LEN_MIN_8100) || (input_len > DISPLAY_LEN_MAX_8100)) return (PARSER_GLOBAL_LENGTH); + + uint32_t *digest = (uint32_t *) hash_buf->digest; + + salt_t *salt = hash_buf->salt; + + if (memcmp (SIGNATURE_NETSCALER, input_buf, 1)) return (PARSER_SIGNATURE_UNMATCHED); + + char *salt_pos = input_buf + 1; + + memcpy (salt->salt_buf, salt_pos, 8); + + salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]); + salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]); + + salt->salt_len = 8; + + char *hash_pos = salt_pos + 8; + + digest[0] = hex_to_uint (&hash_pos[ 0]); + digest[1] = hex_to_uint (&hash_pos[ 8]); + digest[2] = hex_to_uint (&hash_pos[16]); + digest[3] = hex_to_uint (&hash_pos[24]); + digest[4] = hex_to_uint (&hash_pos[32]); + + digest[0] -= SHA1M_A; + digest[1] -= SHA1M_B; + digest[2] -= SHA1M_C; + digest[3] -= SHA1M_D; + digest[4] -= SHA1M_E; + + return (PARSER_OK); +} + +int chap_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf) +{ + if ((input_len < DISPLAY_LEN_MIN_4800) || (input_len > DISPLAY_LEN_MAX_4800)) return (PARSER_GLOBAL_LENGTH); + + uint32_t *digest = (uint32_t *) hash_buf->digest; + + salt_t *salt = hash_buf->salt; + + digest[0] = hex_to_uint (&input_buf[ 0]); + digest[1] = hex_to_uint (&input_buf[ 8]); + digest[2] = hex_to_uint (&input_buf[16]); + digest[3] = hex_to_uint (&input_buf[24]); + + digest[0] = byte_swap_32 (digest[0]); + digest[1] = byte_swap_32 (digest[1]); + digest[2] = byte_swap_32 (digest[2]); + digest[3] = byte_swap_32 (digest[3]); + + digest[0] -= MD5M_A; + digest[1] -= MD5M_B; + digest[2] -= MD5M_C; + digest[3] -= MD5M_D; + + if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED); + + char *salt_buf_ptr = input_buf + 32 + 1; + + uint32_t *salt_buf = salt->salt_buf; + + salt_buf[0] = hex_to_uint (&salt_buf_ptr[ 0]); + salt_buf[1] = hex_to_uint (&salt_buf_ptr[ 8]); + salt_buf[2] = hex_to_uint (&salt_buf_ptr[16]); + salt_buf[3] = hex_to_uint (&salt_buf_ptr[24]); + + salt_buf[0] = byte_swap_32 (salt_buf[0]); + salt_buf[1] = byte_swap_32 (salt_buf[1]); + salt_buf[2] = byte_swap_32 (salt_buf[2]); + salt_buf[3] = byte_swap_32 (salt_buf[3]); + + salt->salt_len = 16 + 1; + + if (input_buf[65] != data.separator) return (PARSER_SEPARATOR_UNMATCHED); + + char *idbyte_buf_ptr = input_buf + 32 + 1 + 32 + 1; + + salt_buf[4] = hex_to_char (&idbyte_buf_ptr[0]) & 0xff; + + return (PARSER_OK); +} + +int cloudkey_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf) +{ + if ((input_len < DISPLAY_LEN_MIN_8200) || (input_len > DISPLAY_LEN_MAX_8200)) return (PARSER_GLOBAL_LENGTH); + + uint32_t *digest = (uint32_t *) hash_buf->digest; + + salt_t *salt = hash_buf->salt; + + cloudkey_t *cloudkey = (cloudkey_t *) hash_buf->esalt; + + /** + * parse line + */ + + char *hashbuf_pos = input_buf; + + char *saltbuf_pos = strchr (hashbuf_pos, ':'); + + if (saltbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); + + const uint hashbuf_len = saltbuf_pos - hashbuf_pos; + + if (hashbuf_len != 64) return (PARSER_HASH_LENGTH); + + saltbuf_pos++; + + char *iteration_pos = strchr (saltbuf_pos, ':'); + + if (iteration_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); + + const uint saltbuf_len = iteration_pos - saltbuf_pos; + + if (saltbuf_len != 32) return (PARSER_SALT_LENGTH); + + iteration_pos++; + + char *databuf_pos = strchr (iteration_pos, ':'); + + if (databuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); + + const uint iteration_len = databuf_pos - iteration_pos; + + if (iteration_len < 1) return (PARSER_SALT_ITERATION); + if (iteration_len > 8) return (PARSER_SALT_ITERATION); + + const uint databuf_len = input_len - hashbuf_len - 1 - saltbuf_len - 1 - iteration_len - 1; + + if (databuf_len < 1) return (PARSER_SALT_LENGTH); + if (databuf_len > 2048) return (PARSER_SALT_LENGTH); + + databuf_pos++; + + // digest + + digest[0] = hex_to_uint (&hashbuf_pos[ 0]); + digest[1] = hex_to_uint (&hashbuf_pos[ 8]); + digest[2] = hex_to_uint (&hashbuf_pos[16]); + digest[3] = hex_to_uint (&hashbuf_pos[24]); + digest[4] = hex_to_uint (&hashbuf_pos[32]); + digest[5] = hex_to_uint (&hashbuf_pos[40]); + digest[6] = hex_to_uint (&hashbuf_pos[48]); + digest[7] = hex_to_uint (&hashbuf_pos[56]); + + // salt + + char *saltbuf_ptr = (char *) salt->salt_buf; + + for (uint i = 0; i < saltbuf_len; i += 2) + { + const char p0 = saltbuf_pos[i + 0]; + const char p1 = saltbuf_pos[i + 1]; + + *saltbuf_ptr++ = hex_convert (p1) << 0 + | hex_convert (p0) << 4; + } + + salt->salt_buf[4] = 0x01000000; + salt->salt_buf[5] = 0x80; + + salt->salt_len = saltbuf_len / 2; + + // iteration + + salt->salt_iter = atoi (iteration_pos) - 1; + + // data + + char *databuf_ptr = (char *) cloudkey->data_buf; + + for (uint i = 0; i < databuf_len; i += 2) + { + const char p0 = databuf_pos[i + 0]; + const char p1 = databuf_pos[i + 1]; + + *databuf_ptr++ = hex_convert (p1) << 0 + | hex_convert (p0) << 4; + } + + *databuf_ptr++ = 0x80; + + for (uint i = 0; i < 512; i++) + { + cloudkey->data_buf[i] = byte_swap_32 (cloudkey->data_buf[i]); + } + + cloudkey->data_len = databuf_len / 2; + + return (PARSER_OK); +} + +int nsec3_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf) +{ + if ((input_len < DISPLAY_LEN_MIN_8300) || (input_len > DISPLAY_LEN_MAX_8300)) return (PARSER_GLOBAL_LENGTH); + + uint32_t *digest = (uint32_t *) hash_buf->digest; + + salt_t *salt = hash_buf->salt; + + /** + * parse line + */ + + char *hashbuf_pos = input_buf; + + char *domainbuf_pos = strchr (hashbuf_pos, ':'); + + if (domainbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); + + const uint hashbuf_len = domainbuf_pos - hashbuf_pos; + + if (hashbuf_len != 32) return (PARSER_HASH_LENGTH); + + domainbuf_pos++; + + if (domainbuf_pos[0] != '.') return (PARSER_SALT_VALUE); + + char *saltbuf_pos = strchr (domainbuf_pos, ':'); + + if (saltbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); + + const uint domainbuf_len = saltbuf_pos - domainbuf_pos; + + if (domainbuf_len >= 32) return (PARSER_SALT_LENGTH); + + saltbuf_pos++; + + char *iteration_pos = strchr (saltbuf_pos, ':'); + + if (iteration_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); + + const uint saltbuf_len = iteration_pos - saltbuf_pos; + + if (saltbuf_len >= 28) return (PARSER_SALT_LENGTH); // 28 = 32 - 4; 4 = length + + if ((domainbuf_len + saltbuf_len) >= 48) return (PARSER_SALT_LENGTH); + + iteration_pos++; + + const uint iteration_len = input_len - hashbuf_len - 1 - domainbuf_len - 1 - saltbuf_len - 1; + + if (iteration_len < 1) return (PARSER_SALT_ITERATION); + if (iteration_len > 5) return (PARSER_SALT_ITERATION); + + // ok, the plan for this algorithm is the following: + // we have 2 salts here, the domain-name and a random salt + // while both are used in the initial transformation, + // only the random salt is used in the following iterations + // so we create two buffer, one that includes domain-name (stored into salt_buf_pc[]) + // and one that includes only the real salt (stored into salt_buf[]). + // the domain-name length is put into array position 7 of salt_buf_pc[] since there is not salt_pc_len + + char tmp_buf[100]; memset (tmp_buf, 0, sizeof (tmp_buf)); + + base32_decode (itoa32_to_int, hashbuf_pos, 32, tmp_buf); + + memcpy (digest, tmp_buf, 20); + + digest[0] = byte_swap_32 (digest[0]); + digest[1] = byte_swap_32 (digest[1]); + digest[2] = byte_swap_32 (digest[2]); + digest[3] = byte_swap_32 (digest[3]); + digest[4] = byte_swap_32 (digest[4]); + + // domain + + char *salt_buf_pc_ptr = (char *) salt->salt_buf_pc; + + memcpy (salt_buf_pc_ptr, domainbuf_pos, domainbuf_len); + + char *len_ptr = NULL; + + for (uint i = 0; i < domainbuf_len; i++) + { + if (salt_buf_pc_ptr[i] == '.') + { + len_ptr = &salt_buf_pc_ptr[i]; + + *len_ptr = 0; + } + else + { + *len_ptr += 1; + } + } + + salt->salt_buf_pc[7] = domainbuf_len; + + // "real" salt + + char *salt_buf_ptr = (char *) salt->salt_buf; + + const uint salt_len = parse_and_store_salt (salt_buf_ptr, saltbuf_pos, saltbuf_len); + + if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH); + + salt->salt_len = salt_len; + + // iteration + + salt->salt_iter = atoi (iteration_pos); + + return (PARSER_OK); +} + +int wbb3_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf) +{ + if ((input_len < DISPLAY_LEN_MIN_8400) || (input_len > DISPLAY_LEN_MAX_8400)) return (PARSER_GLOBAL_LENGTH); + + uint32_t *digest = (uint32_t *) hash_buf->digest; + + salt_t *salt = hash_buf->salt; + + digest[0] = hex_to_uint (&input_buf[ 0]); + digest[1] = hex_to_uint (&input_buf[ 8]); + digest[2] = hex_to_uint (&input_buf[16]); + digest[3] = hex_to_uint (&input_buf[24]); + digest[4] = hex_to_uint (&input_buf[32]); + + if (input_buf[40] != data.separator) return (PARSER_SEPARATOR_UNMATCHED); + + uint salt_len = input_len - 40 - 1; + + char *salt_buf = input_buf + 40 + 1; + + char *salt_buf_ptr = (char *) salt->salt_buf; + + salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len); + + if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH); + + salt->salt_len = salt_len; + + return (PARSER_OK); +} + +int racf_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf) +{ + const uint8_t ascii_to_ebcdic[] = + { + 0x00, 0x01, 0x02, 0x03, 0x37, 0x2d, 0x2e, 0x2f, 0x16, 0x05, 0x25, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, + 0x10, 0x11, 0x12, 0x13, 0x3c, 0x3d, 0x32, 0x26, 0x18, 0x19, 0x3f, 0x27, 0x1c, 0x1d, 0x1e, 0x1f, + 0x40, 0x4f, 0x7f, 0x7b, 0x5b, 0x6c, 0x50, 0x7d, 0x4d, 0x5d, 0x5c, 0x4e, 0x6b, 0x60, 0x4b, 0x61, + 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8, 0xf9, 0x7a, 0x5e, 0x4c, 0x7e, 0x6e, 0x6f, + 0x7c, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, + 0xd7, 0xd8, 0xd9, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, 0x4a, 0xe0, 0x5a, 0x5f, 0x6d, + 0x79, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, + 0x97, 0x98, 0x99, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, 0xa8, 0xa9, 0xc0, 0x6a, 0xd0, 0xa1, 0x07, + 0x20, 0x21, 0x22, 0x23, 0x24, 0x15, 0x06, 0x17, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x09, 0x0a, 0x1b, + 0x30, 0x31, 0x1a, 0x33, 0x34, 0x35, 0x36, 0x08, 0x38, 0x39, 0x3a, 0x3b, 0x04, 0x14, 0x3e, 0xe1, + 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, + 0x58, 0x59, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, + 0x76, 0x77, 0x78, 0x80, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f, 0x90, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, + 0x9f, 0xa0, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf, 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7, + 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, 0xda, 0xdb, + 0xdc, 0xdd, 0xde, 0xdf, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff, + }; + + if ((input_len < DISPLAY_LEN_MIN_8500) || (input_len > DISPLAY_LEN_MAX_8500)) return (PARSER_GLOBAL_LENGTH); + + if (memcmp (SIGNATURE_RACF, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED); + + uint32_t *digest = (uint32_t *) hash_buf->digest; + + salt_t *salt = hash_buf->salt; + + char *salt_pos = input_buf + 6 + 1; + + char *digest_pos = strchr (salt_pos, '*'); + + if (digest_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); + + uint salt_len = digest_pos - salt_pos; + + if (salt_len > 8) return (PARSER_SALT_LENGTH); + + uint hash_len = input_len - 1 - salt_len - 1 - 6; + + if (hash_len != 16) return (PARSER_HASH_LENGTH); + + digest_pos++; + + char *salt_buf_ptr = (char *) salt->salt_buf; + char *salt_buf_pc_ptr = (char *) salt->salt_buf_pc; + + salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len); + + if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH); + + salt->salt_len = salt_len; + + for (uint i = 0; i < salt_len; i++) + { + salt_buf_pc_ptr[i] = ascii_to_ebcdic[(int) salt_buf_ptr[i]]; + } + for (uint i = salt_len; i < 8; i++) + { + salt_buf_pc_ptr[i] = 0x40; + } + + uint tt; + + IP (salt->salt_buf_pc[0], salt->salt_buf_pc[1], tt); + + salt->salt_buf_pc[0] = ROTATE_LEFT (salt->salt_buf_pc[0], 3u); + salt->salt_buf_pc[1] = ROTATE_LEFT (salt->salt_buf_pc[1], 3u); + + digest[0] = hex_to_uint (&digest_pos[ 0]); + digest[1] = hex_to_uint (&digest_pos[ 8]); + + digest[0] = byte_swap_32 (digest[0]); + digest[1] = byte_swap_32 (digest[1]); + + IP (digest[0], digest[1], tt); + + digest[0] = ROTATE_RIGHT (digest[0], 29); + digest[1] = ROTATE_RIGHT (digest[1], 29); + digest[2] = 0; + digest[3] = 0; + + return (PARSER_OK); +} + +int lotus5_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf) +{ + if ((input_len < DISPLAY_LEN_MIN_8600) || (input_len > DISPLAY_LEN_MAX_8600)) return (PARSER_GLOBAL_LENGTH); + + uint32_t *digest = (uint32_t *) hash_buf->digest; + + digest[0] = hex_to_uint (&input_buf[ 0]); + digest[1] = hex_to_uint (&input_buf[ 8]); + digest[2] = hex_to_uint (&input_buf[16]); + digest[3] = hex_to_uint (&input_buf[24]); + + digest[0] = byte_swap_32 (digest[0]); + digest[1] = byte_swap_32 (digest[1]); + digest[2] = byte_swap_32 (digest[2]); + digest[3] = byte_swap_32 (digest[3]); + + return (PARSER_OK); +} + +int lotus6_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf) +{ + if ((input_len < DISPLAY_LEN_MIN_8700) || (input_len > DISPLAY_LEN_MAX_8700)) return (PARSER_GLOBAL_LENGTH); + + if ((input_buf[0] != '(') || (input_buf[1] != 'G') || (input_buf[21] != ')')) return (PARSER_SIGNATURE_UNMATCHED); + + uint32_t *digest = (uint32_t *) hash_buf->digest; + + salt_t *salt = hash_buf->salt; + + char tmp_buf[120]; + + memset (tmp_buf, 0, sizeof (tmp_buf)); + + base64_decode (lotus64_to_int, input_buf + 2, input_len - 3, tmp_buf); + + tmp_buf[3] += -4; // dont ask! + + memcpy (salt->salt_buf, tmp_buf, 5); + + salt->salt_len = 5; + + memcpy (digest, tmp_buf + 5, 9); + + // yes, only 9 byte are needed to crack, but 10 to display + + salt->salt_buf_pc[7] = input_buf[20]; + + return (PARSER_OK); +} + +int lotus8_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf) +{ + if ((input_len < DISPLAY_LEN_MIN_9100) || (input_len > DISPLAY_LEN_MAX_9100)) return (PARSER_GLOBAL_LENGTH); + + if ((input_buf[0] != '(') || (input_buf[1] != 'H') || (input_buf[DISPLAY_LEN_MAX_9100 - 1] != ')')) return (PARSER_SIGNATURE_UNMATCHED); + + uint32_t *digest = (uint32_t *) hash_buf->digest; + + salt_t *salt = hash_buf->salt; + + char tmp_buf[120]; + + memset (tmp_buf, 0, sizeof (tmp_buf)); + + base64_decode (lotus64_to_int, input_buf + 2, input_len - 3, tmp_buf); + + tmp_buf[3] += -4; // dont ask! + + // salt + + memcpy (salt->salt_buf, tmp_buf, 16); + + salt->salt_len = 16; // Attention: in theory we have 2 salt_len, one for the -m 8700 part (len: 8), 2nd for the 9100 part (len: 16) + + // iteration + + char tmp_iter_buf[11]; + + memcpy (tmp_iter_buf, tmp_buf + 16, 10); + + tmp_iter_buf[10] = 0; + + salt->salt_iter = atoi (tmp_iter_buf); + + if (salt->salt_iter < 1) // well, the limit hopefully is much higher + { + return (PARSER_SALT_ITERATION); + } + + salt->salt_iter--; // first round in init + + // 2 additional bytes for display only + + salt->salt_buf_pc[0] = tmp_buf[26]; + salt->salt_buf_pc[1] = tmp_buf[27]; + + // digest + + memcpy (digest, tmp_buf + 28, 8); + + digest[0] = byte_swap_32 (digest[0]); + digest[1] = byte_swap_32 (digest[1]); + digest[2] = 0; + digest[3] = 0; + + return (PARSER_OK); +} + +int hmailserver_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf) +{ + if ((input_len < DISPLAY_LEN_MIN_1421) || (input_len > DISPLAY_LEN_MAX_1421)) return (PARSER_GLOBAL_LENGTH); + + uint32_t *digest = (uint32_t *) hash_buf->digest; + + salt_t *salt = hash_buf->salt; + + char *salt_buf_pos = input_buf; + + char *hash_buf_pos = salt_buf_pos + 6; + + digest[0] = hex_to_uint (&hash_buf_pos[ 0]); + digest[1] = hex_to_uint (&hash_buf_pos[ 8]); + digest[2] = hex_to_uint (&hash_buf_pos[16]); + digest[3] = hex_to_uint (&hash_buf_pos[24]); + digest[4] = hex_to_uint (&hash_buf_pos[32]); + digest[5] = hex_to_uint (&hash_buf_pos[40]); + digest[6] = hex_to_uint (&hash_buf_pos[48]); + digest[7] = hex_to_uint (&hash_buf_pos[56]); + + digest[0] -= SHA256M_A; + digest[1] -= SHA256M_B; + digest[2] -= SHA256M_C; + digest[3] -= SHA256M_D; + digest[4] -= SHA256M_E; + digest[5] -= SHA256M_F; + digest[6] -= SHA256M_G; + digest[7] -= SHA256M_H; + + char *salt_buf_ptr = (char *) salt->salt_buf; + + const uint salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf_pos, 6); + + if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH); + + salt->salt_len = salt_len; + + return (PARSER_OK); +} + +int phps_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf) +{ + if ((input_len < DISPLAY_LEN_MIN_2612) || (input_len > DISPLAY_LEN_MAX_2612)) return (PARSER_GLOBAL_LENGTH); + + uint32_t *digest = (uint32_t *) hash_buf->digest; + + if (memcmp (SIGNATURE_PHPS, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED); + + salt_t *salt = hash_buf->salt; + + char *salt_buf = input_buf + 6; + + char *digest_buf = strchr (salt_buf, '$'); + + if (digest_buf == NULL) return (PARSER_SEPARATOR_UNMATCHED); + + uint salt_len = digest_buf - salt_buf; + + digest_buf++; // skip the '$' symbol + + char *salt_buf_ptr = (char *) salt->salt_buf; + + salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len); + + if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH); + + salt->salt_len = salt_len; + + digest[0] = hex_to_uint (&digest_buf[ 0]); + digest[1] = hex_to_uint (&digest_buf[ 8]); + digest[2] = hex_to_uint (&digest_buf[16]); + digest[3] = hex_to_uint (&digest_buf[24]); + + digest[0] = byte_swap_32 (digest[0]); + digest[1] = byte_swap_32 (digest[1]); + digest[2] = byte_swap_32 (digest[2]); + digest[3] = byte_swap_32 (digest[3]); + + digest[0] -= MD5M_A; + digest[1] -= MD5M_B; + digest[2] -= MD5M_C; + digest[3] -= MD5M_D; + + return (PARSER_OK); +} + +int mediawiki_b_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf) +{ + if ((input_len < DISPLAY_LEN_MIN_3711) || (input_len > DISPLAY_LEN_MAX_3711)) return (PARSER_GLOBAL_LENGTH); + + if (memcmp (SIGNATURE_MEDIAWIKI_B, input_buf, 3)) return (PARSER_SIGNATURE_UNMATCHED); + + uint32_t *digest = (uint32_t *) hash_buf->digest; + + salt_t *salt = hash_buf->salt; + + char *salt_buf = input_buf + 3; + + char *digest_buf = strchr (salt_buf, '$'); + + if (digest_buf == NULL) return (PARSER_SEPARATOR_UNMATCHED); + + uint salt_len = digest_buf - salt_buf; + + digest_buf++; // skip the '$' symbol + + char *salt_buf_ptr = (char *) salt->salt_buf; + + salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len); + + if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH); + + salt_buf_ptr[salt_len] = 0x2d; + + salt->salt_len = salt_len + 1; + + digest[0] = hex_to_uint (&digest_buf[ 0]); + digest[1] = hex_to_uint (&digest_buf[ 8]); + digest[2] = hex_to_uint (&digest_buf[16]); + digest[3] = hex_to_uint (&digest_buf[24]); + + digest[0] = byte_swap_32 (digest[0]); + digest[1] = byte_swap_32 (digest[1]); + digest[2] = byte_swap_32 (digest[2]); + digest[3] = byte_swap_32 (digest[3]); + + digest[0] -= MD5M_A; + digest[1] -= MD5M_B; + digest[2] -= MD5M_C; + digest[3] -= MD5M_D; + + return (PARSER_OK); +} + +int peoplesoft_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf) +{ + if ((input_len < DISPLAY_LEN_MIN_133) || (input_len > DISPLAY_LEN_MAX_133)) return (PARSER_GLOBAL_LENGTH); + + uint32_t *digest = (uint32_t *) hash_buf->digest; + + char tmp_buf[100]; + + memset (tmp_buf, 0, sizeof (tmp_buf)); + + base64_decode (base64_to_int, input_buf, input_len, tmp_buf); + + memcpy (digest, tmp_buf, 20); + + digest[0] = byte_swap_32 (digest[0]); + digest[1] = byte_swap_32 (digest[1]); + digest[2] = byte_swap_32 (digest[2]); + digest[3] = byte_swap_32 (digest[3]); + digest[4] = byte_swap_32 (digest[4]); + + digest[0] -= SHA1M_A; + digest[1] -= SHA1M_B; + digest[2] -= SHA1M_C; + digest[3] -= SHA1M_D; + digest[4] -= SHA1M_E; + + return (PARSER_OK); +} + +int skype_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf) +{ + if ((input_len < DISPLAY_LEN_MIN_23) || (input_len > DISPLAY_LEN_MAX_23)) return (PARSER_GLOBAL_LENGTH); + + uint32_t *digest = (uint32_t *) hash_buf->digest; + + salt_t *salt = hash_buf->salt; + + digest[0] = hex_to_uint (&input_buf[ 0]); + digest[1] = hex_to_uint (&input_buf[ 8]); + digest[2] = hex_to_uint (&input_buf[16]); + digest[3] = hex_to_uint (&input_buf[24]); + + digest[0] = byte_swap_32 (digest[0]); + digest[1] = byte_swap_32 (digest[1]); + digest[2] = byte_swap_32 (digest[2]); + digest[3] = byte_swap_32 (digest[3]); + + digest[0] -= MD5M_A; + digest[1] -= MD5M_B; + digest[2] -= MD5M_C; + digest[3] -= MD5M_D; + + if (input_buf[32] != ':') return (PARSER_SEPARATOR_UNMATCHED); + + uint salt_len = input_len - 32 - 1; + + char *salt_buf = input_buf + 32 + 1; + + char *salt_buf_ptr = (char *) salt->salt_buf; + + salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len); + + if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH); + + /* + * add static "salt" part + */ + + memcpy (salt_buf_ptr + salt_len, "\nskyper\n", 8); + + salt_len += 8; + + salt->salt_len = salt_len; + + return (PARSER_OK); +} + +int androidfde_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf) +{ + if ((input_len < DISPLAY_LEN_MIN_8800) || (input_len > DISPLAY_LEN_MAX_8800)) return (PARSER_GLOBAL_LENGTH); + + if (memcmp (SIGNATURE_ANDROIDFDE, input_buf, 5)) return (PARSER_SIGNATURE_UNMATCHED); + + uint32_t *digest = (uint32_t *) hash_buf->digest; + + salt_t *salt = hash_buf->salt; + + androidfde_t *androidfde = (androidfde_t *) hash_buf->esalt; + + /** + * parse line + */ + + char *saltlen_pos = input_buf + 1 + 3 + 1; + + char *saltbuf_pos = strchr (saltlen_pos, '$'); + + if (saltbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); + + uint saltlen_len = saltbuf_pos - saltlen_pos; + + if (saltlen_len != 2) return (PARSER_SALT_LENGTH); + + saltbuf_pos++; + + char *keylen_pos = strchr (saltbuf_pos, '$'); + + if (keylen_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); + + uint saltbuf_len = keylen_pos - saltbuf_pos; + + if (saltbuf_len != 32) return (PARSER_SALT_LENGTH); + + keylen_pos++; + + char *keybuf_pos = strchr (keylen_pos, '$'); + + if (keybuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); + + uint keylen_len = keybuf_pos - keylen_pos; + + if (keylen_len != 2) return (PARSER_SALT_LENGTH); + + keybuf_pos++; + + char *databuf_pos = strchr (keybuf_pos, '$'); + + if (databuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); + + uint keybuf_len = databuf_pos - keybuf_pos; + + if (keybuf_len != 32) return (PARSER_SALT_LENGTH); + + databuf_pos++; + + uint data_len = input_len - 1 - 3 - 1 - saltlen_len - 1 - saltbuf_len - 1 - keylen_len - 1 - keybuf_len - 1; + + if (data_len != 3072) return (PARSER_SALT_LENGTH); + + /** + * copy data + */ + + digest[0] = hex_to_uint (&keybuf_pos[ 0]); + digest[1] = hex_to_uint (&keybuf_pos[ 8]); + digest[2] = hex_to_uint (&keybuf_pos[16]); + digest[3] = hex_to_uint (&keybuf_pos[24]); + + salt->salt_buf[0] = hex_to_uint (&saltbuf_pos[ 0]); + salt->salt_buf[1] = hex_to_uint (&saltbuf_pos[ 8]); + salt->salt_buf[2] = hex_to_uint (&saltbuf_pos[16]); + salt->salt_buf[3] = hex_to_uint (&saltbuf_pos[24]); + + salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]); + salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]); + salt->salt_buf[2] = byte_swap_32 (salt->salt_buf[2]); + salt->salt_buf[3] = byte_swap_32 (salt->salt_buf[3]); + + salt->salt_len = 16; + salt->salt_iter = ROUNDS_ANDROIDFDE - 1; + + for (uint i = 0, j = 0; i < 3072; i += 8, j += 1) + { + androidfde->data[j] = hex_to_uint (&databuf_pos[i]); + } + + return (PARSER_OK); +} + +int scrypt_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf) +{ + if ((input_len < DISPLAY_LEN_MIN_8900) || (input_len > DISPLAY_LEN_MAX_8900)) return (PARSER_GLOBAL_LENGTH); + + if (memcmp (SIGNATURE_SCRYPT, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED); + + uint32_t *digest = (uint32_t *) hash_buf->digest; + + salt_t *salt = hash_buf->salt; + + /** + * parse line + */ + + // first is the N salt parameter + + char *N_pos = input_buf + 6; + + if (N_pos[0] != ':') return (PARSER_SEPARATOR_UNMATCHED); + + N_pos++; + + salt->scrypt_N = atoi (N_pos); + + // r + + char *r_pos = strchr (N_pos, ':'); + + if (r_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); + + r_pos++; + + salt->scrypt_r = atoi (r_pos); + + // p + + char *p_pos = strchr (r_pos, ':'); + + if (p_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); + + p_pos++; + + salt->scrypt_p = atoi (p_pos); + + // salt + + char *saltbuf_pos = strchr (p_pos, ':'); + + if (saltbuf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); + + saltbuf_pos++; + + char *hash_pos = strchr (saltbuf_pos, ':'); + + if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); + + hash_pos++; + + // base64 decode + + char tmp_buf[32]; + + memset (tmp_buf, 0, sizeof (tmp_buf)); + + int tmp_len = base64_decode (base64_to_int, saltbuf_pos, hash_pos - saltbuf_pos, tmp_buf); + + char *salt_buf_ptr = (char *) salt->salt_buf; + + memcpy (salt_buf_ptr, tmp_buf, tmp_len); + + salt->salt_len = tmp_len; + salt->salt_iter = 1; + + // digest - base64 decode + + memset (tmp_buf, 0, sizeof (tmp_buf)); + + tmp_len = input_len - (hash_pos - input_buf); + + if (tmp_len != 44) return (PARSER_GLOBAL_LENGTH); + + base64_decode (base64_to_int, hash_pos, tmp_len, tmp_buf); + + memcpy (digest, tmp_buf, 32); + + return (PARSER_OK); +} + +int juniper_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf) +{ + if ((input_len < DISPLAY_LEN_MIN_501) || (input_len > DISPLAY_LEN_MAX_501)) return (PARSER_GLOBAL_LENGTH); + + uint32_t *digest = (uint32_t *) hash_buf->digest; + + salt_t *salt = hash_buf->salt; + + /** + * parse line + */ + + char decrypted[76]; // iv + hash + + juniper_decrypt_hash (input_buf, decrypted); + + char *md5crypt_hash = decrypted + 12; + + if (memcmp (md5crypt_hash, "$1$danastre$", 12)) return (PARSER_SALT_VALUE); + + salt->salt_iter = ROUNDS_MD5CRYPT; + + char *salt_pos = md5crypt_hash + 3; + + char *hash_pos = strchr (salt_pos, '$'); // or simply salt_pos + 8 + + salt->salt_len = hash_pos - salt_pos; // should be 8 + + memcpy ((char *) salt->salt_buf, salt_pos, salt->salt_len); + + hash_pos++; + + md5crypt_decode ((unsigned char *) digest, (unsigned char *) hash_pos); + + return (PARSER_OK); +} + +int cisco8_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf) +{ + if ((input_len < DISPLAY_LEN_MIN_9200) || (input_len > DISPLAY_LEN_MAX_9200)) return (PARSER_GLOBAL_LENGTH); + + if (memcmp (SIGNATURE_CISCO8, input_buf, 3)) return (PARSER_SIGNATURE_UNMATCHED); + + uint32_t *digest = (uint32_t *) hash_buf->digest; + + salt_t *salt = hash_buf->salt; + + pbkdf2_sha256_t *pbkdf2_sha256 = (pbkdf2_sha256_t *) hash_buf->esalt; + + /** + * parse line + */ + + // first is *raw* salt + + char *salt_pos = input_buf + 3; + + char *hash_pos = strchr (salt_pos, '$'); + + if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); + + uint salt_len = hash_pos - salt_pos; + + if (salt_len != 14) return (PARSER_SALT_LENGTH); + + hash_pos++; + + char *salt_buf_ptr = (char *) pbkdf2_sha256->salt_buf; + + memcpy (salt_buf_ptr, salt_pos, 14); + + salt_buf_ptr[17] = 0x01; + salt_buf_ptr[18] = 0x80; + + // add some stuff to normal salt to make sorted happy + + salt->salt_buf[0] = pbkdf2_sha256->salt_buf[0]; + salt->salt_buf[1] = pbkdf2_sha256->salt_buf[1]; + salt->salt_buf[2] = pbkdf2_sha256->salt_buf[2]; + salt->salt_buf[3] = pbkdf2_sha256->salt_buf[3]; + + salt->salt_len = salt_len; + salt->salt_iter = ROUNDS_CISCO8 - 1; + + // base64 decode hash + + char tmp_buf[100]; + + memset (tmp_buf, 0, sizeof (tmp_buf)); + + uint hash_len = input_len - 3 - salt_len - 1; + + int tmp_len = base64_decode (itoa64_to_int, hash_pos, hash_len, tmp_buf); + + if (tmp_len != 32) return (PARSER_HASH_LENGTH); + + memcpy (digest, tmp_buf, 32); + + digest[0] = byte_swap_32 (digest[0]); + digest[1] = byte_swap_32 (digest[1]); + digest[2] = byte_swap_32 (digest[2]); + digest[3] = byte_swap_32 (digest[3]); + digest[4] = byte_swap_32 (digest[4]); + digest[5] = byte_swap_32 (digest[5]); + digest[6] = byte_swap_32 (digest[6]); + digest[7] = byte_swap_32 (digest[7]); + + return (PARSER_OK); +} + +int cisco9_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf) +{ + if ((input_len < DISPLAY_LEN_MIN_9300) || (input_len > DISPLAY_LEN_MAX_9300)) return (PARSER_GLOBAL_LENGTH); + + if (memcmp (SIGNATURE_CISCO9, input_buf, 3)) return (PARSER_SIGNATURE_UNMATCHED); + + uint32_t *digest = (uint32_t *) hash_buf->digest; + + salt_t *salt = hash_buf->salt; + + /** + * parse line + */ + + // first is *raw* salt + + char *salt_pos = input_buf + 3; + + char *hash_pos = strchr (salt_pos, '$'); + + if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); + + uint salt_len = hash_pos - salt_pos; + + if (salt_len != 14) return (PARSER_SALT_LENGTH); + + salt->salt_len = salt_len; + hash_pos++; + + char *salt_buf_ptr = (char *) salt->salt_buf; + + memcpy (salt_buf_ptr, salt_pos, salt_len); + salt_buf_ptr[salt_len] = 0; + + // base64 decode hash + + char tmp_buf[100]; + + memset (tmp_buf, 0, sizeof (tmp_buf)); + + uint hash_len = input_len - 3 - salt_len - 1; + + int tmp_len = base64_decode (itoa64_to_int, hash_pos, hash_len, tmp_buf); + + if (tmp_len != 32) return (PARSER_HASH_LENGTH); + + memcpy (digest, tmp_buf, 32); + + // fixed: + salt->scrypt_N = 16384; + salt->scrypt_r = 1; + salt->scrypt_p = 1; + salt->salt_iter = 1; + + return (PARSER_OK); +} + +int office2007_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf) +{ + if ((input_len < DISPLAY_LEN_MIN_9400) || (input_len > DISPLAY_LEN_MAX_9400)) return (PARSER_GLOBAL_LENGTH); + + if (memcmp (SIGNATURE_OFFICE2007, input_buf, 8)) return (PARSER_SIGNATURE_UNMATCHED); + + uint32_t *digest = (uint32_t *) hash_buf->digest; + + salt_t *salt = hash_buf->salt; + + office2007_t *office2007 = (office2007_t *) hash_buf->esalt; + + /** + * parse line + */ + + char *version_pos = input_buf + 8 + 1; + + char *verifierHashSize_pos = strchr (version_pos, '*'); + + if (verifierHashSize_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); + + uint32_t version_len = verifierHashSize_pos - version_pos; + + if (version_len != 4) return (PARSER_SALT_LENGTH); + + verifierHashSize_pos++; + + char *keySize_pos = strchr (verifierHashSize_pos, '*'); + + if (keySize_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); + + uint32_t verifierHashSize_len = keySize_pos - verifierHashSize_pos; + + if (verifierHashSize_len != 2) return (PARSER_SALT_LENGTH); + + keySize_pos++; + + char *saltSize_pos = strchr (keySize_pos, '*'); + + if (saltSize_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); + + uint32_t keySize_len = saltSize_pos - keySize_pos; + + if (keySize_len != 3) return (PARSER_SALT_LENGTH); + + saltSize_pos++; + + char *osalt_pos = strchr (saltSize_pos, '*'); + + if (osalt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); + + uint32_t saltSize_len = osalt_pos - saltSize_pos; + + if (saltSize_len != 2) return (PARSER_SALT_LENGTH); + + osalt_pos++; + + char *encryptedVerifier_pos = strchr (osalt_pos, '*'); + + if (encryptedVerifier_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); + + uint32_t osalt_len = encryptedVerifier_pos - osalt_pos; + + if (osalt_len != 32) return (PARSER_SALT_LENGTH); + + encryptedVerifier_pos++; + + char *encryptedVerifierHash_pos = strchr (encryptedVerifier_pos, '*'); + + if (encryptedVerifierHash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); + + uint32_t encryptedVerifier_len = encryptedVerifierHash_pos - encryptedVerifier_pos; + + if (encryptedVerifier_len != 32) return (PARSER_SALT_LENGTH); + + encryptedVerifierHash_pos++; + + uint32_t encryptedVerifierHash_len = input_len - 8 - 1 - version_len - 1 - verifierHashSize_len - 1 - keySize_len - 1 - saltSize_len - 1 - osalt_len - 1 - encryptedVerifier_len - 1; + + if (encryptedVerifierHash_len != 40) return (PARSER_SALT_LENGTH); + + const uint version = atoi (version_pos); + + if (version != 2007) return (PARSER_SALT_VALUE); + + const uint verifierHashSize = atoi (verifierHashSize_pos); + + if (verifierHashSize != 20) return (PARSER_SALT_VALUE); + + const uint keySize = atoi (keySize_pos); + + if ((keySize != 128) && (keySize != 256)) return (PARSER_SALT_VALUE); + + office2007->keySize = keySize; + + const uint saltSize = atoi (saltSize_pos); + + if (saltSize != 16) return (PARSER_SALT_VALUE); + + /** + * salt + */ + + salt->salt_len = 16; + salt->salt_iter = ROUNDS_OFFICE2007; + + salt->salt_buf[0] = hex_to_uint (&osalt_pos[ 0]); + salt->salt_buf[1] = hex_to_uint (&osalt_pos[ 8]); + salt->salt_buf[2] = hex_to_uint (&osalt_pos[16]); + salt->salt_buf[3] = hex_to_uint (&osalt_pos[24]); + + /** + * esalt + */ + + office2007->encryptedVerifier[0] = hex_to_uint (&encryptedVerifier_pos[ 0]); + office2007->encryptedVerifier[1] = hex_to_uint (&encryptedVerifier_pos[ 8]); + office2007->encryptedVerifier[2] = hex_to_uint (&encryptedVerifier_pos[16]); + office2007->encryptedVerifier[3] = hex_to_uint (&encryptedVerifier_pos[24]); + + office2007->encryptedVerifierHash[0] = hex_to_uint (&encryptedVerifierHash_pos[ 0]); + office2007->encryptedVerifierHash[1] = hex_to_uint (&encryptedVerifierHash_pos[ 8]); + office2007->encryptedVerifierHash[2] = hex_to_uint (&encryptedVerifierHash_pos[16]); + office2007->encryptedVerifierHash[3] = hex_to_uint (&encryptedVerifierHash_pos[24]); + office2007->encryptedVerifierHash[4] = hex_to_uint (&encryptedVerifierHash_pos[32]); + + /** + * digest + */ + + digest[0] = office2007->encryptedVerifierHash[0]; + digest[1] = office2007->encryptedVerifierHash[1]; + digest[2] = office2007->encryptedVerifierHash[2]; + digest[3] = office2007->encryptedVerifierHash[3]; + + return (PARSER_OK); +} + +int office2010_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf) +{ + if ((input_len < DISPLAY_LEN_MIN_9500) || (input_len > DISPLAY_LEN_MAX_9500)) return (PARSER_GLOBAL_LENGTH); + + if (memcmp (SIGNATURE_OFFICE2010, input_buf, 8)) return (PARSER_SIGNATURE_UNMATCHED); + + uint32_t *digest = (uint32_t *) hash_buf->digest; + + salt_t *salt = hash_buf->salt; + + office2010_t *office2010 = (office2010_t *) hash_buf->esalt; + + /** + * parse line + */ + + char *version_pos = input_buf + 8 + 1; + + char *spinCount_pos = strchr (version_pos, '*'); + + if (spinCount_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); + + uint32_t version_len = spinCount_pos - version_pos; + + if (version_len != 4) return (PARSER_SALT_LENGTH); + + spinCount_pos++; + + char *keySize_pos = strchr (spinCount_pos, '*'); + + if (keySize_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); + + uint32_t spinCount_len = keySize_pos - spinCount_pos; + + if (spinCount_len != 6) return (PARSER_SALT_LENGTH); + + keySize_pos++; + + char *saltSize_pos = strchr (keySize_pos, '*'); + + if (saltSize_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); + + uint32_t keySize_len = saltSize_pos - keySize_pos; + + if (keySize_len != 3) return (PARSER_SALT_LENGTH); + + saltSize_pos++; + + char *osalt_pos = strchr (saltSize_pos, '*'); + + if (osalt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); + + uint32_t saltSize_len = osalt_pos - saltSize_pos; + + if (saltSize_len != 2) return (PARSER_SALT_LENGTH); + + osalt_pos++; + + char *encryptedVerifier_pos = strchr (osalt_pos, '*'); + + if (encryptedVerifier_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); + + uint32_t osalt_len = encryptedVerifier_pos - osalt_pos; + + if (osalt_len != 32) return (PARSER_SALT_LENGTH); + + encryptedVerifier_pos++; + + char *encryptedVerifierHash_pos = strchr (encryptedVerifier_pos, '*'); + + if (encryptedVerifierHash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); + + uint32_t encryptedVerifier_len = encryptedVerifierHash_pos - encryptedVerifier_pos; + + if (encryptedVerifier_len != 32) return (PARSER_SALT_LENGTH); + + encryptedVerifierHash_pos++; + + uint32_t encryptedVerifierHash_len = input_len - 8 - 1 - version_len - 1 - spinCount_len - 1 - keySize_len - 1 - saltSize_len - 1 - osalt_len - 1 - encryptedVerifier_len - 1; + + if (encryptedVerifierHash_len != 64) return (PARSER_SALT_LENGTH); + + const uint version = atoi (version_pos); + + if (version != 2010) return (PARSER_SALT_VALUE); + + const uint spinCount = atoi (spinCount_pos); + + if (spinCount != 100000) return (PARSER_SALT_VALUE); + + const uint keySize = atoi (keySize_pos); + + if (keySize != 128) return (PARSER_SALT_VALUE); + + const uint saltSize = atoi (saltSize_pos); + + if (saltSize != 16) return (PARSER_SALT_VALUE); + + /** + * salt + */ + + salt->salt_len = 16; + salt->salt_iter = spinCount; + + salt->salt_buf[0] = hex_to_uint (&osalt_pos[ 0]); + salt->salt_buf[1] = hex_to_uint (&osalt_pos[ 8]); + salt->salt_buf[2] = hex_to_uint (&osalt_pos[16]); + salt->salt_buf[3] = hex_to_uint (&osalt_pos[24]); + + /** + * esalt + */ + + office2010->encryptedVerifier[0] = hex_to_uint (&encryptedVerifier_pos[ 0]); + office2010->encryptedVerifier[1] = hex_to_uint (&encryptedVerifier_pos[ 8]); + office2010->encryptedVerifier[2] = hex_to_uint (&encryptedVerifier_pos[16]); + office2010->encryptedVerifier[3] = hex_to_uint (&encryptedVerifier_pos[24]); + + office2010->encryptedVerifierHash[0] = hex_to_uint (&encryptedVerifierHash_pos[ 0]); + office2010->encryptedVerifierHash[1] = hex_to_uint (&encryptedVerifierHash_pos[ 8]); + office2010->encryptedVerifierHash[2] = hex_to_uint (&encryptedVerifierHash_pos[16]); + office2010->encryptedVerifierHash[3] = hex_to_uint (&encryptedVerifierHash_pos[24]); + office2010->encryptedVerifierHash[4] = hex_to_uint (&encryptedVerifierHash_pos[32]); + office2010->encryptedVerifierHash[5] = hex_to_uint (&encryptedVerifierHash_pos[40]); + office2010->encryptedVerifierHash[6] = hex_to_uint (&encryptedVerifierHash_pos[48]); + office2010->encryptedVerifierHash[7] = hex_to_uint (&encryptedVerifierHash_pos[56]); + + /** + * digest + */ + + digest[0] = office2010->encryptedVerifierHash[0]; + digest[1] = office2010->encryptedVerifierHash[1]; + digest[2] = office2010->encryptedVerifierHash[2]; + digest[3] = office2010->encryptedVerifierHash[3]; + + return (PARSER_OK); +} + +int office2013_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf) +{ + if ((input_len < DISPLAY_LEN_MIN_9600) || (input_len > DISPLAY_LEN_MAX_9600)) return (PARSER_GLOBAL_LENGTH); + + if (memcmp (SIGNATURE_OFFICE2013, input_buf, 8)) return (PARSER_SIGNATURE_UNMATCHED); + + uint32_t *digest = (uint32_t *) hash_buf->digest; + + salt_t *salt = hash_buf->salt; + + office2013_t *office2013 = (office2013_t *) hash_buf->esalt; + + /** + * parse line + */ + + char *version_pos = input_buf + 8 + 1; + + char *spinCount_pos = strchr (version_pos, '*'); + + if (spinCount_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); + + uint32_t version_len = spinCount_pos - version_pos; + + if (version_len != 4) return (PARSER_SALT_LENGTH); + + spinCount_pos++; + + char *keySize_pos = strchr (spinCount_pos, '*'); + + if (keySize_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); + + uint32_t spinCount_len = keySize_pos - spinCount_pos; + + if (spinCount_len != 6) return (PARSER_SALT_LENGTH); + + keySize_pos++; + + char *saltSize_pos = strchr (keySize_pos, '*'); + + if (saltSize_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); + + uint32_t keySize_len = saltSize_pos - keySize_pos; + + if (keySize_len != 3) return (PARSER_SALT_LENGTH); + + saltSize_pos++; + + char *osalt_pos = strchr (saltSize_pos, '*'); + + if (osalt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); + + uint32_t saltSize_len = osalt_pos - saltSize_pos; + + if (saltSize_len != 2) return (PARSER_SALT_LENGTH); + + osalt_pos++; + + char *encryptedVerifier_pos = strchr (osalt_pos, '*'); + + if (encryptedVerifier_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); + + uint32_t osalt_len = encryptedVerifier_pos - osalt_pos; + + if (osalt_len != 32) return (PARSER_SALT_LENGTH); + + encryptedVerifier_pos++; + + char *encryptedVerifierHash_pos = strchr (encryptedVerifier_pos, '*'); + + if (encryptedVerifierHash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); + + uint32_t encryptedVerifier_len = encryptedVerifierHash_pos - encryptedVerifier_pos; + + if (encryptedVerifier_len != 32) return (PARSER_SALT_LENGTH); + + encryptedVerifierHash_pos++; + + uint32_t encryptedVerifierHash_len = input_len - 8 - 1 - version_len - 1 - spinCount_len - 1 - keySize_len - 1 - saltSize_len - 1 - osalt_len - 1 - encryptedVerifier_len - 1; + + if (encryptedVerifierHash_len != 64) return (PARSER_SALT_LENGTH); + + const uint version = atoi (version_pos); + + if (version != 2013) return (PARSER_SALT_VALUE); + + const uint spinCount = atoi (spinCount_pos); + + if (spinCount != 100000) return (PARSER_SALT_VALUE); + + const uint keySize = atoi (keySize_pos); + + if (keySize != 256) return (PARSER_SALT_VALUE); + + const uint saltSize = atoi (saltSize_pos); + + if (saltSize != 16) return (PARSER_SALT_VALUE); + + /** + * salt + */ + + salt->salt_len = 16; + salt->salt_iter = spinCount; + + salt->salt_buf[0] = hex_to_uint (&osalt_pos[ 0]); + salt->salt_buf[1] = hex_to_uint (&osalt_pos[ 8]); + salt->salt_buf[2] = hex_to_uint (&osalt_pos[16]); + salt->salt_buf[3] = hex_to_uint (&osalt_pos[24]); + + /** + * esalt + */ + + office2013->encryptedVerifier[0] = hex_to_uint (&encryptedVerifier_pos[ 0]); + office2013->encryptedVerifier[1] = hex_to_uint (&encryptedVerifier_pos[ 8]); + office2013->encryptedVerifier[2] = hex_to_uint (&encryptedVerifier_pos[16]); + office2013->encryptedVerifier[3] = hex_to_uint (&encryptedVerifier_pos[24]); + + office2013->encryptedVerifierHash[0] = hex_to_uint (&encryptedVerifierHash_pos[ 0]); + office2013->encryptedVerifierHash[1] = hex_to_uint (&encryptedVerifierHash_pos[ 8]); + office2013->encryptedVerifierHash[2] = hex_to_uint (&encryptedVerifierHash_pos[16]); + office2013->encryptedVerifierHash[3] = hex_to_uint (&encryptedVerifierHash_pos[24]); + office2013->encryptedVerifierHash[4] = hex_to_uint (&encryptedVerifierHash_pos[32]); + office2013->encryptedVerifierHash[5] = hex_to_uint (&encryptedVerifierHash_pos[40]); + office2013->encryptedVerifierHash[6] = hex_to_uint (&encryptedVerifierHash_pos[48]); + office2013->encryptedVerifierHash[7] = hex_to_uint (&encryptedVerifierHash_pos[56]); + + /** + * digest + */ + + digest[0] = office2013->encryptedVerifierHash[0]; + digest[1] = office2013->encryptedVerifierHash[1]; + digest[2] = office2013->encryptedVerifierHash[2]; + digest[3] = office2013->encryptedVerifierHash[3]; + + return (PARSER_OK); +} + +int oldoffice01_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf) +{ + if ((input_len < DISPLAY_LEN_MIN_9700) || (input_len > DISPLAY_LEN_MAX_9700)) return (PARSER_GLOBAL_LENGTH); + + if ((memcmp (SIGNATURE_OLDOFFICE0, input_buf, 12)) && (memcmp (SIGNATURE_OLDOFFICE1, input_buf, 12))) return (PARSER_SIGNATURE_UNMATCHED); + + uint32_t *digest = (uint32_t *) hash_buf->digest; + + salt_t *salt = hash_buf->salt; + + oldoffice01_t *oldoffice01 = (oldoffice01_t *) hash_buf->esalt; + + /** + * parse line + */ + + char *version_pos = input_buf + 11; + + char *osalt_pos = strchr (version_pos, '*'); + + if (osalt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); + + uint32_t version_len = osalt_pos - version_pos; + + if (version_len != 1) return (PARSER_SALT_LENGTH); + + osalt_pos++; + + char *encryptedVerifier_pos = strchr (osalt_pos, '*'); + + if (encryptedVerifier_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); + + uint32_t osalt_len = encryptedVerifier_pos - osalt_pos; + + if (osalt_len != 32) return (PARSER_SALT_LENGTH); + + encryptedVerifier_pos++; + + char *encryptedVerifierHash_pos = strchr (encryptedVerifier_pos, '*'); + + if (encryptedVerifierHash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); + + uint32_t encryptedVerifier_len = encryptedVerifierHash_pos - encryptedVerifier_pos; + + if (encryptedVerifier_len != 32) return (PARSER_SALT_LENGTH); + + encryptedVerifierHash_pos++; + + uint32_t encryptedVerifierHash_len = input_len - 11 - version_len - 1 - osalt_len - 1 - encryptedVerifier_len - 1; + + if (encryptedVerifierHash_len != 32) return (PARSER_SALT_LENGTH); + + const uint version = *version_pos - 0x30; + + if (version != 0 && version != 1) return (PARSER_SALT_VALUE); + + /** + * esalt + */ + + oldoffice01->version = version; + + oldoffice01->encryptedVerifier[0] = hex_to_uint (&encryptedVerifier_pos[ 0]); + oldoffice01->encryptedVerifier[1] = hex_to_uint (&encryptedVerifier_pos[ 8]); + oldoffice01->encryptedVerifier[2] = hex_to_uint (&encryptedVerifier_pos[16]); + oldoffice01->encryptedVerifier[3] = hex_to_uint (&encryptedVerifier_pos[24]); + + oldoffice01->encryptedVerifier[0] = byte_swap_32 (oldoffice01->encryptedVerifier[0]); + oldoffice01->encryptedVerifier[1] = byte_swap_32 (oldoffice01->encryptedVerifier[1]); + oldoffice01->encryptedVerifier[2] = byte_swap_32 (oldoffice01->encryptedVerifier[2]); + oldoffice01->encryptedVerifier[3] = byte_swap_32 (oldoffice01->encryptedVerifier[3]); + + oldoffice01->encryptedVerifierHash[0] = hex_to_uint (&encryptedVerifierHash_pos[ 0]); + oldoffice01->encryptedVerifierHash[1] = hex_to_uint (&encryptedVerifierHash_pos[ 8]); + oldoffice01->encryptedVerifierHash[2] = hex_to_uint (&encryptedVerifierHash_pos[16]); + oldoffice01->encryptedVerifierHash[3] = hex_to_uint (&encryptedVerifierHash_pos[24]); + + oldoffice01->encryptedVerifierHash[0] = byte_swap_32 (oldoffice01->encryptedVerifierHash[0]); + oldoffice01->encryptedVerifierHash[1] = byte_swap_32 (oldoffice01->encryptedVerifierHash[1]); + oldoffice01->encryptedVerifierHash[2] = byte_swap_32 (oldoffice01->encryptedVerifierHash[2]); + oldoffice01->encryptedVerifierHash[3] = byte_swap_32 (oldoffice01->encryptedVerifierHash[3]); + + /** + * salt + */ + + salt->salt_len = 16; + + salt->salt_buf[0] = hex_to_uint (&osalt_pos[ 0]); + salt->salt_buf[1] = hex_to_uint (&osalt_pos[ 8]); + salt->salt_buf[2] = hex_to_uint (&osalt_pos[16]); + salt->salt_buf[3] = hex_to_uint (&osalt_pos[24]); + + salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]); + salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]); + salt->salt_buf[2] = byte_swap_32 (salt->salt_buf[2]); + salt->salt_buf[3] = byte_swap_32 (salt->salt_buf[3]); + + // this is a workaround as office produces multiple documents with the same salt + + salt->salt_len += 32; + + salt->salt_buf[ 4] = oldoffice01->encryptedVerifier[0]; + salt->salt_buf[ 5] = oldoffice01->encryptedVerifier[1]; + salt->salt_buf[ 6] = oldoffice01->encryptedVerifier[2]; + salt->salt_buf[ 7] = oldoffice01->encryptedVerifier[3]; + salt->salt_buf[ 8] = oldoffice01->encryptedVerifierHash[0]; + salt->salt_buf[ 9] = oldoffice01->encryptedVerifierHash[1]; + salt->salt_buf[10] = oldoffice01->encryptedVerifierHash[2]; + salt->salt_buf[11] = oldoffice01->encryptedVerifierHash[3]; + + /** + * digest + */ + + digest[0] = oldoffice01->encryptedVerifierHash[0]; + digest[1] = oldoffice01->encryptedVerifierHash[1]; + digest[2] = oldoffice01->encryptedVerifierHash[2]; + digest[3] = oldoffice01->encryptedVerifierHash[3]; + + return (PARSER_OK); +} + +int oldoffice01cm1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf) +{ + return oldoffice01_parse_hash (input_buf, input_len, hash_buf); +} + +int oldoffice01cm2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf) +{ + if ((input_len < DISPLAY_LEN_MIN_9720) || (input_len > DISPLAY_LEN_MAX_9720)) return (PARSER_GLOBAL_LENGTH); + + if ((memcmp (SIGNATURE_OLDOFFICE0, input_buf, 12)) && (memcmp (SIGNATURE_OLDOFFICE1, input_buf, 12))) return (PARSER_SIGNATURE_UNMATCHED); + + uint32_t *digest = (uint32_t *) hash_buf->digest; + + salt_t *salt = hash_buf->salt; + + oldoffice01_t *oldoffice01 = (oldoffice01_t *) hash_buf->esalt; + + /** + * parse line + */ + + char *version_pos = input_buf + 11; + + char *osalt_pos = strchr (version_pos, '*'); + + if (osalt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); + + uint32_t version_len = osalt_pos - version_pos; + + if (version_len != 1) return (PARSER_SALT_LENGTH); + + osalt_pos++; + + char *encryptedVerifier_pos = strchr (osalt_pos, '*'); + + if (encryptedVerifier_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); + + uint32_t osalt_len = encryptedVerifier_pos - osalt_pos; + + if (osalt_len != 32) return (PARSER_SALT_LENGTH); + + encryptedVerifier_pos++; + + char *encryptedVerifierHash_pos = strchr (encryptedVerifier_pos, '*'); + + if (encryptedVerifierHash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); + + uint32_t encryptedVerifier_len = encryptedVerifierHash_pos - encryptedVerifier_pos; + + if (encryptedVerifier_len != 32) return (PARSER_SALT_LENGTH); + + encryptedVerifierHash_pos++; + + char *rc4key_pos = strchr (encryptedVerifierHash_pos, ':'); + + if (rc4key_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); + + uint32_t encryptedVerifierHash_len = rc4key_pos - encryptedVerifierHash_pos; + + if (encryptedVerifierHash_len != 32) return (PARSER_SALT_LENGTH); + + rc4key_pos++; + + uint32_t rc4key_len = input_len - 11 - version_len - 1 - osalt_len - 1 - encryptedVerifier_len - 1 - encryptedVerifierHash_len - 1; + + if (rc4key_len != 10) return (PARSER_SALT_LENGTH); + + const uint version = *version_pos - 0x30; + + if (version != 0 && version != 1) return (PARSER_SALT_VALUE); + + /** + * esalt + */ + + oldoffice01->version = version; + + oldoffice01->encryptedVerifier[0] = hex_to_uint (&encryptedVerifier_pos[ 0]); + oldoffice01->encryptedVerifier[1] = hex_to_uint (&encryptedVerifier_pos[ 8]); + oldoffice01->encryptedVerifier[2] = hex_to_uint (&encryptedVerifier_pos[16]); + oldoffice01->encryptedVerifier[3] = hex_to_uint (&encryptedVerifier_pos[24]); + + oldoffice01->encryptedVerifier[0] = byte_swap_32 (oldoffice01->encryptedVerifier[0]); + oldoffice01->encryptedVerifier[1] = byte_swap_32 (oldoffice01->encryptedVerifier[1]); + oldoffice01->encryptedVerifier[2] = byte_swap_32 (oldoffice01->encryptedVerifier[2]); + oldoffice01->encryptedVerifier[3] = byte_swap_32 (oldoffice01->encryptedVerifier[3]); + + oldoffice01->encryptedVerifierHash[0] = hex_to_uint (&encryptedVerifierHash_pos[ 0]); + oldoffice01->encryptedVerifierHash[1] = hex_to_uint (&encryptedVerifierHash_pos[ 8]); + oldoffice01->encryptedVerifierHash[2] = hex_to_uint (&encryptedVerifierHash_pos[16]); + oldoffice01->encryptedVerifierHash[3] = hex_to_uint (&encryptedVerifierHash_pos[24]); + + oldoffice01->encryptedVerifierHash[0] = byte_swap_32 (oldoffice01->encryptedVerifierHash[0]); + oldoffice01->encryptedVerifierHash[1] = byte_swap_32 (oldoffice01->encryptedVerifierHash[1]); + oldoffice01->encryptedVerifierHash[2] = byte_swap_32 (oldoffice01->encryptedVerifierHash[2]); + oldoffice01->encryptedVerifierHash[3] = byte_swap_32 (oldoffice01->encryptedVerifierHash[3]); + + oldoffice01->rc4key[1] = 0; + oldoffice01->rc4key[0] = 0; + + oldoffice01->rc4key[0] |= hex_convert (rc4key_pos[0]) << 28; + oldoffice01->rc4key[0] |= hex_convert (rc4key_pos[1]) << 24; + oldoffice01->rc4key[0] |= hex_convert (rc4key_pos[2]) << 20; + oldoffice01->rc4key[0] |= hex_convert (rc4key_pos[3]) << 16; + oldoffice01->rc4key[0] |= hex_convert (rc4key_pos[4]) << 12; + oldoffice01->rc4key[0] |= hex_convert (rc4key_pos[5]) << 8; + oldoffice01->rc4key[0] |= hex_convert (rc4key_pos[6]) << 4; + oldoffice01->rc4key[0] |= hex_convert (rc4key_pos[7]) << 0; + oldoffice01->rc4key[1] |= hex_convert (rc4key_pos[8]) << 28; + oldoffice01->rc4key[1] |= hex_convert (rc4key_pos[9]) << 24; + + oldoffice01->rc4key[0] = byte_swap_32 (oldoffice01->rc4key[0]); + oldoffice01->rc4key[1] = byte_swap_32 (oldoffice01->rc4key[1]); + + /** + * salt + */ + + salt->salt_len = 16; + + salt->salt_buf[0] = hex_to_uint (&osalt_pos[ 0]); + salt->salt_buf[1] = hex_to_uint (&osalt_pos[ 8]); + salt->salt_buf[2] = hex_to_uint (&osalt_pos[16]); + salt->salt_buf[3] = hex_to_uint (&osalt_pos[24]); + + salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]); + salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]); + salt->salt_buf[2] = byte_swap_32 (salt->salt_buf[2]); + salt->salt_buf[3] = byte_swap_32 (salt->salt_buf[3]); + + // this is a workaround as office produces multiple documents with the same salt + + salt->salt_len += 32; + + salt->salt_buf[ 4] = oldoffice01->encryptedVerifier[0]; + salt->salt_buf[ 5] = oldoffice01->encryptedVerifier[1]; + salt->salt_buf[ 6] = oldoffice01->encryptedVerifier[2]; + salt->salt_buf[ 7] = oldoffice01->encryptedVerifier[3]; + salt->salt_buf[ 8] = oldoffice01->encryptedVerifierHash[0]; + salt->salt_buf[ 9] = oldoffice01->encryptedVerifierHash[1]; + salt->salt_buf[10] = oldoffice01->encryptedVerifierHash[2]; + salt->salt_buf[11] = oldoffice01->encryptedVerifierHash[3]; + + /** + * digest + */ + + digest[0] = oldoffice01->rc4key[0]; + digest[1] = oldoffice01->rc4key[1]; + digest[2] = 0; + digest[3] = 0; + + return (PARSER_OK); +} + +int oldoffice34_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf) +{ + if ((input_len < DISPLAY_LEN_MIN_9800) || (input_len > DISPLAY_LEN_MAX_9800)) return (PARSER_GLOBAL_LENGTH); + + if ((memcmp (SIGNATURE_OLDOFFICE3, input_buf, 12)) && (memcmp (SIGNATURE_OLDOFFICE4, input_buf, 12))) return (PARSER_SIGNATURE_UNMATCHED); + + uint32_t *digest = (uint32_t *) hash_buf->digest; + + salt_t *salt = hash_buf->salt; + + oldoffice34_t *oldoffice34 = (oldoffice34_t *) hash_buf->esalt; + + /** + * parse line + */ + + char *version_pos = input_buf + 11; + + char *osalt_pos = strchr (version_pos, '*'); + + if (osalt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); + + uint32_t version_len = osalt_pos - version_pos; + + if (version_len != 1) return (PARSER_SALT_LENGTH); + + osalt_pos++; + + char *encryptedVerifier_pos = strchr (osalt_pos, '*'); + + if (encryptedVerifier_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); + + uint32_t osalt_len = encryptedVerifier_pos - osalt_pos; + + if (osalt_len != 32) return (PARSER_SALT_LENGTH); + + encryptedVerifier_pos++; + + char *encryptedVerifierHash_pos = strchr (encryptedVerifier_pos, '*'); + + if (encryptedVerifierHash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); + + uint32_t encryptedVerifier_len = encryptedVerifierHash_pos - encryptedVerifier_pos; + + if (encryptedVerifier_len != 32) return (PARSER_SALT_LENGTH); + + encryptedVerifierHash_pos++; + + uint32_t encryptedVerifierHash_len = input_len - 11 - version_len - 1 - osalt_len - 1 - encryptedVerifier_len - 1; + + if (encryptedVerifierHash_len != 40) return (PARSER_SALT_LENGTH); + + const uint version = *version_pos - 0x30; + + if (version != 3 && version != 4) return (PARSER_SALT_VALUE); + + /** + * esalt + */ + + oldoffice34->version = version; + + oldoffice34->encryptedVerifier[0] = hex_to_uint (&encryptedVerifier_pos[ 0]); + oldoffice34->encryptedVerifier[1] = hex_to_uint (&encryptedVerifier_pos[ 8]); + oldoffice34->encryptedVerifier[2] = hex_to_uint (&encryptedVerifier_pos[16]); + oldoffice34->encryptedVerifier[3] = hex_to_uint (&encryptedVerifier_pos[24]); + + oldoffice34->encryptedVerifier[0] = byte_swap_32 (oldoffice34->encryptedVerifier[0]); + oldoffice34->encryptedVerifier[1] = byte_swap_32 (oldoffice34->encryptedVerifier[1]); + oldoffice34->encryptedVerifier[2] = byte_swap_32 (oldoffice34->encryptedVerifier[2]); + oldoffice34->encryptedVerifier[3] = byte_swap_32 (oldoffice34->encryptedVerifier[3]); + + oldoffice34->encryptedVerifierHash[0] = hex_to_uint (&encryptedVerifierHash_pos[ 0]); + oldoffice34->encryptedVerifierHash[1] = hex_to_uint (&encryptedVerifierHash_pos[ 8]); + oldoffice34->encryptedVerifierHash[2] = hex_to_uint (&encryptedVerifierHash_pos[16]); + oldoffice34->encryptedVerifierHash[3] = hex_to_uint (&encryptedVerifierHash_pos[24]); + oldoffice34->encryptedVerifierHash[4] = hex_to_uint (&encryptedVerifierHash_pos[32]); + + oldoffice34->encryptedVerifierHash[0] = byte_swap_32 (oldoffice34->encryptedVerifierHash[0]); + oldoffice34->encryptedVerifierHash[1] = byte_swap_32 (oldoffice34->encryptedVerifierHash[1]); + oldoffice34->encryptedVerifierHash[2] = byte_swap_32 (oldoffice34->encryptedVerifierHash[2]); + oldoffice34->encryptedVerifierHash[3] = byte_swap_32 (oldoffice34->encryptedVerifierHash[3]); + oldoffice34->encryptedVerifierHash[4] = byte_swap_32 (oldoffice34->encryptedVerifierHash[4]); + + /** + * salt + */ + + salt->salt_len = 16; + + salt->salt_buf[0] = hex_to_uint (&osalt_pos[ 0]); + salt->salt_buf[1] = hex_to_uint (&osalt_pos[ 8]); + salt->salt_buf[2] = hex_to_uint (&osalt_pos[16]); + salt->salt_buf[3] = hex_to_uint (&osalt_pos[24]); + + // this is a workaround as office produces multiple documents with the same salt + + salt->salt_len += 32; + + salt->salt_buf[ 4] = oldoffice34->encryptedVerifier[0]; + salt->salt_buf[ 5] = oldoffice34->encryptedVerifier[1]; + salt->salt_buf[ 6] = oldoffice34->encryptedVerifier[2]; + salt->salt_buf[ 7] = oldoffice34->encryptedVerifier[3]; + salt->salt_buf[ 8] = oldoffice34->encryptedVerifierHash[0]; + salt->salt_buf[ 9] = oldoffice34->encryptedVerifierHash[1]; + salt->salt_buf[10] = oldoffice34->encryptedVerifierHash[2]; + salt->salt_buf[11] = oldoffice34->encryptedVerifierHash[3]; + + /** + * digest + */ + + digest[0] = oldoffice34->encryptedVerifierHash[0]; + digest[1] = oldoffice34->encryptedVerifierHash[1]; + digest[2] = oldoffice34->encryptedVerifierHash[2]; + digest[3] = oldoffice34->encryptedVerifierHash[3]; + + return (PARSER_OK); +} + +int oldoffice34cm1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf) +{ + if (memcmp (SIGNATURE_OLDOFFICE3, input_buf, 12)) return (PARSER_SIGNATURE_UNMATCHED); + + return oldoffice34_parse_hash (input_buf, input_len, hash_buf); +} + +int oldoffice34cm2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf) +{ + if ((input_len < DISPLAY_LEN_MIN_9820) || (input_len > DISPLAY_LEN_MAX_9820)) return (PARSER_GLOBAL_LENGTH); + + if (memcmp (SIGNATURE_OLDOFFICE3, input_buf, 12)) return (PARSER_SIGNATURE_UNMATCHED); + + uint32_t *digest = (uint32_t *) hash_buf->digest; + + salt_t *salt = hash_buf->salt; + + oldoffice34_t *oldoffice34 = (oldoffice34_t *) hash_buf->esalt; + + /** + * parse line + */ + + char *version_pos = input_buf + 11; + + char *osalt_pos = strchr (version_pos, '*'); + + if (osalt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); + + uint32_t version_len = osalt_pos - version_pos; + + if (version_len != 1) return (PARSER_SALT_LENGTH); + + osalt_pos++; + + char *encryptedVerifier_pos = strchr (osalt_pos, '*'); + + if (encryptedVerifier_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); + + uint32_t osalt_len = encryptedVerifier_pos - osalt_pos; + + if (osalt_len != 32) return (PARSER_SALT_LENGTH); + + encryptedVerifier_pos++; + + char *encryptedVerifierHash_pos = strchr (encryptedVerifier_pos, '*'); + + if (encryptedVerifierHash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); + + uint32_t encryptedVerifier_len = encryptedVerifierHash_pos - encryptedVerifier_pos; + + if (encryptedVerifier_len != 32) return (PARSER_SALT_LENGTH); + + encryptedVerifierHash_pos++; + + char *rc4key_pos = strchr (encryptedVerifierHash_pos, ':'); + + if (rc4key_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); + + uint32_t encryptedVerifierHash_len = rc4key_pos - encryptedVerifierHash_pos; + + if (encryptedVerifierHash_len != 40) return (PARSER_SALT_LENGTH); + + rc4key_pos++; + + uint32_t rc4key_len = input_len - 11 - version_len - 1 - osalt_len - 1 - encryptedVerifier_len - 1 - encryptedVerifierHash_len - 1; + + if (rc4key_len != 10) return (PARSER_SALT_LENGTH); + + const uint version = *version_pos - 0x30; + + if (version != 3 && version != 4) return (PARSER_SALT_VALUE); + + /** + * esalt + */ + + oldoffice34->version = version; + + oldoffice34->encryptedVerifier[0] = hex_to_uint (&encryptedVerifier_pos[ 0]); + oldoffice34->encryptedVerifier[1] = hex_to_uint (&encryptedVerifier_pos[ 8]); + oldoffice34->encryptedVerifier[2] = hex_to_uint (&encryptedVerifier_pos[16]); + oldoffice34->encryptedVerifier[3] = hex_to_uint (&encryptedVerifier_pos[24]); + + oldoffice34->encryptedVerifier[0] = byte_swap_32 (oldoffice34->encryptedVerifier[0]); + oldoffice34->encryptedVerifier[1] = byte_swap_32 (oldoffice34->encryptedVerifier[1]); + oldoffice34->encryptedVerifier[2] = byte_swap_32 (oldoffice34->encryptedVerifier[2]); + oldoffice34->encryptedVerifier[3] = byte_swap_32 (oldoffice34->encryptedVerifier[3]); + + oldoffice34->encryptedVerifierHash[0] = hex_to_uint (&encryptedVerifierHash_pos[ 0]); + oldoffice34->encryptedVerifierHash[1] = hex_to_uint (&encryptedVerifierHash_pos[ 8]); + oldoffice34->encryptedVerifierHash[2] = hex_to_uint (&encryptedVerifierHash_pos[16]); + oldoffice34->encryptedVerifierHash[3] = hex_to_uint (&encryptedVerifierHash_pos[24]); + oldoffice34->encryptedVerifierHash[4] = hex_to_uint (&encryptedVerifierHash_pos[32]); + + oldoffice34->encryptedVerifierHash[0] = byte_swap_32 (oldoffice34->encryptedVerifierHash[0]); + oldoffice34->encryptedVerifierHash[1] = byte_swap_32 (oldoffice34->encryptedVerifierHash[1]); + oldoffice34->encryptedVerifierHash[2] = byte_swap_32 (oldoffice34->encryptedVerifierHash[2]); + oldoffice34->encryptedVerifierHash[3] = byte_swap_32 (oldoffice34->encryptedVerifierHash[3]); + oldoffice34->encryptedVerifierHash[4] = byte_swap_32 (oldoffice34->encryptedVerifierHash[4]); + + oldoffice34->rc4key[1] = 0; + oldoffice34->rc4key[0] = 0; + + oldoffice34->rc4key[0] |= hex_convert (rc4key_pos[0]) << 28; + oldoffice34->rc4key[0] |= hex_convert (rc4key_pos[1]) << 24; + oldoffice34->rc4key[0] |= hex_convert (rc4key_pos[2]) << 20; + oldoffice34->rc4key[0] |= hex_convert (rc4key_pos[3]) << 16; + oldoffice34->rc4key[0] |= hex_convert (rc4key_pos[4]) << 12; + oldoffice34->rc4key[0] |= hex_convert (rc4key_pos[5]) << 8; + oldoffice34->rc4key[0] |= hex_convert (rc4key_pos[6]) << 4; + oldoffice34->rc4key[0] |= hex_convert (rc4key_pos[7]) << 0; + oldoffice34->rc4key[1] |= hex_convert (rc4key_pos[8]) << 28; + oldoffice34->rc4key[1] |= hex_convert (rc4key_pos[9]) << 24; + + oldoffice34->rc4key[0] = byte_swap_32 (oldoffice34->rc4key[0]); + oldoffice34->rc4key[1] = byte_swap_32 (oldoffice34->rc4key[1]); + + /** + * salt + */ + + salt->salt_len = 16; + + salt->salt_buf[0] = hex_to_uint (&osalt_pos[ 0]); + salt->salt_buf[1] = hex_to_uint (&osalt_pos[ 8]); + salt->salt_buf[2] = hex_to_uint (&osalt_pos[16]); + salt->salt_buf[3] = hex_to_uint (&osalt_pos[24]); + + // this is a workaround as office produces multiple documents with the same salt + + salt->salt_len += 32; + + salt->salt_buf[ 4] = oldoffice34->encryptedVerifier[0]; + salt->salt_buf[ 5] = oldoffice34->encryptedVerifier[1]; + salt->salt_buf[ 6] = oldoffice34->encryptedVerifier[2]; + salt->salt_buf[ 7] = oldoffice34->encryptedVerifier[3]; + salt->salt_buf[ 8] = oldoffice34->encryptedVerifierHash[0]; + salt->salt_buf[ 9] = oldoffice34->encryptedVerifierHash[1]; + salt->salt_buf[10] = oldoffice34->encryptedVerifierHash[2]; + salt->salt_buf[11] = oldoffice34->encryptedVerifierHash[3]; + + /** + * digest + */ + + digest[0] = oldoffice34->rc4key[0]; + digest[1] = oldoffice34->rc4key[1]; + digest[2] = 0; + digest[3] = 0; + + return (PARSER_OK); +} + +int radmin2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf) +{ + if ((input_len < DISPLAY_LEN_MIN_9900) || (input_len > DISPLAY_LEN_MAX_9900)) return (PARSER_GLOBAL_LENGTH); + + uint32_t *digest = (uint32_t *) hash_buf->digest; + + digest[0] = hex_to_uint (&input_buf[ 0]); + digest[1] = hex_to_uint (&input_buf[ 8]); + digest[2] = hex_to_uint (&input_buf[16]); + digest[3] = hex_to_uint (&input_buf[24]); + + digest[0] = byte_swap_32 (digest[0]); + digest[1] = byte_swap_32 (digest[1]); + digest[2] = byte_swap_32 (digest[2]); + digest[3] = byte_swap_32 (digest[3]); + + return (PARSER_OK); +} + +int djangosha1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf) +{ + if ((input_len < DISPLAY_LEN_MIN_124) || (input_len > DISPLAY_LEN_MAX_124)) return (PARSER_GLOBAL_LENGTH); + + if ((memcmp (SIGNATURE_DJANGOSHA1, input_buf, 5)) && (memcmp (SIGNATURE_DJANGOSHA1, input_buf, 5))) return (PARSER_SIGNATURE_UNMATCHED); + + uint32_t *digest = (uint32_t *) hash_buf->digest; + + salt_t *salt = hash_buf->salt; + + char *signature_pos = input_buf; + + char *salt_pos = strchr (signature_pos, '$'); + + if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); + + uint32_t signature_len = salt_pos - signature_pos; + + if (signature_len != 4) return (PARSER_SIGNATURE_UNMATCHED); + + salt_pos++; + + char *hash_pos = strchr (salt_pos, '$'); + + if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); + + uint32_t salt_len = hash_pos - salt_pos; + + if (salt_len > 32) return (PARSER_SALT_LENGTH); + + hash_pos++; + + uint32_t hash_len = input_len - signature_len - 1 - salt_len - 1; + + if (hash_len != 40) return (PARSER_SALT_LENGTH); + + digest[0] = hex_to_uint (&hash_pos[ 0]); + digest[1] = hex_to_uint (&hash_pos[ 8]); + digest[2] = hex_to_uint (&hash_pos[16]); + digest[3] = hex_to_uint (&hash_pos[24]); + digest[4] = hex_to_uint (&hash_pos[32]); + + digest[0] -= SHA1M_A; + digest[1] -= SHA1M_B; + digest[2] -= SHA1M_C; + digest[3] -= SHA1M_D; + digest[4] -= SHA1M_E; + + char *salt_buf_ptr = (char *) salt->salt_buf; + + memcpy (salt_buf_ptr, salt_pos, salt_len); + + salt->salt_len = salt_len; + + return (PARSER_OK); +} + +int djangopbkdf2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf) +{ + if ((input_len < DISPLAY_LEN_MIN_10000) || (input_len > DISPLAY_LEN_MAX_10000)) return (PARSER_GLOBAL_LENGTH); + + if (memcmp (SIGNATURE_DJANGOPBKDF2, input_buf, 14)) return (PARSER_SIGNATURE_UNMATCHED); + + uint32_t *digest = (uint32_t *) hash_buf->digest; + + salt_t *salt = hash_buf->salt; + + pbkdf2_sha256_t *pbkdf2_sha256 = (pbkdf2_sha256_t *) hash_buf->esalt; + + /** + * parse line + */ + + char *iter_pos = input_buf + 14; + + const int iter = atoi (iter_pos); + + if (iter < 1) return (PARSER_SALT_ITERATION); + + salt->salt_iter = iter - 1; + + char *salt_pos = strchr (iter_pos, '$'); + + if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); + + salt_pos++; + + char *hash_pos = strchr (salt_pos, '$'); + + if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); + + const uint salt_len = hash_pos - salt_pos; + + hash_pos++; + + char *salt_buf_ptr = (char *) pbkdf2_sha256->salt_buf; + + memcpy (salt_buf_ptr, salt_pos, salt_len); + + salt->salt_len = salt_len; + + salt_buf_ptr[salt_len + 3] = 0x01; + salt_buf_ptr[salt_len + 4] = 0x80; + + // add some stuff to normal salt to make sorted happy + + salt->salt_buf[0] = pbkdf2_sha256->salt_buf[0]; + salt->salt_buf[1] = pbkdf2_sha256->salt_buf[1]; + salt->salt_buf[2] = pbkdf2_sha256->salt_buf[2]; + salt->salt_buf[3] = pbkdf2_sha256->salt_buf[3]; + salt->salt_buf[4] = salt->salt_iter; + + // base64 decode hash + + char tmp_buf[100]; + + memset (tmp_buf, 0, sizeof (tmp_buf)); + + uint hash_len = input_len - (hash_pos - input_buf); + + if (hash_len != 44) return (PARSER_HASH_LENGTH); + + base64_decode (base64_to_int, hash_pos, hash_len, tmp_buf); + + memcpy (digest, tmp_buf, 32); + + digest[0] = byte_swap_32 (digest[0]); + digest[1] = byte_swap_32 (digest[1]); + digest[2] = byte_swap_32 (digest[2]); + digest[3] = byte_swap_32 (digest[3]); + digest[4] = byte_swap_32 (digest[4]); + digest[5] = byte_swap_32 (digest[5]); + digest[6] = byte_swap_32 (digest[6]); + digest[7] = byte_swap_32 (digest[7]); + + return (PARSER_OK); +} + +int siphash_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf) +{ + if ((input_len < DISPLAY_LEN_MIN_10100) || (input_len > DISPLAY_LEN_MAX_10100)) return (PARSER_GLOBAL_LENGTH); + + uint32_t *digest = (uint32_t *) hash_buf->digest; + + salt_t *salt = hash_buf->salt; + + digest[0] = hex_to_uint (&input_buf[ 0]); + digest[1] = hex_to_uint (&input_buf[ 8]); + digest[2] = 0; + digest[3] = 0; + + digest[0] = byte_swap_32 (digest[0]); + digest[1] = byte_swap_32 (digest[1]); + + if (input_buf[16] != data.separator) return (PARSER_SEPARATOR_UNMATCHED); + if (input_buf[18] != data.separator) return (PARSER_SEPARATOR_UNMATCHED); + if (input_buf[20] != data.separator) return (PARSER_SEPARATOR_UNMATCHED); + + char iter_c = input_buf[17]; + char iter_d = input_buf[19]; + + // atm only defaults, let's see if there's more request + if (iter_c != '2') return (PARSER_SALT_ITERATION); + if (iter_d != '4') return (PARSER_SALT_ITERATION); + + char *salt_buf = input_buf + 16 + 1 + 1 + 1 + 1 + 1; + + salt->salt_buf[0] = hex_to_uint (&salt_buf[ 0]); + salt->salt_buf[1] = hex_to_uint (&salt_buf[ 8]); + salt->salt_buf[2] = hex_to_uint (&salt_buf[16]); + salt->salt_buf[3] = hex_to_uint (&salt_buf[24]); + + salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]); + salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]); + salt->salt_buf[2] = byte_swap_32 (salt->salt_buf[2]); + salt->salt_buf[3] = byte_swap_32 (salt->salt_buf[3]); + + salt->salt_len = 16; + + return (PARSER_OK); +} + +int crammd5_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf) +{ + if ((input_len < DISPLAY_LEN_MIN_10200) || (input_len > DISPLAY_LEN_MAX_10200)) return (PARSER_GLOBAL_LENGTH); + + if (memcmp (SIGNATURE_CRAM_MD5, input_buf, 10)) return (PARSER_SIGNATURE_UNMATCHED); + + uint32_t *digest = (uint32_t *) hash_buf->digest; + + cram_md5_t *cram_md5 = (cram_md5_t *) hash_buf->esalt; + + salt_t *salt = hash_buf->salt; + + char *salt_pos = input_buf + 10; + + char *hash_pos = strchr (salt_pos, '$'); + + uint salt_len = hash_pos - salt_pos; + + if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); + + hash_pos++; + + uint hash_len = input_len - 10 - salt_len - 1; + + // base64 decode salt + + char tmp_buf[100]; + + memset (tmp_buf, 0, sizeof (tmp_buf)); + + salt_len = base64_decode (base64_to_int, salt_pos, salt_len, tmp_buf); + + if (salt_len > 55) return (PARSER_SALT_LENGTH); + + tmp_buf[salt_len] = 0x80; + + memcpy (&salt->salt_buf, tmp_buf, salt_len + 1); + + salt->salt_len = salt_len; + + // base64 decode salt + + memset (tmp_buf, 0, sizeof (tmp_buf)); + + hash_len = base64_decode (base64_to_int, hash_pos, hash_len, tmp_buf); + + uint user_len = hash_len - 32; + + char *tmp_hash = tmp_buf + user_len; + + user_len--; // skip the trailing space + + digest[0] = hex_to_uint (&tmp_hash[ 0]); + digest[1] = hex_to_uint (&tmp_hash[ 8]); + digest[2] = hex_to_uint (&tmp_hash[16]); + digest[3] = hex_to_uint (&tmp_hash[24]); + + digest[0] = byte_swap_32 (digest[0]); + digest[1] = byte_swap_32 (digest[1]); + digest[2] = byte_swap_32 (digest[2]); + digest[3] = byte_swap_32 (digest[3]); + + // store username for host only (output hash if cracked) + + memset (cram_md5->user, 0, sizeof (cram_md5->user)); + memcpy (cram_md5->user, tmp_buf, user_len); + + return (PARSER_OK); +} + +int saph_sha1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf) +{ + if ((input_len < DISPLAY_LEN_MIN_10300) || (input_len > DISPLAY_LEN_MAX_10300)) return (PARSER_GLOBAL_LENGTH); + + if (memcmp (SIGNATURE_SAPH_SHA1, input_buf, 10)) return (PARSER_SIGNATURE_UNMATCHED); + + uint32_t *digest = (uint32_t *) hash_buf->digest; + + salt_t *salt = hash_buf->salt; + + char *iter_pos = input_buf + 10; + + uint32_t iter = atoi (iter_pos); + + if (iter < 1) + { + return (PARSER_SALT_ITERATION); + } + + iter--; // first iteration is special + + salt->salt_iter = iter; + + char *base64_pos = strchr (iter_pos, '}'); + + if (base64_pos == NULL) + { + return (PARSER_SIGNATURE_UNMATCHED); + } + + base64_pos++; + + // base64 decode salt + + uint32_t base64_len = input_len - (base64_pos - input_buf); + + char tmp_buf[100]; + + memset (tmp_buf, 0, sizeof (tmp_buf)); + + uint32_t decoded_len = base64_decode (base64_to_int, base64_pos, base64_len, tmp_buf); + + if (decoded_len < 24) + { + return (PARSER_SALT_LENGTH); + } + + // copy the salt + + uint salt_len = decoded_len - 20; + + if (salt_len < 4) return (PARSER_SALT_LENGTH); + if (salt_len > 16) return (PARSER_SALT_LENGTH); + + memcpy (&salt->salt_buf, tmp_buf + 20, salt_len); + + salt->salt_len = salt_len; + + // set digest + + uint32_t *digest_ptr = (uint32_t*) tmp_buf; + + digest[0] = byte_swap_32 (digest_ptr[0]); + digest[1] = byte_swap_32 (digest_ptr[1]); + digest[2] = byte_swap_32 (digest_ptr[2]); + digest[3] = byte_swap_32 (digest_ptr[3]); + digest[4] = byte_swap_32 (digest_ptr[4]); + + return (PARSER_OK); +} + +int redmine_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf) +{ + if ((input_len < DISPLAY_LEN_MIN_7600) || (input_len > DISPLAY_LEN_MAX_7600)) return (PARSER_GLOBAL_LENGTH); + + uint32_t *digest = (uint32_t *) hash_buf->digest; + + salt_t *salt = hash_buf->salt; + + digest[0] = hex_to_uint (&input_buf[ 0]); + digest[1] = hex_to_uint (&input_buf[ 8]); + digest[2] = hex_to_uint (&input_buf[16]); + digest[3] = hex_to_uint (&input_buf[24]); + digest[4] = hex_to_uint (&input_buf[32]); + + if (input_buf[40] != data.separator) return (PARSER_SEPARATOR_UNMATCHED); + + uint salt_len = input_len - 40 - 1; + + char *salt_buf = input_buf + 40 + 1; + + char *salt_buf_ptr = (char *) salt->salt_buf; + + salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len); + + if (salt_len != 32) return (PARSER_SALT_LENGTH); + + salt->salt_len = salt_len; + + return (PARSER_OK); +} + +int pdf11_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf) +{ + if ((input_len < DISPLAY_LEN_MIN_10400) || (input_len > DISPLAY_LEN_MAX_10400)) return (PARSER_GLOBAL_LENGTH); + + if ((memcmp (SIGNATURE_PDF, input_buf, 5)) && (memcmp (SIGNATURE_PDF, input_buf, 5))) return (PARSER_SIGNATURE_UNMATCHED); + + uint32_t *digest = (uint32_t *) hash_buf->digest; + + salt_t *salt = hash_buf->salt; + + pdf_t *pdf = (pdf_t *) hash_buf->esalt; + + /** + * parse line + */ + + char *V_pos = input_buf + 5; + + char *R_pos = strchr (V_pos, '*'); + + if (R_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); + + uint32_t V_len = R_pos - V_pos; + + R_pos++; + + char *bits_pos = strchr (R_pos, '*'); + + if (bits_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); + + uint32_t R_len = bits_pos - R_pos; + + bits_pos++; + + char *P_pos = strchr (bits_pos, '*'); + + if (P_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); + + uint32_t bits_len = P_pos - bits_pos; + + P_pos++; + + char *enc_md_pos = strchr (P_pos, '*'); + + if (enc_md_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); + + uint32_t P_len = enc_md_pos - P_pos; + + enc_md_pos++; + + char *id_len_pos = strchr (enc_md_pos, '*'); + + if (id_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); + + uint32_t enc_md_len = id_len_pos - enc_md_pos; + + id_len_pos++; + + char *id_buf_pos = strchr (id_len_pos, '*'); + + if (id_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); + + uint32_t id_len_len = id_buf_pos - id_len_pos; + + id_buf_pos++; + + char *u_len_pos = strchr (id_buf_pos, '*'); + + if (u_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); + + uint32_t id_buf_len = u_len_pos - id_buf_pos; + + if (id_buf_len != 32) return (PARSER_SALT_LENGTH); + + u_len_pos++; + + char *u_buf_pos = strchr (u_len_pos, '*'); + + if (u_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); + + uint32_t u_len_len = u_buf_pos - u_len_pos; + + u_buf_pos++; + + char *o_len_pos = strchr (u_buf_pos, '*'); + + if (o_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); + + uint32_t u_buf_len = o_len_pos - u_buf_pos; + + if (u_buf_len != 64) return (PARSER_SALT_LENGTH); + + o_len_pos++; + + char *o_buf_pos = strchr (o_len_pos, '*'); + + if (o_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); + + uint32_t o_len_len = o_buf_pos - o_len_pos; + + o_buf_pos++; + + uint32_t o_buf_len = input_len - 5 - V_len - 1 - R_len - 1 - bits_len - 1 - P_len - 1 - enc_md_len - 1 - id_len_len - 1 - id_buf_len - 1 - u_len_len - 1 - u_buf_len - 1 - o_len_len - 1; + + if (o_buf_len != 64) return (PARSER_SALT_LENGTH); + + // validate data + + const int V = atoi (V_pos); + const int R = atoi (R_pos); + const int P = atoi (P_pos); + + if (V != 1) return (PARSER_SALT_VALUE); + if (R != 2) return (PARSER_SALT_VALUE); + + const int enc_md = atoi (enc_md_pos); + + if ((enc_md != 0) && (enc_md != 1)) return (PARSER_SALT_VALUE); + + const int id_len = atoi (id_len_pos); + const int u_len = atoi (u_len_pos); + const int o_len = atoi (o_len_pos); + + if (id_len != 16) return (PARSER_SALT_VALUE); + if (u_len != 32) return (PARSER_SALT_VALUE); + if (o_len != 32) return (PARSER_SALT_VALUE); + + const int bits = atoi (bits_pos); + + if (bits != 40) return (PARSER_SALT_VALUE); + + // copy data to esalt + + pdf->V = V; + pdf->R = R; + pdf->P = P; + + pdf->enc_md = enc_md; + + pdf->id_buf[0] = hex_to_uint (&id_buf_pos[ 0]); + pdf->id_buf[1] = hex_to_uint (&id_buf_pos[ 8]); + pdf->id_buf[2] = hex_to_uint (&id_buf_pos[16]); + pdf->id_buf[3] = hex_to_uint (&id_buf_pos[24]); + pdf->id_len = id_len; + + pdf->u_buf[0] = hex_to_uint (&u_buf_pos[ 0]); + pdf->u_buf[1] = hex_to_uint (&u_buf_pos[ 8]); + pdf->u_buf[2] = hex_to_uint (&u_buf_pos[16]); + pdf->u_buf[3] = hex_to_uint (&u_buf_pos[24]); + pdf->u_buf[4] = hex_to_uint (&u_buf_pos[32]); + pdf->u_buf[5] = hex_to_uint (&u_buf_pos[40]); + pdf->u_buf[6] = hex_to_uint (&u_buf_pos[48]); + pdf->u_buf[7] = hex_to_uint (&u_buf_pos[56]); + pdf->u_len = u_len; + + pdf->o_buf[0] = hex_to_uint (&o_buf_pos[ 0]); + pdf->o_buf[1] = hex_to_uint (&o_buf_pos[ 8]); + pdf->o_buf[2] = hex_to_uint (&o_buf_pos[16]); + pdf->o_buf[3] = hex_to_uint (&o_buf_pos[24]); + pdf->o_buf[4] = hex_to_uint (&o_buf_pos[32]); + pdf->o_buf[5] = hex_to_uint (&o_buf_pos[40]); + pdf->o_buf[6] = hex_to_uint (&o_buf_pos[48]); + pdf->o_buf[7] = hex_to_uint (&o_buf_pos[56]); + pdf->o_len = o_len; + + pdf->id_buf[0] = byte_swap_32 (pdf->id_buf[0]); + pdf->id_buf[1] = byte_swap_32 (pdf->id_buf[1]); + pdf->id_buf[2] = byte_swap_32 (pdf->id_buf[2]); + pdf->id_buf[3] = byte_swap_32 (pdf->id_buf[3]); + + pdf->u_buf[0] = byte_swap_32 (pdf->u_buf[0]); + pdf->u_buf[1] = byte_swap_32 (pdf->u_buf[1]); + pdf->u_buf[2] = byte_swap_32 (pdf->u_buf[2]); + pdf->u_buf[3] = byte_swap_32 (pdf->u_buf[3]); + pdf->u_buf[4] = byte_swap_32 (pdf->u_buf[4]); + pdf->u_buf[5] = byte_swap_32 (pdf->u_buf[5]); + pdf->u_buf[6] = byte_swap_32 (pdf->u_buf[6]); + pdf->u_buf[7] = byte_swap_32 (pdf->u_buf[7]); + + pdf->o_buf[0] = byte_swap_32 (pdf->o_buf[0]); + pdf->o_buf[1] = byte_swap_32 (pdf->o_buf[1]); + pdf->o_buf[2] = byte_swap_32 (pdf->o_buf[2]); + pdf->o_buf[3] = byte_swap_32 (pdf->o_buf[3]); + pdf->o_buf[4] = byte_swap_32 (pdf->o_buf[4]); + pdf->o_buf[5] = byte_swap_32 (pdf->o_buf[5]); + pdf->o_buf[6] = byte_swap_32 (pdf->o_buf[6]); + pdf->o_buf[7] = byte_swap_32 (pdf->o_buf[7]); + + // we use ID for salt, maybe needs to change, we will see... + + salt->salt_buf[0] = pdf->id_buf[0]; + salt->salt_buf[1] = pdf->id_buf[1]; + salt->salt_buf[2] = pdf->id_buf[2]; + salt->salt_buf[3] = pdf->id_buf[3]; + salt->salt_len = pdf->id_len; + + digest[0] = pdf->u_buf[0]; + digest[1] = pdf->u_buf[1]; + digest[2] = pdf->u_buf[2]; + digest[3] = pdf->u_buf[3]; + + return (PARSER_OK); +} + +int pdf11cm1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf) +{ + return pdf11_parse_hash (input_buf, input_len, hash_buf); +} + +int pdf11cm2_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf) +{ + if ((input_len < DISPLAY_LEN_MIN_10420) || (input_len > DISPLAY_LEN_MAX_10420)) return (PARSER_GLOBAL_LENGTH); + + if ((memcmp (SIGNATURE_PDF, input_buf, 5)) && (memcmp (SIGNATURE_PDF, input_buf, 5))) return (PARSER_SIGNATURE_UNMATCHED); + + uint32_t *digest = (uint32_t *) hash_buf->digest; + + salt_t *salt = hash_buf->salt; + + pdf_t *pdf = (pdf_t *) hash_buf->esalt; + + /** + * parse line + */ + + char *V_pos = input_buf + 5; + + char *R_pos = strchr (V_pos, '*'); + + if (R_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); + + uint32_t V_len = R_pos - V_pos; + + R_pos++; + + char *bits_pos = strchr (R_pos, '*'); + + if (bits_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); + + uint32_t R_len = bits_pos - R_pos; + + bits_pos++; + + char *P_pos = strchr (bits_pos, '*'); + + if (P_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); + + uint32_t bits_len = P_pos - bits_pos; + + P_pos++; + + char *enc_md_pos = strchr (P_pos, '*'); + + if (enc_md_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); + + uint32_t P_len = enc_md_pos - P_pos; + + enc_md_pos++; + + char *id_len_pos = strchr (enc_md_pos, '*'); + + if (id_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); + + uint32_t enc_md_len = id_len_pos - enc_md_pos; + + id_len_pos++; + + char *id_buf_pos = strchr (id_len_pos, '*'); + + if (id_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); + + uint32_t id_len_len = id_buf_pos - id_len_pos; + + id_buf_pos++; + + char *u_len_pos = strchr (id_buf_pos, '*'); + + if (u_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); + + uint32_t id_buf_len = u_len_pos - id_buf_pos; + + if (id_buf_len != 32) return (PARSER_SALT_LENGTH); + + u_len_pos++; + + char *u_buf_pos = strchr (u_len_pos, '*'); + + if (u_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); + + uint32_t u_len_len = u_buf_pos - u_len_pos; + + u_buf_pos++; + + char *o_len_pos = strchr (u_buf_pos, '*'); + + if (o_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); + + uint32_t u_buf_len = o_len_pos - u_buf_pos; + + if (u_buf_len != 64) return (PARSER_SALT_LENGTH); + + o_len_pos++; + + char *o_buf_pos = strchr (o_len_pos, '*'); + + if (o_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); + + uint32_t o_len_len = o_buf_pos - o_len_pos; + + o_buf_pos++; + + char *rc4key_pos = strchr (o_buf_pos, ':'); + + if (rc4key_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); + + uint32_t o_buf_len = rc4key_pos - o_buf_pos; + + if (o_buf_len != 64) return (PARSER_SALT_LENGTH); + + rc4key_pos++; + + uint32_t rc4key_len = input_len - 5 - V_len - 1 - R_len - 1 - bits_len - 1 - P_len - 1 - enc_md_len - 1 - id_len_len - 1 - id_buf_len - 1 - u_len_len - 1 - u_buf_len - 1 - o_len_len - 1 - o_buf_len - 1; + + if (rc4key_len != 10) return (PARSER_SALT_LENGTH); + + // validate data + + const int V = atoi (V_pos); + const int R = atoi (R_pos); + const int P = atoi (P_pos); + + if (V != 1) return (PARSER_SALT_VALUE); + if (R != 2) return (PARSER_SALT_VALUE); + + const int enc_md = atoi (enc_md_pos); + + if ((enc_md != 0) && (enc_md != 1)) return (PARSER_SALT_VALUE); + + const int id_len = atoi (id_len_pos); + const int u_len = atoi (u_len_pos); + const int o_len = atoi (o_len_pos); + + if (id_len != 16) return (PARSER_SALT_VALUE); + if (u_len != 32) return (PARSER_SALT_VALUE); + if (o_len != 32) return (PARSER_SALT_VALUE); + + const int bits = atoi (bits_pos); + + if (bits != 40) return (PARSER_SALT_VALUE); + + // copy data to esalt + + pdf->V = V; + pdf->R = R; + pdf->P = P; + + pdf->enc_md = enc_md; + + pdf->id_buf[0] = hex_to_uint (&id_buf_pos[ 0]); + pdf->id_buf[1] = hex_to_uint (&id_buf_pos[ 8]); + pdf->id_buf[2] = hex_to_uint (&id_buf_pos[16]); + pdf->id_buf[3] = hex_to_uint (&id_buf_pos[24]); + pdf->id_len = id_len; + + pdf->u_buf[0] = hex_to_uint (&u_buf_pos[ 0]); + pdf->u_buf[1] = hex_to_uint (&u_buf_pos[ 8]); + pdf->u_buf[2] = hex_to_uint (&u_buf_pos[16]); + pdf->u_buf[3] = hex_to_uint (&u_buf_pos[24]); + pdf->u_buf[4] = hex_to_uint (&u_buf_pos[32]); + pdf->u_buf[5] = hex_to_uint (&u_buf_pos[40]); + pdf->u_buf[6] = hex_to_uint (&u_buf_pos[48]); + pdf->u_buf[7] = hex_to_uint (&u_buf_pos[56]); + pdf->u_len = u_len; + + pdf->o_buf[0] = hex_to_uint (&o_buf_pos[ 0]); + pdf->o_buf[1] = hex_to_uint (&o_buf_pos[ 8]); + pdf->o_buf[2] = hex_to_uint (&o_buf_pos[16]); + pdf->o_buf[3] = hex_to_uint (&o_buf_pos[24]); + pdf->o_buf[4] = hex_to_uint (&o_buf_pos[32]); + pdf->o_buf[5] = hex_to_uint (&o_buf_pos[40]); + pdf->o_buf[6] = hex_to_uint (&o_buf_pos[48]); + pdf->o_buf[7] = hex_to_uint (&o_buf_pos[56]); + pdf->o_len = o_len; + + pdf->id_buf[0] = byte_swap_32 (pdf->id_buf[0]); + pdf->id_buf[1] = byte_swap_32 (pdf->id_buf[1]); + pdf->id_buf[2] = byte_swap_32 (pdf->id_buf[2]); + pdf->id_buf[3] = byte_swap_32 (pdf->id_buf[3]); + + pdf->u_buf[0] = byte_swap_32 (pdf->u_buf[0]); + pdf->u_buf[1] = byte_swap_32 (pdf->u_buf[1]); + pdf->u_buf[2] = byte_swap_32 (pdf->u_buf[2]); + pdf->u_buf[3] = byte_swap_32 (pdf->u_buf[3]); + pdf->u_buf[4] = byte_swap_32 (pdf->u_buf[4]); + pdf->u_buf[5] = byte_swap_32 (pdf->u_buf[5]); + pdf->u_buf[6] = byte_swap_32 (pdf->u_buf[6]); + pdf->u_buf[7] = byte_swap_32 (pdf->u_buf[7]); + + pdf->o_buf[0] = byte_swap_32 (pdf->o_buf[0]); + pdf->o_buf[1] = byte_swap_32 (pdf->o_buf[1]); + pdf->o_buf[2] = byte_swap_32 (pdf->o_buf[2]); + pdf->o_buf[3] = byte_swap_32 (pdf->o_buf[3]); + pdf->o_buf[4] = byte_swap_32 (pdf->o_buf[4]); + pdf->o_buf[5] = byte_swap_32 (pdf->o_buf[5]); + pdf->o_buf[6] = byte_swap_32 (pdf->o_buf[6]); + pdf->o_buf[7] = byte_swap_32 (pdf->o_buf[7]); + + pdf->rc4key[1] = 0; + pdf->rc4key[0] = 0; + + pdf->rc4key[0] |= hex_convert (rc4key_pos[0]) << 28; + pdf->rc4key[0] |= hex_convert (rc4key_pos[1]) << 24; + pdf->rc4key[0] |= hex_convert (rc4key_pos[2]) << 20; + pdf->rc4key[0] |= hex_convert (rc4key_pos[3]) << 16; + pdf->rc4key[0] |= hex_convert (rc4key_pos[4]) << 12; + pdf->rc4key[0] |= hex_convert (rc4key_pos[5]) << 8; + pdf->rc4key[0] |= hex_convert (rc4key_pos[6]) << 4; + pdf->rc4key[0] |= hex_convert (rc4key_pos[7]) << 0; + pdf->rc4key[1] |= hex_convert (rc4key_pos[8]) << 28; + pdf->rc4key[1] |= hex_convert (rc4key_pos[9]) << 24; + + pdf->rc4key[0] = byte_swap_32 (pdf->rc4key[0]); + pdf->rc4key[1] = byte_swap_32 (pdf->rc4key[1]); + + // we use ID for salt, maybe needs to change, we will see... + + salt->salt_buf[0] = pdf->id_buf[0]; + salt->salt_buf[1] = pdf->id_buf[1]; + salt->salt_buf[2] = pdf->id_buf[2]; + salt->salt_buf[3] = pdf->id_buf[3]; + salt->salt_buf[4] = pdf->u_buf[0]; + salt->salt_buf[5] = pdf->u_buf[1]; + salt->salt_buf[6] = pdf->o_buf[0]; + salt->salt_buf[7] = pdf->o_buf[1]; + salt->salt_len = pdf->id_len + 16; + + digest[0] = pdf->rc4key[0]; + digest[1] = pdf->rc4key[1]; + digest[2] = 0; + digest[3] = 0; + + return (PARSER_OK); +} + +int pdf14_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf) +{ + if ((input_len < DISPLAY_LEN_MIN_10500) || (input_len > DISPLAY_LEN_MAX_10500)) return (PARSER_GLOBAL_LENGTH); + + if ((memcmp (SIGNATURE_PDF, input_buf, 5)) && (memcmp (SIGNATURE_PDF, input_buf, 5))) return (PARSER_SIGNATURE_UNMATCHED); + + uint32_t *digest = (uint32_t *) hash_buf->digest; + + salt_t *salt = hash_buf->salt; + + pdf_t *pdf = (pdf_t *) hash_buf->esalt; + + /** + * parse line + */ + + char *V_pos = input_buf + 5; + + char *R_pos = strchr (V_pos, '*'); + + if (R_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); + + uint32_t V_len = R_pos - V_pos; + + R_pos++; + + char *bits_pos = strchr (R_pos, '*'); + + if (bits_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); + + uint32_t R_len = bits_pos - R_pos; + + bits_pos++; + + char *P_pos = strchr (bits_pos, '*'); + + if (P_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); + + uint32_t bits_len = P_pos - bits_pos; + + P_pos++; + + char *enc_md_pos = strchr (P_pos, '*'); + + if (enc_md_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); + + uint32_t P_len = enc_md_pos - P_pos; + + enc_md_pos++; + + char *id_len_pos = strchr (enc_md_pos, '*'); + + if (id_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); + + uint32_t enc_md_len = id_len_pos - enc_md_pos; + + id_len_pos++; + + char *id_buf_pos = strchr (id_len_pos, '*'); + + if (id_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); + + uint32_t id_len_len = id_buf_pos - id_len_pos; + + id_buf_pos++; + + char *u_len_pos = strchr (id_buf_pos, '*'); + + if (u_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); + + uint32_t id_buf_len = u_len_pos - id_buf_pos; + + if ((id_buf_len != 32) && (id_buf_len != 64)) return (PARSER_SALT_LENGTH); + + u_len_pos++; + + char *u_buf_pos = strchr (u_len_pos, '*'); + + if (u_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); + + uint32_t u_len_len = u_buf_pos - u_len_pos; + + u_buf_pos++; + + char *o_len_pos = strchr (u_buf_pos, '*'); + + if (o_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); + + uint32_t u_buf_len = o_len_pos - u_buf_pos; + + if (u_buf_len != 64) return (PARSER_SALT_LENGTH); + + o_len_pos++; + + char *o_buf_pos = strchr (o_len_pos, '*'); + + if (o_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); + + uint32_t o_len_len = o_buf_pos - o_len_pos; + + o_buf_pos++; + + uint32_t o_buf_len = input_len - 5 - V_len - 1 - R_len - 1 - bits_len - 1 - P_len - 1 - enc_md_len - 1 - id_len_len - 1 - id_buf_len - 1 - u_len_len - 1 - u_buf_len - 1 - o_len_len - 1; + + if (o_buf_len != 64) return (PARSER_SALT_LENGTH); + + // validate data + + const int V = atoi (V_pos); + const int R = atoi (R_pos); + const int P = atoi (P_pos); + + int vr_ok = 0; + + if ((V == 2) && (R == 3)) vr_ok = 1; + if ((V == 4) && (R == 4)) vr_ok = 1; + + if (vr_ok == 0) return (PARSER_SALT_VALUE); + + const int id_len = atoi (id_len_pos); + const int u_len = atoi (u_len_pos); + const int o_len = atoi (o_len_pos); + + if ((id_len != 16) && (id_len != 32)) return (PARSER_SALT_VALUE); + + if (u_len != 32) return (PARSER_SALT_VALUE); + if (o_len != 32) return (PARSER_SALT_VALUE); + + const int bits = atoi (bits_pos); + + if (bits != 128) return (PARSER_SALT_VALUE); + + int enc_md = 1; + + if (R >= 4) + { + enc_md = atoi (enc_md_pos); + } + + // copy data to esalt + + pdf->V = V; + pdf->R = R; + pdf->P = P; + + pdf->enc_md = enc_md; + + pdf->id_buf[0] = hex_to_uint (&id_buf_pos[ 0]); + pdf->id_buf[1] = hex_to_uint (&id_buf_pos[ 8]); + pdf->id_buf[2] = hex_to_uint (&id_buf_pos[16]); + pdf->id_buf[3] = hex_to_uint (&id_buf_pos[24]); + + if (id_len == 32) + { + pdf->id_buf[4] = hex_to_uint (&id_buf_pos[32]); + pdf->id_buf[5] = hex_to_uint (&id_buf_pos[40]); + pdf->id_buf[6] = hex_to_uint (&id_buf_pos[48]); + pdf->id_buf[7] = hex_to_uint (&id_buf_pos[56]); + } + + pdf->id_len = id_len; + + pdf->u_buf[0] = hex_to_uint (&u_buf_pos[ 0]); + pdf->u_buf[1] = hex_to_uint (&u_buf_pos[ 8]); + pdf->u_buf[2] = hex_to_uint (&u_buf_pos[16]); + pdf->u_buf[3] = hex_to_uint (&u_buf_pos[24]); + pdf->u_buf[4] = hex_to_uint (&u_buf_pos[32]); + pdf->u_buf[5] = hex_to_uint (&u_buf_pos[40]); + pdf->u_buf[6] = hex_to_uint (&u_buf_pos[48]); + pdf->u_buf[7] = hex_to_uint (&u_buf_pos[56]); + pdf->u_len = u_len; + + pdf->o_buf[0] = hex_to_uint (&o_buf_pos[ 0]); + pdf->o_buf[1] = hex_to_uint (&o_buf_pos[ 8]); + pdf->o_buf[2] = hex_to_uint (&o_buf_pos[16]); + pdf->o_buf[3] = hex_to_uint (&o_buf_pos[24]); + pdf->o_buf[4] = hex_to_uint (&o_buf_pos[32]); + pdf->o_buf[5] = hex_to_uint (&o_buf_pos[40]); + pdf->o_buf[6] = hex_to_uint (&o_buf_pos[48]); + pdf->o_buf[7] = hex_to_uint (&o_buf_pos[56]); + pdf->o_len = o_len; + + pdf->id_buf[0] = byte_swap_32 (pdf->id_buf[0]); + pdf->id_buf[1] = byte_swap_32 (pdf->id_buf[1]); + pdf->id_buf[2] = byte_swap_32 (pdf->id_buf[2]); + pdf->id_buf[3] = byte_swap_32 (pdf->id_buf[3]); + + if (id_len == 32) + { + pdf->id_buf[4] = byte_swap_32 (pdf->id_buf[4]); + pdf->id_buf[5] = byte_swap_32 (pdf->id_buf[5]); + pdf->id_buf[6] = byte_swap_32 (pdf->id_buf[6]); + pdf->id_buf[7] = byte_swap_32 (pdf->id_buf[7]); + } + + pdf->u_buf[0] = byte_swap_32 (pdf->u_buf[0]); + pdf->u_buf[1] = byte_swap_32 (pdf->u_buf[1]); + pdf->u_buf[2] = byte_swap_32 (pdf->u_buf[2]); + pdf->u_buf[3] = byte_swap_32 (pdf->u_buf[3]); + pdf->u_buf[4] = byte_swap_32 (pdf->u_buf[4]); + pdf->u_buf[5] = byte_swap_32 (pdf->u_buf[5]); + pdf->u_buf[6] = byte_swap_32 (pdf->u_buf[6]); + pdf->u_buf[7] = byte_swap_32 (pdf->u_buf[7]); + + pdf->o_buf[0] = byte_swap_32 (pdf->o_buf[0]); + pdf->o_buf[1] = byte_swap_32 (pdf->o_buf[1]); + pdf->o_buf[2] = byte_swap_32 (pdf->o_buf[2]); + pdf->o_buf[3] = byte_swap_32 (pdf->o_buf[3]); + pdf->o_buf[4] = byte_swap_32 (pdf->o_buf[4]); + pdf->o_buf[5] = byte_swap_32 (pdf->o_buf[5]); + pdf->o_buf[6] = byte_swap_32 (pdf->o_buf[6]); + pdf->o_buf[7] = byte_swap_32 (pdf->o_buf[7]); + + // precompute rc4 data for later use + + uint padding[8] = + { + 0x5e4ebf28, + 0x418a754e, + 0x564e0064, + 0x0801faff, + 0xb6002e2e, + 0x803e68d0, + 0xfea90c2f, + 0x7a695364 + }; + + // md5 + + uint salt_pc_block[32]; + + char *salt_pc_ptr = (char *) salt_pc_block; + + memcpy (salt_pc_ptr, padding, 32); + memcpy (salt_pc_ptr + 32, pdf->id_buf, pdf->id_len); + + uint salt_pc_digest[4]; + + md5_complete_no_limit (salt_pc_digest, salt_pc_block, 32 + pdf->id_len); + + pdf->rc4data[0] = salt_pc_digest[0]; + pdf->rc4data[1] = salt_pc_digest[1]; + + // we use ID for salt, maybe needs to change, we will see... + + salt->salt_buf[0] = pdf->id_buf[0]; + salt->salt_buf[1] = pdf->id_buf[1]; + salt->salt_buf[2] = pdf->id_buf[2]; + salt->salt_buf[3] = pdf->id_buf[3]; + salt->salt_buf[4] = pdf->u_buf[0]; + salt->salt_buf[5] = pdf->u_buf[1]; + salt->salt_buf[6] = pdf->o_buf[0]; + salt->salt_buf[7] = pdf->o_buf[1]; + salt->salt_len = pdf->id_len + 16; + + salt->salt_iter = ROUNDS_PDF14; + + digest[0] = pdf->u_buf[0]; + digest[1] = pdf->u_buf[1]; + digest[2] = 0; + digest[3] = 0; + + return (PARSER_OK); +} + +int pdf17l3_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf) +{ + int ret = pdf17l8_parse_hash (input_buf, input_len, hash_buf); + + if (ret != PARSER_OK) + { + return ret; + } + + uint32_t *digest = (uint32_t *) hash_buf->digest; + + salt_t *salt = hash_buf->salt; + + digest[0] -= SHA256M_A; + digest[1] -= SHA256M_B; + digest[2] -= SHA256M_C; + digest[3] -= SHA256M_D; + digest[4] -= SHA256M_E; + digest[5] -= SHA256M_F; + digest[6] -= SHA256M_G; + digest[7] -= SHA256M_H; + + salt->salt_buf[2] = 0x80; + + return (PARSER_OK); +} + +int pdf17l8_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf) +{ + if ((input_len < DISPLAY_LEN_MIN_10600) || (input_len > DISPLAY_LEN_MAX_10600)) return (PARSER_GLOBAL_LENGTH); + + if ((memcmp (SIGNATURE_PDF, input_buf, 5)) && (memcmp (SIGNATURE_PDF, input_buf, 5))) return (PARSER_SIGNATURE_UNMATCHED); + + uint32_t *digest = (uint32_t *) hash_buf->digest; + + salt_t *salt = hash_buf->salt; + + pdf_t *pdf = (pdf_t *) hash_buf->esalt; + + /** + * parse line + */ + + char *V_pos = input_buf + 5; + + char *R_pos = strchr (V_pos, '*'); + + if (R_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); + + uint32_t V_len = R_pos - V_pos; + + R_pos++; + + char *bits_pos = strchr (R_pos, '*'); + + if (bits_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); + + uint32_t R_len = bits_pos - R_pos; + + bits_pos++; + + char *P_pos = strchr (bits_pos, '*'); + + if (P_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); + + uint32_t bits_len = P_pos - bits_pos; + + P_pos++; + + char *enc_md_pos = strchr (P_pos, '*'); + + if (enc_md_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); + + uint32_t P_len = enc_md_pos - P_pos; + + enc_md_pos++; + + char *id_len_pos = strchr (enc_md_pos, '*'); + + if (id_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); + + uint32_t enc_md_len = id_len_pos - enc_md_pos; + + id_len_pos++; + + char *id_buf_pos = strchr (id_len_pos, '*'); + + if (id_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); + + uint32_t id_len_len = id_buf_pos - id_len_pos; + + id_buf_pos++; + + char *u_len_pos = strchr (id_buf_pos, '*'); + + if (u_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); + + uint32_t id_buf_len = u_len_pos - id_buf_pos; + + u_len_pos++; + + char *u_buf_pos = strchr (u_len_pos, '*'); + + if (u_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); + + uint32_t u_len_len = u_buf_pos - u_len_pos; + + u_buf_pos++; + + char *o_len_pos = strchr (u_buf_pos, '*'); + + if (o_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); + + uint32_t u_buf_len = o_len_pos - u_buf_pos; + + o_len_pos++; + + char *o_buf_pos = strchr (o_len_pos, '*'); + + if (o_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); + + uint32_t o_len_len = o_buf_pos - o_len_pos; + + o_buf_pos++; + + char *last = strchr (o_buf_pos, '*'); + + if (last == NULL) last = input_buf + input_len; + + uint32_t o_buf_len = last - o_buf_pos; + + // validate data + + const int V = atoi (V_pos); + const int R = atoi (R_pos); + + int vr_ok = 0; + + if ((V == 5) && (R == 5)) vr_ok = 1; + if ((V == 5) && (R == 6)) vr_ok = 1; + + if (vr_ok == 0) return (PARSER_SALT_VALUE); + + const int bits = atoi (bits_pos); + + if (bits != 256) return (PARSER_SALT_VALUE); + + int enc_md = atoi (enc_md_pos); + + if (enc_md != 1) return (PARSER_SALT_VALUE); + + const uint id_len = atoi (id_len_pos); + const uint u_len = atoi (u_len_pos); + const uint o_len = atoi (o_len_pos); + + if (V_len > 6) return (PARSER_SALT_LENGTH); + if (R_len > 6) return (PARSER_SALT_LENGTH); + if (P_len > 6) return (PARSER_SALT_LENGTH); + if (id_len_len > 6) return (PARSER_SALT_LENGTH); + if (u_len_len > 6) return (PARSER_SALT_LENGTH); + if (o_len_len > 6) return (PARSER_SALT_LENGTH); + if (bits_len > 6) return (PARSER_SALT_LENGTH); + if (enc_md_len > 6) return (PARSER_SALT_LENGTH); + + if ((id_len * 2) != id_buf_len) return (PARSER_SALT_VALUE); + if ((u_len * 2) != u_buf_len) return (PARSER_SALT_VALUE); + if ((o_len * 2) != o_buf_len) return (PARSER_SALT_VALUE); + + // copy data to esalt + + if (u_len < 40) return (PARSER_SALT_VALUE); + + for (int i = 0, j = 0; i < 8 + 2; i += 1, j += 8) + { + pdf->u_buf[i] = hex_to_uint (&u_buf_pos[j]); + } + + salt->salt_buf[0] = pdf->u_buf[8]; + salt->salt_buf[1] = pdf->u_buf[9]; + + salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]); + salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]); + + salt->salt_len = 8; + salt->salt_iter = ROUNDS_PDF17L8; + + digest[0] = pdf->u_buf[0]; + digest[1] = pdf->u_buf[1]; + digest[2] = pdf->u_buf[2]; + digest[3] = pdf->u_buf[3]; + digest[4] = pdf->u_buf[4]; + digest[5] = pdf->u_buf[5]; + digest[6] = pdf->u_buf[6]; + digest[7] = pdf->u_buf[7]; + + return (PARSER_OK); +} + +int pbkdf2_sha256_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf) +{ + if ((input_len < DISPLAY_LEN_MIN_10900) || (input_len > DISPLAY_LEN_MAX_10900)) return (PARSER_GLOBAL_LENGTH); + + if (memcmp (SIGNATURE_PBKDF2_SHA256, input_buf, 7)) return (PARSER_SIGNATURE_UNMATCHED); + + uint32_t *digest = (uint32_t *) hash_buf->digest; + + salt_t *salt = hash_buf->salt; + + pbkdf2_sha256_t *pbkdf2_sha256 = (pbkdf2_sha256_t *) hash_buf->esalt; + + /** + * parse line + */ + + // iterations + + char *iter_pos = input_buf + 7; + + uint32_t iter = atoi (iter_pos); + + if (iter < 1) return (PARSER_SALT_ITERATION); + if (iter > 999999) return (PARSER_SALT_ITERATION); + + // first is *raw* salt + + char *salt_pos = strchr (iter_pos, ':'); + + if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); + + salt_pos++; + + char *hash_pos = strchr (salt_pos, ':'); + + if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); + + uint32_t salt_len = hash_pos - salt_pos; + + if (salt_len > 64) return (PARSER_SALT_LENGTH); + + hash_pos++; + + uint32_t hash_b64_len = input_len - (hash_pos - input_buf); + + if (hash_b64_len > 88) return (PARSER_HASH_LENGTH); + + // decode salt + + char *salt_buf_ptr = (char *) pbkdf2_sha256->salt_buf; + + salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len); + + if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH); + + salt_buf_ptr[salt_len + 3] = 0x01; + salt_buf_ptr[salt_len + 4] = 0x80; + + salt->salt_len = salt_len; + salt->salt_iter = iter - 1; + + // decode hash + + char tmp_buf[100]; + + memset (tmp_buf, 0, sizeof (tmp_buf)); + + int hash_len = base64_decode (base64_to_int, hash_pos, hash_b64_len, tmp_buf); + + if (hash_len < 16) return (PARSER_HASH_LENGTH); + + memcpy (digest, tmp_buf, 16); + + digest[0] = byte_swap_32 (digest[0]); + digest[1] = byte_swap_32 (digest[1]); + digest[2] = byte_swap_32 (digest[2]); + digest[3] = byte_swap_32 (digest[3]); + + // add some stuff to normal salt to make sorted happy + + salt->salt_buf[0] = pbkdf2_sha256->salt_buf[0]; + salt->salt_buf[1] = pbkdf2_sha256->salt_buf[1]; + salt->salt_buf[2] = pbkdf2_sha256->salt_buf[2]; + salt->salt_buf[3] = pbkdf2_sha256->salt_buf[3]; + salt->salt_buf[4] = salt->salt_iter; + + return (PARSER_OK); +} + +int prestashop_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf) +{ + if ((input_len < DISPLAY_LEN_MIN_11000) || (input_len > DISPLAY_LEN_MAX_11000)) return (PARSER_GLOBAL_LENGTH); + + uint32_t *digest = (uint32_t *) hash_buf->digest; + + salt_t *salt = hash_buf->salt; + + digest[0] = hex_to_uint (&input_buf[ 0]); + digest[1] = hex_to_uint (&input_buf[ 8]); + digest[2] = hex_to_uint (&input_buf[16]); + digest[3] = hex_to_uint (&input_buf[24]); + + digest[0] = byte_swap_32 (digest[0]); + digest[1] = byte_swap_32 (digest[1]); + digest[2] = byte_swap_32 (digest[2]); + digest[3] = byte_swap_32 (digest[3]); + + if (input_buf[32] != data.separator) return (PARSER_SEPARATOR_UNMATCHED); + + uint salt_len = input_len - 32 - 1; + + char *salt_buf = input_buf + 32 + 1; + + char *salt_buf_ptr = (char *) salt->salt_buf; + + salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len); + + if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH); + + salt->salt_len = salt_len; + + return (PARSER_OK); +} + +int postgresql_auth_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf) +{ + if ((input_len < DISPLAY_LEN_MIN_11100) || (input_len > DISPLAY_LEN_MAX_11100)) return (PARSER_GLOBAL_LENGTH); + + if (memcmp (SIGNATURE_POSTGRESQL_AUTH, input_buf, 10)) return (PARSER_SIGNATURE_UNMATCHED); + + uint32_t *digest = (uint32_t *) hash_buf->digest; + + salt_t *salt = hash_buf->salt; + + char *user_pos = input_buf + 10; + + char *salt_pos = strchr (user_pos, '*'); + + if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); + + salt_pos++; + + char *hash_pos = strchr (salt_pos, '*'); + + hash_pos++; + + uint hash_len = input_len - (hash_pos - input_buf); + + if (hash_len != 32) return (PARSER_HASH_LENGTH); + + uint user_len = salt_pos - user_pos - 1; + + uint salt_len = hash_pos - salt_pos - 1; + + if (salt_len != 8) return (PARSER_SALT_LENGTH); + + /* + * store digest + */ + + digest[0] = hex_to_uint (&hash_pos[ 0]); + digest[1] = hex_to_uint (&hash_pos[ 8]); + digest[2] = hex_to_uint (&hash_pos[16]); + digest[3] = hex_to_uint (&hash_pos[24]); + + digest[0] = byte_swap_32 (digest[0]); + digest[1] = byte_swap_32 (digest[1]); + digest[2] = byte_swap_32 (digest[2]); + digest[3] = byte_swap_32 (digest[3]); + + digest[0] -= MD5M_A; + digest[1] -= MD5M_B; + digest[2] -= MD5M_C; + digest[3] -= MD5M_D; + + /* + * store salt + */ + + char *salt_buf_ptr = (char *) salt->salt_buf; + + // first 4 bytes are the "challenge" + + salt_buf_ptr[0] = hex_to_char (&salt_pos[0]); + salt_buf_ptr[1] = hex_to_char (&salt_pos[2]); + salt_buf_ptr[2] = hex_to_char (&salt_pos[4]); + salt_buf_ptr[3] = hex_to_char (&salt_pos[6]); + + // append the user name + + user_len = parse_and_store_salt (salt_buf_ptr + 4, user_pos, user_len); + + salt->salt_len = 4 + user_len; + + return (PARSER_OK); +} + +int mysql_auth_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf) +{ + if ((input_len < DISPLAY_LEN_MIN_11200) || (input_len > DISPLAY_LEN_MAX_11200)) return (PARSER_GLOBAL_LENGTH); + + if (memcmp (SIGNATURE_MYSQL_AUTH, input_buf, 9)) return (PARSER_SIGNATURE_UNMATCHED); + + uint32_t *digest = (uint32_t *) hash_buf->digest; + + salt_t *salt = hash_buf->salt; + + char *salt_pos = input_buf + 9; + + char *hash_pos = strchr (salt_pos, '*'); + + if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); + + hash_pos++; + + uint hash_len = input_len - (hash_pos - input_buf); + + if (hash_len != 40) return (PARSER_HASH_LENGTH); + + uint salt_len = hash_pos - salt_pos - 1; + + if (salt_len != 40) return (PARSER_SALT_LENGTH); + + /* + * store digest + */ + + digest[0] = hex_to_uint (&hash_pos[ 0]); + digest[1] = hex_to_uint (&hash_pos[ 8]); + digest[2] = hex_to_uint (&hash_pos[16]); + digest[3] = hex_to_uint (&hash_pos[24]); + digest[4] = hex_to_uint (&hash_pos[32]); + + /* + * store salt + */ + + char *salt_buf_ptr = (char *) salt->salt_buf; + + salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len); + + salt->salt_len = salt_len; + + return (PARSER_OK); +} + +int bitcoin_wallet_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf) +{ + if ((input_len < DISPLAY_LEN_MIN_11300) || (input_len > DISPLAY_LEN_MAX_11300)) return (PARSER_GLOBAL_LENGTH); + + if (memcmp (SIGNATURE_BITCOIN_WALLET, input_buf, 9)) return (PARSER_SIGNATURE_UNMATCHED); + + uint32_t *digest = (uint32_t *) hash_buf->digest; + + salt_t *salt = hash_buf->salt; + + bitcoin_wallet_t *bitcoin_wallet = (bitcoin_wallet_t *) hash_buf->esalt; + + /** + * parse line + */ + + char *cry_master_len_pos = input_buf + 9; + + char *cry_master_buf_pos = strchr (cry_master_len_pos, '$'); + + if (cry_master_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); + + uint32_t cry_master_len_len = cry_master_buf_pos - cry_master_len_pos; + + cry_master_buf_pos++; + + char *cry_salt_len_pos = strchr (cry_master_buf_pos, '$'); + + if (cry_salt_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); + + uint32_t cry_master_buf_len = cry_salt_len_pos - cry_master_buf_pos; + + cry_salt_len_pos++; + + char *cry_salt_buf_pos = strchr (cry_salt_len_pos, '$'); + + if (cry_salt_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); + + uint32_t cry_salt_len_len = cry_salt_buf_pos - cry_salt_len_pos; + + cry_salt_buf_pos++; + + char *cry_rounds_pos = strchr (cry_salt_buf_pos, '$'); + + if (cry_rounds_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); + + uint32_t cry_salt_buf_len = cry_rounds_pos - cry_salt_buf_pos; + + cry_rounds_pos++; + + char *ckey_len_pos = strchr (cry_rounds_pos, '$'); + + if (ckey_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); + + uint32_t cry_rounds_len = ckey_len_pos - cry_rounds_pos; + + ckey_len_pos++; + + char *ckey_buf_pos = strchr (ckey_len_pos, '$'); + + if (ckey_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); + + uint32_t ckey_len_len = ckey_buf_pos - ckey_len_pos; + + ckey_buf_pos++; + + char *public_key_len_pos = strchr (ckey_buf_pos, '$'); + + if (public_key_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); + + uint32_t ckey_buf_len = public_key_len_pos - ckey_buf_pos; + + public_key_len_pos++; + + char *public_key_buf_pos = strchr (public_key_len_pos, '$'); + + if (public_key_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); + + uint32_t public_key_len_len = public_key_buf_pos - public_key_len_pos; + + public_key_buf_pos++; + + uint32_t public_key_buf_len = input_len - 1 - 7 - 1 - cry_master_len_len - 1 - cry_master_buf_len - 1 - cry_salt_len_len - 1 - cry_salt_buf_len - 1 - cry_rounds_len - 1 - ckey_len_len - 1 - ckey_buf_len - 1 - public_key_len_len - 1; + + const uint cry_master_len = atoi (cry_master_len_pos); + const uint cry_salt_len = atoi (cry_salt_len_pos); + const uint ckey_len = atoi (ckey_len_pos); + const uint public_key_len = atoi (public_key_len_pos); + + if (cry_master_buf_len != cry_master_len) return (PARSER_SALT_VALUE); + if (cry_salt_buf_len != cry_salt_len) return (PARSER_SALT_VALUE); + if (ckey_buf_len != ckey_len) return (PARSER_SALT_VALUE); + if (public_key_buf_len != public_key_len) return (PARSER_SALT_VALUE); + + for (uint i = 0, j = 0; i < cry_master_len; i += 1, j += 8) + { + bitcoin_wallet->cry_master_buf[i] = hex_to_uint (&cry_master_buf_pos[j]); + + bitcoin_wallet->cry_master_buf[i] = byte_swap_32 (bitcoin_wallet->cry_master_buf[i]); + } + + for (uint i = 0, j = 0; i < ckey_len; i += 1, j += 8) + { + bitcoin_wallet->ckey_buf[i] = hex_to_uint (&ckey_buf_pos[j]); + + bitcoin_wallet->ckey_buf[i] = byte_swap_32 (bitcoin_wallet->ckey_buf[i]); + } + + for (uint i = 0, j = 0; i < public_key_len; i += 1, j += 8) + { + bitcoin_wallet->public_key_buf[i] = hex_to_uint (&public_key_buf_pos[j]); + + bitcoin_wallet->public_key_buf[i] = byte_swap_32 (bitcoin_wallet->public_key_buf[i]); + } + + bitcoin_wallet->cry_master_len = cry_master_len / 2; + bitcoin_wallet->ckey_len = ckey_len / 2; + bitcoin_wallet->public_key_len = public_key_len / 2; + + /* + * store digest (should be unique enought, hopefully) + */ + + digest[0] = bitcoin_wallet->cry_master_buf[0]; + digest[1] = bitcoin_wallet->cry_master_buf[1]; + digest[2] = bitcoin_wallet->cry_master_buf[2]; + digest[3] = bitcoin_wallet->cry_master_buf[3]; + + /* + * store salt + */ + + if (cry_rounds_len >= 7) return (PARSER_SALT_VALUE); + + const uint cry_rounds = atoi (cry_rounds_pos); + + salt->salt_iter = cry_rounds - 1; + + char *salt_buf_ptr = (char *) salt->salt_buf; + + const uint salt_len = parse_and_store_salt (salt_buf_ptr, cry_salt_buf_pos, cry_salt_buf_len); + + salt->salt_len = salt_len; + + return (PARSER_OK); +} + +int sip_auth_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf) +{ + if ((input_len < DISPLAY_LEN_MIN_11400) || (input_len > DISPLAY_LEN_MAX_11400)) return (PARSER_GLOBAL_LENGTH); + + if (memcmp (SIGNATURE_SIP_AUTH, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED); + + uint32_t *digest = (uint32_t *) hash_buf->digest; + + salt_t *salt = hash_buf->salt; + + sip_t *sip = (sip_t *) hash_buf->esalt; + + // work with a temporary copy of input_buf (s.t. we can manipulate it directly) + + char temp_input_buf[input_len + 1]; + + memset (temp_input_buf, 0, sizeof (temp_input_buf)); + memcpy (temp_input_buf, input_buf, input_len); + + // URI_server: + + char *URI_server_pos = temp_input_buf + 6; + + char *URI_client_pos = strchr (URI_server_pos, '*'); + + if (URI_client_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); + + URI_client_pos[0] = 0; + URI_client_pos++; + + uint URI_server_len = strlen (URI_server_pos); + + if (URI_server_len > 512) return (PARSER_SALT_LENGTH); + + // URI_client: + + char *user_pos = strchr (URI_client_pos, '*'); + + if (user_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); + + user_pos[0] = 0; + user_pos++; + + uint URI_client_len = strlen (URI_client_pos); + + if (URI_client_len > 512) return (PARSER_SALT_LENGTH); + + // user: + + char *realm_pos = strchr (user_pos, '*'); + + if (realm_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); + + realm_pos[0] = 0; + realm_pos++; + + uint user_len = strlen (user_pos); + + if (user_len > 116) return (PARSER_SALT_LENGTH); + + // realm: + + char *method_pos = strchr (realm_pos, '*'); + + if (method_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); + + method_pos[0] = 0; + method_pos++; + + uint realm_len = strlen (realm_pos); + + if (realm_len > 116) return (PARSER_SALT_LENGTH); + + // method: + + char *URI_prefix_pos = strchr (method_pos, '*'); + + if (URI_prefix_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); + + URI_prefix_pos[0] = 0; + URI_prefix_pos++; + + uint method_len = strlen (method_pos); + + if (method_len > 246) return (PARSER_SALT_LENGTH); + + // URI_prefix: + + char *URI_resource_pos = strchr (URI_prefix_pos, '*'); + + if (URI_resource_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); + + URI_resource_pos[0] = 0; + URI_resource_pos++; + + uint URI_prefix_len = strlen (URI_prefix_pos); + + if (URI_prefix_len > 245) return (PARSER_SALT_LENGTH); + + // URI_resource: + + char *URI_suffix_pos = strchr (URI_resource_pos, '*'); + + if (URI_suffix_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); + + URI_suffix_pos[0] = 0; + URI_suffix_pos++; + + uint URI_resource_len = strlen (URI_resource_pos); + + if (URI_resource_len < 1) return (PARSER_SALT_LENGTH); + if (URI_resource_len > 246) return (PARSER_SALT_LENGTH); + + // URI_suffix: + + char *nonce_pos = strchr (URI_suffix_pos, '*'); + + if (nonce_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); + + nonce_pos[0] = 0; + nonce_pos++; + + uint URI_suffix_len = strlen (URI_suffix_pos); + + if (URI_suffix_len > 245) return (PARSER_SALT_LENGTH); + + // nonce: + + char *nonce_client_pos = strchr (nonce_pos, '*'); + + if (nonce_client_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); + + nonce_client_pos[0] = 0; + nonce_client_pos++; + + uint nonce_len = strlen (nonce_pos); + + if (nonce_len < 1) return (PARSER_SALT_LENGTH); + if (nonce_len > 50) return (PARSER_SALT_LENGTH); + + // nonce_client: + + char *nonce_count_pos = strchr (nonce_client_pos, '*'); + + if (nonce_count_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); + + nonce_count_pos[0] = 0; + nonce_count_pos++; + + uint nonce_client_len = strlen (nonce_client_pos); + + if (nonce_client_len > 50) return (PARSER_SALT_LENGTH); + + // nonce_count: + + char *qop_pos = strchr (nonce_count_pos, '*'); + + if (qop_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); + + qop_pos[0] = 0; + qop_pos++; + + uint nonce_count_len = strlen (nonce_count_pos); + + if (nonce_count_len > 50) return (PARSER_SALT_LENGTH); + + // qop: + + char *directive_pos = strchr (qop_pos, '*'); + + if (directive_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); + + directive_pos[0] = 0; + directive_pos++; + + uint qop_len = strlen (qop_pos); + + if (qop_len > 50) return (PARSER_SALT_LENGTH); + + // directive + + char *digest_pos = strchr (directive_pos, '*'); + + if (digest_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); + + digest_pos[0] = 0; + digest_pos++; + + uint directive_len = strlen (directive_pos); + + if (directive_len != 3) return (PARSER_SALT_LENGTH); + + if (memcmp (directive_pos, "MD5", 3)) + { + log_info ("ERROR: only the MD5 directive is currently supported\n"); + + return (PARSER_SIP_AUTH_DIRECTIVE); + } + + /* + * first (pre-)compute: HA2 = md5 ($method . ":" . $uri) + */ + + uint md5_len = 0; + + uint md5_max_len = 4 * 64; + + uint md5_remaining_len = md5_max_len; + + uint tmp_md5_buf[md5_max_len / 4]; + + memset (tmp_md5_buf, 0, sizeof (tmp_md5_buf)); + + char *tmp_md5_ptr = (char *) tmp_md5_buf; + + snprintf (tmp_md5_ptr, md5_remaining_len, "%s:", method_pos); + + md5_len += method_len + 1; + tmp_md5_ptr += method_len + 1; + + if (URI_prefix_len > 0) + { + md5_remaining_len = md5_max_len - md5_len; + + snprintf (tmp_md5_ptr, md5_remaining_len + 1, "%s:", URI_prefix_pos); + + md5_len += URI_prefix_len + 1; + tmp_md5_ptr += URI_prefix_len + 1; + } + + md5_remaining_len = md5_max_len - md5_len; + + snprintf (tmp_md5_ptr, md5_remaining_len + 1, "%s", URI_resource_pos); + + md5_len += URI_resource_len; + tmp_md5_ptr += URI_resource_len; + + if (URI_suffix_len > 0) + { + md5_remaining_len = md5_max_len - md5_len; + + snprintf (tmp_md5_ptr, md5_remaining_len + 1, ":%s", URI_suffix_pos); + + md5_len += 1 + URI_suffix_len; + } + + uint tmp_digest[4]; + + md5_complete_no_limit (tmp_digest, tmp_md5_buf, md5_len); + + tmp_digest[0] = byte_swap_32 (tmp_digest[0]); + tmp_digest[1] = byte_swap_32 (tmp_digest[1]); + tmp_digest[2] = byte_swap_32 (tmp_digest[2]); + tmp_digest[3] = byte_swap_32 (tmp_digest[3]); + + /* + * esalt + */ + + char *esalt_buf_ptr = (char *) sip->esalt_buf; + + uint esalt_len = 0; + + uint max_esalt_len = sizeof (sip->esalt_buf); // 151 = (64 + 64 + 55) - 32, where 32 is the hexadecimal MD5 HA1 hash + + // there are 2 possibilities for the esalt: + + if ((strcmp (qop_pos, "auth") == 0) || (strcmp (qop_pos, "auth-int") == 0)) + { + esalt_len = 1 + nonce_len + 1 + nonce_count_len + 1 + nonce_client_len + 1 + qop_len + 1 + 32; + + if (esalt_len > max_esalt_len) return (PARSER_SALT_LENGTH); + + snprintf (esalt_buf_ptr, max_esalt_len, ":%s:%s:%s:%s:%08x%08x%08x%08x", + nonce_pos, + nonce_count_pos, + nonce_client_pos, + qop_pos, + tmp_digest[0], + tmp_digest[1], + tmp_digest[2], + tmp_digest[3]); + } + else + { + esalt_len = 1 + nonce_len + 1 + 32; + + if (esalt_len > max_esalt_len) return (PARSER_SALT_LENGTH); + + snprintf (esalt_buf_ptr, max_esalt_len, ":%s:%08x%08x%08x%08x", + nonce_pos, + tmp_digest[0], + tmp_digest[1], + tmp_digest[2], + tmp_digest[3]); + } + + // add 0x80 to esalt + + esalt_buf_ptr[esalt_len] = 0x80; + + sip->esalt_len = esalt_len; + + /* + * actual salt + */ + + char *sip_salt_ptr = (char *) sip->salt_buf; + + uint salt_len = user_len + 1 + realm_len + 1; + + uint max_salt_len = 119; + + if (salt_len > max_salt_len) return (PARSER_SALT_LENGTH); + + snprintf (sip_salt_ptr, max_salt_len + 1, "%s:%s:", user_pos, realm_pos); + + sip->salt_len = salt_len; + + /* + * fake salt (for sorting) + */ + + char *salt_buf_ptr = (char *) salt->salt_buf; + + max_salt_len = 55; + + uint fake_salt_len = salt_len; + + if (fake_salt_len > max_salt_len) + { + fake_salt_len = max_salt_len; + } + + snprintf (salt_buf_ptr, max_salt_len + 1, "%s:%s:", user_pos, realm_pos); + + salt->salt_len = fake_salt_len; + + /* + * digest + */ + + digest[0] = hex_to_uint (&digest_pos[ 0]); + digest[1] = hex_to_uint (&digest_pos[ 8]); + digest[2] = hex_to_uint (&digest_pos[16]); + digest[3] = hex_to_uint (&digest_pos[24]); + + digest[0] = byte_swap_32 (digest[0]); + digest[1] = byte_swap_32 (digest[1]); + digest[2] = byte_swap_32 (digest[2]); + digest[3] = byte_swap_32 (digest[3]); + + return (PARSER_OK); +} + +int crc32_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf) +{ + if ((input_len < DISPLAY_LEN_MIN_11500) || (input_len > DISPLAY_LEN_MAX_11500)) return (PARSER_GLOBAL_LENGTH); + + if (input_buf[8] != data.separator) return (PARSER_SEPARATOR_UNMATCHED); + + uint32_t *digest = (uint32_t *) hash_buf->digest; + + salt_t *salt = hash_buf->salt; + + // digest + + char *digest_pos = input_buf; + + digest[0] = hex_to_uint (&digest_pos[0]); + digest[1] = 0; + digest[2] = 0; + digest[3] = 0; + + // salt + + char *salt_buf = input_buf + 8 + 1; + + uint salt_len = 8; + + char *salt_buf_ptr = (char *) salt->salt_buf; + + salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len); + + if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH); + + salt->salt_len = salt_len; + + return (PARSER_OK); +} + +int seven_zip_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf) +{ + if ((input_len < DISPLAY_LEN_MIN_11600) || (input_len > DISPLAY_LEN_MAX_11600)) return (PARSER_GLOBAL_LENGTH); + + if (memcmp (SIGNATURE_SEVEN_ZIP, input_buf, 4)) return (PARSER_SIGNATURE_UNMATCHED); + + uint32_t *digest = (uint32_t *) hash_buf->digest; + + salt_t *salt = hash_buf->salt; + + seven_zip_t *seven_zip = (seven_zip_t *) hash_buf->esalt; + + /** + * parse line + */ + + char *p_buf_pos = input_buf + 4; + + char *NumCyclesPower_pos = strchr (p_buf_pos, '$'); + + if (NumCyclesPower_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); + + uint32_t p_buf_len = NumCyclesPower_pos - p_buf_pos; + + NumCyclesPower_pos++; + + char *salt_len_pos = strchr (NumCyclesPower_pos, '$'); + + if (salt_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); + + uint32_t NumCyclesPower_len = salt_len_pos - NumCyclesPower_pos; + + salt_len_pos++; + + char *salt_buf_pos = strchr (salt_len_pos, '$'); + + if (salt_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); + + uint32_t salt_len_len = salt_buf_pos - salt_len_pos; + + salt_buf_pos++; + + char *iv_len_pos = strchr (salt_buf_pos, '$'); + + if (iv_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); + + uint32_t salt_buf_len = iv_len_pos - salt_buf_pos; + + iv_len_pos++; + + char *iv_buf_pos = strchr (iv_len_pos, '$'); + + if (iv_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); + + uint32_t iv_len_len = iv_buf_pos - iv_len_pos; + + iv_buf_pos++; + + char *crc_buf_pos = strchr (iv_buf_pos, '$'); + + if (crc_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); + + uint32_t iv_buf_len = crc_buf_pos - iv_buf_pos; + + crc_buf_pos++; + + char *data_len_pos = strchr (crc_buf_pos, '$'); + + if (data_len_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); + + uint32_t crc_buf_len = data_len_pos - crc_buf_pos; + + data_len_pos++; + + char *unpack_size_pos = strchr (data_len_pos, '$'); + + if (unpack_size_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); + + uint32_t data_len_len = unpack_size_pos - data_len_pos; + + unpack_size_pos++; + + char *data_buf_pos = strchr (unpack_size_pos, '$'); + + if (data_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); + + uint32_t unpack_size_len = data_buf_pos - unpack_size_pos; + + data_buf_pos++; + + uint32_t data_buf_len = input_len - 1 - 2 - 1 - p_buf_len - 1 - NumCyclesPower_len - 1 - salt_len_len - 1 - salt_buf_len - 1 - iv_len_len - 1 - iv_buf_len - 1 - crc_buf_len - 1 - data_len_len - 1 - unpack_size_len - 1; + + const uint iter = atoi (NumCyclesPower_pos); + const uint crc = atoi (crc_buf_pos); + const uint p_buf = atoi (p_buf_pos); + const uint salt_len = atoi (salt_len_pos); + const uint iv_len = atoi (iv_len_pos); + const uint unpack_size = atoi (unpack_size_pos); + const uint data_len = atoi (data_len_pos); + + /** + * verify some data + */ + + if (p_buf != 0) return (PARSER_SALT_VALUE); + if (salt_len != 0) return (PARSER_SALT_VALUE); + + if ((data_len * 2) != data_buf_len) return (PARSER_SALT_VALUE); + + if (data_len > 384) return (PARSER_SALT_VALUE); + + if (unpack_size > data_len) return (PARSER_SALT_VALUE); + + /** + * store data + */ + + seven_zip->iv_buf[0] = hex_to_uint (&iv_buf_pos[ 0]); + seven_zip->iv_buf[1] = hex_to_uint (&iv_buf_pos[ 8]); + seven_zip->iv_buf[2] = hex_to_uint (&iv_buf_pos[16]); + seven_zip->iv_buf[3] = hex_to_uint (&iv_buf_pos[24]); + + seven_zip->iv_len = iv_len; + + memcpy (seven_zip->salt_buf, salt_buf_pos, salt_buf_len); // we just need that for later ascii_digest() + + seven_zip->salt_len = 0; + + seven_zip->crc = crc; + + for (uint i = 0, j = 0; j < data_buf_len; i += 1, j += 8) + { + seven_zip->data_buf[i] = hex_to_uint (&data_buf_pos[j]); + + seven_zip->data_buf[i] = byte_swap_32 (seven_zip->data_buf[i]); + } + + seven_zip->data_len = data_len; + + seven_zip->unpack_size = unpack_size; + + // real salt + + salt->salt_buf[0] = seven_zip->data_buf[0]; + salt->salt_buf[1] = seven_zip->data_buf[1]; + salt->salt_buf[2] = seven_zip->data_buf[2]; + salt->salt_buf[3] = seven_zip->data_buf[3]; + + salt->salt_len = 16; + + salt->salt_sign[0] = iter; + + salt->salt_iter = 1 << iter; + + /** + * digest + */ + + digest[0] = crc; + digest[1] = 0; + digest[2] = 0; + digest[3] = 0; + + return (PARSER_OK); +} + +int gost2012sbog_256_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf) +{ + if ((input_len < DISPLAY_LEN_MIN_11700) || (input_len > DISPLAY_LEN_MAX_11700)) return (PARSER_GLOBAL_LENGTH); + + uint32_t *digest = (uint32_t *) hash_buf->digest; + + digest[0] = hex_to_uint (&input_buf[ 0]); + digest[1] = hex_to_uint (&input_buf[ 8]); + digest[2] = hex_to_uint (&input_buf[16]); + digest[3] = hex_to_uint (&input_buf[24]); + digest[4] = hex_to_uint (&input_buf[32]); + digest[5] = hex_to_uint (&input_buf[40]); + digest[6] = hex_to_uint (&input_buf[48]); + digest[7] = hex_to_uint (&input_buf[56]); + + digest[0] = byte_swap_32 (digest[0]); + digest[1] = byte_swap_32 (digest[1]); + digest[2] = byte_swap_32 (digest[2]); + digest[3] = byte_swap_32 (digest[3]); + digest[4] = byte_swap_32 (digest[4]); + digest[5] = byte_swap_32 (digest[5]); + digest[6] = byte_swap_32 (digest[6]); + digest[7] = byte_swap_32 (digest[7]); + + return (PARSER_OK); +} + +int gost2012sbog_512_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf) +{ + if ((input_len < DISPLAY_LEN_MIN_11800) || (input_len > DISPLAY_LEN_MAX_11800)) return (PARSER_GLOBAL_LENGTH); + + uint32_t *digest = (uint32_t *) hash_buf->digest; + + digest[ 0] = hex_to_uint (&input_buf[ 0]); + digest[ 1] = hex_to_uint (&input_buf[ 8]); + digest[ 2] = hex_to_uint (&input_buf[ 16]); + digest[ 3] = hex_to_uint (&input_buf[ 24]); + digest[ 4] = hex_to_uint (&input_buf[ 32]); + digest[ 5] = hex_to_uint (&input_buf[ 40]); + digest[ 6] = hex_to_uint (&input_buf[ 48]); + digest[ 7] = hex_to_uint (&input_buf[ 56]); + digest[ 8] = hex_to_uint (&input_buf[ 64]); + digest[ 9] = hex_to_uint (&input_buf[ 72]); + digest[10] = hex_to_uint (&input_buf[ 80]); + digest[11] = hex_to_uint (&input_buf[ 88]); + digest[12] = hex_to_uint (&input_buf[ 96]); + digest[13] = hex_to_uint (&input_buf[104]); + digest[14] = hex_to_uint (&input_buf[112]); + digest[15] = hex_to_uint (&input_buf[120]); + + digest[ 0] = byte_swap_32 (digest[ 0]); + digest[ 1] = byte_swap_32 (digest[ 1]); + digest[ 2] = byte_swap_32 (digest[ 2]); + digest[ 3] = byte_swap_32 (digest[ 3]); + digest[ 4] = byte_swap_32 (digest[ 4]); + digest[ 5] = byte_swap_32 (digest[ 5]); + digest[ 6] = byte_swap_32 (digest[ 6]); + digest[ 7] = byte_swap_32 (digest[ 7]); + digest[ 8] = byte_swap_32 (digest[ 8]); + digest[ 9] = byte_swap_32 (digest[ 9]); + digest[10] = byte_swap_32 (digest[10]); + digest[11] = byte_swap_32 (digest[11]); + digest[12] = byte_swap_32 (digest[12]); + digest[13] = byte_swap_32 (digest[13]); + digest[14] = byte_swap_32 (digest[14]); + digest[15] = byte_swap_32 (digest[15]); + + return (PARSER_OK); +} + +int pbkdf2_md5_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf) +{ + if ((input_len < DISPLAY_LEN_MIN_11900) || (input_len > DISPLAY_LEN_MAX_11900)) return (PARSER_GLOBAL_LENGTH); + + if (memcmp (SIGNATURE_PBKDF2_MD5, input_buf, 4)) return (PARSER_SIGNATURE_UNMATCHED); + + uint32_t *digest = (uint32_t *) hash_buf->digest; + + salt_t *salt = hash_buf->salt; + + pbkdf2_md5_t *pbkdf2_md5 = (pbkdf2_md5_t *) hash_buf->esalt; + + /** + * parse line + */ + + // iterations + + char *iter_pos = input_buf + 4; + + uint32_t iter = atoi (iter_pos); + + if (iter < 1) return (PARSER_SALT_ITERATION); + if (iter > 999999) return (PARSER_SALT_ITERATION); + + // first is *raw* salt + + char *salt_pos = strchr (iter_pos, ':'); + + if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); + + salt_pos++; + + char *hash_pos = strchr (salt_pos, ':'); + + if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); + + uint32_t salt_len = hash_pos - salt_pos; + + if (salt_len > 64) return (PARSER_SALT_LENGTH); + + hash_pos++; + + uint32_t hash_b64_len = input_len - (hash_pos - input_buf); + + if (hash_b64_len > 88) return (PARSER_HASH_LENGTH); + + // decode salt + + char *salt_buf_ptr = (char *) pbkdf2_md5->salt_buf; + + salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len); + + if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH); + + salt_buf_ptr[salt_len + 3] = 0x01; + salt_buf_ptr[salt_len + 4] = 0x80; + + salt->salt_len = salt_len; + salt->salt_iter = iter - 1; + + // decode hash + + char tmp_buf[100]; + + memset (tmp_buf, 0, sizeof (tmp_buf)); + + int hash_len = base64_decode (base64_to_int, hash_pos, hash_b64_len, tmp_buf); + + if (hash_len < 16) return (PARSER_HASH_LENGTH); + + memcpy (digest, tmp_buf, 16); + + // add some stuff to normal salt to make sorted happy + + salt->salt_buf[0] = pbkdf2_md5->salt_buf[0]; + salt->salt_buf[1] = pbkdf2_md5->salt_buf[1]; + salt->salt_buf[2] = pbkdf2_md5->salt_buf[2]; + salt->salt_buf[3] = pbkdf2_md5->salt_buf[3]; + salt->salt_buf[4] = salt->salt_iter; + + return (PARSER_OK); +} + +int pbkdf2_sha1_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf) +{ + if ((input_len < DISPLAY_LEN_MIN_12000) || (input_len > DISPLAY_LEN_MAX_12000)) return (PARSER_GLOBAL_LENGTH); + + if (memcmp (SIGNATURE_PBKDF2_SHA1, input_buf, 5)) return (PARSER_SIGNATURE_UNMATCHED); + + uint32_t *digest = (uint32_t *) hash_buf->digest; + + salt_t *salt = hash_buf->salt; + + pbkdf2_sha1_t *pbkdf2_sha1 = (pbkdf2_sha1_t *) hash_buf->esalt; + + /** + * parse line + */ + + // iterations + + char *iter_pos = input_buf + 5; + + uint32_t iter = atoi (iter_pos); + + if (iter < 1) return (PARSER_SALT_ITERATION); + if (iter > 999999) return (PARSER_SALT_ITERATION); + + // first is *raw* salt + + char *salt_pos = strchr (iter_pos, ':'); + + if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); + + salt_pos++; + + char *hash_pos = strchr (salt_pos, ':'); + + if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); + + uint32_t salt_len = hash_pos - salt_pos; + + if (salt_len > 64) return (PARSER_SALT_LENGTH); + + hash_pos++; + + uint32_t hash_b64_len = input_len - (hash_pos - input_buf); + + if (hash_b64_len > 88) return (PARSER_HASH_LENGTH); + + // decode salt + + char *salt_buf_ptr = (char *) pbkdf2_sha1->salt_buf; + + salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len); + + if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH); + + salt_buf_ptr[salt_len + 3] = 0x01; + salt_buf_ptr[salt_len + 4] = 0x80; + + salt->salt_len = salt_len; + salt->salt_iter = iter - 1; + + // decode hash + + char tmp_buf[100]; + + memset (tmp_buf, 0, sizeof (tmp_buf)); + + int hash_len = base64_decode (base64_to_int, hash_pos, hash_b64_len, tmp_buf); + + if (hash_len < 16) return (PARSER_HASH_LENGTH); + + memcpy (digest, tmp_buf, 16); + + digest[0] = byte_swap_32 (digest[0]); + digest[1] = byte_swap_32 (digest[1]); + digest[2] = byte_swap_32 (digest[2]); + digest[3] = byte_swap_32 (digest[3]); + + // add some stuff to normal salt to make sorted happy + + salt->salt_buf[0] = pbkdf2_sha1->salt_buf[0]; + salt->salt_buf[1] = pbkdf2_sha1->salt_buf[1]; + salt->salt_buf[2] = pbkdf2_sha1->salt_buf[2]; + salt->salt_buf[3] = pbkdf2_sha1->salt_buf[3]; + salt->salt_buf[4] = salt->salt_iter; + + return (PARSER_OK); +} + +int pbkdf2_sha512_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf) +{ + if ((input_len < DISPLAY_LEN_MIN_12100) || (input_len > DISPLAY_LEN_MAX_12100)) return (PARSER_GLOBAL_LENGTH); + + if (memcmp (SIGNATURE_PBKDF2_SHA512, input_buf, 7)) return (PARSER_SIGNATURE_UNMATCHED); + + uint64_t *digest = (uint64_t *) hash_buf->digest; + + salt_t *salt = hash_buf->salt; + + pbkdf2_sha512_t *pbkdf2_sha512 = (pbkdf2_sha512_t *) hash_buf->esalt; + + /** + * parse line + */ + + // iterations + + char *iter_pos = input_buf + 7; + + uint32_t iter = atoi (iter_pos); + + if (iter < 1) return (PARSER_SALT_ITERATION); + if (iter > 999999) return (PARSER_SALT_ITERATION); + + // first is *raw* salt + + char *salt_pos = strchr (iter_pos, ':'); + + if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); + + salt_pos++; + + char *hash_pos = strchr (salt_pos, ':'); + + if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); + + uint32_t salt_len = hash_pos - salt_pos; + + if (salt_len > 64) return (PARSER_SALT_LENGTH); + + hash_pos++; + + uint32_t hash_b64_len = input_len - (hash_pos - input_buf); + + if (hash_b64_len > 88) return (PARSER_HASH_LENGTH); + + // decode salt + + char *salt_buf_ptr = (char *) pbkdf2_sha512->salt_buf; + + salt_len = parse_and_store_salt (salt_buf_ptr, salt_pos, salt_len); + + if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH); + + salt_buf_ptr[salt_len + 3] = 0x01; + salt_buf_ptr[salt_len + 4] = 0x80; + + salt->salt_len = salt_len; + salt->salt_iter = iter - 1; + + // decode hash + + char tmp_buf[100]; + + memset (tmp_buf, 0, sizeof (tmp_buf)); + + int hash_len = base64_decode (base64_to_int, hash_pos, hash_b64_len, tmp_buf); + + if (hash_len < 16) return (PARSER_HASH_LENGTH); + + memcpy (digest, tmp_buf, 64); + + digest[0] = byte_swap_64 (digest[0]); + digest[1] = byte_swap_64 (digest[1]); + digest[2] = byte_swap_64 (digest[2]); + digest[3] = byte_swap_64 (digest[3]); + digest[4] = byte_swap_64 (digest[4]); + digest[5] = byte_swap_64 (digest[5]); + digest[6] = byte_swap_64 (digest[6]); + digest[7] = byte_swap_64 (digest[7]); + + // add some stuff to normal salt to make sorted happy + + salt->salt_buf[0] = pbkdf2_sha512->salt_buf[0]; + salt->salt_buf[1] = pbkdf2_sha512->salt_buf[1]; + salt->salt_buf[2] = pbkdf2_sha512->salt_buf[2]; + salt->salt_buf[3] = pbkdf2_sha512->salt_buf[3]; + salt->salt_buf[4] = salt->salt_iter; + + return (PARSER_OK); +} + +int ecryptfs_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf) +{ + if ((input_len < DISPLAY_LEN_MIN_12200) || (input_len > DISPLAY_LEN_MAX_12200)) return (PARSER_GLOBAL_LENGTH); + + if (memcmp (SIGNATURE_ECRYPTFS, input_buf, 10)) return (PARSER_SIGNATURE_UNMATCHED); + + uint *digest = (uint *) hash_buf->digest; + + salt_t *salt = hash_buf->salt; + + /** + * parse line + */ + + char *salt_pos = input_buf + 10 + 2 + 2; // skip over "0$" and "1$" + + char *hash_pos = strchr (salt_pos, '$'); + + if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); + + uint32_t salt_len = hash_pos - salt_pos; + + if (salt_len != 16) return (PARSER_SALT_LENGTH); + + hash_pos++; + + uint32_t hash_len = input_len - 10 - 2 - 2 - salt_len - 1; + + if (hash_len != 16) return (PARSER_HASH_LENGTH); + + // decode hash + + digest[ 0] = hex_to_uint (&hash_pos[0]); + digest[ 1] = hex_to_uint (&hash_pos[8]); + digest[ 2] = 0; + digest[ 3] = 0; + digest[ 4] = 0; + digest[ 5] = 0; + digest[ 6] = 0; + digest[ 7] = 0; + digest[ 8] = 0; + digest[ 9] = 0; + digest[10] = 0; + digest[11] = 0; + digest[12] = 0; + digest[13] = 0; + digest[14] = 0; + digest[15] = 0; + + // decode salt + + salt->salt_buf[0] = hex_to_uint (&salt_pos[0]); + salt->salt_buf[1] = hex_to_uint (&salt_pos[8]); + + salt->salt_iter = ROUNDS_ECRYPTFS; + salt->salt_len = 8; + + return (PARSER_OK); +} + +int bsdicrypt_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf) +{ + if ((input_len < DISPLAY_LEN_MIN_12400) || (input_len > DISPLAY_LEN_MAX_12400)) return (PARSER_GLOBAL_LENGTH); + + if (memcmp (SIGNATURE_BSDICRYPT, input_buf, 1)) return (PARSER_SIGNATURE_UNMATCHED); + + unsigned char c19 = itoa64_to_int (input_buf[19]); + + if (c19 & 3) return (PARSER_HASH_VALUE); + + salt_t *salt = hash_buf->salt; + + uint32_t *digest = (uint32_t *) hash_buf->digest; + + // iteration count + + salt->salt_iter = itoa64_to_int (input_buf[1]) + | itoa64_to_int (input_buf[2]) << 6 + | itoa64_to_int (input_buf[3]) << 12 + | itoa64_to_int (input_buf[4]) << 18; + + // set salt + + salt->salt_buf[0] = itoa64_to_int (input_buf[5]) + | itoa64_to_int (input_buf[6]) << 6 + | itoa64_to_int (input_buf[7]) << 12 + | itoa64_to_int (input_buf[8]) << 18; + + salt->salt_len = 4; + + char tmp_buf[100]; + + memset (tmp_buf, 0, sizeof (tmp_buf)); + + base64_decode (itoa64_to_int, input_buf + 9, 11, tmp_buf); + + memcpy (digest, tmp_buf, 8); + + uint tt; + + IP (digest[0], digest[1], tt); + + digest[0] = ROTATE_RIGHT (digest[0], 31); + digest[1] = ROTATE_RIGHT (digest[1], 31); + digest[2] = 0; + digest[3] = 0; + + return (PARSER_OK); +} + +int rar3hp_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf) +{ + if ((input_len < DISPLAY_LEN_MIN_12500) || (input_len > DISPLAY_LEN_MAX_12500)) return (PARSER_GLOBAL_LENGTH); + + if (memcmp (SIGNATURE_RAR3, input_buf, 6)) return (PARSER_SIGNATURE_UNMATCHED); + + uint32_t *digest = (uint32_t *) hash_buf->digest; + + salt_t *salt = hash_buf->salt; + + /** + * parse line + */ + + char *type_pos = input_buf + 6 + 1; + + char *salt_pos = strchr (type_pos, '*'); + + if (salt_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); + + uint32_t type_len = salt_pos - type_pos; + + if (type_len != 1) return (PARSER_SALT_LENGTH); + + salt_pos++; + + char *crypted_pos = strchr (salt_pos, '*'); + + if (crypted_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); + + uint32_t salt_len = crypted_pos - salt_pos; + + if (salt_len != 16) return (PARSER_SALT_LENGTH); + + crypted_pos++; + + uint32_t crypted_len = input_len - 6 - 1 - type_len - 1 - salt_len - 1; + + if (crypted_len != 32) return (PARSER_SALT_LENGTH); + + /** + * copy data + */ + + salt->salt_buf[0] = hex_to_uint (&salt_pos[0]); + salt->salt_buf[1] = hex_to_uint (&salt_pos[8]); + + salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]); + salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]); + + salt->salt_buf[2] = hex_to_uint (&crypted_pos[ 0]); + salt->salt_buf[3] = hex_to_uint (&crypted_pos[ 8]); + salt->salt_buf[4] = hex_to_uint (&crypted_pos[16]); + salt->salt_buf[5] = hex_to_uint (&crypted_pos[24]); + + salt->salt_len = 24; + salt->salt_iter = ROUNDS_RAR3; + + // there's no hash for rar3. the data which is in crypted_pos is some encrypted data and + // if it matches the value \xc4\x3d\x7b\x00\x40\x07\x00 after decrypt we know that we successfully cracked it. + + digest[0] = 0xc43d7b00; + digest[1] = 0x40070000; + digest[2] = 0; + digest[3] = 0; + + return (PARSER_OK); +} + +int cf10_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf) +{ + if ((input_len < DISPLAY_LEN_MIN_12600) || (input_len > DISPLAY_LEN_MAX_12600)) return (PARSER_GLOBAL_LENGTH); + + uint32_t *digest = (uint32_t *) hash_buf->digest; + + salt_t *salt = hash_buf->salt; + + digest[0] = hex_to_uint (&input_buf[ 0]); + digest[1] = hex_to_uint (&input_buf[ 8]); + digest[2] = hex_to_uint (&input_buf[16]); + digest[3] = hex_to_uint (&input_buf[24]); + digest[4] = hex_to_uint (&input_buf[32]); + digest[5] = hex_to_uint (&input_buf[40]); + digest[6] = hex_to_uint (&input_buf[48]); + digest[7] = hex_to_uint (&input_buf[56]); + + if (input_buf[64] != data.separator) return (PARSER_SEPARATOR_UNMATCHED); + + uint salt_len = input_len - 64 - 1; + + char *salt_buf = input_buf + 64 + 1; + + char *salt_buf_ptr = (char *) salt->salt_buf; + + salt_len = parse_and_store_salt (salt_buf_ptr, salt_buf, salt_len); + + if (salt_len == UINT_MAX) return (PARSER_SALT_LENGTH); + + salt->salt_len = salt_len; + + /** + * we can precompute the first sha256 transform + */ + + uint w[16]; + + w[ 0] = byte_swap_32 (salt->salt_buf[ 0]); + w[ 1] = byte_swap_32 (salt->salt_buf[ 1]); + w[ 2] = byte_swap_32 (salt->salt_buf[ 2]); + w[ 3] = byte_swap_32 (salt->salt_buf[ 3]); + w[ 4] = byte_swap_32 (salt->salt_buf[ 4]); + w[ 5] = byte_swap_32 (salt->salt_buf[ 5]); + w[ 6] = byte_swap_32 (salt->salt_buf[ 6]); + w[ 7] = byte_swap_32 (salt->salt_buf[ 7]); + w[ 8] = byte_swap_32 (salt->salt_buf[ 8]); + w[ 9] = byte_swap_32 (salt->salt_buf[ 9]); + w[10] = byte_swap_32 (salt->salt_buf[10]); + w[11] = byte_swap_32 (salt->salt_buf[11]); + w[12] = byte_swap_32 (salt->salt_buf[12]); + w[13] = byte_swap_32 (salt->salt_buf[13]); + w[14] = byte_swap_32 (salt->salt_buf[14]); + w[15] = byte_swap_32 (salt->salt_buf[15]); + + uint pc256[8]; + + pc256[0] = SHA256M_A; + pc256[1] = SHA256M_B; + pc256[2] = SHA256M_C; + pc256[3] = SHA256M_D; + pc256[4] = SHA256M_E; + pc256[5] = SHA256M_F; + pc256[6] = SHA256M_G; + pc256[7] = SHA256M_H; + + sha256_64 (w, pc256); + + salt->salt_buf_pc[0] = pc256[0]; + salt->salt_buf_pc[1] = pc256[1]; + salt->salt_buf_pc[2] = pc256[2]; + salt->salt_buf_pc[3] = pc256[3]; + salt->salt_buf_pc[4] = pc256[4]; + salt->salt_buf_pc[5] = pc256[5]; + salt->salt_buf_pc[6] = pc256[6]; + salt->salt_buf_pc[7] = pc256[7]; + + digest[0] -= pc256[0]; + digest[1] -= pc256[1]; + digest[2] -= pc256[2]; + digest[3] -= pc256[3]; + digest[4] -= pc256[4]; + digest[5] -= pc256[5]; + digest[6] -= pc256[6]; + digest[7] -= pc256[7]; + + return (PARSER_OK); +} + +int mywallet_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf) +{ + if ((input_len < DISPLAY_LEN_MIN_12700) || (input_len > DISPLAY_LEN_MAX_12700)) return (PARSER_GLOBAL_LENGTH); + + if (memcmp (SIGNATURE_MYWALLET, input_buf, 12)) return (PARSER_SIGNATURE_UNMATCHED); + + uint32_t *digest = (uint32_t *) hash_buf->digest; + + salt_t *salt = hash_buf->salt; + + /** + * parse line + */ + + char *data_len_pos = input_buf + 1 + 10 + 1; + + char *data_buf_pos = strchr (data_len_pos, '$'); + + if (data_buf_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); + + uint32_t data_len_len = data_buf_pos - data_len_pos; + + if (data_len_len < 1) return (PARSER_SALT_LENGTH); + if (data_len_len > 5) return (PARSER_SALT_LENGTH); + + data_buf_pos++; + + uint32_t data_buf_len = input_len - 1 - 10 - 1 - data_len_len - 1; + + if (data_buf_len < 64) return (PARSER_HASH_LENGTH); + + if (data_buf_len % 16) return (PARSER_HASH_LENGTH); + + uint32_t data_len = atoi (data_len_pos); + + if ((data_len * 2) != data_buf_len) return (PARSER_HASH_LENGTH); + + /** + * salt + */ + + char *salt_pos = data_buf_pos; + + salt->salt_buf[0] = hex_to_uint (&salt_pos[ 0]); + salt->salt_buf[1] = hex_to_uint (&salt_pos[ 8]); + salt->salt_buf[2] = hex_to_uint (&salt_pos[16]); + salt->salt_buf[3] = hex_to_uint (&salt_pos[24]); + + // this is actually the CT, which is also the hash later (if matched) + + salt->salt_buf[4] = hex_to_uint (&salt_pos[32]); + salt->salt_buf[5] = hex_to_uint (&salt_pos[40]); + salt->salt_buf[6] = hex_to_uint (&salt_pos[48]); + salt->salt_buf[7] = hex_to_uint (&salt_pos[56]); + + salt->salt_len = 32; // note we need to fix this to 16 in kernel + + salt->salt_iter = 10 - 1; + + /** + * digest buf + */ + + digest[0] = salt->salt_buf[4]; + digest[1] = salt->salt_buf[5]; + digest[2] = salt->salt_buf[6]; + digest[3] = salt->salt_buf[7]; + + return (PARSER_OK); +} + +int ms_drsr_parse_hash (char *input_buf, uint input_len, hash_t *hash_buf) +{ + if ((input_len < DISPLAY_LEN_MIN_12800) || (input_len > DISPLAY_LEN_MAX_12800)) return (PARSER_GLOBAL_LENGTH); + + if (memcmp (SIGNATURE_MS_DRSR, input_buf, 11)) return (PARSER_SIGNATURE_UNMATCHED); + + uint32_t *digest = (uint32_t *) hash_buf->digest; + + salt_t *salt = hash_buf->salt; + + /** + * parse line + */ + + char *salt_pos = input_buf + 11 + 1; + + char *iter_pos = strchr (salt_pos, ','); + + if (iter_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); + + uint32_t salt_len = iter_pos - salt_pos; + + if (salt_len != 20) return (PARSER_SALT_LENGTH); + + iter_pos++; + + char *hash_pos = strchr (iter_pos, ','); + + if (hash_pos == NULL) return (PARSER_SEPARATOR_UNMATCHED); + + uint32_t iter_len = hash_pos - iter_pos; + + if (iter_len > 5) return (PARSER_SALT_LENGTH); + + hash_pos++; + + uint32_t hash_len = input_len - 11 - 1 - salt_len - 1 - iter_len - 1; + + if (hash_len != 64) return (PARSER_HASH_LENGTH); + + /** + * salt + */ + + salt->salt_buf[0] = hex_to_uint (&salt_pos[ 0]); + salt->salt_buf[1] = hex_to_uint (&salt_pos[ 8]); + salt->salt_buf[2] = hex_to_uint (&salt_pos[16]) & 0xffff0000; + salt->salt_buf[3] = 0x00018000; + + salt->salt_buf[0] = byte_swap_32 (salt->salt_buf[0]); + salt->salt_buf[1] = byte_swap_32 (salt->salt_buf[1]); + salt->salt_buf[2] = byte_swap_32 (salt->salt_buf[2]); + salt->salt_buf[3] = byte_swap_32 (salt->salt_buf[3]); + + salt->salt_len = salt_len / 2; + + salt->salt_iter = atoi (iter_pos) - 1; + + /** + * digest buf + */ + + digest[0] = hex_to_uint (&hash_pos[ 0]); + digest[1] = hex_to_uint (&hash_pos[ 8]); + digest[2] = hex_to_uint (&hash_pos[16]); + digest[3] = hex_to_uint (&hash_pos[24]); + digest[4] = hex_to_uint (&hash_pos[32]); + digest[5] = hex_to_uint (&hash_pos[40]); + digest[6] = hex_to_uint (&hash_pos[48]); + digest[7] = hex_to_uint (&hash_pos[56]); + + return (PARSER_OK); +} + +/** + * parallel running threads + */ + +#ifdef WIN + +BOOL WINAPI sigHandler_default (DWORD sig) +{ + switch (sig) + { + case CTRL_CLOSE_EVENT: + + /* + * special case see: https://stackoverflow.com/questions/3640633/c-setconsolectrlhandler-routine-issue/5610042#5610042 + * if the user interacts w/ the user-interface (GUI/cmd), we need to do the finalization job within this signal handler + * function otherwise it is to late (e.g. after returning from this function) + */ + + myabort (); + + SetConsoleCtrlHandler (NULL, TRUE); + + hc_sleep (10); + + return TRUE; + + case CTRL_C_EVENT: + case CTRL_LOGOFF_EVENT: + case CTRL_SHUTDOWN_EVENT: + + myabort (); + + SetConsoleCtrlHandler (NULL, TRUE); + + return TRUE; + } + + return FALSE; +} + +BOOL WINAPI sigHandler_benchmark (DWORD sig) +{ + switch (sig) + { + case CTRL_CLOSE_EVENT: + + myabort (); + + SetConsoleCtrlHandler (NULL, TRUE); + + hc_sleep (10); + + return TRUE; + + case CTRL_C_EVENT: + case CTRL_LOGOFF_EVENT: + case CTRL_SHUTDOWN_EVENT: + + myquit (); + + SetConsoleCtrlHandler (NULL, TRUE); + + return TRUE; + } + + return FALSE; +} + +void hc_signal (BOOL WINAPI (callback) (DWORD)) +{ + if (callback == NULL) + { + SetConsoleCtrlHandler ((PHANDLER_ROUTINE) callback, FALSE); + } + else + { + SetConsoleCtrlHandler ((PHANDLER_ROUTINE) callback, TRUE); + } +} + +#else + +void sigHandler_default (int sig) +{ + myabort (); + + signal (sig, NULL); +} + +void sigHandler_benchmark (int sig) +{ + myquit (); + + signal (sig, NULL); +} + +void hc_signal (void (callback) (int)) +{ + if (callback == NULL) callback = SIG_DFL; + + signal (SIGINT, callback); + signal (SIGTERM, callback); + signal (SIGABRT, callback); +} + +#endif + +void status_display (); + +void *thread_keypress (void *p) +{ + int benchmark = *((int *) p); + + uint quiet = data.quiet; + + tty_break(); + + while ((data.devices_status != STATUS_EXHAUSTED) && (data.devices_status != STATUS_CRACKED) && (data.devices_status != STATUS_ABORTED) && (data.devices_status != STATUS_QUIT)) + { + int ch = tty_getchar(); + + if (ch == -1) break; + + if (ch == 0) continue; + + #ifdef _POSIX + if (ch != '\n') + #endif + + hc_thread_mutex_lock (mux_display); + + log_info (""); + + switch (ch) + { + case 's': + case '\n': + + log_info (""); + + status_display (); + + log_info (""); + + if (quiet == 0) fprintf (stdout, "%s", PROMPT); + if (quiet == 0) fflush (stdout); + + break; + + case 'b': + + log_info (""); + + bypass (); + + log_info (""); + + if (quiet == 0) fprintf (stdout, "%s", PROMPT); + if (quiet == 0) fflush (stdout); + + break; + + case 'p': + + log_info (""); + + SuspendThreads (); + + log_info (""); + + if (quiet == 0) fprintf (stdout, "%s", PROMPT); + if (quiet == 0) fflush (stdout); + + break; + + case 'r': + + log_info (""); + + ResumeThreads (); + + log_info (""); + + if (quiet == 0) fprintf (stdout, "%s", PROMPT); + if (quiet == 0) fflush (stdout); + + break; + + case 'q': + + log_info (""); + + if (benchmark == 1) + { + myquit (); + } + else + { + myabort (); + } + + break; + } + + hc_thread_mutex_unlock (mux_display); + } + + tty_fix(); + + return (p); +} + +/** + * rules common + */ + +bool class_num (char c) +{ + return ((c >= '0') && (c <= '9')); +} + +bool class_lower (char c) +{ + return ((c >= 'a') && (c <= 'z')); +} + +bool class_upper (char c) +{ + return ((c >= 'A') && (c <= 'Z')); +} + +bool class_alpha (char c) +{ + return (class_lower (c) || class_upper (c)); +} + +char conv_ctoi (char c) +{ + if (class_num (c)) + { + return c - '0'; + } + else if (class_upper (c)) + { + return c - 'A' + (char) 10; + } + + return (char) (-1); +} + +char conv_itoc (char c) +{ + if (c < 10) + { + return c + '0'; + } + else if (c < 37) + { + return c + 'A' - (char) 10; + } + + return (char) (-1); +} + +/** + * GPU rules + */ + +#define INCR_POS if (++rule_pos == rule_len) return (-1) +#define SET_NAME(rule,val) (rule)->cmds[rule_cnt] = ((val) & 0xff) << 0 +#define SET_P0(rule,val) INCR_POS; (rule)->cmds[rule_cnt] |= ((val) & 0xff) << 8 +#define SET_P1(rule,val) INCR_POS; (rule)->cmds[rule_cnt] |= ((val) & 0xff) << 16 +#define MAX_GPU_RULES 14 +#define GET_NAME(rule) rule_cmd = (((rule)->cmds[rule_cnt] >> 0) & 0xff) +#define GET_P0(rule) INCR_POS; rule_buf[rule_pos] = (((rule)->cmds[rule_cnt] >> 8) & 0xff) +#define GET_P1(rule) INCR_POS; rule_buf[rule_pos] = (((rule)->cmds[rule_cnt] >> 16) & 0xff) + +#define SET_P0_CONV(rule,val) INCR_POS; (rule)->cmds[rule_cnt] |= ((conv_ctoi (val)) & 0xff) << 8 +#define SET_P1_CONV(rule,val) INCR_POS; (rule)->cmds[rule_cnt] |= ((conv_ctoi (val)) & 0xff) << 16 +#define GET_P0_CONV(rule) INCR_POS; rule_buf[rule_pos] = conv_itoc (((rule)->cmds[rule_cnt] >> 8) & 0xff) +#define GET_P1_CONV(rule) INCR_POS; rule_buf[rule_pos] = conv_itoc (((rule)->cmds[rule_cnt] >> 16) & 0xff) + +int cpu_rule_to_gpu_rule (char rule_buf[BUFSIZ], uint rule_len, gpu_rule_t *rule) +{ + uint rule_pos; + uint rule_cnt; + + for (rule_pos = 0, rule_cnt = 0; rule_pos < rule_len && rule_cnt < MAX_GPU_RULES; rule_pos++, rule_cnt++) + { + switch (rule_buf[rule_pos]) + { + case ' ': + rule_cnt--; + break; + + case RULE_OP_MANGLE_NOOP: + SET_NAME (rule, rule_buf[rule_pos]); + break; + + case RULE_OP_MANGLE_LREST: + SET_NAME (rule, rule_buf[rule_pos]); + break; + + case RULE_OP_MANGLE_UREST: + SET_NAME (rule, rule_buf[rule_pos]); + break; + + case RULE_OP_MANGLE_LREST_UFIRST: + SET_NAME (rule, rule_buf[rule_pos]); + break; + + case RULE_OP_MANGLE_UREST_LFIRST: + SET_NAME (rule, rule_buf[rule_pos]); + break; + + case RULE_OP_MANGLE_TREST: + SET_NAME (rule, rule_buf[rule_pos]); + break; + + case RULE_OP_MANGLE_TOGGLE_AT: + SET_NAME (rule, rule_buf[rule_pos]); + SET_P0_CONV (rule, rule_buf[rule_pos]); + break; + + case RULE_OP_MANGLE_REVERSE: + SET_NAME (rule, rule_buf[rule_pos]); + break; + + case RULE_OP_MANGLE_DUPEWORD: + SET_NAME (rule, rule_buf[rule_pos]); + break; + + case RULE_OP_MANGLE_DUPEWORD_TIMES: + SET_NAME (rule, rule_buf[rule_pos]); + SET_P0_CONV (rule, rule_buf[rule_pos]); + break; + + case RULE_OP_MANGLE_REFLECT: + SET_NAME (rule, rule_buf[rule_pos]); + break; + + case RULE_OP_MANGLE_ROTATE_LEFT: + SET_NAME (rule, rule_buf[rule_pos]); + break; + + case RULE_OP_MANGLE_ROTATE_RIGHT: + SET_NAME (rule, rule_buf[rule_pos]); + break; + + case RULE_OP_MANGLE_APPEND: + SET_NAME (rule, rule_buf[rule_pos]); + SET_P0 (rule, rule_buf[rule_pos]); + break; + + case RULE_OP_MANGLE_PREPEND: + SET_NAME (rule, rule_buf[rule_pos]); + SET_P0 (rule, rule_buf[rule_pos]); + break; + + case RULE_OP_MANGLE_DELETE_FIRST: + SET_NAME (rule, rule_buf[rule_pos]); + break; + + case RULE_OP_MANGLE_DELETE_LAST: + SET_NAME (rule, rule_buf[rule_pos]); + break; + + case RULE_OP_MANGLE_DELETE_AT: + SET_NAME (rule, rule_buf[rule_pos]); + SET_P0_CONV (rule, rule_buf[rule_pos]); + break; + + case RULE_OP_MANGLE_EXTRACT: + SET_NAME (rule, rule_buf[rule_pos]); + SET_P0_CONV (rule, rule_buf[rule_pos]); + SET_P1_CONV (rule, rule_buf[rule_pos]); + break; + + case RULE_OP_MANGLE_OMIT: + SET_NAME (rule, rule_buf[rule_pos]); + SET_P0_CONV (rule, rule_buf[rule_pos]); + SET_P1_CONV (rule, rule_buf[rule_pos]); + break; + + case RULE_OP_MANGLE_INSERT: + SET_NAME (rule, rule_buf[rule_pos]); + SET_P0_CONV (rule, rule_buf[rule_pos]); + SET_P1 (rule, rule_buf[rule_pos]); + break; + + case RULE_OP_MANGLE_OVERSTRIKE: + SET_NAME (rule, rule_buf[rule_pos]); + SET_P0_CONV (rule, rule_buf[rule_pos]); + SET_P1 (rule, rule_buf[rule_pos]); + break; + + case RULE_OP_MANGLE_TRUNCATE_AT: + SET_NAME (rule, rule_buf[rule_pos]); + SET_P0_CONV (rule, rule_buf[rule_pos]); + break; + + case RULE_OP_MANGLE_REPLACE: + SET_NAME (rule, rule_buf[rule_pos]); + SET_P0 (rule, rule_buf[rule_pos]); + SET_P1 (rule, rule_buf[rule_pos]); + break; + + case RULE_OP_MANGLE_PURGECHAR: + return (-1); + break; + + case RULE_OP_MANGLE_TOGGLECASE_REC: + return (-1); + break; + + case RULE_OP_MANGLE_DUPECHAR_FIRST: + SET_NAME (rule, rule_buf[rule_pos]); + SET_P0_CONV (rule, rule_buf[rule_pos]); + break; + + case RULE_OP_MANGLE_DUPECHAR_LAST: + SET_NAME (rule, rule_buf[rule_pos]); + SET_P0_CONV (rule, rule_buf[rule_pos]); + break; + + case RULE_OP_MANGLE_DUPECHAR_ALL: + SET_NAME (rule, rule_buf[rule_pos]); + break; + + case RULE_OP_MANGLE_SWITCH_FIRST: + SET_NAME (rule, rule_buf[rule_pos]); + break; + + case RULE_OP_MANGLE_SWITCH_LAST: + SET_NAME (rule, rule_buf[rule_pos]); + break; + + case RULE_OP_MANGLE_SWITCH_AT: + SET_NAME (rule, rule_buf[rule_pos]); + SET_P0_CONV (rule, rule_buf[rule_pos]); + SET_P1_CONV (rule, rule_buf[rule_pos]); + break; + + case RULE_OP_MANGLE_CHR_SHIFTL: + SET_NAME (rule, rule_buf[rule_pos]); + SET_P0_CONV (rule, rule_buf[rule_pos]); + break; + + case RULE_OP_MANGLE_CHR_SHIFTR: + SET_NAME (rule, rule_buf[rule_pos]); + SET_P0_CONV (rule, rule_buf[rule_pos]); + break; + + case RULE_OP_MANGLE_CHR_INCR: + SET_NAME (rule, rule_buf[rule_pos]); + SET_P0_CONV (rule, rule_buf[rule_pos]); + break; + + case RULE_OP_MANGLE_CHR_DECR: + SET_NAME (rule, rule_buf[rule_pos]); + SET_P0_CONV (rule, rule_buf[rule_pos]); + break; + + case RULE_OP_MANGLE_REPLACE_NP1: + SET_NAME (rule, rule_buf[rule_pos]); + SET_P0_CONV (rule, rule_buf[rule_pos]); + break; + + case RULE_OP_MANGLE_REPLACE_NM1: + SET_NAME (rule, rule_buf[rule_pos]); + SET_P0_CONV (rule, rule_buf[rule_pos]); + break; + + case RULE_OP_MANGLE_DUPEBLOCK_FIRST: + SET_NAME (rule, rule_buf[rule_pos]); + SET_P0_CONV (rule, rule_buf[rule_pos]); + break; + + case RULE_OP_MANGLE_DUPEBLOCK_LAST: + SET_NAME (rule, rule_buf[rule_pos]); + SET_P0_CONV (rule, rule_buf[rule_pos]); + break; + + case RULE_OP_MANGLE_TITLE: + SET_NAME (rule, rule_buf[rule_pos]); + break; + + default: + return (-1); + break; + } + } + + if (rule_pos < rule_len) return (-1); + + return (0); +} + +int gpu_rule_to_cpu_rule (char rule_buf[BUFSIZ], gpu_rule_t *rule) +{ + uint rule_cnt; + uint rule_pos; + uint rule_len = BUFSIZ - 1; // maximum possible len + + char rule_cmd; + + for (rule_cnt = 0, rule_pos = 0; rule_pos < rule_len && rule_cnt < MAX_GPU_RULES; rule_pos++, rule_cnt++) + { + GET_NAME (rule); + + if (rule_cnt > 0) rule_buf[rule_pos++] = ' '; + + switch (rule_cmd) + { + case RULE_OP_MANGLE_NOOP: + rule_buf[rule_pos] = rule_cmd; + break; + + case RULE_OP_MANGLE_LREST: + rule_buf[rule_pos] = rule_cmd; + break; + + case RULE_OP_MANGLE_UREST: + rule_buf[rule_pos] = rule_cmd; + break; + + case RULE_OP_MANGLE_LREST_UFIRST: + rule_buf[rule_pos] = rule_cmd; + break; + + case RULE_OP_MANGLE_UREST_LFIRST: + rule_buf[rule_pos] = rule_cmd; + break; + + case RULE_OP_MANGLE_TREST: + rule_buf[rule_pos] = rule_cmd; + break; + + case RULE_OP_MANGLE_TOGGLE_AT: + rule_buf[rule_pos] = rule_cmd; + GET_P0_CONV (rule); + break; + + case RULE_OP_MANGLE_REVERSE: + rule_buf[rule_pos] = rule_cmd; + break; + + case RULE_OP_MANGLE_DUPEWORD: + rule_buf[rule_pos] = rule_cmd; + break; + + case RULE_OP_MANGLE_DUPEWORD_TIMES: + rule_buf[rule_pos] = rule_cmd; + GET_P0_CONV (rule); + break; + + case RULE_OP_MANGLE_REFLECT: + rule_buf[rule_pos] = rule_cmd; + break; + + case RULE_OP_MANGLE_ROTATE_LEFT: + rule_buf[rule_pos] = rule_cmd; + break; + + case RULE_OP_MANGLE_ROTATE_RIGHT: + rule_buf[rule_pos] = rule_cmd; + break; + + case RULE_OP_MANGLE_APPEND: + rule_buf[rule_pos] = rule_cmd; + GET_P0 (rule); + break; + + case RULE_OP_MANGLE_PREPEND: + rule_buf[rule_pos] = rule_cmd; + GET_P0 (rule); + break; + + case RULE_OP_MANGLE_DELETE_FIRST: + rule_buf[rule_pos] = rule_cmd; + break; + + case RULE_OP_MANGLE_DELETE_LAST: + rule_buf[rule_pos] = rule_cmd; + break; + + case RULE_OP_MANGLE_DELETE_AT: + rule_buf[rule_pos] = rule_cmd; + GET_P0_CONV (rule); + break; + + case RULE_OP_MANGLE_EXTRACT: + rule_buf[rule_pos] = rule_cmd; + GET_P0_CONV (rule); + GET_P1_CONV (rule); + break; + + case RULE_OP_MANGLE_OMIT: + rule_buf[rule_pos] = rule_cmd; + GET_P0_CONV (rule); + GET_P1_CONV (rule); + break; + + case RULE_OP_MANGLE_INSERT: + rule_buf[rule_pos] = rule_cmd; + GET_P0_CONV (rule); + GET_P1 (rule); + break; + + case RULE_OP_MANGLE_OVERSTRIKE: + rule_buf[rule_pos] = rule_cmd; + GET_P0_CONV (rule); + GET_P1 (rule); + break; + + case RULE_OP_MANGLE_TRUNCATE_AT: + rule_buf[rule_pos] = rule_cmd; + GET_P0_CONV (rule); + break; + + case RULE_OP_MANGLE_REPLACE: + rule_buf[rule_pos] = rule_cmd; + GET_P0 (rule); + GET_P1 (rule); + break; + + case RULE_OP_MANGLE_PURGECHAR: + return (-1); + break; + + case RULE_OP_MANGLE_TOGGLECASE_REC: + return (-1); + break; + + case RULE_OP_MANGLE_DUPECHAR_FIRST: + rule_buf[rule_pos] = rule_cmd; + GET_P0_CONV (rule); + break; + + case RULE_OP_MANGLE_DUPECHAR_LAST: + rule_buf[rule_pos] = rule_cmd; + GET_P0_CONV (rule); + break; + + case RULE_OP_MANGLE_DUPECHAR_ALL: + rule_buf[rule_pos] = rule_cmd; + break; + + case RULE_OP_MANGLE_SWITCH_FIRST: + rule_buf[rule_pos] = rule_cmd; + break; + + case RULE_OP_MANGLE_SWITCH_LAST: + rule_buf[rule_pos] = rule_cmd; + break; + + case RULE_OP_MANGLE_SWITCH_AT: + rule_buf[rule_pos] = rule_cmd; + GET_P0_CONV (rule); + GET_P1_CONV (rule); + break; + + case RULE_OP_MANGLE_CHR_SHIFTL: + rule_buf[rule_pos] = rule_cmd; + GET_P0_CONV (rule); + break; + + case RULE_OP_MANGLE_CHR_SHIFTR: + rule_buf[rule_pos] = rule_cmd; + GET_P0_CONV (rule); + break; + + case RULE_OP_MANGLE_CHR_INCR: + rule_buf[rule_pos] = rule_cmd; + GET_P0_CONV (rule); + break; + + case RULE_OP_MANGLE_CHR_DECR: + rule_buf[rule_pos] = rule_cmd; + GET_P0_CONV (rule); + break; + + case RULE_OP_MANGLE_REPLACE_NP1: + rule_buf[rule_pos] = rule_cmd; + GET_P0_CONV (rule); + break; + + case RULE_OP_MANGLE_REPLACE_NM1: + rule_buf[rule_pos] = rule_cmd; + GET_P0_CONV (rule); + break; + + case RULE_OP_MANGLE_DUPEBLOCK_FIRST: + rule_buf[rule_pos] = rule_cmd; + GET_P0_CONV (rule); + break; + + case RULE_OP_MANGLE_DUPEBLOCK_LAST: + rule_buf[rule_pos] = rule_cmd; + GET_P0_CONV (rule); + break; + + case RULE_OP_MANGLE_TITLE: + rule_buf[rule_pos] = rule_cmd; + break; + + case 0: + return rule_pos - 1; + break; + + default: + return (-1); + break; + } + } + + if (rule_cnt > 0) + { + return rule_pos; + } + + return (-1); +} + +/** + * CPU rules : this is from hashcat sources, cpu based rules + */ + +#define NEXT_RULEPOS(rp) if (++(rp) == rule_len) return (RULE_RC_SYNTAX_ERROR) +#define NEXT_RPTOI(r,rp,up) if (((up) = conv_ctoi ((r)[(rp)])) == -1) return (RULE_RC_SYNTAX_ERROR) + +#define MANGLE_TOGGLE_AT(a,p) if (class_alpha ((a)[(p)])) (a)[(p)] ^= 0x20 +#define MANGLE_LOWER_AT(a,p) if (class_upper ((a)[(p)])) (a)[(p)] ^= 0x20 +#define MANGLE_UPPER_AT(a,p) if (class_lower ((a)[(p)])) (a)[(p)] ^= 0x20 + +/* #define MANGLE_SWITCH(a,l,r) { char c = (l); arr[(r)] = arr[(l)]; arr[(l)] = c; } */ +/* #define MANGLE_SWITCH(a,l,r) { char c = (l); (a)[(r)] = (a)[(l)]; (a)[(l)] = c; } */ +#define MANGLE_SWITCH(a,l,r) { char c = (a)[(r)]; (a)[(r)] = (a)[(l)]; (a)[(l)] = c; } + +int mangle_lrest (char arr[BLOCK_SIZE], int arr_len) +{ + int pos; + + for (pos = 0; pos < arr_len; pos++) MANGLE_LOWER_AT (arr, pos); + + return (arr_len); +} + +int mangle_urest (char arr[BLOCK_SIZE], int arr_len) +{ + int pos; + + for (pos = 0; pos < arr_len; pos++) MANGLE_UPPER_AT (arr, pos); + + return (arr_len); +} + +int mangle_trest (char arr[BLOCK_SIZE], int arr_len) +{ + int pos; + + for (pos = 0; pos < arr_len; pos++) MANGLE_TOGGLE_AT (arr, pos); + + return (arr_len); +} + +int mangle_reverse (char arr[BLOCK_SIZE], int arr_len) +{ + int l; + int r; + + for (l = 0; l < arr_len; l++) + { + r = arr_len - 1 - l; + + if (l >= r) break; + + MANGLE_SWITCH (arr, l, r); + } + + return (arr_len); +} + +int mangle_double (char arr[BLOCK_SIZE], int arr_len) +{ + if ((arr_len * 2) >= BLOCK_SIZE) return (arr_len); + + memcpy (&arr[arr_len], arr, (size_t) arr_len); + + return (arr_len * 2); +} + +int mangle_double_times (char arr[BLOCK_SIZE], int arr_len, int times) +{ + if (((arr_len * times) + arr_len) >= BLOCK_SIZE) return (arr_len); + + int orig_len = arr_len; + + int i; + + for (i = 0; i < times; i++) + { + memcpy (&arr[arr_len], arr, orig_len); + + arr_len += orig_len; + } + + return (arr_len); +} + +int mangle_reflect (char arr[BLOCK_SIZE], int arr_len) +{ + if ((arr_len * 2) >= BLOCK_SIZE) return (arr_len); + + mangle_double (arr, arr_len); + + mangle_reverse (arr + arr_len, arr_len); + + return (arr_len * 2); +} + +int mangle_rotate_left (char arr[BLOCK_SIZE], int arr_len) +{ + int l; + int r; + + for (l = 0, r = arr_len - 1; r > 0; r--) + { + MANGLE_SWITCH (arr, l, r); + } + + return (arr_len); +} + +int mangle_rotate_right (char arr[BLOCK_SIZE], int arr_len) +{ + int l; + int r; + + for (l = 0, r = arr_len - 1; l < r; l++) + { + MANGLE_SWITCH (arr, l, r); + } + + return (arr_len); +} + +int mangle_append (char arr[BLOCK_SIZE], int arr_len, char c) +{ + if ((arr_len + 1) >= BLOCK_SIZE) return (arr_len); + + arr[arr_len] = c; + + return (arr_len + 1); +} + +int mangle_prepend (char arr[BLOCK_SIZE], int arr_len, char c) +{ + if ((arr_len + 1) >= BLOCK_SIZE) return (arr_len); + + int arr_pos; + + for (arr_pos = arr_len - 1; arr_pos > -1; arr_pos--) + { + arr[arr_pos + 1] = arr[arr_pos]; + } + + arr[0] = c; + + return (arr_len + 1); +} + +int mangle_delete_at (char arr[BLOCK_SIZE], int arr_len, int upos) +{ + if (upos >= arr_len) return (arr_len); + + int arr_pos; + + for (arr_pos = upos; arr_pos < arr_len - 1; arr_pos++) + { + arr[arr_pos] = arr[arr_pos + 1]; + } + + return (arr_len - 1); +} + +int mangle_extract (char arr[BLOCK_SIZE], int arr_len, int upos, int ulen) +{ + if (upos >= arr_len) return (arr_len); + + if ((upos + ulen) > arr_len) return (arr_len); + + int arr_pos; + + for (arr_pos = 0; arr_pos < ulen; arr_pos++) + { + arr[arr_pos] = arr[upos + arr_pos]; + } + + return (ulen); +} + +int mangle_omit (char arr[BLOCK_SIZE], int arr_len, int upos, int ulen) +{ + if (upos >= arr_len) return (arr_len); + + if ((upos + ulen) >= arr_len) return (arr_len); + + int arr_pos; + + for (arr_pos = upos; arr_pos < arr_len - ulen; arr_pos++) + { + arr[arr_pos] = arr[arr_pos + ulen]; + } + + return (arr_len - ulen); +} + +int mangle_insert (char arr[BLOCK_SIZE], int arr_len, int upos, char c) +{ + if (upos >= arr_len) return (arr_len); + + if ((arr_len + 1) >= BLOCK_SIZE) return (arr_len); + + int arr_pos; + + for (arr_pos = arr_len - 1; arr_pos > upos - 1; arr_pos--) + { + arr[arr_pos + 1] = arr[arr_pos]; + } + + arr[upos] = c; + + return (arr_len + 1); +} + +int mangle_insert_multi (char arr[BLOCK_SIZE], int arr_len, int arr_pos, char arr2[BLOCK_SIZE], int arr2_len, int arr2_pos, int arr2_cpy) +{ + if ((arr_len + arr2_cpy) > BLOCK_SIZE) return (RULE_RC_REJECT_ERROR); + + if (arr_pos > arr_len) return (RULE_RC_REJECT_ERROR); + + if (arr2_pos > arr2_len) return (RULE_RC_REJECT_ERROR); + + if ((arr2_pos + arr2_cpy) > arr2_len) return (RULE_RC_REJECT_ERROR); + + if (arr2_cpy < 1) return (RULE_RC_SYNTAX_ERROR); + + memcpy (arr2, arr2 + arr2_pos, arr2_len - arr2_pos); + + memcpy (arr2 + arr2_cpy, arr + arr_pos, arr_len - arr_pos); + + memcpy (arr + arr_pos, arr2, arr_len - arr_pos + arr2_cpy); + + return (arr_len + arr2_cpy); +} + +int mangle_overstrike (char arr[BLOCK_SIZE], int arr_len, int upos, char c) +{ + if (upos >= arr_len) return (arr_len); + + arr[upos] = c; + + return (arr_len); +} + +int mangle_truncate_at (char arr[BLOCK_SIZE], int arr_len, int upos) +{ + if (upos >= arr_len) return (arr_len); + + memset (arr + upos, 0, arr_len - upos); + + return (upos); +} + +int mangle_replace (char arr[BLOCK_SIZE], int arr_len, char oldc, char newc) +{ + int arr_pos; + + for (arr_pos = 0; arr_pos < arr_len; arr_pos++) + { + if (arr[arr_pos] != oldc) continue; + + arr[arr_pos] = newc; + } + + return (arr_len); +} + +int mangle_purgechar (char arr[BLOCK_SIZE], int arr_len, char c) +{ + int arr_pos; + + int ret_len; + + for (ret_len = 0, arr_pos = 0; arr_pos < arr_len; arr_pos++) + { + if (arr[arr_pos] == c) continue; + + arr[ret_len] = arr[arr_pos]; + + ret_len++; + } + + return (ret_len); +} + +int mangle_dupeblock_prepend (char arr[BLOCK_SIZE], int arr_len, int ulen) +{ + if (ulen > arr_len) return (arr_len); + + if ((arr_len + ulen) >= BLOCK_SIZE) return (arr_len); + + char cs[100]; + + memcpy (cs, arr, ulen); + + int i; + + for (i = 0; i < ulen; i++) + { + char c = cs[i]; + + arr_len = mangle_insert (arr, arr_len, i, c); + } + + return (arr_len); +} + +int mangle_dupeblock_append (char arr[BLOCK_SIZE], int arr_len, int ulen) +{ + if (ulen > arr_len) return (arr_len); + + if ((arr_len + ulen) >= BLOCK_SIZE) return (arr_len); + + int upos = arr_len - ulen; + + int i; + + for (i = 0; i < ulen; i++) + { + char c = arr[upos + i]; + + arr_len = mangle_append (arr, arr_len, c); + } + + return (arr_len); +} + +int mangle_dupechar_at (char arr[BLOCK_SIZE], int arr_len, int upos, int ulen) +{ + if ( arr_len == 0) return (arr_len); + if ((arr_len + ulen) >= BLOCK_SIZE) return (arr_len); + + char c = arr[upos]; + + int i; + + for (i = 0; i < ulen; i++) + { + arr_len = mangle_insert (arr, arr_len, upos, c); + } + + return (arr_len); +} + +int mangle_dupechar (char arr[BLOCK_SIZE], int arr_len) +{ + if ( arr_len == 0) return (arr_len); + if ((arr_len + arr_len) >= BLOCK_SIZE) return (arr_len); + + int arr_pos; + + for (arr_pos = arr_len - 1; arr_pos > -1; arr_pos--) + { + int new_pos = arr_pos * 2; + + arr[new_pos] = arr[arr_pos]; + + arr[new_pos + 1] = arr[arr_pos]; + } + + return (arr_len * 2); +} + +int mangle_switch_at_check (char arr[BLOCK_SIZE], int arr_len, int upos, int upos2) +{ + if (upos >= arr_len) return (arr_len); + if (upos2 >= arr_len) return (arr_len); + + MANGLE_SWITCH (arr, upos, upos2); + + return (arr_len); +} + +int mangle_switch_at (char arr[BLOCK_SIZE], int arr_len, int upos, int upos2) +{ + MANGLE_SWITCH (arr, upos, upos2); + + return (arr_len); +} + +int mangle_chr_shiftl (uint8_t arr[BLOCK_SIZE], int arr_len, int upos) +{ + if (upos >= arr_len) return (arr_len); + + arr[upos] <<= 1; + + return (arr_len); +} + +int mangle_chr_shiftr (uint8_t arr[BLOCK_SIZE], int arr_len, int upos) +{ + if (upos >= arr_len) return (arr_len); + + arr[upos] >>= 1; + + return (arr_len); +} + +int mangle_chr_incr (uint8_t arr[BLOCK_SIZE], int arr_len, int upos) +{ + if (upos >= arr_len) return (arr_len); + + arr[upos] += 1; + + return (arr_len); +} + +int mangle_chr_decr (uint8_t arr[BLOCK_SIZE], int arr_len, int upos) +{ + if (upos >= arr_len) return (arr_len); + + arr[upos] -= 1; + + return (arr_len); +} + +int mangle_title (char arr[BLOCK_SIZE], int arr_len) +{ + int upper_next = 1; + + int pos; + + for (pos = 0; pos < arr_len; pos++) + { + if (arr[pos] == ' ') + { + upper_next = 1; + + continue; + } + + if (upper_next) + { + upper_next = 0; + + MANGLE_UPPER_AT (arr, pos); + } + else + { + MANGLE_LOWER_AT (arr, pos); + } + } + + return (arr_len); +} + +int generate_random_rule (char rule_buf[RP_RULE_BUFSIZ], uint32_t rp_gen_func_min, uint32_t rp_gen_func_max) +{ + uint32_t rp_gen_num = get_random_num (rp_gen_func_min, rp_gen_func_max); + + uint32_t j; + + uint32_t rule_pos = 0; + + for (j = 0; j < rp_gen_num; j++) + { + uint32_t r = 0; + uint32_t p1 = 0; + uint32_t p2 = 0; + uint32_t p3 = 0; + + switch ((char) get_random_num (0, 9)) + { + case 0: + r = get_random_num (0, sizeof (grp_op_nop)); + rule_buf[rule_pos++] = grp_op_nop[r]; + break; + + case 1: + r = get_random_num (0, sizeof (grp_op_pos_p0)); + rule_buf[rule_pos++] = grp_op_pos_p0[r]; + p1 = get_random_num (0, sizeof (grp_pos)); + rule_buf[rule_pos++] = grp_pos[p1]; + break; + + case 2: + r = get_random_num (0, sizeof (grp_op_pos_p1)); + rule_buf[rule_pos++] = grp_op_pos_p1[r]; + p1 = get_random_num (1, 6); + rule_buf[rule_pos++] = grp_pos[p1]; + break; + + case 3: + r = get_random_num (0, sizeof (grp_op_chr)); + rule_buf[rule_pos++] = grp_op_chr[r]; + p1 = get_random_num (0x20, 0x7e); + rule_buf[rule_pos++] = (char) p1; + break; + + case 4: + r = get_random_num (0, sizeof (grp_op_chr_chr)); + rule_buf[rule_pos++] = grp_op_chr_chr[r]; + p1 = get_random_num (0x20, 0x7e); + rule_buf[rule_pos++] = (char) p1; + p2 = get_random_num (0x20, 0x7e); + while (p1 == p2) + p2 = get_random_num (0x20, 0x7e); + rule_buf[rule_pos++] = (char) p2; + break; + + case 5: + r = get_random_num (0, sizeof (grp_op_pos_chr)); + rule_buf[rule_pos++] = grp_op_pos_chr[r]; + p1 = get_random_num (0, sizeof (grp_pos)); + rule_buf[rule_pos++] = grp_pos[p1]; + p2 = get_random_num (0x20, 0x7e); + rule_buf[rule_pos++] = (char) p2; + break; + + case 6: + r = get_random_num (0, sizeof (grp_op_pos_pos0)); + rule_buf[rule_pos++] = grp_op_pos_pos0[r]; + p1 = get_random_num (0, sizeof (grp_pos)); + rule_buf[rule_pos++] = grp_pos[p1]; + p2 = get_random_num (0, sizeof (grp_pos)); + while (p1 == p2) + p2 = get_random_num (0, sizeof (grp_pos)); + rule_buf[rule_pos++] = grp_pos[p2]; + break; + + case 7: + r = get_random_num (0, sizeof (grp_op_pos_pos1)); + rule_buf[rule_pos++] = grp_op_pos_pos1[r]; + p1 = get_random_num (0, sizeof (grp_pos)); + rule_buf[rule_pos++] = grp_pos[p1]; + p2 = get_random_num (1, sizeof (grp_pos)); + while (p1 == p2) + p2 = get_random_num (1, sizeof (grp_pos)); + rule_buf[rule_pos++] = grp_pos[p2]; + break; + + case 8: + r = get_random_num (0, sizeof (grp_op_pos1_pos2_pos3)); + rule_buf[rule_pos++] = grp_op_pos1_pos2_pos3[r]; + p1 = get_random_num (0, sizeof (grp_pos)); + rule_buf[rule_pos++] = grp_pos[p1]; + p2 = get_random_num (1, sizeof (grp_pos)); + rule_buf[rule_pos++] = grp_pos[p1]; + p3 = get_random_num (0, sizeof (grp_pos)); + rule_buf[rule_pos++] = grp_pos[p3]; + break; + } + } + + return (rule_pos); +} + +int _old_apply_rule (char *rule, int rule_len, char in[BLOCK_SIZE], int in_len, char out[BLOCK_SIZE]) +{ + char mem[BLOCK_SIZE]; + + if (in == NULL) return (RULE_RC_REJECT_ERROR); + + if (out == NULL) return (RULE_RC_REJECT_ERROR); + + if (in_len < 1) return (RULE_RC_REJECT_ERROR); + + if (rule_len < 1) return (RULE_RC_REJECT_ERROR); + + int out_len = in_len; + int mem_len = in_len; + + memcpy (out, in, out_len); + + int rule_pos; + + for (rule_pos = 0; rule_pos < rule_len; rule_pos++) + { + int upos; int upos2; + int ulen; + + switch (rule[rule_pos]) + { + case ' ': + break; + + case RULE_OP_MANGLE_NOOP: + break; + + case RULE_OP_MANGLE_LREST: + out_len = mangle_lrest (out, out_len); + break; + + case RULE_OP_MANGLE_UREST: + out_len = mangle_urest (out, out_len); + break; + + case RULE_OP_MANGLE_LREST_UFIRST: + out_len = mangle_lrest (out, out_len); + if (out_len) MANGLE_UPPER_AT (out, 0); + break; + + case RULE_OP_MANGLE_UREST_LFIRST: + out_len = mangle_urest (out, out_len); + if (out_len) MANGLE_LOWER_AT (out, 0); + break; + + case RULE_OP_MANGLE_TREST: + out_len = mangle_trest (out, out_len); + break; + + case RULE_OP_MANGLE_TOGGLE_AT: + NEXT_RULEPOS (rule_pos); + NEXT_RPTOI (rule, rule_pos, upos); + if (upos < out_len) MANGLE_TOGGLE_AT (out, upos); + break; + + case RULE_OP_MANGLE_REVERSE: + out_len = mangle_reverse (out, out_len); + break; + + case RULE_OP_MANGLE_DUPEWORD: + out_len = mangle_double (out, out_len); + break; + + case RULE_OP_MANGLE_DUPEWORD_TIMES: + NEXT_RULEPOS (rule_pos); + NEXT_RPTOI (rule, rule_pos, ulen); + out_len = mangle_double_times (out, out_len, ulen); + break; + + case RULE_OP_MANGLE_REFLECT: + out_len = mangle_reflect (out, out_len); + break; + + case RULE_OP_MANGLE_ROTATE_LEFT: + mangle_rotate_left (out, out_len); + break; + + case RULE_OP_MANGLE_ROTATE_RIGHT: + mangle_rotate_right (out, out_len); + break; + + case RULE_OP_MANGLE_APPEND: + NEXT_RULEPOS (rule_pos); + out_len = mangle_append (out, out_len, rule[rule_pos]); + break; + + case RULE_OP_MANGLE_PREPEND: + NEXT_RULEPOS (rule_pos); + out_len = mangle_prepend (out, out_len, rule[rule_pos]); + break; + + case RULE_OP_MANGLE_DELETE_FIRST: + out_len = mangle_delete_at (out, out_len, 0); + break; + + case RULE_OP_MANGLE_DELETE_LAST: + out_len = mangle_delete_at (out, out_len, (out_len) ? out_len - 1 : 0); + break; + + case RULE_OP_MANGLE_DELETE_AT: + NEXT_RULEPOS (rule_pos); + NEXT_RPTOI (rule, rule_pos, upos); + out_len = mangle_delete_at (out, out_len, upos); + break; + + case RULE_OP_MANGLE_EXTRACT: + NEXT_RULEPOS (rule_pos); + NEXT_RPTOI (rule, rule_pos, upos); + NEXT_RULEPOS (rule_pos); + NEXT_RPTOI (rule, rule_pos, ulen); + out_len = mangle_extract (out, out_len, upos, ulen); + break; + + case RULE_OP_MANGLE_OMIT: + NEXT_RULEPOS (rule_pos); + NEXT_RPTOI (rule, rule_pos, upos); + NEXT_RULEPOS (rule_pos); + NEXT_RPTOI (rule, rule_pos, ulen); + out_len = mangle_omit (out, out_len, upos, ulen); + break; + + case RULE_OP_MANGLE_INSERT: + NEXT_RULEPOS (rule_pos); + NEXT_RPTOI (rule, rule_pos, upos); + NEXT_RULEPOS (rule_pos); + out_len = mangle_insert (out, out_len, upos, rule[rule_pos]); + break; + + case RULE_OP_MANGLE_OVERSTRIKE: + NEXT_RULEPOS (rule_pos); + NEXT_RPTOI (rule, rule_pos, upos); + NEXT_RULEPOS (rule_pos); + out_len = mangle_overstrike (out, out_len, upos, rule[rule_pos]); + break; + + case RULE_OP_MANGLE_TRUNCATE_AT: + NEXT_RULEPOS (rule_pos); + NEXT_RPTOI (rule, rule_pos, upos); + out_len = mangle_truncate_at (out, out_len, upos); + break; + + case RULE_OP_MANGLE_REPLACE: + NEXT_RULEPOS (rule_pos); + NEXT_RULEPOS (rule_pos); + out_len = mangle_replace (out, out_len, rule[rule_pos - 1], rule[rule_pos]); + break; + + case RULE_OP_MANGLE_PURGECHAR: + NEXT_RULEPOS (rule_pos); + out_len = mangle_purgechar (out, out_len, rule[rule_pos]); + break; + + case RULE_OP_MANGLE_TOGGLECASE_REC: + /* todo */ + break; + + case RULE_OP_MANGLE_DUPECHAR_FIRST: + NEXT_RULEPOS (rule_pos); + NEXT_RPTOI (rule, rule_pos, ulen); + out_len = mangle_dupechar_at (out, out_len, 0, ulen); + break; + + case RULE_OP_MANGLE_DUPECHAR_LAST: + NEXT_RULEPOS (rule_pos); + NEXT_RPTOI (rule, rule_pos, ulen); + out_len = mangle_dupechar_at (out, out_len, out_len - 1, ulen); + break; + + case RULE_OP_MANGLE_DUPECHAR_ALL: + out_len = mangle_dupechar (out, out_len); + break; + + case RULE_OP_MANGLE_DUPEBLOCK_FIRST: + NEXT_RULEPOS (rule_pos); + NEXT_RPTOI (rule, rule_pos, ulen); + out_len = mangle_dupeblock_prepend (out, out_len, ulen); + break; + + case RULE_OP_MANGLE_DUPEBLOCK_LAST: + NEXT_RULEPOS (rule_pos); + NEXT_RPTOI (rule, rule_pos, ulen); + out_len = mangle_dupeblock_append (out, out_len, ulen); + break; + + case RULE_OP_MANGLE_SWITCH_FIRST: + if (out_len >= 2) mangle_switch_at (out, out_len, 0, 1); + break; + + case RULE_OP_MANGLE_SWITCH_LAST: + if (out_len >= 2) mangle_switch_at (out, out_len, out_len - 1, out_len - 2); + break; + + case RULE_OP_MANGLE_SWITCH_AT: + NEXT_RULEPOS (rule_pos); + NEXT_RPTOI (rule, rule_pos, upos); + NEXT_RULEPOS (rule_pos); + NEXT_RPTOI (rule, rule_pos, upos2); + out_len = mangle_switch_at_check (out, out_len, upos, upos2); + break; + + case RULE_OP_MANGLE_CHR_SHIFTL: + NEXT_RULEPOS (rule_pos); + NEXT_RPTOI (rule, rule_pos, upos); + mangle_chr_shiftl ((uint8_t *) out, out_len, upos); + break; + + case RULE_OP_MANGLE_CHR_SHIFTR: + NEXT_RULEPOS (rule_pos); + NEXT_RPTOI (rule, rule_pos, upos); + mangle_chr_shiftr ((uint8_t *) out, out_len, upos); + break; + + case RULE_OP_MANGLE_CHR_INCR: + NEXT_RULEPOS (rule_pos); + NEXT_RPTOI (rule, rule_pos, upos); + mangle_chr_incr ((uint8_t *) out, out_len, upos); + break; + + case RULE_OP_MANGLE_CHR_DECR: + NEXT_RULEPOS (rule_pos); + NEXT_RPTOI (rule, rule_pos, upos); + mangle_chr_decr ((uint8_t *) out, out_len, upos); + break; + + case RULE_OP_MANGLE_REPLACE_NP1: + NEXT_RULEPOS (rule_pos); + NEXT_RPTOI (rule, rule_pos, upos); + if ((upos >= 0) && ((upos + 1) < out_len)) mangle_overstrike (out, out_len, upos, out[upos + 1]); + break; + + case RULE_OP_MANGLE_REPLACE_NM1: + NEXT_RULEPOS (rule_pos); + NEXT_RPTOI (rule, rule_pos, upos); + if ((upos >= 1) && ((upos + 0) < out_len)) mangle_overstrike (out, out_len, upos, out[upos - 1]); + break; + + case RULE_OP_MANGLE_TITLE: + out_len = mangle_title (out, out_len); + break; + + case RULE_OP_MANGLE_EXTRACT_MEMORY: + if (mem_len < 1) return (RULE_RC_REJECT_ERROR); + NEXT_RULEPOS (rule_pos); + NEXT_RPTOI (rule, rule_pos, upos); + NEXT_RULEPOS (rule_pos); + NEXT_RPTOI (rule, rule_pos, ulen); + NEXT_RULEPOS (rule_pos); + NEXT_RPTOI (rule, rule_pos, upos2); + if ((out_len = mangle_insert_multi (out, out_len, upos2, mem, mem_len, upos, ulen)) < 1) return (out_len); + break; + + case RULE_OP_MANGLE_APPEND_MEMORY: + if (mem_len < 1) return (RULE_RC_REJECT_ERROR); + if ((out_len + mem_len) > BLOCK_SIZE) return (RULE_RC_REJECT_ERROR); + memcpy (out + out_len, mem, mem_len); + out_len += mem_len; + break; + + case RULE_OP_MANGLE_PREPEND_MEMORY: + if (mem_len < 1) return (RULE_RC_REJECT_ERROR); + if ((mem_len + out_len) > BLOCK_SIZE) return (RULE_RC_REJECT_ERROR); + memcpy (mem + mem_len, out, out_len); + out_len += mem_len; + memcpy (out, mem, out_len); + break; + + case RULE_OP_MEMORIZE_WORD: + memcpy (mem, out, out_len); + mem_len = out_len; + break; + + case RULE_OP_REJECT_LESS: + NEXT_RULEPOS (rule_pos); + NEXT_RPTOI (rule, rule_pos, upos); + if (out_len > upos) return (RULE_RC_REJECT_ERROR); + break; + + case RULE_OP_REJECT_GREATER: + NEXT_RULEPOS (rule_pos); + NEXT_RPTOI (rule, rule_pos, upos); + if (out_len < upos) return (RULE_RC_REJECT_ERROR); + break; + + case RULE_OP_REJECT_CONTAIN: + NEXT_RULEPOS (rule_pos); + if (strchr (out, rule[rule_pos]) != NULL) return (RULE_RC_REJECT_ERROR); + break; + + case RULE_OP_REJECT_NOT_CONTAIN: + NEXT_RULEPOS (rule_pos); + if (strchr (out, rule[rule_pos]) == NULL) return (RULE_RC_REJECT_ERROR); + break; + + case RULE_OP_REJECT_EQUAL_FIRST: + NEXT_RULEPOS (rule_pos); + if (out[0] != rule[rule_pos]) return (RULE_RC_REJECT_ERROR); + break; + + case RULE_OP_REJECT_EQUAL_LAST: + NEXT_RULEPOS (rule_pos); + if (out[out_len - 1] != rule[rule_pos]) return (RULE_RC_REJECT_ERROR); + break; + + case RULE_OP_REJECT_EQUAL_AT: + NEXT_RULEPOS (rule_pos); + NEXT_RPTOI (rule, rule_pos, upos); + if ((upos + 1) > out_len) return (RULE_RC_REJECT_ERROR); + NEXT_RULEPOS (rule_pos); + if (out[upos] != rule[rule_pos]) return (RULE_RC_REJECT_ERROR); + break; + + case RULE_OP_REJECT_CONTAINS: + NEXT_RULEPOS (rule_pos); + NEXT_RPTOI (rule, rule_pos, upos); + if ((upos + 1) > out_len) return (RULE_RC_REJECT_ERROR); + NEXT_RULEPOS (rule_pos); + int c; int cnt; for (c = 0, cnt = 0; c < out_len; c++) if (out[c] == rule[rule_pos]) cnt++; + if (cnt < upos) return (RULE_RC_REJECT_ERROR); + break; + + case RULE_OP_REJECT_MEMORY: + if ((out_len == mem_len) && (memcmp (out, mem, out_len) == 0)) return (RULE_RC_REJECT_ERROR); + break; + + default: + return (RULE_RC_SYNTAX_ERROR); + break; + } + } + + memset (out + out_len, 0, BLOCK_SIZE - out_len); + + return (out_len); +} diff --git a/tools/clcompile/clcompile.c b/tools/clcompile/clcompile.c new file mode 100644 index 0000000000..d6e29aaffb --- /dev/null +++ b/tools/clcompile/clcompile.c @@ -0,0 +1,254 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define CL_PLATFORMS_MAX 128 +#define CL_DEVICES_MAX 128 + +//char options[] = "–x spir -spir-std=1.2 -I."; +char options[] = "-I. -x clc++ -cl-std=CL1.2"; + +static void checkErr (char *func, cl_int err) +{ + if (err != CL_SUCCESS) + { + fprintf (stderr, "%s(): ", func); + + switch (err) + { + case CL_BUILD_PROGRAM_FAILURE : + fprintf (stderr, "CL_BUILD_PROGRAM_FAILURE"); + break; + + case CL_COMPILER_NOT_AVAILABLE : + fprintf (stderr, "CL_COMPILER_NOT_AVAILABLE"); + break; + + case CL_DEVICE_NOT_AVAILABLE : + fprintf (stderr, "CL_DEVICE_NOT_AVAILABLE"); + break; + + case CL_DEVICE_NOT_FOUND : + fprintf (stderr, "CL_DEVICE_NOT_FOUND"); + break; + + case CL_INVALID_BINARY : + fprintf (stderr, "CL_INVALID_BINARY"); + break; + + case CL_INVALID_BUILD_OPTIONS : + fprintf (stderr, "CL_INVALID_BUILD_OPTIONS"); + break; + + case CL_INVALID_CONTEXT : + fprintf (stderr, "CL_INVALID_CONTEXT"); + break; + + case CL_INVALID_DEVICE : + fprintf (stderr, "CL_INVALID_DEVICE"); + break; + + case CL_INVALID_DEVICE_TYPE : + fprintf (stderr, "CL_INVALID_DEVICE_TYPE"); + break; + + case CL_INVALID_OPERATION : + fprintf (stderr, "CL_INVALID_OPERATION"); + break; + + case CL_INVALID_PLATFORM : + fprintf (stderr, "CL_INVALID_PLATFORM"); + break; + + case CL_INVALID_PROGRAM : + fprintf (stderr, "CL_INVALID_PROGRAM"); + break; + + case CL_INVALID_VALUE : + fprintf (stderr, "CL_INVALID_VALUE"); + break; + + case CL_OUT_OF_HOST_MEMORY : + fprintf (stderr, "CL_OUT_OF_HOST_MEMORY"); + break; + + default : + fprintf (stderr, "Unknown error code: %d", err); + break; + } + + fprintf (stderr, "\n"); + + exit (err); + } +} + +static char *load_kernel (const char *kernel_file) +{ + FILE *fp = NULL; + + if ((fp = fopen (kernel_file, "rb")) != NULL) + { + struct stat st; + + if (stat (kernel_file, &st) == -1) + { + fprintf (stderr, "! stat() failed (%d) : %s\n", errno, strerror (errno)); + } + + char *buf = (char *) malloc (st.st_size + 1); + + memset (buf, 0, st.st_size + 1); + + size_t num_read = fread (buf, sizeof (char), st.st_size, fp); + + if (num_read != (size_t) st.st_size) + { + fprintf (stderr, "! fread() [%s] failed (%d) : %s", kernel_file, errno, strerror (errno)); + fclose (fp); + exit (-1); + } + + fclose (fp); + + return buf; + } + else + { + fprintf (stderr, "! fopen() [%s] failed (%d) : %s", kernel_file, errno, strerror (errno)); + exit (-1); + } + + return NULL; +} + +static int writeProgramBins (char *dst, unsigned char *binary, size_t binary_size) +{ + FILE *fp = fopen (dst, "wb"); + + if (!fp) + { + fprintf(stderr, "! fopen() [%s] failed (%d) : %s\n", dst, errno, strerror (errno)); + return -1; + } + + if (fwrite (binary, sizeof (unsigned char), binary_size, fp) != binary_size) + { + fprintf(stderr, "! fwrite() [%s] failed (%d) : %s\n", dst, errno, strerror (errno)); + fclose (fp); + return -1; + } + + fclose (fp); + + return 0; +} + +int main (int argc, char *argv[]) +{ + if (argc != 4) + { + fprintf (stderr, "> Usage: %s ccopts src dst\n", argv[0]); + + return (-1); + } + + char *ccopts = argv[1]; + char *src = argv[2]; + char *dst = argv[3]; + + char *programSrc = load_kernel (src); + + if (programSrc == NULL) + { + fprintf (stderr, "Unable to open %s. Exiting.\n", src); + + return (-1); + } + + cl_device_id devices[1]; + cl_uint nDevices; + + cl_platform_id platform; + cl_uint platforms; + + cl_int err; + + err = clGetPlatformIDs(1, &platform, &platforms); + + checkErr ((char *) "clGetPlatformIDs", err); + + err = clGetDeviceIDs (platform, CL_DEVICE_TYPE_GPU, 1, devices, &nDevices); + + checkErr ((char *) "clGetDeviceIDs", err); + + cl_context context = clCreateContext (NULL, 1, devices, NULL, NULL, &err); + + checkErr ((char *) "clCreateContext", err); + + cl_program program = clCreateProgramWithSource (context, 1, (const char **) &programSrc, NULL, &err); + + checkErr ((char *) "clCreateProgramWithSource", err); + + size_t opt_len = strlen (ccopts) + 1 + strlen (options) + 1; + + char *options2 = (char *) malloc (opt_len + 1); + + memset (options2, 0, opt_len + 1); + + snprintf (options2, opt_len, "%s %s", options, ccopts); + + err = clCompileProgram (program, 1, devices, options2, 0, NULL, NULL, NULL, NULL); + + //checkErr ((char *) "clCompileProgram", err); + + size_t ret_val_size = 0; + + err = clGetProgramBuildInfo (program, devices[0], CL_PROGRAM_BUILD_LOG, 0, NULL, &ret_val_size); + + checkErr ((char *) "clGetProgramBuildInfo", err); + + if (ret_val_size > 1) + { + char *build_log = (char *) malloc (ret_val_size + 1); + + memset (build_log, 0, ret_val_size + 1); + + err = clGetProgramBuildInfo (program, devices[0], CL_PROGRAM_BUILD_LOG, ret_val_size, build_log, NULL); + + checkErr ((char *) "clGetProgramBuildInfo", err); + + puts (build_log); + } + + size_t binary_size; + + err = clGetProgramInfo (program, CL_PROGRAM_BINARY_SIZES, sizeof (size_t), &binary_size, NULL); + + checkErr ((char *) "clGetProgramInfo", err); + + unsigned char *binary = (unsigned char *) malloc (binary_size); + + memset(binary, 0, binary_size); + + err = clGetProgramInfo (program, CL_PROGRAM_BINARIES, sizeof (binary), &binary, NULL); + + checkErr ((char *) "clGetProgramInfo", err); + + err = writeProgramBins (dst, binary, binary_size); + + checkErr ((char *) "writeProgramBins", err); + + return 0; +} diff --git a/tools/deps.sh b/tools/deps.sh new file mode 100755 index 0000000000..24c808bfec --- /dev/null +++ b/tools/deps.sh @@ -0,0 +1,124 @@ +#!/bin/bash +# Author: Gabriele Gristina +# Revision: 1.0 + +## global vars +DEPS="make gcc-4.9 g++-4.9 gcc-4.9-multilib g++-4.9-multilib libc6-dev-i386 mingw-w64 build-essential unzip" +DOWNLOAD_DEPS="ADL_SDK8.zip R352-developer.zip cuda_7.5.18_linux.run NVIDIA-Linux-x86_64-352.21.run gdk_linux_amd64_352_55_release.run AMDAPPSDK-3.0-linux64.tar.bz2" + +## root check +if [ $(id -u) -ne 0 ]; then + echo "! Must be root" + exit 1 +fi + +## cleanup 'hashcat-deps' directories +rm -rf /opt/hashcat-deps/{adl-sdk,cuda-7.5,NVIDIA-Linux-x86_64-352.21,nvidia-gdk,amd-app-sdk} && \ +mkdir -p /opt/hashcat-deps/{tmp,adl-sdk,cuda-7.5,NVIDIA-Linux-x86_64-352.21,nvidia-gdk,amd-app-sdk} && \ +cd /opt/hashcat-deps/tmp + +if [ $? -ne 0 ]; then + echo "! Cannot create hashcat-deps directories." + exit 1 +fi + +## check dependencies +i=0 +for d in ${DOWNLOAD_DEPS}; do + if [ ! -f "${d}" ]; then + echo "! ${d} not found." + ((i++)) + fi +done + +if [ ${i} -gt 0 ]; then + echo "! Please download manually into the directory /opt/hashcat-deps/tmp" + exit 1 +fi + +## installing needed packages +for pkg in ${DEPS}; do + apt-get -y install ${pkg} + if [ $? -ne 0 ]; then + echo "! failed to install ${pkg}" + exit 1 + fi +done + +## extract ADL SDK +unzip ADL_SDK8.zip -d /opt/hashcat-deps/adl-sdk-8 +ret=$? + +if [[ ${ret} -ne 0 ]] && [[ ${ret} -ne 1 ]]; then + echo "! failed to extract ADL SDK" + exit 1 +fi + +rm -rf /opt/hashcat-deps/adl-sdk && ln -s /opt/hashcat-deps/adl-sdk-8 /opt/hashcat-deps/adl-sdk + +if [ $? -ne 0 ]; then + echo "! failed to setup ADL SDK link" + exit 1 +fi + +## extract NVAPI +unzip R352-developer.zip -d /opt/hashcat-deps/ +ret=$? + +if [[ ${ret} -ne 0 ]] && [[ ${ret} -ne 1 ]]; then + echo "! failed to extract NVAPI" + exit 1 +fi + +## install CUDA SDK +chmod +x cuda_7.5.18_linux.run && \ +./cuda_7.5.18_linux.run -toolkit -silent -override --toolkitpath=/opt/hashcat-deps/cuda-7.5 + +if [ $? -ne 0 ]; then + echo "! failed to install CUDA SDK" + exit 1 +fi + +## install NVIDIA Driver +chmod +x NVIDIA-Linux-x86_64-352.21.run && \ +./NVIDIA-Linux-x86_64-352.21.run -x && \ +mv NVIDIA-Linux-x86_64-352.21 /opt/hashcat-deps/ && \ +cd /opt/hashcat-deps/NVIDIA-Linux-x86_64-352.21 && \ +ln -s libnvidia-ml.so.352.21 libnvidia-ml.so && \ +ln -s libcuda.so.352.21 libcuda.so && \ +cd 32 && \ +ln -s libnvidia-ml.so.352.21 libnvidia-ml.so && \ +ln -s libcuda.so.352.21 libcuda.so && \ +cd /opt/hashcat-deps/tmp + +if [ $? -ne 0 ]; then + echo "! failed to install NVIDIA Driver" + exit 1 +fi + +## install NVIDIA GPU Deployment Kit +chmod +x gdk_linux_amd64_352_55_release.run && \ +./gdk_linux_amd64_352_55_release.run --silent --installdir=/opt/hashcat-deps/nvidia-gdk + +if [ $? -ne 0 ]; then + echo "! failed to install NVIDIA GPU Deployment Kit" + exit 1 +fi + +## extract AMD APP SDK +tar xjf AMDAPPSDK-3.0-linux64.tar.bz2 && \ +./AMD-APP-SDK-v3.0.130.135-GA-linux64.sh --noexec --target /opt/hashcat-deps/amd-app-sdk-v3.0.130.135 + +if [ $? -ne 0 ]; then + echo "! failed to extract AMD APP SDK" + exit 1 +fi + +rm -rf /opt/hashcat-deps/amd-app-sdk && ln -s /opt/hashcat-deps/amd-app-sdk-v3.0.130.135 /opt/hashcat-deps/amd-app-sdk + +if [ $? -ne 0 ]; then + echo "! failed to setup ADL SDK link" + exit 1 +fi + +echo "> oclHashcat dependencies have been resolved." diff --git a/tools/package_amd.sh b/tools/package_amd.sh new file mode 100755 index 0000000000..bb933039a8 --- /dev/null +++ b/tools/package_amd.sh @@ -0,0 +1,70 @@ +#!/bin/bash + +## +## Author......: Jens Steube +## License.....: MIT +## + +export IN=$HOME/oclHashcat +export OUT=$HOME/xy/oclHashcat-2.00 + +rm -rf $OUT +rm -rf $OUT.7z + +mkdir -p $OUT $OUT/kernels $OUT/kernels/4098 + +cp $IN/oclHashcat??.exe $OUT/ +cp $IN/oclHashcat??.bin $OUT/ +cp $IN/hashcat.hcstat $OUT/ + +cp -r $IN/docs $OUT/ +cp -r $IN/charsets $OUT/ +cp -r $IN/masks $OUT/ +cp -r $IN/rules $OUT/ +cp -r $IN/extra $OUT/ +cp $IN/example.dict $OUT/ +cp $IN/example[0123456789]*.hash $OUT/ +cp $IN/oclExample[0123456789]*.sh $OUT/ +cp $IN/oclExample[0123456789]*.cmd $OUT/ + +cp -r $IN/kernels/4098/*.llvmir $OUT/kernels/4098/ + +dos2unix $OUT/rules/*.rule +dos2unix $OUT/rules/hybrid/*.rule +dos2unix $OUT/docs/* +dos2unix $OUT/example* +dos2unix $OUT/*Example*.sh +dos2unix $OUT/*Example*.cmd + +unix2dos $OUT/masks/*.hcmask +unix2dos $OUT/rules/*.rule +unix2dos $OUT/rules/hybrid/*.rule +unix2dos $OUT/docs/* +unix2dos $OUT/example* +unix2dos $OUT/*Example*.cmd + +chmod 700 $OUT +chmod 700 $OUT/kernels +chmod 700 $OUT/kernels/4098 +chmod 600 $OUT/kernels/4098/* +chmod 700 $OUT/rules +chmod 600 $OUT/rules/* +chmod 700 $OUT/docs +chmod 600 $OUT/docs/* +chmod 700 $OUT/charsets +chmod 700 $OUT/charsets/* +chmod 700 $OUT/masks +chmod 600 $OUT/masks/* +chmod 600 $OUT/example* +chmod 600 $OUT/*Example*.cmd +chmod 700 $OUT/*Example*.sh +chmod 700 $OUT/extra +chmod 700 $OUT/extra/tab_completion/*.sh +chmod 700 $OUT/extra/tab_completion/install +chmod 600 $OUT/extra/rules_optimize/*.exe +chmod 700 $OUT/extra/rules_optimize/*.bin +chmod 600 $OUT/*.exe +chmod 700 $OUT/*.bin +chmod 600 $OUT/hashcat.hcstat + +time 7z a -t7z -m0=lzma2:d31 -mx=9 -mmt=8 -ms=on $OUT.7z $OUT diff --git a/tools/package_nv.sh b/tools/package_nv.sh new file mode 100755 index 0000000000..96f0930446 --- /dev/null +++ b/tools/package_nv.sh @@ -0,0 +1,70 @@ +#!/bin/bash + +## +## Author......: Jens Steube +## License.....: MIT +## + +export IN=$HOME/oclHashcat +export OUT=$HOME/xy/cudaHashcat-2.00 + +rm -rf $OUT +rm -rf $OUT.7z + +mkdir -p $OUT $OUT/kernels $OUT/kernels/4318 + +cp $IN/cudaHashcat??.exe $OUT/ +cp $IN/cudaHashcat??.bin $OUT/ +cp $IN/hashcat.hcstat $OUT/ + +cp -r $IN/docs $OUT/ +cp -r $IN/charsets $OUT/ +cp -r $IN/masks $OUT/ +cp -r $IN/rules $OUT/ +cp -r $IN/extra $OUT/ +cp $IN/example.dict $OUT/ +cp $IN/example[0123456789]*.hash $OUT/ +cp $IN/cudaExample[0123456789]*.sh $OUT/ +cp $IN/cudaExample[0123456789]*.cmd $OUT/ + +cp -r $IN/kernels/4318/*.cubin $OUT/kernels/4318/ + +dos2unix $OUT/rules/*.rule +dos2unix $OUT/rules/hybrid/*.rule +dos2unix $OUT/docs/* +dos2unix $OUT/example* +dos2unix $OUT/*Example*.sh +dos2unix $OUT/*Example*.cmd + +unix2dos $OUT/masks/*.hcmask +unix2dos $OUT/rules/*.rule +unix2dos $OUT/rules/hybrid/*.rule +unix2dos $OUT/docs/* +unix2dos $OUT/example* +unix2dos $OUT/*Example*.cmd + +chmod 700 $OUT +chmod 700 $OUT/kernels +chmod 700 $OUT/kernels/4318 +chmod 600 $OUT/kernels/4318/* +chmod 700 $OUT/rules +chmod 600 $OUT/rules/* +chmod 700 $OUT/docs +chmod 600 $OUT/docs/* +chmod 700 $OUT/charsets +chmod 700 $OUT/charsets/* +chmod 700 $OUT/masks +chmod 600 $OUT/masks/* +chmod 600 $OUT/example* +chmod 600 $OUT/*Example*.cmd +chmod 700 $OUT/*Example*.sh +chmod 700 $OUT/extra +chmod 700 $OUT/extra/tab_completion/*.sh +chmod 700 $OUT/extra/tab_completion/install +chmod 600 $OUT/extra/rules_optimize/*.exe +chmod 700 $OUT/extra/rules_optimize/*.bin +chmod 600 $OUT/*.exe +chmod 700 $OUT/*.bin +chmod 600 $OUT/hashcat.hcstat + +time 7z a -t7z -m0=lzma2:d28 -mx=9 -mmt=8 -ms=on $OUT.7z $OUT diff --git a/tools/rules_optimize/Makefile b/tools/rules_optimize/Makefile new file mode 100644 index 0000000000..5aea8326ef --- /dev/null +++ b/tools/rules_optimize/Makefile @@ -0,0 +1,22 @@ +## +## Author......: Jens Steube +## License.....: MIT +## + +GCC ?= /usr/bin/x86_64-linux-gnu-gcc +MINGW ?= i686-w64-mingw32-gcc +ROOT := ../.. +CFLAGS := -O2 -s -std=c99 -pipe -W -Wall -I$(ROOT)/include/ -I../rules_test/ +SRC := ./rules_optimize.c +TARGET := $(ROOT)/extra/rules_optimize/rules_optimize + +all: ${TARGET}.bin ${TARGET}.exe + +${TARGET}.bin: $(SRC) + ${GCC} ${CFLAGS} ../rules_test/cpu_rules.c $< -o ${TARGET}.bin + +${TARGET}.exe: $(SRC) + ${MINGW} ${CFLAGS} ../rules_test/cpu_rules.c $< -o ${TARGET}.exe + +clean: + rm -f $(TARGET)*.bin $(TARGET)*.exe diff --git a/tools/rules_optimize/rules_optimize.c b/tools/rules_optimize/rules_optimize.c new file mode 100644 index 0000000000..160d9b426d --- /dev/null +++ b/tools/rules_optimize/rules_optimize.c @@ -0,0 +1,255 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#include +#include +#include +#include +#include +#include + +#define MIN_FUNCTIONS 1 +#define MAX_FUNCTIONS 5 + +int max_len = 0; + +#include "cpu_rules.h" + +typedef struct +{ + char rule_buf[BLOCK_SIZE]; + int rule_len; + +} rule_t; + +static int cmp (const void *p1, const void *p2) +{ + rule_t *r1 = (rule_t *) p1; + rule_t *r2 = (rule_t *) p2; + + return r1->rule_len - r2->rule_len; +} + +int process_block (int o[BLOCK_SIZE], char *block_ptr[BLOCK_SIZE], int block_cnt, char *word_buf, char final_buf[BLOCK_SIZE], int final_len, char rule_buf[BLOCK_SIZE]) +{ + int last_o = o[0]; + + for (int i = 1; i < block_cnt; i++) + { + if (o[i] < last_o) return (0); + } + + memset (rule_buf, 0, BLOCK_SIZE); + + strcat (rule_buf, block_ptr[o[0]]); + + int i; + + for (i = 1; i < block_cnt; i++) + { + strcat (rule_buf, " "); + + strcat (rule_buf, block_ptr[o[i]]); + } + + char out_buf[BLOCK_SIZE]; + + memset (out_buf, 0, sizeof (out_buf)); + + int out_len = apply_rule_cpu (rule_buf, strlen (rule_buf), word_buf, strlen (word_buf), out_buf); + + if (out_len == final_len) + { + if (memcmp (final_buf, out_buf, out_len) == 0) return (1); + } + + return 0; +} + +int next_permutation (int *o, int *p, int k) +{ + p[k]--; + + int j = k % 2 * p[k]; + + int tmp = o[j]; + + o[j] = o[k]; + + o[k] = tmp; + + for (k = 1; p[k] == 0; k++) p[k] = k; + + return k; +} + +int main () +{ + FILE *fp = stdin; + + char line_buf[BUFSIZ]; + + while (!feof (fp)) + { + /* + * line + */ + + char *line_ptr = fgets (line_buf, BUFSIZ, fp); + + if (line_ptr == NULL) continue; + + int line_len = strlen (line_ptr); + + if (line_len && line_ptr[line_len - 1] == '\n') line_len--; + if (line_len && line_ptr[line_len - 1] == '\r') line_len--; + + line_ptr[line_len] = 0; + + /* + * split + */ + + char *word_buf = line_ptr; + + char *sep = strchr (line_ptr, ':'); + + if (sep == NULL) continue; + + *sep = 0; + + int word_len = sep - word_buf; + + if (strstr (word_buf, "$HEX[")) continue; // not yet supported + + char *rule_buf = sep + 1; + + if (strchr (rule_buf, ':')) continue; // another one? ignore line + + /* + * final + */ + + char final_buf[BLOCK_SIZE]; + + memset (final_buf, 0, sizeof (final_buf)); + + int final_len = apply_rule_cpu (rule_buf, strlen (rule_buf), word_buf, strlen (word_buf), final_buf); + + if (final_len < 0) continue; + + if ((final_len == word_len) && (memcmp (word_buf, final_buf, final_len)) == 0) continue; + + /* + * split into blocks + */ + + char *block_ptr[BLOCK_SIZE]; + int block_cnt = 0; + + char *ptr = rule_buf; + + for (char *next = NULL; (next = strchr (ptr, ' ')) != NULL; ptr = next + 1) + { + if (next[1] == ' ') next++; + + *next = 0; + + block_ptr[block_cnt] = ptr; + + block_cnt++; + } + + block_ptr[block_cnt] = ptr; + + block_cnt++; + + if (block_cnt < MIN_FUNCTIONS) continue; // to many + if (block_cnt > MAX_FUNCTIONS) continue; // to many + + /* + * permute blocks, this where the real work starts.. + */ + + int o[BLOCK_SIZE]; + int p[BLOCK_SIZE]; + + for (int i = 0; i < block_cnt + 1; i++) + { + o[i] = i; + p[i] = i; + } + + int k = 1; + + rule_t *rules_buf = (rule_t *) calloc (120 * MAX_FUNCTIONS, sizeof (rule_t)); // 5! = 120, so its guaranteed + int rules_cnt = 0; + + char rule_out_buf[BLOCK_SIZE]; + + for (int i0 = 0, i1 = 1; i0 < block_cnt; i0++, i1++) + { + if (process_block (o, block_ptr, i1, word_buf, final_buf, final_len, rule_out_buf) == 1) + { + memcpy (rules_buf[rules_cnt].rule_buf, rule_out_buf, BLOCK_SIZE); + + rules_buf[rules_cnt].rule_len = i1; + + rules_cnt++; + } + } + + if (block_cnt >= 2) + { + while ((k = next_permutation (o, p, k)) != block_cnt) + { + for (int i0 = 0, i1 = 1; i0 < block_cnt; i0++, i1++) + { + if (process_block (o, block_ptr, i1, word_buf, final_buf, final_len, rule_out_buf) == 1) + { + memcpy (rules_buf[rules_cnt].rule_buf, rule_out_buf, BLOCK_SIZE); + + rules_buf[rules_cnt].rule_len = i1; + + rules_cnt++; + } + } + } + + for (int i0 = 0, i1 = 1; i0 < block_cnt; i0++, i1++) + { + if (process_block (o, block_ptr, i1, word_buf, final_buf, final_len, rule_out_buf) == 1) + { + memcpy (rules_buf[rules_cnt].rule_buf, rule_out_buf, BLOCK_SIZE); + + rules_buf[rules_cnt].rule_len = i1; + + rules_cnt++; + } + } + } + + /** + * sort and output the ones with the less length + */ + + qsort (rules_buf, rules_cnt, sizeof (rule_t), cmp); + + int first_len = rules_buf[0].rule_len; + + for (int i = 0; i < rules_cnt; i++) + { + rule_t *rule_buf = &rules_buf[i]; + + if (rule_buf->rule_len > first_len) break; + + puts (rule_buf->rule_buf); + } + + free (rules_buf); + } + + return 0; +} diff --git a/tools/rules_test/Makefile b/tools/rules_test/Makefile new file mode 100644 index 0000000000..795f74b478 --- /dev/null +++ b/tools/rules_test/Makefile @@ -0,0 +1,17 @@ +## +## Author......: Jens Steube +## License.....: MIT +## + +GCC := /usr/bin/x86_64-linux-gnu-gcc-4.6 +ROOT := ../../ +CFLAGS := -O2 -s -ansi -pipe -W -Wall -I$(ROOT)include/ +LIBS := +TARGET := gpu2cpu_rule_test +INCLUDE := $(ROOT)src/rp_gpu_on_cpu.cpp cpu_rules.cpp + +all: ${TARGET}.cpp + ${GCC} ${CFLAGS} ${INCLUDE} $< -o ${TARGET}.bin ${LIBS} + +clean: + rm -f *.bin diff --git a/tools/rules_test/cpu_rules.c b/tools/rules_test/cpu_rules.c new file mode 100644 index 0000000000..2b9adfe109 --- /dev/null +++ b/tools/rules_test/cpu_rules.c @@ -0,0 +1,1218 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#include "cpu_rules.h" + +extern int max_len; + +/** + * GPU rules + */ + +#define INCR_POS if (++rule_pos == rule_len) return (-1) +#define SET_NAME(rule,val) (rule)->cmds[rule_cnt] = ((val) & 0xff) << 0 +#define SET_P0(rule,val) INCR_POS; (rule)->cmds[rule_cnt] |= ((val) & 0xff) << 8 +#define SET_P1(rule,val) INCR_POS; (rule)->cmds[rule_cnt] |= ((val) & 0xff) << 16 +#define MAX_GPU_RULES 14 +#define GET_NAME(rule) rule_cmd = (((rule)->cmds[rule_cnt] >> 0) & 0xff) +#define GET_P0(rule) INCR_POS; rule_buf[rule_pos] = (((rule)->cmds[rule_cnt] >> 8) & 0xff) +#define GET_P1(rule) INCR_POS; rule_buf[rule_pos] = (((rule)->cmds[rule_cnt] >> 16) & 0xff) + +#define SET_P0_CONV(rule,val) INCR_POS; (rule)->cmds[rule_cnt] |= ((conv_ctoi (val)) & 0xff) << 8 +#define SET_P1_CONV(rule,val) INCR_POS; (rule)->cmds[rule_cnt] |= ((conv_ctoi (val)) & 0xff) << 16 +#define GET_P0_CONV(rule) INCR_POS; rule_buf[rule_pos] = conv_itoc (((rule)->cmds[rule_cnt] >> 8) & 0xff) +#define GET_P1_CONV(rule) INCR_POS; rule_buf[rule_pos] = conv_itoc (((rule)->cmds[rule_cnt] >> 16) & 0xff) + +void gen_cmask (const uint8_t *word, uint8_t *cmask, const uint len) +{ + uint i; + + for (i = 0; i < len; i++) + { + if (class_alpha (word[i]) == 0) + { + cmask[i] = 0; + } + else + { + cmask[i] = 0xff; + } + } +} + +/** + * CPU rules + */ + +#define NEXT_RULEPOS(rp) if (++(rp) == rule_len) return (RULE_RC_SYNTAX_ERROR) +#define NEXT_RPTOI(r,rp,up) if (((up) = conv_ctoi ((r)[(rp)])) == -1) return (RULE_RC_SYNTAX_ERROR) + +#define MANGLE_TOGGLE_AT(a,p) if (class_alpha ((a)[(p)])) (a)[(p)] ^= 0x20 +#define MANGLE_LOWER_AT(a,p) if (class_upper ((a)[(p)])) (a)[(p)] ^= 0x20 +#define MANGLE_UPPER_AT(a,p) if (class_lower ((a)[(p)])) (a)[(p)] ^= 0x20 + +/* #define MANGLE_SWITCH(a,l,r) { char c = (l); arr[(r)] = arr[(l)]; arr[(l)] = c; } */ +/* #define MANGLE_SWITCH(a,l,r) { char c = (l); (a)[(r)] = (a)[(l)]; (a)[(l)] = c; } */ +#define MANGLE_SWITCH(a,l,r) { char c = (a)[(r)]; (a)[(r)] = (a)[(l)]; (a)[(l)] = c; } + +int mangle_lrest (char arr[BLOCK_SIZE], int arr_len) +{ + int pos; + + for (pos = 0; pos < arr_len; pos++) MANGLE_LOWER_AT (arr, pos); + + return (arr_len); +} + +int mangle_urest (char arr[BLOCK_SIZE], int arr_len) +{ + int pos; + + for (pos = 0; pos < arr_len; pos++) MANGLE_UPPER_AT (arr, pos); + + return (arr_len); +} + +int mangle_trest (char arr[BLOCK_SIZE], int arr_len) +{ + int pos; + + for (pos = 0; pos < arr_len; pos++) MANGLE_TOGGLE_AT (arr, pos); + + return (arr_len); +} + +int mangle_reverse (char arr[BLOCK_SIZE], int arr_len) +{ + int l; + int r; + + for (l = 0; l < arr_len; l++) + { + r = arr_len - 1 - l; + + if (l >= r) break; + + MANGLE_SWITCH (arr, l, r); + } + + return (arr_len); +} + +int mangle_double (char arr[BLOCK_SIZE], int arr_len) +{ + if ((arr_len * 2) >= BLOCK_SIZE) return (arr_len); + + memcpy (&arr[arr_len], arr, (size_t) arr_len); + + return (arr_len * 2); +} + +int mangle_double_times (char arr[BLOCK_SIZE], int arr_len, int times) +{ + if (((arr_len * times) + arr_len) >= BLOCK_SIZE) return (arr_len); + + int orig_len = arr_len; + + int i; + + for (i = 0; i < times; i++) + { + memcpy (&arr[arr_len], arr, orig_len); + + arr_len += orig_len; + } + + return (arr_len); +} + +int mangle_reflect (char arr[BLOCK_SIZE], int arr_len) +{ + if ((arr_len * 2) >= BLOCK_SIZE) return (arr_len); + + mangle_double (arr, arr_len); + + mangle_reverse (arr + arr_len, arr_len); + + return (arr_len * 2); +} + +int mangle_rotate_left (char arr[BLOCK_SIZE], int arr_len) +{ + int l; + int r; + + for (l = 0, r = arr_len - 1; r > 0; r--) + { + MANGLE_SWITCH (arr, l, r); + } + + return (arr_len); +} + +int mangle_rotate_right (char arr[BLOCK_SIZE], int arr_len) +{ + int l; + int r; + + for (l = 0, r = arr_len - 1; l < r; l++) + { + MANGLE_SWITCH (arr, l, r); + } + + return (arr_len); +} + +int mangle_append (char arr[BLOCK_SIZE], int arr_len, char c) +{ + if ((arr_len + 1) >= BLOCK_SIZE) return (arr_len); + + arr[arr_len] = c; + + return (arr_len + 1); +} + +int mangle_prepend (char arr[BLOCK_SIZE], int arr_len, char c) +{ + if ((arr_len + 1) >= BLOCK_SIZE) return (arr_len); + + int arr_pos; + + for (arr_pos = arr_len - 1; arr_pos > -1; arr_pos--) + { + arr[arr_pos + 1] = arr[arr_pos]; + } + + arr[0] = c; + + return (arr_len + 1); +} + +int mangle_delete_at (char arr[BLOCK_SIZE], int arr_len, int upos) +{ + if (upos >= arr_len) return (arr_len); + + int arr_pos; + + for (arr_pos = upos; arr_pos < arr_len - 1; arr_pos++) + { + arr[arr_pos] = arr[arr_pos + 1]; + } + + return (arr_len - 1); +} + +int mangle_extract (char arr[BLOCK_SIZE], int arr_len, int upos, int ulen) +{ + if (upos >= arr_len) return (arr_len); + + if ((upos + ulen) > arr_len) return (arr_len); + + int arr_pos; + + for (arr_pos = 0; arr_pos < ulen; arr_pos++) + { + arr[arr_pos] = arr[upos + arr_pos]; + } + + return (ulen); +} + +int mangle_omit (char arr[BLOCK_SIZE], int arr_len, int upos, int ulen) +{ + if (upos >= arr_len) return (arr_len); + + if ((upos + ulen) > arr_len) return (arr_len); + + int arr_pos; + + for (arr_pos = upos; arr_pos < arr_len - ulen; arr_pos++) + { + arr[arr_pos] = arr[arr_pos + ulen]; + } + + return (arr_len - ulen); +} + +int mangle_insert (char arr[BLOCK_SIZE], int arr_len, int upos, char c) +{ + if (upos > arr_len) return (arr_len); + + if ((arr_len + 1) >= BLOCK_SIZE) return (arr_len); + + int arr_pos; + + for (arr_pos = arr_len - 1; arr_pos > upos - 1; arr_pos--) + { + arr[arr_pos + 1] = arr[arr_pos]; + } + + arr[upos] = c; + + return (arr_len + 1); +} + +int mangle_insert_multi (char arr[BLOCK_SIZE], int arr_len, int arr_pos, char arr2[BLOCK_SIZE], int arr2_len, int arr2_pos, int arr2_cpy) +{ + if ((arr_len + arr2_cpy) > BLOCK_SIZE) return (RULE_RC_REJECT_ERROR); + + if (arr_pos > arr_len) return (RULE_RC_REJECT_ERROR); + + if (arr2_pos > arr2_len) return (RULE_RC_REJECT_ERROR); + + if ((arr2_pos + arr2_cpy) > arr2_len) return (RULE_RC_REJECT_ERROR); + + if (arr2_cpy < 1) return (RULE_RC_SYNTAX_ERROR); + + memcpy (arr2, arr2 + arr2_pos, arr2_len - arr2_pos); + + memcpy (arr2 + arr2_cpy, arr + arr_pos, arr_len - arr_pos); + + memcpy (arr + arr_pos, arr2, arr_len - arr_pos + arr2_cpy); + + return (arr_len + arr2_cpy); +} + +int mangle_overstrike (char arr[BLOCK_SIZE], int arr_len, int upos, char c) +{ + if (upos >= arr_len) return (arr_len); + + arr[upos] = c; + + return (arr_len); +} + +int mangle_truncate_at (char arr[BLOCK_SIZE], int arr_len, int upos) +{ + if (upos >= arr_len) return (arr_len); + + memset (arr + upos, 0, arr_len - upos); + + return (upos); +} + +int mangle_replace (char arr[BLOCK_SIZE], int arr_len, char oldc, char newc) +{ + int arr_pos; + + for (arr_pos = 0; arr_pos < arr_len; arr_pos++) + { + if (arr[arr_pos] != oldc) continue; + + arr[arr_pos] = newc; + } + + return (arr_len); +} + +int mangle_purgechar (char arr[BLOCK_SIZE], int arr_len, char c) +{ + int arr_pos; + + int ret_len; + + for (ret_len = 0, arr_pos = 0; arr_pos < arr_len; arr_pos++) + { + if (arr[arr_pos] == c) continue; + + arr[ret_len] = arr[arr_pos]; + + ret_len++; + } + + return (ret_len); +} + +int mangle_dupeblock_prepend (char arr[BLOCK_SIZE], int arr_len, int ulen) +{ + if (ulen > arr_len) return (arr_len); + + if ((arr_len + ulen) >= BLOCK_SIZE) return (arr_len); + + char cs[100]; + + memcpy (cs, arr, ulen); + + int i; + + for (i = 0; i < ulen; i++) + { + char c = cs[i]; + + arr_len = mangle_insert (arr, arr_len, i, c); + } + + return (arr_len); +} + +int mangle_dupeblock_append (char arr[BLOCK_SIZE], int arr_len, int ulen) +{ + if (ulen > arr_len) return (arr_len); + + if ((arr_len + ulen) >= BLOCK_SIZE) return (arr_len); + + int upos = arr_len - ulen; + + int i; + + for (i = 0; i < ulen; i++) + { + char c = arr[upos + i]; + + arr_len = mangle_append (arr, arr_len, c); + } + + return (arr_len); +} + +int mangle_dupechar_at (char arr[BLOCK_SIZE], int arr_len, int upos, int ulen) +{ + if ( arr_len == 0) return (arr_len); + if ((arr_len + ulen) >= BLOCK_SIZE) return (arr_len); + + char c = arr[upos]; + + int i; + + for (i = 0; i < ulen; i++) + { + arr_len = mangle_insert (arr, arr_len, upos, c); + } + + return (arr_len); +} + +int mangle_dupechar (char arr[BLOCK_SIZE], int arr_len) +{ + if ( arr_len == 0) return (arr_len); + if ((arr_len + arr_len) >= BLOCK_SIZE) return (arr_len); + + int arr_pos; + + for (arr_pos = arr_len - 1; arr_pos > -1; arr_pos--) + { + int new_pos = arr_pos * 2; + + arr[new_pos] = arr[arr_pos]; + + arr[new_pos + 1] = arr[arr_pos]; + } + + return (arr_len * 2); +} + +int mangle_switch_at_check (char arr[BLOCK_SIZE], int arr_len, int upos, int upos2) +{ + if (upos >= arr_len) return (arr_len); + if (upos2 >= arr_len) return (arr_len); + + MANGLE_SWITCH (arr, upos, upos2); + + return (arr_len); +} + +int mangle_switch_at (char arr[BLOCK_SIZE], int arr_len, int upos, int upos2) +{ + MANGLE_SWITCH (arr, upos, upos2); + + return (arr_len); +} + +int mangle_chr_shiftl (uint8_t arr[BLOCK_SIZE], int arr_len, int upos) +{ + if (upos >= arr_len) return (arr_len); + + arr[upos] <<= 1; + + return (arr_len); +} + +int mangle_chr_shiftr (uint8_t arr[BLOCK_SIZE], int arr_len, int upos) +{ + if (upos >= arr_len) return (arr_len); + + arr[upos] >>= 1; + + return (arr_len); +} + +int mangle_chr_incr (uint8_t arr[BLOCK_SIZE], int arr_len, int upos) +{ + if (upos >= arr_len) return (arr_len); + + arr[upos] += 1; + + return (arr_len); +} + +int mangle_chr_decr (uint8_t arr[BLOCK_SIZE], int arr_len, int upos) +{ + if (upos >= arr_len) return (arr_len); + + arr[upos] -= 1; + + return (arr_len); +} + +int mangle_title (char arr[BLOCK_SIZE], int arr_len) +{ + int upper_next = 1; + + int pos; + + for (pos = 0; pos < arr_len; pos++) + { + if (arr[pos] == ' ') + { + upper_next = 1; + + continue; + } + + if (upper_next) + { + upper_next = 0; + + MANGLE_UPPER_AT (arr, pos); + } + else + { + MANGLE_LOWER_AT (arr, pos); + } + } + + return (arr_len); +} + +int generate_random_rule (char rule_buf[RP_RULE_BUFSIZ], uint32_t rp_gen_func_min, uint32_t rp_gen_func_max) +{ + uint32_t rp_gen_num = get_random_num (rp_gen_func_min, rp_gen_func_max); + + uint32_t j; + + uint32_t rule_pos = 0; + + for (j = 0; j < rp_gen_num; j++) + { + uint32_t r = 0; + uint32_t p1 = 0; + uint32_t p2 = 0; + uint32_t p3 = 0; + + switch ((char) get_random_num (0, 9)) + { + case 0: + r = get_random_num (0, sizeof (grp_op_nop)); + rule_buf[rule_pos++] = grp_op_nop[r]; + break; + + case 1: + r = get_random_num (0, sizeof (grp_op_pos_p0)); + rule_buf[rule_pos++] = grp_op_pos_p0[r]; + p1 = get_random_num (0, sizeof (grp_pos)); + rule_buf[rule_pos++] = grp_pos[p1]; + break; + + case 2: + r = get_random_num (0, sizeof (grp_op_pos_p1)); + rule_buf[rule_pos++] = grp_op_pos_p1[r]; + p1 = get_random_num (1, 6); + rule_buf[rule_pos++] = grp_pos[p1]; + break; + + case 3: + r = get_random_num (0, sizeof (grp_op_chr)); + rule_buf[rule_pos++] = grp_op_chr[r]; + p1 = get_random_num (0x20, 0x7e); + rule_buf[rule_pos++] = (char) p1; + break; + + case 4: + r = get_random_num (0, sizeof (grp_op_chr_chr)); + rule_buf[rule_pos++] = grp_op_chr_chr[r]; + p1 = get_random_num (0x20, 0x7e); + rule_buf[rule_pos++] = (char) p1; + p2 = get_random_num (0x20, 0x7e); + while (p1 == p2) + p2 = get_random_num (0x20, 0x7e); + rule_buf[rule_pos++] = (char) p2; + break; + + case 5: + r = get_random_num (0, sizeof (grp_op_pos_chr)); + rule_buf[rule_pos++] = grp_op_pos_chr[r]; + p1 = get_random_num (0, sizeof (grp_pos)); + rule_buf[rule_pos++] = grp_pos[p1]; + p2 = get_random_num (0x20, 0x7e); + rule_buf[rule_pos++] = (char) p2; + break; + + case 6: + r = get_random_num (0, sizeof (grp_op_pos_pos0)); + rule_buf[rule_pos++] = grp_op_pos_pos0[r]; + p1 = get_random_num (0, sizeof (grp_pos)); + rule_buf[rule_pos++] = grp_pos[p1]; + p2 = get_random_num (0, sizeof (grp_pos)); + while (p1 == p2) + p2 = get_random_num (0, sizeof (grp_pos)); + rule_buf[rule_pos++] = grp_pos[p2]; + break; + + case 7: + r = get_random_num (0, sizeof (grp_op_pos_pos1)); + rule_buf[rule_pos++] = grp_op_pos_pos1[r]; + p1 = get_random_num (0, sizeof (grp_pos)); + rule_buf[rule_pos++] = grp_pos[p1]; + p2 = get_random_num (1, sizeof (grp_pos)); + while (p1 == p2) + p2 = get_random_num (1, sizeof (grp_pos)); + rule_buf[rule_pos++] = grp_pos[p2]; + break; + + case 8: + r = get_random_num (0, sizeof (grp_op_pos1_pos2_pos3)); + rule_buf[rule_pos++] = grp_op_pos1_pos2_pos3[r]; + p1 = get_random_num (0, sizeof (grp_pos)); + rule_buf[rule_pos++] = grp_pos[p1]; + p2 = get_random_num (1, sizeof (grp_pos)); + rule_buf[rule_pos++] = grp_pos[p1]; + p3 = get_random_num (0, sizeof (grp_pos)); + rule_buf[rule_pos++] = grp_pos[p3]; + break; + } + } + + return (rule_pos); +} + +int apply_rule_cpu (char *rule, int rule_len, char in[BLOCK_SIZE], int in_len, char out[BLOCK_SIZE]) +{ + char mem[BLOCK_SIZE]; + + if (in == NULL) return (RULE_RC_REJECT_ERROR); + + if (out == NULL) return (RULE_RC_REJECT_ERROR); + + if (in_len < 1) return (RULE_RC_REJECT_ERROR); + + if (rule_len < 1) return (RULE_RC_REJECT_ERROR); + + int out_len = in_len; + int mem_len = in_len; + + memcpy (out, in, out_len); + + int rule_pos; + + for (rule_pos = 0; rule_pos < rule_len; rule_pos++) + { + int upos; int upos2; + int ulen; + + switch (rule[rule_pos]) + { + case ' ': + break; + + case RULE_OP_MANGLE_NOOP: + break; + + case RULE_OP_MANGLE_LREST: + out_len = mangle_lrest (out, out_len); + break; + + case RULE_OP_MANGLE_UREST: + out_len = mangle_urest (out, out_len); + break; + + case RULE_OP_MANGLE_LREST_UFIRST: + out_len = mangle_lrest (out, out_len); + if (out_len) MANGLE_UPPER_AT (out, 0); + break; + + case RULE_OP_MANGLE_UREST_LFIRST: + out_len = mangle_urest (out, out_len); + if (out_len) MANGLE_LOWER_AT (out, 0); + break; + + case RULE_OP_MANGLE_TREST: + out_len = mangle_trest (out, out_len); + break; + + case RULE_OP_MANGLE_TOGGLE_AT: + NEXT_RULEPOS (rule_pos); + NEXT_RPTOI (rule, rule_pos, upos); + if (upos < out_len) MANGLE_TOGGLE_AT (out, upos); + break; + + case RULE_OP_MANGLE_REVERSE: + out_len = mangle_reverse (out, out_len); + break; + + case RULE_OP_MANGLE_DUPEWORD: + out_len = mangle_double (out, out_len); + break; + + case RULE_OP_MANGLE_DUPEWORD_TIMES: + NEXT_RULEPOS (rule_pos); + NEXT_RPTOI (rule, rule_pos, ulen); + out_len = mangle_double_times (out, out_len, ulen); + break; + + case RULE_OP_MANGLE_REFLECT: + out_len = mangle_reflect (out, out_len); + break; + + case RULE_OP_MANGLE_ROTATE_LEFT: + mangle_rotate_left (out, out_len); + break; + + case RULE_OP_MANGLE_ROTATE_RIGHT: + mangle_rotate_right (out, out_len); + break; + + case RULE_OP_MANGLE_APPEND: + NEXT_RULEPOS (rule_pos); + out_len = mangle_append (out, out_len, rule[rule_pos]); + break; + + case RULE_OP_MANGLE_PREPEND: + NEXT_RULEPOS (rule_pos); + out_len = mangle_prepend (out, out_len, rule[rule_pos]); + break; + + case RULE_OP_MANGLE_DELETE_FIRST: + out_len = mangle_delete_at (out, out_len, 0); + break; + + case RULE_OP_MANGLE_DELETE_LAST: + out_len = mangle_delete_at (out, out_len, (out_len) ? out_len - 1 : 0); + break; + + case RULE_OP_MANGLE_DELETE_AT: + NEXT_RULEPOS (rule_pos); + NEXT_RPTOI (rule, rule_pos, upos); + out_len = mangle_delete_at (out, out_len, upos); + break; + + case RULE_OP_MANGLE_EXTRACT: + NEXT_RULEPOS (rule_pos); + NEXT_RPTOI (rule, rule_pos, upos); + NEXT_RULEPOS (rule_pos); + NEXT_RPTOI (rule, rule_pos, ulen); + out_len = mangle_extract (out, out_len, upos, ulen); + break; + + case RULE_OP_MANGLE_OMIT: + NEXT_RULEPOS (rule_pos); + NEXT_RPTOI (rule, rule_pos, upos); + NEXT_RULEPOS (rule_pos); + NEXT_RPTOI (rule, rule_pos, ulen); + out_len = mangle_omit (out, out_len, upos, ulen); + break; + + case RULE_OP_MANGLE_INSERT: + NEXT_RULEPOS (rule_pos); + NEXT_RPTOI (rule, rule_pos, upos); + NEXT_RULEPOS (rule_pos); + out_len = mangle_insert (out, out_len, upos, rule[rule_pos]); + break; + + case RULE_OP_MANGLE_OVERSTRIKE: + NEXT_RULEPOS (rule_pos); + NEXT_RPTOI (rule, rule_pos, upos); + NEXT_RULEPOS (rule_pos); + out_len = mangle_overstrike (out, out_len, upos, rule[rule_pos]); + break; + + case RULE_OP_MANGLE_TRUNCATE_AT: + NEXT_RULEPOS (rule_pos); + NEXT_RPTOI (rule, rule_pos, upos); + out_len = mangle_truncate_at (out, out_len, upos); + break; + + case RULE_OP_MANGLE_REPLACE: + NEXT_RULEPOS (rule_pos); + NEXT_RULEPOS (rule_pos); + out_len = mangle_replace (out, out_len, rule[rule_pos - 1], rule[rule_pos]); + break; + + case RULE_OP_MANGLE_PURGECHAR: + NEXT_RULEPOS (rule_pos); + out_len = mangle_purgechar (out, out_len, rule[rule_pos]); + break; + + case RULE_OP_MANGLE_TOGGLECASE_REC: + /* todo */ + break; + + case RULE_OP_MANGLE_DUPECHAR_FIRST: + NEXT_RULEPOS (rule_pos); + NEXT_RPTOI (rule, rule_pos, ulen); + out_len = mangle_dupechar_at (out, out_len, 0, ulen); + break; + + case RULE_OP_MANGLE_DUPECHAR_LAST: + NEXT_RULEPOS (rule_pos); + NEXT_RPTOI (rule, rule_pos, ulen); + out_len = mangle_dupechar_at (out, out_len, out_len - 1, ulen); + break; + + case RULE_OP_MANGLE_DUPECHAR_ALL: + out_len = mangle_dupechar (out, out_len); + break; + + case RULE_OP_MANGLE_DUPEBLOCK_FIRST: + NEXT_RULEPOS (rule_pos); + NEXT_RPTOI (rule, rule_pos, ulen); + out_len = mangle_dupeblock_prepend (out, out_len, ulen); + break; + + case RULE_OP_MANGLE_DUPEBLOCK_LAST: + NEXT_RULEPOS (rule_pos); + NEXT_RPTOI (rule, rule_pos, ulen); + out_len = mangle_dupeblock_append (out, out_len, ulen); + break; + + case RULE_OP_MANGLE_SWITCH_FIRST: + if (out_len >= 2) mangle_switch_at (out, out_len, 0, 1); + break; + + case RULE_OP_MANGLE_SWITCH_LAST: + if (out_len >= 2) mangle_switch_at (out, out_len, out_len - 1, out_len - 2); + break; + + case RULE_OP_MANGLE_SWITCH_AT: + NEXT_RULEPOS (rule_pos); + NEXT_RPTOI (rule, rule_pos, upos); + NEXT_RULEPOS (rule_pos); + NEXT_RPTOI (rule, rule_pos, upos2); + out_len = mangle_switch_at_check (out, out_len, upos, upos2); + break; + + case RULE_OP_MANGLE_CHR_SHIFTL: + NEXT_RULEPOS (rule_pos); + NEXT_RPTOI (rule, rule_pos, upos); + mangle_chr_shiftl ((uint8_t *) out, out_len, upos); + break; + + case RULE_OP_MANGLE_CHR_SHIFTR: + NEXT_RULEPOS (rule_pos); + NEXT_RPTOI (rule, rule_pos, upos); + mangle_chr_shiftr ((uint8_t *) out, out_len, upos); + break; + + case RULE_OP_MANGLE_CHR_INCR: + NEXT_RULEPOS (rule_pos); + NEXT_RPTOI (rule, rule_pos, upos); + mangle_chr_incr ((uint8_t *) out, out_len, upos); + break; + + case RULE_OP_MANGLE_CHR_DECR: + NEXT_RULEPOS (rule_pos); + NEXT_RPTOI (rule, rule_pos, upos); + mangle_chr_decr ((uint8_t *) out, out_len, upos); + break; + + case RULE_OP_MANGLE_REPLACE_NP1: + NEXT_RULEPOS (rule_pos); + NEXT_RPTOI (rule, rule_pos, upos); + if ((upos >= 0) && ((upos + 1) < out_len)) mangle_overstrike (out, out_len, upos, out[upos + 1]); + break; + + case RULE_OP_MANGLE_REPLACE_NM1: + NEXT_RULEPOS (rule_pos); + NEXT_RPTOI (rule, rule_pos, upos); + if ((upos >= 1) && ((upos + 0) < out_len)) mangle_overstrike (out, out_len, upos, out[upos - 1]); + break; + + case RULE_OP_MANGLE_TITLE: + mangle_title (out, out_len); + break; + + case RULE_OP_MANGLE_EXTRACT_MEMORY: + if (mem_len < 1) return (RULE_RC_REJECT_ERROR); + NEXT_RULEPOS (rule_pos); + NEXT_RPTOI (rule, rule_pos, upos); + NEXT_RULEPOS (rule_pos); + NEXT_RPTOI (rule, rule_pos, ulen); + NEXT_RULEPOS (rule_pos); + NEXT_RPTOI (rule, rule_pos, upos2); + if ((out_len = mangle_insert_multi (out, out_len, upos2, mem, mem_len, upos, ulen)) < 1) return (out_len); + break; + + case RULE_OP_MANGLE_APPEND_MEMORY: + if (mem_len < 1) return (RULE_RC_REJECT_ERROR); + if ((out_len + mem_len) > BLOCK_SIZE) return (RULE_RC_REJECT_ERROR); + memcpy (out + out_len, mem, mem_len); + out_len += mem_len; + break; + + case RULE_OP_MANGLE_PREPEND_MEMORY: + if (mem_len < 1) return (RULE_RC_REJECT_ERROR); + if ((mem_len + out_len) > BLOCK_SIZE) return (RULE_RC_REJECT_ERROR); + memcpy (mem + mem_len, out, out_len); + out_len += mem_len; + memcpy (out, mem, out_len); + break; + + case RULE_OP_MEMORIZE_WORD: + memcpy (mem, out, out_len); + mem_len = out_len; + break; + + case RULE_OP_REJECT_LESS: + NEXT_RULEPOS (rule_pos); + NEXT_RPTOI (rule, rule_pos, upos); + if (out_len > upos) return (RULE_RC_REJECT_ERROR); + break; + + case RULE_OP_REJECT_GREATER: + NEXT_RULEPOS (rule_pos); + NEXT_RPTOI (rule, rule_pos, upos); + if (out_len < upos) return (RULE_RC_REJECT_ERROR); + break; + + case RULE_OP_REJECT_CONTAIN: + NEXT_RULEPOS (rule_pos); + if (strchr (out, rule[rule_pos]) != NULL) return (RULE_RC_REJECT_ERROR); + break; + + case RULE_OP_REJECT_NOT_CONTAIN: + NEXT_RULEPOS (rule_pos); + if (strchr (out, rule[rule_pos]) == NULL) return (RULE_RC_REJECT_ERROR); + break; + + case RULE_OP_REJECT_EQUAL_FIRST: + NEXT_RULEPOS (rule_pos); + if (out[0] != rule[rule_pos]) return (RULE_RC_REJECT_ERROR); + break; + + case RULE_OP_REJECT_EQUAL_LAST: + NEXT_RULEPOS (rule_pos); + if (out[out_len - 1] != rule[rule_pos]) return (RULE_RC_REJECT_ERROR); + break; + + case RULE_OP_REJECT_EQUAL_AT: + NEXT_RULEPOS (rule_pos); + NEXT_RPTOI (rule, rule_pos, upos); + if ((upos + 1) > out_len) return (RULE_RC_REJECT_ERROR); + NEXT_RULEPOS (rule_pos); + if (out[upos] != rule[rule_pos]) return (RULE_RC_REJECT_ERROR); + break; + + case RULE_OP_REJECT_CONTAINS: + NEXT_RULEPOS (rule_pos); + NEXT_RPTOI (rule, rule_pos, upos); + if ((upos + 1) > out_len) return (RULE_RC_REJECT_ERROR); + NEXT_RULEPOS (rule_pos); + int c; int cnt; for (c = 0, cnt = 0; c < out_len; c++) if (out[c] == rule[rule_pos]) cnt++; + if (cnt < upos) return (RULE_RC_REJECT_ERROR); + break; + + case RULE_OP_REJECT_MEMORY: + if ((out_len == mem_len) && (memcmp (out, mem, out_len) == 0)) return (RULE_RC_REJECT_ERROR); + break; + + default: + return (RULE_RC_SYNTAX_ERROR); + break; + } + + max_len = (out_len > max_len) ? out_len : max_len; + } + + memset (out + out_len, 0, BLOCK_SIZE - out_len); + + return (out_len); +} + +int cpu_rule_to_gpu_rule (char rule_buf[BUFSIZ], uint rule_len, gpu_rule_t *rule) +{ + uint rule_pos; + uint rule_cnt; + + for (rule_pos = 0, rule_cnt = 0; rule_pos < rule_len && rule_cnt < MAX_GPU_RULES; rule_pos++, rule_cnt++) + { + switch (rule_buf[rule_pos]) + { + case ' ': + rule_cnt--; + break; + + case RULE_OP_MANGLE_NOOP: + SET_NAME (rule, rule_buf[rule_pos]); + break; + + case RULE_OP_MANGLE_LREST: + SET_NAME (rule, rule_buf[rule_pos]); + break; + + case RULE_OP_MANGLE_UREST: + SET_NAME (rule, rule_buf[rule_pos]); + break; + + case RULE_OP_MANGLE_LREST_UFIRST: + SET_NAME (rule, rule_buf[rule_pos]); + break; + + case RULE_OP_MANGLE_UREST_LFIRST: + SET_NAME (rule, rule_buf[rule_pos]); + break; + + case RULE_OP_MANGLE_TREST: + SET_NAME (rule, rule_buf[rule_pos]); + break; + + case RULE_OP_MANGLE_TOGGLE_AT: + SET_NAME (rule, rule_buf[rule_pos]); + SET_P0_CONV (rule, rule_buf[rule_pos]); + break; + + case RULE_OP_MANGLE_REVERSE: + SET_NAME (rule, rule_buf[rule_pos]); + break; + + case RULE_OP_MANGLE_DUPEWORD: + SET_NAME (rule, rule_buf[rule_pos]); + break; + + case RULE_OP_MANGLE_DUPEWORD_TIMES: + SET_NAME (rule, rule_buf[rule_pos]); + SET_P0_CONV (rule, rule_buf[rule_pos]); + break; + + case RULE_OP_MANGLE_REFLECT: + SET_NAME (rule, rule_buf[rule_pos]); + break; + + case RULE_OP_MANGLE_ROTATE_LEFT: + SET_NAME (rule, rule_buf[rule_pos]); + break; + + case RULE_OP_MANGLE_ROTATE_RIGHT: + SET_NAME (rule, rule_buf[rule_pos]); + break; + + case RULE_OP_MANGLE_APPEND: + SET_NAME (rule, rule_buf[rule_pos]); + SET_P0 (rule, rule_buf[rule_pos]); + break; + + case RULE_OP_MANGLE_PREPEND: + SET_NAME (rule, rule_buf[rule_pos]); + SET_P0 (rule, rule_buf[rule_pos]); + break; + + case RULE_OP_MANGLE_DELETE_FIRST: + SET_NAME (rule, rule_buf[rule_pos]); + break; + + case RULE_OP_MANGLE_DELETE_LAST: + SET_NAME (rule, rule_buf[rule_pos]); + break; + + case RULE_OP_MANGLE_DELETE_AT: + SET_NAME (rule, rule_buf[rule_pos]); + SET_P0_CONV (rule, rule_buf[rule_pos]); + break; + + case RULE_OP_MANGLE_EXTRACT: + SET_NAME (rule, rule_buf[rule_pos]); + SET_P0_CONV (rule, rule_buf[rule_pos]); + SET_P1_CONV (rule, rule_buf[rule_pos]); + break; + + case RULE_OP_MANGLE_OMIT: + SET_NAME (rule, rule_buf[rule_pos]); + SET_P0_CONV (rule, rule_buf[rule_pos]); + SET_P1_CONV (rule, rule_buf[rule_pos]); + break; + + case RULE_OP_MANGLE_INSERT: + SET_NAME (rule, rule_buf[rule_pos]); + SET_P0_CONV (rule, rule_buf[rule_pos]); + SET_P1 (rule, rule_buf[rule_pos]); + break; + + case RULE_OP_MANGLE_OVERSTRIKE: + SET_NAME (rule, rule_buf[rule_pos]); + SET_P0_CONV (rule, rule_buf[rule_pos]); + SET_P1 (rule, rule_buf[rule_pos]); + break; + + case RULE_OP_MANGLE_TRUNCATE_AT: + SET_NAME (rule, rule_buf[rule_pos]); + SET_P0_CONV (rule, rule_buf[rule_pos]); + break; + + case RULE_OP_MANGLE_REPLACE: + SET_NAME (rule, rule_buf[rule_pos]); + SET_P0 (rule, rule_buf[rule_pos]); + SET_P1 (rule, rule_buf[rule_pos]); + break; + + case RULE_OP_MANGLE_PURGECHAR: + return (-1); + break; + + case RULE_OP_MANGLE_TOGGLECASE_REC: + return (-1); + break; + + case RULE_OP_MANGLE_DUPECHAR_FIRST: + SET_NAME (rule, rule_buf[rule_pos]); + SET_P0_CONV (rule, rule_buf[rule_pos]); + break; + + case RULE_OP_MANGLE_DUPECHAR_LAST: + SET_NAME (rule, rule_buf[rule_pos]); + SET_P0_CONV (rule, rule_buf[rule_pos]); + break; + + case RULE_OP_MANGLE_DUPECHAR_ALL: + SET_NAME (rule, rule_buf[rule_pos]); + break; + + case RULE_OP_MANGLE_SWITCH_FIRST: + SET_NAME (rule, rule_buf[rule_pos]); + break; + + case RULE_OP_MANGLE_SWITCH_LAST: + SET_NAME (rule, rule_buf[rule_pos]); + break; + + case RULE_OP_MANGLE_SWITCH_AT: + SET_NAME (rule, rule_buf[rule_pos]); + SET_P0_CONV (rule, rule_buf[rule_pos]); + SET_P1_CONV (rule, rule_buf[rule_pos]); + break; + + case RULE_OP_MANGLE_CHR_SHIFTL: + SET_NAME (rule, rule_buf[rule_pos]); + SET_P0_CONV (rule, rule_buf[rule_pos]); + break; + + case RULE_OP_MANGLE_CHR_SHIFTR: + SET_NAME (rule, rule_buf[rule_pos]); + SET_P0_CONV (rule, rule_buf[rule_pos]); + break; + + case RULE_OP_MANGLE_CHR_INCR: + SET_NAME (rule, rule_buf[rule_pos]); + SET_P0_CONV (rule, rule_buf[rule_pos]); + break; + + case RULE_OP_MANGLE_CHR_DECR: + SET_NAME (rule, rule_buf[rule_pos]); + SET_P0_CONV (rule, rule_buf[rule_pos]); + break; + + case RULE_OP_MANGLE_REPLACE_NP1: + SET_NAME (rule, rule_buf[rule_pos]); + SET_P0_CONV (rule, rule_buf[rule_pos]); + break; + + case RULE_OP_MANGLE_REPLACE_NM1: + SET_NAME (rule, rule_buf[rule_pos]); + SET_P0_CONV (rule, rule_buf[rule_pos]); + break; + + case RULE_OP_MANGLE_DUPEBLOCK_FIRST: + SET_NAME (rule, rule_buf[rule_pos]); + SET_P0_CONV (rule, rule_buf[rule_pos]); + break; + + case RULE_OP_MANGLE_DUPEBLOCK_LAST: + SET_NAME (rule, rule_buf[rule_pos]); + SET_P0_CONV (rule, rule_buf[rule_pos]); + break; + + case RULE_OP_MANGLE_TITLE: + SET_NAME (rule, rule_buf[rule_pos]); + break; + + default: + return (-1); + break; + } + } + + if (rule_pos < rule_len) return (-1); + + return (0); +} + +/** + * rules common + */ + +bool class_num (char c) +{ + return ((c >= '0') && (c <= '9')); +} + +bool class_lower (char c) +{ + return ((c >= 'a') && (c <= 'z')); +} + +bool class_upper (char c) +{ + return ((c >= 'A') && (c <= 'Z')); +} + +bool class_alpha (char c) +{ + return (class_lower (c) || class_upper (c)); +} + +char conv_ctoi (char c) +{ + if (class_num (c)) + { + return c - '0'; + } + else if (class_upper (c)) + { + return c - 'A' + (char) 10; + } + + return (char) (-1); +} + +char conv_itoc (char c) +{ + if (c < 10) + { + return c + '0'; + } + else if (c < 37) + { + return c + 'A' - (char) 10; + } + + return (char) (-1); +} + +uint get_random_num (uint min, uint max) +{ + if (min == max) return (min); + + uint data; + + FILE *fp = fopen("/dev/urandom", "rb"); + + if (fp == NULL) exit (1); + + if ((fread (&data, 1, sizeof (uint), fp)) != sizeof (uint)) + { + exit (1); + } + + fclose (fp); + + return (uint) ((data % (max - min)) + min); +} diff --git a/tools/rules_test/cpu_rules.h b/tools/rules_test/cpu_rules.h new file mode 100644 index 0000000000..d6ebd831c6 --- /dev/null +++ b/tools/rules_test/cpu_rules.h @@ -0,0 +1,75 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#ifndef CPU_RULES_H +#define CPU_RULES_H + +#include +#include +#include +#include +#include "rp_cpu.h" +#define BLOCK_SIZE 64 +#define RULE_RC_REJECT_ERROR -2 +#define RP_RULE_BUFSIZ 0x100 +#define RULE_RC_SYNTAX_ERROR -1 + +typedef unsigned int uint; + +typedef struct +{ + uint cmds[15]; + +} gpu_rule_t; + +int mangle_lrest (char arr[BLOCK_SIZE], int arr_len); +int mangle_urest (char arr[BLOCK_SIZE], int arr_len); +int mangle_trest (char arr[BLOCK_SIZE], int arr_len); +int mangle_reverse (char arr[BLOCK_SIZE], int arr_len); +int mangle_double (char arr[BLOCK_SIZE], int arr_len); +int mangle_double_times (char arr[BLOCK_SIZE], int arr_len, int times); +int mangle_reflect (char arr[BLOCK_SIZE], int arr_len); +int mangle_rotate_left (char arr[BLOCK_SIZE], int arr_len); +int mangle_rotate_right (char arr[BLOCK_SIZE], int arr_len); +int mangle_append (char arr[BLOCK_SIZE], int arr_len, char c); +int mangle_prepend (char arr[BLOCK_SIZE], int arr_len, char c); +int mangle_delete_at (char arr[BLOCK_SIZE], int arr_len, int upos); +int mangle_extract (char arr[BLOCK_SIZE], int arr_len, int upos, int ulen); +int mangle_omit (char arr[BLOCK_SIZE], int arr_len, int upos, int ulen); +int mangle_insert (char arr[BLOCK_SIZE], int arr_len, int upos, char c); +int mangle_insert_multi (char arr[BLOCK_SIZE], int arr_len, int arr_pos, char arr2[BLOCK_SIZE], int arr2_len, int arr2_pos, int arr2_cpy); +int mangle_overstrike (char arr[BLOCK_SIZE], int arr_len, int upos, char c); +int mangle_truncate_at (char arr[BLOCK_SIZE], int arr_len, int upos); +int mangle_replace (char arr[BLOCK_SIZE], int arr_len, char oldc, char newc); +int mangle_purgechar (char arr[BLOCK_SIZE], int arr_len, char c); +int mangle_dupeblock_prepend (char arr[BLOCK_SIZE], int arr_len, int ulen); +int mangle_dupeblock_append (char arr[BLOCK_SIZE], int arr_len, int ulen); +int mangle_dupechar_at (char arr[BLOCK_SIZE], int arr_len, int upos, int ulen); +int mangle_dupechar (char arr[BLOCK_SIZE], int arr_len); +int mangle_switch_at_check (char arr[BLOCK_SIZE], int arr_len, int upos, int upos2); +int mangle_switch_at (char arr[BLOCK_SIZE], int arr_len, int upos, int upos2); +int mangle_chr_shiftl (uint8_t arr[BLOCK_SIZE], int arr_len, int upos); +int mangle_chr_shiftr (uint8_t arr[BLOCK_SIZE], int arr_len, int upos); +int mangle_chr_incr (uint8_t arr[BLOCK_SIZE], int arr_len, int upos); +int mangle_chr_decr (uint8_t arr[BLOCK_SIZE], int arr_len, int upos); +int mangle_title (char arr[BLOCK_SIZE], int arr_len); +int generate_random_rule (char rule_buf[RP_RULE_BUFSIZ], uint32_t rp_gen_func_min, uint32_t rp_gen_func_max); +int apply_rule_cpu (char *rule, int rule_len, char in[BLOCK_SIZE], int in_len, char out[BLOCK_SIZE]); +int cpu_rule_to_gpu_rule (char rule_buf[BUFSIZ], uint rule_len, gpu_rule_t *rule); + +typedef int bool; + +bool class_num (char c); +bool class_lower (char c); +bool class_upper (char c); +bool class_alpha (char c); +char conv_ctoi (char c); +char conv_itoc (char c); + +uint get_random_num (uint min, uint max); + +void gen_cmask (const uint8_t *word, uint8_t *cmask, const uint len); + +#endif diff --git a/tools/rules_test/gpu2cpu_rule_test.c b/tools/rules_test/gpu2cpu_rule_test.c new file mode 100644 index 0000000000..3495c52ef5 --- /dev/null +++ b/tools/rules_test/gpu2cpu_rule_test.c @@ -0,0 +1,211 @@ +/** + * Author......: Jens Steube + * License.....: MIT + */ + +#include +#include +#include +#include + +#define RULES_PER_PLAIN_MIN 1 +#define RULES_PER_PLAIN_MAX 99 +#define RP_GEN_FUNC_MIN 1 +#define RP_GEN_FUNC_MAX 4 +#define PW_MAX 32 +#define LINE_SIG_LEN RP_GEN_FUNC_MAX * 2 + 1 + +int max_len = 0; + +#include "cpu_rules.h" +#include "rp_gpu_on_cpu.h" + +void print_plain (char *plain, int plain_len) +{ + int need_hexifly = 0; + + unsigned char *plain_ptr = (unsigned char*) plain; + + int k; + + for (k = 0; k < plain_len; k++) + { + if ((plain_ptr[k] < 0x20) || (plain_ptr[k] > 0x7f)) + { + need_hexifly = 1; + + break; + } + } + + if (need_hexifly) + { + printf ("$HEX["); + + for (k = 0; k < plain_len; k++) + { + printf ("%02x", plain_ptr[k]); + } + + printf ("]"); + } + else + { + for (k = 0; k < plain_len; k++) + { + printf ("%c", plain_ptr[k]); + } + } +} + +int main (int argc, char **argv) +{ + FILE *fp = stdin; + + char rule_buf[BUFSIZ]; + + int rp_gen_func_min = RP_GEN_FUNC_MIN; + int rp_gen_func_max = RP_GEN_FUNC_MAX; + + while (1) + { + /* + * line + */ + + if (feof (fp)) break; + + char line_buf[BUFSIZ + 1]; + + char *line_ptr = fgets (line_buf, BUFSIZ, fp); + + if (line_ptr == NULL) continue; + + int line_len = strlen (line_ptr); + + line_len--; + + if (line_len < 0) continue; + if (line_len > PW_MAX) continue; + + memset (line_ptr + line_len, 0, PW_MAX - line_len); + + /* + * generate random rule and apply it afterwards + */ + + uint max; + + if (argc < 2) + { + max = get_random_num (RULES_PER_PLAIN_MIN, RULES_PER_PLAIN_MAX); + } + else + { + max = 1; + } + + uint i; + + for (i = 0; i < max; i++) + { + int rule_len; + + memset (rule_buf, 0, BLOCK_SIZE); + + if (argc < 2) + { + rule_len = (int) generate_random_rule (rule_buf, rp_gen_func_min, rp_gen_func_max); + } + else + { + strncpy (rule_buf, argv[1], BUFSIZ); + + rule_len = strlen (rule_buf); + } + + gpu_rule_t gpu_rule_buf; + + memset (&gpu_rule_buf, 0, sizeof (gpu_rule_t)); + + if (cpu_rule_to_gpu_rule (rule_buf, rule_len, &gpu_rule_buf) == -1) continue; + + // cpu + char rule_buf_cpu[BLOCK_SIZE]; + + memset (rule_buf_cpu, 0, BLOCK_SIZE); + + max_len = 0; + + int out_len_cpu = apply_rule_cpu (rule_buf, rule_len, line_ptr, line_len, rule_buf_cpu); + + if (max_len >= 32) continue; + + // gpu + char rule_buf_gpu[BLOCK_SIZE]; + + memset (rule_buf_gpu, 0, sizeof (rule_buf_gpu)); + + memcpy (rule_buf_gpu, line_buf, line_len); + + uint32_t *plain_ptr = (uint32_t *) rule_buf_gpu; + + int out_len_gpu = apply_rules (gpu_rule_buf.cmds, &plain_ptr[0], &plain_ptr[4], line_len); + + /* + * compare + */ + + if (out_len_cpu >= 0 && out_len_cpu < 32) + { + int failed = 1; + + if (out_len_gpu == out_len_cpu) + { + if (memcmp (rule_buf_gpu, rule_buf_cpu, out_len_gpu) == 0) + { + failed = 0; + } + } + + /* + * print if failed + */ + + if (failed == 1) + { + printf ("Rule: %s", rule_buf); + + // nicer output + int spaces = LINE_SIG_LEN - rule_len; + + if (rule_len > 10) spaces++; + if (rule_len > 100) spaces++; + + while (spaces--) printf ("."); + + printf (": "); + + // initial line + print_plain (line_buf, line_len); + + printf (" %i => ", line_len); + + // modified by cpu + print_plain (rule_buf_cpu, out_len_cpu); + + printf (" %i vs ", out_len_cpu); + + // modified by gpu + print_plain (rule_buf_gpu, out_len_gpu); + + printf (" %i\n", out_len_gpu); + } + } + } + } + + fclose (fp); + + return 0; +} diff --git a/tools/test.pl b/tools/test.pl new file mode 100755 index 0000000000..a105e8984e --- /dev/null +++ b/tools/test.pl @@ -0,0 +1,8579 @@ +#!/usr/bin/env perl + +## +## Author......: Jens Steube +## License.....: MIT +## + +use strict; +use warnings; +use Digest::MD4 qw (md4 md4_hex); +use Digest::MD5 qw (md5 md5_hex); +use Digest::SHA qw (sha1 sha256 sha384 sha512 sha1_hex sha256_hex sha384_hex sha512_hex); +use Digest::HMAC qw (hmac hmac_hex); +use Digest::Keccak qw (keccak_256_hex); +use Crypt::MySQL qw (password41); +use Digest::GOST qw (gost gost_hex); +use Digest::HMAC_MD5 qw (hmac_md5); +use Digest::CRC qw (crc32); +use Crypt::PBKDF2; +use Crypt::DES; +use Crypt::ECB qw (encrypt PADDING_AUTO PADDING_NONE); +use Crypt::CBC; +use Crypt::Eksblowfish::Bcrypt qw (bcrypt en_base64); +use Crypt::Digest::RIPEMD160 qw (ripemd160_hex); +use Crypt::Digest::Whirlpool qw (whirlpool_hex); +use Crypt::RC4; +use Crypt::ScryptKDF qw (scrypt_hash scrypt_b64); +use Crypt::Rijndael; +use Crypt::Mode::ECB; +use Crypt::UnixCrypt_XS qw (crypt_rounds fold_password base64_to_int24 block_to_base64 int24_to_base64); +use MIME::Base64; +use Authen::Passphrase::NTHash; +use Authen::Passphrase::MySQL323; +use Authen::Passphrase::PHPass; +use Authen::Passphrase::LANManager; +use Encode; +use POSIX qw (strftime); +use Net::DNS::SEC; +use Net::DNS::RR::NSEC3; +use Convert::EBCDIC qw (ascii2ebcdic); +use Digest::SipHash qw/siphash/; + +my $hashcat = "./oclHashcat64.bin"; + +my $MAX_LEN = 55; + +my @modes = (0, 10, 11, 12, 20, 21, 22, 23, 30, 40, 50, 60, 100, 101, 110, 111, 112, 120, 121, 122, 130, 131, 132, 140, 141, 150, 160, 190, 200, 300, 400, 500, 900, 1000, 1100, 1400, 1410, 1420, 1430, 1440, 1441, 1450, 1460, 1500, 1600, 1700, 1710, 1711, 1720, 1730, 1740, 1722, 1731, 1750, 1760, 1800, 2100, 2400, 2410, 2500, 2600, 2611, 2612, 2711, 2811, 3000, 3100, 3200, 3710, 3711, 3300, 3500, 3610, 3720, 3800, 3910, 4010, 4110, 4210, 4300, 4400, 4500, 4600, 4700, 4800, 4900, 5000, 5100, 5300, 5400, 5500, 5600, 5700, 5800, 6000, 6100, 6300, 6400, 6500, 6600, 6700, 6800, 6900, 7100, 7200, 7300, 7400, 7500, 7600, 7700, 7800, 7900, 8000, 8100, 8200, 8300, 8400, 8500, 8600, 8700, 8900, 9100, 9200, 9300, 9400, 9500, 9600, 9700, 9800, 9900, 10000, 10100, 10200, 10300, 10400, 10500, 10600, 10700, 10800, 10900, 11000, 11100, 11200, 11300, 11400, 11500, 11600, 11900, 12000, 12100, 12200, 12300, 12400, 12600, 12700, 12800); + +my %is_unicode = map { $_ => 1 } qw(30 40 130 131 132 140 141 1000 1100 1430 1440 1441 1730 1740 1731 5500 5600 8000 9400 9500 9600 9700 9800); +my %less_fifteen = map { $_ => 1 } qw(500 1600 1800 2400 2410 3200 6300 7400 10500 10700); +my %allow_long_salt = map { $_ => 1 } qw(2500 5500 5600 7100 7200 7300 9400 9500 9600 9700 9800 10400 10500 10600 10700 1100 11000 11200 11300 11400 11600 12600); + +my @lotus_magic_table = +( + 0xbd, 0x56, 0xea, 0xf2, 0xa2, 0xf1, 0xac, 0x2a, + 0xb0, 0x93, 0xd1, 0x9c, 0x1b, 0x33, 0xfd, 0xd0, + 0x30, 0x04, 0xb6, 0xdc, 0x7d, 0xdf, 0x32, 0x4b, + 0xf7, 0xcb, 0x45, 0x9b, 0x31, 0xbb, 0x21, 0x5a, + 0x41, 0x9f, 0xe1, 0xd9, 0x4a, 0x4d, 0x9e, 0xda, + 0xa0, 0x68, 0x2c, 0xc3, 0x27, 0x5f, 0x80, 0x36, + 0x3e, 0xee, 0xfb, 0x95, 0x1a, 0xfe, 0xce, 0xa8, + 0x34, 0xa9, 0x13, 0xf0, 0xa6, 0x3f, 0xd8, 0x0c, + 0x78, 0x24, 0xaf, 0x23, 0x52, 0xc1, 0x67, 0x17, + 0xf5, 0x66, 0x90, 0xe7, 0xe8, 0x07, 0xb8, 0x60, + 0x48, 0xe6, 0x1e, 0x53, 0xf3, 0x92, 0xa4, 0x72, + 0x8c, 0x08, 0x15, 0x6e, 0x86, 0x00, 0x84, 0xfa, + 0xf4, 0x7f, 0x8a, 0x42, 0x19, 0xf6, 0xdb, 0xcd, + 0x14, 0x8d, 0x50, 0x12, 0xba, 0x3c, 0x06, 0x4e, + 0xec, 0xb3, 0x35, 0x11, 0xa1, 0x88, 0x8e, 0x2b, + 0x94, 0x99, 0xb7, 0x71, 0x74, 0xd3, 0xe4, 0xbf, + 0x3a, 0xde, 0x96, 0x0e, 0xbc, 0x0a, 0xed, 0x77, + 0xfc, 0x37, 0x6b, 0x03, 0x79, 0x89, 0x62, 0xc6, + 0xd7, 0xc0, 0xd2, 0x7c, 0x6a, 0x8b, 0x22, 0xa3, + 0x5b, 0x05, 0x5d, 0x02, 0x75, 0xd5, 0x61, 0xe3, + 0x18, 0x8f, 0x55, 0x51, 0xad, 0x1f, 0x0b, 0x5e, + 0x85, 0xe5, 0xc2, 0x57, 0x63, 0xca, 0x3d, 0x6c, + 0xb4, 0xc5, 0xcc, 0x70, 0xb2, 0x91, 0x59, 0x0d, + 0x47, 0x20, 0xc8, 0x4f, 0x58, 0xe0, 0x01, 0xe2, + 0x16, 0x38, 0xc4, 0x6f, 0x3b, 0x0f, 0x65, 0x46, + 0xbe, 0x7e, 0x2d, 0x7b, 0x82, 0xf9, 0x40, 0xb5, + 0x1d, 0x73, 0xf8, 0xeb, 0x26, 0xc7, 0x87, 0x97, + 0x25, 0x54, 0xb1, 0x28, 0xaa, 0x98, 0x9d, 0xa5, + 0x64, 0x6d, 0x7a, 0xd4, 0x10, 0x81, 0x44, 0xef, + 0x49, 0xd6, 0xae, 0x2e, 0xdd, 0x76, 0x5c, 0x2f, + 0xa7, 0x1c, 0xc9, 0x09, 0x69, 0x9a, 0x83, 0xcf, + 0x29, 0x39, 0xb9, 0xe9, 0x4c, 0xff, 0x43, 0xab +); + +my @pdf_padding = +( + 0x28, 0xbf, 0x4e, 0x5e, 0x4e, 0x75, 0x8a, 0x41, + 0x64, 0x00, 0x4e, 0x56, 0xff, 0xfa, 0x01, 0x08, + 0x2e, 0x2e, 0x00, 0xb6, 0xd0, 0x68, 0x3e, 0x80, + 0x2f, 0x0c, 0xa9, 0xfe, 0x64, 0x53, 0x69, 0x7a +); + +my $CISCO_BASE64_MAPPING = {'A', '.', 'B', '/', 'C', '0', 'D', '1', 'E', '2', 'F', '3', 'G', '4', 'H', '5', 'I', '6', 'J', '7', 'K', '8', 'L', '9', 'M', 'A', 'N', 'B', 'O', 'C', 'P', 'D', 'Q', 'E', 'R', 'F', 'S', 'G', 'T', 'H', 'U', 'I', 'V', 'J', 'W', 'K', 'X', 'L', 'Y', 'M', 'Z', 'N', 'a', 'O', 'b', 'P', 'c', 'Q', 'd', 'R', 'e', 'S', 'f', 'T', 'g', 'U', 'h', 'V', 'i', 'W', 'j', 'X', 'k', 'Y', 'l', 'Z', 'm', 'a', 'n', 'b', 'o', 'c', 'p', 'd', 'q', 'e', 'r', 'f', 's', 'g', 't', 'h', 'u', 'i', 'v', 'j', 'w', 'k', 'x', 'l', 'y', 'm', 'z', 'n', '0', 'o', '1', 'p', '2', 'q', '3', 'r', '4', 's', '5', 't', '6', 'u', '7', 'v', '8', 'w', '9', 'x', '+', 'y', '/', 'z'}; + +if (scalar @ARGV < 1) +{ + usage_die (); +} + +my $type; +my $mode; +my $len; + +$type = shift @ARGV; + +if ($type ne "verify") +{ + if (scalar @ARGV > 1) + { + $mode = shift @ARGV; + $len = shift @ARGV; + } + elsif (scalar @ARGV == 1) + { + $mode = shift @ARGV; + $len = 0; + } + else + { + $len = 0; + } + + if ($type eq "single") + { + single ($mode); + } + elsif ($type eq "passthrough") + { + passthrough ($mode); + } + else + { + usage_die (); + } +} +else +{ + if (scalar @ARGV != 4) + { + usage_die (); + } + + my $mode = shift @ARGV; + my $hash_file = shift @ARGV; + my $in_file = shift @ARGV; + my $out_file = shift @ARGV; + + my $db; + + open (IN, "<", $hash_file) or die ("$hash_file: $!\n"); + + # clever ? the resulting database could be huge + # but we need some way to map lines in hashfile w/ cracks + # maybe rli2 way would be more clever (needs sorted input) + + while (my $line = ) + { + $line =~ s/[\n\r]*$//; + + $db->{$line} = undef; + } + + close (IN); + + verify ($mode, $db, $in_file, $out_file); +} + +sub verify +{ + my $mode = shift; + my $db = shift; + my $in_file = shift; + my $out_file = shift; + + my $hash_in; + my $hash_out; + my $iter; + my $salt; + my $word; + my $param; + my $param2; + my $param3; + my $param4; + my $param5; + my $param6; + my $param7; + my $param8; + my $param9; + my $param10; + my $param11; + + open (IN, "<", $in_file) or die ("$in_file: $!\n"); + open (OUT, ">", $out_file) or die ("$out_file: $!\n"); + + my $len; + + my $base64 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; + my $itoa64_1 = "./0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"; + my $itoa64_2 = "./ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"; + + while (my $line = ) + { + chomp ($line); + + $line =~ s/\n$//; + $line =~ s/\r$//; + + # remember always do "exists ($db->{$hash_in})" checks as soon as possible and don't forget it + + # unsalted + if ($mode == 0 || $mode == 100 || $mode == 101 || $mode == 190 || $mode == 200 || $mode == 300 || $mode == 900 || $mode == 1000 || $mode == 1400 || $mode == 1700 || $mode == 2400 || $mode == 2600 || $mode == 3000 || $mode == 3500 || $mode == 4300 || $mode == 4400 || $mode == 4500 || $mode == 4600 || $mode == 4700 || $mode == 5000 || $mode == 5100 || $mode == 5700 || $mode == 6000 || $mode == 6100 || $mode == 6900 || $mode == 8600 || $mode == 9900 || $mode == 10800 || $mode == 11500) + { + my $index = index ($line, ":"); + + next if $index < 1; + + $hash_in = substr ($line, 0, $index); + + next unless (exists ($db->{$hash_in}) and (! defined ($db->{$hash_in}))); + + $word = substr ($line, $index + 1); + } + # hash:salt + elsif ($mode == 10 || $mode == 11 || $mode == 12 || $mode == 20 || $mode == 21 || $mode == 22 || $mode == 23 || $mode == 30 || $mode == 40 || $mode == 50 || $mode == 60 || $mode == 110 || $mode == 112 || $mode == 120 || $mode == 121 || $mode == 130 || $mode == 140 || $mode == 150 || $mode == 160 || $mode == 1100 || $mode == 1410 || $mode == 1420 || $mode == 1430 || $mode == 1440 || $mode == 1450 || $mode == 1460 || $mode == 1710 || $mode == 1720 || $mode == 1730 || $mode == 1740 || $mode == 1750 || $mode == 1760 || $mode == 2410 || $mode == 2611 || $mode == 2711 || $mode == 2811 || $mode == 3100 || $mode == 3610 || $mode == 3710 || $mode == 3720 || $mode == 3800 || $mode == 3910 || $mode == 4010 || $mode == 4110 || $mode == 4210 || $mode == 4900 || $mode == 5800 || $mode == 7600 || $mode == 8400 || $mode == 11000 || $mode == 12600) + { + # get hash + my $index1 = index ($line, ":"); + + next if $index1 < 1; + + $hash_in = substr ($line, 0, $index1); + + # identify lenghts of both salt and plain + + my $salt_plain = substr ($line, $index1 + 1); + + my $num_cols = () = $salt_plain =~ /:/g; + + my $index2; + my $matched = 0; + my $start = 0; + + $word = undef; + + # fuzzy + foreach (my $i = 0; $i < $num_cols; $i++) + { + $index2 = index ($salt_plain, ":", $start); + + next if $index2 < 0; + + $start = $index2 + 1; + + $salt = substr ($salt_plain, 0, $index2); + $word = substr ($salt_plain, $index2 + 1); + + # can't be true w/ wrong $hash:$salt, otherwise the + # algo must have many collisions + + if (exists ($db->{$hash_in . ":" . $salt})) + { + $hash_in = $hash_in . ":" . $salt; + $matched = 1; + last; + } + } + + next unless ($matched); # therefore: true == exists ($db->{$hash_in} + next unless (! defined ($db->{$hash_in})); + } + # dcc2 + elsif ($mode == 2100) + { + # get hash + my $index1 = index ($line, "\$DCC2\$"); + + next if $index1 != 0; + + # iterations + my $index2 = index ($line, "#", $index1 + 1); + + next if $index2 < 1; + + $iter = substr ($line, $index1 + 6, $index2 - $index1 - 6); + + # get hash + $index1 = index ($line, "#"); + + next if $index1 < 1; + + $hash_in = substr ($line, 0, $index1 + 1); + + # identify lenghts of both salt and plain + + my $salt_plain = substr ($line, $index2 + 1); + + my $num_cols = () = $salt_plain =~ /:/g; + + my $matched = 0; + my $start = 0; + my $index3 = 0; + my $raw_hash; + + $word = undef; + + # fuzzy + foreach (my $i = 0; $i < $num_cols; $i++) + { + $index2 = index ($salt_plain, ":", $start); + + next if $index2 < 0; + + $start = $index2 + 1; + + $index3 = rindex ($salt_plain, "#", $index2); + + $raw_hash = substr ($salt_plain, $index3 + 1, $index2 - $index3 - 1); + $salt = substr ($salt_plain, 0, $index3); + $word = substr ($salt_plain, $index2 + 1); + + if (exists ($db->{$hash_in . $salt . "#" .$raw_hash})) + { + $hash_in = $hash_in . $salt . "#" . $raw_hash; + $matched = 1; + last; + } + } + + next unless ($matched); # therefore: true == exists ($db->{$hash_in} + next unless (! defined ($db->{$hash_in})); + } + # salt:hash guaranteed only : because of hex salt + elsif ($mode == 7300) + { + # split hash and plain + my $index1 = index ($line, ":"); + + next if $index1 < 1; + + $salt = substr ($line, 0, $index1); + + $salt = pack ("H*", $salt); + + my $rest = substr ($line, $index1 + 1); + + my $index2 = index ($rest, ":"); + + next if $index2 < 1; + + $hash_in = substr ($rest, 0, $index2); + + $word = substr ($rest, $index2 + 1); + + next unless (exists ($db->{$salt . ":" . $hash_in}) and (! defined ($db->{$hash_in}))); + } + # 1salthash fixed + elsif ($mode == 8100) + { + # split hash and plain + $salt = substr ($line, 1, 8); + + my $rest = substr ($line, 1 + 8); + + my $index2 = index ($rest, ":"); + + next if $index2 < 1; + + $hash_in = substr ($rest, 0, $index2); + + $word = substr ($rest, $index2 + 1); + + next unless (exists ($db->{"1" . $salt . $hash_in}) and (! defined ($db->{$hash_in}))); + } + # base64 and salt embedded SSHA1, salt length = total lenght - 20 + elsif ($mode == 111) + { + # split hash and plain + my $index = index ($line, ":"); + + next if $index < 1; + + $hash_in = substr ($line, 0, $index); + $word = substr ($line, $index + 1); + + next unless (exists ($db->{$hash_in}) and (! defined ($db->{$hash_in}))); + + # remove signature + my $plain_base64 = substr ($hash_in, 6); + + # base64 decode to extract salt + my $decoded = decode_base64 ($plain_base64); + + $salt = substr ($decoded, 20); + } + # base64 and salt embedded SSHA512, salt length = total length - 64 + elsif ($mode == 1711) + { + # split hash and plain + my $index = index ($line, ":"); + + next if $index < 1; + + $hash_in = substr ($line, 0, $index); + $word = substr ($line, $index + 1); + + next unless (exists ($db->{$hash_in}) and (! defined ($db->{$hash_in}))); + + # remove signature + my $plain_base64 = substr ($hash_in, 9); + + # base64 decode to extract salt + my $decoded = decode_base64 ($plain_base64); + + $salt = substr ($decoded, 64); + } + # OSX (first 8 hex chars is salt) + elsif ($mode == 122 || $mode == 1722) + { + my $index = index ($line, ":"); + + next if $index < 1; + + $hash_in = substr ($line, 0, $index); + $word = substr ($line, $index + 1); + + next unless (exists ($db->{$hash_in}) and (! defined ($db->{$hash_in}))); + + $salt = substr ($hash_in, 0, 8); + } + # MSSQL (2000, 2005 AND 2012), salt after version number + elsif ($mode == 131 || $mode == 132 || $mode == 1731) + { + my $index = index ($line, ":"); + + next if $index < 1; + + $hash_in = substr ($line, 0, $index); + $word = substr ($line, $index + 1); + + next unless (exists ($db->{$hash_in}) and (! defined ($db->{$hash_in}))); + + $salt = substr ($hash_in, 6, 8); + } + # Sybase ASE + elsif ($mode == 8000) + { + my $index = index ($line, ":"); + + next if $index < 1; + + $hash_in = substr ($line, 0, $index); + $word = substr ($line, $index + 1); + + next unless (exists ($db->{$hash_in}) and (! defined ($db->{$hash_in}))); + + $salt = substr ($hash_in, 6, 16); + } + # episerver salts + elsif ($mode == 141 || $mode == 1441) + { + my $index1 = index ($line, ":"); + + next if $index1 < 1; + + $hash_in = substr ($line, 0, $index1); + $word = substr ($line, $index1 + 1); + + next unless (exists ($db->{$hash_in}) and (! defined ($db->{$hash_in}))); + + my $index2 = index ($line, "*", 14); + + #extract salt from base64 + my $plain_base64 = substr ($hash_in, 14, $index2 - 14); + + $salt = decode_base64 ($plain_base64); + } + # phpass (first 8 after $P$/$H$ -- or $S$ with drupal7) + elsif ($mode == 400 || $mode == 7900) + { + my $index = index ($line, ":"); + + next if $index < 1; + + $hash_in = substr ($line, 0, $index); + $word = substr ($line, $index + 1); + + next unless (exists ($db->{$hash_in}) and (! defined ($db->{$hash_in}))); + + $salt = substr ($hash_in, 4, 8); + + # iterations = 2 ^ cost (where cost == $iter) + $iter = index ($itoa64_1, substr ($hash_in, 3, 1)); + } + # $something$[rounds=iter$]salt$ (get last $, then check iter) + elsif ($mode == 500 || $mode == 1600 || $mode == 1800 || $mode == 3300 || $mode == 7400) + { + my $index1 = index ($line, ":", 30); + + next if $index1 < 1; + + $hash_in = substr ($line, 0, $index1); + $word = substr ($line, $index1 + 1); + + next unless (exists ($db->{$hash_in}) and (! defined ($db->{$hash_in}))); + + $index1 = index ($hash_in, ",", 1); + my $index2 = index ($hash_in, "\$", 1); + + if ($index1 != -1) + { + if ($index1 < $index2) + { + $index2 = $index1; + } + } + + $param = substr ($hash_in, $index2, 1); + + $index2++; + + # rounds= if available + $iter = 0; + + if (substr ($hash_in, $index2, 7) eq "rounds=") + { + my $old_index = $index2; + + $index2 = index ($hash_in, "\$", $index2 + 1); + + next if $index2 < 1; + + $iter = substr ($hash_in, $old_index + 7, $index2 - $old_index - 7); + + $index2++; + } + + # get salt + my $index3 = rindex ($hash_in, "\$"); + + next if $index3 < 1; + + $salt = substr ($hash_in, $index2, $index3 - $index2); + } + # descrypt (salt in first 2 char) + elsif ($mode == 1500) + { + my $index = index ($line, ":"); + + next if $index < 1; + + $hash_in = substr ($line, 0, $index); + $word = substr ($line, $index + 1); + + next unless (exists ($db->{$hash_in}) and (! defined ($db->{$hash_in}))); + + $salt = substr ($hash_in, 0, 2); + } + # bcrypt $something$something$salt.hash + elsif ($mode == 3200) + { + my $index1 = index ($line, ":", 33); + + next if $index1 < 1; + + $hash_in = substr ($line, 0, $index1); + $word = substr ($line, $index1 + 1); + + next unless (exists ($db->{$hash_in}) and (! defined ($db->{$hash_in}))); + + my $index2 = index ($hash_in, "\$", 4); + + $iter = substr ($hash_in, 4, $index2 - 4); + + my $plain_base64 = substr ($hash_in, $index2 + 1, 22); + + # base64 mapping + my $encoded = ""; + + for (my $i = 0; $i < length ($plain_base64); $i++) + { + my $char = substr ($plain_base64, $i, 1); + $encoded .= substr ($base64, index ($itoa64_2, $char), 1); + } + + $salt = decode_base64 ($encoded); + } + # md5 (chap) + elsif ($mode == 4800) + { + my $index1 = index ($line, ":"); + + next if $index1 < 1; + + my $index2 = index ($line, ":", $index1 + 1); + + next if $index2 < 1; + + my $index3 = index ($line, ":", $index2 + 1); + + next if $index3 < 1; + + $salt = substr ($line, $index1 + 1, $index3 - $index1 - 1); + + $word = substr ($line, $index3 + 1); + + $hash_in = substr ($line, 0, $index3); + } + # IKE (md5 and sha1) + elsif ($mode == 5300 || $mode == 5400) + { + my $num_cols = () = $line =~ /:/g; + + next unless ($num_cols >= 9); + + my $index1 = -1; + my $failed = 0; + + for (my $j = 0; $j < 9; $j++) + { + $index1 = index ($line, ":", $index1 + 1); + + if ($index1 < 1) + { + $failed = 1; + last; + } + } + + next if ($failed); + + $word = substr ($line, $index1 + 1); + + $hash_in = substr ($line, 0, $index1); + + next unless (exists ($db->{$hash_in}) and (! defined ($db->{$hash_in}))); + + my $index2 = rindex ($line, ":", $index1 - 1); + + $salt = substr ($line, 0, $index2); + } + # NetNTLMv1 + elsif ($mode == 5500) + { + my $index1 = index ($line, "::"); + + next if $index1 < 1; + + my $index2 = index ($line, ":", $index1 + 2); + + next if $index2 < 1; + + $index2 = index ($line, ":", $index2 + 1); + + next if $index2 < 1; + + $salt = substr ($line, 0, $index2); + + $index2 = index ($line, ":", $index2 + 1); + + next if $index2 < 1; + + $salt .= substr ($line, $index2 + 1, 16); + + $index2 = index ($line, ":", $index2 + 1); + + next if $index2 < 1; + + $hash_in = substr ($line, 0, $index2); + + next unless (exists ($db->{$hash_in}) and (! defined ($db->{$hash_in}))); + + $word = substr ($line, $index2 + 1); + } + # NetNTLMv2 + elsif ($mode == 5600) + { + my $index1 = index ($line, "::"); + + next if $index1 < 1; + + my $index2 = index ($line, ":", $index1 + 2); + + next if $index2 < 1; + + $index2 = index ($line, ":", $index2 + 1); + + next if $index2 < 1; + + $salt = substr ($line, 0, $index2); + + $index1 = index ($line, ":", $index2 + 1); + + next if $index1 < 1; + + $index2 = index ($line, ":", $index1 + 1); + + next if $index2 < 1; + + $salt .= substr ($line, $index1 + 1, $index2 - $index1 - 1); + + $hash_in = substr ($line, 0, $index2); + + # do it later on for this hash mode: + # next unless ((exists ($db->{$hash_in}) and (! defined ($db->{$hash_in}))) or (exists ($db->{$mod}) and (! defined ($db->{$mod})))); + + $word = substr ($line, $index2 + 1); + } + # AIX smd5 something BRACE salt$ + elsif ($mode == 6300) + { + my $index1 = index ($line, ":"); + + next if $index1 < 1; + + $hash_in = substr ($line, 0, $index1); + $word = substr ($line, $index1 + 1); + + next unless (exists ($db->{$hash_in}) and (! defined ($db->{$hash_in}))); + + my $index2 = index ($hash_in, "}"); + my $index3 = rindex ($hash_in, "\$"); + + $salt = substr ($hash_in, $index2 + 1, $index3 - $index2 - 1); + } + # AIX: something$salt$ (no $ at position 1) + elsif ($mode == 6400 || $mode == 6500 || $mode == 6700) + { + my $index1 = index ($line, ":"); + + next if $index1 < 1; + + $hash_in = substr ($line, 0, $index1); + $word = substr ($line, $index1 + 1); + + next unless (exists ($db->{$hash_in}) and (! defined ($db->{$hash_in}))); + + my $index2 = index ($hash_in, "}"); + my $index3 = index ($hash_in, "\$"); + my $index4 = rindex ($hash_in, "\$"); + + $salt = substr ($hash_in, $index3 + 1, $index4 - $index3 - 1); + + $iter = substr ($hash_in, $index2 + 1, $index3 - $index2 - 1); + } + # 1Password, agilekeychain + elsif ($mode == 6600) + { + my $num_cols = () = $line =~ /:/g; + + next unless ($num_cols > 2); + + my $index1 = index ($line, ":"); + + next if $index1 < 1; + + $iter = substr ($line, 0, $index1); + + my $index2 = index ($line, ":", $index1 + 1); + + next if $index2 < 1; + + $salt = substr ($line, $index1 + 1, $index2 - $index1 - 1); + + $index1 = index ($line, ":", $index2 + 1); + + next if $index1 < 1; + + $salt .= substr ($line, $index2 + 1, $index1 - $index2 - 33); + + $hash_in = substr ($line, 0, $index1); + + next unless (exists ($db->{$hash_in}) and (! defined ($db->{$hash_in}))); + + $word = substr ($line, $index1 + 1); + } + # 1Password, cloudkeychain + elsif ($mode == 8200) + { + my @datas = split (":", $line); + + next if scalar @datas < 4; + + my $hash = shift @datas; + $salt = shift @datas; + $iter = shift @datas; + my $data = shift @datas; + + $hash_in = $hash . ":" . $salt . ":" . $iter . ":" . $data; + + $salt .= $data; + + $word = join (":", @datas); + + next unless (exists ($db->{$hash_in}) and (! defined ($db->{$hash_in}))); + } + # lastpass (hash:iter:salt) + elsif ($mode == 6800) + { + my $index1 = index ($line, ":", 34); + + next if $index1 < 1; + + $hash_in = substr ($line, 0, $index1); + + # identify lenghts of both salt and plain + + my $salt_plain = substr ($line, $index1 + 1); + + my $num_cols = () = $salt_plain =~ /:/g; + + my $index2; + my $matched = 0; + my $start = 0; + + $word = undef; + + # fuzzy + foreach (my $i = 0; $i < $num_cols; $i++) + { + $index2 = index ($salt_plain, ":", $start); + + next if $index2 < 1; + + $start = $index2 + 1; + + $salt = substr ($salt_plain, 0, $index2); + $word = substr ($salt_plain, $index2 + 1); + + # can't be true w/ wrong $hash:$salt, otherwise the + # algo must have many collisions + + if (exists ($db->{$hash_in . ":" . $salt})) + { + $hash_in = $hash_in . ":" . $salt; + $matched = 1; + last; + } + } + + next unless ($matched); # therefore: true == exists ($db->{$hash_in} + next unless (! defined ($db->{$hash_in})); + + $index1 = index ($hash_in, ":"); + $index2 = index ($hash_in, ":", $index1 + 1); + + $iter = substr ($hash_in, $index1 + 1, $index2 - $index1 - 1); + $salt = substr ($hash_in, $index2 + 1); + } + # OSX 10.* : $something$iter$salt$ + elsif ($mode == 7100) + { + my $index1 = index ($line, ":"); + + next if $index1 < 1; + + $hash_in = substr ($line, 0, $index1); + $word = substr ($line, $index1 + 1); + + next unless (exists ($db->{$hash_in}) and (! defined ($db->{$hash_in}))); + + my $index2 = index ($hash_in, "\$", 5); + + next if $index2 < 1; + + my $index3 = index ($hash_in, "\$", $index2 + 1); + + $salt = substr ($hash_in, $index2 + 1, $index3 - $index2 - 1); + + $iter = substr ($hash_in, 4, $index2 - 4); + + next if (int ($iter) < 1); + } + # grub: something1.something2.something3.iter.salt. + elsif ($mode == 7200) + { + my $index1 = index ($line, ":"); + + next if $index1 < 1; + + $hash_in = substr ($line, 0, $index1); + $word = substr ($line, $index1 + 1); + + next unless (exists ($db->{$hash_in}) and (! defined ($db->{$hash_in}))); + + my $index2 = index ($hash_in, ".", 19); + + next if $index2 < 1; + + my $index3 = index ($hash_in, ".", $index2 + 1); + + $salt = substr ($hash_in, $index2 + 1, $index3 - $index2 - 1); + + $iter = substr ($hash_in, 19, $index2 - 19); + + next if (int ($iter) < 1); + } + # $something1$something2$something3$something4$salt$ + elsif ($mode == 7500 ) + { + my $index1 = index ($line, "\$", 11); + + next if $index1 < 1; + + my $index2 = index ($line, "\$", $index1 + 1); + + next if $index2 < 1; + + my $index3 = index ($line, "\$", $index2 + 1); + + next if $index3 < 1; + + $index2 = index ($line, ":", $index3 + 1); + + next if $index2 < 1; + + $hash_in = substr ($line, 0, $index2); + $word = substr ($line, $index2 + 1); + + next unless (exists ($db->{$hash_in}) and (! defined ($db->{$hash_in}))); + + $salt = substr ($hash_in, 11, $index3 - 10); + $salt .= substr ($hash_in, $index2 - 32) . "\$\$"; + $salt .= substr ($hash_in, $index3 + 1, $index2 - $index3 - 32 - 1); + } + # $salt$$hash + elsif ($mode == 7700 || $mode == 7800) + { + my @split1 = split (":", $line); + + next unless scalar @split1 == 2; + + my @split2 = split ('\$', $split1[0]); + + next unless scalar @split2 == 2; + + $hash_in = $split1[0]; + + $word = $split1[1]; + + next unless (exists ($db->{$hash_in}) and (! defined ($db->{$hash_in}))); + + $salt = $split2[0]; + } + # DNSSEC + elsif ($mode == 8300) + { + my @datas = split (":", $line); + + next if scalar @datas != 5; + + my $hash; + my $domain; + + ($hash, $domain, $salt, $iter, $word) = @datas; + + $hash_in = $hash . ":" . $domain . ":" . $salt . ":" . $iter; + + next unless (exists ($db->{$hash_in}) and (! defined ($db->{$hash_in}))); + + $salt = $domain . ":" . $salt; + } + # RACF + elsif ($mode == 8500) + { + my @line_elements = split (":", $line); + + next if scalar @line_elements < 2; + + # get hash and word + + $hash_in = shift @line_elements; + + $word = join (":", @line_elements); + + # get signature + + my @hash_elements = split ('\*', $hash_in); + + next unless ($hash_elements[0] eq '$racf$'); + + $salt = $hash_elements[1]; + + next unless (exists ($db->{$hash_in}) and (! defined ($db->{$hash_in}))); + } + # DOMINO 6 + elsif ($mode == 8700) + { + # split hash and plain + my $index = index ($line, ":"); + + next if $index < 1; + + $hash_in = substr ($line, 0, $index); + $word = substr ($line, $index + 1); + + next unless (exists ($db->{$hash_in}) and (! defined ($db->{$hash_in}))); + + my $plain_base64 = substr ($hash_in, 2, -1); + + ($_, $salt, $param) = domino_decode ($plain_base64); + } + # PHPS + elsif ($mode == 2612) + { + next unless (substr ($line, 0, 6) eq '$PHPS$'); + + # get hash + my $index1 = index ($line, "\$", 6); + + next if $index1 < 1; + + $salt = substr ($line, 6, $index1 - 6); + + $salt = pack ("H*", $salt); + + my $index2 = index ($line, "\:", $index1 + 1); + + next if $index2 < 1; + + $word = substr ($line, $index2 + 1); + + $hash_in = substr ($line, 0, $index2); + + next unless (exists ($db->{$hash_in}) and (! defined ($db->{$hash_in}))); + } + # Mediawiki B type + elsif ($mode == 3711) + { + next unless (substr ($line, 0, 3) eq '$B$'); + + # get hash + my $index1 = index ($line, "\$", 3); + + next if $index1 < 1; + + $salt = substr ($line, 3, $index1 - 3); + + my $index2 = index ($line, ":", $index1 + 1); + + next if $index2 < 1; + + $word = substr ($line, $index2 + 1); + + $hash_in = substr ($line, 0, $index2); + + next unless (exists ($db->{$hash_in}) and (! defined ($db->{$hash_in}))); + } + # scrypt + elsif ($mode == 8900) + { + next unless (substr ($line, 0, 7) eq 'SCRYPT:'); + + # get hash + my $index1 = index ($line, ":", 7); + + next if $index1 < 1; + + # N + my $N = substr ($line, 7, $index1 - 7); + + my $index2 = index ($line, ":", $index1 + 1); + + next if $index2 < 1; + + # r + my $r = substr ($line, $index1 + 1, $index2 - $index1 - 1); + + $index1 = index ($line, ":", $index2 + 1); + + next if $index1 < 1; + + # p + my $p = substr ($line, $index2 + 1, $index1 - $index2 - 1); + + $param = $N; + $param2 = $r; + $param3 = $p; + + $index2 = index ($line, ":", $index1 + 1); + + next if $index2 < 1; + + # salt + $salt = substr ($line, $index1 + 1, $index2 - $index1 - 1); + + $salt = decode_base64 ($salt); + + $index1 = index ($line, ":", $index2 + 1); + + next if $index1 < 1; + + # digest + + $word = substr ($line, $index1 + 1); + $hash_in = substr ($line, 0, $index1); + + next unless (exists ($db->{$hash_in}) and (! defined ($db->{$hash_in}))); + } + # LOTUS 8 + elsif ($mode == 9100) + { + # split hash and plain + my $index = index ($line, ":"); + + next if $index < 1; + + $hash_in = substr ($line, 0, $index); + $word = substr ($line, $index + 1); + + next unless (exists ($db->{$hash_in}) and (! defined ($db->{$hash_in}))); + + my $base64_part = substr ($hash_in, 2, -1); + + ($_, $salt, $iter, $param) = domino_85x_decode ($base64_part); + + next if ($iter < 1); + } + # Cisco $8$ - PBKDF2-HMAC-SHA256 + elsif ($mode == 9200) + { + next unless (substr ($line, 0, 3) eq '$8$'); + + # get hash + my $index1 = index ($line, "\$", 3); + + next if $index1 != 17; + + my $index2 = index ($line, "\$", $index1 + 1); + + # salt + $salt = substr ($line, 3, $index1 - 3); + + $index1 = index ($line, ":", $index1 + 1); + + next if $index1 < 1; + + # digest + + $word = substr ($line, $index1 + 1); + $hash_in = substr ($line, 0, $index1); + + next unless (exists ($db->{$hash_in}) and (! defined ($db->{$hash_in}))); + } + # Cisco $9$ - scrypt + elsif ($mode == 9300) + { + next unless (substr ($line, 0, 3) eq '$9$'); + + # get hash + my $index1 = index ($line, "\$", 3); + + next if $index1 != 17; + + my $index2 = index ($line, "\$", $index1 + 1); + + # salt + $salt = substr ($line, 3, $index1 - 3); + + $index1 = index ($line, ":", $index1 + 1); + + next if $index1 < 1; + + # digest + + $word = substr ($line, $index1 + 1); + $hash_in = substr ($line, 0, $index1); + + next unless (exists ($db->{$hash_in}) and (! defined ($db->{$hash_in}))); + } + # Office 2007 + elsif ($mode == 9400) + { + ($hash_in, $word) = split ":", $line; + + next unless defined $hash_in; + next unless defined $word; + + my @data = split /\*/, $hash_in; + + next unless scalar @data == 8; + + next unless (shift @data eq '$office$'); + next unless (shift @data eq '2007'); + next unless (shift @data eq '20'); + + my $aes_key_size = shift @data; + + next unless (($aes_key_size eq '128') || ($aes_key_size eq '256')); + next unless (shift @data eq '16'); + + next unless (length $data[0] == 32); + next unless (length $data[1] == 32); + next unless (length $data[2] == 40); + + $salt = shift @data; + $param = shift @data; + $param2 = $aes_key_size; + + next unless (exists ($db->{$hash_in}) and (! defined ($db->{$hash_in}))); + } + # Office 2010 + elsif ($mode == 9500) + { + ($hash_in, $word) = split ":", $line; + + next unless defined $hash_in; + next unless defined $word; + + my @data = split /\*/, $hash_in; + + next unless scalar @data == 8; + + next unless (shift @data eq '$office$'); + next unless (shift @data eq '2010'); + next unless (shift @data eq '100000'); + next unless (shift @data eq '128'); + next unless (shift @data eq '16'); + + next unless (length $data[0] == 32); + next unless (length $data[1] == 32); + next unless (length $data[2] == 64); + + $salt = shift @data; + $param = shift @data; + + next unless (exists ($db->{$hash_in}) and (! defined ($db->{$hash_in}))); + } + # Office 2013 + elsif ($mode == 9600) + { + ($hash_in, $word) = split ":", $line; + + next unless defined $hash_in; + next unless defined $word; + + my @data = split /\*/, $hash_in; + + next unless scalar @data == 8; + + next unless (shift @data eq '$office$'); + next unless (shift @data eq '2013'); + next unless (shift @data eq '100000'); + next unless (shift @data eq '256'); + next unless (shift @data eq '16'); + + next unless (length $data[0] == 32); + next unless (length $data[1] == 32); + next unless (length $data[2] == 64); + + $salt = shift @data; + $param = shift @data; + + next unless (exists ($db->{$hash_in}) and (! defined ($db->{$hash_in}))); + } + # Office Old $1 $2 + elsif ($mode == 9700) + { + ($hash_in, $word) = split ":", $line; + + next unless defined $hash_in; + next unless defined $word; + + my @data = split /\*/, $hash_in; + + next unless scalar @data == 4; + + my $signature = shift @data; + + next unless (($signature eq '$oldoffice$0') || ($signature eq '$oldoffice$1')); + + next unless (length $data[0] == 32); + next unless (length $data[1] == 32); + next unless (length $data[2] == 32); + + $salt = shift @data; + $param = shift @data; + $param2 = substr ($signature, 11, 1); + + next unless (exists ($db->{$hash_in}) and (! defined ($db->{$hash_in}))); + } + # Office Old $3 $4 + elsif ($mode == 9800) + { + ($hash_in, $word) = split ":", $line; + + next unless defined $hash_in; + next unless defined $word; + + my @data = split /\*/, $hash_in; + + next unless scalar @data == 4; + + my $signature = shift @data; + + next unless (($signature eq '$oldoffice$3') || ($signature eq '$oldoffice$4')); + + next unless (length $data[0] == 32); + next unless (length $data[1] == 32); + next unless (length $data[2] == 40); + + $salt = shift @data; + $param = shift @data; + $param2 = substr ($signature, 11, 1); + + next unless (exists ($db->{$hash_in}) and (! defined ($db->{$hash_in}))); + } + # Django (PBKDF2-SHA256) + elsif ($mode == 10000) + { + next unless (substr ($line, 0, 14) eq 'pbkdf2_sha256$'); + + # get hash + my $index1 = index ($line, "\$", 14); + + next if $index1 < 1; + + my $index2 = index ($line, "\$", $index1 + 1); + + # iter + + $iter = substr ($line, 14, $index1 - 14); + + + # salt + $salt = substr ($line, $index1 + 1, $index2 - $index1 - 1); + + # digest + + $index1 = index ($line, ":", $index2 + 1); + + next if $index1 < 1; + + $word = substr ($line, $index1 + 1); + $hash_in = substr ($line, 0, $index1); + + next unless (exists ($db->{$hash_in}) and (! defined ($db->{$hash_in}))); + } + # SipHash + elsif ($mode == 10100) + { + my $hash; + + ($hash, undef, undef, $salt, $word) = split ":", $line; + + next unless defined $hash; + next unless defined $salt; + next unless defined $word; + + next unless (length $hash == 16); + next unless (length $salt == 32); + + my $hash_in = sprintf ("%s:2:4:%s", $hash, $salt); + + next unless (exists ($db->{$hash_in}) and (! defined ($db->{$hash_in}))); + } + # Cram MD5 + elsif ($mode == 10200) + { + next unless (substr ($line, 0, 10) eq '$cram_md5$'); + + # get hash + my $index1 = index ($line, "\$", 10); + + next if $index1 < 1; + + # challenge + + my $challengeb64 = substr ($line, 10, $index1 - 10); + $salt = decode_base64 ($challengeb64); + + # response + + my $index2 = index ($line, ":", $index1 + 1); + + next if $index2 < 1; + + my $responseb64 = substr ($line, $index1 + 1, $index2 - $index1 - 1); + my $response = decode_base64 ($responseb64); + + $param = substr ($response, 0, length ($response) - 32 - 1); # -1 is for space + + $word = substr ($line, $index2 + 1); + $hash_in = substr ($line, 0, $index2); + + next unless (exists ($db->{$hash_in}) and (! defined ($db->{$hash_in}))); + } + # SAP CODVN H (PWDSALTEDHASH) iSSHA-1 + elsif ($mode == 10300) + { + next unless (substr ($line, 0, 10) eq '{x-issha, '); + + # get iterations + + my $index1 = index ($line, "}", 10); + + next if $index1 < 1; + + $iter = substr ($line, 10, $index1 - 10); + + $iter = int ($iter); + + # base64 substring + + my $base64_encoded = substr ($line, $index1 + 1); + my $base64_decoded = decode_base64 ($base64_encoded); + + $salt = substr ($base64_decoded, 20); + + my $index2 = index ($line, ":", $index1 + 1); + + next if $index2 < 1; + + $word = substr ($line, $index2 + 1); + $hash_in = substr ($line, 0, $index2); + + next unless (exists ($db->{$hash_in}) and (! defined ($db->{$hash_in}))); + } + # PDF 1.1 - 1.3 (Acrobat 2 - 4) + elsif ($mode == 10400) + { + ($hash_in, $word) = split ":", $line; + + next unless defined $hash_in; + next unless defined $word; + + my @data = split /\*/, $hash_in; + + next unless scalar @data == 11; + + next unless (shift @data eq '$pdf$1'); + next unless (shift @data eq '2'); + next unless (shift @data eq '40'); + my $P = shift @data; + next unless (shift @data eq '0'); + next unless (shift @data eq '16'); + my $id = shift @data; + next unless (shift @data eq '32'); + my $u = shift @data; + next unless (shift @data eq '32'); + my $o = shift @data; + + $salt = $id; + $param = $u; + $param2 = $o; + $param3 = $P; + + next unless (exists ($db->{$hash_in}) and (! defined ($db->{$hash_in}))); + } + # PDF 1.4 - 1.6 (Acrobat 5 - 8) + elsif ($mode == 10500) + { + ($hash_in, $word) = split ":", $line; + + next unless defined $hash_in; + next unless defined $word; + + my @data = split /\*/, $hash_in; + + next unless scalar @data == 11; + + my $V = shift @data; $V = substr ($V, 5, 1); + my $R = shift @data; + next unless (shift @data eq '128'); + my $P = shift @data; + my $enc = shift @data; + next unless (shift @data eq '16'); + my $id = shift @data; + next unless (shift @data eq '32'); + my $u = shift @data; + next unless (shift @data eq '32'); + my $o = shift @data; + + $salt = $id; + $param = $u; + $param2 = $o; + $param3 = $P; + $param4 = $V; + $param5 = $R; + $param6 = $enc; + + next unless (exists ($db->{$hash_in}) and (! defined ($db->{$hash_in}))); + } + # PDF 1.7 Level 3 (Acrobat 9) + elsif ($mode == 10600) + { + ($hash_in, $word) = split ":", $line; + + next unless defined $hash_in; + next unless defined $word; + + my @data = split /\*/, $hash_in; + + next unless scalar @data >= 11; + + next unless (shift @data eq '$pdf$5'); + next unless (shift @data eq '5'); + next unless (shift @data eq '256'); + next unless (shift @data eq '-1028'); + next unless (shift @data eq '1'); + next unless (shift @data eq '16'); + my $id = shift @data; + my $rest = join "*", @data; + + $salt = $id; + $param = $rest; + + next unless (exists ($db->{$hash_in}) and (! defined ($db->{$hash_in}))); + } + # PDF 1.7 Level 8 (Acrobat 10 - 11) + elsif ($mode == 10700) + { + ($hash_in, $word) = split ":", $line; + + next unless defined $hash_in; + next unless defined $word; + + my @data = split /\*/, $hash_in; + + next unless scalar @data >= 11; + + next unless (shift @data eq '$pdf$5'); + next unless (shift @data eq '6'); + next unless (shift @data eq '256'); + next unless (shift @data eq '-1028'); + next unless (shift @data eq '1'); + next unless (shift @data eq '16'); + my $id = shift @data; + my $rest = join "*", @data; + + $salt = $id; + $param = $rest; + + next unless (exists ($db->{$hash_in}) and (! defined ($db->{$hash_in}))); + } + # PBKDF2-HMAC-SHA256 + elsif ($mode == 10900) + { + next unless (substr ($line, 0, 7) eq 'sha256:'); + + # iterations + my $index1 = index ($line, ":", 7); + + next if $index1 < 1; + + $iter = substr ($line, 7, $index1 - 7); + + # salt + + my $index2 = index ($line, ":", $index1 + 1); + + next if $index2 < 1; + + $salt = substr ($line, $index1 + 1, $index2 - $index1 - 1); + + $salt = decode_base64 ($salt); + + # end of digest + + $index1 = index ($line, ":", $index2 + 1); + + next if $index1 < 1; + + # additional param = output len of pbkdf2 + + my $digest64_encoded = substr ($line, $index2 + 1, $index1 - $index2 - 1); + + my $digest = decode_base64 ($digest64_encoded); + + $param = length ($digest); + + # word / hash + + $word = substr ($line, $index1 + 1); + $hash_in = substr ($line, 0, $index1); + + next unless (exists ($db->{$hash_in}) and (! defined ($db->{$hash_in}))); + } + # PostgreSQL MD5 Authentication + elsif ($mode == 11100) + { + next unless (substr ($line, 0, 10) eq '$postgres$'); + + my $index1 = index ($line, "*", 10); + + next if $index1 < 1; + + # the user name + + $param = substr ($line, 10, $index1 - 10); + + # get the 4 byte salt + + my $index2 = index ($line, "*", $index1 + 1); + + next if $index2 < 1; + + $salt = substr ($line, $index1 + 1, $index2 - $index1 - 1); + + # word / hash + + $index1 = index ($line, ":", $index2 + 1); + + next if $index1 < 1; + + $word = substr ($line, $index1 + 1); + $hash_in = substr ($line, 0, $index1); + + next unless (exists ($db->{$hash_in}) and (! defined ($db->{$hash_in}))); + } + # MySQL MD5 Authentication + elsif ($mode == 11200) + { + next unless (substr ($line, 0, 9) eq '$mysqlna$'); + + my $index1 = index ($line, "*", 9); + + next if $index1 < 1; + + # salt + + $salt = substr ($line, 9, $index1 - 9); + + # word / hash + + $index1 = index ($line, ":", $index1 + 1); + + next if $index1 < 1; + + $word = substr ($line, $index1 + 1); + $hash_in = substr ($line, 0, $index1); + + next unless (exists ($db->{$hash_in}) and (! defined ($db->{$hash_in}))); + } + # WPA/WPA2 + elsif ($mode == 2500) + { + print "ERROR: verify currently not supported for WPA/WPA2 (because of oclHashcat's output format)\n"; + + exit (1); + } + # Bitcoin/Litecoin wallet.dat + elsif ($mode == 11300) + { + print "ERROR: verify currently not supported for Bitcoin/Litecoin wallet.dat because of unknown crypt data\n"; + + exit (1); + } + # SIP digest authentication (MD5) + elsif ($mode == 11400) + { + next unless (substr ($line, 0, 6) eq '$sip$*'); + + # URI_server: + + my $index1 = index ($line, "*", 6); + + next if $index1 < 0; + + $param10 = substr ($line, 6, $index1 - 6); + + next if (length ($param10) > 32); + + # URI_client: + + my $index2 = index ($line, "*", $index1 + 1); + + next if $index2 < 0; + + $param11 = substr ($line, $index1 + 1, $index2 - $index1 - 1); + + next if (length ($param11) > 32); + + # user: + + $index1 = index ($line, "*", $index2 + 1); + + next if $index1 < 0; + + $param = substr ($line, $index2 + 1, $index1 - $index2 - 1); + + next if (length ($param) > 12); + + # realm: + + $index2 = index ($line, "*", $index1 + 1); + + next if $index2 < 0; + + $param2 = substr ($line, $index1 + 1, $index2 - $index1 - 1); + + next if (length ($param2) > 20); + + # method: + + $index1 = index ($line, "*", $index2 + 1); + + next if $index1 < 0; + + $param6 = substr ($line, $index2 + 1, $index1 - $index2 - 1); + + next if (length ($param6) > 24); + + # URI_prefix: + + $index2 = index ($line, "*", $index1 + 1); + + next if $index2 < 0; + + $param7 = substr ($line, $index1 + 1, $index2 - $index1 - 1); + + next if (length ($param7) > 10); + + # URI_resource: + + $index1 = index ($line, "*", $index2 + 1); + + next if $index1 < 0; + + $param8 = substr ($line, $index2 + 1, $index1 - $index2 - 1); + + next if (length ($param8) > 32); + + # URI_suffix: + + $index2 = index ($line, "*", $index1 + 1); + + next if $index2 < 0; + + $param9 = substr ($line, $index1 + 1, $index2 - $index1 - 1); + + next if (length ($param9) > 32); + + # nonce: + + $index1 = index ($line, "*", $index2 + 1); + + next if $index1 < 0; + + $salt = substr ($line, $index2 + 1, $index1 - $index2 - 1); + + next if (length ($salt) > 34); + + # nonce_client: + + $index2 = index ($line, "*", $index1 + 1); + + next if $index2 < 0; + + $param4 = substr ($line, $index1 + 1, $index2 - $index1 - 1); + + next if (length ($param4) > 12); + + # nonce_count: + + $index1 = index ($line, "*", $index2 + 1); + + next if $index1 < 0; + + $param3 = substr ($line, $index2 + 1, $index1 - $index2 - 1); + + next if (length ($param3) > 10); + + # qop: + + $index2 = index ($line, "*", $index1 + 1); + + next if $index2 < 0; + + $param5 = substr ($line, $index1 + 1, $index2 - $index1 - 1); + + next if (length ($param5) > 8); + + # directive: + + $index1 = index ($line, "*", $index2 + 1); + + next if $index1 < 0; + + my $directive = substr ($line, $index2 + 1, $index1 - $index2 - 1); + + next unless ($directive eq "MD5"); + + # hash_buf: + + $index2 = index ($line, ":", $index1 + 1); + + next if $index2 < 0; + + my $hex_digest = substr ($line, $index1 + 1, $index2 - $index1 - 1); + + next unless (length ($hex_digest) == 32); + + $word = substr ($line, $index2 + 1); + $hash_in = substr ($line, 0, $index2); + + next unless (exists ($db->{$hash_in}) and (! defined ($db->{$hash_in}))); + } + # 7-Zip + elsif ($mode == 11600) + { + next unless (substr ($line, 0, 4) eq '$7z$'); + + # p + + my $index1 = index ($line, '$', 4); + + next if $index1 < 0; + + my $p = substr ($line, 4, $index1 - 4); + + next unless ($p eq "0"); + + # num cycle power + + my $index2 = index ($line, '$', $index1 + 1); + + next if $index2 < 0; + + $iter = substr ($line, $index1 + 1, $index2 - $index1 - 1); + + # seven zip salt length + + $index1 = index ($line, '$', $index2 + 1); + + next if $index1 < 0; + + $param = substr ($line, $index2 + 1, $index1 - $index2 - 1); + + # seven zip salt + + $index2 = index ($line, '$', $index1 + 1); + + next if $index2 < 0; + + $param2 = substr ($line, $index1 + 1, $index2 - $index1 - 1); + + # salt len + + $index1 = index ($line, '$', $index2 + 1); + + next if $index1 < 0; + + $param3 = substr ($line, $index2 + 1, $index1 - $index2 - 1); + + # salt + + $index2 = index ($line, '$', $index1 + 1); + + next if $index2 < 0; + + $salt = substr ($line, $index1 + 1, $index2 - $index1 - 1); + + $salt = pack ("H*", $salt); + + # crc / hash + + $index1 = index ($line, '$', $index2 + 1); + + next if $index1 < 0; + + my $crc = substr ($line, $index2 + 1, $index1 - $index2 - 1); + + # ignore this crc, we don't need to pass it to gen_hash () + + # data len + + $index2 = index ($line, '$', $index1 + 1); + + next if $index2 < 0; + + $param4 = substr ($line, $index1 + 1, $index2 - $index1 - 1); + + # unpack size + + $index1 = index ($line, '$', $index2 + 1); + + next if $index1 < 0; + + $param5 = substr ($line, $index2 + 1, $index1 - $index2 - 1); + + # data + + $index2 = index ($line, ':', $index1 + 1); + + next if $index2 < 0; + + $param6 = substr ($line, $index1 + 1, $index2 - $index1 - 1); + $param6 = pack ("H*", $param6); + + $word = substr ($line, $index2 + 1); + $hash_in = substr ($line, 0, $index2); + + next unless (exists ($db->{$hash_in}) and (! defined ($db->{$hash_in}))); + } + # PBKDF2-HMAC-MD5 + elsif ($mode == 11900) + { + next unless (substr ($line, 0, 4) eq 'md5:'); + + # iterations + my $index1 = index ($line, ":", 4); + + next if $index1 < 1; + + $iter = substr ($line, 4, $index1 - 4); + + # salt + + my $index2 = index ($line, ":", $index1 + 1); + + next if $index2 < 1; + + $salt = substr ($line, $index1 + 1, $index2 - $index1 - 1); + + $salt = decode_base64 ($salt); + + # end of digest + + $index1 = index ($line, ":", $index2 + 1); + + next if $index1 < 1; + + # additional param = output len of pbkdf2 + + my $digest64_encoded = substr ($line, $index2 + 1, $index1 - $index2 - 1); + + my $digest = decode_base64 ($digest64_encoded); + + $param = length ($digest); + + # word / hash + + $word = substr ($line, $index1 + 1); + $hash_in = substr ($line, 0, $index1); + + next unless (exists ($db->{$hash_in}) and (! defined ($db->{$hash_in}))); + } + # PBKDF2-HMAC-SHA1 + elsif ($mode == 12000) + { + next unless (substr ($line, 0, 5) eq 'sha1:'); + + # iterations + my $index1 = index ($line, ":", 5); + + next if $index1 < 1; + + $iter = substr ($line, 5, $index1 - 5); + + # salt + + my $index2 = index ($line, ":", $index1 + 1); + + next if $index2 < 1; + + $salt = substr ($line, $index1 + 1, $index2 - $index1 - 1); + + $salt = decode_base64 ($salt); + + # end of digest + + $index1 = index ($line, ":", $index2 + 1); + + next if $index1 < 1; + + # additional param = output len of pbkdf2 + + my $digest64_encoded = substr ($line, $index2 + 1, $index1 - $index2 - 1); + + my $digest = decode_base64 ($digest64_encoded); + + $param = length ($digest); + + # word / hash + + $word = substr ($line, $index1 + 1); + $hash_in = substr ($line, 0, $index1); + + next unless (exists ($db->{$hash_in}) and (! defined ($db->{$hash_in}))); + } + # PBKDF2-HMAC-SHA512 + elsif ($mode == 12100) + { + next unless (substr ($line, 0, 7) eq 'sha512:'); + + # iterations + my $index1 = index ($line, ":", 7); + + next if $index1 < 1; + + $iter = substr ($line, 7, $index1 - 7); + + # salt + + my $index2 = index ($line, ":", $index1 + 1); + + next if $index2 < 1; + + $salt = substr ($line, $index1 + 1, $index2 - $index1 - 1); + + $salt = decode_base64 ($salt); + + # end of digest + + $index1 = index ($line, ":", $index2 + 1); + + next if $index1 < 1; + + # additional param = output len of pbkdf2 + + my $digest64_encoded = substr ($line, $index2 + 1, $index1 - $index2 - 1); + + my $digest = decode_base64 ($digest64_encoded); + + $param = length ($digest); + + # word / hash + + $word = substr ($line, $index1 + 1); + $hash_in = substr ($line, 0, $index1); + + next unless (exists ($db->{$hash_in}) and (! defined ($db->{$hash_in}))); + } + # ecryptfs + elsif ($mode == 12200) + { + next unless (substr ($line, 0, 12) eq '$ecryptfs$0$'); + + # check if default salt + + $param = 1; + + $param = 0 if (substr ($line, 12, 2) eq '1$'); + + # salt + + $salt = ""; + + my $index1 = 12; + + if ($param == 0) # we need to extract the salt + { + $index1 = index ($line, '$', $index1); + + next if $index1 < 1; + + my $index2 = index ($line, '$', $index1 + 1); + + next if $index2 < 1; + + $salt = substr ($line, $index1 + 1, $index2 - $index1 - 1); + + $index1 = $index2; + } + + $index1 = index ($line, ':', $index1 + 1); + + next if $index1 < 1; + + # word / hash + + $word = substr ($line, $index1 + 1); + $hash_in = substr ($line, 0, $index1); + + next unless (exists ($db->{$hash_in}) and (! defined ($db->{$hash_in}))); + } + # Oracle T: Type (Oracle 12+) + elsif ($mode == 12300) + { + my $index1 = index ($line, ':'); + + next if ($index1 != 160); + + # salt + + $salt = substr ($line, 128, 32); + + # word / hash + + $word = substr ($line, $index1 + 1); + $hash_in = substr ($line, 0, $index1); + + next unless (exists ($db->{$hash_in}) and (! defined ($db->{$hash_in}))); + } + # BSDiCrypt, Extended DES + elsif ($mode == 12400) + { + next unless (substr ($line, 0, 1) eq '_'); + + my $index1 = index ($line, ':', 20); + + next if ($index1 != 20); + + # iter + + $iter = substr ($line, 1, 4); + + $iter = base64_to_int24 ($iter); + + # salt + + $salt = substr ($line, 5, 4); + + # word / hash + + $word = substr ($line, $index1 + 1); + $hash_in = substr ($line, 0, $index1); + + next unless (exists ($db->{$hash_in}) and (! defined ($db->{$hash_in}))); + } + # Blockchain, My Wallet + elsif ($mode == 12700) + { + my $index1 = index ($line, ':'); + + next if ($index1 < 0); + + $hash_in = substr ($line, 0, $index1); + $word = substr ($line, $index1 + 1); + + my (undef, $signature, $data_len, $data_buf) = split '\$', $hash_in; + + next unless ($signature eq "blockchain"); + + next unless (($data_len * 2) == length $data_buf); + + $salt = substr ($data_buf, 0, 32); + $param = substr ($data_buf, 32); + + next unless (exists ($db->{$hash_in}) and (! defined ($db->{$hash_in}))); + } + elsif ($mode == 12800) + { + ($hash_in, $word) = split ":", $line; + + next unless defined $hash_in; + next unless defined $word; + + my @data = split /\,/, $hash_in; + + next unless scalar @data == 4; + + next unless (shift @data eq 'v1;PPH1_MD4'); + + $salt = shift @data; + $iter = shift @data; + + next unless (exists ($db->{$hash_in}) and (! defined ($db->{$hash_in}))); + } + else + { + print "ERROR: hash mode is not supported\n"; + + exit (1); + } + + if ($word =~ m/^\$HEX\[[0-9a-fA-F]*\]$/) + { + $word = pack ("H*", substr ($word, 5, -1)); + } + + # finally generate the hash + + # special case: + if ($mode == 6800) + { + # check both variations + $hash_out = gen_hash ($mode, $word, $salt, $iter, 1); + + $len = length $hash_out; # == length $alternative + + if (substr ($line, 0, $len) ne $hash_out) + { + my $alternative = gen_hash ($mode, $word, $salt, $iter, 2); + + return unless (substr ($line, 0, $len) eq $alternative); + } + } + elsif ($mode == 8700) + { + $hash_out = gen_hash ($mode, $word, $salt, 0, $param); + + $len = length $hash_out; + + return unless (substr ($line, 0, $len) eq $hash_out); + } + elsif ($mode == 8900) + { + $hash_out = gen_hash ($mode, $word, $salt, 0, $param, $param2, $param3); + + $len = length $hash_out; + + return unless (substr ($line, 0, $len) eq $hash_out); + } + elsif ($mode == 9100) + { + $hash_out = gen_hash ($mode, $word, $salt, $iter, $param); + + $len = length $hash_out; + + return unless (substr ($line, 0, $len) eq $hash_out); + } + elsif ($mode == 190) + { + $hash_out = gen_hash ($mode, $word, $salt, $iter, 0); + + $len = length $hash_out; # == length $alternative + + if (substr ($line, 0, $len) ne $hash_out) + { + my $alternative = gen_hash ($mode, $word, $salt, $iter, 1); + + return unless (substr ($line, 0, $len) eq $alternative); + } + } + elsif ($mode == 3300) + { + $hash_out = gen_hash ($mode, $word, $salt, $iter, $param); + + $len = length $hash_out; + + return unless (substr ($line, 0, $len) eq $hash_out); + } + elsif ($mode == 5100) + { + # check 3 variants (start, middle, end) + + my $idx = 0; + + $hash_out = gen_hash ($mode, $word, $salt, $iter, $idx++); + + $len = length $hash_out; # == length $alternative + + if (substr ($line, 0, $len) ne $hash_out) + { + my $alternative = gen_hash ($mode, $word, $salt, $iter, $idx++); + + if (substr ($line, 0, $len) ne $alternative) + { + my $alternative = gen_hash ($mode, $word, $salt, $iter, $idx++); + + return unless (substr ($line, 0, $len) eq $alternative); + } + } + } + elsif ($mode == 9400) + { + $hash_out = gen_hash ($mode, $word, $salt, 50000, $param, $param2); + + $len = length $hash_out; + + return unless (substr ($line, 0, $len) eq $hash_out); + } + elsif ($mode == 9500) + { + $hash_out = gen_hash ($mode, $word, $salt, 100000, $param); + + $len = length $hash_out; + + return unless (substr ($line, 0, $len) eq $hash_out); + } + elsif ($mode == 9600) + { + $hash_out = gen_hash ($mode, $word, $salt, 100000, $param); + + $len = length $hash_out; + + return unless (substr ($line, 0, $len) eq $hash_out); + } + elsif ($mode == 9700) + { + $hash_out = gen_hash ($mode, $word, $salt, 0, $param, $param2); + + $len = length $hash_out; + + return unless (substr ($line, 0, $len) eq $hash_out); + } + elsif ($mode == 9800) + { + $hash_out = gen_hash ($mode, $word, $salt, 0, $param, $param2); + + $len = length $hash_out; + + return unless (substr ($line, 0, $len) eq $hash_out); + } + elsif ($mode == 10400) + { + $hash_out = gen_hash ($mode, $word, $salt, 0, $param, $param2, $param3); + + $len = length $hash_out; + + return unless (substr ($line, 0, $len) eq $hash_out); + } + elsif ($mode == 10500) + { + $hash_out = gen_hash ($mode, $word, $salt, 0, $param, $param2, $param3, $param4, $param5, $param6); + + $len = length $hash_out; + + return unless (substr ($line, 0, $len) eq $hash_out); + } + elsif ($mode == 10600) + { + $hash_out = gen_hash ($mode, $word, $salt, 0, $param); + + $len = length $hash_out; + + return unless (substr ($line, 0, $len) eq $hash_out); + } + elsif ($mode == 10700) + { + $hash_out = gen_hash ($mode, $word, $salt, 0, $param); + + $len = length $hash_out; + + return unless (substr ($line, 0, $len) eq $hash_out); + } + elsif ($mode == 10900) + { + $hash_out = gen_hash ($mode, $word, $salt, $iter, $param); + + $len = length $hash_out; + + return unless (substr ($line, 0, $len) eq $hash_out); + } + elsif ($mode == 11100) + { + $hash_out = gen_hash ($mode, $word, $salt, $iter, $param); + + $len = length $hash_out; + + return unless (substr ($line, 0, $len) eq $hash_out); + } + elsif ($mode == 11400) + { + $hash_out = gen_hash ($mode, $word, $salt, $iter, $param, $param2, $param3, $param4, $param5, $param6, $param7, $param8, $param9, $param10, $param11); + + $len = length $hash_out; + + return unless (substr ($line, 0, $len) eq $hash_out); + } + elsif ($mode == 11600) + { + $hash_out = gen_hash ($mode, $word, $salt, $iter, $param, $param2, $param3, $param4, $param5, $param6); + + $len = length $hash_out; + + return unless (substr ($line, 0, $len) eq $hash_out); + } + elsif ($mode == 11900) + { + $hash_out = gen_hash ($mode, $word, $salt, $iter, $param); + + $len = length $hash_out; + + return unless (substr ($line, 0, $len) eq $hash_out); + } + elsif ($mode == 12000) + { + $hash_out = gen_hash ($mode, $word, $salt, $iter, $param); + + $len = length $hash_out; + + return unless (substr ($line, 0, $len) eq $hash_out); + } + elsif ($mode == 12100) + { + $hash_out = gen_hash ($mode, $word, $salt, $iter, $param); + + $len = length $hash_out; + + return unless (substr ($line, 0, $len) eq $hash_out); + } + elsif ($mode == 12200) + { + $hash_out = gen_hash ($mode, $word, $salt, $iter, $param); + + $len = length $hash_out; + + return unless (substr ($line, 0, $len) eq $hash_out); + } + elsif ($mode == 12700) + { + # this is very special, we can't call gen_hash () because the param part is not always the same + # we only know that it should contain the letters "guid" at the beginning of the decryted string + + my $pbkdf2 = Crypt::PBKDF2->new ( + hash_class => 'HMACSHA1', + iterations => 10, + output_len => 32 + ); + + my $salt_bin = pack ("H*", $salt); + + my $key = $pbkdf2->PBKDF2 ($salt_bin, $word); + + my $cipher = Crypt::CBC->new({ + key => $key, + cipher => "Crypt::Rijndael", + iv => $salt_bin, + literal_key => 1, + header => "none", + keysize => 32 + }); + + my $param_bin = pack ("H*", $param); + + my $decrypted = $cipher->decrypt ($param_bin); + + my $decrypted_part = substr ($decrypted, 1, 16); + + return unless ($decrypted_part =~ /"guid"/); + + $hash_out = $hash_in; + } + else + { + $hash_out = gen_hash ($mode, $word, $salt, $iter); + + $len = length $hash_out; + + # special cases: + if ($mode == 400) + { + # allow $P$ and $H$ for -m 400 + next unless (substr ($line, 3, $len - 3) eq substr ($hash_out, 3)); + } + elsif ($mode == 5600) + { + # oclHashcat outputs the user name always upper-case, we need + next unless (substr ($line, 0, $len) eq $hash_out); + + my $found = 0; + + my $hash_out_lower = lc ($hash_out); + + for my $key (keys %{$db}) + { + if (lc ($key) eq $hash_out_lower) + { + $found = 1; + + last; + } + } + + next unless $found; + } + else + { + next unless (substr ($line, 0, $len) eq $hash_out); + } + } + + # do not forget "exists ($db->$hash_out)" should be done above! + $db->{$hash_out} = $word; + print OUT $line . "\n"; + } + + close (IN); + close (OUT); +} + +sub passthrough +{ + my $mode = shift || 0; + + while (my $word_buf = <>) + { + chomp ($word_buf); + + next if length ($word_buf) > 31; + + ## + ## gen salt + ## + + my @salt_arr; + + for (my $i = 0; $i < 256; $i++) + { + my $c = get_random_chr (0x30, 0x39); + + push (@salt_arr, $c); + } + + my $salt_buf = join ("", @salt_arr); + + ## + ## gen hash + ## + + my $tmp_hash; + + if ($mode == 0 || $mode == 100 || $mode == 101 || $mode == 190 || $mode == 200 || $mode == 300 || $mode == 600 || $mode == 900 || $mode == 1000 || $mode == 1400 || $mode == 1700 || $mode == 2400 || $mode == 2600 || $mode == 3500 || $mode == 4300 || $mode == 4400 || $mode == 4500 || $mode == 4600 || $mode == 4700 || $mode == 5000 || $mode == 5100 || $mode == 6000 || $mode == 6100 || $mode == 6900 || $mode == 5700 || $mode == 9900 || $mode == 10800 || $mode == 11500) + { + $tmp_hash = gen_hash ($mode, $word_buf, ""); + } + elsif ($mode == 10 || $mode == 20 || $mode == 23 || $mode == 30 || $mode == 40 || $mode == 50 || $mode == 60 || $mode == 110 || $mode == 120 || $mode == 130 || $mode == 140 || $mode == 150 || $mode == 160 || $mode == 1410 || $mode == 1420 || $mode == 1430 || $mode == 1440 || $mode == 1450 || $mode == 1460 || $mode == 1710 || $mode == 1711 || $mode == 1720 || $mode == 1730 || $mode == 1740 || $mode == 1750 || $mode == 1760 || $mode == 3610 || $mode == 3710 || $mode == 3711 || $mode == 3720 || $mode == 3800 || $mode == 3910 || $mode == 4010 || $mode == 4110 || $mode == 4210 || $mode == 4900 || $mode == 8900 || $mode == 10000 || $mode == 10200 || $mode == 10900 || $mode == 11900 || $mode == 12000 || $mode == 12100) + { + my $salt_len = get_random_num (1, 15); + + $tmp_hash = gen_hash ($mode, $word_buf, substr ($salt_buf, 0, $salt_len)); + } + elsif ($mode == 11 || $mode == 12 || $mode == 7600 || $mode == 12300) + { + $tmp_hash = gen_hash ($mode, $word_buf, substr ($salt_buf, 0, 32)); + } + elsif ($mode == 21) + { + $tmp_hash = gen_hash ($mode, $word_buf, substr ($salt_buf, 0, 2)); + } + elsif ($mode == 22) + { + my $salt_len = get_random_num (1, 15); + + $tmp_hash = gen_hash ($mode, $word_buf, substr ($salt_buf, 0, $salt_len)); + } + elsif ($mode == 111 || $mode == 122 || $mode == 131 || $mode == 132 || $mode == 400 || $mode == 500 || $mode == 1600 || $mode == 1722 || $mode == 1731 || $mode == 1800 || $mode == 6300 || $mode == 7900 || $mode == 8100 || $mode == 11100) + { + $tmp_hash = gen_hash ($mode, $word_buf, substr ($salt_buf, 0, 8)); + } + elsif ($mode == 112) + { + $tmp_hash = gen_hash ($mode, $word_buf, substr ($salt_buf, 0, 20)); + } + elsif ($mode == 121) + { + my $salt_len = get_random_num (1, 9); + + $tmp_hash = gen_hash ($mode, $word_buf, substr ($salt_buf, 0, $salt_len)); + } + elsif ($mode == 141 || $mode == 1441) + { + my $salt_len = get_random_num (1, 15); + + $tmp_hash = gen_hash ($mode, $word_buf, substr ($salt_buf, 0, $salt_len)); + } + elsif ($mode == 1100) + { + my $salt_len = get_random_num (1, 19); + + $tmp_hash = gen_hash ($mode, $word_buf, substr ($salt_buf, 0, $salt_len)); + } + elsif ($mode == 1500) + { + next if length ($word_buf) > 8; + + $tmp_hash = gen_hash ($mode, $word_buf, substr ($salt_buf, 0, 2)); + } + elsif ($mode == 2100) + { + next if length ($word_buf) > 13; + + my $salt_len = get_random_num (1, 19); + + $tmp_hash = gen_hash ($mode, $word_buf, substr ($salt_buf, 0, $salt_len)); + } + elsif ($mode == 2410) + { + next if length ($word_buf) > 15; + + my $salt_len = get_random_num (1, 15); + + my $word_len = length ($word_buf); + + $salt_len = min ($salt_len, 15 - $word_len); + + $tmp_hash = gen_hash ($mode, $word_buf, substr ($salt_buf, 0, $salt_len)); + } + elsif ($mode == 2500) + { + next if length ($word_buf) < 8; + + my $salt_len = get_random_num (0, 32); + + $tmp_hash = gen_hash ($mode, $word_buf, substr ($salt_buf, 0, $salt_len)); + } + elsif ($mode == 2611) + { + $tmp_hash = gen_hash ($mode, $word_buf, substr ($salt_buf, 0, 3)); + } + elsif ($mode == 2612) + { + my $salt_len = get_random_num (1, 22); + + $tmp_hash = gen_hash ($mode, $word_buf, substr ($salt_buf, 0, $salt_len)); + } + elsif ($mode == 2711) + { + $tmp_hash = gen_hash ($mode, $word_buf, substr ($salt_buf, 0, 30)); + } + elsif ($mode == 2811) + { + $tmp_hash = gen_hash ($mode, $word_buf, substr ($salt_buf, 0, 5)); + } + elsif ($mode == 3000) + { + next if length ($word_buf) > 7; + + $tmp_hash = gen_hash ($mode, $word_buf, ""); + } + elsif ($mode == 3100) + { + $tmp_hash = gen_hash ($mode, $word_buf, substr ($salt_buf, 0, 10)); + } + elsif ($mode == 3200 || $mode == 5800 || $mode == 6400 || $mode == 6500 || $mode == 6700 || $mode == 7400 || $mode == 3300 || $mode == 8000 || $mode == 9100 || $mode == 12200) + { + $tmp_hash = gen_hash ($mode, $word_buf, substr ($salt_buf, 0, 16)); + } + elsif ($mode == 3800 || $mode == 4900) + { + my $salt_len = get_random_num (1, 11); + + $tmp_hash = gen_hash ($mode, $word_buf, substr ($salt_buf, 0, $salt_len)); + } + elsif ($mode == 4800) + { + $salt_buf = get_random_md5chap_salt (substr ($salt_buf, 0, 16)); + + $tmp_hash = gen_hash ($mode, $word_buf, $salt_buf); + } + elsif ($mode == 5300 || $mode == 5400) + { + $salt_buf = get_random_ike_salt (); + + $tmp_hash = gen_hash ($mode, $word_buf, $salt_buf); + } + elsif ($mode == 5500) + { + my $user_len = get_random_num (0, 15); + my $domain_len = get_random_num (0, 15); + + $salt_buf = get_random_netntlmv1_salt ($user_len, $domain_len); + + $tmp_hash = gen_hash ($mode, $word_buf, $salt_buf); + } + elsif ($mode == 5600) + { + my $user_len = get_random_num (0, 15); + my $domain_len = get_random_num (0, 15); + + $salt_buf = get_random_netntlmv2_salt ($user_len, $domain_len); + + $tmp_hash = gen_hash ($mode, $word_buf, $salt_buf); + } + elsif ($mode == 6600) + { + $salt_buf = get_random_agilekeychain_salt (); + + $tmp_hash = gen_hash ($mode, $word_buf, $salt_buf); + } + elsif ($mode == 6800) + { + my $email_len = get_random_num (1, 15); + + my $email = ""; + + for (my $i = 0; $i < $email_len; $i++) + { + $email .= get_random_chr (0x61, 0x7a); + } + + $email .= '@trash-mail.com'; + + $tmp_hash = gen_hash ($mode, $word_buf, $email); + } + elsif ($mode == 7100) + { + $tmp_hash = gen_hash ($mode, $word_buf, substr ($salt_buf, 0, 64)); + } + elsif ($mode == 7200) + { + $tmp_hash = gen_hash ($mode, $word_buf, substr ($salt_buf, 0, 128)); + } + elsif ($mode == 7300) + { + my $salt_len = get_random_num (32, 256); + + $tmp_hash = gen_hash ($mode, $word_buf, substr ($salt_buf, 0, $salt_len)); + } + elsif ($mode == 7500) + { + $salt_buf = get_random_kerberos5_salt (substr ($salt_buf, 0, 16)); + + $tmp_hash = gen_hash ($mode, $word_buf, $salt_buf); + } + elsif ($mode == 7700) + { + next if length ($word_buf) > 8; + + $tmp_hash = gen_hash ($mode, $word_buf, substr ($salt_buf, 0, 12)); + } + elsif ($mode == 7800) + { + $tmp_hash = gen_hash ($mode, $word_buf, substr ($salt_buf, 0, 12)); + } + elsif ($mode == 8200) + { + $salt_buf = get_random_cloudkeychain_salt (); + + $tmp_hash = gen_hash ($mode, $word_buf, $salt_buf); + } + elsif ($mode == 8300) + { + $salt_buf = get_random_dnssec_salt (); + + $tmp_hash = gen_hash ($mode, $word_buf, $salt_buf); + } + elsif ($mode == 8400 || $mode == 11200) + { + $tmp_hash = gen_hash ($mode, $word_buf, substr ($salt_buf, 0, 40)); + } + elsif ($mode == 8500) + { + next if length ($word_buf) > 8; + + my $salt_len = get_random_num (1, 9); + + $tmp_hash = gen_hash ($mode, $word_buf, substr ($salt_buf, 0, $salt_len)); + } + elsif ($mode == 8600) + { + next if length ($word_buf) > 16; + + $tmp_hash = gen_hash ($mode, $word_buf, ""); + } + elsif ($mode == 8700) + { + $tmp_hash = gen_hash ($mode, $word_buf, substr ($salt_buf, 0, 5)); + } + elsif ($mode == 9200 || $mode == 9300) + { + my $salt_len = 14; + + $tmp_hash = gen_hash ($mode, $word_buf, substr ($salt_buf, 0, $salt_len)); + } + elsif ($mode == 9400 || $mode == 9500 || $mode == 9600 || $mode == 9700 || $mode == 9800) + { + next if length ($word_buf) > 19; + + my $salt_len = 32; + + $tmp_hash = gen_hash ($mode, $word_buf, substr ($salt_buf, 0, $salt_len)); + } + elsif ($mode == 10100) + { + $tmp_hash = gen_hash ($mode, $word_buf, substr ($salt_buf, 0, 32)); + } + elsif ($mode == 10300) + { + my $salt_len = get_random_num (4, 15); + + $tmp_hash = gen_hash ($mode, $word_buf, substr ($salt_buf, 0, $salt_len)); + } + elsif ($mode == 10400) + { + next if length ($word_buf) > 31; + + my $salt_len = 32; + + $tmp_hash = gen_hash ($mode, $word_buf, substr ($salt_buf, 0, $salt_len)); + } + elsif ($mode == 10500) + { + next if length ($word_buf) > 15; + + my $salt_len = 32; + + $tmp_hash = gen_hash ($mode, $word_buf, substr ($salt_buf, 0, $salt_len)); + } + elsif ($mode == 10600) + { + next if length ($word_buf) > 31; + + my $salt_len = 32; + + $tmp_hash = gen_hash ($mode, $word_buf, substr ($salt_buf, 0, $salt_len)); + } + elsif ($mode == 10700) + { + next if length ($word_buf) > 15; + + my $salt_len = 32; + + $tmp_hash = gen_hash ($mode, $word_buf, substr ($salt_buf, 0, $salt_len)); + } + elsif ($mode == 11000) + { + $tmp_hash = gen_hash ($mode, $word_buf, substr ($salt_buf, 0, 56)); + } + elsif ($mode == 11300) + { + $tmp_hash = gen_hash ($mode, $word_buf, substr ($salt_buf, 0, 16)); + } + elsif ($mode == 11400) + { + next if length ($word_buf) > 24; + + my $salt_len = get_random_num (1, 15); + + $tmp_hash = gen_hash ($mode, $word_buf, substr ($salt_buf, 0, $salt_len)); + } + elsif ($mode == 11600) + { + my $salt_len = get_random_num (0, 16); + + $tmp_hash = gen_hash ($mode, $word_buf, substr ($salt_buf, 0, $salt_len)); + } + elsif ($mode == 12400) + { + $tmp_hash = gen_hash ($mode, $word_buf, substr ($salt_buf, 0, 4)); + } + elsif ($mode == 12600) + { + $tmp_hash = gen_hash ($mode, $word_buf, substr ($salt_buf, 0, 64)); + } + elsif ($mode == 12700) + { + $tmp_hash = gen_hash ($mode, $word_buf, substr ($salt_buf, 0, 32)); + } + elsif ($mode == 12800) + { + next if length ($word_buf) > 24; + + $tmp_hash = gen_hash ($mode, $word_buf, substr ($salt_buf, 0, 20)); + } + else + { + print "ERROR: Unsupported hash type\n"; + + exit (1); + } + + print $tmp_hash, "\n"; + } +} + +sub single +{ + my $mode = shift; + + if (defined $mode) + { + @modes = ($mode); + } + + for (my $j = 0; $j < scalar @modes; $j++) + { + my $mode = $modes[$j]; + + if ($mode == 0 || $mode == 100 || $mode == 101 || $mode == 190 || $mode == 200 || $mode == 300 || $mode == 600 || $mode == 900 || $mode == 1000 || $mode == 1400 || $mode == 1700 || $mode == 2400 || $mode == 2600 || $mode == 3500 || $mode == 4300 || $mode == 4400 || $mode == 4500 || $mode == 4600 || $mode == 4700 || $mode == 5000 || $mode == 5100 || $mode == 5300 || $mode == 5400 || $mode == 6000 || $mode == 6100 || $mode == 6600 || $mode == 6900 || $mode == 5700 || $mode == 8200 || $mode == 8300 || $mode == 9900 || $mode == 10800 || $mode == 11500) + { + for (my $i = 1; $i < 32; $i++) + { + if ($len != 0) + { + rnd ($mode, $len, 0); + } + else + { + rnd ($mode, $i, 0); + } + } + } + elsif ($mode == 10 || $mode == 20 || $mode == 23 || $mode == 30 || $mode == 40 || $mode == 50 || $mode == 60 || $mode == 110 || $mode == 120 || $mode == 121 || $mode == 130 || $mode == 140 || $mode == 150 || $mode == 160 || $mode == 1410 || $mode == 1420 || $mode == 1430 || $mode == 1440 || $mode == 1450 || $mode == 1460 || $mode == 1710 || $mode == 1711 || $mode == 1720 || $mode == 1730 || $mode == 1740 || $mode == 1750 || $mode == 1760 || $mode == 2410 || $mode == 3610 || $mode == 3710 || $mode == 3711 || $mode == 3720 || $mode == 3910 || $mode == 4010 || $mode == 4110 || $mode == 4210 || $mode == 8900 || $mode == 10000 || $mode == 10200 || $mode == 10900 || $mode == 11900 || $mode == 12000 || $mode == 12100) + { + my $salt_len = get_random_num (1, 15); + + for (my $i = 1; $i < 32; $i++) + { + if ($len != 0) + { + rnd ($mode, $len, $salt_len); + } + else + { + rnd ($mode, $i, $salt_len); + } + } + } + elsif ($mode == 11 || $mode == 12 || $mode == 7600 || $mode == 12300) + { + for (my $i = 1; $i < 32; $i++) + { + if ($len != 0) + { + rnd ($mode, $len, 32); + } + else + { + rnd ($mode, $i, 32); + } + } + } + elsif ($mode == 21 || $mode == 22) + { + for (my $i = 1; $i < 32; $i++) + { + if ($len != 0) + { + rnd ($mode, $len, 2); + } + else + { + rnd ($mode, $i, 2); + } + } + } + elsif ($mode == 111 || $mode == 122 || $mode == 131 || $mode == 132 || $mode == 400 || $mode == 500 || $mode == 1600 || $mode == 1722 || $mode == 1731 || $mode == 6300 || $mode == 7900 || $mode == 8100 || $mode == 11100) + { + for (my $i = 1; $i < 32; $i++) + { + if ($len != 0) + { + rnd ($mode, $len, 8); + } + else + { + rnd ($mode, $i, 8); + } + } + } + elsif ($mode == 112) + { + for (my $i = 1; $i < 32; $i++) + { + if ($len != 0) + { + rnd ($mode, $len, 20); + } + else + { + rnd ($mode, $i, 20); + } + } + } + elsif ($mode == 141 || $mode == 3300 || $mode == 1441 || $mode == 1800 || $mode == 3200 || $mode == 4800 || $mode == 6400 || $mode == 6500 || $mode == 6700 || $mode == 7400 || $mode == 8000 || $mode == 9100 || $mode == 12200) + { + for (my $i = 1; $i < 32; $i++) + { + if ($len != 0) + { + rnd ($mode, $len, 16); + } + else + { + rnd ($mode, $i, 16); + } + } + } + if ($mode == 1100) + { + my $salt_len = get_random_num (1, 19); + + for (my $i = 1; $i < 32; $i++) + { + if ($len != 0) + { + rnd ($mode, $len, $salt_len); + } + else + { + rnd ($mode, $i, $salt_len); + } + } + } + elsif ($mode == 1500) + { + for (my $i = 1; $i < 9; $i++) + { + if ($len != 0) + { + rnd ($mode, $len, 2); + } + else + { + rnd ($mode, $i, 2); + } + } + } + elsif ($mode == 2100) + { + my $salt_len = get_random_num (1, 19); + + for (my $i = 1; $i < 13; $i++) + { + if ($len != 0) + { + rnd ($mode, $len, $salt_len); + } + else + { + rnd ($mode, $i, $salt_len); + } + } + } + elsif ($mode == 2500) + { + my $salt_len = get_random_num (0, 32); + + for (my $i = 8; $i < 16; $i++) + { + my $generate_from_len = 0; + + if ($len != 0) + { + if ($len < 8) + { + $len += 7; + } + + rnd ($mode, $len, $salt_len); + } + else + { + rnd ($mode, $i, $salt_len); + } + } + } + elsif ($mode == 2611) + { + for (my $i = 1; $i < 32; $i++) + { + if ($len != 0) + { + rnd ($mode, $len, 3); + } + else + { + rnd ($mode, $i, 3); + } + } + } + elsif ($mode == 2612) + { + my $salt_len = get_random_num (1, 22); + + for (my $i = 1; $i < 32; $i++) + { + if ($len != 0) + { + rnd ($mode, $len, $salt_len); + } + else + { + rnd ($mode, $i, $salt_len); + } + } + } + elsif ($mode == 2711) + { + for (my $i = 1; $i < 32; $i++) + { + if ($len != 0) + { + rnd ($mode, $len, 30); + } + else + { + rnd ($mode, $i, 30); + } + } + } + elsif ($mode == 2811) + { + for (my $i = 1; $i < 32; $i++) + { + if ($len != 0) + { + rnd ($mode, $len, 5); + } + else + { + rnd ($mode, $i, 5); + } + } + } + elsif ($mode == 3000) + { + for (my $i = 1; $i < 8; $i++) + { + if ($len != 0) + { + rnd ($mode, $len, 0); + } + else + { + rnd ($mode, $i, 0); + } + } + } + elsif ($mode == 3100) + { + for (my $i = 1; $i < 32; $i++) + { + if ($len != 0) + { + rnd ($mode, $len, 10); + } + else + { + rnd ($mode, $i, 10); + } + } + } + elsif ($mode == 3800 || $mode == 4900) + { + my $salt_len = get_random_num (1, 11); + + for (my $i = 1; $i < 32; $i++) + { + if ($len != 0) + { + rnd ($mode, $len, $salt_len); + } + else + { + rnd ($mode, $i, $salt_len); + } + } + } + elsif ($mode == 5500 || $mode == 5600) + { + my $salt_len; + + for (my $i = 1; $i < 27; $i++) + { + $salt_len = get_random_num (1, 15); + + if ($len != 0) + { + rnd ($mode, $len, $salt_len); + } + else + { + rnd ($mode, $i, $salt_len); + } + } + } + elsif ($mode == 5800) + { + for (my $i = 1; $i < 14; $i++) + { + if ($len != 0) + { + rnd ($mode, $len, 16); + } + else + { + rnd ($mode, $i, 16); + } + } + } + elsif ($mode == 6800) + { + my $salt_len = get_random_num (8, 25); + + for (my $i = 1; $i < 32; $i++) + { + if ($len != 0) + { + rnd ($mode, $len, $salt_len); + } + else + { + rnd ($mode, $i, $salt_len); + } + } + } + elsif ($mode == 7100) + { + for (my $i = 1; $i < 32; $i++) + { + if ($len != 0) + { + rnd ($mode, $len, 64); + } + else + { + rnd ($mode, $i, 64); + } + } + } + elsif ($mode == 7200) + { + for (my $i = 1; $i < 32; $i++) + { + if ($len != 0) + { + rnd ($mode, $len, 128); + } + else + { + rnd ($mode, $i, 128); + } + } + } + elsif ($mode == 7300) + { + my $salt_len = get_random_num (32, 255); + + for (my $i = 1; $i < 32; $i++) + { + if ($len != 0) + { + rnd ($mode, $len, $salt_len); + } + else + { + rnd ($mode, $i, $salt_len); + } + } + } + elsif ($mode == 7500) + { + for (my $i = 1; $i < 27; $i++) + { + if ($len != 0) + { + rnd ($mode, $len, 16); + } + else + { + rnd ($mode, $i, 16); + } + } + } + elsif ($mode == 7700) + { + my $salt_len = get_random_num (1, 12); + + for (my $i = 1; $i < 9; $i++) + { + if ($len != 0) + { + rnd ($mode, $len, $salt_len); + } + else + { + rnd ($mode, $i, $salt_len); + } + } + } + elsif ($mode == 7800) + { + my $salt_len = get_random_num (1, 12); + + for (my $i = 1; $i < 32; $i++) + { + if ($len != 0) + { + rnd ($mode, $len, $salt_len); + } + else + { + rnd ($mode, $i, $salt_len); + } + } + } + elsif ($mode == 8400 || $mode == 11200) + { + for (my $i = 1; $i < 32; $i++) + { + if ($len != 0) + { + rnd ($mode, $len, 40); + } + else + { + rnd ($mode, $i, 40); + } + } + } + elsif ($mode == 8500) + { + my $salt_len = get_random_num (1, 8); + + for (my $i = 1; $i < 9; $i++) + { + if ($len != 0) + { + rnd ($mode, $len, $salt_len); + } + else + { + rnd ($mode, $i, $salt_len); + } + } + } + elsif ($mode == 8600) + { + for (my $i = 1; $i < 17; $i++) + { + if ($len != 0) + { + rnd ($mode, $len, 0); + } + else + { + rnd ($mode, $i, 0); + } + } + } + elsif ($mode == 8700) + { + for (my $i = 1; $i < 32; $i++) + { + if ($len != 0) + { + rnd ($mode, $len, 5); + } + else + { + rnd ($mode, $i, 5); + } + } + } + elsif ($mode == 9200 || $mode == 9300) + { + my $salt_len = 14; + + for (my $i = 1; $i < 32; $i++) + { + if ($len != 0) + { + rnd ($mode, $len, $salt_len); + } + else + { + rnd ($mode, $i, $salt_len); + } + } + } + elsif ($mode == 9400 || $mode == 9500 || $mode == 9600 || $mode == 9700 || $mode == 9800) + { + my $salt_len = 32; + + for (my $i = 1; $i < 20; $i++) + { + if ($len != 0) + { + rnd ($mode, $len, $salt_len); + } + else + { + rnd ($mode, $i, $salt_len); + } + } + } + elsif ($mode == 10100) + { + for (my $i = 1; $i < 32; $i++) + { + if ($len != 0) + { + rnd ($mode, $len, 32); + } + else + { + rnd ($mode, $i, 32); + } + } + } + elsif ($mode == 10300) + { + my $salt_len = get_random_num (4, 15); + + for (my $i = 1; $i < 32; $i++) + { + if ($len != 0) + { + rnd ($mode, $len, $salt_len); + } + else + { + rnd ($mode, $i, $salt_len); + } + } + } + elsif ($mode == 10400 || $mode == 10600) + { + my $salt_len = 32; + + for (my $i = 1; $i < 32; $i++) + { + if ($len != 0) + { + rnd ($mode, $len, $salt_len); + } + else + { + rnd ($mode, $i, $salt_len); + } + } + } + elsif ($mode == 10500 || $mode == 10700) + { + my $salt_len = 32; + + for (my $i = 1; $i < 16; $i++) + { + if ($len != 0) + { + rnd ($mode, $len, $salt_len); + } + else + { + rnd ($mode, $i, $salt_len); + } + } + } + elsif ($mode == 11000) + { + for (my $i = 1; $i < 32; $i++) + { + if ($len != 0) + { + rnd ($mode, $len, 56); + } + else + { + rnd ($mode, $i, 56); + } + } + } + elsif ($mode == 11300) + { + for (my $i = 1; $i < 32; $i++) + { + if ($len != 0) + { + rnd ($mode, $len, 16); + } + else + { + rnd ($mode, $i, 16); + } + } + } + elsif ($mode == 11400) + { + for (my $i = 1; $i < 24; $i++) + { + if ($len != 0) + { + rnd ($mode, $len, 16); + } + else + { + rnd ($mode, $i, 16); + } + } + } + elsif ($mode == 11600) + { + my $salt_len = get_random_num (0, 16); + + for (my $i = 1; $i < 32; $i++) + { + if ($len != 0) + { + rnd ($mode, $len, $salt_len); + } + else + { + rnd ($mode, $i, $salt_len); + } + } + } + elsif ($mode == 12400) + { + for (my $i = 1; $i < 32; $i++) + { + if ($len != 0) + { + rnd ($mode, $len, 4); + } + else + { + rnd ($mode, $i, 4); + } + } + } + elsif ($mode == 12600) + { + for (my $i = 1; $i < 32; $i++) + { + if ($len != 0) + { + rnd ($mode, $len, 64); + } + else + { + rnd ($mode, $i, 64); + } + } + } + elsif ($mode == 12700) + { + for (my $i = 1; $i < 32; $i++) + { + if ($len != 0) + { + rnd ($mode, $len, 32); + } + else + { + rnd ($mode, $i, 32); + } + } + } + elsif ($mode == 12800) + { + for (my $i = 1; $i < 25; $i++) + { + if ($len != 0) + { + rnd ($mode, $len, 20); + } + else + { + rnd ($mode, $i, 20); + } + } + } + } +} + +exit; + +sub gen_hash +{ + my $mode = shift; + + my $word_buf = shift; + + my $salt_buf = shift; + + my $iter = shift; + + my $additional_param = shift; + + my $additional_param2 = shift; + + my $additional_param3 = shift; + + my $additional_param4 = shift; + + my $additional_param5 = shift; + + my $additional_param6 = shift; + + my $additional_param7 = shift; + + my $additional_param8 = shift; + + my $additional_param9 = shift; + + my $additional_param10 = shift; + + my $additional_param11 = shift; + + ## + ## gen hash + ## + + my $tmp_hash; + + my $hash_buf; + + if ($mode == 0) + { + $hash_buf = md5_hex ($word_buf); + + $tmp_hash = sprintf ("%s", $hash_buf); + } + elsif ($mode == 10) + { + $hash_buf = md5_hex ($word_buf . $salt_buf); + + $tmp_hash = sprintf ("%s:%s", $hash_buf, $salt_buf); + } + elsif ($mode == 11) + { + $hash_buf = md5_hex ($word_buf . $salt_buf); + + $tmp_hash = sprintf ("%s:%s", $hash_buf, $salt_buf); + } + elsif ($mode == 12) + { + $hash_buf = md5_hex ($word_buf . $salt_buf); + + $tmp_hash = sprintf ("%s:%s", $hash_buf, $salt_buf); + } + elsif ($mode == 20) + { + $hash_buf = md5_hex ($salt_buf . $word_buf); + + $tmp_hash = sprintf ("%s:%s", $hash_buf, $salt_buf); + } + elsif ($mode == 21) + { + $hash_buf = md5_hex ($salt_buf . $word_buf); + + $tmp_hash = sprintf ("%s:%s", $hash_buf, $salt_buf); + } + elsif ($mode == 22) + { + my $itoa64 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; + my $salt_suffix = "Administration Tools"; + + my $pass = sprintf ("%s:%s:%s", $salt_buf, $salt_suffix, $word_buf); + + $hash_buf = md5 ($pass); + + my $res = ""; + + for (my $pos = 0; $pos < 16; $pos += 2) + { + my $octet1 = ord (substr ($hash_buf, $pos + 0, 1)); + my $octet2 = ord (substr ($hash_buf, $pos + 1, 1)); + + my $num = ($octet1 <<8 & 0xff00) | ($octet2 & 0xff); + + my $idx1 = $num >> 12 & 0x0f; + my $idx2 = $num >> 6 & 0x3f; + my $idx3 = $num & 0x3f; + + $res = $res . substr ($itoa64, $idx1, 1) . substr ($itoa64, $idx2, 1) . substr ($itoa64, $idx3, 1); + } + + my $obfuscate_str = "nrcstn"; + my @obfuscate_pos = (0, 6, 12, 17, 23, 29); + + foreach my $pos (keys @obfuscate_pos) + { + my $idx = $obfuscate_pos[$pos]; + my $before = substr ($res, 0, $idx); + my $char = substr ($obfuscate_str, $pos, 1); + my $after = substr ($res, $idx); + + $res = sprintf ("%s%s%s", $before, $char, $after); + } + + $tmp_hash = sprintf ("%s:%s", $res, $salt_buf); + } + elsif ($mode == 23) + { + $hash_buf = md5_hex ($salt_buf . "\nskyper\n" . $word_buf); + + $tmp_hash = sprintf ("%s:%s", $hash_buf, $salt_buf); + } + elsif ($mode == 30) + { + $hash_buf = md5_hex (encode ("UTF-16LE", $word_buf) . $salt_buf); + + $tmp_hash = sprintf ("%s:%s", $hash_buf, $salt_buf); + } + elsif ($mode == 40) + { + $hash_buf = md5_hex ($salt_buf . encode ("UTF-16LE", $word_buf)); + + $tmp_hash = sprintf ("%s:%s", $hash_buf, $salt_buf); + } + elsif ($mode == 50) + { + $hash_buf = hmac_hex ($salt_buf, $word_buf, \&md5, 64); + + $tmp_hash = sprintf ("%s:%s", $hash_buf, $salt_buf); + } + elsif ($mode == 60) + { + $hash_buf = hmac_hex ($word_buf, $salt_buf, \&md5, 64); + + $tmp_hash = sprintf ("%s:%s", $hash_buf, $salt_buf); + } + elsif ($mode == 100) + { + $hash_buf = sha1_hex ($word_buf); + + $tmp_hash = sprintf ("%s", $hash_buf); + } + elsif ($mode == 101) + { + $hash_buf = sha1 ($word_buf); + + my $base64_buf = encode_base64 ($hash_buf); + + chomp ($base64_buf); + + $tmp_hash = sprintf ("{SHA}%s", $base64_buf); + } + elsif ($mode == 110) + { + $hash_buf = sha1_hex ($word_buf . $salt_buf); + + $tmp_hash = sprintf ("%s:%s", $hash_buf, $salt_buf); + } + elsif ($mode == 111) + { + $hash_buf = sha1 ($word_buf . $salt_buf); + + my $base64_buf = encode_base64 ($hash_buf . $salt_buf); + + chomp ($base64_buf); + + $tmp_hash = sprintf ("{SSHA}%s", $base64_buf); + } + elsif ($mode == 112) + { + my $salt_buf_bin = pack ("H*", $salt_buf); + + $hash_buf = sha1_hex ($word_buf . $salt_buf_bin); + + $tmp_hash = sprintf ("%s:%s", $hash_buf, $salt_buf); + } + elsif ($mode == 120) + { + $hash_buf = sha1_hex ($salt_buf . $word_buf); + + $tmp_hash = sprintf ("%s:%s", $hash_buf, $salt_buf); + } + elsif ($mode == 121) + { + $hash_buf = sha1_hex (lc ($salt_buf) . $word_buf); + + $tmp_hash = sprintf ("%s:%s", $hash_buf, $salt_buf); + } + elsif ($mode == 122) + { + my $salt_buf_bin = pack ("H*", $salt_buf); + + $hash_buf = sha1_hex ($salt_buf_bin . $word_buf); + + $tmp_hash = sprintf ("%s%s", $salt_buf, $hash_buf); + } + elsif ($mode == 130) + { + $hash_buf = sha1_hex (encode ("UTF-16LE", $word_buf) . $salt_buf); + + $tmp_hash = sprintf ("%s:%s", $hash_buf, $salt_buf); + } + elsif ($mode == 131) + { + my $salt_buf_bin = pack ("H*", $salt_buf); + + $hash_buf = sha1_hex (encode ("UTF-16LE", uc ($word_buf)) . $salt_buf_bin); + + $tmp_hash = sprintf ("0x0100%s%s%s", $salt_buf, "0" x 40, $hash_buf); + } + elsif ($mode == 132) + { + my $salt_buf_bin = pack ("H*", $salt_buf); + + $hash_buf = sha1_hex (encode ("UTF-16LE", $word_buf) . $salt_buf_bin); + + $tmp_hash = sprintf ("0x0100%s%s", $salt_buf, $hash_buf); + } + elsif ($mode == 140) + { + $hash_buf = sha1_hex ($salt_buf . encode ("UTF-16LE", $word_buf)); + + $tmp_hash = sprintf ("%s:%s", $hash_buf, $salt_buf); + } + elsif ($mode == 141) + { + $hash_buf = sha1 ($salt_buf . encode ("UTF-16LE", $word_buf)); + + my $base64_salt_buf = encode_base64 ($salt_buf); + + chomp ($base64_salt_buf); + + my $base64_hash_buf = encode_base64 ($hash_buf); + + $base64_hash_buf = substr ($base64_hash_buf, 0, 27); + + $tmp_hash = sprintf ("\$episerver\$*0*%s*%s", $base64_salt_buf, $base64_hash_buf); + } + elsif ($mode == 150) + { + $hash_buf = hmac_hex ($salt_buf, $word_buf, \&sha1, 64); + + $tmp_hash = sprintf ("%s:%s", $hash_buf, $salt_buf); + } + elsif ($mode == 160) + { + $hash_buf = hmac_hex ($word_buf, $salt_buf, \&sha1, 64); + + $tmp_hash = sprintf ("%s:%s", $hash_buf, $salt_buf); + } + elsif ($mode == 190) + { + $hash_buf = sha1_hex ($word_buf); + + my $variant = int (rand (2)); + + if (defined ($additional_param)) + { + $variant = $additional_param; + } + + if ($variant == 1) + { + substr ($hash_buf, 0, 5) = "00000"; + } + + $tmp_hash = sprintf ("%s", $hash_buf); + } + elsif ($mode == 200) + { + my $ppr = Authen::Passphrase::MySQL323->new (passphrase => $word_buf); + + $hash_buf = $ppr->hash_hex; + + $tmp_hash = sprintf ("%s", $hash_buf); + } + elsif ($mode == 300) + { + $hash_buf = substr (password41 ($word_buf), 1); + + $hash_buf = lc ($hash_buf); # useful for 'not matched' check only + + $tmp_hash = sprintf ("%s", $hash_buf); + } + elsif ($mode == 400) + { + my $cost = 11; + + if (length ($iter)) + { + $cost = $iter; + } + + my $ppr = Authen::Passphrase::PHPass->new + ( + cost => $cost, + salt => $salt_buf, + passphrase => $word_buf, + ); + + $hash_buf = $ppr->as_rfc2307; + + $tmp_hash = sprintf ("%s", substr ($hash_buf, 7)); + } + elsif ($mode == 500) + { + my $iterations = 1000; + + if (defined ($iter)) + { + if ($iter > 0) + { + $iterations = int ($iter); + } + } + + $hash_buf = md5_crypt ('$1$', $iterations, $word_buf, $salt_buf); + + $tmp_hash = sprintf ("%s", $hash_buf); + } + elsif ($mode == 900) + { + $hash_buf = md4_hex ($word_buf); + + $tmp_hash = sprintf ("%s", $hash_buf); + } + elsif ($mode == 1000) + { + $hash_buf = md4_hex (encode ("UTF-16LE", $word_buf)); + + $tmp_hash = sprintf ("%s", $hash_buf); + } + elsif ($mode == 1100) + { + $hash_buf = md4_hex (md4 (encode ("UTF-16LE", $word_buf)) . encode ("UTF-16LE", lc ($salt_buf))); + + $tmp_hash = sprintf ("%s:%s", $hash_buf, $salt_buf); + } + elsif ($mode == 1400) + { + $hash_buf = sha256_hex ($word_buf); + + $tmp_hash = sprintf ("%s", $hash_buf); + } + elsif ($mode == 1410) + { + $hash_buf = sha256_hex ($word_buf . $salt_buf); + + $tmp_hash = sprintf ("%s:%s", $hash_buf, $salt_buf); + } + elsif ($mode == 1420) + { + $hash_buf = sha256_hex ($salt_buf . $word_buf); + + $tmp_hash = sprintf ("%s:%s", $hash_buf, $salt_buf); + } + elsif ($mode == 1430) + { + $hash_buf = sha256_hex (encode ("UTF-16LE", $word_buf) . $salt_buf); + + $tmp_hash = sprintf ("%s:%s", $hash_buf, $salt_buf); + } + elsif ($mode == 1440) + { + $hash_buf = sha256_hex ($salt_buf . encode ("UTF-16LE", $word_buf)); + + $tmp_hash = sprintf ("%s:%s", $hash_buf, $salt_buf); + } + elsif ($mode == 1441) + { + $hash_buf = sha256 ($salt_buf . encode ("UTF-16LE", $word_buf)); + + my $base64_salt_buf = encode_base64 ($salt_buf); + + chomp ($base64_salt_buf); + + my $base64_hash_buf = encode_base64 ($hash_buf); + + chomp ($base64_hash_buf); + + $base64_hash_buf = substr ($base64_hash_buf, 0, 43); + + $tmp_hash = sprintf ("\$episerver\$*1*%s*%s", $base64_salt_buf, $base64_hash_buf); + } + elsif ($mode == 1450) + { + $hash_buf = hmac_hex ($salt_buf, $word_buf, \&sha256, 64); + + $tmp_hash = sprintf ("%s:%s", $hash_buf, $salt_buf); + } + elsif ($mode == 1460) + { + $hash_buf = hmac_hex ($word_buf, $salt_buf, \&sha256, 64); + + $tmp_hash = sprintf ("%s:%s", $hash_buf, $salt_buf); + } + elsif ($mode == 1500) + { + $hash_buf = crypt ($word_buf, $salt_buf); + + $tmp_hash = sprintf ("%s", $hash_buf); + } + elsif ($mode == 1600) + { + my $iterations = 1000; + + if (defined ($iter)) + { + if ($iter > 0) + { + $iterations = int ($iter); + } + } + + $hash_buf = md5_crypt ('$apr1$', $iterations, $word_buf, $salt_buf); + + $tmp_hash = sprintf ("%s", $hash_buf); + } + elsif ($mode == 1700) + { + $hash_buf = sha512_hex ($word_buf); + + $tmp_hash = sprintf ("%s", $hash_buf); + } + elsif ($mode == 1710) + { + $hash_buf = sha512_hex ($word_buf . $salt_buf); + + $tmp_hash = sprintf ("%s:%s", $hash_buf, $salt_buf); + } + elsif ($mode == 1711) + { + $hash_buf = sha512_hex ($word_buf . $salt_buf); + + my $base64_buf = encode_base64 (pack ("H*", $hash_buf) . $salt_buf); + + $base64_buf =~ s/[ \n]//g; + + $tmp_hash = sprintf ("{SSHA512}%s", $base64_buf); + } + elsif ($mode == 1720) + { + $hash_buf = sha512_hex ($salt_buf . $word_buf); + + $tmp_hash = sprintf ("%s:%s", $hash_buf, $salt_buf); + } + elsif ($mode == 1730) + { + $hash_buf = sha512_hex (encode ("UTF-16LE", $word_buf) . $salt_buf); + + $tmp_hash = sprintf ("%s:%s", $hash_buf, $salt_buf); + } + elsif ($mode == 1740) + { + $hash_buf = sha512_hex ($salt_buf . encode ("UTF-16LE", $word_buf)); + + $tmp_hash = sprintf ("%s:%s", $hash_buf, $salt_buf); + } + elsif ($mode == 1722) + { + my $salt_buf_bin = pack ("H*", $salt_buf); + + $hash_buf = sha512_hex ($salt_buf_bin . $word_buf); + + $tmp_hash = sprintf ("%s%s", $salt_buf, $hash_buf); + } + elsif ($mode == 1731) + { + my $salt_buf_bin = pack ("H*", $salt_buf); + + $hash_buf = sha512_hex (encode ("UTF-16LE", $word_buf) . $salt_buf_bin); + + $tmp_hash = sprintf ("0x0200%s%s", $salt_buf, $hash_buf); + } + elsif ($mode == 1750) + { + $hash_buf = hmac_hex ($salt_buf, $word_buf, \&sha512, 128); + + $tmp_hash = sprintf ("%s:%s", $hash_buf, $salt_buf); + } + elsif ($mode == 1760) + { + $hash_buf = hmac_hex ($word_buf, $salt_buf, \&sha512, 128); + + $tmp_hash = sprintf ("%s:%s", $hash_buf, $salt_buf); + } + elsif ($mode == 1800) + { + my $iterations = 5000; + + if (defined ($iter)) + { + if ($iter > 0) + { + $iterations = int ($iter); + } + } + + $hash_buf = sha512_crypt ($iterations, $word_buf, $salt_buf); + + $tmp_hash = sprintf ("%s", $hash_buf); + } + elsif ($mode == 2100) + { + my $iterations = 10240; + + if (length ($iter)) + { + $iterations = int ($iter); + } + + my $salt = encode ("UTF-16LE", lc ($salt_buf)); + + my $pbkdf2 = Crypt::PBKDF2->new + ( + hash_class => 'HMACSHA1', + iterations => $iterations, + output_len => 16, + salt_len => length ($salt), + ); + + $hash_buf = unpack ("H*", $pbkdf2->PBKDF2 ($salt, md4 (md4 (encode ("UTF-16LE", $word_buf)) . $salt))); + + $tmp_hash = sprintf ("\$DCC2\$%i#%s#%s", $iterations, $salt_buf, $hash_buf); + } + elsif ($mode == 2400) + { + $tmp_hash = sprintf ("%s", pseudo_base64 (Digest::MD5::md5 ($word_buf . "\0" x (16 - length ($word_buf))))); + } + elsif ($mode == 2410) + { + my $salt_len = length ($salt_buf); + + my $salt_len_max4 = ($salt_len < 4) ? $salt_len : 4; + + my $hash_buf = pseudo_base64 (Digest::MD5::md5 ($word_buf . substr ($salt_buf, 0, $salt_len_max4) . "\0" x (16 - length ($word_buf) - $salt_len_max4))); + + $tmp_hash = sprintf ("%s:%s", $hash_buf, $salt_buf); + } + elsif ($mode == 2500) + { + my ($bssid, $stmac, $snonce, $anonce, $eapol, $keyver, $eapol_size); + + if (! defined ($additional_param)) + { + # random stuff + + $bssid = randbytes (6); + $stmac = randbytes (6); + $snonce = randbytes (32); + $anonce = randbytes (32); + + $keyver = get_random_num (1, 3); # 1 or 2 + + # eapol: + # should be "validly" generated, but in theory could be anything for us also: + # $eapol = "\x00" x 121; # works too, but let's generate it correctly + + $eapol = gen_random_wpa_eapol ($keyver, $snonce); + } + else + { + $bssid = $additional_param; + $stmac = $additional_param2; + $snonce = $additional_param3; + $anonce = $additional_param4; + $keyver = $additional_param5; + $eapol = $additional_param6; + } + + $eapol_size = length ($eapol); + + # constants + + my $iterations = 4096; + + # + # START + # + + # generate the Pairwise Master Key (PMK) + + my $pbkdf2 = Crypt::PBKDF2->new + ( + hash_class => 'HMACSHA1', + iterations => $iterations, + output_len => 32, + ); + + my $pmk = $pbkdf2->PBKDF2 ($salt_buf, $word_buf); + + # Pairwise Transient Key (PTK) transformation + + my $ptk = wpa_prf_512 ($pmk, $stmac, $bssid, $snonce, $anonce); + + # generate the Message Integrity Code (MIC) + + my $mic = ""; + + if ($keyver == 1) # WPA1 => MD5 + { + $mic = hmac ($eapol, $ptk, \&md5); + } + else # WPA2 => SHA1 + { + $mic = hmac ($eapol, $ptk, \&sha1); + } + + $mic = substr ($mic, 0, 16); + + # + # format the binary output + # + + $hash_buf = ""; + + # first the essid (NULL-padded up to the first 36 bytes) + + $hash_buf .= $salt_buf; + $hash_buf .= "\x00" x (36 - length ($salt_buf)); + + # the 2 MAC addresses + + $hash_buf .= $bssid; + $hash_buf .= $stmac; + + # nonces + + $hash_buf .= $snonce; + $hash_buf .= $anonce; + + # eapol + + $hash_buf .= $eapol; + $hash_buf .= "\x00" x (256 - $eapol_size); + + # eapol size + + $hash_buf .= pack ("L*", $eapol_size); + + # key version + + $hash_buf .= pack ("L*", $keyver); + + # and finally: the key mic + + $hash_buf .= $mic; + + # base64 encode the output + + $tmp_hash = encode_base64 ($hash_buf, ''); + } + elsif ($mode == 2600) + { + $hash_buf = md5_hex (md5_hex ($word_buf)); + + $tmp_hash = sprintf ("%s", $hash_buf); + } + elsif ($mode == 2611) + { + $hash_buf = md5_hex (md5_hex ($word_buf) . $salt_buf); + + $tmp_hash = sprintf ("%s:%s", $hash_buf, $salt_buf); + } + elsif ($mode == 2612) + { + my $salt_buf_hex = unpack ("H*", $salt_buf); + + $hash_buf = md5_hex (md5_hex ($word_buf) . $salt_buf); + + $tmp_hash = sprintf ("\$PHPS\$%s\$%s", $salt_buf_hex, $hash_buf); + } + elsif ($mode == 2711) + { + $hash_buf = md5_hex (md5_hex ($word_buf) . $salt_buf); + + $tmp_hash = sprintf ("%s:%s", $hash_buf, $salt_buf); + } + elsif ($mode == 2811) + { + $hash_buf = md5_hex (md5_hex ($salt_buf) . md5_hex ($word_buf)); + + $tmp_hash = sprintf ("%s:%s", $hash_buf, $salt_buf); + } + elsif ($mode == 3000) + { + my $ppr = Authen::Passphrase::LANManager->new ("passphrase" => $word_buf); + + $hash_buf = $ppr->hash_hex; + + $tmp_hash = sprintf ("%s", substr ($hash_buf, 0, 16)); + } + elsif ($mode == 3100) + { + $hash_buf = oracle_hash ($salt_buf, $word_buf); + + $tmp_hash = sprintf ("%s:%s", $hash_buf, $salt_buf); + } + elsif ($mode == 3200) + { + my $cost = "05"; + + if (length ($iter)) + { + $cost = $iter; + } + + $tmp_hash = bcrypt ($word_buf, sprintf ('$2a$%s$%s$', $cost, en_base64 ($salt_buf))); + } + elsif ($mode == 3300) + { + my $iterations = 904; + + if (length ($iter)) + { + $iterations = int ($iter); + } + + my $variant = "\$"; + + if (defined ($additional_param)) + { + $variant = $additional_param; + } + + my $prefix = sprintf ("\$md5%srounds=%i\$%s", $variant, $iterations, $salt_buf); + + $iterations += 4096; + + $hash_buf = sun_md5 ($word_buf, $prefix, $iterations); + + $tmp_hash = sprintf ("%s\$%s", $prefix, $hash_buf); + } + elsif ($mode == 3500) + { + $hash_buf = md5_hex (md5_hex (md5_hex ($word_buf))); + + $tmp_hash = sprintf ("%s", $hash_buf); + } + elsif ($mode == 3610) + { + $hash_buf = md5_hex (md5_hex ($salt_buf) . $word_buf); + + $tmp_hash = sprintf ("%s:%s", $hash_buf, $salt_buf); + } + elsif ($mode == 3710) + { + $hash_buf = md5_hex ($salt_buf . md5_hex ($word_buf)); + + $tmp_hash = sprintf ("%s:%s", $hash_buf, $salt_buf); + } + elsif ($mode == 3711) + { + $hash_buf = md5_hex ($salt_buf . "-" . md5_hex ($word_buf)); + + $tmp_hash = sprintf ("\$B\$%s\$%s", $salt_buf, $hash_buf); + } + elsif ($mode == 3720) + { + $hash_buf = md5_hex ($word_buf . md5_hex ($salt_buf)); + + $tmp_hash = sprintf ("%s:%s", $hash_buf, $salt_buf); + } + elsif ($mode == 3800) + { + $hash_buf = md5_hex ($salt_buf . $word_buf . $salt_buf); + + $tmp_hash = sprintf ("%s:%s", $hash_buf, $salt_buf); + } + elsif ($mode == 3910) + { + $hash_buf = md5_hex (md5_hex ($word_buf) . md5_hex ($salt_buf)); + + $tmp_hash = sprintf ("%s:%s", $hash_buf, $salt_buf); + } + elsif ($mode == 4010) + { + $hash_buf = md5_hex ($salt_buf . md5_hex ($salt_buf . $word_buf)); + + $tmp_hash = sprintf ("%s:%s", $hash_buf, $salt_buf); + } + elsif ($mode == 4110) + { + $hash_buf = md5_hex ($salt_buf . md5_hex ($word_buf . $salt_buf)); + + $tmp_hash = sprintf ("%s:%s", $hash_buf, $salt_buf); + } + elsif ($mode == 4210) + { + $hash_buf = md5_hex ($salt_buf . "\x00" . $word_buf); + + $tmp_hash = sprintf ("%s:%s", $hash_buf, $salt_buf); + } + elsif ($mode == 4300) + { + $hash_buf = md5_hex (uc (md5_hex ($word_buf))); + + $tmp_hash = sprintf ("%s", $hash_buf); + } + elsif ($mode == 4400) + { + $hash_buf = md5_hex (sha1_hex ($word_buf)); + + $tmp_hash = sprintf ("%s", $hash_buf); + } + elsif ($mode == 4500) + { + $hash_buf = sha1_hex (sha1_hex ($word_buf)); + + $tmp_hash = sprintf ("%s", $hash_buf); + } + elsif ($mode == 4600) + { + $hash_buf = sha1_hex (sha1_hex (sha1_hex ($word_buf))); + + $tmp_hash = sprintf ("%s", $hash_buf); + } + elsif ($mode == 4700) + { + $hash_buf = sha1_hex (md5_hex ($word_buf)); + + $tmp_hash = sprintf ("%s", $hash_buf); + } + elsif ($mode == 4800) + { + my $index = rindex ($salt_buf, ":"); + + my $salt = substr ($salt_buf, 0, $index); + my $salt_bin = pack ("H*", $salt); + my $chap_sign = substr ($salt_buf, $index + 1); + my $chap_sign_bin = pack ("H*", $chap_sign); + + $hash_buf = md5_hex ($chap_sign_bin . $word_buf . $salt_bin); + + $tmp_hash = sprintf ("%s:%s", $hash_buf, $salt_buf); + } + elsif ($mode == 4900) + { + $hash_buf = sha1_hex ($salt_buf . $word_buf . $salt_buf); + + $tmp_hash = sprintf ("%s:%s", $hash_buf, $salt_buf); + } + elsif ($mode == 5000) + { + $hash_buf = keccak_256_hex ($word_buf); + + $tmp_hash = sprintf ("%s", $hash_buf); + } + elsif ($mode == 5100) + { + my $pos; + + if (! defined ($additional_param)) + { + $pos = 0; + } + else + { + $pos = $additional_param * 8 unless ($additional_param > 2); + } + + $hash_buf = md5_hex ($word_buf); + + $tmp_hash = sprintf ("%s", substr ($hash_buf, $pos, 16)); + } + elsif ($mode == 5300) + { + my @salt_arr = split (":", $salt_buf); + + my $msg_buf = pack ("H*", $salt_arr[0] . $salt_arr[1] . $salt_arr[2] . $salt_arr[3] . $salt_arr[4] . $salt_arr[5]); + my $nr_buf = pack ("H*", $salt_arr[6] . $salt_arr[7]); + + my $hash_buf = hmac ($nr_buf , $word_buf, \&md5, 64); + $hash_buf = hmac_hex ($msg_buf, $hash_buf, \&md5, 64); + + $tmp_hash = sprintf ("%s:%s", $salt_buf, $hash_buf); + } + elsif ($mode == 5400) + { + my @salt_arr = split (":", $salt_buf); + + my $msg_buf = pack ("H*", $salt_arr[0] . $salt_arr[1] . $salt_arr[2] . $salt_arr[3] . $salt_arr[4] . $salt_arr[5]); + my $nr_buf = pack ("H*", $salt_arr[6] . $salt_arr[7]); + + my $hash_buf = hmac ($nr_buf , $word_buf, \&sha1, 64); + $hash_buf = hmac_hex ($msg_buf, $hash_buf, \&sha1, 64); + + $tmp_hash = sprintf ("%s:%s", $salt_buf, $hash_buf); + } + elsif ($mode == 5500) + { + my $index1 = index ($salt_buf, "::"); + my $user = substr ($salt_buf, 0, $index1); + + my $index2 = index ($salt_buf, ":", $index1 + 2); + my $domain = substr ($salt_buf, $index1 + 2, $index2 - $index1 - 2); + + my $len = length (substr ($salt_buf, $index2 + 1)); + + my $c_challenge_hex; + + if ($len > 32) + { + $c_challenge_hex = substr ($salt_buf, $index2 + 1, 48); + $index2 += 32; + } + else + { + $c_challenge_hex = substr ($salt_buf, $index2 + 1, 16); + $c_challenge_hex .= 00 x 32; + } + + my $c_challenge = pack ("H*", substr ($c_challenge_hex, 0, 16)); + my $s_challenge_hex = substr ($salt_buf, $index2 + 17, 16); + my $s_challenge = pack ("H*", $s_challenge_hex); + + my $challenge = substr (md5 ($s_challenge . $c_challenge), 0, 8); + + my $ntresp; + + my $nthash = Authen::Passphrase::NTHash->new (passphrase => $word_buf)->hash . "\x00" x 5; + + $ntresp .= Crypt::ECB::encrypt (setup_des_key (substr ($nthash, 0, 7)), "DES", $challenge, PADDING_NONE); + $ntresp .= Crypt::ECB::encrypt (setup_des_key (substr ($nthash, 7, 7)), "DES", $challenge, PADDING_NONE); + $ntresp .= Crypt::ECB::encrypt (setup_des_key (substr ($nthash, 14, 7)), "DES", $challenge, PADDING_NONE); + + $tmp_hash = sprintf ("%s::%s:%s:%s:%s", $user, $domain, $c_challenge_hex, unpack ("H*", $ntresp), $s_challenge_hex); + } + elsif ($mode == 5600) + { + my $index1 = index ($salt_buf, "::"); + my $user = substr ($salt_buf, 0, $index1); + + my $index2 = index ($salt_buf, ":", $index1 + 2); + my $domain = substr ($salt_buf, $index1 + 2, $index2 - $index1 - 2); + + my $s_challenge_hex = substr ($salt_buf, $index2 + 1, 16); + my $s_challenge = pack ("H*", $s_challenge_hex); + + my $temp_hex = substr ($salt_buf, $index2 + 17); + my $temp = pack ("H*", $temp_hex); + + my $nthash = Authen::Passphrase::NTHash->new (passphrase => $word_buf)->hash; + my $identity = Encode::encode ("UTF-16LE", uc ($user) . $domain); + + $hash_buf = hmac_hex ($s_challenge . $temp, hmac ($identity, $nthash, \&md5, 64), \&md5, 64); + + $tmp_hash = sprintf ("%s::%s:%s:%s:%s", $user, $domain, $s_challenge_hex, $hash_buf, $temp_hex); + } + elsif ($mode == 5700) + { + $hash_buf = sha256 ($word_buf); + + my $base64_buf = encode_base64 ($hash_buf); + + $tmp_hash = ""; + + for (my $i = 0; $i < 43; $i++) + { + $tmp_hash .= $CISCO_BASE64_MAPPING->{substr ($base64_buf, $i, 1)}; + } + } + elsif ($mode == 5800) + { + $hash_buf = androidpin_hash ($word_buf, $salt_buf); + + $tmp_hash = sprintf ("%s:%s", $hash_buf, $salt_buf); + } + elsif ($mode == 6000) + { + $hash_buf = ripemd160_hex ($word_buf); + + $tmp_hash = sprintf ("%s", $hash_buf); + } + elsif ($mode == 6100) + { + $hash_buf = whirlpool_hex ($word_buf); + + $tmp_hash = sprintf ("%s", $hash_buf); + } + elsif ($mode == 6300) + { + my $iterations = 1000; # hard coded by the AIX format + + $hash_buf = md5_crypt ('', $iterations, $word_buf, $salt_buf); + + $tmp_hash = sprintf ("{smd5}%s", $hash_buf); + } + elsif ($mode == 6400) + { + my $iterations = 64; + + if (length ($iter)) + { + $iterations = 1 << int ($iter); + } + + $hash_buf = aix_ssha256_pbkdf2 ($word_buf, $salt_buf, $iterations); + + $tmp_hash = sprintf ("{ssha256}%02i\$%s\$%s", log ($iterations) / log (2), $salt_buf, $hash_buf); + } + elsif ($mode == 6500) + { + my $iterations = 64; + + if (length ($iter)) + { + $iterations = 1 << int ($iter); + } + + $hash_buf = aix_ssha512_pbkdf2 ($word_buf, $salt_buf, $iterations); + + $tmp_hash = sprintf ("{ssha512}%02i\$%s\$%s", log ($iterations) / log (2), $salt_buf, $hash_buf); + } + elsif ($mode == 6600) + { + my $iterations = 1000; + + if (length ($iter)) + { + $iterations = int ($iter); + } + + my $salt_hex = substr ($salt_buf, 0, 16); + my $salt = pack ("H*", $salt_hex); + + my $prefix = substr ($salt_buf, 16, 2016); + + my $iv_hex = substr ($salt_buf, 2032); + my $iv = pack ("H*", $iv_hex); + + my $data = pack ("H*", "10101010101010101010101010101010"); + + my $hasher = Crypt::PBKDF2->hasher_from_algorithm ('HMACSHA1'); + + my $pbkdf2 = Crypt::PBKDF2->new ( + hasher => $hasher, + iterations => $iterations, + output_len => 16 + ); + + my $key = $pbkdf2->PBKDF2 ($salt, $word_buf); + + my $cipher = Crypt::CBC->new({ + key => $key, + cipher => "Crypt::Rijndael", + iv => $iv, + literal_key => 1, + header => "none", + keysize => 16 + }); + + my $encrypted = unpack ("H*", $cipher->encrypt ($data)); + + $hash_buf = substr ($encrypted, 0, 32); + + $tmp_hash = sprintf ("%i:%s:%s%s%s", $iterations, $salt_hex, $prefix, $iv_hex, $hash_buf); + } + elsif ($mode == 6700) + { + my $iterations = 64; + + if (length ($iter)) + { + $iterations = 1 << int ($iter); + } + + $hash_buf = aix_ssha1_pbkdf2 ($word_buf, $salt_buf, $iterations); + + $tmp_hash = sprintf ("{ssha1}%02i\$%s\$%s", log ($iterations) / log (2), $salt_buf, $hash_buf); + } + elsif ($mode == 6800) + { + my $variant = $additional_param; + + if (! defined ($variant)) + { + $variant = int (rand (2)); + } + + my $iterations = 500; + + if (length ($iter)) + { + $iterations = int ($iter); + } + + my $iv = "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"; + + my $hasher = Crypt::PBKDF2->hasher_from_algorithm ('HMACSHA2', 256); + + my $pbkdf2 = Crypt::PBKDF2->new ( + hasher => $hasher, + iterations => $iterations, + output_len => 32 + ); + + my $key = $pbkdf2->PBKDF2 ($salt_buf, $word_buf); + + my $cipher = Crypt::CBC->new({ + key => $key, + cipher => "Crypt::Rijndael", + iv => $iv, + literal_key => 1, + header => "none", + keysize => 32 + }); + + if ($variant == 1) + { + my $encrypt = $cipher->encrypt (substr ($salt_buf, 0, 16)); + + $hash_buf = substr (unpack ("H*", $encrypt), 0, 32); + } + else + { + my $verifier = "lastpass rocks\x02\x02"; + + $hash_buf = unpack ("H*", substr ($cipher->encrypt ($verifier), 0, 16)); + } + + $tmp_hash = sprintf ("%s:%i:%s", $hash_buf, $iterations, $salt_buf); + } + elsif ($mode == 6900) + { + $hash_buf = gost_hex ($word_buf); + + $tmp_hash = sprintf ("%s", $hash_buf); + } + elsif ($mode == 7100) + { + my $iterations = 1024; + + if (length ($iter)) + { + $iterations = int ($iter); + } + + my $pbkdf2 = Crypt::PBKDF2->new + ( + hasher => Crypt::PBKDF2->hasher_from_algorithm ('HMACSHA2', 512), + iterations => $iterations + ); + + $hash_buf = unpack ("H*", $pbkdf2->PBKDF2 (pack ("H*", $salt_buf), $word_buf)); + + $tmp_hash = sprintf ("\$ml\$%i\$%s\$%0128s", $iterations, $salt_buf, $hash_buf); + } + elsif ($mode == 7200) + { + my $iterations = 1024; + + if (length ($iter)) + { + $iterations = int ($iter); + } + + my $pbkdf2 = Crypt::PBKDF2->new ( + hasher => Crypt::PBKDF2->hasher_from_algorithm ('HMACSHA2', 512), + iterations => $iterations + ); + + $hash_buf = unpack ("H*", $pbkdf2->PBKDF2 (pack ("H*", $salt_buf), $word_buf)); + + $tmp_hash = sprintf ("grub.pbkdf2.sha512.%i.%s.%0128s", $iterations, $salt_buf, $hash_buf); + } + elsif ($mode == 7300) + { + $hash_buf = hmac_hex ($salt_buf, $word_buf, \&sha1); + + $tmp_hash = sprintf ("%s:%s", unpack ("H*", $salt_buf), $hash_buf); + } + elsif ($mode == 7400) + { + my $iterations = 5000; + + if (defined ($iter)) + { + if ($iter > 0) + { + $iterations = int ($iter); + } + } + + $hash_buf = sha256_crypt ($iterations, $word_buf, $salt_buf); + + $tmp_hash = sprintf ("%s", $hash_buf); + } + elsif ($mode == 7500) + { + my @salt_arr = split ("\\\$", $salt_buf); + + my $user = $salt_arr[0]; + + my $realm = $salt_arr[1]; + + my $salt = $salt_arr[2]; + + my $hmac_salt = $salt_arr[3]; + my $hmac_salt_bin = pack ("H*", $hmac_salt); + + my $clear_data = $salt_arr[4]; + + my $k = md4 (encode ("UTF-16LE", $word_buf)); + + my $k1 = hmac_md5 ("\x01\x00\x00\x00", $k); + + my $k3 = hmac_md5 ($hmac_salt_bin, $k1); + + if (length ($clear_data) > 1) + { + my $clear_data_bin = pack ("H*", $clear_data); + + $hash_buf = RC4 ($k3, $clear_data_bin); + } + else + { + my $hash = $salt_arr[5]; + + my $hash_bin = pack ("H*", $hash); + + my $clear_data = RC4 ($k3, $hash_bin); + + my $timestamp = substr ($clear_data, 14, 14); + + my $is_numeric = 1; + my $num; + + if ($timestamp !~ /^[[:digit:]]{14}$/) + { + $is_numeric = 0; + } + + if (! $is_numeric) + { + $hash_buf = "\x00" x 36; + + if ($hash_buf eq $hash_bin) + { + $hash_buf = "\x01" x 36; + } + } + else + { + $hash_buf = $hash_bin; + } + } + + $tmp_hash = sprintf ("\$krb5pa\$23\$%s\$%s\$%s\$%s%s", $user, $realm, $salt, unpack ("H*", $hash_buf), $hmac_salt); + } + elsif ($mode == 7600) + { + $hash_buf = sha1_hex ($salt_buf . sha1_hex ($word_buf)); + + $tmp_hash = sprintf ("%s:%s", $hash_buf, $salt_buf); + } + elsif ($mode == 7700) + { + $word_buf = uc $word_buf; + $salt_buf = uc $salt_buf; + + my $word_buf_t = sapb_transcode ($word_buf); + my $salt_buf_t = sapb_transcode ($salt_buf); + + my $digest1 = md5 ($word_buf_t . $salt_buf_t); + + my $data = sapb_waldorf ($digest1, $word_buf_t, $salt_buf_t); + + my $digest2 = md5 ($data); + + my ($a, $b, $c, $d) = unpack ("N4", $digest2); + + $a ^= $c; + $b ^= $d; + + $tmp_hash = sprintf ("%s\$%08X%08X", $salt_buf, $a, $b); + } + elsif ($mode == 7800) + { + my $theMagicArray_s = + "\x91\xac\x51\x14\x9f\x67\x54\x43\x24\xe7\x3b\xe0\x28\x74\x7b\xc2" . + "\x86\x33\x13\xeb\x5a\x4f\xcb\x5c\x08\x0a\x73\x37\x0e\x5d\x1c\x2f" . + "\x33\x8f\xe6\xe5\xf8\x9b\xae\xdd\x16\xf2\x4b\x8d\x2c\xe1\xd4\xdc" . + "\xb0\xcb\xdf\x9d\xd4\x70\x6d\x17\xf9\x4d\x42\x3f\x9b\x1b\x11\x94" . + "\x9f\x5b\xc1\x9b\x06\x05\x9d\x03\x9d\x5e\x13\x8a\x1e\x9a\x6a\xe8" . + "\xd9\x7c\x14\x17\x58\xc7\x2a\xf6\xa1\x99\x63\x0a\xd7\xfd\x70\xc3" . + "\xf6\x5e\x74\x13\x03\xc9\x0b\x04\x26\x98\xf7\x26\x8a\x92\x93\x25" . + "\xb0\xa2\x0d\x23\xed\x63\x79\x6d\x13\x32\xfa\x3c\x35\x02\x9a\xa3" . + "\xb3\xdd\x8e\x0a\x24\xbf\x51\xc3\x7c\xcd\x55\x9f\x37\xaf\x94\x4c" . + "\x29\x08\x52\x82\xb2\x3b\x4e\x37\x9f\x17\x07\x91\x11\x3b\xfd\xcd"; + + $salt_buf = uc $salt_buf; + + my $digest = sha1 ($word_buf . $salt_buf); + + my ($a, $b, $c, $d, $e) = unpack ("I*", $digest); + + my $lengthMagicArray = 0x20; + my $offsetMagicArray = 0; + + $lengthMagicArray += (($a >> 0) & 0xff) % 6; + $lengthMagicArray += (($a >> 8) & 0xff) % 6; + $lengthMagicArray += (($a >> 16) & 0xff) % 6; + $lengthMagicArray += (($a >> 24) & 0xff) % 6; + $lengthMagicArray += (($b >> 0) & 0xff) % 6; + $lengthMagicArray += (($b >> 8) & 0xff) % 6; + $lengthMagicArray += (($b >> 16) & 0xff) % 6; + $lengthMagicArray += (($b >> 24) & 0xff) % 6; + $lengthMagicArray += (($c >> 0) & 0xff) % 6; + $lengthMagicArray += (($c >> 8) & 0xff) % 6; + $offsetMagicArray += (($c >> 16) & 0xff) % 8; + $offsetMagicArray += (($c >> 24) & 0xff) % 8; + $offsetMagicArray += (($d >> 0) & 0xff) % 8; + $offsetMagicArray += (($d >> 8) & 0xff) % 8; + $offsetMagicArray += (($d >> 16) & 0xff) % 8; + $offsetMagicArray += (($d >> 24) & 0xff) % 8; + $offsetMagicArray += (($e >> 0) & 0xff) % 8; + $offsetMagicArray += (($e >> 8) & 0xff) % 8; + $offsetMagicArray += (($e >> 16) & 0xff) % 8; + $offsetMagicArray += (($e >> 24) & 0xff) % 8; + + my $hash_buf = sha1_hex ($word_buf . substr ($theMagicArray_s, $offsetMagicArray, $lengthMagicArray) . $salt_buf); + + $tmp_hash = sprintf ("%s\$%s", $salt_buf, uc $hash_buf); + } + elsif ($mode == 7900) + { + my $cost = 14; + + if (length ($iter)) + { + $cost = $iter; + } + + my $phpass_it = 1 << $cost; + + $hash_buf = sha512 ($salt_buf . $word_buf); + + for (my $i = 0; $i < $phpass_it; $i++) + { + $hash_buf = sha512 ($hash_buf . $word_buf); + } + + my $base64_buf = substr (Authen::Passphrase::PHPass::_en_base64 ($hash_buf), 0, 43); + + my $base64_digits = "./0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"; + + my $cost_str = substr ($base64_digits , $cost, 1); + + $tmp_hash = sprintf ('$S$%s%s%s', $cost_str, $salt_buf, $base64_buf); + } + elsif ($mode == 8000) + { + my $salt_buf_bin = pack ("H*", $salt_buf); + + my $word_buf_utf = encode ("UTF-16BE", $word_buf); + + $hash_buf = sha256_hex ($word_buf_utf . "\x00" x (510 - (length ($word_buf) * 2)) . $salt_buf_bin); + + $tmp_hash = sprintf ("0xc007%s%s", $salt_buf, $hash_buf); + } + elsif ($mode == 8100) + { + $hash_buf = sha1_hex ($salt_buf . $word_buf . "\x00"); + + $tmp_hash = sprintf ("1%s%s", $salt_buf, $hash_buf); + } + elsif ($mode == 8200) + { + my $iterations = 40000; + + if (defined ($iter)) + { + $iterations = $iter; + } + + my $salt_hex = substr ($salt_buf, 0, 32); + my $salt = pack ("H*", $salt_hex); + + my $data_hex = substr ($salt_buf, 32); + my $data = pack ("H*", $data_hex); + + my $pbkdf2 = Crypt::PBKDF2->new + ( + hasher => Crypt::PBKDF2->hasher_from_algorithm ('HMACSHA2', 512), + iterations => int $iterations + ); + + my $key = $pbkdf2->PBKDF2 ($salt, $word_buf); + + $hash_buf = hmac_hex ($data, substr ($key, 32, 32), \&sha256, 64); + + $tmp_hash = sprintf ("%s:%s:%d:%s", $hash_buf, $salt_hex, $iterations, $data_hex); + } + elsif ($mode == 8300) + { + my ($domain, $salt_hex) = split (":", $salt_buf); + + my $hashalg = Net::DNS::SEC->digtype ("SHA1"); + + my $salt = pack ("H*", $salt_hex); + + my $iterations = 1; + + if (defined ($iter)) + { + $iterations = $iter; + } + + my $name = lc ($word_buf . $domain); + + my $hash_buf = Net::DNS::RR::NSEC3::name2hash ($hashalg, $name, $iterations, $salt); + + $tmp_hash = sprintf ("%s:%s:%s:%d", $hash_buf, $domain, $salt_hex, $iterations); + } + elsif ($mode == 8400) + { + $hash_buf = sha1_hex ($salt_buf . sha1_hex ($salt_buf . sha1_hex ($word_buf))); + + $tmp_hash = sprintf ("%s:%s", $hash_buf, $salt_buf); + } + elsif ($mode == 8500) + { + $hash_buf = racf_hash (uc $salt_buf, $word_buf); + + $tmp_hash = sprintf ('$racf$*%s*%s', uc $salt_buf, uc $hash_buf); + } + elsif ($mode == 8600) + { + my @saved_key = map { ord $_; } split "", $word_buf; + + my $len = scalar @saved_key; + + my @state = domino_big_md (\@saved_key, $len); + + $tmp_hash = sprintf ('%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x', + $state[ 0], + $state[ 1], + $state[ 2], + $state[ 3], + $state[ 4], + $state[ 5], + $state[ 6], + $state[ 7], + $state[ 8], + $state[ 9], + $state[10], + $state[11], + $state[12], + $state[13], + $state[14], + $state[15], + ); + } + elsif ($mode == 8700) + { + my $domino_char = undef; + + if (defined ($additional_param)) + { + $domino_char = $additional_param; + } + + my @saved_key = map { ord $_; } split "", $word_buf; + + my $len = scalar @saved_key; + + my @state = domino_big_md (\@saved_key, $len); + + my $str = "(" . unpack ("H*", join ("", (map { chr $_; } @state))) . ")"; + + @saved_key = map { ord $_; } split "", $salt_buf . uc $str; + + @state = domino_big_md (\@saved_key, 34); + + $hash_buf = join ("", (map { chr $_; } @state)); + + $tmp_hash = sprintf ('(G%s)', domino_encode ($salt_buf . $hash_buf, $domino_char)); + } + elsif ($mode == 8900) + { + my $N = 1024; + my $r = 1; + my $p = 1; + + if (defined ($additional_param)) + { + $N = $additional_param; + $r = $additional_param2; + $p = $additional_param3; + } + + $hash_buf = scrypt_hash ($word_buf, $salt_buf, $N, $r, $p, 32); + + $tmp_hash = sprintf ('%s', $hash_buf); + } + elsif ($mode == 9100) + { + my $iterations = 5000; + + if (defined ($iter)) + { + $iterations = $iter; + } + + my $domino_char = undef; + + # domino 5 hash - SEC_pwddigest_V1 - -m 8600 + + my @saved_key = map { ord $_; } split "", $word_buf; + + my $len = scalar @saved_key; + + my @state = domino_big_md (\@saved_key, $len); + + + # domino 6 hash - SEC_pwddigest_V2 - -m 8700 + + my $salt_part = substr ($salt_buf, 0, 5); + + my $str = "(" . unpack ("H*", join ("", (map { chr $_; } @state))) . ")"; + + @saved_key = map { ord $_; } split "", $salt_part . uc $str; + + @state = domino_big_md (\@saved_key, 34); + + $hash_buf = join ("", (map { chr $_; } @state)); + + $tmp_hash = sprintf ('(G%s)', domino_encode ($salt_part . $hash_buf, $domino_char)); + + + # domino 8(.5.x) hash - SEC_pwddigest_V3 - -m 9100 + + my $pbkdf2 = Crypt::PBKDF2->new + ( + hash_class => 'HMACSHA1', + iterations => $iterations, + output_len => 8, + salt_len => 16, + ); + + my $chars = "02"; + + if (defined ($additional_param)) + { + $chars = $additional_param; + } + + my $digest_new = $pbkdf2->PBKDF2 ($salt_buf, $tmp_hash); + + my $iteration_str = "" . $iterations; + + for (my $i = length ($iterations); $i < 10; $i++) + { + $iterations = "0" . $iterations; + } + + $tmp_hash = sprintf ('(H%s)', domino_85x_encode ($salt_buf . $iterations . $chars . $digest_new, $domino_char)); + } + elsif ($mode == 9200) + { + my $iterations = 20000; + + my $pbkdf2 = Crypt::PBKDF2->new + ( + hasher => Crypt::PBKDF2->hasher_from_algorithm ('HMACSHA2', 256), + iterations => $iterations + ); + + $hash_buf = encode_base64 ($pbkdf2->PBKDF2 ($salt_buf, $word_buf)); + + $tmp_hash = ""; + + for (my $i = 0; $i < 43; $i++) + { + $tmp_hash .= $CISCO_BASE64_MAPPING->{substr ($hash_buf, $i, 1)}; + } + + $tmp_hash = sprintf ("\$8\$%s\$%s", $salt_buf, $tmp_hash); + } + elsif ($mode == 9300) + { + my $N = 16384; + my $r = 1; + my $p = 1; + + $hash_buf = scrypt_b64 ($word_buf, $salt_buf, $N, $r, $p, 32); + + $tmp_hash = ""; + + for (my $i = 0; $i < 43; $i++) + { + $tmp_hash .= $CISCO_BASE64_MAPPING->{substr ($hash_buf, $i, 1)}; + } + + $tmp_hash = sprintf ('$9$%s$%s', $salt_buf, $tmp_hash); + } + elsif ($mode == 9400) + { + my $iterations = 50000; + + if (length ($iter)) + { + $iterations = int ($iter); + } + + my $aes_key_size = 128; # or 256 + + if (defined ($additional_param2)) + { + $aes_key_size = $additional_param2; + } + + $salt_buf = pack ("H*", $salt_buf); + + my $tmp = sha1 ($salt_buf . encode ("UTF-16LE", $word_buf)); + + for (my $i = 0; $i < $iterations; $i++) + { + my $num32 = pack ("L", $i); + + $tmp = sha1 ($num32 . $tmp); + } + + my $zero32 = pack ("L", 0x00); + + my $derivation_array1 = pack ("C", 0x36) x 64; + my $derivation_array2 = pack ("C", 0x5C) x 64; + + $tmp = sha1 ($tmp . $zero32); + + my $tmp2 = sha1 ($derivation_array1 ^ $tmp); + my $tmp3 = sha1 ($derivation_array2 ^ $tmp); + + my $key = substr ($tmp2 . $tmp3, 0, $aes_key_size / 8); + + my $m = Crypt::Mode::ECB->new ('AES', 0); + + my $encdata; + + if (defined $additional_param) + { + $encdata = $m->decrypt (pack ("H*", $additional_param), $key); + } + else + { + $encdata = "A" x 16; ## can be anything + } + + my $data1_buf = $encdata; + my $data2_buf = sha1 (substr ($data1_buf, 0, 16)); + + $data1_buf = substr ($data1_buf . ("\x00" x 16), 0, 16); + $data2_buf = substr ($data2_buf . ("\x00" x 16), 0, 32); + + my $encrypted1 = unpack ("H*", $m->encrypt ($data1_buf, $key)); + my $encrypted2 = unpack ("H*", $m->encrypt ($data2_buf, $key)); + + $encrypted1 = substr ($encrypted1, 0, 32); + $encrypted2 = substr ($encrypted2, 0, 40); + + $tmp_hash = sprintf ("\$office\$*%d*%d*%d*%d*%s*%s*%s", 2007, 20, $aes_key_size, 16, unpack ("H*", $salt_buf), $encrypted1, $encrypted2); + } + elsif ($mode == 9500) + { + my $iterations = 100000; + + if (length ($iter)) + { + $iterations = int ($iter); + } + + $salt_buf = pack ("H*", $salt_buf); + + my $tmp = sha1 ($salt_buf . encode ("UTF-16LE", $word_buf)); + + for (my $i = 0; $i < $iterations; $i++) + { + my $num32 = pack ("L", $i); + + $tmp = sha1 ($num32 . $tmp); + } + + my $encryptedVerifierHashInputBlockKey = "\xfe\xa7\xd2\x76\x3b\x4b\x9e\x79"; + my $encryptedVerifierHashValueBlockKey = "\xd7\xaa\x0f\x6d\x30\x61\x34\x4e"; + + my $final1 = sha1 ($tmp . $encryptedVerifierHashInputBlockKey); + my $final2 = sha1 ($tmp . $encryptedVerifierHashValueBlockKey); + + my $key1 = substr ($final1, 0, 16); + my $key2 = substr ($final2, 0, 16); + + my $cipher1 = Crypt::CBC->new({ + key => $key1, + cipher => "Crypt::Rijndael", + iv => $salt_buf, + literal_key => 1, + header => "none", + keysize => 16, + padding => "null", + }); + + my $cipher2 = Crypt::CBC->new({ + key => $key2, + cipher => "Crypt::Rijndael", + iv => $salt_buf, + literal_key => 1, + header => "none", + keysize => 16, + padding => "null", + }); + + my $encdata; + + if (defined $additional_param) + { + $encdata = $cipher1->decrypt (pack ("H*", $additional_param)); + } + else + { + $encdata = "A" x 16; ## can be anything + } + + my $data1_buf = $encdata; + my $data2_buf = sha1 (substr ($data1_buf, 0, 16)); + + my $encrypted1 = unpack ("H*", $cipher1->encrypt ($data1_buf)); + my $encrypted2 = unpack ("H*", $cipher2->encrypt ($data2_buf)); + + $encrypted2 = substr ($encrypted2, 0, 64); + + $tmp_hash = sprintf ("\$office\$*%d*%d*%d*%d*%s*%s*%s", 2010, 100000, 128, 16, unpack ("H*", $salt_buf), $encrypted1, $encrypted2); + } + elsif ($mode == 9600) + { + my $iterations = 100000; + + if (length ($iter)) + { + $iterations = int ($iter); + } + + $salt_buf = pack ("H*", $salt_buf); + + my $tmp = sha512 ($salt_buf . encode ("UTF-16LE", $word_buf)); + + for (my $i = 0; $i < $iterations; $i++) + { + my $num32 = pack ("L", $i); + + $tmp = sha512 ($num32 . $tmp); + } + + my $encryptedVerifierHashInputBlockKey = "\xfe\xa7\xd2\x76\x3b\x4b\x9e\x79"; + my $encryptedVerifierHashValueBlockKey = "\xd7\xaa\x0f\x6d\x30\x61\x34\x4e"; + + my $final1 = sha512 ($tmp . $encryptedVerifierHashInputBlockKey); + my $final2 = sha512 ($tmp . $encryptedVerifierHashValueBlockKey); + + my $key1 = substr ($final1, 0, 32); + my $key2 = substr ($final2, 0, 32); + + my $cipher1 = Crypt::CBC->new({ + key => $key1, + cipher => "Crypt::Rijndael", + iv => $salt_buf, + literal_key => 1, + header => "none", + keysize => 32, + padding => "null", + }); + + my $cipher2 = Crypt::CBC->new({ + key => $key2, + cipher => "Crypt::Rijndael", + iv => $salt_buf, + literal_key => 1, + header => "none", + keysize => 32, + padding => "null", + }); + + my $encdata; + + if (defined $additional_param) + { + $encdata = $cipher1->decrypt (pack ("H*", $additional_param)); + } + else + { + $encdata = "A" x 16; ## can be anything + } + + my $data1_buf = $encdata; + my $data2_buf = sha512 (substr ($data1_buf, 0, 16)); + + my $encrypted1 = unpack ("H*", $cipher1->encrypt ($data1_buf)); + my $encrypted2 = unpack ("H*", $cipher2->encrypt ($data2_buf)); + + $encrypted2 = substr ($encrypted2, 0, 64); + + $tmp_hash = sprintf ("\$office\$*%d*%d*%d*%d*%s*%s*%s", 2013, 100000, 256, 16, unpack ("H*", $salt_buf), $encrypted1, $encrypted2); + } + elsif ($mode == 9700) + { + $salt_buf = pack ("H*", $salt_buf); + + my $tmp = md5 (encode ("UTF-16LE", $word_buf)); + + $tmp = substr ($tmp, 0, 5); + + my $data; + + for (my $i = 0; $i < 16; $i++) + { + $data .= $tmp; + $data .= $salt_buf; + } + + $tmp = md5 ($data); + + $tmp = substr ($tmp, 0, 5); + + my $version; + + if (defined $additional_param2) + { + $version = $additional_param2; + } + else + { + $version = (unpack ("L", $tmp) & 1) ? 0 : 1; + } + + my $rc4_key = md5 ($tmp . "\x00\x00\x00\x00"); + + my $m = Crypt::RC4->new (substr ($rc4_key, 0, 16)); + + my $encdata; + + if (defined $additional_param) + { + $encdata = $m->RC4 (pack ("H*", $additional_param)); + } + else + { + $encdata = "A" x 16; ## can be anything + } + + my $data1_buf = $encdata; + my $data2_buf = md5 (substr ($data1_buf, 0, 16)); + + $m = Crypt::RC4->new (substr ($rc4_key, 0, 16)); + + my $encrypted1 = $m->RC4 ($data1_buf); + my $encrypted2 = $m->RC4 ($data2_buf); + + $tmp_hash = sprintf ("\$oldoffice\$%d*%s*%s*%s", $version, unpack ("H*", $salt_buf), unpack ("H*", $encrypted1), unpack ("H*", $encrypted2)); + } + elsif ($mode == 9800) + { + $salt_buf = pack ("H*", $salt_buf); + + my $tmp = sha1 ($salt_buf. encode ("UTF-16LE", $word_buf)); + + my $version; + + if (defined $additional_param2) + { + $version = $additional_param2; + } + else + { + $version = (unpack ("L", $tmp) & 1) ? 3 : 4; + } + + my $rc4_key = sha1 ($tmp . "\x00\x00\x00\x00"); + + if ($version == 3) + { + $rc4_key = substr ($rc4_key, 0, 5) . "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"; + } + + my $m = Crypt::RC4->new (substr ($rc4_key, 0, 16)); + + my $encdata; + + if (defined $additional_param) + { + $encdata = $m->RC4 (pack ("H*", $additional_param)); + } + else + { + $encdata = "A" x 16; ## can be anything + } + + my $data1_buf = $encdata; + my $data2_buf = sha1 (substr ($data1_buf, 0, 16)); + + $m = Crypt::RC4->new (substr ($rc4_key, 0, 16)); + + my $encrypted1 = $m->RC4 ($data1_buf); + my $encrypted2 = $m->RC4 ($data2_buf); + + $tmp_hash = sprintf ("\$oldoffice\$%d*%s*%s*%s", $version, unpack ("H*", $salt_buf), unpack ("H*", $encrypted1), unpack ("H*", $encrypted2)); + } + elsif ($mode == 9900) + { + $tmp_hash = sprintf ("%s", md5_hex ($word_buf . "\0" x (100 - length ($word_buf)))); + } + elsif ($mode == 10000) + { + my $iterations = 10000; + + if (length ($iter)) + { + $iterations = int ($iter); + } + + my $pbkdf2 = Crypt::PBKDF2->new + ( + hasher => Crypt::PBKDF2->hasher_from_algorithm ('HMACSHA2', 256), + iterations => $iterations + ); + + $hash_buf = encode_base64 ($pbkdf2->PBKDF2 ($salt_buf, $word_buf)); + $hash_buf =~ s/[\r\n]//g; + + $tmp_hash = sprintf ("pbkdf2_sha256\$%i\$%s\$%s", $iterations, $salt_buf, $hash_buf); + } + elsif ($mode == 10100) + { + my $seed = pack ("H*", $salt_buf); + + my ($hi, $lo) = siphash ($word_buf, $seed); + + my $hi_s = sprintf ("%08x", $hi); + my $lo_s = sprintf ("%08x", $lo); + + $hi_s =~ s/^(..)(..)(..)(..)$/$4$3$2$1/; + $lo_s =~ s/^(..)(..)(..)(..)$/$4$3$2$1/; + + $tmp_hash = sprintf ("%s%s:2:4:%s", $hi_s, $lo_s, $salt_buf); + } + elsif ($mode == 10200) + { + my $challengeb64 = encode_base64 ($salt_buf); + $challengeb64 =~ s/[\r\n]//g; + + my $username; + + if (defined $additional_param) + { + $username = $additional_param; + } + else + { + $username = "user"; + } + + $hash_buf = hmac_hex ($salt_buf, $word_buf, \&md5); + + my $responseb64 = encode_base64 ($username . " " . $hash_buf); + $responseb64 =~ s/[\r\n]//g; + + $tmp_hash = sprintf ('$cram_md5$%s$%s', $challengeb64, $responseb64); + } + elsif ($mode == 10300) + { + my $iterations = 1024; + + if (length ($iter)) + { + $iterations = int ($iter); + } + + my $hash_buf = $salt_buf; + + for (my $pos = 0; $pos < $iterations; $pos++) + { + $hash_buf = sha1 ($word_buf . $hash_buf); + } + + $hash_buf = encode_base64 ($hash_buf . $salt_buf); + $hash_buf =~ s/[\r\n]//g; + + $tmp_hash = sprintf ("{x-issha, %i}%s", $iterations, $hash_buf); + } + elsif ($mode == 10400) + { + my $id = $salt_buf; + my $u = $additional_param; + my $o = $additional_param2; + my $P = $additional_param3; + + if (defined $u == 0) + { + $u = "0" x 64; + } + + if (defined $o == 0) + { + $o = "0" x 64; + } + + if (defined $P == 0) + { + $P = -1; + } + + my $padding; + + for (my $i = 0; $i < 32; $i++) + { + $padding .= pack ("C", $pdf_padding[$i]); + } + + my $res = pdf_compute_encryption_key ($word_buf, $padding, $id, $u, $o, $P, 1, 2, 0); + + my $m = Crypt::RC4->new (substr ($res, 0, 5)); + + $u = $m->RC4 ($padding); + + $tmp_hash = sprintf ('$pdf$%d*%d*40*%d*%d*16*%s*32*%s*32*%s', 1, 2, $P, 0, $id, unpack ("H*", $u), $o); + } + elsif ($mode == 10500) + { + my $id = $salt_buf; + my $u = $additional_param; + my $o = $additional_param2; + my $P = $additional_param3; + my $V = $additional_param4; + my $R = $additional_param5; + my $enc = $additional_param6; + + if (defined $u == 0) + { + $u = "0" x 64; + } + + my $u_save = $u; + + if (defined $o == 0) + { + $o = "0" x 64; + } + + if (defined $R == 0) + { + $R = get_random_num (3, 5); + } + + if (defined $V == 0) + { + $V = ($R == 3) ? 2 : 4; + } + + if (defined $P == 0) + { + $P = ($R == 3) ? -4 : -1028; + } + + if (defined $enc == 0) + { + $enc = ($R == 3) ? 1 : get_random_num (0, 2); + } + + my $padding; + + for (my $i = 0; $i < 32; $i++) + { + $padding .= pack ("C", $pdf_padding[$i]); + } + + my $res = pdf_compute_encryption_key ($word_buf, $padding, $id, $u, $o, $P, $V, $R, $enc); + + my $digest = md5 ($padding . pack ("H*", $id)); + + my $m = Crypt::RC4->new ($res); + + $u = $m->RC4 ($digest); + + my @ress = split "", $res; + + for (my $x = 1; $x <= 19; $x++) + { + my @xor; + + for (my $i = 0; $i < 16; $i++) + { + $xor[$i] = chr (ord ($ress[$i]) ^ $x); + } + + my $s = join ("", @xor); + + my $m2 = Crypt::RC4->new ($s); + + $u = $m2->RC4 ($u); + } + + $u .= substr (pack ("H*", $u_save), 16, 16); + + $tmp_hash = sprintf ('$pdf$%d*%d*128*%d*%d*16*%s*32*%s*32*%s', $V, $R, $P, $enc, $id, unpack ("H*", $u), $o); + } + elsif ($mode == 10600) + { + my $id = $salt_buf; + my $rest = $additional_param; + + if (defined $id == 0) + { + $id = "0" x 32; + } + + if (defined $rest == 0) + { + $rest = "127*"; + $rest .= "0" x 64; + $rest .= $id; + $rest .= "0" x 158; + $rest .= "*127*00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000*32*0000000000000000000000000000000000000000000000000000000000000000*32*0000000000000000000000000000000000000000000000000000000000000000"; + } + + my @data = split /\*/, $rest; + + my $u = pack ("H*", $data[1]); + + my $h = sha256 ($word_buf . substr ($u, 32, 8)); + + $data[1] = unpack ("H*", $h . substr ($u, 32)); + + $rest = join ("*", @data); + + $tmp_hash = sprintf ('$pdf$5*5*256*-1028*1*16*%s*%s', $id, $rest); + } + elsif ($mode == 10700) + { + my $id = $salt_buf; + my $rest = $additional_param; + + if (defined $id == 0) + { + $id = "0" x 32; + } + + if (defined $rest == 0) + { + $rest = "127*"; + $rest .= "0" x 64; + $rest .= $id; + $rest .= "0" x 158; + $rest .= "*127*00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000*32*0000000000000000000000000000000000000000000000000000000000000000*32*0000000000000000000000000000000000000000000000000000000000000000"; + } + + my @datax = split /\*/, $rest; + + my $u = pack ("H*", $datax[1]); + + my $block = sha256 ($word_buf . substr ($u, 32, 8)); + + my $block_size = 32; + + my $data = 0x00 x 64; + + my $data_len = 1; + + my $data63 = 0; + + for (my $i = 0; $i < 64 || $i < $data63 + 32; $i++) + { + $data = $word_buf . $block; + + $data_len = length ($data); + + for (my $k = 1; $k < 64; $k++) + { + $data .= $word_buf . $block; + } + + my $aes = Crypt::CBC->new({ + key => substr ($block, 0, 16), + cipher => "Crypt::Rijndael", + iv => substr ($block, 16, 16), + literal_key => 1, + header => "none", + keysize => 16, + padding => "null", + }); + + my $data = $aes->encrypt ($data); + + my $sum = 0; + + for (my $j = 0; $j < 16; $j++) + { + $sum += ord (substr ($data, $j, 1)); + } + + $block_size = 32 + ($sum % 3) * 16; + + if ($block_size == 32) + { + $block = sha256 (substr ($data, 0, $data_len * 64)); + } + elsif ($block_size == 48) + { + $block = sha384 (substr ($data, 0, $data_len * 64)); + } + elsif ($block_size == 64) + { + $block = sha512 (substr ($data, 0, $data_len * 64)); + } + + $data63 = ord (substr ($data, $data_len * 64 - 1, 1)); + } + + $datax[1] = unpack ("H*", substr ($block, 0, 32) . substr ($u, 32)); + + $rest = join ("*", @datax); + + $tmp_hash = sprintf ('$pdf$5*6*256*-1028*1*16*%s*%s', $id, $rest); + } + elsif ($mode == 10800) + { + $hash_buf = sha384_hex ($word_buf); + + $tmp_hash = sprintf ("%s", $hash_buf); + } + elsif ($mode == 10900) + { + my $iterations = 1000; + + if (length ($iter)) + { + $iterations = int ($iter); + } + + my $out_len = 24; + + if (defined $additional_param) + { + $out_len = $additional_param; + } + + my $pbkdf2 = Crypt::PBKDF2->new + ( + hasher => Crypt::PBKDF2->hasher_from_algorithm ('HMACSHA2', 256), + iterations => $iterations, + output_len => $out_len + ); + + $hash_buf = encode_base64 ($pbkdf2->PBKDF2 ($salt_buf, $word_buf)); + $hash_buf =~ s/[\r\n]//g; + + my $base64_salt_buf = encode_base64 ($salt_buf); + + chomp ($base64_salt_buf); + + $tmp_hash = sprintf ("sha256:%i:%s:%s", $iterations, $base64_salt_buf, $hash_buf); + } + elsif ($mode == 11000) + { + $hash_buf = md5_hex ($salt_buf . $word_buf); + + $tmp_hash = sprintf ("%s:%s", $hash_buf, $salt_buf); + } + elsif ($mode == 11100) + { + my $user = "postgres"; + + if (defined $additional_param) + { + $user = $additional_param; + } + + $hash_buf = md5_hex (md5_hex ($word_buf . $user) . pack ("H*", $salt_buf)); + + $tmp_hash = sprintf ("\$postgres\$%s*%s*%s", $user, $salt_buf, $hash_buf); + } + elsif ($mode == 11200) + { + my $sha1_pass = sha1 ($word_buf); + my $double_sha1 = sha1 ($sha1_pass); + + my $xor_part1 = $sha1_pass; + my $xor_part2 = sha1 (pack ("H*", $salt_buf) . $double_sha1); + + my $hash_buf = ""; + + for (my $i = 0; $i < 20; $i++) + { + my $first_byte = substr ($xor_part1, $i, 1); + my $second_byte = substr ($xor_part2, $i, 1); + + my $xor_result = $first_byte ^ $second_byte; + + $hash_buf .= unpack ("H*", $xor_result); + } + + $tmp_hash = sprintf ("\$mysqlna\$%s*%s", $salt_buf, $hash_buf); + } + elsif ($mode == 11300) + { + my $ckey_buf = get_random_string (96); + + if (length ($additional_param)) + { + $ckey_buf = $additional_param; + } + + my $public_key_buf = get_random_string (66); + + if (length ($additional_param2)) + { + $public_key_buf = $additional_param2; + } + + my $salt_iter = get_random_num (150000, 250000); + + if (length ($iter)) + { + $salt_iter = int ($iter); + } + + my $hash_buf = sha512 ($word_buf . pack ("H*", $salt_buf)); + + for (my $i = 1; $i < $salt_iter; $i++) + { + $hash_buf = sha512 ($hash_buf); + } + + my $data = get_random_string (32); + + my $aes = Crypt::CBC->new({ + key => substr ($hash_buf, 0, 32), + cipher => "Crypt::Rijndael", + iv => substr ($hash_buf, 32, 16), + literal_key => 1, + header => "none", + keysize => 32, + padding => "standard", + }); + + my $cry_master_buf = (unpack ("H*", $aes->encrypt ($data))); + + $tmp_hash = sprintf ('$bitcoin$%d$%s$%d$%s$%d$%d$%s$%d$%s', + length ($cry_master_buf), + $cry_master_buf, + length ($salt_buf), + $salt_buf, + $salt_iter, + length ($ckey_buf), + $ckey_buf, + length ($public_key_buf), + $public_key_buf); + } + elsif ($mode == 11400) + { + my ($directive, $URI_server, $URI_client, $user, $realm, $nonce, $nonce_count, $nonce_client, $qop, $method, $URI, $URI_prefix, $URI_resource, $URI_suffix); + + $directive = "MD5"; # only directive currently supported + + if (defined ($additional_param)) + { + $user = $additional_param; + $realm = $additional_param2; + $nonce = $salt_buf; + $nonce_count = $additional_param3; + $nonce_client = $additional_param4; + $qop = $additional_param5; + $method = $additional_param6; + + $URI_prefix = $additional_param7; + $URI_resource = $additional_param8; + $URI_suffix = $additional_param9; + + # not needed information + + $URI_server = $additional_param10; + $URI_client = $additional_param11; + } + else + { + $user = get_random_string (get_random_num (0, 12 + 1)); + + # special limit: (user_len + 1 + realm_len + 1 + word_buf_len) < 56 + my $realm_max_len = 55 - length ($user) - 1 - length ($word_buf) - 1; + + if ($realm_max_len < 1) # should never happen + { + $realm_max_len = 1; + } + + $realm_max_len = min (20, $realm_max_len); + + $realm = get_random_string (get_random_num (0, $realm_max_len + 1)); + + $nonce = $salt_buf; + + if (get_random_num (0, 1 + 1) == 1) + { + $qop = "auth"; + + $nonce_count = get_random_string (get_random_num (0, 10 + 1)); + $nonce_client = get_random_string (get_random_num (0, 12 + 1)); + } + else + { + $qop = ""; + + $nonce_count = ""; + $nonce_client = ""; + } + + $method = get_random_string (get_random_num (0, 24 + 1)); + + $URI_prefix = get_random_string (get_random_num (0, 10 + 1)); + $URI_resource = get_random_string (get_random_num (1, 32 + 1)); + $URI_suffix = get_random_string (get_random_num (0, 32 + 1)); + + # not needed information + + $URI_server = get_random_string (get_random_num (0, 32 + 1)); + $URI_client = $URI_resource; # simplification + } + + # start + + $URI = ""; + + if (length ($URI_prefix) > 0) + { + $URI = $URI_prefix . ":"; + } + + $URI .= $URI_resource; + + if (length ($URI_suffix) > 0) + { + $URI .= ":" . $URI_suffix; + } + + my $HA2 = md5_hex ($method . ":" . $URI); + + my $HA1 = md5_hex ($user . ":" . $realm . ":" . $word_buf); + + my $tmp_buf; + + if (($qop eq "auth") || ($qop eq "auth-int")) + { + $tmp_buf = $nonce . ":" . $nonce_count . ":" . $nonce_client . ":" . $qop; + } + else + { + $tmp_buf = $nonce; + } + + my $hash_buf = md5_hex ($HA1 . ":" . $tmp_buf . ":" . $HA2); + + $tmp_hash = sprintf ("\$sip\$*%s*%s*%s*%s*%s*%s*%s*%s*%s*%s*%s*%s*%s*%s", $URI_server, $URI_resource, $user, $realm, $method, $URI_prefix, $URI_resource, $URI_suffix, $nonce, $nonce_client, $nonce_count, $qop, $directive, $hash_buf); + } + elsif ($mode == 11500) + { + $hash_buf = crc32 ($word_buf); + + $tmp_hash = sprintf ("%08x:00000000", $hash_buf); + } + elsif ($mode == 11600) + { + my ($p, $num_cycle_power, $seven_zip_salt_len, $seven_zip_salt_buf, $salt_len, $data_len, $unpack_size, $data_buf); + + $p = 0; # is fixed + + my $validation_only = 0; + + $validation_only = 1 if (defined ($additional_param)); + + if ($validation_only == 1) + { + $num_cycle_power = int ($iter); + $seven_zip_salt_len = $additional_param; + $seven_zip_salt_buf = $additional_param2; + $salt_len = $additional_param3; + # $salt_buf set in parser + # $hash_buf (resulting crc) + $data_len = $additional_param4; + $unpack_size = $additional_param5; + $data_buf = $additional_param6; + } + else + { + $num_cycle_power = 14; # by default it is 19 + $seven_zip_salt_len = 0; + $seven_zip_salt_buf = ""; + $salt_len = length ($salt_buf); + # $salt_buf set automatically + # $hash_buf (resulting crc) + # $data_len will be set when encrypting + $unpack_size = get_random_num (1, 32 + 1); + $data_buf = get_random_string ($unpack_size); + } + + # + # 2 ^ NumCyclesPower "iterations" of SHA256 (only one final SHA256) + # + + $word_buf = encode ("UTF-16LE", $word_buf); + + my $rounds = 1 << $num_cycle_power; + + my $pass_buf = ""; + + for (my $i = 0; $i < $rounds; $i++) + { + my $num_buf = ""; + + $num_buf .= pack ("V", $i); + $num_buf .= "\x00" x 4; + + # this would be better but only works on 64-bit systems: + # $num_buf = pack ("q", $i); + + $pass_buf .= sprintf ("%s%s", $word_buf, $num_buf); + } + + my $key = sha256 ($pass_buf); + + # the salt_buf is our IV for AES CBC + # pad the salt_buf + + my $salt_buf_len = length ($salt_buf); + my $salt_padding_len = 0; + + if ($salt_buf_len < 16) + { + $salt_padding_len = 16 - $salt_buf_len; + } + + $salt_buf .= "\x00" x $salt_padding_len; + + my $aes = Crypt::CBC->new({ + cipher => "Crypt::Rijndael", + key => $key, + keysize => 32, + literal_key => 1, + iv => $salt_buf, + header => "none", + }); + + if ($validation_only == 1) + { + # decrypt + + my $decrypted_data = $aes->decrypt ($data_buf); + + $decrypted_data = substr ($decrypted_data, 0, $unpack_size); + + $hash_buf = crc32 ($decrypted_data); + } + else + { + # encrypt + + $hash_buf = crc32 ($data_buf); + + $data_buf = $aes->encrypt ($data_buf); + + $data_len = length ($data_buf); + } + + $tmp_hash = sprintf ("\$7z\$%i\$%i\$%i\$%s\$%i\$%08s\$%u\$%u\$%u\$%s", $p, $num_cycle_power, $seven_zip_salt_len, $seven_zip_salt_buf, $salt_len, unpack ("H*", $salt_buf), $hash_buf, $data_len, $unpack_size, unpack ("H*", $data_buf)); + } + elsif ($mode == 11900) + { + my $iterations = 1000; + + if (length ($iter)) + { + $iterations = int ($iter); + } + + my $out_len = 32; + + if (defined $additional_param) + { + $out_len = $additional_param; + } + + # + # call PHP here - WTF + # + + # sanitize $word_buf and $salt_buf: + + my $word_buf_base64 = encode_base64 ($word_buf); + $word_buf_base64 =~ s/[\r\n]//g; + + my $salt_buf_base64 = encode_base64 ($salt_buf); + $salt_buf_base64 =~ s/[\r\n]//g; + + # sanitize lenghs + + $out_len = int ($out_len); + + # output is in hex encoding, otherwise it could be screwed (but shouldn't) + + my $php_code = <<'END_CODE'; + + function pbkdf2 ($algorithm, $password, $salt, $count, $key_length, $raw_output = false) + { + $algorithm = strtolower ($algorithm); + + if(! in_array ($algorithm, hash_algos (), true)) + { + trigger_error ("PBKDF2 ERROR: Invalid hash algorithm.", E_USER_ERROR); + } + + if ($count <= 0 || $key_length <= 0) + { + trigger_error ("PBKDF2 ERROR: Invalid parameters.", E_USER_ERROR); + } + + if (function_exists ("hash_pbkdf2")) + { + if (!$raw_output) + { + $key_length = $key_length * 2; + } + + return hash_pbkdf2 ($algorithm, $password, $salt, $count, $key_length, $raw_output); + } + + $hash_length = strlen (hash ($algorithm, "", true)); + $block_count = ceil ($key_length / $hash_length); + + $output = ""; + + for ($i = 1; $i <= $block_count; $i++) + { + $last = $salt . pack ("N", $i); + + $last = $xorsum = hash_hmac ($algorithm, $last, $password, true); + + for ($j = 1; $j < $count; $j++) + { + $xorsum ^= ($last = hash_hmac ($algorithm, $last, $password, true)); + } + + $output .= $xorsum; + } + + if($raw_output) + { + return substr ($output, 0, $key_length); + } + else + { + return bin2hex (substr ($output, 0, $key_length)); + } + } + + print pbkdf2 ("md5", base64_decode ("$word_buf_base64"), base64_decode ("$salt_buf_base64"), $iterations, $out_len, False); + +END_CODE + + # replace with these command line arguments + + $php_code =~ s/\$word_buf_base64/$word_buf_base64/; + $php_code =~ s/\$salt_buf_base64/$salt_buf_base64/; + $php_code =~ s/\$iterations/$iterations/; + $php_code =~ s/\$out_len/$out_len/; + + my $php_output = `php -r '$php_code'`; + + $hash_buf = pack ("H*", $php_output); + + $hash_buf = encode_base64 ($hash_buf); + $hash_buf =~ s/[\r\n]//g; + + my $base64_salt_buf = encode_base64 ($salt_buf); + + chomp ($base64_salt_buf); + + $tmp_hash = sprintf ("md5:%i:%s:%s", $iterations, $base64_salt_buf, $hash_buf); + } + elsif ($mode == 12000) + { + my $iterations = 1000; + + if (length ($iter)) + { + $iterations = int ($iter); + } + + my $out_len = 16; + + if (defined $additional_param) + { + $out_len = $additional_param; + } + + my $pbkdf2 = Crypt::PBKDF2->new + ( + hasher => Crypt::PBKDF2->hasher_from_algorithm ('HMACSHA1'), + iterations => $iterations, + output_len => $out_len + ); + + $hash_buf = encode_base64 ($pbkdf2->PBKDF2 ($salt_buf, $word_buf)); + $hash_buf =~ s/[\r\n]//g; + + my $base64_salt_buf = encode_base64 ($salt_buf); + + chomp ($base64_salt_buf); + + $tmp_hash = sprintf ("sha1:%i:%s:%s", $iterations, $base64_salt_buf, $hash_buf); + } + elsif ($mode == 12100) + { + my $iterations = 1000; + + if (length ($iter)) + { + $iterations = int ($iter); + } + + my $out_len = 16; + + if (defined $additional_param) + { + $out_len = $additional_param; + } + + my $pbkdf2 = Crypt::PBKDF2->new + ( + hasher => Crypt::PBKDF2->hasher_from_algorithm ('HMACSHA2', 512), + iterations => $iterations, + output_len => $out_len + ); + + $hash_buf = encode_base64 ($pbkdf2->PBKDF2 ($salt_buf, $word_buf)); + $hash_buf =~ s/[\r\n]//g; + + my $base64_salt_buf = encode_base64 ($salt_buf); + + chomp ($base64_salt_buf); + + $tmp_hash = sprintf ("sha512:%i:%s:%s", $iterations, $base64_salt_buf, $hash_buf); + } + elsif ($mode == 12200) + { + my $iterations = 65536; + + my $default_salt = 0; + + if (defined $additional_param) + { + $default_salt = int ($additional_param); + } + + if ($default_salt == 1) + { + $salt_buf = "0011223344556677"; + } + + $hash_buf = sha512 (pack ("H*", $salt_buf) . $word_buf); + + for (my $i = 0; $i < $iterations; $i++) + { + $hash_buf = sha512 ($hash_buf); + } + + $hash_buf = unpack ("H*", $hash_buf); + $hash_buf = substr ($hash_buf, 0, 16); + + if ($default_salt == 0) + { + $tmp_hash = sprintf ("\$ecryptfs\$0\$1\$%s\$%s", $salt_buf, $hash_buf); + } + else + { + $tmp_hash = sprintf ("\$ecryptfs\$0\$%s", $hash_buf); + } + } + elsif ($mode == 12300) + { + my $iterations = 4096; + + my $hasher = Crypt::PBKDF2->hasher_from_algorithm ('HMACSHA2', 512); + + my $pbkdf2 = Crypt::PBKDF2->new ( + hasher => $hasher, + iterations => $iterations, + output_len => 64 + ); + + my $salt_bin = pack ("H*", $salt_buf); + + my $key = $pbkdf2->PBKDF2 ($salt_bin. "AUTH_PBKDF2_SPEEDY_KEY", $word_buf); + + $hash_buf = sha512_hex ($key . $salt_bin); + + $tmp_hash = sprintf ("%s%s", uc ($hash_buf), uc ($salt_buf)); + } + elsif ($mode == 12400) + { + my $iterations; + + if (length ($iter)) + { + $iterations = int ($iter); + } + else + { + $iterations = get_random_num (1, 5001 + 1); + } + + my $key_value = fold_password ($word_buf); + + my $data = "\x00\x00\x00\x00\x00\x00\x00\x00"; + my $salt_value = base64_to_int24 ($salt_buf); + + $hash_buf = crypt_rounds ($key_value, $iterations, $salt_value, $data); + + $tmp_hash = sprintf ("_%s%s%s", int24_to_base64 ($iterations), $salt_buf, block_to_base64 ($hash_buf)); + } + elsif ($mode == 12600) + { + $hash_buf = sha1_hex ($word_buf); + + $hash_buf = sha256_hex ($salt_buf . uc $hash_buf); + + $tmp_hash = sprintf ("%s:%s", $hash_buf, $salt_buf); + } + elsif ($mode == 12700) + { + my $iterations = 10; + + my $data = qq|{ + "guid" : "00000000-0000-0000-0000-000000000000", + "sharedKey" : "00000000-0000-0000-0000-000000000000", + "options" : {"pbkdf2_iterations":10,"fee_policy":0,"html5_notifications":false,"logout_time":600000,"tx_display":0,"always_keep_local_backup":false}|; + + my $salt_buf_bin = pack ("H*", $salt_buf); + + my $hasher = Crypt::PBKDF2->hasher_from_algorithm ('HMACSHA1'); + + my $pbkdf2 = Crypt::PBKDF2->new ( + hasher => $hasher, + iterations => $iterations, + output_len => 32 + ); + + my $key = $pbkdf2->PBKDF2 ($salt_buf_bin, $word_buf); + + my $cipher = Crypt::CBC->new({ + key => $key, + cipher => "Crypt::Rijndael", + iv => $salt_buf_bin, + literal_key => 1, + header => "none", + keysize => 32 + }); + + my $encrypted = unpack ("H*", $cipher->encrypt ($data)); + + $tmp_hash = sprintf ("\$blockchain\$%s\$%s", length ($salt_buf . $encrypted) / 2, $salt_buf . $encrypted); + } + elsif ($mode == 12800) + { + my $iterations = 100; + + if (length ($iter)) + { + $iterations = int ($iter); + } + + my $nt = md4_hex (encode ("UTF-16LE", $word_buf)); + + my $pbkdf2 = Crypt::PBKDF2->new + ( + hasher => Crypt::PBKDF2->hasher_from_algorithm ('HMACSHA2', 256), + iterations => $iterations, + output_len => 32 + ); + + my $salt_buf_bin = pack ("H*", $salt_buf); + + my $hash = $pbkdf2->PBKDF2 ($salt_buf_bin, uc (encode ("UTF-16LE", $nt))); + + $tmp_hash = sprintf ("v1;PPH1_MD4,%s,%d,%s", $salt_buf, $iterations, unpack ("H*", $hash)); + } + + return ($tmp_hash); +} + +sub rnd +{ + my $mode = shift; + + my $word_len = shift; + + my $salt_len = shift; + + my $max = $MAX_LEN; + + $max = 15 if ($mode == 2410); + + if ($is_unicode{$mode}) + { + if (! $allow_long_salt{$mode}) + { + $word_len = min ($word_len, int ($max / 2) - $salt_len); + } + else + { + $word_len = min ($word_len, int ($max / 2)); + } + } + elsif ($less_fifteen{$mode}) + { + $word_len = min ($word_len, 15); + + if ($mode == 2410) + { + $salt_len = min ($salt_len, 15 - $word_len); + } + } + else + { + if (! $allow_long_salt{$mode}) + { + $word_len = min ($word_len, $max - $salt_len); + } + } + + if ($word_len < 1) + { + $word_len = 1; + } + + ## + ## gen salt + ## + + my $salt_buf; + + if ($mode == 4800) + { + my @salt_arr; + + for (my $i = 0; $i < $salt_len; $i++) + { + my $c = get_random_chr (0x30, 0x39); + + push (@salt_arr, $c); + } + + $salt_buf = join ("", @salt_arr); + + $salt_buf = get_random_md5chap_salt ($salt_buf); + } + elsif ($mode == 5300 || $mode == 5400) + { + $salt_buf = get_random_ike_salt (); + } + elsif ($mode == 5500) + { + $salt_buf = get_random_netntlmv1_salt ($salt_len, $salt_len); + } + elsif ($mode == 5600) + { + $salt_buf = get_random_netntlmv2_salt ($salt_len, $salt_len); + } + elsif ($mode == 6600) + { + $salt_buf = get_random_agilekeychain_salt (); + } + elsif ($mode == 8200) + { + $salt_buf = get_random_cloudkeychain_salt (); + } + elsif ($mode == 8300) + { + $salt_buf = get_random_dnssec_salt (); + } + else + { + my @salt_arr; + + for (my $i = 0; $i < $salt_len; $i++) + { + my $c = get_random_chr (0x30, 0x39); + + push (@salt_arr, $c); + } + + $salt_buf = join ("", @salt_arr); + + if ($mode == 7500) + { + $salt_buf = get_random_kerberos5_salt ($salt_buf); + } + } + + ## + ## gen plain + ## + + my @word_arr; + + for (my $i = 0; $i < $word_len; $i++) + { + my $c = get_random_chr (0x30, 0x39); + + push (@word_arr, $c); + } + + my $word_buf = join ("", @word_arr); + + ## + ## gen hash + ## + + my $tmp_hash = gen_hash ($mode, $word_buf, $salt_buf); + + ## + ## run + ## + + my @cmd = + ( + $hashcat, + "-a 0 -m", $mode, + $tmp_hash + ); + + print sprintf ("echo -n %-20s | %s \${OPTS} %s %4d '%s'\n", $word_buf, @cmd); +} + +## +## subs +## + +sub min +{ + $_[$_[0] > $_[1]]; +} + +sub get_random_string +{ + my $len = shift; + + my @arr; + + for (my $i = 0; $i < $len; $i++) + { + my $c = get_random_chr (0x30, 0x39); + + push (@arr, $c); + } + + my $buf = join ("", @arr); + + return $buf; +} + +sub get_random_num +{ + my $min = shift; + my $max = shift; + + return int ((rand ($max - $min)) + $min); +} + +sub get_random_chr +{ + return chr get_random_num (@_); +} + +sub domino_decode +{ + my $str = shift; + + my $decoded = ""; + + for (my $i = 0; $i < length ($str); $i += 4) + { + my $num = domino_base64_decode (substr ($str, $i, 4), 4); + + $decoded .= chr (($num >> 16) & 0xff) . chr (($num >> 8) & 0xff) . chr ($num & 0xff); + } + + my $salt; + my $digest; + my $char; + + $salt = substr ($decoded, 0, 5); + + my $byte10 = (ord (substr ($salt, 3, 1)) - 4); + + if ($byte10 < 0) + { + $byte10 = 256 + $byte10; + } + + substr ($salt, 3, 1) = chr ($byte10); + + $digest = substr ($decoded, 5, 9); + $char = substr ($str, 18, 1); + + return ($digest, $salt, $char); +} + +sub domino_85x_decode +{ + my $str = shift; + + my $decoded = ""; + + for (my $i = 0; $i < length ($str); $i += 4) + { + my $num = domino_base64_decode (substr ($str, $i, 4), 4); + + $decoded .= chr (($num >> 16) & 0xff) . chr (($num >> 8) & 0xff) . chr ($num & 0xff); + } + + my $digest; + my $salt; + my $iterations = -1; + my $chars; + + $salt = substr ($decoded, 0, 16); # longer than -m 8700 (5 vs 16 <- new) + + my $byte10 = (ord (substr ($salt, 3, 1)) - 4); + + if ($byte10 < 0) + { + $byte10 = 256 + $byte10; + } + + substr ($salt, 3, 1) = chr ($byte10); + + $iterations = substr ($decoded, 16, 10); + + if ($iterations =~ /^?d*$/) + { + # continue + + $iterations = $iterations + 0; # hack: make sure it is an int now (atoi ()) + $chars = substr ($decoded, 26, 2); # in my example it is "02" + $digest = substr ($decoded, 28, 8); # only of length of 8 vs 20 SHA1 bytes + } + + return ($digest, $salt, $iterations, $chars); +} + +sub domino_base64_decode +{ + my $v = shift; + my $n = shift; + + my $itoa64 = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz+/"; + + my $ret = 0; + + my $i = 1; + + while ($i <= $n) + { + my $idx = (index ($itoa64, substr ($v, $n - $i, 1))) & 0x3f; + + $ret += ($idx << (6 * ($i - 1))); + + $i = $i + 1; + } + + return $ret +} + +sub domino_encode +{ + my $final = shift; + my $char = shift; + + my $byte10 = (ord (substr ($final, 3, 1)) + 4); + + if ($byte10 > 255) + { + $byte10 = $byte10 - 256; + } + + substr ($final, 3, 1) = chr ($byte10); + + my $passwd = ""; + + $passwd .= domino_base64_encode ((int (ord (substr ($final, 0, 1))) << 16) | (int (ord (substr ($final, 1, 1))) << 8) | (int (ord (substr ($final, 2, 1)))), 4); + $passwd .= domino_base64_encode ((int (ord (substr ($final, 3, 1))) << 16) | (int (ord (substr ($final, 4, 1))) << 8) | (int (ord (substr ($final, 5, 1)))), 4); + $passwd .= domino_base64_encode ((int (ord (substr ($final, 6, 1))) << 16) | (int (ord (substr ($final, 7, 1))) << 8) | (int (ord (substr ($final, 8, 1)))), 4); + $passwd .= domino_base64_encode ((int (ord (substr ($final, 9, 1))) << 16) | (int (ord (substr ($final, 10, 1))) << 8) | (int (ord (substr ($final, 11, 1)))), 4); + $passwd .= domino_base64_encode ((int (ord (substr ($final, 12, 1))) << 16) | (int (ord (substr ($final, 13, 1))) << 8) | (int (ord (substr ($final, 14, 1)))), 4); + + if (defined ($char)) + { + substr ($passwd, 18, 1) = $char; + } + substr ($passwd, 19, 1) = ""; + + return $passwd; +} + +sub domino_85x_encode +{ + my $final = shift; + my $char = shift; + + my $byte10 = (ord (substr ($final, 3, 1)) + 4); + + if ($byte10 > 255) + { + $byte10 = $byte10 - 256; + } + + substr ($final, 3, 1) = chr ($byte10); + + my $passwd = ""; + + $passwd .= domino_base64_encode ((int (ord (substr ($final, 0, 1))) << 16) | (int (ord (substr ($final, 1, 1))) << 8) | (int (ord (substr ($final, 2, 1)))), 4); + $passwd .= domino_base64_encode ((int (ord (substr ($final, 3, 1))) << 16) | (int (ord (substr ($final, 4, 1))) << 8) | (int (ord (substr ($final, 5, 1)))), 4); + $passwd .= domino_base64_encode ((int (ord (substr ($final, 6, 1))) << 16) | (int (ord (substr ($final, 7, 1))) << 8) | (int (ord (substr ($final, 8, 1)))), 4); + $passwd .= domino_base64_encode ((int (ord (substr ($final, 9, 1))) << 16) | (int (ord (substr ($final, 10, 1))) << 8) | (int (ord (substr ($final, 11, 1)))), 4); + $passwd .= domino_base64_encode ((int (ord (substr ($final, 12, 1))) << 16) | (int (ord (substr ($final, 13, 1))) << 8) | (int (ord (substr ($final, 14, 1)))), 4); + $passwd .= domino_base64_encode ((int (ord (substr ($final, 15, 1))) << 16) | (int (ord (substr ($final, 16, 1))) << 8) | (int (ord (substr ($final, 17, 1)))), 4); + $passwd .= domino_base64_encode ((int (ord (substr ($final, 18, 1))) << 16) | (int (ord (substr ($final, 19, 1))) << 8) | (int (ord (substr ($final, 20, 1)))), 4); + $passwd .= domino_base64_encode ((int (ord (substr ($final, 21, 1))) << 16) | (int (ord (substr ($final, 22, 1))) << 8) | (int (ord (substr ($final, 23, 1)))), 4); + $passwd .= domino_base64_encode ((int (ord (substr ($final, 24, 1))) << 16) | (int (ord (substr ($final, 25, 1))) << 8) | (int (ord (substr ($final, 26, 1)))), 4); + $passwd .= domino_base64_encode ((int (ord (substr ($final, 27, 1))) << 16) | (int (ord (substr ($final, 28, 1))) << 8) | (int (ord (substr ($final, 29, 1)))), 4); + $passwd .= domino_base64_encode ((int (ord (substr ($final, 30, 1))) << 16) | (int (ord (substr ($final, 31, 1))) << 8) | (int (ord (substr ($final, 32, 1)))), 4); + $passwd .= domino_base64_encode ((int (ord (substr ($final, 33, 1))) << 16) | (int (ord (substr ($final, 34, 1))) << 8) | (int (ord (substr ($final, 35, 1)))), 4); + + if (defined ($char)) + { + substr ($passwd, 18, 1) = $char; + } + + return $passwd; +} + +sub domino_base64_encode +{ + my $v = shift; + my $n = shift; + + my $itoa64 = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz+/"; + + my $ret = ""; + + while (($n - 1) >= 0) + { + $n = $n - 1; + + $ret = substr ($itoa64, $v & 0x3f, 1) . $ret; + + $v = $v >> 6; + } + + return $ret +} + +sub pseudo_base64 +{ + my $itoa64 = "./0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"; + + my $md5 = shift; + my $s64 = ""; + for my $i (0..3) { + my $v = unpack "V", substr($md5, $i*4, 4); + for (1..4) { + $s64 .= substr($itoa64, $v & 0x3f, 1); + $v >>= 6; + } + } + return $s64; +} + +sub racf_hash +{ + my ($username, $password) = @_; + + $username = substr ($username . " " x 8, 0, 8); + $password = substr ($password . " " x 8, 0, 8); + + my $username_ebc = ascii2ebcdic ($username); + my $password_ebc = ascii2ebcdic ($password); + + my @pw = split ("", $password_ebc); + + for (my $i = 0; $i < 8; $i++) + { + $pw[$i] = unpack ("C", $pw[$i]); + $pw[$i] ^= 0x55; + $pw[$i] <<= 1; + $pw[$i] = pack ("C", $pw[$i] & 0xff); + } + + my $key = join ("", @pw); + + my $cipher = new Crypt::DES $key; + + my $ciphertext = $cipher->encrypt ($username_ebc); + + my $ct = unpack ("H16", $ciphertext); + + return $ct; +} + +sub oracle_hash +{ + my ($username, $password) = @_; + + my $userpass = pack('n*', unpack('C*', uc($username.$password))); + $userpass .= pack('C', 0) while (length($userpass) % 8); + + my $key = pack('H*', "0123456789ABCDEF"); + my $iv = pack('H*', "0000000000000000"); + + my $c = new Crypt::CBC( + -literal_key => 1, + -cipher => "DES", + -key => $key, + -iv => $iv, + -header => "none" + ); + my $key2 = substr($c->encrypt($userpass), length($userpass)-8, 8); + + my $c2 = new Crypt::CBC( + -literal_key => 1, + -cipher => "DES", + -key => $key2, + -iv => $iv, + -header => "none" + ); + my $hash = substr($c2->encrypt($userpass), length($userpass)-8, 8); + + return uc(unpack('H*', $hash)); +} + +sub androidpin_hash +{ + my $word_buf = shift; + + my $salt_buf = shift; + + my $w = sprintf ("%d%s%s", 0, $word_buf, $salt_buf); + + my $digest = sha1 ($w); + + for (my $i = 1; $i < 1024; $i++) + { + $w = $digest . sprintf ("%d%s%s", $i, $word_buf, $salt_buf); + + $digest = sha1 ($w); + } + + my ($A, $B, $C, $D, $E) = unpack ("N5", $digest); + + return sprintf ("%08x%08x%08x%08x%08x", $A, $B, $C, $D, $E); +} + +sub to64 +{ + my $v = shift; + my $n = shift; + + my $itoa64 = "./0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"; + + my $ret = ""; + + while (($n - 1) >= 0) + { + $n = $n - 1; + + $ret .= substr ($itoa64, $v & 0x3f, 1); + + $v = $v >> 6; + } + + return $ret +} + +sub md5_crypt +{ + my $magic = shift; + + my $iter = shift; + my $pass = shift; + my $salt = shift; + + my $hash = ""; # hash to be returned by this function + + my $final = md5 ($pass . $salt . $pass); + + $salt = substr ($salt, 0, 8); + + my $tmp = $pass . $magic . $salt; + + my $pass_len = length ($pass); + + my $i; + + for ($i = $pass_len; $i > 0; $i -= 16) + { + my $len = 16; + + if ($i < $len) + { + $len = $i; + } + + $tmp .= substr ($final, 0, $len); + } + + $i = $pass_len; + + while ($i > 0) + { + if ($i & 1) + { + $tmp .= chr (0); + } + else + { + $tmp .= substr ($pass, 0, 1); + } + + $i >>= 1; + } + + $final = md5 ($tmp); + + for ($i = 0; $i < $iter; $i++) + { + $tmp = ""; + + if ($i & 1) + { + $tmp .= $pass; + } + else + { + $tmp .= $final; + } + + if ($i % 3) + { + $tmp .= $salt; + } + + if ($i % 7) + { + $tmp .= $pass; + } + + if ($i & 1) + { + $tmp .= $final; + } + else + { + $tmp .= $pass; + } + + $final = md5 ($tmp); + } + + # done + # now format the output sting ("hash") + + my $hash_buf; + + $hash = to64 ((ord (substr ($final, 0, 1)) << 16) | (ord (substr ($final, 6, 1)) << 8) | (ord (substr ($final, 12, 1))), 4); + $hash .= to64 ((ord (substr ($final, 1, 1)) << 16) | (ord (substr ($final, 7, 1)) << 8) | (ord (substr ($final, 13, 1))), 4); + $hash .= to64 ((ord (substr ($final, 2, 1)) << 16) | (ord (substr ($final, 8, 1)) << 8) | (ord (substr ($final, 14, 1))), 4); + $hash .= to64 ((ord (substr ($final, 3, 1)) << 16) | (ord (substr ($final, 9, 1)) << 8) | (ord (substr ($final, 15, 1))), 4); + $hash .= to64 ((ord (substr ($final, 4, 1)) << 16) | (ord (substr ($final, 10, 1)) << 8) | (ord (substr ($final, 5, 1))), 4); + $hash .= to64 (ord (substr ($final, 11, 1)), 2); + + if ($iter == 1000) # default + { + $hash_buf = sprintf ("%s%s\$%s", $magic , $salt , $hash); + } + else + { + $hash_buf = sprintf ("%srounds=%i\$%s\$%s", $magic, $iter, $salt , $hash); + } + + return $hash_buf; +} + +sub sha512_crypt +{ + my $iter = shift; + my $pass = shift; + my $salt = shift; + + my $hash = ""; # hash to be returned by this function + + my $final = sha512 ($pass . $salt . $pass); + + $salt = substr ($salt, 0, 16); + + my $tmp = $pass . $salt; + + my $pass_len = length ($pass); + my $salt_len = length ($salt); + + my $i; + + for ($i = $pass_len; $i > 0; $i -= 16) + { + my $len = 16; + + if ($i < $len) + { + $len = $i; + } + + $tmp .= substr ($final, 0, $len); + } + + $i = $pass_len; + + while ($i > 0) + { + if ($i & 1) + { + $tmp .= $final; + } + else + { + $tmp .= $pass; + } + + $i >>= 1; + } + + $final = sha512 ($tmp); + + # p_bytes + + my $p_bytes = ""; + + for ($i = 0; $i < $pass_len; $i++) + { + $p_bytes .= $pass; + } + + $p_bytes = sha512 ($p_bytes); + $p_bytes = substr ($p_bytes, 0, $pass_len); + + # s_bytes + + my $final_first_byte = ord (substr ($final, 0, 1)); + + my $s_bytes = ""; + + for ($i = 0; $i < (16 + $final_first_byte); $i++) + { + $s_bytes .= $salt; + } + + $s_bytes = sha512 ($s_bytes); + $s_bytes = substr ($s_bytes, 0, $salt_len); + + for ($i = 0; $i < $iter; $i++) + { + $tmp = ""; + + if ($i & 1) + { + $tmp .= $p_bytes; + } + else + { + $tmp .= $final; + } + + if ($i % 3) + { + $tmp .= $s_bytes; + } + + if ($i % 7) + { + $tmp .= $p_bytes; + } + + if ($i & 1) + { + $tmp .= $final; + } + else + { + $tmp .= $p_bytes; + } + + $final = sha512 ($tmp); + } + + # done + # now format the output string ("hash") + + my $hash_buf; + + $hash .= to64 ((ord (substr ($final, 0, 1)) << 16) | (ord (substr ($final, 21, 1)) << 8) | (ord (substr ($final, 42, 1))), 4); + $hash .= to64 ((ord (substr ($final, 22, 1)) << 16) | (ord (substr ($final, 43, 1)) << 8) | (ord (substr ($final, 1, 1))), 4); + $hash .= to64 ((ord (substr ($final, 44, 1)) << 16) | (ord (substr ($final, 2, 1)) << 8) | (ord (substr ($final, 23, 1))), 4); + $hash .= to64 ((ord (substr ($final, 3, 1)) << 16) | (ord (substr ($final, 24, 1)) << 8) | (ord (substr ($final, 45, 1))), 4); + $hash .= to64 ((ord (substr ($final, 25, 1)) << 16) | (ord (substr ($final, 46, 1)) << 8) | (ord (substr ($final, 4, 1))), 4); + $hash .= to64 ((ord (substr ($final, 47, 1)) << 16) | (ord (substr ($final, 5, 1)) << 8) | (ord (substr ($final, 26, 1))), 4); + $hash .= to64 ((ord (substr ($final, 6, 1)) << 16) | (ord (substr ($final, 27, 1)) << 8) | (ord (substr ($final, 48, 1))), 4); + $hash .= to64 ((ord (substr ($final, 28, 1)) << 16) | (ord (substr ($final, 49, 1)) << 8) | (ord (substr ($final, 7, 1))), 4); + $hash .= to64 ((ord (substr ($final, 50, 1)) << 16) | (ord (substr ($final, 8, 1)) << 8) | (ord (substr ($final, 29, 1))), 4); + $hash .= to64 ((ord (substr ($final, 9, 1)) << 16) | (ord (substr ($final, 30, 1)) << 8) | (ord (substr ($final, 51, 1))), 4); + $hash .= to64 ((ord (substr ($final, 31, 1)) << 16) | (ord (substr ($final, 52, 1)) << 8) | (ord (substr ($final, 10, 1))), 4); + $hash .= to64 ((ord (substr ($final, 53, 1)) << 16) | (ord (substr ($final, 11, 1)) << 8) | (ord (substr ($final, 32, 1))), 4); + $hash .= to64 ((ord (substr ($final, 12, 1)) << 16) | (ord (substr ($final, 33, 1)) << 8) | (ord (substr ($final, 54, 1))), 4); + $hash .= to64 ((ord (substr ($final, 34, 1)) << 16) | (ord (substr ($final, 55, 1)) << 8) | (ord (substr ($final, 13, 1))), 4); + $hash .= to64 ((ord (substr ($final, 56, 1)) << 16) | (ord (substr ($final, 14, 1)) << 8) | (ord (substr ($final, 35, 1))), 4); + $hash .= to64 ((ord (substr ($final, 15, 1)) << 16) | (ord (substr ($final, 36, 1)) << 8) | (ord (substr ($final, 57, 1))), 4); + $hash .= to64 ((ord (substr ($final, 37, 1)) << 16) | (ord (substr ($final, 58, 1)) << 8) | (ord (substr ($final, 16, 1))), 4); + $hash .= to64 ((ord (substr ($final, 59, 1)) << 16) | (ord (substr ($final, 17, 1)) << 8) | (ord (substr ($final, 38, 1))), 4); + $hash .= to64 ((ord (substr ($final, 18, 1)) << 16) | (ord (substr ($final, 39, 1)) << 8) | (ord (substr ($final, 60, 1))), 4); + $hash .= to64 ((ord (substr ($final, 40, 1)) << 16) | (ord (substr ($final, 61, 1)) << 8) | (ord (substr ($final, 19, 1))), 4); + $hash .= to64 ((ord (substr ($final, 62, 1)) << 16) | (ord (substr ($final, 20, 1)) << 8) | (ord (substr ($final, 41, 1))), 4); + $hash .= to64 (ord (substr ($final, 63, 1)), 2); + + my $magic = '$6$'; + + if ($iter == 5000) # default + { + $hash_buf = sprintf ("%s%s\$%s", $magic, $salt , $hash); + } + else + { + $hash_buf = sprintf ("%srounds=%i\$%s\$%s", $magic, $iter, $salt , $hash); + } + + return $hash_buf; +} + +sub sha256_crypt +{ + my $iter = shift; + my $pass = shift; + my $salt = shift; + + my $hash = ""; # hash to be returned by this function + + my $final = sha256 ($pass . $salt . $pass); + + $salt = substr ($salt, 0, 16); + + my $tmp = $pass . $salt; + + my $pass_len = length ($pass); + my $salt_len = length ($salt); + + my $i; + + for ($i = $pass_len; $i > 0; $i -= 16) + { + my $len = 16; + + if ($i < $len) + { + $len = $i; + } + + $tmp .= substr ($final, 0, $len); + } + + $i = $pass_len; + + while ($i > 0) + { + if ($i & 1) + { + $tmp .= $final; + } + else + { + $tmp .= $pass; + } + + $i >>= 1; + } + + $final = sha256 ($tmp); + + # p_bytes + + my $p_bytes = ""; + + for ($i = 0; $i < $pass_len; $i++) + { + $p_bytes .= $pass; + } + + $p_bytes = sha256 ($p_bytes); + $p_bytes = substr ($p_bytes, 0, $pass_len); + + # s_bytes + + my $final_first_byte = ord (substr ($final, 0, 1)); + + my $s_bytes = ""; + + for ($i = 0; $i < (16 + $final_first_byte); $i++) + { + $s_bytes .= $salt; + } + + $s_bytes = sha256 ($s_bytes); + $s_bytes = substr ($s_bytes, 0, $salt_len); + + for ($i = 0; $i < $iter; $i++) + { + $tmp = ""; + + if ($i & 1) + { + $tmp .= $p_bytes; + } + else + { + $tmp .= $final; + } + + if ($i % 3) + { + $tmp .= $s_bytes; + } + + if ($i % 7) + { + $tmp .= $p_bytes; + } + + if ($i & 1) + { + $tmp .= $final; + } + else + { + $tmp .= $p_bytes; + } + + $final = sha256 ($tmp); + } + + # done + # now format the output string ("hash") + + my $hash_buf; + + $hash .= to64 ((ord (substr ($final, 0, 1)) << 16) | (ord (substr ($final, 10, 1)) << 8) | (ord (substr ($final, 20, 1))), 4); + $hash .= to64 ((ord (substr ($final, 21, 1)) << 16) | (ord (substr ($final, 1, 1)) << 8) | (ord (substr ($final, 11, 1))), 4); + $hash .= to64 ((ord (substr ($final, 12, 1)) << 16) | (ord (substr ($final, 22, 1)) << 8) | (ord (substr ($final, 2, 1))), 4); + $hash .= to64 ((ord (substr ($final, 3, 1)) << 16) | (ord (substr ($final, 13, 1)) << 8) | (ord (substr ($final, 23, 1))), 4); + $hash .= to64 ((ord (substr ($final, 24, 1)) << 16) | (ord (substr ($final, 4, 1)) << 8) | (ord (substr ($final, 14, 1))), 4); + $hash .= to64 ((ord (substr ($final, 15, 1)) << 16) | (ord (substr ($final, 25, 1)) << 8) | (ord (substr ($final, 5, 1))), 4); + $hash .= to64 ((ord (substr ($final, 6, 1)) << 16) | (ord (substr ($final, 16, 1)) << 8) | (ord (substr ($final, 26, 1))), 4); + $hash .= to64 ((ord (substr ($final, 27, 1)) << 16) | (ord (substr ($final, 7, 1)) << 8) | (ord (substr ($final, 17, 1))), 4); + $hash .= to64 ((ord (substr ($final, 18, 1)) << 16) | (ord (substr ($final, 28, 1)) << 8) | (ord (substr ($final, 8, 1))), 4); + $hash .= to64 ((ord (substr ($final, 9, 1)) << 16) | (ord (substr ($final, 19, 1)) << 8) | (ord (substr ($final, 29, 1))), 4); + $hash .= to64 ((ord (substr ($final, 31, 1)) << 8) | (ord (substr ($final, 30, 1))), 3); + + my $magic = '$5$'; + + if ($iter == 5000) # default + { + $hash_buf = sprintf ("%s%s\$%s", $magic, $salt , $hash); + } + else + { + $hash_buf = sprintf ("%srounds=%i\$%s\$%s", $magic, $iter, $salt , $hash); + } + + return $hash_buf; +} + +sub aix_ssha256_pbkdf2 +{ + my $word_buf = shift; + my $salt_buf = shift; + my $iterations = shift; + + my $hasher = Crypt::PBKDF2->hasher_from_algorithm ('HMACSHA2', 256); + + my $pbkdf2 = Crypt::PBKDF2->new ( + hasher => $hasher, + iterations => $iterations, + output_len => 32 + ); + + my $hash_buf = $pbkdf2->PBKDF2 ($salt_buf, $word_buf); + + my $tmp_hash = ""; + + $tmp_hash .= to64 ((int (ord (substr ($hash_buf, 0, 1))) << 16) | (int (ord (substr ($hash_buf, 1, 1))) << 8) | (int (ord (substr ($hash_buf, 2, 1)))), 4); + $tmp_hash .= to64 ((int (ord (substr ($hash_buf, 3, 1))) << 16) | (int (ord (substr ($hash_buf, 4, 1))) << 8) | (int (ord (substr ($hash_buf, 5, 1)))), 4); + $tmp_hash .= to64 ((int (ord (substr ($hash_buf, 6, 1))) << 16) | (int (ord (substr ($hash_buf, 7, 1))) << 8) | (int (ord (substr ($hash_buf, 8, 1)))), 4); + $tmp_hash .= to64 ((int (ord (substr ($hash_buf, 9, 1))) << 16) | (int (ord (substr ($hash_buf, 10, 1))) << 8) | (int (ord (substr ($hash_buf, 11, 1)))), 4); + $tmp_hash .= to64 ((int (ord (substr ($hash_buf, 12, 1))) << 16) | (int (ord (substr ($hash_buf, 13, 1))) << 8) | (int (ord (substr ($hash_buf, 14, 1)))), 4); + $tmp_hash .= to64 ((int (ord (substr ($hash_buf, 15, 1))) << 16) | (int (ord (substr ($hash_buf, 16, 1))) << 8) | (int (ord (substr ($hash_buf, 17, 1)))), 4); + $tmp_hash .= to64 ((int (ord (substr ($hash_buf, 18, 1))) << 16) | (int (ord (substr ($hash_buf, 19, 1))) << 8) | (int (ord (substr ($hash_buf, 20, 1)))), 4); + $tmp_hash .= to64 ((int (ord (substr ($hash_buf, 21, 1))) << 16) | (int (ord (substr ($hash_buf, 22, 1))) << 8) | (int (ord (substr ($hash_buf, 23, 1)))), 4); + $tmp_hash .= to64 ((int (ord (substr ($hash_buf, 24, 1))) << 16) | (int (ord (substr ($hash_buf, 25, 1))) << 8) | (int (ord (substr ($hash_buf, 26, 1)))), 4); + $tmp_hash .= to64 ((int (ord (substr ($hash_buf, 27, 1))) << 16) | (int (ord (substr ($hash_buf, 28, 1))) << 8) | (int (ord (substr ($hash_buf, 29, 1)))), 4); + $tmp_hash .= to64 ((int (ord (substr ($hash_buf, 30, 1))) << 16) | (int (ord (substr ($hash_buf, 31, 1))) << 8) , 3); + + return $tmp_hash; +} + +sub aix_ssha512_pbkdf2 +{ + my $word_buf = shift; + my $salt_buf = shift; + my $iterations = shift; + + my $hasher = Crypt::PBKDF2->hasher_from_algorithm ('HMACSHA2', 512); + + my $pbkdf2 = Crypt::PBKDF2->new ( + hasher => $hasher, + iterations => $iterations, + ); + + my $hash_buf = $pbkdf2->PBKDF2 ($salt_buf, $word_buf); + + my $tmp_hash = ""; + + $tmp_hash .= to64 ((int (ord (substr ($hash_buf, 0, 1))) << 16) | (int (ord (substr ($hash_buf, 1, 1))) << 8) | (int (ord (substr ($hash_buf, 2, 1)))), 4); + $tmp_hash .= to64 ((int (ord (substr ($hash_buf, 3, 1))) << 16) | (int (ord (substr ($hash_buf, 4, 1))) << 8) | (int (ord (substr ($hash_buf, 5, 1)))), 4); + $tmp_hash .= to64 ((int (ord (substr ($hash_buf, 6, 1))) << 16) | (int (ord (substr ($hash_buf, 7, 1))) << 8) | (int (ord (substr ($hash_buf, 8, 1)))), 4); + $tmp_hash .= to64 ((int (ord (substr ($hash_buf, 9, 1))) << 16) | (int (ord (substr ($hash_buf, 10, 1))) << 8) | (int (ord (substr ($hash_buf, 11, 1)))), 4); + $tmp_hash .= to64 ((int (ord (substr ($hash_buf, 12, 1))) << 16) | (int (ord (substr ($hash_buf, 13, 1))) << 8) | (int (ord (substr ($hash_buf, 14, 1)))), 4); + $tmp_hash .= to64 ((int (ord (substr ($hash_buf, 15, 1))) << 16) | (int (ord (substr ($hash_buf, 16, 1))) << 8) | (int (ord (substr ($hash_buf, 17, 1)))), 4); + $tmp_hash .= to64 ((int (ord (substr ($hash_buf, 18, 1))) << 16) | (int (ord (substr ($hash_buf, 19, 1))) << 8) | (int (ord (substr ($hash_buf, 20, 1)))), 4); + $tmp_hash .= to64 ((int (ord (substr ($hash_buf, 21, 1))) << 16) | (int (ord (substr ($hash_buf, 22, 1))) << 8) | (int (ord (substr ($hash_buf, 23, 1)))), 4); + $tmp_hash .= to64 ((int (ord (substr ($hash_buf, 24, 1))) << 16) | (int (ord (substr ($hash_buf, 25, 1))) << 8) | (int (ord (substr ($hash_buf, 26, 1)))), 4); + $tmp_hash .= to64 ((int (ord (substr ($hash_buf, 27, 1))) << 16) | (int (ord (substr ($hash_buf, 28, 1))) << 8) | (int (ord (substr ($hash_buf, 29, 1)))), 4); + $tmp_hash .= to64 ((int (ord (substr ($hash_buf, 30, 1))) << 16) | (int (ord (substr ($hash_buf, 31, 1))) << 8) | (int (ord (substr ($hash_buf, 32, 1)))), 4); + $tmp_hash .= to64 ((int (ord (substr ($hash_buf, 33, 1))) << 16) | (int (ord (substr ($hash_buf, 34, 1))) << 8) | (int (ord (substr ($hash_buf, 35, 1)))), 4); + $tmp_hash .= to64 ((int (ord (substr ($hash_buf, 36, 1))) << 16) | (int (ord (substr ($hash_buf, 37, 1))) << 8) | (int (ord (substr ($hash_buf, 38, 1)))), 4); + $tmp_hash .= to64 ((int (ord (substr ($hash_buf, 39, 1))) << 16) | (int (ord (substr ($hash_buf, 40, 1))) << 8) | (int (ord (substr ($hash_buf, 41, 1)))), 4); + $tmp_hash .= to64 ((int (ord (substr ($hash_buf, 42, 1))) << 16) | (int (ord (substr ($hash_buf, 43, 1))) << 8) | (int (ord (substr ($hash_buf, 44, 1)))), 4); + $tmp_hash .= to64 ((int (ord (substr ($hash_buf, 45, 1))) << 16) | (int (ord (substr ($hash_buf, 46, 1))) << 8) | (int (ord (substr ($hash_buf, 47, 1)))), 4); + $tmp_hash .= to64 ((int (ord (substr ($hash_buf, 48, 1))) << 16) | (int (ord (substr ($hash_buf, 49, 1))) << 8) | (int (ord (substr ($hash_buf, 50, 1)))), 4); + $tmp_hash .= to64 ((int (ord (substr ($hash_buf, 51, 1))) << 16) | (int (ord (substr ($hash_buf, 52, 1))) << 8) | (int (ord (substr ($hash_buf, 53, 1)))), 4); + $tmp_hash .= to64 ((int (ord (substr ($hash_buf, 54, 1))) << 16) | (int (ord (substr ($hash_buf, 55, 1))) << 8) | (int (ord (substr ($hash_buf, 56, 1)))), 4); + $tmp_hash .= to64 ((int (ord (substr ($hash_buf, 57, 1))) << 16) | (int (ord (substr ($hash_buf, 58, 1))) << 8) | (int (ord (substr ($hash_buf, 59, 1)))), 4); + $tmp_hash .= to64 ((int (ord (substr ($hash_buf, 60, 1))) << 16) | (int (ord (substr ($hash_buf, 61, 1))) << 8) | (int (ord (substr ($hash_buf, 62, 1)))), 4); + $tmp_hash .= to64 ((int (ord (substr ($hash_buf, 63, 1))) << 16) , 2); + + return $tmp_hash; +} + +sub aix_ssha1_pbkdf2 +{ + my $word_buf = shift; + my $salt_buf = shift; + my $iterations = shift; + + my $hasher = Crypt::PBKDF2->hasher_from_algorithm ('HMACSHA1'); + + my $pbkdf2 = Crypt::PBKDF2->new ( + hasher => $hasher, + iterations => $iterations, + ); + + my $hash_buf = $pbkdf2->PBKDF2 ($salt_buf, $word_buf); + + my $tmp_hash = ""; + + $tmp_hash .= to64 ((int (ord (substr ($hash_buf, 0, 1))) << 16) | (int (ord (substr ($hash_buf, 1, 1))) << 8) | (int (ord (substr ($hash_buf, 2, 1)))), 4); + $tmp_hash .= to64 ((int (ord (substr ($hash_buf, 3, 1))) << 16) | (int (ord (substr ($hash_buf, 4, 1))) << 8) | (int (ord (substr ($hash_buf, 5, 1)))), 4); + $tmp_hash .= to64 ((int (ord (substr ($hash_buf, 6, 1))) << 16) | (int (ord (substr ($hash_buf, 7, 1))) << 8) | (int (ord (substr ($hash_buf, 8, 1)))), 4); + $tmp_hash .= to64 ((int (ord (substr ($hash_buf, 9, 1))) << 16) | (int (ord (substr ($hash_buf, 10, 1))) << 8) | (int (ord (substr ($hash_buf, 11, 1)))), 4); + $tmp_hash .= to64 ((int (ord (substr ($hash_buf, 12, 1))) << 16) | (int (ord (substr ($hash_buf, 13, 1))) << 8) | (int (ord (substr ($hash_buf, 14, 1)))), 4); + $tmp_hash .= to64 ((int (ord (substr ($hash_buf, 15, 1))) << 16) | (int (ord (substr ($hash_buf, 16, 1))) << 8) | (int (ord (substr ($hash_buf, 17, 1)))), 4); + $tmp_hash .= to64 ((int (ord (substr ($hash_buf, 18, 1))) << 16) | (int (ord (substr ($hash_buf, 19, 1))) << 8) , 3); + + return $tmp_hash; +} + +sub sapb_transcode +{ + my $data_s = shift; + + my @data = split "", $data_s; + + my $transTable_s = + "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff" . + "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff" . + "\x3f\x40\x41\x50\x43\x44\x45\x4b\x47\x48\x4d\x4e\x54\x51\x53\x46" . + "\x35\x36\x37\x38\x39\x3a\x3b\x3c\x3d\x3e\x56\x55\x5c\x49\x5d\x4a" . + "\x42\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f" . + "\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x58\x5b\x59\xff\x52" . + "\x4c\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f" . + "\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x57\x5e\x5a\x4f\xff" . + "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff" . + "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff" . + "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff" . + "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff" . + "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff" . + "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff" . + "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff" . + "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff"; + + my @transTable = unpack ("C256", $transTable_s); + + my @out; + + for (my $i = 0; $i < scalar @data; $i++) + { + $out[$i] = $transTable[int (ord ($data[$i]))]; + } + + return pack ("C*", @out); +} + +sub sapb_waldorf +{ + my $digest_s = shift; + + my $w_s = shift; + my $s_s = shift; + + my @w = unpack "C*", $w_s; + my @s = unpack "C*", $s_s; + + my $bcodeTable_s = + "\x14\x77\xf3\xd4\xbb\x71\x23\xd0\x03\xff\x47\x93\x55\xaa\x66\x91" . + "\xf2\x88\x6b\x99\xbf\xcb\x32\x1a\x19\xd9\xa7\x82\x22\x49\xa2\x51" . + "\xe2\xb7\x33\x71\x8b\x9f\x5d\x01\x44\x70\xae\x11\xef\x28\xf0\x0d"; + + my @bcodeTable = unpack ("C48", $bcodeTable_s); + + my @abcd = unpack ("C16", $digest_s); + + my $sum20 = ($abcd[0] & 3) + + ($abcd[1] & 3) + + ($abcd[2] & 3) + + ($abcd[3] & 3) + + ($abcd[5] & 3); + + $sum20 |= 0x20; + + my @out; + + for (my $i2 = 0; $i2 < $sum20; $i2++) + { + $out[$i2] = 0; + } + + for (my $i1 = 0, my $i2 = 0, my $i3 = 0; $i2 < $sum20; $i2++, $i2++) + { + if ($i1 < length $w_s) + { + if ($abcd[15 - $i1] & 1) + { + $out[$i2] = $bcodeTable[48 - 1 - $i1]; + + $i2++; + } + + $out[$i2] = $w[$i1]; + + $i1++; + $i2++; + } + + if ($i3 < length $s_s) + { + $out[$i2] = $s[$i3]; + + $i2++; + $i3++; + } + + $out[$i2] = $bcodeTable[$i2 - $i1 - $i3]; + } + + return substr (pack ("C*", @out), 0, $sum20); +} + +sub setup_des_key +{ + my @key_56 = split (//, shift); + + my $key = ""; + + $key = $key_56[0]; + + $key .= chr(((ord($key_56[0]) << 7) | (ord($key_56[1]) >> 1)) & 255); + $key .= chr(((ord($key_56[1]) << 6) | (ord($key_56[2]) >> 2)) & 255); + $key .= chr(((ord($key_56[2]) << 5) | (ord($key_56[3]) >> 3)) & 255); + $key .= chr(((ord($key_56[3]) << 4) | (ord($key_56[4]) >> 4)) & 255); + $key .= chr(((ord($key_56[4]) << 3) | (ord($key_56[5]) >> 5)) & 255); + $key .= chr(((ord($key_56[5]) << 2) | (ord($key_56[6]) >> 6)) & 255); + $key .= chr(( ord($key_56[6]) << 1) & 255); + + return $key; +} + +sub randbytes +{ + my $len = shift; + + my @arr; + + for (my $i = 0; $i < $len; $i++) + { + my $c = get_random_chr (0, 255); + + push (@arr, $c); + } + + return join ("", @arr); +} + +sub get_random_netntlmv1_salt +{ + my $len_user = shift; + my $len_domain = shift; + + my $char; + my $type; + my $user = ""; + + for (my $i = 0; $i < $len_user; $i++) + { + $type = get_random_num (1, 3); + + if ($type == 1) + { + $char = get_random_chr (0x30, 0x39); + } + elsif ($type == 2) + { + $char = get_random_chr (0x41, 0x5A); + } + else + { + $char = get_random_chr (0x61, 0x7A); + } + + $user .= $char; + } + + my $domain = ""; + + for (my $i = 0; $i < $len_domain; $i++) + { + $type = get_random_num (1, 3); + + if ($type == 1) + { + $char = get_random_chr (0x30, 0x39); + } + elsif ($type == 2) + { + $char = get_random_chr (0x41, 0x5A); + } + else + { + $char = get_random_chr (0x61, 0x7A); + } + + $domain .= $char; + } + + my $c_challenge = randbytes (8); + my $s_challenge = randbytes (8); + + my $salt_buf = $user . "::" . $domain . ":" . unpack ("H*", $c_challenge) . unpack ("H*", $s_challenge); + + return $salt_buf; +} + +sub get_random_netntlmv2_salt +{ + my $len_user = shift; + my $len_domain = shift; + + my $char; + my $type; + my $user = ""; + + if ($len_user + $len_domain > 27) + { + if ($len_user > $len_domain) + { + $len_user = 27 - $len_domain; + } + else + { + $len_domain = 27 - $len_user; + } + } + + for (my $i = 0; $i < $len_user; $i++) + { + $type = get_random_num (1, 3); + + if ($type == 1) + { + $char = get_random_chr (0x30, 0x39); + } + elsif ($type == 2) + { + $char = get_random_chr (0x41, 0x5A); + } + else + { + $char = get_random_chr (0x61, 0x7A); + } + + $user .= $char; + } + + my $domain = ""; + + for (my $i = 0; $i < $len_domain; $i++) + { + $type = get_random_num (1, 3); + + if ($type == 1) + { + $char = get_random_chr (0x30, 0x39); + } + elsif ($type == 2) + { + $char = get_random_chr (0x41, 0x5A); + } + else + { + $char = get_random_chr (0x61, 0x7A); + } + + $domain .= $char; + } + + my $c_challenge = randbytes (8); + my $s_challenge = randbytes (8); + + my $temp = "\x01\x01" . + "\x00" x 6 . + randbytes (8) . + $c_challenge . + "\x00" x 4 . + randbytes (20 * rand () + 1) . + "\x00"; + + my $salt_buf = $user . "::" . $domain . ":" . unpack ("H*", $s_challenge) . unpack ("H*", $temp); + + return $salt_buf; +} + +sub get_random_ike_salt +{ + my $nr_buf = ""; + + for (my $i = 0; $i < 40; $i++) + { + $nr_buf .= get_random_chr (0, 0xff); + } + + my $msg_buf = ""; + + for (my $i = 0; $i < 440; $i++) + { + $msg_buf .= get_random_chr (0, 0xff); + } + + my $nr_buf_hex = unpack ("H*", $nr_buf); + my $msg_buf_hex = unpack ("H*", $msg_buf); + + my $salt_buf = sprintf ("%s:%s:%s:%s:%s:%s:%s:%s", substr ($msg_buf_hex, 0, 256), substr ($msg_buf_hex, 256, 256), substr ($msg_buf_hex, 512, 16), substr ($msg_buf_hex, 528, 16), substr ($msg_buf_hex, 544, 320), substr ($msg_buf_hex, 864, 16), substr ($nr_buf_hex, 0, 40), substr ($nr_buf_hex, 40, 40)); + + return $salt_buf; +} + +sub get_random_agilekeychain_salt +{ + my $salt_buf = ""; + + for (my $i = 0; $i < 8; $i++) + { + $salt_buf .= get_random_chr (0x0, 0xff); + } + + my $iv = ""; + + for (my $i = 0; $i < 16; $i++) + { + $iv .= get_random_chr (0x0, 0xff); + } + + my $prefix = "\x00" x 1008; + + my $ret = unpack ("H*", $salt_buf . $prefix . $iv); + + return $ret; +} + +sub get_random_cloudkeychain_salt +{ + my $salt_buf = ""; + + for (my $i = 0; $i < 16; $i++) + { + $salt_buf .= get_random_chr (0x0, 0xff); + } + + for (my $i = 0; $i < 304; $i++) + { + $salt_buf .= get_random_chr (0x0, 0xff); + } + + my $ret = unpack ("H*", $salt_buf); + + return $ret; +} + +sub get_random_kerberos5_salt +{ + my $custom_salt = shift; + + my $clear_data = randbytes (14) . + strftime ("%Y%m%d%H%M%S", localtime) . + randbytes (8); + + my $user = "user"; + my $realm = "realm"; + my $salt = "salt"; + + my $salt_buf = $user . "\$" . $realm . "\$" . $salt . "\$" . unpack ("H*", $custom_salt) . "\$" . unpack ("H*", $clear_data) . "\$"; + + return $salt_buf; +} + +sub get_random_md5chap_salt +{ + my $salt_buf = shift; + + my $salt = unpack ("H*", $salt_buf); + + $salt .= ":"; + + $salt .= unpack ("H*", randbytes (1)); + + return $salt; +} + +sub get_random_dnssec_salt +{ + my $salt_buf = ""; + + $salt_buf .= "."; + + for (my $i = 0; $i < 8; $i++) + { + $salt_buf .= get_random_chr (0x61, 0x7a); + } + + $salt_buf .= ".net"; + + $salt_buf .= ":"; + + for (my $i = 0; $i < 8; $i++) + { + $salt_buf .= get_random_chr (0x30, 0x39); + } + + return $salt_buf; +} + +sub md5bit +{ + my $digest = shift; + my $bit = shift; + + $bit %= 128; + + my $byte_off = int ($bit / 8); + my $bit_off = int ($bit % 8); + + my $char = substr ($digest, $byte_off, 1); + my $num = ord ($char); + + return (($num & (1 << $bit_off)) ? 1 : 0); +} + +sub sun_md5 +{ + my $pw = shift; + my $salt = shift; + my $iter = shift; + + my $constant_phrase = + "To be, or not to be,--that is the question:--\n" . + "Whether 'tis nobler in the mind to suffer\n" . + "The slings and arrows of outrageous fortune\n" . + "Or to take arms against a sea of troubles,\n" . + "And by opposing end them?--To die,--to sleep,--\n" . + "No more; and by a sleep to say we end\n" . + "The heartache, and the thousand natural shocks\n" . + "That flesh is heir to,--'tis a consummation\n" . + "Devoutly to be wish'd. To die,--to sleep;--\n" . + "To sleep! perchance to dream:--ay, there's the rub;\n" . + "For in that sleep of death what dreams may come,\n" . + "When we have shuffled off this mortal coil,\n" . + "Must give us pause: there's the respect\n" . + "That makes calamity of so long life;\n" . + "For who would bear the whips and scorns of time,\n" . + "The oppressor's wrong, the proud man's contumely,\n" . + "The pangs of despis'd love, the law's delay,\n" . + "The insolence of office, and the spurns\n" . + "That patient merit of the unworthy takes,\n" . + "When he himself might his quietus make\n" . + "With a bare bodkin? who would these fardels bear,\n" . + "To grunt and sweat under a weary life,\n" . + "But that the dread of something after death,--\n" . + "The undiscover'd country, from whose bourn\n" . + "No traveller returns,--puzzles the will,\n" . + "And makes us rather bear those ills we have\n" . + "Than fly to others that we know not of?\n" . + "Thus conscience does make cowards of us all;\n" . + "And thus the native hue of resolution\n" . + "Is sicklied o'er with the pale cast of thought;\n" . + "And enterprises of great pith and moment,\n" . + "With this regard, their currents turn awry,\n" . + "And lose the name of action.--Soft you now!\n" . + "The fair Ophelia!--Nymph, in thy orisons\n" . + "Be all my sins remember'd.\n\x00"; + + my $constant_len = length ($constant_phrase); + + my $hash_buf = md5 ($pw . $salt); + + my $W; + + my $to_hash; + + for (my $round = 0; $round < $iter; $round++) + { + my $shift_a = md5bit ($hash_buf, $round + 0); + my $shift_b = md5bit ($hash_buf, $round + 64); + + my @shift_4; + my @shift_7; + + for (my $k = 0; $k < 16; $k++) + { + my $s7shift = ord (substr ($hash_buf, $k, 1)) % 8; + + my $l = ($k + 3) % 16; + + my $num = ord (substr ($hash_buf, $l, 1)); + + $shift_4[$k] = $num % 5; + + $shift_7[$k] = ($num >> $s7shift) & 1; + } + + my @indirect_4; + + for (my $k = 0; $k < 16; $k++) + { + $indirect_4[$k] = (ord (substr ($hash_buf, $k, 1)) >> $shift_4[$k]) & 0xf; + } + + my @indirect_7; + + for (my $k = 0; $k < 16; $k++) + { + $indirect_7[$k] = (ord (substr ($hash_buf, $indirect_4[$k], 1)) >> $shift_7[$k]) & 0x7f; + } + + my $indirect_a = 0; + my $indirect_b = 0; + + for (my $k = 0; $k < 8; $k++) + { + $indirect_a |= md5bit ($hash_buf, $indirect_7[$k + 0]) << $k; + + $indirect_b |= md5bit ($hash_buf, $indirect_7[$k + 8]) << $k; + } + + $indirect_a = ($indirect_a >> $shift_a) & 0x7f; + $indirect_b = ($indirect_b >> $shift_b) & 0x7f; + + my $bit_a = md5bit ($hash_buf, $indirect_a); + my $bit_b = md5bit ($hash_buf, $indirect_b); + + $W = $hash_buf; + + my $pos = 16; + + my $total = $pos; + + $to_hash = ""; + + if ($bit_a ^ $bit_b) + { + substr ($W, 16, 48) = substr ($constant_phrase, 0, 48); + + $total += 48; + + $to_hash .= substr ($W, 0, 64); + + my $constant_off; + + for ($constant_off = 48; $constant_off < $constant_len - 64; $constant_off += 64) + { + substr ($W, 0, 64) = substr ($constant_phrase, $constant_off, 64); + + $total += 64; + + $to_hash .= substr ($W, 0, 64); + } + + $pos = $constant_len - $constant_off; + + $total += $pos; + + substr ($W, 0, $pos) = substr ($constant_phrase, $constant_off, $pos); + } + + my $a_len = 0; + + my @a_buf; + $a_buf[0] = 0; + $a_buf[1] = 0; + $a_buf[2] = 0; + $a_buf[3] = 0; + + my $tmp = $round; + + do + { + my $round_div = int ($tmp / 10); + my $round_mod = int ($tmp % 10); + + $tmp = $round_div; + + $a_buf[int ($a_len / 4)] = (($round_mod + 0x30) | ($a_buf[int ($a_len / 4)] << 8)); + + $a_len++; + + } while ($tmp); + + my $tmp_str = ""; + + my $g; + + for ($g = 0; $g < $a_len; $g++) + { + my $remainder = $a_buf[$g]; + my $factor = 7; + my $started = 1; + + my $sub; + + while ($remainder > 0) + { + $sub = $remainder >> (8 * $factor); + + if ($started != 1 || $sub > 0) + { + $started = 0; + + $tmp_str = chr ($sub) . $tmp_str; + + $remainder -= ($sub << (8 * $factor)); + } + + $factor--; + } + + } + + substr ($W, $pos, $a_len) = $tmp_str; + + $pos += $a_len; + + $total += $a_len; + + $to_hash .= substr ($W, 0, $pos); + + $to_hash = substr ($to_hash, 0, $total); + + $hash_buf = md5 ($to_hash); + } + + my $passwd = ""; + + $passwd .= to64 ((int (ord (substr ($hash_buf, 0, 1))) << 16) | (int (ord (substr ($hash_buf, 6, 1))) << 8) | (int (ord (substr ($hash_buf, 12, 1)))), 4); + $passwd .= to64 ((int (ord (substr ($hash_buf, 1, 1))) << 16) | (int (ord (substr ($hash_buf, 7, 1))) << 8) | (int (ord (substr ($hash_buf, 13, 1)))), 4); + $passwd .= to64 ((int (ord (substr ($hash_buf, 2, 1))) << 16) | (int (ord (substr ($hash_buf, 8, 1))) << 8) | (int (ord (substr ($hash_buf, 14, 1)))), 4); + $passwd .= to64 ((int (ord (substr ($hash_buf, 3, 1))) << 16) | (int (ord (substr ($hash_buf, 9, 1))) << 8) | (int (ord (substr ($hash_buf, 15, 1)))), 4); + $passwd .= to64 ((int (ord (substr ($hash_buf, 4, 1))) << 16) | (int (ord (substr ($hash_buf, 10, 1))) << 8) | (int (ord (substr ($hash_buf, 5, 1)))), 4); + $passwd .= to64 ((int (ord (substr ($hash_buf, 11, 1)))), 2); + + return $passwd; +} + +sub usage_die +{ + die ("usage: $0 single|passthrough| [mode] [len]\n" . + " or\n" . + " $0 verify [mode] [hashfile] [cracks] [outfile]\n"); +} + +sub pad16 +{ + my $block_ref = shift; + + my $offset = shift; + + my $value = 16 - $offset; + + for (my $i = $offset; $i < 16; $i++) + { + push @{$block_ref}, $value; + } +} + +sub lotus_mix +{ + my $in_ref = shift; + + my $p = 0; + + for (my $i = 0; $i < 18; $i++) + { + for (my $j = 0; $j < 48; $j++) + { + $p = ($p + 48 - $j) & 0xff; + + my $c = $lotus_magic_table[$p]; + + $p = $in_ref->[$j] ^ $c; + + $in_ref->[$j] = $p; + } + } +} + +sub lotus_transform_password +{ + my $in_ref = shift; + my $out_ref = shift; + + my $t = $out_ref->[15]; + + for (my $i = 0; $i < 16; $i++) + { + $t ^= $in_ref->[$i]; + + my $c = $lotus_magic_table[$t]; + + $out_ref->[$i] ^= $c; + + $t = $out_ref->[$i]; + } +} + +sub mdtransform_norecalc +{ + my $state_ref = shift; + my $block_ref = shift; + + my @x; + + push (@x, @{$state_ref}); + push (@x, @{$block_ref}); + + for (my $i = 0; $i < 16; $i++) + { + push (@x, $x[0 + $i] ^ $x[16 + $i]); + } + + lotus_mix (\@x); + + for (my $i = 0; $i < 16; $i++) + { + $state_ref->[$i] = $x[$i]; + } +} + +sub mdtransform +{ + my $state_ref = shift; + my $checksum_ref = shift; + my $block_ref = shift; + + mdtransform_norecalc ($state_ref, $block_ref); + + lotus_transform_password ($block_ref, $checksum_ref); +} + +sub domino_big_md +{ + my $saved_key_ref = shift; + + my $size = shift; + + @{$saved_key_ref} = splice (@{$saved_key_ref}, 0, $size); + + my @state = (0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0); + + my @checksum; + + my $curpos; + + for ($curpos = 0; $curpos + 16 < $size; $curpos += 16) + { + my $curpos16 = $curpos + 16; + + my @block = splice (@{$saved_key_ref}, 0, 16); + + mdtransform (\@state, \@checksum, \@block); + } + + my $left = $size - $curpos; + + my @block = splice (@{$saved_key_ref}, 0, 16); + + pad16 (\@block, $left); + + mdtransform (\@state, \@checksum, \@block); + + mdtransform_norecalc (\@state, \@checksum); + + return @state; +} + +sub pdf_compute_encryption_key +{ + my $word_buf = shift; + my $padding = shift; + my $id = shift; + my $u = shift; + my $o = shift; + my $P = shift; + my $V = shift; + my $R = shift; + my $enc = shift; + + ## start + + my $data; + + $data .= $word_buf; + + $data .= substr ($padding, 0, 32 - length $word_buf); + + $data .= pack ("H*", $o); + + $data .= pack ("I", $P); + + $data .= pack ("H*", $id); + + if ($R >= 4) + { + if (!$enc) + { + $data .= pack ("I", -1); + } + } + + my $res = md5 ($data); + + if ($R >= 3) + { + for (my $i = 0; $i < 50; $i++) + { + $res = md5 ($res); + } + } + + return $res; +} + +sub gen_random_wpa_eapol +{ + my $keyver = shift; + my $snonce = shift; + + my $ret = ""; + + # version + + my $version = 1; # 802.1X-2001 + + $ret .= pack ("C*", $version); + + my $type = 3; # means that this EAPOL frame is used to transfer key information + + $ret .= pack ("C*", $type); + + my $length; # length of remaining data + + if ($keyver == 1) + { + $length = 119; + } + else + { + $length = 117; + } + + $ret .= pack ("n*", $length); + + my $descriptor_type; + + if ($keyver == 1) + { + $descriptor_type = 254; # EAPOL WPA key + } + else + { + $descriptor_type = 1; # EAPOL RSN key + } + + $ret .= pack ("C*", $descriptor_type); + + # key_info is a bit vector: + # generated from these 13 bits: encrypted key data, request, error, secure, key mic, key ack, install, key index (2), key type, key descriptor (3) + + my $key_info = 0; + + $key_info |= 1 << 8; # set key MIC + $key_info |= 1 << 3; # set if it is a pairwise key + + if ($keyver == 1) + { + $key_info |= 1 << 0; # RC4 Cipher, HMAC-MD5 MIC + } + else + { + $key_info |= 1 << 1; # AES Cipher, HMAC-SHA1 MIC + } + + $ret .= pack ("n*", $key_info); + + my $key_length; + + if ($keyver == 1) + { + $key_length = 32; + } + else + { + $key_length = 0; + } + + $ret .= pack ("n*", $key_length); + + my $replay_counter = 1; + + $ret .= pack ("Q>*", $replay_counter); + + $ret .= $snonce; + + my $key_iv = "\x00" x 16; + + $ret .= $key_iv; + + my $key_rsc = "\x00" x 8; + + $ret .= $key_rsc; + + my $key_id = "\x00" x 8; + + $ret .= $key_id; + + my $key_mic = "\x00" x 16; + + $ret .= $key_mic; + + my $key_data_len; + + if ($keyver == 1) + { + $key_data_len = 24; # length of the key_data (== WPA info) + } + else + { + $key_data_len = 22; # length of the key_data (== RSN info) + } + + $ret .= pack ("n*", $key_data_len); + + my $key_data = ""; + + if ($keyver == 1) + { + # wpa info + + my $wpa_info = ""; + + my $vendor_specific_data = ""; + + my $tag_number = 221; # means it is a vendor specific tag + + $vendor_specific_data .= pack ("C*", $tag_number); + + my $tag_len = 22; # length of the remaining "tag data" + + $vendor_specific_data .= pack ("C*", $tag_len); + + my $vendor_specific_oui = pack ("H*", "0050f2"); # microsoft + + $vendor_specific_data .= $vendor_specific_oui; + + my $vendor_specific_oui_type = 1; # WPA Information Element + + $vendor_specific_data .= pack ("C*", $vendor_specific_oui_type); + + my $vendor_specific_wpa_version = 1; + + $vendor_specific_data .= pack ("v*", $vendor_specific_wpa_version); + + # multicast + + my $vendor_specific_multicast_oui = pack ("H*", "0050f2"); + + $vendor_specific_data .= $vendor_specific_multicast_oui; + + my $vendor_specific_multicast_type = 2; # TKIP + + $vendor_specific_data .= pack ("C*", $vendor_specific_multicast_type); + + # unicast + + my $vendor_specific_unicast_count = 1; + + $vendor_specific_data .= pack ("v*", $vendor_specific_unicast_count); + + my $vendor_specific_unicast_oui = pack ("H*", "0050f2"); + + $vendor_specific_data .= $vendor_specific_multicast_oui; + + my $vendor_specific_unicast_type = 2; # TKIP + + $vendor_specific_data .= pack ("C*", $vendor_specific_unicast_type); + + # Auth Key Management (AKM) + + my $auth_key_management_count = 1; + + $vendor_specific_data .= pack ("v*", $auth_key_management_count); + + my $auth_key_management_oui = pack ("H*", "0050f2"); + + $vendor_specific_data .= $auth_key_management_oui; + + my $auth_key_management_type = 2; # Pre-Shared Key (PSK) + + $vendor_specific_data .= pack ("C*", $auth_key_management_type); + + $wpa_info = $vendor_specific_data; + + $key_data = $wpa_info; + } + else + { + # rsn info + + my $rsn_info = ""; + + my $tag_number = 48; # RSN info + + $rsn_info .= pack ("C*", $tag_number); + + my $tag_len = 20; # length of the remaining "tag_data" + + $rsn_info .= pack ("C*", $tag_len); + + my $rsn_version = 1; + + $rsn_info .= pack ("v*", $rsn_version); + + # group cipher suite + + my $group_cipher_suite_oui = pack ("H*", "000fac"); # Ieee8021 + + $rsn_info .= $group_cipher_suite_oui; + + my $group_cipher_suite_type = 4; # AES (CCM) + + $rsn_info .= pack ("C*", $group_cipher_suite_type); + + # pairwise cipher suite + + my $pairwise_cipher_suite_count = 1; + + $rsn_info .= pack ("v*", $pairwise_cipher_suite_count); + + my $pairwise_cipher_suite_oui = pack ("H*", "000fac"); # Ieee8021 + + $rsn_info .= $pairwise_cipher_suite_oui; + + my $pairwise_cipher_suite_type = 4; # AES (CCM) + + $rsn_info .= pack ("C*", $pairwise_cipher_suite_type); + + # Auth Key Management (AKM) + + my $auth_key_management_count = 1; + + $rsn_info .= pack ("v*", $auth_key_management_count); + + my $auth_key_management_oui = pack ("H*", "000fac"); # Ieee8021 + + $rsn_info .= $auth_key_management_oui; + + my $auth_key_management_type = 2; # Pre-Shared Key (PSK) + + $rsn_info .= pack ("C*", $auth_key_management_type); + + # RSN Capabilities + + # bit vector of these 9 bits: peerkey enabled, management frame protection (MFP) capable, MFP required, + # RSN GTKSA Capabilities (2), RSN PTKSA Capabilities (2), no pairwise Capabilities, Pre-Auth Capabilities + + my $rsn_capabilities = pack ("H*", "0000"); + + $rsn_info .= $rsn_capabilities; + + $key_data = $rsn_info; + } + + $ret .= $key_data; + + return $ret; +} + +sub wpa_prf_512 +{ + my $pmk = shift; + my $stmac = shift; + my $bssid = shift; + my $snonce = shift; + my $anonce = shift; + + my $data = "Pairwise key expansion"; + + $data .= "\x00"; + + # + # Min(AA, SPA) || Max(AA, SPA) + # + + # compare if greater: Min()/Max() on the MACs (6 bytes) + + if (memcmp ($stmac, $bssid, 6) < 0) + { + $data .= $stmac; + $data .= $bssid; + } + else + { + $data .= $bssid; + $data .= $stmac; + } + + # + # Min(ANonce,SNonce) || Max(ANonce,SNonce) + # + + # compare if greater: Min()/Max() on the nonces (32 bytes) + + if (memcmp ($snonce, $anonce, 32) < 0) + { + $data .= $snonce; + $data .= $anonce; + } + else + { + $data .= $anonce; + $data .= $snonce; + } + + $data .= "\x00"; + + my $prf_buf = hmac ($data, $pmk, \&sha1); + + $prf_buf = substr ($prf_buf, 0, 16); + + return $prf_buf; +} + +sub memcmp +{ + my $str1 = shift; + my $str2 = shift; + my $len = shift; + + my $len_str1 = length ($str1); + my $len_str2 = length ($str2); + + if (($len > $len_str1) || ($len > $len_str2)) + { + print "ERROR: memcmp () lengths wrong"; + + exit (1); + } + + for (my $i = 0; $i < $len; $i++) + { + my $c_1 = ord (substr ($str1, $i, 1)); + my $c_2 = ord (substr ($str2, $i, 1)); + + return -1 if ($c_1 < $c_2); + return 1 if ($c_1 > $c_2); + } + + return 0; +} diff --git a/tools/test.sh b/tools/test.sh new file mode 100755 index 0000000000..3a2d4c686e --- /dev/null +++ b/tools/test.sh @@ -0,0 +1,1869 @@ +#!/bin/bash + +## +## Authors.....: Gabriele Gristina / Jens Steube +## License.....: MIT +## + +# missing hash types: 5200,6211,6221,6231,6241,6251,6261,6271,6281 + +HASH_TYPES="0 10 11 12 20 21 22 23 30 40 50 60 100 101 110 111 112 120 121 122 130 131 132 140 141 150 160 190 200 300 400 500 900 1000 1100 1400 1410 1420 1430 1440 1441 1450 1460 1500 1600 1700 1710 1711 1720 1722 1730 1731 1740 1750 1760 1800 2100 2400 2410 2500 2600 2611 2612 2711 2811 3000 3100 3200 3710 3711 3800 4300 4400 4500 4700 4800 4900 5000 5100 5300 5400 5500 5600 5700 5800 6000 6100 6300 6400 6500 6600 6700 6800 6900 7100 7200 7300 7400 7500 7600 7700 7800 7900 8000 8100 8200 8300 8400 8500 8600 8700 8900 9100 9200 9300 9400 9500 9600 9700 9800 9900 10000 10100 10200 10300 10400 10500 10600 10700 10800 10900 11000 11100 11200 11300 11400 11500 11600 11900 12000 12100 12200 12300 12400 12600 12800" + +ATTACK_MODES="0 1 3 6 7" + +MATCH_PASS_ONLY="2500 5300 5400 6600 6800 8200" + +HASHFILE_ONLY="2500" + +NEVER_CRACK="11600" + +SLOW_ALGOS="400 500 501 1600 1800 2100 2500 3200 5200 5800 6211 6221 6231 6241 6251 6261 6271 6281 6300 6400 6500 6600 6700 6800 7100 7200 7400 7900 8200 8800 8900 9000 9100 9200 9300 9400 9500 9600 10000 10300 10500 10700 10900 11300 11600 11900 12000 12100 12200 12300 12400 12500 12800" + +OPTS="--quiet --force --potfile-disable --runtime 200 --gpu-temp-disable -d 1 --weak-hash-threshold=0" + +OUTD="test_$(date +%s)" + +PACKAGE_CMD="7z a" +PACKAGE_FOLDER="" + +mask_3[0]="" +mask_3[1]="?d" +mask_3[2]="?d?d" +mask_3[3]="?d?d?d" +mask_3[4]="?d?d?d?d" +mask_3[5]="?d?d?d?d?d" +mask_3[6]="?d?d?d?d?d?d" +mask_3[7]="?d?d?d?d?d?d?d" +mask_3[8]="?d?d?d?d?d?d?d?d" +mask_3[9]="?d?d?d?d?d?d?d?d?d" +mask_3[10]="?d?d?d?d?d?d?d?d?d?d" +mask_3[11]="?d?d?d?d?d?d?d?d?d?d?d" +mask_3[12]="?d?d?d?d?d?d?d?d?d?d?d?d" +mask_3[13]="?d?d?d?d?d?d?d?d?d?d?d?d?d" +mask_3[14]="?d?d?d?d?d?d?d?d?d?d?d?d?d?d" +mask_3[15]="?d?d?d?d?d?d?d?d?d?d?d?d?d?d?d" +mask_3[16]="?d?d?d?d?d?d?d?d?d?d?d?d?d?d?d0" +mask_3[17]="?d?d?d?d?d?d?d?d?d?d?d?d?d?d?d00" +mask_3[18]="?d?d?d?d?d?d?d?d?d?d?d?d?d?d?d000" +mask_3[19]="?d?d?d?d?d?d?d?d?d?d?d?d?d?d?d0000" +mask_3[20]="?d?d?d?d?d?d?d?d?d?d?d?d?d?d?d00000" +mask_3[21]="?d?d?d?d?d?d?d?d?d?d?d?d?d?d?d000000" +mask_3[22]="?d?d?d?d?d?d?d?d?d?d?d?d?d?d?d0000000" +mask_3[23]="?d?d?d?d?d?d?d?d?d?d?d?d?d?d?d00000000" +mask_3[24]="?d?d?d?d?d?d?d?d?d?d?d?d?d?d?d000000000" +mask_3[25]="?d?d?d?d?d?d?d?d?d?d?d?d?d?d?d0000000000" +mask_3[26]="?d?d?d?d?d?d?d?d?d?d?d?d?d?d?d00000000000" +mask_3[27]="?d?d?d?d?d?d?d?d?d?d?d?d?d?d?d000000000000" +mask_3[28]="?d?d?d?d?d?d?d?d?d?d?d?d?d?d?d0000000000000" +mask_3[29]="?d?d?d?d?d?d?d?d?d?d?d?d?d?d?d00000000000000" +mask_3[30]="?d?d?d?d?d?d?d?d?d?d?d?d?d?d?d000000000000000" +mask_3[31]="?d?d?d?d?d?d?d?d?d?d?d?d?d?d?d0000000000000000" + +mask_6[0]="" +mask_6[1]="" +mask_6[2]="?d" +mask_6[3]="?d?d" +mask_6[4]="?d?d" +mask_6[5]="?d?d?d" +mask_6[6]="?d?d?d" +mask_6[7]="?d?d?d?d" +mask_6[8]="?d?d?d?d" +mask_6[9]="?d?d?d?d?d" +mask_6[10]="?d?d?d?d?d" +mask_6[11]="?d?d?d?d?d?d" +mask_6[12]="?d?d?d?d?d?d" +mask_6[13]="?d?d?d?d?d?d?d" +mask_6[14]="?d?d?d?d?d?d?d" +mask_6[15]="?d?d?d?d?d?d?d?d" +mask_6[16]="?d?d?d?d?d?d?d?d" +mask_6[17]="?d?d?d?d?d?d?d?d0" +mask_6[18]="?d?d?d?d?d?d?d?d0" +mask_6[19]="?d?d?d?d?d?d?d?d00" +mask_6[20]="?d?d?d?d?d?d?d?d00" +mask_6[21]="?d?d?d?d?d?d?d?d000" +mask_6[22]="?d?d?d?d?d?d?d?d000" +mask_6[23]="?d?d?d?d?d?d?d?d0000" +mask_6[24]="?d?d?d?d?d?d?d?d0000" +mask_6[25]="?d?d?d?d?d?d?d?d00000" +mask_6[26]="?d?d?d?d?d?d?d?d00000" +mask_6[27]="?d?d?d?d?d?d?d?d000000" +mask_6[28]="?d?d?d?d?d?d?d?d000000" +mask_6[29]="?d?d?d?d?d?d?d?d0000000" +mask_6[30]="?d?d?d?d?d?d?d?d0000000" +mask_6[31]="?d?d?d?d?d?d?d?d00000000" + +mask_7[0]="" +mask_7[1]="" +mask_7[2]="?d" +mask_7[3]="?d" +mask_7[4]="?d?d" +mask_7[5]="?d?d" +mask_7[6]="?d?d?d" +mask_7[7]="?d?d?d" +mask_7[8]="?d?d?d?d" +mask_7[9]="?d?d?d?d" +mask_7[10]="?d?d?d?d?d" +mask_7[11]="?d?d?d?d?d" +mask_7[12]="?d?d?d?d?d?d" +mask_7[13]="?d?d?d?d?d?d" +mask_7[14]="?d?d?d?d?d?d?d" +mask_7[15]="?d?d?d?d?d?d?d" +mask_7[16]="?d?d?d?d?d?d?d?d" +mask_7[17]="?d?d?d?d?d?d?d?d" +mask_7[18]="?d?d?d?d?d?d?d?d0" +mask_7[19]="?d?d?d?d?d?d?d?d0" +mask_7[20]="?d?d?d?d?d?d?d?d00" +mask_7[21]="?d?d?d?d?d?d?d?d00" +mask_7[22]="?d?d?d?d?d?d?d?d000" +mask_7[23]="?d?d?d?d?d?d?d?d000" +mask_7[24]="?d?d?d?d?d?d?d?d0000" +mask_7[25]="?d?d?d?d?d?d?d?d0000" +mask_7[26]="?d?d?d?d?d?d?d?d00000" +mask_7[27]="?d?d?d?d?d?d?d?d00000" +mask_7[28]="?d?d?d?d?d?d?d?d000000" +mask_7[29]="?d?d?d?d?d?d?d?d000000" +mask_7[30]="?d?d?d?d?d?d?d?d0000000" +mask_7[31]="?d?d?d?d?d?d?d?d0000000" + +contains () +{ + for element in "${@:2}"; do + + if [ "${element}" == "${1}" ]; then + return 1 + fi + + done + + return 0 +} + +function init() +{ + if [ "${PACKAGE}" -eq 1 ]; then + + echo "[ ${OUTD} ] > Generate tests for hash type $hash_type." + + else + + echo "[ ${OUTD} ] > Init test for hash type $hash_type." + + fi + + rm -rf ${OUTD}/${hash_type}.sh ${OUTD}/${hash_type}_passwords.txt ${OUTD}/${hash_type}_hashes.txt + + # create list of password and hashes of same type + grep " ${hash_type} '" ${OUTD}/all.sh > ${OUTD}/${hash_type}.sh + + # create separate list of password and hashes + cat ${OUTD}/${hash_type}.sh | awk '{print $3}' > ${OUTD}/${hash_type}_passwords.txt + cat ${OUTD}/${hash_type}.sh | awk '{print $11}' | cut -d"'" -f2 > ${OUTD}/${hash_type}_hashes.txt + + if [ "${hash_type}" -eq 10300 ]; then + cat ${OUTD}/${hash_type}.sh | cut -d' ' -f11- | cut -d"'" -f2 > ${OUTD}/${hash_type}_hashes.txt + fi + + # truncate dicts + rm -rf ${OUTD}/${hash_type}_dict1 ${OUTD}/${hash_type}_dict2 + touch ${OUTD}/${hash_type}_dict1 ${OUTD}/${hash_type}_dict2 + + # foreach password entry split password in 2 (skip first entry, is len 1) + i=1 + + # minimum password length + + min_len=0 + + if [ "${hash_type}" -eq 2500 ]; then + + min_len=7 # means length 8, since we start with 0 + + fi + + while read -u 9 pass; do + + if [ ${i} -gt 1 ]; then + + # split password, 'i' is the len + p0=$((i / 2)) + p1=$((p0 + 1)) + + # special case (passwords longer than expected) + pass_len=${#pass} + + if [ "${pass_len}" -gt 1 ] + then + + p1=$((p1 + ${min_len})) + p0=$((p0 + ${min_len})) + + if [ "${p1}" -gt ${pass_len} ]; then + + p1=${pass_len} + p0=$((p1 - 1)) + + fi + + # add splitted password to dicts + + echo ${pass} | cut -c -${p0} >> ${OUTD}/${hash_type}_dict1 + echo ${pass} | cut -c ${p1}- >> ${OUTD}/${hash_type}_dict2 + + fi + fi + + ((i++)) + + done 9< ${OUTD}/${hash_type}_passwords.txt + + min_len=0 + + if [ "${hash_type}" -eq 2500 ]; then + + min_len=7 # means length 8, since we start with 0 + + fi + + # generate multiple pass/hash foreach len (2 to 8) + if [ ${MODE} -ge 1 ]; then + + for ((i = 2; i < 9; i++)); do + + rm -rf ${OUTD}/${hash_type}_multi_${i}.txt ${OUTD}/${hash_type}_passwords_multi_${i}.txt ${OUTD}/${hash_type}_hashes_multi_${i}.txt + rm -rf ${OUTD}/${hash_type}_dict1_multi_${i} ${OUTD}/${hash_type}_dict2_multi_${i} + touch ${OUTD}/${hash_type}_dict1_multi_${i} ${OUTD}/${hash_type}_dict2_multi_${i} + + perl tools/test.pl single ${hash_type} ${i} > ${OUTD}/${hash_type}_multi_${i}.txt + + cat ${OUTD}/${hash_type}_multi_${i}.txt | awk '{print $3}' > ${OUTD}/${hash_type}_passwords_multi_${i}.txt + cat ${OUTD}/${hash_type}_multi_${i}.txt | awk '{print $11}' | cut -d"'" -f2 > ${OUTD}/${hash_type}_hashes_multi_${i}.txt + + if [ "${hash_type}" -eq 10300 ]; then + cat ${OUTD}/${hash_type}_multi_${i}.txt | cut -d' ' -f11- | cut -d"'" -f2 > ${OUTD}/${hash_type}_hashes_multi_${i}.txt + fi + + # split password, 'i' is the len + p0=$((i / 2)) + p1=$((p0 + 1)) + + p0=$((p0 + ${min_len})) + p1=$((p1 + ${min_len})) + + while read -u 9 pass; do + + # add splitted password to dicts + echo ${pass} | cut -c -${p0} >> ${OUTD}/${hash_type}_dict1_multi_${i} + echo ${pass} | cut -c ${p1}- >> ${OUTD}/${hash_type}_dict2_multi_${i} + + done 9< ${OUTD}/${hash_type}_passwords_multi_${i}.txt + + done + + fi +} + +function status() +{ + RET=$1 + + ((cnt++)) + + if [ ${RET} -ne 0 ]; then + case ${RET} in + 1) + if contains ${hash_type} ${NEVER_CRACK_ALGOS}; then + + echo "password not found, cmdline : ${CMD}" &>> ${OUTD}/logfull.txt + ((e_nf++)) + + fi + + ;; + 2) + echo "timeout reached, cmdline : ${CMD}" &>> ${OUTD}/logfull.txt + ((e_to++)) + + ;; + 10) + if [ "${pass_only}" -eq 1 ]; then + echo "plains not found in output, cmdline : ${CMD}" &>> ${OUTD}/logfull.txt + else + echo "hash:plains not matched in output, cmdline : ${CMD}" &>> ${OUTD}/logfull.txt + fi + ((e_nm++)) + + ;; + *) + echo "! unhandled return code ${RET}, cmdline : ${CMD}" $>> ${OUTD}/logfull.txt + echo "! unhandled return code, see ${OUTD}/logfull.txt for details." + ((e_nf++)) + ;; + esac + fi +} + +function attack_0() +{ + file_only=0 + + if ! contains ${hash_type} ${FILE_BASED_ALGOS}; then + + file_only=1 + + fi + + # single hash + if [ ${MODE} -ne 1 ]; then + + e_to=0 + e_nf=0 + e_nm=0 + cnt=0 + + echo "> Testing hash type $hash_type with attack mode 0, markov ${MARKOV}, single hash." &>> ${OUTD}/logfull.txt + + max=32 + + if ! contains ${hash_type} ${TIMEOUT_ALGOS}; then + + max=12 + + fi + + i=0 + + while read -u 9 line; do + + if [ "${i}" -ge ${max} ]; then + + break + + fi + + hash="$(echo "$line" | cut -d\' -f2)" + pass="$(echo "$line" | cut -d' ' -f3)" + + if [ -z "${hash}" ]; then + + break + + fi + + if [ "${file_only}" -eq 1 ]; then + + temp_file="${OUTD}/${hash_type}_filebased_only_temp.txt" + echo ${hash} | base64 -d > ${temp_file} + hash="${temp_file}" + + fi + + CMD="echo -n "${pass}" | ./${BIN} ${OPTS} -a 0 -m ${hash_type} '${hash}'" + + echo -n "[ len $((i + 1)) ] " &>> ${OUTD}/logfull.txt + + output=$(echo -n "${pass}" | ./${BIN} ${OPTS} -a 0 -m ${hash_type} "${hash}" 2>&1) + + ret=${?} + + echo "${output}" >> ${OUTD}/logfull.txt + + if [ "${ret}" -eq 0 ]; then + + if [ ${pass_only} -eq 1 ]; then + search=":${pass}" + else + search="${hash}:${pass}" + fi + + echo "${output}" | grep -F "${search}" &> /dev/null + + if [ "${?}" -ne 0 ]; then + + ret=10 + + fi + + fi + + status ${ret} + + i=$((i + 1)) + + done 9< ${OUTD}/${hash_type}.sh + + msg="OK" + + if [ "${e_nf}" -ne 0 -o "${e_nm}" -ne 0 ]; then + + msg="Error" + + elif [ "${e_to}" -ne 0 ]; then + + msg="Warning" + + fi + + echo "[ ${OUTD} ] [ Type ${hash_type}, Attack 0, Mode single ] > $msg : ${e_nf}/${cnt} not found, ${e_nm}/${cnt} not matched, ${e_to}/${cnt} timeout" + + fi + + # multihash + if [ ${MODE} -ne 0 ]; then + + e_to=0 + e_nf=0 + e_nm=0 + cnt=0 + + echo "> Testing hash type $hash_type with attack mode 0, markov ${MARKOV}, multi hash." &>> ${OUTD}/logfull.txt + + hash_file=${OUTD}/${hash_type}_hashes.txt + + # if file_only -> decode all base64 "hashes" and put them in the temporary file + + if [ "${file_only}" -eq 1 ]; then + + temp_file="${OUTD}/${hash_type}_filebased_only_temp.txt" + rm -f ${temp_file} + + hash_file=${temp_file} + + while read base64_hash; do + + echo -n ${base64_hash} | base64 -d >> ${temp_file} + + done < ${OUTD}/${hash_type}_hashes.txt + + fi + + CMD="cat ${OUTD}/${hash_type}_passwords.txt | ./${BIN} ${OPTS} -a 0 -m ${hash_type} ${hash_file}" + + output=$(cat ${OUTD}/${hash_type}_passwords.txt | ./${BIN} ${OPTS} -a 0 -m ${hash_type} ${hash_file} 2>&1) + + ret=${?} + + echo "${output}" >> ${OUTD}/logfull.txt + + if [ "${ret}" -eq 0 ]; then + + i=1 + + while read -u 9 hash; do + + pass=$(sed -n ${i}p ${OUTD}/${hash_type}_passwords.txt) + + if [ ${pass_only} -eq 1 ]; then + search=":${pass}" + else + search="${hash}:${pass}" + fi + + echo "${output}" | grep -F "${search}" &> /dev/null + + if [ "${?}" -ne 0 ]; then + + ret=10 + + break + + fi + + i=$((i + 1)) + + done 9< ${OUTD}/${hash_type}_hashes.txt + + fi + + status ${ret} + + msg="OK" + + if [ "${e_nf}" -ne 0 -o "${e_nm}" -ne 0 ]; then + + msg="Error" + + elif [ "${e_to}" -ne 0 ]; then + + msg="Warning" + + fi + + echo "[ ${OUTD} ] [ Type ${hash_type}, Attack 0, Mode multi ] > $msg : ${e_nf}/${cnt} not found, ${e_nm}/${cnt} not matched, ${e_to}/${cnt} timeout" + + fi +} + +function attack_1() +{ + file_only=0 + + if ! contains ${hash_type} ${FILE_BASED_ALGOS}; then + + file_only=1 + + fi + + # single hash + if [ ${MODE} -ne 1 ]; then + + e_to=0 + e_nf=0 + e_nm=0 + cnt=0 + + echo "> Testing hash type $hash_type with attack mode 1, markov ${MARKOV}, single hash." &>> ${OUTD}/logfull.txt + i=1 + while read -u 9 hash; do + + if [ $i -gt 1 ]; then + + if [ "${file_only}" -eq 1 ]; then + + temp_file="${OUTD}/${hash_type}_filebased_only_temp.txt" + echo ${hash} | base64 -d > ${temp_file} + hash="${temp_file}" + + fi + + CMD="./${BIN} ${OPTS} -a 1 -m ${hash_type} '${hash}' ${OUTD}/${hash_type}_dict1 ${OUTD}/${hash_type}_dict2" + + echo -n "[ len $i ] " &>> ${OUTD}/logfull.txt + + output=$(./${BIN} ${OPTS} -a 1 -m ${hash_type} "${hash}" ${OUTD}/${hash_type}_dict1 ${OUTD}/${hash_type}_dict2 2>&1) + + ret=${?} + + echo "${output}" >> ${OUTD}/logfull.txt + + if [ "${ret}" -eq 0 ]; then + + line_nr=$((i - 1)) + + line_dict1=$(sed -n ${line_nr}p ${OUTD}/${hash_type}_dict1) + line_dict2=$(sed -n ${line_nr}p ${OUTD}/${hash_type}_dict2) + + if [ ${pass_only} -eq 1 ]; then + search=":${line_dict1}${line_dict2}" + else + search="${hash}:${line_dict1}${line_dict2}" + fi + + echo "${output}" | grep -F "${search}" &> /dev/null + + if [ "${?}" -ne 0 ]; then + + ret=10 + + fi + + fi + + status ${ret} + + fi + + ((i++)) + + done 9< ${OUTD}/${hash_type}_hashes.txt + + msg="OK" + + if [ "${e_nf}" -ne 0 -o "${e_nm}" -ne 0 ]; then + + msg="Error" + + elif [ "${e_to}" -ne 0 ]; then + + msg="Warning" + + fi + + echo "[ ${OUTD} ] [ Type ${hash_type}, Attack 1, Mode single ] > $msg : ${e_nf}/${cnt} not found, ${e_nm}/${cnt} not matched, ${e_to}/${cnt} timeout" + + fi + + # multihash + if [ ${MODE} -ne 0 ]; then + + e_to=0 + e_nf=0 + e_nm=0 + cnt=0 + + offset=14 + + if [ ${hash_type} -eq 2500 ]; then + offset=7 + elif [ ${hash_type} -eq 5800 ]; then + offset=6 + elif [ ${hash_type} -eq 3000 ]; then + offset=6 + elif [ ${hash_type} -eq 2100 ]; then + offset=11 + elif [ ${hash_type} -eq 1500 ]; then + offset=7 + elif [ ${hash_type} -eq 7700 ]; then + offset=7 + elif [ ${hash_type} -eq 8500 ]; then + offset=7 + fi + + hash_file=${OUTD}/${hash_type}_multihash_combi.txt + + tail -n ${offset} ${OUTD}/${hash_type}_hashes.txt > ${hash_file} + + # if file_only -> decode all base64 "hashes" and put them in the temporary file + + if [ "${file_only}" -eq 1 ]; then + + temp_file="${OUTD}/${hash_type}_filebased_only_temp.txt" + rm -f ${temp_file} + + hash_file=${temp_file} + + while read base64_hash; do + + echo -n ${base64_hash} | base64 -d >> ${temp_file} + + done < ${OUTD}/${hash_type}_multihash_combi.txt + + fi + + CMD="./${BIN} ${OPTS} -a 1 -m ${hash_type} ${hash_file} ${OUTD}/${hash_type}_dict1 ${OUTD}/${hash_type}_dict2" + + echo "> Testing hash type $hash_type with attack mode 1, markov ${MARKOV}, multi hash." &>> ${OUTD}/logfull.txt + + output=$(./${BIN} ${OPTS} -a 1 -m ${hash_type} ${hash_file} ${OUTD}/${hash_type}_dict1 ${OUTD}/${hash_type}_dict2 2>&1) + + ret=${?} + + echo "${output}" >> ${OUTD}/logfull.txt + + if [ "${ret}" -eq 0 ]; then + + i=0 + + while read -u 9 hash; do + + line_nr=$((offset - i)) + + line_dict1=$(tail -n ${line_nr} ${OUTD}/${hash_type}_dict1 | head -1) + line_dict2=$(tail -n ${line_nr} ${OUTD}/${hash_type}_dict2 | head -1) + + if [ ${pass_only} -eq 1 ]; then + search=":${line_dict1}${line_dict2}" + else + search="${hash}:${line_dict1}${line_dict2}" + fi + + echo "${output}" | grep -F "${search}" &> /dev/null + + if [ "${?}" -ne 0 ]; then + + ret=10 + + break + + fi + + i=$((i + 1)) + + done 9< ${OUTD}/${hash_type}_multihash_combi.txt + + fi + + status ${ret} + + msg="OK" + + if [ "${e_nf}" -ne 0 -o "${e_nm}" -ne 0 ]; then + + msg="Error" + + elif [ "${e_to}" -ne 0 ]; then + + msg="Warning" + + fi + + echo "[ ${OUTD} ] [ Type ${hash_type}, Attack 1, Mode multi ] > $msg : ${e_nf}/${cnt} not found, ${e_nm}/${cnt} not matched, ${e_to}/${cnt} timeout" + + fi +} + +function attack_3() +{ + file_only=0 + + if ! contains ${hash_type} ${FILE_BASED_ALGOS}; then + + file_only=1 + + fi + + # single hash + if [ ${MODE} -ne 1 ]; then + + e_to=0 + e_nf=0 + e_nm=0 + cnt=0 + + echo "> Testing hash type $hash_type with attack mode 3, markov ${MARKOV}, single hash." &>> ${OUTD}/logfull.txt + + max=8 + mask_offset=0 + + # some algos have a minimum password length + + if [ "${hash_type}" -eq 2500 ];then + + mask_offset=7 + max=7 + + fi + + i=1 + + while read -u 9 hash; do + + if [ "${i}" -gt 6 ]; then + + if ! contains ${hash_type} ${TIMEOUT_ALGOS}; then + + break; + + fi + + fi + + if [ "${file_only}" -eq 1 ]; then + + temp_file="${OUTD}/${hash_type}_filebased_only_temp.txt" + echo ${hash} | base64 -d > ${temp_file} + hash="${temp_file}" + + fi + + mask=${mask_3[$((i + ${mask_offset}))]} + + # modify "default" mask if needed (and set custom charset to reduce keyspace) + + if [ "${hash_type}" -eq 2500 ]; then + + pass=$(sed -n ${i}p ${OUTD}/${hash_type}_passwords.txt) + + mask=${pass} + + # replace the first x positions in the mask with ?d's + + # first: remove first i (== amount) chars + + mask=$(echo ${mask} | cut -b $((i + 1))-) + + # prepend the ?d's + + for i in $(seq 1 ${i}); do + + mask="?d${mask}" + + done + + fi + + CMD="./${BIN} ${OPTS} -a 3 -m ${hash_type} '${hash}' ${mask}" + + echo -n "[ len $i ] " &>> ${OUTD}/logfull.txt + + output=$(./${BIN} ${OPTS} -a 3 -m ${hash_type} "${hash}" ${mask} 2>&1) + + ret=${?} + + echo "${output}" >> ${OUTD}/logfull.txt + + if [ "${ret}" -eq 0 ]; then + + line_dict=$(sed -n ${i}p ${OUTD}/${hash_type}_passwords.txt) + + if [ ${pass_only} -eq 1 ]; then + search=":${line_dict}" + else + search="${hash}:${line_dict}" + fi + + echo "${output}" | grep -F "${search}" &> /dev/null + + if [ "${?}" -ne 0 ]; then + + ret=10 + + fi + + fi + + status ${ret} + + if [ $i -eq ${max} ]; then break; fi + + ((i++)) + + done 9< ${OUTD}/${hash_type}_hashes.txt + + msg="OK" + + if [ "${e_nf}" -ne 0 -o "${e_nm}" -ne 0 ]; then + + msg="Error" + + elif [ "${e_to}" -ne 0 ]; then + + msg="Warning" + + fi + + echo "[ ${OUTD} ] [ Type ${hash_type}, Attack 3, Mode single ] > $msg : ${e_nf}/${cnt} not found, ${e_nm}/${cnt} not matched, ${e_to}/${cnt} timeout" + + fi + + # multihash + if [ ${MODE} -ne 0 ]; then + + e_to=0 + e_nf=0 + e_nm=0 + cnt=0 + + increment_max=8 + + if ! contains ${hash_type} ${TIMEOUT_ALGOS}; then + + increment_max=5 + + fi + + increment_min=1 + + if [ "${hash_type}" -eq 2500 ]; then + + increment_min=8 + increment_max=9 + + fi + + hash_file=${OUTD}/${hash_type}_multihash_bruteforce.txt + + head -n $((increment_max - ${increment_min} + 1)) ${OUTD}/${hash_type}_hashes.txt > ${hash_file} + + # if file_only -> decode all base64 "hashes" and put them in the temporary file + + if [ "${file_only}" -eq 1 ]; then + + temp_file="${OUTD}/${hash_type}_filebased_only_temp.txt" + rm -f ${temp_file} + + hash_file=${temp_file} + + while read base64_hash; do + + echo -n ${base64_hash} | base64 -d >> ${temp_file} + + done < ${OUTD}/${hash_type}_multihash_bruteforce.txt + + fi + + mask=${mask_3[8]} + custom_charsets="" + + # modify "default" mask if needed (and set custom charset to reduce keyspace) + + if [ "${hash_type}" -eq 2500 ]; then + + mask="?d?d?d?d?d?1?2?3?4" + + charset_1="" + charset_2="" + charset_3="" + charset_4="" + + # check positions (here we assume that mask is always composed of non literal chars + # i.e. something like ?d?l?u?s?1 is possible, but ?d?dsuffix not + charset_1_pos=$(expr index "${mask}" 1) + charset_2_pos=$(expr index "${mask}" 2) + charset_3_pos=$(expr index "${mask}" 3) + charset_4_pos=$(expr index "${mask}" 4) + + # divide each charset position by 2 since each of them occupies 2 positions in the mask + + charset_1_pos=$((charset_1_pos / 2)) + charset_2_pos=$((charset_2_pos / 2)) + charset_3_pos=$((charset_3_pos / 2)) + charset_4_pos=$((charset_4_pos / 2)) + + i=1 + + while read -u 9 hash; do + + pass=$(sed -n ${i}p ${OUTD}/${hash_type}_passwords.txt) + + # charset 1 + char=$(echo "${pass}" | cut -b ${charset_1_pos}) + charset_1=$(echo -e "${charset_1}\n${char}") + + # charset 2 + char=$(echo "${pass}" | cut -b ${charset_2_pos}) + charset_2=$(echo -e "${charset_2}\n${char}") + + # charset 3 + char=$(echo "${pass}" | cut -b ${charset_3_pos}) + charset_3=$(echo -e "${charset_3}\n${char}") + + # charset 4 + char=$(echo "${pass}" | cut -b ${charset_4_pos}) + charset_4=$(echo -e "${charset_4}\n${char}") + + i=$((i + 1)) + + done 9< ${OUTD}/${hash_type}_multihash_bruteforce.txt + + # just make sure that all custom charset fields are initialized + + if [ -z "${charset_1}" ]; then + + charset_1="1" + + fi + + if [ -z "${charset_2}" ]; then + + charset_2="2" + + fi + + if [ -z "${charset_3}" ]; then + + charset_3="3" + + fi + + if [ -z "${charset_4}" ]; then + + charset_4="4" + + fi + + # unique and remove new lines + + charset_1=$(echo "${charset_1}" | sort -u | tr -d '\n') + charset_2=$(echo "${charset_2}" | sort -u | tr -d '\n') + charset_3=$(echo "${charset_3}" | sort -u | tr -d '\n') + charset_4=$(echo "${charset_4}" | sort -u | tr -d '\n') + + custom_charsets="-1 ${charset_1} -2 ${charset_2} -3 ${charset_3} -4 ${charset_4}" + fi + + CMD="./${BIN} ${OPTS} -a 3 -m ${hash_type} --increment --increment-min ${increment_min} --increment-max ${increment_max} ${custom_charsets} ${hash_file} ${mask} " + + echo "> Testing hash type $hash_type with attack mode 3, markov ${MARKOV}, multi hash." &>> ${OUTD}/logfull.txt + + output=$(./${BIN} ${OPTS} -a 3 -m ${hash_type} --increment --increment-min ${increment_min} --increment-max ${increment_max} ${custom_charsets} ${hash_file} ${mask} 2>&1) + + ret=${?} + + echo "${output}" >> ${OUTD}/logfull.txt + + if [ "${ret}" -eq 0 ]; then + + i=1 + + while read -u 9 hash; do + + pass=$(sed -n ${i}p ${OUTD}/${hash_type}_passwords.txt) + + if [ ${pass_only} -eq 1 ]; then + search=":${pass}" + else + search="${hash}:${pass}" + fi + + echo "${output}" | grep -F "${search}" &> /dev/null + + if [ "${?}" -ne 0 ]; then + + ret=10 + + break + + fi + + i=$((i + 1)) + + done 9< ${OUTD}/${hash_type}_multihash_bruteforce.txt + + fi + + status ${ret} + + msg="OK" + + if [ "${e_nf}" -ne 0 -o "${e_nm}" -ne 0 ]; then + + msg="Error" + + elif [ "${e_to}" -ne 0 ]; then + + msg="Warning" + + fi + + echo "[ ${OUTD} ] [ Type ${hash_type}, Attack 3, Mode multi ] > $msg : ${e_nf}/${cnt} not found, ${e_nm}/${cnt} not matched, ${e_to}/${cnt} timeout" + + fi +} + +function attack_6() +{ + file_only=0 + + if ! contains ${hash_type} ${FILE_BASED_ALGOS}; then + + file_only=1 + + fi + + # single hash + if [ ${MODE} -ne 1 ]; then + + e_to=0 + e_nf=0 + e_nm=0 + cnt=0 + + echo "> Testing hash type $hash_type with attack mode 6, markov ${MARKOV}, single hash." &>> ${OUTD}/logfull.txt + + i=1 + + max=8 + + if [ "${hash_type}" -eq 2500 ]; then + + max=6 + + fi + + while read -u 9 hash; do + + if [ "${i}" -gt 6 ]; then + + if ! contains ${hash_type} ${TIMEOUT_ALGOS}; then + + break; + + fi + + fi + + if [ $i -gt 1 ]; then + + if [ "${file_only}" -eq 1 ]; then + + temp_file="${OUTD}/${hash_type}_filebased_only_temp.txt" + echo ${hash} | base64 -d > ${temp_file} + hash="${temp_file}" + + fi + + CMD="./${BIN} ${OPTS} -a 6 -m ${hash_type} '${hash}' ${OUTD}/${hash_type}_dict1 ${mask_6[$i]}" + + echo -n "[ len $i ] " &>> ${OUTD}/logfull.txt + + output=$(./${BIN} ${OPTS} -a 6 -m ${hash_type} "${hash}" ${OUTD}/${hash_type}_dict1 ${mask_6[$i]} 2>&1) + + ret=${?} + + echo "${output}" >> ${OUTD}/logfull.txt + + if [ "${ret}" -eq 0 ]; then + + line_nr=$((i - 1)) + + line_dict1=$(sed -n ${line_nr}p ${OUTD}/${hash_type}_dict1) + line_dict2=$(sed -n ${line_nr}p ${OUTD}/${hash_type}_dict2) + + if [ ${pass_only} -eq 1 ]; then + search=":${line_dict1}${line_dict2}" + else + search="${hash}:${line_dict1}${line_dict2}" + fi + + echo "${output}" | grep -F "${search}" &> /dev/null + + if [ "${?}" -ne 0 ]; then + + ret=10 + + fi + + fi + + status ${ret} + + fi + + if [ "${i}" -eq ${max} ]; then break; fi + + ((i++)) + + done 9< ${OUTD}/${hash_type}_hashes.txt + + msg="OK" + + if [ "${e_nf}" -ne 0 -o "${e_nm}" -ne 0 ]; then + + msg="Error" + + elif [ "${e_to}" -ne 0 ]; then + + msg="Warning" + + fi + + echo "[ ${OUTD} ] [ Type ${hash_type}, Attack 6, Mode single ] > $msg : ${e_nf}/${cnt} not found, ${e_nm}/${cnt} not matched, ${e_to}/${cnt} timeout" + + fi + + # multihash + if [ ${MODE} -ne 0 ]; then + + e_to=0 + e_nf=0 + e_nm=0 + cnt=0 + + max=9 + + if [ ${hash_type} -eq 2500 ]; then + max=5 + elif [ ${hash_type} -eq 3000 ]; then + max=8 + elif [ ${hash_type} -eq 7700 ]; then + max=8 + elif [ ${hash_type} -eq 8500 ]; then + max=8 + fi + + if ! contains ${hash_type} ${TIMEOUT_ALGOS}; then + + max=5 + + if [ "${hash_type}" -eq 3200 ]; then + + max=3 + + fi + + fi + + for ((i = 2; i < ${max}; i++)); do + + hash_file=${OUTD}/${hash_type}_hashes_multi_${i}.txt + + # if file_only -> decode all base64 "hashes" and put them in the temporary file + + if [ "${file_only}" -eq 1 ]; then + + temp_file="${OUTD}/${hash_type}_filebased_only_temp.txt" + rm -f ${temp_file} + + hash_file=${temp_file} + + while read base64_hash; do + + echo -n ${base64_hash} | base64 -d >> ${temp_file} + + done < ${OUTD}/${hash_type}_hashes_multi_${i}.txt + + fi + + CMD="./${BIN} ${OPTS} -a 6 -m ${hash_type} ${hash_file} ${OUTD}/${hash_type}_dict1_multi_${i} ${mask_6[$i]}" + + echo "> Testing hash type $hash_type with attack mode 6, markov ${MARKOV}, multi hash with word len ${i}." &>> ${OUTD}/logfull.txt + + output=$(./${BIN} ${OPTS} -a 6 -m ${hash_type} ${hash_file} ${OUTD}/${hash_type}_dict1_multi_${i} ${mask_6[$i]} 2>&1) + + ret=${?} + + echo "${output}" >> ${OUTD}/logfull.txt + + if [ "${ret}" -eq 0 ]; then + + j=1 + + while read -u 9 hash; do + + line_dict1=$(sed -n ${j}p ${OUTD}/${hash_type}_dict1_multi_${i}) + line_dict2=$(sed -n ${j}p ${OUTD}/${hash_type}_dict2_multi_${i}) + + if [ ${pass_only} -eq 1 ]; then + search=":${line_dict1}${line_dict2}" + else + search="${hash}:${line_dict1}${line_dict2}" + fi + + echo "${output}" | grep -F "${search}" &> /dev/null + + if [ "${?}" -ne 0 ]; then + + ret=10 + + break + + fi + + j=$((j + 1)) + + done 9< ${OUTD}/${hash_type}_hashes_multi_${i}.txt + + fi + + status ${ret} + + done + + msg="OK" + + if [ "${e_nf}" -ne 0 -o "${e_nm}" -ne 0 ]; then + + msg="Error" + + elif [ "${e_to}" -ne 0 ]; then + + msg="Warning" + + fi + + echo "[ ${OUTD} ] [ Type ${hash_type}, Attack 6, Mode multi ] > $msg : ${e_nf}/${cnt} not found, ${e_nm}/${cnt} not matched, ${e_to}/${cnt} timeout" + + fi +} + +function attack_7() +{ + file_only=0 + + if ! contains ${hash_type} ${FILE_BASED_ALGOS}; then + + file_only=1 + + fi + + # single hash + if [ ${MODE} -ne 1 ]; then + + e_to=0 + e_nf=0 + e_nm=0 + cnt=0 + + echo "> Testing hash type $hash_type with attack mode 7, markov ${MARKOV}, single hash." &>> ${OUTD}/logfull.txt + + max=8 + + if [ "${hash_type}" -eq 2500 ]; then + + max=5 + + fi + + i=1 + + while read -u 9 hash; do + + if [ $i -gt 1 ]; then + + if [ "${file_only}" -eq 1 ]; then + + temp_file="${OUTD}/${hash_type}_filebased_only_temp.txt" + echo ${hash} | base64 -d > ${temp_file} + hash="${temp_file}" + + fi + + mask=${mask_7[$i]} + + # adjust mask if needed + + if [ "${hash_type}" -eq 2500 ]; then + + line_nr=$((i - 1)) + + pass_part_1=$(sed -n ${line_nr}p ${OUTD}/${hash_type}_dict1) + pass_part_2=$(sed -n ${line_nr}p ${OUTD}/${hash_type}_dict2) + + pass_part_2_len=${#pass_part_2} + + pass=${pass_part_1}${pass_part_2} + pass_len=${#pass} + + # add first x chars of password to mask and append the (old) mask + + mask_len=${#mask} + mask_len=$((mask_len / 2)) + + mask_prefix=$(echo ${pass} | cut -b -$((pass_len - ${mask_len} - ${pass_part_2_len}))) + mask=${mask_prefix}${mask} + + fi + + CMD="./${BIN} ${OPTS} -a 7 -m ${hash_type} '${hash}' ${mask} ${OUTD}/${hash_type}_dict2" + + echo -n "[ len $i ] " &>> ${OUTD}/logfull.txt + + output=$(./${BIN} ${OPTS} -a 7 -m ${hash_type} "${hash}" ${mask} ${OUTD}/${hash_type}_dict2 2>&1) + + ret=${?} + + echo "${output}" >> ${OUTD}/logfull.txt + + if [ "${ret}" -eq 0 ]; then + + line_nr=$((i - 1)) + + line_dict1=$(sed -n ${line_nr}p ${OUTD}/${hash_type}_dict1) + line_dict2=$(sed -n ${line_nr}p ${OUTD}/${hash_type}_dict2) + + if [ ${pass_only} -eq 1 ]; then + search=":${line_dict1}${line_dict2}" + else + search="${hash}:${line_dict1}${line_dict2}" + fi + + echo "${output}" | grep -F "${search}" &> /dev/null + + if [ "${?}" -ne 0 ]; then + + ret=10 + + fi + + fi + + status ${ret} + + fi + + if [ $i -eq ${max} ]; then break; fi + + ((i++)) + + done 9< ${OUTD}/${hash_type}_hashes.txt + + msg="OK" + + if [ "${e_nf}" -ne 0 -o "${e_nm}" -ne 0 ]; then + + msg="Error" + + elif [ "${e_to}" -ne 0 ]; then + + msg="Warning" + + fi + + echo "[ ${OUTD} ] [ Type ${hash_type}, Attack 7, Mode single ] > $msg : ${e_nf}/${cnt} not found, ${e_nm}/${cnt} not matched, ${e_to}/${cnt} timeout" + + fi + + # multihash + if [ ${MODE} -ne 0 ]; then + + e_to=0 + e_nf=0 + e_nm=0 + cnt=0 + + max=9 + + if [ ${hash_type} -eq 2500 ]; then + max=5 + elif [ ${hash_type} -eq 3000 ]; then + max=8 + elif [ ${hash_type} -eq 7700 ]; then + max=8 + elif [ ${hash_type} -eq 8500 ]; then + max=8 + fi + + if ! contains ${hash_type} ${TIMEOUT_ALGOS}; then + + max=7 + + if [ "${hash_type}" -eq 3200 ]; then + + max=4 + + fi + + fi + + for ((i = 2; i < ${max}; i++)); do + + hash_file=${OUTD}/${hash_type}_hashes_multi_${i}.txt + dict_file=${OUTD}/${hash_type}_dict2_multi_${i} + + mask=${mask_7[$i]} + + # if file_only -> decode all base64 "hashes" and put them in the temporary file + + if [ "${file_only}" -eq 1 ]; then + + temp_file="${OUTD}/${hash_type}_filebased_only_temp.txt" + rm -f ${temp_file} + + hash_file=${temp_file} + + while read base64_hash; do + + echo -n ${base64_hash} | base64 -d >> ${temp_file} + + done < ${OUTD}/${hash_type}_hashes_multi_${i}.txt + + # a little hack: since we don't want to have a very large mask (and wpa has minimum length of 8), + # we need to create a temporary dict file on-the-fly and use it like this: [small mask] [long(er) words in dict] + + dict_file=${OUTD}/${hash_type}_dict2_multi_${i}_longer + rm -f ${dict_file} + + mask_len=${#mask} + mask_len=$((mask_len / 2)) + + j=1 + + while read -u 9 hash; do + + pass_part_1=$(sed -n ${j}p ${OUTD}/${hash_type}_dict1_multi_${i}) + pass_part_2=$(sed -n ${j}p ${OUTD}/${hash_type}_dict2_multi_${i}) + + pass="${pass_part_1}${pass_part_2}" + + pass_suffix=$(echo "${pass}" | cut -b $((mask_len + 1))-) + + echo "${pass_suffix}" >> ${dict_file} + + j=$((j + 1)) + + done 9< ${OUTD}/${hash_type}_hashes_multi_${i}.txt + + fi + + CMD="./${BIN} ${OPTS} -a 7 -m ${hash_type} ${hash_file} ${mask} ${dict_file}" + + echo "> Testing hash type $hash_type with attack mode 7, markov ${MARKOV}, multi hash with word len ${i}." &>> ${OUTD}/logfull.txt + + output=$(./${BIN} ${OPTS} -a 7 -m ${hash_type} ${hash_file} ${mask} ${dict_file} 2>&1) + + ret=${?} + + echo "${output}" >> ${OUTD}/logfull.txt + + if [ "${ret}" -eq 0 ]; then + + j=1 + + while read -u 9 hash; do + + line_dict1=$(sed -n ${j}p ${OUTD}/${hash_type}_dict1_multi_${i}) + line_dict2=$(sed -n ${j}p ${OUTD}/${hash_type}_dict2_multi_${i}) + + if [ ${pass_only} -eq 1 ]; then + search=":${line_dict1}${line_dict2}" + else + search="${hash}:${line_dict1}${line_dict2}" + fi + + echo "${output}" | grep -F "${search}" &> /dev/null + + if [ "${?}" -ne 0 ]; then + + ret=10 + + break + + fi + + j=$((j + 1)) + + done 9< ${OUTD}/${hash_type}_hashes_multi_${i}.txt + + fi + + status ${ret} + + done + + msg="OK" + + if [ "${e_nf}" -ne 0 -o "${e_nm}" -ne 0 ]; then + + msg="Error" + + elif [ "${e_to}" -ne 0 ]; then + + msg="Warning" + + fi + + echo "[ ${OUTD} ] [ Type ${hash_type}, Attack 7, Mode multi ] > $msg : ${e_nf}/${cnt} not found, ${e_nm}/${cnt} not matched, ${e_to}/${cnt} timeout" + + fi +} + +function usage() +{ +cat << EOF +> Usage : ${0} + +OPTIONS: + + -t Select test mode : + 'single' => single hash (default) + 'multi' => multi hash + 'all' => single and multi hash + + -m Select hash type : + 'all' => all hash type supported + (int) => hash type integer code (default : 0) + + -a Select attack mode : + 'all' => all attack modes + (int) => attack mode integer code (default : 0) + + -b Select binary : + 'amd' => oclHashcat64.bin (default) + 'nvidia' => cudaHashcat64.bin + + -x Select cpu architecture : + '32' => 32 bit architecture + '64' => 64 bit architecture (default) + + -o Select operating system : + 'win' => windows operating system (use .exe file extension etc) + 'linux' => *nix based operating systems (.bin for binaries) + + -c Disables markov-chains + + -p Package the tests into a .7z file + + -d Use this folder as input/output folder for packaged tests + (string) => path to folder + + -h Show this help + +EOF + + exit 1 +} + +BN="amd" +BIN="oclHashcat64.bin" +MARKOV="enabled" +ATTACK=0 +MODE=0 +HT=0 +PACKAGE=0 + +while getopts "t:m:a:b:hcpd:x:o:" opt; do + + case ${opt} in + "t") + if [ ${OPTARG} == "single" ]; then + MODE=0 + elif [ ${OPTARG} == "multi" ]; then + MODE=1 + elif [ ${OPTARG} == "all" ]; then + MODE=2 + else + usage + fi + ;; + + "m") + if [ ${OPTARG} == "all" ]; then + HT=65535 + else + HT=${OPTARG} + fi + ;; + + "a") + if [ ${OPTARG} == "all" ]; then + ATTACK=65535 + elif [ ${OPTARG} == "0" ]; then + ATTACK=0 + elif [ ${OPTARG} == "1" ]; then + ATTACK=1 + elif [ ${OPTARG} == "3" ]; then + ATTACK=3 + elif [ ${OPTARG} == "6" ]; then + ATTACK=6 + elif [ ${OPTARG} == "7" ]; then + ATTACK=7 + else + usage + fi + ;; + + "b") + if [ ${OPTARG} == "amd" ]; then + BIN="oclHashcat64.bin" + BN="amd" + elif [ ${OPTARG} == "nvidia" ]; then + BIN="cudaHashcat64.bin" + BN="nvidia" + else + usage + fi + ;; + + "c") + OPTS="${OPTS} --markov-disable" + MARKOV="disabled" + ;; + + "d") + PACKAGE_FOLDER=$( echo ${OPTARG} | sed 's!/$!!g' ) + ;; + + "p") + PACKAGE=1 + ;; + + "x") + if [ ${OPTARG} == "32" ]; then + ARCHITECTURE=32 + elif [ ${OPTARG} == "64" ]; then + ARCHITECTURE=64 + else + usage + fi + ;; + + "o") + if [ ${OPTARG} == "win" ]; then + EXTENSION="exe" + elif [ ${OPTARG} == "linux" ]; then + EXTENSION="bin" + else + usage + fi + ;; + + \?) + usage + ;; + + "h") + usage + ;; + esac + +done + +if [ -n "${ARCHITECTURE}" ]; then + + BIN=$( echo ${BIN} | sed "s!64!${ARCHITECTURE}!" ) + +fi + +if [ -n "${EXTENSION}" ]; then + + BIN=$( echo ${BIN} | sed "s!\.bin!\.${EXTENSION}!" ) + +fi + +if [ -n "${PACKAGE_FOLDER}" ]; then + + if [ ! -e "${PACKAGE_FOLDER}" ]; then + echo "! folder '${PACKAGE_FOLDER}' does not exist" + exit 1 + fi + +fi + +if [ "${PACKAGE}" -eq 0 -o -z "${PACKAGE_FOLDER}" ]; then + + # check existence of binary + if [ ! -e "${BIN}" ]; then + echo "! ${BIN} not found, please build binary before run test." + exit 1 + fi + + # filter by hash_type + if [ ${HT} -ne 65535 ]; then + + # validate filter + check=0 + for hash_type in $(echo ${HASH_TYPES}); do + + if [ ${HT} -ne ${hash_type} ]; then continue; fi + + check=1 + + break + + done + + if [ ${check} -ne 1 ]; then + echo "! invalid hash type selected ..." + usage + fi + + fi + + if [ -z "${PACKAGE_FOLDER}" ]; then + + # make new dir + mkdir -p ${OUTD} + + # generate random test entry + if [ ${HT} -eq 65535 ]; then + perl tools/test.pl single > ${OUTD}/all.sh + else + perl tools/test.pl single ${HT} > ${OUTD}/all.sh + fi + + else + + OUTD=${PACKAGE_FOLDER} + + fi + + rm -rf ${OUTD}/logfull.txt && touch ${OUTD}/logfull.txt + + # populate array of hash types where we only should check if pass is in output (not both hash:pass) + IFS=';' read -ra PASS_ONLY <<< "${MATCH_PASS_ONLY}" + IFS=';' read -ra TIMEOUT_ALGOS <<< "${SLOW_ALGOS}" + + IFS=';' read -ra NEVER_CRACK_ALGOS <<< "${NEVER_CRACK}" + + # for these particular algos we need to save the output to a temporary file + IFS=';' read -ra FILE_BASED_ALGOS <<< "${HASHFILE_ONLY}" + + for hash_type in $(echo $HASH_TYPES); do + + if [[ ${HT} -ne 65535 ]] && [[ ${HT} -ne ${hash_type} ]]; then continue; fi + + if [ -z "${PACKAGE_FOLDER}" ]; then + + # init test data + init + + else + + echo "[ ${OUTD} ] > Run packaged test for hash type $hash_type." + + fi + + if [ "${PACKAGE}" -eq 0 ]; then + + # should we check only the pass? + contains ${hash_type} ${PASS_ONLY} + pass_only=$? + + contains ${hash_type} ${SLOW_ALGOS} + IS_SLOW=$? + + if [[ ${hash_type} -eq 400 ]]; then + + # we use phpass as slow hash for testing the AMP kernel + IS_SLOW=0 + fi + + if [[ ${IS_SLOW} -eq 1 ]]; then + + # run attack mode 0 (stdin) + if [[ ${ATTACK} -eq 65535 ]] || [[ ${ATTACK} -eq 0 ]]; then attack_0; fi + + else + # run attack mode 0 (stdin) + if [[ ${ATTACK} -eq 65535 ]] || [[ ${ATTACK} -eq 0 ]]; then attack_0; fi + + # run attack mode 1 (combinator) + if [[ ${ATTACK} -eq 65535 ]] || [[ ${ATTACK} -eq 1 ]]; then attack_1; fi + + # run attack mode 3 (bruteforce) + if [[ ${ATTACK} -eq 65535 ]] || [[ ${ATTACK} -eq 3 ]]; then attack_3; fi + + # run attack mode 6 (dict+mask) + if [[ ${ATTACK} -eq 65535 ]] || [[ ${ATTACK} -eq 6 ]]; then attack_6; fi + + # run attack mode 7 (mask+dict) + if [[ ${ATTACK} -eq 65535 ]] || [[ ${ATTACK} -eq 7 ]]; then attack_7; fi + fi + fi + + done + +else + + OUTD=${PACKAGE_FOLDER} + +fi + +# fix logfile +if [ "${PACKAGE}" -eq 0 ]; then + + cat -A ${OUTD}/logfull.txt | sed -e 's/\^M \^M//g' | sed -e 's/\$$//g' > ${OUTD}/test_report_${BN}.log + +fi + +rm -rf ${OUTD}/logfull.txt + +if [ "${PACKAGE}" -eq 1 ]; then + + echo "[ ${OUTD} ] > Generate package ${OUTD}/${OUTD}.7z" + + cp "${BASH_SOURCE[0]}" ${OUTD}/test.sh + + # if we package from a given folder, we need to check if e.g. the files needed for multi mode are there + + if [ -n "${PACKAGE_FOLDER}" ]; then + + MODE=2 + + ls "${PACKAGE_FOLDER}"/*multi* &> /dev/null + + if [ "${?}" -ne 0 ] + then + + MODE=0 + + fi + + HT=$(grep -o -- "-m *[0-9]*" ${PACKAGE_FOLDER}/all.sh | sort -u | sed 's/-m //' 2> /dev/null) + + if [ -n "${HT}" ]; then + + HT_COUNT=$(echo "${HT}" | wc -l) + + if [ "${HT_COUNT}" -gt 1 ]; then + + HT=65535 + + fi + + fi + + #ATTACK=65535 # more appropriate ? + fi + + # for convenience: 'run package' is default action for packaged test.sh ( + add other defaults too ) + + sed -i -e 's/^\(PACKAGE_FOLDER\)=""/\1="$( echo "${BASH_SOURCE[0]}" | sed \"s!test.sh\\$!!\" )"/' \ + -e "s/^\(HT\)=0/\1=${HT}/" \ + -e "s/^\(MODE\)=0/\1=${MODE}/" \ + -e "s/^\(ATTACK\)=0/\1=${ATTACK}/" \ + ${OUTD}/test.sh + + ${PACKAGE_CMD} ${OUTD}/${OUTD}.7z ${OUTD}/ &> /dev/null + +fi